From 5c0e47bfcbe52ab1bce3cdaa47b1afddfb2ba405 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Feb 2026 22:47:43 +0000 Subject: [PATCH 1/7] Update Apollo GraphQL packages --- examples/graphql/package.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/graphql/package.json b/examples/graphql/package.json index f89ad3f14ac..4e30aa25c12 100644 --- a/examples/graphql/package.json +++ b/examples/graphql/package.json @@ -23,12 +23,12 @@ "type": "module", "//": "NOTICE: For the Github CI we use the local RxDB build (rxdb-local.tgz). In your app should just install 'rxdb' from npm instead", "dependencies": { - "@apollo/server": "4.13.0", + "@apollo/server": "5.4.0", "concurrently": "9.2.1", "cors": "2.8.6", "express-graphql": "0.12.0", "graphql-client": "2.0.1", - "graphql-subscriptions": "2.0.0", + "graphql-subscriptions": "3.0.0", "graphql-ws": "5.16.2", "local-web-server": "5.4.0", "normalize.css": "8.0.1", diff --git a/package.json b/package.json index 151afb10b6b..f562bfb0f5e 100644 --- a/package.json +++ b/package.json @@ -640,7 +640,7 @@ "get-port": "5.1.1", "globals": "17.3.0", "graphql-http": "1.22.4", - "graphql-subscriptions": "2.0.0", + "graphql-subscriptions": "3.0.0", "gzip-size-cli": "5.1.0", "html-webpack-plugin": "5.6.6", "karma": "6.4.4", From feafa7b25a24b7fb724b5c51034442e0ed558c87 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 12 Feb 2026 14:22:38 +0000 Subject: [PATCH 2/7] Initial plan From 158f44e12d2b6d1b3d52bd7be3ebb9437ea3ba0b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 12 Feb 2026 14:36:53 +0000 Subject: [PATCH 3/7] Fix Apollo GraphQL packages compatibility with graphql-subscriptions v3 Co-authored-by: pubkey <8926560+pubkey@users.noreply.github.com> --- src/plugins/replication-graphql/index.ts | 27 ++++++++++++++++++++++-- test/helper/graphql-server.ts | 2 +- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/plugins/replication-graphql/index.ts b/src/plugins/replication-graphql/index.ts index 193c093df98..0ac6a617a60 100644 --- a/src/plugins/replication-graphql/index.ts +++ b/src/plugins/replication-graphql/index.ts @@ -212,8 +212,31 @@ export function replicateGraphQL( query, { next: async (streamResponse: any) => { - const firstField = Object.keys(streamResponse.data)[0]; - let data = streamResponse.data[firstField]; + // In graphql-ws, the streamResponse is the execution result payload + // which should have a 'data' field according to GraphQL spec + let responseData = streamResponse?.data; + + // If there's no data field, the response itself might be the data + if (!responseData) { + responseData = streamResponse; + } + + if (!responseData || typeof responseData !== 'object') { + return; + } + + const firstFieldKeys = Object.keys(responseData); + if (firstFieldKeys.length === 0) { + return; + } + + const firstField = firstFieldKeys[0]; + let data = responseData[firstField]; + + if (!data) { + return; + } + if (pull.responseModifier) { data = await pull.responseModifier( data, diff --git a/test/helper/graphql-server.ts b/test/helper/graphql-server.ts index 297bdc52f15..f9c850cb522 100644 --- a/test/helper/graphql-server.ts +++ b/test/helper/graphql-server.ts @@ -257,7 +257,7 @@ export async function spawn( writeHumansFail: (_args: any) => { throw new Error('writeHumansFail called'); }, - humanChanged: () => pubsub.asyncIterator('humanChanged') + humanChanged: () => pubsub.asyncIterableIterator('humanChanged') }; // header simulation middleware From 03659bfde9f76dcb35623d44c65292bed07caacb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 12 Feb 2026 14:38:58 +0000 Subject: [PATCH 4/7] Address code review feedback: improve null handling in subscription handler Co-authored-by: pubkey <8926560+pubkey@users.noreply.github.com> --- src/plugins/replication-graphql/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/replication-graphql/index.ts b/src/plugins/replication-graphql/index.ts index 0ac6a617a60..2099c808554 100644 --- a/src/plugins/replication-graphql/index.ts +++ b/src/plugins/replication-graphql/index.ts @@ -217,11 +217,11 @@ export function replicateGraphQL( let responseData = streamResponse?.data; // If there's no data field, the response itself might be the data - if (!responseData) { + if (responseData === undefined) { responseData = streamResponse; } - if (!responseData || typeof responseData !== 'object') { + if (!responseData || typeof responseData !== 'object' || responseData === null) { return; } From ddf663ffe685d74958f204f188613dcb2e68aeaa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 12 Feb 2026 14:41:27 +0000 Subject: [PATCH 5/7] Simplify null checking logic in subscription handler Co-authored-by: pubkey <8926560+pubkey@users.noreply.github.com> --- src/plugins/replication-graphql/index.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/plugins/replication-graphql/index.ts b/src/plugins/replication-graphql/index.ts index 2099c808554..c1e6a8f5dea 100644 --- a/src/plugins/replication-graphql/index.ts +++ b/src/plugins/replication-graphql/index.ts @@ -221,7 +221,8 @@ export function replicateGraphQL( responseData = streamResponse; } - if (!responseData || typeof responseData !== 'object' || responseData === null) { + // Validate response data exists and is an object (but not null) + if (responseData === null || typeof responseData !== 'object') { return; } @@ -233,10 +234,6 @@ export function replicateGraphQL( const firstField = firstFieldKeys[0]; let data = responseData[firstField]; - if (!data) { - return; - } - if (pull.responseModifier) { data = await pull.responseModifier( data, From c0c900fc9dfa0414d73c389c90b836ff3efe0f24 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 13 Feb 2026 10:48:51 +0000 Subject: [PATCH 6/7] Fix CI and update documentation for graphql-subscriptions v3 Co-authored-by: pubkey <8926560+pubkey@users.noreply.github.com> --- docs-src/docs/replication-graphql.md | 14 ++++++++++++++ examples/angular/package.json | 2 +- examples/graphql/server/index.js | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/docs-src/docs/replication-graphql.md b/docs-src/docs/replication-graphql.md index 4250e2690ae..109d783a1a6 100644 --- a/docs-src/docs/replication-graphql.md +++ b/docs-src/docs/replication-graphql.md @@ -348,6 +348,20 @@ const replicationState = replicateGraphQL( If it is not possible to create a websocket server on your backend, you can use any other method to pull out the ongoing events from the backend and then you can send them into `RxReplicationState.emitEvent()`. ::: +:::warning graphql-subscriptions v3 Breaking Change +If you are using `graphql-subscriptions` v3 or later, you must use `asyncIterableIterator()` instead of the deprecated `asyncIterator()` method when setting up your subscription resolvers: + +```js +// Before (v2) +streamHero: () => pubsub.asyncIterator('streamHero') + +// After (v3+) +streamHero: () => pubsub.asyncIterableIterator('streamHero') +``` + +This change was introduced in graphql-subscriptions v3 to use native `Symbol.asyncIterator` support. For more details, see the [graphql-subscriptions changelog](https://github.com/apollographql/graphql-subscriptions/blob/master/CHANGELOG.md#300). +::: + ### Transforming null to undefined in optional fields GraphQL fills up non-existent optional values with `null` while RxDB required them to be `undefined`. diff --git a/examples/angular/package.json b/examples/angular/package.json index 30c2e23bdf4..8f90f8759cc 100644 --- a/examples/angular/package.json +++ b/examples/angular/package.json @@ -26,7 +26,7 @@ "lint": "tslint app/src/**/*.ts", "analyze": "webpack-bundle-analyzer dist/angular/stats-es2015.json", "start:android": "npx cap open android", - "build:capacitor": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng build --configuration capacitor --aot && npx cap sync", + "build:capacitor": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng build --configuration capacitor --aot && npx cap sync android", "serve:ssr:angular": "node dist/angular/browser/server/server.mjs" }, "private": true, diff --git a/examples/graphql/server/index.js b/examples/graphql/server/index.js index 078d9650ab5..a24c031055d 100644 --- a/examples/graphql/server/index.js +++ b/examples/graphql/server/index.js @@ -203,7 +203,7 @@ export async function run() { validateBearerToken(bearerToken); - return pubsub.asyncIterator('streamHero'); + return pubsub.asyncIterableIterator('streamHero'); }, }; From 48ed0412f8843cf5f827c07e2039c01a5a799448 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 13 Feb 2026 10:52:03 +0000 Subject: [PATCH 7/7] Changes before error encountered Co-authored-by: pubkey <8926560+pubkey@users.noreply.github.com> --- docs/404.html | 39 - docs/CNAME | 1 - docs/adapters.html | 236 - docs/alternatives.html | 169 - docs/alternatives.md | 236 - docs/articles/angular-database.html | 175 - docs/articles/angular-database.md | 214 - docs/articles/angular-indexeddb.html | 269 - docs/articles/angular-indexeddb.md | 310 - docs/articles/browser-database.html | 116 - docs/articles/browser-database.md | 121 - docs/articles/browser-storage.html | 138 - docs/articles/browser-storage.md | 132 - docs/articles/data-base.html | 88 - docs/articles/data-base.md | 81 - docs/articles/embedded-database.html | 81 - docs/articles/embedded-database.md | 59 - ...irebase-realtime-database-alternative.html | 199 - .../firebase-realtime-database-alternative.md | 190 - docs/articles/firestore-alternative.html | 225 - docs/articles/firestore-alternative.md | 225 - docs/articles/flutter-database.html | 188 - docs/articles/flutter-database.md | 213 - docs/articles/frontend-database.html | 119 - docs/articles/frontend-database.md | 131 - docs/articles/ideas.md | 100 - docs/articles/ideas/index.html | 216 - docs/articles/in-memory-nosql-database.html | 72 - docs/articles/in-memory-nosql-database.md | 48 - .../articles/indexeddb-max-storage-limit.html | 123 - docs/articles/indexeddb-max-storage-limit.md | 153 - docs/articles/ionic-database.html | 131 - docs/articles/ionic-database.md | 136 - docs/articles/ionic-storage.html | 197 - docs/articles/ionic-storage.md | 195 - docs/articles/javascript-vector-database.html | 490 - docs/articles/javascript-vector-database.md | 592 - docs/articles/jquery-database.html | 194 - docs/articles/jquery-database.md | 211 - docs/articles/json-based-database.html | 153 - docs/articles/json-based-database.md | 157 - docs/articles/json-database.html | 140 - docs/articles/json-database.md | 109 - docs/articles/local-database.html | 116 - docs/articles/local-database.md | 121 - docs/articles/local-first-future.html | 265 - docs/articles/local-first-future.md | 553 - ...ge-indexeddb-cookies-opfs-sqlite-wasm.html | 241 - ...rage-indexeddb-cookies-opfs-sqlite-wasm.md | 341 - docs/articles/localstorage.html | 134 - docs/articles/localstorage.md | 153 - docs/articles/mobile-database.html | 81 - docs/articles/mobile-database.md | 49 - docs/articles/offline-database.html | 210 - docs/articles/offline-database.md | 208 - docs/articles/optimistic-ui.html | 203 - docs/articles/optimistic-ui.md | 178 - .../progressive-web-app-database.html | 109 - docs/articles/progressive-web-app-database.md | 92 - docs/articles/react-database.html | 149 - docs/articles/react-database.md | 152 - docs/articles/react-indexeddb.html | 225 - docs/articles/react-indexeddb.md | 247 - docs/articles/react-native-encryption.html | 211 - docs/articles/react-native-encryption.md | 192 - docs/articles/reactjs-storage.html | 254 - docs/articles/reactjs-storage.md | 266 - docs/articles/realtime-database.html | 82 - docs/articles/realtime-database.md | 75 - docs/articles/vue-database.html | 188 - docs/articles/vue-database.md | 192 - docs/articles/vue-indexeddb.html | 228 - docs/articles/vue-indexeddb.md | 242 - ...ckets-sse-polling-webrtc-webtransport.html | 205 - ...sockets-sse-polling-webrtc-webtransport.md | 252 - docs/articles/zero-latency-local-first.html | 214 - docs/articles/zero-latency-local-first.md | 228 - docs/assets/css/styles.b066e612.css | 1 - docs/assets/js/0027230a.2e976381.js | 1 - docs/assets/js/01684a0a.ac267d98.js | 1 - docs/assets/js/01a106d5.2ac15d82.js | 1 - docs/assets/js/03e37916.82c0454b.js | 1 - docs/assets/js/045bd6f5.d7543fa1.js | 1 - docs/assets/js/0596642b.eee766f7.js | 1 - docs/assets/js/08ff000c.3fc1a455.js | 1 - docs/assets/js/0b761dc7.ea7a941e.js | 1 - docs/assets/js/0e268d20.8eaca8eb.js | 1 - docs/assets/js/0e467ee2.9c93875e.js | 1 - docs/assets/js/0e945c41.0c53f212.js | 1 - docs/assets/js/0f6e10f0.51b093f2.js | 1 - docs/assets/js/118cde4c.d7e82ca5.js | 1 - docs/assets/js/11d75f9a.8210c243.js | 1 - docs/assets/js/13dc6548.fadf8c1b.js | 1 - docs/assets/js/14d72841.24eaace4.js | 1 - docs/assets/js/15f1e21f.306cc5e2.js | 1 - docs/assets/js/17896441.476362fb.js | 1 - docs/assets/js/187b985e.4ee7b6e5.js | 1 - docs/assets/js/1b0f8c91.21118c24.js | 1 - docs/assets/js/1b238727.c81ff6e0.js | 1 - docs/assets/js/1b5fa8ad.99194259.js | 1 - docs/assets/js/1c0701dd.8572a44b.js | 1 - docs/assets/js/1da545ff.ef424470.js | 1 - docs/assets/js/1db64337.7448d5c4.js | 1 - docs/assets/js/1e0353aa.bd262216.js | 1 - docs/assets/js/1f391b9e.825d8c20.js | 1 - docs/assets/js/21fa2740.44a7d1df.js | 1 - docs/assets/js/22dd74f7.8c39a7a2.js | 1 - docs/assets/js/2456d5e0.565789dc.js | 1 - docs/assets/js/25626d15.27c1b41f.js | 1 - docs/assets/js/2564bf4f.b4905e08.js | 1 - docs/assets/js/25a43fd4.f20d897d.js | 1 - docs/assets/js/26b8a621.0fdedfc5.js | 1 - docs/assets/js/280a2389.3dec6d46.js | 1 - docs/assets/js/294ac9d5.a530f746.js | 1 - docs/assets/js/2aec6989.93b045aa.js | 1 - docs/assets/js/2c41656d.5238f25d.js | 1 - docs/assets/js/2efd0200.eec55c75.js | 1 - docs/assets/js/2fe9ecb2.fc29e504.js | 1 - docs/assets/js/32667c41.fb0c28b5.js | 1 - docs/assets/js/326aca46.f7338c91.js | 1 - docs/assets/js/3417a9c7.4cd2a2af.js | 1 - docs/assets/js/34f94d1b.29ea6eee.js | 1 - docs/assets/js/35e4d287.95750a0a.js | 1 - docs/assets/js/36715375.d4b64326.js | 1 - docs/assets/js/37055470.55528f37.js | 1 - docs/assets/js/380cc66a.7da5e510.js | 1 - docs/assets/js/38a45a95.a7eb0903.js | 1 - docs/assets/js/38bbf12a.62b38600.js | 1 - docs/assets/js/393be207.9cd944e0.js | 1 - docs/assets/js/39600c95.6a7491bc.js | 1 - docs/assets/js/3ebfb37f.f5f42f4c.js | 1 - docs/assets/js/401008a8.cfd81712.js | 1 - docs/assets/js/40b6398a.86580fca.js | 1 - docs/assets/js/41f941a1.b03616ab.js | 1 - docs/assets/js/4250.a201ce1c.js | 2 - docs/assets/js/4250.a201ce1c.js.LICENSE.txt | 61 - docs/assets/js/4291.9c7472fc.js | 1 - docs/assets/js/432b83f9.d8e65e8a.js | 1 - docs/assets/js/4616b86a.247bc33b.js | 1 - docs/assets/js/4777fd9a.5d703faa.js | 1 - docs/assets/js/4adf80bb.5245b2b7.js | 1 - docs/assets/js/4af60d2e.8fe42f95.js | 1 - docs/assets/js/4ba7e5a3.fec476c6.js | 1 - docs/assets/js/4ed9495b.b85648e1.js | 1 - docs/assets/js/4f17bbdd.b46c3eaf.js | 1 - docs/assets/js/502d8946.3c4d7aab.js | 1 - docs/assets/js/51014a8a.c98a88e4.js | 1 - docs/assets/js/51038524.bb23a7bd.js | 1 - docs/assets/js/51334108.2284fc7c.js | 1 - docs/assets/js/5134b15f.c48f7dbd.js | 1 - docs/assets/js/55a5b596.49b70407.js | 1 - docs/assets/js/58215328.4a9061e5.js | 1 - docs/assets/js/5943.0ded4df5.js | 1 - docs/assets/js/597d88be.269bc776.js | 1 - docs/assets/js/5a273530.2bec61c8.js | 1 - docs/assets/js/5b5afcec.7e369a0e.js | 1 - docs/assets/js/5e95c892.e42e7000.js | 1 - docs/assets/js/61792630.6e389211.js | 1 - docs/assets/js/6187b59a.746cfe2d.js | 1 - docs/assets/js/6672.9c7472fc.js | 1 - docs/assets/js/68a466be.08b60ae4.js | 1 - docs/assets/js/6ae3580c.67a503bd.js | 1 - docs/assets/js/6bfb0089.d52978b6.js | 1 - docs/assets/js/6cbff7c2.db294439.js | 1 - docs/assets/js/6fa8aa1a.10d4f0d3.js | 1 - docs/assets/js/6fd28feb.45da1980.js | 1 - docs/assets/js/714575d7.f4b12fd2.js | 1 - docs/assets/js/7443.f0d813bb.js | 1 - docs/assets/js/77979bef.e414ae82.js | 1 - docs/assets/js/77d975e6.f460ed60.js | 1 - docs/assets/js/7815dd0c.d77e48f5.js | 1 - docs/assets/js/7bbb96fd.75e20d36.js | 1 - docs/assets/js/7f02c700.bd5b1cc8.js | 1 - docs/assets/js/8070e160.c192f1b9.js | 1 - docs/assets/js/8084fe3b.f4614fb9.js | 1 - docs/assets/js/820807a1.82638c55.js | 1 - docs/assets/js/8288c265.d455b0a0.js | 1 - docs/assets/js/8489a755.3170bb72.js | 1 - docs/assets/js/84a3af36.7a11f993.js | 1 - docs/assets/js/84ae55a4.1bdc94ff.js | 1 - docs/assets/js/85caacef.9966ef6e.js | 1 - docs/assets/js/86b4e356.9be07523.js | 1 - docs/assets/js/8a22f3a9.87a88033.js | 1 - docs/assets/js/8a442806.cda40cae.js | 1 - docs/assets/js/8aa53ed7.941200b7.js | 1 - docs/assets/js/8b0a0922.114db760.js | 1 - docs/assets/js/8b4bf532.36358d72.js | 1 - docs/assets/js/8bc07e20.d1b7c7db.js | 1 - docs/assets/js/8bc82b1f.9df61a79.js | 1 - docs/assets/js/8bfd920a.7d84a9e9.js | 1 - docs/assets/js/90102fdf.191788f5.js | 1 - docs/assets/js/9187.d599c63b.js | 1 - docs/assets/js/91b454ee.57807487.js | 1 - docs/assets/js/924d6dd6.ee7a4ff8.js | 1 - docs/assets/js/92698a99.49ff7265.js | 1 - docs/assets/js/9293.098c020a.js | 1 - docs/assets/js/931f4566.40f8ed4e.js | 1 - docs/assets/js/951d0efb.94a862cc.js | 1 - docs/assets/js/98405524.b9ffa436.js | 1 - docs/assets/js/9850.34d66cab.js | 1 - docs/assets/js/9dae6e71.d38c8ec6.js | 1 - docs/assets/js/9dd8ea89.9d935eb6.js | 1 - docs/assets/js/9e91b6f0.cfa4288f.js | 1 - docs/assets/js/a406dc27.d08b03b3.js | 1 - docs/assets/js/a442adcd.3011bc9b.js | 1 - docs/assets/js/a574e172.f6f58d32.js | 1 - docs/assets/js/a69eebfc.8659aa3b.js | 1 - docs/assets/js/a7456010.4971822d.js | 1 - docs/assets/js/a7bd4aaa.992c4a90.js | 1 - docs/assets/js/a7f10198.cfa2de30.js | 1 - docs/assets/js/a94703ab.13c96c74.js | 1 - docs/assets/js/aa14e6b1.c1e700b0.js | 1 - docs/assets/js/ab919a1f.41585657.js | 1 - docs/assets/js/aba21aa0.6f50d3cb.js | 1 - docs/assets/js/ac62b32d.0f37c11a.js | 1 - docs/assets/js/ad16b3ea.bade954e.js | 1 - docs/assets/js/ae2c2832.694f423a.js | 1 - docs/assets/js/b0889a22.eeabb12f.js | 1 - docs/assets/js/b2653a00.0fc762c0.js | 1 - docs/assets/js/b30f4f1f.0b7faa87.js | 1 - docs/assets/js/b672caf7.019a15fb.js | 1 - docs/assets/js/b8c49ce4.3962d1bb.js | 1 - docs/assets/js/badcd764.922f3eee.js | 1 - docs/assets/js/bdd39edd.10cefecb.js | 1 - docs/assets/js/c0f75fb9.ea90dae3.js | 1 - docs/assets/js/c3bc9c50.8e3aa667.js | 1 - docs/assets/js/c44853e1.bcb8c55f.js | 1 - docs/assets/js/c4de80f8.c103cf90.js | 1 - docs/assets/js/c6349bb6.5798b933.js | 1 - docs/assets/js/c6fdd490.58a5fe1a.js | 1 - docs/assets/js/c7b47308.b6848169.js | 1 - docs/assets/js/c843a053.b5bc0bab.js | 1 - docs/assets/js/c9c8e0b6.2dbabe8c.js | 1 - docs/assets/js/cbbe8f0a.ab22b4f7.js | 1 - docs/assets/js/cde77f4f.373290c4.js | 1 - docs/assets/js/d04a108d.210d2f40.js | 1 - docs/assets/js/d20e74b4.4c817e3a.js | 1 - docs/assets/js/d2758528.b809fc57.js | 1 - docs/assets/js/d4da9db3.185d0923.js | 1 - docs/assets/js/d622bd51.d14041c3.js | 1 - docs/assets/js/db34d6b0.9ff45764.js | 1 - docs/assets/js/dbde2ffe.733abe4c.js | 1 - docs/assets/js/dc42ba65.afadf186.js | 1 - docs/assets/js/de9a3c97.63e95596.js | 1 - docs/assets/js/e24529eb.bcf6ccf6.js | 1 - docs/assets/js/e6b4453d.65be7d01.js | 1 - docs/assets/js/e8a836f3.8a792a52.js | 1 - docs/assets/js/eadd9b3c.6302952f.js | 1 - docs/assets/js/eb2e4b0c.11dfbd63.js | 1 - docs/assets/js/ebace26e.1d9003e1.js | 1 - docs/assets/js/ec526260.b97d027a.js | 1 - docs/assets/js/ed2d6610.83202793.js | 1 - docs/assets/js/ee1b9f21.35539cef.js | 1 - docs/assets/js/f14ec96f.0b4554ce.js | 1 - docs/assets/js/f15938da.18649363.js | 1 - docs/assets/js/f1c185f0.eaabf3d6.js | 1 - docs/assets/js/f43e80a8.446f3666.js | 1 - docs/assets/js/f44bb875.0c73cd1a.js | 1 - docs/assets/js/f490b64c.9c10cfb5.js | 1 - docs/assets/js/f61fdf57.63b3f973.js | 1 - docs/assets/js/fe2a63b2.6ba7190d.js | 1 - docs/assets/js/fe7a07ee.192b6a61.js | 1 - docs/assets/js/feac4174.b67e5d15.js | 1 - docs/assets/js/ff492cda.d7a9ad86.js | 1 - docs/assets/js/main.c9c8ff04.js | 2 - docs/assets/js/main.c9c8ff04.js.LICENSE.txt | 98 - docs/assets/js/runtime~main.f8cb08bf.js | 1 - docs/backup.html | 104 - docs/backup.md | 90 - docs/capacitor-database.html | 161 - docs/capacitor-database.md | 243 - docs/chat/index.html | 39 - docs/cleanup.html | 125 - docs/cleanup.md | 118 - docs/code/index.html | 39 - docs/consulting/index.html | 49 - docs/contribute.md | 49 - docs/contribution.html | 70 - docs/crdt.html | 300 - docs/crdt.md | 334 - docs/data-migration.html | 40 - docs/data-migration.md | 7 - docs/demo-submitted/index.html | 39 - docs/dev-mode.html | 108 - docs/dev-mode.md | 116 - docs/downsides-of-offline-first.html | 133 - docs/downsides-of-offline-first.md | 136 - docs/electron-database.html | 138 - docs/electron-database.md | 139 - docs/electron.html | 70 - docs/electron.md | 48 - docs/encryption.html | 149 - docs/encryption.md | 172 - docs/errors.html | 49 - docs/errors.md | 14 - docs/files/alternatives/aws-amplify.svg | 13 - docs/files/alternatives/firebase.svg | 55 - docs/files/alternatives/meteor.svg | 1 - docs/files/alternatives/meteor_text.svg | 1 - docs/files/alternatives/pouchdb.svg | 16 - docs/files/alternatives/rethinkdb.svg | 1 - docs/files/alternatives/supabase.svg | 23 - docs/files/alternatives/watermelondb.png | Bin 45436 -> 0 bytes docs/files/animations/realtime.gif | Bin 894875 -> 0 bytes docs/files/animations/realtime.mp4 | Bin 137286 -> 0 bytes .../heartbeat/67161381-heart-beat-license.txt | 35 - docs/files/audio/heartbeat/heartbeat.mp3 | Bin 37723 -> 0 bytes docs/files/audio/heartbeat/heartbeat.wav | Bin 150224 -> 0 bytes docs/files/cap-theorem.png | Bin 20512 -> 0 bytes docs/files/chat-app.png | Bin 150757 -> 0 bytes docs/files/companies/atroo.png | Bin 1826 -> 0 bytes docs/files/companies/moreapp.png | Bin 1033 -> 0 bytes docs/files/companies/myagro.svg | 1 - docs/files/companies/nutrien.svg | 1 - docs/files/companies/readwise.svg | 1 - docs/files/companies/safeex.svg | 1 - docs/files/companies/webware.svg | 1 - docs/files/companies/woopos.svg | 1 - ...rdt-conflict-free-replicated-data-type.svg | 132 - docs/files/database-replication.png | Bin 10362 -> 0 bytes docs/files/discord.svg | 1 - docs/files/document-replication-conflict.svg | 62 - docs/files/gitter.svg | 1 - docs/files/icons/angular.svg | 1 - docs/files/icons/appwrite-small.svg | 1 - docs/files/icons/appwrite.svg | 1 - docs/files/icons/arrows/double-arrow.svg | 14 - docs/files/icons/arrows/left-arrow.svg | 12 - docs/files/icons/arrows/right-arrow.svg | 12 - docs/files/icons/browser.svg | 1 - docs/files/icons/capacitor.svg | 1 - docs/files/icons/commit.svg | 1 - docs/files/icons/cordova.svg | 1 - docs/files/icons/couchdb-text.svg | 1 - docs/files/icons/couchdb.svg | 1 - docs/files/icons/deno.svg | 1 - docs/files/icons/desktop.svg | 1 - docs/files/icons/discord.svg | 1 - docs/files/icons/download.svg | 1 - docs/files/icons/electron.svg | 1 - docs/files/icons/expo.svg | 1 - docs/files/icons/expo_text.svg | 1 - docs/files/icons/expo_white.svg | 1 - docs/files/icons/firebase.svg | 1 - docs/files/icons/flutter.svg | 1 - docs/files/icons/gear.svg | 1 - docs/files/icons/github-star-with-logo.svg | 1 - docs/files/icons/github-star.svg | 1 - docs/files/icons/graphql-text.svg | 17 - docs/files/icons/graphql.svg | 1 - docs/files/icons/http.svg | 1 - docs/files/icons/ionic.svg | 1 - docs/files/icons/jquery.svg | 1 - docs/files/icons/mobile.svg | 1 - docs/files/icons/mongodb-icon.svg | 1 - docs/files/icons/mongodb.svg | 1 - docs/files/icons/nativescript.svg | 1 - docs/files/icons/nats.svg | 1 - docs/files/icons/nextjs.svg | 1 - docs/files/icons/nodejs.svg | 1 - docs/files/icons/person.svg | 1 - docs/files/icons/pouchdb.svg | 1 - docs/files/icons/react.svg | 1 - docs/files/icons/rxjs.svg | 1 - docs/files/icons/server.svg | 1 - docs/files/icons/sqlite.svg | 1 - docs/files/icons/supabase.svg | 1 - docs/files/icons/svelte.svg | 1 - docs/files/icons/transformers.js.svg | 1 - docs/files/icons/twitter-blue.svg | 1 - docs/files/icons/twitter.svg | 1 - docs/files/icons/typescript.svg | 1 - docs/files/icons/vuejs.svg | 1 - docs/files/icons/webrtc.svg | 1 - docs/files/icons/wifi/wifi.svg | 33 - docs/files/icons/wifi/wifi_171923.svg | 31 - docs/files/icons/wifi/wifi_1a202c.svg | 31 - docs/files/icons/wifi/wifi_e6008d.svg | 31 - docs/files/icons/with-gradient/checklist.svg | 28 - docs/files/icons/with-gradient/contribute.svg | 19 - .../files/icons/with-gradient/multiplayer.svg | 71 - docs/files/icons/with-gradient/people.svg | 37 - .../files/icons/with-gradient/replication.svg | 19 - docs/files/icons/with-gradient/rocket.svg | 28 - .../icons/with-gradient/storage-layer.svg | 17 - .../icons/with-gradient/text/made-easy.svg | 18 - docs/files/imprint-email.png | Bin 1864 -> 0 bytes docs/files/indexeddb-batched-cursor.png | Bin 52500 -> 0 bytes docs/files/indexeddb-custom-index.png | Bin 23808 -> 0 bytes docs/files/indexeddb-sharding-performance.png | Bin 41798 -> 0 bytes .../indexeddb-transaction-throughput.png | Bin 20489 -> 0 bytes docs/files/latency-london-san-franzisco.png | Bin 16815 -> 0 bytes docs/files/leader-election.gif | Bin 167740 -> 0 bytes docs/files/leader-election.mp4 | Bin 411228 -> 0 bytes docs/files/loading-spinner-not-needed.gif | Bin 223251 -> 0 bytes docs/files/logger.png | Bin 50062 -> 0 bytes docs/files/logo/icon.ico | Bin 7166 -> 0 bytes docs/files/logo/icon.png | Bin 527 -> 0 bytes docs/files/logo/logo.svg | 1 - docs/files/logo/logo_text.png | Bin 1674 -> 0 bytes docs/files/logo/logo_text.svg | 1 - docs/files/logo/logo_text_white.svg | 1 - docs/files/logo/rxdb_javascript_database.svg | 1 - docs/files/logo/rxdb_mini.svg | 1 - docs/files/longwhite.jpg | Bin 891 -> 0 bytes docs/files/multiwindow.gif | Bin 215566 -> 0 bytes docs/files/multiwindow.mp4 | Bin 235454 -> 0 bytes docs/files/no-map-tag.png | Bin 3216 -> 0 bytes docs/files/no-relational-data.png | Bin 20818 -> 0 bytes docs/files/no-sql.png | Bin 4676 -> 0 bytes docs/files/offline-ready.png | Bin 171273 -> 0 bytes docs/files/reactive.gif | Bin 61756 -> 0 bytes docs/files/reactive.mp4 | Bin 73287 -> 0 bytes docs/files/rx-storage-performance-browser.png | Bin 70997 -> 0 bytes docs/files/rx-storage-performance-node.png | Bin 50579 -> 0 bytes docs/files/safari-database.png | Bin 18388 -> 0 bytes docs/files/server-scaling-tree.png | Bin 18336 -> 0 bytes docs/files/smartphone/desktop.svg | 8 - docs/files/smartphone/desktop_white.svg | 8 - docs/files/smartphone/index.html | 30 - docs/files/smartphone/phone.png | Bin 241699 -> 0 bytes docs/files/smartphone/server.svg | 18 - docs/files/smartphone/server_white.svg | 18 - docs/files/smartphone/tablet.svg | 50 - docs/files/smartphone/tablet_white.svg | 20 - docs/files/sync.gif | Bin 1354425 -> 0 bytes docs/files/sync.mp4 | Bin 1704823 -> 0 bytes docs/files/synced.gif | Bin 114327 -> 0 bytes docs/files/synced.mp4 | Bin 297031 -> 0 bytes docs/files/twitter_follow.png | Bin 3237 -> 0 bytes docs/files/typescript-query-validation.png | Bin 58331 -> 0 bytes docs/files/typescript.png | Bin 10784 -> 0 bytes docs/files/used-by-many.png | Bin 523542 -> 0 bytes docs/files/vector-database-result.png | Bin 102115 -> 0 bytes ...socket-webrtc-webtransport-performance.png | Bin 97156 -> 0 bytes docs/files/why-no-transactions.jpg | Bin 30135 -> 0 bytes ...erlegibleMono-Italic-VariableFont_wght.ttf | Bin 55696 -> 0 bytes ...nsonHyperlegibleMono-VariableFont_wght.ttf | Bin 53432 -> 0 bytes docs/fulltext-search.html | 114 - docs/fulltext-search.md | 96 - docs/html/dev-mode-iframe.html | 38 - docs/img/apple-touch-icon.png | Bin 2159 -> 0 bytes docs/img/benefits-column-mobile.svg | 10 - docs/img/benefits-column.svg | 10 - docs/img/community-links/discord-logo.svg | 1 - docs/img/community-links/github-logo.svg | 1 - docs/img/community-links/linkedin-logo.svg | 1 - .../community-links/stack-overflow-logo.svg | 3 - docs/img/community-links/x-logo.svg | 3 - docs/img/docusaurus.png | Bin 5142 -> 0 bytes docs/img/favicon.png | Bin 525 -> 0 bytes docs/img/footer-column.svg | 10 - docs/img/hero-group-mobile.svg | 6 - docs/img/hero-group.svg | 4 - docs/img/hero.svg | 72 - docs/img/next-column.svg | 4 - docs/img/rxdb_social_card.png | Bin 59084 -> 0 bytes docs/img/steps-column.svg | 6 - docs/img/thumbs-up-white.svg | 22 - docs/img/thumbs-up.svg | 22 - docs/index.html | 287 - docs/install.html | 73 - docs/install.md | 71 - docs/key-compression.html | 73 - docs/key-compression.md | 66 - docs/leader-election.html | 102 - docs/leader-election.md | 96 - docs/legal-notice/index.html | 39 - docs/license/index.html | 39 - docs/llms-full.txt | 22772 ---------------- docs/llms.txt | 139 - docs/logger.html | 106 - docs/logger.md | 89 - docs/lunr-index-1769435561373.json | 1 - docs/lunr-index.json | 1 - docs/markdown-page/index.html | 40 - docs/meeting-paid-starter/index.html | 39 - docs/meeting-paid/index.html | 39 - docs/meeting/index.html | 39 - docs/middleware.html | 232 - docs/middleware.md | 232 - docs/migration-schema.html | 201 - docs/migration-schema.md | 213 - docs/migration-storage.html | 130 - docs/migration-storage.md | 127 - docs/newsletter/index.html | 39 - docs/nodejs-database.html | 141 - docs/nodejs-database.md | 140 - docs/nosql-performance-tips.html | 176 - docs/nosql-performance-tips.md | 181 - docs/offline-first.html | 97 - docs/offline-first.md | 97 - docs/orm.html | 123 - docs/orm.md | 116 - docs/overview.html | 40 - docs/overview.md | 9 - docs/plugins.html | 121 - docs/plugins.md | 106 - docs/population.html | 167 - docs/population.md | 161 - docs/premium-submitted/index.html | 39 - docs/premium/index.html | 39 - docs/query-cache.html | 62 - docs/query-cache.md | 40 - docs/query-optimizer.html | 103 - docs/query-optimizer.md | 72 - docs/quickstart.html | 149 - docs/quickstart.md | 370 - docs/react-native-database.html | 199 - docs/react-native-database.md | 292 - docs/react.html | 159 - docs/react.md | 203 - docs/reactivity.html | 102 - docs/reactivity.md | 227 - docs/releases/10.0.0.html | 202 - docs/releases/10.0.0.md | 210 - docs/releases/11.0.0.html | 108 - docs/releases/11.0.0.md | 100 - docs/releases/12.0.0.html | 200 - docs/releases/12.0.0.md | 204 - docs/releases/13.0.0.html | 160 - docs/releases/13.0.0.md | 94 - docs/releases/14.0.0.html | 163 - docs/releases/14.0.0.md | 171 - docs/releases/15.0.0.html | 160 - docs/releases/15.0.0.md | 183 - docs/releases/16.0.0.html | 127 - docs/releases/16.0.0.md | 101 - docs/releases/17.0.0.html | 137 - docs/releases/17.0.0.md | 168 - docs/releases/8.0.0.html | 84 - docs/releases/8.0.0.md | 84 - docs/releases/9.0.0.html | 164 - docs/releases/9.0.0.md | 213 - docs/replication-appwrite.html | 246 - docs/replication-appwrite.md | 247 - docs/replication-couchdb.html | 219 - docs/replication-couchdb.md | 223 - docs/replication-firestore.html | 143 - docs/replication-firestore.md | 154 - docs/replication-graphql.html | 445 - docs/replication-graphql.md | 499 - docs/replication-http.html | 237 - docs/replication-http.md | 314 - docs/replication-mongodb.html | 272 - docs/replication-mongodb.md | 241 - docs/replication-nats.html | 77 - docs/replication-nats.md | 72 - docs/replication-p2p.html | 41 - docs/replication-p2p.md | 9 - docs/replication-server.html | 85 - docs/replication-server.md | 78 - docs/replication-supabase.html | 264 - docs/replication-supabase.md | 227 - docs/replication-webrtc.html | 212 - docs/replication-webrtc.md | 284 - docs/replication-websocket.html | 81 - docs/replication-websocket.md | 62 - docs/replication.html | 559 - docs/replication.md | 679 - docs/rx-attachment.html | 175 - docs/rx-attachment.md | 222 - docs/rx-collection.html | 251 - docs/rx-collection.md | 333 - docs/rx-database.html | 207 - docs/rx-database.md | 248 - docs/rx-document.html | 233 - docs/rx-document.md | 283 - docs/rx-local-document.html | 140 - docs/rx-local-document.md | 157 - docs/rx-pipeline.html | 191 - docs/rx-pipeline.md | 213 - docs/rx-query.html | 390 - docs/rx-query.md | 472 - docs/rx-schema.html | 384 - docs/rx-schema.md | 434 - docs/rx-server-scaling.html | 82 - docs/rx-server-scaling.md | 70 - docs/rx-server.html | 247 - docs/rx-server.md | 332 - docs/rx-state.html | 155 - docs/rx-state.md | 166 - docs/rx-storage-denokv.html | 120 - docs/rx-storage-denokv.md | 98 - docs/rx-storage-dexie.html | 158 - docs/rx-storage-dexie.md | 216 - docs/rx-storage-filesystem-node.html | 72 - docs/rx-storage-filesystem-node.md | 44 - docs/rx-storage-foundationdb.html | 93 - docs/rx-storage-foundationdb.md | 68 - docs/rx-storage-indexeddb.html | 107 - docs/rx-storage-indexeddb.md | 94 - ...x-storage-localstorage-meta-optimizer.html | 71 - .../rx-storage-localstorage-meta-optimizer.md | 46 - docs/rx-storage-localstorage.html | 100 - docs/rx-storage-localstorage.md | 107 - docs/rx-storage-lokijs.html | 134 - docs/rx-storage-memory-mapped.html | 120 - docs/rx-storage-memory-mapped.md | 108 - docs/rx-storage-memory-synced.html | 174 - docs/rx-storage-memory-synced.md | 158 - docs/rx-storage-memory.html | 61 - docs/rx-storage-memory.md | 40 - docs/rx-storage-mongodb.html | 66 - docs/rx-storage-mongodb.md | 54 - docs/rx-storage-opfs.html | 169 - docs/rx-storage-opfs.md | 181 - docs/rx-storage-performance.html | 64 - docs/rx-storage-performance.md | 42 - docs/rx-storage-pouchdb.html | 118 - docs/rx-storage-pouchdb.md | 106 - docs/rx-storage-remote.html | 115 - docs/rx-storage-remote.md | 107 - docs/rx-storage-sharding.html | 102 - docs/rx-storage-sharding.md | 75 - docs/rx-storage-shared-worker.html | 160 - docs/rx-storage-shared-worker.md | 163 - docs/rx-storage-sqlite.html | 318 - docs/rx-storage-sqlite.md | 373 - docs/rx-storage-worker.html | 192 - docs/rx-storage-worker.md | 199 - docs/rx-storage.html | 134 - docs/rx-storage.md | 154 - docs/rxdb-tradeoffs.html | 99 - docs/rxdb-tradeoffs.md | 94 - docs/schema-validation.html | 115 - docs/schema-validation.md | 133 - docs/search-doc-1769435561373.json | 1 - docs/search-doc.json | 1 - docs/sem/angular-database/index.html | 287 - docs/sem/browser-database/index.html | 287 - docs/sem/capacitor-database/index.html | 287 - docs/sem/electron-database/index.html | 287 - docs/sem/expo-database/index.html | 287 - docs/sem/firestore-alternative/index.html | 287 - docs/sem/gads/index.html | 287 - docs/sem/indexeddb-database-2/index.html | 287 - docs/sem/indexeddb-database/index.html | 287 - docs/sem/ionic-database/index.html | 287 - docs/sem/localstorage-database/index.html | 287 - docs/sem/nedb-alternative/index.html | 287 - docs/sem/nodejs-database/index.html | 287 - docs/sem/nosql-database/index.html | 287 - docs/sem/pouchdb-alternative/index.html | 287 - docs/sem/react-database/index.html | 287 - docs/sem/react-native-database/index.html | 287 - docs/sem/reddit/index.html | 287 - docs/sem/svelte-database/index.html | 287 - docs/sem/vue-database/index.html | 287 - docs/sem/watermelondb-alternative/index.html | 287 - docs/service-submitted/index.html | 39 - docs/sitemap.xml | 1 - docs/slow-indexeddb.html | 223 - docs/slow-indexeddb.md | 263 - docs/survey/index.html | 39 - docs/third-party-plugins.html | 47 - docs/third-party-plugins.md | 12 - docs/transactions-conflicts-revisions.html | 116 - docs/transactions-conflicts-revisions.md | 109 - docs/tutorials/typescript.html | 206 - docs/tutorials/typescript.md | 250 - docs/why-nosql.html | 181 - docs/why-nosql.md | 208 - 663 files changed, 75497 deletions(-) delete mode 100644 docs/404.html delete mode 100644 docs/CNAME delete mode 100644 docs/adapters.html delete mode 100644 docs/alternatives.html delete mode 100644 docs/alternatives.md delete mode 100644 docs/articles/angular-database.html delete mode 100644 docs/articles/angular-database.md delete mode 100644 docs/articles/angular-indexeddb.html delete mode 100644 docs/articles/angular-indexeddb.md delete mode 100644 docs/articles/browser-database.html delete mode 100644 docs/articles/browser-database.md delete mode 100644 docs/articles/browser-storage.html delete mode 100644 docs/articles/browser-storage.md delete mode 100644 docs/articles/data-base.html delete mode 100644 docs/articles/data-base.md delete mode 100644 docs/articles/embedded-database.html delete mode 100644 docs/articles/embedded-database.md delete mode 100644 docs/articles/firebase-realtime-database-alternative.html delete mode 100644 docs/articles/firebase-realtime-database-alternative.md delete mode 100644 docs/articles/firestore-alternative.html delete mode 100644 docs/articles/firestore-alternative.md delete mode 100644 docs/articles/flutter-database.html delete mode 100644 docs/articles/flutter-database.md delete mode 100644 docs/articles/frontend-database.html delete mode 100644 docs/articles/frontend-database.md delete mode 100644 docs/articles/ideas.md delete mode 100644 docs/articles/ideas/index.html delete mode 100644 docs/articles/in-memory-nosql-database.html delete mode 100644 docs/articles/in-memory-nosql-database.md delete mode 100644 docs/articles/indexeddb-max-storage-limit.html delete mode 100644 docs/articles/indexeddb-max-storage-limit.md delete mode 100644 docs/articles/ionic-database.html delete mode 100644 docs/articles/ionic-database.md delete mode 100644 docs/articles/ionic-storage.html delete mode 100644 docs/articles/ionic-storage.md delete mode 100644 docs/articles/javascript-vector-database.html delete mode 100644 docs/articles/javascript-vector-database.md delete mode 100644 docs/articles/jquery-database.html delete mode 100644 docs/articles/jquery-database.md delete mode 100644 docs/articles/json-based-database.html delete mode 100644 docs/articles/json-based-database.md delete mode 100644 docs/articles/json-database.html delete mode 100644 docs/articles/json-database.md delete mode 100644 docs/articles/local-database.html delete mode 100644 docs/articles/local-database.md delete mode 100644 docs/articles/local-first-future.html delete mode 100644 docs/articles/local-first-future.md delete mode 100644 docs/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html delete mode 100644 docs/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.md delete mode 100644 docs/articles/localstorage.html delete mode 100644 docs/articles/localstorage.md delete mode 100644 docs/articles/mobile-database.html delete mode 100644 docs/articles/mobile-database.md delete mode 100644 docs/articles/offline-database.html delete mode 100644 docs/articles/offline-database.md delete mode 100644 docs/articles/optimistic-ui.html delete mode 100644 docs/articles/optimistic-ui.md delete mode 100644 docs/articles/progressive-web-app-database.html delete mode 100644 docs/articles/progressive-web-app-database.md delete mode 100644 docs/articles/react-database.html delete mode 100644 docs/articles/react-database.md delete mode 100644 docs/articles/react-indexeddb.html delete mode 100644 docs/articles/react-indexeddb.md delete mode 100644 docs/articles/react-native-encryption.html delete mode 100644 docs/articles/react-native-encryption.md delete mode 100644 docs/articles/reactjs-storage.html delete mode 100644 docs/articles/reactjs-storage.md delete mode 100644 docs/articles/realtime-database.html delete mode 100644 docs/articles/realtime-database.md delete mode 100644 docs/articles/vue-database.html delete mode 100644 docs/articles/vue-database.md delete mode 100644 docs/articles/vue-indexeddb.html delete mode 100644 docs/articles/vue-indexeddb.md delete mode 100644 docs/articles/websockets-sse-polling-webrtc-webtransport.html delete mode 100644 docs/articles/websockets-sse-polling-webrtc-webtransport.md delete mode 100644 docs/articles/zero-latency-local-first.html delete mode 100644 docs/articles/zero-latency-local-first.md delete mode 100644 docs/assets/css/styles.b066e612.css delete mode 100644 docs/assets/js/0027230a.2e976381.js delete mode 100644 docs/assets/js/01684a0a.ac267d98.js delete mode 100644 docs/assets/js/01a106d5.2ac15d82.js delete mode 100644 docs/assets/js/03e37916.82c0454b.js delete mode 100644 docs/assets/js/045bd6f5.d7543fa1.js delete mode 100644 docs/assets/js/0596642b.eee766f7.js delete mode 100644 docs/assets/js/08ff000c.3fc1a455.js delete mode 100644 docs/assets/js/0b761dc7.ea7a941e.js delete mode 100644 docs/assets/js/0e268d20.8eaca8eb.js delete mode 100644 docs/assets/js/0e467ee2.9c93875e.js delete mode 100644 docs/assets/js/0e945c41.0c53f212.js delete mode 100644 docs/assets/js/0f6e10f0.51b093f2.js delete mode 100644 docs/assets/js/118cde4c.d7e82ca5.js delete mode 100644 docs/assets/js/11d75f9a.8210c243.js delete mode 100644 docs/assets/js/13dc6548.fadf8c1b.js delete mode 100644 docs/assets/js/14d72841.24eaace4.js delete mode 100644 docs/assets/js/15f1e21f.306cc5e2.js delete mode 100644 docs/assets/js/17896441.476362fb.js delete mode 100644 docs/assets/js/187b985e.4ee7b6e5.js delete mode 100644 docs/assets/js/1b0f8c91.21118c24.js delete mode 100644 docs/assets/js/1b238727.c81ff6e0.js delete mode 100644 docs/assets/js/1b5fa8ad.99194259.js delete mode 100644 docs/assets/js/1c0701dd.8572a44b.js delete mode 100644 docs/assets/js/1da545ff.ef424470.js delete mode 100644 docs/assets/js/1db64337.7448d5c4.js delete mode 100644 docs/assets/js/1e0353aa.bd262216.js delete mode 100644 docs/assets/js/1f391b9e.825d8c20.js delete mode 100644 docs/assets/js/21fa2740.44a7d1df.js delete mode 100644 docs/assets/js/22dd74f7.8c39a7a2.js delete mode 100644 docs/assets/js/2456d5e0.565789dc.js delete mode 100644 docs/assets/js/25626d15.27c1b41f.js delete mode 100644 docs/assets/js/2564bf4f.b4905e08.js delete mode 100644 docs/assets/js/25a43fd4.f20d897d.js delete mode 100644 docs/assets/js/26b8a621.0fdedfc5.js delete mode 100644 docs/assets/js/280a2389.3dec6d46.js delete mode 100644 docs/assets/js/294ac9d5.a530f746.js delete mode 100644 docs/assets/js/2aec6989.93b045aa.js delete mode 100644 docs/assets/js/2c41656d.5238f25d.js delete mode 100644 docs/assets/js/2efd0200.eec55c75.js delete mode 100644 docs/assets/js/2fe9ecb2.fc29e504.js delete mode 100644 docs/assets/js/32667c41.fb0c28b5.js delete mode 100644 docs/assets/js/326aca46.f7338c91.js delete mode 100644 docs/assets/js/3417a9c7.4cd2a2af.js delete mode 100644 docs/assets/js/34f94d1b.29ea6eee.js delete mode 100644 docs/assets/js/35e4d287.95750a0a.js delete mode 100644 docs/assets/js/36715375.d4b64326.js delete mode 100644 docs/assets/js/37055470.55528f37.js delete mode 100644 docs/assets/js/380cc66a.7da5e510.js delete mode 100644 docs/assets/js/38a45a95.a7eb0903.js delete mode 100644 docs/assets/js/38bbf12a.62b38600.js delete mode 100644 docs/assets/js/393be207.9cd944e0.js delete mode 100644 docs/assets/js/39600c95.6a7491bc.js delete mode 100644 docs/assets/js/3ebfb37f.f5f42f4c.js delete mode 100644 docs/assets/js/401008a8.cfd81712.js delete mode 100644 docs/assets/js/40b6398a.86580fca.js delete mode 100644 docs/assets/js/41f941a1.b03616ab.js delete mode 100644 docs/assets/js/4250.a201ce1c.js delete mode 100644 docs/assets/js/4250.a201ce1c.js.LICENSE.txt delete mode 100644 docs/assets/js/4291.9c7472fc.js delete mode 100644 docs/assets/js/432b83f9.d8e65e8a.js delete mode 100644 docs/assets/js/4616b86a.247bc33b.js delete mode 100644 docs/assets/js/4777fd9a.5d703faa.js delete mode 100644 docs/assets/js/4adf80bb.5245b2b7.js delete mode 100644 docs/assets/js/4af60d2e.8fe42f95.js delete mode 100644 docs/assets/js/4ba7e5a3.fec476c6.js delete mode 100644 docs/assets/js/4ed9495b.b85648e1.js delete mode 100644 docs/assets/js/4f17bbdd.b46c3eaf.js delete mode 100644 docs/assets/js/502d8946.3c4d7aab.js delete mode 100644 docs/assets/js/51014a8a.c98a88e4.js delete mode 100644 docs/assets/js/51038524.bb23a7bd.js delete mode 100644 docs/assets/js/51334108.2284fc7c.js delete mode 100644 docs/assets/js/5134b15f.c48f7dbd.js delete mode 100644 docs/assets/js/55a5b596.49b70407.js delete mode 100644 docs/assets/js/58215328.4a9061e5.js delete mode 100644 docs/assets/js/5943.0ded4df5.js delete mode 100644 docs/assets/js/597d88be.269bc776.js delete mode 100644 docs/assets/js/5a273530.2bec61c8.js delete mode 100644 docs/assets/js/5b5afcec.7e369a0e.js delete mode 100644 docs/assets/js/5e95c892.e42e7000.js delete mode 100644 docs/assets/js/61792630.6e389211.js delete mode 100644 docs/assets/js/6187b59a.746cfe2d.js delete mode 100644 docs/assets/js/6672.9c7472fc.js delete mode 100644 docs/assets/js/68a466be.08b60ae4.js delete mode 100644 docs/assets/js/6ae3580c.67a503bd.js delete mode 100644 docs/assets/js/6bfb0089.d52978b6.js delete mode 100644 docs/assets/js/6cbff7c2.db294439.js delete mode 100644 docs/assets/js/6fa8aa1a.10d4f0d3.js delete mode 100644 docs/assets/js/6fd28feb.45da1980.js delete mode 100644 docs/assets/js/714575d7.f4b12fd2.js delete mode 100644 docs/assets/js/7443.f0d813bb.js delete mode 100644 docs/assets/js/77979bef.e414ae82.js delete mode 100644 docs/assets/js/77d975e6.f460ed60.js delete mode 100644 docs/assets/js/7815dd0c.d77e48f5.js delete mode 100644 docs/assets/js/7bbb96fd.75e20d36.js delete mode 100644 docs/assets/js/7f02c700.bd5b1cc8.js delete mode 100644 docs/assets/js/8070e160.c192f1b9.js delete mode 100644 docs/assets/js/8084fe3b.f4614fb9.js delete mode 100644 docs/assets/js/820807a1.82638c55.js delete mode 100644 docs/assets/js/8288c265.d455b0a0.js delete mode 100644 docs/assets/js/8489a755.3170bb72.js delete mode 100644 docs/assets/js/84a3af36.7a11f993.js delete mode 100644 docs/assets/js/84ae55a4.1bdc94ff.js delete mode 100644 docs/assets/js/85caacef.9966ef6e.js delete mode 100644 docs/assets/js/86b4e356.9be07523.js delete mode 100644 docs/assets/js/8a22f3a9.87a88033.js delete mode 100644 docs/assets/js/8a442806.cda40cae.js delete mode 100644 docs/assets/js/8aa53ed7.941200b7.js delete mode 100644 docs/assets/js/8b0a0922.114db760.js delete mode 100644 docs/assets/js/8b4bf532.36358d72.js delete mode 100644 docs/assets/js/8bc07e20.d1b7c7db.js delete mode 100644 docs/assets/js/8bc82b1f.9df61a79.js delete mode 100644 docs/assets/js/8bfd920a.7d84a9e9.js delete mode 100644 docs/assets/js/90102fdf.191788f5.js delete mode 100644 docs/assets/js/9187.d599c63b.js delete mode 100644 docs/assets/js/91b454ee.57807487.js delete mode 100644 docs/assets/js/924d6dd6.ee7a4ff8.js delete mode 100644 docs/assets/js/92698a99.49ff7265.js delete mode 100644 docs/assets/js/9293.098c020a.js delete mode 100644 docs/assets/js/931f4566.40f8ed4e.js delete mode 100644 docs/assets/js/951d0efb.94a862cc.js delete mode 100644 docs/assets/js/98405524.b9ffa436.js delete mode 100644 docs/assets/js/9850.34d66cab.js delete mode 100644 docs/assets/js/9dae6e71.d38c8ec6.js delete mode 100644 docs/assets/js/9dd8ea89.9d935eb6.js delete mode 100644 docs/assets/js/9e91b6f0.cfa4288f.js delete mode 100644 docs/assets/js/a406dc27.d08b03b3.js delete mode 100644 docs/assets/js/a442adcd.3011bc9b.js delete mode 100644 docs/assets/js/a574e172.f6f58d32.js delete mode 100644 docs/assets/js/a69eebfc.8659aa3b.js delete mode 100644 docs/assets/js/a7456010.4971822d.js delete mode 100644 docs/assets/js/a7bd4aaa.992c4a90.js delete mode 100644 docs/assets/js/a7f10198.cfa2de30.js delete mode 100644 docs/assets/js/a94703ab.13c96c74.js delete mode 100644 docs/assets/js/aa14e6b1.c1e700b0.js delete mode 100644 docs/assets/js/ab919a1f.41585657.js delete mode 100644 docs/assets/js/aba21aa0.6f50d3cb.js delete mode 100644 docs/assets/js/ac62b32d.0f37c11a.js delete mode 100644 docs/assets/js/ad16b3ea.bade954e.js delete mode 100644 docs/assets/js/ae2c2832.694f423a.js delete mode 100644 docs/assets/js/b0889a22.eeabb12f.js delete mode 100644 docs/assets/js/b2653a00.0fc762c0.js delete mode 100644 docs/assets/js/b30f4f1f.0b7faa87.js delete mode 100644 docs/assets/js/b672caf7.019a15fb.js delete mode 100644 docs/assets/js/b8c49ce4.3962d1bb.js delete mode 100644 docs/assets/js/badcd764.922f3eee.js delete mode 100644 docs/assets/js/bdd39edd.10cefecb.js delete mode 100644 docs/assets/js/c0f75fb9.ea90dae3.js delete mode 100644 docs/assets/js/c3bc9c50.8e3aa667.js delete mode 100644 docs/assets/js/c44853e1.bcb8c55f.js delete mode 100644 docs/assets/js/c4de80f8.c103cf90.js delete mode 100644 docs/assets/js/c6349bb6.5798b933.js delete mode 100644 docs/assets/js/c6fdd490.58a5fe1a.js delete mode 100644 docs/assets/js/c7b47308.b6848169.js delete mode 100644 docs/assets/js/c843a053.b5bc0bab.js delete mode 100644 docs/assets/js/c9c8e0b6.2dbabe8c.js delete mode 100644 docs/assets/js/cbbe8f0a.ab22b4f7.js delete mode 100644 docs/assets/js/cde77f4f.373290c4.js delete mode 100644 docs/assets/js/d04a108d.210d2f40.js delete mode 100644 docs/assets/js/d20e74b4.4c817e3a.js delete mode 100644 docs/assets/js/d2758528.b809fc57.js delete mode 100644 docs/assets/js/d4da9db3.185d0923.js delete mode 100644 docs/assets/js/d622bd51.d14041c3.js delete mode 100644 docs/assets/js/db34d6b0.9ff45764.js delete mode 100644 docs/assets/js/dbde2ffe.733abe4c.js delete mode 100644 docs/assets/js/dc42ba65.afadf186.js delete mode 100644 docs/assets/js/de9a3c97.63e95596.js delete mode 100644 docs/assets/js/e24529eb.bcf6ccf6.js delete mode 100644 docs/assets/js/e6b4453d.65be7d01.js delete mode 100644 docs/assets/js/e8a836f3.8a792a52.js delete mode 100644 docs/assets/js/eadd9b3c.6302952f.js delete mode 100644 docs/assets/js/eb2e4b0c.11dfbd63.js delete mode 100644 docs/assets/js/ebace26e.1d9003e1.js delete mode 100644 docs/assets/js/ec526260.b97d027a.js delete mode 100644 docs/assets/js/ed2d6610.83202793.js delete mode 100644 docs/assets/js/ee1b9f21.35539cef.js delete mode 100644 docs/assets/js/f14ec96f.0b4554ce.js delete mode 100644 docs/assets/js/f15938da.18649363.js delete mode 100644 docs/assets/js/f1c185f0.eaabf3d6.js delete mode 100644 docs/assets/js/f43e80a8.446f3666.js delete mode 100644 docs/assets/js/f44bb875.0c73cd1a.js delete mode 100644 docs/assets/js/f490b64c.9c10cfb5.js delete mode 100644 docs/assets/js/f61fdf57.63b3f973.js delete mode 100644 docs/assets/js/fe2a63b2.6ba7190d.js delete mode 100644 docs/assets/js/fe7a07ee.192b6a61.js delete mode 100644 docs/assets/js/feac4174.b67e5d15.js delete mode 100644 docs/assets/js/ff492cda.d7a9ad86.js delete mode 100644 docs/assets/js/main.c9c8ff04.js delete mode 100644 docs/assets/js/main.c9c8ff04.js.LICENSE.txt delete mode 100644 docs/assets/js/runtime~main.f8cb08bf.js delete mode 100644 docs/backup.html delete mode 100644 docs/backup.md delete mode 100644 docs/capacitor-database.html delete mode 100644 docs/capacitor-database.md delete mode 100644 docs/chat/index.html delete mode 100644 docs/cleanup.html delete mode 100644 docs/cleanup.md delete mode 100644 docs/code/index.html delete mode 100644 docs/consulting/index.html delete mode 100644 docs/contribute.md delete mode 100644 docs/contribution.html delete mode 100644 docs/crdt.html delete mode 100644 docs/crdt.md delete mode 100644 docs/data-migration.html delete mode 100644 docs/data-migration.md delete mode 100644 docs/demo-submitted/index.html delete mode 100644 docs/dev-mode.html delete mode 100644 docs/dev-mode.md delete mode 100644 docs/downsides-of-offline-first.html delete mode 100644 docs/downsides-of-offline-first.md delete mode 100644 docs/electron-database.html delete mode 100644 docs/electron-database.md delete mode 100644 docs/electron.html delete mode 100644 docs/electron.md delete mode 100644 docs/encryption.html delete mode 100644 docs/encryption.md delete mode 100644 docs/errors.html delete mode 100644 docs/errors.md delete mode 100644 docs/files/alternatives/aws-amplify.svg delete mode 100644 docs/files/alternatives/firebase.svg delete mode 100644 docs/files/alternatives/meteor.svg delete mode 100644 docs/files/alternatives/meteor_text.svg delete mode 100644 docs/files/alternatives/pouchdb.svg delete mode 100644 docs/files/alternatives/rethinkdb.svg delete mode 100644 docs/files/alternatives/supabase.svg delete mode 100644 docs/files/alternatives/watermelondb.png delete mode 100644 docs/files/animations/realtime.gif delete mode 100644 docs/files/animations/realtime.mp4 delete mode 100644 docs/files/audio/heartbeat/67161381-heart-beat-license.txt delete mode 100644 docs/files/audio/heartbeat/heartbeat.mp3 delete mode 100644 docs/files/audio/heartbeat/heartbeat.wav delete mode 100644 docs/files/cap-theorem.png delete mode 100644 docs/files/chat-app.png delete mode 100644 docs/files/companies/atroo.png delete mode 100644 docs/files/companies/moreapp.png delete mode 100644 docs/files/companies/myagro.svg delete mode 100644 docs/files/companies/nutrien.svg delete mode 100644 docs/files/companies/readwise.svg delete mode 100644 docs/files/companies/safeex.svg delete mode 100644 docs/files/companies/webware.svg delete mode 100644 docs/files/companies/woopos.svg delete mode 100644 docs/files/crdt-conflict-free-replicated-data-type.svg delete mode 100644 docs/files/database-replication.png delete mode 100644 docs/files/discord.svg delete mode 100644 docs/files/document-replication-conflict.svg delete mode 100644 docs/files/gitter.svg delete mode 100644 docs/files/icons/angular.svg delete mode 100644 docs/files/icons/appwrite-small.svg delete mode 100644 docs/files/icons/appwrite.svg delete mode 100644 docs/files/icons/arrows/double-arrow.svg delete mode 100644 docs/files/icons/arrows/left-arrow.svg delete mode 100644 docs/files/icons/arrows/right-arrow.svg delete mode 100644 docs/files/icons/browser.svg delete mode 100644 docs/files/icons/capacitor.svg delete mode 100644 docs/files/icons/commit.svg delete mode 100644 docs/files/icons/cordova.svg delete mode 100644 docs/files/icons/couchdb-text.svg delete mode 100644 docs/files/icons/couchdb.svg delete mode 100644 docs/files/icons/deno.svg delete mode 100644 docs/files/icons/desktop.svg delete mode 100644 docs/files/icons/discord.svg delete mode 100644 docs/files/icons/download.svg delete mode 100644 docs/files/icons/electron.svg delete mode 100644 docs/files/icons/expo.svg delete mode 100644 docs/files/icons/expo_text.svg delete mode 100644 docs/files/icons/expo_white.svg delete mode 100644 docs/files/icons/firebase.svg delete mode 100644 docs/files/icons/flutter.svg delete mode 100644 docs/files/icons/gear.svg delete mode 100644 docs/files/icons/github-star-with-logo.svg delete mode 100644 docs/files/icons/github-star.svg delete mode 100644 docs/files/icons/graphql-text.svg delete mode 100644 docs/files/icons/graphql.svg delete mode 100644 docs/files/icons/http.svg delete mode 100644 docs/files/icons/ionic.svg delete mode 100644 docs/files/icons/jquery.svg delete mode 100644 docs/files/icons/mobile.svg delete mode 100644 docs/files/icons/mongodb-icon.svg delete mode 100644 docs/files/icons/mongodb.svg delete mode 100644 docs/files/icons/nativescript.svg delete mode 100644 docs/files/icons/nats.svg delete mode 100644 docs/files/icons/nextjs.svg delete mode 100644 docs/files/icons/nodejs.svg delete mode 100644 docs/files/icons/person.svg delete mode 100644 docs/files/icons/pouchdb.svg delete mode 100644 docs/files/icons/react.svg delete mode 100644 docs/files/icons/rxjs.svg delete mode 100644 docs/files/icons/server.svg delete mode 100644 docs/files/icons/sqlite.svg delete mode 100644 docs/files/icons/supabase.svg delete mode 100644 docs/files/icons/svelte.svg delete mode 100644 docs/files/icons/transformers.js.svg delete mode 100644 docs/files/icons/twitter-blue.svg delete mode 100644 docs/files/icons/twitter.svg delete mode 100644 docs/files/icons/typescript.svg delete mode 100644 docs/files/icons/vuejs.svg delete mode 100644 docs/files/icons/webrtc.svg delete mode 100644 docs/files/icons/wifi/wifi.svg delete mode 100644 docs/files/icons/wifi/wifi_171923.svg delete mode 100644 docs/files/icons/wifi/wifi_1a202c.svg delete mode 100644 docs/files/icons/wifi/wifi_e6008d.svg delete mode 100644 docs/files/icons/with-gradient/checklist.svg delete mode 100644 docs/files/icons/with-gradient/contribute.svg delete mode 100644 docs/files/icons/with-gradient/multiplayer.svg delete mode 100644 docs/files/icons/with-gradient/people.svg delete mode 100644 docs/files/icons/with-gradient/replication.svg delete mode 100644 docs/files/icons/with-gradient/rocket.svg delete mode 100644 docs/files/icons/with-gradient/storage-layer.svg delete mode 100644 docs/files/icons/with-gradient/text/made-easy.svg delete mode 100644 docs/files/imprint-email.png delete mode 100644 docs/files/indexeddb-batched-cursor.png delete mode 100644 docs/files/indexeddb-custom-index.png delete mode 100644 docs/files/indexeddb-sharding-performance.png delete mode 100644 docs/files/indexeddb-transaction-throughput.png delete mode 100644 docs/files/latency-london-san-franzisco.png delete mode 100644 docs/files/leader-election.gif delete mode 100644 docs/files/leader-election.mp4 delete mode 100644 docs/files/loading-spinner-not-needed.gif delete mode 100644 docs/files/logger.png delete mode 100644 docs/files/logo/icon.ico delete mode 100644 docs/files/logo/icon.png delete mode 100644 docs/files/logo/logo.svg delete mode 100644 docs/files/logo/logo_text.png delete mode 100644 docs/files/logo/logo_text.svg delete mode 100644 docs/files/logo/logo_text_white.svg delete mode 100644 docs/files/logo/rxdb_javascript_database.svg delete mode 100644 docs/files/logo/rxdb_mini.svg delete mode 100644 docs/files/longwhite.jpg delete mode 100644 docs/files/multiwindow.gif delete mode 100644 docs/files/multiwindow.mp4 delete mode 100644 docs/files/no-map-tag.png delete mode 100644 docs/files/no-relational-data.png delete mode 100644 docs/files/no-sql.png delete mode 100644 docs/files/offline-ready.png delete mode 100644 docs/files/reactive.gif delete mode 100644 docs/files/reactive.mp4 delete mode 100644 docs/files/rx-storage-performance-browser.png delete mode 100644 docs/files/rx-storage-performance-node.png delete mode 100644 docs/files/safari-database.png delete mode 100644 docs/files/server-scaling-tree.png delete mode 100644 docs/files/smartphone/desktop.svg delete mode 100644 docs/files/smartphone/desktop_white.svg delete mode 100644 docs/files/smartphone/index.html delete mode 100644 docs/files/smartphone/phone.png delete mode 100644 docs/files/smartphone/server.svg delete mode 100644 docs/files/smartphone/server_white.svg delete mode 100644 docs/files/smartphone/tablet.svg delete mode 100644 docs/files/smartphone/tablet_white.svg delete mode 100644 docs/files/sync.gif delete mode 100644 docs/files/sync.mp4 delete mode 100644 docs/files/synced.gif delete mode 100644 docs/files/synced.mp4 delete mode 100644 docs/files/twitter_follow.png delete mode 100644 docs/files/typescript-query-validation.png delete mode 100644 docs/files/typescript.png delete mode 100644 docs/files/used-by-many.png delete mode 100644 docs/files/vector-database-result.png delete mode 100644 docs/files/websocket-webrtc-webtransport-performance.png delete mode 100644 docs/files/why-no-transactions.jpg delete mode 100644 docs/fonts/AtkinsonHyperlegibleMono-Italic-VariableFont_wght.ttf delete mode 100644 docs/fonts/AtkinsonHyperlegibleMono-VariableFont_wght.ttf delete mode 100644 docs/fulltext-search.html delete mode 100644 docs/fulltext-search.md delete mode 100644 docs/html/dev-mode-iframe.html delete mode 100644 docs/img/apple-touch-icon.png delete mode 100644 docs/img/benefits-column-mobile.svg delete mode 100644 docs/img/benefits-column.svg delete mode 100644 docs/img/community-links/discord-logo.svg delete mode 100644 docs/img/community-links/github-logo.svg delete mode 100644 docs/img/community-links/linkedin-logo.svg delete mode 100644 docs/img/community-links/stack-overflow-logo.svg delete mode 100644 docs/img/community-links/x-logo.svg delete mode 100644 docs/img/docusaurus.png delete mode 100644 docs/img/favicon.png delete mode 100644 docs/img/footer-column.svg delete mode 100644 docs/img/hero-group-mobile.svg delete mode 100644 docs/img/hero-group.svg delete mode 100644 docs/img/hero.svg delete mode 100644 docs/img/next-column.svg delete mode 100644 docs/img/rxdb_social_card.png delete mode 100644 docs/img/steps-column.svg delete mode 100644 docs/img/thumbs-up-white.svg delete mode 100644 docs/img/thumbs-up.svg delete mode 100644 docs/index.html delete mode 100644 docs/install.html delete mode 100644 docs/install.md delete mode 100644 docs/key-compression.html delete mode 100644 docs/key-compression.md delete mode 100644 docs/leader-election.html delete mode 100644 docs/leader-election.md delete mode 100644 docs/legal-notice/index.html delete mode 100644 docs/license/index.html delete mode 100644 docs/llms-full.txt delete mode 100644 docs/llms.txt delete mode 100644 docs/logger.html delete mode 100644 docs/logger.md delete mode 100644 docs/lunr-index-1769435561373.json delete mode 100644 docs/lunr-index.json delete mode 100644 docs/markdown-page/index.html delete mode 100644 docs/meeting-paid-starter/index.html delete mode 100644 docs/meeting-paid/index.html delete mode 100644 docs/meeting/index.html delete mode 100644 docs/middleware.html delete mode 100644 docs/middleware.md delete mode 100644 docs/migration-schema.html delete mode 100644 docs/migration-schema.md delete mode 100644 docs/migration-storage.html delete mode 100644 docs/migration-storage.md delete mode 100644 docs/newsletter/index.html delete mode 100644 docs/nodejs-database.html delete mode 100644 docs/nodejs-database.md delete mode 100644 docs/nosql-performance-tips.html delete mode 100644 docs/nosql-performance-tips.md delete mode 100644 docs/offline-first.html delete mode 100644 docs/offline-first.md delete mode 100644 docs/orm.html delete mode 100644 docs/orm.md delete mode 100644 docs/overview.html delete mode 100644 docs/overview.md delete mode 100644 docs/plugins.html delete mode 100644 docs/plugins.md delete mode 100644 docs/population.html delete mode 100644 docs/population.md delete mode 100644 docs/premium-submitted/index.html delete mode 100644 docs/premium/index.html delete mode 100644 docs/query-cache.html delete mode 100644 docs/query-cache.md delete mode 100644 docs/query-optimizer.html delete mode 100644 docs/query-optimizer.md delete mode 100644 docs/quickstart.html delete mode 100644 docs/quickstart.md delete mode 100644 docs/react-native-database.html delete mode 100644 docs/react-native-database.md delete mode 100644 docs/react.html delete mode 100644 docs/react.md delete mode 100644 docs/reactivity.html delete mode 100644 docs/reactivity.md delete mode 100644 docs/releases/10.0.0.html delete mode 100644 docs/releases/10.0.0.md delete mode 100644 docs/releases/11.0.0.html delete mode 100644 docs/releases/11.0.0.md delete mode 100644 docs/releases/12.0.0.html delete mode 100644 docs/releases/12.0.0.md delete mode 100644 docs/releases/13.0.0.html delete mode 100644 docs/releases/13.0.0.md delete mode 100644 docs/releases/14.0.0.html delete mode 100644 docs/releases/14.0.0.md delete mode 100644 docs/releases/15.0.0.html delete mode 100644 docs/releases/15.0.0.md delete mode 100644 docs/releases/16.0.0.html delete mode 100644 docs/releases/16.0.0.md delete mode 100644 docs/releases/17.0.0.html delete mode 100644 docs/releases/17.0.0.md delete mode 100644 docs/releases/8.0.0.html delete mode 100644 docs/releases/8.0.0.md delete mode 100644 docs/releases/9.0.0.html delete mode 100644 docs/releases/9.0.0.md delete mode 100644 docs/replication-appwrite.html delete mode 100644 docs/replication-appwrite.md delete mode 100644 docs/replication-couchdb.html delete mode 100644 docs/replication-couchdb.md delete mode 100644 docs/replication-firestore.html delete mode 100644 docs/replication-firestore.md delete mode 100644 docs/replication-graphql.html delete mode 100644 docs/replication-graphql.md delete mode 100644 docs/replication-http.html delete mode 100644 docs/replication-http.md delete mode 100644 docs/replication-mongodb.html delete mode 100644 docs/replication-mongodb.md delete mode 100644 docs/replication-nats.html delete mode 100644 docs/replication-nats.md delete mode 100644 docs/replication-p2p.html delete mode 100644 docs/replication-p2p.md delete mode 100644 docs/replication-server.html delete mode 100644 docs/replication-server.md delete mode 100644 docs/replication-supabase.html delete mode 100644 docs/replication-supabase.md delete mode 100644 docs/replication-webrtc.html delete mode 100644 docs/replication-webrtc.md delete mode 100644 docs/replication-websocket.html delete mode 100644 docs/replication-websocket.md delete mode 100644 docs/replication.html delete mode 100644 docs/replication.md delete mode 100644 docs/rx-attachment.html delete mode 100644 docs/rx-attachment.md delete mode 100644 docs/rx-collection.html delete mode 100644 docs/rx-collection.md delete mode 100644 docs/rx-database.html delete mode 100644 docs/rx-database.md delete mode 100644 docs/rx-document.html delete mode 100644 docs/rx-document.md delete mode 100644 docs/rx-local-document.html delete mode 100644 docs/rx-local-document.md delete mode 100644 docs/rx-pipeline.html delete mode 100644 docs/rx-pipeline.md delete mode 100644 docs/rx-query.html delete mode 100644 docs/rx-query.md delete mode 100644 docs/rx-schema.html delete mode 100644 docs/rx-schema.md delete mode 100644 docs/rx-server-scaling.html delete mode 100644 docs/rx-server-scaling.md delete mode 100644 docs/rx-server.html delete mode 100644 docs/rx-server.md delete mode 100644 docs/rx-state.html delete mode 100644 docs/rx-state.md delete mode 100644 docs/rx-storage-denokv.html delete mode 100644 docs/rx-storage-denokv.md delete mode 100644 docs/rx-storage-dexie.html delete mode 100644 docs/rx-storage-dexie.md delete mode 100644 docs/rx-storage-filesystem-node.html delete mode 100644 docs/rx-storage-filesystem-node.md delete mode 100644 docs/rx-storage-foundationdb.html delete mode 100644 docs/rx-storage-foundationdb.md delete mode 100644 docs/rx-storage-indexeddb.html delete mode 100644 docs/rx-storage-indexeddb.md delete mode 100644 docs/rx-storage-localstorage-meta-optimizer.html delete mode 100644 docs/rx-storage-localstorage-meta-optimizer.md delete mode 100644 docs/rx-storage-localstorage.html delete mode 100644 docs/rx-storage-localstorage.md delete mode 100644 docs/rx-storage-lokijs.html delete mode 100644 docs/rx-storage-memory-mapped.html delete mode 100644 docs/rx-storage-memory-mapped.md delete mode 100644 docs/rx-storage-memory-synced.html delete mode 100644 docs/rx-storage-memory-synced.md delete mode 100644 docs/rx-storage-memory.html delete mode 100644 docs/rx-storage-memory.md delete mode 100644 docs/rx-storage-mongodb.html delete mode 100644 docs/rx-storage-mongodb.md delete mode 100644 docs/rx-storage-opfs.html delete mode 100644 docs/rx-storage-opfs.md delete mode 100644 docs/rx-storage-performance.html delete mode 100644 docs/rx-storage-performance.md delete mode 100644 docs/rx-storage-pouchdb.html delete mode 100644 docs/rx-storage-pouchdb.md delete mode 100644 docs/rx-storage-remote.html delete mode 100644 docs/rx-storage-remote.md delete mode 100644 docs/rx-storage-sharding.html delete mode 100644 docs/rx-storage-sharding.md delete mode 100644 docs/rx-storage-shared-worker.html delete mode 100644 docs/rx-storage-shared-worker.md delete mode 100644 docs/rx-storage-sqlite.html delete mode 100644 docs/rx-storage-sqlite.md delete mode 100644 docs/rx-storage-worker.html delete mode 100644 docs/rx-storage-worker.md delete mode 100644 docs/rx-storage.html delete mode 100644 docs/rx-storage.md delete mode 100644 docs/rxdb-tradeoffs.html delete mode 100644 docs/rxdb-tradeoffs.md delete mode 100644 docs/schema-validation.html delete mode 100644 docs/schema-validation.md delete mode 100644 docs/search-doc-1769435561373.json delete mode 100644 docs/search-doc.json delete mode 100644 docs/sem/angular-database/index.html delete mode 100644 docs/sem/browser-database/index.html delete mode 100644 docs/sem/capacitor-database/index.html delete mode 100644 docs/sem/electron-database/index.html delete mode 100644 docs/sem/expo-database/index.html delete mode 100644 docs/sem/firestore-alternative/index.html delete mode 100644 docs/sem/gads/index.html delete mode 100644 docs/sem/indexeddb-database-2/index.html delete mode 100644 docs/sem/indexeddb-database/index.html delete mode 100644 docs/sem/ionic-database/index.html delete mode 100644 docs/sem/localstorage-database/index.html delete mode 100644 docs/sem/nedb-alternative/index.html delete mode 100644 docs/sem/nodejs-database/index.html delete mode 100644 docs/sem/nosql-database/index.html delete mode 100644 docs/sem/pouchdb-alternative/index.html delete mode 100644 docs/sem/react-database/index.html delete mode 100644 docs/sem/react-native-database/index.html delete mode 100644 docs/sem/reddit/index.html delete mode 100644 docs/sem/svelte-database/index.html delete mode 100644 docs/sem/vue-database/index.html delete mode 100644 docs/sem/watermelondb-alternative/index.html delete mode 100644 docs/service-submitted/index.html delete mode 100644 docs/sitemap.xml delete mode 100644 docs/slow-indexeddb.html delete mode 100644 docs/slow-indexeddb.md delete mode 100644 docs/survey/index.html delete mode 100644 docs/third-party-plugins.html delete mode 100644 docs/third-party-plugins.md delete mode 100644 docs/transactions-conflicts-revisions.html delete mode 100644 docs/transactions-conflicts-revisions.md delete mode 100644 docs/tutorials/typescript.html delete mode 100644 docs/tutorials/typescript.md delete mode 100644 docs/why-nosql.html delete mode 100644 docs/why-nosql.md diff --git a/docs/404.html b/docs/404.html deleted file mode 100644 index bdec7e3bfc2..00000000000 --- a/docs/404.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RxDB
404 Page Not Found

The page you are looking for does not exist anymore or never has existed. If you have found this page through a link, you should tell the link author to update it.

Maybe one of these can help you to find the desired content:

- - \ No newline at end of file diff --git a/docs/CNAME b/docs/CNAME deleted file mode 100644 index 49cb41c8f3a..00000000000 --- a/docs/CNAME +++ /dev/null @@ -1 +0,0 @@ -rxdb.info diff --git a/docs/adapters.html b/docs/adapters.html deleted file mode 100644 index 51c82a5a2c2..00000000000 --- a/docs/adapters.html +++ /dev/null @@ -1,236 +0,0 @@ - - - - - -PouchDB Adapters | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

PouchDB Adapters

-

When you use PouchDB RxStorage, there are many adapters that define where the data has to be stored. -Depending on which environment you work in, you can choose between different adapters. For example, in the browser you want to store the data inside of IndexedDB but on NodeJS you want to store the data on the filesystem.

-

This page is an overview over the different adapters with recommendations on what to use where.

-
-
warning

The PouchDB RxStorage is removed from RxDB and can no longer be used in new projects. You should switch to a different RxStorage.

-
-

Please always ensure that your pouchdb adapter-version is the same as pouchdb-core in the rxdb package.json. Otherwise, you might have strange problems.

-

Any environment

-

Memory

-

In any environment, you can use the memory-adapter. It stores the data in the javascript runtime memory. This means it is not persistent and the data is lost when the process terminates.

-

Use this adapter when:

-
    -
  • You want to have really good performance
  • -
  • You do not want persistent state, for example in your test suite
  • -
-
import {
-    createRxDatabase
-} from 'rxdb'
-import {
-    getRxStoragePouch
-} from 'rxdb/plugins/pouchdb';
-// npm install pouchdb-adapter-memory --save
-addPouchPlugin(require('pouchdb-adapter-memory'));
- 
-const database = await createRxDatabase({
-    name: 'mydatabase',
-    storage: getRxStoragePouch('memory')
-});
-

Memdown

-

With RxDB you can also use adapters that implement abstract-leveldown like the memdown-adapter.

-
// npm install memdown --save
-// npm install pouchdb-adapter-leveldb --save
-addPouchPlugin(require('pouchdb-adapter-leveldb')); // leveldown adapters need the leveldb plugin to work
- 
-const memdown = require('memdown');
- 
-const database = await createRxDatabase({
-    name: 'mydatabase',
-    storage: getRxStoragePouch(memdown) // the full leveldown-module
-});
-

Browser

-

IndexedDB

-

The IndexedDB adapter stores the data inside of IndexedDB use this in browsers environments as default.

-
// npm install pouchdb-adapter-idb --save
-addPouchPlugin(require('pouchdb-adapter-idb'));
- 
-const database = await createRxDatabase({
-    name: 'mydatabase',
-    storage: getRxStoragePouch('idb')
-});
-

IndexedDB

-

A reimplementation of the indexeddb adapter which uses native secondary indexes. Should have a much better performance but can behave different on some edge cases.

-
note

Multiple users have reported problems with this adapter. It is not recommended to use this adapter.

-
// npm install pouchdb-adapter-indexeddb --save
-addPouchPlugin(require('pouchdb-adapter-indexeddb'));
- 
-const database = await createRxDatabase({
-    name: 'mydatabase',
-    storage: getRxStoragePouch('indexeddb')
-});
-

Websql

-

This adapter stores the data inside of websql. It has a different performance behavior. Websql is deprecated. You should not use the websql adapter unless you have a really good reason.

-
// npm install pouchdb-adapter-websql --save
-addPouchPlugin(require('pouchdb-adapter-websql'));
- 
-const database = await createRxDatabase({
-    name: 'mydatabase',
-    storage: getRxStoragePouch('websql')
-});
-

NodeJS

-

leveldown

-

This adapter uses a LevelDB C++ binding to store that data on the filesystem. It has the best performance compared to other filesystem adapters. This adapter can not be used when multiple nodejs-processes access the same filesystem folders for storage.

-
// npm install leveldown --save
-// npm install pouchdb-adapter-leveldb --save
-addPouchPlugin(require('pouchdb-adapter-leveldb')); // leveldown adapters need the leveldb plugin to work
-const leveldown = require('leveldown');
- 
-const database = await createRxDatabase({
-    name: 'mydatabase',
-    storage: getRxStoragePouch(leveldown) // the full leveldown-module
-});
- 
-// or use a specific folder to store the data
-const database = await createRxDatabase({
-    name: '/root/user/project/mydatabase',
-    storage: getRxStoragePouch(leveldown) // the full leveldown-module
-});
-

Node-Websql

-

This adapter uses the node-websql-shim to store data on the filesystem. Its advantages are that it does not need a leveldb build and it can be used when multiple nodejs-processes use the same database-files.

-
// npm install pouchdb-adapter-node-websql --save
-addPouchPlugin(require('pouchdb-adapter-node-websql'));
- 
-const database = await createRxDatabase({
-    name: 'mydatabase',
-    storage: getRxStoragePouch('websql') // the name of your adapter
-});
- 
-// or use a specific folder to store the data
-const database = await createRxDatabase({
-    name: '/root/user/project/mydatabase',
-    storage: getRxStoragePouch('websql') // the name of your adapter
-});
-

React-Native

-

react-native-sqlite

-

Uses ReactNative SQLite as storage. Claims to be much faster than the asyncstorage adapter. -To use it, you have to do some steps from this tutorial.

-

First install pouchdb-adapter-react-native-sqlite and react-native-sqlite-2.

-
npm install pouchdb-adapter-react-native-sqlite react-native-sqlite-2
-

Then you have to link the library.

-
react-native link react-native-sqlite-2
-

You also have to add some polyfills which are need but not included in react-native.

-
npm install base-64 events
-
import { decode, encode } from 'base-64'
- 
-if (!global.btoa) {
-    global.btoa = encode;
-}
- 
-if (!global.atob) {
-    global.atob = decode;
-}
- 
-// Avoid using node dependent modules
-process.browser = true;
-

Then you can use it inside of your code.

-
import { createRxDatabase } from 'rxdb';
-import { addPouchPlugin, getRxStoragePouch } from 'rxdb/plugins/pouchdb';
-import SQLite from 'react-native-sqlite-2'
-import SQLiteAdapterFactory from 'pouchdb-adapter-react-native-sqlite'
- 
-const SQLiteAdapter = SQLiteAdapterFactory(SQLite)
- 
-addPouchPlugin(SQLiteAdapter);
-addPouchPlugin(require('pouchdb-adapter-http'));
- 
-const database = await createRxDatabase({
-    name: 'mydatabase',
-    storage: getRxStoragePouch('react-native-sqlite') // the name of your adapter
-});
-

asyncstorage

-

Uses react-native's asyncstorage.

-
note

There are known problems with this adapter and it is not recommended to use it.

-
// npm install pouchdb-adapter-asyncstorage --save
-addPouchPlugin(require('pouchdb-adapter-asyncstorage'));
- 
-const database = await createRxDatabase({
-    name: 'mydatabase',
-    storage: getRxStoragePouch('node-asyncstorage') // the name of your adapter
-});
-

asyncstorage-down

-

A leveldown adapter that stores on asyncstorage.

-
// npm install pouchdb-adapter-asyncstorage-down --save
-addPouchPlugin(require('pouchdb-adapter-leveldb')); // leveldown adapters need the leveldb plugin to work
- 
-const asyncstorageDown = require('asyncstorage-down');
- 
-const database = await createRxDatabase({
-    name: 'mydatabase',
-    storage: getRxStoragePouch(asyncstorageDown) // the full leveldown-module
-});
-

Cordova / Phonegap / Capacitor

-

cordova-sqlite

-

Uses cordova's global cordova.sqlitePlugin. It can be used with cordova and capacitor.

-
// npm install pouchdb-adapter-cordova-sqlite --save
-addPouchPlugin(require('pouchdb-adapter-cordova-sqlite'));
- 
-/**
- * In capacitor/cordova you have to wait until all plugins are loaded and 'window.sqlitePlugin'
- * can be accessed.
- * This function waits until document deviceready is called which ensures that everything is loaded.
- * @link https://cordova.apache.org/docs/de/latest/cordova/events/events.deviceready.html
- */
-export function awaitCapacitorDeviceReady(): Promise<void> {
-    return new Promise(res => {
-        document.addEventListener('deviceready', () => {
-            res();
-        });
-    });
-}
- 
-async function getDatabase(){
- 
-    // first wait until the deviceready event is fired
-    await awaitCapacitorDeviceReady();
- 
-    const database = await createRxDatabase({
-        name: 'mydatabase',
-        storage: getRxStoragePouch(
-            'cordova-sqlite',
-            // pouch settings are passed as second parameter
-            {
-                // for ios devices, the cordova-sqlite adapter needs to know where to save the data.
-                iosDatabaseLocation: 'Library'
-            }
-        )
-    });
-}
- - \ No newline at end of file diff --git a/docs/alternatives.html b/docs/alternatives.html deleted file mode 100644 index abccbcb6cc6..00000000000 --- a/docs/alternatives.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - -Alternatives for realtime local-first JavaScript applications and local databases | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Alternatives for realtime offline-first JavaScript applications

-

To give you an augmented view over the topic of client side JavaScript databases, this page contains all known alternatives to RxDB. Remember that you are reading this inside of the RxDB documentation, so everything is opinionated. -If you disagree with anything or think that something is missing, make a pull request to this file on the RxDB github repository.

-
note

RxDB has these main benefits:

    -
  • RxDB is a battle proven tool widely used by companies in real projects in production.
  • -
  • RxDB is not VC funded and therefore does not require you to use a specific cloud service to rip you off. RxDB can be used with your own backend or no backend at all.
  • -
  • RxDB has a working business model of selling premium plugins which ensures that RxDB will be maintained and improved continuously while many alternatives are dead already or seem to die soon.
  • -
  • RxDB has years (since 2016) of performance optimization, bug fixing and feature adding. It is just working as is and there are close to zero open issues.
  • -
JavaScript Database
-
-

Alternatives to RxDB

-

RxDB is an observable, replicating, local first, JavaScript database. So it makes only sense to list similar projects as alternatives, not just any database or JavaScript store library. However, I will list up some projects that RxDB is often compared with, even if it only makes sense for some use cases. -Here are the alternatives to RxDB:

-

Firebase

-

firebase alternative

-

Firebase is a platform developed by Google for creating mobile and web applications. Firebase has many features and products, two of which are client side databases. The Realtime Database and the Cloud Firestore.

-

Firebase - Realtime Database

-

The firebase realtime database was the first database in firestore. It has to be mentioned that in this context, "realtime" means "realtime replication", not "realtime computing". The firebase realtime database stores data as a big unstructured JSON tree that is replicated between clients and the backend.

-

Firebase - Cloud Firestore

-

The firestore is the successor to the realtime database. The big difference is that it behaves more like a 'normal' database that stores data as documents inside of collections. The conflict resolution strategy of firestore is always last-write-wins which might or might not be suitable for your use case.

-

The biggest difference to RxDB is that firebase products are only able to be used on top of the Firebase cloud hosted backend, which creates a vendor lock-in. RxDB can replicate with any self hosted CouchDB server or custom GraphQL endpoints. You can even replicate Firestore to RxDB with the Firestore Replication Plugin.

-

Meteor

-

MeteorJS alternative

-

Meteor (since 2012) is one of the oldest technologies for JavaScript realtime applications. Meteor is not a library but a whole framework with its own package manager, database management and replication. -Because of how it works, it has proven to be hard to integrate it with other modern JavaScript frameworks like angular, vue.js or svelte.

-

Meteor uses MongoDB in the backend and can replicate with a Minimongo database in the frontend. -While testing, it has proven to be impossible to make a meteor app offline first capable. There are some projects that might do this, but all are unmaintained.

-

Minimongo

-

Forked in Jan 2014 from meteorJSs' minimongo package, Minimongo is a client-side, in-memory, JavaScript version of MongoDB with backend replication over HTTP. Similar to MongoDB, it stores data in documents inside of collections and also has the same query syntax. Minimongo has different storage adapters for IndexedDB, WebSQL, LocalStorage and SQLite. -Compared to RxDB, Minimongo has no concept of revisions or conflict handling, which might lead to undefined behavior when used with replication or in multiple browser tabs. Minimongo has no observable queries or changestream.

-

WatermelonDB

-

WatermelonDB alternative

-

WatermelonDB is a reactive & asynchronous JavaScript database. While originally made for React and React Native, it can also be used with other JavaScript frameworks. The main goal of WatermelonDB is performance within an application with lots of data. -In React Native, WatermelonDB uses the provided SQLite database. Also there is an Expo plugin for WatermelonDB. In a browser, WatermelonDB uses the LokiJS in-memory database to store and query data. WatermelonDB is one of the rare projects that support both Flow and Typescript at the same time.

-

AWS Amplify

-

AWS Amplify alternative

-

AWS Amplify is a collection of tools and libraries to develop web- and mobile frontend applications. Similar to firebase, it provides everything needed like authentication, analytics, a REST API, storage and so on. Everything hosted in the AWS Cloud, even when they state that "AWS Amplify is designed to be open and pluggable for any custom backend or service". For realtime replication, AWS Amplify can connect to an AWS App-Sync GraphQL endpoint.

-

AWS Datastore

-

Since December 2019 the Amplify library includes the AWS Datastore which is a document-based, client side database that is able to replicate data via AWS AppSync in the background. -The main difference to other projects is the complex project configuration via the amplify cli and the bit confusing query syntax that works over functions. Complex Queries with multiple OR/AND statements are not possible which might change in the future. -Local development is hard because the AWS AppSync mock does not support realtime replication. It also is not really offline-first because a user login is always required.

-
// An AWS datastore OR query
-const posts = await DataStore.query(Post, c => c.or(
-  c => c.rating("gt", 4).status("eq", PostStatus.PUBLISHED)
-));
- 
-// An AWS datastore SORT query
-const posts = await DataStore.query(Post, Predicates.ALL, {
-  sort: s => s.rating(SortDirection.ASCENDING).title(SortDirection.DESCENDING)
-});
-

The biggest difference to RxDB is that you have to use the AWS cloud backends. This might not be a problem if your data is at AWS anyway.

-

RethinkDB

-

RethinkDB alternative

-

RethinkDB is a backend database that pushed dynamic JSON data to the client in realtime. It was founded in 2009 and the company shut down in 2016. -Rethink db is not a client side database, it streams data from the backend to the client which of course does not work while offline.

-

Horizon

-

Horizon is the client side library for RethinkDB which provides useful functions like authentication, permission management and subscription to a RethinkDB backend. Offline support never made it to horizon.

-

Supabase

-

Supabase alternative

-

Supabase labels itself as "an open source Firebase alternative". It is a collection of open source tools that together mimic many Firebase features, most of them by providing a wrapper around a PostgreSQL database. While it has realtime queries that run over the wire, like with RethinkDB, Supabase has no client-side storage or replication feature and therefore is not offline first.

-

CouchDB

-

CouchDB alternative

-

Apache CouchDB is a server-side, document-oriented database that is mostly known for its multi-master replication feature. Instead of having a master-slave replication, with CouchDB you can run replication in any constellation without having a master server as bottleneck where the server even can go off- and online at any time. This comes with the drawback of having a slow replication with much network overhead. -CouchDB has a changestream and a query syntax similar to MongoDB.

-

PouchDB

-

PouchDB alternative

-

PouchDB is a JavaScript database that is compatible with most of the CouchDB API. It has an adapter system that allows you to switch out the underlying storage layer. There are many adapters like for IndexedDB, SQLite, the Filesystem and so on. The main benefit is to be able to replicate data with any CouchDB compatible endpoint. -Because of the CouchDB compatibility, PouchDB has to do a lot of overhead in handling the revision tree of document, which is why it can show bad performance for bigger datasets. -RxDB was originally build around PouchDB until the storage layer was abstracted out in version 10.0.0 so it now allows to use different RxStorage implementations. PouchDB has some performance issues because of how it has to store the document revision tree to stay compatible with the CouchDB API.

-

Couchbase

-

Couchbase (originally known as Membase) is another NoSQL document database made for realtime applications. -It uses the N1QL query language which is more SQL like compared to other NoSQL query languages. In theory you can achieve replication of a Couchbase with a PouchDB database, but this has shown to be not that easy.

-

Cloudant

-

Cloudant is a cloud-based service that is based on CouchDB and has mostly the same features. -It was originally designed for cloud computing where data can automatically be distributed between servers. But it can also be used to replicate with frontend PouchDB instances to create scalable web applications. -It was bought by IBM in 2014 and since 2018 the Cloudant Shared Plan is retired and migrated to IBM Cloud.

-

Hoodie

-

Hoodie is a backend solution that enables offline-first JavaScript frontend development without having to write backend code. Its main goal is to abstract away configuration into simple calls to the Hoodie API. -It uses CouchDB in the backend and PouchDB in the frontend to enable offline-first capabilities. -The last commit for hoodie was one year ago and the website (hood.ie) is offline which indicates it is not an active project anymore.

-

LokiJS

-

LokiJS is a JavaScript embeddable, in-memory database. And because everything is handled in-memory, LokiJS has awesome performance when mutating or querying data. You can still persist to a permanent storage (IndexedDB, Filesystem etc.) with one of the provided storage adapters. The persistence happens after a timeout is reached after a write, or before the JavaScript process exits. This also means you could loose data when the JavaScript process exits ungracefully like when the power of the device is shut down or the browser crashes. -While the project is not that active anymore, it is more finished than unmaintained.

-

In the past, RxDB supported using LokiJS as RxStorage but because the LokiJS is not maintained anymore and had too many issues, this storage option was removed in RxDB version 16.

-

Gundb

-

GUN is a JavaScript graph database. While having many features, the decentralized replication is the main unique selling point. You can replicate data Peer-to-Peer without any centralized backend server. GUN has several other features that are useful on top of that, like encryption and authentication.

-

While testing it was really hard to get basic things running. GUN is open source, but because of how the source code is written, it is very difficult to understand what is going wrong.

-

sql.js

-

sql.js is a javascript library to run SQLite on the web. It uses a virtual database file stored in memory and does not have any persistence. All data is lost once the JavaScript process exits. sql.js is created by compiling SQLite to WebAssembly so it has about the same features as SQLite. For older browsers there is a JavaScript fallback.

-

absurd-sQL

-

Absurd-sql is a project that implements an IndexedDB-based persistence for sql.js. Instead of directly writing data into the IndexedDB, it treats IndexedDB like a disk and stores data in blocks there which shows to have a much better performance, mostly because of how performance expensive IndexedDB transactions are.

-

NeDB

-

NeDB was a embedded persistent or in-memory database for Node.js, nw.js, Electron and browsers. -It is document-oriented and had the same query syntax as MongoDB. -Like LokiJS it has persistence adapters for IndexedDB etc. to persist the database state on the disc. -The last commit to NeDB was in 2016.

-

Dexie.js

-

Dexie.js is a minimalistic wrapper for IndexedDB. While providing a better API than plain IndexedDB, Dexie also improves performance by batching transactions and other optimizations. It also adds additional non-IndexedDB features like observable queries or multi tab support or react hooks. -Compared to RxDB, Dexie.js does not support complex (MongoDB-like) queries and requires a lot of fiddling when a document range of a specific index must be fetched. -Dexie.js is used by Whatsapp Web, Microsoft To Do and Github Desktop.

-

RxDB supports using Dexie.js as Database storage which enhances IndexedDB via dexie with RxDB features like MongoDB-like queries etc.

-

LowDB

-

LowDB is a small, local JSON database powered by the Lodash library. It is designed to be simple, easy to use, and straightforward. LowDB allows you to perform native JavaScript queries and persist data in a flat JSON file. Written in TypeScript, it's particularly well-suited for small projects, prototyping, or when you need a lightweight, file-based database.

-

As an alternative to LowDB, RxDB offers real-time reactivity, allowing developers to subscribe to database changes, a feature not natively available in LowDB. Additionally, RxDB provides robust query capabilities, including the ability to subscribe to query results for automatic UI updates. These features make RxDB a strong alternative to LowDB for more complex and dynamic applications.

-

localForage

-

localForage is a popular JavaScript library for offline storage that provides a simple, promise-based API. It abstracts over different storage mechanisms such as IndexedDB, WebSQL, or localStorage, making it easier to write code once and have it work seamlessly across various browsers. While localForage is great for storing data locally in a key-value manner, it doesn't provide the real-time reactive queries, conflict handling, or revision-based replication that RxDB does. This makes localForage a useful choice for straightforward caching or persistent storage needs, but not ideal for advanced offline-first scenarios requiring multi-user collaboration or complex querying.

-

MongoDB Realm

-

Originally Realm was a mobile database for Android and iOS. Later they added support for other languages and runtimes, also for JavaScript. -It was meant as replacement for SQLite but is more like an object store than a full SQL database. -In 2019 MongoDB bought Realm and changed the projects focus. -Now Realm is made for replication with the MongoDB Realm Sync based on the MongoDB Atlas Cloud platform. This tight coupling to the MongoDB cloud service is a big downside for most use cases.

-

Apollo

-

The Apollo GraphQL platform is made to transfer data between a server to UI applications over GraphQL endpoints. It contains several tools like GraphQL clients in different languages or libraries to create GraphQL endpoints.

-

While it is has different caching features for offline usage, compared to RxDB it is not fully offline first because caching alone does not mean your application is fully usable when the user is offline.

-

Replicache

-

Replicache is a client-side sync framework for building realtime, collaborative, local-first web apps. It claims to work with most backend stacks. In contrast to other local first tools, replicache does not work like a local database. Instead it runs on so called mutators that unify behavior on the client and server side. So instead of implementing and calling REST routes on both sides of your stack, you will implement mutators that define a specific delta behavior based on the input data. To observe data in replicache, there are subscriptions that notify your frontend application about changes to the state. -Replicache can be used in most frontend technologies like browsers, React/Remix, NextJS/Vercel and React Native. While Replicache can be installed and used from npm, the Replicache source code is not open source and the Replicache github repo does not allow you to inspect or debug it. Still you can use replicache for in non-commercial projects, or for companies with < $200k revenue (ARR) and < $500k in funding. (2024: Replicache will be free and Rocicorp are working on a new Zerosync product to succeed Replicache and Reflect.)

-

InstantDB

-

InstantDB is designed for real-time data synchronization with built-in offline support, allowing changes to be queued locally and synced when the user reconnects. While it offers seamless optimistic updates and rollback capabilities, its offline-first design is not as mature or comprehensive as RxDB's - the offline data is more of a cache, not a full-database sync. The query language used is Datalog, and the backend sync service is written in Clojure. InstantDB is focused more on simplicity and real-time collaboration, with fewer customization options for storage or conflict resolution compared to RxDB, which supports various storage adapters and advanced conflict handling via CRDTs.

-

Yjs

-

Yjs is a CRDT-based (Conflict-free Replicated Data Type) library focused on enabling real-time collaboration - particularly for text editing, although it can handle other data types as well. While it provides powerful conflict resolution and peer-to-peer synchronization out of the box, Yjs itself is not a full-fledged database. Instead, you typically combine Yjs with other storage or networking layers to achieve a local-first architecture. This flexibility allows for sophisticated real-time features, but also means you must handle indexing, queries, and persistence on your own if you need them. Compared to RxDB, Yjs does not offer built-in replication adapters or a query system, so developers who require a more complete solution for conflict resolution, data persistence, and offline-first capabilities may find RxDB more convenient.

-

ElectricSQL

-

2024: ElectricSQL is being rewritten in a new Electric-Next branch, which focuses on partial syncing of ("shapes", which makes is basically a NoSQL like document database) of data from a remote Postgres DB to a local clients written in TypeScript/JS or Elixir. The write path is not yet implemented, neither is client-side reactivity. The ElectricSQL backend is written in Elixir.

-

SignalDB

-

SignalDB provides a reactive, in-memory local-lirst JavaScript database with real-time sync, bit it doesn't offer the same level of multi-client replication or flexibility with storage backends that RxDB provides, and through a RxDB persistence adapters you can actually use SignalDB for the front-end reactivity while relying on RxDB for backend sync and persistence.

-

PowerSync

-

PowerSync is a "framework" for implementing local-first solutions. It centralizes business logic and conflict resolution on a central, authoritative server (PostgreSQL or MongoDB), vs RxDB that also supports custom backends. Both RxDB and PowerSync can be used with a variety of storage backends, but PowerSync uses SQLite as the front-end database which has shown to be slow because the WASM-SQLite abstraction increases read and write latency. In terms of client SDKs, PowerSync offers Flutter, Kotlin, and Swift in addition to JS/TypeScript. PowerSync offers man client technologies, PowerSync is under a license that restricts commercial use that competes with PowerSync and the JourneyApps Platform.

-

Read further

-
- - \ No newline at end of file diff --git a/docs/alternatives.md b/docs/alternatives.md deleted file mode 100644 index 10c6c4b32e8..00000000000 --- a/docs/alternatives.md +++ /dev/null @@ -1,236 +0,0 @@ -# Alternatives for realtime local-first JavaScript applications and local databases - -> Explore real-time, local-first JS alternatives to RxDB. Compare Firebase, Meteor, AWS, CouchDB, and more for robust, seamless web/mobile app development. - -# Alternatives for realtime offline-first JavaScript applications - -To give you an augmented view over the topic of client side JavaScript databases, this page contains all known alternatives to **RxDB**. Remember that you are reading this inside of the RxDB documentation, so everything is **opinionated**. -If you disagree with anything or think that something is missing, make a pull request to this file on the RxDB github repository. - -:::note -RxDB has these main benefits: - -- RxDB is a battle proven tool [widely used](/#reviews) by companies in real projects in production. -- RxDB is not VC funded and therefore does not require you to use a specific cloud service to rip you off. RxDB can be used with your [own backend](./replication-http.md) or no backend at all. -- RxDB has a working business model of selling [premium plugins](/premium/) which ensures that RxDB will be maintained and improved continuously while many alternatives are dead already or seem to die soon. -- RxDB has years (since 2016) of performance optimization, bug fixing and feature adding. It is just working as is and there are close to zero [open issues](https://github.com/pubkey/rxdb/issues). - -
- - - -
- -::: - --------------------------------------------------------------------------------- - - - -## Alternatives to RxDB - -[RxDB](https://rxdb.info) is an **observable**, **replicating**, **[local first](./offline-first.md)**, **JavaScript** database. So it makes only sense to list similar projects as alternatives, not just any database or JavaScript store library. However, I will list up some projects that RxDB is often compared with, even if it only makes sense for some use cases. -Here are the alternatives to RxDB: - -### Firebase - - - -Firebase is a **platform** developed by Google for creating mobile and web applications. Firebase has many features and products, two of which are client side databases. The [Realtime Database](./articles/firebase-realtime-database-alternative.md) and the [Cloud Firestore](./articles/firestore-alternative.md). - -#### Firebase - Realtime Database - -The firebase realtime database was the first database in firestore. It has to be mentioned that in this context, "realtime" means **"realtime replication"**, not "realtime computing". The firebase realtime database stores data as a big unstructured JSON tree that is replicated between clients and the backend. - -#### Firebase - Cloud Firestore - -The firestore is the successor to the realtime database. The big difference is that it behaves more like a 'normal' database that stores data as documents inside of collections. The conflict resolution strategy of firestore is always *last-write-wins* which might or might not be suitable for your use case. - -The biggest difference to RxDB is that firebase products are only able to be used on top of the Firebase cloud hosted backend, which creates a vendor lock-in. RxDB can replicate with any self hosted CouchDB server or custom GraphQL endpoints. You can even replicate Firestore to RxDB with the [Firestore Replication Plugin](./replication-firestore.md). - -### Meteor - - - -Meteor (since 2012) is one of the oldest technologies for JavaScript realtime applications. Meteor is not a library but a whole framework with its own package manager, database management and replication. -Because of how it works, it has proven to be hard to integrate it with other modern JavaScript frameworks like [angular](https://github.com/urigo/angular-meteor), [vue.js](./articles//vue-database.md) or svelte. - -Meteor uses MongoDB in the backend and can replicate with a Minimongo database in the frontend. -While testing, it has proven to be impossible to make a meteor app **offline first** capable. There are [some projects](https://github.com/frozeman/meteor-persistent-minimongo2) that might do this, but all are unmaintained. - -### Minimongo - -Forked in Jan 2014 from meteorJSs' minimongo package, Minimongo is a client-side, in-memory, JavaScript version of MongoDB with backend replication over HTTP. Similar to MongoDB, it stores data in documents inside of collections and also has the same query syntax. Minimongo has different storage adapters for IndexedDB, WebSQL, [LocalStorage](./articles/localstorage.md) and SQLite. -Compared to RxDB, Minimongo has no concept of revisions or conflict handling, which might lead to undefined behavior when used with replication or in multiple browser tabs. Minimongo has no observable queries or changestream. - -### WatermelonDB - - - -WatermelonDB is a reactive & asynchronous JavaScript database. While originally made for [React](./articles/react-database.md) and [React Native](./react-native-database.md), it can also be used with other JavaScript frameworks. The main goal of WatermelonDB is **performance** within an application with lots of data. -In React Native, WatermelonDB uses the provided SQLite database. Also there is an Expo plugin for WatermelonDB. In a browser, WatermelonDB uses the LokiJS in-memory database to store and query data. WatermelonDB is one of the rare projects that support both Flow and Typescript at the same time. - -### AWS Amplify - - - -AWS Amplify is a collection of tools and libraries to develop web- and mobile frontend applications. Similar to firebase, it provides everything needed like authentication, analytics, a REST API, storage and so on. Everything hosted in the AWS Cloud, even when they state that *"AWS Amplify is designed to be open and pluggable for any custom backend or service"*. For realtime replication, AWS Amplify can connect to an AWS App-Sync GraphQL endpoint. - -### AWS Datastore - -Since December 2019 the Amplify library includes the AWS Datastore which is a document-based, client side database that is able to replicate data via AWS AppSync in the background. -The main difference to other projects is the complex project configuration via the amplify cli and the bit confusing query syntax that works over functions. Complex Queries with multiple `OR/AND` statements are not possible which might change in the future. -Local development is hard because the AWS AppSync mock does not support realtime replication. It also is not really offline-first because a user login is always required. - -```ts -// An AWS datastore OR query -const posts = await DataStore.query(Post, c => c.or( - c => c.rating("gt", 4).status("eq", PostStatus.PUBLISHED) -)); - -// An AWS datastore SORT query -const posts = await DataStore.query(Post, Predicates.ALL, { - sort: s => s.rating(SortDirection.ASCENDING).title(SortDirection.DESCENDING) -}); -``` - -The biggest difference to RxDB is that you have to use the AWS cloud backends. This might not be a problem if your data is at AWS anyway. - -### RethinkDB - - - -RethinkDB is a backend database that pushed dynamic JSON data to the client in realtime. It was founded in 2009 and the company shut down in 2016. -Rethink db is not a client side database, it streams data from the backend to the client which of course does not work while offline. - -### Horizon - -Horizon is the client side library for RethinkDB which provides useful functions like authentication, permission management and subscription to a RethinkDB backend. Offline support [never made](https://github.com/rethinkdb/horizon/issues/58) it to horizon. - -### Supabase - - - -Supabase labels itself as "*an open source Firebase alternative*". It is a collection of open source tools that together mimic many Firebase features, most of them by providing a wrapper around a PostgreSQL database. While it has realtime queries that run over the wire, like with RethinkDB, Supabase has no client-side storage or replication feature and therefore is not offline first. - -### CouchDB - - - -Apache CouchDB is a server-side, document-oriented database that is mostly known for its multi-master replication feature. Instead of having a master-slave replication, with CouchDB you can run replication in any constellation without having a master server as bottleneck where the server even can go off- and online at any time. This comes with the drawback of having a slow replication with much network overhead. -CouchDB has a changestream and a query syntax similar to MongoDB. - -### PouchDB - - - -PouchDB is a JavaScript database that is compatible with most of the CouchDB API. It has an adapter system that allows you to switch out the underlying storage layer. There are many adapters like for [IndexedDB](./rx-storage-indexeddb.md), [SQLite](./rx-storage-sqlite.md), the Filesystem and so on. The main benefit is to be able to replicate data with any CouchDB compatible endpoint. -Because of the CouchDB compatibility, PouchDB has to do a lot of overhead in handling the revision tree of document, which is why it can show bad performance for bigger datasets. -RxDB was originally build around PouchDB until the storage layer was abstracted out in version [10.0.0](./releases/10.0.0.md) so it now allows to use different `RxStorage` implementations. PouchDB has some performance issues because of how it has to store the document revision tree to stay compatible with the CouchDB API. - -### Couchbase - -Couchbase (originally known as Membase) is another NoSQL document database made for realtime applications. -It uses the N1QL query language which is more SQL like compared to other NoSQL query languages. In theory you can achieve replication of a Couchbase with a PouchDB database, but this has shown to be not [that easy](https://github.com/pouchdb/pouchdb/issues/7793#issuecomment-501624297). - -### Cloudant - -Cloudant is a cloud-based service that is based on [CouchDB](./replication-couchdb.md) and has mostly the same features. -It was originally designed for cloud computing where data can automatically be distributed between servers. But it can also be used to replicate with frontend PouchDB instances to create scalable web applications. -It was bought by IBM in 2014 and since 2018 the Cloudant Shared Plan is retired and migrated to IBM Cloud. - -### Hoodie - -Hoodie is a backend solution that enables offline-first JavaScript frontend development without having to write backend code. Its main goal is to abstract away configuration into simple calls to the Hoodie API. -It uses CouchDB in the backend and PouchDB in the frontend to enable offline-first capabilities. -The last commit for hoodie was one year ago and the website (hood.ie) is offline which indicates it is not an active project anymore. - -### LokiJS - -LokiJS is a JavaScript embeddable, in-memory database. And because everything is handled in-memory, LokiJS has awesome performance when mutating or querying data. You can still persist to a permanent storage (IndexedDB, Filesystem etc.) with one of the provided storage adapters. The persistence happens after a timeout is reached after a write, or before the JavaScript process exits. This also means you could loose data when the JavaScript process exits ungracefully like when the power of the device is shut down or the browser crashes. -While the project is not that active anymore, it is more *finished* than *unmaintained*. - -In the past, RxDB supported using [LokiJS as RxStorage](./rx-storage-lokijs.md) but because the LokiJS is not maintained anymore and had too many issues, this storage option was removed in RxDB version 16. - -### Gundb - -GUN is a JavaScript graph database. While having many features, the **decentralized** replication is the main unique selling point. You can replicate data Peer-to-Peer without any centralized backend server. GUN has several other features that are useful on top of that, like encryption and authentication. - -While testing it was really hard to get basic things running. GUN is open source, but because of how the source code [is written](https://github.com/amark/gun/blob/master/src/put.js), it is very difficult to understand what is going wrong. - -### sql.js - -sql.js is a javascript library to run SQLite on the web. It uses a virtual database file stored in memory and does not have any persistence. All data is lost once the JavaScript process exits. sql.js is created by compiling SQLite to WebAssembly so it has about the same features as SQLite. For older browsers there is a JavaScript fallback. - -### absurd-sQL - -Absurd-sql is a project that implements an IndexedDB-based persistence for sql.js. Instead of directly writing data into the IndexedDB, it treats IndexedDB like a disk and stores data in blocks there which shows to have a much better performance, mostly because of how [performance expensive](./slow-indexeddb.md) IndexedDB transactions are. - -### NeDB - -NeDB was a embedded persistent or in-memory database for Node.js, nw.js, [Electron](./electron-database.md) and browsers. -It is document-oriented and had the same query syntax as MongoDB. -Like LokiJS it has persistence adapters for IndexedDB etc. to persist the database state on the disc. -The last commit to NeDB was in **2016**. - -### Dexie.js - -Dexie.js is a minimalistic wrapper for IndexedDB. While providing a better API than plain IndexedDB, Dexie also improves performance by batching transactions and other optimizations. It also adds additional non-IndexedDB features like observable queries or multi tab support or react hooks. -Compared to RxDB, Dexie.js does not support complex (MongoDB-like) queries and requires a lot of fiddling when a document range of a specific index must be fetched. -Dexie.js is used by Whatsapp Web, Microsoft To Do and Github Desktop. - -RxDB supports using [Dexie.js as Database storage](./rx-storage-dexie.md) which enhances IndexedDB via dexie with RxDB features like MongoDB-like queries etc. - -### LowDB - -LowDB is a small, local JSON database powered by the Lodash library. It is designed to be simple, easy to use, and straightforward. LowDB allows you to perform native JavaScript queries and persist data in a flat JSON file. Written in TypeScript, it's particularly well-suited for small projects, prototyping, or when you need a lightweight, file-based database. - -As an alternative to LowDB, [RxDB](./) offers real-time reactivity, allowing developers to subscribe to database changes, a feature not natively available in LowDB. Additionally, RxDB provides robust [query capabilities](./rx-query.md), including the ability to subscribe to query results for automatic UI updates. These features make RxDB a strong alternative to LowDB for more complex and dynamic applications. - -### localForage -localForage is a popular JavaScript library for offline storage that provides a simple, promise-based API. It abstracts over different storage mechanisms such as [IndexedDB](./rx-storage-indexeddb.md), WebSQL, or [localStorage](./articles/localstorage.md), making it easier to write code once and have it work seamlessly across various browsers. While localForage is great for storing data locally in a key-value manner, it doesn't provide the real-time reactive queries, [conflict handling](./transactions-conflicts-revisions.md), or revision-based replication that RxDB does. This makes localForage a useful choice for straightforward caching or persistent storage needs, but not ideal for advanced offline-first scenarios requiring multi-user collaboration or complex querying. - -### MongoDB Realm - -Originally Realm was a mobile database for Android and iOS. Later they added support for other languages and runtimes, also for JavaScript. -It was meant as replacement for SQLite but is more like an object store than a full SQL database. -In 2019 MongoDB bought Realm and changed the projects focus. -Now Realm is made for replication with the MongoDB Realm Sync based on the MongoDB Atlas Cloud platform. This tight coupling to the MongoDB cloud service is a big downside for most use cases. - -### Apollo - -The Apollo GraphQL platform is made to transfer data between a server to UI applications over GraphQL endpoints. It contains several tools like GraphQL clients in different languages or libraries to create GraphQL endpoints. - -While it is has different caching features for offline usage, compared to RxDB it is not fully offline first because caching alone does not mean your application is fully usable when the user is offline. - -### Replicache - -Replicache is a client-side sync framework for building realtime, collaborative, [local-first](./articles/local-first-future.md) web apps. It claims to work with most backend stacks. In contrast to other local first tools, replicache does not work like a local database. Instead it runs on so called `mutators` that unify behavior on the client and server side. So instead of implementing and calling REST routes on both sides of your stack, you will implement mutators that define a specific delta behavior based on the input data. To observe data in replicache, there are `subscriptions` that notify your frontend application about changes to the state. -Replicache can be used in most frontend technologies like browsers, React/Remix, NextJS/Vercel and React Native. While Replicache can be installed and used from npm, the Replicache source code is not open source and the Replicache github repo does not allow you to inspect or debug it. Still you can use replicache for in non-commercial projects, or for companies with < $200k revenue (ARR) and < $500k in funding. (2024: Replicache will be free and Rocicorp are working on a new Zerosync product to succeed Replicache and Reflect.) - -### InstantDB - -InstantDB is designed for real-time data synchronization with built-in offline support, allowing changes to be queued locally and [synced](./replication.md) when the user reconnects. While it offers seamless [optimistic updates](./articles/optimistic-ui.md) and rollback capabilities, its offline-first design is not as mature or comprehensive as RxDB's - the [offline data](./articles//offline-database.md) is more of a cache, not a full-database sync. The query language used is Datalog, and the backend sync service is written in Clojure. InstantDB is focused more on simplicity and real-time collaboration, with fewer customization options for storage or conflict resolution compared to RxDB, which supports various storage adapters and advanced conflict handling via CRDTs. - -### Yjs - -Yjs is a [CRDT-based](./crdt.md) (Conflict-free Replicated Data Type) library focused on enabling real-time collaboration - particularly for text editing, although it can handle other data types as well. While it provides powerful conflict resolution and peer-to-peer synchronization out of the box, Yjs itself is not a full-fledged database. Instead, you typically combine Yjs with other storage or networking layers to achieve a [local-first architecture](./offline-first.md). This flexibility allows for sophisticated [real-time](./articles/realtime-database.md) features, but also means you must handle indexing, queries, and persistence on your own if you need them. Compared to RxDB, Yjs does not offer built-in replication adapters or a query system, so developers who require a more complete solution for conflict resolution, data persistence, and offline-first capabilities may find RxDB more convenient. - -### ElectricSQL - -2024: ElectricSQL is being rewritten in a new Electric-Next branch, which focuses on partial syncing of ("shapes", which makes is basically a NoSQL like document database) of data from a remote Postgres DB to a local clients written in TypeScript/JS or Elixir. The write path is not yet implemented, neither is client-side reactivity. The ElectricSQL backend is written in Elixir. - -### SignalDB - -SignalDB provides a reactive, in-memory local-lirst JavaScript database with real-time sync, bit it doesn't offer the same level of multi-client replication or flexibility with storage backends that RxDB provides, and through a RxDB persistence adapters you can actually use SignalDB for the front-end reactivity while relying on RxDB for backend sync and persistence. - -### PowerSync - -PowerSync is a "framework" for implementing local-first solutions. It centralizes business logic and conflict resolution on a central, authoritative server (PostgreSQL or MongoDB), vs RxDB that also supports custom backends. Both RxDB and PowerSync can be used with a variety of storage backends, but PowerSync uses SQLite as the front-end database which has shown to be slow because the WASM-SQLite abstraction increases read and write latency. In terms of client SDKs, PowerSync offers Flutter, Kotlin, and Swift in addition to JS/TypeScript. PowerSync offers man client technologies, PowerSync is under a license that restricts commercial use that competes with PowerSync and the JourneyApps Platform. - -# Read further - -- [Offline First Database Comparison](https://github.com/pubkey/client-side-databases) diff --git a/docs/articles/angular-database.html b/docs/articles/angular-database.html deleted file mode 100644 index 7d9b43694ef..00000000000 --- a/docs/articles/angular-database.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - -RxDB as a Database in an Angular Application | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RxDB as a Database in an Angular Application

-

In modern web development, Angular has emerged as a popular framework for building robust and scalable applications. As Angular applications often require persistent storage and efficient data handling, choosing the right database solution is crucial. One such solution is RxDB, a reactive JavaScript database for the browser, node.js, and mobile devices. In this article, we will explore the integration of RxDB into an Angular application and examine its various features and techniques.

-
JavaScript Angular Database
-

Angular Web Applications

-

Angular is a powerful JavaScript framework developed and maintained by Google. It enables developers to build single-page applications (SPAs) with a modular and component-based approach. Angular provides a comprehensive set of tools and features for creating dynamic and responsive web applications.

-

Importance of Databases in Angular Applications

-

Databases play a vital role in Angular applications by providing a structured and efficient way to store, retrieve, and manage data. Whether it's handling user authentication, caching data, or persisting application state, a robust database solution is essential for ensuring optimal performance and user experience.

-

Introducing RxDB as a Database Solution

-

RxDB stands for Reactive Database and is built on the principles of reactive programming. It combines the best features of NoSQL databases with the power of reactive programming to provide a scalable and efficient database solution. RxDB offers seamless integration with Angular applications and brings several unique features that make it an attractive choice for developers.

-
This solved a problem I've had in Angular for years
3:45
This solved a problem I've had in Angular for years
-

Getting Started with RxDB

-

To begin our journey with RxDB, let's understand its key concepts and features.

-

What is RxDB?

-

RxDB is a client-side database that follows the principles of reactive programming. It is built on top of IndexedDB, the native browser database, and leverages the RxJS library for reactive data handling. RxDB provides a simple and intuitive API for managing data and offers features like data replication, multi-tab support, and efficient query handling.

-
JavaScript Angular Database
-

Reactive Data Handling

-

At the core of RxDB is the concept of reactive data handling. RxDB leverages observables and reactive streams to enable real-time updates and data synchronization. With RxDB, you can easily subscribe to data changes and react to them in a reactive and efficient manner.

-

realtime ui updates

-

Offline-First Approach

-

One of the standout features of RxDB is its offline-first approach. It allows you to build applications that can work seamlessly in offline scenarios. RxDB stores data locally and automatically synchronizes changes with the server when the network becomes available. This capability is particularly useful for applications that need to function in low-connectivity or unreliable network environments.

-

Data Replication

-

RxDB provides built-in support for data replication between clients and servers. This means you can synchronize data across multiple devices or instances of your application effortlessly. RxDB handles conflict resolution and ensures that data remains consistent across all connected clients.

-

Observable Queries

-

RxDB offers a powerful querying mechanism with support for observable queries. This allows you to create dynamic queries that automatically update when the underlying data changes. By leveraging RxDB's observable queries, you can build reactive UI components that respond to data changes in real-time.

-

Multi-Tab Support

-

RxDB provides out-of-the-box support for multi-tab scenarios. This means that if your Angular application is running in multiple browser tabs, RxDB automatically keeps the data in sync across all tabs. It ensures that changes made in one tab are immediately reflected in others, providing a seamless user experience.

-

multi tab support

-

RxDB vs. Other Angular Database Options

-

While there are other database options available for Angular applications, RxDB stands out with its reactive programming model, offline-first approach, and built-in synchronization capabilities. Unlike traditional SQL databases, RxDB's NoSQL-like structure and observables-based API make it well-suited for real-time applications and complex data scenarios.

-

Using RxDB in an Angular Application

-

Now that we have a good understanding of RxDB and its features, let's explore how to integrate it into an Angular application.

-

Installing RxDB in an Angular App

-

To use RxDB in an Angular application, we first need to install the necessary dependencies. You can install RxDB using npm or yarn by running the following command:

-
npm install rxdb --save
-

Once installed, you can import RxDB into your Angular application and start using its API to create and manage databases.

-

Patch Change Detection with zone.js

-

Angular uses change detection to detect and update UI elements when data changes. However, RxDB's data handling is based on observables, which can sometimes bypass Angular's change detection mechanism. To ensure that changes made in RxDB are detected by Angular, we need to patch the change detection mechanism using zone.js. Zone.js is a library that intercepts and tracks asynchronous operations, including observables. By patching zone.js, we can make sure that Angular is aware of changes happening in RxDB.

-
warning

RxDB creates rxjs observables outside of angulars zone -So you have to import the rxjs patch to ensure the angular change detection works correctly. -link

//> app.component.ts
-import 'zone.js/plugins/zone-patch-rxjs';
-

Use the Angular async pipe to observe an RxDB Query

-

Angular provides the async pipe, which is a convenient way to subscribe to observables and handle the subscription lifecycle automatically. When working with RxDB, you can use the async pipe to observe an RxDB query and bind the results directly to your Angular template. This ensures that the UI stays in sync with the data changes emitted by the RxDB query.

-
    constructor(
-        private dbService: DatabaseService,
-        private dialog: MatDialog
-    ) {
-        this.heroes$ = this.dbService
-            .db.hero                // collection
-            .find({                 // query
-                selector: {},
-                sort: [{ name: 'asc' }]
-            })
-            .$;
-    }
-
<ul *ngFor="let hero of heroes$ | async as heroes;">
-  <li>{{hero.name}}</li>
-</ul>
-

Different RxStorage layers for RxDB

-

RxDB supports multiple storage layers for persisting data. Some of the available storage options include:

-
    -
  • LocalStorage RxStorage: Uses the LocalStorage API without any third party plugins.
  • -
  • IndexedDB RxStorage: RxDB directly supports IndexedDB as a storage layer. IndexedDB is a low-level browser database that offers good performance and reliability.
  • -
  • OPFS RxStorage: The OPFS RxStorage for RxDB is built on top of the File System Access API which is available in all modern browsers. It provides an API to access a sandboxed private file system to persistently store and retrieve data. -Compared to other persistent storage options in the browser (like IndexedDB), the OPFS API has a way better performance.
  • -
  • Memory RxStorage: In addition to persistent storage options, RxDB also provides a memory-based storage layer. This is useful for testing or scenarios where you don't need long-term data persistence. -You can choose the storage layer that best suits your application's requirements and configure RxDB accordingly.
  • -
-

Synchronizing Data with RxDB between Clients and Servers

-

Data replication between an Angular application and a server is a common requirement. RxDB simplifies this process and provides built-in support for data synchronization. Let's explore how to replicate data between an Angular application and a server using RxDB.

-

database replication

-

Offline-First Approach

-

One of the key strengths of RxDB is its offline-first approach. It allows Angular applications to function seamlessly even in offline scenarios. RxDB stores data locally and automatically synchronizes changes with the server when the network becomes available. This capability is particularly useful for applications that need to operate in low-connectivity or unreliable network environments.

-

Conflict Resolution

-

In a distributed system, conflicts can arise when multiple clients modify the same data simultaneously. RxDB offers conflict resolution mechanisms to handle such scenarios. You can define conflict resolution strategies based on your application's requirements. RxDB provides hooks and events to detect conflicts and resolve them in a consistent manner.

-

Bidirectional Synchronization

-

RxDB supports bidirectional data synchronization, allowing updates from both the client and server to be replicated seamlessly. This ensures that data remains consistent across all connected clients and the server. RxDB handles conflicts and resolves them based on the defined conflict resolution strategies.

-

Real-Time Updates

-

RxDB provides real-time updates by leveraging reactive programming principles. Changes made to the data are automatically propagated to all connected clients in real-time. Angular applications can subscribe to these updates and update the user interface accordingly. This real-time capability enables collaborative features and enhances the overall user experience.

-

Advanced RxDB Features and Techniques

-

RxDB offers several advanced features and techniques that can further enhance your Angular application.

-

Indexing and Performance Optimization

-

To improve query performance, RxDB allows you to define indexes on specific fields of your documents. Indexing enables faster data retrieval and query execution, especially when working with large datasets. By strategically creating indexes, you can optimize the performance of your Angular application.

-

Encryption of Local Data

-

RxDB provides built-in support for encrypting local data using the Web Crypto API. With encryption, you can protect sensitive data stored in the client-side database. RxDB transparently encrypts the data, ensuring that it remains secure even if the underlying storage is compromised.

-

Change Streams and Event Handling

-

RxDB exposes change streams, which allow you to listen for data changes at a database or collection level. By subscribing to change streams, you can react to data modifications and perform specific actions, such as updating the UI or triggering notifications. Change streams enable real-time event handling in your Angular application.

-

JSON Key Compression

-

To reduce the storage footprint and improve performance, RxDB supports JSON key compression. With key compression, RxDB replaces long keys with shorter aliases, reducing the overall storage size. This optimization is particularly useful when working with large datasets or frequently updating data.

-

Best Practices for Using RxDB in Angular Applications

-

To make the most of RxDB in your Angular application, consider the following best practices:

-

Use Async Pipe for Subscriptions so you do not have to unsubscribe

-

Angular's async pipe is a powerful tool for handling observables in templates. By using the async pipe, you can avoid the need to manually subscribe and unsubscribe from RxDB observables. Angular takes care of the subscription lifecycle, ensuring that resources are released when they are no longer needed. Instead of manually subscribing to Observables, you should always prefer the async pipe.

-
// WRONG:
-let amount;
-this.dbService
-            .db.hero
-            .find({
-                selector: {},
-                sort: [{ name: 'asc' }]
-            })
-            .$.subscribe(docs => {
-                amount = 0;
-                docs.forEach(d => amount = d.points);
-            });
- 
-// RIGHT:
-this.amount$ = this.dbService
-            .db.hero
-            .find({
-                selector: {},
-                sort: [{ name: 'asc' }]
-            })
-            .$.pipe(
-                map(docs => {
-                    let amount = 0;
-                    docs.forEach(d => amount = d.points);
-                    return amount;
-                })
-            );
-

Use custom reactivity to have signals instead of rxjs observables

-

RxDB supports adding custom reactivity factories that allow you to get angular signals out of the database instead of rxjs observables. read more.

-

Use Angular Services for Database creation

-

To ensure proper separation of concerns and maintain a clean codebase, it is recommended to create an Angular service responsible for managing the RxDB database instance. This service can handle database creation, initialization, and provide methods for interacting with the database throughout your application.

-

Efficient Data Handling

-

RxDB provides various mechanisms for efficient data handling, such as batching updates, debouncing, and throttling. Leveraging these techniques can help optimize performance and reduce unnecessary UI updates. Consider the specific data handling requirements of your application and choose the appropriate strategies provided by RxDB.

-

Data Synchronization Strategies

-

When working with data synchronization between clients and servers, it's important to consider strategies for conflict resolution and handling network failures. RxDB provides plugins and hooks that allow you to customize the replication behavior and implement specific synchronization strategies tailored to your application's needs.

-

Conclusion

-

RxDB is a powerful database solution for Angular applications, offering reactive data handling, offline-first capabilities, and seamless data synchronization. By integrating RxDB into your Angular application, you can build responsive and scalable web applications that provide a rich user experience. Whether you're building real-time collaborative apps, progressive web applications, or offline-capable applications, RxDB's features and techniques make it a valuable addition to your Angular development toolkit.

-

Follow Up

-

To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources:

-
    -
  • RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.
  • -
  • RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects.
  • -
  • RxDB Angular Example at GitHub
  • -
- - \ No newline at end of file diff --git a/docs/articles/angular-database.md b/docs/articles/angular-database.md deleted file mode 100644 index 2e0c47410ae..00000000000 --- a/docs/articles/angular-database.md +++ /dev/null @@ -1,214 +0,0 @@ -# RxDB as a Database in an Angular Application - -> Level up your Angular projects with RxDB. Build real-time, resilient, and responsive apps powered by a reactive NoSQL database right in the browser. - -import {VideoBox} from '@site/src/components/video-box'; - -# RxDB as a Database in an Angular Application - -In modern web development, Angular has emerged as a popular framework for building robust and scalable applications. As Angular applications often require persistent [storage](./browser-storage.md) and efficient data handling, choosing the right database solution is crucial. One such solution is [RxDB](https://rxdb.info/), a reactive JavaScript database for the browser, node.js, and [mobile devices](./mobile-database.md). In this article, we will explore the integration of RxDB into an Angular application and examine its various features and techniques. - -
- - - -
- -## Angular Web Applications -Angular is a powerful JavaScript framework developed and maintained by Google. It enables developers to build single-page applications (SPAs) with a modular and component-based approach. Angular provides a comprehensive set of tools and features for creating dynamic and responsive web applications. - -## Importance of Databases in Angular Applications -Databases play a vital role in Angular applications by providing a structured and efficient way to store, retrieve, and manage data. Whether it's handling user authentication, caching data, or persisting application state, a robust database solution is essential for ensuring optimal performance and user experience. - -## Introducing RxDB as a Database Solution -RxDB stands for Reactive Database and is built on the principles of reactive programming. It combines the best features of [NoSQL databases](./in-memory-nosql-database.md) with the power of reactive programming to provide a scalable and efficient database solution. RxDB offers seamless integration with Angular applications and brings several unique features that make it an attractive choice for developers. - -
- -
- -## Getting Started with RxDB -To begin our journey with RxDB, let's understand its key concepts and features. - -### What is RxDB? -[RxDB](https://rxdb.info/) is a client-side database that follows the principles of reactive programming. It is built on top of IndexedDB, the [native browser database](./browser-database.md), and leverages the RxJS library for reactive data handling. RxDB provides a simple and intuitive API for managing data and offers features like data replication, multi-tab support, and efficient query handling. - -
- - - -
- -### Reactive Data Handling -At the core of RxDB is the concept of reactive data handling. RxDB leverages observables and reactive streams to enable real-time updates and data synchronization. With RxDB, you can easily subscribe to data changes and react to them in a reactive and efficient manner. - - - -### Offline-First Approach -One of the standout features of RxDB is its offline-first approach. It allows you to build applications that can work seamlessly in offline scenarios. RxDB stores data locally and automatically synchronizes changes with the server when the network becomes available. This capability is particularly useful for applications that need to function in low-connectivity or unreliable network environments. - -### Data Replication -RxDB provides built-in support for data replication between clients and servers. This means you can synchronize data across multiple devices or instances of your application effortlessly. RxDB handles conflict resolution and ensures that data remains consistent across all connected clients. - -### Observable Queries -RxDB offers a powerful querying mechanism with support for observable queries. This allows you to create dynamic queries that automatically update when the underlying data changes. By leveraging RxDB's observable queries, you can build reactive UI components that respond to data changes in real-time. - -### Multi-Tab Support -RxDB provides out-of-the-box support for multi-tab scenarios. This means that if your Angular application is running in multiple browser tabs, RxDB automatically keeps the data in sync across all tabs. It ensures that changes made in one tab are immediately reflected in others, providing a seamless user experience. - - - -### RxDB vs. Other Angular Database Options -While there are other database options available for Angular applications, RxDB stands out with its reactive programming model, offline-first approach, and built-in synchronization capabilities. Unlike traditional SQL databases, RxDB's NoSQL-like structure and observables-based API make it well-suited for real-time applications and complex data scenarios. - -## Using RxDB in an Angular Application -Now that we have a good understanding of RxDB and its features, let's explore how to integrate it into an Angular application. - -### Installing RxDB in an Angular App -To use RxDB in an Angular application, we first need to install the necessary dependencies. You can install RxDB using npm or yarn by running the following command: - -```bash -npm install rxdb --save -``` -Once installed, you can import RxDB into your Angular application and start using its API to create and manage databases. - -### Patch Change Detection with zone.js -Angular uses change detection to detect and update UI elements when data changes. However, RxDB's data handling is based on observables, which can sometimes bypass Angular's change detection mechanism. To ensure that changes made in RxDB are detected by Angular, we need to patch the change detection mechanism using zone.js. Zone.js is a library that intercepts and tracks asynchronous operations, including observables. By patching zone.js, we can make sure that Angular is aware of changes happening in RxDB. - -:::warning - -RxDB creates rxjs observables outside of angulars zone -So you have to import the rxjs patch to ensure the [angular change detection](https://angular.io/guide/change-detection) works correctly. -[link](https://www.bennadel.com/blog/3448-binding-rxjs-observable-sources-outside-of-the-ngzone-in-angular-6-0-2.htm) - -```ts -//> app.component.ts -import 'zone.js/plugins/zone-patch-rxjs'; -``` -::: - -### Use the Angular async pipe to observe an RxDB Query -Angular provides the async pipe, which is a convenient way to subscribe to observables and handle the subscription lifecycle automatically. When working with RxDB, you can use the async pipe to observe an RxDB query and bind the results directly to your Angular template. This ensures that the UI stays in sync with the data changes emitted by the RxDB query. - -```ts - constructor( - private dbService: DatabaseService, - private dialog: MatDialog - ) { - this.heroes$ = this.dbService - .db.hero // collection - .find({ // query - selector: {}, - sort: [{ name: 'asc' }] - }) - .$; - } -``` - -```html - - {{hero.name}} - -``` - -### Different RxStorage layers for RxDB -RxDB supports multiple storage layers for persisting data. Some of the available storage options include: - -- [LocalStorage RxStorage](../rx-storage-localstorage.md): Uses the [LocalStorage API](./localstorage.md) without any third party plugins. -- [IndexedDB RxStorage](../rx-storage-indexeddb.md): RxDB directly supports IndexedDB as a storage layer. IndexedDB is a low-level browser database that offers good performance and reliability. -- [OPFS RxStorage](../rx-storage-opfs.md): The OPFS [RxStorage](../rx-storage.md) for RxDB is built on top of the [File System Access API](https://webkit.org/blog/12257/the-file-system-access-api-with-origin-private-file-system/) which is available in [all modern browsers](https://caniuse.com/native-filesystem-api). It provides an API to access a sandboxed private file system to persistently store and retrieve data. -Compared to other persistent storage options in the browser (like [IndexedDB](../rx-storage-indexeddb.md)), the OPFS API has a **way better performance**. -- [Memory RxStorage](../rx-storage-memory.md): In addition to persistent storage options, RxDB also provides a memory-based storage layer. This is useful for testing or scenarios where you don't need long-term data persistence. -You can choose the storage layer that best suits your application's requirements and configure RxDB accordingly. - -## Synchronizing Data with RxDB between Clients and Servers - -Data replication between an Angular application and a server is a common requirement. RxDB simplifies this process and provides built-in support for data synchronization. Let's explore how to replicate data between an Angular application and a server using RxDB. - - - -### Offline-First Approach -One of the key strengths of RxDB is its [offline-first approach](../offline-first.md). It allows Angular applications to function seamlessly even in offline scenarios. RxDB stores data locally and automatically synchronizes changes with the server when the network becomes available. This capability is particularly useful for applications that need to operate in low-connectivity or unreliable network environments. - -### Conflict Resolution -In a distributed system, conflicts can arise when multiple clients modify the same data simultaneously. RxDB offers conflict resolution mechanisms to handle such scenarios. You can define conflict resolution strategies based on your application's requirements. RxDB provides hooks and events to detect conflicts and resolve them in a consistent manner. - -### Bidirectional Synchronization -RxDB supports bidirectional data synchronization, allowing updates from both the client and server to be replicated seamlessly. This ensures that data remains consistent across all connected clients and the server. RxDB handles conflicts and resolves them based on the defined conflict resolution strategies. - -### Real-Time Updates -RxDB provides real-time updates by leveraging reactive programming principles. Changes made to the data are automatically propagated to all connected clients in real-time. Angular applications can subscribe to these updates and update the user interface accordingly. This real-time capability enables collaborative features and enhances the overall user experience. - -## Advanced RxDB Features and Techniques -RxDB offers several advanced features and techniques that can further enhance your Angular application. - -### Indexing and Performance Optimization -To improve query performance, RxDB allows you to define indexes on specific fields of your documents. Indexing enables faster data retrieval and query execution, especially when working with large datasets. By strategically creating indexes, you can optimize the performance of your Angular application. - -### Encryption of Local Data -RxDB provides built-in support for [encrypting](../encryption.md) local data using the Web Crypto API. With encryption, you can protect sensitive data stored in the client-side database. RxDB transparently encrypts the data, ensuring that it remains secure even if the underlying storage is compromised. - -### Change Streams and Event Handling -RxDB exposes change streams, which allow you to listen for data changes at a database or collection level. By subscribing to change streams, you can react to data modifications and perform specific actions, such as updating the UI or triggering notifications. Change streams enable real-time event handling in your Angular application. - -### JSON Key Compression -To reduce the storage footprint and improve performance, RxDB supports [JSON key compression](../key-compression.md). With key compression, RxDB replaces long keys with shorter aliases, reducing the overall storage size. This optimization is particularly useful when working with large datasets or frequently updating data. - -## Best Practices for Using RxDB in Angular Applications -To make the most of RxDB in your Angular application, consider the following best practices: - -### Use Async Pipe for Subscriptions so you do not have to unsubscribe -Angular's `async` pipe is a powerful tool for handling observables in templates. By using the async pipe, you can avoid the need to manually subscribe and unsubscribe from RxDB observables. Angular takes care of the subscription lifecycle, ensuring that resources are released when they are no longer needed. Instead of manually subscribing to Observables, you should always prefer the `async` pipe. - -```ts -// WRONG: -let amount; -this.dbService - .db.hero - .find({ - selector: {}, - sort: [{ name: 'asc' }] - }) - .$.subscribe(docs => { - amount = 0; - docs.forEach(d => amount = d.points); - }); - -// RIGHT: -this.amount$ = this.dbService - .db.hero - .find({ - selector: {}, - sort: [{ name: 'asc' }] - }) - .$.pipe( - map(docs => { - let amount = 0; - docs.forEach(d => amount = d.points); - return amount; - }) - ); -``` - -### Use custom reactivity to have signals instead of rxjs observables - -RxDB supports adding custom reactivity factories that allow you to get angular signals out of the database instead of rxjs observables. [read more](../reactivity.md). - -### Use Angular Services for Database creation -To ensure proper separation of concerns and maintain a clean codebase, it is recommended to create an Angular service responsible for managing the RxDB database instance. This service can handle database creation, initialization, and provide methods for interacting with the database throughout your application. - -### Efficient Data Handling -RxDB provides various mechanisms for efficient data handling, such as batching updates, debouncing, and throttling. Leveraging these techniques can help optimize performance and reduce unnecessary UI updates. Consider the specific data handling requirements of your application and choose the appropriate strategies provided by RxDB. - -### Data Synchronization Strategies -When working with data synchronization between clients and servers, it's important to consider strategies for conflict resolution and handling network failures. RxDB provides plugins and hooks that allow you to customize the replication behavior and implement specific synchronization strategies tailored to your application's needs. - -## Conclusion -RxDB is a powerful database solution for Angular applications, offering reactive data handling, offline-first capabilities, and seamless data synchronization. By integrating RxDB into your Angular application, you can build responsive and scalable web applications that provide a rich user experience. Whether you're building real-time collaborative apps, progressive web applications, or offline-capable applications, RxDB's features and techniques make it a valuable addition to your Angular development toolkit. - -## Follow Up -To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: - -- [RxDB GitHub Repository](https://github.com/pubkey/rxdb): Visit the official GitHub repository of RxDB to access the source code, documentation, and community support. -- [RxDB Quickstart](../quickstart.md): Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects. -- [RxDB Angular Example at GitHub](https://github.com/pubkey/rxdb/tree/master/examples/angular) diff --git a/docs/articles/angular-indexeddb.html b/docs/articles/angular-indexeddb.html deleted file mode 100644 index eb6ad5ccfe5..00000000000 --- a/docs/articles/angular-indexeddb.html +++ /dev/null @@ -1,269 +0,0 @@ - - - - - -Build Smarter Offline-First Angular Apps - How RxDB Beats IndexedDB Alone | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone

-

In modern web applications, offline capabilities and fast interactions are crucial. IndexedDB, the browser's built-in database, allows you to store data locally, making your Angular application more robust and responsive. However, IndexedDB can be cumbersome to work with directly. That's where RxDB (Reactive Database) shines. In this article, we'll walk you through how to utilize IndexedDB in your Angular project using RxDB as a convenient abstraction layer.

-

What Is IndexedDB?

-

IndexedDB is a low-level JavaScript API for client-side storage of large amounts of structured data. It allows you to create key-value or object store-based data storage right in the user's browser. IndexedDB supports transactions and indexing but lacks a robust query API and can be complex to use due to its callback-based nature.

-
Angular IndexedDB
-

Why Use IndexedDB in Angular

-
    -
  • -

    Offline-First/Local-First: If your app needs to function with limited or no internet connectivity, IndexedDB provides a reliable local storage layer. Users can continue using the application offline, and data can sync when the connection is restored.

    -
  • -
  • -

    Performance: Local data access comes with near-zero latency, removing the need for constant server requests and eliminating most loading spinners.

    -
  • -
  • -

    Easier to Implement: By replicating all necessary data to the client once, you avoid implementing numerous backend endpoints for each user interaction.

    -
  • -
  • -

    Scalability: Local data queries remove processing load from your servers and reduce bandwidth usage by handling queries on the client side.

    -
  • -
-

Why Using Plain IndexedDB is a Problem

-

Despite the advantages, directly working with IndexedDB has several drawbacks:

-
    -
  • -

    Callback-Based: IndexedDB was originally designed around a callback-based API, which can be unwieldy compared to modern Promise or RxJS-based flows.

    -
  • -
  • -

    Difficult to Implement: IndexedDB is often described as a "low-level" API. It's more suitable for library authors rather than application developers who simply need a robust local store.

    -
  • -
  • -

    Rudimentary Query API: Complex or dynamic queries are cumbersome with IndexedDB's basic get/put approach and limited indexes.

    -
  • -
  • -

    TypeScript Support: Maintaining strong TypeScript types for all document structures is not straightforward with IndexedDB's untyped object stores.

    -
  • -
  • -

    No Observable API: IndexedDB cannot directly emit live data changes. With RxDB, you can subscribe to changes on a collection or even a single document field.

    -
  • -
  • -

    Cross-Tab Synchronization: Handling concurrent data changes across multiple browser tabs is difficult in IndexedDB. RxDB has built-in multi-tab support that keeps all tabs in sync.

    -
  • -
  • -

    Advanced Features Missing: IndexedDB lacks built-in support for encryption, compression, or other advanced data management features.

    -
  • -
  • -

    Browser-Only: IndexedDB works in the browser but not in environments like React Native or Electron. RxDB offers storage adapters to seamlessly reuse the same code on different platforms.

    -
  • -
-
JavaScript Database
-

Set Up RxDB in Angular

-

Installing RxDB

-

You can install RxDB into your Angular application via npm:

-
npm install rxdb --save
-

Patch Change Detection with zone.js

-

RxDB creates RxJS observables outside of Angular's zone, meaning Angular won't automatically trigger change detection when new data arrives. You must patch RxJS with zone.js:

-
//> app.component.ts
-/**
- * IMPORTANT: RxDB creates rxjs observables outside of Angular's zone
- * So you have to import the rxjs patch to ensure change detection works correctly.
- * @link https://www.bennadel.com/blog/3448-binding-rxjs-observable-sources-outside-of-the-ngzone-in-angular-6-0-2.htm
- */
-import 'zone.js/plugins/zone-patch-rxjs';
-

Create a Database and Collections

-

RxDB supports multiple storage options. The free and simple approach is using the localstorage-based storage. For higher performance, there's a premium plain IndexedDB storage.

-
import { createRxDatabase } from 'rxdb/plugins/core';
- 
-// Define your schema
-const heroSchema = {
-  title: 'hero schema',
-  version: 0,
-  description: 'Describes a hero in your app',
-  primaryKey: 'id',
-  type: 'object',
-  properties: {
-    id: {
-      type: 'string',
-      maxLength: 100
-    },
-    name: {
-      type: 'string'
-    },
-    power: {
-      type: 'string'
-    }
-  },
-  required: ['id', 'name']
-};
-
import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
-export async function initDB() {
-  // Create a database
-  const db = await createRxDatabase({
-    name: 'heroesdb', // the name of the database
-    storage: getRxStorageLocalstorage()
-  });
- 
-  // Add collections
-  await db.addCollections({
-    heroes: {
-      schema: heroSchema
-    }
-  });
- 
-  return db;
-}
-

It's recommended to encapsulate database creation logic in an Angular service, such as in a DatabaseService. A full example is available in RxDB's Angular example.

-

CRUD Operations

-

Once your database is initialized, you can perform all CRUD operations:

-
// insert
-await db.heroes.insert({ name: 'Iron Man', power: 'Genius-level intellect' });
- 
-// bulk insert
-await db.heroes.bulkInsert([
-  { name: 'Thor', power: 'God of Thunder' },
-  { name: 'Hulk', power: 'Superhuman Strength' }
-]);
- 
-// find and findOne
-const heroes = await db.heroes.find().exec();
-const ironMan = await db.heroes.findOne({ selector: { name: 'Iron Man' } }).exec();
- 
-// update
-const doc = await db.heroes.findOne({ selector: { name: 'Hulk' } }).exec();
-await doc.update({ $set: { power: 'Unlimited Strength' } });
- 
-// delete
-const doc = await db.heroes.findOne({ selector: { name: 'Thor' } }).exec();
-await doc.remove();
-

Reactive Queries and Live Updates

-

A key benefit of RxDB is reactivity. You can subscribe to changes and have your UI automatically reflect updates in real time even across browser tabs.

-

realtime ui updates

-

With RxJS Observables and Async Pipes

-

In Angular, you can display this data with the AsyncPipe:

-
constructor(private dbService: DatabaseService) {
-  this.heroes$ = this.dbService.db.heroes.find({
-    selector: {},
-    sort: [{ name: 'asc' }]
-  }).$;
-}
-
<ul>
-  <li *ngFor="let hero of heroes$ | async">
-    {{ hero.name }}
-  </li>
-</ul>
-

With Angular Signals

-

Angular Signals are a newer approach for reactivity. RxDB supports them via a custom reactivity factory. You can convert RxJS Observables to Signals using Angular's toSignal:

-
import { RxReactivityFactory } from 'rxdb/plugins/core';
-import { Signal, untracked, Injector } from '@angular/core';
-import { toSignal } from '@angular/core/rxjs-interop';
- 
-export function createReactivityFactory(injector: Injector): RxReactivityFactory<Signal<any>> {
-  return {
-    fromObservable(observable$, initialValue) {
-      return untracked(() =>
-        toSignal(observable$, {
-          initialValue,
-          injector,
-          rejectErrors: true
-        })
-      );
-    }
-  };
-}
-

Pass this factory when creating your RxDatabase:

-
import { createRxDatabase } from 'rxdb/plugins/core';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
-import { inject, Injector } from '@angular/core';
- 
-const database = await createRxDatabase({
-    name: 'mydb',
-    storage: getRxStorageLocalstorage(),
-    reactivity: createReactivityFactory(inject(Injector))
-});
-

Use the double-dollar sign ($$) to get a Signal instead of an Observable:

-
const heroesSignal = database.heroes.find().$$;
-
<ul>
-  <li *ngFor="let hero of heroesSignal()">
-    {{ hero.name }}
-  </li>
-</ul>
-

Angular IndexedDB Example with RxDB

-

A comprehensive example of RxDB in an Angular application is available in the RxDB GitHub repository. It demonstrates database creation, queries, and Angular integration using best practices.

-

Advanced RxDB Features

-

Beyond simple CRUD and local data storage, RxDB supports:

-
    -
  • -

    Replication: Sync your local data with a remote database. Learn more at RxDB Replication.

    -
  • -
  • -

    Data Migration on Schema Changes: RxDB supports automatic or manual schema migrations to manage backward-compatibility and evolve your data structure. See RxDB Migration.

    -
  • -
  • -

    Encryption: Easily encrypt sensitive data at rest. See RxDB Encryption.

    -
  • -
  • -

    Compression: Reduce storage and bandwidth usage using key compression. Learn more at RxDB Key Compression.

    -
  • -
-

Limitations of IndexedDB

-

While IndexedDB works well for many use cases, it does have a few constraints:

-
    -
  • -

    Potentially Slow: While adequate for most use cases, IndexedDB performance can degrade for very large datasets. More details at RxDB Slow IndexedDB.

    -
  • -
  • -

    Storage Limits: Browsers may cap the amount of data you can store in IndexedDB. For more info, see Local Storage Limits of IndexedDB.

    -
  • -
-

Alternatives to IndexedDB

-

Depending on your needs, you might explore:

-
    -
  • -

    Origin Private File System (OPFS): A newer browser storage mechanism that can offer better performance. RxDB supports OPFS storage.

    -
  • -
  • -

    SQLite: When building a mobile or hybrid app (e.g., with Capacitor or Ionic), you can use SQLite locally. See RxDB with SQLite.

    -
  • -
-

Performance comparison with other browser storages

-

Here is a performance overview of the various browser based storage implementation of RxDB:

-

RxStorage performance - browser

-

Follow Up

-

Continue your deep dive into RxDB with official quickstart guides and star the repository on GitHub to stay updated.

-
    -
  • -

    RxDB Quickstart: Get started quickly with the RxDB Quickstart.

    -
  • -
  • -

    RxDB GitHub: Explore the source, open issues, and star ⭐ the project at RxDB GitHub Repo.

    -
  • -
-

By combining IndexedDB's local storage with RxDB's powerful features, you can build performant, robust, and offline-capable Angular applications. RxDB takes care of the lower-level complexities, letting you focus on delivering a great user experience-online or off.

- - \ No newline at end of file diff --git a/docs/articles/angular-indexeddb.md b/docs/articles/angular-indexeddb.md deleted file mode 100644 index c2d58889f2b..00000000000 --- a/docs/articles/angular-indexeddb.md +++ /dev/null @@ -1,310 +0,0 @@ -# Build Smarter Offline-First Angular Apps - How RxDB Beats IndexedDB Alone - -> Discover how to harness IndexedDB in Angular with RxDB for robust offline apps. Learn reactive queries, advanced features, and more. - -import {Tabs} from '@site/src/components/tabs'; -import {Steps} from '@site/src/components/steps'; - -# Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone - -In modern web applications, offline capabilities and fast interactions are crucial. IndexedDB, the [browser](./browser-database.md)'s built-in database, allows you to store data locally, making your Angular application more robust and responsive. However, IndexedDB can be cumbersome to work with directly. That's where RxDB (Reactive Database) shines. In this article, we'll walk you through how to utilize IndexedDB in your Angular project using [RxDB](https://rxdb.info/) as a convenient abstraction layer. - -## What Is IndexedDB? -[IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) is a low-level JavaScript API for client-side storage of large amounts of structured data. It allows you to create key-value or object store-based data storage right in the user's browser. IndexedDB supports transactions and indexing but lacks a robust query API and can be complex to use due to its callback-based nature. - -
- -
- -## Why Use IndexedDB in Angular - -- [Offline-First](../offline-first.md)/[Local-First](./local-first-future.md): If your app needs to function with limited or no internet connectivity, IndexedDB provides a reliable local storage layer. Users can continue using the application offline, and data can sync when the connection is restored. - -- **Performance**: Local data access comes with [near-zero latency](./zero-latency-local-first.md), removing the need for constant server requests and eliminating most loading spinners. - -- **Easier to Implement**: By replicating all necessary data to the client once, you avoid implementing numerous backend endpoints for each user interaction. - -- **Scalability**: Local data queries remove processing load from your servers and reduce bandwidth usage by handling queries on the client side. - -## Why Using Plain IndexedDB is a Problem - -Despite the advantages, directly working with IndexedDB has several drawbacks: - -- **Callback-Based**: IndexedDB was originally designed around a callback-based API, which can be unwieldy compared to modern Promise or RxJS-based flows. - -- **Difficult to Implement**: IndexedDB is often described as a "low-level" API. It's more suitable for library authors rather than application developers who simply need a robust local store. - -- **Rudimentary Query API**: Complex or dynamic queries are cumbersome with IndexedDB's basic get/put approach and limited indexes. - -- **TypeScript Support**: Maintaining strong TypeScript types for all document structures is not straightforward with IndexedDB's untyped object stores. - -- **No Observable API**: IndexedDB cannot directly emit live data changes. With RxDB, you can subscribe to changes on a collection or even a single document field. - -- **Cross-Tab Synchronization**: Handling concurrent data changes across multiple browser tabs is difficult in IndexedDB. RxDB has built-in multi-tab support that keeps all tabs in sync. - -- **Advanced Features Missing**: IndexedDB lacks built-in support for encryption, compression, or other advanced data management features. - -- **Browser-Only**: IndexedDB works in the browser but not in environments like React Native or Electron. RxDB offers storage adapters to seamlessly reuse the same code on different platforms. - -
- - - -
- -## Set Up RxDB in Angular - -### Installing RxDB - -You can [install RxDB](../install.md) into your Angular application via npm: - -```bash -npm install rxdb --save -``` - -### Patch Change Detection with zone.js - -RxDB creates RxJS observables outside of Angular's zone, meaning Angular won't automatically trigger change detection when new data arrives. You must patch RxJS with zone.js: - -```ts -//> app.component.ts -/** - * IMPORTANT: RxDB creates rxjs observables outside of Angular's zone - * So you have to import the rxjs patch to ensure change detection works correctly. - * @link https://www.bennadel.com/blog/3448-binding-rxjs-observable-sources-outside-of-the-ngzone-in-angular-6-0-2.htm - */ -import 'zone.js/plugins/zone-patch-rxjs'; -``` - -### Create a Database and Collections - -RxDB supports multiple storage options. The free and simple approach is using the [localstorage-based](../rx-storage-localstorage.md) storage. For higher performance, there's a premium plain [IndexedDB storage](../rx-storage-indexeddb.md). - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; - -// Define your schema -const heroSchema = { - title: 'hero schema', - version: 0, - description: 'Describes a hero in your app', - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 - }, - name: { - type: 'string' - }, - power: { - type: 'string' - } - }, - required: ['id', 'name'] -}; -``` - - - -### Localstorage - -```ts -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -export async function initDB() { - // Create a database - const db = await createRxDatabase({ - name: 'heroesdb', // the name of the database - storage: getRxStorageLocalstorage() - }); - - // Add collections - await db.addCollections({ - heroes: { - schema: heroSchema - } - }); - - return db; -} -``` - -### IndexedDB - -```ts -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; -export async function initDB() { - // Create a database - const db = await createRxDatabase({ - name: 'heroesdb', // the name of the database - storage: getRxStorageIndexedDB() - }); - - // Add collections - await db.addCollections({ - heroes: { - schema: heroSchema - } - }); - - return db; -} -``` - - - -It's recommended to encapsulate database creation logic in an Angular service, such as in a DatabaseService. A full example is available in [RxDB's Angular example](https://github.com/pubkey/rxdb/blob/master/examples/angular/src/app/services/database.service.ts). - -### CRUD Operations - -Once your database is initialized, you can perform all CRUD operations: - -```ts -// insert -await db.heroes.insert({ name: 'Iron Man', power: 'Genius-level intellect' }); - -// bulk insert -await db.heroes.bulkInsert([ - { name: 'Thor', power: 'God of Thunder' }, - { name: 'Hulk', power: 'Superhuman Strength' } -]); - -// find and findOne -const heroes = await db.heroes.find().exec(); -const ironMan = await db.heroes.findOne({ selector: { name: 'Iron Man' } }).exec(); - -// update -const doc = await db.heroes.findOne({ selector: { name: 'Hulk' } }).exec(); -await doc.update({ $set: { power: 'Unlimited Strength' } }); - -// delete -const doc = await db.heroes.findOne({ selector: { name: 'Thor' } }).exec(); -await doc.remove(); -``` - -## Reactive Queries and Live Updates - -A key benefit of RxDB is reactivity. You can subscribe to changes and have your UI automatically reflect updates in [real time](./realtime-database.md) even across browser tabs. - - - -### With RxJS Observables and Async Pipes - -In Angular, you can display this data with the `AsyncPipe`: - -```ts -constructor(private dbService: DatabaseService) { - this.heroes$ = this.dbService.db.heroes.find({ - selector: {}, - sort: [{ name: 'asc' }] - }).$; -} -``` - -```html - - - {{ hero.name }} - - -``` - -### With Angular Signals - -Angular Signals are a newer approach for reactivity. RxDB supports them via a [custom reactivity](../reactivity.md) factory. You can convert RxJS Observables to Signals using Angular's `toSignal`: - -```ts -import { RxReactivityFactory } from 'rxdb/plugins/core'; -import { Signal, untracked, Injector } from '@angular/core'; -import { toSignal } from '@angular/core/rxjs-interop'; - -export function createReactivityFactory(injector: Injector): RxReactivityFactory> { - return { - fromObservable(observable$, initialValue) { - return untracked(() => - toSignal(observable$, { - initialValue, - injector, - rejectErrors: true - }) - ); - } - }; -} -``` - -Pass this factory when creating your [RxDatabase](../rx-database.md): - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -import { inject, Injector } from '@angular/core'; - -const database = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage(), - reactivity: createReactivityFactory(inject(Injector)) -}); -``` - -Use the double-dollar sign (`$$`) to get a `Signal` instead of an `Observable`: - -```ts -const heroesSignal = database.heroes.find().$$; -``` - -```html - - - {{ hero.name }} - - -``` - -## Angular IndexedDB Example with RxDB - -A comprehensive example of RxDB in an Angular application is available in the [RxDB GitHub repository](https://github.com/pubkey/rxdb/tree/master/examples/angular). It demonstrates [database](./angular-database.md) creation, queries, and Angular integration using best practices. - -## Advanced RxDB Features - -Beyond simple CRUD and local data storage, RxDB supports: - -- **Replication**: Sync your local data with a remote database. Learn more at [RxDB Replication](https://rxdb.info/replication.html). - -- **Data Migration on Schema Changes**: RxDB supports automatic or manual schema migrations to manage backward-compatibility and evolve your data structure. See [RxDB Migration](https://rxdb.info/migration-schema.html). - -- **Encryption**: Easily encrypt sensitive data at rest. See [RxDB Encryption](https://rxdb.info/encryption.html). - -- **Compression**: Reduce storage and bandwidth usage using key compression. Learn more at [RxDB Key Compression](https://rxdb.info/key-compression.html). - -## Limitations of IndexedDB - -While IndexedDB works well for many use cases, it does have a few constraints: - -- **Potentially Slow**: While adequate for most use cases, IndexedDB performance can degrade for very large datasets. More details at RxDB [Slow IndexedDB](../slow-indexeddb.md). - -- **Storage Limits**: Browsers may cap the amount of data you can store in IndexedDB. For more info, see [Local Storage Limits of IndexedDB](./indexeddb-max-storage-limit.md). - -## Alternatives to IndexedDB - -Depending on your needs, you might explore: - -- **Origin Private File System (OPFS)**: A newer browser storage mechanism that can offer better performance. RxDB supports [OPFS storage](../rx-storage-opfs.md). - -- **SQLite**: When building a mobile or hybrid app (e.g., with [Capacitor](../capacitor-database.md) or [Ionic](./ionic-database.md)), you can use SQLite locally. See [RxDB with SQLite](../rx-storage-sqlite.md). - -## Performance comparison with other browser storages -Here is a [performance overview](../rx-storage-performance.md) of the various browser based storage implementation of RxDB: - - - -## Follow Up - -Continue your deep dive into RxDB with official quickstart guides and star the repository on GitHub to stay updated. - -- **RxDB Quickstart**: Get started quickly with the [RxDB Quickstart](../quickstart.md). - -- **RxDB GitHub**: Explore the source, open issues, and star ⭐ the project at [RxDB GitHub Repo](https://github.com/pubkey/rxdb). - -By combining IndexedDB's local storage with RxDB's powerful features, you can build performant, robust, and offline-capable Angular applications. RxDB takes care of the lower-level complexities, letting you focus on delivering a great user experience-online or off. diff --git a/docs/articles/browser-database.html b/docs/articles/browser-database.html deleted file mode 100644 index 5dad75ae1d4..00000000000 --- a/docs/articles/browser-database.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - -Benefits of RxDB & Browser Databases | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RxDB: The benefits of Browser Databases

-

In the world of web development, efficient data management is a cornerstone of building successful and performant applications. The ability to store data directly in the browser brings numerous advantages, such as caching, offline accessibility, simplified replication of database state, and real-time application development. In this article, we will explore RxDB, a powerful browser JavaScript database, and understand why it is an excellent choice for implementing a browser database solution.

-
JavaScript Browser Database
-

Why you might want to store data in the browser

-

There are compelling reasons to consider storing data in the browser:

-

Use the database for caching

-

By leveraging a browser database, you can harness the power of caching. Storing frequently accessed data locally enables you to reduce server requests and greatly improve application performance. Caching provides a faster and smoother user experience, enhancing overall user satisfaction.

-

Data is offline accessible

-

Storing data in the browser allows for offline accessibility. Regardless of an active internet connection, users can access and interact with the application, ensuring uninterrupted productivity and user engagement.

-

Easier implementation of replicating database state

-

Browser databases simplify the replication of database state across multiple devices or instances of the application. Compared to complex REST routes, replicating data becomes easier and more streamlined. This capability enables the development of real-time and collaborative applications, where changes are seamlessly synchronized among users.

-

Building real-time applications is easier with local data

-

With a local browser database, building real-time applications becomes more straightforward. The availability of local data allows for reactive data flows and dynamic user interfaces that instantly reflect changes in the underlying data. Real-time features can be seamlessly implemented, providing a rich and interactive user experience.

-

Browser databases can scale better

-

Browser databases distribute the query workload to users' devices, allowing queries to run locally instead of relying solely on server resources. This decentralized approach improves scalability by reducing the burden on the server, resulting in a more efficient and responsive application.

-

Running queries locally has low latency

-

Browser databases offer the advantage of running queries locally, resulting in low latency. Eliminating the need for server round-trips significantly improves query performance, ensuring faster data retrieval and a more responsive application.

-

Faster initial application start time

-

Storing data in the browser reduces the initial application start time. Instead of waiting for data to be fetched from the server, the application can leverage the local database, resulting in faster initialization and improved user satisfaction right from the start.

-

Easier integration with JavaScript frameworks

-

Browser databases, including RxDB, seamlessly integrate with popular JavaScript frameworks such as Angular, React.js, Vue.js, and Svelte. This integration allows developers to leverage the power of a database while working within the familiar environment of their preferred framework, enhancing productivity and ease of development.

-

Store local data with encryption

-

Security is a crucial aspect of data storage, especially when handling sensitive information. Browser databases, like RxDB, offer the capability to store local data with encryption, ensuring the confidentiality and protection of sensitive user data.

-

Using a local database for state management

-

Utilizing a local browser database for state management eliminates the need for traditional state management libraries like Redux or NgRx. This approach simplifies the application's architecture by leveraging the database's capabilities to handle state-related operations efficiently.

-

Data is portable and always accessible by the user

-

When data is stored in the browser, it becomes portable and always accessible by the user. This ensures that users have control and ownership of their data, enhancing data privacy and accessibility.

-

Why SQL databases like SQLite are not a good fit for the browser

-

While SQL databases, such as SQLite, excel in server-side scenarios, they are not always the optimal choice for browser-based applications. Here are some reasons why SQL databases may not be the best fit for the browser:

-

Push/Pull based vs. reactive

-

SQL databases typically rely on a push/pull mechanism, where the server pushes updates to the client or the client pulls data from the server. This approach is not inherently reactive and requires additional effort to implement real-time data updates. In contrast, browser databases like RxDB provide built-in reactive mechanisms, allowing the application to react to data changes seamlessly.

-

Build size of server-side databases

-

Server-side databases, designed to handle large-scale applications, often have significant build sizes that are unsuitable for browser applications. In contrast, browser databases are specifically optimized for browser environments and leverage browser APIs like IndexedDB, OPFS, and Webworker, resulting in smaller build sizes.

-

Initialization time and performance

-

The initialization time and performance of server-side databases can be suboptimal in browser applications. Browser databases, on the other hand, are designed to provide fast initialization and efficient performance within the browser environment, ensuring a smooth user experience.

-

Why RxDB is a good fit for the browser

-

RxDB stands out as an excellent choice for implementing a browser database solution. Here's why RxDB is a perfect fit for browser applications:

-

Observable Queries (rxjs) to automatically update the UI on changes

-

RxDB provides Observable Queries, powered by RxJS, enabling automatic UI updates when data changes occur. This reactive approach eliminates the need for manual data synchronization and ensures a real-time and responsive user interface.

-
const query = myCollection.find({
-    selector: {
-        age: {
-            $gt: 21
-        }
-    }
-});
-const querySub = query.$.subscribe(results => {
-    console.log('got results: ' + results.length);
-});
-

NoSQL JSON documents are a better fit for UIs

-

RxDB utilizes NoSQL JSON documents, which align naturally with UI development in JavaScript. JavaScript's native handling of JSON objects makes working with NoSQL documents more intuitive, simplifying UI-related operations.

-

NoSQL has better TypeScript support compared to SQL

-

TypeScript is widely used in modern JavaScript development. NoSQL databases, including RxDB, offer excellent TypeScript support, making it easier to build type-safe applications and leverage the benefits of static typing.

-

Observable document fields

-

RxDB allows observing individual document fields, providing granular reactivity. This feature enables efficient tracking of specific data changes and fine-grained UI updates, optimizing performance and responsiveness.

-

Made in JavaScript, optimized for JavaScript applications

-

RxDB is built entirely in JavaScript, optimized for JavaScript applications. This ensures seamless integration with JavaScript codebases and maximizes performance within the browser environment.

-

Optimized observed queries with the EventReduce Algorithm

-

RxDB employs the EventReduce Algorithm to optimize observed queries. This algorithm intelligently reduces unnecessary data transmissions, resulting in efficient query execution and improved performance.

-

Built-in multi-tab support

-

RxDB natively supports multi-tab applications, allowing data synchronization and replication across different tabs or instances of the same application. This feature ensures consistent data across the application and enhances collaboration and real-time experiences.

-

multi tab support

-

Handling of schema changes

-

RxDB excels in handling schema changes, even when data is stored on multiple client devices. It provides mechanisms to handle schema migrations seamlessly, ensuring data integrity and compatibility as the application evolves.

-

Storing documents compressed

-

To optimize storage space, RxDB allows the compression of documents. Storing compressed documents reduces storage requirements and improves overall performance, especially in scenarios with large data volumes.

-

Flexible storage layer for various platforms

-

RxDB offers a flexible storage layer, enabling code reuse across different platforms, including Electron.js, React Native, hybrid apps (e.g., Capacitor.js), and web browsers. This flexibility streamlines development efforts and ensures consistent data management across multiple platforms.

-

Replication Algorithm for compatibility with any backend

-

RxDB incorporates a Replication Algorithm that is open-source and can be made compatible with various backend systems. This compatibility allows seamless data synchronization with different backend architectures, such as own servers, Firebase, CouchDB, NATS or WebSocket.

-

database replication

-

Follow Up

-

To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources:

-
    -
  • RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.
  • -
  • RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects.
  • -
-

RxDB empowers developers to unlock the power of browser databases, enabling efficient data management, real-time applications, and enhanced user experiences. By leveraging RxDB's features and benefits, you can take your browser-based applications to the next level of performance, scalability, and responsiveness.

- - \ No newline at end of file diff --git a/docs/articles/browser-database.md b/docs/articles/browser-database.md deleted file mode 100644 index a2cd370ea77..00000000000 --- a/docs/articles/browser-database.md +++ /dev/null @@ -1,121 +0,0 @@ -# Benefits of RxDB & Browser Databases - -> Find out why RxDB is the go-to solution for browser databases. See how it boosts performance, simplifies replication, and powers real-time UIs. - -# RxDB: The benefits of Browser Databases -In the world of web development, efficient data management is a cornerstone of building successful and performant applications. The ability to store data directly in the browser brings numerous advantages, such as caching, offline accessibility, simplified replication of database state, and real-time application development. In this article, we will explore [RxDB](https://rxdb.info/), a powerful browser JavaScript database, and understand why it is an excellent choice for implementing a browser database solution. - -
- - - -
- -## Why you might want to store data in the browser -There are compelling reasons to consider storing data in the browser: - -### Use the database for caching -By leveraging a browser database, you can harness the power of caching. Storing frequently accessed data locally enables you to reduce server requests and greatly improve application performance. Caching provides a faster and smoother user experience, enhancing overall user satisfaction. - -### Data is offline accessible -Storing data in the browser allows for offline accessibility. Regardless of an active internet connection, users can access and interact with the application, ensuring uninterrupted productivity and user engagement. - -### Easier implementation of replicating database state -Browser databases simplify the replication of database state across multiple devices or instances of the application. Compared to complex REST routes, replicating data becomes easier and more streamlined. This capability enables the development of real-time and collaborative applications, where changes are seamlessly synchronized among users. - -### Building real-time applications is easier with local data -With a local browser database, building real-time applications becomes more straightforward. The availability of local data allows for reactive data flows and dynamic user interfaces that instantly reflect changes in the underlying data. Real-time features can be seamlessly implemented, providing a rich and interactive user experience. - -### Browser databases can scale better -Browser databases distribute the query workload to users' devices, allowing queries to run locally instead of relying solely on server resources. This decentralized approach improves scalability by reducing the burden on the server, resulting in a more efficient and responsive application. - -### Running queries locally has low latency -Browser databases offer the advantage of running queries locally, resulting in low latency. Eliminating the need for server round-trips significantly improves query performance, ensuring faster data retrieval and a more responsive application. - -### Faster initial application start time -Storing data in the browser reduces the initial application start time. Instead of waiting for data to be fetched from the server, the application can leverage the [local database](./local-database.md), resulting in faster initialization and improved user satisfaction right from the start. - -### Easier integration with JavaScript frameworks -Browser databases, including [RxDB](https://rxdb.info/), seamlessly integrate with popular JavaScript frameworks such as [Angular](./angular-database.md), [React.js](./react-database.md), [Vue.js](./vue-database.md), and Svelte. This integration allows developers to leverage the power of a database while working within the familiar environment of their preferred framework, enhancing productivity and ease of development. - -### Store local data with encryption -Security is a crucial aspect of data storage, especially when handling sensitive information. Browser databases, like RxDB, offer the capability to store local data with encryption, ensuring the confidentiality and protection of sensitive user data. - -### Using a local database for state management -Utilizing a local browser database for state management eliminates the need for traditional state management libraries like Redux or NgRx. This approach simplifies the application's architecture by leveraging the database's capabilities to handle state-related operations efficiently. - -### Data is portable and always accessible by the user -When data is stored in the browser, it becomes portable and always accessible by the user. This ensures that users have control and ownership of their data, enhancing data privacy and accessibility. - -## Why SQL databases like SQLite are not a good fit for the browser -While SQL databases, such as SQLite, excel in server-side scenarios, they are not always the optimal choice for browser-based applications. Here are some reasons why SQL databases may not be the best fit for the browser: - -### Push/Pull based vs. reactive -SQL databases typically rely on a push/pull mechanism, where the server pushes updates to the client or the client pulls data from the server. This approach is not inherently reactive and requires additional effort to implement real-time data updates. In contrast, browser databases like [RxDB](https://rxdb.info/) provide built-in reactive mechanisms, allowing the application to react to data changes seamlessly. - -### Build size of server-side databases -Server-side databases, designed to handle large-scale applications, often have significant build sizes that are unsuitable for browser applications. In contrast, browser databases are specifically optimized for browser environments and leverage browser APIs like [IndexedDB](../rx-storage-indexeddb.md), [OPFS](../rx-storage-opfs.md), and [Webworker](../rx-storage-worker.md), resulting in smaller build sizes. - -### Initialization time and performance -The initialization time and performance of server-side databases can be suboptimal in browser applications. Browser databases, on the other hand, are designed to provide fast initialization and efficient performance within the browser environment, ensuring a smooth user experience. - -## Why RxDB is a good fit for the browser -RxDB stands out as an excellent choice for implementing a browser database solution. Here's why RxDB is a perfect fit for browser applications: - -### Observable Queries (rxjs) to automatically update the UI on changes -RxDB provides Observable Queries, powered by RxJS, enabling automatic UI updates when data changes occur. This reactive approach eliminates the need for manual data synchronization and ensures a real-time and responsive user interface. - -```typescript -const query = myCollection.find({ - selector: { - age: { - $gt: 21 - } - } -}); -const querySub = query.$.subscribe(results => { - console.log('got results: ' + results.length); -}); -``` - -### NoSQL [JSON](./json-database.md) documents are a better fit for UIs -RxDB utilizes NoSQL [JSON documents](./json-database.md), which align naturally with UI development in JavaScript. JavaScript's native handling of JSON objects makes working with NoSQL documents more intuitive, simplifying UI-related operations. - -### NoSQL has better TypeScript support compared to SQL -TypeScript is widely used in modern JavaScript development. [NoSQL databases](./in-memory-nosql-database.md), including RxDB, offer excellent TypeScript support, making it easier to build type-safe applications and leverage the benefits of static typing. - -### Observable document fields -RxDB allows observing individual document fields, providing granular reactivity. This feature enables efficient tracking of specific data changes and fine-grained UI updates, optimizing performance and responsiveness. - -### Made in JavaScript, optimized for JavaScript applications -RxDB is built entirely in JavaScript, optimized for JavaScript applications. This ensures seamless integration with JavaScript codebases and maximizes performance within the browser environment. - -### Optimized observed queries with the EventReduce Algorithm -RxDB employs the EventReduce Algorithm to optimize observed queries. This algorithm intelligently reduces unnecessary data transmissions, resulting in efficient query execution and improved performance. - -### Built-in multi-tab support -RxDB natively supports multi-tab applications, allowing data synchronization and replication across different tabs or instances of the same application. This feature ensures consistent data across the application and enhances collaboration and real-time experiences. - - - -### Handling of schema changes -RxDB excels in handling schema changes, even when data is stored on multiple client devices. It provides mechanisms to handle schema migrations seamlessly, ensuring data integrity and compatibility as the application evolves. - -### Storing documents compressed -To optimize [storage](./browser-storage.md) space, RxDB allows the [compression](../key-compression.md) of documents. Storing compressed documents reduces storage requirements and improves overall performance, especially in scenarios with large data volumes. - -### Flexible storage layer for various platforms -RxDB offers a flexible storage layer, enabling code reuse across different platforms, including [Electron.js](../electron-database.md), React Native, hybrid apps (e.g., Capacitor.js), and web browsers. This flexibility streamlines development efforts and ensures consistent data management across multiple platforms. - -### Replication Algorithm for compatibility with any backend -RxDB incorporates a [Replication Algorithm](../replication.md) that is open-source and can be made compatible with various backend systems. This compatibility allows seamless data synchronization with different backend architectures, such as own servers, [Firebase](../replication-firestore.md), [CouchDB](../replication-couchdb.md), [NATS](../replication-nats.md) or [WebSocket](../replication-websocket.md). - - - -## Follow Up -To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: - -- [RxDB GitHub Repository](https://github.com/pubkey/rxdb): Visit the official GitHub repository of RxDB to access the source code, documentation, and community support. -- [RxDB Quickstart](../quickstart.md): Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects. - -[RxDB](https://rxdb.info/) empowers developers to unlock the power of browser databases, enabling efficient data management, real-time applications, and enhanced user experiences. By leveraging RxDB's features and benefits, you can take your browser-based applications to the next level of performance, scalability, and responsiveness. diff --git a/docs/articles/browser-storage.html b/docs/articles/browser-storage.html deleted file mode 100644 index 8bf1f043583..00000000000 --- a/docs/articles/browser-storage.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - -Browser Storage - RxDB as a Database for Browsers | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Browser Storage - RxDB as a Database for Browsers

-

Storing Data in the Browser

-

When it comes to building web applications, one essential aspect is the storage of data. Two common methods of storing data directly within the user's web browser are Localstorage and IndexedDB. These browser-based storage options serve various purposes and cater to different needs in web development.

-
JavaScript Browser Storage
-

Localstorage

-

Localstorage is a straightforward way to store small amounts of data in the user's web browser. It operates on a simple key-value basis and is relatively easy to use. While it has limitations, it is suitable for basic data storage requirements.

-

IndexedDB

-

IndexedDB, on the other hand, offers a more robust and structured approach to browser-based data storage. It can handle larger datasets and complex queries, making it a valuable choice for more advanced web applications.

-

Why Store Data in the Browser

-

Now that we've explored the methods of storing data in the browser, let's delve into why this is a beneficial strategy for web developers:

-
    -
  1. -

    Caching: -Storing data in the browser allows you to cache frequently used information. This means that your web application can access essential data more quickly because it doesn't need to repeatedly fetch it from a server. This results in a smoother and more responsive user experience.

    -
  2. -
  3. -

    Offline Access: -One significant advantage of browser storage is that data becomes portable and remains accessible even when the user is offline. This feature ensures that users can continue to use your application, view their saved information, and make changes, irrespective of their internet connection status.

    -
  4. -
  5. -

    Faster Real-time Applications: -For real-time applications, having data stored locally in the browser significantly enhances performance. Local data allows your application to respond faster to user interactions, creating a more seamless and responsive user interface.

    -
  6. -
  7. -

    Low Latency Queries: -When you run queries locally within the browser, you minimize the latency associated with network requests. This results in near-instant access to data, which is particularly crucial for applications that require rapid data retrieval.

    -
  8. -
  9. -

    Faster Initial Application Start Time: -By preloading essential data into browser storage, you can reduce the initial load time of your web application. Users can start using your application more swiftly, which is essential for making a positive first impression.

    -
  10. -
  11. -

    Store Local Data with Encryption: -For applications that deal with sensitive data, browser storage allows you to implement encryption to secure the stored information. This ensures that even if data is stored on the user's device, it remains confidential and protected.

    -
  12. -
-

In summary, storing data in the browser offers several advantages, including improved performance, offline access, and enhanced user experiences. Localstorage and IndexedDB are two valuable tools that developers can utilize to leverage these benefits and create web applications that are more responsive and user-friendly.

-

Browser Storage Limitations

-

While browser storage, such as Localstorage and IndexedDB, offers many advantages, it's important to be aware of its limitations:

-
    -
  • -

    Slower Performance Compared to Native Databases: Browser-based storage solutions can't match the performance of native server-side databases. They may experience slower data retrieval and processing, especially for large datasets or complex operations.

    -
  • -
  • -

    Storage Space Limitations: Browsers impose restrictions on the amount of data that can be stored locally. This limitation can be problematic for applications with extensive data storage requirements, potentially necessitating creative solutions to manage data effectively.

    -
  • -
-

Why SQL Databases Like SQLite Aren't a Good Fit for the Browser

-

SQL databases like SQLite, while powerful in server environments, may not be the best choice for browser-based applications due to various reasons:

-

Push/Pull Based vs. Reactive

-

SQL databases often use a push/pull model for data synchronization. This approach is less reactive and may not align well with the real-time nature of web applications, where immediate updates to the user interface are crucial.

-

Build Size of Server-Side Databases

-

Server-side databases like SQLite have a significant build size, which can increase the initial load time of web applications. This can result in a suboptimal user experience, particularly for users with slower internet connections.

-

Initialization Time and Performance

-

SQL databases are optimized for server environments, and their initialization processes and performance characteristics may not align with the needs of web applications. They might not offer the swift performance required for seamless user interactions.

-

Why RxDB Is a Good Fit as Browser Storage

-

RxDB is an excellent choice for browser-based storage due to its numerous features and advantages:

-
JavaScript Browser Storage
-

Flexible Storage Layer for Various Platforms

-

RxDB offers a flexible storage layer that can seamlessly integrate with different platforms, making it versatile and adaptable to various application needs.

-

NoSQL JSON Documents Are a Better Fit for UIs

-

NoSQL JSON documents, used by RxDB, are well-suited for user interfaces. They provide a natural and efficient way to structure and display data in web applications.

-

NoSQL Has Better TypeScript Support Compared to SQL

-

RxDB boasts robust TypeScript support, which is beneficial for developers who prefer type safety and code predictability in their projects.

-

Observable Document Fields

-

RxDB enables developers to observe individual document fields, offering fine-grained control over data tracking and updates.

-

Made in JavaScript, Optimized for JavaScript Applications

-

Being built in JavaScript and optimized for JavaScript applications, RxDB seamlessly integrates into web development stacks, minimizing compatibility issues.

-

Observable Queries (rxjs) to Automatically Update the UI on Changes

-

RxDB's support for Observable Queries allows the user interface to update automatically in real-time when data changes. This reactivity enhances the user experience and simplifies UI development.

-
const query = myCollection.find({
-    selector: {
-        age: {
-            $gt: 21
-        }
-    }
-});
-const querySub = query.$.subscribe(results => {
-    console.log('got results: ' + results.length);
-});
-

Optimized Observed Queries with the EventReduce Algorithm

-

RxDB's EventReduce Algorithm ensures efficient data handling and rendering, improving overall performance and responsiveness.

-

Handling of Schema Changes

-

RxDB provides built-in support for handling schema changes, simplifying database management when updates are required.

-

Built-In Multi-Tab Support

-

For applications requiring multi-tab support, RxDB natively handles data consistency across different browser tabs, streamlining data synchronization.

-

multi tab support for browser storage

-

Storing Documents Compressed

-

Efficient data storage is achieved through document compression, reducing storage space requirements and enhancing overall performance.

-

Replication Algorithm for Compatibility with Any Backend

-

RxDB's Replication Algorithm facilitates compatibility with various backend systems, ensuring seamless data synchronization between the browser and server.

-

database replication

-

Summary

-

In conclusion, RxDB is a powerful and feature-rich solution for browser-based storage. Its adaptability, real-time capabilities, TypeScript support, and optimization for JavaScript applications make it an ideal choice for modern web development projects, addressing the limitations of traditional SQL databases in the browser. Developers can harness RxDB to create efficient, responsive, and user-friendly web applications that leverage the full potential of browser storage.

-

Follow Up

-

To explore more about RxDB and leverage its capabilities for browser storage, check out the following resources:

-
    -
  • RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.
  • -
  • RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects.
  • -
- - \ No newline at end of file diff --git a/docs/articles/browser-storage.md b/docs/articles/browser-storage.md deleted file mode 100644 index db698dbb89d..00000000000 --- a/docs/articles/browser-storage.md +++ /dev/null @@ -1,132 +0,0 @@ -# Browser Storage - RxDB as a Database for Browsers - -> Explore RxDB for browser storage its advantages, limitations, and why it outperforms SQL databases in web applications for enhanced efficiency - -# Browser Storage - RxDB as a Database for Browsers - -**Storing Data in the Browser** - -When it comes to building web applications, one essential aspect is the storage of data. Two common methods of storing data directly within the user's web browser are Localstorage and [IndexedDB](../rx-storage-indexeddb.md). These browser-based storage options serve various purposes and cater to different needs in web development. - -
- - - -
- -### Localstorage -[Localstorage](./localstorage.md) is a straightforward way to store small amounts of data in the user's web browser. It operates on a simple key-value basis and is relatively easy to use. While it has limitations, it is suitable for basic data storage requirements. - -### IndexedDB -IndexedDB, on the other hand, offers a more robust and structured approach to browser-based data storage. It can handle larger datasets and complex queries, making it a valuable choice for more advanced web applications. - -## Why Store Data in the Browser -Now that we've explored the methods of storing data in the browser, let's delve into why this is a beneficial strategy for web developers: - -1. **Caching**: -Storing data in the browser allows you to cache frequently used information. This means that your web application can access essential data more quickly because it doesn't need to repeatedly fetch it from a server. This results in a smoother and more responsive user experience. - -2. **Offline Access**: -One significant advantage of browser storage is that data becomes portable and remains accessible even when the user is offline. This feature ensures that users can continue to use your application, view their saved information, and make changes, irrespective of their internet connection status. - -3. **Faster Real-time Applications**: -For real-time applications, having data stored locally in the browser significantly enhances performance. Local data allows your application to respond faster to user interactions, creating a more seamless and responsive user interface. - -4. **Low Latency Queries**: -When you run queries locally within the browser, you minimize the latency associated with network requests. This results in near-instant access to data, which is particularly crucial for applications that require rapid data retrieval. - -5. **Faster Initial Application Start Time**: -By preloading essential data into browser storage, you can reduce the initial load time of your web application. Users can start using your application more swiftly, which is essential for making a positive first impression. - -6. **Store Local Data with Encryption**: -For applications that deal with sensitive data, browser storage allows you to implement [encryption](../encryption.md) to secure the stored information. This ensures that even if data is stored on the user's device, it remains confidential and protected. - -In summary, storing data in the browser offers several advantages, including improved performance, offline access, and enhanced user experiences. Localstorage and IndexedDB are two valuable tools that developers can utilize to leverage these benefits and create web applications that are more responsive and user-friendly. - -## Browser Storage Limitations -While browser storage, such as Localstorage and IndexedDB, offers many advantages, it's important to be aware of its limitations: - -- **Slower Performance Compared to Native Databases**: Browser-based storage solutions can't match the [performance](../rx-storage-performance.md) of native server-side databases. They may experience slower data retrieval and processing, especially for large datasets or complex operations. - -- **Storage Space Limitations**: Browsers [impose restrictions on the amount of data that can be stored locally](./indexeddb-max-storage-limit.md). This limitation can be problematic for applications with extensive data storage requirements, potentially necessitating creative solutions to manage data effectively. - -## Why SQL Databases Like SQLite Aren't a Good Fit for the Browser -SQL databases like SQLite, while powerful in server environments, may not be the best choice for browser-based applications due to various reasons: - -### Push/Pull Based vs. Reactive -SQL databases often use a push/pull model for data synchronization. This approach is less reactive and may not align well with the real-time nature of web applications, where immediate updates to the user interface are crucial. - -### Build Size of Server-Side Databases -Server-side databases like SQLite have a significant build size, which can increase the initial load time of web applications. This can result in a suboptimal user experience, particularly for users with slower internet connections. - -### Initialization Time and Performance -SQL databases are optimized for server environments, and their initialization processes and performance characteristics may not align with the needs of web applications. They might not offer the swift performance required for seamless user interactions. - -## Why RxDB Is a Good Fit as Browser Storage -RxDB is an excellent choice for browser-based storage due to its numerous features and advantages: - -
- - - -
- -### Flexible Storage Layer for Various Platforms -RxDB offers a flexible storage layer that can seamlessly integrate with different platforms, making it versatile and adaptable to various application needs. - -### NoSQL JSON Documents Are a Better Fit for UIs -NoSQL [JSON documents](./json-database.md), used by [RxDB](https://rxdb.info/), are well-suited for user interfaces. They provide a natural and efficient way to structure and display data in web applications. - -### NoSQL Has Better TypeScript Support Compared to SQL -RxDB boasts robust TypeScript support, which is beneficial for developers who prefer type safety and code predictability in their projects. - -### Observable Document Fields -RxDB enables developers to observe individual document fields, offering fine-grained control over data tracking and updates. - -### Made in JavaScript, Optimized for JavaScript Applications -Being built in JavaScript and optimized for JavaScript applications, RxDB seamlessly integrates into web development stacks, minimizing compatibility issues. - -### Observable Queries (rxjs) to Automatically Update the UI on Changes -RxDB's support for Observable Queries allows the user interface to update automatically in real-time when data changes. This reactivity enhances the user experience and simplifies UI development. - -```typescript -const query = myCollection.find({ - selector: { - age: { - $gt: 21 - } - } -}); -const querySub = query.$.subscribe(results => { - console.log('got results: ' + results.length); -}); -``` - -### Optimized Observed Queries with the EventReduce Algorithm -RxDB's [EventReduce Algorithm](https://github.com/pubkey/event-reduce) ensures efficient data handling and rendering, improving overall performance and responsiveness. - -### Handling of Schema Changes -RxDB provides built-in support for [handling schema changes](../migration-schema.md), simplifying database management when updates are required. - -### Built-In Multi-Tab Support -For applications requiring multi-tab support, RxDB natively handles data consistency across different browser tabs, streamlining data synchronization. - - - -### Storing Documents Compressed -Efficient data storage is achieved through [document compression](../key-compression.md), reducing storage space requirements and enhancing overall performance. - -### Replication Algorithm for Compatibility with Any Backend -RxDB's [Replication Algorithm](../replication.md) facilitates compatibility with various backend systems, ensuring seamless data synchronization between the browser and server. - - - -## Summary - -In conclusion, RxDB is a powerful and feature-rich solution for browser-based storage. Its adaptability, real-time capabilities, TypeScript support, and optimization for JavaScript applications make it an ideal choice for modern web development projects, addressing the limitations of traditional SQL databases in the browser. Developers can harness RxDB to create efficient, responsive, and user-friendly web applications that leverage the full potential of browser storage. - -## Follow Up -To explore more about RxDB and leverage its capabilities for browser storage, check out the following resources: - -- [RxDB GitHub Repository](https://github.com/pubkey/rxdb): Visit the official GitHub repository of RxDB to access the source code, documentation, and community support. -- [RxDB Quickstart](../quickstart.md): Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects. diff --git a/docs/articles/data-base.html b/docs/articles/data-base.html deleted file mode 100644 index a041d50ac06..00000000000 --- a/docs/articles/data-base.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - -Empower Web Apps with Reactive RxDB Data-base | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RxDB as a data base: Empowering Web Applications with Reactive Data Handling

-

In the world of web applications, efficient data management plays a crucial role in delivering a seamless user experience. As mobile applications continue to dominate the digital landscape, the importance of robust data bases becomes evident. In this article, we will explore RxDB as a powerful data base solution for web applications. We will delve into its features, advantages, and advanced techniques, highlighting its ability to handle reactive data and enable an offline-first approach.

-
Data Base
-

Overview of Web Applications that can benefit from RxDB

-

Before diving into the specifics of RxDB, let's take a moment to understand the scope of web applications that can leverage its capabilities. Any web application that requires real-time data updates, offline functionality, and synchronization between clients and servers can greatly benefit from RxDB. Whether it's a collaborative document editing tool, a task management app, or a chat application, RxDB offers a robust foundation for building these types of applications.

-

Importance of data bases in Mobile Applications

-

Mobile applications have become an integral part of our lives, providing us with instant access to information and services. Behind the scenes, data bases play a pivotal role in storing and managing the data that powers these applications. data bases enable efficient data retrieval, updates, and synchronization, ensuring a smooth user experience even in challenging network conditions.

-

Introducing RxDB as a data base Solution

-

RxDB, short for Reactive data base, is a client-side data base solution designed specifically for web and mobile applications. Built on the principles of reactive programming, RxDB brings the power of observables and event-driven architecture to data management. With RxDB, developers can create applications that are responsive, offline-ready, and capable of seamless data synchronization between clients and servers.

-

Getting Started with RxDB

-

What is RxDB?

-

RxDB is an open-source JavaScript data base that leverages reactive programming and provides a seamless API for handling data. It is built on top of existing popular data base technologies, such as IndexedDB, and adds a layer of reactive features to enable real-time data updates and synchronization.

-

Reactive Data Handling

-

One of the standout features of RxDB is its reactive data handling. It utilizes observables to provide a stream of data that automatically updates whenever a change occurs. This reactive approach allows developers to build applications that respond instantly to data changes, ensuring a highly interactive and real-time user experience.

-

Offline-First Approach

-

RxDB embraces an offline-first approach, enabling applications to work seamlessly even when there is no internet connectivity. It achieves this by caching data locally on the client-side and synchronizing it with the server when the connection is available. This ensures that users can continue working with the application and have their data automatically synchronized when they come back online.

-

Data Replication

-

RxDB simplifies the process of data replication between clients and servers. It provides replication plugins that handle the synchronization of data in real-time. These plugins allow applications to keep data consistent across multiple clients, enabling collaborative features and ensuring that each client has the most up-to-date information.

-

Observable Queries

-

RxDB introduces the concept of observable queries, which are powerful tools for efficiently querying data. With observable queries, developers can subscribe to specific data queries and receive automatic updates whenever the underlying data changes. This eliminates the need for manual polling and ensures that applications always have access to the latest data.

-

Multi-Tab support

-

RxDB offers multi-tab support, allowing applications to function seamlessly across multiple browser tabs. This feature ensures that data changes in one tab are immediately reflected in all other open tabs, enabling a consistent user experience across different browser windows.

-

RxDB vs. Other data base Options

-

When considering data base options for web applications, developers often encounter choices like IndexedDB, OPFS, and Memory-based solutions. RxDB, while built on top of IndexedDB, stands out due to its reactive data handling capabilities and advanced synchronization features. Compared to other options, RxDB offers a more streamlined and powerful approach to managing data in web applications.

-

Different RxStorage layers for RxDB

-

RxDB provides various storage layers, known as RxStorage, that serve as interfaces to different underlying storage technologies. These layers include:

-
    -
  • LocalStorage RxStorage: Built on top of the browsers localStorage API.
  • -
  • IndexedDB RxStorage: This layer directly utilizes IndexedDB as its backend, providing a robust and widely supported storage option.
  • -
  • OPFS RxStorage: OPFS (Operational Transformation File System) is a file system-like storage layer that allows for efficient conflict resolution and real-time collaboration.
  • -
  • Memory RxStorage: Primarily used for testing and development, this storage layer keeps data in memory without persisting it to disk. -Each RxStorage layer has its strengths and is suited for different scenarios, enabling developers to choose the most appropriate option for their specific use case.
  • -
-

Synchronizing Data with RxDB between Clients and Servers

-

Offline-First Approach

-

As mentioned earlier, RxDB adopts an offline-first approach, allowing applications to function seamlessly in disconnected environments. By caching data locally, applications can continue to operate and make updates even without an internet connection. Once the connection is restored, RxDB's replication plugins take care of synchronizing the data with the server, ensuring consistency across all clients.

-

RxDB Replication Plugins

-

RxDB provides a range of replication plugins that simplify the process of synchronizing data between clients and servers. These plugins enable real-time replication using various protocols, such as WebSocket or HTTP, and handle conflict resolution strategies to ensure data integrity. By leveraging these replication plugins, developers can easily implement robust and scalable synchronization capabilities in their applications.

-

Advanced RxDB Features and Techniques

-

Indexing and Performance Optimization -To achieve optimal performance, RxDB offers indexing capabilities. Indexing allows for efficient data retrieval and faster query execution. By strategically defining indexes on frequently accessed fields, developers can significantly enhance the overall performance of their RxDB-powered applications.

-

Encryption of Local Data

-

In scenarios where data security is paramount, RxDB provides options for encrypting local data. By encrypting the data base contents, developers can ensure that sensitive information remains secure even if the underlying storage is compromised. RxDB integrates seamlessly with encryption libraries, making it easy to implement end-to-end encryption in applications.

-

Change Streams and Event Handling

-

RxDB offers change streams and event handling mechanisms, enabling developers to react to data changes in real-time. With change streams, applications can listen to specific collections or documents and trigger custom logic whenever a change occurs. This capability opens up possibilities for building real-time collaboration features, notifications, or other reactive behaviors.

-

JSON Key Compression

-

In scenarios where storage size is a concern, RxDB provides JSON key compression. By applying compression techniques to JSON keys, developers can significantly reduce the storage footprint of their data bases. This feature is particularly beneficial for applications dealing with large datasets or limited storage capacities.

-

Conclusion

-

RxDB provides an exceptional data base solution for web and mobile applications, empowering developers to create reactive, offline-ready, and synchronized applications. With its reactive data handling, offline-first approach, and replication plugins, RxDB simplifies the challenges of building real-time applications with data synchronization requirements. By embracing advanced features like indexing, encryption, change streams, and JSON key compression, developers can optimize performance, enhance security, and reduce storage requirements. As web and mobile applications continue to evolve, RxDB proves to be a reliable and powerful

-
Data Base
- - \ No newline at end of file diff --git a/docs/articles/data-base.md b/docs/articles/data-base.md deleted file mode 100644 index ad538f20903..00000000000 --- a/docs/articles/data-base.md +++ /dev/null @@ -1,81 +0,0 @@ -# Empower Web Apps with Reactive RxDB Data-base - -> Explore RxDB's reactive data-base solution for web and mobile. Enable offline-first experiences, real-time syncing, and secure data handling with ease. - -# RxDB as a data base: Empowering Web Applications with Reactive Data Handling -In the world of web applications, efficient data management plays a crucial role in delivering a seamless user experience. As mobile applications continue to dominate the digital landscape, the importance of robust data bases becomes evident. In this article, we will explore RxDB as a powerful data base solution for web applications. We will delve into its features, advantages, and advanced techniques, highlighting its ability to handle reactive data and enable an offline-first approach. - -
- - - -
- -## Overview of Web Applications that can benefit from RxDB -Before diving into the specifics of RxDB, let's take a moment to understand the scope of web applications that can leverage its capabilities. Any web application that requires real-time data updates, offline functionality, and synchronization between clients and servers can greatly benefit from RxDB. Whether it's a collaborative document editing tool, a task management app, or a chat application, RxDB offers a robust foundation for building these types of applications. - -## Importance of data bases in Mobile Applications -Mobile applications have become an integral part of our lives, providing us with instant access to information and services. Behind the scenes, data bases play a pivotal role in storing and managing the data that powers these applications. data bases enable efficient data retrieval, updates, and synchronization, ensuring a smooth user experience even in challenging network conditions. - -## Introducing RxDB as a data base Solution -RxDB, short for Reactive data base, is a client-side data base solution designed specifically for web and mobile applications. Built on the principles of reactive programming, RxDB brings the power of observables and event-driven architecture to data management. With RxDB, developers can create applications that are responsive, offline-ready, and capable of seamless data synchronization between clients and servers. - -## Getting Started with RxDB -### What is RxDB? -RxDB is an open-source JavaScript data base that leverages reactive programming and provides a seamless API for handling data. It is built on top of existing popular data base technologies, such as IndexedDB, and adds a layer of reactive features to enable real-time data updates and synchronization. - -### Reactive Data Handling -One of the standout features of RxDB is its reactive data handling. It utilizes observables to provide a stream of data that automatically updates whenever a change occurs. This reactive approach allows developers to build applications that respond instantly to data changes, ensuring a highly interactive and real-time user experience. - -### Offline-First Approach -RxDB embraces an offline-first approach, enabling applications to work seamlessly even when there is no internet connectivity. It achieves this by caching data locally on the client-side and synchronizing it with the server when the connection is available. This ensures that users can continue working with the application and have their data automatically synchronized when they come back online. - -### Data Replication -RxDB simplifies the process of data replication between clients and servers. It provides replication plugins that handle the synchronization of data in real-time. These plugins allow applications to keep data consistent across multiple clients, enabling collaborative features and ensuring that each client has the most up-to-date information. - -### Observable Queries -RxDB introduces the concept of observable queries, which are powerful tools for efficiently querying data. With observable queries, developers can subscribe to specific data queries and receive automatic updates whenever the underlying data changes. This eliminates the need for manual polling and ensures that applications always have access to the latest data. - -### Multi-Tab support -RxDB offers multi-tab support, allowing applications to function seamlessly across multiple [browser](./browser-database.md) tabs. This feature ensures that data changes in one tab are immediately reflected in all other open tabs, enabling a consistent user experience across different browser windows. - -### RxDB vs. Other data base Options -When considering data base options for web applications, developers often encounter choices like IndexedDB, [OPFS](../rx-storage-opfs.md), and Memory-based solutions. RxDB, while built on top of IndexedDB, stands out due to its reactive data handling capabilities and advanced synchronization features. Compared to other options, RxDB offers a more streamlined and powerful approach to managing data in web applications. - -### Different RxStorage layers for RxDB -RxDB provides various [storage layers](../rx-storage.md), known as RxStorage, that serve as interfaces to different underlying [storage](./browser-storage.md) technologies. These layers include: - -- [LocalStorage RxStorage](../rx-storage-localstorage.md): Built on top of the browsers [localStorage API](./localstorage.md). -- [IndexedDB RxStorage](../rx-storage-indexeddb.md): This layer directly utilizes IndexedDB as its backend, providing a robust and widely supported storage option. -- [OPFS RxStorage](../rx-storage-opfs.md): OPFS (Operational Transformation File System) is a file system-like storage layer that allows for efficient conflict resolution and real-time collaboration. -- Memory RxStorage: Primarily used for testing and development, this storage layer keeps data in memory without persisting it to disk. -Each RxStorage layer has its strengths and is suited for different scenarios, enabling developers to choose the most appropriate option for their specific use case. - -## Synchronizing Data with RxDB between Clients and Servers -### Offline-First Approach -As mentioned earlier, RxDB adopts an offline-first approach, allowing applications to function seamlessly in disconnected environments. By caching data locally, applications can continue to operate and make updates even without an internet connection. Once the connection is restored, RxDB's replication plugins take care of synchronizing the data with the server, ensuring consistency across all clients. - -### RxDB Replication Plugins -RxDB provides a range of replication plugins that simplify the process of synchronizing data between clients and servers. These plugins enable real-time replication using various protocols, such as WebSocket or HTTP, and handle conflict resolution strategies to ensure data integrity. By leveraging these replication plugins, developers can easily implement robust and scalable synchronization capabilities in their applications. - -### Advanced RxDB Features and Techniques -Indexing and Performance Optimization -To achieve optimal performance, RxDB offers indexing capabilities. Indexing allows for efficient data retrieval and faster query execution. By strategically defining indexes on frequently accessed fields, developers can significantly enhance the overall performance of their RxDB-powered applications. - -### Encryption of Local Data -In scenarios where data security is paramount, RxDB provides options for encrypting local data. By encrypting the data base contents, developers can ensure that sensitive information remains secure even if the underlying storage is compromised. RxDB integrates seamlessly with encryption libraries, making it easy to implement end-to-end encryption in applications. - -### Change Streams and Event Handling -RxDB offers change streams and event handling mechanisms, enabling developers to react to data changes in real-time. With change streams, applications can listen to specific collections or documents and trigger custom logic whenever a change occurs. This capability opens up possibilities for building real-time collaboration features, notifications, or other reactive behaviors. - -### JSON Key Compression -In scenarios where storage size is a concern, RxDB provides JSON [key compression](../key-compression.md). By applying compression techniques to JSON keys, developers can significantly reduce the storage footprint of their data bases. This feature is particularly beneficial for applications dealing with large datasets or [limited storage capacities](./indexeddb-max-storage-limit.md). - -## Conclusion -RxDB provides an exceptional data base solution for web and mobile applications, empowering developers to create reactive, offline-ready, and synchronized applications. With its reactive data handling, offline-first approach, and replication plugins, RxDB simplifies the challenges of building real-time applications with data synchronization requirements. By embracing advanced features like indexing, encryption, change streams, and JSON key compression, developers can optimize performance, enhance security, and reduce storage requirements. As web and [mobile applications](./mobile-database.md) continue to evolve, RxDB proves to be a reliable and powerful - -
- - - -
diff --git a/docs/articles/embedded-database.html b/docs/articles/embedded-database.html deleted file mode 100644 index 9da2f7a54db..00000000000 --- a/docs/articles/embedded-database.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - -Embedded Database, Real-time Speed - RxDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Using RxDB as an Embedded Database

-

In modern UI applications, efficient data storage is a crucial aspect for seamless user experiences. One powerful solution for achieving this is by utilizing an embedded database. In this article, we will explore the concept of an embedded database and delve into the benefits of using RxDB as an embedded database in UI applications. We will also discuss why RxDB stands out as a robust choice for real-time applications with embedded database functionality.

-
JavaScript Embedded Database
-

What is an Embedded Database?

-

An embedded database refers to a client-side database system that is integrated directly within an application. It is designed to operate within the client environment, such as a web browser or a mobile app. This approach eliminates the need for a separate database server and allows the database to run locally on the client device.

-

Embedded Database in UI Applications

-

In the context of UI applications, an embedded database serves as a local data storage solution. It enables applications to efficiently manage data, facilitate real-time updates, and enhance performance. Let's explore some of the benefits of using an embedded database compared to a traditional server database:

-
    -
  • Replicating database state becomes easier: Implementing real-time data synchronization and replication is simpler with an embedded database compared to complex REST routes. The embedded nature allows for efficient replication of the database state across multiple instances of the application.
  • -
  • Use the database for caching: An embedded database can be utilized for caching frequently accessed data. This caching mechanism enhances performance and reduces the need for repeated network requests, resulting in faster data retrieval.
  • -
  • Building real-time applications is easier with local data: By leveraging local data storage, real-time applications can easily update the user interface in response to data changes. This approach simplifies the development of real-time features and enhances the responsiveness of the application.
  • -
  • Store local data with encryption: Embedded databases, like RxDB, offer the ability to store local data with encryption. This ensures that sensitive information remains protected even when stored locally on the client device.
  • -
  • Data is offline accessible: With an embedded database, data remains accessible even when the application is offline. Users can continue to interact with the application and access their data seamlessly, irrespective of their internet connectivity.
  • -
  • Faster initial application start time: Since the data is already stored locally, there is no need for initial data fetching from a remote server. This significantly reduces the application's startup time and allows users to engage with the application more quickly.
  • -
  • Improved scalability with local queries: Embedded databases, such as RxDB, perform queries locally on the client device instead of relying on server round-trips. This reduces latency and enhances scalability, particularly when dealing with large datasets or high query volumes.
  • -
  • Seamless integration with JavaScript frameworks: Embedded databases, including RxDB, integrate seamlessly with popular JavaScript frameworks like Angular, React.js, Vue.js, and Svelte. This compatibility allows developers to leverage the capabilities of these frameworks while benefiting from embedded database functionality.
  • -
  • Running queries locally has low latency: With an embedded database, queries are executed locally on the client device, resulting in minimal latency. This improves the overall performance and responsiveness of the application.
  • -
  • Data is portable and always accessible by the user: Embedded databases enable data portability, allowing users to seamlessly transition between devices while maintaining their data and application state. This ensures that data is always accessible and available to the user.
  • -
  • Using a local database for state management: Instead of relying on additional state management libraries like Redux or NgRx, an embedded database can be used for local state management. This simplifies state management and ensures data consistency within the application.
  • -
-

Why RxDB as an Embedded Database for Real-time Applications

-

RxDB is a JavaScript-based embedded database that offers numerous advantages for building real-time applications. Let's explore why RxDB is a compelling choice:

-
    -
  • Observable Queries (RxJS): RxDB leverages the power of Observables through RxJS, enabling developers to create queries that automatically update the user interface on data changes. This reactive approach simplifies UI updates and ensures real-time synchronization of data.
  • -
  • NoSQL JSON Documents for UIs: RxDB utilizes NoSQL (JSON) documents as its data model, aligning seamlessly with the requirements of modern UI development. JavaScript's native support for JSON objects makes NoSQL documents a natural fit for UI-driven applications.
  • -
  • Better TypeScript Support Compared to SQL: RxDB's NoSQL approach provides excellent TypeScript support. The flexibility of working with JSON objects enables robust typing and enhanced development experiences, ensuring type safety and reducing runtime errors.
  • -
  • Observable Document Fields: RxDB allows developers to observe individual fields within documents. This granularity enables efficient tracking of specific data changes and facilitates targeted UI updates, enhancing performance and responsiveness.
  • -
  • Made in JavaScript, Optimized for JavaScript Applications: Being built entirely in JavaScript, RxDB is optimized for JavaScript applications. It leverages JavaScript's capabilities and integrates seamlessly with JavaScript frameworks and libraries, making it a natural choice for JavaScript developers.
  • -
  • Optimized Observed Queries with the EventReduce Algorithm: RxDB incorporates the EventReduce algorithm to optimize observed queries. This algorithm reduces the number of emitted events during query execution, resulting in enhanced query performance and reduced overhead.
  • -
  • Built-in Multi-tab Support: RxDB provides built-in multi-tab support, allowing multiple instances of an application to share and synchronize data seamlessly. This feature enables collaborative and real-time scenarios across multiple browser tabs or windows.
  • -
  • Handling of Schema Changes across Multiple Client Devices: With RxDB, handling schema changes across multiple client devices becomes straightforward. RxDB's schema migration capabilities ensure that applications can seamlessly adapt to evolving data structures, providing a consistent experience across different devices.
  • -
  • Storing Documents Compressed: RxDB offers the ability to store documents in a compressed format. This reduces the storage footprint and improves performance, especially when dealing with large datasets.
  • -
  • Flexible Storage Layer and Cross-platform Compatibility: RxDB provides a flexible storage layer that can be reused across various platforms, including Electron.js, React Native, hybrid apps (via Capacitor.js), and browsers. This cross-platform compatibility simplifies development and enables code reuse across different environments.
  • -
  • Replication Algorithm for Backend Compatibility: RxDB's replication algorithm is open-source and can be made compatible with various backend solutions, such as self-hosted servers, Firebase, CouchDB, NATS, WebSockets, and more. This flexibility allows developers to choose their preferred backend infrastructure while benefiting from RxDB's embedded database capabilities.
  • -
-
JavaScript Embedded Database
-

Follow Up

-

To further explore RxDB and leverage its capabilities as an embedded database, the following resources can be helpful:

-
    -
  • RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.
  • -
  • RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects.
  • -
-

By utilizing RxDB as an embedded database in UI applications, developers can harness the power of efficient data management, real-time updates, and enhanced user experiences. RxDB's features and benefits make it a compelling choice for building modern, responsive, and scalable applications.

- - \ No newline at end of file diff --git a/docs/articles/embedded-database.md b/docs/articles/embedded-database.md deleted file mode 100644 index ccfa9468708..00000000000 --- a/docs/articles/embedded-database.md +++ /dev/null @@ -1,59 +0,0 @@ -# Embedded Database, Real-time Speed - RxDB - -> Unleash the power of embedded databases with RxDB. Explore real-time replication, offline access, and reactive queries for modern JavaScript apps. - -# Using RxDB as an Embedded Database -In modern UI applications, efficient data storage is a crucial aspect for seamless user experiences. One powerful solution for achieving this is by utilizing an embedded database. In this article, we will explore the concept of an embedded database and delve into the benefits of using [RxDB](https://rxdb.info/) as an embedded database in UI applications. We will also discuss why RxDB stands out as a robust choice for real-time applications with embedded database functionality. - -
- - - -
- -## What is an Embedded Database? -An embedded database refers to a client-side database system that is integrated directly within an application. It is designed to operate within the client environment, such as a web browser or a [mobile](./mobile-database.md) app. This approach eliminates the need for a separate database server and allows the database to run locally on the client device. - -## Embedded Database in UI Applications -In the context of UI applications, an embedded database serves as a local data storage solution. It enables applications to efficiently manage data, facilitate real-time updates, and enhance performance. Let's explore some of the benefits of using an embedded database compared to a traditional server database: - -- Replicating database state becomes easier: Implementing real-time data synchronization and replication is simpler with an embedded database compared to complex REST routes. The embedded nature allows for efficient replication of the database state across multiple instances of the application. -- Use the database for caching: An embedded database can be utilized for caching frequently accessed data. This caching mechanism enhances performance and reduces the need for repeated network requests, resulting in faster data retrieval. -- Building real-time applications is easier with local data: By leveraging local data storage, real-time applications can easily update the user interface in response to data changes. This approach simplifies the development of real-time features and enhances the responsiveness of the application. -- Store local data with [encryption](../encryption.md): Embedded databases, like RxDB, offer the ability to store local data with encryption. This ensures that sensitive information remains protected even when stored locally on the client device. -- Data is offline accessible: With an embedded database, data remains accessible even when the application is offline. Users can continue to interact with the application and access their data seamlessly, irrespective of their internet connectivity. -- Faster initial application start time: Since the data is already stored locally, there is no need for initial data fetching from a remote server. This significantly reduces the application's startup time and allows users to engage with the application more quickly. -- Improved scalability with local queries: Embedded databases, such as RxDB, perform queries locally on the client device instead of relying on server round-trips. This reduces latency and enhances scalability, particularly when dealing with large datasets or high query volumes. -- Seamless integration with JavaScript frameworks: Embedded databases, including RxDB, integrate seamlessly with popular JavaScript frameworks like Angular, React.js, [Vue.js](./vue-database.md), and Svelte. This compatibility allows developers to leverage the capabilities of these frameworks while benefiting from embedded database functionality. -- Running queries locally has low latency: With an embedded database, queries are executed locally on the client device, resulting in minimal latency. This improves the overall performance and responsiveness of the application. -- Data is portable and always accessible by the user: Embedded databases enable data portability, allowing users to seamlessly transition between devices while maintaining their data and application state. This ensures that data is always accessible and available to the user. -- Using a [local database](./local-database.md) for state management: Instead of relying on additional state management libraries like Redux or NgRx, an embedded database can be used for local state management. This simplifies state management and ensures data consistency within the application. - -## Why RxDB as an Embedded Database for Real-time Applications -RxDB is a JavaScript-based embedded database that offers numerous advantages for building real-time applications. Let's explore why RxDB is a compelling choice: - -- [Observable Queries](../rx-query.md) (RxJS): RxDB leverages the power of Observables through RxJS, enabling developers to create queries that automatically update the user interface on data changes. This reactive approach simplifies UI updates and ensures real-time synchronization of data. -- [NoSQL JSON Documents](./json-database.md) for UIs: RxDB utilizes NoSQL (JSON) documents as its data model, aligning seamlessly with the requirements of modern UI development. JavaScript's native support for JSON objects makes NoSQL documents a natural fit for UI-driven applications. -- Better TypeScript Support Compared to SQL: RxDB's NoSQL approach provides excellent TypeScript support. The flexibility of working with JSON objects enables robust typing and enhanced development experiences, ensuring type safety and reducing runtime errors. -- [Observable Document Fields](../rx-document.md): RxDB allows developers to observe individual fields within documents. This granularity enables efficient tracking of specific data changes and facilitates targeted UI updates, enhancing performance and responsiveness. -- Made in JavaScript, Optimized for JavaScript Applications: Being built entirely in JavaScript, RxDB is optimized for JavaScript applications. It leverages JavaScript's capabilities and integrates seamlessly with JavaScript frameworks and libraries, making it a natural choice for JavaScript developers. -- Optimized Observed Queries with the [EventReduce Algorithm](https://github.com/pubkey/event-reduce): RxDB incorporates the EventReduce algorithm to optimize observed queries. This algorithm reduces the number of emitted events during query execution, resulting in enhanced query performance and reduced overhead. -- Built-in Multi-tab Support: RxDB provides built-in multi-tab support, allowing multiple instances of an application to share and synchronize data seamlessly. This feature enables collaborative and real-time scenarios across multiple browser tabs or windows. -- Handling of Schema Changes across Multiple Client Devices: With RxDB, handling schema changes across multiple client devices becomes straightforward. RxDB's schema [migration capabilities](../migration-schema.md) ensure that applications can seamlessly adapt to evolving data structures, providing a consistent experience across different devices. -- Storing Documents Compressed: RxDB offers the ability to store documents in a compressed format. This reduces the storage footprint and improves performance, especially when dealing with large datasets. -- Flexible Storage Layer and Cross-platform Compatibility: RxDB provides a flexible storage layer that can be reused across various platforms, including [Electron.js](../electron-database.md), [React Native](../react-native-database.md), hybrid apps (via Capacitor.js), and browsers. This cross-platform compatibility simplifies development and enables code reuse across different environments. -- Replication Algorithm for Backend Compatibility: RxDB's replication algorithm is open-source and can be made compatible with various backend solutions, such as self-hosted servers, Firebase, [CouchDB](../replication-couchdb.md), NATS, WebSockets, and more. This flexibility allows developers to choose their preferred backend infrastructure while benefiting from RxDB's embedded database capabilities. - -
- - - -
- -## Follow Up -To further explore [RxDB](https://rxdb.info/) and leverage its capabilities as an embedded database, the following resources can be helpful: - -- [RxDB GitHub Repository](https://github.com/pubkey/rxdb): Visit the official GitHub repository of RxDB to access the source code, documentation, and community support. -- [RxDB Quickstart](../quickstart.md): Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects. - -By utilizing [RxDB](https://rxdb.info/) as an embedded database in UI applications, developers can harness the power of efficient data management, real-time updates, and enhanced user experiences. RxDB's features and benefits make it a compelling choice for building modern, responsive, and scalable applications. diff --git a/docs/articles/firebase-realtime-database-alternative.html b/docs/articles/firebase-realtime-database-alternative.html deleted file mode 100644 index 9fde2225356..00000000000 --- a/docs/articles/firebase-realtime-database-alternative.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - -RxDB - Firebase Realtime Database Alternative to Sync With Your Own Backend | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend

-

Are you on the lookout for a Firebase Realtime Database alternative that gives you greater freedom, deeper offline capabilities, and allows you to seamlessly integrate with any backend? RxDB (Reactive Database) might be the perfect choice. This local-first, NoSQL data store runs entirely on the client while supporting real-time updates and robust syncing with any server environment—making it a strong contender against Firebase Realtime Database's limitations and potential vendor lock-in.

-
JavaScript Database
-

Why RxDB Is an Excellent Firebase Realtime Database Alternative

-

1. Complete Offline-First Experience

-

Unlike Firebase Realtime Database, which relies on central infrastructure to process data, RxDB is fully embedded within your client application (including browsers, Node.js, Electron, and React Native). This design means your app stays completely functional offline, since all data reads and writes happen locally. When connectivity is restored, RxDB's syncing framework automatically reconciles local changes with your remote backend.

-

2. Freedom to Use Any Server or Cloud

-

While Firebase Realtime Database ties you into Google's ecosystem, RxDB allows you to choose any hosting environment. You can:

-
    -
  • Host your data on your own servers or private cloud.
  • -
  • Integrate with relational databases like PostgreSQL or other NoSQL options such as CouchDB.
  • -
  • Build custom endpoints using REST, GraphQL, or any other protocol.
  • -
-

This flexibility ensures you're not locked into a single vendor and can adapt your backend strategy as your project evolves.

-

3. Advanced Conflict Handling

-

Firebase Realtime Database typically updates data with a simple last-in-wins approach. RxDB, on the other hand, lets you implement more sophisticated conflict resolution logic. Using revisions and conflict handlers, RxDB can merge concurrent edits or preserve multiple versions—ensuring your application remains consistent even when multiple clients modify the same data at the same time.

-

4. Lower Cloud Costs for Read-Heavy Apps

-

When you rely on Firebase Realtime Database, each query or listener can translate into ongoing reads, potentially running up your monthly bill. With RxDB, all queries are performed locally. Your app only communicates with the backend to sync document changes, significantly reducing bandwidth and hosting expenses for applications that frequently read data.

-

5. Powerful Local Queries

-

If you've hit Firebase Realtime Database's querying limits, RxDB offers a far more robust approach to data retrieval. You can:

-
    -
  • Define custom indexes for faster local lookups.
  • -
  • Perform sophisticated filters, joins, or full-text searches right on the client.
  • -
  • Subscribe to real-time data updates through RxDB's reactive query engine.
  • -
-

Because these operations happen locally, your UI updates instantly, providing a snappy user experience.

-

6. True Offline Initialization

-

While Firebase offers some offline caching, it often requires an initial connection for authentication or to seed local data. RxDB, however, is built to handle an offline-start scenario. Users can begin working with the application immediately, regardless of connectivity, and any modifications they make will sync once the network is available again.

-

7. Works Everywhere JavaScript Runs

-

One of RxDB's core strengths is its ability to run in any JavaScript environment. Whether you're building a web app that uses IndexedDB in the browser, an Electron desktop program, or a React Native mobile application, RxDB's swappable storage adapts to your runtime of choice. This consistency makes code-sharing and cross-platform development far simpler than being tied to a single backend system.

-
-

How RxDB's Syncing Mechanism Operates

-

RxDB employs its own Sync Engine to manage data flow between your client and remote servers. Replication revolves around:

-
    -
  1. Pull: Retrieving updated or newly created documents from the server.
  2. -
  3. Push: Sending local changes to the backend for persistence.
  4. -
  5. Live Updates: Continuously streaming changes to and from the backend for real-time synchronization.
  6. -
-

Sample Code: Sync RxDB With a Custom Endpoint

-
import { createRxDatabase } from 'rxdb/plugins/core';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
-import { replicateRxCollection } from 'rxdb/plugins/replication';
- 
-async function initDB() {
-  const db = await createRxDatabase({
-    name: 'localdb',
-    storage: getRxStorageLocalstorage(),
-    multiInstance: true,
-    eventReduce: true
-  });
- 
-  await db.addCollections({
-    tasks: {
-      schema: {
-        title: 'task schema',
-        version: 0,
-        type: 'object',
-        primaryKey: 'id',
-        properties: {
-          id: { type: 'string', maxLength: 100 },
-          title: { type: 'string' },
-          complete: { type: 'boolean' }
-        }
-      }
-    }
-  });
- 
-  // Start a custom replication
-  replicateRxCollection({
-    collection: db.tasks,
-    replicationIdentifier: 'custom-tasks-api',
-    push: {
-      handler: async (docs) => {
-        // post local changes to your server
-        const resp = await fetch('https://yourapi.com/tasks/push', {
-          method: 'POST',
-          body: JSON.stringify({ changes: docs })
-        });
-        return await resp.json(); // return conflicting documents if any
-      }
-    },
-    pull: {
-      handler: async (lastCheckpoint, batchSize) => {
-        // fetch new/updated items from your server
-        const response = await fetch(
-          `https://yourapi.com/tasks/pull?checkpoint=${JSON.stringify(
-            lastCheckpoint
-          )}&limit=${batchSize}`
-        );
-        return await response.json();
-      }
-    },
-    live: true
-  });
- 
-  return db;
-}
-

Setting Up P2P Replication Over WebRTC

-

In addition to using a centralized backend, RxDB supports peer-to-peer synchronization through WebRTC, enabling devices to share data directly.

-
import {
-  replicateWebRTC,
-  getConnectionHandlerSimplePeer
-} from 'rxdb/plugins/replication-webrtc';
- 
-const webrtcPool = await replicateWebRTC({
-  collection: db.tasks,
-  topic: 'p2p-topic-123',
-  connectionHandlerCreator: getConnectionHandlerSimplePeer({
-    signalingServerUrl: 'wss://signaling.rxdb.info/',
-    wrtc: require('node-datachannel/polyfill'),
-    webSocketConstructor: require('ws').WebSocket
-  })
-});
- 
-webrtcPool.error$.subscribe((error) => {
-  console.error('P2P error:', error);
-});
-

Here, any client that joins the same topic communicates changes to other peers, all without requiring a traditional client-server model.

-

Quick Steps to Get Started

-
    -
  1. Install RxDB
  2. -
-
npm install rxdb rxjs
-
    -
  1. Create a Local Database
  2. -
-
import { createRxDatabase } from 'rxdb/plugins/core';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
- 
-const db = await createRxDatabase({
-  name: 'myLocalDB',
-  storage: getRxStorageLocalstorage()
-});
-Add a Collection
-ts
-Kopieren
-await db.addCollections({
-  notes: {
-    schema: {
-      title: 'notes schema',
-      version: 0,
-      primaryKey: 'id',
-      type: 'object',
-      properties: {
-        id: { type: 'string', maxLenght: 100 },
-        content: { type: 'string' }
-      }
-    }
-  }
-});
-
    -
  1. Synchronize
  2. -
-

Use one of the Replication Plugins to connect with your preferred backend.

-

Is RxDB the Right Solution for You?

-
    -
  • Long Offline Use: If your users need to work without an internet connection, RxDB's built-in offline-first design stands out compared to Firebase Realtime Database's partial offline approach.
  • -
  • Custom or Complex Queries: RxDB lets you perform your queries locally, define indexing, and handle even complex transformations locally - no extra call to an external API.
  • -
  • Avoid Vendor Lock-In: If you anticipate needing to move or adapt your backend later, you can do so without rewriting how your client manages its data.
  • -
  • Peer-to-Peer Collaboration: Whether you need quick demos or real production use, WebRTC replication can link your users directly without central coordination of data storage.
  • -
- - \ No newline at end of file diff --git a/docs/articles/firebase-realtime-database-alternative.md b/docs/articles/firebase-realtime-database-alternative.md deleted file mode 100644 index aa8ae045a60..00000000000 --- a/docs/articles/firebase-realtime-database-alternative.md +++ /dev/null @@ -1,190 +0,0 @@ -# RxDB - Firebase Realtime Database Alternative to Sync With Your Own Backend - -> Looking for a Firebase Realtime Database alternative? RxDB offers a fully offline, vendor-agnostic NoSQL solution with advanced conflict resolution and multi-platform support. - -# RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend - -Are you on the lookout for a **Firebase Realtime Database alternative** that gives you greater freedom, deeper offline capabilities, and allows you to seamlessly integrate with any backend? **RxDB** (Reactive Database) might be the perfect choice. This [local-first](./local-first-future.md), NoSQL data store runs entirely on the client while supporting real-time updates and robust syncing with any server environment—making it a strong contender against Firebase Realtime Database's limitations and potential vendor lock-in. - -
- - - -
- -## Why RxDB Is an Excellent Firebase Realtime Database Alternative - -### 1. Complete Offline-First Experience -Unlike Firebase Realtime Database, which relies on central infrastructure to process data, RxDB is fully embedded within your client application (including [browsers](./browser-database.md), [Node.js](../nodejs-database.md), [Electron](../electron-database.md), and [React Native](../react-native-database.md)). This design means your app stays completely functional offline, since all data reads and writes happen locally. When connectivity is restored, RxDB's syncing framework automatically reconciles local changes with your remote backend. - -### 2. Freedom to Use Any Server or Cloud -While Firebase Realtime Database ties you into Google's ecosystem, RxDB allows you to choose any hosting environment. You can: -- Host your data on your own servers or private cloud. -- Integrate with relational databases like [PostgreSQL](../replication-http.md) or other NoSQL options such as [CouchDB](../replication-couchdb.md). -- Build custom endpoints using [REST](../replication-http.md), [GraphQL](../replication-graphql.md), or any other protocol. - -This flexibility ensures you're not locked into a single vendor and can adapt your backend strategy as your project evolves. - -### 3. Advanced Conflict Handling -Firebase Realtime Database typically updates data with a simple last-in-wins approach. RxDB, on the other hand, lets you implement more sophisticated conflict resolution logic. Using [revisions and conflict handlers](../transactions-conflicts-revisions.md#custom-conflict-handler), RxDB can merge concurrent edits or preserve multiple versions—ensuring your application remains consistent even when multiple clients modify the same data at the same time. - -### 4. Lower Cloud Costs for Read-Heavy Apps -When you rely on Firebase Realtime Database, each query or listener can translate into ongoing reads, potentially running up your monthly bill. With RxDB, all queries are performed [locally](../offline-first.md). Your app only communicates with the backend to sync document changes, significantly reducing bandwidth and hosting expenses for applications that frequently read data. - -### 5. Powerful Local Queries -If you've hit Firebase Realtime Database's querying limits, RxDB offers a far more robust approach to data retrieval. You can: -- Define custom indexes for faster local lookups. -- Perform sophisticated filters, joins, or full-text searches right on the client. -- Subscribe to real-time data updates through RxDB's [reactive query engine](../reactivity.md). - -Because these operations happen locally, your [UI updates](./optimistic-ui.md) instantly, providing a snappy user experience. - -### 6. True Offline Initialization -While Firebase offers some offline caching, it often requires an initial connection for authentication or to seed local data. RxDB, however, is built to handle an **offline-start** scenario. Users can begin working with the application immediately, regardless of connectivity, and any modifications they make will sync once the network is available again. - -### 7. Works Everywhere JavaScript Runs -One of RxDB's core strengths is its ability to run in **any JavaScript environment**. Whether you're building a web app that uses IndexedDB in the browser, an [Electron](../electron-database.md) desktop program, or a [React Native](../react-native-database.md) mobile application, RxDB's **swappable storage** adapts to your runtime of choice. This consistency makes code-sharing and cross-platform development far simpler than being tied to a single backend system. - ---- - -## How RxDB's Syncing Mechanism Operates - -RxDB employs its own [Sync Engine](../replication.md) to manage data flow between your client and remote [servers](../rx-server.md). Replication revolves around: -1. **Pull**: Retrieving updated or newly created documents from the server. -2. **Push**: Sending local changes to the backend for persistence. -3. **Live Updates**: Continuously streaming changes to and from the backend for real-time synchronization. - -## Sample Code: Sync RxDB With a Custom Endpoint - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -import { replicateRxCollection } from 'rxdb/plugins/replication'; - -async function initDB() { - const db = await createRxDatabase({ - name: 'localdb', - storage: getRxStorageLocalstorage(), - multiInstance: true, - eventReduce: true - }); - - await db.addCollections({ - tasks: { - schema: { - title: 'task schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string', maxLength: 100 }, - title: { type: 'string' }, - complete: { type: 'boolean' } - } - } - } - }); - - // Start a custom replication - replicateRxCollection({ - collection: db.tasks, - replicationIdentifier: 'custom-tasks-api', - push: { - handler: async (docs) => { - // post local changes to your server - const resp = await fetch('https://yourapi.com/tasks/push', { - method: 'POST', - body: JSON.stringify({ changes: docs }) - }); - return await resp.json(); // return conflicting documents if any - } - }, - pull: { - handler: async (lastCheckpoint, batchSize) => { - // fetch new/updated items from your server - const response = await fetch( - `https://yourapi.com/tasks/pull?checkpoint=${JSON.stringify( - lastCheckpoint - )}&limit=${batchSize}` - ); - return await response.json(); - } - }, - live: true - }); - - return db; -} -``` - -### Setting Up P2P Replication Over WebRTC -In addition to using a centralized backend, RxDB supports peer-to-peer synchronization through WebRTC, enabling devices to share data directly. - -```ts -import { - replicateWebRTC, - getConnectionHandlerSimplePeer -} from 'rxdb/plugins/replication-webrtc'; - -const webrtcPool = await replicateWebRTC({ - collection: db.tasks, - topic: 'p2p-topic-123', - connectionHandlerCreator: getConnectionHandlerSimplePeer({ - signalingServerUrl: 'wss://signaling.rxdb.info/', - wrtc: require('node-datachannel/polyfill'), - webSocketConstructor: require('ws').WebSocket - }) -}); - -webrtcPool.error$.subscribe((error) => { - console.error('P2P error:', error); -}); -``` - -Here, any client that joins the same topic communicates changes to other peers, all without requiring a traditional client-server model. - -## Quick Steps to Get Started - -1. Install RxDB -```bash -npm install rxdb rxjs -``` - -2. Create a Local Database -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -const db = await createRxDatabase({ - name: 'myLocalDB', - storage: getRxStorageLocalstorage() -}); -Add a Collection -ts -Kopieren -await db.addCollections({ - notes: { - schema: { - title: 'notes schema', - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { type: 'string', maxLenght: 100 }, - content: { type: 'string' } - } - } - } -}); -``` - -3. Synchronize - -Use one of the [Replication Plugins](../replication.md) to connect with your preferred backend. - -### Is RxDB the Right Solution for You? - -- **Long Offline Use**: If your users need to work without an internet connection, RxDB's built-in offline-first design stands out compared to Firebase Realtime Database's partial offline approach. -- **Custom or Complex Queries**: RxDB lets you perform your [queries](../rx-query.md) locally, define [indexing](../rx-schema.md#indexes), and handle even complex [transformations](../rx-pipeline.md) locally - no extra call to an external API. -- **Avoid Vendor Lock-In**: If you anticipate needing to move or adapt your backend later, you can do so without rewriting how your client manages its data. -- **Peer-to-Peer Collaboration**: Whether you need quick demos or real production use, [WebRTC replication](../replication-webrtc.md) can link your users directly without central coordination of data storage. diff --git a/docs/articles/firestore-alternative.html b/docs/articles/firestore-alternative.html deleted file mode 100644 index 18ee053a1be..00000000000 --- a/docs/articles/firestore-alternative.html +++ /dev/null @@ -1,225 +0,0 @@ - - - - - -RxDB - Firestore Alternative to Sync with Your Own Backend | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RxDB - The Firestore Alternative That Can Sync with Your Own Backend

-

If you're seeking a Firestore alternative, you're likely looking for a way to:

-
    -
  • Avoid vendor lock-in while still enjoying real-time replication.
  • -
  • Reduce cloud usage costs by reading data locally instead of constantly fetching from the server.
  • -
  • Customize how you store, query, and secure your data.
  • -
  • Implement advanced conflict resolution strategies beyond Firestore's last-write-wins approach.
  • -
-

Enter RxDB (Reactive Database) - a local-first, NoSQL database for JavaScript applications that can sync in real time with any backend of your choice. Whether you're tired of the limitations and fees associated with Firebase Cloud Firestore or simply need more flexibility, RxDB might be the Firestore alternative you've been searching for.

-
JavaScript Database
-

What Makes RxDB a Great Firestore Alternative?

-

Firestore is convenient for many projects, but it does lock you into Google's ecosystem. Below are some of the key advantages you gain by choosing RxDB:

-

1. Fully Offline-First

-

RxDB runs directly in your client application (browser, Node.js, Electron, React Native, etc.). Data is stored locally, so your application remains fully functional even when offline. When the device returns online, RxDB's flexible replication protocol synchronizes your local changes with any remote endpoint.

-

2. Freedom to Use Any Backend

-

Unlike Firestore, RxDB doesn't require a proprietary hosting service. You can:

- -

This backend-agnostic approach protects you from vendor lock-in. Your application's client-side data storage remains consistent; only your replication logic (or plugin) changes if you switch servers.

-

3. Advanced Conflict Resolution

-

Firestore enforces a last-write-wins conflict resolution strategy. This might cause issues if multiple users or devices update the same data in complex ways.

-

RxDB lets you:

-
    -
  • Implement custom conflict resolution via revisions.
  • -
  • Store partial merges, track versions, or preserve multiple user edits.
  • -
  • Fine-tune how your data merges to ensure consistency across distributed systems.
  • -
-

4. Reduced Cloud Costs

-

Firestore queries often count as billable reads. With RxDB, queries run locally against your local state - no repeated network calls or extra charges. You pay only for the data actually synced, not every read. For read-heavy apps, using RxDB as a Firestore alternative can significantly reduce costs.

-

5. No Limits on Query Features

-

Firestore's query engine is limited by certain constraints (e.g., no advanced joins, limited indexing). With RxDB:

- -

6. True Offline-Start Support

-

While Firestore does have offline caching, it often requires an online check at app initialization for authentication. RxDB is truly offline-first; you can launch the app and write data even if the device never goes online initially. It's ready whenever the user is.

-

7. Cross-Platform: Any JavaScript Runtime

-

RxDB is designed to run in any environment that can execute JavaScript. Whether you’re building a web app in the browser, an Electron desktop application, a React Native mobile app, or a command-line tool with Node.js, RxDB’s storage layer is swappable to fit your runtime’s capabilities.

-
    -
  • In the browser, store data in IndexedDB or OPFS.
  • -
  • In Node.js, use LevelDB or other supported storages.
  • -
  • In React Native, pick from a range of adapters suited for mobile devices.
  • -
  • In Electron, rely on fast local storage with zero changes to your application code.
  • -
-
-

How Does RxDB's Sync Work?

-

RxDB replication is powered by its own Sync Engine. This simple yet robust protocol enables:

-
    -
  1. Pull: Fetch new or updated documents from the server.
  2. -
  3. Push: Send local changes back to the server.
  4. -
  5. Live Real-Time: Once you're caught up, you can opt for event-based streaming instead of continuous polling.
  6. -
-

Code Example: Sync RxDB with a Custom Backend

-
import { createRxDatabase } from 'rxdb/plugins/core';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
-import { replicateRxCollection } from 'rxdb/plugins/replication';
- 
-async function initDB() {
-  const db = await createRxDatabase({
-    name: 'mydb',
-    storage: getRxStorageLocalstorage(),
-    multiInstance: true,
-    eventReduce: true
-  });
- 
-  await db.addCollections({
-    tasks: {
-      schema: {
-        title: 'task schema',
-        version: 0,
-        type: 'object',
-        primaryKey: 'id',
-        properties: {
-          id: { type: 'string', maxLength: 100 },
-          title: { type: 'string' },
-          done: { type: 'boolean' }
-        }
-      }
-    }
-  });
- 
-  // Start a custom REST-based replication
-  replicateRxCollection({
-    collection: db.tasks,
-    replicationIdentifier: 'my-tasks-rest-api',
-    push: {
-      handler: async (documents) => {
-        // Send docs to your REST endpoint
-        const res = await fetch('https://myapi.com/push', {
-          method: 'POST',
-          body: JSON.stringify({ docs: documents })
-        });
-        // Return conflicts if any
-        return await res.json();
-      }
-    },
-    pull: {
-      handler: async (lastCheckpoint, batchSize) => {
-        // Fetch from your REST endpoint
-        const res = await fetch(`https://myapi.com/pull?checkpoint=${JSON.stringify(lastCheckpoint)}&limit=${batchSize}`);
-        return await res.json();
-      }
-    },
-    live: true // keep watching for changes
-  });
- 
-  return db;
-}
-

By swapping out the handler implementations or using an official plugin (e.g., GraphQL, CouchDB, Firestore replication, etc.), you can adapt to any backend or data source. RxDB thus becomes a flexible alternative to Firestore while maintaining real-time capabilities.

-

Getting Started with RxDB as a Firestore Alternative

-

Install RxDB:

-
npm install rxdb rxjs
-

Create a Database:

-
import { createRxDatabase } from 'rxdb/plugins/core';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
- 
-const db = await createRxDatabase({
-  name: 'mydb',
-  storage: getRxStorageLocalstorage()
-});
-

Define Collections:

-
await db.addCollections({
-  items: {
-    schema: {
-      title: 'items schema',
-      version: 0,
-      primaryKey: 'id',
-      type: 'object',
-      properties: {
-        id: { type: 'string', maxLength: 100 },
-        text: { type: 'string' }
-      }
-    }
-  }
-});
-

Sync

-

Use a Replication Plugin to connect with a custom backend or existing database.

-

For a Firestore-specific approach, RxDB Firestore Replication also exists if you want to combine local indexing and advanced queries with a Cloud Firestore backend. But if you really want to replace Firestore entirely - just point RxDB to your new backend.

-

Example: Start a WebRTC P2P Replication

-

In addition to syncing with a central server, RxDB also supports pure peer-to-peer replication using WebRTC. This can be invaluable for scenarios where clients need to sync data directly without a master server.

-
import {
-  replicateWebRTC,
-  getConnectionHandlerSimplePeer
-} from 'rxdb/plugins/replication-webrtc';
- 
-const replicationPool = await replicateWebRTC({
-  collection: db.tasks,
-  topic: 'my-p2p-room', // Clients with the same topic will sync with each other.
-  connectionHandlerCreator: getConnectionHandlerSimplePeer({
-    // Use your own or the official RxDB signaling server
-    signalingServerUrl: 'wss://signaling.rxdb.info/',
- 
-    // Node.js requires a polyfill for WebRTC & WebSocket
-    wrtc: require('node-datachannel/polyfill'),
-    webSocketConstructor: require('ws').WebSocket
-  }),
-  pull: {}, // optional pull config
-  push: {}  // optional push config
-});
- 
-// The replicationPool manages all connected peers
-replicationPool.error$.subscribe(err => {
-  console.error('P2P Sync Error:', err);
-});
-

This example sets up a live P2P replication where any new peers joining the same topic automatically sync local data with each other, eliminating the need for a dedicated central server for the actual data exchange.

-

Is RxDB Right for Your Project?

-
    -
  • You want offline-first: If you need an offline-first app that starts offline, RxDB's local database approach and sync protocol excel at this.
  • -
  • Your project is read-heavy: Reading from Firestore for every query can get expensive. With RxDB, reads are free and local; you only pay for writes or sync overhead.
  • -
  • You need advanced queries: Firestore's query constraints may not suit complex data. With RxDB, you can define your own indexing logic or run arbitrary queries locally.
  • -
  • You want no vendor lock-in: Easily transition from Firestore to your own server or another vendor - just change the replication layer.
  • -
-

Follow Up

-

If you've been searching for a Firestore alternative that gives you the freedom to sync your data with any backend, offers robust offline-first capabilities, and supports truly customizable conflict resolution and queries, RxDB is worth exploring. You can adopt it seamlessly, ensure local reads, reduce costs, and stay in complete control of your data layer.

-

Ready to dive in? Check out the RxDB Quickstart Guide, join our Discord community, and experience how RxDB can be the perfect local-first, real-time database solution for your next project.

-

More resources:

-
- - \ No newline at end of file diff --git a/docs/articles/firestore-alternative.md b/docs/articles/firestore-alternative.md deleted file mode 100644 index 0027a2aa25c..00000000000 --- a/docs/articles/firestore-alternative.md +++ /dev/null @@ -1,225 +0,0 @@ -# RxDB - Firestore Alternative to Sync with Your Own Backend - -> Looking for a Firestore alternative? RxDB is a local-first, NoSQL database that syncs seamlessly with any backend, offers rich offline capabilities, advanced conflict resolution, and reduces vendor lock-in. - -# RxDB - The Firestore Alternative That Can Sync with Your Own Backend - -If you're seeking a **Firestore alternative**, you're likely looking for a way to: -- **Avoid vendor lock-in** while still enjoying real-time replication. -- **Reduce cloud usage costs** by reading data locally instead of constantly fetching from the server. -- **Customize** how you store, query, and secure your data. -- **Implement advanced conflict resolution** strategies beyond Firestore's last-write-wins approach. - -Enter **RxDB** (Reactive Database) - a [local-first](./local-first-future.md), NoSQL database for JavaScript applications that can sync in real time with **any** backend of your choice. Whether you're tired of the limitations and fees associated with Firebase Cloud Firestore or simply need more flexibility, RxDB might be the Firestore alternative you've been searching for. - -
- - - -
- -## What Makes RxDB a Great Firestore Alternative? - -Firestore is convenient for many projects, but it does lock you into Google's ecosystem. Below are some of the key advantages you gain by choosing RxDB: - -### 1. Fully Offline-First -RxDB runs directly in your client application ([browser](./browser-database.md), [Node.js](../nodejs-database.md), [Electron](../electron-database.md), [React Native](../react-native-database.md), etc.). Data is stored locally, so your application **remains fully functional even when offline**. When the device returns online, RxDB's flexible replication protocol synchronizes your local changes with any remote endpoint. - -### 2. Freedom to Use Any Backend -Unlike Firestore, RxDB doesn't require a proprietary hosting service. You can: -- Host your data on your own server (Node.js, Go, Python, etc.). -- Use existing databases like [PostgreSQL](../replication-http.md), [CouchDB](../replication-couchdb.md), or [MongoDB with custom endpoints](../replication.md). -- Implement a [custom GraphQL](../replication-graphql.md) or [REST-based](../replication-http.md) API for syncing. - -This **backend-agnostic** approach protects you from vendor lock-in. Your application's client-side data storage remains consistent; only your replication logic (or plugin) changes if you switch servers. - -### 3. Advanced Conflict Resolution -Firestore enforces a [last-write-wins](https://stackoverflow.com/a/47781502/3443137) conflict resolution strategy. This might cause issues if multiple users or devices update the same data in complex ways. - -RxDB lets you: -- Implement **custom conflict resolution** via [revisions](../transactions-conflicts-revisions.md#custom-conflict-handler). -- Store partial merges, track versions, or preserve multiple user edits. -- Fine-tune how your data merges to ensure consistency across distributed systems. - -### 4. Reduced Cloud Costs -Firestore queries often count as billable reads. With RxDB, queries run **locally** against your local state - no repeated network calls or extra charges. You pay only for the data actually synced, not every read. For **read-heavy** apps, using RxDB as a Firestore alternative can significantly reduce costs. - -### 5. No Limits on Query Features -Firestore's query engine is limited by certain constraints (e.g., no advanced joins, limited indexing). With RxDB: -- **NoSQL** data is stored locally, and you can define any indexes you need. -- Perform [complex queries](../rx-query.md), run [full-text search](../fulltext-search.md), or do aggregated transformations or even [vector search](./javascript-vector-database.md). -- Use [RxDB's reactivity](../rx-query.md#observe) to subscribe to query results in real time. - -### 6. True Offline-Start Support -While Firestore does have offline caching, it often requires an online check at app initialization for authentication. RxDB is [truly offline-first](../offline-first.md); you can launch the app and write data even if the device never goes online initially. It's ready whenever the user is. - -### 7. Cross-Platform: Any JavaScript Runtime -RxDB is designed to run in **any environment** that can execute JavaScript. Whether you’re building a web app in the browser, an [Electron](../electron-database.md) desktop application, a [React Native](../react-native-database.md) mobile app, or a command-line tool with [Node.js](../nodejs-database.md), RxDB’s storage layer is swappable to fit your runtime’s capabilities. -- In the **browser**, store data in [IndexedDB](../rx-storage-indexeddb.md) or [OPFS](../rx-storage-opfs.md). -- In [Node.js](../nodejs-database.md), use LevelDB or other supported storages. -- In [React Native](../react-native-database.md), pick from a range of adapters suited for mobile devices. -- In [Electron](../electron-database.md), rely on fast local storage with zero changes to your application code. - ---- - -## How Does RxDB's Sync Work? - -RxDB replication is powered by its own [Sync Engine](../replication.md). This simple yet robust protocol enables: -1. **Pull**: Fetch new or updated documents from the server. -2. **Push**: Send local changes back to the server. -3. **Live Real-Time**: Once you're caught up, you can opt for event-based streaming instead of continuous polling. - -Code Example: Sync RxDB with a Custom Backend - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -import { replicateRxCollection } from 'rxdb/plugins/replication'; - -async function initDB() { - const db = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage(), - multiInstance: true, - eventReduce: true - }); - - await db.addCollections({ - tasks: { - schema: { - title: 'task schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string', maxLength: 100 }, - title: { type: 'string' }, - done: { type: 'boolean' } - } - } - } - }); - - // Start a custom REST-based replication - replicateRxCollection({ - collection: db.tasks, - replicationIdentifier: 'my-tasks-rest-api', - push: { - handler: async (documents) => { - // Send docs to your REST endpoint - const res = await fetch('https://myapi.com/push', { - method: 'POST', - body: JSON.stringify({ docs: documents }) - }); - // Return conflicts if any - return await res.json(); - } - }, - pull: { - handler: async (lastCheckpoint, batchSize) => { - // Fetch from your REST endpoint - const res = await fetch(`https://myapi.com/pull?checkpoint=${JSON.stringify(lastCheckpoint)}&limit=${batchSize}`); - return await res.json(); - } - }, - live: true // keep watching for changes - }); - - return db; -} -``` - -By swapping out the handler implementations or using an official plugin (e.g., [GraphQL](../replication-graphql.md), [CouchDB](../replication-couchdb.md), [Firestore replication](../replication-firestore.md), etc.), you can adapt to any backend or data source. RxDB thus becomes a flexible alternative to Firestore while maintaining [real-time capabilities](./realtime-database.md). - -## Getting Started with RxDB as a Firestore Alternative - -### Install RxDB: -```bash -npm install rxdb rxjs -``` - -### Create a Database: -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -const db = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage() -}); -``` - -### Define Collections: -```ts -await db.addCollections({ - items: { - schema: { - title: 'items schema', - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { type: 'string', maxLength: 100 }, - text: { type: 'string' } - } - } - } -}); -``` - -### Sync -Use a [Replication Plugin](../replication.md) to connect with a custom backend or existing database. - -For a Firestore-specific approach, RxDB [Firestore Replication](../replication-firestore.md) also exists if you want to combine local indexing and advanced queries with a Cloud Firestore backend. But if you really want to replace Firestore entirely - just point RxDB to your new backend. - -### Example: Start a WebRTC P2P Replication - -In addition to syncing with a central server, RxDB also supports pure peer-to-peer replication using [WebRTC](../replication-webrtc.md). This can be invaluable for scenarios where clients need to sync data directly without a master server. - -```ts -import { - replicateWebRTC, - getConnectionHandlerSimplePeer -} from 'rxdb/plugins/replication-webrtc'; - -const replicationPool = await replicateWebRTC({ - collection: db.tasks, - topic: 'my-p2p-room', // Clients with the same topic will sync with each other. - connectionHandlerCreator: getConnectionHandlerSimplePeer({ - // Use your own or the official RxDB signaling server - signalingServerUrl: 'wss://signaling.rxdb.info/', - - // Node.js requires a polyfill for WebRTC & WebSocket - wrtc: require('node-datachannel/polyfill'), - webSocketConstructor: require('ws').WebSocket - }), - pull: {}, // optional pull config - push: {} // optional push config -}); - -// The replicationPool manages all connected peers -replicationPool.error$.subscribe(err => { - console.error('P2P Sync Error:', err); -}); -``` - -This example sets up a live **P2P replication** where any new peers joining the same topic automatically sync local data with each other, eliminating the need for a dedicated central server for the actual data exchange. - -## Is RxDB Right for Your Project? - -- **You want offline-first**: If you need an offline-first app that starts offline, RxDB's local database approach and sync protocol excel at this. -- **Your project is read-heavy**: Reading from Firestore for every query can get expensive. With RxDB, reads are free and local; you only pay for writes or sync overhead. -- **You need advanced queries**: Firestore's query constraints may not suit complex data. With RxDB, you can define your own indexing logic or run arbitrary queries locally. -- **You want no vendor lock-in**: Easily transition from Firestore to your own server or another vendor - just change the replication layer. - -## Follow Up - -If you've been searching for a Firestore alternative that gives you the freedom to sync your data with any backend, offers robust offline-first capabilities, and supports truly customizable conflict resolution and queries, RxDB is worth exploring. You can adopt it seamlessly, ensure local reads, reduce costs, and stay in complete control of your data layer. - -Ready to dive in? Check out the RxDB Quickstart Guide, join our Discord community, and experience how RxDB can be the perfect local-first, real-time database solution for your next project. - -More resources: -- [RxDB Sync Engine](../replication.md) -- [Firestore Replication Plugin](../replication-firestore.md) -- [Custom Conflict Resolution](../transactions-conflicts-revisions.md) -- [RxDB GitHub Repository](/code/) diff --git a/docs/articles/flutter-database.html b/docs/articles/flutter-database.html deleted file mode 100644 index 02db43cfaa6..00000000000 --- a/docs/articles/flutter-database.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - -Supercharge Flutter Apps with the RxDB Database | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RxDB as a Database in a Flutter Application

-

In the world of mobile application development, Flutter has gained significant popularity due to its cross-platform capabilities and rich UI framework. When it comes to building feature-rich Flutter applications, the choice of a robust and efficient database is crucial. In this article, we will explore RxDB as a database solution for Flutter applications. We'll delve into the core features of RxDB, its benefits over other database options, and how to integrate it into a Flutter app.

-
note

You can find the source code for an example RxDB Flutter Application at the github repo

-
RxDB Flutter Database
-

Overview of Flutter Mobile Applications

-

Flutter is an open-source UI software development kit created by Google that allows developers to build high-performance mobile applications for iOS and Android platforms using a single codebase. Flutter's framework provides a wide range of widgets and tools that enable developers to create visually appealing and responsive applications.

-
Flutter
-

Importance of Databases in Flutter Applications

-

Databases play a vital role in Flutter applications by providing a persistent and reliable storage solution for storing and retrieving data. Whether it's user profiles, app settings, or complex data structures, a database helps in efficiently managing and organizing the application's data. Choosing the right database for a Flutter application can significantly impact the performance, scalability, and user experience of the app.

-

Introducing RxDB as a Database Solution

-

RxDB is a powerful NoSQL database solution that is designed to work seamlessly with JavaScript-based frameworks, such as Flutter. It stands for Reactive Database and offers a variety of features that make it an excellent choice for building Flutter applications. RxDB combines the simplicity of JavaScript's document-based database model with the reactive programming paradigm, enabling developers to build real-time and offline-first applications with ease.

-

Getting Started with RxDB

-

To understand how RxDB can be utilized in a Flutter application, let's explore its core features and advantages.

-

What is RxDB?

-

RxDB is a client-side database built on top of IndexedDB, which is a low-level browser-based database API. It provides a simple and intuitive API for performing CRUD operations (Create, Read, Update, Delete) on documents. RxDB's underlying architecture allows for efficient handling of data synchronization between multiple clients and servers.

-
RxDB Flutter Database
-

Reactive Data Handling

-

One of the key strengths of RxDB is its reactive data handling. It leverages the power of Observables, a concept from reactive programming, to automatically update the UI in response to data changes. With RxDB, developers can define queries and subscribe to their results, ensuring that the UI is always in sync with the database.

-

Offline-First Approach

-

RxDB follows an offline-first approach, making it ideal for building Flutter applications that need to function even without an internet connection. It allows data to be stored locally and seamlessly synchronizes it with the server when a connection is available. This ensures that users can access and interact with their data regardless of network availability.

-

Data Replication

-

Data replication is a critical aspect of building distributed applications. RxDB provides robust replication capabilities that enable synchronization of data between different clients and servers. With its replication plugins, RxDB simplifies the process of setting up real-time data synchronization, ensuring consistency across all connected devices.

-

Observable Queries

-

RxDB introduces the concept of observable queries, which are queries that automatically update when the underlying data changes. This feature is particularly useful for keeping the UI up to date with the latest data. By subscribing to an observable query, developers can receive real-time updates and reflect them in the user interface without manual intervention.

-

RxDB vs. Other Flutter Database Options

-

When considering database options for Flutter applications, developers often come across alternatives such as SQLite or LokiJS. While these databases have their merits, RxDB offers several advantages over them. RxDB's seamless integration with Flutter, its offline-first approach, reactive data handling, and built-in data replication make it a compelling choice for building feature-rich and scalable Flutter applications.

-

Using RxDB in a Flutter Application

-

Now that we understand the core features of RxDB, let's explore how to integrate it into a Flutter application.

-

How RxDB can run in Flutter

-

RxDB is written in TypeScript and compiled to JavaScript. To run it in a Flutter application, the flutter_qjs library is used to spawn a QuickJS JavaScript runtime. RxDB itself runs in that runtime and communicates with the flutter dart runtime. To store data persistent, the LokiJS RxStorage is used together with a custom storage adapter that persists the database inside of the shared_preferences data.

-

To use RxDB, you have to create a compatible JavaScript file that creates your RxDatabase and starts some connectors which are used by Flutter to communicate with the JavaScript RxDB database via setFlutterRxDatabaseConnector().

-
import {
-    createRxDatabase
-} from 'rxdb';
-import {
-    getRxStorageLoki
-} from 'rxdb/plugins/storage-lokijs';
-import {
-    setFlutterRxDatabaseConnector,
-    getLokijsAdapterFlutter
-} from 'rxdb/plugins/flutter';
- 
-// do all database creation stuff in this method.
-async function createDB(databaseName) {
-    // create the RxDatabase
-    const db = await createRxDatabase({
-        // the database.name is variable so we can change it on the flutter side
-        name: databaseName,
-        storage: getRxStorageLoki({
-            adapter: getLokijsAdapterFlutter()
-        }),
-        multiInstance: false
-    });
-    await db.addCollections({
-        heroes: {
-            schema: {
-                version: 0,
-                primaryKey: 'id',
-                type: 'object',
-                properties: {
-                    id: {
-                        type: 'string',
-                        maxLength: 100
-                    },
-                    name: {
-                        type: 'string',
-                        maxLength: 100
-                    },
-                    color: {
-                        type: 'string',
-                        maxLength: 30
-                    }
-                },
-                indexes: ['name'],
-                required: ['id', 'name', 'color']
-            }
-        }
-    });
-    return db;
-}
- 
-// start the connector so that flutter can communicate with the JavaScript process
-setFlutterRxDatabaseConnector(
-    createDB
-);
-

Before you can use the JavaScript code, you have to bundle it into a single .js file. In this example we do that with webpack in a npm script here which bundles everything into the javascript/dist/index.js file.

-

To allow Flutter to access that file during runtime, add it to the assets inside of your pubspec.yaml:

-
flutter:
-  assets:
-    - javascript/dist/index.js
-

Also you need to install RxDB in your flutter part of the application. First you have to use the rxdb dart package as a flutter dependency. Currently the package is not published at the dart pub.dev. Instead you have to install it from the local filesystem inside of your RxDB npm installation.

-
# inside of pubspec.yaml
-dependencies:
-  rxdb:
-    path: path/to/your/node_modules/rxdb/src/plugins/flutter/dart
-

Afterwards you can import the rxdb library in your dart code and connect to the JavaScript process from there. For reference, check out the lib/main.dart file.

-
import 'package:rxdb/rxdb.dart';
- 
-// start the javascript process and connect to the database
-RxDatabase database = await getRxDatabase("javascript/dist/index.js", databaseName);
- 
-// get a collection
-RxCollection collection = database.getCollection('heroes');
- 
-// insert a document
-RxDocument document = await collection.insert({
-    "id": "zflutter-${DateTime.now()}",
-    "name": nameController.text,
-    "color": colorController.text
-});
- 
-// create a query
-RxQuery<RxHeroDocType> query = RxDatabaseState.collection.find();
- 
-// create list to store query results
-List<RxDocument<RxHeroDocType>> documents = [];
- 
-// subscribe to a query
-query.$().listen((results) {
-    setState(() {
-        documents = results;
-    });
-});
-

Different RxStorage layers for RxDB

-

RxDB offers multiple storage options, known as RxStorage layers, to store data locally. These options include:

-
    -
  • LokiJS RxStorage: LokiJS is an in-memory database that can be used as a storage layer for RxDB. It provides fast and efficient in-memory data management capabilities.
  • -
  • SQLite RxStorage: SQLite is a popular and widely used embedded database that offers robust storage capabilities. RxDB utilizes SQLite as a storage layer to persist data on the device.
  • -
  • Memory RxStorage: As the name suggests, Memory RxStorage stores data in memory. While this option does not provide persistence, it can be useful for temporary or cache-based data storage. -By choosing the appropriate RxStorage layer based on the specific requirements of the application, developers can optimize performance and storage efficiency.
  • -
-

Synchronizing Data with RxDB between Clients and Servers

-

One of the key strengths of RxDB is its ability to synchronize data between multiple clients and servers seamlessly. Let's explore how this synchronization can be achieved.

-

Offline-First Approach

-

RxDB's offline-first approach ensures that data can be accessed and modified even when there is no internet connection. Changes made offline are automatically synchronized with the server once a connection is reestablished. This ensures data consistency across all devices, providing a seamless user experience.

-

RxDB Replication Plugins

-

RxDB provides replication plugins that simplify the process of setting up data synchronization between clients and servers. These plugins offer various synchronization strategies, such as one-way replication, two-way replication, and conflict resolution mechanisms. By configuring the appropriate replication plugin, developers can easily establish real-time data synchronization in their Flutter applications.

-

Advanced RxDB Features and Techniques

-

RxDB offers a range of advanced features and techniques that enhance its functionality and performance. Let's explore a few of these features:

-

Indexing and Performance Optimization

-

Indexing is a technique used to optimize query performance by creating indexes on specific fields. RxDB allows developers to define indexes on document fields, improving the efficiency of queries and data retrieval.

-

Encryption of Local Data

-

To ensure data privacy and security, RxDB supports encryption of local data. By encrypting the data stored on the device, developers can protect sensitive information and prevent unauthorized access.

-

Change Streams and Event Handling

-

RxDB provides change streams, which emit events whenever data changes occur. By leveraging change streams, developers can implement custom event handling logic, such as updating the UI or triggering background processes, in response to specific data changes.

-

JSON Key Compression

-

To minimize storage requirements and optimize performance, RxDB offers JSON key compression. This feature reduces the size of keys used in the database, resulting in more efficient storage and improved query performance.

-

Conclusion

-

RxDB offers a powerful and flexible database solution for Flutter applications. With its offline-first approach, real-time data synchronization, and reactive data handling capabilities, RxDB simplifies the development of feature-rich and scalable Flutter applications. By integrating RxDB into your Flutter projects, you can leverage its advanced features and techniques to build responsive and data-driven applications that provide an exceptional user experience.

-
note

You can find the source code for an example RxDB Flutter Application at the github repo

- - \ No newline at end of file diff --git a/docs/articles/flutter-database.md b/docs/articles/flutter-database.md deleted file mode 100644 index 1ebdf41b979..00000000000 --- a/docs/articles/flutter-database.md +++ /dev/null @@ -1,213 +0,0 @@ -# Supercharge Flutter Apps with the RxDB Database - -> Harness RxDB's reactive database to bring real-time, offline-first data storage and syncing to your next Flutter application. - -# RxDB as a Database in a Flutter Application - -In the world of mobile application development, Flutter has gained significant popularity due to its cross-platform capabilities and rich UI framework. When it comes to building feature-rich Flutter applications, the choice of a robust and efficient database is crucial. In this article, we will explore [RxDB](https://rxdb.info/) as a database solution for Flutter applications. We'll delve into the core features of RxDB, its benefits over other database options, and how to integrate it into a Flutter app. - -:::note -You can find the source code for an example RxDB Flutter Application [at the github repo](https://github.com/pubkey/rxdb/tree/master/examples/flutter) -::: - -
- - - -
- -### Overview of Flutter Mobile Applications -Flutter is an open-source UI software development kit created by Google that allows developers to build high-performance [mobile](./mobile-database.md) applications for iOS and Android platforms using a single codebase. Flutter's framework provides a wide range of widgets and tools that enable developers to create visually appealing and responsive applications. - -
- -
- -### Importance of Databases in Flutter Applications -Databases play a vital role in Flutter applications by providing a persistent and reliable storage solution for storing and retrieving data. Whether it's user profiles, app settings, or complex data structures, a database helps in efficiently managing and organizing the application's data. Choosing the right database for a Flutter application can significantly impact the performance, scalability, and user experience of the app. - -### Introducing RxDB as a Database Solution -RxDB is a powerful NoSQL database solution that is designed to work seamlessly with JavaScript-based frameworks, such as Flutter. It stands for Reactive Database and offers a variety of features that make it an excellent choice for building Flutter applications. RxDB combines the simplicity of JavaScript's document-based database model with the reactive programming paradigm, enabling developers to build real-time and offline-first applications with ease. - -## Getting Started with RxDB -To understand how RxDB can be utilized in a Flutter application, let's explore its core features and advantages. - -### What is RxDB? -[RxDB](https://rxdb.info/) is a client-side database built on top of [IndexedDB](../rx-storage-indexeddb.md), which is a low-level [browser-based database](./browser-database.md) API. It provides a simple and intuitive API for performing CRUD operations (Create, Read, Update, Delete) on documents. RxDB's underlying architecture allows for efficient handling of data synchronization between multiple clients and servers. - -
- - - -
- -### Reactive Data Handling -One of the key strengths of RxDB is its reactive data handling. It leverages the power of Observables, a concept from reactive programming, to automatically update the UI in response to data changes. With RxDB, developers can define queries and subscribe to their results, ensuring that the UI is always in sync with the database. - -### Offline-First Approach -RxDB follows an offline-first approach, making it ideal for building Flutter applications that need to function even without an internet connection. It allows data to be stored locally and seamlessly synchronizes it with the server when a connection is available. This ensures that users can access and interact with their data regardless of network availability. - -### Data Replication -Data replication is a critical aspect of building distributed applications. RxDB provides robust replication capabilities that enable synchronization of data between different clients and servers. With its replication plugins, RxDB simplifies the process of setting up real-time data synchronization, ensuring consistency across all connected devices. - -### Observable Queries -RxDB introduces the concept of observable queries, which are queries that automatically update when the underlying data changes. This feature is particularly useful for keeping the UI up to date with the latest data. By subscribing to an observable query, developers can receive real-time updates and reflect them in the user interface without manual intervention. - -### RxDB vs. Other Flutter Database Options -When considering database options for Flutter applications, developers often come across alternatives such as SQLite or LokiJS. While these databases have their merits, RxDB offers several advantages over them. RxDB's seamless integration with Flutter, its offline-first approach, reactive data handling, and built-in data replication make it a compelling choice for building feature-rich and scalable Flutter applications. - -## Using RxDB in a Flutter Application -Now that we understand the core features of RxDB, let's explore how to integrate it into a Flutter application. - -## How RxDB can run in Flutter - -RxDB is written in TypeScript and compiled to JavaScript. To run it in a Flutter application, the `flutter_qjs` library is used to spawn a QuickJS JavaScript runtime. RxDB itself runs in that runtime and communicates with the flutter dart runtime. To store data persistent, the [LokiJS RxStorage](../rx-storage-lokijs.md) is used together with a custom storage adapter that persists the database inside of the `shared_preferences` data. - -To use RxDB, you have to create a compatible JavaScript file that creates your RxDatabase and starts some connectors which are used by Flutter to communicate with the JavaScript RxDB database via setFlutterRxDatabaseConnector(). - -```javascript -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageLoki -} from 'rxdb/plugins/storage-lokijs'; -import { - setFlutterRxDatabaseConnector, - getLokijsAdapterFlutter -} from 'rxdb/plugins/flutter'; - -// do all database creation stuff in this method. -async function createDB(databaseName) { - // create the RxDatabase - const db = await createRxDatabase({ - // the database.name is variable so we can change it on the flutter side - name: databaseName, - storage: getRxStorageLoki({ - adapter: getLokijsAdapterFlutter() - }), - multiInstance: false - }); - await db.addCollections({ - heroes: { - schema: { - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 - }, - name: { - type: 'string', - maxLength: 100 - }, - color: { - type: 'string', - maxLength: 30 - } - }, - indexes: ['name'], - required: ['id', 'name', 'color'] - } - } - }); - return db; -} - -// start the connector so that flutter can communicate with the JavaScript process -setFlutterRxDatabaseConnector( - createDB -); -``` - -Before you can use the JavaScript code, you have to bundle it into a single .js file. In this example we do that with webpack in a npm script here which bundles everything into the `javascript/dist/index.js` file. - -To allow Flutter to access that file during runtime, add it to the assets inside of your pubspec.yaml: - -```yaml -flutter: - assets: - - javascript/dist/index.js -``` - -Also you need to install RxDB in your flutter part of the application. First you have to use the rxdb dart package as a flutter dependency. Currently the package is not published at the dart pub.dev. Instead you have to install it from the local filesystem inside of your RxDB npm installation. - -```yaml -# inside of pubspec.yaml -dependencies: - rxdb: - path: path/to/your/node_modules/rxdb/src/plugins/flutter/dart -``` - -Afterwards you can import the rxdb library in your dart code and connect to the JavaScript process from there. For reference, check out the lib/main.dart file. - -```dart -import 'package:rxdb/rxdb.dart'; - -// start the javascript process and connect to the database -RxDatabase database = await getRxDatabase("javascript/dist/index.js", databaseName); - -// get a collection -RxCollection collection = database.getCollection('heroes'); - -// insert a document -RxDocument document = await collection.insert({ - "id": "zflutter-${DateTime.now()}", - "name": nameController.text, - "color": colorController.text -}); - -// create a query -RxQuery query = RxDatabaseState.collection.find(); - -// create list to store query results -List> documents = []; - -// subscribe to a query -query.$().listen((results) { - setState(() { - documents = results; - }); -}); -``` - -### Different RxStorage layers for RxDB -RxDB offers multiple storage options, known as RxStorage layers, to store data locally. These options include: - -- [LokiJS RxStorage](../rx-storage-lokijs.md): LokiJS is an in-memory database that can be used as a [storage](./browser-storage.md) layer for RxDB. It provides fast and efficient in-memory data management capabilities. -- [SQLite RxStorage](../rx-storage-sqlite.md): SQLite is a popular and widely used [embedded database](./embedded-database.md) that offers robust storage capabilities. RxDB utilizes SQLite as a storage layer to persist data on the device. -- [Memory RxStorage](../rx-storage-memory.md): As the name suggests, Memory RxStorage stores data [in memory](./in-memory-nosql-database.md). While this option does not provide persistence, it can be useful for temporary or cache-based data storage. -By choosing the appropriate RxStorage layer based on the specific requirements of the application, developers can optimize performance and storage efficiency. - -## Synchronizing Data with RxDB between Clients and Servers -One of the key strengths of RxDB is its ability to synchronize data between multiple clients and servers seamlessly. Let's explore how this synchronization can be achieved. - -### Offline-First Approach -RxDB's offline-first approach ensures that data can be accessed and modified even when there is no internet connection. Changes made offline are automatically synchronized with the server once a connection is reestablished. This ensures data consistency across all devices, providing a seamless user experience. - -### RxDB Replication Plugins -RxDB provides replication plugins that simplify the process of setting up data [synchronization between clients and servers](../replication.md). These plugins offer various synchronization strategies, such as one-way replication, two-way replication, and conflict resolution mechanisms. By configuring the appropriate replication plugin, developers can easily establish real-time data synchronization in their Flutter applications. - -## Advanced RxDB Features and Techniques -RxDB offers a range of advanced features and techniques that enhance its functionality and performance. Let's explore a few of these features: - -### Indexing and Performance Optimization -Indexing is a technique used to optimize query performance by creating indexes on specific fields. RxDB allows developers to define indexes on document fields, improving the efficiency of queries and data retrieval. - -### Encryption of Local Data -To ensure data privacy and security, RxDB supports [encryption of local data](../encryption.md). By encrypting the data stored on the device, developers can protect sensitive information and prevent unauthorized access. - -### Change Streams and Event Handling -RxDB provides change streams, which emit events whenever data changes occur. By leveraging change streams, developers can implement custom event handling logic, such as updating the UI or triggering background processes, in response to specific data changes. - -### JSON Key Compression -To minimize storage requirements and optimize performance, RxDB offers [JSON key compression](../key-compression.md). This feature reduces the size of keys used in the database, resulting in more efficient storage and improved query performance. - -## Conclusion -RxDB offers a powerful and flexible database solution for Flutter applications. With its offline-first approach, real-time data synchronization, and reactive data handling capabilities, RxDB simplifies the development of feature-rich and scalable Flutter applications. By integrating RxDB into your Flutter projects, you can leverage its advanced features and techniques to build responsive and data-driven applications that provide an exceptional user experience. - -:::note -You can find the source code for an example RxDB Flutter Application [at the github repo](https://github.com/pubkey/rxdb/tree/master/examples/flutter) -::: diff --git a/docs/articles/frontend-database.html b/docs/articles/frontend-database.html deleted file mode 100644 index 3cf213783d6..00000000000 --- a/docs/articles/frontend-database.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - -RxDB - The Ultimate JS Frontend Database | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications

-

In modern web development, managing data on the front end has become increasingly important. Storing data in the frontend offers numerous advantages, such as offline accessibility, caching, faster application startup, and improved state management. Traditional SQL databases, although widely used on the server-side, are not always the best fit for frontend applications. This is where RxDB, a frontend JavaScript database, emerges as a powerful solution. In this article, we will explore why storing data in the frontend is beneficial, the limitations of SQL databases in the frontend, and how RxDB addresses these challenges to become an excellent choice for frontend data storage.

-
JavaScript Frontend Database
-

Why you might want to store data in the frontend

-

Offline accessibility

-

One compelling reason to store data in the frontend is to enable offline accessibility. By leveraging a frontend database, applications can cache essential data locally, allowing users to continue using the application even when an internet connection is unavailable. This feature is particularly useful for mobile applications or web apps with limited or intermittent connectivity.

-

Caching

-

Frontend databases also serve as efficient caching mechanisms. By storing frequently accessed data locally, applications can minimize network requests and reduce latency, resulting in faster and more responsive user experiences. Caching is particularly beneficial for applications that heavily rely on remote data or perform computationally intensive operations.

-

Decreased initial application start time

-

Storing data in the frontend decreases the initial application start time because the data is already present locally. By eliminating the need to fetch data from a server during startup, applications can quickly render the UI and provide users with an immediate interactive experience. This is especially advantageous for applications with large datasets or complex data retrieval processes.

-

Password encryption for local data

-

Security is a crucial aspect of data storage. With a front end database, developers can encrypt sensitive local data, such as user credentials or personal information, using encryption algorithms. This ensures that even if the device is compromised, the data remains securely stored and protected.

-

Local database for state management

-

Frontend databases provide an alternative to traditional state management libraries like Redux or NgRx. By utilizing a local database, developers can store and manage application state directly in the frontend, eliminating the need for additional libraries. This approach simplifies the codebase, reduces complexity, and provides a more straightforward data flow within the application.

-

Low-latency local queries

-

Frontend databases enable low-latency queries that run entirely on the client's device. Instead of relying on server round-trips for each query, the database executes queries locally, resulting in faster response times. This is particularly beneficial for applications that require real-time updates or frequent data retrieval.

-

latency london san franzisco

-

Building realtime applications with local data

-

Realtime applications often require immediate updates based on data changes. By storing data locally and utilizing a frontend database, developers can build realtime applications more easily. The database can observe data changes and automatically update the UI, providing a seamless and responsive user experience.

-

Easier integration with JavaScript frameworks

-

Frontend databases, including RxDB, are designed to integrate seamlessly with popular JavaScript frameworks such as Angular, React.js, Vue.js, and Svelte. These databases offer well-defined APIs and support that align with the specific requirements of these frameworks, enabling developers to leverage the full potential of the frontend database within their preferred development environment.

-

Simplified replication of database state

-

Replicating database state between the frontend and backend can be challenging, especially when dealing with complex REST routes. Frontend databases, however, provide simple mechanisms for replicating database state. They offer intuitive replication algorithms that facilitate data synchronization between the frontend and backend, reducing the complexity and potential pitfalls associated with complex REST-based replication.

-

Improved scalability

-

Frontend databases offer improved scalability compared to traditional SQL databases. By leveraging the computational capabilities of client devices, the burden on server resources is reduced. Queries and operations are performed locally, minimizing the need for server round-trips and enabling applications to scale more efficiently.

-

Why SQL databases are not a good fit for the front end of an application

-

While SQL databases excel in server-side scenarios, they pose limitations when used on the frontend. Here are some reasons why SQL databases are not well-suited for frontend applications:

-

Push/Pull based vs. reactive

-

SQL databases typically rely on a push/pull model, where the server pushes data to the client upon request. This approach is not inherently reactive, as it requires explicit requests for data updates. In contrast, frontend applications often require reactive data flows, where changes in data trigger automatic updates in the UI. Frontend databases, like RxDB, provide reactive capabilities that seamlessly integrate with the dynamic nature of frontend development.

-

Initialization time and performance

-

SQL databases designed for server-side usage tend to have larger build sizes and initialization times, making them less efficient for browser-based applications. Frontend databases, on the other hand, directly leverage browser APIs like IndexedDB, OPFS, and WebWorker, resulting in leaner builds and faster initialization times. Often the queries are such fast, that it is not even necessary to implement a loading spinner.

-

loading spinner not needed

-

Build size considerations

-

Server-side SQL databases typically come with a significant build size, which can be impractical for browser applications where code size optimization is crucial. Frontend databases, on the other hand, are specifically designed to operate within the constraints of browser environments, ensuring efficient resource utilization and smaller build sizes.

-

For example the SQLite Webassembly file alone has a size of over 0.8 Megabyte with an additional 0.2 Megabyte in JavaScript code for connection.

-

Why RxDB is a good fit for the frontend

-

RxDB is a powerful frontend JavaScript database that addresses the limitations of SQL databases and provides an optimal solution for frontend data storage. Let's explore why RxDB is an excellent fit for frontend applications:

-

Made in JavaScript, optimized for JavaScript applications

-

RxDB is designed and optimized for JavaScript applications. Built using JavaScript itself, RxDB offers seamless integration with JavaScript frameworks and libraries, allowing developers to leverage their existing JavaScript knowledge and skills.

-

NoSQL (JSON) documents for UIs

-

RxDB adopts a NoSQL approach, using JSON documents as its primary data structure. This aligns well with the JavaScript ecosystem, as JavaScript natively works with JSON objects. By using NoSQL documents, RxDB provides a more natural and intuitive data model for UI-centric applications.

-

NoSQL Documents

-

Better TypeScript support compared to SQL

-

TypeScript has become increasingly popular for building frontend applications. RxDB provides excellent TypeScript support, allowing developers to leverage static typing and benefit from enhanced code quality and tooling. This is particularly advantageous when compared to SQL databases, which often have limited TypeScript support.

-

Observable Queries for automatic UI updates

-

RxDB introduces the concept of observable queries, powered by RxJS. Observable queries automatically update the UI whenever there are changes in the underlying data. This reactive approach eliminates the need for manual UI updates and ensures that the frontend remains synchronized with the database state.

-

realtime ui updates

-

Optimized observed queries with the EventReduce Algorithm

-

RxDB optimizes observed queries with its EventReduce Algorithm. This algorithm intelligently reduces redundant events and ensures that UI updates are performed efficiently. By minimizing unnecessary re-renders, RxDB significantly improves performance and responsiveness in frontend applications.

-
const query = myCollection.find({
-    selector: {
-        age: {
-            $gt: 21
-        }
-    }
-});
-const querySub = query.$.subscribe(results => {
-    console.log('got results: ' + results.length);
-});
-

Observable document fields

-

RxDB supports observable document fields, enabling developers to track changes at a granular level within documents. By observing specific fields, developers can reactively update the UI when those fields change, ensuring a responsive and synchronized frontend interface.

-
myDocument.firstName$.subscribe(newName => console.log('name is: ' + newName));
-

Storing Documents Compressed

-

RxDB provides the option to store documents in a compressed format, reducing storage requirements and improving overall database performance. Compressed storage offers benefits such as reduced disk space usage, faster data read/write operations, and improved network transfer speeds, making it an essential feature for efficient frontend data storage.

-

Built-in Multi-tab support

-

RxDB offers built-in multi-tab support, allowing data synchronization and state management across multiple browser tabs. This feature ensures consistent data access and synchronization, enabling users to work seamlessly across different tabs without conflicts or data inconsistencies.

-

multi tab support

-

Replication Algorithm can be made compatible with any backend

-

RxDB's realtime replication algorithm is designed to be flexible and compatible with various backend systems. Whether you're using your own servers, Firebase, CouchDB, NATS, WebSocket, or any other backend, RxDB can be seamlessly integrated and synchronized with the backend system of your choice.

-

database replication

-

Flexible storage layer for code reuse

-

RxDB provides a flexible storage layer that enables code reuse across different platforms. Whether you're building applications with Electron.js, React Native, hybrid apps using Capacitor.js, or traditional web browsers, RxDB allows you to reuse the same codebase and leverage the power of a frontend database across different environments.

-

Handling schema changes in distributed environments

-

In distributed environments where data is stored on multiple client devices, handling schema changes can be challenging. RxDB tackles this challenge by providing robust mechanisms for handling schema changes. It ensures that schema updates propagate smoothly across devices, maintaining data integrity and enabling seamless schema evolution.

-

Follow Up

-

To further explore RxDB and get started with using it in your frontend applications, consider the following resources:

-
    -
  • RxDB Quickstart: A step-by-step guide to quickly set up RxDB in your project and start leveraging its features.
  • -
  • RxDB GitHub Repository: The official repository for RxDB, where you can find the code, examples, and community support.
  • -
-

By adopting RxDB as your frontend database, you can unlock the full potential of frontend data storage and empower your applications with offline accessibility, caching, improved performance, and seamless data synchronization. RxDB's JavaScript-centric approach and powerful features make it an ideal choice for frontend developers seeking efficient and scalable data storage solutions.

- - \ No newline at end of file diff --git a/docs/articles/frontend-database.md b/docs/articles/frontend-database.md deleted file mode 100644 index f194abfb81d..00000000000 --- a/docs/articles/frontend-database.md +++ /dev/null @@ -1,131 +0,0 @@ -# RxDB - The Ultimate JS Frontend Database - -> Discover how RxDB, a powerful JavaScript frontend database, boosts offline access, caching, and real-time updates to supercharge your web apps. - -# RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications -In modern web development, managing data on the front end has become increasingly important. Storing data in the frontend offers numerous advantages, such as offline accessibility, caching, faster application startup, and improved state management. Traditional SQL databases, although widely used on the server-side, are not always the best fit for frontend applications. This is where [RxDB](https://rxdb.info/), a frontend JavaScript database, emerges as a powerful solution. In this article, we will explore why storing data in the frontend is beneficial, the limitations of SQL databases in the frontend, and how [RxDB](https://rxdb.info/) addresses these challenges to become an excellent choice for frontend data storage. - -
- - - -
- -## Why you might want to store data in the frontend - -### Offline accessibility -One compelling reason to store data in the frontend is to enable [offline accessibility](../offline-first.md). By leveraging a frontend database, applications can cache essential data locally, allowing users to continue using the application even when an internet connection is unavailable. This feature is particularly useful for [mobile](./mobile-database.md) applications or web apps with limited or intermittent connectivity. - -### Caching -Frontend databases also serve as efficient caching mechanisms. By storing frequently accessed data locally, applications can minimize network requests and reduce latency, resulting in faster and more responsive user experiences. Caching is particularly beneficial for applications that heavily rely on remote data or perform computationally intensive operations. - -### Decreased initial application start time -Storing data in the frontend decreases the initial application start time because the data is already present locally. By eliminating the need to fetch data from a server during startup, applications can quickly render the UI and provide users with an immediate interactive experience. This is especially advantageous for applications with large datasets or complex data retrieval processes. - -### Password encryption for local data -Security is a crucial aspect of data storage. With a front end database, developers can [encrypt](../encryption.md) sensitive local data, such as user credentials or personal information, using encryption algorithms. This ensures that even if the device is compromised, the data remains securely stored and protected. - -### Local database for state management -Frontend databases provide an alternative to traditional state management libraries like Redux or NgRx. By utilizing a local database, developers can store and manage application state directly in the frontend, eliminating the need for additional libraries. This approach simplifies the codebase, reduces complexity, and provides a more straightforward data flow within the application. - -### Low-latency local queries -Frontend databases enable low-latency queries that run entirely on the client's device. Instead of relying on server round-trips for each query, the database executes queries locally, resulting in faster response times. This is particularly beneficial for applications that require real-time updates or frequent data retrieval. - - - -### Building realtime applications with local data -Realtime applications often require immediate updates based on data changes. By storing data locally and utilizing a frontend database, developers can build [realtime applications](./realtime-database.md) more easily. The database can observe data changes and automatically update the UI, providing a seamless and responsive user experience. - -### Easier integration with JavaScript frameworks -Frontend databases, including RxDB, are designed to integrate seamlessly with popular JavaScript frameworks such as [Angular](./angular-database.md), [React.js](./react-database.md), [Vue.js](./vue-database.md), and Svelte. These databases offer well-defined APIs and support that align with the specific requirements of these frameworks, enabling developers to leverage the full potential of the frontend database within their preferred development environment. - -### Simplified replication of database state -Replicating database state between the frontend and backend can be challenging, especially when dealing with complex REST routes. Frontend databases, however, provide simple mechanisms for replicating database state. They offer intuitive replication algorithms that facilitate data synchronization between the frontend and backend, reducing the complexity and potential pitfalls associated with complex REST-based replication. - -### Improved scalability -Frontend databases offer improved scalability compared to traditional SQL databases. By leveraging the computational capabilities of client devices, the burden on server resources is reduced. Queries and operations are performed locally, minimizing the need for server round-trips and enabling applications to scale more efficiently. - -## Why SQL databases are not a good fit for the front end of an application -While SQL databases excel in server-side scenarios, they pose limitations when used on the frontend. Here are some reasons why SQL databases are not well-suited for frontend applications: - -### Push/Pull based vs. reactive -SQL databases typically rely on a push/pull model, where the server pushes data to the client upon request. This approach is not inherently reactive, as it requires explicit requests for data updates. In contrast, frontend applications often require reactive data flows, where changes in data trigger automatic updates in the UI. Frontend databases, like [RxDB](https://rxdb.info/), provide reactive capabilities that seamlessly integrate with the dynamic nature of frontend development. - -### Initialization time and performance -SQL databases designed for server-side usage tend to have larger build sizes and initialization times, making them less efficient for [browser-based](./browser-database.md) applications. Frontend databases, on the other hand, directly leverage browser APIs like [IndexedDB](../rx-storage-indexeddb.md), [OPFS](../rx-storage-opfs.md), and [WebWorker](../rx-storage-worker.md), resulting in leaner builds and faster initialization times. Often the queries are such fast, that it is not even necessary to implement a loading spinner. - - - -### Build size considerations -Server-side SQL databases typically come with a significant build size, which can be impractical for browser applications where code size optimization is crucial. Frontend databases, on the other hand, are specifically designed to operate within the constraints of browser environments, ensuring efficient resource utilization and smaller build sizes. - -For example the SQLite Webassembly file alone has a size of over 0.8 Megabyte with an additional 0.2 Megabyte in JavaScript code for connection. - -## Why RxDB is a good fit for the frontend -RxDB is a powerful frontend JavaScript database that addresses the limitations of SQL databases and provides an optimal solution for frontend [data storage](./browser-storage.md). Let's explore why RxDB is an excellent fit for frontend applications: - -### Made in JavaScript, optimized for JavaScript applications -RxDB is designed and optimized for JavaScript applications. Built using JavaScript itself, RxDB offers seamless integration with JavaScript frameworks and libraries, allowing developers to leverage their existing JavaScript knowledge and skills. - -### NoSQL (JSON) documents for UIs -RxDB adopts a [NoSQL approach](./in-memory-nosql-database.md), using [JSON documents as its primary data structure](./json-database.md). This aligns well with the JavaScript ecosystem, as JavaScript natively works with JSON objects. By using NoSQL documents, RxDB provides a more natural and intuitive data model for UI-centric applications. - - - -### Better TypeScript support compared to SQL -TypeScript has become increasingly popular for building frontend applications. RxDB provides excellent [TypeScript support](../tutorials/typescript.md), allowing developers to leverage static typing and benefit from enhanced code quality and tooling. This is particularly advantageous when compared to SQL databases, which often have limited TypeScript support. - -### Observable Queries for automatic UI updates -RxDB introduces the concept of observable queries, powered by RxJS. Observable queries automatically update the UI whenever there are changes in the underlying data. This reactive approach eliminates the need for manual UI updates and ensures that the frontend remains synchronized with the database state. - - - -### Optimized observed queries with the EventReduce Algorithm -RxDB optimizes observed queries with its EventReduce Algorithm. This algorithm intelligently reduces redundant events and ensures that UI updates are performed efficiently. By minimizing unnecessary re-renders, RxDB significantly improves performance and responsiveness in frontend applications. - -```typescript -const query = myCollection.find({ - selector: { - age: { - $gt: 21 - } - } -}); -const querySub = query.$.subscribe(results => { - console.log('got results: ' + results.length); -}); -``` - -### Observable document fields -RxDB supports observable document fields, enabling developers to track changes at a granular level within documents. By observing specific fields, developers can reactively update the UI when those fields change, ensuring a responsive and synchronized frontend interface. - -```typescript -myDocument.firstName$.subscribe(newName => console.log('name is: ' + newName)); -``` - -### Storing Documents Compressed -RxDB provides the option to store documents in a [compressed format](../key-compression.md), reducing storage requirements and improving overall database performance. Compressed storage offers benefits such as reduced disk space usage, faster data read/write operations, and improved network transfer speeds, making it an essential feature for efficient frontend data storage. - -### Built-in Multi-tab support -RxDB offers built-in multi-tab support, allowing data synchronization and state management across multiple browser tabs. This feature ensures consistent data access and synchronization, enabling users to work seamlessly across different tabs without conflicts or data inconsistencies. - - - -### Replication Algorithm can be made compatible with any backend -RxDB's [realtime replication algorithm](../replication.md) is designed to be flexible and compatible with various backend systems. Whether you're using your own servers, [Firebase](../replication-firestore.md), [CouchDB](../replication-couchdb.md), [NATS](../replication-nats.md), [WebSocket](../replication-websocket.md), or any other backend, RxDB can be seamlessly integrated and synchronized with the backend system of your choice. - - - -### Flexible storage layer for code reuse -RxDB provides a [flexible storage layer](../rx-storage.md) that enables code reuse across different platforms. Whether you're building applications with [Electron.js](../electron-database.md), [React Native](../react-native-database.md), hybrid apps using [Capacitor.js](../capacitor-database.md), or traditional web browsers, RxDB allows you to reuse the same codebase and leverage the power of a frontend database across different environments. - -### Handling schema changes in distributed environments -In distributed environments where data is stored on multiple client devices, handling schema changes can be challenging. RxDB tackles this challenge by providing robust mechanisms for [handling schema changes](../migration-schema.md). It ensures that schema updates propagate smoothly across devices, maintaining data integrity and enabling seamless schema evolution. - -## Follow Up -To further explore RxDB and get started with using it in your frontend applications, consider the following resources: - -- [RxDB Quickstart](../quickstart.md): A step-by-step guide to quickly set up RxDB in your project and start leveraging its features. -- [RxDB GitHub Repository](https://github.com/pubkey/rxdb): The official repository for RxDB, where you can find the code, examples, and community support. - -By adopting [RxDB](https://rxdb.info/) as your frontend database, you can unlock the full potential of frontend data storage and empower your applications with offline accessibility, caching, improved performance, and seamless data synchronization. RxDB's JavaScript-centric approach and powerful features make it an ideal choice for frontend developers seeking efficient and scalable data storage solutions. diff --git a/docs/articles/ideas.md b/docs/articles/ideas.md deleted file mode 100644 index bccca3271b0..00000000000 --- a/docs/articles/ideas.md +++ /dev/null @@ -1,100 +0,0 @@ -# ideas for articles - -> - storing and searching through 1mio emails in a browser database -- Finding the optimal way to shorten vector embeddings -- Performance and quality of vector comparison functions (euclideanDistance etc) -- performance and quality of vector indexing methods -- What is new in IndexedDB 3.0 -- how progressive syncing beats client-server architecture - -# ideas for articles - -- storing and searching through 1mio emails in a browser database -- Finding the optimal way to shorten vector embeddings -- Performance and quality of vector comparison functions (euclideanDistance etc) -- performance and quality of vector indexing methods -- What is new in IndexedDB 3.0 -- how progressive syncing beats client-server architecture - -## Seo keywords: - -X- "optimistic ui" -X- "local database" (rddt done) -X- "react-native encryption" -X- "vue database" (rddt done) -X- "jquery database" -X- "vue indexeddb" -X- "firebase realtime database alternative" (rddt done) -X- "firestore alternative" (rddt done) -X- "ionic storage" (rddt done) -X- "local database" -X- "offline database" -X- "zero local first" -X- "webrtc p2p" - 390 http://localhost:3000/replication-webrtc.html - -X- "indexeddb storage limit" - 590 https://rxdb.info/articles/indexeddb-max-storage-limit.html -X- "indexeddb size limit" - 260 https://rxdb.info/articles/indexeddb-max-storage-limit.html -X- "indexeddb max size" - 590 https://rxdb.info/articles/indexeddb-max-storage-limit.html -X- "indexeddb limits" - 170 https://rxdb.info/articles/indexeddb-max-storage-limit.html - -X- "json based database" -X- "json vs database" -X- "reactjs storage" - -## Seo - -- "supabase alternative" -- "store local storage" -- "react localstorage" -- "react-native storage" -- "supabase offline" - 260 -- "store array in localstorage", "localStorage array of objects" -- "real time web apps" - 170 -- "reactive database" - 210 -- "electron sqlite" -- "in browser database" - 90 -- "offline first app" - 260 -- "react native sql" - 110 -- "sqlite electron" -- "localstorage vs indexeddb" -- "react native nosql database" - 30 -- "indexeddb library" - 260 -- "indexeddb encryption" - 90 -- "client side database" - 140 -- "webtransport vs websocket" -- "local first development" - 210 -- "local storage examples" -- "local vector database" - 590 -- "mobile app database" - 590 -- "web based database" -- "livequery" - 210 -- "expo database" - 390 -- "database sync" - 8100 -- "p2p database" - 170 -- "reactive app" - 260 -- "offline web app" - 320 -- "offline sync" - 320 -- "react native encrypted storage" - 1000 -- "firestore vs firebase" - 1300 -- "ionic alternatives" - 480 -- "react native backend" - 720 -- "react native alternative" - 1000 -- "react native sqlite" - 1900 -- "flutter vs react native" - 5400 -- "react native redux" - 3600 -- "redux alternative" - 1300 -- "Awesome local first" - 10 -- "tauri database" - 170 - -- "sqlite javascript" - 2900 -- "sqlite typescript" - 260 - -- "sync engine" - 390 -- "indexeddb alternative" - 70 - -## Non Seo - -- "Local-First Partial Sync with RxDB" -- "why the indexeddb API is almost perfekt" -- "how to do auth with RxDB" -- "Where to store that JWT token?" diff --git a/docs/articles/ideas/index.html b/docs/articles/ideas/index.html deleted file mode 100644 index 3e353d4c23e..00000000000 --- a/docs/articles/ideas/index.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - - -ideas for articles | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ideas for articles

-
    -
  • storing and searching through 1mio emails in a browser database
  • -
  • Finding the optimal way to shorten vector embeddings
  • -
  • Performance and quality of vector comparison functions (euclideanDistance etc)
  • -
  • performance and quality of vector indexing methods
  • -
  • What is new in IndexedDB 3.0
  • -
  • how progressive syncing beats client-server architecture
  • -
-

Seo keywords:

-

X- "optimistic ui" -X- "local database" (rddt done) -X- "react-native encryption" -X- "vue database" (rddt done) -X- "jquery database" -X- "vue indexeddb" -X- "firebase realtime database alternative" (rddt done) -X- "firestore alternative" (rddt done) -X- "ionic storage" (rddt done) -X- "local database" -X- "offline database" -X- "zero local first" -X- "webrtc p2p" - 390 http://localhost:3000/replication-webrtc.html

-

X- "indexeddb storage limit" - 590 https://rxdb.info/articles/indexeddb-max-storage-limit.html -X- "indexeddb size limit" - 260 https://rxdb.info/articles/indexeddb-max-storage-limit.html -X- "indexeddb max size" - 590 https://rxdb.info/articles/indexeddb-max-storage-limit.html -X- "indexeddb limits" - 170 https://rxdb.info/articles/indexeddb-max-storage-limit.html

-

X- "json based database" -X- "json vs database" -X- "reactjs storage"

-

Seo

-
    -
  • -

    "supabase alternative"

    -
  • -
  • -

    "store local storage"

    -
  • -
  • -

    "react localstorage"

    -
  • -
  • -

    "react-native storage"

    -
  • -
  • -

    "supabase offline" - 260

    -
  • -
  • -

    "store array in localstorage", "localStorage array of objects"

    -
  • -
  • -

    "real time web apps" - 170

    -
  • -
  • -

    "reactive database" - 210

    -
  • -
  • -

    "electron sqlite"

    -
  • -
  • -

    "in browser database" - 90

    -
  • -
  • -

    "offline first app" - 260

    -
  • -
  • -

    "react native sql" - 110

    -
  • -
  • -

    "sqlite electron"

    -
  • -
  • -

    "localstorage vs indexeddb"

    -
  • -
  • -

    "react native nosql database" - 30

    -
  • -
  • -

    "indexeddb library" - 260

    -
  • -
  • -

    "indexeddb encryption" - 90

    -
  • -
  • -

    "client side database" - 140

    -
  • -
  • -

    "webtransport vs websocket"

    -
  • -
  • -

    "local first development" - 210

    -
  • -
  • -

    "local storage examples"

    -
  • -
  • -

    "local vector database" - 590

    -
  • -
  • -

    "mobile app database" - 590

    -
  • -
  • -

    "web based database"

    -
  • -
  • -

    "livequery" - 210

    -
  • -
  • -

    "expo database" - 390

    -
  • -
  • -

    "database sync" - 8100

    -
  • -
  • -

    "p2p database" - 170

    -
  • -
  • -

    "reactive app" - 260

    -
  • -
  • -

    "offline web app" - 320

    -
  • -
  • -

    "offline sync" - 320

    -
  • -
  • -

    "react native encrypted storage" - 1000

    -
  • -
  • -

    "firestore vs firebase" - 1300

    -
  • -
  • -

    "ionic alternatives" - 480

    -
  • -
  • -

    "react native backend" - 720

    -
  • -
  • -

    "react native alternative" - 1000

    -
  • -
  • -

    "react native sqlite" - 1900

    -
  • -
  • -

    "flutter vs react native" - 5400

    -
  • -
  • -

    "react native redux" - 3600

    -
  • -
  • -

    "redux alternative" - 1300

    -
  • -
  • -

    "Awesome local first" - 10

    -
  • -
  • -

    "tauri database" - 170

    -
  • -
  • -

    "sqlite javascript" - 2900

    -
  • -
  • -

    "sqlite typescript" - 260

    -
  • -
  • -

    "sync engine" - 390

    -
  • -
  • -

    "indexeddb alternative" - 70

    -
  • -
-

Non Seo

-
    -
  • "Local-First Partial Sync with RxDB"
  • -
  • "why the indexeddb API is almost perfekt"
  • -
  • "how to do auth with RxDB"
  • -
  • "Where to store that JWT token?"
  • -
- - \ No newline at end of file diff --git a/docs/articles/in-memory-nosql-database.html b/docs/articles/in-memory-nosql-database.html deleted file mode 100644 index 7e8c02fcc0e..00000000000 --- a/docs/articles/in-memory-nosql-database.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - -RxDB In-Memory NoSQL - Supercharge Real-Time Apps | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RxDB as In-memory NoSQL Database: Empowering Real-Time Applications

-

Real-time applications have become increasingly popular in today's digital landscape. From instant messaging to collaborative editing tools, the demand for responsive and interactive software is on the rise. To meet these requirements, developers need powerful and efficient database solutions that can handle large amounts of data in real-time. RxDB, an javascript NoSQL database, is revolutionizing the way developers build and scale their applications by offering exceptional speed, flexibility, and scalability.

-
RxDB Flutter Database
-

Speed and Performance Benefits

-

One of the key advantages of using RxDB as an in-memory NoSQL database is its ability to leverage in-memory storage for faster database operations. By storing data directly in memory, database operations can be performed significantly faster compared to traditional disk-based databases. This is especially important for real-time applications where every millisecond counts. With RxDB, developers can achieve near-instantaneous data access and manipulation, enabling highly responsive user experiences.

-

Additionally, RxDB eliminates disk I/O bottlenecks that are typically associated with traditional databases. In traditional databases, disk reads and writes can become a bottleneck as the amount of data grows. In contrast, an in-memory database like RxDB keeps the entire dataset in RAM, eliminating disk access overhead. This makes it an excellent choice for applications dealing with real-time analytics, high-throughput data processing, and caching.

-

Persistence Options

-

While RxDB offers an in-memory storage adapter, it also offers persistence storages. Adapters such as IndexedDB, SQLite, and OPFS enable developers to persist data locally in the browser, making applications accessible even when offline. This hybrid approach combines the benefits of in-memory performance with data durability, providing the best of both worlds. Developers can choose the adapter that best suits their needs, balancing the speed of in-memory storage with the long-term data persistence required for certain applications.

-
import {
-    createRxDatabase
-} from 'rxdb';
-import {
-    getRxStorageMemory
-} from 'rxdb/plugins/storage-memory';
- 
-const db = await createRxDatabase({
-    name: 'exampledb',
-    storage: getRxStorageMemory()
-});
-

Also the memory mapped RxStorage exists as a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance is replicated with the underlying storage for persistence. The main reason to use this is to improve initial page load and query/write times. This is mostly useful in browser based applications.

-

Use Cases for RxDB

-

RxDB's capabilities make it well-suited for various real-time applications. Some notable use cases include:

-
    -
  • -

    Chat Applications and Real-Time Messaging: RxDB's in-memory performance and real-time synchronization capabilities make it an excellent choice for building chat applications and real-time messaging systems. Developers can ensure that messages are delivered and synchronized across multiple clients in real-time, providing a seamless and responsive chat experience.

    -
  • -
  • -

    Collaborative Document Editors: RxDB's ability to handle data streams and propagate changes in real-time makes it ideal for collaborative document editing. Multiple users can simultaneously edit a document, and their changes are instantly synchronized, allowing for real-time collaboration and ensuring that everyone has the most up-to-date version of the document.

    -
  • -
  • -

    Real-Time Analytics Dashboards: RxDB's speed and scalability make it a valuable tool for real-time analytics dashboards. It can handle high volumes of data and perform complex analytics operations in real-time, providing instant insights and visualizations to users.

    -
  • -
-

In conclusion, RxDB serves as a powerful in-memory NoSQL database that empowers developers to build real-time applications with exceptional speed, flexibility, and scalability. Its ability to leverage in-memory storage, eliminate disk I/O bottlenecks, and provide persistence options make it an attractive choice for a wide range of real-time use cases. Whether it's chat applications, collaborative document editors, or real-time analytics dashboards, RxDB provides the foundation for building responsive and interactive software that meets the demands of today's users.

- - \ No newline at end of file diff --git a/docs/articles/in-memory-nosql-database.md b/docs/articles/in-memory-nosql-database.md deleted file mode 100644 index 4ef9076b1fa..00000000000 --- a/docs/articles/in-memory-nosql-database.md +++ /dev/null @@ -1,48 +0,0 @@ -# RxDB In-Memory NoSQL - Supercharge Real-Time Apps - -> Discover how RxDB's in-memory NoSQL engine delivers blazing speed for real-time apps, ensuring responsive experiences and seamless data sync. - -# RxDB as In-memory NoSQL Database: Empowering Real-Time Applications - -Real-time applications have become increasingly popular in today's digital landscape. From instant messaging to collaborative editing tools, the demand for responsive and interactive software is on the rise. To meet these requirements, developers need powerful and efficient database solutions that can handle large amounts of data in real-time. [RxDB](https://rxdb.info/), an javascript NoSQL database, is revolutionizing the way developers build and scale their applications by offering exceptional speed, flexibility, and scalability. - -
- - - -
- -## Speed and Performance Benefits -One of the key advantages of using RxDB as an in-memory NoSQL database is its ability to leverage in-memory storage for faster database operations. By storing data directly in memory, database operations can be performed significantly faster compared to traditional disk-based databases. This is especially important for real-time applications where every millisecond counts. With RxDB, developers can achieve near-instantaneous data access and manipulation, enabling highly responsive user experiences. - -Additionally, RxDB eliminates disk I/O bottlenecks that are typically associated with traditional databases. In traditional databases, disk reads and writes can become a bottleneck as the amount of data grows. In contrast, an in-memory database like RxDB keeps the entire dataset in RAM, eliminating disk access overhead. This makes it an excellent choice for applications dealing with real-time analytics, high-throughput data processing, and caching. - -## Persistence Options -While RxDB offers an [in-memory](../rx-storage-memory.md) storage adapter, it also offers [persistence storages](../rx-storage.md). Adapters such as [IndexedDB](../rx-storage-indexeddb.md), [SQLite](../rx-storage-sqlite.md), and [OPFS](../rx-storage-opfs.md) enable developers to persist data locally in the browser, making applications accessible even when offline. This hybrid approach combines the benefits of in-memory performance with data durability, providing the best of both worlds. Developers can choose the adapter that best suits their needs, balancing the speed of in-memory storage with the long-term data persistence required for certain applications. - -```javascript -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageMemory -} from 'rxdb/plugins/storage-memory'; - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageMemory() -}); -``` - -Also the [memory mapped RxStorage](../rx-storage-memory-mapped.md) exists as a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance is replicated with the underlying storage for persistence. The main reason to use this is to improve initial page load and query/write times. This is mostly useful in browser based applications. - -## Use Cases for RxDB -RxDB's capabilities make it well-suited for various real-time applications. Some notable use cases include: - -- Chat Applications and Real-Time Messaging: RxDB's in-memory performance and real-time synchronization capabilities make it an excellent choice for building chat applications and real-time messaging systems. Developers can ensure that messages are delivered and synchronized across multiple clients in real-time, providing a seamless and responsive chat experience. - -- Collaborative Document Editors: RxDB's ability to handle data streams and propagate changes in real-time makes it ideal for collaborative document editing. Multiple users can simultaneously edit a document, and their changes are instantly synchronized, allowing for real-time collaboration and ensuring that everyone has the most up-to-date version of the document. - -- Real-Time Analytics Dashboards: RxDB's speed and scalability make it a valuable tool for real-time analytics dashboards. It can handle high volumes of data and perform complex analytics operations in real-time, providing instant insights and visualizations to users. - -In conclusion, RxDB serves as a powerful in-memory NoSQL database that empowers developers to build real-time applications with exceptional speed, flexibility, and scalability. Its ability to leverage in-memory storage, eliminate disk I/O bottlenecks, and provide persistence options make it an attractive choice for a wide range of real-time use cases. Whether it's chat applications, collaborative document editors, or real-time analytics dashboards, RxDB provides the foundation for building responsive and interactive software that meets the demands of today's users. diff --git a/docs/articles/indexeddb-max-storage-limit.html b/docs/articles/indexeddb-max-storage-limit.html deleted file mode 100644 index b034853766b..00000000000 --- a/docs/articles/indexeddb-max-storage-limit.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - -IndexedDB Max Storage Size Limit - Detailed Best Practices | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IndexedDB Max Storage Size Limit

-

IndexedDB is widely known as the primary browser-based storage API for large client-side data, particularly valuable for modern offline-first applications. These apps aim to keep everything functional and interactive even without an internet connection, which naturally demands substantial local storage. However, IndexedDB has various size limits depending on the browser, disk space, and user settings. Being aware of these constraints is crucial so you can avoid quota errors and deliver a seamless user experience without unexpected data loss.

-

Offline-first apps have grown in popularity because they provide immediate feedback, zero-latency interactions, and resilience in poor network conditions. Storing big data sets, or even entire data models, in IndexedDB has become far more common than in the era of small localStorage or cookie usage. But all this local data is subject to quotas, and that’s exactly what this guide will help you understand and manage.

-

Why IndexedDB Has a Storage Limit

-

Browsers need a way to curb runaway disk usage and safeguard user resources. This is accomplished through quota management policies, which can vary among Chrome, Firefox, Safari, Edge, and others. Some browsers use a percentage of your total disk space, while others rely on a fixed maximum or dynamic approach per origin. These policies are designed to prevent malicious or poorly optimized web pages from consuming an unreasonable amount of user storage.

-

Chrome (and Chromium-based browsers) typically allow you to use a percentage of the user’s free disk space, whereas Firefox historically prompts users to allow more than 5 MB in mobile or 50 MB in desktop. Safari often sets tighter maximum caps, especially on iOS devices. Edge aligns closely with Chrome’s rules but can also include enterprise or corporate policy overrides. Understanding these default or dynamic limits prepares you to plan your app’s storage needs appropriately.

-

Browser-Specific IndexedDB Limits

-

IndexedDB size quotas differ significantly across browsers and platforms. While there isn’t a universal rule, the following table summarizes approximate limits and any notes or caveats you should be aware of:

-
BrowserApprox. LimitNotes
Chrome/ChromiumUp to ~80% of free disk, per origin capOften cited as 60 GB on a 100 GB drive. Shared pool approach. Quota usage can prompt partial or extended user approvals.
Firefox~2 GB (desktop) or ~5 MB initial for mobileOlder versions asked permission at 50 MB for desktop. Ephemeral/incognito sessions may require repeated user prompts.
Safari (iOS)~1 GB per origin (variable)Historically stricter. iOS devices limit quotas further. Behavior can differ between iOS Safari versions or iPadOS.
EdgeSimilar to Chrome’s 80% of free spaceCan be influenced by Windows enterprise policies. Generally aligned with Chromium approach.
iOS SafariTypically 1 GB, can be less on older iOSEarly iOS versions were known for more aggressive quotas and data eviction on low space.
Android ChromeSimilar to desktop ChromeMay exhibit warnings in especially low-storage devices. The same 80% free space logic generally applies.
-

Historically, these limits have evolved. For instance, older Firefox versions included dom.indexedDB.warningQuota, showing a 50 MB prompt on desktop or a 5 MB prompt on mobile—many developers wrote about these notifications on Stack Overflow. Since around 2015, Firefox has changed its quota approach significantly. Likewise, Safari used to limit data more aggressively on older iOS versions. Some older tutorials suggest comparing IndexedDB to localStorage, but modern browsers allow far larger and more flexible storage with IndexedDB than the old localStorage or cookie-based setups.

-
-

Checking Your Current IndexedDB Usage

-

To assess where your app stands relative to these storage limits, you can use the Storage Estimation API. The snippet below shows how to estimate both your used storage and the total space allocated to your origin:

-
const quota = await navigator.storage.estimate();
-const totalSpace = quota.quota;
-const usedSpace = quota.usage;
-console.log('Approx total allocated space:', totalSpace);
-console.log('Approx used space:', usedSpace);
-

Some browsers (all modern ones) also provide a navigator.storage.persist() method to request persistent storage, preventing the browser from automatically clearing your data if the user’s device runs low on space. Note that users might deny such requests, or the request might fail silently on stricter environments. Always handle these outcomes gracefully and design your app to degrade if persistent storage is unavailable.

-

Testing Your App’s IndexedDB Quotas

-

The best way to handle real-world usage is to test for low storage conditions and large data sets in different environments. You can fill up the space manually by writing repetitive test data or running scripts that bulk-insert documents until an error occurs.

-

Real-time usage monitors or dashboards can keep track of your navigator.storage.estimate() results, letting you see how close you are to the max limit in production. Developer tools in Chrome or Firefox can simulate limited storage situations, which is crucial for QA:

-
Simulate low storage quota with DevTools
0:42
Simulate low storage quota with DevTools
-
-

This short tutorial shows how you can artificially reduce available storage in Google Chrome’s dev tools to see how your app behaves when nearing or exceeding the quota.

-

Handling Errors When Limits Are Reached

-

When the user’s device is too full or your app exceeds the allotted quota, most browsers will throw a QuotaExceededError (or similarly named exception) when trying to store additional data. Often, the request to IndexedDB simply fails with an error event. Handling this gracefully is essential to avoid crashes or data corruption.

-

A typical approach is to wrap your write operations in try/catch blocks or in onsuccess / onerror event callbacks. If you detect a quota error, you can prompt the user to clear out old items or reduce the scope of offline data. Some apps implement a fallback system that removes less critical documents to free space and then retries the write.

-
try {
-  const tx = db.transaction('largeStore', 'readwrite');
-  const store = tx.objectStore('largeStore');
-  await store.add(hugeData, someKey);
-  await tx.done;
-} catch (error) {
-  if (error.name === 'QuotaExceededError') {
-    console.warn('IndexedDB quota exceeded. Cleanup or prompt user to free space.');
-    // Optionally remove older data or show a UI hint:
-    // removeOldDocuments();
-    // displayStorageFullDialog();
-  } else {
-    // handle other errors
-    console.error('IndexedDB write error:', error);
-  }
-}
-

Tricks to Exceed the Storage Size Limitation

-

Even if you plan well, your app might need more storage than a single origin typically allows. There are a few advanced tactics you can use:

-

If you store binary data such as images or videos, consider compressing them via the Compression Streams API. For textual or JSON data, a library like RxDB supports built-in key-compression to shorten field names or entire documents. This can be extremely helpful when storing large sets of objects:

-
// Example: How key-compression can transform your documents internally
-const uncompressed = {
-  "firstName": "Corrine",
-  "lastName": "Ziemann",
-  "shoppingCartItems": [
-    {
-      "productNumber": 29857,
-      "amount": 1
-    },
-    {
-      "productNumber": 53409,
-      "amount": 6
-    }
-  ]
-};
-const compressed = {
-  "|e": "Corrine",
-  "|g": "Ziemann",
-  "|i": [
-    {
-      "|h": 29857,
-      "|b": 1
-    },
-    {
-      "|h": 53409,
-      "|b": 6
-    }
-  ]
-};
-

Sharding data across multiple subdomains or iframes is another trick, though it complicates communication. When you need truly massive offline data, you might store part of the data under sub1.yoursite.com and another chunk under sub2.yoursite.com, using postMessage() to coordinate. This can circumvent single-origin limitations, but it introduces extra complexity. Another effective method is to let data expire automatically—perhaps older records are removed if they haven’t been accessed for a certain period.

-
JavaScript Database
-

IndexedDB Max Size of a Single Object

-

There is no explicit cap on how large an individual object or record in IndexedDB can be, other than the overall disk quota. If you attempt to store one extremely large object, you will eventually hit browser memory constraints or the global storage quota. In practice, you’ll encounter out-of-memory issues in JavaScript before IndexedDB itself refuses a single large write. A helpful test can be seen in this JSFiddle experiment where you see browsers can crash when creating massive in-memory objects.

-

Is There a Time Limit for Data Stored in IndexedDB?

-

IndexedDB data can remain indefinitely as long as the user does not clear the browser’s data or the origin does not run afoul of automated eviction policies (e.g., Safari or Android might remove large caches for sites unused over a long period when space is needed). Typically, there is no “time limit,” but ephemeral modes or incognito sessions have their own rules. If you rely on permanent offline data, request persistent storage and handle the possibility that the user or the OS could still remove your data under extreme conditions. Especially Safari is known to be very fast in deleting local data.

-

safari database

-

Follow Up

-

Learn more by checking the IndexedDB official docs, which detail store design, error handling, and quota usage. If you need a straightforward way to manage large offline data with compression and conflict resolution, explore the RxDB Quickstart. You can also join the community on GitHub to share tips on overcoming the IndexedDB max storage size limit in production environments.

- - \ No newline at end of file diff --git a/docs/articles/indexeddb-max-storage-limit.md b/docs/articles/indexeddb-max-storage-limit.md deleted file mode 100644 index 640da1fb8f8..00000000000 --- a/docs/articles/indexeddb-max-storage-limit.md +++ /dev/null @@ -1,153 +0,0 @@ -# IndexedDB Max Storage Size Limit - Detailed Best Practices - -> Learn how browsers enforce IndexedDB storage size limits, how to test and handle quota exceeded errors, and best practices for storing large amounts of data offline. - - - -import {VideoBox} from '@site/src/components/video-box'; - -# IndexedDB Max Storage Size Limit - -IndexedDB is widely known as the primary browser-based storage API for large client-side data, particularly valuable for modern offline-first applications. These apps aim to keep everything functional and interactive even without an internet connection, which naturally demands substantial local storage. However, IndexedDB has various size limits depending on the browser, disk space, and user settings. Being aware of these constraints is crucial so you can avoid quota errors and deliver a seamless user experience without unexpected data loss. - -Offline-first apps have grown in popularity because they provide immediate feedback, zero-latency interactions, and resilience in poor network conditions. Storing big data sets, or even entire data models, in IndexedDB has become far more common than in the era of small localStorage or cookie usage. But all this local data is subject to quotas, and that’s exactly what this guide will help you understand and manage. - -## Why IndexedDB Has a Storage Limit - -Browsers need a way to curb runaway disk usage and safeguard user resources. This is accomplished through **quota management** policies, which can vary among Chrome, Firefox, Safari, Edge, and others. Some browsers use a percentage of your total disk space, while others rely on a fixed maximum or dynamic approach per origin. These policies are designed to prevent malicious or poorly optimized web pages from consuming an unreasonable amount of user storage. - -Chrome (and Chromium-based browsers) typically allow you to use a percentage of the user’s free disk space, whereas Firefox historically prompts users to allow more than 5 MB in mobile or 50 MB in desktop. Safari often sets tighter maximum caps, especially on iOS devices. Edge aligns closely with Chrome’s rules but can also include enterprise or corporate policy overrides. Understanding these default or dynamic limits prepares you to plan your app’s storage needs appropriately. - -## Browser-Specific IndexedDB Limits - -IndexedDB size quotas differ significantly across browsers and platforms. While there isn’t a universal rule, the following table summarizes approximate limits and any notes or caveats you should be aware of: - -| Browser | Approx. Limit | Notes | -|----------------|---------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------| -| Chrome/Chromium | Up to ~80% of free disk, per origin cap | Often cited as 60 GB on a 100 GB drive. Shared pool approach. Quota usage can prompt partial or extended user approvals. | -| Firefox | ~2 GB (desktop) or ~5 MB initial for mobile | Older versions asked permission at 50 MB for desktop. Ephemeral/incognito sessions may require repeated user prompts. | -| Safari (iOS) | ~1 GB per origin (variable) | Historically stricter. iOS devices limit quotas further. Behavior can differ between iOS Safari versions or iPadOS. | -| Edge | Similar to Chrome’s 80% of free space | Can be influenced by Windows enterprise policies. Generally aligned with Chromium approach. | -| iOS Safari | Typically 1 GB, can be less on older iOS | Early iOS versions were known for more aggressive quotas and data eviction on low space. | -| Android Chrome | Similar to desktop Chrome | May exhibit warnings in especially low-storage devices. The same 80% free space logic generally applies. | - -Historically, these limits have evolved. For instance, older Firefox versions included `dom.indexedDB.warningQuota`, showing a 50 MB prompt on desktop or a 5 MB prompt on mobile—many developers wrote about these notifications on Stack Overflow. Since around 2015, Firefox has changed its quota approach significantly. Likewise, Safari used to limit data more aggressively on older iOS versions. Some older tutorials suggest comparing IndexedDB to localStorage, but modern browsers allow far larger and more flexible storage with IndexedDB than the old localStorage or cookie-based setups. - ---- - -## Checking Your Current IndexedDB Usage - -To assess where your app stands relative to these storage limits, you can use the **Storage Estimation API**. The snippet below shows how to estimate both your used storage and the total space allocated to your origin: - -```js -const quota = await navigator.storage.estimate(); -const totalSpace = quota.quota; -const usedSpace = quota.usage; -console.log('Approx total allocated space:', totalSpace); -console.log('Approx used space:', usedSpace); -``` - -[Some browsers (all modern ones)](https://developer.mozilla.org/en-US/docs/Web/API/StorageManager/persist#browser_compatibility) also provide a `navigator.storage.persist()` method to request persistent storage, preventing the browser from automatically clearing your data if the user’s device runs low on space. Note that users might deny such requests, or the request might fail silently on stricter environments. Always handle these outcomes gracefully and design your app to degrade if persistent storage is unavailable. - -## Testing Your App’s IndexedDB Quotas - -The best way to handle real-world usage is to test for low storage conditions and large data sets in different environments. You can fill up the space manually by writing repetitive test data or running scripts that bulk-insert documents until an error occurs. - -Real-time usage monitors or dashboards can keep track of your `navigator.storage.estimate()` results, letting you see how close you are to the max limit in production. Developer tools in Chrome or Firefox can simulate limited storage situations, which is crucial for QA: - -
- -
- -This short tutorial shows how you can artificially reduce available storage in Google Chrome’s dev tools to see how your app behaves when nearing or exceeding the quota. - -## Handling Errors When Limits Are Reached - -When the user’s device is too full or your app exceeds the allotted quota, most browsers will throw a **QuotaExceededError** (or similarly named exception) when trying to store additional data. Often, the request to IndexedDB simply fails with an error event. Handling this gracefully is essential to avoid crashes or data corruption. - -A typical approach is to wrap your write operations in try/catch blocks or in `onsuccess` / `onerror` event callbacks. If you detect a quota error, you can prompt the user to clear out old items or reduce the scope of offline data. Some apps implement a fallback system that removes less critical documents to free space and then retries the write. - -```js -try { - const tx = db.transaction('largeStore', 'readwrite'); - const store = tx.objectStore('largeStore'); - await store.add(hugeData, someKey); - await tx.done; -} catch (error) { - if (error.name === 'QuotaExceededError') { - console.warn('IndexedDB quota exceeded. Cleanup or prompt user to free space.'); - // Optionally remove older data or show a UI hint: - // removeOldDocuments(); - // displayStorageFullDialog(); - } else { - // handle other errors - console.error('IndexedDB write error:', error); - } -} -``` - -## Tricks to Exceed the Storage Size Limitation - -Even if you plan well, your app might need more storage than a single origin typically allows. There are a few advanced tactics you can use: - -If you store binary data such as images or videos, consider compressing them via the Compression Streams API. For textual or [JSON data](./json-based-database.md), a library like [RxDB](/) supports built-in [key-compression](../key-compression.md) to shorten field names or entire documents. This can be extremely helpful when storing large sets of objects: - -```ts -// Example: How key-compression can transform your documents internally -const uncompressed = { - "firstName": "Corrine", - "lastName": "Ziemann", - "shoppingCartItems": [ - { - "productNumber": 29857, - "amount": 1 - }, - { - "productNumber": 53409, - "amount": 6 - } - ] -}; -const compressed = { - "|e": "Corrine", - "|g": "Ziemann", - "|i": [ - { - "|h": 29857, - "|b": 1 - }, - { - "|h": 53409, - "|b": 6 - } - ] -}; -``` - -Sharding data across multiple subdomains or iframes is another trick, though it complicates communication. When you need truly massive offline data, you might store part of the data under `sub1.yoursite.com` and another chunk under `sub2.yoursite.com`, using `postMessage()` to coordinate. This can circumvent single-origin limitations, but it introduces extra complexity. Another effective method is to let data expire automatically—perhaps older records are removed if they haven’t been accessed for a certain period. - -
- - - -
- -## IndexedDB Max Size of a Single Object - -There is no explicit cap on how large an individual object or record in IndexedDB can be, other than the overall disk quota. If you attempt to store one extremely large object, you will eventually hit browser memory constraints or the global storage quota. In practice, you’ll encounter out-of-memory issues in JavaScript before IndexedDB itself refuses a single large write. A helpful test can be seen in [this JSFiddle experiment](https://jsfiddle.net/sdrqf8om/2/) where you see browsers can crash when creating massive in-memory objects. - -## Is There a Time Limit for Data Stored in IndexedDB? - -IndexedDB data can remain indefinitely as long as the user does not clear the browser’s data or the origin does not run afoul of automated eviction policies (e.g., Safari or Android might remove large caches for sites unused over a long period when space is needed). Typically, there is no “time limit,” but ephemeral modes or incognito sessions have their own rules. If you rely on permanent offline data, request persistent storage and handle the possibility that the user or the OS could still remove your data under extreme conditions. Especially Safari is known to be very fast in deleting local data. - - - -## Follow Up - -Learn more by checking the [IndexedDB official docs](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API), which detail store design, error handling, and quota usage. If you need a straightforward way to manage large offline data with compression and conflict resolution, explore the [RxDB Quickstart](../quickstart.md). You can also join the community on [GitHub](/code/) to share tips on overcoming the **IndexedDB max storage size limit** in production environments. diff --git a/docs/articles/ionic-database.html b/docs/articles/ionic-database.html deleted file mode 100644 index d0340e17971..00000000000 --- a/docs/articles/ionic-database.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - -RxDB - The Perfect Ionic Database | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Ionic Storage - RxDB as database for hybrid apps

-

In the fast-paced world of mobile app development, hybrid applications have emerged as a versatile solution, offering the best of both worlds - the web and native app experiences. One key challenge these apps face is efficiently storing and querying data on the client's device. Enter RxDB, a powerful client-side database tailored for ionic hybrid applications. In this article, we'll explore how RxDB addresses the requirements of storing and querying data in ionic apps, and why it stands out as a preferred choice.

-
Ionic Database Storage
-

What are Ionic Hybrid Apps?

-

Ionic (aka Ionic 2 ) hybrid apps combine the strengths of web technologies (HTML, CSS, JavaScript) with native app development to deliver cross-platform applications. They are built using web technologies and then wrapped in a native container to be deployed on various platforms like iOS, Android, and the web. These apps provide a consistent user experience across devices while benefiting from the efficiency and familiarity of web development.

-

Storing and Querying Data in an Ionic App

-

Storing and querying data is a fundamental aspect of any application, including hybrid apps. These apps often need to operate offline, store user-generated content, and provide responsive user interfaces. Therefore, having a reliable and efficient way to manage data on the client's device is crucial.

-

Introducing RxDB as a Client-Side Database for Ionic Apps

-

RxDB steps in as a powerful solution to address the data management needs of ionic hybrid apps. It's a NoSQL client-side database that offers exceptional performance and features tailored to the unique requirements of client-side applications. Let's delve into the key features of RxDB that make it a great fit for these apps.

-

Getting Started with RxDB

-
JavaScript Ionic Database Storage
-

What is RxDB?

-

At its core, RxDB is a NoSQL database that operates with a local-first approach. This means that your app's data is stored and processed primarily on the client's device, reducing the dependency on constant network connectivity. By doing so, RxDB ensures your app remains responsive and functional, even when offline.

-

Local-First Approach

-

The local-first approach adopted by RxDB is a game-changer for hybrid applications. Storing data locally allows your app to function seamlessly without an internet connection, providing users with uninterrupted access to their data. When connectivity is restored, RxDB handles the synchronization of data, ensuring that any changes made offline are appropriately propagated.

-

Observable Queries

-

One of RxDB's standout features is its implementation of observable queries. This concept allows your app's user interface to be dynamically updated in real time as data changes within the database. RxDB's observables create a bridge between your database and user interface, keeping them in sync effortlessly.

-

realtime ui updates

-

NoSQL Query Engine

-

RxDB's NoSQL query engine empowers you to perform powerful queries on your app's data, without the constraints imposed by traditional relational databases. This flexibility is particularly valuable when dealing with unstructured or semi-structured data. With the NoSQL query engine, you can retrieve, filter, and manipulate data according to your app's unique requirements.

-
const foundDocuments = await myDatabase.todos.find({
-    selector: {
-        done: {
-            $eq: false
-        }
-    }
-}).exec();
-

Great Observe Performance with EventReduce

-

RxDB introduces a concept called EventReduce, which optimizes the observation process. Instead of overwhelming your app's UI with every data change, EventReduce filters and batches these changes to provide a smooth and efficient experience. This leads to enhanced app performance, lower resource usage, and ultimately, happier users.

-

Why NoSQL is a Better Fit for Client-Side Applications Compared to relational databases like SQLite

-

When it comes to choosing the right database solution for your client-side applications, NoSQL RxDB presents compelling advantages over traditional options like SQLite. Let's delve into the key reasons why NoSQL RxDB is a superior fit for your ionic hybrid app development.

-

Easier Document-Based Replication

-

NoSQL databases, like RxDB, inherently embrace a document-based approach to data storage. This design choice simplifies data replication between clients and servers. With documents representing discrete units of data, you can easily synchronize individual pieces of information without the complexity that can arise when dealing with rows and tables in a relational database like SQLite. This document-centric replication model streamlines the synchronization process and ensures that your app's data remains consistent across devices.

-

Offline Capable

-

One of the defining features of client-side applications is the ability to function even when offline. NoSQL RxDB excels in this area by supporting a local-first approach. Data is cached on the client's device, enabling the app to remain fully functional even without an internet connection. As connectivity is restored, RxDB handles data synchronization with the server seamlessly. This offline capability ensures a smooth user experience, critical for ionic hybrid apps catering to users in various network conditions.

-

NoSQL Has Better TypeScript Support

-

TypeScript, a popular superset of JavaScript, is renowned for its static typing and enhanced developer experience. NoSQL databases like RxDB are inherently flexible, making them well-suited for TypeScript integration. With well-defined data structures and clear typings, NoSQL RxDB offers improved type safety and easier development when compared to traditional SQL databases like SQLite. This results in reduced debugging time and increased code reliability.

-

Easier Schema Migration with NoSQL Documents

-

Schema changes are a common occurrence in application development, and dealing with them can be challenging. NoSQL databases, including RxDB, are more forgiving in this aspect. Since documents in NoSQL databases don't enforce a rigid structure like tables in relational databases, schema changes are often simpler to manage. This flexibility makes it easier to evolve your app's data structure over time without the need for complex migration scripts, a notable advantage when compared to SQLite.

-

Great Performance

-

RxDB's excellent performance stems from its advanced indexing capabilities, which streamline data retrieval and ensure swift query execution. Additionally, the JSON key compression employed by RxDB minimizes storage overhead, enabling efficient data transfer and quicker loading times. The incorporation of real-time updates through change streams and the EventReduce mechanism further enhances RxDB's performance, delivering a responsive user experience even as data changes are propagated seamlessly.

-

Using RxDB in an Ionic Hybrid App

-

RxDB's integration into your ionic hybrid app opens up a world of possibilities for efficient data management. Let's explore how to set up RxDB, use it with popular JavaScript frameworks, and take advantage of its diverse storage options.

-

Setup RxDB

-

Getting started with RxDB is a straightforward process. By including the RxDB library in your project, you can quickly start harnessing its capabilities. Begin by installing the RxDB package from the npm registry. Then, configure your database instance to suit your app's needs. This setup process paves the way for seamless data management in your ionic hybrid app. -For a full instruction, follow the RxDB Quickstart.

-

Using RxDB in Frameworks (React, Angular, Vue.js)

-

RxDB seamlessly integrates with various JavaScript frameworks, ensuring compatibility with your preferred development environment. Whether you're building your ionic hybrid app with React, Angular, or Vue.js, RxDB offers bindings and tools that enable you to leverage its features effortlessly. This compatibility allows you to stay within the comfort zone of your chosen framework while benefiting from RxDB's powerful data management capabilities.

-

Different RxStorage Layers for RxDB

-

RxDB doesn't limit you to a single storage solution. Instead, it provides a range of RxStorage layers to accommodate diverse use cases. These storage layers offer flexibility and customization, enabling you to tailor your data management strategy to match your app's requirements. Let's explore some of the available RxStorage options:

-
    -
  • LocalStorage RxStorage: Based on the browsers localStorage. Easy to set up and fast for small datasets.
  • -
  • IndexedDB RxStorage: Leveraging the native browser storage, IndexedDB RxStorage offers reliable data persistence. This storage option is suitable for a wide range of scenarios and is supported by most modern browsers.
  • -
  • OPFS RxStorage: Operating within the browser's file system, OPFS RxStorage is a unique choice that can handle larger data volumes efficiently. It's particularly useful for applications that require substantial data storage.
  • -
  • Memory RxStorage: Memory RxStorage is perfect for temporary or cache-like data storage. It keeps data in memory, which can result in rapid data access but doesn't provide long-term persistence.
  • -
  • SQLite RxStorage: SQLite is the goto database for mobile applications. It is build in on android and iOS devices. The SQLite RxDB storage layer is build upon SQLite and offers the best performance on hybrid apps, like ionic.
  • -
-

Replication of Data with RxDB between Clients and Servers

-

Efficient data replication between clients and servers is the backbone of modern application development, ensuring that data remains consistent and up-to-date across various devices and platforms. RxDB provides a suite of replication methods that facilitate seamless communication between clients and servers, ensuring that your data is always in sync.

-

RxDB Replication Algorithm

-

At the heart of RxDB's replication capabilities lies a sophisticated algorithm designed to manage data synchronization between clients and servers. This algorithm intelligently handles data changes, conflict resolution, and network connectivity fluctuations, resulting in reliable and efficient data replication. With the RxDB replication algorithm, your application can maintain data consistency across devices without unnecessary complexities.

-
    -
  • -

    CouchDB Replication: -RxDB's integration with CouchDB replication presents a powerful way to synchronize data between clients and servers. CouchDB, a well-established NoSQL database, excels at distributed and decentralized data scenarios. By utilizing RxDB's CouchDB replication, you can establish bidirectional synchronization between your RxDB-powered client and a CouchDB server. This synchronization ensures that data updates made on either end are seamlessly propagated to the other, facilitating collaboration and data sharing.

    -
  • -
  • -

    Firestore Replication: -Firestore, Google's cloud-hosted NoSQL database, offers another avenue for data replication in RxDB. With Firestore replication, you can establish a connection between your RxDB-powered app and Firestore's cloud infrastructure. This integration provides real-time updates to data across multiple instances of your application, ensuring that users always have access to the latest information. RxDB's support for Firestore replication empowers you to build dynamic and responsive applications that thrive in today's fast-paced digital landscape.

    -
  • -
  • -

    WebRTC Replication: -Peer-to-peer (P2P) replication via WebRTC introduces a cutting-edge approach to data synchronization in RxDB. P2P replication allows devices to communicate directly with each other, bypassing the need for a central server. This method proves invaluable in scenarios where network connectivity is limited or unreliable. With WebRTC replication, devices can exchange data directly, enabling collaboration and information sharing even in challenging network conditions.

    -
  • -
-

RxDB as an Alternative for Ionic Secure Storage

-

When it comes to securing sensitive data in your Ionic applications, RxDB emerges as a powerful alternative to traditional secure storage solutions. Let's delve into why RxDB is an exceptional choice for safeguarding your data while providing additional benefits.

-

RxDB On-Device Encryption Plugin

-

RxDB offers an on-device encryption plugin, adding an extra layer of security to your app's data. This means that data stored within the RxDB database can be encrypted, ensuring that even if the device falls into the wrong hands, the sensitive information remains inaccessible without the proper decryption key. This level of data protection is crucial for applications that deal with personal or confidential information. Encryption runs either with AES on crypto-js or with the Web Crypto API which is faster and more secure.

-

Works Offline

-

Security should never compromise functionality. RxDB excels in this area by allowing your application to operate seamlessly even when offline. The locally stored encrypted data remains accessible and functional, enabling users to interact with the app's features even without an active internet connection. This offline capability ensures that user data is secure, while the app continues to deliver a responsive and uninterrupted experience.

-

Easy-to-Setup Replication with Your Backend

-

Ensuring data consistency between your client-side application and backend is a key concern for developers. RxDB simplifies this process with its straightforward replication setup. You can effortlessly configure data synchronization between your local RxDB instance and your backend server. This replication capability ensures that encrypted data remains up-to-date and aligned with the central database, enhancing data integrity and security.

-

Compression of Client-Side Stored Data

-

In addition to security and offline capabilities, RxDB also offers data compression. This means that the data stored on the client's device is efficiently compressed, reducing storage requirements and improving overall app performance. This compression ensures that your app remains responsive and efficient, even as data volumes grow.

-

Cost-Effective Solution

-

In addition to its security features, RxDB offers cost-effective benefits. RxDB is priced more affordably compared to some other secure storage solutions, making it an attractive option for developers seeking robust security without breaking the bank. For many users, the free version of RxDB provides ample features to meet their application's security and data management needs.

-

Follow Up

-
- - \ No newline at end of file diff --git a/docs/articles/ionic-database.md b/docs/articles/ionic-database.md deleted file mode 100644 index 42c856913c3..00000000000 --- a/docs/articles/ionic-database.md +++ /dev/null @@ -1,136 +0,0 @@ -# RxDB - The Perfect Ionic Database - -> Supercharge your Ionic hybrid apps with RxDB's offline-first database. Experience real-time sync, top performance, and easy replication. - -# Ionic Storage - RxDB as database for hybrid apps - -In the fast-paced world of mobile app development, **hybrid applications** have emerged as a versatile solution, offering the best of both worlds - the web and native app experiences. One key challenge these apps face is efficiently storing and querying data on the **client's device**. Enter [RxDB](https://rxdb.info/), a powerful client-side database tailored for ionic hybrid applications. In this article, we'll explore how RxDB addresses the requirements of storing and querying data in ionic apps, and why it stands out as a preferred choice. - -
- - - -
- -## What are Ionic Hybrid Apps? - -Ionic (aka Ionic 2 ) hybrid apps combine the strengths of web technologies (HTML, CSS, JavaScript) with native app development to deliver cross-platform applications. They are built using web technologies and then wrapped in a native container to be deployed on various platforms like iOS, Android, and the web. These apps provide a consistent user experience across devices while benefiting from the efficiency and familiarity of web development. - -## Storing and Querying Data in an Ionic App - -Storing and querying data is a fundamental aspect of any application, including hybrid apps. These apps often need to operate offline, store user-generated content, and provide responsive user interfaces. Therefore, having a reliable and efficient way to manage data on the client's device is crucial. - -## Introducing RxDB as a Client-Side Database for Ionic Apps -RxDB steps in as a powerful solution to address the data management needs of ionic hybrid apps. It's a NoSQL client-side database that offers exceptional performance and features tailored to the unique requirements of client-side applications. Let's delve into the key features of RxDB that make it a great fit for these apps. - -### Getting Started with RxDB - -
- - - -
- -### What is RxDB? - -At its core, [RxDB](https://rxdb.info/) is a **NoSQL** database that operates with a [local-first](../offline-first.md) approach. This means that your app's data is stored and processed primarily on the client's device, reducing the dependency on constant network connectivity. By doing so, RxDB ensures your app remains responsive and functional, even when offline. - -### Local-First Approach -The [local-first](../offline-first.md) approach adopted by RxDB is a game-changer for hybrid applications. Storing data locally allows your app to function seamlessly without an internet connection, providing users with uninterrupted access to their data. When connectivity is restored, RxDB handles the synchronization of data, ensuring that any changes made offline are appropriately propagated. - -### Observable Queries -One of RxDB's standout features is its implementation of observable queries. This concept allows your app's user interface to be dynamically updated in real time as data changes within the database. RxDB's observables create a bridge between your database and user interface, keeping them in sync effortlessly. - - - -### NoSQL Query Engine -RxDB's NoSQL query engine empowers you to perform powerful queries on your app's data, without the constraints imposed by traditional relational databases. This flexibility is particularly valuable when dealing with unstructured or semi-structured data. With the NoSQL query engine, you can retrieve, filter, and manipulate data according to your app's unique requirements. - -```ts -const foundDocuments = await myDatabase.todos.find({ - selector: { - done: { - $eq: false - } - } -}).exec(); -``` - -### Great Observe Performance with EventReduce -RxDB introduces a concept called [EventReduce](https://github.com/pubkey/event-reduce), which optimizes the observation process. Instead of overwhelming your app's UI with every data change, EventReduce filters and batches these changes to provide a smooth and efficient experience. This leads to enhanced app performance, lower resource usage, and ultimately, happier users. - -## Why NoSQL is a Better Fit for Client-Side Applications Compared to relational databases like SQLite -When it comes to choosing the right database solution for your client-side applications, NoSQL RxDB presents compelling advantages over traditional options like SQLite. Let's delve into the key reasons why NoSQL RxDB is a superior fit for your ionic hybrid app development. - -### Easier Document-Based Replication -NoSQL databases, like RxDB, inherently embrace a document-based approach to [data storage](./ionic-storage.md). This design choice simplifies data [replication](../replication.md) between clients and servers. With documents representing discrete units of data, you can easily synchronize individual pieces of information without the complexity that can arise when dealing with rows and tables in a relational database like SQLite. This document-centric replication model streamlines the synchronization process and ensures that your app's data remains consistent across devices. - -### Offline Capable -One of the defining features of client-side applications is the ability to function even when offline. NoSQL RxDB excels in this area by supporting a local-first approach. Data is cached on the client's device, enabling the app to remain fully functional even without an internet connection. As connectivity is restored, RxDB handles data synchronization with the server seamlessly. This offline capability ensures a smooth user experience, critical for ionic hybrid apps catering to users in various network conditions. - -### NoSQL Has Better TypeScript Support -TypeScript, a popular superset of JavaScript, is renowned for its static typing and enhanced developer experience. NoSQL databases like RxDB are inherently flexible, making them well-suited for TypeScript integration. With well-defined data structures and clear typings, NoSQL RxDB offers [improved type safety](../tutorials/typescript.md) and easier development when compared to traditional SQL databases like SQLite. This results in reduced debugging time and increased code reliability. - -### Easier [Schema Migration](../migration-schema.md) with NoSQL Documents -Schema changes are a common occurrence in application development, and dealing with them can be challenging. NoSQL databases, including RxDB, are more forgiving in this aspect. Since documents in NoSQL databases don't enforce a rigid structure like tables in relational databases, schema changes are often simpler to manage. This flexibility makes it easier to evolve your app's data structure over time without the need for complex migration scripts, a notable advantage when compared to SQLite. - -## Great Performance -RxDB's [excellent performance](../rx-storage-performance.md) stems from its advanced indexing capabilities, which streamline data retrieval and ensure swift query execution. Additionally, the [JSON key compression](../key-compression.md) employed by RxDB minimizes storage overhead, enabling efficient data transfer and quicker loading times. The incorporation of real-time updates through change streams and the **EventReduce mechanism** further enhances RxDB's performance, delivering a responsive user experience even as data changes are propagated seamlessly. - -## Using RxDB in an Ionic Hybrid App -RxDB's integration into your ionic hybrid app opens up a world of possibilities for efficient data management. Let's explore how to set up RxDB, use it with popular JavaScript frameworks, and take advantage of its diverse storage options. - -### Setup RxDB -Getting started with RxDB is a straightforward process. By including the RxDB library in your project, you can quickly start harnessing its capabilities. Begin by installing the [RxDB package](https://www.npmjs.com/package/rxdb) from the npm registry. Then, configure your database instance to suit your app's needs. This setup process paves the way for seamless data management in your ionic hybrid app. -For a full instruction, follow the [RxDB Quickstart](https://rxdb.info/quickstart.html). - -### Using RxDB in Frameworks (React, Angular, Vue.js) -RxDB seamlessly integrates with various JavaScript frameworks, ensuring compatibility with your preferred development environment. Whether you're building your ionic hybrid app with [React](./react-database.md), [Angular](./angular-database.md), or [Vue.js](./vue-database.md), RxDB offers bindings and tools that enable you to leverage its features effortlessly. This compatibility allows you to stay within the comfort zone of your chosen framework while benefiting from RxDB's powerful data management capabilities. - -### Different RxStorage Layers for RxDB -RxDB doesn't limit you to a single storage solution. Instead, it provides a range of RxStorage layers to accommodate diverse use cases. These storage layers offer flexibility and customization, enabling you to tailor your data management strategy to match your app's requirements. Let's explore some of the available RxStorage options: - -- [LocalStorage RxStorage](../rx-storage-localstorage.md): Based on the browsers [localStorage](./localstorage.md). Easy to set up and fast for small datasets. -- [IndexedDB RxStorage](../rx-storage-indexeddb.md): Leveraging the native browser storage, IndexedDB RxStorage offers reliable data persistence. This storage option is suitable for a wide range of scenarios and is supported by most modern browsers. -- [OPFS RxStorage](../rx-storage-opfs.md): Operating within the browser's file system, OPFS RxStorage is a unique choice that can handle larger data volumes efficiently. It's particularly useful for applications that require substantial data storage. -- [Memory RxStorage](../rx-storage-memory.md): Memory RxStorage is perfect for temporary or cache-like data storage. It keeps data in memory, which can result in rapid data access but doesn't provide long-term persistence. -- [SQLite RxStorage](../rx-storage-sqlite.md): SQLite is the goto database for mobile applications. It is build in on android and iOS devices. The SQLite RxDB storage layer is build upon SQLite and offers the best performance on hybrid apps, like ionic. - -## Replication of Data with RxDB between Clients and Servers -Efficient data replication between clients and servers is the backbone of modern application development, ensuring that data remains consistent and up-to-date across various devices and platforms. RxDB provides a suite of replication methods that facilitate seamless communication between clients and servers, ensuring that your data is always in sync. - -### RxDB Replication Algorithm -At the heart of RxDB's replication capabilities lies a sophisticated [algorithm](../replication.md) designed to manage data synchronization between clients and servers. This algorithm intelligently handles data changes, conflict resolution, and network connectivity fluctuations, resulting in reliable and efficient data replication. With the RxDB replication algorithm, your application can maintain data consistency across devices without unnecessary complexities. - -- [CouchDB Replication](../replication-couchdb.md): -RxDB's integration with CouchDB replication presents a powerful way to synchronize data between clients and servers. CouchDB, a well-established NoSQL database, excels at distributed and decentralized data scenarios. By utilizing RxDB's CouchDB replication, you can establish bidirectional synchronization between your RxDB-powered client and a CouchDB server. This synchronization ensures that data updates made on either end are seamlessly propagated to the other, facilitating collaboration and data sharing. - -- [Firestore Replication](../replication-firestore.md): -Firestore, Google's cloud-hosted NoSQL database, offers another avenue for data replication in RxDB. With Firestore replication, you can establish a connection between your RxDB-powered app and Firestore's cloud infrastructure. This integration provides real-time updates to data across multiple instances of your application, ensuring that users always have access to the latest information. RxDB's support for Firestore replication empowers you to build dynamic and responsive applications that thrive in today's fast-paced digital landscape. - -- [WebRTC Replication](../replication-webrtc.md): -Peer-to-peer (P2P) replication via WebRTC introduces a cutting-edge approach to data synchronization in RxDB. P2P replication allows devices to communicate directly with each other, bypassing the need for a central server. This method proves invaluable in scenarios where network connectivity is limited or unreliable. With WebRTC replication, devices can exchange data directly, enabling collaboration and information sharing even in challenging network conditions. - -## RxDB as an Alternative for Ionic Secure Storage -When it comes to securing sensitive data in your Ionic applications, RxDB emerges as a powerful alternative to traditional secure storage solutions. Let's delve into why RxDB is an exceptional choice for safeguarding your data while providing additional benefits. - -### RxDB On-Device Encryption Plugin -RxDB offers an [on-device encryption plugin](https://rxdb.info/encryption.html), adding an extra layer of security to your app's data. This means that data stored within the RxDB database can be encrypted, ensuring that even if the device falls into the wrong hands, the sensitive information remains inaccessible without the proper decryption key. This level of data protection is crucial for applications that deal with personal or confidential information. Encryption runs either with `AES` on `crypto-js` or with the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) which is faster and more secure. - -### Works Offline -Security should never compromise functionality. RxDB excels in this area by allowing your application to operate seamlessly even when offline. The locally stored encrypted data remains accessible and functional, enabling users to interact with the app's features even without an active internet connection. This offline capability ensures that user data is secure, while the app continues to deliver a responsive and uninterrupted experience. - -### Easy-to-Setup Replication with Your Backend -Ensuring data consistency between your client-side application and backend is a key concern for developers. RxDB simplifies this process with its straightforward replication setup. You can effortlessly configure data synchronization between your local RxDB instance and your backend server. This replication capability ensures that encrypted data remains up-to-date and aligned with the central database, enhancing data integrity and security. - -### Compression of Client-Side Stored Data -In addition to security and offline capabilities, RxDB also offers [data compression](https://rxdb.info/key-compression.html). This means that the data stored on the client's device is efficiently compressed, reducing storage requirements and improving overall app performance. This compression ensures that your app remains responsive and efficient, even as data volumes grow. - -### Cost-Effective Solution -In addition to its security features, RxDB offers cost-effective benefits. RxDB is [priced more affordably](/premium/) compared to some other secure storage solutions, making it an attractive option for developers seeking robust security without breaking the bank. For many users, the free version of RxDB provides ample features to meet their application's security and data management needs. - -## Follow Up - -- Try out the [RxDB ionic example project](https://github.com/pubkey/rxdb/tree/master/examples/ionic2) -- Try out the [RxDB Quickstart](https://rxdb.info/quickstart.html) -- Join the [RxDB Chat](https://rxdb.info/chat/) diff --git a/docs/articles/ionic-storage.html b/docs/articles/ionic-storage.html deleted file mode 100644 index 4b38cd67121..00000000000 --- a/docs/articles/ionic-storage.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - -RxDB - Local Ionic Storage with Encryption, Compression & Sync | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RxDB - Local Ionic Storage with Encryption, Compression & Sync

-

When building Ionic apps, developers face the challenge of choosing a robust Ionic storage mechanism that supports:

-
    -
  • Offline-First usage
  • -
  • Data Encryption to protect sensitive content
  • -
  • Compression to reduce storage usage and improve performance
  • -
  • Seamless Sync with any backend for real-time updates
  • -
-

RxDB (Reactive Database) offers all these features in a single, local-first database solution tailored to Ionic and other hybrid frameworks. Keep reading to learn how RxDB solves the most common storage pitfalls in hybrid app development while providing unmatched flexibility.

-
-
Ionic Database Storage
-
-

Why RxDB for Ionic Storage?

-

1. Offline-Ready NoSQL Storage

-

Offline functionality is crucial for modern mobile applications, particularly when devices encounter unreliable or slow networks. RxDB stores all data locally so your Ionic app can run seamlessly without needing a continuous internet connection. When a network is available again, RxDB automatically synchronizes changes with your backend - no extra code required.

-

2. Powerful Encryption

-

Securing on-device data is paramount when handling sensitive information. RxDB includes encryption plugins that let you:

-
    -
  • Encrypt data fields at rest with AES
  • -
  • Invalidate data access by simply withholding the password
  • -
  • Keep your users' data confidential, even if the device is stolen
  • -
-

This built-in encryption sets RxDB apart from many other Ionic storage options that lack integrated security.

-

3. Built-In Data Compression

-

Large or repetitive data can significantly slow down devices with minimal memory. RxDB's key-compression feature decreases document size stored on the device, improving overall performance by:

-
    -
  • Reducing disk usage
  • -
  • Accelerating queries
  • -
  • Minimizing network overhead when syncing
  • -
-

4. Real-Time Sync & Conflict Handling

-

In addition to functioning fully offline, RxDB supports advanced replication options. Your Ionic app can instantly sync updates with any backend (CouchDB, Firestore, GraphQL, or custom REST), maintaining a real-time user experience. Plus, RxDB handles conflicts gracefully - meaning less worry about clashing user edits.

-

database replication

-

5. Easy to Adopt and Extend

-

RxDB runs with a NoSQL approach and integrates seamlessly into Ionic Angular or other frameworks you might use with Ionic. You can extend or replace storage backends, add encryption, or build advanced offline-first features with minimal overhead.

-
Ionic Storage Database
-

Quick Start: Implementing RxDB with LocalSTorage Storage

-

For a simple proof-of-concept or testing environment in Ionic, you can use localstorage as your underlying storage. Later, if you need better native performance, you can switch to the SQLite storage offered by the RxDB Premium plugins.

-
    -
  1. Install RxDB
  2. -
-
npm install rxdb rxjs
-
    -
  1. Initialize the Database
  2. -
-
import { createRxDatabase } from 'rxdb/plugins/core';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
- 
-async function initDB() {
-  const db = await createRxDatabase({
-    name: 'myionicdb',
-    storage: getRxStorageLocalstorage(),
-    multiInstance: false // or true if you plan multi-tab usage
-    // Note: If you need encryption, set `password` here
-  });
- 
-  await db.addCollections({
-    notes: {
-      schema: {
-        title: 'notes schema',
-        version: 0,
-        type: 'object',
-        primaryKey: 'id',
-        properties: {
-          id: { type: 'string' },
-          content: { type: 'string' },
-          timestamp: { type: 'number' }
-        },
-        required: ['id']
-      }
-    }
-  });
- 
-  return db;
-}
-
    -
  1. Ready to Upgrade Later?
  2. -
-

When you need the best performance on mobile devices, purchase the RxDB Premium SQLite Storage and replace getRxStorageLocalstorage() with getRxStorageSQLite() - your app logic remains largely the same. You only have to change the configuration.

-

Encryption Example

-

To secure local data, add the crypto-js encryption plugin (free version) or the premium web-crypto plugin. Below is an example using the free crypto-js plugin:

-
import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
-import { createRxDatabase } from 'rxdb/plugins/core';
- 
-async function initEncryptedDB() {
-  const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({
-    storage: getRxStorageLocalstorage()
-  });
- 
-  const db = await createRxDatabase({
-    name: 'secureIonicDB',
-    storage: encryptedStorage,
-    password: 'myS3cretP4ssw0rd'
-  });
- 
-  await db.addCollections({
-    secrets: {
-      schema: {
-        title: 'secret schema',
-        version: 0,
-        type: 'object',
-        primaryKey: 'id',
-        properties: {
-          id: { type: 'string' },
-          text: { type: 'string' }
-        },
-        required: ['id'],
-        // all fields in this array will be stored encrypted:
-        encrypted: ['text']
-      }
-    }
-  });
- 
-  return db;
-}
-

With encryption enabled:

-
    -
  • text is automatically encrypted at rest.
  • -
  • Queries on encrypted fields are not directly possible (since data is encrypted), but once a document is loaded, RxDB decrypts it for normal usage.
  • -
-

Compression Example

-

To minimize the storage footprint, RxDB offers a key-compression feature. You can enable it in your schema:

-
await db.addCollections({
-  logs: {
-    schema: {
-      title: 'logs schema',
-      version: 0,
-      keyCompression: true, // enable compression
-      type: 'object',
-      primaryKey: 'id',
-      properties: {
-        id: { type: 'string' },
-        message: { type: 'string' },
-        createdAt: { type: 'string', format: 'date-time' }
-      }
-    }
-  }
-});
-

With keyCompression: true, RxDB shortens field names internally, significantly reducing document size. This helps both stored data and network transport during replication.

-

RxDB vs. Other Ionic Storage Options

-

Ionic Native Storage or Capacitor-based key-value stores may handle small amounts of data but lack advanced features like:

-
    -
  • Complex queries
  • -
  • Full NoSQL document model
  • -
  • Offline-first sync
  • -
  • Encryption & key compression out of the box
  • -
  • RxDB stands out by delivering all these capabilities in a unified library.
  • -
-

Follow Up

-

For Ionic storage that supports offline-first operations, built-in encryption, optional data compression, and live syncing with any backend, RxDB provides a powerful solution. Start quickly with localstorage for local development and testing - then scale up to the premium SQLite storage for optimal performance on production mobile devices.

-

Ready to learn more?

- -

RxDB - The ultimate toolkit for Ionic developers seeking offline-first, secure, and compressed local data, with real-time sync to any server.

- - \ No newline at end of file diff --git a/docs/articles/ionic-storage.md b/docs/articles/ionic-storage.md deleted file mode 100644 index 647b32d6e4d..00000000000 --- a/docs/articles/ionic-storage.md +++ /dev/null @@ -1,195 +0,0 @@ -# RxDB - Local Ionic Storage with Encryption, Compression & Sync - -> The best Ionic storage solution? RxDB empowers your hybrid apps with offline-first capabilities, secure encryption, data compression, and seamless data syncing to any backend. - -# RxDB - Local Ionic Storage with Encryption, Compression & Sync - -When building **Ionic** apps, developers face the challenge of choosing a robust **Ionic storage** mechanism that supports: -- **Offline-First** usage -- **Data Encryption** to protect sensitive content -- **Compression** to reduce storage usage and improve performance -- **Seamless Sync** with any backend for real-time updates - -[RxDB](https://rxdb.info/) (Reactive Database) offers all these features in a single, [local-first](./local-first-future.md) database solution tailored to **Ionic** and other hybrid frameworks. Keep reading to learn how RxDB solves the most common storage pitfalls in hybrid app development while providing unmatched flexibility. - -
- - - -
- -## Why RxDB for Ionic Storage? - -### 1. Offline-Ready NoSQL Storage -[Offline functionality](../offline-first.md) is crucial for modern mobile applications, particularly when devices encounter unreliable or slow networks. RxDB stores all data **locally** so your Ionic app can run seamlessly without needing a continuous internet connection. When a network is available again, RxDB automatically synchronizes changes with your backend - no extra code required. - -### 2. Powerful Encryption -Securing on-device data is paramount when handling sensitive information. RxDB includes [encryption plugins](../encryption.html) that let you: -- **Encrypt** data fields at rest with AES -- Invalidate data access by simply withholding the password -- Keep your users' data confidential, even if the device is stolen - -This built-in encryption sets RxDB apart from many other Ionic storage options that lack integrated security. - -### 3. Built-In Data Compression -Large or repetitive data can significantly slow down devices with minimal memory. RxDB's [key-compression](../key-compression.md) feature decreases document size stored on the device, improving overall performance by: -- Reducing disk usage -- Accelerating queries -- Minimizing network overhead when syncing - -### 4. Real-Time Sync & Conflict Handling -In addition to functioning fully offline, RxDB supports advanced [replication](../replication.md) options. Your Ionic app can instantly sync updates with any backend ([CouchDB](../replication-couchdb.md), [Firestore](../replication-firestore.md), [GraphQL](../replication-graphql.md), or [custom REST](../replication-http.md)), maintaining a [real-time](./realtime-database.md) user experience. Plus, RxDB handles [conflicts](../transactions-conflicts-revisions.md) gracefully - meaning less worry about clashing user edits. - - - -### 5. Easy to Adopt and Extend -RxDB runs with a **NoSQL** approach and integrates seamlessly into [Ionic Angular](https://ionicframework.com/docs/angular/overview) or other frameworks you might use with Ionic. You can extend or replace storage backends, add encryption, or build advanced offline-first features with minimal overhead. - -
- - - -
- -## Quick Start: Implementing RxDB with LocalSTorage Storage - -For a simple proof-of-concept or testing environment in [Ionic](./ionic-database.md), you can use [localstorage](../rx-storage-localstorage.md) as your underlying storage. Later, if you need better native performance, you can **switch to the SQLite storage** offered by the [RxDB Premium plugins](https://rxdb.info/premium/). - -1. **Install RxDB** -```bash -npm install rxdb rxjs -``` - -2. **Initialize the Database** - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -async function initDB() { - const db = await createRxDatabase({ - name: 'myionicdb', - storage: getRxStorageLocalstorage(), - multiInstance: false // or true if you plan multi-tab usage - // Note: If you need encryption, set `password` here - }); - - await db.addCollections({ - notes: { - schema: { - title: 'notes schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string' }, - content: { type: 'string' }, - timestamp: { type: 'number' } - }, - required: ['id'] - } - } - }); - - return db; -} -``` - -3. **Ready to Upgrade Later?** - -When you need the best performance on mobile devices, purchase the RxDB [Premium](/premium/) [SQLite Storage](../rx-storage-sqlite.md) and replace `getRxStorageLocalstorage()` with `getRxStorageSQLite()` - your app logic remains largely the same. You only have to change the configuration. - -## Encryption Example - -To secure local data, add the crypto-js [encryption plugin](../encryption.md) (free version) or the [premium](/premium/) web-crypto plugin. Below is an example using the free crypto-js plugin: - -```ts -import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -import { createRxDatabase } from 'rxdb/plugins/core'; - -async function initEncryptedDB() { - const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ - storage: getRxStorageLocalstorage() - }); - - const db = await createRxDatabase({ - name: 'secureIonicDB', - storage: encryptedStorage, - password: 'myS3cretP4ssw0rd' - }); - - await db.addCollections({ - secrets: { - schema: { - title: 'secret schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string' }, - text: { type: 'string' } - }, - required: ['id'], - // all fields in this array will be stored encrypted: - encrypted: ['text'] - } - } - }); - - return db; -} -``` - -With encryption enabled: - -- `text` is automatically encrypted at rest. -- [Queries](../rx-query.md) on encrypted fields are not directly possible (since data is encrypted), but once a document is loaded, RxDB decrypts it for normal usage. - -## Compression Example - -To minimize the storage footprint, RxDB offers a [key-compression](../key-compression.md) feature. You can enable it in your schema: - -```ts -await db.addCollections({ - logs: { - schema: { - title: 'logs schema', - version: 0, - keyCompression: true, // enable compression - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string' }, - message: { type: 'string' }, - createdAt: { type: 'string', format: 'date-time' } - } - } - } -}); -``` - -With `keyCompression: true`, RxDB shortens field names internally, significantly reducing document size. This helps both stored data and network transport during replication. - -## RxDB vs. Other Ionic Storage Options - -**Ionic Native Storage** or **Capacitor-based** key-value stores may handle small amounts of data but lack advanced features like: - -- Complex queries -- Full NoSQL document model -- [Offline-first](../offline-first.md) [sync](../replication.md) -- Encryption & key compression out of the box -- RxDB stands out by delivering all these capabilities in a unified library. - -## Follow Up - -For Ionic storage that supports offline-first operations, built-in encryption, optional data compression, and live syncing with any backend, RxDB provides a powerful solution. Start quickly with [localstorage](../rx-storage-localstorage.md) for local development and testing - then scale up to the premium SQLite storage for optimal performance on production mobile devices. - -Ready to learn more? - -- Explore the [RxDB Quickstart Guide](../quickstart.md) -- Check out [RxDB Encryption](../encryption.md) to protect user data -- Learn about [SQLite Storage](../rx-storage-sqlite.md) in [RxDB Premium](/premium/) for top [performance](../rx-storage-performance.md) on mobile. -- Join our community on the [RxDB Chat](/chat/) - -**RxDB** - The ultimate toolkit for Ionic developers seeking offline-first, secure, and compressed local data, with real-time sync to any server. diff --git a/docs/articles/javascript-vector-database.html b/docs/articles/javascript-vector-database.html deleted file mode 100644 index e816e5ea115..00000000000 --- a/docs/articles/javascript-vector-database.html +++ /dev/null @@ -1,490 +0,0 @@ - - - - - -Local JavaScript Vector Database that works offline | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Local Vector Database with RxDB and transformers.js in JavaScript

-

The local-first revolution is here, changing the way we build apps! Imagine a world where your app's data lives right on the user's device, always available, even when there's no internet. That's the magic of local-first apps. Not only do they bring faster performance and limitless scalability, but they also empower users to work offline without missing a beat. And leading the charge in this space are local database solutions, like RxDB.

-
JavaScript Database
-

But here's where things get even more exciting: when building local-first apps, traditional databases often fall short. They're great at searching for exact matches, like numbers or strings, but what if you want to search by meaning, like sifting through emails to find a specific topic? Sure, you could use RegExp, but to truly unlock the power of semantic search and similarity-based queries, you need something more cutting-edge. Something that really understands the content of the data.

-

Enter vector databases, the game-changers for searching data by meaning! They have unlocked these new possibilities for storing and querying data, especially in tasks requiring semantic search and similarity-based queries. With the help of a machine learning model, data is transformed into a vector representation that can be stored, queried and compared in a database.

-

But unfortunately, most vector databases are designed for server-side use, typically running in large cloud clusters, not to run on a users device. To fix that, in this article, we will combine RxDB and transformers.js to create a local vector database running in the browser with JavaScript. It stores data in IndexedDB, and uses a machine learning model with WebAssembly locally, without the need for external servers.

-
    -
  • -

    transformers.js is a powerful framework that allows machine learning models to run directly within JavaScript using WebAssembly or WebGPU.

    -
  • -
  • -

    RxDB is a NoSQL, local-first database with a flexible storage layer that can run on any JavaScript runtime, including browsers and mobile environments. (You are reading this article on the RxDB docs).

    -
  • -
-

A local vector database offers several key benefits:

-
    -
  • Zero network latency: Data is processed locally on the user's device, ensuring near-instant responses.
  • -
  • Offline functionality: Data can be queried even without an internet connection.
  • -
  • Enhanced privacy: Sensitive information remains on the device, never needing to leave for external processing.
  • -
  • Simple setup: No backend servers are required, making deployment straightforward.
  • -
  • Cost savings: By running everything locally, you avoid fees for API access or cloud services for large language models.
  • -
-
note

In this article only the important source code parts are shown. You can find the full open-source vector database implementation at the github repository.

-

What is a Vector Database?

-

A vector database is a specialized database optimized for storing and querying data in the form of high-dimensional vectors, often referred to as embeddings. These embeddings are numerical representations of data, such as text, images, or audio, created by machine learning models like MiniLM. Unlike traditional databases that work with exact matches on predefined fields, vector databases focus on semantic similarity, allowing you to query data based on meaning rather than exact values.

-
-

A vector, or embedding, is essentially an array of numbers, like [0.56, 0.12, -0.34, -0.90].

-
-

For example, instead of asking "Which document has the word 'database'?", you can query "Which documents discuss similar topics to this one?" The vector database compares embeddings and returns results based on how similar the vectors are to each other.

-

Vector databases handle multiple types of data beyond text, including images, videos, and audio files, all transformed into embeddings for efficient querying. Mostly you would not train a model by yourself and instead use one of the public available transformer models.

-

Vector databases are highly effective in various types of applications:

-
    -
  • Similarity Search: Finds the closest matches to a query, even when the query doesn't contain the exact terms.
  • -
  • Clustering: Groups similar items based on the proximity of their vector representations.
  • -
  • Recommendations: Suggests items based on shared characteristics.
  • -
  • Anomaly Detection: Identifies outliers that differ from the norm.
  • -
  • Classification: Assigns categories to data based on its vector's nearest neighbors.
  • -
-

In this tutorial, we will build a vector database designed as a Similarity Search for text. For other use cases, the setup can be adapted accordingly. This flexibility is why RxDB doesn't provide a dedicated vector-database plugin, but rather offers utility functions to help you build your own vector search system.

-
transformers.js
-

Generating Embeddings Locally in a Browser

-

For the first step to build a local-first vector database we need to compute embeddings directly on the user's device. This is where transformers.js from huggingface comes in, allowing us to run machine learning models in the browser with WebAssembly. Below is an implementation of a getEmbeddingFromText() function, which takes a piece of text and transforms it into an embedding using the Xenova/all-MiniLM-L6-v2 model:

-
import { pipeline } from "@xenova/transformers";
-const pipePromise = pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2');
-async function getEmbeddingFromText(text) {
-  const pipe = await pipePromise;
-  const output = await pipe(text, {
-    pooling: "mean",
-    normalize: true,
-  });
-  return Array.from(output.data);
-}
-

This function creates an embedding by running the text through a pre-trained model and returning it in the form of an array of numbers, which can then be stored and further processed locally.

-
note

Vector embeddings from different machine learning models or versions are not compatible with each other. When you change your model, you have to recreate all embeddings for your data.

-

Storing the Embeddings in RxDB

-

To store the embeddings, first we have to create our RxDB Database with the localstorage storage that stores data in the browsers localstorage. For more advanced projects, you can use any other RxStorage.

-
import { createRxDatabase } from 'rxdb';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
- 
-const db = await createRxDatabase({
-    name: 'mydatabase',
-    storage: getRxStorageLocalstorage()
-});
-

Then we add a items collection that stores our documents with the text field that stores the content.

-
await db.addCollections({
-  items: {
-    schema: {
-        version: 0,
-        primaryKey: 'id',
-        type: 'object',
-        properties: {
-            id: {
-                type: 'string',
-                maxLength: 20
-            },
-            text: {
-                type: 'string'
-            }
-        },
-        required: ['id', 'text']
-    }
-  }
-});
-const itemsCollection = db.items;
-

In our example repo, we use the Wiki Embeddings dataset from supabase which was transformed and used to fill up the items collection with test data.

-
const imported = await itemsCollection.count().exec();
-const response = await fetch('./files/items.json');
-const items = await response.json();
-const insertResult = await itemsCollection.bulkInsert(
-    items
-);
-

Also we need a vector collection that stores our embeddings. -RxDB, as a NoSQL database, allows for the storage of flexible data structures, such as embeddings, within documents. To achieve this, we need to define a schema that specifies how the embeddings will be stored alongside each document. The schema includes fields for an id and the embedding array itself.

-
await db.addCollections({
-  vector: {
-    schema: {
-        version: 0,
-        primaryKey: 'id',
-        type: 'object',
-        properties: {
-            id: {
-                type: 'string',
-                maxLength: 20
-            },
-            embedding: {
-                type: 'array',
-                items: {
-                    type: 'string'
-                }
-            }
-        },
-        required: ['id', 'embedding']
-    }
-  }
-});
-const vectorCollection = db.vector;
-

When storing documents in the database, we need to ensure that the embeddings for these documents are generated and stored automatically. This requires a handler that runs during every document write, calling the machine learning model to generate the embeddings and storing them in a separate vector collection.

-

Since our app runs in a browser, it's essential to avoid duplicate work when multiple browser tabs are open and ensure efficient use of resources. Furthermore, we want the app to resume processing documents from where it left off if it's closed or interrupted. To achieve this, RxDB provides a pipeline plugin, which allows us to set up a workflow that processes items and stores their embeddings. In our example, a pipeline takes batches of 10 documents, generates embeddings, and stores them in a separate vector collection.

-
const pipeline = await itemsCollection.addPipeline({
-    identifier: 'my-embeddings-pipeline',
-    destination: vectorCollection,
-    batchSize: 10,
-    handler: async (docs) => {
-        await Promise.all(docs.map(async(doc) => {
-            const embedding = await getVectorFromText(doc.text);
-            await vectorCollection.upsert({
-                id: doc.primary,
-                embedding
-            });
-        }));
-    }
-});
-

However, processing data locally presents performance challenges. Running the handler with a batch size of 10 takes around 2-4 seconds per batch, meaning processing 10k documents would take up to an hour. To improve performance, we can do parallel processing using WebWorkers. A WebWorker runs on a different JavaScript process and we can start and run many of them in parallel.

-

Our worker listens for messages and performance the embedding generation on each request. It then sends the result embedding back to the main thread.

-
// worker.js
-import { getVectorFromText } from './vector.js';
-onmessage = async (e) => {
-    const embedding = await getVectorFromText(e.data.text);
-    postMessage({
-        id: e.data.id,
-        embedding
-    });
-};
-

On the main thread we spawn one worker per core and send the tasks to the worker instead of processing them on the main thread.

-
// create one WebWorker per core
-const workers = new Array(navigator.hardwareConcurrency)
-    .fill(0)
-    .map(() => new Worker(new URL("worker.js", import.meta.url)));
-
let lastWorkerId = 0;
-let lastId = 0;
-export async function getVectorFromTextWithWorker(text: string): Promise<number[]> {
-    let worker = workers[lastWorkerId++];
-    if(!worker) {
-        lastWorkerId = 0;
-        worker = workers[lastWorkerId++];
-    }
-    const id = (lastId++) + '';
-    return new Promise<number[]>(res => {
-        const listener = (ev: any) => {
-            if (ev.data.id === id) {
-                res(ev.data.embedding);
-                worker.removeEventListener('message', listener);
-            }
-        };
-        worker.addEventListener('message', listener);
-        worker.postMessage({
-            id,
-            text
-        });
-    });
-}
- 
-const pipeline = await itemsCollection.addPipeline({
-    identifier: 'my-embeddings-pipeline',
-    destination: vectorCollection,
-    batchSize: navigator.hardwareConcurrency, // one per CPU core
-    handler: async (docs) => {
-        await Promise.all(docs.map(async (doc, i) => {
-            const embedding = await getVectorFromTextWithWorker(doc.body);
-            /* ... */
-        });
-    }
-});
-

This setup allows us to utilize the full hardware capacity of the client's machine. By setting the batch size to match the number of logical processors available (using the navigator.hardwareConcurrency API) and running one worker per processor, we can reduce the processing time for 10k embeddings to about 5 minutes on my developer laptop with 32 CPU cores.

-

Comparing Vectors by calculating the distance

-

Now that we have stored our embeddings in the database, the next step is to compare these vectors to each other. Various methods are available to measure the similarity or difference between two vectors, such as Euclidean distance, Manhattan distance, Cosine similarity, and Jaccard similarity (and more). RxDB provides utility functions for each of these methods, making it easy to choose the most suitable method for your application. In this tutorial, we will use Euclidean distance to compare vectors. However, the ideal algorithm may vary depending on your data's distribution and the specific type of query you are performing. To find the optimal method for your app, it is up to you to try out all of these and compare the results.

-

Each method gets two vectors as input and returns a single number. Here's how to calculate the Euclidean distance between two embeddings with the vector utilities from RxDB:

-
import { euclideanDistance } from 'rxdb/plugins/vector';
-const distance = euclideanDistance(embedding1, embedding2);
-console.log(distance); // 25.20443
-

With this we can sort multiple embeddings by how good they match our search query vector.

-

Searching the Vector database with a full table scan

-

To find out if our embeddings have been stored correctly and that our vector comparison works as should, let's run a basic query to ensure everything functions as expected. In this query, we aim to find documents similar to a given user input text. The process involves calculating the embedding from the input text, fetching all documents, calculating the distance between their embeddings and the query embedding, and then sorting them based on their similarity.

-
import { euclideanDistance } from 'rxdb/plugins/vector';
-import { sortByObjectNumberProperty } from 'rxdb/plugins/core';
- 
-const userInput = 'new york people';
-const queryVector = await getEmbeddingFromText(userInput);
-const candidates = await vectorCollection.find().exec();
-const withDistance = candidates.map(doc => ({ 
-    doc,
-    distance: euclideanDistance(queryVector, doc.embedding)
-}));
-const queryResult = withDistance.sort(sortByObjectNumberProperty('distance')).reverse();
-console.dir(queryResult);
-
note

For distance-based comparisons, sorting should be in ascending order (smallest first), while for similarity-based algorithms, the sorting should be in descending order (largest first).

-

If we inspect the results, we can see that the documents returned are ordered by relevance, with the most similar document at the top:

-
Vector Database Result
-
note

This demo page can be run online here.

-

However our full-scan method presents a significant challenge: it does not scale well. As the number of stored documents increases, the time taken to fetch and compare embeddings grows proportionally. For example, retrieving embeddings from our test dataset of 10k documents takes around 700 milliseconds. If we scale up to 100k documents, this delay would rise to approximately 7 seconds, making the search process inefficient for larger datasets.

-

Indexing the Embeddings for Better Performance

-

To address the scalability issue, we need to store embeddings in a way that allows us to avoid fetching all of them from storage during a query. In traditional databases, you can sort documents by an index field, allowing efficient queries that retrieve only the necessary documents. An index organizes data in a structured, sortable manner, much like a phone book. However, with vector embeddings we are not dealing with simple, single values. Instead, we have large lists of numbers, which makes indexing more complex because we have more than one dimension.

-

Vector Indexing Methods

-

Various methods exist for indexing these vectors to improve query efficiency and performance:

-
    -
  • Locality Sensitive Hashing (LSH): LSH hashes data so that similar items are likely to fall into the same bucket, optimizing approximate nearest neighbor searches in high-dimensional spaces by reducing the number of comparisons.
  • -
  • Hierarchical Small World: HSW is a graph structure designed for efficient navigation, allowing quick jumps across the graph while maintaining short paths between nodes, forming the basis for HNSW's optimization.
  • -
  • Hierarchical Navigable Small Worlds (HNSW): HNSW builds a hierarchical graph for fast approximate nearest neighbor search. It uses multiple layers where higher layers represent fewer, more connected nodes, improving search efficiency in large datasets​.
  • -
  • Distance to samples: While testing different indexing strategies, I found out that using the distance to a sample set of items is a good way to index embeddings. You pick like 5 random items of your data and get the embeddings for them out of the model. These are your 5 index vectors. For each embedding stored in the vector database, we calculate the distance to our 5 index vectors and store that number as an index value. This seems to work good because similar things have similar distances to other things. For example the words "shoe" and "socks" have a similar distance to "boat" and therefore should have roughly the same index value.
  • -
-

When building local-first applications, performance is often a challenge, especially in JavaScript. With IndexedDB, certain operations, like many sequential get by id calls, are slow, while bulk operations, such as get by index range, are fast. Therefore, it's essential to use an indexing method that allows embeddings to be stored in a sortable way, like Locality Sensitive Hashing or Distance to Samples. In this article, we'll use Distance to Samples, because for me it provides the best default behavior for the sample dataset.

-

Storing indexed embeddings in RxDB

-

The optimal way to store index values alongside embeddings in RxDB is to place them within the same RxCollection. To ensure that the index values are both sortable and precise, we convert them into strings with a fixed length of 10 characters. This standardization helps in managing values with many decimals and ensures proper sorting in the database.

-

Here's is our schema example schema where each document contains an embedding and corresponding index fields:

-
const indexSchema = {
-    type: 'string',
-    maxLength: 10
-};
-const schema = {
-    "version": 0,
-    "primaryKey": "id",
-    "type": "object",
-    "properties": {
-        "id": {
-            "type": "string",
-            "maxLength": 100
-        },
-        "embedding": {
-            "type": "array",
-            "items": {
-                "type": "number"
-            }
-        },
-        // index fields
-        "idx0": indexSchema,
-        "idx1": indexSchema,
-        "idx2": indexSchema,
-        "idx3": indexSchema,
-        "idx4": indexSchema
-    },
-    "required": [
-        "id",
-        "embedding",
-        "idx0",
-        "idx1",
-        "idx2",
-        "idx3",
-        "idx4"
-    ],
-    "indexes": [
-        "idx0",
-        "idx1",
-        "idx2",
-        "idx3",
-        "idx4"
-    ]
-}
-

To populate these index fields, we modify the RxPipeline handler accordingly to the Distance to samples method. We calculate the distance between the document's embedding and our set of 5 index vectors. The calculated distances are converted to string and stored in the appropriate index fields:

-
import { euclideanDistance } from 'rxdb/plugins/vector';
-const sampleVectors: number[][] = [/* the index vectors */];
-const pipeline = await itemsCollection.addPipeline({
-    handler: async (docs) => {
-        await Promise.all(docs.map(async(doc) => {
-            const embedding = await getEmbedding(doc.text);
-            const docData = { id: doc.primary, embedding };
-            // calculate the distance to all samples and store them in the index fields
-            new Array(5).fill(0).map((_, idx) => {
-                const indexValue = euclideanDistance(sampleVectors[idx], embedding);
-                docData['idx' + idx] = indexNrToString(indexValue);
-            });
-            await vectorCollection.upsert(docData);
-        }));
-    }
-});
-

Searching the Vector database with utilization of the indexes

-

Once our embeddings are stored in an indexed format, we can perform searches much more efficiently than through a full table scan. While this indexing method boosts performance, it comes with a tradeoff: a slight loss in precision, meaning that the result set may not always be the optimal one. However, this is generally acceptable for similarity search use cases.

-

There are multiple ways to leverage indexes for faster queries. Here are two effective methods:

-
    -
  1. Query for Index Similarity in Both Directions: For each index vector, calculate the distance to the search embedding and fetch all relevant embeddings in both directions (sorted before and after) from that value.
  2. -
-
async function vectorSearchIndexSimilarity(searchEmbedding: number[]) {
-    const docsPerIndexSide = 100;
-    const candidates = new Set<RxDocument>();
-    await Promise.all(
-        new Array(5).fill(0).map(async (_, i) => {
-            const distanceToIndex = euclideanDistance(sampleVectors[i], searchEmbedding);
-            const [docsBefore, docsAfter] = await Promise.all([
-                vectorCollection.find({
-                    selector: {
-                        ['idx' + i]: {
-                            $lt: indexNrToString(distanceToIndex)
-                        }
-                    },
-                    sort: [{ ['idx' + i]: 'desc' }],
-                    limit: docsPerIndexSide
-                }).exec(),
-                vectorCollection.find({
-                    selector: {
-                        ['idx' + i]: {
-                            $gt: indexNrToString(distanceToIndex)
-                        }
-                    },
-                    sort: [{ ['idx' + i]: 'asc' }],
-                    limit: docsPerIndexSide
-                }).exec()
-            ]);
-            docsBefore.map(d => candidates.add(d));
-            docsAfter.map(d => candidates.add(d));
-        })
-    );
-    const docsWithDistance = Array.from(candidates).map(doc => {
-        const distance = euclideanDistance((doc as any).embedding, searchEmbedding);
-        return {
-            distance,
-            doc
-        };
-    });
-    const sorted = docsWithDistance.sort(sortByObjectNumberProperty('distance')).reverse();
-    return {
-        result: sorted.slice(0, 10),
-        docReads
-    };
-}
-
    -
  1. Query for an Index Range with a Defined Distance: Set an indexDistance and retrieve all embeddings within a specified range from the index vector to the search embedding.
  2. -
-
async function vectorSearchIndexRange(searchEmbedding: number[]) {
-    await pipeline.awaitIdle();
-    const indexDistance = 0.003;
-    const candidates = new Set<RxDocument>();
-    let docReads = 0;
-    await Promise.all(
-        new Array(5).fill(0).map(async (_, i) => {
-            const distanceToIndex = euclideanDistance(sampleVectors[i], searchEmbedding);
-            const range = distanceToIndex * indexDistance;
-            const docs = await vectorCollection.find({
-                selector: {
-                    ['idx' + i]: {
-                        $gt: indexNrToString(distanceToIndex - range),
-                        $lt: indexNrToString(distanceToIndex + range)
-                    }
-                },
-                sort: [{ ['idx' + i]: 'asc' }],
-            }).exec();
-            docs.map(d => candidates.add(d));
-            docReads = docReads + docs.length;
-        })
-    );
- 
-    const docsWithDistance = Array.from(candidates).map(doc => {
-        const distance = euclideanDistance((doc as any).embedding, searchEmbedding);
-        return {
-            distance,
-            doc
-        };
-    });
-    const sorted = docsWithDistance.sort(sortByObjectNumberProperty('distance')).reverse();
-    return {
-        result: sorted.slice(0, 10),
-        docReads
-    };
-};
-

Both methods allow you to limit the number of embeddings fetched from storage while still ensuring a reasonably precise search result. However, they differ in how many embeddings are read and how precise the results are, with trade-offs between performance and accuracy. The first method has a known embedding read amount of docsPerIndexSide * 2 * [amount of indexes]. The second method reads out an unknown amount of embeddings, depending on the sparsity of the dataset and the value of indexDistance.

-

And that's it for the implementation. We now have a local first vector database that is able to store and query vector data.

-

Performance benchmarks

-

In server-side databases, performance can be improved by scaling hardware or adding more servers. However, local-first apps face the unique challenge that the hardware is determined by the end user, making performance unpredictable. Some users may have high-end gaming PCs, while others might be using outdated smartphones in power-saving mode. Therefore, when building a local-first app that processes more than a few documents, performance becomes a critical factor and should be thoroughly tested upfront.

-

Let's run performance benchmarks on my high-end gaming PC to give you a sense of how long different operations take and what's achievable.

-

Performance of the Query Methods

-
Query MethodTime in millisecondsDocs read from storage
Full Scan76510000
Index Similarity1647934
Index Range882187
-

As shown, the index similarity query method takes significantly longer compared to others. This is due to the need for descending sort orders in some queries sort: [{ ['idx' + i]: 'desc' }]. While RxDB supports descending sorts, performance suffers because IndexedDB does not efficiently handle reverse indexed bulk operations. As a result, the index range method performs much better for this use case and should be used instead. With its query time of only 88 milliseconds it is fast enough for all most things and likely such fast that you do not even need to show a loading spinner. Also it is faster compared to fetching the query result from a server-side vector database over the internet.

-

Performance of the Models

-

Let's also look at the time taken to calculate a single embedding across various models from the huggingface transformers list:

-
Model NameTime per Embedding in (ms)Vector SizeModel Size (MB)
Xenova/all-MiniLM-L6-v217338423
Supabase/gte-small34138434
Xenova/paraphrase-multilingual-mpnet-base-v21000768279
jinaai/jina-embeddings-v2-base-de1291768162
jinaai/jina-embeddings-v2-base-zh1437768162
jinaai/jina-embeddings-v2-base-code1769768162
mixedbread-ai/mxbai-embed-large-v133591024337
WhereIsAI/UAE-Large-V134991024337
Xenova/multilingual-e5-large42151024562
-

From these benchmarks, it's evident that models with larger vector outputs take longer to process. Additionally, the model size significantly affects performance, with larger models requiring more time to compute embeddings. This trade-off between model complexity and performance must be considered when choosing the right model for your use case.

-

Potential Performance Optimizations

-

There are multiple other techniques to improve the performance of your local vector database:

-
    -
  • -

    Shorten embeddings: The storing and retrieval of embeddings can be improved by "shortening" the embedding. To do that, you just strip away numbers from your vector. For example [0.56, 0.12, -0.34, 0.78, -0.90] becomes [0.56, 0.12]. That's it, you now have a smaller embedding that is faster to read out of the storage and calculating distances is faster because it has to process less numbers. The downside is that you loose precision in your search results. Sometimes shortening the embeddings makes more sense as a pre-query step where you first compare the shortened vectors and later fetch the "real" vectors for the 10 most matching documents to improve their sort order.

    -
  • -
  • -

    Optimize the variables in our Setup: In this examples we picked our variables in a non-optimal way. You can get huge performance improvements by setting different values:

    -
      -
    • We picked 5 indexes for the embeddings. Using less indexes improves your query performance with the cost of less good results.
    • -
    • For queries that search by fetching a specific embedding distance we used the indexDistance value of 0.003. Using a lower value means we read less document from the storage. This is faster but reduces the precision of the results which means we will get a less optimal result compared to a full table scan.
    • -
    • For queries that search by fetching a given amount of documents per index side, we set the value docsPerIndexSide to 100. Increasing this value means you fetch more data from the storage but also get a better precision in the search results. Decreasing it can improve query performance with worse precision.
    • -
    -
  • -
  • -

    Use faster models: There are many ways to improve performance of machine learning models. If your embedding calculation is too slow, try other models. Smaller mostly means faster. The model Xenova/all-MiniLM-L6-v2 which is used in this tutorial is about 1 year old. There exist better, more modern models to use. Huggingface makes these convenient to use. You only have to switch out the model name with any other model from that site.

    -
  • -
  • -

    Narrow down the search space: By utilizing other "normal" filter operators to your query, you can narrow down the search space and optimize performance. For example in an email search you could additionally use a operator that limits the results to all emails that are not older than one year.

    -
  • -
  • -

    Dimensionality Reduction with an autoencoder: An autoencoder encodes vector data with minimal loss which can improve the performance by having to store and compare less numbers in an embedding.

    -
  • -
  • -

    Different RxDB Plugins: RxDB has different storages and plugins that can improve the performance like the IndexedDB RxStorage, the OPFS RxStorage, the sharding plugin and the Worker and SharedWorker storages.

    -
  • -
-
JavaScript Database
-

Migrating Data on Model/Index Changes

-

When you change the index parameter or even update the whole model which was used to create the embeddings, you have to migrate the data that is already stored on your users devices. RxDB offers the Schema Migration Plugin for that.

-

When the app is reloaded and the updated source code is started, RxDB detects changes in your schema version and runs the migration strategy accordingly. So to update the stored data, increase the schema version and define a handler:

-
const schemaV1 = {
-    "version": 1, // <- increase schema version by 1
-    "primaryKey": "id",
-    "properties": {
-        /* ... */
-    },
-    /* ... */
-};
-

In the migration handler we recreate the new embeddings and index values.

-
await myDatabase.addCollections({
-  vectors: {
-    schema: schemaV1,
-    migrationStrategies: {
-      1: function(docData){
-        const embedding = await getEmbedding(docData.body);
-        new Array(5).fill(0).map((_, idx) => {
-            docData['idx' + idx] = euclideanDistance(mySampleVectors[idx], embedding);
-        });
-        return docData;
-      },
-    }
-  }
-});
-

Possible Future Improvements to Local-First Vector Databases

-

For now our vector database works and we are good to go. However there are some things to consider for the future:

-
    -
  • WebGPU is not fully supported yet. When this changes, creating embeddings in the browser have the potential to become faster. You can check if your current chrome supports WebGPU by opening chrome://gpu/. Notice that WebGPU has been reported to sometimes be even slower compared to WASM but likely it will be faster in the long term.
  • -
  • Cross-Modal AI Models: While progress is being made, AI models that can understand and integrate multiple modalities are still in development. For example you could query for an image together with a text prompt to get a more detailed output.
  • -
  • Multi-Step queries: In this article we only talked about having a single query as input and an ordered list of outputs. But there is big potential in chaining models or queries together where you take the results of one query and input them into a different model with different embeddings or outputs.
  • -
-

Follow Up

-
- - \ No newline at end of file diff --git a/docs/articles/javascript-vector-database.md b/docs/articles/javascript-vector-database.md deleted file mode 100644 index cdd0933f022..00000000000 --- a/docs/articles/javascript-vector-database.md +++ /dev/null @@ -1,592 +0,0 @@ -# Local JavaScript Vector Database that works offline - -> Create a blazing-fast vector database in JavaScript. Leverage RxDB and transformers.js for instant, offline semantic search - no servers required! - -# Local Vector Database with RxDB and transformers.js in JavaScript - -The [local-first](../offline-first.md) revolution is here, changing the way we build apps! Imagine a world where your app's data lives right on the user's device, always available, even when there's no internet. That's the magic of local-first apps. Not only do they bring faster performance and limitless scalability, but they also empower users to work offline without missing a beat. And leading the charge in this space are local database solutions, like [RxDB](https://rxdb.info/). - -
- - - -
- -But here's where things get even more exciting: when building [local-first](./local-first-future.md) apps, traditional databases often fall short. They're great at searching for exact matches, like `numbers` or `strings`, but what if you want to search by **meaning**, like sifting through emails to find a specific topic? Sure, you could use **RegExp**, but to truly unlock the power of semantic search and similarity-based queries, you need something more cutting-edge. Something that really understands the content of the data. - -Enter **vector databases**, the game-changers for searching data by meaning! They have unlocked these new possibilities for storing and querying data, especially in tasks requiring **semantic search** and **similarity-based** queries. With the help of a **machine learning model**, data is transformed into a vector representation that can be stored, queried and compared in a database. - -But unfortunately, most vector databases are designed for server-side use, typically running in large cloud clusters, not to run on a users device. To fix that, in this article, we will combine **RxDB** and **transformers.js** to create a local vector database running in the **browser** with **JavaScript**. It stores data in **IndexedDB**, and uses a machine learning model with **WebAssembly** locally, without the need for external servers. - -- [transformers.js](https://github.com/xenova/transformers.js) is a powerful framework that allows machine learning models to run directly within JavaScript using WebAssembly or WebGPU. - -- [RxDB](https://rxdb.info/) is a NoSQL, local-first database with a flexible storage layer that can run on any JavaScript runtime, including browsers and mobile environments. (You are reading this article on the RxDB docs). - -A local vector database offers several key benefits: - -- **Zero network latency**: Data is processed locally on the user's device, ensuring near-instant responses. -- **Offline functionality**: Data can be queried even without an internet connection. -- **Enhanced privacy**: Sensitive information remains on the device, never needing to leave for external processing. -- **Simple setup**: No backend servers are required, making deployment straightforward. -- **Cost savings**: By running everything locally, you avoid fees for API access or cloud services for large language models. - -:::note -In this article only the important source code parts are shown. You can find the full open-source vector database implementation at the [github repository](https://github.com/pubkey/javascript-vector-database). -::: - -## What is a Vector Database? - -A vector database is a specialized database optimized for storing and querying data in the form of **high-dimensional** vectors, often referred to as **embeddings**. These embeddings are numerical representations of data, such as text, images, or audio, created by machine learning models like [MiniLM](https://huggingface.co/Xenova/all-MiniLM-L6-v2). Unlike traditional databases that work with exact matches on predefined fields, vector databases focus on **semantic similarity**, allowing you to query data based on meaning rather than exact values. - -> A vector, or embedding, is essentially an array of numbers, like `[0.56, 0.12, -0.34, -0.90]`. - -For example, instead of asking "Which document has the word 'database'?", you can query "Which documents discuss similar topics to this one?" The vector database compares embeddings and returns results based on how similar the vectors are to each other. - -Vector databases handle multiple types of data beyond **text**, including **images**, **videos**, and **audio** files, all transformed into embeddings for efficient querying. Mostly you would not train a model by yourself and instead use one of the public available [transformer models](https://huggingface.co/models?pipeline_tag=feature-extraction&library=transformers.js). - -Vector databases are highly effective in various types of applications: - -- **Similarity Search**: Finds the closest matches to a query, even when the query doesn't contain the exact terms. -- **Clustering**: Groups similar items based on the proximity of their vector representations. -- **Recommendations**: Suggests items based on shared characteristics. -- **Anomaly Detection**: Identifies outliers that differ from the norm. -- **Classification**: Assigns categories to data based on its vector's nearest neighbors. - -In this tutorial, we will build a vector database designed as a **Similarity Search** for **text**. For other use cases, the setup can be adapted accordingly. This flexibility is why [RxDB](https://rxdb.info/) doesn't provide a dedicated vector-database plugin, but rather offers utility functions to help you build your own vector search system. - -
- -
- -## Generating Embeddings Locally in a Browser - -For the first step to build a local-first vector database we need to compute embeddings directly on the user's device. This is where [transformers.js](https://github.com/xenova/transformers.js) from [huggingface](https://huggingface.co/docs/transformers.js/index) comes in, allowing us to run machine learning models in the browser with **WebAssembly**. Below is an implementation of a `getEmbeddingFromText()` function, which takes a piece of text and transforms it into an embedding using the [Xenova/all-MiniLM-L6-v2](https://huggingface.co/Xenova/all-MiniLM-L6-v2) model: - -```js -import { pipeline } from "@xenova/transformers"; -const pipePromise = pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2'); -async function getEmbeddingFromText(text) { - const pipe = await pipePromise; - const output = await pipe(text, { - pooling: "mean", - normalize: true, - }); - return Array.from(output.data); -} -``` - -This function creates an embedding by running the text through a pre-trained model and returning it in the form of an array of numbers, which can then be stored and further processed locally. - -:::note -Vector embeddings from different machine learning models or versions are not compatible with each other. When you change your model, you have to recreate all embeddings for your data. -::: - -## Storing the Embeddings in RxDB - -To store the embeddings, first we have to create our [RxDB Database](../rx-database.md) with the [localstorage storage](../rx-storage-localstorage.md) that stores data in the browsers [localstorage](./localstorage.md). For more advanced projects, you can use any other [RxStorage](../rx-storage.md). - -```ts -import { createRxDatabase } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -const db = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageLocalstorage() -}); -``` - -Then we add a `items` collection that stores our documents with the `text` field that stores the content. - -```ts -await db.addCollections({ - items: { - schema: { - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 20 - }, - text: { - type: 'string' - } - }, - required: ['id', 'text'] - } - } -}); -const itemsCollection = db.items; -``` - -In our [example repo](https://github.com/pubkey/javascript-vector-database), we use the [Wiki Embeddings](https://huggingface.co/datasets/Supabase/wikipedia-en-embeddings) dataset from supabase which was transformed and used to fill up the `items` collection with test data. - -```ts -const imported = await itemsCollection.count().exec(); -const response = await fetch('./files/items.json'); -const items = await response.json(); -const insertResult = await itemsCollection.bulkInsert( - items -); -``` - -Also we need a `vector` collection that stores our embeddings. -RxDB, as a NoSQL database, allows for the storage of flexible data structures, such as embeddings, within documents. To achieve this, we need to define a [schema](../rx-schema.md) that specifies how the embeddings will be stored alongside each document. The schema includes fields for an `id` and the `embedding` array itself. - -```ts -await db.addCollections({ - vector: { - schema: { - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 20 - }, - embedding: { - type: 'array', - items: { - type: 'string' - } - } - }, - required: ['id', 'embedding'] - } - } -}); -const vectorCollection = db.vector; -``` - -When storing documents in the database, we need to ensure that the embeddings for these documents are generated and stored automatically. This requires a handler that runs during every document write, calling the machine learning model to generate the embeddings and storing them in a separate vector collection. - -Since our app runs in a browser, it's essential to avoid duplicate work when **multiple browser tabs** are open and ensure efficient use of resources. Furthermore, we want the app to resume processing documents from where it left off if it's closed or interrupted. To achieve this, RxDB provides a [pipeline plugin](../rx-pipeline.md), which allows us to set up a workflow that processes items and stores their embeddings. In our example, a pipeline takes batches of 10 documents, generates embeddings, and stores them in a separate vector collection. - -```ts -const pipeline = await itemsCollection.addPipeline({ - identifier: 'my-embeddings-pipeline', - destination: vectorCollection, - batchSize: 10, - handler: async (docs) => { - await Promise.all(docs.map(async(doc) => { - const embedding = await getVectorFromText(doc.text); - await vectorCollection.upsert({ - id: doc.primary, - embedding - }); - })); - } -}); -``` - -However, processing data locally presents performance challenges. Running the handler with a batch size of 10 takes around **2-4 seconds per batch**, meaning processing 10k documents would take up to an hour. To improve performance, we can do parallel processing using [WebWorkers](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers). A WebWorker runs on a different JavaScript process and we can start and run many of them in parallel. - -Our worker listens for messages and performance the embedding generation on each request. It then sends the result embedding back to the main thread. - -```ts -// worker.js -import { getVectorFromText } from './vector.js'; -onmessage = async (e) => { - const embedding = await getVectorFromText(e.data.text); - postMessage({ - id: e.data.id, - embedding - }); -}; -``` - -On the main thread we spawn one worker per core and send the tasks to the worker instead of processing them on the main thread. - -```ts -// create one WebWorker per core -const workers = new Array(navigator.hardwareConcurrency) - .fill(0) - .map(() => new Worker(new URL("worker.js", import.meta.url))); -``` - -```ts -let lastWorkerId = 0; -let lastId = 0; -export async function getVectorFromTextWithWorker(text: string): Promise { - let worker = workers[lastWorkerId++]; - if(!worker) { - lastWorkerId = 0; - worker = workers[lastWorkerId++]; - } - const id = (lastId++) + ''; - return new Promise(res => { - const listener = (ev: any) => { - if (ev.data.id === id) { - res(ev.data.embedding); - worker.removeEventListener('message', listener); - } - }; - worker.addEventListener('message', listener); - worker.postMessage({ - id, - text - }); - }); -} - -const pipeline = await itemsCollection.addPipeline({ - identifier: 'my-embeddings-pipeline', - destination: vectorCollection, - batchSize: navigator.hardwareConcurrency, // one per CPU core - handler: async (docs) => { - await Promise.all(docs.map(async (doc, i) => { - const embedding = await getVectorFromTextWithWorker(doc.body); - /* ... */ - }); - } -}); -``` - -This setup allows us to utilize the full hardware capacity of the client's machine. By setting the batch size to match the number of logical processors available (using the [navigator.hardwareConcurrency](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/hardwareConcurrency) API) and running one worker per processor, we can reduce the processing time for 10k embeddings to **about 5 minutes** on my developer laptop with 32 CPU cores. - -## Comparing Vectors by calculating the distance - -Now that we have stored our embeddings in the database, the next step is to compare these vectors to each other. Various methods are available to measure the similarity or difference between two vectors, such as [Euclidean distance](https://en.wikipedia.org/wiki/Euclidean_distance), [Manhattan distance](https://www.singlestore.com/blog/distance-metrics-in-machine-learning-simplfied/), [Cosine similarity](https://tomhazledine.com/cosine-similarity/), and **Jaccard similarity** (and more). RxDB provides utility functions for each of these methods, making it easy to choose the most suitable method for your application. In this tutorial, we will use **Euclidean distance** to compare vectors. However, the ideal algorithm may vary depending on your data's distribution and the specific type of query you are performing. To find the optimal method for your app, it is up to you to try out all of these and compare the results. - -Each method gets two vectors as input and returns a single number. Here's how to calculate the Euclidean distance between two embeddings with the vector utilities from RxDB: - -```ts -import { euclideanDistance } from 'rxdb/plugins/vector'; -const distance = euclideanDistance(embedding1, embedding2); -console.log(distance); // 25.20443 -``` - -With this we can sort multiple embeddings by how good they match our search query vector. - -## Searching the Vector database with a full table scan - -To find out if our embeddings have been stored correctly and that our vector comparison works as should, let's run a basic query to ensure everything functions as expected. In this query, we aim to find documents similar to a given user input text. The process involves calculating the embedding from the input text, fetching all documents, calculating the distance between their embeddings and the query embedding, and then sorting them based on their similarity. - -```ts -import { euclideanDistance } from 'rxdb/plugins/vector'; -import { sortByObjectNumberProperty } from 'rxdb/plugins/core'; - -const userInput = 'new york people'; -const queryVector = await getEmbeddingFromText(userInput); -const candidates = await vectorCollection.find().exec(); -const withDistance = candidates.map(doc => ({ - doc, - distance: euclideanDistance(queryVector, doc.embedding) -})); -const queryResult = withDistance.sort(sortByObjectNumberProperty('distance')).reverse(); -console.dir(queryResult); -``` - -:::note -For **distance**-based comparisons, sorting should be in ascending order (smallest first), while for **similarity**-based algorithms, the sorting should be in descending order (largest first). -::: - -If we inspect the results, we can see that the documents returned are ordered by relevance, with the most similar document at the top: - -
- -
- -:::note -This demo page can be [run online here](https://pubkey.github.io/javascript-vector-database/). -::: - -However our full-scan method presents a significant challenge: it does not scale well. As the number of stored documents increases, the time taken to fetch and compare embeddings grows proportionally. For example, retrieving embeddings from our [test dataset](https://huggingface.co/datasets/Supabase/wikipedia-en-embeddings) of 10k documents takes around **700 milliseconds**. If we scale up to 100k documents, this delay would rise to approximately **7 seconds**, making the search process inefficient for larger datasets. - -## Indexing the Embeddings for Better Performance - -To address the scalability issue, we need to store embeddings in a way that allows us to avoid fetching all of them from storage during a query. In traditional databases, you can sort documents by an **index field**, allowing efficient queries that retrieve only the necessary documents. An index organizes data in a structured, sortable manner, much **like a phone book**. However, with vector embeddings we are not dealing with simple, single values. Instead, we have large **lists of numbers**, which makes indexing more complex because we have more than one dimension. - -### Vector Indexing Methods - -Various methods exist for indexing these vectors to improve query efficiency and performance: - -- [Locality Sensitive Hashing (LSH)](https://www.youtube.com/watch?v=Arni-zkqMBA): LSH hashes data so that similar items are likely to fall into the same bucket, optimizing approximate nearest neighbor searches in high-dimensional spaces by reducing the number of comparisons. -- [Hierarchical Small World](https://www.youtube.com/watch?v=77QH0Y2PYKg): HSW is a graph structure designed for efficient navigation, allowing quick jumps across the graph while maintaining short paths between nodes, forming the basis for HNSW's optimization. -- [Hierarchical Navigable Small Worlds (HNSW)](https://www.youtube.com/watch?v=77QH0Y2PYKg): HNSW builds a hierarchical graph for fast approximate nearest neighbor search. It uses multiple layers where higher layers represent fewer, more connected nodes, improving search efficiency in large datasets​. -- **Distance to samples**: While testing different indexing strategies, [I](https://github.com/pubkey) found out that using the distance to a sample set of items is a good way to index embeddings. You pick like 5 random items of your data and get the embeddings for them out of the model. These are your 5 index vectors. For each embedding stored in the vector database, we calculate the distance to our 5 index vectors and store that `number` as an index value. This seems to work good because similar things have similar distances to other things. For example the words "shoe" and "socks" have a similar distance to "boat" and therefore should have roughly the same index value. - -When building **local-first** applications, performance is often a challenge, especially in JavaScript. With **IndexedDB**, certain operations, like many sequential `get by id` calls, [are slow](../slow-indexeddb.md), while bulk operations, such as `get by index range`, are fast. Therefore, it's essential to use an indexing method that allows embeddings to be stored in a sortable way, like **Locality Sensitive Hashing** or **Distance to Samples**. In this article, we'll use **Distance to Samples**, because for [me](https://github.com/pubkey) it provides the best default behavior for the sample dataset. - -### Storing indexed embeddings in RxDB - -The optimal way to store index values alongside embeddings in RxDB is to place them within the same [RxCollection](../rx-collection.md). To ensure that the index values are both sortable and precise, we convert them into strings with a fixed length of `10` characters. This standardization helps in managing values with many decimals and ensures proper sorting in the database. - -Here's is our schema example schema where each document contains an embedding and corresponding index fields: - -```ts -const indexSchema = { - type: 'string', - maxLength: 10 -}; -const schema = { - "version": 0, - "primaryKey": "id", - "type": "object", - "properties": { - "id": { - "type": "string", - "maxLength": 100 - }, - "embedding": { - "type": "array", - "items": { - "type": "number" - } - }, - // index fields - "idx0": indexSchema, - "idx1": indexSchema, - "idx2": indexSchema, - "idx3": indexSchema, - "idx4": indexSchema - }, - "required": [ - "id", - "embedding", - "idx0", - "idx1", - "idx2", - "idx3", - "idx4" - ], - "indexes": [ - "idx0", - "idx1", - "idx2", - "idx3", - "idx4" - ] -} -``` - -To populate these index fields, we modify the [RxPipeline](../rx-pipeline.md) handler accordingly to the **Distance to samples** method. We calculate the distance between the document's embedding and our set of `5` index vectors. The calculated distances are converted to `string` and stored in the appropriate index fields: - -```ts -import { euclideanDistance } from 'rxdb/plugins/vector'; -const sampleVectors: number[][] = [/* the index vectors */]; -const pipeline = await itemsCollection.addPipeline({ - handler: async (docs) => { - await Promise.all(docs.map(async(doc) => { - const embedding = await getEmbedding(doc.text); - const docData = { id: doc.primary, embedding }; - // calculate the distance to all samples and store them in the index fields - new Array(5).fill(0).map((_, idx) => { - const indexValue = euclideanDistance(sampleVectors[idx], embedding); - docData['idx' + idx] = indexNrToString(indexValue); - }); - await vectorCollection.upsert(docData); - })); - } -}); -``` - -## Searching the Vector database with utilization of the indexes - -Once our embeddings are stored in an indexed format, we can perform searches much **more efficiently** than through a full table scan. While this indexing method boosts performance, it comes with a tradeoff: a slight loss in precision, meaning that the result set may not always be the optimal one. However, this is generally acceptable for **similarity search** use cases. - -There are multiple ways to leverage indexes for faster queries. Here are two effective methods: - -1. **Query for Index Similarity in Both Directions**: For each index vector, calculate the distance to the search embedding and fetch all relevant embeddings in both directions (sorted before and after) from that value. - -```ts -async function vectorSearchIndexSimilarity(searchEmbedding: number[]) { - const docsPerIndexSide = 100; - const candidates = new Set(); - await Promise.all( - new Array(5).fill(0).map(async (_, i) => { - const distanceToIndex = euclideanDistance(sampleVectors[i], searchEmbedding); - const [docsBefore, docsAfter] = await Promise.all([ - vectorCollection.find({ - selector: { - ['idx' + i]: { - $lt: indexNrToString(distanceToIndex) - } - }, - sort: [{ ['idx' + i]: 'desc' }], - limit: docsPerIndexSide - }).exec(), - vectorCollection.find({ - selector: { - ['idx' + i]: { - $gt: indexNrToString(distanceToIndex) - } - }, - sort: [{ ['idx' + i]: 'asc' }], - limit: docsPerIndexSide - }).exec() - ]); - docsBefore.map(d => candidates.add(d)); - docsAfter.map(d => candidates.add(d)); - }) - ); - const docsWithDistance = Array.from(candidates).map(doc => { - const distance = euclideanDistance((doc as any).embedding, searchEmbedding); - return { - distance, - doc - }; - }); - const sorted = docsWithDistance.sort(sortByObjectNumberProperty('distance')).reverse(); - return { - result: sorted.slice(0, 10), - docReads - }; -} -``` - -2. **Query for an Index Range with a Defined Distance**: Set an `indexDistance` and retrieve all embeddings within a specified range from the index vector to the search embedding. - -```ts -async function vectorSearchIndexRange(searchEmbedding: number[]) { - await pipeline.awaitIdle(); - const indexDistance = 0.003; - const candidates = new Set(); - let docReads = 0; - await Promise.all( - new Array(5).fill(0).map(async (_, i) => { - const distanceToIndex = euclideanDistance(sampleVectors[i], searchEmbedding); - const range = distanceToIndex * indexDistance; - const docs = await vectorCollection.find({ - selector: { - ['idx' + i]: { - $gt: indexNrToString(distanceToIndex - range), - $lt: indexNrToString(distanceToIndex + range) - } - }, - sort: [{ ['idx' + i]: 'asc' }], - }).exec(); - docs.map(d => candidates.add(d)); - docReads = docReads + docs.length; - }) - ); - - const docsWithDistance = Array.from(candidates).map(doc => { - const distance = euclideanDistance((doc as any).embedding, searchEmbedding); - return { - distance, - doc - }; - }); - const sorted = docsWithDistance.sort(sortByObjectNumberProperty('distance')).reverse(); - return { - result: sorted.slice(0, 10), - docReads - }; -}; -``` - -Both methods allow you to limit the number of embeddings fetched from storage while still ensuring a reasonably precise search result. However, they differ in how many embeddings are read and how precise the results are, with trade-offs between performance and accuracy. The first method has a known embedding read amount of `docsPerIndexSide * 2 * [amount of indexes]`. The second method reads out an unknown amount of embeddings, depending on the sparsity of the dataset and the value of `indexDistance`. - -And that's it for the implementation. We now have a local first vector database that is able to store and query vector data. - -## Performance benchmarks - -In server-side databases, performance can be improved by scaling hardware or adding more servers. However, [local-first](../offline-first.md) apps face the unique challenge that the hardware is determined by the end user, making performance unpredictable. Some users may have **high-end gaming PCs**, while others might be using **outdated smartphones in power-saving mode**. Therefore, when building a local-first app that processes more than a few documents, performance becomes a critical factor and should be thoroughly tested upfront. - -Let's run performance benchmarks on my **high-end gaming PC** to give you a sense of how long different operations take and what's achievable. - -### Performance of the Query Methods - -| Query Method | Time in milliseconds | Docs read from storage | -| ---------------- | -------------------- | ---------------------- | -| Full Scan | 765 | 10000 | -| Index Similarity | 1647 | 934 | -| Index Range | 88 | 2187 | - -As shown, the **index similarity** query method takes significantly longer compared to others. This is due to the need for descending sort orders in some queries `sort: [{ ['idx' + i]: 'desc' }]`. While RxDB supports descending sorts, performance suffers because IndexedDB does not efficiently handle [reverse indexed bulk operations](https://github.com/w3c/IndexedDB/issues/130). As a result, the **index range method** performs much better for this use case and should be used instead. With its query time of only `88` milliseconds it is fast enough for all most things and likely such fast that you do not even need to show a loading spinner. Also it is faster compared to fetching the query result from a server-side vector database over the internet. - -### Performance of the Models - -Let's also look at the time taken to calculate a single embedding across various models from the [huggingface transformers list](https://huggingface.co/models?pipeline_tag=feature-extraction&library=transformers.js): - -| Model Name | Time per Embedding in (ms) | Vector Size | Model Size (MB) | -| -------------------------------------------- | -------------------------- | ----------- | --------------- | -| Xenova/all-MiniLM-L6-v2 | 173 | 384 | 23 | -| Supabase/gte-small | 341 | 384 | 34 | -| Xenova/paraphrase-multilingual-mpnet-base-v2 | 1000 | 768 | 279 | -| jinaai/jina-embeddings-v2-base-de | 1291 | 768 | 162 | -| jinaai/jina-embeddings-v2-base-zh | 1437 | 768 | 162 | -| jinaai/jina-embeddings-v2-base-code | 1769 | 768 | 162 | -| mixedbread-ai/mxbai-embed-large-v1 | 3359 | 1024 | 337 | -| WhereIsAI/UAE-Large-V1 | 3499 | 1024 | 337 | -| Xenova/multilingual-e5-large | 4215 | 1024 | 562 | - -From these benchmarks, it's evident that models with larger vector outputs **take longer to process**. Additionally, the model size significantly affects performance, with larger models requiring more time to compute embeddings. This trade-off between model complexity and performance must be considered when choosing the right model for your use case. - -## Potential Performance Optimizations - -There are multiple other techniques to improve the performance of your local vector database: - -- **Shorten embeddings**: The storing and retrieval of embeddings can be improved by "shortening" the embedding. To do that, you just strip away numbers from your vector. For example `[0.56, 0.12, -0.34, 0.78, -0.90]` becomes `[0.56, 0.12]`. That's it, you now have a smaller embedding that is faster to read out of the storage and calculating distances is faster because it has to process less numbers. The downside is that you loose precision in your search results. Sometimes shortening the embeddings makes more sense as a pre-query step where you first compare the shortened vectors and later fetch the "real" vectors for the 10 most matching documents to improve their sort order. - -- **Optimize the variables in our Setup**: In this examples we picked our variables in a non-optimal way. You can get huge performance improvements by setting different values: - - We picked 5 indexes for the embeddings. Using less indexes improves your query performance with the cost of less good results. - - For queries that search by fetching a specific embedding distance we used the `indexDistance` value of `0.003`. Using a lower value means we read less document from the storage. This is faster but reduces the precision of the results which means we will get a less optimal result compared to a full table scan. - - For queries that search by fetching a given amount of documents per index side, we set the value `docsPerIndexSide` to `100`. Increasing this value means you fetch more data from the storage but also get a better precision in the search results. Decreasing it can improve query performance with worse precision. - -- **Use faster models**: There are many ways to improve performance of machine learning models. If your embedding calculation is too slow, try other models. **Smaller** mostly means **faster**. The model `Xenova/all-MiniLM-L6-v2` which is used in this tutorial is about [1 year old](https://huggingface.co/Xenova/all-MiniLM-L6-v2/tree/main). There exist better, more modern models to use. Huggingface makes these convenient to use. You only have to switch out the model name with any other model from [that site](https://huggingface.co/models?pipeline_tag=feature-extraction&library=transformers.js). - -- **Narrow down the search space**: By utilizing other "normal" filter operators to your query, you can narrow down the search space and optimize performance. For example in an email search you could additionally use a operator that limits the results to all emails that are not older than one year. - -- **Dimensionality Reduction** with an [autoencoder](https://www.youtube.com/watch?v=D16rii8Azuw): An autoencoder encodes vector data with minimal loss which can improve the performance by having to store and compare less numbers in an embedding. - -- **Different RxDB Plugins**: RxDB has different storages and plugins that can improve the performance like the [IndexedDB RxStorage](../rx-storage-indexeddb.md), the [OPFS RxStorage](../rx-storage-opfs.md), the [sharding](../rx-storage-sharding.md) plugin and the [Worker](../rx-storage-worker.md) and [SharedWorker](../rx-storage-shared-worker.md) storages. - -
- - - -
- -## Migrating Data on Model/Index Changes - -When you change the index parameter or even update the whole model which was used to create the embeddings, you have to migrate the data that is already stored on your users devices. RxDB offers the [Schema Migration Plugin](../migration-schema.md) for that. - -When the app is reloaded and the updated source code is started, RxDB detects changes in your [schema version](../rx-schema.md#version) and runs the [migration strategy](../migration-schema.md#providing-strategies) accordingly. So to update the stored data, increase the schema version and define a handler: - -```ts -const schemaV1 = { - "version": 1, // <- increase schema version by 1 - "primaryKey": "id", - "properties": { - /* ... */ - }, - /* ... */ -}; -``` - -In the migration handler we recreate the new embeddings and index values. - -```ts -await myDatabase.addCollections({ - vectors: { - schema: schemaV1, - migrationStrategies: { - 1: function(docData){ - const embedding = await getEmbedding(docData.body); - new Array(5).fill(0).map((_, idx) => { - docData['idx' + idx] = euclideanDistance(mySampleVectors[idx], embedding); - }); - return docData; - }, - } - } -}); -``` - -## Possible Future Improvements to Local-First Vector Databases - -For now our vector database works and we are good to go. However there are some things to consider for the future: - -- **WebGPU** is [not fully supported](https://caniuse.com/webgpu) yet. When this changes, creating embeddings in the browser have the potential to become faster. You can check if your current chrome supports WebGPU by opening `chrome://gpu/`. Notice that WebGPU has been reported to sometimes be [even slower](https://github.com/xenova/transformers.js/issues/894#issuecomment-2323897485) compared to WASM but likely it will be faster in the long term. -- **Cross-Modal AI Models**: While progress is being made, AI models that can understand and integrate multiple modalities are still in development. For example you could query for an **image** together with a **text** prompt to get a more detailed output. -- **Multi-Step queries**: In this article we only talked about having a single query as input and an ordered list of outputs. But there is big potential in chaining models or queries together where you take the results of one query and input them into a different model with different embeddings or outputs. - -## Follow Up -- Shared/Like my [announcement tweet](https://x.com/rxdbjs/status/1833429569434427494) -- Read the source code that belongs to this article [at github](https://github.com/pubkey/javascript-vector-database) -- Learn how to use RxDB with the [RxDB Quickstart](../quickstart.md) -- Check out the [RxDB github repo](https://github.com/pubkey/rxdb) and leave a star ⭐ diff --git a/docs/articles/jquery-database.html b/docs/articles/jquery-database.html deleted file mode 100644 index c5b79c40a60..00000000000 --- a/docs/articles/jquery-database.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - - -RxDB as a Database in a jQuery Application | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RxDB as a Database in a jQuery Application

-

In the early days of dynamic web development, jQuery emerged as a popular library that simplified DOM manipulation and AJAX requests. Despite the rise of modern frameworks, many developers still maintain or extend existing jQuery projects, or leverage jQuery in specific contexts. As jQuery applications grow in complexity, they often require efficient data handling, offline support, and synchronization capabilities. This is where RxDB, a reactive JavaScript database for the browser, node.js, and mobile devices, steps in.

-
JavaScript jQuery Database
-

jQuery Web Applications

-

jQuery provides a simple API for DOM manipulation, event handling, and AJAX calls. It has been widely adopted due to its ease of use and strong community support. Many projects continue to rely on jQuery for handling client-side functionality, UI interactions, and animations. As these applications evolve, the need for a robust database solution that can manage data locally (and offline) becomes increasingly important.

-

Importance of Databases in jQuery Applications

-

Modern, data-driven jQuery applications often need to:

-
    -
  • Store and retrieve data locally for quick and responsive user experiences.
  • -
  • Synchronize data between clients or with a central server.
  • -
  • Handle offline scenarios seamlessly.
  • -
  • Handle large or complex data structures without repeatedly hitting the server.
  • -
-

Relying solely on server endpoints or basic browser storage (like localStorage) can quickly become unwieldy for larger or more complex use cases. Enter RxDB, a dedicated solution that manages data on the client side while offering real-time synchronization and offline-first capabilities.

-

Introducing RxDB as a Database Solution

-

RxDB (short for Reactive Database) is built on top of IndexedDB and leverages RxJS to provide a modern, reactive approach to handling data in the browser. With RxDB, you can store documents locally, query them in real-time, and synchronize changes with a remote server whenever an internet connection is available.

-

Key Features

-
    -
  • Reactive Data Handling: RxDB emits real-time updates whenever your data changes, allowing you to instantly reflect these changes in the DOM with jQuery.
  • -
  • Offline-First Approach: Keep your application usable even when the user's network is unavailable. Data is automatically synchronized once connectivity is restored.
  • -
  • Data Replication: Enable multi-device or multi-tab synchronization with minimal effort.
  • -
  • Observable Queries: Reduce code complexity by subscribing to queries instead of constantly polling for changes.
  • -
  • Multi-Tab Support: If a user opens your jQuery application in multiple tabs, RxDB keeps data in sync across all sessions.
  • -
-
This solved a problem I've had in Angular for years
3:45
This solved a problem I've had in Angular for years
-

Getting Started with RxDB

-

What is RxDB?

-

RxDB is a client-side NoSQL database that stores data in the browser (or node.js) and synchronizes changes with other instances or servers. Its design embraces reactive programming principles, making it well-suited for real-time applications, offline scenarios, and multi-tab use cases.

-

real-time ui updates

-

Reactive Data Handling

-

RxDB's use of observables enables an event-driven architecture where data mutations automatically trigger UI updates. In a jQuery application, you can subscribe to these changes and update DOM elements as soon as data changes occur - no need for manual refresh or complicated change detection logic.

-

Offline-First Approach

-

One of RxDB's distinguishing traits is its emphasis on offline-first design. This means your jQuery application continues to function, display, and update data even when there's no network connection. When connectivity is restored, RxDB synchronizes updates with the server or other peers, ensuring consistency across all instances.

-

Data Replication

-

RxDB supports real-time data replication with different backends. By enabling replication, you ensure that multiple clients - be they multiple browser tabs or separate devices - stay in sync. RxDB's conflict resolution strategies help keep the data consistent even when multiple users make changes simultaneously.

-

Observable Queries

-

Instead of static queries, RxDB provides observable queries. Whenever data relevant to a query changes, RxDB re-emits the new result set. You can subscribe to these updates within your jQuery code and instantly reflect them in the UI.

-

Multi-Tab Support

-

Running your jQuery app in multiple tabs? RxDB automatically synchronizes changes between those tabs. Users can freely switch windows without missing real-time updates.

-

multi tab support

-

RxDB vs. Other jQuery Database Options

-

Historically, jQuery developers might use localStorage or raw IndexedDB for storing data. However, these solutions can require significant boilerplate, lack reactivity, and offer no built-in sync or conflict resolution. RxDB fills these gaps with an out-of-the-box solution, abstracting away low-level database complexities and providing an event-driven, offline-capable approach.

-

Using RxDB in a jQuery Application

-

Installing RxDB

-

Install RxDB (and rxjs) via npm or yarn:

-
npm install rxdb rxjs
-

If your project isn't set up with a build process, you can still use bundlers like Webpack or Rollup, or serve RxDB as a UMD bundle. Once included, you'll have access to RxDB globally or via import statements.

-

Creating and Configuring a Database

-

Below is a minimal example of how to create an RxDB instance and collection. You can call this when your page initializes, then store the db object for later use:

-
import { createRxDatabase } from 'rxdb';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
- 
-async function initDatabase() {
-  const db = await createRxDatabase({
-    name: 'heroesdb',
-    storage: getRxStorageLocalstorage(),
-    password: 'myPassword',         // optional encryption password
-    multiInstance: true,            // multi-tab support
-    eventReduce: true               // optimizes event handling
-  });
- 
-  await db.addCollections({
-    hero: {
-      schema: {
-        title: 'hero schema',
-        version: 0,
-        primaryKey: 'id',
-        type: 'object',
-        properties: {
-          id: { type: 'string' },
-          name: { type: 'string' },
-          points: { type: 'number' }
-        }
-      }
-    }
-  });
- 
-  return db;
-}
-

Updating the DOM with jQuery

-

Once you have your RxDB instance, you can query data reactively and use jQuery to manipulate the DOM:

-
// Example: Displaying heroes using jQuery
-$(document).ready(async function () {
-  const db = await initDatabase();
- 
-  // Subscribing to all hero documents
-  db.hero
-    .find()
-    .$  // the observable
-    .subscribe((heroes) => {
-      // Clear the list
-      $('#heroList').empty();
- 
-      // Append each hero to the DOM
-      heroes.forEach((hero) => {
-        $('#heroList').append(`
-          <li>
-            <strong>${hero.name}</strong> - Points: ${hero.points}
-          </li>
-        `);
-      });
-    });
- 
-  // Example of adding a new hero
-  $('#addHeroBtn').on('click', async () => {
-    const heroName = $('#heroName').val();
-    const heroPoints = parseInt($('#heroPoints').val(), 10);
-    await db.hero.insert({
-      id: Date.now().toString(),
-      name: heroName,
-      points: heroPoints
-    });
-  });
-});
-

With this approach, any time data in the hero collection changes - like when a new hero is added - your jQuery code re-renders the list of heroes automatically.

-

Different RxStorage layers for RxDB

-

RxDB supports multiple storage backends (RxStorage layers). Some popular ones:

- -

Synchronizing Data with RxDB between Clients and Servers

-

Offline-First Approach

-

RxDB's offline-first approach allows your jQuery application to store and query data locally. Users can continue interacting, even offline. When connectivity returns, RxDB syncs to the server.

-

Conflict Resolution

-

Should multiple clients update the same document, RxDB offers conflict handling strategies. You decide how to resolve conflicts - like keeping the latest edit or merging changes - ensuring data integrity across distributed systems.

-

Bidirectional Synchronization

-

With RxDB, data changes flow both ways: from client to server and from server to client. This real-time synchronization ensures that all users or tabs see consistent, up-to-date data.

-

database replication

-

Advanced RxDB Features and Techniques

-

Indexing and Performance Optimization

-

Create indexes on frequently queried fields to speed up performance. For large data sets, indexing can drastically improve query times, keeping your jQuery UI snappy.

-

Encryption of Local Data

-

RxDB supports encryption to secure data stored in the browser. This is crucial if your application handles sensitive user information.

-

Change Streams and Event Handling

-

Use change streams to listen for data modifications at the database or collection level. This can trigger real-time UI updates, notifications, or custom logic whenever the data changes.

-

JSON Key Compression

-

If your data model has large or repetitive field names, JSON key compression can minimize stored document size and potentially boost performance.

-

Best Practices for Using RxDB in jQuery Applications

-
    -
  • Centralize Your Database: Initialize and configure RxDB in one place. Expose the instance where needed or store it globally to avoid re-creating it on every script.
  • -
  • Leverage Observables: Instead of polling or manually refreshing data, rely on RxDB's reactivity. Subscribe to queries and let RxDB inform you when data changes.
  • -
  • Handle Subscriptions: If you create subscriptions in a single-page context, ensure you don't re-subscribe endlessly or create memory leaks. Clean them up if you're navigating away or removing DOM elements.
  • -
  • Offline Testing: Thoroughly test how your jQuery app behaves without a network connection. Simulate offline states in your browser's dev tools or with flight mode to ensure the user experience remains smooth.
  • -
  • Performance Profiling: For large data sets or frequent data updates, add indexes and carefully measure query performance. Optimize only where needed.
  • -
-

Follow Up

-

To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources:

-
    -
  • RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.
  • -
  • RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects.
  • -
  • RxDB Examples: Browse official examples to see RxDB in action and learn best practices you can apply to your own project - even if jQuery isn't explicitly featured, the patterns are similar.
  • -
- - \ No newline at end of file diff --git a/docs/articles/jquery-database.md b/docs/articles/jquery-database.md deleted file mode 100644 index 604e55d4e9c..00000000000 --- a/docs/articles/jquery-database.md +++ /dev/null @@ -1,211 +0,0 @@ -# RxDB as a Database in a jQuery Application - -> Level up your jQuery-based projects with RxDB. Build real-time, resilient, and responsive apps powered by a reactive NoSQL database right in the browser. - -import {VideoBox} from '@site/src/components/video-box'; - -# RxDB as a Database in a jQuery Application - -In the early days of dynamic web development, **jQuery** emerged as a popular library that simplified DOM manipulation and AJAX requests. Despite the rise of modern frameworks, many developers still maintain or extend existing jQuery projects, or leverage jQuery in specific contexts. As jQuery applications grow in complexity, they often require efficient data handling, offline support, and synchronization capabilities. This is where [RxDB](https://rxdb.info/), a reactive JavaScript database for the browser, node.js, and [mobile devices](./mobile-database.md), steps in. - -
- - - -
- -## jQuery Web Applications -jQuery provides a simple API for DOM manipulation, event handling, and AJAX calls. It has been widely adopted due to its ease of use and strong community support. Many projects continue to rely on jQuery for handling client-side functionality, UI interactions, and animations. As these applications evolve, the need for a robust database solution that can manage data locally (and offline) becomes increasingly important. - -## Importance of Databases in jQuery Applications -Modern, data-driven jQuery applications often need to: - -- **Store and retrieve data locally** for quick and responsive user experiences. -- **Synchronize data** between clients or with a [central server](../rx-server.md). -- **Handle offline scenarios** seamlessly. -- **Handle large or complex data structures** without repeatedly hitting the server. - -Relying solely on server endpoints or basic browser storage (like `localStorage`) can quickly become unwieldy for larger or more complex use cases. Enter RxDB, a dedicated solution that manages data on the client side while offering real-time synchronization and offline-first capabilities. - -## Introducing RxDB as a Database Solution -RxDB (short for Reactive Database) is built on top of [IndexedDB](./browser-database.md) and leverages [RxJS](https://rxjs.dev/) to provide a modern, reactive approach to handling data in the browser. With RxDB, you can store documents locally, query them in real-time, and synchronize changes with a remote server whenever an internet connection is available. - -### Key Features - -- **Reactive Data Handling**: RxDB emits real-time updates whenever your data changes, allowing you to instantly reflect these changes in the DOM with jQuery. -- **Offline-First Approach**: Keep your application usable even when the user's network is unavailable. Data is automatically synchronized once connectivity is restored. -- **Data Replication**: Enable multi-device or multi-tab synchronization with minimal effort. -- **Observable Queries**: Reduce code complexity by subscribing to queries instead of constantly polling for changes. -- **Multi-Tab Support**: If a user opens your jQuery application in multiple tabs, RxDB keeps data in sync across all sessions. - -
- -
- -## Getting Started with RxDB - -### What is RxDB? -[RxDB](https://rxdb.info/) is a client-side NoSQL database that stores data in the browser (or [node.js](../nodejs-database.md)) and synchronizes changes with other instances or servers. Its design embraces reactive programming principles, making it well-suited for real-time applications, offline scenarios, and multi-tab use cases. - - - -### Reactive Data Handling -RxDB's use of observables enables an event-driven architecture where data mutations automatically trigger UI updates. In a jQuery application, you can subscribe to these changes and update DOM elements as soon as data changes occur - no need for manual refresh or complicated change detection logic. - -### Offline-First Approach -One of RxDB's distinguishing traits is its emphasis on offline-first design. This means your jQuery application continues to function, display, and update data even when there's no network connection. When connectivity is restored, RxDB synchronizes updates with the server or other peers, ensuring consistency across all instances. - -### Data Replication -RxDB supports real-time data replication with different backends. By enabling replication, you ensure that multiple clients - be they multiple [browser](./browser-database.md) tabs or separate devices - stay in sync. RxDB's conflict resolution strategies help keep the data consistent even when multiple users make changes simultaneously. - -### Observable Queries -Instead of static queries, RxDB provides observable queries. Whenever data relevant to a query changes, RxDB re-emits the new result set. You can subscribe to these updates within your jQuery code and instantly reflect them in the UI. - -### Multi-Tab Support -Running your jQuery app in multiple tabs? RxDB automatically synchronizes changes between those tabs. Users can freely switch windows without missing real-time updates. - - - -### RxDB vs. Other jQuery Database Options -Historically, jQuery developers might use `localStorage` or raw `IndexedDB` for storing data. However, these solutions can require significant boilerplate, lack reactivity, and offer no built-in sync or conflict resolution. RxDB fills these gaps with an out-of-the-box solution, abstracting away low-level database complexities and providing an event-driven, offline-capable approach. - -## Using RxDB in a jQuery Application - -### Installing RxDB -Install RxDB (and `rxjs`) via npm or yarn: -```bash -npm install rxdb rxjs -``` - -If your project isn't set up with a build process, you can still use bundlers like Webpack or Rollup, or serve RxDB as a UMD bundle. Once included, you'll have access to RxDB globally or via import statements. - -## Creating and Configuring a Database - -Below is a minimal example of how to create an RxDB instance and collection. You can call this when your page initializes, then store the `db` object for later use: - -```js -import { createRxDatabase } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -async function initDatabase() { - const db = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage(), - password: 'myPassword', // optional encryption password - multiInstance: true, // multi-tab support - eventReduce: true // optimizes event handling - }); - - await db.addCollections({ - hero: { - schema: { - title: 'hero schema', - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { type: 'string' }, - name: { type: 'string' }, - points: { type: 'number' } - } - } - } - }); - - return db; -} -``` - -## Updating the DOM with jQuery - -Once you have your RxDB instance, you can query data reactively and use jQuery to manipulate the DOM: - -```js -// Example: Displaying heroes using jQuery -$(document).ready(async function () { - const db = await initDatabase(); - - // Subscribing to all hero documents - db.hero - .find() - .$ // the observable - .subscribe((heroes) => { - // Clear the list - $('#heroList').empty(); - - // Append each hero to the DOM - heroes.forEach((hero) => { - $('#heroList').append(` - - ${hero.name} - Points: ${hero.points} - - `); - }); - }); - - // Example of adding a new hero - $('#addHeroBtn').on('click', async () => { - const heroName = $('#heroName').val(); - const heroPoints = parseInt($('#heroPoints').val(), 10); - await db.hero.insert({ - id: Date.now().toString(), - name: heroName, - points: heroPoints - }); - }); -}); -``` - -With this approach, any time data in the `hero` collection changes - like when a new hero is added - your jQuery code re-renders the list of heroes automatically. - -## Different RxStorage layers for RxDB - -RxDB supports multiple storage backends (RxStorage layers). Some popular ones: - -- [LocalStorage.js RxStorage](../rx-storage-localstorage.md): Uses the browsers [localstorage](./localstorage.md). Fast and easy to set up. -- [IndexedDB RxStorage](../rx-storage-indexeddb.md): Direct IndexedDB usage, suitable for modern browsers. -- [OPFS RxStorage](../rx-storage-opfs.md): Uses the File System Access API for better performance in supported browsers. -- [Memory RxStorage](../rx-storage-memory.md): Stores data in memory, handy for tests or ephemeral data. -- [SQLite RxStorage](../rx-storage-sqlite.md): Uses SQLite (potentially via WebAssembly). In typical browser-based scenarios, localstorage or IndexedDB storage is usually more straightforward. - -## Synchronizing Data with RxDB between Clients and Servers - -### Offline-First Approach -RxDB's [offline-first](../offline-first.md) approach allows your jQuery application to store and query data locally. Users can continue interacting, even offline. When connectivity returns, RxDB syncs to the server. - -### Conflict Resolution -Should multiple clients update the same document, RxDB offers [conflict handling strategies](../transactions-conflicts-revisions.md). You decide how to resolve conflicts - like keeping the latest edit or merging changes - ensuring data integrity across distributed systems. - -### Bidirectional Synchronization -With RxDB, data changes flow both ways: from client to server and from server to client. This real-time synchronization ensures that all users or tabs see consistent, up-to-date data. - - - -## Advanced RxDB Features and Techniques - -### Indexing and Performance Optimization -Create indexes on frequently queried fields to speed up performance. For large data sets, indexing can drastically improve query times, keeping your jQuery UI snappy. - -### Encryption of Local Data -RxDB supports [encryption to secure data stored in the browser](../encryption.md). This is crucial if your application handles sensitive user information. - -### Change Streams and Event Handling -Use change streams to listen for data modifications at the database or collection level. This can trigger [real-time](./realtime-database.md) [UI updates](./optimistic-ui.md), notifications, or custom logic whenever the data changes. - -### JSON Key Compression -If your data model has large or repetitive field names, [JSON key compression](../key-compression.md) can minimize stored document size and potentially boost performance. - -## Best Practices for Using RxDB in jQuery Applications - -- Centralize Your Database: Initialize and configure RxDB in one place. Expose the instance where needed or store it globally to avoid re-creating it on every script. -- Leverage Observables: Instead of polling or manually refreshing data, rely on RxDB's reactivity. Subscribe to queries and let RxDB inform you when data changes. -- Handle Subscriptions: If you create subscriptions in a single-page context, ensure you don't re-subscribe endlessly or create memory leaks. Clean them up if you're navigating away or removing DOM elements. -- Offline Testing: Thoroughly test how your jQuery app behaves without a network connection. Simulate offline states in your browser's dev tools or with flight mode to ensure the user experience remains smooth. -- Performance Profiling: For large data sets or frequent data updates, add indexes and carefully measure query performance. Optimize only where needed. - -## Follow Up -To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: - -- [RxDB GitHub Repository](/code/): Visit the official GitHub repository of RxDB to access the source code, documentation, and community support. -- [RxDB Quickstart](../quickstart.md): Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects. -- [RxDB Examples](https://github.com/pubkey/rxdb/tree/master/examples): Browse official examples to see RxDB in action and learn best practices you can apply to your own project - even if jQuery isn't explicitly featured, the patterns are similar. diff --git a/docs/articles/json-based-database.html b/docs/articles/json-based-database.html deleted file mode 100644 index 575b6c257b7..00000000000 --- a/docs/articles/json-based-database.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - -JSON-Based Databases - Why NoSQL and RxDB Simplify App Development | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

JSON-Based Databases: Why NoSQL and RxDB Simplify App Development

-

Modern applications handle highly dynamic, often deeply nested data structures—commonly represented in JSON. Whether you're building a real-time dashboard or a fully offline mobile app, storing and querying data in a JSON-friendly way can reduce overhead and coding complexity. This is where JSON-based databases (often part of the NoSQL family) come into play, letting you store objects in the same format they're used in your code, eliminating the schema wrangling that can come with a strict relational design.

-

Below, we explore why JSON-based databases naturally align with NoSQL principles, how relational engines (like PostgreSQL or SQLite) handle JSON columns, the pitfalls of storing data in a single plain JSON text file, and the ways RxDB stands out as an offline-first JSON solution for JavaScript developers—complete with advanced features like JSON-Schema and JSON-key-compression.

-

NoSQL

-

Why JSON-Based Databases Are Typically NoSQL

-

Document-Oriented by Nature

-

When your data is stored as JSON, each record or document can hold nested arrays and sub-objects with no forced table schema. NoSQL solutions such as MongoDB, CouchDB, Firebase, and RxDB store and retrieve these documents in their “raw” JSON form. This model integrates smoothly with how front-end applications already handle data, minimizing transformations and improving developer productivity.

-

Flexible, Schema-Agnostic

-

Traditional SQL tables enforce rigid column definitions and demand explicit schema migrations when you add or rename a field. By contrast, NoSQL solutions accept more dynamic data structures, allowing changes on the fly. This means a front-end developer can add a new field to a JSON object—perhaps for a new feature—without the friction of redefining or migrating a database schema. While this is possible, it is often not recommended.

-

Aligned With Evolving User Interfaces

-

As modern UIs frequently manipulate deeply nested or changing data, developers find it easier to store whole objects directly, saving time that might otherwise be spent performing complex joins or normalizing data. For instance, frameworks like React, Vue, or Angular are inherently comfortable with nested JSON structures, which map more directly to NoSQL’s “document” approach than to relational tables.

-

Is NoSQL “Better” Than SQL?

-

It depends on your application. SQL remains exceptional for complex aggregations, enforced relationships, and sophisticated transaction handling. But NoSQL is often more intuitive and easier to maintain for “document-first” applications that:

-
    -
  • Thrive on flexible or rapidly evolving data models.
  • -
  • Rely on hierarchical or nested JSON objects.
  • -
  • Avoid multi-table joins.
  • -
  • Require easy horizontal scaling for large sets of documents.
  • -
-

Relational databases are still a top choice for many enterprise back-ends, especially when advanced analytics or strongly enforced referential integrity is needed. But if your application is predominantly storing and manipulating JSON documents (e.g., user profiles, real-time chat logs, embedded items), a JSON-based or document-oriented approach can greatly reduce friction during development.

-

When to Prefer SQL Instead of JSON/NoSQL

-

NoSQL solutions—particularly JSON-based document stores—provide a natural fit for flexible, nested data in UI-heavy applications. However, certain scenarios may benefit more from a SQL solution:

-
    -
  1. Complex Relationships: If your data demands intricate joins across multiple entities (e.g., many-to-many relationships that can’t easily be embedded in a single document), a well-structured relational schema can simplify queries.
  2. -
  3. Strong Integrity and Constraints: SQL excels at enforcing constraints such as foreign keys, unique constraints, and advanced triggers. If your system needs strict data validation and complex business logic within the database, SQL might prove more robust.
  4. -
  5. High-End Analytical Queries: Relational databases can handle sophisticated aggregations, groupings, and joins more efficiently. If your app frequently runs advanced SQL queries, a NoSQL approach may complicate or slow down analytics.
  6. -
  7. Legacy Integration: Many enterprise systems are built around existing relational schemas. A purely NoSQL approach might mean rewriting or bridging systems that are heavily reliant on SQL constraints and transformations.
  8. -
  9. Transaction Handling: While many NoSQL solutions have improved transaction support, it can still lag behind well-established SQL transaction models. If ACID properties and multi-operation atomicity are paramount, you might prefer a tried-and-true relational engine.
  10. -
-

In short, if you prioritize advanced relational queries, robust constraints, or complex business rules at the database level, SQL remains a powerful, and possibly superior, choice. For user-centric, fast-evolving JSON data, though, NoSQL or JSON-based solutions often reduce the friction of frequent schema changes.

-

Storing JSON in Traditional SQL Databases

-

JSON Columns in PostgreSQL or MySQL

-

To accommodate the demand for flexible data, several SQL engines (notably PostgreSQL and MySQL) introduced support for JSON columns. PostgreSQL offers the JSON and JSONB types, enabling developers to store raw JSON in a column. You can also index specific paths within the JSON to speed lookups on nested fields:

-
CREATE TABLE products (
-   id SERIAL PRIMARY KEY,
-   name TEXT,
-   details JSONB
-);
- 
--- Insert a record with JSON data
-INSERT INTO products (name, details) VALUES
-('Laptop', '{"brand": "BrandX", "features": ["Touchscreen", "SSD"]}');
-

Although this approach merges the best of both worlds (SQL queries + flexible JSON fields), it can also create a “split personality” in your schema. You might store stable data in normal columns, while unpredictable or nested details live inside a JSONB field. Some projects flourish with this hybrid design, others find it a bit unwieldy.

-
WASM SQLite
-

Storing JSON in SQLite

-

SQLite also allows storing JSON data, typically as text columns, but with some additional features since SQLite 3.9 (2015) including the JSON1 extension. This extension can parse JSON text, perform queries on JSON fields, and do partial updates. However, storing JSON in SQLite does require you to ensure you’ve compiled SQLite with JSON1 support or to rely on a library that bundles it. While possible, you still won't get quite the same schema-agnostic ease as a full document store, but it’s a pragmatic solution for smaller or embedded needs on the server side—or occasionally in the browser if you run SQLite via WebAssembly. RxDB uses this in its SQLite storage.

-

JSON vs. Database - Why a Plain JSON Text File is a Problem

-

Some developers consider storing everything in a single JSON file, typically read and written directly from disk or local storage. This approach, while seemingly simple, usually does not scale. Key issues include:

-
    -
  • No Concurrency: If multiple parts of the application try to write to the same JSON file, you risk overwriting changes.
  • -
  • No Indexes: Finding or filtering items in large JSON text requires scanning everything. This is slow and quickly becomes unmanageable.
  • -
  • No Partial Updates: You often reload the entire file, modify it in memory, then write it back, which is highly inefficient for large data sets.
  • -
  • Corruption Risk: A single corrupted write or partial save might break the entire JSON file, losing all data.
  • -
  • High Memory Usage: The entire file may need to be parsed into memory, even if you only need a fraction of the data.
  • -
-

Databases—relational or NoSQL—solve these issues by handling concurrency, enabling partial reads/writes, establishing indexes, and ensuring transactional integrity so you don’t lose everything if the process is interrupted mid-write.

-
JavaScript JSON Database
-

RxDB: A JSON-Focused Database for JavaScript Apps

-

Many NoSQL databases operate on the server, whereas RxDB is built for client-side usage—browsers, mobile apps, or Node.js. It specializes in JSON documents and embraces an offline-first philosophy.

-

Key Characteristics

-
    -
  1. Local JSON Storage
  2. -
-

RxDB stores each record as a JSON document, closely matching how front-end frameworks handle state. This eliminates complex transformations or manual JSON parsing before writing to a table.

-
    -
  1. Reactive Queries
  2. -
-

Instead of complex SQL, RxDB uses JSON-based query definitions. You can subscribe to query results, letting your UI automatically refresh when data changes locally or from remote sync updates:

-

realtime ui updates

-
    -
  1. Offline-First Sync
  2. -
-

Built-in replication plugins push/pull changes to or from a remote server. If your app is offline, updates get stored locally, then sync up seamlessly once a connection is available.

-
    -
  1. Optional JSON-Schema
  2. -
-

Though it’s a document database, RxDB encourages you to define a JSON-based schema for clarity, indexing, and type validation. This helps maintain data consistency while still allowing a measure of flexibility for new fields.

-

Advanced JSON Features in RxDB

-
    -
  • -

    JSON-Schema: By specifying a JSON-Schema, you can define which fields exist, whether they are required, and their data types. This is invaluable for catching malformed documents early and imposing mild structure in a NoSQL setting.

    -
  • -
  • -

    JSON Key-Compression: Large, verbose field names can bloat storage usage. RxDB’s optional key-compression plugin automatically shortens field names in your JSON documents internally, reducing disk space and bandwidth:

    -
  • -
-
// Example: how key-compression can transform your documents
-const uncompressed = {
-  "firstName": "Corrine",
-  "lastName": "Ziemann",
-  "shoppingCartItems": [
-    { "productNumber": 29857, "amount": 1 },
-    { "productNumber": 53409, "amount": 6 }
-  ]
-};
- 
-const compressed = {
-  "|e": "Corrine",
-  "|g": "Ziemann",
-  "|i": [
-    { "|h": 29857, "|b": 1 },
-    { "|h": 53409, "|b": 6 }
-  ]
-};
-

The user sees no difference in their code—RxDB automatically decompresses data on read—but the overhead is drastically reduced behind the scenes.

-

Follow Up

-

JSON-based databases naturally align with NoSQL because they accommodate evolving, nested data without rigid schemas. This makes them appealing for many UI-centric or offline-first applications where flexible documents and agile development cycles matter more than heavy relational queries or constraints.

-

SQL can still store JSON—whether in PostgreSQL’s JSONB columns, MySQL’s JSON fields, or SQLite’s JSON1 extension. For some teams, a hybrid approach pairing SQL for relational data with JSON columns for more flexible fields works well. However, storing everything in a single monolithic JSON text file is rarely advisable for anything beyond trivial tasks—databases excel at concurrency, indexing, and partial writes.

-

Tools like RxDB provide an even simpler, local-first take on JSON documents—particularly for JavaScript projects. With offline replication, reactive queries, optional JSON-Schema, and advanced optimizations such as key-compression, RxDB streamlines building dynamic, user-facing features while preserving the core benefits of a robust document database.

-

To explore more about RxDB and its capabilities for browser database development, check out the following resources:

-
    -
  • RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.
  • -
  • RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects.
  • -
  • RxDB Examples: Browse official examples to see RxDB in action and learn best practices you can apply to your own project - even if jQuery isn't explicitly featured, the patterns are similar.
  • -
- - \ No newline at end of file diff --git a/docs/articles/json-based-database.md b/docs/articles/json-based-database.md deleted file mode 100644 index ee601b6af8c..00000000000 --- a/docs/articles/json-based-database.md +++ /dev/null @@ -1,157 +0,0 @@ -# JSON-Based Databases - Why NoSQL and RxDB Simplify App Development - -> Dive into how JSON-based databases power modern UI-centric apps, why NoSQL often outperforms SQL for dynamic data, how SQLite accommodates JSON, and why RxDB delivers a seamless offline-first solution for JavaScript with advanced JSON features. - -# JSON-Based Databases: Why NoSQL and RxDB Simplify App Development - -Modern applications handle highly dynamic, often deeply nested data structures—commonly represented in **JSON**. Whether you're building a real-time dashboard or a fully offline mobile app, storing and querying data in a JSON-friendly way can reduce overhead and coding complexity. This is where **JSON-based databases** (often part of the **NoSQL** family) come into play, letting you store objects in the same format they're used in your code, eliminating the schema wrangling that can come with a strict relational design. - -Below, we explore why JSON-based databases naturally align with **NoSQL** principles, how relational engines (like PostgreSQL or SQLite) handle JSON columns, the pitfalls of storing data in a single plain JSON text file, and the ways [RxDB](https://rxdb.info/) stands out as an offline-first JSON solution for JavaScript developers—complete with advanced features like JSON-Schema and JSON-key-compression. - - - -## Why JSON-Based Databases Are Typically NoSQL - -### Document-Oriented by Nature - -When your data is stored as JSON, each record or document can hold nested arrays and sub-objects with no forced table schema. NoSQL solutions such as [MongoDB](../rx-storage-mongodb.md), [CouchDB](../replication-couchdb.md), [Firebase](../replication-firestore.md), and **RxDB** store and retrieve these documents in their “raw” JSON form. This model integrates smoothly with how front-end applications already handle data, minimizing transformations and improving developer productivity. - -### Flexible, Schema-Agnostic - -Traditional SQL tables enforce rigid column definitions and demand explicit schema migrations when you add or rename a field. By contrast, NoSQL solutions accept more dynamic data structures, allowing changes on the fly. This means a front-end developer can add a new field to a JSON object—perhaps for a new feature—without the friction of redefining or migrating a database schema. While this is possible, it is often not recommended. - -### Aligned With Evolving User Interfaces - -As modern UIs frequently manipulate deeply nested or changing data, developers find it easier to store whole objects directly, saving time that might otherwise be spent performing complex joins or normalizing data. For instance, frameworks like React, Vue, or Angular are inherently comfortable with nested JSON structures, which map more directly to NoSQL’s “document” approach than to relational tables. - -## Is NoSQL “Better” Than SQL? - -It depends on your application. **SQL** remains exceptional for complex aggregations, enforced relationships, and sophisticated transaction handling. But **NoSQL** is often more intuitive and easier to maintain for “document-first” applications that: - -- Thrive on flexible or rapidly evolving data models. -- Rely on hierarchical or nested JSON objects. -- Avoid multi-table joins. -- Require easy horizontal scaling for large sets of documents. - -Relational databases are still a top choice for many enterprise back-ends, especially when advanced analytics or strongly enforced referential integrity is needed. But if your application is predominantly storing and manipulating JSON documents (e.g., user profiles, real-time chat logs, embedded items), a JSON-based or document-oriented approach can greatly reduce friction during development. - -## When to Prefer SQL Instead of JSON/NoSQL -NoSQL solutions—particularly JSON-based document stores—provide a natural fit for flexible, nested data in UI-heavy applications. However, certain scenarios may benefit more from a **SQL** solution: -1. **Complex Relationships**: If your data demands intricate joins across multiple entities (e.g., many-to-many relationships that can’t easily be embedded in a single document), a well-structured relational schema can simplify queries. -2. **Strong Integrity and Constraints**: SQL excels at enforcing constraints such as foreign keys, unique constraints, and advanced triggers. If your system needs strict data validation and complex business logic within the database, SQL might prove more robust. -3. **High-End Analytical Queries**: Relational databases can handle sophisticated aggregations, groupings, and joins more efficiently. If your app frequently runs advanced SQL queries, a NoSQL approach may complicate or slow down analytics. -4. **Legacy Integration**: Many enterprise systems are built around existing relational schemas. A purely NoSQL approach might mean rewriting or bridging systems that are heavily reliant on SQL constraints and transformations. -5. **Transaction Handling**: While many NoSQL solutions have improved transaction support, it can still lag behind well-established SQL transaction models. If ACID properties and multi-operation atomicity are paramount, you might prefer a tried-and-true relational engine. - -In short, if you prioritize advanced relational queries, robust constraints, or complex business rules at the database level, SQL remains a powerful, and possibly superior, choice. For user-centric, fast-evolving JSON data, though, NoSQL or JSON-based solutions often reduce the friction of frequent schema changes. - -## Storing JSON in Traditional SQL Databases - -### JSON Columns in PostgreSQL or MySQL - -To accommodate the demand for flexible data, several SQL engines (notably **PostgreSQL** and MySQL) introduced support for **JSON** columns. PostgreSQL offers the `JSON` and `JSONB` types, enabling developers to store raw JSON in a column. You can also index specific paths within the JSON to speed lookups on nested fields: - -```sql -CREATE TABLE products ( - id SERIAL PRIMARY KEY, - name TEXT, - details JSONB -); - --- Insert a record with JSON data -INSERT INTO products (name, details) VALUES -('Laptop', '{"brand": "BrandX", "features": ["Touchscreen", "SSD"]}'); -``` - -Although this approach merges the best of both worlds (SQL queries + flexible JSON fields), it can also create a “split personality” in your schema. You might store stable data in normal columns, while unpredictable or nested details live inside a JSONB field. Some projects flourish with this hybrid design, others find it a bit unwieldy. - -
- -
- -## Storing JSON in SQLite -SQLite also allows storing JSON data, typically as text columns, but with some additional features since **SQLite 3.9** (2015) including the [JSON1 extension](https://www.sqlite.org/json1.html). This extension can parse JSON text, perform queries on JSON fields, and do partial updates. However, storing JSON in SQLite does require you to ensure you’ve compiled SQLite with JSON1 support or to rely on a library that bundles it. While possible, you still won't get quite the same schema-agnostic ease as a full document store, but it’s a pragmatic solution for smaller or embedded needs on the server side—or occasionally in the browser if you run SQLite via WebAssembly. RxDB uses this in its [SQLite storage](../rx-storage-sqlite.md). - -## JSON vs. Database - Why a Plain JSON Text File is a Problem - -Some developers consider storing everything in a single JSON file, typically read and written directly from disk or local storage. This approach, while seemingly simple, usually does not scale. Key issues include: - -- **No Concurrency**: If multiple parts of the application try to write to the same JSON file, you risk overwriting changes. -- **No Indexes**: Finding or filtering items in large JSON text requires scanning everything. This is slow and quickly becomes unmanageable. -- **No Partial Updates**: You often reload the entire file, modify it in memory, then write it back, which is highly inefficient for large data sets. -- **Corruption Risk**: A single corrupted write or partial save might break the entire JSON file, losing all data. -- **High Memory Usage**: The entire file may need to be parsed into memory, even if you only need a fraction of the data. - -Databases—relational or NoSQL—solve these issues by handling concurrency, enabling partial reads/writes, establishing indexes, and ensuring transactional integrity so you don’t lose everything if the process is interrupted mid-write. - -
- - - -
- -## RxDB: A JSON-Focused Database for JavaScript Apps - -Many NoSQL databases operate on the server, whereas RxDB is built for client-side usage—browsers, mobile apps, or Node.js. It specializes in JSON documents and embraces an [offline-first](../offline-first.md) philosophy. - -### Key Characteristics -1. **Local JSON Storage** - -RxDB stores each record as a JSON document, closely matching how front-end frameworks handle state. This eliminates complex transformations or manual JSON parsing before writing to a table. - -2. **Reactive Queries** - -Instead of complex SQL, RxDB uses JSON-based [query](../rx-query.md) definitions. You can subscribe to query results, letting your UI automatically refresh when data changes locally or from remote sync updates: - - - -3. **Offline-First Sync** - -Built-in replication plugins push/pull changes to or from a remote server. If your app is offline, updates get stored locally, then sync up seamlessly once a connection is available. - -4. **Optional JSON-Schema** - -Though it’s a document database, RxDB encourages you to define a JSON-based schema for clarity, indexing, and type validation. This helps maintain data consistency while still allowing a measure of flexibility for new fields. - -### Advanced JSON Features in RxDB - -- **JSON-Schema**: By specifying a JSON-Schema, you can define which fields exist, whether they are required, and their data types. This is invaluable for catching malformed documents early and imposing mild structure in a NoSQL setting. - -- **JSON Key-Compression**: Large, verbose field names can bloat storage usage. RxDB’s optional [key-compression plugin](../key-compression.md) automatically shortens field names in your JSON documents internally, reducing disk space and bandwidth: - -```ts -// Example: how key-compression can transform your documents -const uncompressed = { - "firstName": "Corrine", - "lastName": "Ziemann", - "shoppingCartItems": [ - { "productNumber": 29857, "amount": 1 }, - { "productNumber": 53409, "amount": 6 } - ] -}; - -const compressed = { - "|e": "Corrine", - "|g": "Ziemann", - "|i": [ - { "|h": 29857, "|b": 1 }, - { "|h": 53409, "|b": 6 } - ] -}; -``` - -The user sees no difference in their code—RxDB automatically decompresses data on read—but the overhead is drastically reduced behind the scenes. - -## Follow Up - -JSON-based databases naturally align with NoSQL because they accommodate evolving, nested data without rigid schemas. This makes them appealing for many UI-centric or offline-first applications where flexible documents and agile development cycles matter more than heavy relational queries or constraints. - -SQL can still store JSON—whether in PostgreSQL’s JSONB columns, MySQL’s JSON fields, or SQLite’s JSON1 extension. For some teams, a hybrid approach pairing SQL for relational data with JSON columns for more flexible fields works well. However, storing everything in a single monolithic JSON text file is rarely advisable for anything beyond trivial tasks—databases excel at concurrency, indexing, and partial writes. - -Tools like RxDB provide an even simpler, [local-first](./local-first-future.md) take on JSON documents—particularly for JavaScript projects. With offline [replication](../replication.md), reactive queries, optional JSON-Schema, and advanced optimizations such as key-compression, RxDB streamlines building dynamic, user-facing features while preserving the core benefits of a robust document database. - -To explore more about RxDB and its capabilities for browser database development, check out the following resources: - -- [RxDB GitHub Repository](/code/): Visit the official GitHub repository of RxDB to access the source code, documentation, and community support. -- [RxDB Quickstart](../quickstart.md): Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects. -- [RxDB Examples](https://github.com/pubkey/rxdb/tree/master/examples): Browse official examples to see RxDB in action and learn best practices you can apply to your own project - even if jQuery isn't explicitly featured, the patterns are similar. diff --git a/docs/articles/json-database.html b/docs/articles/json-database.html deleted file mode 100644 index 14a441fc457..00000000000 --- a/docs/articles/json-database.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - -RxDB - The JSON Database Built for JavaScript | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RxDB - JSON Database for JavaScript

-

Storing data as JSON documents in a NoSQL database is not just a trend; it's a practical choice. JSON data is highly compatible with various tools and is human-readable, making it an excellent fit for modern applications. JSON documents offer more flexibility compared to traditional SQL table rows, as they can contain nested data structures. This article introduces RxDB, an open-source, flexible, performant, and battle-tested NoSQL JSON database specifically designed for JavaScript applications.

-
JSON Database
-

Why Choose a JSON Database?

-
    -
  • -

    JavaScript Friendliness: JavaScript, a prevalent language for web development, naturally uses JSON for data representation. Using a JSON database aligns seamlessly with JavaScript's native data format.

    -
  • -
  • -

    Compatibility: JSON is widely supported across different programming languages and platforms. Storing data in JSON format ensures compatibility with a broad range of tools and systems. All modern programming ecosystems have packages to parse, validate and process JSON data.

    -
  • -
  • -

    Flexibility: JSON documents can accommodate complex and nested data structures, allowing developers to store data in a more intuitive and hierarchical manner compared to SQL table rows. Nested data can be just stored in-document instead of having related tables.

    -
  • -
  • -

    Human-Readable: JSON is easy to read and understand, simplifying debugging and data inspection tasks.

    -
  • -
-

Storage and Access Options for JSON Documents

-

When incorporating JSON documents into your application, you have several storage and access options to consider:

-
    -
  • -

    Local In-App Database with In-Memory Storage: Ideal for lightweight applications or temporary data storage, this option keeps data in memory, ensuring fast read and write operations. However, data is not persistet beyond the current application session, making it suitable for temporary data storage. With RxDB, the memory RxStorage can be utilized to create an in-memory database.

    -
  • -
  • -

    Local In-App Database with Persistent Storage: Suitable for applications requiring data retention across sessions. Data is stored on the user's device or inside of the Node.js application, offering persistence between application sessions. It balances speed and data retention, making it versatile for various applications. With RxDB, a whole range of persistent storages is available. As example, for browser there is the IndexedDB storage. For server side applications, the Node.js Filesystem storage can be used. There are many more storages for React-Native, Flutter, Capacitors.js and others.

    -
  • -
  • -

    Server Database Connected to the Application: For applications requiring data synchronization and accessibility from multiple processes, a server-based database is the preferred choice. Data is stored on a remote server, facilitating data sharing, synchronization, and accessibility across multiple processes. It's suitable for scenarios requiring centralized data management and enhanced security and backup capabilities on the server. RxDB supports the FoundationDB and MongoDB as a remote database server.

    -
  • -
-

Compression Storage for JSON Documents

-

Compression storage for JSON documents is made effortless with RxDB's key-compression plugin. This feature enables the efficient storage of compressed document data, reducing storage requirements while maintaining data integrity. Queries on compressed documents remain seamless, ensuring that your application benefits from both space-saving advantages and optimal query performance, making RxDB a compelling choice for managing JSON data efficiently. The compression happens inside of the RxDatabase and does not affect the API usage. The only limitation is that encrypted fields themself cannot be used inside a query.

-

Schema Validation and Data Migration on Schema Changes

-

Storing JSON documents inside of a database in an application, can cause a problem when the format of the data changes. Instead of having a single server where the data must be migrated, many client devices are out there that have to run a migration. -When your application's schema evolves, RxDB provides migration strategies to facilitate the transition, ensuring data consistency throughout schema updates.

-

JSONSchema Validation Plugins: RxDB supports multiple JSONSchema validation plugins, guaranteeing that only valid data is stored in the database. RxDB uses the JsonSchema standardization that you might know from other technologies like OpenAPI (aka Swagger).

-
// RxDB Schema example
-const mySchema = {
-    version: 0,
-    primaryKey: 'id', // <- define the primary key for your documents
-    type: 'object',
-    properties: {
-        id: {
-            type: 'string',
-            maxLength: 100 // <- the primary key must have set maxLength
-        },
-        name: {
-            type: 'string',
-            maxLength: 100
-        },
-        done: {
-            type: 'boolean'
-        },
-        timestamp: {
-            type: 'string',
-            format: 'date-time'
-        }
-    },
-    required: ['id', 'name', 'done', 'timestamp']
-}
-

Store JSON with RxDB in Browser Applications

-

RxDB offers versatile storage solutions for browser-based applications:

-
    -
  • -

    Multiple Storage Plugins: RxDB supports various storage backends, including IndexedDB, localstorage and In-Memory, catering to a range of browser environments.

    -
  • -
  • -

    Observable Queries: With RxDB, you can create observable queries that work seamlessly across multiple browser tabs, providing real-time updates and synchronization.

    -
  • -
-

multi tab support

-

RxDB JSON Database Performance

-

Certainly! Let's delve deeper into the performance aspects of RxDB when it comes to working with JSON data.

-
    -
  1. -

    Efficient Querying: RxDB is engineered for rapid and efficient querying of JSON data. It employs a well-optimized indexing system that allows for lightning-fast retrieval of specific data points within your JSON documents. Whether you're fetching individual values or complex nested structures, RxDB's query performance is designed to keep your application responsive, even when dealing with large datasets.

    -
  2. -
  3. -

    Scalability: As your application grows and your JSON dataset expands, RxDB scales gracefully. Its performance remains consistent, enabling you to handle increasingly larger volumes of data without compromising on speed or responsiveness. This scalability is essential for applications that need to accommodate growing user bases and evolving data needs.

    -
  4. -
  5. -

    Reduced Latency: RxDB's streamlined data access mechanisms significantly reduce latency when working with JSON data. Whether you're reading from the database, making updates, or synchronizing data between clients and servers, RxDB's optimized operations help minimize the delays often associated with data access. Observed queries are optimized with the EventReduce algorithm to provide nearly-instand UI updates on data changes.

    -
  6. -
  7. -

    RxStorage Layer: Because RxDB allows you to swap out the storage layer. A storage with the most optimal performance can be chosen for each runtime while not touching other database code. Depending on the access patterns, you can pick exactly the storage that is best:

    -
  8. -
-

RxStorage performance - browser

-

RxDB in Node.js

-

Node.js developers can also benefit from RxDB's capabilities. By integrating RxDB into your Node.js applications, you can harness the power of a NoSQL JSON db to efficiently manage your data on the server-side. RxDB's flexibility, performance, and essential features are equally valuable in server-side development. Read more about RxDB+Node.js.

-

RxDB to store JSON documents in React Native

-

For mobile app developers working with React Native, RxDB offers a convenient solution for handling JSON data. Whether you're building Android or iOS applications, RxDB's compatibility with JavaScript and its ability to work with JSON documents make it a natural choice for data management within your React Native apps. Read more about RxDB+React-Native.

-

Using SQLite as a JSON Database

-

In some cases, you might want to use SQLite as a backend storage solution for your JSON data. RxDB can be configured to work with SQLite, providing the benefits of both a relational database system and JSON document storage. This hybrid approach can be advantageous when dealing with complex data relationships while retaining the flexibility of JSON data representation.

-

Follow Up

-

To further explore RxDB and get started with using it in your frontend applications, consider the following resources:

-
    -
  • RxDB Quickstart: A step-by-step guide to quickly set up RxDB in your project and start leveraging its features.
  • -
  • RxDB GitHub Repository: The official repository for RxDB, where you can find the code, examples, and community support.
  • -
-

By embracing RxDB as your JSON database solution, you can tap into the extensive capabilities of JSON data storage. This empowers your applications with offline accessibility, caching, enhanced performance, and effortless data synchronization. RxDB's focus on JavaScript and its robust feature set render it the perfect selection for frontend developers in pursuit of efficient and scalable data storage solutions.

- - \ No newline at end of file diff --git a/docs/articles/json-database.md b/docs/articles/json-database.md deleted file mode 100644 index b6ab14d1b8b..00000000000 --- a/docs/articles/json-database.md +++ /dev/null @@ -1,109 +0,0 @@ -# RxDB - The JSON Database Built for JavaScript - -> Experience a powerful JSON database with RxDB, built for JavaScript. Store, sync, and compress your data seamlessly across web and mobile apps. - -# RxDB - JSON Database for JavaScript - -Storing data as **JSON documents** in a **NoSQL** database is not just a trend; it's a practical choice. JSON data is highly compatible with various tools and is human-readable, making it an excellent fit for modern applications. JSON documents offer more flexibility compared to traditional SQL table rows, as they can contain nested data structures. This article introduces [RxDB](https://rxdb.info/), an open-source, flexible, performant, and battle-tested NoSQL JSON database specifically designed for **JavaScript** applications. - -
- - - -
- -## Why Choose a JSON Database? -- **JavaScript Friendliness**: JavaScript, a prevalent language for web development, naturally uses JSON for data representation. Using a JSON database aligns seamlessly with JavaScript's native data format. - -- **Compatibility**: JSON is widely supported across different programming languages and platforms. Storing data in JSON format ensures compatibility with a broad range of tools and systems. All modern programming ecosystems have packages to parse, validate and process JSON data. - -- **Flexibility**: JSON documents can accommodate complex and nested data structures, allowing developers to store data in a more intuitive and hierarchical manner compared to SQL table rows. Nested data can be just stored in-document instead of having related tables. - -- **Human-Readable**: JSON is easy to read and understand, simplifying debugging and data inspection tasks. - -## Storage and Access Options for JSON Documents -When incorporating JSON documents into your application, you have several storage and access options to consider: - -- **Local In-App Database with In-Memory Storage**: Ideal for lightweight applications or temporary data storage, this option keeps data in memory, ensuring fast read and write operations. However, data is not persistet beyond the current application session, making it suitable for temporary data storage. With RxDB, the [memory RxStorage](../rx-storage-memory.md) can be utilized to create an in-memory database. - -- **Local In-App Database with Persistent Storage**: Suitable for applications requiring data retention across sessions. Data is stored on the user's device or inside of the Node.js application, offering persistence between application sessions. It balances speed and data retention, making it versatile for various applications. With RxDB, a whole range of persistent storages is available. As example, for browser there is the [IndexedDB storage](../rx-storage-indexeddb.md). For server side applications, the [Node.js Filesystem storage](../rx-storage-filesystem-node.md) can be used. There are [many more storages](../rx-storage.md) for React-Native, Flutter, Capacitors.js and others. - -- **Server Database Connected to the Application**: For applications requiring data synchronization and accessibility from multiple processes, a server-based database is the preferred choice. Data is stored on a **remote server**, facilitating data sharing, synchronization, and accessibility across multiple processes. It's suitable for scenarios requiring centralized data management and enhanced security and backup capabilities on the server. RxDB supports the [FoundationDB](../rx-storage-foundationdb.md) and [MongoDB](../rx-storage-mongodb.md) as a remote database server. - -## Compression Storage for JSON Documents - -Compression storage for JSON documents is made effortless with RxDB's [key-compression plugin](../key-compression.md). This feature enables the efficient storage of compressed document data, reducing storage requirements while maintaining data integrity. Queries on compressed documents remain seamless, ensuring that your application benefits from both space-saving advantages and optimal query performance, making RxDB a compelling choice for managing JSON data efficiently. The compression happens inside of the [RxDatabase](../rx-database.md) and does not affect the API usage. The only limitation is that encrypted fields themself cannot be used inside a query. - -## Schema Validation and Data Migration on Schema Changes -Storing JSON documents inside of a database in an application, can cause a problem when the format of the data changes. Instead of having a single server where the data must be migrated, many client devices are out there that have to run a migration. -When your application's schema evolves, RxDB provides [migration strategies](../migration-schema.md) to facilitate the transition, ensuring data consistency throughout schema updates. - -**JSONSchema Validation Plugins**: RxDB supports multiple [JSONSchema validation plugins](../schema-validation.md), guaranteeing that only valid data is stored in the database. RxDB uses the JsonSchema standardization that you might know from other technologies like OpenAPI (aka Swagger). - -```javascript -// RxDB Schema example -const mySchema = { - version: 0, - primaryKey: 'id', // <- define the primary key for your documents - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 // <- the primary key must have set maxLength - }, - name: { - type: 'string', - maxLength: 100 - }, - done: { - type: 'boolean' - }, - timestamp: { - type: 'string', - format: 'date-time' - } - }, - required: ['id', 'name', 'done', 'timestamp'] -} -``` - -## Store JSON with RxDB in Browser Applications -RxDB offers versatile storage solutions for browser-based applications: - -- **Multiple Storage Plugins**: RxDB supports various storage backends, including [IndexedDB](../rx-storage-indexeddb.md), [localstorage](../rx-storage-localstorage.md) and [In-Memory](../rx-storage-memory.md), catering to a range of browser environments. - -- **Observable Queries**: With RxDB, you can create observable [queries](../rx-query.md) that work seamlessly across multiple browser tabs, providing real-time updates and synchronization. - - - -## RxDB JSON Database Performance - -Certainly! Let's delve deeper into the performance aspects of RxDB when it comes to working with JSON data. - -1. **Efficient Querying:** RxDB is engineered for rapid and efficient querying of JSON data. It employs a well-optimized indexing system that allows for lightning-fast retrieval of specific data points within your JSON documents. Whether you're fetching individual values or complex nested structures, RxDB's query performance is designed to keep your application responsive, even when dealing with large datasets. - -2. **Scalability:** As your application grows and your [JSON dataset](./json-based-database.md) expands, RxDB scales gracefully. Its performance remains consistent, enabling you to handle increasingly larger volumes of data without compromising on speed or responsiveness. This scalability is essential for applications that need to accommodate growing user bases and evolving data needs. - -3. **Reduced Latency:** RxDB's streamlined data access mechanisms significantly reduce latency when working with JSON data. Whether you're reading from the database, making updates, or synchronizing data between clients and servers, RxDB's optimized operations help minimize the delays often associated with data access. Observed queries are optimized with the [EventReduce algorithm](https://github.com/pubkey/event-reduce) to provide nearly-instand UI updates on data changes. - -4. **RxStorage Layer**: Because RxDB allows you to swap out the storage layer. A storage with the most optimal performance can be chosen for each runtime while not touching other database code. Depending on the access patterns, you can pick exactly the storage that is best: - - - -## RxDB in Node.js -Node.js developers can also benefit from RxDB's capabilities. By integrating RxDB into your Node.js applications, you can harness the power of a NoSQL JSON db to efficiently manage your data on the server-side. RxDB's flexibility, performance, and essential features are equally valuable in server-side development. [Read more about RxDB+Node.js](../nodejs-database.md). - -## RxDB to store JSON documents in React Native - -For mobile app developers working with React Native, RxDB offers a convenient solution for handling JSON data. Whether you're building Android or iOS applications, RxDB's compatibility with JavaScript and its ability to work with JSON documents make it a natural choice for data management within your React Native apps. [Read more about RxDB+React-Native](../react-native-database.md). - -## Using SQLite as a JSON Database -In some cases, you might want to use SQLite as a backend storage solution for your JSON data. RxDB can be configured [to work with SQLite](../rx-storage-sqlite.md), providing the benefits of both a relational database system and JSON document storage. This hybrid approach can be advantageous when dealing with complex data relationships while retaining the flexibility of JSON data representation. - -## Follow Up -To further explore RxDB and get started with using it in your frontend applications, consider the following resources: - -- [RxDB Quickstart](../quickstart.md): A step-by-step guide to quickly set up RxDB in your project and start leveraging its features. -- [RxDB GitHub Repository](https://github.com/pubkey/rxdb): The official repository for RxDB, where you can find the code, examples, and community support. - -By embracing [RxDB](https://rxdb.info/) as your **JSON database** solution, you can tap into the extensive capabilities of JSON data storage. This empowers your applications with offline accessibility, caching, enhanced performance, and effortless data synchronization. RxDB's focus on JavaScript and its robust feature set render it the perfect selection for frontend developers in pursuit of efficient and scalable data storage solutions. diff --git a/docs/articles/local-database.html b/docs/articles/local-database.html deleted file mode 100644 index de9a616761f..00000000000 --- a/docs/articles/local-database.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - -What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications

-

A local database is a data storage system residing on a user's device, allowing applications to store, query, and manipulate information without needing continuous network access. This approach prioritizes quick data retrieval, efficient updates, and the ability to function in offline-first scenarios. In contrast, server-based databases require an active internet connection for each request and response cycle, making them more vulnerable to latency, network disruptions, and downtime.

-

Local databases often leverage technologies such as IndexedDB, SQLite, or WebSQL (though WebSQL has been deprecated). These technologies manage both structured data (like relational tables) and unstructured data (such as JSON documents). When connectivity is restored, local databases typically sync their changes back to a central server-side database, maintaining consistent and up-to-date records across multiple devices.

-

Use Cases of Local Databases

-

Local databases are particularly beneficial for:

-
    -
  • Offline Functionality: Essential for apps that must remain usable without a consistent internet connection, such as note-taking apps or offline-first CRMs. Users can continue adding and editing data, then sync changes once they reconnect.
  • -
  • Low Latency: By reducing round-trips to remote servers, local databases enable real-time responsiveness. This feature is critical for interactive applications such as gaming platforms, data dashboards, or analytics tools that need near-instant feedback.
  • -
  • Data Synchronization: Many modern applications - like chat systems or collaborative editing tools - require continuous data exchange between multiple users or devices. Local databases can handle intermittent connectivity gracefully, queuing updates locally and syncing them when possible.
  • -
-

In addition, local databases are increasingly integral to Progressive Web Apps (PWAs), offering a native app-like user experience that is fast and available, even when offline.

-

Performance Optimization

-

The primary performance benefit of a local database is its proximity to the application: queries and updates happen directly on the user's device, eliminating the overhead of multiple network hops. Common optimizations include:

-
    -
  • Caching: Storing frequently accessed data in memory or on disk to minimize expensive operations.
  • -
  • Batching Writes: Grouping database operations into a single write transaction to reduce overhead and lock contention.
  • -
  • Efficient Indexing: Using appropriate indexes to speed up queries, especially important for applications that handle large data sets or frequent lookups.
  • -
-

These techniques ensure that local databases run smoothly, even on lower-powered or mobile devices.

-

loading spinner not needed

-

Security and Encryption

-

Storing data on user devices introduces unique security considerations, such as the risk of physical theft or unauthorized access. Consequently, many local databases support encryption options to safeguard sensitive information. Developers can implement additional security measures like device-level encryption, secure storage plugins, and user authentication to further protect data from prying eyes.

-
-
RxDB Database
-

Why RxDB is Optimized for JavaScript Applications

-

RxDB (Reactive Database) is an offline-first, NoSQL database designed to meet the needs of modern JavaScript applications. Built with a focus on reactivity and real-time data handling, RxDB excels in scenarios where low-latency, offline availability, and scalability are essential.

-

Real-Time Reactivity

-

At the core of RxDB is reactive programming, allowing you to subscribe to changes in your data collections and receive immediate UI updates when records change - no manual polling or refetching required. For instance, a chat application can display incoming messages as soon as they arrive, maintaining a smooth and responsive experience.

-

RxDB multi tab

-

Offline-First Support

-

RxDB's primary design goal is to work seamlessly in offline environments. Even if your device loses internet connectivity, RxDB enables you to continue reading and writing data. Once the connection is restored, all pending changes are automatically synchronized with your backend. This offline-first approach is ideal for productivity apps, field service tools, and other scenarios where reliability and user autonomy are paramount.

-

Flexible Data Replication

-

A standout feature of RxDB is its bi-directional replication. It supports synchronization with a variety of backends, such as:

-
    -
  • CouchDB: Via the CouchDB replication, facilitating easy integration with any Couch-compatible server.
  • -
  • GraphQL Endpoints: Through community plugins, developers can replicate JSON documents to and from GraphQL servers.
  • -
  • Custom Backends: RxDB provides hooks to build custom replication strategies for proprietary or specialized server APIs.
  • -
-

This flexibility ensures that RxDB fits into diverse architectures without locking you into a single vendor or technology stack.

-

Schema Validation and Versioning

-

Rather than relying on implicit data models, RxDB leverages JSON schema to define document structures. This approach promotes data consistency by enforcing constraints such as required fields and acceptable data formats. As your application grows and changes, RxDB's built-in schema versioning and migration tools help you evolve your database schema safely, minimizing risks of data corruption or loss.

-

Rich Plugin Ecosystem

-

One of RxDB's greatest strengths is its pluggable architecture, allowing you to add functionality as needed:

- -

You can fine-tune RxDB to your exact needs, avoiding the performance overhead of unnecessary features.

-

Multi-Platform Compatibility

-

RxDB is a perfect fit for cross-platform development, as it supports numerous environments:

-
    -
  • Browsers (IndexedDB): For web and PWA projects.
  • -
  • Node.js: Ideal for server-side rendering or background services.
  • -
  • React Native: Leverage SQLite or other adapters for mobile app development.
  • -
  • Electron: Create offline-capable desktop apps with a unified codebase.
  • -
-

This versatility empowers teams to reuse application logic across multiple platforms while maintaining a consistent data model.

-

Performance Optimization

-

With lazy loading of data and the ability to utilize efficient storage engines, RxDB delivers high-speed operations and quick response times. By minimizing disk I/O and leveraging indexes effectively, RxDB ensures that even large-scale applications remain performant. Its reactive nature also helps avoid unnecessary re-renders, improving the end-user experience.

-

Proven Reliability

-

RxDB is battle-tested in production environments, handling use cases from small single-user applications to large-scale enterprise solutions. Its robust replication mechanism resolves conflicts, manages concurrent writes, and ensures data integrity. The active open-source community provides ongoing support, documentation updates, and feature improvements.

-

Developer-Friendly Features

-

For developers, RxDB offers:

-
    -
  • Straightforward APIs: Built on top of familiar JavaScript paradigms like promises and observables.
  • -
  • Excellent Documentation: Detailed guides, tutorials, and references for every major feature.
  • -
  • Rich Community Support: Benefit from an active ecosystem of contributors creating plugins, answering questions, and maintaining core libraries.
  • -
-

These qualities streamline development, making RxDB an appealing choice for teams of all sizes.

-
-

Follow Up

-

Ready to get started? Here are some next steps:

- -

Ultimately, RxDB is more than just a database - it's a robust, reactive toolkit that empowers you to build fast, resilient, and user-centric applications. Whether you're creating an offline-first note-taking app or a real-time collaborative platform, RxDB can handle your local storage needs with ease and flexibility.

- - \ No newline at end of file diff --git a/docs/articles/local-database.md b/docs/articles/local-database.md deleted file mode 100644 index a9c544cbabd..00000000000 --- a/docs/articles/local-database.md +++ /dev/null @@ -1,121 +0,0 @@ -# What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications - -> An in-depth exploration of local databases and why RxDB excels as a local-first solution for JavaScript applications. - -# What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications - -A **local database** is a data storage system residing on a user's device, allowing applications to store, query, and manipulate information without needing continuous network access. This approach prioritizes quick data retrieval, efficient updates, and the ability to function in [offline-first](../offline-first.md) scenarios. In contrast, server-based databases require an active internet connection for each request and response cycle, making them more vulnerable to latency, network disruptions, and downtime. - -Local databases often leverage technologies such as **IndexedDB**, **SQLite**, or **WebSQL** (though WebSQL has been deprecated). These technologies manage both structured data (like relational tables) and unstructured data (such as JSON documents). When connectivity is restored, local databases typically sync their changes back to a central server-side database, maintaining consistent and up-to-date records across multiple devices. - -### Use Cases of Local Databases - -Local databases are particularly beneficial for: - -- **Offline Functionality**: Essential for apps that must remain usable without a consistent internet connection, such as note-taking apps or offline-first CRMs. Users can continue adding and editing data, then sync changes once they reconnect. -- **Low Latency**: By reducing round-trips to remote servers, local databases enable real-time responsiveness. This feature is critical for interactive applications such as gaming platforms, data dashboards, or analytics tools that need near-instant feedback. -- **Data Synchronization**: Many modern applications - like chat systems or collaborative editing tools - require continuous data exchange between multiple users or devices. Local databases can handle intermittent connectivity gracefully, queuing updates locally and syncing them when possible. - -In addition, local databases are increasingly integral to **Progressive Web Apps (PWAs)**, offering a native app-like user experience that is fast and available, even when offline. - -### Performance Optimization - -The primary performance benefit of a local database is its proximity to the application: queries and updates happen directly on the user's device, eliminating the overhead of multiple network hops. Common optimizations include: - -- **Caching**: Storing frequently accessed data in memory or on disk to minimize expensive operations. -- **Batching Writes**: Grouping database operations into a single write transaction to reduce overhead and lock contention. -- **Efficient Indexing**: Using appropriate indexes to speed up queries, especially important for applications that handle large data sets or frequent lookups. - -These techniques ensure that local databases run smoothly, even on lower-powered or [mobile devices](./mobile-database.md). - - - -### Security and Encryption - -Storing data on user devices introduces unique security considerations, such as the risk of physical theft or unauthorized access. Consequently, many local databases support **encryption** options to safeguard sensitive information. Developers can implement additional security measures like **device-level encryption**, **secure storage plugins**, and user authentication to further protect data from prying eyes. - ---- - -
- - - -
- -## Why RxDB is Optimized for JavaScript Applications - -RxDB (Reactive Database) is an offline-first, NoSQL database designed to meet the needs of modern JavaScript applications. Built with a focus on reactivity and real-time data handling, RxDB excels in scenarios where low-latency, offline availability, and scalability are essential. - -### Real-Time Reactivity - -At the core of RxDB is **reactive programming**, allowing you to subscribe to changes in your data collections and receive immediate UI updates when records change - no manual polling or refetching required. For instance, a chat application can display incoming messages as soon as they arrive, maintaining a smooth and responsive experience. - - - -### Offline-First Support - -RxDB's primary design goal is to work seamlessly in offline environments. Even if your device loses internet connectivity, RxDB enables you to continue reading and writing data. Once the connection is restored, all pending changes are automatically synchronized with your backend. This [offline-first approach](../offline-first.md) is ideal for productivity apps, field service tools, and other scenarios where reliability and user autonomy are paramount. - -### Flexible Data Replication - -A standout feature of RxDB is its [bi-directional replication](../replication.md). It supports synchronization with a variety of backends, such as: - -- [CouchDB](../replication-couchdb.md): Via the CouchDB replication, facilitating easy integration with any Couch-compatible server. -- [GraphQL Endpoints](../replication-graphql.md): Through community plugins, developers can replicate JSON documents to and from GraphQL servers. -- [Custom Backends](../replication-http.md): RxDB provides hooks to build custom replication strategies for proprietary or specialized server APIs. - -This flexibility ensures that RxDB fits into diverse architectures without locking you into a single vendor or technology stack. - -### Schema Validation and Versioning - -Rather than relying on implicit data models, RxDB leverages **JSON schema** to define document structures. This approach promotes data consistency by enforcing constraints such as required fields and acceptable data formats. As your application grows and changes, RxDB's built-in **schema versioning** and migration tools help you evolve your database schema safely, minimizing risks of data corruption or loss. - -### Rich Plugin Ecosystem - -One of RxDB's greatest strengths is its **pluggable architecture**, allowing you to add functionality as needed: - -- [Encryption](../encryption.md): Secure your data at rest using advanced encryption plugins. -- [Full-Text Search](../fulltext-search.md): Integrate powerful text search capabilities for applications that require quick and flexible query options. -- [Storage Adapters](../rx-storage.md): Swap out the underlying storage layer (e.g., [IndexedDB in the browser](../rx-storage-indexeddb.md), [SQLite](../rx-storage-sqlite.md) in [React Native](../react-native-database.md), or a custom engine) without rewriting your application logic. - -You can fine-tune RxDB to your exact needs, avoiding the performance overhead of unnecessary features. - -### Multi-Platform Compatibility - -RxDB is a perfect fit for cross-platform development, as it supports numerous environments: - -- **Browsers (IndexedDB)**: For web and PWA projects. -- **Node.js**: Ideal for server-side rendering or background services. -- **React Native**: Leverage SQLite or other adapters for mobile app development. -- [Electron](../electron-database.md): Create offline-capable desktop apps with a unified codebase. - -This versatility empowers teams to reuse application logic across multiple platforms while maintaining a consistent data model. - -### Performance Optimization - -With **lazy loading** of data and the ability to utilize efficient storage engines, RxDB delivers high-speed operations and quick response times. By minimizing disk I/O and leveraging indexes effectively, RxDB ensures that even large-scale applications remain performant. Its reactive nature also helps avoid unnecessary re-renders, improving the end-user experience. - -### Proven Reliability - -RxDB is battle-tested in production environments, handling use cases from small single-user applications to large-scale enterprise solutions. Its robust replication mechanism resolves conflicts, manages concurrent writes, and ensures data integrity. The active open-source community provides ongoing support, documentation updates, and feature improvements. - -### Developer-Friendly Features - -For developers, RxDB offers: - -- **Straightforward APIs**: Built on top of familiar JavaScript paradigms like promises and observables. -- **Excellent Documentation**: Detailed guides, tutorials, and references for every major feature. -- **Rich Community Support**: Benefit from an active ecosystem of contributors creating plugins, answering questions, and maintaining core libraries. - -These qualities streamline development, making RxDB an appealing choice for teams of all sizes. - ---- - -## Follow Up - -Ready to get started? Here are some next steps: - -- Try the [Quickstart Tutorial](../quickstart.md) and build a basic project to see RxDB in action. -- Compare RxDB with [other local database solutions](../alternatives.md) to determine the best fit for your unique requirements. - -Ultimately, **RxDB** is more than just a database - it's a robust, reactive toolkit that empowers you to build fast, resilient, and user-centric applications. Whether you're creating an offline-first note-taking app or a real-time collaborative platform, RxDB can handle your local storage needs with ease and flexibility. diff --git a/docs/articles/local-first-future.html b/docs/articles/local-first-future.html deleted file mode 100644 index 85f67613d88..00000000000 --- a/docs/articles/local-first-future.html +++ /dev/null @@ -1,265 +0,0 @@ - - - - - -Why Local-First Software Is the Future and its Limitations | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Why Local-First Software Is the Future and what are its Limitations

-

Imagine a web app that behaves seamlessly even with zero internet access, provides sub-millisecond response times, and keeps most of the user's data on their device. This is the local-first or offline-first approach. Although it has been around for a while, local-first has recently become more practical because of maturing browser storage APIs and new frameworks that simplify data synchronization. By allowing data to live on the client and only syncing with a server or other peers when needed, local-first apps can deliver a user experience that is fast, resilient, and privacy-friendly.

-

However, local-first is no silver bullet. It introduces tricky distributed-data challenges like conflict resolution and schema migrations on client devices. In this article, we'll dive deep into what local-first means, why it's trending, its pros and cons, and how to implement it in real applications. We'll also discuss other tools, criticisms, backend considerations, and how local-first compares to traditional cloud-centric approaches.

-

What is the Local-First Paradigm

-

In local-first software, the primary copy of your data lives on the client rather than a remote server. Rather than sending each read or write over the network, you store and manipulate data in a local database on the user’s device. Sync then happens in the background, ensuring all devices eventually converge to a consistent state.

-

This approach is increasingly popular because it leads to instant app responses (no network delay for most operations), genuine offline capability, and more direct data ownership for users. Local-first apps also sidestep outages and if the server or internet goes down, users can keep working with their local data. When connectivity returns, everything syncs. This makes the user experience more resilient and gives them control of their data, which is especially appealing when privacy concerns or limited connectivity are key factors.

-

Local-First software: A set of principles for software that enables both collaboration and ownership for users. Local-first ideals include the ability to work offline and collaborate across multiple devices, while also improving the security, privacy, long-term preservation, and user control of data.

Ink&Switch, 2019

-

Why Local-First is Gaining Traction

-

The push for local-first is driven by a few key new technological capabilities that previously restricted client devices from running heavy local-first computing:

-
    -
  • -

    Relaxed Browser Storage Limits: In the past, true local-first web apps were not very feasible due to storage limitations in browsers. Early web storage options like cookies or localStorage had tiny limits (~5-10MB) and were unsuitable for complex data. Even IndexedDB, the structured client storage introduced over a decade ago, had restrictive quotas on many browsers: For example, older Firefox versions would prompt the user if more than 50MB was being stored. Mobile browsers often capped IndexedDB to 5MB without user permission. Such limits made it impractical to cache large application datasets on the client. However, modern browsers have dramatically increased these limits. Today, IndexedDB can typically store hundreds of megabytes to multiple gigabytes of data, depending on device capacity. Chrome allows up to ~80% of free disk space per origin (tens of GB on a desktop), Firefox now supports on the order of gigabytes per site (10% of disk size), and even Safari (historically strict) permits around 1GB per origin on iOS. In short, the storage quotas of 5-50MB are a thing of the past and modern web apps can cache very large datasets locally without hitting a ceiling. This shift in storage capabilities has unlocked new possibilities for local-first web apps that simply weren't viable a few years ago.

    -
  • -
  • -

    New Storage APIs (OPFS): The new Browser API Origin Private File System (OPFS), part of the File System Access API, enables near-native file I/O from within a browser. It allows web apps to manage file handles securely and perform fast, synchronous reads/writes in Web Workers. This is a huge deal for local-first computing because it makes it feasible to embed robust database engines directly in the browser, persisting data to real files on a virtual filesystem. With OPFS, you can avoid some of the performance overhead that comes with IndexedDB-based workarounds, providing a near-native speed experience for file-structured data.

    -
  • -
-
latency london san franzisco
    -
  • Bandwidth Has Grown, But Latency Is Capped: Internet infrastructure has rapidly expanded to provide higher throughput making it possible to transfer large amounts of data more quickly. However, latency (i.e., round-trip delay) is constrained by the speed of light and other physical limitations in fiber, satellite links, and routing. We can always build out bigger "pipes" to stream or send bulk data, but we can't significantly reduce the base round-trip time for each request. This is a physical limit, not a technological one. Local-first strategies mitigate this fundamental latency limit by avoiding excessive client-server calls in interactive workflows, once data is on the client, it's instantly available for reads and writes without waiting on a network round-trip. Imagine, transferring around 100,000 "average" JSON documents might only consume about the same bandwidth as two frames of a 4K YouTube video which can be transferred in milliseconds. This shows just how far raw data throughput has come. Yet each request still has a 100-200ms latency or more, which becomes noticeable in user interactions. Local-first mitigates this by minimizing round-trip calls during active use and using the available bandwidth to directly transfer most of the data on the first app start.
  • -
-
    -
  • -

    WebAssembly: Another advancement is WebAssembly (WASM), which allows developers to compile low-level languages (C, C++, Rust) for execution in the browser at near-native speed. This means database engines, search algorithms, vector databases, and other performance-heavy tasks can run right on the client. However, a key limitation is that WASM cannot directly access persistent storage APIs in the browser. Instead, all data must be send from WASM to JavaScript (or the main thread) and then go through something like IndexedDB or OPFS. This extra indirection is slower compared to plain JavaScript->storage calls. Looking ahead, there might come up future APIs that allow WASM to interface with persistent storage directly, and if those land, local-first systems could see another major boost in performance.

    -
  • -
  • -

    Improvements in Local-First Tooling: A major factor fueling the rise of local-first architectures is the dramatic leap in client-side tooling and performance. For instance, consider a local-first email client that stores one million messages. In 2014, searching through that many documents, especially with something like early PouchDB, could take minutes in a browser. Today, with advanced offline databases like RxDB, you can use the OPFS storage with sharding across multiple web workers (one per CPU) and use memory-mapped techniques. The result is a regex search of one million of these email documents in around 120 milliseconds - all in JavaScript, running inside a standard web browser, on a mobile phone.

    -

    Better yet, this performance ceiling is likely to keep rising. Newer browser features and WebAssembly optimizations could enable even faster indexing and query operations, closing the gap with native desktop clients. I even experimented with GPU-accelarated queries (using WebGPU) which, while still in experimental stage, might deliver client-side performance that outperforms servers which do not have a graphics card. -These transformations highlight why local-first has become truly practical: not only can you sync and work offline, but you can handle serious data loads with performance that would have been unthinkable just a few years ago.

    -
  • -
-

What you can expect from a Local First App

-

Jevons' Paradox says that making a resource cheaper or more efficient to use often leads to greater overall consumption. Originally about coal, it applies to the local-first paradigm in a way where we require apps to have more features, simply because it is technically possible, the app users and developers start to expect them:

-

User Experience Benefits

-
loading spinner not needed
    -
  • Performance & UX: Running from local storage means low latency and instantaneous interactions. There's no round-trip delay for most operations. Local-first apps aim to provide near-zero latency responses by querying a local database instead of waiting for a server response​. This results in a snappy UX (often no need for loading spinners) because data reads/writes happen immediately on-device. Modern users expect real-time feedback, and local-first delivers that by default.
  • -
-
    -
  • User Control & Privacy: Storing data locally can limit how much sensitive information is sent off to remote servers. End users have greater control over their data, and the app can implement client-side encryption, thereby reducing the risk of mass data breaches. Its even possible to only replicated encrypted data with a server so that the backend does not know about the data at all and just acts as a backup/replication endpoint.
  • -
-
offline ready
    -
  • Offline Resilience: Obviously, being able to work offline is a major benefit. Users can continue using the app with no internet (or flaky connectivity), and their changes sync up once online. This is increasingly important not just for remote areas, but for any app that needs to be available 24/7. Even though mobile networks have improved, connectivity can still drop; local-first ensures the app doesn't grind to a halt. The app "stores data locally at the client so that it can still access it when the internet goes away."
  • -
-
    -
  • -

    Realtime Apps: Today's users expect data to stay in sync across browser tabs and devices without constant page reloads. In a typical cloud app, if you want real-time updates (say to show that a friend edited a document), you'd need to implement a websocket or polling system for the server to push changes to clients, which is complex. Local-first architectures naturally lend themselves to realtime-by-default updates because the application state lives in a local database that can be observed for changes. Any edits (local or incoming from the server) immediately trigger UI updates. Similarly, background sync mechanisms ensure that new server-side data flows into the local store and into the user interface right away, no need to hit F5 to fetch the latest changes like on a traditional webpage.

    -

    realtime ui updates

    -
  • -
-

Developer Experience Benefits

-
    -
  • -

    Reduced Server Load: Because local-first architectures typically transfer large chunks of data once (e.g., during an initial sync) and then sync only small diffs (delta changes) afterward, the server does not have to handle repeated requests for the same dataset. This bulk-first, diff-later approach drastically decreases the total number of round-trip requests to the backend. In scenarios where hundreds of simultaneous users each require continuous data access, an offline-ready client that only periodically sends or receives changes can scale more efficiently, freeing your servers to handle more users or other tasks. Instead of being bombarded with frequent small queries and updates, the server focuses on periodic sync operations, which can be more easily optimized or batched. It Scales with Data, Not Load. In fact for most type of apps, most of the data itself rarely changes. Imagine a CRM system, how often does the data of a customer really change compared to how of a user open the customer-overview page which would load data from a server in traditional systems?

    -
  • -
  • -

    Less Need for Custom API Endpoints: A local-first architecture often simplifies backend design. Instead of writing extensive REST routes for each client operation (create, read, update, delete, etc.), you can build a single replication endpoint or a small set of endpoints to handle data synchronization for each entity. The client manages local data, merges edits, and pushes/pulls changes with the server automatically. This not only reduces boilerplate code on the backend but also frees developers to focus on business logic and domain-specific concerns rather than spending time creating and maintaining dozens of narrowly scoped endpoints. As a result, the overall system can be easier to scale and maintain, delivering a smoother developer experience.

    -
  • -
  • -

    Simplified State Management in Frontend: Because the local database holds the authoritative state, you might rely less on complex state management libraries (Redux, MobX, etc.). The DB becomes a single source of truth for your UI. In an offline-first app, your global state is already there in a single place stored inside of the local database, so you don't need as many in-memory state layers to synchronize​. The UI can directly bind to the database (using queries or reactive subscriptions). All sources of changes (user input, remote updates, other tabs) funnel through the database. This can significantly reduce the "glue code" to keep UI state in sync with server state because the local DB does that for you. With Local-First tools, "you might not need Redux" because the reactive DB fulfills that role​ of state management already.

    -
  • -
  • -

    Observable Queries: One of the big advantages of storing data locally is the ability to subscribe to data changes in real time, often called observable queries. When the data changes - either from the user's actions or from a remote sync - the local database automatically updates the subscribed query results, and the UI can redraw without a manual refresh. This reactive pattern can make apps feel much more live and responsive.

    -

    In the beginnings this was mostly done by watching a changes feed (like in PouchDB) and re-running queries whenever data changed. However, this early approach was slow and didn't scale well, because the entire query had to be recalculated each time. Later, RxDB introduced the EventReduce Algorithm, which merges incoming document changes into an existing query result by using a big binary decision tree. With this, updated query results can be "calculated" on the CPU instead of re-running them over the database. This makes query updates almost instantaneous and scales better as your data grows. Nowadays, many local databases have added similar features: for example, dexie.js introduced liveQuery, letting developers build real-time UIs without repeatedly scanning the entire dataset.

    -
  • -
  • -

    Better Multi-Tab and Multi-Device Consistency: Because the source of truth is on the client, if the user has the app open in multiple tabs or even multiple devices, each has a full copy of the data. In browsers, many offline databases use a storage like IndexedDB that is shared across tabs of the same origin. This means all tabs see the same up-to-date local state. For example, if a user logs in or adds data in one tab, the other tab can automatically reflect that change via the shared local DB and events​. This solves a common issue in web apps where one tab doesn't know that something changed in another tab. With local-first, multi-tab just works by default because there's "exactly one state of the data across all tabs". Similarly, on multiple devices, once sync runs, each device eventually converges to the same state.

    -
    -

    If your users have to press F5 all the time, your app is broken!

    -
    -
  • -
  • -

    Potential for P2P and Decentralization: While most current local-first apps still use a central backend for syncing, the paradigm opens the door to peer-to-peer data syncing. Because each device has the full data, devices could sync directly via LAN or other P2P channels for collaboration, reducing reliance on central servers. There are experimental frameworks that allow truly decentralized sync. This is a more advanced benefit, but it aligns with the ethos of giving users more control and reducing dependence on any one cloud provider.

    -
  • -
-

These advantages show why developers are excited about local-first. You get happier users thanks to a fast, offline-capable app, and you can differentiate your product by working in scenarios where others fail (e.g. poor connectivity). Companies like Google, Amazon, etc., invest heavily in reducing latency and adding offline modes for a reason: it improves retention and usability. Local-first design takes that to the extreme by default.

-

Challenges and Limitations of Local-First

-

However, this approach is not without significant challenges. It's important to understand the drawbacks and trade-offs before deciding to go all-in on local-first. Let's examine the flip side.

-

You fully understood a technology when you know when not to use it

Daniel, 2024

-

Critics of local-first approaches often point out these challenges. Here's a comprehensive list of cons, criticisms, and obstacles associated with local-first development and proposed solutions on how to solve these obstacles:

-
    -
  • Data Synchronization: Data synchronization is arguably the hardest part of local-first development, because when every user's device can be offline for extended periods, data inevitably diverges. Ensuring those changes propagate and reconcile with minimal user headaches is a major challenge in distributed systems. Two main approaches have emerged: -
      -
    • -

      Use a bundled frontend+backend solution where the backend is tightly coupled to the client SDK and knows exactly how to handle sync. A common example is Firestore (part of the Firebase ecosystem) where Google's servers and client libraries collectively manage storage, change detection, conflict resolution, and syncing. The upside is you have a turnkey solution, developers can focus on features rather than writing sync logic. The downside is lock-in, because the sync protocol is proprietary and tailored to that vendor. In many organizations, this is a non-starter: existing company infrastructure can't be uprooted or replaced just for a single offline-capable app. This lock-in issue can arise even if the backend is not strictly a third-party vendor but simply another technology like PostgreSQL, because it still forces you to consolidate all your data into a single system that you might not use otherwise.

      -
    • -
    • -

      Custom Replication with Your Own Endpoints: Alternatively, tools like RxDB allow you to implement your own replication endpoints on top of your existing infrastructure. This is the approach relies on a lightweight, git-like Sync Engine. The server remains relatively "dumb," focusing on storing revisions, tracking changes, and marking conflicts, while the client library does the actual conflict resolution. During sync, if the server detects a conflict (e.g., two offline edits to the same document), it notifies the client, which then decides how to merge them, whether via last-write-wins, a custom merge function, or a CRDT. Setting up custom endpoints does require more development effort, but you avoid vendor lock-in and can integrate seamlessly with your existing database(s). Your system simply needs to support incrementally fetching changes (pull) and accepting local modifications (push), which can be layered on top of nearly any data store or architecture.

      -

      Tools which support "any backend" are of course harder to monetize because they cannot sell SaaS services or a Cloud Subscription which is why most tools use a fixed backend instead of an open Sync Engine.

      -
    • -
    -
  • -
-
Conflict Handling
    -
  • -

    Conflict Resolution: When multiple offline edits happen on the same data, you inevitably get merge conflicts. For example, if two users (or the same user on two devices) both edit the same document offline, when both sync, whose changes win? Local-first systems need a conflict resolution strategy. Some systems use last-write-wins (firestore) or deterministic revision hashing to pick a "winner" (as in CouchDB/PouchDB)​. This is simple but may drop one user's changes. Other approaches keep both versions and merge them either via an implement "merge-function" or require a manual merge step (e.g., like git conflicts or showing the user a diff UI). More advanced solutions involve CRDTs (Conflict-free Replicated Data Types) which mathematically merge changes (used for rich text collaboration, for instance). Libraries like Automerge or Yjs implement CRDTs to "magically solve conflicts". But in practice, using CRDTs is also complex and has its own trade-offs and sometimes not even possible like when you need additional data from another instance for a "correct" merge. No matter which route, handling conflicts adds complexity to your app logic or infrastructure. In cloud-based (online-first) apps, you avoid this because everyone is always editing the single up-to-date copy on the server. Local-first shifts that burden to the client side.

    -

    Here is an example on how a client-side merge functions works in RxDB:

    -
    import { deepEqual } from 'rxdb/plugins/utils';
    -export const myConflictHandler = {
    -    /**
    -     * isEqual() is used to detect if two documents are
    -     * equal. This is used internally to detect conflicts.
    -     */
    -    isEqual(a, b) {
    -        /**
    -         * isEqual() is used to detect conflicts or to detect if a
    -         * document has to be pushed to the remote.
    -         * If the documents are deep equal,
    -         * we have no conflict.
    -         * Because deepEqual is CPU expensive,
    -         * on your custom conflict handler you might only
    -         * check some properties, like the updatedAt time or revision-strings
    -         * for better performance.
    -         */
    -        return deepEqual(a, b);
    -    },
    -    /**
    -     * resolve() a conflict. This can be async so
    -     * you could even show an UI element to let your user
    -     * resolve the conflict manually.
    -     */
    -    async resolve(i) {
    -        /**
    -         * In this example we drop the local state and use the server-state.
    -         * This basically implements a "first-on-server-wins" strategy.
    -         * 
    -         * In your custom conflict handler you could want to merge properties
    -         * of the i.realMasterState, i.assumedMasterState and i.newDocumentState
    -         * or return i.newDocumentState to have a "last-write-wins" strategy.
    -         */
    -        return i.realMasterState;
    -    }
    -};
    -
  • -
-
    -
  • -

    Eventual Consistency (No Single Source of Truth): A local-first system is eventually consistent by nature. There is no single authoritative copy of the data at all times. Instead you have one per device (and maybe one on the server), and they sync to become consistent eventually. This means at any given moment, two users might not see the same data if one hasn't synced recently. Users could even make decisions based on stale data. In many applications this is acceptable (the data will catch up), but for some scenarios it's problematic. For instance, an offline-first banking app that lets you initiate a money transfer offline could be dangerous if the account balance was out-of-date or if the transfer needs immediate consistency. Essentially, not all apps can tolerate eventual consistency. If your use case demands strong consistency (e.g., inventory systems where overselling is a big issue, or real-time collaborative editing where every keystroke must be seen by others instantly), a purely local-first approach might need augmentation or may not fit.

    -
  • -
  • -

    Initial Data Load and Data Size Limits: Local-first requires pulling data down to the client. If your dataset is huge (gigabytes), it's simply not feasible to download everything to every client. For example, syncing every tweet on Twitter to every user's phone is impossible. Local-first works best when the data set per user is reasonably sized (up to 2 Gigabytes). In practice, you often limit the data to just that user's own data or a subset relevant to them. Even then, on first use the app might need to download a significant chunk of data to initialize the local database. There is a upper bound on dataset size beyond which the initial sync or storage needs become impractical. You cannot assume unlimited local storage. If your data is too large, local-first will either fail or you'll need to only sync partial data (and then handle what happens if the needed data isn't present locally). In short, local-first is unsuitable for massive datasets or data that cannot be partitioned per user.

    -
  • -
-
safari database
    -
  • Storage Persistence (Browser Limitations): Storing data in the browser (via IndexedDB or similar) is not as durable as on a server disk. Browsers may evict data to save space (especially on mobile devices). For instance, Safari notoriously wipes out IndexedDB data if the user hasn't used the site in ~7 days. Other browsers have their own eviction policies for offline data. Also, users can at any time clear their browser storage (intentionally or via something like "Clear site data"). This means the local data cannot be 100% trusted to stay forever. A well-behaved local-first app needs to be able to recover if local data is lost, usually by pulling from the server again​. Essentially, the server still often serves as a backup. But if your app had any purely local data (not intended to sync), that's at risk. Mobile apps (with SQLite or filesystem storage) are a bit more stable than web browsers, but even there, uninstalls or certain OS actions can remove local data. This is a challenge: How to cache data offline for speed while ensuring if it's wiped, the user doesn't lose everything important. Cloud-only apps by contrast keep data in the cloud so it's typically safe unless the server fails (and servers are easier to backup reliably).
  • -
-
    -
  • -

    Complex Client-Side Logic & Increased App Size: A local-first app tends to be more complex on the client side. You're essentially putting what used to be server responsibilities (storage, query engine, sync logic) into the frontend. This can increase the size of your frontend bundle (including a database library, possibly CRDT or sync code, etc.). It also increases memory and CPU usage on the client, as the browser/phone is doing more work. Low-end devices or older phones might struggle if the app is not optimized. Developers need to consider performance tuning for the local database (indexing, query efficiency) just like they would on a server. So while the user gains benefits, the app developer has to manage this complexity.

    -
  • -
  • -

    Performance Constraints in JavaScript: Even though devices are fast, a local JS database is generally slower than a server DB on robust hardware. There are many layers (JS -> IndexedDB -> possibly SQLite under the hood) that add overhead​. For example, inserting a record might go through the DB library, the storage engine, the browser's implementation, down to disk. For most UI uses this is fine (you don't need 10k writes/sec in a to-do app, you need maybe a few writes per second at most). But if your app does heavy data processing, the browser might become a bottleneck.

    -

    The key question is "Is it fast enough?". Often the answer is yes for typical usage, but developers must be mindful of not doing something on the client that truly requires big iron servers. For instance, full-text indexing of a million documents might be too slow in a client-side DB. Unpredictable performance is also a factor: Different users have different devices. A query that takes 50ms on a high-end desktop might take 500ms on a low-end phone in battery saving mode. So performance tuning and testing across devices is needed, and some heavy tasks might still belong on the server side​. For example if you build a local vector database you might want to create the embeddings on the server and sync them instead of creating them on the client.

    -
  • -
  • -

    Client Database Migrations: As your app evolves, you'll change data models or add new fields. In a cloud-first app, you'd typically run a migration on the server database. In a local-first app, you have not only the server DB (if any) but also every client's local database to consider. Upgrading the schema means you need to write migration logic that runs on each client, perhaps the next time they launch the app after an update. Clients may be offline or not upgrade the app immediately, so you could have different versions of the schema in the wild. This complicates data handling (the sync protocol might need to handle multiple schema versions until everyone is updated). Providing a smooth migration path for local data is doable (many libraries provide migration facilities), but it requires careful testing. In a worst case, a failed migration on a client could brick the app for that user or force a full resync. This is a much bigger headache than just migrating a centralized DB at midnight while your service is in maintenance mode. 🌃

    -
  • -
  • -

    Security and Access Control: In cloud-based apps, enforcing data security (who can see what) is done on the server. The client only gets the data it's authorized to get. In a local-first scenario, you often need to partition data per user on the backend as well, to ensure users only sync down their own data (or data they have permission for). One simple strategy is to give each user their own database or dataset on the server and only replicate that. For example, CouchDB allows creating one database per user and replication can be scoped to that DB which makes permission handling easy. But if you ever need to query across users (say an admin view or aggregate analytics), having data split into many small DBs becomes a pain. The alternative is a single backend database with a fine-grained access control, and the client asks to sync only certain documents/fields. That usually means writing a custom sync server or using something like GraphQL with resolvers that respect permissions. In short, implementing auth and permissions in sync adds complexity. Also, any data stored on the client is theoretically vulnerable to extraction (if someone compromises the device or uses dev tools). You can encrypt local databases to prevent extraction after the server "revokes" the decryption password to mitigate the data extraction risk.

    -
  • -
-
NoSQL Document
    -
  • -

    Relational Data and Complex Queries: Most client-side/offline databases are NoSQL/document oriented for flexibility in syncing and easy conflict handling. They may not support complex join queries or ACID transactions across multiple tables like a full SQL database would. This is partly because replicating a full relational model is much harder (maintaining referential integrity, etc., when data is partial on a client) or not even logically possible. For example if you have two offline clients running a complex UPDATE X WHERE Y FROM Z INNER JOIN Alice INNER JOIN Bob query and then they go online, you have no easy way of handling these conflicts.

    -

    If your app has heavy relational data requirements or relies on complex server-side queries (aggregations, multi-join reports), you might find the local database either cannot do it or is too slow to do it client-side. The lack of robust relational querying is something to plan for and you might need to adjust your data model to be more document-oriented or use client-side libraries to run joins in memory. Most tools use NoSQL because it makes replication easy and implementing true relational sync would require extremely sophisticated solutions and even needing an atomic clock for full consistency across nodes (like google spanner). So, if your app truly needs SQL power on the client, local-first might complicate things.

    -
    -

    In Local-First, most tools use NoSQL because it makes replication and conflict handling easy.

    -
    -
  • -
-

That's a long list of challenges! In summary, local-first approaches introduce distributed data issues on the client side that web developers usually didn't have to deal with. Despite these challenges, the local-first movement is steadily growing because the benefits to user experience and data control are very compelling and modern tools are emerging to mitigate a lot of these difficulties. All of these are solved or solvable for your specific use-case, just keep them in mind before you start architecting your local-first app.

-

Local-First vs. Traditional Online-First Approaches

-

So now that you know the pros and cons about Local-First. Lets directly compare it to your previous "online-first" stack:

-

Connectivity and Offline Usage

-
    -
  • Local-first: Apps like WhatsApp store messages locally on your device, letting you read past messages and even compose new ones without a stable network connection. Once online, the messages sync with the server and other participants.
  • -
  • Online-first: Purely cloud-based apps typically stop functioning (beyond simple caching) when the network or server goes down. They rely on a constant connection to fetch or store user data.
  • -
-

Latency and Performance

-
    -
  • Local-first: Because data operations happen on the device, you see near-instant interactions (e.g., typing and reading chats feels very responsive, as the messages are on your phone). Syncing occurs in the background without delaying the user.
  • -
  • Online-first: Most interactions involve a round-trip to the server, adding network latency and potentially requiring loading states or fallback UIs. If the network is slow or unreliable, users can experience delays when sending or receiving updates.
  • -
-

Complexity and Conflict Resolution

-
    -
  • Local-first: Much of the complexity like storing data or handling conflicts, shifts to the client. WhatsApp, for instance, caches all messages locally and queues unsent messages offline. Once reconnected, it must reconcile with the server and other devices, especially if the same account is used on multiple platforms.
  • -
  • Online-first: A single central server manages data and concurrency, so clients remain thinner. However, the app becomes unusable if connectivity is lost, and any server downtime directly impacts all users.
  • -
-

Data Ownership and Storage Limits

-
    -
  • Local-first: Users hold a complete copy of data on their own device, retaining control and quick access. This can raise challenges when data sets are very large; phone storage might be insufficient, or backups may be harder to guarantee.
  • -
  • Online-first: Storing all data in the cloud scales more easily, and providers often manage backups automatically. On the downside, users depend on the service and must trust it to protect their data.
  • -
-

When to Choose Which

-
    -
  • Local-first: Particularly helpful for scenarios where offline operation and immediate responsiveness matter, such as chat apps (like WhatsApp), field tools in low-connectivity environments, or any use case where users can't rely on being online 24/7.
  • -
  • Online-first: Well-suited for systems that demand real-time central control or massive data aggregation with minimal offline needs, such as large-scale analytics platforms or services where guaranteed immediate global consistency is essential.
  • -
  • Hybrid: In reality, most modern apps often blend these approaches, giving users partial offline capabilities (caching, queued updates) alongside a robust central service. This hybrid method offers the benefits of local speed and resilience, while still leveraging cloud infrastructure for collaboration and global reach. But a truth local-first app is way more than just a cache.
  • -
-
-

Offline-First vs. Local-First

-

In the early days of offline-capable web apps (around 2014), the common phrase was "Offline-First". Tools like PouchDB popularized the notion that developers should assume devices are often offline or have flaky connections, so apps must continue to work seamlessly without a network. The guiding principle was "apps should treat being online as optional." If a user has no internet access, the application's core features still function, saving or queuing data locally, and automatically synchronizing once connectivity is restored.

-
What is Offline First?
4:18
What is Offline First?
-
-

Over time, this focus on offline support evolved into the broader concept of "Local-First Software," (see Ink&Switch) emphasizing not just offline operation but also the technical underpinnings of storing data locally in the client application. While offline-first is primarily about resilience to network loss, local-first highlights ownership, privacy, and performance benefits of keeping the primary data on the user's device. Most tools these days extended the original offline-first concepts, adding real-time reactivity, custom sync, and more nuances like conflict resolution or encryption.

-
no map t ag

However, the term "local-first" can be confusing to non-technical audiences because many people (especially in the US) associate "local first" with community-oriented movements that encourage buying from nearby businesses or supporting local initiatives. To reduce ambiguity, it may be clearer to use "local first software" or "local first development" in your documentation and marketing materials. When creating branding or logos around local-first software, avoid using the "Google Maps Pin" as a symbol. This icon typically implies geolocation or physical locality further mixing up the notion of "location-based services" with "on-device data storage."

-

Do People Actually Use Local-First or Is It Just a Trend?

-

If we look at npm download statistics, we see that PouchDB - one of the oldest libraries for local-first apps - has about 53k downloads each week, and RxDB - a newer library - has about 22k weekly downloads. Other local-first tools often have even fewer downloads. In comparison, a popular library like react-query, which does not focus on local storage, is downloaded about 1.6 million times a week. These numbers show that local-first libraries, while used, are not as common as some of the more traditional tools.

-

One reason is that local-first is still a new idea. Many developers are used to traditional "online-first" approaches, so switching to a local database and then syncing changes later can feel unfamiliar. Developers must learn different patterns, deal with offline synchronization, and handle possible conflicts. That extra work can be a barrier to adoption which might change in the future as tooling improves.

-

While most of RxDB is open source, there are also premium plugins that help sustain RxDB as a long-term project. Because people purchase these plugins, we gains insights into how developers are using local-first features:

-
    -
  • About half of these users mainly want offline functionality for cases such as farming equipment, mining, construction, or even a shrimp farm app.
  • -
  • The other half focus on faster, real-time UIs for to-do or reading apps, a space launch planning tool, and various dashboard apps. This range of use cases highlights both the resilience offline mode can offer and the performance boost that local databases can provide when synced in the background.
  • -
-

Why Local-First Is the Future

-

Early in the history of the web, users expected static pages. If you wanted to see new content, you reloaded the page. That was normal at the time, and nobody found it strange because everything worked that way.

-

Then, as more sites added real-time features - auto-updating feeds, live notifications, single-page apps - suddenly those older "reload-only" sites began to feel slow or outdated. Why wait for a manual refresh when real-time data was possible and readily available?

-

The same pattern is happening with local-first apps. Right now, most sites are still built around network availability. We see loading spinners whenever data is fetched, and we simply wait for the server response. As local-first experiences become commonplace - removing spinners, letting users keep working when offline, and syncing in the background - everything else will start to feel frustratingly behind. Users won't tolerate slow or blocked interactions if they've seen apps that respond instantly and remain usable offline. They'll expect that as the default and we'll likely see growing pressure on developers to eliminate those extra loading steps. For many users, the experience of immediate local writes will become not just a perk, but an expectation!

-

See also

-
JavaScript Angular Database
-
-
-
- - \ No newline at end of file diff --git a/docs/articles/local-first-future.md b/docs/articles/local-first-future.md deleted file mode 100644 index bdc3caee01c..00000000000 --- a/docs/articles/local-first-future.md +++ /dev/null @@ -1,553 +0,0 @@ -# Why Local-First Software Is the Future and its Limitations - -> Discover how local-first transforms web apps, boosts offline resilience, and why instant user feedback is becoming the new normal. - -import {Tabs} from '@site/src/components/tabs'; -import {Steps} from '@site/src/components/steps'; -import {QuoteBlock} from '@site/src/components/quoteblock'; -import {VideoBox} from '@site/src/components/video-box'; - -# Why Local-First Software Is the Future and what are its Limitations - -Imagine a web app that behaves seamlessly even with zero internet access, provides sub-millisecond response times, and keeps most of the user's data on their device. This is the **local-first** or [offline-first](../offline-first.md) approach. Although it has been around for a while, local-first has recently become more practical because of **maturing browser storage APIs** and new frameworks that simplify **data synchronization**. By allowing data to live on the client and only syncing with a server or other peers when needed, local-first apps can deliver a user experience that is **fast, resilient**, and **privacy-friendly**. - -However, local-first is no silver bullet. It introduces tricky distributed-data challenges like conflict resolution and schema migrations on client devices. In this article, we'll dive deep into what local-first means, why it's trending, its pros and cons, and how to implement it in real applications. We'll also discuss other tools, criticisms, backend considerations, and how local-first compares to traditional cloud-centric approaches. - -## What is the Local-First Paradigm - -In **local-first** software, the primary copy of your data lives on the **client** rather than a remote server. Rather than sending each read or write over the network, you store and manipulate data in a [local database](./local-database.md) on the user’s device. Sync then happens in the background, ensuring all devices eventually converge to a consistent state. - -This approach is increasingly popular because it leads to **instant** app responses (no network delay for most operations), genuine **offline capability**, and more direct **data ownership** for users. Local-first apps also sidestep outages and if the server or internet goes down, users can keep working with their local data. When connectivity returns, everything syncs. This makes the user experience **more resilient** and gives them control of their data, which is especially appealing when privacy concerns or limited connectivity are key factors. - -Local-First software: A set of principles for software that enables both collaboration and ownership for users. Local-first ideals include the ability to work offline and collaborate across multiple devices, while also improving the security, privacy, long-term preservation, and user control of data. - -## Why Local-First is Gaining Traction - -The push for local-first is driven by a few key new technological capabilities that previously restricted client devices from running heavy local-first computing: - -- **Relaxed Browser Storage Limits**: In the past, true local-first web apps were not very feasible due to **storage limitations** in browsers. Early web storage options like cookies or [localStorage](./localstorage.md#understanding-the-limitations-of-local-storage) had tiny limits (~5-10MB) and were unsuitable for complex data. Even **IndexedDB**, the structured client storage introduced over a decade ago, had restrictive quotas on many browsers: For example, older Firefox versions would **prompt the user if more than 50MB** was being stored. Mobile browsers often capped IndexedDB to 5MB without user permission. Such limits made it impractical to cache large application datasets on the client. However, modern browsers have dramatically [increased these limits](./indexeddb-max-storage-limit.md). Today, IndexedDB can typically store **hundreds of megabytes to multiple gigabytes** of data, depending on device capacity. Chrome allows up to ~80% of free disk space per origin (tens of GB on a desktop), Firefox now supports on the order of gigabytes per site (10% of disk size), and even Safari (historically strict) permits around 1GB per origin on iOS. In short, the storage quotas of 5-50MB are a thing of the past and modern web apps can cache very large datasets locally without hitting a ceiling. This shift in storage capabilities has unlocked new possibilities for **local-first web apps** that simply weren't viable a few years ago. - -- **New Storage APIs (OPFS)**: The new Browser API [Origin Private File System](../rx-storage-opfs.md) (OPFS), part of the File System Access API, enables near-native file I/O from within a browser. It allows web apps to manage file handles securely and perform fast, synchronous reads/writes in Web Workers. This is a huge deal for local-first computing because it makes it feasible to embed robust database engines directly in the browser, persisting data to real files on a virtual filesystem. With OPFS, you can avoid some of the performance overhead that comes with [IndexedDB-based workarounds](../slow-indexeddb.md), providing a near-native [speed experience](./localstorage-indexeddb-cookies-opfs-sqlite-wasm.md#big-bulk-writes) for file-structured data. - - - - **Bandwidth Has Grown, But Latency Is Capped**: Internet infrastructure has rapidly expanded to provide higher throughput making it possible to transfer large amounts of data more quickly. However, latency (i.e., round-trip delay) is constrained by the **speed of light** and other physical limitations in fiber, satellite links, and routing. We can always build out bigger "pipes" to stream or send bulk data, but we can't significantly reduce the base round-trip time for each request. This is a physical limit, not a technological one. Local-first strategies mitigate this fundamental latency limit by avoiding excessive client-server calls in interactive workflows, once data is on the client, it's instantly available for reads and writes without waiting on a network round-trip. Imagine, transferring **around 100,000** "average" JSON documents might only consume **about the same bandwidth as two frames of a 4K YouTube video** which can be transferred in milliseconds. This shows just how far raw data throughput has come. Yet each request still has a 100-200ms latency or more, which becomes noticeable in user interactions. Local-first mitigates this by minimizing round-trip calls during active use and using the available bandwidth to directly transfer most of the data on the first app start. - -- **WebAssembly**: Another advancement is **WebAssembly (WASM)**, which allows developers to compile low-level languages (C, C++, Rust) for execution in the browser at near-native speed. This means database engines, search algorithms, [vector databases](./javascript-vector-database.md), and other performance-heavy tasks can run right on the client. However, a key limitation is that **WASM cannot directly access persistent storage APIs** in the browser. Instead, all data must be send from WASM to JavaScript (or the main thread) and then go through something like IndexedDB or OPFS. This extra indirection [is slower](./localstorage-indexeddb-cookies-opfs-sqlite-wasm.md) compared to plain JavaScript->storage calls. Looking ahead, there might come up future APIs that allow WASM to interface with persistent storage directly, and if those land, local-first systems could see another major boost in [performance](../rx-storage-performance.md). - -- **Improvements in Local-First Tooling**: A major factor fueling the rise of local-first architectures is the **dramatic leap in client-side tooling and performance**. For instance, consider a local-first **email client** that stores **one million messages**. In 2014, searching through that many documents, especially with something like early PouchDB, could take **minutes** in a browser. Today, with advanced offline databases like **RxDB**, you can use the [OPFS storage](../rx-storage-opfs.md) with [sharding](../rx-storage-sharding.md) across multiple [web workers](../rx-storage-worker.md) (one per CPU) and use [memory-mapped](../rx-storage-memory-mapped.md) techniques. The result is a **regex search** of one million of these email documents in around **120 milliseconds** - all in JavaScript, running inside a standard web browser, on a mobile phone. - - Better yet, this performance ceiling is likely to keep rising. Newer browser features and **WebAssembly** optimizations could enable even faster indexing and query operations, closing the gap with native desktop clients. I even experimented with GPU-accelarated queries (using **WebGPU**) which, while still in experimental stage, might deliver client-side performance that outperforms servers which do not have a graphics card. - These transformations highlight why local-first has become truly practical: not only can you sync and work offline, but you can handle **serious data loads** with performance that would have been unthinkable just a few years ago. - -## What you can expect from a Local First App - -[Jevons' Paradox](https://en.wikipedia.org/wiki/Jevons_paradox) says that making a _resource cheaper or more efficient to use often leads to greater overall consumption_. Originally about coal, it applies to the local-first paradigm in a way where we require apps to have more features, simply because it is technically possible, the app users and developers start to expect them: - -### User Experience Benefits - - -- **Performance & UX:** Running from local storage means **low latency** and instantaneous interactions. There's no round-trip delay for most operations. Local-first apps aim to provide [near-zero latency](./zero-latency-local-first.md) responses by querying a local database instead of waiting for a server response​. This results in a snappy UX (often no need for loading spinners) because data reads/writes happen immediately on-device. Modern users expect real-time feedback, and local-first delivers that by default. - -- **User Control & Privacy:** Storing data locally can limit how much sensitive information is sent off to remote servers. End users have greater control over their data, and the app can implement [client-side encryption](../encryption.md), thereby reducing the risk of mass data breaches. Its even possible to only replicated encrypted data with a server so that the backend does not know about the data at all and just acts as a backup/replication endpoint. - - - - **Offline Resilience:** Obviously, being able to work offline is a major benefit. Users can continue using the app with no internet (or flaky connectivity), and their changes sync up once online. This is increasingly important not just for remote areas, but for any app that needs to be available 24/7. Even though mobile networks have improved, connectivity can still drop; local-first ensures the app doesn't grind to a halt. The app _"stores data locally at the client so that it can still access it when the internet goes away."_ - -- **Realtime Apps**: Today's users expect data to stay in sync across browser tabs and devices without constant page reloads. In a typical cloud app, if you want real-time updates (say to show that a friend edited a document), you'd need to implement a [websocket or polling](./websockets-sse-polling-webrtc-webtransport.md) system for the server to push changes to clients, which is complex. Local-first architectures naturally lend themselves to realtime-by-default updates because the application state lives in a local database that can be observed for changes. Any edits (local or incoming from the server) immediately trigger [UI updates](./optimistic-ui.md). Similarly, background sync mechanisms ensure that new server-side data flows into the local store and into the user interface right away, no need to hit F5 to fetch the latest changes like on a traditional webpage. - - - - - -### Developer Experience Benefits - -- **Reduced Server Load**: Because local-first architectures typically **transfer large chunks of data once** (e.g., during an initial sync) and then sync only small diffs (delta changes) afterward, the server does not have to handle repeated requests for the same dataset. This bulk-first, diff-later approach drastically decreases the total number of round-trip requests to the backend. In scenarios where hundreds of simultaneous users each require continuous data access, an offline-ready client that only periodically sends or receives changes can scale more efficiently, freeing your servers to handle more users or other tasks. Instead of being bombarded with frequent small queries and updates, the server focuses on periodic sync operations, which can be more easily optimized or batched. It **Scales with Data, Not Load**. In fact for most type of apps, most of the data itself rarely changes. Imagine a CRM system, how often does the data of a customer really change compared to how of a user open the customer-overview page which would load data from a server in traditional systems? - -- **Less Need for Custom API Endpoints**: A local-first architecture often simplifies backend design. Instead of writing extensive REST routes for each client operation (create, read, update, delete, etc.), you can build a **single replication endpoint** or a small set of endpoints to handle data synchronization for each entity. The client manages local data, merges edits, and pushes/pulls changes with the server automatically. This not only **reduces boilerplate code** on the backend but also **frees developers** to focus on business logic and domain-specific concerns rather than spending time creating and maintaining dozens of narrowly scoped endpoints. As a result, the overall system can be easier to scale and maintain, delivering a **smoother developer experience**. - -- **Simplified State Management in Frontend**: Because the local database holds the authoritative state, you might rely less on complex state management libraries (Redux, MobX, etc.). The DB becomes a single source of truth for your UI. In an offline-first app, your global state is already there in a single place stored inside of the local database, so you don't need as many in-memory state layers to synchronize​. The UI can directly bind to the database (using queries or reactive subscriptions). All sources of changes (user input, remote updates, other tabs) funnel through the database. This can significantly reduce the "glue code" to keep UI state in sync with server state because the local DB does that for you. With Local-First tools, "you might not need Redux" because the reactive DB fulfills that role​ of state management already. - -- **Observable Queries**: One of the big advantages of storing data locally is the ability to **subscribe** to data changes in real time, often called **observable queries**. When the data changes - either from the user's actions or from a remote sync - the local database automatically updates the subscribed query results, and the UI can redraw without a manual refresh. This reactive pattern can make apps feel much more live and responsive. - - In the beginnings this was mostly done by watching a changes feed (like in PouchDB) and **re-running queries** whenever data changed. However, this early approach was **slow and didn't scale well**, because the entire query had to be recalculated each time. Later, RxDB introduced the [EventReduce Algorithm](https://github.com/pubkey/event-reduce), which merges incoming document changes into an existing query result by using a big [binary decision tree](https://github.com/pubkey/binary-decision-diagram). With this, updated query results can be "calculated" on the CPU instead of re-running them over the database. This makes query updates almost instantaneous and scales better as your data grows. Nowadays, many local databases have added similar features: for example, **dexie.js** introduced `liveQuery`, letting developers build real-time UIs without repeatedly scanning the entire dataset. - -- **Better Multi-Tab and Multi-Device Consistency**: Because the source of truth is on the client, if the user has the app open in multiple tabs or even multiple devices, each has a full copy of the data. In browsers, many offline databases use a storage like IndexedDB that is shared across tabs of the same origin. This means all tabs see the same up-to-date local state. For example, if a user logs in or adds data in one tab, the other tab can automatically reflect that change via the shared local DB and events​. This solves a common issue in web apps where one tab doesn't know that something changed in another tab. With local-first, **multi-tab just works** by default because there's "exactly one state of the data across all tabs". Similarly, on multiple devices, once sync runs, each device eventually converges to the same state. - - > If your users have to press F5 all the time, your app is broken! - -- **Potential for P2P and Decentralization**: While most current local-first apps still use a central backend for syncing, the paradigm opens the door to [peer-to-peer data syncing](../replication-webrtc.md). Because each device has the full data, devices could sync directly via LAN or other P2P channels for collaboration, reducing reliance on central servers. There are experimental frameworks that allow truly decentralized sync. This is a more advanced benefit, but it aligns with the ethos of giving users more control and reducing dependence on any one cloud provider. - -These advantages show why developers are excited about local-first. You get happier users thanks to a fast, offline-capable app, and you can differentiate your product by working in scenarios where others fail (e.g. poor connectivity). Companies like Google, Amazon, etc., invest heavily in reducing latency and adding offline modes for a reason: it improves retention and usability. Local-first design takes that to the extreme by default. - -## Challenges and Limitations of Local-First - -However, this approach is not without significant challenges. It's important to understand the drawbacks and trade-offs before deciding to go all-in on local-first. Let's examine the flip side. - -You fully understood a technology when you know when not to use it - -Critics of local-first approaches often point out these challenges. Here's a comprehensive list of cons, criticisms, and obstacles associated with local-first development and proposed solutions on how to solve these obstacles: - -- **Data Synchronization**: Data synchronization is arguably the hardest part of local-first development, because when every user's device can be offline for extended periods, data inevitably diverges. Ensuring those changes propagate and reconcile with minimal user headaches is a major challenge in distributed systems. Two main approaches have emerged: - - **Use a bundled frontend+backend solution** where the backend is tightly coupled to the client SDK and knows exactly how to handle sync. A common example is Firestore (part of the Firebase ecosystem) where Google's servers and client libraries collectively manage storage, change detection, conflict resolution, and syncing. The upside is you have a turnkey solution, developers can focus on features rather than writing sync logic. The downside is lock-in, because the sync protocol is proprietary and tailored to that vendor. In many organizations, this is a non-starter: existing company infrastructure can't be uprooted or replaced just for a single offline-capable app. This lock-in issue can arise even if the backend is not strictly a third-party vendor but simply another technology like PostgreSQL, because it still forces you to consolidate all your data into a single system that you might not use otherwise. - - - **Custom Replication with Your Own Endpoints**: Alternatively, tools like RxDB allow you to implement your own replication endpoints on top of your existing infrastructure. This is the approach relies on a lightweight, git-like [Sync Engine](../replication.md). The server remains relatively "dumb," focusing on storing revisions, tracking changes, and marking conflicts, while the client library does the actual [conflict resolution](../transactions-conflicts-revisions.md). During sync, if the server detects a conflict (e.g., two offline edits to the same document), it notifies the client, which then decides how to merge them, whether via last-write-wins, a custom merge function, or a [CRDT](../crdt.md). Setting up custom endpoints does require more development effort, but you avoid vendor lock-in and can integrate seamlessly with your existing database(s). Your system simply needs to support incrementally fetching changes (pull) and accepting local modifications (push), which can be layered on top of nearly any data store or architecture. - - Tools which support "any backend" are of course harder to monetize because they cannot sell SaaS services or a Cloud Subscription which is why most tools use a fixed backend instead of an open Sync Engine. - - -- **Conflict Resolution**: When multiple offline edits happen on the same data, you inevitably get **merge conflicts**. For example, if two users (or the same user on two devices) both edit the same document offline, when both sync, whose changes win? Local-first systems need a conflict resolution strategy. Some systems use **last-write-wins** (firestore) or deterministic revision hashing to pick a "winner" (as in CouchDB/PouchDB)​. This is simple but may drop one user's changes. Other approaches keep both versions and merge them either via an implement ["merge-function"](../transactions-conflicts-revisions.md#custom-conflict-handler) or require a **manual merge** step (e.g., like git conflicts or showing the user a diff UI). More advanced solutions involve **CRDTs (Conflict-free Replicated Data Types)** which mathematically merge changes (used for rich text collaboration, for instance). Libraries like Automerge or Yjs implement CRDTs to "magically solve conflicts". But in practice, using CRDTs is also complex and has its own trade-offs and sometimes not even possible like when you need additional data from another instance for a "correct" merge. No matter which route, handling conflicts adds complexity to your app logic or infrastructure. In cloud-based (online-first) apps, you avoid this because everyone is always editing the single up-to-date copy on the server. Local-first shifts that burden to the client side. - - Here is an example on how a client-side merge functions works in RxDB: - - ```ts - import { deepEqual } from 'rxdb/plugins/utils'; - export const myConflictHandler = { - /** - * isEqual() is used to detect if two documents are - * equal. This is used internally to detect conflicts. - */ - isEqual(a, b) { - /** - * isEqual() is used to detect conflicts or to detect if a - * document has to be pushed to the remote. - * If the documents are deep equal, - * we have no conflict. - * Because deepEqual is CPU expensive, - * on your custom conflict handler you might only - * check some properties, like the updatedAt time or revision-strings - * for better performance. - */ - return deepEqual(a, b); - }, - /** - * resolve() a conflict. This can be async so - * you could even show an UI element to let your user - * resolve the conflict manually. - */ - async resolve(i) { - /** - * In this example we drop the local state and use the server-state. - * This basically implements a "first-on-server-wins" strategy. - * - * In your custom conflict handler you could want to merge properties - * of the i.realMasterState, i.assumedMasterState and i.newDocumentState - * or return i.newDocumentState to have a "last-write-wins" strategy. - */ - return i.realMasterState; - } - }; - ``` - -- **Eventual Consistency (No Single Source of Truth):** A local-first system is **eventually consistent** by nature. There is no single authoritative copy of the data at all times. Instead you have one per device (and maybe one on the server), and they sync to become consistent eventually. This means at any given moment, two users might not see the same data if one hasn't synced recently. Users could even make decisions based on stale data. In many applications this is acceptable (the data will catch up), but for some scenarios it's problematic. For instance, an offline-first banking app that lets you initiate a money transfer offline could be dangerous if the account balance was out-of-date or if the transfer needs immediate consistency. Essentially, **not all apps can tolerate eventual consistency**. If your use case demands strong consistency (e.g., inventory systems where overselling is a big issue, or real-time collaborative editing where every keystroke must be seen by others instantly), a purely local-first approach might need augmentation or may not fit. - -- **Initial Data Load and Data Size Limits:** Local-first requires pulling data **down to the client**. If your dataset is huge (gigabytes), it's simply not feasible to download everything to every client. For example, syncing every tweet on Twitter to every user's phone is impossible. Local-first works best when the data set per user is reasonably sized (up to 2 Gigabytes). In practice, you often **limit the data** to just that user's own data or a subset relevant to them. Even then, on first use the app might need to download a significant chunk of data to initialize the local database. There is a **upper bound on dataset size** beyond which the initial sync or storage needs become impractical. You cannot assume unlimited local storage. If your data is too large, local-first will either fail or you'll need to only sync partial data (and then handle what happens if the needed data isn't present locally). In short, **local-first is unsuitable for massive datasets** or data that cannot be partitioned per user. - - -- **Storage Persistence (Browser Limitations):** Storing data in the browser (via IndexedDB or similar) is not as durable as on a server disk. Browsers may **evict data** to save space (especially on mobile devices). For instance, Safari notoriously wipes out IndexedDB data if the user hasn't used the site in ~7 days. Other browsers have their own eviction policies for offline data. Also, users can at any time clear their browser storage (intentionally or via something like "Clear site data"). This means the local data **cannot be 100% trusted to stay forever**. A well-behaved local-first app needs to be able to recover if local data is lost, usually by pulling from the server again​. Essentially, the server still often serves as a backup. But if your app had any purely local data (not intended to sync), that's at risk. **Mobile apps** (with SQLite or filesystem storage) are a bit more stable than web browsers, but even there, uninstalls or certain OS actions can remove local data. This is a challenge: How to cache data offline for speed while ensuring if it's wiped, the user doesn't lose everything important. Cloud-only apps by contrast keep data in the cloud so it's typically safe unless the server fails (and servers are easier to backup reliably). - -- **Complex Client-Side Logic & Increased App Size**: A local-first app tends to be more complex on the client side. You're essentially putting what used to be server responsibilities (storage, query engine, sync logic) into the frontend. This can increase the size of your frontend bundle (including a database library, possibly CRDT or sync code, etc.). It also increases memory and CPU usage on the client, as the browser/phone is doing more work. Low-end devices or older phones might struggle if the app is not optimized. Developers need to consider performance tuning for the local database (indexing, query efficiency) just like they would on a server. So while the user gains benefits, the app developer has to manage this complexity. - -- **Performance Constraints in JavaScript:** Even though devices are fast, a local JS database is generally **slower than a server DB** on robust hardware. There are many layers (JS -> IndexedDB -> possibly SQLite under the hood) that add overhead​. For example, inserting a record might go through the DB library, the storage engine, the browser's implementation, down to disk. For most UI uses this is fine (you don't need 10k writes/sec in a to-do app, you need maybe a few writes per second at most). But if your app does heavy data processing, the browser might become a bottleneck. - - The key question is _"Is it fast enough?"_. Often the answer is yes for typical usage, but developers must be mindful of not doing something on the client that truly requires big iron servers. For instance, full-text indexing of a million documents might be too slow in a client-side DB. **Unpredictable performance** is also a factor: Different users have different devices. A query that takes 50ms on a high-end desktop might take 500ms on a low-end phone in battery saving mode. So performance tuning and testing across devices is needed, and some heavy tasks might still belong on the server side​. For example if you build a [local vector database](./javascript-vector-database.md) you might want to create the embeddings on the server and sync them instead of creating them on the client. - -- **Client Database Migrations:** As your app evolves, you'll change data models or add new fields. In a cloud-first app, you'd typically run a migration on the server database. In a local-first app, you have not only the server DB (if any) but also every client's local database to consider. Upgrading the schema means you need to write migration logic that runs on each client, perhaps the next time they launch the app after an update. Clients may be offline or not upgrade the app immediately, so you could have different versions of the schema in the wild. This complicates data handling (the sync protocol might need to handle multiple schema versions until everyone is updated). Providing a smooth migration path for local data is doable (many libraries provide [migration facilities](../migration-schema.md)), but it requires careful testing. In a worst case, a failed migration on a client could brick the app for that user or force a full resync. This is a **much bigger headache** than just migrating a centralized DB at midnight while your service is in maintenance mode. 🌃 - -- **Security and Access Control:** In cloud-based apps, enforcing data security (who can see what) is done on the server. The client only gets the data it's authorized to get. In a local-first scenario, you often need to **partition data per user** on the backend as well, to ensure users only sync down their own data (or data they have permission for). One simple strategy is to give each user their own database or dataset on the server and only replicate that. For example, CouchDB allows creating one database per user and replication can be scoped to that DB which makes permission handling easy. But if you ever need to query across users (say an admin view or aggregate analytics), having data split into many small DBs becomes a pain. The alternative is a single backend database with a **fine-grained access control**, and the client asks to sync only certain documents/fields. That usually means writing a custom sync server or using something like GraphQL with resolvers that respect permissions. In short, **implementing auth and permissions in sync** adds complexity. Also, any data stored on the client is theoretically vulnerable to extraction (if someone compromises the device or uses dev tools). You can [encrypt local databases](../encryption.md) to prevent extraction after the server "revokes" the decryption password to mitigate the data extraction risk. - - -- **Relational Data and Complex Queries:** Most client-side/offline databases are [NoSQL/document oriented](../why-nosql.md) for flexibility in syncing and easy conflict handling. They may not support complex join queries or ACID transactions across multiple tables like a full SQL database would. This is partly because replicating a full relational model is much harder (maintaining referential integrity, etc., when data is partial on a client) or not even logically possible. For example if you have two offline clients running a complex `UPDATE X WHERE Y FROM Z INNER JOIN Alice INNER JOIN Bob` query and then they go online, you have no easy way of handling these conflicts. - - If your app has heavy relational data requirements or relies on complex server-side queries (aggregations, multi-join reports), you might find the local database either cannot do it or is too slow to do it client-side. The lack of robust relational querying is something to plan for and you might need to adjust your data model to be more document-oriented or use client-side libraries to run [joins in memory](../why-nosql.md#relational-queries-in-nosql). Most tools use NoSQL because it makes replication easy and implementing true relational sync would require extremely sophisticated solutions and even needing an atomic clock for full consistency across nodes (like google spanner). So, **if your app truly needs SQL power on the client**, local-first might complicate things. - - > In Local-First, most tools use NoSQL because it makes replication and conflict handling easy. - -That's a long list of challenges! In summary, local-first approaches introduce distributed data issues on the client side that web developers usually didn't have to deal with. Despite these challenges, the local-first movement is steadily growing because the **benefits to user experience and data control are very compelling** and modern tools are emerging to mitigate a lot of these difficulties. All of these are solved or solvable for your specific use-case, just keep them in mind before you start architecting your local-first app. - -## Local-First vs. Traditional Online-First Approaches - -So now that you know the pros and cons about Local-First. Lets directly compare it to your previous "online-first" stack: - -### Connectivity and Offline Usage -- **Local-first**: Apps like WhatsApp store messages locally on your device, letting you read past messages and even compose new ones without a stable network connection. Once online, the messages sync with the server and other participants. -- **Online-first**: Purely cloud-based apps typically stop functioning (beyond simple caching) when the network or server goes down. They rely on a constant connection to fetch or store user data. - -### Latency and Performance -- **Local-first**: Because data operations happen on the device, you see near-instant interactions (e.g., typing and reading chats feels very responsive, as the messages are on your phone). Syncing occurs in the background without delaying the user. -- **Online-first**: Most interactions involve a round-trip to the server, adding network latency and potentially requiring loading states or fallback UIs. If the network is slow or unreliable, users can experience delays when sending or receiving updates. - -### Complexity and Conflict Resolution -- **Local-first**: Much of the complexity like storing data or handling conflicts, shifts to the client. WhatsApp, for instance, caches all messages locally and queues unsent messages offline. Once reconnected, it must reconcile with the server and other devices, especially if the same account is used on multiple platforms. -- **Online-first**: A single central server manages data and concurrency, so clients remain thinner. However, the app becomes unusable if connectivity is lost, and any server downtime directly impacts all users. - -### Data Ownership and Storage Limits -- **Local-first**: Users hold a complete copy of data on their own device, retaining control and quick access. This can raise challenges when data sets are very large; phone storage might be insufficient, or backups may be harder to guarantee. -- **Online-first**: Storing all data in the cloud scales more easily, and providers often manage backups automatically. On the downside, users depend on the service and must trust it to protect their data. - -### When to Choose Which -- **Local-first**: Particularly helpful for scenarios where offline operation and immediate responsiveness matter, such as chat apps (like WhatsApp), field tools in low-connectivity environments, or any use case where users can't rely on being online 24/7. -- **Online-first**: Well-suited for systems that demand real-time central control or massive data aggregation with minimal offline needs, such as large-scale analytics platforms or services where guaranteed immediate global consistency is essential. -- **Hybrid**: In reality, most modern apps often blend these approaches, giving users partial offline capabilities (caching, queued updates) alongside a robust central service. This hybrid method offers the benefits of local speed and resilience, while still leveraging cloud infrastructure for collaboration and global reach. But a truth local-first app is way more than just a cache. - ---- - - - -## Offline-First vs. Local-First - -In the early days of offline-capable web apps (around 2014), the common phrase was **"Offline-First"**. Tools like **PouchDB** popularized the notion that developers should assume devices are often offline or have flaky connections, so apps must continue to work seamlessly without a network. The guiding principle was *"apps should treat being online as optional."* If a user has no internet access, the application's core features still function, saving or queuing data locally, and automatically synchronizing once connectivity is restored. - -
- -
- -Over time, this focus on offline support evolved into the broader concept of **"Local-First Software,"** (see [Ink&Switch](https://martin.kleppmann.com/papers/local-first.pdf)) emphasizing not just offline operation but also the technical underpinnings of **storing data locally** in the client application. While offline-first is primarily about resilience to network loss, local-first highlights ownership, privacy, and performance benefits of keeping the primary data on the user's device. Most tools these days extended the original offline-first concepts, adding real-time reactivity, custom sync, and more nuances like conflict resolution or encryption. - - -However, the term **"local-first"** can be **confusing** to non-technical audiences because many people (especially in the US) associate "local first" with *community-oriented movements* that encourage buying from nearby businesses or supporting local initiatives. To reduce ambiguity, it may be clearer to use **"local first software"** or **"local first development"** in your documentation and marketing materials. When creating branding or logos around local-first software, **avoid using the "Google Maps Pin"** as a symbol. This icon typically implies geolocation or physical locality further mixing up the notion of "location-based services" with "on-device data storage." - -## Do People Actually Use Local-First or Is It Just a Trend? - -If we look at **npm download statistics**, we see that **PouchDB** - one of the oldest libraries for local-first apps - has about **53k** downloads each week, and **RxDB** - a newer library - has about **22k** weekly downloads. Other local-first tools often have even fewer downloads. In comparison, a popular library like **react-query**, which does not focus on local storage, is downloaded about **1.6 million** times a week. These numbers show that local-first libraries, while used, are not as common as some of the more traditional tools. - -One reason is that **local-first** is still a new idea. Many developers are used to traditional "online-first" approaches, so switching to a local database and then syncing changes later can feel unfamiliar. Developers must learn different patterns, deal with offline synchronization, and handle possible conflicts. That extra work can be a barrier to adoption which might change in the future as tooling improves. - -While most of RxDB is open source, there are also **premium plugins** that help sustain RxDB as a long-term project. Because people purchase these plugins, we gains insights into how developers are using local-first features: -- About **half** of these users mainly want **offline functionality** for cases such as farming equipment, mining, construction, or even a shrimp farm app. -- The **other half** focus on **faster, real-time UIs** for to-do or reading apps, a space launch planning tool, and various dashboard apps. This range of use cases highlights both the resilience offline mode can offer and the performance boost that local databases can provide when synced in the background. - -## Why Local-First Is the Future - -Early in the history of the web, users **expected** static pages. If you wanted to see new content, you **reloaded** the page. That was normal at the time, and nobody found it strange because everything worked that way. - -Then, as more sites added **real-time** features - auto-updating feeds, live notifications, single-page apps - suddenly those older "reload-only" sites began to feel **slow** or **outdated**. Why wait for a manual refresh when real-time data was possible and readily available? - -The same pattern is happening with **local-first** apps. Right now, most sites are still built around network availability. We see loading spinners whenever data is fetched, and we simply wait for the server response. As local-first experiences become **commonplace** - removing spinners, letting users keep working when offline, and syncing in the background - everything else will start to feel **frustratingly behind**. Users won't tolerate slow or blocked interactions if they've seen apps that respond instantly and remain usable offline. They'll expect that as the default and we'll likely see growing pressure on developers to eliminate those extra loading steps. For many users, the experience of **immediate local writes will become not just a perk, but an expectation!** - -## See also - -
- - - -
- -- Discuss [this topic on HackerNews](https://news.ycombinator.com/item?id=43289885) -- [Local-First Technologies](../alternatives.md): A list of databases and technologies (besides [RxDB](/)) that support offline-first or local-first use cases. -- [Discord](/chat/): Join our Discord server to talk with people and share ideas about this topic. -- [Inc&Switch](https://martin.kleppmann.com/papers/local-first.pdf): The "original" paper about Local-First from 2019 where the naming of local-first Software was first used and described. -- [Learn how to build a local-first Application with RxDB](../quickstart.md). diff --git a/docs/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html b/docs/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html deleted file mode 100644 index 293809cd3c3..00000000000 --- a/docs/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - - -LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite

-

So you are building that web application and you want to store data inside of your users browser. Maybe you just need to store some small flags or you even need a fully fledged database.

-

The types of web applications we build have changed significantly. In the early years of the web we served static html files. Then we served dynamically rendered html and later we build single page applications that run most logic on the client. And for the coming years you might want to build so called local first apps that handle big and complex data operations solely on the client and even work when offline, which gives you the opportunity to build zero-latency user interactions.

-

In the early days of the web, cookies were the only option for storing small key-value assignments.. But JavaScript and browsers have evolved significantly and better storage APIs have been added which pave the way for bigger and more complex data operations.

-

In this article, we will dive into the various technologies available for storing and querying data in a browser. We'll explore traditional methods like Cookies, localStorage, WebSQL, IndexedDB and newer solutions such as OPFS and SQLite via WebAssembly. We compare the features and limitations and through performance tests we aim to uncover how fast we can write and read data in a web application with the various methods.

-
note

You are reading this in the RxDB docs. RxDB is a JavaScript database that has different storage adapters which can utilize the different storage APIs. -Since 2017 I spend most of my time working with these APIs, doing performance tests and building hacks and plugins to reach the limits of browser database operation speed.

JavaScript Database
-

The available Storage APIs in a modern Browser

-

First lets have a brief overview of the different APIs, their intentional use case and history:

-

What are Cookies

-

Cookies were first introduced by netscape in 1994. -Cookies store small pieces of key-value data that are mainly used for session management, personalization, and tracking. Cookies can have several security settings like a time-to-live or the domain attribute to share the cookies between several subdomains.

-

Cookies values are not only stored at the client but also sent with every http request to the server. This means we cannot store much data in a cookie but it is still interesting how good cookie access performance compared to the other methods. Especially because cookies are such an important base feature of the web, many performance optimizations have been done and even these days there is still progress being made like the Shared Memory Versioning by chromium or the asynchronous CookieStore API.

-

What is LocalStorage

-

The localStorage API was first proposed as part of the WebStorage specification in 2009. -LocalStorage provides a simple API to store key-value pairs inside of a web browser. It has the methods setItem, getItem, removeItem and clear which is all you need from a key-value store. LocalStorage is only suitable for storing small amounts of data that need to persist across sessions and it is limited by a 5MB storage cap. Storing complex data is only possible by transforming it into a string for example with JSON.stringify(). -The API is not asynchronous which means if fully blocks your JavaScript process while doing stuff. Therefore running heavy operations on it might block your UI from rendering.

-
-

There is also the SessionStorage API. The key difference is that localStorage data persists indefinitely until explicitly cleared, while sessionStorage data is cleared when the browser tab or window is closed.

-
-

What is IndexedDB

-

IndexedDB was first introduced as "Indexed Database API" in 2015.

-

IndexedDB is a low-level API for storing large amounts of structured JSON data. While the API is a bit hard to use, IndexedDB can utilize indexes and asynchronous operations. It lacks support for complex queries and only allows to iterate over the indexes which makes it more like a base layer for other libraries then a fully fledged database.

-

In 2018, IndexedDB version 2.0 was introduced. This added some major improvements. Most noticeable the getAll() method which improves performance dramatically when fetching bulks of JSON documents.

-

IndexedDB version 3.0 is in the workings which contains many improvements. Most important the addition of Promise based calls that makes modern JS features like async/await more useful.

-

What is OPFS

-

The Origin Private File System (OPFS) is a relatively new API that allows web applications to store large files directly in the browser. It is designed for data-intensive applications that want to write and read binary data in a simulated file system.

-

OPFS can be used in two modes:

-
    -
  • Either asynchronous on the main thread
  • -
  • Or in a WebWorker with the faster, asynchronous access with the createSyncAccessHandle() method.
  • -
-

Because only binary data can be processed, OPFS is made to be a base filesystem for library developers. You will unlikely directly want to use the OPFS in your code when you build a "normal" application because it is too complex. That would only make sense for storing plain files like images, not to store and query JSON data efficiently. I have build a OPFS based storage for RxDB with proper indexing and querying and it took me several months.

-

What is WASM SQLite

-
WASM SQLite
-

WebAssembly (Wasm) is a binary format that allows high-performance code execution on the web. -Wasm was added to major browsers over the course of 2017 which opened a wide range of opportunities on what to run inside of a browser. You can compile native libraries to WebAssembly and just run them on the client with just a few adjustments. WASM code can be shipped to browser apps and generally runs much faster compared to JavaScript, but still about 10% slower then native.

-

Many people started to use compiled SQLite as a database inside of the browser which is why it makes sense to also compare this setup to the native APIs.

-

The compiled byte code of SQLite has a size of about 938.9 kB which must be downloaded and parsed by the users on the first page load. WASM cannot directly access any persistent storage API in the browser. Instead it requires data to flow from WASM to the main-thread and then can be put into one of the browser APIs. This is done with so called VFS (virtual file system) adapters that handle data access from SQLite to anything else.

-

What was WebSQL

-

WebSQL was a web API introduced in 2009 that allowed browsers to use SQL databases for client-side storage, based on SQLite. The idea was to give developers a way to store and query data using SQL on the client side, similar to server-side databases. -WebSQL has been removed from browsers in the current years for multiple good reasons:

-
    -
  • WebSQL was not standardized and having an API based on a single specific implementation in form of the SQLite source code is hard to ever make it to a standard.
  • -
  • WebSQL required browsers to use a specific version of SQLite (version 3.6.19) which means whenever there would be any update or bugfix to SQLite, it would not be possible to add that to WebSQL without possible breaking the web.
  • -
  • Major browsers like firefox never supported WebSQL.
  • -
-

Therefore in the following we will just ignore WebSQL even if it would be possible to run tests on in by setting specific browser flags or using old versions of chromium.

-
-

Feature Comparison

-

Now that you know the basic concepts of the APIs, lets compare some specific features that have shown to be important for people using RxDB and browser based storages in general.

-

Storing complex JSON Documents

-

When you store data in a web application, most often you want to store complex JSON documents and not only "normal" values like the integers and strings you store in a server side database.

-
    -
  • Only IndexedDB works with JSON objects natively.
  • -
  • With SQLite WASM you can store JSON in a text column since version 3.38.0 (2022-02-22) and even run deep queries on it and use single attributes as indexes.
  • -
-

Every of the other APIs can only store strings or binary data. Of course you can transform any JSON object to a string with JSON.stringify() but not having the JSON support in the API can make things complex when running queries and running JSON.stringify() many times can cause performance problems.

-

Multi-Tab Support

-

A big difference when building a Web App compared to Electron or React-Native, is that the user will open and close the app in multiple browser tabs at the same time. Therefore you have not only one JavaScript process running, but many of them can exist and might have to share state changes between each other to not show outdated data to the user.

-
-

If your users' muscle memory puts the left hand on the F5 key while using your website, you did something wrong!

-
-

Not all storage APIs support a way to automatically share write events between tabs.

-

Only localstorage has a way to automatically share write events between tabs by the API itself with the storage-event which can be used to observe changes.

-
// localStorage can observe changes with the storage event.
-// This feature is missing in IndexedDB and others
-addEventListener("storage", (event) => {});
-

There was the experimental IndexedDB observers API for chrome, but the proposal repository has been archived.

-

To workaround this problem, there are two solutions:

-
    -
  • The first option is to use the BroadcastChannel API which can send messages across browser tabs. So whenever you do a write to the storage, you also send a notification to other tabs to inform them about these changes. This is the most common workaround which is also used by RxDB. Notice that there is also the WebLocks API which can be used to have mutexes across browser tabs.
  • -
  • The other solution is to use the SharedWorker and do all writes inside of the worker. All browser tabs can then subscribe to messages from that single SharedWorker and know about changes.
  • -
-

Indexing Support

-

The big difference between a database and storing data in a plain file, is that a database is writing data in a format that allows running operations over indexes to facilitate fast performant queries. From our list of technologies only IndexedDB and WASM SQLite support for indexing out of the box. In theory you can build indexes on top of any storage like localstorage or OPFS but you likely should not want to do that by yourself.

-

In IndexedDB for example, we can fetch a bulk of documents by a given index range:

-
// find all products with a price between 10 and 50
-const keyRange = IDBKeyRange.bound(10, 50);
-const transaction = db.transaction('products', 'readonly');
-const objectStore = transaction.objectStore('products');
-const index = objectStore.index('priceIndex');
-const request = index.getAll(keyRange);
-const result = await new Promise((res, rej) => {
-  request.onsuccess = (event) => res(event.target.result);
-  request.onerror = (event) => rej(event);
-});
-

Notice that IndexedDB has the limitation of not having indexes on boolean values. You can only index strings and numbers. To workaround that you have to transform boolean to numbers and backwards when storing the data.

-

WebWorker Support

-

When running heavy data operations, you might want to move the processing away from the JavaScript main thread. This ensures that our app keeps being responsive and fast while the processing can run in parallel in the background. In a browser you can either use the WebWorker, SharedWorker or the ServiceWorker API to do that. In RxDB you can use the WebWorker or SharedWorker plugins to move your storage inside of a worker.

-

The most common API for that use case is spawning a WebWorker and doing most work on that second JavaScript process. The worker is spawned from a separate JavaScript file (or base64 string) and communicates with the main thread by sending data with postMessage().

-

Unfortunately LocalStorage and Cookies cannot be used in WebWorker or SharedWorker because of the design and security constraints. WebWorkers run in a separate global context from the main browser thread and therefore cannot do stuff that might impact the main thread. They have no direct access to certain web APIs, like the DOM, localStorage, or cookies.

-

Everything else can be used from inside a WebWorker. -The fast version of OPFS with the createSyncAccessHandle method can only be used in a WebWorker, and not on the main thread. This is because all the operations of the returned AccessHandle are not async and therefore block the JavaScript process, so you do want to do that on the main thread and block everything.

-
-

Storage Size Limits

-
    -
  • -

    Cookies are limited to about 4 KB of data in RFC-6265. Because the stored cookies are send to the server with every HTTP request, this limitation is reasonable. You can test your browsers cookie limits here. Notice that you should never fill up the full 4 KB of your cookies because your web server will not accept too long headers and reject the requests with HTTP ERROR 431 - Request header fields too large. Once you have reached that point you can not even serve updated JavaScript to your user to clean up the cookies and you will have locked out that user until the cookies get cleaned up manually.

    -
  • -
  • -

    LocalStorage has a storage size limitation that varies depending on the browser, but generally ranges from 4 MB to 10 MB per origin. You can test your localStorage size limit here.

    -
      -
    • Chrome/Chromium/Edge: 5 MB per domain
    • -
    • Firefox: 10 MB per domain
    • -
    • Safari: 4-5 MB per domain (varies slightly between versions)
    • -
    -
  • -
  • -

    IndexedDB does not have a specific fixed size limitation like localStorage. The maximum storage size for IndexedDB depends on the browser implementation. The upper limit is typically based on the available disc space on the user's device. In chromium browsers it can use up to 80% of total disk space. You can get an estimation about the storage size limit by calling await navigator.storage.estimate(). Typically you can store gigabytes of data which can be tried out here. Notice that we have a full article about storage max size limits of IndexedDB that covers this topic.

    -
  • -
  • -

    OPFS has the same storage size limitation as IndexedDB. Its limit depends on the available disc space. This can also be tested here.

    -
  • -
-
-

Performance Comparison

-

Now that we've reviewed the features of each storage method, let's dive into performance comparisons, focusing on initialization times, read/write latencies, and bulk operations.

-

Notice that we only run simple tests and for your specific use case in your application the results might differ. Also we only compare performance in google chrome (version 128.0.6613.137). Firefox and Safari have similar but not equal performance patterns. You can run the test by yourself on your own machine from this github repository. For all tests we throttle the network to behave like the average german internet speed. (download: 135,900 kbit/s, upload: 28,400 kbit/s, latency: 125ms). Also all tests store an "average" JSON object that might be required to be stringified depending on the storage. We also only test the performance of storing documents by id because some of the technologies (cookies, OPFS and localstorage) do not support indexed range operations so it makes no sense to compare the performance of these.

-

Initialization Time

-

Before you can store any data, many APIs require a setup process like creating databases, spawning WebAssembly processes or downloading additional stuff. To ensure your app starts fast, the initialization time is important.

-

The APIs of localStorage and Cookies do not have any setup process and can be directly used. IndexedDB requires to open a database and a store inside of it. WASM SQLite needs to download a WASM file and process it. OPFS needs to download and start a worker file and initialize the virtual file system directory.

-

Here are the time measurements from how long it takes until the first bit of data can be stored:

-
TechnologyTime in Milliseconds
IndexedDB46
OPFS Main Thread23
OPFS WebWorker26.8
WASM SQLite (memory)504
WASM SQLite (IndexedDB)535
-

Here we can notice a few things:

-
    -
  • Opening a new IndexedDB database with a single store takes surprisingly long
  • -
  • The latency overhead of sending data from the main thread to a WebWorker OPFS is about 4 milliseconds. Here we only send minimal data to init the OPFS file handler. It will be interesting if that latency increases when more data is processed.
  • -
  • Downloading and parsing WASM SQLite and creating a single table takes about half a second. Using also the IndexedDB VFS to store data persistently adds additional 31 milliseconds. Reloading the page with enabled caching and already prepared tables is a bit faster with 420 milliseconds (memory).
  • -
-

Latency of small Writes

-

Next lets test the latency of small writes. This is important when you do many small data changes that happen independent from each other. Like when you stream data from a websocket or persist pseudo randomly happening events like mouse movements.

-
TechnologyTime in Milliseconds
Cookies0.058
LocalStorage0.017
IndexedDB0.17
OPFS Main Thread1.46
OPFS WebWorker1.54
WASM SQLite (memory)0.17
WASM SQLite (IndexedDB)3.17
-

Here we can notice a few things:

-
    -
  • LocalStorage has the lowest write latency with only 0.017 milliseconds per write.
  • -
  • IndexedDB writes are about 10 times slower compared to localStorage.
  • -
  • Sending the data to the WASM SQLite process and letting it persist via IndexedDB is slow with over 3 milliseconds per write.
  • -
-

The OPFS operations take about 1.5 milliseconds to write the JSON data into one document per file. We can see the sending the data to a webworker first is a bit slower which comes from the overhead of serializing and deserializing the data on both sides. -If we would not create on OPFS file per document but instead append everything to a single file, the performance pattern changes significantly. Then the faster file handle from the createSyncAccessHandle() only takes about 1 millisecond per write. But this would require to somehow remember at which position the each document is stored. Therefore in our tests we will continue using one file per document.

-

Latency of small Reads

-

Now that we have stored some documents, lets measure how long it takes to read single documents by their id.

-
TechnologyTime in Milliseconds
Cookies0.132
LocalStorage0.0052
IndexedDB0.1
OPFS Main Thread1.28
OPFS WebWorker1.41
WASM SQLite (memory)0.45
WASM SQLite (IndexedDB)2.93
-

Here we can notice a few things:

-
    -
  • LocalStorage reads are really really fast with only 0.0052 milliseconds per read.
  • -
  • The other technologies perform reads in a similar speed to their write latency.
  • -
-

Big Bulk Writes

-

As next step, lets do some big bulk operations with 200 documents at once.

-
TechnologyTime in Milliseconds
Cookies20.6
LocalStorage5.79
IndexedDB13.41
OPFS Main Thread280
OPFS WebWorker104
WASM SQLite (memory)19.1
WASM SQLite (IndexedDB)37.12
-

Here we can notice a few things:

-
    -
  • Sending the data to a WebWorker and running it via the faster OPFS API is about twice as fast.
  • -
  • WASM SQLite performs better on bulk operations compared to its single write latency. This is because sending the data to WASM and backwards is faster if it is done all at once instead of once per document.
  • -
-

Big Bulk Reads

-

Now lets read 100 documents in a bulk request.

-
TechnologyTime in Milliseconds
Cookies6.34
LocalStorage0.39
IndexedDB4.99
OPFS Main Thread54.79
OPFS WebWorker25.61
WASM SQLite (memory)3.59
WASM SQLite (IndexedDB)5.84 (35ms without cache)
-

Here we can notice a few things:

-
    -
  • Reading many files in the OPFS webworker is about twice as fast compared to the slower main thread mode.
  • -
  • WASM SQLite is surprisingly fast. Further inspection has shown that the WASM SQLite process keeps the documents in memory cached which improves the latency when we do reads directly after writes on the same data. When the browser tab is reloaded between the writes and the reads, finding the 100 documents takes about 35 milliseconds instead.
  • -
-

Performance Conclusions

-
    -
  • LocalStorage is really fast but remember that is has some downsides: -
      -
    • It blocks the main JavaScript process and therefore should not be used for big bulk operations.
    • -
    • Only Key-Value assignments are possible, you cannot use it efficiently when you need to do index based range queries on your data.
    • -
    -
  • -
  • OPFS is way faster when used in the WebWorker with the createSyncAccessHandle() method compare to using it directly in the main thread.
  • -
  • SQLite WASM can be fast but you have to initially download the full binary and start it up which takes about half a second. This might not be relevant at all if your app is started up once and the used for a very long time. But for web-apps that are opened and closed in many browser tabs many times, this might be a problem.
  • -
-
-

Possible Improvements

-

There is a wide range of possible improvements and performance hacks to speed up the operations.

-
    -
  • For IndexedDB I have made a list of performance hacks here. For example you can do sharding between multiple database and webworkers or use a custom index strategy.
  • -
  • OPFS is slow in writing one file per document. But you do not have to do that and instead you can store everything at a single file like a normal database would do. This improves performance dramatically like it was done with the RxDB OPFS RxStorage.
  • -
  • You can mix up the technologies to optimize for multiple scenarios at once. For example in RxDB there is the localstorage meta optimizer which stores initial metadata in localstorage and "normal" documents inside of IndexedDB. This improves the initial startup time while still having the documents stored in a way to query them efficiently.
  • -
  • There is the memory-mapped storage plugin in RxDB which maps data directly to memory. Using this in combination with a shared worker can improve pageloads and query time significantly.
  • -
  • Compressing data before storing it might improve the performance for some of the storages.
  • -
  • Splitting work up between multiple WebWorkers via sharding can improve performance by utilizing the whole capacity of your users device.
  • -
-

Here you can see the performance comparison of various RxDB storage implementations which gives a better view of real world performance:

-
RxStorage performance - browser
-

Future Improvements

-

You are reading this in 2024, but the web does not stand still. There is a good chance that browser get enhanced to allow faster and better data operations.

-
    -
  • Currently there is no way to directly access a persistent storage from inside a WebAssembly process. If this changes in the future, running SQLite (or a similar database) in a browser might be the best option.
  • -
  • Sending data between the main thread and a WebWorker is slow but might be improved in the future. There is a good article about why postMessage() is slow.
  • -
  • IndexedDB lately got support for storage buckets (chrome only) which might improve performance.
  • -
-

Follow Up

-
- - \ No newline at end of file diff --git a/docs/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.md b/docs/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.md deleted file mode 100644 index e5a762ebcce..00000000000 --- a/docs/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.md +++ /dev/null @@ -1,341 +0,0 @@ -# LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite - -> Compare LocalStorage, IndexedDB, Cookies, OPFS, and WASM-SQLite for web storage, performance, limits, and best practices for modern web apps. - - - -# LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite - -So you are building that web application and you want to **store data inside of your users browser**. Maybe you just need to store some small flags or you even need a fully fledged database. - -The types of web applications we build have changed significantly. In the early years of the web we served static html files. Then we served dynamically rendered html and later we build **single page applications** that run most logic on the client. And for the coming years you might want to build so called [local first apps](../offline-first.md) that handle big and complex data operations solely on the client and even work when offline, which gives you the opportunity to build **zero-latency** user interactions. - -In the early days of the web, **cookies** were the only option for storing small key-value assignments.. But JavaScript and browsers have evolved significantly and better storage APIs have been added which pave the way for bigger and more complex data operations. - -In this article, we will dive into the various technologies available for storing and querying data in a browser. We'll explore traditional methods like **Cookies**, **localStorage**, **WebSQL**, **IndexedDB** and newer solutions such as **OPFS** and **SQLite via WebAssembly**. We compare the features and limitations and through performance tests we aim to uncover how fast we can write and read data in a web application with the various methods. - -:::note -You are reading this in the [RxDB](/) docs. RxDB is a JavaScript database that has different storage adapters which can utilize the different storage APIs. -**Since 2017** I spend most of my time working with these APIs, doing performance tests and building [hacks](../slow-indexeddb.md) and plugins to reach the limits of browser database operation speed. - -
- - - -
-::: - -## The available Storage APIs in a modern Browser - -First lets have a brief overview of the different APIs, their intentional use case and history: - -### What are Cookies - -Cookies were first introduced by [netscape in 1994](https://www.baekdal.com/thoughts/the-original-cookie-specification-from-1997-was-gdpr-compliant/). -Cookies store small pieces of key-value data that are mainly used for session management, personalization, and tracking. Cookies can have several security settings like a time-to-live or the `domain` attribute to share the cookies between several subdomains. - -Cookies values are not only stored at the client but also sent with **every http request** to the server. This means we cannot store much data in a cookie but it is still interesting how good cookie access performance compared to the other methods. Especially because cookies are such an important base feature of the web, many performance optimizations have been done and even these days there is still progress being made like the [Shared Memory Versioning](https://blog.chromium.org/2024/06/introducing-shared-memory-versioning-to.html) by chromium or the asynchronous [CookieStore API](https://developer.mozilla.org/en-US/docs/Web/API/Cookie_Store_API). - -### What is LocalStorage - -The [localStorage API](./localstorage.md) was first proposed as part of the [WebStorage specification in 2009](https://www.w3.org/TR/2009/WD-webstorage-20090423/#the-localstorage-attribute). -LocalStorage provides a simple API to store key-value pairs inside of a web browser. It has the methods `setItem`, `getItem`, `removeItem` and `clear` which is all you need from a key-value store. LocalStorage is only suitable for storing small amounts of data that need to persist across sessions and it is [limited by a 5MB storage cap](./localstorage.md#understanding-the-limitations-of-local-storage). Storing complex data is only possible by transforming it into a string for example with `JSON.stringify()`. -The API is not asynchronous which means if fully blocks your JavaScript process while doing stuff. Therefore running heavy operations on it might block your UI from rendering. - -> There is also the **SessionStorage** API. The key difference is that localStorage data persists indefinitely until explicitly cleared, while sessionStorage data is cleared when the browser tab or window is closed. - -### What is IndexedDB - -IndexedDB was first introduced as "Indexed Database API" [in 2015](https://www.w3.org/TR/IndexedDB/#sotd). - -[IndexedDB](../rx-storage-indexeddb.md) is a low-level API for storing large amounts of structured JSON data. While the API is a bit hard to use, IndexedDB can utilize indexes and asynchronous operations. It lacks support for complex queries and only allows to iterate over the indexes which makes it more like a base layer for other libraries then a fully fledged database. - -In 2018, IndexedDB version 2.0 [was introduced](https://hacks.mozilla.org/2016/10/whats-new-in-indexeddb-2-0/). This added some major improvements. Most noticeable the `getAll()` method which improves performance dramatically when fetching bulks of JSON documents. - -IndexedDB [version 3.0](https://w3c.github.io/IndexedDB/) is in the workings which contains many improvements. Most important the addition of `Promise` based calls that makes modern JS features like `async/await` more useful. - -### What is OPFS - -The [Origin Private File System](../rx-storage-opfs.md) (OPFS) is a [relatively new](https://caniuse.com/mdn-api_filesystemfilehandle_createsyncaccesshandle) API that allows web applications to store large files directly in the browser. It is designed for data-intensive applications that want to write and read **binary data** in a simulated file system. - -OPFS can be used in two modes: -- Either asynchronous on the [main thread](../rx-storage-opfs.md#using-opfs-in-the-main-thread-instead-of-a-worker) -- Or in a WebWorker with the faster, asynchronous access with the `createSyncAccessHandle()` method. - -Because only binary data can be processed, OPFS is made to be a base filesystem for library developers. You will unlikely directly want to use the OPFS in your code when you build a "normal" application because it is too complex. That would only make sense for storing plain files like images, not to store and query [JSON data](./json-based-database.md) efficiently. I have build a [OPFS based storage](../rx-storage-opfs.md) for RxDB with proper indexing and querying and it took me several months. - -### What is WASM SQLite - -
- -
- -[WebAssembly](https://webassembly.org/) (Wasm) is a binary format that allows high-performance code execution on the web. -Wasm was added to major browsers over the course of 2017 which opened a wide range of opportunities on what to run inside of a browser. You can compile native libraries to WebAssembly and just run them on the client with just a few adjustments. WASM code can be shipped to browser apps and generally runs much faster compared to JavaScript, but still about [10% slower then native](https://www.usenix.org/conference/atc19/presentation/jangda). - -Many people started to use compiled SQLite as a database inside of the browser which is why it makes sense to also compare this setup to the native APIs. - -The compiled byte code of SQLite has a size of [about 938.9 kB](https://sqlite.org/download.html) which must be downloaded and parsed by the users on the first page load. WASM cannot directly access any persistent storage API in the browser. Instead it requires data to flow from WASM to the main-thread and then can be put into one of the browser APIs. This is done with so called [VFS (virtual file system) adapters](https://www.sqlite.org/vfs.html) that handle data access from SQLite to anything else. - -### What was WebSQL - -WebSQL **was** a web API [introduced in 2009](https://www.w3.org/TR/webdatabase/) that allowed browsers to use SQL databases for client-side storage, based on SQLite. The idea was to give developers a way to store and query data using SQL on the client side, similar to server-side databases. -WebSQL has been **removed from browsers** in the current years for multiple good reasons: - -- WebSQL was not standardized and having an API based on a single specific implementation in form of the SQLite source code is hard to ever make it to a standard. -- WebSQL required browsers to use a [specific version](https://developer.chrome.com/blog/deprecating-web-sql#reasons_for_deprecating_web_sql) of SQLite (version 3.6.19) which means whenever there would be any update or bugfix to SQLite, it would not be possible to add that to WebSQL without possible breaking the web. -- Major browsers like firefox never supported WebSQL. - -Therefore in the following we will **just ignore WebSQL** even if it would be possible to run tests on in by setting specific browser flags or using old versions of chromium. - -------------- - -## Feature Comparison - -Now that you know the basic concepts of the APIs, lets compare some specific features that have shown to be important for people using RxDB and browser based storages in general. - -### Storing complex JSON Documents - -When you store data in a web application, most often you want to store complex JSON documents and not only "normal" values like the `integers` and `strings` you store in a server side database. - -- Only IndexedDB works with JSON objects natively. -- With SQLite WASM you can [store JSON](https://www.sqlite.org/json1.html) in a `text` column since version 3.38.0 (2022-02-22) and even run deep queries on it and use single attributes as indexes. - -Every of the other APIs can only store strings or binary data. Of course you can transform any JSON object to a string with `JSON.stringify()` but not having the JSON support in the API can make things complex when running queries and running `JSON.stringify()` many times can cause performance problems. - -### Multi-Tab Support - -A big difference when building a Web App compared to [Electron](../electron-database.md) or [React-Native](../react-native-database.md), is that the user will open and close the app in **multiple browser tabs at the same time**. Therefore you have not only one JavaScript process running, but many of them can exist and might have to share state changes between each other to not show **outdated data** to the user. - -> If your users' muscle memory puts the left hand on the **F5** key while using your website, you did something wrong! - -Not all storage APIs support a way to automatically share write events between tabs. - -Only localstorage has a way to automatically share write events between tabs by the API itself with the [storage-event](./localstorage.md#localstorage-vs-indexeddb) which can be used to observe changes. - -```js -// localStorage can observe changes with the storage event. -// This feature is missing in IndexedDB and others -addEventListener("storage", (event) => {}); -``` - -There was the [experimental IndexedDB observers API](https://stackoverflow.com/a/33270440) for chrome, but the proposal repository has been archived. - -To workaround this problem, there are two solutions: -- The first option is to use the [BroadcastChannel API](https://github.com/pubkey/broadcast-channel) which can send messages across browser tabs. So whenever you do a write to the storage, you also send a notification to other tabs to inform them about these changes. This is the most common workaround which is also used by RxDB. Notice that there is also the [WebLocks API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Locks_API) which can be used to have mutexes across browser tabs. -- The other solution is to use the [SharedWorker](https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker) and do all writes inside of the worker. All browser tabs can then subscribe to messages from that **single** SharedWorker and know about changes. - -### Indexing Support - -The big difference between a database and storing data in a plain file, is that a database is writing data in a format that allows running operations over indexes to facilitate fast performant queries. From our list of technologies only **IndexedDB** and **WASM SQLite** support for indexing out of the box. In theory you can build indexes on top of any storage like localstorage or OPFS but you likely should not want to do that by yourself. - -In IndexedDB for example, we can fetch a bulk of documents by a given index range: - -```ts -// find all products with a price between 10 and 50 -const keyRange = IDBKeyRange.bound(10, 50); -const transaction = db.transaction('products', 'readonly'); -const objectStore = transaction.objectStore('products'); -const index = objectStore.index('priceIndex'); -const request = index.getAll(keyRange); -const result = await new Promise((res, rej) => { - request.onsuccess = (event) => res(event.target.result); - request.onerror = (event) => rej(event); -}); -``` - -Notice that IndexedDB has the limitation of [not having indexes on boolean values](https://github.com/w3c/IndexedDB/issues/76). You can only index strings and numbers. To workaround that you have to transform boolean to numbers and backwards when storing the data. - -### WebWorker Support - -When running heavy data operations, you might want to move the processing away from the JavaScript main thread. This ensures that our app keeps being responsive and fast while the processing can run in parallel in the background. In a browser you can either use the [WebWorker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API), [SharedWorker](https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker) or the [ServiceWorker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) API to do that. In RxDB you can use the [WebWorker](../rx-storage-worker.md) or [SharedWorker](../rx-storage-shared-worker.md) plugins to move your storage inside of a worker. - -The most common API for that use case is spawning a **WebWorker** and doing most work on that second JavaScript process. The worker is spawned from a separate JavaScript file (or base64 string) and communicates with the main thread by sending data with `postMessage()`. - -Unfortunately **LocalStorage** and **Cookies** [cannot be used in WebWorker or SharedWorker](https://stackoverflow.com/questions/6179159/accessing-localstorage-from-a-webworker) because of the design and security constraints. WebWorkers run in a separate global context from the main browser thread and therefore cannot do stuff that might impact the main thread. They have no direct access to certain web APIs, like the DOM, localStorage, or cookies. - -Everything else can be used from inside a WebWorker. -The fast version of OPFS with the `createSyncAccessHandle` method can **only** [be used in a WebWorker](../rx-storage-opfs.md#opfs-limitations), and **not on the main thread**. This is because all the operations of the returned `AccessHandle` are **not async** and therefore block the JavaScript process, so you do want to do that on the main thread and block everything. - -------------- - -## Storage Size Limits - -- **Cookies** are limited to about `4 KB` of data in [RFC-6265](https://datatracker.ietf.org/doc/html/rfc6265#section-6.1). Because the stored cookies are send to the server with every HTTP request, this limitation is reasonable. You can test your browsers cookie limits [here](http://www.ruslog.com/tools/cookies.html). Notice that you should never fill up the full `4 KB` of your cookies because your web server will not accept too long headers and reject the requests with `HTTP ERROR 431 - Request header fields too large`. Once you have reached that point you can not even serve updated JavaScript to your user to clean up the cookies and you will have locked out that user until the cookies get cleaned up manually. - -- **LocalStorage** has a storage size limitation that varies depending on the browser, but generally ranges from 4 MB to 10 MB per origin. You can test your localStorage size limit [here](https://arty.name/localstorage.html). - - Chrome/Chromium/Edge: 5 MB per domain - - Firefox: 10 MB per domain - - Safari: 4-5 MB per domain (varies slightly between versions) - -- **IndexedDB** does not have a specific fixed size limitation like localStorage. The maximum storage size for IndexedDB depends on the browser implementation. The upper limit is typically based on the available disc space on the user's device. In chromium browsers it can use up to 80% of total disk space. You can get an estimation about the storage size limit by calling `await navigator.storage.estimate()`. Typically you can store gigabytes of data which can be tried out [here](https://demo.agektmr.com/storage/). Notice that we have a full article about [storage max size limits of IndexedDB](./indexeddb-max-storage-limit.md) that covers this topic. - -- **OPFS** has the same storage size limitation as IndexedDB. Its limit depends on the available disc space. This can also be tested [here](https://demo.agektmr.com/storage/). - -------------- - -## Performance Comparison - -Now that we've reviewed the features of each storage method, let's dive into performance comparisons, focusing on initialization times, read/write latencies, and bulk operations. - -Notice that we only run simple tests and for your specific use case in your application the results might differ. Also we only compare performance in google chrome (version 128.0.6613.137). Firefox and Safari have similar **but not equal** performance patterns. You can run the test by yourself on your own machine from this [github repository](https://github.com/pubkey/localstorage-indexeddb-cookies-opfs-sqlite-wasm). For all tests we throttle the network to behave like the average german internet speed. (download: 135,900 kbit/s, upload: 28,400 kbit/s, latency: 125ms). Also all tests store an "average" JSON object that might be required to be stringified depending on the storage. We also only test the performance of storing documents by id because some of the technologies (cookies, OPFS and localstorage) do not support indexed range operations so it makes no sense to compare the performance of these. - -### Initialization Time - -Before you can store any data, many APIs require a setup process like creating databases, spawning WebAssembly processes or downloading additional stuff. To ensure your app starts fast, the initialization time is important. - -The APIs of localStorage and Cookies do not have any setup process and can be directly used. IndexedDB requires to open a database and a store inside of it. WASM SQLite needs to download a WASM file and process it. OPFS needs to download and start a worker file and initialize the virtual file system directory. - -Here are the time measurements from how long it takes until the first bit of data can be stored: - -| Technology | Time in Milliseconds | -| ----------------------- | -------------------- | -| IndexedDB | 46 | -| OPFS Main Thread | 23 | -| OPFS WebWorker | 26.8 | -| WASM SQLite (memory) | 504 | -| WASM SQLite (IndexedDB) | 535 | - -Here we can notice a few things: - -- Opening a new IndexedDB database with a single store takes surprisingly long -- The latency overhead of sending data from the main thread to a WebWorker OPFS is about 4 milliseconds. Here we only send minimal data to init the OPFS file handler. It will be interesting if that latency increases when more data is processed. -- Downloading and parsing WASM SQLite and creating a single table takes about half a second. Using also the IndexedDB VFS to store data persistently adds additional 31 milliseconds. Reloading the page with enabled caching and already prepared tables is a bit faster with 420 milliseconds (memory). - -### Latency of small Writes - -Next lets test the latency of small writes. This is important when you do many small data changes that happen independent from each other. Like when you stream data from a websocket or persist pseudo randomly happening events like mouse movements. - -| Technology | Time in Milliseconds | -| ----------------------- | -------------------- | -| Cookies | 0.058 | -| LocalStorage | 0.017 | -| IndexedDB | 0.17 | -| OPFS Main Thread | 1.46 | -| OPFS WebWorker | 1.54 | -| WASM SQLite (memory) | 0.17 | -| WASM SQLite (IndexedDB) | 3.17 | - -Here we can notice a few things: - -- LocalStorage has the lowest write latency with only 0.017 milliseconds per write. -- IndexedDB writes are about 10 times slower compared to localStorage. -- Sending the data to the WASM SQLite process and letting it persist via IndexedDB is slow with over 3 milliseconds per write. - -The OPFS operations take about 1.5 milliseconds to write the JSON data into one document per file. We can see the sending the data to a webworker first is a bit slower which comes from the overhead of serializing and deserializing the data on both sides. -If we would not create on OPFS file per document but instead append everything to a single file, the performance pattern changes significantly. Then the faster file handle from the `createSyncAccessHandle()` only takes about 1 millisecond per write. But this would require to somehow remember at which position the each document is stored. Therefore in our tests we will continue using one file per document. - -### Latency of small Reads - -Now that we have stored some documents, lets measure how long it takes to read single documents by their `id`. - -| Technology | Time in Milliseconds | -| ----------------------- | -------------------- | -| Cookies | 0.132 | -| LocalStorage | 0.0052 | -| IndexedDB | 0.1 | -| OPFS Main Thread | 1.28 | -| OPFS WebWorker | 1.41 | -| WASM SQLite (memory) | 0.45 | -| WASM SQLite (IndexedDB) | 2.93 | - -Here we can notice a few things: - -- LocalStorage reads are **really really fast** with only 0.0052 milliseconds per read. -- The other technologies perform reads in a similar speed to their write latency. - -### Big Bulk Writes - -As next step, lets do some big bulk operations with 200 documents at once. - -| Technology | Time in Milliseconds | -| ----------------------- | -------------------- | -| Cookies | 20.6 | -| LocalStorage | 5.79 | -| IndexedDB | 13.41 | -| OPFS Main Thread | 280 | -| OPFS WebWorker | 104 | -| WASM SQLite (memory) | 19.1 | -| WASM SQLite (IndexedDB) | 37.12 | - -Here we can notice a few things: - -- Sending the data to a WebWorker and running it via the faster OPFS API is about twice as fast. -- WASM SQLite performs better on bulk operations compared to its single write latency. This is because sending the data to WASM and backwards is faster if it is done all at once instead of once per document. - -### Big Bulk Reads - -Now lets read 100 documents in a bulk request. - -| Technology | Time in Milliseconds | -| ----------------------- | ------------------------------- | -| Cookies | 6.34 | -| LocalStorage | 0.39 | -| IndexedDB | 4.99 | -| OPFS Main Thread | 54.79 | -| OPFS WebWorker | 25.61 | -| WASM SQLite (memory) | 3.59 | -| WASM SQLite (IndexedDB) | 5.84 (35ms without cache) | - -Here we can notice a few things: - -- Reading many files in the OPFS webworker is about **twice as fast** compared to the slower main thread mode. -- WASM SQLite is surprisingly fast. Further inspection has shown that the WASM SQLite process keeps the documents in memory cached which improves the latency when we do reads directly after writes on the same data. When the browser tab is reloaded between the writes and the reads, finding the 100 documents takes about **35 milliseconds** instead. - -## Performance Conclusions - -- LocalStorage is really fast but remember that is has some downsides: - - It blocks the main JavaScript process and therefore should not be used for big bulk operations. - - Only Key-Value assignments are possible, you cannot use it efficiently when you need to do index based range queries on your data. -- OPFS is way faster when used in the WebWorker with the `createSyncAccessHandle()` method compare to using it directly in the main thread. -- SQLite WASM can be fast but you have to initially download the full binary and start it up which takes about half a second. This might not be relevant at all if your app is started up once and the used for a very long time. But for web-apps that are opened and closed in many browser tabs many times, this might be a problem. - -------------- - -## Possible Improvements - -There is a wide range of possible improvements and performance hacks to speed up the operations. -- For IndexedDB I have made a list of [performance hacks here](../slow-indexeddb.md). For example you can do sharding between multiple database and webworkers or use a custom index strategy. -- OPFS is slow in writing one file per document. But you do not have to do that and instead you can store everything at a single file like a normal database would do. This improves performance dramatically like it was done with the RxDB [OPFS RxStorage](../rx-storage-opfs.md). -- You can mix up the technologies to optimize for multiple scenarios at once. For example in RxDB there is the [localstorage meta optimizer](../rx-storage-localstorage-meta-optimizer.md) which stores initial metadata in localstorage and "normal" documents inside of IndexedDB. This improves the initial startup time while still having the documents stored in a way to query them efficiently. -- There is the [memory-mapped](../rx-storage-memory-mapped.md) storage plugin in RxDB which maps data directly to memory. Using this in combination with a shared worker can improve pageloads and query time significantly. -- [Compressing](../key-compression.md) data before storing it might improve the performance for some of the storages. -- Splitting work up between [multiple WebWorkers](../rx-storage-worker.md) via [sharding](../rx-storage-sharding.md) can improve performance by utilizing the whole capacity of your users device. - -Here you can see the [performance comparison](../rx-storage-performance.md) of various RxDB storage implementations which gives a better view of real world performance: - -
- -
- -## Future Improvements - -You are reading this in 2024, but the web does not stand still. There is a good chance that browser get enhanced to allow faster and better data operations. - -- Currently there is no way to directly access a persistent storage from inside a WebAssembly process. If this changes in the future, running SQLite (or a similar database) in a browser might be the best option. -- Sending data between the main thread and a WebWorker is slow but might be improved in the future. There is a [good article](https://surma.dev/things/is-postmessage-slow/) about why `postMessage()` is slow. -- IndexedDB lately [got support](https://developer.chrome.com/blog/maximum-idb-performance-with-storage-buckets) for storage buckets (chrome only) which might improve performance. - -## Follow Up - -- Share my [announcement tweet](https://x.com/rxdbjs/status/1846145062847062391) --> -- Reproduce the benchmarks at the [github repo](https://github.com/pubkey/localstorage-indexeddb-cookies-opfs-sqlite-wasm) -- Learn how to use RxDB with the [RxDB Quickstart](../quickstart.md) -- Check out the [RxDB github repo](https://github.com/pubkey/rxdb) and leave a star ⭐ diff --git a/docs/articles/localstorage.html b/docs/articles/localstorage.html deleted file mode 100644 index a5c4b5c98df..00000000000 --- a/docs/articles/localstorage.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - -Using localStorage in Modern Applications - A Comprehensive Guide | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Using localStorage in Modern Applications: A Comprehensive Guide

-

When it comes to client-side storage in web applications, the localStorage API stands out as a simple and widely supported solution. It allows developers to store key-value pairs directly in a user's browser. In this article, we will explore the various aspects of the localStorage API, its advantages, limitations, and alternative storage options available for modern applications.

-
JavaScript Database
-

What is the localStorage API?

-

The localStorage API is a built-in feature of web browsers that enables web developers to store small amounts of data persistently on a user's device. It operates on a simple key-value basis, allowing developers to save strings, numbers, and other simple data types. This data remains available even after the user closes the browser or navigates away from the page. The API provides a convenient way to maintain state and store user preferences without relying on server-side storage.

-

Exploring local storage Methods: A Practical Example

-

Let's dive into some hands-on code examples to better understand how to leverage the power of localStorage. The API offers several methods for interaction, including setItem, getItem, removeItem, and clear. Consider the following code snippet:

-
// Storing data using setItem
-localStorage.setItem('username', 'john_doe');
- 
-// Retrieving data using getItem
-const storedUsername = localStorage.getItem('username');
- 
-// Removing data using removeItem
-localStorage.removeItem('username');
- 
-// Clearing all data
-localStorage.clear();
-

Storing Complex Data in JavaScript with JSON Serialization

-

While js localStorage excels at handling simple key-value pairs, it also supports more intricate data storage through JSON serialization. By utilizing JSON.stringify and JSON.parse, you can store and retrieve structured data like objects and arrays. Here's an example of storing a document:

-
const user = {
-  name: 'Alice',
-  age: 30,
-  email: 'alice@example.com'
-};
- 
-// Storing a user object
-localStorage.setItem('user', JSON.stringify(user));
- 
-// Retrieving and parsing the user object
-const storedUser = JSON.parse(localStorage.getItem('user'));
-

Understanding the Limitations of local storage

-

Despite its convenience, localStorage does come with a set of limitations that developers should be aware of:

-
    -
  • Non-Async Blocking API: One significant drawback is that js localStorage operates as a non-async blocking API. This means that any operations performed on localStorage can potentially block the main thread, leading to slower application performance and a less responsive user experience.
  • -
  • Limited Data Structure: Unlike more advanced databases, localStorage is limited to a simple key-value store. This restriction makes it unsuitable for storing complex data structures or managing relationships between data elements.
  • -
  • Stringification Overhead: Storing JSON data in localStorage requires stringifying the data before storage and parsing it when retrieved. This process introduces performance overhead, potentially slowing down operations by up to 10 times.
  • -
  • Lack of Indexing: localStorage lacks indexing capabilities, making it challenging to perform efficient searches or iterate over data based on specific criteria. This limitation can hinder applications that rely on complex data retrieval.
  • -
  • Tab Blocking: In a multi-tab environment, one tab's localStorage operations can impact the performance of other tabs by monopolizing CPU resources. You can reproduce this behavior by opening this test file in two browser windows and trigger localstorage inserts in one of them. You will observe that the indication spinner will stuck in both windows.
  • -
  • Storage Limit: Browsers typically impose a storage limit of around 5 MiB for each origin's localStorage.
  • -
-

Reasons to Still Use localStorage

-

Is localStorage Slow?

-

Contrary to concerns about performance, the localStorage API in JavaScript is surprisingly fast when compared to alternative storage solutions like IndexedDB or OPFS. It excels in handling small key-value assignments efficiently. Due to its simplicity and direct integration with browsers, accessing and modifying localStorage data incur minimal overhead. For scenarios where quick and straightforward data storage is required, localStorage remains a viable option. For example RxDB uses localStorage in the localStorage meta optimizer to manage simple key values pairs while storing the "normal" documents inside of another storage like IndexedDB.

-

When Not to Use localStorage

-

While localStorage offers convenience, it may not be suitable for every use case. Consider the following situations where alternatives might be more appropriate:

-
    -
  • Data Must Be Queryable: If your application relies heavily on querying data based on specific criteria, localStorage might not provide the necessary querying capabilities. Complex data retrieval might lead to inefficient code and slow performance.
  • -
  • Big JSON Documents: Storing large JSON documents in localStorage can consume a significant amount of memory and degrade performance. It's essential to assess the size of the data you intend to store and consider more robust solutions for handling substantial datasets.
  • -
  • Many Read/Write Operations: Excessive read and write operations on localStorage can lead to performance bottlenecks. Other storage solutions might offer better performance and scalability for applications that require frequent data manipulation.
  • -
  • Lack of Persistence: If your application can function without persistent data across sessions, consider using in-memory data structures like new Map() or new Set(). These options offer speed and efficiency for transient data.
  • -
-

What to use instead of the localStorage API in JavaScript

-

localStorage vs IndexedDB

-

While localStorage serves as a reliable storage solution for simpler data needs, it's essential to explore alternatives like IndexedDB when dealing with more complex requirements. IndexedDB is designed to store not only key-value pairs but also JSON documents. Unlike localStorage, which usually has a storage limit of around 5-10MB per domain, IndexedDB can handle significantly larger datasets. IndexDB with its support for indexing facilitates efficient querying, making range queries possible. However, it's worth noting that IndexedDB lacks observability, which is a feature unique to localStorage through the storage event. Also, -complex queries can pose a challenge with IndexedDB, and while its performance is acceptable, IndexedDB can be too slow for some use cases.

-
// localStorage can observe changes with the storage event.
-// This feature is missing in IndexedDB
-addEventListener("storage", (event) => {});
-

For those looking to harness the full power of IndexedDB with added capabilities, using wrapper libraries like RxDB is recommended. These libraries augment IndexedDB with features such as complex queries and observability, enhancing its usability for modern applications by providing a real database instead of only a key-value store.

-
RxDB
-

In summary when you compare IndexedDB vs localStorage, IndexedDB will win at any case where much data is handled while localStorage has better performance on small key-value datasets.

-

File System API (OPFS)

-

Another intriguing option is the OPFS (File System API). This API provides direct access to an origin-based, sandboxed filesystem which is highly optimized for performance and offers in-place write access to its content. -OPFS offers impressive performance benefits. However, working with the OPFS API can be complex, and it's only accessible within a WebWorker. To simplify its usage and extend its capabilities, consider using a wrapper library like RxDB's OPFS RxStorage, which builds a comprehensive database on top of the OPFS API. This abstraction allows you to harness the power of the OPFS API without the intricacies of direct usage.

-

localStorage vs Cookies

-

Cookies, once a primary method of client-side data storage, have fallen out of favor in modern web development due to their limitations. While they can store data, they are about 100 times slower when compared to the localStorage API. Additionally, cookies are included in the HTTP header, which can impact network performance. As a result, cookies are not recommended for data storage purposes in contemporary web applications.

-

localStorage vs WebSQL

-

WebSQL, despite offering a SQL-based interface for client-side data storage, is a deprecated technology and should be avoided. Its API has been phased out of modern browsers, and it lacks the robustness of alternatives like IndexedDB. Moreover, WebSQL tends to be around 10 times slower than IndexedDB, making it a suboptimal choice for applications that demand efficient data manipulation and retrieval.

-

localStorage vs sessionStorage

-

In scenarios where data persistence beyond a session is unnecessary, developers often turn to sessionStorage. This storage mechanism retains data only for the duration of a tab or browser session. It survives page reloads and restores, providing a handy solution for temporary data needs. However, it's important to note that sessionStorage is limited in scope and may not suit all use cases.

-

AsyncStorage for React Native

-

For React Native developers, the AsyncStorage API is the go-to solution, mirroring the behavior of localStorage but with asynchronous support. Since not all JavaScript runtimes support localStorage, AsyncStorage offers a seamless alternative for data persistence in React Native applications.

-

node-localstorage for Node.js

-

Because native localStorage is absent in the Node.js JavaScript runtime, you will get the error ReferenceError: localStorage is not defined in Node.js or node based runtimes like Next.js. The node-localstorage npm package bridges the gap. This package replicates the browser's localStorage API within the Node.js environment, ensuring consistent and compatible data storage capabilities.

-

localStorage in browser extensions

-

While browser extensions for chrome and firefox support the localStorage API, it is not recommended to use it in that context to store extension-related data. The browser will clear the data in many scenarios like when the users clear their browsing history.

-

Instead the Extension Storage API should be used for browser extensions. -In contrast to localStorage, the storage API works async and all operations return a Promise. Also it provides automatic sync to replicate data between all instances of that browser that the user is logged into. The storage API is even able to storage JSON-ifiable objects instead of plain strings.

-
// Using the storage API in chrome
- 
-await chrome.storage.local.set({ foobar: {nr: 1} });
- 
-const result = await chrome.storage.local.get('foobar');
-console.log(result.foobar); // {nr: 1}
-

localStorage in Deno and Bun

-

The Deno JavaScript runtime has a working localStorage API so running localStorage.setItem() and the other methods, will just work and the locally stored data is persisted across multiple runs.

-

Bun does not support the localStorage JavaScript API. Trying to use localStorage will error with ReferenceError: Can't find variable: localStorage. To store data locally in Bun, you could use the bun:sqlite module instead or directly use a in-JavaScript database with Bun support like RxDB.

-

Conclusion: Choosing the Right Storage Solution

-

In the world of modern web development, localStorage serves as a valuable tool for lightweight data storage. Its simplicity and speed make it an excellent choice for small key-value assignments. However, as application complexity grows, developers must assess their storage needs carefully. For scenarios that demand advanced querying, complex data structures, or high-volume operations, alternatives like IndexedDB, wrapper libraries with additional features like RxDB, or platform-specific APIs offer more robust solutions. By understanding the strengths and limitations of various storage options, developers can make informed decisions that pave the way for efficient and scalable applications.

-

Follow up

-
- - \ No newline at end of file diff --git a/docs/articles/localstorage.md b/docs/articles/localstorage.md deleted file mode 100644 index faa3a99ac6f..00000000000 --- a/docs/articles/localstorage.md +++ /dev/null @@ -1,153 +0,0 @@ -# Using localStorage in Modern Applications - A Comprehensive Guide - -> This guide explores localStorage in JavaScript web apps, detailing its usage, limitations, and alternatives like IndexedDB and AsyncStorage. - -# Using localStorage in Modern Applications: A Comprehensive Guide - -When it comes to client-side storage in web applications, the localStorage API stands out as a simple and widely supported solution. It allows developers to store key-value pairs directly in a user's browser. In this article, we will explore the various aspects of the localStorage API, its advantages, limitations, and alternative storage options available for modern applications. - -
- - - -
- -## What is the localStorage API? - -The localStorage API is a built-in feature of web browsers that enables web developers to store small amounts of data persistently on a user's device. It operates on a simple key-value basis, allowing developers to save strings, numbers, and other simple data types. This data remains available even after the user closes the browser or navigates away from the page. The API provides a convenient way to maintain state and store user preferences without relying on server-side storage. - -## Exploring local storage Methods: A Practical Example - -Let's dive into some hands-on code examples to better understand how to leverage the power of localStorage. The API offers several methods for interaction, including setItem, getItem, removeItem, and clear. Consider the following code snippet: - -```js -// Storing data using setItem -localStorage.setItem('username', 'john_doe'); - -// Retrieving data using getItem -const storedUsername = localStorage.getItem('username'); - -// Removing data using removeItem -localStorage.removeItem('username'); - -// Clearing all data -localStorage.clear(); -``` - -## Storing Complex Data in JavaScript with JSON Serialization - -While js localStorage excels at handling simple key-value pairs, it also supports more intricate data storage through JSON serialization. By utilizing JSON.stringify and JSON.parse, you can store and retrieve structured data like objects and arrays. Here's an example of storing a document: - -```js -const user = { - name: 'Alice', - age: 30, - email: 'alice@example.com' -}; - -// Storing a user object -localStorage.setItem('user', JSON.stringify(user)); - -// Retrieving and parsing the user object -const storedUser = JSON.parse(localStorage.getItem('user')); -``` - -## Understanding the Limitations of local storage - -Despite its convenience, localStorage does come with a set of limitations that developers should be aware of: - -- **Non-Async Blocking API**: One significant drawback is that js localStorage operates as a non-async blocking API. This means that any operations performed on localStorage can potentially block the main thread, leading to slower application performance and a less responsive user experience. -- **Limited Data Structure**: Unlike more advanced databases, localStorage is limited to a simple key-value store. This restriction makes it unsuitable for storing complex data structures or managing relationships between data elements. -- **Stringification Overhead**: Storing [JSON data](./json-based-database.md) in localStorage requires stringifying the data before storage and parsing it when retrieved. This process introduces performance overhead, potentially slowing down operations by up to 10 times. -- **Lack of Indexing**: localStorage lacks indexing capabilities, making it challenging to perform efficient searches or iterate over data based on specific criteria. This limitation can hinder applications that rely on complex data retrieval. -- **Tab Blocking**: In a multi-tab environment, one tab's localStorage operations can impact the performance of other tabs by monopolizing CPU resources. You can reproduce this behavior by opening [this test file](https://pubkey.github.io/client-side-databases/database-comparison/index.html) in two browser windows and trigger localstorage inserts in one of them. You will observe that the indication spinner will stuck in both windows. -- **Storage Limit**: Browsers typically impose a storage limit of [around 5 MiB](https://developer.mozilla.org/en-US/docs/Web/API/Storage_API/Storage_quotas_and_eviction_criteria#web_storage) for each origin's localStorage. - -## Reasons to Still Use localStorage - -### Is localStorage Slow? - -Contrary to concerns about performance, the localStorage API in JavaScript is surprisingly fast when compared to alternative storage solutions like [IndexedDB or OPFS](./localstorage-indexeddb-cookies-opfs-sqlite-wasm.md). It excels in handling small key-value assignments efficiently. Due to its simplicity and direct integration with browsers, accessing and modifying localStorage data incur minimal overhead. For scenarios where quick and straightforward data storage is required, localStorage remains a viable option. For example RxDB uses localStorage in the [localStorage meta optimizer](../rx-storage-localstorage-meta-optimizer.md) to manage simple key values pairs while storing the "normal" documents inside of another storage like IndexedDB. - -## When Not to Use localStorage - -While localStorage offers convenience, it may not be suitable for every use case. Consider the following situations where alternatives might be more appropriate: - -- **Data Must Be Queryable**: If your application relies heavily on querying data based on specific criteria, localStorage might not provide the necessary querying capabilities. Complex data retrieval might lead to inefficient code and slow performance. -- **Big JSON Documents**: Storing large JSON documents in localStorage can consume a significant amount of memory and degrade performance. It's essential to assess the size of the data you intend to store and consider more robust solutions for handling substantial datasets. -- **Many Read/Write Operations**: Excessive read and write operations on localStorage can lead to performance bottlenecks. Other storage solutions might offer better performance and scalability for applications that require frequent data manipulation. -- **Lack of Persistence**: If your application can function without persistent data across sessions, consider using in-memory data structures like `new Map()` or `new Set()`. These options offer speed and efficiency for transient data. - -## What to use instead of the localStorage API in JavaScript - -### localStorage vs IndexedDB - -While **localStorage** serves as a reliable storage solution for simpler data needs, it's essential to explore alternatives like **IndexedDB** when dealing with more complex requirements. **IndexedDB** is designed to store not only key-value pairs but also JSON documents. Unlike localStorage, which usually has a storage limit of around 5-10MB per domain, IndexedDB can handle significantly larger datasets. IndexDB with its support for indexing facilitates efficient querying, making range queries possible. However, it's worth noting that IndexedDB lacks observability, which is a feature unique to localStorage through the `storage` event. Also, -complex queries can pose a challenge with IndexedDB, and while its performance is acceptable, IndexedDB can be [too slow](../slow-indexeddb.md) for some use cases. - -```js -// localStorage can observe changes with the storage event. -// This feature is missing in IndexedDB -addEventListener("storage", (event) => {}); -``` - -For those looking to harness the full power of IndexedDB with added capabilities, using wrapper libraries like [RxDB](https://rxdb.info/) is recommended. These libraries augment IndexedDB with features such as complex queries and observability, enhancing its usability for modern applications by providing a real database instead of only a key-value store. - -
- - - -
- -In summary when you compare IndexedDB vs localStorage, IndexedDB will win at any case where much data is handled while localStorage has better performance on small key-value datasets. - -### File System API (OPFS) -Another intriguing option is the OPFS (File System API). This API provides direct access to an origin-based, sandboxed filesystem which is highly optimized for performance and offers in-place write access to its content. -OPFS offers impressive performance benefits. However, working with the OPFS API can be complex, and it's only accessible within a **WebWorker**. To simplify its usage and extend its capabilities, consider using a wrapper library like [RxDB's OPFS RxStorage](../rx-storage-opfs.md), which builds a comprehensive database on top of the OPFS API. This abstraction allows you to harness the power of the OPFS API without the intricacies of direct usage. - -### localStorage vs Cookies -Cookies, once a primary method of client-side data storage, have fallen out of favor in modern web development due to their limitations. While they can store data, they are about **100 times slower** when compared to the localStorage API. Additionally, cookies are included in the HTTP header, which can impact network performance. As a result, cookies are not recommended for data storage purposes in contemporary web applications. - -### localStorage vs WebSQL -WebSQL, despite offering a SQL-based interface for client-side data storage, is a **deprecated technology** and should be avoided. Its API has been phased out of modern browsers, and it lacks the robustness of alternatives like IndexedDB. Moreover, WebSQL tends to be around 10 times slower than IndexedDB, making it a suboptimal choice for applications that demand efficient data manipulation and retrieval. - -### localStorage vs sessionStorage -In scenarios where data persistence beyond a session is unnecessary, developers often turn to sessionStorage. This storage mechanism retains data only for the duration of a tab or browser session. It survives page reloads and restores, providing a handy solution for temporary data needs. However, it's important to note that sessionStorage is limited in scope and may not suit all use cases. - -### AsyncStorage for React Native -For React Native developers, the [AsyncStorage API](https://reactnative.dev/docs/asyncstorage) is the go-to solution, mirroring the behavior of localStorage but with asynchronous support. Since not all JavaScript runtimes support localStorage, AsyncStorage offers a seamless alternative for data persistence in React Native applications. - -### `node-localstorage` for Node.js - -Because native localStorage is absent in the **Node.js** JavaScript runtime, you will get the error `ReferenceError: localStorage is not defined` in Node.js or node based runtimes like Next.js. The [node-localstorage npm package](https://github.com/lmaccherone/node-localstorage) bridges the gap. This package replicates the browser's localStorage API within the Node.js environment, ensuring consistent and compatible data storage capabilities. - -## localStorage in browser extensions - -While browser extensions for chrome and firefox support the localStorage API, it is not recommended to use it in that context to store extension-related data. The browser will clear the data in many scenarios like when the users clear their browsing history. - -Instead the [Extension Storage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage#properties) should be used for browser extensions. -In contrast to localStorage, the storage API works `async` and all operations return a Promise. Also it provides automatic sync to replicate data between all instances of that browser that the user is logged into. The storage API is even able to storage JSON-ifiable objects instead of plain strings. - -```ts -// Using the storage API in chrome - -await chrome.storage.local.set({ foobar: {nr: 1} }); - -const result = await chrome.storage.local.get('foobar'); -console.log(result.foobar); // {nr: 1} -``` - -## localStorage in Deno and Bun - -The **Deno** JavaScript runtime has a working localStorage API so running `localStorage.setItem()` and the other methods, will just work and the locally stored data is persisted across multiple runs. - -**Bun** does not support the localStorage JavaScript API. Trying to use `localStorage` will error with `ReferenceError: Can't find variable: localStorage`. To store data locally in Bun, you could use the `bun:sqlite` module instead or directly use a in-JavaScript database with Bun support like [RxDB](https://rxdb.info/). - -## Conclusion: Choosing the Right Storage Solution -In the world of modern web development, **localStorage** serves as a valuable tool for lightweight data storage. Its simplicity and speed make it an excellent choice for small key-value assignments. However, as application complexity grows, developers must assess their storage needs carefully. For scenarios that demand advanced querying, complex data structures, or high-volume operations, alternatives like IndexedDB, wrapper libraries with additional features like [RxDB](../), or platform-specific APIs offer more robust solutions. By understanding the strengths and limitations of various storage options, developers can make informed decisions that pave the way for efficient and scalable applications. - -## Follow up - -- Learn how to store and query data with RxDB in the [RxDB Quickstart](../quickstart.md) -- [Why IndexedDB is slow and how to fix it](../slow-indexeddb.md) -- [RxStorage performance comparison](../rx-storage-performance.md) diff --git a/docs/articles/mobile-database.html b/docs/articles/mobile-database.html deleted file mode 100644 index ee021606f54..00000000000 --- a/docs/articles/mobile-database.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - -Real-Time & Offline - RxDB for Mobile Apps | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Mobile Database - RxDB as Database for Mobile Applications

-

In today's digital landscape, mobile applications have become an integral part of our lives. From social media platforms to e-commerce solutions, mobile apps have transformed the way we interact with digital services. At the heart of any mobile app lies the database, a critical component responsible for storing, retrieving, and managing data efficiently. In this article, we will delve into the world of mobile databases, exploring their significance, challenges, and the emergence of RxDB as a powerful database solution for hybrid app development in frameworks like React Native and Capacitor.

-

Understanding Mobile Databases

-

Mobile databases are specialized software systems designed to handle data storage and management for mobile applications. These databases are optimized for the unique requirements of mobile environments, which often include limited device resources, fluctuations in network connectivity, and the need for offline functionality.

-

There are various types of mobile databases available, each with its own strengths and use cases. Local databases, such as SQLite and Realm, reside directly on the user's device, providing offline capabilities and faster data access. Cloud-based databases, like Firebase Realtime Database and Amazon DynamoDB, rely on remote servers to store and retrieve data, enabling synchronization across multiple devices. Hybrid databases, as the name suggests, combine the benefits of both local and cloud-based approaches, offering a balance between offline functionality and data synchronization.

-

Introducing RxDB: A Paradigm Shift in Mobile Database Solutions

-
Mobile Database
-

RxDB, also known as Reactive Database, has emerged as a game-changer in the realm of mobile databases. Built on top of popular web technologies like JavaScript, TypeScript, and RxJS (Reactive Extensions for JavaScript), RxDB provides an elegant solution for seamless offline-first capabilities and real-time data synchronization in mobile applications.

-

Benefits of RxDB for Hybrid App Development

-
    -
  1. -

    Offline-First Approach: One of the major advantages of RxDB is its ability to work in an offline mode. It allows mobile applications to store and access data locally, ensuring uninterrupted functionality even when the network connection is weak or unavailable. The database automatically syncs the data with the server once the connection is reestablished, guaranteeing data consistency.

    -
  2. -
  3. -

    Real-Time Data Synchronization: RxDB leverages the power of real-time data synchronization, making it an excellent choice for applications that require collaborative features or live updates. It uses the concept of change streams to detect modifications made to the database and instantly propagates those changes across connected devices. This real-time synchronization enables seamless collaboration and enhances user experience.

    -
  4. -
  5. -

    Reactive Programming Paradigm: RxDB embraces the principles of reactive programming, which simplifies the development process by handling asynchronous events and data streams. By leveraging RxJS observables, developers can write concise, declarative code that reacts to changes in data, ensuring a highly responsive user experience. The reactive programming paradigm enhances code maintainability, scalability, and testability.

    -
  6. -
  7. -

    Easy Integration with Hybrid App Frameworks: RxDB seamlessly integrates with popular hybrid app development frameworks like React Native and Capacitor. This compatibility allows developers to leverage the existing ecosystem and tools of these frameworks, making the transition to RxDB smoother and more efficient. By utilizing RxDB within these frameworks, developers can harness the power of a robust database solution without sacrificing the advantages of hybrid app development.

    -
  8. -
  9. -

    Cross-Platform Support: RxDB enables developers to build cross-platform mobile applications that run seamlessly on both iOS and Android devices. This versatility eliminates the need for separate database implementations for different platforms, saving development time and effort. With RxDB, developers can focus on building a unified codebase and delivering a consistent user experience across platforms.

    -
  10. -
-

Use Cases for RxDB in Hybrid App Development

-
    -
  1. -

    Offline-First Applications: RxDB is an ideal choice for applications that heavily rely on offline functionality. Whether it's a note-taking app, a task manager, or a survey application, RxDB ensures that users can continue working even when connectivity is compromised. The seamless synchronization capabilities of RxDB ensure that changes made offline are automatically propagated once the device reconnects to the internet.

    -
  2. -
  3. -

    Real-Time Collaboration: Applications that require real-time collaboration, such as messaging platforms or collaborative editing tools, can greatly benefit from RxDB. The real-time synchronization capabilities enable multiple users to work on the same data simultaneously, ensuring that everyone sees the latest updates in real-time.

    -
  4. -
  5. -

    Data-Intensive Applications: RxDB's performance and scalability make it suitable for data-intensive applications that handle large datasets or complex data structures. Whether it's a media-rich app, a data visualization tool, or an analytics platform, RxDB can handle the heavy lifting and provide a smooth user experience.

    -
  6. -
  7. -

    Cross-Platform Applications: Hybrid app frameworks like React Native and Capacitor have gained popularity due to their ability to build cross-platform applications. By utilizing RxDB within these frameworks, developers can create a unified codebase that runs seamlessly on both iOS and Android, significantly reducing development time and effort.

    -
  8. -
-

Conclusion

-

Mobile databases play a vital role in the performance and functionality of mobile applications. RxDB, with its offline-first approach, real-time data synchronization, and seamless integration with hybrid app development frameworks like React Native and Capacitor, offers a robust solution for managing data in mobile apps. By leveraging the power of reactive programming, RxDB empowers developers to build highly responsive, scalable, and cross-platform applications that deliver an exceptional user experience. With its versatility and ease of use, RxDB is undoubtedly a database solution worth considering for hybrid app development. Embrace the power of RxDB and unlock the full potential of your mobile applications.

- - \ No newline at end of file diff --git a/docs/articles/mobile-database.md b/docs/articles/mobile-database.md deleted file mode 100644 index 9dc61869a9e..00000000000 --- a/docs/articles/mobile-database.md +++ /dev/null @@ -1,49 +0,0 @@ -# Real-Time & Offline - RxDB for Mobile Apps - -> Explore RxDB as your reliable mobile database. Enjoy offline-first capabilities, real-time sync, and seamless integration for hybrid app development. - -# Mobile Database - RxDB as Database for Mobile Applications - -In today's digital landscape, mobile applications have become an integral part of our lives. From social media platforms to e-commerce solutions, mobile apps have transformed the way we interact with digital services. At the heart of any mobile app lies the database, a critical component responsible for storing, retrieving, and managing data efficiently. In this article, we will delve into the world of mobile databases, exploring their significance, challenges, and the emergence of [RxDB](https://rxdb.info/) as a powerful database solution for hybrid app development in frameworks like React Native and Capacitor. - -## Understanding Mobile Databases - -Mobile databases are specialized software systems designed to handle data storage and management for mobile applications. These databases are optimized for the unique requirements of mobile environments, which often include limited device resources, fluctuations in network connectivity, and the need for offline functionality. - -There are various types of mobile databases available, each with its own strengths and use cases. Local databases, such as SQLite and Realm, reside directly on the user's device, providing offline capabilities and faster data access. Cloud-based databases, like [Firebase Realtime Database](./realtime-database.md) and Amazon DynamoDB, rely on remote servers to store and retrieve data, enabling synchronization across multiple devices. Hybrid databases, as the name suggests, combine the benefits of both local and cloud-based approaches, offering a balance between offline functionality and data synchronization. - -## Introducing RxDB: A Paradigm Shift in Mobile Database Solutions - -
- - - -
- -[RxDB](https://rxdb.info/), also known as Reactive Database, has emerged as a game-changer in the realm of mobile databases. Built on top of popular web technologies like JavaScript, TypeScript, and RxJS (Reactive Extensions for JavaScript), RxDB provides an elegant solution for seamless offline-first capabilities and real-time data synchronization in mobile applications. - -Benefits of RxDB for Hybrid App Development - -1. Offline-First Approach: One of the major advantages of RxDB is its ability to work in an offline mode. It allows mobile applications to store and access data locally, ensuring uninterrupted functionality even when the network connection is weak or unavailable. The database automatically syncs the data with the server once the connection is reestablished, guaranteeing data consistency. - -2. [Real-Time Data Synchronization](../replication.md): RxDB leverages the power of real-time data synchronization, making it an excellent choice for applications that require collaborative features or live updates. It uses the concept of change streams to detect modifications made to the database and instantly propagates those changes across connected devices. This real-time synchronization enables seamless collaboration and enhances user experience. - -3. Reactive Programming Paradigm: RxDB embraces the principles of reactive programming, which simplifies the development process by handling asynchronous events and data streams. By leveraging RxJS observables, developers can write concise, declarative code that reacts to changes in data, ensuring a highly responsive user experience. The reactive programming paradigm enhances code maintainability, scalability, and testability. - -4. Easy Integration with Hybrid App Frameworks: RxDB seamlessly integrates with popular hybrid app development frameworks like [React Native](../react-native-database.md) and [Capacitor](../capacitor-database.md). This compatibility allows developers to leverage the existing ecosystem and tools of these frameworks, making the transition to RxDB smoother and more efficient. By utilizing RxDB within these frameworks, developers can harness the power of a robust database solution without sacrificing the advantages of hybrid app development. - -5. Cross-Platform Support: RxDB enables developers to build cross-platform mobile applications that run seamlessly on both iOS and Android devices. This versatility eliminates the need for separate database implementations for different platforms, saving development time and effort. With RxDB, developers can focus on building a unified codebase and delivering a consistent user experience across platforms. - -## Use Cases for RxDB in Hybrid App Development - -1. [Offline-First Applications](../offline-first.md): [RxDB](https://rxdb.info/) is an ideal choice for applications that heavily rely on offline functionality. Whether it's a note-taking app, a task manager, or a survey application, RxDB ensures that users can continue working even when connectivity is compromised. The seamless synchronization capabilities of RxDB ensure that changes made offline are automatically propagated once the device reconnects to the internet. - -2. Real-Time Collaboration: Applications that require real-time collaboration, such as messaging platforms or collaborative editing tools, can greatly benefit from RxDB. The real-time synchronization capabilities enable multiple users to work on the same data simultaneously, ensuring that everyone sees the latest updates in real-time. - -3. Data-Intensive Applications: RxDB's performance and scalability make it suitable for data-intensive applications that handle large datasets or complex data structures. Whether it's a media-rich app, a data visualization tool, or an analytics platform, RxDB can handle the heavy lifting and provide a smooth user experience. - -4. Cross-Platform Applications: Hybrid app frameworks like React Native and Capacitor have gained popularity due to their ability to build cross-platform applications. By utilizing RxDB within these frameworks, developers can create a unified codebase that runs seamlessly on both iOS and Android, significantly reducing development time and effort. - -## Conclusion - -Mobile databases play a vital role in the performance and functionality of mobile applications. RxDB, with its offline-first approach, real-time data synchronization, and seamless integration with hybrid app development frameworks like React Native and Capacitor, offers a robust solution for managing data in mobile apps. By leveraging the power of reactive programming, RxDB empowers developers to build highly responsive, scalable, and cross-platform applications that deliver an exceptional user experience. With its versatility and ease of use, RxDB is undoubtedly a database solution worth considering for hybrid app development. Embrace the power of RxDB and unlock the full potential of your mobile applications. diff --git a/docs/articles/offline-database.html b/docs/articles/offline-database.html deleted file mode 100644 index 5e39c99b5bf..00000000000 --- a/docs/articles/offline-database.html +++ /dev/null @@ -1,210 +0,0 @@ - - - - - -RxDB – The Ultimate Offline Database with Sync and Encryption | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RxDB – The Ultimate Offline Database with Sync and Encryption

-

When building modern applications, a reliable offline database can make all the difference. Users need fast, uninterrupted access to data, even without an internet connection, and they need that data to stay secure. RxDB meets these requirements by providing a local-first architecture, real-time sync to any backend, and optional encryption for sensitive fields.

-

In this article, we'll cover:

-
    -
  • Why an offline database approach significantly improves user experience
  • -
  • How RxDB’s sync and encryption features work
  • -
  • Step-by-step guidance on getting started
  • -
-
-

Why Choose an Offline Database?

-

Offline-first or local-first software stores data directly on the client device. This strategy isn’t just about surviving network outages; it also makes your application faster, more user-friendly, and better at handling multiple usage scenarios.

-

1. Zero Loading Spinners

-

Applications that call remote servers for every request inevitably show loading spinners. With an offline database, read and write operations happen locally—providing near-instant feedback. Users no longer stare at progress indicators or wait for server responses, resulting in a smoother and more fluid experience.

-

loading spinner not needed

-

2. Multi-Tab Consistency

-

Many websites mishandle data across multiple browser tabs. In an offline database, all tabs share the same local datastore. If the user updates data in one tab (like completing a to-do item), changes instantly reflect in every other tab. This removes complex multi-window synchronization problems.

-

RxDB multi tab

-

3. Real-Time Data Feeds

-

Apps that rely on a purely server-driven approach often show stale data unless they add a separate real-time push system (like websockets). Local-first solutions with built-in replication essentially get real-time updates “for free.” Once the server sends any changes, your local offline database updates—keeping your UI live and accurate.

-

4. Reduced Server Load

-

In a traditional app, every interaction triggers a request to the server, scaling up resource usage quickly as traffic grows. Offline-first setups replicate data to the client once, and subsequent local reads or writes do not stress the backend. Your server usage grows with the amount of data—rather than every user action—leading to more efficient scaling.

-

5. Simpler Development: Fewer Endpoints, No Extra State Library

-

Typical apps require numerous REST endpoints and possibly a client-side state manager (like Redux) to handle data flow. If you adopt an offline database, you can replicate nearly everything to the client. The local DB becomes your single source of truth, and you may skip advanced state libraries altogether.

-
RxDB
-

Introducing RxDB – A Powerful Offline Database Solution

-

RxDB (Reactive Database) is a NoSQL JavaScript database that lives entirely in your client environment. It’s optimized for:

-
    -
  • Offline-first usage
  • -
  • Reactive queries (your UI updates in real time)
  • -
  • Flexible replication with various backends
  • -
  • Field-level encryption to protect sensitive data
  • -
-

You can run RxDB in:

- -

Wherever your JavaScript executes, RxDB can serve as a robust offline database.

-
-

Quick Setup Example

-

Below is a short demo of how to create an RxDB database, add a collection, and observe a query. You can expand upon this to enable encryption or full sync.

-
import { createRxDatabase } from 'rxdb/plugins/core';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
- 
-async function initDB() {
-  // Create a local offline database
-  const db = await createRxDatabase({
-    name: 'myOfflineDB',
-    storage: getRxStorageLocalstorage()
-  });
- 
-  // Add collections
-  await db.addCollections({
-    tasks: {
-      schema: {
-        title: 'tasks schema',
-        version: 0,
-        type: 'object',
-        primaryKey: 'id',
-        properties: {
-          id: { type: 'string' },
-          title: { type: 'string' },
-          done: { type: 'boolean' }
-        }
-      }
-    }
-  });
- 
-  // Observe changes in real time
-  db.tasks
-    .find({ selector: { done: false } })
-    .$ // returns an observable that emits whenever the result set changes
-    .subscribe(undoneTasks => {
-      console.log('Currently undone tasks:', undoneTasks);
-    });
- 
-  return db;
-}
-

Now the tasks collection is ready to store data offline. You could also replicate it to a backend, encrypt certain fields, or utilize more advanced features like conflict resolution.

-

How Offline Sync Works in RxDB

-

RxDB uses a Sync Engine that pushes local changes to the server and pulls remote updates back down. This ensures local data is always fresh and that the server has the latest offline edits once the device reconnects.

-

Multiple Plugins exist to handle various backends or replication methods:

- -

You pick the plugin that fits your stack, and RxDB handles everything from conflict detection to event emission, allowing you to focus on building your user-facing features.

-
import { replicateRxCollection } from 'rxdb/plugins/replication';
- 
-replicateRxCollection({
-  collection: db.tasks,
-  replicationIdentifier: 'tasks-sync',
-  pull: { /* fetch updates from server */ },
-  push: { /* send local writes to server */ },
-  live: true // keep them in sync constantly
-});
-

Securing Your Offline Database with Encryption

-

Local data can be a risk if it’s sensitive or personal. RxDB offers encryption plugins to keep specific document fields secure at rest.

-

Encryption Example

-
import { createRxDatabase } from 'rxdb/plugins/core';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
-import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js';
- 
-async function initSecureDB() {
-  // Wrap the storage with crypto-js encryption
-  const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({
-    storage: getRxStorageLocalstorage()
-  });
- 
-  // Create database with a password
-  const db = await createRxDatabase({
-    name: 'secureOfflineDB',
-    storage: encryptedStorage,
-    password: 'myTopSecretPassword'
-  });
- 
-  // Define an encrypted collection
-  await db.addCollections({
-    userSecrets: {
-      schema: {
-        title: 'encrypted user data',
-        version: 0,
-        type: 'object',
-        primaryKey: 'id',
-        properties: {
-          id: { type: 'string' },
-          secretData: { type: 'string' }
-        },
-        required: ['id'],
-        encrypted: ['secretData'] // field is encrypted at rest
-      }
-    }
-  });
- 
-  return db;
-}
-

When the device is off or the database file is extracted, secretData remains unreadable without the specified password. This ensures only authorized parties can access sensitive fields, even in offline scenarios.

-

Follow Up

-

Integrating an offline database approach into your app delivers near-instant interactions, true multi-tab data consistency, automatic real-time updates, and reduced server dependencies. By choosing RxDB, you gain:

-
    -
  • Offline-first local storage
  • -
  • Flexible replication to various backends
  • -
  • Encryption of sensitive fields
  • -
  • Reactive queries for real-time UI updates
  • -
-

RxDB transforms how you build and scale apps—no more loading spinners, no more stale data, no more complicated offline handling. Everything is local, synced, and secured.

-

Continue your learning path:

-
    -
  • -

    Explore the RxDB Ecosystem -Dive into additional features like Compression or advanced Conflict Handling to optimize your offline database.

    -
  • -
  • -

    Learn More About Offline-First -Read our Offline First documentation for a deeper understanding of why local-first architectures improve user experience and reduce server load.

    -
  • -
  • -

    Join the Community -Have questions or feedback? Connect with us on the RxDB Chat or open an issue on GitHub.

    -
  • -
  • -

    Upgrade to Premium -If you need high-performance features—like SQLite storage for mobile or the Web Crypto-based encryption plugin—consider our premium offerings.

    -
  • -
-

By adopting an offline database approach with RxDB, you unlock speed, reliability, and security for your applications—leading to a truly seamless user experience.

- - \ No newline at end of file diff --git a/docs/articles/offline-database.md b/docs/articles/offline-database.md deleted file mode 100644 index ae81f0111b6..00000000000 --- a/docs/articles/offline-database.md +++ /dev/null @@ -1,208 +0,0 @@ -# RxDB – The Ultimate Offline Database with Sync and Encryption - -> Discover how RxDB serves as a powerful offline database, offering real-time synchronization, secure encryption, and an offline-first approach for modern web and mobile apps. - -# RxDB – The Ultimate Offline Database with Sync and Encryption - -When building modern applications, a reliable **offline database** can make all the difference. Users need fast, uninterrupted access to data, even without an internet connection, and they need that data to stay secure. **RxDB** meets these requirements by providing a **local-first** architecture, **real-time sync** to any backend, and optional **encryption** for sensitive fields. - -In this article, we'll cover: -- Why an **offline database** approach significantly improves user experience -- How RxDB’s **sync** and **encryption** features work -- Step-by-step guidance on getting started - ---- - -## Why Choose an Offline Database? - -[Offline-first](../offline-first.md) or **local-first** software stores data directly on the client device. This strategy isn’t just about surviving network outages; it also makes your application faster, more user-friendly, and better at handling multiple usage scenarios. - -### 1. Zero Loading Spinners -Applications that call remote servers for every request inevitably show loading spinners. With an offline database, read and write operations happen locally—providing near-instant feedback. Users no longer stare at progress indicators or wait for server responses, resulting in a smoother and more fluid experience. - - - -### 2. Multi-Tab Consistency -Many websites mishandle data across multiple browser tabs. In an offline database, all tabs share the same local datastore. If the user updates data in one tab (like completing a to-do item), changes instantly reflect in every other tab. This removes complex multi-window synchronization problems. - - - -### 3. Real-Time Data Feeds -Apps that rely on a purely server-driven approach often show stale data unless they add a separate real-time push system (like websockets). Local-first solutions with built-in replication essentially get real-time updates “for free.” Once the server sends any changes, your local offline database updates—keeping your UI live and accurate. - -### 4. Reduced Server Load -In a traditional app, every interaction triggers a request to the server, scaling up resource usage quickly as traffic grows. Offline-first setups replicate data to the client once, and subsequent local reads or writes do not stress the backend. Your server usage grows with the amount of data—rather than every user action—leading to more efficient scaling. - -### 5. Simpler Development: Fewer Endpoints, No Extra State Library -Typical apps require numerous REST endpoints and possibly a client-side state manager (like Redux) to handle data flow. If you adopt an offline database, you can replicate nearly everything to the client. The local DB becomes your single source of truth, and you may skip advanced state libraries altogether. - -
- - - -
- -## Introducing RxDB – A Powerful Offline Database Solution - -**RxDB (Reactive Database)** is a **NoSQL** JavaScript database that lives entirely in your client environment. It’s optimized for: - -- **Offline-first usage** -- **Reactive queries** (your UI updates in real time) -- **Flexible replication** with various backends -- **Field-level encryption** to protect sensitive data - -You can run RxDB in: -- **Browsers** ([IndexedDB](../rx-storage-indexeddb.md), [OPFS](../rx-storage-opfs.md)) -- **Mobile hybrid apps** ([Ionic](./ionic-database.md), [Capacitor](../capacitor-database.md)) -- **Native modules** ([React Native](../react-native-database.md)) -- **Desktop environments** ([Electron](../electron-database.md)) -- **Node.js** [Servers](../rx-server.md) or Scripts - -Wherever your JavaScript executes, RxDB can serve as a robust offline database. - ---- - -## Quick Setup Example - -Below is a short demo of how to create an RxDB [database](../rx-database.md), add a [collection](../rx-collection.md), and observe a [query](../rx-query.md). You can expand upon this to enable encryption or full sync. - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -async function initDB() { - // Create a local offline database - const db = await createRxDatabase({ - name: 'myOfflineDB', - storage: getRxStorageLocalstorage() - }); - - // Add collections - await db.addCollections({ - tasks: { - schema: { - title: 'tasks schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string' }, - title: { type: 'string' }, - done: { type: 'boolean' } - } - } - } - }); - - // Observe changes in real time - db.tasks - .find({ selector: { done: false } }) - .$ // returns an observable that emits whenever the result set changes - .subscribe(undoneTasks => { - console.log('Currently undone tasks:', undoneTasks); - }); - - return db; -} -``` - -Now the `tasks` collection is ready to store data offline. You could also [replicate](../replication.md) it to a backend, encrypt certain fields, or utilize more advanced features like conflict resolution. - -## How Offline Sync Works in RxDB - -RxDB uses a [Sync Engine](../replication.md) that pushes local changes to the server and pulls remote updates back down. This ensures local data is always fresh and that the server has the latest offline edits once the device reconnects. - -**Multiple Plugins** exist to handle various backends or replication methods: -- [CouchDB](../replication-couchdb.md) or **PouchDB** -- [Google Firestore](./firestore-alternative.md) -- [GraphQL](../replication-graphql.md) endpoints -- REST / [HTTP](../replication-http.md) -- **WebSocket** or [WebRTC](../replication-webrtc.md) (for peer-to-peer sync) - -You pick the plugin that fits your stack, and RxDB handles everything from conflict detection to event emission, allowing you to focus on building your user-facing features. - -```ts -import { replicateRxCollection } from 'rxdb/plugins/replication'; - -replicateRxCollection({ - collection: db.tasks, - replicationIdentifier: 'tasks-sync', - pull: { /* fetch updates from server */ }, - push: { /* send local writes to server */ }, - live: true // keep them in sync constantly -}); -``` - -## Securing Your Offline Database with Encryption -Local data can be a risk if it’s sensitive or personal. RxDB offers [encryption plugins](../encryption.md) to keep specific document fields secure at rest. - -#### Encryption Example - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; - -async function initSecureDB() { - // Wrap the storage with crypto-js encryption - const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ - storage: getRxStorageLocalstorage() - }); - - // Create database with a password - const db = await createRxDatabase({ - name: 'secureOfflineDB', - storage: encryptedStorage, - password: 'myTopSecretPassword' - }); - - // Define an encrypted collection - await db.addCollections({ - userSecrets: { - schema: { - title: 'encrypted user data', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string' }, - secretData: { type: 'string' } - }, - required: ['id'], - encrypted: ['secretData'] // field is encrypted at rest - } - } - }); - - return db; -} -``` - -When the device is off or the database file is extracted, `secretData` remains unreadable without the specified password. This ensures only authorized parties can access sensitive fields, even in offline scenarios. - -## Follow Up - -Integrating an offline database approach into your app delivers near-instant interactions, true multi-tab data consistency, automatic real-time updates, and reduced server dependencies. By choosing RxDB, you gain: - -- Offline-first local storage -- Flexible replication to various backends -- Encryption of sensitive fields -- Reactive queries for real-time UI updates - -RxDB transforms how you build and scale apps—no more loading spinners, no more stale data, no more complicated offline handling. Everything is local, synced, and secured. - -Continue your learning path: - -- **Explore the RxDB Ecosystem** - Dive into additional features like [Compression](../key-compression.md) or advanced [Conflict Handling](../transactions-conflicts-revisions.md#custom-conflict-handler) to optimize your offline database. - -- **Learn More About Offline-First** - Read our [Offline First documentation](../offline-first.md) for a deeper understanding of why local-first architectures improve user experience and reduce server load. - -- **Join the Community** - Have questions or feedback? Connect with us on the [RxDB Chat](/chat/) or open an issue on [GitHub](/code/). - -- **Upgrade to Premium** - If you need high-performance features—like [SQLite storage](../rx-storage-sqlite.md) for mobile or the [Web Crypto-based encryption plugin](/premium/)—consider our premium offerings. - -By adopting an offline database approach with RxDB, you unlock speed, reliability, and security for your applications—leading to a truly seamless user experience. diff --git a/docs/articles/optimistic-ui.html b/docs/articles/optimistic-ui.html deleted file mode 100644 index bb5435cb7f2..00000000000 --- a/docs/articles/optimistic-ui.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - -Building an Optimistic UI with RxDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Building an Optimistic UI with RxDB

-

An Optimistic User Interface (UI) is a design pattern that provides instant feedback to the user by assuming that an operation or server call will succeed. Instead of showing loading spinners or waiting for server confirmations, the UI immediately reflects the user's intended action and later reconciles the displayed data with the actual server response. This approach drastically improves perceived performance and user satisfaction.

-

Benefits of an Optimistic UI

-

Optimistic UIs offer a host of advantages, from improving the user experience to streamlining the underlying infrastructure. Below are some key reasons why an optimistic approach can revolutionize your application's performance and scalability.

-

Better User Experience with Optimistic UI

-
    -
  • No loading spinners, near-zero latency: Users perceive their actions as instant. Any actual network delays or slow server operations can be handled behind the scenes.
  • -
  • Offline capability: Optimistic UI pairs perfectly with offline-first apps. Users can continue to interact with the application even when offline, and changes will be synced automatically once the network is available again.
  • -
-

loading spinner not needed

-

Better Scaling and Easier to Implement

-
    -
  • Fewer server endpoints: Instead of sending a separate HTTP request for every single user interaction, you can batch updates and sync them in bulk.
  • -
  • Less server load: By handling changes locally and syncing in batches, you reduce the volume of server round-trips.
  • -
  • Automated error handling: If a request fails or a document is in conflict, RxDB's replication mechanism can seamlessly retry and resolve conflicts in the background, without requiring a separate endpoint or manual user intervention.
  • -
-
RxDB Database
-

Building Optimistic UI Apps with RxDB

-

Now that we know what an optimistic UI is, lets build one with RxDB.

-

Local Database: The Backbone of an Optimistic UI

-

A local database is the heart of an Optimistic UI. With RxDB, all application state is stored locally, ensuring seamless and instant updates. You can choose from multiple storage backends based on your runtime - check out RxDB Storage Options to see which engines (IndexedDB, SQLite, or custom) suit your environment best.

-
    -
  • -

    Instant Writes: When users perform an action (like clicking a button or submitting a form), the changes are written directly to the local RxDB database. This immediate local write makes the UI feel snappy and removes the dependency on instantaneous server responses.

    -
  • -
  • -

    Offline-First: Because data is managed locally, your app continues to operate smoothly even without an internet connection. Users can view, create, and update data at any time, assured that changes will sync automatically once they're back online.

    -
  • -
-

Real-Time UI Changes on Updates

-

RxDB's core is built around observables that react to any state changes - whether from local writes or incoming replication from the server.

-
    -
  • Automatic UI refresh: Any query or document subscription in RxDB automatically notifies your UI layer when data changes. There's no need to manually poll or refetch.
  • -
  • Cross-tab updates: If you have the same RxDB database open in multiple browser tabs, changes in one tab instantly propagate to the others.
  • -
-

RxDB multi tab

-
    -
  • Event-Reduce Algorithm: Under the hood, RxDB uses the event-reduce algorithm to minimize overhead. Instead of re-running expensive queries, RxDB calculates the smallest possible updates needed to keep query results accurate - further boosting real-time performance.
  • -
-

Replication with a Server

-

While local storage is key to an Optimistic UI, most applications ultimately need to sync with a remote back end. RxDB offers a powerful replication system that can sync your local data with virtually any server/database in the background:

-
    -
  • Incremental and real-time: RxDB continuously pushes local changes to the server when a network is available and fetches server updates as they happen.
  • -
  • Conflict resolution: If changes happen offline or multiple clients update the same data, RxDB detects conflicts and makes it straightforward to resolve them.
  • -
  • Flexible transport: Beyond simple HTTP polling, you can incorporate WebSockets, Server-Sent Events (SSE), or other protocols for instant, server-confirmed changes broadcast to all connected clients. See this guide to learn more.
  • -
-

By combining local-first data handling with real-time synchronization, RxDB delivers most of what an Optimistic UI needs - right out of the box. The result is a seamless user experience where interactions never feel blocked by slow networks, and any conflicts or final validations are quietly handled in the background.

-

realtime ui updates

-

Handling Offline Changes and Conflicts

-
    -
  • Offline-first approach: All writes are initially stored in the local database. When connectivity returns, RxDB's replication automatically pushes changes to the server.
  • -
  • Conflict resolution: If multiple clients edit the same documents while offline, conflicts are automatically detected and can be resolved gracefully (more on conflicts below).
  • -
-

WebSockets, SSE, or Beyond

-

For truly real-time communication - where server-confirmed changes instantly reach all clients - you can go beyond simple HTTP polling. Use WebSockets, Server-Sent Events (SSE), or other streaming protocols to broadcast updates the moment they occur. This pattern excels in scenarios like chats, collaborative editors, or dynamic dashboards.

-

To learn more about these protocols and their integration with RxDB, check out this guide.

-

Optimistic UI in Various Frameworks

-

Angular Example

-
Angular
-

Angular's async pipe works smoothly with RxDB's observables. Suppose you have a myCollection of documents, you can directly subscribe in the template:

-
<ul *ngIf="(myCollection.find().$ | async) as docs">
-  <li *ngFor="let doc of docs">
-    {{ doc.name }}
-  </li>
-</ul>
-

This snippet:

-
    -
  • Subscribes to myCollection.find().$, which emits live updates whenever documents in the collection change.
  • -
  • Passes the emitted array of documents into docs.
  • -
  • Renders each document in a list item, instantly reflecting any changes.
  • -
-

React Example

-
React
-

In React, you can utilize signals or other state management tools. For instance, if we have an RxDB extension that exposes a signal:

-
import React from 'react';
- 
-function MyComponent({ myCollection }) {
-  // .find().$$ provides a signal that updates whenever data changes
-  const docsSignal = myCollection.find().$$;
- 
-  return (
-    <ul>
-      {docs.map((doc) => (
-        <li key={doc.id}>{doc.name}</li>
-      ))}
-    </ul>
-  );
-}
- 
-export default MyComponent;
-

When you call docsSignal.value or use a hook like useSignal, it pulls the latest value from the RxDB query. Whenever the collection updates, the signal emits the new data, and React re-renders the component instantly.

-

Downsides of Optimistic UI Apps

-

While Optimistic UIs feel snappy, there are some caveats:

-
    -
  • -

    Conflict Resolution: -With an optimistic approach, multiple offline devices might edit the same data. When syncing back, conflicts occur that must be merged. RxDB uses revisions to detect and handle these conflicts.

    -
  • -
  • -

    User Confusion: -Users may see changes that haven't yet been confirmed by the server. If a subsequent server validation fails, the UI must revert to a previous state. Clear visual feedback or user notifications help reduce confusion.

    -
  • -
  • -

    Server Compatibility: -The server must be capable of storing and returning revision metadata (for instance, a timestamp or versioning system). Check out RxDB's replication docs for details on how to structure your back end.

    -
  • -
  • -

    Storage Limits: -Storing data in the client has practical size limits. IndexedDB or other client-side storages have constraints (though usually quite large). See storage comparisons.

    -
  • -
-

Conflict Resolution Strategies

-
    -
  • Last Write to Server Wins: -A simplest-possible method: whatever update reaches the server last overrides previous data. Good for non-critical data like “like" counts or ephemeral states.
  • -
  • Revision-Based Merges: -Use revision numbers or timestamps to track concurrent edits. Merge them intelligently by combining fields or choosing the latest sub-document changes. This is ideal for collaborative apps where you don't want to overwrite entire records.
  • -
  • User Prompts: -In certain workflows (e.g., shipping forms, e-commerce checkout), you may need to notify the user about conflicts and let them choose which version to keep.
  • -
  • First Write to Server Wins (RxDB Default): -RxDB's default approach is to let the first successful push define the latest version. Any incoming push with an outdated revision triggers a conflict that must be resolved on the client side. Learn more at here.
  • -
-

When (and When Not) to Use Optimistic UI

-
    -
  • -

    When to Use

    -
      -
    • Real-time interactions like chat apps, social feeds, or “Likes." -Situations where high success rates of operations are expected (most writes don't fail).
    • -
    • Apps that need an offline-first approach or handle intermittent connectivity gracefully.
    • -
    -
  • -
  • -

    When Not to Use

    -
      -
    • Large, complex transactions with high failure rates.
    • -
    • Scenarios requiring heavy server validations or approvals (for example, financial transactions with complex rules).
    • -
    • Workflows where immediate feedback could mislead users about an operation's success probability.
    • -
    -
  • -
  • -

    Assessing Risk

    -
      -
    • Consider the likelihood that a user's action might fail. If it's very low, optimistic UI is often best.
    • -
    • If frequent failures or complex validations occur, consider a hybrid approach: partial optimistic updates for some actions, while more critical operations rely on immediate server confirmation.
    • -
    -
  • -
-

Follow Up

-

Ready to start building your own Optimistic UI with RxDB? Here are some next steps:

-
    -
  1. -

    Do the RxDB Quickstart -If you're brand new to RxDB, the quickstart guide will walk you through installation and setting up your first project.

    -
  2. -
  3. -

    Check Out the Demo App -A live RxDB Quickstart Demo showcases optimistic updates and real-time syncing. Explore the code to see how it works.

    -
  4. -
  5. -

    Star the GitHub Repo -Show your support for RxDB by starring the RxDB GitHub Repository.

    -
  6. -
-

By combining RxDB's powerful offline-first capabilities with the principles of an Optimistic UI, you can deliver snappy, near-instant user interactions that keep your users engaged - no matter the network conditions. Get started today and give your users the experience they deserve!

- - \ No newline at end of file diff --git a/docs/articles/optimistic-ui.md b/docs/articles/optimistic-ui.md deleted file mode 100644 index 68a3d0286f1..00000000000 --- a/docs/articles/optimistic-ui.md +++ /dev/null @@ -1,178 +0,0 @@ -# Building an Optimistic UI with RxDB - -> Learn how to build an Optimistic UI with RxDB for instant and reliable UI updates on user interactions - -# Building an Optimistic UI with RxDB - -An **Optimistic User Interface (UI)** is a design pattern that provides instant feedback to the user by **assuming** that an operation or server call will succeed. Instead of showing loading spinners or waiting for server confirmations, the UI immediately reflects the user's intended action and later reconciles the displayed data with the actual server response. This approach drastically improves perceived performance and user satisfaction. - -## Benefits of an Optimistic UI - -Optimistic UIs offer a host of advantages, from improving the user experience to streamlining the underlying infrastructure. Below are some key reasons why an optimistic approach can revolutionize your application's performance and scalability. - -### Better User Experience with Optimistic UI -- **No loading spinners, [near-zero latency](./zero-latency-local-first.md)**: Users perceive their actions as instant. Any actual network delays or slow server operations can be handled behind the scenes. -- **Offline capability**: Optimistic UI pairs perfectly with offline-first apps. Users can continue to interact with the application even when offline, and changes will be synced automatically once the network is available again. - - - -### Better Scaling and Easier to Implement -- **Fewer server endpoints**: Instead of sending a separate HTTP request for every single user interaction, you can batch updates and sync them in bulk. -- **Less server load**: By handling changes locally and syncing in batches, you reduce the volume of server round-trips. -- **Automated error handling**: If a request fails or a document is in conflict, RxDB's [replication](../replication.md) mechanism can seamlessly retry and resolve conflicts in the background, without requiring a separate endpoint or manual user intervention. - -
- - - -
- -## Building Optimistic UI Apps with RxDB - -Now that we know what an optimistic UI is, lets build one with RxDB. - -### Local Database: The Backbone of an Optimistic UI - -A local database is the heart of an Optimistic UI. With RxDB, **all application state** is stored locally, ensuring seamless and instant updates. You can choose from multiple storage backends based on your runtime - check out [RxDB Storage Options](../rx-storage.md) to see which engines (IndexedDB, SQLite, or custom) suit your environment best. - -- **Instant Writes**: When users perform an action (like clicking a button or submitting a form), the changes are written directly to the local RxDB database. This immediate local write makes the UI feel snappy and removes the dependency on instantaneous server responses. - -- [Offline-First](../offline-first.md): Because data is managed locally, your app continues to operate smoothly even without an internet connection. Users can view, create, and update data at any time, assured that changes will sync automatically once they're back online. - -### Real-Time UI Changes on Updates - -RxDB's core is built around observables that react to any state changes - whether from local writes or incoming replication from the server. - -- **Automatic UI refresh**: Any query or document subscription in RxDB automatically notifies your UI layer when data changes. There's no need to manually poll or refetch. -- **Cross-tab updates**: If you have the same RxDB database open in multiple [browser](./browser-database.md) tabs, changes in one tab instantly propagate to the others. - - - -- **Event-Reduce Algorithm**: Under the hood, RxDB uses the [event-reduce algorithm](https://github.com/pubkey/event-reduce) to minimize overhead. Instead of re-running expensive queries, RxDB calculates the smallest possible updates needed to keep query results accurate - further boosting real-time performance. - -### Replication with a Server - -While local storage is key to an Optimistic UI, most applications ultimately need to sync with a remote back end. RxDB offers a [powerful replication system](../replication.md) that can sync your local data with virtually any server/database in the background: -- **Incremental and real-time**: RxDB continuously pushes local changes to the server when a network is available and fetches server updates as they happen. -- **Conflict resolution**: If changes happen offline or multiple clients update the same data, RxDB detects conflicts and makes it straightforward to resolve them. -- **Flexible transport**: Beyond simple HTTP polling, you can incorporate WebSockets, Server-Sent Events (SSE), or other protocols for instant, server-confirmed changes broadcast to all connected clients. See [this guide](./websockets-sse-polling-webrtc-webtransport.md) to learn more. - -By combining local-first data handling with real-time synchronization, RxDB delivers most of what an Optimistic UI needs - right out of the box. The result is a seamless user experience where interactions never feel blocked by slow networks, and any conflicts or final validations are quietly handled in the background. - - - -#### Handling Offline Changes and Conflicts -- **Offline-first approach**: All writes are initially stored in the local database. When connectivity returns, RxDB's replication automatically pushes changes to the server. -- **Conflict resolution**: If multiple clients edit the same documents while offline, conflicts are automatically detected and can be resolved gracefully (more on conflicts below). - -#### WebSockets, SSE, or Beyond - -For truly real-time communication - where server-confirmed changes instantly reach all clients - you can go beyond simple HTTP polling. Use WebSockets, Server-Sent Events (SSE), or other streaming protocols to broadcast updates the moment they occur. This pattern excels in scenarios like chats, collaborative editors, or dynamic dashboards. - -To learn more about these protocols and their integration with RxDB, check out [this guide](./websockets-sse-polling-webrtc-webtransport.md). - -## Optimistic UI in Various Frameworks - -### Angular Example -
- -
- -[Angular](./angular-database.md)'s `async` pipe works smoothly with RxDB's observables. Suppose you have a `myCollection` of documents, you can directly subscribe in the template: - -```html - - - {{ doc.name }} - - -``` -This snippet: - -- Subscribes to `myCollection.find().$`, which emits live updates whenever [documents](../rx-document.md) in the [collection](../rx-collection.md) change. -- Passes the emitted array of documents into docs. -- Renders each document in a list item, instantly reflecting any changes. - -### React Example -
- -
- -In [React](./react-database.md), you can utilize signals or other state management tools. For instance, if we have an [RxDB extension](../reactivity.md) that exposes a **signal**: - -```tsx -import React from 'react'; - -function MyComponent({ myCollection }) { - // .find().$$ provides a signal that updates whenever data changes - const docsSignal = myCollection.find().$$; - - return ( - - {docs.map((doc) => ( - {doc.name} - ))} - - ); -} - -export default MyComponent; -``` - -When you call `docsSignal.value` or use a hook like useSignal, it pulls the latest value from the [RxDB query](../rx-query.md). Whenever the collection updates, the signal emits the new data, and React re-renders the component instantly. - -## Downsides of Optimistic UI Apps - -While Optimistic UIs feel snappy, there are some caveats: - -- **Conflict Resolution**: -With an optimistic approach, multiple offline devices might edit the same data. When syncing back, conflicts occur that must be merged. RxDB uses [revisions](../transactions-conflicts-revisions.md) to detect and handle these conflicts. - -- **User Confusion**: -Users may see changes that haven't yet been confirmed by the server. If a subsequent server validation fails, the UI must revert to a previous state. Clear visual feedback or user notifications help reduce confusion. - -- **Server Compatibility**: -The server must be capable of storing and returning revision metadata (for instance, a timestamp or versioning system). Check out RxDB's [replication docs](../replication.md) for details on how to structure your back end. - -- **Storage Limits**: -Storing data in the client has practical [size limits](./indexeddb-max-storage-limit.md). [IndexedDB](../rx-storage-indexeddb.md) or other client-side storages have constraints (though usually quite large). See [storage comparisons](./localstorage-indexeddb-cookies-opfs-sqlite-wasm.md). - -## Conflict Resolution Strategies -- **Last Write to Server Wins**: -A simplest-possible method: whatever update reaches the server last overrides previous data. Good for non-critical data like “like" counts or ephemeral states. -- **Revision-Based Merges**: -Use revision numbers or timestamps to track concurrent edits. Merge them intelligently by combining fields or choosing the latest sub-document changes. This is ideal for collaborative apps where you don't want to overwrite entire records. -- **User Prompts**: -In certain workflows (e.g., shipping forms, e-commerce checkout), you may need to notify the user about conflicts and let them choose which version to keep. -- **First Write to Server Wins (RxDB Default)**: -RxDB's default approach is to let the first successful push define the latest version. Any incoming push with an outdated revision triggers a conflict that must be resolved on the client side. Learn more at [here](../transactions-conflicts-revisions.md). - -## When (and When Not) to Use Optimistic UI -- When to Use - - [Real-time interactions](./realtime-database.md) like chat apps, social feeds, or “Likes." -Situations where high success rates of operations are expected (most writes don't fail). - - Apps that need an [offline-first approach](../offline-first.md) or handle intermittent connectivity gracefully. - -- When Not to Use - - Large, complex transactions with high failure rates. - - Scenarios requiring heavy server validations or approvals (for example, financial transactions with complex rules). - - Workflows where immediate feedback could mislead users about an operation's success probability. - -- Assessing Risk - - Consider the likelihood that a user's action might fail. If it's very low, optimistic UI is often best. - - If frequent failures or complex validations occur, consider a hybrid approach: partial optimistic updates for some actions, while more critical operations rely on immediate server confirmation. - -## Follow Up - -Ready to start building your own Optimistic UI with RxDB? Here are some next steps: - -1. **Do the [RxDB Quickstart](https://rxdb.info/quickstart.html)** - If you're brand new to RxDB, the quickstart guide will walk you through installation and setting up your first project. - -2. **Check Out the Demo App** - A live [RxDB Quickstart Demo](https://pubkey.github.io/rxdb-quickstart/) showcases optimistic updates and real-time syncing. Explore the code to see how it works. - -3. **Star the GitHub Repo** - Show your support for RxDB by starring the [RxDB GitHub Repository](https://github.com/pubkey/rxdb). - -By combining RxDB's powerful offline-first capabilities with the principles of an Optimistic UI, you can deliver snappy, near-instant user interactions that keep your users engaged - no matter the network conditions. Get started today and give your users the experience they deserve! diff --git a/docs/articles/progressive-web-app-database.html b/docs/articles/progressive-web-app-database.html deleted file mode 100644 index 4991a74c7f8..00000000000 --- a/docs/articles/progressive-web-app-database.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - -RxDB as a Database for Progressive Web Apps (PWA) | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RxDB as a Database for Progressive Web Apps (PWA)

-

Progressive Web Apps (PWAs) have revolutionized the digital landscape, offering users an immersive blend of web and native app experiences. At the heart of every successful PWA lies effective data management, and this is where RxDB comes into play. In this article, we'll explore the dynamic synergy between RxDB, a robust client-side database, and Progressive Web Apps, uncovering how RxDB enhances data handling, synchronization, and overall performance, propelling PWAs into a new era of excellence.

-

What is a Progressive Web App

-

Progressive Web Apps are the future of web development, seamlessly combining the best of both web and mobile app worlds. They can be easily installed on the user's home screen, function offline, and load at lightning speed. Unlike hybrid apps, PWAs offer a consistent user experience across platforms, making them a versatile choice for modern applications.

-

PWAs bring a plethora of advantages to the table. They eliminate the hassle of app store installations and updates, reduce dependency on network connectivity, and prioritize fast loading times. By harnessing the power of service workers and intelligent caching mechanisms, PWAs ensure users can access content even in offline mode. Furthermore, PWAs are device-agnostic, seamlessly adapting to various devices, from desktops to smartphones.

-

Introducing RxDB as a Client-Side Database for PWAs

-

At the heart of PWAs lies efficient data management, and RxDB steps in as a reliable ally. As a client-side NoSQL database, RxDB seamlessly integrates into web applications, offering real-time data synchronization and manipulation capabilities. This article sheds light on the transformative potential of RxDB as it collaborates harmoniously with PWAs, enabling local-first strategies and elevating user interactions to a whole new level.

-
Progressive Web App Database
-

Getting Started with RxDB

-

RxDB emerges as a reactive, schema-based NoSQL database crafted explicitly for client-side applications. Its real-time data synchronization and responsiveness align seamlessly with the dynamic demands of modern PWAs.

-

Local-First Approach

-

The cornerstone of RxDB's philosophy is the local-first approach, empowering PWAs to prioritize data storage and manipulation on the client side. This paradigm ensures that PWAs remain functional even when offline, allowing users to access and interact with data seamlessly. RxDB bridges any gaps in data synchronization once network connectivity is restored.

-

Observable Queries

-

Observable queries (aka Live-Queries) serve as the engine of RxDB's dynamic capabilities. By leveraging these queries, PWAs can monitor and respond to data changes in real time. The result is an engaging user interface with instantaneous updates that captivate users and keep them engaged.

-
await db.heroes.find({
-  selector: {
-    healthpoints: {
-      $gt: 0
-    }
-  }
-})
-.$ // the $ returns an observable that emits each time the result set of the query changes
-.subscribe(aliveHeroes => console.dir(aliveHeroes));
-

Multi-Tab Support

-

RxDB extends its prowess to multi-tab scenarios, guaranteeing data consistency across different tabs or windows of the same PWA. This feature promotes a seamless transition between various sections of the application, while minimizing data conflicts.

-

multi tab support

-

Using RxDB in a Progressive Web App

-

Integrating RxDB into a Progressive Web App, driven by technologies like React, is a straightforward process. By configuring RxDB and installing the necessary packages, developers establish a solid foundation for robust data management within their PWA.

-

Exploring Different RxStorage Layers

-

RxDB caters to diverse needs through its various RxStorage layers:

-
    -
  • localstorage RxStorage: Leveraging the capabilities of the browsers localstorage API for storage.
  • -
  • IndexedDB RxStorage: Tapping into the browser's IndexedDB for efficient data storage.
  • -
  • OPFS RxStorage: Interfacing with the Offline-First Persistence System for seamless persistence.
  • -
  • Memory RxStorage: Storing data in memory, ideal for temporary data requirements. -This flexibility empowers developers to optimize data storage based on the unique needs of their PWA.
  • -
-

Synchronizing Data with RxDB between PWA Clients and Servers -To facilitate seamless data synchronization between PWA clients and servers, RxDB offers a range of replication options:

-
    -
  • -

    RxDB Replication Algorithm: RxDB introduces its own replication algorithm, enabling efficient and reliable data synchronization between clients and servers.

    -
  • -
  • -

    CouchDB Replication: Leveraging its roots in CouchDB, RxDB facilitates smooth data replication between clients and CouchDB servers, ensuring data consistency and synchronization across devices.

    -
  • -
  • -

    Firestore Replication: RxDB synchronizes data with Google Firestore, a real-time cloud-hosted NoSQL database. This integration guarantees up-to-date data across different instances of the PWA.

    -
  • -
  • -

    Peer-to-Peer (P2P) via WebRTC Replication: RxDB supports P2P replication, facilitating direct data synchronization between clients without intermediaries. This decentralized approach is invaluable in scenarios where server infrastructure is limited.

    -
  • -
-

Advanced RxDB Features and Techniques

-

Encryption of Local Data

-

RxDB empowers PWAs with the ability to encrypt local data, enhancing data security and safeguarding sensitive information. This feature is indispensable for applications handling user credentials, financial transactions, and other confidential data.

-

Indexing and Performance Optimization

-

Performance optimization is a top priority for PWAs. RxDB addresses this concern by offering indexing options that expedite data retrieval, resulting in a snappier user interface and heightened responsiveness.

-

JSON Key Compression

-

RxDB introduces JSON key compression, a feature that reduces storage requirements. This optimization is particularly beneficial for PWAs dealing with substantial data volumes, enhancing overall efficiency and resource utilization.

-

Change Streams and Event Handling

-

RxDB introduces change streams, enabling PWAs to react to data changes in real time. This capability empowers dynamic updates to the user interface, promoting interactivity and engagement.

-

Conclusion

-

In the ever-evolving landscape of web application development, Progressive Web Apps continue to redefine user experiences. RxDB emerges as a pivotal player, seamlessly integrating with PWAs and enhancing their capabilities. With features like the local-first approach, observable queries, replication mechanisms, and advanced encryption, RxDB empowers developers to create responsive, offline-capable, and data-driven PWAs. As the demand for sophisticated PWAs continues to surge, RxDB remains an indispensable tool for developers aiming to push the boundaries of innovation and redefine the standards of user engagement. By embracing RxDB, developers ensure their PWAs remain at the forefront of the digital revolution, offering seamless and immersive experiences to users around the world.

-

Follow Up

-

To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources:

-
- - \ No newline at end of file diff --git a/docs/articles/progressive-web-app-database.md b/docs/articles/progressive-web-app-database.md deleted file mode 100644 index 021eb679158..00000000000 --- a/docs/articles/progressive-web-app-database.md +++ /dev/null @@ -1,92 +0,0 @@ -# RxDB as a Database for Progressive Web Apps (PWA) - -> Discover how RxDB supercharges Progressive Web Apps with real-time sync, offline-first capabilities, and lightning-fast data handling. - -# RxDB as a Database for Progressive Web Apps (PWA) -Progressive Web Apps (PWAs) have revolutionized the digital landscape, offering users an immersive blend of web and native app experiences. At the heart of every successful PWA lies effective data management, and this is where RxDB comes into play. In this article, we'll explore the dynamic synergy between RxDB, a robust client-side database, and Progressive Web Apps, uncovering how RxDB enhances data handling, synchronization, and overall performance, propelling PWAs into a new era of excellence. - -## What is a Progressive Web App -Progressive Web Apps are the future of web development, seamlessly combining the best of both web and mobile app worlds. They can be easily installed on the user's home screen, function offline, and load at lightning speed. Unlike hybrid apps, PWAs offer a consistent user experience across platforms, making them a versatile choice for modern applications. - -PWAs bring a plethora of advantages to the table. They eliminate the hassle of app store installations and updates, reduce dependency on network connectivity, and prioritize fast loading times. By harnessing the power of service workers and intelligent caching mechanisms, PWAs ensure users can access content even in offline mode. Furthermore, PWAs are device-agnostic, seamlessly adapting to various devices, from desktops to smartphones. - -## Introducing RxDB as a Client-Side Database for PWAs -At the heart of PWAs lies efficient data management, and RxDB steps in as a reliable ally. As a client-side NoSQL database, RxDB seamlessly integrates into web applications, offering real-time data synchronization and manipulation capabilities. This article sheds light on the transformative potential of RxDB as it collaborates harmoniously with PWAs, enabling local-first strategies and elevating user interactions to a whole new level. - -
- - - -
- -### Getting Started with RxDB -RxDB emerges as a reactive, schema-based NoSQL database crafted explicitly for client-side applications. Its real-time data synchronization and responsiveness align seamlessly with the dynamic demands of modern PWAs. - -#### Local-First Approach -The cornerstone of RxDB's philosophy is the local-first approach, empowering PWAs to prioritize data storage and manipulation on the client side. This paradigm ensures that PWAs remain functional even when offline, allowing users to access and interact with data seamlessly. RxDB bridges any gaps in data synchronization once network connectivity is restored. - -#### Observable Queries -Observable queries (aka **Live-Queries**) serve as the engine of RxDB's dynamic capabilities. By leveraging these queries, PWAs can monitor and respond to data changes in real time. The result is an engaging user interface with instantaneous updates that captivate users and keep them engaged. - -```ts -await db.heroes.find({ - selector: { - healthpoints: { - $gt: 0 - } - } -}) -.$ // the $ returns an observable that emits each time the result set of the query changes -.subscribe(aliveHeroes => console.dir(aliveHeroes)); -``` - -#### Multi-Tab Support -RxDB extends its prowess to multi-tab scenarios, guaranteeing data consistency across different tabs or windows of the same PWA. This feature promotes a seamless transition between various sections of the application, while minimizing data conflicts. - - - -### Using RxDB in a Progressive Web App -Integrating RxDB into a Progressive Web App, driven by technologies like React, is a straightforward process. By configuring RxDB and installing the necessary packages, developers establish a solid foundation for robust data management within their PWA. - -## Exploring Different RxStorage Layers -RxDB caters to diverse needs through its various RxStorage layers: - -- [localstorage RxStorage](../rx-storage-localstorage.md): Leveraging the capabilities of the browsers localstorage API for storage. -- [IndexedDB RxStorage](../rx-storage-indexeddb.md): Tapping into the browser's IndexedDB for efficient data storage. -- [OPFS RxStorage](../rx-storage-opfs.md): Interfacing with the Offline-First Persistence System for seamless persistence. -- [Memory RxStorage](../rx-storage-memory.md): Storing data in memory, ideal for temporary data requirements. -This flexibility empowers developers to optimize data storage based on the unique needs of their PWA. - -Synchronizing Data with RxDB between PWA Clients and Servers -To facilitate seamless data synchronization between PWA clients and servers, RxDB offers a range of replication options: - -- [RxDB Replication Algorithm](../replication.md): RxDB introduces its own replication algorithm, enabling efficient and reliable data synchronization between clients and servers. - -- [CouchDB Replication](../replication-couchdb.md): Leveraging its roots in CouchDB, RxDB facilitates smooth data replication between clients and CouchDB servers, ensuring data consistency and synchronization across devices. - -- [Firestore Replication](../replication-firestore.md): RxDB synchronizes data with Google Firestore, a real-time cloud-hosted NoSQL database. This integration guarantees up-to-date data across different instances of the PWA. - -- [Peer-to-Peer (P2P) via WebRTC](../replication-webrtc.md) Replication: RxDB supports P2P replication, facilitating direct data synchronization between clients without intermediaries. This decentralized approach is invaluable in scenarios where server infrastructure is limited. - -## Advanced RxDB Features and Techniques -### Encryption of Local Data -RxDB empowers PWAs with the ability to encrypt local data, enhancing data security and safeguarding sensitive information. This feature is indispensable for applications handling user credentials, financial transactions, and other confidential data. - -### Indexing and Performance Optimization -Performance optimization is a top priority for PWAs. RxDB addresses this concern by offering indexing options that expedite data retrieval, resulting in a snappier user interface and heightened responsiveness. - -### JSON Key Compression -RxDB introduces JSON key compression, a feature that reduces storage requirements. This optimization is particularly beneficial for PWAs dealing with substantial data volumes, enhancing overall efficiency and resource utilization. - -### Change Streams and Event Handling -RxDB introduces change streams, enabling PWAs to react to data changes in real time. This capability empowers dynamic updates to the user interface, promoting interactivity and engagement. - -## Conclusion -In the ever-evolving landscape of web application development, Progressive Web Apps continue to redefine user experiences. RxDB emerges as a pivotal player, seamlessly integrating with PWAs and enhancing their capabilities. With features like the local-first approach, observable queries, replication mechanisms, and advanced encryption, RxDB empowers developers to create responsive, offline-capable, and data-driven PWAs. As the demand for sophisticated PWAs continues to surge, RxDB remains an indispensable tool for developers aiming to push the boundaries of innovation and redefine the standards of user engagement. By embracing RxDB, developers ensure their PWAs remain at the forefront of the digital revolution, offering seamless and immersive experiences to users around the world. - -## Follow Up -To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: - -- [RxDB GitHub Repository](https://github.com/pubkey/rxdb): Visit the official GitHub repository of RxDB to access the source code, documentation, and community support. -- [RxDB Quickstart](../quickstart.md): Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects. -- [RxDB Progressive Web App in Angular Example](https://github.com/pubkey/rxdb/tree/master/examples/angular) diff --git a/docs/articles/react-database.html b/docs/articles/react-database.html deleted file mode 100644 index fd21226cff2..00000000000 --- a/docs/articles/react-database.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - -RxDB as a Database for React Applications | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RxDB as a Database for React Applications

-

In the rapidly evolving landscape of web development, React has emerged as a cornerstone technology for building dynamic and responsive user interfaces. With the increasing complexity of modern web applications, efficient data management becomes pivotal. This article delves into the integration of RxDB, a potent client-side database, with React applications to optimize data handling and elevate the overall user experience.

-

React has revolutionized the way web applications are built by introducing a component-based architecture. This approach enables developers to create reusable UI components that efficiently update in response to changes in data. The virtual DOM mechanism, a key feature of React, facilitates optimized rendering, enhancing performance and user interactivity.

-

While React excels at managing the user interface, the need for efficient data storage and retrieval mechanisms is equally significant. A client-side database brings several advantages to React applications:

-
    -
  • Improved Performance: Local data storage reduces the need for frequent server requests, resulting in faster data retrieval and enhanced application responsiveness.
  • -
  • Offline Capabilities: A client-side database enables offline access to data, allowing users to interact with the application even when they are disconnected from the internet.
  • -
  • Real-Time Updates: With the ability to observe changes in data, client-side databases facilitate real-time updates to the UI, ensuring users are always presented with the latest information.
  • -
  • Reduced Server Load: By handling data operations locally, client-side databases alleviate the load on the server, contributing to a more scalable architecture.
  • -
-

Introducing RxDB as a JavaScript Database

-

RxDB, a powerful JavaScript database, has garnered attention as an optimal solution for managing data in React applications. Built on top of the IndexedDB standard, RxDB combines the principles of reactive programming with database management. Its core features include reactive data handling, offline-first capabilities, and robust data replication.

-
JavaScript React Database
-

What is RxDB?

-

RxDB, short for Reactive Database, is an open-source JavaScript database that seamlessly integrates reactive programming with database operations. It offers a comprehensive API for performing database actions and synchronizing data across clients and servers. RxDB's underlying philosophy revolves around observables, allowing developers to reactively manage data changes and create dynamic user interfaces.

-

Reactive Data Handling

-

One of RxDB's standout features is its support for reactive data handling. Traditional databases often require manual intervention for data fetching and updating, leading to complex and error-prone code. RxDB, however, automatically notifies subscribers whenever data changes occur, eliminating the need for explicit data manipulation. This reactive approach simplifies code and enhances the responsiveness of React components.

-

Local-First Approach

-

RxDB embraces a local-first methodology, enabling applications to function seamlessly even in offline scenarios. By storing data locally, RxDB ensures that users can interact with the application and make updates regardless of internet connectivity. Once the connection is reestablished, RxDB synchronizes the local changes with the remote database, maintaining data consistency across devices.

-

Data Replication

-

Data replication is a cornerstone of modern applications that require synchronization between multiple clients and servers. RxDB provides robust data replication mechanisms that facilitate real-time synchronization between different instances of the database. This ensures that changes made on one client are promptly propagated to others, contributing to a cohesive and unified user experience.

-

Observable Queries

-

RxDB extends the concept of observables beyond data changes. It introduces observable queries, allowing developers to observe the results of database queries. This feature enables automatic updates to query results whenever relevant data changes occur. Observable queries simplify state management by eliminating the need to manually trigger updates in response to changing data.

-
await db.heroes.find({
-  selector: {
-    healthpoints: {
-      $gt: 0
-    }
-  }
-})
-.$ // the $ returns an observable that emits each time the result set of the query changes
-.subscribe(aliveHeroes => console.dir(aliveHeroes));
-

Multi-Tab Support

-

Web applications often operate in multiple browser tabs or windows. RxDB accommodates this scenario by offering built-in multi-tab support. It ensures that data changes made in one tab are efficiently propagated to other tabs, maintaining data consistency and providing a seamless experience for users interacting with the application across different tabs.

-

multi tab support

-

RxDB vs. Other React Database Options

-

While considering database options for React applications, RxDB stands out due to its unique combination of reactive programming and database capabilities. Unlike traditional solutions such as IndexedDB or Web Storage, which provide basic data storage, RxDB offers a dedicated database solution with advanced features. Additionally, while state management libraries like Redux and MobX can be adapted for database use, RxDB provides an integrated solution specifically designed for handling data.

-

IndexedDB in React and the Advantage of RxDB

-

Using IndexedDB directly in React can be challenging due to its low-level, callback-based API which doesn't align neatly with modern React's Promise and async/await patterns. This intricacy often leads to bulky and complex implementations for developers. Also, when used wrong, IndexedDB can have a worse performance profile then it could have. In contrast, RxDB, with the IndexedDB RxStorage and the LocalStorage RxStorage, abstracts these complexities, integrating reactive programming and providing a more streamlined experience for data management in React applications. Thus, RxDB offers a more intuitive approach, eliminating much of the manual overhead required with IndexedDB.

-

Using RxDB in a React Application

-

The process of integrating RxDB into a React application is straightforward. Begin by installing RxDB as a dependency: -npm install rxdb rxjs -Once installed, RxDB can be imported and initialized within your React components. The following code snippet illustrates a basic setup:

-
import { createRxDatabase } from 'rxdb';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
- 
-const db = await createRxDatabase({
-  name: 'heroesdb',                   // <- name
-  storage: getRxStorageLocalstorage(),       // <- RxStorage
-  password: 'myPassword',             // <- password (optional)
-  multiInstance: true,                // <- multiInstance (optional, default: true)
-  eventReduce: true,                  // <- eventReduce (optional, default: false)
-  cleanupPolicy: {}                   // <- custom cleanup policy (optional) 
-});
-

Using RxDB React Hooks

-

The rxdb-hooks package provides a set of React hooks that simplify data management within components. These hooks leverage RxDB's reactivity to automatically update components when data changes occur. The following example demonstrates the usage of the useRxCollection and useRxQuery hooks to query and observe a collection:

-
const collection = useRxCollection('characters');
-const query = collection.find().where('affiliation').equals('Jedi');
-const {
-  result: characters,
-  isFetching,
-  fetchMore,
-  isExhausted,
-} = useRxQuery(query, {
-  pageSize: 5,
-  pagination: 'Infinite',
-});
- 
-if (isFetching) {
-  return 'Loading...';
-}
- 
-return (
-  <CharacterList>
-    {characters.map((character, index) => (
-      <Character character={character} key={index} />
-    ))}
-    {!isExhausted && <button onClick={fetchMore}>load more</button>}
-  </CharacterList>
-);
-

Different RxStorage Layers for RxDB

-

RxDB offers multiple storage layers, each backed by a different underlying technology. Developers can choose the storage layer that best suits their application's requirements. Some available options include:

-
    -
  • LocalStorage RxStorage: Built on top of the browsers localstorage API.
  • -
  • IndexedDB RxStorage: The default RxDB storage layer, providing efficient data storage in modern browsers.
  • -
  • OPFS RxStorage: Uses the Operational File System (OPFS) for storage, suitable for Electron applications.
  • -
  • Memory RxStorage: Stores data in memory, primarily intended for testing and development purposes.
  • -
  • SQLite RxStorage: Stores data in an SQLite database. Can be used in a browser with react by using a SQLite database that was compiled to WebAssembly. Using SQLite in react might not be the best idea, because a compiled SQLite wasm file is about one megabyte of code that has to be loaded and rendered by your users. Using native browser APIs like IndexedDB and OPFS have shown to be a more optimal database solution for browser based react apps compared to SQLite.
  • -
-

Synchronizing Data with RxDB between Clients and Servers

-

The offline-first approach is a fundamental principle of RxDB's design. When dealing with client-server synchronization, RxDB ensures that changes made offline are captured and propagated to the server once connectivity is reestablished. This mechanism guarantees that data remains consistent across different client instances, even when operating in an occasionally connected environment.

-

RxDB offers a range of replication plugins that facilitate data synchronization between clients and servers. These plugins support various synchronization strategies, such as one-way replication, two-way replication, and custom conflict resolution. Developers can select the appropriate plugin based on their application's synchronization requirements.

-

database replication

-

Advanced RxDB Features and Techniques

-

Encryption of Local Data -Security is paramount when handling sensitive user data. RxDB supports data encryption, ensuring that locally stored information remains protected from unauthorized access. This feature is particularly valuable when dealing with sensitive data in offline scenarios.

-

Indexing and Performance Optimization

-

Efficient indexing is critical for achieving optimal database performance. RxDB provides mechanisms to define indexes on specific fields, enhancing query speed and reducing the computational overhead of data retrieval.

-

JSON Key Compression

-

RxDB employs JSON key compression to reduce storage space and improve performance. This technique minimizes the memory footprint of the database, making it suitable for applications with limited resources.

-

Change Streams and Event Handling

-

RxDB enables developers to subscribe to change streams, which emit events whenever data changes occur. This functionality facilitates real-time event handling and provides opportunities for implementing features such as notifications and live updates.

-

Conclusion

-

In the realm of React application development, efficient data management is pivotal to delivering a seamless and engaging user experience. RxDB emerges as a compelling solution, seamlessly integrating reactive programming principles with sophisticated database capabilities. By adopting RxDB, React developers can harness its powerful features, including reactive data handling, offline-first support, and real-time synchronization. With RxDB as a foundational pillar, React applications can excel in responsiveness, scalability, and data integrity. As the landscape of web development continues to evolve, RxDB remains a steadfast companion for creating robust and dynamic React applications.

-

Follow Up

-

To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources:

-
    -
  • RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.
  • -
  • RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects.
  • -
  • RxDB React Example at GitHub
  • -
- - \ No newline at end of file diff --git a/docs/articles/react-database.md b/docs/articles/react-database.md deleted file mode 100644 index bde5d41b8d1..00000000000 --- a/docs/articles/react-database.md +++ /dev/null @@ -1,152 +0,0 @@ -# RxDB as a Database for React Applications - -> earn how the RxDB database supercharges React apps with offline access, real-time updates, and smooth data flow. Boost performance and engagement. - -# RxDB as a Database for React Applications -In the rapidly evolving landscape of web development, React has emerged as a cornerstone technology for building dynamic and responsive user interfaces. With the increasing complexity of modern web applications, efficient data management becomes pivotal. This article delves into the integration of RxDB, a potent client-side database, with React applications to optimize data handling and elevate the overall user experience. - -React has revolutionized the way web applications are built by introducing a component-based architecture. This approach enables developers to create reusable UI components that efficiently update in response to changes in data. The virtual DOM mechanism, a key feature of React, facilitates optimized rendering, enhancing performance and user interactivity. - -While React excels at managing the user interface, the need for efficient data storage and retrieval mechanisms is equally significant. A client-side database brings several advantages to React applications: - -- Improved Performance: Local data storage reduces the need for frequent server requests, resulting in faster data retrieval and enhanced application responsiveness. -- Offline Capabilities: A client-side database enables offline access to data, allowing users to interact with the application even when they are disconnected from the internet. -- Real-Time Updates: With the ability to observe changes in data, client-side databases facilitate real-time updates to the UI, ensuring users are always presented with the latest information. -- Reduced Server Load: By handling data operations locally, client-side databases alleviate the load on the server, contributing to a more scalable architecture. - -## Introducing RxDB as a JavaScript Database -RxDB, a powerful JavaScript database, has garnered attention as an optimal solution for managing data in React applications. Built on top of the IndexedDB standard, RxDB combines the principles of reactive programming with database management. Its core features include reactive data handling, offline-first capabilities, and robust data replication. - -
- - - -
- -## What is RxDB? -RxDB, short for Reactive Database, is an open-source JavaScript database that seamlessly integrates reactive programming with database operations. It offers a comprehensive API for performing database actions and synchronizing data across clients and servers. RxDB's underlying philosophy revolves around observables, allowing developers to reactively manage data changes and create dynamic user interfaces. - -### Reactive Data Handling -One of RxDB's standout features is its support for reactive data handling. Traditional databases often require manual intervention for data fetching and updating, leading to complex and error-prone code. RxDB, however, automatically notifies subscribers whenever data changes occur, eliminating the need for explicit data manipulation. This reactive approach simplifies code and enhances the responsiveness of React components. - -### Local-First Approach -RxDB embraces a [local-first](../offline-first.md) methodology, enabling applications to function seamlessly even in offline scenarios. By storing data locally, RxDB ensures that users can interact with the application and make updates regardless of internet connectivity. Once the connection is reestablished, RxDB synchronizes the local changes with the remote database, maintaining data consistency across devices. - -### Data Replication -Data replication is a cornerstone of modern applications that require synchronization between multiple clients and servers. RxDB provides robust data replication mechanisms that facilitate real-time synchronization between different instances of the database. This ensures that changes made on one client are promptly propagated to others, contributing to a cohesive and unified user experience. - -### Observable Queries -RxDB extends the concept of observables beyond data changes. It introduces observable queries, allowing developers to observe the results of database queries. This feature enables automatic updates to query results whenever relevant data changes occur. Observable queries simplify state management by eliminating the need to manually trigger updates in response to changing data. - -```ts -await db.heroes.find({ - selector: { - healthpoints: { - $gt: 0 - } - } -}) -.$ // the $ returns an observable that emits each time the result set of the query changes -.subscribe(aliveHeroes => console.dir(aliveHeroes)); -``` - -### Multi-Tab Support -Web applications often operate in multiple browser tabs or windows. RxDB accommodates this scenario by offering built-in multi-tab support. It ensures that data changes made in one tab are efficiently propagated to other tabs, maintaining data consistency and providing a seamless experience for users interacting with the application across different tabs. - - - -### RxDB vs. Other React Database Options -While considering database options for React applications, RxDB stands out due to its unique combination of reactive programming and database capabilities. Unlike traditional solutions such as IndexedDB or Web Storage, which provide basic data storage, RxDB offers a dedicated database solution with advanced features. Additionally, while state management libraries like Redux and MobX can be adapted for database use, RxDB provides an integrated solution specifically designed for handling data. - -### IndexedDB in React and the Advantage of RxDB - -Using IndexedDB directly in React can be challenging due to its low-level, callback-based API which doesn't align neatly with modern React's Promise and async/await patterns. This intricacy often leads to bulky and complex implementations for developers. Also, when used wrong, IndexedDB can have a worse [performance profile](../slow-indexeddb.md) then it could have. In contrast, RxDB, with the [IndexedDB RxStorage](../rx-storage-indexeddb.md) and the [LocalStorage RxStorage](../rx-storage-localstorage.md), abstracts these complexities, integrating reactive programming and providing a more streamlined experience for data management in React applications. Thus, RxDB offers a more intuitive approach, eliminating much of the manual overhead required with IndexedDB. - -### Using RxDB in a React Application - -The process of integrating RxDB into a React application is straightforward. Begin by installing RxDB as a dependency: -`npm install rxdb rxjs` -Once installed, RxDB can be imported and initialized within your React components. The following code snippet illustrates a basic setup: - -```javascript -import { createRxDatabase } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -const db = await createRxDatabase({ - name: 'heroesdb', // <- name - storage: getRxStorageLocalstorage(), // <- RxStorage - password: 'myPassword', // <- password (optional) - multiInstance: true, // <- multiInstance (optional, default: true) - eventReduce: true, // <- eventReduce (optional, default: false) - cleanupPolicy: {} // <- custom cleanup policy (optional) -}); -``` - -### Using RxDB React Hooks -The [rxdb-hooks](https://github.com/cvara/rxdb-hooks) package provides a set of React hooks that simplify data management within components. These hooks leverage RxDB's reactivity to automatically update components when data changes occur. The following example demonstrates the usage of the `useRxCollection` and `useRxQuery` hooks to query and observe a collection: - -```ts -const collection = useRxCollection('characters'); -const query = collection.find().where('affiliation').equals('Jedi'); -const { - result: characters, - isFetching, - fetchMore, - isExhausted, -} = useRxQuery(query, { - pageSize: 5, - pagination: 'Infinite', -}); - -if (isFetching) { - return 'Loading...'; -} - -return ( - - {characters.map((character, index) => ( - - ))} - {!isExhausted && } - -); -``` - -### Different RxStorage Layers for RxDB -RxDB offers multiple storage layers, each backed by a different underlying technology. Developers can choose the storage layer that best suits their application's requirements. Some available options include: - -- [LocalStorage RxStorage](../rx-storage-localstorage.md): Built on top of the browsers localstorage API. -- [IndexedDB RxStorage](../rx-storage-indexeddb.md): The default RxDB storage layer, providing efficient data storage in modern browsers. -- [OPFS RxStorage](../rx-storage-opfs.md): Uses the Operational File System (OPFS) for storage, suitable for [Electron applications](../electron-database.md). -- [Memory RxStorage](../rx-storage-memory.md): Stores data in memory, primarily intended for testing and development purposes. -- [SQLite RxStorage](../rx-storage-sqlite.md): Stores data in an SQLite database. Can be used in a browser with react by using a SQLite database that was [compiled to WebAssembly](https://sqlite.org/wasm/doc/trunk/index.md). Using SQLite in react might not be the best idea, because a compiled SQLite wasm file is about one megabyte of code that has to be loaded and rendered by your users. Using native browser APIs like IndexedDB and OPFS have shown to be a more optimal database solution for browser based react apps compared to SQLite. - -### Synchronizing Data with RxDB between Clients and Servers -The offline-first approach is a fundamental principle of RxDB's design. When dealing with client-server synchronization, RxDB ensures that changes made offline are captured and propagated to the server once connectivity is reestablished. This mechanism guarantees that data remains consistent across different client instances, even when operating in an occasionally connected environment. - -RxDB offers a range of [replication plugins](../replication.md) that facilitate data synchronization between clients and servers. These plugins support various synchronization strategies, such as one-way replication, two-way replication, and custom conflict resolution. Developers can select the appropriate plugin based on their application's synchronization requirements. - - - -### Advanced RxDB Features and Techniques -Encryption of Local Data -Security is paramount when handling sensitive user data. RxDB supports [data encryption](./react-native-encryption.md), ensuring that locally stored information remains protected from unauthorized access. This feature is particularly valuable when dealing with sensitive data in offline scenarios. - -### Indexing and Performance Optimization -Efficient indexing is critical for achieving optimal database performance. RxDB provides mechanisms to define indexes on specific fields, enhancing query speed and reducing the computational overhead of data retrieval. - -### JSON Key Compression -RxDB employs JSON key compression to reduce storage space and improve performance. This technique minimizes the memory footprint of the database, making it suitable for applications with limited resources. - -### Change Streams and Event Handling -RxDB enables developers to subscribe to change streams, which emit events whenever data changes occur. This functionality facilitates real-time event handling and provides opportunities for implementing features such as notifications and live updates. - -## Conclusion -In the realm of React application development, efficient data management is pivotal to delivering a seamless and engaging user experience. RxDB emerges as a compelling solution, seamlessly integrating reactive programming principles with sophisticated database capabilities. By adopting RxDB, React developers can harness its powerful features, including reactive data handling, offline-first support, and real-time synchronization. With RxDB as a foundational pillar, React applications can excel in responsiveness, scalability, and data integrity. As the landscape of web development continues to evolve, RxDB remains a steadfast companion for creating robust and dynamic React applications. - -## Follow Up -To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: - -- [RxDB GitHub Repository](https://github.com/pubkey/rxdb): Visit the official GitHub repository of RxDB to access the source code, documentation, and community support. -- [RxDB Quickstart](../quickstart.md): Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects. -- [RxDB React Example at GitHub](https://github.com/pubkey/rxdb/tree/master/examples/react) diff --git a/docs/articles/react-indexeddb.html b/docs/articles/react-indexeddb.html deleted file mode 100644 index 152d56660a1..00000000000 --- a/docs/articles/react-indexeddb.html +++ /dev/null @@ -1,225 +0,0 @@ - - - - - -IndexedDB Database in React Apps - The Power of RxDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IndexedDB Database in React Apps - The Power of RxDB

-

Building robust, offline-capable React applications often involves leveraging browser storage solutions to manage data. IndexedDB is one such powerful tool, but its raw API can be challenging to work with directly. RxDB abstracts away much of IndexedDB's complexity, providing a more developer-friendly experience. In this article, we'll explore what IndexedDB is, why it's beneficial in React applications, the challenges of using plain IndexedDB, and how RxDB can simplify your development process while adding advanced features.

-

What is IndexedDB?

-

IndexedDB is a low-level API for storing significant amounts of structured data in the browser. It provides a transactional database system that can store key-value pairs, complex objects, and more. This storage engine is asynchronous and supports advanced data types, making it suitable for offline storage and complex web applications.

-
React IndexedDB
-

Why Use IndexedDB in React

-

When building React applications, IndexedDB can play a crucial role in enhancing both performance and user experience. Here are some reasons to consider using IndexedDB:

-
    -
  • Offline-First / Local-First: By storing data locally, your application remains functional even without an internet connection.
  • -
  • Performance: Using local data means zero latency and no loading spinners, as data doesn't need to be fetched over a network.
  • -
  • Easier Implementation: Replicating all data to the client once is often simpler than implementing multiple endpoints for each user interaction.
  • -
  • Scalability: Local data reduces server load because queries run on the client side, decreasing server bandwidth and processing requirements.
  • -
-

Why To Not Use Plain IndexedDB

-

While IndexedDB itself is powerful, its native API comes with several drawbacks for everyday application developers:

-
    -
  • Callback-Based API: IndexedDB was designed with callbacks rather than modern Promises, making asynchronous code more cumbersome.
  • -
  • Complexity: IndexedDB is low-level, intended for library developers rather than for app developers who simply want to store data.
  • -
  • Basic Query API: Its rudimentary query capabilities limit how you can efficiently perform complex queries, whereas libraries like RxDB offer more advanced query features.
  • -
  • TypeScript Support: Ensuring good TypeScript support with IndexedDB is challenging, especially when trying to enforce document type consistency.
  • -
  • Lack of Observable API: IndexedDB doesn't provide an observable API out of the box. RxDB solves this by enabling you to observe query results or specific document fields.
  • -
  • Cross-Tab Communication: Managing cross-tab updates in plain IndexedDB is difficult. RxDB handles this seamlessly-changes in one tab automatically affect observed data in others.
  • -
  • Missing Advanced Features: Features like encryption or compression aren't built into IndexedDB, but they are available via RxDB.
  • -
  • Limited Platform Support: IndexedDB exists only in the browser. In contrast, RxDB offers swappable storages to use the same code in React Native, Capacitor, or Electron.
  • -
-
JavaScript Database
-

Set up RxDB in React

-

Setting up RxDB with React is straightforward. It abstracts IndexedDB complexities and adds a layer of powerful features over it.

-

Installing RxDB

-

First, install RxDB and RxJS from npm:

-
npm install rxdb rxjs --save```
-

Create a Database and Collections

-

RxDB provides two main storage options:

- -
import { createRxDatabase } from 'rxdb/plugins/core';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
- 
-// create a database
-const db = await createRxDatabase({
-    name: 'heroesdb', // the name of the database
-    storage: getRxStorageLocalstorage()
-});
- 
-// Define your schema
-const heroSchema = {
-  title: 'hero schema',
-  version: 0,
-  description: 'Describes a hero in your app',
-  primaryKey: 'id',
-  type: 'object',
-  properties: {
-    id: {
-      type: 'string',
-      maxLength: 100
-    },
-    name: {
-      type: 'string'
-    },
-    power: {
-      type: 'string'
-    }
-  },
-  required: ['id', 'name']
-};
- 
-// add collections
-await db.addCollections({
-  heroes: {
-    schema: heroSchema
-  }
-});
-

CRUD Operations

-

Once your database is initialized, you can perform all CRUD operations:

-
// insert
-await db.heroes.insert({ name: 'Iron Man', power: 'Genius-level intellect' });
- 
-// bulk insert
-await db.heroes.bulkInsert([
-  { name: 'Thor', power: 'God of Thunder' },
-  { name: 'Hulk', power: 'Superhuman Strength' }
-]);
- 
-// find and findOne
-const heroes = await db.heroes.find().exec();
-const ironMan = await db.heroes.findOne({ selector: { name: 'Iron Man' } }).exec();
- 
-// update
-const doc = await db.heroes.findOne({ selector: { name: 'Hulk' } }).exec();
-await doc.update({ $set: { power: 'Unlimited Strength' } });
- 
-// delete
-const doc = await db.heroes.findOne({ selector: { name: 'Thor' } }).exec();
-await doc.remove();
-

Reactive Queries and Live Updates

-

RxDB excels in providing reactive data capabilities, ideal for real-time applications. There are two main approaches to achieving live queries with RxDB: using RxJS Observables with React Hooks or utilizing Preact Signals.

-

realtime ui updates

-

With RxJS Observables and React Hooks

-

RxDB integrates seamlessly with RxJS Observables, allowing you to build reactive components. Here's an example of a React component that subscribes to live data updates:

-
import { useState, useEffect } from 'react';
- 
-function HeroList({ collection }) {
-  const [heroes, setHeroes] = useState([]);
- 
-  useEffect(() => {
-    // create an observable query
-    const query = collection.find();
-    const subscription = query.$.subscribe(newHeroes => {
-      setHeroes(newHeroes);
-    });
-    return () => subscription.unsubscribe();
-  }, [collection]);
- 
-  return (
-    <div>
-      <h2>Hero List</h2>
-      <ul>
-        {heroes.map(hero => (
-          <li key={hero.id}>
-            <strong>{hero.name}</strong> - {hero.power}
-          </li>
-        ))}
-      </ul>
-    </div>
-  );
-}
-

This component subscribes to the collection's changes, updating the UI automatically whenever the underlying data changes, even across browser tabs.

-

With Preact Signals

-

RxDB also supports Preact Signals for reactivity, which can be integrated into React applications. Preact Signals offer a modern, fine-grained reactivity model.

-

First, install the necessary package:

-
npm install @preact/signals-core --save
-

Set up RxDB with Preact Signals reactivity:

-
import { PreactSignalsRxReactivityFactory } from 'rxdb/plugins/reactivity-preact-signals';
-import { createRxDatabase } from 'rxdb/plugins/core';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
- 
-const database = await createRxDatabase({
-    name: 'mydb',
-    storage: getRxStorageLocalstorage(),
-    reactivity: PreactSignalsRxReactivityFactory
-});
-

Now, you can obtain signals directly from RxDB queries using the double-dollar sign ($$):

-
function HeroList({ collection }) {
-  const heroes = collection.find().$$;
-  return (
-    <ul>
-      {heroes.map(hero => (
-        <li key={hero.id}>{hero.name}</li>
-      ))}
-    </ul>
-  );
-}
-

This approach provides automatic updates whenever the data changes, without needing to manage subscriptions manually.

-

React IndexedDB Example with RxDB

-

A comprehensive example of using RxDB within a React application can be found in the RxDB GitHub repository. This repository contains sample applications, showcasing best practices and demonstrating how to integrate RxDB for various use cases.

-

Advanced RxDB Features

-

RxDB offers many advanced features that extend beyond basic data storage:

-
    -
  • RxDB Replication: Synchronize local data with remote databases seamlessly. Learn more: RxDB Replication
  • -
  • Data Migration: Handle schema changes gracefully with automatic data migrations. See: Data migration
  • -
  • Encryption: Secure your data with built-in encryption capabilities. Explore: Encryption
  • -
  • Compression: Optimize storage using key compression. Details: Compression
  • -
-

Limitations of IndexedDB

-

While IndexedDB is powerful, it has some inherent limitations:

- -

Alternatives to IndexedDB

-

Depending on your application's requirements, there are alternative storage solutions to consider:

-
    -
  • Origin Private File System (OPFS): A newer API that can offer better performance. RxDB supports OPFS as well. More info: RxDB OPFS Storage
  • -
  • SQLite: Ideal for React applications on Capacitor or Ionic, offering native performance. Explore: RxDB SQLite Storage
  • -
-

Performance comparison with other browser storages

-

Here is a performance overview of the various browser based storage implementation of RxDB:

-

RxStorage performance - browser

-

Follow Up

- -

By leveraging RxDB on top of IndexedDB, you can create highly responsive, offline-capable React applications without dealing with the low-level complexities of IndexedDB directly. With reactive queries, seamless cross-tab communication, and powerful advanced features, RxDB becomes an invaluable tool in modern web development.

- - \ No newline at end of file diff --git a/docs/articles/react-indexeddb.md b/docs/articles/react-indexeddb.md deleted file mode 100644 index 8ac50a08823..00000000000 --- a/docs/articles/react-indexeddb.md +++ /dev/null @@ -1,247 +0,0 @@ -# IndexedDB Database in React Apps - The Power of RxDB - -> Discover how RxDB simplifies IndexedDB in React, offering reactive queries, offline-first capability, encryption, compression, and effortless integration. - -# IndexedDB Database in React Apps - The Power of RxDB - -Building robust, [offline-capable](../offline-first.md) React applications often involves leveraging browser storage solutions to manage data. IndexedDB is one such powerful tool, but its raw API can be challenging to work with directly. RxDB abstracts away much of IndexedDB's complexity, providing a more developer-friendly experience. In this article, we'll explore what IndexedDB is, why it's beneficial in React applications, the challenges of using plain IndexedDB, and how [RxDB](https://rxdb.info/) can simplify your development process while adding advanced features. - -## What is IndexedDB? - -[IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) is a low-level API for storing significant amounts of structured data in the browser. It provides a transactional database system that can store key-value pairs, complex objects, and more. This storage engine is asynchronous and supports advanced data types, making it suitable for offline storage and complex web applications. - -
- -
- -## Why Use IndexedDB in React - -When building React applications, IndexedDB can play a crucial role in enhancing both performance and user experience. Here are some reasons to consider using IndexedDB: - -- **Offline-First / Local-First**: By storing data locally, your application remains functional even without an internet connection. -- **Performance**: Using local data means [zero latency](./zero-latency-local-first.md) and no loading spinners, as data doesn't need to be fetched over a network. -- **Easier Implementation**: Replicating all data to the client once is often simpler than implementing multiple endpoints for each user interaction. -- **Scalability**: Local data reduces server load because queries run on the client side, decreasing server bandwidth and processing requirements. - -## Why To Not Use Plain IndexedDB - -While IndexedDB itself is powerful, its native API comes with several drawbacks for everyday application developers: - -- **Callback-Based API**: IndexedDB was designed with callbacks rather than modern Promises, making asynchronous code more cumbersome. -- **Complexity**: IndexedDB is low-level, intended for library developers rather than for app developers who simply want to store data. -- **Basic Query API**: Its rudimentary query capabilities limit how you can efficiently perform complex queries, whereas libraries like RxDB offer more advanced query features. -- **TypeScript Support**: Ensuring good TypeScript support with IndexedDB is challenging, especially when trying to enforce document type consistency. -- **Lack of Observable API**: IndexedDB doesn't provide an observable API out of the box. RxDB solves this by enabling you to observe query results or specific document fields. -- **Cross-Tab Communication**: Managing cross-tab updates in plain IndexedDB is difficult. RxDB handles this seamlessly-changes in one tab automatically affect observed data in others. -- **Missing Advanced Features**: Features like encryption or compression aren't built into IndexedDB, but they are available via RxDB. -- **Limited Platform Support**: IndexedDB exists only in the browser. In contrast, RxDB offers swappable storages to use the same code in React Native, Capacitor, or Electron. - -
- - - -
- -## Set up RxDB in React - -Setting up RxDB with React is straightforward. It abstracts IndexedDB complexities and adds a layer of powerful features over it. - -### Installing RxDB - -First, install RxDB and RxJS from npm: - -```bash -npm install rxdb rxjs --save``` -``` - -### Create a Database and Collections - -RxDB provides two main storage options: -- The free [localstorage-based storage](../rx-storage-localstorage.md) -- The premium plain [IndexedDB-based storage](../rx-storage-indexeddb.md), offering faster performance -Below is an example of setting up a simple RxDB [database](./react-database.md) using the localstorage-based storage in a React app: - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -// create a database -const db = await createRxDatabase({ - name: 'heroesdb', // the name of the database - storage: getRxStorageLocalstorage() -}); - -// Define your schema -const heroSchema = { - title: 'hero schema', - version: 0, - description: 'Describes a hero in your app', - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 - }, - name: { - type: 'string' - }, - power: { - type: 'string' - } - }, - required: ['id', 'name'] -}; - -// add collections -await db.addCollections({ - heroes: { - schema: heroSchema - } -}); -``` - -### CRUD Operations - -Once your database is initialized, you can perform all CRUD operations: - -```ts -// insert -await db.heroes.insert({ name: 'Iron Man', power: 'Genius-level intellect' }); - -// bulk insert -await db.heroes.bulkInsert([ - { name: 'Thor', power: 'God of Thunder' }, - { name: 'Hulk', power: 'Superhuman Strength' } -]); - -// find and findOne -const heroes = await db.heroes.find().exec(); -const ironMan = await db.heroes.findOne({ selector: { name: 'Iron Man' } }).exec(); - -// update -const doc = await db.heroes.findOne({ selector: { name: 'Hulk' } }).exec(); -await doc.update({ $set: { power: 'Unlimited Strength' } }); - -// delete -const doc = await db.heroes.findOne({ selector: { name: 'Thor' } }).exec(); -await doc.remove(); -``` - -## Reactive Queries and Live Updates - -RxDB excels in providing reactive data capabilities, ideal for [real-time applications](./realtime-database.md). There are two main approaches to achieving live queries with RxDB: using RxJS Observables with React Hooks or utilizing Preact Signals. - - - -### With RxJS Observables and React Hooks - -RxDB integrates seamlessly with RxJS Observables, allowing you to build reactive components. Here's an example of a React component that subscribes to live data updates: - -```ts -import { useState, useEffect } from 'react'; - -function HeroList({ collection }) { - const [heroes, setHeroes] = useState([]); - - useEffect(() => { - // create an observable query - const query = collection.find(); - const subscription = query.$.subscribe(newHeroes => { - setHeroes(newHeroes); - }); - return () => subscription.unsubscribe(); - }, [collection]); - - return ( - - Hero List - - {heroes.map(hero => ( - - {hero.name} - {hero.power} - - ))} - - - ); -} -``` - -This component subscribes to the collection's changes, updating the UI automatically whenever the underlying data changes, even across browser tabs. - -### With Preact Signals - -RxDB also supports Preact Signals for reactivity, which can be integrated into React applications. Preact Signals offer a modern, fine-grained reactivity model. - -First, install the necessary package: -```bash -npm install @preact/signals-core --save -``` -Set up RxDB with Preact Signals reactivity: - -```ts -import { PreactSignalsRxReactivityFactory } from 'rxdb/plugins/reactivity-preact-signals'; -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -const database = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage(), - reactivity: PreactSignalsRxReactivityFactory -}); -``` - -Now, you can obtain signals directly from RxDB queries using the double-dollar sign (`$$`): - -```ts -function HeroList({ collection }) { - const heroes = collection.find().$$; - return ( - - {heroes.map(hero => ( - {hero.name} - ))} - - ); -} -``` - -This approach provides automatic updates whenever the data changes, without needing to manage subscriptions manually. - -## React IndexedDB Example with RxDB - -A comprehensive example of using RxDB within a React application can be found in the [RxDB GitHub repository](https://github.com/pubkey/rxdb/tree/master/examples/react). This repository contains sample applications, showcasing best practices and demonstrating how to integrate RxDB for various use cases. - -## Advanced RxDB Features - -RxDB offers many advanced features that extend beyond basic data storage: - -- **RxDB Replication**: Synchronize local data with remote databases seamlessly. Learn more: [RxDB Replication](https://rxdb.info/replication.html) -- **Data Migration**: Handle schema changes gracefully with automatic data migrations. See: [Data migration](https://rxdb.info/migration-schema.html) -- **Encryption**: Secure your data with built-in encryption capabilities. Explore: [Encryption](https://rxdb.info/encryption.html) -- **Compression**: Optimize storage using key compression. Details: [Compression](https://rxdb.info/key-compression.html) - -## Limitations of IndexedDB - -While IndexedDB is powerful, it has some inherent limitations: - -- **Performance**: IndexedDB can be slow under certain conditions. Read more: [Slow IndexedDB](https://rxdb.info/slow-indexeddb.html) -- **Storage Limits**: Browsers [impose limits](./indexeddb-max-storage-limit.md) on how much data can be stored. See: [Browser storage limits](https://rxdb.info/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html) - -## Alternatives to IndexedDB -Depending on your application's requirements, there are [alternative storage solutions](./localstorage-indexeddb-cookies-opfs-sqlite-wasm.md) to consider: - -- **Origin Private File System (OPFS)**: A newer API that can offer better performance. RxDB supports OPFS as well. More info: [RxDB OPFS Storage](../rx-storage-opfs.md) -- **SQLite**: Ideal for React applications on Capacitor or [Ionic](./ionic-storage.md), offering native performance. Explore: [RxDB SQLite Storage](../rx-storage-sqlite.md) - -## Performance comparison with other browser storages -Here is a [performance overview](../rx-storage-performance.md) of the various browser based storage implementation of RxDB: - - - -## Follow Up -- Learn how to use RxDB with the [RxDB Quickstart](../quickstart.md) for a guided introduction. -- Check out the [RxDB GitHub repository](https://github.com/pubkey/rxdb) and leave a star ⭐ if you find it useful. - -By leveraging RxDB on top of IndexedDB, you can create highly responsive, offline-capable React applications without dealing with the low-level complexities of IndexedDB directly. With reactive queries, seamless cross-tab communication, and powerful advanced features, RxDB becomes an invaluable tool in modern web development. diff --git a/docs/articles/react-native-encryption.html b/docs/articles/react-native-encryption.html deleted file mode 100644 index 57a98b566fc..00000000000 --- a/docs/articles/react-native-encryption.html +++ /dev/null @@ -1,211 +0,0 @@ - - - - - -React Native Encryption and Encrypted Database/Storage | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

React Native Encryption and Encrypted Database/Storage

-

Data security is a critical concern in modern mobile applications. As React Native continues to grow in popularity for building cross-platform apps, ensuring that your data is protected is paramount. RxDB, a real-time database for JavaScript applications, offers powerful encryption features that can help you secure your React Native app's data.

-

This article explains why encryption is important, how to set it up with RxDB in React Native, and best practices to keep your app secure.

-

🔒 Why Encryption Matters

-

Encryption ensures that, even if an unauthorized party obtains physical access to your device or intercepts data, they cannot read the information without the encryption key. Sensitive user data such as credentials, personal information, or financial details should always be encrypted. Proper encryption practices reduce the risk of data breaches and help your application remain compliant with regulations like GDPR or HIPAA.

-

React Native Encryption Overview

-

React Native supports multiple ways to secure local data:

-
    -
  1. -

    Encrypted Databases -Use databases with built-in encryption capabilities, such as SQLite with encryption layers or RxDB with its encryption plugin.

    -
  2. -
  3. -

    Secure Storage Libraries -For key-value data (like tokens or secrets), you can use libraries like react-native-keychain or react-native-encrypted-storage.

    -
  4. -
  5. -

    Custom Encryption -If you need more fine-grained control, you can integrate libraries like crypto-js or the Web Crypto API to encrypt data before storing it in a database or file.

    -
  6. -
-
RxDB
-

Setting Up Encryption in RxDB for React Native

-

1. Install RxDB and Required Plugins

-

Install RxDB and the encryption plugin(s) you need. For the CryptoJS plugin:

-
npm install rxdb
-npm install crypto-js
-

2. Set Up Your RxDB Database with Encryption

-

RxDB offers two encryption plugins:

-
    -
  • CryptoJS Plugin: A free and straightforward solution for most basic use cases.
  • -
  • Web Crypto Plugin: A premium plugin that utilizes the native Web Crypto API for better performance and security.
  • -
-

Below is an example showing how to set up RxDB using the CryptoJS plugin. This example uses the in-memory storage for testing purposes. In a real production scenario, you would use a persistent storage adapter, mostly the SQLite-based storage.

-
import { createRxDatabase } from 'rxdb';
-import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js';
- 
-/*
- * For testing, we use the in-memory storage of RxDB.
- * In production you would use the persistent SQLite based storage instead.
- */
-import { getRxStorageMemory } from 'rxdb/plugins/storage-memory';
- 
-async function initEncryptedDatabase() {
-    // Wrap the normal storage with the encryption plugin
-    const encryptedMemoryStorage = wrappedKeyEncryptionCryptoJsStorage({
-        storage: getRxStorageMemory()
-    });
- 
-    // Create an encrypted database
-    const db = await createRxDatabase({
-        name: 'myEncryptedDatabase',
-        storage: encryptedMemoryStorage,
-        password: 'sudoLetMeIn' // Make sure not to hardcode in production
-    });
- 
-    // Define a schema and create a collection
-    await db.addCollections({
-        secureData: {
-            schema: {
-                title: 'secure data schema',
-                version: 0,
-                type: 'object',
-                primaryKey: 'id',
-                properties: {
-                    id: {
-                        type: 'string',
-                        maxLength: 100
-                    },
-                    normalField: {
-                        type: 'string'
-                    },
-                    secretField: {
-                        type: 'string'
-                    }
-                },
-                required: ['id', 'normalField', 'secretField']
-            }
-        }
-    });
- 
-    return db;
-}
-

3. Inserting and Querying Encrypted Data

-

Once you've set up the database with encryption, data in fields specified by your schema will be encrypted automatically before it is stored, and decrypted when queried.

-
(async () => {
-    const db = await initEncryptedDatabase();
- 
-    // Insert encrypted data
-    const doc = await db.secureData.insert({
-        id: 'mySecretId',
-        normalField: 'foobar',
-        secretField: 'This is top secret data'
-    });
- 
-    // Query encrypted data by its primary key or non-encrypted fields
-    const fetchedDoc = await db.secureData.findOne({
-        selector: {
-            normalField: 'foobar'
-        }
-    }).exec(true);
-    console.log(fetchedDoc.secretField); // 'This is top secret data'
- 
-    // Update data
-    await fetchedDoc.patch({
-        secretField: 'Updated secret data'
-    });
-})();
-

Note: You can only query directly by non-encrypted fields or primary keys. Encrypted fields cannot be used in queries because they are stored as ciphertext in the database. A common approach is to have a small subset of fields that need to be queried unencrypted while storing any sensitive data in encrypted fields.

-

Best Practices for React Native Encryption

-
    -
  • Secure Password Handling -
      -
    • Avoid hardcoding passwords or encryption keys.
    • -
    • Use secure storage solutions like React Native Keychain or react-native-encrypted-storage to fetch the database password at runtime:
    • -
    -
  • -
-
// Example: using react-native-keychain to securely retrieve a stored password
-import * as Keychain from 'react-native-keychain';
- 
-async function getDatabasePassword() {
-    const credentials = await Keychain.getGenericPassword();
-    if (credentials) {
-        return credentials.password;
-    }
-    throw new Error('No password stored in Keychain');
-}
-
    -
  • Encrypt Attachments: -If you need to store files (images, text files, etc.), consider encrypting attachments. RxDB supports attachments that can be encrypted automatically, ensuring your files are protected:
  • -
-
import { createBlob } from 'rxdb/plugins/core';
-const doc = await await db.secureData.findOne({
-    selector: {
-        normalField: 'foobar'
-    }
-}).exec(true);
-const attachment = await doc.putAttachment({
-    id: 'encryptedFile.txt',
-    data: createBlob('Sensitive content', 'text/plain'),
-    type: 'text/plain',
-});
-
    -
  • -

    Optimize Performance

    -
      -
    • If performance is critical, consider using the premium Web Crypto plugin, which leverages native APIs for faster encryption and decryption.
    • -
    • If big chunks of data are encrypted, store them in attachments instead of document fields. Attachments will only be decrypted on explicit fetches, not during queries.
    • -
    -
  • -
  • -

    Use DevMode in Development: RxDB's DevMode Plugin can help validate your schema and encryption setup during development. Disable it in production for performance reasons.

    -
  • -
  • -

    Secure Communication:

    -
      -
    • Use HTTPS to secure network communication between the app and any backend services.
    • -
    • If you're synchronizing data to a server, ensure the data is also encrypted in transit. RxDB's replication plugins can work with secure endpoints to keep data consistent.
    • -
    -
  • -
  • -

    SSL Pinning: Consider SSL Pinning if you want to prevent man-in-the-middle attacks. SSL Pinning ensures the device trusts only the pinned certificate, preventing attackers from swapping out valid certificates with their own.

    -
  • -
-

Follow Up

- -

By following these best practices and leveraging RxDB's powerful encryption plugins, you can build secure, performant, and robust React Native applications that keep your users' data safe.

- - \ No newline at end of file diff --git a/docs/articles/react-native-encryption.md b/docs/articles/react-native-encryption.md deleted file mode 100644 index 4b87c89ee54..00000000000 --- a/docs/articles/react-native-encryption.md +++ /dev/null @@ -1,192 +0,0 @@ -# React Native Encryption and Encrypted Database/Storage - -> Secure your React Native app with RxDB encryption. Learn why it matters, how to implement encrypted databases, and best practices to protect user data. - -# React Native Encryption and Encrypted Database/Storage - -Data security is a critical concern in modern mobile applications. As React Native continues to grow in popularity for building cross-platform apps, ensuring that your data is protected is paramount. RxDB, a real-time database for JavaScript applications, offers powerful encryption features that can help you secure your React Native app's data. - -This article explains why encryption is important, how to set it up with RxDB in [React Native](../react-native-database.md), and best practices to keep your app secure. - -## 🔒 Why Encryption Matters - -Encryption ensures that, even if an unauthorized party obtains physical access to your device or intercepts data, they cannot read the information without the encryption key. Sensitive user data such as credentials, personal information, or financial details should always be encrypted. Proper encryption practices reduce the risk of data breaches and help your application remain compliant with regulations like [GDPR](https://gdpr.eu/) or [HIPAA](https://www.hhs.gov/hipaa/index.html). - -## React Native Encryption Overview - -React Native supports multiple ways to secure local data: - -1. **Encrypted Databases** - Use databases with built-in encryption capabilities, such as SQLite with encryption layers or RxDB with its [encryption plugin](../encryption.md). - -2. **Secure Storage Libraries** - For key-value data (like tokens or secrets), you can use libraries like [react-native-keychain](https://github.com/oblador/react-native-keychain) or [react-native-encrypted-storage](https://github.com/emeraldsanto/react-native-encrypted-storage). - -3. **Custom Encryption** - If you need more fine-grained control, you can integrate libraries like [`crypto-js`](https://github.com/brix/crypto-js) or the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) to encrypt data before storing it in a database or file. - -
- - - -
- -## Setting Up Encryption in RxDB for React Native - -### 1. Install RxDB and Required Plugins - -Install RxDB and the encryption plugin(s) you need. For the CryptoJS plugin: - -```bash -npm install rxdb -npm install crypto-js -``` - -### 2. Set Up Your RxDB Database with Encryption - -RxDB offers two [encryption plugins](../encryption.md): -- **CryptoJS Plugin**: A free and straightforward solution for most basic use cases. -- **Web Crypto Plugin**: A [premium plugin](/premium) that utilizes the native Web Crypto API for better performance and security. - -Below is an example showing how to set up RxDB using the CryptoJS plugin. This example uses the [in-memory storage](../rx-storage-memory.md) for testing purposes. In a real production scenario, you would use a persistent storage adapter, mostly the [SQLite-based storage](../rx-storage-sqlite.md). - -```js -import { createRxDatabase } from 'rxdb'; -import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; - -/* - * For testing, we use the in-memory storage of RxDB. - * In production you would use the persistent SQLite based storage instead. - */ -import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; - -async function initEncryptedDatabase() { - // Wrap the normal storage with the encryption plugin - const encryptedMemoryStorage = wrappedKeyEncryptionCryptoJsStorage({ - storage: getRxStorageMemory() - }); - - // Create an encrypted database - const db = await createRxDatabase({ - name: 'myEncryptedDatabase', - storage: encryptedMemoryStorage, - password: 'sudoLetMeIn' // Make sure not to hardcode in production - }); - - // Define a schema and create a collection - await db.addCollections({ - secureData: { - schema: { - title: 'secure data schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { - type: 'string', - maxLength: 100 - }, - normalField: { - type: 'string' - }, - secretField: { - type: 'string' - } - }, - required: ['id', 'normalField', 'secretField'] - } - } - }); - - return db; -} -``` - -### 3. Inserting and Querying Encrypted Data - -Once you've set up the database with encryption, data in fields specified by your schema will be encrypted automatically before it is stored, and decrypted when queried. - -```js -(async () => { - const db = await initEncryptedDatabase(); - - // Insert encrypted data - const doc = await db.secureData.insert({ - id: 'mySecretId', - normalField: 'foobar', - secretField: 'This is top secret data' - }); - - // Query encrypted data by its primary key or non-encrypted fields - const fetchedDoc = await db.secureData.findOne({ - selector: { - normalField: 'foobar' - } - }).exec(true); - console.log(fetchedDoc.secretField); // 'This is top secret data' - - // Update data - await fetchedDoc.patch({ - secretField: 'Updated secret data' - }); -})(); -``` - -**Note**: You can only query directly by non-encrypted fields or primary keys. Encrypted fields cannot be used in queries because they are stored as ciphertext in the database. A common approach is to have a small subset of fields that need to be queried unencrypted while storing any sensitive data in encrypted fields. - -## Best Practices for React Native Encryption - -- **Secure Password Handling** - - Avoid hardcoding passwords or encryption keys. - - Use secure storage solutions like React Native Keychain or react-native-encrypted-storage to fetch the database password at runtime: - -```js -// Example: using react-native-keychain to securely retrieve a stored password -import * as Keychain from 'react-native-keychain'; - -async function getDatabasePassword() { - const credentials = await Keychain.getGenericPassword(); - if (credentials) { - return credentials.password; - } - throw new Error('No password stored in Keychain'); -} -``` - -- **Encrypt Attachments**: -If you need to store files (images, text files, etc.), consider encrypting attachments. RxDB supports attachments that can be encrypted automatically, ensuring your files are protected: - -```ts -import { createBlob } from 'rxdb/plugins/core'; -const doc = await await db.secureData.findOne({ - selector: { - normalField: 'foobar' - } -}).exec(true); -const attachment = await doc.putAttachment({ - id: 'encryptedFile.txt', - data: createBlob('Sensitive content', 'text/plain'), - type: 'text/plain', -}); -``` - -- **Optimize Performance** - - If performance is critical, consider using the premium Web Crypto plugin, which leverages native APIs for faster encryption and decryption. - - If big chunks of data are encrypted, store them in attachments instead of document fields. Attachments will only be decrypted on explicit fetches, not during queries. - -- **Use DevMode in Development**: RxDB's [DevMode Plugin](../dev-mode.md) can help validate your schema and encryption setup during development. Disable it in production for performance reasons. - -- **Secure Communication**: - - Use HTTPS to secure network communication between the app and any backend services. - - If you're synchronizing data to a server, ensure the data is also encrypted in transit. RxDB's [replication plugins](../replication.md) can work with secure endpoints to keep data consistent. - -- **SSL Pinning**: Consider SSL Pinning if you want to prevent man-in-the-middle attacks. SSL Pinning ensures the device trusts only the pinned certificate, preventing attackers from swapping out valid certificates with their own. - -## Follow Up - -- Learn how to use RxDB with the [RxDB Quickstart](../quickstart.md) for a guided introduction. -- A good way to learn using RxDB database with React Native is to check out the [RxDB React Native example](https://github.com/pubkey/rxdb/tree/master/examples/react-native) and use that as a tutorial. -- Check out the [RxDB GitHub repository](https://github.com/pubkey/rxdb) and leave a star ⭐ if you find it useful. -- Learn more about the [RxDB encryption plugins](../encryption.md). - -By following these best practices and leveraging RxDB's powerful encryption plugins, you can build secure, performant, and robust React Native applications that keep your users' data safe. diff --git a/docs/articles/reactjs-storage.html b/docs/articles/reactjs-storage.html deleted file mode 100644 index b4b64b98ba6..00000000000 --- a/docs/articles/reactjs-storage.html +++ /dev/null @@ -1,254 +0,0 @@ - - - - - -ReactJS Storage - From Basic LocalStorage to Advanced Offline Apps with RxDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB

-

Modern ReactJS applications often need to store data on the client side. Whether you’re preserving simple user preferences or building offline-ready features, choosing the right storage mechanism can make or break your development experience. In this guide, we’ll start with a basic localStorage approach for minimal data. Then, we’ll explore more powerful, reactive solutions via RxDB—including offline functionality, indexing, preact signals, and even encryption.

-
-

Part 1: Storing Data in ReactJS with LocalStorage

-

localStorage is a built-in browser API for storing key-value pairs in the user’s browser. It’s straightforward to set and get items—ideal for trivial preferences or small usage data.

-
import React, { useState, useEffect } from 'react';
- 
-function LocalStorageExample() {
-  const [username, setUsername] = useState(() => {
-    const saved = localStorage.getItem('username');
-    return saved ? JSON.parse(saved) : '';
-  });
- 
-  useEffect(() => {
-    localStorage.setItem('username', JSON.stringify(username));
-  }, [username]);
- 
-  return (
-    <div>
-      <h2>ReactJS LocalStorage Demo</h2>
-      <input
-        type="text"
-        value={username}
-        onChange={e => setUsername(e.target.value)}
-        placeholder="Enter your username"
-      />
-      <p>Stored: {username}</p>
-    </div>
-  );
-}
- 
-export default LocalStorageExample;
-

Pros of localStorage in ReactJS:

-
    -
  • Easy to implement quickly for minimal data
  • -
  • Built-in to the browser—no extra libs
  • -
  • Persistent across sessions
  • -
-

Downsides of localStorage -While localStorage is convenient for small amounts of data, it has certain limitations:

-
    -
  • Synchronous: Reading or writing localStorage can block the main thread if data is large.
  • -
  • No advanced queries: You only store stringified objects by a single key. Searching or filtering requires manually scanning everything.
  • -
  • No concurrency or offline logic: If multiple tabs or users need to manipulate the same data, localStorage doesn’t handle concurrency or sync with a server.
  • -
  • No indexing: You can’t perform partial lookups or advanced matching.
  • -
-

For “remember user preference” use cases, localStorage is excellent. But if your app grows complex—needing structured data, large data sets, or offline-first features—you might quickly surpass localStorage’s utility.

-

Part 2: LocalStorage vs. IndexedDB

-

While localStorage is simple, it’s limited to string-based key-value lookups and can be synchronous for all reads/writes. For more robust ReactJS storage needs, browsers also provide IndexedDB—a low-level, asynchronous API that can store larger amounts of JSON data with indexing.

-

LocalStorage:

-
    -
  • Good for small amounts of data (like user settings or flags)
  • -
  • String-only storage
  • -
  • Single key-value access, no searching by subfields
  • -
-

IndexedDB:

-
    -
  • Stores large JSON objects, able to index by multiple fields
  • -
  • Asynchronous and usually more scalable
  • -
  • More complicated to use directly (i.e., not as simple as .getItem()) -RxDB, as you’ll see, simplifies IndexedDB usage in ReactJS by adding a more intuitive layer for queries, reactivity, and advanced capabilities like encryption.
  • -
-
RxDB
-

Part 3: Moving Beyond Basic Storage: RxDB for ReactJS

-

When data shapes get complex—large sets of nested documents, or you want offline sync to a server—RxDB can transform your approach to ReactJS storage. It stores documents in (usually) IndexedDB or alternative backends but offers a reactive, NoSQL-based interface.

-

RxDB Quick Example (Observables)

-
import { createRxDatabase } from 'rxdb';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
- 
-(async function setUpRxDB() {
-  const db = await createRxDatabase({
-    name: 'heroDB',
-    storage: getRxStorageLocalstorage(),
-    multiInstance: false
-  });
- 
-  const heroSchema = {
-    title: 'hero schema',
-    version: 0,
-    type: 'object',
-    primaryKey: 'id',
-    properties: {
-      id: { type: 'string' },
-      name: { type: 'string' },
-      power: { type: 'string' }
-    },
-    required: ['id', 'name']
-  };
- 
-  await db.addCollections({ heroes: { schema: heroSchema } });
- 
-  // Insert a doc
-  await db.heroes.insert({ id: '1', name: 'AlphaHero', power: 'Lightning' });
- 
-  // Query docs once
-  const allHeroes = await db.heroes.find().exec();
-  console.log('Heroes: ', allHeroes);
-})();
-

Reactive Queries: In a React component, you can subscribe to a query via RxDB’s $ property, letting your UI automatically update when data changes. React components can subscribe to updates from .find() queries, letting the UI automatically reflect changes—perfect for dynamic offline-first apps.

-
import React, { useEffect, useState } from 'react';
- 
-function HeroList({ collection }) {
-  const [heroes, setHeroes] = useState([]);
- 
-  useEffect(() => {
-    const query = collection.find();
-    // query.$ is an RxJS Observable that emits whenever data changes
-    const sub = query.$.subscribe(newHeroes => {
-      setHeroes(newHeroes);
-    });
- 
-    return () => sub.unsubscribe(); // clean up subscription
-  }, [collection]);
- 
-  return (
-    <ul>
-      {heroes.map(hero => (
-        <li key={hero.id}>
-          {hero.name} - Power: {hero.power}
-        </li>
-      ))}
-    </ul>
-  );
-}
- 
-export default HeroList;
-

realtime ui updates

-

By using these reactive queries, your React app knows exactly when data changes locally (or from another browser tab) or from remote sync, keeping your UI in sync effortlessly.

-

Part 4: Using Preact Signals Instead of Observables

-

RxDB typically exposes reactivity via RxJS observables. However, some developers prefer newer reactivity approaches like Preact Signals. RxDB supports them via a special plugin or advanced usage:

-
import { createRxDatabase } from 'rxdb/plugins/core';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
-import { PreactSignalsRxReactivityFactory } from 'rxdb/plugins/reactivity-preact-signals';
- 
-(async function setUpRxDBWithSignals() {
-  const db = await createRxDatabase({
-    name: 'heroDB_signals',
-    storage: getRxStorageLocalstorage(),
-    reactivity: PreactSignalsRxReactivityFactory
-  });
- 
-  // Create a signal-based query instead of using Observables:
-  const collection = db.heroes;
-  const heroesSignal = collection.find().$$; // signals version
-  // Now you can reference heroesSignal() in Preact or React with adapter usage
-})();
-

Preact Signals rely on signals instead of Observables. Some developers find them more straightforward to adopt, especially for fine-grained reactivity. In ReactJS, you might still prefer RxJS-based subscriptions unless you add bridging code for signals.

-

Part 5: Encrypting the Storage with RxDB

-

For more advanced ReactJS storage needs—especially when sensitive user data is involved - you might want to encrypt stored documents at rest. RxDB provides a robust encryption plugin:

-
import { createRxDatabase } from 'rxdb';
-import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
- 
-(async function secureSetup() {
-  const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({
-    storage: getRxStorageLocalstorage()
-  });
- 
-  // Provide a password for encryption
-  const db = await createRxDatabase({
-    name: 'secureReactStorage',
-    storage: encryptedStorage,
-    password: 'MyStrongPassword123'
-  });
- 
-  await db.addCollections({
-    secrets: {
-      schema: {
-        title: 'secret schema',
-        version: 0,
-        type: 'object',
-        primaryKey: 'id',
-        properties: {
-          id: { type: 'string' },
-          secretInfo: { type: 'string' }
-        },
-        required: ['id'],
-        encrypted: ['secretInfo'] // field to encrypt
-      }
-    }
-  });
-})();
-

All data in the marked encrypted fields is automatically encrypted at rest. This is crucial if you store user credentials, private messages, or other personal data in your ReactJS application storage.

-

Offline Sync

-

If you need multi-device or multi-user data synchronization, RxDB provides replication plugins for various endpoints (HTTP, GraphQL, CouchDB, Firestore, etc.). Your local offline changes can then merge automatically with a remote database whenever internet connectivity is restored.

-

Overview: localStorage vs IndexedDB vs RxDB

-
CharacteristiclocalStorageIndexedDBRxDB
Data ModelKey-value store (only strings)Low-level, JSON-like storage engine with object stores and indexesNoSQL JSON documents with optional JSON-Schema
Query CapabilitiesBasic get/set by key; manual parse for more complex searchesIndex-based queries, but API is fairly verbose; lacks a high-level query languageJSON-based queries, optional indexes, real-time reactivity
ObservabilityNone. Must re-fetch data yourself.None natively. Must implement eventing or manual re-check.Built-in reactivity. UI auto-updates via Observables or Preact signals
Large Data UsageNot recommended for large data (blocking, synchronous calls)Better for large amounts of data, asynchronous reads/writesScales for medium to large data. Uses IndexedDB or other storages under the hood
ConcurrencyMinimal. Overwrites if multiple tabs write simultaneouslyMultiple tabs can open the same DB, but must handle concurrency logic carefullyMulti-instance concurrency with built-in conflict resolution plugins if needed
Offline SyncNone. Purely local.None out of the box. Must be implemented manuallyBuilt-in replication to remote endpoints (HTTP, GraphQL, CouchDB, etc.) for offline-first usage
EncryptionNot supported nativelyNot supported natively; must encrypt data manually before storingEncryption plugins available. Supports field-level encryption at rest
UsageGreat for small flags or settings
-

Follow Up

-

If you’re looking to dive deeper into ReactJS storage topics and take full advantage of RxDB’s offline-first, real-time capabilities, here are some recommended resources:

- -

With these follow-up steps, you can refine your reactjs storage strategy to meet your app’s unique needs, whether it’s simple user preferences or robust offline data syncing.

- - \ No newline at end of file diff --git a/docs/articles/reactjs-storage.md b/docs/articles/reactjs-storage.md deleted file mode 100644 index 855f8921e3f..00000000000 --- a/docs/articles/reactjs-storage.md +++ /dev/null @@ -1,266 +0,0 @@ -# ReactJS Storage - From Basic LocalStorage to Advanced Offline Apps with RxDB - -> Discover how to implement reactjs storage using localStorage for quick key-value data, then move on to more robust offline-first approaches with RxDB, IndexedDB, preact signals, encryption plugins, and more. - -# ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB - -Modern **ReactJS** applications often need to store data on the client side. Whether you’re preserving simple user preferences or building offline-ready features, choosing the right **storage** mechanism can make or break your development experience. In this guide, we’ll start with a basic **localStorage** approach for minimal data. Then, we’ll explore more powerful, reactive solutions via [RxDB](/)—including offline functionality, indexing, `preact signals`, and even encryption. - ---- - -## Part 1: Storing Data in ReactJS with LocalStorage - -`localStorage` is a built-in browser API for storing key-value pairs in the user’s browser. It’s straightforward to set and get items—ideal for trivial preferences or small usage data. - -```jsx -import React, { useState, useEffect } from 'react'; - -function LocalStorageExample() { - const [username, setUsername] = useState(() => { - const saved = localStorage.getItem('username'); - return saved ? JSON.parse(saved) : ''; - }); - - useEffect(() => { - localStorage.setItem('username', JSON.stringify(username)); - }, [username]); - - return ( - - ReactJS LocalStorage Demo - setUsername(e.target.value)} - placeholder="Enter your username" - /> - Stored: {username} - - ); -} - -export default LocalStorageExample; -``` - -**Pros** of localStorage in ReactJS: - -- Easy to implement quickly for minimal data -- Built-in to the browser—no extra libs -- Persistent across sessions - -**Downsides of localStorage** -While localStorage is convenient for small amounts of data, it has certain limitations: - -- Synchronous: Reading or writing localStorage can block the main thread if data is large. -- No advanced queries: You only store stringified objects by a single key. Searching or filtering requires manually scanning everything. -- No concurrency or offline logic: If multiple tabs or users need to manipulate the same data, localStorage doesn’t handle concurrency or sync with a server. -- No indexing: You can’t perform partial lookups or advanced matching. - -For “remember user preference” use cases, localStorage is excellent. But if your app grows complex—needing structured data, large data sets, or offline-first features—you might quickly surpass localStorage’s utility. - -## Part 2: LocalStorage vs. IndexedDB - -While localStorage is simple, it’s limited to string-based key-value lookups and can be synchronous for all reads/writes. For more robust ReactJS storage needs, browsers also provide IndexedDB—a low-level, asynchronous API that can store larger amounts of JSON data with indexing. - -**LocalStorage:** - -- Good for small amounts of data (like user settings or flags) -- String-only storage -- Single key-value access, no searching by subfields - -**IndexedDB:** - -- Stores [large](./indexeddb-max-storage-limit.md) JSON objects, able to index by multiple fields -- Asynchronous and usually more scalable -- More complicated to use directly (i.e., not as simple as .getItem()) -[RxDB](/), as you’ll see, simplifies [IndexedDB](../rx-storage-indexeddb.md) usage in ReactJS by adding a more intuitive layer for queries, reactivity, and advanced capabilities like [encryption](../encryption.md). - -
- - - -
- -## Part 3: Moving Beyond Basic Storage: RxDB for ReactJS - -When data shapes get complex—large sets of nested documents, or you want offline sync to a server—RxDB can transform your approach to ReactJS storage. It stores documents in (usually) IndexedDB or alternative backends but offers a reactive, NoSQL-based interface. - -### RxDB Quick Example (Observables) - -```ts -import { createRxDatabase } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -(async function setUpRxDB() { - const db = await createRxDatabase({ - name: 'heroDB', - storage: getRxStorageLocalstorage(), - multiInstance: false - }); - - const heroSchema = { - title: 'hero schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string' }, - name: { type: 'string' }, - power: { type: 'string' } - }, - required: ['id', 'name'] - }; - - await db.addCollections({ heroes: { schema: heroSchema } }); - - // Insert a doc - await db.heroes.insert({ id: '1', name: 'AlphaHero', power: 'Lightning' }); - - // Query docs once - const allHeroes = await db.heroes.find().exec(); - console.log('Heroes: ', allHeroes); -})(); -``` - -Reactive Queries: In a React component, you can subscribe to a query via RxDB’s $ property, letting your UI automatically update when data changes. React components can subscribe to updates from .find() queries, letting the UI automatically reflect changes—perfect for dynamic offline-first apps. - -```tsx -import React, { useEffect, useState } from 'react'; - -function HeroList({ collection }) { - const [heroes, setHeroes] = useState([]); - - useEffect(() => { - const query = collection.find(); - // query.$ is an RxJS Observable that emits whenever data changes - const sub = query.$.subscribe(newHeroes => { - setHeroes(newHeroes); - }); - - return () => sub.unsubscribe(); // clean up subscription - }, [collection]); - - return ( - - {heroes.map(hero => ( - - {hero.name} - Power: {hero.power} - - ))} - - ); -} - -export default HeroList; -``` - - - -By using these reactive queries, your React app knows exactly when data changes locally (or from another browser tab) or from remote sync, keeping your UI in sync effortlessly. - -## Part 4: Using Preact Signals Instead of Observables - -RxDB typically exposes reactivity via RxJS observables. However, some developers prefer newer reactivity approaches like Preact Signals. RxDB supports them via a special plugin or advanced usage: - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -import { PreactSignalsRxReactivityFactory } from 'rxdb/plugins/reactivity-preact-signals'; - -(async function setUpRxDBWithSignals() { - const db = await createRxDatabase({ - name: 'heroDB_signals', - storage: getRxStorageLocalstorage(), - reactivity: PreactSignalsRxReactivityFactory - }); - - // Create a signal-based query instead of using Observables: - const collection = db.heroes; - const heroesSignal = collection.find().$$; // signals version - // Now you can reference heroesSignal() in Preact or React with adapter usage -})(); -``` - -Preact Signals rely on `signals` instead of `Observables`. Some developers find them more straightforward to adopt, especially for fine-grained reactivity. In ReactJS, you might still prefer RxJS-based subscriptions unless you add bridging code for signals. - -## Part 5: Encrypting the Storage with RxDB - -For more advanced ReactJS storage needs—especially when sensitive user data is involved - you might want to encrypt stored documents at rest. RxDB provides a robust [encryption plugin](../encryption.md): - -```ts -import { createRxDatabase } from 'rxdb'; -import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -(async function secureSetup() { - const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ - storage: getRxStorageLocalstorage() - }); - - // Provide a password for encryption - const db = await createRxDatabase({ - name: 'secureReactStorage', - storage: encryptedStorage, - password: 'MyStrongPassword123' - }); - - await db.addCollections({ - secrets: { - schema: { - title: 'secret schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string' }, - secretInfo: { type: 'string' } - }, - required: ['id'], - encrypted: ['secretInfo'] // field to encrypt - } - } - }); -})(); -``` - -All data in the marked `encrypted` fields is automatically encrypted at rest. This is crucial if you store user credentials, private messages, or other personal data in your ReactJS application storage. - -## Offline Sync -If you need multi-device or multi-user data synchronization, RxDB provides [replication plugins](../replication.md) for various endpoints (HTTP, [GraphQL](../replication-graphql.md), [CouchDB](../replication-couchdb.md), [Firestore](../replication-firestore.md), etc.). Your [local offline](../offline-first.md) changes can then merge automatically with a remote database whenever internet connectivity is restored. - -## Overview: [localStorage vs IndexedDB vs RxDB](./localstorage-indexeddb-cookies-opfs-sqlite-wasm.md) - -| **Characteristic** | **localStorage** | **IndexedDB** | **RxDB** | -|--------------------------|---------------------------------------------------------------------|----------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------| -| **Data Model** | Key-value store (only strings) | Low-level, JSON-like storage engine with object stores and indexes | NoSQL JSON documents with optional JSON-Schema | -| **Query Capabilities** | Basic get/set by key; manual parse for more complex searches | Index-based queries, but API is fairly verbose; lacks a high-level query language | JSON-based queries, optional indexes, real-time reactivity | -| **Observability** | None. Must re-fetch data yourself. | None natively. Must implement eventing or manual re-check. | Built-in reactivity. UI auto-updates via Observables or Preact signals | -| **Large Data Usage** | Not recommended for large data (blocking, synchronous calls) | Better for large amounts of data, asynchronous reads/writes | Scales for medium to large data. Uses IndexedDB or other storages under the hood | -| **Concurrency** | Minimal. Overwrites if multiple tabs write simultaneously | Multiple tabs can open the same DB, but must handle concurrency logic carefully | Multi-instance concurrency with built-in conflict resolution plugins if needed | -| **Offline Sync** | None. Purely local. | None out of the box. Must be implemented manually | Built-in replication to remote endpoints (HTTP, GraphQL, CouchDB, etc.) for offline-first usage | -| **Encryption** | Not supported natively | Not supported natively; must encrypt data manually before storing | Encryption plugins available. Supports field-level encryption at rest | -| **Usage** | Great for small flags or settings - -## Follow Up - -If you’re looking to dive deeper into **ReactJS storage** topics and take full advantage of RxDB’s offline-first, real-time capabilities, here are some recommended resources: - -- **[RxDB Official Documentation](../overview.md)** - Explore detailed guides on setting up storage adapters, defining [JSON schemas](../rx-schema.md), [handling conflicts](../transactions-conflicts-revisions.md), and enabling [offline synchronization](../replication.md). - -- **[RxDB Quickstart](https://rxdb.info/quickstart.html)** - Get a step-by-step tutorial to create your first RxDB-based application in minutes. - -- **[RxDB GitHub Repository](https://github.com/pubkey/rxdb)** - See the source code, open issues, and browse community-driven examples that integrate ReactJS, Preact Signals, and advanced features like encryption. - -- **[RxDB Encryption Plugins](https://rxdb.info/encryption.html)** - Learn how to encrypt fields in your collections, protecting user data and meeting compliance requirements. - -- **[Preact Signals React Integration (Example)](https://github.com/preactjs/signals#react)** - If you want to combine React with signals-based reactivity, check out example code and bridging approaches. - -- **[MDN: Using the Web Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API)** - Refresh on localStorage basics, including best practices for small key-value data in traditional React apps. - -With these follow-up steps, you can refine your **reactjs storage** strategy to meet your app’s unique needs, whether it’s simple user preferences or robust offline data syncing. diff --git a/docs/articles/realtime-database.html b/docs/articles/realtime-database.html deleted file mode 100644 index dfe2e57dbb8..00000000000 --- a/docs/articles/realtime-database.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - -What Really Is a Realtime Database? | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

What is a realtime database?

-

I have been building RxDB, a NoSQL realtime JavaScript database for many years. -Often people get confused by the word realtime database, because the word realtime is so vaguely defined that it can mean everything and nothing at the same time.

-

In this article we will explore what a realtime database is, and more important, what it is not.

-
JavaScript Realtime Database
-

Realtime as in realtime computing

-

When "normal" developers hear the word "realtime", they think of Real-time computing (RTC). Real-time computing is a type of computer processing that guarantees specific response times for tasks or events, crucial in applications like industrial control, automotive systems, and aerospace. It relies on specialized operating systems (RTOS) to ensure predictability and low latency. Hard real-time systems must never miss deadlines, while soft real-time systems can tolerate occasional delays. Real-time responses are often understood to be in the order of milliseconds, and sometimes microseconds.

-

Consider the role of real-time computing in car airbags: sensors detect collision force, swiftly process the data, and immediately decide to deploy the airbags within milliseconds. Such rapid action is imperative for safeguarding passengers. Hence, the controlling chip must guarantee a certain response time - it must operate in "realtime".

-

But when people talk about realtime databases, especially in the web-development world, they almost never mean realtime, as in realtime computing, they mean something else. -In fact, with any programming language that run on end users devices, it is not even possible to built a "real" realtime database. A program, like a JavaScript (browser or Node.js) process, can be halted by the operating systems task manager at any time and therefore it will never be able to guarantee specific response times. To build a realtime computing database, you would need a realtime capable operating system.

-

Real time Database as in realtime replication

-

When talking about realtime databases, most people refer to realtime, as in realtime replication. -Often they mean a very specific product which is the Firebase Realtime Database (not the Firestore).

-

firebase realtime replication

-

In the context of the Firebase Realtime Database, "realtime" means that data changes are synchronized and delivered to all connected clients or devices as soon as they occur, typically within milliseconds. This means that when any client updates, adds, or removes data in the database, all other clients that are connected to the same database instance receive those updates instantly, without the need for manual polling or frequent HTTP requests.

-

In short, when replicating data between databases, instead of polling, we use a websocket connection to live-stream all changes between the server and the clients, this is labeled as "realtime database". A similar thing can be done with RxDB and the RxDB Replication Plugins.

-

database replication

-

Realtime as in realtime applications

-

In the context of realtime client-side applications, "realtime" refers to the immediate or near-instantaneous processing and response to events or data inputs. When data changes, the application must directly update to reflect the new data state, without any user interaction or delay. Notice that the change to the data could have come from any source, like a user action, an operation in another browser tab, or even an operation from another device that has been replicated to the client.

-

realtime applications

-

In contrast to push-pull based databases (e.g., MySQL or MongoDB servers), a realtime database contains features which make it easy to build realtime applications. For example with RxDB you can not only fetch query results once, but instead you can subscribe to a query and directly update the HTML dom tree whenever the query has a new result set:

-
await db.heroes.find({
-  selector: {
-    healthpoints: {
-      $gt: 0
-    }
-  }
-})
-.$ // The $ returns an observable that emits whenever the query's result set changes.
-.subscribe(aliveHeroes => {
-    // Refresh the HTML list each time there are new query results.
-    const newContent = aliveHeroes.map(doc => '<li>' + doc.name + '</li>');
-    document.getElementById('#myList').innerHTML = newContent;
-});
- 
-// You can even subscribe to any RxDB document's fields.
-myDocument.firstName$.subscribe(newName => console.log('name is: ' + newName));
-

A competent realtime application is engineered to offer feedback or results swiftly, ideally within milliseconds to microseconds. Ideally, a data modification should be processed in under 16 milliseconds (since 1 second divided by 60 frames equals 16.66ms) to ensure users don't perceive any lag from input to visualization. RxDB utilizes the EventReduce algorithm to manage changes more swiftly than 16ms. However, it can never assure fixed response times as a "realtime computing database" would.

-

Follow Up

-
- - \ No newline at end of file diff --git a/docs/articles/realtime-database.md b/docs/articles/realtime-database.md deleted file mode 100644 index fc0539aa8aa..00000000000 --- a/docs/articles/realtime-database.md +++ /dev/null @@ -1,75 +0,0 @@ -# What Really Is a Realtime Database? - -> Discover how RxDB merges realtime replication and dynamic updates to deliver seamless data sync across browsers, devices, and servers - instantly. - -# What is a realtime database? - -I have been building [RxDB](https://rxdb.info/), a NoSQL **realtime** JavaScript database for many years. -Often people get confused by the word **realtime database**, because the word **realtime** is so vaguely defined that it can mean everything and nothing at the same time. - -In this article we will explore what a realtime database is, and more important, what it is not. - -
- - - -
- -## Realtime as in **realtime computing** - -When "normal" developers hear the word "realtime", they think of **Real-time computing (RTC)**. Real-time computing is a type of computer processing that **guarantees specific response times** for tasks or events, crucial in applications like industrial control, automotive systems, and aerospace. It relies on specialized operating systems (RTOS) to ensure predictability and low latency. Hard real-time systems must never miss deadlines, while soft real-time systems can tolerate occasional delays. Real-time responses are often understood to be in the order of milliseconds, and sometimes microseconds. - -Consider the role of real-time computing in car airbags: sensors detect collision force, swiftly process the data, and immediately decide to deploy the airbags within milliseconds. Such rapid action is imperative for safeguarding passengers. Hence, the controlling chip must **guarantee a certain response time** - it must operate in "realtime". - -But when people talk about **realtime databases**, especially in the web-development world, they almost never mean realtime, as in **realtime computing**, they mean something else. -In fact, with any programming language that run on end users devices, it is not even possible to built a "real" realtime database. A program, like a JavaScript ([browser](./browser-database.md) or [Node.js](../nodejs-database.md)) process, can be halted by the operating systems task manager at any time and therefore it will never be able to guarantee specific response times. To build a realtime computing database, you would need a realtime capable operating system. - -## Real time Database as in **realtime replication** - -When talking about realtime databases, most people refer to realtime, as in realtime replication. -Often they mean a very specific product which is the **Firebase Realtime Database** (not the [Firestore](../replication-firestore.md)). - - - -In the context of the Firebase Realtime Database, "realtime" means that data changes are synchronized and delivered to all connected clients or devices as soon as they occur, typically within milliseconds. This means that when any client updates, adds, or removes data in the database, all other clients that are connected to the same database instance receive those updates instantly, without the need for manual polling or frequent HTTP requests. - -In short, when replicating data between databases, instead of polling, we use a [websocket connection](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) to live-stream all changes between the server and the clients, this is labeled as "realtime database". A similar thing can be done with RxDB and the [RxDB Replication Plugins](../replication.md). - - - - - -## Realtime as in **realtime applications** - -In the context of realtime client-side applications, "realtime" refers to the immediate or near-instantaneous processing and response to events or data inputs. When data changes, the application must directly update to reflect the new data state, without any user interaction or delay. Notice that the change to the data could have come from any source, like a user action, an operation in another browser tab, or even an operation from another device that has been replicated to the client. - - - -In contrast to push-pull based databases (e.g., MySQL or MongoDB servers), a realtime database contains **features which make it easy to build realtime applications**. For example with RxDB you can not only fetch query results once, but instead you can subscribe to a query and directly update the HTML dom tree whenever the query has a new result set: - -```ts -await db.heroes.find({ - selector: { - healthpoints: { - $gt: 0 - } - } -}) -.$ // The $ returns an observable that emits whenever the query's result set changes. -.subscribe(aliveHeroes => { - // Refresh the HTML list each time there are new query results. - const newContent = aliveHeroes.map(doc => '' + doc.name + ''); - document.getElementById('#myList').innerHTML = newContent; -}); - -// You can even subscribe to any RxDB document's fields. -myDocument.firstName$.subscribe(newName => console.log('name is: ' + newName)); -``` - -A competent realtime application is engineered to offer feedback or results swiftly, ideally within milliseconds to microseconds. Ideally, a data modification should be processed in under **16 milliseconds** (since 1 second divided by 60 frames equals 16.66ms) to ensure users don't perceive any lag from input to visualization. RxDB utilizes the [EventReduce algorithm](https://github.com/pubkey/event-reduce) to manage changes more swiftly than 16ms. However, it can never assure fixed response times as a "realtime computing database" would. - -## Follow Up - -- Dive into the [RxDB Quickstart](https://rxdb.info/quickstart.html) -- Discover more about the [RxDB realtime Sync Engine](../replication.md) -- Join the conversation at [RxDB Chat](https://rxdb.info/chat/) diff --git a/docs/articles/vue-database.html b/docs/articles/vue-database.html deleted file mode 100644 index 76449b37750..00000000000 --- a/docs/articles/vue-database.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - -RxDB as a Database in a Vue.js Application | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RxDB as a Database in a Vue Application

-

In the modern web ecosystem, Vue has become a leading choice for building highly performant, reactive single-page applications (SPAs). However, while Vue excels at managing and updating the user interface, robust and efficient data handling also plays a pivotal role in delivering a great user experience. Enter RxDB, a reactive JavaScript database that runs in the browser (and beyond), offering significant capabilities such as offline-first data handling, real-time synchronization, and straightforward integration with Vue's reactivity system.

-

This article explores how RxDB works, why it's a perfect match for Vue, and how you can leverage it to build more engaging, performant, and data-resilient Vue applications.

-
JavaScript Vue Database
-

Why Vue Applications Need a Database

-

Vue is renowned for its lightweight core and flexible architecture centered around reactive state management and reusable components. However, modern Vue applications often require:

-
    -
  • Offline Capabilities: Allowing users to continue working even without internet access.
  • -
  • Real-Time Updates: Keeping UI data in sync with changes as they occur, whether locally or from other connected clients.
  • -
  • Improved Performance: Reducing server round trips and leveraging local storage for faster data operations.
  • -
  • Scalable Data Handling: Managing increasingly large datasets or complex queries right in the browser.
  • -
-

While you can store data in Vuex/Pinia stores or via direct AJAX calls, these solutions may not suffice when your application demands a full-featured offline-first database or complex synchronization with a server. RxDB addresses these needs with a dedicated, reactive, browser-based database that pairs seamlessly with Vue's reactivity system.

-

Introducing RxDB as a Database Solution

-

RxDB - short for Reactive Database - is built on the principle of combining NoSQL database capabilities with reactive programming. It runs inside your client-side environment (browser, Node.js, or mobile devices) and provides:

-
    -
  1. Real-Time Reactivity: Automatically updates subscribed components whenever data changes.
  2. -
  3. Offline-First Approach: Stores data locally and syncs with the server when online connectivity is restored.
  4. -
  5. Data Replication: Effortlessly keeps data synchronized across multiple tabs, devices, or server instances.
  6. -
  7. Multi-Tab Support: Seamlessly propagates changes to all open tabs in the user's browser.
  8. -
  9. Observable Queries: Automatically refresh the result set when documents in your queried collection change.
  10. -
-

RxDB vs. Other Vue Database Options

-

Compared to traditional approaches - like raw IndexedDB or local storage - RxDB adds a powerful, reactive layer that simplifies your data flow. While tools like Vuex or Pinia are great for state management, they are not fully fledged databases with features like replication, conflict resolution, and offline persistence. RxDB bridges the gap by providing an integrated data handling solution tailor-made for modern, data-intensive Vue applications.

-

Getting Started with RxDB

-

Let's break down the essentials for using RxDB within a Vue application.

-

Installation

-

You can install RxDB (and RxJS, which it depends on) via npm or yarn:

-
npm install rxdb rxjs
-

Creating and Configuring Your Database

-

Within your Vue project, you can set up an RxDB instance in a dedicated file or a Vue plugin. Below is an example using Localstorage as the storage engine:

-
// db.js
-import { createRxDatabase } from 'rxdb';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
- 
-export async function initDatabase() {
-  const db = await createRxDatabase({
-    name: 'heroesdb',
-    storage: getRxStorageLocalstorage(),
-    password: 'myPassword',    // optional encryption password
-    multiInstance: true,       // multi-tab support
-    eventReduce: true          // optimize event handling
-  });
- 
-  await db.addCollections({
-    hero: {
-      schema: {
-        title: 'hero schema',
-        version: 0,
-        primaryKey: 'id',
-        type: 'object',
-        properties: {
-          id: { type: 'string' },
-          name: { type: 'string' },
-          healthpoints: { type: 'number' }
-        }
-      }
-    }
-  });
- 
-  return db;
-}
-

After creating the RxDB instance, you can share it across your application (for example, by providing it in a plugin or a global property in Vue).

-

Vue Reactivity and RxDB Observables

-

RxDB queries return RxJS observables (.$). Vue can automatically update components when data changes if you manually subscribe and store results in Vue refs/reactive objects, or if you use RxDB's custom reactivity for Vue.

-

Example with Vue 3 Composition API:

-
// HeroList.vue
-<script setup>
-import { ref, onMounted } from 'vue';
-import { initDatabase } from '@/db';
- 
-const heroes = ref([]);
-let db;
- 
-onMounted(async () => {
-  db = await initDatabase();
- 
-  // Subscribe to an RxDB query
-  db.hero
-    .find({
-      selector: {
-        healthpoints: { $gt: 0 }
-      },
-      sort: [{ name: 'asc' }]
-    })
-    .$ // the dot-$ is an observable that emits whenever the query results change
-    .subscribe((newHeroes) => {
-      heroes.value = newHeroes;
-    });
-});
-</script>
- 
-<template>
-  <ul>
-    <li v-for="hero in heroes" :key="hero.id">
-      {{ hero.name }} - HP: {{ hero.healthpoints }}
-    </li>
-  </ul>
-</template>
-

Different RxStorage Layers for RxDB

-

RxDB supports multiple storage backends - called "RxStorage layers" - giving you flexibility in how data is persisted:

- -

Choose the storage option that best aligns with your Vue application's requirements for performance, persistence, and platform compatibility.

-

Synchronizing Data with RxDB between Clients and Servers

-

RxDB champions an offline-first approach: data is kept locally so that your Vue app remains usable, even without internet. When connectivity is restored, RxDB ensures your local changes synchronize to the server, resolving conflicts as necessary.

-

database replication

-
    -
  • Real-Time Synchronization: With RxDB's replication plugins, any local change can be instantly pushed to a remote endpoint while pulling down remote changes to ensure consistency.
  • -
  • Conflict Resolution: In multi-user scenarios, conflicts may arise if two clients update the same document simultaneously. RxDB provides hooks to handle and resolve these gracefully.
  • -
  • Scalable Architecture: By reducing reliance on continuous server requests, you can lighten server load and deliver a more responsive user experience.
  • -
-

Advanced RxDB Features and Techniques

-

Offline-First Approach

-

Vue applications can seamlessly function offline by leveraging RxDB's local database storage. The moment the network is restored, all unsynced data is pushed to the server. This capability is particularly beneficial for Progressive Web Apps (PWAs) and scenarios with spotty connectivity.

-

Observable Queries and Change Streams

-

Beyond simply returning data, RxDB queries emit observables that respond to any change in the underlying documents. This real-time approach can drastically simplify state management, since updates flow directly into your Vue components without additional manual wiring.

-

Encryption of Local Data

-

For applications handling sensitive information, RxDB supports encryption of local data. Your data is stored securely in the browser, protecting it from unauthorized access.

-

Indexing and Performance Optimization

-

By defining indexes on frequently searched fields, you can speed up queries and reduce overall resource usage. This is crucial for larger datasets where performance might otherwise degrade.

-

JSON Key Compression

-

This optimization shortens field names in stored JSON documents, thereby reducing storage space and potentially improving performance for read/write operations.

-

Multi-Tab Support

-

If your users open multiple tabs of your Vue application, RxDB ensures data is synchronized across all instances in real time. Changes made in one tab are immediately reflected in others, creating a unified user experience.

-

multi tab support

-

Best Practices for Using RxDB in Vue

-

Here are some recommendations to get the most out of RxDB in your Vue projects:

-
    -
  • Centralize Database Creation: Initialize and configure RxDB in a dedicated file or plugin, ensuring only one database instance is created.
  • -
  • Leverage Vue's Composition API or a Global Store: Use watchers, refs, or a store like Pinia to neatly manage data subscriptions and updates, preventing scattered subscription logic.
  • -
  • Async Subscriptions: Prefer using Vue's lifecycle hooks and the Composition API to manage subscriptions. Clean up subscriptions when components unmount or no longer need the data.
  • -
  • Optimize Queries and Indexes: Only query the data you need, and define indexes to speed up lookups.
  • -
  • Test Offline Scenarios: Make sure your offline logic works as expected by simulating network disconnections and reconnections.
  • -
  • Plan Conflict Resolution: For multi-user apps, decide how to merge concurrent changes to prevent data inconsistencies.
  • -
-

Follow Up

-

To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources:

-
    -
  • RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.
  • -
  • RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects.
  • -
  • RxDB Reactivity for Vue: Discover how RxDB observables can directly produce Vue refs, simplifying integration with your Vue components.
  • -
  • RxDB Vue Example at GitHub: Explore an official Vue example to see RxDB in action within a Vue application.
  • -
  • RxDB Examples: Browse even more official examples to learn best practices you can apply to your own projects.
  • -
- - \ No newline at end of file diff --git a/docs/articles/vue-database.md b/docs/articles/vue-database.md deleted file mode 100644 index 9616fedefd6..00000000000 --- a/docs/articles/vue-database.md +++ /dev/null @@ -1,192 +0,0 @@ -# RxDB as a Database in a Vue.js Application - -> Level up your Vue projects with RxDB. Build real-time, resilient, and responsive apps powered by a reactive NoSQL database right in the browser. - -# RxDB as a Database in a Vue Application - -In the modern web ecosystem, [Vue](https://vuejs.org/) has become a leading choice for building highly performant, reactive single-page applications (SPAs). However, while Vue excels at managing and updating the user interface, robust and efficient data handling also plays a pivotal role in delivering a great user experience. Enter [RxDB](https://rxdb.info/), a reactive JavaScript database that runs in the browser (and beyond), offering significant capabilities such as offline-first data handling, real-time synchronization, and straightforward integration with Vue's reactivity system. - -This article explores how RxDB works, why it's a perfect match for Vue, and how you can leverage it to build more engaging, performant, and data-resilient Vue applications. - -
- - - -
- -## Why Vue Applications Need a Database -Vue is renowned for its lightweight core and flexible architecture centered around reactive state management and reusable components. However, modern Vue applications often require: - -- **Offline Capabilities:** Allowing users to continue working even without internet access. -- **Real-Time Updates:** Keeping UI data in sync with changes as they occur, whether locally or from other connected clients. -- **Improved Performance:** Reducing server round trips and leveraging local storage for faster data operations. -- **Scalable Data Handling:** Managing increasingly large datasets or complex queries right in the browser. - -While you can store data in Vuex/Pinia stores or via direct AJAX calls, these solutions may not suffice when your application demands a full-featured offline-first database or complex synchronization with a server. RxDB addresses these needs with a dedicated, reactive, browser-based database that pairs seamlessly with Vue's reactivity system. - -## Introducing RxDB as a Database Solution -RxDB - short for Reactive Database - is built on the principle of combining [NoSQL database](./in-memory-nosql-database.md) capabilities with reactive programming. It runs inside your client-side environment (browser, [Node.js](../nodejs-database.md), or [mobile devices](./mobile-database.md)) and provides: - -1. **Real-Time Reactivity**: Automatically updates subscribed components whenever data changes. -2. **Offline-First Approach**: Stores data locally and syncs with the server when online connectivity is restored. -3. **Data Replication**: Effortlessly keeps data synchronized across multiple tabs, devices, or server instances. -4. **Multi-Tab Support**: Seamlessly propagates changes to all open tabs in the user's [browser](./browser-database.md). -5. **Observable Queries**: Automatically refresh the result set when documents in your queried collection change. - -### RxDB vs. Other Vue Database Options -Compared to traditional approaches - like raw IndexedDB or local storage - RxDB adds a powerful, reactive layer that simplifies your data flow. While tools like Vuex or Pinia are great for state management, they are not fully fledged databases with features like replication, conflict resolution, and offline persistence. RxDB bridges the gap by providing an integrated data handling solution tailor-made for modern, data-intensive Vue applications. - -## Getting Started with RxDB -Let's break down the essentials for using RxDB within a Vue application. - -### Installation -You can install RxDB (and RxJS, which it depends on) via npm or yarn: - -```bash -npm install rxdb rxjs -``` - -## Creating and Configuring Your Database - -Within your Vue project, you can set up an RxDB instance in a dedicated file or a Vue plugin. Below is an example using [Localstorage](./localstorage.md) as the storage engine: - -```ts -// db.js -import { createRxDatabase } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -export async function initDatabase() { - const db = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage(), - password: 'myPassword', // optional encryption password - multiInstance: true, // multi-tab support - eventReduce: true // optimize event handling - }); - - await db.addCollections({ - hero: { - schema: { - title: 'hero schema', - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { type: 'string' }, - name: { type: 'string' }, - healthpoints: { type: 'number' } - } - } - } - }); - - return db; -} -``` - -After creating the RxDB instance, you can share it across your application (for example, by providing it in a plugin or a global property in Vue). - -## Vue Reactivity and RxDB Observables - -RxDB queries return RxJS observables (`.$`). Vue can automatically update components when data changes if you manually subscribe and store results in Vue refs/reactive objects, or if you use RxDB's [custom reactivity for Vue](../reactivity.md). - -**Example with Vue 3 Composition API:** - -```js -// HeroList.vue - - - -``` - -## Different RxStorage Layers for RxDB - -RxDB supports multiple storage backends - called "RxStorage layers" - giving you flexibility in how data is persisted: - -- [LocalStorage RxStorage](../rx-storage-localstorage.md): Uses the browsers localstorage API. -- [IndexedDB RxStorage](../rx-storage-indexeddb.md): Direct usage of native IndexedDB. -- [OPFS RxStorage](../rx-storage-opfs.md): Uses the File System Access API for even faster storage in modern browsers. -- [Memory RxStorage](../rx-storage-memory.md): Stores data in memory, ideal for tests or ephemeral data. -- [SQLite RxStorage](../rx-storage-sqlite.md): Runs SQLite, which can be compiled to WebAssembly for the browser. While possible, it typically carries a larger bundle size compared to native browser APIs like [IndexedDB or OPFS](./localstorage-indexeddb-cookies-opfs-sqlite-wasm.md). - -Choose the storage option that best aligns with your Vue application's requirements for performance, persistence, and platform compatibility. - -## Synchronizing Data with RxDB between Clients and Servers - -RxDB champions an offline-first approach: data is kept locally so that your Vue app remains usable, even without internet. When connectivity is restored, RxDB ensures your local changes synchronize to the server, resolving conflicts as necessary. - -- [Real-Time Synchronization](./realtime-database.md): With RxDB's replication plugins, any local change can be instantly pushed to a remote endpoint while pulling down remote changes to ensure consistency. -- **Conflict Resolution**: In multi-user scenarios, conflicts may arise if two clients update the same document simultaneously. RxDB provides hooks to handle and resolve these gracefully. -- **Scalable Architecture**: By reducing reliance on continuous server requests, you can lighten server load and deliver a more responsive user experience. - -## Advanced RxDB Features and Techniques - -### Offline-First Approach -Vue applications can seamlessly function offline by leveraging RxDB's local database storage. The moment the network is restored, all unsynced data is pushed to the server. This capability is particularly beneficial for Progressive Web Apps (PWAs) and scenarios with spotty connectivity. - -### Observable Queries and Change Streams -Beyond simply returning data, RxDB queries emit observables that respond to any change in the underlying documents. This real-time approach can drastically simplify state management, since updates flow directly into your Vue components without additional manual wiring. - -### Encryption of Local Data -For applications handling sensitive information, RxDB supports [encryption](../encryption.md) of local data. Your data is stored securely in the browser, protecting it from unauthorized access. - -### Indexing and Performance Optimization -By [defining indexes](../rx-schema.md) on frequently searched fields, you can speed up queries and reduce overall resource usage. This is crucial for larger datasets where performance might otherwise degrade. - -### JSON Key Compression -This [optimization](../key-compression.md) shortens field names in stored JSON documents, thereby reducing storage space and potentially improving performance for read/write operations. - -### Multi-Tab Support -If your users open multiple tabs of your Vue application, RxDB ensures data is synchronized across all instances in real time. Changes made in one tab are immediately reflected in others, creating a unified user experience. - - - -## Best Practices for Using RxDB in Vue - -Here are some recommendations to get the most out of RxDB in your Vue projects: - -- Centralize Database Creation: Initialize and configure RxDB in a dedicated file or plugin, ensuring only one database instance is created. -- Leverage Vue's Composition API or a Global Store: Use watchers, refs, or a store like Pinia to neatly manage data subscriptions and updates, preventing scattered subscription logic. -- Async Subscriptions: Prefer using Vue's lifecycle hooks and the Composition API to manage subscriptions. Clean up subscriptions when components unmount or no longer need the data. -- Optimize Queries and Indexes: Only query the data you need, and define indexes to speed up lookups. -- Test [Offline Scenarios](../offline-first.md): Make sure your offline logic works as expected by simulating network disconnections and reconnections. -- [Plan Conflict Resolution](../transactions-conflicts-revisions.md): For multi-user apps, decide how to merge concurrent changes to prevent data inconsistencies. - -## Follow Up - -To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: - -- [RxDB GitHub Repository](/code/): Visit the official GitHub repository of RxDB to access the source code, documentation, and community support. -- [RxDB Quickstart](../quickstart.md): Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects. -- [RxDB Reactivity for Vue](../reactivity.md): Discover how RxDB observables can directly produce Vue refs, simplifying integration with your Vue components. -- [RxDB Vue Example at GitHub](https://github.com/pubkey/rxdb/tree/master/examples/vue): Explore an official Vue example to see RxDB in action within a Vue application. -- [RxDB Examples](https://github.com/pubkey/rxdb/tree/master/examples): Browse even more official examples to learn best practices you can apply to your own projects. diff --git a/docs/articles/vue-indexeddb.html b/docs/articles/vue-indexeddb.html deleted file mode 100644 index 496f0791234..00000000000 --- a/docs/articles/vue-indexeddb.html +++ /dev/null @@ -1,228 +0,0 @@ - - - - - -IndexedDB Database in Vue Apps - The Power of RxDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IndexedDB Database in Vue Apps - The Power of RxDB

-

Building robust, offline-capable Vue applications often involves leveraging browser storage solutions to manage data. IndexedDB is one such powerful tool, but its raw API can be challenging to work with directly. RxDB abstracts away much of IndexedDB's complexity, providing a more developer-friendly experience. In this article, we'll explore what IndexedDB is, why it's beneficial in Vue applications, the challenges of using plain IndexedDB, and how RxDB can simplify your development process while adding advanced features.

-

What is IndexedDB?

-

IndexedDB is a low-level API for storing significant amounts of structured data in the browser. It provides a transactional database system that can store key-value pairs, complex objects, and more. This storage engine is asynchronous and supports advanced data types, making it suitable for offline storage and complex web applications.

-
Vue IndexedDB
-

Why Use IndexedDB in Vue

-

When building Vue applications, IndexedDB can play a crucial role in enhancing both performance and user experience. Here are some reasons to consider using IndexedDB:

-
    -
  • Offline-First / Local-First: By storing data locally, your application remains functional even without an internet connection.
  • -
  • Performance: Using local data means zero latency and no loading spinners, as data doesn't need to be fetched over a network.
  • -
  • Easier Implementation: Replicating all data to the client once is often simpler than implementing multiple endpoints for each user interaction.
  • -
  • Scalability: Local data reduces server load because queries run on the client side, decreasing server bandwidth and processing requirements.
  • -
-

Why To Not Use Plain IndexedDB

-

While IndexedDB itself is powerful, its native API comes with several drawbacks for everyday application developers:

-
    -
  • Callback-Based API: IndexedDB was originally designed around callbacks rather than modern Promises, making asynchronous code more cumbersome.
  • -
  • Complexity: IndexedDB is low-level, intended for library developers rather than for app developers who just want to store and query data easily.
  • -
  • Basic Query API: Its rudimentary query capabilities limit how you can efficiently perform complex queries. Libraries like RxDB offer more advanced querying and indexing.
  • -
  • TypeScript Support: Ensuring good TypeScript support with IndexedDB is challenging, especially when trying to maintain schema consistency.
  • -
  • Lack of Observable API: IndexedDB doesn't provide an observable API out of the box, making it hard to automatically update your Vue app in real time. RxDB solves this by enabling you to observe queries or specific documents.
  • -
  • Cross-Tab Communication: Managing cross-tab updates in plain IndexedDB is difficult. RxDB handles this seamlessly - changes in one tab automatically affect observed data in others.
  • -
  • Missing Advanced Features: Features like encryption or compression aren't built into IndexedDB, but they are available via RxDB.
  • -
  • Limited Platform Support: IndexedDB is browser-only. RxDB offers swappable storages so you can reuse the same data layer code in mobile or desktop environments.
  • -
-
JavaScript Database
-

Set up RxDB in Vue

-

Setting up RxDB with Vue is straightforward. It abstracts IndexedDB complexities and adds a layer of powerful features over it.

-

Installing RxDB

-

First, install RxDB (and RxJS) from npm:

-
npm install rxdb rxjs --save
-

Create a Database and Collections

-

RxDB provides two main storage options:

- -

Below is an example of setting up a simple RxDB database using the localstorage-based storage in a Vue app:

-
// db.ts
-import { createRxDatabase } from 'rxdb';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
- 
-export async function initDB() {
-  const db = await createRxDatabase({
-    name: 'heroesdb',         // the name of the database
-    storage: getRxStorageLocalstorage()
-  });
- 
-  // Define your schema
-  const heroSchema = {
-    title: 'hero schema',
-    version: 0,
-    description: 'Describes a hero in your app',
-    primaryKey: 'id',
-    type: 'object',
-    properties: {
-      id: {
-        type: 'string',
-        maxLength: 100
-      },
-      name: {
-        type: 'string'
-      },
-      power: {
-        type: 'string'
-      }
-    },
-    required: ['id', 'name']
-  };
- 
-  // add collections
-  await db.addCollections({
-    heroes: {
-      schema: heroSchema
-    }
-  });
- 
-  return db;
-}
-

CRUD Operations

-

Once your database is initialized, you can perform all CRUD operations:

-
// insert
-await db.heroes.insert({ id: '1', name: 'Iron Man', power: 'Genius-level intellect' });
- 
-// bulk insert
-await db.heroes.bulkInsert([
-  { id: '2', name: 'Thor', power: 'God of Thunder' },
-  { id: '3', name: 'Hulk', power: 'Superhuman Strength' }
-]);
- 
-// find and findOne
-const heroes = await db.heroes.find().exec();
-const ironMan = await db.heroes.findOne({ selector: { name: 'Iron Man' } }).exec();
- 
-// update
-const doc = await db.heroes.findOne({ selector: { name: 'Hulk' } }).exec();
-await doc.update({ $set: { power: 'Unlimited Strength' } });
- 
-// delete
-const thorDoc = await db.heroes.findOne({ selector: { name: 'Thor' } }).exec();
-await thorDoc.remove();
-

Reactive Queries and Live Updates

-

RxDB excels in providing reactive data capabilities, ideal for real-time applications. Subscribing to queries automatically updates your Vue components when underlying data changes - even across browser tabs.

-

realtime ui updates

-

Using RxJS Observables with Vue 3 Composition API

-

Here's an example of a Vue component that subscribes to live data updates:

-
<template>
-  <div>
-    <h2>Hero List</h2>
-    <ul>
-      <li v-for="hero in heroes" :key="hero.id">
-        <strong>{{ hero.name }}</strong> - {{ hero.power }}
-      </li>
-    </ul>
-  </div>
-</template>
- 
-<script setup lang="ts">
-import { ref, onMounted } from 'vue';
-import { initDB } from '@/db';
- 
-const heroes = ref<any[]>([]);
- 
-onMounted(async () => {
-  const db = await initDB();
-  // create an observable query
-  const query = db.heroes.find();
- 
-  // subscribe to the query
-  query.$.subscribe((newHeroes: any[]) => {
-    heroes.value = newHeroes;
-  });
-});
-</script>
-

This component subscribes to the collection's changes, updating the UI automatically whenever the underlying data changes in any browser tab.

-

Using Vue Signals

-

If you're exploring Vue's reactivity transforms or signals, RxDB also offers custom reactivity factories (premium plugins are required). This allows queries to emit data as signals instead of traditional Observables.

-
const heroesSignal = db.heroes.find().$$; // $$ indicates a reactive result
- 
-

With this, in your Vue template or script, you can directly read from heroesSignal()

-
<template>
-  <div>
-    <h2>Hero List</h2>
-    <ul>
-      <!-- we read heroesSignal.value which is always up to date -->
-      <li v-for="hero in heroesSignal.value" :key="hero.id">
-        <strong>{{ hero.name }}</strong> - {{ hero.power }}
-      </li>
-    </ul>
-  </div>
-</template>
-

Vue IndexedDB Example with RxDB

-

A comprehensive example of using RxDB within a Vue application can be found in the RxDB GitHub repository. This repository contains sample applications, showcasing best practices and demonstrating how to integrate RxDB for various use cases.

-

Advanced RxDB Features

-

RxDB offers many advanced features that extend beyond basic data storage:

-
    -
  • -

    RxDB Replication: Synchronize local data with remote databases seamlessly.

    -
  • -
  • -

    Data Migration: Handle schema changes gracefully with automatic data migrations.

    -
  • -
  • -

    Encryption: Secure your data with built-in encryption capabilities.

    -
  • -
  • -

    Compression: Optimize storage using key compression.

    -
  • -
-

Limitations of IndexedDB

-

While IndexedDB is powerful, it has some inherent limitations:

- -

Alternatives to IndexedDB

-

Depending on your application's requirements, there are alternative storage solutions to consider:

-
    -
  • Origin Private File System (OPFS): A newer API that can offer better performance. RxDB supports OPFS as well. More info: RxDB OPFS Storage
  • -
  • SQLite: Ideal for hybrid frameworks or Capacitor, offering native performance. Explore: RxDB SQLite Storage
  • -
-

Performance Comparison with Other Browser Storages

-

Here is a performance overview of the various browser-based storage implementations of RxDB:

-

RxStorage performance - browser

-

Follow Up

- -

By leveraging RxDB on top of IndexedDB, you can create highly responsive, offline-capable Vue applications without dealing with the low-level complexities of IndexedDB directly. With reactive queries, seamless cross-tab communication, and powerful advanced features, RxDB becomes an invaluable tool in modern web development.

- - \ No newline at end of file diff --git a/docs/articles/vue-indexeddb.md b/docs/articles/vue-indexeddb.md deleted file mode 100644 index 7f869a47362..00000000000 --- a/docs/articles/vue-indexeddb.md +++ /dev/null @@ -1,242 +0,0 @@ -# IndexedDB Database in Vue Apps - The Power of RxDB - -> Learn how RxDB simplifies IndexedDB in Vue, offering reactive queries, offline-first capabilities, encryption, compression, and effortless integration. - -# IndexedDB Database in Vue Apps - The Power of RxDB - -Building robust, [offline-capable](../offline-first.md) Vue applications often involves leveraging browser storage solutions to manage data. IndexedDB is one such powerful tool, but its raw API can be challenging to work with directly. RxDB abstracts away much of IndexedDB's complexity, providing a more developer-friendly experience. In this article, we'll explore what IndexedDB is, why it's beneficial in Vue applications, the challenges of using plain IndexedDB, and how [RxDB](https://rxdb.info/) can simplify your development process while adding advanced features. - -## What is IndexedDB? - -[IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) is a low-level API for storing significant amounts of structured data in the browser. It provides a transactional database system that can store key-value pairs, complex objects, and more. This storage engine is asynchronous and supports advanced data types, making it suitable for offline storage and complex web applications. - -
- -
- -## Why Use IndexedDB in Vue - -When building Vue applications, IndexedDB can play a crucial role in enhancing both performance and user experience. Here are some reasons to consider using IndexedDB: - -- **Offline-First / Local-First**: By storing data locally, your application remains functional even without an internet connection. -- **Performance**: Using local data means [zero latency](./zero-latency-local-first.md) and no loading spinners, as data doesn't need to be fetched over a network. -- **Easier Implementation**: Replicating all data to the client once is often simpler than implementing multiple endpoints for each user interaction. -- **Scalability**: Local data reduces server load because queries run on the client side, decreasing server bandwidth and processing requirements. - -## Why To Not Use Plain IndexedDB - -While IndexedDB itself is powerful, its native API comes with several drawbacks for everyday application developers: - -- **Callback-Based API**: IndexedDB was originally designed around callbacks rather than modern Promises, making asynchronous code more cumbersome. -- **Complexity**: IndexedDB is low-level, intended for library developers rather than for app developers who just want to store and query data easily. -- **Basic Query API**: Its rudimentary query capabilities limit how you can efficiently perform complex queries. Libraries like RxDB offer more advanced querying and indexing. -- **TypeScript Support**: Ensuring good [TypeScript support](../tutorials/typescript.md) with IndexedDB is challenging, especially when trying to maintain schema consistency. -- **Lack of Observable API**: IndexedDB doesn't provide an observable API out of the box, making it hard to automatically update your Vue app in real time. RxDB solves this by enabling you to [observe queries](../rx-query.md#observe) or specific documents. -- **Cross-Tab Communication**: Managing cross-tab updates in plain IndexedDB is difficult. RxDB handles this seamlessly - changes in one tab automatically affect observed data in others. -- **Missing Advanced Features**: Features like [encryption](../encryption.md) or [compression](../key-compression.md) aren't built into IndexedDB, but they are available via RxDB. -- **Limited Platform Support**: IndexedDB is browser-only. RxDB offers [swappable storages](../rx-storage.md) so you can reuse the same data layer code in mobile or desktop environments. - -
- - - -
- -## Set up RxDB in Vue - -Setting up RxDB with Vue is straightforward. It abstracts IndexedDB complexities and adds a layer of powerful features over it. - -### Installing RxDB - -First, install RxDB (and RxJS) from npm: - -```bash -npm install rxdb rxjs --save -``` - -### Create a Database and Collections - -RxDB provides two main storage options: - -- The free [LocalStorage-based storage](../rx-storage-localstorage.md) -- The premium plain [IndexedDB-based storage](../rx-storage-indexeddb.md), offering faster [performance](../rx-storage-performance.md) - -Below is an example of setting up a simple RxDB database using the localstorage-based storage in a Vue app: - -```ts -// db.ts -import { createRxDatabase } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -export async function initDB() { - const db = await createRxDatabase({ - name: 'heroesdb', // the name of the database - storage: getRxStorageLocalstorage() - }); - - // Define your schema - const heroSchema = { - title: 'hero schema', - version: 0, - description: 'Describes a hero in your app', - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 - }, - name: { - type: 'string' - }, - power: { - type: 'string' - } - }, - required: ['id', 'name'] - }; - - // add collections - await db.addCollections({ - heroes: { - schema: heroSchema - } - }); - - return db; -} -``` - -### CRUD Operations - -Once your database is initialized, you can perform all CRUD operations: - -```ts -// insert -await db.heroes.insert({ id: '1', name: 'Iron Man', power: 'Genius-level intellect' }); - -// bulk insert -await db.heroes.bulkInsert([ - { id: '2', name: 'Thor', power: 'God of Thunder' }, - { id: '3', name: 'Hulk', power: 'Superhuman Strength' } -]); - -// find and findOne -const heroes = await db.heroes.find().exec(); -const ironMan = await db.heroes.findOne({ selector: { name: 'Iron Man' } }).exec(); - -// update -const doc = await db.heroes.findOne({ selector: { name: 'Hulk' } }).exec(); -await doc.update({ $set: { power: 'Unlimited Strength' } }); - -// delete -const thorDoc = await db.heroes.findOne({ selector: { name: 'Thor' } }).exec(); -await thorDoc.remove(); -``` - -## Reactive Queries and Live Updates - -RxDB excels in providing reactive data capabilities, ideal for [real-time applications](./realtime-database.md). Subscribing to queries automatically updates your Vue components when underlying data changes - even across [browser](./browser-database.md) tabs. - - - -### Using RxJS Observables with Vue 3 Composition API - -Here's an example of a Vue component that subscribes to live data updates: - -```html - - - -``` - -This component subscribes to the collection's changes, [updating the UI](./optimistic-ui.md) automatically whenever the underlying data changes in any browser tab. - -### Using Vue Signals - -If you're exploring Vue's reactivity transforms or signals, RxDB also offers [custom reactivity factories](../reactivity.md) ([premium plugins](/premium/) are required). This allows queries to emit data as signals instead of traditional Observables. - -```ts -const heroesSignal = db.heroes.find().$$; // $$ indicates a reactive result - -``` -With this, in your Vue template or script, you can directly read from heroesSignal() - -```html - -``` - -## Vue IndexedDB Example with RxDB - -A comprehensive example of using RxDB within a Vue application can be found in the [RxDB GitHub repository](https://github.com/pubkey/rxdb/tree/master/examples/vue). This repository contains sample applications, showcasing best practices and demonstrating how to integrate RxDB for various use cases. - -## Advanced RxDB Features -RxDB offers many advanced features that extend beyond basic data storage: - -- [RxDB Replication](../replication.md): Synchronize local data with remote databases seamlessly. - -- [Data Migration](../migration-schema.md): Handle schema changes gracefully with automatic data migrations. - -- [Encryption](../encryption.md): Secure your data with built-in encryption capabilities. - -- [Compression](../key-compression.md): Optimize storage using key compression. - -## Limitations of IndexedDB - -While IndexedDB is powerful, it has some inherent limitations: - -- Performance: IndexedDB can be slow under certain conditions. Read more: [Slow IndexedDB](../slow-indexeddb.md) -- [Storage Limits](./indexeddb-max-storage-limit.md): Browsers impose limits on how much data can be stored. See: [Browser storage limits](./localstorage-indexeddb-cookies-opfs-sqlite-wasm.md#storage-size-limits). - -## Alternatives to IndexedDB - -Depending on your application's requirements, there are [alternative storage solutions](../rx-storage.md) to consider: - -- **Origin Private File System (OPFS)**: A newer API that can offer better performance. RxDB supports OPFS as well. More info: [RxDB OPFS Storage](../rx-storage-opfs.md) -- **SQLite**: Ideal for hybrid frameworks or Capacitor, offering native performance. Explore: [RxDB SQLite Storage](../rx-storage-sqlite.md) - -## Performance Comparison with Other Browser Storages -Here is a performance overview of the various browser-based storage implementations of RxDB: - - - -## Follow Up -- Learn how to use RxDB with the [RxDB Quickstart](../quickstart.md) for a guided introduction. -- Check out the [RxDB GitHub repository](/code/) and leave a star ⭐ if you find it useful. - -By leveraging RxDB on top of IndexedDB, you can create highly responsive, offline-capable Vue applications without dealing with the low-level complexities of IndexedDB directly. With [reactive queries](../rx-query.md), seamless cross-tab communication, and powerful advanced features, RxDB becomes an invaluable tool in modern web development. diff --git a/docs/articles/websockets-sse-polling-webrtc-webtransport.html b/docs/articles/websockets-sse-polling-webrtc-webtransport.html deleted file mode 100644 index 7c3d25629c6..00000000000 --- a/docs/articles/websockets-sse-polling-webrtc-webtransport.html +++ /dev/null @@ -1,205 +0,0 @@ - - - - - -WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport

-

For modern real-time web applications, the ability to send events from the server to the client is indispensable. This necessity has led to the development of several methods over the years, each with its own set of advantages and drawbacks. Initially, long-polling was the only option available. It was then succeeded by WebSockets, which offered a more robust solution for bidirectional communication. Following WebSockets, Server-Sent Events (SSE) provided a simpler method for one-way communication from server to client. Looking ahead, the WebTransport protocol promises to revolutionize this landscape even further by providing a more efficient, flexible, and scalable approach. For niche use cases, WebRTC might also be considered for server-client events.

-

This article aims to delve into these technologies, comparing their performance, highlighting their benefits and limitations, and offering recommendations for various use cases to help developers make informed decisions when building real-time web applications. It is a condensed summary of my gathered experience when I implemented the RxDB Sync Engine to be compatible with various backend technologies.

-
JavaScript Database
-

What is Long Polling?

-

Long polling was the first "hack" to enable a server-client messaging method that can be used in browsers over HTTP. The technique emulates server push communications with normal XHR requests. Unlike traditional polling, where the client repeatedly requests data from the server at regular intervals, long polling establishes a connection to the server that remains open until new data is available. Once the server has new information, it sends the response to the client, and the connection is closed. Immediately after receiving the server's response, the client initiates a new request, and the process repeats. This method allows for more immediate data updates and reduces unnecessary network traffic and server load. However, it can still introduce delays in communication and is less efficient than other real-time technologies like WebSockets.

-
// long-polling in a JavaScript client
-function longPoll() {
-    fetch('http://example.com/poll')
-        .then(response => response.json())
-        .then(data => {
-            console.log("Received data:", data);
-            longPoll(); // Immediately establish a new long polling request
-        })
-        .catch(error => {
-            /**
-             * Errors can appear in normal conditions when a 
-             * connection timeout is reached or when the client goes offline.
-             * On errors we just restart the polling after some delay.
-             */
-            setTimeout(longPoll, 10000);
-        });
-}
-longPoll(); // Initiate the long polling
-

Implementing long-polling on the client side is pretty simple, as shown in the code above. However on the backend there can be multiple difficulties to ensure the client receives all events and does not miss out updates when the client is currently reconnecting.

-

What are WebSockets?

-

WebSockets provide a full-duplex communication channel over a single, long-lived connection between the client and server. This technology enables browsers and servers to exchange data without the overhead of HTTP request-response cycles, facilitating real-time data transfer for applications like live chat, gaming, or financial trading platforms. WebSockets represent a significant advancement over traditional HTTP by allowing both parties to send data independently once the connection is established, making it ideal for scenarios that require low latency and high-frequency updates.

-
// WebSocket in a JavaScript client
-const socket = new WebSocket('ws://example.com');
- 
-socket.onopen = function(event) {
-  console.log('Connection established');
-  // Sending a message to the server
-  socket.send('Hello Server!');
-};
- 
-socket.onmessage = function(event) {
-  console.log('Message from server:', event.data);
-};
-

While the basics of the WebSocket API are easy to use it has shown to be rather complex in production. A socket can loose connection and must be re-created accordingly. Especially detecting if a connection is still usable or not, can be very tricky. Mostly you would add a ping-and-pong heartbeat to ensure that the open connection is not closed. -This complexity is why most people use a library on top of WebSockets like Socket.IO which handles all these cases and even provides fallbacks to long-polling if required.

-

What are Server-Sent-Events?

-

Server-Sent Events (SSE) provide a standard way to push server updates to the client over HTTP. Unlike WebSockets, SSEs are designed exclusively for one-way communication from server to client, making them ideal for scenarios like live news feeds, sports scores, or any situation where the client needs to be updated in real time without sending data to the server.

-

You can think of Server-Sent-Events as a single HTTP request where the backend does not send the whole body at once, but instead keeps the connection open and trickles the answer by sending a single line each time an event has to be send to the client.

-

Creating a connection for receiving events with SSE is straightforward. On the client side in a browser, you initialize an EventSource instance with the URL of the server-side script that generates the events.

-

Listening for messages involves attaching event handlers directly to the EventSource instance. The API distinguishes between generic message events and named events, allowing for more structured communication. Here's how you can set it up in JavaScript:

-
// Connecting to the server-side event stream
-const evtSource = new EventSource("https://example.com/events");
- 
-// Handling generic message events
-evtSource.onmessage = event => {
-    console.log('got message: ' + event.data);
-};
-

In difference to WebSockets, an EventSource will automatically reconnect on connection loss.

-

On the server side, your script must set the Content-Type header to text/event-stream and format each message according to the SSE specification. This includes specifying event types, data payloads, and optional fields like event ID and retry timing.

-

Here's how you can set up a simple SSE endpoint in a Node.js Express app:

-
import express from 'express';
-const app = express();
-const PORT = process.env.PORT || 3000;
- 
-app.get('/events', (req, res) => {
-    res.writeHead(200, {
-        'Content-Type': 'text/event-stream',
-        'Cache-Control': 'no-cache',
-        'Connection': 'keep-alive',
-    });
- 
-    const sendEvent = (data) => {
-        // all message lines must be prefixed with 'data: '
-        const formattedData = `data: ${JSON.stringify(data)}\n\n`;
-        res.write(formattedData);
-    };
- 
-    // Send an event every 2 seconds
-    const intervalId = setInterval(() => {
-        const message = {
-            time: new Date().toTimeString(),
-            message: 'Hello from the server!',
-        };
-        sendEvent(message);
-    }, 2000);
- 
-    // Clean up when the connection is closed
-    req.on('close', () => {
-        clearInterval(intervalId);
-        res.end();
-    });
-});
-app.listen(PORT, () => console.log(`Server running on http://localhost:${PORT}`));
-

What is the WebTransport API?

-

WebTransport is a cutting-edge API designed for efficient, low-latency communication between web clients and servers. It leverages the HTTP/3 QUIC protocol to enable a variety of data transfer capabilities, such as sending data over multiple streams, in both reliable and unreliable manners, and even allowing data to be sent out of order. This makes WebTransport a powerful tool for applications requiring high-performance networking, such as real-time gaming, live streaming, and collaborative platforms. However, it's important to note that WebTransport is currently a working draft and has not yet achieved widespread adoption. -As of now (March 2024), WebTransport is in a Working Draft and not widely supported. You cannot yet use WebTransport in the Safari browser and there is also no native support in Node.js. This limits its usability across different platforms and environments.

-

Even when WebTransport will become widely supported, its API is very complex to use and likely it would be something where people build libraries on top of WebTransport, not using it directly in an application's sourcecode.

-

What is WebRTC?

-

WebRTC (Web Real-Time Communication) is an open-source project and API standard that enables real-time communication (RTC) capabilities directly within web browsers and mobile applications without the need for complex server infrastructure or the installation of additional plugins. It supports peer-to-peer connections for streaming audio, video, and data exchange between browsers. WebRTC is designed to work through NATs and firewalls, utilizing protocols like ICE, STUN, and TURN to establish a connection between peers.

-

While WebRTC is made to be used for client-client interactions, it could also be leveraged for server-client communication where the server just simulated being also a client. This approach only makes sense for niche use cases which is why in the following WebRTC will be ignored as an option.

-

The problem is that for WebRTC to work, you need a signaling-server anyway which would then again run over websockets, SSE or WebTransport. This defeats the purpose of using WebRTC as a replacement for these technologies.

-

Limitations of the technologies

-

Sending Data in both directions

-

Only WebSockets and WebTransport allow to send data in both directions so that you can receive server-data and send client-data over the same connection.

-

While it would also be possible with Long-Polling in theory, it is not recommended because sending "new" data to an existing long-polling connection would require -to do an additional http-request anyway. So instead of doing that you can send data directly from the client to the server with an additional http-request without interrupting -the long-polling connection.

-

Server-Sent-Events do not support sending any additional data to the server. You can only do the initial request, and even there you cannot send POST-like data in the http-body by default with the native EventSource API. Instead you have to put all data inside of the url parameters which is considered a bad practice for security because credentials might leak into server logs, proxies and caches. To fix this problem, RxDB for example uses the eventsource polyfill instead of the native EventSource API. This library adds additional functionality like sending custom http headers. Also there is this library from microsoft which allows to send body data and use POST requests instead of GET.

-

6-Requests per Domain Limit

-

Most modern browsers allow six connections per domain () which limits the usability of all steady server-to-client messaging methods. The limitation of six connections is even shared across browser tabs so when you open the same page in multiple tabs, they would have to shared the six-connection-pool with each other. This limitation is part of the HTTP/1.1-RFC (which even defines a lower number of only two connections).

-
-

Quote From RFC 2616 - Section 8.1.4: "Clients that use persistent connections SHOULD limit the number of simultaneous connections that they maintain to a given server. A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy. A proxy SHOULD use up to 2*N connections to another server or proxy, where N is the number of simultaneously active users. These guidelines are intended to improve HTTP response times and avoid congestion."

-
-

While that policy makes sense to prevent website owners from using their visitors to D-DOS other websites, it can be a big problem when multiple connections are required to handle server-client communication for legitimate use cases. To workaround the limitation you have to use HTTP/2 or HTTP/3 with which the browser will only open a single connection per domain and then use multiplexing to run all data through a single connection. While this gives you a virtually infinity amount of parallel connections, there is a SETTINGS_MAX_CONCURRENT_STREAMS setting which limits the actually connections amount. The default is 100 concurrent streams for most configurations.

-

In theory the connection limit could also be increased by the browser, at least for specific APIs like EventSource, but the issues have been marked as "won't fix" by chromium and firefox.

-
Lower the amount of connections in Browser Apps

When you build a browser application, you have to assume that your users will use the app not only once, but in multiple browser tabs in parallel. -By default you likely will open one server-stream-connection per tab which is often not necessary at all. Instead you open only a single connection and shared it between tabs, no matter how many tabs are open. RxDB does that with the LeaderElection from the broadcast-channel npm package to only have one stream of replication between server and clients. You can use that package standalone (without RxDB) for any type of application.

-

Connections are not kept open on mobile apps

-

In the context of mobile applications running on operating systems like Android and iOS, maintaining open connections, such as those used for WebSockets and the others, poses a significant challenge. Mobile operating systems are designed to automatically move applications into the background after a certain period of inactivity, effectively closing any open connections. This behavior is a part of the operating system's resource management strategy to conserve battery and optimize performance. As a result, developers often rely on mobile push notifications as an efficient and reliable method to send data from servers to clients. Push notifications allow servers to alert the application of new data, prompting an action or update, without the need for a persistent open connection.

-

Proxies and Firewalls

-

From consulting many RxDB users, it was shown that in enterprise environments (aka "at work") it is often hard to implement a WebSocket server into the infrastructure because many proxies and firewalls block non-HTTP connections. Therefore using the Server-Sent-Events provides and easier way of enterprise integration. Also long-polling uses only plain HTTP-requests and might be an option.

-
JavaScript Database
-

Performance Comparison

-

Comparing the performance of WebSockets, Server-Sent Events (SSE), Long-Polling and WebTransport directly involves evaluating key aspects such as latency, throughput, server load, and scalability under various conditions.

-

First lets look at the raw numbers. A good performance comparison can be found in this repo which tests the messages times in a Go Lang server implementation. Here we can see that the performance of WebSockets, WebRTC and WebTransport are comparable:

-
WebSocket WebRTC WebTransport Performance
-
note

Remember that WebTransport is a pretty new technology based on the also new HTTP/3 protocol. In the future (after March 2024) there might be more performance optimizations. Also WebTransport is optimized to use less power which metric is not tested.

-

Lets also compare the Latency, the throughput and the scalability:

-

Latency

-
    -
  • WebSockets: Offers the lowest latency due to its full-duplex communication over a single, persistent connection. Ideal for real-time applications where immediate data exchange is critical.
  • -
  • Server-Sent Events: Also provides low latency for server-to-client communication but cannot natively send messages back to the server without additional HTTP requests.
  • -
  • Long-Polling: Incurs higher latency as it relies on establishing new HTTP connections for each data transmission, making it less efficient for real-time updates. Also it can occur that the server wants to send an event when the client is still in the process of opening a new connection. In these cases the latency would be significantly larger.
  • -
  • WebTransport: Promises to offer low latency similar to WebSockets, with the added benefits of leveraging the HTTP/3 protocol for more efficient multiplexing and congestion control.
  • -
-

Throughput

-
    -
  • WebSockets: Capable of high throughput due to its persistent connection, but throughput can suffer from backpressure where the client cannot process data as fast as the server is capable of sending it.
  • -
  • Server-Sent Events: Efficient for broadcasting messages to many clients with less overhead than WebSockets, leading to potentially higher throughput for unidirectional server-to-client communication.
  • -
  • Long-Polling: Generally offers lower throughput due to the overhead of frequently opening and closing connections, which consumes more server resources.
  • -
  • WebTransport: Expected to support high throughput for both unidirectional and bidirectional streams within a single connection, outperforming WebSockets in scenarios requiring multiple streams.
  • -
-

Scalability and Server Load

-
    -
  • WebSockets: Maintaining a large number of WebSocket connections can significantly increase server load, potentially affecting scalability for applications with many users.
  • -
  • Server-Sent Events: More scalable for scenarios that primarily require updates from server to client, as it uses less connection overhead than WebSockets because it uses "normal" HTTP request without things like protocol updates that have to be run with WebSockets.
  • -
  • Long-Polling: The least scalable due to the high server load generated by frequent connection establishment, making it suitable only as a fallback mechanism.
  • -
  • WebTransport: Designed to be highly scalable, benefiting from HTTP/3's efficiency in handling connections and streams, potentially reducing server load compared to WebSockets and SSE.
  • -
-

Recommendations and Use-Case Suitability

-

In the landscape of server-client communication technologies, each has its distinct advantages and use case suitability. Server-Sent Events (SSE) emerge as the most straightforward option to implement, leveraging the same HTTP/S protocols as traditional web requests, thereby circumventing corporate firewall restrictions and other technical problems that can appear with other protocols. They are easily integrated into Node.js and other server frameworks, making them an ideal choice for applications requiring frequent server-to-client updates, such as news feeds, stock tickers, and live event streaming.

-

On the other hand, WebSockets excel in scenarios demanding ongoing, two-way communication. Their ability to support continuous interaction makes them the prime choice for browser games, chat applications, and live sports updates.

-

However, WebTransport, despite its potential, faces adoption challenges. It is not widely supported by server frameworks including Node.js and lacks compatibility with safari. Moreover, its reliance on HTTP/3 further limits its immediate applicability because many WebServers like nginx only have experimental HTTP/3 support. While promising for future applications with its support for both reliable and unreliable data transmission, WebTransport is not yet a viable option for most use cases.

-

Long-Polling, once a common technique, is now largely outdated due to its inefficiency and the high overhead of repeatedly establishing new HTTP connections. Although it may serve as a fallback in environments lacking support for WebSockets or SSE, its use is generally discouraged due to significant performance limitations.

-

Known Problems

-

For all of the realtime streaming technologies, there are known problems. When you build anything on top of them, keep these in mind.

-

A client can miss out events when reconnecting

-

When a client is connecting, reconnecting or offline, it can miss out events that happened on the server but could not be streamed to the client. -This missed out events are not relevant when the server is streaming the full content each time anyway, like on a live updating stock ticker. -But when the backend is made to stream partial results, you have to account for missed out events. Fixing that on the backend scales pretty bad because the backend would have to remember for each client which events have been successfully send already. Instead this should be implemented with client side logic.

-

The RxDB Sync Engine for example uses two modes of operation for that. One is the checkpoint iteration mode where normal http requests are used to iterate over backend data, until the client is in sync again. Then it can switch to event observation mode where updates from the realtime-stream are used to keep the client in sync. Whenever a client disconnects or has any error, the replication shortly switches to checkpoint iteration mode until the client is in sync again. This method accounts for missed out events and ensures that clients can always sync to the exact equal state of the server.

-

Company firewalls can cause problems

-

There are many known problems with company infrastructure when using any of the streaming technologies. Proxies and firewall can block traffic or unintentionally break requests and responses. Whenever you implement a realtime app in such an infrastructure, make sure you first test out if the technology itself works for you.

-

Follow Up

-
- - \ No newline at end of file diff --git a/docs/articles/websockets-sse-polling-webrtc-webtransport.md b/docs/articles/websockets-sse-polling-webrtc-webtransport.md deleted file mode 100644 index ab3e79eba45..00000000000 --- a/docs/articles/websockets-sse-polling-webrtc-webtransport.md +++ /dev/null @@ -1,252 +0,0 @@ -# WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport - -> Learn the unique benefits and pitfalls of each real-time tech. Make informed decisions on WebSockets, SSE, Polling, WebRTC, and WebTransport. - -# WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport - -For modern real-time web applications, the ability to send events from the server to the client is indispensable. This necessity has led to the development of several methods over the years, each with its own set of advantages and drawbacks. Initially, [long-polling](#what-is-long-polling) was the only option available. It was then succeeded by [WebSockets](#what-are-websockets), which offered a more robust solution for bidirectional communication. Following WebSockets, [Server-Sent Events (SSE)](#what-are-server-sent-events) provided a simpler method for one-way communication from server to client. Looking ahead, the [WebTransport](#what-is-the-webtransport-api) protocol promises to revolutionize this landscape even further by providing a more efficient, flexible, and scalable approach. For niche use cases, [WebRTC](#what-is-webrtc) might also be considered for server-client events. - -This article aims to delve into these technologies, comparing their performance, highlighting their benefits and limitations, and offering recommendations for various use cases to help developers make informed decisions when building real-time web applications. It is a condensed summary of my gathered experience when I implemented the [RxDB Sync Engine](../replication.md) to be compatible with various backend technologies. - -
- - - -
- -### What is Long Polling? - -Long polling was the first "hack" to enable a server-client messaging method that can be used in browsers over HTTP. The technique emulates server push communications with normal XHR requests. Unlike traditional polling, where the client repeatedly requests data from the server at regular intervals, long polling establishes a connection to the server that remains open until new data is available. Once the server has new information, it sends the response to the client, and the connection is closed. Immediately after receiving the server's response, the client initiates a new request, and the process repeats. This method allows for more immediate data updates and reduces unnecessary network traffic and server load. However, it can still introduce delays in communication and is less efficient than other real-time technologies like WebSockets. - -```js -// long-polling in a JavaScript client -function longPoll() { - fetch('http://example.com/poll') - .then(response => response.json()) - .then(data => { - console.log("Received data:", data); - longPoll(); // Immediately establish a new long polling request - }) - .catch(error => { - /** - * Errors can appear in normal conditions when a - * connection timeout is reached or when the client goes offline. - * On errors we just restart the polling after some delay. - */ - setTimeout(longPoll, 10000); - }); -} -longPoll(); // Initiate the long polling -``` - -Implementing long-polling on the client side is pretty simple, as shown in the code above. However on the backend there can be multiple difficulties to ensure the client receives all events and does not miss out updates when the client is currently reconnecting. - -### What are WebSockets? - -[WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket?retiredLocale=de) provide a full-duplex communication channel over a single, long-lived connection between the client and server. This technology enables browsers and servers to exchange data without the overhead of HTTP request-response cycles, facilitating real-time data transfer for applications like live chat, gaming, or financial trading platforms. WebSockets represent a significant advancement over traditional HTTP by allowing both parties to send data independently once the connection is established, making it ideal for scenarios that require low latency and high-frequency updates. - -```js -// WebSocket in a JavaScript client -const socket = new WebSocket('ws://example.com'); - -socket.onopen = function(event) { - console.log('Connection established'); - // Sending a message to the server - socket.send('Hello Server!'); -}; - -socket.onmessage = function(event) { - console.log('Message from server:', event.data); -}; -``` - -While the basics of the WebSocket API are easy to use it has shown to be rather complex in production. A socket can loose connection and must be re-created accordingly. Especially detecting if a connection is still usable or not, can be very tricky. Mostly you would add a [ping-and-pong](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#pings_and_pongs_the_heartbeat_of_websockets) heartbeat to ensure that the open connection is not closed. -This complexity is why most people use a library on top of WebSockets like [Socket.IO](https://socket.io/) which handles all these cases and even provides fallbacks to long-polling if required. - -### What are Server-Sent-Events? - -Server-Sent Events (SSE) provide a standard way to push server updates to the client over HTTP. Unlike WebSockets, SSEs are designed exclusively for one-way communication from server to client, making them ideal for scenarios like live news feeds, sports scores, or any situation where the client needs to be updated in real time without sending data to the server. - -You can think of Server-Sent-Events as a single HTTP request where the backend does not send the whole body at once, but instead keeps the connection open and trickles the answer by sending a single line each time an event has to be send to the client. - -Creating a connection for receiving events with SSE is straightforward. On the client side in a browser, you initialize an [EventSource](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) instance with the URL of the server-side script that generates the events. - -Listening for messages involves attaching event handlers directly to the EventSource instance. The API distinguishes between generic message events and named events, allowing for more structured communication. Here's how you can set it up in JavaScript: - -```js -// Connecting to the server-side event stream -const evtSource = new EventSource("https://example.com/events"); - -// Handling generic message events -evtSource.onmessage = event => { - console.log('got message: ' + event.data); -}; -``` - -In difference to WebSockets, an EventSource will automatically reconnect on connection loss. - -On the server side, your script must set the `Content-Type` header to `text/event-stream` and format each message according to the [SSE specification](https://www.w3.org/TR/2012/WD-eventsource-20120426/). This includes specifying event types, data payloads, and optional fields like event ID and retry timing. - -Here's how you can set up a simple SSE endpoint in a Node.js Express app: - -```ts -import express from 'express'; -const app = express(); -const PORT = process.env.PORT || 3000; - -app.get('/events', (req, res) => { - res.writeHead(200, { - 'Content-Type': 'text/event-stream', - 'Cache-Control': 'no-cache', - 'Connection': 'keep-alive', - }); - - const sendEvent = (data) => { - // all message lines must be prefixed with 'data: ' - const formattedData = `data: ${JSON.stringify(data)}\n\n`; - res.write(formattedData); - }; - - // Send an event every 2 seconds - const intervalId = setInterval(() => { - const message = { - time: new Date().toTimeString(), - message: 'Hello from the server!', - }; - sendEvent(message); - }, 2000); - - // Clean up when the connection is closed - req.on('close', () => { - clearInterval(intervalId); - res.end(); - }); -}); -app.listen(PORT, () => console.log(`Server running on http://localhost:${PORT}`)); -``` - -### What is the WebTransport API? - -WebTransport is a cutting-edge API designed for efficient, low-latency communication between web clients and servers. It leverages the [HTTP/3 QUIC protocol](https://en.wikipedia.org/wiki/HTTP/3) to enable a variety of data transfer capabilities, such as sending data over multiple streams, in both reliable and unreliable manners, and even allowing data to be sent out of order. This makes WebTransport a powerful tool for applications requiring high-performance networking, such as real-time gaming, live streaming, and collaborative platforms. However, it's important to note that WebTransport is currently a working draft and has not yet achieved widespread adoption. -As of now (March 2024), WebTransport is in a [Working Draft](https://w3c.github.io/webtransport/) and not widely supported. You cannot yet use WebTransport in the [Safari browser](https://caniuse.com/webtransport) and there is also no native support [in Node.js](https://github.com/w3c/webtransport/issues/511). This limits its usability across different platforms and environments. - -Even when WebTransport will become widely supported, its API is very complex to use and likely it would be something where people build libraries on top of WebTransport, not using it directly in an application's sourcecode. - -### What is WebRTC? - -[WebRTC](https://webrtc.org/) (Web Real-Time Communication) is an open-source project and API standard that enables real-time communication (RTC) capabilities directly within web browsers and mobile applications without the need for complex server infrastructure or the installation of additional plugins. It supports peer-to-peer connections for streaming audio, video, and data exchange between browsers. [WebRTC](../replication-webrtc.md) is designed to work through NATs and firewalls, utilizing protocols like ICE, STUN, and TURN to establish a connection between peers. - -While WebRTC is made to be used for client-client interactions, it could also be leveraged for server-client communication where the server just simulated being also a client. This approach only makes sense for niche use cases which is why in the following WebRTC will be ignored as an option. - -The problem is that for WebRTC to work, you need a signaling-server anyway which would then again run over websockets, SSE or WebTransport. This defeats the purpose of using WebRTC as a replacement for these technologies. - -## Limitations of the technologies - -### Sending Data in both directions - -Only WebSockets and WebTransport allow to send data in both directions so that you can receive server-data and send client-data over the same connection. - -While it would also be possible with **Long-Polling** in theory, it is not recommended because sending "new" data to an existing long-polling connection would require -to do an additional http-request anyway. So instead of doing that you can send data directly from the client to the server with an additional http-request without interrupting -the long-polling connection. - -**Server-Sent-Events** do not support sending any additional data to the server. You can only do the initial request, and even there you cannot send POST-like data in the http-body by default with the native [EventSource API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource). Instead you have to put all data inside of the url parameters which is considered a bad practice for security because credentials might leak into server logs, proxies and caches. To fix this problem, [RxDB](https://rxdb.info/) for example uses the [eventsource polyfill](https://github.com/EventSource/eventsource) instead of the native `EventSource API`. This library adds additional functionality like sending **custom http headers**. Also there is [this library](https://github.com/Azure/fetch-event-source) from microsoft which allows to send body data and use `POST` requests instead of `GET`. - -### 6-Requests per Domain Limit - -Most modern browsers allow six connections per domain () which limits the usability of all steady server-to-client messaging methods. The limitation of six connections is even shared across browser tabs so when you open the same page in multiple tabs, they would have to shared the six-connection-pool with each other. This limitation is part of the HTTP/1.1-RFC (which even defines a lower number of only two connections). - -> Quote From [RFC 2616 - Section 8.1.4](https://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1.4): "Clients that use persistent connections SHOULD limit the number of simultaneous connections that they maintain to a given server. A single-user client SHOULD NOT maintain more than **2 connections** with any server or proxy. A proxy SHOULD use up to 2*N connections to another server or proxy, where N is the number of simultaneously active users. These guidelines are intended to improve HTTP response times and avoid congestion." - -While that policy makes sense to prevent website owners from using their visitors to D-DOS other websites, it can be a big problem when multiple connections are required to handle server-client communication for legitimate use cases. To workaround the limitation you have to use HTTP/2 or HTTP/3 with which the browser will only open a single connection per domain and then use multiplexing to run all data through a single connection. While this gives you a virtually infinity amount of parallel connections, there is a [SETTINGS_MAX_CONCURRENT_STREAMS](https://www.rfc-editor.org/rfc/rfc7540#section-6.5.2) setting which limits the actually connections amount. The default is 100 concurrent streams for most configurations. - -In theory the connection limit could also be increased by the browser, at least for specific APIs like EventSource, but the issues have been marked as "won't fix" by [chromium](https://issues.chromium.org/issues/40329530) and [firefox](https://bugzilla.mozilla.org/show_bug.cgi?id=906896). - -:::note Lower the amount of connections in Browser Apps -When you build a browser application, you have to assume that your users will use the app not only once, but in multiple browser tabs in parallel. -By default you likely will open one server-stream-connection per tab which is often not necessary at all. Instead you open only a single connection and shared it between tabs, no matter how many tabs are open. [RxDB](https://rxdb.info/) does that with the [LeaderElection](../leader-election.md) from the [broadcast-channel npm package](https://github.com/pubkey/broadcast-channel) to only have one stream of replication between server and clients. You can use that package standalone (without RxDB) for any type of application. -::: - -### Connections are not kept open on mobile apps - -In the context of mobile applications running on operating systems like Android and iOS, maintaining open connections, such as those used for WebSockets and the others, poses a significant challenge. Mobile operating systems are designed to automatically move applications into the background after a certain period of inactivity, effectively closing any open connections. This behavior is a part of the operating system's resource management strategy to conserve battery and optimize performance. As a result, developers often rely on **mobile push notifications** as an efficient and reliable method to send data from servers to clients. Push notifications allow servers to alert the application of new data, prompting an action or update, without the need for a persistent open connection. - -### Proxies and Firewalls - -From consulting many [RxDB](https://rxdb.info/) users, it was shown that in enterprise environments (aka "at work") it is often hard to implement a WebSocket server into the infrastructure because many proxies and firewalls block non-HTTP connections. Therefore using the Server-Sent-Events provides and easier way of enterprise integration. Also long-polling uses only plain HTTP-requests and might be an option. - -
- - - -
- -## Performance Comparison - -Comparing the performance of WebSockets, Server-Sent Events (SSE), Long-Polling and WebTransport directly involves evaluating key aspects such as latency, throughput, server load, and scalability under various conditions. - -First lets look at the raw numbers. A good performance comparison can be found in [this repo](https://github.com/Sh3b0/realtime-web?tab=readme-ov-file#demos) which tests the messages times in a [Go Lang](https://go.dev/) server implementation. Here we can see that the performance of WebSockets, WebRTC and WebTransport are comparable: - -
- - - -
- -:::note -Remember that WebTransport is a pretty new technology based on the also new HTTP/3 protocol. In the future (after March 2024) there might be more performance optimizations. Also WebTransport is optimized to use less power which metric is not tested. -::: - -Lets also compare the Latency, the throughput and the scalability: - -### Latency -- **WebSockets**: Offers the lowest latency due to its full-duplex communication over a single, persistent connection. Ideal for real-time applications where immediate data exchange is critical. -- **Server-Sent Events**: Also provides low latency for server-to-client communication but cannot natively send messages back to the server without additional HTTP requests. -- **Long-Polling**: Incurs higher latency as it relies on establishing new HTTP connections for each data transmission, making it less efficient for real-time updates. Also it can occur that the server wants to send an event when the client is still in the process of opening a new connection. In these cases the latency would be significantly larger. -- **WebTransport**: Promises to offer low latency similar to WebSockets, with the added benefits of leveraging the HTTP/3 protocol for more efficient multiplexing and congestion control. - -### Throughput -- **WebSockets**: Capable of high throughput due to its persistent connection, but throughput can suffer from [backpressure](https://chromestatus.com/feature/5189728691290112) where the client cannot process data as fast as the server is capable of sending it. -- **Server-Sent Events**: Efficient for broadcasting messages to many clients with less overhead than WebSockets, leading to potentially higher throughput for unidirectional server-to-client communication. -- **Long-Polling**: Generally offers lower throughput due to the overhead of frequently opening and closing connections, which consumes more server resources. -- **WebTransport**: Expected to support high throughput for both unidirectional and bidirectional streams within a single connection, outperforming WebSockets in scenarios requiring multiple streams. - -### Scalability and Server Load -- **WebSockets**: Maintaining a large number of WebSocket connections can significantly increase server load, potentially affecting scalability for applications with many users. -- **Server-Sent Events**: More scalable for scenarios that primarily require updates from server to client, as it uses less connection overhead than WebSockets because it uses "normal" HTTP request without things like [protocol updates](https://developer.mozilla.org/en-US/docs/Web/HTTP/Protocol_upgrade_mechanism) that have to be run with WebSockets. -- **Long-Polling**: The least scalable due to the high server load generated by frequent connection establishment, making it suitable only as a fallback mechanism. -- **WebTransport**: Designed to be highly scalable, benefiting from HTTP/3's efficiency in handling connections and streams, potentially reducing server load compared to WebSockets and SSE. - -## Recommendations and Use-Case Suitability - -In the landscape of server-client communication technologies, each has its distinct advantages and use case suitability. **Server-Sent Events** (SSE) emerge as the most straightforward option to implement, leveraging the same HTTP/S protocols as traditional web requests, thereby circumventing corporate firewall restrictions and other technical problems that can appear with other protocols. They are easily integrated into Node.js and other server frameworks, making them an ideal choice for applications requiring frequent server-to-client updates, such as news feeds, stock tickers, and live event streaming. - -On the other hand, **WebSockets** excel in scenarios demanding ongoing, two-way communication. Their ability to support continuous interaction makes them the prime choice for browser games, chat applications, and live sports updates. - -However, **WebTransport**, despite its potential, faces adoption challenges. It is not widely supported by server frameworks [including Node.js](https://github.com/w3c/webtransport/issues/511) and lacks compatibility with [safari](https://caniuse.com/webtransport). Moreover, its reliance on HTTP/3 further limits its immediate applicability because many WebServers like nginx only have [experimental](https://nginx.org/en/docs/quic.html) HTTP/3 support. While promising for future applications with its support for both reliable and unreliable data transmission, WebTransport is not yet a viable option for most use cases. - -**Long-Polling**, once a common technique, is now largely outdated due to its inefficiency and the high overhead of repeatedly establishing new HTTP connections. Although it may serve as a fallback in environments lacking support for WebSockets or SSE, its use is generally discouraged due to significant performance limitations. - -## Known Problems - -For all of the realtime streaming technologies, there are known problems. When you build anything on top of them, keep these in mind. - -### A client can miss out events when reconnecting - -When a client is connecting, reconnecting or offline, it can miss out events that happened on the server but could not be streamed to the client. -This missed out events are not relevant when the server is streaming the full content each time anyway, like on a live updating stock ticker. -But when the backend is made to stream partial results, you have to account for missed out events. Fixing that on the backend scales pretty bad because the backend would have to remember for each client which events have been successfully send already. Instead this should be implemented with client side logic. - -The [RxDB Sync Engine](../replication.md) for example uses two modes of operation for that. One is the [checkpoint iteration mode](../replication.md#checkpoint-iteration) where normal http requests are used to iterate over backend data, until the client is in sync again. Then it can switch to [event observation mode](../replication.md#event-observation) where updates from the realtime-stream are used to keep the client in sync. Whenever a client disconnects or has any error, the replication shortly switches to [checkpoint iteration mode](../replication.md#checkpoint-iteration) until the client is in sync again. This method accounts for missed out events and ensures that clients can always sync to the exact equal state of the server. - -### Company firewalls can cause problems - -There are many known problems with company infrastructure when using any of the streaming technologies. Proxies and firewall can block traffic or unintentionally break requests and responses. Whenever you implement a realtime app in such an infrastructure, make sure you first test out if the technology itself works for you. - -## Follow Up - -- Check out the [hackernews discussion of this article](https://news.ycombinator.com/item?id=39745993) -- Shared/Like my [announcement tweet](https://twitter.com/rxdbjs/status/1769507055298064818) -- Learn how to use Server-Sent-Events to [replicate a client side RxDB database with your backend](../replication-http.md#pullstream-for-ongoing-changes). -- Learn how to use RxDB with the [RxDB Quickstart](../quickstart.md) -- Check out the [RxDB github repo](https://github.com/pubkey/rxdb) and leave a star ⭐ diff --git a/docs/articles/zero-latency-local-first.html b/docs/articles/zero-latency-local-first.html deleted file mode 100644 index 0961aedec52..00000000000 --- a/docs/articles/zero-latency-local-first.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - -Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression

-

Creating a zero-latency local first application involves ensuring that most (if not all) user interactions occur instantaneously, without waiting on remote network responses. This design drastically enhances user experience, allowing apps to remain responsive and functional even when offline or experiencing poor connectivity. As developers, we can achieve this by storing data locally on the client and synchronizing it to the backend in the background. RxDB (Reactive Database) offers a comprehensive set of features - covering replication, offline support, encryption, compression, conflict handling, and more - that make it straightforward to build such high-performing apps.

-

loading spinner not needed

-

Why Zero Latency with a Local First Approach?

-

In a traditional architecture, each user action triggers requests to a server for reads or writes. Despite network optimizations, unavoidable latencies can delay responses and disrupt the user flow. By contrast, a local first model maintains data in the client's environment (browser, mobile, desktop), drastically reducing user-perceived delays. Once the user re-connects or resumes activity online, changes propagate automatically to the server, eliminating manual synchronization overhead.

-
    -
  1. Instant Responsiveness: Because user actions (queries, updates, etc.) happen against a local datastore, UI updates do not wait on round-trip times.
  2. -
  3. Offline Operation: Apps can continue to read and write data, even when there is zero connectivity.
  4. -
  5. Reduced Backend Load: Instead of flooding the server with small requests, replication can combine and push or pull changes in batches.
  6. -
  7. Simplified Caching: Instead of implementing multi-layer caching, local first transforms your data layer into a reliable, quickly accessible store for all user actions.
  8. -
-
RxDB local Database
-

RxDB: Your Key to Zero-Latency Local First Apps

-

RxDB is a JavaScript-based NoSQL database designed for offline-first and real-time replication scenarios. It supports a range of environments - browsers (IndexedDB or OPFS), mobile (Ionic, React Native), Electron, Node.js - and is built around:

-
    -
  • Reactive Queries that trigger UI updates upon data changes
  • -
  • Schema-based NoSQL Documents for flexible but robust data models
  • -
  • Advanced Sync Engine: to synchronize with diverse backends
  • -
  • Encryption for secure data at rest
  • -
  • Compression to reduce local and network overhead
  • -
-

Real-Time Sync and Offline-First

-

RxDB's replication logic revolves around pulling down remote changes and pushing up local modifications. It maintains a checkpoint-based mechanism, so only new or updated documents flow between the client and server, reducing bandwidth usage and latency. This ensures:

-
    -
  • Live Data: Queries automatically reflect server-side changes once they arrive locally.
  • -
  • Background Updates: No manual polling needed; replication streams or intervals handle synchronization.
  • -
  • Conflict Handling (see below) ensures data merges gracefully when multiple clients edit the same document offline.
  • -
-

Multiple Replication Plugins and Approaches

-

RxDB's flexible replication system lets you connect to different backends or even peer-to-peer networks. There are official plugins for CouchDB, Firestore, GraphQL, WebRTC, and more. Many developers create a custom HTTP replication to work with their existing REST-based backend, ensuring a painless integration that doesn't require adopting an entirely new server infrastructure.

-

Example Setup of a local database

-
import { createRxDatabase } from 'rxdb/plugins/core';
-import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
- 
-async function initZeroLocalDB() {
-  // Create a local RxDB instance using localstorage-based storage
-  const db = await createRxDatabase({
-    name: 'myZeroLocalDB',
-    storage: getRxStorageLocalstorage(),
-    // optional: password for encryption if needed
-  });
- 
-  // Define one or more collections
-  await db.addCollections({
-    tasks: {
-      schema: {
-        title: 'task schema',
-        version: 0,
-        type: 'object',
-        primaryKey: 'id',
-        properties: {
-          id:       { type: 'string', maxLength: 100 },
-          title:    { type: 'string' },
-          done:     { type: 'boolean' }
-        }
-      }
-    }
-  });
- 
-  // Reactive query - automatically updates on local or remote changes
-  db.tasks
-    .find()
-    .$ // returns an RxJS Observable
-    .subscribe(allTasks => {
-      console.log('All tasks updated:', allTasks);
-    });
- 
-  return db;
-}
-

When offline, reads and writes to db.tasks happen locally with near-zero delay. Once connectivity resumes, changes sync to the server automatically (if replication is configured).

-

Example Setup of the replication

-
import { replicateRxCollection } from 'rxdb/plugins/replication';
- 
-async function syncLocalTasks(db) {
-  replicateRxCollection({
-    collection: db.tasks,
-    replicationIdentifier: 'sync-tasks',
-    // Define how to pull server documents and push local documents
-    pull: {
-      handler: async (lastCheckpoint, batchSize) => {
-        // logic to retrieve updated tasks from the server since lastCheckpoint
-      },
-    },
-    push: {
-      handler: async (docs) => {
-        // logic to post local changes to the server
-      },
-    },
-    live: true,        // continuously replicate
-    retryTime: 5000,   // retry on errors or disconnections
-  });
-}
-

This replication seamlessly merges server-side and client-side changes. Your app remains responsive throughout, regardless of the network status.

-

Things you should also know about

-

Optimistic UI on Local Data Changes

-

A local first approach, especially with RxDB, naturally supports an optimistic UI pattern. Because writes occur on the client, you can instantly reflect changes in the interface as soon as the user performs an action - no need to wait for server confirmation. For example, when a user updates a task document to done: true, the UI can re-render immediately with that new state. This even works across multiple browser tabs.

-

RxDB multi tab

-

If a server conflict arises later during replication, RxDB's conflict handling logic determines which changes to keep, and the UI can be updated accordingly. This is far more efficient than blocking the user or displaying a spinner while the backend processes the request.

-

Conflict Handling

-

In local first models, conflicts emerge if multiple devices or clients edit the same document while offline. RxDB tracks document revisions so you can detect collisions and merge them effectively. By default, RxDB uses a last-write-wins approach, but developers can override it with a custom conflict handler. This provides fine-grained control - like merging partial fields, storing revision histories, or prompting users for resolution. Proper conflict handling keeps distributed data consistent across your entire system.

-

Schema Migrations

-

Over time, apps evolve - new fields, changed field types, or altered indexes. RxDB allows incremental schema migrations so you can upgrade a user's local data from one schema version to another. You might, for instance, rename a property or transform data formats. Once you define your migration strategy, RxDB automatically applies it upon app initialization, ensuring the local database's structure aligns with your latest codebase.

-

Advanced Features

-

Setup Encryption

-

When storing data locally, you may handle user-sensitive information like PII (Personal Identifiable Information) or financial details. RxDB supports on-device encryption to protect fields. For example, you can define:

-
import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js';
- 
-const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({
-  storage: getRxStorageLocalstorage()
-});
- 
-const db = await createRxDatabase({
-  name: 'secureDB',
-  storage: encryptedStorage,
-  password: 'myEncryptionPassword'
-});
- 
-await db.addCollections({
-  secrets: {
-    schema: {
-      title: 'secrets schema',
-      version: 0,
-      type: 'object',
-      primaryKey: 'id',
-      properties: {
-        id:          { type: 'string', maxLength: 100 },
-        secretField: { type: 'string' }
-      },
-      required: ['id'],
-      encrypted: ['secretField'] // define which fields to encrypt
-    }
-  }
-});
-

Then mark fields as encrypted in the schema. This ensures data is unreadable on disk without the correct password.

-

Setup Compression

-

Local data can expand quickly, especially for large documents or repeated key names. RxDB's key compression feature replaces verbose field names with shorter tokens, decreasing storage usage and speeding up replication. You enable it by adding keyCompression: true to your collection schema:

-
await db.addCollections({
-  logs: {
-    schema: {
-      title: 'log schema',
-      version: 0,
-      keyCompression: true,
-      type: 'object',
-      primaryKey: 'id',
-      properties: {
-        id:         { type: 'string'. maxLength: 100 },
-        message:    { type: 'string' },
-        timestamp:  { type: 'number' }
-      }
-    }
-  }
-});
-

Different RxDB Storages Depending on the Runtime

-

RxDB's storage layer is swappable, so you can pick the optimal adapter for each environment. Some common choices include:

-
    -
  • IndexedDB in modern browsers (default).
  • -
  • OPFS (Origin Private File System) in browsers that support it for potentially better performance.
  • -
  • SQLite for mobile or desktop environments via the premium plugin, offering native-like speed on Android, iOS, or Electron.
  • -
  • In-Memory for tests or ephemeral data.
  • -
-

By choosing a suitable storage layer, you can adapt your zero-latency local first design to any runtime - web, mobile, or server-like contexts in Node.js.

-

Performance Considerations

-

Performant local data operations are crucial for a zero-latency experience. According to the RxDB storage performance overview, differences in underlying storages can significantly impact throughput and latency. For instance, IndexedDB typically performs well across modern browsers, OPFS offers improved throughput in supporting browsers, and SQLite storage (a premium plugin) often delivers near-native speed for mobile or desktop.

-

Offloading Work from the Main Thread

-

In a browser environment, you can move database operations into a Web Worker using the Worker RxStorage plugin. This approach lets you keep heavy data processing off the main thread, ensuring the UI remains smooth and responsive. Complex queries or large write operations no longer cause stuttering in the user interface.

-

Sharding or Memory-Mapped Storages

-

For large datasets or high concurrency, advanced techniques like sharding collections across multiple storages or leveraging a memory-mapped variant can further boost performance. By splitting data into smaller subsets or streaming it only as needed, you can scale to handle complex usage scenarios without compromising on the zero-latency user experience.

-

Follow Up

- -

By integrating RxDB into your stack, you achieve millisecond interactions, full offline capabilities, secure data at rest, and minimal overhead for large or distributed teams. This zero-latency local first architecture is the future of modern software - delivering a fluid, always-available user experience without overcomplicating the developer workflow.

- - \ No newline at end of file diff --git a/docs/articles/zero-latency-local-first.md b/docs/articles/zero-latency-local-first.md deleted file mode 100644 index 7abb4e58f57..00000000000 --- a/docs/articles/zero-latency-local-first.md +++ /dev/null @@ -1,228 +0,0 @@ -# Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression - -> Build blazing-fast, zero-latency local first apps with RxDB. Gain instant UI responses, robust offline capabilities, end-to-end encryption, and data compression for streamlined performance. - -# Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression - -Creating a **zero-latency local first** application involves ensuring that most (if not all) user interactions occur instantaneously, without waiting on remote network responses. This design drastically enhances user experience, allowing apps to remain responsive and functional even when offline or experiencing poor connectivity. As developers, we can achieve this by storing data **locally on the client** and synchronizing it to the backend in the background. **RxDB** (Reactive Database) offers a comprehensive set of features - covering replication, offline support, encryption, compression, conflict handling, and more - that make it straightforward to build such high-performing apps. - - - -## Why Zero Latency with a Local First Approach? - -In a traditional architecture, each user action triggers requests to a server for reads or writes. Despite network optimizations, unavoidable latencies can delay responses and disrupt the user flow. By contrast, a local first model maintains data in the client's environment (browser, mobile, desktop), drastically reducing user-perceived delays. Once the user re-connects or resumes activity online, changes propagate automatically to the server, eliminating manual synchronization overhead. - -1. **Instant Responsiveness**: Because user actions (queries, updates, etc.) happen against a local datastore, UI updates do not wait on round-trip times. -2. **Offline Operation**: Apps can continue to read and write data, even when there is zero connectivity. -3. **Reduced Backend Load**: Instead of flooding the server with small requests, replication can combine and push or pull changes in batches. -4. **Simplified Caching**: Instead of implementing multi-layer caching, local first transforms your data layer into a reliable, quickly accessible store for all user actions. - -
- - - -
- -## RxDB: Your Key to Zero-Latency Local First Apps - -**RxDB** is a JavaScript-based NoSQL database designed for offline-first and real-time replication scenarios. It supports a range of environments - browsers (IndexedDB or OPFS), mobile ([Ionic](./ionic-storage.md), [React Native](../react-native-database.md)), [Electron](../electron-database.md), Node.js - and is built around: - -- **Reactive Queries** that trigger UI updates upon data changes -- **Schema-based NoSQL Documents** for flexible but robust data models -- [Advanced Sync Engine](../replication.md): to synchronize with diverse backends -- **Encryption** for secure data at rest -- **Compression** to reduce local and network overhead - -### Real-Time Sync and Offline-First -RxDB's replication logic revolves around pulling down remote changes and pushing up local modifications. It maintains a checkpoint-based mechanism, so only new or updated documents flow between the client and server, reducing bandwidth usage and latency. This ensures: - -- **Live Data**: Queries automatically reflect server-side changes once they arrive locally. -- **Background Updates**: No manual polling needed; replication streams or intervals handle synchronization. -- **Conflict Handling** (see below) ensures data merges gracefully when multiple clients edit the same document offline. - -#### Multiple Replication Plugins and Approaches -RxDB's flexible replication system lets you connect to different backends or even peer-to-peer networks. There are official plugins for [CouchDB](../replication-couchdb.md), [Firestore](../replication-firestore.md), [GraphQL](../replication-graphql.md), [WebRTC](../replication-webrtc.md), and more. Many developers create a **custom HTTP replication** to work with their existing REST-based backend, ensuring a painless integration that doesn't require adopting an entirely new server infrastructure. - -#### Example Setup of a local database - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -async function initZeroLocalDB() { - // Create a local RxDB instance using localstorage-based storage - const db = await createRxDatabase({ - name: 'myZeroLocalDB', - storage: getRxStorageLocalstorage(), - // optional: password for encryption if needed - }); - - // Define one or more collections - await db.addCollections({ - tasks: { - schema: { - title: 'task schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string', maxLength: 100 }, - title: { type: 'string' }, - done: { type: 'boolean' } - } - } - } - }); - - // Reactive query - automatically updates on local or remote changes - db.tasks - .find() - .$ // returns an RxJS Observable - .subscribe(allTasks => { - console.log('All tasks updated:', allTasks); - }); - - return db; -} -``` - -When offline, reads and writes to `db.tasks` happen locally with near-zero delay. Once connectivity resumes, changes sync to the server automatically (if replication is configured). - -#### Example Setup of the replication - -```ts -import { replicateRxCollection } from 'rxdb/plugins/replication'; - -async function syncLocalTasks(db) { - replicateRxCollection({ - collection: db.tasks, - replicationIdentifier: 'sync-tasks', - // Define how to pull server documents and push local documents - pull: { - handler: async (lastCheckpoint, batchSize) => { - // logic to retrieve updated tasks from the server since lastCheckpoint - }, - }, - push: { - handler: async (docs) => { - // logic to post local changes to the server - }, - }, - live: true, // continuously replicate - retryTime: 5000, // retry on errors or disconnections - }); -} -``` - -This replication seamlessly merges server-side and client-side changes. Your app remains responsive throughout, regardless of the network status. - -## Things you should also know about - -### Optimistic UI on Local Data Changes - -A local first approach, especially with RxDB, naturally supports an [optimistic UI](./optimistic-ui.md) pattern. Because writes occur on the client, you can instantly reflect changes in the interface as soon as the user performs an action - no need to wait for server confirmation. For example, when a user updates a task document to done: true, the UI can re-render immediately with that new state. This even works across multiple browser tabs. - - - -If a server conflict arises later during replication, RxDB's [conflict handling](../transactions-conflicts-revisions.md) logic determines which changes to keep, and the UI can be updated accordingly. This is far more efficient than blocking the user or displaying a spinner while the backend processes the request. - -### Conflict Handling - -In local first models, conflicts emerge if multiple devices or clients edit the same document while offline. RxDB tracks document revisions so you can detect collisions and merge them effectively. By default, RxDB uses a last-write-wins approach, but developers can override it with a custom conflict handler. This provides fine-grained control - like merging partial fields, storing revision histories, or prompting users for resolution. Proper conflict handling keeps distributed data consistent across your entire system. - -### Schema Migrations - -Over time, apps evolve - new fields, changed field types, or altered indexes. RxDB allows incremental schema migrations so you can upgrade a user's local data from one schema version to another. You might, for instance, rename a property or transform data formats. Once you define your migration strategy, RxDB automatically applies it upon app initialization, ensuring the local database's structure aligns with your latest codebase. - -## Advanced Features - -### Setup Encryption -When storing data locally, you may handle user-sensitive information like PII (Personal Identifiable Information) or financial details. RxDB supports on-device [encryption](../encryption.md) to protect fields. For example, you can define: - -```ts -import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; - -const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ - storage: getRxStorageLocalstorage() -}); - -const db = await createRxDatabase({ - name: 'secureDB', - storage: encryptedStorage, - password: 'myEncryptionPassword' -}); - -await db.addCollections({ - secrets: { - schema: { - title: 'secrets schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string', maxLength: 100 }, - secretField: { type: 'string' } - }, - required: ['id'], - encrypted: ['secretField'] // define which fields to encrypt - } - } -}); -``` - -Then mark fields as `encrypted` in the schema. This ensures data is unreadable on disk without the correct password. - -### Setup Compression - -Local data can expand quickly, especially for large documents or repeated key names. RxDB's key compression feature replaces verbose field names with shorter tokens, decreasing storage usage and speeding up replication. You enable it by adding keyCompression: true to your collection schema: - -```ts -await db.addCollections({ - logs: { - schema: { - title: 'log schema', - version: 0, - keyCompression: true, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string'. maxLength: 100 }, - message: { type: 'string' }, - timestamp: { type: 'number' } - } - } - } -}); -``` - -## Different RxDB Storages Depending on the Runtime - -RxDB's storage layer is swappable, so you can pick the optimal adapter for each environment. Some common choices include: - -- [IndexedDB](../rx-storage-indexeddb.md) in modern browsers (default). -- [OPFS](../rx-storage-opfs.md) (Origin Private File System) in browsers that support it for potentially better performance. -- [SQLite](../rx-storage-sqlite.md) for mobile or desktop environments via the premium plugin, offering native-like speed on Android, iOS, or Electron. -- [In-Memory](../rx-storage-memory.md) for tests or ephemeral data. - -By choosing a suitable storage layer, you can adapt your zero-latency local first design to any runtime - web, [mobile](./mobile-database.md), or server-like contexts in [Node.js](../nodejs-database.md). - -## Performance Considerations - -Performant local data operations are crucial for a zero-latency experience. According to the RxDB [storage performance overview](../rx-storage-performance.md), differences in underlying storages can significantly impact throughput and latency. For instance, IndexedDB typically performs well across modern browsers, [OPFS](../rx-storage-opfs.md) offers improved throughput in supporting browsers, and [SQLite storage](../rx-storage-sqlite.md) (a premium plugin) often delivers near-native speed for mobile or desktop. - -### Offloading Work from the Main Thread - -In a browser environment, you can move database operations into a Web Worker using the [Worker RxStorage plugin](../rx-storage-worker.md). This approach lets you keep heavy data processing off the main thread, ensuring the UI remains smooth and responsive. Complex queries or large write operations no longer cause stuttering in the user interface. - -### Sharding or Memory-Mapped Storages - -For large datasets or high concurrency, advanced techniques like [sharding](../rx-storage-sharding.md) collections across multiple storages or leveraging a [memory-mapped](../rx-storage-memory-mapped.md) variant can further boost performance. By splitting data into smaller subsets or streaming it only as needed, you can scale to handle complex usage scenarios without compromising on the zero-latency user experience. - -## Follow Up - -- Dive into the [RxDB Quickstart](../quickstart.md) to set up your own local first database. -- Explore [Replication Plugins](../replication.md) for syncing with platforms like [CouchDB](../replication-couchdb.md), [Firestore](./firestore-alternative.md), or [GraphQL](../replication-graphql.md). -- Check out Advanced [Conflict Handling](../transactions-conflicts-revisions.md) and [Performance Tuning](../rx-storage-performance.md) for big data sets or complex multi-user interactions. -- Join the RxDB Community on [GitHub](/code/) and [Discord](/chat/) to share insights, file issues, and learn from other developers building zero-latency solutions. -- -By integrating RxDB into your stack, you achieve millisecond interactions, full [offline capabilities](../offline-first.md), secure data at rest, and minimal overhead for large or distributed teams. This zero-latency local first architecture is the future of modern software - delivering a fluid, always-available user experience without overcomplicating the developer workflow. diff --git a/docs/assets/css/styles.b066e612.css b/docs/assets/css/styles.b066e612.css deleted file mode 100644 index 327f2929ef3..00000000000 --- a/docs/assets/css/styles.b066e612.css +++ /dev/null @@ -1 +0,0 @@ -.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.col,.container,html{width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}html,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar,html{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}.block table,.premium-request iframe{box-shadow:0 0 12px 8px var(--bg-color)}#CybotCookiebotDialogBodyLevelButtonLevelOptinAllowAll,.slick-dots li.slick-active button:before{background-color:var(--color-top)!important}.navbar,.side-tabs__tab,.slick-slide{align-self:stretch}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}.searchbox__reset:focus,.searchbox__submit:focus,body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.markdown li,body{word-wrap:break-word}.clean-list,.containsTaskList_mC6p,.details_lb9f>summary,.dropdown__menu,.menu__list{list-style:none}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem}:root,[data-theme=dark]{--ifm-color-primary:#ed168f;--ifm-color-primary-dark:#ed168f;--ifm-color-primary-darker:#8d2089;--ifm-color-primary-darkest:#5f2688;--ifm-color-primary-light:#29d5b0;--ifm-color-primary-lighter:#32d8b4;--ifm-color-primary-lightest:#4fddbf}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}*,.algolia-autocomplete .ds-dropdown-menu *{box-sizing:border-box}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%;min-height:100%;padding:0}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal);vertical-align:middle}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0;background-color:var(--bg-color-code)}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size);margin-top:0}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.clear,.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){-webkit-text-decoration:none;text-decoration:none}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_uzNF .wordWrapButtonIcon_b1P5{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.block.fifth h2,.block.last h2,.block.offline-first h2,.block.replication h2,.block.sixth h2,.redirectBox .ul-container,.reviews h2,.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}#price-calculator-result table th,.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_Gvgb,.alert__heading,.text--uppercase,.trophy .subtitle,.trophy .valuetitle{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic,pre[data-theme] span[style*="--shiki-token-keyword"]{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover,.hash-link:focus,:hover>.hash-link{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.badge,.close{line-height:1}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);-webkit-text-decoration:none;text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));transition-duration:var(--ifm-button-transition-duration);white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button:hover{box-shadow:0 6px px #ca007c,-2px -1px 14px #ff009e}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.block.fifth .box a,.button a,.dropdown__link--active,.dropdown__link:hover,.menu__link:hover,.navbar__brand:hover,.navbar__link--active,.navbar__link:hover,.pagination-nav__link:hover,.pagination__link:hover,a:hover,a:visited{-webkit-text-decoration:none;text-decoration:none}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card--full-height{height:100%}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.block.last,.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);-webkit-text-decoration:none;text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.button,.call-to-action a,.searchbox__input,.searchbox__submit,.searchbox__submit svg{vertical-align:middle}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color)}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.docItemContainer_c0TR article>:first-child,.docItemContainer_c0TR header+*,.footer__item,h3{margin-top:0}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.markdown p,p{line-height:165%}.admonitionContent_BuS1>:last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items{margin-bottom:0}.footer-nav-links,.slick-slide,[type=checkbox],pre[data-theme]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.navbar-sidebar,.navbar-sidebar__backdrop{opacity:0;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;top:0;left:0;bottom:0;visibility:hidden}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color)}.menu__caret:before,.menu__link--sublist-caret:after{filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;content:""}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.navbar__items--center .navbar__brand,body{margin:0}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.flex,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color)}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;margin-right:.5rem}.full-height,.navbar__logo img,body,html{height:100%}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color)}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:1rem;height:2rem;padding:0 .5rem 0 2.25rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);position:fixed;transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;position:fixed;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover)}.block.fifth .box a:hover,.button.button-empty:hover,.content_knG7 a,.markdown a,.navbar__link:hover,.package a:hover,.slider-content .slider-profile .company-link,.tag-cloud a:hover,.underline-link,p a,p a:hover,td a{-webkit-text-decoration:underline;text-decoration:underline}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto;padding-left:0}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec;--ifm-background-color:#0d0f18;--ifm-navbar-background-color:#0d0f18;--ifm-code-background:var(--bg-color-code)}:root{--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-code-font-size:var(--fontSizes-s);--csstools-color-scheme--light: ;color-scheme:dark;--ifm-font-family-base:"Atkinson Hyperlegible Mono",ui-monospace,SFMono-Regular,Menlo,Consolas,"Liberation Mono","DejaVu Sans Mono",monospace;--ifm-font-family-monospace:"Atkinson Hyperlegible Mono",ui-monospace,SFMono-Regular,Menlo,Consolas,"Liberation Mono","DejaVu Sans Mono",monospace;--ifm-heading-margin-bottom:40px;--bg-color:#20293c;--bg-color-dark:#0d0f18;--bg-color-darkest:#0d0f18;--bg-color-code:#282330;--shiki-background:var(--bg-color-code);--shiki-foreground:#f8f8f2;--shiki-token-comment:#6272a4;--shiki-token-keyword:#bd93f9;--shiki-token-function:#50fa7b;--shiki-token-string:#f1fa8c;--shiki-token-string-expression:#ff79c6;--shiki-token-constant:#8be9fd;--shiki-token-parameter:#ffb86c;--shiki-token-punctuation:var(--shiki-foreground);--shiki-line-highlight:#0000004d;--fontSizes-xxs:0.6rem;--fontSizes-xs:0.75rem;--fontSizes-s:0.9rem;--fontSizes-m:1rem;--fontSizes-l:1.25rem;--fontSizes-xl:1.5rem;--fontSizes-2xl:1.75rem;--fontSizes-3xl:2rem;--fontSizes-4xl:2.25rem;--fontSizes-5xl:2.5rem;--fontSizes-6xl:4.5rem;--fontSizes-7xl:5rem;--space-between-blocks:0px;--fontColor-white:#fff;--fontColor-offwhite:#fff;--ifm-hero-text-color:#fff;--fontColor-gray:#d3d3d3;--color-top:#ed168f;--color-middle:#b2218b;--color-bottom:#752a8a;--docusaurus-announcement-bar-height:auto;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}@font-face{font-display:swap;font-family:Atkinson Hyperlegible Mono;font-style:normal;font-weight:100 900;src:url(data:font/truetype;charset=utf-8;base64,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AUUBRwFJAUwBTgFQAVIBVAFWAVoBagFrAWwBbQJ4AGYCeAAjAngAIwJ4ACMCeAAjAngAIwJ4ACMCeAAjAngAIwJ4ACMCeAAjAngABQJ4AHQCeAA2AngANgJ4ADYCeAA2AngANgJ4AE0CeABNAngAFgJ4ABYCeACJAngAiQJ4AIkCeACJAngAiQJ4AIkCeACJAngAiQJ4AIkCeACJAngAKQJ4ACkCeAApAngAKQJ4AEECeAAKAngAjwJ4AAoCeACPAngAjwJ4AI8CeACPAngAjwJ4AI8CeACPAngARQJ4AEUCeABiAngAYgJ4AJMCeACTAngAkwJ4AJMCeAAfAngAMwJ4AFUCeABVAngAVQJ4AFUCeABVAngAKQJ4ACkCeAApAngAKQJ4ACkCeAApAngAKQJ4ACkCeAAIAngAdwJ4AHcCeAApAngAdgJ4AHYCeAB2AngASQJ4AEkCeABJAngASQJ4AEkCeABRAngAPwJ4AD8CeAA/AngAPwJ4AFUCeABVAngAVQJ4AFUCeABVAngAVQJ4AFUCeABVAngAVQJ4ADECeAANAngADQJ4AA0CeAANAngADQJ4ACMCeAAkAngAJAJ4ACQCeAAkAngAJAJ4ADYCeAA2AngANgJ4ADYCeABYAngAWAJ4AFgCeABYAngAWAJ4AFgCeABYAngAWAJ4AFgCeABYAngACgJ4AGQCeABlAngAZQJ4AGUCeABlAngAZQJ4ADsCeAAsAngAOwJ4AD0CeABUAngAVAJ4AFQCeABUAngAVAJ4AFQCeABUAngAVAJ4AFQCeABtAngAQgJ4AEICeABCAngAQgJ4AHICeAAxAngAcwJ4AHMCeABzAngAcwJ4AHMCeABzAngAcwJ4AHMCeABzAngAbgJ4AGQCeABkAngAZAJ4AJgCeACYAngAfAJ4AHwCeAB8AngAfAJ4AHwCeABHAngAcgJ4AHICeAByAngAcgJ4AHICeABGAngARgJ4AEYCeABGAngARgJ4AEYCeABGAngARgJ4AAQCeABkAngAZAJ4ADsCeACiAngAogJ4AKICeABuAngAbgJ4AG4CeABuAngAbgJ4AGICeACCAngAggJ4AIICeACCAngAdgJ4AHYCeAB2AngAdgJ4AHYCeAB2AngAdgJ4AHYCeAB2AngAQgJ4ACMCeAAjAngAIwJ4ACMCeAAjAngATgJ4AEICeABCAngAQgJ4AEICeABCAngAaQJ4AGkCeABpAngAaQJ4AKgCeACeAngAIwJ4AB0CeACBAngASQJ4AAACeAAAAngAAAJ4AQgCeAEIAngBCAJ4AQgCeAA2AngBDQJ4AQ0CeACGAngAcwJ4AQgCeAEIAngBCAJ4AJYCeACNAngAJgJ4ADwCeAA8AngAswJ4AGkCeAAjAnj//gJ4AMMCeACWAngAlwJ4AKMCeADUAngAowJ4AQgCeACwAngAsAJ4ALACeAEHAngBCAJ4AHQCeAB0AngA1AJ4ANQCeADNAngBIAJ4AGECeABhAngADwJ4ABYCeABlAngAYQJ4ABQCeAAUAngADAJ4AMICeAEhAngBIQJ4AGUCeABjAngAOwJ4AHoCeABTAngASQJ4ABwCeABnAngANQJ4AQgCeAAuAngARAJ4AEQCeABxAngARAJ4AEQCeABEAngAVQJ4AFUCeABaAngAWgJ4AE4CeABLAngASAJ4AEoCeABnAngADQJ4AJoCeABbAngAWgJ4AEYCeABXAngAEAJ4ABwCeABrAAAAwAAAAMAAAAEPAAABDwAAAQwAAAD3AAAA8QAAAPcAAADxAAAAugAAALoAAAETAAAAwAAAAMAAAADAAAAAwAAAAMkAAADJAAAA3QAAAN0AAACxAAAAsQAAAL0AAAC9AAAA/QAAAOgAAAD7AAAA+wJ4AMABDwD3APcAugDAALgAwADJAN0AsQC9AOgA+wBAAHgAYgBlAD8AaABnAGYAUgBJAEAANQA/AFsAIwEGAK4ArwAAAAAAGgE+AAMAAQQJAAABBgSsAAMAAQQJAAEASgRiAAMAAQQJAAIADgRUAAMAAQQJAAMAXAP4AAMAAQQJAAQASgRiAAMAAQQJAAUAGgPeAAMAAQQJAAYARgOYAAMAAQQJAAgAUgNGAAMAAQQJAAkApAKiAAMAAQQJAAsAQgJgAAMAAQQJAAwALgIyAAMAAQQJAA0BIgEQAAMAAQQJAA4ANgDaAAMAAQQJABAANACmAAMAAQQJABEAFACSAAMAAQQJABkAMABiAAMAAQQJAQAADABWAAMAAQQJAQEAFACSAAMAAQQJAQIACgBMAAMAAQQJAQMADgRUAAMAAQQJAQQADABAAAMAAQQJAQUAEAAwAAMAAQQJAQYACAAoAAMAAQQJAQcAEgAWAAMAAQQJAQgADAAKAAMAAQQJAQkACgAAAFIAbwBtAGEAbgBJAHQAYQBsAGkAYwBFAHgAdAByAGEAQgBvAGwAZABCAG8AbABkAFMAZQBtAGkAQgBvAGwAZABNAGUAZABpAHUAbQBMAGkAZwBoAHQAVwBlAGkAZwBoAHQAQQB0AGsAaQBuAHMAbwBuAEgAeQBwAGUAcgBsAGUAZwBpAGIAbABlAE0AbwBuAG8ARQB4AHQAcgBhAEwAaQBnAGgAdABBAHQAawBpAG4AcwBvAG4AIABIAHkAcABlAHIAbABlAGcAaQBiAGwAZQAgAE0AbwBuAG8AaAB0AHQAcABzADoALwAvAG8AcABlAG4AZgBvAG4AdABsAGkAYwBlAG4AcwBlAC4AbwByAGcAVABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABpAHMAIABsAGkAYwBlAG4AcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgAgAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAaQBzACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoAIABoAHQAdABwAHMAOgAvAC8AbwBwAGUAbgBmAG8AbgB0AGwAaQBjAGUAbgBzAGUALgBvAHIAZwBoAHQAdABwADoALwAvAGgAZQBsAGwAbwBhAHAAcABsAGkAZQBkAC4AYwBvAG0AaAB0AHQAcABzADoALwAvAHcAdwB3AC4AYgByAGEAaQBsAGwAZQBpAG4AcwB0AGkAdAB1AHQAZQAuAG8AcgBnAC8ARQBsAGwAaQBvAHQAdAAgAFMAYwBvAHQAdAAsACAATQBlAGcAYQBuACAARQBpAHMAdwBlAHIAdABoACwAIABMAGkAbgB1AHMAIABCAG8AbQBhAG4ALAAgAFQAaABlAG8AZABvAHIAZQAgAFAAZQB0AHIAbwBzAGsAeQAsACAATABlAHQAdABlAHIAcwAgAGYAcgBvAG0AIABTAHcAZQBkAGUAbgBBAHAAcABsAGkAZQBkACAARABlAHMAaQBnAG4AIABXAG8AcgBrAHMALAAgAEwAZQB0AHQAZQByAHMAIABmAHIAbwBtACAAUwB3AGUAZABlAG4AQQB0AGsAaQBuAHMAbwBuAEgAeQBwAGUAcgBsAGUAZwBpAGIAbABlAE0AbwBuAG8ALQBFAHgAdAByAGEATABpAGcAaAB0AFYAZQByAHMAaQBvAG4AIAAyAC4AMAAwADEAMgAuADAAMAAxADsATgBPAE4ARQA7AEEAdABrAGkAbgBzAG8AbgBIAHkAcABlAHIAbABlAGcAaQBiAGwAZQBNAG8AbgBvAC0ARQB4AHQAcgBhAEwAaQBnAGgAdABSAGUAZwB1AGwAYQByAEEAdABrAGkAbgBzAG8AbgAgAEgAeQBwAGUAcgBsAGUAZwBpAGIAbABlACAATQBvAG4AbwAgAEUAeAB0AHIAYQBMAGkAZwBoAHQAQwBvAHAAeQByAGkAZwBoAHQAIAAyADAAMgAwAC0AMgAwADIANAAgAFQAaABlACAAQQB0AGsAaQBuAHMAbwBuACAASAB5AHAAZQByAGwAZQBnAGkAYgBsAGUAIABNAG8AbgBvACAAUAByAG8AagBlAGMAdAAgAEEAdQB0AGgAbwByAHMAIAAoAGgAdAB0AHAAcwA6AC8ALwBnAGkAdABoAHUAYgAuAGMAbwBtAC8AZwBvAG8AZwBsAGUAZgBvAG4AdABzAC8AYQB0AGsAaQBuAHMAbwBuAC0AaAB5AHAAZQByAGwAZQBnAGkAYgBsAGUALQBuAGUAeAB0AC0AbQBvAG4AbwApAAIAAAAAAAD/sgAwAAAAAQAAAAAAAAAAAAAAAAAAAAABfAAAACQAyQECAMcAYgCtAQMBBABjAK4AkAAlACYA/QD/AGQBBQAnAQYBBwDpACgAZQEIAMgAygEJAMsBCgELACkAKgD4AQwBDQArAQ4ALAEPAMwAzQDOAPoAzwEQAREALQESAC4BEwAvARQBFQEWAOIAMAAxARcBGAEZAGYAMgDQANEAZwDTARoAkQCvALAAMwDtADQANQEbARwANgEdAOQA+wEeAR8ANwEgASEBIgA4ANQA1QBoANYBIwEkASUBJgA5ADoBJwEoASkBKgA7ADwA6wErALsBLAA9AS0A5gEuAEQAaQEvAGsAbABqATABMQBuAG0AoABFAEYA/gEAAG8BMgBHATMBAQDqAEgAcAE0AHIAcwE1AHEBNgE3AEkASgD5ATgBOQBLAToATADXAHQAdgB3ATsAdQE8AT0BPgBNAT8BQABOAUEATwFCAUMBRADjAFAAUQFFAUYBRwB4AFIAeQB7AHwAegFIAKEAfQCxAFMA7gBUAFUBSQFKAFYBSwDlAPwBTACJAFcBTQFOAU8AWAB+AIAAgQB/AVABUQFSAVMAWQBaAVQBVQFWAVcAWwBcAOwBWAC6AVkAXQFaAOcBWwCdAJ4BXAFdAV4AmwADAV8BYAARAA8AHQAeAKsABACjACIAogDDAWEBYgCHAA0ABgASAD8AEACyALMAQgALAAwAXgBgAD4AQADEAMUAtAC1ALYAtwCpAKoAvgC/AAUACgCmAWMAIwAJAIgAhgCLAIoAjACDAF8A6ACCAMIBZACEAL0ABwFlAIUAlgFmAWcADgDvAPAAuAAgAI8AIQAfAJUAlACTAKcApABhAEEAkgCcAJoAmQClAJgACADGALkBaAFpAWoBawFsAW0BbgFvAXABcQFyAXMBdAF1AXYBdwF4AXkBegF7AXwBfQF+AX8BgAGBAYIBgwCOANwAQwCNAN8A2AGEAOEA2wDdANkA2gDeAOAAEwAUABUAFgAXABgAGQAaABsAHAGFALwA9AD1APYBhgGHAYgGQWJyZXZlB0FtYWNyb24HQW9nb25lawpDZG90YWNjZW50BkRjYXJvbgZEY3JvYXQGRWNhcm9uCkVkb3RhY2NlbnQHRW1hY3JvbgdFb2dvbmVrB3VuaTAxMjIKR2RvdGFjY2VudARIYmFyAklKB0ltYWNyb24HSW9nb25lawt1bmkwMDRBMDMwMQd1bmkwMTM2BkxhY3V0ZQZMY2Fyb24HdW5pMDEzQgZOYWN1dGUGTmNhcm9uB3VuaTAxNDUNT2h1bmdhcnVtbGF1dAZSYWN1dGUGUmNhcm9uBlNhY3V0ZQd1bmkwMjE4B3VuaTFFOUUGVGNhcm9uB3VuaTAxNjIHdW5pMDIxQQ1VaHVuZ2FydW1sYXV0B1VtYWNyb24HVW9nb25lawVVcmluZwZXYWN1dGULV2NpcmN1bWZsZXgJV2RpZXJlc2lzBldncmF2ZQtZY2lyY3VtZmxleAZZZ3JhdmUGWmFjdXRlClpkb3RhY2NlbnQGYWJyZXZlB2FtYWNyb24HYW9nb25lawpjZG90YWNjZW50BmRjYXJvbgZlY2Fyb24KZWRvdGFjY2VudAdlbWFjcm9uB2VvZ29uZWsHdW5pMDEyMwpnZG90YWNjZW50BGhiYXIJaS5sb2NsVFJLB2ltYWNyb24HaW9nb25lawJpagd1bmkwMjM3C3VuaTAwNkEwMzAxB3VuaTAxMzcGbGFjdXRlBmxjYXJvbgd1bmkwMTNDBm5hY3V0ZQZuY2Fyb24HdW5pMDE0Ng1vaHVuZ2FydW1sYXV0BnJhY3V0ZQZyY2Fyb24Gc2FjdXRlB3VuaTAyMTkGdGNhcm9uB3VuaTAxNjMHdW5pMDIxQg11aHVuZ2FydW1sYXV0B3VtYWNyb24HdW9nb25lawV1cmluZwZ3YWN1dGULd2NpcmN1bWZsZXgJd2RpZXJlc2lzBndncmF2ZQt5Y2lyY3VtZmxleAZ5Z3JhdmUGemFjdXRlCnpkb3RhY2NlbnQHdW5pMDM5NAd1bmkwM0E5B3VuaTAzQkMHdW5pMDBBMAd1bmkyMDA5FnBlcmlvZGNlbnRlcmVkLmxvY2xDQVQbcGVyaW9kY2VudGVyZWQubG9jbENBVC5jYXNlC211c2ljYWxub3RlCWVzdGltYXRlZARFdXJvB3VuaTIyMTkHdW5pMjIxNQd1bmkwMzA4DHVuaTAzMDguY2FzZQd1bmkwMzA3DHVuaTAzMDcuY2FzZQ11bmkwMzA3LmxhcmdlCWdyYXZlY29tYg5ncmF2ZWNvbWIuY2FzZQlhY3V0ZWNvbWIOYWN1dGVjb21iLmNhc2UHdW5pMDMwQgx1bmkwMzBCLmNhc2ULdW5pMDMwQy5hbHQHdW5pMDMwMgx1bmkwMzAyLmNhc2UHdW5pMDMwQwx1bmkwMzBDLmNhc2UHdW5pMDMwNgx1bmkwMzA2LmNhc2UHdW5pMDMwQQx1bmkwMzBBLmNhc2UJdGlsZGVjb21iDnRpbGRlY29tYi5jYXNlB3VuaTAzMDQMdW5pMDMwNC5jYXNlB3VuaTAzMjYHdW5pMDMyNwd1bmkwMzI4DHVuaTAzMjguY2FzZQd1bmkwMkM5CXplcm8uemVybwd1bmkwMEI5B3VuaTAwQjIHdW5pMDBCMwAAAQAAAAoAJgBGAAJERkxUAA5sYXRuAA4ABAAAAAD//wACAAAAAQACbWFyawAWbWttawAOAAAAAgADAAQAAAADAAAAAQACAAULLAmMAJQAbgAMAAYAEAABAAoAAgABCWAJYAABCKwADAAWA6gIGgOoBwICfgBCAnQAOAJqAC4DsggkAmAGwAJWCC4CTAgAA5QH8AJCCBAAAwFpA2MO3AoYAAMBCANWCPAICgADAXADVg54CAAABgAQAAEACgABAAEP2g/aAAEPsAAMAAIABgw4AAMBP/8VBi4OfAAEAAAAAQAIAAEI2gfOAAEIJgAMAN0IwgeyB6gHngeUB7IHigjCB3oHagdgB1YHTAdCBzIHTAciBxIHCAb+BvQG6gbgBtYGzAb0BsIGuAauBqQGmgakBpAGhgjCB7IHngeUBnwHsgeKCMIGcgZoBlgGWAZOBkQGTgZOCMIIwgeyBjoIwgdqBjQGKgYgBhYGKgYGBjQF/AXyBegF3gXUBcoFwAjCB7IGOgjCCMIIwgY6CMIIwgjCB7IHngeUB7IFtgeKCMIFpgWcBZIFiAV+BXQFiAVqBWAFVgVMBUIFVgU4BS4FJAUaBRAFBgT8BOwE3AUGBMwFEATCBLgEsgSoBJ4ElASKBJ4EgAR2BGwEYgRYBE4ERAREBGIEOgQ0BCoEIAQWBAYD/APyA9wD0gPIA74DtAO0A8gDqgPcA5oDkAOGA3wDfANyA2gDcgNyA14IdANUA0oIdANACMgDNgMsAyIDNgMYCMgDDgMEAvoC8ALmAtYCzALCArgCrgKkArgCuAKaApoCmgKaAvACkAKGAnwCkAJyAmgC8AJeAlQCSgJAAjYCLAJAAiYIyAM2AywDIgM2AiACFgIMAgIDIgMiAfgB7gHkAywB2gHQAcYDDgG8AAMBPAKLDEgDGgADATwC+wAAB/oAAwE8AqQAAAxUAAMBPAKhAAADHAADAWkCtwxQB9wAAwEKArgAAAzmAAMBbwK4DawM3AADAUcCrwAAAuQAAwFHAqEAAALqAAMBRwK4AAAMvgABAUcB8AABAT0B8AADATwCrwxoAroAAwE8AqcMXgLAAAMBPAK4DFQMlAADATwB8AxKAAAAAwE9AfANUAAAAAMBOgL7C6YHYgADAToCiwucAm4AAwGTArcLOAdOAAMBOgKvC4gCagADAToCpwt+AnAAAwE6ArgLdAxEAAMBHQHwC+oAAAADAToCoQNsAlIAAwE6ArgDYgwmAAMBOgHwA1gAAAADATsCoQAeAjQAAwE7ArgAFAwIAAMBOwHwAAoAAAAAAB6AAAADAUwB8AteAAAAAwE6AfALFAAAAAMBEQHwCZgAAAADASsB8AmeAAAAAwE8ApQAAAR2AAMBlQK3AvgGqAADATwCrwAAAcQAAwE8AqcAAAHKAAMBPAK4AAALngADATwClArEBEQAAwE8AqEKugGsAAMBPAK4CrALgAADATgB8ApcAAAAAwEJA34BbgRUAAMBCQLEAWQAAAADAUQDHAsIAAAAAwFVArgAHgtOAAMBVQHwABQAAAADAVUCuAAKAEwAAAAlgAAAAwE3AosAQgEsAAMBNwKvADgBMgADATcCpwAuATgAAwE3ArgAJAsMAAMBNwHwABoAAAADATcCuAAQAAoAAAA4gAAAAAAkgAAAAwE2AxwJuAAAAAMBMwKvCe4A6gADAVEC8wAKAlwAAAAJgAAAAwEzAqQJ1AoOAAMBMwHwCcoAAAADASgDHAt6AAAAAQEFAfAAAwFGAosKagCcAAMBRgKvCmAAogADAUYCpwpWAKgAAwFGAqEKTACeAAMBRgK4CkIKcgADAUYB8Ao4AAAAAwFJAxwJzgAAAAMBWgKvCjQAZgADAVoCoQoqAGwAAwFaArgKIApAAAMBWgHwChYAAAADATAB8AjEAAAAAQE7AfAAAwE2ApQJAgLMAAMBNgL7CPgE/gADATYCiwjuAAoAAAAggAAAAwE2Aq8I3gAKAAAALoAAAAMBNgKnCM4ACgAAADWAAAADATYCpAi+CSgAAwE2ArgItAnOAAMBNgHwCKoAAAADAUADOwhCAhIAAwFAA0UIOAIYAAMBQANWCC4CjgADAUACnAgkAAAAAwE9AzcHvgU0AAMBPQNKB7QESgADAT0DVgeqAmYAAwE9ApwHoAAAAAMBPAKcCJoAAAADAT4DNweMBQIAAwE+A0oHggQYAAMBPgNWB3gCNAADAT4CnAduAAAAAwE9ApwKCAAAAAMBPANnAAAACgAAADaAAAADAZUDYwBaBAoAAwEkA0UI9AF8AAMBJANWCOoB8gADASQCnAjgAAAAAwEqApwH7AAAAAMBPQKcCNwAAAADATwCnAiiAAAAAwE9A0YAAAF4AAMBlgNjAAoDugAAABeAAAADAT0DNwAABGAAAwE9A0oAAAN2AAMBPQNWAAABkgABAT0CnAADATwDRQAAAQIAAwFAA1YIgAF4AAMBQAKcCHYAAAADATICnAAKAAAAAAAhgAAAAwHYA1YHBAFUAAMB2AKcBvoAAAADATwDOwAAALAAAwE7ApwIDgAAAAMBQwM7B+QAnAADAUMDSwfaByAAAwFDApwH0AAAAAMBNQKcB9YAAAADARkCnAC8AAAAAwFRAx4HUgMOAAMBUQM7B0gAYAADAVEDNwc+A6AAAwFRA0oHNAK2AAMBUQNFByoAUgADAVEDVgcgAMgAAwFRApwHFgAAAAMBSANFABQANAADAUgCnAAKAAAAAAACgAAAAwFRAzsHcgAKAAAAMoAAAAMBUQNFB2IACgAAADCAAAADAVEDVgdSAHoAAwFRApwHSAAAAAMBPAKcB24AAAADAToCnAd0AAAAAwE8A0YAAAAKAAAAGYAAAAMBPANDAAAACgAAACmAAAADATwDHgAAAkYAAwE8AzcAAALiAAMBPANKAAAB+AADATwDSwAABhIAAwE8A1YAAAAKAAAAKoAAAAIADgABABMAAAAWACQAEwAmACYAIgAoADYAIwA4AEgAMgBKAFEAQwBTAIEASwCFAJMAegCVAJ0AiQCfAKcAkgCpAMIAmwDEAOAAtQFcAWEA0gFjAWcA2AAWAAAArgAAAKgAAACuAAAAqAAAAJ4AAACUAAAAjgAAAH4AAAB0AAAAZAAAAK4AAACoAAAArgAAAKgAAACuAAAAqAAAAK4AAACoAAAArgAAAKgAAABaAAAAqAADATwB8AWQAAAAAwEQApwACgAAAAAAC4AAAAMBEAHwABQAAAADAQgCnAAKAAAAAAAMgAAAAQEKAfAAAwFwApwFhgAAAAMBbwHwBuwAAAABATwCnAABATwB8AACAAMBQAFDAAABRQFKAAQBTAFXAAoABAAAAAEACAABAZABJAABAXYADABJAQ4BDgEOAQ4BDgEOAQ4BDgEOAP4A/gD+AP4A/gD+AP4A/gDuAO4A7gDuAO4A7gDuAN4A3gDeAN4A3gDeAN4A3gDOAM4AzgDOAM4AzgDOAM4AzgC+AL4AvgC+AL4AvgC+AL4ArgCuAK4ArgCuAK4ArgCuAKQApACkAKQApACkAKQApACUAJQAlACUAJQAlACUAJQAAwH/AAoACgAAAAAAMYAAAAMCKwAKBHgAAAADAhEACgAKAAAAAAA3gAAAAwHaAAoACgAAAAAALYAAAAMCAwAKAAoAAAAAADOAAAADAkoACgAKAAAAAAAAgAAAAwHpAAoACgAAAAAAK4AAAAMCGQAKAAoAAAAAACeAAAADAlUACgQuAAAAAgANAAEABwAAAAkACgAHABYAHQAJACYAJgARACgALQASAD4ARQAYAHAAdgAgAHgAeQAnAIUAjAApAJUAnAAxAK8AtgA5AMgAzgBBANAA0ABIAAIAAAAKAAAACgADAX0ACgAKAAAAAAA0gAAAAQACAVoBWwAEAAAAAQAIAAEFHgRUAAEE9AAMAL0EQgRCBEIEQgRCBEIEQgRCBEIEMgQiBBIEEgQSBBIEAgQCA/ID8gPyA/ID8gPyA/ID8gPiA9ID0gO8A9IDsgRCBEIEQgRCBEIEQgRCA6IDogOSA4IDcgNyA3IDYgRCA1gDWANYA0gDWANCA0IDQgNCA0IDQgNCA0ID8gM4AygDGAMYAxgEQgRCBEIDCARCBEIDCAL+AvQC9AL0AvQC9ALqA0IDQgNCA0IDQgLqAuoC6gLqAuAC4ALgAuAC4ALgAuAC4ALgAtoCygK6AroCugK6ArACpgKmAqYCpgKmAqYCpgKmApwCkgKSApICkgKIAngCeAJ4AngCeAJ4AngCeAJuAm4CbgJeAlQCRAJEAkQCNAIqAiACIAIgAhACIARCBEIEQgRCBEIEQgRCBEICAAHwAeYB3AHSAdIB0gHIAcgByAG+AbQBtAGqAaABoAGgAaABoAGgAaABoAL+A7IDsgOyA7IDsgNCAZYBlgGWAZYBlgGMAYwBjAGMAXwAAwFC/04DgAAKAAAAB4AAAAMBNwAAApAAAAADATkAAAJWAAAAAwEvAAACjAAAAAMBRv8VARoCHAADAU8AAAH4AAAAAwE8/xUBZAIIAAMBRQAAAPwAAAADAL0AAAHKAAAAAwFMAAAB0AAAAAMBOgAAAYYAAAADAREAAAAKAAAAAAAvgAAAAwErAAAACgAAAAAAI4AAAAMBLf8VAAoBtgAAAB+AAAADATYAAAHsAAAAAwE9AAABQgAAAAMBaf8VAAoBkgAAACiAAAADAXIAAAAKAAAAAAAigAAAAwFA/xUBuAFyAAMBSQAAAAoAAAAAAA6AAAADAVX/BQEuAAAAAwE8AAAACgAAAAAAAYAAAAMBNgAAAIoAAAADATv/BQCQAAAAAwEoAAACcAAAAAMBOQAAAWYAAAADAUkAAAD8AAAAAwFYAAAACgAAAAAADYAAAAMBMAAAAAoAAAAAABqAAAABATsAAAADATYAAABCAAAAAwE8AAAAggAAAAMBPgAAAhgAAAADAT0AAAIOAAAAAwEz/xUACgC+AAAAGIAAAAMBNwAAAAoAAAAAABWAAAADASoAAAAKAAAAAAAmgAAAAwE9AAAA9AAAAAEBPQAAAAMBI/8VAAoAfgAAAB2AAAADASwAAADEAAAAAwFL/xUACgBkAAAAEIAAAAMBVAAAAAoAAAAAAAiAAAADASn/FQAKAEQAAAAcgAAAAwEyAAAACgAAAAAAE4AAAAMBQgAAAAoAAAAAAAaAAAADATsAAABKAAAAAwE6/xUAEAAKAAAABIAAAAAACoAAAAMBQwAAAAoAAAAAAAWAAAADATUAAAAKAAAAAAASgAAAAwE8AAAACgAAAAAAEYAAAAMBPgAAAAoAAAAAABaAAAADAU4AAAAKAAAAAAAUgAAAAwE8AAAACgAAAAAAG4AAAAMBOgAAAAoAAAAAACyAAAABATwAAAACABoAAQAHAAAACQAPAAcAEQATAA4AFgAdABEAHwAkABkAJgAmAB8AKAAtACAALwA2ACYAOABIAC4ASgBPAD8AUQBRAEUAUwBUAEYAVgBWAEgAYAB2AEkAeAB+AGAAgACBAGcAhQCMAGkAjgCTAHEAlQCcAHcAnwCnAH8AqQDAAIgAwgDCAKAAxADFAKEAxwDOAKMA0ADgAKsBaAFoALwAAgAAABoAAAAKAAMBQgAAAAoAAAAAAAOAAAADAUgAAAAKAAAAAAAPgAAAAQACAVgBWQABAAAAAQABAAADDgF8AAAAAAMQAAAAAAARABgAHwAmAC0ANAA7AGAAjACTAKsA1gD6AQEBCQFOAVUBdAF8AaQBzAHbAeIB6gHyAfoCAQIIAhACNgJEAnACeAJ/AoYClQKtArwC4ALnAu4C9QL7AwIDCQMwA0oDUQNiA2kDdAN7A4IDiQOdA7IDxAPLA9ID2QPgBAUEDAQTBBoEIQQoBFsEYgSSBK0EywT5BRgFHwUnBV4FZQVsBcUFzAYABgwGEwZCBkkGYgZpBnAGdwZ+BoUGjAa9BvIG/gcUBxsHIwcrBzIHRgdWB10HZQdtB3QHhgeNB5UHnAfKB9EH2AffB+YH7Qf0CDUIPAhDCI0ItAjZCOAI5wktCTQJXQmPCcAJ/AolCiwKMwo6CkEKSApPClYKkwquCuQK6wsxCzgLUwt3C34LjAuTC5oLoQuoC68LtgvnDBsMIgw4DD8MUAxXDGwMcwx7DIIMnwzHDOIM6QzwDPcM/g0oDS4NNA06DUENSA2ADYYNyQ3vDhUORg5eDmUObA6dDqQOqw79DwQPOg9TD1sPlA+bD7UPvA/DD8oP0Q/YD94QCxASEB4QMhA5EEAQRxBOEGIQexCBEIcQjRCUEKMQqRCvELUQ4hEBEQ4RQBFjEX0RfRF9EX0RkRGoEa8RtxHgEfgSEBJEEngSfxKGEo0SjRKiEskS0RLZEuIS6xL0EvwTEBMkE08TehOGE5ITmBO/E+sUFRQvFEcUUxRfFGgUcRSAFIsUtRTeFTAVcxWFFdEWEhZRFm0WixaTFp0WrBbBFuoXFxdSF5MXyBgNGCsYMhg6GEkYUhhlGIYYkhisGLoYyBjZGOoY/BkzGT4ZXRloGaIZ0RndGe8Z/Ro0GmkatxrGGtga3xruGv0bDxsiGzUbSBtbG3obgRuTG6YbrRu+G8Ub2hvhG/scHBw/HEYcTxxWHG0clRyyHM8c1RzbHOEc5xztHPMc/B0CHQgdDh0UHRodIB0mHVQdaB2JHb8d0h38Hi0eOh59Hqke3h7mHxAfMB9wH34fnB/MQACAAQAIABgAAAAL/MM8BKC/OVlMrfz8g4QGysoAIyOOjoMAgAEACAAFAAAAgAAEg4WAAQAIAAUAAACFgAD5g4ABAAgABQAAAIWAAPeDgAEACAAFAAAAhYAACoOAAQAIAAUAAACAAPyDhYABAAgABQAAAIWAACGDgAEACABBAAAAH/zDPAQMBvn5+fPx9v8EBAnq4r2hnZ2doqG/OVlMrfz8g4MbBxAUFBsgICAhIvj7+Pj4BQ8KBwP/ysoAIyOOjoOAAQAIAE4AAAAk/L/I1tbW4fT/Ch0qKio3QASgvzlZTK38/AD99/f3/QADCQkJA4OADu729/UBFB4eHhQB9ff374ESysoAIyOOjv399/Tx6+vr8fT3/YMAgAEACAAFAAAAhYAA9YOAAQAIABkAAAwLAAECAgICAgIBAQEDgArRC0zdTAgCN1NIAoEJrijXUgDU1AAZogCAAQAIAE0AAAAlzs76AxkpKSknKC4gHiUlJQ3x7jH54Me+vr7X+zEx9tXExMTgCDGDgwwJC/75/wcGCxQVDvj1gRJWVlY/IBL90dHRJycnBO7Wqqqqg4ABAAgAPwAAAB4FAP3+/v78+wAKAwOvtd0FHEtqampMIAroxbi0AwQGg4EE+Pb+BASCE/X118+pqam53/4aQldXV0EqKAsOhIABAAgABQAAAIAABoOFgAEACAAEAAABAAEAAgD2AIABAAgAgQAAAD4D/fz8/vD3+/D29vbz+f8ICQL5+fz6+/7+/vz7AAoDA6+13QUcS2pqakwgCujFuLQDBQ0SEQ0NFBIgMDAwGgSDGvX17ukECgkJCff8+/j4+Pv59fr8AQL8+P4EBIIg9fXXz6mpqbnf/hpCV1dXQSooCxAFAf///v7+AwL35+n1g4ABAAgABQAAAIAAAoOFgAEACAA1AAAAGfHxEQsFBQYGBgUFCxFUFQDWtJ+fn7TWABVUg4MGAgQB/vn6/IEMWlpaUTwZ/uPCsKioqIOAAQAIAAQAAAEAAQDrAPYAgAEACABHAAAAIfHx+/vx8RELBQUGBgYFBQsRVBUA1rSfn5+01gAVVFTq6lSDgAPLyyYmggYCBAH++fr8gRBaWlpRPBn+48KwqKioJibLy4OAAQAIAEcAAAAh8fH7+/HxEQsFBQYGBgUFCxFUFQDWtJ+fn7TWABVUVOrqVIOAA8vLJiaCBgIEAf75+vyBEFpaWlE8Gf7jwrCoqKgmJsvLg4ABAAgADgAABgUBAgICAgIFzxxB2UEcgASaMs1mAIABAAgABQAAAIAA/IOFgAEACAAEAAABAAEA+AD2AIABAAgABAAAAQABAPgA9wCAAQAIAAQAAAEAAQD4AAoAgAEACAAFAAAAgAD4g4WAAQAIAAUAAACAAPSDhYABAAgABAAAAQABAPgAIQCAAQAIAEMAAAAgz88cHEFB2dlBQRwcJB4RERELCQ4XHBwhAvrVubW1tbm4g4IcmpoyMs3NZmYABxAUFBsgICAhIvj7+Pj4BQ8KBwOEgAEACAAMAAAFBAECAgICBNQcRhxGgAOaD6kAAIABAAgATwAAACbq8fn7+/v+Af/+AwCuu+oFHkliYmJJIg4H5sKqqqr9/QMDzcTL3euDgQT5+QIEA4IWAwTnxampqcDoAhY+V1dXUDoR8OrqOTmBAuby/YSAAQAIAAQAAAEAAQDxAPkAgAEACAAFAAAAgADyg4WAAQAIAAUAAACAAPGDhYABAAgADgAABgUBAgICAgIF8mScDpxkgAAxgQHLAIABAAgAGgAADAsBAgICAgICAgICAgIL8vzyZJwOBA6cZJxkC+0fAB8AH+0AywAx7YABAAgADgAABgUBAgICAgIF3sfeIjkiBVKuAK5SAIABAAgAPgAAAB0VHSUNU1hEIxQL7dTU1CgoKCn7+93d+/sTEzExExODgQrpyvAVO0hISEAjBIEBGhiBA1JSrq6BA66uUlKEAIABAAgABQAAAIAABIOFgAEACAAFAAAAhYAA94OAAQAIAAUAAACFgAAKg4ABAAgAAgAAAIWFAIABAAgABQAAAIAA/IOFgAEACAAFAAAAhYAAIYOAAQAIAEUAAAAg3t7Hx97eIiI5OSIiKiQXFxcRDxQdIiInCADbv7u7u7++g4ADUlKuroEYrq5SUgAHEBQUGyAgICEi+Pv4+PgFDwoHA4SAAQAIACoAAAAT/fDn2cctOyoI/wT449LS0kRERC+DgQwD+OgYOVJWVlZaXVhQgQFRM4QAgAEACAAFAAAAgAAPg4WAAQAIABkAAAAL19c6Or0tPRGb+jo6g4IAeYEA+oEBp+iEgAEACAAFAAAAgAAFg4WAAQAIAAgAAAMCAQICAtJEAoABZgAAgAEACAAFAAAAgAAQg4WAAQAIAAUAAACAAECDhYABAAgABQAAAIAA+YOFgAEACAAfAAAADdLS///S0kREEBBERAICg4AD2/U+JIEFak4FIWZmhIABAAgAIQAAAA/w8FoBAa4QEMzMzBzfMjIyg4JBAIkAiYMBlpaBAZaWhIABAAgAGwAAAAve3j3MzMwiIsI0NDSDgkEAmgCag0H/Zv9mhIABAAgABQAAAIAABIOFgAEACAAFAAAAhYAA9oOAAQAIAAUAAACAAAaDhYABAAgABQAAAIWAAPWDgAEACABAAAAAgQT++/v7/oIEAgUFBQKBDua2mZmZtuYAG0pnZ2dKG4OBBPr6AAcGghUGBwD6+gBXV0EaAOW/qampv+UAGkFXgwCAAQAIAAUAAACAAASDhYABAAgABQAAAIWAAPeDgAEACAAFAAAAhYAACoOAAQAIAAUAAACAAPyDhYABAAgABQAAAIAABIOFgAEACABcAAAAgAkMGh0yEP77+/v+gQr05OLM7gICBQUFAoES5raZmZmrvFAxQ6/NABtKZ2dnVIOBCPDi9gr6+AAHBoIeER8K9QcHBQD6+gBXV0EaAN+smjJXZ8+pqam/5QAiV4MAgAEACAAFAAAAhYAA9YOAAQAIAFYAAAApBwYB/f39AQUG4dzcDw8eHt/fHh4ODtzc3/QVA+nc3NzpAxUmQE1NTUAmg4EE+/sABQWCADyBB66uKCjX11JSgRLF4QBISC4MAfTRuLi40fQBDi9IgwCAAQAIAC0AAAAVy8sSEBwrKyscEBIuLi4T68TExOsTLoODEfzu4dPGwsLCABgYGAPhwKqqqoOAAQAIADIAAAAXy8suLhIPHCsrKxwPEi4uLhPsxMTE7BMug4IUISEhHQ8C9Ofj4+MAOTk5JQLhy8vLgwCAAQAIAFIAAACBBP77+/v+gh4CBQUFDRYAzejp9gDHpOcauquZmZm25gAbSmdnZ0obg4EE+voABwaCHgYHAAkbIDX94/AAV1cl5ht1YCYA5b+pqam/5QAaQVeDAIABAAgANQAAABm9vfz7CBUVFTNPKbvtICAg/ufCrKyswuf+IIODBf706vLv4oEN0tIAKCgoHADq07aqqqqDgAEACAAFAAAAgAAJg4WAAQAIAAQAAAEAAQAFAPYAgAEACABlAAAAMQfx5ePeQz0pEgnqwa6urrfYA+/g3t7e7wQLEB8qK8nQ5Pn9ETdPT08pG/wFFR8fHxgNg4EVChQTNkZVWFhYRCEI+d/TxcbS4OTw/IIV+uvdurOsqKiotdTtBhwiLjAsJiEXCYSAAQAIAAUAAACAAASDhYABAAgABQAAAIWAAPaDgAEACACoAAAAP/749/f56/L26/Hx8e70+gME/fT09+ni495DPSkSCerBrq6ut9gD7+De3t7vBAsQHyorydDk+f0RN09PTykb/AURFR8fHxoSDQwICA8NGysrKxX/gyv19e7pBAoJCQn3/Pv4+Pj7+fX6/AEDDBQTNkZVWFhYRCEI+d/TxcbS4OTw/IIi+uvdurOsqKiotdTtBhwiLjAsJiEZCwIA///+/v4DAvfn6fWDAIABAAgABQAAAIAAAYOFgAEACABfAAAALgIA+vXxPTod+t2xsbHD3+zv8/XZtNEJJCo7SUlJ19fXytj//AYMDEI6JRYWFg8Gg4EZBAkMKDpSUlIzGwjv5eXl5eYWwLiurq6uv9uBAgHw84IJCguxGgkACxgWCYSAAQAIAAoAAAQDAQICAgPH8g45A5oAmgCAAQAIAAUAAACFgAD2g4ABAAgAVQAAACjHx/LyDg45OQwMCAgPDRsrKysV//749/f56/L26/Hx8e70+gME/fT094OAAZqagQGamoEe///+/v4DAvfn6fX19e7pBAoJCQn3/Pv4+Pj7+fX6/ISAAQAIAAUAAACAAAGDhYABAAgAKAAAABIC6t7e3lBQUCMD7sewsLAiIiIXg4EBBxaBBwM0WlpaSSMDgQEWB4QAgAEACAAFAAAAgAAEg4WAAQAIAAUAAACFgAD3g4ABAAgABQAAAIWAAAqDgAEACAAFAAAAgAD8g4WAAQAIAAUAAACAAASDhYABAAgABQAAAIWAACGDgAEACABYAAAAKQzny8fHx8K+q6e2zN7e3lBQUCMD7sewsLAiIiIhHyYiIiIbGh8pLi4zFIMN+PgEEA0KAPr/FCg0LBmBBwM0WlpaSSMDgQ8WDwkHCxQWGiAgICIi+fv4gwCAAQAIAGEAAAAu/PPi2NjY4vP8BhspKSkbBv/89vb2/P8CCAgIAgLq3t7eUFBQIwPux7CwsCIiIheDG+fn8gURHS84ODgvHREF8ucYGBQRDwoKCg8RFBiBAQcWgQcDNFpaWkkjA4EBFgeEgAEACAAPAAAAB8TuWQUFsBI9g4IBaWmGgAEACAAjAAAAD+X6QwsL1Sf09LsFG8///zGDgkEAhwCHgUEAhwCHgwGenoSAAQAIAAUAAACAAAKDhYABAAgABAAAAQABAP4A9wCAAQAIAAQAAAEAAQD+AAoAgAEACAAFAAAAgAD6g4WAAQAIAB8AAAAK7s3sWgEBqRU0E6aBAFuDgAD+gQFhYYEA/oEBnp6EgAEACAAXAAAAA83N4laBA60eMDCDgAD6gQFgYIEA+oSAAQAIAAUAAACAAAKDhYABAAgABAAAAQABAP4A9wCAAQAIAAQAAAEAAQD+AAoAgAEACAAFAAAAgAD6g4WAAQAIABQAAAYFAQECAgECAPpA/28B+glBAJgACQVEnAC8ZACAAQAIAAUAAACAAAGDhYABAAgABAAAAQABAP0A9gCAAQAIAAUAAACAAP2DhYABAAgAUwAAACfa3+Dg4N7MzMzd/BcsLd3i8gYSMjIyMjEyx8m9vBQD4szMzBJRUVE0g4EVCgwMCwYK8cfHx9nmCf4FBQUI/vcI/IEN6uMAPDwxGgnV2vgXKDyDgAEACAAFAAAAgAAGg4WAAQAIAAUAAACAAAaDhYABAAgABQAAAIAABoOFgAEACAAFAAAAgAAGg4WAAQAIAAUAAACAAAeDhYABAAgABQAAAIAABYOFgAEACAB5AAAAOhDrz8vLy9THyb282t/g4ODezMzM3fwXLC3d4vIGEjIyMjIxMiYmJiYmISUvMjI3GBQD4szMzBJRUVE0gwn4+AUPCg0HAOrjgi0KDAwLBgrxx8fH2eYJ/gUFBQj+9wj8AAMLExggICAiIvj7+Dw8MRoJ1dr4Fyg8g4ABAAgABQAAAIAABoOFgAEACAAFAAAAgAAGg4WAAQAIAIsAAAA/CAgGBgYNA+3t7fsTJDEzBgQLGhELEQ4C/Pr8/wMDJCcZA+/s49vRBPnh7/f7+foAHhL87e3tEzlGRkYzI76+wwPZ8QAgg4EmDBIYGA8LCvHBwcHc5Qv/BQUFHi8cBQUFBgHv29v+Jzo/Pz83KRX+ghfr3fIAQUE2HAfb3vINGypBCwsG4sHBwd6DgAEACABFAAAAISM4R0hIQ9jYR0dGRDYjIBkVFRUZIPPJoqKiyfMcPz8/Lw6DgQL16+2DGBkXDQUFBQQFBgcEAE9PKgbit7e36gMRNE+DgAEACABAAAAAHv3q4OHh4e339QEjJ9DZ9gUbPlJSUj8fCPTUzh8XBfqDgRv/AwkQDAUFBQHszcS3t7fM7wYZOk5OTjstEAH8hACAAQAIAAUAAACAAAWDhYABAAgABQAAAIAABYOFgAEACACCAAAAPvv19PT26O/z6O7u7uvx9wAB+vHx9Obf4eHh7ff1ASMn0Nn2BRs+UlJSPx8I9NTOHxkMBQoJBQUMChgoKCgS/IMT9fXu6QQKCQkJ9/z7+Pj4+/n1+vyBKAEECRAMBQUFAezNxLe3t8zvBhk6Tk5OOy0QA/4CAf///v7+AwL35+n1gwCAAQAIAAUAAACAAAWDhYABAAgASQAAACLd4ebr6+vn4d2/ubm5KCgoKyi8wLe/DvLRwcHB5Q43Xl5eN4OBCQQIBgUEBQUFFxiBAgz27oEP6+oAT080EQPst7e34gYqT4OAAQAIAFsAAAAry8/V2dnZ0suxp6amEBAQEg6nsKuy99Gurq7R9x5GRkYe9vn6DhAeISEhGx2DgQgECAYFBQUFHyiBAgz27oEZ4uYAT08YA+y3t7fiBipP7vP7/v7+7ujVz+6DgAEACABZAAAAKt3h5uvr6+fh3b+5ubna2rm5KCgeHigoKCsovMC3vw7y0cHBweUON15eXjeDgQ0ECAYFBAUFBRcY7+8XF4EGFxfv7wz27oEP6+oAT080EQPst7e34gYqT4OAAQAIAG8AAAA1//Ts7fDw8O3r7fPgt5+kqbS4uKKbnsz19e7f3e4E+PkfHx8XCwEL+9Gzs7PS/AwbRGNjY0Mag4EzAgL/+vLu8fX19QkxTQra0c7l3dS4vhQOGh8xGhAfDv349/wASUk7Gv3eu6ysrLrc+xg7SYOAAQAIAEkAAAAiCgb05OTk8QEFCRQgJyVNU0QqDgbx3dgjF/5KyMXO6woZNkmDgSD5+gcGBQUFBQYA7tnZ/y1FTk5OPDEUAwAMDAXevLy8yu2DgAEACAAFAAAAgAAHg4WAAQAIAAUAAACAAAeDhYABAAgABQAAAIAAB4OFgAEACAAFAAAAgAAHg4WAAQAIAAUAAACAAAeDhYABAAgABQAAAIAACIOFgAEACAAFAAAAgAAGg4WAAQAIAHAAAAA1At3Bvb29tsHW5OTk8QEFCRQgJyVNU0QqDgbx3dgjIBsaIBgYGBEQFR8kJCkKSsjFzusKGTZJgzX4+AQQDQX8EBoRBwYFBQUFBgDu2dn/LUVOTk48MRQODAsOFhYaICAgIiL5+/gMDAXevLy8yu2DAIABAAgALQAAABTIyObmyMjI4QwlNjZJPjc3Nx4eNzeDgAGwsIEK3uv6AgICsbGxvM2BAbCwhIABAAgAYgAAAC4ECAj87Tc7GgXszb6+vra81uTp5ubm6eHQvLq+xCwsLCIQDfPTxcXF5w01WVlZNYMb7e3p6OsXKDc3NyoVCf//EBAQDwoGDw0FBQUWF4EQLg3y7V9fQhsL9Le3t+0QMl+DAIABAAgABQAAAIAADoOFgAEACACCAAAAPvbZxMTE0PIVLRsTFxcXMDkECAj87Tc7GgXszb6+vra81uTp5ubm6eHQvLq+xCwsLCIQDfPTxcXF5w01WVlZNYMr9/oIDg0QFBP9/v4BCgcKEO3t6ejrFyg3NzcqFQn//xAQEA8KBg8NBQUFFheBEC4N8u1fX0IbC/S3t7ftEDJfgwCAAQAIAAUAAACAAA6DhYABAAgALQAAABXa2klJSEU/NzUvKysrvLy81voUSUlJg4IIDQwIBQUFCAP1gQbj2be3t9PrhIABAAgAPwAAAB3a2uTk2tpJSSgoSUlIRT83NS8rKyu8vLzW+hRJSUmDgAPv7xcXgQwXF+/vDQwIBQUFCAP1gQbj2be3t9PrhIABAAgABQAAAIAAF4OFgAEACAAMAAAFBAECAgICBPDe8U07BFCwAFAAAIABAAgABQAAAIAAF4OFgAEACAAFAAAAgAAXg4WAAQAIAAUAAACAABeDhYABAAgABQAAAIAAF4OFgAEACAAFAAAAgAAYg4WAAQAIAAUAAACAABaDhYABAAgAWAAAACnw8N7e8fFNTTs7Ly8vLy8qLjg7O0AhGfTY1NTU184XAujo6AIXK0ZGRiuDgANQULCwgSJQUAADCxMYICAgIiL4+/j4+AUPCgsGAOnpAxgsR0dHLBgD6YMAgAEACABeAAAALQcH4tTKysrKwcE5OTkgBQGvr6amHh7o07m5udPo/BcXF/wD7tTU1O4DFzIyMheDgAdRUVFHLBSwsIECAv/+ggGwsIIX6ekDGCxHR0csGAPp6ekDGCxHR0csGAPpgwCAAQAIAAUAAACAABiDhYABAAgAIgAAAA/g4Pfp39/f3/HxTk5ONRoWg4AHUVFRRywUsLCBAgL//oUAgAEACAAFAAAAgAAYg4WAAQAIABkAAAALrq4dHdNRWD/BDh0dg4IAOoEA+YEBrbeEgAEACAAFAAAAgAD/g4WAAQAIACAAAAAOEfnYyMjIyMg3Nzc+Rzg4g4EEBBkysLCBBGBTUVFRhACAAQAIAAUAAACAABWDhYABAAgABAAAAQABADIA/gCAAQAIAAUAAACAABWDhYABAAgAMAAAABYR+djIyMjR0cjIyMg3N1dXNzc3Pkc4OIOBCAQZMufzPjKwsIEIZ20iHGBTUVFRhACAAQAIAEcAAAAi4+MnKzAxKCEbHSMiGhccHBzNzc3d9QgnJyfY2Njn/hEyMjKDggwKDAUFBQ0REQUFBQUBgQbh07e3t8/mgQbg0be3t8/mhIABAAgALQAAABXY2ENJSEY+NTMtKSkpurq61PgSR0dHg4IIEA4JBQUFCAL1gQbk2re3t9PrhIABAAgABQAAAIAAAYOFgAEACAAFAAAAgAABg4WAAQAIAAUAAACAAAiDhYABAAgABQAAAIAAAYOFgAEACABLAAAAgCL37urr6+vq7vcACREVFRUVFREJAO3CpKSkwewAFT9cXFw+FIOBIQIEBQQDAwQFBQUEAwMEBQQCAE5OQB8E6ce3t7fH6QQfQE6DgAEACAACAAAAhYUAgAEACAACAAAAhYUAgAEACAACAAAAhYUAgAEACAAFAAAAgAABg4WAAQAIAAUAAACAAASDhYABAAgAZwAAAIAwBBEUFPTy7+vr6+ru9wD88e7qChATFRUVFREJAO3CpKSktcVNPhU8tcTsABU/XFxcS4OBL/To4/v9/gEEAwMEBQUFER0dBQgIBQQFBAIATk5AHwTnvK0tPk5X1sa3t7fH6QQgSYOAAQAIAAIAAACFhQCAAQAIAHwAAAAX5/T9+voNEgsKDg4OCgoPB/v9/vbx8fb7gSIaHwnu6d/YzgH13RYK8N7e3vAKFiI7TExMOiEYu7vA0eXxE4OBAt7H5oI0AwUEAwQFBQUeOyMFBQUGAO/b2wk0Pz8/NScT/gBJSTwdBOrLvLy8y+oEHTxJCwsG4sHBwd6DAIABAAgAQwAAACDY2EJFRUM2IyAZFRUVGSAjOEdIR0fzyaKiosnzHD8/PxyDggoWFg0FBQUCAAECAYIP9/DyAE9PJAHdt7e38AUcT4OAAQAIAEMAAAAg2NhHR0ZENiMgGRUVFRkgIzhHSEdH88mioqLJ8xw/Pz8cg4IKGRYNBQUFAf4AAQGCD/fv8ABPTyQA3La2tu0FG0+DgAEACABZAAAAGNTKr5ubm6CpxtLi6+vr4tTLq52boAoKCvyBAPyCDOf/z6Ojo9D/L15eXi+DgQQGGzLv8IIJAQIBAAIFBQUWGIEVY2pgYGBeXAQGAE9PGwPrt7e34gMlT4OAAQAIACcAAAASzc0oMj43KjA0PT06JhkaKzw8PIOCDiIcCQkJCAaipqqqqrPH2oSAAQAIAAUAAACAAA+DhYABAAgABQAAAIAAD4OFgAEACABYAAAAKv3r3NfUKSQS/tnExMTw/PHm2NjY6v8GCiUv2Nv5BhVAQEAeEiIzLCwsHgiDgScEBQIhMkVFRSQR7drV1NPm6PYBBQUFBfPUy8HBwdbuAxgcHBwWGAwChACAAQAIAAUAAACAAAiDhYABAAgABQAAAIAACIOFgAEACACaAAAAP/v19PT26O/z6O7u7uvx9wAB+vHx9OHY1CkkEv7ZxMTE8Pzx5tjY2Or/BgolL9jb+QYVQEBAHhIiMywsLCITCgkJBQUMChgoKCgS/IM/9fXu6QQKCQkJ9/z7+Pj4+/n1+vwAAQYCITJFRUUkEe3a1dTT5uj2AQUFBQXz1MvBwcHW7gMYHBwcFhgOBAIB/wn//v7+AwL35+n1gwCAAQAIAAUAAACAAP6DhYABAAgAYwAAAA8rIg4F6e4ACujDtbW1y+4BgR3oycnJ8gMFIz8/P9DQ0OH3/QEQHBwcK1ZBJycnJymDGwEBBAVjX1lZWUIeB/fXv7+/Dw3o3My3t7e+1/GBAvYPEIILAfXg5Ovx8fcD//4Bg4ABAAgAKAAAABQO9tjKysrW1srKOTkqKjk5OUFEKiqDgQQEDxuwsIUGsLBDTFFRUYQAgAEACAAEAAABAAEAVgAMAIABAAgAaAAAACfy7Ovr7d/m6t/l5eXi6O73+PHo6OvbysrK1tbKyjk5Kio5OTlBRCoqgQn8/AMBDx8fHwnzgxn19e7pBAoJCQn3/Pv4+Pj7+fX6/AIEEBuwsIUGsLBDTFFRUYEK///+/v4DAvfn6fWDAIABAAgABQAAAIAA9YOFgAEACAAqAAAAFNPN09PTQkJCMBcK8729vSwsxLu2x4OBAQcggQc4QUtOTk4mEYMB9vKEAIABAAgABQAAAIAAAYOFgAEACAAFAAAAgAABg4WAAQAIAAUAAACAAAGDhYABAAgABQAAAIAAAoOFgAEACAAFAAAAgAAFg4WAAQAIAAIAAACFhQCAAQAIAFEAAAAn083T09NCQkIwFwrzvb29LCwgICAgIBsfKSwsMRIK5cnFxcXPwru2x4OBAQcggQc4QUtOTk4mEYIVAwsTGCAgICIi+Pv4+PgFDwoPCQD28oSAAQAIAAUAAACAAAGDhYABAAgADwAAAAe361r//6cVSIOCAV9fhoABAAgAHwAAAA/N6jgQENkq7+/JFjLK//81g4IBSUmBAUdHgwGjo4SAAQAIAAUAAACAAAKDhYABAAgABQAAAIAAAoOFgAEACAAFAAAAgAACg4WAAQAIAAUAAACAAAODhYABAAgAHwAAAA3azeNXAwOpHDMlswEBToOAAAeBAWJigQAIgQGuroSAAQAIACgAAAAS5+fi7fTs0Otg//+eFVlQQC0R/oOABUhISEEz+YEBfHyBA00zFAWFAIABAAgAAgAAAIWFAIABAAgAAgAAAIWFAIABAAgAAgAAAIWFAIABAAgABQAAAIAAAYOFgAEACAAOAAAGBQEBAgIBAgXcheQfeCUFUq4ArlIAgAEACAACAAAAhYUAgAEACAACAAAAhYUAgAEACAACAAAAhYUAgAEACABQAAAAJvnv5+fn3uHh3eoBESUp8PYGECIlJSUlIBzp7PT/FPfk5OQKKysrIIOBDQ0KDw8SDfHZ2dnq9A0OggQDCCQtEoEM9f8AKioD7/D4AhUkKoMAgAEACAA1AAAAGwL57ejo6O35AgwVGBgYFQwC7tXV1e4CFisrKxaDhAECAYIBAQKDCzAwEwDu0dHR7gATMIOAAQAIABEAAAAH/MM8BGuN/PyDgwNZWY6Og4ABAAgAWgAAACsEBNbW3+zy8vL0+P0AAwgMDg4OFCEqKvz8z8/Hv7y8vM/uABIxREREQTkxMYOACUlJGhsUBwIB//+CCf//AQIHFBsaSUmBEFVKMhcK8Mq0tLTK8AoXMkpVhACAAQAIAD0AAAAesbEgICAQ+fDcra2tHR0dJi03N+XizMG+wtv2CCQgIIOCBzhBS05OTiYRgQRmWVZWVoID8uHd7IIB8ueEgAEACAAcAAANDAACAgIBAQEBAwEBAgIM2cQxKioqLjED/enZLIAGsgCyMj8/P4EC/vayAIABAAgAFAAACQgABAEDAQEBAQOAB8HBABEuPz8RgAc/UH5+bVA/AACAAQAIACQAAAAP3efWwMDA0e7/GT4+Pj0+HoMP6QQKLT9QbX5+flk/OTEy6YMAgAEACAAFAAAAhYAAlYOAAQAIAAQAAAEAAQD/AJUAgAEACABIAAAAIwj64+Pj+ggXLi4uF//x2tra8f8OJSUlDvfp0tLS6fcGHR0dBoOBCBYlNEtLSzQlFoIIFiU0S0tLNCUWgggWJTRLS0s0JRaEAIABAAgAJwAAABHWwcE9PSj/58bGxuf/Fzg4OBeDAVL+gQH+UoEIITlQcnJyUDkhhIABAAgAJwAAABHBwdYoPT3/58bGxuf/Fzg4OBeDgAkCrq4CAI6Or8feggPex6+Og4ABAAgAXgAAAC2urq64x8zOzMzM5/YMFQoCpLLM5vYML0FBQTo3OzAkHh4e6dGwsLDR6f8hISH/gxJPNUBPT0AuBe/Nrq6ux+HjEQ8Hggv89vLv8wYYHyAlMk+BCCE5UXFxcVE5IYQAgAEACABeAAAALQrz0b+/v8XKxdDc4uLiUlJSRzk0MjQ0NBkK9Ov1/lxNNBoXAN/f3wAXL1BQUC+DgSQECg4QDfvo4eDazrGxy8CxssDS+xEzUlJSOR4d7/H5AI+Pr8feggPex6+PgwCAAQAIAAQAAACEAMqDAIABAAgABAAAAIQAyoMAgAEACAAEAAAAhADKgwCAAQAIACEAAAANDujZ9ATn5xgY+gsnFu+EDu0I8e0YIAQEIBjt8Qfs14OAAQAIAEQAAAAfzMHv+Mq86vPGuyEs2M0zPhEINUMWDTlE3tMnMjDdzyKDgAfKyiws1NQ2NoEBNjaBBzY21NQsLMrKgQbKygAsLNTUgwCAAQAIAAcAAAAD7KAUYIOHgAEACAAHAAAAAxSg7GCDh4ABAAgABgAAAgEBAgHjHQEq1oABAAgABgAAAgEBAgH2CgEt2YABAAgABgAAAgEBAgH2CgEt2YABAAgABwAAAIcArIEArIOAAQAIAB8AAAANpK26urqtpBQbIyMjGxSDgAQHAQD/+oEE+voABgaEgAEACAAfAAAADezl3d3d5excUkZGRlJcg4AEBgYA+vqBBPr/AAEHhIABAAgATQAAACUXAt3FxcXFxsrKxsXFxcXdAhchITsyLCwsLCANDSAsLCwsMjshIYOBDREzS9LT09MtLS0utc7vggepqamppQkLCIEH+PT3W1dXV1eEgAEACABNAAAAJd/fxc7U1NTU4PPz4NTU1NTOxd/f6f0jOzs7Ozo2Njo7Ozs7I/3pg4AHV1dXV1v39PiBBwgLCaWpqampgg3vzrUuLS0t09PT0kszEYWAAQAIAAoAAAQDAQICAgPQFCMUgAKsVACAAQAIAAkAAAQDAQICAgPs3ewwAVSsgQCAAQAIAAIAAACEhACAAQAIAEQAAAAfsbiqlZWVpb/P5wkJCQgJ7RIZC/b29gYgMEhqamppak6DH+b6AB8vP1lpaWlHLykjJObn+wEgMEBaampqSDAqJCXngwCAAQAIAE4AAAAfMRn39/f39xNPSFdra2tbQNC4lpaWlpay7uf2CgoK+t+DQf99/30En7e8w8KBBezmx7enjUL/ff98/3wMnra7wsH//+vlxramjED/fIMAgAEACABLAAAAHxIZC/b29gYgMEhqamppak6xuKqVlZWlv8/nCQkJCAntg0D/fg2SmLfH1/EBAQHfx8G7vEH/fv99BZGXtsbW8IIE3sbAurtA/32DgAEACAAqAAAADwHnwsLCwsLiIxkqQEBALxKDQf9f/18LhJ6krKv09NnSsJ6MQf9w/1+DAIABAAgAJwAAAA/d59bAwMDR7v8ZPj4+PT4eg0D/awWGjK/B0u+CBNvBu7O0QP9rg4ABAAgADwAAAAvc3NxcW1ylpaUlJCWDj4ABAAgADwAAAAvb3NtbW1ukpaQkJCSDj4ABAAgACQAAAAXAwMBAP0CDiYABAAgACQAAAAXAwcBAQECDiYABAAgAFAAAAAepqxQW6uxVV4MA9IEB9PSBAPSDAIABAAgADAAAAAPJyzQ2gwD0gQD0gwCAAQAIAEoAAAAjFQfp19fb2uDfzbu7u9LSu7u73AsfJCRJOy8vLyQkLy8vNTgqg4ELAQJiZWtra2NgZa2tgQoNGiUnJyfS0tLi9IEFra31Bg4IhACAAQAIAEgAAAAi9uzd09PT3e32DBjx8SgoJCEhIigtLS0U9vHy9/v9KCgoGgODgQkKGiMtPEZGRjECgRMHERcXFhEMC/rjz9Da39zbCUEoC4QAgAEACACaAAAAP/vv7PP7+/v7/QEUGhEFBQX/+Pj48+7z+f7/+vT09Pf7/AAKDQ0NA/7w4+Dg4OXz/wISICAgEgMCBPn4+PwJ+ukK6env8/sCFicnJxODFvb2/gYF+vwECgoK/O3v/v/8+vr69vr/gjABAgIA/v7+/v7+KyQgICAI9wP/9O3t7erw/REZExMTFBT29jQ0HRfV0tLS0tz1DCA0gwCAAQAIAHwAAAA7EAkC/v7+6tXV1e7u7vkKEyItLi4uRFRK+f4HDVhLKiMKquHa9B3zvbMCIWJiYkkpJBDm5uYFECU9PT0mgx/+/gQIBvPt9/sCBv4KFhwcHAj2+QME9uo4MykfHw/0+YEZx9r+VFQpBbnH5g4rSVQkJRT339LS0uj5DR+DAIABAAgAEgAACAcBAQIEAgICAgfP1dzcHRHk/AEECIED7ADsAIABAAgAjwAAAD/57eHZKScbA+/JycnO3/Dg38zMzLGTtMjIyNPuBxMfJ9fY5f0RNzc3MiIQICA0NDRQbUw4ODgtETAGxsbG4f3QBfk6OjofA4OBGAsQNz5RUVE3IhkK++/w7P0JBf367uLX4vSCJ/bwycKvr6/J3uj1BhEQFAP3+wQGER4pHwwAPzIK7tzDscHO9xIlPk+DgAEACAB5AAAAgAIDAwKCBgIDAwD+/f6CLf79/vry9vb29/nuBg/v9f0DEiEhIRME+/PtCwTy7QD27+/v7+/2AAoREREREQqDgwz////+/v7+/v7+////hAIFAPuCIgzw4NnT09PvAAwtLS0mFgf39gAMDAT9/wD68vLy+gD//QQMg4ABAAgAdAAAAIACAwMCggYCAwMA/v3+gir+/f4A9u/v7+/v9gAKEREREREK4eH6+gQNDQ0RDA3q6wEBAfjr6enp8v4Bg4MM/////v7+/v7+/v///4IPDAwE/f8A+vLy8voA//0EDIMFCAn+Av//gQv+/gAfHx8I/e7d3d2DAIABAAgALwAAABfu7vj4CwsVFe3tMPz8ygkJ5eXlC+sTExODgAHV1YEB1dWDAUNDgwHW1oEB1taEgAEACAAiAAAQDwABAQIDAgMCAgECAQECAQGADvPf0/MNLSEA/vr6/gIGBg+jo6/S/v7Sr9jY0s7MzM7SgAEACAAHAAAAA8zMNDSDh4ABAAgACwAAAAfW1ioq1tYqKoOLgAEACAANAAAGBQECAgICAgXM0swzLjMAuIIBuAAAgAEACAAVAAAKCQECAgICAgICAgIJydTJ1Mk2LDYsNgICQMKCA8JAAgAAgAEACABJAAAAIgLz7fP7+/sBBwgCAwUFBTAwJhEC9OLaFhYKMM/P2PECESYwg4EgDBQJ9AURDwoKCggFAgItNkFBQTs1GxAAPj7f1cnJydXfg4ABAAgAUAAAACX9/ena2NjY3Oz9/SYmHyErL9nkDCYmDuPYKCEcJib9/QssRkZGGYOACP8A/gEHCQoJCIEZBQEA+OjLvrO4UFI+Kw0BBgIAUre1wuUDKFaDAIABAAgAbAAAADMO8/X5////+fXzDhAPBwD58PDyDQsHAQEBBwsN8vDw+QAHDxAA68m1tbXJ6wAVN0tLSzcVgzPxDhANBf/58O7wDQoGAQEBBgoN8O7w+f8FDRAO8fT4/f39+PRKSjYU/+rItLS0yOr/FDZKgwCAAQAIAHgAAAA5+fno4eHdQDcO+fn57uHc3Nzt/Pn5HBwgKC4uztkLHBwGDBkhISEdGhwcHOyysrLVCxz5+RhLS0sjCIOAEgEEDRQTN1BeW8nIydHb3u/6+/6BI//99ejduqugpCIoKiolIBcLBQIAWFotB/DVyMQoqKnL8AUgJYMAgAEACABgAAAALQb99fDu7P7o6erq6/3w9foAAwwMDrO31P8sYGEE8llaWQDuYF9KIwXXubMOCwmDLQEBBgHx8RgYDvnt7RQUEQb9/f32+trKoaGh2hQU7e0DGBjx8Qs+XV1dMCcGCwGDAIABAAgAgQAAAD7zydzfz7+/v8fPzMy4uru7u83r+/8hMtzf6Pv9GTIyMi8y8/NEOjU1NR0XIjxKRDsoEhomGTpAIv4B+vX7BvmDCv5UXVtLMycY79nZgRPz9vP2+/7+/v33zLqrq6utw+Hq+4ET2dn0FyM0NzQ8QUFBTFdXV15gCQiCBP/9/f0Dg4ABAAgAMwAAABfJye7uycnu7sDPXwMDqTE/FRU1NRUVNTWDgAft7RQU7e0UFIEBeHiBBxQU7e0UFO3thIABAAgABAAAAIQAwoMAgAEACAAHAAAAA/G1EEyDh4ABAAgADgAABgUBAgICAgIF1PbUKworBdQsACzUAIABAAgABgAAAgEBAgH3CQEq0oABAAgAHAAAAAsm58TkIgHfHT0a2wGDC+YjAN0cOxzdACPmwoMAgAEACAAmAAASEQECAgECAQIBAgECAQIBAgECARH2Cvfo6PcKGhoK9+jo9woaGgoRLNTT4/cHB/fj0/gKHywsHwr4gAEACAAKAAAEAwECAgID9wn3CQMy2izUgAEACAArAAAAE86v9/fttPf38M0zVgkJGlMJCRUzg4AH1NQsLNraMjKBBzIy2tosLNTUhIABAAgAEgAAAAbv76Tv7xERgwbpRAO/Gx7ngwCAAQAIABIAAAAGEe/vERFdEYMG6eceG78DRIMAgAEACAAZAAAACt/fs9/fISHf3yEhgwkrdybRHE/5AFRUhIABAAgAGQAAAAoh398hIU0h398hIYMJK/lPHNEmdwBUVISAAQAIABIAAAgHAQICAgICAgIH1evVLBUs6xUHDEwATAxbVACAAQAIAGQAAAAvTREQDxYTAu3Z08G4tPDx8uvu/xQpLkBJTREQDxYTAu3Z08G4tPDx8uvu/xQpLkBJgy/F5PsRERETFBYWFgkO79jCwsLAv729vcrc+xIoKCgqKy0tLSAlBu/Z2dnX1tTU1OGDAIABAAgACAAAAwIBAgICvfMNAtotxgCAAQAIADQAAAAXThAOCxcWBe/a1ce9tfP2+ezt/hQpLjxGgxfE4wUmJiYoKCoqKig6G/nY2NjW1tTU1NeDAIABAAgADQAAAAbg3yEgwQE/g4QAiYSAAQAIAGoAAAABGhaCCBYaGg0A8+fm6oIi6ubn8wANGh8ZDPXd9QwZHzBISEgw4dG4uLjR4ef0DCMM9OeDM/Ly+AAIDg4OISshDg4OCAD48vLy4NXg8jIyMR0A5M/Ozs7uABIyMjISAO7Ozs7P5AAdMTKDAIABAAgAVAAAACf3487Oztbd5Ojo6Ojp39TU1tfm/QkeMjIyKyMdGBgYGBchLCwqKRkDgyf+/hUgKjMzMysmJiIoLygZqMLp/v7+59zSycnJ0dbX2tTN1ONUOhP+gwCAAQAIAAkAAAQDAQICAgPoGMg5gQHDAACAAQAIABsAAAAL0tLD0tIuLkg+SC4ug4ACUQGvgQSvrwFRUYSAAQAIABMAAAAIzu3DwyXuthUwg4ABpqaBAH6GgAEACABkAAAALfHj2dzi4uLXzs/c5NfV2ur28+Pju67M+R4eHjE6Hv30zq6urs70/QUrS0tLKwWDgRABAPTlzsDFzs7O0uHSv7azs4EPIkpjVCxBOhwAT09GGua1ikL/f/9//38FirXmGkZPgwCAAQAIAEAAACAfAQUBAgUBAgECAwIBAgEBAQIEAQECAQECAQECAQIDAgEf+Pf49PX04sbGCiYm4tseJQsLCwsICQkJCQj22toeOjoLAf79/QEBLxTrz/8Ugw8B//39/f3/AAEBLxTrz/8UgAEACABiAAAwLwEBAQIBAwECAQEDAQQBAwECAQMBAwEDAQMBBAEDAQIBAwEDAQMBAwEEAQMBAQEBAS8VFhcXFhMSERESAecUKEEoFRYXFhMSERIB5xQoQSj9/v/++/r5+unP/BApEBcX+fkvAgMBAP8A/wEBAyoR2NgRKgAB/v3+/QABKA/W1g8oAAH+/f79AAEoD9bWDyjpHxPdgAEACAAUAAAAB//E/zz/5P8bgwfh/Rb9Uv2m/YMAgAEACAASAAAIBwEDAwMDAwMDBwz3KD3Yw/QJB+ITKPfiEyj3gAEACAAEAAAAhAAKgwCAAQAIAA4AAAYFAAICAgICgATe3gAiIgXk+RMoE/mAAQAIAA4AAAYFAAICAgICgATe3gAiIgXsARswGwGAAQAIABIAAAgHAAEBAQIBAwGABuvR0esALy8H6ekDGEdHGAOAAQAIABwAAAAL29rV2NjY6/kABwongwsG/PsEBREjIyMiHwaDAIABAAgAHAAAAAvV09TZ2dnn+QAOESeDC/b/Ag4QGy8vLygh9oMAgAEACAAcAAAAC9j1+P8GFCcnJyolJIMLBh8iIyMjEQUE+/wGgwCAAQAIABwAAAAL2e/yAQcYJycnLC0rgwv2ISgvLy8bEA4C//aDAIABAAgANAAAABetyczT2ef////++foCHiEoLjxUVFRRTk+DFwYfIiQkJBAEA/r7BgYfIiQkJBAEA/n7BoMAgAEACAAEAAAAAP+DhACAAQAIABsAAAAL4+bn+wASHR0dGRYYgwLw+fyCBevj3dTR8IOAAQAIABwAAAALsfr5/v8CBwdPAAIBgwv+NjM1NTUzNv7+//6DAIABAAgABAAAAIQA94MAgAEACAAYAAAACf/6+rEBAgBPBwaDCf7+/DU1NDU1/P6DAIABAAgABAAAAIQA9oMAgAEACAAgAAAADf/t390NDAP/+/bzIyERgw319QMSEhkjIyMZEhID9YMAgAEACAAEAAAAhAD5gwCAAQAIABwAAA0MAQECAQQBAQECAwMDAwz25dvbCholJRr9+AMIDNzlAAskGwsA5Qb9+gIAgAEACAAmAAASEQEBAwECAQEDAQECAQIBAgECARH04dbh/wodKh0K/ff3/QMJCQMRytUBFB4eFOnVyv338evr8ff9gAEACAA8AAAAGw0A/gMDBAUDzs/e+QEEAgMBAwYLEhYkMjIyHAmDG/j49/X19fr8/AchISEgICAgGhkbHx8fDgj38/iDAIABAAgABAAAAIQA9YMAgAEACAAGAAACAQECAegZARHVgAEACAAEAAAAhAAhgwCAAQAIACQAAAAP5Mze5uLi4snAAyE1NTUpB4MP7QMBAv72+fbwCQf38vTw64MAgAEACABGAAAAIO3n5ubo2uHl2uDg4N3j6fLz7OPj6ff79/f+/AoaGhoE7oMg9fXu6QQKCQkJ9/z7+Pj4+/n1+vwF+v///v7+AwL35+n1gwCAAQAIADAAAAAVEu3Rzc3N1dbLNCgoKCgoIycxNDQ5GoMH+PgFDwoODQeBCwMLExggICAiIvj7+IMAgAEACAAwAAAAFRLt0c3NzdLRNDw2KSkpIyEmLzQ0ORqDFfj4BQ8KCAP+AAcQFBQbICAgISL4+/iDAIABAAgAAgAAAISEAIABAAgAAgAAAISEAIABAAgAAgAAAISEAIABAAgAAgAAAISEAIABAAgAAgAAAISEAIABAAgAAgAAAISEAIABAAgABgAAAgEBAgHtFAHdqIABAAgAAgAAAISEAIABAAgAAgAAAISEAIABAAgAAgAAAISEAIABAAgAAgAAAISEAIABAAgAAgAAAISEAIABAAgAAgAAAISEAIABAAgAAgAAAISEAIABAAgAUgAAAIAl797a2tre7wASIiYmJiISAO/QxSw6SUlJNBM+1ce3t7fL5f0AEDKDJgEBCAkA9/j9/f349wAJCAFJSTwtkZ7UAR8+SdJuXygB0Kuqtra2woMAgAEACAAUAAAJCAECAgEBAQECAgjqyezm2tXbNgoIVZ////r6AFUAAIABAAgAOAAAABrX18q/vLy82fYRMTTY5Pv9CB0pKSk9V2NbExODgAxVPR8F8t23t7fT6xAOggj89fH/HDhMUVGEAIABAAgAYwAAADH4DADdzSwuJf3ow62trbrHxsbGxtjSwMDAzN/qECcnydPw/vX8DyIvLy8qPSweHh4SAYOBH+zg7RogSUlJOR4M+N/T09MSEhITAOTWwre3t+TqEh0ShAn79e/89+//DAYChIABAAgAFAAACAcBAgECAgIBAwfT3thCIkJd0wbWDQA11gA1QP9vgAEACABKAAAAI/gI/N3OJikd7OPLubm5y+Tt+xEWuLkpKRYlIiEUFSEtLS0hCIOBEu/l7BQfSUlJOBgC6sy+vr7L0PqBC7CwKhcHBwcKCQICAYQAgAEACABYAAAAKvXizsbGxs/e7vYIFB2/xN7xDS08PkMsExIZICAgEPvz1q+vr9bxEjQ0NBGDgQUSHxQXEgiCHwT93M25ubnrNVk6EBAQEBETBP0ASEgjC+zHx8fvCyNIgwCAAQAIABEAAAAGwqjY2B8fQ4OAAa+vgQCvhIABAAgAfAAAAIA69uDS0tLHvdLt7e3v9wAKERISEi5DOS0tLR8KAOnKu7u7yukAFjREREQ0FgDu0L6+vtDuABIvQEBALxKDO////QcZFw0PD/np7vf9/f337un5Dw8NFhgH/f9XV0UoGAnq1NTU6gkYKERXKCgW+unYu6mpqbvY6foWKIMAgAEACABOAAAAJM2fnrDL5/r6+vz+/gAECAgIERwdNgLrxa+vr8rxARU7VVVVQR2DgCPa7wsYFwb2+Pr8/Pz59vQFEhEMAEhIMQz01bGhoaG12/UJLkiDAIABAAgAYAAAAIAs797a2tre7wASIiYmJiISAO/Nt7e3y+X9AAQcNklJSTQTAPPf39/zAA0hISENgy0BAQgJAPf4/f39+PcACQgBSUk+HwHQq6m1tbWpq9ABHz5J3t7y/wwgICAM//LegwCAAQAIAAcAAAAD2tsmJoOHgAEACABKAAAADNTU09Ps5eUGBuniJSyBFQsKAQEBCxQZJyYACxQYJDIyMkFRJCSDBfjNzQkHBIEA+IQVJyEYCv3z5OTk7PsGDAYGBgYDAxgnJ4QAgAEACAAkAAASEQECAQEBAgEBAQECAgECAgIBAxHJyOHa2vve1xoh7e7iGBQYHu4FzQkHBAD4gwf4GQce+AAe5IABAAgAdwAAADvj3B8m8vLz8+cdHRkZHR0j8/Pz/fvu5xAQCf724+Pj8/39+OXl5fP4BAwP5+33+woTFBQUFhsVFxcXEASDhCf4+BkHBx4e+PgAHh7k5Pb27fADChkZGQ7/7eLjCQsC9efe3t7r9gkIggv6+P36+Pv+AQAB/PaDgAEACAATAAAACNfX1dXi6ekSEoOABMPDBwf5hoABAAgAMgAAABfq6vDv6urq+QQGFRXp8gEFESIiIi5CFRWDgAwtJRT/8ujY2Njc8AoKggUD9vUZMDCEAIABAAgAVwAAACr///DmFxcSAfrd3d3wAgEBAO/e3t7v+AoUFubu+PkMFxYWFhkfGBoaGhIHg4EZ8/UOFCkpKRsJ9ODd4RMWFQTy49fX1+f2DgyCCvv7APr7AAMHAAIBhAAFAGYAAAISArwAAwAGAAkADAAPAAAzESERJSEDAxMDAREDJxMhZgGs/nEBc7rBtLQBg7YNu/6MArz9RBUBNP7oAS0BLP2lAl3+0hUBNQACACMAAAJVApwABwALAAAzEzMTIychBzchAyMj/Dv7OT3+uj5PASOPBAKc/WSoqNgBiQD//wAjAAACVQNHAiYAAQAAAAYBSDQA//8AIwAAAlUDRgImAAEAAAAHAVAAAACn//8AIwAAAlUDSgImAAEAAAAHAUwAAACj//8AIwAAAlUDOQImAAEAAAAHAUAAAACK//8AIwAAAlUDRwImAAEAAAAGAUbMAP//ACMAAAJVAx4CJgABAAAABwFWAAAAkwACACP/WAJVApwAGwAfAAAzEzMTDgIVFBYzMjY3FQYGIyImJjU0NjcnIQc3IQMjI/w7+xonFB8TCRIIDxUMFyYVKB87/ro+TwEjjwQCnP1kCBsgERcUBAMnBgMSIRcjMBCjqNgBiQADACMAAAJVA0MAFAAYACQAADMTJiY1NDY2MzIWFhUUBgcTIychBzchAyM3MjY1NCYjIgYVFBYj9hoiGisaGysZIRr1OT3+uj5PASOPBAIXICAXFiEhAowLLx4aKxoaKxodMAv9dKio2AGJTCEWFyAgFxYh//8AIwAAAlUDPQImAAEAAAAHAVQAAACpAAIABQAAAmwCnAAPABMAADMBIRUjFTMVIxEhFSE1Iwc3MxEjBQEMAVj+zc0BAf7HtkJVowQCnDD8MP7wMKio2AGXAAMAdAAAAjECnAASABwAJQAAMxEzMhYWFRQGBgceAhUUBgYjJzMyNjY1NCYjIzUzMjY1NCYjI3TjQlMoEichKTUZKFZHwLY2Qh5IULSxRDtES6ECnC5OLxw7MA0OMEAnMVQzMCdAJTdPMEYzNUwAAQA2//QCQQKoAB4AAAUiJiY1NDY2MzIWFwcmJiMiBgYVFBYWMzI2NjcXBgYBTlR+RkmCU0mBIDEWXUc8aEBAaDwxSTIQMiN+DFudZGSbWUtKEzFHQ4RhYYZFITcgE0xJAP//ADb/9AJBA0cCJgANAAAABgFISQD//wA2//QCQQNFAiYADQAAAAcBTgAVAKQAAQA2/08CQQKoAD4AAAUiJic3FhYzMjY1NCYjIgYjIiY3Ny4CNTQ2NjMyFhcHJiYjIgYGFRQWFjMyNjY3FwYGBwc2NjMyFhYVFAYGAUUTLREOFR0PHBQSFwsXCAsFBxtMcT9JglNJgSAxFl1HPGhAQGg8MUkyEDIieU8XChEEFRsOEiexDgoZCgccCg4QBhIKLAhdmF5km1lLShMxR0OEYWGGRSE3IBNJSgIkAgIQGQ4PJRr//wA2//QCQQM7AiYADQAAAAYBQxUAAAIATQAAAk8CnAAMABkAADMRMzIeAhUUDgIjJzMyPgI1NC4CIyNNpE2BXTMzXYFNbGQ5bFUzM1VsOWQCnCNPflxbgU8lMBc9cVtbcDsW//8ATQAAAk8DRQImABIAAAAHAU4ADACkAAIAFgAAAk8CnAAQACEAADMRIzUzETMyHgIVFA4CIyczMj4CNTQuAiMjFTMVI003N6RNgV0zM12BTWxkOWxVMzNVbDlkysoBRzABJSNPflxbgU8lMBc9cVtbcDsW9TAAAAIAFgAAAk8CnAAQACEAADMRIzUzETMyHgIVFA4CIyczMj4CNTQuAiMjFTMVI003N6RNgV0zM12BTWxkOWxVMzNVbDlkysoBRzABJSNPflxbgU8lMBc9cVtbcDsW9TAAAAEAiQAAAhkCnAALAAAzESEVIRUhFSERIRWJAYz+rAEV/usBWAKcMPww/vAwAP//AIkAAAIZA0cCJgAWAAAABgFISQD//wCJAAACGQNFAiYAFgAAAAcBTgAVAKT//wCJAAACGQNKAiYAFgAAAAcBTAAVAKP//wCJAAACGQM5AiYAFgAAAAcBQAAVAIr//wCJAAACGQM7AiYAFgAAAAYBQxUA//8AiQAAAhkDRwImABYAAAAGAUbhAP//AIkAAAIZAx4CJgAWAAAABwFWABUAkwABAIn/WAIZApwAIAAAMxEhFSEVIRUhESEVDgIVFBYzMjY3FQYGIyImJjU0NjeJAYz+rAEV/usBWBonFB8TCRIIDxUMFyYVIhwCnDD8MP7wMAgbIBEXFAQDJwYDEiEXIC4QAAEAiQAAAhkCnAAJAAAzESEVIRUhFSERiQGQ/qgBVP6sApww/DD+wAABACn/9AJCAqgAJgAABSImJjU0NjYzMhYXByYmIyIGBhUUFhYzMj4CNTUjNTMRIycOAgFDWH9DRn9XTX0fMhdeRD5nPDtmPxxGQCnI/SgNF0VMDFucY2ibV05NEztDRIRiXIZIEzBVQRow/rlhJzAWAP//ACn/9AJCA0YCJgAgAAAABwFQAAcAp///ACn/GAJCAqgCJgAgAAAABgFY+wD//wAp//QCQgM7AiYAIAAAAAYBQwcAAAEAQQAAAjcCnAALAAAzETMRIREzESMRIRFBOAGGODj+egKc/tUBK/1kAUH+vwACAAoAAAJuApwAEwAXAAAzESM1MzUzFSE1MxUzFSMRIxEhEREhNSFBNzc4AYY4Nzc4/noBhv56AgUuaWlpaS79+wFB/r8BcZQAAAEAjwAAAekCnAALAAAzNTMRIzUhFSMRMxWPkZEBWpGRKgJIKir9uCoAAAIACv/0AkYCnAARAB0AAAUiJjc3BhYWMzI2NjURMxEUBiU1MxEjNTMVIxEzFQGoS1sDOAMeNBwVLyI4WP4cUFDYUFAMZWsLQEsgFUA/AeT+G2JhDCoCSCoq/bgqAP//AI8AAAHpA0cCJgAmAAAABgFINAD//wCPAAAB6QNKAiYAJgAAAAcBTAAAAKP//wCPAAAB6QM5AiYAJgAAAAcBQAAAAIr//wCPAAAB6QM7AiYAJgAAAAYBQwAA//8AjwAAAekDRwImACYAAAAGAUbMAP//AI8AAAHpAx4CJgAmAAAABwFWAAAAkwABAI//WAHpApwAIAAAMzUzESM1IRUjETMVDgIVFBYzMjY3FQYGIyImJjU0NjePkZEBWpGRGicUHxMJEggPFQwXJhUiHCoCSCoq/bgqCBsgERcUBAMnBgMSIRcgLhAAAQBF//QB9AKcABMAAAUiJiY3NwYWFjMyPgI1ETMRFAYBIEFkNgI2BS5PKxg2MB44dwwsXUcLQEsgCx87LwHk/htiYf//AEX/9AJXA0cCJgAvAAAABwFIANAAAAABAGIAAAJYApwACwAAMxEzEQEzAwEjAQcVYjgBU0b9ASJE/v54Apz+hAF8/uv+eQFeg9v//wBi/xgCWAKcAiYAMQAAAAYBWOoAAAEAkwAAAkYCnAAFAAAzETMRIRWTOAF7Apz9lDAA//8AkwAAAkYDRwImADMAAAAGAUg4AP//AJMAAAJGAqkCJgAzAAAABgFLGdv//wCT/xgCRgKcAiYAMwAAAAYBWAwAAAEAHwAAAkYCnAANAAAzEQc1NxEzETcVBxUhFZN0dDjKygF7AQVEN0QBYP7Adjd29TAAAQAzAAACRQKcAA8AADMRMxMzEzMRIxEjAyMDIxEzYagEpGE4BK0+rwQCnP2vAlH9ZAJg/aACYP2gAAEAVQAAAiMCnAALAAAzETMBMxEzESMBIxFVWQE5BDhZ/scEApz9ogJe/WQCXv2i//8AVQAAAiMDRwImADkAAAAGAUg0AP//AFUAAAIjA0UCJgA5AAAABwFOAAAApP//AFX/GAIjApwCJgA5AAAABgFY5AD//wBVAAACIwM9AiYAOQAAAAcBVAAAAKkAAgAp//QCTwKoAA8AHwAABSImJjU0NjYzMhYWFRQGBicyNjY1NCYmIyIGBhUUFhYBPFd7QUF7V1d7QUF7Vz5jOTljPj5jOTljDFqcZGScWlqcZGScWjBFhWBhhEVFhGFghUUA//8AKf/0Ak8DRwImAD4AAAAGAUg1AP//ACn/9AJPA0oCJgA+AAAABwFMAAEAo///ACn/9AJPAzkCJgA+AAAABwFAAAEAiv//ACn/9AJPA0cCJgA+AAAABgFGzQD//wAp//QCTwNjAiYAPgAAAAcBSQAtAKwAAwAp//QCTwKoABgAIgAsAAAFIiYnByc3JjU0NjYzMhYXNxcHFhYVFAYGJzI2NjU0JicBFicBJiMiBgYVFBYBPDpcIzYeO0FBe1c6XiI2HzwgIEF7Vz5jORYU/rg8UwFIO14+YzkXDCglRBlLXZBknFopJUQYTC14R2ScWjBFhWA7XyX+X0hqAaFJRYRhO2H//wAp//QCTwM9AiYAPgAAAAcBVAABAKkAAgAI//QCaQKoABkAKQAAFyImJjU0NjYzMhc1IRUjFTMVIxEzFSE1BgYnMjY2NTQmJiMiBgYVFBYWyz9XLS1YP2IzAQXNoKDQ/vgZSy0rQSUlQSspQSUlQQxWm2lpm1ZnWzD8MP7wMFoxNTBBhWRmhEBAhGZmhEAAAgB3AAACNQKcAAwAFQAAMxEzMhYWFRQGBiMjEREzMjY1NCYjI3fVR2k5OWlHnZdTY2NTlwKcKlRBQFYq/uMBTT9RUD8AAAIAdwAAAjUCnAAOABcAADMRMxUzMhYWFRQGBiMjFTUzMjY1NCYjI3c4nUdpOTlpR52XU2NjU5cCnIkqVEFAViqUxD9RUD8AAAIAKf/0AngCqAAUACgAAAUiJiY1NDY2MzIWFhUUBgcXBycGBicyNyc3FzY2NTQmJiMiBgYVFBYWATxXe0FBe1dXe0EbGl4kWSJhPFw8rSSmERQ5Yz4+Yzk5YwxanGRknFpanGRAcCxZJVQoLDBIoyacI1s3YYRFRYRhYIVFAAIAdgAAAjECnAAOABkAADMRMzIWFhUUBgcTIwMjEREzMjY2NTQmJiMjdsxFZjluWdJHynKRMk4uLk4ykQKcKVNBWFoH/toBI/7dAVMcPjIzPhwA//8AdgAAAjEDRwImAEoAAAAGAUgcAP//AHYAAAIxA0UCJgBKAAAABwFO/+gApAABAEn/9AIwAqgAMQAABSImJic3HgIzMjY2NTQmJycuAjU0NjYzMhYWFwcuAiMiBgYVFBYXFx4CFRQGBgE6L2ROEDYNOk0oNVUyP1lfK00vO2ZBLVRFFDcPNUAeLU4vSTFgO1gxRHAMH0M2FSs4GiJCMC48FhgLJkI0M1AuGDMnFR0mFBw6LC81DRkPKkY4O1cv//8ASf/0AjADRwImAE0AAAAGAUg0AP//AEn/9AIwA0UCJgBNAAAABwFOAAAApAABAEn/TwIwAqgAUQAABSImJzcWFjMyNjU0JiMiBiMiJjc3LgInNx4CMzI2NjU0JicnLgI1NDY2MzIWFhcHLgIjIgYGFRQWFxceAhUUBgYHBzY2MzIWFhUUBgYBMxMtEQ4VHQ8cFBIXCxcICwUHGyxYRQ42DTpNKDVVMj9ZXytNLztmQS1URRQ3DzVAHi1OL0kxYDtYMUBrQBcKEQQVGw4SJ7EOChkKBxwKDhAGEgosBCJAMRUrOBoiQjAuPBYYCyZCNDNQLhgzJxUdJhQcOiwvNQ0ZDypGODpVMAIkAgIQGQ4PJRoA//8ASf8YAjACqAImAE0AAAAGAVj0AAABAFH/9AJTAqgALgAABSImJic3FhYzMjY1NCYmIyIGBycTJiYjIgYGFREjETQ2NjMyFhcVBzYWFhUUBgYBpDJCJwkyCTU0MkYiNx4PGQketjNfKz5ZLzhDc0g4ej6qM1c0MlAMHzQdEyUsREAtOhsFBDIBCwsNIFBJ/kEBv1llKxQPMvkIKVU7PFApAAEAPwAAAjkCnAAHAAAhESM1IRUjEQEg4QH64QJsMDD9lP//AD8AAAI5A0UCJgBTAAAABwFOAAAApAABAD//TwI5ApwAKAAAIREjNSEVIxEjBzY2MzIWFhUUBgYjIiYnNxYWMzI2NTQmIyIGIyImNzcBIOEB+uEJHwoRBBUbDhInHxMtEQ4VHQ8cFBIXCxcICwUHIgJsMDD9lDACAhAZDg8lGg4KGQoHHAoOEAYSCjf//wA//xgCOQKcAiYAUwAAAAYBWPQAAAEAVf/0AiMCnAASAAAFIiY1ETMRFBYzMjY2NREzERQGATt5bThTWz1OJThuDIF/Aaj+VGVnLltDAaz+WH+BAP//AFX/9AIjA0cCJgBXAAAABgFINAD//wBV//QCIwNKAiYAVwAAAAcBTAAAAKP//wBV//QCIwM5AiYAVwAAAAcBQAAAAIr//wBV//QCIwNHAiYAVwAAAAYBRswA//8AVf/0AiMDYwImAFcAAAAHAUkALACs//8AVf/0AiMDHgImAFcAAAAHAVYAAACTAAEAVf9YAiMCnAApAAAFIiYmNTQ2NwYGLgI1ETMRFBYzMjY2NREzERQGBwYGFRQWMzI2NxUGBgGpFyYVFREjUU5AJjhTWz1OJTgxNR0cIhQIEAcPFagSIRcYLRMFARU2Y08Bq/5UZWcuW0MBrP5YVXIfETEaGRgDBCcGAwADAFX/9AIjA2cADwAbAC4AAAEiJiY1NDY2MzIWFhUUBgYnMjY1NCYjIgYVFBYTIiY1ETMRFBYzMjY2NREzERQGAT8cLRsbLRwcKRgYKR8XICAXFiEhFXltOFNbPU4lOG4CphosGhosGxssGhosGisfFhYfHxYWH/0jgX8BqP5UZWcuW0MBrP5Yf4EAAAEAMQAAAkcCnAAHAAAhAzMTMxMzAwEe7TrPBNA57gKc/agCWP1kAAABAA0AAAJsApwADwAAMwMzEzMTMxMzEzMDIwMjA4p9OGcEbz5tBGc3fUdpBGoCnP2vAlH9rwJR/WQCNv3K//8ADQAAAmwDRwImAGEAAAAGAUg2AP//AA0AAAJsA0oCJgBhAAAABwFMAAIAo///AA0AAAJsAzkCJgBhAAAABwFAAAIAiv//AA0AAAJsA0cCJgBhAAAABgFGzgAAAQAjAAACVQKcAA0AADMTAzMTMxMzAxMjAyMDI/XnQsYExkTn9UPUBNQBWQFD/ugBGP69/qcBLf7TAAEAJAAAAlQCnAAJAAAhEQMzEzMTMwMRASH9QtUE00L7AQwBkP6rAVX+cP70AP//ACQAAAJUA0cCJgBnAAAABgFINQD//wAkAAACVANKAiYAZwAAAAcBTAABAKP//wAkAAACVAM5AiYAZwAAAAcBQAABAIr//wAkAAACVANHAiYAZwAAAAYBRs0AAAEANgAAAkECnAAJAAAzNQEhNSEVASEVNgG//lAB7f5BAc48Ai4yPP3SMgD//wA2AAACQQNHAiYAbAAAAAYBSDgA//8ANgAAAkEDRQImAGwAAAAHAU4ABACk//8ANgAAAkEDOwImAGwAAAAGAUMEAAACAFj/9AIDAfoAHAAnAAAFIiY1NDY3NTQmIyIGByc2NjMyFhUVFBYXIycGBicyNjY1NQYGFRQWAQpPY7GzPkg6RAk4FGZEYloLBywUEFdPMU8vmJVCDEVBWlMNCkFNMiYNPD1iXnhGWyFRIjsvH0c6RAo/QSgyAP//AFj/9AIDArgCJgBwAAAABgFHLAD//wBY//QCAwKfAiYAcAAAAAYBUPoA//8AWP/0AgMCpwImAHAAAAAGAUz6AP//AFj/9AIDAq8CJgBwAAAABgFA+gD//wBY//QCAwK4AiYAcAAAAAYBRccA//8AWP/0AgMCiwImAHAAAAAGAVb6AAACAFj/WAIDAfoALwA6AAAFIiYmNTQ2NycGBiMiJjU0Njc1NCYjIgYHJzY2MzIWFRUUFhcGBhUUFjMyNjcVBgYnMjY2NTUGBhUUFgHTFyYVKikREFdST2Oxsz5IOkQJOBRmRGJaCwcoLR4VChEHDxXSMU8vmJVCqBIhFyMyFEYiO0VBWlMNCkFNMiYNPD1iXnhGWyENLRoWFQQDJwYDyx9HOkQKP0EoMv//AFj/9AIDAvsCJgBwAAAABgFS+gD//wBY//QCAwKUAiYAcAAAAAYBVPoAAAMACv/0AmwB+gAvADsAQwAAFyImNTQ2Njc1NCYjIgYHJzY2MzIWFzY2MzIeAgchFB4CMzI2NxcGBiMiJicGBicyNjY1NQ4CFRQWEzM0JiYjIgaTPUwtcmUrMictCTQUTTEzQQ0XSS4vQioQA/7VGyswFSEsEy0UQzs5TRUUSDchNiFUWiMu1fQWMywsSQxEPTBGLAcgQlA1Jgw8PTQxMDUtS14wPlIwFCEiECU6PTM3OSofST0xBSI0IyUzAQAoUTdOAAACAGT/9AI9AsQAFAAhAAAFIiYmJwcjETMRPgIzMhYWFRQGBicyNjU0JiMiBhUUFhYBUy1INBENKDYSNUcrRWo7O2pKU2VlU1JiLVEMGywaVQLE/tEeLRo9dFJSdD0wbmVlbnFiQF80AAEAZf/0AiMB+gAeAAAFIiYmNTQ2NjMyFhcHJiYjIgYGFRQWFjMyNjcXDgIBV0duPTpvT0RhHDEUTTIxVzY1VTE0UhMzDjdRDENzSUh4RzwwEyYpLl5JR10tKiMTGTEg//8AZf/0AiMCuAImAHwAAAAGAUdQAP//AGX/9AIjAqECJgB8AAAABgFOHgAAAQBl/08CIwH6AD4AAAUiJic3FhYzMjY1NCYjIgYjIiY3Ny4CNTQ2NjMyFhcHJiYjIgYGFRQWFjMyNjcXDgIHBzY2MzIWFhUUBgYBTxMtEQ4VHQ8cFBIXCxcICwUHG0BhNjpvT0RhHDEUTTIxVzY1VTE0UhMzDjVMMxcKEQQVGw4SJ7EOChkKBxwKDhAGEgosB0RvREh4RzwwEyYpLl5JR10tKiMTGC8hAiQCAhAZDg8lGgD//wBl//QCIwKvAiYAfAAAAAYBQh4AAAIAO//0AiUCxAAVACIAAAUiJiY1NDY2MzIWFxEzERQWFyMnBgYnMjY2NTQmIyIGFRQWASVFaTw8aUVDXRk2BA0yFxlbPjdQLWJSU2VlDD10UlJ0PTkrAS798xJeR1QoODA0X0Bhcm5lZW4AAAMALP/0AlcC0AAUACAAKwAABSImJjU0NjMyFhcRMxEUFhcjJwYGJzI2NTQmIyIGFRQWATc2NjMyFhUUBwcBAT9gNnZfOVAZNgQNMhcZTjRIVVVISllZAU8SBAwPCRIKJAw9dFJ7iDkrAS798xJeR1QoODByYWFybmVlbgH6gRkYCw8IH3EAAgA7//QCVQLEAB0AKgAABSImJjU0NjYzMhYXNSM1MzUzFTMVIxEUFhcjJwYGJzI2NjU0JiMiBhUUFgElRWk8PGlFQ10Zqak2QUEEDTIXGVs+N1AtYlJTZWUMPXRSUnQ9OSubKGtrKP6GEl5HVCg4MDRfQGFybmVlbgACAD3/9AIpAtEAJQA1AAAFIi4CNTQ+AjMyFhYXJiYnByc3JiYHNTYWFzcXBxYWFRQOAicyNjY1NCYmIyIGBhUUFhYBLyxWRiopRVUrLlU/DAUqIT0cORplR0p1KikcJTUoGThhSC9VNjdVLy5WNjdWDB48WTs7WTweHjkpbHQiOxs5EyYGLQYmHCgbJjeXZEJ5XzYwKlM/QFUrKlRAP1UqAAACAFT/9AImAfoAGQAiAAAFIiYmNTQ2NjMyHgIHIRQeAjMyNjcXBgYBITQmJiMiBgYBQ01rNz1rRTpYORoD/mgkOUIeNUETNhlb/voBXSVKOipNNQxFdUdQdUAtS14wPVAvFCUbEyU4AS0mTjUgSgD//wBU//QCJgK4AiYAhQAAAAYBRzwA//8AVP/0AiYCoQImAIUAAAAGAU4KAP//AFT/9AImAqcCJgCFAAAABgFMCgD//wBU//QCJgKvAiYAhQAAAAYBQAoA//8AVP/0AiYCrwImAIUAAAAGAUIKAP//AFT/9AImArgCJgCFAAAABgFF1wD//wBU//QCJgKLAiYAhQAAAAYBVgoAAAIAVP9YAiYB+gAsADUAAAUiJiY1NDcGJiY1NDY2MzIeAgchFB4CMzI2NxcGBgcGBhUUFjMyNjcVBgYBITQmJiMiBgYBqhcmFSVVhk49a0U6WDkaA/5oJDlCHjVBEzYNJxgcGiIUCBAHDxX+1wFdJUo6Kk01qBIhFzAnDzZ8WVB1QC1LXjA9UC8UJRsTEyQPES8ZGRgDBCcGAwHJJk41IEoAAAEAbQAAAiQCzAAUAAAhESM1MzU0NjYzMxUjIgYVFTMVIxEBDaCgEi8sqq4fFJGRAcQsZjAzEzAaLGYs/jwAAgBC/0YCEwH6ACEALgAABSImJic3FhYzMjY2NTUGBiMiJiY1NDY2MzIWFzczERQGBicyNjY1NCYjIgYVFBYBNy1WPgo3ClA8L0orGlpBQ2g7O2hDQVsZDig3Y0w2TytgUFFjY7oYMigPJiodPS9hKDU7cE9PcD05Kln+DDhSLO4yWj1ccWxhYGn//wBC/0YCEwKfAiYAjwAAAAYBUPcAAAMAQv9GAhMC8wAPADEAPgAAASYmNTQ2NjcXDgIVFBYXAyImJic3FhYzMjY2NTUGBiMiJiY1NDY2MzIWFzczERQGBicyNjY1NCYjIgYVFBYBORQTHS0WHhAmGxITLS1WPgo3ClA8L0orGlpBQ2g7O2hDQVsZDig3Y0w2TytgUFFjYwI/ESQWIC4aARkBDx4aEyIM/PUYMigPJiodPS9hKDU7cE9PcD05Kln+DDhSLO4yWj1ccWxhYGkA//8AQv9GAhMCrwImAI8AAAAGAUL3AAABAHIAAAIIAsQAFQAAMxEzET4CMzIWFhURIxE0JiMiBhURcjYMLkQtP1AmNjxJSF0CxP7fEygcL1Ey/rgBNz9UYFn+7wAAAQAxAAACCALEAB0AADMRIzUzNTMVMxUjFT4CMzIWFhURIxE0JiMiBhURckFBNqmpDC5ELT9QJjY8SUhdAjEoa2sojhMoHC9RMv64ATc/VGBZ/u///wBzAAACEQK3AiYAlgAAAAYBRPsAAAEAcwAAAhEB8AAJAAAzNTMRIzUzETMVc7Sb0bQsAZgs/jws//8AcwAAAhECuAImAJYAAAAGAUctAP//AHMAAAIRAqcCJgCWAAAABgFM+wD//wBzAAACEQKvAiYAlgAAAAYBQPsA//8AcwAAAhECrwImAJYAAAAGAUL7AP//AHMAAAIRArgCJgCWAAAABgFFyAD//wBzAAACEQKLAiYAlgAAAAYBVvsAAAIAc/9YAhECtwAdACkAADM1MxEjNTMRMxUGBhUUFjMyNjcVBgYjIiYmNTQ2NwMiJjU0NjMyFhUUBnO0m9G0KC0eFQoRBw8VDBcmFSAflxMdHRMUHBwsAZgs/jwsDS0aFhUEAycGAxIhFx4tEwJXHRMUHBwUEx0AAAQAbv9fAgoCtwAPABUAIQAtAAAFNTMyNjY1ESM1MxEUBgYjJxEjNTMRAyImNTQ2MzIWFRQGISImNTQ2MzIWFRQGASVJKicLPXMSPkLDPXMmEx0dExQcHAELEx0dExQcHKEwEC0qAc4s/gc5Qh2hAcQs/hACVx0TFBwcFBMdHRMUHBwUEx3//wBk/14BhQK3AiYAoAAAAAYBRBkAAAEAZP9eAXsB8AAPAAAXNTMyNjY1ESM1MxEUBgYjZIUqJwub0RI+QqIwEC0qAc8s/gY5Qh0A//8AZP9eAc0CuAImAKAAAAAGAUdLAAABAJgAAAI2AsQACwAAMxEzESUzBxMjAwcVmDYBBEXU80XTUALE/jH7yv7aAQJMtv//AJj/GAI2AsQCJgCiAAAABgFYAQAAAQB8AAACEALEAA4AACEiJiY1ESM1MxEUFjMzFQFSJysRc6kRIbkSKSQCOSz9nhwWMP//AHwAAAIQA28CJgCkAAAABgFIASj//wB8AAACEALRAiYApAAAAAYBS20D//8AfP8YAhACxAImAKQAAAAGAVgqAAABAHwAAAIQAsQAFgAAISImJjU1BzU3ESM1MxE3FQcVFBYzMxUBUicrEUBAc6leXhEhuRIpJLQqMCoBVSz+oj4wPtQcFjAAAQBHAAACMwH6ACIAADMRMxc2NjMyFhc2NjMyFhURIxE0JiMiBhURIxE0JiMiBhURRyoJDDUrKjULCzksPjU2ISknNDYgKCc2AfA3GCkkIBkrSjn+iQFmLTc9Pf6wAWctNj49/rEAAQByAAACCAH6ABUAADMRMxc+AjMyFhYVESMRNCYjIgYVEXIoDAwtRi4/UCY2PElIXQHwUBMqHS9RMv64ATc/VGBZ/u8A//8AcgAAAggCuAImAKoAAAAGAUcyAP//AHIAAAIIAqECJgCqAAAABgFOAAD//wBy/xgCCAH6AiYAqgAAAAYBWO4A//8AcgAAAggClAImAKoAAAAGAVQAAAACAEb/9AIyAfoAEwAjAAAFIi4CNTQ+AjMyHgIVFA4CJzI2NjU0JiYjIgYGFRQWFgE8K1dILCxIVyssV0grK0hXLDFXNzdXMTFXNzdXDB4/YkREYj8eHj9iRERiPx4wLV5ISV0tLV1JSF4tAP//AEb/9AIyArgCJgCvAAAABgFHMgD//wBG//QCMgKnAiYArwAAAAYBTAAA//8ARv/0AjICrwImAK8AAAAGAUAAAP//AEb/9AIyArgCJgCvAAAABgFFzQD//wBG//QCMgK3AiYArwAAAAYBSSwAAAMARv/0AjIB+gAbACYAMQAABSImJwcnNyYmNTQ+AjMyFhc3FwcWFhUUDgInMjY2NTQmJwEWFicBJiYjIgYGFRQWATwrViMuGy4ZHixIVysrVSMvGy8aHitIVywxVzcUEv7mGkN2ARoaQyMxVzcUDB0eMBsxH1Y3RGI/Hh0eMhsyH1Y4RGI/HjAtXkgrQxn+1hgYTQEqGBctXUkqQwD//wBG//QCMgKUAiYArwAAAAYBVAAAAAMABP/0AnYB+gAkADQAPAAABSImJwYGIyImJjU0NjYzMhYXNjYzMh4CByEGFhYzMjY3FwYGJTI2NjU0JiYjIgYGFRQWFjczNCYmIyIGAdc5SxQWUSkqTzIyUCwuTxYUSTEtPygPA/7nASo7GiAnEy0TP/6jIDgjIzggHzcjIzfL4hUuKChFDEQ3QDs2c1pbcjY8QTtCLUteMFJdJSEhECU5MC1eSEldLS1dSUheLfooUTdOAAIAZP9eAj0B+gAUACAAABcRMxc+AjMyFhYVFAYGIyImJicVNzI2NTQmIyIGFRQWZCgQETVGK0VqOztqRS1INBC0U2VlU1JiYqICklgcLBo9dFJSdD0bLBn2xm5lZW50X2FyAAACAGT/XgI9AsQAFAAgAAAXETMRPgIzMhYWFRQGBiMiJiYnFTcyNjU0JiMiBhUUFmQ2EjVHK0VqOztqRS1INBC0U2VlU1JiYqIDZv7RHi0aPXRSUnQ9Gywa98ZuZWVucWJhcgAAAgA7/1ICeAH6AB8AKwAABSImJjU1BgYjIiYmNTQ2NjMyFhc3MxEUFjMyNjcVBgYlMjY1NCYjIgYVFBYCQB0sGRtbQ0VpPDxpRUNdGQ4oGRsNGAsNG/7aU2FiUlNlZa4VNC2OKTk9dFJSdD05K1r92SUiBwcwBwfScmFhcm5lZW4AAAEAogAAAggB9gASAAAzETMXNjYzMhYXFSYmIyIGBhUVoigQIHtJEisNFi0UPGI7AfB9QUIFAzwGBzJlTtr//wCiAAACCAK4AiYAuwAAAAYBRzEA//8AogAAAggCoQImALsAAAAGAU7/AAABAG7/9AIKAfoAKgAABSImJic3FhYzMjY1NCYnJyYmNTQ2NjMyFhcHJiYjIgYVFBYXFxYWFRQGBgFELFdDEDUOVEBGS0c3T0BMMVY2RmQUMw1OMjhPOS1PTlY0WQwaNysULjI1KS8nDBEONzkpPSE0LxQjJCspIiUKERA9QS1CIwD//wBu//QCCgK4AiYAvgAAAAYBRzAA//8Abv/0AgoCoQImAL4AAAAGAU7+AAABAG7/TwIKAfoASQAABSImJzcWFjMyNjU0JiMiBiMiJjc3JiYnNxYWMzI2NTQmJycmJjU0NjYzMhYXByYmIyIGFRQWFxcWFhUUBgYHBzY2MzIWFhUUBgYBPBMtEQ4VHQ8cFBIXCxcICwUHGzxqFTUOVEBGS0c3T0BMMVY2RmQUMw1OMjhPOS1PTlYxVTYXChEEFRsOEiexDgoZCgccCg4QBhIKLAU8OhQuMjUpLycMEQ43OSk9ITQvFCMkKykiJQoRED1BLEAkAiQCAhAZDg8lGv//AG7/GAIKAfoCJgC+AAAABgFY/QAAAQBi//ICQgKoAC8AAAUiIicnFhYzMjY2NTQmJiMjNTI2NTQmIyIGBhURIxE0NjYzMhYWFRQGBxYWFRQGBgFGBw4IDwwWCz5YLzxlPgxNS008KEYqNi1cRzpULiw3UGdDcg4BMAEBJ0w5N1EuMEEoJzUfSD7+LQHVPF84J0AkKUAUEG9US2EvAAEAggAAAf0CbAAUAAAhIiYmNREjNTM1MxUzFSMRFBYzMxUBWSguE25uNtfXFSJuEjIwAVAsfHws/rErGjD//wCCAAAB/QL8AiYAxAAAAAYBS0UuAAEAgv9PAf0CbAAzAAAFIiYnNxYWMzI2NTQmIyIGIyImNzcmJjURIzUzNTMVMxUjERQWMzMVIwc2NjMyFhYVFAYGAUYTLREOFR0PHBQSFwsXCAsFByMrIG5uNtfXFSJuax8KEQQVGw4SJ7EOChkKBxwKDhAGEgo4BTA+AVAsfHws/rErGjAwAgIQGQ4PJRoA//8Agv8YAf0CbAImAMQAAAAGAVgHAAABAHb/9AH/AfAAFAAABSImNREzERQWFjMyNjURMxEjJwYGASVeUTYYNzBFWTYoDBFRDGZPAUf+yixEJmBYART+EFAhOwD//wB2//QB/wK4AiYAyAAAAAYBRzAA//8Adv/0Af8CpwImAMgAAAAGAUz+AP//AHb/9AH/Aq8CJgDIAAAABgFA/gD//wB2//QB/wK4AiYAyAAAAAYBRcsA//8Adv/0Af8CtwImAMgAAAAGAUkqAP//AHb/9AH/AosCJgDIAAAABgFW/gAAAQB2/1gB/wHwACcAAAUiJjURMxEUFhYzMjY1ETMRBgYVFBYzMjY3FQYGIyImJjU0NjcnBgYBJV5RNhg3MEVZNigtHhUKEQcPFQwXJhUtKwoRUQxmTwFH/sosRCZgWAEU/hANLRoWFQQDJwYDEiEXIzMWQiE7//8Adv/0Af8C+wImAMgAAAAGAVL+AAABAEIAAAI2AfAABwAAIQMzEzMTMwMBJ+U7vwS8OuUB8P5YAaj+EAAAAQAjAAACVQHwAA8AADMDMxMzEzMTMxMzAyMDIwOkgTZhBGUyaQReNYAtagRpAfD+bQGT/m8Bkf4QAaL+Xv//ACMAAAJVArgCJgDSAAAABgFHMgD//wAjAAACVQKnAiYA0gAAAAYBTAAA//8AIwAAAlUCrwImANIAAAAGAUAAAP//ACMAAAJVArgCJgDSAAAABgFFzQAAAQBOAAACKwHwAA0AADM3JzMXMzczBxcjJyMHTsnCQKQEqD/CyUGtBKz989HR9PzZ2QABAEL/XgI2AfAAEgAAFzUzMjY3NwMzEzMTMwEOAyNiTSIfECHfO78EvDr++AoUGygfojAVIkYB5f5ZAaf9xRYhFgoA//8AQv9eAjYCuAImANgAAAAGAUcyAP//AEL/XgI2AqcCJgDYAAAABgFMAAD//wBC/14CNgKvAiYA2AAAAAYBQAAA//8AQv9eAjYCuAImANgAAAAGAUXNAAABAGkAAAIYAfAACQAAMzUBITUhFQEhFWkBY/6lAZ7+nQFsMAGQMDD+cDAA//8AaQAAAhgCuAImAN0AAAAGAUc9AP//AGkAAAIYAqECJgDdAAAABgFOCwD//wBpAAACGAKvAiYA3QAAAAYBQgsAAAIAqAFPAc0CtQAcACYAAAEiJjU0Njc0JiYjIgYHJzY2MzIWFRUUFhcjJwYGJzI2NTUGBhUUFgEWMzt0dAckKiIyCCoLRjQ4SwcJLw4VPyA6OWZPIAFPLy46NwcWMCIeGwklNEJQZisqETMgGyZHLhQHJiccGQACAJ4BTwHaArUADwAbAAABIiYmNTQ2NjMyFhYVFAYGJzI2NTQmIyIGFRQWATsoSC0tSCgoSS4uSSgxPDwxMDs7AU8nTz08UCcnUDw9TycpSz8/S0s/P0sAAgAjAAACVQKcAAMABwAAMxMzEyUhAyMj/Dv7/hgBns0EApz9ZDACMQAAAQAdAAACWwKoACsAADM1MzUuAjU0PgIzMh4CFRQGBgcVMxUjNT4CNTQmJiMiBgYVFBYWFxUdqzFKKCtNZTo6ZU0rKEkyq9sxSSk/aT8/aT8pSjAwQxlTaTg+bFEtLVFsPjhpUxlDMJMQRmA2R3BCQnBHNmBGEJMAAQCB/14CLQHwAB4AABcRMxEUFhYzMjY1ETMRFBYzMxUjIiYnDgIjIiYnFYE2FjQtQVM2DxwKDDclAwsoPCooQAqiApL+yixEJmBYART+cBwWLigmFSkcGhbGAAABAEkAAAIgAfAAFAAAMxEjNSEVIxEUFjMzFSMiJiY1ESMRkEcB11ISHyElLSsM0QHELCz+oyUSMBQ3NAFF/jwAAQEI//QBcABcAA8AAAUiJiY1NDY2MzIWFhUUBgYBPA4YDg4YDg8XDg4XDA4YDg8XDg4XDw4YDgABAQj/dgFxAFwADwAABTcmJjU0NjYzMhYVFAYHBwEIMRQcDhgOFh4CBTmKfgIdFQ8XDh4WBA4LlQD//wEI//QBcAH9AiYA6gAAAAcA6gAAAaH//wEI/3YBcQH9AiYA6wAAAAcA6gABAaEAAwA2//QCQgBcAAsAFwAjAAAXIiY1NDYzMhYVFAYzIiY1NDYzMhYVFAYzIiY1NDYzMhYVFAZqFh4eFhYeHrwWHh4WFh4evBYeHhYWHh4MHhYWHh4WFh4eFhYeHhYWHh4WFh4eFhYeAAACAQ3/9AFrApwABQARAAAlAzUzFQMHIiY1NDYzMhYVFAYBLQw2DA8THBwTFBsbqgFHq6v+ubYcExQbGxQTHAAAAgEN/1YBawH+AAUAEQAABTUTMxMVAyImNTQ2MzIWFRQGASEMHgwbExwcExQbG6qrAUf+uasCShwTFBsbFBMcAAIAhv/0AgUCqAAhAC0AACU1NDY2NzY2NTQmIyIGBgcnPgIzMhYWFRQGBgcOAhUVByImNTQ2MzIWFRQGARAQKSctMk06MTwdAzUGNVU0LlU4HDkqHRwHGxMcHBMUGxuiKCY0Lh0iSCw2PSg5GgkxSCkkSDcoPzsjGB8gGyyuHBMUGxsUExwAAgBz/0oB8gH+ACEALQAABSImJjU0NjY3PgI1NTMVFAYGBwYGFRQWMzI2NjcXDgIDIiY1NDYzMhYVFAYBLi1WOB04Kh4bBzYPKictMk06MTweAjUFNlUVExwcExQbG7YkSTYpPjsjGR4hGiwoJTUuHSJILDY9KDoZCTBJKQJWHBMUGxsUExwA//8BCADJAXABMQIHAOoAAADV//8BCADJAXABMQIHAOoAAADV//8BCADJAXABMQIHAOoAAADVAAEAlgBYAeIBpAAPAAAlIiYmNTQ2NjMyFhYVFAYGATwuSy0tSy4uSy0tS1gtTC0uSy0tSy4tTC0AAQCNAU4B7AKaAA4AABMnNyc3FzUzFTcXBxcHJ+gkVo0NjSuNDY1YI1gBThp3Kistk5MtKyp3GnUAAAIAJgAAAlICnAAbAB8AADM3IzczNyM3MzczBzM3MwczByMHMwcjByM3Iwc3MzcjhRt6B3gZeQd4Gy8btxsvG3kHdxl4B3cbLxu3GyC4GbjGK7orxsbGxiu6K8bGxvG6AAEAPP+mAjwCxAADAAAXATMBPAHLNf41WgMe/OIAAAEAPP+mAjwCxAADAAAFIwEzAjw1/jU1WgMeAAABALMA3QHFARQAAwAANzUhFbMBEt03NwABAGkA3AIPAREAAwAANzUhFWkBptw1NQABACMA3AJVAREAAwAANzUhFSMCMtw1NQAB//7/ywJ6AAAAAwAABzUhFQICfDU1NQABAMP/XgHiAsQADQAABSYmNTQ2NzMGBhUUFhcBmmdwcGdIb3l5b6Jb43V141tf4XNz4V8AAQCW/14BtQLEAA0AABc2NjU0JiczFhYVFAYHlm95eW9IaG9vaKJf4XNz4V9b43V141sAAAEAl/9eAdUCxAAlAAAFIiYmNTU0Jic1NjY1NTQ2NjMzFSMiBhUVFAYHFRYWFRUUFjMzFQFaLCsNJTo6JQ0rLHuAGBIhIiIhEhiAohMpIeM0KAIqAig04yEpEyoSFuA9NwoGCjY+4BYSKgABAKP/XgHhAsQAJQAAFzUzMjY1NTQ2NzUmJjU1NCYjIzUzMhYWFRUUFhcVBgYVFRQGBiOjgBgSISIiIRIYgHstKg0lOjolDSotoioSFuA+NgoGCjc94BYSKhMpIeM0KAIqAig04yEpEwAAAQDU/14B1QLEAAcAABcRIRUjETMV1AEBy8uiA2Yo/OooAAEAo/9eAaQCxAAHAAAXNTMRIzUhEaPLywEBoigDFij8mv//AQj/dgFxAFwCBgDrAAAAAgCw/3YByABcAA8AHwAAFzcmJjU0NjYzMhYVFAYHBzM3JiY1NDY2MzIWFRQGBwewMRQcDhgOFh4CBTmGMRQcDhgOFh4CBTmKfgIdFQ8XDh4WBA4LlX4CHRUPFw4eFgQOC5UAAAIAsAG2AcgCnAAPAB8AAAEiJjU0Njc3MwcWFhUUBgYjIiY1NDY3NzMHFhYVFAYGAZMWHgMEOSkxFBwOF74WHgMEOSkxFBwOFwG2HhYFDQuVfgEeFQ4YDh4WBQ0LlX4BHhUOGA4AAAIAsAHCAcgCqAAPAB8AAAE3JiY1NDY2MzIWFRQGBwcjNyYmNTQ2NjMyFhUUBgcHAV8xFBwOGA4WHgIFOdgxFBwOGA4WHgIFOQHCfgIdFQ8XDh4WBA4LlX4CHRUPFw4eFgQOC5UAAAEBBwHCAXACqAAPAAABIiY1NDY3NzMHFhYVFAYGATsWHgMEOSkxFBwOFwHCHhYFDQuVfgEeFQ4YDgABAQgBwgFxAqgADwAAATcmJjU0NjYzMhYVFAYHBwEIMRQcDhgOFh4CBTkBwn4CHRUPFw4eFgQOC5UAAgB0ACgCBAHMAAUACwAAJSc3MwcXIyc3MwcXAciUlDyUlPyUlDyUlCjS0tLS0tLS0gACAHQAKAIEAcwABQALAAAlNyczFwcjNyczFwcBNJSUPJSU/JSUPJSUKNLS0tLS0tLSAAEA1AAoAaQBzAAFAAAlJzczBxcBaJSUPJSUKNLS0tIAAQDUACgBpAHMAAUAADc3JzMXB9SUlDyUlCjS0tLSAAACAM0BsAGrApwAAwAHAAATJzMHMyczB94RORGOETkRAbDs7OzsAAEBIAGwAVkCnAADAAABJzMHATEROREBsOzsAAABAGH/VAIXArYAIwAAFyImJzUWFjMyNjY1ESM1MzU0NjYzMxUjIgYVFTMVIxEUDgKcESEJCCYWKDYcubkKKzGSnRwPyMgfNT+sBgQwBQokRDABsClGLzgZLR4sTyn+akhYLRAAAQBh//YCFgKcACIAABciJiY1NDY2MzIXBxEzHgIXHgIVFAYHJy4CJzcRFAYGwxstGhsuHC4bByMDHjMjHjUhFRcDCDlVMw0cLwobLhwcLhsgBQIBIjQwHBg0PigTOB4BO1c8DxP+nyg2GwAAAgAP/6MCaQJZADwASgAABSIuAjU0NjYzMh4CFRQGBiMiJicGBiMiJiY1NDY2MzIWFxUUFjMyNjY1NCYmIyIGBhUUFhYzMjY3FQYnMjY1NSYmIyIGBhUUFgFGO29ZNE+LWTBoWDcmOyEfLgkVOx8fOiUyUCsaNRkhFBwiED5wTEt1Q0d2Rh5AHDlaJTgNGBAaOSg0XSxXg1homlYhSXlXS1wqJBgkGyRJNUtZJwsJ6CUcNEwkUXlCR4ZeZodCERI1HNNBL50FAhpEQDs7AAADABb/9QJpAqkAJAAvADsAABciJiY1NDY2NyYmNTQ2NjMyFhYVFAYGBxc2NjczFAYHFyMnBgYnMjY3JwYGFRQWFhM2NjU0JiMiBhUUFuU+XjMwUzIfLydFLSRFLStCIqALDAE2FBSGRlwnc0hBYB66RFosRkIzRT0lLDgsCy1UOjVPOhUiTCkoQSYcPjMrQS0Psx9HLTdfKJZoNj0wODHSHlA/MD8fAXATQjExLzUpJT0AAQBl/14CHQKcABAAAAURJiY1NDY2MzMVIxEjESMRARxYXzZiQ90kNXOiAcYNaEY0VjMv/PEDD/zxAAIAYf9TAhcCqAA3AEUAAAUiJic3FhYzMjY1NCYmJycmJjU0NjcmJjU0NjYzMhYXByYmIyIGFRQWFhcXFhYVFAYHFhYVFAYGEzY2NTQmJycGBhUUFhcBOUZiEDoLOTo0RBIwLl9GO0RDMCIwTitHYRA6Cjo6NEQSMC5fRzpEQzAiME0DNUk4OGY0Sjg4rUE7DCkyMyQTICMZNCZEMy5IHCA3Iik8IUE7DCkyMyQTHyQZNCZEMy5IHB84Iik8IQEXFTsmJjQfOBU7JiY0HwAAAwAU//MCZAKpABMALgA+AAAFIi4CNTQ+AjMyHgIVFA4CJyImNTQ2MzIWFwcmJiMiBhUUFjMyNjcXDgIHMjY2NTQmJiMiBgYVFBYWATxDbU4qKk5tQ0NtTioqTm0+RFVXQzI4DTINJBcmODglHSINMgkeLypLbz09b0tLbz09bw02X35ISH5fNjZffkhIfl82nGVbXGM0HBQeGUhKR0wZHhQRJRpsUYhSU4dRUYdTUohRAAQAFP/zAmQCqQATACMAMgA7AAAFIi4CNTQ+AjMyHgIVFA4CJzI2NjU0JiYjIgYGFRQWFicRMzIWFhUUBgcXIycjFTUzMjY1NCYjIwE8Q21OKipObUNDbU4qKk5tQ0tvPT1vS0tvPT1vIW4oNx0jKFw+VTI1JCMpIzANNl9+SEh+XzY2X35ISH5fNjBRiFJTh1FRh1NSiFF/AW8cMiIjOQ6VjIy5JCImHgAAAgAMAVcCawKcAAcAFwAAExEjNTMVIxEzETMTMxMzESMRIwMjAyMRZ1viW49BYgRgQiwEYCliBAFXASAlJf7gAUX+8QEP/rsBD/7xAQ/+8QACAMIBtQG2AqkADwAbAAABIiYmNTQ2NjMyFhYVFAYGJzI2NTQmIyIGFRQWATwhOCEhOCEiNyEhNyIhLi4hIC8vAbUhNyEiOCEhOCIhNyEqLyAiLS0iIC8AAQEh/14BVwNGAAMAAAURMxEBITaiA+j8GAACASH/XgFXA0YAAwAHAAAFETMRAxEzEQEhNjY2ogGL/nUCXQGL/nUAAQBlAAACEwKcAAsAACERIzUzNTMVMxUjEQEivb01vLwBvTOsrDP+QwAAAQBjAAACFQKcABMAACE1IzUzNSM1MzUzFTMVIxUzFSMVASXCwsLCL8HBwcGrPMw9rKw9zDyrAAACADv/9AI8AfUAGQAiAAAFIi4CNTQ+AjMyFhYVIRUWFjMyNjcXBgYDITUmJiMiBgcBOylaTTAjQ148R3RG/lkhVDE4XSEPI2biAU4hVjExVCEMHkFoSSdUSS1Fc0a3HiIsJQIqMQEQox8jIx8AAAIAev+mAg4CSgAdACUAAAU1LgI1NDY2NzUzFR4CFwcmJicRNjY3FwYGBxUnEQ4CFRQWATU6VC0wVDclMUUtDTISPi4uQRE0FVpFJSI7JUdaUAdKbz9BbkgIVlQBIC8WEx0oAv5iAywdEyVCBE6DAZgIM1U6UHMAAAIAUwBZAiUCKQAjADMAADcnNyYmNTQ2Nyc3FzY2MzIWFzcXBxYWFRQGBxcHJwYGIyImJzcyNjY1NCYmIyIGBhUUFhZvHEEXGxsXQRxBHUcoKEgcQRxBFxsbF0EcQRxIKChHHYwuSywsSy4uSywsS1kaQR1HKSlIHEEaQBcaGhdAGkEcSCkpRx1BGkAXGhoXAi1LLi5LLS1LLi5LLQAAAwBJ/6YCMAL2ACkAMQA5AAAFNS4CJzcWFhcRJy4CNTQ2Njc1MxUeAhcHJiYnERceAhUUBgYHFTU2NjU0Ji8CNQYGFRQWFwEhK1lFDzQRXDchMEssM1s6JitQQBM1FVgsJT5XLz9qQExmRFYYJjxVRDdaTwMiQTEUOj0GAScIDCdBMTBMMARPTgEaMSYVKS0D/vsJDyxFNzlUMQNOfANNRjA8FgY/+gZBPCs6DQAAAQAc//MCUQKrAC0AAAUiJiYnIzczJjQ3IzczPgIzMhYXByYmIyIGByEHIwYXMwcjHgIzMjY3FwYGAWtHaD8MVRQ9AgJRFEIOTGo7R3cfMBRVRk5sEAEMFPwEBNEUtws0UTZIVxYvH3oNQXRNJxkxGSdWdDtOSxI0R2duJzEyJztgN0cxEkxKAAEAZ//0AisCqQA+AAAXJz4DNTQmJyM1MyYmNTQ2NjMyFhcHJiYjIgYGFRQWFzMVIxYWFRQGBzY2MzIWFjMyNjcXBgYjIiYmIyIGexIOKy0eCw1uWxMZMVc6U2oOPA5JNR1DLx0S2MYOBycmCxMIHzpBKBQmJQ8oMhEmPTwnHzoKJwcgMD4kFzsiJytEIzVKJ0s+DDcuEjEwI0crJyYyEzlKGAUCFBQKDSsQCxMUEQAAAQA1AAACQwKcABcAACE1IzUzNSM1MwMzEzMTMwMzFSMVMxUjFQEfoqKim+M8ygTJO+KZn5+fXCdiJwGQ/poBZv5wJ2InXAD//wEIANMBcAE7AgcA6gAAAN8AAQAuAAACSgKcAAMAADMBMwEuAdRI/iwCnP1kAAEARAAAAjQB8AALAAAhNSM1MzUzFTMVIxUBI9/fMt/f3zLf3zLfAAABAEQA4QI0ARMAAwAANzUhFUQB8OEyMgABAHEALQIHAcMACwAANyc3JzcXNxcHFwcnlCOoqCOoqCOoqCOoLSOoqCOoqCOoqCOoAAMARAAcAjQB1QADAA8AGwAANzUhFQciJjU0NjMyFhUUBgMiJjU0NjMyFhUUBkQB8PgYISEYGCAgGBghIRgYICDfMjLDIRgXISEXGCEBSB8YGCIiGBgfAAACAEQAhwI0AW0AAwAHAAATNSEVBTUhFUQB8P4QAfABOzIytDIyAAEARAAAAjQB8AATAAAzNyM1MzchNSE3MwczFSMHIRUhB29fiq1b/vgBK1w9XIirWwEG/tdehzKCMoODMoIyhwABAFUACQIjAeYABgAANzUlJTUFFVUBh/55Ac4JPLKzPNYxAAABAFUACQIjAeYABgAAJSU1JRUFBQIj/jIBzv55AYcJ1jHWPLOyAAIAWgAAAh4B4wAGAAoAADc1JSU1BRUBNSEVWgF2/ooBxP48AcRkPIKEPacy/vY1NQAAAgBaAAACHgHjAAYACgAAJSU1JRUNAjUhFQIe/jwBxP6KAXb+PAHEZKYypz2EgqA1NQACAE4AAAIqAfAACwAPAAAlNSM1MzUzFTMVIxUFNSEVASPV1TLV1f75AdxkrTKtrTKtZDU1AAACAEsAZwItAaAAFwAvAAA3JzY2MzIeAjMyNjcXBgYjIi4CIyIGJyc2NjMyHgIzMjY3FwYGIyIuAiMiBnwxBzo6Hj8+OxkhIgQxBzo6Hj8+OxkhIgQxBzo6Hj8+OxkhIgQxBzo6Hj8+OxkhImcKMT4UGRQlIgoxPhQZFCWYCjE+FBkUJSIKMT4UGRQlAAEASABsAjABfgAFAAAlNSE1IREB9/5RAehs3TX+7gAAAQBKAMQCLAFDABcAADcnNjYzMh4CMzI2NxcGBiMiLgIjIgZ7MQc6Oh4/PjsZISIEMQc6Oh4/PjsZISLECjE+FBkUJSIKMT4UGRQlAAEAZwE3AhECnAAGAAATEzMTIwMDZ7o2ujqbmwE3AWX+mwEu/tIAAwANAG4CawGSABcAJQAzAAA3IiY1NDYzMhYXNjYzMhYVFAYjIiYnBgYnMjY2Ny4CIyIGFRQWITI2NTQmIyIGBgceApVDRUVDMk4nJ04yQ0VFQzJOJydOMhclLCEhLCUXJzAwAXUnMDAnFiYsISEsJm5TPz9TPSoqPVM/P1M9Kio9MQ8qKCgqDzonJzo6Jyc6DyooKCoPAAABAJr/VAHfAqoAJwAAFyImNTQ2MzIWFRQHPgI1Ez4CMzIWFRQGIyImNTQ3IgYGBwMUBgbkIycZFRYaAwgSDwQBIDQeIycZFRYaAwcTDgEEIDSsHxYSGhoWCAgBDiopAiFMTBofFhIaGhYJBw8qKf3fS00aAAEAW/9eAh0CnAAHAAAXESERIxEhEVsBwjn+r6IDPvzCAwD9AAAAAQBa/14CHgKcAAsAABc1EwM1IRUhEwMhFVr6+gHE/n34+AGDojgBZwFnODj+mf6ZOAABAEb/XgJaApwACAAABQMjNTMTEzMDASiLV4CD1jvuogFPNP7EAvf8wgACAFf/9AIhAqgAHQAtAAAFIi4CNTQ+AjMyFhcuAwc1Mh4DFRQOAicyNjY1NCYmIyIGBhUUFhYBQCdRRispQ1AmPl4TCERhai1liVQsDy9ITCIoTzU1TygnUDU1UAwdPWJGRWE8HDo1SmE1EwMzMFJpdDlacTsWMSdbTUxaKChaTE1bJwAFABD/8gJoAqoADwAbAB8ALwA7AAATIiYmNTQ2NjMyFhYVFAYGJzI2NTQmIyIGFRQWAwEzAQUiJiY1NDY2MzIWFhUUBgYnMjY1NCYjIgYVFBamK0MoKEMrK0MoKEMrKjs7Kio7OxIBbzX+kQEzKkQoKEQqK0MoKEMrKjs7Kio7OwF8KEUqKkQpKUQqKkUoMDwrKzw8Kys8/lQCnP1kDihFKipFKChFKipFKDA8Kys8PCsrPAAHABz/8gJcAqoADwAbACsANwBHAFMAVwAAEyImJjU0NjYzMhYWFRQGBicyNjU0JiMiBhUUFhMiJiY1NDY2MzIWFhUUBgYnMjY1NCYjIgYVFBYFIiYmNTQ2NjMyFhYVFAYGJzI2NTQmIyIGFRQWJTUlFaQlPiUlPiUmPSUlPSYnNTUnJzU1JyU+JSU+JSY9JSU9Jic1NScnNTUBVyU+JSU+JSY9JSU9Jic1NScnNTX+dAI2AZwkPiUmPSQkPSYlPiQsNiUmNTUmJTb+KiQ+JSY9JCQ9JiU+JCw2JSY1NSYlNiwkPiUmPSQkPSYlPiQsNiUmNTUmJTbqMMswAAACAGv/wQINArgAAwAHAAAFAxMTAxMDAwE90tLQ0JSUlj8BewF8/oT+9wEJAQr+9gACAMACVwG4Aq8ACwAXAAABIiY1NDYzMhYVFAYjIiY1NDYzMhYVFAYBjBIaGhISGhqyEhoaEhIaGgJXGhISGhoSEhoaEhIaGhISGgD//wDAAuEBuAM5AgcBQAAAAIoAAQEPAlUBaQKvAAsAAAEiJjU0NjMyFhUUBgE8EhsbEhIbGwJVGhMTGhoTExoAAAEBDwLhAWkDOwALAAABIiY1NDYzMhYVFAYBPBIbGxISGxsC4RoTExoaExMaAAABAQwCVwFsArcACwAAASImNTQ2MzIWFRQGATwTHR0TFBwcAlcdExQcHBQTHQAAAQD3AjkBggK4AAsAAAEnJiY1NDYzMhYXFwFUORQQDgwMEgtIAjkzExINCw8RDmAAAQDxAuMBhwNHAAsAAAEnJiY1NDYzMhYXFwFWOhgTEAoKEQ5TAuMiDg8NDAwLDUwAAQD3AjkBggK4AAsAABM3NjYzMhYVFAYHB/dICxIMDA4QFDkCOWAOEQ8LDRITMwAAAQDxAuMBhwNHAAsAABM3NjYzMhYVFAYHB/FTDhEKCw8TGDoC40wNCwwMDQ8OIgAAAgC6AjkBvwK3AAsAFwAAEzc2NjMyFhUUBgcHMzc2NjMyFhUUBgcHukcLEgwMCxAUOVRHCxIMDAsQFDkCOWAOEA0LDBMTNGAOEA0LDBMTNP//ALoC5QG/A2MCBwFJAAAArAABARMCHAFmAs4ACwAAATc2NjMyFhUUBgcHARMUBA4QChMFBicCHIEZGAsPBRERcQABAMACQAG4AqcACwAAEzc2NjMyFhcXIycHwFALFQ0MFQpQN0ZEAkBSCwoKC1I8PP//AMAC4wG4A0oCBwFMAAAAowABAMACOgG4AqEACQAAASInJzMXNzMHBgE9GBVQN0RGN1AVAjoVUjw8UhUA//8AwALeAbgDRQIHAU4AAACkAAEAyQI8Aa8CnwANAAABIiYnMxYWMzI2NzMGBgE8Lj0IKAUmICAlBigIPAI8OygVJSUVKDsA//8AyQLjAa8DRgIHAVAAAACnAAIA3QI9AZsC+wAPABsAAAEiJiY1NDY2MzIWFhUUBgYnMjY1NCYjIgYVFBYBPBorGhorGhsrGRkrGxcgIBcWISECPRorGhorGhorGhorGighFhcgIBcWIQACAN0ChQGbA0MADwAbAAABIiYmNTQ2NjMyFhYVFAYGJzI2NTQmIyIGFRQWATwaKxoaKxobKxkZKxsXICAXFiEhAoUaKxoaKxoaKxoaKxooIRYXICAXFiEAAQCxAkABxwKUABsAAAEiJiYjIgYHIzY2MzIWFjMyNjc2NjMyFhUUBgYBehcoJBIRGQIoCDEdGCUiExARBwULBgYKECICQBQUFBMtIxMUEAsIBwgLByAa//8AsQLpAccDPQIHAVQAAACpAAEAvQJfAbsCiwADAAATNTMVvf4CXyws//8AvQLyAbsDHgIHAVYAAACTAAEA/f8YAXv/zAAPAAAFJz4CNTQmJzcWFhUUBgYBGx4RJRsRFCsUEx0s6BkCDh8ZEyIMEhEjFyAuGQABAOj/TwGRABQAIAAABSImJzcWFjMyNjU0JiMiBiMiJjc3Fwc2NjMyFhYVFAYGATkTLREOFR0PHBQSFwsXCAsFBy4eIwoRBBUbDhInsQ4KGQoHHAoOEAYSCksONgICEBkODyUaAAABAPv/WAF9ABEAFQAABSImJjU0NjY3FwYGFRQWMzI2NxUGBgFNFyYVFSsfIygtHhUKEQcPFagSIRcZJyAPEQ0tGhYVBAMnBgMAAAEA+/9YAX0ACgAVAAAFIiYmNTQ2NxcOAhUUFjMyNjcVBgYBTRcmFS4iMhonFB8TCRIIDxWoEiEXJTIRCggbIBEXFAQDJwYD//8AwAJXAbgCrwAGAUAAAP//AQ8CVQFpAq8ABgFCAAD//wD3AjkBggK4AAYBRQAA//8A9wI5AYICuAAGAUcAAP//ALoCOQG/ArcABgFJAAD//wDAAkABuAKnAAYBTAAAAAEAuAJ0AcACpwADAAATNSEVuAEIAnQzMwD//wDAAjoBuAKhAAYBTgAA//8AyQI8Aa8CnwAGAVAAAP//AN0CPQGbAvsABgFSAAD//wCxAkABxwKUAAYBVAAA//8AvQJfAbsCiwAGAVYAAP//AOj/TwGRABQABgFZAAD//wD7/1gBfQARAAYBWgAAAAMAQP/zAjgCqwAPABoAJgAABSImJjU0NjYzMhYWFRQGBicyNjcBBgYVFBYWAwE2NjU0LgIjIgYBPE1xPj5xTU1xPj5xTSlGGv7WEhM0WlABKhETHjVJKihGDU+bcnOaT0+ac3KbTzAeIQG0I2NBbYQ7Ahr+TSNiQFJyRyEeAAEAeAAAAgoCnAANAAAzNTMRIzUyNjY3MxEzFXq0tjtQMgwjpjAB5iYQKSf9lDAAAAEAYgAAAigCqAAaAAAzNT4CNTQmIyIGByc2NjMyFhYVFA4CByEVYoWjTE1DN1gOOBFvVjpZNDtlfEIBeDFmmYFAOk09RBFIWCpROz94cWcvNAABAGX/9AImAqgAMQAABSImJic3FhYzMjY2NTQmJiMjNTMyNjY1NCYmIyIGByc+AjMyHgIVFAYHFhYVFAYGAUFKXC8HNgtOTTJPLTJTMhkZIkkzKEAlRlQKNQs1WT8oRzYfOkBLSUBoDDJOKQo2TSRCLDRCIDAXOzQnNBtMMw4pSi4VKz4pNlcPDGM+QFgsAAACAD8AAAI6ApwACgAOAAAhNSE1ATMRMxUjFSUhESMBjv6xAUY/dnb+rwEbBLI+Aaz+SDKy5AFyAAEAaP/0Ah8CnAAjAAAFIiYmJzcWFjMyNjY1NCYmIyIGBycTIRUhBzY2MzIWFhUUBgYBQEhZLwg1C0tQK0wvMUwnMEwXMykBW/7RHRpLLztgOUBlDDFNKww6SytSOj9QJiwlDQFQNOshIjdmSExnNAACAGf/9AIpAqgAHgAqAAAFIiYmNTQ+AjMyFhcHJiYjIgYGBzY2MzIWFhUUBgYnMjY1NCYjIgYVFBYBS0pmNBg4X0ZFWRM0D0QuPFMtAxRhRz9fNjVjRUtbW0pNWloMR4dhSotvQT8rFCMrVI5YM0Q5ZUQ5ZkAwYkxQY2RPTGIAAAEAZgAAAhoCnAAGAAAzASE1IRUBvQEm/oMBtP7fAmg0NP2YAAMAUv/1AiYCqwAbACsAOwAABSImJjU0NjcmJjU0NjYzMhYWFRQGBxYWFRQGBicyNjY1NCYmIyIGBhUUFhYTMjY2NTQmJiMiBgYVFBYWATxGaTtJPiMqL1AxMVAvKiM+STtpRjdQLCxQNzZRLCxRNiM5IiI5IyM5IiI5CzVZNj1gFxdLLTFPLy9PMS1LFxdgPTZZNTAoQykpQygoQykpQygBWCI5IyM5IiI5IyM5IgAAAgBJAAACIwKrABQAJAAAMzcGBi4CNTQ2NjMyFhYVFAYGBwMDMjY2NTQmJiMiBgYVFBYW/ZInWFZHKkBrQkJsPxAdFKcFM1MxMVMzM1MyMlPlEwIgPVk4Qmw/P2xCJDg0IP7yAQYyUzMzUzIyUzMzUzIAAwBA//MCOAKrAA8AIQAtAAAFIiYmNTQ2NjMyFhYVFAYGJzI2NjU0LgIjIg4CFRQWFjciJjU0NjMyFhUUBgE8TXE+PnFNTXE+PnFNOVk0HjVJKipJNR40WjgWHh4WFh4eDU+bcnOaT0+ac3KbTzA7hG1SckchIUdyUm2EO/geFhYeHhYWHgABADUAAAJDApwAAwAAMwEzATUB1Dr+LAKc/WQAAwA/AAACPAKcAAgADAAkAAATNSM1MjY3MxEDATMBMzU+AjU0JiMiBgcnNjYzMhYVFAYHMxWDRBoqBytnAW81/pHbOEcjGxcTIAQwCTcqLDZLQpYBbeUgExf+0f6TApz9ZCgtPTAZFxoXGg4jKC4mLlIyLgAEAFsAAAJGApwACAAMABcAGwAAEzUjNTI2NzMRAwEzASE1IzU3MxUzFSMVJzM1I59EGioHK2cBbzX+kQFFnJwxMTGXZgIBbeUgExf+0f6TApz9ZEEsw8ItQW59AAQAIwAAAlUCqAADAA4AEgA7AAAzATMBITUjNTczFTMVIxUnMzUjJSImJzcWFjMyNjU0Jgc1FjY1NCYjIgYHJzY2MzIWFhUUBgcWFhUUBgZ5AW81/pEBRZycMTExl2YC/qAsOAoxBR8aGSIpMSwnHxQXHggvCzkrGC4dGRMaGR8yApz9ZEEsw8ItQW59hSgfDhQZGhcdGAIrAxoXFhUWFQ4gJRAkHRYjCgonFyApEwAAAQEGAWwBkAMLAAgAAAERIzUyNjczEQFgWh82CisBbAFQFh4b/mEAAAEArgFsAcsDEgAXAAATNT4CNTQmIyIGByc2NjMyFhUUBgczFa5KYS8qIRkwBTQIRDk4RWpn3wFsKT9eTiUgJR4rCC86PS88hE8rAAABAK8BZQHKAxIAKgAAASImJzcWFjMyNjU0JiYHNRY2NjU0JiMiBgcnNjYzMhYWFRQGBxYWFRQGBgE6PUQKLwgqKSQ7KT4hIDklMh4mLAkvC0o5GjwqIxwlIihCAWU9KgkcLCgnKCgLBCcDCSQiJR8iIwksOBUxKRwwEA85HCs4GwA=) format("truetype")}#__docusaurus-base-url-issue-banner-container,.call-to-action .call-to-action-icon,.docSidebarContainer_YfHR,.footer.footer--dark,.hide-desktop,.homepage .navbar__search,.sidebarLogo_F_0z,.themedComponent_mlkZ,.toggleIcon_g3eP,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.ds-dropdown-menu{background-color:var(--bg-color-code)}.navbar__search-input{font-size:var(--fontSizes-s);width:90%}.container .col article{padding:1rem 1rem 1rem 2rem}.theme-doc-sidebar-item-link-level-2{font-size:89%}body:not(.homepage) .main-wrapper{margin:0 auto;max-width:92rem;width:100%}.theme-doc-sidebar-menu{font-size:var(--fontSizes-s);font-weight:500}.menu__list-item .menu__link{padding-left:60px}.menu__list .navbar__item{display:block;margin-left:60px;margin-top:20px;padding-left:0}.menu__list-item-collapsible{font-weight:600}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/1.5rem 1.5rem}.footer{border-color:#fff;border-top:solid #fff;border-width:1px}.button,.button.light{border-style:solid;border-width:1px}.card{background-color:var(--ifm-navbar-background-color)}article .img-padding{background-color:#fff;border-radius:4px;padding:5px}article .img-in-text-right{background-color:#fff;border-radius:4px;float:right;margin:8px 8px 15px 30px}article .img-radius{background-color:#fff;border-radius:10px}.dropdown-content-sync-integration,.left{float:left}.right{float:right}.third{width:calc(33.33% - 20px)}.fifth,.padding-side-10-12,.third{padding-left:10px;padding-right:10px}.fifth{width:calc(20% - 20px)}.block h4,.full-width{width:100%}.centered{align-items:center;display:flex;flex-direction:column;justify-content:center}.pseudo-hidden{display:block;height:1px;overflow:hidden;width:1px}.underline{position:relative;z-index:5}h1 .underline{font-weight:400}.block h1 b,.block h2 b,.markdown h1{font-weight:800}.underline:after{background:var(--color-top);bottom:0;content:"";height:30%;left:0;opacity:.4;position:absolute;width:100%;z-index:-1}.block.dark,.block.fifth .box,.dark{background-color:var(--bg-color-dark)}.button{background-color:var(--color-top);border-color:var(--color-top);border-radius:8px;box-sizing:initial;color:#fff;cursor:pointer;font-size:1rem;font-weight:700;line-height:1.2;margin-right:20px;min-width:3rem;outline:#0000 solid 2px;outline-offset:2px;padding:10px 18px;text-align:center;transition:.15s ease-in-out;-webkit-user-select:none;user-select:none;will-change:box-shadow text-decoration transform}.navbar-icon,.price-calculator #price-calculator-submit{margin-right:0}.button.button-empty{background-color:unset;border-color:#fff;border-style:solid;cursor:pointer}.button.button-empty:hover{color:#fff}.button.light{background-color:var(--bg-color);border-color:var(--color-top)}#price-calculator-result a,.block.sixth a,.button.light:hover,.footer-policy div a:hover,.observe-code-example-tabs .ant-tabs-tab-btn,.package a,.trophy.twitter,footer a:visited{color:#fff}.block h1,.block h2,h2{font-size:var(--fontSizes-5xl)}.block h1,.block h2{letter-spacing:1.5px;word-spacing:-4px}h3{font-size:var(--fontSizes-xl)}.block.first.hero h1 b,.footer-nav-links a:hover,.pagination-nav a:hover,b{color:var(--color-top)}p{margin:0 0 var(--ifm-paragraph-margin-bottom);font-size:var(--fontSizes-m)}.markdown h1{color:#fff;font-size:var(--fontSizes-3xl)}.markdown h2{color:#fff;font-size:var(--fontSizes-xl);font-weight:700}.markdown h3{font-size:1.25rem;font-weight:600;margin-bottom:20px}.breadcrumbs__item--active .breadcrumbs__link,.call-to-action a b,.markdown b,.pagination-nav a,.table-of-contents__link,body,p b{color:var(--fontColor-offwhite)}.markdown a,.underline-link,p a,td a{color:#fff;font-weight:600;text-decoration-color:var(--color-top)!important;text-decoration-thickness:10%;text-underline-offset:4px;text-underline-position:from-font}.markdown a:hover,p a:hover{color:var(--color-top);text-decoration-color:var(--color-top)}body{font-weight:500}.table-of-contents{font-size:var(--fontSizes-xs)}.table-of-contents__link--active{color:var(--color-top);font-weight:500}.navbar{align-items:flex-start;border-bottom:1px solid var(--ifm-toc-border-color);display:flex;gap:10px;height:auto;justify-content:center;padding:16px 32px;z-index:10}.navbar .navbar__inner{align-items:center;display:flex;justify-content:space-between;padding:10px;width:1216px}.navbar .navbar__items--right{align-items:center;flex-direction:row-reverse;gap:20px;justify-content:center;margin-left:10%;padding:0 16px}.navbar__logo{aspect-ratio:106.93/38;height:38px}.navbar__items a{color:var(--fontColor-white);font-weight:500}.navbar__link:hover{color:#fff;text-decoration-color:var(--color-top);text-decoration-thickness:1.25px;text-underline-offset:4px}.navbar .navbar__brand{margin-left:10px;margin-right:28%}.navbar .navbar__brand b{font-size:var(--fontSizes-xl);font-weight:600;letter-spacing:-.04rem}.navbar-icon{height:30px;margin-left:8px;opacity:.9;padding:0;width:30px}.navbar__toggle{order:2;position:absolute;right:10px}.navbar-icon:hover,.star-at-github:hover{transform:scale(1.1)}.beating-first.animation,.beating-second.animation,.beating.animation{transform-origin:center center;will-change:transform}.navbar-icon-discord{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAyMyAxOSI+PGcgY2xpcC1wYXRoPSJ1cmwoI2EpIj48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTkuNSAyLjNBMTkgMTkgMCAwIDAgMTQuNyAxbC0uNiAxcS0yLjYtLjQtNS4yIDBMOC4zLjlxLTIuNS4zLTQuOCAxLjRjLTMgNC41LTMuOCA4LjgtMy40IDEzcTIuNyAyLjEgNS44IDMgLjgtMSAxLjMtMmwtMi0xcS4zIDAgLjUtLjNhMTQgMTQgMCAwIDAgMTEuNiAwbC41LjQtMiAuOSAxLjMgMnEzLS45IDUuOC0zIC42LTcuMy0zLjQtMTNNNy43IDEyLjdjLTEuMiAwLTItMS0yLTIuMlM2LjQgOCA3LjYgOHExLjguMiAyIDIuNGMwIDEuMi0uOSAyLjItMiAyLjJtNy42IDBxLTEuOC0uMi0yLTIuMmMwLTEuMy45LTIuNCAyLTIuNHEyIC4yIDIgMi40YzAgMS4yLS44IDIuMi0yIDIuMiIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik0wIC45aDIzdjE3LjRIMHoiLz48L2NsaXBQYXRoPjwvZGVmcz48L3N2Zz4=) 50%/contain no-repeat}.navbar-icon-github{background:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTYgMjU2Ij48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMTUgM2ExMiAxMiAwIDAgMC0zIDIzLjZWMjRoLTEuNXEtMS4zIDAtMi0xYy0uMy0uNy0uNC0xLjktMS4zLTIuNXEtLjMtLjUuMi0uNS45LjMgMS42IDEuMmMuNS43LjcuOCAxLjYuOGwxLjctLjFxLjUtMS40IDEuNi0yYy00LS40LTYtMi40LTYtNVE4IDEzIDkuNCAxMS41Yy0uMi0xLS42LTIuOS4xLTMuNiAxLjggMCAzIDEuMiAzLjIgMS41YTkgOSAwIDAgMSA1LjggMGMuMy0uMyAxLjQtMS41IDMuMi0xLjUuNy43LjMgMi43IDAgMy42UTIzIDEzIDIzIDE0LjhjMCAyLjctMiA0LjctNS45IDUuMSAxLjEuNiAxLjkgMi4yIDEuOSAzLjR2M0ExMiAxMiAwIDAgMCAxNSAzIiBmb250LWZhbWlseT0ibm9uZSIgZm9udC1zaXplPSJub25lIiBmb250LXdlaWdodD0ibm9uZSIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOm5vcm1hbCIgdGV4dC1hbmNob3I9Im5vbmUiIHRyYW5zZm9ybT0ic2NhbGUoOSkiLz48L3N2Zz4=) 50%/contain no-repeat}.header-space{height:calc(var(--space-between-blocks) + 110px);width:100%}.content{margin-left:auto;margin-right:auto;max-width:min(1120px,94%);width:100%}.slick-slider{padding-bottom:50px}.slider-content{background:var(--bg-color-dark);display:flex;flex-direction:column;padding:16px}.slider-content h3{font-size:1.2em;font-weight:400;line-height:28px}.slider-content .slider-profile .slider-info{margin-left:16px}.slider-content .slider-profile .developer b{color:#fff;font-weight:800}.device{align-items:center;background-repeat:no-repeat;display:flex;flex-direction:column}.device .beating-color{background-color:#ed168f;transition:background-color .1s linear}.device.desktop .beating-color{align-items:center;border-radius:9% 9% 0 0/19% 19% 0 0;display:flex;height:53.1%;justify-content:center;margin-left:auto;margin-right:auto;margin-top:2.57%;width:95.1%}.device.desktop .beating.logo{width:42%}.device.server{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHZlcnNpb249IjEuMiIgdmlld0JveD0iMCAwLjQgNjAgNTkuMSI+PHBhdGggZmlsbD0iI2ZmZiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNLjggMjEuNWg1OC40Yy41LjcuOCAxLjYuOCAyLjZ2MTEuOGMwIDEtLjMgMS45LS44IDIuNkguOGMtLjUtLjctLjgtMS42LS44LTIuNlYyNC4xYzAtMSAuMy0xLjkuOC0yLjZtNTAuMiAxMGMwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFtLTItM2MwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFtLTIgM2MwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFtLTItM2MwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFtLTIgM2MwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFtLTItM2MwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFtLTIgM2MwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFtLTItM2MwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFtLTIgM2MwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFtLTItM2MwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFNNiAzMGMwIDIuNSAyIDQuNSA0LjUgNC41czQuNS0yIDQuNS00LjUtMi00LjUtNC41LTQuNVM2IDI3LjUgNiAzME0uOCAxOS41Yy0uNS0uNy0uOC0xLjYtLjgtMi42VjUuMUMwIDIuNiAyLjEuNSA0LjYuNWg1MC44QzU3LjkuNSA2MCAyLjYgNjAgNS4xdjExLjhjMCAxLS4zIDEuOS0uOCAyLjZ6bTUwLjItN2MwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFtLTItM2MwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFtLTIgM2MwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFtLTItM2MwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFtLTIgM2MwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFtLTItM2MwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFtLTIgM2MwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFtLTItM2MwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFtLTIgM2MwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFtLTItM2MwIC42LjQgMSAxIDFzMS0uNCAxLTEtLjQtMS0xLTEtMSAuNC0xIDFNNiAxMWMwIDIuNSAyIDQuNSA0LjUgNC41czQuNS0yIDQuNS00LjUtMi00LjUtNC41LTQuNVM2IDguNSA2IDExTTU5LjIgNDAuNWMuNS43LjggMS42LjggMi42djExLjhjMCAyLjUtMi4xIDQuNi00LjYgNC42SDQuNmMtMi41IDAtNC42LTIuMS00LjYtNC42VjQzLjFjMC0xIC4zLTEuOS44LTIuNnpNMTUuMSA0OWMwLTIuNS0yLTQuNS00LjUtNC41cy00LjUgMi00LjUgNC41IDIgNC41IDQuNSA0LjUgNC41LTIgNC41LTQuNW0yMC0xLjVjMC0uNi0uNS0xLTEtMS0uNiAwLTEgLjQtMSAxcy40IDEgMSAxYy41IDAgMS0uNCAxLTFtMiAzYzAtLjYtLjUtMS0xLTEtLjYgMC0xIC40LTEgMXMuNCAxIDEgMWMuNSAwIDEtLjQgMS0xbTItM2MwLS42LS41LTEtMS0xLS42IDAtMSAuNC0xIDFzLjQgMSAxIDFjLjUgMCAxLS40IDEtMW0yIDNjMC0uNi0uNS0xLTEtMS0uNiAwLTEgLjQtMSAxcy40IDEgMSAxYy41IDAgMS0uNCAxLTFtMi0zYzAtLjYtLjUtMS0xLTEtLjYgMC0xIC40LTEgMXMuNCAxIDEgMWMuNSAwIDEtLjQgMS0xbTIgM2MwLS42LS41LTEtMS0xLS42IDAtMSAuNC0xIDFzLjQgMSAxIDFjLjUgMCAxLS40IDEtMW0yLTNjMC0uNi0uNS0xLTEtMS0uNiAwLTEgLjQtMSAxcy40IDEgMSAxYy41IDAgMS0uNCAxLTFtMiAzYzAtLjYtLjUtMS0xLTEtLjYgMC0xIC40LTEgMXMuNCAxIDEgMWMuNSAwIDEtLjQgMS0xbTItM2MwLS42LS41LTEtMS0xLS42IDAtMSAuNC0xIDFzLjQgMSAxIDFjLjUgMCAxLS40IDEtMW0yIDNjMC0uNi0uNS0xLTEtMS0uNiAwLTEgLjQtMSAxcy40IDEgMSAxYy41IDAgMS0uNCAxLTEiLz48cGF0aCBmaWxsPSIjZmZmIiBkPSJtMyAxMCA2IDcgNiAxIDMtNmMuNC0xLjItMi03LTItNy0xLjEtLjUtNS0xLTUtMUw1IDZtLTIgNCA2IDcgNiAxIDMtNmMuNC0xLjItMi03LTItNy0xLjEtLjUtNS0xLTUtMUw1IDZNMiA0OWw2IDcgNiAxIDMtNmMuNC0xLjItMi03LTItNy0xLjEtLjUtNS0xLTUtMWwtNiAybS0yIDQgNiA3IDYgMSAzLTZjLjQtMS4yLTItNy0yLTctMS4xLS41LTUtMS01LTFsLTYgMk0zIDI5bDYgNyA2IDEgMy02Yy40LTEuMi0yLTctMi03LTEuMS0uNS01LTEtNS0xbC02IDJtLTIgNCA2IDcgNiAxIDMtNmMuNC0xLjItMi03LTItNy0xLjEtLjUtNS0xLTUtMWwtNiAyIi8+PC9zdmc+);bottom:0;height:45%;width:23%}.dark .neumorphism-circle-m,.dark .neumorphism-circle-s,.slider-content .slider-profile img.slider-logo-black{background:var(--bg-color-dark)}.device.server .beating-color{border-radius:50%;height:18px;left:17%;margin-left:-9px;margin-top:-9px;position:absolute;width:18px}.device.server .beating-color.one{top:17%}.device.server .beating-color.two{top:50%}.device.server .beating-color.three{top:84%}.block{background-color:var(--bg-color);min-height:250px;overflow:hidden;padding-bottom:46px;padding-top:50px;position:relative;width:100%}.block.trophy-before{padding-top:120px}.block.trophy-after{padding-bottom:80px}.block.first .button{float:left;margin-bottom:10px;margin-left:3px;margin-right:5px;min-width:100px}.block .inner{display:flex;gap:20px;justify-content:center;overflow:hidden}.justify-center-mobile{justify-content:right}.grid-3{grid-template-columns:auto auto auto}.framework-icon{flex-shrink:0;height:40px;width:40px}.font-20-14,.font-20-16{font-size:20px}.font-16-14{font-size:16px}.gap-24-20{gap:24px}.height-26-21{height:26px}.margin-left-10-0,.observe-code-example-tabs .ant-tabs-tab{margin-left:10px}.margin-right-8{margin-right:8px}.margin-right-6-8{margin-right:6px}.padding-top-64-46{padding-top:64px}.padding-side-16-12{padding-left:16px;padding-right:16px}.width-140-120{width:140px}.margin-bottom-16-10{margin-bottom:16px}.margin-bottom-12{margin-bottom:12px}.margin-right-10-6{margin-right:10px}.padding-right-20-0{padding-right:20px}.font-30-20{font-size:30px}.gap-30-16{gap:30px}.min-width-180-135{min-width:180px}.flex-end-center{justify-content:end}.flex-start-center{justify-content:start}.margin-top-125-0{margin-top:125px}.padding-button{padding:6px 25px}.block .half.left{flex:0.9}.block .half.right{flex:1.12}.block .centered .inner{display:block;justify-content:center;overflow:hidden}.block.first.hero h1{margin-left:auto;margin-right:auto;width:88%}.block.first.hero .text{color:#b5b5b5;font-size:var(--fontSizes-l);font-weight:400;letter-spacing:-.05rem;line-height:150%;margin-bottom:0;text-align:left;white-space:pre-line;width:80%}.block.first.hero .hero-action{flex:1 1 auto;max-width:300px;text-align:center}.block.first.hero .buy-premium-hero{display:inline-block;margin-left:20px;margin-top:7px}.block.reviews p{max-width:900px}.block.reviews .inner{max-width:1224px}.block.second .inner{display:flex;margin-top:10px}.content-canvas{aspect-ratio:2/1;max-width:540px;transform:scale(1);width:100%}.block.replication .replication-icons{height:515px;margin-left:10%;margin-top:0;position:relative;width:90%}.block.replication .replicate-logo{left:-60px;margin-left:50%;margin-top:-75px;position:absolute;top:50%;width:120px}.block.replication .replicate-graphql{margin-left:10%;margin-top:8%;position:absolute}.block.replication .replicate-firestore{margin-left:2%;margin-top:-47.5px;position:absolute;top:51%}.block.replication .replicate-supabase{margin-left:81%;margin-top:-47.5px;position:absolute;top:51%}.block.replication .replicate-rest{left:-35px;margin-left:20%;margin-top:-70px;position:absolute;text-align:center;top:83%}.block.replication .replicate-websocket{left:-35px;margin-left:50%;margin-top:-70px;position:absolute;text-align:center;top:93%}.block.replication .replicate-webrtc{left:80%;margin-left:-35px;margin-top:-70px;position:absolute;text-align:center;top:83%}.block.replication img.protocol{width:80px}.block.replication .neumorphism-circle-s img.protocol{width:40px}.block.offline-first{overflow:hidden;position:relative}.block.offline-first .offline-image-wrapper{left:46%;margin-left:-750px;position:absolute;top:-12%;transform:rotate(77deg);width:1500px}.block.offline-first p{margin-bottom:32px}.block.offline-first .offline-image{height:100%;transform-origin:center bottom;width:100%}ul.checked li{line-height:116%;padding-top:20px;text-align:left}ul.checked li,ul.checked li b{font-size:26px}ul.checked li:before{font-size:45px}.block.frameworks .content{position:relative}.block.frameworks h2{margin-top:50px}.block.frameworks p{padding-bottom:23px}.block.frameworks .circle{font-size:85%;position:absolute}.block.frameworks .circle img{height:46%;padding-bottom:3px}.block.frameworks .neumorphism-circle-s{margin-left:-35px}.block.frameworks .neumorphism-circle-m{margin-left:-47.5px}.block.frameworks .below-text{display:block;min-height:200px;position:relative;width:100%}.block.fifth .inner{width:624px}.block.fifth .box{border-radius:.75rem;box-sizing:initial;float:left;margin-right:20px;margin-top:20px;padding:12px 16px;width:calc(50% - 72px)}.block table,.block.fifth.dark .box,.block.sixth .buy-option-inner{background-color:var(--bg-color)}.block.fifth .box img{box-sizing:initial;float:left;margin-top:4px;padding-right:10px;width:20px}.block.fifth .box .label{float:left;margin-top:2px}.block.fifth .box .value{color:var(--color-top);float:right;font-weight:700;margin-inline-end:0;margin-top:2px;right:0}.block.sixth .content{box-sizing:initial}.block.sixth .buy-options{align-items:center;column-gap:10px;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));row-gap:1em;width:100%}.block.sixth .buy-option{border-radius:6px;padding:3px}.block.sixth .buy-option-inner{border-radius:4px;box-sizing:initial;color:#fff;padding:10px;position:relative}.block.sixth .buy-option-inner h2{font-size:1.5em;height:50px;text-align:center;width:100%}.block.sixth .buy-option-title{padding-bottom:35px}.block.sixth .buy-option-inner .price{font-size:.8em;text-align:center;width:100%}.block.sixth .buy-option-features{margin-left:5%;width:90%}.block.sixth .buy-option-features p{font-size:1em;text-align:justify}.block.sixth .buy-option-action{border-radius:6px;bottom:8px;color:#fff;cursor:pointer;font-size:1.2rem;font-weight:700;left:10px;padding-bottom:15px;padding-top:15px;position:absolute;text-align:center;width:calc(100% - 20px)}.block.sixth .buy-option-features{font-size:1em;padding-bottom:50px}.block.sixth .buy-option-features li{padding-bottom:10px}.block.last .buttons{height:382px;margin-top:66px;position:relative}.block.last .buttons .button{display:inline;left:0;margin:0;position:absolute;top:0}.block.last .button.get-premium{border-radius:10px;font-size:37px;padding:10px 38px}.block table{border:1px solid #ffffff4d;border-radius:6px;font-size:120%;margin-top:20px;padding:0;width:80%}.neumorphism-circle-xl{box-shadow:5px 5px 10px #161c26,-5px -5px 10px #1e2432;height:130px;width:130px}.neumorphism-circle-m,.neumorphism-circle-xl{background:var(--bg-color);border-radius:50%;color:#fff;font-size:85%}.neumorphism-circle-m{box-shadow:5px 5px 10px #171c26,-5px -5px 10px #1d2432;height:95px;width:95px}.neumorphism-circle-s,.neumorphism-circle-xs{background:var(--bg-color);border-radius:50%;color:#fff;font-size:85%;height:70px;width:70px}.dark .neumorphism-circle-m{box-shadow:5px 5px 10px #14161e,-5px -5px 10px #1a1c28}.neumorphism-circle-s{box-shadow:3px 3px 6px #151a24,-3px -3px 6px #1f2634}.dark .neumorphism-circle-s{box-shadow:3px 3px 6px #13151d,-3px -3px 6px #1b1e29}.neumorphism-circle-xs{box-shadow:5px 5px 7px #171c26,-5px -5px 7px #1d2432}.trophy,.trophy.github{color:#eac54f}.bg-top{background-color:var(--color-top)}.bg-middle{background-color:var(--color-middle)}.bg-bottom{background-color:var(--color-bottom)}.hover-shadow-top:hover{box-shadow:2px 2px 6px var(--color-top),-2px -1px 10px var(--color-top)}.hover-shadow-middle:hover{box-shadow:2px 2px 10px var(--color-middle),-2px -1px 10px var(--color-middle)}.hover-shadow-bottom:hover{box-shadow:2px 2px 10px var(--color-bottom),-2px -1px 10px var(--color-bottom)}.bg-gradient-right-bottom{background:linear-gradient(to right bottom,var(--color-top),var(--color-middle),var(--color-bottom))}.bg-gradient-left-bottom{background:linear-gradient(to left bottom,var(--color-top),var(--color-middle),var(--color-bottom))}.bg-gradient-right-top{background:linear-gradient(to right top,var(--color-top),var(--color-middle),var(--color-bottom))}.bg-gradient-left-top{background:linear-gradient(to left top,var(--color-top),var(--color-middle),var(--color-bottom))}.bg-gradient-top{background:linear-gradient(to top,var(--color-top),var(--color-middle),var(--color-bottom))}.star-at-github{border-radius:40px;float:right;margin-top:8px;padding:3px;transition:.2s ease-in-out}.star-at-github .star-at-github-inner{background-color:var(--bg-color);border-radius:40px;padding:8px}.star-at-github .star-at-github-inner img{margin-left:3px;margin-right:6px;margin-top:3px;width:17px}.star-at-github .star-at-github-text{display:inline;float:right;margin-top:2px}.tilt-to-mouse{box-shadow:0 0 0 1px #0000;image-rendering:optimizeQuality;outline:#0000 solid 1px}.call-to-action-popup,.dropdown-content,.trophy{box-shadow:0 8px 12px 6px #00000026,0 4px 4px 0 #0000004d;left:50%}.enlarge-on-mouse,.tilt-to-mouse{will-change:transform}.beating.animation{animation:a}.beating-first.animation{animation:b}.beating-second.animation{animation:c}.beating-color{background-color:#ed168f;transition:background-color .4s linear;will-change:background-color}.trophy{align-items:center;background-color:var(--bg-color);border-radius:10px;border-style:solid;border-width:2px;box-sizing:initial;display:flex;height:40px;margin-top:-26.715px;padding:6px 10px 4px;position:absolute;transform:translateX(-50%);width:220px;z-index:9}.samp-wrapper,.trophy.discord,.trophy.github,.trophy.mongodb,.trophy.supabase{background-color:var(--bg-color-dark)}.trophy:hover{box-shadow:2px 2px 13px #eac54f,-2px -1px 14px #eac54f}.trophy img,.trophy svg{align-items:flex-start;aspect-ratio:1/1;display:flex;flex-direction:column;height:30px;margin-right:10px;margin-top:-4px;width:30px}.trophy .subtitle{font-size:12px;line-height:normal}.trophy .subtitle,.trophy .title{box-sizing:initial;font-style:normal;font-weight:500}.trophy .title{font-size:16px;line-height:25px}.trophy .valuetitle{box-sizing:initial;font-size:12px;font-style:normal;font-weight:500;line-height:normal}.trophy .value{font-feature-settings:"tnum";font-variant-numeric:tabular-nums;line-height:25px}.trophy .arrow-up,.trophy .value{box-sizing:initial;font-size:16px;font-style:normal;font-weight:500}.trophy .arrow-up{float:right;line-height:normal;margin-left:5px;margin-top:2px}.trophy.twitter:hover{box-shadow:2px 2px 13px #fff,-2px -1px 14px #fff}.trophy.discord{color:#878ef2}.trophy.discord:hover{box-shadow:2px 2px 13px #878ef2,-2px -1px 14px #878ef2}.trophy.supabase{color:#3ecf8e}.trophy.supabase:hover{box-shadow:2px 2px 13px #3ecf8e,-2px -1px 14px #3ecf8e}.trophy.mongodb{color:#00a35c}.trophy.mongodb:hover{box-shadow:2px 2px 13px #00a35c,-2px -1px 14px #00a35c}.samp-wrapper{background-color:var(--bg-color);border-radius:15px;border-style:solid;border-width:1px;display:inline-block;font-size:16px;padding:12px;text-align:left;width:calc(100% - 26px)}.samp-wrapper legend{font-weight:700;padding-left:6px;padding-right:6px}samp{font-family:Courier New,monospace;line-height:157%}samp .beating-color{border-radius:5px;color:#fff!important;font-weight:700;padding:2px 4px}samp .cm-keyword,samp .cm-operator{color:#c678dd}samp .cm-variable{color:#e5c07b}samp .cm-html{color:#c5436d}samp .cm-def,samp .cm-property{color:#e06c75}samp .cm-method{color:#61afef}samp .cm-string{color:#98c379}samp .cm-comment{color:#7f848e}.observe-code-example-tabs{color:#fff;padding-bottom:20px}.ant-tabs-tab-btn,footer{color:#fff!important}.ant-tabs-tab-btn[aria-selected=true]{color:var(--color-top)!important}.ant-tabs-ink-bar{background:var(--color-top)!important}.observe-code-example-tabs .ant-tabs-tab-icon{margin-inline-end:5px!important}.observe-code-example-tabs .ant-tabs-tab-icon img{float:left;height:30px;margin-top:-6px}@keyframes a{0%,26%,76%,to{transform:scale(1)}13%{transform:scale(1.1)}16%{transform:scale(1.08)}22%{transform:scale(1.2)}38%{transform:scale(1.09)}41%,56%{transform:scale(1.05)}50%{transform:scale(1.07)}}@keyframes b{0%,26%,to{transform:scale(1)}13%{transform:scale(1.1)}16%{transform:scale(1.08)}22%{transform:scale(1.2)}}@keyframes c{0%,26%,76%,to{transform:scale(1)}38%{transform:scale(1.09)}41%,56%{transform:scale(1.05)}50%{transform:scale(1.07)}}.premium-blocks{display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(4,1fr);margin-top:30px;width:80%;grid-column-gap:10px;grid-row-gap:15px}.navbar-line{top:89.5px}.premium-blocks .premium-block{border-radius:6px;color:#fff;height:100%;padding:3px}.premium-blocks .premium-block-inner{background-color:var(--bg-color);border-radius:4px;box-sizing:initial;color:#fff;height:calc(100% - 20px);padding:10px;position:relative}.premium-blocks p{font-size:93%}.price-calculator{background-color:var(--bg-color);border:1px #ffffff4d;font-size:120%;margin-top:20px;padding:3px;width:80%}.price-calculator-inner{margin-left:5%;padding-bottom:40px;padding-top:40px;width:90%}.package{border-radius:0;margin-bottom:10px;margin-top:10px;padding:3px}.package-inner{background-color:var(--bg-color-dark);border-color:var(--fontColor-gray);border-radius:16px;border-style:none;border-width:1px;padding:16px;position:relative}.price-calculator h4{margin-bottom:20px;margin-top:0}.price-calculator .field{font-size:80%;margin-bottom:15px;width:100%}.price-calculator .field label{font-size:120%;margin-bottom:5px;width:100%}.price-calculator .field .input{border-radius:4px;text-align:left;width:100%}.price-calculator .field .input input[type=number]{width:150px}.price-calculator .field .suffix{float:left;font-size:120%;margin-left:10px;margin-top:4px}.price-calculator .field .prefix{float:left;font-size:120%;margin-right:10px;margin-top:4px}.price-calculator input,.price-calculator select{background-color:#fff;border-radius:3px;color:#000;float:left;font-size:120%;padding:3px}.price-calculator hr{height:1px;margin-bottom:30px;margin-top:50px}.price-calculator .package-checkbox{accent-color:var(--color-middle);background-color:#fff;border-radius:5px;cursor:pointer;float:right;height:50px;width:50px}.price-calculator .package ul li{line-height:150%}.price-calculator input:invalid:required,.price-calculator select:invalid:required{border:2px solid red}#price-calculator-result{font-size:120%}#price-calculator-result .inner{text-align:center;width:100%}#price-calculator-result .price-label{font-size:100%;line-height:320%;vertical-align:top}#price-calculator-result #total-per-project-per-month{font-size:300%}#price-calculator-result .per-month{font-size:120%;line-height:300%}#price-calculator-result table{border-spacing:30px;width:100%}#price-calculator-result #total-per-year{border-bottom:3px double;font-weight:700}.premium-faq h2{padding-bottom:40px}.premium-faq details{font-size:var(--fontSizes-m);padding-bottom:25px;text-align:justify;width:60%}.premium-faq details[open]{padding-bottom:25px}.premium-faq summary{cursor:pointer;font-weight:700;padding-bottom:10px}.premium-request li,.premium-request ol{padding-bottom:20px}.premium-request iframe{border:#ffffff4d;border-radius:14px;height:2150px;margin:0;overflow:hidden;padding:0;width:700px}footer{font-weight:700;padding:20px;text-align:center}.redirectBox ul{display:inline-block;text-align:left}.redirectBox li{margin:10px 0}.call-to-action{align-items:center;display:flex;flex:1;min-width:0;overflow:hidden;padding-left:9px;padding-right:9px}.call-to-action a{background-color:var(--ifm-navbar-background-color);border:1px solid var(--color-top);border-radius:1rem;box-sizing:initial;cursor:pointer;height:2rem;line-height:2rem;padding-left:1rem;padding-right:1rem;text-align:center;transition:.2s}.call-to-action a,.call-to-action-text{color:var(--fontColor-offwhite);font-size:var(--fontSizes-xs)}.call-to-action-text,.tags_jXut{display:inline}.call-to-action-popup{background-color:#fff;background:var(--bg-color-dark);border:1px solid var(--40-grey,#666);bottom:0;margin-bottom:20px;max-width:90%;padding:16px;position:fixed;text-align:center;transform:translateX(-50%) translateY(200%);width:560px;will-change:transform;z-index:20}.ant-modal-content,.block.faq .ant-collapse{background-color:initial}.call-to-action-popup.active{transform:translateY(0) translateX(-50%);transition:.5s}.call-to-action-popup.active.top{bottom:unset;top:80px}.call-to-action-popup.active.mid{bottom:unset;margin-top:-100px;top:50%}.call-to-action-popup h3{font-size:20px;font-style:normal;font-weight:700;line-height:normal;margin-bottom:20px;margin-top:14px;width:calc(100% - 30px)}.call-to-action-popup .close-popup{align-items:center;cursor:pointer;display:flex;justify-content:center;overflow:hidden;padding:16px;position:absolute;right:0;text-align:center;top:0}.call-to-action-popup .close .text{margin-top:2px}#CybotCookiebotDialog{font-family:var(--ifm-font-family-monospace)!important;padding:12px!important}#CybotCookiebotDialogHeader,#CybotCookiebotDialogPoweredByText{display:none!important}.CybotCookiebotDialogBodyBottomWrapper{margin-top:.5em!important}#CybotCookiebotDialogBodyLevelButtonCustomize{border-color:var(--color-top)!important}.navbar__title{color:#fff;font-size:1.35rem;font-weight:500}.flex-row{align-items:center;flex-direction:row}.docMainContainer_TBSr,.docRoot_UBD9,.flex-column,.flex-row{display:flex;width:100%}.flex-column,.side-tabs.small{flex-direction:column}.ant-modal-body h3{margin-bottom:12px;width:calc(100% - 40px)}.slick-dots li,.slick-dots li button,.slick-dots li button:before{height:7px!important;width:7px!important}.nav-logo-consulting{align-items:center;color:#fff;display:flex;font-size:1.35em;font-weight:500;gap:9px;line-height:120%;margin-right:48px!important;padding:0!important;transition:.15s ease-in-out}.hero-img,.nav-logo-consulting:hover{max-width:fit-content}.block.review .slider-content h3{color:#f6f6f7;font-size:1.2em;font-weight:600;line-height:160%;margin-bottom:32px;margin-top:16px;text-align:start}.slider-content .slider-profile{align-items:center;display:flex;gap:0;margin-top:auto}.slick-track{display:flex!important;gap:32px}.slick-initialized .slick-slide{display:flex!important;flex-grow:1;height:auto;max-width:600px}.slider-content .slider-profile img{border-radius:100%;height:30px;object-fit:contain;padding:5px;width:30px}.review-img{max-height:24px;padding-bottom:5px}.slider-content .slider-profile img.slider-logo-white{background:#fff}.slider-content .slider-profile .slider-info{width:70%}.slider-content .slider-profile .developer{font-style:normal;color:#fff;font-size:1em;font-weight:500;line-height:150%;margin-bottom:0}.slider-content .slider-profile .company-link{color:#858585;font-size:1em;font-weight:400;line-height:150%}.slick-slide{display:flex;flex-grow:1;height:auto}.slick-next:before,.slick-prev:before{content:""!important}.slick-next,.slick-prev{top:40%!important}.slick-list{height:auto!important;-webkit-mask-image:-webkit-gradient(linear,left center,right center,color-stop(0,#0000),color-stop(.3,#000),color-stop(.7,#000),color-stop(1,#0000));mask-image:-webkit-gradient(linear,left center,right center,color-stop(0,#0000),color-stop(.3,#000),color-stop(.7,#000),color-stop(1,#0000));max-height:700px;padding:0}.slick-dots{align-items:center!important;border:1px solid #2c3039;border-radius:22px;display:flex!important;margin:40px auto 0!important;padding:8px!important;position:static!important;width:max-content!important}.slick-dots li{margin:0 8px!important;padding:0 0 0 7px!important;top:1px}.slick-dots li.slick-active{padding-right:15px!important;top:0}.slick-dots li button:before{color:#c3c3d0!important;font-size:10px!important;line-height:7px!important;opacity:1!important}.slick-dots li.slick-active button:before{border-radius:80px;content:"ㅤ"!important;height:8px!important;margin:0 7px 0 0!important;width:24px!important}.slick-dots li.slick-active:first-child button:before{margin:0 50px 0 0!important}.block.faq .ant-collapse{display:flex;flex-direction:column;gap:16px}.block.faq .ant-collapse-header{align-items:center;color:#fff;flex-direction:row-reverse;font-size:1.15em;font-weight:600;gap:16px;line-height:150%;padding:0}.block.faq .ant-collapse-item{background-color:#222834;border:none;border-radius:24px;color:#fff;font-size:1.15em;font-weight:600;line-height:150%;padding:26.5px 24px}.block.faq .ant-collapse-content-box{color:#fff;font-size:1em;font-weight:400;line-height:150%;padding:12px 0 0!important;white-space:pre-line}.block.footer{padding:25px 30px 60px}.block.footer .footer-block{display:flex;flex-direction:column;gap:2rem;max-width:90rem;width:100%}.block.footer .footer-links{color:#fff;display:flex;flex-direction:column;gap:1rem}.block.footer .footer-links span{align-items:center;display:flex;justify-content:space-between;padding:1rem 0}.footer-logo-button{align-items:center;color:#fff;display:flex;font-size:var(--fontSizes-2xl);font-weight:600;line-height:120%}.footer-policy div a,.footer-rights{color:#5c5c75;font-size:var(--fontSizes-s);font-weight:400;line-height:150%}.footer-logo-button img{max-height:54px}.footer-logo-button div{align-items:center;cursor:pointer;display:flex;gap:13px;padding:0 0 0 3px}.footer-links a{align-items:center;color:#fff;display:flex;font-size:var(--fontSizes-s);font-weight:400;transition:.15s ease-in-out}.footer-community-links{align-items:center;display:flex;gap:16px;margin-top:130px}.footer-community-links img,.footer-community-links svg{filter:grayscale(100%) brightness(1.8);height:22px}.footer-policy{align-items:center;border-top:1px solid #5c5c75;display:flex;justify-content:space-between;padding-top:1rem}.footer-policy div{display:flex;gap:1rem}.footer-policy div a{align-items:center;display:flex;transition:.15s ease-in-out}.footer-img{bottom:0;position:absolute;right:0}.tag-cloud{max-width:100%;overflow-x:hidden;text-align:center}.dropdown-wrapper{display:inline-block;position:relative}.dropdown-content{background:red;background:var(--bg-color-dark);border:1px solid #666;padding:32px;position:fixed;top:82px;transform:translateX(-50%);width:809px;z-index:13}.dropdown-content-storages{align-items:start;column-gap:32px;display:grid;grid-template-columns:repeat(4,max-content);padding:13px 16px 24px}.dropdown-grid-top{border-bottom:2px solid #666;padding-bottom:6px}.dropdown-grid-top-title{font-size:14px;font-style:normal;font-weight:700;line-height:21px}.dropdown-grid-top-sub{font-size:12px;font-style:normal;font-weight:500;line-height:normal;white-space:nowrap}.dropdown-grid-top-links{list-style-type:none;padding-left:14px}.dropdown-grid-top-links li{padding-top:14px}.dropdown-wrapper:hover .dropdown-content{display:grid}.dropdown-content-sync{padding:32px}.dropdown-content-sync-card{border:2px solid #fff;justify-content:center;margin-bottom:var(--ifm-paragraph-margin-bottom);padding:10px 14px 0}.dropdown-content-sync-card:hover{background-color:#000;filter:invert(1)}.dropdown-content-sync-title{font-size:20px;font-style:normal;font-weight:700;line-height:normal}.dropdown-content-sync-subtitle{font-size:12px;font-style:normal;font-weight:500;margin-top:10px}.dropdown-content-sync-integrations{display:grid;gap:10px 40px;grid-template-columns:repeat(4,1fr)}.side-tabs{display:flex;max-width:100%}.side-tabs__list{display:flex;flex:0 0 auto;flex-direction:column;gap:4px;min-width:220px}.side-tabs__tab{align-items:center;border-bottom:2px solid;border-left:2px solid;border-top:2px solid;border-color:var(--bg-color-dark);cursor:pointer;display:flex;font-size:20px;font-weight:500;gap:0;height:52px;text-align:left}.side-tabs__tab.dark{border-color:var(--bg-color)}.alert.alert--info,.alert.alert--info div div{border-color:var(--color-middle)}.side-tabs__tab:hover:not(.side-tabs__tab--active):not(.side-tabs__tab--disabled){font-weight:800}.side-tabs__tab--active{background-color:var(--bg-color-dark);color:#fff;font-weight:800}.side-tabs__tab--active.dark{background-color:var(--bg-color)}.side-tabs__tab--disabled{color:#4b5563;cursor:not-allowed}.side-tabs__tab--active .side-tabs__indicator{background:var(--color-top);height:calc(100% + 4px);left:-4px;position:relative;width:3px}.alert.alert--info,.side-tabs__content.dark{background-color:var(--bg-color)}.side-tabs.small .side-tabs__tab--active .side-tabs__indicator{height:3px;left:-2px;position:relative;top:-3px;width:calc(100% + 4px)}.side-tabs.small .side-tabs__content{flex:1;margin-left:0!important;padding:20px}.side-tabs.small .side-tabs__list{cursor:grab;flex-direction:row!important;-webkit-mask-image:-webkit-gradient(linear,left top,right top,from(#000),color-stop(70%,#000),to(#0000));mask-image:-webkit-gradient(linear,left top,right top,from(#000),color-stop(70%,#000),to(#0000));overflow-x:auto;overflow-y:hidden;padding-right:80px;scroll-snap-type:x mandatory;scrollbar-width:none;white-space:nowrap}.side-tabs.small .side-tabs__list.is-dragging{cursor:grabbing}.side-tabs.small .side-tabs__list.is-dragging,.side-tabs.small .side-tabs__list.is-dragging *{-webkit-user-select:none;user-select:none}.side-tabs.small .side-tabs__tab{align-items:stretch;border-bottom-style:none;border-right-style:solid;border-right-width:2px;display:grid;flex:0 0 auto;gap:0}.side-tabs__label{flex:1;margin-left:22px;margin-right:22px;position:absolute;-webkit-user-select:none;user-select:none}.side-tabs.small .side-tabs__label{position:relative}.side-tabs.small .side-tabs__tab--active .side-tabs__label{margin-top:-3px}.side-tabs__content{background-color:var(--bg-color-dark);flex:1 1 0;font-size:16px;font-weight:500;line-height:25px;margin-left:2px;min-width:0;overflow-x:auto;padding:32px}.side-tabs__content strong{color:#f9fafb;font-weight:600}.alert.alert--info{border-radius:0}.alert.alert--info summary:before{border-color:#0000 #0000 #0000 var(--color-top)}.theme-doc-sidebar-container{clip-path:none!important;z-index:5}figure[data-rehype-pretty-code-figure]{margin:0 0 var(--ifm-leading);padding:0}pre[data-theme] code{background:#0000;border:none;border-radius:0!important;display:block!important;font-size:var(--ifm-code-font-size);line-height:var(--ifm-pre-line-height);padding:1rem}.theme-code-block pre{border:2px solid #666;border-radius:0}.theme-code-block,:not(pre)>code{border-radius:0!important}:not(pre)>code{background-color:var(--ifm-code-background);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem;z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}[data-theme-choice=dark] .darkToggleIcon_wfgR,[data-theme-choice=light] .lightToggleIcon_pyhR,[data-theme-choice=system] .systemToggleIcon_QzmC,[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_Q0Zn:hover{background:var(--ifm-color-gray-800)}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color);-webkit-text-decoration:none;text-decoration:none}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_JQG6{display:none;margin:0}.categoryLinkLabel_W154,.linkLabel_WmDU{display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden}.iconExternalLink_nPIU{margin-left:.3rem}.linkLabel_WmDU{line-clamp:2;-webkit-line-clamp:2}.categoryLink_byQd{overflow:hidden}.menu__link--sublist-caret:after{margin-left:var(--ifm-menu-link-padding-vertical)}.categoryLinkLabel_W154{flex:1;line-clamp:2;-webkit-line-clamp:2}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.searchbox,.searchbox__input{box-sizing:border-box;display:inline-block}.algolia-docsearch-suggestion{border-bottom-color:#3a3dd1}.algolia-docsearch-suggestion--category-header{background-color:#4b54de}.algolia-docsearch-suggestion--highlight{color:#3a33d1}.algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--highlight{background-color:#4d47d5}.aa-cursor .algolia-docsearch-suggestion--content{color:#272296}.aa-cursor .algolia-docsearch-suggestion{background:#ebebfb}.searchbox{height:32px!important;position:relative;visibility:visible!important;white-space:nowrap;width:200px}.searchbox .algolia-autocomplete{display:block;height:100%;width:100%}.searchbox__wrapper{height:100%;position:relative;width:100%;z-index:999}.searchbox__input{appearance:none;background:#fff!important;border:0;border-radius:16px;box-shadow:inset 0 0 0 1px #ccc;font-size:12px;height:100%;padding:0 26px 0 32px;transition:box-shadow .4s,background .4s;white-space:normal;width:100%}.searchbox__reset,.searchbox__submit{font-size:inherit;-webkit-user-select:none;position:absolute}.searchbox__input::-webkit-search-cancel-button,.searchbox__input::-webkit-search-decoration,.searchbox__input::-webkit-search-results-button,.searchbox__input::-webkit-search-results-decoration{display:none}.searchbox__input:hover{box-shadow:inset 0 0 0 1px #b3b3b3}.searchbox__input:active,.searchbox__input:focus{background:#fff;box-shadow:inset 0 0 0 1px #aaa;outline:0}.searchbox__input::placeholder{color:#aaa}.searchbox__submit{background-color:#458ee100;border:0;border-radius:16px 0 0 16px;height:100%;left:0;margin:0;padding:0;right:inherit;text-align:center;top:0;user-select:none;width:32px}.searchbox__submit:before{content:"";display:inline-block;height:100%;margin-right:-4px;vertical-align:middle}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion,.dropdownNavbarItemMobile_J0Sd,.searchbox__submit:active,.searchbox__submit:hover{cursor:pointer}.searchbox__submit svg{fill:#6d7e96;height:14px;width:14px}.searchbox__reset{background:none;border:0;cursor:pointer;display:block;fill:#00000080;margin:0;padding:0;right:8px;top:8px;user-select:none}.searchbox__reset.hide{display:none}.searchbox__reset svg{display:block;height:8px;margin:4px;width:8px}.searchbox__input:valid~.searchbox__reset{animation-duration:.15s;animation-name:d;display:block}@keyframes d{0%{opacity:0;transform:translate3d(-20%,0,0)}to{opacity:1;transform:none}}.algolia-autocomplete .ds-dropdown-menu:before{background:#373940;border-radius:2px;border-right:1px solid #373940;border-top:1px solid #373940;content:"";display:block;height:14px;position:absolute;top:-7px;transform:rotate(-45deg);width:14px;z-index:1000}.algolia-autocomplete .ds-dropdown-menu{box-shadow:0 1px 0 0 #0003,0 2px 3px 0 #0000001a}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions{position:relative;z-index:1000}.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-]{background:#fff;border-radius:4px;overflow:auto;padding:0;position:relative}.algolia-autocomplete .algolia-docsearch-suggestion{display:block;overflow:hidden;padding:0;position:relative;-webkit-text-decoration:none;text-decoration:none}.algolia-autocomplete .ds-cursor .algolia-docsearch-suggestion--wrapper{background:#f1f1f1;box-shadow:inset -2px 0 0 #61dafb}.algolia-autocomplete .algolia-docsearch-suggestion--highlight{background:#ffe564;padding:.1em .05em}.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 .algolia-docsearch-suggestion--highlight{background:inherit;color:inherit}.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{background:inherit;box-shadow:inset 0 -2px 0 0 #458ee1cc;color:inherit;padding:0 0 1px}.algolia-autocomplete .algolia-docsearch-suggestion--content{cursor:pointer;display:block;float:right;padding:5.33333px 0 5.33333px 10.66667px;position:relative;width:70%}.algolia-autocomplete .algolia-docsearch-suggestion--content:before{background:#ececec;content:"";display:block;height:100%;left:-1px;position:absolute;top:0;width:1px}.algolia-autocomplete .algolia-docsearch-suggestion--category-header{background-color:#373940;color:#fff;display:none;font-size:14px;font-weight:700;letter-spacing:.08em;margin:0;padding:5px 8px;position:relative;text-transform:uppercase}.algolia-autocomplete .algolia-docsearch-suggestion--wrapper{background-color:#fff;float:left;padding:8px 0 0;width:100%}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column{color:#777;display:none;float:left;font-size:.9em;padding:5.33333px 10.66667px;position:relative;text-align:right;width:30%;word-wrap:break-word}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column:before{background:#ececec;content:"";display:block;height:100%;position:absolute;right:0;top:0;width:1px}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header,.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary{display:block}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column .algolia-docsearch-suggestion--highlight{background-color:inherit;color:inherit}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-inline{display:none}.algolia-autocomplete .algolia-docsearch-suggestion--title{color:#02060c;font-size:.9em;font-weight:700;margin-bottom:4px}.algolia-autocomplete .algolia-docsearch-suggestion--text{color:#63676d;display:block;font-size:.85em;line-height:1.2em;padding-right:2px}.algolia-autocomplete .algolia-docsearch-suggestion--version{color:#a6aab1;display:block;font-size:.65em;padding-right:2px;padding-top:2px}.algolia-autocomplete .algolia-docsearch-suggestion--no-results{background-color:#373940;font-size:1.2em;margin-top:-8px;padding:8px 0;text-align:center;width:100%}.algolia-autocomplete .algolia-docsearch-suggestion--no-results .algolia-docsearch-suggestion--text{color:#fff;margin-top:4px}.algolia-autocomplete .algolia-docsearch-suggestion--no-results:before,.navbarSearchContainer_dCNk:empty{display:none}.algolia-autocomplete .algolia-docsearch-suggestion code{background-color:#ebebeb;border:none;border-radius:3px;color:#222;font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace;font-size:90%;padding:1px 5px}.algolia-autocomplete .algolia-docsearch-suggestion code .algolia-docsearch-suggestion--highlight{background:none}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header{color:#fff;display:block}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary .algolia-docsearch-suggestion--subcategory-column,.tocCollapsibleContent_vkbj a{display:block}.algolia-autocomplete .algolia-docsearch-footer{background-color:#fff;float:right;font-size:0;height:30px;line-height:0;width:100%;z-index:2000}.algolia-autocomplete .algolia-docsearch-footer--logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 130 18'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath fill='url(%2523a)' d='M59.4.02h13.3a2.37 2.37 0 0 1 2.38 2.37V15.6a2.37 2.37 0 0 1-2.38 2.36H59.4a2.37 2.37 0 0 1-2.38-2.36V2.38A2.37 2.37 0 0 1 59.4.02'/%3E%3Cpath fill='%2523FFF' d='M66.26 4.56c-2.82 0-5.1 2.27-5.1 5.08 0 2.8 2.28 5.07 5.1 5.07 2.8 0 5.1-2.26 5.1-5.07 0-2.8-2.28-5.07-5.1-5.07zm0 8.65c-2 0-3.6-1.6-3.6-3.56 0-1.97 1.6-3.58 3.6-3.58 1.98 0 3.6 1.6 3.6 3.58a3.58 3.58 0 0 1-3.6 3.57zm0-6.4v2.66c0 .07.08.13.15.1l2.4-1.24c.04-.02.06-.1.03-.14a2.96 2.96 0 0 0-2.46-1.5.1.1 0 0 0-.1.1zm-3.33-1.96-.3-.3a.78.78 0 0 0-1.12 0l-.36.36a.77.77 0 0 0 0 1.1l.3.3c.05.05.13.04.17 0 .2-.25.4-.5.6-.7.23-.23.46-.43.7-.6.07-.04.07-.1.03-.16zm5-.8V3.4a.78.78 0 0 0-.78-.78h-1.83a.78.78 0 0 0-.78.78v.63c0 .07.06.12.14.1a5.7 5.7 0 0 1 1.58-.22c.52 0 1.04.07 1.54.2a.1.1 0 0 0 .13-.1z'/%3E%3Cpath fill='%2523182359' d='M102.16 13.76c0 1.46-.37 2.52-1.12 3.2-.75.67-1.9 1-3.44 1-.56 0-1.74-.1-2.67-.3l.34-1.7c.78.17 1.82.2 2.36.2.86 0 1.48-.16 1.84-.5.37-.36.55-.88.55-1.57v-.35a6 6 0 0 1-.84.3 4.2 4.2 0 0 1-1.2.17 4.5 4.5 0 0 1-1.6-.28 3.4 3.4 0 0 1-1.26-.82 3.7 3.7 0 0 1-.8-1.35c-.2-.54-.3-1.5-.3-2.2 0-.67.1-1.5.3-2.06a3.9 3.9 0 0 1 .9-1.43 4.1 4.1 0 0 1 1.45-.92 5.3 5.3 0 0 1 1.94-.37c.7 0 1.35.1 1.97.2a16 16 0 0 1 1.6.33v8.46zm-5.95-4.2c0 .9.2 1.88.6 2.3.4.4.9.62 1.53.62q.51 0 .96-.15a2.8 2.8 0 0 0 .73-.33V6.7a8.5 8.5 0 0 0-1.42-.17c-.76-.02-1.36.3-1.77.8-.4.5-.62 1.4-.62 2.23zm16.13 0c0 .72-.1 1.26-.32 1.85a4.4 4.4 0 0 1-.9 1.53c-.38.42-.85.75-1.4.98-.54.24-1.4.37-1.8.37-.43 0-1.27-.13-1.8-.36a4.1 4.1 0 0 1-1.4-.97 4.5 4.5 0 0 1-.92-1.52 5 5 0 0 1-.33-1.84c0-.72.1-1.4.32-2s.53-1.1.92-1.5c.4-.43.86-.75 1.4-.98a4.55 4.55 0 0 1 1.78-.34 4.7 4.7 0 0 1 1.8.34c.54.23 1 .55 1.4.97q.57.63.9 1.5c.23.6.35 1.3.35 2zm-2.2 0c0-.92-.2-1.7-.6-2.22-.38-.54-.94-.8-1.64-.8-.72 0-1.27.26-1.67.8s-.58 1.3-.58 2.22c0 .93.2 1.56.6 2.1.38.54.94.8 1.64.8s1.25-.26 1.65-.8c.4-.55.6-1.17.6-2.1m6.97 4.7c-3.5.02-3.5-2.8-3.5-3.27L113.57.92l2.15-.34v10c0 .25 0 1.87 1.37 1.88v1.8zm3.77 0h-2.15v-9.2l2.15-.33v9.54zM119.8 3.74c.7 0 1.3-.58 1.3-1.3 0-.7-.58-1.3-1.3-1.3-.73 0-1.3.6-1.3 1.3 0 .72.58 1.3 1.3 1.3m6.43 1c.7 0 1.3.1 1.78.27.5.18.88.42 1.17.73.28.3.5.74.6 1.18.13.46.2.95.2 1.5v5.47a25 25 0 0 1-1.5.25q-1.005.15-2.25.15a6.8 6.8 0 0 1-1.52-.16 3.2 3.2 0 0 1-1.18-.5 2.46 2.46 0 0 1-.76-.9c-.18-.37-.27-.9-.27-1.44 0-.52.1-.85.3-1.2.2-.37.48-.67.83-.9a3.6 3.6 0 0 1 1.23-.5 7 7 0 0 1 2.2-.1l.83.16V8.4c0-.25-.03-.48-.1-.7a1.5 1.5 0 0 0-.3-.58c-.15-.18-.34-.3-.58-.4a2.5 2.5 0 0 0-.92-.17c-.5 0-.94.06-1.35.13-.4.08-.75.16-1 .25l-.27-1.74c.27-.1.67-.18 1.2-.28a9.3 9.3 0 0 1 1.65-.14zm.18 7.74c.66 0 1.15-.04 1.5-.1V10.2a5.1 5.1 0 0 0-2-.1c-.23.03-.45.1-.64.2a1.17 1.17 0 0 0-.47.38c-.13.17-.18.26-.18.52 0 .5.17.8.5.98.32.2.74.3 1.3.3zM84.1 4.8c.72 0 1.3.08 1.8.26.48.17.87.42 1.15.73.3.3.5.72.6 1.17.14.45.2.94.2 1.47v5.48a25 25 0 0 1-1.5.26c-.67.1-1.42.14-2.25.14a6.8 6.8 0 0 1-1.52-.16 3.2 3.2 0 0 1-1.18-.5 2.46 2.46 0 0 1-.76-.9c-.18-.38-.27-.9-.27-1.44 0-.53.1-.86.3-1.22s.5-.65.84-.88a3.6 3.6 0 0 1 1.24-.5 7 7 0 0 1 2.2-.1q.39.045.84.15v-.35c0-.24-.03-.48-.1-.7a1.5 1.5 0 0 0-.3-.58c-.15-.17-.34-.3-.58-.4a2.5 2.5 0 0 0-.9-.15c-.5 0-.96.05-1.37.12-.4.07-.75.15-1 .24l-.26-1.75c.27-.08.67-.17 1.18-.26a9 9 0 0 1 1.66-.15zm.2 7.73c.65 0 1.14-.04 1.48-.1v-2.17a5.1 5.1 0 0 0-1.98-.1c-.24.03-.46.1-.65.18a1.17 1.17 0 0 0-.47.4c-.12.17-.17.26-.17.52 0 .5.18.8.5.98.32.2.75.3 1.3.3zm8.68 1.74c-3.5 0-3.5-2.82-3.5-3.28L89.45.92 91.6.6v10c0 .25 0 1.87 1.38 1.88v1.8z'/%3E%3Cpath fill='%25231D3657' d='M5.03 11.03c0 .7-.26 1.24-.76 1.64q-.75.6-2.1.6c-.88 0-1.6-.14-2.17-.42v-1.2c.36.16.74.3 1.14.38.4.1.78.15 1.13.15.5 0 .88-.1 1.12-.3a.94.94 0 0 0 .35-.77.98.98 0 0 0-.33-.74c-.22-.2-.68-.44-1.37-.72-.72-.3-1.22-.62-1.52-1C.23 8.27.1 7.82.1 7.3c0-.65.22-1.17.7-1.55.46-.37 1.08-.56 1.86-.56.76 0 1.5.16 2.25.48l-.4 1.05c-.7-.3-1.32-.44-1.87-.44-.4 0-.73.08-.94.26a.9.9 0 0 0-.33.72c0 .2.04.38.12.52.08.15.22.3.42.4.2.14.55.3 1.06.52.58.24 1 .47 1.27.67s.47.44.6.7c.12.26.18.57.18.92zM9 13.27c-.92 0-1.64-.27-2.16-.8-.52-.55-.78-1.3-.78-2.24 0-.97.24-1.73.72-2.3.5-.54 1.15-.82 2-.82.78 0 1.4.25 1.85.72.46.48.7 1.14.7 1.97v.67H7.35c0 .58.17 1.02.46 1.33.3.3.7.47 1.24.47.36 0 .68-.04.98-.1a5 5 0 0 0 .98-.33v1.02a3.9 3.9 0 0 1-.94.32 5.7 5.7 0 0 1-1.08.1zm-.22-5.2c-.4 0-.73.12-.97.38s-.37.62-.42 1.1h2.7c0-.48-.13-.85-.36-1.1-.23-.26-.54-.38-.94-.38zm7.7 5.1-.26-.84h-.05c-.28.36-.57.6-.86.74-.28.13-.65.2-1.1.2-.6 0-1.05-.16-1.38-.48-.32-.32-.5-.77-.5-1.34 0-.62.24-1.08.7-1.4.45-.3 1.14-.47 2.07-.5l1.02-.03V9.2c0-.37-.1-.65-.27-.84-.17-.2-.45-.28-.82-.28-.3 0-.6.04-.88.13a7 7 0 0 0-.8.33l-.4-.9a4.4 4.4 0 0 1 1.05-.4 5 5 0 0 1 1.08-.12c.76 0 1.33.18 1.7.5q.6.495.6 1.56v4h-.9zm-1.9-.87c.47 0 .83-.13 1.1-.38.3-.26.43-.62.43-1.08v-.52l-.76.03c-.6.03-1.02.13-1.3.3s-.4.45-.4.82c0 .26.08.47.24.6.16.16.4.23.7.23zm7.57-5.2c.25 0 .46.03.62.06l-.12 1.18a2.4 2.4 0 0 0-.56-.06c-.5 0-.92.16-1.24.5-.3.32-.47.75-.47 1.27v3.1h-1.27V7.23h1l.16 1.05h.05c.2-.36.45-.64.77-.85a1.83 1.83 0 0 1 1.02-.3zm4.12 6.17c-.9 0-1.58-.27-2.05-.8-.47-.52-.7-1.27-.7-2.25 0-1 .24-1.77.73-2.3.5-.54 1.2-.8 2.12-.8.63 0 1.2.1 1.7.34l-.4 1c-.52-.2-.96-.3-1.3-.3-1.04 0-1.55.68-1.55 2.05 0 .67.13 1.17.38 1.5.26.34.64.5 1.13.5a3.23 3.23 0 0 0 1.6-.4v1.1a2.5 2.5 0 0 1-.73.28 4.4 4.4 0 0 1-.93.08m8.28-.1h-1.27V9.5c0-.45-.1-.8-.28-1.02-.18-.23-.47-.34-.88-.34-.53 0-.9.16-1.16.48-.25.3-.38.85-.38 1.6v2.94h-1.26V4.8h1.26v2.12c0 .34-.02.7-.06 1.1h.08a1.76 1.76 0 0 1 .72-.67c.3-.16.66-.24 1.07-.24 1.43 0 2.15.74 2.15 2.2v3.86zM42.2 7.1c.74 0 1.32.28 1.73.82.4.53.62 1.3.62 2.26 0 .97-.2 1.73-.63 2.27-.42.54-1 .82-1.75.82s-1.33-.27-1.75-.8h-.08l-.23.7h-.94V4.8h1.26v2l-.02.64-.03.56h.05c.4-.6 1-.9 1.78-.9zm-.33 1.04c-.5 0-.88.15-1.1.45s-.34.8-.35 1.5v.08c0 .72.12 1.24.35 1.57.23.32.6.48 1.12.48.44 0 .78-.17 1-.53.24-.35.36-.87.36-1.53 0-1.35-.47-2.03-1.4-2.03zm3.24-.92h1.4l1.2 3.37c.18.47.3.92.36 1.34h.04l.18-.72 1.37-4H51l-2.53 6.73c-.46 1.23-1.23 1.85-2.3 1.85-.3 0-.56-.03-.83-.1v-1c.2.05.4.08.65.08.6 0 1.03-.36 1.28-1.06l.22-.56-2.4-5.94z'/%3E%3C/g%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100%;display:block;height:100%;margin-left:auto;margin-right:5px;overflow:hidden;text-indent:-9000px;width:110px}html[data-theme=dark] .algolia-docsearch-footer,html[data-theme=dark] .algolia-docsearch-suggestion--category-header,html[data-theme=dark] .algolia-docsearch-suggestion--wrapper{background:var(--ifm-background-color)!important;color:var(--ifm-font-color-base)!important}html[data-theme=dark] .algolia-docsearch-suggestion--title{color:var(--ifm-font-color-base)!important}html[data-theme=dark] .ds-cursor .algolia-docsearch-suggestion--wrapper{background:var(--ifm-background-surface-color)!important}mark{background-color:#add8e6}.theme-code-block:hover .copyButtonCopied_Vdqa{opacity:1!important}.copyButtonIcons_IEyt{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_TrPX,.copyButtonSuccessIcon_cVMy{fill:currentColor;height:inherit;left:0;opacity:inherit;position:absolute;top:0;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_cVMy{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.buttonGroup_M5ko button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.copyButtonCopied_Vdqa .copyButtonIcon_TrPX{opacity:0;transform:scale(.33)}.copyButtonCopied_Vdqa .copyButtonSuccessIcon_cVMy{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.wordWrapButtonIcon_b1P5{height:1.2rem;width:1.2rem}.buttonGroup_M5ko{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup_M5ko button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup_M5ko button:focus-visible,.buttonGroup_M5ko button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup_M5ko button{opacity:.4}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_jvwV{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_nLSi{transform:translate3d(0,calc(-100% - 2px),0)}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}.navbar__items--right>:last-child{padding-right:0}.anchorTargetStickyNavbar_Vzrq{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorTargetHideOnScrollNavbar_vjPI{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{position:relative;display:flex;flex-direction:column;min-height:100%}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.img_ev3q{height:auto}.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;fill:var(--ifm-alert-foreground-color);height:1.6em;width:1.6em}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.mdxPageWrapper_j9I6{justify-content:center}@media (min-width:576px);@media (min-width:601px){.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu{left:inherit!important;right:0!important}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu:before{right:48px}.algolia-autocomplete .ds-dropdown-menu{background:#0000;border:none;border-radius:4px;height:auto;margin:6px 0 0;max-width:600px;min-width:500px;padding:0;position:relative;text-align:left;top:-6px;z-index:999}}@media (min-width:768px){.algolia-docsearch-suggestion{border-bottom-color:#7671df}.algolia-docsearch-suggestion--subcategory-column{border-right-color:#7671df;color:#4e4726}}@media (min-width:997px){.collapseSidebarButton_JQG6,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_JQG6{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_Iseg{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_Iseg{transform:rotate(0)}.collapseSidebarButton_JQG6:focus,.collapseSidebarButton_JQG6:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_Y1UP{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_Y1UP{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_fPny{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_mhZE{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar__6UL{padding-top:0}.sidebarHidden__LRd{opacity:0;visibility:hidden}.sidebarLogo_F_0z{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);-webkit-text-decoration:none!important;text-decoration:none!important}.sidebarLogo_F_0z img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_dCNk{padding:0 var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_z5aJ{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:1200px){.premium-blocks{width:90%}}@media (max-width:1100px){.premium-blocks{grid-template-columns:repeat(3,1fr)}}@media (max-width:1050px){.premium-faq details{width:80%}}@media (max-width:1000px){.navbar-sidebar__item.menu{padding-top:50px}.navbar-sidebar .navbar-sidebar__brand{padding-top:16px}.premium-blocks{grid-template-columns:repeat(3,1fr)}.navbar{padding:2px 0}.navbar__logo{height:30px}.navbar .navbar__brand{margin-left:0}.navbar .navbar__inner{padding:16px}.navbar-line{top:65.5px}.navbar__search-input{width:100%!important}.algolia-autocomplete.algolia-autocomplete-left{position:static!important}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu{left:0!important;position:relative!important;top:-6px!important}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu:before{left:1rem}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu:not(:has(.ds-suggestion)):before{display:none}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_x44X,.footer__link-separator,.navbar__item,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block;width:max-content}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.navbarSearchContainer_dCNk{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media (max-width:900px){.display-flex-grid{display:grid}.gap-20-0{gap:0}.column-mobile,.flex-direction-default-column{flex-direction:column}.margin-top-125-0{margin-top:0}.flex-end-center,.flex-start-center,.justify-center-mobile{justify-content:center}.min-width-180-135{min-width:135px}.gap-30-16{gap:16px}.font-30-20{font-size:20px}.padding-right-20-0{padding-right:0}.margin-right-10-6{margin-right:6px}.margin-bottom-16-10{margin-bottom:10px}.width-140-120{width:120px}.margin-right-6-8{margin-right:8px}.padding-side-10-12,.padding-side-16-12{padding-left:12px;padding-right:12px}.padding-top-64-46{padding-top:46}.margin-left-10-0{margin-left:0}.auto-margin-mobile,.block h1,.block h2,.centered-mobile,.centered-mobile-p,.centered-smaller-mobile{margin-left:auto;margin-right:auto}.height-26-21{height:21px}.gap-24-20{gap:20px}.font-20-16{font-size:16px}.font-16-14,.font-20-14{font-size:14px}.hide-desktop{display:flex}.hide-mobile{display:none}.block{padding-top:30px}.block.tropy-before{padding-top:90px}.block .content{max-width:100%}.block .inner{flex-direction:column-reverse;gap:32px}.half p,.text-center-mobile{text-align:center}.block .inner .half{width:100%}.block .inner .half.right{overflow-x:scroll;overflow-y:hidden;scrollbar-width:none}.centered-mobile{width:min(1120px,74%)}.centered-mobile-p{max-width:88%;text-align:center}.centered-smaller-mobile{justify-content:center;width:min(1120px,68%)}.flex-wrap-mobile{flex-wrap:wrap}.grid-2-mobile{grid-template-columns:repeat(2,1fr)}.block h1,.block h2{font-size:26px;font-weight:800;max-width:92%}.framework-icon{height:30px;width:30px}.footer .footer-community-links{margin-top:32px}.hero-img{max-height:300px}}@media (max-width:800px){.premium-blocks,.premium-request iframe{width:100%}.price-calculator{width:96%}.price-calculator-inner{margin-left:2%;width:96%}.price-calculator .field label{width:30%}.price-calculator .field .input{width:65%}.premium-faq details{width:90%}}@media (max-width:700px){.premium-blocks{grid-template-columns:repeat(2,1fr)}.call-to-action .call-to-action-icon{display:contents}.navbar .call-to-action{margin-right:95px}.call-to-action .call-to-action-keyword{display:none}.call-to-action-popup{margin-right:5%;width:90%}}@media (max-width:600px){.samp-wrapper{width:90%}.algolia-autocomplete .ds-dropdown-menu{display:block;left:auto!important;max-height:calc(100% - 5rem);max-width:calc(100% - 2rem);position:fixed!important;right:1rem!important;top:50px!important;width:600px;z-index:100}.algolia-autocomplete .ds-dropdown-menu:before{right:6rem}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media (max-width:500px){.navbar__search #search_input_react{width:6rem}}@media (max-width:480px){.padding-button{padding:6px 15px}.samp-wrapper{width:93%}}@media (max-width:400px){.tag-cloud-tag{margin:0 10px}}@media (max-width:340px){.navbar .text{padding-right:4px}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.noPrint_WFHX,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}} \ No newline at end of file diff --git a/docs/assets/js/0027230a.2e976381.js b/docs/assets/js/0027230a.2e976381.js deleted file mode 100644 index 3851ed6a09c..00000000000 --- a/docs/assets/js/0027230a.2e976381.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[8382],{3520(e,s,n){n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"rx-storage-lokijs","title":"Empower RxDB with the LokiJS RxStorage","description":"Discover the lightning-fast LokiJS RxStorage for RxDB. Explore in-memory speed, multi-tab support, and pros & cons of this unique storage solution.","source":"@site/docs/rx-storage-lokijs.md","sourceDirName":".","slug":"/rx-storage-lokijs.html","permalink":"/rx-storage-lokijs.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Empower RxDB with the LokiJS RxStorage","slug":"rx-storage-lokijs.html","description":"Discover the lightning-fast LokiJS RxStorage for RxDB. Explore in-memory speed, multi-tab support, and pros & cons of this unique storage solution."}}');var i=n(4848),o=n(8453);const a={title:"Empower RxDB with the LokiJS RxStorage",slug:"rx-storage-lokijs.html",description:"Discover the lightning-fast LokiJS RxStorage for RxDB. Explore in-memory speed, multi-tab support, and pros & cons of this unique storage solution."},t="RxStorage LokiJS",l={},d=[{value:"Pros",id:"pros",level:3},{value:"Cons",id:"cons",level:3},{value:"Usage",id:"usage",level:2},{value:"Adapters",id:"adapters",level:2},{value:"Multi-Tab support",id:"multi-tab-support",level:2},{value:"Autosave and autoload",id:"autosave-and-autoload",level:2},{value:"Known problems",id:"known-problems",level:2},{value:"Using the internal LokiJS database",id:"using-the-internal-lokijs-database",level:2},{value:"Disabling the non-premium console log",id:"disabling-the-non-premium-console-log",level:2}];function c(e){const s={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"rxstorage-lokijs",children:"RxStorage LokiJS"})}),"\n",(0,i.jsxs)(s.p,{children:["The LokiJS RxStorage is based on ",(0,i.jsx)(s.a,{href:"https://github.com/techfort/LokiJS",children:"LokiJS"})," which is an ",(0,i.jsx)(s.strong,{children:"in-memory"})," database that processes all data in memory and only saves to disc when the app is closed or an interval is reached. This makes it very fast but you have the possibility to lose seemingly persisted writes when the JavaScript process ends before the persistence loop has been done."]}),"\n",(0,i.jsx)(s.admonition,{title:"LokiJS was removed in RxDB version 16",type:"warning",children:(0,i.jsxs)(s.p,{children:["The LokiJS project itself is no longer in development or maintained and therefore the lokijs RxStorage is ",(0,i.jsx)(s.strong,{children:"removed"}),". There are known bugs like having wrong query results of losing data. LokiJS bugs that occur outside of the RxDB layer will not be fixed and the LokiJS RxStorage was removed in RxDB version 16. Using LokiJS as storage is no longer possible. In production it is recommended to use another ",(0,i.jsx)(s.a,{href:"/rx-storage.html",children:"RxStorage"})," instead. For browsers better use the ",(0,i.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB"})," storage. For fast lazy persistence in memory data (similar to how lokijs works) you can use the ",(0,i.jsx)(s.a,{href:"/rx-storage-memory-mapped.html",children:"Memory Mapped"})," storage. If you really need the lokijs RxStorage, you can fork the open-source code from the previous RxDB version."]})}),"\n",(0,i.jsx)(s.h3,{id:"pros",children:"Pros"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Queries can run faster because all data is processed in memory."}),"\n",(0,i.jsx)(s.li,{children:"It has a much faster initial load time because it loads all data from IndexedDB in a single request. But this is only true for small datasets. If much data must is stored, the initial load time can be higher than on other RxStorage implementations."}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"cons",children:"Cons"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"It does not support attachments."}),"\n",(0,i.jsx)(s.li,{children:"Data can be lost when the JavaScript process is killed ungracefully like when the browser crashes or the power of the PC is terminated."}),"\n",(0,i.jsx)(s.li,{children:"All data must fit into the memory."}),"\n",(0,i.jsxs)(s.li,{children:["Slow initialisation time when used with ",(0,i.jsx)(s.code,{children:"multiInstance: true"})," because it has to await the leader election process."]}),"\n",(0,i.jsxs)(s.li,{children:["Slow initialisation time when really much data is stored inside of the database because it has to parse a big ",(0,i.jsx)(s.code,{children:"JSON"})," string."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageLoki"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-lokijs'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// in the browser, we want to persist data in IndexedDB, so we use the indexeddb adapter."})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" LokiIncrementalIndexedDBAdapter"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'lokijs/src/incremental-indexeddb-adapter'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLoki"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" adapter"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" LokiIncrementalIndexedDBAdapter"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* "})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * Do not set lokiJS persistence options like autoload and autosave,"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * RxDB will pick proper defaults based on the given adapter"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.h2,{id:"adapters",children:"Adapters"}),"\n",(0,i.jsxs)(s.p,{children:["LokiJS is based on adapters that determine where to store persistent data. For LokiJS there are adapters for IndexedDB, AWS S3, the NodeJS filesystem or NativeScript.\nFind more about the possible adapters at the ",(0,i.jsx)(s.a,{href:"https://github.com/techfort/LokiJS/blob/master/tutorials/Persistence%20Adapters.md",children:"LokiJS docs"}),". For react native there is also the ",(0,i.jsx)(s.a,{href:"https://github.com/jonnyreeves/loki-async-reference-adapter",children:"loki-async-reference-adapter"}),"."]}),"\n",(0,i.jsx)(s.h2,{id:"multi-tab-support",children:"Multi-Tab support"}),"\n",(0,i.jsxs)(s.p,{children:["When you use plain LokiJS, you cannot build an app that can be used in multiple browser tabs. The reason is that LokiJS loads data in bulk and then only regularly persists the in-memory state to disc. When opened in multiple tabs, it would happen that the LokiJS instances overwrite each other and data is lost.\nWith the RxDB LokiJS-plugin, this problem is fixed with the ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/broadcast-channel#using-the-leaderelection",children:"LeaderElection"})," module. Between all open tabs, a leading tab is elected and only in this tab a database is created. All other tabs do not run queries against their own database, but instead call the leading tab to send and retrieve data. When the leading tab is closed, a new leader is elected that reopens the database and processes queries. You can disable this by setting ",(0,i.jsx)(s.code,{children:"multiInstance: false"})," when creating the ",(0,i.jsx)(s.code,{children:"RxDatabase"}),"."]}),"\n",(0,i.jsx)(s.h2,{id:"autosave-and-autoload",children:"Autosave and autoload"}),"\n",(0,i.jsxs)(s.p,{children:["When using plain LokiJS, you could set the ",(0,i.jsx)(s.code,{children:"autosave"})," option to ",(0,i.jsx)(s.code,{children:"true"})," to make sure that LokiJS persists the database state after each write into the persistence adapter. Same goes to ",(0,i.jsx)(s.code,{children:"autoload"})," which loads the persisted state on database creation.\nBut RxDB knows better when to persist the database state and when to load it, so it has its own autosave logic. This will ensure that running the persistence handler does not affect the performance of more important tasks. Instead RxDB will always wait until the database is idle and then runs the persistence handler.\nA load of the persisted state is done on database or collection creation and it is ensured that multiple load calls do not run in parallel and interfere with each other or with ",(0,i.jsx)(s.code,{children:"saveDatabase()"})," calls."]}),"\n",(0,i.jsx)(s.h2,{id:"known-problems",children:"Known problems"}),"\n",(0,i.jsxs)(s.p,{children:["When you bundle the LokiJS Plugin with webpack, you might get the error ",(0,i.jsx)(s.code,{children:'Cannot find module "fs"'}),". This is because LokiJS uses a ",(0,i.jsx)(s.code,{children:"require('fs')"})," statement that cannot work in the browser.\nYou can fix that by telling webpack to not resolve the ",(0,i.jsx)(s.code,{children:"fs"})," module with the following block in your webpack config:"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// in your webpack.config.js"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"{"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" resolve"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" fallback"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" fs"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" false"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Or if you do not have a webpack.config.js like you do with angular,"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// you might fix it by setting the browser field in the package.json"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"{"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "browser"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:": {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "fs"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" false"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "})]})})}),"\n",(0,i.jsx)(s.h2,{id:"using-the-internal-lokijs-database",children:"Using the internal LokiJS database"}),"\n",(0,i.jsx)(s.p,{children:"For custom operations, you can access the internal LokiJS database.\nThis is dangerous because you might do changes that are not compatible with RxDB.\nOnly use this when there is no way to achieve your goals via the RxDB API."}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storageInstance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".storageInstance;"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" localState"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storageInstance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"internals"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".localState;"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"localState"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" key"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foo'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" value"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bar'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" _deleted"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" _attachments"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" _rev"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '1-62080c42d471e3d2625e49dcca3b8e3e'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" _meta"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" lwt"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Date"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".getTime"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// manually trigger the save queue because we did a write to the internal loki db. "})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" localState"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"databaseState"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"saveQueue"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addWrite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),"\n",(0,i.jsx)(s.h2,{id:"disabling-the-non-premium-console-log",children:"Disabling the non-premium console log"}),"\n",(0,i.jsxs)(s.p,{children:["We want to be transparent with our community, and you'll notice a console message when using the free Loki.js based RxStorage implementation. This message serves to inform you about the availability of faster storage solutions within our ",(0,i.jsx)(s.a,{href:"/premium/",children:"\ud83d\udc51 Premium Plugins"}),". We understand that this might be a minor inconvenience, and we sincerely apologize for that. However, maintaining and improving RxDB requires substantial resources, and our premium users help us ensure its sustainability. If you find value in RxDB and wish to remove this message, we encourage you to explore our premium storage options, which are optimized for professional use and production environments. Thank you for your understanding and support."]}),"\n",(0,i.jsxs)(s.p,{children:["If you already have premium access and want to use the LokiJS ",(0,i.jsx)(s.a,{href:"/rx-storage.html",children:"RxStorage"})," without the log, you can call the ",(0,i.jsx)(s.code,{children:"setPremiumFlag()"})," function to disable the log."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { setPremiumFlag } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/shared'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"setPremiumFlag"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453(e,s,n){n.d(s,{R:()=>a,x:()=>t});var r=n(6540);const i={},o=r.createContext(i);function a(e){const s=r.useContext(o);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(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/01684a0a.ac267d98.js b/docs/assets/js/01684a0a.ac267d98.js deleted file mode 100644 index 00526951e5a..00000000000 --- a/docs/assets/js/01684a0a.ac267d98.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[6616],{7971(e,n,s){s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>i,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"rx-storage-memory-synced","title":"Instant Performance with Memory Synced RxStorage","description":"Accelerate RxDB with in-memory storage replicated to disk. Enjoy instant queries, faster loads, and unstoppable performance for your web apps.","source":"@site/docs/rx-storage-memory-synced.md","sourceDirName":".","slug":"/rx-storage-memory-synced.html","permalink":"/rx-storage-memory-synced.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Instant Performance with Memory Synced RxStorage","slug":"rx-storage-memory-synced.html","description":"Accelerate RxDB with in-memory storage replicated to disk. Enjoy instant queries, faster loads, and unstoppable performance for your web apps."}}');var a=s(4848),o=s(8453);const i={title:"Instant Performance with Memory Synced RxStorage",slug:"rx-storage-memory-synced.html",description:"Accelerate RxDB with in-memory storage replicated to disk. Enjoy instant queries, faster loads, and unstoppable performance for your web apps."},t="Memory Synced RxStorage",l={},c=[{value:"Pros",id:"pros",level:2},{value:"Cons",id:"cons",level:2},{value:"Usage",id:"usage",level:2},{value:"Options",id:"options",level:2},{value:"Replication and Migration with the memory-synced storage",id:"replication-and-migration-with-the-memory-synced-storage",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",span:"span",ul:"ul",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"memory-synced-rxstorage",children:"Memory Synced RxStorage"})}),"\n",(0,a.jsxs)(n.p,{children:["The memory synced ",(0,a.jsx)(n.a,{href:"/rx-storage.html",children:"RxStorage"})," is a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance is replicated with the underlying storage for persistence.\nThe main reason to use this is to improve initial page load and query/write times. This is mostly useful in browser based applications."]}),"\n",(0,a.jsx)(n.h2,{id:"pros",children:"Pros"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Improves read/write performance because these operations run against the in-memory storage."}),"\n",(0,a.jsx)(n.li,{children:"Decreases initial page load because it load all data in a single bulk request. It even detects if the database is used for the first time and then it does not have to await the creation of the persistent storage."}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"cons",children:"Cons"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"It does not support attachments."}),"\n",(0,a.jsxs)(n.li,{children:["When the JavaScript process is killed ungracefully like when the browser crashes or the power of the PC is terminated, it might happen that some memory writes are not persisted to the parent storage. This can be prevented with the ",(0,a.jsx)(n.code,{children:"awaitWritePersistence"})," flag."]}),"\n",(0,a.jsx)(n.li,{children:"This can only be used if all data fits into the memory of the JavaScript process. This is normally not a problem because a browser has much memory these days and plain json document data is not that big."}),"\n",(0,a.jsxs)(n.li,{children:["Because it has to await an initial replication from the parent storage into the memory, initial page load time can increase when much data is already stored. This is likely not a problem when you store less than ",(0,a.jsx)(n.code,{children:"10k"})," documents."]}),"\n",(0,a.jsx)(n.li,{children:"The memory-synced storage itself does not support replication and migration. Instead you have to replicate the underlying parent storage."}),"\n",(0,a.jsxs)(n.li,{children:["The ",(0,a.jsx)(n.code,{children:"memory-synced"})," plugin is part of ",(0,a.jsx)(n.a,{href:"/premium/",children:"RxDB Premium \ud83d\udc51"}),". It is not part of the default RxDB module."]}),"\n"]}),"\n",(0,a.jsx)(n.admonition,{title:"The memory-synced RxStorage was removed in RxDB version 16",type:"note",children:(0,a.jsxs)(n.p,{children:["The ",(0,a.jsx)(n.code,{children:"memory-synced"})," was removed in RxDB version 16. Instead consider using the newer and better ",(0,a.jsx)(n.a,{href:"/rx-storage-memory-mapped.html",children:"memory-mapped RxStorage"})," which has better trade-offs and is easier to configure."]})}),"\n",(0,a.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,a.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,a.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageIndexedDB"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-indexeddb'"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" getMemorySyncedRxStorage"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-memory-synced'"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Here we use the IndexedDB RxStorage as persistence storage."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Any other RxStorage can also be used."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" parentStorage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// wrap the persistent storage with the memory synced one."})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getMemorySyncedRxStorage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" parentStorage"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// create the RxDatabase like you would do with any other RxStorage"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myDatabase,"})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/** ... **/"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "})]})})}),"\n",(0,a.jsx)(n.h2,{id:"options",children:"Options"}),"\n",(0,a.jsx)(n.p,{children:"Some options can be provided to fine tune the performance and behavior."}),"\n",(0,a.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,a.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" requestIdlePromise"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getMemorySyncedRxStorage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" parentStorage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Defines how many document"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * get replicated in a single batch."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * [default=50]"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * "})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * (optional)"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 50"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * By default, the parent storage will be created without indexes for a faster page load."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Indexes are not needed because the queries will anyway run on the memory storage."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * You can disable this behavior by setting keepIndexesOnParent to true."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * If you use the same parent storage for multiple RxDatabase instances where one is not"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * a asynced-memory storage, you will get the error: 'schema not equal to existing storage'"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * if you do not set keepIndexesOnParent to true."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * "})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * (optional)"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" keepIndexesOnParent"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * If set to true, all write operations will resolve AFTER the writes"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * have been persisted from the memory to the parentStorage."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * This ensures writes are not lost even if the JavaScript process exits"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * between memory writes and the persistence interval."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * default=false"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" awaitWritePersistence"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * After a write, await until the return value of this method resolves"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * before replicating with the master storage."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * "})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * By returning requestIdlePromise() we can ensure that the CPU is idle"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * and no other, more important operation is running. By doing so we can be sure"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * that the replication does not slow down any rendering of the browser process."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * "})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * (optional)"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" waitBeforePersist"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" requestIdlePromise"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(n.h2,{id:"replication-and-migration-with-the-memory-synced-storage",children:"Replication and Migration with the memory-synced storage"}),"\n",(0,a.jsxs)(n.p,{children:["The memory-synced storage itself does not support replication and migration. Instead you have to replicate the underlying parent storage.\nFor example when you use it on top of an ",(0,a.jsx)(n.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB storage"}),", you have to run replication on that storage instead by creating a different ",(0,a.jsx)(n.a,{href:"/rx-database.html",children:"RxDatabase"}),"."]}),"\n",(0,a.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,a.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" parentStorage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" memorySyncedStorage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getMemorySyncedRxStorage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" parentStorage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" keepIndexesOnParent"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" databaseName"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydata'"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Create a parent database with the same name+collections"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * and use it for replication and migration."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * The parent database must be created BEFORE the memory-synced database"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * to ensure migration has already been run."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" parentDatabase"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" databaseName"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" parentStorage"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" parentDatabase"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"replicateRxCollection"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" parentDatabase"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".myCollection"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Create an equal memory-synced database with the same name+collections"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * and use it for writes and queries."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" memoryDatabase"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" databaseName"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" memorySyncedStorage"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" memoryDatabase"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453(e,n,s){s.d(n,{R:()=>i,x:()=>t});var r=s(6540);const a={},o=r.createContext(a);function i(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/01a106d5.2ac15d82.js b/docs/assets/js/01a106d5.2ac15d82.js deleted file mode 100644 index 8da482e7cd2..00000000000 --- a/docs/assets/js/01a106d5.2ac15d82.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[5423],{3247(e,s,n){n.d(s,{g:()=>i});var r=n(4848);function i(e){const s=[];let n=null;return e.children.forEach(e=>{e.props.id?(n&&s.push(n),n={headline:e,paragraphs:[]}):n&&n.paragraphs.push(e)}),n&&s.push(n),(0,r.jsx)("div",{style:o.stepsContainer,children:s.map((e,s)=>(0,r.jsxs)("div",{style:o.stepWrapper,children:[(0,r.jsxs)("div",{style:o.stepIndicator,children:[(0,r.jsx)("div",{style:o.stepNumber,children:s+1}),(0,r.jsx)("div",{style:o.verticalLine})]}),(0,r.jsxs)("div",{style:o.stepContent,children:[(0,r.jsx)("div",{children:e.headline}),e.paragraphs.map((e,s)=>(0,r.jsx)("div",{style:o.item,children:e},s))]})]},s))})}const o={stepsContainer:{display:"flex",flexDirection:"column"},stepWrapper:{display:"flex",alignItems:"stretch",marginBottom:"1.5rem",position:"relative",minWidth:0},stepIndicator:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",width:"33px",marginRight:"1rem",minWidth:0},stepNumber:{width:"33px",height:"33px",borderRadius:"50%",backgroundColor:"var(--color-top)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:"bold",marginTop:-4},verticalLine:{position:"absolute",top:29,bottom:"0",left:"50%",width:"1px",background:"linear-gradient(to bottom, var(--color-top) 0%, var(--color-top) 80%, rgba(0,0,0,0) 100%)",transform:"translateX(-50%)"},stepContent:{flex:1,minWidth:0,overflowWrap:"break-word"},item:{marginTop:"0.5rem"}}},7450(e,s,n){n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>t,default:()=>p,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"react","title":"React","description":"RxDB provides first-class support for both React and React Native via a dedicated React integration. This integration makes it possible to use RxDB inside functional components using React Context and hooks, without manually subscribing to observables or managing cleanup logic.","source":"@site/docs/react.md","sourceDirName":".","slug":"/react.html","permalink":"/react.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"React","slug":"react.html"},"sidebar":"tutorialSidebar","previous":{"title":"Third Party Plugins","permalink":"/third-party-plugins.html"},"next":{"title":"RxStorage Performance","permalink":"/rx-storage-performance.html"}}');var i=n(4848),o=n(8453),a=(n(2636),n(3247));const l={title:"React",slug:"react.html"},t="React",c={},d=[{value:"General concept",id:"general-concept",level:2},{value:"Usage",id:"usage",level:2},{value:"Installation",id:"installation",level:3},{value:"Database creation",id:"database-creation",level:3},{value:"Providing the database",id:"providing-the-database",level:3},{value:"Accessing collections",id:"accessing-collections",level:3},{value:"Queries",id:"queries",level:3},{value:"Live queries",id:"live-queries",level:3},{value:"React Native compatibility",id:"react-native-compatibility",level:2},{value:"Signals",id:"signals",level:2},{value:"Follow Up",id:"follow-up",level:2}];function h(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"react",children:"React"})}),"\n",(0,i.jsx)(s.p,{children:"RxDB provides first-class support for both React and React Native via a dedicated React integration. This integration makes it possible to use RxDB inside functional components using React Context and hooks, without manually subscribing to observables or managing cleanup logic."}),"\n",(0,i.jsxs)(s.p,{children:["The same APIs work in ",(0,i.jsx)(s.strong,{children:"React"})," for the web and in ",(0,i.jsx)(s.a,{href:"/react-native-database.html",children:"React Native"}),". The only difference between platforms is the storage and environment setup. The React integration itself behaves identically in both."]}),"\n",(0,i.jsx)(s.h2,{id:"general-concept",children:"General concept"}),"\n",(0,i.jsx)(s.p,{children:"RxDB is internally reactive and emits changes via RxJS observables. React and React Native, however, are render-driven frameworks that rely on component state and hooks. The RxDB React integration bridges these two models by exposing a small set of hooks that translate RxDB state into React renders."}),"\n",(0,i.jsx)(s.p,{children:"Instead of hiding reactivity behind configuration flags, the integration uses explicit hooks. This makes component behavior predictable, avoids accidental subscriptions, and keeps performance characteristics easy to reason about."}),"\n",(0,i.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,i.jsxs)(a.g,{children:[(0,i.jsx)(s.h3,{id:"installation",children:"Installation"}),(0,i.jsx)(s.p,{children:"Install RxDB and React as usual:"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" rxdb"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" react"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" react-dom"})]})})})}),(0,i.jsx)(s.h3,{id:"database-creation",children:"Database creation"}),(0,i.jsx)(s.p,{children:"Database creation is not part of the React integration itself. RxDB is created in the same way as in non-React applications, including storage selection, plugins, replication, hooks, and schema definitions."}),(0,i.jsx)(s.p,{children:"This separation is intentional. React components should never be responsible for creating or configuring the database. They should only consume it."}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" addRxPlugin"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageLocalstorage"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'heroesreactdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" myRxSchema"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * Do other stuff here"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * like setting up middleware"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * or starting replication."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" db;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),(0,i.jsx)(s.h3,{id:"providing-the-database",children:"Providing the database"}),(0,i.jsxs)(s.p,{children:["To use RxDB in a React or React Native application, the database instance must be provided via a context. This is done using ",(0,i.jsx)(s.code,{children:"RxDatabaseProvider"}),"."]}),(0,i.jsx)(s.p,{children:"The database itself is created outside of React, usually in a separate module. The provider is only responsible for making the database available to components once it has been initialized."}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"tsx","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"tsx","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" React"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { useEffect"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" useState } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'react'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { RxDatabaseProvider } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/react'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" './Database'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" App"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"database"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" setDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"] "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" useState"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" useEffect"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(() "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" initDb"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" setDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(db);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" initDb"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" []);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (database "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" null"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:") {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"span"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" Loading <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"a"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" href"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"https://rxdb.info/react.html"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">RxDB database..."})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"RxDatabaseProvider"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" database"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"{database}>"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/* your application */"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" "})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" default"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" App;"})]})]})})}),(0,i.jsx)(s.h3,{id:"accessing-collections",children:"Accessing collections"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { useRxCollection } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/react'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" useRxCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'heroes'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})}),(0,i.jsxs)(s.p,{children:["The hook returns the collection once it becomes available. During the initial render, the value may be ",(0,i.jsx)(s.code,{children:"undefined"}),", so components must handle this case."]}),(0,i.jsx)(s.p,{children:"This hook does not subscribe to any data. It only provides access to the collection instance."}),(0,i.jsx)(s.h3,{id:"queries",children:"Queries"}),(0,i.jsxs)(s.p,{children:["To render query results in your component, use the ",(0,i.jsx)(s.code,{children:"useRxQuery"})," hook."]}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"tsx","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"tsx","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { useRxQuery } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/react'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'heroes'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" query"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sort"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" [{ name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'asc'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }]"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" HeroCount"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"results"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" loading"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" useRxQuery"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(query);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (loading) {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"span"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">Loading...;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"span"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">Total heroes: {"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"results"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"length"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),(0,i.jsx)(s.p,{children:"The query is executed when the component renders. If the component re-renders, the query may be re-executed, but changes in the underlying data will not automatically trigger updates."}),(0,i.jsx)(s.p,{children:"This hook is well suited for static views, server-side rendering, and cases where live updates are not required."}),(0,i.jsx)(s.h3,{id:"live-queries",children:"Live queries"}),(0,i.jsxs)(s.p,{children:["Most React applications require views that automatically update when the database changes. For this purpose, RxDB provides the ",(0,i.jsx)(s.code,{children:"useLiveRxQuery"})," hook."]}),(0,i.jsx)(s.p,{children:"The hook accepts a query description object and returns the current results together with a loading state."}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"tsx","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"tsx","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { useLiveRxQuery } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/react'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'heroes'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" query"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sort"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" [{ name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'asc'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }]"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" HeroList"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"results"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" loading"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" useLiveRxQuery"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(query);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (loading) {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"span"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">Loading...;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"ul"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"results"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".map"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(hero "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"li"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" key"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"{"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"hero"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".name}>{"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"hero"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".name}"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ))}"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" "})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),(0,i.jsx)(s.p,{children:"The component automatically re-renders whenever the query result changes. Subscriptions are created when the component mounts and are cleaned up automatically when the component unmounts."}),(0,i.jsx)(s.p,{children:"The returned documents are fully reactive RxDB documents and can be modified or removed directly."})]}),"\n",(0,i.jsx)(s.h2,{id:"react-native-compatibility",children:"React Native compatibility"}),"\n",(0,i.jsx)(s.p,{children:"All hooks and providers described on this page work the same way in React Native. The React integration does not rely on any browser-specific APIs."}),"\n",(0,i.jsx)(s.p,{children:"The only platform-specific part of a React Native setup is database creation, where a different storage plugin is typically used. Once the database is created, the React integration behaves identically."}),"\n",(0,i.jsx)(s.h2,{id:"signals",children:"Signals"}),"\n",(0,i.jsxs)(s.p,{children:["In addition to the React hooks shown on this page, RxDB also supports alternative reactivity models such as ",(0,i.jsx)(s.a,{href:"/reactivity.html#react",children:"signals"}),". RxDB's core reactivity system can be configured to expose reactive values using different primitives instead of RxJS observables, which makes it possible to integrate RxDB with signal-based approaches in React or other frameworks. This is an advanced capability and is independent of the React integration described here. For more details about how RxDB's reactivity system works and how custom reactivity can be configured, see the ",(0,i.jsx)(s.a,{href:"/reactivity.html",children:"Reactivity documentation"}),"."]}),"\n",(0,i.jsx)(s.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["RxDB includes a full ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/react",children:"React example application"})," that demonstrates the patterns described on this page, including database creation outside of React, usage of ",(0,i.jsx)(s.code,{children:"RxDatabaseProvider"}),", and data access via ",(0,i.jsx)(s.code,{children:"useRxQuery"}),", ",(0,i.jsx)(s.code,{children:"useLiveRxQuery"}),", and `useRxCollection."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["A corresponding ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/react-native",children:"React Native example"})," is also available and shows the same integration concepts applied in a mobile environment, with only the platform-specific storage and setup differing."]}),"\n"]}),"\n"]})]})}function p(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453(e,s,n){n.d(s,{R:()=>a,x:()=>l});var r=n(6540);const i={},o=r.createContext(i);function a(e){const s=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/03e37916.82c0454b.js b/docs/assets/js/03e37916.82c0454b.js deleted file mode 100644 index fd427026789..00000000000 --- a/docs/assets/js/03e37916.82c0454b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[6465],{5522(e,n,t){t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"transactions-conflicts-revisions","title":"Transactions, Conflicts and Revisions","description":"Learn RxDB\'s approach to local and replication conflicts. Discover how incremental writes and custom handlers keep your app stable and efficient.","source":"@site/docs/transactions-conflicts-revisions.md","sourceDirName":".","slug":"/transactions-conflicts-revisions.html","permalink":"/transactions-conflicts-revisions.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Transactions, Conflicts and Revisions","slug":"transactions-conflicts-revisions.html","description":"Learn RxDB\'s approach to local and replication conflicts. Discover how incremental writes and custom handlers keep your app stable and efficient."},"sidebar":"tutorialSidebar","previous":{"title":"RxServer Scaling","permalink":"/rx-server-scaling.html"},"next":{"title":"Query Cache","permalink":"/query-cache.html"}}');var i=t(4848),a=t(8453);const o={title:"Transactions, Conflicts and Revisions",slug:"transactions-conflicts-revisions.html",description:"Learn RxDB's approach to local and replication conflicts. Discover how incremental writes and custom handlers keep your app stable and efficient."},r="Transactions, Conflicts and Revisions",l={},c=[{value:"Why RxDB does not have transactions",id:"why-rxdb-does-not-have-transactions",level:2},{value:"Revisions",id:"revisions",level:2},{value:"Conflicts",id:"conflicts",level:2},{value:"Local conflicts",id:"local-conflicts",level:3},{value:"Replication conflicts",id:"replication-conflicts",level:2},{value:"Custom conflict handler",id:"custom-conflict-handler",level:2}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"transactions-conflicts-and-revisions",children:"Transactions, Conflicts and Revisions"})}),"\n",(0,i.jsx)(n.p,{children:"In contrast to most SQL databases, RxDB does not have the concept of relational, ACID transactions. Instead, RxDB has to apply different techniques that better suit the offline-first, client side world where it is not possible to create a transaction between multiple maybe-offline client devices."}),"\n",(0,i.jsx)(n.h2,{id:"why-rxdb-does-not-have-transactions",children:"Why RxDB does not have transactions"}),"\n",(0,i.jsxs)(n.p,{children:["When talking about transactions, we mean ",(0,i.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/ACID",children:"ACID transactions"})," that guarantee the properties of atomicity, consistency, isolation and durability.\nWith an ACID transaction you can mutate data dependent on the current state of the database. It is ensured that no other database operations happen in between your transaction and after the transaction has finished, it is guaranteed that the new data is actually written to the disc."]}),"\n",(0,i.jsxs)(n.p,{children:["To implement ACID transactions on a ",(0,i.jsx)(n.strong,{children:"single server"}),", the database has to keep track on who is running transactions and then schedule these transactions so that they can run in isolation."]}),"\n",(0,i.jsxs)(n.p,{children:["As soon as you have to split your database on ",(0,i.jsx)(n.strong,{children:"multiple servers"}),", transaction handling becomes way more difficult. The servers have to communicate with each other to find a consensus about which transaction can run and which has to wait. Network connections might break, or one server might complete its part of the transaction and then be required to roll back its changes because of an error on another server."]}),"\n",(0,i.jsxs)(n.p,{children:["But with RxDB you have ",(0,i.jsx)(n.strong,{children:"multiple clients"})," that can go randomly online or offline. The users can have different devices and the clock of these devices can go off by any time. To support ACID transactions here, RxDB would have to make the whole world stand still for all clients, while one client is doing a write operation. And even that can only work when all clients are online. Implementing that might be possible, but at the cost of an unpredictable amount of performance loss and not being able to support ",(0,i.jsx)(n.a,{href:"/offline-first.html",children:"offline-first"}),"."]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"A single write operation to a document is the only atomic thing you can do in RxDB."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The benefits of not having to support transactions:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Clients can read and write data without blocking each other."}),"\n",(0,i.jsxs)(n.li,{children:["Clients can write data while being ",(0,i.jsx)(n.strong,{children:"offline"})," and then replicate with a server when they are ",(0,i.jsx)(n.strong,{children:"online"})," again, called ",(0,i.jsx)(n.a,{href:"/offline-first.html",children:"offline-first"}),"."]}),"\n",(0,i.jsx)(n.li,{children:"Creating a compatible backend for the replication is easy so that RxDB can replicate with any existing infrastructure."}),"\n",(0,i.jsxs)(n.li,{children:["Optimizations like ",(0,i.jsx)(n.a,{href:"/rx-storage-sharding.html",children:"Sharding"})," can be used."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"revisions",children:"Revisions"}),"\n",(0,i.jsx)(n.p,{children:"Working without transactions leads to having undefined state when doing multiple database operations at the same time. Most client side databases rely on a last-write-wins strategy on write operations. This might be a viable solution for some cases, but often this leads to strange problems that are hard to debug."}),"\n",(0,i.jsxs)(n.p,{children:["Instead, to ensure that the behavior of RxDB is ",(0,i.jsx)(n.strong,{children:"always predictable"}),", RxDB relies on ",(0,i.jsx)(n.strong,{children:"revisions"})," for version control. Revisions work similar to ",(0,i.jsx)(n.a,{href:"https://martinfowler.com/articles/patterns-of-distributed-systems/lamport-clock.html",children:"Lamport Clocks"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Each document is stored together with its revision string, that looks like ",(0,i.jsx)(n.code,{children:"1-9dcca3b8e1a"})," and consists of:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["The revision height, a number that starts with ",(0,i.jsx)(n.code,{children:"1"})," and is increased with each write to that document."]}),"\n",(0,i.jsx)(n.li,{children:"The database instance token."}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["An operation to the RxDB data layer does not only contain the new document data, but also the previous document data with its revision string. If the previous revision matches the revision that is currently stored in the database, the write operation can succeed. If the previous revision is ",(0,i.jsx)(n.strong,{children:"different"})," than the revision that is currently stored in the database, the operation will throw a ",(0,i.jsx)(n.code,{children:"409 CONFLICT"})," error."]}),"\n",(0,i.jsx)(n.h2,{id:"conflicts",children:"Conflicts"}),"\n",(0,i.jsxs)(n.p,{children:["There are two types of conflicts in RxDB, the ",(0,i.jsx)(n.strong,{children:"local conflict"})," and the ",(0,i.jsx)(n.strong,{children:"replication conflict"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"local-conflicts",children:"Local conflicts"}),"\n",(0,i.jsx)(n.p,{children:"A local conflict can happen when a write operation assumes a different previous document state, than what is currently stored in the database. This can happen when multiple parts of your application do simultaneous writes to the same document. This can happen on a single browser tab, or when multiple tabs write at once or when a write appears while the document gets replicated from a remote server replication."}),"\n",(0,i.jsxs)(n.p,{children:["When a local conflict appears, RxDB will throw a ",(0,i.jsx)(n.code,{children:"409 CONFLICT"})," error. The calling code must then handle the error properly, depending on the application logic."]}),"\n",(0,i.jsxs)(n.p,{children:["Instead of handling local conflicts, in most cases it is easier to ensure that they cannot happen, by using ",(0,i.jsx)(n.code,{children:"incremental"})," database operations like ",(0,i.jsx)(n.a,{href:"/rx-document.html",children:"incrementalModify()"}),", ",(0,i.jsx)(n.a,{href:"/rx-document.html",children:"incrementalPatch()"})," or ",(0,i.jsx)(n.a,{href:"/rx-collection.html",children:"incrementalUpsert()"}),". These write operations have a built-in way to handle conflicts by re-applying the mutation functions to the conflicting document state."]}),"\n",(0,i.jsx)(n.h2,{id:"replication-conflicts",children:"Replication conflicts"}),"\n",(0,i.jsx)(n.p,{children:"A replication conflict appears when multiple clients write to the same documents at once and these documents are then replicated to the backend server."}),"\n",(0,i.jsxs)(n.p,{children:["When you replicate with the ",(0,i.jsx)(n.a,{href:"/replication-graphql.html",children:"Graphql replication"})," and the ",(0,i.jsx)(n.a,{href:"/replication.html",children:"replication primitives"}),", RxDB assumes that conflicts are ",(0,i.jsx)(n.strong,{children:"detected"})," and ",(0,i.jsx)(n.strong,{children:"resolved"})," at the client side."]}),"\n",(0,i.jsxs)(n.p,{children:["When a document is send to the backend and the backend detected a conflict (by comparing revisions or other properties), the backend will respond with the actual document state so that the client can compare this with the local document state and create a new, resolved document state that is then pushed to the server again. You can read more about the replication conflicts ",(0,i.jsx)(n.a,{href:"/replication.html#conflict-handling",children:"here"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"custom-conflict-handler",children:"Custom conflict handler"}),"\n",(0,i.jsx)(n.p,{children:"A conflict handler is an object with two JavaScript functions:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Detect if two document states are equal"}),"\n",(0,i.jsx)(n.li,{children:"Solve existing conflicts"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Because the conflict handler also is used for conflict detection, it will run many times on pull-, push- and write operations of RxDB. Most of the time it will detect that there is no conflict and then return."}),"\n",(0,i.jsxs)(n.p,{children:["Lets have a look at the ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/blob/master/src/replication-protocol/default-conflict-handler.ts",children:"default conflict handler"})," of RxDB to learn how to create a custom one:"]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { deepEqual } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/utils'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" defaultConflictHandler"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" RxConflictHandler"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"any"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"> "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" isEqual"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(a"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" b) {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * isEqual() is used to detect conflicts or to detect if a"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * document has to be pushed to the remote."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * If the documents are deep equal,"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * we have no conflict."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Because deepEqual is CPU expensive, on your custom conflict handler you might only"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * check some properties, like the updatedAt time or revisions"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * for better performance."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" deepEqual"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(a"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" b);"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" resolve"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(i) {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * The default conflict handler will always"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * drop the fork state and use the master state instead."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * "})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * In your custom conflict handler you likely want to merge properties"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * of the realMasterState and the newDocumentState instead."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" i"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".realMasterState;"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,i.jsxs)(n.p,{children:["To overwrite the default conflict handler, you have to specify a custom ",(0,i.jsx)(n.code,{children:"conflictHandler"})," property when creating a collection with ",(0,i.jsx)(n.code,{children:"addCollections()"}),"."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollections"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // key = collectionName"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" humans"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" mySchema"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" conflictHandler"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myCustomConflictHandler"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})})]})}function d(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453(e,n,t){t.d(n,{R:()=>o,x:()=>r});var s=t(6540);const i={},a=s.createContext(i);function o(e){const n=s.useContext(a);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/045bd6f5.d7543fa1.js b/docs/assets/js/045bd6f5.d7543fa1.js deleted file mode 100644 index 5f5d4420bd3..00000000000 --- a/docs/assets/js/045bd6f5.d7543fa1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[4475],{3247(e,r,n){n.d(r,{g:()=>i});var s=n(4848);function i(e){const r=[];let n=null;return e.children.forEach(e=>{e.props.id?(n&&r.push(n),n={headline:e,paragraphs:[]}):n&&n.paragraphs.push(e)}),n&&r.push(n),(0,s.jsx)("div",{style:o.stepsContainer,children:r.map((e,r)=>(0,s.jsxs)("div",{style:o.stepWrapper,children:[(0,s.jsxs)("div",{style:o.stepIndicator,children:[(0,s.jsx)("div",{style:o.stepNumber,children:r+1}),(0,s.jsx)("div",{style:o.verticalLine})]}),(0,s.jsxs)("div",{style:o.stepContent,children:[(0,s.jsx)("div",{children:e.headline}),e.paragraphs.map((e,r)=>(0,s.jsx)("div",{style:o.item,children:e},r))]})]},r))})}const o={stepsContainer:{display:"flex",flexDirection:"column"},stepWrapper:{display:"flex",alignItems:"stretch",marginBottom:"1.5rem",position:"relative",minWidth:0},stepIndicator:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",width:"33px",marginRight:"1rem",minWidth:0},stepNumber:{width:"33px",height:"33px",borderRadius:"50%",backgroundColor:"var(--color-top)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:"bold",marginTop:-4},verticalLine:{position:"absolute",top:29,bottom:"0",left:"50%",width:"1px",background:"linear-gradient(to bottom, var(--color-top) 0%, var(--color-top) 80%, rgba(0,0,0,0) 100%)",transform:"translateX(-50%)"},stepContent:{flex:1,minWidth:0,overflowWrap:"break-word"},item:{marginTop:"0.5rem"}}},8453(e,r,n){n.d(r,{R:()=>a,x:()=>t});var s=n(6540);const i={},o=s.createContext(i);function a(e){const r=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function t(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(o.Provider,{value:r},e.children)}},9978(e,r,n){n.r(r),n.d(r,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>t,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"encryption","title":"Encryption","description":"Explore RxDB\'s \ud83d\udd12 encryption plugin for enhanced data security in web and native apps, featuring password-based encryption and secure storage.","source":"@site/docs/encryption.md","sourceDirName":".","slug":"/encryption.html","permalink":"/encryption.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Encryption","slug":"encryption.html","description":"Explore RxDB\'s \ud83d\udd12 encryption plugin for enhanced data security in web and native apps, featuring password-based encryption and secure storage."},"sidebar":"tutorialSidebar","previous":{"title":"Schema Validation","permalink":"/schema-validation.html"},"next":{"title":"Key Compression","permalink":"/key-compression.html"}}');var i=n(4848),o=n(8453),a=n(3247);const t={title:"Encryption",slug:"encryption.html",description:"Explore RxDB's \ud83d\udd12 encryption plugin for enhanced data security in web and native apps, featuring password-based encryption and secure storage."},l="\ud83d\udd12 Encrypted Local Storage with RxDB",d={},c=[{value:"Querying encrypted data",id:"querying-encrypted-data",level:2},{value:"Password handling",id:"password-handling",level:2},{value:"Asymmetric encryption",id:"asymmetric-encryption",level:2},{value:"Using the RxDB Encryption Plugins",id:"using-the-rxdb-encryption-plugins",level:2},{value:"Wrap your RxStorage with the encryption",id:"wrap-your-rxstorage-with-the-encryption",level:3},{value:"Create a RxDatabase with the wrapped storage",id:"create-a-rxdatabase-with-the-wrapped-storage",level:3},{value:"Create an RxCollection with an encrypted property",id:"create-an-rxcollection-with-an-encrypted-property",level:3},{value:"Using Web-Crypto API",id:"using-web-crypto-api",level:2},{value:"Changing the password",id:"changing-the-password",level:2},{value:"Encrypted attachments",id:"encrypted-attachments",level:2},{value:"Encryption and workers",id:"encryption-and-workers",level:2}];function h(e){const r={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(r.header,{children:(0,i.jsx)(r.h1,{id:"-encrypted-local-storage-with-rxdb",children:"\ud83d\udd12 Encrypted Local Storage with RxDB"})}),"\n",(0,i.jsxs)(r.p,{children:["The RxDB encryption plugin empowers developers to fortify their applications' data security. It seamlessly integrates with ",(0,i.jsx)(r.a,{href:"https://rxdb.info/",children:"RxDB"}),", allowing for the secure storage and retrieval of documents by ",(0,i.jsx)(r.strong,{children:"encrypting them with a password"}),". With encryption and decryption processes handled internally, it ensures that sensitive data remains confidential, making it a valuable tool for building robust, privacy-conscious applications. The encryption works on all RxDB supported devices types like the ",(0,i.jsx)(r.strong,{children:"browser"}),", ",(0,i.jsx)(r.strong,{children:"ReactNative"})," or ",(0,i.jsx)(r.strong,{children:"Node.js"}),"."]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"./files/icons/with-gradient/storage-layer.svg",alt:"Encryption Storage Layer",height:"60"})}),"\n",(0,i.jsx)(r.p,{children:"Encrypting client-side stored data in RxDB offers numerous advantages:"}),"\n",(0,i.jsxs)(r.ul,{children:["\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"Enhanced Security"}),": In the unfortunate event of a user's device being stolen, the encrypted data remains safeguarded on the hard drive, inaccessible without the correct password."]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"Access Control"}),": You can retain control over stored data by revoking access at any time simply by withholding the password."]}),"\n",(0,i.jsxs)(r.li,{children:[(0,i.jsx)(r.strong,{children:"Tamper proof"})," Other applications on the device cannot read out the stored data when the password is only kept in the process-specific memory"]}),"\n"]}),"\n",(0,i.jsx)(r.h2,{id:"querying-encrypted-data",children:"Querying encrypted data"}),"\n",(0,i.jsxs)(r.p,{children:["RxDB handles the encryption and decryption of data internally. This means that when you work with a RxDocument, you can access the properties of the document just like you would with normal, unencrypted data. RxDB automatically decrypts the data for you when you retrieve it, making it transparent to your application code.\nThis means the encryption works with all ",(0,i.jsx)(r.a,{href:"/rx-storage.html",children:"RxStorage"})," like ",(0,i.jsx)(r.strong,{children:"SQLite"}),", ",(0,i.jsx)(r.strong,{children:"IndexedDB"}),", ",(0,i.jsx)(r.strong,{children:"OPFS"})," and so on."]}),"\n",(0,i.jsxs)(r.p,{children:["However, there's a limitation when it comes to querying encrypted fields. ",(0,i.jsx)(r.strong,{children:"Encrypted fields cannot be used as operators in queries"}),'. This means you cannot perform queries like "find all documents where the encrypted field equals a certain value." RxDB does not expose the encrypted data in a way that allows direct querying based on the encrypted content. To filter or search for documents based on the contents of encrypted fields, you would need to first decrypt the data and then perform the query, which might not be efficient or practical in some cases.\nYou could however use the ',(0,i.jsx)(r.a,{href:"/rx-storage-memory-mapped.html",children:"memory mapped"})," RxStorage to replicate the encrypted documents into a non-encrypted in-memory storage and then query them like normal."]}),"\n",(0,i.jsx)(r.h2,{id:"password-handling",children:"Password handling"}),"\n",(0,i.jsx)(r.p,{children:"RxDB does not define how you should store or retrieve the encryption password. It only requires you to provide the password on database creation which grants you flexibility in how you manage encryption passwords.\nYou could ask the user on app-start to insert the password, or you can retrieve the password from your backend on app start (or revoke access by no longer providing the password)."}),"\n",(0,i.jsx)(r.h2,{id:"asymmetric-encryption",children:"Asymmetric encryption"}),"\n",(0,i.jsxs)(r.p,{children:["The encryption plugin itself uses ",(0,i.jsx)(r.strong,{children:"symmetric encryption"})," with a password to guarantee best performance when reading and storing data.\nIt is not able to do ",(0,i.jsx)(r.strong,{children:"Asymmetric encryption"})," by itself. If you need Asymmetric encryption with a private/publicKey, it is recommended to encrypted the password itself with the asymmetric keys and store the encrypted password beside the other data. On app-start you can decrypt the password with the private key and use the decrypted password in the RxDB encryption plugin"]}),"\n",(0,i.jsx)(r.h2,{id:"using-the-rxdb-encryption-plugins",children:"Using the RxDB Encryption Plugins"}),"\n",(0,i.jsx)(r.p,{children:"RxDB currently has two plugins for encryption:"}),"\n",(0,i.jsxs)(r.ul,{children:["\n",(0,i.jsxs)(r.li,{children:["The free ",(0,i.jsx)(r.code,{children:"encryption-crypto-js"})," plugin that is based on the ",(0,i.jsx)(r.code,{children:"AES"})," algorithm of the ",(0,i.jsx)(r.a,{href:"https://www.npmjs.com/package/crypto-js",children:"crypto-js"})," library"]}),"\n",(0,i.jsxs)(r.li,{children:["The ",(0,i.jsx)(r.a,{href:"/premium/",children:"\ud83d\udc51 premium"})," ",(0,i.jsx)(r.code,{children:"encryption-web-crypto"})," plugin that is based on the native ",(0,i.jsx)(r.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API",children:"Web Crypto API"})," which makes it faster and more secure to use. Document inserts are about 10x faster compared to ",(0,i.jsx)(r.code,{children:"crypto-js"})," and it has a smaller build size because it uses the browsers API instead of bundling an npm module."]}),"\n"]}),"\n",(0,i.jsxs)(r.p,{children:["An RxDB encryption plugin is a wrapper around any other ",(0,i.jsx)(r.a,{href:"/rx-storage.html",children:"RxStorage"}),"."]}),"\n",(0,i.jsxs)(a.g,{children:[(0,i.jsx)(r.h3,{id:"wrap-your-rxstorage-with-the-encryption",children:"Wrap your RxStorage with the encryption"}),(0,i.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" wrappedKeyEncryptionCryptoJsStorage"})}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/encryption-crypto-js'"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"// wrap the normal storage with the encryption plugin"})}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" encryptedStorage"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" wrappedKeyEncryptionCryptoJsStorage"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(r.h3,{id:"create-a-rxdatabase-with-the-wrapped-storage",children:"Create a RxDatabase with the wrapped storage"}),(0,i.jsxs)(r.p,{children:["Also you have to set a ",(0,i.jsx)(r.strong,{children:"password"})," when creating the database. The format of the password depends on which encryption plugin is used."]}),(0,i.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"// create an encrypted database"})}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" encryptedStorage"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" password"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'sudoLetMeIn'"})]}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(r.h3,{id:"create-an-rxcollection-with-an-encrypted-property",children:"Create an RxCollection with an encrypted property"}),(0,i.jsxs)(r.p,{children:["To define a field as being encrypted, you have to add it to the ",(0,i.jsx)(r.code,{children:"encrypted"})," fields list in the schema."]}),(0,i.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" schema"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" secret"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'id'"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" encrypted: ["}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'secret'"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" myDocuments"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" schema"})}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"})"})})]})})})]}),"\n",(0,i.jsx)(r.h2,{id:"using-web-crypto-api",children:"Using Web-Crypto API"}),"\n",(0,i.jsxs)(r.p,{children:["For professionals, we have the ",(0,i.jsx)(r.code,{children:"web-crypto"})," ",(0,i.jsx)(r.a,{href:"/premium/",children:"\ud83d\udc51 premium"})," plugin which is faster and more secure:"]}),"\n",(0,i.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" wrappedKeyEncryptionWebCryptoStorage"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" createPassword"})}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/encryption-web-crypto'"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageIndexedDB } "}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-indexeddb'"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"// wrap the normal storage with the encryption plugin"})}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" encryptedIndexedDbStorage"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" wrappedKeyEncryptionWebCryptoStorage"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" myPasswordObject"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" // Algorithm can be oneOf: 'AES-CTR' | 'AES-CBC' | 'AES-GCM'"})}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" algorithm"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'AES-CTR'"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" password"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myRandomPasswordWithMin8Length'"})]}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"// create an encrypted database"})}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" encryptedIndexedDbStorage"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" password"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" myPasswordObject"})]}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"})})]})})}),"\n",(0,i.jsx)(r.h2,{id:"changing-the-password",children:"Changing the password"}),"\n",(0,i.jsx)(r.p,{children:"The password is set database specific and it is not possible to change the password of a database. Opening an existing database with a different password will throw an error. To change the password you can either:"}),"\n",(0,i.jsxs)(r.ul,{children:["\n",(0,i.jsxs)(r.li,{children:["Use the ",(0,i.jsx)(r.a,{href:"/migration-storage.html",children:"storage migration plugin"})," to migrate the database state into a new database."]}),"\n",(0,i.jsxs)(r.li,{children:["Store a randomly created meta-password in a different RxDatabase as a value of a ",(0,i.jsx)(r.a,{href:"/rx-local-document.html",children:"local document"}),". Encrypt the meta password with the actual user password and read it out before creating the actual database."]}),"\n"]}),"\n",(0,i.jsx)(r.h2,{id:"encrypted-attachments",children:"Encrypted attachments"}),"\n",(0,i.jsxs)(r.p,{children:["To store the ",(0,i.jsx)(r.a,{href:"/rx-attachment.html",children:"attachments"})," data encrypted, you have to set ",(0,i.jsx)(r.code,{children:"encrypted: true"})," in the ",(0,i.jsx)(r.code,{children:"attachments"})," property of the schema."]}),"\n",(0,i.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" mySchema"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" attachments"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(r.span,{"data-line":"",children:[(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" encrypted"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" // if true, the attachment-data will be encrypted with the db-password"})]}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(r.span,{"data-line":"",children:(0,i.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,i.jsx)(r.h2,{id:"encryption-and-workers",children:"Encryption and workers"}),"\n",(0,i.jsxs)(r.p,{children:["If you are using ",(0,i.jsx)(r.a,{href:"/rx-storage-worker.html",children:"Worker RxStorage"})," or ",(0,i.jsx)(r.a,{href:"/rx-storage-shared-worker.html",children:"SharedWorker RxStorage"})," with encryption, it's recommended to run encryption inside of the worker. Encryption can be very cpu intensive and would take away CPU-power from the main thread which is the main reason to use workers."]}),"\n",(0,i.jsx)(r.p,{children:"You do not need to worry about setting the password inside of the worker. The password will be set when calling createRxDatabase from the main thread, and will be passed internally to the storage in the worker automatically."})]})}function p(e={}){const{wrapper:r}={...(0,o.R)(),...e.components};return r?(0,i.jsx)(r,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/0596642b.eee766f7.js b/docs/assets/js/0596642b.eee766f7.js deleted file mode 100644 index c8291a458c8..00000000000 --- a/docs/assets/js/0596642b.eee766f7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[7537],{7196(e,i,t){t.r(i),t.d(i,{default:()=>n});var r=t(4586),s=t(8711),c=t(6540),l=t(8141),d=t(4848);function n(){const{siteConfig:e}=(0,r.A)();return(0,c.useEffect)(()=>{(0,l.c)("paid-meeting-link-clicked-starter-pack",100,1)}),(0,d.jsx)(s.A,{title:`Meeting - ${e.title}`,description:"RxDB Meeting Scheduler",children:(0,d.jsx)("main",{children:(0,d.jsxs)("div",{className:"redirectBox",style:{textAlign:"center"},children:[(0,d.jsx)("a",{href:"/",children:(0,d.jsx)("div",{className:"logo",children:(0,d.jsx)("img",{src:"/files/logo/logo_text.svg",alt:"RxDB",width:160})})}),(0,d.jsx)("h1",{children:"RxDB Meeting Scheduler"}),(0,d.jsx)("p",{children:(0,d.jsx)("b",{children:"You will be redirected in a few seconds."})}),(0,d.jsx)("p",{children:(0,d.jsx)("a",{href:"https://rxdb.pipedrive.com/scheduler/LzExD5CX/meeting-starter-pack",children:"Click here"})}),(0,d.jsx)("meta",{httpEquiv:"Refresh",content:"0; url=https://rxdb.pipedrive.com/scheduler/LzExD5CX/meeting-starter-pack"})]})})})}}}]); \ No newline at end of file diff --git a/docs/assets/js/08ff000c.3fc1a455.js b/docs/assets/js/08ff000c.3fc1a455.js deleted file mode 100644 index eb9b5b29df9..00000000000 --- a/docs/assets/js/08ff000c.3fc1a455.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[3916],{8453(e,n,t){t.d(n,{R:()=>o,x:()=>l});var i=t(6540);const r={},s=i.createContext(r);function o(e){const n=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),i.createElement(s.Provider,{value:n},e.children)}},9918(e,n,t){t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>c,frontMatter:()=>o,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"releases/16.0.0","title":"RxDB 16.0.0 - Efficiency Redefined","description":"Meet RxDB 16.0.0 - major refactorings, improved performance, and easy migrations. Experience a better, faster, and more stable database solution today.","source":"@site/docs/releases/16.0.0.md","sourceDirName":"releases","slug":"/releases/16.0.0.html","permalink":"/releases/16.0.0.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB 16.0.0 - Efficiency Redefined","slug":"16.0.0.html","description":"Meet RxDB 16.0.0 - major refactorings, improved performance, and easy migrations. Experience a better, faster, and more stable database solution today."},"sidebar":"tutorialSidebar","previous":{"title":"17.0.0","permalink":"/releases/17.0.0.html"},"next":{"title":"15.0.0","permalink":"/releases/15.0.0.html"}}');var r=t(4848),s=t(8453);const o={title:"RxDB 16.0.0 - Efficiency Redefined",slug:"16.0.0.html",description:"Meet RxDB 16.0.0 - major refactorings, improved performance, and easy migrations. Experience a better, faster, and more stable database solution today."},l="16.0.0",a={},d=[{value:"Breaking Changes",id:"breaking-changes",level:2},{value:"Removed deprecated LokiJS RxStorage",id:"removed-deprecated-lokijs-rxstorage",level:3},{value:"Renamed .destroy() to .close()",id:"renamed-destroy-to-close",level:3},{value:"ignoreDuplicate: true on createRxDatabase() must only be allowed in dev-mode.",id:"ignoreduplicate-true-on-createrxdatabase-must-only-be-allowed-in-dev-mode",level:3},{value:"When dev-mode is enabled, a schema validator must be used.",id:"when-dev-mode-is-enabled-a-schema-validator-must-be-used",level:3},{value:"Removed the memory-synced storage",id:"removed-the-memory-synced-storage",level:3},{value:"Split conflict handler functionality into isEqual() and resolve().",id:"split-conflict-handler-functionality-into-isequal-and-resolve",level:3},{value:"Full rewrite of the OPFS and Filesystem-Node RxStorages",id:"full-rewrite-of-the-opfs-and-filesystem-node-rxstorages",level:2},{value:"Internal Changes",id:"internal-changes",level:2},{value:"Bugfixes",id:"bugfixes",level:2},{value:"Other",id:"other",level:2},{value:"You can help!",id:"you-can-help",level:2},{value:"LinkedIn",id:"linkedin",level:2}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"1600",children:"16.0.0"})}),"\n",(0,r.jsxs)(n.p,{children:["The release ",(0,r.jsx)(n.a,{href:"https://rxdb.info/releases/16.0.0.html",children:"16.0.0"})," is used for major refactorings. We did not change that much, mostly renaming things and fixing confusing implementation details."]}),"\n",(0,r.jsxs)(n.p,{children:["Data stored in the previous version ",(0,r.jsx)(n.code,{children:"15"})," is compatible with the code of the new version ",(0,r.jsx)(n.code,{children:"16"})," for most RxStorage implementation. So migration will be easy.\nOnly the following RxStorage implementations are required to migrate the data itself with the ",(0,r.jsx)(n.a,{href:"/migration-storage.html",children:"storage migration plugin"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"SQLite RxStorage"}),"\n",(0,r.jsx)(n.li,{children:"NodeFilesystem RxStorage"}),"\n",(0,r.jsx)(n.li,{children:"OPFS RxStorage"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"breaking-changes",children:"Breaking Changes"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["CHANGE ",(0,r.jsx)(n.a,{href:"https://rxdb.info/rx-server.html",children:"RxServer"})," is no longer in beta mode."]}),"\n",(0,r.jsxs)(n.li,{children:["CHANGE ",(0,r.jsx)(n.a,{href:"https://rxdb.info/fulltext-search.html",children:"Fulltext Search"})," is no longer in beta mode."]}),"\n",(0,r.jsxs)(n.li,{children:["CHANGE ",(0,r.jsx)(n.a,{href:"https://rxdb.info/reactivity.html",children:"Custom Reactivity"})," is no longer in beta mode."]}),"\n",(0,r.jsxs)(n.li,{children:["CHANGE ",(0,r.jsx)(n.a,{href:"https://rxdb.info/replication.html",children:"initialCheckpoint in replications"})," is no longer in beta mode."]}),"\n",(0,r.jsxs)(n.li,{children:["CHANGE ",(0,r.jsx)(n.a,{href:"https://rxdb.info/rx-state.html",children:"RxState"})," is no longer in beta mode."]}),"\n",(0,r.jsxs)(n.li,{children:["CHANGE ",(0,r.jsx)(n.a,{href:"https://rxdb.info/rx-storage-memory-mapped.html",children:"MemoryMapped RxStorage"})," is no longer in beta mode."]}),"\n",(0,r.jsxs)(n.li,{children:["CHANGE rename ",(0,r.jsx)(n.code,{children:"randomCouchString()"})," to ",(0,r.jsx)(n.code,{children:"randomToken()"})]}),"\n",(0,r.jsxs)(n.li,{children:["FIX (GraphQL replication) datapath must be equivalent for pull and push ",(0,r.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/pull/6019",children:"#6019"})]}),"\n",(0,r.jsxs)(n.li,{children:["REMOVE fallback to the ",(0,r.jsx)(n.code,{children:"ohash"})," package when ",(0,r.jsx)(n.code,{children:"crypto.subtle"})," does not exist. All modern runtimes (also react-native) now support ",(0,r.jsx)(n.code,{children:"crypto.subtle"}),", so we do not need that fallback anymore."]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"removed-deprecated-lokijs-rxstorage",children:"Removed deprecated LokiJS RxStorage"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.a,{href:"https://rxdb.info/rx-storage-lokijs.html",children:"LokiJS RxStorage"})," was deprecated because LokiJS itself is no longer maintained. Therefore it will be removed completely. If you still need that, you can fork the code of it and publish it in an own package and link to it from the ",(0,r.jsx)(n.a,{href:"https://rxdb.info/third-party-plugins.html",children:"third party plugins page"}),"."]}),"\n",(0,r.jsxs)(n.h3,{id:"renamed-destroy-to-close",children:["Renamed ",(0,r.jsx)(n.code,{children:".destroy()"})," to ",(0,r.jsx)(n.code,{children:".close()"})]}),"\n",(0,r.jsxs)(n.p,{children:["Destroy was adapted from PouchDB, but people often think this deletes the written data. ",(0,r.jsx)(n.code,{children:"close"})," is a better name for that functionality."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Also renamed similar functions/attributes:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:".destroy()"})," to ",(0,r.jsx)(n.code,{children:".close()"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:".onDestroy()"})," to ",(0,r.jsx)(n.code,{children:".onClose()"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"postDestroyRxCollection"})," to ",(0,r.jsx)(n.code,{children:"postCloseRxCollection"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"preDestroyRxDatabase"})," to ",(0,r.jsx)(n.code,{children:"preCloseRxDatabase"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.h3,{id:"ignoreduplicate-true-on-createrxdatabase-must-only-be-allowed-in-dev-mode",children:[(0,r.jsx)(n.code,{children:"ignoreDuplicate: true"})," on ",(0,r.jsx)(n.code,{children:"createRxDatabase()"})," must only be allowed in dev-mode."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.code,{children:"ignoreDuplicate"})," flag is only useful for tests and should never be used in production. We now throw an error if it is set to ",(0,r.jsx)(n.code,{children:"true"})," in non-dev-mode."]}),"\n",(0,r.jsx)(n.h3,{id:"when-dev-mode-is-enabled-a-schema-validator-must-be-used",children:"When dev-mode is enabled, a schema validator must be used."}),"\n",(0,r.jsx)(n.p,{children:"Many reported issues come from people storing data that is not valid to their schema.\nTo fix this, in dev-mode it is now required that at least one schema validator is used."}),"\n",(0,r.jsx)(n.h3,{id:"removed-the-memory-synced-storage",children:"Removed the memory-synced storage"}),"\n",(0,r.jsxs)(n.p,{children:["The memory-synced RxStorage was removed in RxDB version 16. Please use the ",(0,r.jsx)(n.code,{children:"memory-mapped"})," storage instead which has better trade-offs and is easier to configure."]}),"\n",(0,r.jsxs)(n.h3,{id:"split-conflict-handler-functionality-into-isequal-and-resolve",children:["Split conflict handler functionality into ",(0,r.jsx)(n.code,{children:"isEqual()"})," and ",(0,r.jsx)(n.code,{children:"resolve()"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"Because the handler is used in so many places it becomes confusing to write a proper conflict handler.\nAlso having a handler that requires user interaction is only possible by hackingly using the context param.\nBy splitting the functionalities it is easier to learn where the handlers are used and how to define them properly."}),"\n",(0,r.jsx)(n.h2,{id:"full-rewrite-of-the-opfs-and-filesystem-node-rxstorages",children:"Full rewrite of the OPFS and Filesystem-Node RxStorages"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.a,{href:"/rx-storage-opfs.html",children:"OPFS"})," and ",(0,r.jsx)(n.a,{href:"/rx-storage-filesystem-node.html",children:"Filesystem-Node"})," RxStorage had problems with storing emojis and other special characters inside of indexed fields.\nI completely rewrote them and improved performance especially on initial load when a lot of data is stored already and when doing many small writes/reads at the same time on in series."]}),"\n",(0,r.jsx)(n.h2,{id:"internal-changes",children:"Internal Changes"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"CHANGE (internal) migration-storage plugin: Remove catch from cleanup"}),"\n",(0,r.jsxs)(n.li,{children:["CHANGE (internal) rename RX_PIPELINE_CHECKPOINT_CONTEXT to ",(0,r.jsx)(n.code,{children:"rx-pipeline-checkpoint"})]}),"\n",(0,r.jsxs)(n.li,{children:["CHANGE (internal) remove ",(0,r.jsx)(n.code,{children:"conflictResultionTasks()"})," and ",(0,r.jsx)(n.code,{children:"resolveConflictResultionTask()"})," from the RxStorage interface."]}),"\n",(0,r.jsx)(n.li,{children:"REMOVED (internal) do not check for duplicate event bulks, all RxStorage implementations must guarantee to not emit the same events twice."}),"\n",(0,r.jsx)(n.li,{children:"REFACTOR (internal) Only use event-bulks internally and only transform to single emitted events if actually someone has subscribed to the eventstream."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"bugfixes",children:"Bugfixes"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Having a lot of documents pulled in the replication could in some cases slow down the database initialization because ",(0,r.jsx)(n.code,{children:"upstreamInitialSync()"})," did not set a checkpoint and each time checked all documents if they are equal to the master."]}),"\n",(0,r.jsxs)(n.li,{children:["If the handler of a ",(0,r.jsx)(n.a,{href:"/rx-pipeline.html",children:"RxPipeline"})," throws an error, block the whole pipeline and emit the error to the outside."]}),"\n",(0,r.jsxs)(n.li,{children:["Throw error when dexie.js RxStorage is used with optional index fields ",(0,r.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/pull/6643#issuecomment-2505310082",children:"#6643"}),"."]}),"\n",(0,r.jsx)(n.li,{children:"Fix IndexedDB bug: Some people had problems with the IndexedDB RxStorage that opened up collections very slowly. If you had this problem, please try out this new version."}),"\n",(0,r.jsx)(n.li,{children:"Add check to ensure remote instances are build with the same RxDB version. This is to ensure if you update RxDB and forget to rebuild your workers, it will throw instead of causing strange problems."}),"\n",(0,r.jsx)(n.li,{children:"When the pulled documents in the replication do not match the schema, do not update the checkpoint."}),"\n",(0,r.jsx)(n.li,{children:"When the pushed document conflict results in the replication do not match the schema, do not update the checkpoint."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"other",children:"Other"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Added more ",(0,r.jsx)(n.a,{href:"https://rxdb.info/rx-storage-performance.html",children:"performance tests"})]}),"\n",(0,r.jsxs)(n.li,{children:["The amount of collections in the open source version has been limited to ",(0,r.jsx)(n.code,{children:"16"}),"."]}),"\n",(0,r.jsx)(n.li,{children:"Moved RxQuery checks into dev-mode."}),"\n",(0,r.jsx)(n.li,{children:"RxQuery.remove() now internally does a bulk operation for better performance."}),"\n",(0,r.jsx)(n.li,{children:"Lazily process bulkWrite() results for less CPU usage."}),"\n",(0,r.jsx)(n.li,{children:"Only run interval cleanup on the storage of a collection if there actually have been writes to it."}),"\n",(0,r.jsxs)(n.li,{children:["Schema validation errors (code: 422) now include the ",(0,r.jsx)(n.code,{children:"RxJsonSchema"})," for easier debugging."]}),"\n",(0,r.jsx)(n.li,{children:"Added an interval to prevent browser tab hibernation while a replication is running."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"you-can-help",children:"You can help!"}),"\n",(0,r.jsxs)(n.p,{children:["There are many things that can be done by ",(0,r.jsx)(n.strong,{children:"you"})," to improve RxDB:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Check the ",(0,r.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/blob/master/orga/BACKLOG.md",children:"BACKLOG"})," for features that would be great to have."]}),"\n",(0,r.jsxs)(n.li,{children:["Check the ",(0,r.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/blob/master/orga/before-next-major.md",children:"breaking backlog"})," for breaking changes that must be implemented in the future but where I did not have the time yet."]}),"\n",(0,r.jsxs)(n.li,{children:["Check the ",(0,r.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/search?q=todo",children:"todos"})," in the code. There are many small improvements that can be done for performance and build size."]}),"\n",(0,r.jsx)(n.li,{children:"Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors."}),"\n",(0,r.jsxs)(n.li,{children:["Update the ",(0,r.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples",children:"example projects"})," some of them are outdated and need updates."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"linkedin",children:"LinkedIn"}),"\n",(0,r.jsxs)(n.p,{children:["Stay connected with the latest updates and network with professionals in the RxDB community by following RxDB's ",(0,r.jsx)(n.a,{href:"https://www.linkedin.com/company/rxdb",children:"official LinkedIn page"}),"!"]})]})}function c(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/0b761dc7.ea7a941e.js b/docs/assets/js/0b761dc7.ea7a941e.js deleted file mode 100644 index 10818e4143f..00000000000 --- a/docs/assets/js/0b761dc7.ea7a941e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[2835],{2796(e,a,t){t.r(a),t.d(a,{default:()=>n});var r=t(544),s=t(4848);function n(){return(0,r.default)({sem:{id:"gads",metaTitle:"The best Database on top of localstorage",appName:"Browser",title:(0,s.jsxs)(s.Fragment,{children:["The easiest way to ",(0,s.jsx)("b",{children:"store"})," and ",(0,s.jsx)("b",{children:"sync"})," Data in LocalStorage"]}),text:(0,s.jsx)(s.Fragment,{children:"Store data inside the Browsers localstorage to build high performance realtime applications that sync data from the backend and even work when offline."})}})}}}]); \ No newline at end of file diff --git a/docs/assets/js/0e268d20.8eaca8eb.js b/docs/assets/js/0e268d20.8eaca8eb.js deleted file mode 100644 index 61227d2fec1..00000000000 --- a/docs/assets/js/0e268d20.8eaca8eb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[2584],{686(e,r,a){function i(e,r){if(e===r)return!0;if(e&&r&&"object"==typeof e&&"object"==typeof r){if(e.constructor!==r.constructor)return!1;var a,s;if(Array.isArray(e)){if((a=e.length)!==r.length)return!1;for(s=a;0!==s--;)if(!i(e[s],r[s]))return!1;return!0}if(e.constructor===RegExp)return e.source===r.source&&e.flags===r.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===r.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===r.toString();var t=Object.keys(e);if((a=t.length)!==Object.keys(r).length)return!1;for(s=a;0!==s--;)if(!Object.prototype.hasOwnProperty.call(r,t[s]))return!1;for(s=a;0!==s--;){var n=t[s];if(!i(e[n],r[n]))return!1}return!0}return e!=e&&r!=r}a.d(r,{b:()=>i})},4370(e,r,a){a.d(r,{_:()=>s});var i=a(4629);function s(e,r,a,i,s){return new t(e,r,a,i,s)}var t=function(e){function r(r,a,i,s,t,n){var l=e.call(this,r)||this;return l.onFinalize=t,l.shouldUnsubscribe=n,l._next=a?function(e){try{a(e)}catch(i){r.error(i)}}:e.prototype._next,l._error=s?function(e){try{s(e)}catch(e){r.error(e)}finally{this.unsubscribe()}}:e.prototype._error,l._complete=i?function(){try{i()}catch(e){r.error(e)}finally{this.unsubscribe()}}:e.prototype._complete,l}return(0,i.C6)(r,e),r.prototype.unsubscribe=function(){var r;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){var a=this.closed;e.prototype.unsubscribe.call(this),!a&&(null===(r=this.onFinalize)||void 0===r||r.call(this))}},r}(a(8857).vU)},5096(e,r,a){a.d(r,{N:()=>s});var i=a(1693);function s(e){return function(r){if(function(e){return(0,i.T)(null==e?void 0:e.lift)}(r))return r.lift(function(r){try{return e(r,this)}catch(a){this.error(a)}});throw new TypeError("Unable to lift unknown Observable type")}}},5520(e,r,a){a.d(r,{F:()=>n});var i=a(3887),s=a(5096),t=a(4370);function n(e,r){return void 0===r&&(r=i.D),e=null!=e?e:l,(0,s.N)(function(a,i){var s,n=!0;a.subscribe((0,t._)(i,function(a){var t=r(a);!n&&e(s,t)||(n=!1,s=t,i.next(a))}))})}function l(e,r){return e===r}},7708(e,r,a){a.d(r,{T:()=>t});var i=a(5096),s=a(4370);function t(e,r){return(0,i.N)(function(a,i){var t=0;a.subscribe((0,s._)(i,function(a){i.next(e.call(r,a,t++))}))})}},9561(e,r,a){a.r(r),a.d(r,{FORM_VALUE_DOCUMENT_ID:()=>j,TEAM_SIZES:()=>f,default:()=>v});var i=a(4586),s=a(8711),t=a(5260),n=a(6540),l=a(686),o=a(3337),c=a(9855),d=a(2303),h=a(5520),m=a(7708),u=a(8141),p=a(3943),x=a(4584),g=a(4848);const j="premium-price-form",f=[1,3,6,12,24,30];let b;function y(){return b||(b=(async()=>{const e=await Promise.all([a.e(9850),a.e(4291)]).then(a.bind(a,4291)),r=await e.getDatabase();let i=await r.getLocal(j);return i||(i=await r.upsertLocal(j,{formSubmitted:!1,developers:f[1],packages:["browser"]})),i})()),b}function k(e){return(0,g.jsx)("input",{name:"package-"+e.packageName,type:"checkbox",className:"package-checkbox",checked:!!e.formValue?.packages.includes(e.packageName),readOnly:!0,onClick:()=>{(0,u.c)("calculate_premium_price",3,1,!0),e.onToggle()}})}function v(){const{siteConfig:e}=(0,i.A)(),r=(0,d.A)(),[a,p]=n.useState(!1),[j,f]=n.useState(null);(0,n.useEffect)(()=>{r&&(a||(p(!0),r&&(0,u.c)("open_pricing_page",1),(async()=>{(await y()).$.pipe((0,m.T)(e=>e._data.data),(0,h.F)(l.b)).subscribe(e=>{console.log("XXX new data:"),console.dir(e),f(e),async function(){const e=await y(),r=(0,c.Pu)(e);console.log("priceResult:"),console.log(JSON.stringify(r,null,4));const a=(0,o.ZN)(document.getElementById("price-calculator-result")),i=(0,o.ZN)(document.getElementById("total-per-project-per-month")),s=(0,o.ZN)(document.getElementById("total-per-project-per-year"));t=r.totalPrice,console.log("setPrice:"),console.dir(t),i.innerHTML=Math.ceil(t/12).toString(),s.innerHTML=Math.ceil(t).toString(),a.style.display="block";var t}()})})()))});const[b,v]=n.useState(!1),N=()=>{(0,u.c)("open_premium_submit_popup",20,1),v(!0)};function S(e){return y().then(r=>r.incrementalModify(r=>(r.packages.includes(e)?r.packages=r.packages.filter(r=>r!==e):r.packages.push(e),r)))}return(0,g.jsxs)(g.Fragment,{children:[(0,g.jsxs)(t.A,{children:[(0,g.jsx)("body",{className:"homepage"}),(0,g.jsx)("link",{rel:"canonical",href:"/premium/"})]}),(0,g.jsx)(s.A,{title:`Premium Plugins - ${e.title}`,description:"RxDB plugins for professionals. FAQ, pricing and license",children:(0,g.jsxs)("main",{children:[(0,g.jsx)("div",{className:"block first",children:(0,g.jsxs)("div",{className:"content centered",children:[(0,g.jsxs)("h2",{children:["RxDB ",(0,g.jsx)("b",{children:"Premium"})]}),(0,g.jsxs)("p",{style:{width:"80%"},children:["RxDB's Premium plugins offer advanced features and performance improvements designed for businesses and professionals. They are ideal for commercial or critical projects, providing ",(0,g.jsx)("a",{href:"/rx-storage-performance.html",target:"_blank",children:"better performance"}),", a smaller build size, flexible storage engines, secure encryption and other features."]})]})}),(0,g.jsx)("div",{className:"block dark",id:"price-calculator-block",children:(0,g.jsxs)("div",{className:"content centered",children:[(0,g.jsx)("h2",{children:"Price Calculator"}),(0,g.jsx)("div",{className:"price-calculator",children:(0,g.jsx)("div",{className:"price-calculator-inner",children:(0,g.jsx)("form",{id:"price-calculator-form",children:(0,g.jsxs)("div",{className:"packages",children:[(0,g.jsx)("h3",{children:"Choose your Packages"}),(0,g.jsx)("div",{className:"package",children:(0,g.jsxs)("div",{className:"package-inner",children:[(0,g.jsx)(k,{packageName:"browser",onToggle:()=>S("browser"),formValue:j}),(0,g.jsx)("h4",{children:"Browser Package"}),(0,g.jsxs)("ul",{children:[(0,g.jsx)("li",{children:(0,g.jsx)("a",{href:"/rx-storage-opfs.html",target:"_blank",children:"RxStorage OPFS"})}),(0,g.jsx)("li",{children:(0,g.jsx)("a",{href:"/rx-storage-indexeddb.html",target:"_blank",children:"RxStorage IndexedDB"})}),(0,g.jsx)("li",{children:(0,g.jsx)("a",{href:"/rx-storage-worker.html",target:"_blank",children:"RxStorage Worker"})}),(0,g.jsx)("li",{children:(0,g.jsx)("a",{href:"/encryption.html",target:"_blank",children:"WebCrypto Encryption"})})]})]})}),(0,g.jsx)("div",{className:"package",children:(0,g.jsxs)("div",{className:"package-inner",children:[(0,g.jsx)(k,{packageName:"native",onToggle:()=>S("native"),formValue:j}),(0,g.jsx)("h4",{children:"Native Package"}),(0,g.jsxs)("ul",{children:[(0,g.jsx)("li",{children:(0,g.jsx)("a",{href:"/rx-storage-sqlite.html",target:"_blank",children:"RxStorage SQLite"})}),(0,g.jsx)("li",{children:(0,g.jsx)("a",{href:"/rx-storage-filesystem-node.html",target:"_blank",children:"RxStorage Filesystem Node"})})]})]})}),(0,g.jsx)("div",{className:"package",children:(0,g.jsxs)("div",{className:"package-inner",children:[(0,g.jsx)(k,{packageName:"performance",onToggle:()=>S("performance"),formValue:j}),(0,g.jsx)("h4",{children:"Performance Package"}),(0,g.jsxs)("ul",{children:[(0,g.jsx)("li",{children:(0,g.jsx)("a",{href:"/rx-storage-sharding.html",target:"_blank",children:"RxStorage Sharding"})}),(0,g.jsx)("li",{children:(0,g.jsx)("a",{href:"/rx-storage-memory-mapped.html",target:"_blank",children:"RxStorage Memory Mapped"})}),(0,g.jsx)("li",{children:(0,g.jsx)("a",{href:"/query-optimizer.html",target:"_blank",children:"Query Optimizer"})}),(0,g.jsx)("li",{children:(0,g.jsx)("a",{href:"/rx-storage-localstorage-meta-optimizer.html",target:"_blank",children:"RxStorage Localstorage Meta Optimizer"})}),(0,g.jsx)("li",{children:(0,g.jsx)("a",{href:"/rx-storage-shared-worker.html",target:"_blank",children:"RxStorage Shared Worker"})})]})]})}),(0,g.jsx)("div",{className:"package",children:(0,g.jsxs)("div",{className:"package-inner",children:[(0,g.jsx)(k,{packageName:"server",onToggle:()=>S("server"),formValue:j}),(0,g.jsx)("h4",{children:"Server Package"}),(0,g.jsxs)("ul",{children:[(0,g.jsx)("li",{children:(0,g.jsx)("a",{href:"/rx-server.html",target:"_blank",children:"RxServer Adapter Fastify"})}),(0,g.jsx)("li",{children:(0,g.jsx)("a",{href:"/rx-server.html",target:"_blank",children:"RxServer Adapter Koa"})})]})]})}),(0,g.jsx)("div",{className:"package",children:(0,g.jsxs)("div",{className:"package-inner",children:[(0,g.jsx)("input",{name:"package-utilities",type:"checkbox",className:"package-checkbox",defaultChecked:!0,disabled:!0}),(0,g.jsxs)("h4",{children:["Utilities Package ",(0,g.jsx)("b",{children:"(always included)"})]}),(0,g.jsxs)("ul",{children:[(0,g.jsx)("li",{children:(0,g.jsx)("a",{href:"/logger.html",target:"_blank",children:"Logger"})}),(0,g.jsx)("li",{children:(0,g.jsx)("a",{href:"/fulltext-search.html",target:"_blank",children:"Fulltext Search"})})]})]})}),(0,g.jsx)("div",{className:"clear"}),(0,g.jsx)("div",{className:"clear"})]})})})}),(0,g.jsx)("div",{className:"price-calculator",id:"price-calculator-result",style:{marginBottom:90,display:"none"},children:(0,g.jsxs)("div",{className:"price-calculator-inner",children:[(0,g.jsx)("h4",{children:"Calculated Price:"}),(0,g.jsxs)("div",{className:"inner",children:[(0,g.jsx)("span",{className:"price-label",children:"\u20ac"}),(0,g.jsx)("span",{id:"total-per-project-per-month",children:"XX"}),(0,g.jsx)("span",{className:"per-month",children:"/month"}),(0,g.jsx)("span",{className:"clear"})]}),(0,g.jsxs)("div",{className:"inner",children:["(billed yearly: ",(0,g.jsx)("span",{id:"total-per-project-per-year"})," \u20ac)"]}),(0,g.jsx)("br",{}),(0,g.jsx)("div",{className:"clear"}),(0,g.jsx)(x.$,{primary:!0,style:{width:"100%"},onClick:N,children:"Buy Now \xbb"}),(0,g.jsxs)("div",{style:{fontSize:"70%",textAlign:"center",marginTop:16},children:["If you have any questions, see the FAQ below or fill out the ",(0,g.jsx)("b",{style:{color:"white",textDecoration:"underline",cursor:"pointer"},onClick:N,children:"Buy-Now Form"})," to get in contact."]}),(0,g.jsx)("div",{className:"clear"})]})})]})}),(0,g.jsx)("div",{className:"block",id:"faq",children:(0,g.jsxs)("div",{className:"content centered premium-faq",children:[(0,g.jsxs)("h2",{children:["F.A.Q. ",(0,g.jsx)("b",{children:"(click to toggle)"})]}),(0,g.jsxs)("details",{children:[(0,g.jsx)("summary",{children:"What is the process for making a purchase?"}),(0,g.jsxs)("ul",{children:[(0,g.jsxs)("li",{children:["Fill out the ",(0,g.jsx)("b",{style:{color:"white",textDecoration:"underline",cursor:"pointer"},onClick:N,children:"Buy now form"}),"."]}),(0,g.jsx)("li",{children:"You will get a license agreement that you can sign online."}),(0,g.jsx)("li",{children:"You will get an invoice via stripe.com."}),(0,g.jsxs)("li",{children:["After payment you get the access token that you can use to add the Premium plugins to your project with ",(0,g.jsx)("a",{href:"https://www.npmjs.com/package/rxdb-premium",target:"_blank",children:"these instructions"}),"."]})]})]}),(0,g.jsxs)("details",{children:[(0,g.jsx)("summary",{children:"Do I need the Premium Plugins?"}),"RxDB Core is open source and many use cases can be implemented with the Open Core part of RxDB. There are many"," ",(0,g.jsx)("a",{href:"/rx-storage.html",target:"_blank",children:"RxStorage"})," ","options and all core plugins that are required for replication, schema validation, encryption and so on, are totally free. As soon as your application is more than a side project you can consider using the premium plugins as an easy way to improve your applications performance and reduce the build size.",(0,g.jsx)("br",{}),"The main benefit of the Premium Plugins is ",(0,g.jsx)("b",{children:"performance"}),". The Premium RxStorage implementations have a better performance so reading and writing data is much faster especially on low-end devices. You can find a performance comparison"," ",(0,g.jsx)("a",{href:"/rx-storage-performance.html",target:"_blank",children:"here"}),". Also there are additional Premium Plugins that can be used to further optimize the performance of your application like the"," ",(0,g.jsx)("a",{href:"/query-optimizer.html",target:"_blank",children:"Query Optimizer"})," ","or the"," ",(0,g.jsx)("a",{href:"/rx-storage-sharding.html",target:"_blank",children:"Sharding"})," ","plugin."]}),(0,g.jsxs)("details",{children:[(0,g.jsx)("summary",{children:"Can I get a free trial period?"}),(0,g.jsxs)("ul",{children:[(0,g.jsx)("li",{children:"We do not currently offer a free trial. Instead, we encourage you to explore RxDB's open-source core to evaluate the technology before purchasing the Premium Plugins."}),(0,g.jsxs)("li",{children:["Access to the Premium Plugins requires a signed licensing agreement, which safeguards both parties but also adds administrative overhead. For this reason, we cannot offer free trials or monthly subscriptions; Premium licenses are provided on an ",(0,g.jsx)("b",{children:"annual basis"}),"."]})]})]}),(0,g.jsxs)("details",{children:[(0,g.jsx)("summary",{children:"Can I install/build the premium plugins in my CI?"}),"Yes, you can safely install and use the Premium Plugins in your CI without additional payment."]}),(0,g.jsxs)("details",{children:[(0,g.jsx)("summary",{children:"Which payment methods are accepted?"}),(0,g.jsx)("b",{children:"Stripe.com"})," is used as payment processor so most known payment options like credit card, PayPal, SEPA transfer and others are available. A list of all options can be found"," ",(0,g.jsx)("a",{href:"https://stripe.com/docs/payments/payment-methods/overview",title:"stripe payment options",target:"_blank",children:"here"}),"."]}),(0,g.jsxs)("details",{children:[(0,g.jsx)("summary",{children:"Is there any tracking code inside of the premium plugins?"}),"No, the premium plugins themself do not contain any tracking code. When you build your application with RxDB and deploy it to production, it will not make requests from your users to any RxDB server."]}),(0,g.jsxs)("details",{children:[(0,g.jsx)("summary",{children:"Can I add more Premium Packages later if I've already purchased some?"}),"Yes! You can upgrade or add additional Premium Packages at any time. When you decide to purchase more, we'll calculate a fair upgrade price, meaning you only pay the difference between your existing purchase and the new package total.",(0,g.jsx)("br",{}),"Your previous payments are fully credited, so you never pay twice for the same plugins."]}),(0,g.jsxs)("details",{children:[(0,g.jsx)("summary",{children:"Can I get a discount?"}),"There are multiple ways to get a discount:",(0,g.jsxs)("ul",{children:[(0,g.jsxs)("li",{children:[(0,g.jsx)("h5",{children:"Contribute to the RxDB github repository"}),(0,g.jsx)("p",{children:"If you have made significant contributions to the RxDB github repository, you can apply for a discount depending on your contribution."})]}),(0,g.jsxs)("li",{children:[(0,g.jsx)("h5",{children:"Get 25% off by writing about how you use RxDB"}),(0,g.jsx)("p",{children:"On your company/project website, publish an article/blogpost about how you use RxDB in your project. Include how your setup looks like, how you use RxDB in that setup and what problems you had and how did you overcome them. You also need to link to the RxDB website or documentation pages."})]}),(0,g.jsxs)("li",{children:[(0,g.jsx)("h5",{children:"Be active in the RxDB community"}),(0,g.jsx)("p",{children:"If you are active in the RxDB community and discord channel by helping others out or creating educational content like videos and tutorials, feel free to apply for a discount."})]}),(0,g.jsxs)("li",{children:[(0,g.jsx)("h5",{children:"Solve one of the free-premium-tasks"}),(0,g.jsxs)("p",{children:["For private personal projects there is the option to solve one of the"," ",(0,g.jsx)("a",{href:"https://github.com/pubkey/rxdb/blob/master/orga/premium-tasks.md",target:"_blank",children:"Premium Tasks"})," ","to get a free 2 years access to the Premium Plugins."]})]})]})]})]})}),(0,g.jsx)("div",{className:"block dark",children:(0,g.jsxs)("div",{className:"content centered",children:[(0,g.jsxs)("h2",{children:["RxDB Premium Plugins ",(0,g.jsx)("b",{children:"Overview"})]}),(0,g.jsxs)("div",{className:"premium-blocks",children:[(0,g.jsx)("a",{href:"/rx-storage-indexeddb.html",target:"_blank",children:(0,g.jsx)("div",{className:"premium-block hover-shadow-middle bg-gradient-right-top",children:(0,g.jsxs)("div",{className:"premium-block-inner",children:[(0,g.jsx)("h4",{children:"RxStorage IndexedDB"}),(0,g.jsxs)("p",{children:["A storage for browsers based on ",(0,g.jsx)("b",{children:"IndexedDB"}),". Has the best latency on writes and smallest build size."]})]})})}),(0,g.jsx)("a",{href:"/rx-storage-opfs.html",target:"_blank",children:(0,g.jsx)("div",{className:"premium-block hover-shadow-middle bg-gradient-left-top",children:(0,g.jsxs)("div",{className:"premium-block-inner",children:[(0,g.jsx)("h4",{children:"RxStorage OPFS"}),(0,g.jsxs)("p",{children:["Currently the RxStorage with the best data throughput that can be used in the browser. Based on the ",(0,g.jsx)("b",{children:"OPFS File System Access API"}),"."]})]})})}),(0,g.jsx)("a",{href:"/rx-storage-sqlite.html",target:"_blank",children:(0,g.jsx)("div",{className:"premium-block hover-shadow-middle bg-gradient-right-top",children:(0,g.jsxs)("div",{className:"premium-block-inner",children:[(0,g.jsx)("h4",{children:"RxStorage SQLite"}),(0,g.jsxs)("p",{children:["A fast storage based on ",(0,g.jsx)("b",{children:"SQLite"})," for Servers and Hybrid Apps. Can be used with"," ",(0,g.jsx)("b",{children:"Node.js"}),", ",(0,g.jsx)("b",{children:"Electron"}),", ",(0,g.jsx)("b",{children:"React Native"}),", ",(0,g.jsx)("b",{children:"Capacitor"}),"."]})]})})}),(0,g.jsx)("a",{href:"/rx-storage-shared-worker.html",target:"_blank",children:(0,g.jsx)("div",{className:"premium-block hover-shadow-middle bg-gradient-left-top",children:(0,g.jsxs)("div",{className:"premium-block-inner",children:[(0,g.jsx)("h4",{children:"RxStorage SharedWorker"}),(0,g.jsxs)("p",{children:["A RxStorage wrapper to run the storage inside of a SharedWorker which improves the performance by taking CPU load away from the main process. Used in ",(0,g.jsx)("b",{children:"browsers"}),"."]})]})})}),(0,g.jsx)("a",{href:"/rx-storage-worker.html",target:"_blank",children:(0,g.jsx)("div",{className:"premium-block hover-shadow-middle bg-gradient-left-top",children:(0,g.jsxs)("div",{className:"premium-block-inner",children:[(0,g.jsx)("h4",{children:"RxStorage Worker"}),(0,g.jsx)("p",{children:"A RxStorage wrapper to run the storage inside of a Worker which improves the performance by taking CPU load away from the main process."})]})})}),(0,g.jsx)("a",{href:"/rx-storage-sharding.html",target:"_blank",children:(0,g.jsx)("div",{className:"premium-block hover-shadow-middle bg-gradient-right-top",children:(0,g.jsxs)("div",{className:"premium-block-inner",children:[(0,g.jsx)("h4",{children:"RxStorage Sharding"}),(0,g.jsx)("p",{children:"A wrapper around any other storage that improves performance by applying the sharding technique."})]})})}),(0,g.jsx)("a",{href:"/rx-storage-memory-mapped.html",target:"_blank",children:(0,g.jsx)("div",{className:"premium-block hover-shadow-middle bg-gradient-left-top",children:(0,g.jsxs)("div",{className:"premium-block-inner",children:[(0,g.jsx)("h4",{children:"RxStorage Memory Mapped"}),(0,g.jsx)("p",{children:"A wrapper around any other storage that creates a mapped in-memory copy which improves performance for the initial page load time and write & read operations."})]})})}),(0,g.jsx)("a",{href:"/query-optimizer.html",target:"_blank",children:(0,g.jsx)("div",{className:"premium-block hover-shadow-middle bg-gradient-right-top",children:(0,g.jsxs)("div",{className:"premium-block-inner",children:[(0,g.jsx)("h4",{children:"Query Optimizer"}),(0,g.jsx)("p",{children:"A tool to find the best index for a given query. You can use this during build time to find the best index and then use that index during runtime."})]})})}),(0,g.jsx)("a",{href:"/rx-storage-localstorage-meta-optimizer.html",target:"_blank",children:(0,g.jsx)("div",{className:"premium-block hover-shadow-middle bg-gradient-left-top",children:(0,g.jsxs)("div",{className:"premium-block-inner",children:[(0,g.jsx)("h4",{children:"RxStorage Localstorage Meta Optimizer"}),(0,g.jsxs)("p",{children:["A wrapper around any other storage which optimizes the initial page load one by using localstorage for meta key-value document. Only works in ",(0,g.jsx)("b",{children:"browsers"}),"."]})]})})}),(0,g.jsx)("a",{href:"/encryption.html",target:"_blank",children:(0,g.jsx)("div",{className:"premium-block hover-shadow-middle bg-gradient-right-top",children:(0,g.jsxs)("div",{className:"premium-block-inner",children:[(0,g.jsx)("h4",{children:"WebCrypto Encryption"}),(0,g.jsx)("p",{children:"A faster and more secure encryption plugin based on the Web Crypto API."})]})})}),(0,g.jsx)("a",{href:"/rx-storage-filesystem-node.html",target:"_blank",children:(0,g.jsx)("div",{className:"premium-block hover-shadow-middle bg-gradient-left-top",children:(0,g.jsxs)("div",{className:"premium-block-inner",children:[(0,g.jsx)("h4",{children:"RxStorage Filesystem Node"}),(0,g.jsxs)("p",{children:["A fast RxStorage based on the ",(0,g.jsx)("b",{children:"Node.js"})," Filesystem."]})]})})}),(0,g.jsx)("a",{href:"/logger.html",target:"_blank",children:(0,g.jsx)("div",{className:"premium-block hover-shadow-middle bg-gradient-right-top",children:(0,g.jsxs)("div",{className:"premium-block-inner",children:[(0,g.jsx)("h4",{children:"Logger"}),(0,g.jsx)("p",{children:"A logging plugin useful to debug performance problems and for monitoring with Application Performance Monitoring (APM) tools like Bugsnag, Datadog, Elastic, Sentry and others"})]})})}),(0,g.jsx)("a",{href:"/rx-server.html",target:"_blank",children:(0,g.jsx)("div",{className:"premium-block hover-shadow-middle bg-gradient-left-top",children:(0,g.jsxs)("div",{className:"premium-block-inner",children:[(0,g.jsx)("h4",{children:"RxServer Fastify Adapter"}),(0,g.jsx)("p",{children:"An adapter to use the RxServer with fastify instead of express. Used to have better performance when serving requests."})]})})}),(0,g.jsx)("a",{href:"/logger.html",target:"_blank",children:(0,g.jsx)("div",{className:"premium-block hover-shadow-middle bg-gradient-right-top",children:(0,g.jsxs)("div",{className:"premium-block-inner",children:[(0,g.jsx)("h4",{children:"RxServer Koa Adapter"}),(0,g.jsx)("p",{children:"An adapter to use the RxServer with Koa instead of express. Used to have better performance when serving requests."})]})})}),(0,g.jsx)("a",{href:"/fulltext-search.html",target:"_blank",children:(0,g.jsx)("div",{className:"premium-block hover-shadow-middle bg-gradient-right-top",children:(0,g.jsxs)("div",{className:"premium-block-inner",children:[(0,g.jsx)("h4",{children:"FlexSearch"}),(0,g.jsx)("p",{children:"A plugin to efficiently run local fulltext search indexing and queries."})]})})})]})]})}),(0,g.jsx)(w,{open:b,onClose:()=>{v(!1)}})]})})]})}function w({onClose:e,open:r}){return(0,g.jsx)(p._,{onClose:e,open:r,iframeUrl:"https://webforms.pipedrive.com/f/ccHQ5wi8dHxdFgcxEnRfXaXv2uTGnLNwP4tPAGO3hgSFan8xa5j7Kr3LH5OXzWQo2T"})}},9855(e,r,a){a.d(r,{Pu:()=>s});const i={browser:.3,native:.4,performance:.35,server:.2,sourcecode:0};function s(e){const r=e.getLatest()._data.data;return function(e){console.log("-------------------- calculatePrice:"),console.dir(e);let r=0;e.packages.forEach(e=>{r+=i[e]}),console.log("aimInPercent: "+r);let a=200+r/100*6e4;2===e.packages.length?a*=.95:e.packages.length>2&&(a*=.9);const s=Math.pow(e.teamSize,-.4);if(console.log("input.teamSize ("+a+") "+e.teamSize+" - pricePerDeveloper: "+s),a*=s*e.teamSize,e.packages.includes("sourcecode")){a*=1.75;const e=1520;a1200?100*Math.floor(a/100):50*Math.floor(a/50),{totalPrice:a}}({teamSize:r.developers,packages:r.packages})}}}]); \ No newline at end of file diff --git a/docs/assets/js/0e467ee2.9c93875e.js b/docs/assets/js/0e467ee2.9c93875e.js deleted file mode 100644 index 1885a5301eb..00000000000 --- a/docs/assets/js/0e467ee2.9c93875e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[4989],{3318(e,n,i){i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>d,default:()=>o,frontMatter:()=>t,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"articles/ideas","title":"ideas for articles","description":"- storing and searching through 1mio emails in a browser database","source":"@site/docs/articles/ideas.md","sourceDirName":"articles","slug":"/articles/ideas","permalink":"/articles/ideas","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{}}');var r=i(4848),l=i(8453);const t={},d="ideas for articles",a={},c=[{value:"Seo keywords:",id:"seo-keywords",level:2},{value:"Seo",id:"seo",level:2},{value:"Non Seo",id:"non-seo",level:2}];function h(e){const n={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,l.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"ideas-for-articles",children:"ideas for articles"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"storing and searching through 1mio emails in a browser database"}),"\n",(0,r.jsx)(n.li,{children:"Finding the optimal way to shorten vector embeddings"}),"\n",(0,r.jsx)(n.li,{children:"Performance and quality of vector comparison functions (euclideanDistance etc)"}),"\n",(0,r.jsx)(n.li,{children:"performance and quality of vector indexing methods"}),"\n",(0,r.jsx)(n.li,{children:"What is new in IndexedDB 3.0"}),"\n",(0,r.jsx)(n.li,{children:"how progressive syncing beats client-server architecture"}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"seo-keywords",children:"Seo keywords:"}),"\n",(0,r.jsxs)(n.p,{children:['X- "optimistic ui"\nX- "local database" (rddt done)\nX- "react-native encryption"\nX- "vue database" (rddt done)\nX- "jquery database"\nX- "vue indexeddb"\nX- "firebase realtime database alternative" (rddt done)\nX- "firestore alternative" (rddt done)\nX- "ionic storage" (rddt done)\nX- "local database"\nX- "offline database"\nX- "zero local first"\nX- "webrtc p2p" - 390 ',(0,r.jsx)(n.a,{href:"http://localhost:3000/replication-webrtc.html",children:"http://localhost:3000/replication-webrtc.html"})]}),"\n",(0,r.jsxs)(n.p,{children:['X- "indexeddb storage limit" - 590 ',(0,r.jsx)(n.a,{href:"https://rxdb.info/articles/indexeddb-max-storage-limit.html",children:"https://rxdb.info/articles/indexeddb-max-storage-limit.html"}),'\nX- "indexeddb size limit" - 260 ',(0,r.jsx)(n.a,{href:"https://rxdb.info/articles/indexeddb-max-storage-limit.html",children:"https://rxdb.info/articles/indexeddb-max-storage-limit.html"}),'\nX- "indexeddb max size" - 590 ',(0,r.jsx)(n.a,{href:"https://rxdb.info/articles/indexeddb-max-storage-limit.html",children:"https://rxdb.info/articles/indexeddb-max-storage-limit.html"}),'\nX- "indexeddb limits" - 170 ',(0,r.jsx)(n.a,{href:"https://rxdb.info/articles/indexeddb-max-storage-limit.html",children:"https://rxdb.info/articles/indexeddb-max-storage-limit.html"})]}),"\n",(0,r.jsx)(n.p,{children:'X- "json based database"\nX- "json vs database"\nX- "reactjs storage"'}),"\n",(0,r.jsx)(n.h2,{id:"seo",children:"Seo"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"supabase alternative"'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"store local storage"'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"react localstorage"'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"react-native storage"'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"supabase offline" - 260'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"store array in localstorage", "localStorage array of objects"'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"real time web apps" - 170'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"reactive database" - 210'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"electron sqlite"'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"in browser database" - 90'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"offline first app" - 260'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"react native sql" - 110'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"sqlite electron"'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"localstorage vs indexeddb"'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"react native nosql database" - 30'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"indexeddb library" - 260'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"indexeddb encryption" - 90'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"client side database" - 140'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"webtransport vs websocket"'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"local first development" - 210'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"local storage examples"'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"local vector database" - 590'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"mobile app database" - 590'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"web based database"'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"livequery" - 210'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"expo database" - 390'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"database sync" - 8100'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"p2p database" - 170'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"reactive app" - 260'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"offline web app" - 320'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"offline sync" - 320'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"react native encrypted storage" - 1000'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"firestore vs firebase" - 1300'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"ionic alternatives" - 480'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"react native backend" - 720'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"react native alternative" - 1000'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"react native sqlite" - 1900'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"flutter vs react native" - 5400'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"react native redux" - 3600'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"redux alternative" - 1300'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"Awesome local first" - 10'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"tauri database" - 170'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"sqlite javascript" - 2900'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"sqlite typescript" - 260'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"sync engine" - 390'}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:'"indexeddb alternative" - 70'}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"non-seo",children:"Non Seo"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:'"Local-First Partial Sync with RxDB"'}),"\n",(0,r.jsx)(n.li,{children:'"why the indexeddb API is almost perfekt"'}),"\n",(0,r.jsx)(n.li,{children:'"how to do auth with RxDB"'}),"\n",(0,r.jsx)(n.li,{children:'"Where to store that JWT token?"'}),"\n"]})]})}function o(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453(e,n,i){i.d(n,{R:()=>t,x:()=>d});var s=i(6540);const r={},l=s.createContext(r);function t(e){const n=s.useContext(l);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),s.createElement(l.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/0e945c41.0c53f212.js b/docs/assets/js/0e945c41.0c53f212.js deleted file mode 100644 index bf66edee9ca..00000000000 --- a/docs/assets/js/0e945c41.0c53f212.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9796],{8453(e,n,r){r.d(n,{R:()=>o,x:()=>a});var s=r(6540);const i={},t=s.createContext(i);function o(e){const n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(t.Provider,{value:n},e.children)}},8908(e,n,r){r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"replication-server","title":"RxDB Server Replication","description":"The Server Replication Plugin connects to the replication endpoint of an RxDB Server Replication Endpoint and replicates data between the client and the server.","source":"@site/docs/replication-server.md","sourceDirName":".","slug":"/replication-server.html","permalink":"/replication-server.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB Server Replication","slug":"replication-server.html"},"sidebar":"tutorialSidebar","previous":{"title":"HTTP Replication","permalink":"/replication-http.html"},"next":{"title":"GraphQL Replication","permalink":"/replication-graphql.html"}}');var i=r(4848),t=r(8453);const o={title:"RxDB Server Replication",slug:"replication-server.html"},a="RxDB Server Replication",l={},c=[{value:"Usage",id:"usage",level:2},{value:"outdatedClient$",id:"outdatedclient",level:2},{value:"unauthorized$",id:"unauthorized",level:2},{value:"forbidden$",id:"forbidden",level:2},{value:"Custom EventSource implementation",id:"custom-eventsource-implementation",level:2}];function d(e){const n={a:"a",code:"code",em:"em",figure:"figure",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",span:"span",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"rxdb-server-replication",children:"RxDB Server Replication"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.em,{children:"Server Replication Plugin"})," connects to the replication endpoint of an ",(0,i.jsx)(n.a,{href:"/rx-server.html#replication-endpoint",children:"RxDB Server Replication Endpoint"})," and replicates data between the client and the server."]}),"\n",(0,i.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,i.jsxs)(n.p,{children:["The replication server plugin is imported from the ",(0,i.jsx)(n.code,{children:"rxdb-server"})," npm package. Then you start the replication with a given collection and endpoint url by calling ",(0,i.jsx)(n.code,{children:"replicateServer()"}),"."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { replicateServer } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-server/plugins/replication-server'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateServer"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" usersCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" replicationIdentifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-server-replication'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" url"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'http://localhost:80/users/0'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // endpoint url with the servers collection schema version at the end"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" headers"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" Authorization"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Bearer S0VLU0UhI...'"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" live"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(n.h2,{id:"outdatedclient",children:"outdatedClient$"}),"\n",(0,i.jsxs)(n.p,{children:["When you update your schema at the server and run a migration, you end up with a different replication url that has a new schema version number at the end.\nYour clients might still be running an old version of your application that will no longer be compatible with the endpoint. Therefore when the client tries to call a server endpoint with an outdated schema version, the ",(0,i.jsx)(n.code,{children:"outdatedClient$"})," observable emits to tell your client that the application must be updated. With that event you can tell the client to update the application.\nOn browser application you might want to just reload the page on that event:"]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"outdatedClient$"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(() "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" location"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".reload"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(n.h2,{id:"unauthorized",children:"unauthorized$"}),"\n",(0,i.jsxs)(n.p,{children:["When you clients auth data is not valid (or no longer valid), the server will no longer accept any requests from you client and inform the client that the auth headers must be updated.\nThe ",(0,i.jsx)(n.code,{children:"unauthorized$"})," observable will emit and expects you to update the headers accordingly so that following requests will be accepted again."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"unauthorized$"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(() "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".setHeaders"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" Authorization"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Bearer S0VLU0UhI...'"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(n.h2,{id:"forbidden",children:"forbidden$"}),"\n",(0,i.jsxs)(n.p,{children:["When you client behaves wrong in any case, like update non-allowed values or changing documents that it is not allowed to,\nthe server will drop the connection and the replication state will emit on the ",(0,i.jsx)(n.code,{children:"forbidden$"})," observable.\nIt will also automatically stop the replication so that your client does not accidentally DOS attack the server."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"forbidden$"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(() "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Client is behaving wrong'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(n.h2,{id:"custom-eventsource-implementation",children:"Custom EventSource implementation"}),"\n",(0,i.jsxs)(n.p,{children:["For the server send events, the ",(0,i.jsx)(n.a,{href:"https://github.com/EventSource/eventsource",children:"eventsource"})," npm package is used instead of the native ",(0,i.jsx)(n.code,{children:"EventSource"})," API. We need this because the native browser API does not support sending headers with the request which is required by the server to parse the auth data."]}),"\n",(0,i.jsx)(n.p,{children:"If the eventsource package does not work for you, you can set an own implementation when creating the replication."}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateServer"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" eventSource"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" MyEventSourceConstructor"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/0f6e10f0.51b093f2.js b/docs/assets/js/0f6e10f0.51b093f2.js deleted file mode 100644 index ec885888dcb..00000000000 --- a/docs/assets/js/0f6e10f0.51b093f2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[1475],{7706(e,i,s){s.r(i),s.d(i,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>t,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"articles/progressive-web-app-database","title":"RxDB as a Database for Progressive Web Apps (PWA)","description":"Discover how RxDB supercharges Progressive Web Apps with real-time sync, offline-first capabilities, and lightning-fast data handling.","source":"@site/docs/articles/progressive-web-app-database.md","sourceDirName":"articles","slug":"/articles/progressive-web-app-database.html","permalink":"/articles/progressive-web-app-database.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB as a Database for Progressive Web Apps (PWA)","slug":"progressive-web-app-database.html","description":"Discover how RxDB supercharges Progressive Web Apps with real-time sync, offline-first capabilities, and lightning-fast data handling."},"sidebar":"tutorialSidebar","previous":{"title":"Real-Time & Offline - RxDB for Mobile Apps","permalink":"/articles/mobile-database.html"},"next":{"title":"RxDB as a Database for React Applications","permalink":"/articles/react-database.html"}}');var n=s(4848),r=s(8453);const t={title:"RxDB as a Database for Progressive Web Apps (PWA)",slug:"progressive-web-app-database.html",description:"Discover how RxDB supercharges Progressive Web Apps with real-time sync, offline-first capabilities, and lightning-fast data handling."},o="RxDB as a Database for Progressive Web Apps (PWA)",l={},d=[{value:"What is a Progressive Web App",id:"what-is-a-progressive-web-app",level:2},{value:"Introducing RxDB as a Client-Side Database for PWAs",id:"introducing-rxdb-as-a-client-side-database-for-pwas",level:2},{value:"Getting Started with RxDB",id:"getting-started-with-rxdb",level:3},{value:"Local-First Approach",id:"local-first-approach",level:4},{value:"Observable Queries",id:"observable-queries",level:4},{value:"Multi-Tab Support",id:"multi-tab-support",level:4},{value:"Using RxDB in a Progressive Web App",id:"using-rxdb-in-a-progressive-web-app",level:3},{value:"Exploring Different RxStorage Layers",id:"exploring-different-rxstorage-layers",level:2},{value:"Advanced RxDB Features and Techniques",id:"advanced-rxdb-features-and-techniques",level:2},{value:"Encryption of Local Data",id:"encryption-of-local-data",level:3},{value:"Indexing and Performance Optimization",id:"indexing-and-performance-optimization",level:3},{value:"JSON Key Compression",id:"json-key-compression",level:3},{value:"Change Streams and Event Handling",id:"change-streams-and-event-handling",level:3},{value:"Conclusion",id:"conclusion",level:2},{value:"Follow Up",id:"follow-up",level:2}];function c(e){const i={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.header,{children:(0,n.jsx)(i.h1,{id:"rxdb-as-a-database-for-progressive-web-apps-pwa",children:"RxDB as a Database for Progressive Web Apps (PWA)"})}),"\n",(0,n.jsx)(i.p,{children:"Progressive Web Apps (PWAs) have revolutionized the digital landscape, offering users an immersive blend of web and native app experiences. At the heart of every successful PWA lies effective data management, and this is where RxDB comes into play. In this article, we'll explore the dynamic synergy between RxDB, a robust client-side database, and Progressive Web Apps, uncovering how RxDB enhances data handling, synchronization, and overall performance, propelling PWAs into a new era of excellence."}),"\n",(0,n.jsx)(i.h2,{id:"what-is-a-progressive-web-app",children:"What is a Progressive Web App"}),"\n",(0,n.jsx)(i.p,{children:"Progressive Web Apps are the future of web development, seamlessly combining the best of both web and mobile app worlds. They can be easily installed on the user's home screen, function offline, and load at lightning speed. Unlike hybrid apps, PWAs offer a consistent user experience across platforms, making them a versatile choice for modern applications."}),"\n",(0,n.jsx)(i.p,{children:"PWAs bring a plethora of advantages to the table. They eliminate the hassle of app store installations and updates, reduce dependency on network connectivity, and prioritize fast loading times. By harnessing the power of service workers and intelligent caching mechanisms, PWAs ensure users can access content even in offline mode. Furthermore, PWAs are device-agnostic, seamlessly adapting to various devices, from desktops to smartphones."}),"\n",(0,n.jsx)(i.h2,{id:"introducing-rxdb-as-a-client-side-database-for-pwas",children:"Introducing RxDB as a Client-Side Database for PWAs"}),"\n",(0,n.jsx)(i.p,{children:"At the heart of PWAs lies efficient data management, and RxDB steps in as a reliable ally. As a client-side NoSQL database, RxDB seamlessly integrates into web applications, offering real-time data synchronization and manipulation capabilities. This article sheds light on the transformative potential of RxDB as it collaborates harmoniously with PWAs, enabling local-first strategies and elevating user interactions to a whole new level."}),"\n",(0,n.jsx)("center",{children:(0,n.jsx)("a",{href:"https://rxdb.info/",children:(0,n.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"Progressive Web App Database",width:"228"})})}),"\n",(0,n.jsx)(i.h3,{id:"getting-started-with-rxdb",children:"Getting Started with RxDB"}),"\n",(0,n.jsx)(i.p,{children:"RxDB emerges as a reactive, schema-based NoSQL database crafted explicitly for client-side applications. Its real-time data synchronization and responsiveness align seamlessly with the dynamic demands of modern PWAs."}),"\n",(0,n.jsx)(i.h4,{id:"local-first-approach",children:"Local-First Approach"}),"\n",(0,n.jsx)(i.p,{children:"The cornerstone of RxDB's philosophy is the local-first approach, empowering PWAs to prioritize data storage and manipulation on the client side. This paradigm ensures that PWAs remain functional even when offline, allowing users to access and interact with data seamlessly. RxDB bridges any gaps in data synchronization once network connectivity is restored."}),"\n",(0,n.jsx)(i.h4,{id:"observable-queries",children:"Observable Queries"}),"\n",(0,n.jsxs)(i.p,{children:["Observable queries (aka ",(0,n.jsx)(i.strong,{children:"Live-Queries"}),") serve as the engine of RxDB's dynamic capabilities. By leveraging these queries, PWAs can monitor and respond to data changes in real time. The result is an engaging user interface with instantaneous updates that captivate users and keep them engaged."]}),"\n",(0,n.jsx)(i.figure,{"data-rehype-pretty-code-figure":"",children:(0,n.jsx)(i.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,n.jsxs)(i.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,n.jsxs)(i.span,{"data-line":"",children:[(0,n.jsx)(i.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,n.jsx)(i.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,n.jsx)(i.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,n.jsx)(i.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,n.jsx)(i.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,n.jsx)(i.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,n.jsxs)(i.span,{"data-line":"",children:[(0,n.jsx)(i.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,n.jsx)(i.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,n.jsx)(i.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,n.jsxs)(i.span,{"data-line":"",children:[(0,n.jsx)(i.span,{style:{color:"var(--shiki-foreground)"},children:" healthpoints"}),(0,n.jsx)(i.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,n.jsx)(i.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,n.jsxs)(i.span,{"data-line":"",children:[(0,n.jsx)(i.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,n.jsx)(i.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,n.jsx)(i.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"})]}),"\n",(0,n.jsx)(i.span,{"data-line":"",children:(0,n.jsx)(i.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,n.jsx)(i.span,{"data-line":"",children:(0,n.jsx)(i.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,n.jsx)(i.span,{"data-line":"",children:(0,n.jsx)(i.span,{style:{color:"var(--shiki-foreground)"},children:"})"})}),"\n",(0,n.jsxs)(i.span,{"data-line":"",children:[(0,n.jsx)(i.span,{style:{color:"var(--shiki-foreground)"},children:".$ "}),(0,n.jsx)(i.span,{style:{color:"var(--shiki-token-comment)"},children:"// the $ returns an observable that emits each time the result set of the query changes"})]}),"\n",(0,n.jsxs)(i.span,{"data-line":"",children:[(0,n.jsx)(i.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,n.jsx)(i.span,{style:{color:"var(--shiki-foreground)"},children:"(aliveHeroes "}),(0,n.jsx)(i.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,n.jsx)(i.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,n.jsx)(i.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,n.jsx)(i.span,{style:{color:"var(--shiki-foreground)"},children:"(aliveHeroes));"})]})]})})}),"\n",(0,n.jsx)(i.h4,{id:"multi-tab-support",children:"Multi-Tab Support"}),"\n",(0,n.jsx)(i.p,{children:"RxDB extends its prowess to multi-tab scenarios, guaranteeing data consistency across different tabs or windows of the same PWA. This feature promotes a seamless transition between various sections of the application, while minimizing data conflicts."}),"\n",(0,n.jsx)("p",{align:"center",children:(0,n.jsx)("img",{src:"../files/multiwindow.gif",alt:"multi tab support",width:"450"})}),"\n",(0,n.jsx)(i.h3,{id:"using-rxdb-in-a-progressive-web-app",children:"Using RxDB in a Progressive Web App"}),"\n",(0,n.jsx)(i.p,{children:"Integrating RxDB into a Progressive Web App, driven by technologies like React, is a straightforward process. By configuring RxDB and installing the necessary packages, developers establish a solid foundation for robust data management within their PWA."}),"\n",(0,n.jsx)(i.h2,{id:"exploring-different-rxstorage-layers",children:"Exploring Different RxStorage Layers"}),"\n",(0,n.jsx)(i.p,{children:"RxDB caters to diverse needs through its various RxStorage layers:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.a,{href:"/rx-storage-localstorage.html",children:"localstorage RxStorage"}),": Leveraging the capabilities of the browsers localstorage API for storage."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB RxStorage"}),": Tapping into the browser's IndexedDB for efficient data storage."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.a,{href:"/rx-storage-opfs.html",children:"OPFS RxStorage"}),": Interfacing with the Offline-First Persistence System for seamless persistence."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.a,{href:"/rx-storage-memory.html",children:"Memory RxStorage"}),": Storing data in memory, ideal for temporary data requirements.\nThis flexibility empowers developers to optimize data storage based on the unique needs of their PWA."]}),"\n"]}),"\n",(0,n.jsx)(i.p,{children:"Synchronizing Data with RxDB between PWA Clients and Servers\nTo facilitate seamless data synchronization between PWA clients and servers, RxDB offers a range of replication options:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"/replication.html",children:"RxDB Replication Algorithm"}),": RxDB introduces its own replication algorithm, enabling efficient and reliable data synchronization between clients and servers."]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"/replication-couchdb.html",children:"CouchDB Replication"}),": Leveraging its roots in CouchDB, RxDB facilitates smooth data replication between clients and CouchDB servers, ensuring data consistency and synchronization across devices."]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"/replication-firestore.html",children:"Firestore Replication"}),": RxDB synchronizes data with Google Firestore, a real-time cloud-hosted NoSQL database. This integration guarantees up-to-date data across different instances of the PWA."]}),"\n"]}),"\n",(0,n.jsxs)(i.li,{children:["\n",(0,n.jsxs)(i.p,{children:[(0,n.jsx)(i.a,{href:"/replication-webrtc.html",children:"Peer-to-Peer (P2P) via WebRTC"})," Replication: RxDB supports P2P replication, facilitating direct data synchronization between clients without intermediaries. This decentralized approach is invaluable in scenarios where server infrastructure is limited."]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(i.h2,{id:"advanced-rxdb-features-and-techniques",children:"Advanced RxDB Features and Techniques"}),"\n",(0,n.jsx)(i.h3,{id:"encryption-of-local-data",children:"Encryption of Local Data"}),"\n",(0,n.jsx)(i.p,{children:"RxDB empowers PWAs with the ability to encrypt local data, enhancing data security and safeguarding sensitive information. This feature is indispensable for applications handling user credentials, financial transactions, and other confidential data."}),"\n",(0,n.jsx)(i.h3,{id:"indexing-and-performance-optimization",children:"Indexing and Performance Optimization"}),"\n",(0,n.jsx)(i.p,{children:"Performance optimization is a top priority for PWAs. RxDB addresses this concern by offering indexing options that expedite data retrieval, resulting in a snappier user interface and heightened responsiveness."}),"\n",(0,n.jsx)(i.h3,{id:"json-key-compression",children:"JSON Key Compression"}),"\n",(0,n.jsx)(i.p,{children:"RxDB introduces JSON key compression, a feature that reduces storage requirements. This optimization is particularly beneficial for PWAs dealing with substantial data volumes, enhancing overall efficiency and resource utilization."}),"\n",(0,n.jsx)(i.h3,{id:"change-streams-and-event-handling",children:"Change Streams and Event Handling"}),"\n",(0,n.jsx)(i.p,{children:"RxDB introduces change streams, enabling PWAs to react to data changes in real time. This capability empowers dynamic updates to the user interface, promoting interactivity and engagement."}),"\n",(0,n.jsx)(i.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,n.jsx)(i.p,{children:"In the ever-evolving landscape of web application development, Progressive Web Apps continue to redefine user experiences. RxDB emerges as a pivotal player, seamlessly integrating with PWAs and enhancing their capabilities. With features like the local-first approach, observable queries, replication mechanisms, and advanced encryption, RxDB empowers developers to create responsive, offline-capable, and data-driven PWAs. As the demand for sophisticated PWAs continues to surge, RxDB remains an indispensable tool for developers aiming to push the boundaries of innovation and redefine the standards of user engagement. By embracing RxDB, developers ensure their PWAs remain at the forefront of the digital revolution, offering seamless and immersive experiences to users around the world."}),"\n",(0,n.jsx)(i.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,n.jsx)(i.p,{children:"To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources:"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.a,{href:"https://github.com/pubkey/rxdb",children:"RxDB GitHub Repository"}),": Visit the official GitHub repository of RxDB to access the source code, documentation, and community support."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.a,{href:"/quickstart.html",children:"RxDB Quickstart"}),": Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects."]}),"\n",(0,n.jsx)(i.li,{children:(0,n.jsx)(i.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/angular",children:"RxDB Progressive Web App in Angular Example"})}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453(e,i,s){s.d(i,{R:()=>t,x:()=>o});var a=s(6540);const n={},r=a.createContext(n);function t(e){const i=a.useContext(r);return a.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:t(e.components),a.createElement(r.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/118cde4c.d7e82ca5.js b/docs/assets/js/118cde4c.d7e82ca5.js deleted file mode 100644 index 1d613b431fc..00000000000 --- a/docs/assets/js/118cde4c.d7e82ca5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[5272],{2318(e,n,s){s.r(n),s.d(n,{assets:()=>t,contentTitle:()=>a,default:()=>d,frontMatter:()=>l,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"replication-couchdb","title":"RxDB\'s CouchDB Replication Plugin","description":"Replicate your RxDB collections with CouchDB the fast way. Enjoy faster sync, easier conflict handling, and flexible storage using this modern plugin.","source":"@site/docs/replication-couchdb.md","sourceDirName":".","slug":"/replication-couchdb.html","permalink":"/replication-couchdb.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB\'s CouchDB Replication Plugin","slug":"replication-couchdb.html","description":"Replicate your RxDB collections with CouchDB the fast way. Enjoy faster sync, easier conflict handling, and flexible storage using this modern plugin."},"sidebar":"tutorialSidebar","previous":{"title":"WebSocket Replication","permalink":"/replication-websocket.html"},"next":{"title":"WebRTC P2P Replication","permalink":"/replication-webrtc.html"}}');var i=s(4848),o=s(8453);const l={title:"RxDB's CouchDB Replication Plugin",slug:"replication-couchdb.html",description:"Replicate your RxDB collections with CouchDB the fast way. Enjoy faster sync, easier conflict handling, and flexible storage using this modern plugin."},a="Replication with CouchDB",t={},c=[{value:"Pros",id:"pros",level:2},{value:"Cons",id:"cons",level:2},{value:"Usage",id:"usage",level:2},{value:"Conflict handling",id:"conflict-handling",level:2},{value:"Auth example",id:"auth-example",level:2},{value:"Limitations",id:"limitations",level:2},{value:"Known problems",id:"known-problems",level:2},{value:"Database missing",id:"database-missing",level:3},{value:"React Native",id:"react-native",level:2}];function h(e){const n={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"replication-with-couchdb",children:"Replication with CouchDB"})}),"\n",(0,i.jsx)(n.p,{children:"A plugin to replicate between a RxCollection and a CouchDB server."}),"\n",(0,i.jsxs)(n.p,{children:["This plugins uses the RxDB ",(0,i.jsx)(n.a,{href:"/replication.html",children:"Sync Engine"})," to replicate with a CouchDB endpoint. This plugin ",(0,i.jsx)(n.strong,{children:"does NOT"})," use the official ",(0,i.jsx)(n.a,{href:"https://docs.couchdb.org/en/stable/replication/protocol.html",children:"CouchDB replication protocol"})," because the CouchDB protocol was optimized for server-to-server replication and is not suitable for fast client side applications, mostly because it has to run many HTTP-requests (at least one per document) and also it has to store the whole revision tree of the documents at the client. This makes initial replication and querying very slow."]}),"\n",(0,i.jsx)(n.p,{children:"Because the way how RxDB handles revisions and documents is very similar to CouchDB, using the RxDB replication with a CouchDB endpoint is pretty straightforward."}),"\n",(0,i.jsx)(n.h2,{id:"pros",children:"Pros"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Faster initial replication."}),"\n",(0,i.jsxs)(n.li,{children:["Works with any ",(0,i.jsx)(n.a,{href:"/rx-storage.html",children:"RxStorage"}),", not just PouchDB."]}),"\n",(0,i.jsx)(n.li,{children:"Easier conflict handling because conflicts are handled during replication and not afterwards."}),"\n",(0,i.jsx)(n.li,{children:"Does not have to store all document revisions on the client, only stores the newest version."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"cons",children:"Cons"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Does not support the replication of ",(0,i.jsx)(n.a,{href:"/rx-attachment.html",children:"attachments"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Like all CouchDB replication plugins, this one is also limited to replicating 6 collections in parallel. ",(0,i.jsx)(n.a,{href:"/replication-couchdb.html#limitations",children:"Read this for workarounds"})]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,i.jsxs)(n.p,{children:["Start the replication via ",(0,i.jsx)(n.code,{children:"replicateCouchDB()"}),"."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { replicateCouchDB } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication-couchdb'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateCouchDB"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" replicationIdentifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-couchdb-replication'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myRxCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // url to the CouchDB endpoint (required)"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" url"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'http://example.com/db/humans'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * true for live replication,"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * false for a one-time replication."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * [default=true]"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" live"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * A custom fetch() method can be provided"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * to add authentication or credentials."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Can be swapped out dynamically"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * by running 'replicationState.fetch = newFetchMethod;'."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * (optional)"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" fetch"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myCustomFetchMethod"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Amount of documents to be fetched in one HTTP request"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * (optional)"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 60"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Custom modifier to mutate pulled documents"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * before storing them in RxDB."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * (optional)"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" modifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" docData "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" "})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Heartbeat time in milliseconds"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * for the long polling of the changestream."})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"@link"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" https://docs.couchdb.org/en/3.2.2-docs/api/database/changes.html"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * (optional, default=60000)"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" heartbeat"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 60000"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * How many local changes to process at once."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * (optional)"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 60"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Custom modifier to mutate documents"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * before sending them to the CouchDB endpoint."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * (optional)"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" modifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" docData "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,i.jsxs)(n.p,{children:["When you call ",(0,i.jsx)(n.code,{children:"replicateCouchDB()"})," it returns a ",(0,i.jsx)(n.code,{children:"RxCouchDBReplicationState"})," which can be used to subscribe to events, for debugging or other functions. It extends the ",(0,i.jsx)(n.a,{href:"/replication.html",children:"RxReplicationState"})," so any other method that can be used there can also be used on the CouchDB replication state."]}),"\n",(0,i.jsx)(n.h2,{id:"conflict-handling",children:"Conflict handling"}),"\n",(0,i.jsxs)(n.p,{children:["When conflicts appear during replication, the ",(0,i.jsx)(n.code,{children:"conflictHandler"})," of the ",(0,i.jsx)(n.code,{children:"RxCollection"})," is used, equal to the other replication plugins. Read more about conflict handling ",(0,i.jsx)(n.a,{href:"/replication.html#conflict-handling",children:"here"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"auth-example",children:"Auth example"}),"\n",(0,i.jsxs)(n.p,{children:["Lets say for authentication you need to add a ",(0,i.jsx)(n.a,{href:"https://swagger.io/docs/specification/authentication/bearer-authentication/",children:"bearer token"})," as HTTP header to each request. You can achieve that by crafting a custom ",(0,i.jsx)(n.code,{children:"fetch()"})," method that add the header field."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" myCustomFetch"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (url"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" options) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // flat clone the given options to not mutate the input"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" optionsWithAuth"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" Object"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".assign"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" options);"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // ensure the headers property exists"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"optionsWithAuth"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".headers) {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" optionsWithAuth"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".headers "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {};"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // add bearer token to headers"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" optionsWithAuth"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".headers["}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Authorization'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"] "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Basic S0VLU0UhIExFQ0...'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // call the original fetch function with our custom options."})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" fetch"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" url"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" optionsWithAuth"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateCouchDB"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" replicationIdentifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-couchdb-replication'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myRxCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" url"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'http://example.com/db/humans'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Add the custom fetch function here."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" fetch"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myCustomFetch"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {}"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,i.jsxs)(n.p,{children:["Also when your bearer token changes over time, you can set a new custom ",(0,i.jsx)(n.code,{children:"fetch"})," method while the replication is running:"]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsx)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".fetch "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" newCustomFetchMethod;"})]})})})}),"\n",(0,i.jsxs)(n.p,{children:["Also there is a helper method ",(0,i.jsx)(n.code,{children:"getFetchWithCouchDBAuthorization()"})," to create a fetch handler with authorization:"]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { "})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" replicateCouchDB"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" getFetchWithCouchDBAuthorization"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication-couchdb'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateCouchDB"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" replicationIdentifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-couchdb-replication'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myRxCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" url"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'http://example.com/db/humans'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Add the custom fetch function here."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" fetch"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getFetchWithCouchDBAuthorization"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'myUsername'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myPassword'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {}"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,i.jsx)(n.h2,{id:"limitations",children:"Limitations"}),"\n",(0,i.jsxs)(n.p,{children:["Since CouchDB only allows synchronization through HTTP1.1 long polling requests there is a limitation of 6 active synchronization connections before the browser prevents sending any further request. This limitation is at the level of browser per tab per domain (some browser, especially older ones, might have a different limit, ",(0,i.jsx)(n.a,{href:"https://docs.pushtechnology.com/cloud/latest/manual/html/designguide/solution/support/connection_limitations.html",children:"see here"}),")."]}),"\n",(0,i.jsxs)(n.p,{children:["Since this limitation is at the ",(0,i.jsx)(n.strong,{children:"browser"})," level there are several solutions:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:'Use only a single database for all entities and set a "type" field for each of the documents'}),"\n",(0,i.jsx)(n.li,{children:"Create multiple subdomains for CouchDB and use a max of 6 active synchronizations (or less) for each"}),"\n",(0,i.jsx)(n.li,{children:"Use a proxy (ex: HAProxy) between the browser and CouchDB and configure it to use HTTP2.0, since HTTP2.0"}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"If you use nginx in front of your CouchDB, you can use these settings to enable http2-proxying to prevent the connection limit problem:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'server {\n http2 on;\n location /db {\n rewrite /db/(.*) /$1 break;\n proxy_pass http://172.0.0.1:5984;\n proxy_redirect off;\n proxy_buffering off;\n proxy_set_header Host $host;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded\n proxy_set_header Connection "keep_alive"\n }\n}\n'})}),"\n",(0,i.jsx)(n.h2,{id:"known-problems",children:"Known problems"}),"\n",(0,i.jsx)(n.h3,{id:"database-missing",children:"Database missing"}),"\n",(0,i.jsxs)(n.p,{children:["In contrast to PouchDB, this plugin ",(0,i.jsx)(n.strong,{children:"does NOT"})," automatically create missing CouchDB databases.\nIf your CouchDB server does not have a database yet, you have to create it by yourself by running a ",(0,i.jsx)(n.code,{children:"PUT"})," request to the database ",(0,i.jsx)(n.code,{children:"name"})," url:"]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// create a 'humans' CouchDB database on the server"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" remoteDatabaseName"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'humans'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" fetch"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'http://example.com/db/'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" remoteDatabaseName"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" method"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'PUT'"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,i.jsx)(n.h2,{id:"react-native",children:"React Native"}),"\n",(0,i.jsxs)(n.p,{children:["React Native does not have a global ",(0,i.jsx)(n.code,{children:"fetch"})," method. You have to import fetch method with the ",(0,i.jsx)(n.a,{href:"https://www.npmjs.com/package/cross-fetch",children:"cross-fetch"})," package:"]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" crossFetch "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'cross-fetch'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateCouchDB"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" replicationIdentifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-couchdb-replication'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myRxCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" url"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'http://example.com/db/humans'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" fetch"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" crossFetch"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {}"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453(e,n,s){s.d(n,{R:()=>l,x:()=>a});var r=s(6540);const i={},o=r.createContext(i);function l(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/11d75f9a.8210c243.js b/docs/assets/js/11d75f9a.8210c243.js deleted file mode 100644 index d6bbf20baf0..00000000000 --- a/docs/assets/js/11d75f9a.8210c243.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[8897],{8282(e,n,s){s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"articles/react-native-encryption","title":"React Native Encryption and Encrypted Database/Storage","description":"Secure your React Native app with RxDB encryption. Learn why it matters, how to implement encrypted databases, and best practices to protect user data.","source":"@site/docs/articles/react-native-encryption.md","sourceDirName":"articles","slug":"/articles/react-native-encryption.html","permalink":"/articles/react-native-encryption.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"React Native Encryption and Encrypted Database/Storage","slug":"react-native-encryption.html","description":"Secure your React Native app with RxDB encryption. Learn why it matters, how to implement encrypted databases, and best practices to protect user data."},"sidebar":"tutorialSidebar","previous":{"title":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","permalink":"/articles/local-database.html"},"next":{"title":"RxDB as a Database in a Vue.js Application","permalink":"/articles/vue-database.html"}}');var i=s(4848),a=s(8453);const o={title:"React Native Encryption and Encrypted Database/Storage",slug:"react-native-encryption.html",description:"Secure your React Native app with RxDB encryption. Learn why it matters, how to implement encrypted databases, and best practices to protect user data."},t="React Native Encryption and Encrypted Database/Storage",l={},c=[{value:"\ud83d\udd12 Why Encryption Matters",id:"-why-encryption-matters",level:2},{value:"React Native Encryption Overview",id:"react-native-encryption-overview",level:2},{value:"Setting Up Encryption in RxDB for React Native",id:"setting-up-encryption-in-rxdb-for-react-native",level:2},{value:"1. Install RxDB and Required Plugins",id:"1-install-rxdb-and-required-plugins",level:3},{value:"2. Set Up Your RxDB Database with Encryption",id:"2-set-up-your-rxdb-database-with-encryption",level:3},{value:"3. Inserting and Querying Encrypted Data",id:"3-inserting-and-querying-encrypted-data",level:3},{value:"Best Practices for React Native Encryption",id:"best-practices-for-react-native-encryption",level:2},{value:"Follow Up",id:"follow-up",level:2}];function d(e){const n={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"react-native-encryption-and-encrypted-databasestorage",children:"React Native Encryption and Encrypted Database/Storage"})}),"\n",(0,i.jsx)(n.p,{children:"Data security is a critical concern in modern mobile applications. As React Native continues to grow in popularity for building cross-platform apps, ensuring that your data is protected is paramount. RxDB, a real-time database for JavaScript applications, offers powerful encryption features that can help you secure your React Native app's data."}),"\n",(0,i.jsxs)(n.p,{children:["This article explains why encryption is important, how to set it up with RxDB in ",(0,i.jsx)(n.a,{href:"/react-native-database.html",children:"React Native"}),", and best practices to keep your app secure."]}),"\n",(0,i.jsx)(n.h2,{id:"-why-encryption-matters",children:"\ud83d\udd12 Why Encryption Matters"}),"\n",(0,i.jsxs)(n.p,{children:["Encryption ensures that, even if an unauthorized party obtains physical access to your device or intercepts data, they cannot read the information without the encryption key. Sensitive user data such as credentials, personal information, or financial details should always be encrypted. Proper encryption practices reduce the risk of data breaches and help your application remain compliant with regulations like ",(0,i.jsx)(n.a,{href:"https://gdpr.eu/",children:"GDPR"})," or ",(0,i.jsx)(n.a,{href:"https://www.hhs.gov/hipaa/index.html",children:"HIPAA"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"react-native-encryption-overview",children:"React Native Encryption Overview"}),"\n",(0,i.jsx)(n.p,{children:"React Native supports multiple ways to secure local data:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Encrypted Databases"}),"\nUse databases with built-in encryption capabilities, such as SQLite with encryption layers or RxDB with its ",(0,i.jsx)(n.a,{href:"/encryption.html",children:"encryption plugin"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Secure Storage Libraries"}),"\nFor key-value data (like tokens or secrets), you can use libraries like ",(0,i.jsx)(n.a,{href:"https://github.com/oblador/react-native-keychain",children:"react-native-keychain"})," or ",(0,i.jsx)(n.a,{href:"https://github.com/emeraldsanto/react-native-encrypted-storage",children:"react-native-encrypted-storage"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Custom Encryption"}),"\nIf you need more fine-grained control, you can integrate libraries like ",(0,i.jsx)(n.a,{href:"https://github.com/brix/crypto-js",children:(0,i.jsx)(n.code,{children:"crypto-js"})})," or the ",(0,i.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API",children:"Web Crypto API"})," to encrypt data before storing it in a database or file."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"/files/logo/rxdb_javascript_database.svg",alt:"RxDB",width:"250"})})}),"\n",(0,i.jsx)(n.h2,{id:"setting-up-encryption-in-rxdb-for-react-native",children:"Setting Up Encryption in RxDB for React Native"}),"\n",(0,i.jsx)(n.h3,{id:"1-install-rxdb-and-required-plugins",children:"1. Install RxDB and Required Plugins"}),"\n",(0,i.jsx)(n.p,{children:"Install RxDB and the encryption plugin(s) you need. For the CryptoJS plugin:"}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string)"},children:" rxdb"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string)"},children:" crypto-js"})]})]})})}),"\n",(0,i.jsx)(n.h3,{id:"2-set-up-your-rxdb-database-with-encryption",children:"2. Set Up Your RxDB Database with Encryption"}),"\n",(0,i.jsxs)(n.p,{children:["RxDB offers two ",(0,i.jsx)(n.a,{href:"/encryption.html",children:"encryption plugins"}),":"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"CryptoJS Plugin"}),": A free and straightforward solution for most basic use cases."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Web Crypto Plugin"}),": A ",(0,i.jsx)(n.a,{href:"/premium",children:"premium plugin"})," that utilizes the native Web Crypto API for better performance and security."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Below is an example showing how to set up RxDB using the CryptoJS plugin. This example uses the ",(0,i.jsx)(n.a,{href:"/rx-storage-memory.html",children:"in-memory storage"})," for testing purposes. In a real production scenario, you would use a persistent storage adapter, mostly the ",(0,i.jsx)(n.a,{href:"/rx-storage-sqlite.html",children:"SQLite-based storage"}),"."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { wrappedKeyEncryptionCryptoJsStorage } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/encryption-crypto-js'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/*"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * For testing, we use the in-memory storage of RxDB."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * In production you would use the persistent SQLite based storage instead."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageMemory } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-memory'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" initEncryptedDatabase"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Wrap the normal storage with the encryption plugin"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" encryptedMemoryStorage"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" wrappedKeyEncryptionCryptoJsStorage"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageMemory"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Create an encrypted database"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myEncryptedDatabase'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" encryptedMemoryStorage"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" password"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'sudoLetMeIn'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Make sure not to hardcode in production"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Define a schema and create a collection"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" secureData"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'secure data schema'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" normalField"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" secretField"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'id'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'normalField'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'secretField'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" db;"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(n.h3,{id:"3-inserting-and-querying-encrypted-data",children:"3. Inserting and Querying Encrypted Data"}),"\n",(0,i.jsx)(n.p,{children:"Once you've set up the database with encryption, data in fields specified by your schema will be encrypted automatically before it is stored, and decrypted when queried."}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" initEncryptedDatabase"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Insert encrypted data"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"secureData"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mySecretId'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" normalField"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foobar'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" secretField"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'This is top secret data'"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Query encrypted data by its primary key or non-encrypted fields"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" fetchedDoc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"secureData"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" normalField"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foobar'"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" })"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"true"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"fetchedDoc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".secretField); "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// 'This is top secret data'"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Update data"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" fetchedDoc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".patch"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" secretField"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Updated secret data'"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"})();"})})]})})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Note"}),": You can only query directly by non-encrypted fields or primary keys. Encrypted fields cannot be used in queries because they are stored as ciphertext in the database. A common approach is to have a small subset of fields that need to be queried unencrypted while storing any sensitive data in encrypted fields."]}),"\n",(0,i.jsx)(n.h2,{id:"best-practices-for-react-native-encryption",children:"Best Practices for React Native Encryption"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Secure Password Handling"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Avoid hardcoding passwords or encryption keys."}),"\n",(0,i.jsx)(n.li,{children:"Use secure storage solutions like React Native Keychain or react-native-encrypted-storage to fetch the database password at runtime:"}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// Example: using react-native-keychain to securely retrieve a stored password"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" *"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" as"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" Keychain "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'react-native-keychain'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getDatabasePassword"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" credentials"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" Keychain"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".getGenericPassword"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (credentials) {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" credentials"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".password;"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" throw"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" Error"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'No password stored in Keychain'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Encrypt Attachments"}),":\nIf you need to store files (images, text files, etc.), consider encrypting attachments. RxDB supports attachments that can be encrypted automatically, ensuring your files are protected:"]}),"\n"]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { createBlob } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"secureData"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" normalField"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foobar'"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"})"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"true"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" attachment"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".putAttachment"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'encryptedFile.txt'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" data"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" createBlob"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Sensitive content'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'text/plain'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'text/plain'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Optimize Performance"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"If performance is critical, consider using the premium Web Crypto plugin, which leverages native APIs for faster encryption and decryption."}),"\n",(0,i.jsx)(n.li,{children:"If big chunks of data are encrypted, store them in attachments instead of document fields. Attachments will only be decrypted on explicit fetches, not during queries."}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Use DevMode in Development"}),": RxDB's ",(0,i.jsx)(n.a,{href:"/dev-mode.html",children:"DevMode Plugin"})," can help validate your schema and encryption setup during development. Disable it in production for performance reasons."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Secure Communication"}),":"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Use HTTPS to secure network communication between the app and any backend services."}),"\n",(0,i.jsxs)(n.li,{children:["If you're synchronizing data to a server, ensure the data is also encrypted in transit. RxDB's ",(0,i.jsx)(n.a,{href:"/replication.html",children:"replication plugins"})," can work with secure endpoints to keep data consistent."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"SSL Pinning"}),": Consider SSL Pinning if you want to prevent man-in-the-middle attacks. SSL Pinning ensures the device trusts only the pinned certificate, preventing attackers from swapping out valid certificates with their own."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Learn how to use RxDB with the ",(0,i.jsx)(n.a,{href:"/quickstart.html",children:"RxDB Quickstart"})," for a guided introduction."]}),"\n",(0,i.jsxs)(n.li,{children:["A good way to learn using RxDB database with React Native is to check out the ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/react-native",children:"RxDB React Native example"})," and use that as a tutorial."]}),"\n",(0,i.jsxs)(n.li,{children:["Check out the ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb",children:"RxDB GitHub repository"})," and leave a star \u2b50 if you find it useful."]}),"\n",(0,i.jsxs)(n.li,{children:["Learn more about the ",(0,i.jsx)(n.a,{href:"/encryption.html",children:"RxDB encryption plugins"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"By following these best practices and leveraging RxDB's powerful encryption plugins, you can build secure, performant, and robust React Native applications that keep your users' data safe."})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453(e,n,s){s.d(n,{R:()=>o,x:()=>t});var r=s(6540);const i={},a=r.createContext(i);function o(e){const n=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/13dc6548.fadf8c1b.js b/docs/assets/js/13dc6548.fadf8c1b.js deleted file mode 100644 index 4a5b1af38a5..00000000000 --- a/docs/assets/js/13dc6548.fadf8c1b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[3483],{4637(e,a,t){t.r(a),t.d(a,{default:()=>r});var n=t(544),d=t(4848);function r(){return(0,n.default)({sem:{id:"gads",metaTitle:"The best Database on top of IndexedDB",title:(0,d.jsxs)(d.Fragment,{children:["The easiest way to ",(0,d.jsx)("b",{children:"store"})," and ",(0,d.jsx)("b",{children:"sync"})," Data in IndexedDB"]}),appName:"Browser",text:(0,d.jsx)(d.Fragment,{children:"Store data inside the Browsers IndexedDB to build high performance realtime applications that sync data from the backend and even work when offline."})}})}}}]); \ No newline at end of file diff --git a/docs/assets/js/14d72841.24eaace4.js b/docs/assets/js/14d72841.24eaace4.js deleted file mode 100644 index 59c16c51caf..00000000000 --- a/docs/assets/js/14d72841.24eaace4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9772],{5221(e,t,s){s.r(t),s.d(t,{default:()=>h});var l=s(4586),i=s(8711),r=s(6540),c=s(8141),n=s(4848);function h(){const{siteConfig:e}=(0,l.A)();return(0,r.useEffect)(()=>{(0,c.c)("get_newsletter",.4)}),(0,n.jsx)(i.A,{title:`Newsletter - ${e.title}`,description:"RxDB Newsletter",children:(0,n.jsx)("main",{children:(0,n.jsxs)("div",{className:"redirectBox",style:{textAlign:"center"},children:[(0,n.jsx)("a",{href:"/",children:(0,n.jsx)("div",{className:"logo",children:(0,n.jsx)("img",{src:"/files/logo/logo_text.svg",alt:"RxDB",width:160})})}),(0,n.jsx)("h1",{children:"RxDB Newsletter"}),(0,n.jsx)("p",{children:(0,n.jsx)("b",{children:"You will be redirected in a few seconds."})}),(0,n.jsx)("p",{children:(0,n.jsx)("a",{href:"http://eepurl.com/imD7WA",children:"Click here"})}),(0,n.jsx)("meta",{httpEquiv:"Refresh",content:"0; url=http://eepurl.com/imD7WA"})]})})})}}}]); \ No newline at end of file diff --git a/docs/assets/js/15f1e21f.306cc5e2.js b/docs/assets/js/15f1e21f.306cc5e2.js deleted file mode 100644 index cf75fcc4d55..00000000000 --- a/docs/assets/js/15f1e21f.306cc5e2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[970],{7990(e,a,s){s.r(a),s.d(a,{default:()=>i});var t=s(544),n=s(4848);function i(){return(0,t.default)({sem:{id:"gads",metaTitle:"The local Database for Vue.js Apps",appName:"Vue.js",title:(0,n.jsxs)(n.Fragment,{children:["The easiest way to ",(0,n.jsx)("b",{children:"store"})," and ",(0,n.jsx)("b",{children:"sync"})," Data in Vue.js"]}),text:(0,n.jsx)(n.Fragment,{children:"Store data inside of your Vue.js app to build high performance realtime applications that sync data from the backend and even work when offline."}),iconUrl:"/files/icons/vuejs.svg"}})}}}]); \ No newline at end of file diff --git a/docs/assets/js/17896441.476362fb.js b/docs/assets/js/17896441.476362fb.js deleted file mode 100644 index fbcfb103346..00000000000 --- a/docs/assets/js/17896441.476362fb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[8401],{9057(e,t,s){s.d(t,{A:()=>r});var n=s(6540),i=s(8759),a=s(3230),l=s(8601),o=s(4848);const r={...i.A,code:function(e){return void 0!==e.children&&n.Children.toArray(e.children).every(e=>"string"==typeof e&&!e.includes("\n"))?(0,o.jsx)(a.A,{...e}):(0,o.jsx)("code",{...e})},pre:l.A}},9519(e,t,s){s.r(t),s.d(t,{default:()=>fe});var n=s(6540),i=s(5500),a=s(9532),l=s(4848);const o=n.createContext(null);function r({children:e,content:t}){const s=function(e){return(0,n.useMemo)(()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc}),[e])}(t);return(0,l.jsx)(o.Provider,{value:s,children:e})}function c(){const e=(0,n.useContext)(o);if(null===e)throw new a.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:t,assets:s}=c();return(0,l.jsx)(i.be,{title:e.title,description:e.description,keywords:t.keywords,image:s.image??t.image})}var h=s(4164),u=s(4581),m=s(1312),g=s(4584);function x(e){const{permalink:t,title:s,isNext:n}=e;return(0,l.jsxs)(g.$,{style:{textAlign:n?"right":"left",justifyContent:n?"right":"left",height:"auto",paddingTop:14,paddingBottom:14},href:t,children:[(0,l.jsx)("span",{style:{fontSize:"80%",display:"contents"},children:n?"Next":"Previous"}),(0,l.jsx)("br",{}),n?"":"\xab ",s,n?" \xbb":""]})}function b(e){const{className:t,previous:s,next:n}=e;return(0,l.jsxs)("nav",{className:(0,h.A)(t,"pagination-nav"),"aria-label":(0,m.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[s&&(0,l.jsx)(x,{...s,subLabel:(0,l.jsx)(m.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,l.jsx)(x,{...n,subLabel:(0,l.jsx)(m.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function v(){const{metadata:e}=c();return(0,l.jsx)(b,{className:"docusaurus-mt-lg",previous:e.previous,next:e.next})}var p=s(4586),j=s(8774),f=s(8295),A=s(7559),y=s(3886),N=s(3025);const T={unreleased:function({siteTitle:e,versionMetadata:t}){return(0,l.jsx)(m.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:e,versionLabel:(0,l.jsx)("b",{children:t.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function({siteTitle:e,versionMetadata:t}){return(0,l.jsx)(m.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:e,versionLabel:(0,l.jsx)("b",{children:t.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function _(e){const t=T[e.versionMetadata.banner];return(0,l.jsx)(t,{...e})}function L({versionLabel:e,to:t,onClick:s}){return(0,l.jsx)(m.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:e,latestVersionLink:(0,l.jsx)("b",{children:(0,l.jsx)(j.A,{to:t,onClick:s,children:(0,l.jsx)(m.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function k({className:e,versionMetadata:t}){const{siteConfig:{title:s}}=(0,p.A)(),{pluginId:n}=(0,f.vT)({failfast:!0}),{savePreferredVersionName:i}=(0,y.g1)(n),{latestDocSuggestion:a,latestVersionSuggestion:o}=(0,f.HW)(n),r=a??(c=o).docs.find(e=>e.id===c.mainDocId);var c;return(0,l.jsxs)("div",{className:(0,h.A)(e,A.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,l.jsx)("div",{children:(0,l.jsx)(_,{siteTitle:s,versionMetadata:t})}),(0,l.jsx)("div",{className:"margin-top--md",children:(0,l.jsx)(L,{versionLabel:o.label,to:r.path,onClick:()=>i(o.name)})})]})}function C({className:e}){const t=(0,N.r)();return t.banner?(0,l.jsx)(k,{className:e,versionMetadata:t}):null}function w({className:e}){const t=(0,N.r)();return t.badge?(0,l.jsx)("span",{className:(0,h.A)(e,A.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,l.jsx)(m.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:t.label},children:"Version: {versionLabel}"})}):null}const M="tag_zVej",H="tagRegular_sFm0",V="tagWithCount_h2kH";function B({permalink:e,label:t,count:s,description:n}){return(0,l.jsxs)(j.A,{rel:"tag",href:e,title:n,className:(0,h.A)(M,s?V:H),children:[t,s&&(0,l.jsx)("span",{children:s})]})}const G="tags_jXut",I="tag_QGVx";function R({tags:e}){return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("b",{children:(0,l.jsx)(m.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,l.jsx)("ul",{className:(0,h.A)(G,"padding--none","margin-left--sm"),children:e.map(e=>(0,l.jsx)("li",{className:I,children:(0,l.jsx)(B,{...e})},e.permalink))})]})}var F=s(2153);function S(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:s,lastUpdatedBy:n,tags:i}=e,a=i.length>0,o=!!(t||s||n);return a||o?(0,l.jsxs)("footer",{className:(0,h.A)(A.G.docs.docFooter,"docusaurus-mt-lg"),children:[a&&(0,l.jsx)("div",{className:(0,h.A)("row margin-top--sm",A.G.docs.docFooterTagsRow),children:(0,l.jsx)("div",{className:"col",children:(0,l.jsx)(R,{tags:i})})}),o&&(0,l.jsx)(F.A,{className:(0,h.A)("margin-top--sm",A.G.docs.docFooterEditMetaRow),editUrl:t,lastUpdatedAt:s,lastUpdatedBy:n})]}):null}var z=s(1422),E=s(5195);const U="tocCollapsibleButton_TO0P",D="tocCollapsibleButtonExpanded_MG3E";function O({collapsed:e,...t}){return(0,l.jsx)("button",{type:"button",...t,className:(0,h.A)("clean-btn",U,!e&&D,t.className),children:(0,l.jsx)(m.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const P="tocCollapsible_ETCw",W="tocCollapsibleContent_vkbj",$="tocCollapsibleExpanded_sAul";function J({toc:e,className:t,minHeadingLevel:s,maxHeadingLevel:n}){const{collapsed:i,toggleCollapsed:a}=(0,z.u)({initialState:!0});return(0,l.jsxs)("div",{className:(0,h.A)(P,!i&&$,t),children:[(0,l.jsx)(O,{collapsed:i,onClick:a}),(0,l.jsx)(z.N,{lazy:!0,className:W,collapsed:i,children:(0,l.jsx)(E.A,{toc:e,minHeadingLevel:s,maxHeadingLevel:n})})]})}const q="tocMobile_ITEo";function Q(){const{toc:e,frontMatter:t}=c();return(0,l.jsx)(J,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,h.A)(A.G.docs.docTocMobile,q)})}var X=s(7763);function Y(){const{toc:e,frontMatter:t}=c();return(0,l.jsx)(X.A,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:A.G.docs.docTocDesktop})}var Z=s(1107),K=s(7910);function ee({children:e}){const t=function(){const{metadata:e,frontMatter:t,contentTitle:s}=c();return t.hide_title||void 0!==s?null:e.title}();return(0,l.jsxs)("div",{className:(0,h.A)(A.G.docs.docMarkdown,"markdown"),children:[t&&(0,l.jsx)("header",{children:(0,l.jsx)(Z.A,{as:"h1",children:t})}),(0,l.jsx)(K.A,{children:e})]})}var te=s(4718),se=s(9169),ne=s(6025);function ie(e){return(0,l.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,l.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const ae="breadcrumbHomeIcon_YNFT";function le(){const e=(0,ne.Ay)("/");return(0,l.jsx)("li",{className:"breadcrumbs__item",children:(0,l.jsx)(j.A,{"aria-label":(0,m.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,l.jsx)(ie,{className:ae})})})}var oe=s(5260);function re(e){const t=function({breadcrumbs:e}){const{siteConfig:t}=(0,p.A)();return{"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:e.filter(e=>e.href).map((e,s)=>({"@type":"ListItem",position:s+1,name:e.label,item:`${t.url}${e.href}`}))}}({breadcrumbs:e.breadcrumbs});return(0,l.jsx)(oe.A,{children:(0,l.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}const ce="breadcrumbsContainer_Z_bl";function de({children:e,href:t,isLast:s}){const n="breadcrumbs__link";return s?(0,l.jsx)("span",{className:n,children:e}):t?(0,l.jsx)(j.A,{className:n,href:t,children:(0,l.jsx)("span",{children:e})}):(0,l.jsx)("span",{className:n,children:e})}function he({children:e,active:t}){return(0,l.jsx)("li",{className:(0,h.A)("breadcrumbs__item",{"breadcrumbs__item--active":t}),children:e})}function ue(){const e=(0,te.OF)(),t=(0,se.Dt)();return e?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(re,{breadcrumbs:e}),(0,l.jsx)("nav",{className:(0,h.A)(A.G.docs.docBreadcrumbs,ce),"aria-label":(0,m.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,l.jsxs)("ul",{className:"breadcrumbs",children:[t&&(0,l.jsx)(le,{}),e.map((t,s)=>{const n=s===e.length-1,i="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,l.jsx)(he,{active:n,children:(0,l.jsx)(de,{href:i,isLast:n,children:t.label})},s)})]})})]}):null}var me=s(6896);const ge="docItemContainer_c0TR",xe="docItemCol_z5aJ";var be=s(8141),ve=s(7810);function pe(e){const[t,s]=(0,n.useState)(!1),i={ul:{marginTop:25,listStyleType:"none"},li:{lineHeight:4,color:"var(--expo-theme-text-secondary)"},a:{color:"var(--fontColor-offwhite)"},img:{paddingRight:16,height:18,verticalAlign:"middle"},vote:{borderRadius:3,borderColor:"var(--fontColor-offwhite)",borderStyle:"solid",borderWidth:1,verticalAlign:"middle",padding:5,paddingLeft:8,paddingRight:8,textAlign:"center",justifyContent:"center",display:"inline-flex",marginLeft:20,cursor:"pointer"},down:{transform:"scale(1, -1)"},heart:{color:"var(--color-top)",display:"inline-block",transform:"scale(2)",paddingLeft:10}};let a=e.children.type.frontMatter.title?e.children.type.frontMatter.title:"";e.children.type.contentTitle&&e.children.type.contentTitle.length23){a=a.slice(0,23);const e=a.split(" ");e.pop(),a=e.join(" ")+"..."}function o(t){const n=e.children.type.metadata.slug,i="vote_"+(0,ve.dG)(n.split("/"))+"_"+t;console.log("vote: "+i),(0,be.c)(i,.1,1),s(!0)}return(0,l.jsxs)("ul",{style:i.ul,children:[t?(0,l.jsxs)("li",{style:i.li,children:["Thank you for your vote! ",(0,l.jsx)("div",{style:i.heart,children:"\u2665"})]}):(0,l.jsxs)("li",{style:i.li,children:["Was this page helpful?",(0,l.jsx)("div",{style:i.vote,children:(0,l.jsx)("img",{src:"/img/thumbs-up-white.svg",loading:"lazy",height:"14",onClick:()=>o("up")})}),(0,l.jsx)("div",{style:{...i.vote,...i.down},children:(0,l.jsx)("img",{src:"/img/thumbs-up-white.svg",loading:"lazy",height:"14",onClick:()=>o("down")})})]}),(0,l.jsx)("li",{children:(0,l.jsxs)("a",{href:"/chat/",target:"_blank",style:i.a,children:[(0,l.jsx)("img",{src:"/img/community-links/discord-logo.svg",style:i.img,loading:"lazy"}),"Ask a question on the forums about ",a]})})]})}function je(e){const t=function(){const{frontMatter:e,toc:t}=c(),s=(0,u.l)(),n=e.hide_table_of_contents,i=!n&&t.length>0;return{hidden:n,mobile:i?(0,l.jsx)(Q,{}):void 0,desktop:!i||"desktop"!==s&&"ssr"!==s?void 0:(0,l.jsx)(Y,{})}}(),{metadata:s}=c();return(0,l.jsxs)("div",{className:"row",children:[(0,l.jsxs)("div",{className:(0,h.A)("col",!t.hidden&&xe),children:[(0,l.jsx)(me.A,{metadata:s}),(0,l.jsx)(C,{}),(0,l.jsxs)("div",{className:ge,children:[(0,l.jsxs)("article",{children:[(0,l.jsx)(ue,{}),(0,l.jsx)(w,{}),t.mobile,(0,l.jsx)(ee,{children:e.children}),(0,l.jsx)(S,{})]}),(0,l.jsx)(pe,{...e}),(0,l.jsx)(v,{})]})]}),t.desktop&&(0,l.jsx)("div",{className:"col col--3",children:t.desktop})]})}function fe(e){const t=`docs-doc-id-${e.content.metadata.id}`,s=e.content;return(0,l.jsx)(r,{content:e.content,children:(0,l.jsxs)(i.e3,{className:t,children:[(0,l.jsx)(d,{}),(0,l.jsx)(je,{children:(0,l.jsx)(s,{})})]})})}}}]); \ No newline at end of file diff --git a/docs/assets/js/187b985e.4ee7b6e5.js b/docs/assets/js/187b985e.4ee7b6e5.js deleted file mode 100644 index 845858d6319..00000000000 --- a/docs/assets/js/187b985e.4ee7b6e5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[6866],{3247(e,n,s){s.d(n,{g:()=>i});var r=s(4848);function i(e){const n=[];let s=null;return e.children.forEach(e=>{e.props.id?(s&&n.push(s),s={headline:e,paragraphs:[]}):s&&s.paragraphs.push(e)}),s&&n.push(s),(0,r.jsx)("div",{style:o.stepsContainer,children:n.map((e,n)=>(0,r.jsxs)("div",{style:o.stepWrapper,children:[(0,r.jsxs)("div",{style:o.stepIndicator,children:[(0,r.jsx)("div",{style:o.stepNumber,children:n+1}),(0,r.jsx)("div",{style:o.verticalLine})]}),(0,r.jsxs)("div",{style:o.stepContent,children:[(0,r.jsx)("div",{children:e.headline}),e.paragraphs.map((e,n)=>(0,r.jsx)("div",{style:o.item,children:e},n))]})]},n))})}const o={stepsContainer:{display:"flex",flexDirection:"column"},stepWrapper:{display:"flex",alignItems:"stretch",marginBottom:"1.5rem",position:"relative",minWidth:0},stepIndicator:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",width:"33px",marginRight:"1rem",minWidth:0},stepNumber:{width:"33px",height:"33px",borderRadius:"50%",backgroundColor:"var(--color-top)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:"bold",marginTop:-4},verticalLine:{position:"absolute",top:29,bottom:"0",left:"50%",width:"1px",background:"linear-gradient(to bottom, var(--color-top) 0%, var(--color-top) 80%, rgba(0,0,0,0) 100%)",transform:"translateX(-50%)"},stepContent:{flex:1,minWidth:0,overflowWrap:"break-word"},item:{marginTop:"0.5rem"}}},8243(e,n,s){s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>t,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"replication-webrtc","title":"WebRTC P2P Replication with RxDB - Sync Browsers and Devices","description":"Learn to set up peer-to-peer WebRTC replication with RxDB. Bypass central servers and enjoy secure, low-latency data sync across all clients.","source":"@site/docs/replication-webrtc.md","sourceDirName":".","slug":"/replication-webrtc.html","permalink":"/replication-webrtc.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"WebRTC P2P Replication with RxDB - Sync Browsers and Devices","slug":"replication-webrtc.html","description":"Learn to set up peer-to-peer WebRTC replication with RxDB. Bypass central servers and enjoy secure, low-latency data sync across all clients."},"sidebar":"tutorialSidebar","previous":{"title":"CouchDB Replication","permalink":"/replication-couchdb.html"},"next":{"title":"Firestore Replication","permalink":"/replication-firestore.html"}}');var i=s(4848),o=s(8453),a=s(3247);const t={title:"WebRTC P2P Replication with RxDB - Sync Browsers and Devices",slug:"replication-webrtc.html",description:"Learn to set up peer-to-peer WebRTC replication with RxDB. Bypass central servers and enjoy secure, low-latency data sync across all clients."},l="P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript",c={},d=[{value:"What is WebRTC?",id:"what-is-webrtc",level:2},{value:"Benefits of P2P Sync with WebRTC Compared to Client-Server Architecture",id:"benefits-of-p2p-sync-with-webrtc-compared-to-client-server-architecture",level:2},{value:"Peer-to-Peer (P2P) WebRTC Replication with the RxDB JavaScript Database",id:"peer-to-peer-p2p-webrtc-replication-with-the-rxdb-javascript-database",level:2},{value:"Using RxDB with the WebRTC Replication Plugin",id:"using-rxdb-with-the-webrtc-replication-plugin",level:2},{value:"Create the Database and Collection",id:"create-the-database-and-collection",level:3},{value:"Import the WebRTC replication plugin",id:"import-the-webrtc-replication-plugin",level:3},{value:"Start the P2P replication",id:"start-the-p2p-replication",level:3},{value:"Observe Errors",id:"observe-errors",level:3},{value:"Stop the Replication",id:"stop-the-replication",level:3},{value:"Live replications",id:"live-replications",level:2},{value:"Signaling Server",id:"signaling-server",level:2},{value:"Peer Validation",id:"peer-validation",level:2},{value:"Conflict detection in WebRTC replication",id:"conflict-detection-in-webrtc-replication",level:2},{value:"Known problems",id:"known-problems",level:2},{value:"SimplePeer requires to have process.nextTick()",id:"simplepeer-requires-to-have-processnexttick",level:3},{value:"Polyfill the WebSocket and WebRTC API in Node.js",id:"polyfill-the-websocket-and-webrtc-api-in-nodejs",level:3},{value:"Storing replicated data encrypted on client device",id:"storing-replicated-data-encrypted-on-client-device",level:2},{value:"Follow Up",id:"follow-up",level:2}];function h(e){const n={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"p2p-webrtc-replication-with-rxdb---sync-data-between-browsers-and-devices-in-javascript",children:"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript"})}),"\n",(0,i.jsxs)(n.p,{children:["WebRTC P2P data connections are revolutionizing real-time web and mobile development by ",(0,i.jsx)(n.strong,{children:"eliminating central servers"})," in scenarios where clients can communicate directly. With the ",(0,i.jsx)(n.strong,{children:"RxDB"})," ",(0,i.jsx)(n.a,{href:"/replication.html",children:"Sync Engine"}),", you can sync your local database state across multiple browsers or devices via ",(0,i.jsx)(n.strong,{children:"WebRTC P2P (Peer-to-Peer)"})," connections, ensuring scalable, secure, and ",(0,i.jsx)(n.strong,{children:"low-latency"})," data flows without traditional server bottlenecks."]}),"\n",(0,i.jsx)(n.h2,{id:"what-is-webrtc",children:"What is WebRTC?"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API",children:"WebRTC"})," stands for Web ",(0,i.jsx)(n.a,{href:"/articles/realtime-database.html",children:"Real-Time"})," Communication. It is an open standard that enables browsers and native apps to exchange audio, video, or ",(0,i.jsx)(n.strong,{children:"arbitrary data"})," directly between peers, bypassing a central server after the initial connection is established. WebRTC uses NAT traversal techniques like ",(0,i.jsx)(n.a,{href:"https://developer.liveswitch.io/liveswitch-server/guides/what-are-stun-turn-and-ice.html",children:"ICE"})," (Interactive Connectivity Establishment) to punch through firewalls and establish direct links. This peer-to-peer nature drastically reduces latency while maintaining ",(0,i.jsx)(n.strong,{children:"high security"})," and ",(0,i.jsx)(n.strong,{children:"end-to-end encryption"})," capabilities."]}),"\n",(0,i.jsxs)(n.p,{children:["For a deeper look at comparing WebRTC with ",(0,i.jsx)(n.strong,{children:"WebSockets"})," and ",(0,i.jsx)(n.strong,{children:"WebTransport"}),", you can read our ",(0,i.jsx)(n.a,{href:"/articles/websockets-sse-polling-webrtc-webtransport.html",children:"comprehensive overview"}),". While WebSockets or WebTransport often work in client-server contexts, WebRTC offers direct peer-to-peer connections ideal for fully decentralized data flows."]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://webrtc.org/",target:"_blank",children:(0,i.jsx)("img",{src:"/files/icons/webrtc.svg",alt:"WebRTC",width:"80"})})}),"\n",(0,i.jsx)(n.h2,{id:"benefits-of-p2p-sync-with-webrtc-compared-to-client-server-architecture",children:"Benefits of P2P Sync with WebRTC Compared to Client-Server Architecture"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reduced Latency"})," - By skipping a central server hop, data travels directly from one client to another, minimizing round-trip times and improving responsiveness."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Scalability"})," - New peers can join without overloading a central infrastructure. The sync overhead increases linearly with the number of connections rather than requiring a massive server cluster."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Privacy & Ownership"})," - Data stays within the user\u2019s devices, avoiding risks tied to storing data on third-party servers. This design aligns well with ",(0,i.jsx)(n.a,{href:"/articles/local-first-future.html",children:"local-first"}),' or "',(0,i.jsx)(n.a,{href:"/articles/zero-latency-local-first.html",children:"zero-latency"}),'" apps.']}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Resilience"})," - In some scenarios, if the central server is unreachable, P2P connections remain operational (assuming a functioning signaling path). Apps can still replicate data among local networks like when they are in the same Wifi or LAN."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Cost Savings"})," - Reducing the reliance on a high-bandwidth server can cut hosting and bandwidth expenses, particularly in high-traffic or IoT-style use cases."]}),"\n"]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"/files/logo/rxdb_javascript_database.svg",alt:"JavaScript Embedded Database",width:"220"})})}),"\n",(0,i.jsx)(n.h2,{id:"peer-to-peer-p2p-webrtc-replication-with-the-rxdb-javascript-database",children:"Peer-to-Peer (P2P) WebRTC Replication with the RxDB JavaScript Database"}),"\n",(0,i.jsxs)(n.p,{children:["Traditionally, real-time data synchronization depends on ",(0,i.jsx)(n.strong,{children:"centralized servers"})," to manage and distribute updates. In contrast, RxDB\u2019s WebRTC P2P replication allows data to flow ",(0,i.jsx)(n.strong,{children:"directly"})," among clients, removing the server as a data store. This approach is ",(0,i.jsx)(n.strong,{children:"live"})," and ",(0,i.jsx)(n.strong,{children:"fully decentralized"}),", requiring only a ",(0,i.jsx)(n.a,{href:"#signaling-server",children:"signaling server"})," for initial discovery:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"No master-slave"})," concept - each peer hosts its own local RxDB."]}),"\n",(0,i.jsxs)(n.li,{children:["Clients (",(0,i.jsx)(n.a,{href:"/articles/browser-database.html",children:"browsers"}),", devices) connect to each other via WebRTC data channels."]}),"\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.a,{href:"/replication.html",children:"RxDB replication protocol"})," then handles pushing/pulling document changes across peers."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Because RxDB is a NoSQL database and the replication protocol is straightforward, setting up robust P2P sync is far ",(0,i.jsx)(n.strong,{children:"easier"})," than orchestrating a complex client-server database architecture."]}),"\n",(0,i.jsx)(n.h2,{id:"using-rxdb-with-the-webrtc-replication-plugin",children:"Using RxDB with the WebRTC Replication Plugin"}),"\n",(0,i.jsxs)(n.p,{children:["Before you use this plugin, make sure that you understand how ",(0,i.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API",children:"WebRTC works"}),". Here we build a todo-app that replicates todo-entries between clients:"]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"https://github.com/pubkey/rxdb-quickstart/raw/master/files/p2p-todo-demo.gif",alt:"JavaScript Embedded Database",width:"500"})})}),"\n",(0,i.jsxs)(n.p,{children:["You can find a fully build example of this at the ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb-quickstart",children:"RxDB Quickstart Repository"})," which you can also ",(0,i.jsx)(n.a,{href:"https://pubkey.github.io/rxdb-quickstart/",children:"try out online"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Four you create the ",(0,i.jsx)(n.a,{href:"/rx-database.html",children:"database"})," and then you can configure the replication:"]}),"\n",(0,i.jsxs)(a.g,{children:[(0,i.jsx)(n.h3,{id:"create-the-database-and-collection",children:"Create the Database and Collection"}),(0,i.jsxs)(n.p,{children:["Here we create a database with the ",(0,i.jsx)(n.a,{href:"/rx-storage-localstorage.html",children:"localstorage"})," based storage that stores data inside of the ",(0,i.jsx)(n.a,{href:"/articles/localstorage.html",children:"LocalStorage API"})," in a browser. RxDB has a wide ",(0,i.jsx)(n.a,{href:"/rx-storage.html",children:"range of storages"})," for other JavaScript runtimes."]}),(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myTodoDB'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" todos"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'todo schema'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" done"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'boolean'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" default"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" created"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" format"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'date-time'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'id'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'title'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'done'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// insert an example document"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"todos"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'todo-1'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'P2P demo task'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" done"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" created"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" Date"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".toISOString"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(n.h3,{id:"import-the-webrtc-replication-plugin",children:"Import the WebRTC replication plugin"}),(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" replicateWebRTC"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" getConnectionHandlerSimplePeer"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication-webrtc'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]})]})})}),(0,i.jsx)(n.h3,{id:"start-the-p2p-replication",children:"Start the P2P replication"}),(0,i.jsxs)(n.p,{children:["To start the replication you have to call ",(0,i.jsx)(n.code,{children:"replicateWebRTC"})," on the ",(0,i.jsx)(n.a,{href:"/rx-collection.html",children:"collection"}),"."]}),(0,i.jsxs)(n.p,{children:["As options you have to provide a ",(0,i.jsx)(n.code,{children:"topic"})," and a connection handler function that implements the ",(0,i.jsx)(n.code,{children:"P2PConnectionHandlerCreator"})," interface. As default you should start with the ",(0,i.jsx)(n.code,{children:"getConnectionHandlerSimplePeer"})," method which uses the ",(0,i.jsx)(n.a,{href:"https://github.com/feross/simple-peer",children:"simple-peer"})," library and comes shipped with RxDB."]}),(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationPool"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateWebRTC"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Start the replication for a single collection"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".todos"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // The topic is like a 'room-name'. All clients with the same topic"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // will replicate with each other. In most cases you want to use"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // a different topic string per user. Also you should prefix the topic with"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // a unique identifier for your app, to ensure you do not let your users connect"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // with other apps that also use the RxDB P2P Replication."})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" topic"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-users-pool'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * You need a collection handler to be able to create WebRTC connections."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Here we use the simple peer handler which uses the 'simple-peer' npm library."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * To learn how to create a custom connection handler, read the source code,"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * it is pretty simple."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" connectionHandlerCreator"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getConnectionHandlerSimplePeer"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Set the signaling server url."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // You can use the server provided by RxDB for tryouts,"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // but in production you should use your own server instead."})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" signalingServerUrl"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'wss://signaling.rxdb.info/'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // only in Node.js, we need the wrtc library"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // because Node.js does not contain the WebRTC API."})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" wrtc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'node-datachannel/polyfill'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // only in Node.js, we need the WebSocket library"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // because Node.js does not contain the WebSocket API."})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" webSocketConstructor"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'ws'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:").WebSocket"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" })"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {}"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),(0,i.jsxs)(n.p,{children:["Notice that in difference to the other ",(0,i.jsx)(n.a,{href:"/replication.html",children:"replication plugins"}),", the WebRTC replication returns a ",(0,i.jsx)(n.code,{children:"replicationPool"})," instead of a single ",(0,i.jsx)(n.code,{children:"RxReplicationState"}),". The ",(0,i.jsx)(n.code,{children:"replicationPool"})," contains all replication states of the connected peers in the P2P network."]}),(0,i.jsx)(n.h3,{id:"observe-errors",children:"Observe Errors"}),(0,i.jsxs)(n.p,{children:["To ensure we log out potential errors, observe the ",(0,i.jsx)(n.code,{children:"error$"})," observable of the pool."]}),(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsx)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"replicationPool"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"error$"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(err "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".error"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'WebRTC Error:'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" err));"})]})})})}),(0,i.jsx)(n.h3,{id:"stop-the-replication",children:"Stop the Replication"}),(0,i.jsx)(n.p,{children:"You can also dynamically stop the replication."}),(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsx)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"replicationPool"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".cancel"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})})})})]}),"\n",(0,i.jsx)(n.h2,{id:"live-replications",children:"Live replications"}),"\n",(0,i.jsxs)(n.p,{children:["The WebRTC replication is ",(0,i.jsx)(n.strong,{children:"always live"})," because there can not be a one-time sync when it is always possible to have new Peers that join the connection pool. Therefore you cannot set the ",(0,i.jsx)(n.code,{children:"live: false"})," option like in the other replication plugins."]}),"\n",(0,i.jsx)(n.h2,{id:"signaling-server",children:"Signaling Server"}),"\n",(0,i.jsxs)(n.p,{children:["For P2P replication to work with the RxDB WebRTC Replication Plugin, a ",(0,i.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Signaling_and_video_calling",children:"signaling server"})," is required. The signaling server helps peers discover each other and establish connections."]}),"\n",(0,i.jsx)(n.p,{children:"RxDB ships with a default signaling server that can be used with the simple-peer connection handler. This server is made for demonstration purposes and tryouts. It is not reliable and might be offline at any time.\nIn production you must always use your own signaling server instead!"}),"\n",(0,i.jsx)(n.p,{children:"Creating a basic signaling server is straightforward. The provided example uses 'socket.io' for WebSocket communication. However, in production, you'd want to create a more robust signaling server with authentication and additional logic to suit your application's needs."}),"\n",(0,i.jsxs)(n.p,{children:["Here is a quick example implementation of a signaling server that can be used with the connection handler from ",(0,i.jsx)(n.code,{children:"getConnectionHandlerSimplePeer()"}),":"]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" startSignalingServerSimplePeer"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication-webrtc'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" serverState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" startSignalingServerSimplePeer"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" port"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 8080"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- port"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(n.p,{children:["For custom signaling servers with more complex logic, you can check the ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/blob/master/src/plugins/replication-webrtc/signaling-server.ts",children:"source code of the default one"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"peer-validation",children:"Peer Validation"}),"\n",(0,i.jsxs)(n.p,{children:["By default the replication will replicate with every peer the signaling server tells them about.\nYou can prevent invalid peers from replication by passing a custom ",(0,i.jsx)(n.code,{children:"isPeerValid()"})," function that either returns ",(0,i.jsx)(n.code,{children:"true"})," on valid peers and ",(0,i.jsx)(n.code,{children:"false"})," on invalid peers."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationPool"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateWebRTC"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" isPeerValid"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (peer) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull: {}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {}"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,i.jsx)(n.h2,{id:"conflict-detection-in-webrtc-replication",children:"Conflict detection in WebRTC replication"}),"\n",(0,i.jsxs)(n.p,{children:["RxDB's conflict handling works by detecting and resolving conflicts that may arise when multiple clients in a decentralized database system attempt to modify the same data concurrently.\nA ",(0,i.jsx)(n.strong,{children:"custom conflict handler"})," can be set up, which is a plain JavaScript function. The conflict handler is run on each replicated document write and resolves the conflict if required. ",(0,i.jsx)(n.a,{href:"https://rxdb.info/transactions-conflicts-revisions.html",children:"Find out more about RxDB conflict handling here"})]}),"\n",(0,i.jsx)(n.h2,{id:"known-problems",children:"Known problems"}),"\n",(0,i.jsxs)(n.h3,{id:"simplepeer-requires-to-have-processnexttick",children:["SimplePeer requires to have ",(0,i.jsx)(n.code,{children:"process.nextTick()"})]}),"\n",(0,i.jsxs)(n.p,{children:["In the browser you might not have a process variable or process.nextTick() method. But the ",(0,i.jsx)(n.a,{href:"https://github.com/feross/simple-peer",children:"simple peer"})," uses that so you have to polyfill it."]}),"\n",(0,i.jsxs)(n.p,{children:["In webpack you can use the ",(0,i.jsx)(n.code,{children:"process/browser"})," package to polyfill it:"]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" plugins"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" webpack"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".ProvidePlugin"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" process"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'process/browser'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"];"})})]})})}),"\n",(0,i.jsx)(n.p,{children:"In angular or other libraries you can add the polyfill manually:"}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"window"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".process "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" nextTick"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (fn"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ..."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"args) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" setTimeout"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(() "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" fn"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"..."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"args))"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "})]})})}),"\n",(0,i.jsx)(n.h3,{id:"polyfill-the-websocket-and-webrtc-api-in-nodejs",children:"Polyfill the WebSocket and WebRTC API in Node.js"}),"\n",(0,i.jsxs)(n.p,{children:["While all modern browsers support the WebRTC and WebSocket APIs, they is missing in Node.js which will throw the error ",(0,i.jsx)(n.code,{children:"No WebRTC support: Specify opts.wrtc option in this environment"}),". Therefore you have to polyfill it with a compatible WebRTC and WebSocket polyfill. It is recommended to use the ",(0,i.jsx)(n.a,{href:"https://github.com/murat-dogan/node-datachannel/tree/master/src/polyfill",children:"node-datachannel package"})," for WebRTC which ",(0,i.jsx)(n.strong,{children:"does not"})," come with RxDB but has to be installed before via ",(0,i.jsx)(n.code,{children:"npm install node-datachannel --save"}),".\nFor the Websocket API use the ",(0,i.jsx)(n.code,{children:"ws"})," package that is included into RxDB."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" nodeDatachannelPolyfill "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'node-datachannel/polyfill'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { WebSocket } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'ws'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationPool"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateWebRTC"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" connectionHandlerCreator"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getConnectionHandlerSimplePeer"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" signalingServerUrl"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'wss://example.com:8080'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" wrtc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" nodeDatachannelPolyfill"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" webSocketConstructor"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" WebSocket"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" })"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {}"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,i.jsx)(n.h2,{id:"storing-replicated-data-encrypted-on-client-device",children:"Storing replicated data encrypted on client device"}),"\n",(0,i.jsxs)(n.p,{children:["Storing replicated data encrypted on client devices using the RxDB Encryption Plugin is a pivotal step towards bolstering ",(0,i.jsx)(n.strong,{children:"data security"})," and ",(0,i.jsx)(n.strong,{children:"user privacy"}),".\nThe WebRTC replication plugin seamlessly integrates with the ",(0,i.jsx)(n.a,{href:"/encryption.html",children:"RxDB encryption plugins"}),", providing a robust solution for encrypting sensitive information before it's stored locally. By doing so, it ensures that even if unauthorized access to the device occurs, the data remains protected and unintelligible without the encryption key (or password). This approach is particularly vital in scenarios where user-generated content or confidential data is replicated across devices, as it empowers users with control over their own data while adhering to stringent security standards. ",(0,i.jsx)(n.a,{href:"/encryption.html",children:"Read more about the encryption plugins here"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsxs)(n.strong,{children:["Check out the ",(0,i.jsx)(n.a,{href:"/quickstart.html",children:"RxDB Quickstart"})]})," to see how to set up your first RxDB database."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Explore advanced features"})," like ",(0,i.jsx)(n.a,{href:"/transactions-conflicts-revisions.html",children:"Custom Conflict Handling"})," or ",(0,i.jsx)(n.a,{href:"/rx-storage-performance.html",children:"Offline-First Performance"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Try an example"})," at ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb-quickstart",children:"RxDB Quickstart GitHub"})," to see a working P2P Sync setup."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Join the RxDB Community"})," on ",(0,i.jsx)(n.a,{href:"/code/",children:"GitHub"})," or ",(0,i.jsx)(n.a,{href:"/chat/",children:"Discord"})," if you have questions or want to share your P2P WebRTC experiences."]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453(e,n,s){s.d(n,{R:()=>a,x:()=>t});var r=s(6540);const i={},o=r.createContext(i);function a(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/1b0f8c91.21118c24.js b/docs/assets/js/1b0f8c91.21118c24.js deleted file mode 100644 index 6d238854674..00000000000 --- a/docs/assets/js/1b0f8c91.21118c24.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[3129],{5787(e,n,s){s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>t,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"backup","title":"Backup","description":"Easily back up your RxDB database to JSON files and attachments on the filesystem with the Backup Plugin - ensuring reliable Node.js data protection.","source":"@site/docs/backup.md","sourceDirName":".","slug":"/backup.html","permalink":"/backup.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Backup","slug":"backup.html","description":"Easily back up your RxDB database to JSON files and attachments on the filesystem with the Backup Plugin - ensuring reliable Node.js data protection."},"sidebar":"tutorialSidebar","previous":{"title":"Cleanup","permalink":"/cleanup.html"},"next":{"title":"Leader Election","permalink":"/leader-election.html"}}');var a=s(4848),r=s(8453);const t={title:"Backup",slug:"backup.html",description:"Easily back up your RxDB database to JSON files and attachments on the filesystem with the Backup Plugin - ensuring reliable Node.js data protection."},o="\ud83d\udce5 Backup Plugin",l={},c=[{value:"Installation",id:"installation",level:2},{value:"one-time backup",id:"one-time-backup",level:2},{value:"live backup",id:"live-backup",level:2},{value:"writeEvents$",id:"writeevents",level:2},{value:"Limitations",id:"limitations",level:2}];function d(e){const n={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"-backup-plugin",children:"\ud83d\udce5 Backup Plugin"})}),"\n",(0,a.jsx)(n.p,{children:"With the backup plugin you can write the current database state and ongoing changes into folders on the filesystem.\nThe files are written in plain json together with their attachments so that you can read them out with any software or tools, without being bound to RxDB."}),"\n",(0,a.jsx)(n.p,{children:"This is useful to:"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"Consume the database content with other software that cannot replicate with RxDB"}),"\n",(0,a.jsx)(n.li,{children:"Write a backup of the database to a remote server by mounting the backup folder on the other server."}),"\n"]}),"\n",(0,a.jsxs)(n.p,{children:["The backup plugin works only in node.js, not in a browser. It is intended to have a backup strategy when using RxDB on the server side like with the ",(0,a.jsx)(n.a,{href:"/rx-server.html",children:"RxServer"}),". To run backups on the client side, you should use one of the ",(0,a.jsx)(n.a,{href:"/replication.html",children:"replication"})," plugins instead."]}),"\n",(0,a.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,a.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(n.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { addRxPlugin } "}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { RxDBBackupPlugin } "}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/backup'"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"addRxPlugin"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(RxDBBackupPlugin);"})]})]})})}),"\n",(0,a.jsx)(n.h2,{id:"one-time-backup",children:"one-time backup"}),"\n",(0,a.jsxs)(n.p,{children:["Write the whole database to the filesystem ",(0,a.jsx)(n.strong,{children:"once"}),".\nWhen called multiple times, it will continue from the last checkpoint and not start all over again."]}),"\n",(0,a.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(n.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" backupOptions"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // if false, a one-time backup will be written"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" live"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // the folder where the backup will be stored"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" directory"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '/my-backup-folder/'"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // if true, attachments will also be saved"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" attachments"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" backupState"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".backup"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(backupOptions);"})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" backupState"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".awaitInitialBackup"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// call again to run from the last checkpoint"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" backupState2"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".backup"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(backupOptions);"})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" backupState2"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".awaitInitialBackup"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),"\n",(0,a.jsx)(n.h2,{id:"live-backup",children:"live backup"}),"\n",(0,a.jsxs)(n.p,{children:["When ",(0,a.jsx)(n.code,{children:"live: true"})," is set, the backup will write all ongoing changes to the backup directory."]}),"\n",(0,a.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(n.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" backupOptions"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // set live: true to have an ongoing backup"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" live"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" directory"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '/my-backup-folder/'"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" attachments"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" backupState"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".backup"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(backupOptions);"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// you can still await the initial backup write, but further changes will still be processed."})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" backupState"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".awaitInitialBackup"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),"\n",(0,a.jsx)(n.h2,{id:"writeevents",children:"writeEvents$"}),"\n",(0,a.jsxs)(n.p,{children:["You can listen to the ",(0,a.jsx)(n.code,{children:"writeEvents$"})," Observable to get notified about written backup files."]}),"\n",(0,a.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(n.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" backupOptions"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" live"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" directory"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '/my-backup-folder/'"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" attachments"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" backupState"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".backup"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(backupOptions);"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" subscription"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" backupState"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"writeEvents$"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(writeEvent "}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(writeEvent));"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/*"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"> {"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" collectionName: 'humans',"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" documentId: 'foobar',"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" files: ["})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" '/my-backup-folder/foobar/document.json'"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" ],"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" deleted: false"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"}"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"*/"})})]})})}),"\n",(0,a.jsx)(n.h2,{id:"limitations",children:"Limitations"}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsx)(n.li,{children:"It is currently not possible to import from a written backup. If you need this functionality, please make a pull request."}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453(e,n,s){s.d(n,{R:()=>t,x:()=>o});var i=s(6540);const a={},r=i.createContext(a);function t(e){const n=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/1b238727.c81ff6e0.js b/docs/assets/js/1b238727.c81ff6e0.js deleted file mode 100644 index c8cb9a1792a..00000000000 --- a/docs/assets/js/1b238727.c81ff6e0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[4013],{2493(e,r,s){s.r(r),s.d(r,{assets:()=>c,contentTitle:()=>i,default:()=>m,frontMatter:()=>a,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"rx-storage-performance","title":"\ud83d\udcc8 Discover RxDB Storage Benchmarks","description":"Explore real-world benchmarks comparing RxDB\'s persistent and semi-persistent storages. Discover which storage option delivers the fastest performance.","source":"@site/docs/rx-storage-performance.md","sourceDirName":".","slug":"/rx-storage-performance.html","permalink":"/rx-storage-performance.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"\ud83d\udcc8 Discover RxDB Storage Benchmarks","slug":"rx-storage-performance.html","description":"Explore real-world benchmarks comparing RxDB\'s persistent and semi-persistent storages. Discover which storage option delivers the fastest performance."},"sidebar":"tutorialSidebar","previous":{"title":"React","permalink":"/react.html"},"next":{"title":"NoSQL Performance Tips","permalink":"/nosql-performance-tips.html"}}');var n=s(4848),o=s(8453);const a={title:"\ud83d\udcc8 Discover RxDB Storage Benchmarks",slug:"rx-storage-performance.html",description:"Explore real-world benchmarks comparing RxDB's persistent and semi-persistent storages. Discover which storage option delivers the fastest performance."},i=void 0,c={},l=[{value:"RxStorage Performance comparison",id:"rxstorage-performance-comparison",level:2},{value:"Persistent vs Semi-Persistent storages",id:"persistent-vs-semi-persistent-storages",level:2},{value:"Performance comparison",id:"performance-comparison",level:2},{value:"Measurements",id:"measurements",level:3},{value:"Browser based Storages Performance Comparison",id:"browser-based-storages-performance-comparison",level:2},{value:"Node/Native based Storages Performance Comparison",id:"nodenative-based-storages-performance-comparison",level:2}];function d(e){const r={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(r.h2,{id:"rxstorage-performance-comparison",children:"RxStorage Performance comparison"}),"\n",(0,n.jsxs)(r.p,{children:["A big difference in the RxStorage implementations is the ",(0,n.jsx)(r.strong,{children:"performance"}),". In difference to a server side database, RxDB is bound to the limits of the JavaScript runtime and depending on the runtime, there are different possibilities to store and fetch data. For example in the browser it is only possible to store data in a ",(0,n.jsx)(r.a,{href:"/slow-indexeddb.html",children:"slow IndexedDB"})," or OPFS instead of a filesystem while on React-Native you can use the ",(0,n.jsx)(r.a,{href:"/rx-storage-sqlite.html",children:"SQLite storage"}),"."]}),"\n",(0,n.jsxs)(r.p,{children:["Therefore the performance can be completely different depending on where you use RxDB and what you do with it. Here you can see some performance measurements and descriptions on how the different ",(0,n.jsx)(r.a,{href:"/rx-storage.html",children:"storages"})," work and how their performance is different."]}),"\n",(0,n.jsx)(r.h2,{id:"persistent-vs-semi-persistent-storages",children:"Persistent vs Semi-Persistent storages"}),"\n",(0,n.jsx)(r.p,{children:'The "normal" storages are always persistent. This means each RxDB write is directly written to disc and all queries run on the disc state. This means a good startup performance because nothing has to be done on startup.'}),"\n",(0,n.jsxs)(r.p,{children:["In contrast, semi-persistent storages like ",(0,n.jsx)(r.a,{href:"/rx-storage-memory-mapped.html",children:"memory mapped"})," store all data in memory on startup and only save to disc occasionally (or on exit). Therefore it has a very fast read/write performance, but loading all data into memory on the first page load can take longer for big amounts of documents. Also these storages can only be used when all data fits into the memory at least once. In general it is recommended to stay on the persistent storages and only use semi-persistent ones, when you know for sure that the dataset will stay small (less than 2k documents)."]}),"\n",(0,n.jsx)(r.h2,{id:"performance-comparison",children:"Performance comparison"}),"\n",(0,n.jsx)(r.p,{children:"In the following you can find some performance measurements and comparisons. Notice that these are only a small set of possible RxDB operations. If performance is really relevant for your use case, you should do your own measurements with usage-patterns that are equal to how you use RxDB in production."}),"\n",(0,n.jsx)(r.h3,{id:"measurements",children:"Measurements"}),"\n",(0,n.jsx)(r.p,{children:"Here the following metrics are measured:"}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsxs)(r.li,{children:["time-to-first-insert: Many storages run lazy, so it makes no sense to compare the time which is required to create a database with collections. Instead we measure the ",(0,n.jsx)(r.strong,{children:"time-to-first-insert"})," which is the whole timespan from database creation until the first single document write is done."]}),"\n",(0,n.jsx)(r.li,{children:"insert documents (bulk): Insert 500 documents with a single bulk-insert operation."}),"\n",(0,n.jsxs)(r.li,{children:["find documents by id (bulk): Here we fetch 100% of the stored documents with a single ",(0,n.jsx)(r.code,{children:"findByIds()"})," call."]}),"\n",(0,n.jsx)(r.li,{children:"insert documents (serial): Insert 50 documents, one after each other."}),"\n",(0,n.jsxs)(r.li,{children:["find documents by id (serial): Here we find 50 documents in serial with one ",(0,n.jsx)(r.code,{children:"findByIds()"})," call per document."]}),"\n",(0,n.jsxs)(r.li,{children:["find documents by query: Here we fetch 100% of the stored documents with a single ",(0,n.jsx)(r.code,{children:"find()"})," call."]}),"\n",(0,n.jsxs)(r.li,{children:["find documents by query: Here we fetch all of the stored documents with a 4 ",(0,n.jsx)(r.code,{children:"find()"})," calls that run in parallel. Each fetching 25% of the documents."]}),"\n",(0,n.jsxs)(r.li,{children:["count documents: Counts 100% of the stored documents with a single ",(0,n.jsx)(r.code,{children:"count()"})," call. Here we measure 4 runs at once to have a higher number that is easier to compare."]}),"\n"]}),"\n",(0,n.jsx)(r.h2,{id:"browser-based-storages-performance-comparison",children:"Browser based Storages Performance Comparison"}),"\n",(0,n.jsxs)(r.p,{children:["The performance patterns of the browser based storages are very diverse. The ",(0,n.jsx)(r.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB storage"})," is recommended for mostly all use cases so you should start with that one. Later you can do performance testings and switch to another storage like ",(0,n.jsx)(r.a,{href:"/rx-storage-opfs.html",children:"OPFS"})," or ",(0,n.jsx)(r.a,{href:"/rx-storage-memory-mapped.html",children:"memory-mapped"}),"."]}),"\n",(0,n.jsx)("p",{align:"center",children:(0,n.jsx)("img",{src:"./files/rx-storage-performance-browser.png",alt:"RxStorage performance - browser",width:"700"})}),"\n",(0,n.jsx)(r.h2,{id:"nodenative-based-storages-performance-comparison",children:"Node/Native based Storages Performance Comparison"}),"\n",(0,n.jsxs)(r.p,{children:["For most client-side native applications (",(0,n.jsx)(r.a,{href:"/react-native-database.html",children:"react-native"}),", ",(0,n.jsx)(r.a,{href:"/electron-database.html",children:"electron"}),", ",(0,n.jsx)(r.a,{href:"/capacitor-database.html",children:"capacitor"}),"), using the ",(0,n.jsx)(r.a,{href:"/rx-storage-sqlite.html",children:"SQLite RxStorage"})," is recommended. For non-client side applications like a server, use the ",(0,n.jsx)(r.a,{href:"/rx-storage-mongodb.html",children:"MongoDB storage"})," instead."]}),"\n",(0,n.jsx)("p",{align:"center",children:(0,n.jsx)("img",{src:"./files/rx-storage-performance-node.png",alt:"RxStorage performance - Node.js",width:"700"})})]})}function m(e={}){const{wrapper:r}={...(0,o.R)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},8453(e,r,s){s.d(r,{R:()=>a,x:()=>i});var t=s(6540);const n={},o=t.createContext(n);function a(e){const r=t.useContext(o);return t.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function i(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),t.createElement(o.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/1b5fa8ad.99194259.js b/docs/assets/js/1b5fa8ad.99194259.js deleted file mode 100644 index aa31aa8599b..00000000000 --- a/docs/assets/js/1b5fa8ad.99194259.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9111],{5347(e,r,a){a.r(r),a.d(r,{default:()=>n});var t=a(544),l=a(4848);function n(){return(0,t.default)({sem:{id:"gads",metaTitle:"The modern alternative for NeDB",title:(0,l.jsxs)(l.Fragment,{children:["The ",(0,l.jsx)("b",{children:"modern"})," alternative for"," ",(0,l.jsx)("b",{children:"NeDB"})]}),appName:"Browser"}})}}}]); \ No newline at end of file diff --git a/docs/assets/js/1c0701dd.8572a44b.js b/docs/assets/js/1c0701dd.8572a44b.js deleted file mode 100644 index d24bf882a8a..00000000000 --- a/docs/assets/js/1c0701dd.8572a44b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[6953],{8453(n,e,s){s.d(e,{R:()=>l,x:()=>a});var r=s(6540);const o={},i=r.createContext(o);function l(n){const e=r.useContext(i);return r.useMemo(function(){return"function"==typeof n?n(e):{...e,...n}},[e,n])}function a(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(o):n.components||o:l(n.components),r.createElement(i.Provider,{value:e},n.children)}},9328(n,e,s){s.r(e),s.d(e,{assets:()=>t,contentTitle:()=>a,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"middleware","title":"Streamlined RxDB Middleware","description":"Enhance your RxDB workflow with pre and post hooks. Quickly add custom validations, triggers, and events to streamline your asynchronous operations.","source":"@site/docs/middleware.md","sourceDirName":".","slug":"/middleware.html","permalink":"/middleware.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Streamlined RxDB Middleware","slug":"middleware.html","description":"Enhance your RxDB workflow with pre and post hooks. Quickly add custom validations, triggers, and events to streamline your asynchronous operations."},"sidebar":"tutorialSidebar","previous":{"title":"Leader Election","permalink":"/leader-election.html"},"next":{"title":"CRDT","permalink":"/crdt.html"}}');var o=s(4848),i=s(8453);const l={title:"Streamlined RxDB Middleware",slug:"middleware.html",description:"Enhance your RxDB workflow with pre and post hooks. Quickly add custom validations, triggers, and events to streamline your asynchronous operations."},a="Middleware",t={},c=[{value:"List",id:"list",level:2},{value:"Why is there no validate-hook?",id:"why-is-there-no-validate-hook",level:3},{value:"Use Cases",id:"use-cases",level:2},{value:"Usage",id:"usage",level:2},{value:"Insert",id:"insert",level:3},{value:"lifecycle",id:"lifecycle",level:4},{value:"preInsert",id:"preinsert",level:4},{value:"postInsert",id:"postinsert",level:4},{value:"Save",id:"save",level:3},{value:"lifecycle",id:"lifecycle-1",level:4},{value:"preSave",id:"presave",level:4},{value:"postSave",id:"postsave",level:4},{value:"Remove",id:"remove",level:3},{value:"lifecycle",id:"lifecycle-2",level:4},{value:"preRemove",id:"preremove",level:4},{value:"postRemove",id:"postremove",level:4},{value:"postCreate",id:"postcreate",level:3}];function d(n){const e={admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,i.R)(),...n.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.header,{children:(0,o.jsx)(e.h1,{id:"middleware",children:"Middleware"})}),"\n",(0,o.jsx)(e.p,{children:"RxDB middleware-hooks (also called pre and post hooks) are functions which are passed control during execution of asynchronous functions.\nThe hooks are specified on RxCollection-level and help to create a clear what-happens-when-structure of your code."}),"\n",(0,o.jsxs)(e.p,{children:["Hooks can be defined to run ",(0,o.jsx)(e.strong,{children:"parallel"})," or as ",(0,o.jsx)(e.strong,{children:"series"})," one after another.\nHooks can be ",(0,o.jsx)(e.strong,{children:"synchronous"})," or ",(0,o.jsx)(e.strong,{children:"asynchronous"})," when they return a ",(0,o.jsx)(e.code,{children:"Promise"}),".\nTo stop the operation at a specific hook, throw an error."]}),"\n",(0,o.jsx)(e.h2,{id:"list",children:"List"}),"\n",(0,o.jsx)(e.p,{children:"RxDB supports the following hooks:"}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsx)(e.li,{children:"preInsert"}),"\n",(0,o.jsx)(e.li,{children:"postInsert"}),"\n",(0,o.jsx)(e.li,{children:"preSave"}),"\n",(0,o.jsx)(e.li,{children:"postSave"}),"\n",(0,o.jsx)(e.li,{children:"preRemove"}),"\n",(0,o.jsx)(e.li,{children:"postRemove"}),"\n",(0,o.jsx)(e.li,{children:"postCreate"}),"\n"]}),"\n",(0,o.jsx)(e.h3,{id:"why-is-there-no-validate-hook",children:"Why is there no validate-hook?"}),"\n",(0,o.jsxs)(e.p,{children:["Different to mongoose, the validation on document-data is running on the field-level for every change to a document.\nThis means if you set the value ",(0,o.jsx)(e.code,{children:"lastName"})," of a RxDocument, then the validation will only run on the changed field, not the whole document.\nTherefore it is not useful to have validate-hooks when a document is written to the database."]}),"\n",(0,o.jsx)(e.h2,{id:"use-cases",children:"Use Cases"}),"\n",(0,o.jsx)(e.p,{children:"Middleware are useful for atomizing model logic and avoiding nested blocks of async code.\nHere are some other ideas:"}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsx)(e.li,{children:"complex validation"}),"\n",(0,o.jsx)(e.li,{children:"removing dependent documents"}),"\n",(0,o.jsx)(e.li,{children:"asynchronous defaults"}),"\n",(0,o.jsx)(e.li,{children:"asynchronous tasks that a certain action triggers"}),"\n",(0,o.jsx)(e.li,{children:"triggering custom events"}),"\n",(0,o.jsx)(e.li,{children:"notifications"}),"\n"]}),"\n",(0,o.jsx)(e.h2,{id:"usage",children:"Usage"}),"\n",(0,o.jsxs)(e.p,{children:["All hooks have the plain data as first parameter, and all but ",(0,o.jsx)(e.code,{children:"preInsert"})," also have the ",(0,o.jsx)(e.code,{children:"RxDocument"}),"-instance as second parameter. If you want to modify the data in the hook, change attributes of the first parameter."]}),"\n",(0,o.jsxs)(e.p,{children:["All hook functions are also ",(0,o.jsx)(e.code,{children:"this"}),"-bind to the ",(0,o.jsx)(e.code,{children:"RxCollection"}),"-instance."]}),"\n",(0,o.jsx)(e.h3,{id:"insert",children:"Insert"}),"\n",(0,o.jsx)(e.p,{children:"An insert-hook receives the data-object of the new document."}),"\n",(0,o.jsx)(e.h4,{id:"lifecycle",children:"lifecycle"}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsx)(e.li,{children:"RxCollection.insert is called"}),"\n",(0,o.jsx)(e.li,{children:"preInsert series-hooks"}),"\n",(0,o.jsx)(e.li,{children:"preInsert parallel-hooks"}),"\n",(0,o.jsx)(e.li,{children:"schema validation runs"}),"\n",(0,o.jsx)(e.li,{children:"new document is written to database"}),"\n",(0,o.jsx)(e.li,{children:"postInsert series-hooks"}),"\n",(0,o.jsx)(e.li,{children:"postInsert parallel-hooks"}),"\n",(0,o.jsx)(e.li,{children:"event is emitted to RxDatabase and RxCollection"}),"\n"]}),"\n",(0,o.jsx)(e.h4,{id:"preinsert",children:"preInsert"}),"\n",(0,o.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsxs)(e.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// series"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".preInsert"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData){"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // set age to 50 before saving"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:".age "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 50"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// parallel"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".preInsert"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData){"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// async"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".preInsert"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData){"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" Promise"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(res "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" setTimeout"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(res"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"));"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// stop the insert-operation"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".preInsert"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData){"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" throw"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" Error"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'stop'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})}),"\n",(0,o.jsx)(e.h4,{id:"postinsert",children:"postInsert"}),"\n",(0,o.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsxs)(e.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// series"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".postInsert"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rxDocument){"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// parallel"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".postInsert"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rxDocument){"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// async"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".postInsert"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rxDocument){"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" Promise"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(res "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" setTimeout"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(res"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"));"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})}),"\n",(0,o.jsx)(e.h3,{id:"save",children:"Save"}),"\n",(0,o.jsx)(e.p,{children:"A save-hook receives the document which is saved."}),"\n",(0,o.jsx)(e.h4,{id:"lifecycle-1",children:"lifecycle"}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsx)(e.li,{children:"RxDocument.save is called"}),"\n",(0,o.jsx)(e.li,{children:"preSave series-hooks"}),"\n",(0,o.jsx)(e.li,{children:"preSave parallel-hooks"}),"\n",(0,o.jsx)(e.li,{children:"updated document is written to database"}),"\n",(0,o.jsx)(e.li,{children:"postSave series-hooks"}),"\n",(0,o.jsx)(e.li,{children:"postSave parallel-hooks"}),"\n",(0,o.jsx)(e.li,{children:"event is emitted to RxDatabase and RxCollection"}),"\n"]}),"\n",(0,o.jsx)(e.h4,{id:"presave",children:"preSave"}),"\n",(0,o.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsxs)(e.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// series"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".preSave"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rxDocument){"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // modify anyField before saving"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:".anyField "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'anyValue'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// parallel"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".preSave"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rxDocument){"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// async"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".preSave"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rxDocument){"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" Promise"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(res "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" setTimeout"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(res"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"));"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// stop the save-operation"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".preSave"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rxDocument){"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" throw"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" Error"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'stop'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})}),"\n",(0,o.jsx)(e.h4,{id:"postsave",children:"postSave"}),"\n",(0,o.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsxs)(e.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// series"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".postSave"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rxDocument){"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// parallel"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".postSave"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rxDocument){"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// async"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".postSave"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rxDocument){"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" Promise"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(res "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" setTimeout"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(res"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"));"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})}),"\n",(0,o.jsx)(e.h3,{id:"remove",children:"Remove"}),"\n",(0,o.jsx)(e.p,{children:"An remove-hook receives the document which is removed."}),"\n",(0,o.jsx)(e.h4,{id:"lifecycle-2",children:"lifecycle"}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsx)(e.li,{children:"RxDocument.remove is called"}),"\n",(0,o.jsx)(e.li,{children:"preRemove series-hooks"}),"\n",(0,o.jsx)(e.li,{children:"preRemove parallel-hooks"}),"\n",(0,o.jsx)(e.li,{children:"deleted document is written to database"}),"\n",(0,o.jsx)(e.li,{children:"postRemove series-hooks"}),"\n",(0,o.jsx)(e.li,{children:"postRemove parallel-hooks"}),"\n",(0,o.jsx)(e.li,{children:"event is emitted to RxDatabase and RxCollection"}),"\n"]}),"\n",(0,o.jsx)(e.h4,{id:"preremove",children:"preRemove"}),"\n",(0,o.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsxs)(e.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// series"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".preRemove"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rxDocument){"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// parallel"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".preRemove"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rxDocument){"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// async"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".preRemove"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rxDocument){"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" Promise"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(res "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" setTimeout"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(res"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"));"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// stop the remove-operation"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".preRemove"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rxDocument){"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" throw"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" Error"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'stop'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})}),"\n",(0,o.jsx)(e.h4,{id:"postremove",children:"postRemove"}),"\n",(0,o.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsxs)(e.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// series"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".postRemove"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rxDocument){"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// parallel"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".postRemove"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rxDocument){"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// async"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".postRemove"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rxDocument){"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" Promise"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(res "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" setTimeout"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(res"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"));"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})}),"\n",(0,o.jsx)(e.h3,{id:"postcreate",children:"postCreate"}),"\n",(0,o.jsxs)(e.p,{children:["This hook is called whenever a ",(0,o.jsx)(e.code,{children:"RxDocument"})," is constructed.\nYou can use ",(0,o.jsx)(e.code,{children:"postCreate"})," to modify every RxDocument-instance of the collection.\nThis adds a flexible way to add specify behavior to every document. You can also use it to add custom getter/setter to documents. PostCreate-hooks cannot be ",(0,o.jsx)(e.strong,{children:"asynchronous"}),"."]}),"\n",(0,o.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsxs)(e.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".postCreate"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(plainData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" rxDocument){"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" Object"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".defineProperty"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(rxDocument"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myField'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" get"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foobar'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"doc"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:".myField);"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// 'foobar'"})})]})})}),"\n",(0,o.jsx)(e.admonition,{type:"note",children:(0,o.jsxs)(e.p,{children:["This hook does not run on already created or cached documents. Make sure to add ",(0,o.jsx)(e.code,{children:"postCreate"}),"-hooks before interacting with the collection."]})})]})}function h(n={}){const{wrapper:e}={...(0,i.R)(),...n.components};return e?(0,o.jsx)(e,{...n,children:(0,o.jsx)(d,{...n})}):d(n)}}}]); \ No newline at end of file diff --git a/docs/assets/js/1da545ff.ef424470.js b/docs/assets/js/1da545ff.ef424470.js deleted file mode 100644 index dc146ed39f4..00000000000 --- a/docs/assets/js/1da545ff.ef424470.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9743],{135(e,s,n){n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"releases/9.0.0","title":"RxDB 9.0.0 - Faster & Simpler","description":"Discover RxDB 9.0.0\'s streamlined plugins, top-level schema definitions, and improved dev-mode. Experience a simpler, faster real-time database.","source":"@site/docs/releases/9.0.0.md","sourceDirName":"releases","slug":"/releases/9.0.0.html","permalink":"/releases/9.0.0.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB 9.0.0 - Faster & Simpler","slug":"9.0.0.html","description":"Discover RxDB 9.0.0\'s streamlined plugins, top-level schema definitions, and improved dev-mode. Experience a simpler, faster real-time database."},"sidebar":"tutorialSidebar","previous":{"title":"10.0.0","permalink":"/releases/10.0.0.html"},"next":{"title":"8.0.0","permalink":"/releases/8.0.0.html"}}');var i=n(4848),a=n(8453);const o={title:"RxDB 9.0.0 - Faster & Simpler",slug:"9.0.0.html",description:"Discover RxDB 9.0.0's streamlined plugins, top-level schema definitions, and improved dev-mode. Experience a simpler, faster real-time database."},t="9.0.0",l={},d=[{value:"Breaking changes",id:"breaking-changes",level:2},{value:"All default exports have been removed",id:"all-default-exports-have-been-removed",level:3},{value:"Indexes are specified at the top level of the schema definition",id:"indexes-are-specified-at-the-top-level-of-the-schema-definition",level:3},{value:"Encrypted fields at the top level of the schema",id:"encrypted-fields-at-the-top-level-of-the-schema",level:3},{value:"New dev-mode plugin",id:"new-dev-mode-plugin",level:3},{value:"New migration plugin",id:"new-migration-plugin",level:3},{value:"Rewritten key-compression",id:"rewritten-key-compression",level:3},{value:"Rewritten query-change-detection to event-reduce",id:"rewritten-query-change-detection-to-event-reduce",level:3},{value:"find() and findOne() now accepts the full mango query",id:"find-and-findone-now-accepts-the-full-mango-query",level:3},{value:"moved query builder to own plugin",id:"moved-query-builder-to-own-plugin",level:3},{value:"Refactored RxChangeEvent",id:"refactored-rxchangeevent",level:3},{value:"Internal hash() is now using a salt",id:"internal-hash-is-now-using-a-salt",level:3},{value:"Changed default of RxDocument.toJSON()",id:"changed-default-of-rxdocumenttojson",level:3},{value:"Typescript 3.8.0 or newer is required",id:"typescript-380-or-newer-is-required",level:3},{value:"GraphQL replication will run a schema validation of incoming data",id:"graphql-replication-will-run-a-schema-validation-of-incoming-data",level:3},{value:"Internal and other changes",id:"internal-and-other-changes",level:2},{value:"Help wanted",id:"help-wanted",level:2},{value:"Refactor data-migrator",id:"refactor-data-migrator",level:3},{value:"Add e2e tests to the react example",id:"add-e2e-tests-to-the-react-example",level:3},{value:"Fix pouchdb bug so we can upgrade pouchdb-find",id:"fix-pouchdb-bug-so-we-can-upgrade-pouchdb-find",level:3},{value:"About the future of RxDB",id:"about-the-future-of-rxdb",level:2}];function c(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"900",children:"9.0.0"})}),"\n",(0,i.jsx)(s.p,{children:"So I was working hard the past month to prepare everything for the next major release of RxDB. The last major release was 1,5 years ago by the way."}),"\n",(0,i.jsxs)(s.p,{children:["When I started ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/issues/1636",children:"listing up the planned changes"})," I had big ambitions about basically rewriting everything. But I found out this time has not come yet. There is some work to be done first. So version ",(0,i.jsx)(s.code,{children:"9.0.0"})," was more about fixing all these small things that made improving the codebase difficult. Much has been refactored and moved. Some API-parts have been changed to have a more simple project with a cleaner codebase."]}),"\n",(0,i.jsx)(s.p,{children:"Notice that I use major releases to bundle stuff that breaks the RxDB usage in your project. By having only few major releases you can be sure that you can upgrade in one big block instead of changing stuff each few months. Big features are released in non-major releases because they mostly can be implemented without side effects."}),"\n",(0,i.jsx)(s.h2,{id:"breaking-changes",children:"Breaking changes"}),"\n",(0,i.jsx)(s.p,{children:"You have to apply these changes to your codebase when upgrading RxDB."}),"\n",(0,i.jsx)(s.h3,{id:"all-default-exports-have-been-removed",children:"All default exports have been removed"}),"\n",(0,i.jsx)(s.p,{children:"Using default exports and imports can be helpful when you want to write code fast.\nBut using them also disabled the tree-shaking of your bundler which means you added much code to your bundle that was not even used. To prevent this common behavior, I removed all default exports and renamed functions so that they are more unlikely to clash with other non-RxDB function names."}),"\n",(0,i.jsx)(s.p,{children:"Instead of doing"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" RxDB "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"RxDB"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".plugin"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" RxDB"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".create"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})]})]})})}),"\n",(0,i.jsx)(s.p,{children:"You now do"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" addRxPlugin } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addRxPlugin"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})]})]})})}),"\n",(0,i.jsxs)(s.p,{children:["Also ",(0,i.jsx)(s.code,{children:"removeDatabase()"})," is renamed to ",(0,i.jsx)(s.code,{children:"removeRxDatabase()"})," and ",(0,i.jsx)(s.code,{children:"plugin()"})," is now ",(0,i.jsx)(s.code,{children:"addRxPlugin()"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"Same goes for all previous default exports of the plugins."}),"\n",(0,i.jsx)(s.h3,{id:"indexes-are-specified-at-the-top-level-of-the-schema-definition",children:"Indexes are specified at the top level of the schema definition"}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/issues/1655",children:"related issue"})}),"\n",(0,i.jsx)(s.p,{children:"In the past the indexes of a collection had to be specified at the field level of the schema like"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"json","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"json","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"{"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "firstName"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "type"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "string"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "index"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.p,{children:"This made it complex to list up the index fields which had a bad performance on startup.\nTo fix this the indexes are now specified at the top level of the schema like"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"json","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"json","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"{"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "title"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "my schema"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "version"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "type"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "object"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "properties"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "indexes"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "firstName"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"compound"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "index"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.h3,{id:"encrypted-fields-at-the-top-level-of-the-schema",children:"Encrypted fields at the top level of the schema"}),"\n",(0,i.jsx)(s.p,{children:"Same as the indexes, encrypted fields are now also defined in the top level like"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"json","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"json","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"{"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "title"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "my schema"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "version"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "type"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "object"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "properties"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "encrypted"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "password"'})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.h3,{id:"new-dev-mode-plugin",children:"New dev-mode plugin"}),"\n",(0,i.jsxs)(s.p,{children:["In the past we had stuff that is only wanted for development in the two plugins ",(0,i.jsx)(s.code,{children:"error-messages"})," and ",(0,i.jsx)(s.code,{children:"schema-check"}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["Now we have a single plugin ",(0,i.jsx)(s.code,{children:"dev-mode"})," that contains all these checks and development helper functions. I also moved many other checks out of the core-module into dev-mode."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { RxDBDevModePlugin } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/dev-mode'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addRxPlugin"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(RxDBDevModePlugin);"})]})]})})}),"\n",(0,i.jsx)(s.h3,{id:"new-migration-plugin",children:"New migration plugin"}),"\n",(0,i.jsx)(s.p,{children:"The data migration was not used by all users of this project. Often it was easier to just wipe the local data store and let the client sync everything from the server. Because the migration has so much code, it is now in a separate plugin so that you do not have to ship this code to the clients if not necessary."}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { RxDBMigrationPlugin } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/migration'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addRxPlugin"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(RxDBMigrationPlugin);"})]})]})})}),"\n",(0,i.jsx)(s.h3,{id:"rewritten-key-compression",children:"Rewritten key-compression"}),"\n",(0,i.jsx)(s.p,{children:"The key-compression logic was fully coded only for RxDB. This was a problem because it was not usable for other stuff and also badly tested. We had a known problem with nested arrays that caused much confusion because some queries did not find the correct documents."}),"\n",(0,i.jsxs)(s.p,{children:["I now created a npm-package ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/jsonschema-key-compression",children:"jsonschema-key-compression"})," that has cleaner code, better tests and can also be used for non-RxDB stuff."]}),"\n",(0,i.jsx)(s.p,{children:"If you used the key-compression in the past and have clients out there with old data, you have to find a way to migrate that data by using the json-import or other solutions depending on your project."}),"\n",(0,i.jsx)(s.h3,{id:"rewritten-query-change-detection-to-event-reduce",children:"Rewritten query-change-detection to event-reduce"}),"\n",(0,i.jsxs)(s.p,{children:["One big benefit of having a ",(0,i.jsx)(s.a,{href:"/articles/realtime-database.html",children:"realtime database"})," is that big performance optimizations can be done when the database knows a query is observed and the updated results are needed continuously. In the past this optimization was done by the internal ",(0,i.jsx)(s.code,{children:"queryChangeDetection"})," which was a big tree of if-else-statements that hopefully worked. This was also the reason why queryChangeDetection was in beta mode and not enabled by default."]}),"\n",(0,i.jsxs)(s.p,{children:["After months of research and testing I was able to create ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/event-reduce",children:"Event-Reduce: An algorithm to optimize database queries that run multiple times"}),". This JavaScript module contains an algorithm that is able to optimize realtime queries in a way that was not possible before. The algorithm is not RxDB specific and also heavily tested."]}),"\n",(0,i.jsxs)(s.p,{children:["Instead of setting ",(0,i.jsx)(s.code,{children:"queryChangeDetection"})," when creating a ",(0,i.jsx)(s.code,{children:"RxDatabase"}),", you now set ",(0,i.jsx)(s.code,{children:"eventReduce"})," which defaults to ",(0,i.jsx)(s.code,{children:"true"}),"."]}),"\n",(0,i.jsx)(s.h3,{id:"find-and-findone-now-accepts-the-full-mango-query",children:"find() and findOne() now accepts the full mango query"}),"\n",(0,i.jsxs)(s.p,{children:["In the past, only the selector of a query could be passed to ",(0,i.jsx)(s.code,{children:"find()"})," and ",(0,i.jsx)(s.code,{children:"findOne()"})," if you wanted to also do ",(0,i.jsx)(s.code,{children:"sort"}),", ",(0,i.jsx)(s.code,{children:"skip"})," or ",(0,i.jsx)(s.code,{children:"limit"}),", you had to call additional functions like"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"})"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".sort"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'name'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".skip"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"5"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".limit"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"10"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})}),"\n",(0,i.jsx)(s.p,{children:"Now you can pass the full query to the function call like"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sort"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" [{name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'asc'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}]"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" skip"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 5"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" limit"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.h3,{id:"moved-query-builder-to-own-plugin",children:"moved query builder to own plugin"}),"\n",(0,i.jsxs)(s.p,{children:["The query builder that allowed to create queries like ",(0,i.jsx)(s.code,{children:".where('foo').eq('bar')"})," etc. was not really used by many people. Most of the time it is better to just pass the full query as simple json object. Also the code for the query builder was big and increased the build size much more than its value added. Only some edge-cases where recursive query modification was needed made the query builder useful. If you still want to use the query builder, you have to import the plugin."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { RxDBQueryBuilderPlugin } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/query-builder'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addRxPlugin"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(RxDBQueryBuilderPlugin);"})]})]})})}),"\n",(0,i.jsx)(s.h3,{id:"refactored-rxchangeevent",children:"Refactored RxChangeEvent"}),"\n",(0,i.jsxs)(s.p,{children:["The whole data structure of ",(0,i.jsx)(s.code,{children:"RxChangeEvent"})," was way more complicated than it had to be. I refactored the whole class to be more simple. If you directly use ",(0,i.jsx)(s.code,{children:"RxChangeEvent"})," in your project you have to adapt to these changes. Also the stream of ",(0,i.jsx)(s.code,{children:"RxDatabase().$"})," will no longer emit the ",(0,i.jsx)(s.code,{children:"COLLECTION"})," event when a new collection is created."]}),"\n",(0,i.jsx)(s.h3,{id:"internal-hash-is-now-using-a-salt",children:"Internal hash() is now using a salt"}),"\n",(0,i.jsxs)(s.p,{children:["The internal hash function was used to store hashes of database passwords to compare them and directly throw errors when the wrong password was used with an existing data set. This was dangerous because you could use rainbow tables or even ",(0,i.jsx)(s.a,{href:"https://www.google.com/search?q=e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4",children:"just google"})," the hash to find out the plain password. So now the internal hashing is using a salt to prevent these attacks. If you have used the encryption in the past, you have to migrate your internal schema storage."]}),"\n",(0,i.jsx)(s.h3,{id:"changed-default-of-rxdocumenttojson",children:"Changed default of RxDocument.toJSON()"}),"\n",(0,i.jsxs)(s.p,{children:["By default ",(0,i.jsx)(s.code,{children:"RxDocument.toJSON()"})," always returned also the ",(0,i.jsx)(s.code,{children:"_rev"})," field and the ",(0,i.jsx)(s.code,{children:"_attachments"}),". This was confusing behavior which is why I changed the default to ",(0,i.jsx)(s.code,{children:"RxDocument().toJSON(withRevAndAttachments = false)"})]}),"\n",(0,i.jsx)(s.h3,{id:"typescript-380-or-newer-is-required",children:"Typescript 3.8.0 or newer is required"}),"\n",(0,i.jsxs)(s.p,{children:["Because RxDB and some subdependencies extensively use ",(0,i.jsx)(s.code,{children:"export type ..."})," you now need typescript ",(0,i.jsx)(s.code,{children:"3.8.0"})," or newer."]}),"\n",(0,i.jsx)(s.h3,{id:"graphql-replication-will-run-a-schema-validation-of-incoming-data",children:"GraphQL replication will run a schema validation of incoming data"}),"\n",(0,i.jsx)(s.p,{children:"In dev-mode, the GraphQL-replication will run a schema validation of each document that comes from the server before it is saved to the database."}),"\n",(0,i.jsx)(s.h2,{id:"internal-and-other-changes",children:"Internal and other changes"}),"\n",(0,i.jsx)(s.p,{children:"I refactored much internal stuff and moved much code out of the core into the specific plugins."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Renamed ",(0,i.jsx)(s.code,{children:"RxSchema.jsonID"})," to ",(0,i.jsx)(s.code,{children:"RxSchema.jsonSchema"})]}),"\n",(0,i.jsx)(s.li,{children:"Moved remaining stuff of leader-election from core into the plugin"}),"\n",(0,i.jsxs)(s.li,{children:["Merged multiple internal databases for metadata into one ",(0,i.jsx)(s.code,{children:"internalStore"})]}),"\n",(0,i.jsx)(s.li,{children:"Removed many runtime type checks that now should be covered by typescript in buildtime"}),"\n",(0,i.jsx)(s.li,{children:"The GraphQL replication is now out of beta mode"}),"\n",(0,i.jsxs)(s.li,{children:["Removed documentation examples for ",(0,i.jsx)(s.code,{children:"require()"})," CommonJS loading"]}),"\n",(0,i.jsxs)(s.li,{children:["Removed ",(0,i.jsx)(s.code,{children:"RxCollection.docChanges$()"})," because all events are from the docs"]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"help-wanted",children:"Help wanted"}),"\n",(0,i.jsx)(s.p,{children:"RxDB is an open source project an heavily relies on the contribution of its users. There are some things that must be done, but I have no time for them."}),"\n",(0,i.jsx)(s.h3,{id:"refactor-data-migrator",children:"Refactor data-migrator"}),"\n",(0,i.jsx)(s.p,{children:"The current implementation has some flaws and should be completely rewritten."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"It does not use pouchdb's bulkDocs which is much faster"}),"\n",(0,i.jsx)(s.li,{children:"It could have been written without rxjs and with less code that is easier to understand"}),"\n",(0,i.jsx)(s.li,{children:"It does not migrate the revisions of documents which causes a problem when replication is used"}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"add-e2e-tests-to-the-react-example",children:"Add e2e tests to the react example"}),"\n",(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/react",children:"react example"})," has no end-to-end tests which is why the CI does not ensure that it works all the time. We should add some basic tests like we did for the other example projects."]}),"\n",(0,i.jsx)(s.h3,{id:"fix-pouchdb-bug-so-we-can-upgrade-pouchdb-find",children:"Fix pouchdb bug so we can upgrade pouchdb-find"}),"\n",(0,i.jsxs)(s.p,{children:["There is a ",(0,i.jsx)(s.a,{href:"https://github.com/pouchdb/pouchdb/issues/7810",children:"bug in pouchdb"})," that prevents the upgrade of ",(0,i.jsx)(s.code,{children:"pouchdb-find"}),". This is why RxDB relies on an old version of ",(0,i.jsx)(s.code,{children:"pouchdb-find"})," that also requires different sub-dependencies. This increases the build size a lot because for example we ship multiple version of ",(0,i.jsx)(s.code,{children:"spark-md5"})," and others."]}),"\n",(0,i.jsx)(s.h2,{id:"about-the-future-of-rxdb",children:"About the future of RxDB"}),"\n",(0,i.jsxs)(s.p,{children:["At the moment RxDB is a realtime database based on pouchdb. In the future I want RxDB to be a wrapper around pull-based databases that also works with other source-dbs like mongoDB or PostgreSQL. As a start I defined the ",(0,i.jsx)(s.code,{children:"RxStorage"})," interface and created a ",(0,i.jsx)(s.code,{children:"RxStoragePouchdb"})," class that implements it and contains all pouchdb-specific logic. I want to move every direct storage usage into that interface so that later we can create other implementations of it for other source databases."]})]})}function h(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453(e,s,n){n.d(s,{R:()=>o,x:()=>t});var r=n(6540);const i={},a=r.createContext(i);function o(e){const s=r.useContext(a);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(i):e.components||i:o(e.components),r.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/1db64337.7448d5c4.js b/docs/assets/js/1db64337.7448d5c4.js deleted file mode 100644 index 25d264f5d65..00000000000 --- a/docs/assets/js/1db64337.7448d5c4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[8413],{6471(e,t,a){a.r(t),a.d(t,{assets:()=>m,contentTitle:()=>y,default:()=>x,frontMatter:()=>b,metadata:()=>r,toc:()=>g});const r=JSON.parse('{"id":"overview","title":"RxDB Docs","description":"RxDB Documentation Overview","source":"@site/docs/overview.md","sourceDirName":".","slug":"/overview.html","permalink":"/overview.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB Docs","slug":"overview.html","description":"RxDB Documentation Overview"},"sidebar":"tutorialSidebar","next":{"title":"\ud83d\ude80 Quickstart","permalink":"/quickstart.html"}}');var l=a(4848),i=a(8453),o=a(7810);const c={tutorialSidebar:[{type:"category",label:"Getting Started",collapsed:!1,items:[{type:"doc",id:"overview",label:"Overview"},"quickstart","install","dev-mode","tutorials/typescript"]},{type:"category",label:"Core Entities",collapsed:!0,items:[{type:"doc",id:"rx-database",label:"RxDatabase"},{type:"doc",id:"rx-schema",label:"RxSchema"},{type:"doc",id:"rx-collection",label:"RxCollection"},{type:"doc",id:"rx-document",label:"RxDocument"},{type:"doc",id:"rx-query",label:"RxQuery"}]},{type:"category",label:"\ud83d\udcbe Storages",items:[{type:"doc",id:"rx-storage",label:"RxStorage Overview"},{type:"doc",id:"rx-storage-localstorage",label:"LocalStorage (Browser)"},{type:"doc",id:"rx-storage-indexeddb",label:"IndexedDB \ud83d\udc51 (Browser, Capacitor)"},{type:"doc",id:"rx-storage-opfs",label:"OPFS \ud83d\udc51 (Browser)"},{type:"doc",id:"rx-storage-memory",label:"Memory"},{type:"doc",id:"rx-storage-filesystem-node",label:"Filesystem Node \ud83d\udc51 (Node.js)"},{type:"doc",id:"rx-storage-sqlite",label:"SQLite (Capacitor, React-Native, Expo, Tauri, Electron, Node.js)"},{type:"category",label:"Third Party Storages",items:[{type:"doc",id:"rx-storage-dexie",label:"Dexie.js"},{type:"doc",id:"rx-storage-mongodb",label:"MongoDB"},{type:"doc",id:"rx-storage-denokv",label:"DenoKV"},{type:"doc",id:"rx-storage-foundationdb",label:"FoundationDB"}]}]},{type:"category",label:"Storage Wrappers",items:[{type:"doc",id:"schema-validation",label:"Schema Validation"},{type:"doc",id:"encryption",label:"Encryption"},{type:"doc",id:"key-compression",label:"Key Compression"},{type:"doc",id:"logger",label:"Logger \ud83d\udc51"},{type:"doc",id:"rx-storage-remote",label:"Remote RxStorage"},{type:"doc",id:"rx-storage-worker",label:"Worker RxStorage \ud83d\udc51"},{type:"doc",id:"rx-storage-shared-worker",label:"SharedWorker RxStorage \ud83d\udc51"},{type:"doc",id:"rx-storage-memory-mapped",label:"Memory Mapped RxStorage \ud83d\udc51"},{type:"doc",id:"rx-storage-sharding",label:"Sharding \ud83d\udc51"},{type:"doc",id:"rx-storage-localstorage-meta-optimizer",label:"Localstorage Meta Optimizer \ud83d\udc51"},{type:"doc",id:"electron",label:"Electron"}]},{type:"category",label:"\ud83d\udd04 Replication",items:[{type:"doc",id:"replication",label:"\u2699\ufe0f Sync Engine"},{type:"doc",id:"replication-http",label:"HTTP Replication"},{type:"doc",id:"replication-server",label:"RxServer Replication"},{type:"doc",id:"replication-graphql",label:"GraphQL Replication"},{type:"doc",id:"replication-websocket",label:"WebSocket Replication"},{type:"doc",id:"replication-couchdb",label:"CouchDB Replication"},{type:"doc",id:"replication-webrtc",label:"WebRTC P2P Replication"},{type:"doc",id:"replication-firestore",label:"Firestore Replication"},{type:"doc",id:"replication-mongodb",label:"MongoDB Replication"},{type:"doc",id:"replication-supabase",label:"Supabase Replication"},{type:"doc",id:"replication-nats",label:"NATS Replication"},{type:"doc",id:"replication-appwrite",label:"Appwrite Replication"}]},{type:"category",label:"Server",items:[{type:"doc",id:"rx-server",label:"RxServer"},{type:"doc",id:"rx-server-scaling",label:"RxServer Scaling"}]},{type:"category",label:"How RxDB works",items:[{type:"doc",id:"transactions-conflicts-revisions",label:"Transactions Conflicts Revisions"},{type:"doc",id:"query-cache",label:"Query Cache"},{type:"doc",id:"plugins",label:"Creating Plugins"},{type:"doc",id:"errors",label:"Errors"}]},{type:"category",label:"Advanced Features",items:[{type:"category",label:"Migration",items:[{type:"doc",id:"migration-schema",label:"Schema Migration"},{type:"doc",id:"migration-storage",label:"Storage Migration"}]},{type:"doc",id:"rx-attachment",label:"Attachments"},{type:"doc",id:"rx-pipeline",label:"RxPipelines"},{type:"doc",id:"reactivity",label:"Custom Reactivity"},{type:"doc",id:"rx-state",label:"RxState"},{type:"doc",id:"rx-local-document",label:"Local Documents"},{type:"doc",id:"cleanup",label:"Cleanup"},{type:"doc",id:"backup",label:"Backup"},{type:"doc",id:"leader-election",label:"Leader Election"},{type:"doc",id:"middleware",label:"Middleware"},{type:"doc",id:"crdt",label:"CRDT"},{type:"doc",id:"population",label:"Population"},{type:"doc",id:"orm",label:"ORM"},{type:"doc",id:"fulltext-search",label:"Fulltext Search \ud83d\udc51"},{type:"doc",id:"articles/javascript-vector-database",label:"Vector Database"},{type:"doc",id:"query-optimizer",label:"Query Optimizer \ud83d\udc51"},{type:"doc",id:"third-party-plugins",label:"Third Party Plugins"}]},{type:"category",label:"Integrations",items:[{type:"doc",id:"react",label:"React"},{type:"link",label:"TanStack DB",href:"https://tanstack.com/db/latest/docs/collections/rxdb-collection",customProps:{target:"_blank"}}]},{type:"category",label:"Performance",items:[{type:"doc",id:"rx-storage-performance",label:"RxStorage Performance"},{type:"doc",id:"nosql-performance-tips",label:"NoSQL Performance Tips"},{type:"doc",id:"slow-indexeddb",label:"Slow IndexedDB"},{type:"doc",id:"articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm",label:"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite"}]},{type:"category",label:"Releases",items:[{type:"doc",id:"releases/17.0.0",label:"17.0.0"},{type:"doc",id:"releases/16.0.0",label:"16.0.0"},{type:"doc",id:"releases/15.0.0",label:"15.0.0"},{type:"doc",id:"releases/14.0.0",label:"14.0.0"},{type:"doc",id:"releases/13.0.0",label:"13.0.0"},{type:"doc",id:"releases/12.0.0",label:"12.0.0"},{type:"doc",id:"releases/11.0.0",label:"11.0.0"},{type:"doc",id:"releases/10.0.0",label:"10.0.0"},{type:"doc",id:"releases/9.0.0",label:"9.0.0"},{type:"doc",id:"releases/8.0.0",label:"8.0.0"}]},{type:"category",label:"Articles",items:["articles/browser-database","articles/local-first-future","why-nosql","downsides-of-offline-first","nodejs-database","offline-first","react-native-database","articles/angular-database","articles/browser-storage","articles/data-base","articles/embedded-database","articles/flutter-database","articles/frontend-database","articles/in-memory-nosql-database","articles/ionic-database","articles/ionic-storage","articles/json-database","articles/websockets-sse-polling-webrtc-webtransport","articles/localstorage","articles/mobile-database","articles/progressive-web-app-database","articles/react-database","articles/realtime-database","articles/angular-indexeddb","articles/react-indexeddb","capacitor-database","alternatives","electron-database","articles/optimistic-ui","articles/local-database","articles/react-native-encryption","articles/vue-database","articles/vue-indexeddb","articles/jquery-database","articles/firestore-alternative","articles/firebase-realtime-database-alternative","articles/offline-database","articles/zero-latency-local-first","articles/indexeddb-max-storage-limit","articles/json-based-database","articles/reactjs-storage"]},"contribute",{type:"category",label:"Contact",items:[{type:"link",label:"Consulting",href:"/consulting/"},{type:"link",label:"Discord",href:"/chat/",customProps:{target:"_blank"}},{type:"link",label:"LinkedIn",href:"https://www.linkedin.com/company/rxdb/"}]}]};var s=a(8342);function d(e){const t=(0,l.jsx)("div",{className:"premium-block hover-shadow-middle bg-gradient-right-top",children:(0,l.jsxs)("div",{className:"premium-block-inner",children:[(0,l.jsx)("h4",{style:{textDecoration:"none"},children:(0,s.Z2)(e.title)}),(0,l.jsx)("p",{children:e.text})]})});return e.href?(0,l.jsx)("a",{href:e.href,target:e.target,style:{textDecoration:"none"},children:t}):t}function n(){return(0,l.jsx)(l.Fragment,{children:c.tutorialSidebar.map(e=>{if("category"===e.type&&"articles"!==e.label.toLowerCase()){const t=e.type+"--"+e.label;return(0,l.jsxs)("div",{children:[(0,l.jsx)("br",{}),(0,l.jsx)("br",{}),(0,l.jsx)("h2",{style:{width:"100%"},children:e.label}),(0,l.jsx)("div",{className:"premium-blocks",children:e.items.map(e=>{if("string"==typeof e)return(0,l.jsx)(d,{title:p(e),href:"./"+e+".html"},e);if("category"===e.type)return e.items.map(e=>(0,l.jsx)(d,{title:p(e.label),href:"link"===e.type?e.href:"./"+e.id+".html",target:"link"===e.type?"_blank":void 0},e.id));{const t="link"===e.type?e.label:e.id;return(0,l.jsx)(d,{title:p(e.label),href:"link"===e.type?e.href:"./"+e.id+".html",target:"link"===e.type?"_blank":void 0},t)}})},e.label)]},t)}})})}function p(e){const t=e.split("/");return(0,o.dG)(t)}const b={title:"RxDB Docs",slug:"overview.html",description:"RxDB Documentation Overview"},y="RxDB Documentation",m={},g=[];function u(e){const t={h1:"h1",header:"header",...(0,i.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(t.header,{children:(0,l.jsx)(t.h1,{id:"rxdb-documentation",children:"RxDB Documentation"})}),"\n",(0,l.jsx)(n,{})]})}function x(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,l.jsx)(t,{...e,children:(0,l.jsx)(u,{...e})}):u(e)}},8342(e,t,a){a.d(t,{L$:()=>o,Z2:()=>i,zs:()=>l});var r="abcdefghijklmnopqrstuvwxyz";function l(e=10){for(var t="",a=0;ao,x:()=>c});var r=a(6540);const l={},i=r.createContext(l);function o(e){const t=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:o(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/1e0353aa.bd262216.js b/docs/assets/js/1e0353aa.bd262216.js deleted file mode 100644 index c6316ac1149..00000000000 --- a/docs/assets/js/1e0353aa.bd262216.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[8588],{2219(e,r,s){s.r(r),s.d(r,{assets:()=>l,contentTitle:()=>t,default:()=>c,frontMatter:()=>i,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"rx-storage","title":"\u2699\ufe0f RxStorage Layer - Choose the Perfect RxDB Storage for Every Use Case","description":"Discover how RxDB\'s modular RxStorage lets you swap engines and unlock top performance, no matter the environment or use case.","source":"@site/docs/rx-storage.md","sourceDirName":".","slug":"/rx-storage.html","permalink":"/rx-storage.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"\u2699\ufe0f RxStorage Layer - Choose the Perfect RxDB Storage for Every Use Case","slug":"rx-storage.html","description":"Discover how RxDB\'s modular RxStorage lets you swap engines and unlock top performance, no matter the environment or use case."},"sidebar":"tutorialSidebar","previous":{"title":"RxQuery","permalink":"/rx-query.html"},"next":{"title":"LocalStorage (Browser)","permalink":"/rx-storage-localstorage.html"}}');var a=s(4848),n=s(8453);const i={title:"\u2699\ufe0f RxStorage Layer - Choose the Perfect RxDB Storage for Every Use Case",slug:"rx-storage.html",description:"Discover how RxDB's modular RxStorage lets you swap engines and unlock top performance, no matter the environment or use case."},t="RxStorage",l={},d=[{value:"Quick Recommendations",id:"quick-recommendations",level:2},{value:"Configuration Examples",id:"configuration-examples",level:2},{value:"Storing much data in a browser securely",id:"storing-much-data-in-a-browser-securely",level:3},{value:"High query Load",id:"high-query-load",level:3},{value:"Low Latency on Writes and Simple Reads",id:"low-latency-on-writes-and-simple-reads",level:3},{value:"All RxStorage Implementations List",id:"all-rxstorage-implementations-list",level:2},{value:"Memory",id:"memory",level:3},{value:"LocalStorage",id:"localstorage",level:3},{value:"\ud83d\udc51 IndexedDB",id:"-indexeddb",level:3},{value:"\ud83d\udc51 OPFS",id:"-opfs",level:3},{value:"\ud83d\udc51 Filesystem Node",id:"-filesystem-node",level:3},{value:"Storage Wrapper Plugins",id:"storage-wrapper-plugins",level:3},{value:"\ud83d\udc51 Worker",id:"-worker",level:4},{value:"\ud83d\udc51 SharedWorker",id:"-sharedworker",level:4},{value:"Remote",id:"remote",level:4},{value:"\ud83d\udc51 Sharding",id:"-sharding",level:4},{value:"\ud83d\udc51 Memory Mapped",id:"-memory-mapped",level:4},{value:"\ud83d\udc51 Localstorage Meta Optimizer",id:"-localstorage-meta-optimizer",level:4},{value:"Electron IpcRenderer & IpcMain",id:"electron-ipcrenderer--ipcmain",level:4},{value:"Third Party based Storages",id:"third-party-based-storages",level:3},{value:"\ud83d\udc51 SQLite",id:"-sqlite",level:4},{value:"Dexie.js",id:"dexiejs",level:4},{value:"MongoDB",id:"mongodb",level:4},{value:"DenoKV",id:"denokv",level:4},{value:"FoundationDB",id:"foundationdb",level:4}];function h(e){const r={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(r.header,{children:(0,a.jsx)(r.h1,{id:"rxstorage",children:"RxStorage"})}),"\n",(0,a.jsxs)(r.p,{children:["RxDB is not a self contained database. Instead the data is stored in an implementation of the ",(0,a.jsx)(r.a,{href:"https://github.com/pubkey/rxdb/blob/master/src/types/rx-storage.interface.d.ts",children:"RxStorage interface"}),". This allows you to ",(0,a.jsx)(r.strong,{children:"switch out"})," the underlying data layer, depending on the JavaScript environment and performance requirements. For example you can use the SQLite storage for a capacitor app or you can use the LocalStorage RxStorage to store data in localstorage in a browser based application. There are also storages for other JavaScript runtimes like Node.js, React-Native, NativeScript and more."]}),"\n",(0,a.jsx)(r.h2,{id:"quick-recommendations",children:"Quick Recommendations"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsxs)(r.li,{children:["In the Browser: Use the ",(0,a.jsx)(r.a,{href:"/rx-storage-localstorage.html",children:"LocalStorage"})," storage for simple setup and small build size. For bigger datasets, use either the ",(0,a.jsx)(r.a,{href:"/rx-storage-dexie.html",children:"dexie.js storage"})," (free) or the ",(0,a.jsx)(r.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB RxStorage"})," if you have ",(0,a.jsx)(r.a,{href:"/premium/",children:"\ud83d\udc51 premium access"})," which is a bit faster and has a smaller build size."]}),"\n",(0,a.jsxs)(r.li,{children:["In ",(0,a.jsx)(r.a,{href:"/electron-database.html",children:"Electron"})," and ",(0,a.jsx)(r.a,{href:"/react-native-database.html",children:"ReactNative"}),": Use the ",(0,a.jsx)(r.a,{href:"/rx-storage-sqlite.html",children:"SQLite RxStorage"})," if you have ",(0,a.jsx)(r.a,{href:"/premium/",children:"\ud83d\udc51 premium access"})," or the ",(0,a.jsx)(r.a,{href:"/rx-storage-sqlite.html",children:"trial-SQLite RxStorage"})," for tryouts."]}),"\n",(0,a.jsxs)(r.li,{children:["In Capacitor: Use the ",(0,a.jsx)(r.a,{href:"/rx-storage-sqlite.html",children:"SQLite RxStorage"})," if you have ",(0,a.jsx)(r.a,{href:"/premium/",children:"\ud83d\udc51 premium access"}),", otherwise use the ",(0,a.jsx)(r.a,{href:"/rx-storage-localstorage.html",children:"localStorage"})," storage."]}),"\n"]}),"\n",(0,a.jsx)(r.h2,{id:"configuration-examples",children:"Configuration Examples"}),"\n",(0,a.jsx)(r.p,{children:"The RxStorage layer of RxDB is very flexible. Here are some examples on how to configure more complex settings:"}),"\n",(0,a.jsx)(r.h3,{id:"storing-much-data-in-a-browser-securely",children:"Storing much data in a browser securely"}),"\n",(0,a.jsx)(r.p,{children:"Lets say you build a browser app that needs to store a big amount of data as secure as possible. Here we can use a combination of the storages (encryption, IndexedDB, compression, schema-checks) that increase security and reduce the stored data size."}),"\n",(0,a.jsxs)(r.p,{children:["We use the schema-validation on the top level to ensure schema-errors are clearly readable and do not contain ",(0,a.jsx)(r.a,{href:"/encryption.html",children:"encrypted"}),"/",(0,a.jsx)(r.a,{href:"/key-compression.html",children:"compressed"})," data. The encryption is used inside of the compression because encryption of compressed data is more efficient."]}),"\n",(0,a.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,a.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { wrappedValidateAjvStorage } "}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/validate-ajv'"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { wrappedKeyCompressionStorage } "}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/key-compression'"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { wrappedKeyEncryptionCryptoJsStorage } "}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/encryption-crypto-js'"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageIndexedDB } "}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-indexeddb'"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" wrappedValidateAjvStorage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" wrappedKeyCompressionStorage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" wrappedKeyEncryptionCryptoJsStorage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(r.h3,{id:"high-query-load",children:"High query Load"}),"\n",(0,a.jsxs)(r.p,{children:["Also we can utilize a combination of storages to create a database that is optimized to run complex queries on the data really fast. Here we use the sharding storage together with the worker storage. This allows to run queries in parallel multithreading instead of a single JavaScript process. Because the worker initialization can slow down the initial page load, we also use the ",(0,a.jsx)(r.a,{href:"/rx-storage-localstorage-meta-optimizer.html",children:"localstorage-meta-optimizer"})," to improve initialization time."]}),"\n",(0,a.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,a.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageSharding } "}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-sharding'"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageWorker } "}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-worker'"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageIndexedDB } "}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-indexeddb'"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { getLocalstorageMetaOptimizerRxStorage } "}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-localstorage-meta-optimizer'"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getLocalstorageMetaOptimizerRxStorage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSharding"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageWorker"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" workerInput"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'path/to/worker.js'"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(r.h3,{id:"low-latency-on-writes-and-simple-reads",children:"Low Latency on Writes and Simple Reads"}),"\n",(0,a.jsx)(r.p,{children:"Here we create a storage configuration that is optimized to have a low latency on simple reads and writes. It uses the memory-mapped storage to fetch and store data in memory. For persistence the OPFS storage is used in the main thread which has lower latency for fetching big chunks of data when at initialization the data is loaded from disc into memory. We do not use workers because sending data from the main thread to workers and backwards would increase the latency."}),"\n",(0,a.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,a.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { getLocalstorageMetaOptimizerRxStorage } "}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-localstorage-meta-optimizer'"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { getMemoryMappedRxStorage } "}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-memory-mapped'"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageOPFSMainThread } "}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-worker'"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getLocalstorageMetaOptimizerRxStorage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getMemoryMappedRxStorage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageOPFSMainThread"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(r.h2,{id:"all-rxstorage-implementations-list",children:"All RxStorage Implementations List"}),"\n",(0,a.jsx)(r.h3,{id:"memory",children:"Memory"}),"\n",(0,a.jsxs)(r.p,{children:["A storage that stores the data in as plain data in the memory of the JavaScript process. Really fast and can be used in all environments. ",(0,a.jsx)(r.a,{href:"/rx-storage-memory.html",children:"Read more"})]}),"\n",(0,a.jsx)(r.h3,{id:"localstorage",children:"LocalStorage"}),"\n",(0,a.jsxs)(r.p,{children:["The localstroage based storage stores the data inside of a browsers ",(0,a.jsx)(r.a,{href:"/articles/localstorage.html",children:"localStorage API"}),". It is the easiest to set up and has a small bundle size. ",(0,a.jsx)(r.strong,{children:"If you are new to RxDB, you should start with the LocalStorage RxStorage"}),". ",(0,a.jsx)(r.a,{href:"/rx-storage-localstorage.html",children:"Read more"})]}),"\n",(0,a.jsx)(r.h3,{id:"-indexeddb",children:"\ud83d\udc51 IndexedDB"}),"\n",(0,a.jsxs)(r.p,{children:["The IndexedDB ",(0,a.jsx)(r.code,{children:"RxStorage"})," is based on plain IndexedDB. For most use cases, this has the best performance together with the OPFS storage. ",(0,a.jsx)(r.a,{href:"/rx-storage-indexeddb.html",children:"Read more"})]}),"\n",(0,a.jsx)(r.h3,{id:"-opfs",children:"\ud83d\udc51 OPFS"}),"\n",(0,a.jsxs)(r.p,{children:["The OPFS ",(0,a.jsx)(r.code,{children:"RxStorage"})," is based on the File System Access API. This has the best performance of all other non-in-memory storage, when RxDB is used inside of a browser. ",(0,a.jsx)(r.a,{href:"/rx-storage-opfs.html",children:"Read more"})]}),"\n",(0,a.jsx)(r.h3,{id:"-filesystem-node",children:"\ud83d\udc51 Filesystem Node"}),"\n",(0,a.jsxs)(r.p,{children:["The Filesystem Node storage is best suited when you use RxDB in a Node.js process or with ",(0,a.jsx)(r.a,{href:"/electron.html",children:"electron.js"}),". ",(0,a.jsx)(r.a,{href:"/rx-storage-filesystem-node.html",children:"Read more"})]}),"\n",(0,a.jsx)(r.h3,{id:"storage-wrapper-plugins",children:"Storage Wrapper Plugins"}),"\n",(0,a.jsx)(r.h4,{id:"-worker",children:"\ud83d\udc51 Worker"}),"\n",(0,a.jsxs)(r.p,{children:["The worker RxStorage is a wrapper around any other RxStorage which allows to run the storage in a WebWorker (in browsers) or a Worker Thread (in Node.js). By doing so, you can take CPU load from the main process and move it into the worker's process which can improve the perceived performance of your application. ",(0,a.jsx)(r.a,{href:"/rx-storage-worker.html",children:"Read more"})]}),"\n",(0,a.jsx)(r.h4,{id:"-sharedworker",children:"\ud83d\udc51 SharedWorker"}),"\n",(0,a.jsxs)(r.p,{children:["The worker RxStorage is a wrapper around any other RxStorage which allows to run the storage in a SharedWorker (only in browsers). By doing so, you can take CPU load from the main process and move it into the worker's process which can improve the perceived performance of your application. ",(0,a.jsx)(r.a,{href:"/rx-storage-shared-worker.html",children:"Read more"})]}),"\n",(0,a.jsx)(r.h4,{id:"remote",children:"Remote"}),"\n",(0,a.jsxs)(r.p,{children:["The Remote RxStorage is made to use a remote storage and communicate with it over an asynchronous message channel. The remote part could be on another JavaScript process or even on a different host machine. Mostly used internally in other storages like Worker or Electron-ipc. ",(0,a.jsx)(r.a,{href:"/rx-storage-remote.html",children:"Read more"})]}),"\n",(0,a.jsx)(r.h4,{id:"-sharding",children:"\ud83d\udc51 Sharding"}),"\n",(0,a.jsxs)(r.p,{children:["On some ",(0,a.jsx)(r.code,{children:"RxStorage"})," implementations (like IndexedDB), a huge performance improvement can be done by sharding the documents into multiple database instances. With the sharding plugin you can wrap any other ",(0,a.jsx)(r.code,{children:"RxStorage"})," into a sharded storage. ",(0,a.jsx)(r.a,{href:"/rx-storage-sharding.html",children:"Read more"})]}),"\n",(0,a.jsx)(r.h4,{id:"-memory-mapped",children:"\ud83d\udc51 Memory Mapped"}),"\n",(0,a.jsxs)(r.p,{children:["The memory-mapped ",(0,a.jsx)(r.a,{href:"/rx-storage.html",children:"RxStorage"})," is a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance stores its data in an underlying storage for persistence.\nThe main reason to use this is to improve query/write performance while still having the data stored on disc. ",(0,a.jsx)(r.a,{href:"/rx-storage-memory-mapped.html",children:"Read more"})]}),"\n",(0,a.jsx)(r.h4,{id:"-localstorage-meta-optimizer",children:"\ud83d\udc51 Localstorage Meta Optimizer"}),"\n",(0,a.jsxs)(r.p,{children:["The ",(0,a.jsx)(r.a,{href:"/rx-storage.html",children:"RxStorage"})," Localstorage Meta Optimizer is a wrapper around any other RxStorage. The wrapper uses the original RxStorage for normal collection documents. But to optimize the initial page load time, it uses ",(0,a.jsx)(r.a,{href:"/articles/localstorage.html",children:"localstorage"})," to store the plain key-value metadata that RxDB needs to create databases and collections. This plugin can only be used in browsers. ",(0,a.jsx)(r.a,{href:"/rx-storage-localstorage-meta-optimizer.html",children:"Read more"})]}),"\n",(0,a.jsx)(r.h4,{id:"electron-ipcrenderer--ipcmain",children:"Electron IpcRenderer & IpcMain"}),"\n",(0,a.jsxs)(r.p,{children:["To use RxDB in ",(0,a.jsx)(r.a,{href:"/electron-database.html",children:"electron"}),", it is recommended to run the RxStorage in the main process and the RxDatabase in the renderer processes. With the rxdb electron plugin you can create a remote RxStorage and consume it from the renderer process. ",(0,a.jsx)(r.a,{href:"/electron.html",children:"Read more"})]}),"\n",(0,a.jsx)(r.h3,{id:"third-party-based-storages",children:"Third Party based Storages"}),"\n",(0,a.jsx)(r.h4,{id:"-sqlite",children:"\ud83d\udc51 SQLite"}),"\n",(0,a.jsxs)(r.p,{children:["The SQLite storage has great performance when RxDB is used on ",(0,a.jsx)(r.strong,{children:"Node.js"}),", ",(0,a.jsx)(r.strong,{children:"Electron"}),", ",(0,a.jsx)(r.strong,{children:"React Native"}),", ",(0,a.jsx)(r.strong,{children:"Cordova"})," or ",(0,a.jsx)(r.strong,{children:"Capacitor"}),". ",(0,a.jsx)(r.a,{href:"/rx-storage-sqlite.html",children:"Read more"})]}),"\n",(0,a.jsx)(r.h4,{id:"dexiejs",children:"Dexie.js"}),"\n",(0,a.jsxs)(r.p,{children:["The Dexie.js based storage is based on the Dexie.js IndexedDB wrapper library. ",(0,a.jsx)(r.a,{href:"/rx-storage-dexie.html",children:"Read more"})]}),"\n",(0,a.jsx)(r.h4,{id:"mongodb",children:"MongoDB"}),"\n",(0,a.jsxs)(r.p,{children:["To use RxDB on the server side, the MongoDB RxStorage provides a way of having a secure, scalable and performant storage based on the popular MongoDB NoSQL database ",(0,a.jsx)(r.a,{href:"/rx-storage-mongodb.html",children:"Read more"})]}),"\n",(0,a.jsx)(r.h4,{id:"denokv",children:"DenoKV"}),"\n",(0,a.jsxs)(r.p,{children:["To use RxDB in Deno. The DenoKV RxStorage provides a way of having a secure, scalable and performant storage based on the Deno Key Value Store. ",(0,a.jsx)(r.a,{href:"/rx-storage-denokv.html",children:"Read more"})]}),"\n",(0,a.jsx)(r.h4,{id:"foundationdb",children:"FoundationDB"}),"\n",(0,a.jsxs)(r.p,{children:["To use RxDB on the server side, the FoundationDB RxStorage provides a way of having a secure, fault-tolerant and performant storage. ",(0,a.jsx)(r.a,{href:"/rx-storage-foundationdb.html",children:"Read more"})]})]})}function c(e={}){const{wrapper:r}={...(0,n.R)(),...e.components};return r?(0,a.jsx)(r,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},8453(e,r,s){s.d(r,{R:()=>i,x:()=>t});var o=s(6540);const a={},n=o.createContext(a);function i(e){const r=o.useContext(n);return o.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function t(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),o.createElement(n.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/1f391b9e.825d8c20.js b/docs/assets/js/1f391b9e.825d8c20.js deleted file mode 100644 index 80daef6114e..00000000000 --- a/docs/assets/js/1f391b9e.825d8c20.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[6061],{7973(e,a,t){t.r(a),t.d(a,{default:()=>p});t(6540);var s=t(4164),d=t(5500),r=t(7559),i=t(8711),l=t(7910),n=t(7763),c=t(6896),o=t(2153);const m="mdxPageWrapper_j9I6";var x=t(4848);function p(e){const{content:a}=e,{metadata:t,assets:p}=a,{title:g,editUrl:h,description:j,frontMatter:A,lastUpdatedBy:v,lastUpdatedAt:u}=t,{keywords:_,wrapperClassName:b,hide_table_of_contents:w}=A,f=p.image??A.image,y=!!(h||u||v);return(0,x.jsx)(d.e3,{className:(0,s.A)(b??r.G.wrapper.mdxPages,r.G.page.mdxPage),children:(0,x.jsxs)(i.A,{children:[(0,x.jsx)(d.be,{title:g,description:j,keywords:_,image:f}),(0,x.jsx)("main",{className:"container container--fluid margin-vert--lg",children:(0,x.jsxs)("div",{className:(0,s.A)("row",m),children:[(0,x.jsxs)("div",{className:(0,s.A)("col",!w&&"col--8"),children:[(0,x.jsx)(c.A,{metadata:t}),(0,x.jsx)("article",{children:(0,x.jsx)(l.A,{children:(0,x.jsx)(a,{})})}),y&&(0,x.jsx)(o.A,{className:(0,s.A)("margin-top--sm",r.G.pages.pageFooterEditMetaRow),editUrl:h,lastUpdatedAt:u,lastUpdatedBy:v})]}),!w&&a.toc.length>0&&(0,x.jsx)("div",{className:"col col--2",children:(0,x.jsx)(n.A,{toc:a.toc,minHeadingLevel:A.toc_min_heading_level,maxHeadingLevel:A.toc_max_heading_level})})]})})]})})}},9057(e,a,t){t.d(a,{A:()=>n});var s=t(6540),d=t(8759),r=t(3230),i=t(8601),l=t(4848);const n={...d.A,code:function(e){return void 0!==e.children&&s.Children.toArray(e.children).every(e=>"string"==typeof e&&!e.includes("\n"))?(0,l.jsx)(r.A,{...e}):(0,l.jsx)("code",{...e})},pre:i.A}}}]); \ No newline at end of file diff --git a/docs/assets/js/21fa2740.44a7d1df.js b/docs/assets/js/21fa2740.44a7d1df.js deleted file mode 100644 index 76d3292bade..00000000000 --- a/docs/assets/js/21fa2740.44a7d1df.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[5694],{8351(e,n,r){r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>c,frontMatter:()=>o,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"releases/15.0.0","title":"RxDB 15.0.0 - Major Migration Overhaul","description":"Discover RxDB 15.0.0, featuring new migration strategies, replication improvements, and lightning-fast performance to supercharge your app.","source":"@site/docs/releases/15.0.0.md","sourceDirName":"releases","slug":"/releases/15.0.0.html","permalink":"/releases/15.0.0.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB 15.0.0 - Major Migration Overhaul","slug":"15.0.0.html","description":"Discover RxDB 15.0.0, featuring new migration strategies, replication improvements, and lightning-fast performance to supercharge your app."},"sidebar":"tutorialSidebar","previous":{"title":"16.0.0","permalink":"/releases/16.0.0.html"},"next":{"title":"14.0.0","permalink":"/releases/14.0.0.html"}}');var i=r(4848),s=r(8453);const o={title:"RxDB 15.0.0 - Major Migration Overhaul",slug:"15.0.0.html",description:"Discover RxDB 15.0.0, featuring new migration strategies, replication improvements, and lightning-fast performance to supercharge your app."},a="15.0.0",l={},d=[{value:"LinkedIn",id:"linkedin",level:2},{value:"Performance",id:"performance",level:2},{value:"Replication",id:"replication",level:2},{value:"Rewrite schema version migration",id:"rewrite-schema-version-migration",level:2},{value:"Set eventReduce:true as default",id:"set-eventreducetrue-as-default",level:2},{value:"Use crypto.subtle.digest for hashing",id:"use-cryptosubtledigest-for-hashing",level:2},{value:"Fix attachment hashing",id:"fix-attachment-hashing",level:2},{value:"Requires at least typescript version 5.0.0",id:"requires-at-least-typescript-version-500",level:2},{value:"Require string based $regex",id:"require-string-based-regex",level:2},{value:"Refactor dexie.js RxStorage",id:"refactor-dexiejs-rxstorage",level:2},{value:"RxLocalDocument.$ emits a document instance, not the plain data",id:"rxlocaldocument-emits-a-document-instance-not-the-plain-data",level:2},{value:"Fix return type of .bulkUpsert",id:"fix-return-type-of-bulkupsert",level:2},{value:"Add dev-mode check for disallowed $ref fields",id:"add-dev-mode-check-for-disallowed-ref-fields",level:2},{value:"Improve RxDocument property access performance",id:"improve-rxdocument-property-access-performance",level:2},{value:"Add deno support",id:"add-deno-support",level:2},{value:"Memory RxStorage",id:"memory-rxstorage",level:2},{value:"Memory-Synced storage no longer supports replication+migration",id:"memory-synced-storage-no-longer-supports-replicationmigration",level:2},{value:"Added Logger Plugin",id:"added-logger-plugin",level:2},{value:"Documentation is now served by docusaurus",id:"documentation-is-now-served-by-docusaurus",level:2},{value:"Replaced modfijs with mingo package",id:"replaced-modfijs-with-mingo-package",level:2},{value:"Changes to the RxStorage interface",id:"changes-to-the-rxstorage-interface",level:2},{value:"Other changes",id:"other-changes",level:2},{value:"Changes to the \ud83d\udc51 Premium Plugins",id:"changes-to-the--premium-plugins",level:2},{value:"storage-migration plugin moved from premium to open-core",id:"storage-migration-plugin-moved-from-premium-to-open-core",level:3},{value:"Changes in pricing",id:"changes-in-pricing",level:3},{value:"Added perpetual license option",id:"added-perpetual-license-option",level:3},{value:"You can help!",id:"you-can-help",level:2}];function h(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"1500",children:"15.0.0"})}),"\n",(0,i.jsxs)(n.p,{children:["The release ",(0,i.jsx)(n.a,{href:"https://rxdb.info/releases/15.0.0.html",children:"15.0.0"})," is used for major refactorings in the migration plugins and performance improvements of the RxStorage implementations."]}),"\n",(0,i.jsx)(n.h2,{id:"linkedin",children:"LinkedIn"}),"\n",(0,i.jsxs)(n.p,{children:["Stay connected with the latest updates and network with professionals in the RxDB community by following RxDB's ",(0,i.jsx)(n.a,{href:"https://www.linkedin.com/company/rxdb",children:"official LinkedIn page"}),"!"]}),"\n",(0,i.jsx)(n.h2,{id:"performance",children:"Performance"}),"\n",(0,i.jsxs)(n.p,{children:["Performance has improved a lot. Much work has been done to reduce the CPU footprint of RxDB so that when writes and reads are performed on the database, the JavaScript process can start updating the UI much faster.\nAlso there have been a lot of improvements to the ",(0,i.jsx)(n.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB RxStorage"})," which now runs in a ",(0,i.jsx)(n.strong,{children:"Write-Ahead Logging (WAL)"})," mode which makes write operations about 4x as fast.\nThe whole RxStorage interface has been optimized so that it has to run less operations which improves overall performance. ",(0,i.jsx)(n.a,{href:"/rx-storage-performance.html",children:"Read more"})]}),"\n",(0,i.jsx)("a",{href:"../rx-storage-performance.html",children:(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"../files/rx-storage-performance-browser.png",alt:"RxStorage performance - browser",width:"600"})})}),"\n",(0,i.jsx)(n.h2,{id:"replication",children:"Replication"}),"\n",(0,i.jsxs)(n.p,{children:["Replication options (like url), are no longer used as replication state identifier. Changing the url without having to restart the replication, is now possible. This is useful if you change your replication url (like ",(0,i.jsx)(n.code,{children:"path/v3/"}),") on schema changes and you do not want to restart the replication from scratch. You can even swap the replication plugin while still keeping the replication state. The ",(0,i.jsx)(n.a,{href:"/replication-couchdb.html",children:"couchdb replication"})," now also requires an ",(0,i.jsx)(n.code,{children:"replicationIdentifier"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["The replication meta data is now also compressed when the ",(0,i.jsx)(n.a,{href:"/key-compression.html",children:"KeyCompression Plugin"})," is used."]}),"\n",(0,i.jsx)(n.p,{children:"The replication-protocol does now support attachment replication. This clears the path to add the attachment replication to the other RxDB replication plugins."}),"\n",(0,i.jsx)(n.h2,{id:"rewrite-schema-version-migration",children:"Rewrite schema version migration"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.a,{href:"/migration-schema.html",children:"schema migration plugin"})," has been fully rewritten from scratch."]}),"\n",(0,i.jsx)(n.p,{children:"From now on it internally uses the replication protocol to do a one-time replication from the old collection to the new one. This makes the code more simple and ensures that canceled migrations (when the user closes the browser), can continue from the correct position."}),"\n",(0,i.jsxs)(n.p,{children:["Replication states from the ",(0,i.jsx)(n.a,{href:"/replication.html",children:"RxReplication"})," are also migrated together with the normal data.\nPreviously a migration dropped the replication state which required a new replication of all data from scratch, even if the\nclient already had the same data as the server. Now the ",(0,i.jsx)(n.code,{children:"assumedMasterState"})," and ",(0,i.jsx)(n.code,{children:"checkpoint"})," are also migrated so that\nthe replication will continue from where it was before the migration has run."]}),"\n",(0,i.jsx)(n.p,{children:"Also it now handles multi-instance runtimes correctly. If multiple browser tabs are open, only one of them (per RxCollection) will run the migration.\nMigration state events are propagated across browser tabs."}),"\n",(0,i.jsxs)(n.p,{children:["Documents with ",(0,i.jsx)(n.code,{children:"_deleted: true"})," will also be migrated. This ensures that non-pushed deletes are not dropped during migrations and will\nstill be replicated if the client goes online again."]}),"\n",(0,i.jsxs)(n.h2,{id:"set-eventreducetrue-as-default",children:["Set ",(0,i.jsx)(n.code,{children:"eventReduce:true"})," as default"]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/event-reduce",children:"EventReduce algorithm"})," is now enabled by default."]}),"\n",(0,i.jsxs)(n.h2,{id:"use-cryptosubtledigest-for-hashing",children:["Use ",(0,i.jsx)(n.code,{children:"crypto.subtle.digest"})," for hashing"]}),"\n",(0,i.jsxs)(n.p,{children:["Using ",(0,i.jsx)(n.code,{children:"crypto.subtle.digest"})," from the native WebCrypto API is much faster, so RxDB now uses that as a default. If the API is not available, like in React-Native, the ",(0,i.jsx)(n.a,{href:"https://github.com/unjs/ohash",children:"ohash"})," module is used instead. Also any custom ",(0,i.jsx)(n.code,{children:"hashFunction"})," can be provided when creating the ",(0,i.jsx)(n.a,{href:"/rx-database.html",children:"RxDatabase"}),". The ",(0,i.jsx)(n.code,{children:"hashFunction"})," must now be async and return a Promise."]}),"\n",(0,i.jsx)(n.h2,{id:"fix-attachment-hashing",children:"Fix attachment hashing"}),"\n",(0,i.jsxs)(n.p,{children:["Hashing of attachment data to calculate the ",(0,i.jsx)(n.code,{children:"digest"})," is now done from the RxDB side, not the RxStorage. If you set a custom ",(0,i.jsx)(n.code,{children:"hashFunction"})," for the database, it will also be used for attachments ",(0,i.jsx)(n.code,{children:"digest"})," meta data."]}),"\n",(0,i.jsx)(n.h2,{id:"requires-at-least-typescript-version-500",children:"Requires at least typescript version 5.0.0"}),"\n",(0,i.jsxs)(n.p,{children:["We now use ",(0,i.jsx)(n.code,{children:"export type * from './types';"})," so RxDB will not work on typescript versions older than 5.0.0."]}),"\n",(0,i.jsxs)(n.h2,{id:"require-string-based-regex",children:["Require string based ",(0,i.jsx)(n.code,{children:"$regex"})]}),"\n",(0,i.jsxs)(n.p,{children:["Queries with a ",(0,i.jsx)(n.code,{children:"$regex"})," operator must now be defined as strings, not with ",(0,i.jsx)(n.code,{children:"RegExp"})," objects. You can still pass RegExp's flags in ",(0,i.jsx)(n.code,{children:"$options"})," parameter. ",(0,i.jsx)(n.code,{children:"RegExp"})," are mutable objects, which was dangerous and caused hard-to-debug problems.\nAlso stringification of the $regex had bad performance but is required to send queries from RxDB to the RxStorage."]}),"\n",(0,i.jsx)(n.h2,{id:"refactor-dexiejs-rxstorage",children:"Refactor dexie.js RxStorage"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.a,{href:"/rx-storage-dexie.html",children:"dexie.js storage"})," was refactored to add some missing features:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/rx-attachment.html",children:"Attachment"})," support"]}),"\n",(0,i.jsx)(n.li,{children:"Support for boolean indexes"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"rxlocaldocument-emits-a-document-instance-not-the-plain-data",children:"RxLocalDocument.$ emits a document instance, not the plain data"}),"\n",(0,i.jsxs)(n.p,{children:["This was changed in ",(0,i.jsx)(n.a,{href:"/releases/14.0.0.html",children:"v14"})," for a normal RxDocument.$ which emits RxDocument instances. Same is now also done for ",(0,i.jsx)(n.a,{href:"/rx-local-document.html",children:"local documents"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"fix-return-type-of-bulkupsert",children:"Fix return type of .bulkUpsert"}),"\n",(0,i.jsxs)(n.p,{children:["Equal to other bulk operations, ",(0,i.jsx)(n.code,{children:"bulkUpsert"})," will now return an ",(0,i.jsx)(n.code,{children:"error"})," and a ",(0,i.jsx)(n.code,{children:"success"})," array. This allows to filter for validation errors and handle them properly."]}),"\n",(0,i.jsx)(n.h2,{id:"add-dev-mode-check-for-disallowed-ref-fields",children:"Add dev-mode check for disallowed $ref fields"}),"\n",(0,i.jsxs)(n.p,{children:["RxDB cannot resolve ",(0,i.jsx)(n.code,{children:"$ref"})," fields in the schema because it would have a negative performance impact.\nWe now have a dev-mode check to throw a helpful error message if $refs are used in the schema."]}),"\n",(0,i.jsx)(n.h2,{id:"improve-rxdocument-property-access-performance",children:"Improve RxDocument property access performance"}),"\n",(0,i.jsxs)(n.p,{children:["We now use the Proxy API instead of defining getters on each nested property. Also fixed ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/pull/4949",children:"#4949"})]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"patternProperties"})," is now allowed on the non-top-level of a schema ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/pull/4951",children:"#4951"})]}),"\n",(0,i.jsx)(n.h2,{id:"add-deno-support",children:"Add deno support"}),"\n",(0,i.jsxs)(n.p,{children:["The RxDB test suite now also runs in the ",(0,i.jsx)(n.a,{href:"https://deno.com/",children:"deno"})," runtime. Also there is a ",(0,i.jsx)(n.a,{href:"https://rxdb.info/rx-storage-denokv.html",children:"DenoKV"})," based RxStorage to use with Deno Deploy."]}),"\n",(0,i.jsx)(n.h2,{id:"memory-rxstorage",children:"Memory RxStorage"}),"\n",(0,i.jsxs)(n.p,{children:["Rewrites of the ",(0,i.jsx)(n.a,{href:"/rx-storage-memory.html",children:"Memory RxStorage"})," for better performance."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Writes are 3x faster"}),"\n",(0,i.jsx)(n.li,{children:"Find-by id is 2x faster"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"memory-synced-storage-no-longer-supports-replicationmigration",children:"Memory-Synced storage no longer supports replication+migration"}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.a,{href:"/rx-storage-memory-synced.html",children:"memory-synced storage"})," itself does not support replication and migration. This was allowed in the past, but dangerous so now there is an error that throws.\nInstead you should replicate the underlying parent storage. Notice that this is only for the ",(0,i.jsx)(n.a,{href:"/rx-storage-memory-synced.html",children:"memory-synced storage"}),", NOT for the normal ",(0,i.jsx)(n.a,{href:"/rx-storage-memory.html",children:"memory storage"}),". There the replication works like before."]}),"\n",(0,i.jsx)(n.h2,{id:"added-logger-plugin",children:"Added Logger Plugin"}),"\n",(0,i.jsxs)(n.p,{children:["I added a ",(0,i.jsx)(n.a,{href:"/logger.html",children:"logger plugin"})," to detect performance problems and errors."]}),"\n",(0,i.jsx)(n.h2,{id:"documentation-is-now-served-by-docusaurus",children:"Documentation is now served by docusaurus"}),"\n",(0,i.jsxs)(n.p,{children:["In the past we used gitbook which is no longer maintained and had some major issues. Now the documentation of RxDB is rendered and served with ",(0,i.jsx)(n.a,{href:"https://docusaurus.io/",children:"docusaurus"})," which has a better design and maintenance."]}),"\n",(0,i.jsxs)(n.h2,{id:"replaced-modfijs-with-mingo-package",children:["Replaced ",(0,i.jsx)(n.code,{children:"modfijs"})," with ",(0,i.jsx)(n.code,{children:"mingo"})," package"]}),"\n",(0,i.jsxs)(n.p,{children:["In the past, the ",(0,i.jsx)(n.a,{href:"https://github.com/lgandecki/modifyjs",children:"modifyjs"})," was used for the ",(0,i.jsx)(n.code,{children:"update"})," plugin. This was replaced with the ",(0,i.jsx)(n.a,{href:"https://github.com/kofrasa/mingo",children:"mingo library"})," which is more up to date and already used in RxDB for the query engine."]}),"\n",(0,i.jsx)(n.h2,{id:"changes-to-the-rxstorage-interface",children:"Changes to the RxStorage interface"}),"\n",(0,i.jsxs)(n.p,{children:["We no longer have ",(0,i.jsx)(n.code,{children:"RxStorage.statics.prepareQuery()"}),". Instead all storages get the same prepared query as input for the ",(0,i.jsx)(n.code,{children:".query()"})," method. If a storage requires some transformations, it has to do them by itself before running the query. This change simplifies the whole RxDB code base a lot and the previous assumption of having a better performance by pre-running the query preparation, turned out to be not true because the query planning is quite fast."]}),"\n",(0,i.jsxs)(n.p,{children:["Removed the ",(0,i.jsx)(n.code,{children:"RxStorage.statics"})," property. This makes configuration easier especially for the remote storage plugins."]}),"\n",(0,i.jsxs)(n.p,{children:["The RxStorage itself will now return ",(0,i.jsx)(n.code,{children:"_deleted=true"})," documents on the ",(0,i.jsx)(n.code,{children:".query()"})," method. This is required for upcoming plugins like the server plugin where it must be able to run queries on deleted documents.\nNotice that this is only for the RxStorage itself, RxDB queries will run like normal and NOT contain deleted documents in their results."]}),"\n",(0,i.jsx)(n.p,{children:"Changed the response type of RxStorageInstance.bulkWrite() from indexed (by id) objects to arrays for better performance."}),"\n",(0,i.jsx)(n.h2,{id:"other-changes",children:"Other changes"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Added ",(0,i.jsx)(n.code,{children:"RxCollection.cleanup()"})," to manually call the ",(0,i.jsx)(n.a,{href:"/cleanup.html",children:"cleanup functions"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Rename send$ to sent$: ",(0,i.jsx)(n.code,{children:"myRxReplicationState.send$.subscribe"})," works only if the sending is successful. Therefore, it is renamed to ",(0,i.jsx)(n.code,{children:"sent$"}),", not ",(0,i.jsx)(n.code,{children:"send$"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["We no longer ship ",(0,i.jsx)(n.code,{children:"dist/rxdb.browserify.js"})," and ",(0,i.jsx)(n.code,{children:"dist/rxdb.browserify.min.js"}),". If you need these, build them by yourself."]}),"\n",(0,i.jsx)(n.li,{children:"The example project for vanilla javascript was outdated. I removed it to no longer confuse new users."}),"\n",(0,i.jsxs)(n.li,{children:["REPLACE ",(0,i.jsx)(n.code,{children:"new Date().getTime()"})," with ",(0,i.jsx)(n.code,{children:"Date.now()"})," which is ",(0,i.jsx)(n.a,{href:"https://stackoverflow.com/questions/12517359/performance-date-now-vs-date-gettime",children:"2x faster"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Renamed replication-p2p to replication-webrtc. I will add more p2p replication plugins in the future, which are not based on ",(0,i.jsx)(n.a,{href:"/replication-webrtc.html",children:"WebRTC"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["REMOVED ",(0,i.jsx)(n.code,{children:"RxChangeEvent.eventId"}),". If you really need a unique ID, you can craft your own one based on the document ",(0,i.jsx)(n.code,{children:"_rev"})," and ",(0,i.jsx)(n.code,{children:"primary"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["REMOVED ",(0,i.jsx)(n.code,{children:"RxChangeEvent.startTime"})," and ",(0,i.jsx)(n.code,{children:"RxChangeEvent.endTime"})," so we do not have to call ",(0,i.jsx)(n.code,{children:"Date.now()"})," once per write row."]}),"\n",(0,i.jsxs)(n.li,{children:["ADDED ",(0,i.jsx)(n.code,{children:"EventBulk.startTime"})," and ",(0,i.jsx)(n.code,{children:"EventBulk.endTime"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["FIX ",(0,i.jsx)(n.code,{children:"database.remove()"})," does not work on databases with encrypted fields."]}),"\n",(0,i.jsxs)(n.li,{children:["FIX ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/pull/5187",children:"react-native: replaceAll is not a function"})]}),"\n",(0,i.jsx)(n.li,{children:"FIX Throttle calls to forkInstance on push-replication to not cause memory spikes and lagging UI"}),"\n",(0,i.jsxs)(n.li,{children:["FIX PushModifier applied to pre-change legacy document, resulting in old document sent to endpoint ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/issues/5256",children:"#5256"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/rx-attachment.html#attachment-compression",children:"Attachment compression"})," is now using the native ",(0,i.jsx)(n.code,{children:"Compression Streams API"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["FIX ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/issues/5311",children:"#5311"})," URL.createObjectURL is not a function in a browser plugin environment(background.js)"]}),"\n",(0,i.jsxs)(n.li,{children:["FIX ",(0,i.jsx)(n.code,{children:"structuredClone"})," not available in ReactNative ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/issues/5046#issuecomment-1827374498",children:"#5046"})]}),"\n",(0,i.jsxs)(n.li,{children:["The following things moved out of beta:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/replication-firestore.html",children:"Firestore replication"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/replication-webrtc.html",children:"WebRTC replication"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/replication-nats.html",children:"NATS replication"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/rx-storage-opfs.html",children:"OPFS RxStorage"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"changes-to-the--premium-plugins",children:"Changes to the \ud83d\udc51 Premium Plugins"}),"\n",(0,i.jsx)(n.h3,{id:"storage-migration-plugin-moved-from-premium-to-open-core",children:"storage-migration plugin moved from premium to open-core"}),"\n",(0,i.jsxs)(n.p,{children:["The storage migration plugin can be used to migrate data between different RxStorage implementation or to migrate data between major RxDB versions. This previously was a \ud83d\udc51 premium plugin, but now it is part of the open-core. Also the params syntax changed a bit ",(0,i.jsx)(n.a,{href:"/migration-storage.html",children:"read more"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"changes-in-pricing",children:"Changes in pricing"}),"\n",(0,i.jsx)(n.p,{children:"The pricing of the premium plugins was changed. This makes it cheaper for smaller companies and single individuals."}),"\n",(0,i.jsx)(n.h3,{id:"added-perpetual-license-option",children:"Added perpetual license option"}),"\n",(0,i.jsxs)(n.p,{children:["By default you are not allowed to use the premium plugins after the\nlicense has expired and you will no longer be able to install them. But\nyou can choose the ",(0,i.jsx)(n.strong,{children:"Perpetual license"})," option. With the perpetual\nlicense option, you can still use the plugins even after the license is\nexpired. But you will no longer get any updates from newer RxDB\nversions."]}),"\n",(0,i.jsx)(n.h2,{id:"you-can-help",children:"You can help!"}),"\n",(0,i.jsxs)(n.p,{children:["There are many things that can be done by ",(0,i.jsx)(n.strong,{children:"you"})," to improve RxDB:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Check the ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/blob/master/orga/BACKLOG.md",children:"BACKLOG"})," for features that would be great to have."]}),"\n",(0,i.jsxs)(n.li,{children:["Check the ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/blob/master/orga/before-next-major.md",children:"breaking backlog"})," for breaking changes that must be implemented in the future but where I did not have the time yet."]}),"\n",(0,i.jsxs)(n.li,{children:["Check the ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/search?q=todo",children:"todos"})," in the code. There are many small improvements that can be done for performance and build size."]}),"\n",(0,i.jsx)(n.li,{children:"Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors."}),"\n",(0,i.jsxs)(n.li,{children:["Update the ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples",children:"example projects"})," some of them are outdated and need updates."]}),"\n"]})]})}function c(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453(e,n,r){r.d(n,{R:()=>o,x:()=>a});var t=r(6540);const i={},s=t.createContext(i);function o(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/22dd74f7.8c39a7a2.js b/docs/assets/js/22dd74f7.8c39a7a2.js deleted file mode 100644 index 2803c7ebbf2..00000000000 --- a/docs/assets/js/22dd74f7.8c39a7a2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[1567],{5226(e){e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"Getting Started","collapsed":false,"items":[{"type":"link","href":"/overview.html","label":"Overview","docId":"overview","unlisted":false},{"type":"link","href":"/quickstart.html","label":"\ud83d\ude80 Quickstart","docId":"quickstart","unlisted":false},{"type":"link","href":"/install.html","label":"Installation","docId":"install","unlisted":false},{"type":"link","href":"/dev-mode.html","label":"Development Mode","docId":"dev-mode","unlisted":false},{"type":"link","href":"/tutorials/typescript.html","label":"TypeScript Setup","docId":"tutorials/typescript","unlisted":false}],"collapsible":true},{"type":"category","label":"Core Entities","collapsed":true,"items":[{"type":"link","href":"/rx-database.html","label":"RxDatabase","docId":"rx-database","unlisted":false},{"type":"link","href":"/rx-schema.html","label":"RxSchema","docId":"rx-schema","unlisted":false},{"type":"link","href":"/rx-collection.html","label":"RxCollection","docId":"rx-collection","unlisted":false},{"type":"link","href":"/rx-document.html","label":"RxDocument","docId":"rx-document","unlisted":false},{"type":"link","href":"/rx-query.html","label":"RxQuery","docId":"rx-query","unlisted":false}],"collapsible":true},{"type":"category","label":"\ud83d\udcbe Storages","items":[{"type":"link","href":"/rx-storage.html","label":"RxStorage Overview","docId":"rx-storage","unlisted":false},{"type":"link","href":"/rx-storage-localstorage.html","label":"LocalStorage (Browser)","docId":"rx-storage-localstorage","unlisted":false},{"type":"link","href":"/rx-storage-indexeddb.html","label":"IndexedDB \ud83d\udc51 (Browser, Capacitor)","docId":"rx-storage-indexeddb","unlisted":false},{"type":"link","href":"/rx-storage-opfs.html","label":"OPFS \ud83d\udc51 (Browser)","docId":"rx-storage-opfs","unlisted":false},{"type":"link","href":"/rx-storage-memory.html","label":"Memory","docId":"rx-storage-memory","unlisted":false},{"type":"link","href":"/rx-storage-filesystem-node.html","label":"Filesystem Node \ud83d\udc51 (Node.js)","docId":"rx-storage-filesystem-node","unlisted":false},{"type":"link","href":"/rx-storage-sqlite.html","label":"SQLite (Capacitor, React-Native, Expo, Tauri, Electron, Node.js)","docId":"rx-storage-sqlite","unlisted":false},{"type":"category","label":"Third Party Storages","items":[{"type":"link","href":"/rx-storage-dexie.html","label":"Dexie.js","docId":"rx-storage-dexie","unlisted":false},{"type":"link","href":"/rx-storage-mongodb.html","label":"MongoDB","docId":"rx-storage-mongodb","unlisted":false},{"type":"link","href":"/rx-storage-denokv.html","label":"DenoKV","docId":"rx-storage-denokv","unlisted":false},{"type":"link","href":"/rx-storage-foundationdb.html","label":"FoundationDB","docId":"rx-storage-foundationdb","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Storage Wrappers","items":[{"type":"link","href":"/schema-validation.html","label":"Schema Validation","docId":"schema-validation","unlisted":false},{"type":"link","href":"/encryption.html","label":"Encryption","docId":"encryption","unlisted":false},{"type":"link","href":"/key-compression.html","label":"Key Compression","docId":"key-compression","unlisted":false},{"type":"link","href":"/logger.html","label":"Logger \ud83d\udc51","docId":"logger","unlisted":false},{"type":"link","href":"/rx-storage-remote.html","label":"Remote RxStorage","docId":"rx-storage-remote","unlisted":false},{"type":"link","href":"/rx-storage-worker.html","label":"Worker RxStorage \ud83d\udc51","docId":"rx-storage-worker","unlisted":false},{"type":"link","href":"/rx-storage-shared-worker.html","label":"SharedWorker RxStorage \ud83d\udc51","docId":"rx-storage-shared-worker","unlisted":false},{"type":"link","href":"/rx-storage-memory-mapped.html","label":"Memory Mapped RxStorage \ud83d\udc51","docId":"rx-storage-memory-mapped","unlisted":false},{"type":"link","href":"/rx-storage-sharding.html","label":"Sharding \ud83d\udc51","docId":"rx-storage-sharding","unlisted":false},{"type":"link","href":"/rx-storage-localstorage-meta-optimizer.html","label":"Localstorage Meta Optimizer \ud83d\udc51","docId":"rx-storage-localstorage-meta-optimizer","unlisted":false},{"type":"link","href":"/electron.html","label":"Electron","docId":"electron","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"\ud83d\udd04 Replication","items":[{"type":"link","href":"/replication.html","label":"\u2699\ufe0f Sync Engine","docId":"replication","unlisted":false},{"type":"link","href":"/replication-http.html","label":"HTTP Replication","docId":"replication-http","unlisted":false},{"type":"link","href":"/replication-server.html","label":"RxServer Replication","docId":"replication-server","unlisted":false},{"type":"link","href":"/replication-graphql.html","label":"GraphQL Replication","docId":"replication-graphql","unlisted":false},{"type":"link","href":"/replication-websocket.html","label":"WebSocket Replication","docId":"replication-websocket","unlisted":false},{"type":"link","href":"/replication-couchdb.html","label":"CouchDB Replication","docId":"replication-couchdb","unlisted":false},{"type":"link","href":"/replication-webrtc.html","label":"WebRTC P2P Replication","docId":"replication-webrtc","unlisted":false},{"type":"link","href":"/replication-firestore.html","label":"Firestore Replication","docId":"replication-firestore","unlisted":false},{"type":"link","href":"/replication-mongodb.html","label":"MongoDB Replication","docId":"replication-mongodb","unlisted":false},{"type":"link","href":"/replication-supabase.html","label":"Supabase Replication","docId":"replication-supabase","unlisted":false},{"type":"link","href":"/replication-nats.html","label":"NATS Replication","docId":"replication-nats","unlisted":false},{"type":"link","href":"/replication-appwrite.html","label":"Appwrite Replication","docId":"replication-appwrite","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Server","items":[{"type":"link","href":"/rx-server.html","label":"RxServer","docId":"rx-server","unlisted":false},{"type":"link","href":"/rx-server-scaling.html","label":"RxServer Scaling","docId":"rx-server-scaling","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"How RxDB works","items":[{"type":"link","href":"/transactions-conflicts-revisions.html","label":"Transactions Conflicts Revisions","docId":"transactions-conflicts-revisions","unlisted":false},{"type":"link","href":"/query-cache.html","label":"Query Cache","docId":"query-cache","unlisted":false},{"type":"link","href":"/plugins.html","label":"Creating Plugins","docId":"plugins","unlisted":false},{"type":"link","href":"/errors.html","label":"Errors","docId":"errors","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Advanced Features","items":[{"type":"category","label":"Migration","items":[{"type":"link","href":"/migration-schema.html","label":"Schema Migration","docId":"migration-schema","unlisted":false},{"type":"link","href":"/migration-storage.html","label":"Storage Migration","docId":"migration-storage","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","href":"/rx-attachment.html","label":"Attachments","docId":"rx-attachment","unlisted":false},{"type":"link","href":"/rx-pipeline.html","label":"RxPipelines","docId":"rx-pipeline","unlisted":false},{"type":"link","href":"/reactivity.html","label":"Custom Reactivity","docId":"reactivity","unlisted":false},{"type":"link","href":"/rx-state.html","label":"RxState","docId":"rx-state","unlisted":false},{"type":"link","href":"/rx-local-document.html","label":"Local Documents","docId":"rx-local-document","unlisted":false},{"type":"link","href":"/cleanup.html","label":"Cleanup","docId":"cleanup","unlisted":false},{"type":"link","href":"/backup.html","label":"Backup","docId":"backup","unlisted":false},{"type":"link","href":"/leader-election.html","label":"Leader Election","docId":"leader-election","unlisted":false},{"type":"link","href":"/middleware.html","label":"Middleware","docId":"middleware","unlisted":false},{"type":"link","href":"/crdt.html","label":"CRDT","docId":"crdt","unlisted":false},{"type":"link","href":"/population.html","label":"Population","docId":"population","unlisted":false},{"type":"link","href":"/orm.html","label":"ORM","docId":"orm","unlisted":false},{"type":"link","href":"/fulltext-search.html","label":"Fulltext Search \ud83d\udc51","docId":"fulltext-search","unlisted":false},{"type":"link","href":"/articles/javascript-vector-database.html","label":"Vector Database","docId":"articles/javascript-vector-database","unlisted":false},{"type":"link","href":"/query-optimizer.html","label":"Query Optimizer \ud83d\udc51","docId":"query-optimizer","unlisted":false},{"type":"link","href":"/third-party-plugins.html","label":"Third Party Plugins","docId":"third-party-plugins","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Integrations","items":[{"type":"link","href":"/react.html","label":"React","docId":"react","unlisted":false},{"type":"link","label":"TanStack DB","href":"https://tanstack.com/db/latest/docs/collections/rxdb-collection","customProps":{"target":"_blank"}}],"collapsed":true,"collapsible":true},{"type":"category","label":"Performance","items":[{"type":"link","href":"/rx-storage-performance.html","label":"RxStorage Performance","docId":"rx-storage-performance","unlisted":false},{"type":"link","href":"/nosql-performance-tips.html","label":"NoSQL Performance Tips","docId":"nosql-performance-tips","unlisted":false},{"type":"link","href":"/slow-indexeddb.html","label":"Slow IndexedDB","docId":"slow-indexeddb","unlisted":false},{"type":"link","href":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html","label":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","docId":"articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Releases","items":[{"type":"link","href":"/releases/17.0.0.html","label":"17.0.0","docId":"releases/17.0.0","unlisted":false},{"type":"link","href":"/releases/16.0.0.html","label":"16.0.0","docId":"releases/16.0.0","unlisted":false},{"type":"link","href":"/releases/15.0.0.html","label":"15.0.0","docId":"releases/15.0.0","unlisted":false},{"type":"link","href":"/releases/14.0.0.html","label":"14.0.0","docId":"releases/14.0.0","unlisted":false},{"type":"link","href":"/releases/13.0.0.html","label":"13.0.0","docId":"releases/13.0.0","unlisted":false},{"type":"link","href":"/releases/12.0.0.html","label":"12.0.0","docId":"releases/12.0.0","unlisted":false},{"type":"link","href":"/releases/11.0.0.html","label":"11.0.0","docId":"releases/11.0.0","unlisted":false},{"type":"link","href":"/releases/10.0.0.html","label":"10.0.0","docId":"releases/10.0.0","unlisted":false},{"type":"link","href":"/releases/9.0.0.html","label":"9.0.0","docId":"releases/9.0.0","unlisted":false},{"type":"link","href":"/releases/8.0.0.html","label":"8.0.0","docId":"releases/8.0.0","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Articles","items":[{"type":"link","href":"/articles/browser-database.html","label":"Benefits of RxDB & Browser Databases","docId":"articles/browser-database","unlisted":false},{"type":"link","href":"/articles/local-first-future.html","label":"Why Local-First Software Is the Future and its Limitations","docId":"articles/local-first-future","unlisted":false},{"type":"link","href":"/why-nosql.html","label":"Why NoSQL Powers Modern UI Apps","docId":"why-nosql","unlisted":false},{"type":"link","href":"/downsides-of-offline-first.html","label":"Downsides of Local First / Offline First","docId":"downsides-of-offline-first","unlisted":false},{"type":"link","href":"/nodejs-database.html","label":"RxDB - The Real-Time Database for Node.js","docId":"nodejs-database","unlisted":false},{"type":"link","href":"/offline-first.html","label":"Local First / Offline First","docId":"offline-first","unlisted":false},{"type":"link","href":"/react-native-database.html","label":"React Native Database - Sync & Store Like a Pro","docId":"react-native-database","unlisted":false},{"type":"link","href":"/articles/angular-database.html","label":"RxDB as a Database in an Angular Application","docId":"articles/angular-database","unlisted":false},{"type":"link","href":"/articles/browser-storage.html","label":"Browser Storage - RxDB as a Database for Browsers","docId":"articles/browser-storage","unlisted":false},{"type":"link","href":"/articles/data-base.html","label":"Empower Web Apps with Reactive RxDB Data-base","docId":"articles/data-base","unlisted":false},{"type":"link","href":"/articles/embedded-database.html","label":"Embedded Database, Real-time Speed - RxDB","docId":"articles/embedded-database","unlisted":false},{"type":"link","href":"/articles/flutter-database.html","label":"Supercharge Flutter Apps with the RxDB Database","docId":"articles/flutter-database","unlisted":false},{"type":"link","href":"/articles/frontend-database.html","label":"RxDB - The Ultimate JS Frontend Database","docId":"articles/frontend-database","unlisted":false},{"type":"link","href":"/articles/in-memory-nosql-database.html","label":"RxDB In-Memory NoSQL - Supercharge Real-Time Apps","docId":"articles/in-memory-nosql-database","unlisted":false},{"type":"link","href":"/articles/ionic-database.html","label":"RxDB - The Perfect Ionic Database","docId":"articles/ionic-database","unlisted":false},{"type":"link","href":"/articles/ionic-storage.html","label":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","docId":"articles/ionic-storage","unlisted":false},{"type":"link","href":"/articles/json-database.html","label":"RxDB - The JSON Database Built for JavaScript","docId":"articles/json-database","unlisted":false},{"type":"link","href":"/articles/websockets-sse-polling-webrtc-webtransport.html","label":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","docId":"articles/websockets-sse-polling-webrtc-webtransport","unlisted":false},{"type":"link","href":"/articles/localstorage.html","label":"Using localStorage in Modern Applications - A Comprehensive Guide","docId":"articles/localstorage","unlisted":false},{"type":"link","href":"/articles/mobile-database.html","label":"Real-Time & Offline - RxDB for Mobile Apps","docId":"articles/mobile-database","unlisted":false},{"type":"link","href":"/articles/progressive-web-app-database.html","label":"RxDB as a Database for Progressive Web Apps (PWA)","docId":"articles/progressive-web-app-database","unlisted":false},{"type":"link","href":"/articles/react-database.html","label":"RxDB as a Database for React Applications","docId":"articles/react-database","unlisted":false},{"type":"link","href":"/articles/realtime-database.html","label":"What Really Is a Realtime Database?","docId":"articles/realtime-database","unlisted":false},{"type":"link","href":"/articles/angular-indexeddb.html","label":"Build Smarter Offline-First Angular Apps - How RxDB Beats IndexedDB Alone","docId":"articles/angular-indexeddb","unlisted":false},{"type":"link","href":"/articles/react-indexeddb.html","label":"IndexedDB Database in React Apps - The Power of RxDB","docId":"articles/react-indexeddb","unlisted":false},{"type":"link","href":"/capacitor-database.html","label":"Capacitor Database Guide - SQLite, RxDB & More","docId":"capacitor-database","unlisted":false},{"type":"link","href":"/alternatives.html","label":"Alternatives for realtime local-first JavaScript applications and local databases","docId":"alternatives","unlisted":false},{"type":"link","href":"/electron-database.html","label":"Electron Database - Storage adapters for SQLite, Filesystem and In-Memory","docId":"electron-database","unlisted":false},{"type":"link","href":"/articles/optimistic-ui.html","label":"Building an Optimistic UI with RxDB","docId":"articles/optimistic-ui","unlisted":false},{"type":"link","href":"/articles/local-database.html","label":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","docId":"articles/local-database","unlisted":false},{"type":"link","href":"/articles/react-native-encryption.html","label":"React Native Encryption and Encrypted Database/Storage","docId":"articles/react-native-encryption","unlisted":false},{"type":"link","href":"/articles/vue-database.html","label":"RxDB as a Database in a Vue.js Application","docId":"articles/vue-database","unlisted":false},{"type":"link","href":"/articles/vue-indexeddb.html","label":"IndexedDB Database in Vue Apps - The Power of RxDB","docId":"articles/vue-indexeddb","unlisted":false},{"type":"link","href":"/articles/jquery-database.html","label":"RxDB as a Database in a jQuery Application","docId":"articles/jquery-database","unlisted":false},{"type":"link","href":"/articles/firestore-alternative.html","label":"RxDB - Firestore Alternative to Sync with Your Own Backend","docId":"articles/firestore-alternative","unlisted":false},{"type":"link","href":"/articles/firebase-realtime-database-alternative.html","label":"RxDB - Firebase Realtime Database Alternative to Sync With Your Own Backend","docId":"articles/firebase-realtime-database-alternative","unlisted":false},{"type":"link","href":"/articles/offline-database.html","label":"RxDB \u2013 The Ultimate Offline Database with Sync and Encryption","docId":"articles/offline-database","unlisted":false},{"type":"link","href":"/articles/zero-latency-local-first.html","label":"Zero Latency Local First Apps with RxDB \u2013 Sync, Encryption and Compression","docId":"articles/zero-latency-local-first","unlisted":false},{"type":"link","href":"/articles/indexeddb-max-storage-limit.html","label":"IndexedDB Max Storage Size Limit - Detailed Best Practices","docId":"articles/indexeddb-max-storage-limit","unlisted":false},{"type":"link","href":"/articles/json-based-database.html","label":"JSON-Based Databases - Why NoSQL and RxDB Simplify App Development","docId":"articles/json-based-database","unlisted":false},{"type":"link","href":"/articles/reactjs-storage.html","label":"ReactJS Storage - From Basic LocalStorage to Advanced Offline Apps with RxDB","docId":"articles/reactjs-storage","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","href":"/contribution.html","label":"Contribute","docId":"contribute","unlisted":false},{"type":"category","label":"Contact","items":[{"type":"link","label":"Consulting","href":"/consulting/"},{"type":"link","label":"Discord","href":"/chat/","customProps":{"target":"_blank"}},{"type":"link","label":"LinkedIn","href":"https://www.linkedin.com/company/rxdb/"}],"collapsed":true,"collapsible":true}]},"docs":{"adapters":{"id":"adapters","title":"PouchDB Adapters","description":"When you use PouchDB RxStorage, there are many adapters that define where the data has to be stored."},"alternatives":{"id":"alternatives","title":"Alternatives for realtime local-first JavaScript applications and local databases","description":"Explore real-time, local-first JS alternatives to RxDB. Compare Firebase, Meteor, AWS, CouchDB, and more for robust, seamless web/mobile app development.","sidebar":"tutorialSidebar"},"articles/angular-database":{"id":"articles/angular-database","title":"RxDB as a Database in an Angular Application","description":"Level up your Angular projects with RxDB. Build real-time, resilient, and responsive apps powered by a reactive NoSQL database right in the browser.","sidebar":"tutorialSidebar"},"articles/angular-indexeddb":{"id":"articles/angular-indexeddb","title":"Build Smarter Offline-First Angular Apps - How RxDB Beats IndexedDB Alone","description":"Discover how to harness IndexedDB in Angular with RxDB for robust offline apps. Learn reactive queries, advanced features, and more.","sidebar":"tutorialSidebar"},"articles/browser-database":{"id":"articles/browser-database","title":"Benefits of RxDB & Browser Databases","description":"Find out why RxDB is the go-to solution for browser databases. See how it boosts performance, simplifies replication, and powers real-time UIs.","sidebar":"tutorialSidebar"},"articles/browser-storage":{"id":"articles/browser-storage","title":"Browser Storage - RxDB as a Database for Browsers","description":"Explore RxDB for browser storage its advantages, limitations, and why it outperforms SQL databases in web applications for enhanced efficiency","sidebar":"tutorialSidebar"},"articles/data-base":{"id":"articles/data-base","title":"Empower Web Apps with Reactive RxDB Data-base","description":"Explore RxDB\'s reactive data-base solution for web and mobile. Enable offline-first experiences, real-time syncing, and secure data handling with ease.","sidebar":"tutorialSidebar"},"articles/embedded-database":{"id":"articles/embedded-database","title":"Embedded Database, Real-time Speed - RxDB","description":"Unleash the power of embedded databases with RxDB. Explore real-time replication, offline access, and reactive queries for modern JavaScript apps.","sidebar":"tutorialSidebar"},"articles/firebase-realtime-database-alternative":{"id":"articles/firebase-realtime-database-alternative","title":"RxDB - Firebase Realtime Database Alternative to Sync With Your Own Backend","description":"Looking for a Firebase Realtime Database alternative? RxDB offers a fully offline, vendor-agnostic NoSQL solution with advanced conflict resolution and multi-platform support.","sidebar":"tutorialSidebar"},"articles/firestore-alternative":{"id":"articles/firestore-alternative","title":"RxDB - Firestore Alternative to Sync with Your Own Backend","description":"Looking for a Firestore alternative? RxDB is a local-first, NoSQL database that syncs seamlessly with any backend, offers rich offline capabilities, advanced conflict resolution, and reduces vendor lock-in.","sidebar":"tutorialSidebar"},"articles/flutter-database":{"id":"articles/flutter-database","title":"Supercharge Flutter Apps with the RxDB Database","description":"Harness RxDB\'s reactive database to bring real-time, offline-first data storage and syncing to your next Flutter application.","sidebar":"tutorialSidebar"},"articles/frontend-database":{"id":"articles/frontend-database","title":"RxDB - The Ultimate JS Frontend Database","description":"Discover how RxDB, a powerful JavaScript frontend database, boosts offline access, caching, and real-time updates to supercharge your web apps.","sidebar":"tutorialSidebar"},"articles/ideas":{"id":"articles/ideas","title":"ideas for articles","description":"- storing and searching through 1mio emails in a browser database"},"articles/in-memory-nosql-database":{"id":"articles/in-memory-nosql-database","title":"RxDB In-Memory NoSQL - Supercharge Real-Time Apps","description":"Discover how RxDB\'s in-memory NoSQL engine delivers blazing speed for real-time apps, ensuring responsive experiences and seamless data sync.","sidebar":"tutorialSidebar"},"articles/indexeddb-max-storage-limit":{"id":"articles/indexeddb-max-storage-limit","title":"IndexedDB Max Storage Size Limit - Detailed Best Practices","description":"Learn how browsers enforce IndexedDB storage size limits, how to test and handle quota exceeded errors, and best practices for storing large amounts of data offline.","sidebar":"tutorialSidebar"},"articles/ionic-database":{"id":"articles/ionic-database","title":"RxDB - The Perfect Ionic Database","description":"Supercharge your Ionic hybrid apps with RxDB\'s offline-first database. Experience real-time sync, top performance, and easy replication.","sidebar":"tutorialSidebar"},"articles/ionic-storage":{"id":"articles/ionic-storage","title":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","description":"The best Ionic storage solution? RxDB empowers your hybrid apps with offline-first capabilities, secure encryption, data compression, and seamless data syncing to any backend.","sidebar":"tutorialSidebar"},"articles/javascript-vector-database":{"id":"articles/javascript-vector-database","title":"Local JavaScript Vector Database that works offline","description":"Create a blazing-fast vector database in JavaScript. Leverage RxDB and transformers.js for instant, offline semantic search - no servers required!","sidebar":"tutorialSidebar"},"articles/jquery-database":{"id":"articles/jquery-database","title":"RxDB as a Database in a jQuery Application","description":"Level up your jQuery-based projects with RxDB. Build real-time, resilient, and responsive apps powered by a reactive NoSQL database right in the browser.","sidebar":"tutorialSidebar"},"articles/json-based-database":{"id":"articles/json-based-database","title":"JSON-Based Databases - Why NoSQL and RxDB Simplify App Development","description":"Dive into how JSON-based databases power modern UI-centric apps, why NoSQL often outperforms SQL for dynamic data, how SQLite accommodates JSON, and why RxDB delivers a seamless offline-first solution for JavaScript with advanced JSON features.","sidebar":"tutorialSidebar"},"articles/json-database":{"id":"articles/json-database","title":"RxDB - The JSON Database Built for JavaScript","description":"Experience a powerful JSON database with RxDB, built for JavaScript. Store, sync, and compress your data seamlessly across web and mobile apps.","sidebar":"tutorialSidebar"},"articles/local-database":{"id":"articles/local-database","title":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","description":"An in-depth exploration of local databases and why RxDB excels as a local-first solution for JavaScript applications.","sidebar":"tutorialSidebar"},"articles/local-first-future":{"id":"articles/local-first-future","title":"Why Local-First Software Is the Future and its Limitations","description":"Discover how local-first transforms web apps, boosts offline resilience, and why instant user feedback is becoming the new normal.","sidebar":"tutorialSidebar"},"articles/localstorage":{"id":"articles/localstorage","title":"Using localStorage in Modern Applications - A Comprehensive Guide","description":"This guide explores localStorage in JavaScript web apps, detailing its usage, limitations, and alternatives like IndexedDB and AsyncStorage.","sidebar":"tutorialSidebar"},"articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm":{"id":"articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm","title":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","description":"Compare LocalStorage, IndexedDB, Cookies, OPFS, and WASM-SQLite for web storage, performance, limits, and best practices for modern web apps.","sidebar":"tutorialSidebar"},"articles/mobile-database":{"id":"articles/mobile-database","title":"Real-Time & Offline - RxDB for Mobile Apps","description":"Explore RxDB as your reliable mobile database. Enjoy offline-first capabilities, real-time sync, and seamless integration for hybrid app development.","sidebar":"tutorialSidebar"},"articles/offline-database":{"id":"articles/offline-database","title":"RxDB \u2013 The Ultimate Offline Database with Sync and Encryption","description":"Discover how RxDB serves as a powerful offline database, offering real-time synchronization, secure encryption, and an offline-first approach for modern web and mobile apps.","sidebar":"tutorialSidebar"},"articles/optimistic-ui":{"id":"articles/optimistic-ui","title":"Building an Optimistic UI with RxDB","description":"Learn how to build an Optimistic UI with RxDB for instant and reliable UI updates on user interactions","sidebar":"tutorialSidebar"},"articles/progressive-web-app-database":{"id":"articles/progressive-web-app-database","title":"RxDB as a Database for Progressive Web Apps (PWA)","description":"Discover how RxDB supercharges Progressive Web Apps with real-time sync, offline-first capabilities, and lightning-fast data handling.","sidebar":"tutorialSidebar"},"articles/react-database":{"id":"articles/react-database","title":"RxDB as a Database for React Applications","description":"earn how the RxDB database supercharges React apps with offline access, real-time updates, and smooth data flow. Boost performance and engagement.","sidebar":"tutorialSidebar"},"articles/react-indexeddb":{"id":"articles/react-indexeddb","title":"IndexedDB Database in React Apps - The Power of RxDB","description":"Discover how RxDB simplifies IndexedDB in React, offering reactive queries, offline-first capability, encryption, compression, and effortless integration.","sidebar":"tutorialSidebar"},"articles/react-native-encryption":{"id":"articles/react-native-encryption","title":"React Native Encryption and Encrypted Database/Storage","description":"Secure your React Native app with RxDB encryption. Learn why it matters, how to implement encrypted databases, and best practices to protect user data.","sidebar":"tutorialSidebar"},"articles/reactjs-storage":{"id":"articles/reactjs-storage","title":"ReactJS Storage - From Basic LocalStorage to Advanced Offline Apps with RxDB","description":"Discover how to implement reactjs storage using localStorage for quick key-value data, then move on to more robust offline-first approaches with RxDB, IndexedDB, preact signals, encryption plugins, and more.","sidebar":"tutorialSidebar"},"articles/realtime-database":{"id":"articles/realtime-database","title":"What Really Is a Realtime Database?","description":"Discover how RxDB merges realtime replication and dynamic updates to deliver seamless data sync across browsers, devices, and servers - instantly.","sidebar":"tutorialSidebar"},"articles/vue-database":{"id":"articles/vue-database","title":"RxDB as a Database in a Vue.js Application","description":"Level up your Vue projects with RxDB. Build real-time, resilient, and responsive apps powered by a reactive NoSQL database right in the browser.","sidebar":"tutorialSidebar"},"articles/vue-indexeddb":{"id":"articles/vue-indexeddb","title":"IndexedDB Database in Vue Apps - The Power of RxDB","description":"Learn how RxDB simplifies IndexedDB in Vue, offering reactive queries, offline-first capabilities, encryption, compression, and effortless integration.","sidebar":"tutorialSidebar"},"articles/websockets-sse-polling-webrtc-webtransport":{"id":"articles/websockets-sse-polling-webrtc-webtransport","title":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","description":"Learn the unique benefits and pitfalls of each real-time tech. Make informed decisions on WebSockets, SSE, Polling, WebRTC, and WebTransport.","sidebar":"tutorialSidebar"},"articles/zero-latency-local-first":{"id":"articles/zero-latency-local-first","title":"Zero Latency Local First Apps with RxDB \u2013 Sync, Encryption and Compression","description":"Build blazing-fast, zero-latency local first apps with RxDB. Gain instant UI responses, robust offline capabilities, end-to-end encryption, and data compression for streamlined performance.","sidebar":"tutorialSidebar"},"backup":{"id":"backup","title":"Backup","description":"Easily back up your RxDB database to JSON files and attachments on the filesystem with the Backup Plugin - ensuring reliable Node.js data protection.","sidebar":"tutorialSidebar"},"capacitor-database":{"id":"capacitor-database","title":"Capacitor Database Guide - SQLite, RxDB & More","description":"Explore Capacitor\'s top data storage solutions - from key-value to real-time databases. Compare SQLite, RxDB, and more in this in-depth guide.","sidebar":"tutorialSidebar"},"cleanup":{"id":"cleanup","title":"Cleanup","description":"Optimize storage and speed up queries with RxDB\'s Cleanup Plugin, automatically removing old deleted docs while preserving replication states.","sidebar":"tutorialSidebar"},"contribute":{"id":"contribute","title":"Contribute","description":"Got a fix or fresh idea? Learn how to contribute to RxDB, run tests, and shape the future of this cutting-edge NoSQL database for JavaScript.","sidebar":"tutorialSidebar"},"crdt":{"id":"crdt","title":"CRDT - Conflict-free replicated data type Database","description":"Learn how RxDB\'s CRDT Plugin resolves document conflicts automatically in distributed systems, ensuring seamless merges and consistent data.","sidebar":"tutorialSidebar"},"data-migration":{"id":"data-migration","title":"Data Migration","description":"This documentation page has been moved to here"},"dev-mode":{"id":"dev-mode","title":"Development Mode","description":"Enable checks & validations with RxDB Dev Mode. Ensure proper API use, readable errors, and schema validation during development. Avoid in production.","sidebar":"tutorialSidebar"},"downsides-of-offline-first":{"id":"downsides-of-offline-first","title":"Downsides of Local First / Offline First","description":"Discover the hidden pitfalls of local-first apps. Learn about storage limits, conflicts, and real-time illusions before building your offline solution.","sidebar":"tutorialSidebar"},"electron":{"id":"electron","title":"Seamless Electron Storage with RxDB","description":"Use the RxDB Electron Plugin to share data between main and renderer processes. Enjoy quick queries, real-time sync, and robust offline support.","sidebar":"tutorialSidebar"},"electron-database":{"id":"electron-database","title":"Electron Database - Storage adapters for SQLite, Filesystem and In-Memory","description":"Harness the database power of SQLite, Filesystem, and in-memory storage in Electron with RxDB. Build fast, offline-first apps that sync in real time.","sidebar":"tutorialSidebar"},"encryption":{"id":"encryption","title":"Encryption","description":"Explore RxDB\'s \ud83d\udd12 encryption plugin for enhanced data security in web and native apps, featuring password-based encryption and secure storage.","sidebar":"tutorialSidebar"},"errors":{"id":"errors","title":"Error Messages","description":"Learn how RxDB throws RxErrors with codes and parameters. Keep builds lean, yet unveil full messages in development via the DevMode plugin.","sidebar":"tutorialSidebar"},"fulltext-search":{"id":"fulltext-search","title":"Fulltext Search \ud83d\udc51","description":"Master local fulltext search with RxDB\'s FlexSearch plugin. Enjoy real-time indexing, efficient queries, and offline-first support made easy.","sidebar":"tutorialSidebar"},"install":{"id":"install","title":"Installation","description":"Learn how to install RxDB via npm, configure polyfills, and fix global variable errors in Angular or Webpack for a seamless setup.","sidebar":"tutorialSidebar"},"key-compression":{"id":"key-compression","title":"Key Compression","description":"With the key compression plugin, documents will be stored in a compressed format which saves up to 40% disc space.","sidebar":"tutorialSidebar"},"leader-election":{"id":"leader-election","title":"Leader Election","description":"RxDB comes with a leader-election which elects a leading instance between different instances in the same javascript runtime.","sidebar":"tutorialSidebar"},"logger":{"id":"logger","title":"RxDB Logger Plugin - Track & Optimize","description":"Take control of your RxDatabase logs. Monitor every write, query, or attachment retrieval to swiftly diagnose and fix performance bottlenecks.","sidebar":"tutorialSidebar"},"middleware":{"id":"middleware","title":"Streamlined RxDB Middleware","description":"Enhance your RxDB workflow with pre and post hooks. Quickly add custom validations, triggers, and events to streamline your asynchronous operations.","sidebar":"tutorialSidebar"},"migration-schema":{"id":"migration-schema","title":"Seamless Schema Data Migration with RxDB","description":"Upgrade your RxDB collections without losing data. Learn how to seamlessly migrate schema changes and keep your apps running smoothly.","sidebar":"tutorialSidebar"},"migration-storage":{"id":"migration-storage","title":"Migration Storage","description":"Effortlessly migrate your data between storages in RxDB using the Storage Migration plugin. Retain your documents when switching storages or major versions.","sidebar":"tutorialSidebar"},"nodejs-database":{"id":"nodejs-database","title":"RxDB - The Real-Time Database for Node.js","description":"Discover how RxDB brings flexible, reactive NoSQL to Node.js. Scale effortlessly, persist data, and power your server-side apps with ease.","sidebar":"tutorialSidebar"},"nosql-performance-tips":{"id":"nosql-performance-tips","title":"RxDB NoSQL Performance Tips","description":"Skyrocket your NoSQL speed with RxDB tips. Learn about bulk writes, optimized queries, and lean plugin usage for peak performance.","sidebar":"tutorialSidebar"},"offline-first":{"id":"offline-first","title":"Local First / Offline First","description":"Local-First software stores data on client devices for seamless offline and online functionality, enhancing user experience and efficiency.","sidebar":"tutorialSidebar"},"orm":{"id":"orm","title":"ORM","description":"Like mongoose, RxDB has ORM-capabilities which can be used to add specific behavior to documents and collections.","sidebar":"tutorialSidebar"},"overview":{"id":"overview","title":"RxDB Docs","description":"RxDB Documentation Overview","sidebar":"tutorialSidebar"},"plugins":{"id":"plugins","title":"Creating Plugins","description":"Creating your own plugin is very simple. A plugin is basically a javascript-object which overwrites or extends RxDB\'s internal classes, prototypes, and hooks.","sidebar":"tutorialSidebar"},"population":{"id":"population","title":"Populate and Link Docs in RxDB","description":"Learn how to reference and link documents across collections in RxDB. Discover easy population without joins and handle complex relationships.","sidebar":"tutorialSidebar"},"query-cache":{"id":"query-cache","title":"Efficient RxDB Queries via Query Cache","description":"Learn how RxDB\'s Query Cache boosts performance by reusing queries. Discover its default replacement policy and how to define your own.","sidebar":"tutorialSidebar"},"query-optimizer":{"id":"query-optimizer","title":"Optimize Client-Side Queries with RxDB","description":"Harness real-world data to fine-tune queries. The build-time RxDB Optimizer finds the perfect index, boosting query speed in any environment.","sidebar":"tutorialSidebar"},"quickstart":{"id":"quickstart","title":"\ud83d\ude80 Quickstart","description":"Learn how to build a realtime app with RxDB. Follow this quickstart for setup, schema creation, data operations, and real-time syncing.","sidebar":"tutorialSidebar"},"react":{"id":"react","title":"React","description":"RxDB provides first-class support for both React and React Native via a dedicated React integration. This integration makes it possible to use RxDB inside functional components using React Context and hooks, without manually subscribing to observables or managing cleanup logic.","sidebar":"tutorialSidebar"},"react-native-database":{"id":"react-native-database","title":"React Native Database - Sync & Store Like a Pro","description":"Discover top React Native local database solutions - AsyncStorage, SQLite, RxDB, and more. Build offline-ready apps for iOS, Android, and Windows with easy sync.","sidebar":"tutorialSidebar"},"reactivity":{"id":"reactivity","title":"Signals & Custom Reactivity with RxDB","description":"Level up reactivity with Angular signals, Vue refs, or Preact signals in RxDB. Learn how to integrate custom reactivity to power your dynamic UI.","sidebar":"tutorialSidebar"},"releases/10.0.0":{"id":"releases/10.0.0","title":"RxDB 10.0.0 - Built for the Future","description":"Experience faster, future-proof data handling in RxDB 10.0. Explore new storage interfaces, composite keys, and major performance upgrades.","sidebar":"tutorialSidebar"},"releases/11.0.0":{"id":"releases/11.0.0","title":"RxDB 11 - WebWorker Support & More","description":"RxDB 11.0 brings Worker-based storage for multi-core performance gains. Explore the major changes and migrate seamlessly to harness new speeds.","sidebar":"tutorialSidebar"},"releases/12.0.0":{"id":"releases/12.0.0","title":"RxDB 12.0.0 - Clean, Lean & Mean","description":"Upgrade to RxDB 12.0.0 for blazing-fast queries, streamlined replication, and better index usage. Explore new features and power up your app.","sidebar":"tutorialSidebar"},"releases/13.0.0":{"id":"releases/13.0.0","title":"RxDB 13.0.0 - A New Era of Replication","description":"Discover RxDB 13.0\'s brand-new replication protocol, faster performance, and real-time collaboration for a seamless offline-first experience.","sidebar":"tutorialSidebar"},"releases/14.0.0":{"id":"releases/14.0.0","title":"RxDB 14.0 - Major Changes & New Features","description":"Discover RxDB 14.0, a major release packed with API changes, improved performance, and streamlined storage, ensuring faster data operations than ever.","sidebar":"tutorialSidebar"},"releases/15.0.0":{"id":"releases/15.0.0","title":"RxDB 15.0.0 - Major Migration Overhaul","description":"Discover RxDB 15.0.0, featuring new migration strategies, replication improvements, and lightning-fast performance to supercharge your app.","sidebar":"tutorialSidebar"},"releases/16.0.0":{"id":"releases/16.0.0","title":"RxDB 16.0.0 - Efficiency Redefined","description":"Meet RxDB 16.0.0 - major refactorings, improved performance, and easy migrations. Experience a better, faster, and more stable database solution today.","sidebar":"tutorialSidebar"},"releases/17.0.0":{"id":"releases/17.0.0","title":"RxDB 17.0.0","description":"RxDB 17 introduces improved reactivity APIs, better debugging, breaking storage fixes, and multiple plugins graduating from beta.","sidebar":"tutorialSidebar"},"releases/8.0.0":{"id":"releases/8.0.0","title":"Meet RxDB 8.0.0 - New Defaults & Performance","description":"Discover how RxDB 8.0.0 boosts performance, simplifies schema handling, and streamlines reactive data updates for modern apps.","sidebar":"tutorialSidebar"},"releases/9.0.0":{"id":"releases/9.0.0","title":"RxDB 9.0.0 - Faster & Simpler","description":"Discover RxDB 9.0.0\'s streamlined plugins, top-level schema definitions, and improved dev-mode. Experience a simpler, faster real-time database.","sidebar":"tutorialSidebar"},"replication":{"id":"replication","title":"\u2699\ufe0f RxDB realtime Sync Engine for Local-First Apps","description":"Replicate data in real-time with RxDB\'s offline-first Sync Engine. Learn about efficient syncing, conflict resolution, and advanced multi-tab support.","sidebar":"tutorialSidebar"},"replication-appwrite":{"id":"replication-appwrite","title":"Appwrite Realtime Sync for Local-First Apps","description":"Sync RxDB with Appwrite for local-first apps. Supports real-time updates, offline mode, conflict resolution, and secure push/pull replication.","sidebar":"tutorialSidebar"},"replication-couchdb":{"id":"replication-couchdb","title":"RxDB\'s CouchDB Replication Plugin","description":"Replicate your RxDB collections with CouchDB the fast way. Enjoy faster sync, easier conflict handling, and flexible storage using this modern plugin.","sidebar":"tutorialSidebar"},"replication-firestore":{"id":"replication-firestore","title":"Smooth Firestore Sync for Offline Apps","description":"Leverage RxDB to enable real-time, offline-first replication with Firestore. Cut cloud costs, resolve conflicts, and speed up your app.","sidebar":"tutorialSidebar"},"replication-graphql":{"id":"replication-graphql","title":"GraphQL Replication","description":"The GraphQL replication provides handlers for GraphQL to run replication with GraphQL as the transportation layer.","sidebar":"tutorialSidebar"},"replication-http":{"id":"replication-http","title":"HTTP Replication","description":"Learn how to establish HTTP replication between RxDB clients and a Node.js Express server for data synchronization.","sidebar":"tutorialSidebar"},"replication-mongodb":{"id":"replication-mongodb","title":"MongoDB Realtime Sync Engine for Local-First Apps","description":"Build real-time, offline-capable apps with RxDB + MongoDB replication. Push/pull changes, use change streams, and keep data in sync across devices.","sidebar":"tutorialSidebar"},"replication-nats":{"id":"replication-nats","title":"RxDB & NATS - Realtime Sync","description":"Seamlessly sync your RxDB data with NATS for real-time, two-way replication. Handle conflicts, errors, and retries with ease.","sidebar":"tutorialSidebar"},"replication-p2p":{"id":"replication-p2p","title":"Seamless P2P Data Sync","description":"Discover how replication-webrtc ensures secure P2P data sync and real-time collaboration with RxDB. Explore the future of offline-first apps!"},"replication-server":{"id":"replication-server","title":"RxDB Server Replication","description":"The Server Replication Plugin connects to the replication endpoint of an RxDB Server Replication Endpoint and replicates data between the client and the server.","sidebar":"tutorialSidebar"},"replication-supabase":{"id":"replication-supabase","title":"Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync","description":"Build real-time, offline-capable apps with RxDB + Supabase. Push/pull changes via PostgREST, stream updates with Realtime, and keep data in sync across devices.","sidebar":"tutorialSidebar"},"replication-webrtc":{"id":"replication-webrtc","title":"WebRTC P2P Replication with RxDB - Sync Browsers and Devices","description":"Learn to set up peer-to-peer WebRTC replication with RxDB. Bypass central servers and enjoy secure, low-latency data sync across all clients.","sidebar":"tutorialSidebar"},"replication-websocket":{"id":"replication-websocket","title":"Websocket Replication","description":"With the websocket replication plugin, you can spawn a websocket server from a RxDB database in Node.js and replicate with it.","sidebar":"tutorialSidebar"},"rx-attachment":{"id":"rx-attachment","title":"Attachments","description":"Learn how to store and manage binary data like images or files in RxDB using attachments. Discover features, performance benefits, encryption, compression, and usage examples with code.","sidebar":"tutorialSidebar"},"rx-collection":{"id":"rx-collection","title":"Master Data - Create and Manage RxCollections","description":"Discover how to create, manage, and migrate documents in RxCollections. Harness real-time data flows, secure encryption, and powerful performance in RxDB.","sidebar":"tutorialSidebar"},"rx-database":{"id":"rx-database","title":"RxDatabase - The Core of Your Realtime Data","description":"Get started with RxDatabase and integrate multiple storages. Learn to create, encrypt, and optimize your realtime database today.","sidebar":"tutorialSidebar"},"rx-document":{"id":"rx-document","title":"RxDocument","description":"Master RxDB\'s RxDocument - Insert, find, update, remove, and more for streamlined data handling in modern apps.","sidebar":"tutorialSidebar"},"rx-local-document":{"id":"rx-local-document","title":"Master Local Documents in RxDB","description":"Effortlessly store custom metadata and app settings in RxDB. Learn how Local Documents keep data flexible, secure, and easy to manage.","sidebar":"tutorialSidebar"},"rx-pipeline":{"id":"rx-pipeline","title":"RxPipeline - Automate Data Flows in RxDB","description":"Discover how RxPipeline automates your data workflows. Seamlessly process writes, manage leader election, and ensure crash-safe operations in RxDB.","sidebar":"tutorialSidebar"},"rx-query":{"id":"rx-query","title":"RxQuery","description":"Master RxQuery in RxDB - find, update, remove documents using Mango syntax, chained queries, real-time observations, indexing, and more.","sidebar":"tutorialSidebar"},"rx-schema":{"id":"rx-schema","title":"Design Perfect Schemas in RxDB","description":"Learn how to define, secure, and validate your data in RxDB. Master primary keys, indexes, encryption, and more with the RxSchema approach.","sidebar":"tutorialSidebar"},"rx-server":{"id":"rx-server","title":"RxDB Server - Deploy Your Data","description":"Launch a secure, high-performance server on top of your RxDB database. Enable REST, replication endpoints, and seamless data syncing with RxServer.","sidebar":"tutorialSidebar"},"rx-server-scaling":{"id":"rx-server-scaling","title":"RxServer Scaling - Vertical or Horizontal","description":"Discover vertical and horizontal techniques to boost RxServer. Learn multiple processes, worker threads, and replication for limitless performance.","sidebar":"tutorialSidebar"},"rx-state":{"id":"rx-state","title":"RxState - Reactive Persistent State with RxDB","description":"Get real-time, persistent state without the hassle. RxState integrates easily with signals and hooks, ensuring smooth updates across tabs and devices.","sidebar":"tutorialSidebar"},"rx-storage":{"id":"rx-storage","title":"\u2699\ufe0f RxStorage Layer - Choose the Perfect RxDB Storage for Every Use Case","description":"Discover how RxDB\'s modular RxStorage lets you swap engines and unlock top performance, no matter the environment or use case.","sidebar":"tutorialSidebar"},"rx-storage-denokv":{"id":"rx-storage-denokv","title":"DenoKV RxStorage","description":"With the DenoKV RxStorage layer for RxDB, you can run a fully featured NoSQL database on top of the DenoKV API.","sidebar":"tutorialSidebar"},"rx-storage-dexie":{"id":"rx-storage-dexie","title":"RxDB Dexie.js Database - Fast, Reactive, Sync with Any Backend","description":"Use Dexie.js to power RxDB in the browser. Enjoy quick setup, Dexie addons, and reliable storage for small apps or prototypes.","sidebar":"tutorialSidebar"},"rx-storage-filesystem-node":{"id":"rx-storage-filesystem-node","title":"Blazing-Fast Node Filesystem Storage","description":"Get up and running quickly with RxDB\'s Filesystem Node RxStorage. Store data in JSON, embrace multi-instance support, and enjoy a simpler database.","sidebar":"tutorialSidebar"},"rx-storage-foundationdb":{"id":"rx-storage-foundationdb","title":"RxDB on FoundationDB - Performance at Scale","description":"Combine FoundationDB\'s reliability with RxDB\'s indexing and schema validation. Build scalable apps with faster queries and real-time data.","sidebar":"tutorialSidebar"},"rx-storage-indexeddb":{"id":"rx-storage-indexeddb","title":"Instant Performance with IndexedDB RxStorage","description":"Choose IndexedDB RxStorage for unmatched speed and minimal build size. Perfect for fast-performing apps that demand reliable, lightweight data solutions.","sidebar":"tutorialSidebar"},"rx-storage-localstorage":{"id":"rx-storage-localstorage","title":"RxDB LocalStorage - The Easiest Way to Persist Data in Your Web App","description":"Discover how to quickly set up RxDB\'s LocalStorage-based storage as the recommended default. Learn its benefits, limitations, and why it\u2019s perfect for demos, prototypes, and lightweight applications.","sidebar":"tutorialSidebar"},"rx-storage-localstorage-meta-optimizer":{"id":"rx-storage-localstorage-meta-optimizer","title":"Fastest RxDB Starts - Localstorage Meta Optimizer","description":"Wrap any RxStorage with localStorage metadata to slash initial load by up to 200ms. Unlock speed with this must-have RxDB Premium plugin.","sidebar":"tutorialSidebar"},"rx-storage-lokijs":{"id":"rx-storage-lokijs","title":"Empower RxDB with the LokiJS RxStorage","description":"Discover the lightning-fast LokiJS RxStorage for RxDB. Explore in-memory speed, multi-tab support, and pros & cons of this unique storage solution."},"rx-storage-memory":{"id":"rx-storage-memory","title":"Lightning-Fast Memory Storage for RxDB","description":"Use Memory RxStorage for a high-performance, JavaScript in-memory database. Built for speed, making it perfect for unit tests and rapid prototyping.","sidebar":"tutorialSidebar"},"rx-storage-memory-mapped":{"id":"rx-storage-memory-mapped","title":"Blazing-Fast Memory Mapped RxStorage","description":"Boost your app\'s performance with Memory Mapped RxStorage. Query and write in-memory while seamlessly persisting data to your chosen storage.","sidebar":"tutorialSidebar"},"rx-storage-memory-synced":{"id":"rx-storage-memory-synced","title":"Instant Performance with Memory Synced RxStorage","description":"Accelerate RxDB with in-memory storage replicated to disk. Enjoy instant queries, faster loads, and unstoppable performance for your web apps."},"rx-storage-mongodb":{"id":"rx-storage-mongodb","title":"Unlock MongoDB Power with RxDB","description":"Combine RxDB\'s real-time sync with MongoDB\'s scalability. Harness the MongoDB RxStorage to seamlessly expand your database capabilities.","sidebar":"tutorialSidebar"},"rx-storage-opfs":{"id":"rx-storage-opfs","title":"Supercharged OPFS Database with RxDB","description":"Discover how to harness the Origin Private File System with RxDB\'s OPFS RxStorage for unrivaled performance and security in client-side data storage.","sidebar":"tutorialSidebar"},"rx-storage-performance":{"id":"rx-storage-performance","title":"\ud83d\udcc8 Discover RxDB Storage Benchmarks","description":"Explore real-world benchmarks comparing RxDB\'s persistent and semi-persistent storages. Discover which storage option delivers the fastest performance.","sidebar":"tutorialSidebar"},"rx-storage-pouchdb":{"id":"rx-storage-pouchdb","title":"PouchDB RxStorage - Migrate for Better Performance","description":"Discover why PouchDB RxStorage is deprecated in RxDB. Learn its legacy, performance drawbacks, and how to upgrade to a faster solution."},"rx-storage-remote":{"id":"rx-storage-remote","title":"Remote RxStorage","description":"The Remote RxStorage is made to use a remote storage and communicate with it over an asynchronous message channel.","sidebar":"tutorialSidebar"},"rx-storage-sharding":{"id":"rx-storage-sharding","title":"Sharding RxStorage \ud83d\udc51","description":"With the sharding plugin, you can improve the write and query times of some RxStorage implementations.","sidebar":"tutorialSidebar"},"rx-storage-shared-worker":{"id":"rx-storage-shared-worker","title":"Boost Performance with SharedWorker RxStorage","description":"Tap into single-instance storage with RxDB\'s SharedWorker. Improve efficiency, cut duplication, and keep your app lightning-fast across tabs.","sidebar":"tutorialSidebar"},"rx-storage-sqlite":{"id":"rx-storage-sqlite","title":"RxDB SQLite RxStorage for Hybrid Apps","description":"Unlock seamless persistence with SQLite RxStorage. Explore usage in hybrid apps, compare performance, and leverage advanced features like attachments.","sidebar":"tutorialSidebar"},"rx-storage-worker":{"id":"rx-storage-worker","title":"Turbocharge RxDB with Worker RxStorage","description":"Offload RxDB queries to WebWorkers or Worker Threads, freeing the main thread and boosting performance. Experience smoother apps with Worker RxStorage.","sidebar":"tutorialSidebar"},"rxdb-tradeoffs":{"id":"rxdb-tradeoffs","title":"RxDB Tradeoffs - Why NoSQL Triumphs on the Client","description":"Uncover RxDB\'s approach to modern database needs. From JSON-based queries to conflict handling without transactions, learn RxDB\'s unique tradeoffs."},"schema-validation":{"id":"schema-validation","title":"Schema Validation","description":"RxDB has multiple validation implementations that can be used to ensure that your document data is always matching the provided JSON","sidebar":"tutorialSidebar"},"slow-indexeddb":{"id":"slow-indexeddb","title":"Solving IndexedDB Slowness for Seamless Apps","description":"Struggling with IndexedDB performance? Discover hidden bottlenecks, advanced tuning techniques, and next-gen storage like the File System Access API.","sidebar":"tutorialSidebar"},"third-party-plugins":{"id":"third-party-plugins","title":"Boost Your RxDB with Powerful Third-Party Plugins","description":"Unleash RxDB\'s full power! Explore third-party plugins for advanced hooks, text search, Laravel Orion, Supabase replication, and more.","sidebar":"tutorialSidebar"},"transactions-conflicts-revisions":{"id":"transactions-conflicts-revisions","title":"Transactions, Conflicts and Revisions","description":"Learn RxDB\'s approach to local and replication conflicts. Discover how incremental writes and custom handlers keep your app stable and efficient.","sidebar":"tutorialSidebar"},"tutorials/typescript":{"id":"tutorials/typescript","title":"TypeScript Setup","description":"Use RxDB with TypeScript to define typed schemas, create typed collections, and build fully typed ORM methods. A quick step-by-step guide.","sidebar":"tutorialSidebar"},"why-nosql":{"id":"why-nosql","title":"Why NoSQL Powers Modern UI Apps","description":"Discover how NoSQL enables offline-first UI apps. Learn about easy replication, conflict resolution, and why relational data isn\'t always necessary.","sidebar":"tutorialSidebar"}}}}')}}]); \ No newline at end of file diff --git a/docs/assets/js/2456d5e0.565789dc.js b/docs/assets/js/2456d5e0.565789dc.js deleted file mode 100644 index 93e0181e3ec..00000000000 --- a/docs/assets/js/2456d5e0.565789dc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[2966],{7615(e,s,n){n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>i,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"rx-database","title":"RxDatabase - The Core of Your Realtime Data","description":"Get started with RxDatabase and integrate multiple storages. Learn to create, encrypt, and optimize your realtime database today.","source":"@site/docs/rx-database.md","sourceDirName":".","slug":"/rx-database.html","permalink":"/rx-database.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDatabase - The Core of Your Realtime Data","slug":"rx-database.html","description":"Get started with RxDatabase and integrate multiple storages. Learn to create, encrypt, and optimize your realtime database today."},"sidebar":"tutorialSidebar","previous":{"title":"TypeScript Setup","permalink":"/tutorials/typescript.html"},"next":{"title":"RxSchema","permalink":"/rx-schema.html"}}');var a=n(4848),o=n(8453);const i={title:"RxDatabase - The Core of Your Realtime Data",slug:"rx-database.html",description:"Get started with RxDatabase and integrate multiple storages. Learn to create, encrypt, and optimize your realtime database today."},t="RxDatabase",l={},c=[{value:"Creation",id:"creation",level:2},{value:"name",id:"name",level:3},{value:"storage",id:"storage",level:3},{value:"password",id:"password",level:3},{value:"multiInstance",id:"multiinstance",level:3},{value:"eventReduce",id:"eventreduce",level:3},{value:"ignoreDuplicate",id:"ignoreduplicate",level:3},{value:"closeDuplicates",id:"closeduplicates",level:3},{value:"hashFunction",id:"hashfunction",level:3},{value:"Methods",id:"methods",level:2},{value:"Observe with $",id:"observe-with-",level:3},{value:"exportJSON()",id:"exportjson",level:3},{value:"importJSON()",id:"importjson",level:3},{value:"backup()",id:"backup",level:3},{value:"waitForLeadership()",id:"waitforleadership",level:3},{value:"requestIdlePromise()",id:"requestidlepromise",level:3},{value:"close()",id:"close",level:3},{value:"remove()",id:"remove",level:3},{value:"isRxDatabase",id:"isrxdatabase",level:3},{value:"collections$",id:"collections",level:3}];function d(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",ul:"ul",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.header,{children:(0,a.jsx)(s.h1,{id:"rxdatabase",children:"RxDatabase"})}),"\n",(0,a.jsx)(s.p,{children:"A RxDatabase-Object contains your collections and handles the synchronization of change-events."}),"\n",(0,a.jsx)(s.h2,{id:"creation",children:"Creation"}),"\n",(0,a.jsxs)(s.p,{children:["The database is created by the asynchronous ",(0,a.jsx)(s.code,{children:".createRxDatabase()"})," function of the core RxDB module. It has the following parameters:"]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'heroesdb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- name"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- RxStorage"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* Optional parameters: */"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" password"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myPassword'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- password (optional)"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" multiInstance"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- multiInstance (optional, default: true)"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" eventReduce"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- eventReduce (optional, default: false)"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" cleanupPolicy"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {} "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// <- custom cleanup policy (optional) "})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(s.h3,{id:"name",children:"name"}),"\n",(0,a.jsxs)(s.p,{children:["The database-name is a string which uniquely identifies the database. When two RxDatabases have the same name and use the same ",(0,a.jsx)(s.code,{children:"RxStorage"}),", their data can be assumed as equal and they will share events between each other.\nDepending on the storage or adapter this can also be used to define the filesystem folder of your data."]}),"\n",(0,a.jsx)(s.h3,{id:"storage",children:"storage"}),"\n",(0,a.jsxs)(s.p,{children:["RxDB works on top of an implementation of the ",(0,a.jsx)(s.a,{href:"/rx-storage.html",children:"RxStorage"})," interface. This interface is an abstraction that allows you to use different underlying databases that actually handle the documents. Depending on your use case you might use a different ",(0,a.jsx)(s.code,{children:"storage"})," with different tradeoffs in performance, bundle size or supported runtimes."]}),"\n",(0,a.jsxs)(s.p,{children:["There are many ",(0,a.jsx)(s.code,{children:"RxStorage"})," implementations that can be used depending on the JavaScript environment and performance requirements.\nFor example you can use the ",(0,a.jsx)(s.a,{href:"/rx-storage-localstorage.html",children:"LocalStorage RxStorage"})," in the browser or use the ",(0,a.jsx)(s.a,{href:"/rx-storage-mongodb.html",children:"MongoDB RxStorage"})," in Node.js."]}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsx)(s.li,{children:(0,a.jsx)(s.a,{href:"/rx-storage.html",children:"List of RxStorage implementations"})}),"\n"]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// use the LocalStroage that stores data in the browser."})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// ...or use the MongoDB RxStorage in Node.js."})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageMongoDB } "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-mongodb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" dbMongo"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageMongoDB"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" connection"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mongodb://localhost:27017,localhost:27018,localhost:27019'"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(s.h3,{id:"password",children:"password"}),"\n",(0,a.jsxs)(s.p,{children:[(0,a.jsx)(s.code,{children:"(optional)"}),"\nIf you want to use encrypted fields in the collections of a database, you have to set a password for it. The password must be a string with at least 12 characters."]}),"\n",(0,a.jsxs)(s.p,{children:[(0,a.jsx)(s.a,{href:"/encryption.html",children:"Read more about encryption here"}),"."]}),"\n",(0,a.jsx)(s.h3,{id:"multiinstance",children:"multiInstance"}),"\n",(0,a.jsxs)(s.p,{children:[(0,a.jsx)(s.code,{children:"(optional=true)"}),"\nWhen you create more than one instance of the same database in a single javascript-runtime, you should set ",(0,a.jsx)(s.code,{children:"multiInstance"})," to ",(0,a.jsx)(s.code,{children:"true"}),". This will enable the event sharing between the two instances. For example when the user has opened multiple browser windows, events will be shared between them so that both windows react to the same changes.\n",(0,a.jsx)(s.code,{children:"multiInstance"})," should be set to ",(0,a.jsx)(s.code,{children:"false"})," when you have single-instances like a single Node.js-process, a react-native-app, a cordova-app or a single-window ",(0,a.jsx)(s.a,{href:"/electron-database.html",children:"electron"})," app which can decrease the startup time because no instance coordination has to be done."]}),"\n",(0,a.jsx)(s.h3,{id:"eventreduce",children:"eventReduce"}),"\n",(0,a.jsx)(s.p,{children:(0,a.jsx)(s.code,{children:"(optional=false)"})}),"\n",(0,a.jsxs)(s.p,{children:["One big benefit of having a realtime database is that big performance optimizations can be done when the database knows a query is observed and the updated results are needed continuously. RxDB uses the ",(0,a.jsx)(s.a,{href:"https://github.com/pubkey/event-reduce",children:"EventReduce Algorithm"})," to optimize observer or recurring queries."]}),"\n",(0,a.jsxs)(s.p,{children:["For better performance, you should always set ",(0,a.jsx)(s.code,{children:"eventReduce: true"}),". This will also be the default in the next major RxDB version."]}),"\n",(0,a.jsx)(s.h3,{id:"ignoreduplicate",children:"ignoreDuplicate"}),"\n",(0,a.jsxs)(s.p,{children:[(0,a.jsx)(s.code,{children:"(optional=false)"}),"\nIf you create multiple RxDatabase-instances with the same name and same adapter, it's very likely that you have done something wrong.\nTo prevent this common mistake, RxDB will throw an error when you do this.\nIn some rare cases like unit-tests, you want to do this intentional by setting ",(0,a.jsx)(s.code,{children:"ignoreDuplicate"})," to ",(0,a.jsx)(s.code,{children:"true"}),". Because setting ",(0,a.jsx)(s.code,{children:"ignoreDuplicate: true"})," in production will decrease the performance by having multiple instances of the same database, ",(0,a.jsx)(s.code,{children:"ignoreDuplicate"})," is only allowed to be set in ",(0,a.jsx)(s.a,{href:"/dev-mode.html",children:"dev-mode"}),"."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db1"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'heroesdb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ignoreDuplicate"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db2"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'heroesdb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ignoreDuplicate"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // this create-call will not throw because you explicitly allow it"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(s.h3,{id:"closeduplicates",children:"closeDuplicates"}),"\n",(0,a.jsx)(s.p,{children:(0,a.jsx)(s.code,{children:"(optional=false)"})}),"\n",(0,a.jsx)(s.p,{children:"Closes all other RxDatabases instances that have the same storage+name combination."}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db1"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'heroesdb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" closeDuplicates"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db2"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'heroesdb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" closeDuplicates"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // this create-call will close db1"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// db1 is now closed."})})]})})}),"\n",(0,a.jsx)(s.h3,{id:"hashfunction",children:"hashFunction"}),"\n",(0,a.jsxs)(s.p,{children:["By default, RxDB will use ",(0,a.jsx)(s.code,{children:"crypto.subtle.digest('SHA-256', data)"})," for hashing. If you need a different hash function or the ",(0,a.jsx)(s.code,{children:"crypto.subtle"})," API is not supported in your JavaScript runtime, you can provide an own hash function instead. A hash function gets a string as input and returns a ",(0,a.jsx)(s.code,{children:"Promise"})," that resolves a string."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// example hash function that runs in plain JavaScript"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { sha256 } "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'ohash'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" myOwnHashFunction"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(input"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" string"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:") {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" Promise"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".resolve"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"sha256"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(input));"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" hashFunction"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" myOwnHashFunction"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsxs)(s.p,{children:["If you get the error message ",(0,a.jsx)(s.code,{children:"TypeError: Cannot read properties of undefined (reading 'digest')"})," this likely means that you are neither running on ",(0,a.jsx)(s.code,{children:"localhost"})," nor on ",(0,a.jsx)(s.code,{children:"https"})," which is why your browser might not allow access to ",(0,a.jsx)(s.code,{children:"crypto.subtle.digest"}),"."]}),"\n",(0,a.jsx)(s.h2,{id:"methods",children:"Methods"}),"\n",(0,a.jsx)(s.h3,{id:"observe-with-",children:"Observe with $"}),"\n",(0,a.jsxs)(s.p,{children:["Calling this will return an ",(0,a.jsx)(s.a,{href:"http://reactivex.io/documentation/observable.html",children:"rxjs-Observable"})," which streams all write events of the ",(0,a.jsx)(s.code,{children:"RxDatabase"}),"."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsx)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"myDb"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"$"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(changeEvent "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(changeEvent));"})]})})})}),"\n",(0,a.jsx)(s.h3,{id:"exportjson",children:"exportJSON()"}),"\n",(0,a.jsxs)(s.p,{children:["Use this function to create a json-export from every piece of data in every collection of this database. You can pass ",(0,a.jsx)(s.code,{children:"true"})," as a parameter to decrypt the encrypted data-fields of your document."]}),"\n",(0,a.jsxs)(s.p,{children:["Before ",(0,a.jsx)(s.code,{children:"exportJSON()"})," and ",(0,a.jsx)(s.code,{children:"importJSON()"})," can be used, you have to add the ",(0,a.jsx)(s.code,{children:"json-dump"})," plugin."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { addRxPlugin } "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { RxDBJsonDumpPlugin } "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/json-dump'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addRxPlugin"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(RxDBJsonDumpPlugin);"})]})]})})}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"myDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exportJSON"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" .then"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(json "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(json));"})]})]})})}),"\n",(0,a.jsx)(s.h3,{id:"importjson",children:"importJSON()"}),"\n",(0,a.jsx)(s.p,{children:"To import the json-dumps into your database, use this function."}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// import the dump to the database"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"emptyDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".importJSON"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(json)"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" .then"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(() "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'done'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"));"})]})]})})}),"\n",(0,a.jsx)(s.h3,{id:"backup",children:"backup()"}),"\n",(0,a.jsxs)(s.p,{children:["Writes the current (or ongoing) database state to the filesystem. ",(0,a.jsx)(s.a,{href:"/backup.html",children:"Read more"})]}),"\n",(0,a.jsx)(s.h3,{id:"waitforleadership",children:"waitForLeadership()"}),"\n",(0,a.jsxs)(s.p,{children:["Returns a Promise which resolves when the RxDatabase becomes ",(0,a.jsx)(s.a,{href:"/leader-election.html",children:"elected leader"}),"."]}),"\n",(0,a.jsx)(s.h3,{id:"requestidlepromise",children:"requestIdlePromise()"}),"\n",(0,a.jsxs)(s.p,{children:["Returns a promise which resolves when the database is in idle. This works similar to ",(0,a.jsx)(s.a,{href:"https://developer.mozilla.org/de/docs/Web/API/Window/requestIdleCallback",children:"requestIdleCallback"})," but tracks the idle-ness of the database instead of the CPU.\nUse this for semi-important tasks like cleanups which should not affect the speed of important tasks."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"myDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".requestIdlePromise"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".then"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(() "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // this will run at the moment the database has nothing else to do"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".customCleanupFunction"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// with timeout"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"myDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".requestIdlePromise"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"1000"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* time in ms */"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".then"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(() "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // this will run at the moment the database has nothing else to do"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // or the timeout has passed"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".customCleanupFunction"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "})]})})}),"\n",(0,a.jsx)(s.h3,{id:"close",children:"close()"}),"\n",(0,a.jsxs)(s.p,{children:["Closes the databases object-instance. This is to free up memory and stop all observers and replications.\nReturns a ",(0,a.jsx)(s.code,{children:"Promise"})," that resolves when the database is closed.\nClosing a database will not remove the databases data. When you create the database again with ",(0,a.jsx)(s.code,{children:"createRxDatabase()"}),", all data will still be there."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsx)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".close"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})})})}),"\n",(0,a.jsx)(s.h3,{id:"remove",children:"remove()"}),"\n",(0,a.jsx)(s.p,{children:"Wipes all documents from the storage. Use this to free up disc space."}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".remove"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// database instance is now gone"})})]})})}),"\n",(0,a.jsxs)(s.p,{children:["You can also clear a database without removing its instance by using ",(0,a.jsx)(s.code,{children:"removeRxDatabase()"}),". This is useful if you want to migrate data or reset the users state by renaming the database. Then you can remove the previous data with ",(0,a.jsx)(s.code,{children:"removeRxDatabase()"})," without creating a RxDatabase first. Notice that this will only remove the\nstored data on the storage. It will not clear the cache of any ",(0,a.jsx)(s.a,{href:"/rx-database.html",children:"RxDatabase"})," instances."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { removeRxDatabase } "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"removeRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'mydatabasename'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'localstorage'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})}),"\n",(0,a.jsx)(s.h3,{id:"isrxdatabase",children:"isRxDatabase"}),"\n",(0,a.jsx)(s.p,{children:"Returns true if the given object is an instance of RxDatabase. Returns false if not."}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { isRxDatabase } "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" is"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" isRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(myObj);"})]})]})})}),"\n",(0,a.jsx)(s.h3,{id:"collections",children:"collections$"}),"\n",(0,a.jsxs)(s.p,{children:["Emits events whenever a ",(0,a.jsx)(s.a,{href:"/rx-collection.html",children:"RxCollection"})," is added or removed to the instance of the RxDatabase. Notice that this only emits the JavaScript instance of the RxCollection class, it does not emit events across browser tabs."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" sub"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"collections$"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(event "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(event);"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" heroes"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" mySchema"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// -> emits the event"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"sub"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".unsubscribe"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,a.jsx)(s,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453(e,s,n){n.d(s,{R:()=>i,x:()=>t});var r=n(6540);const a={},o=r.createContext(a);function i(e){const s=r.useContext(o);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(a):e.components||a:i(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/25626d15.27c1b41f.js b/docs/assets/js/25626d15.27c1b41f.js deleted file mode 100644 index 6c3bcc50301..00000000000 --- a/docs/assets/js/25626d15.27c1b41f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[268],{7258(e,t,i){i.r(t),i.d(t,{default:()=>n});var s=i(4586),r=i(8711),c=i(6540),l=i(8141),h=i(4848);function n(){const{siteConfig:e}=(0,s.A)();return(0,c.useEffect)(()=>{(0,l.c)("join_chat",.4)}),(0,h.jsx)(r.A,{title:`Chat - ${e.title}`,description:"RxDB Community Chat",children:(0,h.jsx)("main",{children:(0,h.jsxs)("div",{className:"redirectBox",style:{textAlign:"center"},children:[(0,h.jsx)("a",{href:"/",children:(0,h.jsx)("div",{className:"logo",children:(0,h.jsx)("img",{src:"/files/logo/logo_text.svg",alt:"RxDB",width:160})})}),(0,h.jsx)("h1",{children:"\ud83d\udcac RxDB Chat"}),(0,h.jsx)("p",{children:(0,h.jsx)("b",{children:"You will be redirected in a few seconds."})}),(0,h.jsx)("p",{children:(0,h.jsx)("a",{href:"https://discord.gg/krNZtjZtpu",children:"Click here to open Chat"})}),(0,h.jsx)("meta",{httpEquiv:"Refresh",content:"1; url=https://discord.gg/krNZtjZtpu"})]})})})}}}]); \ No newline at end of file diff --git a/docs/assets/js/2564bf4f.b4905e08.js b/docs/assets/js/2564bf4f.b4905e08.js deleted file mode 100644 index e89eb838547..00000000000 --- a/docs/assets/js/2564bf4f.b4905e08.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[6724],{8365(e,s,n){n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"rxdb-tradeoffs","title":"RxDB Tradeoffs - Why NoSQL Triumphs on the Client","description":"Uncover RxDB\'s approach to modern database needs. From JSON-based queries to conflict handling without transactions, learn RxDB\'s unique tradeoffs.","source":"@site/docs/rxdb-tradeoffs.md","sourceDirName":".","slug":"/rxdb-tradeoffs.html","permalink":"/rxdb-tradeoffs.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB Tradeoffs - Why NoSQL Triumphs on the Client","slug":"rxdb-tradeoffs.html","description":"Uncover RxDB\'s approach to modern database needs. From JSON-based queries to conflict handling without transactions, learn RxDB\'s unique tradeoffs."}}');var a=n(4848),i=n(8453);const o={title:"RxDB Tradeoffs - Why NoSQL Triumphs on the Client",slug:"rxdb-tradeoffs.html",description:"Uncover RxDB's approach to modern database needs. From JSON-based queries to conflict handling without transactions, learn RxDB's unique tradeoffs."},t="RxDB Tradeoffs",l={},d=[{value:"Why not SQL syntax",id:"why-not-sql-syntax",level:2},{value:"SQL is made for database servers",id:"sql-is-made-for-database-servers",level:3},{value:"Typescript support",id:"typescript-support",level:3},{value:"Composeable queries",id:"composeable-queries",level:3},{value:"Why Document based (NoSQL)",id:"why-document-based-nosql",level:2},{value:"Javascript is made to work with objects",id:"javascript-is-made-to-work-with-objects",level:3},{value:"Caching",id:"caching",level:3},{value:"EventReduce",id:"eventreduce",level:3},{value:"Easier to use with typescript",id:"easier-to-use-with-typescript",level:3},{value:"Why no transactions",id:"why-no-transactions",level:2},{value:"Why no relations",id:"why-no-relations",level:2},{value:"Why is a schema required",id:"why-is-a-schema-required",level:2}];function c(e){const s={a:"a",code:"code",em:"em",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.header,{children:(0,a.jsx)(s.h1,{id:"rxdb-tradeoffs",children:"RxDB Tradeoffs"})}),"\n",(0,a.jsxs)(s.p,{children:[(0,a.jsx)(s.a,{href:"https://rxdb.info",children:"RxDB"})," is client-side, ",(0,a.jsx)(s.a,{href:"/offline-first.html",children:"offline first"})," Database for JavaScript applications.\nWhile RxDB could be used on the server side, most people use it on the client side together with an UI based application.\nTherefore RxDB was optimized for client side applications and had to take completely different tradeoffs than what a server side database would do."]}),"\n",(0,a.jsx)(s.h2,{id:"why-not-sql-syntax",children:"Why not SQL syntax"}),"\n",(0,a.jsxs)(s.p,{children:["When you ask people which database they would want for browsers, the most answer I hear is ",(0,a.jsx)(s.em,{children:"something SQL based like SQLite"}),".\nThis makes sense, SQL is a query language that most developers had learned in school/university and it is reusable across various database solutions.\nBut for RxDB (and other client side databases), using SQL is not a good option and instead it operates on document writes and the JSON based ",(0,a.jsx)(s.strong,{children:"Mango-query"})," syntax for querying."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// A Mango Query"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" lastName"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foo'"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sort"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" [{ age"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'asc'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }]"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,a.jsx)(s.h3,{id:"sql-is-made-for-database-servers",children:"SQL is made for database servers"}),"\n",(0,a.jsxs)(s.p,{children:["SQL is made to be used to run operations against a database server. You send a SQL string like ",(0,a.jsx)(s.code,{children:"SELECT SUM(column_name)..."})," to the database server and the server then runs all operations required to calculate the result and only send back that result.\nThis saves performance on the application side and ensures that the application itself is not blocked."]}),"\n",(0,a.jsxs)(s.p,{children:["But RxDB is a client-side database that runs ",(0,a.jsx)(s.strong,{children:"inside"})," of the application. There is no performance difference if the ",(0,a.jsx)(s.code,{children:"SUM()"})," query is run inside of the database or at the application level where a ",(0,a.jsx)(s.code,{children:"Array.reduce()"})," call calculates the result."]}),"\n",(0,a.jsx)(s.h3,{id:"typescript-support",children:"Typescript support"}),"\n",(0,a.jsxs)(s.p,{children:["SQL is ",(0,a.jsx)(s.code,{children:"string"})," based and therefore you need additional IDE tooling to ensure that your written database code is valid.\nUsing the Mango Query syntax instead, TypeScript can be used validate the queries and to autocomplete code and knows which fields do exist and which do not. By doing so, the correctness of queries can be ensured at compile-time instead of run-time."]}),"\n",(0,a.jsx)("p",{align:"center",children:(0,a.jsx)("img",{src:"./files/typescript-query-validation.png",alt:"TypeScript Query Validation"})}),"\n",(0,a.jsx)(s.h3,{id:"composeable-queries",children:"Composeable queries"}),"\n",(0,a.jsxs)(s.p,{children:["By using JSON based Mango Queries, it is easy to compose queries in plain JavaScript.\nFor example if you have any given query and want to add the condition ",(0,a.jsx)(s.code,{children:"user MUST BE 'foobar'"}),", you can just add the condition to the selector without having to parse and understand a complex SQL string."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,a.jsx)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"query"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"selector"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".user "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foobar'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]})})})}),"\n",(0,a.jsx)(s.p,{children:"Even merging the selectors of multiple queries is not a problem:"}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"queryA"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".selector "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" $and"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" queryA"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".selector"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" queryB"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".selector"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,a.jsx)(s.h2,{id:"why-document-based-nosql",children:"Why Document based (NoSQL)"}),"\n",(0,a.jsx)(s.p,{children:"Like other NoSQL databases, RxDB operates data on document level. It has no concept of tables, rows and columns. Instead we have collections, documents and fields."}),"\n",(0,a.jsx)(s.h3,{id:"javascript-is-made-to-work-with-objects",children:"Javascript is made to work with objects"}),"\n",(0,a.jsx)(s.h3,{id:"caching",children:"Caching"}),"\n",(0,a.jsx)(s.h3,{id:"eventreduce",children:"EventReduce"}),"\n",(0,a.jsx)(s.h3,{id:"easier-to-use-with-typescript",children:"Easier to use with typescript"}),"\n",(0,a.jsx)(s.p,{children:"Because of the document based approach, TypeScript can know the exact type of the query response while a SQL query could return anything from a number over a set of rows or a complex construct."}),"\n",(0,a.jsx)(s.h2,{id:"why-no-transactions",children:"Why no transactions"}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsx)(s.li,{children:"Does not work with offline-first"}),"\n",(0,a.jsx)(s.li,{children:"Does not work with multi-tab"}),"\n",(0,a.jsx)(s.li,{children:"Easier conflict handling on document level"}),"\n"]}),"\n",(0,a.jsx)(s.p,{children:"-- Instead of transactions, rxdb works with revisions"}),"\n",(0,a.jsx)(s.h2,{id:"why-no-relations",children:"Why no relations"}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsx)(s.li,{children:"Does not work with easy replication"}),"\n"]}),"\n",(0,a.jsx)(s.h2,{id:"why-is-a-schema-required",children:"Why is a schema required"}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsx)(s.li,{children:"migration of data on clients is hard"}),"\n",(0,a.jsx)(s.li,{children:"Why jsonschema"}),"\n"]}),"\n",(0,a.jsx)(s.h2,{id:""})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,a.jsx)(s,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},8453(e,s,n){n.d(s,{R:()=>o,x:()=>t});var r=n(6540);const a={},i=r.createContext(a);function o(e){const s=r.useContext(i);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(a):e.components||a:o(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/25a43fd4.f20d897d.js b/docs/assets/js/25a43fd4.f20d897d.js deleted file mode 100644 index b51a28e67bd..00000000000 --- a/docs/assets/js/25a43fd4.f20d897d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[4812],{8453(e,r,s){s.d(r,{R:()=>a,x:()=>l});var n=s(6540);const o={},i=n.createContext(o);function a(e){const r=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function l(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(i.Provider,{value:r},e.children)}},8803(e,r,s){s.r(r),s.d(r,{assets:()=>t,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"rx-storage-shared-worker","title":"Boost Performance with SharedWorker RxStorage","description":"Tap into single-instance storage with RxDB\'s SharedWorker. Improve efficiency, cut duplication, and keep your app lightning-fast across tabs.","source":"@site/docs/rx-storage-shared-worker.md","sourceDirName":".","slug":"/rx-storage-shared-worker.html","permalink":"/rx-storage-shared-worker.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Boost Performance with SharedWorker RxStorage","slug":"rx-storage-shared-worker.html","description":"Tap into single-instance storage with RxDB\'s SharedWorker. Improve efficiency, cut duplication, and keep your app lightning-fast across tabs."},"sidebar":"tutorialSidebar","previous":{"title":"Worker RxStorage \ud83d\udc51","permalink":"/rx-storage-worker.html"},"next":{"title":"Memory Mapped RxStorage \ud83d\udc51","permalink":"/rx-storage-memory-mapped.html"}}');var o=s(4848),i=s(8453);const a={title:"Boost Performance with SharedWorker RxStorage",slug:"rx-storage-shared-worker.html",description:"Tap into single-instance storage with RxDB's SharedWorker. Improve efficiency, cut duplication, and keep your app lightning-fast across tabs."},l="SharedWorker RxStorage",t={},d=[{value:"Usage",id:"usage",level:2},{value:"On the SharedWorker process",id:"on-the-sharedworker-process",level:3},{value:"On the main process",id:"on-the-main-process",level:3},{value:"Pre-build workers",id:"pre-build-workers",level:2},{value:"Building a custom worker",id:"building-a-custom-worker",level:2},{value:"Passing in a SharedWorker instance",id:"passing-in-a-sharedworker-instance",level:2},{value:"Set multiInstance: false",id:"set-multiinstance-false",level:2},{value:"Replication with SharedWorker",id:"replication-with-sharedworker",level:2},{value:"Limitations",id:"limitations",level:3},{value:"FAQ",id:"faq",level:3}];function c(e){const r={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Details:s}=r;return s||function(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.header,{children:(0,o.jsx)(r.h1,{id:"sharedworker-rxstorage",children:"SharedWorker RxStorage"})}),"\n",(0,o.jsxs)(r.p,{children:["The SharedWorker ",(0,o.jsx)(r.a,{href:"/rx-storage.html",children:"RxStorage"})," uses the ",(0,o.jsx)(r.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker",children:"SharedWorker API"})," to run the storage inside of a separate JavaScript process ",(0,o.jsx)(r.strong,{children:"in browsers"}),". Compared to a normal ",(0,o.jsx)(r.a,{href:"/rx-storage-worker.html",children:"WebWorker"}),", the SharedWorker is created exactly once, even when there are multiple browser tabs opened. Because of having exactly one worker, multiple performance optimizations can be done because the storage itself does not have to handle multiple opened database connections."]}),"\n",(0,o.jsx)(r.admonition,{title:"Premium",type:"note",children:(0,o.jsxs)(r.p,{children:["This plugin is part of ",(0,o.jsx)(r.a,{href:"/premium/",children:"RxDB Premium \ud83d\udc51"}),". It is not part of the default RxDB module."]})}),"\n",(0,o.jsx)(r.h2,{id:"usage",children:"Usage"}),"\n",(0,o.jsx)(r.h3,{id:"on-the-sharedworker-process",children:"On the SharedWorker process"}),"\n",(0,o.jsxs)(r.p,{children:["In the worker process JavaScript file, you have wrap the original RxStorage with ",(0,o.jsx)(r.code,{children:"getRxStorageIndexedDB()"}),"."]}),"\n",(0,o.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"// shared-worker.ts"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { exposeWorkerRxStorage } "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-worker'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { "})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageIndexedDB"})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/indexeddb'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:"exposeWorkerRxStorage"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" * You can wrap any implementation of the RxStorage interface"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" * into a worker."})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" * Here we use the IndexedDB RxStorage."})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(r.h3,{id:"on-the-main-process",children:"On the main process"}),"\n",(0,o.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageSharedWorker } "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-worker'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageIndexedDB } "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-indexeddb'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSharedWorker"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" * Contains any value that can be used as parameter"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" * to the SharedWorker constructor of thread.js"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" * Most likely you want to put the path to the shared-worker.js file in here."})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" * "})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" * "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"@link"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker?retiredLocale=de"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" workerInput"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'path/to/shared-worker.js'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" * (Optional) options"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" * for the worker."})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" workerOptions"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'module'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" credentials"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'omit'"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" )"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(r.h2,{id:"pre-build-workers",children:"Pre-build workers"}),"\n",(0,o.jsxs)(r.p,{children:["The ",(0,o.jsx)(r.code,{children:"shared-worker.js"})," must be a self containing JavaScript file that contains all dependencies in a bundle.\nTo make it easier for you, RxDB ships with pre-bundles worker files that are ready to use.\nYou can find them in the folder ",(0,o.jsx)(r.code,{children:"node_modules/rxdb-premium/dist/workers"})," after you have installed the ",(0,o.jsx)(r.a,{href:"/premium/",children:"RxDB Premium \ud83d\udc51 Plugin"}),". From there you can copy them to a location where it can be served from the webserver and then use their path to create the ",(0,o.jsx)(r.code,{children:"RxDatabase"})]}),"\n",(0,o.jsxs)(r.p,{children:["Any valid ",(0,o.jsx)(r.code,{children:"worker.js"})," JavaScript file can be used both, for normal Workers and SharedWorkers."]}),"\n",(0,o.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageSharedWorker } "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-worker'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSharedWorker"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" * Path to where the copied file from node_modules/rxdb-premium/dist/workers"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" * is reachable from the webserver."})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" workerInput"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '/indexeddb.shared-worker.js'"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" )"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(r.h2,{id:"building-a-custom-worker",children:"Building a custom worker"}),"\n",(0,o.jsxs)(r.p,{children:["To build a custom ",(0,o.jsx)(r.code,{children:"worker.js"})," file, check out the webpack config at the ",(0,o.jsx)(r.a,{href:"/rx-storage-worker.html#building-a-custom-worker",children:"worker"})," documentation. Any worker file form the worker storage can also be used in a shared worker because ",(0,o.jsx)(r.code,{children:"exposeWorkerRxStorage"})," detects where it runs and exposes the correct messaging endpoints."]}),"\n",(0,o.jsx)(r.h2,{id:"passing-in-a-sharedworker-instance",children:"Passing in a SharedWorker instance"}),"\n",(0,o.jsxs)(r.p,{children:["Instead of setting an url as ",(0,o.jsx)(r.code,{children:"workerInput"}),", you can also specify a function that returns a new ",(0,o.jsx)(r.code,{children:"SharedWorker"})," instance when called. This is mostly used when you have a custom worker file and dynamically import it.\nThis works equal to the ",(0,o.jsx)(r.a,{href:"/rx-storage-worker.html#passing-in-a-worker-instance",children:"workerInput of the Worker Storage"})]}),"\n",(0,o.jsx)(r.h2,{id:"set-multiinstance-false",children:"Set multiInstance: false"}),"\n",(0,o.jsxs)(r.p,{children:["When you know that you only ever create your RxDatabase inside of the shared worker, you might want to set ",(0,o.jsx)(r.code,{children:"multiInstance: false"})," to prevent sending change events across JavaScript realms and to improve performance. Do not set this when you also create the same storage on another realm, like when you have the same RxDatabase once inside the shared worker and once on the main thread."]}),"\n",(0,o.jsx)(r.h2,{id:"replication-with-sharedworker",children:"Replication with SharedWorker"}),"\n",(0,o.jsxs)(r.p,{children:["When a SharedWorker RxStorage is used, it is recommended to run the replication ",(0,o.jsx)(r.strong,{children:"inside"})," of the worker. This is the best option for performance. You can do that by opening another ",(0,o.jsx)(r.a,{href:"/rx-database.html",children:"RxDatabase"})," inside of it and starting the replication there. If you are not concerned about performance, you can still start replication on the main thread instead. But you should never run replication on both the main thread ",(0,o.jsx)(r.strong,{children:"and"})," the worker."]}),"\n",(0,o.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"// shared-worker.ts"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { exposeWorkerRxStorage } "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-worker'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { "})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageIndexedDB"})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-indexeddb'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" addRxPlugin"})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" RxDBReplicationGraphQLPlugin"})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication-graphql'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:"addRxPlugin"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"(RxDBReplicationGraphQLPlugin);"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" baseStorage"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"// first expose the RxStorage to the outside"})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:"exposeWorkerRxStorage"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" baseStorage"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" * Then create a normal RxDatabase and RxCollections"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" * and start the replication."})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" baseStorage"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" humans"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"}"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:"humans"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:".syncGraphQL"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})]})]})})}),"\n",(0,o.jsx)(r.h3,{id:"limitations",children:"Limitations"}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsxs)(r.li,{children:["The SharedWorker API is ",(0,o.jsx)(r.a,{href:"https://caniuse.com/sharedworkers",children:"not available in some mobile browser"})]}),"\n"]}),"\n",(0,o.jsx)(r.h3,{id:"faq",children:"FAQ"}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:"Can I use this plugin with a Service Worker?"}),(0,o.jsx)("div",{children:(0,o.jsxs)(r.p,{children:["No. A Service Worker ",(0,o.jsx)("a",{href:"https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API",children:"is not the same"})," as a Shared Worker. While you can use RxDB inside of a ServiceWorker, you cannot use the ServiceWorker as a RxStorage that gets accessed by an outside RxDatabase instance."]})})]})]})}function h(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/26b8a621.0fdedfc5.js b/docs/assets/js/26b8a621.0fdedfc5.js deleted file mode 100644 index 7a65f0908bf..00000000000 --- a/docs/assets/js/26b8a621.0fdedfc5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[2055],{1673(e,t,n){n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>c,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"replication-p2p","title":"Seamless P2P Data Sync","description":"Discover how replication-webrtc ensures secure P2P data sync and real-time collaboration with RxDB. Explore the future of offline-first apps!","source":"@site/docs/replication-p2p.md","sourceDirName":".","slug":"/replication-p2p.html","permalink":"/replication-p2p.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Seamless P2P Data Sync","slug":"replication-p2p.html","description":"Discover how replication-webrtc ensures secure P2P data sync and real-time collaboration with RxDB. Explore the future of offline-first apps!"}}');var o=n(4848),i=n(8453);const a={title:"Seamless P2P Data Sync",slug:"replication-p2p.html",description:"Discover how replication-webrtc ensures secure P2P data sync and real-time collaboration with RxDB. Explore the future of offline-first apps!"},c="The RxDB Plugin replication-p2p has been renamed to replication-webrtc",s={},l=[];function p(e){const t={a:"a",code:"code",h1:"h1",header:"header",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsxs)(t.h1,{id:"the-rxdb-plugin-replication-p2p-has-been-renamed-to-replication-webrtc",children:["The RxDB Plugin ",(0,o.jsx)(t.code,{children:"replication-p2p"})," has been renamed to ",(0,o.jsx)(t.code,{children:"replication-webrtc"})]})}),"\n",(0,o.jsxs)(t.p,{children:["The new documentation page has been moved to ",(0,o.jsx)(t.a,{href:"/replication-webrtc.html",children:"here"})]}),"\n",(0,o.jsx)("meta",{"http-equiv":"refresh",content:"0; url=https://rxdb.info/replication-webrtc.html"})]})}function h(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},8453(e,t,n){n.d(t,{R:()=>a,x:()=>c});var r=n(6540);const o={},i=r.createContext(o);function a(e){const t=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/280a2389.3dec6d46.js b/docs/assets/js/280a2389.3dec6d46.js deleted file mode 100644 index 3579697ed66..00000000000 --- a/docs/assets/js/280a2389.3dec6d46.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[176],{522(e,i,l){l.r(i),l.d(i,{default:()=>h});var r=l(4586),s=l(8711),c=l(6540),t=l(8141),d=l(4848);function h(){const{siteConfig:e}=(0,r.A)();return(0,c.useEffect)(()=>{(0,t.c)("meeting-link-clicked",40,1)}),(0,d.jsx)(s.A,{title:`Meeting - ${e.title}`,description:"RxDB Meeting Scheduler",children:(0,d.jsx)("main",{children:(0,d.jsxs)("div",{className:"redirectBox",style:{textAlign:"center"},children:[(0,d.jsx)("a",{href:"/",children:(0,d.jsx)("div",{className:"logo",children:(0,d.jsx)("img",{src:"/files/logo/logo_text.svg",alt:"RxDB",width:160})})}),(0,d.jsx)("h1",{children:"RxDB Meeting Scheduler"}),(0,d.jsx)("p",{children:(0,d.jsx)("b",{children:"You will be redirected in a few seconds."})}),(0,d.jsx)("p",{children:(0,d.jsx)("a",{href:"https://rxdb.pipedrive.com/scheduler/QBbGlDC4/schedulr",children:"Click here"})}),(0,d.jsx)("meta",{httpEquiv:"Refresh",content:"0; url=https://rxdb.pipedrive.com/scheduler/QBbGlDC4/schedulr"})]})})})}}}]); \ No newline at end of file diff --git a/docs/assets/js/294ac9d5.a530f746.js b/docs/assets/js/294ac9d5.a530f746.js deleted file mode 100644 index 980c2961119..00000000000 --- a/docs/assets/js/294ac9d5.a530f746.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[8744],{2606(n,s,e){e.r(s),e.d(s,{assets:()=>t,contentTitle:()=>a,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"plugins","title":"Creating Plugins","description":"Creating your own plugin is very simple. A plugin is basically a javascript-object which overwrites or extends RxDB\'s internal classes, prototypes, and hooks.","source":"@site/docs/plugins.md","sourceDirName":".","slug":"/plugins.html","permalink":"/plugins.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Creating Plugins","slug":"plugins.html"},"sidebar":"tutorialSidebar","previous":{"title":"Query Cache","permalink":"/query-cache.html"},"next":{"title":"Errors","permalink":"/errors.html"}}');var o=e(4848),i=e(8453);const l={title:"Creating Plugins",slug:"plugins.html"},a="Creating Plugins",t={},c=[{value:"rxdb",id:"rxdb",level:2},{value:"prototypes",id:"prototypes",level:2},{value:"overwritable",id:"overwritable",level:2}];function d(n){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",span:"span",...(0,i.R)(),...n.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"creating-plugins",children:"Creating Plugins"})}),"\n",(0,o.jsx)(s.p,{children:"Creating your own plugin is very simple. A plugin is basically a javascript-object which overwrites or extends RxDB's internal classes, prototypes, and hooks."}),"\n",(0,o.jsx)(s.p,{children:"A basic plugin:"}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myPlugin"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" rxdb"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // this must be true so rxdb knows that this is a rxdb-plugin"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * (optional) init() method"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * that is called when the plugin is added to RxDB for the first time."})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" init"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // import other plugins or initialize stuff"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * every value in this object can manipulate the prototype of the keynames class"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * You can manipulate every prototype in this list:"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"@link"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" https://github.com/pubkey/rxdb/blob/master/src/plugin.ts#L22"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" prototypes"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * add a function to RxCollection so you can call 'myCollection.hello()'"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" *"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"@param"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" {object}"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" prototype of RxCollection"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" RxCollection"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (proto) "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" proto"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"hello"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'world'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * some methods are static and can be overwritten in the overwritable-object"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" overwritable"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" validatePassword"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(password) {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (password "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"&&"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" typeof"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" password "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"!=="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ||"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" password"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"length"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" <"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" throw"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" TypeError"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'password is not valid'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * you can add hooks to the hook-list"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" hooks"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * add a `foo` property to each document. You can then call myDocument.foo (='bar')"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDocument"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * You can either add the hook running 'before' or 'after'"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * the hooks of other plugins."})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" after"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(doc) {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".foo "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bar'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// now you can import the plugin into rxdb"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addRxPlugin"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(myPlugin);"})]})]})})}),"\n",(0,o.jsx)(s.h1,{id:"properties",children:"Properties"}),"\n",(0,o.jsx)(s.h2,{id:"rxdb",children:"rxdb"}),"\n",(0,o.jsxs)(s.p,{children:["The ",(0,o.jsx)(s.code,{children:"rxdb"}),"-property signals that this plugin is an rxdb-plugin. The value should always be ",(0,o.jsx)(s.code,{children:"true"}),"."]}),"\n",(0,o.jsx)(s.h2,{id:"prototypes",children:"prototypes"}),"\n",(0,o.jsxs)(s.p,{children:["The ",(0,o.jsx)(s.code,{children:"prototypes"}),"-property contains a function for each of RxDB's internal prototype that you want to manipulate. Each function gets the prototype-object of the corresponding class as parameter and then can modify it. You can see a list of all available prototypes ",(0,o.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/blob/master/src/plugin.ts",children:"here"})]}),"\n",(0,o.jsx)(s.h2,{id:"overwritable",children:"overwritable"}),"\n",(0,o.jsxs)(s.p,{children:["Some of RxDB's functions are not inside of a class-prototype but are static. You can set and overwrite them with the ",(0,o.jsx)(s.code,{children:"overwritable"}),"-object. You can see a list of all overwritables ",(0,o.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/blob/master/src/overwritable.ts",children:"here"}),"."]}),"\n",(0,o.jsx)(s.h1,{id:"hooks",children:"hooks"}),"\n",(0,o.jsxs)(s.p,{children:["Sometimes you don't want to overwrite an existing RxDB-method, but extend it. You can do this by adding hooks which will be called each time the code jumps into the hooks corresponding call. You can find a list of all hooks ",(0,o.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/blob/master/src/hooks.ts",children:"here"}),"."]}),"\n",(0,o.jsx)(s.h1,{id:"options",children:"options"}),"\n",(0,o.jsx)(s.p,{children:"RxDatabase and RxCollection have an additional options-parameter, which can be filled with any data required be the plugin."}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" collection"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" foo"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" mySchema"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" options"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// anything can be passed into the options"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" foo"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ()"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'bar'"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"})"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Afterwards you can use these options in your plugin."})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"collection"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"options"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".foo"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(); "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// 'bar'"})]})]})})})]})}function h(n={}){const{wrapper:s}={...(0,i.R)(),...n.components};return s?(0,o.jsx)(s,{...n,children:(0,o.jsx)(d,{...n})}):d(n)}},8453(n,s,e){e.d(s,{R:()=>l,x:()=>a});var r=e(6540);const o={},i=r.createContext(o);function l(n){const s=r.useContext(i);return r.useMemo(function(){return"function"==typeof n?n(s):{...s,...n}},[s,n])}function a(n){let s;return s=n.disableParentContext?"function"==typeof n.components?n.components(o):n.components||o:l(n.components),r.createElement(i.Provider,{value:s},n.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/2aec6989.93b045aa.js b/docs/assets/js/2aec6989.93b045aa.js deleted file mode 100644 index 2b2df407deb..00000000000 --- a/docs/assets/js/2aec6989.93b045aa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[7498],{4633(e,s,r){r.r(s),r.d(s,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>t,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"articles/indexeddb-max-storage-limit","title":"IndexedDB Max Storage Size Limit - Detailed Best Practices","description":"Learn how browsers enforce IndexedDB storage size limits, how to test and handle quota exceeded errors, and best practices for storing large amounts of data offline.","source":"@site/docs/articles/indexeddb-max-storage-limit.md","sourceDirName":"articles","slug":"/articles/indexeddb-max-storage-limit.html","permalink":"/articles/indexeddb-max-storage-limit.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"IndexedDB Max Storage Size Limit - Detailed Best Practices","slug":"indexeddb-max-storage-limit.html","description":"Learn how browsers enforce IndexedDB storage size limits, how to test and handle quota exceeded errors, and best practices for storing large amounts of data offline."},"sidebar":"tutorialSidebar","previous":{"title":"Zero Latency Local First Apps with RxDB \u2013 Sync, Encryption and Compression","permalink":"/articles/zero-latency-local-first.html"},"next":{"title":"JSON-Based Databases - Why NoSQL and RxDB Simplify App Development","permalink":"/articles/json-based-database.html"}}');var i=r(4848),o=r(8453),a=r(2271);const t={title:"IndexedDB Max Storage Size Limit - Detailed Best Practices",slug:"indexeddb-max-storage-limit.html",description:"Learn how browsers enforce IndexedDB storage size limits, how to test and handle quota exceeded errors, and best practices for storing large amounts of data offline."},l="IndexedDB Max Storage Size Limit",d={},c=[{value:"Why IndexedDB Has a Storage Limit",id:"why-indexeddb-has-a-storage-limit",level:2},{value:"Browser-Specific IndexedDB Limits",id:"browser-specific-indexeddb-limits",level:2},{value:"Checking Your Current IndexedDB Usage",id:"checking-your-current-indexeddb-usage",level:2},{value:"Testing Your App\u2019s IndexedDB Quotas",id:"testing-your-apps-indexeddb-quotas",level:2},{value:"Handling Errors When Limits Are Reached",id:"handling-errors-when-limits-are-reached",level:2},{value:"Tricks to Exceed the Storage Size Limitation",id:"tricks-to-exceed-the-storage-size-limitation",level:2},{value:"IndexedDB Max Size of a Single Object",id:"indexeddb-max-size-of-a-single-object",level:2},{value:"Is There a Time Limit for Data Stored in IndexedDB?",id:"is-there-a-time-limit-for-data-stored-in-indexeddb",level:2},{value:"Follow Up",id:"follow-up",level:2}];function h(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",hr:"hr",p:"p",pre:"pre",span:"span",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"indexeddb-max-storage-size-limit",children:"IndexedDB Max Storage Size Limit"})}),"\n",(0,i.jsx)(s.p,{children:"IndexedDB is widely known as the primary browser-based storage API for large client-side data, particularly valuable for modern offline-first applications. These apps aim to keep everything functional and interactive even without an internet connection, which naturally demands substantial local storage. However, IndexedDB has various size limits depending on the browser, disk space, and user settings. Being aware of these constraints is crucial so you can avoid quota errors and deliver a seamless user experience without unexpected data loss."}),"\n",(0,i.jsx)(s.p,{children:"Offline-first apps have grown in popularity because they provide immediate feedback, zero-latency interactions, and resilience in poor network conditions. Storing big data sets, or even entire data models, in IndexedDB has become far more common than in the era of small localStorage or cookie usage. But all this local data is subject to quotas, and that\u2019s exactly what this guide will help you understand and manage."}),"\n",(0,i.jsx)(s.h2,{id:"why-indexeddb-has-a-storage-limit",children:"Why IndexedDB Has a Storage Limit"}),"\n",(0,i.jsxs)(s.p,{children:["Browsers need a way to curb runaway disk usage and safeguard user resources. This is accomplished through ",(0,i.jsx)(s.strong,{children:"quota management"})," policies, which can vary among Chrome, Firefox, Safari, Edge, and others. Some browsers use a percentage of your total disk space, while others rely on a fixed maximum or dynamic approach per origin. These policies are designed to prevent malicious or poorly optimized web pages from consuming an unreasonable amount of user storage."]}),"\n",(0,i.jsx)(s.p,{children:"Chrome (and Chromium-based browsers) typically allow you to use a percentage of the user\u2019s free disk space, whereas Firefox historically prompts users to allow more than 5 MB in mobile or 50 MB in desktop. Safari often sets tighter maximum caps, especially on iOS devices. Edge aligns closely with Chrome\u2019s rules but can also include enterprise or corporate policy overrides. Understanding these default or dynamic limits prepares you to plan your app\u2019s storage needs appropriately."}),"\n",(0,i.jsx)(s.h2,{id:"browser-specific-indexeddb-limits",children:"Browser-Specific IndexedDB Limits"}),"\n",(0,i.jsx)(s.p,{children:"IndexedDB size quotas differ significantly across browsers and platforms. While there isn\u2019t a universal rule, the following table summarizes approximate limits and any notes or caveats you should be aware of:"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Browser"}),(0,i.jsx)(s.th,{children:"Approx. Limit"}),(0,i.jsx)(s.th,{children:"Notes"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Chrome/Chromium"}),(0,i.jsx)(s.td,{children:"Up to ~80% of free disk, per origin cap"}),(0,i.jsx)(s.td,{children:"Often cited as 60 GB on a 100 GB drive. Shared pool approach. Quota usage can prompt partial or extended user approvals."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Firefox"}),(0,i.jsx)(s.td,{children:"~2 GB (desktop) or ~5 MB initial for mobile"}),(0,i.jsx)(s.td,{children:"Older versions asked permission at 50 MB for desktop. Ephemeral/incognito sessions may require repeated user prompts."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Safari (iOS)"}),(0,i.jsx)(s.td,{children:"~1 GB per origin (variable)"}),(0,i.jsx)(s.td,{children:"Historically stricter. iOS devices limit quotas further. Behavior can differ between iOS Safari versions or iPadOS."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Edge"}),(0,i.jsx)(s.td,{children:"Similar to Chrome\u2019s 80% of free space"}),(0,i.jsx)(s.td,{children:"Can be influenced by Windows enterprise policies. Generally aligned with Chromium approach."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"iOS Safari"}),(0,i.jsx)(s.td,{children:"Typically 1 GB, can be less on older iOS"}),(0,i.jsx)(s.td,{children:"Early iOS versions were known for more aggressive quotas and data eviction on low space."})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Android Chrome"}),(0,i.jsx)(s.td,{children:"Similar to desktop Chrome"}),(0,i.jsx)(s.td,{children:"May exhibit warnings in especially low-storage devices. The same 80% free space logic generally applies."})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:["Historically, these limits have evolved. For instance, older Firefox versions included ",(0,i.jsx)(s.code,{children:"dom.indexedDB.warningQuota"}),", showing a 50 MB prompt on desktop or a 5 MB prompt on mobile\u2014many developers wrote about these notifications on Stack Overflow. Since around 2015, Firefox has changed its quota approach significantly. Likewise, Safari used to limit data more aggressively on older iOS versions. Some older tutorials suggest comparing IndexedDB to localStorage, but modern browsers allow far larger and more flexible storage with IndexedDB than the old localStorage or cookie-based setups."]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"checking-your-current-indexeddb-usage",children:"Checking Your Current IndexedDB Usage"}),"\n",(0,i.jsxs)(s.p,{children:["To assess where your app stands relative to these storage limits, you can use the ",(0,i.jsx)(s.strong,{children:"Storage Estimation API"}),". The snippet below shows how to estimate both your used storage and the total space allocated to your origin:"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" quota"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" navigator"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".estimate"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" totalSpace"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" quota"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".quota;"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" usedSpace"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" quota"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".usage;"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Approx total allocated space:'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" totalSpace);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Approx used space:'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" usedSpace);"})]})]})})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/StorageManager/persist#browser_compatibility",children:"Some browsers (all modern ones)"})," also provide a ",(0,i.jsx)(s.code,{children:"navigator.storage.persist()"})," method to request persistent storage, preventing the browser from automatically clearing your data if the user\u2019s device runs low on space. Note that users might deny such requests, or the request might fail silently on stricter environments. Always handle these outcomes gracefully and design your app to degrade if persistent storage is unavailable."]}),"\n",(0,i.jsx)(s.h2,{id:"testing-your-apps-indexeddb-quotas",children:"Testing Your App\u2019s IndexedDB Quotas"}),"\n",(0,i.jsx)(s.p,{children:"The best way to handle real-world usage is to test for low storage conditions and large data sets in different environments. You can fill up the space manually by writing repetitive test data or running scripts that bulk-insert documents until an error occurs."}),"\n",(0,i.jsxs)(s.p,{children:["Real-time usage monitors or dashboards can keep track of your ",(0,i.jsx)(s.code,{children:"navigator.storage.estimate()"})," results, letting you see how close you are to the max limit in production. Developer tools in Chrome or Firefox can simulate limited storage situations, which is crucial for QA:"]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)(a.N,{videoId:"Nf37yutU8y4",title:"Simulate low storage quota with DevTools ",duration:"0:42"})}),"\n",(0,i.jsx)("br",{}),"\n",(0,i.jsx)(s.p,{children:"This short tutorial shows how you can artificially reduce available storage in Google Chrome\u2019s dev tools to see how your app behaves when nearing or exceeding the quota."}),"\n",(0,i.jsx)(s.h2,{id:"handling-errors-when-limits-are-reached",children:"Handling Errors When Limits Are Reached"}),"\n",(0,i.jsxs)(s.p,{children:["When the user\u2019s device is too full or your app exceeds the allotted quota, most browsers will throw a ",(0,i.jsx)(s.strong,{children:"QuotaExceededError"})," (or similarly named exception) when trying to store additional data. Often, the request to IndexedDB simply fails with an error event. Handling this gracefully is essential to avoid crashes or data corruption."]}),"\n",(0,i.jsxs)(s.p,{children:["A typical approach is to wrap your write operations in try/catch blocks or in ",(0,i.jsx)(s.code,{children:"onsuccess"})," / ",(0,i.jsx)(s.code,{children:"onerror"})," event callbacks. If you detect a quota error, you can prompt the user to clear out old items or reduce the scope of offline data. Some apps implement a fallback system that removes less critical documents to free space and then retries the write."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"try"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" tx"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".transaction"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'largeStore'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'readwrite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" store"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" tx"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".objectStore"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'largeStore'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" store"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".add"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(hugeData"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" someKey);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" tx"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".done;"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"catch"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (error) {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"error"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".name "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"==="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'QuotaExceededError'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:") {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".warn"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'IndexedDB quota exceeded. Cleanup or prompt user to free space.'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Optionally remove older data or show a UI hint:"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // removeOldDocuments();"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // displayStorageFullDialog();"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"else"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // handle other errors"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".error"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'IndexedDB write error:'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" error);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.h2,{id:"tricks-to-exceed-the-storage-size-limitation",children:"Tricks to Exceed the Storage Size Limitation"}),"\n",(0,i.jsx)(s.p,{children:"Even if you plan well, your app might need more storage than a single origin typically allows. There are a few advanced tactics you can use:"}),"\n",(0,i.jsxs)(s.p,{children:["If you store binary data such as images or videos, consider compressing them via the Compression Streams API. For textual or ",(0,i.jsx)(s.a,{href:"/articles/json-based-database.html",children:"JSON data"}),", a library like ",(0,i.jsx)(s.a,{href:"/",children:"RxDB"})," supports built-in ",(0,i.jsx)(s.a,{href:"/key-compression.html",children:"key-compression"})," to shorten field names or entire documents. This can be extremely helpful when storing large sets of objects:"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Example: How key-compression can transform your documents internally"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" uncompressed"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "firstName"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "Corrine"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "lastName"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "Ziemann"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "shoppingCartItems"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "productNumber"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 29857"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "amount"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 1"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "productNumber"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 53409"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "amount"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 6"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" compressed"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "|e"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "Corrine"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "|g"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "Ziemann"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "|i"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "|h"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 29857"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "|b"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 1"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "|h"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 53409"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "|b"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 6"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,i.jsxs)(s.p,{children:["Sharding data across multiple subdomains or iframes is another trick, though it complicates communication. When you need truly massive offline data, you might store part of the data under ",(0,i.jsx)(s.code,{children:"sub1.yoursite.com"})," and another chunk under ",(0,i.jsx)(s.code,{children:"sub2.yoursite.com"}),", using ",(0,i.jsx)(s.code,{children:"postMessage()"})," to coordinate. This can circumvent single-origin limitations, but it introduces extra complexity. Another effective method is to let data expire automatically\u2014perhaps older records are removed if they haven\u2019t been accessed for a certain period."]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JavaScript Database",width:"220"})})}),"\n",(0,i.jsx)(s.h2,{id:"indexeddb-max-size-of-a-single-object",children:"IndexedDB Max Size of a Single Object"}),"\n",(0,i.jsxs)(s.p,{children:["There is no explicit cap on how large an individual object or record in IndexedDB can be, other than the overall disk quota. If you attempt to store one extremely large object, you will eventually hit browser memory constraints or the global storage quota. In practice, you\u2019ll encounter out-of-memory issues in JavaScript before IndexedDB itself refuses a single large write. A helpful test can be seen in ",(0,i.jsx)(s.a,{href:"https://jsfiddle.net/sdrqf8om/2/",children:"this JSFiddle experiment"})," where you see browsers can crash when creating massive in-memory objects."]}),"\n",(0,i.jsx)(s.h2,{id:"is-there-a-time-limit-for-data-stored-in-indexeddb",children:"Is There a Time Limit for Data Stored in IndexedDB?"}),"\n",(0,i.jsx)(s.p,{children:"IndexedDB data can remain indefinitely as long as the user does not clear the browser\u2019s data or the origin does not run afoul of automated eviction policies (e.g., Safari or Android might remove large caches for sites unused over a long period when space is needed). Typically, there is no \u201ctime limit,\u201d but ephemeral modes or incognito sessions have their own rules. If you rely on permanent offline data, request persistent storage and handle the possibility that the user or the OS could still remove your data under extreme conditions. Especially Safari is known to be very fast in deleting local data."}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"/files/safari-database.png",alt:"safari database",width:"200"})}),"\n",(0,i.jsx)(s.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,i.jsxs)(s.p,{children:["Learn more by checking the ",(0,i.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API",children:"IndexedDB official docs"}),", which detail store design, error handling, and quota usage. If you need a straightforward way to manage large offline data with compression and conflict resolution, explore the ",(0,i.jsx)(s.a,{href:"/quickstart.html",children:"RxDB Quickstart"}),". You can also join the community on ",(0,i.jsx)(s.a,{href:"/code/",children:"GitHub"})," to share tips on overcoming the ",(0,i.jsx)(s.strong,{children:"IndexedDB max storage size limit"})," in production environments."]})]})}function p(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453(e,s,r){r.d(s,{R:()=>a,x:()=>t});var n=r(6540);const i={},o=n.createContext(i);function a(e){const s=n.useContext(o);return n.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(i):e.components||i:a(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/2c41656d.5238f25d.js b/docs/assets/js/2c41656d.5238f25d.js deleted file mode 100644 index af785fc5bee..00000000000 --- a/docs/assets/js/2c41656d.5238f25d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[4142],{8453(e,s,n){n.d(s,{R:()=>a,x:()=>l});var r=n(6540);const i={},o=r.createContext(i);function a(e){const s=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:s},e.children)}},9376(e,s,n){n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"articles/react-indexeddb","title":"IndexedDB Database in React Apps - The Power of RxDB","description":"Discover how RxDB simplifies IndexedDB in React, offering reactive queries, offline-first capability, encryption, compression, and effortless integration.","source":"@site/docs/articles/react-indexeddb.md","sourceDirName":"articles","slug":"/articles/react-indexeddb.html","permalink":"/articles/react-indexeddb.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"IndexedDB Database in React Apps - The Power of RxDB","slug":"react-indexeddb.html","description":"Discover how RxDB simplifies IndexedDB in React, offering reactive queries, offline-first capability, encryption, compression, and effortless integration."},"sidebar":"tutorialSidebar","previous":{"title":"Build Smarter Offline-First Angular Apps - How RxDB Beats IndexedDB Alone","permalink":"/articles/angular-indexeddb.html"},"next":{"title":"Capacitor Database Guide - SQLite, RxDB & More","permalink":"/capacitor-database.html"}}');var i=n(4848),o=n(8453);const a={title:"IndexedDB Database in React Apps - The Power of RxDB",slug:"react-indexeddb.html",description:"Discover how RxDB simplifies IndexedDB in React, offering reactive queries, offline-first capability, encryption, compression, and effortless integration."},l="IndexedDB Database in React Apps - The Power of RxDB",t={},c=[{value:"What is IndexedDB?",id:"what-is-indexeddb",level:2},{value:"Why Use IndexedDB in React",id:"why-use-indexeddb-in-react",level:2},{value:"Why To Not Use Plain IndexedDB",id:"why-to-not-use-plain-indexeddb",level:2},{value:"Set up RxDB in React",id:"set-up-rxdb-in-react",level:2},{value:"Installing RxDB",id:"installing-rxdb",level:3},{value:"Create a Database and Collections",id:"create-a-database-and-collections",level:3},{value:"CRUD Operations",id:"crud-operations",level:3},{value:"Reactive Queries and Live Updates",id:"reactive-queries-and-live-updates",level:2},{value:"With RxJS Observables and React Hooks",id:"with-rxjs-observables-and-react-hooks",level:3},{value:"With Preact Signals",id:"with-preact-signals",level:3},{value:"React IndexedDB Example with RxDB",id:"react-indexeddb-example-with-rxdb",level:2},{value:"Advanced RxDB Features",id:"advanced-rxdb-features",level:2},{value:"Limitations of IndexedDB",id:"limitations-of-indexeddb",level:2},{value:"Alternatives to IndexedDB",id:"alternatives-to-indexeddb",level:2},{value:"Performance comparison with other browser storages",id:"performance-comparison-with-other-browser-storages",level:2},{value:"Follow Up",id:"follow-up",level:2}];function d(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"indexeddb-database-in-react-apps---the-power-of-rxdb",children:"IndexedDB Database in React Apps - The Power of RxDB"})}),"\n",(0,i.jsxs)(s.p,{children:["Building robust, ",(0,i.jsx)(s.a,{href:"/offline-first.html",children:"offline-capable"})," React applications often involves leveraging browser storage solutions to manage data. IndexedDB is one such powerful tool, but its raw API can be challenging to work with directly. RxDB abstracts away much of IndexedDB's complexity, providing a more developer-friendly experience. In this article, we'll explore what IndexedDB is, why it's beneficial in React applications, the challenges of using plain IndexedDB, and how ",(0,i.jsx)(s.a,{href:"https://rxdb.info/",children:"RxDB"})," can simplify your development process while adding advanced features."]}),"\n",(0,i.jsx)(s.h2,{id:"what-is-indexeddb",children:"What is IndexedDB?"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API",children:"IndexedDB"})," is a low-level API for storing significant amounts of structured data in the browser. It provides a transactional database system that can store key-value pairs, complex objects, and more. This storage engine is asynchronous and supports advanced data types, making it suitable for offline storage and complex web applications."]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("img",{src:"../files/icons/react.svg",alt:"React IndexedDB",width:"120"})}),"\n",(0,i.jsx)(s.h2,{id:"why-use-indexeddb-in-react",children:"Why Use IndexedDB in React"}),"\n",(0,i.jsx)(s.p,{children:"When building React applications, IndexedDB can play a crucial role in enhancing both performance and user experience. Here are some reasons to consider using IndexedDB:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Offline-First / Local-First"}),": By storing data locally, your application remains functional even without an internet connection."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Performance"}),": Using local data means ",(0,i.jsx)(s.a,{href:"/articles/zero-latency-local-first.html",children:"zero latency"})," and no loading spinners, as data doesn't need to be fetched over a network."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Easier Implementation"}),": Replicating all data to the client once is often simpler than implementing multiple endpoints for each user interaction."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Scalability"}),": Local data reduces server load because queries run on the client side, decreasing server bandwidth and processing requirements."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"why-to-not-use-plain-indexeddb",children:"Why To Not Use Plain IndexedDB"}),"\n",(0,i.jsx)(s.p,{children:"While IndexedDB itself is powerful, its native API comes with several drawbacks for everyday application developers:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Callback-Based API"}),": IndexedDB was designed with callbacks rather than modern Promises, making asynchronous code more cumbersome."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Complexity"}),": IndexedDB is low-level, intended for library developers rather than for app developers who simply want to store data."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Basic Query API"}),": Its rudimentary query capabilities limit how you can efficiently perform complex queries, whereas libraries like RxDB offer more advanced query features."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"TypeScript Support"}),": Ensuring good TypeScript support with IndexedDB is challenging, especially when trying to enforce document type consistency."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Lack of Observable API"}),": IndexedDB doesn't provide an observable API out of the box. RxDB solves this by enabling you to observe query results or specific document fields."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Cross-Tab Communication"}),": Managing cross-tab updates in plain IndexedDB is difficult. RxDB handles this seamlessly-changes in one tab automatically affect observed data in others."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Missing Advanced Features"}),": Features like encryption or compression aren't built into IndexedDB, but they are available via RxDB."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Limited Platform Support"}),": IndexedDB exists only in the browser. In contrast, RxDB offers swappable storages to use the same code in React Native, Capacitor, or Electron."]}),"\n"]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JavaScript Database",width:"220"})})}),"\n",(0,i.jsx)(s.h2,{id:"set-up-rxdb-in-react",children:"Set up RxDB in React"}),"\n",(0,i.jsx)(s.p,{children:"Setting up RxDB with React is straightforward. It abstracts IndexedDB complexities and adds a layer of powerful features over it."}),"\n",(0,i.jsx)(s.h3,{id:"installing-rxdb",children:"Installing RxDB"}),"\n",(0,i.jsx)(s.p,{children:"First, install RxDB and RxJS from npm:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" rxdb"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" rxjs"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" --save"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"```"})]})})})}),"\n",(0,i.jsx)(s.h3,{id:"create-a-database-and-collections",children:"Create a Database and Collections"}),"\n",(0,i.jsx)(s.p,{children:"RxDB provides two main storage options:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["The free ",(0,i.jsx)(s.a,{href:"/rx-storage-localstorage.html",children:"localstorage-based storage"})]}),"\n",(0,i.jsxs)(s.li,{children:["The premium plain ",(0,i.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB-based storage"}),", offering faster performance\nBelow is an example of setting up a simple RxDB ",(0,i.jsx)(s.a,{href:"/articles/react-database.html",children:"database"})," using the localstorage-based storage in a React app:"]}),"\n"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// create a database"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'heroesdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // the name of the database"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Define your schema"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" heroSchema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'hero schema'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" description"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Describes a hero in your app'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" power"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'name'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// add collections"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" heroSchema"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.h3,{id:"crud-operations",children:"CRUD Operations"}),"\n",(0,i.jsx)(s.p,{children:"Once your database is initialized, you can perform all CRUD operations:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// insert"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Iron Man'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" power"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Genius-level intellect'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// bulk insert"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".bulkInsert"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(["})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Thor'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" power"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'God of Thunder'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Hulk'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" power"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Superhuman Strength'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]);"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// find and findOne"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" ironMan"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Iron Man'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" } })"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// update"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Hulk'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" } })"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".update"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ $set"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { power"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Unlimited Strength'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" } });"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// delete"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Thor'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" } })"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".remove"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),"\n",(0,i.jsx)(s.h2,{id:"reactive-queries-and-live-updates",children:"Reactive Queries and Live Updates"}),"\n",(0,i.jsxs)(s.p,{children:["RxDB excels in providing reactive data capabilities, ideal for ",(0,i.jsx)(s.a,{href:"/articles/realtime-database.html",children:"real-time applications"}),". There are two main approaches to achieving live queries with RxDB: using RxJS Observables with React Hooks or utilizing Preact Signals."]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"../files/animations/realtime.gif",alt:"realtime ui updates",width:"700"})}),"\n",(0,i.jsx)(s.h3,{id:"with-rxjs-observables-and-react-hooks",children:"With RxJS Observables and React Hooks"}),"\n",(0,i.jsx)(s.p,{children:"RxDB integrates seamlessly with RxJS Observables, allowing you to build reactive components. Here's an example of a React component that subscribes to live data updates:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { useState"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" useEffect } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'react'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" HeroList"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ collection }) {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" setHeroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"] "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" useState"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"([]);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" useEffect"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(() "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // create an observable query"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" subscription"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"$"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(newHeroes "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" setHeroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(newHeroes);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" subscription"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".unsubscribe"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" [collection]);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"div"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"h2"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">Hero List"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:""})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"ul"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {heroes.map(hero "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"li key"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"{hero.id}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"strong"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">{hero.name}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:""}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" -"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {hero.power}"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" "})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ))}"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" "})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" "})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.p,{children:"This component subscribes to the collection's changes, updating the UI automatically whenever the underlying data changes, even across browser tabs."}),"\n",(0,i.jsx)(s.h3,{id:"with-preact-signals",children:"With Preact Signals"}),"\n",(0,i.jsx)(s.p,{children:"RxDB also supports Preact Signals for reactivity, which can be integrated into React applications. Preact Signals offer a modern, fine-grained reactivity model."}),"\n",(0,i.jsx)(s.p,{children:"First, install the necessary package:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" @preact/signals-core"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" --save"})]})})})}),"\n",(0,i.jsx)(s.p,{children:"Set up RxDB with Preact Signals reactivity:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { PreactSignalsRxReactivityFactory } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/reactivity-preact-signals'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" reactivity"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" PreactSignalsRxReactivityFactory"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.p,{children:["Now, you can obtain signals directly from RxDB queries using the double-dollar sign (",(0,i.jsx)(s.code,{children:"$$"}),"):"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" HeroList"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ collection }) {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"().$$;"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"ul"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {heroes.map(hero "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"li key"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"{hero.id}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:">"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"{hero.name}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:""})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ))}"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" "})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.p,{children:"This approach provides automatic updates whenever the data changes, without needing to manage subscriptions manually."}),"\n",(0,i.jsx)(s.h2,{id:"react-indexeddb-example-with-rxdb",children:"React IndexedDB Example with RxDB"}),"\n",(0,i.jsxs)(s.p,{children:["A comprehensive example of using RxDB within a React application can be found in the ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/react",children:"RxDB GitHub repository"}),". This repository contains sample applications, showcasing best practices and demonstrating how to integrate RxDB for various use cases."]}),"\n",(0,i.jsx)(s.h2,{id:"advanced-rxdb-features",children:"Advanced RxDB Features"}),"\n",(0,i.jsx)(s.p,{children:"RxDB offers many advanced features that extend beyond basic data storage:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"RxDB Replication"}),": Synchronize local data with remote databases seamlessly. Learn more: ",(0,i.jsx)(s.a,{href:"https://rxdb.info/replication.html",children:"RxDB Replication"})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Data Migration"}),": Handle schema changes gracefully with automatic data migrations. See: ",(0,i.jsx)(s.a,{href:"https://rxdb.info/migration-schema.html",children:"Data migration"})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Encryption"}),": Secure your data with built-in encryption capabilities. Explore: ",(0,i.jsx)(s.a,{href:"https://rxdb.info/encryption.html",children:"Encryption"})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Compression"}),": Optimize storage using key compression. Details: ",(0,i.jsx)(s.a,{href:"https://rxdb.info/key-compression.html",children:"Compression"})]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"limitations-of-indexeddb",children:"Limitations of IndexedDB"}),"\n",(0,i.jsx)(s.p,{children:"While IndexedDB is powerful, it has some inherent limitations:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Performance"}),": IndexedDB can be slow under certain conditions. Read more: ",(0,i.jsx)(s.a,{href:"https://rxdb.info/slow-indexeddb.html",children:"Slow IndexedDB"})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Storage Limits"}),": Browsers ",(0,i.jsx)(s.a,{href:"/articles/indexeddb-max-storage-limit.html",children:"impose limits"})," on how much data can be stored. See: ",(0,i.jsx)(s.a,{href:"https://rxdb.info/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html",children:"Browser storage limits"})]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"alternatives-to-indexeddb",children:"Alternatives to IndexedDB"}),"\n",(0,i.jsxs)(s.p,{children:["Depending on your application's requirements, there are ",(0,i.jsx)(s.a,{href:"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html",children:"alternative storage solutions"})," to consider:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Origin Private File System (OPFS)"}),": A newer API that can offer better performance. RxDB supports OPFS as well. More info: ",(0,i.jsx)(s.a,{href:"/rx-storage-opfs.html",children:"RxDB OPFS Storage"})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"SQLite"}),": Ideal for React applications on Capacitor or ",(0,i.jsx)(s.a,{href:"/articles/ionic-storage.html",children:"Ionic"}),", offering native performance. Explore: ",(0,i.jsx)(s.a,{href:"/rx-storage-sqlite.html",children:"RxDB SQLite Storage"})]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"performance-comparison-with-other-browser-storages",children:"Performance comparison with other browser storages"}),"\n",(0,i.jsxs)(s.p,{children:["Here is a ",(0,i.jsx)(s.a,{href:"/rx-storage-performance.html",children:"performance overview"})," of the various browser based storage implementation of RxDB:"]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"../files/rx-storage-performance-browser.png",alt:"RxStorage performance - browser",width:"700"})}),"\n",(0,i.jsx)(s.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Learn how to use RxDB with the ",(0,i.jsx)(s.a,{href:"/quickstart.html",children:"RxDB Quickstart"})," for a guided introduction."]}),"\n",(0,i.jsxs)(s.li,{children:["Check out the ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb",children:"RxDB GitHub repository"})," and leave a star \u2b50 if you find it useful."]}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"By leveraging RxDB on top of IndexedDB, you can create highly responsive, offline-capable React applications without dealing with the low-level complexities of IndexedDB directly. With reactive queries, seamless cross-tab communication, and powerful advanced features, RxDB becomes an invaluable tool in modern web development."})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/2efd0200.eec55c75.js b/docs/assets/js/2efd0200.eec55c75.js deleted file mode 100644 index 23faec4b631..00000000000 --- a/docs/assets/js/2efd0200.eec55c75.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[4132],{3247(s,e,n){n.d(e,{g:()=>o});var r=n(4848);function o(s){const e=[];let n=null;return s.children.forEach(s=>{s.props.id?(n&&e.push(n),n={headline:s,paragraphs:[]}):n&&n.paragraphs.push(s)}),n&&e.push(n),(0,r.jsx)("div",{style:i.stepsContainer,children:e.map((s,e)=>(0,r.jsxs)("div",{style:i.stepWrapper,children:[(0,r.jsxs)("div",{style:i.stepIndicator,children:[(0,r.jsx)("div",{style:i.stepNumber,children:e+1}),(0,r.jsx)("div",{style:i.verticalLine})]}),(0,r.jsxs)("div",{style:i.stepContent,children:[(0,r.jsx)("div",{children:s.headline}),s.paragraphs.map((s,e)=>(0,r.jsx)("div",{style:i.item,children:s},e))]})]},e))})}const i={stepsContainer:{display:"flex",flexDirection:"column"},stepWrapper:{display:"flex",alignItems:"stretch",marginBottom:"1.5rem",position:"relative",minWidth:0},stepIndicator:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",width:"33px",marginRight:"1rem",minWidth:0},stepNumber:{width:"33px",height:"33px",borderRadius:"50%",backgroundColor:"var(--color-top)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:"bold",marginTop:-4},verticalLine:{position:"absolute",top:29,bottom:"0",left:"50%",width:"1px",background:"linear-gradient(to bottom, var(--color-top) 0%, var(--color-top) 80%, rgba(0,0,0,0) 100%)",transform:"translateX(-50%)"},stepContent:{flex:1,minWidth:0,overflowWrap:"break-word"},item:{marginTop:"0.5rem"}}},5179(s,e,n){n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>t,default:()=>p,frontMatter:()=>a,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"tutorials/typescript","title":"TypeScript Setup","description":"Use RxDB with TypeScript to define typed schemas, create typed collections, and build fully typed ORM methods. A quick step-by-step guide.","source":"@site/docs/tutorials/typescript.md","sourceDirName":"tutorials","slug":"/tutorials/typescript.html","permalink":"/tutorials/typescript.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"TypeScript Setup","slug":"typescript.html","description":"Use RxDB with TypeScript to define typed schemas, create typed collections, and build fully typed ORM methods. A quick step-by-step guide."},"sidebar":"tutorialSidebar","previous":{"title":"Development Mode","permalink":"/dev-mode.html"},"next":{"title":"RxDatabase","permalink":"/rx-database.html"}}');var o=n(4848),i=n(8453),l=n(3247);const a={title:"TypeScript Setup",slug:"typescript.html",description:"Use RxDB with TypeScript to define typed schemas, create typed collections, and build fully typed ORM methods. A quick step-by-step guide."},t="Using RxDB with TypeScript",c={},d=[{value:"Declare the types",id:"declare-the-types",level:2},{value:"Create the base document type",id:"create-the-base-document-type",level:2},{value:"Types for the ORM methods",id:"types-for-the-orm-methods",level:2},{value:"Create RxDocument Type",id:"create-rxdocument-type",level:2},{value:"Create RxCollection Type",id:"create-rxcollection-type",level:2},{value:"Create RxDatabase Type",id:"create-rxdatabase-type",level:2},{value:"Using the types",id:"using-the-types",level:2}];function h(s){const e={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,i.R)(),...s.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(e.header,{children:(0,o.jsx)(e.h1,{id:"using-rxdb-with-typescript",children:"Using RxDB with TypeScript"})}),"\n",(0,o.jsx)(e.p,{children:"In this tutorial you will learn how to use RxDB with TypeScript.\nWe will create a basic database with one collection and several ORM-methods, fully typed!"}),"\n",(0,o.jsx)(e.p,{children:"RxDB directly comes with its typings and you do not have to install anything else, however the latest version of RxDB requires that you are using Typescript v3.8 or newer.\nOur way to go is"}),"\n",(0,o.jsxs)(e.ul,{children:["\n",(0,o.jsx)(e.li,{children:"First define what the documents look like"}),"\n",(0,o.jsx)(e.li,{children:"Then define what the collections look like"}),"\n",(0,o.jsx)(e.li,{children:"Then define what the database looks like"}),"\n"]}),"\n",(0,o.jsxs)(l.g,{children:[(0,o.jsx)(e.h2,{id:"declare-the-types",children:"Declare the types"}),(0,o.jsx)(e.p,{children:"First you import the types from RxDB."}),(0,o.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,o.jsxs)(e.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" RxDatabase"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" RxCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" RxJsonSchema"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" RxDocument"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:";"})]})]})})}),(0,o.jsx)(e.h2,{id:"create-the-base-document-type",children:"Create the base document type"}),(0,o.jsx)(e.p,{children:"First we have to define the TypeScript type of the documents of a collection:"}),(0,o.jsxs)(e.p,{children:[(0,o.jsx)(e.strong,{children:"Option A"}),": Create the document type from the schema"]}),(0,o.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,o.jsxs)(e.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" toTypedRxJsonSchema"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ExtractDocumentTypeFromTypedRxJsonSchema"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" RxJsonSchema"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" heroSchemaLiteral"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'hero schema'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" description"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'describes a human being'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" keyCompression"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'passportId'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" passportId"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- the primary key must have set maxLength"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" firstName"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" lastName"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'integer'"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'firstName'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'lastName'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'passportId'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"]"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" indexes"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'firstName'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"as"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"; "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// <- It is important to set 'as const' to preserve the literal type"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" schemaTyped"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" toTypedRxJsonSchema"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(heroSchemaLiteral);"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// aggregate the document type from the schema"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" type"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" HeroDocType"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" ExtractDocumentTypeFromTypedRxJsonSchema"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"typeof"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" schemaTyped>;"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// create the typed RxJsonSchema from the literal typed object."})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" heroSchema"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" RxJsonSchema"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"HeroDocType"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"> "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" heroSchemaLiteral;"})]})]})})}),(0,o.jsxs)(e.p,{children:[(0,o.jsx)(e.strong,{children:"Option B"}),": Manually type the document type"]}),(0,o.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,o.jsxs)(e.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" type"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" HeroDocType"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" passportId"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" string"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" firstName"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" string"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" lastName"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" string"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"?:"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" number"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"; "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// optional"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),(0,o.jsxs)(e.p,{children:[(0,o.jsx)(e.strong,{children:"Option C"}),": Generate the document type from schema during build time"]}),(0,o.jsxs)(e.p,{children:["If your schema is in a ",(0,o.jsx)(e.code,{children:".json"})," file or generated from somewhere else, you might generate the typings with the ",(0,o.jsx)(e.a,{href:"https://www.npmjs.com/package/json-schema-to-typescript",children:"json-schema-to-typescript"})," module."]}),(0,o.jsx)(e.h2,{id:"types-for-the-orm-methods",children:"Types for the ORM methods"}),(0,o.jsx)(e.p,{children:"We also add some ORM-methods for the document."}),(0,o.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,o.jsxs)(e.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" type"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" HeroDocMethods"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" scream"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" (v"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" string"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:") "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" string"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),(0,o.jsx)(e.h2,{id:"create-rxdocument-type",children:"Create RxDocument Type"}),(0,o.jsx)(e.p,{children:"We can merge these into our HeroDocument."}),(0,o.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,o.jsx)(e.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" type"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" HeroDocument"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" RxDocument"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"HeroDocType"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" HeroDocMethods"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:">;"})]})})})}),(0,o.jsx)(e.h2,{id:"create-rxcollection-type",children:"Create RxCollection Type"}),(0,o.jsx)(e.p,{children:"Now we can define type for the collection which contains the documents."}),(0,o.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,o.jsxs)(e.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// we declare one static ORM-method for the collection"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" type"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" HeroCollectionMethods"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" countAllDocuments"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" Promise"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"number"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:">;"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// and then merge all our types"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" type"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" HeroCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" RxCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"<"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" HeroDocType"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" HeroDocMethods"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" HeroCollectionMethods"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:">;"})})]})})}),(0,o.jsx)(e.h2,{id:"create-rxdatabase-type",children:"Create RxDatabase Type"}),(0,o.jsx)(e.p,{children:"Before we can define the database, we make a helper-type which contains all collections of it."}),(0,o.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,o.jsxs)(e.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" type"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" MyDatabaseCollections"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" heroes"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" HeroCollection"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),(0,o.jsx)(e.p,{children:"Now the database."}),(0,o.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,o.jsx)(e.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" type"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" MyDatabase"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" RxDatabase"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"MyDatabaseCollections"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:">;"})]})})})})]}),"\n",(0,o.jsx)(e.h2,{id:"using-the-types",children:"Using the types"}),"\n",(0,o.jsx)(e.p,{children:"Now that we have declare all our types, we can use them."}),"\n",(0,o.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,o.jsxs)(e.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" * create database and collections"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" MyDatabase"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"MyDatabaseCollections"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:">({"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydb'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" heroSchema"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" RxJsonSchema"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"HeroDocType"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"> "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'human schema'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" description"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'describes a human being'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" keyCompression"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'passportId'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" passportId"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" firstName"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" lastName"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'integer'"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'passportId'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'firstName'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'lastName'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" heroDocMethods"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" HeroDocMethods"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" scream"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"this"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" HeroDocument"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" what"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" string"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:") {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" this"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:".firstName "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"+"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" ' screams: '"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" what"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".toUpperCase"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" heroCollectionMethods"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" HeroCollectionMethods"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" countAllDocuments"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"this"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" HeroCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:") {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" allDocs"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" this"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" allDocs"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"length"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" heroes"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" heroSchema"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" methods"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" heroDocMethods"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" statics"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" heroCollectionMethods"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// add a postInsert-hook"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myDatabase"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".postInsert"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" myPostInsertHook"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" this"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" HeroCollection"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // own collection is bound to the scope"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" docData"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" HeroDocType"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // documents data"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" doc"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" HeroDocument"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // RxDocument"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ) {"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'insert to '"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" this"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:".name "}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"+"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '-collection: '"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:".firstName);"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // not async"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" * use the database"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// insert a document"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" hero"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:" HeroDocument"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" passportId"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myId'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" firstName"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'piotr'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" lastName"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'potter'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 5"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// access a property"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"hero"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:".firstName);"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// use a orm method"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"hero"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".scream"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'AAH!'"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// use a static orm method from the collection"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" amount"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" number"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".countAllDocuments"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(amount);"})]}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" * clean up"})}),"\n",(0,o.jsx)(e.span,{"data-line":"",children:(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(e.span,{"data-line":"",children:[(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myDatabase"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".close"}),(0,o.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})})]})}function p(s={}){const{wrapper:e}={...(0,i.R)(),...s.components};return e?(0,o.jsx)(e,{...s,children:(0,o.jsx)(h,{...s})}):h(s)}},8453(s,e,n){n.d(e,{R:()=>l,x:()=>a});var r=n(6540);const o={},i=r.createContext(o);function l(s){const e=r.useContext(i);return r.useMemo(function(){return"function"==typeof s?s(e):{...e,...s}},[e,s])}function a(s){let e;return e=s.disableParentContext?"function"==typeof s.components?s.components(o):s.components||o:l(s.components),r.createElement(i.Provider,{value:e},s.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/2fe9ecb2.fc29e504.js b/docs/assets/js/2fe9ecb2.fc29e504.js deleted file mode 100644 index 6198d77dd89..00000000000 --- a/docs/assets/js/2fe9ecb2.fc29e504.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[5101],{8453(e,s,n){n.d(s,{R:()=>o,x:()=>a});var t=n(6540);const r={},i=t.createContext(r);function o(e){const s=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),t.createElement(i.Provider,{value:s},e.children)}},8662(e,s,n){n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>a,default:()=>c,frontMatter:()=>o,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm","title":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","description":"Compare LocalStorage, IndexedDB, Cookies, OPFS, and WASM-SQLite for web storage, performance, limits, and best practices for modern web apps.","source":"@site/docs/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.md","sourceDirName":"articles","slug":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html","permalink":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","slug":"localstorage-indexeddb-cookies-opfs-sqlite-wasm.html","description":"Compare LocalStorage, IndexedDB, Cookies, OPFS, and WASM-SQLite for web storage, performance, limits, and best practices for modern web apps."},"sidebar":"tutorialSidebar","previous":{"title":"Slow IndexedDB","permalink":"/slow-indexeddb.html"},"next":{"title":"17.0.0","permalink":"/releases/17.0.0.html"}}');var r=n(4848),i=n(8453);const o={title:"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite",slug:"localstorage-indexeddb-cookies-opfs-sqlite-wasm.html",description:"Compare LocalStorage, IndexedDB, Cookies, OPFS, and WASM-SQLite for web storage, performance, limits, and best practices for modern web apps."},a="LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite",l={},d=[{value:"The available Storage APIs in a modern Browser",id:"the-available-storage-apis-in-a-modern-browser",level:2},{value:"What are Cookies",id:"what-are-cookies",level:3},{value:"What is LocalStorage",id:"what-is-localstorage",level:3},{value:"What is IndexedDB",id:"what-is-indexeddb",level:3},{value:"What is OPFS",id:"what-is-opfs",level:3},{value:"What is WASM SQLite",id:"what-is-wasm-sqlite",level:3},{value:"What was WebSQL",id:"what-was-websql",level:3},{value:"Feature Comparison",id:"feature-comparison",level:2},{value:"Storing complex JSON Documents",id:"storing-complex-json-documents",level:3},{value:"Multi-Tab Support",id:"multi-tab-support",level:3},{value:"Indexing Support",id:"indexing-support",level:3},{value:"WebWorker Support",id:"webworker-support",level:3},{value:"Storage Size Limits",id:"storage-size-limits",level:2},{value:"Performance Comparison",id:"performance-comparison",level:2},{value:"Initialization Time",id:"initialization-time",level:3},{value:"Latency of small Writes",id:"latency-of-small-writes",level:3},{value:"Latency of small Reads",id:"latency-of-small-reads",level:3},{value:"Big Bulk Writes",id:"big-bulk-writes",level:3},{value:"Big Bulk Reads",id:"big-bulk-reads",level:3},{value:"Performance Conclusions",id:"performance-conclusions",level:2},{value:"Possible Improvements",id:"possible-improvements",level:2},{value:"Future Improvements",id:"future-improvements",level:2},{value:"Follow Up",id:"follow-up",level:2}];function h(e){const s={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"localstorage-vs-indexeddb-vs-cookies-vs-opfs-vs-wasm-sqlite",children:"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite"})}),"\n",(0,r.jsxs)(s.p,{children:["So you are building that web application and you want to ",(0,r.jsx)(s.strong,{children:"store data inside of your users browser"}),". Maybe you just need to store some small flags or you even need a fully fledged database."]}),"\n",(0,r.jsxs)(s.p,{children:["The types of web applications we build have changed significantly. In the early years of the web we served static html files. Then we served dynamically rendered html and later we build ",(0,r.jsx)(s.strong,{children:"single page applications"})," that run most logic on the client. And for the coming years you might want to build so called ",(0,r.jsx)(s.a,{href:"/offline-first.html",children:"local first apps"})," that handle big and complex data operations solely on the client and even work when offline, which gives you the opportunity to build ",(0,r.jsx)(s.strong,{children:"zero-latency"})," user interactions."]}),"\n",(0,r.jsxs)(s.p,{children:["In the early days of the web, ",(0,r.jsx)(s.strong,{children:"cookies"})," were the only option for storing small key-value assignments.. But JavaScript and browsers have evolved significantly and better storage APIs have been added which pave the way for bigger and more complex data operations."]}),"\n",(0,r.jsxs)(s.p,{children:["In this article, we will dive into the various technologies available for storing and querying data in a browser. We'll explore traditional methods like ",(0,r.jsx)(s.strong,{children:"Cookies"}),", ",(0,r.jsx)(s.strong,{children:"localStorage"}),", ",(0,r.jsx)(s.strong,{children:"WebSQL"}),", ",(0,r.jsx)(s.strong,{children:"IndexedDB"})," and newer solutions such as ",(0,r.jsx)(s.strong,{children:"OPFS"})," and ",(0,r.jsx)(s.strong,{children:"SQLite via WebAssembly"}),". We compare the features and limitations and through performance tests we aim to uncover how fast we can write and read data in a web application with the various methods."]}),"\n",(0,r.jsxs)(s.admonition,{type:"note",children:[(0,r.jsxs)(s.p,{children:["You are reading this in the ",(0,r.jsx)(s.a,{href:"/",children:"RxDB"})," docs. RxDB is a JavaScript database that has different storage adapters which can utilize the different storage APIs.\n",(0,r.jsx)(s.strong,{children:"Since 2017"})," I spend most of my time working with these APIs, doing performance tests and building ",(0,r.jsx)(s.a,{href:"/slow-indexeddb.html",children:"hacks"})," and plugins to reach the limits of browser database operation speed."]}),(0,r.jsx)("center",{children:(0,r.jsx)("a",{href:"https://rxdb.info/",children:(0,r.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JavaScript Database",width:"220"})})})]}),"\n",(0,r.jsx)(s.h2,{id:"the-available-storage-apis-in-a-modern-browser",children:"The available Storage APIs in a modern Browser"}),"\n",(0,r.jsx)(s.p,{children:"First lets have a brief overview of the different APIs, their intentional use case and history:"}),"\n",(0,r.jsx)(s.h3,{id:"what-are-cookies",children:"What are Cookies"}),"\n",(0,r.jsxs)(s.p,{children:["Cookies were first introduced by ",(0,r.jsx)(s.a,{href:"https://www.baekdal.com/thoughts/the-original-cookie-specification-from-1997-was-gdpr-compliant/",children:"netscape in 1994"}),".\nCookies store small pieces of key-value data that are mainly used for session management, personalization, and tracking. Cookies can have several security settings like a time-to-live or the ",(0,r.jsx)(s.code,{children:"domain"})," attribute to share the cookies between several subdomains."]}),"\n",(0,r.jsxs)(s.p,{children:["Cookies values are not only stored at the client but also sent with ",(0,r.jsx)(s.strong,{children:"every http request"})," to the server. This means we cannot store much data in a cookie but it is still interesting how good cookie access performance compared to the other methods. Especially because cookies are such an important base feature of the web, many performance optimizations have been done and even these days there is still progress being made like the ",(0,r.jsx)(s.a,{href:"https://blog.chromium.org/2024/06/introducing-shared-memory-versioning-to.html",children:"Shared Memory Versioning"})," by chromium or the asynchronous ",(0,r.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/Cookie_Store_API",children:"CookieStore API"}),"."]}),"\n",(0,r.jsx)(s.h3,{id:"what-is-localstorage",children:"What is LocalStorage"}),"\n",(0,r.jsxs)(s.p,{children:["The ",(0,r.jsx)(s.a,{href:"/articles/localstorage.html",children:"localStorage API"})," was first proposed as part of the ",(0,r.jsx)(s.a,{href:"https://www.w3.org/TR/2009/WD-webstorage-20090423/#the-localstorage-attribute",children:"WebStorage specification in 2009"}),".\nLocalStorage provides a simple API to store key-value pairs inside of a web browser. It has the methods ",(0,r.jsx)(s.code,{children:"setItem"}),", ",(0,r.jsx)(s.code,{children:"getItem"}),", ",(0,r.jsx)(s.code,{children:"removeItem"})," and ",(0,r.jsx)(s.code,{children:"clear"})," which is all you need from a key-value store. LocalStorage is only suitable for storing small amounts of data that need to persist across sessions and it is ",(0,r.jsx)(s.a,{href:"/articles/localstorage.html#understanding-the-limitations-of-local-storage",children:"limited by a 5MB storage cap"}),". Storing complex data is only possible by transforming it into a string for example with ",(0,r.jsx)(s.code,{children:"JSON.stringify()"}),".\nThe API is not asynchronous which means if fully blocks your JavaScript process while doing stuff. Therefore running heavy operations on it might block your UI from rendering."]}),"\n",(0,r.jsxs)(s.blockquote,{children:["\n",(0,r.jsxs)(s.p,{children:["There is also the ",(0,r.jsx)(s.strong,{children:"SessionStorage"})," API. The key difference is that localStorage data persists indefinitely until explicitly cleared, while sessionStorage data is cleared when the browser tab or window is closed."]}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"what-is-indexeddb",children:"What is IndexedDB"}),"\n",(0,r.jsxs)(s.p,{children:['IndexedDB was first introduced as "Indexed Database API" ',(0,r.jsx)(s.a,{href:"https://www.w3.org/TR/IndexedDB/#sotd",children:"in 2015"}),"."]}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB"})," is a low-level API for storing large amounts of structured JSON data. While the API is a bit hard to use, IndexedDB can utilize indexes and asynchronous operations. It lacks support for complex queries and only allows to iterate over the indexes which makes it more like a base layer for other libraries then a fully fledged database."]}),"\n",(0,r.jsxs)(s.p,{children:["In 2018, IndexedDB version 2.0 ",(0,r.jsx)(s.a,{href:"https://hacks.mozilla.org/2016/10/whats-new-in-indexeddb-2-0/",children:"was introduced"}),". This added some major improvements. Most noticeable the ",(0,r.jsx)(s.code,{children:"getAll()"})," method which improves performance dramatically when fetching bulks of JSON documents."]}),"\n",(0,r.jsxs)(s.p,{children:["IndexedDB ",(0,r.jsx)(s.a,{href:"https://w3c.github.io/IndexedDB/",children:"version 3.0"})," is in the workings which contains many improvements. Most important the addition of ",(0,r.jsx)(s.code,{children:"Promise"})," based calls that makes modern JS features like ",(0,r.jsx)(s.code,{children:"async/await"})," more useful."]}),"\n",(0,r.jsx)(s.h3,{id:"what-is-opfs",children:"What is OPFS"}),"\n",(0,r.jsxs)(s.p,{children:["The ",(0,r.jsx)(s.a,{href:"/rx-storage-opfs.html",children:"Origin Private File System"})," (OPFS) is a ",(0,r.jsx)(s.a,{href:"https://caniuse.com/mdn-api_filesystemfilehandle_createsyncaccesshandle",children:"relatively new"})," API that allows web applications to store large files directly in the browser. It is designed for data-intensive applications that want to write and read ",(0,r.jsx)(s.strong,{children:"binary data"})," in a simulated file system."]}),"\n",(0,r.jsx)(s.p,{children:"OPFS can be used in two modes:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Either asynchronous on the ",(0,r.jsx)(s.a,{href:"/rx-storage-opfs.html#using-opfs-in-the-main-thread-instead-of-a-worker",children:"main thread"})]}),"\n",(0,r.jsxs)(s.li,{children:["Or in a WebWorker with the faster, asynchronous access with the ",(0,r.jsx)(s.code,{children:"createSyncAccessHandle()"})," method."]}),"\n"]}),"\n",(0,r.jsxs)(s.p,{children:['Because only binary data can be processed, OPFS is made to be a base filesystem for library developers. You will unlikely directly want to use the OPFS in your code when you build a "normal" application because it is too complex. That would only make sense for storing plain files like images, not to store and query ',(0,r.jsx)(s.a,{href:"/articles/json-based-database.html",children:"JSON data"})," efficiently. I have build a ",(0,r.jsx)(s.a,{href:"/rx-storage-opfs.html",children:"OPFS based storage"})," for RxDB with proper indexing and querying and it took me several months."]}),"\n",(0,r.jsx)(s.h3,{id:"what-is-wasm-sqlite",children:"What is WASM SQLite"}),"\n",(0,r.jsx)("center",{children:(0,r.jsx)("img",{src:"../files/icons/sqlite.svg",alt:"WASM SQLite",width:"140",class:"img-padding"})}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.a,{href:"https://webassembly.org/",children:"WebAssembly"})," (Wasm) is a binary format that allows high-performance code execution on the web.\nWasm was added to major browsers over the course of 2017 which opened a wide range of opportunities on what to run inside of a browser. You can compile native libraries to WebAssembly and just run them on the client with just a few adjustments. WASM code can be shipped to browser apps and generally runs much faster compared to JavaScript, but still about ",(0,r.jsx)(s.a,{href:"https://www.usenix.org/conference/atc19/presentation/jangda",children:"10% slower then native"}),"."]}),"\n",(0,r.jsx)(s.p,{children:"Many people started to use compiled SQLite as a database inside of the browser which is why it makes sense to also compare this setup to the native APIs."}),"\n",(0,r.jsxs)(s.p,{children:["The compiled byte code of SQLite has a size of ",(0,r.jsx)(s.a,{href:"https://sqlite.org/download.html",children:"about 938.9\xa0kB"})," which must be downloaded and parsed by the users on the first page load. WASM cannot directly access any persistent storage API in the browser. Instead it requires data to flow from WASM to the main-thread and then can be put into one of the browser APIs. This is done with so called ",(0,r.jsx)(s.a,{href:"https://www.sqlite.org/vfs.html",children:"VFS (virtual file system) adapters"})," that handle data access from SQLite to anything else."]}),"\n",(0,r.jsx)(s.h3,{id:"what-was-websql",children:"What was WebSQL"}),"\n",(0,r.jsxs)(s.p,{children:["WebSQL ",(0,r.jsx)(s.strong,{children:"was"})," a web API ",(0,r.jsx)(s.a,{href:"https://www.w3.org/TR/webdatabase/",children:"introduced in 2009"})," that allowed browsers to use SQL databases for client-side storage, based on SQLite. The idea was to give developers a way to store and query data using SQL on the client side, similar to server-side databases.\nWebSQL has been ",(0,r.jsx)(s.strong,{children:"removed from browsers"})," in the current years for multiple good reasons:"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"WebSQL was not standardized and having an API based on a single specific implementation in form of the SQLite source code is hard to ever make it to a standard."}),"\n",(0,r.jsxs)(s.li,{children:["WebSQL required browsers to use a ",(0,r.jsx)(s.a,{href:"https://developer.chrome.com/blog/deprecating-web-sql#reasons_for_deprecating_web_sql",children:"specific version"})," of SQLite (version 3.6.19) which means whenever there would be any update or bugfix to SQLite, it would not be possible to add that to WebSQL without possible breaking the web."]}),"\n",(0,r.jsx)(s.li,{children:"Major browsers like firefox never supported WebSQL."}),"\n"]}),"\n",(0,r.jsxs)(s.p,{children:["Therefore in the following we will ",(0,r.jsx)(s.strong,{children:"just ignore WebSQL"})," even if it would be possible to run tests on in by setting specific browser flags or using old versions of chromium."]}),"\n",(0,r.jsx)(s.hr,{}),"\n",(0,r.jsx)(s.h2,{id:"feature-comparison",children:"Feature Comparison"}),"\n",(0,r.jsx)(s.p,{children:"Now that you know the basic concepts of the APIs, lets compare some specific features that have shown to be important for people using RxDB and browser based storages in general."}),"\n",(0,r.jsx)(s.h3,{id:"storing-complex-json-documents",children:"Storing complex JSON Documents"}),"\n",(0,r.jsxs)(s.p,{children:['When you store data in a web application, most often you want to store complex JSON documents and not only "normal" values like the ',(0,r.jsx)(s.code,{children:"integers"})," and ",(0,r.jsx)(s.code,{children:"strings"})," you store in a server side database."]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Only IndexedDB works with JSON objects natively."}),"\n",(0,r.jsxs)(s.li,{children:["With SQLite WASM you can ",(0,r.jsx)(s.a,{href:"https://www.sqlite.org/json1.html",children:"store JSON"})," in a ",(0,r.jsx)(s.code,{children:"text"})," column since version 3.38.0 (2022-02-22) and even run deep queries on it and use single attributes as indexes."]}),"\n"]}),"\n",(0,r.jsxs)(s.p,{children:["Every of the other APIs can only store strings or binary data. Of course you can transform any JSON object to a string with ",(0,r.jsx)(s.code,{children:"JSON.stringify()"})," but not having the JSON support in the API can make things complex when running queries and running ",(0,r.jsx)(s.code,{children:"JSON.stringify()"})," many times can cause performance problems."]}),"\n",(0,r.jsx)(s.h3,{id:"multi-tab-support",children:"Multi-Tab Support"}),"\n",(0,r.jsxs)(s.p,{children:["A big difference when building a Web App compared to ",(0,r.jsx)(s.a,{href:"/electron-database.html",children:"Electron"})," or ",(0,r.jsx)(s.a,{href:"/react-native-database.html",children:"React-Native"}),", is that the user will open and close the app in ",(0,r.jsx)(s.strong,{children:"multiple browser tabs at the same time"}),". Therefore you have not only one JavaScript process running, but many of them can exist and might have to share state changes between each other to not show ",(0,r.jsx)(s.strong,{children:"outdated data"})," to the user."]}),"\n",(0,r.jsxs)(s.blockquote,{children:["\n",(0,r.jsxs)(s.p,{children:["If your users' muscle memory puts the left hand on the ",(0,r.jsx)(s.strong,{children:"F5"})," key while using your website, you did something wrong!"]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"Not all storage APIs support a way to automatically share write events between tabs."}),"\n",(0,r.jsxs)(s.p,{children:["Only localstorage has a way to automatically share write events between tabs by the API itself with the ",(0,r.jsx)(s.a,{href:"/articles/localstorage.html#localstorage-vs-indexeddb",children:"storage-event"})," which can be used to observe changes."]}),"\n",(0,r.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,r.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// localStorage can observe changes with the storage event."})}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// This feature is missing in IndexedDB and others"})}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addEventListener"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"storage"'}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (event) "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {});"})]})]})})}),"\n",(0,r.jsxs)(s.p,{children:["There was the ",(0,r.jsx)(s.a,{href:"https://stackoverflow.com/a/33270440",children:"experimental IndexedDB observers API"})," for chrome, but the proposal repository has been archived."]}),"\n",(0,r.jsx)(s.p,{children:"To workaround this problem, there are two solutions:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["The first option is to use the ",(0,r.jsx)(s.a,{href:"https://github.com/pubkey/broadcast-channel",children:"BroadcastChannel API"})," which can send messages across browser tabs. So whenever you do a write to the storage, you also send a notification to other tabs to inform them about these changes. This is the most common workaround which is also used by RxDB. Notice that there is also the ",(0,r.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/Web_Locks_API",children:"WebLocks API"})," which can be used to have mutexes across browser tabs."]}),"\n",(0,r.jsxs)(s.li,{children:["The other solution is to use the ",(0,r.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker",children:"SharedWorker"})," and do all writes inside of the worker. All browser tabs can then subscribe to messages from that ",(0,r.jsx)(s.strong,{children:"single"})," SharedWorker and know about changes."]}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"indexing-support",children:"Indexing Support"}),"\n",(0,r.jsxs)(s.p,{children:["The big difference between a database and storing data in a plain file, is that a database is writing data in a format that allows running operations over indexes to facilitate fast performant queries. From our list of technologies only ",(0,r.jsx)(s.strong,{children:"IndexedDB"})," and ",(0,r.jsx)(s.strong,{children:"WASM SQLite"})," support for indexing out of the box. In theory you can build indexes on top of any storage like localstorage or OPFS but you likely should not want to do that by yourself."]}),"\n",(0,r.jsx)(s.p,{children:"In IndexedDB for example, we can fetch a bulk of documents by a given index range:"}),"\n",(0,r.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// find all products with a price between 10 and 50"})}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" keyRange"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" IDBKeyRange"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".bound"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"10"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 50"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" transaction"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".transaction"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'products'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'readonly'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" objectStore"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" transaction"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".objectStore"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'products'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" index"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" objectStore"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".index"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'priceIndex'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" request"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" index"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".getAll"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(keyRange);"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" result"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" Promise"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"((res"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" rej) "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" request"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"onsuccess"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (event) "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" res"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"event"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"target"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".result);"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" request"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"onerror"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (event) "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" rej"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(event);"})]}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,r.jsxs)(s.p,{children:["Notice that IndexedDB has the limitation of ",(0,r.jsx)(s.a,{href:"https://github.com/w3c/IndexedDB/issues/76",children:"not having indexes on boolean values"}),". You can only index strings and numbers. To workaround that you have to transform boolean to numbers and backwards when storing the data."]}),"\n",(0,r.jsx)(s.h3,{id:"webworker-support",children:"WebWorker Support"}),"\n",(0,r.jsxs)(s.p,{children:["When running heavy data operations, you might want to move the processing away from the JavaScript main thread. This ensures that our app keeps being responsive and fast while the processing can run in parallel in the background. In a browser you can either use the ",(0,r.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API",children:"WebWorker"}),", ",(0,r.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker",children:"SharedWorker"})," or the ",(0,r.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API",children:"ServiceWorker"})," API to do that. In RxDB you can use the ",(0,r.jsx)(s.a,{href:"/rx-storage-worker.html",children:"WebWorker"})," or ",(0,r.jsx)(s.a,{href:"/rx-storage-shared-worker.html",children:"SharedWorker"})," plugins to move your storage inside of a worker."]}),"\n",(0,r.jsxs)(s.p,{children:["The most common API for that use case is spawning a ",(0,r.jsx)(s.strong,{children:"WebWorker"})," and doing most work on that second JavaScript process. The worker is spawned from a separate JavaScript file (or base64 string) and communicates with the main thread by sending data with ",(0,r.jsx)(s.code,{children:"postMessage()"}),"."]}),"\n",(0,r.jsxs)(s.p,{children:["Unfortunately ",(0,r.jsx)(s.strong,{children:"LocalStorage"})," and ",(0,r.jsx)(s.strong,{children:"Cookies"})," ",(0,r.jsx)(s.a,{href:"https://stackoverflow.com/questions/6179159/accessing-localstorage-from-a-webworker",children:"cannot be used in WebWorker or SharedWorker"})," because of the design and security constraints. WebWorkers run in a separate global context from the main browser thread and therefore cannot do stuff that might impact the main thread. They have no direct access to certain web APIs, like the DOM, localStorage, or cookies."]}),"\n",(0,r.jsxs)(s.p,{children:["Everything else can be used from inside a WebWorker.\nThe fast version of OPFS with the ",(0,r.jsx)(s.code,{children:"createSyncAccessHandle"})," method can ",(0,r.jsx)(s.strong,{children:"only"})," ",(0,r.jsx)(s.a,{href:"/rx-storage-opfs.html#opfs-limitations",children:"be used in a WebWorker"}),", and ",(0,r.jsx)(s.strong,{children:"not on the main thread"}),". This is because all the operations of the returned ",(0,r.jsx)(s.code,{children:"AccessHandle"})," are ",(0,r.jsx)(s.strong,{children:"not async"})," and therefore block the JavaScript process, so you do want to do that on the main thread and block everything."]}),"\n",(0,r.jsx)(s.hr,{}),"\n",(0,r.jsx)(s.h2,{id:"storage-size-limits",children:"Storage Size Limits"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Cookies"})," are limited to about ",(0,r.jsx)(s.code,{children:"4 KB"})," of data in ",(0,r.jsx)(s.a,{href:"https://datatracker.ietf.org/doc/html/rfc6265#section-6.1",children:"RFC-6265"}),". Because the stored cookies are send to the server with every HTTP request, this limitation is reasonable. You can test your browsers cookie limits ",(0,r.jsx)(s.a,{href:"http://www.ruslog.com/tools/cookies.html",children:"here"}),". Notice that you should never fill up the full ",(0,r.jsx)(s.code,{children:"4 KB"})," of your cookies because your web server will not accept too long headers and reject the requests with ",(0,r.jsx)(s.code,{children:"HTTP ERROR 431 - Request header fields too large"}),". Once you have reached that point you can not even serve updated JavaScript to your user to clean up the cookies and you will have locked out that user until the cookies get cleaned up manually."]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"LocalStorage"})," has a storage size limitation that varies depending on the browser, but generally ranges from 4 MB to 10 MB per origin. You can test your localStorage size limit ",(0,r.jsx)(s.a,{href:"https://arty.name/localstorage.html",children:"here"}),"."]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Chrome/Chromium/Edge: 5 MB per domain"}),"\n",(0,r.jsx)(s.li,{children:"Firefox: 10 MB per domain"}),"\n",(0,r.jsx)(s.li,{children:"Safari: 4-5 MB per domain (varies slightly between versions)"}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"IndexedDB"})," does not have a specific fixed size limitation like localStorage. The maximum storage size for IndexedDB depends on the browser implementation. The upper limit is typically based on the available disc space on the user's device. In chromium browsers it can use up to 80% of total disk space. You can get an estimation about the storage size limit by calling ",(0,r.jsx)(s.code,{children:"await navigator.storage.estimate()"}),". Typically you can store gigabytes of data which can be tried out ",(0,r.jsx)(s.a,{href:"https://demo.agektmr.com/storage/",children:"here"}),". Notice that we have a full article about ",(0,r.jsx)(s.a,{href:"/articles/indexeddb-max-storage-limit.html",children:"storage max size limits of IndexedDB"})," that covers this topic."]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"OPFS"})," has the same storage size limitation as IndexedDB. Its limit depends on the available disc space. This can also be tested ",(0,r.jsx)(s.a,{href:"https://demo.agektmr.com/storage/",children:"here"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(s.hr,{}),"\n",(0,r.jsx)(s.h2,{id:"performance-comparison",children:"Performance Comparison"}),"\n",(0,r.jsx)(s.p,{children:"Now that we've reviewed the features of each storage method, let's dive into performance comparisons, focusing on initialization times, read/write latencies, and bulk operations."}),"\n",(0,r.jsxs)(s.p,{children:["Notice that we only run simple tests and for your specific use case in your application the results might differ. Also we only compare performance in google chrome (version 128.0.6613.137). Firefox and Safari have similar ",(0,r.jsx)(s.strong,{children:"but not equal"})," performance patterns. You can run the test by yourself on your own machine from this ",(0,r.jsx)(s.a,{href:"https://github.com/pubkey/localstorage-indexeddb-cookies-opfs-sqlite-wasm",children:"github repository"}),'. For all tests we throttle the network to behave like the average german internet speed. (download: 135,900 kbit/s, upload: 28,400 kbit/s, latency: 125ms). Also all tests store an "average" JSON object that might be required to be stringified depending on the storage. We also only test the performance of storing documents by id because some of the technologies (cookies, OPFS and localstorage) do not support indexed range operations so it makes no sense to compare the performance of these.']}),"\n",(0,r.jsx)(s.h3,{id:"initialization-time",children:"Initialization Time"}),"\n",(0,r.jsx)(s.p,{children:"Before you can store any data, many APIs require a setup process like creating databases, spawning WebAssembly processes or downloading additional stuff. To ensure your app starts fast, the initialization time is important."}),"\n",(0,r.jsx)(s.p,{children:"The APIs of localStorage and Cookies do not have any setup process and can be directly used. IndexedDB requires to open a database and a store inside of it. WASM SQLite needs to download a WASM file and process it. OPFS needs to download and start a worker file and initialize the virtual file system directory."}),"\n",(0,r.jsx)(s.p,{children:"Here are the time measurements from how long it takes until the first bit of data can be stored:"}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Technology"}),(0,r.jsx)(s.th,{children:"Time in Milliseconds"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"IndexedDB"}),(0,r.jsx)(s.td,{children:"46"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"OPFS Main Thread"}),(0,r.jsx)(s.td,{children:"23"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"OPFS WebWorker"}),(0,r.jsx)(s.td,{children:"26.8"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"WASM SQLite (memory)"}),(0,r.jsx)(s.td,{children:"504"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"WASM SQLite (IndexedDB)"}),(0,r.jsx)(s.td,{children:"535"})]})]})]}),"\n",(0,r.jsx)(s.p,{children:"Here we can notice a few things:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Opening a new IndexedDB database with a single store takes surprisingly long"}),"\n",(0,r.jsx)(s.li,{children:"The latency overhead of sending data from the main thread to a WebWorker OPFS is about 4 milliseconds. Here we only send minimal data to init the OPFS file handler. It will be interesting if that latency increases when more data is processed."}),"\n",(0,r.jsx)(s.li,{children:"Downloading and parsing WASM SQLite and creating a single table takes about half a second. Using also the IndexedDB VFS to store data persistently adds additional 31 milliseconds. Reloading the page with enabled caching and already prepared tables is a bit faster with 420 milliseconds (memory)."}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"latency-of-small-writes",children:"Latency of small Writes"}),"\n",(0,r.jsx)(s.p,{children:"Next lets test the latency of small writes. This is important when you do many small data changes that happen independent from each other. Like when you stream data from a websocket or persist pseudo randomly happening events like mouse movements."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Technology"}),(0,r.jsx)(s.th,{children:"Time in Milliseconds"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"Cookies"}),(0,r.jsx)(s.td,{children:"0.058"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"LocalStorage"}),(0,r.jsx)(s.td,{children:"0.017"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"IndexedDB"}),(0,r.jsx)(s.td,{children:"0.17"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"OPFS Main Thread"}),(0,r.jsx)(s.td,{children:"1.46"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"OPFS WebWorker"}),(0,r.jsx)(s.td,{children:"1.54"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"WASM SQLite (memory)"}),(0,r.jsx)(s.td,{children:"0.17"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"WASM SQLite (IndexedDB)"}),(0,r.jsx)(s.td,{children:"3.17"})]})]})]}),"\n",(0,r.jsx)(s.p,{children:"Here we can notice a few things:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"LocalStorage has the lowest write latency with only 0.017 milliseconds per write."}),"\n",(0,r.jsx)(s.li,{children:"IndexedDB writes are about 10 times slower compared to localStorage."}),"\n",(0,r.jsx)(s.li,{children:"Sending the data to the WASM SQLite process and letting it persist via IndexedDB is slow with over 3 milliseconds per write."}),"\n"]}),"\n",(0,r.jsxs)(s.p,{children:["The OPFS operations take about 1.5 milliseconds to write the JSON data into one document per file. We can see the sending the data to a webworker first is a bit slower which comes from the overhead of serializing and deserializing the data on both sides.\nIf we would not create on OPFS file per document but instead append everything to a single file, the performance pattern changes significantly. Then the faster file handle from the ",(0,r.jsx)(s.code,{children:"createSyncAccessHandle()"})," only takes about 1 millisecond per write. But this would require to somehow remember at which position the each document is stored. Therefore in our tests we will continue using one file per document."]}),"\n",(0,r.jsx)(s.h3,{id:"latency-of-small-reads",children:"Latency of small Reads"}),"\n",(0,r.jsxs)(s.p,{children:["Now that we have stored some documents, lets measure how long it takes to read single documents by their ",(0,r.jsx)(s.code,{children:"id"}),"."]}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Technology"}),(0,r.jsx)(s.th,{children:"Time in Milliseconds"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"Cookies"}),(0,r.jsx)(s.td,{children:"0.132"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"LocalStorage"}),(0,r.jsx)(s.td,{children:"0.0052"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"IndexedDB"}),(0,r.jsx)(s.td,{children:"0.1"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"OPFS Main Thread"}),(0,r.jsx)(s.td,{children:"1.28"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"OPFS WebWorker"}),(0,r.jsx)(s.td,{children:"1.41"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"WASM SQLite (memory)"}),(0,r.jsx)(s.td,{children:"0.45"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"WASM SQLite (IndexedDB)"}),(0,r.jsx)(s.td,{children:"2.93"})]})]})]}),"\n",(0,r.jsx)(s.p,{children:"Here we can notice a few things:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["LocalStorage reads are ",(0,r.jsx)(s.strong,{children:"really really fast"})," with only 0.0052 milliseconds per read."]}),"\n",(0,r.jsx)(s.li,{children:"The other technologies perform reads in a similar speed to their write latency."}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"big-bulk-writes",children:"Big Bulk Writes"}),"\n",(0,r.jsx)(s.p,{children:"As next step, lets do some big bulk operations with 200 documents at once."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Technology"}),(0,r.jsx)(s.th,{children:"Time in Milliseconds"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"Cookies"}),(0,r.jsx)(s.td,{children:"20.6"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"LocalStorage"}),(0,r.jsx)(s.td,{children:"5.79"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"IndexedDB"}),(0,r.jsx)(s.td,{children:"13.41"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"OPFS Main Thread"}),(0,r.jsx)(s.td,{children:"280"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"OPFS WebWorker"}),(0,r.jsx)(s.td,{children:"104"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"WASM SQLite (memory)"}),(0,r.jsx)(s.td,{children:"19.1"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"WASM SQLite (IndexedDB)"}),(0,r.jsx)(s.td,{children:"37.12"})]})]})]}),"\n",(0,r.jsx)(s.p,{children:"Here we can notice a few things:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Sending the data to a WebWorker and running it via the faster OPFS API is about twice as fast."}),"\n",(0,r.jsx)(s.li,{children:"WASM SQLite performs better on bulk operations compared to its single write latency. This is because sending the data to WASM and backwards is faster if it is done all at once instead of once per document."}),"\n"]}),"\n",(0,r.jsx)(s.h3,{id:"big-bulk-reads",children:"Big Bulk Reads"}),"\n",(0,r.jsx)(s.p,{children:"Now lets read 100 documents in a bulk request."}),"\n",(0,r.jsxs)(s.table,{children:[(0,r.jsx)(s.thead,{children:(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.th,{children:"Technology"}),(0,r.jsx)(s.th,{children:"Time in Milliseconds"})]})}),(0,r.jsxs)(s.tbody,{children:[(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"Cookies"}),(0,r.jsx)(s.td,{children:"6.34"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"LocalStorage"}),(0,r.jsx)(s.td,{children:"0.39"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"IndexedDB"}),(0,r.jsx)(s.td,{children:"4.99"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"OPFS Main Thread"}),(0,r.jsx)(s.td,{children:"54.79"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"OPFS WebWorker"}),(0,r.jsx)(s.td,{children:"25.61"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"WASM SQLite (memory)"}),(0,r.jsx)(s.td,{children:"3.59"})]}),(0,r.jsxs)(s.tr,{children:[(0,r.jsx)(s.td,{children:"WASM SQLite (IndexedDB)"}),(0,r.jsx)(s.td,{children:"5.84 (35ms without cache)"})]})]})]}),"\n",(0,r.jsx)(s.p,{children:"Here we can notice a few things:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Reading many files in the OPFS webworker is about ",(0,r.jsx)(s.strong,{children:"twice as fast"})," compared to the slower main thread mode."]}),"\n",(0,r.jsxs)(s.li,{children:["WASM SQLite is surprisingly fast. Further inspection has shown that the WASM SQLite process keeps the documents in memory cached which improves the latency when we do reads directly after writes on the same data. When the browser tab is reloaded between the writes and the reads, finding the 100 documents takes about ",(0,r.jsx)(s.strong,{children:"35 milliseconds"})," instead."]}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"performance-conclusions",children:"Performance Conclusions"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["LocalStorage is really fast but remember that is has some downsides:","\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"It blocks the main JavaScript process and therefore should not be used for big bulk operations."}),"\n",(0,r.jsx)(s.li,{children:"Only Key-Value assignments are possible, you cannot use it efficiently when you need to do index based range queries on your data."}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["OPFS is way faster when used in the WebWorker with the ",(0,r.jsx)(s.code,{children:"createSyncAccessHandle()"})," method compare to using it directly in the main thread."]}),"\n",(0,r.jsx)(s.li,{children:"SQLite WASM can be fast but you have to initially download the full binary and start it up which takes about half a second. This might not be relevant at all if your app is started up once and the used for a very long time. But for web-apps that are opened and closed in many browser tabs many times, this might be a problem."}),"\n"]}),"\n",(0,r.jsx)(s.hr,{}),"\n",(0,r.jsx)(s.h2,{id:"possible-improvements",children:"Possible Improvements"}),"\n",(0,r.jsx)(s.p,{children:"There is a wide range of possible improvements and performance hacks to speed up the operations."}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["For IndexedDB I have made a list of ",(0,r.jsx)(s.a,{href:"/slow-indexeddb.html",children:"performance hacks here"}),". For example you can do sharding between multiple database and webworkers or use a custom index strategy."]}),"\n",(0,r.jsxs)(s.li,{children:["OPFS is slow in writing one file per document. But you do not have to do that and instead you can store everything at a single file like a normal database would do. This improves performance dramatically like it was done with the RxDB ",(0,r.jsx)(s.a,{href:"/rx-storage-opfs.html",children:"OPFS RxStorage"}),"."]}),"\n",(0,r.jsxs)(s.li,{children:["You can mix up the technologies to optimize for multiple scenarios at once. For example in RxDB there is the ",(0,r.jsx)(s.a,{href:"/rx-storage-localstorage-meta-optimizer.html",children:"localstorage meta optimizer"}),' which stores initial metadata in localstorage and "normal" documents inside of IndexedDB. This improves the initial startup time while still having the documents stored in a way to query them efficiently.']}),"\n",(0,r.jsxs)(s.li,{children:["There is the ",(0,r.jsx)(s.a,{href:"/rx-storage-memory-mapped.html",children:"memory-mapped"})," storage plugin in RxDB which maps data directly to memory. Using this in combination with a shared worker can improve pageloads and query time significantly."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.a,{href:"/key-compression.html",children:"Compressing"})," data before storing it might improve the performance for some of the storages."]}),"\n",(0,r.jsxs)(s.li,{children:["Splitting work up between ",(0,r.jsx)(s.a,{href:"/rx-storage-worker.html",children:"multiple WebWorkers"})," via ",(0,r.jsx)(s.a,{href:"/rx-storage-sharding.html",children:"sharding"})," can improve performance by utilizing the whole capacity of your users device."]}),"\n"]}),"\n",(0,r.jsxs)(s.p,{children:["Here you can see the ",(0,r.jsx)(s.a,{href:"/rx-storage-performance.html",children:"performance comparison"})," of various RxDB storage implementations which gives a better view of real world performance:"]}),"\n",(0,r.jsx)("center",{children:(0,r.jsx)("img",{src:"../files/rx-storage-performance-browser.png",alt:"RxStorage performance - browser",width:"700"})}),"\n",(0,r.jsx)(s.h2,{id:"future-improvements",children:"Future Improvements"}),"\n",(0,r.jsx)(s.p,{children:"You are reading this in 2024, but the web does not stand still. There is a good chance that browser get enhanced to allow faster and better data operations."}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Currently there is no way to directly access a persistent storage from inside a WebAssembly process. If this changes in the future, running SQLite (or a similar database) in a browser might be the best option."}),"\n",(0,r.jsxs)(s.li,{children:["Sending data between the main thread and a WebWorker is slow but might be improved in the future. There is a ",(0,r.jsx)(s.a,{href:"https://surma.dev/things/is-postmessage-slow/",children:"good article"})," about why ",(0,r.jsx)(s.code,{children:"postMessage()"})," is slow."]}),"\n",(0,r.jsxs)(s.li,{children:["IndexedDB lately ",(0,r.jsx)(s.a,{href:"https://developer.chrome.com/blog/maximum-idb-performance-with-storage-buckets",children:"got support"})," for storage buckets (chrome only) which might improve performance."]}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Share my ",(0,r.jsx)(s.a,{href:"https://x.com/rxdbjs/status/1846145062847062391",children:"announcement tweet"})," --\x3e"]}),"\n",(0,r.jsxs)(s.li,{children:["Reproduce the benchmarks at the ",(0,r.jsx)(s.a,{href:"https://github.com/pubkey/localstorage-indexeddb-cookies-opfs-sqlite-wasm",children:"github repo"})]}),"\n",(0,r.jsxs)(s.li,{children:["Learn how to use RxDB with the ",(0,r.jsx)(s.a,{href:"/quickstart.html",children:"RxDB Quickstart"})]}),"\n",(0,r.jsxs)(s.li,{children:["Check out the ",(0,r.jsx)(s.a,{href:"https://github.com/pubkey/rxdb",children:"RxDB github repo"})," and leave a star \u2b50"]}),"\n"]})]})}function c(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/32667c41.fb0c28b5.js b/docs/assets/js/32667c41.fb0c28b5.js deleted file mode 100644 index d4acb3ff74f..00000000000 --- a/docs/assets/js/32667c41.fb0c28b5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[8191],{8453(e,n,s){s.d(n,{R:()=>a,x:()=>t});var r=s(6540);const i={},o=r.createContext(i);function a(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:n},e.children)}},9955(e,n,s){s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"nosql-performance-tips","title":"RxDB NoSQL Performance Tips","description":"Skyrocket your NoSQL speed with RxDB tips. Learn about bulk writes, optimized queries, and lean plugin usage for peak performance.","source":"@site/docs/nosql-performance-tips.md","sourceDirName":".","slug":"/nosql-performance-tips.html","permalink":"/nosql-performance-tips.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB NoSQL Performance Tips","slug":"nosql-performance-tips.html","description":"Skyrocket your NoSQL speed with RxDB tips. Learn about bulk writes, optimized queries, and lean plugin usage for peak performance."},"sidebar":"tutorialSidebar","previous":{"title":"RxStorage Performance","permalink":"/rx-storage-performance.html"},"next":{"title":"Slow IndexedDB","permalink":"/slow-indexeddb.html"}}');var i=s(4848),o=s(8453);const a={title:"RxDB NoSQL Performance Tips",slug:"nosql-performance-tips.html",description:"Skyrocket your NoSQL speed with RxDB tips. Learn about bulk writes, optimized queries, and lean plugin usage for peak performance."},t="Performance tips for RxDB and other NoSQL databases",l={},c=[{value:"Use bulk operations",id:"use-bulk-operations",level:2},{value:"Help the query planner by adding operators that better restrict the index range",id:"help-the-query-planner-by-adding-operators-that-better-restrict-the-index-range",level:2},{value:"Set a specific index",id:"set-a-specific-index",level:2},{value:"Try different ordering of index fields",id:"try-different-ordering-of-index-fields",level:2},{value:"Make a Query "hot" to reduce load",id:"make-a-query-hot-to-reduce-load",level:2},{value:"Store parts of your document data as attachment",id:"store-parts-of-your-document-data-as-attachment",level:2},{value:"Process queries in a worker process",id:"process-queries-in-a-worker-process",level:2},{value:"Use less plugins and hooks",id:"use-less-plugins-and-hooks",level:2}];function d(e){const n={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",span:"span",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"performance-tips-for-rxdb-and-other-nosql-databases",children:"Performance tips for RxDB and other NoSQL databases"})}),"\n",(0,i.jsx)(n.p,{children:"In this guide, you'll find techniques to improve the performance of RxDB operations and queries. Notice that all your performance optimizations should be done with a correct tracking of the metrics, otherwise you might change stuff into the wrong direction."}),"\n",(0,i.jsx)(n.h2,{id:"use-bulk-operations",children:"Use bulk operations"}),"\n",(0,i.jsx)(n.p,{children:"When you run write operations on multiple documents, make sure you use bulk operations instead of single document operations."}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// wrong \u274c"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"for"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" docData"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" of"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" dataAr){"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(docData);"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// right \u2714\ufe0f"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".bulkInsert"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(dataAr);"})]})]})})}),"\n",(0,i.jsx)(n.h2,{id:"help-the-query-planner-by-adding-operators-that-better-restrict-the-index-range",children:"Help the query planner by adding operators that better restrict the index range"}),"\n",(0,i.jsx)(n.p,{children:"Often on complex queries, RxDB (and other databases) do not pick the optimal index range when querying a result set.\nYou can add additional restrictive operators to ensure the query runs over a smaller index space and has a better performance."}),"\n",(0,i.jsx)(n.p,{children:"Lets see some examples for different query types."}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Adding a restrictive operator for an $or query"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * so that it better limits the index space for the time-field."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" orQuery"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $or"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" time"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { $gt"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 1234"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" time"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { $eg"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 1234"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" user"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { $gt"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foobar'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" time: { $gte"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 1234"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// <- add restrictive operator"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Adding a restrictive operator for an $regex query"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * so that it better limits the index space for the user-field."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * We know that all matching fields start with 'foo' so we can"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * tell the query to use that as lower constraint for the index."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" regexQuery"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" user"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $regex"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '^foo(.*)0-9$'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // a complex regex with a ^ in the beginning"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $gte"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foo'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- add restrictive operator"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Adding a restrictive operator for a query on an enum field."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * so that it better limits the index space for the time-field."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" enumQuery"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Here lets assume our status field has the enum type ['idle', 'in-progress', 'done']"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * so our restrictive operator can exclude all documents with 'done' as status."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" status"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $in"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'idle'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'in-progress'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'done'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- add restrictive operator on status"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(n.h2,{id:"set-a-specific-index",children:"Set a specific index"}),"\n",(0,i.jsx)(n.p,{children:"Sometime the query planner of the database itself has no chance in picking the best index of the possible given indexes.\nFor queries where performance is very important, you might want to explicitly specify which index must be used."}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myQuery"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // explicitly specify index"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" index"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'fieldA'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'fieldB'"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(n.h2,{id:"try-different-ordering-of-index-fields",children:"Try different ordering of index fields"}),"\n",(0,i.jsxs)(n.p,{children:["The order of the fields in a compound index is very important for performance. When optimizing index usage, you should try out different orders on the index fields and measure which runs faster. For that it is very important to run tests on real-world data where the distribution of the data is the same as in production.\nFor example when there is a query on a user collection with an ",(0,i.jsx)(n.code,{children:"age"})," and a ",(0,i.jsx)(n.code,{children:"gender"})," field, it depends if the index ",(0,i.jsx)(n.code,{children:"['gender', 'age']"})," performance better as ",(0,i.jsx)(n.code,{children:"['age', 'gender']"})," based on the distribution of data:"]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myCollection"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" .findOne"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 18"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" gender"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $eq"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'm'"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Because the developer knows that 50% of the documents are 'male',"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * but only 20% are below age 18,"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * it makes sense to enforce using the ['gender', 'age'] index to improve performance."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * This could not be known by the query planer which might have chosen ['age', 'gender'] instead."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" index"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'gender'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'age'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})})]})})}),"\n",(0,i.jsxs)(n.p,{children:["Notice that RxDB has the ",(0,i.jsx)(n.a,{href:"/query-optimizer.html",children:"Query Optimizer Plugin"})," that can be used to automatically find the best indexes."]}),"\n",(0,i.jsx)(n.h2,{id:"make-a-query-hot-to-reduce-load",children:'Make a Query "hot" to reduce load'}),"\n",(0,i.jsxs)(n.p,{children:['Having a query where the up-to-date result set is needed more than once, you might want to make the query "hot" by permanently subscribing to it. This ensures that the query result is kept up to date by RxDB ant the ',(0,i.jsx)(n.a,{href:"https://github.com/pubkey/event-reduce",children:"EventReduce algorithm"})," at any time so that at the moment you need the current results, it has them already."]}),"\n",(0,i.jsx)(n.p,{children:'For example when you use RxDB at Node.js for a webserver, you should use an outer "hot" query instead of running the same query again on every request to a route.'}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// wrong \u274c"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"app"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".get"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'/list'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (req"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" res) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" result"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"})"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" res"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".send"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"JSON"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".stringify"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(result));"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// right \u2714\ufe0f"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"query"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(); "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// <- make it hot"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"app"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".get"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'/list'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (req"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" res) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" result"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" res"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".send"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"JSON"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".stringify"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(result));"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(n.h2,{id:"store-parts-of-your-document-data-as-attachment",children:"Store parts of your document data as attachment"}),"\n",(0,i.jsxs)(n.p,{children:["For in-app databases like RxDB, it does not make sense to partially parse the ",(0,i.jsx)(n.code,{children:"JSON"})," of a document. Instead, always the whole document json is parsed and handled. This has a better performance because ",(0,i.jsx)(n.code,{children:"JSON.parse()"})," in JavaScript directly calls a C++ binding which can parse really fast compared to a partial parsing in JavaScript itself. Also by always having the full document, RxDB can de-duplicate memory caches of document across multiple queries."]}),"\n",(0,i.jsxs)(n.p,{children:["The downside is that very very big documents with a complex structure can increase query time significantly. Documents fields with complex that are mostly not in use, can be move into an ",(0,i.jsx)(n.a,{href:"/rx-attachment.html",children:"attachment"}),". This would lead RxDB to not fetch the attachment data each time the document is loaded from disc. Instead only when explicitly asked for."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myDocument"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" attachment"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myDocument"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".putAttachment"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'otherStuff.json'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" data"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" createBlob"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"JSON"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".stringify"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"})"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'application/json'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'application/json'"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,i.jsx)(n.h2,{id:"process-queries-in-a-worker-process",children:"Process queries in a worker process"}),"\n",(0,i.jsxs)(n.p,{children:["Moving database storage into a WebWorker can significantly improve performance in web applications that use RxDB or similar NoSQL databases. When database operations are executed in the main JavaScript thread, they can block or slow down the User Interface, especially during heavy or complex data operations. By offloading these operations to a WebWorker, you effectively separate the data processing workload from the UI thread. This means the main thread remains free to handle user interactions and render updates without delay, leading to a smoother and more responsive user experience. Additionally, WebWorkers allow for parallel data processing, which can expedite tasks like querying and indexing. This approach not only enhances UI responsiveness but also optimizes overall application performance by leveraging the multi-threading capabilities of modern browsers.\nWith RxDB you can use the ",(0,i.jsx)(n.a,{href:"/rx-storage-worker.html",children:"Worker"})," and ",(0,i.jsx)(n.a,{href:"/rx-storage-shared-worker.html",children:"SharedWorker"})," plugin to move the query processing away from the main thread."]}),"\n",(0,i.jsx)(n.h2,{id:"use-less-plugins-and-hooks",children:"Use less plugins and hooks"}),"\n",(0,i.jsxs)(n.p,{children:["Utilizing fewer ",(0,i.jsx)(n.a,{href:"/middleware.html",children:"hooks"})," and plugins in RxDB or similar NoSQL database systems can lead to markedly better performance. Each additional hook or plugin introduces extra layers of processing and potential overhead, which can cumulatively slow down database operations. These extensions often execute additional code or enforce extra checks with each operation, such as insertions, updates, or deletions. While they can provide valuable functionalities or custom behaviors, their overuse can inadvertently increase the complexity and execution time of basic database operations. By minimizing their use and only employing essential hooks and plugins, the system can operate more efficiently. This streamlined approach reduces the computational burden on each transaction, leading to faster response times and a more efficient overall data handling process, especially critical in high-load or real-time applications where performance is paramount."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/326aca46.f7338c91.js b/docs/assets/js/326aca46.f7338c91.js deleted file mode 100644 index 885a3202aff..00000000000 --- a/docs/assets/js/326aca46.f7338c91.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[4853],{1748(e,t,n){n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>o,metadata:()=>a,toc:()=>h});const a=JSON.parse('{"id":"offline-first","title":"Local First / Offline First","description":"Local-First software stores data on client devices for seamless offline and online functionality, enhancing user experience and efficiency.","source":"@site/docs/offline-first.md","sourceDirName":".","slug":"/offline-first.html","permalink":"/offline-first.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Local First / Offline First","slug":"offline-first.html","description":"Local-First software stores data on client devices for seamless offline and online functionality, enhancing user experience and efficiency."},"sidebar":"tutorialSidebar","previous":{"title":"RxDB - The Real-Time Database for Node.js","permalink":"/nodejs-database.html"},"next":{"title":"React Native Database - Sync & Store Like a Pro","permalink":"/react-native-database.html"}}');var i=n(4848),s=n(8453);const o={title:"Local First / Offline First",slug:"offline-first.html",description:"Local-First software stores data on client devices for seamless offline and online functionality, enhancing user experience and efficiency."},r="Local First / Offline First",l={},h=[{value:"UX is better without loading spinners",id:"ux-is-better-without-loading-spinners",level:2},{value:"Multi-tab usage just works",id:"multi-tab-usage-just-works",level:2},{value:"Latency is more important than bandwidth",id:"latency-is-more-important-than-bandwidth",level:2},{value:"Realtime comes for free",id:"realtime-comes-for-free",level:2},{value:"Scales with data size, not with the amount of user interaction",id:"scales-with-data-size-not-with-the-amount-of-user-interaction",level:2},{value:"Modern apps have longer runtimes",id:"modern-apps-have-longer-runtimes",level:2},{value:"You might not need REST",id:"you-might-not-need-rest",level:2},{value:"You might not need Redux",id:"you-might-not-need-redux",level:2},{value:"Follow up",id:"follow-up",level:2}];function c(e){const t={a:"a",admonition:"admonition",blockquote:"blockquote",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"local-first--offline-first",children:"Local First / Offline First"})}),"\n",(0,i.jsxs)(t.p,{children:["Local-First (aka offline first) is a software paradigm where the software stores data locally at the clients device and must work as well offline as it does online.\nTo implement this, you have to store data at the client side, so that your application can still access it when the internet goes away.\nThis can be either done with complex caching strategies, or by using an local-first, ",(0,i.jsx)(t.a,{href:"/articles/offline-database.html",children:"offline database"})," (like ",(0,i.jsx)(t.a,{href:"https://rxdb.info",children:"RxDB"}),") that stores the data inside of a local database like ",(0,i.jsx)(t.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB"})," and replicates it from and to the backend in the background. This makes the local database, not the server, the gateway for all persistent changes in application state."]}),"\n",(0,i.jsxs)(t.blockquote,{children:["\n",(0,i.jsx)(t.p,{children:(0,i.jsx)(t.strong,{children:"Offline first is not about having no internet connection"})}),"\n"]}),"\n",(0,i.jsx)(t.admonition,{type:"note",children:(0,i.jsxs)(t.p,{children:["I wrote a follow-up version of offline/first local first about ",(0,i.jsx)(t.a,{href:"/articles/local-first-future.html",children:"Why Local-First Is the Future and what are Its Limitations"})]})}),"\n",(0,i.jsx)(t.p,{children:"While in the past, internet connection was an unstable, things are changing especially for mobile devices.\nMobile networks become better and having no internet becomes less common even in remote locations.\nSo if we did not care about offline first applications in the past, why should we even care now?\nIn the following I will point out why offline first applications are better, not because they support offline usage, but because of other reasons."}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"RxDB",width:"220"})})}),"\n",(0,i.jsx)(t.h2,{id:"ux-is-better-without-loading-spinners",children:"UX is better without loading spinners"}),"\n",(0,i.jsx)(t.p,{children:"In 'normal' web applications, most user interactions like fetching, saving or deleting data, correspond to a request to the backend server. This means that each of these interactions require the user to await the unknown latency to and from a remote server while looking at a loading spinner.\nIn offline-first apps, the operations go directly against the local storage which happens almost instantly. There is no perceptible loading time and so it is not even necessary to implement a loading spinner at all. As soon as the user clicks, the UI represents the new state as if it was already changed in the backend."}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"./files/loading-spinner-not-needed.gif",alt:"loading spinner not needed",width:"300"})}),"\n",(0,i.jsx)(t.h2,{id:"multi-tab-usage-just-works",children:"Multi-tab usage just works"}),"\n",(0,i.jsxs)(t.p,{children:["Many, even big websites like amazon, reddit and stack overflow do not handle multi tab usage correctly. When a user has multiple tabs of the website open and does a login on one of these tabs, the state does not change on the other tabs.\nOn offline first applications, there is always exactly one state of the data across all tabs. Offline first databases (like RxDB) store the data inside of IndexedDb and ",(0,i.jsx)(t.strong,{children:"share the state"})," between all tabs of the same origin."]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"./files/multiwindow.gif",alt:"RxDB multi tab",width:"450"})}),"\n",(0,i.jsx)(t.h2,{id:"latency-is-more-important-than-bandwidth",children:"Latency is more important than bandwidth"}),"\n",(0,i.jsx)(t.p,{children:"In the past, often the bandwidth was the limiting factor on determining the loading time of an application.\nBut while bandwidth has improved over the years, latency became the limiting factor.\nYou can always increase the bandwidth by setting up more cables or sending more Starlink satellites to space.\nBut reducing the latency is not so easy. It is defined by the physical properties of the transfer medium, the speed of light and the distance to the server. All of these three are hard to optimize."}),"\n",(0,i.jsxs)(t.p,{children:["Offline first application benefit from that because sending the initial state to the client can be done much faster with more bandwidth. And once the data is there, we do no longer have to care about the latency to the backend server because you can run near ",(0,i.jsx)(t.a,{href:"/articles/zero-latency-local-first.html",children:"zero"})," latency queries locally."]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"./files/latency-london-san-franzisco.png",alt:"latency london san franzisco",width:"300"})}),"\n",(0,i.jsx)(t.h2,{id:"realtime-comes-for-free",children:"Realtime comes for free"}),"\n",(0,i.jsxs)(t.p,{children:["Most websites lie to their users. They do not lie because they display wrong data, but because they display ",(0,i.jsx)(t.strong,{children:"old data"})," that was loaded from the backend at the time the user opened the site.\nTo overcome this, you could build a realtime website where you create a websocket that streams updates from the backend to the client. This means work. Your client needs to tell the server which page is currently opened and which updates the client is interested to. Then the server can push updates over the websocket and you can update the UI accordingly."]}),"\n",(0,i.jsxs)(t.p,{children:["With offline first applications, you already have a realtime replication with the backend. Most offline first databases provide some concept of changestream or data subscriptions and with ",(0,i.jsx)(t.a,{href:"https://github.com/pubkey/rxdb",children:"RxDB"})," you can even directly subscribe to query results or single fields of documents. This makes it easy to have an always updated UI whenever data on the backend changes."]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"./files/animations/realtime.gif",alt:"realtime ui updates",width:"700"})}),"\n",(0,i.jsx)(t.h2,{id:"scales-with-data-size-not-with-the-amount-of-user-interaction",children:"Scales with data size, not with the amount of user interaction"}),"\n",(0,i.jsx)(t.p,{children:"On normal applications, each user interaction can result in multiple requests to the backend server which increase its load.\nThe more users interact with your application, the more backend resources you have to provide."}),"\n",(0,i.jsx)(t.p,{children:"Offline first applications do not scale up with the amount of user actions but instead they scale up with the amount of data.\nOnce that data is transferred to the client, the user can do as many interactions with it as required without connecting to the server."}),"\n",(0,i.jsx)(t.h2,{id:"modern-apps-have-longer-runtimes",children:"Modern apps have longer runtimes"}),"\n",(0,i.jsx)(t.p,{children:"In the past you used websites only for a short time. You open it, perform some action and then close it again. This made the first load time the important metric when evaluating page speed.\nToday web applications have changed and with it the way we use them. Single page applications are opened once and then used over the whole day. Chat apps, email clients, PWAs and hybrid apps. All of these were made to have long runtimes.\nThis makes the time for user interactions more important than the initial loading time. Offline first applications benefit from that because there is often no loading time on user actions while loading the initial state to the client is not that relevant."}),"\n",(0,i.jsx)(t.h2,{id:"you-might-not-need-rest",children:"You might not need REST"}),"\n",(0,i.jsx)(t.p,{children:"On normal web applications, you make different requests for each kind of data interaction.\nFor that you have to define a swagger route, implement a route handler on the backend and create some client code to send or fetch data from that route. The more complex your application becomes, the more REST routes you have to maintain and implement."}),"\n",(0,i.jsxs)(t.p,{children:["With offline first apps, you have a way to hack around all this cumbersome work. You just replicate the whole state from the server to the client. The replication does not only run once, you have a ",(0,i.jsx)(t.strong,{children:"realtime replication"})," and all changes at one side are automatically there on the other side. On the client, you can access every piece of state with a simple database query.\nWhile this of course only works for amounts of data that the client can load and store, it makes implementing prototypes and simple apps much faster."]}),"\n",(0,i.jsx)(t.h2,{id:"you-might-not-need-redux",children:"You might not need Redux"}),"\n",(0,i.jsx)(t.p,{children:"Data is hard, especially for UI applications where many things can happen at the same time.\nThe user is clicking around. Stuff is loaded from the server. All of these things interact with the global state of the app.\nTo manage this complexity it is common to use state management libraries like Redux or MobX. With them, you write all this lasagna code to wrap the mutation of data and to make the UI react to all these changes."}),"\n",(0,i.jsx)(t.p,{children:"On offline first apps, your global state is already there in a single place stored inside of the local database.\nYou do not have to care whether this data came from the UI, another tab, the backend or another device of the same user. You can just make writes to the database and fetch data out of it."}),"\n",(0,i.jsx)(t.h2,{id:"follow-up",children:"Follow up"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:["Learn how to store and query data with RxDB in the ",(0,i.jsx)(t.a,{href:"/quickstart.html",children:"RxDB Quickstart"})]}),"\n",(0,i.jsx)(t.li,{children:(0,i.jsx)(t.a,{href:"/downsides-of-offline-first.html",children:"Downsides of Offline First"})}),"\n",(0,i.jsxs)(t.li,{children:["I wrote a follow-up version of offline/first local first about ",(0,i.jsx)(t.a,{href:"/articles/local-first-future.html",children:"Why Local-First Is the Future and what are Its Limitations"})]}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453(e,t,n){n.d(t,{R:()=>o,x:()=>r});var a=n(6540);const i={},s=a.createContext(i);function o(e){const t=a.useContext(s);return a.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),a.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/3417a9c7.4cd2a2af.js b/docs/assets/js/3417a9c7.4cd2a2af.js deleted file mode 100644 index f394b2368ce..00000000000 --- a/docs/assets/js/3417a9c7.4cd2a2af.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[5350],{4572(e,s,r){r.r(s),r.d(s,{assets:()=>t,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"articles/firestore-alternative","title":"RxDB - Firestore Alternative to Sync with Your Own Backend","description":"Looking for a Firestore alternative? RxDB is a local-first, NoSQL database that syncs seamlessly with any backend, offers rich offline capabilities, advanced conflict resolution, and reduces vendor lock-in.","source":"@site/docs/articles/firestore-alternative.md","sourceDirName":"articles","slug":"/articles/firestore-alternative.html","permalink":"/articles/firestore-alternative.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB - Firestore Alternative to Sync with Your Own Backend","slug":"firestore-alternative.html","description":"Looking for a Firestore alternative? RxDB is a local-first, NoSQL database that syncs seamlessly with any backend, offers rich offline capabilities, advanced conflict resolution, and reduces vendor lock-in."},"sidebar":"tutorialSidebar","previous":{"title":"RxDB as a Database in a jQuery Application","permalink":"/articles/jquery-database.html"},"next":{"title":"RxDB - Firebase Realtime Database Alternative to Sync With Your Own Backend","permalink":"/articles/firebase-realtime-database-alternative.html"}}');var i=r(4848),o=r(8453);const a={title:"RxDB - Firestore Alternative to Sync with Your Own Backend",slug:"firestore-alternative.html",description:"Looking for a Firestore alternative? RxDB is a local-first, NoSQL database that syncs seamlessly with any backend, offers rich offline capabilities, advanced conflict resolution, and reduces vendor lock-in."},l="RxDB - The Firestore Alternative That Can Sync with Your Own Backend",t={},c=[{value:"What Makes RxDB a Great Firestore Alternative?",id:"what-makes-rxdb-a-great-firestore-alternative",level:2},{value:"1. Fully Offline-First",id:"1-fully-offline-first",level:3},{value:"2. Freedom to Use Any Backend",id:"2-freedom-to-use-any-backend",level:3},{value:"3. Advanced Conflict Resolution",id:"3-advanced-conflict-resolution",level:3},{value:"4. Reduced Cloud Costs",id:"4-reduced-cloud-costs",level:3},{value:"5. No Limits on Query Features",id:"5-no-limits-on-query-features",level:3},{value:"6. True Offline-Start Support",id:"6-true-offline-start-support",level:3},{value:"7. Cross-Platform: Any JavaScript Runtime",id:"7-cross-platform-any-javascript-runtime",level:3},{value:"How Does RxDB's Sync Work?",id:"how-does-rxdbs-sync-work",level:2},{value:"Getting Started with RxDB as a Firestore Alternative",id:"getting-started-with-rxdb-as-a-firestore-alternative",level:2},{value:"Install RxDB:",id:"install-rxdb",level:3},{value:"Create a Database:",id:"create-a-database",level:3},{value:"Define Collections:",id:"define-collections",level:3},{value:"Sync",id:"sync",level:3},{value:"Example: Start a WebRTC P2P Replication",id:"example-start-a-webrtc-p2p-replication",level:3},{value:"Is RxDB Right for Your Project?",id:"is-rxdb-right-for-your-project",level:2},{value:"Follow Up",id:"follow-up",level:2}];function d(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"rxdb---the-firestore-alternative-that-can-sync-with-your-own-backend",children:"RxDB - The Firestore Alternative That Can Sync with Your Own Backend"})}),"\n",(0,i.jsxs)(s.p,{children:["If you're seeking a ",(0,i.jsx)(s.strong,{children:"Firestore alternative"}),", you're likely looking for a way to:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Avoid vendor lock-in"})," while still enjoying real-time replication."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Reduce cloud usage costs"})," by reading data locally instead of constantly fetching from the server."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Customize"})," how you store, query, and secure your data."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Implement advanced conflict resolution"})," strategies beyond Firestore's last-write-wins approach."]}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["Enter ",(0,i.jsx)(s.strong,{children:"RxDB"})," (Reactive Database) - a ",(0,i.jsx)(s.a,{href:"/articles/local-first-future.html",children:"local-first"}),", NoSQL database for JavaScript applications that can sync in real time with ",(0,i.jsx)(s.strong,{children:"any"})," backend of your choice. Whether you're tired of the limitations and fees associated with Firebase Cloud Firestore or simply need more flexibility, RxDB might be the Firestore alternative you've been searching for."]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"/files/logo/rxdb_javascript_database.svg",alt:"JavaScript Database",width:"220"})})}),"\n",(0,i.jsx)(s.h2,{id:"what-makes-rxdb-a-great-firestore-alternative",children:"What Makes RxDB a Great Firestore Alternative?"}),"\n",(0,i.jsx)(s.p,{children:"Firestore is convenient for many projects, but it does lock you into Google's ecosystem. Below are some of the key advantages you gain by choosing RxDB:"}),"\n",(0,i.jsx)(s.h3,{id:"1-fully-offline-first",children:"1. Fully Offline-First"}),"\n",(0,i.jsxs)(s.p,{children:["RxDB runs directly in your client application (",(0,i.jsx)(s.a,{href:"/articles/browser-database.html",children:"browser"}),", ",(0,i.jsx)(s.a,{href:"/nodejs-database.html",children:"Node.js"}),", ",(0,i.jsx)(s.a,{href:"/electron-database.html",children:"Electron"}),", ",(0,i.jsx)(s.a,{href:"/react-native-database.html",children:"React Native"}),", etc.). Data is stored locally, so your application ",(0,i.jsx)(s.strong,{children:"remains fully functional even when offline"}),". When the device returns online, RxDB's flexible replication protocol synchronizes your local changes with any remote endpoint."]}),"\n",(0,i.jsx)(s.h3,{id:"2-freedom-to-use-any-backend",children:"2. Freedom to Use Any Backend"}),"\n",(0,i.jsx)(s.p,{children:"Unlike Firestore, RxDB doesn't require a proprietary hosting service. You can:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Host your data on your own server (Node.js, Go, Python, etc.)."}),"\n",(0,i.jsxs)(s.li,{children:["Use existing databases like ",(0,i.jsx)(s.a,{href:"/replication-http.html",children:"PostgreSQL"}),", ",(0,i.jsx)(s.a,{href:"/replication-couchdb.html",children:"CouchDB"}),", or ",(0,i.jsx)(s.a,{href:"/replication.html",children:"MongoDB with custom endpoints"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Implement a ",(0,i.jsx)(s.a,{href:"/replication-graphql.html",children:"custom GraphQL"})," or ",(0,i.jsx)(s.a,{href:"/replication-http.html",children:"REST-based"})," API for syncing."]}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["This ",(0,i.jsx)(s.strong,{children:"backend-agnostic"})," approach protects you from vendor lock-in. Your application's client-side data storage remains consistent; only your replication logic (or plugin) changes if you switch servers."]}),"\n",(0,i.jsx)(s.h3,{id:"3-advanced-conflict-resolution",children:"3. Advanced Conflict Resolution"}),"\n",(0,i.jsxs)(s.p,{children:["Firestore enforces a ",(0,i.jsx)(s.a,{href:"https://stackoverflow.com/a/47781502/3443137",children:"last-write-wins"})," conflict resolution strategy. This might cause issues if multiple users or devices update the same data in complex ways."]}),"\n",(0,i.jsx)(s.p,{children:"RxDB lets you:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Implement ",(0,i.jsx)(s.strong,{children:"custom conflict resolution"})," via ",(0,i.jsx)(s.a,{href:"/transactions-conflicts-revisions.html#custom-conflict-handler",children:"revisions"}),"."]}),"\n",(0,i.jsx)(s.li,{children:"Store partial merges, track versions, or preserve multiple user edits."}),"\n",(0,i.jsx)(s.li,{children:"Fine-tune how your data merges to ensure consistency across distributed systems."}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"4-reduced-cloud-costs",children:"4. Reduced Cloud Costs"}),"\n",(0,i.jsxs)(s.p,{children:["Firestore queries often count as billable reads. With RxDB, queries run ",(0,i.jsx)(s.strong,{children:"locally"})," against your local state - no repeated network calls or extra charges. You pay only for the data actually synced, not every read. For ",(0,i.jsx)(s.strong,{children:"read-heavy"})," apps, using RxDB as a Firestore alternative can significantly reduce costs."]}),"\n",(0,i.jsx)(s.h3,{id:"5-no-limits-on-query-features",children:"5. No Limits on Query Features"}),"\n",(0,i.jsx)(s.p,{children:"Firestore's query engine is limited by certain constraints (e.g., no advanced joins, limited indexing). With RxDB:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"NoSQL"})," data is stored locally, and you can define any indexes you need."]}),"\n",(0,i.jsxs)(s.li,{children:["Perform ",(0,i.jsx)(s.a,{href:"/rx-query.html",children:"complex queries"}),", run ",(0,i.jsx)(s.a,{href:"/fulltext-search.html",children:"full-text search"}),", or do aggregated transformations or even ",(0,i.jsx)(s.a,{href:"/articles/javascript-vector-database.html",children:"vector search"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Use ",(0,i.jsx)(s.a,{href:"/rx-query.html#observe",children:"RxDB's reactivity"})," to subscribe to query results in real time."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"6-true-offline-start-support",children:"6. True Offline-Start Support"}),"\n",(0,i.jsxs)(s.p,{children:["While Firestore does have offline caching, it often requires an online check at app initialization for authentication. RxDB is ",(0,i.jsx)(s.a,{href:"/offline-first.html",children:"truly offline-first"}),"; you can launch the app and write data even if the device never goes online initially. It's ready whenever the user is."]}),"\n",(0,i.jsx)(s.h3,{id:"7-cross-platform-any-javascript-runtime",children:"7. Cross-Platform: Any JavaScript Runtime"}),"\n",(0,i.jsxs)(s.p,{children:["RxDB is designed to run in ",(0,i.jsx)(s.strong,{children:"any environment"})," that can execute JavaScript. Whether you\u2019re building a web app in the browser, an ",(0,i.jsx)(s.a,{href:"/electron-database.html",children:"Electron"})," desktop application, a ",(0,i.jsx)(s.a,{href:"/react-native-database.html",children:"React Native"})," mobile app, or a command-line tool with ",(0,i.jsx)(s.a,{href:"/nodejs-database.html",children:"Node.js"}),", RxDB\u2019s storage layer is swappable to fit your runtime\u2019s capabilities."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["In the ",(0,i.jsx)(s.strong,{children:"browser"}),", store data in ",(0,i.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB"})," or ",(0,i.jsx)(s.a,{href:"/rx-storage-opfs.html",children:"OPFS"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["In ",(0,i.jsx)(s.a,{href:"/nodejs-database.html",children:"Node.js"}),", use LevelDB or other supported storages."]}),"\n",(0,i.jsxs)(s.li,{children:["In ",(0,i.jsx)(s.a,{href:"/react-native-database.html",children:"React Native"}),", pick from a range of adapters suited for mobile devices."]}),"\n",(0,i.jsxs)(s.li,{children:["In ",(0,i.jsx)(s.a,{href:"/electron-database.html",children:"Electron"}),", rely on fast local storage with zero changes to your application code."]}),"\n"]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"how-does-rxdbs-sync-work",children:"How Does RxDB's Sync Work?"}),"\n",(0,i.jsxs)(s.p,{children:["RxDB replication is powered by its own ",(0,i.jsx)(s.a,{href:"/replication.html",children:"Sync Engine"}),". This simple yet robust protocol enables:"]}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Pull"}),": Fetch new or updated documents from the server."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Push"}),": Send local changes back to the server."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Live Real-Time"}),": Once you're caught up, you can opt for event-based streaming instead of continuous polling."]}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"Code Example: Sync RxDB with a Custom Backend"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { replicateRxCollection } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" initDB"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" multiInstance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" eventReduce"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" tasks"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'task schema'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" done"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'boolean'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Start a custom REST-based replication"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" replicateRxCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".tasks"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" replicationIdentifier"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-tasks-rest-api'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (documents) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Send docs to your REST endpoint"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" res"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" fetch"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'https://myapi.com/push'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" method"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'POST'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" body"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" JSON"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".stringify"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ docs"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" documents })"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Return conflicts if any"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" res"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".json"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (lastCheckpoint"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Fetch from your REST endpoint"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" res"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" fetch"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"`https://myapi.com/pull?checkpoint="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"${"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"JSON"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".stringify"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(lastCheckpoint)"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"&limit="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"${"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"batchSize"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"`"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" res"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".json"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" live"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // keep watching for changes"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" db;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsxs)(s.p,{children:["By swapping out the handler implementations or using an official plugin (e.g., ",(0,i.jsx)(s.a,{href:"/replication-graphql.html",children:"GraphQL"}),", ",(0,i.jsx)(s.a,{href:"/replication-couchdb.html",children:"CouchDB"}),", ",(0,i.jsx)(s.a,{href:"/replication-firestore.html",children:"Firestore replication"}),", etc.), you can adapt to any backend or data source. RxDB thus becomes a flexible alternative to Firestore while maintaining ",(0,i.jsx)(s.a,{href:"/articles/realtime-database.html",children:"real-time capabilities"}),"."]}),"\n",(0,i.jsx)(s.h2,{id:"getting-started-with-rxdb-as-a-firestore-alternative",children:"Getting Started with RxDB as a Firestore Alternative"}),"\n",(0,i.jsx)(s.h3,{id:"install-rxdb",children:"Install RxDB:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" rxdb"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" rxjs"})]})})})}),"\n",(0,i.jsx)(s.h3,{id:"create-a-database",children:"Create a Database:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.h3,{id:"define-collections",children:"Define Collections:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" items"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'items schema'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" text"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.h3,{id:"sync",children:"Sync"}),"\n",(0,i.jsxs)(s.p,{children:["Use a ",(0,i.jsx)(s.a,{href:"/replication.html",children:"Replication Plugin"})," to connect with a custom backend or existing database."]}),"\n",(0,i.jsxs)(s.p,{children:["For a Firestore-specific approach, RxDB ",(0,i.jsx)(s.a,{href:"/replication-firestore.html",children:"Firestore Replication"})," also exists if you want to combine local indexing and advanced queries with a Cloud Firestore backend. But if you really want to replace Firestore entirely - just point RxDB to your new backend."]}),"\n",(0,i.jsx)(s.h3,{id:"example-start-a-webrtc-p2p-replication",children:"Example: Start a WebRTC P2P Replication"}),"\n",(0,i.jsxs)(s.p,{children:["In addition to syncing with a central server, RxDB also supports pure peer-to-peer replication using ",(0,i.jsx)(s.a,{href:"/replication-webrtc.html",children:"WebRTC"}),". This can be invaluable for scenarios where clients need to sync data directly without a master server."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" replicateWebRTC"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getConnectionHandlerSimplePeer"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication-webrtc'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationPool"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" replicateWebRTC"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".tasks"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" topic"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-p2p-room'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Clients with the same topic will sync with each other."})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" connectionHandlerCreator"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getConnectionHandlerSimplePeer"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Use your own or the official RxDB signaling server"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" signalingServerUrl"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'wss://signaling.rxdb.info/'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Node.js requires a polyfill for WebRTC & WebSocket"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" wrtc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'node-datachannel/polyfill'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" webSocketConstructor"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'ws'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:").WebSocket"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // optional pull config"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// optional push config"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// The replicationPool manages all connected peers"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"replicationPool"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"error$"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(err "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".error"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'P2P Sync Error:'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" err);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.p,{children:["This example sets up a live ",(0,i.jsx)(s.strong,{children:"P2P replication"})," where any new peers joining the same topic automatically sync local data with each other, eliminating the need for a dedicated central server for the actual data exchange."]}),"\n",(0,i.jsx)(s.h2,{id:"is-rxdb-right-for-your-project",children:"Is RxDB Right for Your Project?"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"You want offline-first"}),": If you need an offline-first app that starts offline, RxDB's local database approach and sync protocol excel at this."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Your project is read-heavy"}),": Reading from Firestore for every query can get expensive. With RxDB, reads are free and local; you only pay for writes or sync overhead."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"You need advanced queries"}),": Firestore's query constraints may not suit complex data. With RxDB, you can define your own indexing logic or run arbitrary queries locally."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"You want no vendor lock-in"}),": Easily transition from Firestore to your own server or another vendor - just change the replication layer."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,i.jsx)(s.p,{children:"If you've been searching for a Firestore alternative that gives you the freedom to sync your data with any backend, offers robust offline-first capabilities, and supports truly customizable conflict resolution and queries, RxDB is worth exploring. You can adopt it seamlessly, ensure local reads, reduce costs, and stay in complete control of your data layer."}),"\n",(0,i.jsx)(s.p,{children:"Ready to dive in? Check out the RxDB Quickstart Guide, join our Discord community, and experience how RxDB can be the perfect local-first, real-time database solution for your next project."}),"\n",(0,i.jsx)(s.p,{children:"More resources:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"/replication.html",children:"RxDB Sync Engine"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"/replication-firestore.html",children:"Firestore Replication Plugin"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"/transactions-conflicts-revisions.html",children:"Custom Conflict Resolution"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"/code/",children:"RxDB GitHub Repository"})}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453(e,s,r){r.d(s,{R:()=>a,x:()=>l});var n=r(6540);const i={},o=n.createContext(i);function a(e){const s=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/34f94d1b.29ea6eee.js b/docs/assets/js/34f94d1b.29ea6eee.js deleted file mode 100644 index 217a8530ba1..00000000000 --- a/docs/assets/js/34f94d1b.29ea6eee.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[5832],{8274(e,s,r){r.r(s),r.d(s,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"electron-database","title":"Electron Database - Storage adapters for SQLite, Filesystem and In-Memory","description":"Harness the database power of SQLite, Filesystem, and in-memory storage in Electron with RxDB. Build fast, offline-first apps that sync in real time.","source":"@site/docs/electron-database.md","sourceDirName":".","slug":"/electron-database.html","permalink":"/electron-database.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Electron Database - Storage adapters for SQLite, Filesystem and In-Memory","slug":"electron-database.html","description":"Harness the database power of SQLite, Filesystem, and in-memory storage in Electron with RxDB. Build fast, offline-first apps that sync in real time."},"sidebar":"tutorialSidebar","previous":{"title":"Alternatives for realtime local-first JavaScript applications and local databases","permalink":"/alternatives.html"},"next":{"title":"Building an Optimistic UI with RxDB","permalink":"/articles/optimistic-ui.html"}}');var o=r(4848),t=r(8453);const a={title:"Electron Database - Storage adapters for SQLite, Filesystem and In-Memory",slug:"electron-database.html",description:"Harness the database power of SQLite, Filesystem, and in-memory storage in Electron with RxDB. Build fast, offline-first apps that sync in real time."},i="Electron Database - RxDB with different storage for SQLite, Filesystem and In-Memory",l={},c=[{value:"Databases for Electron",id:"databases-for-electron",level:2},{value:"Server Side Databases in Electron.js",id:"server-side-databases-in-electronjs",level:3},{value:"Localstorage / IndexedDB / WebSQL as alternatives to SQLite in Electron",id:"localstorage--indexeddb--websql-as-alternatives-to-sqlite-in-electron",level:3},{value:"RxDB",id:"rxdb",level:3},{value:"SQLite in Electron.js without RxDB",id:"sqlite-in-electronjs-without-rxdb",level:3},{value:"Follow up",id:"follow-up",level:2}];function d(e){const s={a:"a",code:"code",em:"em",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"electron-database---rxdb-with-different-storage-for-sqlite-filesystem-and-in-memory",children:"Electron Database - RxDB with different storage for SQLite, Filesystem and In-Memory"})}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.a,{href:"https://www.electronjs.org/",children:"Electron"})," (aka Electron.js) is a framework developed by github that is designed to create desktop applications with the Web technology stack consisting of HTML, CSS and JavaScript.\nBecause the desktop application runs on the client's device, it is suitable to use a database that can store and query data locally. This allows you to create so-called ",(0,o.jsx)(s.a,{href:"/offline-first.html",children:"local first"})," apps that store data locally and even work when the user has no internet connection.\nWhile there are many options to store data in Electron, for complex realtime apps using ",(0,o.jsx)(s.a,{href:"https://rxdb.info/",children:"RxDB"})," is recommended because it is a database made for UI-based client-side application, not a server-side database."]}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{src:"./files/icons/electron.svg",alt:"Electron",width:"70"})}),"\n",(0,o.jsx)(s.h2,{id:"databases-for-electron",children:"Databases for Electron"}),"\n",(0,o.jsx)(s.p,{children:"An Electron runtime can be divided into two parts:"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsx)(s.li,{children:'The "main" process which is a Node.js JavaScript process that runs without a UI in the background.'}),"\n",(0,o.jsx)(s.li,{children:'One or multiple "renderer" processes that consist of a Chrome browser engine and runs the user interface. Each renderer process represents one "browser tab".'}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:"This is important to understand because choosing the right database depends on your use case and on which of these JavaScript runtimes you want to keep the data."}),"\n",(0,o.jsx)(s.h3,{id:"server-side-databases-in-electronjs",children:"Server Side Databases in Electron.js"}),"\n",(0,o.jsxs)(s.p,{children:['Because Electron runs on a desktop computer, you might think that it should be possible to use a common "server" database like MySQL, PostgreSQL or MongoDB. In theory, you could ship the correct database server binaries with your electron application and start a process on the client\'s device that exposes a port to the database that can be consumed by Electron. In practice, this is not a viable way to go because shipping the correct binaries and opening ports is way to complicated and troublesome. Instead you should use a database that can be bundled and run ',(0,o.jsx)(s.strong,{children:"inside"})," of Electron, either in the ",(0,o.jsx)(s.em,{children:"main"})," or in the ",(0,o.jsx)(s.em,{children:"renderer"})," process."]}),"\n",(0,o.jsx)(s.h3,{id:"localstorage--indexeddb--websql-as-alternatives-to-sqlite-in-electron",children:"Localstorage / IndexedDB / WebSQL as alternatives to SQLite in Electron"}),"\n",(0,o.jsxs)(s.p,{children:["Because Electron uses a common Chrome web browser in the renderer process, you can access the common Web Storage APIs like ",(0,o.jsx)(s.a,{href:"/articles/localstorage.html",children:"Localstorage"}),", IndexedDB and WebSQL. This is easy to set up and storing small sets of data can be achieved in a short span of time."]}),"\n",(0,o.jsxs)(s.p,{children:["But as soon as your application goes beyond a simple todo-app, there are multiple obstacles that come in your way. One thing is the bad multi-tab support. If you have more than one ",(0,o.jsx)(s.em,{children:"renderer"})," process, it becomes hard to manage database writes between them. Each ",(0,o.jsx)(s.em,{children:"browser tab"})," could modify the database state while the others do not know of the changes and keep an outdated UI."]}),"\n",(0,o.jsxs)(s.p,{children:["Another thing is performance. ",(0,o.jsx)(s.a,{href:"/slow-indexeddb.html",children:"IndexedDB is slow"}),", mostly because it has to go through layers of browser security and abstractions. Storing and querying a lot of data might become your performance bottleneck. Localstorage and WebSQL are even slower, by the way. Using these Web Storage APIs is generally only recommended when you know for sure that there will be always only ",(0,o.jsx)(s.strong,{children:"one rendering process"}),' and performance is not that relevant. The main reason for that is the security- and abstraction layers that write- and read operations have to go through when using the browsers IndexedDB API. So instead of using IndexedDB in Electron in the renderer process, you should use something that runs in the "main" process in Node.js like the ',(0,o.jsx)(s.a,{href:"/rx-storage-filesystem-node.html",children:"Filesystem RxStorage"})," or the ",(0,o.jsx)(s.a,{href:"/rx-storage-memory.html",children:"In Memory RxStorage"}),"."]}),"\n",(0,o.jsx)(s.h3,{id:"rxdb",children:"RxDB"}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{src:"./files/logo/rxdb_javascript_database.svg",alt:"RxDB",width:"170"})}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.a,{href:"https://rxdb.info/",children:"RxDB"})," is a NoSQL database for JavaScript applications. It has many features that come in handy when RxDB is used with UI based applications like your Electron app. For example, it is able to subscribe to query results of single fields of documents. It has encryption and compression features and most important it has a battle tested ",(0,o.jsx)(s.a,{href:"/replication.html",children:"Sync Engine"})," that can be used to do a realtime sync with your backend."]}),"\n",(0,o.jsxs)(s.p,{children:["Because of the ",(0,o.jsx)(s.a,{href:"https://rxdb.info/rx-storage.html",children:"flexible storage"})," layer of RxDB, there are many options on how to use it with Electron:"]}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:["The ",(0,o.jsx)(s.a,{href:"/rx-storage-memory.html",children:"memory RxStorage"})," that stores the data inside of the JavaScript memory without persistence"]}),"\n",(0,o.jsxs)(s.li,{children:["The ",(0,o.jsx)(s.a,{href:"/rx-storage-sqlite.html",children:"SQLite RxStorage"})]}),"\n",(0,o.jsxs)(s.li,{children:["The ",(0,o.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB RxStorage"})]}),"\n",(0,o.jsxs)(s.li,{children:["The ",(0,o.jsx)(s.a,{href:"/rx-storage-localstorage.html",children:"LocalStorage RxStorage"})]}),"\n",(0,o.jsxs)(s.li,{children:["The ",(0,o.jsx)(s.a,{href:"/rx-storage-dexie.html",children:"Dexie.js RxStorage"})]}),"\n",(0,o.jsxs)(s.li,{children:["The ",(0,o.jsx)(s.a,{href:"/rx-storage-filesystem-node.html",children:"Node.js Filesystem"})]}),"\n"]}),"\n",(0,o.jsxs)(s.p,{children:["It is recommended to use the ",(0,o.jsx)(s.a,{href:"/rx-storage-sqlite.html",children:"SQLite RxStorage"})," because it has the best performance and is the easiest to set up. However it is part of the ",(0,o.jsx)(s.a,{href:"/premium/",children:"\ud83d\udc51 Premium Plugins"})," which must be purchased, so to try out RxDB with Electron, you might want to use one of the other options. To start with RxDB, I would recommend using the LocalStorage RxStorage in the renderer processes. Because RxDB is able to broadcast the database state between browser tabs, having multiple renderer processes is not a problem like it would be when you use plain IndexedDB without RxDB.\nIn production, you would always run the RxStorage in the main process with the ",(0,o.jsx)(s.a,{href:"/electron.html#rxstorage-electron-ipcrenderer--ipcmain",children:"RxStorage Electron IpcRenderer & IpcMain"})," plugins."]}),"\n",(0,o.jsxs)(s.p,{children:["First, you have to install all dependencies via ",(0,o.jsx)(s.code,{children:"npm install rxdb rxjs"}),".\nThen you can assemble the RxStorage and create a database with it:"]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// create database"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// create collections"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" collections"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" humans"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// insert document"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" collections"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"humans"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({id"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foo'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bar'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// run a query"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" result"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" collections"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"humans"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bar'"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"})"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// observe a query"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" collections"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"humans"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bar'"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"})."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"$"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(result "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})]})]})})}),"\n",(0,o.jsxs)(s.p,{children:["For better performance in the renderer tab, you can later switch to the ",(0,o.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB RxStorage"}),". But in production, it is recommended to use the ",(0,o.jsx)(s.a,{href:"/rx-storage-sqlite.html",children:"SQLite RxStorage"})," or the ",(0,o.jsx)(s.a,{href:"/rx-storage-filesystem-node.html",children:"Filesystem RxStorage"})," in the main process so that database operations do not block the rendering of the UI.\nTo learn more about using RxDB with Electron, you might want to check out ",(0,o.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/electron",children:"this example project"}),"."]}),"\n",(0,o.jsx)(s.h3,{id:"sqlite-in-electronjs-without-rxdb",children:"SQLite in Electron.js without RxDB"}),"\n",(0,o.jsx)(s.p,{children:"SQLite is a SQL based relational database written in the C programming language that was crafted to be embedded inside of applications and stores data locally. Operations are written in the SQL query language similar to the PostgreSQL syntax."}),"\n",(0,o.jsxs)(s.p,{children:["Using SQLite in Electron is not possible in the ",(0,o.jsx)(s.em,{children:"renderer process"}),", only in the ",(0,o.jsx)(s.em,{children:"main process"}),". To communicate data operations between your main and your renderer processes, you have to use either ",(0,o.jsx)(s.a,{href:"https://github.com/electron/remote",children:"@electron/remote"})," (not recommended) or the ",(0,o.jsx)(s.a,{href:"https://www.electronjs.org/de/docs/latest/api/ipc-renderer",children:"ipcRenderer"})," (recommended). So you start up SQLite in your main process and whenever you want to read or write data, you send the SQL queries to the main process and retrieve the result back as JSON data."]}),"\n",(0,o.jsxs)(s.p,{children:["To install SQLite, use the ",(0,o.jsx)(s.a,{href:"https://github.com/TryGhost/node-sqlite3",children:"SQLite3"})," package which is a native Node.js module. You also need the ",(0,o.jsx)(s.a,{href:"https://github.com/electron/rebuild",children:"@electron/rebuild"})," package to rebuild the SQLite module against the currently installed Electron version."]}),"\n",(0,o.jsxs)(s.p,{children:["Install them with ",(0,o.jsx)(s.code,{children:"npm install sqlite3 @electron/rebuild"}),".\nThen you can rebuild SQLite with ",(0,o.jsx)(s.code,{children:"./node_modules/.bin/electron-rebuild -f -w sqlite3"}),"\nIn the JavaScript code of your main process you can now create a database:"]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" sqlite3"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'sqlite3'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" sqlite3"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".Database"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'/path/to/database/file.db'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// create a table and insert a row"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"db"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".serialize"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(() "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".run"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"CREATE TABLE Users (name, lastName)"'}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".run"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"INSERT INTO Users VALUES (?, ?)"'}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'foo'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bar'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]);"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(s.p,{children:"Also you have to set up the ipcRenderer so that message from the renderer process are handled:"}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"ipcMain"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".handle"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'db-query'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (event"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqlQuery) "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" Promise"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(res "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".all"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(sqlQuery"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (err"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" rows) "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" res"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(rows);"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(s.p,{children:"In your renderer process, you can now call the ipcHandler and fetch data from SQLite:"}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsx)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" rows"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" ipcRenderer"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".invoke"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'db-query'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "SELECT * FROM Users"'}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})})})}),"\n",(0,o.jsxs)(s.p,{children:["The downside of SQLite (or SQL in general) is that it is lacking many features that are handful when using a database together with ",(0,o.jsx)(s.strong,{children:"UI based"})," applications. It is not possible to observe queries or document fields and there is no replication method to sync data with a server. This makes SQLite a good solution when you just want to store data on the client or process expensive SQL queries on the server, but it is not suitable for more complex operations like two-way replication, encryption, compression and so on. Also developer helpers like TypeScript type safety are totally out of reach."]}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{src:"./files/logo/rxdb_javascript_database.svg",alt:"RxDB Electron Database",width:"170"})}),"\n",(0,o.jsx)(s.h2,{id:"follow-up",children:"Follow up"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:["Learn how to use RxDB as database in electron with the ",(0,o.jsx)(s.a,{href:"/quickstart.html",children:"Quickstart Tutorial"}),"."]}),"\n",(0,o.jsxs)(s.li,{children:["Check out the ",(0,o.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/electron",children:"RxDB Electron example"})]}),"\n",(0,o.jsxs)(s.li,{children:["There is a followup list of other ",(0,o.jsx)(s.a,{href:"/alternatives.html",children:"client side database alternatives"})," that you can try to use with Electron."]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453(e,s,r){r.d(s,{R:()=>a,x:()=>i});var n=r(6540);const o={},t=n.createContext(o);function a(e){const s=n.useContext(t);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/35e4d287.95750a0a.js b/docs/assets/js/35e4d287.95750a0a.js deleted file mode 100644 index 797bb9fb0ad..00000000000 --- a/docs/assets/js/35e4d287.95750a0a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[7853],{383(e,n,i){i.r(n),i.d(n,{assets:()=>d,contentTitle:()=>o,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>a});const r=JSON.parse('{"id":"releases/17.0.0","title":"RxDB 17.0.0","description":"RxDB 17 introduces improved reactivity APIs, better debugging, breaking storage fixes, and multiple plugins graduating from beta.","source":"@site/docs/releases/17.0.0.md","sourceDirName":"releases","slug":"/releases/17.0.0.html","permalink":"/releases/17.0.0.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB 17.0.0","slug":"17.0.0.html","description":"RxDB 17 introduces improved reactivity APIs, better debugging, breaking storage fixes, and multiple plugins graduating from beta."},"sidebar":"tutorialSidebar","previous":{"title":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","permalink":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html"},"next":{"title":"16.0.0","permalink":"/releases/16.0.0.html"}}');var s=i(4848),t=i(8453);const l={title:"RxDB 17.0.0",slug:"17.0.0.html",description:"RxDB 17 introduces improved reactivity APIs, better debugging, breaking storage fixes, and multiple plugins graduating from beta."},o="RxDB 17.0.0 (beta)",d={},a=[{value:"Migration",id:"migration",level:2},{value:"Storage migration required",id:"storage-migration-required",level:3},{value:"Other migration notes",id:"other-migration-notes",level:3},{value:"CHANGES",id:"changes",level:2},{value:"Features",id:"features",level:3},{value:"\ud83d\udd01 Reactivity & APIs",id:"-reactivity--apis",level:3},{value:"\ud83e\udde0 Debugging & Developer Experience",id:"-debugging--developer-experience",level:3},{value:"\ud83d\uddc4\ufe0f Storage & Replication Fixes",id:"\ufe0f-storage--replication-fixes",level:3},{value:"\ud83d\udcd0 Schema & Index Validation",id:"-schema--index-validation",level:3},{value:"\u2699\ufe0f Performance & Internal Changes",id:"\ufe0f-performance--internal-changes",level:3},{value:"\ud83d\udd0c Plugins Graduating from Beta",id:"-plugins-graduating-from-beta",level:3},{value:"You can help!",id:"you-can-help",level:2},{value:"LinkedIn",id:"linkedin",level:2}];function c(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"rxdb-1700-beta",children:"RxDB 17.0.0 (beta)"})}),"\n",(0,s.jsxs)(n.p,{children:["RxDB 17 focuses on ",(0,s.jsx)(n.strong,{children:"better reactivity"}),", ",(0,s.jsx)(n.strong,{children:"improved debugging"}),", and ",(0,s.jsx)(n.strong,{children:"important storage fixes"}),", while also graduating several long-standing plugins out of beta."]}),"\n",(0,s.jsxs)(n.p,{children:["Most applications can upgrade easily, but ",(0,s.jsx)(n.strong,{children:"users of OPFS and filesystem-based storages must review the migration notes carefully"}),"."]}),"\n",(0,s.jsx)(n.admonition,{type:"note",children:(0,s.jsxs)(n.p,{children:["RxDB version 17 is currently in ",(0,s.jsx)(n.strong,{children:"beta"}),". For testing, please install the latest beta version ",(0,s.jsx)(n.a,{href:"https://www.npmjs.com/package/rxdb?activeTab=versions",children:"from npm"})," and provide feedback or report issues ",(0,s.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/issues/7574",children:"on GitHub"}),"."]})}),"\n",(0,s.jsx)(n.h2,{id:"migration",children:"Migration"}),"\n",(0,s.jsx)(n.p,{children:"RxDB 17 is mostly backward-compatible, but please review the following points before upgrading:"}),"\n",(0,s.jsx)(n.h3,{id:"storage-migration-required",children:"Storage migration required"}),"\n",(0,s.jsxs)(n.p,{children:["If you use any of the following storages, ",(0,s.jsx)(n.strong,{children:"you must migrate your data"})," using the ",(0,s.jsx)(n.a,{href:"/migration-storage.html",children:"storage migrator"}),":"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"OPFS RxStorage"}),"\n",(0,s.jsx)(n.li,{children:"Filesystem RxStorage (Node)"}),"\n",(0,s.jsx)(n.li,{children:"IndexedDB RxStorage (if you use attachments)"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"For all other RxStorages, data created with RxDB v16 can be reused directly in RxDB v17."}),"\n",(0,s.jsx)(n.h3,{id:"other-migration-notes",children:"Other migration notes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["The GitHub repository ",(0,s.jsxs)(n.strong,{children:["no longer contains prebuilt ",(0,s.jsx)(n.code,{children:"dist"})," files"]}),".",(0,s.jsx)(n.br,{}),"\n","Install RxDB from npm or run the build scripts locally."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"toggleOnDocumentVisible"})," now defaults to ",(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.code,{children:"true"})}),". ",(0,s.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/issues/6810",children:"#6810"})]}),"\n",(0,s.jsxs)(n.li,{children:["Schema fields marked as ",(0,s.jsx)(n.code,{children:"final"})," ",(0,s.jsxs)(n.strong,{children:["no longer need to be explicitly listed as ",(0,s.jsx)(n.code,{children:"required"})]}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Some integrations now use ",(0,s.jsx)(n.strong,{children:"optional peer dependencies"}),". You may need to install them manually:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"firebase"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"mongodb"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.code,{children:"nats"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"changes",children:"CHANGES"}),"\n",(0,s.jsx)(n.h3,{id:"features",children:"Features"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Added ",(0,s.jsx)(n.a,{href:"/react.html",children:"react-hooks plugin"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"-reactivity--apis",children:"\ud83d\udd01 Reactivity & APIs"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ADD"})," ",(0,s.jsx)(n.code,{children:"RxDatabase.collections$"})," observable for reactive access to collections"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ADD"})," support for the JavaScript ",(0,s.jsx)(n.code,{children:"using"})," keyword to automatically remove databases in tests"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ADD"})," new ",(0,s.jsx)(n.code,{children:"reactivity-angular"})," package"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"CHANGE"})," moved ",(0,s.jsx)(n.code,{children:"reactivity-vue"})," and ",(0,s.jsx)(n.code,{children:"reactivity-preact-signals"})," from premium to core"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"FIX"})," query results becoming incorrect when changes occur faster than query update ",(0,s.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/issues/7067",children:"#7067"})]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"-debugging--developer-experience",children:"\ud83e\udde0 Debugging & Developer Experience"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ADD"})," ",(0,s.jsx)(n.code,{children:"context"})," field to all RxDB write errors for easier debugging"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ADD"})," improved OPFS RxStorage error logging in ",(0,s.jsx)(n.code,{children:"devMode"}),", including:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["strict ",(0,s.jsx)(n.code,{children:"TextDecoder"})," mode"]}),"\n",(0,s.jsx)(n.li,{children:"detailed decoding error output"}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ADD"})," internal ",(0,s.jsx)(n.code,{children:"WeakRef"})," TypeScript types so users no longer need to enable ",(0,s.jsx)(n.code,{children:"ES2021.WeakRef"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ADD"})," ",(0,s.jsx)(n.a,{href:"https://rxdb.info/llms.txt",children:"llms.txt"})," for LLM-friendly documentation access"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"CHANGE"})," ",(0,s.jsx)(n.code,{children:"toggleOnDocumentVisible"})," now defaults to ",(0,s.jsx)(n.code,{children:"true"})," ",(0,s.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/issues/6810",children:"#6810"})]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"\ufe0f-storage--replication-fixes",children:"\ud83d\uddc4\ufe0f Storage & Replication Fixes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"FIX"})," OPFS RxStorage memory and cleanup leaks"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"FIX"})," memory-mapped storage not purging deleted documents"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"FIX"})," ",(0,s.jsx)(n.code,{children:"RxCollection.cleanup()"})," ignoring ",(0,s.jsx)(n.code,{children:"minimumDeletedTime"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"FIX"})," short primary key lengths not matching replication schema ",(0,s.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/issues/7587",children:"#7587"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"FIX"})," retry DenoKV commits when encountering ",(0,s.jsx)(n.code,{children:'"database is locked"'})," errors"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"FIX"})," close broadcast channels and leader election ",(0,s.jsx)(n.strong,{children:"after"})," database shutdown, not during"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"CHANGE"}),": Store data as binary in IndexedDB to use less disc space."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"CHANGE"}),": Pull-Only replications no longer store the server metadata on the client."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"-schema--index-validation",children:"\ud83d\udcd0 Schema & Index Validation"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ADD"})," enforce maximum length for indexes and primary keys (",(0,s.jsx)(n.code,{children:"maxLength: 2048"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"CHANGE"})," ",(0,s.jsx)(n.code,{children:"final"})," schema fields no longer need to be marked as ",(0,s.jsx)(n.code,{children:"required"})]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"\ufe0f-performance--internal-changes",children:"\u2699\ufe0f Performance & Internal Changes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"CHANGE"})," replace ",(0,s.jsx)(n.code,{children:"appendToArray()"})," with ",(0,s.jsx)(n.code,{children:"Array.concat()"})," for better browser-level optimizations"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ADD"})," ensure indexes and primary keys are validated consistently across replication schemas"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"-plugins-graduating-from-beta",children:"\ud83d\udd0c Plugins Graduating from Beta"}),"\n",(0,s.jsxs)(n.p,{children:["The following plugins are ",(0,s.jsx)(n.strong,{children:"no longer in beta"})," and are now considered production-ready:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Replication Appwrite"}),"\n",(0,s.jsx)(n.li,{children:"Replication Supabase"}),"\n",(0,s.jsx)(n.li,{children:"Replication MongoDB"}),"\n",(0,s.jsx)(n.li,{children:"RxStorage MongoDB"}),"\n",(0,s.jsx)(n.li,{children:"RxStorage Filesystem (Node)"}),"\n",(0,s.jsx)(n.li,{children:"RxStorage DenoKV"}),"\n",(0,s.jsx)(n.li,{children:"Attachment replication"}),"\n",(0,s.jsx)(n.li,{children:"CRDT Plugin"}),"\n",(0,s.jsx)(n.li,{children:"RxPipeline"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"you-can-help",children:"You can help!"}),"\n",(0,s.jsxs)(n.p,{children:["There are many things that can be done by ",(0,s.jsx)(n.strong,{children:"you"})," to improve RxDB:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Check the ",(0,s.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/blob/master/orga/BACKLOG.md",children:"BACKLOG"})," for features that would be great to have."]}),"\n",(0,s.jsxs)(n.li,{children:["Check the ",(0,s.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/blob/master/orga/before-next-major.md",children:"breaking backlog"})," for breaking changes that must be implemented in the future but where I did not have the time yet."]}),"\n",(0,s.jsxs)(n.li,{children:["Check the ",(0,s.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/search?q=todo",children:"todos"})," in the code. There are many small improvements that can be done for performance and build size."]}),"\n",(0,s.jsx)(n.li,{children:"Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors."}),"\n",(0,s.jsxs)(n.li,{children:["Update the ",(0,s.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples",children:"example projects"})," some of them are outdated and need updates."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"linkedin",children:"LinkedIn"}),"\n",(0,s.jsxs)(n.p,{children:["Stay connected with the latest updates and network with professionals in the RxDB community by following RxDB's ",(0,s.jsx)(n.a,{href:"https://www.linkedin.com/company/rxdb",children:"official LinkedIn page"}),"!"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453(e,n,i){i.d(n,{R:()=>l,x:()=>o});var r=i(6540);const s={},t=r.createContext(s);function l(e){const n=r.useContext(t);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),r.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/36715375.d4b64326.js b/docs/assets/js/36715375.d4b64326.js deleted file mode 100644 index 213ced1e5be..00000000000 --- a/docs/assets/js/36715375.d4b64326.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[2076],{2323(e,t,i){i.r(t),i.d(t,{default:()=>o});var s=i(4586),r=i(8711),c=i(6540),l=i(8141),d=i(4848);function o(){const{siteConfig:e}=(0,s.A)();return(0,c.useEffect)(()=>{(0,l.c)("goto_code",.4)}),(0,d.jsx)(r.A,{title:`Code - ${e.title}`,description:"RxDB Source Code",children:(0,d.jsx)("main",{children:(0,d.jsxs)("div",{className:"redirectBox",style:{textAlign:"center"},children:[(0,d.jsx)("a",{href:"/",children:(0,d.jsx)("div",{className:"logo",children:(0,d.jsx)("img",{src:"/files/logo/logo_text.svg",alt:"RxDB",width:160})})}),(0,d.jsx)("h1",{children:"RxDB Code"}),(0,d.jsx)("p",{children:(0,d.jsx)("b",{children:"You will be redirected in a few seconds."})}),(0,d.jsx)("p",{children:(0,d.jsx)("a",{href:"https://github.com/pubkey/rxdb",children:"Click here to open Code"})}),(0,d.jsx)("meta",{httpEquiv:"Refresh",content:"1; url=https://github.com/pubkey/rxdb"})]})})})}}}]); \ No newline at end of file diff --git a/docs/assets/js/37055470.55528f37.js b/docs/assets/js/37055470.55528f37.js deleted file mode 100644 index dc0f1ed882c..00000000000 --- a/docs/assets/js/37055470.55528f37.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[4970],{9528(a,e,t){t.r(e),t.d(e,{default:()=>l});var r=t(544),s=t(4848);function l(){return(0,r.default)({sem:{id:"reddit",metaTitle:"The local Database for Angular Apps",appName:"Angular",title:(0,s.jsxs)(s.Fragment,{children:["The easiest way to ",(0,s.jsx)("b",{children:"store"})," and ",(0,s.jsx)("b",{children:"sync"})," Data"]})}})}}}]); \ No newline at end of file diff --git a/docs/assets/js/380cc66a.7da5e510.js b/docs/assets/js/380cc66a.7da5e510.js deleted file mode 100644 index 69045977287..00000000000 --- a/docs/assets/js/380cc66a.7da5e510.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[2061],{12(e,s,r){r.r(s),r.d(s,{assets:()=>d,contentTitle:()=>t,default:()=>x,frontMatter:()=>l,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rx-storage-dexie","title":"RxDB Dexie.js Database - Fast, Reactive, Sync with Any Backend","description":"Use Dexie.js to power RxDB in the browser. Enjoy quick setup, Dexie addons, and reliable storage for small apps or prototypes.","source":"@site/docs/rx-storage-dexie.md","sourceDirName":".","slug":"/rx-storage-dexie.html","permalink":"/rx-storage-dexie.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB Dexie.js Database - Fast, Reactive, Sync with Any Backend","slug":"rx-storage-dexie.html","description":"Use Dexie.js to power RxDB in the browser. Enjoy quick setup, Dexie addons, and reliable storage for small apps or prototypes."},"sidebar":"tutorialSidebar","previous":{"title":"SQLite (Capacitor, React-Native, Expo, Tauri, Electron, Node.js)","permalink":"/rx-storage-sqlite.html"},"next":{"title":"MongoDB","permalink":"/rx-storage-mongodb.html"}}');var i=r(4848),o=r(8453),a=r(3247);const l={title:"RxDB Dexie.js Database - Fast, Reactive, Sync with Any Backend",slug:"rx-storage-dexie.html",description:"Use Dexie.js to power RxDB in the browser. Enjoy quick setup, Dexie addons, and reliable storage for small apps or prototypes."},t="RxStorage Dexie.js",d={},c=[{value:"Dexie.js vs IndexedDB Storage",id:"dexiejs-vs-indexeddb-storage",level:2},{value:"How to use Dexie.js as a Storage for RxDB",id:"how-to-use-dexiejs-as-a-storage-for-rxdb",level:2},{value:"Import the Dexie Storage",id:"import-the-dexie-storage",level:3},{value:"Create a Database",id:"create-a-database",level:3},{value:"Overwrite/Polyfill the native IndexedDB API with an in-memory version",id:"overwritepolyfill-the-native-indexeddb-api-with-an-in-memory-version",level:2},{value:"Using Dexie Addons",id:"using-dexie-addons",level:2},{value:"Sync Dexie.js with your Backend in RxDB",id:"sync-dexiejs-with-your-backend-in-rxdb",level:2},{value:"A. Use Dexie Cloud Sync",id:"a-use-dexie-cloud-sync",level:3},{value:"Install the Dexie Cloud Addon",id:"install-the-dexie-cloud-addon",level:4},{value:"Import RxDB and dexie-cloud",id:"import-rxdb-and-dexie-cloud",level:4},{value:"Create a Dexie based RxStorage with the Cloud Plugin",id:"create-a-dexie-based-rxstorage-with-the-cloud-plugin",level:4},{value:"Create an RxDB Database",id:"create-an-rxdb-database",level:4},{value:"B. Use the RxDB Replication",id:"b-use-the-rxdb-replication",level:3},{value:"Import the RxDB with dexie and the CouchDB plugin",id:"import-the-rxdb-with-dexie-and-the-couchdb-plugin",level:4},{value:"Create an RxDB Database with the Dexie Storage",id:"create-an-rxdb-database-with-the-dexie-storage",level:4},{value:"Add a Collection",id:"add-a-collection",level:4},{value:"Sync the Collection with a CouchDB Server",id:"sync-the-collection-with-a-couchdb-server",level:4},{value:"liveQuery - Realtime Queries",id:"livequery---realtime-queries",level:2},{value:"Disabling the non-premium console log",id:"disabling-the-non-premium-console-log",level:2},{value:"Performance comparison with other RxStorage plugins",id:"performance-comparison-with-other-rxstorage-plugins",level:2}];function h(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"rxstorage-dexiejs",children:"RxStorage Dexie.js"})}),"\n",(0,i.jsxs)(s.p,{children:["To store the data inside of and RxDB Database in IndexedDB in the ",(0,i.jsx)(s.a,{href:"/articles/browser-database.html",children:"browser"}),", you can use the ",(0,i.jsx)(s.a,{href:"https://github.com/dexie/Dexie.js",children:"Dexie.js"})," based ",(0,i.jsx)(s.a,{href:"/rx-storage.html",children:"RxStorage"}),". Dexie.js is a minimal wrapper around IndexedDB and the Dexie.js RxStorage wraps that again to use it for an RxDB database in the browser. For side projects and prototypes that run in a browser, you should use the dexie RxStorage as a default."]}),"\n",(0,i.jsx)(s.h2,{id:"dexiejs-vs-indexeddb-storage",children:"Dexie.js vs IndexedDB Storage"}),"\n",(0,i.jsxs)(s.p,{children:["While Dexie.js ",(0,i.jsx)(s.a,{href:"/rx-storage.html",children:"RxStorage"})," can be used for free, most professional projects should switch to our ",(0,i.jsxs)(s.strong,{children:["premium ",(0,i.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB RxStorage"})," \ud83d\udc51"]})," in production:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["It is faster and reduces build size by up to ",(0,i.jsx)(s.strong,{children:"36%"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["It has a way ",(0,i.jsx)(s.a,{href:"/rx-storage-performance.html",children:"better performance"})," on reads and writes."]}),"\n",(0,i.jsx)(s.li,{children:"It stores attachments data as binary instead of base64 which reduces used space by 33%."}),"\n",(0,i.jsxs)(s.li,{children:["It does not use a ",(0,i.jsx)(s.a,{href:"/slow-indexeddb.html#batched-cursor",children:"Batched Cursor"})," or ",(0,i.jsx)(s.a,{href:"/slow-indexeddb.html#custom-indexes",children:"custom indexes"})," which makes queries slower compared to the ",(0,i.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB RxStorage"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["It supports ",(0,i.jsx)(s.strong,{children:"non-required indexes"})," which is ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/pull/6643#issuecomment-2505310082",children:"not possible"})," with Dexie.js."]}),"\n",(0,i.jsxs)(s.li,{children:["It runs in a ",(0,i.jsx)(s.strong,{children:"WAL-like mode"})," (similar to SQLite) for faster writes and improved responsiveness."]}),"\n",(0,i.jsxs)(s.li,{children:["It support the ",(0,i.jsx)(s.a,{href:"/rx-storage-indexeddb.html#storage-buckets",children:"Storage Buckets API"})]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"how-to-use-dexiejs-as-a-storage-for-rxdb",children:"How to use Dexie.js as a Storage for RxDB"}),"\n",(0,i.jsxs)(a.g,{children:[(0,i.jsx)(s.h3,{id:"import-the-dexie-storage",children:"Import the Dexie Storage"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageDexie } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-dexie'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]})]})})}),(0,i.jsx)(s.h3,{id:"create-a-database",children:"Create a Database"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageDexie"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})})]}),"\n",(0,i.jsx)(s.h2,{id:"overwritepolyfill-the-native-indexeddb-api-with-an-in-memory-version",children:"Overwrite/Polyfill the native IndexedDB API with an in-memory version"}),"\n",(0,i.jsxs)(s.p,{children:["Node.js has no IndexedDB API. To still run the Dexie ",(0,i.jsx)(s.code,{children:"RxStorage"})," in Node.js, for example to run unit tests, you have to polyfill it.\nYou can do that by using the ",(0,i.jsx)(s.a,{href:"https://github.com/dumbmatter/fakeIndexedDB",children:"fake-indexeddb"})," module and pass it to the ",(0,i.jsx)(s.code,{children:"getRxStorageDexie()"})," function."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageDexie } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-dexie'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"//> npm install fake-indexeddb --save"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" fakeIndexedDB"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'fake-indexeddb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" fakeIDBKeyRange"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'fake-indexeddb/lib/FDBKeyRange'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageDexie"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" indexedDB"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" fakeIndexedDB"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" IDBKeyRange"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" fakeIDBKeyRange"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "})]})})}),"\n",(0,i.jsx)(s.h2,{id:"using-dexie-addons",children:"Using Dexie Addons"}),"\n",(0,i.jsxs)(s.p,{children:["Dexie.js has its own plugin system with ",(0,i.jsx)(s.a,{href:"https://dexie.org/docs/DerivedWork#known-addons",children:"many plugins"})," for encryption, replication or other use cases. With the Dexie.js ",(0,i.jsx)(s.code,{children:"RxStorage"})," you can use the same plugins by passing them to the ",(0,i.jsx)(s.code,{children:"getRxStorageDexie()"})," function."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageDexie"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" addons"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" [ "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/* Your Dexie.js plugins */"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.h2,{id:"sync-dexiejs-with-your-backend-in-rxdb",children:"Sync Dexie.js with your Backend in RxDB"}),"\n",(0,i.jsx)(s.p,{children:"Having your local data in sync with a remote backend is a key feature of RxDB. Here are two approaches to achieve this when using the Dexie.js RxStorage:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Dexie Cloud"})," provides a ",(0,i.jsx)(s.strong,{children:"managed solution"}),": For quick setups, letting you rely on its Cloud backend and conflict resolution."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/replication.html",children:"RxDB's replication"}),": Offers ",(0,i.jsx)(s.strong,{children:"full control"})," over your backend, data flow, and ",(0,i.jsx)(s.a,{href:"/transactions-conflicts-revisions.html",children:"conflict handling"}),"."]}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"Choose the approach that best suits your needs - whether you want to get started quickly with Dexie Cloud or require the adaptability and autonomy of RxDB's native replication."}),"\n",(0,i.jsx)(s.h3,{id:"a-use-dexie-cloud-sync",children:"A. Use Dexie Cloud Sync"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Dexie Cloud"})," is an official SaaS solution provided by the Dexie team. It offers automatic synchronization, user management, and conflict resolution out of the box. The primary benefits are:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Automatic Sync"}),": Dexie Cloud keeps your local IndexedDB in sync with its cloud-based backend."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"User Authentication"}),": Built-in user management (auth, roles, permissions)."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Conflict Resolution"}),": Automated resolution logic on the server side."]}),"\n"]}),"\n",(0,i.jsxs)(a.g,{children:[(0,i.jsx)(s.h4,{id:"install-the-dexie-cloud-addon",children:"Install the Dexie Cloud Addon"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" dexie-cloud-addon"})]})})})}),(0,i.jsx)(s.h4,{id:"import-rxdb-and-dexie-cloud",children:"Import RxDB and dexie-cloud"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageDexie } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-dexie'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" dexieCloud "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'dexie-cloud-addon'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]})]})})}),(0,i.jsx)(s.h4,{id:"create-a-dexie-based-rxstorage-with-the-cloud-plugin",children:"Create a Dexie based RxStorage with the Cloud Plugin"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageDexie"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" addons"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" [dexieCloud]"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /*"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * Whenever a new dexie database instance is created,"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * this method will be called."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" onCreate"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(dexieDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" dexieDatabaseName) {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" dexieDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"cloud"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".configure"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" databaseUrl"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "https://.dexie.cloud"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" requireAuth"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // optional"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(s.h4,{id:"create-an-rxdb-database",children:"Create an RxDB Database"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})})]}),"\n",(0,i.jsx)(s.h3,{id:"b-use-the-rxdb-replication",children:"B. Use the RxDB Replication"}),"\n",(0,i.jsxs)(s.p,{children:["For ",(0,i.jsx)(s.strong,{children:"full flexibility"})," over your backend or conflict resolution strategy, you can use one of ",(0,i.jsx)(s.strong,{children:"RxDB's many replication plugins"})," like"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/replication-couchdb.html",children:"CouchDB Replication"})," Plugin: Replicate with a CouchDB Server"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/replication-graphql.html",children:"GraphQL Replication"})," Plugin: Sync data with any GraphQL endpoint. Useful when you have a custom schema or you want to utilize GraphQL's powerful query features."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/replication-http.html",children:"Custom Replication with REST APIs"}),": Implement your own replication by building a pull/push handler that communicates with any RESTful backend."]}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"Below is an example of replicating an RxDB collection with a CouchDB backend using RxDB's CouchDB replication plugin:"}),"\n",(0,i.jsxs)(a.g,{children:[(0,i.jsx)(s.h4,{id:"import-the-rxdb-with-dexie-and-the-couchdb-plugin",children:"Import the RxDB with dexie and the CouchDB plugin"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { replicateCouchDB } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication-couchdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageDexie } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-dexie'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]})]})})}),(0,i.jsx)(s.h4,{id:"create-an-rxdb-database-with-the-dexie-storage",children:"Create an RxDB Database with the Dexie Storage"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageDexie"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(s.h4,{id:"add-a-collection",children:"Add a Collection"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" humans"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'number'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'name'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(s.h4,{id:"sync-the-collection-with-a-couchdb-server",children:"Sync the Collection with a CouchDB Server"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" replicateCouchDB"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" replicationIdentifier"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-couchdb-replication'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".humans"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // The URL to your CouchDB endpoint"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" url"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'http://example.com/db/humans'"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})})]}),"\n",(0,i.jsx)(s.h2,{id:"livequery---realtime-queries",children:"liveQuery - Realtime Queries"}),"\n",(0,i.jsxs)(s.p,{children:["Dexie.js offers a feature called ",(0,i.jsx)(s.code,{children:"liveQuery"})," which automatically updates query results as data changes, allowing you to react to these changes in real-time. However, because RxDB intrinsically provides ",(0,i.jsx)(s.a,{href:"/rx-query.html#observe",children:"reactive queries"}),", you typically do ",(0,i.jsx)(s.strong,{children:"not"})," need to enable live queries through Dexie. Once you have created your database and collections with RxDB, any query you perform can be observed by subscribing to it, for example via ",(0,i.jsx)(s.code,{children:"collection.find().$.subscribe(results => { /*... */ })"}),". This means RxDB takes care of listening for changes and automatically emitting new results - ensuring your UI stays in sync with the underlying data without requiring extra plugins or manual polling."]}),"\n",(0,i.jsx)(s.h2,{id:"disabling-the-non-premium-console-log",children:"Disabling the non-premium console log"}),"\n",(0,i.jsxs)(s.p,{children:["We want to be transparent with our community, and you'll notice a console message when using the free Dexie.js based RxStorage implementation. This message serves to inform you about the availability of faster storage solutions within our ",(0,i.jsx)(s.a,{href:"/premium/",children:"\ud83d\udc51 Premium Plugins"}),". We understand that this might be a minor inconvenience, and we sincerely apologize for that. However, maintaining and improving RxDB requires substantial resources, and our premium users help us ensure its sustainability. If you find value in RxDB and wish to remove this message, we encourage you to explore our premium storage options, which are optimized for professional use and production environments. Thank you for your understanding and support."]}),"\n",(0,i.jsxs)(s.p,{children:["If you already have premium access and want to use the Dexie.js ",(0,i.jsx)(s.a,{href:"/rx-storage.html",children:"RxStorage"})," without the log, you can call the ",(0,i.jsx)(s.code,{children:"setPremiumFlag()"})," function to disable the log."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { setPremiumFlag } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/shared'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"setPremiumFlag"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),"\n",(0,i.jsx)(s.h2,{id:"performance-comparison-with-other-rxstorage-plugins",children:"Performance comparison with other RxStorage plugins"}),"\n",(0,i.jsx)(s.p,{children:"The performance of the Dexie.js RxStorage is good enough for most use cases but other storages can have way better performance metrics:"}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"./files/rx-storage-performance-browser.png",alt:"RxStorage performance - browser Dexie.js",width:"700"})})]})}function x(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},3247(e,s,r){r.d(s,{g:()=>i});var n=r(4848);function i(e){const s=[];let r=null;return e.children.forEach(e=>{e.props.id?(r&&s.push(r),r={headline:e,paragraphs:[]}):r&&r.paragraphs.push(e)}),r&&s.push(r),(0,n.jsx)("div",{style:o.stepsContainer,children:s.map((e,s)=>(0,n.jsxs)("div",{style:o.stepWrapper,children:[(0,n.jsxs)("div",{style:o.stepIndicator,children:[(0,n.jsx)("div",{style:o.stepNumber,children:s+1}),(0,n.jsx)("div",{style:o.verticalLine})]}),(0,n.jsxs)("div",{style:o.stepContent,children:[(0,n.jsx)("div",{children:e.headline}),e.paragraphs.map((e,s)=>(0,n.jsx)("div",{style:o.item,children:e},s))]})]},s))})}const o={stepsContainer:{display:"flex",flexDirection:"column"},stepWrapper:{display:"flex",alignItems:"stretch",marginBottom:"1.5rem",position:"relative",minWidth:0},stepIndicator:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",width:"33px",marginRight:"1rem",minWidth:0},stepNumber:{width:"33px",height:"33px",borderRadius:"50%",backgroundColor:"var(--color-top)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:"bold",marginTop:-4},verticalLine:{position:"absolute",top:29,bottom:"0",left:"50%",width:"1px",background:"linear-gradient(to bottom, var(--color-top) 0%, var(--color-top) 80%, rgba(0,0,0,0) 100%)",transform:"translateX(-50%)"},stepContent:{flex:1,minWidth:0,overflowWrap:"break-word"},item:{marginTop:"0.5rem"}}},8453(e,s,r){r.d(s,{R:()=>a,x:()=>l});var n=r(6540);const i={},o=n.createContext(i);function a(e){const s=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/38a45a95.a7eb0903.js b/docs/assets/js/38a45a95.a7eb0903.js deleted file mode 100644 index 05a0ca5e5e2..00000000000 --- a/docs/assets/js/38a45a95.a7eb0903.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[405],{4806(e,a,t){t.r(a),t.d(a,{default:()=>n});var s=t(544),l=t(4848);function n(){return(0,s.default)({sem:{id:"gads",title:(0,l.jsxs)(l.Fragment,{children:["The easiest way to ",(0,l.jsx)("b",{children:"store"})," and ",(0,l.jsx)("b",{children:"sync"})," Data in Electron"]}),appName:"Electron",iconUrl:"/files/icons/electron.svg",metaTitle:"Local Electron Database"}})}}}]); \ No newline at end of file diff --git a/docs/assets/js/38bbf12a.62b38600.js b/docs/assets/js/38bbf12a.62b38600.js deleted file mode 100644 index d37ef992bce..00000000000 --- a/docs/assets/js/38bbf12a.62b38600.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[2078],{8251(e,a,i){i.r(a),i.d(a,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"articles/data-base","title":"Empower Web Apps with Reactive RxDB Data-base","description":"Explore RxDB\'s reactive data-base solution for web and mobile. Enable offline-first experiences, real-time syncing, and secure data handling with ease.","source":"@site/docs/articles/data-base.md","sourceDirName":"articles","slug":"/articles/data-base.html","permalink":"/articles/data-base.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Empower Web Apps with Reactive RxDB Data-base","slug":"data-base.html","description":"Explore RxDB\'s reactive data-base solution for web and mobile. Enable offline-first experiences, real-time syncing, and secure data handling with ease."},"sidebar":"tutorialSidebar","previous":{"title":"Browser Storage - RxDB as a Database for Browsers","permalink":"/articles/browser-storage.html"},"next":{"title":"Embedded Database, Real-time Speed - RxDB","permalink":"/articles/embedded-database.html"}}');var t=i(4848),s=i(8453);const r={title:"Empower Web Apps with Reactive RxDB Data-base",slug:"data-base.html",description:"Explore RxDB's reactive data-base solution for web and mobile. Enable offline-first experiences, real-time syncing, and secure data handling with ease."},o="RxDB as a data base: Empowering Web Applications with Reactive Data Handling",l={},c=[{value:"Overview of Web Applications that can benefit from RxDB",id:"overview-of-web-applications-that-can-benefit-from-rxdb",level:2},{value:"Importance of data bases in Mobile Applications",id:"importance-of-data-bases-in-mobile-applications",level:2},{value:"Introducing RxDB as a data base Solution",id:"introducing-rxdb-as-a-data-base-solution",level:2},{value:"Getting Started with RxDB",id:"getting-started-with-rxdb",level:2},{value:"What is RxDB?",id:"what-is-rxdb",level:3},{value:"Reactive Data Handling",id:"reactive-data-handling",level:3},{value:"Offline-First Approach",id:"offline-first-approach",level:3},{value:"Data Replication",id:"data-replication",level:3},{value:"Observable Queries",id:"observable-queries",level:3},{value:"Multi-Tab support",id:"multi-tab-support",level:3},{value:"RxDB vs. Other data base Options",id:"rxdb-vs-other-data-base-options",level:3},{value:"Different RxStorage layers for RxDB",id:"different-rxstorage-layers-for-rxdb",level:3},{value:"Synchronizing Data with RxDB between Clients and Servers",id:"synchronizing-data-with-rxdb-between-clients-and-servers",level:2},{value:"Offline-First Approach",id:"offline-first-approach-1",level:3},{value:"RxDB Replication Plugins",id:"rxdb-replication-plugins",level:3},{value:"Advanced RxDB Features and Techniques",id:"advanced-rxdb-features-and-techniques",level:3},{value:"Encryption of Local Data",id:"encryption-of-local-data",level:3},{value:"Change Streams and Event Handling",id:"change-streams-and-event-handling",level:3},{value:"JSON Key Compression",id:"json-key-compression",level:3},{value:"Conclusion",id:"conclusion",level:2}];function d(e){const a={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(a.header,{children:(0,t.jsx)(a.h1,{id:"rxdb-as-a-data-base-empowering-web-applications-with-reactive-data-handling",children:"RxDB as a data base: Empowering Web Applications with Reactive Data Handling"})}),"\n",(0,t.jsx)(a.p,{children:"In the world of web applications, efficient data management plays a crucial role in delivering a seamless user experience. As mobile applications continue to dominate the digital landscape, the importance of robust data bases becomes evident. In this article, we will explore RxDB as a powerful data base solution for web applications. We will delve into its features, advantages, and advanced techniques, highlighting its ability to handle reactive data and enable an offline-first approach."}),"\n",(0,t.jsx)("center",{children:(0,t.jsx)("a",{href:"https://rxdb.info/",children:(0,t.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"Data Base",width:"240"})})}),"\n",(0,t.jsx)(a.h2,{id:"overview-of-web-applications-that-can-benefit-from-rxdb",children:"Overview of Web Applications that can benefit from RxDB"}),"\n",(0,t.jsx)(a.p,{children:"Before diving into the specifics of RxDB, let's take a moment to understand the scope of web applications that can leverage its capabilities. Any web application that requires real-time data updates, offline functionality, and synchronization between clients and servers can greatly benefit from RxDB. Whether it's a collaborative document editing tool, a task management app, or a chat application, RxDB offers a robust foundation for building these types of applications."}),"\n",(0,t.jsx)(a.h2,{id:"importance-of-data-bases-in-mobile-applications",children:"Importance of data bases in Mobile Applications"}),"\n",(0,t.jsx)(a.p,{children:"Mobile applications have become an integral part of our lives, providing us with instant access to information and services. Behind the scenes, data bases play a pivotal role in storing and managing the data that powers these applications. data bases enable efficient data retrieval, updates, and synchronization, ensuring a smooth user experience even in challenging network conditions."}),"\n",(0,t.jsx)(a.h2,{id:"introducing-rxdb-as-a-data-base-solution",children:"Introducing RxDB as a data base Solution"}),"\n",(0,t.jsx)(a.p,{children:"RxDB, short for Reactive data base, is a client-side data base solution designed specifically for web and mobile applications. Built on the principles of reactive programming, RxDB brings the power of observables and event-driven architecture to data management. With RxDB, developers can create applications that are responsive, offline-ready, and capable of seamless data synchronization between clients and servers."}),"\n",(0,t.jsx)(a.h2,{id:"getting-started-with-rxdb",children:"Getting Started with RxDB"}),"\n",(0,t.jsx)(a.h3,{id:"what-is-rxdb",children:"What is RxDB?"}),"\n",(0,t.jsx)(a.p,{children:"RxDB is an open-source JavaScript data base that leverages reactive programming and provides a seamless API for handling data. It is built on top of existing popular data base technologies, such as IndexedDB, and adds a layer of reactive features to enable real-time data updates and synchronization."}),"\n",(0,t.jsx)(a.h3,{id:"reactive-data-handling",children:"Reactive Data Handling"}),"\n",(0,t.jsx)(a.p,{children:"One of the standout features of RxDB is its reactive data handling. It utilizes observables to provide a stream of data that automatically updates whenever a change occurs. This reactive approach allows developers to build applications that respond instantly to data changes, ensuring a highly interactive and real-time user experience."}),"\n",(0,t.jsx)(a.h3,{id:"offline-first-approach",children:"Offline-First Approach"}),"\n",(0,t.jsx)(a.p,{children:"RxDB embraces an offline-first approach, enabling applications to work seamlessly even when there is no internet connectivity. It achieves this by caching data locally on the client-side and synchronizing it with the server when the connection is available. This ensures that users can continue working with the application and have their data automatically synchronized when they come back online."}),"\n",(0,t.jsx)(a.h3,{id:"data-replication",children:"Data Replication"}),"\n",(0,t.jsx)(a.p,{children:"RxDB simplifies the process of data replication between clients and servers. It provides replication plugins that handle the synchronization of data in real-time. These plugins allow applications to keep data consistent across multiple clients, enabling collaborative features and ensuring that each client has the most up-to-date information."}),"\n",(0,t.jsx)(a.h3,{id:"observable-queries",children:"Observable Queries"}),"\n",(0,t.jsx)(a.p,{children:"RxDB introduces the concept of observable queries, which are powerful tools for efficiently querying data. With observable queries, developers can subscribe to specific data queries and receive automatic updates whenever the underlying data changes. This eliminates the need for manual polling and ensures that applications always have access to the latest data."}),"\n",(0,t.jsx)(a.h3,{id:"multi-tab-support",children:"Multi-Tab support"}),"\n",(0,t.jsxs)(a.p,{children:["RxDB offers multi-tab support, allowing applications to function seamlessly across multiple ",(0,t.jsx)(a.a,{href:"/articles/browser-database.html",children:"browser"})," tabs. This feature ensures that data changes in one tab are immediately reflected in all other open tabs, enabling a consistent user experience across different browser windows."]}),"\n",(0,t.jsx)(a.h3,{id:"rxdb-vs-other-data-base-options",children:"RxDB vs. Other data base Options"}),"\n",(0,t.jsxs)(a.p,{children:["When considering data base options for web applications, developers often encounter choices like IndexedDB, ",(0,t.jsx)(a.a,{href:"/rx-storage-opfs.html",children:"OPFS"}),", and Memory-based solutions. RxDB, while built on top of IndexedDB, stands out due to its reactive data handling capabilities and advanced synchronization features. Compared to other options, RxDB offers a more streamlined and powerful approach to managing data in web applications."]}),"\n",(0,t.jsx)(a.h3,{id:"different-rxstorage-layers-for-rxdb",children:"Different RxStorage layers for RxDB"}),"\n",(0,t.jsxs)(a.p,{children:["RxDB provides various ",(0,t.jsx)(a.a,{href:"/rx-storage.html",children:"storage layers"}),", known as RxStorage, that serve as interfaces to different underlying ",(0,t.jsx)(a.a,{href:"/articles/browser-storage.html",children:"storage"})," technologies. These layers include:"]}),"\n",(0,t.jsxs)(a.ul,{children:["\n",(0,t.jsxs)(a.li,{children:[(0,t.jsx)(a.a,{href:"/rx-storage-localstorage.html",children:"LocalStorage RxStorage"}),": Built on top of the browsers ",(0,t.jsx)(a.a,{href:"/articles/localstorage.html",children:"localStorage API"}),"."]}),"\n",(0,t.jsxs)(a.li,{children:[(0,t.jsx)(a.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB RxStorage"}),": This layer directly utilizes IndexedDB as its backend, providing a robust and widely supported storage option."]}),"\n",(0,t.jsxs)(a.li,{children:[(0,t.jsx)(a.a,{href:"/rx-storage-opfs.html",children:"OPFS RxStorage"}),": OPFS (Operational Transformation File System) is a file system-like storage layer that allows for efficient conflict resolution and real-time collaboration."]}),"\n",(0,t.jsx)(a.li,{children:"Memory RxStorage: Primarily used for testing and development, this storage layer keeps data in memory without persisting it to disk.\nEach RxStorage layer has its strengths and is suited for different scenarios, enabling developers to choose the most appropriate option for their specific use case."}),"\n"]}),"\n",(0,t.jsx)(a.h2,{id:"synchronizing-data-with-rxdb-between-clients-and-servers",children:"Synchronizing Data with RxDB between Clients and Servers"}),"\n",(0,t.jsx)(a.h3,{id:"offline-first-approach-1",children:"Offline-First Approach"}),"\n",(0,t.jsx)(a.p,{children:"As mentioned earlier, RxDB adopts an offline-first approach, allowing applications to function seamlessly in disconnected environments. By caching data locally, applications can continue to operate and make updates even without an internet connection. Once the connection is restored, RxDB's replication plugins take care of synchronizing the data with the server, ensuring consistency across all clients."}),"\n",(0,t.jsx)(a.h3,{id:"rxdb-replication-plugins",children:"RxDB Replication Plugins"}),"\n",(0,t.jsx)(a.p,{children:"RxDB provides a range of replication plugins that simplify the process of synchronizing data between clients and servers. These plugins enable real-time replication using various protocols, such as WebSocket or HTTP, and handle conflict resolution strategies to ensure data integrity. By leveraging these replication plugins, developers can easily implement robust and scalable synchronization capabilities in their applications."}),"\n",(0,t.jsx)(a.h3,{id:"advanced-rxdb-features-and-techniques",children:"Advanced RxDB Features and Techniques"}),"\n",(0,t.jsx)(a.p,{children:"Indexing and Performance Optimization\nTo achieve optimal performance, RxDB offers indexing capabilities. Indexing allows for efficient data retrieval and faster query execution. By strategically defining indexes on frequently accessed fields, developers can significantly enhance the overall performance of their RxDB-powered applications."}),"\n",(0,t.jsx)(a.h3,{id:"encryption-of-local-data",children:"Encryption of Local Data"}),"\n",(0,t.jsx)(a.p,{children:"In scenarios where data security is paramount, RxDB provides options for encrypting local data. By encrypting the data base contents, developers can ensure that sensitive information remains secure even if the underlying storage is compromised. RxDB integrates seamlessly with encryption libraries, making it easy to implement end-to-end encryption in applications."}),"\n",(0,t.jsx)(a.h3,{id:"change-streams-and-event-handling",children:"Change Streams and Event Handling"}),"\n",(0,t.jsx)(a.p,{children:"RxDB offers change streams and event handling mechanisms, enabling developers to react to data changes in real-time. With change streams, applications can listen to specific collections or documents and trigger custom logic whenever a change occurs. This capability opens up possibilities for building real-time collaboration features, notifications, or other reactive behaviors."}),"\n",(0,t.jsx)(a.h3,{id:"json-key-compression",children:"JSON Key Compression"}),"\n",(0,t.jsxs)(a.p,{children:["In scenarios where storage size is a concern, RxDB provides JSON ",(0,t.jsx)(a.a,{href:"/key-compression.html",children:"key compression"}),". By applying compression techniques to JSON keys, developers can significantly reduce the storage footprint of their data bases. This feature is particularly beneficial for applications dealing with large datasets or ",(0,t.jsx)(a.a,{href:"/articles/indexeddb-max-storage-limit.html",children:"limited storage capacities"}),"."]}),"\n",(0,t.jsx)(a.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,t.jsxs)(a.p,{children:["RxDB provides an exceptional data base solution for web and mobile applications, empowering developers to create reactive, offline-ready, and synchronized applications. With its reactive data handling, offline-first approach, and replication plugins, RxDB simplifies the challenges of building real-time applications with data synchronization requirements. By embracing advanced features like indexing, encryption, change streams, and JSON key compression, developers can optimize performance, enhance security, and reduce storage requirements. As web and ",(0,t.jsx)(a.a,{href:"/articles/mobile-database.html",children:"mobile applications"})," continue to evolve, RxDB proves to be a reliable and powerful"]}),"\n",(0,t.jsx)("center",{children:(0,t.jsx)("a",{href:"https://rxdb.info/",children:(0,t.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"Data Base",width:"240"})})})]})}function h(e={}){const{wrapper:a}={...(0,s.R)(),...e.components};return a?(0,t.jsx)(a,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453(e,a,i){i.d(a,{R:()=>r,x:()=>o});var n=i(6540);const t={},s=n.createContext(t);function r(e){const a=n.useContext(s);return n.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function o(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(s.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/393be207.9cd944e0.js b/docs/assets/js/393be207.9cd944e0.js deleted file mode 100644 index 28d4f385533..00000000000 --- a/docs/assets/js/393be207.9cd944e0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[4134],{591(e,n,t){t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>p,default:()=>l,frontMatter:()=>s,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"type":"mdx","permalink":"/markdown-page","source":"@site/src/pages/markdown-page.md","title":"Markdown page example","description":"You don\'t need React to write simple standalone pages.","frontMatter":{"title":"Markdown page example"},"unlisted":false}');var o=t(4848),r=t(8453);const s={title:"Markdown page example"},p="Markdown page example",c={},d=[];function i(e){const n={h1:"h1",header:"header",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"markdown-page-example",children:"Markdown page example"})}),"\n",(0,o.jsx)(n.p,{children:"You don't need React to write simple standalone pages."})]})}function l(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(i,{...e})}):i(e)}},8453(e,n,t){t.d(n,{R:()=>s,x:()=>p});var a=t(6540);const o={},r=a.createContext(o);function s(e){const n=a.useContext(r);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function p(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),a.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/39600c95.6a7491bc.js b/docs/assets/js/39600c95.6a7491bc.js deleted file mode 100644 index 1fa9f7307fa..00000000000 --- a/docs/assets/js/39600c95.6a7491bc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[3148],{8228(e,n,s){s.r(n),s.d(n,{assets:()=>t,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"rx-query","title":"RxQuery","description":"Master RxQuery in RxDB - find, update, remove documents using Mango syntax, chained queries, real-time observations, indexing, and more.","source":"@site/docs/rx-query.md","sourceDirName":".","slug":"/rx-query.html","permalink":"/rx-query.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxQuery","slug":"rx-query.html","description":"Master RxQuery in RxDB - find, update, remove documents using Mango syntax, chained queries, real-time observations, indexing, and more."},"sidebar":"tutorialSidebar","previous":{"title":"RxDocument","permalink":"/rx-document.html"},"next":{"title":"RxStorage Overview","permalink":"/rx-storage.html"}}');var o=s(4848),i=s(8453);const a={title:"RxQuery",slug:"rx-query.html",description:"Master RxQuery in RxDB - find, update, remove documents using Mango syntax, chained queries, real-time observations, indexing, and more."},l="RxQuery",t={},c=[{value:"find()",id:"find",level:2},{value:"findOne()",id:"findone",level:2},{value:"exec()",id:"exec",level:2},{value:"Observe $",id:"observe-",level:2},{value:"update()",id:"update",level:2},{value:"patch() / incrementalPatch()",id:"patch--incrementalpatch",level:2},{value:"modify() / incrementalModify()",id:"modify--incrementalmodify",level:2},{value:"remove() / incrementalRemove()",id:"remove--incrementalremove",level:2},{value:"doesDocumentDataMatch()",id:"doesdocumentdatamatch",level:2},{value:"Query Builder Plugin",id:"query-builder-plugin",level:2},{value:"Query Examples",id:"query-examples",level:2},{value:"Setting a specific index",id:"setting-a-specific-index",level:2},{value:"Count",id:"count",level:2},{value:"allowSlowCount",id:"allowslowcount",level:3},{value:"RxQuery's are immutable",id:"rxquerys-are-immutable",level:2},{value:"isRxQuery",id:"isrxquery",level:3},{value:"Design Decisions",id:"design-decisions",level:2},{value:"FAQ",id:"faq",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,i.R)(),...e.components},{Details:s}=n;return s||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"rxquery",children:"RxQuery"})}),"\n",(0,o.jsxs)(n.p,{children:["To find documents inside of an ",(0,o.jsx)(n.a,{href:"/rx-collection.html",children:"RxCollection"}),", RxDB uses the RxQuery interface that handles all query operations: it serves as the main interface for fetching documents, relies on a MongoDB-like ",(0,o.jsx)(n.a,{href:"https://github.com/cloudant/mango",children:"Mango Query Syntax"}),", and provides three types of queries: ",(0,o.jsx)(n.a,{href:"#find",children:"find()"}),", ",(0,o.jsx)(n.a,{href:"#findone",children:"findOne()"})," and ",(0,o.jsx)(n.a,{href:"#count",children:"count()"}),". By caching and de-duplicating results, RxQuery ensures efficient in-memory handling, and when queries are observed or re-run, the ",(0,o.jsx)(n.a,{href:"https://github.com/pubkey/event-reduce",children:"EventReduce algorithm"})," speeds up updates for a fast real-time experience and queries that run more than once."]}),"\n",(0,o.jsx)(n.h2,{id:"find",children:"find()"}),"\n",(0,o.jsxs)(n.p,{children:["To create a basic ",(0,o.jsx)(n.code,{children:"RxQuery"}),", call ",(0,o.jsx)(n.code,{children:".find()"})," on a collection and insert selectors. The result-set of normal queries is an array with documents."]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// find all that are older then 18"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myCollection"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" .find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 18"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})})]})})}),"\n",(0,o.jsx)(n.h2,{id:"findone",children:"findOne()"}),"\n",(0,o.jsxs)(n.p,{children:["A findOne-query has only a single ",(0,o.jsx)(n.code,{children:"RxDocument"})," or ",(0,o.jsx)(n.code,{children:"null"})," as result-set."]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// find alice"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myCollection"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" .findOne"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'alice'"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})})]})})}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// find the youngest one"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myCollection"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" .findOne"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" sort"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {age"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'asc'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})})]})})}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// find one document by the primary key"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'foobar'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})}),"\n",(0,o.jsx)(n.h2,{id:"exec",children:"exec()"}),"\n",(0,o.jsxs)(n.p,{children:["Returns a ",(0,o.jsx)(n.code,{children:"Promise"})," that resolves with the result-set of the query."]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" results"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(results); "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// > [RxDocument,RxDocument,RxDocument..]"})]})]})})}),"\n",(0,o.jsxs)(n.p,{children:["On ",(0,o.jsx)(n.code,{children:".findOne()"})," queries, you can call ",(0,o.jsx)(n.code,{children:".exec(true)"})," to ensure your document exists and to make TypeScript handling easier:"]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// docOrUndefined can be the type RxDocument or null which then has to be handled to be typesafe."})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" docOrUndefined"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// with .exec(true), it will throw if the document cannot be found and always have the type RxDocument"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"true"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})}),"\n",(0,o.jsx)(n.h2,{id:"observe-",children:"Observe $"}),"\n",(0,o.jsxs)(n.p,{children:["An ",(0,o.jsx)(n.code,{children:"BehaviorSubject"})," ",(0,o.jsx)(n.a,{href:"https://medium.com/@luukgruijs/understanding-rxjs-behaviorsubject-replaysubject-and-asyncsubject-8cc061f1cfc0",children:"see"})," that always has the current result-set as value.\nThis is extremely helpful when used together with UIs that should always show the same state as what is written in the database."]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" querySub"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"$"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(results "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'got results: '"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" results"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"length"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// > 'got results: 5' // BehaviorSubjects emit on subscription"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}); "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// insert one"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// > 'got results: 6' // $.subscribe() was called again with the new results"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// stop watching this query"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"querySub"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".unsubscribe"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]})]})})}),"\n",(0,o.jsx)(n.h2,{id:"update",children:"update()"}),"\n",(0,o.jsxs)(n.p,{children:["Runs an ",(0,o.jsx)(n.a,{href:"/rx-document.html#update",children:"update"})," on every RxDocument of the query-result."]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// to use the update() method, you need to add the update plugin."})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { RxDBUpdatePlugin } "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/update'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"addRxPlugin"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(RxDBUpdatePlugin);"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 18"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".update"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $inc"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 1"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // increases age of every found document by 1"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(n.h2,{id:"patch--incrementalpatch",children:"patch() / incrementalPatch()"}),"\n",(0,o.jsxs)(n.p,{children:["Runs the ",(0,o.jsx)(n.a,{href:"/rx-document.html#patch",children:"RxDocument.patch()"})," function on every RxDocument of the query result."]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 18"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".patch"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 12"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // set the age of every found to 12"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(n.h2,{id:"modify--incrementalmodify",children:"modify() / incrementalModify()"}),"\n",(0,o.jsxs)(n.p,{children:["Runs the ",(0,o.jsx)(n.a,{href:"/rx-document.html#modify",children:"RxDocument.modify()"})," function on every RxDocument of the query result."]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 18"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".modify"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"((docData) "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" docData"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".age "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" docData"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".age "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"+"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 1"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"; "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// increases age of every found document by 1"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" docData;"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(n.h2,{id:"remove--incrementalremove",children:"remove() / incrementalRemove()"}),"\n",(0,o.jsx)(n.p,{children:"Deletes all found documents. Returns a promise which resolves to the deleted documents."}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// All documents where the age is less than 18"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $lt"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 18"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// Remove the documents from the collection"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" removedDocs"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".remove"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),"\n",(0,o.jsx)(n.h2,{id:"doesdocumentdatamatch",children:"doesDocumentDataMatch()"}),"\n",(0,o.jsxs)(n.p,{children:["Returns ",(0,o.jsx)(n.code,{children:"true"})," if the given document data matches the query."]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" documentData"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foobar'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 19"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 18"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"})"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".doesDocumentDataMatch"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(documentData); "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// > true"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 20"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"})"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".doesDocumentDataMatch"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(documentData); "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// > false"})]})]})})}),"\n",(0,o.jsx)(n.h2,{id:"query-builder-plugin",children:"Query Builder Plugin"}),"\n",(0,o.jsxs)(n.p,{children:["To use chained query methods, you can also use the ",(0,o.jsx)(n.code,{children:"query-builder"})," plugin."]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// add the query builder plugin"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { addRxPlugin } "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { RxDBQueryBuilderPlugin } "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/query-builder'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"addRxPlugin"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(RxDBQueryBuilderPlugin);"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// now you can use chained query methods"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".where"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'age'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".gt"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"18"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" result"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),"\n",(0,o.jsx)(n.h2,{id:"query-examples",children:"Query Examples"}),"\n",(0,o.jsx)(n.p,{children:"Here some examples to fast learn how to write queries without reading the docs."}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"https://github.com/pouchdb/pouchdb/blob/master/packages/node_modules/pouchdb-find/README.md",children:"Pouch-find-docs"})," - learn how to use mango-queries"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"https://github.com/aheckmann/mquery/blob/master/README.md",children:"mquery-docs"})," - learn how to use chained-queries"]}),"\n"]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// directly pass search-object"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { $eq"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foo'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"})"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".then"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(documents "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(documents));"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/*"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * find by using sql equivalent '%like%' syntax"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * This example will fe: match 'foo' but also 'fifoo' or 'foofa' or 'fifoofa'"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Notice that in RxDB queries, a regex is represented as a $regex string with the $options parameter for flags."})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Using a RegExp instance is not allowed because they are not JSON.stringify()-able and also"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * RegExp instances are mutable which could cause undefined behavior when the RegExp is mutated"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * after the query was parsed."})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { $regex"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '.*foo.*'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"})"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".then"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(documents "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(documents));"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// find using a composite statement eg: $or"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// This example checks where name is either foo or if name is not existent on the document"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { $or"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" [ { name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { $eq"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foo'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" } }"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { $exists"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" } }] }"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"})"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".then"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(documents "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(documents));"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// do a case insensitive search"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// This example will match 'foo' or 'FOO' or 'FoO' etc..."})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { $regex"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '^foo$'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $options"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'i'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" } }"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"})"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".then"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(documents "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(documents));"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// chained queries"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".where"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'name'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".eq"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'foo'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".then"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(documents "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(documents));"})]})]})})}),"\n",(0,o.jsx)(n.admonition,{title:"RxDB will always append the primary key to the sort parameters",type:"note",children:(0,o.jsxs)(n.p,{children:["For several performance optimizations, like the ",(0,o.jsx)(n.a,{href:"https://github.com/pubkey/event-reduce",children:"EventReduce algorithm"}),", RxDB expects all queries to return a deterministic sort order that does not depend on the insert order of the documents. To ensure a deterministic ordering, RxDB will always append the primary key as last sort parameter to all queries and to all indexes.\nThis works in contrast to most other databases where a query without sorting would return the documents in the order in which they had been inserted to the database."]})}),"\n",(0,o.jsx)(n.h2,{id:"setting-a-specific-index",children:"Setting a specific index"}),"\n",(0,o.jsx)(n.p,{children:"By default, the query will be sent to the RxStorage, where a query planner will determine which one of the available indexes must be used.\nBut the query planner cannot know everything and sometimes will not pick the most optimal index.\nTo improve query performance, you can specify which index must be used, when running the query."}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myCollection"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" .findOne"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 18"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" gender"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $eq"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'm'"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Because the developer knows that 50% of the documents are 'male',"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * but only 20% are below age 18,"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * it makes sense to enforce using the ['gender', 'age'] index to improve performance."})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * This could not be known by the query planer which might have chosen ['age', 'gender'] instead."})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" index"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'gender'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'age'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})})]})})}),"\n",(0,o.jsx)(n.h2,{id:"count",children:"Count"}),"\n",(0,o.jsxs)(n.p,{children:["When you only need the amount of documents that match a query, but you do not need the document data itself, you can use a count query for ",(0,o.jsx)(n.strong,{children:"better performance"}),".\nThe performance difference compared to a normal query differs depending on which ",(0,o.jsx)(n.a,{href:"/rx-storage.html",children:"RxStorage"})," implementation is used."]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".count"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 18"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // 'limit' and 'skip' MUST NOT be set for count queries."})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// get the count result once"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" matchingAmount"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(); "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// > number"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// observe the result"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"$"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(amount "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Currently has '"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" amount "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"+"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" ' documents'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(n.admonition,{type:"note",children:(0,o.jsxs)(n.p,{children:["Count queries have a better performance than normal queries because they do not have to fetch the full document data out of the storage. Therefore it is ",(0,o.jsx)(n.strong,{children:"not"})," possible to run a ",(0,o.jsx)(n.code,{children:"count()"})," query with a selector that requires to fetch and compare the document data. So if your query selector ",(0,o.jsx)(n.strong,{children:"does not"})," fully match an index of the schema, it is not allowed to run it. These queries would have no performance benefit compared to normal queries but have the tradeoff of not using the fetched document data for caching."]})}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * The following will throw an error because"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * the count operation cannot run on any specific index range"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * because the $regex operator is used."})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".count"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $regex"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foobar'"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * The following will throw an error because"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * the count operation cannot run on any specific index range"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * because there is no ['age' ,'otherNumber'] index"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * defined in the schema."})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".count"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 20"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" otherNumber"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(n.p,{children:"If you want to count these kinds of queries, you should do a normal query instead and use the length of the result set as counter. This has the same performance as running a non-fully-indexed count which has to fetch all document data from the database and run a query matcher."}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// get count manually once"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" resultSet"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $regex"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foobar'"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"})"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" count"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" resultSet"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"length"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// observe count manually"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" count$"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $regex"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foobar'"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"})."}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"$"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".pipe"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" map"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(result "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" result"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"length"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * To allow non-fully-indexed count queries,"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * you can also specify that by setting allowSlowCount=true"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * when creating the database."})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" allowSlowCount"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // set this to true [default=false]"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(n.h3,{id:"allowslowcount",children:(0,o.jsx)(n.code,{children:"allowSlowCount"})}),"\n",(0,o.jsxs)(n.p,{children:["To allow non-fully-indexed count queries, you can also specify that by setting ",(0,o.jsx)(n.code,{children:"allowSlowCount: true"})," when creating the database.\nDoing this is mostly not wanted, because it would run the counting on the storage without having the document stored in the RxDB document cache.\nThis is only recommended if the RxStorage is running remotely like in a WebWorker and you not always want to send the document-data between the worker and the main thread. In this case you might only need the count-result instead to save performance."]}),"\n",(0,o.jsx)(n.h2,{id:"rxquerys-are-immutable",children:"RxQuery's are immutable"}),"\n",(0,o.jsxs)(n.p,{children:["Because RxDB is a reactive database, we can do heavy performance-optimisation on query-results which change over time. To be able to do this, RxQuery's have to be immutable.\nThis means, when you have a ",(0,o.jsx)(n.code,{children:"RxQuery"})," and run a ",(0,o.jsx)(n.code,{children:".where()"})," on it, the original RxQuery-Object is not changed. Instead the where-function returns a new ",(0,o.jsx)(n.code,{children:"RxQuery"}),"-Object with the changed where-field. Keep this in mind if you create RxQuery's and change them afterwards."]}),"\n",(0,o.jsx)(n.p,{children:"Example:"}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" queryObject"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".where"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'age'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".gt"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"18"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// Creates a new RxQuery object, does not modify previous one"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"queryObject"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".sort"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'name'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" results"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" queryObject"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(results); "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// result-documents are not sorted by name"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" queryObjectSort"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" queryObject"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".sort"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'name'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" results"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" queryObjectSort"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(results); "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// result-documents are now sorted"})]})]})})}),"\n",(0,o.jsx)(n.h3,{id:"isrxquery",children:"isRxQuery"}),"\n",(0,o.jsx)(n.p,{children:"Returns true if the given object is an instance of RxQuery. Returns false if not."}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsx)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" is"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" isRxQuery"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(myObj);"})]})})})}),"\n",(0,o.jsx)(n.h2,{id:"design-decisions",children:"Design Decisions"}),"\n",(0,o.jsxs)(n.p,{children:["Like most other noSQL-Databases, RxDB uses the ",(0,o.jsx)(n.a,{href:"https://github.com/cloudant/mango",children:"mango-query-syntax"})," similar to MongoDB and others."]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["We use the JSON based Mango Query Syntax because:","\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Mango Queries work better with TypeScript compared to SQL strings."}),"\n",(0,o.jsx)(n.li,{children:"Mango Queries are composable and easy to transform by code without joining SQL strings."}),"\n",(0,o.jsx)(n.li,{children:"Queries can be run very fast and efficient with only a minimal query planer to plan the best indexes and operations."}),"\n",(0,o.jsxs)(n.li,{children:["NoSQL queries can be optimized with the ",(0,o.jsx)(n.a,{href:"https://github.com/pubkey/event-reduce",children:"EventReduce"})," algorithm to improve performance of observed and cached queries."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"faq",children:"FAQ"}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:"Can I specify which document fields are returned by an RxDB query?"}),(0,o.jsx)("div",{children:(0,o.jsx)(n.p,{children:"No, RxDB does not support partial document retrieval. Because RxDB is a client-side database with limited memory, it caches and de-duplicates entire documents across multiple queries. Even if you only need a few fields, most storages must still fetch the entire JSON data, so subselecting fields would not significantly improve performance. Therefore, RxDB always returns full documents. If you only need certain fields, you can filter them out in your application code or consider storing just the necessary data in a separate collection."})})]}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:"Why doesn't RxDB support aggregations on queries?"}),(0,o.jsx)("div",{children:(0,o.jsx)(n.p,{children:"RxDB runs entirely on the client side. Any \"aggregation\" or data processing you might do within RxDB would still happen in the same JavaScript environment as your application code. Therefore, there's no real performance advantage or difference between doing the aggregation in RxDB vs. doing it in your own code after fetching the data. As a result, RxDB doesn't provide built-in aggregation methods. Instead, just query the documents you need and perform any calculations directly in your app's code."})})]}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:"Why does RxDB not support cross-collection queries?"}),(0,o.jsx)("div",{children:(0,o.jsx)(n.p,{children:"RxDB is a client-side database and does not provide built-in cross-collection queries or transactions. Instead, you can execute multiple queries in your JavaScript code and combine their results as needed. Because everything runs in the same environment, this approach offers the same performance you would get if cross-collection queries were built in - without the added complexity."})})]}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:"Why Doesn't RxDB Support Case-Insensitive Search?"}),(0,o.jsxs)("div",{children:[(0,o.jsxs)(n.p,{children:["RxDB relies on various storage engines as its backend, and these storage engines generally do not support case-insensitive search natively, like ",(0,o.jsx)(n.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB"})," or ",(0,o.jsx)(n.a,{href:"/rx-storage-foundationdb.html",children:"FoundationDB"}),". This limitation arises from the design of these engines, which prioritize efficiency and flexibility for specific types of queries rather than universal features like case-insensitivity. Although RxDB does not offer built-in support for case-insensitive search, there are two common workarounds:"]}),(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Store Data in a Meta-Field for Lowercase Search"}),": To enable case-insensitive search, you can store an additional field in your documents where the relevant text data is preprocessed and saved in lowercase."]}),"\n"]}),(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" document"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'John Doe'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" nameLowercase"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'john doe'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Meta-field"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(document);"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" nameLowercase"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { $eq"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'john doe'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Use a Regex Query"}),": Regular expressions can perform case-insensitive searches. For example:"]}),"\n"]}),(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { $regex"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '^john doe$'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $options"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'i'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" } "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// Case-insensitive regex"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,o.jsx)(n.p,{children:"However, this method has a significant downside: regex queries often cannot leverage indexes efficiently. As a result, they may be slower, especially for large datasets."})]})]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453(e,n,s){s.d(n,{R:()=>a,x:()=>l});var r=s(6540);const o={},i=r.createContext(o);function a(e){const n=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/3ebfb37f.f5f42f4c.js b/docs/assets/js/3ebfb37f.f5f42f4c.js deleted file mode 100644 index acc975ddb3c..00000000000 --- a/docs/assets/js/3ebfb37f.f5f42f4c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[205],{6700(a,e,s){s.r(e),s.d(e,{default:()=>r});var l=s(544),n=s(4848);function r(){return(0,l.default)({sem:{id:"gads",metaTitle:"The local Database for Angular Apps",appName:"Angular",title:(0,n.jsxs)(n.Fragment,{children:["The easiest way to ",(0,n.jsx)("b",{children:"store"})," and ",(0,n.jsx)("b",{children:"sync"})," Data in Angular"]}),iconUrl:"/files/icons/angular.svg"}})}}}]); \ No newline at end of file diff --git a/docs/assets/js/401008a8.cfd81712.js b/docs/assets/js/401008a8.cfd81712.js deleted file mode 100644 index ccc2415bc88..00000000000 --- a/docs/assets/js/401008a8.cfd81712.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[5219],{3156(e,s,r){r.r(s),r.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>i,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"nodejs-database","title":"RxDB - The Real-Time Database for Node.js","description":"Discover how RxDB brings flexible, reactive NoSQL to Node.js. Scale effortlessly, persist data, and power your server-side apps with ease.","source":"@site/docs/nodejs-database.md","sourceDirName":".","slug":"/nodejs-database.html","permalink":"/nodejs-database.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB - The Real-Time Database for Node.js","slug":"nodejs-database.html","description":"Discover how RxDB brings flexible, reactive NoSQL to Node.js. Scale effortlessly, persist data, and power your server-side apps with ease."},"sidebar":"tutorialSidebar","previous":{"title":"Downsides of Local First / Offline First","permalink":"/downsides-of-offline-first.html"},"next":{"title":"Local First / Offline First","permalink":"/offline-first.html"}}');var o=r(4848),a=r(8453);const i={title:"RxDB - The Real-Time Database for Node.js",slug:"nodejs-database.html",description:"Discover how RxDB brings flexible, reactive NoSQL to Node.js. Scale effortlessly, persist data, and power your server-side apps with ease."},t="Node.js Database",l={},d=[{value:"Persistent Database",id:"persistent-database",level:2},{value:"RxDB as Node.js In-Memory Database",id:"rxdb-as-nodejs-in-memory-database",level:2},{value:"Hybrid In-memory-persistence-synced storage",id:"hybrid-in-memory-persistence-synced-storage",level:2},{value:"Share database between microservices with RxDB",id:"share-database-between-microservices-with-rxdb",level:2},{value:"Follow up on RxDB+Node.js",id:"follow-up-on-rxdbnodejs",level:2}];function c(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"nodejs-database",children:"Node.js Database"})}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.a,{href:"https://rxdb.info",children:"RxDB"})," is a fast, reactive realtime NoSQL ",(0,o.jsx)(s.strong,{children:"database"})," made for ",(0,o.jsx)(s.strong,{children:"JavaScript"})," applications like Websites, hybrid Apps, ",(0,o.jsx)(s.a,{href:"/electron-database.html",children:"Electron-Apps"}),", Progressive Web Apps and ",(0,o.jsx)(s.strong,{children:"Node.js"}),". While RxDB was initially created to be used with UI applications, it has been matured and optimized to make it useful for pure server-side use cases. It can be used as embedded, local database inside of the Node.js JavaScript process, or it can be used similar to a database server that Node.js can connect to. The ",(0,o.jsx)(s.a,{href:"/rx-storage.html",children:"RxStorage"})," layer makes it possible to switch out the underlying storage engine which makes RxDB a very flexible database that can be optimized for many scenarios."]}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{src:"./files/icons/nodejs.svg",alt:"Node.js",width:"70"})}),"\n",(0,o.jsx)(s.h2,{id:"persistent-database",children:"Persistent Database"}),"\n",(0,o.jsxs)(s.p,{children:['To get a "normal" database connection where the data is persisted to a file system, the RxDB real time database provides multiple ',(0,o.jsx)(s.a,{href:"/rx-storage.html",children:"storage implementations"})," that work in Node.js."]}),"\n",(0,o.jsxs)(s.p,{children:["The ",(0,o.jsx)(s.a,{href:"/rx-storage-foundationdb.html",children:"FoundationDB"})," storage connects to a ",(0,o.jsx)(s.a,{href:"https://github.com/apple/foundationdb",children:"FoundationDB"})," cluster which itself is just a distributed key-value engine. RxDB adds the NoSQL query-engine, indexes and other features on top of it.\nIt scales horizontally because you can always add more servers to the FoundationDB cluster to increase the capacity.\nSetting up a RxDB database is pretty simple. You import the FoundationDB RxStorage and tell RxDB to use that when calling ",(0,o.jsx)(s.code,{children:"createRxDatabase"}),":"]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageFoundationDB } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-foundationdb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageFoundationDB"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" apiVersion"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 620"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" clusterFile"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '/path/to/fdb.cluster'"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// add a collection"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" users"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" mySchema"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// run a query"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" result"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"users"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foobar'"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"})"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "})]})})}),"\n",(0,o.jsxs)(s.p,{children:["Another alternative storage is the ",(0,o.jsx)(s.a,{href:"/rx-storage-sqlite.html",children:"SQLite RxStorage"})," that stores the data inside of a SQLite filebased database. The SQLite storage is faster than FoundationDB and does not require to set up a cluster or anything because SQLite directly stores and reads the data inside of the filesystem. The downside of that is that it only scales vertically."]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageSQLite"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getSQLiteBasicsNode"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-sqlite'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqlite3 "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'sqlite3'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'path/to/database/file/foobar.db'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSQLite"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqliteBasics"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getSQLiteBasicsNode"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(sqlite3)"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsxs)(s.p,{children:["Because the SQLite RxStorage is not free and you might not want to set up a FoundationDB cluster, there is also the option to use the ",(0,o.jsx)(s.a,{href:"/rx-storage-lokijs.html",children:"LokiJS RxStorage"})," together with the filesystem adapter. This will store the data as plain json in a file and load everything into memory on startup. This works great for small prototypes but it is not recommended to be used in production."]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" LokiFsStructuredAdapter"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'lokijs/src/loki-fs-structured-adapter.js'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLoki } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-lokijs'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqlite3 "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'sqlite3'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'path/to/database/file/foobar.db'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLoki"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" adapter"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" LokiFsStructuredAdapter"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(s.p,{children:"Here is a performance comparison chart of the different storages (lower is better):"}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{src:"./files/rx-storage-performance-node.png",alt:"database performance - Node.js",width:"700"})}),"\n",(0,o.jsx)(s.h2,{id:"rxdb-as-nodejs-in-memory-database",children:"RxDB as Node.js In-Memory Database"}),"\n",(0,o.jsxs)(s.p,{children:["One of the easiest way to use RxDB in Node.js is to use the ",(0,o.jsx)(s.a,{href:"/rx-storage-memory.html",children:"Memory RxStorage"}),". As the name implies, it stores the data directly ",(0,o.jsx)(s.strong,{children:"in-memory"})," of the Node.js JavaScript process. This makes it really fast to read and write data but of course the data is not persisted and will be lost when the nodejs process exits. Often the in-memory option is used when RxDB is used in unit tests because it automatically cleans up everything afterwards."]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageMemory } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-memory'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageMemory"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsxs)(s.p,{children:["Also notice that the ",(0,o.jsx)(s.a,{href:"https://medium.com/geekculture/node-js-default-memory-settings-3c0fe8a9ba1",children:"default memory limit"})," of Node.js is 4gb (might change of newer versions) so for bigger datasets you might want to increase the limit with the ",(0,o.jsx)(s.code,{children:"max-old-space-size"})," flag:"]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"# increase the Node.js memory limit to 8GB"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"node"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" --max-old-space-size=8192"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" index.js"})]})]})})}),"\n",(0,o.jsx)(s.h2,{id:"hybrid-in-memory-persistence-synced-storage",children:"Hybrid In-memory-persistence-synced storage"}),"\n",(0,o.jsxs)(s.p,{children:["If you want to have the performance of an ",(0,o.jsx)(s.strong,{children:"in-memory database"})," but require persistency of the data, you can use the ",(0,o.jsx)(s.a,{href:"/rx-storage-memory-mapped.html",children:"memory-mapped storage"}),". On database creation it will load all data into the memory and on writes it will first write the data into memory and later also write it to the persistent storage in the background. In the following example the FoundationDB storage is used, but any other RxStorage can be used as persistence layer."]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageFoundationDB } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-foundationdb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getMemoryMappedRxStorage } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-memory-mapped'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getMemoryMappedRxStorage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageFoundationDB"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" apiVersion"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 620"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" clusterFile"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '/path/to/fdb.cluster'"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(s.p,{children:"While this approach gives you a database with great performance and persistent, it has two major downsides:"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsx)(s.li,{children:"The database size is limited to the memory size"}),"\n",(0,o.jsx)(s.li,{children:"Writes can be lost when the Node.js process exists between a write to the memory state and the background persisting."}),"\n"]}),"\n",(0,o.jsx)(s.h2,{id:"share-database-between-microservices-with-rxdb",children:"Share database between microservices with RxDB"}),"\n",(0,o.jsxs)(s.p,{children:["Using a local, embedded database in Node.js works great until you have to share the data with another Node.js process or another server at all.\nTo share the database state with other instances, RxDB provides two different methods. One is ",(0,o.jsx)(s.a,{href:"/replication.html",children:"replication"})," and the other is the ",(0,o.jsx)(s.a,{href:"/rx-storage-remote.html",children:"remote RxStorage"}),'.\nThe replication copies over the whole database set to other instances live-replicates all ongoing writes. This has the benefit of scaling better because each of your microservice will run queries on its own copy of the dataset.\nSometimes however you might not want to store the full dataset on each microservice. Then it is better to use the remote RxStorage and connect it to the "main" database. The remote storage will run all operations the main database and return the result to the calling database.']}),"\n",(0,o.jsx)(s.h2,{id:"follow-up-on-rxdbnodejs",children:"Follow up on RxDB+Node.js"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:["Check out the ",(0,o.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/node",children:"RxDB Nodejs example"}),"."]}),"\n",(0,o.jsxs)(s.li,{children:["If you haven't done yet, you should start learning about RxDB with the ",(0,o.jsx)(s.a,{href:"/quickstart.html",children:"Quickstart Tutorial"}),"."]}),"\n",(0,o.jsxs)(s.li,{children:["I created ",(0,o.jsx)(s.a,{href:"/alternatives.html",children:"a list of embedded JavaSCript databases"})," that you will help you to pick a database if you do not want to use RxDB."]}),"\n",(0,o.jsxs)(s.li,{children:["Check out the ",(0,o.jsx)(s.a,{href:"/rx-storage-mongodb.html",children:"MongoDB RxStorage"})," that uses MongoDB for the database connection from your Node.js application and runs the RxDB real time database on top of it."]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},8453(e,s,r){r.d(s,{R:()=>i,x:()=>t});var n=r(6540);const o={},a=n.createContext(o);function i(e){const s=n.useContext(a);return n.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(o):e.components||o:i(e.components),n.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/40b6398a.86580fca.js b/docs/assets/js/40b6398a.86580fca.js deleted file mode 100644 index 020a8ae7b1f..00000000000 --- a/docs/assets/js/40b6398a.86580fca.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9594],{3247(e,s,n){n.d(s,{g:()=>i});var r=n(4848);function i(e){const s=[];let n=null;return e.children.forEach(e=>{e.props.id?(n&&s.push(n),n={headline:e,paragraphs:[]}):n&&n.paragraphs.push(e)}),n&&s.push(n),(0,r.jsx)("div",{style:o.stepsContainer,children:s.map((e,s)=>(0,r.jsxs)("div",{style:o.stepWrapper,children:[(0,r.jsxs)("div",{style:o.stepIndicator,children:[(0,r.jsx)("div",{style:o.stepNumber,children:s+1}),(0,r.jsx)("div",{style:o.verticalLine})]}),(0,r.jsxs)("div",{style:o.stepContent,children:[(0,r.jsx)("div",{children:e.headline}),e.paragraphs.map((e,s)=>(0,r.jsx)("div",{style:o.item,children:e},s))]})]},s))})}const o={stepsContainer:{display:"flex",flexDirection:"column"},stepWrapper:{display:"flex",alignItems:"stretch",marginBottom:"1.5rem",position:"relative",minWidth:0},stepIndicator:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",width:"33px",marginRight:"1rem",minWidth:0},stepNumber:{width:"33px",height:"33px",borderRadius:"50%",backgroundColor:"var(--color-top)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:"bold",marginTop:-4},verticalLine:{position:"absolute",top:29,bottom:"0",left:"50%",width:"1px",background:"linear-gradient(to bottom, var(--color-top) 0%, var(--color-top) 80%, rgba(0,0,0,0) 100%)",transform:"translateX(-50%)"},stepContent:{flex:1,minWidth:0,overflowWrap:"break-word"},item:{marginTop:"0.5rem"}}},6375(e,s,n){n.r(s),n.d(s,{assets:()=>p,contentTitle:()=>h,default:()=>j,frontMatter:()=>d,metadata:()=>r,toc:()=>x});const r=JSON.parse('{"id":"replication-supabase","title":"Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync","description":"Build real-time, offline-capable apps with RxDB + Supabase. Push/pull changes via PostgREST, stream updates with Realtime, and keep data in sync across devices.","source":"@site/docs/replication-supabase.md","sourceDirName":".","slug":"/replication-supabase.html","permalink":"/replication-supabase.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync","slug":"replication-supabase.html","description":"Build real-time, offline-capable apps with RxDB + Supabase. Push/pull changes via PostgREST, stream updates with Realtime, and keep data in sync across devices."},"sidebar":"tutorialSidebar","previous":{"title":"MongoDB Replication","permalink":"/replication-mongodb.html"},"next":{"title":"NATS Replication","permalink":"/replication-nats.html"}}');var i=n(4848),o=n(8453),a=n(2636),l=n(3247),t=n(2271),c=n(7482);const d={title:"Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync",slug:"replication-supabase.html",description:"Build real-time, offline-capable apps with RxDB + Supabase. Push/pull changes via PostgREST, stream updates with Realtime, and keep data in sync across devices."},h="Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync",p={},x=[{value:"Key Features of the RxDB-Supabase Plugin",id:"key-features-of-the-rxdb-supabase-plugin",level:2},{value:"Architecture Overview",id:"architecture-overview",level:2},{value:"Setting up RxDB \u2194 Supabase Sync",id:"setting-up-rxdb--supabase-sync",level:2},{value:"Install Dependencies",id:"install-dependencies",level:3},{value:"Create a Supabase Project & Table",id:"create-a-supabase-project--table",level:3},{value:"Create an RxDB Database & Collection",id:"create-an-rxdb-database--collection",level:3},{value:"Create the Supabase Client",id:"create-the-supabase-client",level:3},{value:"Production",id:"production",level:4},{value:"Vite",id:"vite",level:4},{value:"Local Development",id:"local-development",level:4},{value:"Start Replication",id:"start-replication",level:3},{value:"Do other things with the replication state",id:"do-other-things-with-the-replication-state",level:3},{value:"Follow Up",id:"follow-up",level:2}];function k(e){const s={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"supabase-replication-plugin-for-rxdb---real-time-offline-first-sync",children:"Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync"})}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"./files/icons/supabase.svg",alt:"Supabase",height:"60",className:"img-padding img-in-text-right"})}),"\n",(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.strong,{children:"Supabase Replication Plugin"})," for RxDB delivers seamless, two-way synchronization between your RxDB collections and a Supabase (Postgres) table. It uses ",(0,i.jsx)(s.strong,{children:"PostgREST"})," for pull/push and ",(0,i.jsx)(s.strong,{children:"Supabase Realtime"})," (logical replication) to stream live updates, so your data stays consistent across devices with first-class ",(0,i.jsx)(s.a,{href:"/articles/local-first-future.html",children:"local-first"}),", offline-ready support."]}),"\n",(0,i.jsxs)(s.p,{children:["Under the hood, the plugin is powered by the RxDB ",(0,i.jsx)(s.a,{href:"/replication.html",children:"Sync Engine"}),". It handles checkpointed incremental pulls, robust retry logic, and ",(0,i.jsx)(s.a,{href:"/transactions-conflicts-revisions.html",children:"conflict detection/resolution"})," for you. You focus on features\u2014RxDB takes care of sync."]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)(t.N,{videoId:"zBZgdTb-dns",title:"Supabase in 100 Seconds",duration:"2:36"})}),"\n",(0,i.jsx)(s.h2,{id:"key-features-of-the-rxdb-supabase-plugin",children:"Key Features of the RxDB-Supabase Plugin"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Cloud Only Backend"}),": No self-hosted server required. Client devices directly sync with the Supabase Servers."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Two-way replication"})," between Supabase tables and RxDB ",(0,i.jsx)(s.a,{href:"/rx-collection.html",children:"collections"})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Offline-first"})," with resumable, incremental sync"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Live updates"})," via Supabase Realtime channels"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Conflict resolution"})," handled by the ",(0,i.jsx)(s.a,{href:"/replication.html",children:"RxDB Sync Engine"})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Works in browsers and Node.js"})," with ",(0,i.jsx)(s.code,{children:"@supabase/supabase-js"})]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"architecture-overview",children:"Architecture Overview"}),"\n",(0,i.jsx)(c.u,{showServer:!1,dbIcon:"/files/icons/supabase.svg",dbLabel:"Supabase"}),"\n",(0,i.jsx)("br",{}),"\n",(0,i.jsxs)(s.p,{children:["Clients connect ",(0,i.jsx)(s.strong,{children:"directly to Supabase"})," using the official JS client. The plugin:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Pulls"})," documents over PostgREST using a checkpoint ",(0,i.jsx)(s.code,{children:"(modified, id)"})," and deterministic ordering."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Pushes"})," inserts/updates using optimistic concurrency guards."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Streams"})," new changes using Supabase Realtime so live replication stays up to date."]}),"\n"]}),"\n",(0,i.jsx)(s.admonition,{type:"note",children:(0,i.jsxs)(s.p,{children:["Because Supabase exposes Postgres over ",(0,i.jsx)(s.strong,{children:"HTTP/WebSocket"}),", you can safely replicate from browsers and mobile apps. Protect your data with ",(0,i.jsx)(s.strong,{children:"Row Level Security (RLS)"})," policies; use the ",(0,i.jsx)(s.strong,{children:"anon"})," key on clients and the ",(0,i.jsx)(s.strong,{children:"service role"})," key only on trusted servers."]})}),"\n",(0,i.jsx)(s.h2,{id:"setting-up-rxdb--supabase-sync",children:"Setting up RxDB \u2194 Supabase Sync"}),"\n",(0,i.jsxs)(l.g,{children:[(0,i.jsx)(s.h3,{id:"install-dependencies",children:"Install Dependencies"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" rxdb"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" @supabase/supabase-js"})]})})})}),(0,i.jsx)(s.h3,{id:"create-a-supabase-project--table",children:"Create a Supabase Project & Table"}),(0,i.jsx)(s.p,{children:"In your supabase project, create a new table. Ensure that:"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"The primary key must have the type text (Primary keys must always be strings in RxDB)"}),"\n",(0,i.jsxs)(s.li,{children:["You have an modified field which stores the last modification timestamp of a row (default is ",(0,i.jsx)(s.code,{children:"_modified"}),")"]}),"\n",(0,i.jsxs)(s.li,{children:['You have a boolean field which stores if a row should is "deleted". You should not hard-delete rows in Supabase, because clients would miss the deletion if they haven\'t been online at the deletion time. Instead, use a deleted ',(0,i.jsx)(s.code,{children:"boolean"})," to mark rows as deleted. This way all clients can still pull the deletion, and RxDB will hide the complexity on the client side."]}),"\n",(0,i.jsx)(s.li,{children:"Enable the realtime observation of writes to the table."}),"\n"]}),(0,i.jsx)(s.p,{children:'Here is an example for a "human" table:'}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"sql","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"sql","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"create"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" extension "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"if"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" not"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" exists"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" moddatetime "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" extensions;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"create"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" table"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:' "'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"public"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:'".'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"humans"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "passportId"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" text"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" primary key"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "firstName"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" text"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" not null"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "lastName"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" text"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" not null"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "age"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" integer"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "_deleted"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" boolean"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" DEFAULT"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" false "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"NOT NULL"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "_modified"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" timestamp with time zone"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" DEFAULT"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" now"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"() "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"NOT NULL"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"-- auto-update the _modified timestamp"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"CREATE"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" TRIGGER"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" update_modified_datetime"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" BEFORE"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" UPDATE"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ON"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" public.humans "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"FOR"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" EACH "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"ROW"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"EXECUTE"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" FUNCTION"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" extensions.moddatetime("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'_modified'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"-- add a table to the publication so we can subscribe to changes"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"alter"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" publication supabase_realtime "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"add"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" table"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "public"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"humans"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]})]})})}),(0,i.jsx)(s.h3,{id:"create-an-rxdb-database--collection",children:"Create an RxDB Database & Collection"}),(0,i.jsxs)(s.p,{children:["Create a normal RxDB database, then add a collection whose ",(0,i.jsx)(s.strong,{children:"schema mirrors your Supabase table"}),". The ",(0,i.jsx)(s.strong,{children:"primary key must match"})," (same column name and type), and fields should be ",(0,i.jsx)(s.strong,{children:"top-level simple types"})," (string/number/boolean). You don\u2019t need to model server internals: the plugin maps the server\u2019s _deleted flag to doc._deleted automatically, and _modified is optional in your schema (the plugin strips it on push and will include it on pull only if you define it). For browsers use a persistent storage like Localstorage or IndexedDB. For tests you can use the ",(0,i.jsx)(s.a,{href:"/rx-storage-memory.html",children:"in-memory storage"}),"."]}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// client"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" humans"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'passportId'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" passportId"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" firstName"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" lastName"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'number'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'passportId'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'firstName'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'lastName'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(s.h3,{id:"create-the-supabase-client",children:"Create the Supabase Client"}),(0,i.jsx)(s.p,{children:"Make a single Supabase client and reuse it across your app. In the browser, use the anon key (RLS-protected). On trusted servers you may use the service role key\u2014but never ship that to clients."}),(0,i.jsxs)(a.t,{children:[(0,i.jsx)(s.h4,{id:"production",children:"Production"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"//> client"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createClient } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '@supabase/supabase-js'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" supabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createClient"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'https://xyzcompany.supabase.co'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'eyJhbGciOi...'"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),(0,i.jsx)(s.h4,{id:"vite",children:"Vite"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"//> client"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createClient } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '@supabase/supabase-js'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" supabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createClient"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"meta"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"env"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"VITE_SUPABASE_URL"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // e.g. https://xyzcompany.supabase.co"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"meta"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"env"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"VITE_SUPABASE_ANON_KEY"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // anon key for browsers"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // optional options object here"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),(0,i.jsx)(s.h4,{id:"local-development",children:"Local Development"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"//> client"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createClient } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '@supabase/supabase-js'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" supabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createClient"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'http://127.0.0.1:54321'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})})]}),(0,i.jsx)(s.h3,{id:"start-replication",children:"Start Replication"}),(0,i.jsx)(s.p,{children:"Connect your RxDB collection to the Supabase table to start the replication."}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"//> client"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { replicateSupabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication-supabase'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" replication"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" replicateSupabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" tableName"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'humans'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" client"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" supabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".humans"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" replicationIdentifier"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'humans-supabase'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" live"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 50"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // optional: shape incoming docs"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" modifier"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (doc) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // map nullable age-field"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".age) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"delete"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".age;"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" doc;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // optional: customize the pull query before fetching"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" queryBuilder: ({ query }) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Add filters, joins, or other PostgREST query modifiers"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // This runs before checkpoint filtering and ordering"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".eq"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"status"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "active"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 50"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // optional overrides if your column names differ:"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // modifiedField: '_modified',"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // deletedField: '_deleted'"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// (optional) observe errors and wait for the first sync barrier"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"replication"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"error$"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(err "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".error"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'[replication]'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" err));"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" replication"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".awaitInitialReplication"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),(0,i.jsx)(s.admonition,{title:"Nullable values must be mapped",type:"note",children:(0,i.jsxs)(s.p,{children:["Supabase returns ",(0,i.jsx)(s.code,{children:"null"})," for nullable columns, but in RxDB you often model those fields as optional (i.e., they can be undefined/missing). To avoid schema errors, map ",(0,i.jsx)(s.code,{children:"null"})," \u2192 ",(0,i.jsx)(s.code,{children:"undefined"})," in the ",(0,i.jsx)(s.code,{children:"pull.modifier"})," (usually by deleting the key)."]})}),(0,i.jsx)(s.h3,{id:"do-other-things-with-the-replication-state",children:"Do other things with the replication state"}),(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.code,{children:"RxSupabaseReplicationState"})," which is returned from ",(0,i.jsx)(s.code,{children:"replicateSupabase()"})," allows you to run all functionality of the normal ",(0,i.jsx)(s.a,{href:"/replication.html",children:"RxReplicationState"}),"."]})]}),"\n",(0,i.jsx)(s.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Replication API Reference:"})," Learn the core concepts and lifecycle hooks \u2014 ",(0,i.jsx)(s.a,{href:"/replication.html",children:"Replication"})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Offline-First Guide:"})," Caching, retries, and conflict strategies \u2014 ",(0,i.jsx)(s.a,{href:"/articles/local-first-future.html",children:"Local-First"})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Supabase Essentials:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Row Level Security (RLS) \u2014 ",(0,i.jsx)(s.a,{href:"https://supabase.com/docs/guides/auth/row-level-security",children:"https://supabase.com/docs/guides/auth/row-level-security"})]}),"\n",(0,i.jsxs)(s.li,{children:["Realtime \u2014 ",(0,i.jsx)(s.a,{href:"https://supabase.com/docs/guides/realtime",children:"https://supabase.com/docs/guides/realtime"})]}),"\n",(0,i.jsxs)(s.li,{children:["Local dev with the Supabase CLI \u2014 ",(0,i.jsx)(s.a,{href:"https://supabase.com/docs/guides/cli",children:"https://supabase.com/docs/guides/cli"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Community:"})," Questions or feedback? Join our Discord \u2014 ",(0,i.jsx)(s.a,{href:"./chat",children:"Chat"})]}),"\n"]})]})}function j(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(k,{...e})}):k(e)}},7482(e,s,n){n.d(s,{u:()=>i});n(6540);var r=n(4848);function i({className:e="",style:s,clientLabels:n=["Client A","Client B","Client C"],serverLabel:i="RxServer",dbLabel:o="Backend",dbIcon:a="",showServer:l=!0}){const t="/files/logo/logo.svg",c=l?{}:{gridColumn:"2 / 5",width:"90%",marginLeft:"5%",marginRight:0};return(0,r.jsxs)("div",{className:`rxdb-diagram ${e}`,style:s,children:[(0,r.jsx)("style",{children:'\n .rxdb-diagram {\n padding-top: 20px;\n padding-bottom: 20px;\n box-sizing: border-box;\n color: inherit;\n width: 100%;\n max-width: 100%;\n overflow: hidden;\n margin: 0 auto;\n font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI",\n Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji";\n }\n\n /* Stage keeps fixed aspect ratio and scales */\n .rxdb-diagram .stage {\n width: 100%;\n aspect-ratio: 816 / 336;\n position: relative;\n }\n\n /* Grid fills the stage completely */\n .rxdb-diagram .grid {\n position: absolute;\n inset: 0;\n display: grid;\n grid-template-columns:\n 26.960784% 5.882353% 31.862745% 5.882353% 29.411765%;\n grid-template-rows:\n 23.809524% 14.285714% 23.809524% 14.285714% 23.809524%;\n align-items: center;\n justify-items: stretch;\n }\n\n .rxdb-diagram {\n --stroke: clamp(1px, 0.35vmin, 2px);\n --radius: clamp(8px, 1.2vmin, 14px);\n --pad: clamp(8px, 1.2vmin, 18px);\n --line: currentColor;\n }\n\n .rxdb-diagram .logo {\n height: 1.2em;\n width: auto;\n display: inline-block;\n object-fit: contain;\n margin-right: 10px;\n }\n\n .rxdb-diagram .box {\n border: var(--stroke) dashed var(--line);\n border-radius: var(--radius);\n background: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n font-weight: 600;\n padding: var(--pad);\n line-height: 1.2;\n user-select: none;\n }\n\n /* Server and DB take full height of stage */\n .rxdb-diagram .server,\n .rxdb-diagram .db {\n grid-row: 1 / -1;\n height: 100%;\n }\n\n /* Horizontal arrows */\n .rxdb-diagram .arrow {\n position: relative;\n height: 0;\n border-top: var(--stroke) solid var(--line);\n width: calc(100% - 20%);\n margin-left: 10%;\n margin-right: -1.5%;\n }\n\n .rxdb-diagram .arrow::before,\n .rxdb-diagram .arrow::after {\n content: "";\n position: absolute;\n top: 50%;\n width: clamp(6px, 1.2vmin, 10px);\n height: clamp(6px, 1.2vmin, 10px);\n border-top: var(--stroke) solid var(--line);\n border-right: var(--stroke) solid var(--line);\n transform-origin: center;\n }\n .rxdb-diagram .arrow::before {\n left: 0;\n transform: translate(-0%, -60%) rotate(-135deg);\n }\n .rxdb-diagram .arrow::after {\n right: 0;\n transform: translate(0%, -60%) rotate(45deg);\n }\n '}),(0,r.jsx)("div",{className:"stage","aria-label":l?"Clients to RxServer to MongoDB diagram":"Clients to MongoDB diagram",children:(0,r.jsxs)("div",{className:"grid",children:[(0,r.jsxs)("div",{className:"box",style:{gridColumn:1,gridRow:1},children:[(0,r.jsx)("img",{src:t,alt:"",className:"logo","aria-hidden":!0}),n[0]||"Client A"]}),(0,r.jsx)("div",{className:"arrow",style:{gridColumn:l?2:c.gridColumn,gridRow:1,...l?{}:{width:"90%",marginLeft:"5%",marginRight:0}},"aria-hidden":!0}),l&&(0,r.jsxs)("div",{className:"box server",style:{gridColumn:3},children:[(0,r.jsx)("img",{src:t,alt:"",className:"logo","aria-hidden":!0}),i]}),l&&(0,r.jsx)("div",{className:"arrow",style:{gridColumn:4,gridRow:3},"aria-hidden":!0}),(0,r.jsxs)("div",{className:"box db",style:{gridColumn:5},children:[(0,r.jsx)("img",{src:a,alt:"",className:"logo","aria-hidden":!0}),o]}),(0,r.jsxs)("div",{className:"box",style:{gridColumn:1,gridRow:3},children:[(0,r.jsx)("img",{src:t,alt:"",className:"logo","aria-hidden":!0}),n[1]||"Client B"]}),(0,r.jsx)("div",{className:"arrow",style:{gridColumn:l?2:c.gridColumn,gridRow:3,...l?{}:{width:"90%",marginLeft:"5%",marginRight:0}},"aria-hidden":!0}),(0,r.jsxs)("div",{className:"box",style:{gridColumn:1,gridRow:5},children:[(0,r.jsx)("img",{src:t,alt:"",className:"logo","aria-hidden":!0}),n[2]||"Client C"]}),(0,r.jsx)("div",{className:"arrow",style:{gridColumn:l?2:c.gridColumn,gridRow:5,...l?{}:{width:"90%",marginLeft:"5%",marginRight:0}},"aria-hidden":!0})]})})]})}},8453(e,s,n){n.d(s,{R:()=>a,x:()=>l});var r=n(6540);const i={},o=r.createContext(i);function a(e){const s=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/41f941a1.b03616ab.js b/docs/assets/js/41f941a1.b03616ab.js deleted file mode 100644 index 5d7c3f4a8e2..00000000000 --- a/docs/assets/js/41f941a1.b03616ab.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[5966],{2447(e,s,n){n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"leader-election","title":"Leader Election","description":"RxDB comes with a leader-election which elects a leading instance between different instances in the same javascript runtime.","source":"@site/docs/leader-election.md","sourceDirName":".","slug":"/leader-election.html","permalink":"/leader-election.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Leader Election","slug":"leader-election.html"},"sidebar":"tutorialSidebar","previous":{"title":"Backup","permalink":"/backup.html"},"next":{"title":"Middleware","permalink":"/middleware.html"}}');var i=n(4848),a=n(8453);const o={title:"Leader Election",slug:"leader-election.html"},l="Leader-Election",t={},c=[{value:"Use-case-example",id:"use-case-example",level:2},{value:"Solution",id:"solution",level:2},{value:"Add the leader election plugin",id:"add-the-leader-election-plugin",level:2},{value:"Code-example",id:"code-example",level:2},{value:"Handle Duplicate Leaders",id:"handle-duplicate-leaders",level:2},{value:"Live-Example",id:"live-example",level:2},{value:"Try it out",id:"try-it-out",level:2},{value:"Notice",id:"notice",level:2}];function d(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",span:"span",strong:"strong",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"leader-election",children:"Leader-Election"})}),"\n",(0,i.jsx)(s.p,{children:"RxDB comes with a leader-election which elects a leading instance between different instances in the same javascript runtime.\nBefore you read this, please check out on how many of your open browser-tabs you have opened the same website more than once. Count them, I will wait.."}),"\n",(0,i.jsx)(s.p,{children:"So if you would now inspect the traffic that these open tabs produce, you can see that many of them send exact the same data over wire for every tab. No matter if the data is sent with an open websocket or by polling."}),"\n",(0,i.jsx)(s.h2,{id:"use-case-example",children:"Use-case-example"}),"\n",(0,i.jsx)(s.p,{children:"Imagine we have a website which displays the current temperature of the visitors location in various charts, numbers or heatmaps. To always display the live-data, the website opens a websocket to our API-Server which sends the current temperature every 10 seconds. Using the way most sites are currently build, we can now open it in 5 browser-tabs and it will open 5 websockets which send data 6*5=30 times per minute. This will not only waste the power of your clients device, but also wastes your api-servers resources by opening redundant connections."}),"\n",(0,i.jsx)(s.h2,{id:"solution",children:"Solution"}),"\n",(0,i.jsxs)(s.p,{children:["The solution to this redundancy is the usage of a ",(0,i.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Leader_election",children:"leader-election"}),"-algorithm which makes sure that always exactly one tab is managing the remote-data-access. The managing tab is the elected leader and stays leader until it is closed. No matter how many tabs are opened or closed, there must be always exactly ",(0,i.jsx)(s.strong,{children:"one"})," leader.\nYou could now start implementing a messaging-system between your browser-tabs, hand out which one is leader, solve conflicts and reassign a new leader when the old one 'dies'.\nOr just use RxDB which does all these things for you."]}),"\n",(0,i.jsx)(s.h2,{id:"add-the-leader-election-plugin",children:"Add the leader election plugin"}),"\n",(0,i.jsxs)(s.p,{children:["To enable the leader election, you have to add the ",(0,i.jsx)(s.code,{children:"leader-election"})," plugin."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { addRxPlugin } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { RxDBLeaderElectionPlugin } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/leader-election'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addRxPlugin"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(RxDBLeaderElectionPlugin);"})]})]})})}),"\n",(0,i.jsx)(s.h2,{id:"code-example",children:"Code-example"}),"\n",(0,i.jsx)(s.p,{children:"To make it easy, here is an example where the temperature is pulled every ten seconds and saved to a collection. The pulling starts at the moment where the opened tab becomes the leader."}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'weatherDB'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" password"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myPassword'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" multiInstance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" temperature"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" mySchema"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".waitForLeadership"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" .then"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(() "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Long lives the king!'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"); "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// <- runs when db becomes leader"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" setInterval"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" temp"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" fetch"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'https://example.com/api/temp/'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"temperature"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" degrees"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" temp"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" time"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Date"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".getTime"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 1000"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" *"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})})]})})}),"\n",(0,i.jsx)(s.h2,{id:"handle-duplicate-leaders",children:"Handle Duplicate Leaders"}),"\n",(0,i.jsxs)(s.p,{children:["On rare occasions, it can happen that ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/broadcast-channel/blob/master/.github/README.md#handle-duplicate-leaders",children:"more than one leader"})," is elected. This can happen when the CPU is on 100% or for any other reason the JavaScript process is fully blocked for a long time.\nFor most cases this is not really problem because on duplicate leaders, both browser tabs replicate with the same backend anyways.\nTo handle the duplicate leader event, you can access the leader elector and set a handler:"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getLeaderElectorByBroadcastChannel"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/leader-election'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" leaderElector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getLeaderElectorByBroadcastChannel"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(broadcastChannel);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"leaderElector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"onduplicate"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Duplicate leader detected -> reload the page."})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" location"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".reload"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.h2,{id:"live-example",children:"Live-Example"}),"\n",(0,i.jsx)(s.p,{children:"In this example the leader is marked with the crown \u265b"}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"./files/leader-election.gif",alt:"Leader Election",width:"300"})}),"\n",(0,i.jsx)(s.h2,{id:"try-it-out",children:"Try it out"}),"\n",(0,i.jsxs)(s.p,{children:["Run the ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/angular",children:"angular-example"})," where the leading tab is marked with a crown on the top-right-corner."]}),"\n",(0,i.jsx)(s.h2,{id:"notice",children:"Notice"}),"\n",(0,i.jsxs)(s.p,{children:["The leader election is implemented via the ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/broadcast-channel#using-the-leaderelection",children:"broadcast-channel module"}),".\nThe leader is elected between different processes on the same javascript-runtime. Like multiple tabs in the same browser or multiple NodeJs-processes on the same machine. It will not run between different replicated instances."]})]})}function h(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453(e,s,n){n.d(s,{R:()=>o,x:()=>l});var r=n(6540);const i={},a=r.createContext(i);function o(e){const s=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/4250.a201ce1c.js b/docs/assets/js/4250.a201ce1c.js deleted file mode 100644 index d3ad9561d0f..00000000000 --- a/docs/assets/js/4250.a201ce1c.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 4250.a201ce1c.js.LICENSE.txt */ -(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[4250],{392(e,t,n){"use strict";var i=n(6220),r=n(1622),s=n(6766);e.exports=function(e,t,n,o){var a=s(e.as._ua);if(a&&a[0]>=3&&a[1]>20&&((t=t||{}).additionalUA="autocomplete.js "+r),!n.source)return i.error("Missing 'source' key");var u=i.isFunction(n.source)?n.source:function(e){return e[n.source]};if(!n.index)return i.error("Missing 'index' key");var c=n.index;return o=o||{},function(a,l){e.search(a,t,function(e,a){if(e)i.error(e.message);else{if(a.hits.length>0){var h=a.hits[0],p=i.mixin({hitsPerPage:0},n);delete p.source,delete p.index;var f=s(c.as._ua);return f&&f[0]>=3&&f[1]>20&&(t.additionalUA="autocomplete.js "+r),void c.search(u(h),p,function(e,t){if(e)i.error(e.message);else{var n=[];if(o.includeAll){var r=o.allTitle||"All departments";n.push(i.mixin({facet:{value:r,count:t.nbHits}},i.cloneDeep(h)))}i.each(t.facets,function(e,t){i.each(e,function(e,r){n.push(i.mixin({facet:{facet:t,value:r,count:e}},i.cloneDeep(h)))})});for(var s=1;s1)for(var n=1;n=3&&n[1]>20&&((t=t||{}).additionalUA="autocomplete.js "+r),function(n,r){e.search(n,t,function(e,t){e?i.error(e.message):r(t.hits,t)})}}},1622(e){e.exports="0.37.0"},1805(e,t,n){"use strict";var i=n(874),r=/\s+/;function s(e,t,n,i){var s;if(!n)return this;for(t=t.split(r),n=i?function(e,t){return e.bind?e.bind(t):function(){e.apply(t,[].slice.call(arguments,0))}}(n,i):n,this._callbacks=this._callbacks||{};s=t.shift();)this._callbacks[s]=this._callbacks[s]||{sync:[],async:[]},this._callbacks[s][e].push(n);return this}function o(e,t,n){return function(){for(var i,r=0,s=e.length;!i&&r'),this.$menu.append(this.$empty),this.$empty.hide()),this.datasets=i.map(e.datasets,function(t){return function(e,t,n){return new u.Dataset(i.mixin({$menu:e,cssClasses:n},t))}(o.$menu,t,e.cssClasses)}),i.each(this.datasets,function(e){var t=e.getRoot();t&&0===t.parent().length&&o.$menu.append(t),e.onSync("rendered",o._onRendered,o)}),e.templates&&e.templates.footer&&(this.templates.footer=i.templatify(e.templates.footer),this.$menu.append(this.templates.footer()));var l=this;r.element(window).resize(function(){l._redraw()})}i.mixin(u.prototype,s,{_onSuggestionClick:function(e){this.trigger("suggestionClicked",r.element(e.currentTarget))},_onSuggestionMouseEnter:function(e){var t=r.element(e.currentTarget);if(!t.hasClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0))){this._removeCursor();var n=this;setTimeout(function(){n._setCursor(t,!1)},0)}},_onSuggestionMouseLeave:function(e){if(e.relatedTarget&&r.element(e.relatedTarget).closest("."+i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).length>0)return;this._removeCursor(),this.trigger("cursorRemoved")},_onRendered:function(e,t){if(this.isEmpty=i.every(this.datasets,function(e){return e.isEmpty()}),this.isEmpty)if(t.length>=this.minLength&&this.trigger("empty"),this.$empty)if(t.length=this.minLength?this._show():this._hide());this.trigger("datasetRendered")},_hide:function(){this.$container.hide()},_show:function(){this.$container.css("display","block"),this._redraw(),this.trigger("shown")},_redraw:function(){this.isOpen&&this.appendTo&&this.trigger("redrawn")},_getSuggestions:function(){return this.$menu.find(i.className(this.cssClasses.prefix,this.cssClasses.suggestion))},_getCursor:function(){return this.$menu.find(i.className(this.cssClasses.prefix,this.cssClasses.cursor)).first()},_setCursor:function(e,t){e.first().addClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).attr("aria-selected","true"),this.trigger("cursorMoved",t)},_removeCursor:function(){this._getCursor().removeClass(i.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).removeAttr("aria-selected")},_moveCursor:function(e){var t,n,i,r;this.isOpen&&(n=this._getCursor(),t=this._getSuggestions(),this._removeCursor(),-1!==(i=((i=t.index(n)+e)+1)%(t.length+1)-1)?(i<-1&&(i=t.length-1),this._setCursor(r=t.eq(i),!0),this._ensureVisible(r)):this.trigger("cursorRemoved"))},_ensureVisible:function(e){var t,n,i,r;n=(t=e.position().top)+e.height()+parseInt(e.css("margin-top"),10)+parseInt(e.css("margin-bottom"),10),i=this.$menu.scrollTop(),r=this.$menu.height()+parseInt(this.$menu.css("padding-top"),10)+parseInt(this.$menu.css("padding-bottom"),10),t<0?this.$menu.scrollTop(i+t):r]*>/,m=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,v=/^(?:body|html)$/i,x=/([A-Z])/g,b=["val","css","html","text","data","width","height","offset"],w=["after","prepend","before","append"],S=h.createElement("table"),C=h.createElement("tr"),E={tr:h.createElement("tbody"),tbody:S,thead:S,tfoot:S,td:C,th:C,"*":h.createElement("div")},T=/complete|loaded|interactive/,k=/^[\w-]*$/,_={},O=_.toString,A={},P=h.createElement("div"),L={tabindex:"tabIndex",readonly:"readOnly",for:"htmlFor",class:"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},Q=Array.isArray||function(e){return e instanceof Array};function I(e){return null==e?String(e):_[O.call(e)]||"object"}function N(e){return"function"==I(e)}function $(e){return null!=e&&e==e.window}function D(e){return null!=e&&e.nodeType==e.DOCUMENT_NODE}function R(e){return"object"==I(e)}function F(e){return R(e)&&!$(e)&&Object.getPrototypeOf(e)==Object.prototype}function j(e){var t=!!e&&"length"in e&&e.length,n=i.type(e);return"function"!=n&&!$(e)&&("array"==n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function M(e){return c.call(e,function(e){return null!=e})}function V(e){return e.length>0?i.fn.concat.apply([],e):e}function B(e){return e.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function q(e){return e in f?f[e]:f[e]=new RegExp("(^|\\s)"+e+"(\\s|$)")}function z(e,t){return"number"!=typeof t||d[B(e)]?t:t+"px"}function H(e){var t,n;return p[e]||(t=h.createElement(e),h.body.appendChild(t),n=getComputedStyle(t,"").getPropertyValue("display"),t.parentNode.removeChild(t),"none"==n&&(n="block"),p[e]=n),p[e]}function K(e){return"children"in e?l.call(e.children):i.map(e.childNodes,function(e){if(1==e.nodeType)return e})}function W(e,t){var n,i=e?e.length:0;for(n=0;n")),n===t&&(n=g.test(e)&&RegExp.$1),n in E||(n="*"),(a=E[n]).innerHTML=""+e,s=i.each(l.call(a.childNodes),function(){a.removeChild(this)})),F(r)&&(o=i(s),i.each(r,function(e,t){b.indexOf(e)>-1?o[e](t):o.attr(e,t)})),s},A.Z=function(e,t){return new W(e,t)},A.isZ=function(e){return e instanceof A.Z},A.init=function(e,n){var r;if(!e)return A.Z();if("string"==typeof e)if("<"==(e=e.trim())[0]&&g.test(e))r=A.fragment(e,RegExp.$1,n),e=null;else{if(n!==t)return i(n).find(e);r=A.qsa(h,e)}else{if(N(e))return i(h).ready(e);if(A.isZ(e))return e;if(Q(e))r=M(e);else if(R(e))r=[e],e=null;else if(g.test(e))r=A.fragment(e.trim(),RegExp.$1,n),e=null;else{if(n!==t)return i(n).find(e);r=A.qsa(h,e)}}return A.Z(r,e)},(i=function(e,t){return A.init(e,t)}).extend=function(e){var t,n=l.call(arguments,1);return"boolean"==typeof e&&(t=e,e=n.shift()),n.forEach(function(n){U(e,n,t)}),e},A.qsa=function(e,t){var n,i="#"==t[0],r=!i&&"."==t[0],s=i||r?t.slice(1):t,o=k.test(s);return e.getElementById&&o&&i?(n=e.getElementById(s))?[n]:[]:1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType?[]:l.call(o&&!i&&e.getElementsByClassName?r?e.getElementsByClassName(s):e.getElementsByTagName(t):e.querySelectorAll(t))},i.contains=h.documentElement.contains?function(e,t){return e!==t&&e.contains(t)}:function(e,t){for(;t&&(t=t.parentNode);)if(t===e)return!0;return!1},i.type=I,i.isFunction=N,i.isWindow=$,i.isArray=Q,i.isPlainObject=F,i.isEmptyObject=function(e){var t;for(t in e)return!1;return!0},i.isNumeric=function(e){var t=Number(e),n=typeof e;return null!=e&&"boolean"!=n&&("string"!=n||e.length)&&!isNaN(t)&&isFinite(t)||!1},i.inArray=function(e,t,n){return a.indexOf.call(t,e,n)},i.camelCase=s,i.trim=function(e){return null==e?"":String.prototype.trim.call(e)},i.uuid=0,i.support={},i.expr={},i.noop=function(){},i.map=function(e,t){var n,i,r,s=[];if(j(e))for(i=0;i=0?e:e+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},each:function(e){return a.every.call(this,function(t,n){return!1!==e.call(t,n,t)}),this},filter:function(e){return N(e)?this.not(this.not(e)):i(c.call(this,function(t){return A.matches(t,e)}))},add:function(e,t){return i(o(this.concat(i(e,t))))},is:function(e){return this.length>0&&A.matches(this[0],e)},not:function(e){var n=[];if(N(e)&&e.call!==t)this.each(function(t){e.call(this,t)||n.push(this)});else{var r="string"==typeof e?this.filter(e):j(e)&&N(e.item)?l.call(e):i(e);this.forEach(function(e){r.indexOf(e)<0&&n.push(e)})}return i(n)},has:function(e){return this.filter(function(){return R(e)?i.contains(this,e):i(this).find(e).size()})},eq:function(e){return-1===e?this.slice(e):this.slice(e,+e+1)},first:function(){var e=this[0];return e&&!R(e)?e:i(e)},last:function(){var e=this[this.length-1];return e&&!R(e)?e:i(e)},find:function(e){var t=this;return e?"object"==typeof e?i(e).filter(function(){var e=this;return a.some.call(t,function(t){return i.contains(t,e)})}):1==this.length?i(A.qsa(this[0],e)):this.map(function(){return A.qsa(this,e)}):i()},closest:function(e,t){var n=[],r="object"==typeof e&&i(e);return this.each(function(i,s){for(;s&&!(r?r.indexOf(s)>=0:A.matches(s,e));)s=s!==t&&!D(s)&&s.parentNode;s&&n.indexOf(s)<0&&n.push(s)}),i(n)},parents:function(e){for(var t=[],n=this;n.length>0;)n=i.map(n,function(e){if((e=e.parentNode)&&!D(e)&&t.indexOf(e)<0)return t.push(e),e});return G(t,e)},parent:function(e){return G(o(this.pluck("parentNode")),e)},children:function(e){return G(this.map(function(){return K(this)}),e)},contents:function(){return this.map(function(){return this.contentDocument||l.call(this.childNodes)})},siblings:function(e){return G(this.map(function(e,t){return c.call(K(t.parentNode),function(e){return e!==t})}),e)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(e){return i.map(this,function(t){return t[e]})},show:function(){return this.each(function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=H(this.nodeName))})},replaceWith:function(e){return this.before(e).remove()},wrap:function(e){var t=N(e);if(this[0]&&!t)var n=i(e).get(0),r=n.parentNode||this.length>1;return this.each(function(s){i(this).wrapAll(t?e.call(this,s):r?n.cloneNode(!0):n)})},wrapAll:function(e){if(this[0]){var t;for(i(this[0]).before(e=i(e));(t=e.children()).length;)e=t.first();i(e).append(this)}return this},wrapInner:function(e){var t=N(e);return this.each(function(n){var r=i(this),s=r.contents(),o=t?e.call(this,n):e;s.length?s.wrapAll(o):r.append(o)})},unwrap:function(){return this.parent().each(function(){i(this).replaceWith(i(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(e){return this.each(function(){var n=i(this);(e===t?"none"==n.css("display"):e)?n.show():n.hide()})},prev:function(e){return i(this.pluck("previousElementSibling")).filter(e||"*")},next:function(e){return i(this.pluck("nextElementSibling")).filter(e||"*")},html:function(e){return 0 in arguments?this.each(function(t){var n=this.innerHTML;i(this).empty().append(Z(this,e,t,n))}):0 in this?this[0].innerHTML:null},text:function(e){return 0 in arguments?this.each(function(t){var n=Z(this,e,t,this.textContent);this.textContent=null==n?"":""+n}):0 in this?this.pluck("textContent").join(""):null},attr:function(e,i){var r;return"string"!=typeof e||1 in arguments?this.each(function(t){if(1===this.nodeType)if(R(e))for(n in e)X(this,n,e[n]);else X(this,e,Z(this,i,t,this.getAttribute(e)))}):0 in this&&1==this[0].nodeType&&null!=(r=this[0].getAttribute(e))?r:t},removeAttr:function(e){return this.each(function(){1===this.nodeType&&e.split(" ").forEach(function(e){X(this,e)},this)})},prop:function(e,t){return e=L[e]||e,1 in arguments?this.each(function(n){this[e]=Z(this,t,n,this[e])}):this[0]&&this[0][e]},removeProp:function(e){return e=L[e]||e,this.each(function(){delete this[e]})},data:function(e,n){var i="data-"+e.replace(x,"-$1").toLowerCase(),r=1 in arguments?this.attr(i,n):this.attr(i);return null!==r?Y(r):t},val:function(e){return 0 in arguments?(null==e&&(e=""),this.each(function(t){this.value=Z(this,e,t,this.value)})):this[0]&&(this[0].multiple?i(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value)},offset:function(t){if(t)return this.each(function(e){var n=i(this),r=Z(this,t,e,n.offset()),s=n.offsetParent().offset(),o={top:r.top-s.top,left:r.left-s.left};"static"==n.css("position")&&(o.position="relative"),n.css(o)});if(!this.length)return null;if(h.documentElement!==this[0]&&!i.contains(h.documentElement,this[0]))return{top:0,left:0};var n=this[0].getBoundingClientRect();return{left:n.left+e.pageXOffset,top:n.top+e.pageYOffset,width:Math.round(n.width),height:Math.round(n.height)}},css:function(e,t){if(arguments.length<2){var r=this[0];if("string"==typeof e){if(!r)return;return r.style[s(e)]||getComputedStyle(r,"").getPropertyValue(e)}if(Q(e)){if(!r)return;var o={},a=getComputedStyle(r,"");return i.each(e,function(e,t){o[t]=r.style[s(t)]||a.getPropertyValue(t)}),o}}var u="";if("string"==I(e))t||0===t?u=B(e)+":"+z(e,t):this.each(function(){this.style.removeProperty(B(e))});else for(n in e)e[n]||0===e[n]?u+=B(n)+":"+z(n,e[n])+";":this.each(function(){this.style.removeProperty(B(n))});return this.each(function(){this.style.cssText+=";"+u})},index:function(e){return e?this.indexOf(i(e)[0]):this.parent().children().indexOf(this[0])},hasClass:function(e){return!!e&&a.some.call(this,function(e){return this.test(J(e))},q(e))},addClass:function(e){return e?this.each(function(t){if("className"in this){r=[];var n=J(this);Z(this,e,t,n).split(/\s+/g).forEach(function(e){i(this).hasClass(e)||r.push(e)},this),r.length&&J(this,n+(n?" ":"")+r.join(" "))}}):this},removeClass:function(e){return this.each(function(n){if("className"in this){if(e===t)return J(this,"");r=J(this),Z(this,e,n,r).split(/\s+/g).forEach(function(e){r=r.replace(q(e)," ")}),J(this,r.trim())}})},toggleClass:function(e,n){return e?this.each(function(r){var s=i(this);Z(this,e,r,J(this)).split(/\s+/g).forEach(function(e){(n===t?!s.hasClass(e):n)?s.addClass(e):s.removeClass(e)})}):this},scrollTop:function(e){if(this.length){var n="scrollTop"in this[0];return e===t?n?this[0].scrollTop:this[0].pageYOffset:this.each(n?function(){this.scrollTop=e}:function(){this.scrollTo(this.scrollX,e)})}},scrollLeft:function(e){if(this.length){var n="scrollLeft"in this[0];return e===t?n?this[0].scrollLeft:this[0].pageXOffset:this.each(n?function(){this.scrollLeft=e}:function(){this.scrollTo(e,this.scrollY)})}},position:function(){if(this.length){var e=this[0],t=this.offsetParent(),n=this.offset(),r=v.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(i(e).css("margin-top"))||0,n.left-=parseFloat(i(e).css("margin-left"))||0,r.top+=parseFloat(i(t[0]).css("border-top-width"))||0,r.left+=parseFloat(i(t[0]).css("border-left-width"))||0,{top:n.top-r.top,left:n.left-r.left}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent||h.body;e&&!v.test(e.nodeName)&&"static"==i(e).css("position");)e=e.offsetParent;return e})}},i.fn.detach=i.fn.remove,["width","height"].forEach(function(e){var n=e.replace(/./,function(e){return e[0].toUpperCase()});i.fn[e]=function(r){var s,o=this[0];return r===t?$(o)?o["inner"+n]:D(o)?o.documentElement["scroll"+n]:(s=this.offset())&&s[e]:this.each(function(t){(o=i(this)).css(e,Z(this,r,t,o[e]()))})}}),w.forEach(function(n,r){var s=r%2;i.fn[n]=function(){var n,o,a=i.map(arguments,function(e){var r=[];return"array"==(n=I(e))?(e.forEach(function(e){return e.nodeType!==t?r.push(e):i.zepto.isZ(e)?r=r.concat(e.get()):void(r=r.concat(A.fragment(e)))}),r):"object"==n||null==e?e:A.fragment(e)}),u=this.length>1;return a.length<1?this:this.each(function(t,n){o=s?n:n.parentNode,n=0==r?n.nextSibling:1==r?n.firstChild:2==r?n:null;var c=i.contains(h.documentElement,o);a.forEach(function(t){if(u)t=t.cloneNode(!0);else if(!o)return i(t).remove();o.insertBefore(t,n),c&&ee(t,function(t){if(!(null==t.nodeName||"SCRIPT"!==t.nodeName.toUpperCase()||t.type&&"text/javascript"!==t.type||t.src)){var n=t.ownerDocument?t.ownerDocument.defaultView:e;n.eval.call(n,t.innerHTML)}})})})},i.fn[s?n+"To":"insert"+(r?"Before":"After")]=function(e){return i(e)[n](this),this}}),A.Z.prototype=W.prototype=i.fn,A.uniq=o,A.deserializeValue=Y,i.zepto=A,i}();return function(t){var n,i=1,r=Array.prototype.slice,s=t.isFunction,o=function(e){return"string"==typeof e},a={},u={},c="onfocusin"in e,l={focus:"focusin",blur:"focusout"},h={mouseenter:"mouseover",mouseleave:"mouseout"};function p(e){return e._zid||(e._zid=i++)}function f(e,t,n,i){if((t=d(t)).ns)var r=g(t.ns);return(a[p(e)]||[]).filter(function(e){return e&&(!t.e||e.e==t.e)&&(!t.ns||r.test(e.ns))&&(!n||p(e.fn)===p(n))&&(!i||e.sel==i)})}function d(e){var t=(""+e).split(".");return{e:t[0],ns:t.slice(1).sort().join(" ")}}function g(e){return new RegExp("(?:^| )"+e.replace(" "," .* ?")+"(?: |$)")}function m(e,t){return e.del&&!c&&e.e in l||!!t}function y(e){return h[e]||c&&l[e]||e}function v(e,i,r,s,o,u,c){var l=p(e),f=a[l]||(a[l]=[]);i.split(/\s/).forEach(function(i){if("ready"==i)return t(document).ready(r);var a=d(i);a.fn=r,a.sel=o,a.e in h&&(r=function(e){var n=e.relatedTarget;if(!n||n!==this&&!t.contains(this,n))return a.fn.apply(this,arguments)}),a.del=u;var l=u||r;a.proxy=function(t){if(!(t=E(t)).isImmediatePropagationStopped()){try{var i=Object.getOwnPropertyDescriptor(t,"data");i&&!i.writable||(t.data=s)}catch(t){}var r=l.apply(e,t._args==n?[t]:[t].concat(t._args));return!1===r&&(t.preventDefault(),t.stopPropagation()),r}},a.i=f.length,f.push(a),"addEventListener"in e&&e.addEventListener(y(a.e),a.proxy,m(a,c))})}function x(e,t,n,i,r){var s=p(e);(t||"").split(/\s/).forEach(function(t){f(e,t,n,i).forEach(function(t){delete a[s][t.i],"removeEventListener"in e&&e.removeEventListener(y(t.e),t.proxy,m(t,r))})})}u.click=u.mousedown=u.mouseup=u.mousemove="MouseEvents",t.event={add:v,remove:x},t.proxy=function(e,n){var i=2 in arguments&&r.call(arguments,2);if(s(e)){var a=function(){return e.apply(n,i?i.concat(r.call(arguments)):arguments)};return a._zid=p(e),a}if(o(n))return i?(i.unshift(e[n],e),t.proxy.apply(null,i)):t.proxy(e[n],e);throw new TypeError("expected function")},t.fn.bind=function(e,t,n){return this.on(e,t,n)},t.fn.unbind=function(e,t){return this.off(e,t)},t.fn.one=function(e,t,n,i){return this.on(e,t,n,i,1)};var b=function(){return!0},w=function(){return!1},S=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,C={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};function E(e,i){return!i&&e.isDefaultPrevented||(i||(i=e),t.each(C,function(t,n){var r=i[t];e[t]=function(){return this[n]=b,r&&r.apply(i,arguments)},e[n]=w}),e.timeStamp||(e.timeStamp=Date.now()),(i.defaultPrevented!==n?i.defaultPrevented:"returnValue"in i?!1===i.returnValue:i.getPreventDefault&&i.getPreventDefault())&&(e.isDefaultPrevented=b)),e}function T(e){var t,i={originalEvent:e};for(t in e)S.test(t)||e[t]===n||(i[t]=e[t]);return E(i,e)}t.fn.delegate=function(e,t,n){return this.on(t,e,n)},t.fn.undelegate=function(e,t,n){return this.off(t,e,n)},t.fn.live=function(e,n){return t(document.body).delegate(this.selector,e,n),this},t.fn.die=function(e,n){return t(document.body).undelegate(this.selector,e,n),this},t.fn.on=function(e,i,a,u,c){var l,h,p=this;return e&&!o(e)?(t.each(e,function(e,t){p.on(e,i,a,t,c)}),p):(o(i)||s(u)||!1===u||(u=a,a=i,i=n),u!==n&&!1!==a||(u=a,a=n),!1===u&&(u=w),p.each(function(n,s){c&&(l=function(e){return x(s,e.type,u),u.apply(this,arguments)}),i&&(h=function(e){var n,o=t(e.target).closest(i,s).get(0);if(o&&o!==s)return n=t.extend(T(e),{currentTarget:o,liveFired:s}),(l||u).apply(o,[n].concat(r.call(arguments,1)))}),v(s,e,u,a,i,h||l)}))},t.fn.off=function(e,i,r){var a=this;return e&&!o(e)?(t.each(e,function(e,t){a.off(e,i,t)}),a):(o(i)||s(r)||!1===r||(r=i,i=n),!1===r&&(r=w),a.each(function(){x(this,e,r,i)}))},t.fn.trigger=function(e,n){return(e=o(e)||t.isPlainObject(e)?t.Event(e):E(e))._args=n,this.each(function(){e.type in l&&"function"==typeof this[e.type]?this[e.type]():"dispatchEvent"in this?this.dispatchEvent(e):t(this).triggerHandler(e,n)})},t.fn.triggerHandler=function(e,n){var i,r;return this.each(function(s,a){(i=T(o(e)?t.Event(e):e))._args=n,i.target=a,t.each(f(a,e.type||e),function(e,t){if(r=t.proxy(i),i.isImmediatePropagationStopped())return!1})}),r},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(e){t.fn[e]=function(t){return 0 in arguments?this.bind(e,t):this.trigger(e)}}),t.Event=function(e,t){o(e)||(e=(t=e).type);var n=document.createEvent(u[e]||"Events"),i=!0;if(t)for(var r in t)"bubbles"==r?i=!!t[r]:n[r]=t[r];return n.initEvent(e,i,!0),E(n)}}(i),n=[],i.fn.remove=function(){return this.each(function(){this.parentNode&&("IMG"===this.tagName&&(n.push(this),this.src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=",t&&clearTimeout(t),t=setTimeout(function(){n=[]},6e4)),this.parentNode.removeChild(this))})},function(e){var t={},n=e.fn.data,i=e.camelCase,r=e.expando="Zepto"+ +new Date,s=[];function o(s,o){var u=s[r],c=u&&t[u];if(void 0===o)return c||a(s);if(c){if(o in c)return c[o];var l=i(o);if(l in c)return c[l]}return n.call(e(s),o)}function a(n,s,o){var a=n[r]||(n[r]=++e.uuid),c=t[a]||(t[a]=u(n));return void 0!==s&&(c[i(s)]=o),c}function u(t){var n={};return e.each(t.attributes||s,function(t,r){0==r.name.indexOf("data-")&&(n[i(r.name.replace("data-",""))]=e.zepto.deserializeValue(r.value))}),n}e.fn.data=function(t,n){return void 0===n?e.isPlainObject(t)?this.each(function(n,i){e.each(t,function(e,t){a(i,e,t)})}):0 in this?o(this[0],t):void 0:this.each(function(){a(this,t,n)})},e.data=function(t,n,i){return e(t).data(n,i)},e.hasData=function(n){var i=n[r],s=i&&t[i];return!!s&&!e.isEmptyObject(s)},e.fn.removeData=function(n){return"string"==typeof n&&(n=n.split(/\s+/)),this.each(function(){var s=this[r],o=s&&t[s];o&&e.each(n||o,function(e){delete o[n?i(this):e]})})},["remove","empty"].forEach(function(t){var n=e.fn[t];e.fn[t]=function(){var e=this.find("*");return"remove"===t&&(e=e.add(this)),e.removeData(),n.call(this)}})}(i),i}(t)},3718(e){"use strict";e.exports={element:null}},4045(e,t,n){"use strict";var i=n(6220),r=n(3718);function s(e){e&&e.el||i.error("EventBus initialized without el"),this.$el=r.element(e.el)}i.mixin(s.prototype,{trigger:function(e,t,n,r){var s=i.Event("autocomplete:"+e);return this.$el.trigger(s,[t,n,r]),s}}),e.exports=s},4498(e,t,n){"use strict";e.exports=n(5275)},4499(e){"use strict";e.exports={wrapper:'',dropdown:'',dataset:'
',suggestions:'',suggestion:'
'}},4710(e,t,n){"use strict";e.exports={hits:n(1242),popularIn:n(392)}},4714(e,t,n){var i=n(9110);i.Template=n(9549).Template,i.template=i.Template,e.exports=i},5275(e,t,n){"use strict";var i=n(3704);n(3718).element=i;var r=n(6220);r.isArray=i.isArray,r.isFunction=i.isFunction,r.isObject=i.isPlainObject,r.bind=i.proxy,r.each=function(e,t){i.each(e,function(e,n){return t(n,e)})},r.map=i.map,r.mixin=i.extend,r.Event=i.Event;var s="aaAutocomplete",o=n(8693),a=n(4045);function u(e,t,n,u){n=r.isArray(n)?n:[].slice.call(arguments,2);var c=i(e).each(function(e,r){var c=i(r),l=new a({el:c}),h=u||new o({input:c,eventBus:l,dropdownMenuContainer:t.dropdownMenuContainer,hint:void 0===t.hint||!!t.hint,minLength:t.minLength,autoselect:t.autoselect,autoselectOnBlur:t.autoselectOnBlur,tabAutocomplete:t.tabAutocomplete,openOnFocus:t.openOnFocus,templates:t.templates,debug:t.debug,clearOnSelected:t.clearOnSelected,cssClasses:t.cssClasses,datasets:n,keyboardShortcuts:t.keyboardShortcuts,appendTo:t.appendTo,autoWidth:t.autoWidth,ariaLabel:t.ariaLabel||r.getAttribute("aria-label")});c.data(s,h)});return c.autocomplete={},r.each(["open","close","getVal","setVal","destroy","getWrapper"],function(e){c.autocomplete[e]=function(){var t,n=arguments;return c.each(function(r,o){var a=i(o).data(s);t=a[e].apply(a,n)}),t}}),c}u.sources=o.sources,u.escapeHighlightedString=r.escapeHighlightedString;var c="autocomplete"in window,l=window.autocomplete;u.noConflict=function(){return c?window.autocomplete=l:delete window.autocomplete,u},e.exports=u},5723(e,t){"use strict";t.test=function(){return"document"in globalThis&&"onreadystatechange"in globalThis.document.createElement("script")},t.install=function(e){return function(){var t=globalThis.document.createElement("script");return t.onreadystatechange=function(){e(),t.onreadystatechange=null,t.parentNode.removeChild(t),t=null},globalThis.document.documentElement.appendChild(t),e}}},6220(e,t,n){"use strict";var i,r=n(3718);function s(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}e.exports={isArray:null,isFunction:null,isObject:null,bind:null,each:null,map:null,mixin:null,isMsie:function(e){if(void 0===e&&(e=navigator.userAgent),/(msie|trident)/i.test(e)){var t=e.match(/(msie |rv:)(\d+(.\d+)?)/i);if(t)return t[2]}return!1},escapeRegExChars:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isNumber:function(e){return"number"==typeof e},toStr:function(e){return null==e?"":e+""},cloneDeep:function(e){var t=this.mixin({},e),n=this;return this.each(t,function(e,i){e&&(n.isArray(e)?t[i]=[].concat(e):n.isObject(e)&&(t[i]=n.cloneDeep(e)))}),t},error:function(e){throw new Error(e)},every:function(e,t){var n=!0;return e?(this.each(e,function(i,r){n&&(n=t.call(null,i,r,e)&&n)}),!!n):n},any:function(e,t){var n=!1;return e?(this.each(e,function(i,r){if(t.call(null,i,r,e))return n=!0,!1}),n):n},getUniqueId:(i=0,function(){return i++}),templatify:function(e){if(this.isFunction(e))return e;var t=r.element(e);return"SCRIPT"===t.prop("tagName")?function(){return t.text()}:function(){return String(e)}},defer:function(e){setTimeout(e,0)},noop:function(){},formatPrefix:function(e,t){return t?"":e+"-"},className:function(e,t,n){return(n?"":".")+e+t},escapeHighlightedString:function(e,t,n){t=t||"";var i=document.createElement("div");i.appendChild(document.createTextNode(t)),n=n||"";var r=document.createElement("div");r.appendChild(document.createTextNode(n));var o=document.createElement("div");return o.appendChild(document.createTextNode(e)),o.innerHTML.replace(RegExp(s(i.innerHTML),"g"),t).replace(RegExp(s(r.innerHTML),"g"),n)}}},6345(e,t){"use strict";t.test=function(){return!0},t.install=function(e){return function(){setTimeout(e,0)}}},6486(e,t){"use strict";t.test=function(){return!globalThis.setImmediate&&void 0!==globalThis.MessageChannel},t.install=function(e){var t=new globalThis.MessageChannel;return t.port1.onmessage=e,function(){t.port2.postMessage(0)}}},6766(e){"use strict";e.exports=function(e){var t=e.match(/Algolia for vanilla JavaScript (\d+\.)(\d+\.)(\d+)/);if(t)return[t[1],t[2],t[3]]}},7748(e,t,n){"use strict";var i;i={9:"tab",27:"esc",37:"left",39:"right",13:"enter",38:"up",40:"down"};var r=n(6220),s=n(3718),o=n(1805);function a(e){var t,n,o,a,u,c=this;(e=e||{}).input||r.error("input is missing"),t=r.bind(this._onBlur,this),n=r.bind(this._onFocus,this),o=r.bind(this._onKeydown,this),a=r.bind(this._onInput,this),this.$hint=s.element(e.hint),this.$input=s.element(e.input).on("blur.aa",t).on("focus.aa",n).on("keydown.aa",o),0===this.$hint.length&&(this.setHint=this.getHint=this.clearHint=this.clearHintIfInvalid=r.noop),r.isMsie()?this.$input.on("keydown.aa keypress.aa cut.aa paste.aa",function(e){i[e.which||e.keyCode]||r.defer(r.bind(c._onInput,c,e))}):this.$input.on("input.aa",a),this.query=this.$input.val(),this.$overflowHelper=(u=this.$input,s.element('').css({position:"absolute",visibility:"hidden",whiteSpace:"pre",fontFamily:u.css("font-family"),fontSize:u.css("font-size"),fontStyle:u.css("font-style"),fontVariant:u.css("font-variant"),fontWeight:u.css("font-weight"),wordSpacing:u.css("word-spacing"),letterSpacing:u.css("letter-spacing"),textIndent:u.css("text-indent"),textRendering:u.css("text-rendering"),textTransform:u.css("text-transform")}).insertAfter(u))}function u(e){return e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}a.normalizeQuery=function(e){return(e||"").replace(/^\s*/g,"").replace(/\s{2,}/g," ")},r.mixin(a.prototype,o,{_onBlur:function(){this.resetInputValue(),this.$input.removeAttr("aria-activedescendant"),this.trigger("blurred")},_onFocus:function(){this.trigger("focused")},_onKeydown:function(e){var t=i[e.which||e.keyCode];this._managePreventDefault(t,e),t&&this._shouldTrigger(t,e)&&this.trigger(t+"Keyed",e)},_onInput:function(){this._checkInputValue()},_managePreventDefault:function(e,t){var n,i,r;switch(e){case"tab":i=this.getHint(),r=this.getInputValue(),n=i&&i!==r&&!u(t);break;case"up":case"down":n=!u(t);break;default:n=!1}n&&t.preventDefault()},_shouldTrigger:function(e,t){var n;if("tab"===e)n=!u(t);else n=!0;return n},_checkInputValue:function(){var e,t,n,i,r;e=this.getInputValue(),i=e,r=this.query,n=!(!(t=a.normalizeQuery(i)===a.normalizeQuery(r))||!this.query)&&this.query.length!==e.length,this.query=e,t?n&&this.trigger("whitespaceChanged",this.query):this.trigger("queryChanged",this.query)},focus:function(){this.$input.focus()},blur:function(){this.$input.blur()},getQuery:function(){return this.query},setQuery:function(e){this.query=e},getInputValue:function(){return this.$input.val()},setInputValue:function(e,t){void 0===e&&(e=this.query),this.$input.val(e),t?this.clearHint():this._checkInputValue()},expand:function(){this.$input.attr("aria-expanded","true")},collapse:function(){this.$input.attr("aria-expanded","false")},setActiveDescendant:function(e){this.$input.attr("aria-activedescendant",e)},removeActiveDescendant:function(){this.$input.removeAttr("aria-activedescendant")},resetInputValue:function(){this.setInputValue(this.query,!0)},getHint:function(){return this.$hint.val()},setHint:function(e){this.$hint.val(e)},clearHint:function(){this.setHint("")},clearHintIfInvalid:function(){var e,t,n;n=(e=this.getInputValue())!==(t=this.getHint())&&0===t.indexOf(e),""!==e&&n&&!this.hasOverflow()||this.clearHint()},getLanguageDirection:function(){return(this.$input.css("direction")||"ltr").toLowerCase()},hasOverflow:function(){var e=this.$input.width()-2;return this.$overflowHelper.text(this.getInputValue()),this.$overflowHelper.width()>=e},isCursorAtEnd:function(){var e,t,n;return e=this.$input.val().length,t=this.$input[0].selectionStart,r.isNumber(t)?t===e:!document.selection||((n=document.selection.createRange()).moveStart("character",-e),e===n.text.length)},destroy:function(){this.$hint.off(".aa"),this.$input.off(".aa"),this.$hint=this.$input=this.$overflowHelper=null}}),e.exports=a},8291(e,t,n){var i,r;!function(){var s,o,a,u,c,l,h,p,f,d,g,m,y,v,x,b,w,S,C,E,T,k,_,O,A,P,L,Q,I,N,$=function(e){var t=new $.Builder;return t.pipeline.add($.trimmer,$.stopWordFilter,$.stemmer),t.searchPipeline.add($.stemmer),e.call(t,t),t.build()};$.version="2.3.9",$.utils={},$.utils.warn=(s=this,function(e){s.console&&console.warn&&console.warn(e)}),$.utils.asString=function(e){return null==e?"":e.toString()},$.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),i=0;i0){var u=$.utils.clone(t)||{};u.position=[o,a],u.index=r.length,r.push(new $.Token(n.slice(o,s),u))}o=s+1}}return r},$.tokenizer.separator=/[\s\-]+/,$.Pipeline=function(){this._stack=[]},$.Pipeline.registeredFunctions=Object.create(null),$.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&$.utils.warn("Overwriting existing registered function: "+t),e.label=t,$.Pipeline.registeredFunctions[e.label]=e},$.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||$.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},$.Pipeline.load=function(e){var t=new $.Pipeline;return e.forEach(function(e){var n=$.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)}),t},$.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach(function(e){$.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},$.Pipeline.prototype.after=function(e,t){$.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},$.Pipeline.prototype.before=function(e,t){$.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},$.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},$.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(se&&(n=r),s!=e);)i=n-t,r=t+Math.floor(i/2),s=this.elements[2*r];return s==e||s>e?2*r:sa?c+=2:o==a&&(t+=n[u+1]*i[c+1],u+=2,c+=2);return t},$.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},$.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var s,o=r.str.charAt(0);o in r.node.edges?s=r.node.edges[o]:(s=new $.TokenSet,r.node.edges[o]=s),1==r.str.length&&(s.final=!0),i.push({node:s,editsRemaining:r.editsRemaining,str:r.str.slice(1)})}if(0!=r.editsRemaining){if("*"in r.node.edges)var a=r.node.edges["*"];else{a=new $.TokenSet;r.node.edges["*"]=a}if(0==r.str.length&&(a.final=!0),i.push({node:a,editsRemaining:r.editsRemaining-1,str:r.str}),r.str.length>1&&i.push({node:r.node,editsRemaining:r.editsRemaining-1,str:r.str.slice(1)}),1==r.str.length&&(r.node.final=!0),r.str.length>=1){if("*"in r.node.edges)var u=r.node.edges["*"];else{u=new $.TokenSet;r.node.edges["*"]=u}1==r.str.length&&(u.final=!0),i.push({node:u,editsRemaining:r.editsRemaining-1,str:r.str.slice(1)})}if(r.str.length>1){var c,l=r.str.charAt(0),h=r.str.charAt(1);h in r.node.edges?c=r.node.edges[h]:(c=new $.TokenSet,r.node.edges[h]=c),1==r.str.length&&(c.final=!0),i.push({node:c,editsRemaining:r.editsRemaining-1,str:l+r.str.slice(2)})}}}return n},$.TokenSet.fromString=function(e){for(var t=new $.TokenSet,n=t,i=0,r=e.length;i=e;t--){var n=this.uncheckedNodes[t],i=n.child.toString();i in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[i]:(n.child._str=i,this.minimizedNodes[i]=n.child),this.uncheckedNodes.pop()}},$.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},$.Index.prototype.search=function(e){return this.query(function(t){new $.QueryParser(e,t).parse()})},$.Index.prototype.query=function(e){for(var t=new $.Query(this.fields),n=Object.create(null),i=Object.create(null),r=Object.create(null),s=Object.create(null),o=Object.create(null),a=0;a1?1:e},$.Builder.prototype.k1=function(e){this._k1=e},$.Builder.prototype.add=function(e,t){var n=e[this._ref],i=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var r=0;r=this.length)return $.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},$.QueryLexer.prototype.width=function(){return this.pos-this.start},$.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},$.QueryLexer.prototype.backup=function(){this.pos-=1},$.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=$.QueryLexer.EOS&&this.backup()},$.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit($.QueryLexer.TERM)),e.ignore(),e.more())return $.QueryLexer.lexText},$.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit($.QueryLexer.EDIT_DISTANCE),$.QueryLexer.lexText},$.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit($.QueryLexer.BOOST),$.QueryLexer.lexText},$.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit($.QueryLexer.TERM)},$.QueryLexer.termSeparator=$.tokenizer.separator,$.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==$.QueryLexer.EOS)return $.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return $.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit($.QueryLexer.TERM),$.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit($.QueryLexer.TERM),$.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit($.QueryLexer.PRESENCE),$.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit($.QueryLexer.PRESENCE),$.QueryLexer.lexText;if(t.match($.QueryLexer.termSeparator))return $.QueryLexer.lexTerm}else e.escapeCharacter()}},$.QueryParser=function(e,t){this.lexer=new $.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},$.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=$.QueryParser.parseClause;e;)e=e(this);return this.query},$.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},$.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},$.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},$.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case $.QueryLexer.PRESENCE:return $.QueryParser.parsePresence;case $.QueryLexer.FIELD:return $.QueryParser.parseField;case $.QueryLexer.TERM:return $.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new $.QueryParseError(n,t.start,t.end)}},$.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=$.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=$.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new $.QueryParseError(n,t.start,t.end)}var i=e.peekLexeme();if(null==i){n="expecting term or field, found nothing";throw new $.QueryParseError(n,t.start,t.end)}switch(i.type){case $.QueryLexer.FIELD:return $.QueryParser.parseField;case $.QueryLexer.TERM:return $.QueryParser.parseTerm;default:n="expecting term or field, found '"+i.type+"'";throw new $.QueryParseError(n,i.start,i.end)}}},$.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),i="unrecognised field '"+t.str+"', possible fields: "+n;throw new $.QueryParseError(i,t.start,t.end)}e.currentClause.fields=[t.str];var r=e.peekLexeme();if(null==r){i="expecting term, found nothing";throw new $.QueryParseError(i,t.start,t.end)}if(r.type===$.QueryLexer.TERM)return $.QueryParser.parseTerm;i="expecting term, found '"+r.type+"'";throw new $.QueryParseError(i,r.start,r.end)}},$.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case $.QueryLexer.TERM:return e.nextClause(),$.QueryParser.parseTerm;case $.QueryLexer.FIELD:return e.nextClause(),$.QueryParser.parseField;case $.QueryLexer.EDIT_DISTANCE:return $.QueryParser.parseEditDistance;case $.QueryLexer.BOOST:return $.QueryParser.parseBoost;case $.QueryLexer.PRESENCE:return e.nextClause(),$.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+n.type+"'";throw new $.QueryParseError(i,n.start,n.end)}else e.nextClause()}},$.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var i="edit distance must be numeric";throw new $.QueryParseError(i,t.start,t.end)}e.currentClause.editDistance=n;var r=e.peekLexeme();if(null!=r)switch(r.type){case $.QueryLexer.TERM:return e.nextClause(),$.QueryParser.parseTerm;case $.QueryLexer.FIELD:return e.nextClause(),$.QueryParser.parseField;case $.QueryLexer.EDIT_DISTANCE:return $.QueryParser.parseEditDistance;case $.QueryLexer.BOOST:return $.QueryParser.parseBoost;case $.QueryLexer.PRESENCE:return e.nextClause(),$.QueryParser.parsePresence;default:i="Unexpected lexeme type '"+r.type+"'";throw new $.QueryParseError(i,r.start,r.end)}else e.nextClause()}},$.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var i="boost must be numeric";throw new $.QueryParseError(i,t.start,t.end)}e.currentClause.boost=n;var r=e.peekLexeme();if(null!=r)switch(r.type){case $.QueryLexer.TERM:return e.nextClause(),$.QueryParser.parseTerm;case $.QueryLexer.FIELD:return e.nextClause(),$.QueryParser.parseField;case $.QueryLexer.EDIT_DISTANCE:return $.QueryParser.parseEditDistance;case $.QueryLexer.BOOST:return $.QueryParser.parseBoost;case $.QueryLexer.PRESENCE:return e.nextClause(),$.QueryParser.parsePresence;default:i="Unexpected lexeme type '"+r.type+"'";throw new $.QueryParseError(i,r.start,r.end)}else e.nextClause()}},void 0===(r="function"==typeof(i=function(){return $})?i.call(t,n,t,e):i)||(e.exports=r)}()},8693(e,t,n){"use strict";var i="aaAttrs",r=n(6220),s=n(3718),o=n(4045),a=n(7748),u=n(2731),c=n(4499),l=n(819);function h(e){var t,n;if((e=e||{}).input||r.error("missing input"),this.isActivated=!1,this.debug=!!e.debug,this.autoselect=!!e.autoselect,this.autoselectOnBlur=!!e.autoselectOnBlur,this.openOnFocus=!!e.openOnFocus,this.minLength=r.isNumber(e.minLength)?e.minLength:1,this.autoWidth=void 0===e.autoWidth||!!e.autoWidth,this.clearOnSelected=!!e.clearOnSelected,this.tabAutocomplete=void 0===e.tabAutocomplete||!!e.tabAutocomplete,e.hint=!!e.hint,e.hint&&e.appendTo)throw new Error("[autocomplete.js] hint and appendTo options can't be used at the same time");this.css=e.css=r.mixin({},l,e.appendTo?l.appendTo:{}),this.cssClasses=e.cssClasses=r.mixin({},l.defaultClasses,e.cssClasses||{}),this.cssClasses.prefix=e.cssClasses.formattedPrefix=r.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix),this.listboxId=e.listboxId=[this.cssClasses.root,"listbox",r.getUniqueId()].join("-");var a=function(e){var t,n,o,a;t=s.element(e.input),n=s.element(c.wrapper.replace("%ROOT%",e.cssClasses.root)).css(e.css.wrapper),e.appendTo||"block"!==t.css("display")||"table"!==t.parent().css("display")||n.css("display","table-cell");var u=c.dropdown.replace("%PREFIX%",e.cssClasses.prefix).replace("%DROPDOWN_MENU%",e.cssClasses.dropdownMenu);o=s.element(u).css(e.css.dropdown).attr({role:"listbox",id:e.listboxId}),e.templates&&e.templates.dropdownMenu&&o.html(r.templatify(e.templates.dropdownMenu)());a=t.clone().css(e.css.hint).css(function(e){return{backgroundAttachment:e.css("background-attachment"),backgroundClip:e.css("background-clip"),backgroundColor:e.css("background-color"),backgroundImage:e.css("background-image"),backgroundOrigin:e.css("background-origin"),backgroundPosition:e.css("background-position"),backgroundRepeat:e.css("background-repeat"),backgroundSize:e.css("background-size")}}(t)),a.val("").addClass(r.className(e.cssClasses.prefix,e.cssClasses.hint,!0)).removeAttr("id name placeholder required").prop("readonly",!0).attr({"aria-hidden":"true",autocomplete:"off",spellcheck:"false",tabindex:-1}),a.removeData&&a.removeData();t.data(i,{"aria-autocomplete":t.attr("aria-autocomplete"),"aria-expanded":t.attr("aria-expanded"),"aria-owns":t.attr("aria-owns"),autocomplete:t.attr("autocomplete"),dir:t.attr("dir"),role:t.attr("role"),spellcheck:t.attr("spellcheck"),style:t.attr("style"),type:t.attr("type")}),t.addClass(r.className(e.cssClasses.prefix,e.cssClasses.input,!0)).attr({autocomplete:"off",spellcheck:!1,role:"combobox","aria-autocomplete":e.datasets&&e.datasets[0]&&e.datasets[0].displayKey?"both":"list","aria-expanded":"false","aria-label":e.ariaLabel,"aria-owns":e.listboxId}).css(e.hint?e.css.input:e.css.inputWithNoHint);try{t.attr("dir")||t.attr("dir","auto")}catch(l){}return n=e.appendTo?n.appendTo(s.element(e.appendTo).eq(0)).eq(0):t.wrap(n).parent(),n.prepend(e.hint?a:null).append(o),{wrapper:n,input:t,hint:a,menu:o}}(e);this.$node=a.wrapper;var u=this.$input=a.input;t=a.menu,n=a.hint,e.dropdownMenuContainer&&s.element(e.dropdownMenuContainer).css("position","relative").append(t.css("top","0")),u.on("blur.aa",function(e){var n=document.activeElement;r.isMsie()&&(t[0]===n||t[0].contains(n))&&(e.preventDefault(),e.stopImmediatePropagation(),r.defer(function(){u.focus()}))}),t.on("mousedown.aa",function(e){e.preventDefault()}),this.eventBus=e.eventBus||new o({el:u}),this.dropdown=new h.Dropdown({appendTo:e.appendTo,wrapper:this.$node,menu:t,datasets:e.datasets,templates:e.templates,cssClasses:e.cssClasses,minLength:this.minLength}).onSync("suggestionClicked",this._onSuggestionClicked,this).onSync("cursorMoved",this._onCursorMoved,this).onSync("cursorRemoved",this._onCursorRemoved,this).onSync("opened",this._onOpened,this).onSync("closed",this._onClosed,this).onSync("shown",this._onShown,this).onSync("empty",this._onEmpty,this).onSync("redrawn",this._onRedrawn,this).onAsync("datasetRendered",this._onDatasetRendered,this),this.input=new h.Input({input:u,hint:n}).onSync("focused",this._onFocused,this).onSync("blurred",this._onBlurred,this).onSync("enterKeyed",this._onEnterKeyed,this).onSync("tabKeyed",this._onTabKeyed,this).onSync("escKeyed",this._onEscKeyed,this).onSync("upKeyed",this._onUpKeyed,this).onSync("downKeyed",this._onDownKeyed,this).onSync("leftKeyed",this._onLeftKeyed,this).onSync("rightKeyed",this._onRightKeyed,this).onSync("queryChanged",this._onQueryChanged,this).onSync("whitespaceChanged",this._onWhitespaceChanged,this),this._bindKeyboardShortcuts(e),this._setLanguageDirection()}r.mixin(h.prototype,{_bindKeyboardShortcuts:function(e){if(e.keyboardShortcuts){var t=this.$input,n=[];r.each(e.keyboardShortcuts,function(e){"string"==typeof e&&(e=e.toUpperCase().charCodeAt(0)),n.push(e)}),s.element(document).keydown(function(e){var i=e.target||e.srcElement,r=i.tagName;if(!i.isContentEditable&&"INPUT"!==r&&"SELECT"!==r&&"TEXTAREA"!==r){var s=e.which||e.keyCode;-1!==n.indexOf(s)&&(t.focus(),e.stopPropagation(),e.preventDefault())}})}},_onSuggestionClicked:function(e,t){var n;(n=this.dropdown.getDatumForSuggestion(t))&&this._select(n,{selectionMethod:"click"})},_onCursorMoved:function(e,t){var n=this.dropdown.getDatumForCursor(),i=this.dropdown.getCurrentCursor().attr("id");this.input.setActiveDescendant(i),n&&(t&&this.input.setInputValue(n.value,!0),this.eventBus.trigger("cursorchanged",n.raw,n.datasetName))},_onCursorRemoved:function(){this.input.resetInputValue(),this._updateHint(),this.eventBus.trigger("cursorremoved")},_onDatasetRendered:function(){this._updateHint(),this.eventBus.trigger("updated")},_onOpened:function(){this._updateHint(),this.input.expand(),this.eventBus.trigger("opened")},_onEmpty:function(){this.eventBus.trigger("empty")},_onRedrawn:function(){this.$node.css("top","0px"),this.$node.css("left","0px");var e=this.$input[0].getBoundingClientRect();this.autoWidth&&this.$node.css("width",e.width+"px");var t=this.$node[0].getBoundingClientRect(),n=e.bottom-t.top;this.$node.css("top",n+"px");var i=e.left-t.left;this.$node.css("left",i+"px"),this.eventBus.trigger("redrawn")},_onShown:function(){this.eventBus.trigger("shown"),this.autoselect&&this.dropdown.cursorTopSuggestion()},_onClosed:function(){this.input.clearHint(),this.input.removeActiveDescendant(),this.input.collapse(),this.eventBus.trigger("closed")},_onFocused:function(){if(this.isActivated=!0,this.openOnFocus){var e=this.input.getQuery();e.length>=this.minLength?this.dropdown.update(e):this.dropdown.empty(),this.dropdown.open()}},_onBlurred:function(){var e,t;e=this.dropdown.getDatumForCursor(),t=this.dropdown.getDatumForTopSuggestion();var n={selectionMethod:"blur"};this.debug||(this.autoselectOnBlur&&e?this._select(e,n):this.autoselectOnBlur&&t?this._select(t,n):(this.isActivated=!1,this.dropdown.empty(),this.dropdown.close()))},_onEnterKeyed:function(e,t){var n,i;n=this.dropdown.getDatumForCursor(),i=this.dropdown.getDatumForTopSuggestion();var r={selectionMethod:"enterKey"};n?(this._select(n,r),t.preventDefault()):this.autoselect&&i&&(this._select(i,r),t.preventDefault())},_onTabKeyed:function(e,t){if(this.tabAutocomplete){var n;(n=this.dropdown.getDatumForCursor())?(this._select(n,{selectionMethod:"tabKey"}),t.preventDefault()):this._autocomplete(!0)}else this.dropdown.close()},_onEscKeyed:function(){this.dropdown.close(),this.input.resetInputValue()},_onUpKeyed:function(){var e=this.input.getQuery();this.dropdown.isEmpty&&e.length>=this.minLength?this.dropdown.update(e):this.dropdown.moveCursorUp(),this.dropdown.open()},_onDownKeyed:function(){var e=this.input.getQuery();this.dropdown.isEmpty&&e.length>=this.minLength?this.dropdown.update(e):this.dropdown.moveCursorDown(),this.dropdown.open()},_onLeftKeyed:function(){"rtl"===this.dir&&this._autocomplete()},_onRightKeyed:function(){"ltr"===this.dir&&this._autocomplete()},_onQueryChanged:function(e,t){this.input.clearHintIfInvalid(),t.length>=this.minLength?this.dropdown.update(t):this.dropdown.empty(),this.dropdown.open(),this._setLanguageDirection()},_onWhitespaceChanged:function(){this._updateHint(),this.dropdown.open()},_setLanguageDirection:function(){var e=this.input.getLanguageDirection();this.dir!==e&&(this.dir=e,this.$node.css("direction",e),this.dropdown.setLanguageDirection(e))},_updateHint:function(){var e,t,n,i,s;(e=this.dropdown.getDatumForTopSuggestion())&&this.dropdown.isVisible()&&!this.input.hasOverflow()?(t=this.input.getInputValue(),n=a.normalizeQuery(t),i=r.escapeRegExChars(n),(s=new RegExp("^(?:"+i+")(.+$)","i").exec(e.value))?this.input.setHint(t+s[1]):this.input.clearHint()):this.input.clearHint()},_autocomplete:function(e){var t,n,i,r;t=this.input.getHint(),n=this.input.getQuery(),i=e||this.input.isCursorAtEnd(),t&&n!==t&&i&&((r=this.dropdown.getDatumForTopSuggestion())&&this.input.setInputValue(r.value),this.eventBus.trigger("autocompleted",r.raw,r.datasetName))},_select:function(e,t){void 0!==e.value&&this.input.setQuery(e.value),this.clearOnSelected?this.setVal(""):this.input.setInputValue(e.value,!0),this._setLanguageDirection(),!1===this.eventBus.trigger("selected",e.raw,e.datasetName,t).isDefaultPrevented()&&(this.dropdown.close(),r.defer(r.bind(this.dropdown.empty,this.dropdown)))},open:function(){if(!this.isActivated){var e=this.input.getInputValue();e.length>=this.minLength?this.dropdown.update(e):this.dropdown.empty()}this.dropdown.open()},close:function(){this.dropdown.close()},setVal:function(e){e=r.toStr(e),this.isActivated?this.input.setInputValue(e):(this.input.setQuery(e),this.input.setInputValue(e,!0)),this._setLanguageDirection()},getVal:function(){return this.input.getQuery()},destroy:function(){this.input.destroy(),this.dropdown.destroy(),function(e,t){var n=e.find(r.className(t.prefix,t.input));r.each(n.data(i),function(e,t){void 0===e?n.removeAttr(t):n.attr(t,e)}),n.detach().removeClass(r.className(t.prefix,t.input,!0)).insertAfter(e),n.removeData&&n.removeData(i);e.remove()}(this.$node,this.cssClasses),this.$node=null},getWrapper:function(){return this.dropdown.$container[0]}}),h.Dropdown=u,h.Input=a,h.sources=n(4710),e.exports=h},9110(e,t){!function(e){var t=/\S/,n=/\"/g,i=/\n/g,r=/\r/g,s=/\\/g,o=/\u2028/,a=/\u2029/;function u(e){"}"===e.n.substr(e.n.length-1)&&(e.n=e.n.substring(0,e.n.length-1))}function c(e){return e.trim?e.trim():e.replace(/^\s*|\s*$/g,"")}function l(e,t,n){if(t.charAt(n)!=e.charAt(0))return!1;for(var i=1,r=e.length;i":7,"=":8,_v:9,"{":10,"&":11,_t:12},e.scan=function(n,i){var r=n.length,s=0,o=null,a=null,h="",p=[],f=!1,d=0,g=0,m="{{",y="}}";function v(){h.length>0&&(p.push({tag:"_t",text:new String(h)}),h="")}function x(n,i){if(v(),n&&function(){for(var n=!0,i=g;i"==r.tag&&(r.indent=p[s].text.toString()),p.splice(s,1));else i||p.push({tag:"\n"});f=!1,g=p.length}function b(e,t){var n="="+y,i=e.indexOf(n,t),r=c(e.substring(e.indexOf("=",t)+1,i)).split(" ");return m=r[0],y=r[r.length-1],i+n.length-1}for(i&&(i=i.split(" "),m=i[0],y=i[1]),d=0;d0;){if(u=t.shift(),s&&"<"==s.tag&&!(u.tag in h))throw new Error("Illegal content in < super tag.");if(e.tags[u.tag]<=e.tags.$||f(u,r))i.push(u),u.nodes=p(t,u.tag,i,r);else{if("/"==u.tag){if(0===i.length)throw new Error("Closing tag without opener: /"+u.n);if(a=i.pop(),u.n!=a.n&&!d(u.n,a.n,r))throw new Error("Nesting error: "+a.n+" vs. "+u.n);return a.end=u.i,o}"\n"==u.tag&&(u.last=0==t.length||"\n"==t[0].tag)}o.push(u)}if(i.length>0)throw new Error("missing closing tag: "+i.pop().n);return o}function f(e,t){for(var n=0,i=t.length;n":x,"<":function(t,n){var i={partials:{},code:"",subs:{},inPartial:!0};e.walk(t.nodes,i);var r=n.partials[x(t,n)];r.subs=i.subs,r.partials=i.partials},$:function(t,n){var i={subs:{},code:"",partials:n.partials,prefix:t.n};e.walk(t.nodes,i),n.subs[t.n]=i.code,n.inPartial||(n.code+='t.sub("'+y(t.n)+'",c,p,i);')},"\n":function(e,t){t.code+=w('"\\n"'+(e.last?"":" + i"))},_v:function(e,t){t.code+="t.b(t.v(t."+v(e.n)+'("'+y(e.n)+'",c,p,0)));'},_t:function(e,t){t.code+=w('"'+y(e.text)+'"')},"{":b,"&":b},e.walk=function(t,n){for(var i,r=0,s=t.length;r"+t(e)+"

"}}(e.templates,this.displayFn),this.css=o.mixin({},c,e.appendTo?c.appendTo:{}),this.cssClasses=e.cssClasses=o.mixin({},c.defaultClasses,e.cssClasses||{}),this.cssClasses.prefix=e.cssClasses.formattedPrefix||o.formatPrefix(this.cssClasses.prefix,this.cssClasses.noPrefix);var n=o.className(this.cssClasses.prefix,this.cssClasses.dataset);this.$el=e.$menu&&e.$menu.find(n+"-"+this.name).length>0?a.element(e.$menu.find(n+"-"+this.name)[0]):a.element(u.dataset.replace("%CLASS%",this.name).replace("%PREFIX%",this.cssClasses.prefix).replace("%DATASET%",this.cssClasses.dataset)),this.$menu=e.$menu,this.clearCachedSuggestions()}h.extractDatasetName=function(e){return a.element(e).data(i)},h.extractValue=function(e){return a.element(e).data(r)},h.extractDatum=function(e){var t=a.element(e).data(s);return"string"==typeof t&&(t=JSON.parse(t)),t},o.mixin(h.prototype,l,{_render:function(e,t){if(this.$el){var n,c=this,l=[].slice.call(arguments,2);if(this.$el.empty(),n=t&&t.length,this._isEmpty=!n,!n&&this.templates.empty)this.$el.html(function(){var t=[].slice.call(arguments,0);return t=[{query:e,isEmpty:!0}].concat(t),c.templates.empty.apply(this,t)}.apply(this,l)).prepend(c.templates.header?h.apply(this,l):null).append(c.templates.footer?p.apply(this,l):null);else if(n)this.$el.html(function(){var e,n,l=[].slice.call(arguments,0),h=this,p=u.suggestions.replace("%PREFIX%",this.cssClasses.prefix).replace("%SUGGESTIONS%",this.cssClasses.suggestions);return e=a.element(p).css(this.css.suggestions),n=o.map(t,f),e.append.apply(e,n),e;function f(e){var t,n=u.suggestion.replace("%PREFIX%",h.cssClasses.prefix).replace("%SUGGESTION%",h.cssClasses.suggestion);return(t=a.element(n).attr({role:"option",id:["option",Math.floor(1e8*Math.random())].join("-")}).append(c.templates.suggestion.apply(this,[e].concat(l)))).data(i,c.name),t.data(r,c.displayFn(e)||void 0),t.data(s,JSON.stringify(e)),t.children().each(function(){a.element(this).css(h.css.suggestionChild)}),t}}.apply(this,l)).prepend(c.templates.header?h.apply(this,l):null).append(c.templates.footer?p.apply(this,l):null);else if(t&&!Array.isArray(t))throw new TypeError("suggestions must be an array");this.$menu&&this.$menu.addClass(this.cssClasses.prefix+(n?"with":"without")+"-"+this.name).removeClass(this.cssClasses.prefix+(n?"without":"with")+"-"+this.name),this.trigger("rendered",e)}function h(){var t=[].slice.call(arguments,0);return t=[{query:e,isEmpty:!n}].concat(t),c.templates.header.apply(this,t)}function p(){var t=[].slice.call(arguments,0);return t=[{query:e,isEmpty:!n}].concat(t),c.templates.footer.apply(this,t)}},getRoot:function(){return this.$el},update:function(e){function t(t){if(!this.canceled&&e===this.query){var n=[].slice.call(arguments,1);this.cacheSuggestions(e,t,n),this._render.apply(this,[e,t].concat(n))}}if(this.query=e,this.canceled=!1,this.shouldFetchFromCache(e))t.apply(this,[this.cachedSuggestions].concat(this.cachedRenderExtraArgs));else{var n=this,i=function(){n.canceled||n.source(e,t.bind(n))};if(this.debounce){clearTimeout(this.debounceTimeout),this.debounceTimeout=setTimeout(function(){n.debounceTimeout=null,i()},this.debounce)}else i()}},cacheSuggestions:function(e,t,n){this.cachedQuery=e,this.cachedSuggestions=t,this.cachedRenderExtraArgs=n},shouldFetchFromCache:function(e){return this.cache&&this.cachedQuery===e&&this.cachedSuggestions&&this.cachedSuggestions.length},clearCachedSuggestions:function(){delete this.cachedQuery,delete this.cachedSuggestions,delete this.cachedRenderExtraArgs},cancel:function(){this.canceled=!0},clear:function(){this.$el&&(this.cancel(),this.$el.empty(),this.trigger("rendered",""))},isEmpty:function(){return this._isEmpty},destroy:function(){this.clearCachedSuggestions(),this.$el=null}}),e.exports=h},9549(e,t){!function(e){function t(e,t,n){var i;return t&&"object"==typeof t&&(void 0!==t[e]?i=t[e]:n&&t.get&&"function"==typeof t.get&&(i=t.get(e))),i}e.Template=function(e,t,n,i){e=e||{},this.r=e.code||this.r,this.c=n,this.options=i||{},this.text=t||"",this.partials=e.partials||{},this.subs=e.subs||{},this.buf=""},e.Template.prototype={r:function(e,t,n){return""},v:function(e){return e=u(e),a.test(e)?e.replace(n,"&").replace(i,"<").replace(r,">").replace(s,"'").replace(o,"""):e},t:u,render:function(e,t,n){return this.ri([e],t||{},n)},ri:function(e,t,n){return this.r(e,t,n)},ep:function(e,t){var n=this.partials[e],i=t[n.name];if(n.instance&&n.base==i)return n.instance;if("string"==typeof i){if(!this.c)throw new Error("No compiler available.");i=this.c.compile(i,this.options)}if(!i)return null;if(this.partials[e].base=i,n.subs){for(key in t.stackText||(t.stackText={}),n.subs)t.stackText[key]||(t.stackText[key]=void 0!==this.activeSub&&t.stackText[this.activeSub]?t.stackText[this.activeSub]:this.text);i=function(e,t,n,i,r,s){function o(){}function a(){}var u;o.prototype=e,a.prototype=e.subs;var c=new o;for(u in c.subs=new a,c.subsText={},c.buf="",i=i||{},c.stackSubs=i,c.subsText=s,t)i[u]||(i[u]=t[u]);for(u in i)c.subs[u]=i[u];for(u in r=r||{},c.stackPartials=r,n)r[u]||(r[u]=n[u]);for(u in r)c.partials[u]=r[u];return c}(i,n.subs,n.partials,this.stackSubs,this.stackPartials,t.stackText)}return this.partials[e].instance=i,i},rp:function(e,t,n,i){var r=this.ep(e,n);return r?r.ri(t,n,i):""},rs:function(e,t,n){var i=e[e.length-1];if(c(i))for(var r=0;r=0;u--)if(void 0!==(s=t(e,n[u],a))){o=!0;break}return o?(r||"function"!=typeof s||(s=this.mv(s,n,i)),s):!r&&""},ls:function(e,t,n,i,r){var s=this.options.delimiters;return this.options.delimiters=r,this.b(this.ct(u(e.call(t,i)),t,n)),this.options.delimiters=s,!1},ct:function(e,t,n){if(this.options.disableLambda)throw new Error("Lambda features disabled.");return this.c.compile(e,this.options).render(t,n)},b:function(e){this.buf+=e},fl:function(){var e=this.buf;return this.buf="",e},ms:function(e,t,n,i,r,s,o){var a,u=t[t.length-1],c=e.call(u);return"function"==typeof c?!!i||(a=this.activeSub&&this.subsText&&this.subsText[this.activeSub]?this.subsText[this.activeSub]:this.text,this.ls(c,u,n,a.substring(r,s),o)):c},mv:function(e,t,n){var i=t[t.length-1],r=e.call(i);return"function"==typeof r?this.ct(u(r.call(i)),i,n):r},sub:function(e,t,n,i){var r=this.subs[e];r&&(this.activeSub=e,r(t,n,this,i),this.activeSub=!1)}};var n=/&/g,i=//g,s=/\'/g,o=/\"/g,a=/[&<>\"\']/;function u(e){return String(null==e?"":e)}var c=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)}}(t)}}]); \ No newline at end of file diff --git a/docs/assets/js/4250.a201ce1c.js.LICENSE.txt b/docs/assets/js/4250.a201ce1c.js.LICENSE.txt deleted file mode 100644 index 1cf473c23ce..00000000000 --- a/docs/assets/js/4250.a201ce1c.js.LICENSE.txt +++ /dev/null @@ -1,61 +0,0 @@ -/*! - * lunr.Builder - * Copyright (C) 2020 Oliver Nightingale - */ - -/*! - * lunr.Index - * Copyright (C) 2020 Oliver Nightingale - */ - -/*! - * lunr.Pipeline - * Copyright (C) 2020 Oliver Nightingale - */ - -/*! - * lunr.Set - * Copyright (C) 2020 Oliver Nightingale - */ - -/*! - * lunr.TokenSet - * Copyright (C) 2020 Oliver Nightingale - */ - -/*! - * lunr.Vector - * Copyright (C) 2020 Oliver Nightingale - */ - -/*! - * lunr.stemmer - * Copyright (C) 2020 Oliver Nightingale - * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt - */ - -/*! - * lunr.stopWordFilter - * Copyright (C) 2020 Oliver Nightingale - */ - -/*! - * lunr.tokenizer - * Copyright (C) 2020 Oliver Nightingale - */ - -/*! - * lunr.trimmer - * Copyright (C) 2020 Oliver Nightingale - */ - -/*! - * lunr.utils - * Copyright (C) 2020 Oliver Nightingale - */ - -/** - * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 - * Copyright (C) 2020 Oliver Nightingale - * @license MIT - */ diff --git a/docs/assets/js/4291.9c7472fc.js b/docs/assets/js/4291.9c7472fc.js deleted file mode 100644 index a4dd750bc95..00000000000 --- a/docs/assets/js/4291.9c7472fc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[4291,6672],{4291(e,t,r){r.r(t),r.d(t,{getDatabase:()=>wa,hasIndexedDB:()=>ba});var a=r(7329);function n(e,t){var r=e.get(t);if(void 0===r)throw new Error("missing value from map "+t);return r}function i(e,t,r,a){var n=e.get(t);return void 0===n?(n=r(),e.set(t,n)):a&&a(n),n}function s(e){return Object.assign({},e)}function o(e,t=!1){if(!e)return e;if(!t&&Array.isArray(e))return e.sort((e,t)=>"string"==typeof e&&"string"==typeof t?e.localeCompare(t):"object"==typeof e?1:-1).map(e=>o(e,t));if("object"==typeof e&&!Array.isArray(e)){var r={};return Object.keys(e).sort((e,t)=>e.localeCompare(t)).forEach(a=>{r[a]=o(e[a],t)}),r}return e}var c=function e(t){if(!t)return t;if(null===t||"object"!=typeof t)return t;if(Array.isArray(t)){for(var r=new Array(t.length),a=r.length;a--;)r[a]=e(t[a]);return r}var n={};for(var i in t)n[i]=e(t[i]);return n};function u(e,t,r){return Object.defineProperty(e,t,{get:function(){return r}}),r}var h=e=>{var t=typeof e;return null!==e&&("object"===t||"function"===t)},l=new Set(["__proto__","prototype","constructor"]),d=new Set("0123456789");function m(e){var t=[],r="",a="start",n=!1;for(var i of e)switch(i){case"\\":if("index"===a)throw new Error("Invalid character in an index");if("indexEnd"===a)throw new Error("Invalid character after an index");n&&(r+=i),a="property",n=!n;break;case".":if("index"===a)throw new Error("Invalid character in an index");if("indexEnd"===a){a="property";break}if(n){n=!1,r+=i;break}if(l.has(r))return[];t.push(r),r="",a="property";break;case"[":if("index"===a)throw new Error("Invalid character in an index");if("indexEnd"===a){a="index";break}if(n){n=!1,r+=i;break}if("property"===a){if(l.has(r))return[];t.push(r),r=""}a="index";break;case"]":if("index"===a){t.push(Number.parseInt(r,10)),r="",a="indexEnd";break}if("indexEnd"===a)throw new Error("Invalid character after an index");default:if("index"===a&&!d.has(i))throw new Error("Invalid character in an index");if("indexEnd"===a)throw new Error("Invalid character after an index");"start"===a&&(a="property"),n&&(n=!1,r+="\\"),r+=i}switch(n&&(r+="\\"),a){case"property":if(l.has(r))return[];t.push(r);break;case"index":throw new Error("Index was not closed");case"start":t.push("")}return t}function f(e,t){if("number"!=typeof t&&Array.isArray(e)){var r=Number.parseInt(t,10);return Number.isInteger(r)&&e[r]===e[t]}return!1}function p(e,t){if(f(e,t))throw new Error("Cannot use string index")}function v(e,t,r){if(Array.isArray(t)&&(t=t.join(".")),!t.includes(".")&&!t.includes("["))return e[t];if(!h(e)||"string"!=typeof t)return void 0===r?e:r;var a=m(t);if(0===a.length)return r;for(var n=0;n!1,deepFreezeWhenDevMode:e=>e,tunnelErrorMessage:e=>"\n RxDB Error-Code: "+e+".\n Hint: Error messages are not included in RxDB core to reduce build size.\n To show the full error messages and to ensure that you do not make any mistakes when using RxDB,\n use the dev-mode plugin when you are in development mode: https://rxdb.info/dev-mode.html?console=error\n "};function _(e,t,r){return"\n"+e+"\n"+function(e){var t="";return 0===Object.keys(e).length?t:(t+="-".repeat(20)+"\n",t+="Parameters:\n",t+=Object.keys(e).map(t=>{var r="[object Object]";try{r="errors"===t?e[t].map(e=>JSON.stringify(e,Object.getOwnPropertyNames(e))):JSON.stringify(e[t],function(e,t){return void 0===t?null:t},2)}catch(a){}return t+": "+r}).join("\n"),t+="\n")}(r)}var k=function(e){function t(t,r,a={}){var n,i=_(r,0,a);return(n=e.call(this,i)||this).code=t,n.message=i,n.url=E(t),n.parameters=a,n.rxdb=!0,n}return(0,w.A)(t,e),t.prototype.toString=function(){return this.message},(0,b.A)(t,[{key:"name",get:function(){return"RxError ("+this.code+")"}},{key:"typeError",get:function(){return!1}}])}((0,D.A)(Error)),I=function(e){function t(t,r,a={}){var n,i=_(r,0,a);return(n=e.call(this,i)||this).code=t,n.message=i,n.url=E(t),n.parameters=a,n.rxdb=!0,n}return(0,w.A)(t,e),t.prototype.toString=function(){return this.message},(0,b.A)(t,[{key:"name",get:function(){return"RxTypeError ("+this.code+")"}},{key:"typeError",get:function(){return!0}}])}((0,D.A)(TypeError));function E(e){return"https://rxdb.info/errors.html?console=errors#"+e}function C(e){return"\nFind out more about this error here: "+E(e)+" \n"}function R(e,t){return new k(e,x.tunnelErrorMessage(e)+C(e),t)}function O(e,t){return new I(e,x.tunnelErrorMessage(e)+C(e),t)}function S(e){return!(!e||409!==e.status)&&e}var j={409:"document write conflict",422:"schema validation error",510:"attachment data missing"};function P(e){return R("COL20",{name:j[e.status],document:e.documentId,writeError:e})}var $=/\./g,N=r(8342);function B(e,t){var r=t;return r="properties."+(r=r.replace($,".properties.")),v(e,r=(0,N.L$)(r))}function M(e){return"string"==typeof e?e:e.key}function A(e,t){if("string"==typeof e.primaryKey)return t[e.primaryKey];var r=e.primaryKey;return r.fields.map(e=>{var r=v(t,e);if(void 0===r)throw R("DOC18",{args:{field:e,documentData:t}});return r}).join(r.separator)}function q(e){var t=M((e=s(e)).primaryKey);e.properties=s(e.properties),e.additionalProperties=!1,Object.prototype.hasOwnProperty.call(e,"keyCompression")||(e.keyCompression=!1),e.indexes=e.indexes?e.indexes.slice(0):[],e.required=e.required?e.required.slice(0):[],e.encrypted=e.encrypted?e.encrypted.slice(0):[],e.properties._rev={type:"string",minLength:1},e.properties._attachments={type:"object"},e.properties._deleted={type:"boolean"},e.properties._meta=T,e.required=e.required?e.required.slice(0):[],e.required.push("_deleted"),e.required.push("_rev"),e.required.push("_meta"),e.required.push("_attachments"),e.required.push(t),e.required=e.required.filter(e=>!e.includes(".")).filter((e,t,r)=>r.indexOf(e)===t),e.version=e.version||0;var r=e.indexes.map(e=>{var r=(0,g.k_)(e)?e.slice(0):[e];return r.includes(t)||r.push(t),"_deleted"!==r[0]&&r.unshift("_deleted"),r});0===r.length&&r.push(function(e){return["_deleted",e]}(t)),r.push(["_meta.lwt",t]),e.internalIndexes&&e.internalIndexes.map(e=>{r.push(e)});var a=new Set;return r.filter(e=>{var t=e.join(",");return!a.has(t)&&(a.add(t),!0)}),e.indexes=r,e}var T={type:"object",properties:{lwt:{type:"number",minimum:1,maximum:1e15,multipleOf:.01}},additionalProperties:!0,required:["lwt"]};var L="docs",Q="changes",W="attachments",F="dexie",H=new Map,K=new Map;var z="__";function Z(e){var t=e.split(".");if(t.length>1)return t.map(e=>Z(e)).join(".");if(e.startsWith("|")){var r=e.substring(1);return z+r}return e}function U(e){var t=e.split(".");return t.length>1?t.map(e=>U(e)).join("."):e.startsWith(z)?"|"+e.substring(2):e}function V(e,t){if(!t)return t;var r=s(t);return r=G(r),e.forEach(e=>{var a=v(t,e)?"1":"0",n=Z(e);y(r,n,a)}),r}function J(e,t){return t?(t=X(t=s(t)),e.forEach(e=>{var r=v(t,e);y(t,e,"1"===r)}),t):t}function G(e){if(!e||"string"==typeof e||"number"==typeof e||"boolean"==typeof e)return e;if(Array.isArray(e))return e.map(e=>G(e));if("object"==typeof e){var t={};return Object.entries(e).forEach(([e,r])=>{"object"==typeof r&&(r=G(r)),t[Z(e)]=r}),t}}function X(e){if(!e||"string"==typeof e||"number"==typeof e||"boolean"==typeof e)return e;if(Array.isArray(e))return e.map(e=>X(e));if("object"==typeof e){var t={};return Object.entries(e).forEach(([r,a])=>{("object"==typeof a||Array.isArray(e))&&(a=X(a)),t[U(r)]=a}),t}}function Y(e){var t=[],r=M(e.primaryKey);t.push([r]),t.push(["_deleted",r]),e.indexes&&e.indexes.forEach(e=>{var r=(0,g.$r)(e);t.push(r)}),t.push(["_meta.lwt",r]),t.push(["_meta.lwt"]);var a=(t=t.map(e=>e.map(e=>Z(e)))).map(e=>1===e.length?e[0]:"["+e.join("+")+"]");return(a=a.filter((e,t,r)=>r.indexOf(e)===t)).join(", ")}async function ee(e,t){var r=await e;return(await r.dexieTable.bulkGet(t)).map(e=>J(r.booleanIndexes,e))}function te(e,t){return e+"||"+t}function re(e){var t=new Set,r=[];return e.indexes?(e.indexes.forEach(a=>{(0,g.$r)(a).forEach(a=>{t.has(a)||(t.add(a),"boolean"===B(e,a).type&&r.push(a))})}),r.push("_deleted"),(0,g.jw)(r)):r}var ae=r(9092),ne=0;function ie(){var e=Date.now();(e+=.01)<=ne&&(e=ne+.01);var t=parseFloat(e.toFixed(2));return ne=t,t}var se,oe={};var ce=async function(e){var t=(new TextEncoder).encode(e),r=await function(){if(se)return se;if("undefined"==typeof crypto||void 0===crypto.subtle||"function"!=typeof crypto.subtle.digest)throw R("UT8",{args:{typeof_crypto:typeof crypto,typeof_crypto_subtle:typeof crypto?.subtle,typeof_crypto_subtle_digest:typeof crypto?.subtle?.digest}});return se=crypto.subtle.digest.bind(crypto.subtle)}()("SHA-256",t);return Array.prototype.map.call(new Uint8Array(r),e=>("00"+e.toString(16)).slice(-2)).join("")};var ue=r(4134),he=ue.Dr,le=!1;async function de(){return le?he:(le=!0,he=(async()=>!(!oe.premium||"string"!=typeof oe.premium||"6da4936d1425ff3a5c44c02342c6daf791d266be3ae8479b8ec59e261df41b93"!==await ce(oe.premium)))())}var me=r(3337),fe=String.fromCharCode(65535),pe=Number.MIN_SAFE_INTEGER;function ve(e,t){var r=t.selector,a=e.indexes?e.indexes.slice(0):[];t.index&&(a=[t.index]);var n=!!t.sort.find(e=>"desc"===Object.values(e)[0]),i=new Set;Object.keys(r).forEach(t=>{var a=B(e,t);a&&"boolean"===a.type&&Object.prototype.hasOwnProperty.call(r[t],"$eq")&&i.add(t)});var s,o=t.sort.map(e=>Object.keys(e)[0]).filter(e=>!i.has(e)).join(","),c=-1;if(a.forEach(e=>{var a=!0,u=!0,h=e.map(e=>{var t=r[e],n=t?Object.keys(t):[],i={};t&&n.length?n.forEach(e=>{if(ye.has(e)){var r=function(e,t){switch(e){case"$eq":return{startKey:t,endKey:t,inclusiveEnd:!0,inclusiveStart:!0};case"$lte":return{endKey:t,inclusiveEnd:!0};case"$gte":return{startKey:t,inclusiveStart:!0};case"$lt":return{endKey:t,inclusiveEnd:!1};case"$gt":return{startKey:t,inclusiveStart:!1};default:throw new Error("SNH")}}(e,t[e]);i=Object.assign(i,r)}}):i={startKey:u?pe:fe,endKey:a?fe:pe,inclusiveStart:!0,inclusiveEnd:!0};return void 0===i.startKey&&(i.startKey=pe),void 0===i.endKey&&(i.endKey=fe),void 0===i.inclusiveStart&&(i.inclusiveStart=!0),void 0===i.inclusiveEnd&&(i.inclusiveEnd=!0),u&&!i.inclusiveStart&&(u=!1),a&&!i.inclusiveEnd&&(a=!1),i}),l=h.map(e=>e.startKey),d=h.map(e=>e.endKey),m={index:e,startKeys:l,endKeys:d,inclusiveEnd:a,inclusiveStart:u,sortSatisfiedByIndex:!n&&o===e.filter(e=>!i.has(e)).join(","),selectorSatisfiedByIndex:we(e,t.selector,l,d)},f=function(e,t,r){var a=0,n=e=>{e>0&&(a+=e)},i=10,s=(0,g.Sd)(r.startKeys,e=>e!==pe&&e!==fe);n(s*i);var o=(0,g.Sd)(r.startKeys,e=>e!==fe&&e!==pe);n(o*i);var c=(0,g.Sd)(r.startKeys,(e,t)=>e===r.endKeys[t]);n(c*i*1.5);var u=r.sortSatisfiedByIndex?5:0;return n(u),a}(0,0,m);(f>=c||t.index)&&(c=f,s=m)}),!s)throw R("SNH",{query:t});return s}var ye=new Set(["$eq","$gt","$gte","$lt","$lte"]),ge=new Set(["$eq","$gt","$gte"]),be=new Set(["$eq","$lt","$lte"]);function we(e,t,r,a){var n=Object.entries(t).find(([t,r])=>!e.includes(t)||Object.entries(r).find(([e,t])=>!ye.has(e)));if(n)return!1;if(t.$and||t.$or)return!1;var i=[],s=new Set;for(var[o,c]of Object.entries(t)){if(!e.includes(o))return!1;var u=Object.keys(c).filter(e=>ge.has(e));if(u.length>1)return!1;var h=u[0];if(h&&s.add(o),"$eq"!==h){if(i.length>0)return!1;i.push(h)}}var l=[],d=new Set;for(var[m,f]of Object.entries(t)){if(!e.includes(m))return!1;var p=Object.keys(f).filter(e=>be.has(e));if(p.length>1)return!1;var v=p[0];if(v&&d.add(m),"$eq"!==v){if(l.length>0)return!1;l.push(v)}}var y=0;for(var g of e){for(var b of[s,d]){if(!b.has(g)&&b.size>0)return!1;b.delete(g)}if(r[y]!==a[y]&&s.size>0&&d.size>0)return!1;y++}return!0}var De,xe=r(2235),_e=r(4953),ke=r(1621),Ie=r(4192),Ee=r(695),Ce=r(2830),Re=r(2080),Oe=r(175),Se=r(8259),je=r(5912),Pe=r(6729),$e=r(6529),Ne=r(2226),Be=r(3697),Me=r(558),Ae=r(2583),qe=r(9283),Te=r(5629),Le=r(4612),Qe=r(5805),We=r(3587),Fe=r(1401),He=r(7531),Ke=!1;function ze(e){return Ke||(De=_e.ob.init({pipeline:{$sort:Ie.x,$project:Ee.C},query:{$elemMatch:Ce.J,$eq:Re.X,$nor:Oe.q,$exists:Se.P,$regex:je.W,$and:Pe.a,$gt:$e.M,$gte:Ne.f,$in:Be.o,$lt:Me.N,$lte:Ae.Q,$ne:qe.C,$nin:Te.G,$mod:Le.P,$not:Qe.E,$or:We.s,$size:Fe.I,$type:He.T}}),Ke=!0),new ke.X(e,{context:De})}function Ze(e,t){var r=M(e.primaryKey);t=s(t);var a=c(t);if("number"!=typeof a.skip&&(a.skip=0),a.selector?(a.selector=a.selector,Object.entries(a.selector).forEach(([e,t])=>{"object"==typeof t&&null!==t||(a.selector[e]={$eq:t})})):a.selector={},a.index){var n=(0,g.$r)(a.index);n.includes(r)||n.push(r),a.index=n}if(a.sort)a.sort.find(e=>{return t=e,Object.keys(t)[0]===r;var t})||(a.sort=a.sort.slice(0),a.sort.push({[r]:"asc"}));else if(a.index)a.sort=a.index.map(e=>({[e]:"asc"}));else{if(e.indexes){var i=new Set;Object.entries(a.selector).forEach(([e,t])=>{("object"!=typeof t||null===t||!!Object.keys(t).find(e=>ye.has(e)))&&i.add(e)});var o,u=-1;e.indexes.forEach(e=>{var t=(0,g.k_)(e)?e:[e],r=t.findIndex(e=>!i.has(e));r>0&&r>u&&(u=r,o=t)}),o&&(a.sort=o.map(e=>({[e]:"asc"})))}if(!a.sort)if(e.indexes&&e.indexes.length>0){var h=e.indexes[0],l=(0,g.k_)(h)?h:[h];a.sort=l.map(e=>({[e]:"asc"}))}else a.sort=[{[r]:"asc"}]}return a}function Ue(e,t){if(!t.sort)throw R("SNH",{query:t});var r=[];t.sort.forEach(e=>{var t,a,n,i=Object.keys(e)[0],s=Object.values(e)[0];r.push({key:i,direction:s,getValueFn:(t=i,a=t.split("."),n=a.length,1===n?e=>e[t]:e=>{for(var t=e,r=0;r{for(var a=0;ar.test(e)}async function Je(e,t){var r=await e.exec();return r?Array.isArray(r)?Promise.all(r.map(e=>t(e))):r instanceof Map?Promise.all([...r.values()].map(e=>t(e))):await t(r):null}function Ge(e,t){if(!t.sort)throw R("SNH",{query:t});return{query:t,queryPlan:ve(e,t)}}function Xe(e){return e===pe?-1/0:e}function Ye(e,t,r){return e.includes(t)?r===fe||!0===r?"1":"0":r}function et(e,t,r){if(!r){if("undefined"==typeof window)throw new Error("IDBKeyRange missing");r=window.IDBKeyRange}var a=t.startKeys.map((r,a)=>{var n=t.index[a];return Ye(e,n,r)}).map(Xe),n=t.endKeys.map((r,a)=>{var n=t.index[a];return Ye(e,n,r)}).map(Xe);return r.bound(a,n,!t.inclusiveStart,!t.inclusiveEnd)}async function tt(e,t){var r=await e.internals,a=t.query,n=a.skip?a.skip:0,i=n+(a.limit?a.limit:1/0),s=t.queryPlan,o=!1;s.selectorSatisfiedByIndex||(o=Ve(e.schema,t.query));var c=et(r.booleanIndexes,s,r.dexieDb._options.IDBKeyRange),u=s.index,h=[];if(await r.dexieDb.transaction("r",r.dexieTable,async e=>{var t,a=e.idbtrans.objectStore(L);t="["+u.map(e=>Z(e)).join("+")+"]";var n=a.index(t).openCursor(c);await new Promise(e=>{n.onsuccess=function(t){var a=t.target.result;if(a){var n=J(r.booleanIndexes,a.value);o&&!o(n)||h.push(n),s.sortSatisfiedByIndex&&h.length===i?e():a.continue()}else e()}})}),!s.sortSatisfiedByIndex){var l=Ue(e.schema,t.query);h=h.sort(l)}return{documents:h=h.slice(n,i)}}function rt(e){for(var t="",r=0;r0&&nt[e].forEach(e=>e(t))}async function st(e,t){for(var r of nt[e])await r(t)}async function ot(e,t){var r=(await e.findDocumentsById([t],!1))[0];return r||void 0}async function ct(e,t,r){var a=await e.bulkWrite([t],r);if(a.error.length>0)throw a.error[0];return vt(M(e.schema.primaryKey),[t],a)[0]}function ut(e,t,r,a){if(a)throw 409===a.status?R("CONFLICT",{collection:e.name,id:t,writeError:a,data:r}):422===a.status?R("VD2",{collection:e.name,id:t,writeError:a,data:r}):a}function ht(e){return{previous:e.previous,document:lt(e.document)}}function lt(e){if(!e._attachments||0===Object.keys(e._attachments).length)return e;var t=s(e);return t._attachments={},Object.entries(e._attachments).forEach(([e,r])=>{var a,n,i;t._attachments[e]=(i=(a=r).data)?{length:(n=i,atob(n).length),digest:a.digest,type:a.type}:a}),t}function dt(e){return Object.assign({},e,{_meta:s(e._meta)})}function mt(e,t,r){x.deepFreezeWhenDevMode(r);var a=M(t.schema.primaryKey),n={originalStorageInstance:t,schema:t.schema,internals:t.internals,collectionName:t.collectionName,databaseName:t.databaseName,options:t.options,async bulkWrite(r,n){for(var i=e.token,s=new Array(r.length),o=ie(),c=0;ct.bulkWrite(s,n)),m={error:[]};ft.set(m,s);var f=0===d.error.length?[]:d.error.filter(e=>!(409!==e.status||e.writeRow.previous||e.writeRow.document._deleted||!(0,me.ZN)(e.documentInDb)._deleted)||(m.error.push(e),!1));if(f.length>0){var p=new Set,v=f.map(t=>(p.add(t.documentId),{previous:t.documentInDb,document:Object.assign({},t.writeRow.document,{_rev:at(e.token,t.documentInDb)})})),y=await e.lockedRun(()=>t.bulkWrite(v,n));m.error=m.error.concat(y.error);var g=vt(a,s,m,p),b=vt(a,v,y);return g.push(...b),m}return m},query:r=>e.lockedRun(()=>t.query(r)),count:r=>e.lockedRun(()=>t.count(r)),findDocumentsById:(r,a)=>e.lockedRun(()=>t.findDocumentsById(r,a)),getAttachmentData:(r,a,n)=>e.lockedRun(()=>t.getAttachmentData(r,a,n)),getChangedDocumentsSince:t.getChangedDocumentsSince?(r,a)=>e.lockedRun(()=>t.getChangedDocumentsSince((0,me.ZN)(r),a)):void 0,cleanup:r=>e.lockedRun(()=>t.cleanup(r)),remove:()=>(e.storageInstances.delete(n),e.lockedRun(()=>t.remove())),close:()=>(e.storageInstances.delete(n),e.lockedRun(()=>t.close())),changeStream:()=>t.changeStream()};return e.storageInstances.add(n),n}var ft=new WeakMap,pt=new WeakMap;function vt(e,t,r,a){return i(pt,r,()=>{var n=[],i=ft.get(r);if(i||(i=t),r.error.length>0||a){for(var s=a||new Set,o=0;o{r.storageName===e&&r.databaseName===t.databaseName&&r.collectionName===t.collectionName&&r.version===t.schema.version&&i.next(r.eventBulk)};n.addEventListener("message",s);var o=r.changeStream(),c=!1,u=o.subscribe(r=>{c||n.postMessage({storageName:e,databaseName:t.databaseName,collectionName:t.collectionName,version:t.schema.version,eventBulk:r})});r.changeStream=function(){return i.asObservable().pipe((0,yt.X)(o))};var h=r.close.bind(r);r.close=async function(){return c=!0,u.unsubscribe(),n.removeEventListener("message",s),a||await wt(t.databaseInstanceToken,r),h()};var l=r.remove.bind(r);r.remove=async function(){return c=!0,u.unsubscribe(),n.removeEventListener("message",s),a||await wt(t.databaseInstanceToken,r),l()}}}var xt=ie(),_t=!1,kt=function(){function e(e,t,r,a,n,i,s,o){this.changes$=new ae.B,this.instanceId=xt++,this.storage=e,this.databaseName=t,this.collectionName=r,this.schema=a,this.internals=n,this.options=i,this.settings=s,this.devMode=o,this.primaryPath=M(this.schema.primaryKey)}var t=e.prototype;return t.bulkWrite=async function(e,t){Et(this),_t||await de()||console.warn(["-------------- RxDB Open Core RxStorage -------------------------------","You are using the free Dexie.js based RxStorage implementation from RxDB https://rxdb.info/rx-storage-dexie.html?console=dexie ","While this is a great option, we want to let you know that there are faster storage solutions available in our premium plugins.","For professional users and production environments, we highly recommend considering these premium options to enhance performance and reliability."," https://rxdb.info/premium/?console=dexie ","If you already purchased premium access you can disable this log by calling the setPremiumFlag() function from rxdb-premium/plugins/shared.","---------------------------------------------------------------------"].join("\n")),_t=!0,e.forEach(e=>{if(!e.document._rev||e.previous&&!e.previous._rev)throw R("SNH",{args:{row:e}})});var r=await this.internals,a={error:[]};this.devMode&&(e=e.map(e=>{var t=dt(e.document);return{previous:e.previous,document:t}}));var n,i=e.map(e=>e.document[this.primaryPath]);if(await r.dexieDb.transaction("rw",r.dexieTable,r.dexieAttachmentsTable,async()=>{var s=new Map;(await ee(this.internals,i)).forEach(e=>{var t=e;return t&&s.set(t[this.primaryPath],t),t}),n=function(e,t,r,a,n,i,s){for(var o,c=!!e.schema.attachments,u=[],h=[],l=[],d={id:(0,N.zs)(10),events:[],checkpoint:null,context:n},m=d.events,f=[],p=[],v=[],y=r.size>0,g=a.length,b=function(){var e,d=a[w],g=d.document,b=d.previous,D=g[t],x=g._deleted,_=b&&b._deleted,k=void 0;if(y&&(k=r.get(D)),k){var I=k._rev;if(!b||b&&I!==b._rev){var E={isError:!0,status:409,documentId:D,writeRow:d,documentInDb:k,context:n};return l.push(E),1}var C=c?ht(d):d;c&&(x?b&&Object.keys(b._attachments).forEach(e=>{p.push({documentId:D,attachmentId:e,digest:(0,me.ZN)(b)._attachments[e].digest})}):(Object.entries(g._attachments).find(([t,r])=>((b?b._attachments[t]:void 0)||r.data||(e={documentId:D,documentInDb:k,isError:!0,status:510,writeRow:d,attachmentId:t,context:n}),!0)),e||Object.entries(g._attachments).forEach(([e,t])=>{var r=b?b._attachments[e]:void 0;if(r){var a=C.document._attachments[e].digest;t.data&&r.digest!==a&&v.push({documentId:D,attachmentId:e,attachmentData:t,digest:t.digest})}else f.push({documentId:D,attachmentId:e,attachmentData:t,digest:t.digest})}))),e?l.push(e):(c?(h.push(ht(C)),s&&s(g)):(h.push(C),s&&s(g)),o=C);var O=null,S=null,j=null;if(_&&!x)j="INSERT",O=c?lt(g):g;else if(!b||_||x){if(!x)throw R("SNH",{args:{writeRow:d}});j="DELETE",O=(0,me.ZN)(g),S=b}else j="UPDATE",O=c?lt(g):g,S=b;var P={documentId:D,documentData:O,previousDocumentData:S,operation:j};m.push(P)}else{var $=!!x;if(c&&Object.entries(g._attachments).forEach(([t,r])=>{r.data?f.push({documentId:D,attachmentId:t,attachmentData:r,digest:r.digest}):(e={documentId:D,isError:!0,status:510,writeRow:d,attachmentId:t,context:n},l.push(e))}),e||(c?(u.push(ht(d)),i&&i(g)):(u.push(d),i&&i(g)),o=d),!$){var N={documentId:D,operation:"INSERT",documentData:c?lt(g):g,previousDocumentData:c&&b?lt(b):b};m.push(N)}}},w=0;w{o.push(e.document)}),n.bulkUpdateDocs.forEach(e=>{o.push(e.document)}),(o=o.map(e=>V(r.booleanIndexes,e))).length>0&&await r.dexieTable.bulkPut(o);var c=[];n.attachmentsAdd.forEach(e=>{c.push({id:te(e.documentId,e.attachmentId),data:e.attachmentData.data})}),n.attachmentsUpdate.forEach(e=>{c.push({id:te(e.documentId,e.attachmentId),data:e.attachmentData.data})}),await r.dexieAttachmentsTable.bulkPut(c),await r.dexieAttachmentsTable.bulkDelete(n.attachmentsRemove.map(e=>te(e.documentId,e.attachmentId)))}),(n=(0,me.ZN)(n)).eventBulk.events.length>0){var s=(0,me.ZN)(n.newestRow).document;n.eventBulk.checkpoint={id:s[this.primaryPath],lwt:s._meta.lwt},this.changes$.next(n.eventBulk)}return a},t.findDocumentsById=async function(e,t){Et(this);var r=await this.internals,a=[];return await r.dexieDb.transaction("r",r.dexieTable,async()=>{(await ee(this.internals,e)).forEach(e=>{!e||e._deleted&&!t||a.push(e)})}),a},t.query=function(e){return Et(this),tt(this,e)},t.count=async function(e){if(e.queryPlan.selectorSatisfiedByIndex){var t=await async function(e,t){var r=await e.internals,a=t.queryPlan,n=a.index,i=et(r.booleanIndexes,a,r.dexieDb._options.IDBKeyRange),s=-1;return await r.dexieDb.transaction("r",r.dexieTable,async e=>{var t,r=e.idbtrans.objectStore(L);t="["+n.map(e=>Z(e)).join("+")+"]";var a=r.index(t).count(i);s=await new Promise((e,t)=>{a.onsuccess=function(){e(a.result)},a.onerror=e=>t(e)})}),s}(this,e);return{count:t,mode:"fast"}}return{count:(await tt(this,e)).documents.length,mode:"slow"}},t.changeStream=function(){return Et(this),this.changes$.asObservable()},t.cleanup=async function(e){Et(this);var t=await this.internals;return await t.dexieDb.transaction("rw",t.dexieTable,async()=>{var r=ie()-e,a=await t.dexieTable.where("_meta.lwt").below(r).toArray(),n=[];a.forEach(e=>{"1"===e._deleted&&n.push(e[this.primaryPath])}),await t.dexieTable.bulkDelete(n)}),!0},t.getAttachmentData=async function(e,t,r){Et(this);var a=await this.internals,n=te(e,t);return await a.dexieDb.transaction("r",a.dexieAttachmentsTable,async()=>{var r=await a.dexieAttachmentsTable.get(n);if(r)return r.data;throw new Error("attachment missing documentId: "+e+" attachmentId: "+t)})},t.remove=async function(){Et(this);var e=await this.internals;return await e.dexieTable.clear(),this.close()},t.close=function(){return this.closed||(this.closed=(async()=>{this.changes$.complete(),await async function(e){var t=await e,r=K.get(e)-1;0===r?(t.dexieDb.close(),K.delete(e)):K.set(e,r)}(this.internals)})()),this.closed},e}();async function It(e,t,r){var n=function(e,t,r,n){var o="rxdb-dexie-"+e+"--"+n.version+"--"+t,c=i(H,o,()=>{var e=(async()=>{var e=s(r);e.autoOpen=!1;var t=new a.cf(o,e);r.onCreate&&await r.onCreate(t,o);var i={[L]:Y(n),[Q]:"++sequence, id",[W]:"id"};return t.version(1).stores(i),await t.open(),{dexieDb:t,dexieTable:t[L],dexieAttachmentsTable:t[W],booleanIndexes:re(n)}})();return H.set(o,c),K.set(c,0),e});return c}(t.databaseName,t.collectionName,r,t.schema),o=new kt(e,t.databaseName,t.collectionName,t.schema,n,t.options,r,t.devMode);return await Dt(F,t,o),Promise.resolve(o)}function Et(e){if(e.closed)throw new Error("RxStorageInstanceDexie is closed "+e.databaseName+"-"+e.collectionName)}var Ct="17.0.0-beta.6",Rt=function(){function e(e){this.name=F,this.rxdbVersion=Ct,this.settings=e}return e.prototype.createStorageInstance=function(e){(function(e){if(e.schema.keyCompression)throw R("UT5",{args:{params:e}});if((t=e.schema).encrypted&&t.encrypted.length>0||t.attachments&&t.attachments.encrypted)throw R("UT6",{args:{params:e}});var t;if(e.schema.attachments&&e.schema.attachments.compression)throw R("UT7",{args:{params:e}})}(e),e.schema.indexes)&&e.schema.indexes.flat().filter(e=>!e.includes(".")).forEach(t=>{if(!e.schema.required||!e.schema.required.includes(t))throw R("DXE1",{field:t,schema:e.schema})});return It(this,e,this.settings)},e}();function Ot(e={}){return new Rt(e)}var St=r(686),jt=function(){function e(e,t){if(this.jsonSchema=e,this.hashFunction=t,this.indexes=function(e){return(e.indexes||[]).map(e=>(0,g.k_)(e)?e:[e])}(this.jsonSchema),this.primaryPath=M(this.jsonSchema.primaryKey),!e.properties[this.primaryPath].maxLength)throw R("SC39",{schema:e});this.finalFields=function(e){var t=Object.keys(e.properties).filter(t=>e.properties[t].final),r=M(e.primaryKey);return t.push(r),"string"!=typeof e.primaryKey&&e.primaryKey.fields.forEach(e=>t.push(e)),t}(this.jsonSchema)}var t=e.prototype;return t.validateChange=function(e,t){this.finalFields.forEach(r=>{if(!(0,St.b)(e[r],t[r]))throw R("DOC9",{dataBefore:e,dataAfter:t,fieldName:r,schema:this.jsonSchema})})},t.getDocumentPrototype=function(){var e={},t=B(this.jsonSchema,"");return Object.keys(t).forEach(t=>{var r=t;e.__defineGetter__(t,function(){if(this.get&&"function"==typeof this.get)return this.get(r)}),Object.defineProperty(e,t+"$",{get:function(){return this.get$(r)},enumerable:!1,configurable:!1}),Object.defineProperty(e,t+"$$",{get:function(){return this.get$$(r)},enumerable:!1,configurable:!1}),Object.defineProperty(e,t+"_",{get:function(){return this.populate(r)},enumerable:!1,configurable:!1})}),u(this,"getDocumentPrototype",()=>e),e},t.getPrimaryOfDocumentData=function(e){return A(this.jsonSchema,e)},(0,b.A)(e,[{key:"version",get:function(){return this.jsonSchema.version}},{key:"defaultValues",get:function(){var e={};return Object.entries(this.jsonSchema.properties).filter(([,e])=>Object.prototype.hasOwnProperty.call(e,"default")).forEach(([t,r])=>e[t]=r.default),u(this,"defaultValues",e)}},{key:"hash",get:function(){return u(this,"hash",this.hashFunction(JSON.stringify(this.jsonSchema)))}}])}();function Pt(e,t,r=!0){r&&it("preCreateRxSchema",e);var a=q(e);a=function(e){return o(e,!0)}(a),x.deepFreezeWhenDevMode(a);var n=new jt(a,t);return it("createRxSchema",n),n}var $t=r(7708),Nt=r(8146),Bt=r(3356),Mt=r(5520),At=r(8609);function qt(e){var t=e.split("-"),r="RxDB";return t.forEach(e=>{r+=(0,N.Z2)(e)}),r+="Plugin",new Error("You are using a function which must be overwritten by a plugin.\n You should either prevent the usage of this function or add the plugin via:\n import { "+r+" } from 'rxdb/plugins/"+e+"';\n addRxPlugin("+r+");\n ")}function Tt(e){return e.documentData?e.documentData:e.previousDocumentData}function Lt(e){switch(e.operation){case"INSERT":return{operation:e.operation,id:e.documentId,doc:e.documentData,previous:null};case"UPDATE":return{operation:e.operation,id:e.documentId,doc:x.deepFreezeWhenDevMode(e.documentData),previous:e.previousDocumentData?e.previousDocumentData:"UNKNOWN"};case"DELETE":return{operation:e.operation,id:e.documentId,doc:null,previous:e.previousDocumentData}}}var Qt=new Map;function Wt(e){return i(Qt,e,()=>{for(var t=new Array(e.events.length),r=e.events,a=e.collectionName,n=e.isLocal,i=x.deepFreezeWhenDevMode,s=0;s[]);return new Promise((r,n)=>{var i={lastKnownDocumentState:e,modifier:t,resolve:r,reject:n};(0,me.ZN)(a).push(i),this.triggerRun()})},t.triggerRun=async function(){if(!0!==this.isRunning&&0!==this.queueByDocId.size){this.isRunning=!0;var e=[],t=this.queueByDocId;this.queueByDocId=new Map,await Promise.all(Array.from(t.entries()).map(async([t,r])=>{var a,n,i,s=(a=r.map(e=>e.lastKnownDocumentState),n=a[0],i=rt(n._rev),a.forEach(e=>{var t=rt(e._rev);t>i&&(n=e,i=t)}),n),o=s;for(var u of r)try{o=await u.modifier(c(o))}catch(h){u.reject(h),u.reject=()=>{},u.resolve=()=>{}}try{await this.preWrite(o,s)}catch(h){return void r.forEach(e=>e.reject(h))}e.push({previous:s,document:o})}));var r=e.length>0?await this.storageInstance.bulkWrite(e,"incremental-write"):{error:[]};return await Promise.all(vt(this.primaryPath,e,r).map(e=>{var r=e[this.primaryPath];this.postWrite(e),n(t,r).forEach(t=>t.resolve(e))})),r.error.forEach(e=>{var r=e.documentId,a=n(t,r),s=S(e);if(s){var o=i(this.queueByDocId,r,()=>[]);a.reverse().forEach(e=>{e.lastKnownDocumentState=(0,me.ZN)(s.documentInDb),(0,me.ZN)(o).unshift(e)})}else{var c=P(e);a.forEach(e=>e.reject(c))}}),this.isRunning=!1,this.triggerRun()}},e}();function Ht(e){return async t=>{var r=function(e){return Object.assign({},e,{_meta:void 0,_deleted:void 0,_rev:void 0})}(t);r._deleted=t._deleted;var a=await e(r),n=Object.assign({},a,{_meta:t._meta,_attachments:t._attachments,_rev:t._rev,_deleted:void 0!==a._deleted?a._deleted:t._deleted});return void 0===n._deleted&&(n._deleted=!1),n}}var Kt={get primaryPath(){if(this.isInstanceOfRxDocument)return this.collection.schema.primaryPath},get primary(){var e=this;if(e.isInstanceOfRxDocument)return e._data[e.primaryPath]},get revision(){if(this.isInstanceOfRxDocument)return this._data._rev},get deleted$(){if(this.isInstanceOfRxDocument)return this.$.pipe((0,$t.T)(e=>e._data._deleted))},get deleted$$(){var e=this;return e.collection.database.getReactivityFactory().fromObservable(e.deleted$,e.getLatest().deleted,e.collection.database)},get deleted(){if(this.isInstanceOfRxDocument)return this._data._deleted},getLatest(){var e=this.collection._docCache.getLatestDocumentData(this.primary);return this.collection._docCache.getCachedRxDocument(e)},get $(){var e=this.primary;return this.collection.eventBulks$.pipe((0,Nt.p)(e=>!e.isLocal),(0,$t.T)(t=>t.events.find(t=>t.documentId===e)),(0,Nt.p)(e=>!!e),(0,$t.T)(e=>Tt((0,me.ZN)(e))),(0,Bt.Z)(this.collection._docCache.getLatestDocumentData(e)),(0,Mt.F)((e,t)=>e._rev===t._rev),(0,$t.T)(e=>this.collection._docCache.getCachedRxDocument(e)),(0,At.t)(me.bz))},get $$(){var e=this;return e.collection.database.getReactivityFactory().fromObservable(e.$,e.getLatest()._data,e.collection.database)},get$(e){if(x.isDevMode()){if(e.includes(".item."))throw R("DOC1",{path:e});if(e===this.primaryPath)throw R("DOC2");if(this.collection.schema.finalFields.includes(e))throw R("DOC3",{path:e});if(!B(this.collection.schema.jsonSchema,e))throw R("DOC4",{path:e})}return this.$.pipe((0,$t.T)(t=>v(t,e)),(0,Mt.F)())},get$$(e){var t=this.get$(e);return this.collection.database.getReactivityFactory().fromObservable(t,this.getLatest().get(e),this.collection.database)},populate(e){var t=B(this.collection.schema.jsonSchema,e),r=this.get(e);if(!r)return ue.$A;if(!t)throw R("DOC5",{path:e});if(!t.ref)throw R("DOC6",{path:e,schemaObj:t});var a=this.collection.database.collections[t.ref];if(!a)throw R("DOC7",{ref:t.ref,path:e,schemaObj:t});return"array"===t.type?a.findByIds(r).exec().then(e=>{var t=e.values();return Array.from(t)}):a.findOne(r).exec()},get(e){return Ut(this,e)},toJSON(e=!1){if(e)return x.deepFreezeWhenDevMode(this._data);var t=s(this._data);return delete t._rev,delete t._attachments,delete t._deleted,delete t._meta,x.deepFreezeWhenDevMode(t)},toMutableJSON(e=!1){return c(this.toJSON(e))},update(e){throw qt("update")},incrementalUpdate(e){throw qt("update")},updateCRDT(e){throw qt("crdt")},putAttachment(){throw qt("attachments")},putAttachmentBase64(){throw qt("attachments")},getAttachment(){throw qt("attachments")},allAttachments(){throw qt("attachments")},get allAttachments$(){throw qt("attachments")},async modify(e,t){var r=this._data,a=await Ht(e)(r);return this._saveData(a,r)},incrementalModify(e,t){return this.collection.incrementalWriteQueue.addWrite(this._data,Ht(e)).then(e=>this.collection._docCache.getCachedRxDocument(e))},patch(e){var t=this._data,r=c(t);return Object.entries(e).forEach(([e,t])=>{r[e]=t}),this._saveData(r,t)},incrementalPatch(e){return this.incrementalModify(t=>(Object.entries(e).forEach(([e,r])=>{t[e]=r}),t))},async _saveData(e,t){if(e=s(e),this._data._deleted)throw R("DOC11",{id:this.primary,document:this});await Zt(this.collection,e,t);var r=[{previous:t,document:e}],a=await this.collection.storageInstance.bulkWrite(r,"rx-document-save-data"),n=a.error[0];return ut(this.collection,this.primary,e,n),await this.collection._runHooks("post","save",e,this),this.collection._docCache.getCachedRxDocument(vt(this.collection.schema.primaryPath,r,a)[0])},async remove(){if(this.deleted)return Promise.reject(R("DOC13",{document:this,id:this.primary}));var e=await this.collection.bulkRemove([this]);if(e.error.length>0){var t=e.error[0];ut(this.collection,this.primary,this._data,t)}return e.success[0]},incrementalRemove(){return this.incrementalModify(async e=>(await this.collection._runHooks("pre","remove",e,this),e._deleted=!0,e)).then(async e=>(await this.collection._runHooks("post","remove",e._data,e),e))},close(){throw R("DOC14")}};function zt(e=Kt){var t=function(e,t){this.collection=e,this._data=t,this._propertyCache=new Map,this.isInstanceOfRxDocument=!0};return t.prototype=e,t}function Zt(e,t,r){return t._meta=Object.assign({},r._meta,t._meta),x.isDevMode()&&e.schema.validateChange(r,t),e._runHooks("pre","save",t,r)}function Ut(e,t){return i(e._propertyCache,t,()=>{var r=v(e._data,t);return"object"!=typeof r||null===r||Array.isArray(r)?x.deepFreezeWhenDevMode(r):new Proxy(s(r),{get(r,a){if("string"!=typeof a)return r[a];var n=a.charAt(a.length-1);if("$"===n){if(a.endsWith("$$")){var i=a.slice(0,-2);return e.get$$((0,N.L$)(t+"."+i))}var s=a.slice(0,-1);return e.get$((0,N.L$)(t+"."+s))}if("_"===n){var o=a.slice(0,-1);return e.populate((0,N.L$)(t+"."+o))}var c=r[a];return"number"==typeof c||"string"==typeof c||"boolean"==typeof c?c:Ut(e,(0,N.L$)(t+"."+a))}})})}var Vt=r(2198),Jt=r(4157),Gt=r(2442),Xt=r(6114);function Yt(e,t){return t.sort&&0!==t.sort.length?t.sort.map(e=>Object.keys(e)[0]):[e]}var er=new WeakMap;function tr(e,t){if(!e.collection.database.eventReduce)return{runFullQueryAgain:!0};for(var r=function(e){return i(er,e,()=>{var t=e.collection,r=Ze(t.storageInstance.schema,c(e.mangoQuery)),a=t.schema.primaryPath,n=Ue(t.schema.jsonSchema,r),i=Ve(t.schema.jsonSchema,r);return{primaryKey:e.collection.schema.primaryPath,skip:r.skip,limit:r.limit,sortFields:Yt(a,r),sortComparator:(t,r)=>{var a={docA:t,docB:r,rxQuery:e};return n(a.docA,a.docB)},queryMatcher:t=>i({doc:t,rxQuery:e}.doc)}})}(e),a=(0,me.ZN)(e._result).docsData.slice(0),n=(0,me.ZN)(e._result).docsDataMap,s=!1,o=[],u=0;u{var t={queryParams:r,changeEvent:e,previousResults:a,keyDocumentMap:n},i=(0,Xt.kC)(t);return"runFullQueryAgain"===i||("doNothing"!==i?(s=!0,(0,Xt.Cs)(i,r,e,a,n),!1):void 0)});return l?{runFullQueryAgain:!0}:{runFullQueryAgain:!1,changed:s,newResults:a}}var rr=function(){function e(){this._map=new Map}return e.prototype.getByQuery=function(e){var t=e.toString();return i(this._map,t,()=>e)},e}();function ar(e,t){t.uncached=!0;var r=t.toString();e._map.delete(r)}function nr(e){return e.refCount$.observers.length}var ir,sr,or=(ir=100,sr=3e4,(e,t)=>{if(!(t._map.size0||(0===i._lastEnsureEqual&&i._creationTimee._lastEnsureEqual-t._lastEnsureEqual).slice(0,s).forEach(e=>ar(t,e))}}),cr=new WeakSet;var ur=function(){function e(e,t,r){this.cacheItemByDocId=new Map,this.tasks=new Set,this.registry="function"==typeof FinalizationRegistry?new FinalizationRegistry(e=>{var t=e.docId,r=this.cacheItemByDocId.get(t);r&&(r[0].delete(e.revisionHeight+e.lwt+""),0===r[0].size&&this.cacheItemByDocId.delete(t))}):void 0,this.primaryPath=e,this.changes$=t,this.documentCreator=r,t.subscribe(e=>{this.tasks.add(()=>{for(var t=this.cacheItemByDocId,r=0;r{this.processTasks()})})}var t=e.prototype;return t.processTasks=function(){0!==this.tasks.size&&(Array.from(this.tasks).forEach(e=>e()),this.tasks.clear())},t.getLatestDocumentData=function(e){return this.processTasks(),n(this.cacheItemByDocId,e)[1]},t.getLatestDocumentDataIfExists=function(e){this.processTasks();var t=this.cacheItemByDocId.get(e);if(t)return t[1]},(0,b.A)(e,[{key:"getCachedRxDocuments",get:function(){return u(this,"getCachedRxDocuments",hr(this))}},{key:"getCachedRxDocument",get:function(){var e=hr(this);return u(this,"getCachedRxDocument",t=>e([t])[0])}}])}();function hr(e){var t=e.primaryPath,r=e.cacheItemByDocId,a=e.registry,n=x.deepFreezeWhenDevMode,i=e.documentCreator;return s=>{for(var o=new Array(s.length),c=[],u=0;u0&&a&&(e.tasks.add(()=>{for(var e=0;e{e.processTasks()})),o}}function lr(e,t){return(0,e.getCachedRxDocuments)(t)}var dr="function"==typeof WeakRef?function(e){return new WeakRef(e)}:function(e){return{deref:()=>e}};var mr=function(){function e(e,t,r){this.time=ie(),this.query=e,this.count=r,this.documents=lr(this.query.collection._docCache,t)}return e.prototype.getValue=function(e){var t=this.query.op;if("count"===t)return this.count;if("findOne"===t){var r=0===this.documents.length?null:this.documents[0];if(!r&&e)throw R("QU10",{collection:this.query.collection.name,query:this.query.mangoQuery,op:t});return r}return"findByIds"===t?this.docsMap:this.documents.slice(0)},(0,b.A)(e,[{key:"docsData",get:function(){return u(this,"docsData",this.documents.map(e=>e._data))}},{key:"docsDataMap",get:function(){var e=new Map;return this.documents.forEach(t=>{e.set(t.primary,t._data)}),u(this,"docsDataMap",e)}},{key:"docsMap",get:function(){for(var e=new Map,t=this.documents,r=0;r"string"!=typeof e))return r.$eq}return!1}(this.collection.schema.primaryPath,t)}var t=e.prototype;return t._setResultData=function(e){if(void 0===e)throw R("QU18",{database:this.collection.database.name,collection:this.collection.name});if("number"!=typeof e){e instanceof Map&&(e=Array.from(e.values()));var t=new mr(this,e,e.length);this._result=t}else this._result=new mr(this,[],e)},t._execOverDatabase=async function(){if(this._execOverDatabaseCount=this._execOverDatabaseCount+1,"count"===this.op){var e=this.getPreparedQuery(),t=await this.collection.storageInstance.count(e);if("slow"!==t.mode||this.collection.database.allowSlowCount)return{result:t.count,counter:this.collection._changeEventBuffer.getCounter()};throw R("QU14",{collection:this.collection,queryObj:this.mangoQuery})}if("findByIds"===this.op){var r=(0,me.ZN)(this.mangoQuery.selector)[this.collection.schema.primaryPath].$in,a=new Map,n=[];if(r.forEach(e=>{var t=this.collection._docCache.getLatestDocumentDataIfExists(e);if(t){if(!t._deleted){var r=this.collection._docCache.getCachedRxDocument(t);a.set(e,r)}}else n.push(e)}),n.length>0)(await this.collection.storageInstance.findDocumentsById(n,!1)).forEach(e=>{var t=this.collection._docCache.getCachedRxDocument(e);a.set(t.primary,t)});return{result:a,counter:this.collection._changeEventBuffer.getCounter()}}var i=await gr(this);return{result:i.docs,counter:i.counter}},t.exec=async function(e){if(e&&"findOne"!==this.op)throw R("QU9",{collection:this.collection.name,query:this.mangoQuery,op:this.op});return await yr(this),(0,me.ZN)(this._result).getValue(e)},t.toString=function(){var e=o({op:this.op,query:Ze(this.collection.schema.jsonSchema,this.mangoQuery),other:this.other},!0),t=JSON.stringify(e);return this.toString=()=>t,t},t.getPreparedQuery=function(){var e={rxQuery:this,mangoQuery:Ze(this.collection.schema.jsonSchema,this.mangoQuery)};e.mangoQuery.selector._deleted={$eq:!1},e.mangoQuery.index&&e.mangoQuery.index.unshift("_deleted"),it("prePrepareQuery",e);var t=Ge(this.collection.schema.jsonSchema,e.mangoQuery);return this.getPreparedQuery=()=>t,t},t.doesDocumentDataMatch=function(e){return!e._deleted&&this.queryMatcher(e)},t.remove=async function(){var e=await this.exec();if(Array.isArray(e)){var t=await this.collection.bulkRemove(e);if(t.error.length>0)throw P(t.error[0]);return t.success}return e.remove()},t.incrementalRemove=function(){return Je(this.asRxQuery,e=>e.incrementalRemove())},t.update=function(e){throw qt("update")},t.patch=function(e){return Je(this.asRxQuery,t=>t.patch(e))},t.incrementalPatch=function(e){return Je(this.asRxQuery,t=>t.incrementalPatch(e))},t.modify=function(e){return Je(this.asRxQuery,t=>t.modify(e))},t.incrementalModify=function(e){return Je(this.asRxQuery,t=>t.incrementalModify(e))},t.where=function(e){throw qt("query-builder")},t.sort=function(e){throw qt("query-builder")},t.skip=function(e){throw qt("query-builder")},t.limit=function(e){throw qt("query-builder")},(0,b.A)(e,[{key:"$",get:function(){if(!this._$){var e=this.collection.eventBulks$.pipe((0,Nt.p)(e=>!e.isLocal),(0,Bt.Z)(null),(0,Gt.Z)(()=>yr(this)),(0,$t.T)(()=>this._result),(0,At.t)(me.bz),(0,Mt.F)((e,t)=>!(!e||e.time!==(0,me.ZN)(t).time)),(0,Nt.p)(e=>!!e),(0,$t.T)(e=>(0,me.ZN)(e).getValue()));this._$=(0,Jt.h)(e,this.refCount$.pipe((0,Nt.p)(()=>!1)))}return this._$}},{key:"$$",get:function(){return this.collection.database.getReactivityFactory().fromObservable(this.$,void 0,this.collection.database)}},{key:"queryMatcher",get:function(){this.collection.schema.jsonSchema;return u(this,"queryMatcher",Ve(0,Ze(this.collection.schema.jsonSchema,this.mangoQuery)))}},{key:"asRxQuery",get:function(){return this}}])}();function vr(e,t,r,a){it("preCreateRxQuery",{op:e,queryObj:t,collection:r,other:a});var n,i,s=new pr(e,t,r,a);return s=(n=s).collection._queryCache.getByQuery(n),i=r,cr.has(i)||(cr.add(i),(0,ue.dY)().then(()=>(0,ue.Ve)(200)).then(()=>{i.closed||i.cacheReplacementPolicy(i,i._queryCache),cr.delete(i)})),s}async function yr(e){return e.collection.awaitBeforeReads.size>0&&await Promise.all(Array.from(e.collection.awaitBeforeReads).map(e=>e())),e._ensureEqualQueue=e._ensureEqualQueue.then(()=>function(e){if(e._lastEnsureEqual=ie(),e.collection.database.closed||function(e){var t=e.asRxQuery.collection._changeEventBuffer.getCounter();return e._latestChangeEvent>=t}(e))return ue.Dr;var t=!1,r=!1;-1===e._latestChangeEvent&&(r=!0);if(!r){var a=e.asRxQuery.collection._changeEventBuffer.getFrom(e._latestChangeEvent+1);if(null===a)r=!0;else{e._latestChangeEvent=e.asRxQuery.collection._changeEventBuffer.getCounter();var n=e.asRxQuery.collection._changeEventBuffer.reduceByLastOfDoc(a);if("count"===e.op){var i=(0,me.ZN)(e._result).count,s=i;n.forEach(t=>{var r=t.previousDocumentData&&e.doesDocumentDataMatch(t.previousDocumentData),a=e.doesDocumentDataMatch(t.documentData);!r&&a&&s++,r&&!a&&s--}),s!==i&&(t=!0,e._setResultData(s))}else{var o=tr(e,n);o.runFullQueryAgain?r=!0:o.changed&&(t=!0,e._setResultData(o.newResults))}}}if(r)return e._execOverDatabase().then(r=>{var a=r.result;return e._latestChangeEvent=r.counter,"number"==typeof a?(e._result&&a===e._result.count||(t=!0,e._setResultData(a)),t):(e._result&&function(e,t,r){if(t.length!==r.length)return!1;for(var a=0,n=t.length;a{a++});if(e.isFindOneByIdQuery)if(Array.isArray(e.isFindOneByIdQuery)){var i=e.isFindOneByIdQuery;if(i=i.filter(r=>{var a=e.collection._docCache.getLatestDocumentDataIfExists(r);return!a||(a._deleted||t.push(a),!1)}),i.length>0){var s=await r.storageInstance.findDocumentsById(i,!1);t=t.concat(s)}}else{var o=e.isFindOneByIdQuery,c=e.collection._docCache.getLatestDocumentDataIfExists(o);if(!c){var u=await r.storageInstance.findDocumentsById([o],!1);u[0]&&(c=u[0])}c&&!c._deleted&&t.push(c)}else{var h=e.getPreparedQuery(),l=await r.storageInstance.query(h);t=l.documents}return n.unsubscribe(),a>0?(await(0,ue.ND)(0),gr(e)):{docs:t,counter:r._changeEventBuffer.getCounter()}}var br="collection",wr="storage-token",Dr=q({version:0,title:"RxInternalDocument",primaryKey:{key:"id",fields:["context","key"],separator:"|"},type:"object",properties:{id:{type:"string",maxLength:200},key:{type:"string"},context:{type:"string",enum:[br,wr,"rx-migration-status","rx-pipeline-checkpoint","OTHER"]},data:{type:"object",additionalProperties:!0}},indexes:[],required:["key","context","data"],additionalProperties:!1,sharding:{shards:1,mode:"collection"}});function xr(e,t){return A(Dr,{key:e,context:t})}async function _r(e){var t=Ge(e.schema,{selector:{context:br,_deleted:{$eq:!1}},sort:[{id:"asc"}],skip:0});return(await e.query(t)).documents}var kr="storageToken",Ir=xr(kr,wr);function Er(e,t){return e+"-"+t.version}function Cr(e,t){return t=function(e,t){for(var r=Object.keys(e.defaultValues),a=0;ae.data.name===n),u=[];c.forEach(e=>{u.push({collectionName:e.data.name,schema:e.data.schema,isCollection:!0}),e.data.connectedStorages.forEach(e=>u.push({collectionName:e.collectionName,isCollection:!1,schema:e.schema}))});var h=new Set;if(u=u.filter(e=>{var t=e.collectionName+"||"+e.schema.version;return!h.has(t)&&(h.add(t),!0)}),await Promise.all(u.map(async t=>{var o=await e.createStorageInstance({collectionName:t.collectionName,databaseInstanceToken:r,databaseName:a,multiInstance:i,options:{},schema:t.schema,password:s,devMode:x.isDevMode()});await o.remove(),t.isCollection&&await st("postRemoveRxCollection",{storage:e,databaseName:a,collectionName:n})})),o){var l=c.map(e=>{var t=dt(e);return t._deleted=!0,t._meta.lwt=ie(),t._rev=at(r,e),{previous:e,document:t}});await t.bulkWrite(l,"rx-database-remove-collection-all")}}function Or(e){if(e.closed)throw R("COL21",{collection:e.name,version:e.schema.version})}var Sr=function(){function e(e){this.subs=[],this.counter=0,this.eventCounterMap=new WeakMap,this.buffer=[],this.limit=100,this.tasks=new Set,this.collection=e,this.subs.push(this.collection.eventBulks$.pipe((0,Nt.p)(e=>!e.isLocal)).subscribe(e=>{this.tasks.add(()=>this._handleChangeEvents(e.events)),this.tasks.size<=1&&(0,ue.vN)().then(()=>{this.processTasks()})}))}var t=e.prototype;return t.processTasks=function(){0!==this.tasks.size&&(Array.from(this.tasks).forEach(e=>e()),this.tasks.clear())},t._handleChangeEvents=function(e){var t=this.counter;this.counter=this.counter+e.length,e.length>this.limit?this.buffer=e.slice(-1*e.length):(this.buffer=this.buffer.concat(e),this.buffer=this.buffer.slice(-1*this.limit));for(var r=t+1,a=this.eventCounterMap,n=0;nt(e))},t.reduceByLastOfDoc=function(e){return this.processTasks(),e.slice(0)},t.close=function(){this.tasks.clear(),this.subs.forEach(e=>e.unsubscribe())},e}();var jr=new WeakMap;function Pr(e){var t=e.schema.getDocumentPrototype(),r=function(e){var t={};return Object.entries(e.methods).forEach(([e,r])=>{t[e]=r}),t}(e),a={};return[t,r,Kt].forEach(e=>{Object.getOwnPropertyNames(e).forEach(t=>{var r=Object.getOwnPropertyDescriptor(e,t),n=!0;(t.startsWith("_")||t.endsWith("_")||t.startsWith("$")||t.endsWith("$"))&&(n=!1),"function"==typeof r.value?Object.defineProperty(a,t,{get(){return r.value.bind(this)},enumerable:n,configurable:!1}):(r.enumerable=n,r.configurable=!1,r.writable&&(r.writable=!1),Object.defineProperty(a,t,r))})}),a}function $r(e,t,r){var a=function(e,t,r){var a=new e(t,r);return it("createRxDocument",a),a}(t,e,x.deepFreezeWhenDevMode(r));return e._runHooksSync("post","create",r,a),it("postCreateRxDocument",a),a}var Nr={isEqual:(e,t,r)=>(e=Br(e),t=Br(t),(0,St.b)(lt(e),lt(t))),resolve:e=>e.realMasterState};function Br(e){return e._attachments||((e=s(e))._attachments={}),e}var Mr=["pre","post"],Ar=["insert","save","remove","create"],qr=!1,Tr=new Set,Lr=function(){function e(e,t,r,a,n={},i={},s={},o={},c={},u=or,h={},l=Nr){this.storageInstance={},this.timeouts=new Set,this.incrementalWriteQueue={},this.awaitBeforeReads=new Set,this._incrementalUpsertQueues=new Map,this.synced=!1,this.hooks={},this._subs=[],this._docCache={},this._queryCache=new rr,this.$={},this.checkpoint$={},this._changeEventBuffer={},this.eventBulks$={},this.onClose=[],this.closed=!1,this.onRemove=[],this.database=e,this.name=t,this.schema=r,this.internalStorageInstance=a,this.instanceCreationOptions=n,this.migrationStrategies=i,this.methods=s,this.attachments=o,this.options=c,this.cacheReplacementPolicy=u,this.statics=h,this.conflictHandler=l,function(e){if(qr)return;qr=!0;var t=Object.getPrototypeOf(e);Ar.forEach(e=>{Mr.map(r=>{var a=r+(0,N.Z2)(e);t[a]=function(t,a){return this.addHook(r,e,t,a)}})})}(this.asRxCollection),e&&(this.eventBulks$=e.eventBulks$.pipe((0,Nt.p)(e=>e.collectionName===this.name))),this.database&&Tr.add(this)}var t=e.prototype;return t.prepare=async function(){if(!await de()){for(var e=0;e<10&&Tr.size>16;)e++,await this.promiseWait(30);if(Tr.size>16)throw R("COL23",{database:this.database.name,collection:this.name,args:{existing:Array.from(Tr.values()).map(e=>({db:e.database?e.database.name:"",c:e.name}))}})}var t,r;this.storageInstance=mt(this.database,this.internalStorageInstance,this.schema.jsonSchema),this.incrementalWriteQueue=new Ft(this.storageInstance,this.schema.primaryPath,(e,t)=>Zt(this,e,t),e=>this._runHooks("post","save",e)),this.$=this.eventBulks$.pipe((0,Gt.Z)(e=>Wt(e))),this.checkpoint$=this.eventBulks$.pipe((0,$t.T)(e=>e.checkpoint)),this._changeEventBuffer=(t=this.asRxCollection,new Sr(t)),this._docCache=new ur(this.schema.primaryPath,this.eventBulks$.pipe((0,Nt.p)(e=>!e.isLocal),(0,$t.T)(e=>e.events)),e=>{var t;return r||(t=this.asRxCollection,r=i(jr,t,()=>zt(Pr(t)))),$r(this.asRxCollection,r,e)});var a=this.database.internalStore.changeStream().pipe((0,Nt.p)(e=>{var t=this.name+"-"+this.schema.version;return!!e.events.find(e=>"collection"===e.documentData.context&&e.documentData.key===t&&"DELETE"===e.operation)})).subscribe(async()=>{await this.close(),await Promise.all(this.onRemove.map(e=>e()))});this._subs.push(a);var n=await this.database.storageToken,s=this.storageInstance.changeStream().subscribe(e=>{var t={id:e.id,isLocal:!1,internal:!1,collectionName:this.name,storageToken:n,events:e.events,databaseToken:this.database.token,checkpoint:e.checkpoint,context:e.context};this.database.$emit(t)});return this._subs.push(s),ue.em},t.cleanup=function(e){throw Or(this),qt("cleanup")},t.migrationNeeded=function(){throw qt("migration-schema")},t.getMigrationState=function(){throw qt("migration-schema")},t.startMigration=function(e=10){return Or(this),this.getMigrationState().startMigration(e)},t.migratePromise=function(e=10){return this.getMigrationState().migratePromise(e)},t.insert=async function(e){Or(this);var t=await this.bulkInsert([e]),r=t.error[0];return ut(this,e[this.schema.primaryPath],e,r),(0,me.ZN)(t.success[0])},t.insertIfNotExists=async function(e){var t=await this.bulkInsert([e]);if(t.error.length>0){var r=t.error[0];if(409===r.status){var a=r.documentInDb;return lr(this._docCache,[a])[0]}throw r}return t.success[0]},t.bulkInsert=async function(e){if(Or(this),0===e.length)return{success:[],error:[]};var t,r=this.schema.primaryPath,a=new Set;if(this.hasHooks("pre","insert"))t=await Promise.all(e.map(e=>{var t=Cr(this.schema,e);return this._runHooks("pre","insert",t).then(()=>(a.add(t[r]),{document:t}))}));else{t=new Array(e.length);for(var n=this.schema,i=0;i{var t=e.document;l.set(t[r],t)}),await Promise.all(h.success.map(e=>this._runHooks("post","insert",l.get(e.primary),e)))}return h},t.bulkRemove=async function(e){Or(this);var t,r=this.schema.primaryPath;if(0===e.length)return{success:[],error:[]};"string"==typeof e[0]?t=await this.findByIds(e).exec():(t=new Map,e.forEach(e=>t.set(e.primary,e)));var a=[],n=new Map;Array.from(t.values()).forEach(e=>{var t=e.toMutableJSON(!0);a.push(t),n.set(e.primary,t)}),await Promise.all(a.map(e=>{var r=e[this.schema.primaryPath];return this._runHooks("pre","remove",e,t.get(r))}));var i=a.map(e=>{var t=s(e);return t._deleted=!0,{previous:e,document:t}}),o=await this.storageInstance.bulkWrite(i,"rx-collection-bulk-remove"),c=vt(this.schema.primaryPath,i,o),u=[],h=c.map(e=>{var t=e[r],a=this._docCache.getCachedRxDocument(e);return u.push(a),t});return await Promise.all(h.map(e=>this._runHooks("post","remove",n.get(e),t.get(e)))),{success:u,error:o.error}},t.bulkUpsert=async function(e){Or(this);var t=[],r=new Map;e.forEach(e=>{var a=Cr(this.schema,e),n=a[this.schema.primaryPath];if(!n)throw R("COL3",{primaryPath:this.schema.primaryPath,data:a,schema:this.schema.jsonSchema});r.set(n,a),t.push(a)});var a=await this.bulkInsert(t),i=a.success.slice(0),s=[];return await Promise.all(a.error.map(async e=>{if(409!==e.status)s.push(e);else{var t=e.documentId,a=n(r,t),o=(0,me.ZN)(e.documentInDb),c=this._docCache.getCachedRxDocuments([o])[0],u=await c.incrementalModify(()=>a);i.push(u)}})),{error:s,success:i}},t.upsert=async function(e){Or(this);var t=await this.bulkUpsert([e]);return ut(this.asRxCollection,e[this.schema.primaryPath],e,t.error[0]),t.success[0]},t.incrementalUpsert=function(e){Or(this);var t=Cr(this.schema,e),r=t[this.schema.primaryPath];if(!r)throw R("COL4",{data:e});var a=this._incrementalUpsertQueues.get(r);return a||(a=ue.em),a=a.then(()=>function(e,t,r){var a=e._docCache.getLatestDocumentDataIfExists(t);if(a)return Promise.resolve({doc:e._docCache.getCachedRxDocuments([a])[0],inserted:!1});return e.findOne(t).exec().then(t=>t?{doc:t,inserted:!1}:e.insert(r).then(e=>({doc:e,inserted:!0})))}(this,r,t)).then(e=>e.inserted?e.doc:function(e,t){return e.incrementalModify(e=>t)}(e.doc,t)),this._incrementalUpsertQueues.set(r,a),a},t.find=function(e){return Or(this),it("prePrepareRxQuery",{op:"find",queryObj:e,collection:this}),e||(e={selector:{}}),vr("find",e,this)},t.findOne=function(e){var t;if(Or(this),it("prePrepareRxQuery",{op:"findOne",queryObj:e,collection:this}),"string"==typeof e)t=vr("findOne",{selector:{[this.schema.primaryPath]:e},limit:1},this);else{if(e||(e={selector:{}}),e.limit)throw R("QU6");(e=s(e)).limit=1,t=vr("findOne",e,this)}return t},t.count=function(e){return Or(this),e||(e={selector:{}}),vr("count",e,this)},t.findByIds=function(e){return Or(this),vr("findByIds",{selector:{[this.schema.primaryPath]:{$in:e.slice(0)}}},this)},t.exportJSON=function(){throw qt("json-dump")},t.importJSON=function(e){throw qt("json-dump")},t.insertCRDT=function(e){throw qt("crdt")},t.addPipeline=function(e){throw qt("pipeline")},t.addHook=function(e,t,r,a=!1){if("function"!=typeof r)throw O("COL7",{key:t,when:e});if(!Mr.includes(e))throw O("COL8",{key:t,when:e});if(!Ar.includes(t))throw R("COL9",{key:t});if("post"===e&&"create"===t&&!0===a)throw R("COL10",{when:e,key:t,parallel:a});var n=r.bind(this),i=a?"parallel":"series";this.hooks[t]=this.hooks[t]||{},this.hooks[t][e]=this.hooks[t][e]||{series:[],parallel:[]},this.hooks[t][e][i].push(n)},t.getHooks=function(e,t){return this.hooks[t]&&this.hooks[t][e]?this.hooks[t][e]:{series:[],parallel:[]}},t.hasHooks=function(e,t){if(!this.hooks[t]||!this.hooks[t][e])return!1;var r=this.getHooks(e,t);return!!r&&(r.series.length>0||r.parallel.length>0)},t._runHooks=function(e,t,r,a){var n=this.getHooks(e,t);if(!n)return ue.em;var i=n.series.map(e=>()=>e(r,a));return(0,ue.h$)(i).then(()=>Promise.all(n.parallel.map(e=>e(r,a))))},t._runHooksSync=function(e,t,r,a){if(this.hasHooks(e,t)){var n=this.getHooks(e,t);n&&n.series.forEach(e=>e(r,a))}},t.promiseWait=function(e){return new Promise(t=>{var r=setTimeout(()=>{this.timeouts.delete(r),t()},e);this.timeouts.add(r)})},t.close=async function(){return this.closed?ue.Dr:(Tr.delete(this),await Promise.all(this.onClose.map(e=>e())),this.closed=!0,Array.from(this.timeouts).forEach(e=>clearTimeout(e)),this._changeEventBuffer&&this._changeEventBuffer.close(),this.database.requestIdlePromise().then(()=>this.storageInstance.close()).then(()=>(this._subs.forEach(e=>e.unsubscribe()),delete this.database.collections[this.name],this.database.collectionsSubject$.next({collection:this.asRxCollection,type:"CLOSED"}),st("postCloseRxCollection",this).then(()=>!0))))},t.remove=async function(){await this.close(),await Promise.all(this.onRemove.map(e=>e())),await Rr(this.database.storage,this.database.internalStore,this.database.token,this.database.name,this.name,this.database.multiInstance,this.database.password,this.database.hashFunction)},(0,b.A)(e,[{key:"insert$",get:function(){return this.$.pipe((0,Nt.p)(e=>"INSERT"===e.operation))}},{key:"update$",get:function(){return this.$.pipe((0,Nt.p)(e=>"UPDATE"===e.operation))}},{key:"remove$",get:function(){return this.$.pipe((0,Nt.p)(e=>"DELETE"===e.operation))}},{key:"asRxCollection",get:function(){return this}}])}();var Qr=r(7635),Wr=r(5525),Fr=new Set,Hr=new Map,Kr=function(){function e(e,t,r,a,n,i,s=!1,o={},c,u,h,l,d,m){this.idleQueue=new Qr.G,this.rxdbVersion=Ct,this.storageInstances=new Set,this._subs=[],this.startupErrors=[],this.onClose=[],this.closed=!1,this.collections={},this.states={},this.eventBulks$=new ae.B,this.closePromise=null,this.collectionsSubject$=new ae.B,this.observable$=this.eventBulks$.pipe((0,Gt.Z)(e=>Wt(e))),this.storageToken=ue.Dr,this.storageTokenDocument=ue.Dr,this.emittedEventBulkIds=new Wr.p4(6e4),this.name=e,this.token=t,this.storage=r,this.instanceCreationOptions=a,this.password=n,this.multiInstance=i,this.eventReduce=s,this.options=o,this.internalStore=c,this.hashFunction=u,this.cleanupPolicy=h,this.allowSlowCount=l,this.reactivity=d,this.onClosed=m,"pseudoInstance"!==this.name&&(this.internalStore=mt(this.asRxDatabase,c,Dr),this.storageTokenDocument=async function(e){var t=(0,N.zs)(10),r=e.password?await e.hashFunction(JSON.stringify(e.password)):void 0,a=[{document:{id:Ir,context:wr,key:kr,data:{rxdbVersion:e.rxdbVersion,token:t,instanceToken:e.token,passwordHash:r},_deleted:!1,_meta:{lwt:1},_rev:"",_attachments:{}}}],n=await e.internalStore.bulkWrite(a,"internal-add-storage-token");if(!n.error[0])return vt("id",a,n)[0];var i=(0,me.ZN)(n.error[0]);if(i.isError&&S(i)){var s=i;if(!function(e,t){if(!e)return!1;var r=e.split(".")[0],a=t.split(".")[0];return"16"===r&&"17"===a||r===a}(s.documentInDb.data.rxdbVersion,e.rxdbVersion))throw R("DM5",{args:{database:e.name,databaseStateVersion:s.documentInDb.data.rxdbVersion,codeVersion:e.rxdbVersion}});if(r&&r!==s.documentInDb.data.passwordHash)throw R("DB1",{passwordHash:r,existingPasswordHash:s.documentInDb.data.passwordHash});var o=s.documentInDb;return(0,me.ZN)(o)}throw i}(this.asRxDatabase).catch(e=>this.startupErrors.push(e)),this.storageToken=this.storageTokenDocument.then(e=>e.data.token).catch(e=>this.startupErrors.push(e)))}var t=e.prototype;return t.getReactivityFactory=function(){if(!this.reactivity)throw R("DB14",{database:this.name});return this.reactivity},t[Symbol.asyncDispose]=async function(){await this.close()},t.$emit=function(e){this.emittedEventBulkIds.has(e.id)||(this.emittedEventBulkIds.add(e.id),this.eventBulks$.next(e))},t.removeCollectionDoc=async function(e,t){var r=await ot(this.internalStore,xr(Er(e,t),br));if(!r)throw R("SNH",{name:e,schema:t});var a=dt(r);a._deleted=!0,await this.internalStore.bulkWrite([{document:a,previous:r}],"rx-database-remove-collection")},t.addCollections=async function(e){var t={},r={},a=[],n={};await Promise.all(Object.entries(e).map(async([e,i])=>{var o=e,c=i.schema;t[o]=c;var u=Pt(c,this.hashFunction);if(r[o]=u,this.collections[e])throw R("DB3",{name:e});var h=Er(e,c),l={id:xr(h,br),key:h,context:br,data:{name:o,schemaHash:await u.hash,schema:u.jsonSchema,version:u.version,connectedStorages:[]},_deleted:!1,_meta:{lwt:1},_rev:"",_attachments:{}};a.push({document:l});var d=Object.assign({},i,{name:o,schema:u,database:this}),m=s(i);m.database=this,m.name=e,it("preCreateRxCollection",m),d.conflictHandler=m.conflictHandler,n[o]=d}));var i=await this.internalStore.bulkWrite(a,"rx-database-add-collection");await async function(e){if(await e.storageToken,e.startupErrors[0])throw e.startupErrors[0]}(this),await Promise.all(i.error.map(async e=>{if(409!==e.status)throw R("DB12",{database:this.name,writeError:e});var a=(0,me.ZN)(e.documentInDb),n=a.data.name,i=r[n];if(a.data.schemaHash!==await i.hash)throw R("DB6",{database:this.name,collection:n,previousSchemaHash:a.data.schemaHash,schemaHash:await i.hash,previousSchema:a.data.schema,schema:(0,me.ZN)(t[n])})}));var o={};return await Promise.all(Object.keys(e).map(async e=>{var t=n[e],r=await async function({database:e,name:t,schema:r,instanceCreationOptions:a={},migrationStrategies:n={},autoMigrate:i=!0,statics:s={},methods:o={},attachments:c={},options:u={},localDocuments:h=!1,cacheReplacementPolicy:l=or,conflictHandler:d=Nr}){var m={databaseInstanceToken:e.token,databaseName:e.name,collectionName:t,schema:r.jsonSchema,options:a,multiInstance:e.multiInstance,password:e.password,devMode:x.isDevMode()};it("preCreateRxStorageInstance",m);var f=await async function(e,t){return t.multiInstance=e.multiInstance,await e.storage.createStorageInstance(t)}(e,m),p=new Lr(e,t,r,f,a,n,o,c,u,l,s,d);try{await p.prepare(),Object.entries(s).forEach(([e,t])=>{Object.defineProperty(p,e,{get:()=>t.bind(p)})}),it("createRxCollection",{collection:p,creator:{name:t,schema:r,storageInstance:f,instanceCreationOptions:a,migrationStrategies:n,methods:o,attachments:c,options:u,cacheReplacementPolicy:l,localDocuments:h,statics:s}}),i&&0!==p.schema.version&&await p.migratePromise()}catch(v){throw Tr.delete(p),await f.close(),v}return p}(t);o[e]=r,this.collections[e]=r,this.collectionsSubject$.next({collection:r,type:"ADDED"}),this[e]||Object.defineProperty(this,e,{get:()=>this.collections[e]})})),o},t.lockedRun=function(e){return this.idleQueue.wrapCall(e)},t.requestIdlePromise=function(){return this.idleQueue.requestIdlePromise()},t.exportJSON=function(e){throw qt("json-dump")},t.addState=function(e){throw qt("state")},t.importJSON=function(e){throw qt("json-dump")},t.backup=function(e){throw qt("backup")},t.leaderElector=function(){throw qt("leader-election")},t.isLeader=function(){throw qt("leader-election")},t.waitForLeadership=function(){throw qt("leader-election")},t.migrationStates=function(){throw qt("migration-schema")},t.close=function(){if(this.closePromise)return this.closePromise;var{promise:e,resolve:t}=zr(),r=e=>{this.onClosed&&this.onClosed(),this.closed=!0,t(e)};return this.closePromise=e,(async()=>{if(await st("preCloseRxDatabase",this),this.eventBulks$.complete(),this.collectionsSubject$.complete(),this._subs.map(e=>e.unsubscribe()),"pseudoInstance"!==this.name)return this.requestIdlePromise().then(()=>Promise.all(this.onClose.map(e=>e()))).then(()=>Promise.all(Object.keys(this.collections).map(e=>this.collections[e]).map(e=>e.close()))).then(()=>this.internalStore.close()).then(()=>r(!0));r(!1)})(),e},t.remove=function(){return this.close().then(()=>async function(e,t,r=!0,a){var n=(0,N.zs)(10),i=await Ur(n,t,e,{},r,a),s=await _r(i),o=new Set;s.forEach(e=>o.add(e.data.name));var c=Array.from(o);return await Promise.all(c.map(s=>Rr(t,i,n,e,s,r,a))),await st("postRemoveRxDatabase",{databaseName:e,storage:t}),await i.remove(),c}(this.name,this.storage,this.multiInstance,this.password))},(0,b.A)(e,[{key:"$",get:function(){return this.observable$}},{key:"collections$",get:function(){return this.collectionsSubject$.asObservable()}},{key:"asRxDatabase",get:function(){return this}}])}();function zr(){var e,t;return{promise:new Promise((r,a)=>{e=r,t=a}),resolve:e,reject:t}}function Zr(e,t){return t.name+"|"+e}async function Ur(e,t,r,a,n,i){return await t.createStorageInstance({databaseInstanceToken:e,databaseName:r,collectionName:"_rxdb_internal",schema:Dr,options:a,multiInstance:n,password:i,devMode:x.isDevMode()})}function Vr({storage:e,instanceCreationOptions:t,name:r,password:a,multiInstance:n=!0,eventReduce:i=!0,ignoreDuplicate:s=!1,options:o={},cleanupPolicy:c,closeDuplicates:u=!1,allowSlowCount:h=!1,localDocuments:l=!1,hashFunction:d=ce,reactivity:m}){it("preCreateRxDatabase",{storage:e,instanceCreationOptions:t,name:r,password:a,multiInstance:n,eventReduce:i,ignoreDuplicate:s,options:o,localDocuments:l});var f=Zr(r,e),p=Hr.get(f)||new Set,v=zr(),y=Array.from(p),g=()=>{p.delete(v.promise),Fr.delete(f)};return p.add(v.promise),Hr.set(f,p),(async()=>{if(u&&await Promise.all(y.map(e=>e.catch(()=>null).then(e=>e&&e.close()))),s){if(!x.isDevMode())throw R("DB9",{database:r})}else!function(e,t){if(Fr.has(Zr(e,t)))throw R("DB8",{name:e,storage:t.name,link:"https://rxdb.info/rx-database.html#ignoreduplicate"})}(r,e);Fr.add(f);var p=(0,N.zs)(10),v=await Ur(p,e,r,t,n,a),b=new Kr(r,p,e,t,a,n,i,o,v,d,c,h,m,g);return await st("createRxDatabase",{database:b,creator:{storage:e,instanceCreationOptions:t,name:r,password:a,multiInstance:n,eventReduce:i,ignoreDuplicate:s,options:o,localDocuments:l}}),b})().then(e=>{v.resolve(e)}).catch(e=>{v.reject(e),g()}),v.promise}var Jr={RxSchema:jt.prototype,RxDocument:Kt,RxQuery:pr.prototype,RxCollection:Lr.prototype,RxDatabase:Kr.prototype},Gr=new Set,Xr=new Set;var Yr=new WeakMap,ea=new WeakMap;function ta(e){var t=Yr.get(e);if(!t){var r=e.database?e.database:e,a=e.database?e.name:"";throw R("LD8",{database:r.name,collection:a})}return t}function ra(e,t,r,a,n,i){return t.createStorageInstance({databaseInstanceToken:e,databaseName:r,collectionName:ia(a),schema:sa,options:n,multiInstance:i,devMode:x.isDevMode()})}function aa(e){var t=Yr.get(e);if(t)return Yr.delete(e),t.then(e=>e.storageInstance.close())}async function na(e,t,r){var a=(0,N.zs)(10),n=await ra(a,e,t,r,{},!1);await n.remove()}function ia(e){return"plugin-local-documents-"+e}var sa=q({title:"RxLocalDocument",version:0,primaryKey:"id",type:"object",properties:{id:{type:"string",maxLength:128},data:{type:"object",additionalProperties:!0}},required:["id","data"]});async function oa(e,t){var r=await ta(this),a={id:e,data:t,_deleted:!1,_meta:{lwt:1},_rev:"",_attachments:{}};return ct(r.storageInstance,{document:a},"local-document-insert").then(e=>r.docCache.getCachedRxDocument(e))}function ca(e,t){return this.getLocal(e).then(r=>r?r.incrementalModify(()=>t):this.insertLocal(e,t))}async function ua(e){var t=await ta(this),r=t.docCache,a=r.getLatestDocumentDataIfExists(e);return a?Promise.resolve(r.getCachedRxDocument(a)):ot(t.storageInstance,e).then(e=>e?t.docCache.getCachedRxDocument(e):null)}function ha(e){return this.$.pipe((0,Bt.Z)(null),(0,Gt.Z)(async t=>t?{changeEvent:t}:{doc:await this.getLocal(e)}),(0,Gt.Z)(async t=>{if(t.changeEvent){var r=t.changeEvent;return r.isLocal&&r.documentId===e?{use:!0,doc:await this.getLocal(e)}:{use:!1}}return{use:!0,doc:t.doc}}),(0,Nt.p)(e=>e.use),(0,$t.T)(e=>e.doc))}var la=function(e){function t(t,r,a){var n;return(n=e.call(this,null,r)||this).id=t,n.parent=a,n}return(0,w.A)(t,e),t}(zt()),da={get isLocal(){return!0},get allAttachments$(){throw R("LD1",{document:this})},get primaryPath(){return"id"},get primary(){return this.id},get $(){var e=n(ea,this.parent),t=this.primary;return this.parent.eventBulks$.pipe((0,Nt.p)(e=>!!e.isLocal),(0,$t.T)(e=>e.events.find(e=>e.documentId===t)),(0,Nt.p)(e=>!!e),(0,$t.T)(e=>Tt((0,me.ZN)(e))),(0,Bt.Z)(e.docCache.getLatestDocumentData(this.primary)),(0,Mt.F)((e,t)=>e._rev===t._rev),(0,$t.T)(t=>e.docCache.getCachedRxDocument(t)),(0,At.t)(me.bz))},get $$(){var e=this,t=pa(e);return t.getReactivityFactory().fromObservable(e.$,e.getLatest()._data,t)},get deleted$$(){var e=this,t=pa(e);return t.getReactivityFactory().fromObservable(e.deleted$,e.getLatest().deleted,t)},getLatest(){var e=n(ea,this.parent),t=e.docCache.getLatestDocumentData(this.primary);return e.docCache.getCachedRxDocument(t)},get(e){if(e="data."+e,this._data){if("string"!=typeof e)throw O("LD2",{objPath:e});var t=v(this._data,e);return t=x.deepFreezeWhenDevMode(t)}},get$(e){if(e="data."+e,x.isDevMode()){if(e.includes(".item."))throw R("LD3",{objPath:e});if(e===this.primaryPath)throw R("LD4")}return this.$.pipe((0,$t.T)(e=>e._data),(0,$t.T)(t=>v(t,e)),(0,Mt.F)())},get$$(e){var t=pa(this);return t.getReactivityFactory().fromObservable(this.get$(e),this.getLatest().get(e),t)},async incrementalModify(e){var t=await ta(this.parent);return t.incrementalWriteQueue.addWrite(this._data,async t=>(t.data=await e(t.data,this),t)).then(e=>t.docCache.getCachedRxDocument(e))},incrementalPatch(e){return this.incrementalModify(t=>(Object.entries(e).forEach(([e,r])=>{t[e]=r}),t))},async _saveData(e){var t=await ta(this.parent),r=this._data;e.id=this.id;var a=[{previous:r,document:e}];return t.storageInstance.bulkWrite(a,"local-document-save-data").then(t=>{if(t.error[0])throw t.error[0];var r=vt(this.collection.schema.primaryPath,a,t)[0];(e=s(e))._rev=r._rev})},async remove(){var e=await ta(this.parent),t=s(this._data);return t._deleted=!0,ct(e.storageInstance,{previous:this._data,document:t},"local-document-remove").then(t=>e.docCache.getCachedRxDocument(t))}},ma=!1,fa=()=>{if(!ma){ma=!0;var e=Kt;Object.getOwnPropertyNames(e).forEach(t=>{if(!Object.getOwnPropertyDescriptor(da,t)){var r=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(da,t,r)}});["populate","update","putAttachment","putAttachmentBase64","getAttachment","allAttachments"].forEach(e=>da[e]=(e=>()=>{throw R("LD6",{functionName:e})})(e))}};function pa(e){var t=e.parent;return t instanceof Kr?t:t.database}function va(e){var t=e.database?e.database:e,r=e.database?e.name:"",a=(async()=>{var a=await ra(t.token,t.storage,t.name,r,t.instanceCreationOptions,t.multiInstance);a=mt(t,a,sa);var n=new ur("id",t.eventBulks$.pipe((0,Nt.p)(e=>{var t=!1;return(""===r&&!e.collectionName||""!==r&&e.collectionName===r)&&(t=!0),t&&e.isLocal}),(0,$t.T)(e=>e.events)),t=>function(e,t){fa();var r=new la(e.id,e,t);return Object.setPrototypeOf(r,da),r.prototype=da,r}(t,e)),i=new Ft(a,"id",()=>{},()=>{}),s=await t.storageToken,o=a.changeStream().subscribe(r=>{for(var a=new Array(r.events.length),n=r.events,i=e.database?e.name:void 0,o=0;o{e.insertLocal=oa,e.upsertLocal=ca,e.getLocal=ua,e.getLocal$=ha},RxDatabase:e=>{e.insertLocal=oa,e.upsertLocal=ca,e.getLocal=ua,e.getLocal$=ha}},hooks:{createRxDatabase:{before:e=>{e.creator.localDocuments&&va(e.database)}},createRxCollection:{before:e=>{e.creator.localDocuments&&va(e.collection)}},preCloseRxDatabase:{after:e=>aa(e)},postCloseRxCollection:{after:e=>aa(e)},postRemoveRxDatabase:{after:e=>na(e.storage,e.databaseName,"")},postRemoveRxCollection:{after:e=>na(e.storage,e.databaseName,e.collectionName)}},overwritable:{}};let ga;function ba(){return"undefined"!=typeof window&&window.indexedDB}function wa(){return ga||(ga=(async()=>{!function(e){if(it("preAddRxPlugin",{plugin:e,plugins:Gr}),!Gr.has(e)){if(Xr.has(e.name))throw R("PL3",{name:e.name,plugin:e});if(Gr.add(e),Xr.add(e.name),!e.rxdb)throw O("PL1",{plugin:e});e.init&&e.init(),e.prototypes&&Object.entries(e.prototypes).forEach(([e,t])=>t(Jr[e])),e.overwritable&&Object.assign(x,e.overwritable),e.hooks&&Object.entries(e.hooks).forEach(([e,t])=>{t.after&&nt[e].push(t.after),t.before&&nt[e].unshift(t.before)})}}(ya);return await Vr({name:"rxdb-landing-v4",localDocuments:!0,storage:Ot()})})()),ga}},8342(e,t,r){r.d(t,{L$:()=>s,Z2:()=>i,zs:()=>n});var a="abcdefghijklmnopqrstuvwxyz";function n(e=10){for(var t="",r=0;rl,contentTitle:()=>i,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"releases/8.0.0","title":"Meet RxDB 8.0.0 - New Defaults & Performance","description":"Discover how RxDB 8.0.0 boosts performance, simplifies schema handling, and streamlines reactive data updates for modern apps.","source":"@site/docs/releases/8.0.0.md","sourceDirName":"releases","slug":"/releases/8.0.0.html","permalink":"/releases/8.0.0.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Meet RxDB 8.0.0 - New Defaults & Performance","slug":"8.0.0.html","description":"Discover how RxDB 8.0.0 boosts performance, simplifies schema handling, and streamlines reactive data updates for modern apps."},"sidebar":"tutorialSidebar","previous":{"title":"9.0.0","permalink":"/releases/9.0.0.html"},"next":{"title":"Benefits of RxDB & Browser Databases","permalink":"/articles/browser-database.html"}}');var a=s(4848),o=s(8453);const r={title:"Meet RxDB 8.0.0 - New Defaults & Performance",slug:"8.0.0.html",description:"Discover how RxDB 8.0.0 boosts performance, simplifies schema handling, and streamlines reactive data updates for modern apps."},i="8.0.0",l={},c=[{value:"disableKeyCompression by default",id:"disablekeycompression-by-default",level:2},{value:"collection() now only accepts a RxJsonSchema as schema",id:"collection-now-only-accepts-a-rxjsonschema-as-schema",level:2},{value:"required fields have to be set via array",id:"required-fields-have-to-be-set-via-array",level:2},{value:"Setters are only callable on temporary documents",id:"setters-are-only-callable-on-temporary-documents",level:2},{value:"middleware-hooks contain plain json as first parameter and RxDocument as second",id:"middleware-hooks-contain-plain-json-as-first-parameter-and-rxdocument-as-second",level:2},{value:"multiInstance is now done via broadcast-channel",id:"multiinstance-is-now-done-via-broadcast-channel",level:2},{value:"Set QueryChangeDetection via RxDatabase-option",id:"set-querychangedetection-via-rxdatabase-option",level:2},{value:"Reuse an RxDocument-prototype per collection instead of adding getters/setters to each document",id:"reuse-an-rxdocument-prototype-per-collection-instead-of-adding-getterssetters-to-each-document",level:2},{value:"Rewritten the inMemory-plugin",id:"rewritten-the-inmemory-plugin",level:2},{value:"Some comparisons",id:"some-comparisons",level:2}];function d(e){const n={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"800",children:"8.0.0"})}),"\n",(0,a.jsxs)(n.p,{children:["When I created RxDB, two years ago, there where some things that I did not consider and other things that I just decided wrong.\nWith the breaking version ",(0,a.jsx)(n.code,{children:"8.0.0"})," I rewrote some parts of RxDB and changed the API a bit. The focus laid on ",(0,a.jsx)(n.strong,{children:"better defaults"})," and ",(0,a.jsx)(n.strong,{children:"better performance"}),"."]}),"\n",(0,a.jsx)(n.h2,{id:"disablekeycompression-by-default",children:"disableKeyCompression by default"}),"\n",(0,a.jsxs)(n.p,{children:["Because the keyCompression was confusing and most users do not use it, it is now disabled by default. Also the naming was bad, so ",(0,a.jsx)(n.code,{children:"disableKeyCompression"})," is now renamed to ",(0,a.jsx)(n.code,{children:"keyCompression"})," which defaults to ",(0,a.jsx)(n.code,{children:"false"}),"."]}),"\n",(0,a.jsx)(n.h2,{id:"collection-now-only-accepts-a-rxjsonschema-as-schema",children:"collection() now only accepts a RxJsonSchema as schema"}),"\n",(0,a.jsxs)(n.p,{children:["In the past, it was allowed to set an ",(0,a.jsx)(n.code,{children:"RxSchema"})," or an ",(0,a.jsx)(n.code,{children:"RxJsonSchema"})," as ",(0,a.jsx)(n.code,{children:"schema"}),"-field when creating a collection. This was confusing and so it is now only allowed to use ",(0,a.jsx)(n.code,{children:"RxJsonSchema"}),"."]}),"\n",(0,a.jsx)(n.h2,{id:"required-fields-have-to-be-set-via-array",children:"required fields have to be set via array"}),"\n",(0,a.jsxs)(n.p,{children:["In the past it was allowed to set a field as required by setting the boolean value ",(0,a.jsx)(n.code,{children:"required: true"}),".\nThis is against the ",(0,a.jsx)(n.a,{href:"https://json-schema.org/understanding-json-schema/reference/object.html#required-properties",children:"json-schema-standard"})," and will make problems when switching between different schema-validation-plugins. Therefore required fields must now be set via ",(0,a.jsx)(n.code,{children:"required: ['fieldOne', 'fieldTwo']"}),"."]}),"\n",(0,a.jsx)(n.h2,{id:"setters-are-only-callable-on-temporary-documents",children:"Setters are only callable on temporary documents"}),"\n",(0,a.jsxs)(n.p,{children:["To be similar to mongoosejs, there was the possibility to set a documents value via ",(0,a.jsx)(n.code,{children:"myDoc.foo = 'bar'"})," and later call ",(0,a.jsx)(n.code,{children:"myDoc.save()"})," to persist these changes.\nBut there was the problem that we have no weak pointers in javascript and therefore we have to store all document-instances in a cache to run change-events on them and make them 'reactive'. To save memory-space, we reuse the same documents when they are used multiple times. This made it hard to determine what happens when multiple parts of an application used the setters at the same time. Also there was an undefined behavior what should happen when a field is changed via setter and also via replication before ",(0,a.jsx)(n.code,{children:"save()"})," was called."]}),"\n",(0,a.jsxs)(n.ul,{children:["\n",(0,a.jsxs)(n.li,{children:[(0,a.jsx)(n.code,{children:"myDoc.age = 50;"}),", ",(0,a.jsx)(n.code,{children:"myDoc.set('age', 50);"})," and ",(0,a.jsx)(n.code,{children:"myDoc.save()"})," is no more allowed on non-temporary-documents"]}),"\n",(0,a.jsxs)(n.li,{children:["Instead, to change document-data, use ",(0,a.jsx)(n.code,{children:"RxDocument.atomicUpdate()"})," or ",(0,a.jsx)(n.code,{children:"RxDocument.atomicSet()"})," or ",(0,a.jsx)(n.code,{children:"RxDocument.update()"}),"."]}),"\n",(0,a.jsxs)(n.li,{children:["The following document-methods no longer exist: ",(0,a.jsx)(n.code,{children:"synced$"}),", ",(0,a.jsx)(n.code,{children:"resync()"})]}),"\n"]}),"\n",(0,a.jsx)(n.h2,{id:"middleware-hooks-contain-plain-json-as-first-parameter-and-rxdocument-as-second",children:"middleware-hooks contain plain json as first parameter and RxDocument as second"}),"\n",(0,a.jsxs)(n.p,{children:["When the middleware-hooks where created, the goal was to work equal then ",(0,a.jsx)(n.a,{href:"http://mongoosejs.com/docs/middleware.html",children:"mongoose"}),". But this is not possible because mongoose is more 'static' and its documents never change their attributes. RxDB is a reactive database and when the state on disc changes, the attributes of the document also change. This caused some undefined behavior especially with async middleware-hooks. To solve this, hooks now can only modify the plain data, not the ",(0,a.jsx)(n.code,{children:"RxDocument"})," itself."]}),"\n",(0,a.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(n.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".preSave"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(data"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" rxDocument) {"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // to set age to 50 before saving, change the first parameter"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" data"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".age "}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 50"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})}),"\n",(0,a.jsx)(n.h2,{id:"multiinstance-is-now-done-via-broadcast-channel",children:"multiInstance is now done via broadcast-channel"}),"\n",(0,a.jsxs)(n.p,{children:["Because the ",(0,a.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API",children:"BroadcastChannel-API"})," is not usable in all browsers and also not in NodeJs, multiInstance-communication was hard. The hacky workaround was to use a pseudo-socket and regularly check if an other instance has emitted a ",(0,a.jsx)(n.code,{children:"RxChangeEvent"}),".\nThis was expensive because even when the database did nothing, we wasted disk-IO and CPU by handling this."]}),"\n",(0,a.jsxs)(n.p,{children:["To solve this waste, I spend one month creating ",(0,a.jsx)(n.a,{href:"https://github.com/pubkey/broadcast-channel",children:"a module that polyfills the broadcast-channel-api"})," so it works on old browsers, new browsers and even NodeJs. This does not only waste less resources but also has a lower latency. Also the module is used by more projects than RxDB which allows use the fix bugs and improve performance together."]}),"\n",(0,a.jsx)(n.h2,{id:"set-querychangedetection-via-rxdatabase-option",children:"Set QueryChangeDetection via RxDatabase-option"}),"\n",(0,a.jsxs)(n.p,{children:["In the past, the QueryChangeDetection had to be enabled by importing the QueryChangeDetection and calling a function on it. This was strange and also did not allow to toggle the QueryChangeDetection on specific databases.\nNow we set the QueryChangeDetection by adding the boolean field ",(0,a.jsx)(n.code,{children:"queryChangeDetection: true"})," when creating the database."]}),"\n",(0,a.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(n.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" RxDB"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".create"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'heroesdb'"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" adapter"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'idb'"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" queryChangeDetection"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- queryChangeDetection (optional, default: false)"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(db);"})]})]})})}),"\n",(0,a.jsx)(n.h2,{id:"reuse-an-rxdocument-prototype-per-collection-instead-of-adding-getterssetters-to-each-document",children:"Reuse an RxDocument-prototype per collection instead of adding getters/setters to each document"}),"\n",(0,a.jsxs)(n.p,{children:["Because the fields of an ",(0,a.jsx)(n.code,{children:"RxDocument"})," are defined dynamically by the schema and we could not use the ",(0,a.jsx)(n.code,{children:"Proxy"}),"-Object because it is not supported in IE11, there was one workaround used: Each time a document is created, all getters and setters where applied on it. This was expensive and now we use a different approach.\nOnce per collection, a custom RxDocument-prototype and constructor is created and each RxDocument of this collection is created with the constructor. This change is a rewrite internally and should not change anything for RxDB-users. If you use RxDB with vuejs, you might get some problems that can be fixed by upgrading vuejs to the latest version."]}),"\n",(0,a.jsx)(n.h2,{id:"rewritten-the-inmemory-plugin",children:"Rewritten the inMemory-plugin"}),"\n",(0,a.jsxs)(n.p,{children:["The inMemory-plugin was written with some wrong estimations. I rewrote it and added much more tests. Also ",(0,a.jsx)(n.code,{children:"awaitPersistence()"})," can now be used to check if all writes have already been replicated into the parent collection. Also ",(0,a.jsx)(n.code,{children:"RxCollection.watchForChanges()"})," got split out from the ",(0,a.jsx)(n.code,{children:"replication"}),"-plugin into its own ",(0,a.jsx)(n.code,{children:"watch-for-changes"}),"-plugin because it is used in the inMemory and the replication functionality."]}),"\n",(0,a.jsx)(n.h2,{id:"some-comparisons",children:"Some comparisons"}),"\n",(0,a.jsx)(n.p,{children:"(Tested with node 10.6.0 and the memory-adapter, lower is better)"}),"\n",(0,a.jsxs)(n.p,{children:["Reproduce with ",(0,a.jsx)(n.code,{children:"npm run build:size"})," and ",(0,a.jsx)(n.code,{children:"npm run test:performance"})]}),"\n",(0,a.jsxs)(n.table,{children:[(0,a.jsx)(n.thead,{children:(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.th,{style:{textAlign:"center"}}),(0,a.jsx)(n.th,{style:{textAlign:"center"},children:"7.7.1"}),(0,a.jsx)(n.th,{children:"8.0.0"})]})}),(0,a.jsxs)(n.tbody,{children:[(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{style:{textAlign:"center"},children:"Bundle-Size (Webpack+minify+gzip)"}),(0,a.jsx)(n.td,{style:{textAlign:"center"},children:"110 kb"}),(0,a.jsx)(n.td,{children:"101.962 kb"})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{style:{textAlign:"center"},children:"Spawn 1000 databases with 5 collections each"}),(0,a.jsx)(n.td,{style:{textAlign:"center"},children:"8744 ms"}),(0,a.jsx)(n.td,{children:"9906 ms"})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{style:{textAlign:"center"},children:"insert 2000 documents"}),(0,a.jsx)(n.td,{style:{textAlign:"center"},children:"8006 ms"}),(0,a.jsx)(n.td,{children:"5781 ms"})]}),(0,a.jsxs)(n.tr,{children:[(0,a.jsx)(n.td,{style:{textAlign:"center"},children:"find 10.000 documents"}),(0,a.jsx)(n.td,{style:{textAlign:"center"},children:"3202 ms"}),(0,a.jsx)(n.td,{children:"1312 ms"})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453(e,n,s){s.d(n,{R:()=>r,x:()=>i});var t=s(6540);const a={},o=t.createContext(a);function r(e){const n=t.useContext(o);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/4616b86a.247bc33b.js b/docs/assets/js/4616b86a.247bc33b.js deleted file mode 100644 index ec820b92093..00000000000 --- a/docs/assets/js/4616b86a.247bc33b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[465],{3247(e,n,o){o.d(n,{g:()=>r});var s=o(4848);function r(e){const n=[];let o=null;return e.children.forEach(e=>{e.props.id?(o&&n.push(o),o={headline:e,paragraphs:[]}):o&&o.paragraphs.push(e)}),o&&n.push(o),(0,s.jsx)("div",{style:t.stepsContainer,children:n.map((e,n)=>(0,s.jsxs)("div",{style:t.stepWrapper,children:[(0,s.jsxs)("div",{style:t.stepIndicator,children:[(0,s.jsx)("div",{style:t.stepNumber,children:n+1}),(0,s.jsx)("div",{style:t.verticalLine})]}),(0,s.jsxs)("div",{style:t.stepContent,children:[(0,s.jsx)("div",{children:e.headline}),e.paragraphs.map((e,n)=>(0,s.jsx)("div",{style:t.item,children:e},n))]})]},n))})}const t={stepsContainer:{display:"flex",flexDirection:"column"},stepWrapper:{display:"flex",alignItems:"stretch",marginBottom:"1.5rem",position:"relative",minWidth:0},stepIndicator:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",width:"33px",marginRight:"1rem",minWidth:0},stepNumber:{width:"33px",height:"33px",borderRadius:"50%",backgroundColor:"var(--color-top)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:"bold",marginTop:-4},verticalLine:{position:"absolute",top:29,bottom:"0",left:"50%",width:"1px",background:"linear-gradient(to bottom, var(--color-top) 0%, var(--color-top) 80%, rgba(0,0,0,0) 100%)",transform:"translateX(-50%)"},stepContent:{flex:1,minWidth:0,overflowWrap:"break-word"},item:{marginTop:"0.5rem"}}},3844(e,n,o){o.r(n),o.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>g,frontMatter:()=>i,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"rx-storage-mongodb","title":"Unlock MongoDB Power with RxDB","description":"Combine RxDB\'s real-time sync with MongoDB\'s scalability. Harness the MongoDB RxStorage to seamlessly expand your database capabilities.","source":"@site/docs/rx-storage-mongodb.md","sourceDirName":".","slug":"/rx-storage-mongodb.html","permalink":"/rx-storage-mongodb.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Unlock MongoDB Power with RxDB","slug":"rx-storage-mongodb.html","description":"Combine RxDB\'s real-time sync with MongoDB\'s scalability. Harness the MongoDB RxStorage to seamlessly expand your database capabilities."},"sidebar":"tutorialSidebar","previous":{"title":"Dexie.js","permalink":"/rx-storage-dexie.html"},"next":{"title":"DenoKV","permalink":"/rx-storage-denokv.html"}}');var r=o(4848),t=o(8453),a=o(3247);const i={title:"Unlock MongoDB Power with RxDB",slug:"rx-storage-mongodb.html",description:"Combine RxDB's real-time sync with MongoDB's scalability. Harness the MongoDB RxStorage to seamlessly expand your database capabilities."},l="MongoDB RxStorage",d={},c=[{value:"Limitations of the MongoDB RxStorage",id:"limitations-of-the-mongodb-rxstorage",level:2},{value:"Using the MongoDB RxStorage",id:"using-the-mongodb-rxstorage",level:2},{value:"Install the mongodb package",id:"install-the-mongodb-package",level:3},{value:"Setups the MongoDB RxStorage",id:"setups-the-mongodb-rxstorage",level:3}];function h(e){const n={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"mongodb-rxstorage",children:"MongoDB RxStorage"})}),"\n",(0,r.jsxs)(n.p,{children:["RxDB MongoDB RxStorage is an RxDB ",(0,r.jsx)(n.a,{href:"/rx-storage.html",children:"RxStorage"})," that allows you to use ",(0,r.jsx)(n.a,{href:"https://www.mongodb.com/",children:"MongoDB"})," as the underlying storage engine for your RxDB database. With this you can take advantage of MongoDB's features and scalability while benefiting from RxDB's real-time data synchronization capabilities."]}),"\n",(0,r.jsx)("p",{align:"center",children:(0,r.jsx)("img",{src:"./files/icons/mongodb.svg",alt:"MongoDB storage",height:"100",class:"img-padding"})}),"\n",(0,r.jsxs)(n.p,{children:["The storage is made to work with any plain MongoDB Server, ",(0,r.jsx)(n.a,{href:"https://www.mongodb.com/docs/manual/tutorial/deploy-replica-set/",children:"MongoDB Replica Set"}),", ",(0,r.jsx)(n.a,{href:"https://www.mongodb.com/docs/manual/sharding/",children:"Sharded MongoDB Cluster"})," or ",(0,r.jsx)(n.a,{href:"https://www.mongodb.com/atlas/database",children:"Atlas Cloud Database"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"limitations-of-the-mongodb-rxstorage",children:"Limitations of the MongoDB RxStorage"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Multiple Node.js servers using the same MongoDB database is currently not supported"}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/rx-attachment.html",children:"RxAttachments"})," are currently not supported"]}),"\n",(0,r.jsx)(n.li,{children:"Doing non-RxDB writes on the MongoDB database is not supported. RxDB expects all writes to come from RxDB which update the required metadata. Doing non-RxDB writes can confuse the RxDatabase and lead to undefined behavior. But you can perform read-queries on the MongoDB storage from the outside at any time."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"using-the-mongodb-rxstorage",children:"Using the MongoDB RxStorage"}),"\n",(0,r.jsxs)(a.g,{children:[(0,r.jsx)(n.h3,{id:"install-the-mongodb-package",children:"Install the mongodb package"}),(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,r.jsx)(n.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string)"},children:" mongodb"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string)"},children:" --save"})]})})})}),(0,r.jsx)(n.h3,{id:"setups-the-mongodb-rxstorage",children:"Setups the MongoDB RxStorage"}),(0,r.jsxs)(n.p,{children:["To use the storage, you simply import the ",(0,r.jsx)(n.code,{children:"getRxStorageMongoDB"})," method and use that when creating the ",(0,r.jsx)(n.a,{href:"/rx-database.html",children:"RxDatabase"}),". The ",(0,r.jsx)(n.code,{children:"connection"})," parameter contains the ",(0,r.jsx)(n.a,{href:"https://www.mongodb.com/docs/manual/reference/connection-string/",children:"MongoDB connection string"}),"."]}),(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageMongoDB"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-mongodb'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDatabase"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageMongoDB"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * MongoDB connection string"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"@link"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" https://www.mongodb.com/docs/manual/reference/connection-string/"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" connection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mongodb://localhost:27017,localhost:27018,localhost:27019'"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})})]})]})}function g(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453(e,n,o){o.d(n,{R:()=>a,x:()=>i});var s=o(6540);const r={},t=s.createContext(r);function a(e){const n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/4777fd9a.5d703faa.js b/docs/assets/js/4777fd9a.5d703faa.js deleted file mode 100644 index 4bb061e719a..00000000000 --- a/docs/assets/js/4777fd9a.5d703faa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[6386],{692(e,a,i){i.r(a),i.d(a,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"alternatives","title":"Alternatives for realtime local-first JavaScript applications and local databases","description":"Explore real-time, local-first JS alternatives to RxDB. Compare Firebase, Meteor, AWS, CouchDB, and more for robust, seamless web/mobile app development.","source":"@site/docs/alternatives.md","sourceDirName":".","slug":"/alternatives.html","permalink":"/alternatives.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Alternatives for realtime local-first JavaScript applications and local databases","slug":"alternatives.html","description":"Explore real-time, local-first JS alternatives to RxDB. Compare Firebase, Meteor, AWS, CouchDB, and more for robust, seamless web/mobile app development."},"sidebar":"tutorialSidebar","previous":{"title":"Capacitor Database Guide - SQLite, RxDB & More","permalink":"/capacitor-database.html"},"next":{"title":"Electron Database - Storage adapters for SQLite, Filesystem and In-Memory","permalink":"/electron-database.html"}}');var s=i(4848),n=i(8453);const o={title:"Alternatives for realtime local-first JavaScript applications and local databases",slug:"alternatives.html",description:"Explore real-time, local-first JS alternatives to RxDB. Compare Firebase, Meteor, AWS, CouchDB, and more for robust, seamless web/mobile app development."},r="Alternatives for realtime offline-first JavaScript applications",l={},c=[{value:"Alternatives to RxDB",id:"alternatives-to-rxdb",level:2},{value:"Firebase",id:"firebase",level:3},{value:"Firebase - Realtime Database",id:"firebase---realtime-database",level:4},{value:"Firebase - Cloud Firestore",id:"firebase---cloud-firestore",level:4},{value:"Meteor",id:"meteor",level:3},{value:"Minimongo",id:"minimongo",level:3},{value:"WatermelonDB",id:"watermelondb",level:3},{value:"AWS Amplify",id:"aws-amplify",level:3},{value:"AWS Datastore",id:"aws-datastore",level:3},{value:"RethinkDB",id:"rethinkdb",level:3},{value:"Horizon",id:"horizon",level:3},{value:"Supabase",id:"supabase",level:3},{value:"CouchDB",id:"couchdb",level:3},{value:"PouchDB",id:"pouchdb",level:3},{value:"Couchbase",id:"couchbase",level:3},{value:"Cloudant",id:"cloudant",level:3},{value:"Hoodie",id:"hoodie",level:3},{value:"LokiJS",id:"lokijs",level:3},{value:"Gundb",id:"gundb",level:3},{value:"sql.js",id:"sqljs",level:3},{value:"absurd-sQL",id:"absurd-sql",level:3},{value:"NeDB",id:"nedb",level:3},{value:"Dexie.js",id:"dexiejs",level:3},{value:"LowDB",id:"lowdb",level:3},{value:"localForage",id:"localforage",level:3},{value:"MongoDB Realm",id:"mongodb-realm",level:3},{value:"Apollo",id:"apollo",level:3},{value:"Replicache",id:"replicache",level:3},{value:"InstantDB",id:"instantdb",level:3},{value:"Yjs",id:"yjs",level:3},{value:"ElectricSQL",id:"electricsql",level:3},{value:"SignalDB",id:"signaldb",level:3},{value:"PowerSync",id:"powersync",level:3}];function d(e){const a={a:"a",admonition:"admonition",code:"code",em:"em",figure:"figure",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",hr:"hr",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(a.header,{children:(0,s.jsx)(a.h1,{id:"alternatives-for-realtime-offline-first-javascript-applications",children:"Alternatives for realtime offline-first JavaScript applications"})}),"\n",(0,s.jsxs)(a.p,{children:["To give you an augmented view over the topic of client side JavaScript databases, this page contains all known alternatives to ",(0,s.jsx)(a.strong,{children:"RxDB"}),". Remember that you are reading this inside of the RxDB documentation, so everything is ",(0,s.jsx)(a.strong,{children:"opinionated"}),".\nIf you disagree with anything or think that something is missing, make a pull request to this file on the RxDB github repository."]}),"\n",(0,s.jsxs)(a.admonition,{type:"note",children:[(0,s.jsx)(a.p,{children:"RxDB has these main benefits:"}),(0,s.jsxs)(a.ul,{children:["\n",(0,s.jsxs)(a.li,{children:["RxDB is a battle proven tool ",(0,s.jsx)(a.a,{href:"/#reviews",children:"widely used"})," by companies in real projects in production."]}),"\n",(0,s.jsxs)(a.li,{children:["RxDB is not VC funded and therefore does not require you to use a specific cloud service to rip you off. RxDB can be used with your ",(0,s.jsx)(a.a,{href:"/replication-http.html",children:"own backend"})," or no backend at all."]}),"\n",(0,s.jsxs)(a.li,{children:["RxDB has a working business model of selling ",(0,s.jsx)(a.a,{href:"/premium/",children:"premium plugins"})," which ensures that RxDB will be maintained and improved continuously while many alternatives are dead already or seem to die soon."]}),"\n",(0,s.jsxs)(a.li,{children:["RxDB has years (since 2016) of performance optimization, bug fixing and feature adding. It is just working as is and there are close to zero ",(0,s.jsx)(a.a,{href:"https://github.com/pubkey/rxdb/issues",children:"open issues"}),"."]}),"\n"]}),(0,s.jsx)("center",{children:(0,s.jsx)("a",{href:"https://rxdb.info/",children:(0,s.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JavaScript Database",width:"220"})})})]}),"\n",(0,s.jsx)(a.hr,{}),"\n",(0,s.jsx)(a.h2,{id:"alternatives-to-rxdb",children:"Alternatives to RxDB"}),"\n",(0,s.jsxs)(a.p,{children:[(0,s.jsx)(a.a,{href:"https://rxdb.info",children:"RxDB"})," is an ",(0,s.jsx)(a.strong,{children:"observable"}),", ",(0,s.jsx)(a.strong,{children:"replicating"}),", ",(0,s.jsx)(a.strong,{children:(0,s.jsx)(a.a,{href:"/offline-first.html",children:"local first"})}),", ",(0,s.jsx)(a.strong,{children:"JavaScript"})," database. So it makes only sense to list similar projects as alternatives, not just any database or JavaScript store library. However, I will list up some projects that RxDB is often compared with, even if it only makes sense for some use cases.\nHere are the alternatives to RxDB:"]}),"\n",(0,s.jsx)(a.h3,{id:"firebase",children:"Firebase"}),"\n",(0,s.jsx)("p",{align:"center",children:(0,s.jsx)("img",{src:"./files/alternatives/firebase.svg",alt:"firebase alternative",class:"img-padding",height:"60"})}),"\n",(0,s.jsxs)(a.p,{children:["Firebase is a ",(0,s.jsx)(a.strong,{children:"platform"})," developed by Google for creating mobile and web applications. Firebase has many features and products, two of which are client side databases. The ",(0,s.jsx)(a.a,{href:"/articles/firebase-realtime-database-alternative.html",children:"Realtime Database"})," and the ",(0,s.jsx)(a.a,{href:"/articles/firestore-alternative.html",children:"Cloud Firestore"}),"."]}),"\n",(0,s.jsx)(a.h4,{id:"firebase---realtime-database",children:"Firebase - Realtime Database"}),"\n",(0,s.jsxs)(a.p,{children:['The firebase realtime database was the first database in firestore. It has to be mentioned that in this context, "realtime" means ',(0,s.jsx)(a.strong,{children:'"realtime replication"'}),', not "realtime computing". The firebase realtime database stores data as a big unstructured JSON tree that is replicated between clients and the backend.']}),"\n",(0,s.jsx)(a.h4,{id:"firebase---cloud-firestore",children:"Firebase - Cloud Firestore"}),"\n",(0,s.jsxs)(a.p,{children:["The firestore is the successor to the realtime database. The big difference is that it behaves more like a 'normal' database that stores data as documents inside of collections. The conflict resolution strategy of firestore is always ",(0,s.jsx)(a.em,{children:"last-write-wins"})," which might or might not be suitable for your use case."]}),"\n",(0,s.jsxs)(a.p,{children:["The biggest difference to RxDB is that firebase products are only able to be used on top of the Firebase cloud hosted backend, which creates a vendor lock-in. RxDB can replicate with any self hosted CouchDB server or custom GraphQL endpoints. You can even replicate Firestore to RxDB with the ",(0,s.jsx)(a.a,{href:"/replication-firestore.html",children:"Firestore Replication Plugin"}),"."]}),"\n",(0,s.jsx)(a.h3,{id:"meteor",children:"Meteor"}),"\n",(0,s.jsx)("p",{align:"center",children:(0,s.jsx)("img",{src:"./files/alternatives/meteor_text.svg",alt:"MeteorJS alternative",class:"img-padding",height:"60"})}),"\n",(0,s.jsxs)(a.p,{children:["Meteor (since 2012) is one of the oldest technologies for JavaScript realtime applications. Meteor is not a library but a whole framework with its own package manager, database management and replication.\nBecause of how it works, it has proven to be hard to integrate it with other modern JavaScript frameworks like ",(0,s.jsx)(a.a,{href:"https://github.com/urigo/angular-meteor",children:"angular"}),", ",(0,s.jsx)(a.a,{href:"/articles/vue-database.html",children:"vue.js"})," or svelte."]}),"\n",(0,s.jsxs)(a.p,{children:["Meteor uses MongoDB in the backend and can replicate with a Minimongo database in the frontend.\nWhile testing, it has proven to be impossible to make a meteor app ",(0,s.jsx)(a.strong,{children:"offline first"})," capable. There are ",(0,s.jsx)(a.a,{href:"https://github.com/frozeman/meteor-persistent-minimongo2",children:"some projects"})," that might do this, but all are unmaintained."]}),"\n",(0,s.jsx)(a.h3,{id:"minimongo",children:"Minimongo"}),"\n",(0,s.jsxs)(a.p,{children:["Forked in Jan 2014 from meteorJSs' minimongo package, Minimongo is a client-side, in-memory, JavaScript version of MongoDB with backend replication over HTTP. Similar to MongoDB, it stores data in documents inside of collections and also has the same query syntax. Minimongo has different storage adapters for IndexedDB, WebSQL, ",(0,s.jsx)(a.a,{href:"/articles/localstorage.html",children:"LocalStorage"})," and SQLite.\nCompared to RxDB, Minimongo has no concept of revisions or conflict handling, which might lead to undefined behavior when used with replication or in multiple browser tabs. Minimongo has no observable queries or changestream."]}),"\n",(0,s.jsx)(a.h3,{id:"watermelondb",children:"WatermelonDB"}),"\n",(0,s.jsx)("p",{align:"center",children:(0,s.jsx)("img",{src:"./files/alternatives/watermelondb.png",alt:"WatermelonDB alternative",height:"60"})}),"\n",(0,s.jsxs)(a.p,{children:["WatermelonDB is a reactive & asynchronous JavaScript database. While originally made for ",(0,s.jsx)(a.a,{href:"/articles/react-database.html",children:"React"})," and ",(0,s.jsx)(a.a,{href:"/react-native-database.html",children:"React Native"}),", it can also be used with other JavaScript frameworks. The main goal of WatermelonDB is ",(0,s.jsx)(a.strong,{children:"performance"})," within an application with lots of data.\nIn React Native, WatermelonDB uses the provided SQLite database. Also there is an Expo plugin for WatermelonDB. In a browser, WatermelonDB uses the LokiJS in-memory database to store and query data. WatermelonDB is one of the rare projects that support both Flow and Typescript at the same time."]}),"\n",(0,s.jsx)(a.h3,{id:"aws-amplify",children:"AWS Amplify"}),"\n",(0,s.jsx)("p",{align:"center",children:(0,s.jsx)("img",{src:"./files/alternatives/aws-amplify.svg",alt:"AWS Amplify alternative",height:"60",class:"img-padding"})}),"\n",(0,s.jsxs)(a.p,{children:["AWS Amplify is a collection of tools and libraries to develop web- and mobile frontend applications. Similar to firebase, it provides everything needed like authentication, analytics, a REST API, storage and so on. Everything hosted in the AWS Cloud, even when they state that ",(0,s.jsx)(a.em,{children:'"AWS Amplify is designed to be open and pluggable for any custom backend or service"'}),". For realtime replication, AWS Amplify can connect to an AWS App-Sync GraphQL endpoint."]}),"\n",(0,s.jsx)(a.h3,{id:"aws-datastore",children:"AWS Datastore"}),"\n",(0,s.jsxs)(a.p,{children:["Since December 2019 the Amplify library includes the AWS Datastore which is a document-based, client side database that is able to replicate data via AWS AppSync in the background.\nThe main difference to other projects is the complex project configuration via the amplify cli and the bit confusing query syntax that works over functions. Complex Queries with multiple ",(0,s.jsx)(a.code,{children:"OR/AND"})," statements are not possible which might change in the future.\nLocal development is hard because the AWS AppSync mock does not support realtime replication. It also is not really offline-first because a user login is always required."]}),"\n",(0,s.jsx)(a.figure,{"data-rehype-pretty-code-figure":"",children:(0,s.jsx)(a.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,s.jsxs)(a.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,s.jsx)(a.span,{"data-line":"",children:(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-comment)"},children:"// An AWS datastore OR query"})}),"\n",(0,s.jsxs)(a.span,{"data-line":"",children:[(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" posts"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" DataStore"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:".query"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"(Post"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" c "}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" c"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:".or"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,s.jsxs)(a.span,{"data-line":"",children:[(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" c "}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" c"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:".rating"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"gt"'}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" 4"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:".status"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"eq"'}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" PostStatus"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:"PUBLISHED"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:")"})]}),"\n",(0,s.jsx)(a.span,{"data-line":"",children:(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"));"})}),"\n",(0,s.jsx)(a.span,{"data-line":"",children:" "}),"\n",(0,s.jsx)(a.span,{"data-line":"",children:(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-comment)"},children:"// An AWS datastore SORT query"})}),"\n",(0,s.jsxs)(a.span,{"data-line":"",children:[(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" posts"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" DataStore"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:".query"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"(Post"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" Predicates"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:"ALL"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,s.jsxs)(a.span,{"data-line":"",children:[(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:" sort"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" s "}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" s"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:".rating"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:"SortDirection"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:"ASCENDING"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:".title"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:"SortDirection"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:"DESCENDING"}),(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:")"})]}),"\n",(0,s.jsx)(a.span,{"data-line":"",children:(0,s.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,s.jsx)(a.p,{children:"The biggest difference to RxDB is that you have to use the AWS cloud backends. This might not be a problem if your data is at AWS anyway."}),"\n",(0,s.jsx)(a.h3,{id:"rethinkdb",children:"RethinkDB"}),"\n",(0,s.jsx)("p",{align:"center",children:(0,s.jsx)("img",{src:"./files/alternatives/rethinkdb.svg",alt:"RethinkDB alternative",height:"60",class:"img-padding"})}),"\n",(0,s.jsx)(a.p,{children:"RethinkDB is a backend database that pushed dynamic JSON data to the client in realtime. It was founded in 2009 and the company shut down in 2016.\nRethink db is not a client side database, it streams data from the backend to the client which of course does not work while offline."}),"\n",(0,s.jsx)(a.h3,{id:"horizon",children:"Horizon"}),"\n",(0,s.jsxs)(a.p,{children:["Horizon is the client side library for RethinkDB which provides useful functions like authentication, permission management and subscription to a RethinkDB backend. Offline support ",(0,s.jsx)(a.a,{href:"https://github.com/rethinkdb/horizon/issues/58",children:"never made"})," it to horizon."]}),"\n",(0,s.jsx)(a.h3,{id:"supabase",children:"Supabase"}),"\n",(0,s.jsx)("p",{align:"center",children:(0,s.jsx)("img",{src:"./files/icons/supabase.svg",alt:"Supabase alternative",height:"60",class:"img-padding"})}),"\n",(0,s.jsxs)(a.p,{children:['Supabase labels itself as "',(0,s.jsx)(a.em,{children:"an open source Firebase alternative"}),'". It is a collection of open source tools that together mimic many Firebase features, most of them by providing a wrapper around a PostgreSQL database. While it has realtime queries that run over the wire, like with RethinkDB, Supabase has no client-side storage or replication feature and therefore is not offline first.']}),"\n",(0,s.jsx)(a.h3,{id:"couchdb",children:"CouchDB"}),"\n",(0,s.jsx)("p",{align:"center",children:(0,s.jsx)("img",{src:"./files/icons/couchdb-text.svg",alt:"CouchDB alternative",height:"60",class:"img-padding"})}),"\n",(0,s.jsx)(a.p,{children:"Apache CouchDB is a server-side, document-oriented database that is mostly known for its multi-master replication feature. Instead of having a master-slave replication, with CouchDB you can run replication in any constellation without having a master server as bottleneck where the server even can go off- and online at any time. This comes with the drawback of having a slow replication with much network overhead.\nCouchDB has a changestream and a query syntax similar to MongoDB."}),"\n",(0,s.jsx)(a.h3,{id:"pouchdb",children:"PouchDB"}),"\n",(0,s.jsx)("p",{align:"center",children:(0,s.jsx)("img",{src:"./files/alternatives/pouchdb.svg",alt:"PouchDB alternative",height:"60",class:"img-padding"})}),"\n",(0,s.jsxs)(a.p,{children:["PouchDB is a JavaScript database that is compatible with most of the CouchDB API. It has an adapter system that allows you to switch out the underlying storage layer. There are many adapters like for ",(0,s.jsx)(a.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB"}),", ",(0,s.jsx)(a.a,{href:"/rx-storage-sqlite.html",children:"SQLite"}),", the Filesystem and so on. The main benefit is to be able to replicate data with any CouchDB compatible endpoint.\nBecause of the CouchDB compatibility, PouchDB has to do a lot of overhead in handling the revision tree of document, which is why it can show bad performance for bigger datasets.\nRxDB was originally build around PouchDB until the storage layer was abstracted out in version ",(0,s.jsx)(a.a,{href:"/releases/10.0.0.html",children:"10.0.0"})," so it now allows to use different ",(0,s.jsx)(a.code,{children:"RxStorage"})," implementations. PouchDB has some performance issues because of how it has to store the document revision tree to stay compatible with the CouchDB API."]}),"\n",(0,s.jsx)(a.h3,{id:"couchbase",children:"Couchbase"}),"\n",(0,s.jsxs)(a.p,{children:["Couchbase (originally known as Membase) is another NoSQL document database made for realtime applications.\nIt uses the N1QL query language which is more SQL like compared to other NoSQL query languages. In theory you can achieve replication of a Couchbase with a PouchDB database, but this has shown to be not ",(0,s.jsx)(a.a,{href:"https://github.com/pouchdb/pouchdb/issues/7793#issuecomment-501624297",children:"that easy"}),"."]}),"\n",(0,s.jsx)(a.h3,{id:"cloudant",children:"Cloudant"}),"\n",(0,s.jsxs)(a.p,{children:["Cloudant is a cloud-based service that is based on ",(0,s.jsx)(a.a,{href:"/replication-couchdb.html",children:"CouchDB"})," and has mostly the same features.\nIt was originally designed for cloud computing where data can automatically be distributed between servers. But it can also be used to replicate with frontend PouchDB instances to create scalable web applications.\nIt was bought by IBM in 2014 and since 2018 the Cloudant Shared Plan is retired and migrated to IBM Cloud."]}),"\n",(0,s.jsx)(a.h3,{id:"hoodie",children:"Hoodie"}),"\n",(0,s.jsx)(a.p,{children:"Hoodie is a backend solution that enables offline-first JavaScript frontend development without having to write backend code. Its main goal is to abstract away configuration into simple calls to the Hoodie API.\nIt uses CouchDB in the backend and PouchDB in the frontend to enable offline-first capabilities.\nThe last commit for hoodie was one year ago and the website (hood.ie) is offline which indicates it is not an active project anymore."}),"\n",(0,s.jsx)(a.h3,{id:"lokijs",children:"LokiJS"}),"\n",(0,s.jsxs)(a.p,{children:["LokiJS is a JavaScript embeddable, in-memory database. And because everything is handled in-memory, LokiJS has awesome performance when mutating or querying data. You can still persist to a permanent storage (IndexedDB, Filesystem etc.) with one of the provided storage adapters. The persistence happens after a timeout is reached after a write, or before the JavaScript process exits. This also means you could loose data when the JavaScript process exits ungracefully like when the power of the device is shut down or the browser crashes.\nWhile the project is not that active anymore, it is more ",(0,s.jsx)(a.em,{children:"finished"})," than ",(0,s.jsx)(a.em,{children:"unmaintained"}),"."]}),"\n",(0,s.jsxs)(a.p,{children:["In the past, RxDB supported using ",(0,s.jsx)(a.a,{href:"/rx-storage-lokijs.html",children:"LokiJS as RxStorage"})," but because the LokiJS is not maintained anymore and had too many issues, this storage option was removed in RxDB version 16."]}),"\n",(0,s.jsx)(a.h3,{id:"gundb",children:"Gundb"}),"\n",(0,s.jsxs)(a.p,{children:["GUN is a JavaScript graph database. While having many features, the ",(0,s.jsx)(a.strong,{children:"decentralized"})," replication is the main unique selling point. You can replicate data Peer-to-Peer without any centralized backend server. GUN has several other features that are useful on top of that, like encryption and authentication."]}),"\n",(0,s.jsxs)(a.p,{children:["While testing it was really hard to get basic things running. GUN is open source, but because of how the source code ",(0,s.jsx)(a.a,{href:"https://github.com/amark/gun/blob/master/src/put.js",children:"is written"}),", it is very difficult to understand what is going wrong."]}),"\n",(0,s.jsx)(a.h3,{id:"sqljs",children:"sql.js"}),"\n",(0,s.jsx)(a.p,{children:"sql.js is a javascript library to run SQLite on the web. It uses a virtual database file stored in memory and does not have any persistence. All data is lost once the JavaScript process exits. sql.js is created by compiling SQLite to WebAssembly so it has about the same features as SQLite. For older browsers there is a JavaScript fallback."}),"\n",(0,s.jsx)(a.h3,{id:"absurd-sql",children:"absurd-sQL"}),"\n",(0,s.jsxs)(a.p,{children:["Absurd-sql is a project that implements an IndexedDB-based persistence for sql.js. Instead of directly writing data into the IndexedDB, it treats IndexedDB like a disk and stores data in blocks there which shows to have a much better performance, mostly because of how ",(0,s.jsx)(a.a,{href:"/slow-indexeddb.html",children:"performance expensive"})," IndexedDB transactions are."]}),"\n",(0,s.jsx)(a.h3,{id:"nedb",children:"NeDB"}),"\n",(0,s.jsxs)(a.p,{children:["NeDB was a embedded persistent or in-memory database for Node.js, nw.js, ",(0,s.jsx)(a.a,{href:"/electron-database.html",children:"Electron"})," and browsers.\nIt is document-oriented and had the same query syntax as MongoDB.\nLike LokiJS it has persistence adapters for IndexedDB etc. to persist the database state on the disc.\nThe last commit to NeDB was in ",(0,s.jsx)(a.strong,{children:"2016"}),"."]}),"\n",(0,s.jsx)(a.h3,{id:"dexiejs",children:"Dexie.js"}),"\n",(0,s.jsx)(a.p,{children:"Dexie.js is a minimalistic wrapper for IndexedDB. While providing a better API than plain IndexedDB, Dexie also improves performance by batching transactions and other optimizations. It also adds additional non-IndexedDB features like observable queries or multi tab support or react hooks.\nCompared to RxDB, Dexie.js does not support complex (MongoDB-like) queries and requires a lot of fiddling when a document range of a specific index must be fetched.\nDexie.js is used by Whatsapp Web, Microsoft To Do and Github Desktop."}),"\n",(0,s.jsxs)(a.p,{children:["RxDB supports using ",(0,s.jsx)(a.a,{href:"/rx-storage-dexie.html",children:"Dexie.js as Database storage"})," which enhances IndexedDB via dexie with RxDB features like MongoDB-like queries etc."]}),"\n",(0,s.jsx)(a.h3,{id:"lowdb",children:"LowDB"}),"\n",(0,s.jsx)(a.p,{children:"LowDB is a small, local JSON database powered by the Lodash library. It is designed to be simple, easy to use, and straightforward. LowDB allows you to perform native JavaScript queries and persist data in a flat JSON file. Written in TypeScript, it's particularly well-suited for small projects, prototyping, or when you need a lightweight, file-based database."}),"\n",(0,s.jsxs)(a.p,{children:["As an alternative to LowDB, ",(0,s.jsx)(a.a,{href:"./",children:"RxDB"})," offers real-time reactivity, allowing developers to subscribe to database changes, a feature not natively available in LowDB. Additionally, RxDB provides robust ",(0,s.jsx)(a.a,{href:"/rx-query.html",children:"query capabilities"}),", including the ability to subscribe to query results for automatic UI updates. These features make RxDB a strong alternative to LowDB for more complex and dynamic applications."]}),"\n",(0,s.jsx)(a.h3,{id:"localforage",children:"localForage"}),"\n",(0,s.jsxs)(a.p,{children:["localForage is a popular JavaScript library for offline storage that provides a simple, promise-based API. It abstracts over different storage mechanisms such as ",(0,s.jsx)(a.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB"}),", WebSQL, or ",(0,s.jsx)(a.a,{href:"/articles/localstorage.html",children:"localStorage"}),", making it easier to write code once and have it work seamlessly across various browsers. While localForage is great for storing data locally in a key-value manner, it doesn't provide the real-time reactive queries, ",(0,s.jsx)(a.a,{href:"/transactions-conflicts-revisions.html",children:"conflict handling"}),", or revision-based replication that RxDB does. This makes localForage a useful choice for straightforward caching or persistent storage needs, but not ideal for advanced offline-first scenarios requiring multi-user collaboration or complex querying."]}),"\n",(0,s.jsx)(a.h3,{id:"mongodb-realm",children:"MongoDB Realm"}),"\n",(0,s.jsx)(a.p,{children:"Originally Realm was a mobile database for Android and iOS. Later they added support for other languages and runtimes, also for JavaScript.\nIt was meant as replacement for SQLite but is more like an object store than a full SQL database.\nIn 2019 MongoDB bought Realm and changed the projects focus.\nNow Realm is made for replication with the MongoDB Realm Sync based on the MongoDB Atlas Cloud platform. This tight coupling to the MongoDB cloud service is a big downside for most use cases."}),"\n",(0,s.jsx)(a.h3,{id:"apollo",children:"Apollo"}),"\n",(0,s.jsx)(a.p,{children:"The Apollo GraphQL platform is made to transfer data between a server to UI applications over GraphQL endpoints. It contains several tools like GraphQL clients in different languages or libraries to create GraphQL endpoints."}),"\n",(0,s.jsx)(a.p,{children:"While it is has different caching features for offline usage, compared to RxDB it is not fully offline first because caching alone does not mean your application is fully usable when the user is offline."}),"\n",(0,s.jsx)(a.h3,{id:"replicache",children:"Replicache"}),"\n",(0,s.jsxs)(a.p,{children:["Replicache is a client-side sync framework for building realtime, collaborative, ",(0,s.jsx)(a.a,{href:"/articles/local-first-future.html",children:"local-first"})," web apps. It claims to work with most backend stacks. In contrast to other local first tools, replicache does not work like a local database. Instead it runs on so called ",(0,s.jsx)(a.code,{children:"mutators"})," that unify behavior on the client and server side. So instead of implementing and calling REST routes on both sides of your stack, you will implement mutators that define a specific delta behavior based on the input data. To observe data in replicache, there are ",(0,s.jsx)(a.code,{children:"subscriptions"})," that notify your frontend application about changes to the state.\nReplicache can be used in most frontend technologies like browsers, React/Remix, NextJS/Vercel and React Native. While Replicache can be installed and used from npm, the Replicache source code is not open source and the Replicache github repo does not allow you to inspect or debug it. Still you can use replicache for in non-commercial projects, or for companies with < $200k revenue (ARR) and < $500k in funding. (2024: Replicache will be free and Rocicorp are working on a new Zerosync product to succeed Replicache and Reflect.)"]}),"\n",(0,s.jsx)(a.h3,{id:"instantdb",children:"InstantDB"}),"\n",(0,s.jsxs)(a.p,{children:["InstantDB is designed for real-time data synchronization with built-in offline support, allowing changes to be queued locally and ",(0,s.jsx)(a.a,{href:"/replication.html",children:"synced"})," when the user reconnects. While it offers seamless ",(0,s.jsx)(a.a,{href:"/articles/optimistic-ui.html",children:"optimistic updates"})," and rollback capabilities, its offline-first design is not as mature or comprehensive as RxDB's - the ",(0,s.jsx)(a.a,{href:"/articles/offline-database.html",children:"offline data"})," is more of a cache, not a full-database sync. The query language used is Datalog, and the backend sync service is written in Clojure. InstantDB is focused more on simplicity and real-time collaboration, with fewer customization options for storage or conflict resolution compared to RxDB, which supports various storage adapters and advanced conflict handling via CRDTs."]}),"\n",(0,s.jsx)(a.h3,{id:"yjs",children:"Yjs"}),"\n",(0,s.jsxs)(a.p,{children:["Yjs is a ",(0,s.jsx)(a.a,{href:"/crdt.html",children:"CRDT-based"})," (Conflict-free Replicated Data Type) library focused on enabling real-time collaboration - particularly for text editing, although it can handle other data types as well. While it provides powerful conflict resolution and peer-to-peer synchronization out of the box, Yjs itself is not a full-fledged database. Instead, you typically combine Yjs with other storage or networking layers to achieve a ",(0,s.jsx)(a.a,{href:"/offline-first.html",children:"local-first architecture"}),". This flexibility allows for sophisticated ",(0,s.jsx)(a.a,{href:"/articles/realtime-database.html",children:"real-time"})," features, but also means you must handle indexing, queries, and persistence on your own if you need them. Compared to RxDB, Yjs does not offer built-in replication adapters or a query system, so developers who require a more complete solution for conflict resolution, data persistence, and offline-first capabilities may find RxDB more convenient."]}),"\n",(0,s.jsx)(a.h3,{id:"electricsql",children:"ElectricSQL"}),"\n",(0,s.jsx)(a.p,{children:'2024: ElectricSQL is being rewritten in a new Electric-Next branch, which focuses on partial syncing of ("shapes", which makes is basically a NoSQL like document database) of data from a remote Postgres DB to a local clients written in TypeScript/JS or Elixir. The write path is not yet implemented, neither is client-side reactivity. The ElectricSQL backend is written in Elixir.'}),"\n",(0,s.jsx)(a.h3,{id:"signaldb",children:"SignalDB"}),"\n",(0,s.jsx)(a.p,{children:"SignalDB provides a reactive, in-memory local-lirst JavaScript database with real-time sync, bit it doesn't offer the same level of multi-client replication or flexibility with storage backends that RxDB provides, and through a RxDB persistence adapters you can actually use SignalDB for the front-end reactivity while relying on RxDB for backend sync and persistence."}),"\n",(0,s.jsx)(a.h3,{id:"powersync",children:"PowerSync"}),"\n",(0,s.jsx)(a.p,{children:'PowerSync is a "framework" for implementing local-first solutions. It centralizes business logic and conflict resolution on a central, authoritative server (PostgreSQL or MongoDB), vs RxDB that also supports custom backends. Both RxDB and PowerSync can be used with a variety of storage backends, but PowerSync uses SQLite as the front-end database which has shown to be slow because the WASM-SQLite abstraction increases read and write latency. In terms of client SDKs, PowerSync offers Flutter, Kotlin, and Swift in addition to JS/TypeScript. PowerSync offers man client technologies, PowerSync is under a license that restricts commercial use that competes with PowerSync and the JourneyApps Platform.'}),"\n",(0,s.jsx)(a.h1,{id:"read-further",children:"Read further"}),"\n",(0,s.jsxs)(a.ul,{children:["\n",(0,s.jsx)(a.li,{children:(0,s.jsx)(a.a,{href:"https://github.com/pubkey/client-side-databases",children:"Offline First Database Comparison"})}),"\n"]})]})}function h(e={}){const{wrapper:a}={...(0,n.R)(),...e.components};return a?(0,s.jsx)(a,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8453(e,a,i){i.d(a,{R:()=>o,x:()=>r});var t=i(6540);const s={},n=t.createContext(s);function o(e){const a=t.useContext(n);return t.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function r(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(n.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/4adf80bb.5245b2b7.js b/docs/assets/js/4adf80bb.5245b2b7.js deleted file mode 100644 index 57583ceb431..00000000000 --- a/docs/assets/js/4adf80bb.5245b2b7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9548],{7014(e,s,r){r.r(s),r.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>d,frontMatter:()=>i,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"rx-storage-pouchdb","title":"PouchDB RxStorage - Migrate for Better Performance","description":"Discover why PouchDB RxStorage is deprecated in RxDB. Learn its legacy, performance drawbacks, and how to upgrade to a faster solution.","source":"@site/docs/rx-storage-pouchdb.md","sourceDirName":".","slug":"/rx-storage-pouchdb.html","permalink":"/rx-storage-pouchdb.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"PouchDB RxStorage - Migrate for Better Performance","slug":"rx-storage-pouchdb.html","description":"Discover why PouchDB RxStorage is deprecated in RxDB. Learn its legacy, performance drawbacks, and how to upgrade to a faster solution."}}');var o=r(4848),a=r(8453);const i={title:"PouchDB RxStorage - Migrate for Better Performance",slug:"rx-storage-pouchdb.html",description:"Discover why PouchDB RxStorage is deprecated in RxDB. Learn its legacy, performance drawbacks, and how to upgrade to a faster solution."},t="RxStorage PouchDB",l={},h=[{value:"Why is the PouchDB RxStorage deprecated?",id:"why-is-the-pouchdb-rxstorage-deprecated",level:2},{value:"Pros",id:"pros",level:2},{value:"Cons",id:"cons",level:2},{value:"Usage",id:"usage",level:2},{value:"Polyfill the global variable",id:"polyfill-the-global-variable",level:2},{value:"Adapters",id:"adapters",level:2},{value:"Using the internal PouchDB Database",id:"using-the-internal-pouchdb-database",level:2}];function c(e){const s={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"rxstorage-pouchdb",children:"RxStorage PouchDB"})}),"\n",(0,o.jsxs)(s.p,{children:["The PouchDB RxStorage is based on the ",(0,o.jsx)(s.a,{href:"https://github.com/pouchdb/pouchdb",children:"PouchDB"})," database. It is the most battle proven RxStorage and has a big ecosystem of adapters. PouchDB does a lot of overhead to enable CouchDB replication which makes the PouchDB RxStorage one of the slowest."]}),"\n",(0,o.jsx)(s.admonition,{type:"warning",children:(0,o.jsxs)(s.p,{children:["The PouchDB RxStorage is removed from RxDB and can no longer be used in new projects. You should switch to a different ",(0,o.jsx)(s.a,{href:"/rx-storage.html",children:"RxStorage"}),"."]})}),"\n",(0,o.jsx)(s.h2,{id:"why-is-the-pouchdb-rxstorage-deprecated",children:"Why is the PouchDB RxStorage deprecated?"}),"\n",(0,o.jsxs)(s.p,{children:["When I started developing RxDB in 2016, I had a specific use case to solve.\nBecause there was no client-side database out there that fitted, I created\nRxDB as a wrapper around PouchDB. This worked great and all the PouchDB features\nlike the query engine, the adapter system, CouchDB-replication and so on, came for free.\nBut over the years, it became clear that PouchDB is not suitable for many applications,\nmostly because of its performance: To be compliant to CouchDB, PouchDB has to store all\nrevision trees of documents which slows down queries. Also purging these document revisions ",(0,o.jsx)(s.a,{href:"https://github.com/pouchdb/pouchdb/issues/802",children:"is not possible"}),"\nso the database storage size will only increase over time.\nAnother problem was that many issues in PouchDB have never been fixed, but only closed by the issue-bot like ",(0,o.jsx)(s.a,{href:"https://github.com/pouchdb/pouchdb/issues/6454",children:"this one"}),". The whole PouchDB RxStorage code was full of ",(0,o.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/blob/285c3cf6008b3cc83bd9b9946118a621434f0cff/src/plugins/pouchdb/pouch-statics.ts#L181",children:"workarounds and monkey patches"})," to resolve\nthese issues for RxDB users. Many these patches decreased performance even further. Sometimes it was not possible to fix things from the outside, for example queries with ",(0,o.jsx)(s.code,{children:"$gt"})," operators return ",(0,o.jsx)(s.a,{href:"https://github.com/pouchdb/pouchdb/pull/8471",children:"the wrong documents"})," which is a no-go for a production database\nand hard to debug."]}),"\n",(0,o.jsxs)(s.p,{children:["In version ",(0,o.jsx)(s.a,{href:"/releases/10.0.0.html",children:"10.0.0"})," RxDB introduced the ",(0,o.jsx)(s.a,{href:"/rx-storage.html",children:"RxStorage"})," layer which\nallows users to swap out the underlying storage engine where RxDB stores and queries documents from.\nThis allowed to use alternatives from PouchDB, for example the ",(0,o.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB RxStorage"})," in browsers\nor even the ",(0,o.jsx)(s.a,{href:"/rx-storage-foundationdb.html",children:"FoundationDB RxStorage"})," on the server side.\nThere where not many use cases left where it was a good choice to use the PouchDB RxStorage. Only replicating with a\nCouchDB server, was only possible with PouchDB. But this has also changed. RxDB has ",(0,o.jsx)(s.a,{href:"/replication-couchdb.html",children:"a plugin"})," that allows\nto replicate clients with any CouchDB server by using the ",(0,o.jsx)(s.a,{href:"/replication.html",children:"RxDB Sync Engine"}),". This plugins work with any RxStorage so that it is not necessary to use the PouchDB storage.\nRemoving PouchDB allows RxDB to add many awaited features like filtered change streams for easier replication and permission handling. It will also free up development time."]}),"\n",(0,o.jsx)(s.p,{children:"If you are currently using the PouchDB RxStorage, you have these options:"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:["Migrate to another ",(0,o.jsx)(s.a,{href:"/rx-storage.html",children:"RxStorage"})," (recommended)"]}),"\n",(0,o.jsx)(s.li,{children:"Never update RxDB to the next major version (stay on older 14.0.0)"}),"\n",(0,o.jsxs)(s.li,{children:["Fork the ",(0,o.jsx)(s.a,{href:"/rx-storage-pouchdb.html",children:"PouchDB RxStorage"})," and maintain the plugin by yourself."]}),"\n",(0,o.jsxs)(s.li,{children:["Fix all the ",(0,o.jsx)(s.a,{href:"https://github.com/pouchdb/pouchdb/issues?q=author%3Apubkey",children:"PouchDB problems"})," so that we can add PouchDB to the RxDB Core again."]}),"\n"]}),"\n",(0,o.jsx)(s.h2,{id:"pros",children:"Pros"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsx)(s.li,{children:"Most battle proven RxStorage"}),"\n",(0,o.jsx)(s.li,{children:"Supports replication with a CouchDB endpoint"}),"\n",(0,o.jsxs)(s.li,{children:["Support storing ",(0,o.jsx)(s.a,{href:"/rx-attachment.html",children:"attachments"})]}),"\n",(0,o.jsx)(s.li,{children:"Big ecosystem of adapters"}),"\n"]}),"\n",(0,o.jsx)(s.h2,{id:"cons",children:"Cons"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsx)(s.li,{children:"Big bundle size"}),"\n",(0,o.jsx)(s.li,{children:"Slow performance because of revision handling overhead"}),"\n"]}),"\n",(0,o.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStoragePouch"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" addPouchPlugin } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/pouchdb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addPouchPlugin"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"require"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'pouchdb-adapter-idb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"));"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStoragePouch"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'idb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * other pouchdb specific options"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"@link"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" https://pouchdb.com/api.html#create_database"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" )"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsxs)(s.h2,{id:"polyfill-the-global-variable",children:["Polyfill the ",(0,o.jsx)(s.code,{children:"global"})," variable"]}),"\n",(0,o.jsxs)(s.p,{children:["When you use RxDB with ",(0,o.jsx)(s.strong,{children:"angular"})," or other ",(0,o.jsx)(s.strong,{children:"webpack"})," based frameworks, you might get the error:"]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"html","data-theme":"css-variables",children:(0,o.jsx)(s.code,{"data-language":"html","data-theme":"css-variables",style:{display:"grid"},children:(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"span"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" style"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"color: red;"'}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">Uncaught ReferenceError: global is not defined"})]})})})}),"\n",(0,o.jsxs)(s.p,{children:["This is because pouchdb assumes a nodejs-specific ",(0,o.jsx)(s.code,{children:"global"})," variable that is not added to browser runtimes by some bundlers.\nYou have to add them by your own, like we do ",(0,o.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/blob/master/examples/angular/src/polyfills.ts",children:"here"}),"."]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(window "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"as"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" any"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:").global "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" window;"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(window "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"as"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" any"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:").process "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" env"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { DEBUG"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" undefined"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,o.jsx)(s.h2,{id:"adapters",children:"Adapters"}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.a,{href:"/adapters.html",children:"PouchDB has many adapters for all JavaScript runtimes"}),"."]}),"\n",(0,o.jsx)(s.h2,{id:"using-the-internal-pouchdb-database",children:"Using the internal PouchDB Database"}),"\n",(0,o.jsx)(s.p,{children:"For custom operations, you can access the internal PouchDB database.\nThis is dangerous because you might do changes that are not compatible with RxDB.\nOnly use this when there is no way to achieve your goals via the RxDB API."}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getPouchDBOfRxCollection"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/pouchdb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" pouch"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getPouchDBOfRxCollection"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(myRxCollection);"})]})]})})})]})}function d(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},8453(e,s,r){r.d(s,{R:()=>i,x:()=>t});var n=r(6540);const o={},a=n.createContext(o);function i(e){const s=n.useContext(a);return n.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(o):e.components||o:i(e.components),n.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/4af60d2e.8fe42f95.js b/docs/assets/js/4af60d2e.8fe42f95.js deleted file mode 100644 index 6518c2c01a8..00000000000 --- a/docs/assets/js/4af60d2e.8fe42f95.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[8545],{6136(e,s,a){a.r(s),a.d(s,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"articles/realtime-database","title":"What Really Is a Realtime Database?","description":"Discover how RxDB merges realtime replication and dynamic updates to deliver seamless data sync across browsers, devices, and servers - instantly.","source":"@site/docs/articles/realtime-database.md","sourceDirName":"articles","slug":"/articles/realtime-database.html","permalink":"/articles/realtime-database.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"What Really Is a Realtime Database?","slug":"realtime-database.html","description":"Discover how RxDB merges realtime replication and dynamic updates to deliver seamless data sync across browsers, devices, and servers - instantly."},"sidebar":"tutorialSidebar","previous":{"title":"RxDB as a Database for React Applications","permalink":"/articles/react-database.html"},"next":{"title":"Build Smarter Offline-First Angular Apps - How RxDB Beats IndexedDB Alone","permalink":"/articles/angular-indexeddb.html"}}');var t=a(4848),i=a(8453);const r={title:"What Really Is a Realtime Database?",slug:"realtime-database.html",description:"Discover how RxDB merges realtime replication and dynamic updates to deliver seamless data sync across browsers, devices, and servers - instantly."},l="What is a realtime database?",o={},c=[{value:"Realtime as in realtime computing",id:"realtime-as-in-realtime-computing",level:2},{value:"Real time Database as in realtime replication",id:"real-time-database-as-in-realtime-replication",level:2},{value:"Realtime as in realtime applications",id:"realtime-as-in-realtime-applications",level:2},{value:"Follow Up",id:"follow-up",level:2}];function d(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(s.header,{children:(0,t.jsx)(s.h1,{id:"what-is-a-realtime-database",children:"What is a realtime database?"})}),"\n",(0,t.jsxs)(s.p,{children:["I have been building ",(0,t.jsx)(s.a,{href:"https://rxdb.info/",children:"RxDB"}),", a NoSQL ",(0,t.jsx)(s.strong,{children:"realtime"})," JavaScript database for many years.\nOften people get confused by the word ",(0,t.jsx)(s.strong,{children:"realtime database"}),", because the word ",(0,t.jsx)(s.strong,{children:"realtime"})," is so vaguely defined that it can mean everything and nothing at the same time."]}),"\n",(0,t.jsx)(s.p,{children:"In this article we will explore what a realtime database is, and more important, what it is not."}),"\n",(0,t.jsx)("center",{children:(0,t.jsx)("a",{href:"https://rxdb.info/",children:(0,t.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JavaScript Realtime Database",width:"150"})})}),"\n",(0,t.jsxs)(s.h2,{id:"realtime-as-in-realtime-computing",children:["Realtime as in ",(0,t.jsx)(s.strong,{children:"realtime computing"})]}),"\n",(0,t.jsxs)(s.p,{children:['When "normal" developers hear the word "realtime", they think of ',(0,t.jsx)(s.strong,{children:"Real-time computing (RTC)"}),". Real-time computing is a type of computer processing that ",(0,t.jsx)(s.strong,{children:"guarantees specific response times"})," for tasks or events, crucial in applications like industrial control, automotive systems, and aerospace. It relies on specialized operating systems (RTOS) to ensure predictability and low latency. Hard real-time systems must never miss deadlines, while soft real-time systems can tolerate occasional delays. Real-time responses are often understood to be in the order of milliseconds, and sometimes microseconds."]}),"\n",(0,t.jsxs)(s.p,{children:["Consider the role of real-time computing in car airbags: sensors detect collision force, swiftly process the data, and immediately decide to deploy the airbags within milliseconds. Such rapid action is imperative for safeguarding passengers. Hence, the controlling chip must ",(0,t.jsx)(s.strong,{children:"guarantee a certain response time"}),' - it must operate in "realtime".']}),"\n",(0,t.jsxs)(s.p,{children:["But when people talk about ",(0,t.jsx)(s.strong,{children:"realtime databases"}),", especially in the web-development world, they almost never mean realtime, as in ",(0,t.jsx)(s.strong,{children:"realtime computing"}),', they mean something else.\nIn fact, with any programming language that run on end users devices, it is not even possible to built a "real" realtime database. A program, like a JavaScript (',(0,t.jsx)(s.a,{href:"/articles/browser-database.html",children:"browser"})," or ",(0,t.jsx)(s.a,{href:"/nodejs-database.html",children:"Node.js"}),") process, can be halted by the operating systems task manager at any time and therefore it will never be able to guarantee specific response times. To build a realtime computing database, you would need a realtime capable operating system."]}),"\n",(0,t.jsxs)(s.h2,{id:"real-time-database-as-in-realtime-replication",children:["Real time Database as in ",(0,t.jsx)(s.strong,{children:"realtime replication"})]}),"\n",(0,t.jsxs)(s.p,{children:["When talking about realtime databases, most people refer to realtime, as in realtime replication.\nOften they mean a very specific product which is the ",(0,t.jsx)(s.strong,{children:"Firebase Realtime Database"})," (not the ",(0,t.jsx)(s.a,{href:"/replication-firestore.html",children:"Firestore"}),")."]}),"\n",(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"../files/alternatives/firebase.svg",alt:"firebase realtime replication",width:"100"})}),"\n",(0,t.jsx)(s.p,{children:'In the context of the Firebase Realtime Database, "realtime" means that data changes are synchronized and delivered to all connected clients or devices as soon as they occur, typically within milliseconds. This means that when any client updates, adds, or removes data in the database, all other clients that are connected to the same database instance receive those updates instantly, without the need for manual polling or frequent HTTP requests.'}),"\n",(0,t.jsxs)(s.p,{children:["In short, when replicating data between databases, instead of polling, we use a ",(0,t.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API",children:"websocket connection"}),' to live-stream all changes between the server and the clients, this is labeled as "realtime database". A similar thing can be done with RxDB and the ',(0,t.jsx)(s.a,{href:"/replication.html",children:"RxDB Replication Plugins"}),"."]}),"\n",(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("a",{href:"https://rxdb.info/replication.html",children:(0,t.jsx)("img",{src:"../files/database-replication.png",alt:"database replication",width:"100"})})}),"\n",(0,t.jsxs)(s.h2,{id:"realtime-as-in-realtime-applications",children:["Realtime as in ",(0,t.jsx)(s.strong,{children:"realtime applications"})]}),"\n",(0,t.jsx)(s.p,{children:'In the context of realtime client-side applications, "realtime" refers to the immediate or near-instantaneous processing and response to events or data inputs. When data changes, the application must directly update to reflect the new data state, without any user interaction or delay. Notice that the change to the data could have come from any source, like a user action, an operation in another browser tab, or even an operation from another device that has been replicated to the client.'}),"\n",(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"../files/multiwindow.gif",alt:"realtime applications",width:"400"})}),"\n",(0,t.jsxs)(s.p,{children:["In contrast to push-pull based databases (e.g., MySQL or MongoDB servers), a realtime database contains ",(0,t.jsx)(s.strong,{children:"features which make it easy to build realtime applications"}),". For example with RxDB you can not only fetch query results once, but instead you can subscribe to a query and directly update the HTML dom tree whenever the query has a new result set:"]}),"\n",(0,t.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,t.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,t.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,t.jsxs)(s.span,{"data-line":"",children:[(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,t.jsxs)(s.span,{"data-line":"",children:[(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,t.jsxs)(s.span,{"data-line":"",children:[(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" healthpoints"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,t.jsxs)(s.span,{"data-line":"",children:[(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"})]}),"\n",(0,t.jsx)(s.span,{"data-line":"",children:(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,t.jsx)(s.span,{"data-line":"",children:(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,t.jsx)(s.span,{"data-line":"",children:(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"})"})}),"\n",(0,t.jsxs)(s.span,{"data-line":"",children:[(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".$ "}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// The $ returns an observable that emits whenever the query's result set changes."})]}),"\n",(0,t.jsxs)(s.span,{"data-line":"",children:[(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(aliveHeroes "}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,t.jsx)(s.span,{"data-line":"",children:(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Refresh the HTML list each time there are new query results."})}),"\n",(0,t.jsxs)(s.span,{"data-line":"",children:[(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" newContent"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" aliveHeroes"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".map"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(doc "}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '
  • '"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".name "}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"+"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '
  • '"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,t.jsxs)(s.span,{"data-line":"",children:[(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" document"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".getElementById"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'#myList'"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:").innerHTML "}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" newContent;"})]}),"\n",(0,t.jsx)(s.span,{"data-line":"",children:(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,t.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,t.jsx)(s.span,{"data-line":"",children:(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// You can even subscribe to any RxDB document's fields."})}),"\n",(0,t.jsxs)(s.span,{"data-line":"",children:[(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"myDocument"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"firstName$"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(newName "}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'name is: '"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,t.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" newName));"})]})]})})}),"\n",(0,t.jsxs)(s.p,{children:["A competent realtime application is engineered to offer feedback or results swiftly, ideally within milliseconds to microseconds. Ideally, a data modification should be processed in under ",(0,t.jsx)(s.strong,{children:"16 milliseconds"})," (since 1 second divided by 60 frames equals 16.66ms) to ensure users don't perceive any lag from input to visualization. RxDB utilizes the ",(0,t.jsx)(s.a,{href:"https://github.com/pubkey/event-reduce",children:"EventReduce algorithm"}),' to manage changes more swiftly than 16ms. However, it can never assure fixed response times as a "realtime computing database" would.']}),"\n",(0,t.jsx)(s.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,t.jsxs)(s.ul,{children:["\n",(0,t.jsxs)(s.li,{children:["Dive into the ",(0,t.jsx)(s.a,{href:"https://rxdb.info/quickstart.html",children:"RxDB Quickstart"})]}),"\n",(0,t.jsxs)(s.li,{children:["Discover more about the ",(0,t.jsx)(s.a,{href:"/replication.html",children:"RxDB realtime Sync Engine"})]}),"\n",(0,t.jsxs)(s.li,{children:["Join the conversation at ",(0,t.jsx)(s.a,{href:"https://rxdb.info/chat/",children:"RxDB Chat"})]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,t.jsx)(s,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},8453(e,s,a){a.d(s,{R:()=>r,x:()=>l});var n=a(6540);const t={},i=n.createContext(t);function r(e){const s=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/4ba7e5a3.fec476c6.js b/docs/assets/js/4ba7e5a3.fec476c6.js deleted file mode 100644 index 9ebc3d7b19d..00000000000 --- a/docs/assets/js/4ba7e5a3.fec476c6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9591],{5380(e,t,n){n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"contribute","title":"Contribute","description":"Got a fix or fresh idea? Learn how to contribute to RxDB, run tests, and shape the future of this cutting-edge NoSQL database for JavaScript.","source":"@site/docs/contribute.md","sourceDirName":".","slug":"/contribution.html","permalink":"/contribution.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Contribute","slug":"contribution.html","description":"Got a fix or fresh idea? Learn how to contribute to RxDB, run tests, and shape the future of this cutting-edge NoSQL database for JavaScript."},"sidebar":"tutorialSidebar","previous":{"title":"ReactJS Storage - From Basic LocalStorage to Advanced Offline Apps with RxDB","permalink":"/articles/reactjs-storage.html"}}');var o=n(4848),r=n(8453);const s={title:"Contribute",slug:"contribution.html",description:"Got a fix or fresh idea? Learn how to contribute to RxDB, run tests, and shape the future of this cutting-edge NoSQL database for JavaScript."},a="Contribution",d={},c=[{value:"Requirements",id:"requirements",level:2},{value:"Adding tests",id:"adding-tests",level:2},{value:"Making a PR",id:"making-a-pr",level:2},{value:"Getting help",id:"getting-help",level:2},{value:"No-Go",id:"no-go",level:2}];function l(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"contribution",children:"Contribution"})}),"\n",(0,o.jsx)(t.p,{children:"We are open to, and grateful for, any contributions made by the community."}),"\n",(0,o.jsx)(t.h1,{id:"developing",children:"Developing"}),"\n",(0,o.jsx)(t.h2,{id:"requirements",children:"Requirements"}),"\n",(0,o.jsx)(t.p,{children:"Before you can start developing, do the following:"}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:["Make sure you have installed nodejs with the version stated in the ",(0,o.jsx)(t.a,{href:"https://github.com/pubkey/rxdb/blob/master/.nvmrc",children:".nvmrc"})]}),"\n",(0,o.jsxs)(t.li,{children:["Clone the repository ",(0,o.jsx)(t.code,{children:"git clone https://github.com/pubkey/rxdb.git"})]}),"\n",(0,o.jsxs)(t.li,{children:["Install the dependencies ",(0,o.jsx)(t.code,{children:"cd rxdb && npm install"})]}),"\n",(0,o.jsxs)(t.li,{children:["Make sure that the tests work for you. At first, try it out with ",(0,o.jsx)(t.code,{children:"npm run test:node:memory"})," which tests the memory storage in node. In the ",(0,o.jsx)(t.a,{href:"https://github.com/pubkey/rxdb/blob/master/package.json",children:"package.json"})," you can find more scripts to run the tests with different storages."]}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"adding-tests",children:"Adding tests"}),"\n",(0,o.jsxs)(t.p,{children:["Before you start creating a bugfix or a feature, you should create a test to reproduce it. Tests are in the ",(0,o.jsx)(t.code,{children:"test/unit"}),"-folder.\nIf you want to reproduce a bug, you can modify the test in ",(0,o.jsx)(t.a,{href:"https://github.com/pubkey/rxdb/blob/master/test/unit/bug-report.test.ts",children:"this file"}),"."]}),"\n",(0,o.jsx)(t.h2,{id:"making-a-pr",children:"Making a PR"}),"\n",(0,o.jsx)(t.p,{children:"If you make a pull-request, ensure the following:"}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsx)(t.li,{children:"Every feature or bugfix must be committed together with a unit-test which ensures everything works as expected."}),"\n",(0,o.jsxs)(t.li,{children:["Do not commit build-files (anything in the ",(0,o.jsx)(t.code,{children:"dist"}),"-folder)"]}),"\n",(0,o.jsx)(t.li,{children:"Before you add non-trivial changes, create an issue to discuss if this will be merged and you don't waste your time."}),"\n",(0,o.jsxs)(t.li,{children:["To run the unit and integration-tests, do ",(0,o.jsx)(t.code,{children:"npm run test"})," and ensure everything works as expected"]}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"getting-help",children:"Getting help"}),"\n",(0,o.jsxs)(t.p,{children:["If you need help with your contribution, ask at ",(0,o.jsx)(t.a,{href:"https://rxdb.info/chat/",children:"discord"}),"."]}),"\n",(0,o.jsx)(t.h2,{id:"no-go",children:"No-Go"}),"\n",(0,o.jsx)(t.p,{children:"When reporting a bug, you need to make a PR with a test case that runs in the CI and reproduces your problem.\nSending a link with a repo does not help the maintainer because installing random peoples projects is time consuming and dangerous.\nAlso the maintainer will never go on a bug hunt based on your plain description. Either you report the bug with a test case, or the maintainer will likely not help you."}),"\n",(0,o.jsx)(t.h1,{id:"docs",children:"Docs"}),"\n",(0,o.jsxs)(t.p,{children:["The source of the documentation is at the ",(0,o.jsx)(t.code,{children:"docs-src"}),"-folder.\nTo read the docs locally, run ",(0,o.jsx)(t.code,{children:"npm run docs:install && npm run docs:serve"})," and open ",(0,o.jsx)(t.code,{children:"http://localhost:4000/"})]}),"\n",(0,o.jsx)(t.h1,{id:"thank-you-for-contributing",children:"Thank you for contributing!"})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},8453(e,t,n){n.d(t,{R:()=>s,x:()=>a});var i=n(6540);const o={},r=i.createContext(o);function s(e){const t=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),i.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/4ed9495b.b85648e1.js b/docs/assets/js/4ed9495b.b85648e1.js deleted file mode 100644 index 6d0dc2eef67..00000000000 --- a/docs/assets/js/4ed9495b.b85648e1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[1199],{3247(e,s,r){r.d(s,{g:()=>i});var n=r(4848);function i(e){const s=[];let r=null;return e.children.forEach(e=>{e.props.id?(r&&s.push(r),r={headline:e,paragraphs:[]}):r&&r.paragraphs.push(e)}),r&&s.push(r),(0,n.jsx)("div",{style:a.stepsContainer,children:s.map((e,s)=>(0,n.jsxs)("div",{style:a.stepWrapper,children:[(0,n.jsxs)("div",{style:a.stepIndicator,children:[(0,n.jsx)("div",{style:a.stepNumber,children:s+1}),(0,n.jsx)("div",{style:a.verticalLine})]}),(0,n.jsxs)("div",{style:a.stepContent,children:[(0,n.jsx)("div",{children:e.headline}),e.paragraphs.map((e,s)=>(0,n.jsx)("div",{style:a.item,children:e},s))]})]},s))})}const a={stepsContainer:{display:"flex",flexDirection:"column"},stepWrapper:{display:"flex",alignItems:"stretch",marginBottom:"1.5rem",position:"relative",minWidth:0},stepIndicator:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",width:"33px",marginRight:"1rem",minWidth:0},stepNumber:{width:"33px",height:"33px",borderRadius:"50%",backgroundColor:"var(--color-top)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:"bold",marginTop:-4},verticalLine:{position:"absolute",top:29,bottom:"0",left:"50%",width:"1px",background:"linear-gradient(to bottom, var(--color-top) 0%, var(--color-top) 80%, rgba(0,0,0,0) 100%)",transform:"translateX(-50%)"},stepContent:{flex:1,minWidth:0,overflowWrap:"break-word"},item:{marginTop:"0.5rem"}}},5356(e,s,r){r.r(s),r.d(s,{assets:()=>c,contentTitle:()=>t,default:()=>p,frontMatter:()=>l,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"rx-storage-sqlite","title":"RxDB SQLite RxStorage for Hybrid Apps","description":"Unlock seamless persistence with SQLite RxStorage. Explore usage in hybrid apps, compare performance, and leverage advanced features like attachments.","source":"@site/docs/rx-storage-sqlite.md","sourceDirName":".","slug":"/rx-storage-sqlite.html","permalink":"/rx-storage-sqlite.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB SQLite RxStorage for Hybrid Apps","slug":"rx-storage-sqlite.html","description":"Unlock seamless persistence with SQLite RxStorage. Explore usage in hybrid apps, compare performance, and leverage advanced features like attachments."},"sidebar":"tutorialSidebar","previous":{"title":"Filesystem Node \ud83d\udc51 (Node.js)","permalink":"/rx-storage-filesystem-node.html"},"next":{"title":"Dexie.js","permalink":"/rx-storage-dexie.html"}}');var i=r(4848),a=r(8453),o=(r(3247),r(2636));const l={title:"RxDB SQLite RxStorage for Hybrid Apps",slug:"rx-storage-sqlite.html",description:"Unlock seamless persistence with SQLite RxStorage. Explore usage in hybrid apps, compare performance, and leverage advanced features like attachments."},t="SQLite RxStorage",c={},d=[{value:"Performance comparison with other storages",id:"performance-comparison-with-other-storages",level:2},{value:"Using the SQLite RxStorage",id:"using-the-sqlite-rxstorage",level:2},{value:"Trial Version",id:"trial-version",level:2},{value:"RxDB Premium \ud83d\udc51",id:"rxdb-premium-",level:2},{value:"SQLiteBasics",id:"sqlitebasics",level:2},{value:"Using the SQLite RxStorage with different SQLite libraries",id:"using-the-sqlite-rxstorage-with-different-sqlite-libraries",level:2},{value:"Usage with the sqlite3 npm package",id:"usage-with-the-sqlite3-npm-package",level:3},{value:"Usage with the node package",id:"usage-with-the-node-package",level:3},{value:"Usage with Webassembly in the Browser",id:"usage-with-webassembly-in-the-browser",level:3},{value:"Usage with React Native",id:"usage-with-react-native",level:3},{value:"Usage with Expo SQLite",id:"usage-with-expo-sqlite",level:3},{value:"Usage with SQLite Capacitor",id:"usage-with-sqlite-capacitor",level:3},{value:"Usage with Tauri SQLite",id:"usage-with-tauri-sqlite",level:3},{value:"Database Connection",id:"database-connection",level:2},{value:"Known Problems of SQLite in JavaScript apps",id:"known-problems-of-sqlite-in-javascript-apps",level:2},{value:"Related",id:"related",level:2}];function h(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"sqlite-rxstorage",children:"SQLite RxStorage"})}),"\n",(0,i.jsxs)(s.p,{children:["This ",(0,i.jsx)(s.a,{href:"/rx-storage.html",children:"RxStorage"})," is based on ",(0,i.jsx)(s.a,{href:"https://www.sqlite.org/index.html",children:"SQLite"})," and is made to work with ",(0,i.jsx)(s.strong,{children:"Node.js"}),", ",(0,i.jsx)(s.a,{href:"/electron-database.html",children:"Electron"}),", ",(0,i.jsx)(s.a,{href:"/react-native-database.html",children:"React Native"})," and ",(0,i.jsx)(s.a,{href:"/capacitor-database.html",children:"Capacitor"})," or SQLite via webassembly in the browser. It can be used with different so called ",(0,i.jsx)(s.code,{children:"sqliteBasics"})," adapters to account for the differences in the various SQLite bundles and libraries that exist."]}),"\n",(0,i.jsxs)(s.p,{children:["SQLite is a natural fit for RxDB because most platforms - Android, iOS, Node.js, and beyond - already ship with a built-in SQLite engine, delivering robust performance and minimal setup overhead. Its proven reliability, having powered countless applications over the years, ensures a battle-tested foundation for local data. By placing RxDB on top of SQLite, you gain advanced features suited for building interactive, offline-capable UI apps: ",(0,i.jsx)(s.a,{href:"/rx-query.html#observe",children:"real-time queries"}),", reactive state updates, ",(0,i.jsx)(s.a,{href:"/transactions-conflicts-revisions.html",children:"conflict handling"}),", ",(0,i.jsx)(s.a,{href:"/encryption.html",children:"data encryption"}),", and straightforward ",(0,i.jsx)(s.a,{href:"/rx-schema.html",children:"schema management"}),". This combination offers a unified NoSQL-like experience without sacrificing the speed and broad availability that SQLite brings."]}),"\n",(0,i.jsx)(s.h2,{id:"performance-comparison-with-other-storages",children:"Performance comparison with other storages"}),"\n",(0,i.jsxs)(s.p,{children:["The SQLite storage is a bit slower compared to other Node.js based storages like the ",(0,i.jsx)(s.a,{href:"/rx-storage-filesystem-node.html",children:"Filesystem Storage"})," because wrapping SQLite has a bit of overhead and sending data from the JavaScript process to SQLite and backwards increases the latency. However for most hybrid apps the SQLite storage is the best option because it can leverage the SQLite version that comes already installed on the smartphones OS (iOS and android). Also for desktop electron apps it can be a viable solution because it is easy to ship SQLite together inside of the electron bundle."]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"./files/rx-storage-performance-node.png",alt:"SQLite performance - Node.js",width:"700"})}),"\n",(0,i.jsx)(s.h2,{id:"using-the-sqlite-rxstorage",children:"Using the SQLite RxStorage"}),"\n",(0,i.jsx)(s.p,{children:"There are two versions of the SQLite storage available for RxDB:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.strong,{children:"trial version"})," which comes directly shipped with RxDB Core. It contains an SQLite storage that allows you to try out RxDB on devices that support SQLite, like React Native or Electron. While the trial version does pass the full RxDB storage test-suite, it is not made for production. It is not using indexes, has no attachment support, is limited to store 300 documents and fetches the whole storage state to run queries in memory. ",(0,i.jsx)(s.strong,{children:"Use it for evaluation and prototypes only!"})]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["The ",(0,i.jsxs)(s.strong,{children:[(0,i.jsx)(s.a,{href:"/premium/",children:"RxDB Premium \ud83d\udc51"})," version"]})," which contains the full production-ready SQLite storage. It contains a full load of performance optimizations and full query support. To use the SQLite storage you have to import ",(0,i.jsx)(s.code,{children:"getRxStorageSQLite"})," from the ",(0,i.jsx)(s.a,{href:"/premium/",children:"RxDB Premium \ud83d\udc51"})," package and then add the correct ",(0,i.jsx)(s.code,{children:"sqliteBasics"})," adapter depending on which sqlite module you want to use. This can then be used as storage when creating the ",(0,i.jsx)(s.a,{href:"/rx-database.html",children:"RxDatabase"}),". In the following you can see some examples for some of the most common SQLite packages."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(o.t,{children:[(0,i.jsx)(s.h2,{id:"trial-version",children:"Trial Version"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Import the Trial SQLite Storage"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageSQLiteTrial"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getSQLiteBasicsNodeNative"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Create a Storage for it, here we use the nodejs-native SQLite module"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// other SQLite modules can be used with a different sqliteBasics adapter"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { DatabaseSync } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'node:sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSQLiteTrial"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqliteBasics"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getSQLiteBasicsNodeNative"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(DatabaseSync)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Create a Database with the Storage"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(s.h2,{id:"rxdb-premium-",children:"RxDB Premium \ud83d\udc51"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Import the SQLite Storage from the premium plugins."})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getSQLiteBasicsNodeNative"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Create a Storage for it, here we use the nodejs-native SQLite module"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// other SQLite modules can be used with a different sqliteBasics adapter"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { DatabaseSync } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'node:sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqliteBasics"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getSQLiteBasicsNodeNative"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(DatabaseSync)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Create a Database with the Storage"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})})]}),"\n",(0,i.jsx)(s.p,{children:"In the following, all examples are shown with the premium SQLite storage. Still they work the same with the trial version."}),"\n",(0,i.jsx)(s.h2,{id:"sqlitebasics",children:"SQLiteBasics"}),"\n",(0,i.jsxs)(s.p,{children:["Different SQLite libraries have different APIs to create and access the SQLite database. Therefore the library must be massaged to work with the RxDB SQlite storage. This is done in a so called ",(0,i.jsx)(s.code,{children:"SQLiteBasics"})," interface. RxDB directly ships with a wide range of these for various SQLite libraries that are commonly used. Also creating your own one is pretty simple, check the source code of the existing ones for that."]}),"\n",(0,i.jsxs)(s.p,{children:["For example for the ",(0,i.jsx)(s.code,{children:"sqlite3"})," npm library we have the ",(0,i.jsx)(s.code,{children:"getSQLiteBasicsNode()"})," implementation. For ",(0,i.jsx)(s.code,{children:"node:sqlite"})," we have the ",(0,i.jsx)(s.code,{children:"getSQLiteBasicsNodeNative()"})," implementation and so on.."]}),"\n",(0,i.jsx)(s.h2,{id:"using-the-sqlite-rxstorage-with-different-sqlite-libraries",children:"Using the SQLite RxStorage with different SQLite libraries"}),"\n",(0,i.jsxs)(s.h3,{id:"usage-with-the-sqlite3-npm-package",children:["Usage with the ",(0,i.jsx)(s.strong,{children:"sqlite3 npm package"})]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getSQLiteBasicsNode"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * In Node.js, we use the SQLite database"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * from the 'sqlite' npm module."})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"@link"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" https://www.npmjs.com/package/sqlite3"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqlite3 "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'sqlite3'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * Different runtimes have different interfaces to SQLite."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * For example in node.js we have a callback API,"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * while in capacitor sqlite we have Promises."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * So we need a helper object that is capable of doing the basic"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * sqlite operations."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqliteBasics"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getSQLiteBasicsNode"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(sqlite3)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.h3,{id:"usage-with-the-node-package",children:["Usage with the ",(0,i.jsxs)(s.strong,{children:["node",":sqlite"]})," package"]}),"\n",(0,i.jsxs)(s.p,{children:['With Node.js version 22 and newer, you can use the "native" ',(0,i.jsx)(s.a,{href:"https://nodejs.org/api/sqlite.html",children:"sqlite module"})," that comes shipped with Node.js."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getSQLiteBasicsNodeNative"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { DatabaseSync } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'node:sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqliteBasics"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getSQLiteBasicsNodeNative"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(DatabaseSync)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.h3,{id:"usage-with-webassembly-in-the-browser",children:"Usage with Webassembly in the Browser"}),"\n",(0,i.jsxs)(s.p,{children:["In the browser you can use the ",(0,i.jsx)(s.a,{href:"https://github.com/rhashimoto/wa-sqlite",children:"wa-sqlite"})," package to run sQLite in Webassembly. The wa-sqlite module also allows to use persistence with IndexedDB or OPFS. Notice that in general SQLite via Webassembly is slower compared to other storages like ",(0,i.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB"})," or ",(0,i.jsx)(s.a,{href:"/rx-storage-opfs.html",children:"OPFS"})," because sending data from the main thread to wasm and backwards is slow in the browser. Have a look the ",(0,i.jsx)(s.a,{href:"/rx-storage-performance.html",children:"performance comparison"}),"."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getSQLiteBasicsWasm"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * In the Browser, we use the SQLite database"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * from the 'wa-sqlite' npm module. This contains the SQLite library"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * compiled to Webassembly"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"@link"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" https://www.npmjs.com/package/wa-sqlite"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" SQLiteESMFactory "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'wa-sqlite/dist/wa-sqlite-async.mjs'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" SQLite "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'wa-sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" sqliteModule"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" SQLiteESMFactory"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" sqlite3"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" SQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".Factory"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"module"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqliteBasics"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getSQLiteBasicsWasm"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(sqlite3)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.h3,{id:"usage-with-react-native",children:["Usage with ",(0,i.jsx)(s.strong,{children:"React Native"})]}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Install the ",(0,i.jsx)(s.a,{href:"https://www.npmjs.com/package/react-native-quick-sqlite",children:"react-native-quick-sqlite npm module"})]}),"\n",(0,i.jsxs)(s.li,{children:["Import ",(0,i.jsx)(s.code,{children:"getSQLiteBasicsQuickSQLite"})," from the SQLite plugin and use it to create a ",(0,i.jsx)(s.a,{href:"/rx-database.html",children:"RxDatabase"}),":"]}),"\n"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getSQLiteBasicsQuickSQLite"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { open } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'react-native-quick-sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// create database"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" multiInstance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- Set multiInstance to false when using RxDB in React Native"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqliteBasics"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getSQLiteBasicsQuickSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(open)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.p,{children:["If ",(0,i.jsx)(s.code,{children:"react-native-quick-sqlite"})," does not work for you, as alternative you can use the ",(0,i.jsx)(s.a,{href:"https://www.npmjs.com/package/react-native-sqlite-2",children:"react-native-sqlite-2"})," library instead:"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getSQLiteBasicsWebSQL"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" SQLite "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'react-native-sqlite-2'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqliteBasics"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getSQLiteBasicsWebSQL"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"SQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".openDatabase)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.h3,{id:"usage-with-expo-sqlite",children:["Usage with ",(0,i.jsx)(s.strong,{children:"Expo SQLite"})]}),"\n",(0,i.jsxs)(s.p,{children:["Notice that ",(0,i.jsx)(s.a,{href:"https://www.npmjs.com/package/expo-sqlite",children:"expo-sqlite"})," cannot be used on android (but it works on iOS) if you use Expo SDK version 50 or older. Please update to Version 50 or newer to use it."]}),"\n",(0,i.jsxs)(s.p,{children:["In the latest expo SDK version, use the ",(0,i.jsx)(s.code,{children:"getSQLiteBasicsExpoSQLiteAsync()"})," method:"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getSQLiteBasicsExpoSQLiteAsync"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" *"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" as"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" SQLite "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'expo-sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" multiInstance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqliteBasics"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getSQLiteBasicsExpoSQLiteAsync"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"SQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".openDatabaseAsync)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.p,{children:"In older Expo SDK versions, you might have to use the non-async API:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getSQLiteBasicsExpoSQLite"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { openDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'expo-sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" multiInstance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqliteBasics"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getSQLiteBasicsExpoSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(openDatabase)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.h3,{id:"usage-with-sqlite-capacitor",children:["Usage with ",(0,i.jsx)(s.strong,{children:"SQLite Capacitor"})]}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Install the ",(0,i.jsx)(s.a,{href:"https://github.com/capacitor-community/sqlite",children:"sqlite capacitor npm module"})]}),"\n",(0,i.jsx)(s.li,{children:"Add the iOS database location to your capacitor config"}),"\n"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"json","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"json","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"{"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "plugins"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "CapacitorSQLite"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "iosDatabaseLocation"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "Library/CapacitorDatabase"'})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsxs)(s.ol,{start:"3",children:["\n",(0,i.jsxs)(s.li,{children:["Use the function ",(0,i.jsx)(s.code,{children:"getSQLiteBasicsCapacitor"})," to get the capacitor sqlite wrapper."]}),"\n"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getSQLiteBasicsCapacitor"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * Import SQLite from the capacitor plugin."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" CapacitorSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" SQLiteConnection"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '@capacitor-community/sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { Capacitor } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '@capacitor/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" sqlite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" SQLiteConnection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(CapacitorSQLite);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * Different runtimes have different interfaces to SQLite."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * For example in node.js we have a callback API,"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * while in capacitor sqlite we have Promises."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * So we need a helper object that is capable of doing the basic"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * sqlite operations."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqliteBasics"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getSQLiteBasicsCapacitor"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(sqlite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" Capacitor)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.h3,{id:"usage-with-tauri-sqlite",children:"Usage with Tauri SQLite"}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:["Add the ",(0,i.jsx)(s.a,{href:"https://tauri.app/plugin/sql/#setup",children:"Tauri SQL plugin"})," to your Tauri project."]}),"\n",(0,i.jsxs)(s.li,{children:["Make sure to add ",(0,i.jsx)(s.code,{children:"sqlite"})," as your database engine by running ",(0,i.jsx)(s.code,{children:"cargo add tauri-plugin-sql --features sqlite"})," inside ",(0,i.jsx)(s.code,{children:"src-tauri"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Use the ",(0,i.jsx)(s.code,{children:"getSQLiteBasicsTauri"})," function to get the Tauri SQLite wrapper."]}),"\n"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getSQLiteBasicsTauri"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqlite3 "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '@tauri-apps/plugin-sql'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqliteBasics"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getSQLiteBasicsTauri"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(sqlite3)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.h2,{id:"database-connection",children:"Database Connection"}),"\n",(0,i.jsxs)(s.p,{children:["If you need to access the database connection for any reason you can use ",(0,i.jsx)(s.code,{children:"getDatabaseConnection"})," to do so:"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getDatabaseConnection } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-sqlite'"})]})})})}),"\n",(0,i.jsx)(s.p,{children:"It has the following signature:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"getDatabaseConnection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqliteBasics: SQLiteBasics"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"<"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"any"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:">"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" databaseName: string"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"): "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"Promise"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"<"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"SQLiteDatabaseClass"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:">"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]})]})})}),"\n",(0,i.jsx)(s.h2,{id:"known-problems-of-sqlite-in-javascript-apps",children:"Known Problems of SQLite in JavaScript apps"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["Some JavaScript runtimes do not contain a ",(0,i.jsx)(s.code,{children:"Buffer"})," API which is used by SQLite to store binary attachments data as ",(0,i.jsx)(s.code,{children:"BLOB"}),". You can set ",(0,i.jsx)(s.code,{children:"storeAttachmentsAsBase64String: true"})," if you want to store the attachments data as base64 string instead. This increases the database size but makes it work even without having a ",(0,i.jsx)(s.code,{children:"Buffer"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["The SQlite RxStorage works on SQLite libraries that use SQLite in version ",(0,i.jsx)(s.code,{children:"3.38.0 (2022-02-22)"})," or newer, because it uses the ",(0,i.jsx)(s.a,{href:"https://www.sqlite.org/json1.html",children:"SQLite JSON"})," methods like ",(0,i.jsx)(s.code,{children:"JSON_EXTRACT"}),". If you get an error like ",(0,i.jsx)(s.code,{children:"[Error: no such function: JSON_EXTRACT (code 1 SQLITE_ERROR[1])"}),", you might have a too old version of SQLite."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:["To debug all SQL operations, you can pass a log function to ",(0,i.jsx)(s.code,{children:"getRxStorageSQLite()"})," like this. This does not work with the trial version:"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqliteBasics"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getSQLiteBasicsCapacitor"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(sqlite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" Capacitor)"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // pass log function"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" log"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"log"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".bind"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(console)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["By default, all tables will be created with the ",(0,i.jsx)(s.code,{children:"WITHOUT ROWID"})," flag. Some tools like drizzle do not support tables with that option. You can disable it by setting ",(0,i.jsx)(s.code,{children:"withoutRowId: false"})," when calling ",(0,i.jsx)(s.code,{children:"getRxStorageSQLite()"}),":"]}),"\n"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqliteBasics"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getSQLiteBasicsCapacitor"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(sqlite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" Capacitor)"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" withoutRowId"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" false"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.h2,{id:"related",children:"Related"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"/react-native-database.html",children:"React Native Databases"})}),"\n"]})]})}function p(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453(e,s,r){r.d(s,{R:()=>o,x:()=>l});var n=r(6540);const i={},a=n.createContext(i);function o(e){const s=n.useContext(a);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),n.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/4f17bbdd.b46c3eaf.js b/docs/assets/js/4f17bbdd.b46c3eaf.js deleted file mode 100644 index a2ca88ad4b7..00000000000 --- a/docs/assets/js/4f17bbdd.b46c3eaf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[2373],{1206(e,i,s){s.r(i),s.d(i,{default:()=>n});var r=s(4586),l=s(8711),t=s(6540),c=s(8141),d=s(4848);function n(){const{siteConfig:e}=(0,r.A)();return(0,t.useEffect)(()=>{(0,c.c)("paid-meeting-link-clicked",100,1)}),(0,d.jsx)(l.A,{title:`Meeting - ${e.title}`,description:"RxDB Meeting Scheduler",children:(0,d.jsx)("main",{children:(0,d.jsxs)("div",{className:"redirectBox",style:{textAlign:"center"},children:[(0,d.jsx)("a",{href:"/",children:(0,d.jsx)("div",{className:"logo",children:(0,d.jsx)("img",{src:"/files/logo/logo_text.svg",alt:"RxDB",width:160})})}),(0,d.jsx)("h1",{children:"RxDB Meeting Scheduler"}),(0,d.jsx)("p",{children:(0,d.jsx)("b",{children:"You will be redirected in a few seconds."})}),(0,d.jsx)("p",{children:(0,d.jsx)("a",{href:"https://rxdb.pipedrive.com/scheduler/Z6A0M1sr/rxdb-1h-paid-consulting-session",children:"Click here"})}),(0,d.jsx)("meta",{httpEquiv:"Refresh",content:"0; url=https://rxdb.pipedrive.com/scheduler/Z6A0M1sr/rxdb-1h-paid-consulting-session"})]})})})}}}]); \ No newline at end of file diff --git a/docs/assets/js/502d8946.3c4d7aab.js b/docs/assets/js/502d8946.3c4d7aab.js deleted file mode 100644 index 131b9122d64..00000000000 --- a/docs/assets/js/502d8946.3c4d7aab.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[7817],{732(e,n,i){i.r(n),i.d(n,{default:()=>h});var r=i(4586),t=i(5260),s=i(8711),l=(i(6540),i(4848));function h(){const{siteConfig:e}=(0,r.A)();return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(t.A,{children:(0,l.jsx)("meta",{name:"robots",content:"noindex"})}),(0,l.jsx)(s.A,{title:`Legal Notice - ${e.title}`,description:"RxDB Legal Notice",children:(0,l.jsxs)("main",{children:[(0,l.jsxs)("div",{className:"redirectBox",style:{textAlign:"center"},children:[(0,l.jsx)("a",{href:"/",children:(0,l.jsx)("div",{className:"logo",children:(0,l.jsx)("img",{src:"/files/logo/logo_text.svg",alt:"RxDB",width:160})})}),(0,l.jsxs)("h1",{children:[(0,l.jsx)("a",{href:"https://rxdb.info/",children:"RxDB"})," Legal Notice"]}),(0,l.jsxs)("p",{children:["Daniel Meyer - RxDB",(0,l.jsx)("br",{}),"Friedrichstra\xdfe 13",(0,l.jsx)("br",{}),"70174 Stuttgart",(0,l.jsx)("br",{}),"Email: ",(0,l.jsx)("br",{}),(0,l.jsx)("img",{src:"/files/imprint-email.png",alt:"RxDB Email"})]})]}),(0,l.jsxs)("div",{className:"redirectBox",style:{padding:"10%"},children:[(0,l.jsx)("h3",{children:"German Legal Notice"}),(0,l.jsx)("h6",{children:"Umsatzsteuer-ID nach \xa727a Umsatzsteuergesetz"}),"DE357840955",(0,l.jsx)("h6",{children:"Verantwortlich f\xfcr den Inhalt (gem. \xa7 55 Abs. 2 RStV)"}),"Der oben genannte Eigent\xfcmer.",(0,l.jsx)("h6",{children:"Hinweis gem\xe4\xdf Online-Streitbeilegungs-Verordnung"}),(0,l.jsx)("p",{children:"Nach geltendem Recht sind wir verpflichtet, Verbraucher auf die Existenz der Europ\xe4ischen Online-Streitbeilegungs-Plattform hinzuweisen, welche f\xfcr die Beilegung von Streitigkeiten genutzt werden kann, ohne dass ein Gericht eingeschaltet werden muss. F\xfcr die Einrichtung der Plattform ist die Europ\xe4ische Kommission zust\xe4ndig. Die Europ\xe4ische Online-Streitbeilegungs-Plattform ist hier zu finden: http://ec.europa.eu/odr. Wir weisen ausdr\xfccklich darauf hin, dass wir nicht bereit sind, uns am Streitbeilegungsverfahren im Rahmen der Europ\xe4ischen Online-Streitbeilegungs-Plattform zu beteiligen."}),(0,l.jsx)("h6",{children:"\xa7 1 Warnhinweis zu Inhalten"}),(0,l.jsx)("p",{children:"Alle Inhalte dieser Webseite wurden nach Treu und Glauben mit gr\xf6\xdftm\xf6glicher Sorgfalt erstellt. Wir \xfcbernehmen keine Gew\xe4hr f\xfcr die Richtigkeit und Aktualit\xe4t der bereitgestellten Inhalte und garantieren nicht, dass diese Daten jederzeit auf dem aktuellen Stand sind. Diese Webseite kann technische Ungenauigkeiten oder typographische Fehler enthalten. Wir behalten uns vor, die Informationen dieser Webseite jederzeit und ohne vorherige Ank\xfcndigung zu \xe4ndern, zu aktualisieren oder zu l\xf6schen. In keinem Fall haften wir Ihnen oder Dritten gegen\xfcber f\xfcr irgendwelche direkten, indirekten, speziellen oder sonstigen Sch\xe4den jeglicher Art. "}),(0,l.jsx)("h6",{children:"\xa7 2 Externe Links / Externe Verkn\xfcpfungen"}),(0,l.jsx)("p",{children:"Diese Webseite enth\xe4lt Verkn\xfcpfungen zu Webseiten Dritter, zum Beispiel eingebunden durch Links oder Buttons. Diese Webseiten unterliegen der Haftung der jeweiligen Betreiber. Bei der erstmaligen Verkn\xfcpfung jeglicher Webseiten Dritter haben wir die fremden Inhalte auf das Bestehen etwaiger Rechtsverst\xf6\xdfe \xfcberpr\xfcft. Zum Zeitpunkt der \xdcberpr\xfcfung waren keine Rechtsverst\xf6\xdfe ersichtlich. Wir haben keinerlei Einfluss auf die aktuelle und zuk\xfcnftige Gestaltung und auf die Inhalte der verkn\xfcpften Seiten. Das Setzen von externen Verkn\xfcpfungen bedeutet nicht, dass wir uns die hinter der Verkn\xfcpfung liegenden Inhalte zu eigen machen. Eine st\xe4ndige Kontrolle der Inhalte s\xe4mtlicher externen Verkn\xfcpfungen ist ohne konkrete Hinweise auf Rechtsverst\xf6\xdfe nicht zumutbar. Bei Kenntnisnahme von Rechtsverst\xf6\xdfen werden betroffene Inhalte oder Verkn\xfcpfungen unverz\xfcglich gel\xf6scht."}),(0,l.jsx)("h6",{children:"\xa7 3 Urheber- und Leistungsschutzrechte"}),(0,l.jsx)("p",{children:"Die auf dieser Webseite ver\xf6ffentlichten Inhalte unterliegen dem deutschen Urheber- und Leistungsschutzrecht. Jede vom deutschen Urheber- und Leistungsschutzrecht nicht zugelassene Verwertung bedarf der vorherigen schriftlichen Zustimmung unsererseits oder des jeweiligen Rechteinhabers. Dies gilt insbesondere f\xfcr jede Art oder Abwandlung der Vervielf\xe4ltigung, Bearbeitung, Verarbeitung, \xdcbersetzung, Einspeicherung und Wiedergabe von Inhalten in jeglicher Form. Die unerlaubte Vervielf\xe4ltigung oder Weitergabe einzelner Inhalte oder kompletter Seiten ist nicht gestattet und strafbar. Die Darstellung dieser Webseite in fremden Frames ist nur mit schriftlicher Erlaubnis unsererseits zul\xe4ssig."}),(0,l.jsx)("h6",{children:"\xa7 4 Besondere Nutzungsbedingungen"}),(0,l.jsx)("p",{children:"Soweit besondere Bedingungen f\xfcr einzelne Nutzungen dieser Webseite von den vorgenannten Paragraphen abweichen, wird an entsprechender Stelle ausdr\xfccklich darauf hingewiesen. In diesem Falle gelten im jeweiligen Einzelfall die besonderen Nutzungsbedingungen. "}),(0,l.jsx)("h6",{children:"\xa7 5 Rechtswirksamkeit dieses Haftungsausschlusses"}),(0,l.jsx)("p",{children:"Dieser Haftungsausschluss ist als Teil des Internetangebotes zu betrachten, von welchem aus auf diese Seite verwiesen wurde. Sofern Teile oder einzelne Formulierungen dieses Textes der geltenden Rechtslage nicht, nicht mehr oder nicht vollst\xe4ndig entsprechen sollten, bleiben die \xfcbrigen Teile des Dokumentes in ihrem Inhalt und ihrer G\xfcltigkeit davon unber\xfchrt."})]})]})})]})}}}]); \ No newline at end of file diff --git a/docs/assets/js/51014a8a.c98a88e4.js b/docs/assets/js/51014a8a.c98a88e4.js deleted file mode 100644 index 40d9ffe7419..00000000000 --- a/docs/assets/js/51014a8a.c98a88e4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9460],{8453(e,n,s){s.d(n,{R:()=>r,x:()=>a});var i=s(6540);const t={},o=i.createContext(t);function r(e){const n=i.useContext(o);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),i.createElement(o.Provider,{value:n},e.children)}},9777(e,n,s){s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"articles/websockets-sse-polling-webrtc-webtransport","title":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","description":"Learn the unique benefits and pitfalls of each real-time tech. Make informed decisions on WebSockets, SSE, Polling, WebRTC, and WebTransport.","source":"@site/docs/articles/websockets-sse-polling-webrtc-webtransport.md","sourceDirName":"articles","slug":"/articles/websockets-sse-polling-webrtc-webtransport.html","permalink":"/articles/websockets-sse-polling-webrtc-webtransport.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","slug":"websockets-sse-polling-webrtc-webtransport.html","description":"Learn the unique benefits and pitfalls of each real-time tech. Make informed decisions on WebSockets, SSE, Polling, WebRTC, and WebTransport."},"sidebar":"tutorialSidebar","previous":{"title":"RxDB - The JSON Database Built for JavaScript","permalink":"/articles/json-database.html"},"next":{"title":"Using localStorage in Modern Applications - A Comprehensive Guide","permalink":"/articles/localstorage.html"}}');var t=s(4848),o=s(8453);const r={title:"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport",slug:"websockets-sse-polling-webrtc-webtransport.html",description:"Learn the unique benefits and pitfalls of each real-time tech. Make informed decisions on WebSockets, SSE, Polling, WebRTC, and WebTransport."},a="WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport",l={},c=[{value:"What is Long Polling?",id:"what-is-long-polling",level:3},{value:"What are WebSockets?",id:"what-are-websockets",level:3},{value:"What are Server-Sent-Events?",id:"what-are-server-sent-events",level:3},{value:"What is the WebTransport API?",id:"what-is-the-webtransport-api",level:3},{value:"What is WebRTC?",id:"what-is-webrtc",level:3},{value:"Limitations of the technologies",id:"limitations-of-the-technologies",level:2},{value:"Sending Data in both directions",id:"sending-data-in-both-directions",level:3},{value:"6-Requests per Domain Limit",id:"6-requests-per-domain-limit",level:3},{value:"Connections are not kept open on mobile apps",id:"connections-are-not-kept-open-on-mobile-apps",level:3},{value:"Proxies and Firewalls",id:"proxies-and-firewalls",level:3},{value:"Performance Comparison",id:"performance-comparison",level:2},{value:"Latency",id:"latency",level:3},{value:"Throughput",id:"throughput",level:3},{value:"Scalability and Server Load",id:"scalability-and-server-load",level:3},{value:"Recommendations and Use-Case Suitability",id:"recommendations-and-use-case-suitability",level:2},{value:"Known Problems",id:"known-problems",level:2},{value:"A client can miss out events when reconnecting",id:"a-client-can-miss-out-events-when-reconnecting",level:3},{value:"Company firewalls can cause problems",id:"company-firewalls-can-cause-problems",level:3},{value:"Follow Up",id:"follow-up",level:2}];function h(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.header,{children:(0,t.jsx)(n.h1,{id:"websockets-vs-server-sent-events-vs-long-polling-vs-webrtc-vs-webtransport",children:"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport"})}),"\n",(0,t.jsxs)(n.p,{children:["For modern real-time web applications, the ability to send events from the server to the client is indispensable. This necessity has led to the development of several methods over the years, each with its own set of advantages and drawbacks. Initially, ",(0,t.jsx)(n.a,{href:"#what-is-long-polling",children:"long-polling"})," was the only option available. It was then succeeded by ",(0,t.jsx)(n.a,{href:"#what-are-websockets",children:"WebSockets"}),", which offered a more robust solution for bidirectional communication. Following WebSockets, ",(0,t.jsx)(n.a,{href:"#what-are-server-sent-events",children:"Server-Sent Events (SSE)"})," provided a simpler method for one-way communication from server to client. Looking ahead, the ",(0,t.jsx)(n.a,{href:"#what-is-the-webtransport-api",children:"WebTransport"})," protocol promises to revolutionize this landscape even further by providing a more efficient, flexible, and scalable approach. For niche use cases, ",(0,t.jsx)(n.a,{href:"#what-is-webrtc",children:"WebRTC"})," might also be considered for server-client events."]}),"\n",(0,t.jsxs)(n.p,{children:["This article aims to delve into these technologies, comparing their performance, highlighting their benefits and limitations, and offering recommendations for various use cases to help developers make informed decisions when building real-time web applications. It is a condensed summary of my gathered experience when I implemented the ",(0,t.jsx)(n.a,{href:"/replication.html",children:"RxDB Sync Engine"})," to be compatible with various backend technologies."]}),"\n",(0,t.jsx)("center",{children:(0,t.jsx)("a",{href:"https://rxdb.info/",children:(0,t.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JavaScript Database",width:"220"})})}),"\n",(0,t.jsx)(n.h3,{id:"what-is-long-polling",children:"What is Long Polling?"}),"\n",(0,t.jsx)(n.p,{children:'Long polling was the first "hack" to enable a server-client messaging method that can be used in browsers over HTTP. The technique emulates server push communications with normal XHR requests. Unlike traditional polling, where the client repeatedly requests data from the server at regular intervals, long polling establishes a connection to the server that remains open until new data is available. Once the server has new information, it sends the response to the client, and the connection is closed. Immediately after receiving the server\'s response, the client initiates a new request, and the process repeats. This method allows for more immediate data updates and reduces unnecessary network traffic and server load. However, it can still introduce delays in communication and is less efficient than other real-time technologies like WebSockets.'}),"\n",(0,t.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,t.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,t.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// long-polling in a JavaScript client"})}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" longPoll"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" fetch"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'http://example.com/poll'"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" .then"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(response "}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" response"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".json"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"())"})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" .then"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(data "}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"Received data:"'}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" data);"})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" longPoll"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(); "}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// Immediately establish a new long polling request"})]}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" .catch"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(error "}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Errors can appear in normal conditions when a "})}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * connection timeout is reached or when the client goes offline."})}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * On errors we just restart the polling after some delay."})}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" setTimeout"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(longPoll"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 10000"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"longPoll"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(); "}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// Initiate the long polling"})]})]})})}),"\n",(0,t.jsx)(n.p,{children:"Implementing long-polling on the client side is pretty simple, as shown in the code above. However on the backend there can be multiple difficulties to ensure the client receives all events and does not miss out updates when the client is currently reconnecting."}),"\n",(0,t.jsx)(n.h3,{id:"what-are-websockets",children:"What are WebSockets?"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/WebSocket?retiredLocale=de",children:"WebSockets"})," provide a full-duplex communication channel over a single, long-lived connection between the client and server. This technology enables browsers and servers to exchange data without the overhead of HTTP request-response cycles, facilitating real-time data transfer for applications like live chat, gaming, or financial trading platforms. WebSockets represent a significant advancement over traditional HTTP by allowing both parties to send data independently once the connection is established, making it ideal for scenarios that require low latency and high-frequency updates."]}),"\n",(0,t.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,t.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,t.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// WebSocket in a JavaScript client"})}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" socket"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" WebSocket"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'ws://example.com'"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"socket"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"onopen"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(event) {"})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Connection established'"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Sending a message to the server"})}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" socket"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".send"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Hello Server!'"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"socket"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"onmessage"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(event) {"})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Message from server:'"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" event"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".data);"})]}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,t.jsxs)(n.p,{children:["While the basics of the WebSocket API are easy to use it has shown to be rather complex in production. A socket can loose connection and must be re-created accordingly. Especially detecting if a connection is still usable or not, can be very tricky. Mostly you would add a ",(0,t.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#pings_and_pongs_the_heartbeat_of_websockets",children:"ping-and-pong"})," heartbeat to ensure that the open connection is not closed.\nThis complexity is why most people use a library on top of WebSockets like ",(0,t.jsx)(n.a,{href:"https://socket.io/",children:"Socket.IO"})," which handles all these cases and even provides fallbacks to long-polling if required."]}),"\n",(0,t.jsx)(n.h3,{id:"what-are-server-sent-events",children:"What are Server-Sent-Events?"}),"\n",(0,t.jsx)(n.p,{children:"Server-Sent Events (SSE) provide a standard way to push server updates to the client over HTTP. Unlike WebSockets, SSEs are designed exclusively for one-way communication from server to client, making them ideal for scenarios like live news feeds, sports scores, or any situation where the client needs to be updated in real time without sending data to the server."}),"\n",(0,t.jsx)(n.p,{children:"You can think of Server-Sent-Events as a single HTTP request where the backend does not send the whole body at once, but instead keeps the connection open and trickles the answer by sending a single line each time an event has to be send to the client."}),"\n",(0,t.jsxs)(n.p,{children:["Creating a connection for receiving events with SSE is straightforward. On the client side in a browser, you initialize an ",(0,t.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/EventSource",children:"EventSource"})," instance with the URL of the server-side script that generates the events."]}),"\n",(0,t.jsx)(n.p,{children:"Listening for messages involves attaching event handlers directly to the EventSource instance. The API distinguishes between generic message events and named events, allowing for more structured communication. Here's how you can set it up in JavaScript:"}),"\n",(0,t.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,t.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,t.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// Connecting to the server-side event stream"})}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" evtSource"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" EventSource"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"https://example.com/events"'}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// Handling generic message events"})}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"evtSource"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"onmessage"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" event "}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'got message: '"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" event"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".data);"})]}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,t.jsx)(n.p,{children:"In difference to WebSockets, an EventSource will automatically reconnect on connection loss."}),"\n",(0,t.jsxs)(n.p,{children:["On the server side, your script must set the ",(0,t.jsx)(n.code,{children:"Content-Type"})," header to ",(0,t.jsx)(n.code,{children:"text/event-stream"})," and format each message according to the ",(0,t.jsx)(n.a,{href:"https://www.w3.org/TR/2012/WD-eventsource-20120426/",children:"SSE specification"}),". This includes specifying event types, data payloads, and optional fields like event ID and retry timing."]}),"\n",(0,t.jsx)(n.p,{children:"Here's how you can set up a simple SSE endpoint in a Node.js Express app:"}),"\n",(0,t.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,t.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,t.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" express "}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'express'"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" app"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" express"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" PORT"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" process"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"env"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"PORT"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ||"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 3000"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"app"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".get"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'/events'"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (req"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" res) "}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" res"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".writeHead"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"200"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Content-Type'"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'text/event-stream'"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Cache-Control'"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'no-cache'"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Connection'"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'keep-alive'"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" sendEvent"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (data) "}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // all message lines must be prefixed with 'data: '"})}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" formattedData"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" `data: "}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"${"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"JSON"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".stringify"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(data)"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"}"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"\\n\\n`"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" res"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".write"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(formattedData);"})]}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Send an event every 2 seconds"})}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" intervalId"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" setInterval"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(() "}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" message"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" time"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" Date"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".toTimeString"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" message"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Hello from the server!'"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" sendEvent"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(message);"})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 2000"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Clean up when the connection is closed"})}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" req"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".on"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'close'"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" clearInterval"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(intervalId);"})]}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" res"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".end"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,t.jsx)(n.span,{"data-line":"",children:(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,t.jsxs)(n.span,{"data-line":"",children:[(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"app"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".listen"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"PORT"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"`Server running on http://localhost:"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"${"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"PORT"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"}"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"`"}),(0,t.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"));"})]})]})})}),"\n",(0,t.jsx)(n.h3,{id:"what-is-the-webtransport-api",children:"What is the WebTransport API?"}),"\n",(0,t.jsxs)(n.p,{children:["WebTransport is a cutting-edge API designed for efficient, low-latency communication between web clients and servers. It leverages the ",(0,t.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/HTTP/3",children:"HTTP/3 QUIC protocol"})," to enable a variety of data transfer capabilities, such as sending data over multiple streams, in both reliable and unreliable manners, and even allowing data to be sent out of order. This makes WebTransport a powerful tool for applications requiring high-performance networking, such as real-time gaming, live streaming, and collaborative platforms. However, it's important to note that WebTransport is currently a working draft and has not yet achieved widespread adoption.\nAs of now (March 2024), WebTransport is in a ",(0,t.jsx)(n.a,{href:"https://w3c.github.io/webtransport/",children:"Working Draft"})," and not widely supported. You cannot yet use WebTransport in the ",(0,t.jsx)(n.a,{href:"https://caniuse.com/webtransport",children:"Safari browser"})," and there is also no native support ",(0,t.jsx)(n.a,{href:"https://github.com/w3c/webtransport/issues/511",children:"in Node.js"}),". This limits its usability across different platforms and environments."]}),"\n",(0,t.jsx)(n.p,{children:"Even when WebTransport will become widely supported, its API is very complex to use and likely it would be something where people build libraries on top of WebTransport, not using it directly in an application's sourcecode."}),"\n",(0,t.jsx)(n.h3,{id:"what-is-webrtc",children:"What is WebRTC?"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://webrtc.org/",children:"WebRTC"})," (Web Real-Time Communication) is an open-source project and API standard that enables real-time communication (RTC) capabilities directly within web browsers and mobile applications without the need for complex server infrastructure or the installation of additional plugins. It supports peer-to-peer connections for streaming audio, video, and data exchange between browsers. ",(0,t.jsx)(n.a,{href:"/replication-webrtc.html",children:"WebRTC"})," is designed to work through NATs and firewalls, utilizing protocols like ICE, STUN, and TURN to establish a connection between peers."]}),"\n",(0,t.jsx)(n.p,{children:"While WebRTC is made to be used for client-client interactions, it could also be leveraged for server-client communication where the server just simulated being also a client. This approach only makes sense for niche use cases which is why in the following WebRTC will be ignored as an option."}),"\n",(0,t.jsx)(n.p,{children:"The problem is that for WebRTC to work, you need a signaling-server anyway which would then again run over websockets, SSE or WebTransport. This defeats the purpose of using WebRTC as a replacement for these technologies."}),"\n",(0,t.jsx)(n.h2,{id:"limitations-of-the-technologies",children:"Limitations of the technologies"}),"\n",(0,t.jsx)(n.h3,{id:"sending-data-in-both-directions",children:"Sending Data in both directions"}),"\n",(0,t.jsx)(n.p,{children:"Only WebSockets and WebTransport allow to send data in both directions so that you can receive server-data and send client-data over the same connection."}),"\n",(0,t.jsxs)(n.p,{children:["While it would also be possible with ",(0,t.jsx)(n.strong,{children:"Long-Polling"}),' in theory, it is not recommended because sending "new" data to an existing long-polling connection would require\nto do an additional http-request anyway. So instead of doing that you can send data directly from the client to the server with an additional http-request without interrupting\nthe long-polling connection.']}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Server-Sent-Events"})," do not support sending any additional data to the server. You can only do the initial request, and even there you cannot send POST-like data in the http-body by default with the native ",(0,t.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/EventSource",children:"EventSource API"}),". Instead you have to put all data inside of the url parameters which is considered a bad practice for security because credentials might leak into server logs, proxies and caches. To fix this problem, ",(0,t.jsx)(n.a,{href:"https://rxdb.info/",children:"RxDB"})," for example uses the ",(0,t.jsx)(n.a,{href:"https://github.com/EventSource/eventsource",children:"eventsource polyfill"})," instead of the native ",(0,t.jsx)(n.code,{children:"EventSource API"}),". This library adds additional functionality like sending ",(0,t.jsx)(n.strong,{children:"custom http headers"}),". Also there is ",(0,t.jsx)(n.a,{href:"https://github.com/Azure/fetch-event-source",children:"this library"})," from microsoft which allows to send body data and use ",(0,t.jsx)(n.code,{children:"POST"})," requests instead of ",(0,t.jsx)(n.code,{children:"GET"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"6-requests-per-domain-limit",children:"6-Requests per Domain Limit"}),"\n",(0,t.jsx)(n.p,{children:"Most modern browsers allow six connections per domain () which limits the usability of all steady server-to-client messaging methods. The limitation of six connections is even shared across browser tabs so when you open the same page in multiple tabs, they would have to shared the six-connection-pool with each other. This limitation is part of the HTTP/1.1-RFC (which even defines a lower number of only two connections)."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsxs)(n.p,{children:["Quote From ",(0,t.jsx)(n.a,{href:"https://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1.4",children:"RFC 2616 - Section 8.1.4"}),': "Clients that use persistent connections SHOULD limit the number of simultaneous connections that they maintain to a given server. A single-user client SHOULD NOT maintain more than ',(0,t.jsx)(n.strong,{children:"2 connections"}),' with any server or proxy. A proxy SHOULD use up to 2*N connections to another server or proxy, where N is the number of simultaneously active users. These guidelines are intended to improve HTTP response times and avoid congestion."']}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["While that policy makes sense to prevent website owners from using their visitors to D-DOS other websites, it can be a big problem when multiple connections are required to handle server-client communication for legitimate use cases. To workaround the limitation you have to use HTTP/2 or HTTP/3 with which the browser will only open a single connection per domain and then use multiplexing to run all data through a single connection. While this gives you a virtually infinity amount of parallel connections, there is a ",(0,t.jsx)(n.a,{href:"https://www.rfc-editor.org/rfc/rfc7540#section-6.5.2",children:"SETTINGS_MAX_CONCURRENT_STREAMS"})," setting which limits the actually connections amount. The default is 100 concurrent streams for most configurations."]}),"\n",(0,t.jsxs)(n.p,{children:['In theory the connection limit could also be increased by the browser, at least for specific APIs like EventSource, but the issues have been marked as "won\'t fix" by ',(0,t.jsx)(n.a,{href:"https://issues.chromium.org/issues/40329530",children:"chromium"})," and ",(0,t.jsx)(n.a,{href:"https://bugzilla.mozilla.org/show_bug.cgi?id=906896",children:"firefox"}),"."]}),"\n",(0,t.jsx)(n.admonition,{title:"Lower the amount of connections in Browser Apps",type:"note",children:(0,t.jsxs)(n.p,{children:["When you build a browser application, you have to assume that your users will use the app not only once, but in multiple browser tabs in parallel.\nBy default you likely will open one server-stream-connection per tab which is often not necessary at all. Instead you open only a single connection and shared it between tabs, no matter how many tabs are open. ",(0,t.jsx)(n.a,{href:"https://rxdb.info/",children:"RxDB"})," does that with the ",(0,t.jsx)(n.a,{href:"/leader-election.html",children:"LeaderElection"})," from the ",(0,t.jsx)(n.a,{href:"https://github.com/pubkey/broadcast-channel",children:"broadcast-channel npm package"})," to only have one stream of replication between server and clients. You can use that package standalone (without RxDB) for any type of application."]})}),"\n",(0,t.jsx)(n.h3,{id:"connections-are-not-kept-open-on-mobile-apps",children:"Connections are not kept open on mobile apps"}),"\n",(0,t.jsxs)(n.p,{children:["In the context of mobile applications running on operating systems like Android and iOS, maintaining open connections, such as those used for WebSockets and the others, poses a significant challenge. Mobile operating systems are designed to automatically move applications into the background after a certain period of inactivity, effectively closing any open connections. This behavior is a part of the operating system's resource management strategy to conserve battery and optimize performance. As a result, developers often rely on ",(0,t.jsx)(n.strong,{children:"mobile push notifications"})," as an efficient and reliable method to send data from servers to clients. Push notifications allow servers to alert the application of new data, prompting an action or update, without the need for a persistent open connection."]}),"\n",(0,t.jsx)(n.h3,{id:"proxies-and-firewalls",children:"Proxies and Firewalls"}),"\n",(0,t.jsxs)(n.p,{children:["From consulting many ",(0,t.jsx)(n.a,{href:"https://rxdb.info/",children:"RxDB"}),' users, it was shown that in enterprise environments (aka "at work") it is often hard to implement a WebSocket server into the infrastructure because many proxies and firewalls block non-HTTP connections. Therefore using the Server-Sent-Events provides and easier way of enterprise integration. Also long-polling uses only plain HTTP-requests and might be an option.']}),"\n",(0,t.jsx)("center",{children:(0,t.jsx)("a",{href:"https://rxdb.info/",children:(0,t.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JavaScript Database",width:"220"})})}),"\n",(0,t.jsx)(n.h2,{id:"performance-comparison",children:"Performance Comparison"}),"\n",(0,t.jsx)(n.p,{children:"Comparing the performance of WebSockets, Server-Sent Events (SSE), Long-Polling and WebTransport directly involves evaluating key aspects such as latency, throughput, server load, and scalability under various conditions."}),"\n",(0,t.jsxs)(n.p,{children:["First lets look at the raw numbers. A good performance comparison can be found in ",(0,t.jsx)(n.a,{href:"https://github.com/Sh3b0/realtime-web?tab=readme-ov-file#demos",children:"this repo"})," which tests the messages times in a ",(0,t.jsx)(n.a,{href:"https://go.dev/",children:"Go Lang"})," server implementation. Here we can see that the performance of WebSockets, WebRTC and WebTransport are comparable:"]}),"\n",(0,t.jsx)("center",{children:(0,t.jsx)("a",{href:"https://github.com/Sh3b0/realtime-web?tab=readme-ov-file#demos",target:"_blank",children:(0,t.jsx)("img",{src:"../files/websocket-webrtc-webtransport-performance.png",alt:"WebSocket WebRTC WebTransport Performance",width:"360"})})}),"\n",(0,t.jsx)(n.admonition,{type:"note",children:(0,t.jsx)(n.p,{children:"Remember that WebTransport is a pretty new technology based on the also new HTTP/3 protocol. In the future (after March 2024) there might be more performance optimizations. Also WebTransport is optimized to use less power which metric is not tested."})}),"\n",(0,t.jsx)(n.p,{children:"Lets also compare the Latency, the throughput and the scalability:"}),"\n",(0,t.jsx)(n.h3,{id:"latency",children:"Latency"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"WebSockets"}),": Offers the lowest latency due to its full-duplex communication over a single, persistent connection. Ideal for real-time applications where immediate data exchange is critical."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Server-Sent Events"}),": Also provides low latency for server-to-client communication but cannot natively send messages back to the server without additional HTTP requests."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Long-Polling"}),": Incurs higher latency as it relies on establishing new HTTP connections for each data transmission, making it less efficient for real-time updates. Also it can occur that the server wants to send an event when the client is still in the process of opening a new connection. In these cases the latency would be significantly larger."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"WebTransport"}),": Promises to offer low latency similar to WebSockets, with the added benefits of leveraging the HTTP/3 protocol for more efficient multiplexing and congestion control."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"throughput",children:"Throughput"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"WebSockets"}),": Capable of high throughput due to its persistent connection, but throughput can suffer from ",(0,t.jsx)(n.a,{href:"https://chromestatus.com/feature/5189728691290112",children:"backpressure"})," where the client cannot process data as fast as the server is capable of sending it."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Server-Sent Events"}),": Efficient for broadcasting messages to many clients with less overhead than WebSockets, leading to potentially higher throughput for unidirectional server-to-client communication."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Long-Polling"}),": Generally offers lower throughput due to the overhead of frequently opening and closing connections, which consumes more server resources."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"WebTransport"}),": Expected to support high throughput for both unidirectional and bidirectional streams within a single connection, outperforming WebSockets in scenarios requiring multiple streams."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"scalability-and-server-load",children:"Scalability and Server Load"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"WebSockets"}),": Maintaining a large number of WebSocket connections can significantly increase server load, potentially affecting scalability for applications with many users."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Server-Sent Events"}),': More scalable for scenarios that primarily require updates from server to client, as it uses less connection overhead than WebSockets because it uses "normal" HTTP request without things like ',(0,t.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/HTTP/Protocol_upgrade_mechanism",children:"protocol updates"})," that have to be run with WebSockets."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Long-Polling"}),": The least scalable due to the high server load generated by frequent connection establishment, making it suitable only as a fallback mechanism."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"WebTransport"}),": Designed to be highly scalable, benefiting from HTTP/3's efficiency in handling connections and streams, potentially reducing server load compared to WebSockets and SSE."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"recommendations-and-use-case-suitability",children:"Recommendations and Use-Case Suitability"}),"\n",(0,t.jsxs)(n.p,{children:["In the landscape of server-client communication technologies, each has its distinct advantages and use case suitability. ",(0,t.jsx)(n.strong,{children:"Server-Sent Events"})," (SSE) emerge as the most straightforward option to implement, leveraging the same HTTP/S protocols as traditional web requests, thereby circumventing corporate firewall restrictions and other technical problems that can appear with other protocols. They are easily integrated into Node.js and other server frameworks, making them an ideal choice for applications requiring frequent server-to-client updates, such as news feeds, stock tickers, and live event streaming."]}),"\n",(0,t.jsxs)(n.p,{children:["On the other hand, ",(0,t.jsx)(n.strong,{children:"WebSockets"})," excel in scenarios demanding ongoing, two-way communication. Their ability to support continuous interaction makes them the prime choice for browser games, chat applications, and live sports updates."]}),"\n",(0,t.jsxs)(n.p,{children:["However, ",(0,t.jsx)(n.strong,{children:"WebTransport"}),", despite its potential, faces adoption challenges. It is not widely supported by server frameworks ",(0,t.jsx)(n.a,{href:"https://github.com/w3c/webtransport/issues/511",children:"including Node.js"})," and lacks compatibility with ",(0,t.jsx)(n.a,{href:"https://caniuse.com/webtransport",children:"safari"}),". Moreover, its reliance on HTTP/3 further limits its immediate applicability because many WebServers like nginx only have ",(0,t.jsx)(n.a,{href:"https://nginx.org/en/docs/quic.html",children:"experimental"})," HTTP/3 support. While promising for future applications with its support for both reliable and unreliable data transmission, WebTransport is not yet a viable option for most use cases."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Long-Polling"}),", once a common technique, is now largely outdated due to its inefficiency and the high overhead of repeatedly establishing new HTTP connections. Although it may serve as a fallback in environments lacking support for WebSockets or SSE, its use is generally discouraged due to significant performance limitations."]}),"\n",(0,t.jsx)(n.h2,{id:"known-problems",children:"Known Problems"}),"\n",(0,t.jsx)(n.p,{children:"For all of the realtime streaming technologies, there are known problems. When you build anything on top of them, keep these in mind."}),"\n",(0,t.jsx)(n.h3,{id:"a-client-can-miss-out-events-when-reconnecting",children:"A client can miss out events when reconnecting"}),"\n",(0,t.jsx)(n.p,{children:"When a client is connecting, reconnecting or offline, it can miss out events that happened on the server but could not be streamed to the client.\nThis missed out events are not relevant when the server is streaming the full content each time anyway, like on a live updating stock ticker.\nBut when the backend is made to stream partial results, you have to account for missed out events. Fixing that on the backend scales pretty bad because the backend would have to remember for each client which events have been successfully send already. Instead this should be implemented with client side logic."}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.a,{href:"/replication.html",children:"RxDB Sync Engine"})," for example uses two modes of operation for that. One is the ",(0,t.jsx)(n.a,{href:"/replication.html#checkpoint-iteration",children:"checkpoint iteration mode"})," where normal http requests are used to iterate over backend data, until the client is in sync again. Then it can switch to ",(0,t.jsx)(n.a,{href:"/replication.html#event-observation",children:"event observation mode"})," where updates from the realtime-stream are used to keep the client in sync. Whenever a client disconnects or has any error, the replication shortly switches to ",(0,t.jsx)(n.a,{href:"/replication.html#checkpoint-iteration",children:"checkpoint iteration mode"})," until the client is in sync again. This method accounts for missed out events and ensures that clients can always sync to the exact equal state of the server."]}),"\n",(0,t.jsx)(n.h3,{id:"company-firewalls-can-cause-problems",children:"Company firewalls can cause problems"}),"\n",(0,t.jsx)(n.p,{children:"There are many known problems with company infrastructure when using any of the streaming technologies. Proxies and firewall can block traffic or unintentionally break requests and responses. Whenever you implement a realtime app in such an infrastructure, make sure you first test out if the technology itself works for you."}),"\n",(0,t.jsx)(n.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Check out the ",(0,t.jsx)(n.a,{href:"https://news.ycombinator.com/item?id=39745993",children:"hackernews discussion of this article"})]}),"\n",(0,t.jsxs)(n.li,{children:["Shared/Like my ",(0,t.jsx)(n.a,{href:"https://twitter.com/rxdbjs/status/1769507055298064818",children:"announcement tweet"})]}),"\n",(0,t.jsxs)(n.li,{children:["Learn how to use Server-Sent-Events to ",(0,t.jsx)(n.a,{href:"/replication-http.html#pullstream-for-ongoing-changes",children:"replicate a client side RxDB database with your backend"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Learn how to use RxDB with the ",(0,t.jsx)(n.a,{href:"/quickstart.html",children:"RxDB Quickstart"})]}),"\n",(0,t.jsxs)(n.li,{children:["Check out the ",(0,t.jsx)(n.a,{href:"https://github.com/pubkey/rxdb",children:"RxDB github repo"})," and leave a star \u2b50"]}),"\n"]})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/51038524.bb23a7bd.js b/docs/assets/js/51038524.bb23a7bd.js deleted file mode 100644 index 2eb7611f7b0..00000000000 --- a/docs/assets/js/51038524.bb23a7bd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[4889],{952(e,r,s){s.r(r),s.d(r,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>i,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"rx-storage-memory-mapped","title":"Blazing-Fast Memory Mapped RxStorage","description":"Boost your app\'s performance with Memory Mapped RxStorage. Query and write in-memory while seamlessly persisting data to your chosen storage.","source":"@site/docs/rx-storage-memory-mapped.md","sourceDirName":".","slug":"/rx-storage-memory-mapped.html","permalink":"/rx-storage-memory-mapped.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Blazing-Fast Memory Mapped RxStorage","slug":"rx-storage-memory-mapped.html","description":"Boost your app\'s performance with Memory Mapped RxStorage. Query and write in-memory while seamlessly persisting data to your chosen storage."},"sidebar":"tutorialSidebar","previous":{"title":"SharedWorker RxStorage \ud83d\udc51","permalink":"/rx-storage-shared-worker.html"},"next":{"title":"Sharding \ud83d\udc51","permalink":"/rx-storage-sharding.html"}}');var a=s(4848),o=s(8453);const i={title:"Blazing-Fast Memory Mapped RxStorage",slug:"rx-storage-memory-mapped.html",description:"Boost your app's performance with Memory Mapped RxStorage. Query and write in-memory while seamlessly persisting data to your chosen storage."},t="Memory Mapped RxStorage",l={},d=[{value:"Pros",id:"pros",level:2},{value:"Cons",id:"cons",level:2},{value:"Using the Memory-Mapped RxStorage",id:"using-the-memory-mapped-rxstorage",level:2},{value:"Multi-Tab Support",id:"multi-tab-support",level:2},{value:"Encryption of the persistent data",id:"encryption-of-the-persistent-data",level:2},{value:"Await Write Persistence",id:"await-write-persistence",level:2},{value:"Block Size Limit",id:"block-size-limit",level:2}];function c(e){const r={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(r.header,{children:(0,a.jsx)(r.h1,{id:"memory-mapped-rxstorage",children:"Memory Mapped RxStorage"})}),"\n",(0,a.jsxs)(r.p,{children:["The memory mapped ",(0,a.jsx)(r.a,{href:"/rx-storage.html",children:"RxStorage"})," is a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance is kept persistent with a given underlying storage."]}),"\n",(0,a.jsx)(r.h2,{id:"pros",children:"Pros"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsx)(r.li,{children:"Improves read/write performance because these operations run against the in-memory storage."}),"\n",(0,a.jsx)(r.li,{children:"Decreases initial page load because it load all data in a single bulk request. It even detects if the database is used for the first time and then it does not have to await the creation of the persistent storage."}),"\n",(0,a.jsx)(r.li,{children:"Can store encrypted data on disc while still being able to run queries on the non-encrypted in-memory state."}),"\n"]}),"\n",(0,a.jsx)(r.h2,{id:"cons",children:"Cons"}),"\n",(0,a.jsxs)(r.ul,{children:["\n",(0,a.jsx)(r.li,{children:"It does not support attachments because storing big attachments data in-memory should not be done."}),"\n",(0,a.jsxs)(r.li,{children:["When the JavaScript process is killed ungracefully like when the browser crashes or the power of the PC is terminated, it might happen that some memory writes are not persisted to the parent storage. This can be prevented with the ",(0,a.jsx)(r.code,{children:"awaitWritePersistence"})," flag."]}),"\n",(0,a.jsx)(r.li,{children:"The memory-mapped storage can only be used if all data fits into the memory of the JavaScript process. This is normally not a problem because a browser has much memory these days and plain JSON document data is not that big."}),"\n",(0,a.jsxs)(r.li,{children:["Because it has to await an initial data loading from the parent storage into the memory, initial page load time can increase when much data is already stored. This is likely not a problem when you store less than ",(0,a.jsx)(r.code,{children:"10k"})," documents."]}),"\n",(0,a.jsxs)(r.li,{children:["The ",(0,a.jsx)(r.code,{children:"memory-mapped"})," storage is part of ",(0,a.jsx)(r.a,{href:"/premium/",children:"RxDB Premium \ud83d\udc51"}),". It is not part of the default RxDB core module."]}),"\n"]}),"\n",(0,a.jsx)(r.h2,{id:"using-the-memory-mapped-rxstorage",children:"Using the Memory-Mapped RxStorage"}),"\n",(0,a.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,a.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageIndexedDB"})}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-indexeddb'"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" getMemoryMappedRxStorage"})}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-memory-mapped'"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" * Here we use the IndexedDB RxStorage as persistence storage."})}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" * Any other RxStorage can also be used."})}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" parentStorage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"// wrap the persistent storage with the memory-mapped storage."})}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getMemoryMappedRxStorage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" parentStorage"})]}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"// create the RxDatabase like you would do with any other RxStorage"})}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myDatabase,"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"/** ... **/"})})]})})}),"\n",(0,a.jsx)(r.h2,{id:"multi-tab-support",children:"Multi-Tab Support"}),"\n",(0,a.jsxs)(r.p,{children:["By how the memory-mapped storage works, it is not possible to have the same storage open in multiple JavaScript processes. So when you use this in a browser application, you can not open multiple databases when the app is used in multiple browser tabs.\nTo solve this, use the ",(0,a.jsx)(r.a,{href:"/rx-storage-shared-worker.html",children:"SharedWorker Plugin"})," so that the memory-mapped storage runs inside of a SharedWorker exactly once and is then reused for all browser tabs."]}),"\n",(0,a.jsx)(r.p,{children:"If you have a single JavaScript process, like in a React Native app, you do not have to care about this and can just use the memory-mapped storage in the main process."}),"\n",(0,a.jsx)(r.h2,{id:"encryption-of-the-persistent-data",children:"Encryption of the persistent data"}),"\n",(0,a.jsxs)(r.p,{children:["Normally RxDB is not capable of running queries on encrypted fields. But when you use the memory-mapped RxStorage, you can store the document data encrypted on disc, while being able to run queries on the not encrypted in-memory state. Make sure you use the encryption storage wrapper around the persistent storage, ",(0,a.jsx)(r.strong,{children:"NOT"})," around the memory-mapped storage as a whole."]}),"\n",(0,a.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,a.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageIndexedDB"})}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-indexeddb'"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" getMemoryMappedRxStorage"})}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-memory-mapped'"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { wrappedKeyEncryptionWebCryptoStorage } "}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/encryption-web-crypto'"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getMemoryMappedRxStorage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" wrappedKeyEncryptionWebCryptoStorage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myDatabase,"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"/** ... **/"})})]})})}),"\n",(0,a.jsx)(r.h2,{id:"await-write-persistence",children:"Await Write Persistence"}),"\n",(0,a.jsxs)(r.p,{children:["Running operations on the memory-mapped storage by default returns directly when the operation has run on the in-memory state and then persist changes in the background.\nSometimes you might want to ensure write operations is persisted, you can do this by setting ",(0,a.jsx)(r.code,{children:"awaitWritePersistence: true"}),"."]}),"\n",(0,a.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,a.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getMemoryMappedRxStorage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" awaitWritePersistence"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(r.h2,{id:"block-size-limit",children:"Block Size Limit"}),"\n",(0,a.jsxs)(r.p,{children:["During cleanup, the memory-mapped storage will merge many small write-blocks into single big blocks for better initial load performance.\nThe ",(0,a.jsx)(r.code,{children:"blockSizeLimit"})," defines the maximum of how many documents get stored in a single block. The default is ",(0,a.jsx)(r.code,{children:"10000"}),"."]}),"\n",(0,a.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,a.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getMemoryMappedRxStorage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" blockSizeLimit"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" 1000"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(r.span,{"data-line":"",children:[(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,a.jsx)(r.span,{"data-line":"",children:(0,a.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})})]})}function h(e={}){const{wrapper:r}={...(0,o.R)(),...e.components};return r?(0,a.jsx)(r,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},8453(e,r,s){s.d(r,{R:()=>i,x:()=>t});var n=s(6540);const a={},o=n.createContext(a);function i(e){const r=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function t(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),n.createElement(o.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/51334108.2284fc7c.js b/docs/assets/js/51334108.2284fc7c.js deleted file mode 100644 index 60cfd3a332a..00000000000 --- a/docs/assets/js/51334108.2284fc7c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[8926],{6996(e,a,i){i.r(a),i.d(a,{assets:()=>l,contentTitle:()=>r,default:()=>p,frontMatter:()=>o,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"articles/mobile-database","title":"Real-Time & Offline - RxDB for Mobile Apps","description":"Explore RxDB as your reliable mobile database. Enjoy offline-first capabilities, real-time sync, and seamless integration for hybrid app development.","source":"@site/docs/articles/mobile-database.md","sourceDirName":"articles","slug":"/articles/mobile-database.html","permalink":"/articles/mobile-database.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Real-Time & Offline - RxDB for Mobile Apps","slug":"mobile-database.html","description":"Explore RxDB as your reliable mobile database. Enjoy offline-first capabilities, real-time sync, and seamless integration for hybrid app development."},"sidebar":"tutorialSidebar","previous":{"title":"Using localStorage in Modern Applications - A Comprehensive Guide","permalink":"/articles/localstorage.html"},"next":{"title":"RxDB as a Database for Progressive Web Apps (PWA)","permalink":"/articles/progressive-web-app-database.html"}}');var n=i(4848),s=i(8453);const o={title:"Real-Time & Offline - RxDB for Mobile Apps",slug:"mobile-database.html",description:"Explore RxDB as your reliable mobile database. Enjoy offline-first capabilities, real-time sync, and seamless integration for hybrid app development."},r="Mobile Database - RxDB as Database for Mobile Applications",l={},d=[{value:"Understanding Mobile Databases",id:"understanding-mobile-databases",level:2},{value:"Introducing RxDB: A Paradigm Shift in Mobile Database Solutions",id:"introducing-rxdb-a-paradigm-shift-in-mobile-database-solutions",level:2},{value:"Use Cases for RxDB in Hybrid App Development",id:"use-cases-for-rxdb-in-hybrid-app-development",level:2},{value:"Conclusion",id:"conclusion",level:2}];function c(e){const a={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.header,{children:(0,n.jsx)(a.h1,{id:"mobile-database---rxdb-as-database-for-mobile-applications",children:"Mobile Database - RxDB as Database for Mobile Applications"})}),"\n",(0,n.jsxs)(a.p,{children:["In today's digital landscape, mobile applications have become an integral part of our lives. From social media platforms to e-commerce solutions, mobile apps have transformed the way we interact with digital services. At the heart of any mobile app lies the database, a critical component responsible for storing, retrieving, and managing data efficiently. In this article, we will delve into the world of mobile databases, exploring their significance, challenges, and the emergence of ",(0,n.jsx)(a.a,{href:"https://rxdb.info/",children:"RxDB"})," as a powerful database solution for hybrid app development in frameworks like React Native and Capacitor."]}),"\n",(0,n.jsx)(a.h2,{id:"understanding-mobile-databases",children:"Understanding Mobile Databases"}),"\n",(0,n.jsx)(a.p,{children:"Mobile databases are specialized software systems designed to handle data storage and management for mobile applications. These databases are optimized for the unique requirements of mobile environments, which often include limited device resources, fluctuations in network connectivity, and the need for offline functionality."}),"\n",(0,n.jsxs)(a.p,{children:["There are various types of mobile databases available, each with its own strengths and use cases. Local databases, such as SQLite and Realm, reside directly on the user's device, providing offline capabilities and faster data access. Cloud-based databases, like ",(0,n.jsx)(a.a,{href:"/articles/realtime-database.html",children:"Firebase Realtime Database"})," and Amazon DynamoDB, rely on remote servers to store and retrieve data, enabling synchronization across multiple devices. Hybrid databases, as the name suggests, combine the benefits of both local and cloud-based approaches, offering a balance between offline functionality and data synchronization."]}),"\n",(0,n.jsx)(a.h2,{id:"introducing-rxdb-a-paradigm-shift-in-mobile-database-solutions",children:"Introducing RxDB: A Paradigm Shift in Mobile Database Solutions"}),"\n",(0,n.jsx)("center",{children:(0,n.jsx)("a",{href:"https://rxdb.info/",children:(0,n.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"Mobile Database",width:"220"})})}),"\n",(0,n.jsxs)(a.p,{children:[(0,n.jsx)(a.a,{href:"https://rxdb.info/",children:"RxDB"}),", also known as Reactive Database, has emerged as a game-changer in the realm of mobile databases. Built on top of popular web technologies like JavaScript, TypeScript, and RxJS (Reactive Extensions for JavaScript), RxDB provides an elegant solution for seamless offline-first capabilities and real-time data synchronization in mobile applications."]}),"\n",(0,n.jsx)(a.p,{children:"Benefits of RxDB for Hybrid App Development"}),"\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Offline-First Approach: One of the major advantages of RxDB is its ability to work in an offline mode. It allows mobile applications to store and access data locally, ensuring uninterrupted functionality even when the network connection is weak or unavailable. The database automatically syncs the data with the server once the connection is reestablished, guaranteeing data consistency."}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsxs)(a.p,{children:[(0,n.jsx)(a.a,{href:"/replication.html",children:"Real-Time Data Synchronization"}),": RxDB leverages the power of real-time data synchronization, making it an excellent choice for applications that require collaborative features or live updates. It uses the concept of change streams to detect modifications made to the database and instantly propagates those changes across connected devices. This real-time synchronization enables seamless collaboration and enhances user experience."]}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Reactive Programming Paradigm: RxDB embraces the principles of reactive programming, which simplifies the development process by handling asynchronous events and data streams. By leveraging RxJS observables, developers can write concise, declarative code that reacts to changes in data, ensuring a highly responsive user experience. The reactive programming paradigm enhances code maintainability, scalability, and testability."}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsxs)(a.p,{children:["Easy Integration with Hybrid App Frameworks: RxDB seamlessly integrates with popular hybrid app development frameworks like ",(0,n.jsx)(a.a,{href:"/react-native-database.html",children:"React Native"})," and ",(0,n.jsx)(a.a,{href:"/capacitor-database.html",children:"Capacitor"}),". This compatibility allows developers to leverage the existing ecosystem and tools of these frameworks, making the transition to RxDB smoother and more efficient. By utilizing RxDB within these frameworks, developers can harness the power of a robust database solution without sacrificing the advantages of hybrid app development."]}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Cross-Platform Support: RxDB enables developers to build cross-platform mobile applications that run seamlessly on both iOS and Android devices. This versatility eliminates the need for separate database implementations for different platforms, saving development time and effort. With RxDB, developers can focus on building a unified codebase and delivering a consistent user experience across platforms."}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(a.h2,{id:"use-cases-for-rxdb-in-hybrid-app-development",children:"Use Cases for RxDB in Hybrid App Development"}),"\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsxs)(a.p,{children:[(0,n.jsx)(a.a,{href:"/offline-first.html",children:"Offline-First Applications"}),": ",(0,n.jsx)(a.a,{href:"https://rxdb.info/",children:"RxDB"})," is an ideal choice for applications that heavily rely on offline functionality. Whether it's a note-taking app, a task manager, or a survey application, RxDB ensures that users can continue working even when connectivity is compromised. The seamless synchronization capabilities of RxDB ensure that changes made offline are automatically propagated once the device reconnects to the internet."]}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Real-Time Collaboration: Applications that require real-time collaboration, such as messaging platforms or collaborative editing tools, can greatly benefit from RxDB. The real-time synchronization capabilities enable multiple users to work on the same data simultaneously, ensuring that everyone sees the latest updates in real-time."}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Data-Intensive Applications: RxDB's performance and scalability make it suitable for data-intensive applications that handle large datasets or complex data structures. Whether it's a media-rich app, a data visualization tool, or an analytics platform, RxDB can handle the heavy lifting and provide a smooth user experience."}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Cross-Platform Applications: Hybrid app frameworks like React Native and Capacitor have gained popularity due to their ability to build cross-platform applications. By utilizing RxDB within these frameworks, developers can create a unified codebase that runs seamlessly on both iOS and Android, significantly reducing development time and effort."}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(a.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,n.jsx)(a.p,{children:"Mobile databases play a vital role in the performance and functionality of mobile applications. RxDB, with its offline-first approach, real-time data synchronization, and seamless integration with hybrid app development frameworks like React Native and Capacitor, offers a robust solution for managing data in mobile apps. By leveraging the power of reactive programming, RxDB empowers developers to build highly responsive, scalable, and cross-platform applications that deliver an exceptional user experience. With its versatility and ease of use, RxDB is undoubtedly a database solution worth considering for hybrid app development. Embrace the power of RxDB and unlock the full potential of your mobile applications."})]})}function p(e={}){const{wrapper:a}={...(0,s.R)(),...e.components};return a?(0,n.jsx)(a,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453(e,a,i){i.d(a,{R:()=>o,x:()=>r});var t=i(6540);const n={},s=t.createContext(n);function o(e){const a=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function r(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),t.createElement(s.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/5134b15f.c48f7dbd.js b/docs/assets/js/5134b15f.c48f7dbd.js deleted file mode 100644 index 972d148b295..00000000000 --- a/docs/assets/js/5134b15f.c48f7dbd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[10],{4066(a,e,t){t.r(e),t.d(e,{default:()=>r});var i=t(544),s=t(4848);function r(){return(0,i.default)({sem:{id:"gads",title:(0,s.jsxs)(s.Fragment,{children:["The easiest way to ",(0,s.jsx)("b",{children:"store"})," and ",(0,s.jsx)("b",{children:"sync"})," Data in Capacitor"]}),appName:"Capacitor",iconUrl:"/files/icons/capacitor.svg",metaTitle:"Capacitor Database"}})}}}]); \ No newline at end of file diff --git a/docs/assets/js/55a5b596.49b70407.js b/docs/assets/js/55a5b596.49b70407.js deleted file mode 100644 index f058e2a2207..00000000000 --- a/docs/assets/js/55a5b596.49b70407.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[6717],{4557(s,e,n){n.r(e),n.d(e,{assets:()=>t,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"rx-schema","title":"Design Perfect Schemas in RxDB","description":"Learn how to define, secure, and validate your data in RxDB. Master primary keys, indexes, encryption, and more with the RxSchema approach.","source":"@site/docs/rx-schema.md","sourceDirName":".","slug":"/rx-schema.html","permalink":"/rx-schema.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Design Perfect Schemas in RxDB","slug":"rx-schema.html","description":"Learn how to define, secure, and validate your data in RxDB. Master primary keys, indexes, encryption, and more with the RxSchema approach."},"sidebar":"tutorialSidebar","previous":{"title":"RxDatabase","permalink":"/rx-database.html"},"next":{"title":"RxCollection","permalink":"/rx-collection.html"}}');var i=n(4848),o=n(8453);const a={title:"Design Perfect Schemas in RxDB",slug:"rx-schema.html",description:"Learn how to define, secure, and validate your data in RxDB. Master primary keys, indexes, encryption, and more with the RxSchema approach."},l="RxSchema",t={},c=[{value:"Example",id:"example",level:2},{value:"Create a collection with the schema",id:"create-a-collection-with-the-schema",level:2},{value:"version",id:"version",level:2},{value:"primaryKey",id:"primarykey",level:2},{value:"composite primary key",id:"composite-primary-key",level:3},{value:"Indexes",id:"indexes",level:2},{value:"Index-example",id:"index-example",level:3},{value:"attachments",id:"attachments",level:2},{value:"default",id:"default",level:2},{value:"final",id:"final",level:2},{value:"Non allowed properties",id:"non-allowed-properties",level:2},{value:"FAQ",id:"faq",level:2}];function d(s){const e={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...s.components},{Details:n}=e;return n||function(s,e){throw new Error("Expected "+(e?"component":"object")+" `"+s+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(e.header,{children:(0,i.jsx)(e.h1,{id:"rxschema",children:"RxSchema"})}),"\n",(0,i.jsxs)(e.p,{children:["Schemas define the structure of the documents of a collection. Which field should be used as primary, which fields should be used as indexes and what should be encrypted. Every collection has its own schema. With RxDB, schemas are defined with the ",(0,i.jsx)(e.a,{href:"https://json-schema.org/blog/posts/rxdb-case-study",children:"jsonschema"}),"-standard which you might know from other projects."]}),"\n",(0,i.jsx)(e.h2,{id:"example",children:"Example"}),"\n",(0,i.jsx)(e.p,{children:"In this example-schema we define a hero-collection with the following settings:"}),"\n",(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsx)(e.li,{children:"the version-number of the schema is 0"}),"\n",(0,i.jsxs)(e.li,{children:["the name-property is the ",(0,i.jsx)(e.strong,{children:"primaryKey"}),". This means its a unique, indexed, required ",(0,i.jsx)(e.code,{children:"string"})," which can be used to definitely find a single document."]}),"\n",(0,i.jsx)(e.li,{children:"the color-field is required for every document"}),"\n",(0,i.jsx)(e.li,{children:"the healthpoints-field must be a number between 0 and 100"}),"\n",(0,i.jsx)(e.li,{children:"the secret-field stores an encrypted value"}),"\n",(0,i.jsx)(e.li,{children:"the birthyear-field is final which means it is required and cannot be changed"}),"\n",(0,i.jsx)(e.li,{children:"the skills-attribute must be an array with objects which contain the name and the damage-attribute. There is a maximum of 5 skills per hero."}),"\n",(0,i.jsx)(e.li,{children:"Allows adding attachments and store them encrypted"}),"\n"]}),"\n",(0,i.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"json","data-theme":"css-variables",children:(0,i.jsxs)(e.code,{"data-language":"json","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "title"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "hero schema"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "version"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "description"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "describes a simple hero"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "primaryKey"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "name"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "type"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "object"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "properties"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "name"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "type"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "string"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "maxLength"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- the primary key must have set maxLength"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "color"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "type"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "string"'})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "healthpoints"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "type"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "number"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "minimum"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "maximum"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "secret"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "type"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "string"'})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "birthyear"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "type"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "number"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "final"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "minimum"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 1900"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "maximum"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 2050"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "skills"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "type"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "array"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "maxItems"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 5"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "uniqueItems"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "items"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "type"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "object"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "properties"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "name"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "type"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "string"'})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "damage"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "type"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "number"'})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "required"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "name"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "color"'})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ]"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "encrypted"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"secret"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"]"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "attachments"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "encrypted"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"})})]})})}),"\n",(0,i.jsx)(e.h2,{id:"create-a-collection-with-the-schema",children:"Create a collection with the schema"}),"\n",(0,i.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,i.jsxs)(e.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" heroes"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" myHeroSchema"})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"myDatabase"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:".name);"})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// heroes"})})]})})}),"\n",(0,i.jsx)(e.h2,{id:"version",children:"version"}),"\n",(0,i.jsxs)(e.p,{children:["The ",(0,i.jsx)(e.code,{children:"version"})," field is a number, starting with ",(0,i.jsx)(e.code,{children:"0"}),".\nWhen the version is greater than 0, you have to provide the migrationStrategies to create a collection with this schema."]}),"\n",(0,i.jsx)(e.h2,{id:"primarykey",children:"primaryKey"}),"\n",(0,i.jsxs)(e.p,{children:["The ",(0,i.jsx)(e.code,{children:"primaryKey"})," field contains the fieldname of the property that will be used as primary key for the whole collection.\nThe value of the primary key of the document must be a ",(0,i.jsx)(e.code,{children:"string"}),", unique, final and is required."]}),"\n",(0,i.jsx)(e.h3,{id:"composite-primary-key",children:"composite primary key"}),"\n",(0,i.jsx)(e.p,{children:"You can define a composite primary key which gets composed from multiple properties of the document data."}),"\n",(0,i.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,i.jsxs)(e.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" mySchema"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" keyCompression"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // set this to true, to enable the keyCompression"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'human schema with composite primary'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // where should the composed string be stored"})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" key"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // fields that will be used to create the composed key"})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" fields"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'firstName'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'lastName'"})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ]"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // separator which is used to concat the fields values."})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" separator"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '|'"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- the primary key must have set maxLength"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" firstName"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" lastName"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" "})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'firstName'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'lastName'"})}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,i.jsx)(e.p,{children:"You can then find a document by using the relevant parts to create the composite primaryKey:"}),"\n",(0,i.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(e.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// inserting with composite primary"})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxCollection"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // id, <- do not set the id, it will be filled by RxDB"})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" firstName"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foo'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" lastName"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bar'"})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:"// find by composite primary"})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" id"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxCollection"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"schema"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".getPrimaryOfDocumentData"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" firstName"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foo'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" lastName"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bar'"})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDocument"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxCollection"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"(id)"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:" "})]})})}),"\n",(0,i.jsx)(e.h2,{id:"indexes",children:"Indexes"}),"\n",(0,i.jsx)(e.p,{children:"RxDB supports secondary indexes which are defined at the schema-level of the collection."}),"\n",(0,i.jsxs)(e.p,{children:["Index is only allowed on field types ",(0,i.jsx)(e.code,{children:"string"}),", ",(0,i.jsx)(e.code,{children:"integer"})," and ",(0,i.jsx)(e.code,{children:"number"}),". Some RxStorages allow to use ",(0,i.jsx)(e.code,{children:"boolean"})," fields as index."]}),"\n",(0,i.jsxs)(e.p,{children:["Depending on the field type, you must have set some meta attributes like ",(0,i.jsx)(e.code,{children:"maxLength"})," or ",(0,i.jsx)(e.code,{children:"minimum"}),". This is required so that RxDB\nis able to know the maximum string representation length of a field, which is needed to craft custom indexes on several ",(0,i.jsx)(e.code,{children:"RxStorage"})," implementations."]}),"\n",(0,i.jsx)(e.admonition,{type:"note",children:(0,i.jsxs)(e.p,{children:["RxDB will always append the ",(0,i.jsx)(e.code,{children:"primaryKey"})," to all indexes to ensure a deterministic sort order of query results. You do not have to add the ",(0,i.jsx)(e.code,{children:"primaryKey"})," to any index."]})}),"\n",(0,i.jsx)(e.h3,{id:"index-example",children:"Index-example"}),"\n",(0,i.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,i.jsxs)(e.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" schemaWithIndexes"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'human schema with indexes'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" keyCompression"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- the primary key must have set maxLength"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" firstName"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- string-fields that are used as an index, must have set maxLength."})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" lastName"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" active"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'boolean'"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" familyName"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" balance"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'number'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // number fields that are used in an index, must have set minimum, maximum and multipleOf"})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" minimum"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" maximum"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 100000"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" multipleOf"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 0.01"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" creditCards"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'array'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" items"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" cvc"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'number'"})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" } "})}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'active'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- boolean fields that are used in an index, must be required. "})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ]"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" indexes"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'firstName'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- this will create a simple index for the `firstName` field"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'active'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'firstName'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"]"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- this will create a compound-index for these two fields"})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'active'"})}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,i.jsx)(e.h1,{id:"internalindexes",children:"internalIndexes"}),"\n",(0,i.jsxs)(e.p,{children:["When you use RxDB on the server-side, you might want to use internalIndexes to speed up internal queries. ",(0,i.jsx)(e.a,{href:"/rx-server.html#server-only-indexes",children:"Read more"})]}),"\n",(0,i.jsx)(e.h2,{id:"attachments",children:"attachments"}),"\n",(0,i.jsxs)(e.p,{children:["To use attachments in the collection, you have to add the ",(0,i.jsx)(e.code,{children:"attachments"}),"-attribute to the schema. ",(0,i.jsx)(e.a,{href:"/rx-attachment.html",children:"See RxAttachment"}),"."]}),"\n",(0,i.jsx)(e.h2,{id:"default",children:"default"}),"\n",(0,i.jsx)(e.p,{children:"Default values can only be defined for first-level fields.\nWhenever you insert a document unset fields will be filled with default-values."}),"\n",(0,i.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,i.jsxs)(e.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" schemaWithDefaultAge"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- the primary key must have set maxLength"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" firstName"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" lastName"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'integer'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" default"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 20"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- default will be used"})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'id'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,i.jsx)(e.h2,{id:"final",children:"final"}),"\n",(0,i.jsxs)(e.p,{children:["By setting a field to ",(0,i.jsx)(e.code,{children:"final"}),", you make sure it cannot be modified later. Final fields are always required.\nFinal fields cannot be observed because they will not change."]}),"\n",(0,i.jsx)(e.p,{children:"Advantages:"}),"\n",(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsx)(e.li,{children:"With final fields you can ensure that no-one accidentally modifies the data."}),"\n",(0,i.jsxs)(e.li,{children:["When you enable the ",(0,i.jsx)(e.code,{children:"eventReduce"})," algorithm, some performance-improvements are done."]}),"\n"]}),"\n",(0,i.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,i.jsxs)(e.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" schemaWithFinalAge"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- the primary key must have set maxLength"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" firstName"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" lastName"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'integer'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" final"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'id'"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,i.jsx)(e.h2,{id:"non-allowed-properties",children:"Non allowed properties"}),"\n",(0,i.jsxs)(e.p,{children:["The schema is not only used to validate objects before they are written into the database, but also used to map getters to observe and populate single fieldnames, keycompression and other things. Therefore you can not use every schema which would be valid for the spec of ",(0,i.jsx)(e.a,{href:"http://json-schema.org/",children:"json-schema.org"}),".\nFor example, fieldnames must match the regex ",(0,i.jsx)(e.code,{children:"^[a-zA-Z][[a-zA-Z0-9_]*]?[a-zA-Z0-9]$"})," and ",(0,i.jsx)(e.code,{children:"additionalProperties"})," is always set to ",(0,i.jsx)(e.code,{children:"false"}),". But don't worry, RxDB will instantly throw an error when you pass an invalid schema into it."]}),"\n",(0,i.jsxs)(e.p,{children:["Also the following class properties of ",(0,i.jsx)(e.code,{children:"RxDocument"})," cannot be used as top level fields because they would clash when the RxDocument property is accessed:"]}),"\n",(0,i.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"json","data-theme":"css-variables",children:(0,i.jsxs)(e.code,{"data-language":"json","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"["})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "collection"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "_data"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "_propertyCache"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "isInstanceOfRxDocument"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "primaryPath"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "primary"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "revision"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "deleted$"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "deleted$$"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "deleted"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "getLatest"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "$"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "$$"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "get$"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "get$$"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "populate"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "get"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "toJSON"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "toMutableJSON"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "update"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "incrementalUpdate"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "updateCRDT"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "putAttachment"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "putAttachmentBase64"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "getAttachment"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "allAttachments"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "allAttachments$"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "modify"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "incrementalModify"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "patch"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "incrementalPatch"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "_saveData"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "remove"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "incrementalRemove"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "close"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "deleted"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "synced"'})}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"]"})})]})})}),"\n",(0,i.jsx)(e.h2,{id:"faq",children:"FAQ"}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:"How can I store a Date?"}),(0,i.jsxs)("div",{children:[(0,i.jsxs)(e.p,{children:["With RxDB you can only store plain JSON data inside of a document. You cannot store a JavaScript ",(0,i.jsx)(e.code,{children:"new Date()"})," instance directly. This is for performance reasons and because ",(0,i.jsx)(e.code,{children:"Date()"})," is a mutable thing where changing it at any time might cause strange problem that are hard to debug."]}),(0,i.jsxs)(e.p,{children:["To store a date in RxDB, you have to define a string field with a ",(0,i.jsx)(e.code,{children:"format"})," attribute:"]}),(0,i.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"json","data-theme":"css-variables",children:(0,i.jsxs)(e.code,{"data-language":"json","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"{"})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "type"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "string"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:' "format"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "date-time"'})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),(0,i.jsxs)(e.p,{children:["When storing the data you have to first transform your ",(0,i.jsx)(e.code,{children:"Date"})," object into a string ",(0,i.jsx)(e.code,{children:"Date.toISOString()"}),".\nBecause the ",(0,i.jsx)(e.code,{children:"date-time"})," is sortable, you can do whatever query operations on that field and even use it as an index."]})]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:"How to store schemaless data?"}),(0,i.jsxs)("div",{children:[(0,i.jsxs)(e.p,{children:['By design, RxDB requires that every collection has a schema. This means you cannot create a truly "schema-less" collection where top-level fields are unknown at schema creation time. RxDB must know about all fields of a document at the top level to perform validation, index creation, and other internal optimizations.\nHowever, there is a way to store data of arbitrary structure at sub-fields. To do this, define a property with ',(0,i.jsx)(e.code,{children:'type: "object"'})," in your schema. For example:"]}),(0,i.jsx)(e.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(e.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(e.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"{"})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "version"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:": "}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "primaryKey"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:": "}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"id"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "type"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:": "}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"object"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "properties"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:": {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "id"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "type"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "string"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "maxLength"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "myDynamicData"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "type"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "object"'})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // Here you can store any JSON data"})}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-comment)"},children:" // because it's an open object."})}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(e.span,{"data-line":"",children:[(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "required"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:": ["}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"id"'}),(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(e.span,{"data-line":"",children:(0,i.jsx)(e.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})})]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsxs)("summary",{children:["Why does RxDB automatically set ",(0,i.jsx)(e.code,{children:"additionalProperties: false"})," at the top level"]}),(0,i.jsxs)("div",{children:[(0,i.jsxs)(e.p,{children:["RxDB automatically sets ",(0,i.jsx)(e.code,{children:"additionalProperties: false"})," at the top level of a schema to ensure that all top-level fields are known in advance. This design choice offers several benefits:"]}),(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsxs)(e.li,{children:["\n",(0,i.jsx)(e.p,{children:"Prevents collisions with RxDocument class properties:\nRxDB documents have built-in class methods (e.g., .toJSON, .save) at the top level. By forbidding unknown top-level properties, we avoid accidental naming collisions with these built-in methods."}),"\n"]}),"\n",(0,i.jsxs)(e.li,{children:["\n",(0,i.jsxs)(e.p,{children:["Avoids conflicts with user-defined ORM functions:\nDevelopers can add custom ",(0,i.jsx)(e.a,{href:"/orm.html",children:"ORM methods"})," to RxDocuments. If top-level properties were unbounded, a property name could accidentally conflict with a method name, leading to unexpected behavior."]}),"\n"]}),"\n",(0,i.jsxs)(e.li,{children:["\n",(0,i.jsxs)(e.p,{children:["Improves TypeScript typings:\nIf RxDB didn't know about all top-level fields, the document type would effectively become ",(0,i.jsx)(e.code,{children:"any"}),". That means a simple typo like ",(0,i.jsx)(e.code,{children:"myDocument.toJOSN()"})," would only be caught at runtime, not at build time. By disallowing unknown properties, TypeScript can provide strict typing and catch errors sooner."]}),"\n"]}),"\n"]})]})]}),"\n",(0,i.jsxs)(n,{children:[(0,i.jsx)("summary",{children:"Can't change the schema of a collection"}),(0,i.jsxs)("div",{children:[(0,i.jsxs)(e.p,{children:["When you make changes to the schema of a collection, you sometimes can get an error like\n",(0,i.jsx)(e.code,{children:"Error: addCollections(): another instance created this collection with a different schema"}),"."]}),(0,i.jsx)(e.p,{children:"This means you have created a collection before and added document-data to it.\nWhen you now just change the schema, it is likely that the new schema does not match the saved documents inside of the collection.\nThis would cause strange bugs and would be hard to debug, so RxDB check's if your schema has changed and throws an error."}),(0,i.jsxs)(e.p,{children:["To change the schema in ",(0,i.jsx)(e.strong,{children:"production"}),"-mode, do the following steps:"]}),(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsxs)(e.li,{children:["Increase the ",(0,i.jsx)(e.code,{children:"version"})," by 1"]}),"\n",(0,i.jsxs)(e.li,{children:["Add the appropriate ",(0,i.jsx)(e.a,{href:"https://pubkey.github.io/rxdb/migration-schema.html",children:"migrationStrategies"})," so the saved data will be modified to match the new schema"]}),"\n"]}),(0,i.jsxs)(e.p,{children:["In ",(0,i.jsx)(e.strong,{children:"development"}),"-mode, the schema-change can be simplified by ",(0,i.jsx)(e.strong,{children:"one of these"})," strategies:"]}),(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsx)(e.li,{children:"Use the memory-storage so your db resets on restart and your schema is not saved permanently"}),"\n",(0,i.jsxs)(e.li,{children:["Call ",(0,i.jsx)(e.code,{children:"removeRxDatabase('mydatabasename', RxStorage);"})," before creating a new RxDatabase-instance"]}),"\n",(0,i.jsxs)(e.li,{children:["Add a timestamp as suffix to the database-name to create a new one each run like ",(0,i.jsx)(e.code,{children:"name: 'heroesDB' + new Date().getTime()"})]}),"\n"]})]})]})]})}function h(s={}){const{wrapper:e}={...(0,o.R)(),...s.components};return e?(0,i.jsx)(e,{...s,children:(0,i.jsx)(d,{...s})}):d(s)}},8453(s,e,n){n.d(e,{R:()=>a,x:()=>l});var r=n(6540);const i={},o=r.createContext(i);function a(s){const e=r.useContext(o);return r.useMemo(function(){return"function"==typeof s?s(e):{...e,...s}},[e,s])}function l(s){let e;return e=s.disableParentContext?"function"==typeof s.components?s.components(i):s.components||i:a(s.components),r.createElement(o.Provider,{value:e},s.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/58215328.4a9061e5.js b/docs/assets/js/58215328.4a9061e5.js deleted file mode 100644 index 4c8caa3419a..00000000000 --- a/docs/assets/js/58215328.4a9061e5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[5353],{960(e,a,i){i.r(a),i.d(a,{default:()=>t});var s=i(544),n=i(4848);function t(){return(0,s.default)({sem:{id:"gads",metaTitle:"The local Database for Ionic Apps",appName:"Ionic",title:(0,n.jsxs)(n.Fragment,{children:["The easiest way to ",(0,n.jsx)("b",{children:"store"})," and ",(0,n.jsx)("b",{children:"sync"})," Data in Ionic"]}),iconUrl:"/files/icons/ionic.svg"}})}}}]); \ No newline at end of file diff --git a/docs/assets/js/5943.0ded4df5.js b/docs/assets/js/5943.0ded4df5.js deleted file mode 100644 index 68f6f5a3167..00000000000 --- a/docs/assets/js/5943.0ded4df5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[5943],{2153(e,n,t){t.d(n,{A:()=>j});t(6540);var i=t(4164),s=t(1312),a=t(7559),r=t(8774);const l="iconEdit_Z9Sw";var c=t(4848);function o({className:e,...n}){return(0,c.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,i.A)(l,e),"aria-hidden":"true",...n,children:(0,c.jsx)("g",{children:(0,c.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function d({editUrl:e}){return(0,c.jsxs)(r.A,{to:e,className:a.G.common.editThisPage,children:[(0,c.jsx)(o,{}),(0,c.jsx)(s.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}var u=t(4586);function m(e={}){const{i18n:{currentLocale:n}}=(0,u.A)(),t=function(){const{i18n:{currentLocale:e,localeConfigs:n}}=(0,u.A)();return n[e].calendar}();return new Intl.DateTimeFormat(n,{calendar:t,...e})}function h({lastUpdatedAt:e}){const n=new Date(e),t=m({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(n);return(0,c.jsx)(s.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,c.jsx)("b",{children:(0,c.jsx)("time",{dateTime:n.toISOString(),itemProp:"dateModified",children:t})})},children:" on {date}"})}function f({lastUpdatedBy:e}){return(0,c.jsx)(s.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,c.jsx)("b",{children:e})},children:" by {user}"})}function x({lastUpdatedAt:e,lastUpdatedBy:n}){return(0,c.jsxs)("span",{className:a.G.common.lastUpdated,children:[(0,c.jsx)(s.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:e?(0,c.jsx)(h,{lastUpdatedAt:e}):"",byUser:n?(0,c.jsx)(f,{lastUpdatedBy:n}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const p="lastUpdated_JAkA",v="noPrint_WFHX";function j({className:e,editUrl:n,lastUpdatedAt:t,lastUpdatedBy:s}){return(0,c.jsxs)("div",{className:(0,i.A)("row",e),children:[(0,c.jsx)("div",{className:(0,i.A)("col",v),children:n&&(0,c.jsx)(d,{editUrl:n})}),(0,c.jsx)("div",{className:(0,i.A)("col",p),children:(t||s)&&(0,c.jsx)(x,{lastUpdatedAt:t,lastUpdatedBy:s})})]})}},3230(e,n,t){t.d(n,{A:()=>s});t(6540);var i=t(4848);function s(e){return(0,i.jsx)("code",{...e})}},5195(e,n,t){t.d(n,{A:()=>x});var i=t(6540),s=t(6342);function a(e){const n=e.map(e=>({...e,parentIndex:-1,children:[]})),t=Array(7).fill(-1);n.forEach((e,n)=>{const i=t.slice(2,e.level);e.parentIndex=Math.max(...i),t[e.level]=n});const i=[];return n.forEach(e=>{const{parentIndex:t,...s}=e;t>=0?n[t].children.push(s):i.push(s)}),i}function r({toc:e,minHeadingLevel:n,maxHeadingLevel:t}){return e.flatMap(e=>{const i=r({toc:e.children,minHeadingLevel:n,maxHeadingLevel:t});return function(e){return e.level>=n&&e.level<=t}(e)?[{...e,children:i}]:i})}function l(e){const n=e.getBoundingClientRect();return n.top===n.bottom?l(e.parentNode):n}function c(e,{anchorTopOffset:n}){const t=e.find(e=>l(e).top>=n);if(t){return function(e){return e.top>0&&e.bottom{e.current=n?0:document.querySelector(".navbar").clientHeight},[n]),e}function d(e){const n=(0,i.useRef)(void 0),t=o();(0,i.useEffect)(()=>{if(!e)return()=>{};const{linkClassName:i,linkActiveClassName:s,minHeadingLevel:a,maxHeadingLevel:r}=e;function l(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(i),l=function({minHeadingLevel:e,maxHeadingLevel:n}){const t=[];for(let i=e;i<=n;i+=1)t.push(`h${i}.anchor`);return Array.from(document.querySelectorAll(t.join()))}({minHeadingLevel:a,maxHeadingLevel:r}),o=c(l,{anchorTopOffset:t.current}),d=e.find(e=>o&&o.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e));e.forEach(e=>{!function(e,t){t?(n.current&&n.current!==e&&n.current.classList.remove(s),e.classList.add(s),n.current=e):e.classList.remove(s)}(e,e===d)})}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}},[e,t])}var u=t(8774),m=t(4848);function h({toc:e,className:n,linkClassName:t,isChild:i}){return e.length?(0,m.jsx)("ul",{className:i?void 0:n,children:e.map(e=>(0,m.jsxs)("li",{children:[(0,m.jsx)(u.A,{to:`#${e.id}`,className:t??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,m.jsx)(h,{isChild:!0,toc:e.children,className:n,linkClassName:t})]},e.id))}):null}const f=i.memo(h);function x({toc:e,className:n="table-of-contents table-of-contents__left-border",linkClassName:t="table-of-contents__link",linkActiveClassName:l,minHeadingLevel:c,maxHeadingLevel:o,...u}){const h=(0,s.p)(),x=c??h.tableOfContents.minHeadingLevel,p=o??h.tableOfContents.maxHeadingLevel,v=function({toc:e,minHeadingLevel:n,maxHeadingLevel:t}){return(0,i.useMemo)(()=>r({toc:a(e),minHeadingLevel:n,maxHeadingLevel:t}),[e,n,t])}({toc:e,minHeadingLevel:x,maxHeadingLevel:p});return d((0,i.useMemo)(()=>{if(t&&l)return{linkClassName:t,linkActiveClassName:l,minHeadingLevel:x,maxHeadingLevel:p}},[t,l,x,p])),(0,m.jsx)(f,{toc:v,className:n,linkClassName:t,...u})}},6896(e,n,t){t.d(n,{A:()=>v});t(6540);var i=t(4164),s=t(1312),a=t(5260),r=t(4848);function l(){return(0,r.jsx)(s.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function c(){return(0,r.jsx)(s.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function o(){return(0,r.jsx)(a.A,{children:(0,r.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function d(){return(0,r.jsx)(s.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function u(){return(0,r.jsx)(s.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}var m=t(7559),h=t(7293);function f({className:e}){return(0,r.jsx)(h.A,{type:"caution",title:(0,r.jsx)(d,{}),className:(0,i.A)(e,m.G.common.draftBanner),children:(0,r.jsx)(u,{})})}function x({className:e}){return(0,r.jsx)(h.A,{type:"caution",title:(0,r.jsx)(l,{}),className:(0,i.A)(e,m.G.common.unlistedBanner),children:(0,r.jsx)(c,{})})}function p(e){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o,{}),(0,r.jsx)(x,{...e})]})}function v({metadata:e}){const{unlisted:n,frontMatter:t}=e;return(0,r.jsxs)(r.Fragment,{children:[(n||t.unlisted)&&(0,r.jsx)(p,{}),t.draft&&(0,r.jsx)(f,{})]})}},7293(e,n,t){t.d(n,{A:()=>B});var i=t(6540),s=t(4848);function a(e){const{mdxAdmonitionTitle:n,rest:t}=function(e){const n=i.Children.toArray(e),t=n.find(e=>i.isValidElement(e)&&"mdxAdmonitionTitle"===e.type),a=n.filter(e=>e!==t),r=t?.props.children;return{mdxAdmonitionTitle:r,rest:a.length>0?(0,s.jsx)(s.Fragment,{children:a}):null}}(e.children),a=e.title??n;return{...e,...a&&{title:a},children:t}}var r=t(4164),l=t(1312),c=t(7559);const o="admonition_xJq3",d="admonitionHeading_Gvgb",u="admonitionIcon_Rf37",m="admonitionContent_BuS1";function h({type:e,className:n,children:t}){return(0,s.jsx)("div",{className:(0,r.A)(c.G.common.admonition,c.G.common.admonitionType(e),o,n),children:t})}function f({icon:e,title:n}){return(0,s.jsxs)("div",{className:d,children:[(0,s.jsx)("span",{className:u,children:e}),n]})}function x({children:e}){return e?(0,s.jsx)("div",{className:m,children:e}):null}function p(e){const{type:n,icon:t,title:i,children:a,className:r}=e;return(0,s.jsxs)(h,{type:n,className:r,children:[i||t?(0,s.jsx)(f,{title:i,icon:t}):null,(0,s.jsx)(x,{children:a})]})}function v(e){return(0,s.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const j={icon:(0,s.jsx)(v,{}),title:(0,s.jsx)(l.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function g(e){return(0,s.jsx)(p,{...j,...e,className:(0,r.A)("alert alert--secondary",e.className),children:e.children})}function A(e){return(0,s.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const N={icon:(0,s.jsx)(A,{}),title:(0,s.jsx)(l.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function b(e){return(0,s.jsx)(p,{...N,...e,className:(0,r.A)("alert alert--success",e.className),children:e.children})}function y(e){return(0,s.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const C={icon:(0,s.jsx)(y,{}),title:(0,s.jsx)(l.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function L(e){return(0,s.jsx)(p,{...C,...e,className:(0,r.A)("alert alert--info",e.className),children:e.children})}function H(e){return(0,s.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const w={icon:(0,s.jsx)(H,{}),title:(0,s.jsx)(l.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function T(e){return(0,s.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,s.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const U={icon:(0,s.jsx)(T,{}),title:(0,s.jsx)(l.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const k={icon:(0,s.jsx)(H,{}),title:(0,s.jsx)(l.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const _={...{note:g,tip:b,info:L,warning:function(e){return(0,s.jsx)(p,{...w,...e,className:(0,r.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,s.jsx)(p,{...U,...e,className:(0,r.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,s.jsx)(g,{title:"secondary",...e}),important:e=>(0,s.jsx)(L,{title:"important",...e}),success:e=>(0,s.jsx)(b,{title:"success",...e}),caution:function(e){return(0,s.jsx)(p,{...k,...e,className:(0,r.A)("alert alert--warning",e.className),children:e.children})}}};function B(e){const n=a(e),t=(i=n.type,_[i]||(console.warn(`No admonition component found for admonition type "${i}". Using Info as fallback.`),_.info));var i;return(0,s.jsx)(t,{...n})}},7763(e,n,t){t.d(n,{A:()=>l});t(6540);var i=t(4164),s=t(5195);const a="tableOfContents_bqdL";var r=t(4848);function l({className:e,...n}){return(0,r.jsx)("div",{className:(0,i.A)(a,"thin-scrollbar",e),children:(0,r.jsx)(s.A,{...n,linkClassName:"table-of-contents__link toc-highlight",linkActiveClassName:"table-of-contents__link--active"})})}},7910(e,n,t){t.d(n,{A:()=>r});t(6540);var i=t(8453),s=t(9057),a=t(4848);function r({children:e}){return(0,a.jsx)(i.x,{components:s.A,children:e})}},8453(e,n,t){t.d(n,{R:()=>r,x:()=>l});var i=t(6540);const s={},a=i.createContext(s);function r(e){const n=i.useContext(a);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(a.Provider,{value:n},e.children)}},8759(e,n,t){t.d(n,{A:()=>U});var i=t(6540),s=t(5260),a=t(8601),r=t(3230),l=t(4848);var c=t(4164),o=t(8774),d=t(3535);var u=t(3427),m=t(2303),h=t(1422);const f="details_lb9f",x="isBrowser_bmU9",p="collapsibleContent_i85q";function v(e){return!!e&&("SUMMARY"===e.tagName||v(e.parentElement))}function j(e,n){return!!e&&(e===n||j(e.parentElement,n))}function g({summary:e,children:n,...t}){(0,u.A)().collectAnchor(t.id);const s=(0,m.A)(),a=(0,i.useRef)(null),{collapsed:r,setCollapsed:o}=(0,h.u)({initialState:!t.open}),[d,g]=(0,i.useState)(t.open),A=i.isValidElement(e)?e:(0,l.jsx)("summary",{children:e??"Details"});return(0,l.jsxs)("details",{...t,ref:a,open:d,"data-collapsed":r,className:(0,c.A)(f,s&&x,t.className),onMouseDown:e=>{v(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const n=e.target;v(n)&&j(n,a.current)&&(e.preventDefault(),r?(o(!1),g(!0)):o(!0))},children:[A,(0,l.jsx)(h.N,{lazy:!1,collapsed:r,onCollapseTransitionEnd:e=>{o(e),g(!e)},children:(0,l.jsx)("div",{className:p,children:n})})]})}const A="details_b_Ee";function N({...e}){return(0,l.jsx)(g,{...e,className:(0,c.A)("alert alert--info",A,e.className)})}function b(e){const n=i.Children.toArray(e.children),t=n.find(e=>i.isValidElement(e)&&"summary"===e.type),s=(0,l.jsx)(l.Fragment,{children:n.filter(e=>e!==t)});return(0,l.jsx)(N,{...e,summary:t,children:s})}var y=t(1107);function C(e){return(0,l.jsx)(y.A,{...e})}const L="containsTaskList_mC6p";function H(e){if(void 0!==e)return(0,c.A)(e,e?.includes("contains-task-list")&&L)}const w="img_ev3q";var T=t(7293);const U={Head:s.A,details:b,Details:b,code:function(e){return function(e){return void 0!==e.children&&i.Children.toArray(e.children).every(e=>"string"==typeof e&&!e.includes("\n"))}(e)?(0,l.jsx)(r.A,{...e}):(0,l.jsx)(a.h,{...e})},a:function(e){const n=(0,d.v)(e.id);return(0,l.jsx)(o.A,{...e,className:(0,c.A)(n,e.className)})},pre:function(e){return(0,l.jsx)(l.Fragment,{children:e.children})},ul:function(e){return(0,l.jsx)("ul",{...e,className:H(e.className)})},li:function(e){(0,u.A)().collectAnchor(e.id);const n=(0,d.v)(e.id);return(0,l.jsx)("li",{className:(0,c.A)(n,e.className),...e})},img:function(e){return(0,l.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(n=e.className,(0,c.A)(n,w))});var n},h1:e=>(0,l.jsx)(C,{as:"h1",...e}),h2:e=>(0,l.jsx)(C,{as:"h2",...e}),h3:e=>(0,l.jsx)(C,{as:"h3",...e}),h4:e=>(0,l.jsx)(C,{as:"h4",...e}),h5:e=>(0,l.jsx)(C,{as:"h5",...e}),h6:e=>(0,l.jsx)(C,{as:"h6",...e}),admonition:T.A,mermaid:()=>null}}}]); \ No newline at end of file diff --git a/docs/assets/js/597d88be.269bc776.js b/docs/assets/js/597d88be.269bc776.js deleted file mode 100644 index 200aa4da9da..00000000000 --- a/docs/assets/js/597d88be.269bc776.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[8715],{4190(e,s,n){n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"articles/firebase-realtime-database-alternative","title":"RxDB - Firebase Realtime Database Alternative to Sync With Your Own Backend","description":"Looking for a Firebase Realtime Database alternative? RxDB offers a fully offline, vendor-agnostic NoSQL solution with advanced conflict resolution and multi-platform support.","source":"@site/docs/articles/firebase-realtime-database-alternative.md","sourceDirName":"articles","slug":"/articles/firebase-realtime-database-alternative.html","permalink":"/articles/firebase-realtime-database-alternative.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB - Firebase Realtime Database Alternative to Sync With Your Own Backend","slug":"firebase-realtime-database-alternative.html","description":"Looking for a Firebase Realtime Database alternative? RxDB offers a fully offline, vendor-agnostic NoSQL solution with advanced conflict resolution and multi-platform support."},"sidebar":"tutorialSidebar","previous":{"title":"RxDB - Firestore Alternative to Sync with Your Own Backend","permalink":"/articles/firestore-alternative.html"},"next":{"title":"RxDB \u2013 The Ultimate Offline Database with Sync and Encryption","permalink":"/articles/offline-database.html"}}');var i=n(4848),o=n(8453);const a={title:"RxDB - Firebase Realtime Database Alternative to Sync With Your Own Backend",slug:"firebase-realtime-database-alternative.html",description:"Looking for a Firebase Realtime Database alternative? RxDB offers a fully offline, vendor-agnostic NoSQL solution with advanced conflict resolution and multi-platform support."},l="RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend",t={},c=[{value:"Why RxDB Is an Excellent Firebase Realtime Database Alternative",id:"why-rxdb-is-an-excellent-firebase-realtime-database-alternative",level:2},{value:"1. Complete Offline-First Experience",id:"1-complete-offline-first-experience",level:3},{value:"2. Freedom to Use Any Server or Cloud",id:"2-freedom-to-use-any-server-or-cloud",level:3},{value:"3. Advanced Conflict Handling",id:"3-advanced-conflict-handling",level:3},{value:"4. Lower Cloud Costs for Read-Heavy Apps",id:"4-lower-cloud-costs-for-read-heavy-apps",level:3},{value:"5. Powerful Local Queries",id:"5-powerful-local-queries",level:3},{value:"6. True Offline Initialization",id:"6-true-offline-initialization",level:3},{value:"7. Works Everywhere JavaScript Runs",id:"7-works-everywhere-javascript-runs",level:3},{value:"How RxDB's Syncing Mechanism Operates",id:"how-rxdbs-syncing-mechanism-operates",level:2},{value:"Sample Code: Sync RxDB With a Custom Endpoint",id:"sample-code-sync-rxdb-with-a-custom-endpoint",level:2},{value:"Setting Up P2P Replication Over WebRTC",id:"setting-up-p2p-replication-over-webrtc",level:3},{value:"Quick Steps to Get Started",id:"quick-steps-to-get-started",level:2},{value:"Is RxDB the Right Solution for You?",id:"is-rxdb-the-right-solution-for-you",level:3}];function d(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"rxdb---the-firebase-realtime-database-alternative-that-can-sync-with-your-own-backend",children:"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend"})}),"\n",(0,i.jsxs)(s.p,{children:["Are you on the lookout for a ",(0,i.jsx)(s.strong,{children:"Firebase Realtime Database alternative"})," that gives you greater freedom, deeper offline capabilities, and allows you to seamlessly integrate with any backend? ",(0,i.jsx)(s.strong,{children:"RxDB"})," (Reactive Database) might be the perfect choice. This ",(0,i.jsx)(s.a,{href:"/articles/local-first-future.html",children:"local-first"}),", NoSQL data store runs entirely on the client while supporting real-time updates and robust syncing with any server environment\u2014making it a strong contender against Firebase Realtime Database's limitations and potential vendor lock-in."]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"/files/logo/rxdb_javascript_database.svg",alt:"JavaScript Database",width:"220"})})}),"\n",(0,i.jsx)(s.h2,{id:"why-rxdb-is-an-excellent-firebase-realtime-database-alternative",children:"Why RxDB Is an Excellent Firebase Realtime Database Alternative"}),"\n",(0,i.jsx)(s.h3,{id:"1-complete-offline-first-experience",children:"1. Complete Offline-First Experience"}),"\n",(0,i.jsxs)(s.p,{children:["Unlike Firebase Realtime Database, which relies on central infrastructure to process data, RxDB is fully embedded within your client application (including ",(0,i.jsx)(s.a,{href:"/articles/browser-database.html",children:"browsers"}),", ",(0,i.jsx)(s.a,{href:"/nodejs-database.html",children:"Node.js"}),", ",(0,i.jsx)(s.a,{href:"/electron-database.html",children:"Electron"}),", and ",(0,i.jsx)(s.a,{href:"/react-native-database.html",children:"React Native"}),"). This design means your app stays completely functional offline, since all data reads and writes happen locally. When connectivity is restored, RxDB's syncing framework automatically reconciles local changes with your remote backend."]}),"\n",(0,i.jsx)(s.h3,{id:"2-freedom-to-use-any-server-or-cloud",children:"2. Freedom to Use Any Server or Cloud"}),"\n",(0,i.jsx)(s.p,{children:"While Firebase Realtime Database ties you into Google's ecosystem, RxDB allows you to choose any hosting environment. You can:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Host your data on your own servers or private cloud."}),"\n",(0,i.jsxs)(s.li,{children:["Integrate with relational databases like ",(0,i.jsx)(s.a,{href:"/replication-http.html",children:"PostgreSQL"})," or other NoSQL options such as ",(0,i.jsx)(s.a,{href:"/replication-couchdb.html",children:"CouchDB"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Build custom endpoints using ",(0,i.jsx)(s.a,{href:"/replication-http.html",children:"REST"}),", ",(0,i.jsx)(s.a,{href:"/replication-graphql.html",children:"GraphQL"}),", or any other protocol."]}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"This flexibility ensures you're not locked into a single vendor and can adapt your backend strategy as your project evolves."}),"\n",(0,i.jsx)(s.h3,{id:"3-advanced-conflict-handling",children:"3. Advanced Conflict Handling"}),"\n",(0,i.jsxs)(s.p,{children:["Firebase Realtime Database typically updates data with a simple last-in-wins approach. RxDB, on the other hand, lets you implement more sophisticated conflict resolution logic. Using ",(0,i.jsx)(s.a,{href:"/transactions-conflicts-revisions.html#custom-conflict-handler",children:"revisions and conflict handlers"}),", RxDB can merge concurrent edits or preserve multiple versions\u2014ensuring your application remains consistent even when multiple clients modify the same data at the same time."]}),"\n",(0,i.jsx)(s.h3,{id:"4-lower-cloud-costs-for-read-heavy-apps",children:"4. Lower Cloud Costs for Read-Heavy Apps"}),"\n",(0,i.jsxs)(s.p,{children:["When you rely on Firebase Realtime Database, each query or listener can translate into ongoing reads, potentially running up your monthly bill. With RxDB, all queries are performed ",(0,i.jsx)(s.a,{href:"/offline-first.html",children:"locally"}),". Your app only communicates with the backend to sync document changes, significantly reducing bandwidth and hosting expenses for applications that frequently read data."]}),"\n",(0,i.jsx)(s.h3,{id:"5-powerful-local-queries",children:"5. Powerful Local Queries"}),"\n",(0,i.jsx)(s.p,{children:"If you've hit Firebase Realtime Database's querying limits, RxDB offers a far more robust approach to data retrieval. You can:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Define custom indexes for faster local lookups."}),"\n",(0,i.jsx)(s.li,{children:"Perform sophisticated filters, joins, or full-text searches right on the client."}),"\n",(0,i.jsxs)(s.li,{children:["Subscribe to real-time data updates through RxDB's ",(0,i.jsx)(s.a,{href:"/reactivity.html",children:"reactive query engine"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["Because these operations happen locally, your ",(0,i.jsx)(s.a,{href:"/articles/optimistic-ui.html",children:"UI updates"})," instantly, providing a snappy user experience."]}),"\n",(0,i.jsx)(s.h3,{id:"6-true-offline-initialization",children:"6. True Offline Initialization"}),"\n",(0,i.jsxs)(s.p,{children:["While Firebase offers some offline caching, it often requires an initial connection for authentication or to seed local data. RxDB, however, is built to handle an ",(0,i.jsx)(s.strong,{children:"offline-start"})," scenario. Users can begin working with the application immediately, regardless of connectivity, and any modifications they make will sync once the network is available again."]}),"\n",(0,i.jsx)(s.h3,{id:"7-works-everywhere-javascript-runs",children:"7. Works Everywhere JavaScript Runs"}),"\n",(0,i.jsxs)(s.p,{children:["One of RxDB's core strengths is its ability to run in ",(0,i.jsx)(s.strong,{children:"any JavaScript environment"}),". Whether you're building a web app that uses IndexedDB in the browser, an ",(0,i.jsx)(s.a,{href:"/electron-database.html",children:"Electron"})," desktop program, or a ",(0,i.jsx)(s.a,{href:"/react-native-database.html",children:"React Native"})," mobile application, RxDB's ",(0,i.jsx)(s.strong,{children:"swappable storage"})," adapts to your runtime of choice. This consistency makes code-sharing and cross-platform development far simpler than being tied to a single backend system."]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"how-rxdbs-syncing-mechanism-operates",children:"How RxDB's Syncing Mechanism Operates"}),"\n",(0,i.jsxs)(s.p,{children:["RxDB employs its own ",(0,i.jsx)(s.a,{href:"/replication.html",children:"Sync Engine"})," to manage data flow between your client and remote ",(0,i.jsx)(s.a,{href:"/rx-server.html",children:"servers"}),". Replication revolves around:"]}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Pull"}),": Retrieving updated or newly created documents from the server."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Push"}),": Sending local changes to the backend for persistence."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Live Updates"}),": Continuously streaming changes to and from the backend for real-time synchronization."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"sample-code-sync-rxdb-with-a-custom-endpoint",children:"Sample Code: Sync RxDB With a Custom Endpoint"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { replicateRxCollection } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" initDB"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'localdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" multiInstance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" eventReduce"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" tasks"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'task schema'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" complete"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'boolean'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Start a custom replication"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" replicateRxCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".tasks"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" replicationIdentifier"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'custom-tasks-api'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (docs) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // post local changes to your server"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" resp"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" fetch"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'https://yourapi.com/tasks/push'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" method"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'POST'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" body"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" JSON"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".stringify"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ changes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" docs })"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" resp"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".json"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(); "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// return conflicting documents if any"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (lastCheckpoint"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // fetch new/updated items from your server"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" response"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" fetch"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" `https://yourapi.com/tasks/pull?checkpoint="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"${"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"JSON"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".stringify"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" lastCheckpoint"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" )"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"&limit="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"${"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"batchSize"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"`"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" response"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".json"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" live"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" db;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.h3,{id:"setting-up-p2p-replication-over-webrtc",children:"Setting Up P2P Replication Over WebRTC"}),"\n",(0,i.jsx)(s.p,{children:"In addition to using a centralized backend, RxDB supports peer-to-peer synchronization through WebRTC, enabling devices to share data directly."}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" replicateWebRTC"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getConnectionHandlerSimplePeer"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication-webrtc'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" webrtcPool"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" replicateWebRTC"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".tasks"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" topic"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'p2p-topic-123'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" connectionHandlerCreator"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getConnectionHandlerSimplePeer"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" signalingServerUrl"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'wss://signaling.rxdb.info/'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" wrtc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'node-datachannel/polyfill'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" webSocketConstructor"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'ws'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:").WebSocket"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"webrtcPool"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"error$"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"((error) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".error"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'P2P error:'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" error);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.p,{children:"Here, any client that joins the same topic communicates changes to other peers, all without requiring a traditional client-server model."}),"\n",(0,i.jsx)(s.h2,{id:"quick-steps-to-get-started",children:"Quick Steps to Get Started"}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsx)(s.li,{children:"Install RxDB"}),"\n"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" rxdb"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" rxjs"})]})})})}),"\n",(0,i.jsxs)(s.ol,{start:"2",children:["\n",(0,i.jsx)(s.li,{children:"Create a Local Database"}),"\n"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myLocalDB'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"Add a Collection"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"ts"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"Kopieren"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" notes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'notes schema'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLenght"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" content"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.ol,{start:"3",children:["\n",(0,i.jsx)(s.li,{children:"Synchronize"}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["Use one of the ",(0,i.jsx)(s.a,{href:"/replication.html",children:"Replication Plugins"})," to connect with your preferred backend."]}),"\n",(0,i.jsx)(s.h3,{id:"is-rxdb-the-right-solution-for-you",children:"Is RxDB the Right Solution for You?"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Long Offline Use"}),": If your users need to work without an internet connection, RxDB's built-in offline-first design stands out compared to Firebase Realtime Database's partial offline approach."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Custom or Complex Queries"}),": RxDB lets you perform your ",(0,i.jsx)(s.a,{href:"/rx-query.html",children:"queries"})," locally, define ",(0,i.jsx)(s.a,{href:"/rx-schema.html#indexes",children:"indexing"}),", and handle even complex ",(0,i.jsx)(s.a,{href:"/rx-pipeline.html",children:"transformations"})," locally - no extra call to an external API."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Avoid Vendor Lock-In"}),": If you anticipate needing to move or adapt your backend later, you can do so without rewriting how your client manages its data."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Peer-to-Peer Collaboration"}),": Whether you need quick demos or real production use, ",(0,i.jsx)(s.a,{href:"/replication-webrtc.html",children:"WebRTC replication"})," can link your users directly without central coordination of data storage."]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453(e,s,n){n.d(s,{R:()=>a,x:()=>l});var r=n(6540);const i={},o=r.createContext(i);function a(e){const s=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/5a273530.2bec61c8.js b/docs/assets/js/5a273530.2bec61c8.js deleted file mode 100644 index 5759e0344e5..00000000000 --- a/docs/assets/js/5a273530.2bec61c8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[3881],{4944(e,s,r){r.r(s),r.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rx-storage-remote","title":"Remote RxStorage","description":"The Remote RxStorage is made to use a remote storage and communicate with it over an asynchronous message channel.","source":"@site/docs/rx-storage-remote.md","sourceDirName":".","slug":"/rx-storage-remote.html","permalink":"/rx-storage-remote.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Remote RxStorage","slug":"rx-storage-remote.html"},"sidebar":"tutorialSidebar","previous":{"title":"Logger \ud83d\udc51","permalink":"/logger.html"},"next":{"title":"Worker RxStorage \ud83d\udc51","permalink":"/rx-storage-worker.html"}}');var o=r(4848),a=r(8453);const i={title:"Remote RxStorage",slug:"rx-storage-remote.html"},t="Remote RxStorage",l={},c=[{value:"Usage",id:"usage",level:2},{value:"Usage with a Websocket server",id:"usage-with-a-websocket-server",level:2},{value:"Sending custom messages",id:"sending-custom-messages",level:2}];function d(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",span:"span",strong:"strong",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"remote-rxstorage",children:"Remote RxStorage"})}),"\n",(0,o.jsxs)(s.p,{children:["The Remote ",(0,o.jsx)(s.a,{href:"/rx-storage.html",children:"RxStorage"})," is made to use a remote storage and communicate with it over an asynchronous message channel.\nThe remote part could be on another JavaScript process or even on a different host machine.\nThe remote storage plugin is used in many RxDB plugins like the ",(0,o.jsx)(s.a,{href:"/rx-storage-worker.html",children:"worker"})," or the ",(0,o.jsx)(s.a,{href:"/electron.html",children:"electron"})," plugin."]}),"\n",(0,o.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,o.jsxs)(s.p,{children:["The remote storage communicates over a message channel which has to implement the ",(0,o.jsx)(s.code,{children:"messageChannelCreator"})," function which returns an object that has a ",(0,o.jsx)(s.code,{children:"messages$"})," observable and a ",(0,o.jsx)(s.code,{children:"send()"})," function on both sides and a ",(0,o.jsx)(s.code,{children:"close()"})," function that closes the RemoteMessageChannel."]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// on the client"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageRemote } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-remote'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageRemote"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" identifier"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-id'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" mode"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'storage'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" messageChannelCreator"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" Promise"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".resolve"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" messages$"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Subject"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" send"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(msg) {"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // send to remote storage"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDb"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// on the remote"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { exposeRxStorageRemote } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-remote'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"exposeRxStorageRemote"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" messages$"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Subject"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" send"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(msg){"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // send to other side"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(s.h2,{id:"usage-with-a-websocket-server",children:"Usage with a Websocket server"}),"\n",(0,o.jsxs)(s.p,{children:["The remote storage plugin contains helper functions to create a remote storage over a WebSocket server.\nThis is often used in Node.js to give one microservice access to another services database ",(0,o.jsx)(s.strong,{children:"without"})," having to replicate the full database state."]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// server.js"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageMemory } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-memory'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { startRxStorageRemoteWebsocketServer } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-remote-websocket'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// either you can create the server based on a RxDatabase"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" serverBasedOnDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" startRxStorageRemoteWebsocketServer"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" port"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 8080"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" database"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" myRxDatabase"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// or you can create the server based on a pure RxStorage"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" serverBasedOn"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" startRxStorageRemoteWebsocketServer"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" port"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 8080"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageMemory"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// client.js"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageRemoteWebsocket } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-remote-websocket'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDb"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageRemoteWebsocket"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" url"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'ws://example.com:8080'"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(s.h2,{id:"sending-custom-messages",children:"Sending custom messages"}),"\n",(0,o.jsx)(s.p,{children:"The remote storage can also be used to send custom messages to and from the remote instance."}),"\n",(0,o.jsxs)(s.p,{children:["One the remote you have to define a ",(0,o.jsx)(s.code,{children:"customRequestHandler"})," like:"]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" serverBasedOnDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" startRxStorageRemoteWebsocketServer"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" port"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 8080"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" database"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" myRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" customRequestHandler"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(msg){"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // here you can return any JSON object as an 'answer'"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" foo"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bar'"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" } "})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsxs)(s.p,{children:["On the client instance you can then call the ",(0,o.jsx)(s.code,{children:"customRequest()"})," method:"]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageRemoteWebsocket"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" url"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'ws://example.com:8080'"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" answer"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".customRequest"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ bar"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foo'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(answer); "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// > { foo: 'bar' }"})]})]})})})]})}function h(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453(e,s,r){r.d(s,{R:()=>i,x:()=>t});var n=r(6540);const o={},a=n.createContext(o);function i(e){const s=n.useContext(a);return n.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(o):e.components||o:i(e.components),n.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/5b5afcec.7e369a0e.js b/docs/assets/js/5b5afcec.7e369a0e.js deleted file mode 100644 index 804b9544b99..00000000000 --- a/docs/assets/js/5b5afcec.7e369a0e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[3633],{5255(e,s,n){n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>t,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"articles/json-based-database","title":"JSON-Based Databases - Why NoSQL and RxDB Simplify App Development","description":"Dive into how JSON-based databases power modern UI-centric apps, why NoSQL often outperforms SQL for dynamic data, how SQLite accommodates JSON, and why RxDB delivers a seamless offline-first solution for JavaScript with advanced JSON features.","source":"@site/docs/articles/json-based-database.md","sourceDirName":"articles","slug":"/articles/json-based-database.html","permalink":"/articles/json-based-database.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"JSON-Based Databases - Why NoSQL and RxDB Simplify App Development","slug":"json-based-database.html","description":"Dive into how JSON-based databases power modern UI-centric apps, why NoSQL often outperforms SQL for dynamic data, how SQLite accommodates JSON, and why RxDB delivers a seamless offline-first solution for JavaScript with advanced JSON features."},"sidebar":"tutorialSidebar","previous":{"title":"IndexedDB Max Storage Size Limit - Detailed Best Practices","permalink":"/articles/indexeddb-max-storage-limit.html"},"next":{"title":"ReactJS Storage - From Basic LocalStorage to Advanced Offline Apps with RxDB","permalink":"/articles/reactjs-storage.html"}}');var r=n(4848),a=n(8453);const t={title:"JSON-Based Databases - Why NoSQL and RxDB Simplify App Development",slug:"json-based-database.html",description:"Dive into how JSON-based databases power modern UI-centric apps, why NoSQL often outperforms SQL for dynamic data, how SQLite accommodates JSON, and why RxDB delivers a seamless offline-first solution for JavaScript with advanced JSON features."},o="JSON-Based Databases: Why NoSQL and RxDB Simplify App Development",l={},d=[{value:"Why JSON-Based Databases Are Typically NoSQL",id:"why-json-based-databases-are-typically-nosql",level:2},{value:"Document-Oriented by Nature",id:"document-oriented-by-nature",level:3},{value:"Flexible, Schema-Agnostic",id:"flexible-schema-agnostic",level:3},{value:"Aligned With Evolving User Interfaces",id:"aligned-with-evolving-user-interfaces",level:3},{value:"Is NoSQL \u201cBetter\u201d Than SQL?",id:"is-nosql-better-than-sql",level:2},{value:"When to Prefer SQL Instead of JSON/NoSQL",id:"when-to-prefer-sql-instead-of-jsonnosql",level:2},{value:"Storing JSON in Traditional SQL Databases",id:"storing-json-in-traditional-sql-databases",level:2},{value:"JSON Columns in PostgreSQL or MySQL",id:"json-columns-in-postgresql-or-mysql",level:3},{value:"Storing JSON in SQLite",id:"storing-json-in-sqlite",level:2},{value:"JSON vs. Database - Why a Plain JSON Text File is a Problem",id:"json-vs-database---why-a-plain-json-text-file-is-a-problem",level:2},{value:"RxDB: A JSON-Focused Database for JavaScript Apps",id:"rxdb-a-json-focused-database-for-javascript-apps",level:2},{value:"Key Characteristics",id:"key-characteristics",level:3},{value:"Advanced JSON Features in RxDB",id:"advanced-json-features-in-rxdb",level:3},{value:"Follow Up",id:"follow-up",level:2}];function c(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"json-based-databases-why-nosql-and-rxdb-simplify-app-development",children:"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development"})}),"\n",(0,r.jsxs)(s.p,{children:["Modern applications handle highly dynamic, often deeply nested data structures\u2014commonly represented in ",(0,r.jsx)(s.strong,{children:"JSON"}),". Whether you're building a real-time dashboard or a fully offline mobile app, storing and querying data in a JSON-friendly way can reduce overhead and coding complexity. This is where ",(0,r.jsx)(s.strong,{children:"JSON-based databases"})," (often part of the ",(0,r.jsx)(s.strong,{children:"NoSQL"})," family) come into play, letting you store objects in the same format they're used in your code, eliminating the schema wrangling that can come with a strict relational design."]}),"\n",(0,r.jsxs)(s.p,{children:["Below, we explore why JSON-based databases naturally align with ",(0,r.jsx)(s.strong,{children:"NoSQL"})," principles, how relational engines (like PostgreSQL or SQLite) handle JSON columns, the pitfalls of storing data in a single plain JSON text file, and the ways ",(0,r.jsx)(s.a,{href:"https://rxdb.info/",children:"RxDB"})," stands out as an offline-first JSON solution for JavaScript developers\u2014complete with advanced features like JSON-Schema and JSON-key-compression."]}),"\n",(0,r.jsx)("p",{align:"center",children:(0,r.jsx)("img",{src:"/files/no-sql.png",alt:"NoSQL",width:"100"})}),"\n",(0,r.jsx)(s.h2,{id:"why-json-based-databases-are-typically-nosql",children:"Why JSON-Based Databases Are Typically NoSQL"}),"\n",(0,r.jsx)(s.h3,{id:"document-oriented-by-nature",children:"Document-Oriented by Nature"}),"\n",(0,r.jsxs)(s.p,{children:["When your data is stored as JSON, each record or document can hold nested arrays and sub-objects with no forced table schema. NoSQL solutions such as ",(0,r.jsx)(s.a,{href:"/rx-storage-mongodb.html",children:"MongoDB"}),", ",(0,r.jsx)(s.a,{href:"/replication-couchdb.html",children:"CouchDB"}),", ",(0,r.jsx)(s.a,{href:"/replication-firestore.html",children:"Firebase"}),", and ",(0,r.jsx)(s.strong,{children:"RxDB"})," store and retrieve these documents in their \u201craw\u201d JSON form. This model integrates smoothly with how front-end applications already handle data, minimizing transformations and improving developer productivity."]}),"\n",(0,r.jsx)(s.h3,{id:"flexible-schema-agnostic",children:"Flexible, Schema-Agnostic"}),"\n",(0,r.jsx)(s.p,{children:"Traditional SQL tables enforce rigid column definitions and demand explicit schema migrations when you add or rename a field. By contrast, NoSQL solutions accept more dynamic data structures, allowing changes on the fly. This means a front-end developer can add a new field to a JSON object\u2014perhaps for a new feature\u2014without the friction of redefining or migrating a database schema. While this is possible, it is often not recommended."}),"\n",(0,r.jsx)(s.h3,{id:"aligned-with-evolving-user-interfaces",children:"Aligned With Evolving User Interfaces"}),"\n",(0,r.jsx)(s.p,{children:"As modern UIs frequently manipulate deeply nested or changing data, developers find it easier to store whole objects directly, saving time that might otherwise be spent performing complex joins or normalizing data. For instance, frameworks like React, Vue, or Angular are inherently comfortable with nested JSON structures, which map more directly to NoSQL\u2019s \u201cdocument\u201d approach than to relational tables."}),"\n",(0,r.jsx)(s.h2,{id:"is-nosql-better-than-sql",children:"Is NoSQL \u201cBetter\u201d Than SQL?"}),"\n",(0,r.jsxs)(s.p,{children:["It depends on your application. ",(0,r.jsx)(s.strong,{children:"SQL"})," remains exceptional for complex aggregations, enforced relationships, and sophisticated transaction handling. But ",(0,r.jsx)(s.strong,{children:"NoSQL"})," is often more intuitive and easier to maintain for \u201cdocument-first\u201d applications that:"]}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:"Thrive on flexible or rapidly evolving data models."}),"\n",(0,r.jsx)(s.li,{children:"Rely on hierarchical or nested JSON objects."}),"\n",(0,r.jsx)(s.li,{children:"Avoid multi-table joins."}),"\n",(0,r.jsx)(s.li,{children:"Require easy horizontal scaling for large sets of documents."}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"Relational databases are still a top choice for many enterprise back-ends, especially when advanced analytics or strongly enforced referential integrity is needed. But if your application is predominantly storing and manipulating JSON documents (e.g., user profiles, real-time chat logs, embedded items), a JSON-based or document-oriented approach can greatly reduce friction during development."}),"\n",(0,r.jsx)(s.h2,{id:"when-to-prefer-sql-instead-of-jsonnosql",children:"When to Prefer SQL Instead of JSON/NoSQL"}),"\n",(0,r.jsxs)(s.p,{children:["NoSQL solutions\u2014particularly JSON-based document stores\u2014provide a natural fit for flexible, nested data in UI-heavy applications. However, certain scenarios may benefit more from a ",(0,r.jsx)(s.strong,{children:"SQL"})," solution:"]}),"\n",(0,r.jsxs)(s.ol,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"Complex Relationships"}),": If your data demands intricate joins across multiple entities (e.g., many-to-many relationships that can\u2019t easily be embedded in a single document), a well-structured relational schema can simplify queries."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"Strong Integrity and Constraints"}),": SQL excels at enforcing constraints such as foreign keys, unique constraints, and advanced triggers. If your system needs strict data validation and complex business logic within the database, SQL might prove more robust."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"High-End Analytical Queries"}),": Relational databases can handle sophisticated aggregations, groupings, and joins more efficiently. If your app frequently runs advanced SQL queries, a NoSQL approach may complicate or slow down analytics."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"Legacy Integration"}),": Many enterprise systems are built around existing relational schemas. A purely NoSQL approach might mean rewriting or bridging systems that are heavily reliant on SQL constraints and transformations."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"Transaction Handling"}),": While many NoSQL solutions have improved transaction support, it can still lag behind well-established SQL transaction models. If ACID properties and multi-operation atomicity are paramount, you might prefer a tried-and-true relational engine."]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"In short, if you prioritize advanced relational queries, robust constraints, or complex business rules at the database level, SQL remains a powerful, and possibly superior, choice. For user-centric, fast-evolving JSON data, though, NoSQL or JSON-based solutions often reduce the friction of frequent schema changes."}),"\n",(0,r.jsx)(s.h2,{id:"storing-json-in-traditional-sql-databases",children:"Storing JSON in Traditional SQL Databases"}),"\n",(0,r.jsx)(s.h3,{id:"json-columns-in-postgresql-or-mysql",children:"JSON Columns in PostgreSQL or MySQL"}),"\n",(0,r.jsxs)(s.p,{children:["To accommodate the demand for flexible data, several SQL engines (notably ",(0,r.jsx)(s.strong,{children:"PostgreSQL"})," and MySQL) introduced support for ",(0,r.jsx)(s.strong,{children:"JSON"})," columns. PostgreSQL offers the ",(0,r.jsx)(s.code,{children:"JSON"})," and ",(0,r.jsx)(s.code,{children:"JSONB"})," types, enabling developers to store raw JSON in a column. You can also index specific paths within the JSON to speed lookups on nested fields:"]}),"\n",(0,r.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"sql","data-theme":"css-variables",children:(0,r.jsxs)(s.code,{"data-language":"sql","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"CREATE"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" TABLE"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" products"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"SERIAL"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" PRIMARY KEY"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" name"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" TEXT"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" details JSONB"})}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"-- Insert a record with JSON data"})}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"INSERT INTO"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" products ("}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"name"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:", details) "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"VALUES"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Laptop'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:", "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'\'{"brand": "BrandX", "features": ["Touchscreen", "SSD"]}\''}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})}),"\n",(0,r.jsx)(s.p,{children:"Although this approach merges the best of both worlds (SQL queries + flexible JSON fields), it can also create a \u201csplit personality\u201d in your schema. You might store stable data in normal columns, while unpredictable or nested details live inside a JSONB field. Some projects flourish with this hybrid design, others find it a bit unwieldy."}),"\n",(0,r.jsx)("center",{children:(0,r.jsx)("img",{src:"../files/icons/sqlite.svg",alt:"WASM SQLite",width:"140",class:"img-padding"})}),"\n",(0,r.jsx)(s.h2,{id:"storing-json-in-sqlite",children:"Storing JSON in SQLite"}),"\n",(0,r.jsxs)(s.p,{children:["SQLite also allows storing JSON data, typically as text columns, but with some additional features since ",(0,r.jsx)(s.strong,{children:"SQLite 3.9"})," (2015) including the ",(0,r.jsx)(s.a,{href:"https://www.sqlite.org/json1.html",children:"JSON1 extension"}),". This extension can parse JSON text, perform queries on JSON fields, and do partial updates. However, storing JSON in SQLite does require you to ensure you\u2019ve compiled SQLite with JSON1 support or to rely on a library that bundles it. While possible, you still won't get quite the same schema-agnostic ease as a full document store, but it\u2019s a pragmatic solution for smaller or embedded needs on the server side\u2014or occasionally in the browser if you run SQLite via WebAssembly. RxDB uses this in its ",(0,r.jsx)(s.a,{href:"/rx-storage-sqlite.html",children:"SQLite storage"}),"."]}),"\n",(0,r.jsx)(s.h2,{id:"json-vs-database---why-a-plain-json-text-file-is-a-problem",children:"JSON vs. Database - Why a Plain JSON Text File is a Problem"}),"\n",(0,r.jsx)(s.p,{children:"Some developers consider storing everything in a single JSON file, typically read and written directly from disk or local storage. This approach, while seemingly simple, usually does not scale. Key issues include:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"No Concurrency"}),": If multiple parts of the application try to write to the same JSON file, you risk overwriting changes."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"No Indexes"}),": Finding or filtering items in large JSON text requires scanning everything. This is slow and quickly becomes unmanageable."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"No Partial Updates"}),": You often reload the entire file, modify it in memory, then write it back, which is highly inefficient for large data sets."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"Corruption Risk"}),": A single corrupted write or partial save might break the entire JSON file, losing all data."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.strong,{children:"High Memory Usage"}),": The entire file may need to be parsed into memory, even if you only need a fraction of the data."]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"Databases\u2014relational or NoSQL\u2014solve these issues by handling concurrency, enabling partial reads/writes, establishing indexes, and ensuring transactional integrity so you don\u2019t lose everything if the process is interrupted mid-write."}),"\n",(0,r.jsx)("center",{children:(0,r.jsx)("a",{href:"https://rxdb.info/",children:(0,r.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JavaScript JSON Database",width:"220"})})}),"\n",(0,r.jsx)(s.h2,{id:"rxdb-a-json-focused-database-for-javascript-apps",children:"RxDB: A JSON-Focused Database for JavaScript Apps"}),"\n",(0,r.jsxs)(s.p,{children:["Many NoSQL databases operate on the server, whereas RxDB is built for client-side usage\u2014browsers, mobile apps, or Node.js. It specializes in JSON documents and embraces an ",(0,r.jsx)(s.a,{href:"/offline-first.html",children:"offline-first"})," philosophy."]}),"\n",(0,r.jsx)(s.h3,{id:"key-characteristics",children:"Key Characteristics"}),"\n",(0,r.jsxs)(s.ol,{children:["\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.strong,{children:"Local JSON Storage"})}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"RxDB stores each record as a JSON document, closely matching how front-end frameworks handle state. This eliminates complex transformations or manual JSON parsing before writing to a table."}),"\n",(0,r.jsxs)(s.ol,{start:"2",children:["\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.strong,{children:"Reactive Queries"})}),"\n"]}),"\n",(0,r.jsxs)(s.p,{children:["Instead of complex SQL, RxDB uses JSON-based ",(0,r.jsx)(s.a,{href:"/rx-query.html",children:"query"})," definitions. You can subscribe to query results, letting your UI automatically refresh when data changes locally or from remote sync updates:"]}),"\n",(0,r.jsx)("p",{align:"center",children:(0,r.jsx)("img",{src:"../files/animations/realtime.gif",alt:"realtime ui updates",width:"700"})}),"\n",(0,r.jsxs)(s.ol,{start:"3",children:["\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.strong,{children:"Offline-First Sync"})}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"Built-in replication plugins push/pull changes to or from a remote server. If your app is offline, updates get stored locally, then sync up seamlessly once a connection is available."}),"\n",(0,r.jsxs)(s.ol,{start:"4",children:["\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.strong,{children:"Optional JSON-Schema"})}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"Though it\u2019s a document database, RxDB encourages you to define a JSON-based schema for clarity, indexing, and type validation. This helps maintain data consistency while still allowing a measure of flexibility for new fields."}),"\n",(0,r.jsx)(s.h3,{id:"advanced-json-features-in-rxdb",children:"Advanced JSON Features in RxDB"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"JSON-Schema"}),": By specifying a JSON-Schema, you can define which fields exist, whether they are required, and their data types. This is invaluable for catching malformed documents early and imposing mild structure in a NoSQL setting."]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"JSON Key-Compression"}),": Large, verbose field names can bloat storage usage. RxDB\u2019s optional ",(0,r.jsx)(s.a,{href:"/key-compression.html",children:"key-compression plugin"})," automatically shortens field names in your JSON documents internally, reducing disk space and bandwidth:"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Example: how key-compression can transform your documents"})}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" uncompressed"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "firstName"'}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "Corrine"'}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "lastName"'}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "Ziemann"'}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "shoppingCartItems"'}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"productNumber"'}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 29857"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "amount"'}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 1"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"productNumber"'}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 53409"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "amount"'}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 6"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" compressed"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "|e"'}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "Corrine"'}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "|g"'}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "Ziemann"'}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "|i"'}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"|h"'}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 29857"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "|b"'}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 1"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"|h"'}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 53409"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "|b"'}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 6"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,r.jsx)(s.p,{children:"The user sees no difference in their code\u2014RxDB automatically decompresses data on read\u2014but the overhead is drastically reduced behind the scenes."}),"\n",(0,r.jsx)(s.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,r.jsx)(s.p,{children:"JSON-based databases naturally align with NoSQL because they accommodate evolving, nested data without rigid schemas. This makes them appealing for many UI-centric or offline-first applications where flexible documents and agile development cycles matter more than heavy relational queries or constraints."}),"\n",(0,r.jsx)(s.p,{children:"SQL can still store JSON\u2014whether in PostgreSQL\u2019s JSONB columns, MySQL\u2019s JSON fields, or SQLite\u2019s JSON1 extension. For some teams, a hybrid approach pairing SQL for relational data with JSON columns for more flexible fields works well. However, storing everything in a single monolithic JSON text file is rarely advisable for anything beyond trivial tasks\u2014databases excel at concurrency, indexing, and partial writes."}),"\n",(0,r.jsxs)(s.p,{children:["Tools like RxDB provide an even simpler, ",(0,r.jsx)(s.a,{href:"/articles/local-first-future.html",children:"local-first"})," take on JSON documents\u2014particularly for JavaScript projects. With offline ",(0,r.jsx)(s.a,{href:"/replication.html",children:"replication"}),", reactive queries, optional JSON-Schema, and advanced optimizations such as key-compression, RxDB streamlines building dynamic, user-facing features while preserving the core benefits of a robust document database."]}),"\n",(0,r.jsx)(s.p,{children:"To explore more about RxDB and its capabilities for browser database development, check out the following resources:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.a,{href:"/code/",children:"RxDB GitHub Repository"}),": Visit the official GitHub repository of RxDB to access the source code, documentation, and community support."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.a,{href:"/quickstart.html",children:"RxDB Quickstart"}),": Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples",children:"RxDB Examples"}),": Browse official examples to see RxDB in action and learn best practices you can apply to your own project - even if jQuery isn't explicitly featured, the patterns are similar."]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},8453(e,s,n){n.d(s,{R:()=>t,x:()=>o});var i=n(6540);const r={},a=i.createContext(r);function t(e){const s=i.useContext(a);return i.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),i.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/5e95c892.e42e7000.js b/docs/assets/js/5e95c892.e42e7000.js deleted file mode 100644 index 8275f2ca12c..00000000000 --- a/docs/assets/js/5e95c892.e42e7000.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9647],{7121(e,r,s){s.r(r),s.d(r,{default:()=>n});s(6540);var a=s(4164),u=s(7559),c=s(5500),l=s(2831),d=s(8711),h=s(4848);function n(e){return(0,h.jsx)(c.e3,{className:(0,a.A)(u.G.wrapper.docsPages),children:(0,h.jsx)(d.A,{children:(0,l.v)(e.route.routes)})})}}}]); \ No newline at end of file diff --git a/docs/assets/js/61792630.6e389211.js b/docs/assets/js/61792630.6e389211.js deleted file mode 100644 index fc1b3c322dd..00000000000 --- a/docs/assets/js/61792630.6e389211.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[7277],{3247(e,s,n){n.d(s,{g:()=>i});var r=n(4848);function i(e){const s=[];let n=null;return e.children.forEach(e=>{e.props.id?(n&&s.push(n),n={headline:e,paragraphs:[]}):n&&n.paragraphs.push(e)}),n&&s.push(n),(0,r.jsx)("div",{style:o.stepsContainer,children:s.map((e,s)=>(0,r.jsxs)("div",{style:o.stepWrapper,children:[(0,r.jsxs)("div",{style:o.stepIndicator,children:[(0,r.jsx)("div",{style:o.stepNumber,children:s+1}),(0,r.jsx)("div",{style:o.verticalLine})]}),(0,r.jsxs)("div",{style:o.stepContent,children:[(0,r.jsx)("div",{children:e.headline}),e.paragraphs.map((e,s)=>(0,r.jsx)("div",{style:o.item,children:e},s))]})]},s))})}const o={stepsContainer:{display:"flex",flexDirection:"column"},stepWrapper:{display:"flex",alignItems:"stretch",marginBottom:"1.5rem",position:"relative",minWidth:0},stepIndicator:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",width:"33px",marginRight:"1rem",minWidth:0},stepNumber:{width:"33px",height:"33px",borderRadius:"50%",backgroundColor:"var(--color-top)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:"bold",marginTop:-4},verticalLine:{position:"absolute",top:29,bottom:"0",left:"50%",width:"1px",background:"linear-gradient(to bottom, var(--color-top) 0%, var(--color-top) 80%, rgba(0,0,0,0) 100%)",transform:"translateX(-50%)"},stepContent:{flex:1,minWidth:0,overflowWrap:"break-word"},item:{marginTop:"0.5rem"}}},5270(e,s,n){n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>t,default:()=>p,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"articles/angular-indexeddb","title":"Build Smarter Offline-First Angular Apps - How RxDB Beats IndexedDB Alone","description":"Discover how to harness IndexedDB in Angular with RxDB for robust offline apps. Learn reactive queries, advanced features, and more.","source":"@site/docs/articles/angular-indexeddb.md","sourceDirName":"articles","slug":"/articles/angular-indexeddb.html","permalink":"/articles/angular-indexeddb.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Build Smarter Offline-First Angular Apps - How RxDB Beats IndexedDB Alone","slug":"angular-indexeddb.html","description":"Discover how to harness IndexedDB in Angular with RxDB for robust offline apps. Learn reactive queries, advanced features, and more."},"sidebar":"tutorialSidebar","previous":{"title":"What Really Is a Realtime Database?","permalink":"/articles/realtime-database.html"},"next":{"title":"IndexedDB Database in React Apps - The Power of RxDB","permalink":"/articles/react-indexeddb.html"}}');var i=n(4848),o=n(8453),a=n(2636);n(3247);const l={title:"Build Smarter Offline-First Angular Apps - How RxDB Beats IndexedDB Alone",slug:"angular-indexeddb.html",description:"Discover how to harness IndexedDB in Angular with RxDB for robust offline apps. Learn reactive queries, advanced features, and more."},t="Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone",c={},d=[{value:"What Is IndexedDB?",id:"what-is-indexeddb",level:2},{value:"Why Use IndexedDB in Angular",id:"why-use-indexeddb-in-angular",level:2},{value:"Why Using Plain IndexedDB is a Problem",id:"why-using-plain-indexeddb-is-a-problem",level:2},{value:"Set Up RxDB in Angular",id:"set-up-rxdb-in-angular",level:2},{value:"Installing RxDB",id:"installing-rxdb",level:3},{value:"Patch Change Detection with zone.js",id:"patch-change-detection-with-zonejs",level:3},{value:"Create a Database and Collections",id:"create-a-database-and-collections",level:3},{value:"Localstorage",id:"localstorage",level:3},{value:"IndexedDB",id:"indexeddb",level:3},{value:"CRUD Operations",id:"crud-operations",level:3},{value:"Reactive Queries and Live Updates",id:"reactive-queries-and-live-updates",level:2},{value:"With RxJS Observables and Async Pipes",id:"with-rxjs-observables-and-async-pipes",level:3},{value:"With Angular Signals",id:"with-angular-signals",level:3},{value:"Angular IndexedDB Example with RxDB",id:"angular-indexeddb-example-with-rxdb",level:2},{value:"Advanced RxDB Features",id:"advanced-rxdb-features",level:2},{value:"Limitations of IndexedDB",id:"limitations-of-indexeddb",level:2},{value:"Alternatives to IndexedDB",id:"alternatives-to-indexeddb",level:2},{value:"Performance comparison with other browser storages",id:"performance-comparison-with-other-browser-storages",level:2},{value:"Follow Up",id:"follow-up",level:2}];function h(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"build-smarter-offline-first-angular-apps-how-rxdb-beats-indexeddb-alone",children:"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone"})}),"\n",(0,i.jsxs)(s.p,{children:["In modern web applications, offline capabilities and fast interactions are crucial. IndexedDB, the ",(0,i.jsx)(s.a,{href:"/articles/browser-database.html",children:"browser"}),"'s built-in database, allows you to store data locally, making your Angular application more robust and responsive. However, IndexedDB can be cumbersome to work with directly. That's where RxDB (Reactive Database) shines. In this article, we'll walk you through how to utilize IndexedDB in your Angular project using ",(0,i.jsx)(s.a,{href:"https://rxdb.info/",children:"RxDB"})," as a convenient abstraction layer."]}),"\n",(0,i.jsx)(s.h2,{id:"what-is-indexeddb",children:"What Is IndexedDB?"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API",children:"IndexedDB"})," is a low-level JavaScript API for client-side storage of large amounts of structured data. It allows you to create key-value or object store-based data storage right in the user's browser. IndexedDB supports transactions and indexing but lacks a robust query API and can be complex to use due to its callback-based nature."]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("img",{src:"../files/icons/angular.svg",alt:"Angular IndexedDB",width:"120"})}),"\n",(0,i.jsx)(s.h2,{id:"why-use-indexeddb-in-angular",children:"Why Use IndexedDB in Angular"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"/offline-first.html",children:"Offline-First"}),"/",(0,i.jsx)(s.a,{href:"/articles/local-first-future.html",children:"Local-First"}),": If your app needs to function with limited or no internet connectivity, IndexedDB provides a reliable local storage layer. Users can continue using the application offline, and data can sync when the connection is restored."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Performance"}),": Local data access comes with ",(0,i.jsx)(s.a,{href:"/articles/zero-latency-local-first.html",children:"near-zero latency"}),", removing the need for constant server requests and eliminating most loading spinners."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Easier to Implement"}),": By replicating all necessary data to the client once, you avoid implementing numerous backend endpoints for each user interaction."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Scalability"}),": Local data queries remove processing load from your servers and reduce bandwidth usage by handling queries on the client side."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"why-using-plain-indexeddb-is-a-problem",children:"Why Using Plain IndexedDB is a Problem"}),"\n",(0,i.jsx)(s.p,{children:"Despite the advantages, directly working with IndexedDB has several drawbacks:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Callback-Based"}),": IndexedDB was originally designed around a callback-based API, which can be unwieldy compared to modern Promise or RxJS-based flows."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Difficult to Implement"}),': IndexedDB is often described as a "low-level" API. It\'s more suitable for library authors rather than application developers who simply need a robust local store.']}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Rudimentary Query API"}),": Complex or dynamic queries are cumbersome with IndexedDB's basic get/put approach and limited indexes."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"TypeScript Support"}),": Maintaining strong TypeScript types for all document structures is not straightforward with IndexedDB's untyped object stores."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"No Observable API"}),": IndexedDB cannot directly emit live data changes. With RxDB, you can subscribe to changes on a collection or even a single document field."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Cross-Tab Synchronization"}),": Handling concurrent data changes across multiple browser tabs is difficult in IndexedDB. RxDB has built-in multi-tab support that keeps all tabs in sync."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Advanced Features Missing"}),": IndexedDB lacks built-in support for encryption, compression, or other advanced data management features."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Browser-Only"}),": IndexedDB works in the browser but not in environments like React Native or Electron. RxDB offers storage adapters to seamlessly reuse the same code on different platforms."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JavaScript Database",width:"220"})})}),"\n",(0,i.jsx)(s.h2,{id:"set-up-rxdb-in-angular",children:"Set Up RxDB in Angular"}),"\n",(0,i.jsx)(s.h3,{id:"installing-rxdb",children:"Installing RxDB"}),"\n",(0,i.jsxs)(s.p,{children:["You can ",(0,i.jsx)(s.a,{href:"/install.html",children:"install RxDB"})," into your Angular application via npm:"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" rxdb"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" --save"})]})})})}),"\n",(0,i.jsx)(s.h3,{id:"patch-change-detection-with-zonejs",children:"Patch Change Detection with zone.js"}),"\n",(0,i.jsx)(s.p,{children:"RxDB creates RxJS observables outside of Angular's zone, meaning Angular won't automatically trigger change detection when new data arrives. You must patch RxJS with zone.js:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"//> app.component.ts"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * IMPORTANT: RxDB creates rxjs observables outside of Angular's zone"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * So you have to import the rxjs patch to ensure change detection works correctly."})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"@link"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" https://www.bennadel.com/blog/3448-binding-rxjs-observable-sources-outside-of-the-ngzone-in-angular-6-0-2.htm"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'zone.js/plugins/zone-patch-rxjs'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]})]})})}),"\n",(0,i.jsx)(s.h3,{id:"create-a-database-and-collections",children:"Create a Database and Collections"}),"\n",(0,i.jsxs)(s.p,{children:["RxDB supports multiple storage options. The free and simple approach is using the ",(0,i.jsx)(s.a,{href:"/rx-storage-localstorage.html",children:"localstorage-based"})," storage. For higher performance, there's a premium plain ",(0,i.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB storage"}),"."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Define your schema"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" heroSchema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'hero schema'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" description"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Describes a hero in your app'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" power"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'name'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,i.jsxs)(a.t,{children:[(0,i.jsx)(s.h3,{id:"localstorage",children:"Localstorage"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" initDB"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Create a database"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'heroesdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // the name of the database"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Add collections"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" heroSchema"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" db;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),(0,i.jsx)(s.h3,{id:"indexeddb",children:"IndexedDB"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageIndexedDB } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-indexeddb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" initDB"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Create a database"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'heroesdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // the name of the database"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Add collections"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" heroSchema"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" db;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})})]}),"\n",(0,i.jsxs)(s.p,{children:["It's recommended to encapsulate database creation logic in an Angular service, such as in a DatabaseService. A full example is available in ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/blob/master/examples/angular/src/app/services/database.service.ts",children:"RxDB's Angular example"}),"."]}),"\n",(0,i.jsx)(s.h3,{id:"crud-operations",children:"CRUD Operations"}),"\n",(0,i.jsx)(s.p,{children:"Once your database is initialized, you can perform all CRUD operations:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// insert"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Iron Man'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" power"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Genius-level intellect'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// bulk insert"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".bulkInsert"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(["})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Thor'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" power"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'God of Thunder'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Hulk'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" power"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Superhuman Strength'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]);"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// find and findOne"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" ironMan"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Iron Man'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" } })"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// update"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Hulk'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" } })"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".update"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ $set"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { power"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Unlimited Strength'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" } });"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// delete"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Thor'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" } })"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".remove"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),"\n",(0,i.jsx)(s.h2,{id:"reactive-queries-and-live-updates",children:"Reactive Queries and Live Updates"}),"\n",(0,i.jsxs)(s.p,{children:["A key benefit of RxDB is reactivity. You can subscribe to changes and have your UI automatically reflect updates in ",(0,i.jsx)(s.a,{href:"/articles/realtime-database.html",children:"real time"})," even across browser tabs."]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"../files/animations/realtime.gif",alt:"realtime ui updates",width:"700"})}),"\n",(0,i.jsx)(s.h3,{id:"with-rxjs-observables-and-async-pipes",children:"With RxJS Observables and Async Pipes"}),"\n",(0,i.jsxs)(s.p,{children:["In Angular, you can display this data with the ",(0,i.jsx)(s.code,{children:"AsyncPipe"}),":"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"constructor"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(private dbService: DatabaseService) {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" this"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".heroes$ "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" this"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"dbService"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sort"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" [{ name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'asc'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }]"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }).$;"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"html","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"html","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"ul"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"li"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" *ngFor"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"let hero of heroes$ | async"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {{ hero.name }}"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" "})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:""})]})]})})}),"\n",(0,i.jsx)(s.h3,{id:"with-angular-signals",children:"With Angular Signals"}),"\n",(0,i.jsxs)(s.p,{children:["Angular Signals are a newer approach for reactivity. RxDB supports them via a ",(0,i.jsx)(s.a,{href:"/reactivity.html",children:"custom reactivity"})," factory. You can convert RxJS Observables to Signals using Angular's ",(0,i.jsx)(s.code,{children:"toSignal"}),":"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { RxReactivityFactory } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { Signal"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" untracked"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" Injector } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '@angular/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { toSignal } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '@angular/core/rxjs-interop'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createReactivityFactory"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(injector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Injector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" RxReactivityFactory"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"Signal"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"any"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">> {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" fromObservable"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(observable$"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" initialValue) {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" untracked"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(() "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" toSignal"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(observable$"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" initialValue"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" injector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" rejectErrors"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsxs)(s.p,{children:["Pass this factory when creating your ",(0,i.jsx)(s.a,{href:"/rx-database.html",children:"RxDatabase"}),":"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { inject"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" Injector } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '@angular/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" reactivity"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createReactivityFactory"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"inject"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(Injector))"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.p,{children:["Use the double-dollar sign (",(0,i.jsx)(s.code,{children:"$$"}),") to get a ",(0,i.jsx)(s.code,{children:"Signal"})," instead of an ",(0,i.jsx)(s.code,{children:"Observable"}),":"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" heroesSignal"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"().$$;"})]})})})}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"html","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"html","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"ul"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"li"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" *ngFor"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"let hero of heroesSignal()"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {{ hero.name }}"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" "})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:""})]})]})})}),"\n",(0,i.jsx)(s.h2,{id:"angular-indexeddb-example-with-rxdb",children:"Angular IndexedDB Example with RxDB"}),"\n",(0,i.jsxs)(s.p,{children:["A comprehensive example of RxDB in an Angular application is available in the ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/angular",children:"RxDB GitHub repository"}),". It demonstrates ",(0,i.jsx)(s.a,{href:"/articles/angular-database.html",children:"database"})," creation, queries, and Angular integration using best practices."]}),"\n",(0,i.jsx)(s.h2,{id:"advanced-rxdb-features",children:"Advanced RxDB Features"}),"\n",(0,i.jsx)(s.p,{children:"Beyond simple CRUD and local data storage, RxDB supports:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Replication"}),": Sync your local data with a remote database. Learn more at ",(0,i.jsx)(s.a,{href:"https://rxdb.info/replication.html",children:"RxDB Replication"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Data Migration on Schema Changes"}),": RxDB supports automatic or manual schema migrations to manage backward-compatibility and evolve your data structure. See ",(0,i.jsx)(s.a,{href:"https://rxdb.info/migration-schema.html",children:"RxDB Migration"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Encryption"}),": Easily encrypt sensitive data at rest. See ",(0,i.jsx)(s.a,{href:"https://rxdb.info/encryption.html",children:"RxDB Encryption"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Compression"}),": Reduce storage and bandwidth usage using key compression. Learn more at ",(0,i.jsx)(s.a,{href:"https://rxdb.info/key-compression.html",children:"RxDB Key Compression"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"limitations-of-indexeddb",children:"Limitations of IndexedDB"}),"\n",(0,i.jsx)(s.p,{children:"While IndexedDB works well for many use cases, it does have a few constraints:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Potentially Slow"}),": While adequate for most use cases, IndexedDB performance can degrade for very large datasets. More details at RxDB ",(0,i.jsx)(s.a,{href:"/slow-indexeddb.html",children:"Slow IndexedDB"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Storage Limits"}),": Browsers may cap the amount of data you can store in IndexedDB. For more info, see ",(0,i.jsx)(s.a,{href:"/articles/indexeddb-max-storage-limit.html",children:"Local Storage Limits of IndexedDB"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"alternatives-to-indexeddb",children:"Alternatives to IndexedDB"}),"\n",(0,i.jsx)(s.p,{children:"Depending on your needs, you might explore:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Origin Private File System (OPFS)"}),": A newer browser storage mechanism that can offer better performance. RxDB supports ",(0,i.jsx)(s.a,{href:"/rx-storage-opfs.html",children:"OPFS storage"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"SQLite"}),": When building a mobile or hybrid app (e.g., with ",(0,i.jsx)(s.a,{href:"/capacitor-database.html",children:"Capacitor"})," or ",(0,i.jsx)(s.a,{href:"/articles/ionic-database.html",children:"Ionic"}),"), you can use SQLite locally. See ",(0,i.jsx)(s.a,{href:"/rx-storage-sqlite.html",children:"RxDB with SQLite"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"performance-comparison-with-other-browser-storages",children:"Performance comparison with other browser storages"}),"\n",(0,i.jsxs)(s.p,{children:["Here is a ",(0,i.jsx)(s.a,{href:"/rx-storage-performance.html",children:"performance overview"})," of the various browser based storage implementation of RxDB:"]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"../files/rx-storage-performance-browser.png",alt:"RxStorage performance - browser",width:"700"})}),"\n",(0,i.jsx)(s.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,i.jsx)(s.p,{children:"Continue your deep dive into RxDB with official quickstart guides and star the repository on GitHub to stay updated."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"RxDB Quickstart"}),": Get started quickly with the ",(0,i.jsx)(s.a,{href:"/quickstart.html",children:"RxDB Quickstart"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"RxDB GitHub"}),": Explore the source, open issues, and star \u2b50 the project at ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb",children:"RxDB GitHub Repo"}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"By combining IndexedDB's local storage with RxDB's powerful features, you can build performant, robust, and offline-capable Angular applications. RxDB takes care of the lower-level complexities, letting you focus on delivering a great user experience-online or off."})]})}function p(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453(e,s,n){n.d(s,{R:()=>a,x:()=>l});var r=n(6540);const i={},o=r.createContext(i);function a(e){const s=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/6187b59a.746cfe2d.js b/docs/assets/js/6187b59a.746cfe2d.js deleted file mode 100644 index 6c0aee00d1a..00000000000 --- a/docs/assets/js/6187b59a.746cfe2d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[5866],{5640(e,s,r){r.r(s),r.d(s,{assets:()=>t,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rx-storage-worker","title":"Turbocharge RxDB with Worker RxStorage","description":"Offload RxDB queries to WebWorkers or Worker Threads, freeing the main thread and boosting performance. Experience smoother apps with Worker RxStorage.","source":"@site/docs/rx-storage-worker.md","sourceDirName":".","slug":"/rx-storage-worker.html","permalink":"/rx-storage-worker.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Turbocharge RxDB with Worker RxStorage","slug":"rx-storage-worker.html","description":"Offload RxDB queries to WebWorkers or Worker Threads, freeing the main thread and boosting performance. Experience smoother apps with Worker RxStorage."},"sidebar":"tutorialSidebar","previous":{"title":"Remote RxStorage","permalink":"/rx-storage-remote.html"},"next":{"title":"SharedWorker RxStorage \ud83d\udc51","permalink":"/rx-storage-shared-worker.html"}}');var o=r(4848),i=r(8453);const a={title:"Turbocharge RxDB with Worker RxStorage",slug:"rx-storage-worker.html",description:"Offload RxDB queries to WebWorkers or Worker Threads, freeing the main thread and boosting performance. Experience smoother apps with Worker RxStorage."},l="Worker RxStorage",t={},c=[{value:"On the worker process",id:"on-the-worker-process",level:2},{value:"On the main process",id:"on-the-main-process",level:2},{value:"Pre-build workers",id:"pre-build-workers",level:2},{value:"Building a custom worker",id:"building-a-custom-worker",level:2},{value:"One worker per database",id:"one-worker-per-database",level:2},{value:"Passing in a Worker instance",id:"passing-in-a-worker-instance",level:2}];function d(e){const s={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",span:"span",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"worker-rxstorage",children:"Worker RxStorage"})}),"\n",(0,o.jsxs)(s.p,{children:["With the worker plugin, you can put the ",(0,o.jsx)(s.code,{children:"RxStorage"})," of your database inside of a WebWorker (in browsers) or a Worker Thread (in node.js). By doing so, you can take CPU load from the main process and move it into the worker's process which can improve the perceived performance of your application. Notice that for browsers, it is recommend to use the ",(0,o.jsx)(s.a,{href:"/rx-storage-shared-worker.html",children:"SharedWorker"})," instead to get a better performance."]}),"\n",(0,o.jsx)(s.admonition,{title:"Premium",type:"note",children:(0,o.jsxs)(s.p,{children:["This plugin is part of ",(0,o.jsx)(s.a,{href:"/premium/",children:"RxDB Premium \ud83d\udc51"}),". It is not part of the default RxDB module."]})}),"\n",(0,o.jsx)(s.h2,{id:"on-the-worker-process",children:"On the worker process"}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// worker.ts"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { exposeWorkerRxStorage } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-worker'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageIndexedDB } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-indexeddb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"exposeWorkerRxStorage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * You can wrap any implementation of the RxStorage interface"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * into a worker."})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * Here we use the IndexedDB RxStorage."})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(s.h2,{id:"on-the-main-process",children:"On the main process"}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageWorker } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-worker'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageWorker"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * Contains any value that can be used as parameter"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * to the Worker constructor of thread.js"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * Most likely you want to put the path to the worker.js file in here."})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * "})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"@link"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" https://developer.mozilla.org/en-US/docs/Web/API/Worker/Worker"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" workerInput"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'path/to/worker.js'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * (Optional) options"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * for the worker."})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" workerOptions"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'module'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" credentials"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'omit'"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" )"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(s.h2,{id:"pre-build-workers",children:"Pre-build workers"}),"\n",(0,o.jsxs)(s.p,{children:["The ",(0,o.jsx)(s.code,{children:"worker.js"})," must be a self containing JavaScript file that contains all dependencies in a bundle.\nTo make it easier for you, RxDB ships with pre-bundles worker files that are ready to use.\nYou can find them in the folder ",(0,o.jsx)(s.code,{children:"node_modules/rxdb-premium/dist/workers"})," after you have installed the ",(0,o.jsx)(s.a,{href:"/premium/",children:"RxDB Premium \ud83d\udc51 Plugin"}),". From there you can copy them to a location where it can be served from the webserver and then use their path to create the ",(0,o.jsx)(s.code,{children:"RxDatabase"}),"."]}),"\n",(0,o.jsxs)(s.p,{children:["Any valid ",(0,o.jsx)(s.code,{children:"worker.js"})," JavaScript file can be used both, for normal Workers and SharedWorkers."]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageWorker } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-worker'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageWorker"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * Path to where the copied file from node_modules/rxdb/dist/workers"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * is reachable from the webserver."})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" workerInput"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '/indexeddb.worker.js'"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" )"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(s.h2,{id:"building-a-custom-worker",children:"Building a custom worker"}),"\n",(0,o.jsxs)(s.p,{children:["The easiest way to bundle a custom ",(0,o.jsx)(s.code,{children:"worker.js"})," file is by using webpack. Here is the webpack-config that is also used for the prebuild workers:"]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// webpack.config.js"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" path"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'path'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" TerserPlugin"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'terser-webpack-plugin'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" projectRootPath"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" path"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".resolve"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" __dirname"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '../../'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // path from webpack-config to the root folder of the repo"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" babelConfig"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"path"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".join"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(projectRootPath"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'babel.config'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"));"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" baseDir"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" './dist/workers/'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"; "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// output path"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"module"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"exports"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" target"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'webworker'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" entry"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-custom-worker'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" baseDir "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"+"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-custom-worker.js'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" output"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" filename"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '[name].js'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" clean"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" path"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" path"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".resolve"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" projectRootPath"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'dist/workers'"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" )"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" mode"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'production'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" module"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" rules"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" test"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" /\\.tsx"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"?$"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"/"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" exclude"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" /(node_modules)/"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" use"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" loader"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'babel-loader'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" options"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" babelConfig"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ]"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" resolve"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" extensions"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'.tsx'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '.ts'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '.js'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '.mjs'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '.mts'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" optimization"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" moduleIds"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'deterministic'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" minimize"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" minimizer"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"new"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" TerserPlugin"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" terserOptions"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" format"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" comments"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" extractComments"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })]"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,o.jsx)(s.h2,{id:"one-worker-per-database",children:"One worker per database"}),"\n",(0,o.jsxs)(s.p,{children:["Each call to ",(0,o.jsx)(s.code,{children:"getRxStorageWorker()"})," will create a different worker instance so that when you have more than one ",(0,o.jsx)(s.code,{children:"RxDatabase"}),", each database will have its own JavaScript worker process."]}),"\n",(0,o.jsxs)(s.p,{children:["To reuse the worker instance in more than one ",(0,o.jsx)(s.code,{children:"RxDatabase"}),", you can store the output of ",(0,o.jsx)(s.code,{children:"getRxStorageWorker()"})," into a variable an use that one. Reusing the worker can decrease the initial page load, but you might get slower database operations."]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Call getRxStorageWorker() exactly once"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" workerStorage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageWorker"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" workerInput"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'path/to/worker.js'"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// use the same storage for both databases."})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" databaseOne"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'database-one'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" workerStorage"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" databaseTwo"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'database-two'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" workerStorage"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "})]})})}),"\n",(0,o.jsx)(s.h2,{id:"passing-in-a-worker-instance",children:"Passing in a Worker instance"}),"\n",(0,o.jsxs)(s.p,{children:["Instead of setting an url as ",(0,o.jsx)(s.code,{children:"workerInput"}),", you can also specify a function that returns a new ",(0,o.jsx)(s.code,{children:"Worker"})," instance when called."]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"getRxStorageWorker"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" workerInput"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Worker"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'path/to/worker.js'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"})"})})]})})}),"\n",(0,o.jsxs)(s.p,{children:["This can be helpful for environments where the worker is build dynamically by the bundler. For example in angular you would create a ",(0,o.jsx)(s.code,{children:"my-custom.worker.ts"})," file that contains a custom build worker and then import it."]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageWorker"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" workerInput"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Worker"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"new"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" URL"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'./my-custom.worker'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"meta"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".url))"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"//> my-custom.worker.ts"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { exposeWorkerRxStorage } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-worker'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageIndexedDB } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-indexeddb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"exposeWorkerRxStorage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453(e,s,r){r.d(s,{R:()=>a,x:()=>l});var n=r(6540);const o={},i=n.createContext(o);function a(e){const s=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/6672.9c7472fc.js b/docs/assets/js/6672.9c7472fc.js deleted file mode 100644 index a4dd750bc95..00000000000 --- a/docs/assets/js/6672.9c7472fc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[4291,6672],{4291(e,t,r){r.r(t),r.d(t,{getDatabase:()=>wa,hasIndexedDB:()=>ba});var a=r(7329);function n(e,t){var r=e.get(t);if(void 0===r)throw new Error("missing value from map "+t);return r}function i(e,t,r,a){var n=e.get(t);return void 0===n?(n=r(),e.set(t,n)):a&&a(n),n}function s(e){return Object.assign({},e)}function o(e,t=!1){if(!e)return e;if(!t&&Array.isArray(e))return e.sort((e,t)=>"string"==typeof e&&"string"==typeof t?e.localeCompare(t):"object"==typeof e?1:-1).map(e=>o(e,t));if("object"==typeof e&&!Array.isArray(e)){var r={};return Object.keys(e).sort((e,t)=>e.localeCompare(t)).forEach(a=>{r[a]=o(e[a],t)}),r}return e}var c=function e(t){if(!t)return t;if(null===t||"object"!=typeof t)return t;if(Array.isArray(t)){for(var r=new Array(t.length),a=r.length;a--;)r[a]=e(t[a]);return r}var n={};for(var i in t)n[i]=e(t[i]);return n};function u(e,t,r){return Object.defineProperty(e,t,{get:function(){return r}}),r}var h=e=>{var t=typeof e;return null!==e&&("object"===t||"function"===t)},l=new Set(["__proto__","prototype","constructor"]),d=new Set("0123456789");function m(e){var t=[],r="",a="start",n=!1;for(var i of e)switch(i){case"\\":if("index"===a)throw new Error("Invalid character in an index");if("indexEnd"===a)throw new Error("Invalid character after an index");n&&(r+=i),a="property",n=!n;break;case".":if("index"===a)throw new Error("Invalid character in an index");if("indexEnd"===a){a="property";break}if(n){n=!1,r+=i;break}if(l.has(r))return[];t.push(r),r="",a="property";break;case"[":if("index"===a)throw new Error("Invalid character in an index");if("indexEnd"===a){a="index";break}if(n){n=!1,r+=i;break}if("property"===a){if(l.has(r))return[];t.push(r),r=""}a="index";break;case"]":if("index"===a){t.push(Number.parseInt(r,10)),r="",a="indexEnd";break}if("indexEnd"===a)throw new Error("Invalid character after an index");default:if("index"===a&&!d.has(i))throw new Error("Invalid character in an index");if("indexEnd"===a)throw new Error("Invalid character after an index");"start"===a&&(a="property"),n&&(n=!1,r+="\\"),r+=i}switch(n&&(r+="\\"),a){case"property":if(l.has(r))return[];t.push(r);break;case"index":throw new Error("Index was not closed");case"start":t.push("")}return t}function f(e,t){if("number"!=typeof t&&Array.isArray(e)){var r=Number.parseInt(t,10);return Number.isInteger(r)&&e[r]===e[t]}return!1}function p(e,t){if(f(e,t))throw new Error("Cannot use string index")}function v(e,t,r){if(Array.isArray(t)&&(t=t.join(".")),!t.includes(".")&&!t.includes("["))return e[t];if(!h(e)||"string"!=typeof t)return void 0===r?e:r;var a=m(t);if(0===a.length)return r;for(var n=0;n!1,deepFreezeWhenDevMode:e=>e,tunnelErrorMessage:e=>"\n RxDB Error-Code: "+e+".\n Hint: Error messages are not included in RxDB core to reduce build size.\n To show the full error messages and to ensure that you do not make any mistakes when using RxDB,\n use the dev-mode plugin when you are in development mode: https://rxdb.info/dev-mode.html?console=error\n "};function _(e,t,r){return"\n"+e+"\n"+function(e){var t="";return 0===Object.keys(e).length?t:(t+="-".repeat(20)+"\n",t+="Parameters:\n",t+=Object.keys(e).map(t=>{var r="[object Object]";try{r="errors"===t?e[t].map(e=>JSON.stringify(e,Object.getOwnPropertyNames(e))):JSON.stringify(e[t],function(e,t){return void 0===t?null:t},2)}catch(a){}return t+": "+r}).join("\n"),t+="\n")}(r)}var k=function(e){function t(t,r,a={}){var n,i=_(r,0,a);return(n=e.call(this,i)||this).code=t,n.message=i,n.url=E(t),n.parameters=a,n.rxdb=!0,n}return(0,w.A)(t,e),t.prototype.toString=function(){return this.message},(0,b.A)(t,[{key:"name",get:function(){return"RxError ("+this.code+")"}},{key:"typeError",get:function(){return!1}}])}((0,D.A)(Error)),I=function(e){function t(t,r,a={}){var n,i=_(r,0,a);return(n=e.call(this,i)||this).code=t,n.message=i,n.url=E(t),n.parameters=a,n.rxdb=!0,n}return(0,w.A)(t,e),t.prototype.toString=function(){return this.message},(0,b.A)(t,[{key:"name",get:function(){return"RxTypeError ("+this.code+")"}},{key:"typeError",get:function(){return!0}}])}((0,D.A)(TypeError));function E(e){return"https://rxdb.info/errors.html?console=errors#"+e}function C(e){return"\nFind out more about this error here: "+E(e)+" \n"}function R(e,t){return new k(e,x.tunnelErrorMessage(e)+C(e),t)}function O(e,t){return new I(e,x.tunnelErrorMessage(e)+C(e),t)}function S(e){return!(!e||409!==e.status)&&e}var j={409:"document write conflict",422:"schema validation error",510:"attachment data missing"};function P(e){return R("COL20",{name:j[e.status],document:e.documentId,writeError:e})}var $=/\./g,N=r(8342);function B(e,t){var r=t;return r="properties."+(r=r.replace($,".properties.")),v(e,r=(0,N.L$)(r))}function M(e){return"string"==typeof e?e:e.key}function A(e,t){if("string"==typeof e.primaryKey)return t[e.primaryKey];var r=e.primaryKey;return r.fields.map(e=>{var r=v(t,e);if(void 0===r)throw R("DOC18",{args:{field:e,documentData:t}});return r}).join(r.separator)}function q(e){var t=M((e=s(e)).primaryKey);e.properties=s(e.properties),e.additionalProperties=!1,Object.prototype.hasOwnProperty.call(e,"keyCompression")||(e.keyCompression=!1),e.indexes=e.indexes?e.indexes.slice(0):[],e.required=e.required?e.required.slice(0):[],e.encrypted=e.encrypted?e.encrypted.slice(0):[],e.properties._rev={type:"string",minLength:1},e.properties._attachments={type:"object"},e.properties._deleted={type:"boolean"},e.properties._meta=T,e.required=e.required?e.required.slice(0):[],e.required.push("_deleted"),e.required.push("_rev"),e.required.push("_meta"),e.required.push("_attachments"),e.required.push(t),e.required=e.required.filter(e=>!e.includes(".")).filter((e,t,r)=>r.indexOf(e)===t),e.version=e.version||0;var r=e.indexes.map(e=>{var r=(0,g.k_)(e)?e.slice(0):[e];return r.includes(t)||r.push(t),"_deleted"!==r[0]&&r.unshift("_deleted"),r});0===r.length&&r.push(function(e){return["_deleted",e]}(t)),r.push(["_meta.lwt",t]),e.internalIndexes&&e.internalIndexes.map(e=>{r.push(e)});var a=new Set;return r.filter(e=>{var t=e.join(",");return!a.has(t)&&(a.add(t),!0)}),e.indexes=r,e}var T={type:"object",properties:{lwt:{type:"number",minimum:1,maximum:1e15,multipleOf:.01}},additionalProperties:!0,required:["lwt"]};var L="docs",Q="changes",W="attachments",F="dexie",H=new Map,K=new Map;var z="__";function Z(e){var t=e.split(".");if(t.length>1)return t.map(e=>Z(e)).join(".");if(e.startsWith("|")){var r=e.substring(1);return z+r}return e}function U(e){var t=e.split(".");return t.length>1?t.map(e=>U(e)).join("."):e.startsWith(z)?"|"+e.substring(2):e}function V(e,t){if(!t)return t;var r=s(t);return r=G(r),e.forEach(e=>{var a=v(t,e)?"1":"0",n=Z(e);y(r,n,a)}),r}function J(e,t){return t?(t=X(t=s(t)),e.forEach(e=>{var r=v(t,e);y(t,e,"1"===r)}),t):t}function G(e){if(!e||"string"==typeof e||"number"==typeof e||"boolean"==typeof e)return e;if(Array.isArray(e))return e.map(e=>G(e));if("object"==typeof e){var t={};return Object.entries(e).forEach(([e,r])=>{"object"==typeof r&&(r=G(r)),t[Z(e)]=r}),t}}function X(e){if(!e||"string"==typeof e||"number"==typeof e||"boolean"==typeof e)return e;if(Array.isArray(e))return e.map(e=>X(e));if("object"==typeof e){var t={};return Object.entries(e).forEach(([r,a])=>{("object"==typeof a||Array.isArray(e))&&(a=X(a)),t[U(r)]=a}),t}}function Y(e){var t=[],r=M(e.primaryKey);t.push([r]),t.push(["_deleted",r]),e.indexes&&e.indexes.forEach(e=>{var r=(0,g.$r)(e);t.push(r)}),t.push(["_meta.lwt",r]),t.push(["_meta.lwt"]);var a=(t=t.map(e=>e.map(e=>Z(e)))).map(e=>1===e.length?e[0]:"["+e.join("+")+"]");return(a=a.filter((e,t,r)=>r.indexOf(e)===t)).join(", ")}async function ee(e,t){var r=await e;return(await r.dexieTable.bulkGet(t)).map(e=>J(r.booleanIndexes,e))}function te(e,t){return e+"||"+t}function re(e){var t=new Set,r=[];return e.indexes?(e.indexes.forEach(a=>{(0,g.$r)(a).forEach(a=>{t.has(a)||(t.add(a),"boolean"===B(e,a).type&&r.push(a))})}),r.push("_deleted"),(0,g.jw)(r)):r}var ae=r(9092),ne=0;function ie(){var e=Date.now();(e+=.01)<=ne&&(e=ne+.01);var t=parseFloat(e.toFixed(2));return ne=t,t}var se,oe={};var ce=async function(e){var t=(new TextEncoder).encode(e),r=await function(){if(se)return se;if("undefined"==typeof crypto||void 0===crypto.subtle||"function"!=typeof crypto.subtle.digest)throw R("UT8",{args:{typeof_crypto:typeof crypto,typeof_crypto_subtle:typeof crypto?.subtle,typeof_crypto_subtle_digest:typeof crypto?.subtle?.digest}});return se=crypto.subtle.digest.bind(crypto.subtle)}()("SHA-256",t);return Array.prototype.map.call(new Uint8Array(r),e=>("00"+e.toString(16)).slice(-2)).join("")};var ue=r(4134),he=ue.Dr,le=!1;async function de(){return le?he:(le=!0,he=(async()=>!(!oe.premium||"string"!=typeof oe.premium||"6da4936d1425ff3a5c44c02342c6daf791d266be3ae8479b8ec59e261df41b93"!==await ce(oe.premium)))())}var me=r(3337),fe=String.fromCharCode(65535),pe=Number.MIN_SAFE_INTEGER;function ve(e,t){var r=t.selector,a=e.indexes?e.indexes.slice(0):[];t.index&&(a=[t.index]);var n=!!t.sort.find(e=>"desc"===Object.values(e)[0]),i=new Set;Object.keys(r).forEach(t=>{var a=B(e,t);a&&"boolean"===a.type&&Object.prototype.hasOwnProperty.call(r[t],"$eq")&&i.add(t)});var s,o=t.sort.map(e=>Object.keys(e)[0]).filter(e=>!i.has(e)).join(","),c=-1;if(a.forEach(e=>{var a=!0,u=!0,h=e.map(e=>{var t=r[e],n=t?Object.keys(t):[],i={};t&&n.length?n.forEach(e=>{if(ye.has(e)){var r=function(e,t){switch(e){case"$eq":return{startKey:t,endKey:t,inclusiveEnd:!0,inclusiveStart:!0};case"$lte":return{endKey:t,inclusiveEnd:!0};case"$gte":return{startKey:t,inclusiveStart:!0};case"$lt":return{endKey:t,inclusiveEnd:!1};case"$gt":return{startKey:t,inclusiveStart:!1};default:throw new Error("SNH")}}(e,t[e]);i=Object.assign(i,r)}}):i={startKey:u?pe:fe,endKey:a?fe:pe,inclusiveStart:!0,inclusiveEnd:!0};return void 0===i.startKey&&(i.startKey=pe),void 0===i.endKey&&(i.endKey=fe),void 0===i.inclusiveStart&&(i.inclusiveStart=!0),void 0===i.inclusiveEnd&&(i.inclusiveEnd=!0),u&&!i.inclusiveStart&&(u=!1),a&&!i.inclusiveEnd&&(a=!1),i}),l=h.map(e=>e.startKey),d=h.map(e=>e.endKey),m={index:e,startKeys:l,endKeys:d,inclusiveEnd:a,inclusiveStart:u,sortSatisfiedByIndex:!n&&o===e.filter(e=>!i.has(e)).join(","),selectorSatisfiedByIndex:we(e,t.selector,l,d)},f=function(e,t,r){var a=0,n=e=>{e>0&&(a+=e)},i=10,s=(0,g.Sd)(r.startKeys,e=>e!==pe&&e!==fe);n(s*i);var o=(0,g.Sd)(r.startKeys,e=>e!==fe&&e!==pe);n(o*i);var c=(0,g.Sd)(r.startKeys,(e,t)=>e===r.endKeys[t]);n(c*i*1.5);var u=r.sortSatisfiedByIndex?5:0;return n(u),a}(0,0,m);(f>=c||t.index)&&(c=f,s=m)}),!s)throw R("SNH",{query:t});return s}var ye=new Set(["$eq","$gt","$gte","$lt","$lte"]),ge=new Set(["$eq","$gt","$gte"]),be=new Set(["$eq","$lt","$lte"]);function we(e,t,r,a){var n=Object.entries(t).find(([t,r])=>!e.includes(t)||Object.entries(r).find(([e,t])=>!ye.has(e)));if(n)return!1;if(t.$and||t.$or)return!1;var i=[],s=new Set;for(var[o,c]of Object.entries(t)){if(!e.includes(o))return!1;var u=Object.keys(c).filter(e=>ge.has(e));if(u.length>1)return!1;var h=u[0];if(h&&s.add(o),"$eq"!==h){if(i.length>0)return!1;i.push(h)}}var l=[],d=new Set;for(var[m,f]of Object.entries(t)){if(!e.includes(m))return!1;var p=Object.keys(f).filter(e=>be.has(e));if(p.length>1)return!1;var v=p[0];if(v&&d.add(m),"$eq"!==v){if(l.length>0)return!1;l.push(v)}}var y=0;for(var g of e){for(var b of[s,d]){if(!b.has(g)&&b.size>0)return!1;b.delete(g)}if(r[y]!==a[y]&&s.size>0&&d.size>0)return!1;y++}return!0}var De,xe=r(2235),_e=r(4953),ke=r(1621),Ie=r(4192),Ee=r(695),Ce=r(2830),Re=r(2080),Oe=r(175),Se=r(8259),je=r(5912),Pe=r(6729),$e=r(6529),Ne=r(2226),Be=r(3697),Me=r(558),Ae=r(2583),qe=r(9283),Te=r(5629),Le=r(4612),Qe=r(5805),We=r(3587),Fe=r(1401),He=r(7531),Ke=!1;function ze(e){return Ke||(De=_e.ob.init({pipeline:{$sort:Ie.x,$project:Ee.C},query:{$elemMatch:Ce.J,$eq:Re.X,$nor:Oe.q,$exists:Se.P,$regex:je.W,$and:Pe.a,$gt:$e.M,$gte:Ne.f,$in:Be.o,$lt:Me.N,$lte:Ae.Q,$ne:qe.C,$nin:Te.G,$mod:Le.P,$not:Qe.E,$or:We.s,$size:Fe.I,$type:He.T}}),Ke=!0),new ke.X(e,{context:De})}function Ze(e,t){var r=M(e.primaryKey);t=s(t);var a=c(t);if("number"!=typeof a.skip&&(a.skip=0),a.selector?(a.selector=a.selector,Object.entries(a.selector).forEach(([e,t])=>{"object"==typeof t&&null!==t||(a.selector[e]={$eq:t})})):a.selector={},a.index){var n=(0,g.$r)(a.index);n.includes(r)||n.push(r),a.index=n}if(a.sort)a.sort.find(e=>{return t=e,Object.keys(t)[0]===r;var t})||(a.sort=a.sort.slice(0),a.sort.push({[r]:"asc"}));else if(a.index)a.sort=a.index.map(e=>({[e]:"asc"}));else{if(e.indexes){var i=new Set;Object.entries(a.selector).forEach(([e,t])=>{("object"!=typeof t||null===t||!!Object.keys(t).find(e=>ye.has(e)))&&i.add(e)});var o,u=-1;e.indexes.forEach(e=>{var t=(0,g.k_)(e)?e:[e],r=t.findIndex(e=>!i.has(e));r>0&&r>u&&(u=r,o=t)}),o&&(a.sort=o.map(e=>({[e]:"asc"})))}if(!a.sort)if(e.indexes&&e.indexes.length>0){var h=e.indexes[0],l=(0,g.k_)(h)?h:[h];a.sort=l.map(e=>({[e]:"asc"}))}else a.sort=[{[r]:"asc"}]}return a}function Ue(e,t){if(!t.sort)throw R("SNH",{query:t});var r=[];t.sort.forEach(e=>{var t,a,n,i=Object.keys(e)[0],s=Object.values(e)[0];r.push({key:i,direction:s,getValueFn:(t=i,a=t.split("."),n=a.length,1===n?e=>e[t]:e=>{for(var t=e,r=0;r{for(var a=0;ar.test(e)}async function Je(e,t){var r=await e.exec();return r?Array.isArray(r)?Promise.all(r.map(e=>t(e))):r instanceof Map?Promise.all([...r.values()].map(e=>t(e))):await t(r):null}function Ge(e,t){if(!t.sort)throw R("SNH",{query:t});return{query:t,queryPlan:ve(e,t)}}function Xe(e){return e===pe?-1/0:e}function Ye(e,t,r){return e.includes(t)?r===fe||!0===r?"1":"0":r}function et(e,t,r){if(!r){if("undefined"==typeof window)throw new Error("IDBKeyRange missing");r=window.IDBKeyRange}var a=t.startKeys.map((r,a)=>{var n=t.index[a];return Ye(e,n,r)}).map(Xe),n=t.endKeys.map((r,a)=>{var n=t.index[a];return Ye(e,n,r)}).map(Xe);return r.bound(a,n,!t.inclusiveStart,!t.inclusiveEnd)}async function tt(e,t){var r=await e.internals,a=t.query,n=a.skip?a.skip:0,i=n+(a.limit?a.limit:1/0),s=t.queryPlan,o=!1;s.selectorSatisfiedByIndex||(o=Ve(e.schema,t.query));var c=et(r.booleanIndexes,s,r.dexieDb._options.IDBKeyRange),u=s.index,h=[];if(await r.dexieDb.transaction("r",r.dexieTable,async e=>{var t,a=e.idbtrans.objectStore(L);t="["+u.map(e=>Z(e)).join("+")+"]";var n=a.index(t).openCursor(c);await new Promise(e=>{n.onsuccess=function(t){var a=t.target.result;if(a){var n=J(r.booleanIndexes,a.value);o&&!o(n)||h.push(n),s.sortSatisfiedByIndex&&h.length===i?e():a.continue()}else e()}})}),!s.sortSatisfiedByIndex){var l=Ue(e.schema,t.query);h=h.sort(l)}return{documents:h=h.slice(n,i)}}function rt(e){for(var t="",r=0;r0&&nt[e].forEach(e=>e(t))}async function st(e,t){for(var r of nt[e])await r(t)}async function ot(e,t){var r=(await e.findDocumentsById([t],!1))[0];return r||void 0}async function ct(e,t,r){var a=await e.bulkWrite([t],r);if(a.error.length>0)throw a.error[0];return vt(M(e.schema.primaryKey),[t],a)[0]}function ut(e,t,r,a){if(a)throw 409===a.status?R("CONFLICT",{collection:e.name,id:t,writeError:a,data:r}):422===a.status?R("VD2",{collection:e.name,id:t,writeError:a,data:r}):a}function ht(e){return{previous:e.previous,document:lt(e.document)}}function lt(e){if(!e._attachments||0===Object.keys(e._attachments).length)return e;var t=s(e);return t._attachments={},Object.entries(e._attachments).forEach(([e,r])=>{var a,n,i;t._attachments[e]=(i=(a=r).data)?{length:(n=i,atob(n).length),digest:a.digest,type:a.type}:a}),t}function dt(e){return Object.assign({},e,{_meta:s(e._meta)})}function mt(e,t,r){x.deepFreezeWhenDevMode(r);var a=M(t.schema.primaryKey),n={originalStorageInstance:t,schema:t.schema,internals:t.internals,collectionName:t.collectionName,databaseName:t.databaseName,options:t.options,async bulkWrite(r,n){for(var i=e.token,s=new Array(r.length),o=ie(),c=0;ct.bulkWrite(s,n)),m={error:[]};ft.set(m,s);var f=0===d.error.length?[]:d.error.filter(e=>!(409!==e.status||e.writeRow.previous||e.writeRow.document._deleted||!(0,me.ZN)(e.documentInDb)._deleted)||(m.error.push(e),!1));if(f.length>0){var p=new Set,v=f.map(t=>(p.add(t.documentId),{previous:t.documentInDb,document:Object.assign({},t.writeRow.document,{_rev:at(e.token,t.documentInDb)})})),y=await e.lockedRun(()=>t.bulkWrite(v,n));m.error=m.error.concat(y.error);var g=vt(a,s,m,p),b=vt(a,v,y);return g.push(...b),m}return m},query:r=>e.lockedRun(()=>t.query(r)),count:r=>e.lockedRun(()=>t.count(r)),findDocumentsById:(r,a)=>e.lockedRun(()=>t.findDocumentsById(r,a)),getAttachmentData:(r,a,n)=>e.lockedRun(()=>t.getAttachmentData(r,a,n)),getChangedDocumentsSince:t.getChangedDocumentsSince?(r,a)=>e.lockedRun(()=>t.getChangedDocumentsSince((0,me.ZN)(r),a)):void 0,cleanup:r=>e.lockedRun(()=>t.cleanup(r)),remove:()=>(e.storageInstances.delete(n),e.lockedRun(()=>t.remove())),close:()=>(e.storageInstances.delete(n),e.lockedRun(()=>t.close())),changeStream:()=>t.changeStream()};return e.storageInstances.add(n),n}var ft=new WeakMap,pt=new WeakMap;function vt(e,t,r,a){return i(pt,r,()=>{var n=[],i=ft.get(r);if(i||(i=t),r.error.length>0||a){for(var s=a||new Set,o=0;o{r.storageName===e&&r.databaseName===t.databaseName&&r.collectionName===t.collectionName&&r.version===t.schema.version&&i.next(r.eventBulk)};n.addEventListener("message",s);var o=r.changeStream(),c=!1,u=o.subscribe(r=>{c||n.postMessage({storageName:e,databaseName:t.databaseName,collectionName:t.collectionName,version:t.schema.version,eventBulk:r})});r.changeStream=function(){return i.asObservable().pipe((0,yt.X)(o))};var h=r.close.bind(r);r.close=async function(){return c=!0,u.unsubscribe(),n.removeEventListener("message",s),a||await wt(t.databaseInstanceToken,r),h()};var l=r.remove.bind(r);r.remove=async function(){return c=!0,u.unsubscribe(),n.removeEventListener("message",s),a||await wt(t.databaseInstanceToken,r),l()}}}var xt=ie(),_t=!1,kt=function(){function e(e,t,r,a,n,i,s,o){this.changes$=new ae.B,this.instanceId=xt++,this.storage=e,this.databaseName=t,this.collectionName=r,this.schema=a,this.internals=n,this.options=i,this.settings=s,this.devMode=o,this.primaryPath=M(this.schema.primaryKey)}var t=e.prototype;return t.bulkWrite=async function(e,t){Et(this),_t||await de()||console.warn(["-------------- RxDB Open Core RxStorage -------------------------------","You are using the free Dexie.js based RxStorage implementation from RxDB https://rxdb.info/rx-storage-dexie.html?console=dexie ","While this is a great option, we want to let you know that there are faster storage solutions available in our premium plugins.","For professional users and production environments, we highly recommend considering these premium options to enhance performance and reliability."," https://rxdb.info/premium/?console=dexie ","If you already purchased premium access you can disable this log by calling the setPremiumFlag() function from rxdb-premium/plugins/shared.","---------------------------------------------------------------------"].join("\n")),_t=!0,e.forEach(e=>{if(!e.document._rev||e.previous&&!e.previous._rev)throw R("SNH",{args:{row:e}})});var r=await this.internals,a={error:[]};this.devMode&&(e=e.map(e=>{var t=dt(e.document);return{previous:e.previous,document:t}}));var n,i=e.map(e=>e.document[this.primaryPath]);if(await r.dexieDb.transaction("rw",r.dexieTable,r.dexieAttachmentsTable,async()=>{var s=new Map;(await ee(this.internals,i)).forEach(e=>{var t=e;return t&&s.set(t[this.primaryPath],t),t}),n=function(e,t,r,a,n,i,s){for(var o,c=!!e.schema.attachments,u=[],h=[],l=[],d={id:(0,N.zs)(10),events:[],checkpoint:null,context:n},m=d.events,f=[],p=[],v=[],y=r.size>0,g=a.length,b=function(){var e,d=a[w],g=d.document,b=d.previous,D=g[t],x=g._deleted,_=b&&b._deleted,k=void 0;if(y&&(k=r.get(D)),k){var I=k._rev;if(!b||b&&I!==b._rev){var E={isError:!0,status:409,documentId:D,writeRow:d,documentInDb:k,context:n};return l.push(E),1}var C=c?ht(d):d;c&&(x?b&&Object.keys(b._attachments).forEach(e=>{p.push({documentId:D,attachmentId:e,digest:(0,me.ZN)(b)._attachments[e].digest})}):(Object.entries(g._attachments).find(([t,r])=>((b?b._attachments[t]:void 0)||r.data||(e={documentId:D,documentInDb:k,isError:!0,status:510,writeRow:d,attachmentId:t,context:n}),!0)),e||Object.entries(g._attachments).forEach(([e,t])=>{var r=b?b._attachments[e]:void 0;if(r){var a=C.document._attachments[e].digest;t.data&&r.digest!==a&&v.push({documentId:D,attachmentId:e,attachmentData:t,digest:t.digest})}else f.push({documentId:D,attachmentId:e,attachmentData:t,digest:t.digest})}))),e?l.push(e):(c?(h.push(ht(C)),s&&s(g)):(h.push(C),s&&s(g)),o=C);var O=null,S=null,j=null;if(_&&!x)j="INSERT",O=c?lt(g):g;else if(!b||_||x){if(!x)throw R("SNH",{args:{writeRow:d}});j="DELETE",O=(0,me.ZN)(g),S=b}else j="UPDATE",O=c?lt(g):g,S=b;var P={documentId:D,documentData:O,previousDocumentData:S,operation:j};m.push(P)}else{var $=!!x;if(c&&Object.entries(g._attachments).forEach(([t,r])=>{r.data?f.push({documentId:D,attachmentId:t,attachmentData:r,digest:r.digest}):(e={documentId:D,isError:!0,status:510,writeRow:d,attachmentId:t,context:n},l.push(e))}),e||(c?(u.push(ht(d)),i&&i(g)):(u.push(d),i&&i(g)),o=d),!$){var N={documentId:D,operation:"INSERT",documentData:c?lt(g):g,previousDocumentData:c&&b?lt(b):b};m.push(N)}}},w=0;w{o.push(e.document)}),n.bulkUpdateDocs.forEach(e=>{o.push(e.document)}),(o=o.map(e=>V(r.booleanIndexes,e))).length>0&&await r.dexieTable.bulkPut(o);var c=[];n.attachmentsAdd.forEach(e=>{c.push({id:te(e.documentId,e.attachmentId),data:e.attachmentData.data})}),n.attachmentsUpdate.forEach(e=>{c.push({id:te(e.documentId,e.attachmentId),data:e.attachmentData.data})}),await r.dexieAttachmentsTable.bulkPut(c),await r.dexieAttachmentsTable.bulkDelete(n.attachmentsRemove.map(e=>te(e.documentId,e.attachmentId)))}),(n=(0,me.ZN)(n)).eventBulk.events.length>0){var s=(0,me.ZN)(n.newestRow).document;n.eventBulk.checkpoint={id:s[this.primaryPath],lwt:s._meta.lwt},this.changes$.next(n.eventBulk)}return a},t.findDocumentsById=async function(e,t){Et(this);var r=await this.internals,a=[];return await r.dexieDb.transaction("r",r.dexieTable,async()=>{(await ee(this.internals,e)).forEach(e=>{!e||e._deleted&&!t||a.push(e)})}),a},t.query=function(e){return Et(this),tt(this,e)},t.count=async function(e){if(e.queryPlan.selectorSatisfiedByIndex){var t=await async function(e,t){var r=await e.internals,a=t.queryPlan,n=a.index,i=et(r.booleanIndexes,a,r.dexieDb._options.IDBKeyRange),s=-1;return await r.dexieDb.transaction("r",r.dexieTable,async e=>{var t,r=e.idbtrans.objectStore(L);t="["+n.map(e=>Z(e)).join("+")+"]";var a=r.index(t).count(i);s=await new Promise((e,t)=>{a.onsuccess=function(){e(a.result)},a.onerror=e=>t(e)})}),s}(this,e);return{count:t,mode:"fast"}}return{count:(await tt(this,e)).documents.length,mode:"slow"}},t.changeStream=function(){return Et(this),this.changes$.asObservable()},t.cleanup=async function(e){Et(this);var t=await this.internals;return await t.dexieDb.transaction("rw",t.dexieTable,async()=>{var r=ie()-e,a=await t.dexieTable.where("_meta.lwt").below(r).toArray(),n=[];a.forEach(e=>{"1"===e._deleted&&n.push(e[this.primaryPath])}),await t.dexieTable.bulkDelete(n)}),!0},t.getAttachmentData=async function(e,t,r){Et(this);var a=await this.internals,n=te(e,t);return await a.dexieDb.transaction("r",a.dexieAttachmentsTable,async()=>{var r=await a.dexieAttachmentsTable.get(n);if(r)return r.data;throw new Error("attachment missing documentId: "+e+" attachmentId: "+t)})},t.remove=async function(){Et(this);var e=await this.internals;return await e.dexieTable.clear(),this.close()},t.close=function(){return this.closed||(this.closed=(async()=>{this.changes$.complete(),await async function(e){var t=await e,r=K.get(e)-1;0===r?(t.dexieDb.close(),K.delete(e)):K.set(e,r)}(this.internals)})()),this.closed},e}();async function It(e,t,r){var n=function(e,t,r,n){var o="rxdb-dexie-"+e+"--"+n.version+"--"+t,c=i(H,o,()=>{var e=(async()=>{var e=s(r);e.autoOpen=!1;var t=new a.cf(o,e);r.onCreate&&await r.onCreate(t,o);var i={[L]:Y(n),[Q]:"++sequence, id",[W]:"id"};return t.version(1).stores(i),await t.open(),{dexieDb:t,dexieTable:t[L],dexieAttachmentsTable:t[W],booleanIndexes:re(n)}})();return H.set(o,c),K.set(c,0),e});return c}(t.databaseName,t.collectionName,r,t.schema),o=new kt(e,t.databaseName,t.collectionName,t.schema,n,t.options,r,t.devMode);return await Dt(F,t,o),Promise.resolve(o)}function Et(e){if(e.closed)throw new Error("RxStorageInstanceDexie is closed "+e.databaseName+"-"+e.collectionName)}var Ct="17.0.0-beta.6",Rt=function(){function e(e){this.name=F,this.rxdbVersion=Ct,this.settings=e}return e.prototype.createStorageInstance=function(e){(function(e){if(e.schema.keyCompression)throw R("UT5",{args:{params:e}});if((t=e.schema).encrypted&&t.encrypted.length>0||t.attachments&&t.attachments.encrypted)throw R("UT6",{args:{params:e}});var t;if(e.schema.attachments&&e.schema.attachments.compression)throw R("UT7",{args:{params:e}})}(e),e.schema.indexes)&&e.schema.indexes.flat().filter(e=>!e.includes(".")).forEach(t=>{if(!e.schema.required||!e.schema.required.includes(t))throw R("DXE1",{field:t,schema:e.schema})});return It(this,e,this.settings)},e}();function Ot(e={}){return new Rt(e)}var St=r(686),jt=function(){function e(e,t){if(this.jsonSchema=e,this.hashFunction=t,this.indexes=function(e){return(e.indexes||[]).map(e=>(0,g.k_)(e)?e:[e])}(this.jsonSchema),this.primaryPath=M(this.jsonSchema.primaryKey),!e.properties[this.primaryPath].maxLength)throw R("SC39",{schema:e});this.finalFields=function(e){var t=Object.keys(e.properties).filter(t=>e.properties[t].final),r=M(e.primaryKey);return t.push(r),"string"!=typeof e.primaryKey&&e.primaryKey.fields.forEach(e=>t.push(e)),t}(this.jsonSchema)}var t=e.prototype;return t.validateChange=function(e,t){this.finalFields.forEach(r=>{if(!(0,St.b)(e[r],t[r]))throw R("DOC9",{dataBefore:e,dataAfter:t,fieldName:r,schema:this.jsonSchema})})},t.getDocumentPrototype=function(){var e={},t=B(this.jsonSchema,"");return Object.keys(t).forEach(t=>{var r=t;e.__defineGetter__(t,function(){if(this.get&&"function"==typeof this.get)return this.get(r)}),Object.defineProperty(e,t+"$",{get:function(){return this.get$(r)},enumerable:!1,configurable:!1}),Object.defineProperty(e,t+"$$",{get:function(){return this.get$$(r)},enumerable:!1,configurable:!1}),Object.defineProperty(e,t+"_",{get:function(){return this.populate(r)},enumerable:!1,configurable:!1})}),u(this,"getDocumentPrototype",()=>e),e},t.getPrimaryOfDocumentData=function(e){return A(this.jsonSchema,e)},(0,b.A)(e,[{key:"version",get:function(){return this.jsonSchema.version}},{key:"defaultValues",get:function(){var e={};return Object.entries(this.jsonSchema.properties).filter(([,e])=>Object.prototype.hasOwnProperty.call(e,"default")).forEach(([t,r])=>e[t]=r.default),u(this,"defaultValues",e)}},{key:"hash",get:function(){return u(this,"hash",this.hashFunction(JSON.stringify(this.jsonSchema)))}}])}();function Pt(e,t,r=!0){r&&it("preCreateRxSchema",e);var a=q(e);a=function(e){return o(e,!0)}(a),x.deepFreezeWhenDevMode(a);var n=new jt(a,t);return it("createRxSchema",n),n}var $t=r(7708),Nt=r(8146),Bt=r(3356),Mt=r(5520),At=r(8609);function qt(e){var t=e.split("-"),r="RxDB";return t.forEach(e=>{r+=(0,N.Z2)(e)}),r+="Plugin",new Error("You are using a function which must be overwritten by a plugin.\n You should either prevent the usage of this function or add the plugin via:\n import { "+r+" } from 'rxdb/plugins/"+e+"';\n addRxPlugin("+r+");\n ")}function Tt(e){return e.documentData?e.documentData:e.previousDocumentData}function Lt(e){switch(e.operation){case"INSERT":return{operation:e.operation,id:e.documentId,doc:e.documentData,previous:null};case"UPDATE":return{operation:e.operation,id:e.documentId,doc:x.deepFreezeWhenDevMode(e.documentData),previous:e.previousDocumentData?e.previousDocumentData:"UNKNOWN"};case"DELETE":return{operation:e.operation,id:e.documentId,doc:null,previous:e.previousDocumentData}}}var Qt=new Map;function Wt(e){return i(Qt,e,()=>{for(var t=new Array(e.events.length),r=e.events,a=e.collectionName,n=e.isLocal,i=x.deepFreezeWhenDevMode,s=0;s[]);return new Promise((r,n)=>{var i={lastKnownDocumentState:e,modifier:t,resolve:r,reject:n};(0,me.ZN)(a).push(i),this.triggerRun()})},t.triggerRun=async function(){if(!0!==this.isRunning&&0!==this.queueByDocId.size){this.isRunning=!0;var e=[],t=this.queueByDocId;this.queueByDocId=new Map,await Promise.all(Array.from(t.entries()).map(async([t,r])=>{var a,n,i,s=(a=r.map(e=>e.lastKnownDocumentState),n=a[0],i=rt(n._rev),a.forEach(e=>{var t=rt(e._rev);t>i&&(n=e,i=t)}),n),o=s;for(var u of r)try{o=await u.modifier(c(o))}catch(h){u.reject(h),u.reject=()=>{},u.resolve=()=>{}}try{await this.preWrite(o,s)}catch(h){return void r.forEach(e=>e.reject(h))}e.push({previous:s,document:o})}));var r=e.length>0?await this.storageInstance.bulkWrite(e,"incremental-write"):{error:[]};return await Promise.all(vt(this.primaryPath,e,r).map(e=>{var r=e[this.primaryPath];this.postWrite(e),n(t,r).forEach(t=>t.resolve(e))})),r.error.forEach(e=>{var r=e.documentId,a=n(t,r),s=S(e);if(s){var o=i(this.queueByDocId,r,()=>[]);a.reverse().forEach(e=>{e.lastKnownDocumentState=(0,me.ZN)(s.documentInDb),(0,me.ZN)(o).unshift(e)})}else{var c=P(e);a.forEach(e=>e.reject(c))}}),this.isRunning=!1,this.triggerRun()}},e}();function Ht(e){return async t=>{var r=function(e){return Object.assign({},e,{_meta:void 0,_deleted:void 0,_rev:void 0})}(t);r._deleted=t._deleted;var a=await e(r),n=Object.assign({},a,{_meta:t._meta,_attachments:t._attachments,_rev:t._rev,_deleted:void 0!==a._deleted?a._deleted:t._deleted});return void 0===n._deleted&&(n._deleted=!1),n}}var Kt={get primaryPath(){if(this.isInstanceOfRxDocument)return this.collection.schema.primaryPath},get primary(){var e=this;if(e.isInstanceOfRxDocument)return e._data[e.primaryPath]},get revision(){if(this.isInstanceOfRxDocument)return this._data._rev},get deleted$(){if(this.isInstanceOfRxDocument)return this.$.pipe((0,$t.T)(e=>e._data._deleted))},get deleted$$(){var e=this;return e.collection.database.getReactivityFactory().fromObservable(e.deleted$,e.getLatest().deleted,e.collection.database)},get deleted(){if(this.isInstanceOfRxDocument)return this._data._deleted},getLatest(){var e=this.collection._docCache.getLatestDocumentData(this.primary);return this.collection._docCache.getCachedRxDocument(e)},get $(){var e=this.primary;return this.collection.eventBulks$.pipe((0,Nt.p)(e=>!e.isLocal),(0,$t.T)(t=>t.events.find(t=>t.documentId===e)),(0,Nt.p)(e=>!!e),(0,$t.T)(e=>Tt((0,me.ZN)(e))),(0,Bt.Z)(this.collection._docCache.getLatestDocumentData(e)),(0,Mt.F)((e,t)=>e._rev===t._rev),(0,$t.T)(e=>this.collection._docCache.getCachedRxDocument(e)),(0,At.t)(me.bz))},get $$(){var e=this;return e.collection.database.getReactivityFactory().fromObservable(e.$,e.getLatest()._data,e.collection.database)},get$(e){if(x.isDevMode()){if(e.includes(".item."))throw R("DOC1",{path:e});if(e===this.primaryPath)throw R("DOC2");if(this.collection.schema.finalFields.includes(e))throw R("DOC3",{path:e});if(!B(this.collection.schema.jsonSchema,e))throw R("DOC4",{path:e})}return this.$.pipe((0,$t.T)(t=>v(t,e)),(0,Mt.F)())},get$$(e){var t=this.get$(e);return this.collection.database.getReactivityFactory().fromObservable(t,this.getLatest().get(e),this.collection.database)},populate(e){var t=B(this.collection.schema.jsonSchema,e),r=this.get(e);if(!r)return ue.$A;if(!t)throw R("DOC5",{path:e});if(!t.ref)throw R("DOC6",{path:e,schemaObj:t});var a=this.collection.database.collections[t.ref];if(!a)throw R("DOC7",{ref:t.ref,path:e,schemaObj:t});return"array"===t.type?a.findByIds(r).exec().then(e=>{var t=e.values();return Array.from(t)}):a.findOne(r).exec()},get(e){return Ut(this,e)},toJSON(e=!1){if(e)return x.deepFreezeWhenDevMode(this._data);var t=s(this._data);return delete t._rev,delete t._attachments,delete t._deleted,delete t._meta,x.deepFreezeWhenDevMode(t)},toMutableJSON(e=!1){return c(this.toJSON(e))},update(e){throw qt("update")},incrementalUpdate(e){throw qt("update")},updateCRDT(e){throw qt("crdt")},putAttachment(){throw qt("attachments")},putAttachmentBase64(){throw qt("attachments")},getAttachment(){throw qt("attachments")},allAttachments(){throw qt("attachments")},get allAttachments$(){throw qt("attachments")},async modify(e,t){var r=this._data,a=await Ht(e)(r);return this._saveData(a,r)},incrementalModify(e,t){return this.collection.incrementalWriteQueue.addWrite(this._data,Ht(e)).then(e=>this.collection._docCache.getCachedRxDocument(e))},patch(e){var t=this._data,r=c(t);return Object.entries(e).forEach(([e,t])=>{r[e]=t}),this._saveData(r,t)},incrementalPatch(e){return this.incrementalModify(t=>(Object.entries(e).forEach(([e,r])=>{t[e]=r}),t))},async _saveData(e,t){if(e=s(e),this._data._deleted)throw R("DOC11",{id:this.primary,document:this});await Zt(this.collection,e,t);var r=[{previous:t,document:e}],a=await this.collection.storageInstance.bulkWrite(r,"rx-document-save-data"),n=a.error[0];return ut(this.collection,this.primary,e,n),await this.collection._runHooks("post","save",e,this),this.collection._docCache.getCachedRxDocument(vt(this.collection.schema.primaryPath,r,a)[0])},async remove(){if(this.deleted)return Promise.reject(R("DOC13",{document:this,id:this.primary}));var e=await this.collection.bulkRemove([this]);if(e.error.length>0){var t=e.error[0];ut(this.collection,this.primary,this._data,t)}return e.success[0]},incrementalRemove(){return this.incrementalModify(async e=>(await this.collection._runHooks("pre","remove",e,this),e._deleted=!0,e)).then(async e=>(await this.collection._runHooks("post","remove",e._data,e),e))},close(){throw R("DOC14")}};function zt(e=Kt){var t=function(e,t){this.collection=e,this._data=t,this._propertyCache=new Map,this.isInstanceOfRxDocument=!0};return t.prototype=e,t}function Zt(e,t,r){return t._meta=Object.assign({},r._meta,t._meta),x.isDevMode()&&e.schema.validateChange(r,t),e._runHooks("pre","save",t,r)}function Ut(e,t){return i(e._propertyCache,t,()=>{var r=v(e._data,t);return"object"!=typeof r||null===r||Array.isArray(r)?x.deepFreezeWhenDevMode(r):new Proxy(s(r),{get(r,a){if("string"!=typeof a)return r[a];var n=a.charAt(a.length-1);if("$"===n){if(a.endsWith("$$")){var i=a.slice(0,-2);return e.get$$((0,N.L$)(t+"."+i))}var s=a.slice(0,-1);return e.get$((0,N.L$)(t+"."+s))}if("_"===n){var o=a.slice(0,-1);return e.populate((0,N.L$)(t+"."+o))}var c=r[a];return"number"==typeof c||"string"==typeof c||"boolean"==typeof c?c:Ut(e,(0,N.L$)(t+"."+a))}})})}var Vt=r(2198),Jt=r(4157),Gt=r(2442),Xt=r(6114);function Yt(e,t){return t.sort&&0!==t.sort.length?t.sort.map(e=>Object.keys(e)[0]):[e]}var er=new WeakMap;function tr(e,t){if(!e.collection.database.eventReduce)return{runFullQueryAgain:!0};for(var r=function(e){return i(er,e,()=>{var t=e.collection,r=Ze(t.storageInstance.schema,c(e.mangoQuery)),a=t.schema.primaryPath,n=Ue(t.schema.jsonSchema,r),i=Ve(t.schema.jsonSchema,r);return{primaryKey:e.collection.schema.primaryPath,skip:r.skip,limit:r.limit,sortFields:Yt(a,r),sortComparator:(t,r)=>{var a={docA:t,docB:r,rxQuery:e};return n(a.docA,a.docB)},queryMatcher:t=>i({doc:t,rxQuery:e}.doc)}})}(e),a=(0,me.ZN)(e._result).docsData.slice(0),n=(0,me.ZN)(e._result).docsDataMap,s=!1,o=[],u=0;u{var t={queryParams:r,changeEvent:e,previousResults:a,keyDocumentMap:n},i=(0,Xt.kC)(t);return"runFullQueryAgain"===i||("doNothing"!==i?(s=!0,(0,Xt.Cs)(i,r,e,a,n),!1):void 0)});return l?{runFullQueryAgain:!0}:{runFullQueryAgain:!1,changed:s,newResults:a}}var rr=function(){function e(){this._map=new Map}return e.prototype.getByQuery=function(e){var t=e.toString();return i(this._map,t,()=>e)},e}();function ar(e,t){t.uncached=!0;var r=t.toString();e._map.delete(r)}function nr(e){return e.refCount$.observers.length}var ir,sr,or=(ir=100,sr=3e4,(e,t)=>{if(!(t._map.size0||(0===i._lastEnsureEqual&&i._creationTimee._lastEnsureEqual-t._lastEnsureEqual).slice(0,s).forEach(e=>ar(t,e))}}),cr=new WeakSet;var ur=function(){function e(e,t,r){this.cacheItemByDocId=new Map,this.tasks=new Set,this.registry="function"==typeof FinalizationRegistry?new FinalizationRegistry(e=>{var t=e.docId,r=this.cacheItemByDocId.get(t);r&&(r[0].delete(e.revisionHeight+e.lwt+""),0===r[0].size&&this.cacheItemByDocId.delete(t))}):void 0,this.primaryPath=e,this.changes$=t,this.documentCreator=r,t.subscribe(e=>{this.tasks.add(()=>{for(var t=this.cacheItemByDocId,r=0;r{this.processTasks()})})}var t=e.prototype;return t.processTasks=function(){0!==this.tasks.size&&(Array.from(this.tasks).forEach(e=>e()),this.tasks.clear())},t.getLatestDocumentData=function(e){return this.processTasks(),n(this.cacheItemByDocId,e)[1]},t.getLatestDocumentDataIfExists=function(e){this.processTasks();var t=this.cacheItemByDocId.get(e);if(t)return t[1]},(0,b.A)(e,[{key:"getCachedRxDocuments",get:function(){return u(this,"getCachedRxDocuments",hr(this))}},{key:"getCachedRxDocument",get:function(){var e=hr(this);return u(this,"getCachedRxDocument",t=>e([t])[0])}}])}();function hr(e){var t=e.primaryPath,r=e.cacheItemByDocId,a=e.registry,n=x.deepFreezeWhenDevMode,i=e.documentCreator;return s=>{for(var o=new Array(s.length),c=[],u=0;u0&&a&&(e.tasks.add(()=>{for(var e=0;e{e.processTasks()})),o}}function lr(e,t){return(0,e.getCachedRxDocuments)(t)}var dr="function"==typeof WeakRef?function(e){return new WeakRef(e)}:function(e){return{deref:()=>e}};var mr=function(){function e(e,t,r){this.time=ie(),this.query=e,this.count=r,this.documents=lr(this.query.collection._docCache,t)}return e.prototype.getValue=function(e){var t=this.query.op;if("count"===t)return this.count;if("findOne"===t){var r=0===this.documents.length?null:this.documents[0];if(!r&&e)throw R("QU10",{collection:this.query.collection.name,query:this.query.mangoQuery,op:t});return r}return"findByIds"===t?this.docsMap:this.documents.slice(0)},(0,b.A)(e,[{key:"docsData",get:function(){return u(this,"docsData",this.documents.map(e=>e._data))}},{key:"docsDataMap",get:function(){var e=new Map;return this.documents.forEach(t=>{e.set(t.primary,t._data)}),u(this,"docsDataMap",e)}},{key:"docsMap",get:function(){for(var e=new Map,t=this.documents,r=0;r"string"!=typeof e))return r.$eq}return!1}(this.collection.schema.primaryPath,t)}var t=e.prototype;return t._setResultData=function(e){if(void 0===e)throw R("QU18",{database:this.collection.database.name,collection:this.collection.name});if("number"!=typeof e){e instanceof Map&&(e=Array.from(e.values()));var t=new mr(this,e,e.length);this._result=t}else this._result=new mr(this,[],e)},t._execOverDatabase=async function(){if(this._execOverDatabaseCount=this._execOverDatabaseCount+1,"count"===this.op){var e=this.getPreparedQuery(),t=await this.collection.storageInstance.count(e);if("slow"!==t.mode||this.collection.database.allowSlowCount)return{result:t.count,counter:this.collection._changeEventBuffer.getCounter()};throw R("QU14",{collection:this.collection,queryObj:this.mangoQuery})}if("findByIds"===this.op){var r=(0,me.ZN)(this.mangoQuery.selector)[this.collection.schema.primaryPath].$in,a=new Map,n=[];if(r.forEach(e=>{var t=this.collection._docCache.getLatestDocumentDataIfExists(e);if(t){if(!t._deleted){var r=this.collection._docCache.getCachedRxDocument(t);a.set(e,r)}}else n.push(e)}),n.length>0)(await this.collection.storageInstance.findDocumentsById(n,!1)).forEach(e=>{var t=this.collection._docCache.getCachedRxDocument(e);a.set(t.primary,t)});return{result:a,counter:this.collection._changeEventBuffer.getCounter()}}var i=await gr(this);return{result:i.docs,counter:i.counter}},t.exec=async function(e){if(e&&"findOne"!==this.op)throw R("QU9",{collection:this.collection.name,query:this.mangoQuery,op:this.op});return await yr(this),(0,me.ZN)(this._result).getValue(e)},t.toString=function(){var e=o({op:this.op,query:Ze(this.collection.schema.jsonSchema,this.mangoQuery),other:this.other},!0),t=JSON.stringify(e);return this.toString=()=>t,t},t.getPreparedQuery=function(){var e={rxQuery:this,mangoQuery:Ze(this.collection.schema.jsonSchema,this.mangoQuery)};e.mangoQuery.selector._deleted={$eq:!1},e.mangoQuery.index&&e.mangoQuery.index.unshift("_deleted"),it("prePrepareQuery",e);var t=Ge(this.collection.schema.jsonSchema,e.mangoQuery);return this.getPreparedQuery=()=>t,t},t.doesDocumentDataMatch=function(e){return!e._deleted&&this.queryMatcher(e)},t.remove=async function(){var e=await this.exec();if(Array.isArray(e)){var t=await this.collection.bulkRemove(e);if(t.error.length>0)throw P(t.error[0]);return t.success}return e.remove()},t.incrementalRemove=function(){return Je(this.asRxQuery,e=>e.incrementalRemove())},t.update=function(e){throw qt("update")},t.patch=function(e){return Je(this.asRxQuery,t=>t.patch(e))},t.incrementalPatch=function(e){return Je(this.asRxQuery,t=>t.incrementalPatch(e))},t.modify=function(e){return Je(this.asRxQuery,t=>t.modify(e))},t.incrementalModify=function(e){return Je(this.asRxQuery,t=>t.incrementalModify(e))},t.where=function(e){throw qt("query-builder")},t.sort=function(e){throw qt("query-builder")},t.skip=function(e){throw qt("query-builder")},t.limit=function(e){throw qt("query-builder")},(0,b.A)(e,[{key:"$",get:function(){if(!this._$){var e=this.collection.eventBulks$.pipe((0,Nt.p)(e=>!e.isLocal),(0,Bt.Z)(null),(0,Gt.Z)(()=>yr(this)),(0,$t.T)(()=>this._result),(0,At.t)(me.bz),(0,Mt.F)((e,t)=>!(!e||e.time!==(0,me.ZN)(t).time)),(0,Nt.p)(e=>!!e),(0,$t.T)(e=>(0,me.ZN)(e).getValue()));this._$=(0,Jt.h)(e,this.refCount$.pipe((0,Nt.p)(()=>!1)))}return this._$}},{key:"$$",get:function(){return this.collection.database.getReactivityFactory().fromObservable(this.$,void 0,this.collection.database)}},{key:"queryMatcher",get:function(){this.collection.schema.jsonSchema;return u(this,"queryMatcher",Ve(0,Ze(this.collection.schema.jsonSchema,this.mangoQuery)))}},{key:"asRxQuery",get:function(){return this}}])}();function vr(e,t,r,a){it("preCreateRxQuery",{op:e,queryObj:t,collection:r,other:a});var n,i,s=new pr(e,t,r,a);return s=(n=s).collection._queryCache.getByQuery(n),i=r,cr.has(i)||(cr.add(i),(0,ue.dY)().then(()=>(0,ue.Ve)(200)).then(()=>{i.closed||i.cacheReplacementPolicy(i,i._queryCache),cr.delete(i)})),s}async function yr(e){return e.collection.awaitBeforeReads.size>0&&await Promise.all(Array.from(e.collection.awaitBeforeReads).map(e=>e())),e._ensureEqualQueue=e._ensureEqualQueue.then(()=>function(e){if(e._lastEnsureEqual=ie(),e.collection.database.closed||function(e){var t=e.asRxQuery.collection._changeEventBuffer.getCounter();return e._latestChangeEvent>=t}(e))return ue.Dr;var t=!1,r=!1;-1===e._latestChangeEvent&&(r=!0);if(!r){var a=e.asRxQuery.collection._changeEventBuffer.getFrom(e._latestChangeEvent+1);if(null===a)r=!0;else{e._latestChangeEvent=e.asRxQuery.collection._changeEventBuffer.getCounter();var n=e.asRxQuery.collection._changeEventBuffer.reduceByLastOfDoc(a);if("count"===e.op){var i=(0,me.ZN)(e._result).count,s=i;n.forEach(t=>{var r=t.previousDocumentData&&e.doesDocumentDataMatch(t.previousDocumentData),a=e.doesDocumentDataMatch(t.documentData);!r&&a&&s++,r&&!a&&s--}),s!==i&&(t=!0,e._setResultData(s))}else{var o=tr(e,n);o.runFullQueryAgain?r=!0:o.changed&&(t=!0,e._setResultData(o.newResults))}}}if(r)return e._execOverDatabase().then(r=>{var a=r.result;return e._latestChangeEvent=r.counter,"number"==typeof a?(e._result&&a===e._result.count||(t=!0,e._setResultData(a)),t):(e._result&&function(e,t,r){if(t.length!==r.length)return!1;for(var a=0,n=t.length;a{a++});if(e.isFindOneByIdQuery)if(Array.isArray(e.isFindOneByIdQuery)){var i=e.isFindOneByIdQuery;if(i=i.filter(r=>{var a=e.collection._docCache.getLatestDocumentDataIfExists(r);return!a||(a._deleted||t.push(a),!1)}),i.length>0){var s=await r.storageInstance.findDocumentsById(i,!1);t=t.concat(s)}}else{var o=e.isFindOneByIdQuery,c=e.collection._docCache.getLatestDocumentDataIfExists(o);if(!c){var u=await r.storageInstance.findDocumentsById([o],!1);u[0]&&(c=u[0])}c&&!c._deleted&&t.push(c)}else{var h=e.getPreparedQuery(),l=await r.storageInstance.query(h);t=l.documents}return n.unsubscribe(),a>0?(await(0,ue.ND)(0),gr(e)):{docs:t,counter:r._changeEventBuffer.getCounter()}}var br="collection",wr="storage-token",Dr=q({version:0,title:"RxInternalDocument",primaryKey:{key:"id",fields:["context","key"],separator:"|"},type:"object",properties:{id:{type:"string",maxLength:200},key:{type:"string"},context:{type:"string",enum:[br,wr,"rx-migration-status","rx-pipeline-checkpoint","OTHER"]},data:{type:"object",additionalProperties:!0}},indexes:[],required:["key","context","data"],additionalProperties:!1,sharding:{shards:1,mode:"collection"}});function xr(e,t){return A(Dr,{key:e,context:t})}async function _r(e){var t=Ge(e.schema,{selector:{context:br,_deleted:{$eq:!1}},sort:[{id:"asc"}],skip:0});return(await e.query(t)).documents}var kr="storageToken",Ir=xr(kr,wr);function Er(e,t){return e+"-"+t.version}function Cr(e,t){return t=function(e,t){for(var r=Object.keys(e.defaultValues),a=0;ae.data.name===n),u=[];c.forEach(e=>{u.push({collectionName:e.data.name,schema:e.data.schema,isCollection:!0}),e.data.connectedStorages.forEach(e=>u.push({collectionName:e.collectionName,isCollection:!1,schema:e.schema}))});var h=new Set;if(u=u.filter(e=>{var t=e.collectionName+"||"+e.schema.version;return!h.has(t)&&(h.add(t),!0)}),await Promise.all(u.map(async t=>{var o=await e.createStorageInstance({collectionName:t.collectionName,databaseInstanceToken:r,databaseName:a,multiInstance:i,options:{},schema:t.schema,password:s,devMode:x.isDevMode()});await o.remove(),t.isCollection&&await st("postRemoveRxCollection",{storage:e,databaseName:a,collectionName:n})})),o){var l=c.map(e=>{var t=dt(e);return t._deleted=!0,t._meta.lwt=ie(),t._rev=at(r,e),{previous:e,document:t}});await t.bulkWrite(l,"rx-database-remove-collection-all")}}function Or(e){if(e.closed)throw R("COL21",{collection:e.name,version:e.schema.version})}var Sr=function(){function e(e){this.subs=[],this.counter=0,this.eventCounterMap=new WeakMap,this.buffer=[],this.limit=100,this.tasks=new Set,this.collection=e,this.subs.push(this.collection.eventBulks$.pipe((0,Nt.p)(e=>!e.isLocal)).subscribe(e=>{this.tasks.add(()=>this._handleChangeEvents(e.events)),this.tasks.size<=1&&(0,ue.vN)().then(()=>{this.processTasks()})}))}var t=e.prototype;return t.processTasks=function(){0!==this.tasks.size&&(Array.from(this.tasks).forEach(e=>e()),this.tasks.clear())},t._handleChangeEvents=function(e){var t=this.counter;this.counter=this.counter+e.length,e.length>this.limit?this.buffer=e.slice(-1*e.length):(this.buffer=this.buffer.concat(e),this.buffer=this.buffer.slice(-1*this.limit));for(var r=t+1,a=this.eventCounterMap,n=0;nt(e))},t.reduceByLastOfDoc=function(e){return this.processTasks(),e.slice(0)},t.close=function(){this.tasks.clear(),this.subs.forEach(e=>e.unsubscribe())},e}();var jr=new WeakMap;function Pr(e){var t=e.schema.getDocumentPrototype(),r=function(e){var t={};return Object.entries(e.methods).forEach(([e,r])=>{t[e]=r}),t}(e),a={};return[t,r,Kt].forEach(e=>{Object.getOwnPropertyNames(e).forEach(t=>{var r=Object.getOwnPropertyDescriptor(e,t),n=!0;(t.startsWith("_")||t.endsWith("_")||t.startsWith("$")||t.endsWith("$"))&&(n=!1),"function"==typeof r.value?Object.defineProperty(a,t,{get(){return r.value.bind(this)},enumerable:n,configurable:!1}):(r.enumerable=n,r.configurable=!1,r.writable&&(r.writable=!1),Object.defineProperty(a,t,r))})}),a}function $r(e,t,r){var a=function(e,t,r){var a=new e(t,r);return it("createRxDocument",a),a}(t,e,x.deepFreezeWhenDevMode(r));return e._runHooksSync("post","create",r,a),it("postCreateRxDocument",a),a}var Nr={isEqual:(e,t,r)=>(e=Br(e),t=Br(t),(0,St.b)(lt(e),lt(t))),resolve:e=>e.realMasterState};function Br(e){return e._attachments||((e=s(e))._attachments={}),e}var Mr=["pre","post"],Ar=["insert","save","remove","create"],qr=!1,Tr=new Set,Lr=function(){function e(e,t,r,a,n={},i={},s={},o={},c={},u=or,h={},l=Nr){this.storageInstance={},this.timeouts=new Set,this.incrementalWriteQueue={},this.awaitBeforeReads=new Set,this._incrementalUpsertQueues=new Map,this.synced=!1,this.hooks={},this._subs=[],this._docCache={},this._queryCache=new rr,this.$={},this.checkpoint$={},this._changeEventBuffer={},this.eventBulks$={},this.onClose=[],this.closed=!1,this.onRemove=[],this.database=e,this.name=t,this.schema=r,this.internalStorageInstance=a,this.instanceCreationOptions=n,this.migrationStrategies=i,this.methods=s,this.attachments=o,this.options=c,this.cacheReplacementPolicy=u,this.statics=h,this.conflictHandler=l,function(e){if(qr)return;qr=!0;var t=Object.getPrototypeOf(e);Ar.forEach(e=>{Mr.map(r=>{var a=r+(0,N.Z2)(e);t[a]=function(t,a){return this.addHook(r,e,t,a)}})})}(this.asRxCollection),e&&(this.eventBulks$=e.eventBulks$.pipe((0,Nt.p)(e=>e.collectionName===this.name))),this.database&&Tr.add(this)}var t=e.prototype;return t.prepare=async function(){if(!await de()){for(var e=0;e<10&&Tr.size>16;)e++,await this.promiseWait(30);if(Tr.size>16)throw R("COL23",{database:this.database.name,collection:this.name,args:{existing:Array.from(Tr.values()).map(e=>({db:e.database?e.database.name:"",c:e.name}))}})}var t,r;this.storageInstance=mt(this.database,this.internalStorageInstance,this.schema.jsonSchema),this.incrementalWriteQueue=new Ft(this.storageInstance,this.schema.primaryPath,(e,t)=>Zt(this,e,t),e=>this._runHooks("post","save",e)),this.$=this.eventBulks$.pipe((0,Gt.Z)(e=>Wt(e))),this.checkpoint$=this.eventBulks$.pipe((0,$t.T)(e=>e.checkpoint)),this._changeEventBuffer=(t=this.asRxCollection,new Sr(t)),this._docCache=new ur(this.schema.primaryPath,this.eventBulks$.pipe((0,Nt.p)(e=>!e.isLocal),(0,$t.T)(e=>e.events)),e=>{var t;return r||(t=this.asRxCollection,r=i(jr,t,()=>zt(Pr(t)))),$r(this.asRxCollection,r,e)});var a=this.database.internalStore.changeStream().pipe((0,Nt.p)(e=>{var t=this.name+"-"+this.schema.version;return!!e.events.find(e=>"collection"===e.documentData.context&&e.documentData.key===t&&"DELETE"===e.operation)})).subscribe(async()=>{await this.close(),await Promise.all(this.onRemove.map(e=>e()))});this._subs.push(a);var n=await this.database.storageToken,s=this.storageInstance.changeStream().subscribe(e=>{var t={id:e.id,isLocal:!1,internal:!1,collectionName:this.name,storageToken:n,events:e.events,databaseToken:this.database.token,checkpoint:e.checkpoint,context:e.context};this.database.$emit(t)});return this._subs.push(s),ue.em},t.cleanup=function(e){throw Or(this),qt("cleanup")},t.migrationNeeded=function(){throw qt("migration-schema")},t.getMigrationState=function(){throw qt("migration-schema")},t.startMigration=function(e=10){return Or(this),this.getMigrationState().startMigration(e)},t.migratePromise=function(e=10){return this.getMigrationState().migratePromise(e)},t.insert=async function(e){Or(this);var t=await this.bulkInsert([e]),r=t.error[0];return ut(this,e[this.schema.primaryPath],e,r),(0,me.ZN)(t.success[0])},t.insertIfNotExists=async function(e){var t=await this.bulkInsert([e]);if(t.error.length>0){var r=t.error[0];if(409===r.status){var a=r.documentInDb;return lr(this._docCache,[a])[0]}throw r}return t.success[0]},t.bulkInsert=async function(e){if(Or(this),0===e.length)return{success:[],error:[]};var t,r=this.schema.primaryPath,a=new Set;if(this.hasHooks("pre","insert"))t=await Promise.all(e.map(e=>{var t=Cr(this.schema,e);return this._runHooks("pre","insert",t).then(()=>(a.add(t[r]),{document:t}))}));else{t=new Array(e.length);for(var n=this.schema,i=0;i{var t=e.document;l.set(t[r],t)}),await Promise.all(h.success.map(e=>this._runHooks("post","insert",l.get(e.primary),e)))}return h},t.bulkRemove=async function(e){Or(this);var t,r=this.schema.primaryPath;if(0===e.length)return{success:[],error:[]};"string"==typeof e[0]?t=await this.findByIds(e).exec():(t=new Map,e.forEach(e=>t.set(e.primary,e)));var a=[],n=new Map;Array.from(t.values()).forEach(e=>{var t=e.toMutableJSON(!0);a.push(t),n.set(e.primary,t)}),await Promise.all(a.map(e=>{var r=e[this.schema.primaryPath];return this._runHooks("pre","remove",e,t.get(r))}));var i=a.map(e=>{var t=s(e);return t._deleted=!0,{previous:e,document:t}}),o=await this.storageInstance.bulkWrite(i,"rx-collection-bulk-remove"),c=vt(this.schema.primaryPath,i,o),u=[],h=c.map(e=>{var t=e[r],a=this._docCache.getCachedRxDocument(e);return u.push(a),t});return await Promise.all(h.map(e=>this._runHooks("post","remove",n.get(e),t.get(e)))),{success:u,error:o.error}},t.bulkUpsert=async function(e){Or(this);var t=[],r=new Map;e.forEach(e=>{var a=Cr(this.schema,e),n=a[this.schema.primaryPath];if(!n)throw R("COL3",{primaryPath:this.schema.primaryPath,data:a,schema:this.schema.jsonSchema});r.set(n,a),t.push(a)});var a=await this.bulkInsert(t),i=a.success.slice(0),s=[];return await Promise.all(a.error.map(async e=>{if(409!==e.status)s.push(e);else{var t=e.documentId,a=n(r,t),o=(0,me.ZN)(e.documentInDb),c=this._docCache.getCachedRxDocuments([o])[0],u=await c.incrementalModify(()=>a);i.push(u)}})),{error:s,success:i}},t.upsert=async function(e){Or(this);var t=await this.bulkUpsert([e]);return ut(this.asRxCollection,e[this.schema.primaryPath],e,t.error[0]),t.success[0]},t.incrementalUpsert=function(e){Or(this);var t=Cr(this.schema,e),r=t[this.schema.primaryPath];if(!r)throw R("COL4",{data:e});var a=this._incrementalUpsertQueues.get(r);return a||(a=ue.em),a=a.then(()=>function(e,t,r){var a=e._docCache.getLatestDocumentDataIfExists(t);if(a)return Promise.resolve({doc:e._docCache.getCachedRxDocuments([a])[0],inserted:!1});return e.findOne(t).exec().then(t=>t?{doc:t,inserted:!1}:e.insert(r).then(e=>({doc:e,inserted:!0})))}(this,r,t)).then(e=>e.inserted?e.doc:function(e,t){return e.incrementalModify(e=>t)}(e.doc,t)),this._incrementalUpsertQueues.set(r,a),a},t.find=function(e){return Or(this),it("prePrepareRxQuery",{op:"find",queryObj:e,collection:this}),e||(e={selector:{}}),vr("find",e,this)},t.findOne=function(e){var t;if(Or(this),it("prePrepareRxQuery",{op:"findOne",queryObj:e,collection:this}),"string"==typeof e)t=vr("findOne",{selector:{[this.schema.primaryPath]:e},limit:1},this);else{if(e||(e={selector:{}}),e.limit)throw R("QU6");(e=s(e)).limit=1,t=vr("findOne",e,this)}return t},t.count=function(e){return Or(this),e||(e={selector:{}}),vr("count",e,this)},t.findByIds=function(e){return Or(this),vr("findByIds",{selector:{[this.schema.primaryPath]:{$in:e.slice(0)}}},this)},t.exportJSON=function(){throw qt("json-dump")},t.importJSON=function(e){throw qt("json-dump")},t.insertCRDT=function(e){throw qt("crdt")},t.addPipeline=function(e){throw qt("pipeline")},t.addHook=function(e,t,r,a=!1){if("function"!=typeof r)throw O("COL7",{key:t,when:e});if(!Mr.includes(e))throw O("COL8",{key:t,when:e});if(!Ar.includes(t))throw R("COL9",{key:t});if("post"===e&&"create"===t&&!0===a)throw R("COL10",{when:e,key:t,parallel:a});var n=r.bind(this),i=a?"parallel":"series";this.hooks[t]=this.hooks[t]||{},this.hooks[t][e]=this.hooks[t][e]||{series:[],parallel:[]},this.hooks[t][e][i].push(n)},t.getHooks=function(e,t){return this.hooks[t]&&this.hooks[t][e]?this.hooks[t][e]:{series:[],parallel:[]}},t.hasHooks=function(e,t){if(!this.hooks[t]||!this.hooks[t][e])return!1;var r=this.getHooks(e,t);return!!r&&(r.series.length>0||r.parallel.length>0)},t._runHooks=function(e,t,r,a){var n=this.getHooks(e,t);if(!n)return ue.em;var i=n.series.map(e=>()=>e(r,a));return(0,ue.h$)(i).then(()=>Promise.all(n.parallel.map(e=>e(r,a))))},t._runHooksSync=function(e,t,r,a){if(this.hasHooks(e,t)){var n=this.getHooks(e,t);n&&n.series.forEach(e=>e(r,a))}},t.promiseWait=function(e){return new Promise(t=>{var r=setTimeout(()=>{this.timeouts.delete(r),t()},e);this.timeouts.add(r)})},t.close=async function(){return this.closed?ue.Dr:(Tr.delete(this),await Promise.all(this.onClose.map(e=>e())),this.closed=!0,Array.from(this.timeouts).forEach(e=>clearTimeout(e)),this._changeEventBuffer&&this._changeEventBuffer.close(),this.database.requestIdlePromise().then(()=>this.storageInstance.close()).then(()=>(this._subs.forEach(e=>e.unsubscribe()),delete this.database.collections[this.name],this.database.collectionsSubject$.next({collection:this.asRxCollection,type:"CLOSED"}),st("postCloseRxCollection",this).then(()=>!0))))},t.remove=async function(){await this.close(),await Promise.all(this.onRemove.map(e=>e())),await Rr(this.database.storage,this.database.internalStore,this.database.token,this.database.name,this.name,this.database.multiInstance,this.database.password,this.database.hashFunction)},(0,b.A)(e,[{key:"insert$",get:function(){return this.$.pipe((0,Nt.p)(e=>"INSERT"===e.operation))}},{key:"update$",get:function(){return this.$.pipe((0,Nt.p)(e=>"UPDATE"===e.operation))}},{key:"remove$",get:function(){return this.$.pipe((0,Nt.p)(e=>"DELETE"===e.operation))}},{key:"asRxCollection",get:function(){return this}}])}();var Qr=r(7635),Wr=r(5525),Fr=new Set,Hr=new Map,Kr=function(){function e(e,t,r,a,n,i,s=!1,o={},c,u,h,l,d,m){this.idleQueue=new Qr.G,this.rxdbVersion=Ct,this.storageInstances=new Set,this._subs=[],this.startupErrors=[],this.onClose=[],this.closed=!1,this.collections={},this.states={},this.eventBulks$=new ae.B,this.closePromise=null,this.collectionsSubject$=new ae.B,this.observable$=this.eventBulks$.pipe((0,Gt.Z)(e=>Wt(e))),this.storageToken=ue.Dr,this.storageTokenDocument=ue.Dr,this.emittedEventBulkIds=new Wr.p4(6e4),this.name=e,this.token=t,this.storage=r,this.instanceCreationOptions=a,this.password=n,this.multiInstance=i,this.eventReduce=s,this.options=o,this.internalStore=c,this.hashFunction=u,this.cleanupPolicy=h,this.allowSlowCount=l,this.reactivity=d,this.onClosed=m,"pseudoInstance"!==this.name&&(this.internalStore=mt(this.asRxDatabase,c,Dr),this.storageTokenDocument=async function(e){var t=(0,N.zs)(10),r=e.password?await e.hashFunction(JSON.stringify(e.password)):void 0,a=[{document:{id:Ir,context:wr,key:kr,data:{rxdbVersion:e.rxdbVersion,token:t,instanceToken:e.token,passwordHash:r},_deleted:!1,_meta:{lwt:1},_rev:"",_attachments:{}}}],n=await e.internalStore.bulkWrite(a,"internal-add-storage-token");if(!n.error[0])return vt("id",a,n)[0];var i=(0,me.ZN)(n.error[0]);if(i.isError&&S(i)){var s=i;if(!function(e,t){if(!e)return!1;var r=e.split(".")[0],a=t.split(".")[0];return"16"===r&&"17"===a||r===a}(s.documentInDb.data.rxdbVersion,e.rxdbVersion))throw R("DM5",{args:{database:e.name,databaseStateVersion:s.documentInDb.data.rxdbVersion,codeVersion:e.rxdbVersion}});if(r&&r!==s.documentInDb.data.passwordHash)throw R("DB1",{passwordHash:r,existingPasswordHash:s.documentInDb.data.passwordHash});var o=s.documentInDb;return(0,me.ZN)(o)}throw i}(this.asRxDatabase).catch(e=>this.startupErrors.push(e)),this.storageToken=this.storageTokenDocument.then(e=>e.data.token).catch(e=>this.startupErrors.push(e)))}var t=e.prototype;return t.getReactivityFactory=function(){if(!this.reactivity)throw R("DB14",{database:this.name});return this.reactivity},t[Symbol.asyncDispose]=async function(){await this.close()},t.$emit=function(e){this.emittedEventBulkIds.has(e.id)||(this.emittedEventBulkIds.add(e.id),this.eventBulks$.next(e))},t.removeCollectionDoc=async function(e,t){var r=await ot(this.internalStore,xr(Er(e,t),br));if(!r)throw R("SNH",{name:e,schema:t});var a=dt(r);a._deleted=!0,await this.internalStore.bulkWrite([{document:a,previous:r}],"rx-database-remove-collection")},t.addCollections=async function(e){var t={},r={},a=[],n={};await Promise.all(Object.entries(e).map(async([e,i])=>{var o=e,c=i.schema;t[o]=c;var u=Pt(c,this.hashFunction);if(r[o]=u,this.collections[e])throw R("DB3",{name:e});var h=Er(e,c),l={id:xr(h,br),key:h,context:br,data:{name:o,schemaHash:await u.hash,schema:u.jsonSchema,version:u.version,connectedStorages:[]},_deleted:!1,_meta:{lwt:1},_rev:"",_attachments:{}};a.push({document:l});var d=Object.assign({},i,{name:o,schema:u,database:this}),m=s(i);m.database=this,m.name=e,it("preCreateRxCollection",m),d.conflictHandler=m.conflictHandler,n[o]=d}));var i=await this.internalStore.bulkWrite(a,"rx-database-add-collection");await async function(e){if(await e.storageToken,e.startupErrors[0])throw e.startupErrors[0]}(this),await Promise.all(i.error.map(async e=>{if(409!==e.status)throw R("DB12",{database:this.name,writeError:e});var a=(0,me.ZN)(e.documentInDb),n=a.data.name,i=r[n];if(a.data.schemaHash!==await i.hash)throw R("DB6",{database:this.name,collection:n,previousSchemaHash:a.data.schemaHash,schemaHash:await i.hash,previousSchema:a.data.schema,schema:(0,me.ZN)(t[n])})}));var o={};return await Promise.all(Object.keys(e).map(async e=>{var t=n[e],r=await async function({database:e,name:t,schema:r,instanceCreationOptions:a={},migrationStrategies:n={},autoMigrate:i=!0,statics:s={},methods:o={},attachments:c={},options:u={},localDocuments:h=!1,cacheReplacementPolicy:l=or,conflictHandler:d=Nr}){var m={databaseInstanceToken:e.token,databaseName:e.name,collectionName:t,schema:r.jsonSchema,options:a,multiInstance:e.multiInstance,password:e.password,devMode:x.isDevMode()};it("preCreateRxStorageInstance",m);var f=await async function(e,t){return t.multiInstance=e.multiInstance,await e.storage.createStorageInstance(t)}(e,m),p=new Lr(e,t,r,f,a,n,o,c,u,l,s,d);try{await p.prepare(),Object.entries(s).forEach(([e,t])=>{Object.defineProperty(p,e,{get:()=>t.bind(p)})}),it("createRxCollection",{collection:p,creator:{name:t,schema:r,storageInstance:f,instanceCreationOptions:a,migrationStrategies:n,methods:o,attachments:c,options:u,cacheReplacementPolicy:l,localDocuments:h,statics:s}}),i&&0!==p.schema.version&&await p.migratePromise()}catch(v){throw Tr.delete(p),await f.close(),v}return p}(t);o[e]=r,this.collections[e]=r,this.collectionsSubject$.next({collection:r,type:"ADDED"}),this[e]||Object.defineProperty(this,e,{get:()=>this.collections[e]})})),o},t.lockedRun=function(e){return this.idleQueue.wrapCall(e)},t.requestIdlePromise=function(){return this.idleQueue.requestIdlePromise()},t.exportJSON=function(e){throw qt("json-dump")},t.addState=function(e){throw qt("state")},t.importJSON=function(e){throw qt("json-dump")},t.backup=function(e){throw qt("backup")},t.leaderElector=function(){throw qt("leader-election")},t.isLeader=function(){throw qt("leader-election")},t.waitForLeadership=function(){throw qt("leader-election")},t.migrationStates=function(){throw qt("migration-schema")},t.close=function(){if(this.closePromise)return this.closePromise;var{promise:e,resolve:t}=zr(),r=e=>{this.onClosed&&this.onClosed(),this.closed=!0,t(e)};return this.closePromise=e,(async()=>{if(await st("preCloseRxDatabase",this),this.eventBulks$.complete(),this.collectionsSubject$.complete(),this._subs.map(e=>e.unsubscribe()),"pseudoInstance"!==this.name)return this.requestIdlePromise().then(()=>Promise.all(this.onClose.map(e=>e()))).then(()=>Promise.all(Object.keys(this.collections).map(e=>this.collections[e]).map(e=>e.close()))).then(()=>this.internalStore.close()).then(()=>r(!0));r(!1)})(),e},t.remove=function(){return this.close().then(()=>async function(e,t,r=!0,a){var n=(0,N.zs)(10),i=await Ur(n,t,e,{},r,a),s=await _r(i),o=new Set;s.forEach(e=>o.add(e.data.name));var c=Array.from(o);return await Promise.all(c.map(s=>Rr(t,i,n,e,s,r,a))),await st("postRemoveRxDatabase",{databaseName:e,storage:t}),await i.remove(),c}(this.name,this.storage,this.multiInstance,this.password))},(0,b.A)(e,[{key:"$",get:function(){return this.observable$}},{key:"collections$",get:function(){return this.collectionsSubject$.asObservable()}},{key:"asRxDatabase",get:function(){return this}}])}();function zr(){var e,t;return{promise:new Promise((r,a)=>{e=r,t=a}),resolve:e,reject:t}}function Zr(e,t){return t.name+"|"+e}async function Ur(e,t,r,a,n,i){return await t.createStorageInstance({databaseInstanceToken:e,databaseName:r,collectionName:"_rxdb_internal",schema:Dr,options:a,multiInstance:n,password:i,devMode:x.isDevMode()})}function Vr({storage:e,instanceCreationOptions:t,name:r,password:a,multiInstance:n=!0,eventReduce:i=!0,ignoreDuplicate:s=!1,options:o={},cleanupPolicy:c,closeDuplicates:u=!1,allowSlowCount:h=!1,localDocuments:l=!1,hashFunction:d=ce,reactivity:m}){it("preCreateRxDatabase",{storage:e,instanceCreationOptions:t,name:r,password:a,multiInstance:n,eventReduce:i,ignoreDuplicate:s,options:o,localDocuments:l});var f=Zr(r,e),p=Hr.get(f)||new Set,v=zr(),y=Array.from(p),g=()=>{p.delete(v.promise),Fr.delete(f)};return p.add(v.promise),Hr.set(f,p),(async()=>{if(u&&await Promise.all(y.map(e=>e.catch(()=>null).then(e=>e&&e.close()))),s){if(!x.isDevMode())throw R("DB9",{database:r})}else!function(e,t){if(Fr.has(Zr(e,t)))throw R("DB8",{name:e,storage:t.name,link:"https://rxdb.info/rx-database.html#ignoreduplicate"})}(r,e);Fr.add(f);var p=(0,N.zs)(10),v=await Ur(p,e,r,t,n,a),b=new Kr(r,p,e,t,a,n,i,o,v,d,c,h,m,g);return await st("createRxDatabase",{database:b,creator:{storage:e,instanceCreationOptions:t,name:r,password:a,multiInstance:n,eventReduce:i,ignoreDuplicate:s,options:o,localDocuments:l}}),b})().then(e=>{v.resolve(e)}).catch(e=>{v.reject(e),g()}),v.promise}var Jr={RxSchema:jt.prototype,RxDocument:Kt,RxQuery:pr.prototype,RxCollection:Lr.prototype,RxDatabase:Kr.prototype},Gr=new Set,Xr=new Set;var Yr=new WeakMap,ea=new WeakMap;function ta(e){var t=Yr.get(e);if(!t){var r=e.database?e.database:e,a=e.database?e.name:"";throw R("LD8",{database:r.name,collection:a})}return t}function ra(e,t,r,a,n,i){return t.createStorageInstance({databaseInstanceToken:e,databaseName:r,collectionName:ia(a),schema:sa,options:n,multiInstance:i,devMode:x.isDevMode()})}function aa(e){var t=Yr.get(e);if(t)return Yr.delete(e),t.then(e=>e.storageInstance.close())}async function na(e,t,r){var a=(0,N.zs)(10),n=await ra(a,e,t,r,{},!1);await n.remove()}function ia(e){return"plugin-local-documents-"+e}var sa=q({title:"RxLocalDocument",version:0,primaryKey:"id",type:"object",properties:{id:{type:"string",maxLength:128},data:{type:"object",additionalProperties:!0}},required:["id","data"]});async function oa(e,t){var r=await ta(this),a={id:e,data:t,_deleted:!1,_meta:{lwt:1},_rev:"",_attachments:{}};return ct(r.storageInstance,{document:a},"local-document-insert").then(e=>r.docCache.getCachedRxDocument(e))}function ca(e,t){return this.getLocal(e).then(r=>r?r.incrementalModify(()=>t):this.insertLocal(e,t))}async function ua(e){var t=await ta(this),r=t.docCache,a=r.getLatestDocumentDataIfExists(e);return a?Promise.resolve(r.getCachedRxDocument(a)):ot(t.storageInstance,e).then(e=>e?t.docCache.getCachedRxDocument(e):null)}function ha(e){return this.$.pipe((0,Bt.Z)(null),(0,Gt.Z)(async t=>t?{changeEvent:t}:{doc:await this.getLocal(e)}),(0,Gt.Z)(async t=>{if(t.changeEvent){var r=t.changeEvent;return r.isLocal&&r.documentId===e?{use:!0,doc:await this.getLocal(e)}:{use:!1}}return{use:!0,doc:t.doc}}),(0,Nt.p)(e=>e.use),(0,$t.T)(e=>e.doc))}var la=function(e){function t(t,r,a){var n;return(n=e.call(this,null,r)||this).id=t,n.parent=a,n}return(0,w.A)(t,e),t}(zt()),da={get isLocal(){return!0},get allAttachments$(){throw R("LD1",{document:this})},get primaryPath(){return"id"},get primary(){return this.id},get $(){var e=n(ea,this.parent),t=this.primary;return this.parent.eventBulks$.pipe((0,Nt.p)(e=>!!e.isLocal),(0,$t.T)(e=>e.events.find(e=>e.documentId===t)),(0,Nt.p)(e=>!!e),(0,$t.T)(e=>Tt((0,me.ZN)(e))),(0,Bt.Z)(e.docCache.getLatestDocumentData(this.primary)),(0,Mt.F)((e,t)=>e._rev===t._rev),(0,$t.T)(t=>e.docCache.getCachedRxDocument(t)),(0,At.t)(me.bz))},get $$(){var e=this,t=pa(e);return t.getReactivityFactory().fromObservable(e.$,e.getLatest()._data,t)},get deleted$$(){var e=this,t=pa(e);return t.getReactivityFactory().fromObservable(e.deleted$,e.getLatest().deleted,t)},getLatest(){var e=n(ea,this.parent),t=e.docCache.getLatestDocumentData(this.primary);return e.docCache.getCachedRxDocument(t)},get(e){if(e="data."+e,this._data){if("string"!=typeof e)throw O("LD2",{objPath:e});var t=v(this._data,e);return t=x.deepFreezeWhenDevMode(t)}},get$(e){if(e="data."+e,x.isDevMode()){if(e.includes(".item."))throw R("LD3",{objPath:e});if(e===this.primaryPath)throw R("LD4")}return this.$.pipe((0,$t.T)(e=>e._data),(0,$t.T)(t=>v(t,e)),(0,Mt.F)())},get$$(e){var t=pa(this);return t.getReactivityFactory().fromObservable(this.get$(e),this.getLatest().get(e),t)},async incrementalModify(e){var t=await ta(this.parent);return t.incrementalWriteQueue.addWrite(this._data,async t=>(t.data=await e(t.data,this),t)).then(e=>t.docCache.getCachedRxDocument(e))},incrementalPatch(e){return this.incrementalModify(t=>(Object.entries(e).forEach(([e,r])=>{t[e]=r}),t))},async _saveData(e){var t=await ta(this.parent),r=this._data;e.id=this.id;var a=[{previous:r,document:e}];return t.storageInstance.bulkWrite(a,"local-document-save-data").then(t=>{if(t.error[0])throw t.error[0];var r=vt(this.collection.schema.primaryPath,a,t)[0];(e=s(e))._rev=r._rev})},async remove(){var e=await ta(this.parent),t=s(this._data);return t._deleted=!0,ct(e.storageInstance,{previous:this._data,document:t},"local-document-remove").then(t=>e.docCache.getCachedRxDocument(t))}},ma=!1,fa=()=>{if(!ma){ma=!0;var e=Kt;Object.getOwnPropertyNames(e).forEach(t=>{if(!Object.getOwnPropertyDescriptor(da,t)){var r=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(da,t,r)}});["populate","update","putAttachment","putAttachmentBase64","getAttachment","allAttachments"].forEach(e=>da[e]=(e=>()=>{throw R("LD6",{functionName:e})})(e))}};function pa(e){var t=e.parent;return t instanceof Kr?t:t.database}function va(e){var t=e.database?e.database:e,r=e.database?e.name:"",a=(async()=>{var a=await ra(t.token,t.storage,t.name,r,t.instanceCreationOptions,t.multiInstance);a=mt(t,a,sa);var n=new ur("id",t.eventBulks$.pipe((0,Nt.p)(e=>{var t=!1;return(""===r&&!e.collectionName||""!==r&&e.collectionName===r)&&(t=!0),t&&e.isLocal}),(0,$t.T)(e=>e.events)),t=>function(e,t){fa();var r=new la(e.id,e,t);return Object.setPrototypeOf(r,da),r.prototype=da,r}(t,e)),i=new Ft(a,"id",()=>{},()=>{}),s=await t.storageToken,o=a.changeStream().subscribe(r=>{for(var a=new Array(r.events.length),n=r.events,i=e.database?e.name:void 0,o=0;o{e.insertLocal=oa,e.upsertLocal=ca,e.getLocal=ua,e.getLocal$=ha},RxDatabase:e=>{e.insertLocal=oa,e.upsertLocal=ca,e.getLocal=ua,e.getLocal$=ha}},hooks:{createRxDatabase:{before:e=>{e.creator.localDocuments&&va(e.database)}},createRxCollection:{before:e=>{e.creator.localDocuments&&va(e.collection)}},preCloseRxDatabase:{after:e=>aa(e)},postCloseRxCollection:{after:e=>aa(e)},postRemoveRxDatabase:{after:e=>na(e.storage,e.databaseName,"")},postRemoveRxCollection:{after:e=>na(e.storage,e.databaseName,e.collectionName)}},overwritable:{}};let ga;function ba(){return"undefined"!=typeof window&&window.indexedDB}function wa(){return ga||(ga=(async()=>{!function(e){if(it("preAddRxPlugin",{plugin:e,plugins:Gr}),!Gr.has(e)){if(Xr.has(e.name))throw R("PL3",{name:e.name,plugin:e});if(Gr.add(e),Xr.add(e.name),!e.rxdb)throw O("PL1",{plugin:e});e.init&&e.init(),e.prototypes&&Object.entries(e.prototypes).forEach(([e,t])=>t(Jr[e])),e.overwritable&&Object.assign(x,e.overwritable),e.hooks&&Object.entries(e.hooks).forEach(([e,t])=>{t.after&&nt[e].push(t.after),t.before&&nt[e].unshift(t.before)})}}(ya);return await Vr({name:"rxdb-landing-v4",localDocuments:!0,storage:Ot()})})()),ga}},8342(e,t,r){r.d(t,{L$:()=>s,Z2:()=>i,zs:()=>n});var a="abcdefghijklmnopqrstuvwxyz";function n(e=10){for(var t="",r=0;rs});n(6540);var o=n(8853),a=n(4848);function s({author:e,year:t,sourceLink:n,children:s}){return(0,a.jsxs)("div",{style:{borderLeft:"2px solid var(--color-top)",paddingLeft:"1rem",paddingTop:"0.5rem",paddingBottom:"0.5rem",marginTop:30,marginBottom:30},children:[(0,a.jsx)(o.iG,{}),(0,a.jsx)("div",{style:{display:"flex",alignItems:"flex-start",gap:"0.5rem"},children:(0,a.jsx)("p",{style:{margin:0},children:s})}),(0,a.jsx)("div",{style:{display:"flex",justifyContent:"flex-end",gap:5},children:(0,a.jsx)(o.fz,{})}),(0,a.jsxs)("p",{style:{marginTop:"0.75rem",marginBottom:0,textAlign:"right",fontSize:"0.9rem"},children:["\u2013"," ",n?(0,a.jsx)("a",{href:n,target:"_blank",rel:"noopener noreferrer",children:e}):e,t&&`, ${t}`]})]})}},3963(e,t,n){n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>l,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"downsides-of-offline-first","title":"Downsides of Local First / Offline First","description":"Discover the hidden pitfalls of local-first apps. Learn about storage limits, conflicts, and real-time illusions before building your offline solution.","source":"@site/docs/downsides-of-offline-first.md","sourceDirName":".","slug":"/downsides-of-offline-first.html","permalink":"/downsides-of-offline-first.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Downsides of Local First / Offline First","slug":"downsides-of-offline-first.html","description":"Discover the hidden pitfalls of local-first apps. Learn about storage limits, conflicts, and real-time illusions before building your offline solution."},"sidebar":"tutorialSidebar","previous":{"title":"Why NoSQL Powers Modern UI Apps","permalink":"/why-nosql.html"},"next":{"title":"RxDB - The Real-Time Database for Node.js","permalink":"/nodejs-database.html"}}');var a=n(4848),s=n(8453),i=n(2443);const r={title:"Downsides of Local First / Offline First",slug:"downsides-of-offline-first.html",description:"Discover the hidden pitfalls of local-first apps. Learn about storage limits, conflicts, and real-time illusions before building your offline solution."},l="Downsides of Local First / Offline First",h={},c=[{value:"It only works with small datasets",id:"it-only-works-with-small-datasets",level:2},{value:"Browser storage is not really persistent",id:"browser-storage-is-not-really-persistent",level:2},{value:"There can be conflicts",id:"there-can-be-conflicts",level:2},{value:"Realtime is a lie",id:"realtime-is-a-lie",level:2},{value:"Eventual consistency",id:"eventual-consistency",level:2},{value:"Permissions and authentication",id:"permissions-and-authentication",level:2},{value:"You have to migrate the client database",id:"you-have-to-migrate-the-client-database",level:2},{value:"Performance is not native",id:"performance-is-not-native",level:2},{value:"Nothing is predictable",id:"nothing-is-predictable",level:2},{value:"There is no relational data",id:"there-is-no-relational-data",level:2}];function d(e){const t={a:"a",blockquote:"blockquote",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(t.header,{children:(0,a.jsx)(t.h1,{id:"downsides-of-local-first--offline-first",children:"Downsides of Local First / Offline First"})}),"\n",(0,a.jsxs)(t.p,{children:["So you have read ",(0,a.jsx)(t.a,{href:"/offline-first.html",children:"all these things"})," about how the ",(0,a.jsx)(t.a,{href:"/articles/local-first-future.html",children:"local-first"})," (aka offline-first) paradigm makes it easy to create realtime web applications that even work when the user has no internet connection.\nBut there is no free lunch. The offline first paradigm is not the perfect approach for all kinds of apps."]}),"\n",(0,a.jsxs)(i.G,{author:"Daniel",year:"2024",sourceLink:"https://github.com/pubkey",children:["You fully understood a technology when you know when ",(0,a.jsx)("b",{children:"not"})," to use it"]}),"\n",(0,a.jsxs)(t.p,{children:["In the following I will point out the limitations you need to know before you decide to use ",(0,a.jsx)(t.a,{href:"https://github.com/pubkey/rxdb",children:"RxDB"})," or even before you decide to create an offline first application."]}),"\n",(0,a.jsx)(t.h2,{id:"it-only-works-with-small-datasets",children:"It only works with small datasets"}),"\n",(0,a.jsx)(t.p,{children:"Making data available offline means it must be loaded from the server and then stored at the clients device.\nYou need to load the full dataset on the first pageload and on every ongoing load you need to download the new changes to that set.\nWhile in theory you could download in infinite amount of data, in practice you have a limit how long the user can wait before having an up-to-date state.\nYou want to display chat messages like Whatsapp? No problem. Syncing all the messages a user could write, can be done with a few HTTP requests.\nWant to make a tool that displays server logs? Good luck downloading terabytes of data to the client just to search for a single string. This will not work."}),"\n",(0,a.jsxs)(t.p,{children:["Besides the network usage, there is another limit for the size of your data.\nIn browsers you have some options for storage: Cookies, ",(0,a.jsx)(t.a,{href:"/articles/localstorage.html",children:"Localstorage"}),", ",(0,a.jsx)(t.a,{href:"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#what-was-websql",children:"WebSQL"})," and ",(0,a.jsx)(t.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB"}),"."]}),"\n",(0,a.jsxs)(t.p,{children:["Because Cookies and ",(0,a.jsx)(t.a,{href:"/articles/localstorage.html",children:"Localstorage"})," is slow and WebSQL is deprecated, you will use IndexedDB.\nThe ",(0,a.jsx)(t.a,{href:"/articles/indexeddb-max-storage-limit.html",children:"limit of how much data you can store in IndexedDB"})," depends on two factors: Which browser is used and how much disc space is left on the device. You can assume that at least a couple of ",(0,a.jsx)(t.a,{href:"https://web.dev/storage-for-the-web/",children:"hundred megabytes"})," are available at least. The maximum is potentially hundreds of gigabytes or more, but the browser implementations vary. Chrome allows the browser to use up to 60% of the total disc space per origin. Firefox allows up to 50%. But on safari you can only store up to 1GB and the browser will prompt the user on each additional 200MB increment."]}),"\n",(0,a.jsx)(t.p,{children:"The problem is, that you have no chance to really predict how much data can be stored. So you have to make assumptions that are hopefully true for all of your users. Also, you have no way to increase that space like you would add another hard drive to your backend server. Once your clients reach the limit, you likely have to rewrite big parts of your applications."}),"\n",(0,a.jsxs)(t.p,{children:["UPDATE (2023): Newer versions of browsers can store way more data, for example firefox stores up to 10% of the total disk size. For an overview about how much can be stored, read ",(0,a.jsx)(t.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/Storage_API/Storage_quotas_and_eviction_criteria",children:"this guide"})]}),"\n",(0,a.jsx)(t.h2,{id:"browser-storage-is-not-really-persistent",children:"Browser storage is not really persistent"}),"\n",(0,a.jsxs)(t.p,{children:["When data is stored inside IndexedDB or one of the other storage APIs, it cannot be trusted to stay there forever.\nApple for example deletes the data when the website was not used in the ",(0,a.jsx)(t.a,{href:"https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/",children:"last 7 days"}),". The other browsers also have logic to clean up the stored data, and in the end the user itself could be the one that deletes the browsers local data."]}),"\n",(0,a.jsxs)(t.p,{children:["The most common way to handle this, is to replicate everything from the backend to the client again.\nOf course, this does not work for state that is not stored at the backend. So if you assume you can store the users private data inside the browser in a secure way, you are ",(0,a.jsx)(t.a,{href:"https://medium.com/universal-ethereum/out-of-gas-were-shutting-down-unilogin-3b544838df1a#4f60",children:"wrong"}),"."]}),"\n",(0,a.jsx)("p",{align:"center",children:(0,a.jsx)("img",{src:"./files/safari-database.png",alt:"safari database",width:"200"})}),"\n",(0,a.jsx)(t.h2,{id:"there-can-be-conflicts",children:"There can be conflicts"}),"\n",(0,a.jsxs)(t.p,{children:["Imagine two of your users modify the same JSON document, while both are offline. After they go online again, their clients replicate the modified document to the server. Now you have two conflicting versions of the same document, and you need a way to determine how the correct new version of that document should look like. This process is called ",(0,a.jsx)(t.strong,{children:"conflict resolution"}),"."]}),"\n",(0,a.jsx)("p",{align:"center",children:(0,a.jsx)("img",{src:"./files/document-replication-conflict.svg",alt:"document replication conflict",width:"250"})}),"\n",(0,a.jsxs)(t.ol,{children:["\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["The default in ",(0,a.jsx)(t.a,{href:"https://docs.couchdb.org/en/stable/replication/conflicts.html",children:"many"})," offline first databases is a deterministic conflict resolution strategy. Both conflicting versions of the document are kept in the storage and when you query for the document, a winner is determined by comparing the hashes of the document and only the winning document is returned. Because the comparison is deterministic, all clients and servers will always pick the same winner. This kind of resolution only works when it is not that important that one of the document changes gets dropped. Because conflicts are rare, this might be a viable solution for some use cases."]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"A better resolution can be applied by listening to the changestream of the database. The changestream emits an event each time a write happens to the database. The event contains information about the written document and also a flag if there is a conflicting version. For each event with a conflict, you fetch all versions for that document and create a new document that contains the winning state. With that you can implement pretty complex conflict resolution strategies, but you have to manually code it for each collection of documents."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["Instead of the solving conflict once at every client, it can be made a bit easier by solely relying on the backend. This can be done when all of your clients replicate with the same single backend server. With ",(0,a.jsx)(t.a,{href:"/replication-graphql.html",children:"RxDB's Graphql Replication"})," each client side change is sent to the server where conflicts can be resolved and the winning document can be sent back to the clients."]}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsx)(t.p,{children:"Sometimes there is no way to solve a conflict with code. If your users edit text based documents or images, often only the users themselves can decide how the winning revision has to look. For these cases, you have to implement complex UI parts where the users can inspect the conflict and manage its resolution."}),"\n"]}),"\n",(0,a.jsxs)(t.li,{children:["\n",(0,a.jsxs)(t.p,{children:["You do not have to handle conflicts if they cannot happen in the first place. You can achieve that by designing a write only database where existing documents cannot be touched. Instead of storing the current state in a single document, you store all the events that lead to the current state. Sometimes called the ",(0,a.jsx)(t.a,{href:"https://pouchdb.com/guides/conflicts.html#accountants-dont-use-erasers",children:'"everything is a delta"'})," strategy, others would call it ",(0,a.jsx)(t.a,{href:"https://martinfowler.com/eaaDev/EventSourcing.html",children:"Event Sourcing"}),". Like an accountant that does not need an eraser, you append all changes and afterwards aggregate the current state at the client."]}),"\n"]}),"\n"]}),"\n",(0,a.jsx)(t.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(t.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,a.jsxs)(t.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(t.span,{"data-line":"",children:(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-comment)"},children:"// create one new document for each change to the users balance"})}),"\n",(0,a.jsxs)(t.span,{"data-line":"",children:[(0,a.jsx)(t.span,{style:{color:"var(--shiki-foreground)"},children:"{id"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-function)"},children:" Date"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-function)"},children:".toJSON"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-foreground)"},children:" change"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-comment)"},children:"// balance increased by $100"})]}),"\n",(0,a.jsxs)(t.span,{"data-line":"",children:[(0,a.jsx)(t.span,{style:{color:"var(--shiki-foreground)"},children:"{id"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-function)"},children:" Date"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-function)"},children:".toJSON"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-foreground)"},children:" change"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-keyword)"},children:" -"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-constant)"},children:"50"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-comment)"},children:"// balance decreased by $50"})]}),"\n",(0,a.jsxs)(t.span,{"data-line":"",children:[(0,a.jsx)(t.span,{style:{color:"var(--shiki-foreground)"},children:"{id"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-function)"},children:" Date"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-function)"},children:".toJSON"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-foreground)"},children:" change"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-constant)"},children:" 200"}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,a.jsx)(t.span,{style:{color:"var(--shiki-token-comment)"},children:"// balance increased by $200"})]})]})})}),"\n",(0,a.jsxs)(t.ol,{start:"6",children:["\n",(0,a.jsxs)(t.li,{children:["There is this thing called ",(0,a.jsx)(t.strong,{children:"conflict-free replicated data type"}),", short ",(0,a.jsx)(t.strong,{children:"CRDT"}),". Using a CRDT library like ",(0,a.jsx)(t.a,{href:"https://github.com/automerge/automerge",children:"automerge"})," will magically solve all of your conflict problems. Until you use it in production where you observe that implementing CRDTs has basically the same complexity as implementing conflict resolution strategies."]}),"\n"]}),"\n",(0,a.jsx)(t.h2,{id:"realtime-is-a-lie",children:"Realtime is a lie"}),"\n",(0,a.jsxs)(t.p,{children:["So you replicate stuff between the clients and your backend. Each change on one side directly changes the state of the other sides in ",(0,a.jsx)(t.strong,{children:"realtime"}),'. But this "realtime" is not the same as in ',(0,a.jsx)(t.a,{href:"https://en.wikipedia.org/wiki/Real-time_computing",children:"realtime computing"}),". In the offline first world, the word realtime was introduced by firebase and is more meant as a marketing slogan than a technical description.\nThere is an internet between your backend and your clients and everything you do on one machine takes at least once the latency until it can affect anything on the other machines. You have to keep this in mind when you develop anything where the timing is important, like a multiplayer game or a stock trading app."]}),"\n",(0,a.jsx)(t.p,{children:'Even when you run a query against the local database, there is no "real" realtime.\nClient side databases run on JavaScript and JavaScript runs on a single CPU that might be partially blocked because the user is running some background processes. So you can never guarantee a response deadline which violates the time constraint of realtime computing.'}),"\n",(0,a.jsx)("p",{align:"center",children:(0,a.jsx)("img",{src:"./files/latency-london-san-franzisco.png",alt:"latency london san franzisco",width:"300"})}),"\n",(0,a.jsx)(t.h2,{id:"eventual-consistency",children:"Eventual consistency"}),"\n",(0,a.jsx)(t.p,{children:"An offline first app does not have a single source of truth. There is a source on the backend, one on the own client, and also each other client has its own definition of truth. At the moment your user starts the app, the local state is hopefully already replicated with the backend and all other clients. But this does not have to be true, the states can have converged and you have to plan for that.\nThe user could update a document based on wrong assumptions because it was not fully replicated at that point in time because the user is offline. A good way to handle this problem is to show the replication state in the UI and tell the user when the replication is running, stopped, paused or finished."}),"\n",(0,a.jsx)(t.p,{children:'And some data is just too important to be "eventual consistent". Create a wire transfer in your online banking app while you are offline. You keep the smartphone laying at your night desk and when you use again in the next morning, it goes online and replicates the transaction. No thank you, do not use offline first for these kinds of things, or at least you have to display the replication state of each document in the UI.'}),"\n",(0,a.jsx)("p",{align:"center",children:(0,a.jsx)("img",{src:"./files/cap-theorem.png",alt:"CAP theorem",width:"150"})}),"\n",(0,a.jsx)(t.h2,{id:"permissions-and-authentication",children:"Permissions and authentication"}),"\n",(0,a.jsx)(t.p,{children:"Every offline first app that goes beyond a prototype, does likely not have the same global state for all of its users. Each user has a different set of documents that are allowed to be replicated or seen by the user. So you need some kind of authentication and permission handling to divide the documents.\nThe easy way is to just create one database for each user on the backend and only allow to replicate that one. Creating that many databases is not really a problem with for example CouchDB, and it makes permission handling easy.\nBut as soon as you want to query all of your data in the backend, it will bite back. Your data is not at a single place, it is distributed between all of the user specific databases. This becomes even more complex as soon as you store information together with the documents that is not allowed to be seen by outsiders. You not only have to decide which documents to replicate, but also which fields of them."}),"\n",(0,a.jsxs)(t.p,{children:["So what you really want is a single datastore in the backend and then replicate only the allowed document parts to each of the users.\nThis always requires you to implement your custom replication endpoint like what you do with RxDBs ",(0,a.jsx)(t.a,{href:"/replication-graphql.html",children:"GraphQL Replication"}),"."]}),"\n",(0,a.jsx)(t.h2,{id:"you-have-to-migrate-the-client-database",children:"You have to migrate the client database"}),"\n",(0,a.jsx)(t.p,{children:"While developing your app, sooner or later you want to change the data layout. You want to add some new fields to documents or change the format of them. So you have to update the database schema and also migrate the stored documents.\nWith 'normal' applications, this is already hard enough and often dangerous. You wait until midnight, stop the webserver, make a database backup, deploy the new schema and then you hope that nothing goes wrong while it updates that many documents."}),"\n",(0,a.jsxs)(t.p,{children:["With offline first applications, it is even more fun. You do not only have to migrate your local backend database, you also have to provide a ",(0,a.jsx)(t.a,{href:"/migration-schema.html",children:"migration strategy"})," for all of these client databases out there. And you also cannot migrate everything at the same time. The clients can only migrate when the new code was updated from the appstore or the user visited your website again. This could be today or in a few weeks."]}),"\n",(0,a.jsx)(t.h2,{id:"performance-is-not-native",children:"Performance is not native"}),"\n",(0,a.jsxs)(t.p,{children:["When you create a web based offline first app, you cannot store data directly on the users filesystem. In fact there are many layers between your JavaScript code and the filesystem of the operation system. Let's say you insert a document in ",(0,a.jsx)(t.a,{href:"https://github.com/pubkey/rxdb",children:"RxDB"}),":"]}),"\n",(0,a.jsxs)(t.ul,{children:["\n",(0,a.jsx)(t.li,{children:"You call the RxDB API to validate and store the data"}),"\n",(0,a.jsx)(t.li,{children:"RxDB calls the underlying RxStorage, for example PouchDB."}),"\n",(0,a.jsx)(t.li,{children:"Pouchdb calls its underlying storage adapter"}),"\n",(0,a.jsx)(t.li,{children:"The storage adapter calls IndexedDB"}),"\n",(0,a.jsx)(t.li,{children:"The browser runs its internal handling of the IndexedDB API"}),"\n",(0,a.jsxs)(t.li,{children:["In most browsers IndexedDB is implemented on ",(0,a.jsx)(t.a,{href:"https://hackaday.com/2021/08/24/sqlite-on-the-web-absurd-sql/",children:"top of SQLite"})]}),"\n",(0,a.jsx)(t.li,{children:"SQLite calls the OS to store the data in the filesystem"}),"\n"]}),"\n",(0,a.jsx)(t.p,{children:"All these layers are abstractions. They are not build for exactly that one use case, so you lose some performance to tunnel the data through the layer itself, and you also lose some performance because the abstraction does not exactly provide the functions that are needed by the layer above and it will overfetch data."}),"\n",(0,a.jsx)(t.p,{children:"You will not find a benchmark comparison between how many transactions per second you can run on the browser compared to a server based database. Because it makes no sense to compare them. Browsers are slower, JavaScript is slower."}),"\n",(0,a.jsxs)(t.blockquote,{children:["\n",(0,a.jsx)(t.p,{children:(0,a.jsx)(t.strong,{children:"Is it fast enough?"})}),"\n"]}),"\n",(0,a.jsxs)(t.p,{children:['What you really care about is "Is it fast enough?". For most use cases, the answer is ',(0,a.jsx)(t.code,{children:"yes"}),'. Offline first apps are UI based and you do not need to process a million transactions per second, because your user will not click the save button that often. "Fast enough" means that the data is processed in under 16 milliseconds so that you can render the updated UI in the next frame. This is of course not true for all use cases, so you better think about the performance limit before starting with the implementation.']}),"\n",(0,a.jsx)(t.h2,{id:"nothing-is-predictable",children:"Nothing is predictable"}),"\n",(0,a.jsx)(t.p,{children:"You have a PostgreSQL database and run a query over 1000ths of rows, which takes 200 milliseconds. Works great, so you now want to do something similar at the client device in your offline first app. How long does it take? You cannot know because people have different devices, and even equal devices have different things running in the background that slow the CPUs. So you cannot predict performance and as described above, you cannot even predict the storage limit. So if your app does heavy data analytics, you might better run everything on the backend and just send the results to the client."}),"\n",(0,a.jsx)(t.h2,{id:"there-is-no-relational-data",children:"There is no relational data"}),"\n",(0,a.jsxs)(t.p,{children:["I started creating ",(0,a.jsx)(t.a,{href:"https://github.com/pubkey/rxdb",children:"RxDB"})," many years ago and while still maintaining it, I often worked with all these other offline first databases out there. RxDB and all of these other ones, are based on some kind of document databases similar to NoSQL. Often people want to have a relational database like the SQL one they use at the backend."]}),"\n",(0,a.jsxs)(t.p,{children:["So why are there no real relations in offline first databases? I could answer with these arguments like how JavaScript works better with document based data, how performance is better when having no joins or even how NoSQL queries are more composable. But the truth is, everything is NoSQL because it makes replication easy. An SQL query that mutates data in different tables based on some selects and joins, cannot be partially replicated without breaking the client. You have foreign keys that point to other rows and if these rows are not replicated yet, you have a problem. To implement a robust ",(0,a.jsx)(t.a,{href:"/replication.html",children:"Sync Engine"})," for relational data, you need some stuff like a ",(0,a.jsx)(t.a,{href:"https://www.theverge.com/2012/11/26/3692392/google-spanner-atomic-clocks-GPS",children:"reliable atomic clock"})," and you have to block queries over multiple tables while a transaction replicated. ",(0,a.jsx)(t.a,{href:"https://youtu.be/iEFcmfmdh2w?t=607",children:"Watch this guy"})," implementing offline first replication on top of SQLite or read this ",(0,a.jsx)(t.a,{href:"https://github.com/supabase/supabase/discussions/357",children:"discussion"})," about implementing ",(0,a.jsx)(t.a,{href:"/replication-supabase.html",children:"offline first in supabase"}),"."]}),"\n",(0,a.jsx)(t.p,{children:"So creating replication for an SQL offline first database is way more work than just adding some network protocols on top of PostgreSQL. It might not even be possible for clients that have no reliable clock."}),"\n",(0,a.jsx)("p",{align:"center",children:(0,a.jsx)("img",{src:"./files/no-relational-data.png",alt:"no relational data",width:"250"})})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453(e,t,n){n.d(t,{R:()=>i,x:()=>r});var o=n(6540);const a={},s=o.createContext(a);function i(e){const t=o.useContext(s);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/6ae3580c.67a503bd.js b/docs/assets/js/6ae3580c.67a503bd.js deleted file mode 100644 index 0c540bf1739..00000000000 --- a/docs/assets/js/6ae3580c.67a503bd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[5320],{2325(e,n,s){s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>t,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"replication","title":"\u2699\ufe0f RxDB realtime Sync Engine for Local-First Apps","description":"Replicate data in real-time with RxDB\'s offline-first Sync Engine. Learn about efficient syncing, conflict resolution, and advanced multi-tab support.","source":"@site/docs/replication.md","sourceDirName":".","slug":"/replication.html","permalink":"/replication.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"\u2699\ufe0f RxDB realtime Sync Engine for Local-First Apps","slug":"replication.html","description":"Replicate data in real-time with RxDB\'s offline-first Sync Engine. Learn about efficient syncing, conflict resolution, and advanced multi-tab support."},"sidebar":"tutorialSidebar","previous":{"title":"Electron","permalink":"/electron.html"},"next":{"title":"HTTP Replication","permalink":"/replication-http.html"}}');var r=s(4848),o=s(8453);const t={title:"\u2699\ufe0f RxDB realtime Sync Engine for Local-First Apps",slug:"replication.html",description:"Replicate data in real-time with RxDB's offline-first Sync Engine. Learn about efficient syncing, conflict resolution, and advanced multi-tab support."},a="RxDB's realtime Sync Engine for Local-First Apps",l={},c=[{value:"Design Decisions of the Sync Engine",id:"design-decisions-of-the-sync-engine",level:2},{value:"The Sync Engine on the document level",id:"the-sync-engine-on-the-document-level",level:2},{value:"The Sync Engine on the transfer level",id:"the-sync-engine-on-the-transfer-level",level:2},{value:"Checkpoint iteration",id:"checkpoint-iteration",level:3},{value:"Event observation",id:"event-observation",level:3},{value:"Data layout on the server",id:"data-layout-on-the-server",level:2},{value:"Conflict handling",id:"conflict-handling",level:2},{value:"replicateRxCollection()",id:"replicaterxcollection",level:2},{value:"Multi Tab support",id:"multi-tab-support",level:2},{value:"Error handling",id:"error-handling",level:2},{value:"Security",id:"security",level:2},{value:"RxReplicationState",id:"rxreplicationstate",level:2},{value:"Observable",id:"observable",level:3},{value:"awaitInitialReplication()",id:"awaitinitialreplication",level:3},{value:"awaitInSync()",id:"awaitinsync",level:3},{value:"awaitInitialReplication() and awaitInSync() should not be used to block the application",id:"awaitinitialreplication-and-awaitinsync-should-not-be-used-to-block-the-application",level:4},{value:"reSync()",id:"resync",level:3},{value:"cancel()",id:"cancel",level:3},{value:"pause()",id:"pause",level:3},{value:"remove()",id:"remove",level:3},{value:"isStopped()",id:"isstopped",level:3},{value:"isPaused()",id:"ispaused",level:3},{value:"Setting a custom initialCheckpoint",id:"setting-a-custom-initialcheckpoint",level:3},{value:"toggleOnDocumentVisible",id:"toggleondocumentvisible",level:3},{value:"Attachment replication",id:"attachment-replication",level:2},{value:"Pull-Only Replication",id:"pull-only-replication",level:2},{value:"Partial Sync with RxDB",id:"partial-sync-with-rxdb",level:2},{value:"Idea: One Collection, Multiple Replications",id:"idea-one-collection-multiple-replications",level:3},{value:"Diffy-Sync when Revisiting a Chunk",id:"diffy-sync-when-revisiting-a-chunk",level:3},{value:"Partial Sync in a Local-First Business Application",id:"partial-sync-in-a-local-first-business-application",level:3},{value:"FAQ",id:"faq",level:2}];function h(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",em:"em",figure:"figure",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",mdxAdmonitionTitle:"mdxAdmonitionTitle",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components},{Details:s}=n;return s||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"rxdbs-realtime-sync-engine-for-local-first-apps",children:"RxDB's realtime Sync Engine for Local-First Apps"})}),"\n",(0,r.jsxs)(n.p,{children:["The RxDB Sync Engine provides the ability to sync the database state in ",(0,r.jsx)(n.strong,{children:"realtime"})," between the clients and the server."]}),"\n",(0,r.jsxs)(n.p,{children:["The backend server does not have to be a RxDB instance; you can build a replication with ",(0,r.jsx)(n.strong,{children:"any infrastructure"}),".\nFor example you can replicate with a ",(0,r.jsx)(n.a,{href:"/replication-graphql.html",children:"custom GraphQL endpoint"})," or a ",(0,r.jsx)(n.a,{href:"/replication-http.html",children:"HTTP server"})," on top of a PostgreSQL or MongoDB database."]}),"\n",(0,r.jsxs)(n.p,{children:["The replication is made to support the ",(0,r.jsx)(n.a,{href:"/articles/local-first-future.html",children:"Local-First"})," paradigm, so that when the client goes ",(0,r.jsx)(n.a,{href:"/offline-first.html",children:"offline"}),", the RxDB ",(0,r.jsx)(n.a,{href:"/rx-database.html",children:"database"})," can still read and write ",(0,r.jsx)(n.a,{href:"/articles/local-database.html",children:"locally"})," and will continue the replication when the client goes online again."]}),"\n",(0,r.jsx)(n.h2,{id:"design-decisions-of-the-sync-engine",children:"Design Decisions of the Sync Engine"}),"\n",(0,r.jsx)(n.p,{children:"In contrast to other (server-side) database replication protocols, the RxDB Sync Engine was designed with these goals in mind:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Easy to Understand"}),': The sync engine works in a simple "git-like" way that is easy to understand for an average developer. You only have to understand how three simple endpoints work.']}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Complex Parts are in RxDB, not in the Backend"}),": The complex parts of the Sync Engine, like ",(0,r.jsx)(n.a,{href:"/transactions-conflicts-revisions.html",children:"conflict handling"})," or offline-online switches, are implemented inside of RxDB itself. This makes creating a compatible backend very easy."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Compatible with any Backend"}),': Because the complex parts are in RxDB, the backend can be "dump" which makes the protocol compatible to almost every backend. No matter if you use PostgreSQL, MongoDB or anything else.']}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Performance is optimized for Client Devices and Browsers"}),": By grouping updates and fetches into batches, it is faster to transfer and easier to compress. Client devices and browsers can also process this data faster, for example running ",(0,r.jsx)(n.code,{children:"JSON.parse()"})," on a chunk of data is faster than calling it once per row. Same goes for how client side storage like ",(0,r.jsx)(n.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB"})," or ",(0,r.jsx)(n.a,{href:"/rx-storage-opfs.html",children:"OPFS"})," works where writing data in bulks is faster."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Offline-First Support"}),": By incorporating conflict handling at the client side, the protocol fully supports ",(0,r.jsx)(n.a,{href:"/offline-first.html",children:"offline-first apps"}),". Users can continue making changes while offline, and those updates will sync seamlessly once a connection is reestablished - all without risking data loss or having undefined behavior."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Multi-Tab Support"}),": When RxDB is used in a browser and multiple tabs of the same application are opened, only exactly one runs the replication at any given time. This reduces client- and backend resources."]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"the-sync-engine-on-the-document-level",children:"The Sync Engine on the document level"}),"\n",(0,r.jsx)(n.p,{children:"On the RxDocument level, the replication works like git, where the fork/client contains all new writes and must be merged with the master/server before it can push its new state to the master/server."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"A---B-----------D master/server state\n \\ /\n B---C---D fork/client state\n"})}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["The client pulls the latest state ",(0,r.jsx)(n.code,{children:"B"})," from the master."]}),"\n",(0,r.jsxs)(n.li,{children:["The client does some changes ",(0,r.jsx)(n.code,{children:"C+D"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["The client pushes these changes to the master by sending the latest known master state ",(0,r.jsx)(n.code,{children:"B"})," and the new client state ",(0,r.jsx)(n.code,{children:"D"})," of the document."]}),"\n",(0,r.jsxs)(n.li,{children:["If the master state is equal to the latest master ",(0,r.jsx)(n.code,{children:"B"})," state of the client, the new client state ",(0,r.jsx)(n.code,{children:"D"})," is set as the latest master state."]}),"\n",(0,r.jsx)(n.li,{children:"If the master also had changes and so the latest master change is different then the one that the client assumes, we have a conflict that has to be resolved on the client."}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"the-sync-engine-on-the-transfer-level",children:"The Sync Engine on the transfer level"}),"\n",(0,r.jsxs)(n.p,{children:["When document states are transferred, all handlers use batches of documents for better performance.\nThe server ",(0,r.jsx)(n.strong,{children:"must"})," implement the following methods to be compatible with the replication:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"pullHandler"})," Get the last checkpoint (or null) as input. Returns all documents that have been written ",(0,r.jsx)(n.strong,{children:"after"})," the given checkpoint. Also returns the checkpoint of the latest written returned document."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"pushHandler"})," a method that can be called by the client to send client side writes to the master. It gets an array with the ",(0,r.jsx)(n.code,{children:"assumedMasterState"})," and the ",(0,r.jsx)(n.code,{children:"newForkState"})," of each document write as input. It must return an array that contains the master document states of all conflicts. If there are no conflicts, it must return an empty array."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"pullStream"})," an observable that emits batches of all master writes and the latest checkpoint of the write batches."]}),"\n"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:" +--------+ +--------+ \n | | pullHandler() | |\n | |---------------------\x3e | | \n | | | | \n | | | |\n | Client | pushHandler() | Server |\n | |---------------------\x3e | | \n | | | |\n | | pullStream$ | | \n | | <-------------------------| | \n +--------+ +--------+\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The replication runs in two ",(0,r.jsx)(n.strong,{children:"different modes"}),":"]}),"\n",(0,r.jsx)(n.h3,{id:"checkpoint-iteration",children:"Checkpoint iteration"}),"\n",(0,r.jsxs)(n.p,{children:["On first initial replication, or when the client comes online again, a checkpoint based iteration is used to catch up with the server state.\nA checkpoint is a subset of the fields of the last pulled document. When the checkpoint is send to the backend via ",(0,r.jsx)(n.code,{children:"pullHandler()"}),", the backend must be able to respond with all documents that have been written ",(0,r.jsx)(n.strong,{children:"after"})," the given checkpoint.\nFor example if your documents contain an ",(0,r.jsx)(n.code,{children:"id"})," and an ",(0,r.jsx)(n.code,{children:"updatedAt"})," field, these two can be used as checkpoint."]}),"\n",(0,r.jsxs)(n.p,{children:["When the checkpoint iteration reaches the last checkpoint, where the backend returns an empty array because there are no newer documents, the replication will automatically switch to the ",(0,r.jsx)(n.code,{children:"event observation"})," mode."]}),"\n",(0,r.jsx)(n.h3,{id:"event-observation",children:"Event observation"}),"\n",(0,r.jsxs)(n.p,{children:["While the client is connected to the backend, the events from the backend are observed via ",(0,r.jsx)(n.code,{children:"pullStream$"})," and persisted to the client."]}),"\n",(0,r.jsxs)(n.p,{children:["If your backend for any reason is not able to provide a full ",(0,r.jsx)(n.code,{children:"pullStream$"})," that contains all events and the checkpoint, you can instead only emit ",(0,r.jsx)(n.code,{children:"RESYNC"})," events that tell RxDB that anything unknown has changed on the server and it should run the pull replication via ",(0,r.jsx)(n.a,{href:"#checkpoint-iteration",children:"checkpoint iteration"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["When the client goes offline and online again, it might happen that the ",(0,r.jsx)(n.code,{children:"pullStream$"})," has missed out some events. Therefore the ",(0,r.jsx)(n.code,{children:"pullStream$"})," should also emit a ",(0,r.jsx)(n.code,{children:"RESYNC"})," event each time the client reconnects, so that the client can become in sync with the backend via the ",(0,r.jsx)(n.a,{href:"#checkpoint-iteration",children:"checkpoint iteration"})," mode."]}),"\n",(0,r.jsx)(n.h2,{id:"data-layout-on-the-server",children:"Data layout on the server"}),"\n",(0,r.jsx)(n.p,{children:"To use the replication you first have to ensure that:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.strong,{children:"documents are deterministic sortable by their last write time"})}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.em,{children:"deterministic"})," means that even if two documents have the same ",(0,r.jsx)(n.em,{children:"last write time"}),", they have a predictable sort order.\nThis is most often ensured by using the ",(0,r.jsx)(n.em,{children:"primaryKey"})," as second sort parameter as part of the checkpoint."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:(0,r.jsxs)(n.strong,{children:["documents are never deleted, instead the ",(0,r.jsx)(n.code,{children:"_deleted"})," field is set to ",(0,r.jsx)(n.code,{children:"true"}),"."]})}),"\n",(0,r.jsx)(n.p,{children:"This is needed so that the deletion state of a document exists in the database and can be replicated with other instances. If your backend uses a different field to mark deleted documents, you have to transform the data in the push/pull handlers or with the modifiers."}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"For example if your documents look like this:"}),"\n",(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" docData"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "id"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "foobar"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "name"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "Alice"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "lastName"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "Wilson"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Contains the last write timestamp"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * so all documents writes can be sorted by that value"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * when they are fetched from the remote instance."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "updatedAt"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 1564483474"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Instead of physically deleting documents,"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * a deleted document gets replicated."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "_deleted"'}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" false"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,r.jsxs)(n.p,{children:["Then your data is always sortable by ",(0,r.jsx)(n.code,{children:"updatedAt"}),". This ensures that when RxDB fetches 'new' changes via ",(0,r.jsx)(n.code,{children:"pullHandler()"}),", it can send the latest ",(0,r.jsx)(n.code,{children:"updatedAt+id"})," checkpoint to the remote endpoint and then receive all newer documents."]}),"\n",(0,r.jsxs)(n.p,{children:["By default, the field is ",(0,r.jsx)(n.code,{children:"_deleted"}),". If your remote endpoint uses a different field to mark deleted documents, you can set the ",(0,r.jsx)(n.code,{children:"deletedField"})," in the replication options which will automatically map the field on all pull and push requests."]}),"\n",(0,r.jsx)(n.h2,{id:"conflict-handling",children:"Conflict handling"}),"\n",(0,r.jsx)(n.p,{children:"When multiple clients (or the server) modify the same document at the same time (or when they are offline), it can happen that a conflict arises during the replication."}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"A---B1---C1---X master/server state\n \\ /\n B1---C2 fork/client state\n"})}),"\n",(0,r.jsxs)(n.p,{children:["In the case above, the client would tell the master to move the document state from ",(0,r.jsx)(n.code,{children:"B1"})," to ",(0,r.jsx)(n.code,{children:"C2"})," by calling ",(0,r.jsx)(n.code,{children:"pushHandler()"}),". But because the actual master state is ",(0,r.jsx)(n.code,{children:"C1"})," and not ",(0,r.jsx)(n.code,{children:"B1"}),", the master would reject the write by sending back the actual master state ",(0,r.jsx)(n.code,{children:"C1"}),".\n",(0,r.jsx)(n.strong,{children:"RxDB resolves all conflicts on the client"})," so it would call the conflict handler of the ",(0,r.jsx)(n.code,{children:"RxCollection"})," and create a new document state ",(0,r.jsx)(n.code,{children:"D"})," that can then be written to the master."]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{children:"A---B1---C1---X---D master/server state\n \\ / \\ /\n B1---C2---D fork/client state\n"})}),"\n",(0,r.jsxs)(n.p,{children:["The default conflict handler will always drop the fork state and use the master state. This ensures that clients that are offline for a very long time, do not accidentally overwrite other peoples changes when they go online again.\nYou can specify a custom conflict handler by setting the property ",(0,r.jsx)(n.code,{children:"conflictHandler"})," when calling ",(0,r.jsx)(n.code,{children:"addCollection()"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Learn how to create a ",(0,r.jsx)(n.a,{href:"/transactions-conflicts-revisions.html#custom-conflict-handler",children:"custom conflict handler"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"replicaterxcollection",children:"replicateRxCollection()"}),"\n",(0,r.jsxs)(n.p,{children:["You can start the replication of a single ",(0,r.jsx)(n.code,{children:"RxCollection"})," by calling ",(0,r.jsx)(n.code,{children:"replicateRxCollection()"})," like in the following:"]}),"\n",(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { replicateRxCollection } "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" lastOfArray"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateRxCollection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myRxCollection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * An id for the replication to identify it"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * and so that RxDB is able to resume the replication on app reload."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * If you replicate with a remote server, it is recommended to put the"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * server url into the replicationIdentifier."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" replicationIdentifier"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-rest-replication-to-https://example.com/api/sync'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * By default it will do an ongoing realtime replication."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * By settings live: false the replication will run once until the local state"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * is in sync with the remote state, then it will cancel itself."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * (optional), default is true."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" live"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Time in milliseconds after when a failed backend request"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * has to be retried."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * This time will be skipped if a offline->online switch is detected"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * via navigator.onLine"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * (optional), default is 5 seconds."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" retryTime"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 5"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" *"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 1000"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * When multiInstance is true, like when you use RxDB in multiple browser tabs,"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * the replication should always run in only one of the open browser tabs."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * If waitForLeadership is true, it will wait until the current instance is leader."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * If waitForLeadership is false, it will start replicating, even if it is not leader."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * [default=true]"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" waitForLeadership"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * If this is set to false,"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * the replication will not start automatically"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * but will wait for replicationState.start() being called."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * (optional), default is true"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" autoStart"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Custom deleted field, the boolean property of the document data that"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * marks a document as being deleted."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * If your backend uses a different fieldname then '_deleted', set the fieldname here."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * RxDB will still store the documents internally with '_deleted', setting this field"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * only maps the data on the data layer."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * "})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * If a custom deleted field contains a non-boolean value, the deleted state"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * of the documents depends on if the value is truthy or not. So instead of providing a boolean * * deleted value, you could also work with using a 'deletedAt' timestamp instead."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * "})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * [default='_deleted']"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" deletedField"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'deleted'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Optional,"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * only needed when you want to replicate local changes to the remote instance."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Push handler"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(docs) {"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Push the local documents to a remote REST server."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" rawResponse"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" fetch"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'https://example.com/api/sync/push'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" method"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'POST'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" headers"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Accept'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'application/json'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Content-Type'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'application/json'"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" body"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" JSON"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".stringify"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({ docs })"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Contains an array with all conflicts that appeared during this push."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * If there were no conflicts, return an empty array."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" response"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" rawResponse"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".json"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" response;"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Batch size, optional"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Defines how many documents will be given to the push handler at once."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 5"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Modifies all documents before they are given to the push handler."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Can be used to swap out a custom deleted flag instead of the '_deleted' field."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * If the push modifier return null, the document will be skipped and not send to the remote."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Notice that the modifier can be called multiple times and should not contain any side effects."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * (optional)"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" modifier"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" d "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" d"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Optional,"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * only needed when you want to replicate remote changes to the local state."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Pull handler"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(lastCheckpoint"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize) {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" minTimestamp"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" lastCheckpoint "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"?"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" lastCheckpoint"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".updatedAt "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * In this example we replicate with a remote REST server"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" response"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" fetch"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" `https://example.com/api/sync/?minUpdatedAt="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"${"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"minTimestamp"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"}"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"&limit="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"${"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"batchSize"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"}"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"`"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" documentsFromRemote"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" response"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".json"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Contains the pulled documents from the remote."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Not that if documentsFromRemote.length < batchSize,"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * then RxDB assumes that there are no more un-replicated documents"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * on the backend, so the replication will switch to 'Event observation' mode."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" documents"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" documentsFromRemote"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * The last checkpoint of the returned documents."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * On the next call to the pull handler,"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * this checkpoint will be passed as 'lastCheckpoint'"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" checkpoint"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" documentsFromRemote"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"length"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ==="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ?"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" lastCheckpoint "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" lastOfArray"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(documentsFromRemote).id"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" updatedAt"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" lastOfArray"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(documentsFromRemote).updatedAt"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Modifies all documents after they have been pulled"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * but before they are used by RxDB."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Notice that the modifier can be called multiple times and should not contain any side effects."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * (optional)"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" modifier"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" d "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" d"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Stream of the backend document writes."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * See below."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * You only need a stream$ when you have set live=true"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" stream$"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" pullStream$"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".asObservable"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Creating the pull stream for realtime replication."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Here we use a websocket but any other way of sending data to the client can be used,"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * like long polling or server-sent events."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" pullStream$"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" Subject"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"RxReplicationPullStreamItem"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"any"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" any"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:">>();"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"let"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" firstOpen "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" connectSocket"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" socket"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" WebSocket"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'wss://example.com/api/sync/stream'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * When the backend sends a new batch of documents+checkpoint,"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * emit it into the stream$."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * "})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * event.data must look like this"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * {"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * documents: ["})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * {"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * id: 'foobar',"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * _deleted: false,"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * updatedAt: 1234"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * }"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * ],"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * checkpoint: {"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * id: 'foobar',"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * updatedAt: 1234"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * }"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * }"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" socket"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"onmessage"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" event "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" pullStream$"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".next"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"event"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".data);"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Automatically reconnect the socket on close and error."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" socket"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"onclose"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" connectSocket"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" socket"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"onerror"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" socket"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".close"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" socket"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"onopen"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(firstOpen) {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" firstOpen "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" } "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"else"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * When the client is offline and goes online again,"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * it might have missed out events that happened on the server."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * So we have to emit a RESYNC so that the replication goes"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * into 'Checkpoint iteration' mode until the client is in sync"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * and then it will go back into 'Event observation' mode again."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" pullStream$"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".next"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'RESYNC'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:" "})]})})}),"\n",(0,r.jsx)(n.h2,{id:"multi-tab-support",children:"Multi Tab support"}),"\n",(0,r.jsxs)(n.p,{children:["For better performance, the replication runs only in one instance when RxDB is used in multiple browser tabs or Node.js processes.\nBy setting ",(0,r.jsx)(n.code,{children:"waitForLeadership: false"})," you can enforce that each tab runs its own replication cycles.\nIf used in a multi instance setting, so when at database creation ",(0,r.jsx)(n.code,{children:"multiInstance: false"})," was not set,\nyou need to import the ",(0,r.jsx)(n.a,{href:"/leader-election.html",children:"leader election plugin"})," so that RxDB can know how many instances exist and which browser tab should run the replication."]}),"\n",(0,r.jsx)(n.h2,{id:"error-handling",children:"Error handling"}),"\n",(0,r.jsxs)(n.p,{children:["When sending a document to the remote fails for any reason, RxDB will send it again in a later point in time.\nThis happens for ",(0,r.jsx)(n.strong,{children:"all"})," errors. The document write could have already reached the remote instance and be processed, while only the answering fails.\nThe remote instance must be designed to handle this properly and to not crash on duplicate data transmissions.\nDepending on your use case, it might be ok to just write the duplicate document data again.\nBut for a more resilient error handling you could compare the last write timestamps or add a unique write id field to the document. This field can then be used to detect duplicates and ignore re-send data."]}),"\n",(0,r.jsxs)(n.p,{children:["Also the replication has an ",(0,r.jsx)(n.code,{children:".error$"})," stream that emits all ",(0,r.jsx)(n.code,{children:"RxError"})," objects that arise during replication.\nNotice that these errors contain an inner ",(0,r.jsx)(n.code,{children:".parameters.errors"})," field that contains the original error. Also they contain a ",(0,r.jsx)(n.code,{children:".parameters.direction"})," field that indicates if the error was thrown during ",(0,r.jsx)(n.code,{children:"pull"})," or ",(0,r.jsx)(n.code,{children:"push"}),". You can use these to properly handle errors. For example when the client is outdated, the server might respond with a ",(0,r.jsx)(n.code,{children:"426 Upgrade Required"})," error code that can then be used to force a page reload."]}),"\n",(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"replicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"error$"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"((error) "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" error"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"parameters"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".errors "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"&&"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" error"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"parameters"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".errors["}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"] "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"&&"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" error"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"parameters"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".errors["}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"].code "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"==="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 426"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ) {"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // client is outdated -> enforce a page reload"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" location"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".reload"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,r.jsx)(n.h2,{id:"security",children:"Security"}),"\n",(0,r.jsxs)(n.p,{children:["Be aware that client side clocks can never be trusted. When you have a client-backend replication, the backend should overwrite the ",(0,r.jsx)(n.code,{children:"updatedAt"})," timestamp or use another field, when it receives the change from the client."]}),"\n",(0,r.jsx)(n.h2,{id:"rxreplicationstate",children:"RxReplicationState"}),"\n",(0,r.jsxs)(n.p,{children:["The function ",(0,r.jsx)(n.code,{children:"replicateRxCollection()"})," returns a ",(0,r.jsx)(n.code,{children:"RxReplicationState"})," that can be used to manage and observe the replication."]}),"\n",(0,r.jsx)(n.h3,{id:"observable",children:"Observable"}),"\n",(0,r.jsxs)(n.p,{children:["To observe the replication, the ",(0,r.jsx)(n.code,{children:"RxReplicationState"})," has some ",(0,r.jsx)(n.code,{children:"Observable"})," properties:"]}),"\n",(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// emits each document that was received from the remote"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"myRxReplicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"received$"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(doc "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(doc));"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// emits each document that was send to the remote"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"myRxReplicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"sent$"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(doc "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(doc));"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// emits all errors that happen when running the push- & pull-handlers."})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"myRxReplicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"error$"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(error "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(error));"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// emits true when the replication was canceled, false when not."})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"myRxReplicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"canceled$"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(bool "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(bool));"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// emits true when a replication cycle is running, false when not."})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"myRxReplicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"active$"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(bool "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(bool));"})]})]})})}),"\n",(0,r.jsx)(n.h3,{id:"awaitinitialreplication",children:"awaitInitialReplication()"}),"\n",(0,r.jsxs)(n.p,{children:["With ",(0,r.jsx)(n.code,{children:"awaitInitialReplication()"})," you can await the initial replication that is done when a full replication cycle was successful finished for the first time. The returned promise will never resolve if you cancel the replication before the initial replication can be done."]}),"\n",(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsx)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxReplicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".awaitInitialReplication"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})})})}),"\n",(0,r.jsx)(n.h3,{id:"awaitinsync",children:"awaitInSync()"}),"\n",(0,r.jsxs)(n.p,{children:["Returns a ",(0,r.jsx)(n.code,{children:"Promise"})," that resolves when:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"awaitInitialReplication()"})," has emitted."]}),"\n",(0,r.jsx)(n.li,{children:"All local data is replicated with the remote."}),"\n",(0,r.jsx)(n.li,{children:"No replication cycle is running or in retry-state."}),"\n"]}),"\n",(0,r.jsxs)(n.admonition,{type:"warning",children:[(0,r.jsxs)(n.p,{children:["When ",(0,r.jsx)(n.code,{children:"multiInstance: true"})," and ",(0,r.jsx)(n.code,{children:"waitForLeadership: true"})," and another tab is already running the replication, ",(0,r.jsx)(n.code,{children:"awaitInSync()"})," will not resolve until the other tab is closed and the replication starts in this tab."]}),(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsx)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxReplicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".awaitInSync"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})})})})]}),"\n",(0,r.jsxs)(n.admonition,{type:"warning",children:[(0,r.jsx)(n.mdxAdmonitionTitle,{}),(0,r.jsxs)(n.h4,{id:"awaitinitialreplication-and-awaitinsync-should-not-be-used-to-block-the-application",children:[(0,r.jsx)(n.code,{children:"awaitInitialReplication()"})," and ",(0,r.jsx)(n.code,{children:"awaitInSync()"})," should not be used to block the application"]}),(0,r.jsxs)(n.p,{children:["A common mistake in RxDB usage is when developers want to block the app usage until the application is in sync.\nOften they just ",(0,r.jsx)(n.code,{children:"await"})," the promise of ",(0,r.jsx)(n.code,{children:"awaitInitialReplication()"})," or ",(0,r.jsx)(n.code,{children:"awaitInSync()"})," and show a loading spinner until they resolve. This is dangerous and should not be done because:"]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["When ",(0,r.jsx)(n.code,{children:"multiInstance: true"})," and ",(0,r.jsx)(n.code,{children:"waitForLeadership: true (default)"})," and another tab is already running the replication, ",(0,r.jsx)(n.code,{children:"awaitInitialReplication()"})," will not resolve until the other tab is closed and the replication starts in this tab."]}),"\n",(0,r.jsxs)(n.li,{children:["Your app can no longer be started when the device is offline because there the ",(0,r.jsx)(n.code,{children:"awaitInitialReplication()"})," will never resolve and the app cannot be used."]}),"\n"]}),(0,r.jsxs)(n.p,{children:["Instead you should store the last in-sync time in a ",(0,r.jsx)(n.a,{href:"/rx-local-document.html",children:"local document"})," and observe its value on all instances."]}),(0,r.jsx)(n.p,{children:"For example if you want to block clients from using the app if they have not been in sync for the last 24 hours, you could use this code:"}),(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// update last-in-sync-flag each time replication is in sync"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".insertLocal"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'last-in-sync'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { time"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" })"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".catch"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(); "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// ensure flag exists"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"myReplicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"active$"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".pipe"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" mergeMap"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"() "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myReplicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".awaitInSync"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".upsertLocal"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'last-in-sync'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { time"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" Date"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".now"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"() })"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// observe the flag and toggle loading spinner"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" showLoadingSpinner"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" oneDay"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 1000"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" *"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 60"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" *"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 60"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" *"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 24"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" firstValueFrom"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".getLocal$"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'last-in-sync'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".pipe"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" filter"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(d "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" d"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".get"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'time'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:") "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:">"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"Date"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".now"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"() "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"-"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" oneDay))"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" )"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" hideLoadingSpinner"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})})]}),"\n",(0,r.jsx)(n.h3,{id:"resync",children:"reSync()"}),"\n",(0,r.jsxs)(n.p,{children:["Triggers a ",(0,r.jsx)(n.code,{children:"RESYNC"})," cycle where the replication goes into ",(0,r.jsx)(n.a,{href:"#checkpoint-iteration",children:"checkpoint iteration"})," until the client is in sync with the backend. Used in unit tests or when no proper ",(0,r.jsx)(n.code,{children:"pull.stream$"})," can be implemented so that the client only knows that something has been changed but not what."]}),"\n",(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsx)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"myRxReplicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".reSync"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})})})}),"\n",(0,r.jsxs)(n.p,{children:["If your backend is not capable of sending events to the client at all, you could run ",(0,r.jsx)(n.code,{children:"reSync()"})," in an interval so that the client will automatically fetch server changes after some time at least."]}),"\n",(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// trigger RESYNC each 10 seconds."})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"setInterval"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(() "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxReplicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".reSync"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" *"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 1000"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})}),"\n",(0,r.jsx)(n.h3,{id:"cancel",children:"cancel()"}),"\n",(0,r.jsx)(n.p,{children:"Cancels the replication. Returns a promise that resolved when everything has been cleaned up."}),"\n",(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsx)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxReplicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".cancel"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})})})}),"\n",(0,r.jsx)(n.h3,{id:"pause",children:"pause()"}),"\n",(0,r.jsxs)(n.p,{children:["Pauses a running replication. The replication can later be resumed with ",(0,r.jsx)(n.code,{children:"RxReplicationState.start()"}),"."]}),"\n",(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxReplicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".pause"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxReplicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".start"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(); "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// restart"})]})]})})}),"\n",(0,r.jsx)(n.h3,{id:"remove",children:"remove()"}),"\n",(0,r.jsxs)(n.p,{children:['Cancels the replication and deletes the metadata of the replication state. This can be used to restart the replication "from scratch". Calling ',(0,r.jsx)(n.code,{children:".remove()"})," will only delete the replication metadata, it will NOT delete the documents from the collection of the replication."]}),"\n",(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsx)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxReplicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".remove"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})})})}),"\n",(0,r.jsx)(n.h3,{id:"isstopped",children:"isStopped()"}),"\n",(0,r.jsxs)(n.p,{children:["Returns ",(0,r.jsx)(n.code,{children:"true"})," if the replication is stopped. This can be if a non-live replication is finished or a replication got canceled."]}),"\n",(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,r.jsx)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"replicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".isStopped"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(); "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// true/false"})]})})})}),"\n",(0,r.jsx)(n.h3,{id:"ispaused",children:"isPaused()"}),"\n",(0,r.jsxs)(n.p,{children:["Returns ",(0,r.jsx)(n.code,{children:"true"})," if the replication is paused."]}),"\n",(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,r.jsx)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"replicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".isPaused"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(); "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// true/false"})]})})})}),"\n",(0,r.jsx)(n.h3,{id:"setting-a-custom-initialcheckpoint",children:"Setting a custom initialCheckpoint"}),"\n",(0,r.jsxs)(n.p,{children:["By default, the push replication will start from the beginning of time and push all documents from there to the remote.\nBy setting a custom ",(0,r.jsx)(n.code,{children:"push.initialCheckpoint"}),", you can tell the replication to only push writes that are newer than the given checkpoint."]}),"\n",(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// store the latest checkpoint of a collection"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"let"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" lastLocalCheckpoint"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" any"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"myCollection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"checkpoint$"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(checkpoint "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" lastLocalCheckpoint "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" checkpoint);"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// start the replication but only push documents that are newer than the lastLocalCheckpoint"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateRxCollection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myCollection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" replicationIdentifier"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-custom-replication-with-init-checkpoint'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" handler"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" initialCheckpoint"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" lastLocalCheckpoint"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,r.jsxs)(n.p,{children:["The same can be done for the other direction by setting a ",(0,r.jsx)(n.code,{children:"pull.initialCheckpoint"}),". Notice that here we need the remote checkpoint from the backend instead of the one from the RxDB storage."]}),"\n",(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// get the last pull checkpoint from the server"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" lastRemoteCheckpoint"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" fetch"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'http://example.com/pull-checkpoint'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"))"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".json"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// start the replication but only pull documents that are newer than the lastRemoteCheckpoint"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateRxCollection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myCollection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" replicationIdentifier"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-custom-replication-with-init-checkpoint'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" handler"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" initialCheckpoint"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" lastRemoteCheckpoint"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,r.jsx)(n.h3,{id:"toggleondocumentvisible",children:"toggleOnDocumentVisible"}),"\n",(0,r.jsxs)(n.p,{children:["Ensures replication continues running when the document is ",(0,r.jsx)(n.code,{children:"visible"}),". This helps avoid situations where the leader-elected tab becomes stale or is hibernated by the browser to save battery.",(0,r.jsx)(n.br,{}),"\n","When the tab becomes hidden, replication is automatically paused; when the tab becomes visible again (or the instance becomes leader), replication resumes."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Default:"})," ",(0,r.jsx)(n.code,{children:"true"})]}),"\n",(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateRxCollection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" toggleOnDocumentVisible"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,r.jsx)(n.h2,{id:"attachment-replication",children:"Attachment replication"}),"\n",(0,r.jsxs)(n.p,{children:["Attachment replication is supported in the RxDB Sync Engine itself. However not all replication plugins support it.\nIf you start the replication with a collection which has ",(0,r.jsx)(n.a,{href:"/rx-attachment.html",children:"enabled RxAttachments"})," attachments data will be added to all push- and write data."]}),"\n",(0,r.jsxs)(n.p,{children:["The pushed documents will contain an ",(0,r.jsx)(n.code,{children:"_attachments"})," object which contains:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"The attachment meta data (id, length, digest) of all non-attachments"}),"\n",(0,r.jsx)(n.li,{children:"The full attachment data of all attachments that have been updated/added from the client."}),"\n",(0,r.jsx)(n.li,{children:"Deleted attachments are spared out in the pushed document."}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"With this data, the backend can decide onto which attachments must be deleted, added or overwritten."}),"\n",(0,r.jsx)(n.p,{children:"Accordingly, the pulled document must contain the same data, if the backend has a new document state with updated attachments."}),"\n",(0,r.jsx)(n.h2,{id:"pull-only-replication",children:"Pull-Only Replication"}),"\n",(0,r.jsx)(n.p,{children:"With the replication protocol it is possible to do pull only replications where data is pulled from a backend but not pushed from the client. RxDB implements some performance optimizations for these like not storing server metadata on pull only streams."}),"\n",(0,r.jsx)(n.h2,{id:"partial-sync-with-rxdb",children:"Partial Sync with RxDB"}),"\n",(0,r.jsx)(n.p,{children:"Suppose you're building a Minecraft-like voxel game where the world can expand in every direction. Storing the entire map locally for offline use is impossible because the dataset could be massive. Yet you still want a local-first design so players can edit the game world offline and sync back to the server later."}),"\n",(0,r.jsx)(n.h3,{id:"idea-one-collection-multiple-replications",children:"Idea: One Collection, Multiple Replications"}),"\n",(0,r.jsxs)(n.p,{children:["You might define a single RxDB collection called ",(0,r.jsx)(n.code,{children:"db.voxels"}),', where each document represents a block or "voxel" (with fields like id, chunkId, coordinates, and type). With RxDB you can, instead of setting up ',(0,r.jsx)(n.em,{children:"one"})," replication that tries to fetch ",(0,r.jsx)(n.em,{children:"all"})," voxels, you create ",(0,r.jsx)(n.strong,{children:"separate replication states"})," for each ",(0,r.jsx)(n.em,{children:"chunk"})," of the world the player is currently near."]}),"\n",(0,r.jsxs)(n.p,{children:["When the player enters a particular chunk (say ",(0,r.jsx)(n.code,{children:"chunk-123"}),"), you ",(0,r.jsx)(n.strong,{children:"start a replication"})," dedicated to that chunk. On the server side, you have endpoints to ",(0,r.jsx)(n.strong,{children:"pull"})," only that chunk's voxels (e.g., GET ",(0,r.jsx)(n.code,{children:"/api/voxels/pull?chunkId=123"}),") and ",(0,r.jsx)(n.strong,{children:"push"})," local changes back (e.g., POST ",(0,r.jsx)(n.code,{children:"/api/voxels/push?chunkId=123"}),"). RxDB handles them similarly to any other offline-first setup, but each replication is filtered to only that chunk's data."]}),"\n",(0,r.jsxs)(n.p,{children:["When the player leaves ",(0,r.jsx)(n.code,{children:"chunk-123"})," and no longer needs it, you ",(0,r.jsx)(n.strong,{children:"stop"})," that replication. If the player moves to ",(0,r.jsx)(n.code,{children:"chunk-124"}),", you start a new replication for chunk 124. This ensures the game only downloads and syncs data relevant to the player's immediate location. Meanwhile, all edits made offline remain safely stored in the local database until a network connection is available."]}),"\n",(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" activeReplications"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {}; "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// chunkId -> replicationState"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" startChunkReplication"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(chunkId) {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (activeReplications[chunkId]) "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"return"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationId"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'voxels-chunk-'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" chunkId;"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateRxCollection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".voxels"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" replicationIdentifier"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" replicationId"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(checkpoint"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" limit) {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" res"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" fetch"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" `/api/voxels/pull?chunkId="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"${"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"chunkId"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"}"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"&cp="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"${"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"checkpoint"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"}"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"&limit="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"${"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"limit"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"}"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"`"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(changedDocs) {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" res"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" fetch"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"`/api/voxels/push?chunkId="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"${"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"chunkId"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"}"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"`"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" activeReplications[chunkId] "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" replicationState;"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" stopChunkReplication"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(chunkId) {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" rep"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" activeReplications[chunkId];"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (rep) {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" rep"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".cancel"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" delete"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" activeReplications[chunkId];"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// Called whenever the player's location changes; "})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// dynamically start/stop replication for nearby chunks."})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" onPlayerMove"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(neighboringChunkIds) {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" neighboringChunkIds"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".forEach"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(startChunkReplication);"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" Object"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".keys"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(activeReplications)"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".forEach"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(cid "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"neighboringChunkIds"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".includes"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(cid)) {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" stopChunkReplication"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(cid);"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,r.jsx)(n.h3,{id:"diffy-sync-when-revisiting-a-chunk",children:"Diffy-Sync when Revisiting a Chunk"}),"\n",(0,r.jsxs)(n.p,{children:['An added benefit of this multi-replication-state design is checkpointing. Each replication state has a unique "replication identifier," so the next time the player returns to ',(0,r.jsx)(n.code,{children:"chunk-123"}),", the local database knows what it already has and only fetches the differences without the need to re-download the entire chunk."]}),"\n",(0,r.jsx)(n.h3,{id:"partial-sync-in-a-local-first-business-application",children:"Partial Sync in a Local-First Business Application"}),"\n",(0,r.jsx)(n.p,{children:'Though a voxel world is an intuitive example, the same technique applies in enterprise scenarios where data sets are large but each user only needs a specific subset. You could spin up a new replication for each "permission group" or "region," so users only sync the records they\'re allowed to see. Or in a CRM, the replication might be filtered by the specific accounts or projects a user is currently handling. As soon as they switch to a different project, you stop the old replication and start one for the new scope.'}),"\n",(0,r.jsxs)(n.p,{children:["This ",(0,r.jsx)(n.strong,{children:"chunk-based"})," or ",(0,r.jsx)(n.strong,{children:"scope-based"}),' replication pattern keeps your local storage lean, reduces network overhead, and still gives users the offline, instant-feedback experience that local-first apps are known for. By dynamically creating (and canceling) replication states, you retain tight control over bandwidth usage and make the infinite (or very large) feasible. In a production app you would also "flag" the entities (with a ',(0,r.jsx)(n.code,{children:"pull.modifier"}),") by which replication state they came from, so that you can clean up the parts that you no longer need. --\x3e"]}),"\n",(0,r.jsx)(n.h2,{id:"faq",children:"FAQ"}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"I have infinite loops in my replication, how to debug?"}),(0,r.jsx)("div",{children:(0,r.jsxs)(n.p,{children:["When you have infinite loops in your replication or random re-runs of http requests after some time, the reason is likely that your pull-handler\nis crashing. The debug this, add a log to the error$ handler to debug it. ",(0,r.jsx)(n.code,{children:"myRxReplicationState.error$.subscribe(err => console.log('error$', err))"}),"."]})})]})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453(e,n,s){s.d(n,{R:()=>t,x:()=>a});var i=s(6540);const r={},o=i.createContext(r);function t(e){const n=i.useContext(o);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/6bfb0089.d52978b6.js b/docs/assets/js/6bfb0089.d52978b6.js deleted file mode 100644 index 2d2e9bf8ed9..00000000000 --- a/docs/assets/js/6bfb0089.d52978b6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[6422],{6235(e,s,n){n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"adapters","title":"PouchDB Adapters","description":"When you use PouchDB RxStorage, there are many adapters that define where the data has to be stored.","source":"@site/docs/adapters.md","sourceDirName":".","slug":"/adapters.html","permalink":"/adapters.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"PouchDB Adapters","slug":"adapters.html"}}');var a=n(4848),o=n(8453);const i={title:"PouchDB Adapters",slug:"adapters.html"},l="PouchDB Adapters",t={},d=[{value:"Memory",id:"memory",level:2},{value:"Memdown",id:"memdown",level:2},{value:"IndexedDB",id:"indexeddb",level:2},{value:"IndexedDB",id:"indexeddb-1",level:2},{value:"Websql",id:"websql",level:2},{value:"leveldown",id:"leveldown",level:2},{value:"Node-Websql",id:"node-websql",level:2},{value:"react-native-sqlite",id:"react-native-sqlite",level:2},{value:"asyncstorage",id:"asyncstorage",level:2},{value:"asyncstorage-down",id:"asyncstorage-down",level:2},{value:"cordova-sqlite",id:"cordova-sqlite",level:2}];function c(e){const s={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",hr:"hr",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.header,{children:(0,a.jsx)(s.h1,{id:"pouchdb-adapters",children:"PouchDB Adapters"})}),"\n",(0,a.jsxs)(s.p,{children:["When you use PouchDB ",(0,a.jsx)(s.code,{children:"RxStorage"}),", there are many adapters that define where the data has to be stored.\nDepending on which environment you work in, you can choose between different adapters. For example, in the browser you want to store the data inside of IndexedDB but on NodeJS you want to store the data on the filesystem."]}),"\n",(0,a.jsx)(s.p,{children:"This page is an overview over the different adapters with recommendations on what to use where."}),"\n",(0,a.jsx)(s.hr,{}),"\n",(0,a.jsx)(s.admonition,{type:"warning",children:(0,a.jsxs)(s.p,{children:["The PouchDB RxStorage ",(0,a.jsx)(s.a,{href:"/rx-storage-pouchdb.html",children:"is removed from RxDB"})," and can no longer be used in new projects. You should switch to a different ",(0,a.jsx)(s.a,{href:"/rx-storage.html",children:"RxStorage"}),"."]})}),"\n",(0,a.jsx)(s.hr,{}),"\n",(0,a.jsxs)(s.p,{children:["Please always ensure that your pouchdb adapter-version is the same as ",(0,a.jsx)(s.code,{children:"pouchdb-core"})," in the ",(0,a.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/blob/master/package.json",children:"rxdb package.json"}),". Otherwise, you might have strange problems."]}),"\n",(0,a.jsx)(s.h1,{id:"any-environment",children:"Any environment"}),"\n",(0,a.jsx)(s.h2,{id:"memory",children:"Memory"}),"\n",(0,a.jsx)(s.p,{children:"In any environment, you can use the memory-adapter. It stores the data in the javascript runtime memory. This means it is not persistent and the data is lost when the process terminates."}),"\n",(0,a.jsx)(s.p,{children:"Use this adapter when:"}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsx)(s.li,{children:"You want to have really good performance"}),"\n",(0,a.jsx)(s.li,{children:"You do not want persistent state, for example in your test suite"}),"\n"]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStoragePouch"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/pouchdb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// npm install pouchdb-adapter-memory --save"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addPouchPlugin"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"require"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'pouchdb-adapter-memory'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"));"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStoragePouch"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'memory'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(s.h2,{id:"memdown",children:"Memdown"}),"\n",(0,a.jsxs)(s.p,{children:["With RxDB you can also use adapters that implement ",(0,a.jsx)(s.a,{href:"https://github.com/Level/abstract-leveldown",children:"abstract-leveldown"})," like the memdown-adapter."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// npm install memdown --save"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// npm install pouchdb-adapter-leveldb --save"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addPouchPlugin"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"require"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'pouchdb-adapter-leveldb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")); "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// leveldown adapters need the leveldb plugin to work"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" memdown"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'memdown'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStoragePouch"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(memdown) "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// the full leveldown-module"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(s.h1,{id:"browser",children:"Browser"}),"\n",(0,a.jsx)(s.h2,{id:"indexeddb",children:"IndexedDB"}),"\n",(0,a.jsxs)(s.p,{children:["The IndexedDB adapter stores the data inside of ",(0,a.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API",children:"IndexedDB"})," use this in browsers environments as default."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// npm install pouchdb-adapter-idb --save"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addPouchPlugin"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"require"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'pouchdb-adapter-idb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"));"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStoragePouch"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'idb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(s.h2,{id:"indexeddb-1",children:"IndexedDB"}),"\n",(0,a.jsxs)(s.p,{children:["A reimplementation of the indexeddb adapter which uses native secondary indexes. Should have a much better performance but can behave ",(0,a.jsx)(s.a,{href:"https://github.com/pouchdb/pouchdb/tree/master/packages/node_modules/pouchdb-adapter-indexeddb#differences-between-couchdb-and-pouchdbs-find-implementations-under-indexeddb",children:"different on some edge cases"}),"."]}),"\n",(0,a.jsx)(s.admonition,{type:"note",children:(0,a.jsxs)(s.p,{children:["Multiple users have reported problems with this adapter. It is ",(0,a.jsx)(s.strong,{children:"not"})," recommended to use this adapter."]})}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// npm install pouchdb-adapter-indexeddb --save"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addPouchPlugin"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"require"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'pouchdb-adapter-indexeddb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"));"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStoragePouch"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'indexeddb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(s.h2,{id:"websql",children:"Websql"}),"\n",(0,a.jsxs)(s.p,{children:["This adapter stores the data inside of websql. It has a different performance behavior. ",(0,a.jsx)(s.a,{href:"https://softwareengineering.stackexchange.com/questions/220254/why-is-web-sql-database-deprecated",children:"Websql is deprecated"}),". You should not use the websql adapter unless you have a really good reason."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// npm install pouchdb-adapter-websql --save"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addPouchPlugin"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"require"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'pouchdb-adapter-websql'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"));"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStoragePouch"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'websql'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(s.h1,{id:"nodejs",children:"NodeJS"}),"\n",(0,a.jsx)(s.h2,{id:"leveldown",children:"leveldown"}),"\n",(0,a.jsxs)(s.p,{children:["This adapter uses a ",(0,a.jsx)(s.a,{href:"https://github.com/Level/leveldown",children:"LevelDB C++ binding"})," to store that data on the filesystem. It has the best performance compared to other filesystem adapters. This adapter can ",(0,a.jsx)(s.strong,{children:"not"})," be used when multiple nodejs-processes access the same filesystem folders for storage."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// npm install leveldown --save"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// npm install pouchdb-adapter-leveldb --save"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addPouchPlugin"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"require"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'pouchdb-adapter-leveldb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")); "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// leveldown adapters need the leveldb plugin to work"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" leveldown"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'leveldown'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStoragePouch"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(leveldown) "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// the full leveldown-module"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// or use a specific folder to store the data"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '/root/user/project/mydatabase'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStoragePouch"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(leveldown) "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// the full leveldown-module"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(s.h2,{id:"node-websql",children:"Node-Websql"}),"\n",(0,a.jsxs)(s.p,{children:["This adapter uses the ",(0,a.jsx)(s.a,{href:"https://github.com/nolanlawson/node-websql",children:"node-websql"}),"-shim to store data on the filesystem. Its advantages are that it does not need a leveldb build and it can be used when multiple nodejs-processes use the same database-files."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// npm install pouchdb-adapter-node-websql --save"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addPouchPlugin"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"require"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'pouchdb-adapter-node-websql'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"));"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStoragePouch"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'websql'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:") "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// the name of your adapter"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// or use a specific folder to store the data"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '/root/user/project/mydatabase'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStoragePouch"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'websql'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:") "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// the name of your adapter"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(s.h1,{id:"react-native",children:"React-Native"}),"\n",(0,a.jsx)(s.h2,{id:"react-native-sqlite",children:"react-native-sqlite"}),"\n",(0,a.jsxs)(s.p,{children:["Uses ReactNative SQLite as storage. Claims to be much faster than the asyncstorage adapter.\nTo use it, you have to do some steps from ",(0,a.jsx)(s.a,{href:"https://dev.to/craftzdog/hacking-pouchdb-to-use-on-react-native-1gjh",children:"this tutorial"}),"."]}),"\n",(0,a.jsxs)(s.p,{children:["First install ",(0,a.jsx)(s.code,{children:"pouchdb-adapter-react-native-sqlite"})," and ",(0,a.jsx)(s.code,{children:"react-native-sqlite-2"}),"."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,a.jsx)(s.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" pouchdb-adapter-react-native-sqlite"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" react-native-sqlite-2"})]})})})}),"\n",(0,a.jsxs)(s.p,{children:["Then you have to ",(0,a.jsx)(s.a,{href:"https://facebook.github.io/react-native/docs/linking-libraries-ios",children:"link"})," the library."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,a.jsx)(s.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"react-native"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" link"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" react-native-sqlite-2"})]})})})}),"\n",(0,a.jsx)(s.p,{children:"You also have to add some polyfills which are need but not included in react-native."}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,a.jsx)(s.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" base-64"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" events"})]})})})}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { decode"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" encode } "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'base-64'"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"if"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"global"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".btoa) {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" global"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".btoa "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" encode;"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"if"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"global"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".atob) {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" global"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".atob "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" decode;"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Avoid using node dependent modules"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"process"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".browser "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]})]})})}),"\n",(0,a.jsx)(s.p,{children:"Then you can use it inside of your code."}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { addPouchPlugin"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStoragePouch } "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/pouchdb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" SQLite "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'react-native-sqlite-2'"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" SQLiteAdapterFactory "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'pouchdb-adapter-react-native-sqlite'"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" SQLiteAdapter"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" SQLiteAdapterFactory"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(SQLite)"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addPouchPlugin"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(SQLiteAdapter);"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addPouchPlugin"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"require"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'pouchdb-adapter-http'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"));"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStoragePouch"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'react-native-sqlite'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:") "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// the name of your adapter"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(s.h2,{id:"asyncstorage",children:"asyncstorage"}),"\n",(0,a.jsxs)(s.p,{children:["Uses react-native's ",(0,a.jsx)(s.a,{href:"https://facebook.github.io/react-native/docs/asyncstorage",children:"asyncstorage"}),"."]}),"\n",(0,a.jsx)(s.admonition,{type:"note",children:(0,a.jsxs)(s.p,{children:["There are ",(0,a.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/issues/2286",children:"known problems"})," with this adapter and it is ",(0,a.jsx)(s.strong,{children:"not"})," recommended to use it."]})}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// npm install pouchdb-adapter-asyncstorage --save"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addPouchPlugin"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"require"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'pouchdb-adapter-asyncstorage'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"));"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStoragePouch"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'node-asyncstorage'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:") "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// the name of your adapter"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(s.h2,{id:"asyncstorage-down",children:"asyncstorage-down"}),"\n",(0,a.jsx)(s.p,{children:"A leveldown adapter that stores on asyncstorage."}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// npm install pouchdb-adapter-asyncstorage-down --save"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addPouchPlugin"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"require"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'pouchdb-adapter-leveldb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")); "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// leveldown adapters need the leveldb plugin to work"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" asyncstorageDown"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'asyncstorage-down'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStoragePouch"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(asyncstorageDown) "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// the full leveldown-module"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(s.h1,{id:"cordova--phonegap--capacitor",children:"Cordova / Phonegap / Capacitor"}),"\n",(0,a.jsx)(s.h2,{id:"cordova-sqlite",children:"cordova-sqlite"}),"\n",(0,a.jsxs)(s.p,{children:["Uses cordova's global ",(0,a.jsx)(s.code,{children:"cordova.sqlitePlugin"}),". It can be used with cordova and capacitor."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// npm install pouchdb-adapter-cordova-sqlite --save"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addPouchPlugin"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"require"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'pouchdb-adapter-cordova-sqlite'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"));"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * In capacitor/cordova you have to wait until all plugins are loaded and 'window.sqlitePlugin'"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * can be accessed."})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * This function waits until document deviceready is called which ensures that everything is loaded."})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"@link"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" https://cordova.apache.org/docs/de/latest/cordova/events/events.deviceready.html"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" awaitCapacitorDeviceReady"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Promise"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"void"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"> {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" Promise"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(res "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" document"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addEventListener"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'deviceready'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" res"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(){"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // first wait until the deviceready event is fired"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" awaitCapacitorDeviceReady"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStoragePouch"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'cordova-sqlite'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // pouch settings are passed as second parameter"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // for ios devices, the cordova-sqlite adapter needs to know where to save the data."})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" iosDatabaseLocation"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Library'"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" )"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,a.jsx)(s,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},8453(e,s,n){n.d(s,{R:()=>i,x:()=>l});var r=n(6540);const a={},o=r.createContext(a);function i(e){const s=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/6cbff7c2.db294439.js b/docs/assets/js/6cbff7c2.db294439.js deleted file mode 100644 index dbf309dea20..00000000000 --- a/docs/assets/js/6cbff7c2.db294439.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[7408],{7010(e,s,r){r.r(s),r.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rx-storage-opfs","title":"Supercharged OPFS Database with RxDB","description":"Discover how to harness the Origin Private File System with RxDB\'s OPFS RxStorage for unrivaled performance and security in client-side data storage.","source":"@site/docs/rx-storage-opfs.md","sourceDirName":".","slug":"/rx-storage-opfs.html","permalink":"/rx-storage-opfs.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Supercharged OPFS Database with RxDB","slug":"rx-storage-opfs.html","description":"Discover how to harness the Origin Private File System with RxDB\'s OPFS RxStorage for unrivaled performance and security in client-side data storage."},"sidebar":"tutorialSidebar","previous":{"title":"IndexedDB \ud83d\udc51 (Browser, Capacitor)","permalink":"/rx-storage-indexeddb.html"},"next":{"title":"Memory","permalink":"/rx-storage-memory.html"}}');var i=r(4848),o=r(8453);const a={title:"Supercharged OPFS Database with RxDB",slug:"rx-storage-opfs.html",description:"Discover how to harness the Origin Private File System with RxDB's OPFS RxStorage for unrivaled performance and security in client-side data storage."},t="Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage",l={},c=[{value:"What is OPFS",id:"what-is-opfs",level:2},{value:"OPFS limitations",id:"opfs-limitations",level:3},{value:"How the OPFS API works",id:"how-the-opfs-api-works",level:2},{value:"OPFS performance",id:"opfs-performance",level:2},{value:"Using OPFS as RxStorage in RxDB",id:"using-opfs-as-rxstorage-in-rxdb",level:2},{value:"Using OPFS in the main thread instead of a worker",id:"using-opfs-in-the-main-thread-instead-of-a-worker",level:2},{value:"Building a custom worker.js",id:"building-a-custom-workerjs",level:2},{value:"Setting usesRxDatabaseInWorker when a RxDatabase is also used inside of the worker",id:"setting-usesrxdatabaseinworker-when-a-rxdatabase-is-also-used-inside-of-the-worker",level:2},{value:"OPFS in Electron, React-Native or Capacitor.js",id:"opfs-in-electron-react-native-or-capacitorjs",level:2},{value:"Difference between File System Access API and Origin Private File System (OPFS)",id:"difference-between-file-system-access-api-and-origin-private-file-system-opfs",level:2},{value:"Learn more about OPFS:",id:"learn-more-about-opfs",level:2}];function d(e){const s={a:"a",code:"code",em:"em",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"origin-private-file-system-opfs-database-with-the-rxdb-opfs-rxstorage",children:"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage"})}),"\n",(0,i.jsxs)(s.p,{children:["With the ",(0,i.jsx)(s.a,{href:"https://rxdb.info/",children:"RxDB"})," OPFS storage you can build a fully featured database on top of the ",(0,i.jsx)(s.a,{href:"https://web.dev/opfs",children:"Origin Private File System"})," (OPFS) browser API. Compared to other storage solutions, it has a way better performance."]}),"\n",(0,i.jsx)(s.h2,{id:"what-is-opfs",children:"What is OPFS"}),"\n",(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.strong,{children:"Origin Private File System (OPFS)"})," is a native browser storage API that allows web applications to manage files in a private, sandboxed, ",(0,i.jsx)(s.strong,{children:"origin-specific virtual filesystem"}),". Unlike ",(0,i.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB"})," and ",(0,i.jsx)(s.a,{href:"/articles/localstorage.html",children:"LocalStorage"}),", which are optimized as object/key-value storage, OPFS provides more granular control for file operations, enabling byte-by-byte access, file streaming, and even low-level manipulations.\nOPFS is ideal for applications requiring ",(0,i.jsx)(s.strong,{children:"high-performance"})," file operations (",(0,i.jsx)(s.strong,{children:"3x-4x faster compared to IndexedDB"}),") inside of a client-side application, offering advantages like improved speed, more efficient use of resources, and enhanced security and privacy features."]}),"\n",(0,i.jsx)(s.h3,{id:"opfs-limitations",children:"OPFS limitations"}),"\n",(0,i.jsxs)(s.p,{children:["From the beginning of 2023, the Origin Private File System API is supported by ",(0,i.jsx)(s.a,{href:"https://caniuse.com/native-filesystem-api",children:"all modern browsers"})," like Safari, Chrome, Edge and Firefox. Only Internet Explorer is not supported and likely will never get support."]}),"\n",(0,i.jsxs)(s.p,{children:["It is important to know that the most performant synchronous methods like ",(0,i.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/FileSystemSyncAccessHandle/read",children:(0,i.jsx)(s.code,{children:"read()"})})," and ",(0,i.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/FileSystemSyncAccessHandle/write",children:(0,i.jsx)(s.code,{children:"write()"})})," of the OPFS API are ",(0,i.jsxs)(s.strong,{children:["only available inside of a ",(0,i.jsx)(s.a,{href:"/rx-storage-worker.html",children:"WebWorker"})]}),".\nThey cannot be used in the main thread, an iFrame or even a ",(0,i.jsx)(s.a,{href:"/rx-storage-shared-worker.html",children:"SharedWorker"}),".\nThe OPFS ",(0,i.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/FileSystemFileHandle/createSyncAccessHandle",children:(0,i.jsx)(s.code,{children:"createSyncAccessHandle()"})})," method that gives you access to the synchronous methods is not exposed in the main thread, only in a Worker."]}),"\n",(0,i.jsxs)(s.p,{children:["While there is no concrete ",(0,i.jsx)(s.strong,{children:"data size limit"})," defined by the API, browsers will refuse to store more ",(0,i.jsx)(s.a,{href:"/articles/indexeddb-max-storage-limit.html",children:"data at some point"}),".\nIf no more data can be written, a ",(0,i.jsx)(s.code,{children:"QuotaExceededError"})," is thrown which should be handled by the application, like showing an error message to the user."]}),"\n",(0,i.jsx)(s.h2,{id:"how-the-opfs-api-works",children:"How the OPFS API works"}),"\n",(0,i.jsxs)(s.p,{children:["The OPFS API is pretty straightforward to use. First you get the root filesystem. Then you can create files and directories on that. Notice that whenever you ",(0,i.jsx)(s.em,{children:"synchronously"})," write to, or read from a file, an ",(0,i.jsx)(s.code,{children:"ArrayBuffer"})," must be used that contains the data. It is not possible to synchronously write plain strings or objects into the file. Therefore the ",(0,i.jsx)(s.code,{children:"TextEncoder"})," and ",(0,i.jsx)(s.code,{children:"TextDecoder"})," API must be used."]}),"\n",(0,i.jsxs)(s.p,{children:["Also notice that some of the methods of ",(0,i.jsx)(s.code,{children:"FileSystemSyncAccessHandle"})," ",(0,i.jsx)(s.a,{href:"https://developer.chrome.com/blog/sync-methods-for-accesshandles",children:"have been asynchronous"})," in the past, but are synchronous since Chromium 108. To make it less confusing, we just use ",(0,i.jsx)(s.code,{children:"await"})," in front of them, so it will work in both cases."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Access the root directory of the origin's private file system."})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" root"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" navigator"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".getDirectory"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Create a subdirectory."})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" diaryDirectory"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" root"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".getDirectoryHandle"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'subfolder'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" create"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Create a new file named 'example.txt'."})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" fileHandle"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" diaryDirectory"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".getFileHandle"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'example.txt'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" create"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Create a FileSystemSyncAccessHandle on the file."})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" accessHandle"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" fileHandle"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".createSyncAccessHandle"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Write a sentence to the file."})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"let"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" writeBuffer "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" TextEncoder"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".encode"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Hello from RxDB'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" writeSize"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" accessHandle"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".write"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(writeBuffer);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Read file and transform data to string."})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" readBuffer"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Uint8Array"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(writeSize);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" readSize"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" accessHandle"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".read"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(readBuffer"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { at"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" contentAsString"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" TextDecoder"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".decode"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(readBuffer);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Write an exclamation mark to the end of the file."})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"writeBuffer "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" TextEncoder"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".encode"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'!'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"accessHandle"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".write"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(writeBuffer"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { at"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" readSize });"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Truncate file to 10 bytes."})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" accessHandle"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".truncate"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"10"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Get the new size of the file."})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" fileSize"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" accessHandle"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".getSize"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Persist changes to disk."})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" accessHandle"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".flush"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Always close FileSystemSyncAccessHandle if done, so others can open the file again."})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" accessHandle"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".close"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),"\n",(0,i.jsxs)(s.p,{children:["A more detailed description of the OPFS API can be found ",(0,i.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/File_System_API/Origin_private_file_system",children:"on MDN"}),"."]}),"\n",(0,i.jsx)(s.h2,{id:"opfs-performance",children:"OPFS performance"}),"\n",(0,i.jsxs)(s.p,{children:["Because the Origin Private File System API provides low-level access to binary files, it is much faster compared to ",(0,i.jsx)(s.a,{href:"/slow-indexeddb.html",children:"IndexedDB"})," or ",(0,i.jsx)(s.a,{href:"/articles/localstorage.html",children:"localStorage"}),". According to the ",(0,i.jsx)(s.a,{href:"https://pubkey.github.io/client-side-databases/database-comparison/index.html",children:"storage performance test"}),", OPFS is up to 2x times faster on plain inserts when a new file is created on each write. Reads are even faster."]}),"\n",(0,i.jsxs)(s.p,{children:["A good comparison about real world scenarios, are the ",(0,i.jsx)(s.a,{href:"/rx-storage-performance.html",children:"performance results"})," of the various RxDB storages. Here it shows that reads are up to 4x faster compared to IndexedDB, even with complex queries:"]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"./files/rx-storage-performance-browser.png",alt:"RxStorage performance - browser",width:"700"})}),"\n",(0,i.jsx)(s.h2,{id:"using-opfs-as-rxstorage-in-rxdb",children:"Using OPFS as RxStorage in RxDB"}),"\n",(0,i.jsxs)(s.p,{children:["The OPFS ",(0,i.jsx)(s.a,{href:"/rx-storage.html",children:"RxStorage"})," itself must run inside a WebWorker. Therefore we use the ",(0,i.jsx)(s.a,{href:"/rx-storage-worker.html",children:"Worker RxStorage"})," and let it point to the prebuild ",(0,i.jsx)(s.code,{children:"opfs.worker.js"})," file that comes shipped with RxDB Premium \ud83d\udc51."]}),"\n",(0,i.jsxs)(s.p,{children:["Notice that the OPFS RxStorage is part of the ",(0,i.jsx)(s.a,{href:"/premium/",children:"RxDB Premium \ud83d\udc51"})," plugin that must be purchased."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageWorker } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-worker'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageWorker"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * This file must be statically served from a webserver."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * You might want to first copy it somewhere outside of"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * your node_modules folder."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" workerInput"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'node_modules/rxdb-premium/dist/workers/opfs.worker.js'"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" )"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.h2,{id:"using-opfs-in-the-main-thread-instead-of-a-worker",children:"Using OPFS in the main thread instead of a worker"}),"\n",(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.code,{children:"createSyncAccessHandle"})," method from the Filesystem API is only available inside of a Webworker. Therefore you cannot use ",(0,i.jsx)(s.code,{children:"getRxStorageOPFS()"})," in the main thread. But there is a slightly slower way to access the virtual filesystem from the main thread. RxDB support the ",(0,i.jsx)(s.code,{children:"getRxStorageOPFSMainThread()"})," for that. Notice that this uses the ",(0,i.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/FileSystemFileHandle/createWritable",children:"createWritable"})," function which is not supported in safari."]}),"\n",(0,i.jsx)(s.p,{children:"Using OPFS from the main thread can have benefits because not having to cross the worker bridge can reduce latence in reads and writes."}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageOPFSMainThread } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-opfs'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageOPFSMainThread"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.h2,{id:"building-a-custom-workerjs",children:["Building a custom ",(0,i.jsx)(s.code,{children:"worker.js"})]}),"\n",(0,i.jsxs)(s.p,{children:["When you want to run additional plugins like storage wrappers or replication ",(0,i.jsx)(s.strong,{children:"inside"})," of the worker, you have to build your own ",(0,i.jsx)(s.code,{children:"worker.js"})," file. You can do that similar to other workers by calling ",(0,i.jsx)(s.code,{children:"exposeWorkerRxStorage"})," like described in the ",(0,i.jsx)(s.a,{href:"/rx-storage-worker.html",children:"worker storage plugin"}),"."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// inside of the worker.js file"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageOPFS } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-opfs'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { exposeWorkerRxStorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-worker'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageOPFS"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"exposeWorkerRxStorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.h2,{id:"setting-usesrxdatabaseinworker-when-a-rxdatabase-is-also-used-inside-of-the-worker",children:["Setting ",(0,i.jsx)(s.code,{children:"usesRxDatabaseInWorker"})," when a RxDatabase is also used inside of the worker"]}),"\n",(0,i.jsxs)(s.p,{children:["When you use the OPFS inside of a worker, it will internally use strings to represent operation results. This has the benefit that transferring strings from the worker to the main thread, is way faster compared to complex json objects. The ",(0,i.jsx)(s.code,{children:"getRxStorageWorker()"})," will automatically decode these strings on the main thread so that the data can be used by the RxDatabase."]}),"\n",(0,i.jsxs)(s.p,{children:["But using a RxDatabase ",(0,i.jsx)(s.strong,{children:"inside"})," of your worker can make sense for example when you want to move the ",(0,i.jsx)(s.a,{href:"/replication.html",children:"replication"})," with a server. To enable this, you have to set ",(0,i.jsx)(s.code,{children:"usesRxDatabaseInWorker"})," to ",(0,i.jsx)(s.code,{children:"true"}),":"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// inside of the worker.js file"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageOPFS } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-opfs'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageOPFS"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" usesRxDatabaseInWorker"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.p,{children:["If you forget to set this and still create and use a ",(0,i.jsx)(s.a,{href:"/rx-database.html",children:"RxDatabase"})," inside of the worker, you might get the error message",(0,i.jsx)(s.code,{children:"or"}),"Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'length')`."]}),"\n",(0,i.jsx)(s.h2,{id:"opfs-in-electron-react-native-or-capacitorjs",children:"OPFS in Electron, React-Native or Capacitor.js"}),"\n",(0,i.jsx)(s.p,{children:"Origin Private File System is a browser API that is only accessible in browsers. Other JavaScript like React-Native or Node.js, do not support it."}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Electron"})," has two JavaScript contexts: the browser (chromium) context and the Node.js context. While you could use the OPFS API in the browser context, it is not recommended. Instead you should use the Filesystem API of Node.js and then only transfer the relevant data with the ",(0,i.jsx)(s.a,{href:"https://www.electronjs.org/de/docs/latest/api/ipc-renderer",children:"ipcRenderer"}),". With RxDB that is pretty easy to configure:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["In the ",(0,i.jsx)(s.code,{children:"main.js"}),", expose the ",(0,i.jsx)(s.a,{href:"/rx-storage-filesystem-node.html",children:"Node Filesystem"})," storage with the ",(0,i.jsx)(s.code,{children:"exposeIpcMainRxStorage()"})," that comes with the ",(0,i.jsx)(s.a,{href:"/electron.html",children:"electron plugin"})]}),"\n",(0,i.jsxs)(s.li,{children:["In the browser context, access the main storage with the ",(0,i.jsx)(s.code,{children:"getRxStorageIpcRenderer()"})," method."]}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"React Native"})," (and Expo) does not have an OPFS API. You could use the ReactNative Filesystem to directly write data. But to get a fully featured database like RxDB it is easier to use the ",(0,i.jsx)(s.a,{href:"/rx-storage-sqlite.html",children:"SQLite RxStorage"})," which starts an SQLite database inside of the ReactNative app and uses that to do the database operations."]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Capacitor.js"})," is able to access the OPFS API."]}),"\n",(0,i.jsxs)(s.h2,{id:"difference-between-file-system-access-api-and-origin-private-file-system-opfs",children:["Difference between ",(0,i.jsx)(s.code,{children:"File System Access API"})," and ",(0,i.jsx)(s.code,{children:"Origin Private File System (OPFS)"})]}),"\n",(0,i.jsxs)(s.p,{children:["Often developers are confused with the differences between the ",(0,i.jsx)(s.code,{children:"File System Access API"})," and the ",(0,i.jsx)(s.code,{children:"Origin Private File System (OPFS)"}),"."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["The ",(0,i.jsx)(s.code,{children:"File System Access API"})," provides access to the files on the device file system, like the ones shown in the file explorer of the operating system. To use the File System API, the user has to actively select the files from a filepicker."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"Origin Private File System (OPFS)"})," is a sub-part of the ",(0,i.jsx)(s.code,{children:"File System Standard"})," and it only describes the things you can do with the filesystem root from ",(0,i.jsx)(s.code,{children:"navigator.storage.getDirectory()"}),". OPFS writes to a ",(0,i.jsx)(s.strong,{children:"sandboxed"})," filesystem, not visible to the user. Therefore the user does not have to actively select or allow the data access."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"learn-more-about-opfs",children:"Learn more about OPFS:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"https://webkit.org/blog/12257/the-file-system-access-api-with-origin-private-file-system/",children:"WebKit: The File System API with Origin Private File System"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"https://caniuse.com/native-filesystem-api",children:"Browser Support"})}),"\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.a,{href:"https://pubkey.github.io/client-side-databases/database-comparison/index.html",children:"Performance Test Tool"})}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453(e,s,r){r.d(s,{R:()=>a,x:()=>t});var n=r(6540);const i={},o=n.createContext(i);function a(e){const s=n.useContext(o);return n.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(i):e.components||i:a(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/6fa8aa1a.10d4f0d3.js b/docs/assets/js/6fa8aa1a.10d4f0d3.js deleted file mode 100644 index ecb2f5dca32..00000000000 --- a/docs/assets/js/6fa8aa1a.10d4f0d3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[1264],{5379(e,t,a){a.r(t),a.d(t,{default:()=>i});var r=a(544),n=a(4848);function i(){return(0,r.default)({sem:{id:"gads",metaTitle:"The NoSQL alternative for PouchDB",title:(0,n.jsxs)(n.Fragment,{children:["The ",(0,n.jsx)("b",{children:"modern"})," alternative for"," ",(0,n.jsx)("b",{children:"PouchDB"})]}),text:(0,n.jsx)(n.Fragment,{children:"Store data inside the Browser to build high performance realtime applications that sync data from the backend and even work when offline."})}})}}}]); \ No newline at end of file diff --git a/docs/assets/js/6fd28feb.45da1980.js b/docs/assets/js/6fd28feb.45da1980.js deleted file mode 100644 index 0f6772738e0..00000000000 --- a/docs/assets/js/6fd28feb.45da1980.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[4618],{5989(e,n,s){s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>h,frontMatter:()=>t,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"rx-storage-foundationdb","title":"RxDB on FoundationDB - Performance at Scale","description":"Combine FoundationDB\'s reliability with RxDB\'s indexing and schema validation. Build scalable apps with faster queries and real-time data.","source":"@site/docs/rx-storage-foundationdb.md","sourceDirName":".","slug":"/rx-storage-foundationdb.html","permalink":"/rx-storage-foundationdb.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB on FoundationDB - Performance at Scale","slug":"rx-storage-foundationdb.html","description":"Combine FoundationDB\'s reliability with RxDB\'s indexing and schema validation. Build scalable apps with faster queries and real-time data."},"sidebar":"tutorialSidebar","previous":{"title":"DenoKV","permalink":"/rx-storage-denokv.html"},"next":{"title":"Schema Validation","permalink":"/schema-validation.html"}}');var i=s(4848),o=s(8453);const t={title:"RxDB on FoundationDB - Performance at Scale",slug:"rx-storage-foundationdb.html",description:"Combine FoundationDB's reliability with RxDB's indexing and schema validation. Build scalable apps with faster queries and real-time data."},r="RxDB Database on top of FoundationDB",l={},d=[{value:"Features of RxDB+FoundationDB",id:"features-of-rxdbfoundationdb",level:2},{value:"Installation",id:"installation",level:2},{value:"Usage",id:"usage",level:2},{value:"Multi Instance",id:"multi-instance",level:2}];function c(e){const n={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"rxdb-database-on-top-of-foundationdb",children:"RxDB Database on top of FoundationDB"})}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://www.foundationdb.org/",children:"FoundationDB"})," is a distributed key-value store designed to handle large volumes of structured data across clusters of computers while maintaining high levels of performance, scalability, and fault tolerance. While FoundationDB itself only can store and query key-value pairs, it lacks more advanced features like complex queries, encryption and replication."]}),"\n",(0,i.jsxs)(n.p,{children:["With the FoundationDB based ",(0,i.jsx)(n.a,{href:"/rx-storage.html",children:"RxStorage"})," of ",(0,i.jsx)(n.a,{href:"https://rxdb.info/",children:"RxDB"})," you can combine the benefits of FoundationDB while having a fully featured, high performance NoSQL database."]}),"\n",(0,i.jsx)(n.h2,{id:"features-of-rxdbfoundationdb",children:"Features of RxDB+FoundationDB"}),"\n",(0,i.jsx)(n.p,{children:"Using RxDB on top of FoundationDB, gives you many benefits compare to using the plain FoundationDB API:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Indexes"}),": In RxDB with a FoundationDB storage layer, indexes are used to optimize query performance, allowing for fast and efficient data retrieval even in large datasets. You can define single and compound indexes with the ",(0,i.jsx)(n.a,{href:"/rx-schema.html",children:"RxDB schema"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Schema Based Data Model"}),": Utilizing a ",(0,i.jsx)(n.a,{href:"/rx-schema.html",children:"jsonschema"})," based data model, the system offers a highly structured and versatile approach to organizing and ",(0,i.jsx)(n.a,{href:"/schema-validation.html",children:"validating data"}),", ensuring consistency and clarity in database interactions."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Complex Queries"}),": The system supports complex ",(0,i.jsx)(n.a,{href:"/rx-query.html",children:"NoSQL queries"}),", allowing for advanced data manipulation and retrieval, tailored to specific needs and intricate data relationships. For example you can do ",(0,i.jsx)(n.code,{children:"$regex"})," or ",(0,i.jsx)(n.code,{children:"$or"})," queries which is hardy possible with the plain key-value access of FoundationDB."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Observable Queries & Documents"}),": RxDB's observable queries and documents feature ensures real-time updates and synchronization, providing dynamic and responsive data interactions in applications."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Compression"}),": RxDB employs data ",(0,i.jsx)(n.a,{href:"/key-compression.html",children:"compression techniques"})," to reduce storage requirements and enhance transmission efficiency, making it more cost-effective and faster, especially for large volumes of data. You can compress the ",(0,i.jsx)(n.a,{href:"/key-compression.html",children:"NoSQL document"})," data, but also the ",(0,i.jsx)(n.a,{href:"/rx-attachment.html#attachment-compression",children:"binary attachments"})," data."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Attachments"}),": RxDB supports the storage and management of ",(0,i.jsx)(n.a,{href:"/rx-attachment.html",children:"attachments"})," which allowing for the seamless inclusion of binary data like images or documents alongside structured data within the database."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Install the ",(0,i.jsx)(n.a,{href:"https://apple.github.io/foundationdb/getting-started-linux.html",children:"FoundationDB client cli"})," which is used to communicate with the FoundationDB cluster."]}),"\n",(0,i.jsxs)(n.li,{children:["Install the ",(0,i.jsx)(n.a,{href:"https://www.npmjs.com/package/foundationdb",children:"FoundationDB node bindings npm module"})," via ",(0,i.jsx)(n.code,{children:"npm install foundationdb"}),". This will install ",(0,i.jsx)(n.code,{children:"v2.x.x"}),", which is only compatible with FoundationDB server and client ",(0,i.jsx)(n.code,{children:"v7.3.x"})," (which is the only version currently maintained by the FoundationDB team). If you need to use an older version (e.g. ",(0,i.jsx)(n.code,{children:"7.1.x"})," or ",(0,i.jsx)(n.code,{children:"6.3.x"}),"), you should run ",(0,i.jsx)(n.code,{children:"npm install foundationdb@1.1.4"})," (though this might only work with ",(0,i.jsx)(n.code,{children:"v6.3.x"}),")."]}),"\n",(0,i.jsxs)(n.li,{children:["Due to an outstanding bug in node foundationdb, you will need to specify an ",(0,i.jsx)(n.code,{children:"apiVersion"})," of ",(0,i.jsx)(n.code,{children:"720"})," even though you are using ",(0,i.jsx)(n.code,{children:"730"}),". When ",(0,i.jsx)(n.a,{href:"https://github.com/josephg/node-foundationdb/pull/86",children:"this PR"})," is merged, you will be able to use ",(0,i.jsx)(n.code,{children:"730"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageFoundationDB"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-foundationdb'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageFoundationDB"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Version of the API of the FoundationDB cluster.."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * FoundationDB is backwards compatible across a wide range of versions,"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * so you have to specify the api version."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * If in doubt, set it to 720."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" apiVersion"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 720"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Path to the FoundationDB cluster file."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * (optional)"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * If in doubt, leave this empty to use the default location."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" clusterFile"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '/path/to/fdb.cluster'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Amount of documents to be fetched in batch requests."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * You can change this to improve performance depending on"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * your database access patterns."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * (optional)"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * [default=50]"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 50"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(n.h2,{id:"multi-instance",children:"Multi Instance"}),"\n",(0,i.jsxs)(n.p,{children:["Because FoundationDB does not offer a ",(0,i.jsx)(n.a,{href:"https://forums.foundationdb.org/t/streaming-data-out-of-foundationdb/683/2",children:"changestream"}),", it is not possible to use the same cluster from more than one Node.js process at the same time. For example you cannot spin up multiple servers with RxDB databases that all use the same cluster. There might be workarounds to create something like a FoundationDB changestream and you can make a Pull Request if you need that feature."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453(e,n,s){s.d(n,{R:()=>t,x:()=>r});var a=s(6540);const i={},o=a.createContext(i);function t(e){const n=a.useContext(o);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),a.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/714575d7.f4b12fd2.js b/docs/assets/js/714575d7.f4b12fd2.js deleted file mode 100644 index 4fa922cee2c..00000000000 --- a/docs/assets/js/714575d7.f4b12fd2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[3185],{924(e,s,n){n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>i,default:()=>h,frontMatter:()=>l,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"rx-local-document","title":"Master Local Documents in RxDB","description":"Effortlessly store custom metadata and app settings in RxDB. Learn how Local Documents keep data flexible, secure, and easy to manage.","source":"@site/docs/rx-local-document.md","sourceDirName":".","slug":"/rx-local-document.html","permalink":"/rx-local-document.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Master Local Documents in RxDB","slug":"rx-local-document.html","description":"Effortlessly store custom metadata and app settings in RxDB. Learn how Local Documents keep data flexible, secure, and easy to manage."},"sidebar":"tutorialSidebar","previous":{"title":"RxState","permalink":"/rx-state.html"},"next":{"title":"Cleanup","permalink":"/cleanup.html"}}');var r=n(4848),a=n(8453);const l={title:"Master Local Documents in RxDB",slug:"rx-local-document.html",description:"Effortlessly store custom metadata and app settings in RxDB. Learn how Local Documents keep data flexible, secure, and easy to manage."},i="Local Documents",t={},c=[{value:"Add the local documents plugin",id:"add-the-local-documents-plugin",level:2},{value:"Activate the plugin for a RxDatabase or RxCollection",id:"activate-the-plugin-for-a-rxdatabase-or-rxcollection",level:2},{value:"insertLocal()",id:"insertlocal",level:2},{value:"upsertLocal()",id:"upsertlocal",level:2},{value:"getLocal()",id:"getlocal",level:2},{value:"getLocal$()",id:"getlocal-1",level:2},{value:"RxLocalDocument",id:"rxlocaldocument",level:2}];function d(e){const s={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"local-documents",children:"Local Documents"})}),"\n",(0,r.jsx)(s.p,{children:"Local documents are a special class of documents which are used to store local metadata.\nThey come in handy when you want to store settings or additional data next to your documents."}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Local Documents can exist on a ",(0,r.jsx)(s.a,{href:"/rx-database.html",children:"RxDatabase"})," or ",(0,r.jsx)(s.a,{href:"/rx-collection.html",children:"RxCollection"}),"."]}),"\n",(0,r.jsx)(s.li,{children:"Local Document do not have to match the collections schema."}),"\n",(0,r.jsx)(s.li,{children:"Local Documents do not get replicated."}),"\n",(0,r.jsx)(s.li,{children:"Local Documents will not be found on queries."}),"\n",(0,r.jsx)(s.li,{children:"Local Documents can not have attachments."}),"\n",(0,r.jsxs)(s.li,{children:["Local Documents will not get handled by the ",(0,r.jsx)(s.a,{href:"/migration-schema.html",children:"migration-schema"}),"."]}),"\n",(0,r.jsxs)(s.li,{children:["The id of a local document has the ",(0,r.jsx)(s.code,{children:"maxLength"})," of ",(0,r.jsx)(s.code,{children:"128"})," characters."]}),"\n"]}),"\n",(0,r.jsx)(s.admonition,{type:"note",children:(0,r.jsxs)(s.p,{children:["While local documents can be very useful, in many cases the ",(0,r.jsx)(s.a,{href:"/rx-state.html",children:"RxState"})," API is more convenient."]})}),"\n",(0,r.jsx)(s.h2,{id:"add-the-local-documents-plugin",children:"Add the local documents plugin"}),"\n",(0,r.jsxs)(s.p,{children:["To enable the local documents, you have to add the ",(0,r.jsx)(s.code,{children:"local-documents"})," plugin."]}),"\n",(0,r.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { addRxPlugin } "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { RxDBLocalDocumentsPlugin } "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/local-documents'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addRxPlugin"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(RxDBLocalDocumentsPlugin);"})]})]})})}),"\n",(0,r.jsx)(s.h2,{id:"activate-the-plugin-for-a-rxdatabase-or-rxcollection",children:"Activate the plugin for a RxDatabase or RxCollection"}),"\n",(0,r.jsxs)(s.p,{children:["For better performance, the local document plugin does not create a storage for every database or collection that is created.\nInstead you have to set ",(0,r.jsx)(s.code,{children:"localDocuments: true"})," when you want to store local documents in the instance."]}),"\n",(0,r.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,r.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// activate local documents on a RxDatabase"})}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" localDocuments"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- activate this to store local documents in the database"})]}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"myDatabase"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" messages"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" messageSchema"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" localDocuments"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- activate this to store local documents in the collection"})]}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,r.jsx)(s.admonition,{type:"note",children:(0,r.jsxs)(s.p,{children:["If you want to store local documents in a ",(0,r.jsx)(s.code,{children:"RxCollection"})," but ",(0,r.jsx)(s.strong,{children:"NOT"})," in the ",(0,r.jsx)(s.code,{children:"RxDatabase"}),", you ",(0,r.jsx)(s.strong,{children:"MUST NOT"})," set ",(0,r.jsx)(s.code,{children:"localDocuments: true"})," in the ",(0,r.jsx)(s.code,{children:"RxDatabase"})," because it will only slow down the initial database creation."]})}),"\n",(0,r.jsx)(s.h2,{id:"insertlocal",children:"insertLocal()"}),"\n",(0,r.jsxs)(s.p,{children:["Creates a local document for the database or collection. Throws if a local document with the same id already exists. Returns a Promise which resolves the new ",(0,r.jsx)(s.code,{children:"RxLocalDocument"}),"."]}),"\n",(0,r.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,r.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" localDoc"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".insertLocal"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foobar'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // id"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// data"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" foo"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bar'"})]}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// you can also use local-documents on a database"})}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" localDoc"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".insertLocal"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foobar'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // id"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// data"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" foo"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bar'"})]}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,r.jsx)(s.h2,{id:"upsertlocal",children:"upsertLocal()"}),"\n",(0,r.jsxs)(s.p,{children:["Creates a local document for the database or collection if not exists. Overwrites the if exists. Returns a Promise which resolves the ",(0,r.jsx)(s.code,{children:"RxLocalDocument"}),"."]}),"\n",(0,r.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,r.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" localDoc"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".upsertLocal"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foobar'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // id"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// data"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" foo"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bar'"})]}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,r.jsx)(s.h2,{id:"getlocal",children:"getLocal()"}),"\n",(0,r.jsxs)(s.p,{children:["Find a ",(0,r.jsx)(s.code,{children:"RxLocalDocument"})," by its id. Returns a Promise which resolves the ",(0,r.jsx)(s.code,{children:"RxLocalDocument"})," or ",(0,r.jsx)(s.code,{children:"null"})," if not exists."]}),"\n",(0,r.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,r.jsx)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" localDoc"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".getLocal"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'foobar'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})})})}),"\n",(0,r.jsx)(s.h2,{id:"getlocal-1",children:"getLocal$()"}),"\n",(0,r.jsxs)(s.p,{children:["Like ",(0,r.jsx)(s.code,{children:"getLocal()"})," but returns an ",(0,r.jsx)(s.code,{children:"Observable"})," that emits the document or ",(0,r.jsx)(s.code,{children:"null"})," if not exists."]}),"\n",(0,r.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,r.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" subscription"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".getLocal$"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'foobar'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(documentOrNull "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(documentOrNull); "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// > RxLocalDocument or null"})]}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,r.jsx)(s.h2,{id:"rxlocaldocument",children:"RxLocalDocument"}),"\n",(0,r.jsxs)(s.p,{children:["A ",(0,r.jsx)(s.code,{children:"RxLocalDocument"})," behaves like a normal ",(0,r.jsx)(s.code,{children:"RxDocument"}),"."]}),"\n",(0,r.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,r.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" localDoc"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".getLocal"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'foobar'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// access data"})}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" foo"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" localDoc"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".get"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'foo'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// change data"})}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"localDoc"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".set"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'foo'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bar2'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" localDoc"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".save"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// observe data"})}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"localDoc"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".get$"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'foo'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(value "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/* .. */"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})]}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// remove it"})}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" localDoc"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".remove"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),"\n",(0,r.jsx)(s.admonition,{type:"note",children:(0,r.jsx)(s.p,{children:"Because the local document does not have a schema, accessing the documents data-fields via pseudo-proxy will not work."})}),"\n",(0,r.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,r.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" foo"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" localDoc"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".foo; "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// undefined"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" foo"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" localDoc"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".get"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'foo'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"); "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// works!"})]}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"localDoc"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".foo "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bar'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"; "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// does not work!"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"localDoc"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".set"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'foo'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bar'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"); "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// works"})]})]})})}),"\n",(0,r.jsxs)(s.p,{children:["For the usage with typescript, you can have access to the typed data of the document over ",(0,r.jsx)(s.code,{children:"toJSON()"})]}),"\n",(0,r.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,r.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"declare"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" type"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" MyLocalDocumentType"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" foo"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" string"})]}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" localDoc"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".upsertLocal"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"MyLocalDocumentType"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">("})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foobar'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // id"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// data"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" foo"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bar'"})]}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// typescript will know that foo is a string"})}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" foo"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" string"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" localDoc"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".toJSON"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"().foo;"})]})]})})})]})}function h(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453(e,s,n){n.d(s,{R:()=>l,x:()=>i});var o=n(6540);const r={},a=o.createContext(r);function l(e){const s=o.useContext(a);return o.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),o.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/7443.f0d813bb.js b/docs/assets/js/7443.f0d813bb.js deleted file mode 100644 index 955917214af..00000000000 --- a/docs/assets/js/7443.f0d813bb.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[7443],{4004(e,t,s){"use strict";s.r(t),s.d(t,{default:()=>y});var i=s(4714),n=s.n(i);const l=s(8291);l.tokenizer.separator=/[\s\-/]+/;const a=class{constructor(e,t,s="/",i){this.searchDocs=e,this.lunrIndex=l.Index.load(t),this.baseUrl=s,this.maxHits=i}getLunrResult(e){return this.lunrIndex.query(function(t){const s=l.tokenizer(e);t.term(s,{boost:10}),t.term(s,{wildcard:l.Query.wildcard.TRAILING})})}getHit(e,t,s){return{hierarchy:{lvl0:e.pageTitle||e.title,lvl1:0===e.type?null:e.title},url:e.url,version:e.version,_snippetResult:s?{content:{value:s,matchLevel:"full"}}:null,_highlightResult:{hierarchy:{lvl0:{value:0===e.type?t||e.title:e.pageTitle},lvl1:0===e.type?null:{value:t||e.title}}}}}getTitleHit(e,t,s){const i=t[0],n=t[0]+s;let l=e.title.substring(0,i)+''+e.title.substring(i,n)+""+e.title.substring(n,e.title.length);return this.getHit(e,l)}getKeywordHit(e,t,s){const i=t[0],n=t[0]+s;let l=e.title+"
    Keywords: "+e.keywords.substring(0,i)+''+e.keywords.substring(i,n)+""+e.keywords.substring(n,e.keywords.length)+"";return this.getHit(e,l)}getContentHit(e,t){const s=t[0],i=t[0]+t[1];let n=s,l=i,a=!0,r=!0;for(let c=0;c<3;c++){const t=e.content.lastIndexOf(" ",n-2),s=e.content.lastIndexOf(".",n-2);if(s>0&&s>t){n=s+1,a=!1;break}if(t<0){n=0,a=!1;break}n=t+1}for(let c=0;c<10;c++){const t=e.content.indexOf(" ",l+1),s=e.content.indexOf(".",l+1);if(s>0&&s",o+=e.content.substring(i,l),r&&(o+=" ..."),this.getHit(e,null,o)}search(e){return new Promise((t,s)=>{const i=this.getLunrResult(e),n=[];i.length>this.maxHits&&(i.length=this.maxHits),this.titleHitsRes=[],this.contentHitsRes=[],i.forEach(t=>{const s=this.searchDocs[t.ref],{metadata:i}=t.matchData;for(let l in i)if(i[l].title){if(!this.titleHitsRes.includes(t.ref)){const a=i[l].title.position[0];n.push(this.getTitleHit(s,a,e.length)),this.titleHitsRes.push(t.ref)}}else if(i[l].content){const e=i[l].content.position[0];n.push(this.getContentHit(s,e))}else if(i[l].keywords){const a=i[l].keywords.position[0];n.push(this.getKeywordHit(s,a,e.length)),this.titleHitsRes.push(t.ref)}}),n.length>this.maxHits&&(n.length=this.maxHits),t(n)})}};var r=s(4498),o=s.n(r);const c="algolia-docsearch",h=`${c}-suggestion`,u={suggestion:`\n \n
    \n {{{category}}}\n
    \n
    \n
    \n {{{subcategory}}}\n
    \n {{#isTextOrSubcategoryNonEmpty}}\n
    \n
    {{{subcategory}}}
    \n
    {{{title}}}
    \n {{#text}}
    {{{text}}}
    {{/text}}\n {{#version}}
    {{version}}
    {{/version}}\n
    \n {{/isTextOrSubcategoryNonEmpty}}\n
    \n
    \n `,suggestionSimple:`\n
    \n
    \n {{^isLvl0}}\n {{{category}}}\n {{^isLvl1}}\n {{^isLvl1EmptyOrDuplicate}}\n \n {{{subcategory}}}\n \n {{/isLvl1EmptyOrDuplicate}}\n {{/isLvl1}}\n {{/isLvl0}}\n
    \n {{#isLvl2}}\n {{{title}}}\n {{/isLvl2}}\n {{#isLvl1}}\n {{{subcategory}}}\n {{/isLvl1}}\n {{#isLvl0}}\n {{{category}}}\n {{/isLvl0}}\n
    \n
    \n
    \n {{#text}}\n
    \n
    {{{text}}}
    \n
    \n {{/text}}\n
    \n
    \n `,footer:`\n
    \n
    \n `,empty:`\n
    \n
    \n
    \n
    \n
    \n No results found for query "{{query}}"\n
    \n
    \n
    \n
    \n
    \n `,searchBox:'\n \n\n\n '};var g=s(3704),d=s.n(g);const p={mergeKeyWithParent(e,t){if(void 0===e[t])return e;if("object"!=typeof e[t])return e;const s=d().extend({},e,e[t]);return delete s[t],s},groupBy(e,t){const s={};return d().each(e,(e,i)=>{if(void 0===i[t])throw new Error(`[groupBy]: Object has no key ${t}`);let n=i[t];"string"==typeof n&&(n=n.toLowerCase()),Object.prototype.hasOwnProperty.call(s,n)||(s[n]=[]),s[n].push(i)}),s},values:e=>Object.keys(e).map(t=>e[t]),flatten(e){const t=[];return e.forEach(e=>{Array.isArray(e)?e.forEach(e=>{t.push(e)}):t.push(e)}),t},flattenAndFlagFirst(e,t){const s=this.values(e).map(e=>e.map((e,s)=>(e[t]=0===s,e)));return this.flatten(s)},compact(e){const t=[];return e.forEach(e=>{e&&t.push(e)}),t},getHighlightedValue:(e,t)=>e._highlightResult&&e._highlightResult.hierarchy_camel&&e._highlightResult.hierarchy_camel[t]&&e._highlightResult.hierarchy_camel[t].matchLevel&&"none"!==e._highlightResult.hierarchy_camel[t].matchLevel&&e._highlightResult.hierarchy_camel[t].value?e._highlightResult.hierarchy_camel[t].value:e._highlightResult&&e._highlightResult&&e._highlightResult[t]&&e._highlightResult[t].value?e._highlightResult[t].value:e[t],getSnippetedValue(e,t){if(!e._snippetResult||!e._snippetResult[t]||!e._snippetResult[t].value)return e[t];let s=e._snippetResult[t].value;return s[0]!==s[0].toUpperCase()&&(s=`\u2026${s}`),-1===[".","!","?"].indexOf(s[s.length-1])&&(s=`${s}\u2026`),s},deepClone:e=>JSON.parse(JSON.stringify(e))};class v{constructor({searchDocs:e,searchIndex:t,inputSelector:s,debug:i=!1,baseUrl:n="/",queryDataCallback:l=null,autocompleteOptions:r={debug:!1,hint:!1,autoselect:!0},transformData:c=!1,queryHook:h=!1,handleSelected:g=!1,enhancedSearchInput:p=!1,layout:y="column",maxHits:m=5}){this.input=v.getInputFromSelector(s),this.queryDataCallback=l||null;const b=!(!r||!r.debug)&&r.debug;r.debug=i||b,this.autocompleteOptions=r,this.autocompleteOptions.cssClasses=this.autocompleteOptions.cssClasses||{},this.autocompleteOptions.cssClasses.prefix=this.autocompleteOptions.cssClasses.prefix||"ds";const f=this.input&&"function"==typeof this.input.attr&&this.input.attr("aria-label");this.autocompleteOptions.ariaLabel=this.autocompleteOptions.ariaLabel||f||"search input",this.isSimpleLayout="simple"===y,this.client=new a(e,t,n,m),p&&(this.input=v.injectSearchBox(this.input)),this.autocomplete=o()(this.input,r,[{source:this.getAutocompleteSource(c,h),templates:{suggestion:v.getSuggestionTemplate(this.isSimpleLayout),footer:u.footer,empty:v.getEmptyTemplate()}}]);const x=g;this.handleSelected=x||this.handleSelected,x&&d()(".algolia-autocomplete").on("click",".ds-suggestions a",e=>{e.preventDefault()}),this.autocomplete.on("autocomplete:selected",this.handleSelected.bind(null,this.autocomplete.autocomplete)),this.autocomplete.on("autocomplete:shown",this.handleShown.bind(null,this.input)),p&&v.bindSearchBoxEvent(),document.addEventListener("keydown",e=>{(e.ctrlKey||e.metaKey)&&"k"==e.key&&(this.input.focus(),e.preventDefault())})}static injectSearchBox(e){e.before(u.searchBox);const t=e.prev().prev().find("input");return e.remove(),t}static bindSearchBoxEvent(){d()('.searchbox [type="reset"]').on("click",function(){d()("input#docsearch").focus(),d()(this).addClass("hide"),o().autocomplete.setVal("")}),d()("input#docsearch").on("keyup",()=>{const e=document.querySelector("input#docsearch"),t=document.querySelector('.searchbox [type="reset"]');t.className="searchbox__reset",0===e.value.length&&(t.className+=" hide")})}static getInputFromSelector(e){const t=d()(e).filter("input");return t.length?d()(t[0]):null}getAutocompleteSource(e,t){return(s,i)=>{t&&(s=t(s)||s),this.client.search(s).then(t=>{this.queryDataCallback&&"function"==typeof this.queryDataCallback&&this.queryDataCallback(t),e&&(t=e(t)||t),i(v.formatHits(t))})}}static formatHits(e){const t=p.deepClone(e).map(e=>(e._highlightResult&&(e._highlightResult=p.mergeKeyWithParent(e._highlightResult,"hierarchy")),p.mergeKeyWithParent(e,"hierarchy")));let s=p.groupBy(t,"lvl0");return d().each(s,(e,t)=>{const i=p.groupBy(t,"lvl1"),n=p.flattenAndFlagFirst(i,"isSubCategoryHeader");s[e]=n}),s=p.flattenAndFlagFirst(s,"isCategoryHeader"),s.map(e=>{const t=v.formatURL(e),s=p.getHighlightedValue(e,"lvl0"),i=p.getHighlightedValue(e,"lvl1")||s,n=p.compact([p.getHighlightedValue(e,"lvl2")||i,p.getHighlightedValue(e,"lvl3"),p.getHighlightedValue(e,"lvl4"),p.getHighlightedValue(e,"lvl5"),p.getHighlightedValue(e,"lvl6")]).join(''),l=p.getSnippetedValue(e,"content"),a=i&&""!==i||n&&""!==n,r=!i||""===i||i===s,o=n&&""!==n&&n!==i,c=!o&&i&&""!==i&&i!==s,h=!c&&!o,u=e.version;return{isLvl0:h,isLvl1:c,isLvl2:o,isLvl1EmptyOrDuplicate:r,isCategoryHeader:e.isCategoryHeader,isSubCategoryHeader:e.isSubCategoryHeader,isTextOrSubcategoryNonEmpty:a,category:s,subcategory:i,title:n,text:l,url:t,version:u}})}static formatURL(e){const{url:t,anchor:s}=e;if(t){return-1!==t.indexOf("#")?t:s?`${e.url}#${e.anchor}`:t}return s?`#${e.anchor}`:(console.warn("no anchor nor url for : ",JSON.stringify(e)),null)}static getEmptyTemplate(){return e=>n().compile(u.empty).render(e)}static getSuggestionTemplate(e){const t=e?u.suggestionSimple:u.suggestion,s=n().compile(t);return e=>s.render(e)}handleSelected(e,t,s,i,n={}){"click"!==n.selectionMethod&&(e.setVal(""),window.location.assign(s.url))}handleShown(e){const t=e.offset().left+e.width()/2;let s=d()(document).width()/2;isNaN(s)&&(s=900);const i=t-s>=0?"algolia-autocomplete-right":"algolia-autocomplete-left",n=t-s<0?"algolia-autocomplete-right":"algolia-autocomplete-left",l=d()(".algolia-autocomplete");l.hasClass(i)||l.addClass(i),l.hasClass(n)&&l.removeClass(n)}}const y=v},5741(){}}]); \ No newline at end of file diff --git a/docs/assets/js/77979bef.e414ae82.js b/docs/assets/js/77979bef.e414ae82.js deleted file mode 100644 index bb389451007..00000000000 --- a/docs/assets/js/77979bef.e414ae82.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[5861],{2443(e,s,t){t.d(s,{G:()=>a});t(6540);var n=t(8853),i=t(4848);function a({author:e,year:s,sourceLink:t,children:a}){return(0,i.jsxs)("div",{style:{borderLeft:"2px solid var(--color-top)",paddingLeft:"1rem",paddingTop:"0.5rem",paddingBottom:"0.5rem",marginTop:30,marginBottom:30},children:[(0,i.jsx)(n.iG,{}),(0,i.jsx)("div",{style:{display:"flex",alignItems:"flex-start",gap:"0.5rem"},children:(0,i.jsx)("p",{style:{margin:0},children:a})}),(0,i.jsx)("div",{style:{display:"flex",justifyContent:"flex-end",gap:5},children:(0,i.jsx)(n.fz,{})}),(0,i.jsxs)("p",{style:{marginTop:"0.75rem",marginBottom:0,textAlign:"right",fontSize:"0.9rem"},children:["\u2013"," ",t?(0,i.jsx)("a",{href:t,target:"_blank",rel:"noopener noreferrer",children:e}):e,s&&`, ${s}`]})]})}},3247(e,s,t){t.d(s,{g:()=>i});var n=t(4848);function i(e){const s=[];let t=null;return e.children.forEach(e=>{e.props.id?(t&&s.push(t),t={headline:e,paragraphs:[]}):t&&t.paragraphs.push(e)}),t&&s.push(t),(0,n.jsx)("div",{style:a.stepsContainer,children:s.map((e,s)=>(0,n.jsxs)("div",{style:a.stepWrapper,children:[(0,n.jsxs)("div",{style:a.stepIndicator,children:[(0,n.jsx)("div",{style:a.stepNumber,children:s+1}),(0,n.jsx)("div",{style:a.verticalLine})]}),(0,n.jsxs)("div",{style:a.stepContent,children:[(0,n.jsx)("div",{children:e.headline}),e.paragraphs.map((e,s)=>(0,n.jsx)("div",{style:a.item,children:e},s))]})]},s))})}const a={stepsContainer:{display:"flex",flexDirection:"column"},stepWrapper:{display:"flex",alignItems:"stretch",marginBottom:"1.5rem",position:"relative",minWidth:0},stepIndicator:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",width:"33px",marginRight:"1rem",minWidth:0},stepNumber:{width:"33px",height:"33px",borderRadius:"50%",backgroundColor:"var(--color-top)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:"bold",marginTop:-4},verticalLine:{position:"absolute",top:29,bottom:"0",left:"50%",width:"1px",background:"linear-gradient(to bottom, var(--color-top) 0%, var(--color-top) 80%, rgba(0,0,0,0) 100%)",transform:"translateX(-50%)"},stepContent:{flex:1,minWidth:0,overflowWrap:"break-word"},item:{marginTop:"0.5rem"}}},4113(e,s,t){t.r(s),t.d(s,{assets:()=>d,contentTitle:()=>c,default:()=>u,frontMatter:()=>l,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"articles/local-first-future","title":"Why Local-First Software Is the Future and its Limitations","description":"Discover how local-first transforms web apps, boosts offline resilience, and why instant user feedback is becoming the new normal.","source":"@site/docs/articles/local-first-future.md","sourceDirName":"articles","slug":"/articles/local-first-future.html","permalink":"/articles/local-first-future.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Why Local-First Software Is the Future and its Limitations","slug":"local-first-future.html","description":"Discover how local-first transforms web apps, boosts offline resilience, and why instant user feedback is becoming the new normal."},"sidebar":"tutorialSidebar","previous":{"title":"Benefits of RxDB & Browser Databases","permalink":"/articles/browser-database.html"},"next":{"title":"Why NoSQL Powers Modern UI Apps","permalink":"/why-nosql.html"}}');var i=t(4848),a=t(8453),r=(t(2636),t(3247),t(2443)),o=t(2271);const l={title:"Why Local-First Software Is the Future and its Limitations",slug:"local-first-future.html",description:"Discover how local-first transforms web apps, boosts offline resilience, and why instant user feedback is becoming the new normal."},c="Why Local-First Software Is the Future and what are its Limitations",d={},h=[{value:"What is the Local-First Paradigm",id:"what-is-the-local-first-paradigm",level:2},{value:"Why Local-First is Gaining Traction",id:"why-local-first-is-gaining-traction",level:2},{value:"What you can expect from a Local First App",id:"what-you-can-expect-from-a-local-first-app",level:2},{value:"User Experience Benefits",id:"user-experience-benefits",level:3},{value:"Developer Experience Benefits",id:"developer-experience-benefits",level:3},{value:"Challenges and Limitations of Local-First",id:"challenges-and-limitations-of-local-first",level:2},{value:"Local-First vs. Traditional Online-First Approaches",id:"local-first-vs-traditional-online-first-approaches",level:2},{value:"Connectivity and Offline Usage",id:"connectivity-and-offline-usage",level:3},{value:"Latency and Performance",id:"latency-and-performance",level:3},{value:"Complexity and Conflict Resolution",id:"complexity-and-conflict-resolution",level:3},{value:"Data Ownership and Storage Limits",id:"data-ownership-and-storage-limits",level:3},{value:"When to Choose Which",id:"when-to-choose-which",level:3},{value:"Offline-First vs. Local-First",id:"offline-first-vs-local-first",level:2},{value:"Do People Actually Use Local-First or Is It Just a Trend?",id:"do-people-actually-use-local-first-or-is-it-just-a-trend",level:2},{value:"Why Local-First Is the Future",id:"why-local-first-is-the-future",level:2},{value:"See also",id:"see-also",level:2}];function p(e){const s={a:"a",blockquote:"blockquote",code:"code",em:"em",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"why-local-first-software-is-the-future-and-what-are-its-limitations",children:"Why Local-First Software Is the Future and what are its Limitations"})}),"\n",(0,i.jsxs)(s.p,{children:["Imagine a web app that behaves seamlessly even with zero internet access, provides sub-millisecond response times, and keeps most of the user's data on their device. This is the ",(0,i.jsx)(s.strong,{children:"local-first"})," or ",(0,i.jsx)(s.a,{href:"/offline-first.html",children:"offline-first"})," approach. Although it has been around for a while, local-first has recently become more practical because of ",(0,i.jsx)(s.strong,{children:"maturing browser storage APIs"})," and new frameworks that simplify ",(0,i.jsx)(s.strong,{children:"data synchronization"}),". By allowing data to live on the client and only syncing with a server or other peers when needed, local-first apps can deliver a user experience that is ",(0,i.jsx)(s.strong,{children:"fast, resilient"}),", and ",(0,i.jsx)(s.strong,{children:"privacy-friendly"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"However, local-first is no silver bullet. It introduces tricky distributed-data challenges like conflict resolution and schema migrations on client devices. In this article, we'll dive deep into what local-first means, why it's trending, its pros and cons, and how to implement it in real applications. We'll also discuss other tools, criticisms, backend considerations, and how local-first compares to traditional cloud-centric approaches."}),"\n",(0,i.jsx)(s.h2,{id:"what-is-the-local-first-paradigm",children:"What is the Local-First Paradigm"}),"\n",(0,i.jsxs)(s.p,{children:["In ",(0,i.jsx)(s.strong,{children:"local-first"})," software, the primary copy of your data lives on the ",(0,i.jsx)(s.strong,{children:"client"})," rather than a remote server. Rather than sending each read or write over the network, you store and manipulate data in a ",(0,i.jsx)(s.a,{href:"/articles/local-database.html",children:"local database"})," on the user\u2019s device. Sync then happens in the background, ensuring all devices eventually converge to a consistent state."]}),"\n",(0,i.jsxs)(s.p,{children:["This approach is increasingly popular because it leads to ",(0,i.jsx)(s.strong,{children:"instant"})," app responses (no network delay for most operations), genuine ",(0,i.jsx)(s.strong,{children:"offline capability"}),", and more direct ",(0,i.jsx)(s.strong,{children:"data ownership"})," for users. Local-first apps also sidestep outages and if the server or internet goes down, users can keep working with their local data. When connectivity returns, everything syncs. This makes the user experience ",(0,i.jsx)(s.strong,{children:"more resilient"})," and gives them control of their data, which is especially appealing when privacy concerns or limited connectivity are key factors."]}),"\n",(0,i.jsx)(r.G,{author:"Ink&Switch",year:"2019",sourceLink:"https://martin.kleppmann.com/papers/local-first.pdf",children:"Local-First software: A set of principles for software that enables both collaboration and ownership for users. Local-first ideals include the ability to work offline and collaborate across multiple devices, while also improving the security, privacy, long-term preservation, and user control of data."}),"\n",(0,i.jsx)(s.h2,{id:"why-local-first-is-gaining-traction",children:"Why Local-First is Gaining Traction"}),"\n",(0,i.jsx)(s.p,{children:"The push for local-first is driven by a few key new technological capabilities that previously restricted client devices from running heavy local-first computing:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Relaxed Browser Storage Limits"}),": In the past, true local-first web apps were not very feasible due to ",(0,i.jsx)(s.strong,{children:"storage limitations"})," in browsers. Early web storage options like cookies or ",(0,i.jsx)(s.a,{href:"/articles/localstorage.html#understanding-the-limitations-of-local-storage",children:"localStorage"})," had tiny limits (~5-10MB) and were unsuitable for complex data. Even ",(0,i.jsx)(s.strong,{children:"IndexedDB"}),", the structured client storage introduced over a decade ago, had restrictive quotas on many browsers: For example, older Firefox versions would ",(0,i.jsx)(s.strong,{children:"prompt the user if more than 50MB"})," was being stored. Mobile browsers often capped IndexedDB to 5MB without user permission. Such limits made it impractical to cache large application datasets on the client. However, modern browsers have dramatically ",(0,i.jsx)(s.a,{href:"/articles/indexeddb-max-storage-limit.html",children:"increased these limits"}),". Today, IndexedDB can typically store ",(0,i.jsx)(s.strong,{children:"hundreds of megabytes to multiple gigabytes"})," of data, depending on device capacity. Chrome allows up to ~80% of free disk space per origin (tens of GB on a desktop), Firefox now supports on the order of gigabytes per site (10% of disk size), and even Safari (historically strict) permits around 1GB per origin on iOS. In short, the storage quotas of 5-50MB are a thing of the past and modern web apps can cache very large datasets locally without hitting a ceiling. This shift in storage capabilities has unlocked new possibilities for ",(0,i.jsx)(s.strong,{children:"local-first web apps"})," that simply weren't viable a few years ago."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"New Storage APIs (OPFS)"}),": The new Browser API ",(0,i.jsx)(s.a,{href:"/rx-storage-opfs.html",children:"Origin Private File System"})," (OPFS), part of the File System Access API, enables near-native file I/O from within a browser. It allows web apps to manage file handles securely and perform fast, synchronous reads/writes in Web Workers. This is a huge deal for local-first computing because it makes it feasible to embed robust database engines directly in the browser, persisting data to real files on a virtual filesystem. With OPFS, you can avoid some of the performance overhead that comes with ",(0,i.jsx)(s.a,{href:"/slow-indexeddb.html",children:"IndexedDB-based workarounds"}),", providing a near-native ",(0,i.jsx)(s.a,{href:"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#big-bulk-writes",children:"speed experience"})," for file-structured data."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)("div",{style:{textAlign:"justify"},children:[(0,i.jsx)("img",{src:"/files/latency-london-san-franzisco.png",alt:"latency london san franzisco",width:"300",className:"img-in-text-right"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Bandwidth Has Grown, But Latency Is Capped"}),": Internet infrastructure has rapidly expanded to provide higher throughput making it possible to transfer large amounts of data more quickly. However, latency (i.e., round-trip delay) is constrained by the ",(0,i.jsx)(s.strong,{children:"speed of light"})," and other physical limitations in fiber, satellite links, and routing. We can always build out bigger \"pipes\" to stream or send bulk data, but we can't significantly reduce the base round-trip time for each request. This is a physical limit, not a technological one. Local-first strategies mitigate this fundamental latency limit by avoiding excessive client-server calls in interactive workflows, once data is on the client, it's instantly available for reads and writes without waiting on a network round-trip. Imagine, transferring ",(0,i.jsx)(s.strong,{children:"around 100,000"}),' "average" JSON documents might only consume ',(0,i.jsx)(s.strong,{children:"about the same bandwidth as two frames of a 4K YouTube video"})," which can be transferred in milliseconds. This shows just how far raw data throughput has come. Yet each request still has a 100-200ms latency or more, which becomes noticeable in user interactions. Local-first mitigates this by minimizing round-trip calls during active use and using the available bandwidth to directly transfer most of the data on the first app start."]}),"\n"]})]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"WebAssembly"}),": Another advancement is ",(0,i.jsx)(s.strong,{children:"WebAssembly (WASM)"}),", which allows developers to compile low-level languages (C, C++, Rust) for execution in the browser at near-native speed. This means database engines, search algorithms, ",(0,i.jsx)(s.a,{href:"/articles/javascript-vector-database.html",children:"vector databases"}),", and other performance-heavy tasks can run right on the client. However, a key limitation is that ",(0,i.jsx)(s.strong,{children:"WASM cannot directly access persistent storage APIs"})," in the browser. Instead, all data must be send from WASM to JavaScript (or the main thread) and then go through something like IndexedDB or OPFS. This extra indirection ",(0,i.jsx)(s.a,{href:"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html",children:"is slower"})," compared to plain JavaScript->storage calls. Looking ahead, there might come up future APIs that allow WASM to interface with persistent storage directly, and if those land, local-first systems could see another major boost in ",(0,i.jsx)(s.a,{href:"/rx-storage-performance.html",children:"performance"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Improvements in Local-First Tooling"}),": A major factor fueling the rise of local-first architectures is the ",(0,i.jsx)(s.strong,{children:"dramatic leap in client-side tooling and performance"}),". For instance, consider a local-first ",(0,i.jsx)(s.strong,{children:"email client"})," that stores ",(0,i.jsx)(s.strong,{children:"one million messages"}),". In 2014, searching through that many documents, especially with something like early PouchDB, could take ",(0,i.jsx)(s.strong,{children:"minutes"})," in a browser. Today, with advanced offline databases like ",(0,i.jsx)(s.strong,{children:"RxDB"}),", you can use the ",(0,i.jsx)(s.a,{href:"/rx-storage-opfs.html",children:"OPFS storage"})," with ",(0,i.jsx)(s.a,{href:"/rx-storage-sharding.html",children:"sharding"})," across multiple ",(0,i.jsx)(s.a,{href:"/rx-storage-worker.html",children:"web workers"})," (one per CPU) and use ",(0,i.jsx)(s.a,{href:"/rx-storage-memory-mapped.html",children:"memory-mapped"})," techniques. The result is a ",(0,i.jsx)(s.strong,{children:"regex search"})," of one million of these email documents in around ",(0,i.jsx)(s.strong,{children:"120 milliseconds"})," - all in JavaScript, running inside a standard web browser, on a mobile phone."]}),"\n",(0,i.jsxs)(s.p,{children:["Better yet, this performance ceiling is likely to keep rising. Newer browser features and ",(0,i.jsx)(s.strong,{children:"WebAssembly"})," optimizations could enable even faster indexing and query operations, closing the gap with native desktop clients. I even experimented with GPU-accelarated queries (using ",(0,i.jsx)(s.strong,{children:"WebGPU"}),") which, while still in experimental stage, might deliver client-side performance that outperforms servers which do not have a graphics card.\nThese transformations highlight why local-first has become truly practical: not only can you sync and work offline, but you can handle ",(0,i.jsx)(s.strong,{children:"serious data loads"})," with performance that would have been unthinkable just a few years ago."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"what-you-can-expect-from-a-local-first-app",children:"What you can expect from a Local First App"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Jevons_paradox",children:"Jevons' Paradox"})," says that making a ",(0,i.jsx)(s.em,{children:"resource cheaper or more efficient to use often leads to greater overall consumption"}),". Originally about coal, it applies to the local-first paradigm in a way where we require apps to have more features, simply because it is technically possible, the app users and developers start to expect them:"]}),"\n",(0,i.jsx)(s.h3,{id:"user-experience-benefits",children:"User Experience Benefits"}),"\n",(0,i.jsxs)("div",{style:{textAlign:"justify"},children:[(0,i.jsx)("img",{src:"/files/loading-spinner-not-needed.gif",alt:"loading spinner not needed",width:"160",className:"img-in-text-right"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Performance & UX:"})," Running from local storage means ",(0,i.jsx)(s.strong,{children:"low latency"})," and instantaneous interactions. There's no round-trip delay for most operations. Local-first apps aim to provide ",(0,i.jsx)(s.a,{href:"/articles/zero-latency-local-first.html",children:"near-zero latency"})," responses by querying a local database instead of waiting for a server response\u200b. This results in a snappy UX (often no need for loading spinners) because data reads/writes happen immediately on-device. Modern users expect real-time feedback, and local-first delivers that by default."]}),"\n"]})]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"User Control & Privacy:"})," Storing data locally can limit how much sensitive information is sent off to remote servers. End users have greater control over their data, and the app can implement ",(0,i.jsx)(s.a,{href:"/encryption.html",children:"client-side encryption"}),", thereby reducing the risk of mass data breaches. Its even possible to only replicated encrypted data with a server so that the backend does not know about the data at all and just acts as a backup/replication endpoint."]}),"\n"]}),"\n",(0,i.jsxs)("div",{style:{textAlign:"justify"},children:[(0,i.jsx)("img",{src:"/files/offline-ready.png",alt:"offline ready",width:"110",className:"img-in-text-right"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Offline Resilience:"})," Obviously, being able to work offline is a major benefit. Users can continue using the app with no internet (or flaky connectivity), and their changes sync up once online. This is increasingly important not just for remote areas, but for any app that needs to be available 24/7. Even though mobile networks have improved, connectivity can still drop; local-first ensures the app doesn't grind to a halt. The app ",(0,i.jsx)(s.em,{children:'"stores data locally at the client so that it can still access it when the internet goes away."'})]}),"\n"]})]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Realtime Apps"}),": Today's users expect data to stay in sync across browser tabs and devices without constant page reloads. In a typical cloud app, if you want real-time updates (say to show that a friend edited a document), you'd need to implement a ",(0,i.jsx)(s.a,{href:"/articles/websockets-sse-polling-webrtc-webtransport.html",children:"websocket or polling"})," system for the server to push changes to clients, which is complex. Local-first architectures naturally lend themselves to realtime-by-default updates because the application state lives in a local database that can be observed for changes. Any edits (local or incoming from the server) immediately trigger ",(0,i.jsx)(s.a,{href:"/articles/optimistic-ui.html",children:"UI updates"}),". Similarly, background sync mechanisms ensure that new server-side data flows into the local store and into the user interface right away, no need to hit F5 to fetch the latest changes like on a traditional webpage."]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"/files/animations/realtime.gif",alt:"realtime ui updates",width:"700",className:"img-radius"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"developer-experience-benefits",children:"Developer Experience Benefits"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Reduced Server Load"}),": Because local-first architectures typically ",(0,i.jsx)(s.strong,{children:"transfer large chunks of data once"})," (e.g., during an initial sync) and then sync only small diffs (delta changes) afterward, the server does not have to handle repeated requests for the same dataset. This bulk-first, diff-later approach drastically decreases the total number of round-trip requests to the backend. In scenarios where hundreds of simultaneous users each require continuous data access, an offline-ready client that only periodically sends or receives changes can scale more efficiently, freeing your servers to handle more users or other tasks. Instead of being bombarded with frequent small queries and updates, the server focuses on periodic sync operations, which can be more easily optimized or batched. It ",(0,i.jsx)(s.strong,{children:"Scales with Data, Not Load"}),". In fact for most type of apps, most of the data itself rarely changes. Imagine a CRM system, how often does the data of a customer really change compared to how of a user open the customer-overview page which would load data from a server in traditional systems?"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Less Need for Custom API Endpoints"}),": A local-first architecture often simplifies backend design. Instead of writing extensive REST routes for each client operation (create, read, update, delete, etc.), you can build a ",(0,i.jsx)(s.strong,{children:"single replication endpoint"})," or a small set of endpoints to handle data synchronization for each entity. The client manages local data, merges edits, and pushes/pulls changes with the server automatically. This not only ",(0,i.jsx)(s.strong,{children:"reduces boilerplate code"})," on the backend but also ",(0,i.jsx)(s.strong,{children:"frees developers"})," to focus on business logic and domain-specific concerns rather than spending time creating and maintaining dozens of narrowly scoped endpoints. As a result, the overall system can be easier to scale and maintain, delivering a ",(0,i.jsx)(s.strong,{children:"smoother developer experience"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Simplified State Management in Frontend"}),': Because the local database holds the authoritative state, you might rely less on complex state management libraries (Redux, MobX, etc.). The DB becomes a single source of truth for your UI. In an offline-first app, your global state is already there in a single place stored inside of the local database, so you don\'t need as many in-memory state layers to synchronize\u200b. The UI can directly bind to the database (using queries or reactive subscriptions). All sources of changes (user input, remote updates, other tabs) funnel through the database. This can significantly reduce the "glue code" to keep UI state in sync with server state because the local DB does that for you. With Local-First tools, "you might not need Redux" because the reactive DB fulfills that role\u200b of state management already.']}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Observable Queries"}),": One of the big advantages of storing data locally is the ability to ",(0,i.jsx)(s.strong,{children:"subscribe"})," to data changes in real time, often called ",(0,i.jsx)(s.strong,{children:"observable queries"}),". When the data changes - either from the user's actions or from a remote sync - the local database automatically updates the subscribed query results, and the UI can redraw without a manual refresh. This reactive pattern can make apps feel much more live and responsive."]}),"\n",(0,i.jsxs)(s.p,{children:["In the beginnings this was mostly done by watching a changes feed (like in PouchDB) and ",(0,i.jsx)(s.strong,{children:"re-running queries"})," whenever data changed. However, this early approach was ",(0,i.jsx)(s.strong,{children:"slow and didn't scale well"}),", because the entire query had to be recalculated each time. Later, RxDB introduced the ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/event-reduce",children:"EventReduce Algorithm"}),", which merges incoming document changes into an existing query result by using a big ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/binary-decision-diagram",children:"binary decision tree"}),'. With this, updated query results can be "calculated" on the CPU instead of re-running them over the database. This makes query updates almost instantaneous and scales better as your data grows. Nowadays, many local databases have added similar features: for example, ',(0,i.jsx)(s.strong,{children:"dexie.js"})," introduced ",(0,i.jsx)(s.code,{children:"liveQuery"}),", letting developers build real-time UIs without repeatedly scanning the entire dataset."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Better Multi-Tab and Multi-Device Consistency"}),": Because the source of truth is on the client, if the user has the app open in multiple tabs or even multiple devices, each has a full copy of the data. In browsers, many offline databases use a storage like IndexedDB that is shared across tabs of the same origin. This means all tabs see the same up-to-date local state. For example, if a user logs in or adds data in one tab, the other tab can automatically reflect that change via the shared local DB and events\u200b. This solves a common issue in web apps where one tab doesn't know that something changed in another tab. With local-first, ",(0,i.jsx)(s.strong,{children:"multi-tab just works"}),' by default because there\'s "exactly one state of the data across all tabs". Similarly, on multiple devices, once sync runs, each device eventually converges to the same state.']}),"\n",(0,i.jsxs)(s.blockquote,{children:["\n",(0,i.jsx)(s.p,{children:"If your users have to press F5 all the time, your app is broken!"}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Potential for P2P and Decentralization"}),": While most current local-first apps still use a central backend for syncing, the paradigm opens the door to ",(0,i.jsx)(s.a,{href:"/replication-webrtc.html",children:"peer-to-peer data syncing"}),". Because each device has the full data, devices could sync directly via LAN or other P2P channels for collaboration, reducing reliance on central servers. There are experimental frameworks that allow truly decentralized sync. This is a more advanced benefit, but it aligns with the ethos of giving users more control and reducing dependence on any one cloud provider."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"These advantages show why developers are excited about local-first. You get happier users thanks to a fast, offline-capable app, and you can differentiate your product by working in scenarios where others fail (e.g. poor connectivity). Companies like Google, Amazon, etc., invest heavily in reducing latency and adding offline modes for a reason: it improves retention and usability. Local-first design takes that to the extreme by default."}),"\n",(0,i.jsx)(s.h2,{id:"challenges-and-limitations-of-local-first",children:"Challenges and Limitations of Local-First"}),"\n",(0,i.jsx)(s.p,{children:"However, this approach is not without significant challenges. It's important to understand the drawbacks and trade-offs before deciding to go all-in on local-first. Let's examine the flip side."}),"\n",(0,i.jsxs)(r.G,{author:"Daniel",year:"2024",sourceLink:"https://github.com/pubkey",children:["You fully understood a technology when you know when ",(0,i.jsx)("b",{children:"not"})," to use it"]}),"\n",(0,i.jsx)(s.p,{children:"Critics of local-first approaches often point out these challenges. Here's a comprehensive list of cons, criticisms, and obstacles associated with local-first development and proposed solutions on how to solve these obstacles:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Data Synchronization"}),": Data synchronization is arguably the hardest part of local-first development, because when every user's device can be offline for extended periods, data inevitably diverges. Ensuring those changes propagate and reconcile with minimal user headaches is a major challenge in distributed systems. Two main approaches have emerged:","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Use a bundled frontend+backend solution"})," where the backend is tightly coupled to the client SDK and knows exactly how to handle sync. A common example is Firestore (part of the Firebase ecosystem) where Google's servers and client libraries collectively manage storage, change detection, conflict resolution, and syncing. The upside is you have a turnkey solution, developers can focus on features rather than writing sync logic. The downside is lock-in, because the sync protocol is proprietary and tailored to that vendor. In many organizations, this is a non-starter: existing company infrastructure can't be uprooted or replaced just for a single offline-capable app. This lock-in issue can arise even if the backend is not strictly a third-party vendor but simply another technology like PostgreSQL, because it still forces you to consolidate all your data into a single system that you might not use otherwise."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Custom Replication with Your Own Endpoints"}),": Alternatively, tools like RxDB allow you to implement your own replication endpoints on top of your existing infrastructure. This is the approach relies on a lightweight, git-like ",(0,i.jsx)(s.a,{href:"/replication.html",children:"Sync Engine"}),'. The server remains relatively "dumb," focusing on storing revisions, tracking changes, and marking conflicts, while the client library does the actual ',(0,i.jsx)(s.a,{href:"/transactions-conflicts-revisions.html",children:"conflict resolution"}),". During sync, if the server detects a conflict (e.g., two offline edits to the same document), it notifies the client, which then decides how to merge them, whether via last-write-wins, a custom merge function, or a ",(0,i.jsx)(s.a,{href:"/crdt.html",children:"CRDT"}),". Setting up custom endpoints does require more development effort, but you avoid vendor lock-in and can integrate seamlessly with your existing database(s). Your system simply needs to support incrementally fetching changes (pull) and accepting local modifications (push), which can be layered on top of nearly any data store or architecture."]}),"\n",(0,i.jsx)(s.p,{children:'Tools which support "any backend" are of course harder to monetize because they cannot sell SaaS services or a Cloud Subscription which is why most tools use a fixed backend instead of an open Sync Engine.'}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)("div",{style:{textAlign:"justify"},children:[(0,i.jsx)("img",{src:"/files/document-replication-conflict.svg",alt:"Conflict Handling",width:"170",className:"img-in-text-right"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Conflict Resolution"}),": When multiple offline edits happen on the same data, you inevitably get ",(0,i.jsx)(s.strong,{children:"merge conflicts"}),". For example, if two users (or the same user on two devices) both edit the same document offline, when both sync, whose changes win? Local-first systems need a conflict resolution strategy. Some systems use ",(0,i.jsx)(s.strong,{children:"last-write-wins"}),' (firestore) or deterministic revision hashing to pick a "winner" (as in CouchDB/PouchDB)\u200b. This is simple but may drop one user\'s changes. Other approaches keep both versions and merge them either via an implement ',(0,i.jsx)(s.a,{href:"/transactions-conflicts-revisions.html#custom-conflict-handler",children:'"merge-function"'})," or require a ",(0,i.jsx)(s.strong,{children:"manual merge"})," step (e.g., like git conflicts or showing the user a diff UI). More advanced solutions involve ",(0,i.jsx)(s.strong,{children:"CRDTs (Conflict-free Replicated Data Types)"}),' which mathematically merge changes (used for rich text collaboration, for instance). Libraries like Automerge or Yjs implement CRDTs to "magically solve conflicts". But in practice, using CRDTs is also complex and has its own trade-offs and sometimes not even possible like when you need additional data from another instance for a "correct" merge. No matter which route, handling conflicts adds complexity to your app logic or infrastructure. In cloud-based (online-first) apps, you avoid this because everyone is always editing the single up-to-date copy on the server. Local-first shifts that burden to the client side.']}),"\n",(0,i.jsx)(s.p,{children:"Here is an example on how a client-side merge functions works in RxDB:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { deepEqual } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/utils'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myConflictHandler"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * isEqual() is used to detect if two documents are"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * equal. This is used internally to detect conflicts."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" isEqual"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(a"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" b) {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * isEqual() is used to detect conflicts or to detect if a"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * document has to be pushed to the remote."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * If the documents are deep equal,"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * we have no conflict."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * Because deepEqual is CPU expensive,"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * on your custom conflict handler you might only"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * check some properties, like the updatedAt time or revision-strings"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * for better performance."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" deepEqual"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(a"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" b);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * resolve() a conflict. This can be async so"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * you could even show an UI element to let your user"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * resolve the conflict manually."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" resolve"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(i) {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * In this example we drop the local state and use the server-state."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:' * This basically implements a "first-on-server-wins" strategy.'})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * "})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * In your custom conflict handler you could want to merge properties"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * of the i.realMasterState, i.assumedMasterState and i.newDocumentState"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:' * or return i.newDocumentState to have a "last-write-wins" strategy.'})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" i"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".realMasterState;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n"]}),"\n"]})]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Eventual Consistency (No Single Source of Truth):"})," A local-first system is ",(0,i.jsx)(s.strong,{children:"eventually consistent"})," by nature. There is no single authoritative copy of the data at all times. Instead you have one per device (and maybe one on the server), and they sync to become consistent eventually. This means at any given moment, two users might not see the same data if one hasn't synced recently. Users could even make decisions based on stale data. In many applications this is acceptable (the data will catch up), but for some scenarios it's problematic. For instance, an offline-first banking app that lets you initiate a money transfer offline could be dangerous if the account balance was out-of-date or if the transfer needs immediate consistency. Essentially, ",(0,i.jsx)(s.strong,{children:"not all apps can tolerate eventual consistency"}),". If your use case demands strong consistency (e.g., inventory systems where overselling is a big issue, or real-time collaborative editing where every keystroke must be seen by others instantly), a purely local-first approach might need augmentation or may not fit."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Initial Data Load and Data Size Limits:"})," Local-first requires pulling data ",(0,i.jsx)(s.strong,{children:"down to the client"}),". If your dataset is huge (gigabytes), it's simply not feasible to download everything to every client. For example, syncing every tweet on Twitter to every user's phone is impossible. Local-first works best when the data set per user is reasonably sized (up to 2 Gigabytes). In practice, you often ",(0,i.jsx)(s.strong,{children:"limit the data"})," to just that user's own data or a subset relevant to them. Even then, on first use the app might need to download a significant chunk of data to initialize the local database. There is a ",(0,i.jsx)(s.strong,{children:"upper bound on dataset size"})," beyond which the initial sync or storage needs become impractical. You cannot assume unlimited local storage. If your data is too large, local-first will either fail or you'll need to only sync partial data (and then handle what happens if the needed data isn't present locally). In short, ",(0,i.jsx)(s.strong,{children:"local-first is unsuitable for massive datasets"})," or data that cannot be partitioned per user."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)("div",{style:{textAlign:"justify"},children:[(0,i.jsx)("img",{src:"/files/safari-database.png",alt:"safari database",width:"160",className:"img-in-text-right"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Storage Persistence (Browser Limitations):"})," Storing data in the browser (via IndexedDB or similar) is not as durable as on a server disk. Browsers may ",(0,i.jsx)(s.strong,{children:"evict data"}),' to save space (especially on mobile devices). For instance, Safari notoriously wipes out IndexedDB data if the user hasn\'t used the site in ~7 days. Other browsers have their own eviction policies for offline data. Also, users can at any time clear their browser storage (intentionally or via something like "Clear site data"). This means the local data ',(0,i.jsx)(s.strong,{children:"cannot be 100% trusted to stay forever"}),". A well-behaved local-first app needs to be able to recover if local data is lost, usually by pulling from the server again\u200b. Essentially, the server still often serves as a backup. But if your app had any purely local data (not intended to sync), that's at risk. ",(0,i.jsx)(s.strong,{children:"Mobile apps"})," (with SQLite or filesystem storage) are a bit more stable than web browsers, but even there, uninstalls or certain OS actions can remove local data. This is a challenge: How to cache data offline for speed while ensuring if it's wiped, the user doesn't lose everything important. Cloud-only apps by contrast keep data in the cloud so it's typically safe unless the server fails (and servers are easier to backup reliably)."]}),"\n"]})]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Complex Client-Side Logic & Increased App Size"}),": A local-first app tends to be more complex on the client side. You're essentially putting what used to be server responsibilities (storage, query engine, sync logic) into the frontend. This can increase the size of your frontend bundle (including a database library, possibly CRDT or sync code, etc.). It also increases memory and CPU usage on the client, as the browser/phone is doing more work. Low-end devices or older phones might struggle if the app is not optimized. Developers need to consider performance tuning for the local database (indexing, query efficiency) just like they would on a server. So while the user gains benefits, the app developer has to manage this complexity."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Performance Constraints in JavaScript:"})," Even though devices are fast, a local JS database is generally ",(0,i.jsx)(s.strong,{children:"slower than a server DB"})," on robust hardware. There are many layers (JS -> IndexedDB -> possibly SQLite under the hood) that add overhead\u200b. For example, inserting a record might go through the DB library, the storage engine, the browser's implementation, down to disk. For most UI uses this is fine (you don't need 10k writes/sec in a to-do app, you need maybe a few writes per second at most). But if your app does heavy data processing, the browser might become a bottleneck."]}),"\n",(0,i.jsxs)(s.p,{children:["The key question is ",(0,i.jsx)(s.em,{children:'"Is it fast enough?"'}),". Often the answer is yes for typical usage, but developers must be mindful of not doing something on the client that truly requires big iron servers. For instance, full-text indexing of a million documents might be too slow in a client-side DB. ",(0,i.jsx)(s.strong,{children:"Unpredictable performance"})," is also a factor: Different users have different devices. A query that takes 50ms on a high-end desktop might take 500ms on a low-end phone in battery saving mode. So performance tuning and testing across devices is needed, and some heavy tasks might still belong on the server side\u200b. For example if you build a ",(0,i.jsx)(s.a,{href:"/articles/javascript-vector-database.html",children:"local vector database"})," you might want to create the embeddings on the server and sync them instead of creating them on the client."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Client Database Migrations:"})," As your app evolves, you'll change data models or add new fields. In a cloud-first app, you'd typically run a migration on the server database. In a local-first app, you have not only the server DB (if any) but also every client's local database to consider. Upgrading the schema means you need to write migration logic that runs on each client, perhaps the next time they launch the app after an update. Clients may be offline or not upgrade the app immediately, so you could have different versions of the schema in the wild. This complicates data handling (the sync protocol might need to handle multiple schema versions until everyone is updated). Providing a smooth migration path for local data is doable (many libraries provide ",(0,i.jsx)(s.a,{href:"/migration-schema.html",children:"migration facilities"}),"), but it requires careful testing. In a worst case, a failed migration on a client could brick the app for that user or force a full resync. This is a ",(0,i.jsx)(s.strong,{children:"much bigger headache"})," than just migrating a centralized DB at midnight while your service is in maintenance mode. \ud83c\udf03"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Security and Access Control:"})," In cloud-based apps, enforcing data security (who can see what) is done on the server. The client only gets the data it's authorized to get. In a local-first scenario, you often need to ",(0,i.jsx)(s.strong,{children:"partition data per user"})," on the backend as well, to ensure users only sync down their own data (or data they have permission for). One simple strategy is to give each user their own database or dataset on the server and only replicate that. For example, CouchDB allows creating one database per user and replication can be scoped to that DB which makes permission handling easy. But if you ever need to query across users (say an admin view or aggregate analytics), having data split into many small DBs becomes a pain. The alternative is a single backend database with a ",(0,i.jsx)(s.strong,{children:"fine-grained access control"}),", and the client asks to sync only certain documents/fields. That usually means writing a custom sync server or using something like GraphQL with resolvers that respect permissions. In short, ",(0,i.jsx)(s.strong,{children:"implementing auth and permissions in sync"})," adds complexity. Also, any data stored on the client is theoretically vulnerable to extraction (if someone compromises the device or uses dev tools). You can ",(0,i.jsx)(s.a,{href:"/encryption.html",children:"encrypt local databases"}),' to prevent extraction after the server "revokes" the decryption password to mitigate the data extraction risk.']}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)("div",{style:{textAlign:"justify"},children:[(0,i.jsx)("img",{src:"/files/no-sql.png",alt:"NoSQL Document",width:"100",className:"img-in-text-right"}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Relational Data and Complex Queries:"})," Most client-side/offline databases are ",(0,i.jsx)(s.a,{href:"/why-nosql.html",children:"NoSQL/document oriented"})," for flexibility in syncing and easy conflict handling. They may not support complex join queries or ACID transactions across multiple tables like a full SQL database would. This is partly because replicating a full relational model is much harder (maintaining referential integrity, etc., when data is partial on a client) or not even logically possible. For example if you have two offline clients running a complex ",(0,i.jsx)(s.code,{children:"UPDATE X WHERE Y FROM Z INNER JOIN Alice INNER JOIN Bob"})," query and then they go online, you have no easy way of handling these conflicts."]}),"\n",(0,i.jsxs)(s.p,{children:["If your app has heavy relational data requirements or relies on complex server-side queries (aggregations, multi-join reports), you might find the local database either cannot do it or is too slow to do it client-side. The lack of robust relational querying is something to plan for and you might need to adjust your data model to be more document-oriented or use client-side libraries to run ",(0,i.jsx)(s.a,{href:"/why-nosql.html#relational-queries-in-nosql",children:"joins in memory"}),". Most tools use NoSQL because it makes replication easy and implementing true relational sync would require extremely sophisticated solutions and even needing an atomic clock for full consistency across nodes (like google spanner). So, ",(0,i.jsx)(s.strong,{children:"if your app truly needs SQL power on the client"}),", local-first might complicate things."]}),"\n",(0,i.jsxs)(s.blockquote,{children:["\n",(0,i.jsx)(s.p,{children:"In Local-First, most tools use NoSQL because it makes replication and conflict handling easy."}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,i.jsxs)(s.p,{children:["That's a long list of challenges! In summary, local-first approaches introduce distributed data issues on the client side that web developers usually didn't have to deal with. Despite these challenges, the local-first movement is steadily growing because the ",(0,i.jsx)(s.strong,{children:"benefits to user experience and data control are very compelling"})," and modern tools are emerging to mitigate a lot of these difficulties. All of these are solved or solvable for your specific use-case, just keep them in mind before you start architecting your local-first app."]}),"\n",(0,i.jsx)(s.h2,{id:"local-first-vs-traditional-online-first-approaches",children:"Local-First vs. Traditional Online-First Approaches"}),"\n",(0,i.jsx)(s.p,{children:'So now that you know the pros and cons about Local-First. Lets directly compare it to your previous "online-first" stack:'}),"\n",(0,i.jsx)(s.h3,{id:"connectivity-and-offline-usage",children:"Connectivity and Offline Usage"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Local-first"}),": Apps like WhatsApp store messages locally on your device, letting you read past messages and even compose new ones without a stable network connection. Once online, the messages sync with the server and other participants."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Online-first"}),": Purely cloud-based apps typically stop functioning (beyond simple caching) when the network or server goes down. They rely on a constant connection to fetch or store user data."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"latency-and-performance",children:"Latency and Performance"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Local-first"}),": Because data operations happen on the device, you see near-instant interactions (e.g., typing and reading chats feels very responsive, as the messages are on your phone). Syncing occurs in the background without delaying the user."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Online-first"}),": Most interactions involve a round-trip to the server, adding network latency and potentially requiring loading states or fallback UIs. If the network is slow or unreliable, users can experience delays when sending or receiving updates."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"complexity-and-conflict-resolution",children:"Complexity and Conflict Resolution"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Local-first"}),": Much of the complexity like storing data or handling conflicts, shifts to the client. WhatsApp, for instance, caches all messages locally and queues unsent messages offline. Once reconnected, it must reconcile with the server and other devices, especially if the same account is used on multiple platforms."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Online-first"}),": A single central server manages data and concurrency, so clients remain thinner. However, the app becomes unusable if connectivity is lost, and any server downtime directly impacts all users."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"data-ownership-and-storage-limits",children:"Data Ownership and Storage Limits"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Local-first"}),": Users hold a complete copy of data on their own device, retaining control and quick access. This can raise challenges when data sets are very large; phone storage might be insufficient, or backups may be harder to guarantee."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Online-first"}),": Storing all data in the cloud scales more easily, and providers often manage backups automatically. On the downside, users depend on the service and must trust it to protect their data."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"when-to-choose-which",children:"When to Choose Which"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Local-first"}),": Particularly helpful for scenarios where offline operation and immediate responsiveness matter, such as chat apps (like WhatsApp), field tools in low-connectivity environments, or any use case where users can't rely on being online 24/7."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Online-first"}),": Well-suited for systems that demand real-time central control or massive data aggregation with minimal offline needs, such as large-scale analytics platforms or services where guaranteed immediate global consistency is essential."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Hybrid"}),": In reality, most modern apps often blend these approaches, giving users partial offline capabilities (caching, queued updates) alongside a robust central service. This hybrid method offers the benefits of local speed and resilience, while still leveraging cloud infrastructure for collaboration and global reach. But a truth local-first app is way more than just a cache."]}),"\n"]}),"\n",(0,i.jsx)(s.hr,{}),"\n",(0,i.jsx)(s.h2,{id:"offline-first-vs-local-first",children:"Offline-First vs. Local-First"}),"\n",(0,i.jsxs)(s.p,{children:["In the early days of offline-capable web apps (around 2014), the common phrase was ",(0,i.jsx)(s.strong,{children:'"Offline-First"'}),". Tools like ",(0,i.jsx)(s.strong,{children:"PouchDB"})," popularized the notion that developers should assume devices are often offline or have flaky connections, so apps must continue to work seamlessly without a network. The guiding principle was ",(0,i.jsx)(s.em,{children:'"apps should treat being online as optional."'})," If a user has no internet access, the application's core features still function, saving or queuing data locally, and automatically synchronizing once connectivity is restored."]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)(o.N,{videoId:"bWXAZboHZN8",title:"What is Offline First?",duration:"4:18"})}),"\n",(0,i.jsx)("br",{}),"\n",(0,i.jsxs)(s.p,{children:["Over time, this focus on offline support evolved into the broader concept of ",(0,i.jsx)(s.strong,{children:'"Local-First Software,"'})," (see ",(0,i.jsx)(s.a,{href:"https://martin.kleppmann.com/papers/local-first.pdf",children:"Ink&Switch"}),") emphasizing not just offline operation but also the technical underpinnings of ",(0,i.jsx)(s.strong,{children:"storing data locally"})," in the client application. While offline-first is primarily about resilience to network loss, local-first highlights ownership, privacy, and performance benefits of keeping the primary data on the user's device. Most tools these days extended the original offline-first concepts, adding real-time reactivity, custom sync, and more nuances like conflict resolution or encryption."]}),"\n",(0,i.jsxs)("div",{style:{textAlign:"justify"},children:[(0,i.jsx)("img",{src:"/files/no-map-tag.png",alt:"no map t ag",width:"100",className:"img-in-text-right"}),(0,i.jsxs)(s.p,{children:["However, the term ",(0,i.jsx)(s.strong,{children:'"local-first"'})," can be ",(0,i.jsx)(s.strong,{children:"confusing"}),' to non-technical audiences because many people (especially in the US) associate "local first" with ',(0,i.jsx)(s.em,{children:"community-oriented movements"})," that encourage buying from nearby businesses or supporting local initiatives. To reduce ambiguity, it may be clearer to use ",(0,i.jsx)(s.strong,{children:'"local first software"'})," or ",(0,i.jsx)(s.strong,{children:'"local first development"'})," in your documentation and marketing materials. When creating branding or logos around local-first software, ",(0,i.jsx)(s.strong,{children:'avoid using the "Google Maps Pin"'}),' as a symbol. This icon typically implies geolocation or physical locality further mixing up the notion of "location-based services" with "on-device data storage."']})]}),"\n",(0,i.jsx)(s.h2,{id:"do-people-actually-use-local-first-or-is-it-just-a-trend",children:"Do People Actually Use Local-First or Is It Just a Trend?"}),"\n",(0,i.jsxs)(s.p,{children:["If we look at ",(0,i.jsx)(s.strong,{children:"npm download statistics"}),", we see that ",(0,i.jsx)(s.strong,{children:"PouchDB"})," - one of the oldest libraries for local-first apps - has about ",(0,i.jsx)(s.strong,{children:"53k"})," downloads each week, and ",(0,i.jsx)(s.strong,{children:"RxDB"})," - a newer library - has about ",(0,i.jsx)(s.strong,{children:"22k"})," weekly downloads. Other local-first tools often have even fewer downloads. In comparison, a popular library like ",(0,i.jsx)(s.strong,{children:"react-query"}),", which does not focus on local storage, is downloaded about ",(0,i.jsx)(s.strong,{children:"1.6 million"})," times a week. These numbers show that local-first libraries, while used, are not as common as some of the more traditional tools."]}),"\n",(0,i.jsxs)(s.p,{children:["One reason is that ",(0,i.jsx)(s.strong,{children:"local-first"}),' is still a new idea. Many developers are used to traditional "online-first" approaches, so switching to a local database and then syncing changes later can feel unfamiliar. Developers must learn different patterns, deal with offline synchronization, and handle possible conflicts. That extra work can be a barrier to adoption which might change in the future as tooling improves.']}),"\n",(0,i.jsxs)(s.p,{children:["While most of RxDB is open source, there are also ",(0,i.jsx)(s.strong,{children:"premium plugins"})," that help sustain RxDB as a long-term project. Because people purchase these plugins, we gains insights into how developers are using local-first features:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["About ",(0,i.jsx)(s.strong,{children:"half"})," of these users mainly want ",(0,i.jsx)(s.strong,{children:"offline functionality"})," for cases such as farming equipment, mining, construction, or even a shrimp farm app."]}),"\n",(0,i.jsxs)(s.li,{children:["The ",(0,i.jsx)(s.strong,{children:"other half"})," focus on ",(0,i.jsx)(s.strong,{children:"faster, real-time UIs"})," for to-do or reading apps, a space launch planning tool, and various dashboard apps. This range of use cases highlights both the resilience offline mode can offer and the performance boost that local databases can provide when synced in the background."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"why-local-first-is-the-future",children:"Why Local-First Is the Future"}),"\n",(0,i.jsxs)(s.p,{children:["Early in the history of the web, users ",(0,i.jsx)(s.strong,{children:"expected"})," static pages. If you wanted to see new content, you ",(0,i.jsx)(s.strong,{children:"reloaded"})," the page. That was normal at the time, and nobody found it strange because everything worked that way."]}),"\n",(0,i.jsxs)(s.p,{children:["Then, as more sites added ",(0,i.jsx)(s.strong,{children:"real-time"}),' features - auto-updating feeds, live notifications, single-page apps - suddenly those older "reload-only" sites began to feel ',(0,i.jsx)(s.strong,{children:"slow"})," or ",(0,i.jsx)(s.strong,{children:"outdated"}),". Why wait for a manual refresh when real-time data was possible and readily available?"]}),"\n",(0,i.jsxs)(s.p,{children:["The same pattern is happening with ",(0,i.jsx)(s.strong,{children:"local-first"})," apps. Right now, most sites are still built around network availability. We see loading spinners whenever data is fetched, and we simply wait for the server response. As local-first experiences become ",(0,i.jsx)(s.strong,{children:"commonplace"})," - removing spinners, letting users keep working when offline, and syncing in the background - everything else will start to feel ",(0,i.jsx)(s.strong,{children:"frustratingly behind"}),". Users won't tolerate slow or blocked interactions if they've seen apps that respond instantly and remain usable offline. They'll expect that as the default and we'll likely see growing pressure on developers to eliminate those extra loading steps. For many users, the experience of ",(0,i.jsx)(s.strong,{children:"immediate local writes will become not just a perk, but an expectation!"})]}),"\n",(0,i.jsx)(s.h2,{id:"see-also",children:"See also"}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JavaScript Angular Database",width:"220"})})}),"\n",(0,i.jsx)("br",{}),"\n",(0,i.jsx)("br",{}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Discuss ",(0,i.jsx)(s.a,{href:"https://news.ycombinator.com/item?id=43289885",children:"this topic on HackerNews"})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/alternatives.html",children:"Local-First Technologies"}),": A list of databases and technologies (besides ",(0,i.jsx)(s.a,{href:"/",children:"RxDB"}),") that support offline-first or local-first use cases."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/chat/",children:"Discord"}),": Join our Discord server to talk with people and share ideas about this topic."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"https://martin.kleppmann.com/papers/local-first.pdf",children:"Inc&Switch"}),': The "original" paper about Local-First from 2019 where the naming of local-first Software was first used and described.']}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/quickstart.html",children:"Learn how to build a local-first Application with RxDB"}),"."]}),"\n"]})]})}function u(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},8453(e,s,t){t.d(s,{R:()=>r,x:()=>o});var n=t(6540);const i={},a=n.createContext(i);function r(e){const s=n.useContext(a);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),n.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/77d975e6.f460ed60.js b/docs/assets/js/77d975e6.f460ed60.js deleted file mode 100644 index 07a2b725613..00000000000 --- a/docs/assets/js/77d975e6.f460ed60.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[3949],{6805(e,a,s){s.r(a),s.d(a,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>t,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"articles/in-memory-nosql-database","title":"RxDB In-Memory NoSQL - Supercharge Real-Time Apps","description":"Discover how RxDB\'s in-memory NoSQL engine delivers blazing speed for real-time apps, ensuring responsive experiences and seamless data sync.","source":"@site/docs/articles/in-memory-nosql-database.md","sourceDirName":"articles","slug":"/articles/in-memory-nosql-database.html","permalink":"/articles/in-memory-nosql-database.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB In-Memory NoSQL - Supercharge Real-Time Apps","slug":"in-memory-nosql-database.html","description":"Discover how RxDB\'s in-memory NoSQL engine delivers blazing speed for real-time apps, ensuring responsive experiences and seamless data sync."},"sidebar":"tutorialSidebar","previous":{"title":"RxDB - The Ultimate JS Frontend Database","permalink":"/articles/frontend-database.html"},"next":{"title":"RxDB - The Perfect Ionic Database","permalink":"/articles/ionic-database.html"}}');var n=s(4848),r=s(8453);const t={title:"RxDB In-Memory NoSQL - Supercharge Real-Time Apps",slug:"in-memory-nosql-database.html",description:"Discover how RxDB's in-memory NoSQL engine delivers blazing speed for real-time apps, ensuring responsive experiences and seamless data sync."},o="RxDB as In-memory NoSQL Database: Empowering Real-Time Applications",l={},d=[{value:"Speed and Performance Benefits",id:"speed-and-performance-benefits",level:2},{value:"Persistence Options",id:"persistence-options",level:2},{value:"Use Cases for RxDB",id:"use-cases-for-rxdb",level:2}];function c(e){const a={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",span:"span",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.header,{children:(0,n.jsx)(a.h1,{id:"rxdb-as-in-memory-nosql-database-empowering-real-time-applications",children:"RxDB as In-memory NoSQL Database: Empowering Real-Time Applications"})}),"\n",(0,n.jsxs)(a.p,{children:["Real-time applications have become increasingly popular in today's digital landscape. From instant messaging to collaborative editing tools, the demand for responsive and interactive software is on the rise. To meet these requirements, developers need powerful and efficient database solutions that can handle large amounts of data in real-time. ",(0,n.jsx)(a.a,{href:"https://rxdb.info/",children:"RxDB"}),", an javascript NoSQL database, is revolutionizing the way developers build and scale their applications by offering exceptional speed, flexibility, and scalability."]}),"\n",(0,n.jsx)("center",{children:(0,n.jsx)("a",{href:"https://rxdb.info/",children:(0,n.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"RxDB Flutter Database",width:"220"})})}),"\n",(0,n.jsx)(a.h2,{id:"speed-and-performance-benefits",children:"Speed and Performance Benefits"}),"\n",(0,n.jsx)(a.p,{children:"One of the key advantages of using RxDB as an in-memory NoSQL database is its ability to leverage in-memory storage for faster database operations. By storing data directly in memory, database operations can be performed significantly faster compared to traditional disk-based databases. This is especially important for real-time applications where every millisecond counts. With RxDB, developers can achieve near-instantaneous data access and manipulation, enabling highly responsive user experiences."}),"\n",(0,n.jsx)(a.p,{children:"Additionally, RxDB eliminates disk I/O bottlenecks that are typically associated with traditional databases. In traditional databases, disk reads and writes can become a bottleneck as the amount of data grows. In contrast, an in-memory database like RxDB keeps the entire dataset in RAM, eliminating disk access overhead. This makes it an excellent choice for applications dealing with real-time analytics, high-throughput data processing, and caching."}),"\n",(0,n.jsx)(a.h2,{id:"persistence-options",children:"Persistence Options"}),"\n",(0,n.jsxs)(a.p,{children:["While RxDB offers an ",(0,n.jsx)(a.a,{href:"/rx-storage-memory.html",children:"in-memory"})," storage adapter, it also offers ",(0,n.jsx)(a.a,{href:"/rx-storage.html",children:"persistence storages"}),". Adapters such as ",(0,n.jsx)(a.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB"}),", ",(0,n.jsx)(a.a,{href:"/rx-storage-sqlite.html",children:"SQLite"}),", and ",(0,n.jsx)(a.a,{href:"/rx-storage-opfs.html",children:"OPFS"})," enable developers to persist data locally in the browser, making applications accessible even when offline. This hybrid approach combines the benefits of in-memory performance with data durability, providing the best of both worlds. Developers can choose the adapter that best suits their needs, balancing the speed of in-memory storage with the long-term data persistence required for certain applications."]}),"\n",(0,n.jsx)(a.figure,{"data-rehype-pretty-code-figure":"",children:(0,n.jsx)(a.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,n.jsxs)(a.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,n.jsxs)(a.span,{"data-line":"",children:[(0,n.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,n.jsx)(a.span,{"data-line":"",children:(0,n.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,n.jsxs)(a.span,{"data-line":"",children:[(0,n.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,n.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,n.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,n.jsxs)(a.span,{"data-line":"",children:[(0,n.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,n.jsx)(a.span,{"data-line":"",children:(0,n.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageMemory"})}),"\n",(0,n.jsxs)(a.span,{"data-line":"",children:[(0,n.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,n.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-memory'"}),(0,n.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,n.jsx)(a.span,{"data-line":"",children:" "}),"\n",(0,n.jsxs)(a.span,{"data-line":"",children:[(0,n.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,n.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,n.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,n.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,n.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,n.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,n.jsxs)(a.span,{"data-line":"",children:[(0,n.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,n.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,n.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,n.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,n.jsxs)(a.span,{"data-line":"",children:[(0,n.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,n.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,n.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageMemory"}),(0,n.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,n.jsx)(a.span,{"data-line":"",children:(0,n.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,n.jsxs)(a.p,{children:["Also the ",(0,n.jsx)(a.a,{href:"/rx-storage-memory-mapped.html",children:"memory mapped RxStorage"})," exists as a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance is replicated with the underlying storage for persistence. The main reason to use this is to improve initial page load and query/write times. This is mostly useful in browser based applications."]}),"\n",(0,n.jsx)(a.h2,{id:"use-cases-for-rxdb",children:"Use Cases for RxDB"}),"\n",(0,n.jsx)(a.p,{children:"RxDB's capabilities make it well-suited for various real-time applications. Some notable use cases include:"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Chat Applications and Real-Time Messaging: RxDB's in-memory performance and real-time synchronization capabilities make it an excellent choice for building chat applications and real-time messaging systems. Developers can ensure that messages are delivered and synchronized across multiple clients in real-time, providing a seamless and responsive chat experience."}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Collaborative Document Editors: RxDB's ability to handle data streams and propagate changes in real-time makes it ideal for collaborative document editing. Multiple users can simultaneously edit a document, and their changes are instantly synchronized, allowing for real-time collaboration and ensuring that everyone has the most up-to-date version of the document."}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(a.p,{children:"Real-Time Analytics Dashboards: RxDB's speed and scalability make it a valuable tool for real-time analytics dashboards. It can handle high volumes of data and perform complex analytics operations in real-time, providing instant insights and visualizations to users."}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:"In conclusion, RxDB serves as a powerful in-memory NoSQL database that empowers developers to build real-time applications with exceptional speed, flexibility, and scalability. Its ability to leverage in-memory storage, eliminate disk I/O bottlenecks, and provide persistence options make it an attractive choice for a wide range of real-time use cases. Whether it's chat applications, collaborative document editors, or real-time analytics dashboards, RxDB provides the foundation for building responsive and interactive software that meets the demands of today's users."})]})}function h(e={}){const{wrapper:a}={...(0,r.R)(),...e.components};return a?(0,n.jsx)(a,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},8453(e,a,s){s.d(a,{R:()=>t,x:()=>o});var i=s(6540);const n={},r=i.createContext(n);function t(e){const a=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function o(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:t(e.components),i.createElement(r.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/7815dd0c.d77e48f5.js b/docs/assets/js/7815dd0c.d77e48f5.js deleted file mode 100644 index 1fdc98d9556..00000000000 --- a/docs/assets/js/7815dd0c.d77e48f5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[5335],{2015(s,n,e){e.r(n),e.d(n,{assets:()=>t,contentTitle:()=>a,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"population","title":"Populate and Link Docs in RxDB","description":"Learn how to reference and link documents across collections in RxDB. Discover easy population without joins and handle complex relationships.","source":"@site/docs/population.md","sourceDirName":".","slug":"/population.html","permalink":"/population.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Populate and Link Docs in RxDB","slug":"population.html","description":"Learn how to reference and link documents across collections in RxDB. Discover easy population without joins and handle complex relationships."},"sidebar":"tutorialSidebar","previous":{"title":"CRDT","permalink":"/crdt.html"},"next":{"title":"ORM","permalink":"/orm.html"}}');var o=e(4848),i=e(8453);const l={title:"Populate and Link Docs in RxDB",slug:"population.html",description:"Learn how to reference and link documents across collections in RxDB. Discover easy population without joins and handle complex relationships."},a="Population",t={},c=[{value:"Schema with ref",id:"schema-with-ref",level:2},{value:"populate()",id:"populate",level:2},{value:"via method",id:"via-method",level:3},{value:"via getter",id:"via-getter",level:3},{value:"Example with nested reference",id:"example-with-nested-reference",level:2},{value:"Example with array",id:"example-with-array",level:2}];function d(s){const n={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",span:"span",...(0,i.R)(),...s.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"population",children:"Population"})}),"\n",(0,o.jsx)(n.p,{children:"There are no joins in RxDB but sometimes we still want references to documents in other collections. This is where population comes in. You can specify a relation from one RxDocument to another RxDocument in the same or another RxCollection of the same database.\nThen you can get the referenced document with the population-getter."}),"\n",(0,o.jsxs)(n.p,{children:["This works exactly like population with ",(0,o.jsx)(n.a,{href:"http://mongoosejs.com/docs/populate.html",children:"mongoose"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"schema-with-ref",children:"Schema with ref"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"ref"}),"-keyword in properties describes to which collection the field-value belongs to (has a relationship)."]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" refHuman"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'human related to other human'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'name'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" bestFriend"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ref"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'human'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // refers to collection human"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // ref-values must always be string or ['string','null'] (primary of foreign RxDocument) "})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,o.jsx)(n.p,{children:"You can also have a one-to-many reference by using a string-array."}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" schemaWithOneToManyReference"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'name'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" friends"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'array'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ref"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'human'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" items"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,o.jsx)(n.h2,{id:"populate",children:"populate()"}),"\n",(0,o.jsx)(n.h3,{id:"via-method",children:"via method"}),"\n",(0,o.jsx)(n.p,{children:"To get the referred RxDocument, you can use the populate()-method.\nIt takes the field-path as attribute and returns a Promise which resolves to the foreign document or null if not found."}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" humansCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Alice'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" bestFriend"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Carol'"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" humansCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Bob'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" bestFriend"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Alice'"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" humansCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Bob'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" bestFriend"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".populate"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'bestFriend'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(bestFriend); "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"//> RxDocument[Alice]"})]})]})})}),"\n",(0,o.jsx)(n.h3,{id:"via-getter",children:"via getter"}),"\n",(0,o.jsxs)(n.p,{children:["You can also get the populated RxDocument with the direct getter. Therefore you have to add an underscore suffix ",(0,o.jsx)(n.code,{children:"_"})," to the fieldname.\nThis works also on nested values."]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" humansCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Alice'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" bestFriend"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Carol'"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" humansCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Bob'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" bestFriend"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Alice'"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" humansCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Bob'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" bestFriend"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".bestFriend_; "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// notice the underscore_"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(bestFriend); "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"//> RxDocument[Alice]"})]})]})})}),"\n",(0,o.jsx)(n.h2,{id:"example-with-nested-reference",children:"Example with nested reference"}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" human"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" family"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" mother"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ref"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'human'"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" mother"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myDocument"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"family"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".mother_;"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(mother); "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"//> RxDocument"})]})]})})}),"\n",(0,o.jsx)(n.h2,{id:"example-with-array",children:"Example with array"}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" human"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" friends"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'array'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ref"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'human'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" items"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" } "})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"//[insert other humans here]"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Alice'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" friends"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Bob'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Carol'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Dave'"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" humansCollection"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Alice'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" friends"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myDocument"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".friends_;"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(friends); "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"//> Array."})]})]})})})]})}function h(s={}){const{wrapper:n}={...(0,i.R)(),...s.components};return n?(0,o.jsx)(n,{...s,children:(0,o.jsx)(d,{...s})}):d(s)}},8453(s,n,e){e.d(n,{R:()=>l,x:()=>a});var r=e(6540);const o={},i=r.createContext(o);function l(s){const n=r.useContext(i);return r.useMemo(function(){return"function"==typeof s?s(n):{...n,...s}},[n,s])}function a(s){let n;return n=s.disableParentContext?"function"==typeof s.components?s.components(o):s.components||o:l(s.components),r.createElement(i.Provider,{value:n},s.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/7bbb96fd.75e20d36.js b/docs/assets/js/7bbb96fd.75e20d36.js deleted file mode 100644 index d8768d5093f..00000000000 --- a/docs/assets/js/7bbb96fd.75e20d36.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[3495],{8435(e,s,i){i.r(s),i.d(s,{default:()=>x});var r=i(4586),t=i(8711),l=i(6540),n=i(8141),c=i(4848);function x(){const{siteConfig:e}=(0,r.A)();return(0,l.useEffect)(()=>{(0,n.c)("paid-meeting-link-clicked",100,1)}),(0,c.jsx)(t.A,{title:`Service Request Submitted - ${e.title}`,description:"RxDB Meeting Scheduler",children:(0,c.jsxs)("main",{children:[(0,c.jsx)("br",{}),(0,c.jsx)("br",{}),(0,c.jsx)("br",{}),(0,c.jsx)("br",{}),(0,c.jsxs)("div",{className:"redirectBox",style:{textAlign:"center"},children:[(0,c.jsx)("a",{href:"/",target:"_blank",children:(0,c.jsx)("div",{className:"logo",children:(0,c.jsx)("img",{src:"/files/logo/logo_text.svg",alt:"RxDB",width:120})})}),(0,c.jsx)("br",{}),(0,c.jsx)("br",{}),(0,c.jsx)("h1",{children:"RxDB Service Form Submitted"}),(0,c.jsx)("br",{}),(0,c.jsxs)("p",{style:{padding:50},children:["Thank you for submitting the form. You will directly get a confirmation email.",(0,c.jsx)("br",{}),(0,c.jsx)("b",{children:"Please check your spam folder!"}),".",(0,c.jsx)("br",{}),"In the next 24 hours you will get a full answer via email."]}),(0,c.jsx)("br",{}),(0,c.jsx)("br",{})]})]})})}}}]); \ No newline at end of file diff --git a/docs/assets/js/7f02c700.bd5b1cc8.js b/docs/assets/js/7f02c700.bd5b1cc8.js deleted file mode 100644 index 31a00c2df15..00000000000 --- a/docs/assets/js/7f02c700.bd5b1cc8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9592],{3247(e,s,n){n.d(s,{g:()=>i});var r=n(4848);function i(e){const s=[];let n=null;return e.children.forEach(e=>{e.props.id?(n&&s.push(n),n={headline:e,paragraphs:[]}):n&&n.paragraphs.push(e)}),n&&s.push(n),(0,r.jsx)("div",{style:o.stepsContainer,children:s.map((e,s)=>(0,r.jsxs)("div",{style:o.stepWrapper,children:[(0,r.jsxs)("div",{style:o.stepIndicator,children:[(0,r.jsx)("div",{style:o.stepNumber,children:s+1}),(0,r.jsx)("div",{style:o.verticalLine})]}),(0,r.jsxs)("div",{style:o.stepContent,children:[(0,r.jsx)("div",{children:e.headline}),e.paragraphs.map((e,s)=>(0,r.jsx)("div",{style:o.item,children:e},s))]})]},s))})}const o={stepsContainer:{display:"flex",flexDirection:"column"},stepWrapper:{display:"flex",alignItems:"stretch",marginBottom:"1.5rem",position:"relative",minWidth:0},stepIndicator:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",width:"33px",marginRight:"1rem",minWidth:0},stepNumber:{width:"33px",height:"33px",borderRadius:"50%",backgroundColor:"var(--color-top)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:"bold",marginTop:-4},verticalLine:{position:"absolute",top:29,bottom:"0",left:"50%",width:"1px",background:"linear-gradient(to bottom, var(--color-top) 0%, var(--color-top) 80%, rgba(0,0,0,0) 100%)",transform:"translateX(-50%)"},stepContent:{flex:1,minWidth:0,overflowWrap:"break-word"},item:{marginTop:"0.5rem"}}},5589(e,s,n){n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"replication-firestore","title":"Smooth Firestore Sync for Offline Apps","description":"Leverage RxDB to enable real-time, offline-first replication with Firestore. Cut cloud costs, resolve conflicts, and speed up your app.","source":"@site/docs/replication-firestore.md","sourceDirName":".","slug":"/replication-firestore.html","permalink":"/replication-firestore.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Smooth Firestore Sync for Offline Apps","slug":"replication-firestore.html","description":"Leverage RxDB to enable real-time, offline-first replication with Firestore. Cut cloud costs, resolve conflicts, and speed up your app."},"sidebar":"tutorialSidebar","previous":{"title":"WebRTC P2P Replication","permalink":"/replication-webrtc.html"},"next":{"title":"MongoDB Replication","permalink":"/replication-mongodb.html"}}');var i=n(4848),o=n(8453),t=n(3247);const l={title:"Smooth Firestore Sync for Offline Apps",slug:"replication-firestore.html",description:"Leverage RxDB to enable real-time, offline-first replication with Firestore. Cut cloud costs, resolve conflicts, and speed up your app."},a="Replication with Firestore from Firebase",c={},d=[{value:"Usage",id:"usage",level:2},{value:"Install the firebase package",id:"install-the-firebase-package",level:3},{value:"Initialize your Firestore Database",id:"initialize-your-firestore-database",level:3},{value:"Start the Replication",id:"start-the-replication",level:3},{value:"Handling deletes",id:"handling-deletes",level:2},{value:"Do not set enableIndexedDbPersistence()",id:"do-not-set-enableindexeddbpersistence",level:2},{value:"Using the replication with an already existing Firestore Database State",id:"using-the-replication-with-an-already-existing-firestore-database-state",level:2},{value:"Filtered Replication",id:"filtered-replication",level:2}];function h(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"replication-with-firestore-from-firebase",children:"Replication with Firestore from Firebase"})}),"\n",(0,i.jsxs)(s.p,{children:["With the ",(0,i.jsx)(s.code,{children:"replication-firestore"})," plugin you can do a two-way realtime replication\nbetween your client side ",(0,i.jsx)(s.a,{href:"./",children:"RxDB"})," Database and a ",(0,i.jsx)(s.a,{href:"https://firebase.google.com/docs/firestore",children:"Cloud Firestore"})," database that is hosted on the Firebase platform. It will use the ",(0,i.jsx)(s.a,{href:"/replication.html",children:"RxDB Sync Engine"})," to manage the replication streams, error- and conflict handling."]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"./files/alternatives/firebase.svg",alt:"Firebase",height:"40"})}),"\n",(0,i.jsx)(s.p,{children:"Replicating your Firestore state to RxDB can bring multiple benefits compared to using the Firestore directly:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"It can reduce your cloud fees because your queries run against the local state of the documents without touching a server and writes can be batched up locally and send to the backend in bulks. This is mostly the case for read heavy applications."}),"\n",(0,i.jsxs)(s.li,{children:["You can run complex ",(0,i.jsx)(s.a,{href:"/why-nosql.html",children:"NoSQL queries"})," on your documents because you are not bound to the ",(0,i.jsx)(s.a,{href:"https://firebase.google.com/docs/firestore/query-data/queries",children:"Firestore Query"})," handling. You can also use local indexes, ",(0,i.jsx)(s.a,{href:"/key-compression.html",children:"compression"})," and ",(0,i.jsx)(s.a,{href:"/encryption.html",children:"encryption"})," and do things like fulltext search, fully locally."]}),"\n",(0,i.jsxs)(s.li,{children:["Your application can be truly ",(0,i.jsx)(s.a,{href:"/offline-first.html",children:"Offline-First"})," because your data is stored in a client side database. In contrast Firestore by itself only provides options to support ",(0,i.jsx)(s.a,{href:"https://cloud.google.com/firestore/docs/manage-data/enable-offline",children:"offline also"})," which more works like a cache and requires the user to be online at application start to run authentication."]}),"\n",(0,i.jsxs)(s.li,{children:["It reduces the vendor lock in because you can switch out the backend server afterwards without having to rebuild big parts of the application. RxDB supports replication plugins with multiple technologies and it is even easy to set up with your ",(0,i.jsx)(s.a,{href:"/replication.html",children:"custom backend"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["You can use sophisticated ",(0,i.jsx)(s.a,{href:"/replication.html#conflict-handling",children:"conflict resolution strategies"})," so you are not bound to the Firestore ",(0,i.jsx)(s.a,{href:"https://stackoverflow.com/a/47781502/3443137",children:"last-write-wins"})," strategy which is not suitable for many applications."]}),"\n",(0,i.jsx)(s.li,{children:"The initial load time of your application can be decreased because it will do an incremental replication on restarts."}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,i.jsxs)(t.g,{children:[(0,i.jsx)(s.h3,{id:"install-the-firebase-package",children:"Install the firebase package"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" firebase"})]})})})}),(0,i.jsx)(s.h3,{id:"initialize-your-firestore-database",children:"Initialize your Firestore Database"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" *"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" as"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" firebase "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'firebase/app'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getFirestore"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'firebase/firestore'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" projectId"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-project-id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" app"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" firebase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".initializeApp"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" projectId"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" databaseURL"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'http://localhost:8080?ns='"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" projectId"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" firestoreDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getFirestore"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(app);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" firestoreCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(firestoreDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-collection-name'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})}),(0,i.jsx)(s.h3,{id:"start-the-replication",children:"Start the Replication"}),(0,i.jsxs)(s.p,{children:["Start the replication by calling ",(0,i.jsx)(s.code,{children:"replicateFirestore()"})," on your ",(0,i.jsx)(s.a,{href:"/rx-collection.html",children:"RxCollection"}),"."]}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" replicateFirestore"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" replicationIdentifier"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" `https://firestore.googleapis.com/"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"${"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"projectId"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"`"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" myRxCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" firestore"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" projectId"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" database"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" firestoreDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" firestoreCollection"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * (required) Enable push and pull replication with firestore by"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * providing an object with optional filter"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * for each type of replication desired."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * [default=disabled]"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * Either do a live or a one-time replication"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * [default=true]"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" live"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * (optional) likely you should just use the default."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" *"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * In firestore it is not possible to read out"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * the internally used write timestamp of a document."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * Even if we could read it out, it is not indexed which"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * is required for fetch 'changes-since-x'."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * So instead we have to rely on a custom user defined field"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * that contains the server time"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * which is set by firestore via serverTimestamp()"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * Notice that the serverTimestampField MUST NOT be"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * part of the collections RxJsonSchema!"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * [default='serverTimestamp']"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" serverTimestampField"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'serverTimestamp'"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsxs)(s.p,{children:["To observe and cancel the replication, you can use any other methods from the ",(0,i.jsx)(s.a,{href:"/replication.html",children:"ReplicationState"})," like ",(0,i.jsx)(s.code,{children:"error$"}),", ",(0,i.jsx)(s.code,{children:"cancel()"})," and ",(0,i.jsx)(s.code,{children:"awaitInitialReplication()"}),"."]})]}),"\n",(0,i.jsx)(s.h2,{id:"handling-deletes",children:"Handling deletes"}),"\n",(0,i.jsxs)(s.p,{children:["RxDB requires you to never ",(0,i.jsx)(s.a,{href:"/replication.html#data-layout-on-the-server",children:"fully delete documents"}),". This is needed to be able to replicate the deletion state of a document to other instances. The firestore replication will set a boolean ",(0,i.jsx)(s.code,{children:"_deleted"})," field to all documents to indicate the deletion state. You can change this by setting a different ",(0,i.jsx)(s.code,{children:"deletedField"})," in the sync options."]}),"\n",(0,i.jsxs)(s.h2,{id:"do-not-set-enableindexeddbpersistence",children:["Do not set ",(0,i.jsx)(s.code,{children:"enableIndexedDbPersistence()"})]}),"\n",(0,i.jsxs)(s.p,{children:["Firestore has the ",(0,i.jsx)(s.code,{children:"enableIndexedDbPersistence()"})," feature which caches document states locally to IndexedDB. This is not needed when you replicate your Firestore with RxDB because RxDB itself will store the data locally already."]}),"\n",(0,i.jsx)(s.h2,{id:"using-the-replication-with-an-already-existing-firestore-database-state",children:"Using the replication with an already existing Firestore Database State"}),"\n",(0,i.jsxs)(s.p,{children:["If you have not used RxDB before and you already have documents inside of your Firestore database, you have\nto manually set the ",(0,i.jsx)(s.code,{children:"_deleted"})," field to ",(0,i.jsx)(s.code,{children:"false"})," and the ",(0,i.jsx)(s.code,{children:"serverTimestamp"})," to all existing documents."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getDocs"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" query"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" serverTimestamp"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'firebase/firestore'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" allDocsResult"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getDocs"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"query"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(firestoreCollection));"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"allDocsResult"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".forEach"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(doc "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".update"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" _deleted"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" serverTimestamp"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" serverTimestamp"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.p,{children:["Also notice that if you do writes from non-RxDB applications, you have to keep these fields in sync. It is recommended to use the ",(0,i.jsx)(s.a,{href:"https://firebase.google.com/docs/functions/firestore-events",children:"Firestore triggers"})," to ensure that."]}),"\n",(0,i.jsx)(s.h2,{id:"filtered-replication",children:"Filtered Replication"}),"\n",(0,i.jsxs)(s.p,{children:["You might need to replicate only a subset of your collection, either to or from Firestore. You can achieve this using ",(0,i.jsx)(s.code,{children:"push.filter"})," and ",(0,i.jsx)(s.code,{children:"pull.filter"})," options."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" replicateFirestore"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" myRxCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" firestore"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" projectId"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" database"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" firestoreDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" firestoreCollection"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" filter"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" where"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'ownerId'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '=='"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" userId)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" filter"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (item) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" item"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".syncEnabled "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"==="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,i.jsxs)(s.p,{children:["Keep in mind that you can not use inequality operators ",(0,i.jsx)(s.code,{children:"(<, <=, !=, not-in, >, or >=)"})," in ",(0,i.jsx)(s.code,{children:"pull.filter"})," since that would cause a conflict with ordering by ",(0,i.jsx)(s.code,{children:"serverTimestamp"}),"."]})]})}function p(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453(e,s,n){n.d(s,{R:()=>t,x:()=>l});var r=n(6540);const i={},o=r.createContext(i);function t(e){const s=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/8070e160.c192f1b9.js b/docs/assets/js/8070e160.c192f1b9.js deleted file mode 100644 index c91510d7532..00000000000 --- a/docs/assets/js/8070e160.c192f1b9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[3822],{3247(e,s,r){r.d(s,{g:()=>i});var n=r(4848);function i(e){const s=[];let r=null;return e.children.forEach(e=>{e.props.id?(r&&s.push(r),r={headline:e,paragraphs:[]}):r&&r.paragraphs.push(e)}),r&&s.push(r),(0,n.jsx)("div",{style:o.stepsContainer,children:s.map((e,s)=>(0,n.jsxs)("div",{style:o.stepWrapper,children:[(0,n.jsxs)("div",{style:o.stepIndicator,children:[(0,n.jsx)("div",{style:o.stepNumber,children:s+1}),(0,n.jsx)("div",{style:o.verticalLine})]}),(0,n.jsxs)("div",{style:o.stepContent,children:[(0,n.jsx)("div",{children:e.headline}),e.paragraphs.map((e,s)=>(0,n.jsx)("div",{style:o.item,children:e},s))]})]},s))})}const o={stepsContainer:{display:"flex",flexDirection:"column"},stepWrapper:{display:"flex",alignItems:"stretch",marginBottom:"1.5rem",position:"relative",minWidth:0},stepIndicator:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",width:"33px",marginRight:"1rem",minWidth:0},stepNumber:{width:"33px",height:"33px",borderRadius:"50%",backgroundColor:"var(--color-top)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:"bold",marginTop:-4},verticalLine:{position:"absolute",top:29,bottom:"0",left:"50%",width:"1px",background:"linear-gradient(to bottom, var(--color-top) 0%, var(--color-top) 80%, rgba(0,0,0,0) 100%)",transform:"translateX(-50%)"},stepContent:{flex:1,minWidth:0,overflowWrap:"break-word"},item:{marginTop:"0.5rem"}}},4143(e,s,r){r.r(s),r.d(s,{assets:()=>p,contentTitle:()=>h,default:()=>j,frontMatter:()=>c,metadata:()=>n,toc:()=>k});const n=JSON.parse('{"id":"quickstart","title":"\ud83d\ude80 Quickstart","description":"Learn how to build a realtime app with RxDB. Follow this quickstart for setup, schema creation, data operations, and real-time syncing.","source":"@site/docs/quickstart.md","sourceDirName":".","slug":"/quickstart.html","permalink":"/quickstart.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"\ud83d\ude80 Quickstart","slug":"quickstart.html","description":"Learn how to build a realtime app with RxDB. Follow this quickstart for setup, schema creation, data operations, and real-time syncing."},"sidebar":"tutorialSidebar","previous":{"title":"Overview","permalink":"/overview.html"},"next":{"title":"Installation","permalink":"/install.html"}}');var i=r(4848),o=r(8453),a=r(3247),l=r(8141),t=r(2636),d=r(3103);const c={title:"\ud83d\ude80 Quickstart",slug:"quickstart.html",description:"Learn how to build a realtime app with RxDB. Follow this quickstart for setup, schema creation, data operations, and real-time syncing."},h="RxDB Quickstart",p={},k=[{value:"Installation",id:"installation",level:3},{value:"Pick a Storage",id:"pick-a-storage",level:3},{value:"LocalStorage",id:"localstorage",level:4},{value:"IndexedDB \ud83d\udc51",id:"indexeddb-",level:4},{value:"Dexie.js",id:"dexiejs",level:4},{value:"SQLite",id:"sqlite",level:4},{value:"And more...",id:"and-more",level:4},{value:"Dev-Mode",id:"dev-mode",level:3},{value:"Schema Validation",id:"schema-validation",level:3},{value:"Create a Database",id:"create-a-database",level:3},{value:"Add a Collection",id:"add-a-collection",level:3},{value:"Insert a document",id:"insert-a-document",level:3},{value:"Run a Query",id:"run-a-query",level:3},{value:"Update a Document",id:"update-a-document",level:3},{value:"Delete a document",id:"delete-a-document",level:3},{value:"Observe a Query",id:"observe-a-query",level:3},{value:"Observe a Document value",id:"observe-a-document-value",level:3},{value:"Sync the Client",id:"sync-the-client",level:3},{value:"HTTP",id:"http",level:4},{value:"GraphQL",id:"graphql",level:4},{value:"WebRTC (P2P)",id:"webrtc-p2p",level:4},{value:"CouchDB",id:"couchdb",level:4},{value:"And more...",id:"and-more-1",level:4},{value:"Next steps",id:"next-steps",level:2}];function x(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components},{Details:r}=s;return r||function(e,s){throw new Error("Expected "+(s?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(l.V,{type:"page_quickstart",value:.2,maxPerUser:1,primary:!1}),"\n",(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"rxdb-quickstart",children:"RxDB Quickstart"})}),"\n",(0,i.jsx)(s.p,{children:"Welcome to the RxDB Quickstart. Here we'll learn how to create a simple real-time app with the RxDB database that is able to store and query data persistently in a browser and does realtime updates to the UI on changes."}),"\n",(0,i.jsx)("br",{}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"/files/logo/rxdb_javascript_database.svg",alt:"JavaScript Embedded Database",width:"220"})})}),"\n",(0,i.jsx)("br",{}),"\n",(0,i.jsxs)(a.g,{children:[(0,i.jsx)(s.h3,{id:"installation",children:"Installation"}),(0,i.jsx)(s.p,{children:"Install the RxDB library and the RxJS dependency:"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" rxdb"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" rxjs"})]})})})}),(0,i.jsx)(s.h3,{id:"pick-a-storage",children:"Pick a Storage"}),(0,i.jsx)(s.p,{children:"RxDB is able to run in a wide range of JavaScript runtimes like browsers, mobile apps, desktop and servers. Therefore different storage engines exist that ensure the best performance depending on where RxDB is used."}),(0,i.jsxs)(t.t,{children:[(0,i.jsx)(s.h4,{id:"localstorage",children:"LocalStorage"}),(0,i.jsxs)(s.p,{children:["Use this for the simplest browser setup and very small datasets. It has a tiny bundle size and works anywhere ",(0,i.jsx)(s.a,{href:"/articles/localstorage.html",children:"localStorage"})," is available, but is not optimized for large data or heavy writes."]}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageLocalstorage"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"let"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),(0,i.jsx)(s.h4,{id:"indexeddb-",children:"IndexedDB \ud83d\udc51"}),(0,i.jsxs)(s.p,{children:["The premium ",(0,i.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB storage"})," is a high-performance, browser-native storage with a smaller bundle and faster startup compared to Dexie-based IndexedDB. Recommended when you have ",(0,i.jsx)(s.a,{href:"/premium/",children:"\ud83d\udc51 premium"})," access and care about performance and bundle size."]}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageIndexedDB"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-indexeddb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"let"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageDexie"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),(0,i.jsx)(s.h4,{id:"dexiejs",children:"Dexie.js"}),(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"/rx-storage-dexie.html",children:"Dexie.js"})," is a friendly wrapper around IndexedDB and is a great default for browser apps when you don\u2019t use premium. It\u2019s reliable, works well for medium-sized datasets, and is free to use."]}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageDexie"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-dexie'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"let"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageDexie"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),(0,i.jsx)(s.h4,{id:"sqlite",children:"SQLite"}),(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"/rx-storage-sqlite.html",children:"SQLite"})," is ideal for React Native, Capacitor, Electron, Node.js and other hybrid or native environments. It gives you a fast, durable database on disk. Use the \ud83d\udc51 premium storage for production; a trial version exists for quick experimentation."]}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Premium SQLite (Node.js example)"})}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getSQLiteBasicsNode"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Provide the sqliteBasics adapter for your runtime, e.g. Node.js, React Native, etc."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// For example in Node.js you would derive sqliteBasics from a sqlite3-compatible library:"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqlite3 "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'sqlite3'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqliteBasics"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getSQLiteBasicsNode"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(sqlite3)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"SQLite trial storage (Node.js, free)"})}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageSQLiteTrial"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getSQLiteBasicsNodeNative"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { DatabaseSync } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'node:sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSQLiteTrial"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"sqliteBasics"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getSQLiteBasicsNodeNative"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(DatabaseSync)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(s.h4,{id:"and-more",children:"And more..."}),(0,i.jsxs)(s.p,{children:["There are many more storages such as ",(0,i.jsx)(s.a,{href:"/rx-storage-mongodb.html",children:"MongoDB"}),", ",(0,i.jsx)(s.a,{href:"/rx-storage-denokv.html",children:"DenoKV"}),", ",(0,i.jsx)(s.a,{href:"/rx-storage-filesystem-node.html",children:"Filesystem"}),", ",(0,i.jsx)(s.a,{href:"/rx-storage-memory.html",children:"Memory"}),", ",(0,i.jsx)(s.a,{href:"/rx-storage-memory-mapped.html",children:"Memory-Mapped"}),", ",(0,i.jsx)(s.a,{href:"/rx-storage-foundationdb.html",children:"FoundationDB"})," and more. ",(0,i.jsx)(s.a,{href:"/rx-storage.html",children:"Browse the full list of storages"}),"."]})]}),(0,i.jsxs)(r,{children:[(0,i.jsx)("summary",{children:"Which storage should I use?"}),(0,i.jsxs)("div",{children:[(0,i.jsx)(s.p,{children:"RxDB provides a wide range of storages depending on your JavaScript runtime and performance needs."}),(0,i.jsxs)("ul",{children:[(0,i.jsxs)("li",{children:["In the Browser: Use the ",(0,i.jsx)("a",{href:"/rx-storage-localstorage.html",children:"LocalStorage"})," storage for simple setup and small build size. For bigger datasets, use either the ",(0,i.jsx)("a",{href:"/rx-storage-dexie.html",children:"dexie.js storage"})," (free) or the ",(0,i.jsx)("a",{href:"/rx-storage-indexeddb.html",children:"IndexedDB RxStorage"})," if you have ",(0,i.jsx)("a",{href:"/premium/",children:"\ud83d\udc51 premium access"})," which is a bit faster and has a smaller build size."]}),(0,i.jsxs)("li",{children:["In ",(0,i.jsx)("a",{href:"/electron-database.html",children:"Electron"})," and ",(0,i.jsx)("a",{href:"/react-native-database.html",children:"ReactNative"}),": Use the ",(0,i.jsx)("a",{href:"./rx-storage-sqlite.html",children:"SQLite RxStorage"})," if you have ",(0,i.jsx)("a",{href:"/premium/",children:"\ud83d\udc51 premium access"})," or the ",(0,i.jsx)("a",{href:"/rx-storage-sqlite.html",children:"trial-SQLite RxStorage"})," for tryouts."]}),(0,i.jsxs)("li",{children:["In Capacitor: Use the ",(0,i.jsx)("a",{href:"/rx-storage-sqlite.html",children:"SQLite RxStorage"})," if you have ",(0,i.jsx)("a",{href:"/premium/",children:"\ud83d\udc51 premium access"}),", otherwise use the ",(0,i.jsx)("a",{href:"/rx-storage-localstorage.html",children:"localStorage"})," storage."]})]})]})]}),(0,i.jsx)(s.h3,{id:"dev-mode",children:"Dev-Mode"}),(0,i.jsxs)(s.p,{children:["When you use RxDB in development, you should always enable the ",(0,i.jsx)(s.a,{href:"/dev-mode.html",children:"dev-mode plugin"}),", which adds helpful checks and validations, and tells you if you do something wrong."]}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { addRxPlugin } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { RxDBDevModePlugin } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/dev-mode'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addRxPlugin"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(RxDBDevModePlugin);"})]})]})})}),(0,i.jsx)(s.h3,{id:"schema-validation",children:"Schema Validation"}),(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"/schema-validation.html",children:"Schema validation"})," is required when using dev-mode and recommended (but optional) in production. Wrap your storage with the AJV schema validator to ensure all documents match your schema before being saved."]}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { wrappedValidateAjvStorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/validate-ajv'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"storage "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" wrappedValidateAjvStorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ storage });"})]})]})})}),(0,i.jsx)(s.h3,{id:"create-a-database",children:"Create a Database"}),(0,i.jsx)(s.p,{children:"A database is the top\u2011level container in RxDB, responsible for managing collections, coordinating persistence, and providing reactive change streams."}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(s.h3,{id:"add-a-collection",children:"Add a Collection"}),(0,i.jsxs)(s.p,{children:["An RxDatabase contains ",(0,i.jsx)(s.a,{href:"/rx-collection.html",children:"RxCollection"}),"s for storing and querying data. A collection is similar to an SQL table, and individual records are stored in the collection as JSON documents. An ",(0,i.jsx)(s.a,{href:"/rx-database.html",children:"RxDatabase"})," can have as many collections as you need.\nAdd a collection with a ",(0,i.jsx)(s.a,{href:"/rx-schema.html",children:"schema"})," to the database:"]}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // name of the collection"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" todos"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // we use the JSON-schema standard"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- the primary key must have maxLength"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" done"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'boolean'"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" timestamp"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" format"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'date-time'"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'name'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'done'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'timestamp'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(s.h3,{id:"insert-a-document",children:"Insert a document"}),(0,i.jsxs)(s.p,{children:["Now that we have an RxCollection we can store some ",(0,i.jsx)(s.a,{href:"/rx-document.html",children:"documents"})," in it."]}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDocument"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"todos"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'todo1'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Learn RxDB'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" done"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" timestamp"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Date"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".toISOString"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(s.h3,{id:"run-a-query",children:"Run a Query"}),(0,i.jsxs)(s.p,{children:["Execute a ",(0,i.jsx)(s.a,{href:"/rx-query.html",children:"query"})," that returns all found documents once:"]}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" foundDocuments"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"todos"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" done"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" $eq"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" false"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"})"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),(0,i.jsx)(s.h3,{id:"update-a-document",children:"Update a Document"}),(0,i.jsxs)(s.p,{children:["In the first found document, set ",(0,i.jsx)(s.code,{children:"done"})," to ",(0,i.jsx)(s.code,{children:"true"}),":"]}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" firstDocument"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" foundDocuments["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"];"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" firstDocument"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".patch"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" done"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(s.h3,{id:"delete-a-document",children:"Delete a document"}),(0,i.jsx)(s.p,{children:"Delete the document so that it can no longer be found in queries:"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" firstDocument"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".remove"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})})})}),(0,i.jsx)(s.h3,{id:"observe-a-query",children:"Observe a Query"}),(0,i.jsxs)(s.p,{children:["Subscribe to data changes so that your UI is always up-to-date with the data stored on disk. RxDB allows you to subscribe to data changes even when the change happens in another part of your application, another browser tab, or during database ",(0,i.jsx)(s.a,{href:"/replication.html",children:"replication/synchronization"}),":"]}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" observable"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"todos"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" done"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" $eq"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" false"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}).$ "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// get the observable via RxQuery.$;"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"observable"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(notDoneDocs "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Currently have '"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" notDoneDocs"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"length"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" ' things to do'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // -> here you would re-render your app to show the updated document list"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(s.h3,{id:"observe-a-document-value",children:"Observe a Document value"}),(0,i.jsxs)(s.p,{children:["You can also subscribe to the fields of a single RxDocument. Add the ",(0,i.jsx)(s.code,{children:"$"})," sign to the desired field and then subscribe to the returned observable."]}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"myDocument"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"done$"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(isDone "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'done: '"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" isDone);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(s.h3,{id:"sync-the-client",children:"Sync the Client"}),(0,i.jsxs)(s.p,{children:["RxDB has multiple ",(0,i.jsx)(s.a,{href:"/replication.html",children:"replication plugins"})," to replicate database state with a server."]}),(0,i.jsxs)(t.t,{children:[(0,i.jsx)(s.h4,{id:"http",children:"HTTP"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" replicateHTTP"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" pullQueryBuilderFromRxSchema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "rxdb/plugins/replication-http"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"replicateHTTP"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".todos"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (rows) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" fetch"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"https:/example.com/api/todos/push"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" method"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "POST"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" headers"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"Content-Type"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "application/json"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" body"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" JSON"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".stringify"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(rows)"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".then"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"((res) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" res"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".json"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"());"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (lastCheckpoint) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" fetch"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "https://example.com/api/todos/pull?"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" URLSearchParams"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" checkpoint"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" JSON"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".stringify"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(lastCheckpoint)"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" )"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".then"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"((res) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" res"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".json"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"());"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(s.h4,{id:"graphql",children:"GraphQL"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { replicateGraphQL } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication-graphql'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"replicateGraphQL"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".todos"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" url"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'https://example.com/graphql'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { batchSize"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 50"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { batchSize"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 50"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(s.h4,{id:"webrtc-p2p",children:"WebRTC (P2P)"}),(0,i.jsxs)(s.p,{children:["The easiest way to replicate data between your clients' devices is the ",(0,i.jsx)(s.a,{href:"/replication-webrtc.html",children:"WebRTC replication plugin"})," that replicates data between devices without a centralized server. This makes it easy to try out replication without having to host anything:"]}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" replicateWebRTC"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getConnectionHandlerSimplePeer"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication-webrtc'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"replicateWebRTC"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".todos"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" connectionHandlerCreator"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getConnectionHandlerSimplePeer"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({})"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" topic"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" ''"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- set any app-specific room id here."})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" secret"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mysecret'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {}"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"})"})})]})})}),(0,i.jsx)(s.h4,{id:"couchdb",children:"CouchDB"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { replicateCouchDB } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication-couchdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"replicateCouchDB"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".todos"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" url"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'http://example.com/todos/'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {}"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(s.h4,{id:"and-more-1",children:"And more..."}),(0,i.jsxs)(s.p,{children:["Explore all ",(0,i.jsx)(s.a,{href:"/replication.html",children:"replication plugins"}),", including advanced conflict handling and custom protocols."]}),(0,i.jsx)(d.dQ,{})]})]}),"\n",(0,i.jsx)(s.h2,{id:"next-steps",children:"Next steps"}),"\n",(0,i.jsx)(s.p,{children:"You are now ready to dive deeper into RxDB."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Start reading the full documentation ",(0,i.jsx)(s.a,{href:"/install.html",children:"here"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["There is a full implementation of the ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb-quickstart",children:"quickstart guide"})," so you can clone that repository and play with the code."]}),"\n",(0,i.jsxs)(s.li,{children:["For frameworks and runtimes like Angular, React Native and others, check out the list of ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples",children:"example implementations"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Also please continue reading the documentation, join the community on our ",(0,i.jsx)(s.a,{href:"/chat/",children:"Discord chat"}),", and star the ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb",children:"GitHub repo"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["If you are using RxDB in a production environment and are able to support its continued development, please take a look at the ",(0,i.jsx)(s.a,{href:"/premium/",children:"\ud83d\udc51 Premium package"})," which includes additional plugins and utilities."]}),"\n"]})]})}function j(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(x,{...e})}):x(e)}},8453(e,s,r){r.d(s,{R:()=>a,x:()=>l});var n=r(6540);const i={},o=n.createContext(i);function a(e){const s=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/8084fe3b.f4614fb9.js b/docs/assets/js/8084fe3b.f4614fb9.js deleted file mode 100644 index 3ba18451335..00000000000 --- a/docs/assets/js/8084fe3b.f4614fb9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9515],{7458(e,s,n){n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"articles/vue-indexeddb","title":"IndexedDB Database in Vue Apps - The Power of RxDB","description":"Learn how RxDB simplifies IndexedDB in Vue, offering reactive queries, offline-first capabilities, encryption, compression, and effortless integration.","source":"@site/docs/articles/vue-indexeddb.md","sourceDirName":"articles","slug":"/articles/vue-indexeddb.html","permalink":"/articles/vue-indexeddb.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"IndexedDB Database in Vue Apps - The Power of RxDB","slug":"vue-indexeddb.html","description":"Learn how RxDB simplifies IndexedDB in Vue, offering reactive queries, offline-first capabilities, encryption, compression, and effortless integration."},"sidebar":"tutorialSidebar","previous":{"title":"RxDB as a Database in a Vue.js Application","permalink":"/articles/vue-database.html"},"next":{"title":"RxDB as a Database in a jQuery Application","permalink":"/articles/jquery-database.html"}}');var i=n(4848),o=n(8453);const a={title:"IndexedDB Database in Vue Apps - The Power of RxDB",slug:"vue-indexeddb.html",description:"Learn how RxDB simplifies IndexedDB in Vue, offering reactive queries, offline-first capabilities, encryption, compression, and effortless integration."},l="IndexedDB Database in Vue Apps - The Power of RxDB",t={},c=[{value:"What is IndexedDB?",id:"what-is-indexeddb",level:2},{value:"Why Use IndexedDB in Vue",id:"why-use-indexeddb-in-vue",level:2},{value:"Why To Not Use Plain IndexedDB",id:"why-to-not-use-plain-indexeddb",level:2},{value:"Set up RxDB in Vue",id:"set-up-rxdb-in-vue",level:2},{value:"Installing RxDB",id:"installing-rxdb",level:3},{value:"Create a Database and Collections",id:"create-a-database-and-collections",level:3},{value:"CRUD Operations",id:"crud-operations",level:3},{value:"Reactive Queries and Live Updates",id:"reactive-queries-and-live-updates",level:2},{value:"Using RxJS Observables with Vue 3 Composition API",id:"using-rxjs-observables-with-vue-3-composition-api",level:3},{value:"Using Vue Signals",id:"using-vue-signals",level:3},{value:"Vue IndexedDB Example with RxDB",id:"vue-indexeddb-example-with-rxdb",level:2},{value:"Advanced RxDB Features",id:"advanced-rxdb-features",level:2},{value:"Limitations of IndexedDB",id:"limitations-of-indexeddb",level:2},{value:"Alternatives to IndexedDB",id:"alternatives-to-indexeddb",level:2},{value:"Performance Comparison with Other Browser Storages",id:"performance-comparison-with-other-browser-storages",level:2},{value:"Follow Up",id:"follow-up",level:2}];function d(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"indexeddb-database-in-vue-apps---the-power-of-rxdb",children:"IndexedDB Database in Vue Apps - The Power of RxDB"})}),"\n",(0,i.jsxs)(s.p,{children:["Building robust, ",(0,i.jsx)(s.a,{href:"/offline-first.html",children:"offline-capable"})," Vue applications often involves leveraging browser storage solutions to manage data. IndexedDB is one such powerful tool, but its raw API can be challenging to work with directly. RxDB abstracts away much of IndexedDB's complexity, providing a more developer-friendly experience. In this article, we'll explore what IndexedDB is, why it's beneficial in Vue applications, the challenges of using plain IndexedDB, and how ",(0,i.jsx)(s.a,{href:"https://rxdb.info/",children:"RxDB"})," can simplify your development process while adding advanced features."]}),"\n",(0,i.jsx)(s.h2,{id:"what-is-indexeddb",children:"What is IndexedDB?"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API",children:"IndexedDB"})," is a low-level API for storing significant amounts of structured data in the browser. It provides a transactional database system that can store key-value pairs, complex objects, and more. This storage engine is asynchronous and supports advanced data types, making it suitable for offline storage and complex web applications."]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("img",{src:"/files/icons/vuejs.svg",alt:"Vue IndexedDB",width:"120"})}),"\n",(0,i.jsx)(s.h2,{id:"why-use-indexeddb-in-vue",children:"Why Use IndexedDB in Vue"}),"\n",(0,i.jsx)(s.p,{children:"When building Vue applications, IndexedDB can play a crucial role in enhancing both performance and user experience. Here are some reasons to consider using IndexedDB:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Offline-First / Local-First"}),": By storing data locally, your application remains functional even without an internet connection."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Performance"}),": Using local data means ",(0,i.jsx)(s.a,{href:"/articles/zero-latency-local-first.html",children:"zero latency"})," and no loading spinners, as data doesn't need to be fetched over a network."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Easier Implementation"}),": Replicating all data to the client once is often simpler than implementing multiple endpoints for each user interaction."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Scalability"}),": Local data reduces server load because queries run on the client side, decreasing server bandwidth and processing requirements."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"why-to-not-use-plain-indexeddb",children:"Why To Not Use Plain IndexedDB"}),"\n",(0,i.jsx)(s.p,{children:"While IndexedDB itself is powerful, its native API comes with several drawbacks for everyday application developers:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Callback-Based API"}),": IndexedDB was originally designed around callbacks rather than modern Promises, making asynchronous code more cumbersome."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Complexity"}),": IndexedDB is low-level, intended for library developers rather than for app developers who just want to store and query data easily."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Basic Query API"}),": Its rudimentary query capabilities limit how you can efficiently perform complex queries. Libraries like RxDB offer more advanced querying and indexing."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"TypeScript Support"}),": Ensuring good ",(0,i.jsx)(s.a,{href:"/tutorials/typescript.html",children:"TypeScript support"})," with IndexedDB is challenging, especially when trying to maintain schema consistency."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Lack of Observable API"}),": IndexedDB doesn't provide an observable API out of the box, making it hard to automatically update your Vue app in real time. RxDB solves this by enabling you to ",(0,i.jsx)(s.a,{href:"/rx-query.html#observe",children:"observe queries"})," or specific documents."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Cross-Tab Communication"}),": Managing cross-tab updates in plain IndexedDB is difficult. RxDB handles this seamlessly - changes in one tab automatically affect observed data in others."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Missing Advanced Features"}),": Features like ",(0,i.jsx)(s.a,{href:"/encryption.html",children:"encryption"})," or ",(0,i.jsx)(s.a,{href:"/key-compression.html",children:"compression"})," aren't built into IndexedDB, but they are available via RxDB."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Limited Platform Support"}),": IndexedDB is browser-only. RxDB offers ",(0,i.jsx)(s.a,{href:"/rx-storage.html",children:"swappable storages"})," so you can reuse the same data layer code in mobile or desktop environments."]}),"\n"]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JavaScript Database",width:"220"})})}),"\n",(0,i.jsx)(s.h2,{id:"set-up-rxdb-in-vue",children:"Set up RxDB in Vue"}),"\n",(0,i.jsx)(s.p,{children:"Setting up RxDB with Vue is straightforward. It abstracts IndexedDB complexities and adds a layer of powerful features over it."}),"\n",(0,i.jsx)(s.h3,{id:"installing-rxdb",children:"Installing RxDB"}),"\n",(0,i.jsx)(s.p,{children:"First, install RxDB (and RxJS) from npm:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" rxdb"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" rxjs"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" --save"})]})})})}),"\n",(0,i.jsx)(s.h3,{id:"create-a-database-and-collections",children:"Create a Database and Collections"}),"\n",(0,i.jsx)(s.p,{children:"RxDB provides two main storage options:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["The free ",(0,i.jsx)(s.a,{href:"/rx-storage-localstorage.html",children:"LocalStorage-based storage"})]}),"\n",(0,i.jsxs)(s.li,{children:["The premium plain ",(0,i.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB-based storage"}),", offering faster ",(0,i.jsx)(s.a,{href:"/rx-storage-performance.html",children:"performance"})]}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"Below is an example of setting up a simple RxDB database using the localstorage-based storage in a Vue app:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// db.ts"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" initDB"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'heroesdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // the name of the database"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Define your schema"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" heroSchema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'hero schema'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" description"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Describes a hero in your app'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" power"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'name'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // add collections"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" heroSchema"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" db;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.h3,{id:"crud-operations",children:"CRUD Operations"}),"\n",(0,i.jsx)(s.p,{children:"Once your database is initialized, you can perform all CRUD operations:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// insert"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '1'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Iron Man'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" power"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Genius-level intellect'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// bulk insert"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".bulkInsert"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(["})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '2'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Thor'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" power"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'God of Thunder'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '3'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Hulk'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" power"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Superhuman Strength'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]);"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// find and findOne"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" ironMan"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Iron Man'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" } })"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// update"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Hulk'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" } })"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".update"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ $set"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { power"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Unlimited Strength'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" } });"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// delete"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" thorDoc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Thor'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" } })"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" thorDoc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".remove"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),"\n",(0,i.jsx)(s.h2,{id:"reactive-queries-and-live-updates",children:"Reactive Queries and Live Updates"}),"\n",(0,i.jsxs)(s.p,{children:["RxDB excels in providing reactive data capabilities, ideal for ",(0,i.jsx)(s.a,{href:"/articles/realtime-database.html",children:"real-time applications"}),". Subscribing to queries automatically updates your Vue components when underlying data changes - even across ",(0,i.jsx)(s.a,{href:"/articles/browser-database.html",children:"browser"})," tabs."]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"../files/animations/realtime.gif",alt:"realtime ui updates",width:"700"})}),"\n",(0,i.jsx)(s.h3,{id:"using-rxjs-observables-with-vue-3-composition-api",children:"Using RxJS Observables with Vue 3 Composition API"}),"\n",(0,i.jsx)(s.p,{children:"Here's an example of a Vue component that subscribes to live data updates:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"html","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"html","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"template"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"div"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"h2"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">Hero List"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"ul"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"li"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" v-for"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"hero in heroes"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" :key"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"hero.id"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"strong"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">{{ hero.name }} - {{ hero.power }}"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" "})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" "})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" "})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:""})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"script"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" setup"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" lang"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"ts"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { ref"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" onMounted } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'vue'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { initDB } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '@/db'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" ref"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"any"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"[]>([]);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"onMounted"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" initDB"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // create an observable query"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // subscribe to the query"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"$"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"((newHeroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" any"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"[]) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".value "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" newHeroes;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:""})]})]})})}),"\n",(0,i.jsxs)(s.p,{children:["This component subscribes to the collection's changes, ",(0,i.jsx)(s.a,{href:"/articles/optimistic-ui.html",children:"updating the UI"})," automatically whenever the underlying data changes in any browser tab."]}),"\n",(0,i.jsx)(s.h3,{id:"using-vue-signals",children:"Using Vue Signals"}),"\n",(0,i.jsxs)(s.p,{children:["If you're exploring Vue's reactivity transforms or signals, RxDB also offers ",(0,i.jsx)(s.a,{href:"/reactivity.html",children:"custom reactivity factories"})," (",(0,i.jsx)(s.a,{href:"/premium/",children:"premium plugins"})," are required). This allows queries to emit data as signals instead of traditional Observables."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" heroesSignal"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"().$$; "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// $$ indicates a reactive result"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "})]})})}),"\n",(0,i.jsx)(s.p,{children:"With this, in your Vue template or script, you can directly read from heroesSignal()"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"html","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"html","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"template"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"div"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"h2"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">Hero List"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"ul"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" \x3c!-- we read heroesSignal.value which is always up to date --\x3e"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"li"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" v-for"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"hero in heroesSignal.value"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" :key"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"hero.id"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"strong"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">{{ hero.name }} - {{ hero.power }}"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" "})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" "})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" "})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:""})]})]})})}),"\n",(0,i.jsx)(s.h2,{id:"vue-indexeddb-example-with-rxdb",children:"Vue IndexedDB Example with RxDB"}),"\n",(0,i.jsxs)(s.p,{children:["A comprehensive example of using RxDB within a Vue application can be found in the ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/vue",children:"RxDB GitHub repository"}),". This repository contains sample applications, showcasing best practices and demonstrating how to integrate RxDB for various use cases."]}),"\n",(0,i.jsx)(s.h2,{id:"advanced-rxdb-features",children:"Advanced RxDB Features"}),"\n",(0,i.jsx)(s.p,{children:"RxDB offers many advanced features that extend beyond basic data storage:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"/replication.html",children:"RxDB Replication"}),": Synchronize local data with remote databases seamlessly."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"/migration-schema.html",children:"Data Migration"}),": Handle schema changes gracefully with automatic data migrations."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"/encryption.html",children:"Encryption"}),": Secure your data with built-in encryption capabilities."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"/key-compression.html",children:"Compression"}),": Optimize storage using key compression."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"limitations-of-indexeddb",children:"Limitations of IndexedDB"}),"\n",(0,i.jsx)(s.p,{children:"While IndexedDB is powerful, it has some inherent limitations:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Performance: IndexedDB can be slow under certain conditions. Read more: ",(0,i.jsx)(s.a,{href:"/slow-indexeddb.html",children:"Slow IndexedDB"})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/articles/indexeddb-max-storage-limit.html",children:"Storage Limits"}),": Browsers impose limits on how much data can be stored. See: ",(0,i.jsx)(s.a,{href:"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#storage-size-limits",children:"Browser storage limits"}),"."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"alternatives-to-indexeddb",children:"Alternatives to IndexedDB"}),"\n",(0,i.jsxs)(s.p,{children:["Depending on your application's requirements, there are ",(0,i.jsx)(s.a,{href:"/rx-storage.html",children:"alternative storage solutions"})," to consider:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Origin Private File System (OPFS)"}),": A newer API that can offer better performance. RxDB supports OPFS as well. More info: ",(0,i.jsx)(s.a,{href:"/rx-storage-opfs.html",children:"RxDB OPFS Storage"})]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"SQLite"}),": Ideal for hybrid frameworks or Capacitor, offering native performance. Explore: ",(0,i.jsx)(s.a,{href:"/rx-storage-sqlite.html",children:"RxDB SQLite Storage"})]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"performance-comparison-with-other-browser-storages",children:"Performance Comparison with Other Browser Storages"}),"\n",(0,i.jsx)(s.p,{children:"Here is a performance overview of the various browser-based storage implementations of RxDB:"}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"../files/rx-storage-performance-browser.png",alt:"RxStorage performance - browser",width:"700"})}),"\n",(0,i.jsx)(s.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Learn how to use RxDB with the ",(0,i.jsx)(s.a,{href:"/quickstart.html",children:"RxDB Quickstart"})," for a guided introduction."]}),"\n",(0,i.jsxs)(s.li,{children:["Check out the ",(0,i.jsx)(s.a,{href:"/code/",children:"RxDB GitHub repository"})," and leave a star \u2b50 if you find it useful."]}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["By leveraging RxDB on top of IndexedDB, you can create highly responsive, offline-capable Vue applications without dealing with the low-level complexities of IndexedDB directly. With ",(0,i.jsx)(s.a,{href:"/rx-query.html",children:"reactive queries"}),", seamless cross-tab communication, and powerful advanced features, RxDB becomes an invaluable tool in modern web development."]})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453(e,s,n){n.d(s,{R:()=>a,x:()=>l});var r=n(6540);const i={},o=r.createContext(i);function a(e){const s=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/820807a1.82638c55.js b/docs/assets/js/820807a1.82638c55.js deleted file mode 100644 index 0dd2e6ad232..00000000000 --- a/docs/assets/js/820807a1.82638c55.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[7836],{8453(e,i,a){a.d(i,{R:()=>r,x:()=>o});var n=a(6540);const t={},s=n.createContext(t);function r(e){const i=n.useContext(s);return n.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),n.createElement(s.Provider,{value:i},e.children)}},8906(e,i,a){a.r(i),a.d(i,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"articles/local-database","title":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","description":"An in-depth exploration of local databases and why RxDB excels as a local-first solution for JavaScript applications.","source":"@site/docs/articles/local-database.md","sourceDirName":"articles","slug":"/articles/local-database.html","permalink":"/articles/local-database.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","slug":"local-database.html","description":"An in-depth exploration of local databases and why RxDB excels as a local-first solution for JavaScript applications."},"sidebar":"tutorialSidebar","previous":{"title":"Building an Optimistic UI with RxDB","permalink":"/articles/optimistic-ui.html"},"next":{"title":"React Native Encryption and Encrypted Database/Storage","permalink":"/articles/react-native-encryption.html"}}');var t=a(4848),s=a(8453);const r={title:"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications",slug:"local-database.html",description:"An in-depth exploration of local databases and why RxDB excels as a local-first solution for JavaScript applications."},o="What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications",l={},c=[{value:"Use Cases of Local Databases",id:"use-cases-of-local-databases",level:3},{value:"Performance Optimization",id:"performance-optimization",level:3},{value:"Security and Encryption",id:"security-and-encryption",level:3},{value:"Why RxDB is Optimized for JavaScript Applications",id:"why-rxdb-is-optimized-for-javascript-applications",level:2},{value:"Real-Time Reactivity",id:"real-time-reactivity",level:3},{value:"Offline-First Support",id:"offline-first-support",level:3},{value:"Flexible Data Replication",id:"flexible-data-replication",level:3},{value:"Schema Validation and Versioning",id:"schema-validation-and-versioning",level:3},{value:"Rich Plugin Ecosystem",id:"rich-plugin-ecosystem",level:3},{value:"Multi-Platform Compatibility",id:"multi-platform-compatibility",level:3},{value:"Performance Optimization",id:"performance-optimization-1",level:3},{value:"Proven Reliability",id:"proven-reliability",level:3},{value:"Developer-Friendly Features",id:"developer-friendly-features",level:3},{value:"Follow Up",id:"follow-up",level:2}];function d(e){const i={a:"a",h1:"h1",h2:"h2",h3:"h3",header:"header",hr:"hr",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.header,{children:(0,t.jsx)(i.h1,{id:"what-is-a-local-database-and-why-rxdb-is-the-best-local-database-for-javascript-applications",children:"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications"})}),"\n",(0,t.jsxs)(i.p,{children:["A ",(0,t.jsx)(i.strong,{children:"local database"})," is a data storage system residing on a user's device, allowing applications to store, query, and manipulate information without needing continuous network access. This approach prioritizes quick data retrieval, efficient updates, and the ability to function in ",(0,t.jsx)(i.a,{href:"/offline-first.html",children:"offline-first"})," scenarios. In contrast, server-based databases require an active internet connection for each request and response cycle, making them more vulnerable to latency, network disruptions, and downtime."]}),"\n",(0,t.jsxs)(i.p,{children:["Local databases often leverage technologies such as ",(0,t.jsx)(i.strong,{children:"IndexedDB"}),", ",(0,t.jsx)(i.strong,{children:"SQLite"}),", or ",(0,t.jsx)(i.strong,{children:"WebSQL"})," (though WebSQL has been deprecated). These technologies manage both structured data (like relational tables) and unstructured data (such as JSON documents). When connectivity is restored, local databases typically sync their changes back to a central server-side database, maintaining consistent and up-to-date records across multiple devices."]}),"\n",(0,t.jsx)(i.h3,{id:"use-cases-of-local-databases",children:"Use Cases of Local Databases"}),"\n",(0,t.jsx)(i.p,{children:"Local databases are particularly beneficial for:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"Offline Functionality"}),": Essential for apps that must remain usable without a consistent internet connection, such as note-taking apps or offline-first CRMs. Users can continue adding and editing data, then sync changes once they reconnect."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"Low Latency"}),": By reducing round-trips to remote servers, local databases enable real-time responsiveness. This feature is critical for interactive applications such as gaming platforms, data dashboards, or analytics tools that need near-instant feedback."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"Data Synchronization"}),": Many modern applications - like chat systems or collaborative editing tools - require continuous data exchange between multiple users or devices. Local databases can handle intermittent connectivity gracefully, queuing updates locally and syncing them when possible."]}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:["In addition, local databases are increasingly integral to ",(0,t.jsx)(i.strong,{children:"Progressive Web Apps (PWAs)"}),", offering a native app-like user experience that is fast and available, even when offline."]}),"\n",(0,t.jsx)(i.h3,{id:"performance-optimization",children:"Performance Optimization"}),"\n",(0,t.jsx)(i.p,{children:"The primary performance benefit of a local database is its proximity to the application: queries and updates happen directly on the user's device, eliminating the overhead of multiple network hops. Common optimizations include:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"Caching"}),": Storing frequently accessed data in memory or on disk to minimize expensive operations."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"Batching Writes"}),": Grouping database operations into a single write transaction to reduce overhead and lock contention."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"Efficient Indexing"}),": Using appropriate indexes to speed up queries, especially important for applications that handle large data sets or frequent lookups."]}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:["These techniques ensure that local databases run smoothly, even on lower-powered or ",(0,t.jsx)(i.a,{href:"/articles/mobile-database.html",children:"mobile devices"}),"."]}),"\n",(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"/files/loading-spinner-not-needed.gif",alt:"loading spinner not needed",width:"300"})}),"\n",(0,t.jsx)(i.h3,{id:"security-and-encryption",children:"Security and Encryption"}),"\n",(0,t.jsxs)(i.p,{children:["Storing data on user devices introduces unique security considerations, such as the risk of physical theft or unauthorized access. Consequently, many local databases support ",(0,t.jsx)(i.strong,{children:"encryption"})," options to safeguard sensitive information. Developers can implement additional security measures like ",(0,t.jsx)(i.strong,{children:"device-level encryption"}),", ",(0,t.jsx)(i.strong,{children:"secure storage plugins"}),", and user authentication to further protect data from prying eyes."]}),"\n",(0,t.jsx)(i.hr,{}),"\n",(0,t.jsx)("center",{children:(0,t.jsx)("a",{href:"https://rxdb.info/",children:(0,t.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"RxDB Database",width:"220"})})}),"\n",(0,t.jsx)(i.h2,{id:"why-rxdb-is-optimized-for-javascript-applications",children:"Why RxDB is Optimized for JavaScript Applications"}),"\n",(0,t.jsx)(i.p,{children:"RxDB (Reactive Database) is an offline-first, NoSQL database designed to meet the needs of modern JavaScript applications. Built with a focus on reactivity and real-time data handling, RxDB excels in scenarios where low-latency, offline availability, and scalability are essential."}),"\n",(0,t.jsx)(i.h3,{id:"real-time-reactivity",children:"Real-Time Reactivity"}),"\n",(0,t.jsxs)(i.p,{children:["At the core of RxDB is ",(0,t.jsx)(i.strong,{children:"reactive programming"}),", allowing you to subscribe to changes in your data collections and receive immediate UI updates when records change - no manual polling or refetching required. For instance, a chat application can display incoming messages as soon as they arrive, maintaining a smooth and responsive experience."]}),"\n",(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("img",{src:"/files/multiwindow.gif",alt:"RxDB multi tab",width:"450"})}),"\n",(0,t.jsx)(i.h3,{id:"offline-first-support",children:"Offline-First Support"}),"\n",(0,t.jsxs)(i.p,{children:["RxDB's primary design goal is to work seamlessly in offline environments. Even if your device loses internet connectivity, RxDB enables you to continue reading and writing data. Once the connection is restored, all pending changes are automatically synchronized with your backend. This ",(0,t.jsx)(i.a,{href:"/offline-first.html",children:"offline-first approach"})," is ideal for productivity apps, field service tools, and other scenarios where reliability and user autonomy are paramount."]}),"\n",(0,t.jsx)(i.h3,{id:"flexible-data-replication",children:"Flexible Data Replication"}),"\n",(0,t.jsxs)(i.p,{children:["A standout feature of RxDB is its ",(0,t.jsx)(i.a,{href:"/replication.html",children:"bi-directional replication"}),". It supports synchronization with a variety of backends, such as:"]}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.a,{href:"/replication-couchdb.html",children:"CouchDB"}),": Via the CouchDB replication, facilitating easy integration with any Couch-compatible server."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.a,{href:"/replication-graphql.html",children:"GraphQL Endpoints"}),": Through community plugins, developers can replicate JSON documents to and from GraphQL servers."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.a,{href:"/replication-http.html",children:"Custom Backends"}),": RxDB provides hooks to build custom replication strategies for proprietary or specialized server APIs."]}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"This flexibility ensures that RxDB fits into diverse architectures without locking you into a single vendor or technology stack."}),"\n",(0,t.jsx)(i.h3,{id:"schema-validation-and-versioning",children:"Schema Validation and Versioning"}),"\n",(0,t.jsxs)(i.p,{children:["Rather than relying on implicit data models, RxDB leverages ",(0,t.jsx)(i.strong,{children:"JSON schema"})," to define document structures. This approach promotes data consistency by enforcing constraints such as required fields and acceptable data formats. As your application grows and changes, RxDB's built-in ",(0,t.jsx)(i.strong,{children:"schema versioning"})," and migration tools help you evolve your database schema safely, minimizing risks of data corruption or loss."]}),"\n",(0,t.jsx)(i.h3,{id:"rich-plugin-ecosystem",children:"Rich Plugin Ecosystem"}),"\n",(0,t.jsxs)(i.p,{children:["One of RxDB's greatest strengths is its ",(0,t.jsx)(i.strong,{children:"pluggable architecture"}),", allowing you to add functionality as needed:"]}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.a,{href:"/encryption.html",children:"Encryption"}),": Secure your data at rest using advanced encryption plugins."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.a,{href:"/fulltext-search.html",children:"Full-Text Search"}),": Integrate powerful text search capabilities for applications that require quick and flexible query options."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.a,{href:"/rx-storage.html",children:"Storage Adapters"}),": Swap out the underlying storage layer (e.g., ",(0,t.jsx)(i.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB in the browser"}),", ",(0,t.jsx)(i.a,{href:"/rx-storage-sqlite.html",children:"SQLite"})," in ",(0,t.jsx)(i.a,{href:"/react-native-database.html",children:"React Native"}),", or a custom engine) without rewriting your application logic."]}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"You can fine-tune RxDB to your exact needs, avoiding the performance overhead of unnecessary features."}),"\n",(0,t.jsx)(i.h3,{id:"multi-platform-compatibility",children:"Multi-Platform Compatibility"}),"\n",(0,t.jsx)(i.p,{children:"RxDB is a perfect fit for cross-platform development, as it supports numerous environments:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"Browsers (IndexedDB)"}),": For web and PWA projects."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"Node.js"}),": Ideal for server-side rendering or background services."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"React Native"}),": Leverage SQLite or other adapters for mobile app development."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.a,{href:"/electron-database.html",children:"Electron"}),": Create offline-capable desktop apps with a unified codebase."]}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"This versatility empowers teams to reuse application logic across multiple platforms while maintaining a consistent data model."}),"\n",(0,t.jsx)(i.h3,{id:"performance-optimization-1",children:"Performance Optimization"}),"\n",(0,t.jsxs)(i.p,{children:["With ",(0,t.jsx)(i.strong,{children:"lazy loading"})," of data and the ability to utilize efficient storage engines, RxDB delivers high-speed operations and quick response times. By minimizing disk I/O and leveraging indexes effectively, RxDB ensures that even large-scale applications remain performant. Its reactive nature also helps avoid unnecessary re-renders, improving the end-user experience."]}),"\n",(0,t.jsx)(i.h3,{id:"proven-reliability",children:"Proven Reliability"}),"\n",(0,t.jsx)(i.p,{children:"RxDB is battle-tested in production environments, handling use cases from small single-user applications to large-scale enterprise solutions. Its robust replication mechanism resolves conflicts, manages concurrent writes, and ensures data integrity. The active open-source community provides ongoing support, documentation updates, and feature improvements."}),"\n",(0,t.jsx)(i.h3,{id:"developer-friendly-features",children:"Developer-Friendly Features"}),"\n",(0,t.jsx)(i.p,{children:"For developers, RxDB offers:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"Straightforward APIs"}),": Built on top of familiar JavaScript paradigms like promises and observables."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"Excellent Documentation"}),": Detailed guides, tutorials, and references for every major feature."]}),"\n",(0,t.jsxs)(i.li,{children:[(0,t.jsx)(i.strong,{children:"Rich Community Support"}),": Benefit from an active ecosystem of contributors creating plugins, answering questions, and maintaining core libraries."]}),"\n"]}),"\n",(0,t.jsx)(i.p,{children:"These qualities streamline development, making RxDB an appealing choice for teams of all sizes."}),"\n",(0,t.jsx)(i.hr,{}),"\n",(0,t.jsx)(i.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,t.jsx)(i.p,{children:"Ready to get started? Here are some next steps:"}),"\n",(0,t.jsxs)(i.ul,{children:["\n",(0,t.jsxs)(i.li,{children:["Try the ",(0,t.jsx)(i.a,{href:"/quickstart.html",children:"Quickstart Tutorial"})," and build a basic project to see RxDB in action."]}),"\n",(0,t.jsxs)(i.li,{children:["Compare RxDB with ",(0,t.jsx)(i.a,{href:"/alternatives.html",children:"other local database solutions"})," to determine the best fit for your unique requirements."]}),"\n"]}),"\n",(0,t.jsxs)(i.p,{children:["Ultimately, ",(0,t.jsx)(i.strong,{children:"RxDB"})," is more than just a database - it's a robust, reactive toolkit that empowers you to build fast, resilient, and user-centric applications. Whether you're creating an offline-first note-taking app or a real-time collaborative platform, RxDB can handle your local storage needs with ease and flexibility."]})]})}function h(e={}){const{wrapper:i}={...(0,s.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/8288c265.d455b0a0.js b/docs/assets/js/8288c265.d455b0a0.js deleted file mode 100644 index 6b3ca9e4cd6..00000000000 --- a/docs/assets/js/8288c265.d455b0a0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9881],{2309(e,r,s){s.r(r),s.d(r,{assets:()=>l,contentTitle:()=>i,default:()=>c,frontMatter:()=>t,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"releases/11.0.0","title":"RxDB 11 - WebWorker Support & More","description":"RxDB 11.0 brings Worker-based storage for multi-core performance gains. Explore the major changes and migrate seamlessly to harness new speeds.","source":"@site/docs/releases/11.0.0.md","sourceDirName":"releases","slug":"/releases/11.0.0.html","permalink":"/releases/11.0.0.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB 11 - WebWorker Support & More","slug":"11.0.0.html","description":"RxDB 11.0 brings Worker-based storage for multi-core performance gains. Explore the major changes and migrate seamlessly to harness new speeds."},"sidebar":"tutorialSidebar","previous":{"title":"12.0.0","permalink":"/releases/12.0.0.html"},"next":{"title":"10.0.0","permalink":"/releases/10.0.0.html"}}');var o=s(4848),a=s(8453);const t={title:"RxDB 11 - WebWorker Support & More",slug:"11.0.0.html",description:"RxDB 11.0 brings Worker-based storage for multi-core performance gains. Explore the major changes and migrate seamlessly to harness new speeds."},i="11.0.0",l={},d=[{value:"Worker plugin",id:"worker-plugin",level:2},{value:"Transpile async/await to promises instead of generators",id:"transpile-asyncawait-to-promises-instead-of-generators",level:2},{value:"Removed deprecated received methods",id:"removed-deprecated-received-methods",level:2},{value:"All internal events are handled as bulks",id:"all-internal-events-are-handled-as-bulks",level:2},{value:"RxStorage interface changes",id:"rxstorage-interface-changes",level:2},{value:"Removed the no-validate plugin.",id:"removed-the-no-validate-plugin",level:2},{value:"Other changes",id:"other-changes",level:2},{value:"Migration from 10.x.x",id:"migration-from-10xx",level:2},{value:"You can help!",id:"you-can-help",level:2},{value:"Discuss!",id:"discuss",level:2}];function h(e){const r={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.header,{children:(0,o.jsx)(r.h1,{id:"1100",children:"11.0.0"})}),"\n",(0,o.jsxs)(r.p,{children:["The last major release was only about ",(0,o.jsx)(r.a,{href:"/releases/10.0.0.html",children:"6 month ago"}),". But to further improve RxDB, it was necessary to make some more breaking changes and release the next major version.\nIn the last version ",(0,o.jsx)(r.code,{children:"10.0.0"})," the storage layer was abstracted in a way to make it possible to not only use PouchDB as storage, but instead we can use different storage engines like the one based on ",(0,o.jsx)(r.a,{href:"/rx-storage-lokijs.html",children:"LokiJS"})," or any custom implementation of the ",(0,o.jsx)(r.code,{children:"RxStorage"})," interface."]}),"\n",(0,o.jsxs)(r.p,{children:["In the new version ",(0,o.jsx)(r.code,{children:"11.0.0"})," the focus is on making it possible to put the RxStorage into a ",(0,o.jsx)(r.strong,{children:"WebWorker"})," to take CPU load from the main process into the worker's process. This can improve the perceived performance of your application, especially when you have to handle many documents or when you need the main process CPU cycles to manage the DOM with your frontend framework."]}),"\n",(0,o.jsx)(r.h2,{id:"worker-plugin",children:"Worker plugin"}),"\n",(0,o.jsxs)(r.p,{children:["Performance was always something RxDB had a struggle with. Not because RxDB itself is slow, but because the underlying storage engine (mostly PouchDB) or ",(0,o.jsx)(r.a,{href:"/slow-indexeddb.html",children:"IndexedDB is slow"}),". This never was a problem for 'normal' applications that have to store some documents. But on big applications with much data, there was a bottleneck."]}),"\n",(0,o.jsxs)(r.p,{children:["With the Worker plugin, you can move the ",(0,o.jsx)(r.code,{children:"RxStorage"})," out of the main JavaScript process. This makes it pretty easy to utilize more than one CPU core and speed up your application."]}),"\n",(0,o.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"// worker.ts"})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { wrappedRxStorage } "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/worker'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLoki } "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-lokijs'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:"wrappedRxStorage"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLoki"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"// main process"})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageWorker } "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/worker'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageWorker"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" workerInput"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'path/to/worker.js'"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" )"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsxs)(r.p,{children:["The whole documentation about the worker plugin can be found ",(0,o.jsx)(r.a,{href:"/rx-storage-worker.html",children:"here"}),"."]}),"\n",(0,o.jsxs)(r.h2,{id:"transpile-asyncawait-to-promises-instead-of-generators",children:["Transpile ",(0,o.jsx)(r.code,{children:"async"}),"/",(0,o.jsx)(r.code,{children:"await"})," to promises instead of generators"]}),"\n",(0,o.jsxs)(r.p,{children:["The RxDB source-code is transpiled from TypeScript to es5/es6 JavaScript code via babel.\nIn the past we transpiled the ",(0,o.jsx)(r.code,{children:"async"})," and ",(0,o.jsx)(r.code,{children:"await"})," keywords with the babel plugin ",(0,o.jsx)(r.code,{children:"plugin-transform-async-to-generator"}),".\nNow we use the ",(0,o.jsx)(r.a,{href:"https://github.com/rpetrich/babel-plugin-transform-async-to-promises",children:"babel-plugin-transform-async-to-promises"})," plugin instead.\nIt transpiles ",(0,o.jsx)(r.code,{children:"async"}),"/",(0,o.jsx)(r.code,{children:"await"})," into native ",(0,o.jsx)(r.code,{children:"Promise"}),"s instead of using JavaScript generators. This has shown to decrease build size by about 10% and also improves the performance."]}),"\n",(0,o.jsxs)(r.h2,{id:"removed-deprecated-received-methods",children:["Removed deprecated ",(0,o.jsx)(r.code,{children:"received"})," methods"]}),"\n",(0,o.jsxs)(r.p,{children:["In the past there was a typo in all getters and methods that are called ",(0,o.jsx)(r.code,{children:"received"}),".\nThis was renamed to ",(0,o.jsx)(r.code,{children:"received"})," and all mistyped methods have been deprecated.\nWe now removed all deprecated methods, so you have to use the correctly spelled methods instead.\n",(0,o.jsx)(r.a,{href:"https://github.com/pubkey/rxdb/pull/3392",children:"See #3392"})]}),"\n",(0,o.jsx)(r.h2,{id:"all-internal-events-are-handled-as-bulks",children:"All internal events are handled as bulks"}),"\n",(0,o.jsxs)(r.p,{children:["All events that are generated from writing to the storage instance are now handled in bulks instead of each event for its own. This has shown to save performance when the events are send over a data layer like a ",(0,o.jsx)(r.code,{children:"WebWorker"})," or the ",(0,o.jsx)(r.code,{children:"BroadcastChannel"}),". This change only affects you if you have created custom RxDB plugins."]}),"\n",(0,o.jsx)(r.h2,{id:"rxstorage-interface-changes",children:"RxStorage interface changes"}),"\n",(0,o.jsx)(r.p,{children:"To make the RxStorage abstraction compatible with Webworkers, we had to do some changes. These will only affect you if you use a custom RxStorage implementation."}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsxs)(r.li,{children:["The non async functions ",(0,o.jsx)(r.code,{children:"prepareQuery"}),", ",(0,o.jsx)(r.code,{children:"getSortComparator"})," and ",(0,o.jsx)(r.code,{children:"getQueryMatcher"})," have been moved out of ",(0,o.jsx)(r.code,{children:"RxStorageInstance"})," into the ",(0,o.jsx)(r.code,{children:"statics"})," property of ",(0,o.jsx)(r.code,{children:"RxStorage"}),". This makes it possible to split the code when using the worker plugin. You only need to load the static methods at the main process, and the whole storage engine is only loaded inside of the worker."]}),"\n",(0,o.jsxs)(r.li,{children:["All data communication with the RxStorage now happens only via plain JSON objects. Instead of returning a JavaScript ",(0,o.jsx)(r.code,{children:"Map"})," or ",(0,o.jsx)(r.code,{children:"Set"}),", only ",(0,o.jsx)(r.a,{href:"https://www.w3schools.com/js/js_json_datatypes.asp",children:"JSON datatypes"})," are allowed. This makes it easier to properly serialize the data when transferring it over to or from a WebWorker."]}),"\n",(0,o.jsxs)(r.li,{children:["Events that are created from a write operation, must be emitted ",(0,o.jsx)(r.strong,{children:"before"})," the write operation resolves. This ensures that RxDB always knows about all events before it runs another operation. So when you do an insert and a query directly after the insert, the query will return the correct results."]}),"\n",(0,o.jsxs)(r.li,{children:["The meta data ",(0,o.jsx)(r.code,{children:"digest"})," and ",(0,o.jsx)(r.code,{children:"length"})," of attachments is now created by RxDB, not by the RxStorage. ",(0,o.jsx)(r.a,{href:"https://github.com/pubkey/rxdb/issues/3548",children:"#3548"})]}),"\n",(0,o.jsxs)(r.li,{children:["Added the statics ",(0,o.jsx)(r.code,{children:"hashKey"})," property to identify the used hash function."]}),"\n"]}),"\n",(0,o.jsxs)(r.h2,{id:"removed-the-no-validate-plugin",children:["Removed the ",(0,o.jsx)(r.code,{children:"no-validate"})," plugin."]}),"\n",(0,o.jsxs)(r.p,{children:["In the past, RxDB required you to add one schema validation plugin. For production, it was useful to not have any schema validation for better performance and a smaller build size. For that, the ",(0,o.jsx)(r.code,{children:"no-validate"})," plugin could be added which was just a dummy plugin that did no do any validation. To remove this unnecessary complexity, RxDB no longer requires you to add a validation plugin. Therefore the no-validate plugin is now removed as it is no longer needed."]}),"\n",(0,o.jsx)(r.h2,{id:"other-changes",children:"Other changes"}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsxs)(r.li,{children:["The LokiJS RxStorage no longer uses the ",(0,o.jsx)(r.code,{children:"IdleQueue"})," to determine if the database is idle. Because LokiJS is in-memory, we can just wait for CPU idleness via ",(0,o.jsx)(r.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback",children:"requestIdleCallback()"})]}),"\n",(0,o.jsx)(r.li,{children:"Bugfix: Do not throw an error when database is destroyed while a GraphQL replication is running."}),"\n",(0,o.jsxs)(r.li,{children:['Compound primary key migration throws "Value of primary key(s) cannot be changed" ',(0,o.jsx)(r.a,{href:"https://github.com/pubkey/rxdb/pull/3546",children:"#3546"})]}),"\n",(0,o.jsxs)(r.li,{children:["Allow ",(0,o.jsx)(r.code,{children:"_id"})," as primaryKey ",(0,o.jsx)(r.a,{href:"https://github.com/pubkey/rxdb/pull/3562",children:"#3562"})," Thanks ",(0,o.jsx)(r.a,{href:"https://github.com/SuperKirik",children:"@SuperKirik"})]}),"\n",(0,o.jsx)(r.li,{children:"LokiJS: Remote operations do never resolve when remote instance was leader and died."}),"\n"]}),"\n",(0,o.jsxs)(r.h2,{id:"migration-from-10xx",children:["Migration from ",(0,o.jsx)(r.code,{children:"10.x.x"})]}),"\n",(0,o.jsx)(r.p,{children:"The migration should be pretty easy. Nothing in the datalayer has been changed, so you can use the stored data of v10 together with the new v11 RxDB."}),"\n",(0,o.jsx)(r.h2,{id:"you-can-help",children:"You can help!"}),"\n",(0,o.jsxs)(r.p,{children:["There are many things that can be done by ",(0,o.jsx)(r.strong,{children:"you"})," to improve RxDB:"]}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsxs)(r.li,{children:["Check the ",(0,o.jsx)(r.a,{href:"https://github.com/pubkey/rxdb/blob/master/orga/BACKLOG.md",children:"BACKLOG"})," for features that would be great to have."]}),"\n",(0,o.jsxs)(r.li,{children:["Check the ",(0,o.jsx)(r.a,{href:"https://github.com/pubkey/rxdb/blob/master/orga/before-next-major.md",children:"breaking backlog"})," for breaking changes that must be implemented in the future but where I did not had the time yet."]}),"\n",(0,o.jsxs)(r.li,{children:["Check the ",(0,o.jsx)(r.a,{href:"https://github.com/pubkey/rxdb/search?q=todo",children:"todos"})," in the code. There are many small improvements that can be done for performance and build size."]}),"\n",(0,o.jsx)(r.li,{children:"Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors."}),"\n",(0,o.jsx)(r.li,{children:"Improve the documentation. In the last user survey many users told me that the documentation is not good enough. But I reviewed the docs and could not find clear flaws. The problem is that I am way to deep into RxDB so that I am not able to understand which documentation a newcomer to the project needs. Likely I assume too much knowledge or focus writing about the wrong parts."}),"\n",(0,o.jsxs)(r.li,{children:["Update the ",(0,o.jsx)(r.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples",children:"example projects"})," many of them are outdated and need updates."]}),"\n"]}),"\n",(0,o.jsx)(r.h2,{id:"discuss",children:"Discuss!"}),"\n",(0,o.jsxs)(r.p,{children:["Please ",(0,o.jsx)(r.a,{href:"https://github.com/pubkey/rxdb/issues/3555",children:"discuss here"}),"."]})]})}function c(e={}){const{wrapper:r}={...(0,a.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},8453(e,r,s){s.d(r,{R:()=>t,x:()=>i});var n=s(6540);const o={},a=n.createContext(o);function t(e){const r=n.useContext(a);return n.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function i(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:t(e.components),n.createElement(a.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/8489a755.3170bb72.js b/docs/assets/js/8489a755.3170bb72.js deleted file mode 100644 index f6a5c1877ec..00000000000 --- a/docs/assets/js/8489a755.3170bb72.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[7700],{7883(e,n,s){s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>t,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"articles/jquery-database","title":"RxDB as a Database in a jQuery Application","description":"Level up your jQuery-based projects with RxDB. Build real-time, resilient, and responsive apps powered by a reactive NoSQL database right in the browser.","source":"@site/docs/articles/jquery-database.md","sourceDirName":"articles","slug":"/articles/jquery-database.html","permalink":"/articles/jquery-database.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB as a Database in a jQuery Application","slug":"jquery-database.html","description":"Level up your jQuery-based projects with RxDB. Build real-time, resilient, and responsive apps powered by a reactive NoSQL database right in the browser."},"sidebar":"tutorialSidebar","previous":{"title":"IndexedDB Database in Vue Apps - The Power of RxDB","permalink":"/articles/vue-indexeddb.html"},"next":{"title":"RxDB - Firestore Alternative to Sync with Your Own Backend","permalink":"/articles/firestore-alternative.html"}}');var i=s(4848),a=s(8453),o=s(2271);const t={title:"RxDB as a Database in a jQuery Application",slug:"jquery-database.html",description:"Level up your jQuery-based projects with RxDB. Build real-time, resilient, and responsive apps powered by a reactive NoSQL database right in the browser."},l="RxDB as a Database in a jQuery Application",c={},d=[{value:"jQuery Web Applications",id:"jquery-web-applications",level:2},{value:"Importance of Databases in jQuery Applications",id:"importance-of-databases-in-jquery-applications",level:2},{value:"Introducing RxDB as a Database Solution",id:"introducing-rxdb-as-a-database-solution",level:2},{value:"Key Features",id:"key-features",level:3},{value:"Getting Started with RxDB",id:"getting-started-with-rxdb",level:2},{value:"What is RxDB?",id:"what-is-rxdb",level:3},{value:"Reactive Data Handling",id:"reactive-data-handling",level:3},{value:"Offline-First Approach",id:"offline-first-approach",level:3},{value:"Data Replication",id:"data-replication",level:3},{value:"Observable Queries",id:"observable-queries",level:3},{value:"Multi-Tab Support",id:"multi-tab-support",level:3},{value:"RxDB vs. Other jQuery Database Options",id:"rxdb-vs-other-jquery-database-options",level:3},{value:"Using RxDB in a jQuery Application",id:"using-rxdb-in-a-jquery-application",level:2},{value:"Installing RxDB",id:"installing-rxdb",level:3},{value:"Creating and Configuring a Database",id:"creating-and-configuring-a-database",level:2},{value:"Updating the DOM with jQuery",id:"updating-the-dom-with-jquery",level:2},{value:"Different RxStorage layers for RxDB",id:"different-rxstorage-layers-for-rxdb",level:2},{value:"Synchronizing Data with RxDB between Clients and Servers",id:"synchronizing-data-with-rxdb-between-clients-and-servers",level:2},{value:"Offline-First Approach",id:"offline-first-approach-1",level:3},{value:"Conflict Resolution",id:"conflict-resolution",level:3},{value:"Bidirectional Synchronization",id:"bidirectional-synchronization",level:3},{value:"Advanced RxDB Features and Techniques",id:"advanced-rxdb-features-and-techniques",level:2},{value:"Indexing and Performance Optimization",id:"indexing-and-performance-optimization",level:3},{value:"Encryption of Local Data",id:"encryption-of-local-data",level:3},{value:"Change Streams and Event Handling",id:"change-streams-and-event-handling",level:3},{value:"JSON Key Compression",id:"json-key-compression",level:3},{value:"Best Practices for Using RxDB in jQuery Applications",id:"best-practices-for-using-rxdb-in-jquery-applications",level:2},{value:"Follow Up",id:"follow-up",level:2}];function h(e){const n={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"rxdb-as-a-database-in-a-jquery-application",children:"RxDB as a Database in a jQuery Application"})}),"\n",(0,i.jsxs)(n.p,{children:["In the early days of dynamic web development, ",(0,i.jsx)(n.strong,{children:"jQuery"})," emerged as a popular library that simplified DOM manipulation and AJAX requests. Despite the rise of modern frameworks, many developers still maintain or extend existing jQuery projects, or leverage jQuery in specific contexts. As jQuery applications grow in complexity, they often require efficient data handling, offline support, and synchronization capabilities. This is where ",(0,i.jsx)(n.a,{href:"https://rxdb.info/",children:"RxDB"}),", a reactive JavaScript database for the browser, node.js, and ",(0,i.jsx)(n.a,{href:"/articles/mobile-database.html",children:"mobile devices"}),", steps in."]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JavaScript jQuery Database",width:"220"})})}),"\n",(0,i.jsx)(n.h2,{id:"jquery-web-applications",children:"jQuery Web Applications"}),"\n",(0,i.jsx)(n.p,{children:"jQuery provides a simple API for DOM manipulation, event handling, and AJAX calls. It has been widely adopted due to its ease of use and strong community support. Many projects continue to rely on jQuery for handling client-side functionality, UI interactions, and animations. As these applications evolve, the need for a robust database solution that can manage data locally (and offline) becomes increasingly important."}),"\n",(0,i.jsx)(n.h2,{id:"importance-of-databases-in-jquery-applications",children:"Importance of Databases in jQuery Applications"}),"\n",(0,i.jsx)(n.p,{children:"Modern, data-driven jQuery applications often need to:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Store and retrieve data locally"})," for quick and responsive user experiences."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Synchronize data"})," between clients or with a ",(0,i.jsx)(n.a,{href:"/rx-server.html",children:"central server"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Handle offline scenarios"})," seamlessly."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Handle large or complex data structures"})," without repeatedly hitting the server."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Relying solely on server endpoints or basic browser storage (like ",(0,i.jsx)(n.code,{children:"localStorage"}),") can quickly become unwieldy for larger or more complex use cases. Enter RxDB, a dedicated solution that manages data on the client side while offering real-time synchronization and offline-first capabilities."]}),"\n",(0,i.jsx)(n.h2,{id:"introducing-rxdb-as-a-database-solution",children:"Introducing RxDB as a Database Solution"}),"\n",(0,i.jsxs)(n.p,{children:["RxDB (short for Reactive Database) is built on top of ",(0,i.jsx)(n.a,{href:"/articles/browser-database.html",children:"IndexedDB"})," and leverages ",(0,i.jsx)(n.a,{href:"https://rxjs.dev/",children:"RxJS"})," to provide a modern, reactive approach to handling data in the browser. With RxDB, you can store documents locally, query them in real-time, and synchronize changes with a remote server whenever an internet connection is available."]}),"\n",(0,i.jsx)(n.h3,{id:"key-features",children:"Key Features"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reactive Data Handling"}),": RxDB emits real-time updates whenever your data changes, allowing you to instantly reflect these changes in the DOM with jQuery."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Offline-First Approach"}),": Keep your application usable even when the user's network is unavailable. Data is automatically synchronized once connectivity is restored."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Data Replication"}),": Enable multi-device or multi-tab synchronization with minimal effort."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Observable Queries"}),": Reduce code complexity by subscribing to queries instead of constantly polling for changes."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Multi-Tab Support"}),": If a user opens your jQuery application in multiple tabs, RxDB keeps data in sync across all sessions."]}),"\n"]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)(o.N,{videoId:"qHWrooWyCYg",title:"This solved a problem I've had in Angular for years",duration:"3:45"})}),"\n",(0,i.jsx)(n.h2,{id:"getting-started-with-rxdb",children:"Getting Started with RxDB"}),"\n",(0,i.jsx)(n.h3,{id:"what-is-rxdb",children:"What is RxDB?"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"https://rxdb.info/",children:"RxDB"})," is a client-side NoSQL database that stores data in the browser (or ",(0,i.jsx)(n.a,{href:"/nodejs-database.html",children:"node.js"}),") and synchronizes changes with other instances or servers. Its design embraces reactive programming principles, making it well-suited for real-time applications, offline scenarios, and multi-tab use cases."]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"../files/animations/realtime.gif",alt:"real-time ui updates",width:"700"})}),"\n",(0,i.jsx)(n.h3,{id:"reactive-data-handling",children:"Reactive Data Handling"}),"\n",(0,i.jsx)(n.p,{children:"RxDB's use of observables enables an event-driven architecture where data mutations automatically trigger UI updates. In a jQuery application, you can subscribe to these changes and update DOM elements as soon as data changes occur - no need for manual refresh or complicated change detection logic."}),"\n",(0,i.jsx)(n.h3,{id:"offline-first-approach",children:"Offline-First Approach"}),"\n",(0,i.jsx)(n.p,{children:"One of RxDB's distinguishing traits is its emphasis on offline-first design. This means your jQuery application continues to function, display, and update data even when there's no network connection. When connectivity is restored, RxDB synchronizes updates with the server or other peers, ensuring consistency across all instances."}),"\n",(0,i.jsx)(n.h3,{id:"data-replication",children:"Data Replication"}),"\n",(0,i.jsxs)(n.p,{children:["RxDB supports real-time data replication with different backends. By enabling replication, you ensure that multiple clients - be they multiple ",(0,i.jsx)(n.a,{href:"/articles/browser-database.html",children:"browser"})," tabs or separate devices - stay in sync. RxDB's conflict resolution strategies help keep the data consistent even when multiple users make changes simultaneously."]}),"\n",(0,i.jsx)(n.h3,{id:"observable-queries",children:"Observable Queries"}),"\n",(0,i.jsx)(n.p,{children:"Instead of static queries, RxDB provides observable queries. Whenever data relevant to a query changes, RxDB re-emits the new result set. You can subscribe to these updates within your jQuery code and instantly reflect them in the UI."}),"\n",(0,i.jsx)(n.h3,{id:"multi-tab-support",children:"Multi-Tab Support"}),"\n",(0,i.jsx)(n.p,{children:"Running your jQuery app in multiple tabs? RxDB automatically synchronizes changes between those tabs. Users can freely switch windows without missing real-time updates."}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"../files/multiwindow.gif",alt:"multi tab support",width:"450"})}),"\n",(0,i.jsx)(n.h3,{id:"rxdb-vs-other-jquery-database-options",children:"RxDB vs. Other jQuery Database Options"}),"\n",(0,i.jsxs)(n.p,{children:["Historically, jQuery developers might use ",(0,i.jsx)(n.code,{children:"localStorage"})," or raw ",(0,i.jsx)(n.code,{children:"IndexedDB"})," for storing data. However, these solutions can require significant boilerplate, lack reactivity, and offer no built-in sync or conflict resolution. RxDB fills these gaps with an out-of-the-box solution, abstracting away low-level database complexities and providing an event-driven, offline-capable approach."]}),"\n",(0,i.jsx)(n.h2,{id:"using-rxdb-in-a-jquery-application",children:"Using RxDB in a jQuery Application"}),"\n",(0,i.jsx)(n.h3,{id:"installing-rxdb",children:"Installing RxDB"}),"\n",(0,i.jsxs)(n.p,{children:["Install RxDB (and ",(0,i.jsx)(n.code,{children:"rxjs"}),") via npm or yarn:"]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,i.jsx)(n.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string)"},children:" rxdb"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string)"},children:" rxjs"})]})})})}),"\n",(0,i.jsx)(n.p,{children:"If your project isn't set up with a build process, you can still use bundlers like Webpack or Rollup, or serve RxDB as a UMD bundle. Once included, you'll have access to RxDB globally or via import statements."}),"\n",(0,i.jsx)(n.h2,{id:"creating-and-configuring-a-database",children:"Creating and Configuring a Database"}),"\n",(0,i.jsxs)(n.p,{children:["Below is a minimal example of how to create an RxDB instance and collection. You can call this when your page initializes, then store the ",(0,i.jsx)(n.code,{children:"db"})," object for later use:"]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" initDatabase"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'heroesdb'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" password"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myPassword'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // optional encryption password"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" multiInstance"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // multi-tab support"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" eventReduce"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // optimizes event handling"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" hero"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'hero schema'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" points"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'number'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" db;"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(n.h2,{id:"updating-the-dom-with-jquery",children:"Updating the DOM with jQuery"}),"\n",(0,i.jsx)(n.p,{children:"Once you have your RxDB instance, you can query data reactively and use jQuery to manipulate the DOM:"}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// Example: Displaying heroes using jQuery"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"$"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(document)"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".ready"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" () {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" initDatabase"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Subscribing to all hero documents"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".hero"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" .find"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" .$ "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// the observable"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" .subscribe"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"((heroes) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Clear the list"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" $"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'#heroList'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".empty"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Append each hero to the DOM"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" heroes"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".forEach"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"((hero) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" $"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'#heroList'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".append"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"`"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"
  • "})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"${"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"hero"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".name"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" - Points: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"${"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"hero"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".points"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"}"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"
  • "})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" `"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Example of adding a new hero"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" $"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'#addHeroBtn'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".on"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'click'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" heroName"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" $"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'#heroName'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".val"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" heroPoints"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" parseInt"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"$"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'#heroPoints'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".val"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"hero"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" Date"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".now"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".toString"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" heroName"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" points"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" heroPoints"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(n.p,{children:["With this approach, any time data in the ",(0,i.jsx)(n.code,{children:"hero"})," collection changes - like when a new hero is added - your jQuery code re-renders the list of heroes automatically."]}),"\n",(0,i.jsx)(n.h2,{id:"different-rxstorage-layers-for-rxdb",children:"Different RxStorage layers for RxDB"}),"\n",(0,i.jsx)(n.p,{children:"RxDB supports multiple storage backends (RxStorage layers). Some popular ones:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/rx-storage-localstorage.html",children:"LocalStorage.js RxStorage"}),": Uses the browsers ",(0,i.jsx)(n.a,{href:"/articles/localstorage.html",children:"localstorage"}),". Fast and easy to set up."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB RxStorage"}),": Direct IndexedDB usage, suitable for modern browsers."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/rx-storage-opfs.html",children:"OPFS RxStorage"}),": Uses the File System Access API for better performance in supported browsers."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/rx-storage-memory.html",children:"Memory RxStorage"}),": Stores data in memory, handy for tests or ephemeral data."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/rx-storage-sqlite.html",children:"SQLite RxStorage"}),": Uses SQLite (potentially via WebAssembly). In typical browser-based scenarios, localstorage or IndexedDB storage is usually more straightforward."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"synchronizing-data-with-rxdb-between-clients-and-servers",children:"Synchronizing Data with RxDB between Clients and Servers"}),"\n",(0,i.jsx)(n.h3,{id:"offline-first-approach-1",children:"Offline-First Approach"}),"\n",(0,i.jsxs)(n.p,{children:["RxDB's ",(0,i.jsx)(n.a,{href:"/offline-first.html",children:"offline-first"})," approach allows your jQuery application to store and query data locally. Users can continue interacting, even offline. When connectivity returns, RxDB syncs to the server."]}),"\n",(0,i.jsx)(n.h3,{id:"conflict-resolution",children:"Conflict Resolution"}),"\n",(0,i.jsxs)(n.p,{children:["Should multiple clients update the same document, RxDB offers ",(0,i.jsx)(n.a,{href:"/transactions-conflicts-revisions.html",children:"conflict handling strategies"}),". You decide how to resolve conflicts - like keeping the latest edit or merging changes - ensuring data integrity across distributed systems."]}),"\n",(0,i.jsx)(n.h3,{id:"bidirectional-synchronization",children:"Bidirectional Synchronization"}),"\n",(0,i.jsx)(n.p,{children:"With RxDB, data changes flow both ways: from client to server and from server to client. This real-time synchronization ensures that all users or tabs see consistent, up-to-date data."}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"../files/database-replication.png",alt:"database replication",width:"200"})}),"\n",(0,i.jsx)(n.h2,{id:"advanced-rxdb-features-and-techniques",children:"Advanced RxDB Features and Techniques"}),"\n",(0,i.jsx)(n.h3,{id:"indexing-and-performance-optimization",children:"Indexing and Performance Optimization"}),"\n",(0,i.jsx)(n.p,{children:"Create indexes on frequently queried fields to speed up performance. For large data sets, indexing can drastically improve query times, keeping your jQuery UI snappy."}),"\n",(0,i.jsx)(n.h3,{id:"encryption-of-local-data",children:"Encryption of Local Data"}),"\n",(0,i.jsxs)(n.p,{children:["RxDB supports ",(0,i.jsx)(n.a,{href:"/encryption.html",children:"encryption to secure data stored in the browser"}),". This is crucial if your application handles sensitive user information."]}),"\n",(0,i.jsx)(n.h3,{id:"change-streams-and-event-handling",children:"Change Streams and Event Handling"}),"\n",(0,i.jsxs)(n.p,{children:["Use change streams to listen for data modifications at the database or collection level. This can trigger ",(0,i.jsx)(n.a,{href:"/articles/realtime-database.html",children:"real-time"})," ",(0,i.jsx)(n.a,{href:"/articles/optimistic-ui.html",children:"UI updates"}),", notifications, or custom logic whenever the data changes."]}),"\n",(0,i.jsx)(n.h3,{id:"json-key-compression",children:"JSON Key Compression"}),"\n",(0,i.jsxs)(n.p,{children:["If your data model has large or repetitive field names, ",(0,i.jsx)(n.a,{href:"/key-compression.html",children:"JSON key compression"})," can minimize stored document size and potentially boost performance."]}),"\n",(0,i.jsx)(n.h2,{id:"best-practices-for-using-rxdb-in-jquery-applications",children:"Best Practices for Using RxDB in jQuery Applications"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Centralize Your Database: Initialize and configure RxDB in one place. Expose the instance where needed or store it globally to avoid re-creating it on every script."}),"\n",(0,i.jsx)(n.li,{children:"Leverage Observables: Instead of polling or manually refreshing data, rely on RxDB's reactivity. Subscribe to queries and let RxDB inform you when data changes."}),"\n",(0,i.jsx)(n.li,{children:"Handle Subscriptions: If you create subscriptions in a single-page context, ensure you don't re-subscribe endlessly or create memory leaks. Clean them up if you're navigating away or removing DOM elements."}),"\n",(0,i.jsx)(n.li,{children:"Offline Testing: Thoroughly test how your jQuery app behaves without a network connection. Simulate offline states in your browser's dev tools or with flight mode to ensure the user experience remains smooth."}),"\n",(0,i.jsx)(n.li,{children:"Performance Profiling: For large data sets or frequent data updates, add indexes and carefully measure query performance. Optimize only where needed."}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,i.jsx)(n.p,{children:"To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/code/",children:"RxDB GitHub Repository"}),": Visit the official GitHub repository of RxDB to access the source code, documentation, and community support."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/quickstart.html",children:"RxDB Quickstart"}),": Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples",children:"RxDB Examples"}),": Browse official examples to see RxDB in action and learn best practices you can apply to your own project - even if jQuery isn't explicitly featured, the patterns are similar."]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453(e,n,s){s.d(n,{R:()=>o,x:()=>t});var r=s(6540);const i={},a=r.createContext(i);function o(e){const n=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/84a3af36.7a11f993.js b/docs/assets/js/84a3af36.7a11f993.js deleted file mode 100644 index a3c4501cf1d..00000000000 --- a/docs/assets/js/84a3af36.7a11f993.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[6861],{7916(e,s,a){a.r(s),a.d(s,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>t,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"articles/json-database","title":"RxDB - The JSON Database Built for JavaScript","description":"Experience a powerful JSON database with RxDB, built for JavaScript. Store, sync, and compress your data seamlessly across web and mobile apps.","source":"@site/docs/articles/json-database.md","sourceDirName":"articles","slug":"/articles/json-database.html","permalink":"/articles/json-database.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB - The JSON Database Built for JavaScript","slug":"json-database.html","description":"Experience a powerful JSON database with RxDB, built for JavaScript. Store, sync, and compress your data seamlessly across web and mobile apps."},"sidebar":"tutorialSidebar","previous":{"title":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","permalink":"/articles/ionic-storage.html"},"next":{"title":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","permalink":"/articles/websockets-sse-polling-webrtc-webtransport.html"}}');var r=a(4848),i=a(8453);const t={title:"RxDB - The JSON Database Built for JavaScript",slug:"json-database.html",description:"Experience a powerful JSON database with RxDB, built for JavaScript. Store, sync, and compress your data seamlessly across web and mobile apps."},o="RxDB - JSON Database for JavaScript",l={},c=[{value:"Why Choose a JSON Database?",id:"why-choose-a-json-database",level:2},{value:"Storage and Access Options for JSON Documents",id:"storage-and-access-options-for-json-documents",level:2},{value:"Compression Storage for JSON Documents",id:"compression-storage-for-json-documents",level:2},{value:"Schema Validation and Data Migration on Schema Changes",id:"schema-validation-and-data-migration-on-schema-changes",level:2},{value:"Store JSON with RxDB in Browser Applications",id:"store-json-with-rxdb-in-browser-applications",level:2},{value:"RxDB JSON Database Performance",id:"rxdb-json-database-performance",level:2},{value:"RxDB in Node.js",id:"rxdb-in-nodejs",level:2},{value:"RxDB to store JSON documents in React Native",id:"rxdb-to-store-json-documents-in-react-native",level:2},{value:"Using SQLite as a JSON Database",id:"using-sqlite-as-a-json-database",level:2},{value:"Follow Up",id:"follow-up",level:2}];function d(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.header,{children:(0,r.jsx)(s.h1,{id:"rxdb---json-database-for-javascript",children:"RxDB - JSON Database for JavaScript"})}),"\n",(0,r.jsxs)(s.p,{children:["Storing data as ",(0,r.jsx)(s.strong,{children:"JSON documents"})," in a ",(0,r.jsx)(s.strong,{children:"NoSQL"})," database is not just a trend; it's a practical choice. JSON data is highly compatible with various tools and is human-readable, making it an excellent fit for modern applications. JSON documents offer more flexibility compared to traditional SQL table rows, as they can contain nested data structures. This article introduces ",(0,r.jsx)(s.a,{href:"https://rxdb.info/",children:"RxDB"}),", an open-source, flexible, performant, and battle-tested NoSQL JSON database specifically designed for ",(0,r.jsx)(s.strong,{children:"JavaScript"})," applications."]}),"\n",(0,r.jsx)("center",{children:(0,r.jsx)("a",{href:"https://rxdb.info/",children:(0,r.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JSON Database",width:"220"})})}),"\n",(0,r.jsx)(s.h2,{id:"why-choose-a-json-database",children:"Why Choose a JSON Database?"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"JavaScript Friendliness"}),": JavaScript, a prevalent language for web development, naturally uses JSON for data representation. Using a JSON database aligns seamlessly with JavaScript's native data format."]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Compatibility"}),": JSON is widely supported across different programming languages and platforms. Storing data in JSON format ensures compatibility with a broad range of tools and systems. All modern programming ecosystems have packages to parse, validate and process JSON data."]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Flexibility"}),": JSON documents can accommodate complex and nested data structures, allowing developers to store data in a more intuitive and hierarchical manner compared to SQL table rows. Nested data can be just stored in-document instead of having related tables."]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Human-Readable"}),": JSON is easy to read and understand, simplifying debugging and data inspection tasks."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"storage-and-access-options-for-json-documents",children:"Storage and Access Options for JSON Documents"}),"\n",(0,r.jsx)(s.p,{children:"When incorporating JSON documents into your application, you have several storage and access options to consider:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Local In-App Database with In-Memory Storage"}),": Ideal for lightweight applications or temporary data storage, this option keeps data in memory, ensuring fast read and write operations. However, data is not persistet beyond the current application session, making it suitable for temporary data storage. With RxDB, the ",(0,r.jsx)(s.a,{href:"/rx-storage-memory.html",children:"memory RxStorage"})," can be utilized to create an in-memory database."]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Local In-App Database with Persistent Storage"}),": Suitable for applications requiring data retention across sessions. Data is stored on the user's device or inside of the Node.js application, offering persistence between application sessions. It balances speed and data retention, making it versatile for various applications. With RxDB, a whole range of persistent storages is available. As example, for browser there is the ",(0,r.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB storage"}),". For server side applications, the ",(0,r.jsx)(s.a,{href:"/rx-storage-filesystem-node.html",children:"Node.js Filesystem storage"})," can be used. There are ",(0,r.jsx)(s.a,{href:"/rx-storage.html",children:"many more storages"})," for React-Native, Flutter, Capacitors.js and others."]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Server Database Connected to the Application"}),": For applications requiring data synchronization and accessibility from multiple processes, a server-based database is the preferred choice. Data is stored on a ",(0,r.jsx)(s.strong,{children:"remote server"}),", facilitating data sharing, synchronization, and accessibility across multiple processes. It's suitable for scenarios requiring centralized data management and enhanced security and backup capabilities on the server. RxDB supports the ",(0,r.jsx)(s.a,{href:"/rx-storage-foundationdb.html",children:"FoundationDB"})," and ",(0,r.jsx)(s.a,{href:"/rx-storage-mongodb.html",children:"MongoDB"})," as a remote database server."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(s.h2,{id:"compression-storage-for-json-documents",children:"Compression Storage for JSON Documents"}),"\n",(0,r.jsxs)(s.p,{children:["Compression storage for JSON documents is made effortless with RxDB's ",(0,r.jsx)(s.a,{href:"/key-compression.html",children:"key-compression plugin"}),". This feature enables the efficient storage of compressed document data, reducing storage requirements while maintaining data integrity. Queries on compressed documents remain seamless, ensuring that your application benefits from both space-saving advantages and optimal query performance, making RxDB a compelling choice for managing JSON data efficiently. The compression happens inside of the ",(0,r.jsx)(s.a,{href:"/rx-database.html",children:"RxDatabase"})," and does not affect the API usage. The only limitation is that encrypted fields themself cannot be used inside a query."]}),"\n",(0,r.jsx)(s.h2,{id:"schema-validation-and-data-migration-on-schema-changes",children:"Schema Validation and Data Migration on Schema Changes"}),"\n",(0,r.jsxs)(s.p,{children:["Storing JSON documents inside of a database in an application, can cause a problem when the format of the data changes. Instead of having a single server where the data must be migrated, many client devices are out there that have to run a migration.\nWhen your application's schema evolves, RxDB provides ",(0,r.jsx)(s.a,{href:"/migration-schema.html",children:"migration strategies"})," to facilitate the transition, ensuring data consistency throughout schema updates."]}),"\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"JSONSchema Validation Plugins"}),": RxDB supports multiple ",(0,r.jsx)(s.a,{href:"/schema-validation.html",children:"JSONSchema validation plugins"}),", guaranteeing that only valid data is stored in the database. RxDB uses the JsonSchema standardization that you might know from other technologies like OpenAPI (aka Swagger)."]}),"\n",(0,r.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,r.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// RxDB Schema example"})}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" mySchema"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- define the primary key for your documents"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- the primary key must have set maxLength"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" done"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'boolean'"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" timestamp"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" format"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'date-time'"})]}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(s.span,{"data-line":"",children:[(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'id'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'name'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'done'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'timestamp'"}),(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,r.jsx)(s.span,{"data-line":"",children:(0,r.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,r.jsx)(s.h2,{id:"store-json-with-rxdb-in-browser-applications",children:"Store JSON with RxDB in Browser Applications"}),"\n",(0,r.jsx)(s.p,{children:"RxDB offers versatile storage solutions for browser-based applications:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Multiple Storage Plugins"}),": RxDB supports various storage backends, including ",(0,r.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB"}),", ",(0,r.jsx)(s.a,{href:"/rx-storage-localstorage.html",children:"localstorage"})," and ",(0,r.jsx)(s.a,{href:"/rx-storage-memory.html",children:"In-Memory"}),", catering to a range of browser environments."]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Observable Queries"}),": With RxDB, you can create observable ",(0,r.jsx)(s.a,{href:"/rx-query.html",children:"queries"})," that work seamlessly across multiple browser tabs, providing real-time updates and synchronization."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("p",{align:"center",children:(0,r.jsx)("img",{src:"../files/multiwindow.gif",alt:"multi tab support",width:"450"})}),"\n",(0,r.jsx)(s.h2,{id:"rxdb-json-database-performance",children:"RxDB JSON Database Performance"}),"\n",(0,r.jsx)(s.p,{children:"Certainly! Let's delve deeper into the performance aspects of RxDB when it comes to working with JSON data."}),"\n",(0,r.jsxs)(s.ol,{children:["\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Efficient Querying:"})," RxDB is engineered for rapid and efficient querying of JSON data. It employs a well-optimized indexing system that allows for lightning-fast retrieval of specific data points within your JSON documents. Whether you're fetching individual values or complex nested structures, RxDB's query performance is designed to keep your application responsive, even when dealing with large datasets."]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Scalability:"})," As your application grows and your ",(0,r.jsx)(s.a,{href:"/articles/json-based-database.html",children:"JSON dataset"})," expands, RxDB scales gracefully. Its performance remains consistent, enabling you to handle increasingly larger volumes of data without compromising on speed or responsiveness. This scalability is essential for applications that need to accommodate growing user bases and evolving data needs."]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"Reduced Latency:"})," RxDB's streamlined data access mechanisms significantly reduce latency when working with JSON data. Whether you're reading from the database, making updates, or synchronizing data between clients and servers, RxDB's optimized operations help minimize the delays often associated with data access. Observed queries are optimized with the ",(0,r.jsx)(s.a,{href:"https://github.com/pubkey/event-reduce",children:"EventReduce algorithm"})," to provide nearly-instand UI updates on data changes."]}),"\n"]}),"\n",(0,r.jsxs)(s.li,{children:["\n",(0,r.jsxs)(s.p,{children:[(0,r.jsx)(s.strong,{children:"RxStorage Layer"}),": Because RxDB allows you to swap out the storage layer. A storage with the most optimal performance can be chosen for each runtime while not touching other database code. Depending on the access patterns, you can pick exactly the storage that is best:"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)("p",{align:"center",children:(0,r.jsx)("img",{src:"../files/rx-storage-performance-browser.png",alt:"RxStorage performance - browser",width:"700"})}),"\n",(0,r.jsx)(s.h2,{id:"rxdb-in-nodejs",children:"RxDB in Node.js"}),"\n",(0,r.jsxs)(s.p,{children:["Node.js developers can also benefit from RxDB's capabilities. By integrating RxDB into your Node.js applications, you can harness the power of a NoSQL JSON db to efficiently manage your data on the server-side. RxDB's flexibility, performance, and essential features are equally valuable in server-side development. ",(0,r.jsx)(s.a,{href:"/nodejs-database.html",children:"Read more about RxDB+Node.js"}),"."]}),"\n",(0,r.jsx)(s.h2,{id:"rxdb-to-store-json-documents-in-react-native",children:"RxDB to store JSON documents in React Native"}),"\n",(0,r.jsxs)(s.p,{children:["For mobile app developers working with React Native, RxDB offers a convenient solution for handling JSON data. Whether you're building Android or iOS applications, RxDB's compatibility with JavaScript and its ability to work with JSON documents make it a natural choice for data management within your React Native apps. ",(0,r.jsx)(s.a,{href:"/react-native-database.html",children:"Read more about RxDB+React-Native"}),"."]}),"\n",(0,r.jsx)(s.h2,{id:"using-sqlite-as-a-json-database",children:"Using SQLite as a JSON Database"}),"\n",(0,r.jsxs)(s.p,{children:["In some cases, you might want to use SQLite as a backend storage solution for your JSON data. RxDB can be configured ",(0,r.jsx)(s.a,{href:"/rx-storage-sqlite.html",children:"to work with SQLite"}),", providing the benefits of both a relational database system and JSON document storage. This hybrid approach can be advantageous when dealing with complex data relationships while retaining the flexibility of JSON data representation."]}),"\n",(0,r.jsx)(s.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,r.jsx)(s.p,{children:"To further explore RxDB and get started with using it in your frontend applications, consider the following resources:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.a,{href:"/quickstart.html",children:"RxDB Quickstart"}),": A step-by-step guide to quickly set up RxDB in your project and start leveraging its features."]}),"\n",(0,r.jsxs)(s.li,{children:[(0,r.jsx)(s.a,{href:"https://github.com/pubkey/rxdb",children:"RxDB GitHub Repository"}),": The official repository for RxDB, where you can find the code, examples, and community support."]}),"\n"]}),"\n",(0,r.jsxs)(s.p,{children:["By embracing ",(0,r.jsx)(s.a,{href:"https://rxdb.info/",children:"RxDB"})," as your ",(0,r.jsx)(s.strong,{children:"JSON database"})," solution, you can tap into the extensive capabilities of JSON data storage. This empowers your applications with offline accessibility, caching, enhanced performance, and effortless data synchronization. RxDB's focus on JavaScript and its robust feature set render it the perfect selection for frontend developers in pursuit of efficient and scalable data storage solutions."]})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453(e,s,a){a.d(s,{R:()=>t,x:()=>o});var n=a(6540);const r={},i=n.createContext(r);function t(e){const s=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),n.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/84ae55a4.1bdc94ff.js b/docs/assets/js/84ae55a4.1bdc94ff.js deleted file mode 100644 index f843e1fba3b..00000000000 --- a/docs/assets/js/84ae55a4.1bdc94ff.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[588],{3247(e,n,s){s.d(n,{g:()=>r});var i=s(4848);function r(e){const n=[];let s=null;return e.children.forEach(e=>{e.props.id?(s&&n.push(s),s={headline:e,paragraphs:[]}):s&&s.paragraphs.push(e)}),s&&n.push(s),(0,i.jsx)("div",{style:t.stepsContainer,children:n.map((e,n)=>(0,i.jsxs)("div",{style:t.stepWrapper,children:[(0,i.jsxs)("div",{style:t.stepIndicator,children:[(0,i.jsx)("div",{style:t.stepNumber,children:n+1}),(0,i.jsx)("div",{style:t.verticalLine})]}),(0,i.jsxs)("div",{style:t.stepContent,children:[(0,i.jsx)("div",{children:e.headline}),e.paragraphs.map((e,n)=>(0,i.jsx)("div",{style:t.item,children:e},n))]})]},n))})}const t={stepsContainer:{display:"flex",flexDirection:"column"},stepWrapper:{display:"flex",alignItems:"stretch",marginBottom:"1.5rem",position:"relative",minWidth:0},stepIndicator:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",width:"33px",marginRight:"1rem",minWidth:0},stepNumber:{width:"33px",height:"33px",borderRadius:"50%",backgroundColor:"var(--color-top)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:"bold",marginTop:-4},verticalLine:{position:"absolute",top:29,bottom:"0",left:"50%",width:"1px",background:"linear-gradient(to bottom, var(--color-top) 0%, var(--color-top) 80%, rgba(0,0,0,0) 100%)",transform:"translateX(-50%)"},stepContent:{flex:1,minWidth:0,overflowWrap:"break-word"},item:{marginTop:"0.5rem"}}},7465(e,n,s){s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>l,metadata:()=>i,toc:()=>d});const i=JSON.parse('{"id":"replication-nats","title":"RxDB & NATS - Realtime Sync","description":"Seamlessly sync your RxDB data with NATS for real-time, two-way replication. Handle conflicts, errors, and retries with ease.","source":"@site/docs/replication-nats.md","sourceDirName":".","slug":"/replication-nats.html","permalink":"/replication-nats.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB & NATS - Realtime Sync","slug":"replication-nats.html","description":"Seamlessly sync your RxDB data with NATS for real-time, two-way replication. Handle conflicts, errors, and retries with ease."},"sidebar":"tutorialSidebar","previous":{"title":"Supabase Replication","permalink":"/replication-supabase.html"},"next":{"title":"Appwrite Replication","permalink":"/replication-appwrite.html"}}');var r=s(4848),t=s(8453),a=s(3247);const l={title:"RxDB & NATS - Realtime Sync",slug:"replication-nats.html",description:"Seamlessly sync your RxDB data with NATS for real-time, two-way replication. Handle conflicts, errors, and retries with ease."},o="Replication with NATS",c={},d=[{value:"Precondition",id:"precondition",level:2},{value:"Usage",id:"usage",level:2},{value:"Install the nats package",id:"install-the-nats-package",level:3},{value:"Start the Replication",id:"start-the-replication",level:3},{value:"Handling deletes",id:"handling-deletes",level:2}];function h(e){const n={a:"a",code:"code",em:"em",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",span:"span",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.header,{children:(0,r.jsx)(n.h1,{id:"replication-with-nats",children:"Replication with NATS"})}),"\n",(0,r.jsxs)(n.p,{children:["With this RxDB plugin you can run a two-way realtime replication with a ",(0,r.jsx)(n.a,{href:"https://nats.io/",children:"NATS"})," server."]}),"\n",(0,r.jsxs)(n.p,{children:["The replication itself uses the ",(0,r.jsx)(n.a,{href:"/replication.html",children:"RxDB Sync Engine"})," which handles conflicts, errors and retries.\nOn the client side the official ",(0,r.jsx)(n.a,{href:"https://www.npmjs.com/package/nats",children:"NATS npm package"})," is used to connect to the NATS server."]}),"\n",(0,r.jsx)(n.p,{children:"NATS is a messaging system that by itself does not have a validation or granulary access control build in.\nTherefore it is not recommended to directly replicate the NATS server with an untrusted RxDB client application. Instead you should replicated from NATS to your Node.js server side RxDB database."}),"\n",(0,r.jsx)(n.h2,{id:"precondition",children:"Precondition"}),"\n",(0,r.jsxs)(n.p,{children:["For the replication endpoint the NATS cluster must have enabled ",(0,r.jsx)(n.a,{href:"https://docs.nats.io/nats-concepts/jetstream",children:"JetStream"})," and store all message data as ",(0,r.jsx)(n.a,{href:"https://docs.nats.io/using-nats/developer/sending/structure",children:"structured JSON"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"The easiest way to start a compatible NATS server is to use the official docker image:"}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"docker run --rm --name rxdb-nats -p 4222:4222 nats:2.9.17 -js"})}),"\n",(0,r.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,r.jsxs)(a.g,{children:[(0,r.jsx)(n.h3,{id:"install-the-nats-package",children:"Install the nats package"}),(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,r.jsx)(n.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string)"},children:" nats"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string)"},children:" --save"})]})})})}),(0,r.jsx)(n.h3,{id:"start-the-replication",children:"Start the Replication"}),(0,r.jsxs)(n.p,{children:["To start the replication, import the ",(0,r.jsx)(n.code,{children:"replicateNats()"})," method from the RxDB plugin and call it with the collection\nthat must be replicated.\nThe replication runs ",(0,r.jsx)(n.em,{children:"per RxCollection"}),", you can replicate multiple RxCollections by starting a new replication for each of them."]}),(0,r.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,r.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,r.jsxs)(n.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:[(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" replicateNats"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication-nats'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateNats"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myRxCollection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" replicationIdentifier"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-nats-replication-collection-A'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // in NATS, each stream need a name"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" streamName"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'stream-for-replication-A'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * The subject prefix determines how the documents are stored in NATS."})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * For example the document with id 'alice'"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * will have the subject 'foobar.alice'"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" subjectPrefix"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foobar'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" connection"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { servers"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'localhost:4222'"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" live"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 30"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,r.jsxs)(n.span,{"data-line":"",children:[(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,r.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 30"})]}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,r.jsx)(n.span,{"data-line":"",children:(0,r.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})})]}),"\n",(0,r.jsx)(n.h2,{id:"handling-deletes",children:"Handling deletes"}),"\n",(0,r.jsxs)(n.p,{children:["RxDB requires you to never ",(0,r.jsx)(n.a,{href:"/replication.html#data-layout-on-the-server",children:"fully delete documents"}),". This is needed to be able to replicate the deletion state of a document to other instances. The NATS replication will set a boolean ",(0,r.jsx)(n.code,{children:"_deleted"})," field to all documents to indicate the deletion state. You can change this by setting a different ",(0,r.jsx)(n.code,{children:"deletedField"})," in the sync options."]})]})}function p(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453(e,n,s){s.d(n,{R:()=>a,x:()=>l});var i=s(6540);const r={},t=i.createContext(r);function a(e){const n=i.useContext(t);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/85caacef.9966ef6e.js b/docs/assets/js/85caacef.9966ef6e.js deleted file mode 100644 index 2cc3798eb49..00000000000 --- a/docs/assets/js/85caacef.9966ef6e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[3015],{8496(e,a,s){s.r(a),s.d(a,{default:()=>l});var t=s(544),i=s(4848);function l(){return(0,t.default)({sem:{id:"gads",metaTitle:"The local Database for Expo",appName:"Expo",title:(0,i.jsxs)(i.Fragment,{children:["The easiest way to ",(0,i.jsx)("b",{children:"store"})," and ",(0,i.jsx)("b",{children:"sync"})," Data in Expo"]}),iconUrl:"/files/icons/expo_white.svg"}})}}}]); \ No newline at end of file diff --git a/docs/assets/js/86b4e356.9be07523.js b/docs/assets/js/86b4e356.9be07523.js deleted file mode 100644 index c656c352235..00000000000 --- a/docs/assets/js/86b4e356.9be07523.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[2786],{2344(s,n,e){e.r(n),e.d(n,{assets:()=>t,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"orm","title":"ORM","description":"Like mongoose, RxDB has ORM-capabilities which can be used to add specific behavior to documents and collections.","source":"@site/docs/orm.md","sourceDirName":".","slug":"/orm.html","permalink":"/orm.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"ORM","slug":"orm.html"},"sidebar":"tutorialSidebar","previous":{"title":"Population","permalink":"/population.html"},"next":{"title":"Fulltext Search \ud83d\udc51","permalink":"/fulltext-search.html"}}');var o=e(4848),i=e(8453);const a={title:"ORM",slug:"orm.html"},l="Object-Data-Relational-Mapping",t={},c=[{value:"statics",id:"statics",level:2},{value:"Add statics to a collection",id:"add-statics-to-a-collection",level:3},{value:"instance-methods",id:"instance-methods",level:2},{value:"Add instance-methods to a collection",id:"add-instance-methods-to-a-collection",level:3},{value:"attachment-methods",id:"attachment-methods",level:2}];function d(s){const n={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",p:"p",pre:"pre",span:"span",...(0,i.R)(),...s.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"object-data-relational-mapping",children:"Object-Data-Relational-Mapping"})}),"\n",(0,o.jsxs)(n.p,{children:["Like ",(0,o.jsx)(n.a,{href:"http://mongoosejs.com/docs/guide.html#methods",children:"mongoose"}),", RxDB has ORM-capabilities which can be used to add specific behavior to documents and collections."]}),"\n",(0,o.jsx)(n.h2,{id:"statics",children:"statics"}),"\n",(0,o.jsx)(n.p,{children:"Statics are defined collection-wide and can be called on the collection."}),"\n",(0,o.jsx)(n.h3,{id:"add-statics-to-a-collection",children:"Add statics to a collection"}),"\n",(0,o.jsxs)(n.p,{children:["To add static functions, pass a ",(0,o.jsx)(n.code,{children:"statics"}),"-object when you create your collection. The object contains functions, mapped to their function-names."]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" heroes"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" heroes"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" mySchema"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" statics"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" scream"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(){"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'AAAH!!'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".scream"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"());"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// 'AAAH!!'"})})]})})}),"\n",(0,o.jsx)(n.p,{children:"You can also use the this-keyword which resolves to the collection:"}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" heroes"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" heroes"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" mySchema"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" statics"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" whoAmI"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(){"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" this"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".name;"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".whoAmI"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"());"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// 'heroes'"})})]})})}),"\n",(0,o.jsx)(n.h2,{id:"instance-methods",children:"instance-methods"}),"\n",(0,o.jsx)(n.p,{children:"Instance-methods are defined collection-wide. They can be called on the RxDocuments of the collection."}),"\n",(0,o.jsx)(n.h3,{id:"add-instance-methods-to-a-collection",children:"Add instance-methods to a collection"}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" heroes"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" heroes"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" mySchema"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" methods"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" scream"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(){"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'AAAH!!'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" heroes"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"doc"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".scream"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"());"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// 'AAAH!!'"})})]})})}),"\n",(0,o.jsx)(n.p,{children:"Here you can also use the this-keyword:"}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" heroes"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" heroes"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" mySchema"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" methods"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" whoAmI"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(){"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'I am '"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" this"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".name "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"+"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '!!'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" heroes"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Skeletor'"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" heroes"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"doc"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".whoAmI"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"());"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// 'I am Skeletor!!'"})})]})})}),"\n",(0,o.jsx)(n.h2,{id:"attachment-methods",children:"attachment-methods"}),"\n",(0,o.jsx)(n.p,{children:"Attachment-methods are defined collection-wide. They can be called on the RxAttachments of the RxDocuments of the collection."}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" heroes"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" heroes"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" mySchema"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" attachments"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" scream"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(){"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'AAAH!!'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" heroes"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" attachment"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".putAttachment"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'cat.txt'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" data"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'meow I am a kitty'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'text/plain'"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"attachment"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".scream"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"());"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// 'AAAH!!'"})})]})})})]})}function h(s={}){const{wrapper:n}={...(0,i.R)(),...s.components};return n?(0,o.jsx)(n,{...s,children:(0,o.jsx)(d,{...s})}):d(s)}},8453(s,n,e){e.d(n,{R:()=>a,x:()=>l});var r=e(6540);const o={},i=r.createContext(o);function a(s){const n=r.useContext(i);return r.useMemo(function(){return"function"==typeof s?s(n):{...n,...s}},[n,s])}function l(s){let n;return n=s.disableParentContext?"function"==typeof s.components?s.components(o):s.components||o:a(s.components),r.createElement(i.Provider,{value:n},s.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/8a22f3a9.87a88033.js b/docs/assets/js/8a22f3a9.87a88033.js deleted file mode 100644 index b170d949723..00000000000 --- a/docs/assets/js/8a22f3a9.87a88033.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9257],{2159(e,t,a){a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>h,default:()=>b,frontMatter:()=>d,metadata:()=>n,toc:()=>m});const n=JSON.parse('{"id":"errors","title":"Error Messages","description":"Learn how RxDB throws RxErrors with codes and parameters. Keep builds lean, yet unveil full messages in development via the DevMode plugin.","source":"@site/docs/errors.md","sourceDirName":".","slug":"/errors.html","permalink":"/errors.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Error Messages","slug":"errors.html","description":"Learn how RxDB throws RxErrors with codes and parameters. Keep builds lean, yet unveil full messages in development via the DevMode plugin."},"sidebar":"tutorialSidebar","previous":{"title":"Creating Plugins","permalink":"/plugins.html"},"next":{"title":"Schema Migration","permalink":"/migration-schema.html"}}');var o=a(4848),s=a(8453);const i={UT1:"given name is no string or empty",UT2:"collection- and database-names must match the regex to be compatible with couchdb databases.\n See https://neighbourhood.ie/blog/2020/10/13/everything-you-need-to-know-about-couchdb-database-names/\n info: if your database-name specifies a folder, the name must contain the slash-char '/' or '\\'",UT3:"replication-direction must either be push or pull or both. But not none",UT4:"given leveldown is no valid adapter",UT5:"keyCompression is set to true in the schema but no key-compression handler is used in the storage",UT6:"schema contains encrypted fields but no encryption handler is used in the storage",UT7:"attachments.compression is enabled but no attachment-compression plugin is used",UT8:"crypto.subtle.digest is not available in your runtime. For expo/react-native see https://discord.com/channels/969553741705539624/1341392686267109458/1343639513850843217 ",PL1:"Given plugin is not RxDB plugin.",PL3:"A plugin with the same name was already added but it was not the exact same JavaScript object",P2:"bulkWrite() cannot be called with an empty array",QU1:"RxQuery._execOverDatabase(): op not known",QU4:"RxQuery.regex(): You cannot use .regex() on the primary field",QU5:"RxQuery.sort(): does not work because key is not defined in the schema",QU6:"RxQuery.limit(): cannot be called on .findOne()",QU9:"throwIfMissing can only be used in findOne queries",QU10:"result empty and throwIfMissing: true",QU11:"RxQuery: no valid query params given",QU12:"Given index is not in schema",QU13:"A top level field of the query is not included in the schema",QU14:"Running a count() query in slow mode is now allowed. Either run a count() query with a selector that fully matches an index or set allowSlowCount=true when calling the createRxDatabase",QU15:"For count queries it is not allowed to use skip or limit",QU16:"$regex queries must be defined by a string, not an RegExp instance. This is because RegExp objects cannot be JSON stringified and also they are mutable which would be dangerous",QU17:"Chained queries cannot be used on findByIds() RxQuery instances",QU18:"Malformed query result data. This likely happens because you create a OPFS-storage RxDatabase inside of a worker but did not set the usesRxDatabaseInWorker setting. https://rxdb.info/rx-storage-opfs.html?console=opfs#setting-usesrxdatabaseinworker-when-a-rxdatabase-is-also-used-inside-of-the-worker ",QU19:"Queries must not contain fields or properties with the value `undefined`: https://github.com/pubkey/rxdb/issues/6792#issuecomment-2624555824 ",MQ1:"path must be a string or object",MQ2:"Invalid argument",MQ3:"Invalid sort() argument. Must be a string, object, or array",MQ4:"Invalid argument. Expected instanceof mquery or plain object",MQ5:"method must be used after where() when called with these arguments",MQ6:"Can't mix sort syntaxes. Use either array or object | .sort([['field', 1], ['test', -1]]) | .sort({ field: 1, test: -1 })",MQ7:"Invalid sort value",MQ8:"Can't mix sort syntaxes. Use either array or object",DB1:"RxDocument.prepare(): another instance on this adapter has a different password",DB2:"RxDatabase.addCollections(): collection-names cannot start with underscore _",DB3:"RxDatabase.addCollections(): collection already exists. use myDatabase[collectionName] to get it",DB4:"RxDatabase.addCollections(): schema is missing",DB5:"RxDatabase.addCollections(): collection-name not allowed",DB6:"RxDatabase.addCollections(): another instance created this collection with a different schema. Read thishttps://rxdb.info/rx-schema.html?console=qa#faq ",DB8:'createRxDatabase(): A RxDatabase with the same name and adapter already exists.\nMake sure to use this combination of storage+databaseName only once\nIf you have the duplicate database on purpose to simulate multi-tab behavior in unit tests, set "ignoreDuplicate: true".\nAs alternative you can set "closeDuplicates: true" like if this happens in your react projects with hot reload that reloads the code without reloading the process.',DB9:"ignoreDuplicate is only allowed in dev-mode and must never be used in production",DB11:"createRxDatabase(): Invalid db-name, folder-paths must not have an ending slash",DB12:"RxDatabase.addCollections(): could not write to internal store",DB13:"createRxDatabase(): Invalid db-name or collection name, name contains the dollar sign",DB14:"no custom reactivity factory added on database creation",COL1:"RxDocument.insert() You cannot insert an existing document",COL2:"RxCollection.insert() fieldName ._id can only be used as primaryKey",COL3:"RxCollection.upsert() does not work without primary",COL4:"RxCollection.incrementalUpsert() does not work without primary",COL5:"RxCollection.find() if you want to search by _id, use .findOne(_id)",COL6:"RxCollection.findOne() needs a queryObject or string. Notice that in RxDB, primary keys must be strings and cannot be numbers.",COL7:"hook must be a function",COL8:"hooks-when not known",COL9:"RxCollection.addHook() hook-name not known",COL10:"RxCollection .postCreate-hooks cannot be async",COL11:"migrationStrategies must be an object",COL12:"A migrationStrategy is missing or too much",COL13:"migrationStrategy must be a function",COL14:"given static method-name is not a string",COL15:"static method-names cannot start with underscore _",COL16:"given static method is not a function",COL17:"RxCollection.ORM: statics-name not allowed",COL18:"collection-method not allowed because fieldname is in the schema",COL20:"Storage write error",COL21:"The RxCollection is closed or removed already, either from this JavaScript realm or from another, like a browser tab",CONFLICT:"Document update conflict. When changing a document you must work on the previous revision",COL22:".bulkInsert() and .bulkUpsert() cannot be run with multiple documents that have the same primary key",COL23:"In the open-source version of RxDB, the amount of collections that can exist in parallel is limited to 16. If you already purchased the premium access, you can remove this limit: https://rxdb.info/rx-collection.html?console=limit#faq",DOC1:"RxDocument.get$ cannot get observable of in-array fields because order cannot be guessed",DOC2:"cannot observe primary path",DOC3:"final fields cannot be observed",DOC4:"RxDocument.get$ cannot observe a non-existed field",DOC5:"RxDocument.populate() cannot populate a non-existed field",DOC6:"RxDocument.populate() cannot populate because path has no ref",DOC7:"RxDocument.populate() ref-collection not in database",DOC8:"RxDocument.set(): primary-key cannot be modified",DOC9:"final fields cannot be modified",DOC10:"RxDocument.set(): cannot set childpath when rootPath not selected",DOC11:"RxDocument.save(): can't save deleted document",DOC13:"RxDocument.remove(): Document is already deleted",DOC14:"RxDocument.close() does not exist",DOC15:"query cannot be an array",DOC16:"Since version 8.0.0 RxDocument.set() can only be called on temporary RxDocuments",DOC17:"Since version 8.0.0 RxDocument.save() can only be called on non-temporary documents",DOC18:"Document property for composed primary key is missing",DOC19:"Value of primary key(s) cannot be changed",DOC20:"PrimaryKey missing",DOC21:"PrimaryKey must be equal to PrimaryKey.trim(). It cannot start or end with a whitespace",DOC22:"PrimaryKey must not contain a linebreak",DOC23:'PrimaryKey must not contain a double-quote ["]',DOC24:"Given document data could not be structured cloned. This happens if you pass non-plain-json data into it, like a Date() object or a Function. In vue.js this happens if you use ref() on the document data which transforms it into a Proxy object.",DM1:"migrate() Migration has already run",DM2:"migration of document failed final document does not match final schema",DM3:"migration already running",DM4:"Migration errored",DM5:"Cannot open database state with newer RxDB version. You have to migrate your database state first. See https://rxdb.info/migration-storage.html?console=storage ",AT1:"to use attachments, please define this in your schema",EN1:"password is not valid",EN2:"validatePassword: min-length of password not complied",EN3:"Schema contains encrypted properties but no password is given",EN4:"Password not valid",JD1:"You must create the collections before you can import their data",JD2:"RxCollection.importJSON(): the imported json relies on a different schema",JD3:"RxCollection.importJSON(): json.passwordHash does not match the own",LD1:"RxDocument.allAttachments$ can't use attachments on local documents",LD2:"RxDocument.get(): objPath must be a string",LD3:"RxDocument.get$ cannot get observable of in-array fields because order cannot be guessed",LD4:"cannot observe primary path",LD5:"RxDocument.set() id cannot be modified",LD6:"LocalDocument: Function is not usable on local documents",LD7:"Local document already exists",LD8:"localDocuments not activated. Set localDocuments=true on creation, when you want to store local documents on the RxDatabase or RxCollection.",RC1:"Replication: already added",RC2:"replicateCouchDB() query must be from the same RxCollection",RC4:"RxCouchDBReplicationState.awaitInitialReplication() cannot await initial replication when live: true",RC5:"RxCouchDBReplicationState.awaitInitialReplication() cannot await initial replication if multiInstance because the replication might run on another instance",RC6:"syncFirestore() serverTimestampField MUST NOT be part of the collections schema and MUST NOT be nested.",RC7:"SimplePeer requires to have process.nextTick() polyfilled, see https://rxdb.info/replication-webrtc.html?console=webrtc ",RC_PULL:"RxReplication pull handler threw an error - see .errors for more details",RC_STREAM:"RxReplication pull stream$ threw an error - see .errors for more details",RC_PUSH:"RxReplication push handler threw an error - see .errors for more details",RC_PUSH_NO_AR:"RxReplication push handler did not return an array with the conflicts",RC_WEBRTC_PEER:"RxReplication WebRTC Peer has error",RC_COUCHDB_1:"replicateCouchDB() url must end with a slash like 'https://example.com/mydatabase/'",RC_COUCHDB_2:"replicateCouchDB() did not get valid result with rows.",RC_OUTDATED:"Outdated client, update required. Replication was canceled",RC_UNAUTHORIZED:"Unauthorized client, update the replicationState.headers to set correct auth data",RC_FORBIDDEN:"Client behaves wrong so the replication was canceled. Mostly happens if the client tries to write data that it is not allowed to",SC1:"fieldnames do not match the regex",SC2:"SchemaCheck: name 'item' reserved for array-fields",SC3:"SchemaCheck: fieldname has a ref-array but items-type is not string",SC4:"SchemaCheck: fieldname has a ref but is not type string, [string,null] or array",SC6:"SchemaCheck: primary can only be defined at top-level",SC7:"SchemaCheck: default-values can only be defined at top-level",SC8:"SchemaCheck: first level-fields cannot start with underscore _",SC10:"SchemaCheck: schema defines ._rev, this will be done automatically",SC11:"SchemaCheck: schema needs a number >=0 as version",SC13:"SchemaCheck: primary is always index, do not declare it as index",SC14:"SchemaCheck: primary is always unique, do not declare it as index",SC15:"SchemaCheck: primary cannot be encrypted",SC16:"SchemaCheck: primary must have type: string",SC17:"SchemaCheck: top-level fieldname is not allowed. See https://rxdb.info/rx-schema.html?console=toplevel#non-allowed-properties ",SC18:"SchemaCheck: indexes must be an array",SC19:"SchemaCheck: indexes must contain strings or arrays of strings",SC20:"SchemaCheck: indexes.array must contain strings",SC21:"SchemaCheck: given index is not defined in schema",SC22:"SchemaCheck: given indexKey is not type:string",SC23:"SchemaCheck: fieldname is not allowed",SC24:"SchemaCheck: required fields must be set via array. See https://spacetelescope.github.io/understanding-json-schema/reference/object.html#required",SC25:"SchemaCheck: compoundIndexes needs to be specified in the indexes field",SC26:"SchemaCheck: indexes needs to be specified at collection schema level",SC28:"SchemaCheck: encrypted fields is not defined in the schema",SC29:"SchemaCheck: missing object key 'properties'",SC30:"SchemaCheck: primaryKey is required",SC32:"SchemaCheck: primary field must have the type string/number/integer",SC33:"SchemaCheck: used primary key is not a property in the schema",SC34:"Fields of type string that are used in an index, must have set the maxLength attribute in the schema",SC35:"Fields of type number/integer that are used in an index, must have set the multipleOf attribute in the schema",SC36:"A field of this type cannot be used as index",SC37:"Fields of type number that are used in an index, must have set the minimum and maximum attribute in the schema",SC38:"Fields of type boolean that are used in an index, must be required in the schema",SC39:"The primary key must have the maxLength attribute set. Ensure you use the dev-mode plugin when developing with RxDB.",SC40:"$ref fields in the schema are not allowed. RxDB cannot resolve related schemas because it would have a negative performance impact.It would have to run http requests on runtime. $ref fields should be resolved during build time.",SC41:"minimum, maximum and maxLength values for indexes must be real numbers, not Infinity or -Infinity",SC42:"Primary key and also indexed fields which are strings, must have a maxLength that is <= 2048. Notice that having a big maxLength can negatively affect the performance. Only set it as big as it has to be.",DVM1:"When dev-mode is enabled, your storage must use one of the schema validators at the top level. This is because most problems people have with RxDB is because they store data that is not valid to the schema which causes strange bugs and problems.",VD1:"Sub-schema not found, does the schemaPath exists in your schema?",VD2:"object does not match schema",S1:"You cannot create collections after calling RxDatabase.server()",GQL1:"GraphQL replication: cannot find sub schema by key",GQL3:"GraphQL replication: pull returns more documents then batchSize",CRDT1:"CRDT operations cannot be used because the crdt options are not set in the schema.",CRDT2:"RxDocument.incrementalModify() cannot be used when CRDTs are activated.",CRDT3:"To use CRDTs you MUST NOT set a conflictHandler because the default CRDT conflict handler must be used",DXE1:"non-required index fields are not possible with the dexie.js RxStorage: https://github.com/pubkey/rxdb/pull/6643#issuecomment-2505310082",SQL1:"The trial version of the SQLite storage does not support attachments.",SQL2:"The trial version of the SQLite storage is limited to contain 300 documents",SQL3:"The trial version of the SQLite storage is limited to running 500 operations",RM1:"Cannot communicate with a remote that was build on a different RxDB version. Did you forget to rebuild your workers when updating RxDB?",MG1:"If _id is used as primaryKey, all documents in the MongoDB instance must have a string-value as _id, not an ObjectId or number",R1:"You must provide a valid RxDatabase to the the RxDatabaseProvider",R2:"Could not find database in context, please ensure the component is wrapped in a ",R3:"The provided value for the collection parameter is not a valid RxCollection",SNH:"This should never happen"};var r=a(6347);const c=Object.entries(i);function l(){const e=(0,r.zy)();console.dir(i);const t={"":{boxSizing:"border-box"},ul:{listStyleType:"none"},li:{borderStyle:"solid",borderWidth:1,height:"auto",borderColor:"var(--color-top)",padding:32,borderRadius:14,backgroundColor:"var(--bg-color-dark)",justifyContent:"space-between",gap:48,margin:10,marginBottom:20},liHighlight:{boxShadow:"2px 2px 13px var(--color-top), -2px -1px 14px var(--color-top)"},errorCode:{fontSize:"1.3em",lineHeight:"130%",margin:"0 0 8px"},innerUl:{marginTop:14}};return(0,o.jsx)("ul",{style:t.ul,children:c.map(([a,n])=>{return(0,o.jsxs)("li",{id:a,style:e.hash==="#"+a?{...t.li,...t.liHighlight}:t.li,children:[(0,o.jsxs)("h6",{style:t.errorCode,children:["Code: ",(0,o.jsx)("a",{href:"#"+a,children:a})]}),(s=n,(s+="").charAt(0).toUpperCase()+s.substr(1)),(0,o.jsxs)("ul",{style:t.innerUl,children:[(0,o.jsx)("li",{children:(0,o.jsx)("a",{href:"https://github.com/pubkey/rxdb/search?q="+a+"&type=code",target:"_blank",children:"Search In Code"})}),(0,o.jsx)("li",{children:(0,o.jsx)("a",{href:"https://github.com/pubkey/rxdb/search?q="+a+"&type=issues",target:"_blank",children:"Search In Issues"})}),(0,o.jsx)("li",{children:(0,o.jsx)("a",{href:"/chat/",target:"_blank",children:"Search In Chat"})})]})]},a);var s})})}const d={title:"Error Messages",slug:"errors.html",description:"Learn how RxDB throws RxErrors with codes and parameters. Keep builds lean, yet unveil full messages in development via the DevMode plugin."},h="RxDB Error Messages",u={},m=[{value:"All RxDB error messages",id:"all-rxdb-error-messages",level:2}];function p(e){const t={a:"a",code:"code",h1:"h1",h2:"h2",header:"header",p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.header,{children:(0,o.jsx)(t.h1,{id:"rxdb-error-messages",children:"RxDB Error Messages"})}),"\n",(0,o.jsxs)(t.p,{children:["When RxDB has an error, an ",(0,o.jsx)(t.code,{children:"RxError"})," object is thrown instead of a normal JavaScript ",(0,o.jsx)(t.code,{children:"Error"}),". This ",(0,o.jsx)(t.code,{children:"RxError"})," contains additional properties such as a ",(0,o.jsx)(t.code,{children:"code"})," field and ",(0,o.jsx)(t.code,{children:"parameters"}),". By default the full human readable error messages are not included into the RxDB build. This is because error messages have a high entropy and cannot be compressed well. Therefore only an error message with the correct error-code and parameters is thrown but without the full text.\nWhen you enable the ",(0,o.jsx)(t.a,{href:"/dev-mode.html",children:"DevMode Plugin"})," the full error messages are added to the ",(0,o.jsx)(t.code,{children:"RxError"}),". This should only be done in development, not in production builds to keep a small build size."]}),"\n",(0,o.jsx)(t.h2,{id:"all-rxdb-error-messages",children:"All RxDB error messages"}),"\n","\n",(0,o.jsx)(l,{})]})}function b(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},8453(e,t,a){a.d(t,{R:()=>i,x:()=>r});var n=a(6540);const o={},s=n.createContext(o);function i(e){const t=n.useContext(s);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/8a442806.cda40cae.js b/docs/assets/js/8a442806.cda40cae.js deleted file mode 100644 index beb8306683e..00000000000 --- a/docs/assets/js/8a442806.cda40cae.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[1054],{8453(e,n,s){s.d(n,{R:()=>a,x:()=>l});var r=s(6540);const i={},t=r.createContext(i);function a(e){const n=r.useContext(t);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(t.Provider,{value:n},e.children)}},9770(e,n,s){s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"fulltext-search","title":"Fulltext Search \ud83d\udc51","description":"Master local fulltext search with RxDB\'s FlexSearch plugin. Enjoy real-time indexing, efficient queries, and offline-first support made easy.","source":"@site/docs/fulltext-search.md","sourceDirName":".","slug":"/fulltext-search.html","permalink":"/fulltext-search.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Fulltext Search \ud83d\udc51","slug":"fulltext-search.html","description":"Master local fulltext search with RxDB\'s FlexSearch plugin. Enjoy real-time indexing, efficient queries, and offline-first support made easy."},"sidebar":"tutorialSidebar","previous":{"title":"ORM","permalink":"/orm.html"},"next":{"title":"Vector Database","permalink":"/articles/javascript-vector-database.html"}}');var i=s(4848),t=s(8453);const a={title:"Fulltext Search \ud83d\udc51",slug:"fulltext-search.html",description:"Master local fulltext search with RxDB's FlexSearch plugin. Enjoy real-time indexing, efficient queries, and offline-first support made easy."},l="Fulltext Search",o={},c=[{value:"Benefits of using a local fulltext search",id:"benefits-of-using-a-local-fulltext-search",level:2},{value:"Using the RxDB Fulltext Search",id:"using-the-rxdb-fulltext-search",level:2}];function h(e){const n={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"fulltext-search",children:"Fulltext Search"})}),"\n",(0,i.jsxs)(n.p,{children:["To run fulltext search queries on the local data, RxDB has a fulltext search plugin based on ",(0,i.jsx)(n.a,{href:"https://github.com/nextapps-de/flexsearch",children:"flexsearch"})," and ",(0,i.jsx)(n.a,{href:"/rx-pipeline.html",children:"RxPipeline"}),". On each write to a given source ",(0,i.jsx)(n.a,{href:"/rx-collection.html",children:"RxCollection"}),", an indexer is running to map the written document data into a fulltext search index.\nThe index can then be queried efficiently with complex fulltext search operations."]}),"\n",(0,i.jsx)(n.h2,{id:"benefits-of-using-a-local-fulltext-search",children:"Benefits of using a local fulltext search"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Efficient Search and Indexing"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["The plugin utilizes the ",(0,i.jsx)(n.a,{href:"https://github.com/nextapps-de/flexsearch",children:"FlexSearch library"}),", known for its speed and memory efficiency. This ensures that search operations are performed quickly, even with large datasets. The search engine can handle multi-field queries, partial matching, and complex search operations, providing users with highly relevant results."]}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"Local Data Indexing"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["With the plugin, all search operations are performed on the local data stored within the RxDB collections. This means that users can execute fulltext search queries without the need for an external server or database, which is especially beneficial for offline-first applications. The local indexing ensures that search queries are executed quickly, reducing the latency typically associated with remote database queries. Also when used in multiple browser tabs, it is ensured that through ",(0,i.jsx)(n.a,{href:"/leader-election.html",children:"Leader Election"}),", only exactly one tabs is doing the work of indexing without having an overhead in the other browser tabs."]}),"\n",(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsx)(n.li,{children:"Real-time Indexing"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["The plugin integrates seamlessly with RxDB's reactive nature. Every time a document is written to an ",(0,i.jsx)(n.a,{href:"/rx-collection.html",children:"RxCollection"}),", an indexer updates the fulltext search index in real-time. This ensures that search results are always up-to-date, reflecting the most current state of the data without requiring manual reindexing."]}),"\n",(0,i.jsxs)(n.ol,{start:"4",children:["\n",(0,i.jsx)(n.li,{children:"Persistent indexing"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["The fulltext search index is efficiently persisted within the ",(0,i.jsx)(n.a,{href:"/rx-collection.html",children:"RxCollection"}),", ensuring that the index remains intact across app restarts. When documents are added or updated in the collection, the index is incrementally updated in real-time, meaning only the changes are processed rather than reindexing the entire dataset. This incremental approach not only optimizes performance but also ensures that subsequent app launches are quick, as there's no need to reindex all the data from scratch, making the search feature both reliable and fast from the moment the app starts. When using an ",(0,i.jsx)(n.a,{href:"/encryption.html",children:"encrypted storage"})," the index itself and incremental updates to it are stored fully encrypted and are only decrypted in-memory."]}),"\n",(0,i.jsxs)(n.ol,{start:"5",children:["\n",(0,i.jsx)(n.li,{children:"Complex Query Support"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["The FlexSearch-based plugin allows for ",(0,i.jsx)(n.a,{href:"https://github.com/nextapps-de/flexsearch?tab=readme-ov-file#index.search",children:"sophisticated search queries"}),", including multi-term and contextual searches. Users can perform complex searches that go beyond simple keyword matching, enabling more advanced use cases like searching for documents with specific phrases, relevance-based sorting, or even phonetic matching."]}),"\n",(0,i.jsxs)(n.ol,{start:"6",children:["\n",(0,i.jsx)(n.li,{children:"Offline-First Support and Privacy"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["As RxDB is designed with ",(0,i.jsx)(n.a,{href:"/offline-first.html",children:"offline-first applications"})," in mind, the fulltext search plugin supports this paradigm by ensuring that all search operations can be performed offline. This is crucial for applications that need to function in environments with intermittent or no internet connectivity, offering users a consistent and reliable search experience with ",(0,i.jsx)(n.a,{href:"/articles/zero-latency-local-first.html",children:"zero latency"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"using-the-rxdb-fulltext-search",children:"Using the RxDB Fulltext Search"}),"\n",(0,i.jsxs)(n.p,{children:["The flexsearch search is a ",(0,i.jsx)(n.a,{href:"/premium/",children:"RxDB Premium Package \ud83d\udc51"})," which must be purchased and imported from the ",(0,i.jsx)(n.code,{children:"rxdb-premium"})," npm package."]}),"\n",(0,i.jsxs)(n.p,{children:["Step 1: Add the ",(0,i.jsx)(n.code,{children:"RxDBFlexSearchPlugin"})," to RxDB."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { RxDBFlexSearchPlugin } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/flexsearch'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { addRxPlugin } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"addRxPlugin"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(RxDBFlexSearchPlugin);"})]})]})})}),"\n",(0,i.jsxs)(n.p,{children:["Step 2: Create a ",(0,i.jsx)(n.code,{children:"RxFulltextSearch"})," instance on top of a collection with the ",(0,i.jsx)(n.code,{children:"addFulltextSearch()"})," function."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { addFulltextSearch } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/flexsearch'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" flexSearch"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" addFulltextSearch"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // unique identifier. Used to store metadata and continue indexing on restarts/reloads."})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" identifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-search'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // The source collection on whose documents the search is based on"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myRxCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Transforms the document data to a given searchable string."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * This can be done by returning a single string property of the document"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * or even by concatenating and transforming multiple fields like:"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * doc => doc.firstName + ' ' + doc.lastName"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" docToString"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" doc "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".firstName"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * (Optional)"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Amount of documents to index at once."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * See https://rxdb.info/rx-pipeline.html"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" number;"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * (Optional)"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * lazy: Initialize the in memory fulltext index at the first search query."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * instant: Directly initialize so that the index is already there on the first query."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Default: 'instant'"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" initialization: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'instant'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * (Optional)"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"@link"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" https://github.com/nextapps-de/flexsearch#index-options"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" indexOptions"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(n.p,{children:"Step 3: Run a search operation:"}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:'// find all documents whose searchstring contains "foobar"'})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" foundDocuments"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" flexSearch"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'foobar'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * You can also use search options as second parameter"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"@link"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" https://github.com/nextapps-de/flexsearch#search-options"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" foundDocuments"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" flexSearch"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'foobar'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { limit"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})]})]})})})]})}function d(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/8aa53ed7.941200b7.js b/docs/assets/js/8aa53ed7.941200b7.js deleted file mode 100644 index 4fef35d3629..00000000000 --- a/docs/assets/js/8aa53ed7.941200b7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[6723],{7841(e,a,n){n.r(a),n.d(a,{assets:()=>c,contentTitle:()=>l,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"articles/angular-database","title":"RxDB as a Database in an Angular Application","description":"Level up your Angular projects with RxDB. Build real-time, resilient, and responsive apps powered by a reactive NoSQL database right in the browser.","source":"@site/docs/articles/angular-database.md","sourceDirName":"articles","slug":"/articles/angular-database.html","permalink":"/articles/angular-database.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB as a Database in an Angular Application","slug":"angular-database.html","description":"Level up your Angular projects with RxDB. Build real-time, resilient, and responsive apps powered by a reactive NoSQL database right in the browser."},"sidebar":"tutorialSidebar","previous":{"title":"React Native Database - Sync & Store Like a Pro","permalink":"/react-native-database.html"},"next":{"title":"Browser Storage - RxDB as a Database for Browsers","permalink":"/articles/browser-storage.html"}}');var i=n(4848),r=n(8453),t=n(2271);const o={title:"RxDB as a Database in an Angular Application",slug:"angular-database.html",description:"Level up your Angular projects with RxDB. Build real-time, resilient, and responsive apps powered by a reactive NoSQL database right in the browser."},l="RxDB as a Database in an Angular Application",c={},d=[{value:"Angular Web Applications",id:"angular-web-applications",level:2},{value:"Importance of Databases in Angular Applications",id:"importance-of-databases-in-angular-applications",level:2},{value:"Introducing RxDB as a Database Solution",id:"introducing-rxdb-as-a-database-solution",level:2},{value:"Getting Started with RxDB",id:"getting-started-with-rxdb",level:2},{value:"What is RxDB?",id:"what-is-rxdb",level:3},{value:"Reactive Data Handling",id:"reactive-data-handling",level:3},{value:"Offline-First Approach",id:"offline-first-approach",level:3},{value:"Data Replication",id:"data-replication",level:3},{value:"Observable Queries",id:"observable-queries",level:3},{value:"Multi-Tab Support",id:"multi-tab-support",level:3},{value:"RxDB vs. Other Angular Database Options",id:"rxdb-vs-other-angular-database-options",level:3},{value:"Using RxDB in an Angular Application",id:"using-rxdb-in-an-angular-application",level:2},{value:"Installing RxDB in an Angular App",id:"installing-rxdb-in-an-angular-app",level:3},{value:"Patch Change Detection with zone.js",id:"patch-change-detection-with-zonejs",level:3},{value:"Use the Angular async pipe to observe an RxDB Query",id:"use-the-angular-async-pipe-to-observe-an-rxdb-query",level:3},{value:"Different RxStorage layers for RxDB",id:"different-rxstorage-layers-for-rxdb",level:3},{value:"Synchronizing Data with RxDB between Clients and Servers",id:"synchronizing-data-with-rxdb-between-clients-and-servers",level:2},{value:"Offline-First Approach",id:"offline-first-approach-1",level:3},{value:"Conflict Resolution",id:"conflict-resolution",level:3},{value:"Bidirectional Synchronization",id:"bidirectional-synchronization",level:3},{value:"Real-Time Updates",id:"real-time-updates",level:3},{value:"Advanced RxDB Features and Techniques",id:"advanced-rxdb-features-and-techniques",level:2},{value:"Indexing and Performance Optimization",id:"indexing-and-performance-optimization",level:3},{value:"Encryption of Local Data",id:"encryption-of-local-data",level:3},{value:"Change Streams and Event Handling",id:"change-streams-and-event-handling",level:3},{value:"JSON Key Compression",id:"json-key-compression",level:3},{value:"Best Practices for Using RxDB in Angular Applications",id:"best-practices-for-using-rxdb-in-angular-applications",level:2},{value:"Use Async Pipe for Subscriptions so you do not have to unsubscribe",id:"use-async-pipe-for-subscriptions-so-you-do-not-have-to-unsubscribe",level:3},{value:"Use custom reactivity to have signals instead of rxjs observables",id:"use-custom-reactivity-to-have-signals-instead-of-rxjs-observables",level:3},{value:"Use Angular Services for Database creation",id:"use-angular-services-for-database-creation",level:3},{value:"Efficient Data Handling",id:"efficient-data-handling",level:3},{value:"Data Synchronization Strategies",id:"data-synchronization-strategies",level:3},{value:"Conclusion",id:"conclusion",level:2},{value:"Follow Up",id:"follow-up",level:2}];function h(e){const a={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a.header,{children:(0,i.jsx)(a.h1,{id:"rxdb-as-a-database-in-an-angular-application",children:"RxDB as a Database in an Angular Application"})}),"\n",(0,i.jsxs)(a.p,{children:["In modern web development, Angular has emerged as a popular framework for building robust and scalable applications. As Angular applications often require persistent ",(0,i.jsx)(a.a,{href:"/articles/browser-storage.html",children:"storage"})," and efficient data handling, choosing the right database solution is crucial. One such solution is ",(0,i.jsx)(a.a,{href:"https://rxdb.info/",children:"RxDB"}),", a reactive JavaScript database for the browser, node.js, and ",(0,i.jsx)(a.a,{href:"/articles/mobile-database.html",children:"mobile devices"}),". In this article, we will explore the integration of RxDB into an Angular application and examine its various features and techniques."]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JavaScript Angular Database",width:"220"})})}),"\n",(0,i.jsx)(a.h2,{id:"angular-web-applications",children:"Angular Web Applications"}),"\n",(0,i.jsx)(a.p,{children:"Angular is a powerful JavaScript framework developed and maintained by Google. It enables developers to build single-page applications (SPAs) with a modular and component-based approach. Angular provides a comprehensive set of tools and features for creating dynamic and responsive web applications."}),"\n",(0,i.jsx)(a.h2,{id:"importance-of-databases-in-angular-applications",children:"Importance of Databases in Angular Applications"}),"\n",(0,i.jsx)(a.p,{children:"Databases play a vital role in Angular applications by providing a structured and efficient way to store, retrieve, and manage data. Whether it's handling user authentication, caching data, or persisting application state, a robust database solution is essential for ensuring optimal performance and user experience."}),"\n",(0,i.jsx)(a.h2,{id:"introducing-rxdb-as-a-database-solution",children:"Introducing RxDB as a Database Solution"}),"\n",(0,i.jsxs)(a.p,{children:["RxDB stands for Reactive Database and is built on the principles of reactive programming. It combines the best features of ",(0,i.jsx)(a.a,{href:"/articles/in-memory-nosql-database.html",children:"NoSQL databases"})," with the power of reactive programming to provide a scalable and efficient database solution. RxDB offers seamless integration with Angular applications and brings several unique features that make it an attractive choice for developers."]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)(t.N,{videoId:"qHWrooWyCYg",title:"This solved a problem I've had in Angular for years",duration:"3:45"})}),"\n",(0,i.jsx)(a.h2,{id:"getting-started-with-rxdb",children:"Getting Started with RxDB"}),"\n",(0,i.jsx)(a.p,{children:"To begin our journey with RxDB, let's understand its key concepts and features."}),"\n",(0,i.jsx)(a.h3,{id:"what-is-rxdb",children:"What is RxDB?"}),"\n",(0,i.jsxs)(a.p,{children:[(0,i.jsx)(a.a,{href:"https://rxdb.info/",children:"RxDB"})," is a client-side database that follows the principles of reactive programming. It is built on top of IndexedDB, the ",(0,i.jsx)(a.a,{href:"/articles/browser-database.html",children:"native browser database"}),", and leverages the RxJS library for reactive data handling. RxDB provides a simple and intuitive API for managing data and offers features like data replication, multi-tab support, and efficient query handling."]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JavaScript Angular Database",width:"220"})})}),"\n",(0,i.jsx)(a.h3,{id:"reactive-data-handling",children:"Reactive Data Handling"}),"\n",(0,i.jsx)(a.p,{children:"At the core of RxDB is the concept of reactive data handling. RxDB leverages observables and reactive streams to enable real-time updates and data synchronization. With RxDB, you can easily subscribe to data changes and react to them in a reactive and efficient manner."}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"../files/animations/realtime.gif",alt:"realtime ui updates",width:"700"})}),"\n",(0,i.jsx)(a.h3,{id:"offline-first-approach",children:"Offline-First Approach"}),"\n",(0,i.jsx)(a.p,{children:"One of the standout features of RxDB is its offline-first approach. It allows you to build applications that can work seamlessly in offline scenarios. RxDB stores data locally and automatically synchronizes changes with the server when the network becomes available. This capability is particularly useful for applications that need to function in low-connectivity or unreliable network environments."}),"\n",(0,i.jsx)(a.h3,{id:"data-replication",children:"Data Replication"}),"\n",(0,i.jsx)(a.p,{children:"RxDB provides built-in support for data replication between clients and servers. This means you can synchronize data across multiple devices or instances of your application effortlessly. RxDB handles conflict resolution and ensures that data remains consistent across all connected clients."}),"\n",(0,i.jsx)(a.h3,{id:"observable-queries",children:"Observable Queries"}),"\n",(0,i.jsx)(a.p,{children:"RxDB offers a powerful querying mechanism with support for observable queries. This allows you to create dynamic queries that automatically update when the underlying data changes. By leveraging RxDB's observable queries, you can build reactive UI components that respond to data changes in real-time."}),"\n",(0,i.jsx)(a.h3,{id:"multi-tab-support",children:"Multi-Tab Support"}),"\n",(0,i.jsx)(a.p,{children:"RxDB provides out-of-the-box support for multi-tab scenarios. This means that if your Angular application is running in multiple browser tabs, RxDB automatically keeps the data in sync across all tabs. It ensures that changes made in one tab are immediately reflected in others, providing a seamless user experience."}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"../files/multiwindow.gif",alt:"multi tab support",width:"450"})}),"\n",(0,i.jsx)(a.h3,{id:"rxdb-vs-other-angular-database-options",children:"RxDB vs. Other Angular Database Options"}),"\n",(0,i.jsx)(a.p,{children:"While there are other database options available for Angular applications, RxDB stands out with its reactive programming model, offline-first approach, and built-in synchronization capabilities. Unlike traditional SQL databases, RxDB's NoSQL-like structure and observables-based API make it well-suited for real-time applications and complex data scenarios."}),"\n",(0,i.jsx)(a.h2,{id:"using-rxdb-in-an-angular-application",children:"Using RxDB in an Angular Application"}),"\n",(0,i.jsx)(a.p,{children:"Now that we have a good understanding of RxDB and its features, let's explore how to integrate it into an Angular application."}),"\n",(0,i.jsx)(a.h3,{id:"installing-rxdb-in-an-angular-app",children:"Installing RxDB in an Angular App"}),"\n",(0,i.jsx)(a.p,{children:"To use RxDB in an Angular application, we first need to install the necessary dependencies. You can install RxDB using npm or yarn by running the following command:"}),"\n",(0,i.jsx)(a.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(a.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,i.jsx)(a.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-string)"},children:" rxdb"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-string)"},children:" --save"})]})})})}),"\n",(0,i.jsx)(a.p,{children:"Once installed, you can import RxDB into your Angular application and start using its API to create and manage databases."}),"\n",(0,i.jsx)(a.h3,{id:"patch-change-detection-with-zonejs",children:"Patch Change Detection with zone.js"}),"\n",(0,i.jsx)(a.p,{children:"Angular uses change detection to detect and update UI elements when data changes. However, RxDB's data handling is based on observables, which can sometimes bypass Angular's change detection mechanism. To ensure that changes made in RxDB are detected by Angular, we need to patch the change detection mechanism using zone.js. Zone.js is a library that intercepts and tracks asynchronous operations, including observables. By patching zone.js, we can make sure that Angular is aware of changes happening in RxDB."}),"\n",(0,i.jsxs)(a.admonition,{type:"warning",children:[(0,i.jsxs)(a.p,{children:["RxDB creates rxjs observables outside of angulars zone\nSo you have to import the rxjs patch to ensure the ",(0,i.jsx)(a.a,{href:"https://angular.io/guide/change-detection",children:"angular change detection"})," works correctly.\n",(0,i.jsx)(a.a,{href:"https://www.bennadel.com/blog/3448-binding-rxjs-observable-sources-outside-of-the-ngzone-in-angular-6-0-2.htm",children:"link"})]}),(0,i.jsx)(a.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(a.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(a.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-comment)"},children:"//> app.component.ts"})}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'zone.js/plugins/zone-patch-rxjs'"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:";"})]})]})})})]}),"\n",(0,i.jsx)(a.h3,{id:"use-the-angular-async-pipe-to-observe-an-rxdb-query",children:"Use the Angular async pipe to observe an RxDB Query"}),"\n",(0,i.jsx)(a.p,{children:"Angular provides the async pipe, which is a convenient way to subscribe to observables and handle the subscription lifecycle automatically. When working with RxDB, you can use the async pipe to observe an RxDB query and bind the results directly to your Angular template. This ensures that the UI stays in sync with the data changes emitted by the RxDB query."}),"\n",(0,i.jsx)(a.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(a.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(a.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:" constructor"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" private dbService: DatabaseService"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" private dialog: MatDialog"})}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" ) {"})}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" this"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:".heroes$ "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" this"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:".dbService"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" ."}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:"db"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:".hero "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-comment)"},children:"// collection"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:" .find"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"({ "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-comment)"},children:"// query"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" sort"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" [{ name"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'asc'"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" }]"})]}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" .$;"})}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" }"})})]})})}),"\n",(0,i.jsx)(a.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(a.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"html","data-theme":"css-variables",children:(0,i.jsxs)(a.code,{"data-language":"html","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:"ul"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:" *ngFor"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"let hero of heroes$ | async as heroes;"'}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:"li"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:">{{hero.name}}"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:""})]})]})})}),"\n",(0,i.jsx)(a.h3,{id:"different-rxstorage-layers-for-rxdb",children:"Different RxStorage layers for RxDB"}),"\n",(0,i.jsx)(a.p,{children:"RxDB supports multiple storage layers for persisting data. Some of the available storage options include:"}),"\n",(0,i.jsxs)(a.ul,{children:["\n",(0,i.jsxs)(a.li,{children:[(0,i.jsx)(a.a,{href:"/rx-storage-localstorage.html",children:"LocalStorage RxStorage"}),": Uses the ",(0,i.jsx)(a.a,{href:"/articles/localstorage.html",children:"LocalStorage API"})," without any third party plugins."]}),"\n",(0,i.jsxs)(a.li,{children:[(0,i.jsx)(a.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB RxStorage"}),": RxDB directly supports IndexedDB as a storage layer. IndexedDB is a low-level browser database that offers good performance and reliability."]}),"\n",(0,i.jsxs)(a.li,{children:[(0,i.jsx)(a.a,{href:"/rx-storage-opfs.html",children:"OPFS RxStorage"}),": The OPFS ",(0,i.jsx)(a.a,{href:"/rx-storage.html",children:"RxStorage"})," for RxDB is built on top of the ",(0,i.jsx)(a.a,{href:"https://webkit.org/blog/12257/the-file-system-access-api-with-origin-private-file-system/",children:"File System Access API"})," which is available in ",(0,i.jsx)(a.a,{href:"https://caniuse.com/native-filesystem-api",children:"all modern browsers"}),". It provides an API to access a sandboxed private file system to persistently store and retrieve data.\nCompared to other persistent storage options in the browser (like ",(0,i.jsx)(a.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB"}),"), the OPFS API has a ",(0,i.jsx)(a.strong,{children:"way better performance"}),"."]}),"\n",(0,i.jsxs)(a.li,{children:[(0,i.jsx)(a.a,{href:"/rx-storage-memory.html",children:"Memory RxStorage"}),": In addition to persistent storage options, RxDB also provides a memory-based storage layer. This is useful for testing or scenarios where you don't need long-term data persistence.\nYou can choose the storage layer that best suits your application's requirements and configure RxDB accordingly."]}),"\n"]}),"\n",(0,i.jsx)(a.h2,{id:"synchronizing-data-with-rxdb-between-clients-and-servers",children:"Synchronizing Data with RxDB between Clients and Servers"}),"\n",(0,i.jsx)(a.p,{children:"Data replication between an Angular application and a server is a common requirement. RxDB simplifies this process and provides built-in support for data synchronization. Let's explore how to replicate data between an Angular application and a server using RxDB."}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"../files/database-replication.png",alt:"database replication",width:"200"})}),"\n",(0,i.jsx)(a.h3,{id:"offline-first-approach-1",children:"Offline-First Approach"}),"\n",(0,i.jsxs)(a.p,{children:["One of the key strengths of RxDB is its ",(0,i.jsx)(a.a,{href:"/offline-first.html",children:"offline-first approach"}),". It allows Angular applications to function seamlessly even in offline scenarios. RxDB stores data locally and automatically synchronizes changes with the server when the network becomes available. This capability is particularly useful for applications that need to operate in low-connectivity or unreliable network environments."]}),"\n",(0,i.jsx)(a.h3,{id:"conflict-resolution",children:"Conflict Resolution"}),"\n",(0,i.jsx)(a.p,{children:"In a distributed system, conflicts can arise when multiple clients modify the same data simultaneously. RxDB offers conflict resolution mechanisms to handle such scenarios. You can define conflict resolution strategies based on your application's requirements. RxDB provides hooks and events to detect conflicts and resolve them in a consistent manner."}),"\n",(0,i.jsx)(a.h3,{id:"bidirectional-synchronization",children:"Bidirectional Synchronization"}),"\n",(0,i.jsx)(a.p,{children:"RxDB supports bidirectional data synchronization, allowing updates from both the client and server to be replicated seamlessly. This ensures that data remains consistent across all connected clients and the server. RxDB handles conflicts and resolves them based on the defined conflict resolution strategies."}),"\n",(0,i.jsx)(a.h3,{id:"real-time-updates",children:"Real-Time Updates"}),"\n",(0,i.jsx)(a.p,{children:"RxDB provides real-time updates by leveraging reactive programming principles. Changes made to the data are automatically propagated to all connected clients in real-time. Angular applications can subscribe to these updates and update the user interface accordingly. This real-time capability enables collaborative features and enhances the overall user experience."}),"\n",(0,i.jsx)(a.h2,{id:"advanced-rxdb-features-and-techniques",children:"Advanced RxDB Features and Techniques"}),"\n",(0,i.jsx)(a.p,{children:"RxDB offers several advanced features and techniques that can further enhance your Angular application."}),"\n",(0,i.jsx)(a.h3,{id:"indexing-and-performance-optimization",children:"Indexing and Performance Optimization"}),"\n",(0,i.jsx)(a.p,{children:"To improve query performance, RxDB allows you to define indexes on specific fields of your documents. Indexing enables faster data retrieval and query execution, especially when working with large datasets. By strategically creating indexes, you can optimize the performance of your Angular application."}),"\n",(0,i.jsx)(a.h3,{id:"encryption-of-local-data",children:"Encryption of Local Data"}),"\n",(0,i.jsxs)(a.p,{children:["RxDB provides built-in support for ",(0,i.jsx)(a.a,{href:"/encryption.html",children:"encrypting"})," local data using the Web Crypto API. With encryption, you can protect sensitive data stored in the client-side database. RxDB transparently encrypts the data, ensuring that it remains secure even if the underlying storage is compromised."]}),"\n",(0,i.jsx)(a.h3,{id:"change-streams-and-event-handling",children:"Change Streams and Event Handling"}),"\n",(0,i.jsx)(a.p,{children:"RxDB exposes change streams, which allow you to listen for data changes at a database or collection level. By subscribing to change streams, you can react to data modifications and perform specific actions, such as updating the UI or triggering notifications. Change streams enable real-time event handling in your Angular application."}),"\n",(0,i.jsx)(a.h3,{id:"json-key-compression",children:"JSON Key Compression"}),"\n",(0,i.jsxs)(a.p,{children:["To reduce the storage footprint and improve performance, RxDB supports ",(0,i.jsx)(a.a,{href:"/key-compression.html",children:"JSON key compression"}),". With key compression, RxDB replaces long keys with shorter aliases, reducing the overall storage size. This optimization is particularly useful when working with large datasets or frequently updating data."]}),"\n",(0,i.jsx)(a.h2,{id:"best-practices-for-using-rxdb-in-angular-applications",children:"Best Practices for Using RxDB in Angular Applications"}),"\n",(0,i.jsx)(a.p,{children:"To make the most of RxDB in your Angular application, consider the following best practices:"}),"\n",(0,i.jsx)(a.h3,{id:"use-async-pipe-for-subscriptions-so-you-do-not-have-to-unsubscribe",children:"Use Async Pipe for Subscriptions so you do not have to unsubscribe"}),"\n",(0,i.jsxs)(a.p,{children:["Angular's ",(0,i.jsx)(a.code,{children:"async"})," pipe is a powerful tool for handling observables in templates. By using the async pipe, you can avoid the need to manually subscribe and unsubscribe from RxDB observables. Angular takes care of the subscription lifecycle, ensuring that resources are released when they are no longer needed. Instead of manually subscribing to Observables, you should always prefer the ",(0,i.jsx)(a.code,{children:"async"})," pipe."]}),"\n",(0,i.jsx)(a.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(a.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(a.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-comment)"},children:"// WRONG:"})}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"let"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" amount;"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:"this"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:".dbService"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" ."}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:"db"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:".hero"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:" .find"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" sort"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" [{ name"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'asc'"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" }]"})]}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" ."}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:"$"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"(docs "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" amount "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" docs"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:".forEach"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"(d "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" amount "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" d"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:".points);"})]}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-comment)"},children:"// RIGHT:"})}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:"this"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:".amount$ "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" this"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:".dbService"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" ."}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:"db"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:".hero"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:" .find"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" {}"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" sort"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" [{ name"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'asc'"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" }]"})]}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" ."}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:"$"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:".pipe"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:" map"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"(docs "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:" let"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" amount "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" docs"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:".forEach"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"(d "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" amount "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" d"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:".points);"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" amount;"})]}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" );"})})]})})}),"\n",(0,i.jsx)(a.h3,{id:"use-custom-reactivity-to-have-signals-instead-of-rxjs-observables",children:"Use custom reactivity to have signals instead of rxjs observables"}),"\n",(0,i.jsxs)(a.p,{children:["RxDB supports adding custom reactivity factories that allow you to get angular signals out of the database instead of rxjs observables. ",(0,i.jsx)(a.a,{href:"/reactivity.html",children:"read more"}),"."]}),"\n",(0,i.jsx)(a.h3,{id:"use-angular-services-for-database-creation",children:"Use Angular Services for Database creation"}),"\n",(0,i.jsx)(a.p,{children:"To ensure proper separation of concerns and maintain a clean codebase, it is recommended to create an Angular service responsible for managing the RxDB database instance. This service can handle database creation, initialization, and provide methods for interacting with the database throughout your application."}),"\n",(0,i.jsx)(a.h3,{id:"efficient-data-handling",children:"Efficient Data Handling"}),"\n",(0,i.jsx)(a.p,{children:"RxDB provides various mechanisms for efficient data handling, such as batching updates, debouncing, and throttling. Leveraging these techniques can help optimize performance and reduce unnecessary UI updates. Consider the specific data handling requirements of your application and choose the appropriate strategies provided by RxDB."}),"\n",(0,i.jsx)(a.h3,{id:"data-synchronization-strategies",children:"Data Synchronization Strategies"}),"\n",(0,i.jsx)(a.p,{children:"When working with data synchronization between clients and servers, it's important to consider strategies for conflict resolution and handling network failures. RxDB provides plugins and hooks that allow you to customize the replication behavior and implement specific synchronization strategies tailored to your application's needs."}),"\n",(0,i.jsx)(a.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(a.p,{children:"RxDB is a powerful database solution for Angular applications, offering reactive data handling, offline-first capabilities, and seamless data synchronization. By integrating RxDB into your Angular application, you can build responsive and scalable web applications that provide a rich user experience. Whether you're building real-time collaborative apps, progressive web applications, or offline-capable applications, RxDB's features and techniques make it a valuable addition to your Angular development toolkit."}),"\n",(0,i.jsx)(a.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,i.jsx)(a.p,{children:"To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources:"}),"\n",(0,i.jsxs)(a.ul,{children:["\n",(0,i.jsxs)(a.li,{children:[(0,i.jsx)(a.a,{href:"https://github.com/pubkey/rxdb",children:"RxDB GitHub Repository"}),": Visit the official GitHub repository of RxDB to access the source code, documentation, and community support."]}),"\n",(0,i.jsxs)(a.li,{children:[(0,i.jsx)(a.a,{href:"/quickstart.html",children:"RxDB Quickstart"}),": Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects."]}),"\n",(0,i.jsx)(a.li,{children:(0,i.jsx)(a.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/angular",children:"RxDB Angular Example at GitHub"})}),"\n"]})]})}function p(e={}){const{wrapper:a}={...(0,r.R)(),...e.components};return a?(0,i.jsx)(a,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453(e,a,n){n.d(a,{R:()=>t,x:()=>o});var s=n(6540);const i={},r=s.createContext(i);function t(e){const a=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function o(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),s.createElement(r.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/8b0a0922.114db760.js b/docs/assets/js/8b0a0922.114db760.js deleted file mode 100644 index e72282fbaad..00000000000 --- a/docs/assets/js/8b0a0922.114db760.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[4557],{8453(e,n,s){s.d(n,{R:()=>o,x:()=>a});var r=s(6540);const i={},t=r.createContext(i);function o(e){const n=r.useContext(t);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),r.createElement(t.Provider,{value:n},e.children)}},9463(e,n,s){s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"slow-indexeddb","title":"Solving IndexedDB Slowness for Seamless Apps","description":"Struggling with IndexedDB performance? Discover hidden bottlenecks, advanced tuning techniques, and next-gen storage like the File System Access API.","source":"@site/docs/slow-indexeddb.md","sourceDirName":".","slug":"/slow-indexeddb.html","permalink":"/slow-indexeddb.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Solving IndexedDB Slowness for Seamless Apps","slug":"slow-indexeddb.html","description":"Struggling with IndexedDB performance? Discover hidden bottlenecks, advanced tuning techniques, and next-gen storage like the File System Access API."},"sidebar":"tutorialSidebar","previous":{"title":"NoSQL Performance Tips","permalink":"/nosql-performance-tips.html"},"next":{"title":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","permalink":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html"}}');var i=s(4848),t=s(8453);const o={title:"Solving IndexedDB Slowness for Seamless Apps",slug:"slow-indexeddb.html",description:"Struggling with IndexedDB performance? Discover hidden bottlenecks, advanced tuning techniques, and next-gen storage like the File System Access API."},a="Why IndexedDB is slow and what to use instead",l={},d=[{value:"Batched Cursor",id:"batched-cursor",level:2},{value:"IndexedDB Sharding",id:"indexeddb-sharding",level:2},{value:"Custom Indexes",id:"custom-indexes",level:2},{value:"Relaxed durability",id:"relaxed-durability",level:2},{value:"Explicit transaction commits",id:"explicit-transaction-commits",level:2},{value:"In-Memory on top of IndexedDB",id:"in-memory-on-top-of-indexeddb",level:2},{value:"In-Memory: Persistence",id:"in-memory-persistence",level:3},{value:"In-Memory: Multi Tab Support",id:"in-memory-multi-tab-support",level:3},{value:"Further read",id:"further-read",level:2}];function c(e){const n={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"why-indexeddb-is-slow-and-what-to-use-instead",children:"Why IndexedDB is slow and what to use instead"})}),"\n",(0,i.jsxs)(n.p,{children:["So you have a JavaScript web application that needs to store data at the client side, either to make it ",(0,i.jsx)(n.a,{href:"/offline-first.html",children:"offline usable"}),", just for caching purposes or for other reasons."]}),"\n",(0,i.jsxs)(n.p,{children:["For ",(0,i.jsx)(n.a,{href:"/articles/browser-database.html",children:"in-browser data storage"}),", you have some options:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Cookies"})," are sent with each HTTP request, so you cannot store more than a few strings in them."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"WebSQL"})," ",(0,i.jsx)(n.a,{href:"https://hacks.mozilla.org/2010/06/beyond-html5-database-apis-and-the-road-to-indexeddb/",children:"is deprecated"})," because it never was a real standard and turning it into a standard would have been too difficult."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"/articles/localstorage.html",children:"LocalStorage"})," is a synchronous API over asynchronous IO-access. Storing and reading data can fully block the JavaScript process so you cannot use LocalStorage for more than few simple key-value pairs."]}),"\n",(0,i.jsxs)(n.li,{children:["The ",(0,i.jsx)(n.strong,{children:"FileSystem API"})," could be used to store plain binary files, but it is ",(0,i.jsx)(n.a,{href:"https://caniuse.com/filesystem",children:"only supported in chrome"})," for now."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"IndexedDB"})," is an indexed key-object database. It can store json data and iterate over its indexes. It is ",(0,i.jsx)(n.a,{href:"https://caniuse.com/indexeddb",children:"widely supported"})," and stable."]}),"\n"]}),"\n",(0,i.jsxs)(n.admonition,{title:"UPDATE April 2023",type:"note",children:[(0,i.jsxs)(n.p,{children:["Since beginning of 2023, all modern browsers ship the ",(0,i.jsx)(n.strong,{children:"File System Access API"})," which allows to persistently store data in the browser with a way better performance. For ",(0,i.jsx)(n.a,{href:"https://rxdb.info/",children:"RxDB"})," you can use the ",(0,i.jsx)(n.a,{href:"/rx-storage-opfs.html",children:"OPFS RxStorage"})," to get about 4x performance improvement compared to IndexedDB."]}),(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"./files/logo/rxdb_javascript_database.svg",alt:"IndexedDB Database",width:"250"})})})]}),"\n",(0,i.jsxs)(n.p,{children:["It becomes clear that the only way to go is IndexedDB. You start developing your app and everything goes fine.\nBut as soon as your app gets bigger, more complex or just handles more data, you might notice something. ",(0,i.jsx)(n.strong,{children:"IndexedDB is slow"}),". Not slow like a database on a cheap server, ",(0,i.jsx)(n.strong,{children:"even slower"}),"! Inserting a few hundred documents can take up several seconds. Time which can be critical for a fast page load. Even sending data over the internet to the backend can be faster than storing it inside of an IndexedDB database."]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"Transactions vs Throughput"}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["So before we start complaining, lets analyze what exactly is slow. When you run tests on Nolans ",(0,i.jsx)(n.a,{href:"http://nolanlawson.github.io/database-comparison/",children:"Browser Database Comparison"})," you can see that inserting 1k documents into IndexedDB takes about 80 milliseconds, 0.08ms per document. This is not really slow. It is quite fast and it is very unlikely that you want to store that many document at the same time at the client side. But the key point here is that all these documents get written in a ",(0,i.jsx)(n.code,{children:"single transaction"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["I forked the comparison tool ",(0,i.jsx)(n.a,{href:"https://pubkey.github.io/client-side-databases/database-comparison/index.html",children:"here"})," and changed it to use one transaction per document write. And there we have it. Inserting 1k documents with one transaction per write, takes about 2 seconds. Interestingly if we increase the document size to be 100x bigger, it still takes about the same time to store them. This makes clear that the limiting factor to IndexedDB performance is the transaction handling, not the data throughput."]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"./files/indexeddb-transaction-throughput.png",alt:"IndexedDB transaction throughput",width:"700"})}),"\n",(0,i.jsxs)(n.p,{children:["To fix your IndexedDB performance problems you have to make sure to use as less data transfers/transactions as possible.\nSometimes this is easy, as instead of iterating over a documents list and calling single inserts, with RxDB you could use the ",(0,i.jsx)(n.a,{href:"https://rxdb.info/rx-collection.html#bulkinsert",children:"bulk methods"})," to store many document at once.\nBut most of the time is not so easy. Your user clicks around, data gets replicated from the backend, another browser tab writes data. All these things can happen at random time and you cannot crunch all that data in a single transaction."]}),"\n",(0,i.jsxs)(n.p,{children:["Another solution is to just not care about performance at all. In a few releases the browser vendors will have optimized IndexedDB and everything is fast again. Well, IndexedDB was slow ",(0,i.jsx)(n.a,{href:"https://www.researchgate.net/publication/281065948_Performance_Testing_and_Comparison_of_Client_Side_Databases_Versus_Server_Side",children:"in 2013"})," and it is still slow today. If this trend continues, it will still be slow in a few years from now. Waiting is not an option. The chromium devs made ",(0,i.jsx)(n.a,{href:"https://bugs.chromium.org/p/chromium/issues/detail?id=1025456#c15",children:"a statement"})," to focus on optimizing read performance, not write performance."]}),"\n",(0,i.jsxs)(n.p,{children:["Switching to WebSQL (even if it is deprecated) is also not an option because, like ",(0,i.jsx)(n.a,{href:"https://pubkey.github.io/client-side-databases/database-comparison/index.html",children:"the comparison tool shows"}),", it has even slower transactions."]}),"\n",(0,i.jsxs)(n.p,{children:["So you need a way to ",(0,i.jsx)(n.strong,{children:"make IndexedDB faster"}),". In the following I lay out some performance optimizations than can be made to have faster reads and writes in IndexedDB."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"HINT:"})," You can reproduce all performance tests ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/indexeddb-performance-tests",children:"in this repo"}),". In all tests we work on a dataset of 40000 ",(0,i.jsx)(n.code,{children:"human"})," documents with a random ",(0,i.jsx)(n.code,{children:"age"})," between ",(0,i.jsx)(n.code,{children:"1"})," and ",(0,i.jsx)(n.code,{children:"100"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"batched-cursor",children:"Batched Cursor"}),"\n",(0,i.jsxs)(n.p,{children:["With ",(0,i.jsx)(n.a,{href:"https://caniuse.com/indexeddb2",children:"IndexedDB 2.0"}),", new methods were introduced which can be utilized to improve performance. With the ",(0,i.jsx)(n.code,{children:"getAll()"})," method, a faster alternative to the old ",(0,i.jsx)(n.code,{children:"openCursor()"})," can be created which improves performance when reading data from the IndexedDB store."]}),"\n",(0,i.jsxs)(n.p,{children:["Lets say we want to query all user documents that have an ",(0,i.jsx)(n.code,{children:"age"})," greater than ",(0,i.jsx)(n.code,{children:"25"})," out of the store.\nTo implement a fast batched cursor that only needs calls to ",(0,i.jsx)(n.code,{children:"getAll()"})," and not to ",(0,i.jsx)(n.code,{children:"getAllKeys()"}),", we first need to create an ",(0,i.jsx)(n.code,{children:"age"})," index that contains the primary ",(0,i.jsx)(n.code,{children:"id"})," as last field."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"myIndexedDBObjectStore"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".createIndex"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'age-index'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'age'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,i.jsxs)(n.p,{children:["This is required because the ",(0,i.jsx)(n.code,{children:"age"})," field is not unique, and we need a way to checkpoint the last returned batch so we can continue from there in the next call to ",(0,i.jsx)(n.code,{children:"getAll()"}),"."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" maxAge"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 25"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"let"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" result "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" [];"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" tx"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" IDBTransaction"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".transaction"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"([storeName]"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'readonly'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" TRANSACTION_SETTINGS"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" store"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" tx"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".objectStore"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(storeName);"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" index"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" store"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".index"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'age-index'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"let"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" lastDoc;"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"let"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" done "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Run the batched cursor until all results are retrieved"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * or the end of the index is reached."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"while"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (done "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"==="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:") {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" Promise"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"((res"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" rej) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" range"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" IDBKeyRange"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".bound"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * If we have a previous document as checkpoint,"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * we have to continue from it's age and id values."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" lastDoc "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"?"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" lastDoc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".age "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" -"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"Infinity"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" lastDoc "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"?"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" lastDoc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".id "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" -"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"Infinity"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ]"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" maxAge "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"+"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0.00000001"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" String"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".fromCharCode"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"65535"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ]"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" false"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" openCursorRequest"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" index"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".getAll"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(range"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize);"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" openCursorRequest"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"onerror"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" err "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" rej"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(err);"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" openCursorRequest"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"onsuccess"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" e "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" subResult"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" TestDocument"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"[] "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" e"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"target"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".result;"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" lastDoc "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" lastOfArray"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(subResult);"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"subResult"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"length"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ==="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:") {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" done "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"else"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" result "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" result"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".concat"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(subResult);"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" res"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(result);"})]})]})})}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"./files/indexeddb-batched-cursor.png",alt:"IndexedDB batched cursor",width:"100%"})}),"\n",(0,i.jsxs)(n.p,{children:["As the performance test results show, using a batched cursor can give a huge improvement. Interestingly choosing a high batch size is important. When you known that all results of a given ",(0,i.jsx)(n.code,{children:"IDBKeyRange"})," are needed, you should not set a batch size at all and just directly query all documents via ",(0,i.jsx)(n.code,{children:"getAll()"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["RxDB uses batched cursors in the ",(0,i.jsx)(n.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB RxStorage"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"indexeddb-sharding",children:"IndexedDB Sharding"}),"\n",(0,i.jsxs)(n.p,{children:["Sharding is a technique, normally used in server side databases, where the database is partitioned horizontally. Instead of storing all documents at one table/collection, the documents are split into so called ",(0,i.jsx)(n.strong,{children:"shards"})," and each shard is stored on one table/collection. This is done in server side architectures to spread the load between multiple physical servers which ",(0,i.jsx)(n.strong,{children:"increases scalability"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["When you use IndexedDB in a browser, there is of course no way to split the load between the client and other servers. But you can still benefit from sharding. Partitioning the documents horizontally into ",(0,i.jsx)(n.strong,{children:"multiple IndexedDB stores"}),", has shown to have a big performance improvement in write- and read operations while only increasing initial pageload slightly."]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"./files/indexeddb-sharding-performance.png",alt:"IndexedDB sharding performance",width:"100%"})}),"\n",(0,i.jsxs)(n.p,{children:["As shown in the performance test results, sharding should always be done by ",(0,i.jsx)(n.code,{children:"IDBObjectStore"})," and not by database. Running a batched cursor over the whole dataset with 10 store shards in parallel is about ",(0,i.jsx)(n.strong,{children:"28% faster"})," then running it over a single store. Initialization time increases minimal from ",(0,i.jsx)(n.code,{children:"9"})," to ",(0,i.jsx)(n.code,{children:"17"})," milliseconds.\nGetting a quarter of the dataset by batched iterating over an index, is even ",(0,i.jsx)(n.strong,{children:"43%"})," faster with sharding then when a single store is queried."]}),"\n",(0,i.jsx)(n.p,{children:"As downside, getting 10k documents by their id is slower when it has to run over the shards.\nAlso it can be much effort to recombined the results from the different shards into the required query result. When a query without a limit is done, the sharding method might cause a data load huge overhead."}),"\n",(0,i.jsxs)(n.p,{children:["Sharding can be used with RxDB with the ",(0,i.jsx)(n.a,{href:"/rx-storage-sharding.html",children:"Sharding Plugin"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"custom-indexes",children:"Custom Indexes"}),"\n",(0,i.jsx)(n.p,{children:"Indexes improve the query performance of IndexedDB significant. Instead of fetching all data from the storage when you search for a subset of it, you can iterate over the index and stop iterating when all relevant data has been found."}),"\n",(0,i.jsxs)(n.p,{children:["For example to query for all user documents that have an ",(0,i.jsx)(n.code,{children:"age"})," greater than ",(0,i.jsx)(n.code,{children:"25"}),", you would create an ",(0,i.jsx)(n.code,{children:"age+id"})," index.\nTo be able to run a batched cursor over the index, we always need our primary key (",(0,i.jsx)(n.code,{children:"id"}),") as the last index field."]}),"\n",(0,i.jsxs)(n.p,{children:["Instead of doing this, you can use a ",(0,i.jsx)(n.code,{children:"custom index"})," which can improve the performance. The custom index runs over a helper field ",(0,i.jsx)(n.code,{children:"ageIdCustomIndex"})," which is added to each document on write. Our index now only contains a single ",(0,i.jsx)(n.code,{children:"string"})," field instead of two (age-",(0,i.jsx)(n.code,{children:"number"})," and id-",(0,i.jsx)(n.code,{children:"string"}),")."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// On document insert add the ageIdCustomIndex field."})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" idMaxLength"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 20"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"; "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// must be known to craft a custom index"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"docData"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".ageIdCustomIndex "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" docData"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".age "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"+"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" docData"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"id"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".padStart"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(idMaxLength"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" ' '"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"store"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".put"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(docData);"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// ..."})})]})})}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// normal index"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"myIndexedDBObjectStore"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".createIndex"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'age-index'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'age'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// custom index"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"myIndexedDBObjectStore"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".createIndex"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'age-index-custom'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'ageIdCustomIndex'"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "})]})})}),"\n",(0,i.jsxs)(n.p,{children:["To iterate over the index, you also use a custom crafted keyrange, depending on the last batched cursor checkpoint. Therefore the ",(0,i.jsx)(n.code,{children:"maxLength"})," of ",(0,i.jsx)(n.code,{children:"id"})," must be known."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// keyrange for normal index"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" range"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" IDBKeyRange"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".bound"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"25"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" ''"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"]"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"Infinity"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" Infinity"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"]"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" false"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// keyrange for custom index"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" range"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" IDBKeyRange"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".bound"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // combine both values to a single string"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 25"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" ''"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".padStart"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(idMaxLength"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" ' '"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" Infinity"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" false"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"./files/indexeddb-custom-index.png",alt:"IndexedDB custom index",width:"700"})}),"\n",(0,i.jsxs)(n.p,{children:["As shown, using a custom index can further improve the performance of running a batched cursor by about ",(0,i.jsx)(n.code,{children:"10%"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["Another big benefit of using custom indexes, is that you can also encode ",(0,i.jsx)(n.code,{children:"boolean"})," values in them, which ",(0,i.jsx)(n.a,{href:"https://github.com/w3c/IndexedDB/issues/76",children:"cannot be done"})," with normal IndexedDB indexes."]}),"\n",(0,i.jsxs)(n.p,{children:["RxDB uses custom indexes in the ",(0,i.jsx)(n.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB RxStorage"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"relaxed-durability",children:"Relaxed durability"}),"\n",(0,i.jsxs)(n.p,{children:["Chromium based browsers allow to set ",(0,i.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/IDBTransaction/durability",children:"durability"})," to ",(0,i.jsx)(n.code,{children:"relaxed"})," when creating an IndexedDB transaction. Which runs the transaction in a less secure durability mode, which can improve the performance."]}),"\n",(0,i.jsxs)(n.blockquote,{children:["\n",(0,i.jsx)(n.p,{children:"The user agent may consider that the transaction has successfully committed as soon as all outstanding changes have been written to the operating system, without subsequent verification."}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["As shown ",(0,i.jsx)(n.a,{href:"https://nolanlawson.com/2021/08/22/speeding-up-indexeddb-reads-and-writes/",children:"here"}),", using the relaxed durability mode can improve performance slightly. The best performance improvement could be measured when many small transactions have to be run. Less, bigger transaction do not benefit that much."]}),"\n",(0,i.jsx)(n.h2,{id:"explicit-transaction-commits",children:"Explicit transaction commits"}),"\n",(0,i.jsxs)(n.p,{children:["By explicitly committing a transaction, another slight performance improvement can be achieved. Instead of waiting for the browser to commit an open transaction, we call the ",(0,i.jsx)(n.code,{children:"commit()"})," method to explicitly close it."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// .commit() is not available on all browsers, so first check if it exists."})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"if"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"transaction"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".commit) {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" transaction"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".commit"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsxs)(n.p,{children:["The improvement of this technique is minimal, but observable as ",(0,i.jsx)(n.a,{href:"https://nolanlawson.com/2021/08/22/speeding-up-indexeddb-reads-and-writes/",children:"these tests"})," show."]}),"\n",(0,i.jsx)(n.h2,{id:"in-memory-on-top-of-indexeddb",children:"In-Memory on top of IndexedDB"}),"\n",(0,i.jsxs)(n.p,{children:["To prevent transaction handling and to fix the performance problems, we need to stop using IndexedDB as a database. Instead all data is loaded into the memory on the initial page load. Here all reads and writes happen in memory which is about 100x faster. Only some time after a write occurred, the memory state is persisted into IndexedDB with a ",(0,i.jsx)(n.strong,{children:"single write transaction"}),". In this scenario IndexedDB is used as a filesystem, not as a database."]}),"\n",(0,i.jsx)(n.p,{children:"There are some libraries that already do that:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["LokiJS with the ",(0,i.jsx)(n.a,{href:"https://techfort.github.io/LokiJS/LokiIndexedAdapter.html",children:"IndexedDB Adapter"})]}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://github.com/jlongster/absurd-sql",children:"Absurd-SQL"})}),"\n",(0,i.jsxs)(n.li,{children:["SQL.js with the ",(0,i.jsx)(n.a,{href:"https://emscripten.org/docs/api_reference/Filesystem-API.html#filesystem-api-idbfs",children:"empscripten Filesystem API"})]}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://duckdb.org/2021/10/29/duckdb-wasm.html",children:"DuckDB Wasm"})}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"in-memory-persistence",children:"In-Memory: Persistence"}),"\n",(0,i.jsxs)(n.p,{children:["One downside of not directly using IndexedDB, is that your data is not persistent all the time. And when the JavaScript process exists without having persisted to IndexedDB, data can be lost. To prevent this from happening, we have to ensure that the in-memory state is written down to the disc. One point is make persisting as fast as possible. LokiJS for example has the ",(0,i.jsx)(n.code,{children:"incremental-indexeddb-adapter"})," which only saves new writes to the disc instead of persisting the whole state. Another point is to run the persisting at the correct point in time. For example the RxDB ",(0,i.jsx)(n.a,{href:"https://rxdb.info/rx-storage-lokijs.html",children:"LokiJS storage"})," persists in the following situations:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"When the database is idle and no write or query is running. In that time we can persist the state if any new writes appeared before."}),"\n",(0,i.jsxs)(n.li,{children:["When the ",(0,i.jsx)(n.code,{children:"window"})," fires the ",(0,i.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload",children:"beforeunload event"})," we can assume that the JavaScript process is exited any moment and we have to persist the state. After ",(0,i.jsx)(n.code,{children:"beforeunload"})," there are several seconds time which are sufficient to store all new changes. This has shown to work quite reliable."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"The only missing event that can happen is when the browser exists unexpectedly like when it crashes or when the power of the computer is shut of."}),"\n",(0,i.jsx)(n.h3,{id:"in-memory-multi-tab-support",children:"In-Memory: Multi Tab Support"}),"\n",(0,i.jsx)(n.p,{children:"One big difference between a web application and a 'normal' app, is that your users can use the app in multiple browser tabs at the same time. But when you have all database state in memory and only periodically write it to disc, multiple browser tabs could overwrite each other and you would loose data. This might not be a problem when you rely on a client-server replication, because the lost data might already be replicated with the backend and therefore with the other tabs. But this would not work when the client is offline."}),"\n",(0,i.jsxs)(n.p,{children:["The ideal way to solve that problem, is to use a ",(0,i.jsx)(n.a,{href:"https://developer.mozilla.org/en/docs/Web/API/SharedWorker",children:"SharedWorker"}),". A ",(0,i.jsx)(n.a,{href:"/rx-storage-shared-worker.html",children:"SharedWorker"})," is like a ",(0,i.jsx)(n.a,{href:"https://developer.mozilla.org/en/docs/Web/API/Web_Workers_API",children:"WebWorker"})," that runs its own JavaScript process only that the SharedWorker is shared between multiple contexts. You could create the database in the SharedWorker and then all browser tabs could request the Worker for data instead of having their own database. But unfortunately the SharedWorker API does ",(0,i.jsx)(n.a,{href:"https://caniuse.com/sharedworkers",children:"not work"})," in all browsers. Safari ",(0,i.jsx)(n.a,{href:"https://bugs.webkit.org/show_bug.cgi?id=140344",children:"dropped"})," its support and InternetExplorer or Android Chrome, never adopted it. Also it cannot be polyfilled. ",(0,i.jsx)(n.strong,{children:"UPDATE:"})," ",(0,i.jsx)(n.a,{href:"https://developer.apple.com/safari/technology-preview/release-notes/",children:"Apple added SharedWorkers back in Safari 142"})]}),"\n",(0,i.jsxs)(n.p,{children:["Instead, we could use the ",(0,i.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API",children:"BroadcastChannel API"})," to communicate between tabs and then apply a ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/broadcast-channel#using-the-leaderelection",children:"leader election"})," between them. The ",(0,i.jsx)(n.a,{href:"/leader-election.html",children:"leader election"})," ensures that, no matter how many tabs are open, always one tab is the ",(0,i.jsx)(n.code,{children:"Leader"}),"."]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"./files/leader-election.gif",alt:"Leader Election",width:"500"})}),"\n",(0,i.jsx)(n.p,{children:"The disadvantage is that the leader election process takes some time on the initial page load (about 150 milliseconds). Also the leader election can break when a JavaScript process is fully blocked for a longer time. When this happens, a good way is to just reload the browser tab to restart the election process."}),"\n",(0,i.jsx)(n.h2,{id:"further-read",children:"Further read"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://github.com/pubkey/client-side-databases",children:"Offline First Database Comparison"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://nolanlawson.com/2021/08/22/speeding-up-indexeddb-reads-and-writes/",children:"Speeding up IndexedDB reads and writes"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://hackaday.com/2021/08/24/sqlite-on-the-web-absurd-sql/",children:"SQLITE ON THE WEB: ABSURD-SQL"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://anita-app.com/blog/articles/sqlite-in-a-pwa-with-file-system-access-api.html",children:"SQLite in a PWA with FileSystemAccessAPI"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"https://ravendb.net/articles/re-why-indexeddb-is-slow-and-what-to-use-instead",children:"Response to this article by Oren Eini"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/8b4bf532.36358d72.js b/docs/assets/js/8b4bf532.36358d72.js deleted file mode 100644 index 0e2518c0c54..00000000000 --- a/docs/assets/js/8b4bf532.36358d72.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[4027],{7507(e,a,t){t.r(a),t.d(a,{default:()=>r});var i=t(544),n=t(4848);function r(){return(0,i.default)({sem:{id:"gads",metaTitle:"The NoSQL Database for JavaScript Applications",title:(0,n.jsxs)(n.Fragment,{children:["The easiest way to ",(0,n.jsx)("b",{children:"store"})," and ",(0,n.jsx)("b",{children:"sync"})," NoSQL Data"]}),text:(0,n.jsx)(n.Fragment,{children:"Store NoSQL data inside your App to build high performance realtime applications that sync data with the backend and even work when offline."})}})}}}]); \ No newline at end of file diff --git a/docs/assets/js/8bc07e20.d1b7c7db.js b/docs/assets/js/8bc07e20.d1b7c7db.js deleted file mode 100644 index 3bd656dc92e..00000000000 --- a/docs/assets/js/8bc07e20.d1b7c7db.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[1850],{3247(e,s,r){r.d(s,{g:()=>i});var n=r(4848);function i(e){const s=[];let r=null;return e.children.forEach(e=>{e.props.id?(r&&s.push(r),r={headline:e,paragraphs:[]}):r&&r.paragraphs.push(e)}),r&&s.push(r),(0,n.jsx)("div",{style:a.stepsContainer,children:s.map((e,s)=>(0,n.jsxs)("div",{style:a.stepWrapper,children:[(0,n.jsxs)("div",{style:a.stepIndicator,children:[(0,n.jsx)("div",{style:a.stepNumber,children:s+1}),(0,n.jsx)("div",{style:a.verticalLine})]}),(0,n.jsxs)("div",{style:a.stepContent,children:[(0,n.jsx)("div",{children:e.headline}),e.paragraphs.map((e,s)=>(0,n.jsx)("div",{style:a.item,children:e},s))]})]},s))})}const a={stepsContainer:{display:"flex",flexDirection:"column"},stepWrapper:{display:"flex",alignItems:"stretch",marginBottom:"1.5rem",position:"relative",minWidth:0},stepIndicator:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",width:"33px",marginRight:"1rem",minWidth:0},stepNumber:{width:"33px",height:"33px",borderRadius:"50%",backgroundColor:"var(--color-top)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:"bold",marginTop:-4},verticalLine:{position:"absolute",top:29,bottom:"0",left:"50%",width:"1px",background:"linear-gradient(to bottom, var(--color-top) 0%, var(--color-top) 80%, rgba(0,0,0,0) 100%)",transform:"translateX(-50%)"},stepContent:{flex:1,minWidth:0,overflowWrap:"break-word"},item:{marginTop:"0.5rem"}}},3628(e,s,r){r.r(s),r.d(s,{assets:()=>d,contentTitle:()=>c,default:()=>x,frontMatter:()=>l,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"capacitor-database","title":"Capacitor Database Guide - SQLite, RxDB & More","description":"Explore Capacitor\'s top data storage solutions - from key-value to real-time databases. Compare SQLite, RxDB, and more in this in-depth guide.","source":"@site/docs/capacitor-database.md","sourceDirName":".","slug":"/capacitor-database.html","permalink":"/capacitor-database.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Capacitor Database Guide - SQLite, RxDB & More","slug":"capacitor-database.html","description":"Explore Capacitor\'s top data storage solutions - from key-value to real-time databases. Compare SQLite, RxDB, and more in this in-depth guide."},"sidebar":"tutorialSidebar","previous":{"title":"IndexedDB Database in React Apps - The Power of RxDB","permalink":"/articles/react-indexeddb.html"},"next":{"title":"Alternatives for realtime local-first JavaScript applications and local databases","permalink":"/alternatives.html"}}');var i=r(4848),a=r(8453),o=r(2636),t=r(3247);const l={title:"Capacitor Database Guide - SQLite, RxDB & More",slug:"capacitor-database.html",description:"Explore Capacitor's top data storage solutions - from key-value to real-time databases. Compare SQLite, RxDB, and more in this in-depth guide."},c="Capacitor Database - SQLite, RxDB and others",d={},h=[{value:"Database Solutions for Capacitor",id:"database-solutions-for-capacitor",level:2},{value:"Preferences API",id:"preferences-api",level:3},{value:"Localstorage/IndexedDB/WebSQL",id:"localstorageindexeddbwebsql",level:3},{value:"SQLite",id:"sqlite",level:3},{value:"RxDB",id:"rxdb",level:3},{value:"Import RxDB and SQLite",id:"import-rxdb-and-sqlite",level:3},{value:"Import the RxDB SQLite Storage",id:"import-the-rxdb-sqlite-storage",level:3},{value:"RxDB Core",id:"rxdb-core",level:4},{value:"RxDB Premium \ud83d\udc51",id:"rxdb-premium-",level:4},{value:"Create a Database with the Storage",id:"create-a-database-with-the-storage",level:3},{value:"RxDB Core",id:"rxdb-core-1",level:4},{value:"RxDB Premium \ud83d\udc51",id:"rxdb-premium--1",level:4},{value:"Add a Collection",id:"add-a-collection",level:3},{value:"Insert a Document",id:"insert-a-document",level:3},{value:"Run a Query",id:"run-a-query",level:3},{value:"Observe a Query",id:"observe-a-query",level:3},{value:"Follow up",id:"follow-up",level:2}];function p(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"capacitor-database---sqlite-rxdb-and-others",children:"Capacitor Database - SQLite, RxDB and others"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://capacitorjs.com/",children:"Capacitor"})," is an open source native JavaScript runtime to build Web based Native apps. You can use it to create cross-platform iOS, Android, and Progressive Web Apps with the web technologies JavaScript, HTML, and CSS.\nIt is developed by the Ionic Team and provides a great alternative to create hybrid apps. Compared to ",(0,i.jsx)(s.a,{href:"/react-native-database.html",children:"React Native"}),", Capacitor is more Web-Like because the JavaScript runtime supports most Web APIs like IndexedDB, fetch, and so on."]}),"\n",(0,i.jsx)(s.p,{children:"To read and write persistent data in Capacitor, there are multiple solutions which are shown in the following."}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"./files/icons/capacitor.svg",alt:"Capacitor",width:"50"})}),"\n",(0,i.jsx)(s.h2,{id:"database-solutions-for-capacitor",children:"Database Solutions for Capacitor"}),"\n",(0,i.jsx)(s.h3,{id:"preferences-api",children:"Preferences API"}),"\n",(0,i.jsxs)(s.p,{children:["Capacitor comes with a native ",(0,i.jsx)(s.a,{href:"https://capacitorjs.com/docs/apis/preferences",children:"Preferences API"})," which is a simple, persistent key->value store for lightweight data, similar to the browsers localstorage or React Native ",(0,i.jsx)(s.a,{href:"/react-native-database.html#asyncstorage",children:"AsyncStorage"}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["To use it, you first have to install it from npm ",(0,i.jsx)(s.code,{children:"npm install @capacitor/preferences"})," and then you can import it and write/read data.\nNotice that all calls to the preferences API are asynchronous so they return a ",(0,i.jsx)(s.code,{children:"Promise"})," that must be ",(0,i.jsx)(s.code,{children:"await"}),"-ed."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { Preferences } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '@capacitor/preferences'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// write"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" Preferences"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".set"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" key"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foo'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" value"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'baar'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// read"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"value"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" Preferences"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".get"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ key"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foo'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }); "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// > 'bar'"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// delete"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" Preferences"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".remove"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ key"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foo'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})]})]})})}),"\n",(0,i.jsx)(s.p,{children:"The preferences API is good when only a small amount of data needs to be stored and when no query capabilities besides the key access are required. Complex queries or other features like indexes or replication are not supported which makes the preferences API not suitable for anything more than storing simple data like user settings."}),"\n",(0,i.jsx)(s.h3,{id:"localstorageindexeddbwebsql",children:"Localstorage/IndexedDB/WebSQL"}),"\n",(0,i.jsxs)(s.p,{children:["Since Capacitor apps run in a web view, Web APIs like IndexedDB, ",(0,i.jsx)(s.a,{href:"/articles/localstorage.html",children:"Localstorage"})," and WebSQL are available. But the default browser behavior is to clean up these storages regularly when they are not in use for a long time or the device is low on space. Therefore you cannot 100% rely on the persistence of the stored data and your application needs to expect that the data will be lost eventually."]}),"\n",(0,i.jsx)(s.p,{children:"Storing data in these storages can be done in browsers, because there is no other option. But in Capacitor iOS and Android, you should not rely on these."}),"\n",(0,i.jsx)(s.h3,{id:"sqlite",children:"SQLite"}),"\n",(0,i.jsx)(s.p,{children:"SQLite is a SQL based relational database written in C that was crafted to be embed inside of applications. Operations are written in the SQL query language and SQLite generally follows the PostgreSQL syntax."}),"\n",(0,i.jsx)(s.p,{children:"To use SQLite in Capacitor, there are three options:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["The ",(0,i.jsx)(s.a,{href:"https://github.com/capacitor-community/sqlite",children:"@capacitor-community/sqlite"})," package"]}),"\n",(0,i.jsxs)(s.li,{children:["The ",(0,i.jsx)(s.a,{href:"https://github.com/storesafe/cordova-sqlite-storage",children:"cordova-sqlite-storage"})," package"]}),"\n",(0,i.jsxs)(s.li,{children:["The non-free ",(0,i.jsx)(s.a,{href:"/articles/ionic-database.html",children:"Ionic"})," ",(0,i.jsx)(s.a,{href:"https://ionic.io/products/secure-storage",children:"Secure Storage"})," which comes at ",(0,i.jsx)(s.strong,{children:"999$"})," per month."]}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["It is recommended to use the ",(0,i.jsx)(s.code,{children:"@capacitor-community/sqlite"})," because it has the best maintenance and is open source. Install it first ",(0,i.jsx)(s.code,{children:"npm install --save @capacitor-community/sqlite"})," and then set the storage location for iOS apps:"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"json","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"json","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"{"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "plugins"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "CapacitorSQLite"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "iosDatabaseLocation"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "Library/CapacitorDatabase"'})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.p,{children:"Now you can create a database connection and use the SQLite database."}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { Capacitor } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '@capacitor/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" CapacitorSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" SQLiteDBConnection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" SQLiteConnection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" capSQLiteSet"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" capSQLiteChanges"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" capSQLiteValues"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" capEchoResult"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" capSQLiteResult"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" capNCDatabasePathResult"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '@capacitor-community/sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" sqlite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" SQLiteConnection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(CapacitorSQLite);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" SQLiteDBConnection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" this"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"sqlite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".createConnection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" databaseName"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" encrypted"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" mode"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" readOnly"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"let"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { rows } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".query"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'SELECT somevalue FROM sometable'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})}),"\n",(0,i.jsx)(s.p,{children:"The downside of SQLite is that it is lacking many features that are handful when using a database together with an UI based application like your Capacitor app. For example it is not possible to observe queries or document fields. Also there is no realtime replication feature, you can only import json files. This makes SQLite a good solution when you just want to store data on the client, but when you want to sync data with a server or other clients or create big complex realtime applications, you have to use something else."}),"\n",(0,i.jsx)(s.h3,{id:"rxdb",children:"RxDB"}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"./files/logo/rxdb_javascript_database.svg",alt:"RxDB",width:"170"})}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://rxdb.info/",children:"RxDB"})," is an local first, NoSQL database for JavaScript Applications like hybrid apps. Because it is reactive, you can subscribe to all state changes like the result of a query or even a single field of a document. This is great for UI-based realtime applications in a way that makes it easy to develop realtime applications like what you need in Capacitor."]}),"\n",(0,i.jsxs)(s.p,{children:["Because RxDB is made for Web applications, most of the ",(0,i.jsx)(s.a,{href:"/rx-storage.html",children:"available RxStorage"})," plugins can be used to store and query data in a Capacitor app. However it is recommended to use the ",(0,i.jsx)(s.a,{href:"/rx-storage-sqlite.html",children:"SQLite RxStorage"})," because it stores the data on the filesystem of the device, not in the JavaScript runtime (like IndexedDB). Storing data on the filesystem ensures it is persistent and will not be cleaned up by any process. Also the performance of SQLite is ",(0,i.jsx)(s.a,{href:"/rx-storage.html#performance-comparison",children:"much faster"})," compared to IndexedDB, because SQLite does not have to go through a browsers permission layers. For the SQLite binding you should use the ",(0,i.jsx)(s.a,{href:"https://github.com/capacitor-community/sqlite",children:"@capacitor-community/sqlite"})," package."]}),"\n",(0,i.jsxs)(s.p,{children:["Because the SQLite RxStorage is part of the ",(0,i.jsx)(s.a,{href:"/premium/",children:"\ud83d\udc51 Premium Plugins"})," which must be purchased, it is recommended to use the ",(0,i.jsx)(s.a,{href:"/rx-storage-localstorage.html",children:"LocalStorage RxStorage"})," while testing and prototyping your Capacitor app."]}),"\n",(0,i.jsxs)(s.p,{children:["To use the SQLite RxStorage in Capacitor you have to install all dependencies via ",(0,i.jsx)(s.code,{children:"npm install rxdb rxjs rxdb-premium @capacitor-community/sqlite"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"For iOS apps you should add a database location in your Capacitor settings:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"json","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"json","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"{"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "plugins"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "CapacitorSQLite"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "iosDatabaseLocation"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "Library/CapacitorDatabase"'})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.p,{children:"Then you can assemble the RxStorage and create a database with it:"}),"\n",(0,i.jsxs)(t.g,{children:[(0,i.jsx)(s.h3,{id:"import-rxdb-and-sqlite",children:"Import RxDB and SQLite"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" CapacitorSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" SQLiteConnection"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '@capacitor-community/sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { Capacitor } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '@capacitor/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" sqlite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" SQLiteConnection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(CapacitorSQLite);"})]})]})})}),(0,i.jsx)(s.h3,{id:"import-the-rxdb-sqlite-storage",children:"Import the RxDB SQLite Storage"}),(0,i.jsxs)(o.t,{children:[(0,i.jsx)(s.h4,{id:"rxdb-core",children:"RxDB Core"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageSQLiteTrial"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getSQLiteBasicsCapacitor"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]})]})})}),(0,i.jsx)(s.h4,{id:"rxdb-premium-",children:"RxDB Premium \ud83d\udc51"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getSQLiteBasicsCapacitor"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-sqlite'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]})]})})})]}),(0,i.jsx)(s.h3,{id:"create-a-database-with-the-storage",children:"Create a Database with the Storage"}),(0,i.jsxs)(o.t,{children:[(0,i.jsx)(s.h4,{id:"rxdb-core-1",children:"RxDB Core"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// create database"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSQLiteTrial"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqliteBasics"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getSQLiteBasicsCapacitor"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(sqlite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" Capacitor)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(s.h4,{id:"rxdb-premium--1",children:"RxDB Premium \ud83d\udc51"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// create database"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSQLite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sqliteBasics"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getSQLiteBasicsCapacitor"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(sqlite"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" Capacitor)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})})]}),(0,i.jsx)(s.h3,{id:"add-a-collection",children:"Add a Collection"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// create collections"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" collections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" humans"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'number'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'name'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(s.h3,{id:"insert-a-document",children:"Insert a Document"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" collections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"humans"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foo'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bar'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})]})})})}),(0,i.jsx)(s.h3,{id:"run-a-query",children:"Run a Query"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" result"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" collections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"humans"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bar'"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"})"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),(0,i.jsx)(s.h3,{id:"observe-a-query",children:"Observe a Query"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" collections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"humans"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bar'"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"})."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"$"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(result "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})]})]})})})]}),"\n",(0,i.jsx)(s.h2,{id:"follow-up",children:"Follow up"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["If you haven't done yet, you should start learning about RxDB with the ",(0,i.jsx)(s.a,{href:"/quickstart.html",children:"Quickstart Tutorial"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["There is a followup list of other ",(0,i.jsx)(s.a,{href:"/alternatives.html",children:"client side database alternatives"}),"."]}),"\n"]})]})}function x(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},8453(e,s,r){r.d(s,{R:()=>o,x:()=>t});var n=r(6540);const i={},a=n.createContext(i);function o(e){const s=n.useContext(a);return n.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(i):e.components||i:o(e.components),n.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/8bc82b1f.9df61a79.js b/docs/assets/js/8bc82b1f.9df61a79.js deleted file mode 100644 index 26fd09299ed..00000000000 --- a/docs/assets/js/8bc82b1f.9df61a79.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9997],{2591(e,n,s){s.r(n),s.d(n,{assets:()=>t,contentTitle:()=>a,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"rx-pipeline","title":"RxPipeline - Automate Data Flows in RxDB","description":"Discover how RxPipeline automates your data workflows. Seamlessly process writes, manage leader election, and ensure crash-safe operations in RxDB.","source":"@site/docs/rx-pipeline.md","sourceDirName":".","slug":"/rx-pipeline.html","permalink":"/rx-pipeline.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxPipeline - Automate Data Flows in RxDB","slug":"rx-pipeline.html","description":"Discover how RxPipeline automates your data workflows. Seamlessly process writes, manage leader election, and ensure crash-safe operations in RxDB."},"sidebar":"tutorialSidebar","previous":{"title":"Attachments","permalink":"/rx-attachment.html"},"next":{"title":"Custom Reactivity","permalink":"/reactivity.html"}}');var i=s(4848),o=s(8453);const l={title:"RxPipeline - Automate Data Flows in RxDB",slug:"rx-pipeline.html",description:"Discover how RxPipeline automates your data workflows. Seamlessly process writes, manage leader election, and ensure crash-safe operations in RxDB."},a="RxPipeline",t={},c=[{value:"Creating a RxPipeline",id:"creating-a-rxpipeline",level:2},{value:"Use Cases for RxPipeline",id:"use-cases-for-rxpipeline",level:2},{value:"UseCase: Re-Index data that comes from replication",id:"usecase-re-index-data-that-comes-from-replication",level:3},{value:"UseCase: Fulltext Search",id:"usecase-fulltext-search",level:3},{value:"UseCase: Download data based on source documents",id:"usecase-download-data-based-on-source-documents",level:3},{value:"RxPipeline methods",id:"rxpipeline-methods",level:2},{value:"awaitIdle()",id:"awaitidle",level:3},{value:"close()",id:"close",level:3},{value:"remove()",id:"remove",level:3},{value:"Using RxPipeline correctly",id:"using-rxpipeline-correctly",level:2},{value:"Pipeline handlers must be idempotent",id:"pipeline-handlers-must-be-idempotent",level:3},{value:"Pipeline handlers must not throw",id:"pipeline-handlers-must-not-throw",level:3},{value:"Be careful when doing http requests in the handler",id:"be-careful-when-doing-http-requests-in-the-handler",level:3},{value:"Pipelines temporarily block external reads and writes",id:"pipelines-temporarily-block-external-reads-and-writes",level:3}];function d(e){const n={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"rxpipeline",children:"RxPipeline"})}),"\n",(0,i.jsx)(n.p,{children:"The RxPipeline plugin enables you to run operations depending on writes to a collection.\nWhenever a write happens on the source collection of a pipeline, a handler is called to process the writes and run operations on another collection."}),"\n",(0,i.jsx)(n.p,{children:"You could have a similar behavior by observing the collection stream and process data on emits:"}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsx)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"mySourceCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"$"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(event "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ...process...*/"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})]})})})}),"\n",(0,i.jsx)(n.p,{children:"While this could work in some cases, it causes many problems that are fixed by using the pipeline plugin instead:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["In an RxPipeline, only the ",(0,i.jsx)(n.a,{href:"/leader-election.html",children:"Leading Instance"})," runs the operations. For example when you have multiple browser tabs open, only one will run the processing and when that tab is closed, another tab will become elected leader and continue the pipeline processing."]}),"\n",(0,i.jsx)(n.li,{children:"On sudden stops and restarts of the JavaScript process, the processing will continue at the correct checkpoint and not miss out any documents even on unexpected crashes."}),"\n",(0,i.jsx)(n.li,{children:"Reads/Writes on the destination collection are halted while the pipeline is processing. This ensures your queries only return fully processed documents and no partial results. So when you run a query to the destination collection directly after a write to the source collection, you can be sure your query results are up to date and the pipeline has already been run at the moment the query resolved:"}),"\n"]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" mySourceCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Because our pipeline blocks reads to the destination,"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * we know that the result array contains data created"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * on top of the previously inserted documents."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" result"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myDestinationCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),"\n",(0,i.jsx)(n.h2,{id:"creating-a-rxpipeline",children:"Creating a RxPipeline"}),"\n",(0,i.jsxs)(n.p,{children:["Pipelines are created on top of a source ",(0,i.jsx)(n.a,{href:"/rx-collection.html",children:"RxCollection"})," and have another ",(0,i.jsx)(n.code,{children:"RxCollection"})," as destination. An identifier is used to identify the state of the pipeline so that different pipelines have a different processing checkpoint state. A plain JavaScript function ",(0,i.jsx)(n.code,{children:"handler"})," is used to process the data of the source collection writes."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" pipeline"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" mySourceCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addPipeline"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" identifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-pipeline'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" destination"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myDestinationCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (docs) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Here you can process the documents and write to"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * the destination collection."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" for"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" of"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" docs) {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myDestinationCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".insert"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".primary"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" category"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".category"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(n.h2,{id:"use-cases-for-rxpipeline",children:"Use Cases for RxPipeline"}),"\n",(0,i.jsx)(n.p,{children:"The RxPipeline is a handy building block for different features and plugins. You can use it to aggregate data or restructure local data."}),"\n",(0,i.jsx)(n.h3,{id:"usecase-re-index-data-that-comes-from-replication",children:"UseCase: Re-Index data that comes from replication"}),"\n",(0,i.jsxs)(n.p,{children:["Sometimes you want to ",(0,i.jsx)(n.a,{href:"/replication.html",children:"replicate"})," atomic documents over the wire but locally you want to split these documents for better indexing. For example you replicate email documents that have multiple receivers in a string-array. While string-arrays cannot be indexed, locally you need a way to query for all emails of a given receiver.\nTo handle this case you can set up a RxPipeline that writes the mapping into a separate collection:"]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" pipeline"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" emailCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addPipeline"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" identifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'map-email-receivers'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" destination"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" emailByReceiverCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (docs) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" for"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" of"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" docs) {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // remove previous mapping"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" emailByReceiverCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({emailId"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".primary})"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".remove"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // add new mapping"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".deleted) {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" emailByReceiverCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".bulkInsert"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"receivers"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".map"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(receiver "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" emailId"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".primary"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" receiver"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" receiver"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }))"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(n.p,{children:'With this you can efficiently query for "all emails that a person received" by running:'}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" mailIds"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" emailByReceiverCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" receiver"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foobar@example.com'"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"})"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),"\n",(0,i.jsx)(n.h3,{id:"usecase-fulltext-search",children:"UseCase: Fulltext Search"}),"\n",(0,i.jsx)(n.p,{children:"You can utilize the pipeline plugin to index text data for efficient fulltext search."}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" pipeline"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" emailCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addPipeline"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" identifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'email-fulltext-search'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" destination"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" mailByWordCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (docs) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" for"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" of"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" docs) {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // remove previous mapping"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" mailByWordCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({emailId"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".primary})"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".remove"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // add new mapping"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".deleted) {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" words"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"text"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".split"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"' '"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" mailByWordCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".bulkInsert"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" words"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".map"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(word "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" emailId"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".primary"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" word"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" word"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }))"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(n.p,{children:'With this you can efficiently query for "all emails that contain a given word" by running:'}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsx)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" mailIds"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" emailByReceiverCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({word"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'foobar'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"})"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})})})}),"\n",(0,i.jsx)(n.h3,{id:"usecase-download-data-based-on-source-documents",children:"UseCase: Download data based on source documents"}),"\n",(0,i.jsx)(n.p,{children:"When you have to fetch data for each document of a collection from a server, you can use the pipeline to ensure all documents have their data downloaded and no document is missed."}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" pipeline"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" emailCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addPipeline"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" identifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'download-data'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" destination"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" serverDataCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (docs) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" for"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" of"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" docs) {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" response"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" fetch"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'https://example.com/doc/'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".primary);"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" serverData"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" response"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".json"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" serverDataCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".upsert"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".primary"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" data"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" serverData"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(n.h2,{id:"rxpipeline-methods",children:"RxPipeline methods"}),"\n",(0,i.jsx)(n.h3,{id:"awaitidle",children:"awaitIdle()"}),"\n",(0,i.jsxs)(n.p,{children:["You can await the idleness of a pipeline with ",(0,i.jsx)(n.code,{children:"await myRxPipeline.awaitIdle()"}),". This will await a promise that resolves when the pipeline has processed all documents and is not running anymore."]}),"\n",(0,i.jsx)(n.h3,{id:"close",children:"close()"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"await myRxPipeline.close()"})," stops the pipeline so that it is no longer doing stuff. This is automatically called when the RxCollection or RxDatabase of the pipeline is closed."]}),"\n",(0,i.jsx)(n.h3,{id:"remove",children:"remove()"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"await myRxPipeline.remove()"})," removes the pipeline and all metadata which it has stored. Recreating the pipeline afterwards will start processing all source documents from scratch."]}),"\n",(0,i.jsx)(n.h2,{id:"using-rxpipeline-correctly",children:"Using RxPipeline correctly"}),"\n",(0,i.jsx)(n.h3,{id:"pipeline-handlers-must-be-idempotent",children:"Pipeline handlers must be idempotent"}),"\n",(0,i.jsx)(n.p,{children:"Because a JavaScript process can exit at any time, like when the user closes a browser tab, the pipeline handler function must be idempotent. This means when it only runs partially and is started again with the same input, it should still end up in the correct result."}),"\n",(0,i.jsx)(n.h3,{id:"pipeline-handlers-must-not-throw",children:"Pipeline handlers must not throw"}),"\n",(0,i.jsxs)(n.p,{children:["Pipeline handlers must never throw. If you run operations inside of the handler that might cause errors, you must wrap the handler's code with a ",(0,i.jsx)(n.code,{children:"try-catch"})," by yourself and also handle retries. If your handler throws, your pipeline will be stuck and no longer be usable, which should never happen."]}),"\n",(0,i.jsx)(n.h3,{id:"be-careful-when-doing-http-requests-in-the-handler",children:"Be careful when doing http requests in the handler"}),"\n",(0,i.jsxs)(n.p,{children:["When you run http requests inside of your handler, you no longer have an ",(0,i.jsx)(n.a,{href:"/offline-first.html",children:"offline first"})," application because reads to the destination collection will be blocked until all handlers have finished. When your client is offline, therefore the collection will be blocked for reads and writes."]}),"\n",(0,i.jsx)(n.h3,{id:"pipelines-temporarily-block-external-reads-and-writes",children:"Pipelines temporarily block external reads and writes"}),"\n",(0,i.jsxs)(n.p,{children:["While a pipeline is running, ",(0,i.jsx)(n.strong,{children:"all reads and writes to its destination collection are blocked"}),". This guarantees that queries never observe partially processed data, but it also means that pipelines can block each other if they interact incorrectly."]}),"\n",(0,i.jsx)(n.p,{children:"Problems occur when multiple pipelines:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"read or write across the same collections, or"}),"\n",(0,i.jsxs)(n.li,{children:["wait for each other using ",(0,i.jsx)(n.code,{children:"awaitIdle()"})," from inside a pipeline handler."]}),"\n"]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// Example of a deadlock"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// Pipeline A: files \u2192 files (reads folders)"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" pipelineA"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"files"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addPipeline"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" identifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'file-path-sync'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" destination"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".files"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (docs) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" folders"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" folders"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(); "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// can block"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// Pipeline B: files \u2192 folders (waits for A)"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"folders"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addPipeline"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" identifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'file-count'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" destination"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".folders"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" pipelineA"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".awaitIdle"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(); "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// \u274c may deadlock"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(n.p,{children:"To prevent deadlocks, consider:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Never call ",(0,i.jsx)(n.code,{children:"awaitIdle()"})," inside a pipeline handler."]}),"\n",(0,i.jsx)(n.li,{children:"Avoid circular dependencies between pipelines."}),"\n",(0,i.jsx)(n.li,{children:"Prefer one-directional data flow."}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453(e,n,s){s.d(n,{R:()=>l,x:()=>a});var r=s(6540);const i={},o=r.createContext(i);function l(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/8bfd920a.7d84a9e9.js b/docs/assets/js/8bfd920a.7d84a9e9.js deleted file mode 100644 index 7847091bdad..00000000000 --- a/docs/assets/js/8bfd920a.7d84a9e9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[2631],{8453(e,s,n){n.d(s,{R:()=>l,x:()=>a});var r=n(6540);const i={},o=r.createContext(i);function l(e){const s=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function a(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),r.createElement(o.Provider,{value:s},e.children)}},9678(e,s,n){n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>a,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"articles/ionic-storage","title":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","description":"The best Ionic storage solution? RxDB empowers your hybrid apps with offline-first capabilities, secure encryption, data compression, and seamless data syncing to any backend.","source":"@site/docs/articles/ionic-storage.md","sourceDirName":"articles","slug":"/articles/ionic-storage.html","permalink":"/articles/ionic-storage.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","slug":"ionic-storage.html","description":"The best Ionic storage solution? RxDB empowers your hybrid apps with offline-first capabilities, secure encryption, data compression, and seamless data syncing to any backend."},"sidebar":"tutorialSidebar","previous":{"title":"RxDB - The Perfect Ionic Database","permalink":"/articles/ionic-database.html"},"next":{"title":"RxDB - The JSON Database Built for JavaScript","permalink":"/articles/json-database.html"}}');var i=n(4848),o=n(8453);const l={title:"RxDB - Local Ionic Storage with Encryption, Compression & Sync",slug:"ionic-storage.html",description:"The best Ionic storage solution? RxDB empowers your hybrid apps with offline-first capabilities, secure encryption, data compression, and seamless data syncing to any backend."},a="RxDB - Local Ionic Storage with Encryption, Compression & Sync",t={},c=[{value:"Why RxDB for Ionic Storage?",id:"why-rxdb-for-ionic-storage",level:2},{value:"1. Offline-Ready NoSQL Storage",id:"1-offline-ready-nosql-storage",level:3},{value:"2. Powerful Encryption",id:"2-powerful-encryption",level:3},{value:"3. Built-In Data Compression",id:"3-built-in-data-compression",level:3},{value:"4. Real-Time Sync & Conflict Handling",id:"4-real-time-sync--conflict-handling",level:3},{value:"5. Easy to Adopt and Extend",id:"5-easy-to-adopt-and-extend",level:3},{value:"Quick Start: Implementing RxDB with LocalSTorage Storage",id:"quick-start-implementing-rxdb-with-localstorage-storage",level:2},{value:"Encryption Example",id:"encryption-example",level:2},{value:"Compression Example",id:"compression-example",level:2},{value:"RxDB vs. Other Ionic Storage Options",id:"rxdb-vs-other-ionic-storage-options",level:2},{value:"Follow Up",id:"follow-up",level:2}];function d(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"rxdb---local-ionic-storage-with-encryption-compression--sync",children:"RxDB - Local Ionic Storage with Encryption, Compression & Sync"})}),"\n",(0,i.jsxs)(s.p,{children:["When building ",(0,i.jsx)(s.strong,{children:"Ionic"})," apps, developers face the challenge of choosing a robust ",(0,i.jsx)(s.strong,{children:"Ionic storage"})," mechanism that supports:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Offline-First"})," usage"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Data Encryption"})," to protect sensitive content"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Compression"})," to reduce storage usage and improve performance"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Seamless Sync"})," with any backend for real-time updates"]}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://rxdb.info/",children:"RxDB"})," (Reactive Database) offers all these features in a single, ",(0,i.jsx)(s.a,{href:"/articles/local-first-future.html",children:"local-first"})," database solution tailored to ",(0,i.jsx)(s.strong,{children:"Ionic"})," and other hybrid frameworks. Keep reading to learn how RxDB solves the most common storage pitfalls in hybrid app development while providing unmatched flexibility."]}),"\n",(0,i.jsx)("br",{}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"../files/icons/ionic.svg",alt:"Ionic Database Storage",width:"120"})})}),"\n",(0,i.jsx)("br",{}),"\n",(0,i.jsx)(s.h2,{id:"why-rxdb-for-ionic-storage",children:"Why RxDB for Ionic Storage?"}),"\n",(0,i.jsx)(s.h3,{id:"1-offline-ready-nosql-storage",children:"1. Offline-Ready NoSQL Storage"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"/offline-first.html",children:"Offline functionality"})," is crucial for modern mobile applications, particularly when devices encounter unreliable or slow networks. RxDB stores all data ",(0,i.jsx)(s.strong,{children:"locally"})," so your Ionic app can run seamlessly without needing a continuous internet connection. When a network is available again, RxDB automatically synchronizes changes with your backend - no extra code required."]}),"\n",(0,i.jsx)(s.h3,{id:"2-powerful-encryption",children:"2. Powerful Encryption"}),"\n",(0,i.jsxs)(s.p,{children:["Securing on-device data is paramount when handling sensitive information. RxDB includes ",(0,i.jsx)(s.a,{href:"../encryption.html",children:"encryption plugins"})," that let you:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Encrypt"})," data fields at rest with AES"]}),"\n",(0,i.jsx)(s.li,{children:"Invalidate data access by simply withholding the password"}),"\n",(0,i.jsx)(s.li,{children:"Keep your users' data confidential, even if the device is stolen"}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"This built-in encryption sets RxDB apart from many other Ionic storage options that lack integrated security."}),"\n",(0,i.jsx)(s.h3,{id:"3-built-in-data-compression",children:"3. Built-In Data Compression"}),"\n",(0,i.jsxs)(s.p,{children:["Large or repetitive data can significantly slow down devices with minimal memory. RxDB's ",(0,i.jsx)(s.a,{href:"/key-compression.html",children:"key-compression"})," feature decreases document size stored on the device, improving overall performance by:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Reducing disk usage"}),"\n",(0,i.jsx)(s.li,{children:"Accelerating queries"}),"\n",(0,i.jsx)(s.li,{children:"Minimizing network overhead when syncing"}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"4-real-time-sync--conflict-handling",children:"4. Real-Time Sync & Conflict Handling"}),"\n",(0,i.jsxs)(s.p,{children:["In addition to functioning fully offline, RxDB supports advanced ",(0,i.jsx)(s.a,{href:"/replication.html",children:"replication"})," options. Your Ionic app can instantly sync updates with any backend (",(0,i.jsx)(s.a,{href:"/replication-couchdb.html",children:"CouchDB"}),", ",(0,i.jsx)(s.a,{href:"/replication-firestore.html",children:"Firestore"}),", ",(0,i.jsx)(s.a,{href:"/replication-graphql.html",children:"GraphQL"}),", or ",(0,i.jsx)(s.a,{href:"/replication-http.html",children:"custom REST"}),"), maintaining a ",(0,i.jsx)(s.a,{href:"/articles/realtime-database.html",children:"real-time"})," user experience. Plus, RxDB handles ",(0,i.jsx)(s.a,{href:"/transactions-conflicts-revisions.html",children:"conflicts"})," gracefully - meaning less worry about clashing user edits."]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"../files/database-replication.png",alt:"database replication",width:"200"})}),"\n",(0,i.jsx)(s.h3,{id:"5-easy-to-adopt-and-extend",children:"5. Easy to Adopt and Extend"}),"\n",(0,i.jsxs)(s.p,{children:["RxDB runs with a ",(0,i.jsx)(s.strong,{children:"NoSQL"})," approach and integrates seamlessly into ",(0,i.jsx)(s.a,{href:"https://ionicframework.com/docs/angular/overview",children:"Ionic Angular"})," or other frameworks you might use with Ionic. You can extend or replace storage backends, add encryption, or build advanced offline-first features with minimal overhead."]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"Ionic Storage Database",width:"220"})})}),"\n",(0,i.jsx)(s.h2,{id:"quick-start-implementing-rxdb-with-localstorage-storage",children:"Quick Start: Implementing RxDB with LocalSTorage Storage"}),"\n",(0,i.jsxs)(s.p,{children:["For a simple proof-of-concept or testing environment in ",(0,i.jsx)(s.a,{href:"/articles/ionic-database.html",children:"Ionic"}),", you can use ",(0,i.jsx)(s.a,{href:"/rx-storage-localstorage.html",children:"localstorage"})," as your underlying storage. Later, if you need better native performance, you can ",(0,i.jsx)(s.strong,{children:"switch to the SQLite storage"})," offered by the ",(0,i.jsx)(s.a,{href:"https://rxdb.info/premium/",children:"RxDB Premium plugins"}),"."]}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.strong,{children:"Install RxDB"})}),"\n"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" rxdb"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" rxjs"})]})})})}),"\n",(0,i.jsxs)(s.ol,{start:"2",children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.strong,{children:"Initialize the Database"})}),"\n"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" initDB"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myionicdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" multiInstance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // or true if you plan multi-tab usage"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Note: If you need encryption, set `password` here"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" notes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'notes schema'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" content"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" timestamp"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'number'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" db;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsxs)(s.ol,{start:"3",children:["\n",(0,i.jsx)(s.li,{children:(0,i.jsx)(s.strong,{children:"Ready to Upgrade Later?"})}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["When you need the best performance on mobile devices, purchase the RxDB ",(0,i.jsx)(s.a,{href:"/premium/",children:"Premium"})," ",(0,i.jsx)(s.a,{href:"/rx-storage-sqlite.html",children:"SQLite Storage"})," and replace ",(0,i.jsx)(s.code,{children:"getRxStorageLocalstorage()"})," with ",(0,i.jsx)(s.code,{children:"getRxStorageSQLite()"})," - your app logic remains largely the same. You only have to change the configuration."]}),"\n",(0,i.jsx)(s.h2,{id:"encryption-example",children:"Encryption Example"}),"\n",(0,i.jsxs)(s.p,{children:["To secure local data, add the crypto-js ",(0,i.jsx)(s.a,{href:"/encryption.html",children:"encryption plugin"})," (free version) or the ",(0,i.jsx)(s.a,{href:"/premium/",children:"premium"})," web-crypto plugin. Below is an example using the free crypto-js plugin:"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { wrappedKeyEncryptionCryptoJsStorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/encryption-crypto-js'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" initEncryptedDB"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" encryptedStorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" wrappedKeyEncryptionCryptoJsStorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'secureIonicDB'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" encryptedStorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" password"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myS3cretP4ssw0rd'"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" secrets"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'secret schema'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" text"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // all fields in this array will be stored encrypted:"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" encrypted"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'text'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" db;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.p,{children:"With encryption enabled:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.code,{children:"text"})," is automatically encrypted at rest."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/rx-query.html",children:"Queries"})," on encrypted fields are not directly possible (since data is encrypted), but once a document is loaded, RxDB decrypts it for normal usage."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"compression-example",children:"Compression Example"}),"\n",(0,i.jsxs)(s.p,{children:["To minimize the storage footprint, RxDB offers a ",(0,i.jsx)(s.a,{href:"/key-compression.html",children:"key-compression"})," feature. You can enable it in your schema:"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" logs"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'logs schema'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" keyCompression"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // enable compression"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" message"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" createdAt"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" format"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'date-time'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.p,{children:["With ",(0,i.jsx)(s.code,{children:"keyCompression: true"}),", RxDB shortens field names internally, significantly reducing document size. This helps both stored data and network transport during replication."]}),"\n",(0,i.jsx)(s.h2,{id:"rxdb-vs-other-ionic-storage-options",children:"RxDB vs. Other Ionic Storage Options"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Ionic Native Storage"})," or ",(0,i.jsx)(s.strong,{children:"Capacitor-based"})," key-value stores may handle small amounts of data but lack advanced features like:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Complex queries"}),"\n",(0,i.jsx)(s.li,{children:"Full NoSQL document model"}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/offline-first.html",children:"Offline-first"})," ",(0,i.jsx)(s.a,{href:"/replication.html",children:"sync"})]}),"\n",(0,i.jsx)(s.li,{children:"Encryption & key compression out of the box"}),"\n",(0,i.jsx)(s.li,{children:"RxDB stands out by delivering all these capabilities in a unified library."}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,i.jsxs)(s.p,{children:["For Ionic storage that supports offline-first operations, built-in encryption, optional data compression, and live syncing with any backend, RxDB provides a powerful solution. Start quickly with ",(0,i.jsx)(s.a,{href:"/rx-storage-localstorage.html",children:"localstorage"})," for local development and testing - then scale up to the premium SQLite storage for optimal performance on production mobile devices."]}),"\n",(0,i.jsx)(s.p,{children:"Ready to learn more?"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Explore the ",(0,i.jsx)(s.a,{href:"/quickstart.html",children:"RxDB Quickstart Guide"})]}),"\n",(0,i.jsxs)(s.li,{children:["Check out ",(0,i.jsx)(s.a,{href:"/encryption.html",children:"RxDB Encryption"})," to protect user data"]}),"\n",(0,i.jsxs)(s.li,{children:["Learn about ",(0,i.jsx)(s.a,{href:"/rx-storage-sqlite.html",children:"SQLite Storage"})," in ",(0,i.jsx)(s.a,{href:"/premium/",children:"RxDB Premium"})," for top ",(0,i.jsx)(s.a,{href:"/rx-storage-performance.html",children:"performance"})," on mobile."]}),"\n",(0,i.jsxs)(s.li,{children:["Join our community on the ",(0,i.jsx)(s.a,{href:"/chat/",children:"RxDB Chat"})]}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"RxDB"})," - The ultimate toolkit for Ionic developers seeking offline-first, secure, and compressed local data, with real-time sync to any server."]})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/90102fdf.191788f5.js b/docs/assets/js/90102fdf.191788f5.js deleted file mode 100644 index 6fb54b6d969..00000000000 --- a/docs/assets/js/90102fdf.191788f5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[2633],{9935(e,a,t){t.r(a),t.d(a,{default:()=>r});var s=t(544),n=t(4848);function r(){return(0,s.default)({sem:{id:"gads",metaTitle:"The local Database for Node.js",appName:"Node.js",title:(0,n.jsxs)(n.Fragment,{children:["The easiest way to ",(0,n.jsx)("b",{children:"store"})," and ",(0,n.jsx)("b",{children:"sync"})," Data in Node.js"]}),text:(0,n.jsx)(n.Fragment,{children:"Fast in-app database for Node.js. Build high performance realtime applications that sync data from the anywhere and even work when offline."})}})}}}]); \ No newline at end of file diff --git a/docs/assets/js/9187.d599c63b.js b/docs/assets/js/9187.d599c63b.js deleted file mode 100644 index ae345c96f1c..00000000000 --- a/docs/assets/js/9187.d599c63b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9187],{9187(b,h,s){s.r(h)}}]); \ No newline at end of file diff --git a/docs/assets/js/91b454ee.57807487.js b/docs/assets/js/91b454ee.57807487.js deleted file mode 100644 index b4d2e4d6ae7..00000000000 --- a/docs/assets/js/91b454ee.57807487.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[4202],{449(e,n,s){s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"rx-storage-sharding","title":"Sharding RxStorage \ud83d\udc51","description":"With the sharding plugin, you can improve the write and query times of some RxStorage implementations.","source":"@site/docs/rx-storage-sharding.md","sourceDirName":".","slug":"/rx-storage-sharding.html","permalink":"/rx-storage-sharding.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Sharding RxStorage \ud83d\udc51","slug":"rx-storage-sharding.html"},"sidebar":"tutorialSidebar","previous":{"title":"Memory Mapped RxStorage \ud83d\udc51","permalink":"/rx-storage-memory-mapped.html"},"next":{"title":"Localstorage Meta Optimizer \ud83d\udc51","permalink":"/rx-storage-localstorage-meta-optimizer.html"}}');var a=s(4848),i=s(8453);const o={title:"Sharding RxStorage \ud83d\udc51",slug:"rx-storage-sharding.html"},t="Sharding RxStorage",l={},d=[{value:"Using the sharding plugin",id:"using-the-sharding-plugin",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",span:"span",strong:"strong",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.header,{children:(0,a.jsx)(n.h1,{id:"sharding-rxstorage",children:"Sharding RxStorage"})}),"\n",(0,a.jsxs)(n.p,{children:["With the sharding plugin, you can improve the write and query times of ",(0,a.jsx)(n.strong,{children:"some"})," ",(0,a.jsx)(n.code,{children:"RxStorage"})," implementations.\nFor example on ",(0,a.jsx)(n.a,{href:"/slow-indexeddb.html",children:"slow IndexedDB"}),", a performance gain of ",(0,a.jsx)(n.strong,{children:"30-50% on reads"}),", and ",(0,a.jsx)(n.strong,{children:"25% on writes"})," can be achieved by using multiple IndexedDB Stores instead of putting all documents into the same store."]}),"\n",(0,a.jsxs)(n.p,{children:["The sharding plugin works as a wrapper around any other ",(0,a.jsx)(n.code,{children:"RxStorage"}),". The sharding plugin will automatically create multiple shards per storage instance and it will merge and split read and write calls to it."]}),"\n",(0,a.jsx)(n.admonition,{title:"Premium",type:"note",children:(0,a.jsxs)(n.p,{children:["The sharding plugin is part of ",(0,a.jsx)(n.a,{href:"/premium/",children:"RxDB Premium \ud83d\udc51"}),". It is not part of the default RxDB module."]})}),"\n",(0,a.jsx)(n.h2,{id:"using-the-sharding-plugin",children:"Using the sharding plugin"}),"\n",(0,a.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,a.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageSharding"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-sharding'"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * First wrap the original RxStorage with the sharding RxStorage."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" shardedRxStorage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageSharding"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Here we use the localStorage RxStorage,"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * it is also possible to use any other RxStorage instead."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Add the sharding options to your schema."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Changing these options will require a data migration."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" mySchema"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" sharding"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Amount of shards per RxStorage instance."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Depending on your data size and query patterns, the optimal shard amount may differ."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Do a performance test to optimize that value."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * 10 Shards is a good value to start with."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * "})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * IMPORTANT: Changing the value of shards is not possible on a already existing database state,"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * you will loose access to your data."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" shards"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Sharding mode,"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * you can either shard by collection or by database."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * For most cases you should use 'collection' which will shard on the collection level."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * For example with the IndexedDB RxStorage, it will then create multiple stores per IndexedDB database"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * and not multiple IndexedDB databases, which would be slower."})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" mode"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'collection'"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Create the RxDatabase with the wrapped RxStorage. "})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(n.span,{"data-line":"",children:[(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" shardedRxStorage"})]}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:(0,a.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(n.span,{"data-line":"",children:" "})]})})})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(c,{...e})}):c(e)}},8453(e,n,s){s.d(n,{R:()=>o,x:()=>t});var r=s(6540);const a={},i=r.createContext(a);function o(e){const n=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/924d6dd6.ee7a4ff8.js b/docs/assets/js/924d6dd6.ee7a4ff8.js deleted file mode 100644 index 45c0660b19d..00000000000 --- a/docs/assets/js/924d6dd6.ee7a4ff8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[5122],{7665(e,r,n){n.r(r),n.d(r,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"electron","title":"Seamless Electron Storage with RxDB","description":"Use the RxDB Electron Plugin to share data between main and renderer processes. Enjoy quick queries, real-time sync, and robust offline support.","source":"@site/docs/electron.md","sourceDirName":".","slug":"/electron.html","permalink":"/electron.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Seamless Electron Storage with RxDB","slug":"electron.html","description":"Use the RxDB Electron Plugin to share data between main and renderer processes. Enjoy quick queries, real-time sync, and robust offline support."},"sidebar":"tutorialSidebar","previous":{"title":"Localstorage Meta Optimizer \ud83d\udc51","permalink":"/rx-storage-localstorage-meta-optimizer.html"},"next":{"title":"\u2699\ufe0f Sync Engine","permalink":"/replication.html"}}');var o=n(4848),i=n(8453);const a={title:"Seamless Electron Storage with RxDB",slug:"electron.html",description:"Use the RxDB Electron Plugin to share data between main and renderer processes. Enjoy quick queries, real-time sync, and robust offline support."},t="Electron Plugin",l={},c=[{value:"RxStorage Electron IpcRenderer & IpcMain",id:"rxstorage-electron-ipcrenderer--ipcmain",level:2},{value:"Related",id:"related",level:2}];function d(e){const r={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",span:"span",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(r.header,{children:(0,o.jsx)(r.h1,{id:"electron-plugin",children:"Electron Plugin"})}),"\n",(0,o.jsx)(r.h2,{id:"rxstorage-electron-ipcrenderer--ipcmain",children:"RxStorage Electron IpcRenderer & IpcMain"}),"\n",(0,o.jsxs)(r.p,{children:["To use RxDB in ",(0,o.jsx)(r.a,{href:"/electron-database.html",children:"electron"}),", it is recommended to run the RxStorage in the main process and the RxDatabase in the renderer processes. With the rxdb electron plugin you can create a remote RxStorage and consume it from the renderer process."]}),"\n",(0,o.jsxs)(r.p,{children:["To do this in a convenient way, the RxDB electron plugin provides the helper functions ",(0,o.jsx)(r.code,{children:"exposeIpcMainRxStorage"})," and ",(0,o.jsx)(r.code,{children:"getRxStorageIpcRenderer"}),".\nSimilar to the ",(0,o.jsx)(r.a,{href:"/rx-storage-worker.html",children:"Worker RxStorage"}),", these wrap any other ",(0,o.jsx)(r.a,{href:"/rx-storage.html",children:"RxStorage"})," once in the main process and once in each renderer process. In the renderer you can then use the storage to create a ",(0,o.jsx)(r.a,{href:"/rx-database.html",children:"RxDatabase"})," which communicates with the storage of the main process to store and query data."]}),"\n",(0,o.jsx)(r.admonition,{type:"note",children:(0,o.jsxs)(r.p,{children:[(0,o.jsx)(r.code,{children:"nodeIntegration"})," must be enabled in ",(0,o.jsx)(r.a,{href:"https://www.electronjs.org/docs/latest/api/browser-window#new-browserwindowoptions",children:"Electron"}),"."]})}),"\n",(0,o.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"// main.js"})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:"exposeIpcMainRxStorage"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" } "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'rxdb/plugins/electron'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:"getRxStorageMemory"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" } "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'rxdb/plugins/storage-memory'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:"app"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:".on"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'ready'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" () {"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" exposeIpcMainRxStorage"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" key"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'main-storage'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageMemory"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" ipcMain"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" electron"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:".ipcMain"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(r.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(r.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(r.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"// renderer.js"})}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:"getRxStorageIpcRenderer"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" } "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'rxdb/plugins/electron'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:"getRxStorageMemory"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" } "}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'rxdb/plugins/storage-memory'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIpcRenderer"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" key"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'main-storage'"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(r.span,{"data-line":"",children:[(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" ipcRenderer"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-constant)"},children:" electron"}),(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:".ipcRenderer"})]}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(r.span,{"data-line":"",children:(0,o.jsx)(r.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"})})]})})}),"\n",(0,o.jsx)(r.h2,{id:"related",children:"Related"}),"\n",(0,o.jsxs)(r.ul,{children:["\n",(0,o.jsx)(r.li,{children:(0,o.jsx)(r.a,{href:"/electron-database.html",children:"Comparison of Electron Databases"})}),"\n"]})]})}function h(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453(e,r,n){n.d(r,{R:()=>a,x:()=>t});var s=n(6540);const o={},i=s.createContext(o);function a(e){const r=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function t(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),s.createElement(i.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/92698a99.49ff7265.js b/docs/assets/js/92698a99.49ff7265.js deleted file mode 100644 index 7408eec9552..00000000000 --- a/docs/assets/js/92698a99.49ff7265.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[4166],{7379(e,s,r){r.r(s),r.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"rx-storage-indexeddb","title":"Instant Performance with IndexedDB RxStorage","description":"Choose IndexedDB RxStorage for unmatched speed and minimal build size. Perfect for fast-performing apps that demand reliable, lightweight data solutions.","source":"@site/docs/rx-storage-indexeddb.md","sourceDirName":".","slug":"/rx-storage-indexeddb.html","permalink":"/rx-storage-indexeddb.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Instant Performance with IndexedDB RxStorage","slug":"rx-storage-indexeddb.html","description":"Choose IndexedDB RxStorage for unmatched speed and minimal build size. Perfect for fast-performing apps that demand reliable, lightweight data solutions."},"sidebar":"tutorialSidebar","previous":{"title":"LocalStorage (Browser)","permalink":"/rx-storage-localstorage.html"},"next":{"title":"OPFS \ud83d\udc51 (Browser)","permalink":"/rx-storage-opfs.html"}}');var o=r(4848),i=r(8453);const a={title:"Instant Performance with IndexedDB RxStorage",slug:"rx-storage-indexeddb.html",description:"Choose IndexedDB RxStorage for unmatched speed and minimal build size. Perfect for fast-performing apps that demand reliable, lightweight data solutions."},t="IndexedDB RxStorage",l={},d=[{value:"IndexedDB performance comparison",id:"indexeddb-performance-comparison",level:2},{value:"Using the IndexedDB RxStorage",id:"using-the-indexeddb-rxstorage",level:2},{value:"Overwrite/Polyfill the native IndexedDB",id:"overwritepolyfill-the-native-indexeddb",level:2},{value:"Storage Buckets",id:"storage-buckets",level:2},{value:"Limitations of the IndexedDB RxStorage",id:"limitations-of-the-indexeddb-rxstorage",level:2}];function c(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",span:"span",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"indexeddb-rxstorage",children:"IndexedDB RxStorage"})}),"\n",(0,o.jsxs)(s.p,{children:["The IndexedDB ",(0,o.jsx)(s.a,{href:"/rx-storage.html",children:"RxStorage"})," is based on plain IndexedDB and can be used in browsers, ",(0,o.jsx)(s.a,{href:"/electron-database.html",children:"electron"})," or hybrid apps.\nCompared to other browser based storages, the IndexedDB storage has the smallest write- and read latency, the fastest initial page load\nand the smallest build size. Only for big datasets (more than 10k documents), the ",(0,o.jsx)(s.a,{href:"/rx-storage-opfs.html",children:"OPFS storage"})," is better suited."]}),"\n",(0,o.jsxs)(s.p,{children:["While the IndexedDB API itself can be very slow, the IndexedDB storage uses many tricks and performance optimizations, some of which are described ",(0,o.jsx)(s.a,{href:"/slow-indexeddb.html",children:"here"}),". For example it uses custom index strings instead of the native IndexedDB indexes, batches cursor for faster bulk reads and many other improvements. The IndexedDB storage also operates on ",(0,o.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Write-ahead_logging",children:"Write-ahead logging"})," similar to SQLite, to improve write latency while still ensuring consistency on writes."]}),"\n",(0,o.jsx)(s.h2,{id:"indexeddb-performance-comparison",children:"IndexedDB performance comparison"}),"\n",(0,o.jsxs)(s.p,{children:["Here is some performance comparison with other storages. Compared to the non-memory storages like ",(0,o.jsx)(s.a,{href:"/rx-storage-opfs.html",children:"OPFS"})," and ",(0,o.jsx)(s.a,{href:"/rx-storage-sqlite.html",children:"WASM SQLite"}),". IndexedDB has the smallest build size and fastest write speed. Only OPFS is faster on queries over big datasets. See ",(0,o.jsx)(s.a,{href:"/rx-storage-performance.html",children:"performance comparison"})," page for a comparison with all storages."]}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{src:"./files/rx-storage-performance-browser.png",alt:"IndexedDB performance",width:"700"})}),"\n",(0,o.jsx)(s.h2,{id:"using-the-indexeddb-rxstorage",children:"Using the IndexedDB RxStorage"}),"\n",(0,o.jsxs)(s.p,{children:["To use the indexedDB storage you import it from the ",(0,o.jsx)(s.a,{href:"/premium/",children:"RxDB Premium \ud83d\udc51"})," npm module and use ",(0,o.jsx)(s.code,{children:"getRxStorageIndexedDB()"})," when creating the ",(0,o.jsx)(s.a,{href:"/rx-database.html",children:"RxDatabase"}),"."]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageIndexedDB"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-indexeddb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * For better performance, queries run with a batched cursor."})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * You can change the batchSize to optimize the query time"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * for specific queries."})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * You should only change this value when you are also doing performance measurements."})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * [default=300]"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 300"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(s.h2,{id:"overwritepolyfill-the-native-indexeddb",children:"Overwrite/Polyfill the native IndexedDB"}),"\n",(0,o.jsxs)(s.p,{children:["Node.js has no IndexedDB API. To still run the IndexedDB ",(0,o.jsx)(s.code,{children:"RxStorage"})," in Node.js, for example to run unit tests, you have to polyfill it.\nYou can do that by using the ",(0,o.jsx)(s.a,{href:"https://github.com/dumbmatter/fakeIndexedDB",children:"fake-indexeddb"})," module and pass it to the ",(0,o.jsx)(s.code,{children:"getRxStorageIndexedDB()"})," function."]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageIndexedDB } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-indexeddb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"//> npm install fake-indexeddb --save"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" fakeIndexedDB"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'fake-indexeddb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" fakeIDBKeyRange"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" require"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'fake-indexeddb/lib/FDBKeyRange'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" indexedDB"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" fakeIndexedDB"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" IDBKeyRange"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" fakeIDBKeyRange"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "})]})})}),"\n",(0,o.jsx)(s.h2,{id:"storage-buckets",children:"Storage Buckets"}),"\n",(0,o.jsxs)(s.p,{children:["The ",(0,o.jsx)(s.a,{href:"https://wicg.github.io/storage-buckets/",children:"Storage Buckets API"}),' provides a way for sites to organize locally stored data into groupings called "storage buckets". This allows the user agent or sites to manage and delete buckets independently rather than applying the same treatment to all the data from a single origin. ',(0,o.jsx)(s.a,{href:"https://developer.chrome.com/docs/web-platform/storage-buckets?hl=en",children:"Read More"})]}),"\n",(0,o.jsxs)(s.p,{children:["To use different storage buckets with the RxDB IndexedDB Storage, you can use a function instead of a plain object when providing the ",(0,o.jsx)(s.code,{children:"indexedDB"})," attribute:"]}),"\n",(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageIndexedDB } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-indexeddb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'exampledb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" indexedDB"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(params) "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myStorageBucket"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" navigator"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"storageBuckets"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".open"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'myApp-'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" params"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".databaseName);"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myStorageBucket"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".indexedDB;"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" IDBKeyRange"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(s.h2,{id:"limitations-of-the-indexeddb-rxstorage",children:"Limitations of the IndexedDB RxStorage"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsxs)(s.li,{children:["It is part of the ",(0,o.jsx)(s.a,{href:"/premium/",children:"RxDB Premium \ud83d\udc51"})," plugin that must be purchased. If you just need a storage that works in the browser and you do not have to care about performance, you can use the ",(0,o.jsx)(s.a,{href:"/rx-storage-localstorage.html",children:"LocalStorage storage"})," instead."]}),"\n",(0,o.jsxs)(s.li,{children:["The IndexedDB storage requires support for ",(0,o.jsx)(s.a,{href:"https://caniuse.com/indexeddb2",children:"IndexedDB v2"}),", it does not work on Internet Explorer."]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},8453(e,s,r){r.d(s,{R:()=>a,x:()=>t});var n=r(6540);const o={},i=n.createContext(o);function a(e){const s=n.useContext(i);return n.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(o):e.components||o:a(e.components),n.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/9293.098c020a.js b/docs/assets/js/9293.098c020a.js deleted file mode 100644 index 7f0327c62a9..00000000000 --- a/docs/assets/js/9293.098c020a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9293],{5955(e,t,i){i.d(t,{A:()=>h});i(6540);var s=i(4164),n=i(1312),r=i(1107),l=i(4848);function h({className:e}){return(0,l.jsx)("main",{className:(0,s.A)("container margin-vert--xl",e),children:(0,l.jsx)("div",{className:"row",children:(0,l.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,l.jsxs)(r.A,{as:"h1",className:"hero__title",children:[(0,l.jsx)("a",{href:"/",children:(0,l.jsx)("div",{style:{textAlign:"center"},children:(0,l.jsx)("img",{src:"https://rxdb.info/files/logo/rxdb_javascript_database.svg",alt:"RxDB",width:"160"})})}),(0,l.jsx)(n.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"404 Page Not Found"})]}),(0,l.jsx)("p",{children:(0,l.jsx)(n.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"The page you are looking for does not exist anymore or never has existed. If you have found this page through a link, you should tell the link author to update it."})}),(0,l.jsx)("p",{children:"Maybe one of these can help you to find the desired content:"}),(0,l.jsx)("div",{className:"ul-container",children:(0,l.jsxs)("ul",{children:[(0,l.jsx)("li",{children:(0,l.jsx)("a",{href:"https://rxdb.info/overview.html",children:"RxDB Documentation"})}),(0,l.jsx)("li",{children:(0,l.jsx)("a",{href:"/chat/",children:"RxDB Discord Channel"})}),(0,l.jsx)("li",{children:(0,l.jsx)("a",{href:"https://twitter.com/intent/user?screen_name=rxdbjs",children:"RxDB on twitter"})}),(0,l.jsx)("li",{children:(0,l.jsx)("a",{href:"/code/",children:"RxDB at Github"})})]})})]})})})}},9293(e,t,i){i.r(t),i.d(t,{default:()=>a});i(6540);var s=i(1312),n=i(5500),r=i(8711),l=i(5955),h=i(4848);function a(){const e=(0,s.T)({id:"theme.NotFound.title",message:"RxDB - 404 Page Not Found"});return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(n.be,{title:e}),(0,h.jsx)(r.A,{title:"RxDB - 404 Page Not Found",children:(0,h.jsx)(l.A,{})})]})}}}]); \ No newline at end of file diff --git a/docs/assets/js/931f4566.40f8ed4e.js b/docs/assets/js/931f4566.40f8ed4e.js deleted file mode 100644 index aae8f38e701..00000000000 --- a/docs/assets/js/931f4566.40f8ed4e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[3595],{8288(e,s,n){n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"schema-validation","title":"Schema Validation","description":"RxDB has multiple validation implementations that can be used to ensure that your document data is always matching the provided JSON","source":"@site/docs/schema-validation.md","sourceDirName":".","slug":"/schema-validation.html","permalink":"/schema-validation.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Schema Validation","slug":"schema-validation.html"},"sidebar":"tutorialSidebar","previous":{"title":"FoundationDB","permalink":"/rx-storage-foundationdb.html"},"next":{"title":"Encryption","permalink":"/encryption.html"}}');var i=n(4848),a=n(8453);const o={title:"Schema Validation",slug:"schema-validation.html"},t="Schema validation",l={},d=[{value:"validate-ajv",id:"validate-ajv",level:3},{value:"validate-z-schema",id:"validate-z-schema",level:3},{value:"validate-is-my-json-valid",id:"validate-is-my-json-valid",level:3},{value:"Custom Formats",id:"custom-formats",level:2},{value:"Ajv Custom Format",id:"ajv-custom-format",level:3},{value:"Z-Schema Custom Format",id:"z-schema-custom-format",level:3},{value:"Performance comparison of the validators",id:"performance-comparison-of-the-validators",level:2}];function c(e){const s={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"schema-validation",children:"Schema validation"})}),"\n",(0,i.jsxs)(s.p,{children:["RxDB has multiple validation implementations that can be used to ensure that your document data is always matching the provided JSON\nschema of your ",(0,i.jsx)(s.code,{children:"RxCollection"}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["The schema validation is ",(0,i.jsx)(s.strong,{children:"not a plugin"})," but comes in as a wrapper around any other ",(0,i.jsx)(s.code,{children:"RxStorage"})," and it will then validate all data that is written into that storage. This is required for multiple reasons:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["It allows us to run the validation inside of a ",(0,i.jsx)(s.a,{href:"/rx-storage-worker.html",children:"Worker RxStorage"})," instead of running it in the main JavaScript process."]}),"\n",(0,i.jsxs)(s.li,{children:["It allows us to configure which ",(0,i.jsx)(s.code,{children:"RxDatabase"})," instance must use the validation and which does not. In production it often makes sense to validate user data, but you might not need the validation for data that is only replicated from the backend."]}),"\n"]}),"\n",(0,i.jsx)(s.admonition,{type:"warning",children:(0,i.jsxs)(s.p,{children:["Schema validation can be ",(0,i.jsx)(s.strong,{children:"CPU expensive"})," and increases your build size. You should always use a schema validation in development mode. For most use cases, you ",(0,i.jsx)(s.strong,{children:"should not"})," use a validation in production for better performance."]})}),"\n",(0,i.jsxs)(s.p,{children:["When no validation is used, any document data can be saved but there might be ",(0,i.jsx)(s.strong,{children:"undefined behavior"})," when saving data that does not comply to the schema of a ",(0,i.jsx)(s.code,{children:"RxCollection"}),"."]}),"\n",(0,i.jsxs)(s.p,{children:["RxDB has different implementations to validate data, each of them is based on a different ",(0,i.jsx)(s.a,{href:"https://json-schema.org/tools",children:"JSON Schema library"}),". In this example we use the ",(0,i.jsx)(s.a,{href:"/rx-storage-localstorage.html",children:"LocalStorage RxStorage"}),", but you can wrap the validation around ",(0,i.jsx)(s.strong,{children:"any other"})," ",(0,i.jsx)(s.a,{href:"/rx-storage.html",children:"RxStorage"}),"."]}),"\n",(0,i.jsx)(s.h3,{id:"validate-ajv",children:"validate-ajv"}),"\n",(0,i.jsxs)(s.p,{children:["A validation-module that does the schema-validation. This one is using ",(0,i.jsx)(s.a,{href:"https://github.com/epoberezkin/ajv",children:"ajv"})," as validator which is a bit faster. Better compliant to the jsonschema-standard but also has a bigger build-size."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { wrappedValidateAjvStorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/validate-ajv'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// wrap the validation around the main RxStorage"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" wrappedValidateAjvStorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" randomCouchString"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"10"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.h3,{id:"validate-z-schema",children:"validate-z-schema"}),"\n",(0,i.jsxs)(s.p,{children:["Both ",(0,i.jsx)(s.code,{children:"is-my-json-valid"})," and ",(0,i.jsx)(s.code,{children:"validate-ajv"})," use ",(0,i.jsx)(s.code,{children:"eval()"})," to perform validation which might not be wanted when ",(0,i.jsx)(s.code,{children:"'unsafe-eval'"})," is not allowed in Content Security Policies. This one is using ",(0,i.jsx)(s.a,{href:"https://github.com/zaggino/z-schema",children:"z-schema"})," as validator which doesn't use ",(0,i.jsx)(s.code,{children:"eval"}),"."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { wrappedValidateZSchemaStorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/validate-z-schema'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// wrap the validation around the main RxStorage"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" wrappedValidateZSchemaStorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" randomCouchString"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"10"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.h3,{id:"validate-is-my-json-valid",children:"validate-is-my-json-valid"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"WARNING"}),": The ",(0,i.jsx)(s.code,{children:"is-my-json-valid"})," validation is no longer supported until ",(0,i.jsx)(s.a,{href:"https://github.com/mafintosh/is-my-json-valid/pull/192",children:"this bug"})," is fixed."]}),"\n",(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.code,{children:"validate-is-my-json-valid"})," plugin uses ",(0,i.jsx)(s.a,{href:"https://www.npmjs.com/package/is-my-json-valid",children:"is-my-json-valid"})," for schema validation."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { wrappedValidateIsMyJsonValidStorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/validate-is-my-json-valid'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// wrap the validation around the main RxStorage"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" wrappedValidateIsMyJsonValidStorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" randomCouchString"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"10"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.h2,{id:"custom-formats",children:"Custom Formats"}),"\n",(0,i.jsxs)(s.p,{children:["The schema validators provide methods to add custom formats like a ",(0,i.jsx)(s.code,{children:"email"})," format.\nYou have to add these formats ",(0,i.jsx)(s.strong,{children:"before"})," you create your database."]}),"\n",(0,i.jsx)(s.h3,{id:"ajv-custom-format",children:"Ajv Custom Format"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getAjv } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/validate-ajv'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" ajv"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getAjv"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"ajv"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addFormat"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'email'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" validate"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" v "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" v"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".includes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'@'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:") "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// ensure email fields contain the @ symbol"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.h3,{id:"z-schema-custom-format",children:"Z-Schema Custom Format"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { ZSchemaClass } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/validate-z-schema'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"ZSchemaClass"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".registerFormat"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'email'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (v"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" string"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:") {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" v"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".includes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'@'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"); "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// ensure email fields contain the @ symbol"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.h2,{id:"performance-comparison-of-the-validators",children:"Performance comparison of the validators"}),"\n",(0,i.jsxs)(s.p,{children:["The RxDB team ran performance benchmarks using two storage options on an Ubuntu 24.04 machine with Chrome version ",(0,i.jsx)(s.code,{children:"131.0.6778.85"}),". The testing machine has 32 core ",(0,i.jsx)(s.code,{children:"13th Gen Intel(R) Core(TM) i9-13900HX"})," CPU."]}),"\n",(0,i.jsx)(s.p,{children:"IndexedDB Storage (based on the IndexedDB API in the browser):"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:(0,i.jsx)(s.strong,{children:"IndexedDB Storage"})}),(0,i.jsx)(s.th,{style:{textAlign:"center"},children:"Time to First insert"}),(0,i.jsx)(s.th,{style:{textAlign:"right"},children:"Insert 3000 documents"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"no validator"}),(0,i.jsx)(s.td,{style:{textAlign:"center"},children:"68 ms"}),(0,i.jsx)(s.td,{style:{textAlign:"right"},children:"213 ms"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"ajv"}),(0,i.jsx)(s.td,{style:{textAlign:"center"},children:"67 ms"}),(0,i.jsx)(s.td,{style:{textAlign:"right"},children:"216 ms"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"z-schema"}),(0,i.jsx)(s.td,{style:{textAlign:"center"},children:"71 ms"}),(0,i.jsx)(s.td,{style:{textAlign:"right"},children:"230 ms"})]})]})]}),"\n",(0,i.jsx)(s.p,{children:"Memory Storage: stores everything in memory for extremely fast reads and writes, with no persistence by default. Often used with the RxDB memory-mapped plugin that processes data in memory an later persists to disc in background:"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:(0,i.jsx)(s.strong,{children:"Memory Storage"})}),(0,i.jsx)(s.th,{style:{textAlign:"center"},children:"Time to First insert"}),(0,i.jsx)(s.th,{style:{textAlign:"right"},children:"Insert 3000 documents"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"no validator"}),(0,i.jsx)(s.td,{style:{textAlign:"center"},children:"1.15 ms"}),(0,i.jsx)(s.td,{style:{textAlign:"right"},children:"0.8 ms"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"ajv"}),(0,i.jsx)(s.td,{style:{textAlign:"center"},children:"3.05 ms"}),(0,i.jsx)(s.td,{style:{textAlign:"right"},children:"2.7 ms"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"z-schema"}),(0,i.jsx)(s.td,{style:{textAlign:"center"},children:"0.9 ms"}),(0,i.jsx)(s.td,{style:{textAlign:"right"},children:"18 ms"})]})]})]}),"\n",(0,i.jsx)(s.p,{children:"Including a validator library also increases your JavaScript bundle size. Here's how it breaks down (minified + gzip):"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsxs)(s.th,{children:[(0,i.jsx)(s.strong,{children:"Build Size"})," (minified+gzip)"]}),(0,i.jsx)(s.th,{style:{textAlign:"center"},children:"Build Size (IndexedDB)"}),(0,i.jsx)(s.th,{style:{textAlign:"right"},children:"Build Size (memory)"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"no validator"}),(0,i.jsx)(s.td,{style:{textAlign:"center"},children:"73103 B"}),(0,i.jsx)(s.td,{style:{textAlign:"right"},children:"39976 B"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"ajv"}),(0,i.jsx)(s.td,{style:{textAlign:"center"},children:"106135 B"}),(0,i.jsx)(s.td,{style:{textAlign:"right"},children:"72773 B"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"z-schema"}),(0,i.jsx)(s.td,{style:{textAlign:"center"},children:"125186 B"}),(0,i.jsx)(s.td,{style:{textAlign:"right"},children:"91882 B"})]})]})]})]})}function h(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453(e,s,n){n.d(s,{R:()=>o,x:()=>t});var r=n(6540);const i={},a=r.createContext(i);function o(e){const s=r.useContext(a);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(i):e.components||i:o(e.components),r.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/951d0efb.94a862cc.js b/docs/assets/js/951d0efb.94a862cc.js deleted file mode 100644 index 641b617da53..00000000000 --- a/docs/assets/js/951d0efb.94a862cc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[6115],{3247(e,n,s){s.d(n,{g:()=>i});var r=s(4848);function i(e){const n=[];let s=null;return e.children.forEach(e=>{e.props.id?(s&&n.push(s),s={headline:e,paragraphs:[]}):s&&s.paragraphs.push(e)}),s&&n.push(s),(0,r.jsx)("div",{style:o.stepsContainer,children:n.map((e,n)=>(0,r.jsxs)("div",{style:o.stepWrapper,children:[(0,r.jsxs)("div",{style:o.stepIndicator,children:[(0,r.jsx)("div",{style:o.stepNumber,children:n+1}),(0,r.jsx)("div",{style:o.verticalLine})]}),(0,r.jsxs)("div",{style:o.stepContent,children:[(0,r.jsx)("div",{children:e.headline}),e.paragraphs.map((e,n)=>(0,r.jsx)("div",{style:o.item,children:e},n))]})]},n))})}const o={stepsContainer:{display:"flex",flexDirection:"column"},stepWrapper:{display:"flex",alignItems:"stretch",marginBottom:"1.5rem",position:"relative",minWidth:0},stepIndicator:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",width:"33px",marginRight:"1rem",minWidth:0},stepNumber:{width:"33px",height:"33px",borderRadius:"50%",backgroundColor:"var(--color-top)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:"bold",marginTop:-4},verticalLine:{position:"absolute",top:29,bottom:"0",left:"50%",width:"1px",background:"linear-gradient(to bottom, var(--color-top) 0%, var(--color-top) 80%, rgba(0,0,0,0) 100%)",transform:"translateX(-50%)"},stepContent:{flex:1,minWidth:0,overflowWrap:"break-word"},item:{marginTop:"0.5rem"}}},5160(e,n,s){s.r(n),s.d(n,{assets:()=>p,contentTitle:()=>h,default:()=>y,frontMatter:()=>d,metadata:()=>r,toc:()=>x});const r=JSON.parse('{"id":"replication-mongodb","title":"MongoDB Realtime Sync Engine for Local-First Apps","description":"Build real-time, offline-capable apps with RxDB + MongoDB replication. Push/pull changes, use change streams, and keep data in sync across devices.","source":"@site/docs/replication-mongodb.md","sourceDirName":".","slug":"/replication-mongodb.html","permalink":"/replication-mongodb.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"MongoDB Realtime Sync Engine for Local-First Apps","slug":"replication-mongodb.html","description":"Build real-time, offline-capable apps with RxDB + MongoDB replication. Push/pull changes, use change streams, and keep data in sync across devices."},"sidebar":"tutorialSidebar","previous":{"title":"Firestore Replication","permalink":"/replication-firestore.html"},"next":{"title":"Supabase Replication","permalink":"/replication-supabase.html"}}');var i=s(4848),o=s(8453),l=s(2636),a=s(3247),t=s(2271),c=s(7482);const d={title:"MongoDB Realtime Sync Engine for Local-First Apps",slug:"replication-mongodb.html",description:"Build real-time, offline-capable apps with RxDB + MongoDB replication. Push/pull changes, use change streams, and keep data in sync across devices."},h="MongoDB Replication Plugin for RxDB - Real-Time, Offline-First Sync",p={},x=[{value:"Key Features",id:"key-features",level:2},{value:"Architecture Overview",id:"architecture-overview",level:2},{value:"Setting up the Client-RxServer-MongoDB Sync",id:"setting-up-the-client-rxserver-mongodb-sync",level:2},{value:"Install the Client Dependencies",id:"install-the-client-dependencies",level:3},{value:"Set up a MongoDB Server",id:"set-up-a-mongodb-server",level:3},{value:"Shell",id:"shell",level:3},{value:"Docker",id:"docker",level:3},{value:"MongoDB Atlas",id:"mongodb-atlas",level:3},{value:"Create a MongoDB Database and Collection",id:"create-a-mongodb-database-and-collection",level:3},{value:"Create a RxDB Database and Collection",id:"create-a-rxdb-database-and-collection",level:3},{value:"Sync the Collection with the MongoDB Server",id:"sync-the-collection-with-the-mongodb-server",level:3},{value:"Start a RxServer",id:"start-a-rxserver",level:3},{value:"Sync a Client with the RxServer",id:"sync-a-client-with-the-rxserver",level:3},{value:"Follow Up",id:"follow-up",level:2}];function k(e){const n={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"mongodb-replication-plugin-for-rxdb---real-time-offline-first-sync",children:"MongoDB Replication Plugin for RxDB - Real-Time, Offline-First Sync"})}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"./files/icons/mongodb.svg",alt:"MongoDB Sync",height:"60",class:"img-padding img-in-text-right"})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.a,{href:"https://www.mongodb.com/",children:"MongoDB"})," Replication Plugin for RxDB delivers seamless, two-way synchronization between MongoDB and RxDB, enabling ",(0,i.jsx)(n.a,{href:"/articles/realtime-database.html",children:"real-time"})," updates and ",(0,i.jsx)(n.a,{href:"/offline-first.html",children:"offline-first"})," functionality for your applications. Built on ",(0,i.jsx)(n.strong,{children:"MongoDB Change Streams"}),", it supports both Atlas and self-hosted deployments, ensuring your data stays consistent across every device and service."]}),"\n",(0,i.jsxs)(n.p,{children:["Behind the scenes, the plugin is powered by the RxDB ",(0,i.jsx)(n.a,{href:"/replication.html",children:"Sync Engine"}),", which manages the complexities of real-world data replication for you. It automatically handles ",(0,i.jsx)(n.a,{href:"/transactions-conflicts-revisions.html",children:"conflict detection and resolution"}),", maintains precise checkpoints for incremental updates, and gracefully manages transitions between offline and online states. This means you don't need to manually implement retry logic, reconcile divergent changes, or worry about data loss during connectivity drops, the Sync Engine ensures consistency and reliability in every sync cycle."]}),"\n",(0,i.jsx)(n.h2,{id:"key-features",children:"Key Features"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Two-way replication"})," between MongoDB and RxDB collections"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Offline-first support"})," with automatic incremental re-sync"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Incremental updates"})," via MongoDB Change Streams"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Conflict resolution"})," handled by the RxDB Sync Engine"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Atlas and self-hosted support"})," for replica sets and sharded clusters"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"architecture-overview",children:"Architecture Overview"}),"\n",(0,i.jsxs)(n.p,{children:["The plugin operates in a three-tier architecture: Clients connect to ",(0,i.jsx)(n.a,{href:"/rx-server.html",children:"RxServer"}),", which in turn connects to MongoDB. RxServer streams changes from MongoDB to connected clients and pushes client-side updates back to MongoDB."]}),"\n",(0,i.jsxs)(n.p,{children:["For the client side, RxServer exposes a ",(0,i.jsx)(n.a,{href:"/rx-server.html#replication-endpoint",children:"replication endpoint"})," over WebSocket or HTTP, which your RxDB-powered applications can consume."]}),"\n",(0,i.jsx)(n.p,{children:"The following diagram illustrates the flow of updates between clients, RxServer, and MongoDB in a live synchronization setup:"}),"\n",(0,i.jsx)(c.u,{dbIcon:"/files/icons/mongodb-icon.svg",dbLabel:"MongoDB"}),"\n",(0,i.jsx)("br",{}),"\n",(0,i.jsx)("br",{}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsx)(n.p,{children:"The MongoDB Replication Plugin is optimized for Node.js environments (e.g., when RxDB runs within RxServer or other backend services). Direct connections from browsers or mobile apps to MongoDB are not supported because MongoDB does not use HTTP as its wire protocol and requires a driver-level connection to a replica set or sharded cluster."})}),"\n",(0,i.jsx)(n.h2,{id:"setting-up-the-client-rxserver-mongodb-sync",children:"Setting up the Client-RxServer-MongoDB Sync"}),"\n",(0,i.jsxs)(a.g,{children:[(0,i.jsx)(n.h3,{id:"install-the-client-dependencies",children:"Install the Client Dependencies"}),(0,i.jsx)(n.p,{children:"In your JavaScript project, install the RxDB libraries and the MongoDB node.js driver:"}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"npm install rxdb rxdb-server mongodb --save"})}),(0,i.jsx)(n.h3,{id:"set-up-a-mongodb-server",children:"Set up a MongoDB Server"}),(0,i.jsxs)(n.p,{children:["As first step, you need access to a running MongoDB Server. This can be done by either running a server locally or using the Atlas Cloud. Notice that we need to have a ",(0,i.jsx)(n.a,{href:"https://www.mongodb.com/docs/manual/tutorial/deploy-replica-set/",children:"replica set"})," because only on these, the MongoDB changestream can be used."]}),(0,i.jsxs)(l.t,{children:[(0,i.jsx)(n.h3,{id:"shell",children:"Shell"}),(0,i.jsx)(n.p,{children:"If you have installed MongoDB locally, you can start the server with this command:"}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"mongod --replSet rs0 --bind_ip_all"})}),(0,i.jsx)(n.h3,{id:"docker",children:"Docker"}),(0,i.jsx)(n.p,{children:"If you have docker installed, you can start a container that runs the MongoDB server:"}),(0,i.jsx)(n.p,{children:(0,i.jsx)(n.code,{children:"docker run -p 27017:27017 -p 27018:27018 -p 27019:27019 --rm --name rxdb-mongodb mongo:8.0.4 mongod --replSet rs0 --bind_ip_all"})}),(0,i.jsx)(n.h3,{id:"mongodb-atlas",children:"MongoDB Atlas"}),(0,i.jsx)(n.p,{children:"Learn here how to create a MongoDB atlas account and how to start a MongoDB cluster that runs in the cloud:"}),(0,i.jsx)("br",{}),(0,i.jsx)("center",{children:(0,i.jsx)(t.N,{videoId:"bBA9rUdqmgY",title:"Create MongoDB Atlas Server",duration:"19:55"})})]}),(0,i.jsx)("br",{}),(0,i.jsxs)(n.p,{children:["After this step you should have a valid connection string that points to a running MongoDB Server like ",(0,i.jsx)(n.code,{children:"mongodb://localhost:27017/"}),"."]}),(0,i.jsx)(n.h3,{id:"create-a-mongodb-database-and-collection",children:"Create a MongoDB Database and Collection"}),(0,i.jsx)(n.p,{children:"On your MongoDB server, make sure to create a database and a collection."}),(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"//> server.ts"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { MongoClient } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mongodb'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" mongoClient"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" MongoClient"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'mongodb://localhost:27017/?directConnection=true'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" mongoDatabase"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" mongoClient"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'my-database'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" mongoDatabase"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".createCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'my-collection'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" changeStreamPreAndPostImages"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { enabled"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["To observe document deletions on the changestream, ",(0,i.jsx)(n.code,{children:"changeStreamPreAndPostImages"})," must be enabled. This is not required if you have an insert/update-only collection where no documents are deleted ever."]})}),(0,i.jsx)(n.h3,{id:"create-a-rxdb-database-and-collection",children:"Create a RxDB Database and Collection"}),(0,i.jsxs)(n.p,{children:["Now we create an RxDB ",(0,i.jsx)(n.a,{href:"/rx-database.html",children:"database"})," and a ",(0,i.jsx)(n.a,{href:"/rx-collection.html",children:"collection"}),". In this example the ",(0,i.jsx)(n.a,{href:"/rx-storage-memory.html",children:"memory storage"}),", in production you would use a ",(0,i.jsx)(n.a,{href:"/rx-storage.html",children:"persistent storage"})," instead."]}),(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"//> server.ts"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" addRxPlugin } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageMemory } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-memory'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// Create server-side RxDB instance"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'serverdb'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageMemory"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// Add your collection schema"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" humans"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'passportId'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" passportId"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" firstName"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" lastName"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'passportId'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'firstName'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'lastName'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,i.jsx)(n.h3,{id:"sync-the-collection-with-the-mongodb-server",children:"Sync the Collection with the MongoDB Server"}),(0,i.jsxs)(n.p,{children:["Now we can start a ",(0,i.jsx)(n.a,{href:"/replication.html",children:"replication"})," that does a two-way replication between the RxDB Collection and the MongoDB Collection."]}),(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"//> server.ts"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { replicateMongoDB } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication-mongodb'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateMongoDB"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" mongodb"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collectionName"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-collection'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" connection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mongodb://localhost:27017'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" databaseName"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-database'"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".humans"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" replicationIdentifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'humans-mongodb-sync'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { batchSize"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 50"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { batchSize"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 50"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" live"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "})]})})}),(0,i.jsx)(n.admonition,{title:"You can do many things with the replication state",type:"note",children:(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"RxMongoDBReplicationState"})," which is returned from ",(0,i.jsx)(n.code,{children:"replicateMongoDB()"})," allows you to run all functionality of the normal ",(0,i.jsx)(n.a,{href:"/replication.html",children:"RxReplicationState"})," like observing errors or doing start/stop operations."]})}),(0,i.jsx)(n.h3,{id:"start-a-rxserver",children:"Start a RxServer"}),(0,i.jsxs)(n.p,{children:["Now that we have a RxDatabase and Collection that is replicated with MongoDB, we can spawn a ",(0,i.jsx)(n.a,{href:"/rx-server.html",children:"RxServer"})," on top of it. This server can then be used by client devices to connect."]}),(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"//> server.ts"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxServer } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-server/plugins/server'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { RxServerAdapterExpress } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-server/plugins/adapter-express'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" server"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" createRxServer"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" database"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" adapter"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" RxServerAdapterExpress"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" port"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 8080"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" cors"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '*'"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" endpoint"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" server"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addReplicationEndpoint"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'humans'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".humans"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Replication endpoint:'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" `http://localhost:8080/"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"${"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"endpoint"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".urlPath"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"`"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// do not forget to start the server!"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" server"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".start"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),(0,i.jsx)(n.h3,{id:"sync-a-client-with-the-rxserver",children:"Sync a Client with the RxServer"}),(0,i.jsx)(n.p,{children:"On the client-side we create the exact same RxDatabase and collection and then replicate it with the replication endpoint of the RxServer."}),(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"//> client.ts"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageDexie } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-dexie'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { replicateServer } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-server/plugins/replication-server'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydb-client'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageDexie"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" humans"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" "})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'passportId'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" passportId"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" firstName"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" lastName"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'passportId'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'firstName'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'lastName'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// Start replication to the RxServer endpoint printed by the server:"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// e.g. http://localhost:8080/humans/0"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateServer"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" replicationIdentifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'humans-rxserver'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".humans"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" url"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'http://localhost:8080/humans/0'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" live"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { batchSize"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 50"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { batchSize"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 50"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "})]})})})]}),"\n",(0,i.jsx)(n.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Try it out with the ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb-mongodb-sync-example",children:"RxDB-MongoDB example repository"})]}),"\n",(0,i.jsxs)(n.li,{children:["Read ",(0,i.jsx)(n.a,{href:"https://www.mongodb.com/company/blog/innovation/from-local-global-scalable-edge-apps-rxdb",children:"From Local to Global: Scalable Edge Apps with RxDB + MongoDB"})]}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/replication.html",children:"Replication API Reference"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/rx-server.html",children:"RxServer Documentation"})}),"\n",(0,i.jsxs)(n.li,{children:["Join our ",(0,i.jsx)(n.a,{href:"./chat",children:"Discord Forum"})," for questions and feedback"]}),"\n"]})]})}function y(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(k,{...e})}):k(e)}},7482(e,n,s){s.d(n,{u:()=>i});s(6540);var r=s(4848);function i({className:e="",style:n,clientLabels:s=["Client A","Client B","Client C"],serverLabel:i="RxServer",dbLabel:o="Backend",dbIcon:l="",showServer:a=!0}){const t="/files/logo/logo.svg",c=a?{}:{gridColumn:"2 / 5",width:"90%",marginLeft:"5%",marginRight:0};return(0,r.jsxs)("div",{className:`rxdb-diagram ${e}`,style:n,children:[(0,r.jsx)("style",{children:'\n .rxdb-diagram {\n padding-top: 20px;\n padding-bottom: 20px;\n box-sizing: border-box;\n color: inherit;\n width: 100%;\n max-width: 100%;\n overflow: hidden;\n margin: 0 auto;\n font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI",\n Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji";\n }\n\n /* Stage keeps fixed aspect ratio and scales */\n .rxdb-diagram .stage {\n width: 100%;\n aspect-ratio: 816 / 336;\n position: relative;\n }\n\n /* Grid fills the stage completely */\n .rxdb-diagram .grid {\n position: absolute;\n inset: 0;\n display: grid;\n grid-template-columns:\n 26.960784% 5.882353% 31.862745% 5.882353% 29.411765%;\n grid-template-rows:\n 23.809524% 14.285714% 23.809524% 14.285714% 23.809524%;\n align-items: center;\n justify-items: stretch;\n }\n\n .rxdb-diagram {\n --stroke: clamp(1px, 0.35vmin, 2px);\n --radius: clamp(8px, 1.2vmin, 14px);\n --pad: clamp(8px, 1.2vmin, 18px);\n --line: currentColor;\n }\n\n .rxdb-diagram .logo {\n height: 1.2em;\n width: auto;\n display: inline-block;\n object-fit: contain;\n margin-right: 10px;\n }\n\n .rxdb-diagram .box {\n border: var(--stroke) dashed var(--line);\n border-radius: var(--radius);\n background: transparent;\n display: flex;\n align-items: center;\n justify-content: center;\n text-align: center;\n font-weight: 600;\n padding: var(--pad);\n line-height: 1.2;\n user-select: none;\n }\n\n /* Server and DB take full height of stage */\n .rxdb-diagram .server,\n .rxdb-diagram .db {\n grid-row: 1 / -1;\n height: 100%;\n }\n\n /* Horizontal arrows */\n .rxdb-diagram .arrow {\n position: relative;\n height: 0;\n border-top: var(--stroke) solid var(--line);\n width: calc(100% - 20%);\n margin-left: 10%;\n margin-right: -1.5%;\n }\n\n .rxdb-diagram .arrow::before,\n .rxdb-diagram .arrow::after {\n content: "";\n position: absolute;\n top: 50%;\n width: clamp(6px, 1.2vmin, 10px);\n height: clamp(6px, 1.2vmin, 10px);\n border-top: var(--stroke) solid var(--line);\n border-right: var(--stroke) solid var(--line);\n transform-origin: center;\n }\n .rxdb-diagram .arrow::before {\n left: 0;\n transform: translate(-0%, -60%) rotate(-135deg);\n }\n .rxdb-diagram .arrow::after {\n right: 0;\n transform: translate(0%, -60%) rotate(45deg);\n }\n '}),(0,r.jsx)("div",{className:"stage","aria-label":a?"Clients to RxServer to MongoDB diagram":"Clients to MongoDB diagram",children:(0,r.jsxs)("div",{className:"grid",children:[(0,r.jsxs)("div",{className:"box",style:{gridColumn:1,gridRow:1},children:[(0,r.jsx)("img",{src:t,alt:"",className:"logo","aria-hidden":!0}),s[0]||"Client A"]}),(0,r.jsx)("div",{className:"arrow",style:{gridColumn:a?2:c.gridColumn,gridRow:1,...a?{}:{width:"90%",marginLeft:"5%",marginRight:0}},"aria-hidden":!0}),a&&(0,r.jsxs)("div",{className:"box server",style:{gridColumn:3},children:[(0,r.jsx)("img",{src:t,alt:"",className:"logo","aria-hidden":!0}),i]}),a&&(0,r.jsx)("div",{className:"arrow",style:{gridColumn:4,gridRow:3},"aria-hidden":!0}),(0,r.jsxs)("div",{className:"box db",style:{gridColumn:5},children:[(0,r.jsx)("img",{src:l,alt:"",className:"logo","aria-hidden":!0}),o]}),(0,r.jsxs)("div",{className:"box",style:{gridColumn:1,gridRow:3},children:[(0,r.jsx)("img",{src:t,alt:"",className:"logo","aria-hidden":!0}),s[1]||"Client B"]}),(0,r.jsx)("div",{className:"arrow",style:{gridColumn:a?2:c.gridColumn,gridRow:3,...a?{}:{width:"90%",marginLeft:"5%",marginRight:0}},"aria-hidden":!0}),(0,r.jsxs)("div",{className:"box",style:{gridColumn:1,gridRow:5},children:[(0,r.jsx)("img",{src:t,alt:"",className:"logo","aria-hidden":!0}),s[2]||"Client C"]}),(0,r.jsx)("div",{className:"arrow",style:{gridColumn:a?2:c.gridColumn,gridRow:5,...a?{}:{width:"90%",marginLeft:"5%",marginRight:0}},"aria-hidden":!0})]})})]})}},8453(e,n,s){s.d(n,{R:()=>l,x:()=>a});var r=s(6540);const i={},o=r.createContext(i);function l(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/98405524.b9ffa436.js b/docs/assets/js/98405524.b9ffa436.js deleted file mode 100644 index 9c02c568d53..00000000000 --- a/docs/assets/js/98405524.b9ffa436.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[5504],{1934(e,s,r){r.r(s),r.d(s,{default:()=>n});var i=r(4586),t=r(8711),l=(r(6540),r(4848));function n(){const{siteConfig:e}=(0,i.A)();return(0,l.jsx)(t.A,{title:`RxDB User Survey - ${e.title}`,description:"RxDB User Survey",children:(0,l.jsx)("main",{children:(0,l.jsxs)("div",{className:"redirectBox",style:{textAlign:"center"},children:[(0,l.jsx)("a",{href:"/",children:(0,l.jsx)("div",{className:"logo",children:(0,l.jsx)("img",{src:"/files/logo/logo_text.svg",alt:"RxDB",width:160})})}),(0,l.jsx)("h1",{children:"RxDB User Survey"}),(0,l.jsx)("p",{children:(0,l.jsx)("b",{children:"You will be redirected in a few seconds."})}),(0,l.jsx)("p",{children:(0,l.jsx)("a",{href:"https://forms.gle/pe8vxaXez1A6X95EA",children:"Click here to open the Survey"})}),(0,l.jsx)("meta",{httpEquiv:"Refresh",content:"0; url=https://forms.gle/pe8vxaXez1A6X95EA"})]})})})}}}]); \ No newline at end of file diff --git a/docs/assets/js/9850.34d66cab.js b/docs/assets/js/9850.34d66cab.js deleted file mode 100644 index 963b66bc4a3..00000000000 --- a/docs/assets/js/9850.34d66cab.js +++ /dev/null @@ -1 +0,0 @@ -(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9850],{175(e,t,n){"use strict";n.d(t,{q:()=>i});var r=n(2235),o=n(3587);const i=(e,t,n)=>{(0,r.vA)((0,r.cy)(t),"Invalid expression. $nor expects value to be an array.");const i=(0,o.s)("$or",t,n);return e=>!i(e)}},235(e,t,n){"use strict";n.d(t,{R0:()=>u,lI:()=>i});var r=n(1693);function o(e){return e[e.length-1]}function i(e){return(t=o(e))&&(0,r.T)(t.schedule)?e.pop():void 0;var t}function u(e,t){return"number"==typeof o(e)?e.pop():t}},558(e,t,n){"use strict";n.d(t,{N:()=>o});var r=n(5964);const o=(e,t,n)=>(0,r.ON)(e,t,n,r.NV)},695(e,t,n){"use strict";n.d(t,{C:()=>u});var r=n(4953),o=n(2235);function i(e,t,n=!0){const r={exclusions:[],inclusions:[],positional:0},u=Object.keys(e);assert(u.length,"Invalid empty sub-projection");const s=t?.idKey;let a=!1;for(const c of u){if(c.startsWith("$"))return assert(!n&&1===u.length,`FieldPath field names may not start with '$', given '${c}'.`),r;c.endsWith(".$")&&r.positional++;const l=e[c];if(!1===l||(0,o.Et)(l)&&0===l)c===s?a=!0:r.exclusions.push(c);else if((0,o.Gv)(l)){const e=i(l,t,!1);e.inclusions.length||e.exclusions.length?(e.inclusions.forEach(e=>r.inclusions.push(`${c}.${e}`)),e.exclusions.forEach(e=>r.exclusions.push(`${c}.${e}`))):r.inclusions.includes(c)||r.inclusions.push(c),r.positional+=e.positional}else r.inclusions.push(c);assert(!(r.exclusions.length&&r.inclusions.length),"Cannot do exclusion and inclusion in projection."),assert(r.positional<=1,"Cannot specify more than one positional projection.")}if(a&&r.exclusions.push(s),n){const e=new o.yk;r.exclusions.forEach(t=>assert(e.add(t),`Path collision at ${t}.`)),r.inclusions.forEach(t=>assert(e.add(t),`Path collision at ${t}.`)),r.exclusions.sort(),r.inclusions.sort()}return r}const u=(e,t,n)=>{if((0,o.Im)(t))return e;const u=i(t,n),s=function(e,t,n){const i=t.idKey,{exclusions:u,inclusions:s}=n,a={},c={preserveMissing:!0};for(const r of u)a[r]=(e,t)=>{(0,o.yT)(e,r,{descendArray:!0})};for(const v of s){const n=(0,o.hd)(e,v)??e[v];if(v.endsWith(".$")&&1===n){const e=t?.local?.condition;(0,o.vA)(e,"positional operator '.$' couldn't find matching element in the array.");const n=v.slice(0,-2);a[n]=l(n,e,t);continue}if((0,o.cy)(n))a[v]=(e,i)=>{t.update({root:i});const u=n.map(e=>(0,r.px)(i,e,null,t)??null);(0,o.KY)(e,v,u)};else if((0,o.Et)(n)||!0===n)a[v]=(e,n)=>{t.update({root:n});f(e,(0,o.Rm)(n,v,c))};else if(0==(0,o.Gv)(n))a[v]=(e,i)=>{t.update({root:i});const u=(0,r.px)(i,n,null,t);(0,o.KY)(e,v,u)};else{const e=Object.keys(n);(0,o.vA)(1===e.length&&(0,o.Zo)(e[0]),"Not a valid operator");const i=e[0],u=n[i],s=t.context.getOperator(r.i5.PROJECTION,i);!s||"$slice"===i&&!(0,o.eC)(u).every(o.Et)?a[v]=(e,n)=>{t.update({root:n});const s=(0,r.px)(n,u,i,t);(0,o.KY)(e,v,s)}:a[v]=(e,n)=>{t.update({root:n});const r=s(n,u,v,t);(0,o.KY)(e,v,r)}}}const h=1===u.length&&u.includes(i),d=!u.includes(i),p=!s.length,y=p&&h||p&&u.length&&!h;return e=>{const t={};y&&Object.assign(t,e);for(const n in a)a[n](t,e);return p||(0,o.B2)(t),d&&!(0,o.zy)(t,i)&&(0,o.zy)(e,i)&&(t[i]=(0,o.hd)(e,i)),t}}(t,r.qk.init(n),u);return e.map(s)};const s=(e,t,n,r)=>{let i=(0,o.hd)(e,t);(0,o.cy)(i)||(i=(0,o.hd)(i,n)),(0,o.vA)((0,o.cy)(i),"must resolve to array");const u=[];return i.forEach((e,t)=>r({[n]:[e]})&&u.push(t)),u},a=e=>t=>!e(t),c={$and:1,$or:1,$nor:1};function l(e,t,n){const i=Object.entries(t).slice(),u={$and:[],$or:[]};for(let s=0;si.push([e,n,t]))}}const l=e.lastIndexOf("."),f=e.substring(0,l)||e,h=e.substring(l+1);return(t,n)=>{const r=[];for(const[e,o,c]of u.$and)r.push(s(n,e,c,o));if(u.$or.length){const e=[];for(const[t,r,o]of u.$or)e.push(...s(n,t,o,r));r.push((0,o.Am)(e))}const i=(0,o.E$)(r).sort()[0];let a=(0,o.hd)(n,e)[i];f==h||(0,o.Gv)(a)||(a={[h]:a}),(0,o.KY)(t,f,[a])}}function f(e,t){if(e===o.lV||(0,o.gD)(e))return t;if((0,o.gD)(t))return e;for(const n of Object.keys(t))e[n]=f(e[n],t[n]);return e}},703(e,t,n){"use strict";n.d(t,{X2:()=>I});Promise.resolve(!1),Promise.resolve(!0);var r=Promise.resolve();function o(e,t){return e||(e=0),new Promise(function(n){return setTimeout(function(){return n(t)},e)})}function i(){return Math.random().toString(36).substring(2)}var u=0;function s(){var e=1e3*Date.now();return e<=u&&(e=u+1),u=e,e}var a={create:function(e){var t={time:s(),messagesCallback:null,bc:new BroadcastChannel(e),subFns:[]};return t.bc.onmessage=function(e){t.messagesCallback&&t.messagesCallback(e.data)},t},close:function(e){e.bc.close(),e.subFns=[]},onMessage:function(e,t){e.messagesCallback=t},postMessage:function(e,t){try{return e.bc.postMessage(t,!1),r}catch(n){return Promise.reject(n)}},canBeUsed:function(){if("undefined"!=typeof globalThis&&globalThis.Deno&&globalThis.Deno.args)return!0;if("undefined"==typeof window&&"undefined"==typeof self||"function"!=typeof BroadcastChannel)return!1;if(BroadcastChannel._pubkey)throw new Error("BroadcastChannel: Do not overwrite window.BroadcastChannel with this module, this is not a polyfill");return!0},type:"native",averageResponseTime:function(){return 150},microSeconds:s},c=n(5525);function l(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=JSON.parse(JSON.stringify(e));return void 0===t.webWorkerSupport&&(t.webWorkerSupport=!0),t.idb||(t.idb={}),t.idb.ttl||(t.idb.ttl=45e3),t.idb.fallbackInterval||(t.idb.fallbackInterval=150),e.idb&&"function"==typeof e.idb.onclose&&(t.idb.onclose=e.idb.onclose),t.localstorage||(t.localstorage={}),t.localstorage.removeTimeout||(t.localstorage.removeTimeout=6e4),e.methods&&(t.methods=e.methods),t.node||(t.node={}),t.node.ttl||(t.node.ttl=12e4),t.node.maxParallelWrites||(t.node.maxParallelWrites=2048),void 0===t.node.useFastPath&&(t.node.useFastPath=!0),t}var f="messages",h={durability:"relaxed"};function d(){if("undefined"!=typeof indexedDB)return indexedDB;if("undefined"!=typeof window){if(void 0!==window.mozIndexedDB)return window.mozIndexedDB;if(void 0!==window.webkitIndexedDB)return window.webkitIndexedDB;if(void 0!==window.msIndexedDB)return window.msIndexedDB}return!1}function p(e){e.commit&&e.commit()}function y(e,t){var n=e.transaction(f,"readonly",h),r=n.objectStore(f),o=[],i=IDBKeyRange.bound(t+1,1/0);if(r.getAll){var u=r.getAll(i);return new Promise(function(e,t){u.onerror=function(e){return t(e)},u.onsuccess=function(t){e(t.target.result)}})}return new Promise(function(e,u){var s=function(){try{return i=IDBKeyRange.bound(t+1,1/0),r.openCursor(i)}catch(e){return r.openCursor()}}();s.onerror=function(e){return u(e)},s.onsuccess=function(r){var i=r.target.result;i?i.value.ide.lastCursorId&&(e.lastCursorId=t.id),t}).filter(function(t){return function(e,t){return!(e.uuid===t.uuid||t.eMIs.has(e.id)||e.data.time0||e._addEL.internal.length>0}function M(e,t,n){e._addEL[t].push(n),function(e){if(!e._iL&&K(e)){var t=function(t){e._addEL[t.type].forEach(function(e){t.time>=e.time&&e.fn(t.data)})},n=e.method.microSeconds();e._prepP?e._prepP.then(function(){e._iL=!0,e.method.onMessage(e._state,t,n)}):(e._iL=!0,e.method.onMessage(e._state,t,n))}}(e)}function D(e,t,n){e._addEL[t]=e._addEL[t].filter(function(e){return e!==n}),function(e){if(e._iL&&!K(e)){e._iL=!1;var t=e.method.microSeconds();e.method.onMessage(e._state,null,t)}}(e)}I._pubkey=!0,I.prototype={postMessage:function(e){if(this.closed)throw new Error("BroadcastChannel.postMessage(): Cannot post message after channel has closed "+JSON.stringify(e));return T(this,"message",e)},postInternal:function(e){return T(this,"internal",e)},set onmessage(e){var t={time:this.method.microSeconds(),fn:e};D(this,"message",this._onML),e&&"function"==typeof e?(this._onML=t,M(this,"message",t)):this._onML=null},addEventListener:function(e,t){M(this,e,{time:this.method.microSeconds(),fn:t})},removeEventListener:function(e,t){D(this,e,this._addEL[e].find(function(e){return e.fn===t}))},close:function(){var e=this;if(!this.closed){A.delete(this),this.closed=!0;var t=this._prepP?this._prepP:r;return this._onML=null,this._addEL.message=[],t.then(function(){return Promise.all(Array.from(e._uMP))}).then(function(){return Promise.all(e._befC.map(function(e){return e()}))}).then(function(){return e.method.close(e._state)})}},get type(){return this.method.type},get isClosed(){return this.closed}}},1401(e,t,n){"use strict";n.d(t,{I:()=>o});var r=n(5964);const o=(e,t,n)=>(0,r.ON)(e,t,n,r.Ig)},1449(e,t,n){"use strict";n.d(t,{A:()=>o});var r=n(1576);function o(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,(0,r.A)(e,t)}},1576(e,t,n){"use strict";function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}n.d(t,{A:()=>r})},1621(e,t,n){"use strict";n.d(t,{X:()=>f});var r=n(4953),o=n(2235);function i(e){return e instanceof u?e:new u(e)}class u{#e=[];#t=[];#n;#r=!1;constructor(e){const t=!(n=e)||"object"!=typeof n&&"function"!=typeof n||"function"!=typeof n[Symbol.iterator]?function(e){return!!e&&"object"==typeof e&&"function"==typeof e?.next}(e)?e:"function"==typeof e?{next:e}:null:e[Symbol.iterator]();var n;(0,o.vA)(!!t,"Iterator must be initialized with an iterable or function.");let r=-1,i={done:!1};this.#n=()=>{for(;!i.done&&(i=t.next(),!i.done);){let e=i.value;r++;if(this.#e.every(({op:t,fn:n})=>{const o=n(e,r);return"map"===t?!!(e=o)||!0:o}))return{value:e,done:!1}}return{done:!0}}}push(e,t){return this.#e.push({op:e,fn:t}),this}next(){return this.#n()}map(e){return this.push("map",e)}filter(e){return this.push("filter",e)}take(e){return(0,o.vA)(e>=0,"value must be a non\u2011negative integer"),this.filter(t=>e-- >0)}drop(e){return(0,o.vA)(e>=0,"value must be a non\u2011negative integer"),this.filter(t=>e--<=0)}transform(e){const t=this;let n;return i(()=>(n||(n=i(e(t.collect()))),n.next()))}collect(){for(;!this.#r;){const{done:e,value:t}=this.#n();e||this.#t.push(t),this.#r=e}return this.#t}each(e){for(let t=this.next();!0!==t.done;t=this.next())e(t.value)}reduce(e,t){let n=this.next();for(void 0!==t||n.done||(t=n.value,n=this.next());!n.done;)t=e(t,n.value),n=this.next();return t}size(){return this.collect().length}[Symbol.iterator](){return this}}var s=n(695);const a={$sort:n(4192).x,$skip:(e,t,n)=>(assert(t>=0,"$skip value must be a non-negative integer"),e.drop(t)),$limit:(e,t,n)=>e.take(t)};class c{#o;#i;#u;#s;#a={};#c=null;#t=[];constructor(e,t,n,r){this.#o=e,this.#i=t,this.#u=n,this.#s=r}fetch(){if(this.#c)return this.#c;this.#c=i(this.#o).filter(this.#i);const e=this.#s.processingMode;e&r.to.CLONE_INPUT&&this.#c.map(e=>(0,o.mg)(e));for(const t of["$sort","$skip","$limit"])(0,o.zy)(this.#a,t)&&(this.#c=a[t](this.#c,this.#a[t],this.#s));return Object.keys(this.#u).length&&(this.#c=(0,s.C)(this.#c,this.#u,this.#s)),e&r.to.CLONE_OUTPUT&&this.#c.map(e=>(0,o.mg)(e)),this.#c}fetchAll(){const e=i(Array.from(this.#t));return this.#t.length=0,function(...e){let t=0;return i(()=>{for(;t0)return this.#t.pop();const e=this.fetch().next();return e.done?void 0:e.value}hasNext(){if(this.#t.length>0)return!0;const e=this.fetch().next();return!e.done&&(this.#t.push(e.value),!0)}[Symbol.iterator](){return this.fetchAll()}}const l=/^\$(and|or|nor|expr|jsonSchema)$/;class f{#l;#f;#s;constructor(e,t){this.#f=(0,o.mg)(e),this.#s=r.qk.init(t).update({condition:e}),this.#l=[],this.compile()}compile(){(0,o.vA)((0,o.Gv)(this.#f),`query criteria must be an object: ${JSON.stringify(this.#f)}`);const e={},t=Object.entries(this.#f);for(const[n,r]of t){if("$where"===n)(0,o.vA)(this.#s.scriptEnabled,"$where operator requires 'scriptEnabled' option to be true."),Object.assign(e,{field:n,expr:r});else if(l.test(n))this.processOperator(n,n,r);else{(0,o.vA)(!(0,o.Zo)(n),`unknown top level operator: ${n}`);for(const[e,t]of Object.entries((0,o.S8)(r)))this.processOperator(n,e,t)}e.field&&this.processOperator(e.field,e.field,e.expr)}}processOperator(e,t,n){const i=this.#s.context.getOperator(r.i5.QUERY,t);(0,o.vA)(!!i,`unknown query operator ${t}`),this.#l.push(i(e,n,this.#s))}test(e){return this.#l.every(t=>t(e))}find(e,t){return new c(e,e=>this.test(e),t||{},this.#s)}}},2080(e,t,n){"use strict";n.d(t,{X:()=>o});var r=n(5964);const o=(e,t,n)=>(0,r.ON)(e,t,n,r.XV)},2198(e,t,n){"use strict";n.d(t,{t:()=>o});var r=n(4629),o=function(e){function t(t){var n=e.call(this)||this;return n._value=t,n}return(0,r.C6)(t,e),Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(t){var n=e.prototype._subscribe.call(this,t);return!n.closed&&t.next(this._value),n},t.prototype.getValue=function(){var e=this,t=e.hasError,n=e.thrownError,r=e._value;if(t)throw n;return this._throwIfClosed(),r},t.prototype.next=function(t){e.prototype.next.call(this,this._value=t)},t}(n(9092).B)},2226(e,t,n){"use strict";n.d(t,{f:()=>o});var r=n(5964);const o=(e,t,n)=>(0,r.ON)(e,t,n,r.fy)},2235(e,t,n){"use strict";n.d(t,{lV:()=>d,yk:()=>te,vA:()=>O,mg:()=>$,UD:()=>w,eC:()=>N,B2:()=>Q,Bq:()=>L,$z:()=>z,zy:()=>q,E$:()=>F,cy:()=>A,Lm:()=>P,$P:()=>T,Im:()=>R,n4:()=>x,gD:()=>M,Et:()=>S,Gv:()=>j,Zo:()=>J,gd:()=>K,Kg:()=>C,S8:()=>ee,yT:()=>Z,hd:()=>W,Rm:()=>Y,KY:()=>H,vN:()=>D,QP:()=>E,Am:()=>U});const r=[];function o(e,t){return 16777619*e^t>>>0}function i(e){if(Number.isNaN(e))return 2143289344;if(!Number.isFinite(e))return e>0?2139095040:4286578688;const t=Math.trunc(e),n=e-t;let r=0|t;if(0!==n){r=o(r,0|Math.floor(4294967296*n))}return r>>>0}function u(e){let t=0;for(let n=0;n>>0}function s(e){let t=u(e.constructor.name);return t=o(t,function(e){let t=0;for(let n=0;n>>0}(new Uint8Array(e.buffer,e.byteOffset,e.byteLength))),t>>>0}const a=[3735928559,305441741].map(e=>o(3,e)),c=o(1,0),l=o(2,0);function f(e,t){if(null===e)return c;switch(typeof e){case"undefined":return l;case"boolean":return a[+e];case"number":return o(4,i(e));case"string":return o(5,u(e));case"bigint":return o(6,function(e){let t=0;const n=e<0n;let r=n?-e:e;if(0n===r)t=o(t,0);else for(;r>0n;)t=o(t,Number(0xffn&r)),r>>=8n;return o(t,+n)>>>0}(e));case"function":return o(7,function(e){let t=u((e.name||"")+e.toString());return t=o(t,e.length),t>>>0}(e));default:if(ArrayBuffer.isView(e)&&!(e instanceof DataView))return o(12,s(e));if(e instanceof Date)return o(10,i(e.getTime()));if(e instanceof RegExp){return o(11,o(u(e.source),u(e.flags)))}return Array.isArray(e)?o(8,function(e,t){if(t.has(e))return 13;t.add(e);let n=1;for(let r=0;r>>0}(e,t)):o(9,function(e,t){if(t.has(e))return 13;if(t.add(e),r.length=0,Object.getPrototypeOf(e)===Object.prototype)for(const o in e)r.push(o);else{Array.prototype.push.apply(r,Object.keys(e));for(const t of Object.getOwnPropertyNames(Object.getPrototypeOf(e)))"function"!=typeof e[t]&&r.push(t)}r.sort();let n=u(e?.constructor?.name);for(const i of r)n=o(n,u(i)),n=o(n,f(e[i],t));return t.delete(e),n>>>0}(e,t))}}class h extends Error{}const d=Symbol("missing"),p=e=>"object"!=typeof e&&"function"!=typeof e||null===e,y=e=>p(e)||T(e)||K(e),v={undefined:1,null:2,number:3,string:4,symbol:5,object:6,array:7,arraybuffer:8,boolean:9,date:10,regexp:11,function:12},m=2*Object.keys(v).length,g=(e,t)=>et?1:0;function b(e,t,n=!1){let r=0;if(e===d&&(e=void 0),t===d&&(t=void 0),e===t||Object.is(e,t))return 0;const o=B(e)?"arraybuffer":E(e),i=B(t)?"arraybuffer":E(t);if(o!==i){if("undefined"==o)return-1;if("undefined"==i)return 1;if(n&&"array"==o&&!e.length)return-1;if(n&&"array"==i&&!t.length)return 1;if(n){if(A(e)){const n=e.slice().sort(b);r=1;for(const e of n)if((r=Math.min(r,b(e,t)))<0)return r;return r}if(A(t)){const n=t.slice().sort(b);r=-1;for(const t of n)if((r=Math.max(r,b(e,t)))>0)return r;return r}}const u=v[o]??m,s=v[i]??m;if(u!==s)return g(u,s)}switch(o){case"number":case"string":return g(e,t);case"boolean":case"date":return g(+e,+t);case"regexp":return(r=g(e.source,t.source))||(r=g(e.flags,t.flags))?r:0;case"arraybuffer":return((e,t)=>{const n=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),r=new Uint8Array(t.buffer,t.byteOffset,t.byteLength),o=Math.min(n.length,r.length);for(let i=0;inull!=e&&e.toString!==Object.prototype.toString;function x(e,t){if(e===t||Object.is(e,t))return!0;if(null===e||null===t)return!1;if(typeof e!=typeof t)return!1;if("object"!=typeof e)return!1;if(e.constructor!==t.constructor)return!1;if(T(e))return T(t)&&+e===+t;if(K(e))return K(t)&&e.source===t.source&&e.flags===t.flags;if(A(e)&&A(t))return e.length===t.length&&e.every((e,n)=>x(e,t[n]));if(e?.constructor!==Object&&_(e))return e?.toString()===t?.toString();const n=Object.keys(e),r=Object.keys(t);return n.length===r.length&&n.every(n=>q(t,n)&&x(e[n],t[n]))}class k extends Map{#h=new Map;#d=e=>{const t=f(e,new WeakSet)>>>0;return[(this.#h.get(t)||[]).find(t=>x(t,e)),t]};constructor(){super()}static init(){return new k}clear(){super.clear(),this.#h.clear()}delete(e){if(p(e))return super.delete(e);const[t,n]=this.#d(e);return!!super.delete(t)&&(this.#h.set(n,this.#h.get(n).filter(e=>!x(e,t))),!0)}get(e){if(p(e))return super.get(e);const[t,n]=this.#d(e);return super.get(t)}has(e){if(p(e))return super.has(e);const[t,n]=this.#d(e);return super.has(t)}set(e,t){if(p(e))return super.set(e,t);const[n,r]=this.#d(e);if(super.has(n))super.set(n,t);else{super.set(e,t);const n=this.#h.get(r)||[];n.push(e),this.#h.set(r,n)}return this}get size(){return super.size}}function O(e,t){if(!e)throw new h(t)}function E(e){if(null===e)return"null";const t=typeof e;return"object"!==t&&v[t]?t:A(e)?"array":T(e)?"date":K(e)?"regexp":e?.constructor?.name?.toLowerCase()??"object"}const P=e=>"boolean"==typeof e,C=e=>"string"==typeof e,S=e=>!isNaN(e)&&"number"==typeof e,A=Array.isArray,j=e=>"object"===E(e),I=e=>!p(e),T=e=>e instanceof Date,K=e=>e instanceof RegExp,M=e=>null==e,D=(e,t=!0)=>!!e||t&&""===e,R=e=>M(e)||C(e)&&!e||A(e)&&0===e.length||j(e)&&0===Object.keys(e).length,N=e=>A(e)?e:[e],q=(e,t)=>!!e&&Object.prototype.hasOwnProperty.call(e,t),B=e=>"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView(e),$=(e,t)=>{if(M(e)||P(e)||S(e)||C(e))return e;if(T(e))return new Date(e);if(K(e))return new RegExp(e);if(B(e)){return new(0,e.constructor)(e)}if(t instanceof Set||(t=new Set),t.has(e))throw new Error("mingo: cycle detected while processing object/array");t.add(e);try{if(A(e)){const n=new Array(e.length);for(let r=0;r0===e.length))return[];if(1===e.length)return e[0].slice();const t=[k.init(),k.init()];e[e.length-1].forEach(e=>t[0].set(e,!0));for(let n=e.length-2;n>-1;n--){if(e[n].forEach(e=>{t[0].has(e)&&t[1].set(e,!0)}),0===t[1].size)return[];t.reverse(),t[1].clear()}return Array.from(t[0].keys())}function L(e,t=1){const n=new Array;return function e(t,r){for(let o=0,i=t.length;o0||r<0)?e(t[o],Math.max(-1,r-1)):n.push(t[o])}(e,t),n}function U(e){const t=k.init();return e.forEach(e=>t.set(e,!0)),Array.from(t.keys())}function z(e,t){if(e.length<1)return new Map;const n=k.init();for(let r=0;r0)break;r+=1;const t=n.slice(i);o=o.reduce((n,r)=>{const o=e(r,t);return void 0!==o&&n.push(o),n},[]);break}if(o=V(o,t),void 0===o)break}return o}(e,t.split("."));return A(o)&&n?.unwrapArray?function(e,t){if(t<1)return e;for(;t--&&1===e.length&&A(e[0]);)e=e[0];return e}(o,r):o}function Y(e,t,n){const r=t.indexOf("."),o=-1==r?t:t.substring(0,r),i=t.substring(r+1),u=-1!=r;if(A(e)){const r=/^\d+$/.test(o),s=r&&n?.preserveIndex?e.slice():[];if(r){const t=parseInt(o);let r=V(e,t);u&&(r=Y(r,i,n)),n?.preserveIndex?s[t]=r:s.push(r)}else for(const o of e){const e=Y(o,t,n);n?.preserveMissing?s.push(null==e?d:e):(null!=e||n?.preserveIndex)&&s.push(e)}return s}const s=n?.preserveKeys?{...e}:{};let a=V(e,o);if(u&&(a=Y(a,i,n)),void 0!==a)return s[o]=a,s}function Q(e){if(A(e))for(let t=e.length-1;t>=0;t--)e[t]===d?e.splice(t,1):Q(e[t]);else if(j(e))for(const t of Object.keys(e))q(e,t)&&Q(e[t])}const G=/^\d+$/;function X(e,t,n,r){const o=t.split("."),i=o[0],u=o.slice(1).join(".");if(1===o.length)(j(e)||A(e)&&G.test(i))&&n(e,i);else{r?.buildGraph&&M(e[i])&&(e[i]={});const t=e[i];if(!t)return;const s=!!(o.length>1&&G.test(o[1]));A(t)&&r?.descendArray&&!s?t.forEach(e=>X(e,u,n,r)):X(t,u,n,r)}}function H(e,t,n){X(e,t,(e,t)=>e[t]=n,{buildGraph:!0})}function Z(e,t,n){X(e,t,(e,t)=>{A(e)?e.splice(parseInt(t),1):j(e)&&delete e[t]},n)}const J=e=>e&&"$"===e[0]&&/^\$[a-zA-Z0-9_]+$/.test(e);function ee(e){if(y(e))return K(e)?{$regex:e}:{$eq:e};if(I(e)){if(!Object.keys(e).some(J))return{$eq:e};if(q(e,"$regex")){const t={...e};return t.$regex=new RegExp(e.$regex,e.$options),delete t.$options,t}}return e}class te{constructor(){this.root={children:new Map,isTerminal:!1}}add(e){const t=e.split(".");let n=this.root;for(const r of t){if(n.isTerminal)return!1;n.children.has(r)||n.children.set(r,{children:new Map,isTerminal:!1}),n=n.children.get(r)}return!n.isTerminal&&!n.children.size&&(n.isTerminal=!0)}}},2442(e,t,n){"use strict";n.d(t,{Z:()=>c});var r=n(7708),o=n(7688),i=n(5096),u=n(8071),s=n(4370);var a=n(1693);function c(e,t,n){return void 0===n&&(n=1/0),(0,a.T)(t)?c(function(n,i){return(0,r.T)(function(e,r){return t(n,e,i,r)})((0,o.Tg)(e(n,i)))},n):("number"==typeof t&&(n=t),(0,i.N)(function(t,r){return function(e,t,n,r,i,a,c,l){var f=[],h=0,d=0,p=!1,y=function(){!p||f.length||h||t.complete()},v=function(e){return ho});var r=n(5964);const o=(e,t,n)=>(0,r.ON)(e,t,n,r.Q_)},2830(e,t,n){"use strict";n.d(t,{J:()=>o});var r=n(5964);const o=(e,t,n)=>(0,r.ON)(e,t,n,r.Jy)},3026(e,t,n){"use strict";n.d(t,{C:()=>i,U:()=>u});var r=n(4629),o=n(1693);function i(e){return(0,r.AQ)(this,arguments,function(){var t,n,o;return(0,r.YH)(this,function(i){switch(i.label){case 0:t=e.getReader(),i.label=1;case 1:i.trys.push([1,,9,10]),i.label=2;case 2:return[4,(0,r.N3)(t.read())];case 3:return n=i.sent(),o=n.value,n.done?[4,(0,r.N3)(void 0)]:[3,5];case 4:return[2,i.sent()];case 5:return[4,(0,r.N3)(o)];case 6:return[4,i.sent()];case 7:return i.sent(),[3,2];case 8:return[3,10];case 9:return t.releaseLock(),[7];case 10:return[2]}})})}function u(e){return(0,o.T)(null==e?void 0:e.getReader)}},3356(e,t,n){"use strict";n.d(t,{Z:()=>a});var r=n(5499);var o=n(235),i=n(9852);function u(){for(var e=[],t=0;ti});var r=n(1621),o=n(2235);const i=(e,t,n)=>{(0,o.vA)((0,o.cy)(t),"Invalid expression. $or expects value to be an Array");const i=t.map(e=>new r.X(e,n));return e=>i.some(t=>t.test(e))}},3697(e,t,n){"use strict";n.d(t,{o:()=>o});var r=n(5964);const o=(e,t,n)=>(0,r.ON)(e,t,n,r.oZ)},3819(e,t,n){"use strict";n.d(t,{T:()=>o});var r=n(1693);function o(e){return Symbol.asyncIterator&&(0,r.T)(null==e?void 0:e[Symbol.asyncIterator])}},3836(e,t,n){"use strict";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function o(e){var t=function(e,t){if("object"!=r(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var o=n.call(e,t||"default");if("object"!=r(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==r(t)?t:t+""}function i(e,t){for(var n=0;nu})},4157(e,t,n){"use strict";n.d(t,{h:()=>a});var r=n(5499),o=n(7688),i=new(n(1753).c)(function(e){return e.complete()});var u=n(235),s=n(9852);function a(){for(var e=[],t=0;to});var r=n(2235);const o=(e,t,n)=>{if((0,r.Im)(t)||!(0,r.Gv)(t))return e;let o=r.UD;const u=n.collation;return(0,r.Gv)(u)&&(0,r.Kg)(u.locale)&&(o=function(e){const t={sensitivity:i[e.strength||3],caseFirst:"off"===e.caseFirst?"false":e.caseFirst||"false",numeric:e.numericOrdering||!1,ignorePunctuation:"shifted"===e.alternate};!0===e.caseLevel&&("base"===t.sensitivity&&(t.sensitivity="case"),"accent"===t.sensitivity&&(t.sensitivity="variant"));const n=new Intl.Collator(e.locale,t);return(e,t)=>{if(!(0,r.Kg)(e)||!(0,r.Kg)(t))return(0,r.UD)(e,t);const o=n.compare(e,t);return o<0?-1:o>0?1:0}}(u)),e.transform(e=>{const n=Object.keys(t);for(const i of n.reverse()){const n=(0,r.$z)(e,e=>(0,r.hd)(e,i)),u=Array.from(n.keys());let s=!1;if(o===r.UD){let e=!0,t=!0;s=u.every(n=>+(e&&=(0,r.Kg)(n))^+(t&&=(0,r.Et)(n))),e?u.sort():t&&new Float64Array(u).sort().forEach((e,t)=>u[t]=e)}s||u.sort(o),-1===t[i]&&u.reverse();let a=0;for(const t of u)for(const r of n.get(t))e[a++]=r;(0,r.vA)(a==e.length,"bug: counter must match collection size.")}return e})},i={1:"base",2:"accent",3:"variant"}},4207(e,t,n){"use strict";n.d(t,{l:()=>r});var r="function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator"},4429(e,t,n){"use strict";function r(e){return new TypeError("You provided "+(null!==e&&"object"==typeof e?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}n.d(t,{L:()=>r})},4612(e,t,n){"use strict";n.d(t,{P:()=>o});var r=n(5964);const o=(e,t,n)=>(0,r.ON)(e,t,n,r.Pp)},4799(e,t,n){"use strict";n.d(t,{x:()=>i});var r=n(4207),o=n(1693);function i(e){return(0,o.T)(null==e?void 0:e[r.l])}},4953(e,t,n){"use strict";n.d(t,{i5:()=>u,ob:()=>s,px:()=>a,qk:()=>i,to:()=>o});var r=n(2235),o=(e=>(e[e.CLONE_OFF=0]="CLONE_OFF",e[e.CLONE_INPUT=1]="CLONE_INPUT",e[e.CLONE_OUTPUT=2]="CLONE_OUTPUT",e[e.CLONE_ALL=3]="CLONE_ALL",e))(o||{});class i{constructor(e,t){this.options=e,this.#p=t?{...t}:{}}#p;static init(e){return e instanceof i?new i(e.options,e.#p):new i({idKey:"_id",scriptEnabled:!0,useStrictMode:!0,processingMode:0,...e,context:e?.context?s.from(e?.context):s.init()})}update(e){return Object.assign(this.#p,e,{timestamp:this.#p.timestamp,variables:{...this.#p?.variables,...e?.variables}}),this}get local(){return this.#p}get now(){return this.#p?.timestamp||Object.assign(this.#p,{timestamp:Date.now()}),new Date(this.#p.timestamp)}get idKey(){return this.options.idKey}get collation(){return this.options?.collation}get processingMode(){return this.options?.processingMode}get useStrictMode(){return this.options?.useStrictMode}get scriptEnabled(){return this.options?.scriptEnabled}get collectionResolver(){return this.options?.collectionResolver}get jsonSchemaValidator(){return this.options?.jsonSchemaValidator}get variables(){return this.options?.variables}get context(){return this.options?.context}}var u=(e=>(e.ACCUMULATOR="accumulator",e.EXPRESSION="expression",e.PIPELINE="pipeline",e.PROJECTION="projection",e.QUERY="query",e.WINDOW="window",e))(u||{});class s{#a=new Map(Object.values(u).map(e=>[e,{}]));constructor(){}static init(e={}){const t=new s;for(const[n,r]of Object.entries(e))t.#a.has(n)&&r&&t.addOps(n,r);return t}static from(...e){const t=new s;for(const n of e)for(const e of Object.values(u))t.addOps(e,n.#a.get(e));return t}addOps(e,t){return this.#a.set(e,Object.assign({},t,this.#a.get(e))),this}getOperator(e,t){return this.#a.get(e)[t]??null}addAccumulatorOps(e){return this.addOps("accumulator",e)}addExpressionOps(e){return this.addOps("expression",e)}addQueryOps(e){return this.addOps("query",e)}addPipelineOps(e){return this.addOps("pipeline",e)}addProjectionOps(e){return this.addOps("projection",e)}addWindowOps(e){return this.addOps("window",e)}}function a(e,t,n,o){const u=o instanceof i&&!(0,r.gD)(o.local.root)?o:i.init(o).update({root:e});return(0,r.Zo)(n)?f(e,t,n,u):l(e,t,u)}const c=["$$ROOT","$$CURRENT","$$REMOVE","$$NOW"];function l(e,t,n){if((0,r.Kg)(t)&&t.length>0&&"$"===t[0]){if("$$KEEP"===t||"$$PRUNE"===t||"$$DESCEND"===t)return t;let o=n.local.root;const i=t.split(".");if(c.includes(i[0])){switch(i[0]){case"$$ROOT":break;case"$$CURRENT":o=e;break;case"$$REMOVE":o=void 0;break;case"$$NOW":o=new Date(n.now)}t=t.slice(i[0].length+1)}else if("$$"===i[0].slice(0,2)){o=Object.assign({},n.variables,{this:e},n?.local?.variables);const u=i[0].slice(2);(0,r.vA)((0,r.zy)(o,u),`Use of undefined variable: ${u}`),t=t.slice(2)}else t=t.slice(1);return""===t?o:(0,r.hd)(o,t)}if((0,r.cy)(t))return t.map(t=>l(e,t,n));if((0,r.Gv)(t)){const o={},i=Object.entries(t);for(const[u,s]of i){if((0,r.Zo)(u))return(0,r.vA)(1===i.length,`Expression must contain a single operator. got [${Object.keys(t).join(",")}]`),f(e,s,u,n);o[u]=l(e,s,n)}return o}return t}function f(e,t,n,o){const i=o.context,u=i.getOperator("expression",n);if(u)return u(e,t,o);const s=i.getOperator("accumulator",n);return(0,r.vA)(!!s,`accumulator '${n}' is not registered.`),(0,r.cy)(e)||(e=l(e,t,o),t=null),(0,r.vA)((0,r.cy)(e),`arguments must resolve to array for ${n}.`),s(e,t,o)}},5499(e,t,n){"use strict";n.d(t,{U:()=>i});var r=n(2442),o=n(3887);function i(e){return void 0===e&&(e=1/0),(0,r.Z)(o.D,e)}},5525(e,t,n){"use strict";n.d(t,{p4:()=>r});class r{ttl;map=new Map;_to=!1;constructor(e){this.ttl=e}has(e){const t=this.map.get(e);return void 0!==t&&(!(t{this._to=!1,function(e){const t=o()-e.ttl,n=e.map[Symbol.iterator]();for(;;){const r=n.next().value;if(!r)break;const o=r[0];if(!(r[1]o});var r=n(5964);const o=(e,t,n)=>(0,r.ON)(e,t,n,r.GU)},5714(e,t,n){"use strict";n.d(t,{X:()=>c});var r=n(4629),o=n(5096),i=n(5499),u=n(235),s=n(9852);function a(){for(var e=[],t=0;to});var r=n(1693);function o(e){return(0,r.T)(null==e?void 0:e.then)}},5805(e,t,n){"use strict";n.d(t,{E:()=>i});var r=n(1621),o=n(2235);const i=(e,t,n)=>{const i={};i[e]=(0,o.S8)(t);const u=new r.X(i,n);return e=>!u.test(e)}},5912(e,t,n){"use strict";n.d(t,{W:()=>o});var r=n(5964);const o=(e,t,n)=>(0,r.ON)(e,t,n,r.WP)},5964(e,t,n){"use strict";n.d(t,{C5:()=>a,GU:()=>l,Ig:()=>m,Jy:()=>b,MR:()=>d,NV:()=>f,ON:()=>u,Pp:()=>y,Q_:()=>h,TU:()=>k,WP:()=>v,XV:()=>s,fy:()=>p,oZ:()=>c});var r=n(4953),o=n(1621),i=n(2235);function u(e,t,n,o){const u={unwrapArray:!0},s=Math.max(1,e.split(".").length-1),a=r.qk.init(n).update({depth:s});return n=>{const r=(0,i.hd)(n,e,u);return o(r,t,a)}}function s(e,t,n){if((0,i.n4)(e,t))return!0;if((0,i.gD)(e)&&(0,i.gD)(t))return!0;if((0,i.cy)(e)){const r=n?.local?.depth??1;return e.some(e=>(0,i.n4)(e,t))||(0,i.Bq)(e,r).some(e=>(0,i.n4)(e,t))}return!1}function a(e,t,n){return!s(e,t,n)}function c(e,t,n){return(0,i.gD)(e)?t.some(e=>null===e):(0,i.E$)([(0,i.eC)(e),t]).length>0}function l(e,t,n){return!c(e,t)}function f(e,t,n){return O(e,t,(e,t)=>(0,i.UD)(e,t)<0)}function h(e,t,n){return O(e,t,(e,t)=>(0,i.UD)(e,t)<=0)}function d(e,t,n){return O(e,t,(e,t)=>(0,i.UD)(e,t)>0)}function p(e,t,n){return O(e,t,(e,t)=>(0,i.UD)(e,t)>=0)}function y(e,t,n){return(0,i.eC)(e).some(e=>2===t.length&&e%t[0]===t[1])}function v(e,t,n){const r=(0,i.eC)(e),o=e=>(0,i.Kg)(e)&&(0,i.vN)(t.exec(e),n?.useStrictMode);return r.some(o)||(0,i.Bq)(r,1).some(o)}function m(e,t,n){return Array.isArray(e)&&e.length===t}function g(e){return(0,i.Zo)(e)&&-1===["$and","$or","$nor"].indexOf(e)}function b(e,t,n){if((0,i.cy)(e)&&!(0,i.Im)(e)){let r=e=>e,i=t;Object.keys(t).every(g)&&(i={temp:t},r=e=>({temp:e}));const u=new o.X(i,n);for(let t=0,n=e.length;tnull===e,_={array:i.cy,boolean:i.Lm,bool:i.Lm,date:i.$P,number:i.Et,int:i.Et,long:i.Et,double:i.Et,decimal:i.Et,null:w,object:i.Gv,regexp:i.gd,regex:i.gd,string:i.Kg,undefined:i.gD,1:i.Et,2:i.Kg,3:i.Gv,4:i.cy,6:i.gD,8:i.Lm,9:i.$P,10:w,11:i.gd,16:i.Et,18:i.Et,19:i.Et};function x(e,t,n){const r=_[t];return!!r&&r(e)}function k(e,t,n){return(0,i.cy)(t)?t.findIndex(t=>x(e,t))>=0:x(e,t)}function O(e,t,n){return(0,i.eC)(e).some(e=>(0,i.QP)(e)===(0,i.QP)(t)&&n(e,t))}},6114(e,t,n){"use strict";n.d(t,{kC:()=>B,Cs:()=>$});const r=e=>{e.previousResults.unshift(e.changeEvent.doc),e.keyDocumentMap&&e.keyDocumentMap.set(e.changeEvent.id,e.changeEvent.doc)},o=e=>{e.previousResults.push(e.changeEvent.doc),e.keyDocumentMap&&e.keyDocumentMap.set(e.changeEvent.id,e.changeEvent.doc)},i=e=>{const t=e.previousResults.shift();e.keyDocumentMap&&t&&e.keyDocumentMap.delete(t[e.queryParams.primaryKey])},u=e=>{const t=e.previousResults.pop();e.keyDocumentMap&&t&&e.keyDocumentMap.delete(t[e.queryParams.primaryKey])},s=e=>{e.keyDocumentMap&&e.keyDocumentMap.delete(e.changeEvent.id);const t=e.queryParams.primaryKey,n=e.previousResults;for(let r=0;r{const t=e.changeEvent.id,n=e.changeEvent.doc;if(e.keyDocumentMap){if(e.keyDocumentMap.has(t))return;e.keyDocumentMap.set(t,n)}else{if(e.previousResults.find(n=>n[e.queryParams.primaryKey]===t))return}!function(e,t,n,r){var o,i=e.length,u=i-1,s=0;if(0===i)return e.push(t),0;for(;r<=u;)n(o=e[s=r+(u-r>>1)],t)<=0?r=s+1:u=s-1;n(o,t)<=0&&s++,e.splice(s,0,t)}(e.previousResults,n,e.queryParams.sortComparator,0)},c=["doNothing","insertFirst","insertLast","removeFirstItem","removeLastItem","removeFirstInsertLast","removeLastInsertFirst","removeFirstInsertFirst","removeLastInsertLast","removeExisting","replaceExisting","alwaysWrong","insertAtSortPosition","removeExistingAndInsertAtSortPosition","runFullQueryAgain","unknownAction"],l={doNothing:e=>{},insertFirst:r,insertLast:o,removeFirstItem:i,removeLastItem:u,removeFirstInsertLast:e=>{i(e),o(e)},removeLastInsertFirst:e=>{u(e),r(e)},removeFirstInsertFirst:e=>{i(e),r(e)},removeLastInsertLast:e=>{u(e),o(e)},removeExisting:s,replaceExisting:e=>{const t=e.changeEvent.doc,n=e.queryParams.primaryKey,r=e.previousResults;for(let o=0;o{const t={_id:"wrongHuman"+(new Date).getTime()};e.previousResults.length=0,e.previousResults.push(t),e.keyDocumentMap&&(e.keyDocumentMap.clear(),e.keyDocumentMap.set(t._id,t))},insertAtSortPosition:a,removeExistingAndInsertAtSortPosition:e=>{s(e),a(e)},runFullQueryAgain:e=>{throw new Error("Action runFullQueryAgain must be implemented by yourself")},unknownAction:e=>{throw new Error("Action unknownAction should never be called")}};function f(e){return e?"1":"0"}!function(e=6){let t="";const n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";for(let r=0;r!!e.queryParams.limit,g=e=>1===e.queryParams.limit,b=e=>!!(e.queryParams.skip&&e.queryParams.skip>0),w=e=>"DELETE"===e.changeEvent.operation,_=e=>"INSERT"===e.changeEvent.operation,x=e=>"UPDATE"===e.changeEvent.operation,k=e=>m(e)&&e.previousResults.length>=e.queryParams.limit,O=e=>{const t=e.queryParams.sortFields,n=e.changeEvent.previous,r=e.changeEvent.doc;if(!r)return!1;if(!n)return!0;for(let o=0;o{const t=e.changeEvent.id;if(e.keyDocumentMap){return e.keyDocumentMap.has(t)}{const n=e.queryParams.primaryKey,r=e.previousResults;for(let e=0;e{const t=e.previousResults[0];return!(!t||t[e.queryParams.primaryKey]!==e.changeEvent.id)},C=e=>{const t=p(e.previousResults);return!(!t||t[e.queryParams.primaryKey]!==e.changeEvent.id)},S=e=>{const t=e.changeEvent.previous;if(!t)return!1;const n=e.previousResults[0];if(!n)return!1;if(n[e.queryParams.primaryKey]===e.changeEvent.id)return!0;return e.queryParams.sortComparator(t,n)<0},A=e=>{const t=e.changeEvent.previous;if(!t)return!1;const n=p(e.previousResults);if(!n)return!1;if(n[e.queryParams.primaryKey]===e.changeEvent.id)return!0;return e.queryParams.sortComparator(t,n)>0},j=e=>{const t=e.changeEvent.doc;if(!t)return!1;const n=e.previousResults[0];if(!n)return!1;if(n[e.queryParams.primaryKey]===e.changeEvent.id)return!0;return e.queryParams.sortComparator(t,n)<0},I=e=>{const t=e.changeEvent.doc;if(!t)return!1;const n=p(e.previousResults);if(!n)return!1;if(n[e.queryParams.primaryKey]===e.changeEvent.id)return!0;return e.queryParams.sortComparator(t,n)>0},T=e=>{const t=e.changeEvent.previous;return!!t&&e.queryParams.queryMatcher(t)},K=e=>{const t=e.changeEvent.doc;if(!t)return!1;return e.queryParams.queryMatcher(t)},M=e=>0===e.previousResults.length,D={0:_,1:x,2:w,3:m,4:g,5:b,6:M,7:k,8:P,9:C,10:O,11:E,12:S,13:A,14:j,15:I,16:T,17:K};let R;function N(){return R||(R=function(e){const t=new Map,n=2+2*parseInt(e.charAt(0)+e.charAt(1),10),r=h(e.substring(2,n),2);for(let a=0;afunction(e,t,n){let r=e,o=e.l;for(;;){if(r=r[f(t[o](n))],"number"==typeof r||"string"==typeof r)return r;o=r.l}}(N(),D,e);function B(e){const t=q(e);return c[t]}function $(e,t,n,r,o){return(0,l[e])({queryParams:t,changeEvent:n,previousResults:r,keyDocumentMap:o}),r}},6343(e,t,n){"use strict";function r(e){return r=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},r(e)}n.d(t,{A:()=>u});var o=n(1576);function i(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(i=function(){return!!e})()}function u(e){var t="function"==typeof Map?new Map:void 0;return u=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(t){return"function"==typeof e}}(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return function(e,t,n){if(i())return Reflect.construct.apply(null,arguments);var r=[null];r.push.apply(r,t);var u=new(e.bind.apply(e,r));return n&&(0,o.A)(u,n.prototype),u}(e,arguments,r(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),(0,o.A)(n,e)},u(e)}},6529(e,t,n){"use strict";n.d(t,{M:()=>o});var r=n(5964);const o=(e,t,n)=>(0,r.ON)(e,t,n,r.MR)},6729(e,t,n){"use strict";n.d(t,{a:()=>i});var r=n(1621),o=n(2235);const i=(e,t,n)=>{(0,o.vA)((0,o.cy)(t),"Invalid expression: $and expects value to be an Array.");const i=t.map(e=>new r.X(e,n));return e=>i.every(t=>t.test(e))}},7329(e,t,n){"use strict";n.d(t,{cf:()=>i});var r=n(8900);const o=Symbol.for("Dexie"),i=globalThis[o]||(globalThis[o]=r);if(r.semVer!==i.semVer)throw new Error(`Two different versions of Dexie loaded in the same app: ${r.semVer} and ${i.semVer}`);const{liveQuery:u,mergeRanges:s,rangesOverlap:a,RangeSet:c,cmp:l,Entity:f,PropModSymbol:h,PropModification:d,replacePrefix:p,add:y,remove:v}=i},7531(e,t,n){"use strict";n.d(t,{T:()=>o});var r=n(5964);const o=(e,t,n)=>(0,r.ON)(e,t,n,r.TU)},7635(e,t,n){"use strict";n.d(t,{G:()=>r});var r=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;this._parallels=e||1,this._qC=0,this._iC=new Set,this._lHN=0,this._hPM=new Map,this._pHM=new Map};function o(e,t){if(t){if(t._timeoutObj&&clearTimeout(t._timeoutObj),e._pHM.has(t)){var n=e._pHM.get(t);e._hPM.delete(n),e._pHM.delete(t)}e._iC.delete(t)}}function i(e){e._tryIR||0===e._iC.size||(e._tryIR=!0,setTimeout(function(){e.isIdle()?setTimeout(function(){e.isIdle()?(!function(e){0!==e._iC.size&&(e._iC.values().next().value._manRes(),setTimeout(function(){return i(e)},0))}(e),e._tryIR=!1):e._tryIR=!1},0):e._tryIR=!1},0))}r.prototype={isIdle:function(){return this._qCy});var r=n(4629),o=n(9739),i=n(5796),u=n(1753),s=n(9065),a=n(3819),c=n(4429),l=n(4799),f=n(3026),h=n(1693),d=n(6712),p=n(8896);function y(e){if(e instanceof u.c)return e;if(null!=e){if((0,s.l)(e))return g=e,new u.c(function(e){var t=g[p.s]();if((0,h.T)(t.subscribe))return t.subscribe(e);throw new TypeError("Provided object does not correctly implement Symbol.observable")});if((0,o.X)(e))return m=e,new u.c(function(e){for(var t=0;tr})},8146(e,t,n){"use strict";n.d(t,{p:()=>i});var r=n(5096),o=n(4370);function i(e,t){return(0,r.N)(function(n,r){var i=0;n.subscribe((0,o._)(r,function(n){return e.call(t,n,i++)&&r.next(n)}))})}},8259(e,t,n){"use strict";n.d(t,{P:()=>o});var r=n(2235);const o=(e,t,n)=>{const o=e.includes("."),i=!!t;return!o||e.match(/\.\d+$/)?t=>void 0!==(0,r.hd)(t,e)===i:t=>{const n=(0,r.Rm)(t,e,{preserveIndex:!0}),o=(0,r.hd)(n,e.substring(0,e.lastIndexOf(".")));return(0,r.cy)(o)?o.some(e=>void 0!==e)===i:void 0!==o===i}}},8609(e,t,n){"use strict";n.d(t,{t:()=>f});var r=n(4629),o=n(9092),i={now:function(){return(i.delegate||Date).now()},delegate:void 0},u=function(e){function t(t,n,r){void 0===t&&(t=1/0),void 0===n&&(n=1/0),void 0===r&&(r=i);var o=e.call(this)||this;return o._bufferSize=t,o._windowTime=n,o._timestampProvider=r,o._buffer=[],o._infiniteTimeWindow=!0,o._infiniteTimeWindow=n===1/0,o._bufferSize=Math.max(1,t),o._windowTime=Math.max(1,n),o}return(0,r.C6)(t,e),t.prototype.next=function(t){var n=this,r=n.isStopped,o=n._buffer,i=n._infiniteTimeWindow,u=n._timestampProvider,s=n._windowTime;r||(o.push(t),!i&&o.push(u.now()+s)),this._trimBuffer(),e.prototype.next.call(this,t)},t.prototype._subscribe=function(e){this._throwIfClosed(),this._trimBuffer();for(var t=this._innerSubscribe(e),n=this._infiniteTimeWindow,r=this._buffer.slice(),o=0;o0&&(t=new a.Ms({next:function(e){return g.next(e)},error:function(e){p=!0,y(),r=l(v,i,e),g.error(e)},complete:function(){h=!0,y(),r=l(v,f),g.complete()}}),(0,s.Tg)(e).subscribe(t))})(e)}}({connector:function(){return new u(h,t,n)},resetOnError:!0,resetOnComplete:!1,resetOnRefCountZero:d})}},8900(e){e.exports=function(){"use strict";var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)},t=function(){return(t=Object.assign||function(e){for(var t,n=1,r=arguments.length;n.",Je="String expected.",et=[],tt="__dbnames",nt="readonly",rt="readwrite";function ot(e,t){return e?t?function(){return e.apply(this,arguments)&&t.apply(this,arguments)}:e:t}var it={type:3,lower:-1/0,lowerOpen:!1,upper:[[]],upperOpen:!1};function ut(e){return"string"!=typeof e||/\./.test(e)?function(e){return e}:function(t){return void 0===t[e]&&e in t&&delete(t=S(t))[e],t}}function st(){throw V.Type()}function at(e,t){try{var n=ct(e),r=ct(t);if(n!==r)return"Array"===n?1:"Array"===r?-1:"binary"===n?1:"binary"===r?-1:"string"===n?1:"string"===r?-1:"Date"===n?1:"Date"!==r?NaN:-1;switch(n){case"number":case"Date":case"string":return tn+u&&o(n+h)})})}var i=yt(n)&&n.limit===1/0&&("function"!=typeof e||e===Pt)&&{index:n.index,range:n.range};return o(0).then(function(){if(0=i})).length?(t.forEach(function(e){c.push(function(){var t=l,n=e._cfg.dbschema;fn(r,t,a),fn(r,n,a),l=r._dbSchema=n;var u=un(t,n);u.add.forEach(function(e){sn(a,e[0],e[1].primKey,e[1].indexes)}),u.change.forEach(function(e){if(e.recreate)throw new V.Upgrade("Not yet support for changing primary key");var t=a.objectStore(e.name);e.add.forEach(function(e){return cn(t,e)}),e.change.forEach(function(e){t.deleteIndex(e.name),cn(t,e)}),e.del.forEach(function(e){return t.deleteIndex(e)})});var c=e._cfg.contentUpgrade;if(c&&e._cfg.version>i){Jt(r,a),s._memoizedTables={};var f=x(n);u.del.forEach(function(e){f[e]=t[e]}),tn(r,[r.Transaction.prototype]),en(r,[r.Transaction.prototype],o(f),f),s.schema=f;var h,d=R(c);return d&&Fe(),u=_e.follow(function(){var e;(h=c(s))&&d&&(e=Le.bind(null,null),h.then(e,e))}),h&&"function"==typeof h.then?_e.resolve(h):u.then(function(){return h})}}),c.push(function(t){var n,o,i=e._cfg.dbschema;n=i,o=t,[].slice.call(o.db.objectStoreNames).forEach(function(e){return null==n[e]&&o.db.deleteObjectStore(e)}),tn(r,[r.Transaction.prototype]),en(r,[r.Transaction.prototype],r._storeNames,r._dbSchema),s.schema=r._dbSchema}),c.push(function(t){r.idbdb.objectStoreNames.contains("$meta")&&(Math.ceil(r.idbdb.version/10)===e._cfg.version?(r.idbdb.deleteObjectStore("$meta"),delete r._dbSchema.$meta,r._storeNames=r._storeNames.filter(function(e){return"$meta"!==e})):t.objectStore("$meta").put(e._cfg.version,"version"))})}),function e(){return c.length?_e.resolve(c.shift()(s.idbtrans)).then(e):_e.resolve()}().then(function(){an(l,a)})):_e.resolve();var r,i,s,a,c,l}).catch(s)):(o(i).forEach(function(e){sn(n,e,i[e].primKey,i[e].indexes)}),Jt(e,n),void _e.follow(function(){return e.on.populate.fire(u)}).catch(s));var r,c})}function on(e,t){an(e._dbSchema,t),t.db.version%10!=0||t.objectStoreNames.contains("$meta")||t.db.createObjectStore("$meta").add(Math.ceil(t.db.version/10-1),"version");var n=ln(0,e.idbdb,t);fn(e,e._dbSchema,t);for(var r=0,o=un(n,e._dbSchema).change;rMath.pow(2,62)?0:r.oldVersion,h=r<1,e.idbdb=d.result,u&&on(e,f),rn(e,r/10,f,c))},c),d.onsuccess=Ke(function(){f=null;var n,s,c,p,y,m=e.idbdb=d.result,g=v(m.objectStoreNames);if(0t.limit?n.length=t.limit:e.length===t.limit&&n.length=r.limit&&(!r.values||e.req.values)&&Xn(e.req.query.range,r.query.range)}),!1,o,i];case"count":return u=i.find(function(e){return Gn(e.req.query.range,r.query.range)}),[u,!!u,o,i]}}(n,r,"query",e),a=s[0],c=s[1],l=s[2],f=s[3];return a&&c?a.obsSet=e.obsSet:(c=o.query(e).then(function(e){var n=e.result;if(a&&(a.res=n),t){for(var r=0,o=n.length;ri});var r=n(8896),o=n(1693);function i(e){return(0,o.T)(e[r.s])}},9283(e,t,n){"use strict";n.d(t,{C:()=>o});var r=n(5964);const o=(e,t,n)=>(0,r.ON)(e,t,n,r.C5)},9739(e,t,n){"use strict";n.d(t,{X:()=>r});var r=function(e){return e&&"number"==typeof e.length&&"function"!=typeof e}},9852(e,t,n){"use strict";n.d(t,{H:()=>_});var r=n(7688),o=n(8071),i=n(5096),u=n(4370);function s(e,t){return void 0===t&&(t=0),(0,i.N)(function(n,r){n.subscribe((0,u._)(r,function(n){return(0,o.N)(r,e,function(){return r.next(n)},t)},function(){return(0,o.N)(r,e,function(){return r.complete()},t)},function(n){return(0,o.N)(r,e,function(){return r.error(n)},t)}))})}function a(e,t){return void 0===t&&(t=0),(0,i.N)(function(n,r){r.add(e.schedule(function(){return n.subscribe(r)},t))})}var c=n(1753);var l=n(4207),f=n(1693);function h(e,t){if(!e)throw new Error("Iterable cannot be null");return new c.c(function(n){(0,o.N)(n,t,function(){var r=e[Symbol.asyncIterator]();(0,o.N)(n,t,function(){r.next().then(function(e){e.done?n.complete():n.next(e.value)})},0,!0)})})}var d=n(9065),p=n(5796),y=n(9739),v=n(4799),m=n(3819),g=n(4429),b=n(3026);function w(e,t){if(null!=e){if((0,d.l)(e))return function(e,t){return(0,r.Tg)(e).pipe(a(t),s(t))}(e,t);if((0,y.X)(e))return function(e,t){return new c.c(function(n){var r=0;return t.schedule(function(){r===e.length?n.complete():(n.next(e[r++]),n.closed||this.schedule())})})}(e,t);if((0,p.y)(e))return function(e,t){return(0,r.Tg)(e).pipe(a(t),s(t))}(e,t);if((0,m.T)(e))return h(e,t);if((0,v.x)(e))return function(e,t){return new c.c(function(n){var r;return(0,o.N)(n,t,function(){r=e[l.l](),(0,o.N)(n,t,function(){var e,t,o;try{t=(e=r.next()).value,o=e.done}catch(i){return void n.error(i)}o?n.complete():n.next(t)},0,!0)}),function(){return(0,f.T)(null==r?void 0:r.return)&&r.return()}})}(e,t);if((0,b.U)(e))return function(e,t){return h((0,b.C)(e),t)}(e,t)}throw(0,g.L)(e)}function _(e,t){return t?w(e,t):(0,r.Tg)(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/9dae6e71.d38c8ec6.js b/docs/assets/js/9dae6e71.d38c8ec6.js deleted file mode 100644 index 34c6b9d5ff2..00000000000 --- a/docs/assets/js/9dae6e71.d38c8ec6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[3325],{2231(e,r,t){t.r(r),t.d(r,{default:()=>l});var a=t(544),i=t(4848);function l(){return(0,a.default)({sem:{id:"gads",metaTitle:"The Open Source alternative for Firestore",title:(0,i.jsxs)(i.Fragment,{children:["The ",(0,i.jsx)("b",{children:"Open Source"})," alternative for "," ",(0,i.jsx)("b",{children:"Firestore"})]})}})}}}]); \ No newline at end of file diff --git a/docs/assets/js/9dd8ea89.9d935eb6.js b/docs/assets/js/9dd8ea89.9d935eb6.js deleted file mode 100644 index 34ca75fc383..00000000000 --- a/docs/assets/js/9dd8ea89.9d935eb6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[1715],{7775(e,n,s){s.r(n),s.d(n,{assets:()=>t,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"logger","title":"RxDB Logger Plugin - Track & Optimize","description":"Take control of your RxDatabase logs. Monitor every write, query, or attachment retrieval to swiftly diagnose and fix performance bottlenecks.","source":"@site/docs/logger.md","sourceDirName":".","slug":"/logger.html","permalink":"/logger.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB Logger Plugin - Track & Optimize","slug":"logger.html","description":"Take control of your RxDatabase logs. Monitor every write, query, or attachment retrieval to swiftly diagnose and fix performance bottlenecks."},"sidebar":"tutorialSidebar","previous":{"title":"Key Compression","permalink":"/key-compression.html"},"next":{"title":"Remote RxStorage","permalink":"/rx-storage-remote.html"}}');var o=s(4848),i=s(8453);const a={title:"RxDB Logger Plugin - Track & Optimize",slug:"logger.html",description:"Take control of your RxDatabase logs. Monitor every write, query, or attachment retrieval to swiftly diagnose and fix performance bottlenecks."},l="RxDB Logger Plugin",t={},c=[{value:"Using the logger plugin",id:"using-the-logger-plugin",level:2},{value:"Specify what to be logged",id:"specify-what-to-be-logged",level:2},{value:"Using custom logging functions",id:"using-custom-logging-functions",level:2}];function d(e){const n={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",span:"span",strong:"strong",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"rxdb-logger-plugin",children:"RxDB Logger Plugin"})}),"\n",(0,o.jsxs)(n.p,{children:["With the logger plugin you can log all operations to the ",(0,o.jsx)(n.a,{href:"/rx-storage.html",children:"storage layer"})," of your ",(0,o.jsx)(n.a,{href:"/rx-database.html",children:"RxDatabase"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["This is useful to debug performance problems and for monitoring with Application Performance Monitoring (APM) tools like ",(0,o.jsx)(n.strong,{children:"Bugsnag"}),", ",(0,o.jsx)(n.strong,{children:"Datadog"}),", ",(0,o.jsx)(n.strong,{children:"Elastic"}),", ",(0,o.jsx)(n.strong,{children:"Sentry"})," and others."]}),"\n",(0,o.jsxs)(n.p,{children:["Notice that the logger plugin is not part of the RxDB core, it is part of ",(0,o.jsx)(n.a,{href:"/premium/",children:"RxDB Premium \ud83d\udc51"}),"."]}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{src:"./files/logger.png",alt:"RxDB logger example",width:"600px"})}),"\n",(0,o.jsx)(n.h2,{id:"using-the-logger-plugin",children:"Using the logger plugin"}),"\n",(0,o.jsxs)(n.p,{children:["The logger is a wrapper that can be wrapped around any ",(0,o.jsx)(n.a,{href:"/rx-storage.html",children:"RxStorage"}),". Once your storage is wrapped, you can create your database with the wrapped storage and the logging will automatically happen."]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" wrappedLoggerStorage"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/logger'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageIndexedDB"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-indexeddb'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// wrap a storage with the logger"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" loggingStorage"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" wrappedLoggerStorage"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({})"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// create your database with the wrapped storage"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" loggingStorage"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// create collections etc..."})})]})})}),"\n",(0,o.jsx)(n.h2,{id:"specify-what-to-be-logged",children:"Specify what to be logged"}),"\n",(0,o.jsxs)(n.p,{children:["By default, the plugin will log all operations and it will also run a ",(0,o.jsx)(n.code,{children:"console.time()/console.timeEnd()"})," around each operation. You can specify what to log so that your logs are less noisy. For this you provide a settings object when calling ",(0,o.jsx)(n.code,{children:"wrappedLoggerStorage()"}),"."]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" loggingStorage"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" wrappedLoggerStorage"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({})"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" settings"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // can used to prefix all log strings, default=''"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" prefix"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-prefix'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Be default, all settings are true."})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // if true, it will log timings with console.time() and console.timeEnd()"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" times"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // if false, it will not log meta storage instances like used in replication"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" metaStorageInstances"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // operations"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" bulkWrite"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" findDocumentsById"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" query"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" count"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" info"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" getAttachmentData"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" getChangedDocumentsSince"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" cleanup"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" close"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" remove"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,o.jsx)(n.h2,{id:"using-custom-logging-functions",children:"Using custom logging functions"}),"\n",(0,o.jsx)(n.p,{children:"With the logger plugin you can also run custom log functions for all operations."}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" loggingStorage"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" wrappedLoggerStorage"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({})"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" onOperationStart"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (operationsName"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" logId"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" args) "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" void"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" onOperationEnd"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (operationsName"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" logId"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" args) "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" void"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" onOperationError"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (operationsName"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" logId"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" args"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" error) "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" void"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453(e,n,s){s.d(n,{R:()=>a,x:()=>l});var r=s(6540);const o={},i=r.createContext(o);function a(e){const n=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/9e91b6f0.cfa4288f.js b/docs/assets/js/9e91b6f0.cfa4288f.js deleted file mode 100644 index 756c8d98e74..00000000000 --- a/docs/assets/js/9e91b6f0.cfa4288f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[3021],{5200(e,n,t){t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>h});const s=JSON.parse('{"id":"why-nosql","title":"Why NoSQL Powers Modern UI Apps","description":"Discover how NoSQL enables offline-first UI apps. Learn about easy replication, conflict resolution, and why relational data isn\'t always necessary.","source":"@site/docs/why-nosql.md","sourceDirName":".","slug":"/why-nosql.html","permalink":"/why-nosql.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Why NoSQL Powers Modern UI Apps","slug":"why-nosql.html","description":"Discover how NoSQL enables offline-first UI apps. Learn about easy replication, conflict resolution, and why relational data isn\'t always necessary."},"sidebar":"tutorialSidebar","previous":{"title":"Why Local-First Software Is the Future and its Limitations","permalink":"/articles/local-first-future.html"},"next":{"title":"Downsides of Local First / Offline First","permalink":"/downsides-of-offline-first.html"}}');var o=t(4848),a=t(8453);t(2271);const i={title:"Why NoSQL Powers Modern UI Apps",slug:"why-nosql.html",description:"Discover how NoSQL enables offline-first UI apps. Learn about easy replication, conflict resolution, and why relational data isn't always necessary."},r="Why UI applications need NoSQL",l={},h=[{value:"Transactions do not work with humans involved",id:"transactions-do-not-work-with-humans-involved",level:2},{value:"Transactions do not work with offline-first",id:"transactions-do-not-work-with-offline-first",level:2},{value:"Relational queries in NoSQL",id:"relational-queries-in-nosql",level:2},{value:"Reliable replication",id:"reliable-replication",level:2},{value:"Server side validation",id:"server-side-validation",level:2},{value:"Event optimization",id:"event-optimization",level:2},{value:"Migration without relations",id:"migration-without-relations",level:2},{value:"Everything can be downgraded to NoSQL",id:"everything-can-be-downgraded-to-nosql",level:2},{value:"Caching query results",id:"caching-query-results",level:2},{value:"TypeScript support",id:"typescript-support",level:2},{value:"What you lose with NoSQL",id:"what-you-lose-with-nosql",level:2},{value:"But there is database XY",id:"but-there-is-database-xy",level:2}];function c(e){const n={a:"a",blockquote:"blockquote",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.header,{children:(0,o.jsx)(n.h1,{id:"why-ui-applications-need-nosql",children:"Why UI applications need NoSQL"})}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.a,{href:"https://rxdb.info",children:"RxDB"}),", a client side, offline first, JavaScript database, is now several years old.\nOften new users appear in the chat and ask for that one simple feature:\nThey want to store and query ",(0,o.jsx)(n.strong,{children:"relational data"}),"."]}),"\n",(0,o.jsxs)(n.blockquote,{children:["\n",(0,o.jsx)(n.p,{children:"So why not just implement SQL?"}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["All these client databases out there have on some kind of document based, NoSQL like, storage engine. PouchDB, Firebase, AWS Datastore, RethinkDB's ",(0,o.jsx)(n.a,{href:"https://github.com/rethinkdb/horizon",children:"Horizon"}),", Meteor's ",(0,o.jsx)(n.a,{href:"https://github.com/mWater/minimongo",children:"Minimongo"}),", ",(0,o.jsx)(n.a,{href:"https://parseplatform.org/",children:"Parse"}),", ",(0,o.jsx)(n.a,{href:"https://realm.io/",children:"Realm"}),". They all do not have real relational data."]}),"\n",(0,o.jsxs)(n.p,{children:["They might have some kind of weak relational foreign keys like the ",(0,o.jsx)(n.a,{href:"/population.html",children:"RxDB Population"}),"\nor the ",(0,o.jsx)(n.a,{href:"https://docs.amplify.aws/lib/datastore/relational/q/platform/js/",children:"relational models"})," of AWS Datastore.\nBut these relations are weak. The foreign keys are not enforced to be valid like in PostgreSQL, and you cannot query\nthe rows with complex subqueries over different tables or collections and then make mutations based on the result."]}),"\n",(0,o.jsx)(n.p,{children:"There must be a reason for that. In fact, there are multiple of them and in the following I want to show you why you can neither have, nor want real relational data when you have a client-side database with replication."}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{src:"./files/no-sql.png",alt:"NoSQL",width:"100"})}),"\n",(0,o.jsx)(n.h2,{id:"transactions-do-not-work-with-humans-involved",children:"Transactions do not work with humans involved"}),"\n",(0,o.jsxs)(n.p,{children:["On the server side, transactions are used to run steps of logic inside of a self contained ",(0,o.jsx)(n.code,{children:"unit of work"}),". The database system ensures that multiple transactions do not run in parallel or interfere with each other.\nThis works well because on the server side you can predict how longer everything takes. It can be ensured that one transaction does not block everything else for too long which would make the system not responding anymore to other requests."]}),"\n",(0,o.jsx)(n.p,{children:"When you build a UI based application that is used by a real human, you can no longer predict how long anything takes.\nThe user clicks the edit button and expects to not have anyone else change the document while the user is in edit mode.\nUsing a transaction to ensure nothing is changed in between, is not an option because the transaction could be open for a long\ntime and other background tasks, like replication, would no longer work."}),"\n",(0,o.jsxs)(n.p,{children:["So whenever a human is involved, this kind of logic has to be implemented using other strategies. Most NoSQL databases like ",(0,o.jsx)(n.a,{href:"./",children:"RxDB"})," or ",(0,o.jsx)(n.a,{href:"/replication-couchdb.html",children:"CouchDB"})," use a system based on ",(0,o.jsx)(n.a,{href:"/transactions-conflicts-revisions.html",children:"revision and conflicts"})," to handle these."]}),"\n",(0,o.jsx)(n.h2,{id:"transactions-do-not-work-with-offline-first",children:"Transactions do not work with offline-first"}),"\n",(0,o.jsxs)(n.p,{children:["When you want to build an ",(0,o.jsx)(n.a,{href:"/offline-first.html",children:"offline-first"})," application, it is assumed that the user can also read and write data, even when the device has lost the connection to the backend.\nYou could use database transactions on writes to the client's database state, but enforcing a transaction boundary across other instances like clients or servers, is not possible when there is no connection."]}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{src:"./files/why-no-transactions.jpg",alt:"offline first vs relational transactions",width:"400"})}),"\n",(0,o.jsxs)(n.p,{children:["On the client you could run an update query where all ",(0,o.jsx)(n.code,{children:"color: red"})," rows are changed to ",(0,o.jsx)(n.code,{children:"color: blue"}),", but this would not guarantee that there will still be other ",(0,o.jsx)(n.code,{children:"red"})," documents when the client goes online again and restarts the replication with the server."]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"sql","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"sql","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"UPDATE"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" docs"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"SET"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" docs.color "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'red'"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"WHERE"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" docs.color "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'blue'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]})]})})}),"\n",(0,o.jsx)(n.h2,{id:"relational-queries-in-nosql",children:"Relational queries in NoSQL"}),"\n",(0,o.jsx)(n.p,{children:"What most people want from a relational database, is to run queries over multiple tables.\nSome people think that they cannot do that with NoSQL, so let me explain."}),"\n",(0,o.jsxs)(n.p,{children:["Let's say you have two tables with ",(0,o.jsx)(n.code,{children:"customers"})," and ",(0,o.jsx)(n.code,{children:"cities"})," where each city has an ",(0,o.jsx)(n.code,{children:"id"})," and each customer has a ",(0,o.jsx)(n.code,{children:"city_id"}),". You want to get every customer that resides in ",(0,o.jsx)(n.code,{children:"Tokyo"}),". With SQL, you would use a query like this:"]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"sql","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"sql","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"SELECT"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" *"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"FROM"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" city"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"WHERE"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" city.name "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Tokyo'"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"LEFT JOIN"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" customer "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"ON"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" customer.city_id "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" city.id;"})]})]})})}),"\n",(0,o.jsxs)(n.p,{children:["With ",(0,o.jsx)(n.strong,{children:"NoSQL"})," you can just do the same, but you have to write it manually:"]}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"typescript","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"typescript","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" cityDocument"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"cities"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".where"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'name'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".equals"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Tokyo'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" customerDocuments"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"customers"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".where"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'city_id'"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".equals"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"cityDocument"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".id)"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),"\n",(0,o.jsx)(n.p,{children:"So what are the differences? The SQL version would run faster on a remote database server because it would aggregate all data there and return only the customers as result set. But when you have a local database, it is not really a difference. Querying the two tables by hand would have about the same performance as a JavaScript implementation of SQL that is running locally."}),"\n",(0,o.jsxs)(n.p,{children:["The main benefit from using SQL is, that the SQL query runs inside of a ",(0,o.jsx)(n.strong,{children:"single transaction"}),". When a change to one of our two tables happens, while our query runs, the SQL database will ensure that the write does not affect the result of the query. This could happen with NoSQL, while you retrieve the city document, the customer table gets changed and your result is not correct for the dataset that was there when you started the querying. As a workaround, you could observe the database for changes and if a change happened in between, you have to re-run everything."]}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{src:"./files/no-relational-data.png",alt:"no relational data",width:"250"})}),"\n",(0,o.jsx)(n.h2,{id:"reliable-replication",children:"Reliable replication"}),"\n",(0,o.jsxs)(n.p,{children:["In an offline first app, your data is replicated from your backend servers to your users and you want it to be reliable.\nThe replication is ",(0,o.jsx)(n.strong,{children:"reliable"})," when, no matter what happens, every online client is able to run a replication\nand end up with the ",(0,o.jsx)(n.strong,{children:"exact same"})," database state as any other client."]}),"\n",(0,o.jsx)(n.p,{children:"Implementing a reliable replication protocol is hard because of the circumstances of your app:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Your users have unknown devices."}),"\n",(0,o.jsx)(n.li,{children:"They have an unknown internet speed."}),"\n",(0,o.jsx)(n.li,{children:"They can go offline or online at any time."}),"\n",(0,o.jsx)(n.li,{children:"Clients can be offline for a several days with un-synced changes."}),"\n",(0,o.jsx)(n.li,{children:"You can have many users at the same time."}),"\n",(0,o.jsx)(n.li,{children:"The users can do many database writes at the same time to the same entities."}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"Now lets say you have a SQL database and one of your users, called Alice, runs a query that mutates some rows, based on a condition."}),"\n",(0,o.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"sql","data-theme":"css-variables",children:(0,o.jsxs)(n.code,{"data-language":"sql","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"# mark all items "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"out"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" of stock "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"as"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" inStock"}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"FALSE"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"UPDATE"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" Table_A"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"SET"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" Table_A.inStock "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" FALSE"})]}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"FROM"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" Table_A"})}),"\n",(0,o.jsx)(n.span,{"data-line":"",children:(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"WHERE"})}),"\n",(0,o.jsxs)(n.span,{"data-line":"",children:[(0,o.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" Table_A.amountInStock "}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"})]})]})})}),"\n",(0,o.jsx)(n.p,{children:"At first, the query runs on the local database of Alice and everything is fine."}),"\n",(0,o.jsxs)(n.p,{children:["But at the same time Bob, the other client, updates a row and sets ",(0,o.jsx)(n.code,{children:"amountInStock"})," from ",(0,o.jsx)(n.code,{children:"0"})," to ",(0,o.jsx)(n.code,{children:"1"}),".\nNow Bob's client replicates the changes from Alice and runs them. Bob will end up with a different database state than Alice because on one of the rows, the ",(0,o.jsx)(n.code,{children:"WHERE"})," condition was not met. This is not what we want, so our replication protocol should be able to fix it. For that it has to reduce all mutations into a deterministic state."]}),"\n",(0,o.jsx)(n.p,{children:'Let me loosely describe how "many" SQL replications work:'}),"\n",(0,o.jsxs)(n.p,{children:["Instead of just running all replicated queries, we remember a list of all past queries. When a new query comes in that happened ",(0,o.jsx)(n.code,{children:"before"})," our last query, we roll back the previous queries, run the new query, and then re-execute our own queries on top of that. For that to work, all queries need a timestamp so we can order them correctly. But you cannot rely on the clock that is running at the client. Client side clocks drift, they can run in a different speed or even a malicious client modifies the clock on purpose. So instead of a normal timestamp, we have to use a ",(0,o.jsx)(n.a,{href:"https://jaredforsyth.com/posts/hybrid-logical-clocks/",children:"Hybrid Logical Clock"})," that takes a client generated id and the number of the clients query into account. Our timestamp will then look like ",(0,o.jsx)(n.code,{children:"2021-10-04T15:29.40.273Z-0000-eede1195b7d94dd5"}),". These timestamps can be brought into a deterministic order and each client can run the replicated queries in the same order."]}),"\n",(0,o.jsx)(n.p,{children:"While this sounds easy and realizable, we have some problems:\nThis kind of replication works great when you replicate between multiple SQL servers. It does not work great when you replicate between a single server and many clients."}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"As mentioned above, clients can be offline for a long time which could require us to do many and heavy rollbacks on each client when someone comes back after a long time and replicates the change."}),"\n",(0,o.jsx)(n.li,{children:"We have many clients where many changes can appear and our database would have to roll back many times."}),"\n",(0,o.jsx)(n.li,{children:"During the rollback, the database cannot be used for read queries."}),"\n",(0,o.jsx)(n.li,{children:"It is required that each client downloads and keeps the whole query history."}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["With ",(0,o.jsx)(n.strong,{children:"NoSQL"}),", replication works different. A new client downloads all current documents and each time a document changes, that document is downloaded again. Instead of replicating the query that leads to a data change, we just replicate the changed data itself. Of course, we could do the same with SQL and just replicate the affected rows of a query, like WatermelonDB ",(0,o.jsx)(n.a,{href:"https://youtu.be/uFvHURTRLxQ?t=1133",children:"does it"}),". This was a clever way to go for WatermelonDB, because it was initially made for React Native and did want to use the fast SQLite instead of the slow ",(0,o.jsx)(n.a,{href:"https://medium.com/@Sendbird/extreme-optimization-of-asyncstorage-in-react-native-b2a1e0107b34",children:"AsyncStorage"}),". But in a more general view, it defeats the whole purpose of having a replicating relational database because you have transactions locally, but these transactions become ",(0,o.jsx)(n.strong,{children:"meaningless"})," as soon as the data goes through the replication layer."]}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{src:"./files/database-replication.png",alt:"database replication",width:"200"})}),"\n",(0,o.jsx)(n.h2,{id:"server-side-validation",children:"Server side validation"}),"\n",(0,o.jsx)(n.p,{children:"Whenever there is client-side input, it must be validated on the server.\nOn a NoSQL database, validating a changed document is trivial. The client sends the changed document to the server, and the server can then check if the user was allowed to modify that one document and if the applied changes are ok."}),"\n",(0,o.jsx)(n.p,{children:"Safely validating a SQL query is up to impossible."}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"You first need a way to parse the query with all this complex SQL syntax and keywords."}),"\n",(0,o.jsx)(n.li,{children:"You have to ensure that the query does not DOS your system."}),"\n",(0,o.jsx)(n.li,{children:"Then you check which rows would be affected when running the query and if the user was allowed to change them"}),"\n",(0,o.jsx)(n.li,{children:"Then you check if the mutation to that rows are valid."}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["For simple queries like an insert/update/delete to a single row, this might be doable. But a query with 4 ",(0,o.jsx)(n.code,{children:"LEFT JOIN"})," will be hard."]}),"\n",(0,o.jsx)(n.h2,{id:"event-optimization",children:"Event optimization"}),"\n",(0,o.jsx)(n.p,{children:"With NoSQL databases, each write event always affects exactly one document. This makes it easy to optimize the processing of events at the client. For example instead of handling multiple updates to the same document, when the user comes online again, you could skip everything but the last event."}),"\n",(0,o.jsxs)(n.p,{children:["Similar to that you can optimize observable query results. When you query the ",(0,o.jsx)(n.code,{children:"customers"})," table you get a query result of 10 customers. Now a new customer is added to the table and you want to know how the new query results look like. You could analyze the event and now you know that you only have to add the new customer to the previous results set, instead of running the whole query again. These types of optimizations can be run with all NoSQL queries and even work with ",(0,o.jsx)(n.code,{children:"limit"})," and ",(0,o.jsx)(n.code,{children:"skip"})," operators. In RxDB this all happens in the background with the ",(0,o.jsx)(n.a,{href:"https://github.com/pubkey/event-reduce",children:"EventReduce algorithm"})," that calculates new query results on incoming changes."]}),"\n",(0,o.jsx)(n.p,{children:"These optimizations do not really work with relational data. A change to one table could affect a query to any other tables. and you could not just calculate the new results based on the event. You would always have to re-run the full query to get the updated results."}),"\n",(0,o.jsx)(n.h2,{id:"migration-without-relations",children:"Migration without relations"}),"\n",(0,o.jsx)(n.p,{children:"Sooner or later you change the layout of your data. You update the schema and you also have to migrate the stored rows/documents. In NoSQL this is often not a big deal because all of your documents are modeled as self containing piece of data. There is an old version of the document and you have a function that transforms it into the new version."}),"\n",(0,o.jsx)(n.p,{children:"With relational data, nothing is self-contained. The relevant data for the migration of a single row could be inside any other table. So when changing the schema, it will be important which table to migrate first and how to orchestrate the migration or relations."}),"\n",(0,o.jsx)(n.p,{children:"On client side applications, this is even harder because the client can close the application at any time and the migration must be able to continue."}),"\n",(0,o.jsx)(n.h2,{id:"everything-can-be-downgraded-to-nosql",children:"Everything can be downgraded to NoSQL"}),"\n",(0,o.jsxs)(n.p,{children:["To use an offline first database in the frontend, you have to make it compatible with your backend APIs.\nMaking software things compatible often means you have to find the ",(0,o.jsx)(n.strong,{children:"lowest common denominator"}),".\nWhen you have SQLite in the frontend and want to replicate it with the backend, the backend also has to use SQLite. You cannot even use PostgreSQL because it has a different SQL dialect and some queries might fail. But you do not want to let the frontend dictate which technologies to use in the backend just to make replication work."]}),"\n",(0,o.jsxs)(n.p,{children:["With NoSQL, you just have documents and writes to these documents. You can build a document based layer on top of everything by ",(0,o.jsx)(n.strong,{children:"removing"})," functionality. It can be built on top of SQL, but also on top of a graph database or even on top of a key-value store like ",(0,o.jsx)(n.a,{href:"/adapters.html#leveldown",children:"levelDB"})," or ",(0,o.jsx)(n.a,{href:"/rx-storage-foundationdb.html",children:"FoundationDB"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["With that document layer you can build a ",(0,o.jsx)(n.a,{href:"/replication.html",children:"Sync Engine"})," that serves documents sorted by the last update time and there you have a realtime replication."]}),"\n",(0,o.jsx)(n.h2,{id:"caching-query-results",children:"Caching query results"}),"\n",(0,o.jsx)(n.p,{children:"Memory is limited and this is especially true for client side applications where you never know how much free RAM the device really has. You want to have a fast realtime UI, so your database must be able to cache query results."}),"\n",(0,o.jsxs)(n.p,{children:["When you run a SQL query like ",(0,o.jsx)(n.code,{children:"SELECT .."})," the result of it can be anything. An ",(0,o.jsx)(n.code,{children:"array"}),", a ",(0,o.jsx)(n.code,{children:"number"}),", a ",(0,o.jsx)(n.code,{children:"string"}),", a single row, it depends on how the query goes on. So the caching strategy can only be to keep the result in memory, once for each query.\nThis scales very bad because the more queries you run, the more results you have to store in memory."]}),"\n",(0,o.jsxs)(n.p,{children:["When you make a query to a NoSQL collection, you always know how the result will look like. It is a list of documents, based on the collection's schema (if you have one). The result set is stored in memory, but because you get similar documents for different queries to the same collection, we can de-duplicated the documents. So when multiple queries return the same document, we only have it in the cache ",(0,o.jsx)(n.strong,{children:"once"})," and each query caches point to the same memory object. So no matter how many queries you make, your cache maximum is the collection size."]}),"\n",(0,o.jsx)(n.h2,{id:"typescript-support",children:"TypeScript support"}),"\n",(0,o.jsx)(n.p,{children:"Modern web apps are build with TypeScript and you want the transpiler to know the types of your query result so it can give you build time errors when something does not match. This is quite easy on document based systems. The typings of for each document of a collection can be generated from the schema, and all queries to that collection will always return the given document type. With SQL you have to manually write the typings for each query by hand because it can contain all these aggregate functions that affect the type of the query's result."}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{src:"./files/typescript.png",alt:"typescript",width:"80"})}),"\n",(0,o.jsx)(n.h2,{id:"what-you-lose-with-nosql",children:"What you lose with NoSQL"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"You can not run relational queries across tables inside a single transaction."}),"\n",(0,o.jsxs)(n.li,{children:["You can not mutate documents based on a ",(0,o.jsx)(n.code,{children:"WHERE"})," clause, in a single transaction."]}),"\n",(0,o.jsx)(n.li,{children:"You need to resolve replication conflicts on a per-document basis."}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"but-there-is-database-xy",children:"But there is database XY"}),"\n",(0,o.jsx)(n.p,{children:"Yes, there are SQL databases out there that run on the client side or have replication, but not both."}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["WebSQL / ",(0,o.jsx)(n.a,{href:"https://github.com/sql-js/sql.js/",children:"sql.js"}),": In the past there was ",(0,o.jsx)(n.strong,{children:"WebSQL"})," in the browser. It was a direct mapping to SQLite because all browsers used the SQLite implementation. You could store relational data in it, but there was no concept of replication at any point in time. ",(0,o.jsx)(n.strong,{children:"sql.js"})," is an SQLite complied to JavaScript. It has not replication and it has (for now) no persistent storage, everything is stored in memory."]}),"\n",(0,o.jsx)(n.li,{children:"WatermelonDB is a SQL databases that runs in the client. WatermelonDB uses a document-based replication that is not able to replicate relational queries."}),"\n",(0,o.jsx)(n.li,{children:"Cockroach / Spanner/ PostgreSQL etc. are SQL databases with replication. But they run on servers, not on clients, so they can make different trade offs."}),"\n"]}),"\n",(0,o.jsx)(n.h1,{id:"further-read",children:"Further read"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Cockroach Labs: ",(0,o.jsx)(n.a,{href:"https://www.cockroachlabs.com/blog/living-without-atomic-clocks/",children:"Living Without Atomic Clocks"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"/transactions-conflicts-revisions.html",children:"Transactions, Conflicts and Revisions in RxDB"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.a,{href:"https://dbmsmusings.blogspot.com/2015/10/why-mongodb-cassandra-hbase-dynamodb_28.html",children:"Why MongoDB, Cassandra, HBase, DynamoDB, and Riak will only let you perform transactions on a single data item"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.code,{children:"Make a PR to this file if you have more interesting links to that topic"})}),"\n"]}),"\n"]})]})}function d(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},8453(e,n,t){t.d(n,{R:()=>i,x:()=>r});var s=t(6540);const o={},a=s.createContext(o);function i(e){const n=s.useContext(a);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/a406dc27.d08b03b3.js b/docs/assets/js/a406dc27.d08b03b3.js deleted file mode 100644 index 15d02662ac5..00000000000 --- a/docs/assets/js/a406dc27.d08b03b3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[1500],{6837(e,s,n){n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"migration-storage","title":"Migration Storage","description":"Effortlessly migrate your data between storages in RxDB using the Storage Migration plugin. Retain your documents when switching storages or major versions.","source":"@site/docs/migration-storage.md","sourceDirName":".","slug":"/migration-storage.html","permalink":"/migration-storage.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Migration Storage","slug":"migration-storage.html","description":"Effortlessly migrate your data between storages in RxDB using the Storage Migration plugin. Retain your documents when switching storages or major versions."},"sidebar":"tutorialSidebar","previous":{"title":"Schema Migration","permalink":"/migration-schema.html"},"next":{"title":"Attachments","permalink":"/rx-attachment.html"}}');var i=n(4848),o=n(8453);const a={title:"Migration Storage",slug:"migration-storage.html",description:"Effortlessly migrate your data between storages in RxDB using the Storage Migration plugin. Retain your documents when switching storages or major versions."},l="Storage Migration",t={},c=[{value:"Usage",id:"usage",level:2},{value:"Migrate from a previous RxDB major version",id:"migrate-from-a-previous-rxdb-major-version",level:2},{value:"Disable Version Check on RxDB Premium \ud83d\udc51",id:"disable-version-check-on-rxdb-premium-",level:2}];function d(e){const s={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"storage-migration",children:"Storage Migration"})}),"\n",(0,i.jsx)(s.p,{children:"The storage migration plugin can be used to migrate all data from one existing RxStorage into another. This is useful when:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["You want to migrate from one ",(0,i.jsx)(s.a,{href:"/rx-storage.html",children:"RxStorage"})," to another one."]}),"\n",(0,i.jsx)(s.li,{children:"You want to migrate to a new major RxDB version while keeping the previous saved data. This function only works from the previous major version upwards. Do not use it to migrate like rxdb v9 to v14."}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["The storage migration ",(0,i.jsx)(s.strong,{children:"drops deleted documents"})," and filters them out during the migration."]}),"\n",(0,i.jsxs)(s.admonition,{title:"Do never change the schema while doing a storage migration",type:"warning",children:[(0,i.jsx)(s.p,{children:"When you migrate between storages, you might want to change the schema in the same process. You should never do that because it will lead to problems afterwards and might make your database unusable."}),(0,i.jsxs)(s.p,{children:["When you also want to change your schema, first run the storage migration and afterwards run a normal ",(0,i.jsx)(s.a,{href:"/migration-schema.html",children:"schema migration"}),"."]})]}),"\n",(0,i.jsx)(s.h2,{id:"usage",children:"Usage"}),"\n",(0,i.jsxs)(s.p,{children:["Lets say you want to migrate from ",(0,i.jsx)(s.a,{href:"/rx-storage-localstorage.html",children:"LocalStorage RxStorage"})," to the ",(0,i.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB RxStorage"}),"."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { migrateStorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/migration-storage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageIndexedDB } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-indexeddb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-old/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// create the new RxDatabase"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" dbLocation"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" multiInstance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" false"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" migrateStorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" database"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" db "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"as"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" any"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * Name of the old database,"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * using the storage migration requires that the"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * new database has a different name."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" oldDatabaseName"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myOldDatabaseName'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" oldStorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // RxStorage of the old database"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 500"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // batch size"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" parallel"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- true if it should migrate all collections in parallel. False (default) if should migrate in serial"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" afterMigrateBatch"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (input"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" AfterMigrateBatchHandlerInput"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:") "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'storage migration: batch processed'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.admonition,{type:"note",children:[(0,i.jsx)(s.p,{children:"Only collections that exist in the new database at the time you call migrateStorage() will have their data migrated."}),(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["If your old database had collections ",(0,i.jsx)(s.code,{children:"['users', 'posts', 'comments']"})," but your new database only defines ",(0,i.jsx)(s.code,{children:"['users', 'posts']"}),", then only users and posts data will be migrated."]}),"\n",(0,i.jsx)(s.li,{children:"Any collections missing from the new database will simply be skipped - no data for them will be read or written."}),"\n"]}),(0,i.jsxs)(s.p,{children:["This allows you to selectively migrate only certain collections if desired, by choosing which collections to define before invoking ",(0,i.jsx)(s.code,{children:"migrateStorage()"}),"."]})]}),"\n",(0,i.jsx)(s.h2,{id:"migrate-from-a-previous-rxdb-major-version",children:"Migrate from a previous RxDB major version"}),"\n",(0,i.jsxs)(s.p,{children:["To migrate from a previous RxDB major version, you have to install the 'old' RxDB in the ",(0,i.jsx)(s.code,{children:"package.json"})]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"json","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"json","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"{"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "dependencies"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:' "rxdb-old"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "npm:rxdb@14.17.1"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.p,{children:"Then you can run the migration by providing the old storage:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { migrateStorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/migration-storage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-old/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"; "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// <- import from the old RxDB version"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" migrateStorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" database"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" db "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"as"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" any"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * Name of the old database,"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * using the storage migration requires that the"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * new database has a different name."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" oldDatabaseName"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myOldDatabaseName'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" oldStorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // RxStorage of the old database"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 500"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // batch size"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" parallel"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" afterMigrateBatch"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (input"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" AfterMigrateBatchHandlerInput"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:") "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'storage migration: batch processed'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"})})]})})}),"\n",(0,i.jsxs)(s.h2,{id:"disable-version-check-on-rxdb-premium-",children:["Disable Version Check on ",(0,i.jsx)(s.a,{href:"/premium/",children:"RxDB Premium \ud83d\udc51"})]}),"\n",(0,i.jsxs)(s.p,{children:["RxDB Premium has a check in place that ensures that you do not accidentally use the wrong RxDB core and \ud83d\udc51 Premium version together which could break your database state.\nThis can be a problem during migrations where you have multiple versions of RxDB in use and it will throw the error ",(0,i.jsx)(s.code,{children:"Version mismatch detected"}),".\nYou can disable that check by importing and running the ",(0,i.jsx)(s.code,{children:"disableVersionCheck()"})," function from RxDB Premium."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// RxDB Premium v15 or newer:"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" disableVersionCheck"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium-old/plugins/shared'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"disableVersionCheck"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// RxDB Premium v14:"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// for esm"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" disableVersionCheck"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium-old/dist/es/shared/version-check.js'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"disableVersionCheck"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// for cjs"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" disableVersionCheck"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium-old/dist/lib/shared/version-check.js'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"disableVersionCheck"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453(e,s,n){n.d(s,{R:()=>a,x:()=>l});var r=n(6540);const i={},o=r.createContext(i);function a(e){const s=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/a442adcd.3011bc9b.js b/docs/assets/js/a442adcd.3011bc9b.js deleted file mode 100644 index 49f18c18582..00000000000 --- a/docs/assets/js/a442adcd.3011bc9b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[8760],{3247(e,s,n){n.d(s,{g:()=>i});var r=n(4848);function i(e){const s=[];let n=null;return e.children.forEach(e=>{e.props.id?(n&&s.push(n),n={headline:e,paragraphs:[]}):n&&n.paragraphs.push(e)}),n&&s.push(n),(0,r.jsx)("div",{style:o.stepsContainer,children:s.map((e,s)=>(0,r.jsxs)("div",{style:o.stepWrapper,children:[(0,r.jsxs)("div",{style:o.stepIndicator,children:[(0,r.jsx)("div",{style:o.stepNumber,children:s+1}),(0,r.jsx)("div",{style:o.verticalLine})]}),(0,r.jsxs)("div",{style:o.stepContent,children:[(0,r.jsx)("div",{children:e.headline}),e.paragraphs.map((e,s)=>(0,r.jsx)("div",{style:o.item,children:e},s))]})]},s))})}const o={stepsContainer:{display:"flex",flexDirection:"column"},stepWrapper:{display:"flex",alignItems:"stretch",marginBottom:"1.5rem",position:"relative",minWidth:0},stepIndicator:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",width:"33px",marginRight:"1rem",minWidth:0},stepNumber:{width:"33px",height:"33px",borderRadius:"50%",backgroundColor:"var(--color-top)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:"bold",marginTop:-4},verticalLine:{position:"absolute",top:29,bottom:"0",left:"50%",width:"1px",background:"linear-gradient(to bottom, var(--color-top) 0%, var(--color-top) 80%, rgba(0,0,0,0) 100%)",transform:"translateX(-50%)"},stepContent:{flex:1,minWidth:0,overflowWrap:"break-word"},item:{marginTop:"0.5rem"}}},5551(e,s,n){n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>c,default:()=>k,frontMatter:()=>t,metadata:()=>r,toc:()=>h});const r=JSON.parse('{"id":"reactivity","title":"Signals & Custom Reactivity with RxDB","description":"Level up reactivity with Angular signals, Vue refs, or Preact signals in RxDB. Learn how to integrate custom reactivity to power your dynamic UI.","source":"@site/docs/reactivity.md","sourceDirName":".","slug":"/reactivity.html","permalink":"/reactivity.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Signals & Custom Reactivity with RxDB","slug":"reactivity.html","description":"Level up reactivity with Angular signals, Vue refs, or Preact signals in RxDB. Learn how to integrate custom reactivity to power your dynamic UI."},"sidebar":"tutorialSidebar","previous":{"title":"RxPipelines","permalink":"/rx-pipeline.html"},"next":{"title":"RxState","permalink":"/rx-state.html"}}');var i=n(4848),o=n(8453),a=n(2636),l=n(3247);const t={title:"Signals & Custom Reactivity with RxDB",slug:"reactivity.html",description:"Level up reactivity with Angular signals, Vue refs, or Preact signals in RxDB. Learn how to integrate custom reactivity to power your dynamic UI."},c="Signals & Co. - Custom reactivity adapters instead of RxJS Observables",d={},h=[{value:"Adding a reactivity factory",id:"adding-a-reactivity-factory",level:2},{value:"Angular",id:"angular",level:3},{value:"Import",id:"import",level:4},{value:"Set the reactivity factory",id:"set-the-reactivity-factory",level:4},{value:"Use the Signal in an Angular component",id:"use-the-signal-in-an-angular-component",level:4},{value:"React",id:"react",level:3},{value:"Install Preact Signals",id:"install-preact-signals",level:4},{value:"Import",id:"import-1",level:4},{value:"Set the reactivity factory",id:"set-the-reactivity-factory-1",level:4},{value:"Use the Signal in a React component",id:"use-the-signal-in-a-react-component",level:4},{value:"Vue",id:"vue",level:3},{value:"Import",id:"import-2",level:4},{value:"Set the reactivity factory",id:"set-the-reactivity-factory-2",level:4},{value:"Use the Shallow Ref in a Vue component",id:"use-the-shallow-ref-in-a-vue-component",level:4},{value:"Accessing custom reactivity objects",id:"accessing-custom-reactivity-objects",level:2}];function p(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",p:"p",pre:"pre",span:"span",strong:"strong",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"signals--co---custom-reactivity-adapters-instead-of-rxjs-observables",children:"Signals & Co. - Custom reactivity adapters instead of RxJS Observables"})}),"\n",(0,i.jsxs)(s.p,{children:["RxDB internally uses the ",(0,i.jsx)(s.a,{href:"https://rxjs.dev/",children:"rxjs library"})," for observables and streams. All functionalities of RxDB like ",(0,i.jsx)(s.a,{href:"/rx-query.html#observe",children:"query"})," results or ",(0,i.jsx)(s.a,{href:"/rx-document.html#observe",children:"document fields"})," that expose values that change over time return a rxjs ",(0,i.jsx)(s.code,{children:"Observable"})," that allows you to observe the values and update your UI accordingly depending on the changes to the database state."]}),"\n",(0,i.jsxs)(s.p,{children:["However there are many reasons to use other reactivity libraries that use a different datatype to represent changing values. For example when you use ",(0,i.jsx)(s.strong,{children:"signals"})," in angular or react, the ",(0,i.jsx)(s.strong,{children:"template refs"})," of vue or state libraries like MobX and redux."]}),"\n",(0,i.jsxs)(s.p,{children:["RxDB allows you to pass a custom reactivity factory on ",(0,i.jsx)(s.a,{href:"/rx-database.html",children:"RxDatabase"})," creation so that you can easily access values wrapped with your custom datatype in a convenient way."]}),"\n",(0,i.jsx)(s.h2,{id:"adding-a-reactivity-factory",children:"Adding a reactivity factory"}),"\n",(0,i.jsxs)(a.t,{children:[(0,i.jsx)(s.h3,{id:"angular",children:"Angular"}),(0,i.jsxs)(s.p,{children:["In angular we use ",(0,i.jsx)(s.a,{href:"https://angular.dev/guide/signals",children:"Angular Signals"})," as custom reactivity objects."]}),(0,i.jsxs)(l.g,{children:[(0,i.jsx)(s.h4,{id:"import",children:"Import"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createReactivityFactory } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/reactivity-angular'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { Injectable"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" inject } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '@angular/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]})]})})}),(0,i.jsx)(s.h4,{id:"set-the-reactivity-factory",children:"Set the reactivity factory"}),(0,i.jsxs)(s.p,{children:["Set the factory as ",(0,i.jsx)(s.code,{children:"reactivity"})," option when calling ",(0,i.jsx)(s.code,{children:"createRxDatabase"}),"."]}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" reactivity"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createReactivityFactory"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"inject"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(Injector))"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// add collections/sync etc..."})})]})})}),(0,i.jsx)(s.h4,{id:"use-the-signal-in-an-angular-component",children:"Use the Signal in an Angular component"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { Component"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" inject } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '@angular/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { CommonModule } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '@angular/common'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { DbService } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '../db.service'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"@"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"Component"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'app-todos-list'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" standalone"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" imports"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" [CommonModule]"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" template"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" `"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"
      "})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" {{ t.title }}"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"
    "})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" `"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"})"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" class"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" TodosListComponent"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" private"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" dbService "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" inject"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(DbService);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // RxDB query - Angular Signal"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" readonly"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" todosSignal "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" this"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"dbService"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"todos"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"().$$;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "})]})})})]}),(0,i.jsxs)(s.p,{children:["An example of how signals are used in angular with RxDB, can be found at the ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/blob/master/examples/angular/src/app/components/heroes-list/heroes-list.component.ts#L46",children:"RxDB Angular Example"})]}),(0,i.jsx)(s.h3,{id:"react",children:"React"}),(0,i.jsxs)(s.p,{children:["For React, we use the ",(0,i.jsx)(s.a,{href:"https://preactjs.com/guide/v10/signals/",children:"Preact Signals"})," for custom reactivity."]}),(0,i.jsxs)(l.g,{children:[(0,i.jsx)(s.h4,{id:"install-preact-signals",children:"Install Preact Signals"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" @preact/signals-core"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" --save"})]})})})}),(0,i.jsx)(s.h4,{id:"import-1",children:"Import"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" PreactSignalsRxReactivityFactory"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/reactivity-preact-signals'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]})]})})}),(0,i.jsx)(s.h4,{id:"set-the-reactivity-factory-1",children:"Set the reactivity factory"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" reactivity"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" PreactSignalsRxReactivityFactory"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// add collections/sync etc..."})})]})})}),(0,i.jsx)(s.h4,{id:"use-the-signal-in-a-react-component",children:"Use the Signal in a React component"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"tsx","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"tsx","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { useEffect"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" useState } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'preact/hooks'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" './db'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" TodosList"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" setDb"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"] "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" useState"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"null"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" useEffect"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(() "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".then"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(setDb);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" []);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"db) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" null"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // RxQuery -> Preact Signal"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" todosSignal"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"todos"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"().$$;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"ul"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"todosSignal"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"value"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".map"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"((doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" any"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:") "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"li"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" key"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"{"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".primary}>"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".title}"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" "})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ))}"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" "})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})})]}),(0,i.jsx)(s.h3,{id:"vue",children:"Vue"}),(0,i.jsxs)(s.p,{children:["For Vue, we use the ",(0,i.jsx)(s.a,{href:"https://vuejs.org/api/reactivity-advanced",children:"Vue Shallow Refs"})," for custom reactivity."]}),(0,i.jsxs)(l.g,{children:[(0,i.jsx)(s.h4,{id:"import-2",children:"Import"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { VueRxReactivityFactory } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/reactivity-vue'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]})})})}),(0,i.jsx)(s.h4,{id:"set-the-reactivity-factory-2",children:"Set the reactivity factory"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" database"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" reactivity"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" VueRxReactivityFactory"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// add collections/sync etc..."})})]})})}),(0,i.jsx)(s.h4,{id:"use-the-shallow-ref-in-a-vue-component",children:"Use the Shallow Ref in a Vue component"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"html","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"html","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"script"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" setup"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" lang"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"ts"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" './db'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// RxQuery to Vue shallowRef signal"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" todosSignal"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"todos"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"().$$;"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:""})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"template"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"ul"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"li"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" v-for"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"t in todosSignal"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" :key"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"t.primary"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"label"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">{{ t.title }}"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" "})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" "})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:""})]})]})})})]})]}),"\n",(0,i.jsx)(s.h2,{id:"accessing-custom-reactivity-objects",children:"Accessing custom reactivity objects"}),"\n",(0,i.jsxs)(s.p,{children:["All observable data in RxDB is marked by the single dollar sign ",(0,i.jsx)(s.code,{children:"$"})," like ",(0,i.jsx)(s.code,{children:"RxCollection.$"})," for events or ",(0,i.jsx)(s.code,{children:"RxDocument.myField$"})," to get the observable for a document field. To make custom reactivity objects distinguable, they are marked with double-dollar signs ",(0,i.jsx)(s.code,{children:"$$"})," instead. Here are some example on how to get custom reactivity objects from RxDB specific instances:"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// RxDocument"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// get signal that represents the document field 'foobar'"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" signal"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDocument"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".get$$"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'foobar'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// same as above"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" signal"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDocument"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".foobar$$;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// get signal that represents whole document over time"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" signal"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDocument"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".$$;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// get signal that represents the deleted state of the document"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" signal"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxDocument"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".deleted$$;"})]})]})})}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// RxQuery"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// get signal that represents the query result set over time"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" signal"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"().$$;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// get signal that represents the query result set over time"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" signal"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"().$$;"})]})]})})}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// RxLocalDocument"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// get signal that represents the whole local document state"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" signal"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxLocalDocument"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".$$;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// get signal that represents the foobar field"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" signal"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxLocalDocument"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".get$$"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'foobar'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})})]})}function k(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},8453(e,s,n){n.d(s,{R:()=>a,x:()=>l});var r=n(6540);const i={},o=r.createContext(i);function a(e){const s=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/a574e172.f6f58d32.js b/docs/assets/js/a574e172.f6f58d32.js deleted file mode 100644 index b5548e54e2e..00000000000 --- a/docs/assets/js/a574e172.f6f58d32.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[7149],{3247(e,s,n){n.d(s,{g:()=>o});var r=n(4848);function o(e){const s=[];let n=null;return e.children.forEach(e=>{e.props.id?(n&&s.push(n),n={headline:e,paragraphs:[]}):n&&n.paragraphs.push(e)}),n&&s.push(n),(0,r.jsx)("div",{style:i.stepsContainer,children:s.map((e,s)=>(0,r.jsxs)("div",{style:i.stepWrapper,children:[(0,r.jsxs)("div",{style:i.stepIndicator,children:[(0,r.jsx)("div",{style:i.stepNumber,children:s+1}),(0,r.jsx)("div",{style:i.verticalLine})]}),(0,r.jsxs)("div",{style:i.stepContent,children:[(0,r.jsx)("div",{children:e.headline}),e.paragraphs.map((e,s)=>(0,r.jsx)("div",{style:i.item,children:e},s))]})]},s))})}const i={stepsContainer:{display:"flex",flexDirection:"column"},stepWrapper:{display:"flex",alignItems:"stretch",marginBottom:"1.5rem",position:"relative",minWidth:0},stepIndicator:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",width:"33px",marginRight:"1rem",minWidth:0},stepNumber:{width:"33px",height:"33px",borderRadius:"50%",backgroundColor:"var(--color-top)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:"bold",marginTop:-4},verticalLine:{position:"absolute",top:29,bottom:"0",left:"50%",width:"1px",background:"linear-gradient(to bottom, var(--color-top) 0%, var(--color-top) 80%, rgba(0,0,0,0) 100%)",transform:"translateX(-50%)"},stepContent:{flex:1,minWidth:0,overflowWrap:"break-word"},item:{marginTop:"0.5rem"}}},5384(e,s,n){n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>t,metadata:()=>r,toc:()=>h});const r=JSON.parse('{"id":"replication-http","title":"HTTP Replication","description":"Learn how to establish HTTP replication between RxDB clients and a Node.js Express server for data synchronization.","source":"@site/docs/replication-http.md","sourceDirName":".","slug":"/replication-http.html","permalink":"/replication-http.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"HTTP Replication","slug":"replication-http.html","description":"Learn how to establish HTTP replication between RxDB clients and a Node.js Express server for data synchronization."},"sidebar":"tutorialSidebar","previous":{"title":"\u2699\ufe0f Sync Engine","permalink":"/replication.html"},"next":{"title":"RxServer Replication","permalink":"/replication-server.html"}}');var o=n(4848),i=n(8453),l=n(3247);n(2636);const t={title:"HTTP Replication",slug:"replication-http.html",description:"Learn how to establish HTTP replication between RxDB clients and a Node.js Express server for data synchronization."},a="HTTP Replication from a custom server to RxDB clients",c={},h=[{value:"Setup",id:"setup",level:2},{value:"Start the Replication on the RxDB Client",id:"start-the-replication-on-the-rxdb-client",level:3},{value:"Start a Node.js process with Express and MongoDB",id:"start-a-nodejs-process-with-express-and-mongodb",level:3},{value:"Implement the Pull Endpoint",id:"implement-the-pull-endpoint",level:3},{value:"Implement the Pull Handler",id:"implement-the-pull-handler",level:3},{value:"Implement the Push Endpoint",id:"implement-the-push-endpoint",level:3},{value:"Implement the Push Handler",id:"implement-the-push-handler",level:3},{value:"Implement the pullStream$ Endpoint",id:"implement-the-pullstream-endpoint",level:3},{value:"Implement the pullStream$ Handler",id:"implement-the-pullstream-handler",level:3},{value:"pullStream$ RESYNC flag",id:"pullstream-resync-flag",level:3},{value:"Missing implementation details",id:"missing-implementation-details",level:2}];function d(e){const s={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.header,{children:(0,o.jsx)(s.h1,{id:"http-replication-from-a-custom-server-to-rxdb-clients",children:"HTTP Replication from a custom server to RxDB clients"})}),"\n",(0,o.jsxs)(s.p,{children:["While RxDB has a range of backend-specific replication plugins (like ",(0,o.jsx)(s.a,{href:"/replication-graphql.html",children:"GraphQL"})," or ",(0,o.jsx)(s.a,{href:"/replication-firestore.html",children:"Firestore"}),"), the replication is build in a way to make it very easy to replicate data from a custom server to RxDB clients."]}),"\n",(0,o.jsx)("p",{align:"center",children:(0,o.jsx)("img",{src:"./files/icons/with-gradient/replication.svg",alt:"HTTP replication",height:"60"})}),"\n",(0,o.jsxs)(s.p,{children:["Using ",(0,o.jsx)(s.strong,{children:"HTTP"})," as a transport protocol makes it simple to create a compatible backend on top of your existing infrastructure. For events that must be sent from the server to the client, we can use ",(0,o.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events",children:"Server Send Events"}),"."]}),"\n",(0,o.jsx)(s.p,{children:"In this tutorial we will implement a HTTP replication between an RxDB client and a MongoDB express server. You can adapt this for any other backend database technology like PostgreSQL or even a non-Node.js server like go or java."}),"\n",(0,o.jsxs)(s.p,{children:["To create a compatible server for replication, we will start a server and implement the correct HTTP routes and replication handlers. We need a push-handler, a pull-handler and for the ongoing changes ",(0,o.jsx)(s.code,{children:"pull.stream"})," we use ",(0,o.jsx)(s.strong,{children:"Server Send Events"}),"."]}),"\n",(0,o.jsx)(s.h2,{id:"setup",children:"Setup"}),"\n",(0,o.jsxs)(l.g,{children:[(0,o.jsx)(s.h3,{id:"start-the-replication-on-the-rxdb-client",children:"Start the Replication on the RxDB Client"}),(0,o.jsxs)(s.p,{children:["RxDB does not have a specific HTTP-replication plugin because the ",(0,o.jsx)(s.a,{href:"/replication.html",children:"replication primitives plugin"})," is simple enough to start a HTTP replication on top of it.\nWe import the ",(0,o.jsx)(s.code,{children:"replicateRxCollection"})," function and start the replication from there for a single ",(0,o.jsx)(s.a,{href:"/rx-collection.html",children:"RxCollection"}),"."]}),(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// > client.ts"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { replicateRxCollection } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" replicateRxCollection"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" myRxCollection"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" replicationIdentifier"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-http-replication'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/* add settings from below */"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/* add settings from below */"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,o.jsx)(s.h3,{id:"start-a-nodejs-process-with-express-and-mongodb",children:"Start a Node.js process with Express and MongoDB"}),(0,o.jsx)(s.p,{children:"On the server side, we start an express server that has a MongoDB connection and serves the HTTP requests of the client."}),(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// > server.ts"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { MongoClient } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mongodb'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" express "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'express'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" mongoClient"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" MongoClient"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'mongodb://localhost:27017/'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" mongoConnection"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" mongoClient"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".connect"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" mongoDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" mongoConnection"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".db"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'myDatabase'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" mongoCollection"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" mongoDatabase"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".collection"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'myDocs'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" app"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" express"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"app"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".use"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"express"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".json"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"());"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... add routes from below */"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"app"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".listen"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"80"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"`Example app listening on port 80`"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,o.jsx)(s.h3,{id:"implement-the-pull-endpoint",children:"Implement the Pull Endpoint"}),(0,o.jsxs)(s.p,{children:["As first HTTP Endpoint, we need to implement the pull handler. This is used by the RxDB replication to fetch all documents writes that happened after a given ",(0,o.jsx)(s.code,{children:"checkpoint"}),"."]}),(0,o.jsxs)(s.p,{children:["The ",(0,o.jsx)(s.code,{children:"checkpoint"})," format is not determined by RxDB, instead the server can use any type of changepoint that can be used to iterate across document writes. Here we will just use a unix timestamp ",(0,o.jsx)(s.code,{children:"updatedAt"})," and a string ",(0,o.jsx)(s.code,{children:"id"})," which is the most common used format."]}),(0,o.jsx)(s.p,{children:"When the pull endpoint is called, the server responds with an array of document data based on the given checkpoint and a new checkpoint.\nAlso the server has to respect the batchSize so that RxDB knows when there are no more new documents and the server returns a non-full array."}),(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// > server.ts"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { lastOfArray } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"app"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".get"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'/pull'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (req"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" res) "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" id"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" req"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"query"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".id;"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" updatedAt"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" parseFloat"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"req"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"query"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".updatedAt);"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" documents"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" mongoCollection"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" $or"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * Notice that we have to compare the updatedAt AND the id field"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * because the updateAt field is not unique and when two documents"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:' * have the same updateAt, we can still "sort" them by their id.'})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" updateAt"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { $gt"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" updatedAt }"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" updateAt"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { $eq"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" updatedAt }"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id: { $gt"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id }"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" .sort"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({updateAt"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 1"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 1"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"})"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" .limit"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"parseInt"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"req"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"query"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".batchSize"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"))"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".toArray"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" newCheckpoint"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" documents"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"length"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ==="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ?"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { id"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" updatedAt } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" lastOfArray"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(documents).id"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" updatedAt"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" lastOfArray"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(documents).updatedAt"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" res"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".setHeader"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Content-Type'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'application/json'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" res"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".end"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"JSON"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".stringify"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ documents"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" checkpoint"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" newCheckpoint }));"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,o.jsx)(s.h3,{id:"implement-the-pull-handler",children:"Implement the Pull Handler"}),(0,o.jsxs)(s.p,{children:["On the client we add the ",(0,o.jsx)(s.code,{children:"pull.handler"})," to the replication setting. The handler request the correct server url and fetches the documents."]}),(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// > client.ts"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" replicateRxCollection"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(checkpointOrNull"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize){"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" updatedAt"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" checkpointOrNull "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"?"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" checkpointOrNull"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".updatedAt "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" id"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" checkpointOrNull "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"?"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" checkpointOrNull"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".id "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" ''"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" response"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" fetch"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" `https://localhost/pull?updatedAt="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"${"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"updatedAt"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"}"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"&id="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"${"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"id"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"}"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"&limit="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"${"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"batchSize"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"}"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"`"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" data"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" response"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".json"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" documents"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" data"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".documents"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" checkpoint"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" data"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".checkpoint"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,o.jsx)(s.h3,{id:"implement-the-push-endpoint",children:"Implement the Push Endpoint"}),(0,o.jsxs)(s.p,{children:["To send client side writes to the server, we have to implement the ",(0,o.jsx)(s.code,{children:"push.handler"}),". It gets an array of change rows as input and has to return only the conflicting documents that did not have been written to the server. Each change row contains a ",(0,o.jsx)(s.code,{children:"newDocumentState"})," and an optional ",(0,o.jsx)(s.code,{children:"assumedMasterState"}),"."]}),(0,o.jsxs)(s.p,{children:["For ",(0,o.jsx)(s.a,{href:"/transactions-conflicts-revisions.html",children:"conflict detection"}),", on the server we first have to detect if the ",(0,o.jsx)(s.code,{children:"assumedMasterState"}),' is correct for each row. If yes, we have to write the new document state to the database, otherwise we have to return the "real" master state in the conflict array.']}),(0,o.jsxs)(s.p,{children:["The server also creates an ",(0,o.jsx)(s.code,{children:"event"})," that is emitted to the ",(0,o.jsx)(s.code,{children:"pullStream$"})," which is later used in the ",(0,o.jsx)(s.a,{href:"#pullstream-for-ongoing-changes",children:"pull.stream$"}),"."]}),(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// > server.ts"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { lastOfArray } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { Subject } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxjs'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// used in the pull.stream$ below"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"let"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" lastEventId "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" pullStream$"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Subject"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"app"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".get"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'/push'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (req"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" res) "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" changeRows"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" req"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".body;"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" conflicts"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" [];"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" event"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" lastEventId"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"++"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" documents"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" []"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" checkpoint"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" null"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" for"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" changeRow"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" of"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" changeRows){"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" realMasterState"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" mongoCollection"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".findOne"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({id"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" changeRow"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"newDocumentState"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".id});"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" realMasterState "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"&&"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" !"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"changeRow"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".assumedMasterState "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"||"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" realMasterState "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"&&"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" changeRow"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".assumedMasterState "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"&&"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /*"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * For simplicity we detect conflicts on the server by only compare the updateAt value."})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" * In reality you might want to do a more complex check or do a deep-equal comparison."})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" realMasterState"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".updatedAt "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"!=="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" changeRow"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"assumedMasterState"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".updatedAt"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" )"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ) {"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // we have a conflict"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" conflicts"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".push"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(realMasterState);"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"else"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // no conflict -> write the document"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" mongoCollection"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".updateOne"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {id"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" changeRow"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"newDocumentState"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".id}"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" changeRow"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".newDocumentState"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" event"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"documents"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".push"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"changeRow"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".newDocumentState);"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" event"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".checkpoint "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { id"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" changeRow"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"newDocumentState"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".id"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" updatedAt"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" changeRow"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"newDocumentState"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".updatedAt };"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"event"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"documents"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"length"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" >"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"){"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myPullStream$"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".next"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(event);"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" res"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".setHeader"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Content-Type'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'application/json'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" res"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".end"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"JSON"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".stringify"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(conflicts));"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,o.jsx)(s.admonition,{type:"note",children:(0,o.jsx)(s.p,{children:"For simplicity in this tutorial, we do not use transactions. In reality you should run the full push function inside of a MongoDB transaction to ensure that no other process can mix up the document state while the writes are processed. Also you should call batch operations on MongoDB instead of running the operations for each change row."})}),(0,o.jsx)(s.h3,{id:"implement-the-push-handler",children:"Implement the Push Handler"}),(0,o.jsxs)(s.p,{children:["With the push endpoint in place, we can add a ",(0,o.jsx)(s.code,{children:"push.handler"})," to the replication settings on the client."]}),(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// > client.ts"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" replicateRxCollection"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(changeRows){"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" rawResponse"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" fetch"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'https://localhost/push'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" method"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'POST'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" headers"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Accept'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'application/json'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Content-Type'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'application/json'"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" body"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" JSON"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".stringify"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(changeRows)"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" conflictsArray"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" rawResponse"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".json"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" conflictsArray;"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,o.jsx)(s.h3,{id:"implement-the-pullstream-endpoint",children:"Implement the pullStream$ Endpoint"}),(0,o.jsxs)(s.p,{children:["While the normal pull handler is used when the replication is in ",(0,o.jsx)(s.a,{href:"/replication.html#checkpoint-iteration",children:"iteration mode"}),", we also need a stream of ongoing changes when the replication is in ",(0,o.jsx)(s.a,{href:"/replication.html#event-observation",children:"event observation mode"}),". This brings the realtime replication to RxDB where changes on the server or on a client will directly get propagated to the other instances."]}),(0,o.jsxs)(s.p,{children:["On the server we have to implement the ",(0,o.jsx)(s.code,{children:"pullStream"})," route and emit the events. We use the ",(0,o.jsx)(s.code,{children:"pullStream$"})," observable from ",(0,o.jsx)(s.a,{href:"#push-from-the-client-to-the-server",children:"above"})," to fetch all ongoing events and respond them to the client. Here we use Server-Sent-Events (SSE) which is the most common used way to stream data from the server to the client. Other method also exist like ",(0,o.jsx)(s.a,{href:"/articles/websockets-sse-polling-webrtc-webtransport.html",children:"WebSockets or Long-Polling"}),"."]}),(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// > server.ts"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"app"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".get"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'/pullStream'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (req"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" res) "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" res"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".writeHead"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"200"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Content-Type'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'text/event-stream'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Connection'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'keep-alive'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Cache-Control'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'no-cache'"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" subscription"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" pullStream$"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(event "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" res"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".write"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'data: '"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" JSON"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".stringify"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(event) "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"+"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '\\n\\n'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" req"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".on"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'close'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" subscription"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".unsubscribe"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"());"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,o.jsx)(s.admonition,{type:"note",children:(0,o.jsxs)(s.p,{children:["How the build the ",(0,o.jsx)(s.code,{children:"pullStream$"})," Observable is not part of this tutorial. This heavily depends on your backend and infrastructure. Likely you have to observe the MongoDB event stream."]})}),(0,o.jsx)(s.h3,{id:"implement-the-pullstream-handler",children:"Implement the pullStream$ Handler"}),(0,o.jsxs)(s.p,{children:["From the client we can observe this endpoint and create a ",(0,o.jsx)(s.code,{children:"pull.stream$"})," observable that emits all events that are send from the server to the client.\nThe client connects to an url and receives server-sent-events that contain all ongoing writes."]}),(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// > client.ts"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { Subject } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxjs'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myPullStream$"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Subject"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" eventSource"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" EventSource"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'http://localhost/pullStream'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { withCredentials"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"eventSource"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"onmessage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" event "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" eventData"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" JSON"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".parse"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"event"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".data);"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myPullStream$"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".next"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" documents"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" eventData"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".documents"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" checkpoint"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" eventData"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".checkpoint"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" replicateRxCollection"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" stream$"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myPullStream$"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".asObservable"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),(0,o.jsx)(s.h3,{id:"pullstream-resync-flag",children:"pullStream$ RESYNC flag"}),(0,o.jsxs)(s.p,{children:["In case the client looses the connection, the EventSource will automatically reconnect but there might have been some changes that have been missed out in the meantime. The replication has to be informed that it might have missed events by emitting a ",(0,o.jsx)(s.code,{children:"RESYNC"})," flag from the ",(0,o.jsx)(s.code,{children:"pull.stream$"}),".\nThe replication will then catch up by switching to the ",(0,o.jsx)(s.a,{href:"/replication.html#checkpoint-iteration",children:"iteration mode"})," until it is in sync with the server again."]}),(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// > client.ts"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"eventSource"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"onerror"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myPullStream$"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".next"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'RESYNC'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})}),(0,o.jsxs)(s.p,{children:["The purpose of the ",(0,o.jsx)(s.code,{children:"RESYNC"}),' flag is to tell the client that "something might have changed" and then the client can react on that information without having to run operations in an interval.']}),(0,o.jsxs)(s.p,{children:["If your backend is not capable of emitting the actual documents and checkpoint in the pull stream, you could just map all events to the ",(0,o.jsx)(s.code,{children:"RESYNC"})," flag. This would make the replication work with a slight performance drawback:"]}),(0,o.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,o.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// > client.ts"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { Subject } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxjs'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myPullStream$"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Subject"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" eventSource"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" EventSource"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'http://localhost/pullStream'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { withCredentials"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"eventSource"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"onmessage"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" () "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myPullStream$"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".next"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'RESYNC'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" replicateRxCollection"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{"data-line":"",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" stream$"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myPullStream$"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".asObservable"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,o.jsx)(s.span,{"data-line":"",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})})]}),"\n",(0,o.jsx)(s.h2,{id:"missing-implementation-details",children:"Missing implementation details"}),"\n",(0,o.jsx)(s.p,{children:"In this tutorial we only covered the basics of doing a HTTP replication between RxDB clients and a server. We did not cover the following aspects of the implementation:"}),"\n",(0,o.jsxs)(s.ul,{children:["\n",(0,o.jsx)(s.li,{children:"Authentication: To authenticate the client on the server, you might want to send authentication headers with the HTTP requests"}),"\n",(0,o.jsxs)(s.li,{children:["Skip events on the ",(0,o.jsx)(s.code,{children:"pull.stream$"})," for the client that caused the changes to improve performance."]}),"\n",(0,o.jsxs)(s.li,{children:["Version upgrades: You should add a version-flag to the endpoint urls. If you then update the version of your endpoints in any way, your old endpoints should emit a ",(0,o.jsx)(s.code,{children:"Code 426"})," to outdated clients so that they can updated their client version."]}),"\n"]})]})}function p(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},8453(e,s,n){n.d(s,{R:()=>l,x:()=>t});var r=n(6540);const o={},i=r.createContext(o);function l(e){const s=r.useContext(i);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(o):e.components||o:l(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/a69eebfc.8659aa3b.js b/docs/assets/js/a69eebfc.8659aa3b.js deleted file mode 100644 index b419f37e88e..00000000000 --- a/docs/assets/js/a69eebfc.8659aa3b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9408],{5878(e,n,s){s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"query-optimizer","title":"Optimize Client-Side Queries with RxDB","description":"Harness real-world data to fine-tune queries. The build-time RxDB Optimizer finds the perfect index, boosting query speed in any environment.","source":"@site/docs/query-optimizer.md","sourceDirName":".","slug":"/query-optimizer.html","permalink":"/query-optimizer.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Optimize Client-Side Queries with RxDB","slug":"query-optimizer.html","description":"Harness real-world data to fine-tune queries. The build-time RxDB Optimizer finds the perfect index, boosting query speed in any environment."},"sidebar":"tutorialSidebar","previous":{"title":"Vector Database","permalink":"/articles/javascript-vector-database.html"},"next":{"title":"Third Party Plugins","permalink":"/third-party-plugins.html"}}');var i=s(4848),o=s(8453);const t={title:"Optimize Client-Side Queries with RxDB",slug:"query-optimizer.html",description:"Harness real-world data to fine-tune queries. The build-time RxDB Optimizer finds the perfect index, boosting query speed in any environment."},a="Query Optimizer",l={},d=[{value:"Usage",id:"usage",level:2},{value:"Important details",id:"important-details",level:2}];function c(e){const n={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"query-optimizer",children:"Query Optimizer"})}),"\n",(0,i.jsx)(n.p,{children:"The query optimizer can be used to determine which index is the best to use for a given query.\nBecause RxDB is used in client side applications, it cannot do any background checks or measurements to optimize the query plan because that would cause significant performance problems."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["The query optimizer is part of the ",(0,i.jsx)(n.a,{href:"/premium/",children:"RxDB Premium \ud83d\udc51"})," plugin that must be purchased. It is not part of the default RxDB module."]})}),"\n",(0,i.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" findBestIndex"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/query-optimizer'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { "})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageIndexedDB"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/indexeddb'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" bestIndexes"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" findBestIndex"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myRxJsonSchema"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * In this example we use the IndexedDB RxStorage,"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * but any other storage can be used for testing."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Multiple queries can be optimized at the same time"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * which decreases the overall runtime."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" queries"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Queries can be mapped by a query id,"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * here we use myFirstQuery as query id."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myFirstQuery"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" mySecondQuery"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" age"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" lastName"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" $eq"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Nakamoto'"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" testData"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/** data for the documents. **/"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "})]})})}),"\n",(0,i.jsx)(n.h2,{id:"important-details",children:"Important details"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["This is a build time tool. You should use it to find the best indexes for your queries during ",(0,i.jsx)(n.strong,{children:"build time"}),". Then you store these results and you application can use the best indexes during ",(0,i.jsx)(n.strong,{children:"run time"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["It makes no sense to run time optimization with a different ",(0,i.jsx)(n.code,{children:"RxStorage"})," (+settings) that what you use in production. The result of the query optimizer is heavily dependent on the RxStorage and JavaScript runtime. For example it makes no sense to run the optimization in Node.js and then use the optimized indexes in the browser."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["It is very important that you use ",(0,i.jsx)(n.strong,{children:"production like"})," ",(0,i.jsx)(n.code,{children:"testData"}),". Finding the best index heavily depends on data distribution and amount of stored/queried documents. For example if you store and query users with an ",(0,i.jsx)(n.code,{children:"age"})," field, it makes no sense to just use a random number for the age because in production the ",(0,i.jsx)(n.code,{children:"age"})," of your users is not equally distributed."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["The higher you set ",(0,i.jsx)(n.code,{children:"runs"}),", the more test cycles will be performed and the more ",(0,i.jsx)(n.strong,{children:"significant"})," will be the time measurements which leads to a better index selection."]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},8453(e,n,s){s.d(n,{R:()=>t,x:()=>a});var r=s(6540);const i={},o=r.createContext(i);function t(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/a7456010.4971822d.js b/docs/assets/js/a7456010.4971822d.js deleted file mode 100644 index cb5f7980354..00000000000 --- a/docs/assets/js/a7456010.4971822d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[1235],{8552(s){s.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/docs/assets/js/a7bd4aaa.992c4a90.js b/docs/assets/js/a7bd4aaa.992c4a90.js deleted file mode 100644 index e2ca5cf27f4..00000000000 --- a/docs/assets/js/a7bd4aaa.992c4a90.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[7098],{1723(n,e,s){s.r(e),s.d(e,{default:()=>d});s(6540);var r=s(5500);function o(n,e){return`docs-${n}-${e}`}var t=s(3025),i=s(2831),c=s(1463),a=s(4848);function u(n){const{version:e}=n;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(c.A,{version:e.version,tag:o(e.pluginId,e.version)}),(0,a.jsx)(r.be,{children:e.noIndex&&(0,a.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function l(n){const{version:e,route:s}=n;return(0,a.jsx)(r.e3,{className:e.className,children:(0,a.jsx)(t.n,{version:e,children:(0,i.v)(s.routes)})})}function d(n){return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(u,{...n}),(0,a.jsx)(l,{...n})]})}}}]); \ No newline at end of file diff --git a/docs/assets/js/a7f10198.cfa2de30.js b/docs/assets/js/a7f10198.cfa2de30.js deleted file mode 100644 index 98ef90b09f5..00000000000 --- a/docs/assets/js/a7f10198.cfa2de30.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[1098],{1337(t,e,n){n.r(e),n.d(e,{assets:()=>c,contentTitle:()=>s,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>m});const a=JSON.parse('{"id":"data-migration","title":"Data Migration","description":"This documentation page has been moved to here","source":"@site/docs/data-migration.md","sourceDirName":".","slug":"/data-migration.html","permalink":"/data-migration.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Data Migration","slug":"data-migration.html"}}');var o=n(4848),r=n(8453);const i={title:"Data Migration",slug:"data-migration.html"},s=void 0,c={},m=[];function l(t){const e={a:"a",p:"p",...(0,r.R)(),...t.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(e.p,{children:["This documentation page has been moved to ",(0,o.jsx)(e.a,{href:"/migration-schema.html",children:"here"})]}),"\n",(0,o.jsx)("meta",{"http-equiv":"refresh",content:"0; url=https://rxdb.info/migration-schema.html"})]})}function d(t={}){const{wrapper:e}={...(0,r.R)(),...t.components};return e?(0,o.jsx)(e,{...t,children:(0,o.jsx)(l,{...t})}):l(t)}},8453(t,e,n){n.d(e,{R:()=>i,x:()=>s});var a=n(6540);const o={},r=a.createContext(o);function i(t){const e=a.useContext(r);return a.useMemo(function(){return"function"==typeof t?t(e):{...e,...t}},[e,t])}function s(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(o):t.components||o:i(t.components),a.createElement(r.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/a94703ab.13c96c74.js b/docs/assets/js/a94703ab.13c96c74.js deleted file mode 100644 index cb83fcdf138..00000000000 --- a/docs/assets/js/a94703ab.13c96c74.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9048],{5955(e,t,n){n.d(t,{A:()=>r});n(6540);var a=n(4164),i=n(1312),s=n(1107),o=n(4848);function r({className:e}){return(0,o.jsx)("main",{className:(0,a.A)("container margin-vert--xl",e),children:(0,o.jsx)("div",{className:"row",children:(0,o.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,o.jsxs)(s.A,{as:"h1",className:"hero__title",children:[(0,o.jsx)("a",{href:"/",children:(0,o.jsx)("div",{style:{textAlign:"center"},children:(0,o.jsx)("img",{src:"https://rxdb.info/files/logo/rxdb_javascript_database.svg",alt:"RxDB",width:"160"})})}),(0,o.jsx)(i.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"404 Page Not Found"})]}),(0,o.jsx)("p",{children:(0,o.jsx)(i.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"The page you are looking for does not exist anymore or never has existed. If you have found this page through a link, you should tell the link author to update it."})}),(0,o.jsx)("p",{children:"Maybe one of these can help you to find the desired content:"}),(0,o.jsx)("div",{className:"ul-container",children:(0,o.jsxs)("ul",{children:[(0,o.jsx)("li",{children:(0,o.jsx)("a",{href:"https://rxdb.info/overview.html",children:"RxDB Documentation"})}),(0,o.jsx)("li",{children:(0,o.jsx)("a",{href:"/chat/",children:"RxDB Discord Channel"})}),(0,o.jsx)("li",{children:(0,o.jsx)("a",{href:"https://twitter.com/intent/user?screen_name=rxdbjs",children:"RxDB on twitter"})}),(0,o.jsx)("li",{children:(0,o.jsx)("a",{href:"/code/",children:"RxDB at Github"})})]})})]})})})}},7510(e,t,n){n.r(t),n.d(t,{default:()=>Ne});var a=n(6540),i=n(4164),s=n(5500),o=n(7559),r=n(4718),l=n(609),c=n(1312),d=n(3104),u=n(5062);const h="backToTopButton_sjWU",m="backToTopButtonShow_xfvO";var b=n(4848);function p(){const{shown:e,scrollToTop:t}=function({threshold:e}){const[t,n]=(0,a.useState)(!1),i=(0,a.useRef)(!1),{startScroll:s,cancelScroll:o}=(0,d.gk)();return(0,d.Mq)(({scrollY:t},a)=>{const s=a?.scrollY;s&&(i.current?i.current=!1:t>=s?(o(),n(!1)):t{e.location.hash&&(i.current=!0,n(!1))}),{shown:t,scrollToTop:()=>s(0)}}({threshold:300});return(0,b.jsx)("button",{"aria-label":(0,c.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,i.A)("clean-btn",o.G.common.backToTopButton,h,e&&m),type:"button",onClick:t})}var x=n(3109),j=n(6347),f=n(4581),g=n(6342),v=n(9529);function _(e){return(0,b.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,b.jsxs)("g",{fill:"#7a7a7a",children:[(0,b.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,b.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}const A="collapseSidebarButton_JQG6",C="collapseSidebarButtonIcon_Iseg";function k({onClick:e}){return(0,b.jsx)("button",{type:"button",title:(0,c.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,i.A)("button button--secondary button--outline",A),onClick:e,children:(0,b.jsx)(_,{className:C})})}var S=n(5041),N=n(9532);const y=Symbol("EmptyContext"),T=a.createContext(y);function I({children:e}){const[t,n]=(0,a.useState)(null),i=(0,a.useMemo)(()=>({expandedItem:t,setExpandedItem:n}),[t]);return(0,b.jsx)(T.Provider,{value:i,children:e})}var L=n(1422),B=n(9169),w=n(8774),E=n(2303),D=n(6654),M=n(3186);const H="menuExternalLink_NmtK",R="linkLabel_WmDU";function P({label:e}){return(0,b.jsx)("span",{title:e,className:R,children:e})}function G({item:e,onItemClick:t,activePath:n,level:a,index:s,...l}){const{href:c,label:d,className:u,autoAddBaseUrl:h}=e,m=(0,r.w8)(e,n),p=(0,D.A)(c);return(0,b.jsx)("li",{className:(0,i.A)(o.G.docs.docSidebarItemLink,o.G.docs.docSidebarItemLinkLevel(a),"menu__list-item",u),children:(0,b.jsxs)(w.A,{className:(0,i.A)("menu__link",!p&&H,{"menu__link--active":m}),autoAddBaseUrl:h,"aria-current":m?"page":void 0,to:c,...p&&{onClick:t?()=>t(e):void 0},...l,children:[(0,b.jsx)(P,{label:d}),!p&&(0,b.jsx)(M.A,{})]})},d)}const W="categoryLink_byQd",U="categoryLinkLabel_W154";function Y({collapsed:e,categoryLabel:t,onClick:n}){return(0,b.jsx)("button",{"aria-label":e?(0,c.T)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:t}):(0,c.T)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:t}),"aria-expanded":!e,type:"button",className:"clean-btn menu__caret",onClick:n})}function F({label:e}){return(0,b.jsx)("span",{title:e,className:U,children:e})}function V(e){return 0===(0,r.Y)(e.item.items,e.activePath).length?(0,b.jsx)(z,{...e}):(0,b.jsx)(K,{...e})}function z({item:e,...t}){if("string"!=typeof e.href)return null;const{type:n,collapsed:a,collapsible:i,items:s,linkUnlisted:o,...r}=e,l={type:"link",...r};return(0,b.jsx)(G,{item:l,...t})}function K({item:e,onItemClick:t,activePath:n,level:s,index:l,...c}){const{items:d,label:u,collapsible:h,className:m,href:p}=e,{docs:{sidebar:{autoCollapseCategories:x}}}=(0,g.p)(),j=function(e){const t=(0,E.A)();return(0,a.useMemo)(()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,r.Nr)(e):void 0,[e,t])}(e),f=(0,r.w8)(e,n),v=(0,B.ys)(p,n),{collapsed:_,setCollapsed:A}=(0,L.u)({initialState:()=>!!h&&(!f&&e.collapsed)}),{expandedItem:C,setExpandedItem:k}=function(){const e=(0,a.useContext)(T);if(e===y)throw new N.dV("DocSidebarItemsExpandedStateProvider");return e}(),S=(e=!_)=>{k(e?null:l),A(e)};!function({isActive:e,collapsed:t,updateCollapsed:n,activePath:i}){const s=(0,N.ZC)(e),o=(0,N.ZC)(i);(0,a.useEffect)(()=>{(e&&!s||e&&s&&i!==o)&&t&&n(!1)},[e,s,t,n,i,o])}({isActive:f,collapsed:_,updateCollapsed:S,activePath:n}),(0,a.useEffect)(()=>{h&&null!=C&&C!==l&&x&&A(!0)},[h,C,l,A,x]);return(0,b.jsxs)("li",{className:(0,i.A)(o.G.docs.docSidebarItemCategory,o.G.docs.docSidebarItemCategoryLevel(s),"menu__list-item",{"menu__list-item--collapsed":_},m),children:[(0,b.jsxs)("div",{className:(0,i.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":v}),children:[(0,b.jsx)(w.A,{className:(0,i.A)(W,"menu__link",{"menu__link--sublist":h,"menu__link--sublist-caret":!p&&h,"menu__link--active":f}),onClick:n=>{t?.(e),h&&(p?v?(n.preventDefault(),S()):S(!1):(n.preventDefault(),S()))},"aria-current":v?"page":void 0,role:h&&!p?"button":void 0,"aria-expanded":h&&!p?!_:void 0,href:h?j??"#":j,...c,children:(0,b.jsx)(F,{label:u})}),p&&h&&(0,b.jsx)(Y,{collapsed:_,categoryLabel:u,onClick:e=>{e.preventDefault(),S()}})]}),(0,b.jsx)(L.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:_,children:(0,b.jsx)(J,{items:d,tabIndex:_?-1:0,onItemClick:t,activePath:n,level:s+1})})]})}const O="menuHtmlItem_M9Kj";function Q({item:e,level:t,index:n}){const{value:a,defaultStyle:s,className:r}=e;return(0,b.jsx)("li",{className:(0,i.A)(o.G.docs.docSidebarItemLink,o.G.docs.docSidebarItemLinkLevel(t),s&&[O,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:a}},n)}function Z({item:e,...t}){switch(e.type){case"category":return(0,b.jsx)(V,{item:e,...t});case"html":return(0,b.jsx)(Q,{item:e,...t});default:return(0,b.jsx)(G,{item:e,...t})}}function q({items:e,...t}){const n=(0,r.Y)(e,t.activePath);return(0,b.jsx)(I,{children:n.map((e,n)=>(0,b.jsx)(Z,{item:e,index:n,...t},n))})}const J=(0,a.memo)(q),X="menu_Y1UP",$="menuWithAnnouncementBar_fPny";var ee=n(8120);function te({path:e,sidebar:t,className:n}){const s=function(){const{isActive:e}=(0,S.M)(),[t,n]=(0,a.useState)(e);return(0,d.Mq)(({scrollY:t})=>{e&&n(0===t)},[e]),e&&t}();return(0,b.jsxs)("nav",{"aria-label":(0,c.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,i.A)("menu thin-scrollbar",X,s&&$,n),children:[(0,b.jsx)("div",{style:{padding:10,paddingTop:30,marginLeft:"auto",marginRight:"auto"},children:(0,b.jsx)(ee.A,{})}),(0,b.jsx)("ul",{className:(0,i.A)(o.G.docs.docSidebarMenu,"menu__list"),children:(0,b.jsx)(J,{items:t,activePath:e,level:1})})]})}const ne="sidebar_mhZE",ae="sidebarWithHideableNavbar__6UL",ie="sidebarHidden__LRd",se="sidebarLogo_F_0z";function oe({path:e,sidebar:t,onCollapse:n,isHidden:a}){const{navbar:{hideOnScroll:s},docs:{sidebar:{hideable:o}}}=(0,g.p)();return(0,b.jsxs)("div",{className:(0,i.A)(ne,s&&ae,a&&ie),children:[s&&(0,b.jsx)(v.A,{tabIndex:-1,className:se}),(0,b.jsx)(te,{path:e,sidebar:t}),o&&(0,b.jsx)(k,{onClick:n})]})}const re=a.memo(oe);var le=n(5600),ce=n(2069);const de=({sidebar:e,path:t})=>{const n=(0,ce.M)();return(0,b.jsxs)("ul",{className:(0,i.A)(o.G.docs.docSidebarMenu,"menu__list"),children:[(0,b.jsx)(ee.A,{}),(0,b.jsx)(J,{items:e,activePath:t,onItemClick:e=>{"category"===e.type&&e.href&&n.toggle(),"link"===e.type&&n.toggle()},level:1})]})};function ue(e){return(0,b.jsx)(le.GX,{component:de,props:e})}const he=a.memo(ue);function me(e){const t=(0,f.l)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,b.jsxs)(b.Fragment,{children:[n&&(0,b.jsx)(re,{...e}),a&&(0,b.jsx)(he,{...e})]})}const be="expandButton_TmdG",pe="expandButtonIcon_i1dp";function xe({toggleSidebar:e}){return(0,b.jsx)("div",{className:be,title:(0,c.T)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,c.T)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:e,onClick:e,children:(0,b.jsx)(_,{className:pe})})}const je={docSidebarContainer:"docSidebarContainer_YfHR",docSidebarContainerHidden:"docSidebarContainerHidden_DPk8",sidebarViewport:"sidebarViewport_aRkj"};function fe({children:e}){const t=(0,l.t)();return(0,b.jsx)(a.Fragment,{children:e},t?.name??"noSidebar")}function ge({sidebar:e,hiddenSidebarContainer:t,setHiddenSidebarContainer:n}){const{pathname:s}=(0,j.zy)(),[r,l]=(0,a.useState)(!1),c=(0,a.useCallback)(()=>{r&&l(!1),!r&&(0,x.O)()&&l(!0),n(e=>!e)},[n,r]);return(0,b.jsx)("aside",{className:(0,i.A)(o.G.docs.docSidebarContainer,je.docSidebarContainer,t&&je.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(je.docSidebarContainer)&&t&&l(!0)},children:(0,b.jsx)(fe,{children:(0,b.jsxs)("div",{className:(0,i.A)(je.sidebarViewport,r&&je.sidebarViewportHidden),children:[(0,b.jsx)(me,{sidebar:e,path:s,onCollapse:c,isHidden:r}),r&&(0,b.jsx)(xe,{toggleSidebar:c})]})})})}const ve={docMainContainer:"docMainContainer_TBSr",docMainContainerEnhanced:"docMainContainerEnhanced_lQrH",docItemWrapperEnhanced:"docItemWrapperEnhanced_JWYK"};function _e({hiddenSidebarContainer:e,children:t}){const n=(0,l.t)();return(0,b.jsx)("main",{className:(0,i.A)(ve.docMainContainer,(e||!n)&&ve.docMainContainerEnhanced),children:(0,b.jsx)("div",{className:(0,i.A)("container padding-top--md padding-bottom--lg",ve.docItemWrapper,e&&ve.docItemWrapperEnhanced),children:t})})}const Ae="docRoot_UBD9",Ce="docsWrapper_hBAB";function ke({children:e}){const t=(0,l.t)(),[n,i]=(0,a.useState)(!1);return(0,b.jsxs)("div",{className:Ce,children:[(0,b.jsx)(p,{}),(0,b.jsxs)("div",{className:Ae,children:[t&&(0,b.jsx)(ge,{sidebar:t.items,hiddenSidebarContainer:n,setHiddenSidebarContainer:i}),(0,b.jsx)(_e,{hiddenSidebarContainer:n,children:e})]})]})}var Se=n(5955);function Ne(e){const t=(0,r.B5)(e);if(!t)return(0,b.jsx)(Se.A,{});const{docElement:n,sidebarName:a,sidebarItems:c}=t;return(0,b.jsx)(s.e3,{className:(0,i.A)(o.G.page.docsDocPage),children:(0,b.jsx)(l.V,{name:a,items:c,children:(0,b.jsx)(ke,{children:n})})})}}}]); \ No newline at end of file diff --git a/docs/assets/js/aa14e6b1.c1e700b0.js b/docs/assets/js/aa14e6b1.c1e700b0.js deleted file mode 100644 index ced6ee7cc2d..00000000000 --- a/docs/assets/js/aa14e6b1.c1e700b0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9824],{717(s,n,e){e.r(n),e.d(n,{assets:()=>t,contentTitle:()=>a,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"replication-graphql","title":"GraphQL Replication","description":"The GraphQL replication provides handlers for GraphQL to run replication with GraphQL as the transportation layer.","source":"@site/docs/replication-graphql.md","sourceDirName":".","slug":"/replication-graphql.html","permalink":"/replication-graphql.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"GraphQL Replication","slug":"replication-graphql.html"},"sidebar":"tutorialSidebar","previous":{"title":"RxServer Replication","permalink":"/replication-server.html"},"next":{"title":"WebSocket Replication","permalink":"/replication-websocket.html"}}');var i=e(4848),o=e(8453);const l={title:"GraphQL Replication",slug:"replication-graphql.html"},a="Replication with GraphQL",t={},c=[{value:"Usage",id:"usage",level:2},{value:"Creating a compatible GraphQL Server",id:"creating-a-compatible-graphql-server",level:3},{value:"RxDB Client",id:"rxdb-client",level:3},{value:"Pull replication",id:"pull-replication",level:4},{value:"Push replication",id:"push-replication",level:4},{value:"Pull Stream",id:"pull-stream",level:4},{value:"Transforming null to undefined in optional fields",id:"transforming-null-to-undefined-in-optional-fields",level:3},{value:"pull.responseModifier",id:"pullresponsemodifier",level:3},{value:"push.responseModifier",id:"pushresponsemodifier",level:3},{value:"Helper Functions",id:"helper-functions",level:4},{value:"RxGraphQLReplicationState",id:"rxgraphqlreplicationstate",level:3},{value:".setHeaders()",id:"setheaders",level:4},{value:"Sending Cookies",id:"sending-cookies",level:4}];function d(s){const n={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",p:"p",pre:"pre",span:"span",strong:"strong",...(0,o.R)(),...s.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"replication-with-graphql",children:"Replication with GraphQL"})}),"\n",(0,i.jsxs)(n.p,{children:["The GraphQL replication provides handlers for GraphQL to run ",(0,i.jsx)(n.a,{href:"/replication.html",children:"replication"})," with GraphQL as the transportation layer."]}),"\n",(0,i.jsxs)(n.p,{children:["The GraphQL replication is mostly used when you already have a backend that exposes a GraphQL API that can be adjusted to serve as a replication endpoint. If you do not already have a GraphQL endpoint, using the ",(0,i.jsx)(n.a,{href:"/replication-http.html",children:"HTTP replication"})," is an easier solution."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["To play around, check out the full example of the RxDB ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/graphql",children:"GraphQL replication with server and client"})]})}),"\n",(0,i.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,i.jsxs)(n.p,{children:["Before you use the GraphQL replication, make sure you've learned how the ",(0,i.jsx)(n.a,{href:"/replication.html",children:"RxDB replication"})," works."]}),"\n",(0,i.jsx)(n.h3,{id:"creating-a-compatible-graphql-server",children:"Creating a compatible GraphQL Server"}),"\n",(0,i.jsxs)(n.p,{children:["At the server-side, there must exist an endpoint which returns newer rows when the last ",(0,i.jsx)(n.code,{children:"checkpoint"})," is used as input. For example lets say you create a ",(0,i.jsx)(n.code,{children:"Query"})," ",(0,i.jsx)(n.code,{children:"pullHuman"})," which returns a list of document writes that happened after the given checkpoint."]}),"\n",(0,i.jsxs)(n.p,{children:["For the push-replication, you also need a ",(0,i.jsx)(n.code,{children:"Mutation"})," ",(0,i.jsx)(n.code,{children:"pushHuman"})," which lets RxDB update data of documents by sending the previous document state and the new client document state.\nAlso for being able to stream all ongoing events, we need a ",(0,i.jsx)(n.code,{children:"Subscription"})," called ",(0,i.jsx)(n.code,{children:"streamHuman"}),"."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"graphql","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"graphql","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"input"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" HumanInput"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" id: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"ID"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"String"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" lastName: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"String"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" updatedAt: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"Float"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" deleted: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"Boolean"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" Human"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" id: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"ID"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"String"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" lastName: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"String"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" updatedAt: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"Float"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" deleted: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"Boolean"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"input"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" Checkpoint"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" id: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"String"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" updatedAt: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"Float"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" HumanPullBulk"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" documents: ["}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"Human"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"]"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" checkpoint: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"Checkpoint"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" Query"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pullHuman(checkpoint: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"Checkpoint"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:", limit: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"Int"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"): "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"HumanPullBulk"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"input"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" HumanInputPushRow"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" assumedMasterState: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"HeroInputPushRowT0AssumedMasterStateT0"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" newDocumentState: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"HeroInputPushRowT0NewDocumentStateT0"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" Mutation"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" # Returns a list of all conflicts"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" # If no document write caused a conflict, return an empty list."})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pushHuman(rows: ["}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"HumanInputPushRow"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"]): ["}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"Human"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"# headers are used to authenticate the subscriptions"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"# over websockets."})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"input"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" Headers"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" AUTH_TOKEN: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"String"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" Subscription"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" streamHuman(headers: "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"Headers"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"): "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"HumanPullBulk"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "})]})})}),"\n",(0,i.jsxs)(n.p,{children:["The GraphQL resolver for the ",(0,i.jsx)(n.code,{children:"pullHuman"})," would then look like:"]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" rootValue"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" pullHuman"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" args "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" minId"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" args"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".checkpoint "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"?"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" args"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"checkpoint"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".id "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" ''"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" minUpdatedAt"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" args"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".checkpoint "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"?"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" args"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"checkpoint"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".updatedAt "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // sorted by updatedAt first and the id as second"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" sortedDocuments"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" documents"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".sort"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"((a"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" b) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"a"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".updatedAt "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:">"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" b"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".updatedAt) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 1"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"a"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".updatedAt "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"<"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" b"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".updatedAt) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" -"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"1"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"a"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".updatedAt "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"==="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" b"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".updatedAt) {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"a"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".id "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:">"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" b"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".id) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 1"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"a"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".id "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"<"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" b"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".id) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" -"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"1"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" else"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // only return documents newer than the input document"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" filterForMinUpdatedAtAndId"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" sortedDocuments"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".filter"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(doc "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".updatedAt "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"<"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" minUpdatedAt) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".updatedAt "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:">"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" minUpdatedAt) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".updatedAt "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"==="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" minUpdatedAt) {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // if updatedAt is equal, compare by id"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".id "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:">"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" minId) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" else"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // only return some documents in one batch"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" limitedDocs"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" filterForMinUpdatedAtAndId"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".slice"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" args"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".limit);"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // use the last document for the checkpoint"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" lastDoc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" limitedDocs["}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"limitedDocs"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"length"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" -"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 1"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"];"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" retCheckpoint"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" lastDoc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".id"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" updatedAt"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" lastDoc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".updatedAt"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" documents"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" limitedDocs"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" checkpoint"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" retCheckpoint"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" limited;"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsxs)(n.p,{children:["For examples for the other resolvers, consult the ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/blob/master/examples/graphql/server/index.js",children:"GraphQL Example Project"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"rxdb-client",children:"RxDB Client"}),"\n",(0,i.jsx)(n.h4,{id:"pull-replication",children:"Pull replication"}),"\n",(0,i.jsxs)(n.p,{children:["For the pull-replication, you first need a ",(0,i.jsx)(n.code,{children:"pullQueryBuilder"}),". This is a function that gets the last replication ",(0,i.jsx)(n.code,{children:"checkpoint"})," and a ",(0,i.jsx)(n.code,{children:"limit"})," as input and returns an object with a GraphQL-query and its variables (or a promise that resolves to the same object). RxDB will use the query builder to construct what is later sent to the GraphQL endpoint."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" pullQueryBuilder"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (checkpoint"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" limit) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * The first pull does not have a checkpoint"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * so we fill it up with defaults"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"checkpoint) {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" checkpoint "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" ''"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" updatedAt"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" `query PullHuman($checkpoint: CheckpointInput, $limit: Int!) {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" pullHuman(checkpoint: $checkpoint, limit: $limit) {"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" documents {"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" id"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" name"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" age"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" updatedAt"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" deleted"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" checkpoint {"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" id"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" updatedAt"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" }"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" }`"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" query"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" operationName"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'PullHuman'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" variables"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" checkpoint"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" limit"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,i.jsx)(n.p,{children:"With the queryBuilder, you can then setup the pull-replication."}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { replicateGraphQL } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication-graphql'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateGraphQL"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myRxCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // urls to the GraphQL endpoints"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" url"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" http"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'http://example.com/graphql'"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" queryBuilder"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pullQueryBuilder"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // the queryBuilder from above"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" modifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" doc "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" doc"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // (optional) modifies all pulled documents before they are handled by RxDB"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" dataPath"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" undefined"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // (optional) specifies the object path to access the document(s). Otherwise, the first result of the response data is used."})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Amount of documents that the remote will send in one request."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * If the response contains less than [batchSize] documents,"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * RxDB will assume there are no more changes on the backend"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * that are not replicated."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * This value is the same as the limit in the pullHuman() schema."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * [default=100]"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 50"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // headers which will be used in http requests against the server."})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" headers"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" Authorization"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Bearer abcde...'"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Options that have been inherited from the RxReplication"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" deletedField"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'deleted'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" live"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" retryTime "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 1000"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" *"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 5"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" waitForLeadership "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" autoStart "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,i.jsx)(n.h4,{id:"push-replication",children:"Push replication"}),"\n",(0,i.jsxs)(n.p,{children:["For the push-replication, you also need a ",(0,i.jsx)(n.code,{children:"queryBuilder"}),". Here, the builder receives a changed document as input which has to be send to the server. It also returns a GraphQL-Query and its data."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" pushQueryBuilder"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" rows "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" `"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" mutation PushHuman($writeRows: [HumanInputPushRow!]) {"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" pushHuman(writeRows: $writeRows) {"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" id"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" name"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" age"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" updatedAt"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" deleted"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" }"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" `"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" variables"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" writeRows"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" rows"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" query"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" operationName"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'PushHuman'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" variables"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,i.jsx)(n.p,{children:"With the queryBuilder, you can then setup the push-replication."}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateGraphQL"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myRxCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // urls to the GraphQL endpoints"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" url"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" http"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'http://example.com/graphql'"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" queryBuilder"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pushQueryBuilder"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // the queryBuilder from above"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * batchSize (optional)"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Amount of document that will be pushed to the server in a single request."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 5"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * modifier (optional)"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Modifies all pushed documents before they are send to the GraphQL endpoint."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Returning null will skip the document."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" modifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" doc "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" doc"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" headers"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" Authorization"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Bearer abcde...'"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,i.jsx)(n.h4,{id:"pull-stream",children:"Pull Stream"}),"\n",(0,i.jsxs)(n.p,{children:["To create a ",(0,i.jsx)(n.strong,{children:"realtime"})," replication, you need to create a pull stream that pulls ongoing writes from the server.\nThe pull stream gets the ",(0,i.jsx)(n.code,{children:"headers"})," of the ",(0,i.jsx)(n.code,{children:"RxReplicationState"})," as input, so that it can be authenticated on the backend."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" pullStreamQueryBuilder"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (headers) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" `subscription onStream($headers: Headers) {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" streamHero(headers: $headers) {"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" documents {"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" id,"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" name,"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" age,"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" updatedAt,"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" deleted"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" },"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" checkpoint {"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" id"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" updatedAt"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" }"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" }`"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" query"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" variables"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" headers"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,i.jsxs)(n.p,{children:["With the ",(0,i.jsx)(n.code,{children:"pullStreamQueryBuilder"})," you can then start a realtime replication."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateGraphQL"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myRxCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // urls to the GraphQL endpoints"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" url"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" http"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'http://example.com/graphql'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ws"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'ws://example.com/subscriptions'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- The websocket has to use a different url."})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" queryBuilder"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pushQueryBuilder"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" headers"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" Authorization"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Bearer abcde...'"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" queryBuilder"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pullQueryBuilder"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" streamQueryBuilder"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pullStreamQueryBuilder"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" includeWsHeaders"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" false"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Includes headers as connection parameter to Websocket."})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Websocket options that can be passed as a parameter to initialize the subscription"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Can be applied anything from the graphql-ws ClientOptions - https://the-guild.dev/graphql/ws/docs/interfaces/client.ClientOptions"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Except these parameters: 'url', 'shouldRetry', 'webSocketImpl' - locked for internal usage"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // Note: if you provide connectionParams as a wsOption, make sure it returns any necessary headers (e.g. authorization)"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // because providing your own connectionParams prevents headers from being included automatically"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" wsOptions"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { "})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" retryAttempts"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" deletedField"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'deleted'"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["If it is not possible to create a websocket server on your backend, you can use any other method of pull out the ongoing events from the backend and then you can send them into ",(0,i.jsx)(n.code,{children:"RxReplicationState.emitEvent()"}),"."]})}),"\n",(0,i.jsx)(n.h3,{id:"transforming-null-to-undefined-in-optional-fields",children:"Transforming null to undefined in optional fields"}),"\n",(0,i.jsxs)(n.p,{children:["GraphQL fills up non-existent optional values with ",(0,i.jsx)(n.code,{children:"null"})," while RxDB required them to be ",(0,i.jsx)(n.code,{children:"undefined"}),".\nTherefore, if your schema contains optional properties, you have to transform the pulled data to switch out ",(0,i.jsx)(n.code,{children:"null"})," to ",(0,i.jsx)(n.code,{children:"undefined"})]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" RxGraphQLReplicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"RxDocType"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"> "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateGraphQL"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myRxCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" url"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" headers"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" queryBuilder"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pullQueryBuilder"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" modifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (doc "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // We have to remove optional non-existent field values"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // they are set as null by GraphQL but should be undefined"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" Object"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".entries"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(doc)"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".forEach"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(([k"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" v]) "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (v "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"==="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" null"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:") {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" delete"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" doc[k];"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" doc;"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,i.jsx)(n.h3,{id:"pullresponsemodifier",children:"pull.responseModifier"}),"\n",(0,i.jsxs)(n.p,{children:["With the ",(0,i.jsx)(n.code,{children:"pull.responseModifier"})," you can modify the whole response from the GraphQL endpoint ",(0,i.jsx)(n.strong,{children:"before"})," it is processed by RxDB.\nFor example if your endpoint is not capable of returning a valid checkpoint, but instead only returns the plain document array, you can use the ",(0,i.jsx)(n.code,{children:"responseModifier"})," to aggregate the checkpoint from the returned documents."]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" RxGraphQLReplicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"RxDocType"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"> "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateGraphQL"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myRxCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" url"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" headers"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" responseModifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" plainResponse"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // the exact response that was returned from the server"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" origin"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // either 'handler' if plainResponse came from the pull.handler, or 'stream' if it came from the pull.stream"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" requestCheckpoint "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// if origin==='handler', the requestCheckpoint contains the checkpoint that was send to the backend"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" ) {"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * In this example we aggregate the checkpoint from the documents array"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * that was returned from the graphql endpoint."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" docs"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" plainResponse;"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" documents"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" docs"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" checkpoint"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" docs"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"length"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ==="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ?"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" requestCheckpoint "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" lastOfArray"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(docs).name"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" updatedAt"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" lastOfArray"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(docs).updatedAt"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,i.jsx)(n.h3,{id:"pushresponsemodifier",children:"push.responseModifier"}),"\n",(0,i.jsx)(n.p,{children:"It's also possible to modify the response of a push mutation. For example if your server returns more than the just conflicting docs:"}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"graphql","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"graphql","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" PushResponse"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" conflicts: ["}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"Human"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" conflictMessages: ["}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"ReplicationConflictMessage"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"type"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" Mutation"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" # Returns a PushResponse type that contains the conflicts along with other information"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pushHuman(rows: ["}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"HumanInputPushRow"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"]): "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"PushResponse"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {} "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "rxdb"'}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" RxGraphQLReplicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"RxDocType"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"> "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateGraphQL"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myRxCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" url"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" headers"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" responseModifier"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" (plainResponse) {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * In this example we aggregate the conflicting documents from a response object"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" plainResponse"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:".conflicts;"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"}"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,i.jsx)(n.h4,{id:"helper-functions",children:"Helper Functions"}),"\n",(0,i.jsxs)(n.p,{children:["RxDB provides the helper functions ",(0,i.jsx)(n.code,{children:"graphQLSchemaFromRxSchema()"}),", ",(0,i.jsx)(n.code,{children:"pullQueryBuilderFromRxSchema()"}),", ",(0,i.jsx)(n.code,{children:"pullStreamBuilderFromRxSchema()"})," and ",(0,i.jsx)(n.code,{children:"pushQueryBuilderFromRxSchema()"})," that can be used to generate handlers and schemas from the ",(0,i.jsx)(n.code,{children:"RxJsonSchema"}),". To learn how to use them, please inspect the ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/graphql",children:"GraphQL Example"}),"."]}),"\n",(0,i.jsx)(n.h3,{id:"rxgraphqlreplicationstate",children:"RxGraphQLReplicationState"}),"\n",(0,i.jsxs)(n.p,{children:["When you call ",(0,i.jsx)(n.code,{children:"myCollection.syncGraphQL()"})," it returns a ",(0,i.jsx)(n.code,{children:"RxGraphQLReplicationState"})," which can be used to subscribe to events, for debugging or other functions. It extends the ",(0,i.jsx)(n.a,{href:"/replication.html",children:"RxReplicationState"})," with some GraphQL specific methods."]}),"\n",(0,i.jsx)(n.h4,{id:"setheaders",children:".setHeaders()"}),"\n",(0,i.jsx)(n.p,{children:"Changes the headers for the replication after it has been set up."}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".setHeaders"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" Authorization"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" `...`"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(n.h4,{id:"sending-cookies",children:"Sending Cookies"}),"\n",(0,i.jsxs)(n.p,{children:["The underlying fetch framework uses a ",(0,i.jsx)(n.code,{children:"same-origin"})," policy for credentials per default. That means, cookies and session data is only shared if you backend and frontend run on the same domain and port. Pass the credential parameter to ",(0,i.jsx)(n.code,{children:"include"})," cookies in requests to servers from different origins via:"]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsx)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".setCredentials"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'include'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})})})}),"\n",(0,i.jsxs)(n.p,{children:["or directly pass it in the ",(0,i.jsx)(n.code,{children:"replicateGraphQL"})," function:"]}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"replicateGraphQL"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myRxCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" credentials"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'include'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,i.jsxs)(n.p,{children:["See ",(0,i.jsx)(n.a,{href:"https://fetch.spec.whatwg.org/#concept-request-credentials-mode",children:"the fetch spec"})," for more information about available options."]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["To play around, check out the full example of the RxDB ",(0,i.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/graphql",children:"GraphQL replication with server and client"})]})})]})}function h(s={}){const{wrapper:n}={...(0,o.R)(),...s.components};return n?(0,i.jsx)(n,{...s,children:(0,i.jsx)(d,{...s})}):d(s)}},8453(s,n,e){e.d(n,{R:()=>l,x:()=>a});var r=e(6540);const i={},o=r.createContext(i);function l(s){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof s?s(n):{...n,...s}},[n,s])}function a(s){let n;return n=s.disableParentContext?"function"==typeof s.components?s.components(i):s.components||i:l(s.components),r.createElement(o.Provider,{value:n},s.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/ab919a1f.41585657.js b/docs/assets/js/ab919a1f.41585657.js deleted file mode 100644 index ae849cdb84b..00000000000 --- a/docs/assets/js/ab919a1f.41585657.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[6491],{30(e,a,i){i.r(a),i.d(a,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"articles/embedded-database","title":"Embedded Database, Real-time Speed - RxDB","description":"Unleash the power of embedded databases with RxDB. Explore real-time replication, offline access, and reactive queries for modern JavaScript apps.","source":"@site/docs/articles/embedded-database.md","sourceDirName":"articles","slug":"/articles/embedded-database.html","permalink":"/articles/embedded-database.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Embedded Database, Real-time Speed - RxDB","slug":"embedded-database.html","description":"Unleash the power of embedded databases with RxDB. Explore real-time replication, offline access, and reactive queries for modern JavaScript apps."},"sidebar":"tutorialSidebar","previous":{"title":"Empower Web Apps with Reactive RxDB Data-base","permalink":"/articles/data-base.html"},"next":{"title":"Supercharge Flutter Apps with the RxDB Database","permalink":"/articles/flutter-database.html"}}');var s=i(4848),n=i(8453);const r={title:"Embedded Database, Real-time Speed - RxDB",slug:"embedded-database.html",description:"Unleash the power of embedded databases with RxDB. Explore real-time replication, offline access, and reactive queries for modern JavaScript apps."},l="Using RxDB as an Embedded Database",d={},o=[{value:"What is an Embedded Database?",id:"what-is-an-embedded-database",level:2},{value:"Embedded Database in UI Applications",id:"embedded-database-in-ui-applications",level:2},{value:"Why RxDB as an Embedded Database for Real-time Applications",id:"why-rxdb-as-an-embedded-database-for-real-time-applications",level:2},{value:"Follow Up",id:"follow-up",level:2}];function c(e){const a={a:"a",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",ul:"ul",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(a.header,{children:(0,s.jsx)(a.h1,{id:"using-rxdb-as-an-embedded-database",children:"Using RxDB as an Embedded Database"})}),"\n",(0,s.jsxs)(a.p,{children:["In modern UI applications, efficient data storage is a crucial aspect for seamless user experiences. One powerful solution for achieving this is by utilizing an embedded database. In this article, we will explore the concept of an embedded database and delve into the benefits of using ",(0,s.jsx)(a.a,{href:"https://rxdb.info/",children:"RxDB"})," as an embedded database in UI applications. We will also discuss why RxDB stands out as a robust choice for real-time applications with embedded database functionality."]}),"\n",(0,s.jsx)("center",{children:(0,s.jsx)("a",{href:"https://rxdb.info/",children:(0,s.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JavaScript Embedded Database",width:"220"})})}),"\n",(0,s.jsx)(a.h2,{id:"what-is-an-embedded-database",children:"What is an Embedded Database?"}),"\n",(0,s.jsxs)(a.p,{children:["An embedded database refers to a client-side database system that is integrated directly within an application. It is designed to operate within the client environment, such as a web browser or a ",(0,s.jsx)(a.a,{href:"/articles/mobile-database.html",children:"mobile"})," app. This approach eliminates the need for a separate database server and allows the database to run locally on the client device."]}),"\n",(0,s.jsx)(a.h2,{id:"embedded-database-in-ui-applications",children:"Embedded Database in UI Applications"}),"\n",(0,s.jsx)(a.p,{children:"In the context of UI applications, an embedded database serves as a local data storage solution. It enables applications to efficiently manage data, facilitate real-time updates, and enhance performance. Let's explore some of the benefits of using an embedded database compared to a traditional server database:"}),"\n",(0,s.jsxs)(a.ul,{children:["\n",(0,s.jsx)(a.li,{children:"Replicating database state becomes easier: Implementing real-time data synchronization and replication is simpler with an embedded database compared to complex REST routes. The embedded nature allows for efficient replication of the database state across multiple instances of the application."}),"\n",(0,s.jsx)(a.li,{children:"Use the database for caching: An embedded database can be utilized for caching frequently accessed data. This caching mechanism enhances performance and reduces the need for repeated network requests, resulting in faster data retrieval."}),"\n",(0,s.jsx)(a.li,{children:"Building real-time applications is easier with local data: By leveraging local data storage, real-time applications can easily update the user interface in response to data changes. This approach simplifies the development of real-time features and enhances the responsiveness of the application."}),"\n",(0,s.jsxs)(a.li,{children:["Store local data with ",(0,s.jsx)(a.a,{href:"/encryption.html",children:"encryption"}),": Embedded databases, like RxDB, offer the ability to store local data with encryption. This ensures that sensitive information remains protected even when stored locally on the client device."]}),"\n",(0,s.jsx)(a.li,{children:"Data is offline accessible: With an embedded database, data remains accessible even when the application is offline. Users can continue to interact with the application and access their data seamlessly, irrespective of their internet connectivity."}),"\n",(0,s.jsx)(a.li,{children:"Faster initial application start time: Since the data is already stored locally, there is no need for initial data fetching from a remote server. This significantly reduces the application's startup time and allows users to engage with the application more quickly."}),"\n",(0,s.jsx)(a.li,{children:"Improved scalability with local queries: Embedded databases, such as RxDB, perform queries locally on the client device instead of relying on server round-trips. This reduces latency and enhances scalability, particularly when dealing with large datasets or high query volumes."}),"\n",(0,s.jsxs)(a.li,{children:["Seamless integration with JavaScript frameworks: Embedded databases, including RxDB, integrate seamlessly with popular JavaScript frameworks like Angular, React.js, ",(0,s.jsx)(a.a,{href:"/articles/vue-database.html",children:"Vue.js"}),", and Svelte. This compatibility allows developers to leverage the capabilities of these frameworks while benefiting from embedded database functionality."]}),"\n",(0,s.jsx)(a.li,{children:"Running queries locally has low latency: With an embedded database, queries are executed locally on the client device, resulting in minimal latency. This improves the overall performance and responsiveness of the application."}),"\n",(0,s.jsx)(a.li,{children:"Data is portable and always accessible by the user: Embedded databases enable data portability, allowing users to seamlessly transition between devices while maintaining their data and application state. This ensures that data is always accessible and available to the user."}),"\n",(0,s.jsxs)(a.li,{children:["Using a ",(0,s.jsx)(a.a,{href:"/articles/local-database.html",children:"local database"})," for state management: Instead of relying on additional state management libraries like Redux or NgRx, an embedded database can be used for local state management. This simplifies state management and ensures data consistency within the application."]}),"\n"]}),"\n",(0,s.jsx)(a.h2,{id:"why-rxdb-as-an-embedded-database-for-real-time-applications",children:"Why RxDB as an Embedded Database for Real-time Applications"}),"\n",(0,s.jsx)(a.p,{children:"RxDB is a JavaScript-based embedded database that offers numerous advantages for building real-time applications. Let's explore why RxDB is a compelling choice:"}),"\n",(0,s.jsxs)(a.ul,{children:["\n",(0,s.jsxs)(a.li,{children:[(0,s.jsx)(a.a,{href:"/rx-query.html",children:"Observable Queries"})," (RxJS): RxDB leverages the power of Observables through RxJS, enabling developers to create queries that automatically update the user interface on data changes. This reactive approach simplifies UI updates and ensures real-time synchronization of data."]}),"\n",(0,s.jsxs)(a.li,{children:[(0,s.jsx)(a.a,{href:"/articles/json-database.html",children:"NoSQL JSON Documents"})," for UIs: RxDB utilizes NoSQL (JSON) documents as its data model, aligning seamlessly with the requirements of modern UI development. JavaScript's native support for JSON objects makes NoSQL documents a natural fit for UI-driven applications."]}),"\n",(0,s.jsx)(a.li,{children:"Better TypeScript Support Compared to SQL: RxDB's NoSQL approach provides excellent TypeScript support. The flexibility of working with JSON objects enables robust typing and enhanced development experiences, ensuring type safety and reducing runtime errors."}),"\n",(0,s.jsxs)(a.li,{children:[(0,s.jsx)(a.a,{href:"/rx-document.html",children:"Observable Document Fields"}),": RxDB allows developers to observe individual fields within documents. This granularity enables efficient tracking of specific data changes and facilitates targeted UI updates, enhancing performance and responsiveness."]}),"\n",(0,s.jsx)(a.li,{children:"Made in JavaScript, Optimized for JavaScript Applications: Being built entirely in JavaScript, RxDB is optimized for JavaScript applications. It leverages JavaScript's capabilities and integrates seamlessly with JavaScript frameworks and libraries, making it a natural choice for JavaScript developers."}),"\n",(0,s.jsxs)(a.li,{children:["Optimized Observed Queries with the ",(0,s.jsx)(a.a,{href:"https://github.com/pubkey/event-reduce",children:"EventReduce Algorithm"}),": RxDB incorporates the EventReduce algorithm to optimize observed queries. This algorithm reduces the number of emitted events during query execution, resulting in enhanced query performance and reduced overhead."]}),"\n",(0,s.jsx)(a.li,{children:"Built-in Multi-tab Support: RxDB provides built-in multi-tab support, allowing multiple instances of an application to share and synchronize data seamlessly. This feature enables collaborative and real-time scenarios across multiple browser tabs or windows."}),"\n",(0,s.jsxs)(a.li,{children:["Handling of Schema Changes across Multiple Client Devices: With RxDB, handling schema changes across multiple client devices becomes straightforward. RxDB's schema ",(0,s.jsx)(a.a,{href:"/migration-schema.html",children:"migration capabilities"})," ensure that applications can seamlessly adapt to evolving data structures, providing a consistent experience across different devices."]}),"\n",(0,s.jsx)(a.li,{children:"Storing Documents Compressed: RxDB offers the ability to store documents in a compressed format. This reduces the storage footprint and improves performance, especially when dealing with large datasets."}),"\n",(0,s.jsxs)(a.li,{children:["Flexible Storage Layer and Cross-platform Compatibility: RxDB provides a flexible storage layer that can be reused across various platforms, including ",(0,s.jsx)(a.a,{href:"/electron-database.html",children:"Electron.js"}),", ",(0,s.jsx)(a.a,{href:"/react-native-database.html",children:"React Native"}),", hybrid apps (via Capacitor.js), and browsers. This cross-platform compatibility simplifies development and enables code reuse across different environments."]}),"\n",(0,s.jsxs)(a.li,{children:["Replication Algorithm for Backend Compatibility: RxDB's replication algorithm is open-source and can be made compatible with various backend solutions, such as self-hosted servers, Firebase, ",(0,s.jsx)(a.a,{href:"/replication-couchdb.html",children:"CouchDB"}),", NATS, WebSockets, and more. This flexibility allows developers to choose their preferred backend infrastructure while benefiting from RxDB's embedded database capabilities."]}),"\n"]}),"\n",(0,s.jsx)("center",{children:(0,s.jsx)("a",{href:"https://rxdb.info/",children:(0,s.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JavaScript Embedded Database",width:"220"})})}),"\n",(0,s.jsx)(a.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,s.jsxs)(a.p,{children:["To further explore ",(0,s.jsx)(a.a,{href:"https://rxdb.info/",children:"RxDB"})," and leverage its capabilities as an embedded database, the following resources can be helpful:"]}),"\n",(0,s.jsxs)(a.ul,{children:["\n",(0,s.jsxs)(a.li,{children:[(0,s.jsx)(a.a,{href:"https://github.com/pubkey/rxdb",children:"RxDB GitHub Repository"}),": Visit the official GitHub repository of RxDB to access the source code, documentation, and community support."]}),"\n",(0,s.jsxs)(a.li,{children:[(0,s.jsx)(a.a,{href:"/quickstart.html",children:"RxDB Quickstart"}),": Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects."]}),"\n"]}),"\n",(0,s.jsxs)(a.p,{children:["By utilizing ",(0,s.jsx)(a.a,{href:"https://rxdb.info/",children:"RxDB"})," as an embedded database in UI applications, developers can harness the power of efficient data management, real-time updates, and enhanced user experiences. RxDB's features and benefits make it a compelling choice for building modern, responsive, and scalable applications."]})]})}function h(e={}){const{wrapper:a}={...(0,n.R)(),...e.components};return a?(0,s.jsx)(a,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453(e,a,i){i.d(a,{R:()=>r,x:()=>l});var t=i(6540);const s={},n=t.createContext(s);function r(e){const a=t.useContext(n);return t.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function l(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(n.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/aba21aa0.6f50d3cb.js b/docs/assets/js/aba21aa0.6f50d3cb.js deleted file mode 100644 index b91a605de93..00000000000 --- a/docs/assets/js/aba21aa0.6f50d3cb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[5742],{7093(s){s.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/docs/assets/js/ac62b32d.0f37c11a.js b/docs/assets/js/ac62b32d.0f37c11a.js deleted file mode 100644 index b078b6e4382..00000000000 --- a/docs/assets/js/ac62b32d.0f37c11a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9192],{3228(e,n,s){s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"replication-websocket","title":"Websocket Replication","description":"With the websocket replication plugin, you can spawn a websocket server from a RxDB database in Node.js and replicate with it.","source":"@site/docs/replication-websocket.md","sourceDirName":".","slug":"/replication-websocket.html","permalink":"/replication-websocket.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Websocket Replication","slug":"replication-websocket.html"},"sidebar":"tutorialSidebar","previous":{"title":"GraphQL Replication","permalink":"/replication-graphql.html"},"next":{"title":"CouchDB Replication","permalink":"/replication-couchdb.html"}}');var i=s(4848),o=s(8453);const t={title:"Websocket Replication",slug:"replication-websocket.html"},a="Websocket Replication",l={},c=[{value:"Starting the Websocket Server",id:"starting-the-websocket-server",level:2},{value:"Connect to the Websocket Server",id:"connect-to-the-websocket-server",level:2},{value:"Customize",id:"customize",level:2}];function d(e){const n={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",span:"span",strong:"strong",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"websocket-replication",children:"Websocket Replication"})}),"\n",(0,i.jsx)(n.p,{children:"With the websocket replication plugin, you can spawn a websocket server from a RxDB database in Node.js and replicate with it."}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["The websocket replication plugin does not have any concept for authentication or permission handling. It is designed to create an easy ",(0,i.jsx)(n.strong,{children:"server-to-server"})," replication. It is ",(0,i.jsx)(n.strong,{children:"not"})," made for client-server replication. Make a pull request if you need that feature."]})}),"\n",(0,i.jsx)(n.h2,{id:"starting-the-websocket-server",children:"Starting the Websocket Server"}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" startWebsocketServer"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication-websocket'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// create a RxDatabase like normal"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// start a websocket server"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" serverState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" startWebsocketServer"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" database"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myDatabase"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" port"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 1337"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" path"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '/socket'"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// stop the server"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" serverState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".close"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),"\n",(0,i.jsx)(n.h2,{id:"connect-to-the-websocket-server",children:"Connect to the Websocket Server"}),"\n",(0,i.jsx)(n.p,{children:"The replication has to be started once for each collection that you want to replicate."}),"\n",(0,i.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" replicateWithWebsocketServer"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication-websocket'"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// start the replication"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" replicateWithWebsocketServer"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * To make the replication work,"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * the client collection name must be equal"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * to the server collection name."})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" myRxCollection"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" url"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'ws://localhost:1337/socket'"})]}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(n.span,{"data-line":"",children:(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// stop the replication"})}),"\n",(0,i.jsxs)(n.span,{"data-line":"",children:[(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" replicationState"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".cancel"}),(0,i.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),"\n",(0,i.jsx)(n.h2,{id:"customize",children:"Customize"}),"\n",(0,i.jsxs)(n.p,{children:["We use the ",(0,i.jsx)(n.a,{href:"https://www.npmjs.com/package/ws",children:"ws"})," npm library, so you can use all optional configuration provided by it.\nThis is especially important to improve performance by opting in of some optional settings."]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453(e,n,s){s.d(n,{R:()=>t,x:()=>a});var r=s(6540);const i={},o=r.createContext(i);function t(e){const n=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/ad16b3ea.bade954e.js b/docs/assets/js/ad16b3ea.bade954e.js deleted file mode 100644 index 606d0caf007..00000000000 --- a/docs/assets/js/ad16b3ea.bade954e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[8674],{3247(e,s,n){n.d(s,{g:()=>i});var r=n(4848);function i(e){const s=[];let n=null;return e.children.forEach(e=>{e.props.id?(n&&s.push(n),n={headline:e,paragraphs:[]}):n&&n.paragraphs.push(e)}),n&&s.push(n),(0,r.jsx)("div",{style:o.stepsContainer,children:s.map((e,s)=>(0,r.jsxs)("div",{style:o.stepWrapper,children:[(0,r.jsxs)("div",{style:o.stepIndicator,children:[(0,r.jsx)("div",{style:o.stepNumber,children:s+1}),(0,r.jsx)("div",{style:o.verticalLine})]}),(0,r.jsxs)("div",{style:o.stepContent,children:[(0,r.jsx)("div",{children:e.headline}),e.paragraphs.map((e,s)=>(0,r.jsx)("div",{style:o.item,children:e},s))]})]},s))})}const o={stepsContainer:{display:"flex",flexDirection:"column"},stepWrapper:{display:"flex",alignItems:"stretch",marginBottom:"1.5rem",position:"relative",minWidth:0},stepIndicator:{position:"relative",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",width:"33px",marginRight:"1rem",minWidth:0},stepNumber:{width:"33px",height:"33px",borderRadius:"50%",backgroundColor:"var(--color-top)",color:"#fff",display:"flex",alignItems:"center",justifyContent:"center",fontWeight:"bold",marginTop:-4},verticalLine:{position:"absolute",top:29,bottom:"0",left:"50%",width:"1px",background:"linear-gradient(to bottom, var(--color-top) 0%, var(--color-top) 80%, rgba(0,0,0,0) 100%)",transform:"translateX(-50%)"},stepContent:{flex:1,minWidth:0,overflowWrap:"break-word"},item:{marginTop:"0.5rem"}}},5045(e,s,n){n.r(s),n.d(s,{assets:()=>d,contentTitle:()=>t,default:()=>p,frontMatter:()=>l,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"dev-mode","title":"Development Mode","description":"Enable checks & validations with RxDB Dev Mode. Ensure proper API use, readable errors, and schema validation during development. Avoid in production.","source":"@site/docs/dev-mode.md","sourceDirName":".","slug":"/dev-mode.html","permalink":"/dev-mode.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Development Mode","slug":"dev-mode.html","description":"Enable checks & validations with RxDB Dev Mode. Ensure proper API use, readable errors, and schema validation during development. Avoid in production."},"sidebar":"tutorialSidebar","previous":{"title":"Installation","permalink":"/install.html"},"next":{"title":"TypeScript Setup","permalink":"/tutorials/typescript.html"}}');var i=n(4848),o=n(8453),a=n(3247);const l={title:"Development Mode",slug:"dev-mode.html",description:"Enable checks & validations with RxDB Dev Mode. Ensure proper API use, readable errors, and schema validation during development. Avoid in production."},t="Dev Mode",d={},c=[{value:"Import the dev-mode Plugin",id:"import-the-dev-mode-plugin",level:3},{value:"Add the Plugin to RxDB",id:"add-the-plugin-to-rxdb",level:2},{value:"Usage with Node.js",id:"usage-with-nodejs",level:2},{value:"Usage with Angular",id:"usage-with-angular",level:2},{value:"Usage with webpack",id:"usage-with-webpack",level:2},{value:"Disable the dev-mode warning",id:"disable-the-dev-mode-warning",level:2},{value:"Disable the tracking iframe",id:"disable-the-tracking-iframe",level:2}];function h(e){const s={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"dev-mode",children:"Dev Mode"})}),"\n",(0,i.jsx)(s.p,{children:"The dev-mode plugin adds many checks and validations to RxDB.\nThis ensures that you use the RxDB API properly and so the dev-mode plugin should always be used when\nusing RxDB in development mode."}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Adds readable error messages."}),"\n",(0,i.jsxs)(s.li,{children:["Ensures that ",(0,i.jsx)(s.code,{children:"readonly"})," JavaScript objects are not accidentally mutated."]}),"\n",(0,i.jsxs)(s.li,{children:["Adds validation check for validity of schemas, queries, ",(0,i.jsx)(s.a,{href:"/orm.html",children:"ORM"})," methods and document fields.","\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Notice that the ",(0,i.jsx)(s.code,{children:"dev-mode"})," plugin does not perform schema checks against the data see ",(0,i.jsx)(s.a,{href:"/schema-validation.html",children:"schema validation"})," for that."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.admonition,{type:"warning",children:(0,i.jsxs)(s.p,{children:["The dev-mode plugin will increase your build size and decrease the performance. It must ",(0,i.jsx)(s.strong,{children:"always"})," be used in development. You should ",(0,i.jsx)(s.strong,{children:"never"})," use it in production."]})}),"\n",(0,i.jsxs)(a.g,{children:[(0,i.jsx)(s.h3,{id:"import-the-dev-mode-plugin",children:"Import the dev-mode Plugin"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { RxDBDevModePlugin } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/dev-mode'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { addRxPlugin } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]})]})})}),(0,i.jsx)(s.h2,{id:"add-the-plugin-to-rxdb",children:"Add the Plugin to RxDB"}),(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addRxPlugin"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(RxDBDevModePlugin);"})]})})})})]}),"\n",(0,i.jsx)(s.h2,{id:"usage-with-nodejs",children:"Usage with Node.js"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createDb"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"process"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"env"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"NODE_ENV"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" !=="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "production"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:") {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'rxdb/plugins/dev-mode'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".then"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" module "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" addRxPlugin"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"module"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".RxDBDevModePlugin)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"( "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" );"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.h2,{id:"usage-with-angular",children:"Usage with Angular"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { isDevMode } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" '@angular/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createDb"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"isDevMode"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()){"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'rxdb/plugins/dev-mode'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".then"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" module "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" addRxPlugin"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"module"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".RxDBDevModePlugin)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"( "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" );"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // ..."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.h2,{id:"usage-with-webpack",children:"Usage with webpack"}),"\n",(0,i.jsxs)(s.p,{children:["In the ",(0,i.jsx)(s.code,{children:"webpack.config.js"}),":"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"module"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"exports"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" entry"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" './src/index.ts'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" plugins"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // set a global variable that can be accessed during runtime"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" webpack"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".DefinePlugin"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({ MODE"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" JSON"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".stringify"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"production"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:") })"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,i.jsx)(s.p,{children:"In your source code:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"declare"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" var"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" MODE"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'production'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" |"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'development'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createDb"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"MODE"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ==="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'development'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:") {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'rxdb/plugins/dev-mode'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".then"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" module "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" addRxPlugin"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"module"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".RxDBDevModePlugin)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"( "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... */"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" );"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // ..."})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.h2,{id:"disable-the-dev-mode-warning",children:"Disable the dev-mode warning"}),"\n",(0,i.jsxs)(s.p,{children:["When the dev-mode is enabled, it will print a ",(0,i.jsx)(s.code,{children:"console.warn()"})," message to the console so that you do not accidentally use the dev-mode in production. To disable this warning you can call the ",(0,i.jsx)(s.code,{children:"disableWarnings()"})," function."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { disableWarnings } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/dev-mode'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"disableWarnings"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),"\n",(0,i.jsx)(s.h2,{id:"disable-the-tracking-iframe",children:"Disable the tracking iframe"}),"\n",(0,i.jsxs)(s.p,{children:["When used in localhost and in the browser, the dev-mode plugin can add a tracking iframe to the DOM. This is used to track the effectiveness of marketing efforts of RxDB.\nIf you have ",(0,i.jsx)(s.a,{href:"/premium/",children:"premium access"})," and want to disable this iframe, you can call ",(0,i.jsx)(s.code,{children:"setPremiumFlag()"})," before creating the database."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { setPremiumFlag } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/shared'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"setPremiumFlag"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})})]})}function p(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453(e,s,n){n.d(s,{R:()=>a,x:()=>l});var r=n(6540);const i={},o=r.createContext(i);function a(e){const s=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/ae2c2832.694f423a.js b/docs/assets/js/ae2c2832.694f423a.js deleted file mode 100644 index 94d7544022a..00000000000 --- a/docs/assets/js/ae2c2832.694f423a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[3321],{6839(e,a,s){s.r(a),s.d(a,{default:()=>i});var t=s(544),l=s(4848);function i(){return(0,t.default)({sem:{id:"gads",metaTitle:"The local Database for Svelte Apps",appName:"Svelte",title:(0,l.jsxs)(l.Fragment,{children:["The easiest way to ",(0,l.jsx)("b",{children:"store"})," and ",(0,l.jsx)("b",{children:"sync"})," Data in Svelte"]}),iconUrl:"/files/icons/svelte.svg"}})}}}]); \ No newline at end of file diff --git a/docs/assets/js/b0889a22.eeabb12f.js b/docs/assets/js/b0889a22.eeabb12f.js deleted file mode 100644 index f278c620df8..00000000000 --- a/docs/assets/js/b0889a22.eeabb12f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[1107],{3519(e,n,s){s.r(n),s.d(n,{assets:()=>r,contentTitle:()=>t,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"cleanup","title":"Cleanup","description":"Optimize storage and speed up queries with RxDB\'s Cleanup Plugin, automatically removing old deleted docs while preserving replication states.","source":"@site/docs/cleanup.md","sourceDirName":".","slug":"/cleanup.html","permalink":"/cleanup.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Cleanup","slug":"cleanup.html","description":"Optimize storage and speed up queries with RxDB\'s Cleanup Plugin, automatically removing old deleted docs while preserving replication states."},"sidebar":"tutorialSidebar","previous":{"title":"Local Documents","permalink":"/rx-local-document.html"},"next":{"title":"Backup","permalink":"/backup.html"}}');var l=s(4848),a=s(8453);const o={title:"Cleanup",slug:"cleanup.html",description:"Optimize storage and speed up queries with RxDB's Cleanup Plugin, automatically removing old deleted docs while preserving replication states."},t="\ud83e\uddf9 Cleanup",r={},c=[{value:"Installation",id:"installation",level:2},{value:"Create a database with cleanup options",id:"create-a-database-with-cleanup-options",level:2},{value:"Calling cleanup manually",id:"calling-cleanup-manually",level:2},{value:"Using the cleanup plugin to empty a collection",id:"using-the-cleanup-plugin-to-empty-a-collection",level:2},{value:"FAQ",id:"faq",level:2}];function d(e){const n={code:"code",figure:"figure",h1:"h1",h2:"h2",header:"header",p:"p",pre:"pre",span:"span",...(0,a.R)(),...e.components},{Details:s}=n;return s||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.header,{children:(0,l.jsx)(n.h1,{id:"-cleanup",children:"\ud83e\uddf9 Cleanup"})}),"\n",(0,l.jsx)(n.p,{children:"To make the replication work, and for other reasons, RxDB has to keep deleted documents in storage so that it can replicate their deletion state.\nThis ensures that when a client is offline, the deletion state is still known and can be replicated with the backend when the client goes online again."}),"\n",(0,l.jsx)(n.p,{children:"Keeping too many deleted documents in the storage, can slow down queries or fill up too much disc space.\nWith the cleanup plugin, RxDB will run cleanup cycles that clean up deleted documents when it can be done safely."}),"\n",(0,l.jsx)(n.h2,{id:"installation",children:"Installation"}),"\n",(0,l.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,l.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,l.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,l.jsxs)(n.span,{"data-line":"",children:[(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { addRxPlugin } "}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,l.jsxs)(n.span,{"data-line":"",children:[(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { RxDBCleanupPlugin } "}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/cleanup'"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,l.jsxs)(n.span,{"data-line":"",children:[(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:"addRxPlugin"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"(RxDBCleanupPlugin);"})]})]})})}),"\n",(0,l.jsx)(n.h2,{id:"create-a-database-with-cleanup-options",children:"Create a database with cleanup options"}),"\n",(0,l.jsxs)(n.p,{children:["You can set a specific cleanup policy when a ",(0,l.jsx)(n.code,{children:"RxDatabase"})," is created. For most use cases, the defaults should be ok."]}),"\n",(0,l.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,l.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,l.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,l.jsxs)(n.span,{"data-line":"",children:[(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,l.jsxs)(n.span,{"data-line":"",children:[(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,l.jsxs)(n.span,{"data-line":"",children:[(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,l.jsxs)(n.span,{"data-line":"",children:[(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'heroesdb'"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,l.jsxs)(n.span,{"data-line":"",children:[(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,l.jsxs)(n.span,{"data-line":"",children:[(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" cleanupPolicy"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * The minimum time in milliseconds for how long"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * a document has to be deleted before it is"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * purged by the cleanup."})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * [default=one month]"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,l.jsxs)(n.span,{"data-line":"",children:[(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" minimumDeletedTime"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 1000"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" *"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 60"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" *"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 60"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" *"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 24"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" *"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 31"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // one month,"})]}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * The minimum amount of that that the RxCollection must have existed."})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * This ensures that at the initial page load, more important"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * tasks are not slowed down because a cleanup process is running."})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * [default=60 seconds]"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,l.jsxs)(n.span,{"data-line":"",children:[(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" minimumCollectionAge"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 1000"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" *"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 60"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // 60 seconds"})]}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * After the initial cleanup is done,"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * a new cleanup is started after [runEach] milliseconds "})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * [default=5 minutes]"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,l.jsxs)(n.span,{"data-line":"",children:[(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" runEach"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 1000"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" *"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 60"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:" *"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" 5"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" // 5 minutes"})]}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * If set to true,"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * RxDB will await all running replications"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * to not have a replication cycle running."})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * This ensures we do not remove deleted documents"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * when they might not have already been replicated."})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * [default=true]"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,l.jsxs)(n.span,{"data-line":"",children:[(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" awaitReplicationsInSync"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" /**"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * If true, it will only start the cleanup"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * when the current instance is also the leader."})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * This ensures that when RxDB is used in multiInstance mode,"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * only one instance will start the cleanup."})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * [default=true]"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,l.jsxs)(n.span,{"data-line":"",children:[(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" waitForLeadership"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" true"})]}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,l.jsx)(n.h2,{id:"calling-cleanup-manually",children:"Calling cleanup manually"}),"\n",(0,l.jsxs)(n.p,{children:["You can manually run a cleanup per collection by calling ",(0,l.jsx)(n.code,{children:"RxCollection.cleanup()"}),"."]}),"\n",(0,l.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,l.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,l.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,l.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Manually run the cleanup with the"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * minimumDeletedTime from the cleanupPolicy."})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,l.jsxs)(n.span,{"data-line":"",children:[(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxCollection"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".cleanup"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Overwrite the minimumDeletedTime"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * be setting it explicitly (time in milliseconds)"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,l.jsxs)(n.span,{"data-line":"",children:[(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxCollection"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".cleanup"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"1000"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:" "}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"/**"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * Purge all deleted documents no"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * matter when they where deleted"})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" * by setting minimumDeletedTime to zero."})}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:" */"})}),"\n",(0,l.jsxs)(n.span,{"data-line":"",children:[(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxCollection"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".cleanup"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})}),"\n",(0,l.jsx)(n.h2,{id:"using-the-cleanup-plugin-to-empty-a-collection",children:"Using the cleanup plugin to empty a collection"}),"\n",(0,l.jsxs)(n.p,{children:["When you have a collection with documents and you want to empty it by purging all documents, the recommended way is to call ",(0,l.jsx)(n.code,{children:"myRxCollection.remove()"}),". However, this will destroy the JavaScript class of the collection and stop all listeners and observables.\nSometimes the better option might be to manually delete all documents and then use the cleanup plugin to purge the deleted documents:"]}),"\n",(0,l.jsx)(n.figure,{"data-rehype-pretty-code-figure":"",children:(0,l.jsx)(n.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,l.jsxs)(n.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// delete all documents"})}),"\n",(0,l.jsxs)(n.span,{"data-line":"",children:[(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxCollection"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".remove"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,l.jsx)(n.span,{"data-line":"",children:(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-comment)"},children:"// purge all deleted documents"})}),"\n",(0,l.jsxs)(n.span,{"data-line":"",children:[(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:" myRxCollection"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-function)"},children:".cleanup"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,l.jsx)(n.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})]})})}),"\n",(0,l.jsx)(n.h2,{id:"faq",children:"FAQ"}),"\n",(0,l.jsxs)(s,{children:[(0,l.jsx)("summary",{children:"When does the cleanup run"}),(0,l.jsx)("div",{children:(0,l.jsxs)(n.p,{children:["The cleanup cycles are optimized to run only when the database is idle and it is unlikely that another database interaction performance will be decreased in the meantime. For example, by default, the cleanup does not run in the first 60 seconds of the creation of a collection to ensure the initial page load of your website does not slow down. Also, we use mechanisms like the ",(0,l.jsx)(n.code,{children:"requestIdleCallback()"})," API to improve the correct timing of the cleanup cycle."]})})]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(d,{...e})}):d(e)}},8453(e,n,s){s.d(n,{R:()=>o,x:()=>t});var i=s(6540);const l={},a=i.createContext(l);function o(e){const n=i.useContext(a);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function t(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:o(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/b2653a00.0fc762c0.js b/docs/assets/js/b2653a00.0fc762c0.js deleted file mode 100644 index e5f4ef9b1f6..00000000000 --- a/docs/assets/js/b2653a00.0fc762c0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[3588],{4968(e,s,n){n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>t,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"articles/vue-database","title":"RxDB as a Database in a Vue.js Application","description":"Level up your Vue projects with RxDB. Build real-time, resilient, and responsive apps powered by a reactive NoSQL database right in the browser.","source":"@site/docs/articles/vue-database.md","sourceDirName":"articles","slug":"/articles/vue-database.html","permalink":"/articles/vue-database.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB as a Database in a Vue.js Application","slug":"vue-database.html","description":"Level up your Vue projects with RxDB. Build real-time, resilient, and responsive apps powered by a reactive NoSQL database right in the browser."},"sidebar":"tutorialSidebar","previous":{"title":"React Native Encryption and Encrypted Database/Storage","permalink":"/articles/react-native-encryption.html"},"next":{"title":"IndexedDB Database in Vue Apps - The Power of RxDB","permalink":"/articles/vue-indexeddb.html"}}');var i=n(4848),a=n(8453);const o={title:"RxDB as a Database in a Vue.js Application",slug:"vue-database.html",description:"Level up your Vue projects with RxDB. Build real-time, resilient, and responsive apps powered by a reactive NoSQL database right in the browser."},t="RxDB as a Database in a Vue Application",l={},c=[{value:"Why Vue Applications Need a Database",id:"why-vue-applications-need-a-database",level:2},{value:"Introducing RxDB as a Database Solution",id:"introducing-rxdb-as-a-database-solution",level:2},{value:"RxDB vs. Other Vue Database Options",id:"rxdb-vs-other-vue-database-options",level:3},{value:"Getting Started with RxDB",id:"getting-started-with-rxdb",level:2},{value:"Installation",id:"installation",level:3},{value:"Creating and Configuring Your Database",id:"creating-and-configuring-your-database",level:2},{value:"Vue Reactivity and RxDB Observables",id:"vue-reactivity-and-rxdb-observables",level:2},{value:"Different RxStorage Layers for RxDB",id:"different-rxstorage-layers-for-rxdb",level:2},{value:"Synchronizing Data with RxDB between Clients and Servers",id:"synchronizing-data-with-rxdb-between-clients-and-servers",level:2},{value:"Advanced RxDB Features and Techniques",id:"advanced-rxdb-features-and-techniques",level:2},{value:"Offline-First Approach",id:"offline-first-approach",level:3},{value:"Observable Queries and Change Streams",id:"observable-queries-and-change-streams",level:3},{value:"Encryption of Local Data",id:"encryption-of-local-data",level:3},{value:"Indexing and Performance Optimization",id:"indexing-and-performance-optimization",level:3},{value:"JSON Key Compression",id:"json-key-compression",level:3},{value:"Multi-Tab Support",id:"multi-tab-support",level:3},{value:"Best Practices for Using RxDB in Vue",id:"best-practices-for-using-rxdb-in-vue",level:2},{value:"Follow Up",id:"follow-up",level:2}];function d(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"rxdb-as-a-database-in-a-vue-application",children:"RxDB as a Database in a Vue Application"})}),"\n",(0,i.jsxs)(s.p,{children:["In the modern web ecosystem, ",(0,i.jsx)(s.a,{href:"https://vuejs.org/",children:"Vue"})," has become a leading choice for building highly performant, reactive single-page applications (SPAs). However, while Vue excels at managing and updating the user interface, robust and efficient data handling also plays a pivotal role in delivering a great user experience. Enter ",(0,i.jsx)(s.a,{href:"https://rxdb.info/",children:"RxDB"}),", a reactive JavaScript database that runs in the browser (and beyond), offering significant capabilities such as offline-first data handling, real-time synchronization, and straightforward integration with Vue's reactivity system."]}),"\n",(0,i.jsx)(s.p,{children:"This article explores how RxDB works, why it's a perfect match for Vue, and how you can leverage it to build more engaging, performant, and data-resilient Vue applications."}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"/files/logo/rxdb_javascript_database.svg",alt:"JavaScript Vue Database",width:"220"})})}),"\n",(0,i.jsx)(s.h2,{id:"why-vue-applications-need-a-database",children:"Why Vue Applications Need a Database"}),"\n",(0,i.jsx)(s.p,{children:"Vue is renowned for its lightweight core and flexible architecture centered around reactive state management and reusable components. However, modern Vue applications often require:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Offline Capabilities:"})," Allowing users to continue working even without internet access."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Real-Time Updates:"})," Keeping UI data in sync with changes as they occur, whether locally or from other connected clients."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Improved Performance:"})," Reducing server round trips and leveraging local storage for faster data operations."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Scalable Data Handling:"})," Managing increasingly large datasets or complex queries right in the browser."]}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"While you can store data in Vuex/Pinia stores or via direct AJAX calls, these solutions may not suffice when your application demands a full-featured offline-first database or complex synchronization with a server. RxDB addresses these needs with a dedicated, reactive, browser-based database that pairs seamlessly with Vue's reactivity system."}),"\n",(0,i.jsx)(s.h2,{id:"introducing-rxdb-as-a-database-solution",children:"Introducing RxDB as a Database Solution"}),"\n",(0,i.jsxs)(s.p,{children:["RxDB - short for Reactive Database - is built on the principle of combining ",(0,i.jsx)(s.a,{href:"/articles/in-memory-nosql-database.html",children:"NoSQL database"})," capabilities with reactive programming. It runs inside your client-side environment (browser, ",(0,i.jsx)(s.a,{href:"/nodejs-database.html",children:"Node.js"}),", or ",(0,i.jsx)(s.a,{href:"/articles/mobile-database.html",children:"mobile devices"}),") and provides:"]}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Real-Time Reactivity"}),": Automatically updates subscribed components whenever data changes."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Offline-First Approach"}),": Stores data locally and syncs with the server when online connectivity is restored."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Data Replication"}),": Effortlessly keeps data synchronized across multiple tabs, devices, or server instances."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Multi-Tab Support"}),": Seamlessly propagates changes to all open tabs in the user's ",(0,i.jsx)(s.a,{href:"/articles/browser-database.html",children:"browser"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Observable Queries"}),": Automatically refresh the result set when documents in your queried collection change."]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"rxdb-vs-other-vue-database-options",children:"RxDB vs. Other Vue Database Options"}),"\n",(0,i.jsx)(s.p,{children:"Compared to traditional approaches - like raw IndexedDB or local storage - RxDB adds a powerful, reactive layer that simplifies your data flow. While tools like Vuex or Pinia are great for state management, they are not fully fledged databases with features like replication, conflict resolution, and offline persistence. RxDB bridges the gap by providing an integrated data handling solution tailor-made for modern, data-intensive Vue applications."}),"\n",(0,i.jsx)(s.h2,{id:"getting-started-with-rxdb",children:"Getting Started with RxDB"}),"\n",(0,i.jsx)(s.p,{children:"Let's break down the essentials for using RxDB within a Vue application."}),"\n",(0,i.jsx)(s.h3,{id:"installation",children:"Installation"}),"\n",(0,i.jsx)(s.p,{children:"You can install RxDB (and RxJS, which it depends on) via npm or yarn:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"bash","data-theme":"css-variables",children:(0,i.jsx)(s.code,{"data-language":"bash","data-theme":"css-variables",style:{display:"grid"},children:(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"npm"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" install"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" rxdb"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string)"},children:" rxjs"})]})})})}),"\n",(0,i.jsx)(s.h2,{id:"creating-and-configuring-your-database",children:"Creating and Configuring Your Database"}),"\n",(0,i.jsxs)(s.p,{children:["Within your Vue project, you can set up an RxDB instance in a dedicated file or a Vue plugin. Below is an example using ",(0,i.jsx)(s.a,{href:"/articles/localstorage.html",children:"Localstorage"})," as the storage engine:"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// db.js"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" initDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'heroesdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" password"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myPassword'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // optional encryption password"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" multiInstance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // multi-tab support"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" eventReduce"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // optimize event handling"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" hero"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'hero schema'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" healthpoints"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'number'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" db;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.p,{children:"After creating the RxDB instance, you can share it across your application (for example, by providing it in a plugin or a global property in Vue)."}),"\n",(0,i.jsx)(s.h2,{id:"vue-reactivity-and-rxdb-observables",children:"Vue Reactivity and RxDB Observables"}),"\n",(0,i.jsxs)(s.p,{children:["RxDB queries return RxJS observables (",(0,i.jsx)(s.code,{children:".$"}),"). Vue can automatically update components when data changes if you manually subscribe and store results in Vue refs/reactive objects, or if you use RxDB's ",(0,i.jsx)(s.a,{href:"/reactivity.html",children:"custom reactivity for Vue"}),"."]}),"\n",(0,i.jsx)(s.p,{children:(0,i.jsx)(s.strong,{children:"Example with Vue 3 Composition API:"})}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// HeroList.vue"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"script"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" setup"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"import { ref"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" onMounted } from 'vue';"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"import { initDatabase } from '@/db';"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"const heroes = ref([]);"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"let db;"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"onMounted(async () => {"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" db "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" initDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Subscribe to an RxDB query"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".hero"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" .find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" healthpoints"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { $gt"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sort"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" [{ name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'asc'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }]"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" .$ "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// the dot-$ is an observable that emits whenever the query results change"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" .subscribe"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"((newHeroes) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" heroes"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".value "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" newHeroes;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:""})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"template"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"ul"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"li"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" v-for"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"hero in heroes"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:' :key="hero.id">'})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {{ hero.name }} - HP: {{ hero.healthpoints }}"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" "})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" "})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:""})})]})})}),"\n",(0,i.jsx)(s.h2,{id:"different-rxstorage-layers-for-rxdb",children:"Different RxStorage Layers for RxDB"}),"\n",(0,i.jsx)(s.p,{children:'RxDB supports multiple storage backends - called "RxStorage layers" - giving you flexibility in how data is persisted:'}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/rx-storage-localstorage.html",children:"LocalStorage RxStorage"}),": Uses the browsers localstorage API."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB RxStorage"}),": Direct usage of native IndexedDB."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/rx-storage-opfs.html",children:"OPFS RxStorage"}),": Uses the File System Access API for even faster storage in modern browsers."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/rx-storage-memory.html",children:"Memory RxStorage"}),": Stores data in memory, ideal for tests or ephemeral data."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/rx-storage-sqlite.html",children:"SQLite RxStorage"}),": Runs SQLite, which can be compiled to WebAssembly for the browser. While possible, it typically carries a larger bundle size compared to native browser APIs like ",(0,i.jsx)(s.a,{href:"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html",children:"IndexedDB or OPFS"}),"."]}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"Choose the storage option that best aligns with your Vue application's requirements for performance, persistence, and platform compatibility."}),"\n",(0,i.jsx)(s.h2,{id:"synchronizing-data-with-rxdb-between-clients-and-servers",children:"Synchronizing Data with RxDB between Clients and Servers"}),"\n",(0,i.jsx)(s.p,{children:"RxDB champions an offline-first approach: data is kept locally so that your Vue app remains usable, even without internet. When connectivity is restored, RxDB ensures your local changes synchronize to the server, resolving conflicts as necessary."}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"../files/database-replication.png",alt:"database replication",width:"200"})}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/articles/realtime-database.html",children:"Real-Time Synchronization"}),": With RxDB's replication plugins, any local change can be instantly pushed to a remote endpoint while pulling down remote changes to ensure consistency."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Conflict Resolution"}),": In multi-user scenarios, conflicts may arise if two clients update the same document simultaneously. RxDB provides hooks to handle and resolve these gracefully."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Scalable Architecture"}),": By reducing reliance on continuous server requests, you can lighten server load and deliver a more responsive user experience."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"advanced-rxdb-features-and-techniques",children:"Advanced RxDB Features and Techniques"}),"\n",(0,i.jsx)(s.h3,{id:"offline-first-approach",children:"Offline-First Approach"}),"\n",(0,i.jsx)(s.p,{children:"Vue applications can seamlessly function offline by leveraging RxDB's local database storage. The moment the network is restored, all unsynced data is pushed to the server. This capability is particularly beneficial for Progressive Web Apps (PWAs) and scenarios with spotty connectivity."}),"\n",(0,i.jsx)(s.h3,{id:"observable-queries-and-change-streams",children:"Observable Queries and Change Streams"}),"\n",(0,i.jsx)(s.p,{children:"Beyond simply returning data, RxDB queries emit observables that respond to any change in the underlying documents. This real-time approach can drastically simplify state management, since updates flow directly into your Vue components without additional manual wiring."}),"\n",(0,i.jsx)(s.h3,{id:"encryption-of-local-data",children:"Encryption of Local Data"}),"\n",(0,i.jsxs)(s.p,{children:["For applications handling sensitive information, RxDB supports ",(0,i.jsx)(s.a,{href:"/encryption.html",children:"encryption"})," of local data. Your data is stored securely in the browser, protecting it from unauthorized access."]}),"\n",(0,i.jsx)(s.h3,{id:"indexing-and-performance-optimization",children:"Indexing and Performance Optimization"}),"\n",(0,i.jsxs)(s.p,{children:["By ",(0,i.jsx)(s.a,{href:"/rx-schema.html",children:"defining indexes"})," on frequently searched fields, you can speed up queries and reduce overall resource usage. This is crucial for larger datasets where performance might otherwise degrade."]}),"\n",(0,i.jsx)(s.h3,{id:"json-key-compression",children:"JSON Key Compression"}),"\n",(0,i.jsxs)(s.p,{children:["This ",(0,i.jsx)(s.a,{href:"/key-compression.html",children:"optimization"})," shortens field names in stored JSON documents, thereby reducing storage space and potentially improving performance for read/write operations."]}),"\n",(0,i.jsx)(s.h3,{id:"multi-tab-support",children:"Multi-Tab Support"}),"\n",(0,i.jsx)(s.p,{children:"If your users open multiple tabs of your Vue application, RxDB ensures data is synchronized across all instances in real time. Changes made in one tab are immediately reflected in others, creating a unified user experience."}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"../files/multiwindow.gif",alt:"multi tab support",width:"450"})}),"\n",(0,i.jsx)(s.h2,{id:"best-practices-for-using-rxdb-in-vue",children:"Best Practices for Using RxDB in Vue"}),"\n",(0,i.jsx)(s.p,{children:"Here are some recommendations to get the most out of RxDB in your Vue projects:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"Centralize Database Creation: Initialize and configure RxDB in a dedicated file or plugin, ensuring only one database instance is created."}),"\n",(0,i.jsx)(s.li,{children:"Leverage Vue's Composition API or a Global Store: Use watchers, refs, or a store like Pinia to neatly manage data subscriptions and updates, preventing scattered subscription logic."}),"\n",(0,i.jsx)(s.li,{children:"Async Subscriptions: Prefer using Vue's lifecycle hooks and the Composition API to manage subscriptions. Clean up subscriptions when components unmount or no longer need the data."}),"\n",(0,i.jsx)(s.li,{children:"Optimize Queries and Indexes: Only query the data you need, and define indexes to speed up lookups."}),"\n",(0,i.jsxs)(s.li,{children:["Test ",(0,i.jsx)(s.a,{href:"/offline-first.html",children:"Offline Scenarios"}),": Make sure your offline logic works as expected by simulating network disconnections and reconnections."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/transactions-conflicts-revisions.html",children:"Plan Conflict Resolution"}),": For multi-user apps, decide how to merge concurrent changes to prevent data inconsistencies."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,i.jsx)(s.p,{children:"To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/code/",children:"RxDB GitHub Repository"}),": Visit the official GitHub repository of RxDB to access the source code, documentation, and community support."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/quickstart.html",children:"RxDB Quickstart"}),": Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/reactivity.html",children:"RxDB Reactivity for Vue"}),": Discover how RxDB observables can directly produce Vue refs, simplifying integration with your Vue components."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/vue",children:"RxDB Vue Example at GitHub"}),": Explore an official Vue example to see RxDB in action within a Vue application."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples",children:"RxDB Examples"}),": Browse even more official examples to learn best practices you can apply to your own projects."]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,a.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453(e,s,n){n.d(s,{R:()=>o,x:()=>t});var r=n(6540);const i={},a=r.createContext(i);function o(e){const s=r.useContext(a);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(i):e.components||i:o(e.components),r.createElement(a.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/b30f4f1f.0b7faa87.js b/docs/assets/js/b30f4f1f.0b7faa87.js deleted file mode 100644 index 5b9d2d5da8a..00000000000 --- a/docs/assets/js/b30f4f1f.0b7faa87.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[3779],{8305(e,s,n){n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"rx-attachment","title":"Attachments","description":"Learn how to store and manage binary data like images or files in RxDB using attachments. Discover features, performance benefits, encryption, compression, and usage examples with code.","source":"@site/docs/rx-attachment.md","sourceDirName":".","slug":"/rx-attachment.html","permalink":"/rx-attachment.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Attachments","slug":"rx-attachment.html","description":"Learn how to store and manage binary data like images or files in RxDB using attachments. Discover features, performance benefits, encryption, compression, and usage examples with code."},"sidebar":"tutorialSidebar","previous":{"title":"Storage Migration","permalink":"/migration-storage.html"},"next":{"title":"RxPipelines","permalink":"/rx-pipeline.html"}}');var a=n(4848),t=n(8453);const i={title:"Attachments",slug:"rx-attachment.html",description:"Learn how to store and manage binary data like images or files in RxDB using attachments. Discover features, performance benefits, encryption, compression, and usage examples with code."},o="Attachments",l={},c=[{value:"Add the attachments plugin",id:"add-the-attachments-plugin",level:2},{value:"Enable attachments in the schema",id:"enable-attachments-in-the-schema",level:2},{value:"putAttachment()",id:"putattachment",level:2},{value:"putAttachmentBase64()",id:"putattachmentbase64",level:2},{value:"getAttachment()",id:"getattachment",level:2},{value:"allAttachments()",id:"allattachments",level:2},{value:"allAttachments$",id:"allattachments-1",level:2},{value:"RxAttachment",id:"rxattachment",level:2},{value:"doc",id:"doc",level:3},{value:"id",id:"id",level:3},{value:"type",id:"type",level:3},{value:"length",id:"length",level:3},{value:"digest",id:"digest",level:3},{value:"rev",id:"rev",level:3},{value:"remove()",id:"remove",level:3},{value:"getData()",id:"getdata",level:2},{value:"getDataBase64()",id:"getdatabase64",level:2},{value:"getStringData()",id:"getstringdata",level:2}];function h(e){const s={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.header,{children:(0,a.jsx)(s.h1,{id:"attachments",children:"Attachments"})}),"\n",(0,a.jsxs)(s.p,{children:["Attachments are binary data files that can be attachment to an ",(0,a.jsx)(s.code,{children:"RxDocument"}),", like a file that is attached to an email."]}),"\n",(0,a.jsxs)(s.p,{children:["Using attachments instead of adding the data to the normal document, ensures that you still have a good ",(0,a.jsx)(s.strong,{children:"performance"})," when querying and writing documents, even when a big amount of data, like an image file has to be stored."]}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsx)(s.li,{children:"You can store string, binary files, images and whatever you want side by side with your documents."}),"\n",(0,a.jsx)(s.li,{children:"Deleted documents automatically loose all their attachments data."}),"\n",(0,a.jsx)(s.li,{children:"Not all replication plugins support the replication of attachments."}),"\n",(0,a.jsxs)(s.li,{children:["Attachments can be stored ",(0,a.jsx)(s.a,{href:"/encryption.html",children:"encrypted"}),"."]}),"\n"]}),"\n",(0,a.jsxs)(s.p,{children:["Internally, attachments in RxDB are stored and handled similar to how ",(0,a.jsx)(s.a,{href:"https://pouchdb.com/guides/attachments.html#how-attachments-are-stored",children:"CouchDB, PouchDB"})," does it."]}),"\n",(0,a.jsx)(s.h2,{id:"add-the-attachments-plugin",children:"Add the attachments plugin"}),"\n",(0,a.jsxs)(s.p,{children:["To enable the attachments, you have to add the ",(0,a.jsx)(s.code,{children:"attachments"})," plugin."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { addRxPlugin } "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { RxDBAttachmentsPlugin } "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/attachments'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addRxPlugin"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(RxDBAttachmentsPlugin);"})]})]})})}),"\n",(0,a.jsx)(s.h2,{id:"enable-attachments-in-the-schema",children:"Enable attachments in the schema"}),"\n",(0,a.jsxs)(s.p,{children:["Before you can use attachments, you have to ensure that the attachments-object is set in the schema of your ",(0,a.jsx)(s.code,{children:"RxCollection"}),"."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" mySchema"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // ."})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // ."})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // ."})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" attachments"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" encrypted"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // if true, the attachment-data will be encrypted with the db-password"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myCollection"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" humans"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" mySchema"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(s.h2,{id:"putattachment",children:"putAttachment()"}),"\n",(0,a.jsxs)(s.p,{children:["Adds an attachment to a ",(0,a.jsx)(s.code,{children:"RxDocument"}),". Returns a Promise with the new attachment."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createBlob } "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" attachment"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDocument"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".putAttachment"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'cat.txt'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // (string) name of the attachment"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" data"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createBlob"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'meowmeow'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'text/plain'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // (string|Blob) data of the attachment"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'text/plain'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // (string) type of the attachment-data like 'image/jpeg'"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,a.jsx)(s.admonition,{type:"warning",children:(0,a.jsxs)(s.p,{children:["Expo/React-Native does not support the ",(0,a.jsx)(s.code,{children:"Blob"})," API natively. Make sure you use your own polyfill that properly supports ",(0,a.jsx)(s.code,{children:"blob.arrayBuffer()"})," when using RxAttachments or use the ",(0,a.jsx)(s.code,{children:"putAttachmentBase64()"})," and ",(0,a.jsx)(s.code,{children:"getDataBase64()"})," so that you do not have to create blobs."]})}),"\n",(0,a.jsx)(s.h2,{id:"putattachmentbase64",children:"putAttachmentBase64()"}),"\n",(0,a.jsxs)(s.p,{children:["Same as ",(0,a.jsx)(s.code,{children:"putAttachment()"})," but accepts a plain base64 string instead of a ",(0,a.jsx)(s.code,{children:"Blob"}),"."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" attachment"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".putAttachmentBase64"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'cat.txt'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" length"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 4"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" data"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'bWVvdw=='"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'text/plain'"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(s.h2,{id:"getattachment",children:"getAttachment()"}),"\n",(0,a.jsxs)(s.p,{children:["Returns an ",(0,a.jsx)(s.code,{children:"RxAttachment"})," by its id. Returns ",(0,a.jsx)(s.code,{children:"null"})," when the attachment does not exist."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsx)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" attachment"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDocument"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".getAttachment"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'cat.jpg'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]})})})}),"\n",(0,a.jsx)(s.h2,{id:"allattachments",children:"allAttachments()"}),"\n",(0,a.jsxs)(s.p,{children:["Returns an array of all attachments of the ",(0,a.jsx)(s.code,{children:"RxDocument"}),"."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsx)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" attachments"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDocument"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".allAttachments"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})})})}),"\n",(0,a.jsx)(s.h2,{id:"allattachments-1",children:"allAttachments$"}),"\n",(0,a.jsx)(s.p,{children:"Gets an Observable which emits a stream of all attachments from the document. Re-emits each time an attachment gets added or removed from the RxDocument."}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" all"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" [];"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"myDocument"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"allAttachments$"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" attachments "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" all "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" attachments"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,a.jsx)(s.h2,{id:"rxattachment",children:"RxAttachment"}),"\n",(0,a.jsxs)(s.p,{children:["The attachments of RxDB are represented by the type ",(0,a.jsx)(s.code,{children:"RxAttachment"})," which has the following attributes/methods."]}),"\n",(0,a.jsx)(s.h3,{id:"doc",children:"doc"}),"\n",(0,a.jsxs)(s.p,{children:["The ",(0,a.jsx)(s.code,{children:"RxDocument"})," which the attachment is assigned to."]}),"\n",(0,a.jsx)(s.h3,{id:"id",children:"id"}),"\n",(0,a.jsxs)(s.p,{children:["The id as ",(0,a.jsx)(s.code,{children:"string"})," of the attachment."]}),"\n",(0,a.jsx)(s.h3,{id:"type",children:"type"}),"\n",(0,a.jsxs)(s.p,{children:["The type as ",(0,a.jsx)(s.code,{children:"string"})," of the attachment."]}),"\n",(0,a.jsx)(s.h3,{id:"length",children:"length"}),"\n",(0,a.jsxs)(s.p,{children:["The length of the data of the attachment as ",(0,a.jsx)(s.code,{children:"number"}),"."]}),"\n",(0,a.jsx)(s.h3,{id:"digest",children:"digest"}),"\n",(0,a.jsxs)(s.p,{children:["The hash of the attachments data as ",(0,a.jsx)(s.code,{children:"string"}),"."]}),"\n",(0,a.jsx)(s.admonition,{type:"note",children:(0,a.jsx)(s.p,{children:"The digest is NOT calculated by RxDB, instead it is calculated by the RxStorage. The only guarantee is that the digest will change when the attachments data changes."})}),"\n",(0,a.jsx)(s.h3,{id:"rev",children:"rev"}),"\n",(0,a.jsxs)(s.p,{children:["The revision-number of the attachment as ",(0,a.jsx)(s.code,{children:"number"}),"."]}),"\n",(0,a.jsx)(s.h3,{id:"remove",children:"remove()"}),"\n",(0,a.jsx)(s.p,{children:"Removes the attachment. Returns a Promise that resolves when done."}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" attachment"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDocument"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".getAttachment"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'cat.jpg'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" attachment"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".remove"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]})]})})}),"\n",(0,a.jsx)(s.h2,{id:"getdata",children:"getData()"}),"\n",(0,a.jsxs)(s.p,{children:["Returns a Promise which resolves the attachment's data as ",(0,a.jsx)(s.code,{children:"Blob"}),". (async)"]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" attachment"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDocument"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".getAttachment"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'cat.jpg'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" blob"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" attachment"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".getData"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(); "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Blob"})]})]})})}),"\n",(0,a.jsx)(s.h2,{id:"getdatabase64",children:"getDataBase64()"}),"\n",(0,a.jsxs)(s.p,{children:["Returns a Promise which resolves the attachment's data as ",(0,a.jsx)(s.strong,{children:"base64"})," ",(0,a.jsx)(s.code,{children:"string"}),"."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" attachment"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDocument"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".getAttachment"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'cat.jpg'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" base64Database"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" attachment"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".getDataBase64"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(); "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// 'bWVvdw=='"})]})]})})}),"\n",(0,a.jsx)(s.h2,{id:"getstringdata",children:"getStringData()"}),"\n",(0,a.jsxs)(s.p,{children:["Returns a Promise which resolves the attachment's data as ",(0,a.jsx)(s.code,{children:"string"}),"."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" attachment"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDocument"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".getAttachment"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'cat.jpg'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" data"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" attachment"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".getStringData"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(); "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// 'meow'"})]})]})})}),"\n",(0,a.jsx)(s.h1,{id:"attachment-compression",children:"Attachment compression"}),"\n",(0,a.jsxs)(s.p,{children:["Storing many attachments can be a problem when the disc space of the device is exceeded.\nTherefore it can make sense to compress the attachments before storing them in the ",(0,a.jsx)(s.a,{href:"/rx-storage.html",children:"RxStorage"}),".\nWith the ",(0,a.jsx)(s.code,{children:"attachments-compression"})," plugin you can compress the attachments data on write and decompress it on reads.\nThis happens internally and will now change on how you use the api. The compression is run with the ",(0,a.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/Compression_Streams_API",children:"Compression Streams API"})," which is only supported on ",(0,a.jsx)(s.a,{href:"https://caniuse.com/?search=compressionstream",children:"newer browsers"}),"."]}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" wrappedAttachmentsCompressionStorage"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/attachments-compression'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageIndexedDB } "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb-premium/plugins/storage-indexeddb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// create a wrapped storage with attachment-compression."})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" storageWithAttachmentsCompression"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" wrappedAttachmentsCompressionStorage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageIndexedDB"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storageWithAttachmentsCompression"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// set the compression mode at the schema level"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" mySchema"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // ."})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // ."})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // ."})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" attachments"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" compression"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'deflate'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- Specify the compression mode here. OneOf ['deflate', 'gzip']"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/* ... create your collections as usual and store attachments in them. */"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "})]})})})]})}function d(e={}){const{wrapper:s}={...(0,t.R)(),...e.components};return s?(0,a.jsx)(s,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},8453(e,s,n){n.d(s,{R:()=>i,x:()=>o});var r=n(6540);const a={},t=r.createContext(a);function i(e){const s=r.useContext(t);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),r.createElement(t.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/b672caf7.019a15fb.js b/docs/assets/js/b672caf7.019a15fb.js deleted file mode 100644 index e41351756eb..00000000000 --- a/docs/assets/js/b672caf7.019a15fb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[813],{8453(e,s,n){n.d(s,{R:()=>a,x:()=>l});var r=n(6540);const i={},o=r.createContext(i);function a(e){const s=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:s},e.children)}},9264(e,s,n){n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"articles/javascript-vector-database","title":"Local JavaScript Vector Database that works offline","description":"Create a blazing-fast vector database in JavaScript. Leverage RxDB and transformers.js for instant, offline semantic search - no servers required!","source":"@site/docs/articles/javascript-vector-database.md","sourceDirName":"articles","slug":"/articles/javascript-vector-database.html","permalink":"/articles/javascript-vector-database.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Local JavaScript Vector Database that works offline","slug":"javascript-vector-database.html","description":"Create a blazing-fast vector database in JavaScript. Leverage RxDB and transformers.js for instant, offline semantic search - no servers required!"},"sidebar":"tutorialSidebar","previous":{"title":"Fulltext Search \ud83d\udc51","permalink":"/fulltext-search.html"},"next":{"title":"Query Optimizer \ud83d\udc51","permalink":"/query-optimizer.html"}}');var i=n(4848),o=n(8453);const a={title:"Local JavaScript Vector Database that works offline",slug:"javascript-vector-database.html",description:"Create a blazing-fast vector database in JavaScript. Leverage RxDB and transformers.js for instant, offline semantic search - no servers required!"},l="Local Vector Database with RxDB and transformers.js in JavaScript",t={},c=[{value:"What is a Vector Database?",id:"what-is-a-vector-database",level:2},{value:"Generating Embeddings Locally in a Browser",id:"generating-embeddings-locally-in-a-browser",level:2},{value:"Storing the Embeddings in RxDB",id:"storing-the-embeddings-in-rxdb",level:2},{value:"Comparing Vectors by calculating the distance",id:"comparing-vectors-by-calculating-the-distance",level:2},{value:"Searching the Vector database with a full table scan",id:"searching-the-vector-database-with-a-full-table-scan",level:2},{value:"Indexing the Embeddings for Better Performance",id:"indexing-the-embeddings-for-better-performance",level:2},{value:"Vector Indexing Methods",id:"vector-indexing-methods",level:3},{value:"Storing indexed embeddings in RxDB",id:"storing-indexed-embeddings-in-rxdb",level:3},{value:"Searching the Vector database with utilization of the indexes",id:"searching-the-vector-database-with-utilization-of-the-indexes",level:2},{value:"Performance benchmarks",id:"performance-benchmarks",level:2},{value:"Performance of the Query Methods",id:"performance-of-the-query-methods",level:3},{value:"Performance of the Models",id:"performance-of-the-models",level:3},{value:"Potential Performance Optimizations",id:"potential-performance-optimizations",level:2},{value:"Migrating Data on Model/Index Changes",id:"migrating-data-on-modelindex-changes",level:2},{value:"Possible Future Improvements to Local-First Vector Databases",id:"possible-future-improvements-to-local-first-vector-databases",level:2},{value:"Follow Up",id:"follow-up",level:2}];function d(e){const s={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"local-vector-database-with-rxdb-and-transformersjs-in-javascript",children:"Local Vector Database with RxDB and transformers.js in JavaScript"})}),"\n",(0,i.jsxs)(s.p,{children:["The ",(0,i.jsx)(s.a,{href:"/offline-first.html",children:"local-first"})," revolution is here, changing the way we build apps! Imagine a world where your app's data lives right on the user's device, always available, even when there's no internet. That's the magic of local-first apps. Not only do they bring faster performance and limitless scalability, but they also empower users to work offline without missing a beat. And leading the charge in this space are local database solutions, like ",(0,i.jsx)(s.a,{href:"https://rxdb.info/",children:"RxDB"}),"."]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JavaScript Database",width:"220"})})}),"\n",(0,i.jsxs)(s.p,{children:["But here's where things get even more exciting: when building ",(0,i.jsx)(s.a,{href:"/articles/local-first-future.html",children:"local-first"})," apps, traditional databases often fall short. They're great at searching for exact matches, like ",(0,i.jsx)(s.code,{children:"numbers"})," or ",(0,i.jsx)(s.code,{children:"strings"}),", but what if you want to search by ",(0,i.jsx)(s.strong,{children:"meaning"}),", like sifting through emails to find a specific topic? Sure, you could use ",(0,i.jsx)(s.strong,{children:"RegExp"}),", but to truly unlock the power of semantic search and similarity-based queries, you need something more cutting-edge. Something that really understands the content of the data."]}),"\n",(0,i.jsxs)(s.p,{children:["Enter ",(0,i.jsx)(s.strong,{children:"vector databases"}),", the game-changers for searching data by meaning! They have unlocked these new possibilities for storing and querying data, especially in tasks requiring ",(0,i.jsx)(s.strong,{children:"semantic search"})," and ",(0,i.jsx)(s.strong,{children:"similarity-based"})," queries. With the help of a ",(0,i.jsx)(s.strong,{children:"machine learning model"}),", data is transformed into a vector representation that can be stored, queried and compared in a database."]}),"\n",(0,i.jsxs)(s.p,{children:["But unfortunately, most vector databases are designed for server-side use, typically running in large cloud clusters, not to run on a users device. To fix that, in this article, we will combine ",(0,i.jsx)(s.strong,{children:"RxDB"})," and ",(0,i.jsx)(s.strong,{children:"transformers.js"})," to create a local vector database running in the ",(0,i.jsx)(s.strong,{children:"browser"})," with ",(0,i.jsx)(s.strong,{children:"JavaScript"}),". It stores data in ",(0,i.jsx)(s.strong,{children:"IndexedDB"}),", and uses a machine learning model with ",(0,i.jsx)(s.strong,{children:"WebAssembly"})," locally, without the need for external servers."]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://github.com/xenova/transformers.js",children:"transformers.js"})," is a powerful framework that allows machine learning models to run directly within JavaScript using WebAssembly or WebGPU."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.a,{href:"https://rxdb.info/",children:"RxDB"})," is a NoSQL, local-first database with a flexible storage layer that can run on any JavaScript runtime, including browsers and mobile environments. (You are reading this article on the RxDB docs)."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:"A local vector database offers several key benefits:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Zero network latency"}),": Data is processed locally on the user's device, ensuring near-instant responses."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Offline functionality"}),": Data can be queried even without an internet connection."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Enhanced privacy"}),": Sensitive information remains on the device, never needing to leave for external processing."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Simple setup"}),": No backend servers are required, making deployment straightforward."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Cost savings"}),": By running everything locally, you avoid fees for API access or cloud services for large language models."]}),"\n"]}),"\n",(0,i.jsx)(s.admonition,{type:"note",children:(0,i.jsxs)(s.p,{children:["In this article only the important source code parts are shown. You can find the full open-source vector database implementation at the ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/javascript-vector-database",children:"github repository"}),"."]})}),"\n",(0,i.jsx)(s.h2,{id:"what-is-a-vector-database",children:"What is a Vector Database?"}),"\n",(0,i.jsxs)(s.p,{children:["A vector database is a specialized database optimized for storing and querying data in the form of ",(0,i.jsx)(s.strong,{children:"high-dimensional"})," vectors, often referred to as ",(0,i.jsx)(s.strong,{children:"embeddings"}),". These embeddings are numerical representations of data, such as text, images, or audio, created by machine learning models like ",(0,i.jsx)(s.a,{href:"https://huggingface.co/Xenova/all-MiniLM-L6-v2",children:"MiniLM"}),". Unlike traditional databases that work with exact matches on predefined fields, vector databases focus on ",(0,i.jsx)(s.strong,{children:"semantic similarity"}),", allowing you to query data based on meaning rather than exact values."]}),"\n",(0,i.jsxs)(s.blockquote,{children:["\n",(0,i.jsxs)(s.p,{children:["A vector, or embedding, is essentially an array of numbers, like ",(0,i.jsx)(s.code,{children:"[0.56, 0.12, -0.34, -0.90]"}),"."]}),"\n"]}),"\n",(0,i.jsx)(s.p,{children:'For example, instead of asking "Which document has the word \'database\'?", you can query "Which documents discuss similar topics to this one?" The vector database compares embeddings and returns results based on how similar the vectors are to each other.'}),"\n",(0,i.jsxs)(s.p,{children:["Vector databases handle multiple types of data beyond ",(0,i.jsx)(s.strong,{children:"text"}),", including ",(0,i.jsx)(s.strong,{children:"images"}),", ",(0,i.jsx)(s.strong,{children:"videos"}),", and ",(0,i.jsx)(s.strong,{children:"audio"})," files, all transformed into embeddings for efficient querying. Mostly you would not train a model by yourself and instead use one of the public available ",(0,i.jsx)(s.a,{href:"https://huggingface.co/models?pipeline_tag=feature-extraction&library=transformers.js",children:"transformer models"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"Vector databases are highly effective in various types of applications:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Similarity Search"}),": Finds the closest matches to a query, even when the query doesn't contain the exact terms."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Clustering"}),": Groups similar items based on the proximity of their vector representations."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Recommendations"}),": Suggests items based on shared characteristics."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Anomaly Detection"}),": Identifies outliers that differ from the norm."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Classification"}),": Assigns categories to data based on its vector's nearest neighbors."]}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["In this tutorial, we will build a vector database designed as a ",(0,i.jsx)(s.strong,{children:"Similarity Search"})," for ",(0,i.jsx)(s.strong,{children:"text"}),". For other use cases, the setup can be adapted accordingly. This flexibility is why ",(0,i.jsx)(s.a,{href:"https://rxdb.info/",children:"RxDB"})," doesn't provide a dedicated vector-database plugin, but rather offers utility functions to help you build your own vector search system."]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("img",{src:"../files/icons/transformers.js.svg",alt:"transformers.js",width:"40"})}),"\n",(0,i.jsx)(s.h2,{id:"generating-embeddings-locally-in-a-browser",children:"Generating Embeddings Locally in a Browser"}),"\n",(0,i.jsxs)(s.p,{children:["For the first step to build a local-first vector database we need to compute embeddings directly on the user's device. This is where ",(0,i.jsx)(s.a,{href:"https://github.com/xenova/transformers.js",children:"transformers.js"})," from ",(0,i.jsx)(s.a,{href:"https://huggingface.co/docs/transformers.js/index",children:"huggingface"})," comes in, allowing us to run machine learning models in the browser with ",(0,i.jsx)(s.strong,{children:"WebAssembly"}),". Below is an implementation of a ",(0,i.jsx)(s.code,{children:"getEmbeddingFromText()"})," function, which takes a piece of text and transforms it into an embedding using the ",(0,i.jsx)(s.a,{href:"https://huggingface.co/Xenova/all-MiniLM-L6-v2",children:"Xenova/all-MiniLM-L6-v2"})," model:"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"js","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"js","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { pipeline } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "@xenova/transformers"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" pipePromise"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" pipeline"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'feature-extraction'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Xenova/all-MiniLM-L6-v2'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getEmbeddingFromText"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(text) {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" pipe"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" pipePromise;"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" output"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" pipe"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(text"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" pooling"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "mean"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" normalize"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" Array"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"output"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".data);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.p,{children:"This function creates an embedding by running the text through a pre-trained model and returning it in the form of an array of numbers, which can then be stored and further processed locally."}),"\n",(0,i.jsx)(s.admonition,{type:"note",children:(0,i.jsx)(s.p,{children:"Vector embeddings from different machine learning models or versions are not compatible with each other. When you change your model, you have to recreate all embeddings for your data."})}),"\n",(0,i.jsx)(s.h2,{id:"storing-the-embeddings-in-rxdb",children:"Storing the Embeddings in RxDB"}),"\n",(0,i.jsxs)(s.p,{children:["To store the embeddings, first we have to create our ",(0,i.jsx)(s.a,{href:"/rx-database.html",children:"RxDB Database"})," with the ",(0,i.jsx)(s.a,{href:"/rx-storage-localstorage.html",children:"localstorage storage"})," that stores data in the browsers ",(0,i.jsx)(s.a,{href:"/articles/localstorage.html",children:"localstorage"}),". For more advanced projects, you can use any other ",(0,i.jsx)(s.a,{href:"/rx-storage.html",children:"RxStorage"}),"."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'mydatabase'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.p,{children:["Then we add a ",(0,i.jsx)(s.code,{children:"items"})," collection that stores our documents with the ",(0,i.jsx)(s.code,{children:"text"})," field that stores the content."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" items"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 20"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" text"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'text'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" itemsCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".items;"})]})]})})}),"\n",(0,i.jsxs)(s.p,{children:["In our ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/javascript-vector-database",children:"example repo"}),", we use the ",(0,i.jsx)(s.a,{href:"https://huggingface.co/datasets/Supabase/wikipedia-en-embeddings",children:"Wiki Embeddings"})," dataset from supabase which was transformed and used to fill up the ",(0,i.jsx)(s.code,{children:"items"})," collection with test data."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" imported"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" itemsCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".count"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" response"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" fetch"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'./files/items.json'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" items"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" response"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".json"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" insertResult"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" itemsCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".bulkInsert"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" items"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,i.jsxs)(s.p,{children:["Also we need a ",(0,i.jsx)(s.code,{children:"vector"})," collection that stores our embeddings.\nRxDB, as a NoSQL database, allows for the storage of flexible data structures, such as embeddings, within documents. To achieve this, we need to define a ",(0,i.jsx)(s.a,{href:"/rx-schema.html",children:"schema"})," that specifies how the embeddings will be stored alongside each document. The schema includes fields for an ",(0,i.jsx)(s.code,{children:"id"})," and the ",(0,i.jsx)(s.code,{children:"embedding"})," array itself."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" vector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 20"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" embedding"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'array'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" items"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'embedding'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" vectorCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".vector;"})]})]})})}),"\n",(0,i.jsx)(s.p,{children:"When storing documents in the database, we need to ensure that the embeddings for these documents are generated and stored automatically. This requires a handler that runs during every document write, calling the machine learning model to generate the embeddings and storing them in a separate vector collection."}),"\n",(0,i.jsxs)(s.p,{children:["Since our app runs in a browser, it's essential to avoid duplicate work when ",(0,i.jsx)(s.strong,{children:"multiple browser tabs"})," are open and ensure efficient use of resources. Furthermore, we want the app to resume processing documents from where it left off if it's closed or interrupted. To achieve this, RxDB provides a ",(0,i.jsx)(s.a,{href:"/rx-pipeline.html",children:"pipeline plugin"}),", which allows us to set up a workflow that processes items and stores their embeddings. In our example, a pipeline takes batches of 10 documents, generates embeddings, and stores them in a separate vector collection."]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" pipeline"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" itemsCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addPipeline"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" identifier"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-embeddings-pipeline'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" destination"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" vectorCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (docs) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" Promise"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".all"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"docs"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".map"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(doc) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" embedding"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getVectorFromText"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".text);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" vectorCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".upsert"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".primary"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" embedding"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }));"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.p,{children:["However, processing data locally presents performance challenges. Running the handler with a batch size of 10 takes around ",(0,i.jsx)(s.strong,{children:"2-4 seconds per batch"}),", meaning processing 10k documents would take up to an hour. To improve performance, we can do parallel processing using ",(0,i.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers",children:"WebWorkers"}),". A WebWorker runs on a different JavaScript process and we can start and run many of them in parallel."]}),"\n",(0,i.jsx)(s.p,{children:"Our worker listens for messages and performance the embedding generation on each request. It then sends the result embedding back to the main thread."}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// worker.js"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getVectorFromText } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" './vector.js'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"onmessage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (e) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" embedding"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getVectorFromText"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"e"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"data"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".text);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" postMessage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" e"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"data"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" embedding"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,i.jsx)(s.p,{children:"On the main thread we spawn one worker per core and send the tasks to the worker instead of processing them on the main thread."}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// create one WebWorker per core"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" workers"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Array"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"navigator"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".hardwareConcurrency)"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" .fill"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" .map"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(() "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Worker"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" URL"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"worker.js"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"meta"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".url)));"})]})]})})}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"let"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" lastWorkerId "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"let"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" lastId "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getVectorFromTextWithWorker"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(text"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" string"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Promise"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"number"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"[]> {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" let"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" worker "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" workers[lastWorkerId"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"++"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"];"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"!"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"worker) {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" lastWorkerId "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" worker "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" workers[lastWorkerId"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"++"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"];"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (lastId"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"++"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:") "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"+"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" ''"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" Promise"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"number"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"[]>(res "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" listener"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (ev"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" any"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:") "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" if"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"ev"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"data"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".id "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"==="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id) {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" res"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"ev"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"data"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".embedding);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" worker"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".removeEventListener"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'message'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" listener);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" worker"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addEventListener"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'message'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" listener);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" worker"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".postMessage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" text"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" pipeline"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" itemsCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addPipeline"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" identifier"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'my-embeddings-pipeline'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" destination"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" vectorCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" navigator"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".hardwareConcurrency"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // one per CPU core"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (docs) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" Promise"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".all"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"docs"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".map"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" i) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" embedding"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getVectorFromTextWithWorker"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".body);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.p,{children:["This setup allows us to utilize the full hardware capacity of the client's machine. By setting the batch size to match the number of logical processors available (using the ",(0,i.jsx)(s.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/Navigator/hardwareConcurrency",children:"navigator.hardwareConcurrency"})," API) and running one worker per processor, we can reduce the processing time for 10k embeddings to ",(0,i.jsx)(s.strong,{children:"about 5 minutes"})," on my developer laptop with 32 CPU cores."]}),"\n",(0,i.jsx)(s.h2,{id:"comparing-vectors-by-calculating-the-distance",children:"Comparing Vectors by calculating the distance"}),"\n",(0,i.jsxs)(s.p,{children:["Now that we have stored our embeddings in the database, the next step is to compare these vectors to each other. Various methods are available to measure the similarity or difference between two vectors, such as ",(0,i.jsx)(s.a,{href:"https://en.wikipedia.org/wiki/Euclidean_distance",children:"Euclidean distance"}),", ",(0,i.jsx)(s.a,{href:"https://www.singlestore.com/blog/distance-metrics-in-machine-learning-simplfied/",children:"Manhattan distance"}),", ",(0,i.jsx)(s.a,{href:"https://tomhazledine.com/cosine-similarity/",children:"Cosine similarity"}),", and ",(0,i.jsx)(s.strong,{children:"Jaccard similarity"})," (and more). RxDB provides utility functions for each of these methods, making it easy to choose the most suitable method for your application. In this tutorial, we will use ",(0,i.jsx)(s.strong,{children:"Euclidean distance"})," to compare vectors. However, the ideal algorithm may vary depending on your data's distribution and the specific type of query you are performing. To find the optimal method for your app, it is up to you to try out all of these and compare the results."]}),"\n",(0,i.jsx)(s.p,{children:"Each method gets two vectors as input and returns a single number. Here's how to calculate the Euclidean distance between two embeddings with the vector utilities from RxDB:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { euclideanDistance } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/vector'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" distance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" euclideanDistance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(embedding1"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" embedding2);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(distance); "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// 25.20443"})]})]})})}),"\n",(0,i.jsx)(s.p,{children:"With this we can sort multiple embeddings by how good they match our search query vector."}),"\n",(0,i.jsx)(s.h2,{id:"searching-the-vector-database-with-a-full-table-scan",children:"Searching the Vector database with a full table scan"}),"\n",(0,i.jsx)(s.p,{children:"To find out if our embeddings have been stored correctly and that our vector comparison works as should, let's run a basic query to ensure everything functions as expected. In this query, we aim to find documents similar to a given user input text. The process involves calculating the embedding from the input text, fetching all documents, calculating the distance between their embeddings and the query embedding, and then sorting them based on their similarity."}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { euclideanDistance } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/vector'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { sortByObjectNumberProperty } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" userInput"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'new york people'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" queryVector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getEmbeddingFromText"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(userInput);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" candidates"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" vectorCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" withDistance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" candidates"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".map"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(doc "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ({ "})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" distance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" euclideanDistance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(queryVector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".embedding)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}));"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" queryResult"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" withDistance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".sort"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"sortByObjectNumberProperty"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'distance'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"))"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".reverse"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"console"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(queryResult);"})]})]})})}),"\n",(0,i.jsx)(s.admonition,{type:"note",children:(0,i.jsxs)(s.p,{children:["For ",(0,i.jsx)(s.strong,{children:"distance"}),"-based comparisons, sorting should be in ascending order (smallest first), while for ",(0,i.jsx)(s.strong,{children:"similarity"}),"-based algorithms, the sorting should be in descending order (largest first)."]})}),"\n",(0,i.jsx)(s.p,{children:"If we inspect the results, we can see that the documents returned are ordered by relevance, with the most similar document at the top:"}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("img",{src:"../files/vector-database-result.png",alt:"Vector Database Result"})}),"\n",(0,i.jsx)(s.admonition,{type:"note",children:(0,i.jsxs)(s.p,{children:["This demo page can be ",(0,i.jsx)(s.a,{href:"https://pubkey.github.io/javascript-vector-database/",children:"run online here"}),"."]})}),"\n",(0,i.jsxs)(s.p,{children:["However our full-scan method presents a significant challenge: it does not scale well. As the number of stored documents increases, the time taken to fetch and compare embeddings grows proportionally. For example, retrieving embeddings from our ",(0,i.jsx)(s.a,{href:"https://huggingface.co/datasets/Supabase/wikipedia-en-embeddings",children:"test dataset"})," of 10k documents takes around ",(0,i.jsx)(s.strong,{children:"700 milliseconds"}),". If we scale up to 100k documents, this delay would rise to approximately ",(0,i.jsx)(s.strong,{children:"7 seconds"}),", making the search process inefficient for larger datasets."]}),"\n",(0,i.jsx)(s.h2,{id:"indexing-the-embeddings-for-better-performance",children:"Indexing the Embeddings for Better Performance"}),"\n",(0,i.jsxs)(s.p,{children:["To address the scalability issue, we need to store embeddings in a way that allows us to avoid fetching all of them from storage during a query. In traditional databases, you can sort documents by an ",(0,i.jsx)(s.strong,{children:"index field"}),", allowing efficient queries that retrieve only the necessary documents. An index organizes data in a structured, sortable manner, much ",(0,i.jsx)(s.strong,{children:"like a phone book"}),". However, with vector embeddings we are not dealing with simple, single values. Instead, we have large ",(0,i.jsx)(s.strong,{children:"lists of numbers"}),", which makes indexing more complex because we have more than one dimension."]}),"\n",(0,i.jsx)(s.h3,{id:"vector-indexing-methods",children:"Vector Indexing Methods"}),"\n",(0,i.jsx)(s.p,{children:"Various methods exist for indexing these vectors to improve query efficiency and performance:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"https://www.youtube.com/watch?v=Arni-zkqMBA",children:"Locality Sensitive Hashing (LSH)"}),": LSH hashes data so that similar items are likely to fall into the same bucket, optimizing approximate nearest neighbor searches in high-dimensional spaces by reducing the number of comparisons."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"https://www.youtube.com/watch?v=77QH0Y2PYKg",children:"Hierarchical Small World"}),": HSW is a graph structure designed for efficient navigation, allowing quick jumps across the graph while maintaining short paths between nodes, forming the basis for HNSW's optimization."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"https://www.youtube.com/watch?v=77QH0Y2PYKg",children:"Hierarchical Navigable Small Worlds (HNSW)"}),": HNSW builds a hierarchical graph for fast approximate nearest neighbor search. It uses multiple layers where higher layers represent fewer, more connected nodes, improving search efficiency in large datasets\u200b."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Distance to samples"}),": While testing different indexing strategies, ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey",children:"I"})," found out that using the distance to a sample set of items is a good way to index embeddings. You pick like 5 random items of your data and get the embeddings for them out of the model. These are your 5 index vectors. For each embedding stored in the vector database, we calculate the distance to our 5 index vectors and store that ",(0,i.jsx)(s.code,{children:"number"}),' as an index value. This seems to work good because similar things have similar distances to other things. For example the words "shoe" and "socks" have a similar distance to "boat" and therefore should have roughly the same index value.']}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["When building ",(0,i.jsx)(s.strong,{children:"local-first"})," applications, performance is often a challenge, especially in JavaScript. With ",(0,i.jsx)(s.strong,{children:"IndexedDB"}),", certain operations, like many sequential ",(0,i.jsx)(s.code,{children:"get by id"})," calls, ",(0,i.jsx)(s.a,{href:"/slow-indexeddb.html",children:"are slow"}),", while bulk operations, such as ",(0,i.jsx)(s.code,{children:"get by index range"}),", are fast. Therefore, it's essential to use an indexing method that allows embeddings to be stored in a sortable way, like ",(0,i.jsx)(s.strong,{children:"Locality Sensitive Hashing"})," or ",(0,i.jsx)(s.strong,{children:"Distance to Samples"}),". In this article, we'll use ",(0,i.jsx)(s.strong,{children:"Distance to Samples"}),", because for ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey",children:"me"})," it provides the best default behavior for the sample dataset."]}),"\n",(0,i.jsx)(s.h3,{id:"storing-indexed-embeddings-in-rxdb",children:"Storing indexed embeddings in RxDB"}),"\n",(0,i.jsxs)(s.p,{children:["The optimal way to store index values alongside embeddings in RxDB is to place them within the same ",(0,i.jsx)(s.a,{href:"/rx-collection.html",children:"RxCollection"}),". To ensure that the index values are both sortable and precise, we convert them into strings with a fixed length of ",(0,i.jsx)(s.code,{children:"10"})," characters. This standardization helps in managing values with many decimals and ensures proper sorting in the database."]}),"\n",(0,i.jsx)(s.p,{children:"Here's is our schema example schema where each document contains an embedding and corresponding index fields:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" indexSchema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "version"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "primaryKey"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "id"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "type"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "object"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "properties"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "id"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "type"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "string"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "maxLength"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "embedding"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "type"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "array"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "items"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "type"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "number"'})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // index fields"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "idx0"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" indexSchema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "idx1"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" indexSchema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "idx2"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" indexSchema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "idx3"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" indexSchema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "idx4"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" indexSchema"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "required"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "id"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "embedding"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "idx0"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "idx1"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "idx2"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "idx3"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "idx4"'})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ]"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "indexes"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "idx0"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "idx1"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "idx2"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "idx3"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "idx4"'})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ]"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsxs)(s.p,{children:["To populate these index fields, we modify the ",(0,i.jsx)(s.a,{href:"/rx-pipeline.html",children:"RxPipeline"})," handler accordingly to the ",(0,i.jsx)(s.strong,{children:"Distance to samples"})," method. We calculate the distance between the document's embedding and our set of ",(0,i.jsx)(s.code,{children:"5"})," index vectors. The calculated distances are converted to ",(0,i.jsx)(s.code,{children:"string"})," and stored in the appropriate index fields:"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { euclideanDistance } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/vector'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" sampleVectors"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" number"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"[][] "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"/* the index vectors */"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"];"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" pipeline"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" itemsCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addPipeline"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (docs) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" Promise"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".all"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"docs"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".map"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(doc) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" embedding"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getEmbedding"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".text);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" docData"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" doc"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".primary"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" embedding };"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // calculate the distance to all samples and store them in the index fields"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Array"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"5"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".fill"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".map"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"((_"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" idx) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" indexValue"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" euclideanDistance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(sampleVectors[idx]"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" embedding);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" docData["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'idx'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" idx] "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" indexNrToString"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(indexValue);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" vectorCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".upsert"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(docData);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }));"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.h2,{id:"searching-the-vector-database-with-utilization-of-the-indexes",children:"Searching the Vector database with utilization of the indexes"}),"\n",(0,i.jsxs)(s.p,{children:["Once our embeddings are stored in an indexed format, we can perform searches much ",(0,i.jsx)(s.strong,{children:"more efficiently"})," than through a full table scan. While this indexing method boosts performance, it comes with a tradeoff: a slight loss in precision, meaning that the result set may not always be the optimal one. However, this is generally acceptable for ",(0,i.jsx)(s.strong,{children:"similarity search"})," use cases."]}),"\n",(0,i.jsx)(s.p,{children:"There are multiple ways to leverage indexes for faster queries. Here are two effective methods:"}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Query for Index Similarity in Both Directions"}),": For each index vector, calculate the distance to the search embedding and fetch all relevant embeddings in both directions (sorted before and after) from that value."]}),"\n"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" vectorSearchIndexSimilarity"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(searchEmbedding"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" number"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"[]) {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" docsPerIndexSide"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" candidates"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Set"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"RxDocument"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" Promise"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".all"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Array"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"5"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".fill"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".map"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (_"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" i) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" distanceToIndex"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" euclideanDistance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(sampleVectors[i]"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" searchEmbedding);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"docsBefore"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" docsAfter"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"] "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" Promise"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".all"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(["})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" vectorCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'idx'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" i]"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" $lt"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" indexNrToString"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(distanceToIndex)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sort"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" [{ ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'idx'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" i]"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'desc'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }]"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" limit"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" docsPerIndexSide"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" vectorCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'idx'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" i]"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" indexNrToString"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(distanceToIndex)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sort"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" [{ ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'idx'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" i]"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'asc'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }]"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" limit"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" docsPerIndexSide"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ]);"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" docsBefore"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".map"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(d "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" candidates"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".add"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(d));"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" docsAfter"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".map"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(d "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" candidates"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".add"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(d));"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" docsWithDistance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" Array"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(candidates)"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".map"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(doc "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" distance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" euclideanDistance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"((doc "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"as"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" any"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:").embedding"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" searchEmbedding);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" distance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" doc"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" sorted"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" docsWithDistance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".sort"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"sortByObjectNumberProperty"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'distance'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"))"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".reverse"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" result"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" sorted"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".slice"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" docReads"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsxs)(s.ol,{start:"2",children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Query for an Index Range with a Defined Distance"}),": Set an ",(0,i.jsx)(s.code,{children:"indexDistance"})," and retrieve all embeddings within a specified range from the index vector to the search embedding."]}),"\n"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" vectorSearchIndexRange"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(searchEmbedding"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" number"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"[]) {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" pipeline"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".awaitIdle"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" indexDistance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0.003"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" candidates"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Set"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"RxDocument"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" let"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" docReads "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" Promise"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".all"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Array"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"5"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".fill"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".map"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (_"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" i) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" distanceToIndex"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" euclideanDistance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(sampleVectors[i]"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" searchEmbedding);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" range"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" distanceToIndex "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"*"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" indexDistance;"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" docs"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" vectorCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'idx'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" i]"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" indexNrToString"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(distanceToIndex "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"-"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" range)"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" $lt"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" indexNrToString"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(distanceToIndex "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"+"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" range)"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" sort"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" [{ ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'idx'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" i]"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'asc'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }]"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exec"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" docs"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".map"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(d "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" candidates"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".add"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(d));"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" docReads "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" docReads "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"+"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" docs"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"."}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"length"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" );"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" docsWithDistance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" Array"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(candidates)"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".map"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(doc "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" distance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" euclideanDistance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"((doc "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"as"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" any"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:").embedding"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" searchEmbedding);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" distance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" doc"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" sorted"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" docsWithDistance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".sort"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"sortByObjectNumberProperty"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'distance'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"))"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".reverse"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" result"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" sorted"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".slice"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 10"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" docReads"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" };"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,i.jsxs)(s.p,{children:["Both methods allow you to limit the number of embeddings fetched from storage while still ensuring a reasonably precise search result. However, they differ in how many embeddings are read and how precise the results are, with trade-offs between performance and accuracy. The first method has a known embedding read amount of ",(0,i.jsx)(s.code,{children:"docsPerIndexSide * 2 * [amount of indexes]"}),". The second method reads out an unknown amount of embeddings, depending on the sparsity of the dataset and the value of ",(0,i.jsx)(s.code,{children:"indexDistance"}),"."]}),"\n",(0,i.jsx)(s.p,{children:"And that's it for the implementation. We now have a local first vector database that is able to store and query vector data."}),"\n",(0,i.jsx)(s.h2,{id:"performance-benchmarks",children:"Performance benchmarks"}),"\n",(0,i.jsxs)(s.p,{children:["In server-side databases, performance can be improved by scaling hardware or adding more servers. However, ",(0,i.jsx)(s.a,{href:"/offline-first.html",children:"local-first"})," apps face the unique challenge that the hardware is determined by the end user, making performance unpredictable. Some users may have ",(0,i.jsx)(s.strong,{children:"high-end gaming PCs"}),", while others might be using ",(0,i.jsx)(s.strong,{children:"outdated smartphones in power-saving mode"}),". Therefore, when building a local-first app that processes more than a few documents, performance becomes a critical factor and should be thoroughly tested upfront."]}),"\n",(0,i.jsxs)(s.p,{children:["Let's run performance benchmarks on my ",(0,i.jsx)(s.strong,{children:"high-end gaming PC"})," to give you a sense of how long different operations take and what's achievable."]}),"\n",(0,i.jsx)(s.h3,{id:"performance-of-the-query-methods",children:"Performance of the Query Methods"}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Query Method"}),(0,i.jsx)(s.th,{children:"Time in milliseconds"}),(0,i.jsx)(s.th,{children:"Docs read from storage"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Full Scan"}),(0,i.jsx)(s.td,{children:"765"}),(0,i.jsx)(s.td,{children:"10000"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Index Similarity"}),(0,i.jsx)(s.td,{children:"1647"}),(0,i.jsx)(s.td,{children:"934"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Index Range"}),(0,i.jsx)(s.td,{children:"88"}),(0,i.jsx)(s.td,{children:"2187"})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:["As shown, the ",(0,i.jsx)(s.strong,{children:"index similarity"})," query method takes significantly longer compared to others. This is due to the need for descending sort orders in some queries ",(0,i.jsx)(s.code,{children:"sort: [{ ['idx' + i]: 'desc' }]"}),". While RxDB supports descending sorts, performance suffers because IndexedDB does not efficiently handle ",(0,i.jsx)(s.a,{href:"https://github.com/w3c/IndexedDB/issues/130",children:"reverse indexed bulk operations"}),". As a result, the ",(0,i.jsx)(s.strong,{children:"index range method"})," performs much better for this use case and should be used instead. With its query time of only ",(0,i.jsx)(s.code,{children:"88"})," milliseconds it is fast enough for all most things and likely such fast that you do not even need to show a loading spinner. Also it is faster compared to fetching the query result from a server-side vector database over the internet."]}),"\n",(0,i.jsx)(s.h3,{id:"performance-of-the-models",children:"Performance of the Models"}),"\n",(0,i.jsxs)(s.p,{children:["Let's also look at the time taken to calculate a single embedding across various models from the ",(0,i.jsx)(s.a,{href:"https://huggingface.co/models?pipeline_tag=feature-extraction&library=transformers.js",children:"huggingface transformers list"}),":"]}),"\n",(0,i.jsxs)(s.table,{children:[(0,i.jsx)(s.thead,{children:(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.th,{children:"Model Name"}),(0,i.jsx)(s.th,{children:"Time per Embedding in (ms)"}),(0,i.jsx)(s.th,{children:"Vector Size"}),(0,i.jsx)(s.th,{children:"Model Size (MB)"})]})}),(0,i.jsxs)(s.tbody,{children:[(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Xenova/all-MiniLM-L6-v2"}),(0,i.jsx)(s.td,{children:"173"}),(0,i.jsx)(s.td,{children:"384"}),(0,i.jsx)(s.td,{children:"23"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Supabase/gte-small"}),(0,i.jsx)(s.td,{children:"341"}),(0,i.jsx)(s.td,{children:"384"}),(0,i.jsx)(s.td,{children:"34"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Xenova/paraphrase-multilingual-mpnet-base-v2"}),(0,i.jsx)(s.td,{children:"1000"}),(0,i.jsx)(s.td,{children:"768"}),(0,i.jsx)(s.td,{children:"279"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"jinaai/jina-embeddings-v2-base-de"}),(0,i.jsx)(s.td,{children:"1291"}),(0,i.jsx)(s.td,{children:"768"}),(0,i.jsx)(s.td,{children:"162"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"jinaai/jina-embeddings-v2-base-zh"}),(0,i.jsx)(s.td,{children:"1437"}),(0,i.jsx)(s.td,{children:"768"}),(0,i.jsx)(s.td,{children:"162"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"jinaai/jina-embeddings-v2-base-code"}),(0,i.jsx)(s.td,{children:"1769"}),(0,i.jsx)(s.td,{children:"768"}),(0,i.jsx)(s.td,{children:"162"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"mixedbread-ai/mxbai-embed-large-v1"}),(0,i.jsx)(s.td,{children:"3359"}),(0,i.jsx)(s.td,{children:"1024"}),(0,i.jsx)(s.td,{children:"337"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"WhereIsAI/UAE-Large-V1"}),(0,i.jsx)(s.td,{children:"3499"}),(0,i.jsx)(s.td,{children:"1024"}),(0,i.jsx)(s.td,{children:"337"})]}),(0,i.jsxs)(s.tr,{children:[(0,i.jsx)(s.td,{children:"Xenova/multilingual-e5-large"}),(0,i.jsx)(s.td,{children:"4215"}),(0,i.jsx)(s.td,{children:"1024"}),(0,i.jsx)(s.td,{children:"562"})]})]})]}),"\n",(0,i.jsxs)(s.p,{children:["From these benchmarks, it's evident that models with larger vector outputs ",(0,i.jsx)(s.strong,{children:"take longer to process"}),". Additionally, the model size significantly affects performance, with larger models requiring more time to compute embeddings. This trade-off between model complexity and performance must be considered when choosing the right model for your use case."]}),"\n",(0,i.jsx)(s.h2,{id:"potential-performance-optimizations",children:"Potential Performance Optimizations"}),"\n",(0,i.jsx)(s.p,{children:"There are multiple other techniques to improve the performance of your local vector database:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Shorten embeddings"}),': The storing and retrieval of embeddings can be improved by "shortening" the embedding. To do that, you just strip away numbers from your vector. For example ',(0,i.jsx)(s.code,{children:"[0.56, 0.12, -0.34, 0.78, -0.90]"})," becomes ",(0,i.jsx)(s.code,{children:"[0.56, 0.12]"}),'. That\'s it, you now have a smaller embedding that is faster to read out of the storage and calculating distances is faster because it has to process less numbers. The downside is that you loose precision in your search results. Sometimes shortening the embeddings makes more sense as a pre-query step where you first compare the shortened vectors and later fetch the "real" vectors for the 10 most matching documents to improve their sort order.']}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Optimize the variables in our Setup"}),": In this examples we picked our variables in a non-optimal way. You can get huge performance improvements by setting different values:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsx)(s.li,{children:"We picked 5 indexes for the embeddings. Using less indexes improves your query performance with the cost of less good results."}),"\n",(0,i.jsxs)(s.li,{children:["For queries that search by fetching a specific embedding distance we used the ",(0,i.jsx)(s.code,{children:"indexDistance"})," value of ",(0,i.jsx)(s.code,{children:"0.003"}),". Using a lower value means we read less document from the storage. This is faster but reduces the precision of the results which means we will get a less optimal result compared to a full table scan."]}),"\n",(0,i.jsxs)(s.li,{children:["For queries that search by fetching a given amount of documents per index side, we set the value ",(0,i.jsx)(s.code,{children:"docsPerIndexSide"})," to ",(0,i.jsx)(s.code,{children:"100"}),". Increasing this value means you fetch more data from the storage but also get a better precision in the search results. Decreasing it can improve query performance with worse precision."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Use faster models"}),": There are many ways to improve performance of machine learning models. If your embedding calculation is too slow, try other models. ",(0,i.jsx)(s.strong,{children:"Smaller"})," mostly means ",(0,i.jsx)(s.strong,{children:"faster"}),". The model ",(0,i.jsx)(s.code,{children:"Xenova/all-MiniLM-L6-v2"})," which is used in this tutorial is about ",(0,i.jsx)(s.a,{href:"https://huggingface.co/Xenova/all-MiniLM-L6-v2/tree/main",children:"1 year old"}),". There exist better, more modern models to use. Huggingface makes these convenient to use. You only have to switch out the model name with any other model from ",(0,i.jsx)(s.a,{href:"https://huggingface.co/models?pipeline_tag=feature-extraction&library=transformers.js",children:"that site"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Narrow down the search space"}),': By utilizing other "normal" filter operators to your query, you can narrow down the search space and optimize performance. For example in an email search you could additionally use a operator that limits the results to all emails that are not older than one year.']}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Dimensionality Reduction"})," with an ",(0,i.jsx)(s.a,{href:"https://www.youtube.com/watch?v=D16rii8Azuw",children:"autoencoder"}),": An autoencoder encodes vector data with minimal loss which can improve the performance by having to store and compare less numbers in an embedding."]}),"\n"]}),"\n",(0,i.jsxs)(s.li,{children:["\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"Different RxDB Plugins"}),": RxDB has different storages and plugins that can improve the performance like the ",(0,i.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB RxStorage"}),", the ",(0,i.jsx)(s.a,{href:"/rx-storage-opfs.html",children:"OPFS RxStorage"}),", the ",(0,i.jsx)(s.a,{href:"/rx-storage-sharding.html",children:"sharding"})," plugin and the ",(0,i.jsx)(s.a,{href:"/rx-storage-worker.html",children:"Worker"})," and ",(0,i.jsx)(s.a,{href:"/rx-storage-shared-worker.html",children:"SharedWorker"})," storages."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JavaScript Database",width:"220"})})}),"\n",(0,i.jsx)(s.h2,{id:"migrating-data-on-modelindex-changes",children:"Migrating Data on Model/Index Changes"}),"\n",(0,i.jsxs)(s.p,{children:["When you change the index parameter or even update the whole model which was used to create the embeddings, you have to migrate the data that is already stored on your users devices. RxDB offers the ",(0,i.jsx)(s.a,{href:"/migration-schema.html",children:"Schema Migration Plugin"})," for that."]}),"\n",(0,i.jsxs)(s.p,{children:["When the app is reloaded and the updated source code is started, RxDB detects changes in your ",(0,i.jsx)(s.a,{href:"/rx-schema.html#version",children:"schema version"})," and runs the ",(0,i.jsx)(s.a,{href:"/migration-schema.html#providing-strategies",children:"migration strategy"})," accordingly. So to update the stored data, increase the schema version and define a handler:"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" schemaV1"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "version"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 1"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- increase schema version by 1"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "primaryKey"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "id"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "properties"'}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" /* ... */"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"};"})})]})})}),"\n",(0,i.jsx)(s.p,{children:"In the migration handler we recreate the new embeddings and index values."}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" myDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" vectors"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schemaV1"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" migrationStrategies"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 1"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(docData){"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" embedding"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getEmbedding"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"docData"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".body);"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" new"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" Array"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"5"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".fill"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".map"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"((_"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" idx) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" docData["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'idx'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" +"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" idx] "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" euclideanDistance"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(mySampleVectors[idx]"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" embedding);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" docData;"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.h2,{id:"possible-future-improvements-to-local-first-vector-databases",children:"Possible Future Improvements to Local-First Vector Databases"}),"\n",(0,i.jsx)(s.p,{children:"For now our vector database works and we are good to go. However there are some things to consider for the future:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"WebGPU"})," is ",(0,i.jsx)(s.a,{href:"https://caniuse.com/webgpu",children:"not fully supported"})," yet. When this changes, creating embeddings in the browser have the potential to become faster. You can check if your current chrome supports WebGPU by opening ",(0,i.jsx)(s.code,{children:"chrome://gpu/"}),". Notice that WebGPU has been reported to sometimes be ",(0,i.jsx)(s.a,{href:"https://github.com/xenova/transformers.js/issues/894#issuecomment-2323897485",children:"even slower"})," compared to WASM but likely it will be faster in the long term."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Cross-Modal AI Models"}),": While progress is being made, AI models that can understand and integrate multiple modalities are still in development. For example you could query for an ",(0,i.jsx)(s.strong,{children:"image"})," together with a ",(0,i.jsx)(s.strong,{children:"text"})," prompt to get a more detailed output."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Multi-Step queries"}),": In this article we only talked about having a single query as input and an ordered list of outputs. But there is big potential in chaining models or queries together where you take the results of one query and input them into a different model with different embeddings or outputs."]}),"\n"]}),"\n",(0,i.jsx)(s.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Shared/Like my ",(0,i.jsx)(s.a,{href:"https://x.com/rxdbjs/status/1833429569434427494",children:"announcement tweet"})]}),"\n",(0,i.jsxs)(s.li,{children:["Read the source code that belongs to this article ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/javascript-vector-database",children:"at github"})]}),"\n",(0,i.jsxs)(s.li,{children:["Learn how to use RxDB with the ",(0,i.jsx)(s.a,{href:"/quickstart.html",children:"RxDB Quickstart"})]}),"\n",(0,i.jsxs)(s.li,{children:["Check out the ",(0,i.jsx)(s.a,{href:"https://github.com/pubkey/rxdb",children:"RxDB github repo"})," and leave a star \u2b50"]}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/docs/assets/js/b8c49ce4.3962d1bb.js b/docs/assets/js/b8c49ce4.3962d1bb.js deleted file mode 100644 index a0677b3c4a7..00000000000 --- a/docs/assets/js/b8c49ce4.3962d1bb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[6355],{4971(e,n,t){t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>i,toc:()=>h});const i=JSON.parse('{"id":"releases/13.0.0","title":"RxDB 13.0.0 - A New Era of Replication","description":"Discover RxDB 13.0\'s brand-new replication protocol, faster performance, and real-time collaboration for a seamless offline-first experience.","source":"@site/docs/releases/13.0.0.md","sourceDirName":"releases","slug":"/releases/13.0.0.html","permalink":"/releases/13.0.0.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB 13.0.0 - A New Era of Replication","slug":"13.0.0.html","description":"Discover RxDB 13.0\'s brand-new replication protocol, faster performance, and real-time collaboration for a seamless offline-first experience."},"sidebar":"tutorialSidebar","previous":{"title":"14.0.0","permalink":"/releases/14.0.0.html"},"next":{"title":"12.0.0","permalink":"/releases/12.0.0.html"}}');var s=t(4848),r=t(8453);const o={title:"RxDB 13.0.0 - A New Era of Replication",slug:"13.0.0.html",description:"Discover RxDB 13.0's brand-new replication protocol, faster performance, and real-time collaboration for a seamless offline-first experience."},a="13.0.0",l={},h=[{value:"Other breaking changes",id:"other-breaking-changes",level:2},{value:"Other non breaking or internal changes",id:"other-non-breaking-or-internal-changes",level:2},{value:"New Features",id:"new-features",level:2},{value:"Migration to the new version",id:"migration-to-the-new-version",level:2}];function c(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",header:"header",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"1300",children:"13.0.0"})}),"\n",(0,s.jsxs)(n.p,{children:["So in the last major RxDB versions, the focus was set to ",(0,s.jsx)(n.strong,{children:"improvements of the storage engine"}),". This is done. RxDB has now ",(0,s.jsx)(n.a,{href:"/rx-storage.html",children:"multiple RxStorage implementations"}),", a better query planner and an improved test suite to ensure everything works correct.\nThis let to huge improvements in write and query performance and decreased the initial pageload of RxDB based applications."]}),"\n",(0,s.jsxs)(n.p,{children:["In the new major version ",(0,s.jsx)(n.code,{children:"13.0.0"}),", the focus was set to improvements to the ",(0,s.jsx)(n.strong,{children:"replication protocol"}),".\nWhen I first implemented the GraphQL replication a few years ago, I had a specific use case in mind and designed the whole protocol and replication plugins around that use case."]}),"\n",(0,s.jsx)(n.p,{children:"But the time has shown, that the old replication protocol is a big downside of RxDB:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["The replication relied on the backend to solve all ",(0,s.jsx)(n.strong,{children:"conflicts"}),". This was easy to implement into RxDB because the whole \tresponsibility was given away to the person that has to implement a compatible backend."]}),"\n",(0,s.jsxs)(n.li,{children:["In each point in time, the replication did either push or pull documents, but ",(0,s.jsx)(n.strong,{children:"never in parallel"}),". This slows done the whole replication process and makes RxDB not usable for the implementation of features like ",(0,s.jsx)(n.strong,{children:"multi-user-real-time-collaboration"})," or when many read- and write operations have to happen in a short timespan."]}),"\n",(0,s.jsxs)(n.li,{children:["After each ",(0,s.jsx)(n.code,{children:"push"}),", a ",(0,s.jsx)(n.code,{children:"pull"})," had to be run to check if the backend had changed the state to solve a conflict."]}),"\n",(0,s.jsx)(n.li,{children:"The replication protocol did not support attachments and was not designed to ever support them."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["So in version ",(0,s.jsx)(n.code,{children:"13.0.0"})," I replaced the whole replication plugins with a new replication protocol. The main goals have been:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Push- and Pull in parallel."}),"\n",(0,s.jsx)(n.li,{children:"Use the data in the changestream (optional) to decrease replication latency."}),"\n",(0,s.jsxs)(n.li,{children:["Implement the conflict resolution into RxDB so that the ",(0,s.jsx)(n.strong,{children:"client resolves its own conflicts"})," and does not rely on the backend."]}),"\n",(0,s.jsxs)(n.li,{children:["Decrease the complexity for a compatible backend implementation. The new protocol relies on a ",(0,s.jsx)(n.em,{children:"dumb"})," backend. This will open compatibility with many other use cases like implementing ",(0,s.jsx)(n.a,{href:"https://github.com/supabase/supabase/discussions/357",children:"Offline-First in Supabase"})," or using CouchDB but having a faster replication compared to the native CouchDB replication."]}),"\n",(0,s.jsxs)(n.li,{children:["Make it possible to use ",(0,s.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type",children:"CRDTs"})," instead of a conflict resolution."]}),"\n",(0,s.jsx)(n.li,{children:"Design a the protocol in a way to make it possible to add attachments replication in the future."}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"On the RxDocument level, the replication works like git, where the fork/client contains all new writes and must be merged with the master/server before it can push its new state to the master/server."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"A---B1---C1---X master/server state\n \\ /\n B1---C2 fork/client state\n"})}),"\n",(0,s.jsxs)(n.p,{children:["For more details, read the ",(0,s.jsx)(n.a,{href:"/replication.html",children:"documentation about the new RxDB Sync Engine"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Backends that have been compatible with the previous RxDB versions ",(0,s.jsx)(n.code,{children:"12"})," and older, will not work with the new replication protocol. To learn how to do that, either read the ",(0,s.jsx)(n.a,{href:"/replication.html",children:"docs"})," or check out the ",(0,s.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/graphql",children:"GraphQL example"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"other-breaking-changes",children:"Other breaking changes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["RENAMED the ",(0,s.jsx)(n.code,{children:"ajv-validate"})," plugin to ",(0,s.jsx)(n.code,{children:"validate-ajv"})," to be in equal with the other validation plugins."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"is-my-json-valid"})," validation is no longer supported until ",(0,s.jsx)(n.a,{href:"https://github.com/mafintosh/is-my-json-valid/pull/192",children:"this bug"})," is fixed."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["REFACTORED the ",(0,s.jsx)(n.a,{href:"https://rxdb.info/schema-validation.html",children:"schema validation plugins"}),", they are no longer plugins but now they get wrapped around any other RxStorage."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["It allows us to run the validation inside of a ",(0,s.jsx)(n.a,{href:"/rx-storage-worker.html",children:"Worker RxStorage"})," instead of running it in the main JavaScript process."]}),"\n",(0,s.jsxs)(n.li,{children:["It allows us to configure which ",(0,s.jsx)(n.code,{children:"RxDatabase"})," instance must use the validation and which does not. In production it often makes sense to validate user data, but you might not need the validation for data that is only replicated from the backend."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["REFACTORED the ",(0,s.jsx)(n.a,{href:"/key-compression.html",children:"key compression plugin"}),", it is no longer a plugin but now a wrapper around any other RxStorage."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["It allows to run the key-compression inside of a ",(0,s.jsx)(n.a,{href:"/rx-storage-worker.html",children:"Worker RxStorage"})," instead of running it in the main JavaScript process."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"REFACTORED the encryption plugin, it is no longer a plugin but now a wrapper around any other RxStorage."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["It allows to run the encryption inside of a ",(0,s.jsx)(n.a,{href:"/rx-storage-worker.html",children:"Worker RxStorage"})," instead of running it in the main JavaScript process."]}),"\n",(0,s.jsxs)(n.li,{children:["It allows do use asynchronous crypto function like ",(0,s.jsx)(n.a,{href:"https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API",children:"WebCrypto"})]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Store the password hash in the same write request as the database token to improve performance."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["REMOVED support for temporary documents ",(0,s.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/pull/3777#issuecomment-1120669088",children:"see here"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["REMOVED RxDatabase.broadcastChannel The broadcast channel has been moved out of the RxDatabase and is part of the RxStorage. So it is no longer exposed via ",(0,s.jsx)(n.code,{children:"RxDatabase.broadcastChannel"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Removed the ",(0,s.jsx)(n.code,{children:"liveInterval"})," option of the replication plugins. It was an edge case feature with wrong defaults. If you want to run the pull replication on interval, you can send a ",(0,s.jsx)(n.code,{children:"RESYNC"})," event manually in a loop."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["REPLACED ",(0,s.jsx)(n.code,{children:"RxReplicationPullError"})," and ",(0,s.jsx)(n.code,{children:"RxReplicationPushError"})," with normal ",(0,s.jsx)(n.code,{children:"RxError"})," like in the rest of the RxDB code."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["REMOVED the option to filter out replication documents with the push/pull modifiers ",(0,s.jsx)(n.a,{href:"https://github.com/pubkey/rxdb/issues/2552",children:"#2552"})," because this does not work with the new replication protocol."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["CHANGE default of replication ",(0,s.jsx)(n.code,{children:"live"})," to be set to ",(0,s.jsx)(n.code,{children:"true"}),". Because most people want to do a live replication, not a one time replication."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["RENAMED the ",(0,s.jsx)(n.code,{children:"server"})," plugin is now called ",(0,s.jsx)(n.code,{children:"server-couchdb"})," and ",(0,s.jsx)(n.code,{children:"RxDatabase.server()"})," is now ",(0,s.jsx)(n.code,{children:"RxDatabase.serverCouchDB()"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["CHANGED Attachment data is now always handled as ",(0,s.jsx)(n.code,{children:"Blob"})," because Node.js does support ",(0,s.jsx)(n.code,{children:"Blob"})," since version 18.0.0 so we no longer have to use a ",(0,s.jsx)(n.code,{children:"Buffer"})," but instead can use Blob for browsers and Node.js"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["REFACTORED the layout of ",(0,s.jsx)(n.code,{children:"RxChangeEvent"})," to better match the RxDB requirements and to fix the 'deleted-document-is-modified-but-still-deleted' bug."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["When used with Node.js, RxDB now requires Node.js version ",(0,s.jsx)(n.code,{children:"18.0.0"})," or higher."]}),"\n",(0,s.jsx)(n.h2,{id:"other-non-breaking-or-internal-changes",children:"Other non breaking or internal changes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"REMOVED many unused plugin hooks because they decreased the performance."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["REMOVE RxStorageStatics ",(0,s.jsx)(n.code,{children:".hash"})," and ",(0,s.jsx)(n.code,{children:".hashKey"})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["CHANGE removed default usage of ",(0,s.jsx)(n.code,{children:"md5"})," as default hashing. Use a faster non-cryptographic hash instead."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["ADD option to pass a custom hash function when calling ",(0,s.jsx)(n.code,{children:"createRxDatabase"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["CHANGE use ",(0,s.jsx)(n.code,{children:"Float"})," instead of ",(0,s.jsx)(n.code,{children:"Int"})," to represent timestamps in GraphQL."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["FIXED multiple problems with encoding attachments data. We now use the ",(0,s.jsx)(n.code,{children:"js-base64"})," library which properly handles utf-8/binary/ascii transformations."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["In the RxDB internal ",(0,s.jsx)(n.code,{children:"_meta.lwt"})," field, we now use 2 decimals number of the unix timestamp in milliseconds."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["ADDED ",(0,s.jsx)(n.code,{children:"checkpointSchema"})," to the ",(0,s.jsx)(n.code,{children:"RxStorage.statics"})," interface."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"new-features",children:"New Features"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["ADDED the ",(0,s.jsx)(n.a,{href:"/replication-websocket.html",children:"websocket replication plugin"})]}),"\n",(0,s.jsxs)(n.li,{children:["ADDED the ",(0,s.jsx)(n.a,{href:"/rx-storage-foundationdb.html",children:"FoundationDB RxStorage"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"migration-to-the-new-version",children:"Migration to the new version"}),"\n",(0,s.jsxs)(n.p,{children:["Stored data of the previous RxDB versions is not compatible with RxDB ",(0,s.jsx)(n.code,{children:"13.0.0"}),". So if you want to keep that data, you have to migrate it in a way. For most use cases you might want to just drop the data from the client and re-sync it again from the backend. To keep the data locally, you might want to use the ",(0,s.jsx)(n.a,{href:"/migration-storage.html",children:"storage migration plugin"}),"."]})]})}function d(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},8453(e,n,t){t.d(n,{R:()=>o,x:()=>a});var i=t(6540);const s={},r=i.createContext(s);function o(e){const n=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/badcd764.922f3eee.js b/docs/assets/js/badcd764.922f3eee.js deleted file mode 100644 index ef9f22aa79d..00000000000 --- a/docs/assets/js/badcd764.922f3eee.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[8318],{3922(e,s,n){n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>t,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"articles/flutter-database","title":"Supercharge Flutter Apps with the RxDB Database","description":"Harness RxDB\'s reactive database to bring real-time, offline-first data storage and syncing to your next Flutter application.","source":"@site/docs/articles/flutter-database.md","sourceDirName":"articles","slug":"/articles/flutter-database.html","permalink":"/articles/flutter-database.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Supercharge Flutter Apps with the RxDB Database","slug":"flutter-database.html","description":"Harness RxDB\'s reactive database to bring real-time, offline-first data storage and syncing to your next Flutter application."},"sidebar":"tutorialSidebar","previous":{"title":"Embedded Database, Real-time Speed - RxDB","permalink":"/articles/embedded-database.html"},"next":{"title":"RxDB - The Ultimate JS Frontend Database","permalink":"/articles/frontend-database.html"}}');var a=n(4848),i=n(8453);const t={title:"Supercharge Flutter Apps with the RxDB Database",slug:"flutter-database.html",description:"Harness RxDB's reactive database to bring real-time, offline-first data storage and syncing to your next Flutter application."},o="RxDB as a Database in a Flutter Application",l={},c=[{value:"Overview of Flutter Mobile Applications",id:"overview-of-flutter-mobile-applications",level:3},{value:"Importance of Databases in Flutter Applications",id:"importance-of-databases-in-flutter-applications",level:3},{value:"Introducing RxDB as a Database Solution",id:"introducing-rxdb-as-a-database-solution",level:3},{value:"Getting Started with RxDB",id:"getting-started-with-rxdb",level:2},{value:"What is RxDB?",id:"what-is-rxdb",level:3},{value:"Reactive Data Handling",id:"reactive-data-handling",level:3},{value:"Offline-First Approach",id:"offline-first-approach",level:3},{value:"Data Replication",id:"data-replication",level:3},{value:"Observable Queries",id:"observable-queries",level:3},{value:"RxDB vs. Other Flutter Database Options",id:"rxdb-vs-other-flutter-database-options",level:3},{value:"Using RxDB in a Flutter Application",id:"using-rxdb-in-a-flutter-application",level:2},{value:"How RxDB can run in Flutter",id:"how-rxdb-can-run-in-flutter",level:2},{value:"Different RxStorage layers for RxDB",id:"different-rxstorage-layers-for-rxdb",level:3},{value:"Synchronizing Data with RxDB between Clients and Servers",id:"synchronizing-data-with-rxdb-between-clients-and-servers",level:2},{value:"Offline-First Approach",id:"offline-first-approach-1",level:3},{value:"RxDB Replication Plugins",id:"rxdb-replication-plugins",level:3},{value:"Advanced RxDB Features and Techniques",id:"advanced-rxdb-features-and-techniques",level:2},{value:"Indexing and Performance Optimization",id:"indexing-and-performance-optimization",level:3},{value:"Encryption of Local Data",id:"encryption-of-local-data",level:3},{value:"Change Streams and Event Handling",id:"change-streams-and-event-handling",level:3},{value:"JSON Key Compression",id:"json-key-compression",level:3},{value:"Conclusion",id:"conclusion",level:2}];function d(e){const s={a:"a",admonition:"admonition",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",ul:"ul",...(0,i.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(s.header,{children:(0,a.jsx)(s.h1,{id:"rxdb-as-a-database-in-a-flutter-application",children:"RxDB as a Database in a Flutter Application"})}),"\n",(0,a.jsxs)(s.p,{children:["In the world of mobile application development, Flutter has gained significant popularity due to its cross-platform capabilities and rich UI framework. When it comes to building feature-rich Flutter applications, the choice of a robust and efficient database is crucial. In this article, we will explore ",(0,a.jsx)(s.a,{href:"https://rxdb.info/",children:"RxDB"})," as a database solution for Flutter applications. We'll delve into the core features of RxDB, its benefits over other database options, and how to integrate it into a Flutter app."]}),"\n",(0,a.jsx)(s.admonition,{type:"note",children:(0,a.jsxs)(s.p,{children:["You can find the source code for an example RxDB Flutter Application ",(0,a.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/flutter",children:"at the github repo"})]})}),"\n",(0,a.jsx)("center",{children:(0,a.jsx)("a",{href:"https://rxdb.info/",children:(0,a.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"RxDB Flutter Database",width:"220"})})}),"\n",(0,a.jsx)(s.h3,{id:"overview-of-flutter-mobile-applications",children:"Overview of Flutter Mobile Applications"}),"\n",(0,a.jsxs)(s.p,{children:["Flutter is an open-source UI software development kit created by Google that allows developers to build high-performance ",(0,a.jsx)(s.a,{href:"/articles/mobile-database.html",children:"mobile"})," applications for iOS and Android platforms using a single codebase. Flutter's framework provides a wide range of widgets and tools that enable developers to create visually appealing and responsive applications."]}),"\n",(0,a.jsx)("center",{children:(0,a.jsx)("img",{src:"../files/icons/flutter.svg",alt:"Flutter",width:"60"})}),"\n",(0,a.jsx)(s.h3,{id:"importance-of-databases-in-flutter-applications",children:"Importance of Databases in Flutter Applications"}),"\n",(0,a.jsx)(s.p,{children:"Databases play a vital role in Flutter applications by providing a persistent and reliable storage solution for storing and retrieving data. Whether it's user profiles, app settings, or complex data structures, a database helps in efficiently managing and organizing the application's data. Choosing the right database for a Flutter application can significantly impact the performance, scalability, and user experience of the app."}),"\n",(0,a.jsx)(s.h3,{id:"introducing-rxdb-as-a-database-solution",children:"Introducing RxDB as a Database Solution"}),"\n",(0,a.jsx)(s.p,{children:"RxDB is a powerful NoSQL database solution that is designed to work seamlessly with JavaScript-based frameworks, such as Flutter. It stands for Reactive Database and offers a variety of features that make it an excellent choice for building Flutter applications. RxDB combines the simplicity of JavaScript's document-based database model with the reactive programming paradigm, enabling developers to build real-time and offline-first applications with ease."}),"\n",(0,a.jsx)(s.h2,{id:"getting-started-with-rxdb",children:"Getting Started with RxDB"}),"\n",(0,a.jsx)(s.p,{children:"To understand how RxDB can be utilized in a Flutter application, let's explore its core features and advantages."}),"\n",(0,a.jsx)(s.h3,{id:"what-is-rxdb",children:"What is RxDB?"}),"\n",(0,a.jsxs)(s.p,{children:[(0,a.jsx)(s.a,{href:"https://rxdb.info/",children:"RxDB"})," is a client-side database built on top of ",(0,a.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB"}),", which is a low-level ",(0,a.jsx)(s.a,{href:"/articles/browser-database.html",children:"browser-based database"})," API. It provides a simple and intuitive API for performing CRUD operations (Create, Read, Update, Delete) on documents. RxDB's underlying architecture allows for efficient handling of data synchronization between multiple clients and servers."]}),"\n",(0,a.jsx)("center",{children:(0,a.jsx)("a",{href:"https://rxdb.info/",children:(0,a.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"RxDB Flutter Database",width:"220"})})}),"\n",(0,a.jsx)(s.h3,{id:"reactive-data-handling",children:"Reactive Data Handling"}),"\n",(0,a.jsx)(s.p,{children:"One of the key strengths of RxDB is its reactive data handling. It leverages the power of Observables, a concept from reactive programming, to automatically update the UI in response to data changes. With RxDB, developers can define queries and subscribe to their results, ensuring that the UI is always in sync with the database."}),"\n",(0,a.jsx)(s.h3,{id:"offline-first-approach",children:"Offline-First Approach"}),"\n",(0,a.jsx)(s.p,{children:"RxDB follows an offline-first approach, making it ideal for building Flutter applications that need to function even without an internet connection. It allows data to be stored locally and seamlessly synchronizes it with the server when a connection is available. This ensures that users can access and interact with their data regardless of network availability."}),"\n",(0,a.jsx)(s.h3,{id:"data-replication",children:"Data Replication"}),"\n",(0,a.jsx)(s.p,{children:"Data replication is a critical aspect of building distributed applications. RxDB provides robust replication capabilities that enable synchronization of data between different clients and servers. With its replication plugins, RxDB simplifies the process of setting up real-time data synchronization, ensuring consistency across all connected devices."}),"\n",(0,a.jsx)(s.h3,{id:"observable-queries",children:"Observable Queries"}),"\n",(0,a.jsx)(s.p,{children:"RxDB introduces the concept of observable queries, which are queries that automatically update when the underlying data changes. This feature is particularly useful for keeping the UI up to date with the latest data. By subscribing to an observable query, developers can receive real-time updates and reflect them in the user interface without manual intervention."}),"\n",(0,a.jsx)(s.h3,{id:"rxdb-vs-other-flutter-database-options",children:"RxDB vs. Other Flutter Database Options"}),"\n",(0,a.jsx)(s.p,{children:"When considering database options for Flutter applications, developers often come across alternatives such as SQLite or LokiJS. While these databases have their merits, RxDB offers several advantages over them. RxDB's seamless integration with Flutter, its offline-first approach, reactive data handling, and built-in data replication make it a compelling choice for building feature-rich and scalable Flutter applications."}),"\n",(0,a.jsx)(s.h2,{id:"using-rxdb-in-a-flutter-application",children:"Using RxDB in a Flutter Application"}),"\n",(0,a.jsx)(s.p,{children:"Now that we understand the core features of RxDB, let's explore how to integrate it into a Flutter application."}),"\n",(0,a.jsx)(s.h2,{id:"how-rxdb-can-run-in-flutter",children:"How RxDB can run in Flutter"}),"\n",(0,a.jsxs)(s.p,{children:["RxDB is written in TypeScript and compiled to JavaScript. To run it in a Flutter application, the ",(0,a.jsx)(s.code,{children:"flutter_qjs"})," library is used to spawn a QuickJS JavaScript runtime. RxDB itself runs in that runtime and communicates with the flutter dart runtime. To store data persistent, the ",(0,a.jsx)(s.a,{href:"/rx-storage-lokijs.html",children:"LokiJS RxStorage"})," is used together with a custom storage adapter that persists the database inside of the ",(0,a.jsx)(s.code,{children:"shared_preferences"})," data."]}),"\n",(0,a.jsx)(s.p,{children:"To use RxDB, you have to create a compatible JavaScript file that creates your RxDatabase and starts some connectors which are used by Flutter to communicate with the JavaScript RxDB database via setFlutterRxDatabaseConnector()."}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" createRxDatabase"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getRxStorageLoki"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-lokijs'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" setFlutterRxDatabaseConnector"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" getLokijsAdapterFlutter"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/flutter'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// do all database creation stuff in this method."})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createDB"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(databaseName) {"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // create the RxDatabase"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // the database.name is variable so we can change it on the flutter side"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" databaseName"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLoki"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" adapter"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getLokijsAdapterFlutter"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" })"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" multiInstance"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" false"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" heroes"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" color"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 30"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" indexes"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'name'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'id'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'name'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'color'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" db;"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// start the connector so that flutter can communicate with the JavaScript process"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"setFlutterRxDatabaseConnector"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" createDB"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})})]})})}),"\n",(0,a.jsxs)(s.p,{children:["Before you can use the JavaScript code, you have to bundle it into a single .js file. In this example we do that with webpack in a npm script here which bundles everything into the ",(0,a.jsx)(s.code,{children:"javascript/dist/index.js"})," file."]}),"\n",(0,a.jsx)(s.p,{children:"To allow Flutter to access that file during runtime, add it to the assets inside of your pubspec.yaml:"}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"yaml","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"yaml","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"flutter"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" assets"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" - "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"javascript/dist/index.js"})]})]})})}),"\n",(0,a.jsx)(s.p,{children:"Also you need to install RxDB in your flutter part of the application. First you have to use the rxdb dart package as a flutter dependency. Currently the package is not published at the dart pub.dev. Instead you have to install it from the local filesystem inside of your RxDB npm installation."}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"yaml","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"yaml","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"# inside of pubspec.yaml"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"dependencies"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" rxdb"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" path"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" path/to/your/node_modules/rxdb/src/plugins/flutter/dart"})]})]})})}),"\n",(0,a.jsx)(s.p,{children:"Afterwards you can import the rxdb library in your dart code and connect to the JavaScript process from there. For reference, check out the lib/main.dart file."}),"\n",(0,a.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,a.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"dart","data-theme":"css-variables",children:(0,a.jsxs)(s.code,{"data-language":"dart","data-theme":"css-variables",style:{display:"grid"},children:[(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'package:rxdb/rxdb.dart'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// start the javascript process and connect to the database"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"RxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" database "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxDatabase"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"javascript/dist/index.js"'}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:", databaseName);"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// get a collection"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"RxCollection"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" database."}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"getCollection"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'heroes'"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// insert a document"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"RxDocument"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" document "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection."}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"insert"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "id"'}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "zflutter-'}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"${"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"DateTime"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"."}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"now"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"()}"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"'}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:","})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "name"'}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" nameController.text,"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:' "color"'}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" colorController.text"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// create a query"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"RxQuery"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"RxHeroDocType"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"> query "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" RxDatabaseState"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".collection."}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"find"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"();"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// create list to store query results"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"List"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"RxDocument"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"<"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"RxHeroDocType"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:">> documents "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" [];"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// subscribe to a query"})}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"query.$()."}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"listen"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"((results) {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" setState"}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(() {"})]}),"\n",(0,a.jsxs)(s.span,{"data-line":"",children:[(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" documents "}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" results;"})]}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,a.jsx)(s.span,{"data-line":"",children:(0,a.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,a.jsx)(s.h3,{id:"different-rxstorage-layers-for-rxdb",children:"Different RxStorage layers for RxDB"}),"\n",(0,a.jsx)(s.p,{children:"RxDB offers multiple storage options, known as RxStorage layers, to store data locally. These options include:"}),"\n",(0,a.jsxs)(s.ul,{children:["\n",(0,a.jsxs)(s.li,{children:[(0,a.jsx)(s.a,{href:"/rx-storage-lokijs.html",children:"LokiJS RxStorage"}),": LokiJS is an in-memory database that can be used as a ",(0,a.jsx)(s.a,{href:"/articles/browser-storage.html",children:"storage"})," layer for RxDB. It provides fast and efficient in-memory data management capabilities."]}),"\n",(0,a.jsxs)(s.li,{children:[(0,a.jsx)(s.a,{href:"/rx-storage-sqlite.html",children:"SQLite RxStorage"}),": SQLite is a popular and widely used ",(0,a.jsx)(s.a,{href:"/articles/embedded-database.html",children:"embedded database"})," that offers robust storage capabilities. RxDB utilizes SQLite as a storage layer to persist data on the device."]}),"\n",(0,a.jsxs)(s.li,{children:[(0,a.jsx)(s.a,{href:"/rx-storage-memory.html",children:"Memory RxStorage"}),": As the name suggests, Memory RxStorage stores data ",(0,a.jsx)(s.a,{href:"/articles/in-memory-nosql-database.html",children:"in memory"}),". While this option does not provide persistence, it can be useful for temporary or cache-based data storage.\nBy choosing the appropriate RxStorage layer based on the specific requirements of the application, developers can optimize performance and storage efficiency."]}),"\n"]}),"\n",(0,a.jsx)(s.h2,{id:"synchronizing-data-with-rxdb-between-clients-and-servers",children:"Synchronizing Data with RxDB between Clients and Servers"}),"\n",(0,a.jsx)(s.p,{children:"One of the key strengths of RxDB is its ability to synchronize data between multiple clients and servers seamlessly. Let's explore how this synchronization can be achieved."}),"\n",(0,a.jsx)(s.h3,{id:"offline-first-approach-1",children:"Offline-First Approach"}),"\n",(0,a.jsx)(s.p,{children:"RxDB's offline-first approach ensures that data can be accessed and modified even when there is no internet connection. Changes made offline are automatically synchronized with the server once a connection is reestablished. This ensures data consistency across all devices, providing a seamless user experience."}),"\n",(0,a.jsx)(s.h3,{id:"rxdb-replication-plugins",children:"RxDB Replication Plugins"}),"\n",(0,a.jsxs)(s.p,{children:["RxDB provides replication plugins that simplify the process of setting up data ",(0,a.jsx)(s.a,{href:"/replication.html",children:"synchronization between clients and servers"}),". These plugins offer various synchronization strategies, such as one-way replication, two-way replication, and conflict resolution mechanisms. By configuring the appropriate replication plugin, developers can easily establish real-time data synchronization in their Flutter applications."]}),"\n",(0,a.jsx)(s.h2,{id:"advanced-rxdb-features-and-techniques",children:"Advanced RxDB Features and Techniques"}),"\n",(0,a.jsx)(s.p,{children:"RxDB offers a range of advanced features and techniques that enhance its functionality and performance. Let's explore a few of these features:"}),"\n",(0,a.jsx)(s.h3,{id:"indexing-and-performance-optimization",children:"Indexing and Performance Optimization"}),"\n",(0,a.jsx)(s.p,{children:"Indexing is a technique used to optimize query performance by creating indexes on specific fields. RxDB allows developers to define indexes on document fields, improving the efficiency of queries and data retrieval."}),"\n",(0,a.jsx)(s.h3,{id:"encryption-of-local-data",children:"Encryption of Local Data"}),"\n",(0,a.jsxs)(s.p,{children:["To ensure data privacy and security, RxDB supports ",(0,a.jsx)(s.a,{href:"/encryption.html",children:"encryption of local data"}),". By encrypting the data stored on the device, developers can protect sensitive information and prevent unauthorized access."]}),"\n",(0,a.jsx)(s.h3,{id:"change-streams-and-event-handling",children:"Change Streams and Event Handling"}),"\n",(0,a.jsx)(s.p,{children:"RxDB provides change streams, which emit events whenever data changes occur. By leveraging change streams, developers can implement custom event handling logic, such as updating the UI or triggering background processes, in response to specific data changes."}),"\n",(0,a.jsx)(s.h3,{id:"json-key-compression",children:"JSON Key Compression"}),"\n",(0,a.jsxs)(s.p,{children:["To minimize storage requirements and optimize performance, RxDB offers ",(0,a.jsx)(s.a,{href:"/key-compression.html",children:"JSON key compression"}),". This feature reduces the size of keys used in the database, resulting in more efficient storage and improved query performance."]}),"\n",(0,a.jsx)(s.h2,{id:"conclusion",children:"Conclusion"}),"\n",(0,a.jsx)(s.p,{children:"RxDB offers a powerful and flexible database solution for Flutter applications. With its offline-first approach, real-time data synchronization, and reactive data handling capabilities, RxDB simplifies the development of feature-rich and scalable Flutter applications. By integrating RxDB into your Flutter projects, you can leverage its advanced features and techniques to build responsive and data-driven applications that provide an exceptional user experience."}),"\n",(0,a.jsx)(s.admonition,{type:"note",children:(0,a.jsxs)(s.p,{children:["You can find the source code for an example RxDB Flutter Application ",(0,a.jsx)(s.a,{href:"https://github.com/pubkey/rxdb/tree/master/examples/flutter",children:"at the github repo"})]})})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,a.jsx)(s,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},8453(e,s,n){n.d(s,{R:()=>t,x:()=>o});var r=n(6540);const a={},i=r.createContext(a);function t(e){const s=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:t(e.components),r.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/bdd39edd.10cefecb.js b/docs/assets/js/bdd39edd.10cefecb.js deleted file mode 100644 index 141e3bccb7f..00000000000 --- a/docs/assets/js/bdd39edd.10cefecb.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[5852],{1541(e,a,s){s.r(a),s.d(a,{default:()=>l});var r=s(544),t=s(4848);function l(){return(0,r.default)({sem:{id:"gads",metaTitle:"The local Database for Browsers",appName:"Browser",title:(0,t.jsxs)(t.Fragment,{children:["The easiest way to ",(0,t.jsx)("b",{children:"store"})," and ",(0,t.jsx)("b",{children:"sync"})," Data in a Browser"]})}})}}}]); \ No newline at end of file diff --git a/docs/assets/js/c0f75fb9.ea90dae3.js b/docs/assets/js/c0f75fb9.ea90dae3.js deleted file mode 100644 index 1154a521b3b..00000000000 --- a/docs/assets/js/c0f75fb9.ea90dae3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[833],{6440(e,s,n){n.r(s),n.d(s,{assets:()=>t,contentTitle:()=>l,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>c});const r=JSON.parse('{"id":"articles/zero-latency-local-first","title":"Zero Latency Local First Apps with RxDB \u2013 Sync, Encryption and Compression","description":"Build blazing-fast, zero-latency local first apps with RxDB. Gain instant UI responses, robust offline capabilities, end-to-end encryption, and data compression for streamlined performance.","source":"@site/docs/articles/zero-latency-local-first.md","sourceDirName":"articles","slug":"/articles/zero-latency-local-first.html","permalink":"/articles/zero-latency-local-first.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Zero Latency Local First Apps with RxDB \u2013 Sync, Encryption and Compression","slug":"zero-latency-local-first.html","description":"Build blazing-fast, zero-latency local first apps with RxDB. Gain instant UI responses, robust offline capabilities, end-to-end encryption, and data compression for streamlined performance."},"sidebar":"tutorialSidebar","previous":{"title":"RxDB \u2013 The Ultimate Offline Database with Sync and Encryption","permalink":"/articles/offline-database.html"},"next":{"title":"IndexedDB Max Storage Size Limit - Detailed Best Practices","permalink":"/articles/indexeddb-max-storage-limit.html"}}');var i=n(4848),o=n(8453);const a={title:"Zero Latency Local First Apps with RxDB \u2013 Sync, Encryption and Compression",slug:"zero-latency-local-first.html",description:"Build blazing-fast, zero-latency local first apps with RxDB. Gain instant UI responses, robust offline capabilities, end-to-end encryption, and data compression for streamlined performance."},l="Zero Latency Local First Apps with RxDB \u2013 Sync, Encryption and Compression",t={},c=[{value:"Why Zero Latency with a Local First Approach?",id:"why-zero-latency-with-a-local-first-approach",level:2},{value:"RxDB: Your Key to Zero-Latency Local First Apps",id:"rxdb-your-key-to-zero-latency-local-first-apps",level:2},{value:"Real-Time Sync and Offline-First",id:"real-time-sync-and-offline-first",level:3},{value:"Multiple Replication Plugins and Approaches",id:"multiple-replication-plugins-and-approaches",level:4},{value:"Example Setup of a local database",id:"example-setup-of-a-local-database",level:4},{value:"Example Setup of the replication",id:"example-setup-of-the-replication",level:4},{value:"Things you should also know about",id:"things-you-should-also-know-about",level:2},{value:"Optimistic UI on Local Data Changes",id:"optimistic-ui-on-local-data-changes",level:3},{value:"Conflict Handling",id:"conflict-handling",level:3},{value:"Schema Migrations",id:"schema-migrations",level:3},{value:"Advanced Features",id:"advanced-features",level:2},{value:"Setup Encryption",id:"setup-encryption",level:3},{value:"Setup Compression",id:"setup-compression",level:3},{value:"Different RxDB Storages Depending on the Runtime",id:"different-rxdb-storages-depending-on-the-runtime",level:2},{value:"Performance Considerations",id:"performance-considerations",level:2},{value:"Offloading Work from the Main Thread",id:"offloading-work-from-the-main-thread",level:3},{value:"Sharding or Memory-Mapped Storages",id:"sharding-or-memory-mapped-storages",level:3},{value:"Follow Up",id:"follow-up",level:2}];function d(e){const s={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",span:"span",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(s.header,{children:(0,i.jsx)(s.h1,{id:"zero-latency-local-first-apps-with-rxdb--sync-encryption-and-compression",children:"Zero Latency Local First Apps with RxDB \u2013 Sync, Encryption and Compression"})}),"\n",(0,i.jsxs)(s.p,{children:["Creating a ",(0,i.jsx)(s.strong,{children:"zero-latency local first"})," application involves ensuring that most (if not all) user interactions occur instantaneously, without waiting on remote network responses. This design drastically enhances user experience, allowing apps to remain responsive and functional even when offline or experiencing poor connectivity. As developers, we can achieve this by storing data ",(0,i.jsx)(s.strong,{children:"locally on the client"})," and synchronizing it to the backend in the background. ",(0,i.jsx)(s.strong,{children:"RxDB"})," (Reactive Database) offers a comprehensive set of features - covering replication, offline support, encryption, compression, conflict handling, and more - that make it straightforward to build such high-performing apps."]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"/files/loading-spinner-not-needed.gif",alt:"loading spinner not needed",width:"300"})}),"\n",(0,i.jsx)(s.h2,{id:"why-zero-latency-with-a-local-first-approach",children:"Why Zero Latency with a Local First Approach?"}),"\n",(0,i.jsx)(s.p,{children:"In a traditional architecture, each user action triggers requests to a server for reads or writes. Despite network optimizations, unavoidable latencies can delay responses and disrupt the user flow. By contrast, a local first model maintains data in the client's environment (browser, mobile, desktop), drastically reducing user-perceived delays. Once the user re-connects or resumes activity online, changes propagate automatically to the server, eliminating manual synchronization overhead."}),"\n",(0,i.jsxs)(s.ol,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Instant Responsiveness"}),": Because user actions (queries, updates, etc.) happen against a local datastore, UI updates do not wait on round-trip times."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Offline Operation"}),": Apps can continue to read and write data, even when there is zero connectivity."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Reduced Backend Load"}),": Instead of flooding the server with small requests, replication can combine and push or pull changes in batches."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Simplified Caching"}),": Instead of implementing multi-layer caching, local first transforms your data layer into a reliable, quickly accessible store for all user actions."]}),"\n"]}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"RxDB local Database",width:"220"})})}),"\n",(0,i.jsx)(s.h2,{id:"rxdb-your-key-to-zero-latency-local-first-apps",children:"RxDB: Your Key to Zero-Latency Local First Apps"}),"\n",(0,i.jsxs)(s.p,{children:[(0,i.jsx)(s.strong,{children:"RxDB"})," is a JavaScript-based NoSQL database designed for offline-first and real-time replication scenarios. It supports a range of environments - browsers (IndexedDB or OPFS), mobile (",(0,i.jsx)(s.a,{href:"/articles/ionic-storage.html",children:"Ionic"}),", ",(0,i.jsx)(s.a,{href:"/react-native-database.html",children:"React Native"}),"), ",(0,i.jsx)(s.a,{href:"/electron-database.html",children:"Electron"}),", Node.js - and is built around:"]}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Reactive Queries"})," that trigger UI updates upon data changes"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Schema-based NoSQL Documents"})," for flexible but robust data models"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/replication.html",children:"Advanced Sync Engine"}),": to synchronize with diverse backends"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Encryption"})," for secure data at rest"]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Compression"})," to reduce local and network overhead"]}),"\n"]}),"\n",(0,i.jsx)(s.h3,{id:"real-time-sync-and-offline-first",children:"Real-Time Sync and Offline-First"}),"\n",(0,i.jsx)(s.p,{children:"RxDB's replication logic revolves around pulling down remote changes and pushing up local modifications. It maintains a checkpoint-based mechanism, so only new or updated documents flow between the client and server, reducing bandwidth usage and latency. This ensures:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Live Data"}),": Queries automatically reflect server-side changes once they arrive locally."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Background Updates"}),": No manual polling needed; replication streams or intervals handle synchronization."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.strong,{children:"Conflict Handling"})," (see below) ensures data merges gracefully when multiple clients edit the same document offline."]}),"\n"]}),"\n",(0,i.jsx)(s.h4,{id:"multiple-replication-plugins-and-approaches",children:"Multiple Replication Plugins and Approaches"}),"\n",(0,i.jsxs)(s.p,{children:["RxDB's flexible replication system lets you connect to different backends or even peer-to-peer networks. There are official plugins for ",(0,i.jsx)(s.a,{href:"/replication-couchdb.html",children:"CouchDB"}),", ",(0,i.jsx)(s.a,{href:"/replication-firestore.html",children:"Firestore"}),", ",(0,i.jsx)(s.a,{href:"/replication-graphql.html",children:"GraphQL"}),", ",(0,i.jsx)(s.a,{href:"/replication-webrtc.html",children:"WebRTC"}),", and more. Many developers create a ",(0,i.jsx)(s.strong,{children:"custom HTTP replication"})," to work with their existing REST-based backend, ensuring a painless integration that doesn't require adopting an entirely new server infrastructure."]}),"\n",(0,i.jsx)(s.h4,{id:"example-setup-of-a-local-database",children:"Example Setup of a local database"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/core'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" initZeroLocalDB"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"() {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Create a local RxDB instance using localstorage-based storage"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myZeroLocalDB'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // optional: password for encryption if needed"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Define one or more collections"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" tasks"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'task schema'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" done"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'boolean'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Reactive query - automatically updates on local or remote changes"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".tasks"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" .find"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" .$ "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// returns an RxJS Observable"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" .subscribe"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(allTasks "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".log"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'All tasks updated:'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" allTasks);"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" db;"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsxs)(s.p,{children:["When offline, reads and writes to ",(0,i.jsx)(s.code,{children:"db.tasks"})," happen locally with near-zero delay. Once connectivity resumes, changes sync to the server automatically (if replication is configured)."]}),"\n",(0,i.jsx)(s.h4,{id:"example-setup-of-the-replication",children:"Example Setup of the replication"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { replicateRxCollection } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/replication'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" function"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" syncLocalTasks"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"(db) {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" replicateRxCollection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" collection"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:".tasks"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" replicationIdentifier"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'sync-tasks'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // Define how to pull server documents and push local documents"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" pull"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (lastCheckpoint"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" batchSize) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // logic to retrieve updated tasks from the server since lastCheckpoint"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" push"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" handler"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" async"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" (docs) "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // logic to post local changes to the server"})}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" live"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // continuously replicate"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" retryTime"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 5000"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:" // retry on errors or disconnections"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" });"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"}"})})]})})}),"\n",(0,i.jsx)(s.p,{children:"This replication seamlessly merges server-side and client-side changes. Your app remains responsive throughout, regardless of the network status."}),"\n",(0,i.jsx)(s.h2,{id:"things-you-should-also-know-about",children:"Things you should also know about"}),"\n",(0,i.jsx)(s.h3,{id:"optimistic-ui-on-local-data-changes",children:"Optimistic UI on Local Data Changes"}),"\n",(0,i.jsxs)(s.p,{children:["A local first approach, especially with RxDB, naturally supports an ",(0,i.jsx)(s.a,{href:"/articles/optimistic-ui.html",children:"optimistic UI"})," pattern. Because writes occur on the client, you can instantly reflect changes in the interface as soon as the user performs an action - no need to wait for server confirmation. For example, when a user updates a task document to done: true, the UI can re-render immediately with that new state. This even works across multiple browser tabs."]}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"/files/multiwindow.gif",alt:"RxDB multi tab",width:"450"})}),"\n",(0,i.jsxs)(s.p,{children:["If a server conflict arises later during replication, RxDB's ",(0,i.jsx)(s.a,{href:"/transactions-conflicts-revisions.html",children:"conflict handling"})," logic determines which changes to keep, and the UI can be updated accordingly. This is far more efficient than blocking the user or displaying a spinner while the backend processes the request."]}),"\n",(0,i.jsx)(s.h3,{id:"conflict-handling",children:"Conflict Handling"}),"\n",(0,i.jsx)(s.p,{children:"In local first models, conflicts emerge if multiple devices or clients edit the same document while offline. RxDB tracks document revisions so you can detect collisions and merge them effectively. By default, RxDB uses a last-write-wins approach, but developers can override it with a custom conflict handler. This provides fine-grained control - like merging partial fields, storing revision histories, or prompting users for resolution. Proper conflict handling keeps distributed data consistent across your entire system."}),"\n",(0,i.jsx)(s.h3,{id:"schema-migrations",children:"Schema Migrations"}),"\n",(0,i.jsx)(s.p,{children:"Over time, apps evolve - new fields, changed field types, or altered indexes. RxDB allows incremental schema migrations so you can upgrade a user's local data from one schema version to another. You might, for instance, rename a property or transform data formats. Once you define your migration strategy, RxDB automatically applies it upon app initialization, ensuring the local database's structure aligns with your latest codebase."}),"\n",(0,i.jsx)(s.h2,{id:"advanced-features",children:"Advanced Features"}),"\n",(0,i.jsx)(s.h3,{id:"setup-encryption",children:"Setup Encryption"}),"\n",(0,i.jsxs)(s.p,{children:["When storing data locally, you may handle user-sensitive information like PII (Personal Identifiable Information) or financial details. RxDB supports on-device ",(0,i.jsx)(s.a,{href:"/encryption.html",children:"encryption"})," to protect fields. For example, you can define:"]}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { wrappedKeyEncryptionCryptoJsStorage } "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/encryption-crypto-js'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" encryptedStorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" wrappedKeyEncryptionCryptoJsStorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"()"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'secureDB'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" encryptedStorage"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" password"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myEncryptionPassword'"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" secrets"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'secrets schema'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" maxLength"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 100"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" secretField"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" required"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"]"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" encrypted"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" ["}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'secretField'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"] "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// define which fields to encrypt"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsxs)(s.p,{children:["Then mark fields as ",(0,i.jsx)(s.code,{children:"encrypted"})," in the schema. This ensures data is unreadable on disk without the correct password."]}),"\n",(0,i.jsx)(s.h3,{id:"setup-compression",children:"Setup Compression"}),"\n",(0,i.jsx)(s.p,{children:"Local data can expand quickly, especially for large documents or repeated key names. RxDB's key compression feature replaces verbose field names with shorter tokens, decreasing storage usage and speeding up replication. You enable it by adding keyCompression: true to your collection schema:"}),"\n",(0,i.jsx)(s.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(s.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(s.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".addCollections"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" logs"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" schema"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" title"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'log schema'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" version"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" keyCompression"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'object'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" primaryKey"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'id'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" properties"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" id"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:". maxLength: "}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"100"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" message"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'string'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(s.span,{"data-line":"",children:[(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" timestamp"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" { type"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'number'"}),(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})]}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(s.span,{"data-line":"",children:(0,i.jsx)(s.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(s.h2,{id:"different-rxdb-storages-depending-on-the-runtime",children:"Different RxDB Storages Depending on the Runtime"}),"\n",(0,i.jsx)(s.p,{children:"RxDB's storage layer is swappable, so you can pick the optimal adapter for each environment. Some common choices include:"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB"})," in modern browsers (default)."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/rx-storage-opfs.html",children:"OPFS"})," (Origin Private File System) in browsers that support it for potentially better performance."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/rx-storage-sqlite.html",children:"SQLite"})," for mobile or desktop environments via the premium plugin, offering native-like speed on Android, iOS, or Electron."]}),"\n",(0,i.jsxs)(s.li,{children:[(0,i.jsx)(s.a,{href:"/rx-storage-memory.html",children:"In-Memory"})," for tests or ephemeral data."]}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["By choosing a suitable storage layer, you can adapt your zero-latency local first design to any runtime - web, ",(0,i.jsx)(s.a,{href:"/articles/mobile-database.html",children:"mobile"}),", or server-like contexts in ",(0,i.jsx)(s.a,{href:"/nodejs-database.html",children:"Node.js"}),"."]}),"\n",(0,i.jsx)(s.h2,{id:"performance-considerations",children:"Performance Considerations"}),"\n",(0,i.jsxs)(s.p,{children:["Performant local data operations are crucial for a zero-latency experience. According to the RxDB ",(0,i.jsx)(s.a,{href:"/rx-storage-performance.html",children:"storage performance overview"}),", differences in underlying storages can significantly impact throughput and latency. For instance, IndexedDB typically performs well across modern browsers, ",(0,i.jsx)(s.a,{href:"/rx-storage-opfs.html",children:"OPFS"})," offers improved throughput in supporting browsers, and ",(0,i.jsx)(s.a,{href:"/rx-storage-sqlite.html",children:"SQLite storage"})," (a premium plugin) often delivers near-native speed for mobile or desktop."]}),"\n",(0,i.jsx)(s.h3,{id:"offloading-work-from-the-main-thread",children:"Offloading Work from the Main Thread"}),"\n",(0,i.jsxs)(s.p,{children:["In a browser environment, you can move database operations into a Web Worker using the ",(0,i.jsx)(s.a,{href:"/rx-storage-worker.html",children:"Worker RxStorage plugin"}),". This approach lets you keep heavy data processing off the main thread, ensuring the UI remains smooth and responsive. Complex queries or large write operations no longer cause stuttering in the user interface."]}),"\n",(0,i.jsx)(s.h3,{id:"sharding-or-memory-mapped-storages",children:"Sharding or Memory-Mapped Storages"}),"\n",(0,i.jsxs)(s.p,{children:["For large datasets or high concurrency, advanced techniques like ",(0,i.jsx)(s.a,{href:"/rx-storage-sharding.html",children:"sharding"})," collections across multiple storages or leveraging a ",(0,i.jsx)(s.a,{href:"/rx-storage-memory-mapped.html",children:"memory-mapped"})," variant can further boost performance. By splitting data into smaller subsets or streaming it only as needed, you can scale to handle complex usage scenarios without compromising on the zero-latency user experience."]}),"\n",(0,i.jsx)(s.h2,{id:"follow-up",children:"Follow Up"}),"\n",(0,i.jsxs)(s.ul,{children:["\n",(0,i.jsxs)(s.li,{children:["Dive into the ",(0,i.jsx)(s.a,{href:"/quickstart.html",children:"RxDB Quickstart"})," to set up your own local first database."]}),"\n",(0,i.jsxs)(s.li,{children:["Explore ",(0,i.jsx)(s.a,{href:"/replication.html",children:"Replication Plugins"})," for syncing with platforms like ",(0,i.jsx)(s.a,{href:"/replication-couchdb.html",children:"CouchDB"}),", ",(0,i.jsx)(s.a,{href:"/articles/firestore-alternative.html",children:"Firestore"}),", or ",(0,i.jsx)(s.a,{href:"/replication-graphql.html",children:"GraphQL"}),"."]}),"\n",(0,i.jsxs)(s.li,{children:["Check out Advanced ",(0,i.jsx)(s.a,{href:"/transactions-conflicts-revisions.html",children:"Conflict Handling"})," and ",(0,i.jsx)(s.a,{href:"/rx-storage-performance.html",children:"Performance Tuning"})," for big data sets or complex multi-user interactions."]}),"\n",(0,i.jsxs)(s.li,{children:["Join the RxDB Community on ",(0,i.jsx)(s.a,{href:"/code/",children:"GitHub"})," and ",(0,i.jsx)(s.a,{href:"/chat/",children:"Discord"})," to share insights, file issues, and learn from other developers building zero-latency solutions."]}),"\n",(0,i.jsx)(s.li,{}),"\n"]}),"\n",(0,i.jsxs)(s.p,{children:["By integrating RxDB into your stack, you achieve millisecond interactions, full ",(0,i.jsx)(s.a,{href:"/offline-first.html",children:"offline capabilities"}),", secure data at rest, and minimal overhead for large or distributed teams. This zero-latency local first architecture is the future of modern software - delivering a fluid, always-available user experience without overcomplicating the developer workflow."]})]})}function h(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,i.jsx)(s,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},8453(e,s,n){n.d(s,{R:()=>a,x:()=>l});var r=n(6540);const i={},o=r.createContext(i);function a(e){const s=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/docs/assets/js/c3bc9c50.8e3aa667.js b/docs/assets/js/c3bc9c50.8e3aa667.js deleted file mode 100644 index 85860adcc41..00000000000 --- a/docs/assets/js/c3bc9c50.8e3aa667.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkrxdb=globalThis.webpackChunkrxdb||[]).push([[9167],{8097(e,a,n){n.r(a),n.d(a,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>t,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"articles/react-database","title":"RxDB as a Database for React Applications","description":"earn how the RxDB database supercharges React apps with offline access, real-time updates, and smooth data flow. Boost performance and engagement.","source":"@site/docs/articles/react-database.md","sourceDirName":"articles","slug":"/articles/react-database.html","permalink":"/articles/react-database.html","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"RxDB as a Database for React Applications","slug":"react-database.html","description":"earn how the RxDB database supercharges React apps with offline access, real-time updates, and smooth data flow. Boost performance and engagement."},"sidebar":"tutorialSidebar","previous":{"title":"RxDB as a Database for Progressive Web Apps (PWA)","permalink":"/articles/progressive-web-app-database.html"},"next":{"title":"What Really Is a Realtime Database?","permalink":"/articles/realtime-database.html"}}');var i=n(4848),r=n(8453);const t={title:"RxDB as a Database for React Applications",slug:"react-database.html",description:"earn how the RxDB database supercharges React apps with offline access, real-time updates, and smooth data flow. Boost performance and engagement."},o="RxDB as a Database for React Applications",l={},c=[{value:"Introducing RxDB as a JavaScript Database",id:"introducing-rxdb-as-a-javascript-database",level:2},{value:"What is RxDB?",id:"what-is-rxdb",level:2},{value:"Reactive Data Handling",id:"reactive-data-handling",level:3},{value:"Local-First Approach",id:"local-first-approach",level:3},{value:"Data Replication",id:"data-replication",level:3},{value:"Observable Queries",id:"observable-queries",level:3},{value:"Multi-Tab Support",id:"multi-tab-support",level:3},{value:"RxDB vs. Other React Database Options",id:"rxdb-vs-other-react-database-options",level:3},{value:"IndexedDB in React and the Advantage of RxDB",id:"indexeddb-in-react-and-the-advantage-of-rxdb",level:3},{value:"Using RxDB in a React Application",id:"using-rxdb-in-a-react-application",level:3},{value:"Using RxDB React Hooks",id:"using-rxdb-react-hooks",level:3},{value:"Different RxStorage Layers for RxDB",id:"different-rxstorage-layers-for-rxdb",level:3},{value:"Synchronizing Data with RxDB between Clients and Servers",id:"synchronizing-data-with-rxdb-between-clients-and-servers",level:3},{value:"Advanced RxDB Features and Techniques",id:"advanced-rxdb-features-and-techniques",level:3},{value:"Indexing and Performance Optimization",id:"indexing-and-performance-optimization",level:3},{value:"JSON Key Compression",id:"json-key-compression",level:3},{value:"Change Streams and Event Handling",id:"change-streams-and-event-handling",level:3},{value:"Conclusion",id:"conclusion",level:2},{value:"Follow Up",id:"follow-up",level:2}];function d(e){const a={a:"a",code:"code",figure:"figure",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",span:"span",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(a.header,{children:(0,i.jsx)(a.h1,{id:"rxdb-as-a-database-for-react-applications",children:"RxDB as a Database for React Applications"})}),"\n",(0,i.jsx)(a.p,{children:"In the rapidly evolving landscape of web development, React has emerged as a cornerstone technology for building dynamic and responsive user interfaces. With the increasing complexity of modern web applications, efficient data management becomes pivotal. This article delves into the integration of RxDB, a potent client-side database, with React applications to optimize data handling and elevate the overall user experience."}),"\n",(0,i.jsx)(a.p,{children:"React has revolutionized the way web applications are built by introducing a component-based architecture. This approach enables developers to create reusable UI components that efficiently update in response to changes in data. The virtual DOM mechanism, a key feature of React, facilitates optimized rendering, enhancing performance and user interactivity."}),"\n",(0,i.jsx)(a.p,{children:"While React excels at managing the user interface, the need for efficient data storage and retrieval mechanisms is equally significant. A client-side database brings several advantages to React applications:"}),"\n",(0,i.jsxs)(a.ul,{children:["\n",(0,i.jsx)(a.li,{children:"Improved Performance: Local data storage reduces the need for frequent server requests, resulting in faster data retrieval and enhanced application responsiveness."}),"\n",(0,i.jsx)(a.li,{children:"Offline Capabilities: A client-side database enables offline access to data, allowing users to interact with the application even when they are disconnected from the internet."}),"\n",(0,i.jsx)(a.li,{children:"Real-Time Updates: With the ability to observe changes in data, client-side databases facilitate real-time updates to the UI, ensuring users are always presented with the latest information."}),"\n",(0,i.jsx)(a.li,{children:"Reduced Server Load: By handling data operations locally, client-side databases alleviate the load on the server, contributing to a more scalable architecture."}),"\n"]}),"\n",(0,i.jsx)(a.h2,{id:"introducing-rxdb-as-a-javascript-database",children:"Introducing RxDB as a JavaScript Database"}),"\n",(0,i.jsx)(a.p,{children:"RxDB, a powerful JavaScript database, has garnered attention as an optimal solution for managing data in React applications. Built on top of the IndexedDB standard, RxDB combines the principles of reactive programming with database management. Its core features include reactive data handling, offline-first capabilities, and robust data replication."}),"\n",(0,i.jsx)("center",{children:(0,i.jsx)("a",{href:"https://rxdb.info/",children:(0,i.jsx)("img",{src:"../files/logo/rxdb_javascript_database.svg",alt:"JavaScript React Database",width:"221"})})}),"\n",(0,i.jsx)(a.h2,{id:"what-is-rxdb",children:"What is RxDB?"}),"\n",(0,i.jsx)(a.p,{children:"RxDB, short for Reactive Database, is an open-source JavaScript database that seamlessly integrates reactive programming with database operations. It offers a comprehensive API for performing database actions and synchronizing data across clients and servers. RxDB's underlying philosophy revolves around observables, allowing developers to reactively manage data changes and create dynamic user interfaces."}),"\n",(0,i.jsx)(a.h3,{id:"reactive-data-handling",children:"Reactive Data Handling"}),"\n",(0,i.jsx)(a.p,{children:"One of RxDB's standout features is its support for reactive data handling. Traditional databases often require manual intervention for data fetching and updating, leading to complex and error-prone code. RxDB, however, automatically notifies subscribers whenever data changes occur, eliminating the need for explicit data manipulation. This reactive approach simplifies code and enhances the responsiveness of React components."}),"\n",(0,i.jsx)(a.h3,{id:"local-first-approach",children:"Local-First Approach"}),"\n",(0,i.jsxs)(a.p,{children:["RxDB embraces a ",(0,i.jsx)(a.a,{href:"/offline-first.html",children:"local-first"})," methodology, enabling applications to function seamlessly even in offline scenarios. By storing data locally, RxDB ensures that users can interact with the application and make updates regardless of internet connectivity. Once the connection is reestablished, RxDB synchronizes the local changes with the remote database, maintaining data consistency across devices."]}),"\n",(0,i.jsx)(a.h3,{id:"data-replication",children:"Data Replication"}),"\n",(0,i.jsx)(a.p,{children:"Data replication is a cornerstone of modern applications that require synchronization between multiple clients and servers. RxDB provides robust data replication mechanisms that facilitate real-time synchronization between different instances of the database. This ensures that changes made on one client are promptly propagated to others, contributing to a cohesive and unified user experience."}),"\n",(0,i.jsx)(a.h3,{id:"observable-queries",children:"Observable Queries"}),"\n",(0,i.jsx)(a.p,{children:"RxDB extends the concept of observables beyond data changes. It introduces observable queries, allowing developers to observe the results of database queries. This feature enables automatic updates to query results whenever relevant data changes occur. Observable queries simplify state management by eliminating the need to manually trigger updates in response to changing data."}),"\n",(0,i.jsx)(a.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(a.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(a.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"await"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:"heroes"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" selector"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" healthpoints"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" $gt"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" 0"})]}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" }"})}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"})"})}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:".$ "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-comment)"},children:"// the $ returns an observable that emits each time the result set of the query changes"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:".subscribe"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"(aliveHeroes "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" console"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:".dir"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"(aliveHeroes));"})]})]})})}),"\n",(0,i.jsx)(a.h3,{id:"multi-tab-support",children:"Multi-Tab Support"}),"\n",(0,i.jsx)(a.p,{children:"Web applications often operate in multiple browser tabs or windows. RxDB accommodates this scenario by offering built-in multi-tab support. It ensures that data changes made in one tab are efficiently propagated to other tabs, maintaining data consistency and providing a seamless experience for users interacting with the application across different tabs."}),"\n",(0,i.jsx)("p",{align:"center",children:(0,i.jsx)("img",{src:"../files/multiwindow.gif",alt:"multi tab support",width:"450"})}),"\n",(0,i.jsx)(a.h3,{id:"rxdb-vs-other-react-database-options",children:"RxDB vs. Other React Database Options"}),"\n",(0,i.jsx)(a.p,{children:"While considering database options for React applications, RxDB stands out due to its unique combination of reactive programming and database capabilities. Unlike traditional solutions such as IndexedDB or Web Storage, which provide basic data storage, RxDB offers a dedicated database solution with advanced features. Additionally, while state management libraries like Redux and MobX can be adapted for database use, RxDB provides an integrated solution specifically designed for handling data."}),"\n",(0,i.jsx)(a.h3,{id:"indexeddb-in-react-and-the-advantage-of-rxdb",children:"IndexedDB in React and the Advantage of RxDB"}),"\n",(0,i.jsxs)(a.p,{children:["Using IndexedDB directly in React can be challenging due to its low-level, callback-based API which doesn't align neatly with modern React's Promise and async/await patterns. This intricacy often leads to bulky and complex implementations for developers. Also, when used wrong, IndexedDB can have a worse ",(0,i.jsx)(a.a,{href:"/slow-indexeddb.html",children:"performance profile"})," then it could have. In contrast, RxDB, with the ",(0,i.jsx)(a.a,{href:"/rx-storage-indexeddb.html",children:"IndexedDB RxStorage"})," and the ",(0,i.jsx)(a.a,{href:"/rx-storage-localstorage.html",children:"LocalStorage RxStorage"}),", abstracts these complexities, integrating reactive programming and providing a more streamlined experience for data management in React applications. Thus, RxDB offers a more intuitive approach, eliminating much of the manual overhead required with IndexedDB."]}),"\n",(0,i.jsx)(a.h3,{id:"using-rxdb-in-a-react-application",children:"Using RxDB in a React Application"}),"\n",(0,i.jsxs)(a.p,{children:["The process of integrating RxDB into a React application is straightforward. Begin by installing RxDB as a dependency:\n",(0,i.jsx)(a.code,{children:"npm install rxdb rxjs"}),"\nOnce installed, RxDB can be imported and initialized within your React components. The following code snippet illustrates a basic setup:"]}),"\n",(0,i.jsx)(a.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(a.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"javascript","data-theme":"css-variables",children:(0,i.jsxs)(a.code,{"data-language":"javascript","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" { createRxDatabase } "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb'"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" { getRxStorageLocalstorage } "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'rxdb/plugins/storage-localstorage'"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" db"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:" await"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:" createRxDatabase"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"({"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" name"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'heroesdb'"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- name"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" storage"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:" getRxStorageLocalstorage"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- RxStorage"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" password"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'myPassword'"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- password (optional)"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" multiInstance"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- multiInstance (optional, default: true)"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" eventReduce"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" true"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-comment)"},children:" // <- eventReduce (optional, default: false)"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" cleanupPolicy"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" {} "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-comment)"},children:"// <- custom cleanup policy (optional) "})]}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"});"})})]})})}),"\n",(0,i.jsx)(a.h3,{id:"using-rxdb-react-hooks",children:"Using RxDB React Hooks"}),"\n",(0,i.jsxs)(a.p,{children:["The ",(0,i.jsx)(a.a,{href:"https://github.com/cvara/rxdb-hooks",children:"rxdb-hooks"})," package provides a set of React hooks that simplify data management within components. These hooks leverage RxDB's reactivity to automatically update components when data changes occur. The following example demonstrates the usage of the ",(0,i.jsx)(a.code,{children:"useRxCollection"})," and ",(0,i.jsx)(a.code,{children:"useRxQuery"})," hooks to query and observe a collection:"]}),"\n",(0,i.jsx)(a.figure,{"data-rehype-pretty-code-figure":"",children:(0,i.jsx)(a.pre,{style:{backgroundColor:"var(--shiki-background)",color:"var(--shiki-foreground)"},tabIndex:"0","data-language":"ts","data-theme":"css-variables",children:(0,i.jsxs)(a.code,{"data-language":"ts","data-theme":"css-variables",style:{display:"grid"},children:[(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" collection"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:" useRxCollection"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'characters'"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" query"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:" ="}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" collection"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:".find"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"()"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:".where"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'affiliation'"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:")"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:".equals"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"("}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'Jedi'"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:");"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" result: "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:"characters"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" isFetching"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" fetchMore"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" isExhausted"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"} "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:" useRxQuery"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"(query"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" {"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" pageSize"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-constant)"},children:" 5"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" pagination"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Infinite'"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"});"})}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"if"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" (isFetching) {"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:" return"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-string-expression)"},children:" 'Loading...'"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:";"})]}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"}"})}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:" "}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"return"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" ("})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" <"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-function)"},children:"CharacterList"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:">"})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" {characters.map((character"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" index) "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" ("})]}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:" <"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"Character character"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"{character} key"}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:"{index} "}),(0,i.jsx)(a.span,{style:{color:"var(--shiki-token-keyword)"},children:"/>"})]}),"\n",(0,i.jsx)(a.span,{"data-line":"",children:(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" ))}"})}),"\n",(0,i.jsxs)(a.span,{"data-line":"",children:[(0,i.jsx)(a.span,{style:{color:"var(--shiki-foreground)"},children:" {!isExhausted && DocsPremiumSupport

    📥 Backup Plugin

    -

    With the backup plugin you can write the current database state and ongoing changes into folders on the filesystem. -The files are written in plain json together with their attachments so that you can read them out with any software or tools, without being bound to RxDB.

    -

    This is useful to:

    -
      -
    • Consume the database content with other software that cannot replicate with RxDB
    • -
    • Write a backup of the database to a remote server by mounting the backup folder on the other server.
    • -
    -

    The backup plugin works only in node.js, not in a browser. It is intended to have a backup strategy when using RxDB on the server side like with the RxServer. To run backups on the client side, you should use one of the replication plugins instead.

    -

    Installation

    -
    import { addRxPlugin } from 'rxdb';
    -import { RxDBBackupPlugin } from 'rxdb/plugins/backup';
    -addRxPlugin(RxDBBackupPlugin);
    -

    one-time backup

    -

    Write the whole database to the filesystem once. -When called multiple times, it will continue from the last checkpoint and not start all over again.

    -
    const backupOptions = {
    -    // if false, a one-time backup will be written
    -    live: false,
    -    // the folder where the backup will be stored
    -    directory: '/my-backup-folder/',
    -    // if true, attachments will also be saved
    -    attachments: true
    -}
    -const backupState = myDatabase.backup(backupOptions);
    -await backupState.awaitInitialBackup();
    - 
    -// call again to run from the last checkpoint
    -const backupState2 = myDatabase.backup(backupOptions);
    -await backupState2.awaitInitialBackup();
    -

    live backup

    -

    When live: true is set, the backup will write all ongoing changes to the backup directory.

    -
    const backupOptions = {
    -    // set live: true to have an ongoing backup
    -    live: true,
    -    directory: '/my-backup-folder/',
    -    attachments: true
    -}
    -const backupState = myDatabase.backup(backupOptions);
    - 
    -// you can still await the initial backup write, but further changes will still be processed.
    -await backupState.awaitInitialBackup();
    -

    writeEvents$

    -

    You can listen to the writeEvents$ Observable to get notified about written backup files.

    -
    const backupOptions = {
    -    live: false,
    -    directory: '/my-backup-folder/',
    -    attachments: true
    -}
    -const backupState = myDatabase.backup(backupOptions);
    - 
    -const subscription = backupState.writeEvents$.subscribe(writeEvent => console.dir(writeEvent));
    -/*
    -> {
    -    collectionName: 'humans',
    -    documentId: 'foobar',
    -    files: [
    -        '/my-backup-folder/foobar/document.json'
    -    ],
    -    deleted: false
    -}
    -*/
    -

    Limitations

    -
      -
    • It is currently not possible to import from a written backup. If you need this functionality, please make a pull request.
    • -
    - - \ No newline at end of file diff --git a/docs/backup.md b/docs/backup.md deleted file mode 100644 index 669bd5ca288..00000000000 --- a/docs/backup.md +++ /dev/null @@ -1,90 +0,0 @@ -# Backup - -> Easily back up your RxDB database to JSON files and attachments on the filesystem with the Backup Plugin - ensuring reliable Node.js data protection. - -# 📥 Backup Plugin - -With the backup plugin you can write the current database state and ongoing changes into folders on the filesystem. -The files are written in plain json together with their attachments so that you can read them out with any software or tools, without being bound to RxDB. - -This is useful to: - - Consume the database content with other software that cannot replicate with RxDB - - Write a backup of the database to a remote server by mounting the backup folder on the other server. - -The backup plugin works only in node.js, not in a browser. It is intended to have a backup strategy when using RxDB on the server side like with the [RxServer](./rx-server.md). To run backups on the client side, you should use one of the [replication](./replication.md) plugins instead. - -## Installation - -```javascript -import { addRxPlugin } from 'rxdb'; -import { RxDBBackupPlugin } from 'rxdb/plugins/backup'; -addRxPlugin(RxDBBackupPlugin); -``` - -## one-time backup - -Write the whole database to the filesystem **once**. -When called multiple times, it will continue from the last checkpoint and not start all over again. - -```javascript -const backupOptions = { - // if false, a one-time backup will be written - live: false, - // the folder where the backup will be stored - directory: '/my-backup-folder/', - // if true, attachments will also be saved - attachments: true -} -const backupState = myDatabase.backup(backupOptions); -await backupState.awaitInitialBackup(); - -// call again to run from the last checkpoint -const backupState2 = myDatabase.backup(backupOptions); -await backupState2.awaitInitialBackup(); -``` - -## live backup - -When `live: true` is set, the backup will write all ongoing changes to the backup directory. - -```javascript -const backupOptions = { - // set live: true to have an ongoing backup - live: true, - directory: '/my-backup-folder/', - attachments: true -} -const backupState = myDatabase.backup(backupOptions); - -// you can still await the initial backup write, but further changes will still be processed. -await backupState.awaitInitialBackup(); -``` - -## writeEvents$ - -You can listen to the `writeEvents$` Observable to get notified about written backup files. - -```javascript -const backupOptions = { - live: false, - directory: '/my-backup-folder/', - attachments: true -} -const backupState = myDatabase.backup(backupOptions); - -const subscription = backupState.writeEvents$.subscribe(writeEvent => console.dir(writeEvent)); -/* -> { - collectionName: 'humans', - documentId: 'foobar', - files: [ - '/my-backup-folder/foobar/document.json' - ], - deleted: false -} -*/ -``` - -## Limitations - -- It is currently not possible to import from a written backup. If you need this functionality, please make a pull request. diff --git a/docs/capacitor-database.html b/docs/capacitor-database.html deleted file mode 100644 index eee23058345..00000000000 --- a/docs/capacitor-database.html +++ /dev/null @@ -1,161 +0,0 @@ - - - - - -Capacitor Database Guide - SQLite, RxDB & More | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Capacitor Database - SQLite, RxDB and others

    -

    Capacitor is an open source native JavaScript runtime to build Web based Native apps. You can use it to create cross-platform iOS, Android, and Progressive Web Apps with the web technologies JavaScript, HTML, and CSS. -It is developed by the Ionic Team and provides a great alternative to create hybrid apps. Compared to React Native, Capacitor is more Web-Like because the JavaScript runtime supports most Web APIs like IndexedDB, fetch, and so on.

    -

    To read and write persistent data in Capacitor, there are multiple solutions which are shown in the following.

    -

    Capacitor

    -

    Database Solutions for Capacitor

    -

    Preferences API

    -

    Capacitor comes with a native Preferences API which is a simple, persistent key->value store for lightweight data, similar to the browsers localstorage or React Native AsyncStorage.

    -

    To use it, you first have to install it from npm npm install @capacitor/preferences and then you can import it and write/read data. -Notice that all calls to the preferences API are asynchronous so they return a Promise that must be await-ed.

    -
    import { Preferences } from '@capacitor/preferences';
    - 
    - 
    -// write
    -await Preferences.set({
    -  key: 'foo',
    -  value: 'baar',
    -});
    - 
    -// read
    -const { value } = await Preferences.get({ key: 'foo' }); // > 'bar'
    - 
    -// delete
    -await Preferences.remove({ key: 'foo' });
    -

    The preferences API is good when only a small amount of data needs to be stored and when no query capabilities besides the key access are required. Complex queries or other features like indexes or replication are not supported which makes the preferences API not suitable for anything more than storing simple data like user settings.

    -

    Localstorage/IndexedDB/WebSQL

    -

    Since Capacitor apps run in a web view, Web APIs like IndexedDB, Localstorage and WebSQL are available. But the default browser behavior is to clean up these storages regularly when they are not in use for a long time or the device is low on space. Therefore you cannot 100% rely on the persistence of the stored data and your application needs to expect that the data will be lost eventually.

    -

    Storing data in these storages can be done in browsers, because there is no other option. But in Capacitor iOS and Android, you should not rely on these.

    -

    SQLite

    -

    SQLite is a SQL based relational database written in C that was crafted to be embed inside of applications. Operations are written in the SQL query language and SQLite generally follows the PostgreSQL syntax.

    -

    To use SQLite in Capacitor, there are three options:

    - -

    It is recommended to use the @capacitor-community/sqlite because it has the best maintenance and is open source. Install it first npm install --save @capacitor-community/sqlite and then set the storage location for iOS apps:

    -
    {
    -    "plugins": {
    -        "CapacitorSQLite": {
    -            "iosDatabaseLocation": "Library/CapacitorDatabase"
    -        }
    -    }
    -}
    -

    Now you can create a database connection and use the SQLite database.

    -
    import { Capacitor } from '@capacitor/core';
    -import {
    -  CapacitorSQLite, SQLiteDBConnection, SQLiteConnection, capSQLiteSet,
    -  capSQLiteChanges, capSQLiteValues, capEchoResult, capSQLiteResult,
    -  capNCDatabasePathResult
    -} from '@capacitor-community/sqlite';
    - 
    -const sqlite = new SQLiteConnection(CapacitorSQLite);
    -const database: SQLiteDBConnection = await this.sqlite.createConnection(
    -    databaseName,
    -    encrypted,
    -    mode,
    -    version,
    -    readOnly
    -);
    -let { rows } = database.query('SELECT somevalue FROM sometable');
    -

    The downside of SQLite is that it is lacking many features that are handful when using a database together with an UI based application like your Capacitor app. For example it is not possible to observe queries or document fields. Also there is no realtime replication feature, you can only import json files. This makes SQLite a good solution when you just want to store data on the client, but when you want to sync data with a server or other clients or create big complex realtime applications, you have to use something else.

    -

    RxDB

    -

    RxDB

    -

    RxDB is an local first, NoSQL database for JavaScript Applications like hybrid apps. Because it is reactive, you can subscribe to all state changes like the result of a query or even a single field of a document. This is great for UI-based realtime applications in a way that makes it easy to develop realtime applications like what you need in Capacitor.

    -

    Because RxDB is made for Web applications, most of the available RxStorage plugins can be used to store and query data in a Capacitor app. However it is recommended to use the SQLite RxStorage because it stores the data on the filesystem of the device, not in the JavaScript runtime (like IndexedDB). Storing data on the filesystem ensures it is persistent and will not be cleaned up by any process. Also the performance of SQLite is much faster compared to IndexedDB, because SQLite does not have to go through a browsers permission layers. For the SQLite binding you should use the @capacitor-community/sqlite package.

    -

    Because the SQLite RxStorage is part of the 👑 Premium Plugins which must be purchased, it is recommended to use the LocalStorage RxStorage while testing and prototyping your Capacitor app.

    -

    To use the SQLite RxStorage in Capacitor you have to install all dependencies via npm install rxdb rxjs rxdb-premium @capacitor-community/sqlite.

    -

    For iOS apps you should add a database location in your Capacitor settings:

    -
    {
    -    "plugins": {
    -        "CapacitorSQLite": {
    -            "iosDatabaseLocation": "Library/CapacitorDatabase"
    -        }
    -    }
    -}
    -

    Then you can assemble the RxStorage and create a database with it:

    -
    1

    Import RxDB and SQLite

    import {
    -    createRxDatabase
    -} from 'rxdb/plugins/core';
    -import {
    -    CapacitorSQLite,
    -    SQLiteConnection
    -} from '@capacitor-community/sqlite';
    -import { Capacitor } from '@capacitor/core';
    -const sqlite = new SQLiteConnection(CapacitorSQLite);
    2

    Import the RxDB SQLite Storage

    import {
    -    getRxStorageSQLiteTrial,
    -    getSQLiteBasicsCapacitor
    -} from 'rxdb/plugins/storage-sqlite';
    3

    Create a Database with the Storage

    // create database
    -const myRxDatabase = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageSQLiteTrial({
    -        sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor)
    -    })
    -});
    4

    Add a Collection

    // create collections
    -const collections = await myRxDatabase.addCollections({
    -    humans: {
    -        schema: {
    -            version: 0,
    -            type: 'object',
    -            primaryKey: 'id',
    -            properties: {
    -                id: { type: 'string', maxLength: 100 },
    -                name: { type: 'string' },
    -                age: { type: 'number' }
    -              },
    -            required: ['id', 'name']
    -        }
    -    }
    -});
    5

    Insert a Document

    await collections.humans.insert({id: 'foo', name: 'bar'});
    6

    Run a Query

    const result = await collections.humans.find({
    -    selector: {
    -        name: 'bar'
    -    }
    -}).exec();
    7

    Observe a Query

    await collections.humans.find({
    -    selector: {
    -        name: 'bar'
    -    }
    -}).$.subscribe(result => {/* ... */});
    -

    Follow up

    -
    - - \ No newline at end of file diff --git a/docs/capacitor-database.md b/docs/capacitor-database.md deleted file mode 100644 index 149fdbe291e..00000000000 --- a/docs/capacitor-database.md +++ /dev/null @@ -1,243 +0,0 @@ -# Capacitor Database Guide - SQLite, RxDB & More - -> Explore Capacitor's top data storage solutions - from key-value to real-time databases. Compare SQLite, RxDB, and more in this in-depth guide. - -import {Tabs} from '@site/src/components/tabs'; -import {Steps} from '@site/src/components/steps'; - -# Capacitor Database - SQLite, RxDB and others - -[Capacitor](https://capacitorjs.com/) is an open source native JavaScript runtime to build Web based Native apps. You can use it to create cross-platform iOS, Android, and Progressive Web Apps with the web technologies JavaScript, HTML, and CSS. -It is developed by the Ionic Team and provides a great alternative to create hybrid apps. Compared to [React Native](./react-native-database.md), Capacitor is more Web-Like because the JavaScript runtime supports most Web APIs like IndexedDB, fetch, and so on. - -To read and write persistent data in Capacitor, there are multiple solutions which are shown in the following. - - - -## Database Solutions for Capacitor - -### Preferences API - -Capacitor comes with a native [Preferences API](https://capacitorjs.com/docs/apis/preferences) which is a simple, persistent key->value store for lightweight data, similar to the browsers localstorage or React Native [AsyncStorage](./react-native-database.md#asyncstorage). - -To use it, you first have to install it from npm `npm install @capacitor/preferences` and then you can import it and write/read data. -Notice that all calls to the preferences API are asynchronous so they return a `Promise` that must be `await`-ed. - -```ts -import { Preferences } from '@capacitor/preferences'; - -// write -await Preferences.set({ - key: 'foo', - value: 'baar', -}); - -// read -const { value } = await Preferences.get({ key: 'foo' }); // > 'bar' - -// delete -await Preferences.remove({ key: 'foo' }); -``` - -The preferences API is good when only a small amount of data needs to be stored and when no query capabilities besides the key access are required. Complex queries or other features like indexes or replication are not supported which makes the preferences API not suitable for anything more than storing simple data like user settings. - -### Localstorage/IndexedDB/WebSQL - -Since Capacitor apps run in a web view, Web APIs like IndexedDB, [Localstorage](./articles/localstorage.md) and WebSQL are available. But the default browser behavior is to clean up these storages regularly when they are not in use for a long time or the device is low on space. Therefore you cannot 100% rely on the persistence of the stored data and your application needs to expect that the data will be lost eventually. - -Storing data in these storages can be done in browsers, because there is no other option. But in Capacitor iOS and Android, you should not rely on these. - -### SQLite - -SQLite is a SQL based relational database written in C that was crafted to be embed inside of applications. Operations are written in the SQL query language and SQLite generally follows the PostgreSQL syntax. - -To use SQLite in Capacitor, there are three options: - -- The [@capacitor-community/sqlite](https://github.com/capacitor-community/sqlite) package -- The [cordova-sqlite-storage](https://github.com/storesafe/cordova-sqlite-storage) package -- The non-free [Ionic](./articles/ionic-database.md) [Secure Storage](https://ionic.io/products/secure-storage) which comes at **999$** per month. - -It is recommended to use the `@capacitor-community/sqlite` because it has the best maintenance and is open source. Install it first `npm install --save @capacitor-community/sqlite` and then set the storage location for iOS apps: - -```json -{ - "plugins": { - "CapacitorSQLite": { - "iosDatabaseLocation": "Library/CapacitorDatabase" - } - } -} -``` - -Now you can create a database connection and use the SQLite database. - -```ts -import { Capacitor } from '@capacitor/core'; -import { - CapacitorSQLite, SQLiteDBConnection, SQLiteConnection, capSQLiteSet, - capSQLiteChanges, capSQLiteValues, capEchoResult, capSQLiteResult, - capNCDatabasePathResult -} from '@capacitor-community/sqlite'; - -const sqlite = new SQLiteConnection(CapacitorSQLite); -const database: SQLiteDBConnection = await this.sqlite.createConnection( - databaseName, - encrypted, - mode, - version, - readOnly -); -let { rows } = database.query('SELECT somevalue FROM sometable'); -``` - -The downside of SQLite is that it is lacking many features that are handful when using a database together with an UI based application like your Capacitor app. For example it is not possible to observe queries or document fields. Also there is no realtime replication feature, you can only import json files. This makes SQLite a good solution when you just want to store data on the client, but when you want to sync data with a server or other clients or create big complex realtime applications, you have to use something else. - -### RxDB - - - -[RxDB](https://rxdb.info/) is an local first, NoSQL database for JavaScript Applications like hybrid apps. Because it is reactive, you can subscribe to all state changes like the result of a query or even a single field of a document. This is great for UI-based realtime applications in a way that makes it easy to develop realtime applications like what you need in Capacitor. - -Because RxDB is made for Web applications, most of the [available RxStorage](./rx-storage.md) plugins can be used to store and query data in a Capacitor app. However it is recommended to use the [SQLite RxStorage](./rx-storage-sqlite.md) because it stores the data on the filesystem of the device, not in the JavaScript runtime (like IndexedDB). Storing data on the filesystem ensures it is persistent and will not be cleaned up by any process. Also the performance of SQLite is [much faster](./rx-storage.md#performance-comparison) compared to IndexedDB, because SQLite does not have to go through a browsers permission layers. For the SQLite binding you should use the [@capacitor-community/sqlite](https://github.com/capacitor-community/sqlite) package. - -Because the SQLite RxStorage is part of the [👑 Premium Plugins](/premium/) which must be purchased, it is recommended to use the [LocalStorage RxStorage](./rx-storage-localstorage.md) while testing and prototyping your Capacitor app. - -To use the SQLite RxStorage in Capacitor you have to install all dependencies via `npm install rxdb rxjs rxdb-premium @capacitor-community/sqlite`. - -For iOS apps you should add a database location in your Capacitor settings: - -```json -{ - "plugins": { - "CapacitorSQLite": { - "iosDatabaseLocation": "Library/CapacitorDatabase" - } - } -} -``` - -Then you can assemble the RxStorage and create a database with it: - - - -### Import RxDB and SQLite - -```ts -import { - createRxDatabase -} from 'rxdb/plugins/core'; -import { - CapacitorSQLite, - SQLiteConnection -} from '@capacitor-community/sqlite'; -import { Capacitor } from '@capacitor/core'; -const sqlite = new SQLiteConnection(CapacitorSQLite); -``` - -### Import the RxDB SQLite Storage - - - -#### RxDB Core - -```ts -import { - getRxStorageSQLiteTrial, - getSQLiteBasicsCapacitor -} from 'rxdb/plugins/storage-sqlite'; -``` - -#### RxDB Premium 👑 - -```ts -import { - getRxStorageSQLite, - getSQLiteBasicsCapacitor -} from 'rxdb-premium/plugins/storage-sqlite'; -``` - - - -### Create a Database with the Storage - - - -#### RxDB Core - -```ts -// create database -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageSQLiteTrial({ - sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor) - }) -}); -``` - -#### RxDB Premium 👑 - -```ts -// create database -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor) - }) -}); -``` - - - -### Add a Collection - -```ts -// create collections -const collections = await myRxDatabase.addCollections({ - humans: { - schema: { - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string', maxLength: 100 }, - name: { type: 'string' }, - age: { type: 'number' } - }, - required: ['id', 'name'] - } - } -}); -``` - -### Insert a Document - -```ts -await collections.humans.insert({id: 'foo', name: 'bar'}); -``` - -### Run a Query - -```ts -const result = await collections.humans.find({ - selector: { - name: 'bar' - } -}).exec(); -``` - -### Observe a Query - -```ts -await collections.humans.find({ - selector: { - name: 'bar' - } -}).$.subscribe(result => {/* ... */}); -``` - - - -## Follow up - -- If you haven't done yet, you should start learning about RxDB with the [Quickstart Tutorial](./quickstart.md). -- There is a followup list of other [client side database alternatives](./alternatives.md). diff --git a/docs/chat/index.html b/docs/chat/index.html deleted file mode 100644 index 24933bd33cd..00000000000 --- a/docs/chat/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -Chat - RxDB - JavaScript Database | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/cleanup.html b/docs/cleanup.html deleted file mode 100644 index 9ae5a13450d..00000000000 --- a/docs/cleanup.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - -Cleanup | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    🧹 Cleanup

    -

    To make the replication work, and for other reasons, RxDB has to keep deleted documents in storage so that it can replicate their deletion state. -This ensures that when a client is offline, the deletion state is still known and can be replicated with the backend when the client goes online again.

    -

    Keeping too many deleted documents in the storage, can slow down queries or fill up too much disc space. -With the cleanup plugin, RxDB will run cleanup cycles that clean up deleted documents when it can be done safely.

    -

    Installation

    -
    import { addRxPlugin } from 'rxdb';
    -import { RxDBCleanupPlugin } from 'rxdb/plugins/cleanup';
    -addRxPlugin(RxDBCleanupPlugin);
    -

    Create a database with cleanup options

    -

    You can set a specific cleanup policy when a RxDatabase is created. For most use cases, the defaults should be ok.

    -
    import { createRxDatabase } from 'rxdb';
    -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
    -const db = await createRxDatabase({
    -  name: 'heroesdb',
    -  storage: getRxStorageLocalstorage(),
    -  cleanupPolicy: {
    -      /**
    -       * The minimum time in milliseconds for how long
    -       * a document has to be deleted before it is
    -       * purged by the cleanup.
    -       * [default=one month]
    -       */
    -      minimumDeletedTime: 1000 * 60 * 60 * 24 * 31, // one month,
    -      /**
    -       * The minimum amount of that that the RxCollection must have existed.
    -       * This ensures that at the initial page load, more important
    -       * tasks are not slowed down because a cleanup process is running.
    -       * [default=60 seconds]
    -       */
    -      minimumCollectionAge: 1000 * 60, // 60 seconds
    -      /**
    -       * After the initial cleanup is done,
    -       * a new cleanup is started after [runEach] milliseconds 
    -       * [default=5 minutes]
    -       */
    -      runEach: 1000 * 60 * 5, // 5 minutes
    -      /**
    -       * If set to true,
    -       * RxDB will await all running replications
    -       * to not have a replication cycle running.
    -       * This ensures we do not remove deleted documents
    -       * when they might not have already been replicated.
    -       * [default=true]
    -       */
    -      awaitReplicationsInSync: true,
    -      /**
    -       * If true, it will only start the cleanup
    -       * when the current instance is also the leader.
    -       * This ensures that when RxDB is used in multiInstance mode,
    -       * only one instance will start the cleanup.
    -       * [default=true]
    -       */
    -      waitForLeadership: true
    -  }
    -});
    -

    Calling cleanup manually

    -

    You can manually run a cleanup per collection by calling RxCollection.cleanup().

    -
     
    -/**
    - * Manually run the cleanup with the
    - * minimumDeletedTime from the cleanupPolicy.
    - */
    -await myRxCollection.cleanup();
    - 
    - 
    -/**
    - * Overwrite the minimumDeletedTime
    - * be setting it explicitly (time in milliseconds)
    - */
    -await myRxCollection.cleanup(1000);
    - 
    -/**
    - * Purge all deleted documents no
    - * matter when they where deleted
    - * by setting minimumDeletedTime to zero.
    - */
    -await myRxCollection.cleanup(0);
    -

    Using the cleanup plugin to empty a collection

    -

    When you have a collection with documents and you want to empty it by purging all documents, the recommended way is to call myRxCollection.remove(). However, this will destroy the JavaScript class of the collection and stop all listeners and observables. -Sometimes the better option might be to manually delete all documents and then use the cleanup plugin to purge the deleted documents:

    -
    // delete all documents
    -await myRxCollection.find().remove();
    -// purge all deleted documents
    -await myRxCollection.cleanup(0);
    -

    FAQ

    -
    When does the cleanup run

    The cleanup cycles are optimized to run only when the database is idle and it is unlikely that another database interaction performance will be decreased in the meantime. For example, by default, the cleanup does not run in the first 60 seconds of the creation of a collection to ensure the initial page load of your website does not slow down. Also, we use mechanisms like the requestIdleCallback() API to improve the correct timing of the cleanup cycle.

    - - \ No newline at end of file diff --git a/docs/cleanup.md b/docs/cleanup.md deleted file mode 100644 index d23f1505247..00000000000 --- a/docs/cleanup.md +++ /dev/null @@ -1,118 +0,0 @@ -# Cleanup - -> Optimize storage and speed up queries with RxDB's Cleanup Plugin, automatically removing old deleted docs while preserving replication states. - -# 🧹 Cleanup - -To make the replication work, and for other reasons, RxDB has to keep deleted documents in storage so that it can replicate their deletion state. -This ensures that when a client is offline, the deletion state is still known and can be replicated with the backend when the client goes online again. - -Keeping too many deleted documents in the storage, can slow down queries or fill up too much disc space. -With the cleanup plugin, RxDB will run cleanup cycles that clean up deleted documents when it can be done safely. - -## Installation - -```ts -import { addRxPlugin } from 'rxdb'; -import { RxDBCleanupPlugin } from 'rxdb/plugins/cleanup'; -addRxPlugin(RxDBCleanupPlugin); -``` - -## Create a database with cleanup options - -You can set a specific cleanup policy when a `RxDatabase` is created. For most use cases, the defaults should be ok. - -```ts -import { createRxDatabase } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -const db = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage(), - cleanupPolicy: { - /** - * The minimum time in milliseconds for how long - * a document has to be deleted before it is - * purged by the cleanup. - * [default=one month] - */ - minimumDeletedTime: 1000 * 60 * 60 * 24 * 31, // one month, - /** - * The minimum amount of that that the RxCollection must have existed. - * This ensures that at the initial page load, more important - * tasks are not slowed down because a cleanup process is running. - * [default=60 seconds] - */ - minimumCollectionAge: 1000 * 60, // 60 seconds - /** - * After the initial cleanup is done, - * a new cleanup is started after [runEach] milliseconds - * [default=5 minutes] - */ - runEach: 1000 * 60 * 5, // 5 minutes - /** - * If set to true, - * RxDB will await all running replications - * to not have a replication cycle running. - * This ensures we do not remove deleted documents - * when they might not have already been replicated. - * [default=true] - */ - awaitReplicationsInSync: true, - /** - * If true, it will only start the cleanup - * when the current instance is also the leader. - * This ensures that when RxDB is used in multiInstance mode, - * only one instance will start the cleanup. - * [default=true] - */ - waitForLeadership: true - } -}); -``` - -## Calling cleanup manually - -You can manually run a cleanup per collection by calling `RxCollection.cleanup()`. - -```ts - -/** - * Manually run the cleanup with the - * minimumDeletedTime from the cleanupPolicy. - */ -await myRxCollection.cleanup(); - -/** - * Overwrite the minimumDeletedTime - * be setting it explicitly (time in milliseconds) - */ -await myRxCollection.cleanup(1000); - -/** - * Purge all deleted documents no - * matter when they where deleted - * by setting minimumDeletedTime to zero. - */ -await myRxCollection.cleanup(0); -``` - -## Using the cleanup plugin to empty a collection - -When you have a collection with documents and you want to empty it by purging all documents, the recommended way is to call `myRxCollection.remove()`. However, this will destroy the JavaScript class of the collection and stop all listeners and observables. -Sometimes the better option might be to manually delete all documents and then use the cleanup plugin to purge the deleted documents: - -```ts -// delete all documents -await myRxCollection.find().remove(); -// purge all deleted documents -await myRxCollection.cleanup(0); -``` - -## FAQ - -
    - When does the cleanup run - - The cleanup cycles are optimized to run only when the database is idle and it is unlikely that another database interaction performance will be decreased in the meantime. For example, by default, the cleanup does not run in the first 60 seconds of the creation of a collection to ensure the initial page load of your website does not slow down. Also, we use mechanisms like the `requestIdleCallback()` API to improve the correct timing of the cleanup cycle. - -
    diff --git a/docs/code/index.html b/docs/code/index.html deleted file mode 100644 index 7e40caed251..00000000000 --- a/docs/code/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -Code - RxDB - JavaScript Database | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/consulting/index.html b/docs/consulting/index.html deleted file mode 100644 index 950af131c20..00000000000 --- a/docs/consulting/index.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - -RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    You've got questions?

    The RxDB core maintainer has the answers. Schedule a compact consultancy session for quick fixes and suggestions on how you should use RxDB or related technologies.

    180€ / 1 hour session

    Need someone that builds for you?

    Our trusted partners handle the full development and implementation of your local JavaScript database solution. You can relax while they bring your vision to life.

    Get started
    1
    Share your project

    Tell us what you're aiming to achieve and what technical details matter most, so we can get a clear picture of your requirements.
    2
    Get paired

    We'll match you with a reliable RxDB expert or partner whose skills fit your project's needs.
    3
    Build and collaborate

    Your partner will team up with you to create, refine, and deliver the solution you’re looking for.

    Become a Partner?

    Become part of our partner network for freelance developers and agencies. Get in touch with clients seeking skilled experts to build their apps based on RxDB.

    Apply as a partner
    - - \ No newline at end of file diff --git a/docs/contribute.md b/docs/contribute.md deleted file mode 100644 index b04d5ed0255..00000000000 --- a/docs/contribute.md +++ /dev/null @@ -1,49 +0,0 @@ -# Contribute - -> Got a fix or fresh idea? Learn how to contribute to RxDB, run tests, and shape the future of this cutting-edge NoSQL database for JavaScript. - -# Contribution - -We are open to, and grateful for, any contributions made by the community. - -# Developing - -## Requirements - -Before you can start developing, do the following: - -1. Make sure you have installed nodejs with the version stated in the [.nvmrc](https://github.com/pubkey/rxdb/blob/master/.nvmrc) -2. Clone the repository `git clone https://github.com/pubkey/rxdb.git` -3. Install the dependencies `cd rxdb && npm install` -4. Make sure that the tests work for you. At first, try it out with `npm run test:node:memory` which tests the memory storage in node. In the [package.json](https://github.com/pubkey/rxdb/blob/master/package.json) you can find more scripts to run the tests with different storages. - -## Adding tests - -Before you start creating a bugfix or a feature, you should create a test to reproduce it. Tests are in the `test/unit`-folder. -If you want to reproduce a bug, you can modify the test in [this file](https://github.com/pubkey/rxdb/blob/master/test/unit/bug-report.test.ts). - -## Making a PR - -If you make a pull-request, ensure the following: - -1. Every feature or bugfix must be committed together with a unit-test which ensures everything works as expected. -2. Do not commit build-files (anything in the `dist`-folder) -3. Before you add non-trivial changes, create an issue to discuss if this will be merged and you don't waste your time. -4. To run the unit and integration-tests, do `npm run test` and ensure everything works as expected - -## Getting help - -If you need help with your contribution, ask at [discord](https://rxdb.info/chat/). - -## No-Go - -When reporting a bug, you need to make a PR with a test case that runs in the CI and reproduces your problem. -Sending a link with a repo does not help the maintainer because installing random peoples projects is time consuming and dangerous. -Also the maintainer will never go on a bug hunt based on your plain description. Either you report the bug with a test case, or the maintainer will likely not help you. - -# Docs - -The source of the documentation is at the `docs-src`-folder. -To read the docs locally, run `npm run docs:install && npm run docs:serve` and open `http://localhost:4000/` - -# Thank you for contributing! diff --git a/docs/contribution.html b/docs/contribution.html deleted file mode 100644 index c3ed1f1e062..00000000000 --- a/docs/contribution.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - -Contribute | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Contribution

    -

    We are open to, and grateful for, any contributions made by the community.

    -

    Developing

    -

    Requirements

    -

    Before you can start developing, do the following:

    -
      -
    1. Make sure you have installed nodejs with the version stated in the .nvmrc
    2. -
    3. Clone the repository git clone https://github.com/pubkey/rxdb.git
    4. -
    5. Install the dependencies cd rxdb && npm install
    6. -
    7. Make sure that the tests work for you. At first, try it out with npm run test:node:memory which tests the memory storage in node. In the package.json you can find more scripts to run the tests with different storages.
    8. -
    -

    Adding tests

    -

    Before you start creating a bugfix or a feature, you should create a test to reproduce it. Tests are in the test/unit-folder. -If you want to reproduce a bug, you can modify the test in this file.

    -

    Making a PR

    -

    If you make a pull-request, ensure the following:

    -
      -
    1. Every feature or bugfix must be committed together with a unit-test which ensures everything works as expected.
    2. -
    3. Do not commit build-files (anything in the dist-folder)
    4. -
    5. Before you add non-trivial changes, create an issue to discuss if this will be merged and you don't waste your time.
    6. -
    7. To run the unit and integration-tests, do npm run test and ensure everything works as expected
    8. -
    -

    Getting help

    -

    If you need help with your contribution, ask at discord.

    -

    No-Go

    -

    When reporting a bug, you need to make a PR with a test case that runs in the CI and reproduces your problem. -Sending a link with a repo does not help the maintainer because installing random peoples projects is time consuming and dangerous. -Also the maintainer will never go on a bug hunt based on your plain description. Either you report the bug with a test case, or the maintainer will likely not help you.

    -

    Docs

    -

    The source of the documentation is at the docs-src-folder. -To read the docs locally, run npm run docs:install && npm run docs:serve and open http://localhost:4000/

    -

    Thank you for contributing!

    - - \ No newline at end of file diff --git a/docs/crdt.html b/docs/crdt.html deleted file mode 100644 index fa30db02625..00000000000 --- a/docs/crdt.html +++ /dev/null @@ -1,300 +0,0 @@ - - - - - -CRDT - Conflict-free replicated data type Database | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxDB CRDT Plugin

    -

    Whenever there are multiple instances in a distributed system, data writes can cause conflicts. Two different clients could do a write to the same document at the same time or while they are both offline. When the clients replicate the document state with the server, a conflict emerges that must be resolved by the system.

    -

    In RxDB, conflicts are normally resolved by setting a conflictHandler when creating a collection. The conflict handler is a JavaScript function that gets the two conflicting states of the same document and it will return the resolved document state. -The default conflict handler will always drop the fork state and use the master state to ensure that clients that have been offline for a long time, do not overwrite other clients changes when they go online again.

    -

    document replication conflict

    -

    With CRDTs (short for Conflict-free replicated data type), all document -writes are represented as CRDT operations in plain JSON. The CRDT operations are stored together with the document and each time a conflict arises, the CRDT conflict handler will automatically merge the operations in a deterministic way. Using CRDTs is an easy way to "magically" handle all conflict problems in your application by storing the deltas of writes together with the document data.

    -

    CRDT Conflict-free replicated data type

    -

    RxDB CRDT operations

    -

    In RxDB, a CRDT operation is defined with NoSQL update operators, like you might know them from MongoDB update operations or the RxDB update plugin. -To run the operators, RxDB uses the mingo library.

    -

    A CRDT operator example:

    -
    const myCRDTOperation = {
    -    // increment the points field by +1
    -    $inc: {
    -        points: 1
    -    },
    -    // set the modified field to true
    -    $set: {
    -        modified: true
    -    }
    -};
    -

    Operators

    -

    At the moment, not all possible operators are implemented in mingo, if you need additional ones, you should make a pull request there.

    -

    The following operators can be used at this point in time:

    -
      -
    • $min
    • -
    • $max
    • -
    • $inc
    • -
    • $set
    • -
    • $unset
    • -
    • $push
    • -
    • $addToSet
    • -
    • $pop
    • -
    • $pullAll
    • -
    • $rename
    • -
    -

    For the exact definition on how each operator behaves, check out the MongoDB documentation on update operators.

    -

    Installation

    -

    To use CRDTs with RxDB, you need the following:

    -
      -
    • Add the CRDT plugin via addRxPlugin.
    • -
    • Add a field to your schema that defines where to store the CRDT operations via getCRDTSchemaPart()
    • -
    • Set the crdt options in your schema.
    • -
    • Do NOT set a custom conflict handler, the plugin will use its own one.
    • -
    -
    // import the relevant parts from the CRDT plugin
    -import {
    -    getCRDTSchemaPart,
    -    RxDBcrdtPlugin
    -} from 'rxdb/plugins/crdt';
    - 
    -// add the CRDT plugin to RxDB
    -import { addRxPlugin } from 'rxdb';
    -addRxPlugin(RxDBcrdtPlugin);
    - 
    -// create a database
    -import { createRxDatabase } from 'rxdb';
    -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
    -const myDatabase = await createRxDatabase({
    -  name: 'heroesdb',
    -  storage: getRxStorageLocalstorage()
    -});
    - 
    -// create a schema with the CRDT options
    -const mySchema = {
    -    version: 0,
    -    primaryKey: 'id',
    -    type: 'object',
    -    properties: {
    -        id: {
    -            type: 'string',
    -            maxLength: 100
    -        },
    -        points: {
    -            type: 'number',
    -            maximum: 100,
    -            minimum: 0
    -        },
    -        crdts: getCRDTSchemaPart() // use this field to store the CRDT operations
    -    },
    -    required: ['id', 'points'],
    -    crdt: { // CRDT options
    -        field: 'crdts'
    -    }
    -}
    - 
    -// add a collection
    -await db.addCollections({
    -    users: {
    -        schema: mySchema
    -    }
    -});
    - 
    -// insert a document
    -const myDocument = await db.users.insert({id: 'alice', points: 0});
    - 
    -// run a CRDT operation that increments the 'points' by one
    -await myDocument.updateCRDT({
    -    ifMatch: {
    -        $inc: {
    -            points: 1
    -        }
    -    }
    -});
    -

    Conditional CRDT operations

    -

    By default, all CRDTs operations will be run to build the current document state. But in many cases, more granular operations are required to better reflect the desired business logic. For these cases, conditional CRDTs can be used.

    -

    For example if you have a field points with a maximum of 100, you might want to only run the $inc operation, if the points value is less than 100. -In an conditional CRDT, you can specify a selector and the operation sets ifMatch and ifNotMatch. At each time the CRDT is applied to the document state, first the selector will run and evaluate which operations path must be used.

    -
    await myDocument.updateCRDT({
    -    // only if the selector matches, the ifMatch operation will run
    -    selector: {
    -        age: {
    -            $lt: 100
    -        }
    -    },
    -    // an operation that runs if the selector matches
    -    ifMatch: {
    -        $inc: {
    -            points: 1
    -        }
    -    },
    -    // if the selector does NOT match, you could run a different operation instead
    -    ifNotMatch: {
    -        // ...
    -    }
    -});
    -

    Running multiples operations at once

    -

    By default, one CRDT operation is applied to the document in a single database write. -To represent more complex logic chains, it might make sense to use multiple CRDTs and write them at once inside of a single atomic document write.

    -

    For these cases, the updateCRDT() method allows to pass an array of operations.

    -
    await myDocument.updateCRDT([
    -    {
    -        selector: { /** ... **/ },
    -        ifMatch: { /** ... **/ }
    -    },
    -    {
    -        selector: { /** ... **/ },
    -        ifMatch: { /** ... **/ }
    -    },
    -    {
    -        selector: { /** ... **/ },
    -        ifMatch: { /** ... **/ }
    -    },
    -    {
    -        selector: { /** ... **/ },
    -        ifMatch: { /** ... **/ }
    -    }
    -]);
    -

    CRDTs on inserts

    -

    When CRDTs are enabled with the plugin, all insert operations are automatically mapped as CRDT operation with the $set operator.

    -
    // Calling RxCollection.insert()
    -await myRxCollection.insert({
    -    id: 'foo'
    -    points: 1
    -});
    -// is exactly equal to calling insertCRDT()
    -await myRxCollection.insertCRDT({
    -    ifMatch: {
    -        $set: {
    -            id: 'foo'
    -            points: 1
    -        }
    -    }
    -});
    -

    When the same document is inserted in multiple client instances and then replicated, a conflict will emerge and the insert-CRDTs will overwrite each other in a deterministic order. -You can use insertCRDT() to make conditional insert operations with any logic. To check for the previous existence of a document, use the $exists query operation on the primary key of the document.

    -
    await myRxCollection.insertCRDT({
    -    selector: {
    -        // only run if the document did not exist before.
    -        id: { $exists: false }
    -    }, 
    -    ifMatch: {
    -        // if the document did not exist, insert it
    -        $set: {
    -            id: 'foo'
    -            points: 1
    -        }
    -    },
    -    ifNotMatch: {
    -        // if document existed already, increment the points by +1
    -        $inc: {
    -            points: 1
    -        }
    -    }
    -});
    -

    Deleting documents

    -

    You can delete a document with a CRDT operation by setting _deleted to true. Calling RxDocument.remove() will do exactly the same when CRDTs are activated.

    -
    await doc.updateCRDT({
    -    ifMatch: {
    -        $set: {
    -            _deleted: true
    -        }
    -    }
    -});
    - 
    -// OR
    -await doc.remove();
    -

    CRDTs with replication

    -

    CRDT operations are stored inside of a special field besides your 'normal' document fields. -When replicating document data with the RxDB replication or the CouchDB replication or even any custom replication, the CRDT operations must be replicated together with the document data as if they would be 'normal' a document property.

    -

    When any instances makes a write to the document, it is required to update the CRDT operations accordingly. For example if your custom backend updates a document, it must also do that by adding a CRDT operation. In dev-mode RxDB will refuse to store any document data where the document properties do not match the result of the CRDT operations.

    -

    Why not automerge.js or yjs?

    -

    There are already CRDT libraries out there that have been considered to be used with RxDB. The biggest ones are automerge and yjs. The decision was made to not use these but instead go for a more NoSQL way of designing the CRDT format because:

    -
      -
    • Users do not have to learn a new syntax but instead can use the NoSQL query operations which they already know to manipulate the JSON data of a document.
    • -
    • RxDB is often used to replicate data with any custom backend on an already existing infrastructure. Using NoSQL operators instead of binary data in CRDTs, makes it easy to implement the exact same logic on these backends so that the backend can also do document writes and still be compliant to the RxDB CRDT plugin.
    • -
    -

    So instead of using YJS or Automerge with a database, you can use RxDB with the CRDT plugin to have a more database specific CRDT approach. This gives you additional features for free such as schema validation or data migration.

    -

    When to not use CRDTs

    -

    CRDT can only be use when your business logic allows to represent document changes via static json operators. -If you can have cases where user interaction is required to correctly merge conflicting document states, you cannot use CRDTs for that.

    -

    Also when CRDTs are used, it is no longer allowed to do non-CRDT writes to the document properties.

    -

    CRDT Alternative

    -

    While the CRDT plugin can automatically merge concurrent document updates, it is not the only way to resolve conflicts in RxDB. -An alternative approach to CRDT is to use RxDB's built-in conflict handling system.

    -
    -

    Why use conflict handlers instead of CRDT?

    -
    -

    Conflict handlers offer a simpler and more flexible way to manage data conflicts. Instead of encoding changes as CRDT operations, you define how RxDB should decide which document version "wins" with plain JavaScript code. This approach is easier to reason about because it works directly with your domain logic. For example, you can compare timestamps, prioritize certain fields, or even involve user interaction to resolve conflicts.

    -

    Conflict handlers are:

    -
      -
    • Easier to understand: you work with plain document states instead of CRDT operations.
    • -
    • Fully customizable: you can define any merge strategy, from simple last-write-wins to complex rule-based logic.
    • -
    • Compatible with all data types: unlike CRDTs, which are best suited for numeric or set-based updates.
    • -
    • Transparent: you always know which state is being written and why.
    • -
    -

    Downsides of CRDTs

    -

    CRDTs are powerful for automatic conflict-free merging, but they also come with trade-offs:

    -
      -
    • Higher conceptual complexity: CRDTs require understanding of operation semantics, version vectors, and merge determinism.
    • -
    • Limited flexibility: you can only express changes that fit the supported JSON-style update operators.
    • -
    • Difficult debugging: when merges don't behave as expected, it can be hard to trace the sequence of CRDT operations that led to a state.
    • -
    • Overhead for simple cases: if your data rarely conflicts or needs human oversight, using CRDTs can add unnecessary complexity.
    • -
    -

    When to choose conflict handlers

    -

    Use conflict handlers as CRDT alternative if:

    -
      -
    • You want full control over merge logic.
    • -
    • Your data model includes contextual or user-specific decisions.
    • -
    • You prefer a straightforward, rule-based resolution system over automatic merges.
    • -
    -

    Use CRDTs if:

    -
      -
    • Your app performs frequent offline writes that can be merged deterministically.
    • -
    • Your data can be represented as additive, numeric, or array-based updates.
    • -
    • You want minimal manual intervention during replication.
    • -
    -

    Both methods are first-class citizens in RxDB. CRDTs focus on automatic, deterministic merging, while conflict handlers emphasize clarity, flexibility, and control.

    -

    Example: merging different fields with conflict handlers instead of CRDT

    -

    For example, imagine two users edit different fields of the same document at the same time. One updates a name, the other updates a score. A custom conflict handler can merge both changes so no data is lost:

    -
    const mergeFieldsHandler = {
    -  isEqual: (a, b) => JSON.stringify(a) === JSON.stringify(b),
    -  resolve: (input) => {
    -    return {
    -      ...input.realMasterState,
    -      name: input.newDocumentState.name ?? input.realMasterState.name,
    -      score: Math.max(input.newDocumentState.score, input.realMasterState.score)
    -    };
    -  }
    -};
    -

    In this example, if the two versions change different properties, the final merged document includes both updates. This kind of logic is often easier to reason about than designing equivalent CRDT operations.

    - - \ No newline at end of file diff --git a/docs/crdt.md b/docs/crdt.md deleted file mode 100644 index 95a3c3bd45b..00000000000 --- a/docs/crdt.md +++ /dev/null @@ -1,334 +0,0 @@ -# CRDT - Conflict-free replicated data type Database - -> Learn how RxDB's CRDT Plugin resolves document conflicts automatically in distributed systems, ensuring seamless merges and consistent data. - -# RxDB CRDT Plugin - -Whenever there are multiple instances in a distributed system, data writes can cause conflicts. Two different clients could do a write to the same document at the same time or while they are both offline. When the clients replicate the document state with the server, a conflict emerges that must be resolved by the system. - -In [RxDB](./), conflicts are normally resolved by setting a `conflictHandler` when creating a collection. The conflict handler is a JavaScript function that gets the two conflicting states of the same document and it will return the resolved document state. -The [default conflict handler](./replication.md#conflict-handling) will always drop the fork state and use the master state to ensure that clients that have been offline for a long time, do not overwrite other clients changes when they go online again. - - - -With CRDTs (short for [Conflict-free replicated data type](https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type)), all document -writes are represented as CRDT operations in plain JSON. The CRDT operations are stored together with the document and each time a conflict arises, the CRDT conflict handler will automatically merge the operations in a deterministic way. Using CRDTs is an easy way to "magically" handle all conflict problems in your application by storing the deltas of writes together with the document data. - - - -## RxDB CRDT operations - -In RxDB, a CRDT operation is defined with NoSQL update operators, like you might know them from [MongoDB update operations](https://www.mongodb.com/docs/manual/reference/operator/update/) or the [RxDB update plugin](./rx-document.md#update). -To run the operators, RxDB uses the [mingo library](https://github.com/kofrasa/mingo#updating-documents). - -A CRDT operator example: - -```js -const myCRDTOperation = { - // increment the points field by +1 - $inc: { - points: 1 - }, - // set the modified field to true - $set: { - modified: true - } -}; -``` - -### Operators - -At the moment, not all possible operators are implemented in [mingo](https://github.com/kofrasa/mingo#updating-documents), if you need additional ones, you should make a pull request there. - -The following operators can be used at this point in time: -- `$min` -- `$max` -- `$inc` -- `$set` -- `$unset` -- `$push` -- `$addToSet` -- `$pop` -- `$pullAll` -- `$rename` - -For the exact definition on how each operator behaves, check out the [MongoDB documentation on update operators](https://www.mongodb.com/docs/manual/reference/operator/update/). - -## Installation - -To use CRDTs with RxDB, you need the following: - -- Add the CRDT plugin via `addRxPlugin`. -- Add a field to your schema that defines where to store the CRDT operations via `getCRDTSchemaPart()` -- Set the `crdt` options in your schema. -- Do **NOT** set a custom conflict handler, the plugin will use its own one. - -```ts -// import the relevant parts from the CRDT plugin -import { - getCRDTSchemaPart, - RxDBcrdtPlugin -} from 'rxdb/plugins/crdt'; - -// add the CRDT plugin to RxDB -import { addRxPlugin } from 'rxdb'; -addRxPlugin(RxDBcrdtPlugin); - -// create a database -import { createRxDatabase } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -const myDatabase = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage() -}); - -// create a schema with the CRDT options -const mySchema = { - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 - }, - points: { - type: 'number', - maximum: 100, - minimum: 0 - }, - crdts: getCRDTSchemaPart() // use this field to store the CRDT operations - }, - required: ['id', 'points'], - crdt: { // CRDT options - field: 'crdts' - } -} - -// add a collection -await db.addCollections({ - users: { - schema: mySchema - } -}); - -// insert a document -const myDocument = await db.users.insert({id: 'alice', points: 0}); - -// run a CRDT operation that increments the 'points' by one -await myDocument.updateCRDT({ - ifMatch: { - $inc: { - points: 1 - } - } -}); -``` - -## Conditional CRDT operations - -By default, all CRDTs operations will be run to build the current document state. But in many cases, more granular operations are required to better reflect the desired business logic. For these cases, conditional CRDTs can be used. - -For example if you have a field `points` with a `maximum` of `100`, you might want to only run the `$inc` operation, if the `points` value is less than `100`. -In an conditional CRDT, you can specify a `selector` and the operation sets `ifMatch` and `ifNotMatch`. At each time the CRDT is applied to the document state, first the selector will run and evaluate which operations path must be used. - -```ts -await myDocument.updateCRDT({ - // only if the selector matches, the ifMatch operation will run - selector: { - age: { - $lt: 100 - } - }, - // an operation that runs if the selector matches - ifMatch: { - $inc: { - points: 1 - } - }, - // if the selector does NOT match, you could run a different operation instead - ifNotMatch: { - // ... - } -}); -``` - -## Running multiples operations at once - -By default, one CRDT operation is applied to the document in a single database write. -To represent more complex logic chains, it might make sense to use multiple CRDTs and write them at once inside of a single atomic document write. - -For these cases, the `updateCRDT()` method allows to pass an array of operations. - -```ts -await myDocument.updateCRDT([ - { - selector: { /** ... **/ }, - ifMatch: { /** ... **/ } - }, - { - selector: { /** ... **/ }, - ifMatch: { /** ... **/ } - }, - { - selector: { /** ... **/ }, - ifMatch: { /** ... **/ } - }, - { - selector: { /** ... **/ }, - ifMatch: { /** ... **/ } - } -]); -``` - -## CRDTs on inserts - -When CRDTs are enabled with the plugin, all insert operations are automatically mapped as CRDT operation with the `$set` operator. - -```ts -// Calling RxCollection.insert() -await myRxCollection.insert({ - id: 'foo' - points: 1 -}); -// is exactly equal to calling insertCRDT() -await myRxCollection.insertCRDT({ - ifMatch: { - $set: { - id: 'foo' - points: 1 - } - } -}); -``` - -When the same document is inserted in multiple client instances and then replicated, a conflict will emerge and the insert-CRDTs will overwrite each other in a deterministic order. -You can use `insertCRDT()` to make conditional insert operations with any logic. To check for the previous existence of a document, use the `$exists` query operation on the primary key of the document. - -```ts -await myRxCollection.insertCRDT({ - selector: { - // only run if the document did not exist before. - id: { $exists: false } - }, - ifMatch: { - // if the document did not exist, insert it - $set: { - id: 'foo' - points: 1 - } - }, - ifNotMatch: { - // if document existed already, increment the points by +1 - $inc: { - points: 1 - } - } -}); -``` - -## Deleting documents - -You can delete a document with a CRDT operation by setting `_deleted` to true. Calling `RxDocument.remove()` will do exactly the same when CRDTs are activated. - -```ts -await doc.updateCRDT({ - ifMatch: { - $set: { - _deleted: true - } - } -}); - -// OR -await doc.remove(); -``` - -## CRDTs with replication - -CRDT operations are stored inside of a special field besides your 'normal' document fields. -When replicating document data with the [RxDB replication](./replication.md) or the [CouchDB replication](./replication-couchdb.md) or even any custom replication, the CRDT operations must be replicated together with the document data as if they would be 'normal' a document property. - -When any instances makes a write to the document, it is required to update the CRDT operations accordingly. For example if your custom backend updates a document, it must also do that by adding a CRDT operation. In [dev-mode](./dev-mode.md) RxDB will refuse to store any document data where the document properties do not match the result of the CRDT operations. - -## Why not automerge.js or yjs? - -There are already CRDT libraries out there that have been considered to be used with RxDB. The biggest ones are [automerge](https://github.com/automerge/automerge) and [yjs](https://github.com/yjs/yjs). The decision was made to not use these but instead go for a more NoSQL way of designing the CRDT format because: - -- Users do not have to learn a new syntax but instead can use the NoSQL query operations which they already know to manipulate the JSON data of a document. -- RxDB is often used to [replicate](./replication.md) data with any custom backend on an already existing infrastructure. Using NoSQL operators instead of binary data in CRDTs, makes it easy to implement the exact same logic on these backends so that the backend can also do document writes and still be compliant to the RxDB CRDT plugin. - -So instead of using YJS or Automerge with a database, you can use RxDB with the CRDT plugin to have a more database specific CRDT approach. This gives you additional features for free such as [schema validation](./schema-validation.md) or [data migration](./migration-schema.md). - -## When to not use CRDTs - -CRDT can only be use when your business logic allows to represent document changes via static json operators. -If you can have cases where user interaction is required to correctly merge conflicting document states, you cannot use CRDTs for that. - -Also when CRDTs are used, it is no longer allowed to do non-CRDT writes to the document properties. - -## CRDT Alternative - -While the CRDT plugin can automatically merge concurrent document updates, it is not the only way to resolve conflicts in RxDB. -An alternative approach to CRDT is to use RxDB's built-in [conflict handling system](./transactions-conflicts-revisions.md). - -> Why use conflict handlers instead of CRDT? - -Conflict handlers offer a **simpler and more flexible** way to manage data conflicts. Instead of encoding changes as CRDT operations, you define how RxDB should decide which document version "wins" with plain JavaScript code. This approach is easier to reason about because it works directly with your domain logic. For example, you can compare timestamps, prioritize certain fields, or even involve user interaction to resolve conflicts. - -Conflict handlers are: - -* **Easier to understand**: you work with plain document states instead of CRDT operations. -* **Fully customizable**: you can define any merge strategy, from simple last-write-wins to complex rule-based logic. -* **Compatible with all data types**: unlike CRDTs, which are best suited for numeric or set-based updates. -* **Transparent**: you always know which state is being written and why. - -### Downsides of CRDTs - -CRDTs are powerful for automatic conflict-free merging, but they also come with trade-offs: - -* **Higher conceptual complexity**: CRDTs require understanding of operation semantics, version vectors, and merge determinism. -* **Limited flexibility**: you can only express changes that fit the supported JSON-style update operators. -* **Difficult debugging**: when merges don't behave as expected, it can be hard to trace the sequence of CRDT operations that led to a state. -* **Overhead for simple cases**: if your data rarely conflicts or needs human oversight, using CRDTs can add unnecessary complexity. - - -### When to choose conflict handlers - -Use conflict handlers as CRDT alternative if: -* You want full control over merge logic. -* Your data model includes contextual or user-specific decisions. -* You prefer a straightforward, rule-based resolution system over automatic merges. - -Use CRDTs if: -* Your app performs frequent offline writes that can be merged deterministically. -* Your data can be represented as additive, numeric, or array-based updates. -* You want minimal manual intervention during replication. - -Both methods are first-class citizens in RxDB. CRDTs focus on **automatic, deterministic merging**, while conflict handlers emphasize **clarity, flexibility, and control**. - -### Example: merging different fields with conflict handlers instead of CRDT - -For example, imagine two users edit different fields of the same document at the same time. One updates a `name`, the other updates a `score`. A custom conflict handler can merge both changes so no data is lost: - -```ts -const mergeFieldsHandler = { - isEqual: (a, b) => JSON.stringify(a) === JSON.stringify(b), - resolve: (input) => { - return { - ...input.realMasterState, - name: input.newDocumentState.name ?? input.realMasterState.name, - score: Math.max(input.newDocumentState.score, input.realMasterState.score) - }; - } -}; -``` - -In this example, if the two versions change different properties, the final merged document includes both updates. This kind of logic is often easier to reason about than designing equivalent CRDT operations. - - diff --git a/docs/data-migration.html b/docs/data-migration.html deleted file mode 100644 index fbf852635f3..00000000000 --- a/docs/data-migration.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - -Data Migration | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/data-migration.md b/docs/data-migration.md deleted file mode 100644 index 8fb545e95ba..00000000000 --- a/docs/data-migration.md +++ /dev/null @@ -1,7 +0,0 @@ -# Data Migration - -> This documentation page has been moved to [here](./migration-schema.md) - -This documentation page has been moved to [here](./migration-schema.md) - - diff --git a/docs/demo-submitted/index.html b/docs/demo-submitted/index.html deleted file mode 100644 index 753f098ba19..00000000000 --- a/docs/demo-submitted/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -Schedule Demo Submitted - RxDB - JavaScript Database | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -






    RxDB Schedule Demo Submitted Submitted


    Thank you for submitting the form. You will directly get a confirmation email.
    Please check your spam folder!.
    In the next 24 hours you will get a full answer via email.



    - - \ No newline at end of file diff --git a/docs/dev-mode.html b/docs/dev-mode.html deleted file mode 100644 index 2cbd5bde0c3..00000000000 --- a/docs/dev-mode.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - -Development Mode | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Dev Mode

    -

    The dev-mode plugin adds many checks and validations to RxDB. -This ensures that you use the RxDB API properly and so the dev-mode plugin should always be used when -using RxDB in development mode.

    -
      -
    • Adds readable error messages.
    • -
    • Ensures that readonly JavaScript objects are not accidentally mutated.
    • -
    • Adds validation check for validity of schemas, queries, ORM methods and document fields. -
        -
      • Notice that the dev-mode plugin does not perform schema checks against the data see schema validation for that.
      • -
      -
    • -
    -
    warning

    The dev-mode plugin will increase your build size and decrease the performance. It must always be used in development. You should never use it in production.

    -
    1

    Import the dev-mode Plugin

    import { RxDBDevModePlugin } from 'rxdb/plugins/dev-mode';
    -import { addRxPlugin } from 'rxdb/plugins/core';
    2

    Add the Plugin to RxDB

    addRxPlugin(RxDBDevModePlugin);
    -

    Usage with Node.js

    -
    async function createDb() {
    -    if (process.env.NODE_ENV !== "production") {
    -        await import('rxdb/plugins/dev-mode').then(
    -            module => addRxPlugin(module.RxDBDevModePlugin)
    -        );
    -    }
    -    const db = createRxDatabase( /* ... */ );
    -}
    -

    Usage with Angular

    -
    import { isDevMode } from '@angular/core';
    - 
    -async function createDb() {
    -    if (isDevMode()){
    -        await import('rxdb/plugins/dev-mode').then(
    -            module => addRxPlugin(module.RxDBDevModePlugin)
    -        );
    -    }
    - 
    -    const db = createRxDatabase( /* ... */ );
    -    // ...
    -}
    -

    Usage with webpack

    -

    In the webpack.config.js:

    -
    module.exports = {
    -    entry: './src/index.ts',
    -    /* ... */
    -    plugins: [
    -        // set a global variable that can be accessed during runtime
    -        new webpack.DefinePlugin({ MODE: JSON.stringify("production") })
    -    ]
    -    /* ... */
    -};
    -

    In your source code:

    -
    declare var MODE: 'production' | 'development';
    - 
    -async function createDb() {
    -    if (MODE === 'development') {
    -        await import('rxdb/plugins/dev-mode').then(
    -            module => addRxPlugin(module.RxDBDevModePlugin)
    -        );
    -    }
    -    const db = createRxDatabase( /* ... */ );
    -    // ...
    -}
    -

    Disable the dev-mode warning

    -

    When the dev-mode is enabled, it will print a console.warn() message to the console so that you do not accidentally use the dev-mode in production. To disable this warning you can call the disableWarnings() function.

    -
    import { disableWarnings } from 'rxdb/plugins/dev-mode';
    -disableWarnings();
    -

    Disable the tracking iframe

    -

    When used in localhost and in the browser, the dev-mode plugin can add a tracking iframe to the DOM. This is used to track the effectiveness of marketing efforts of RxDB. -If you have premium access and want to disable this iframe, you can call setPremiumFlag() before creating the database.

    -
    import { setPremiumFlag } from 'rxdb-premium/plugins/shared';
    -setPremiumFlag();
    - - \ No newline at end of file diff --git a/docs/dev-mode.md b/docs/dev-mode.md deleted file mode 100644 index 901a12333e6..00000000000 --- a/docs/dev-mode.md +++ /dev/null @@ -1,116 +0,0 @@ -# Development Mode - -> Enable checks & validations with RxDB Dev Mode. Ensure proper API use, readable errors, and schema validation during development. Avoid in production. - -import {Steps} from '@site/src/components/steps'; - -# Dev Mode - -The dev-mode plugin adds many checks and validations to RxDB. -This ensures that you use the RxDB API properly and so the dev-mode plugin should always be used when -using RxDB in development mode. - -- Adds readable error messages. -- Ensures that `readonly` JavaScript objects are not accidentally mutated. -- Adds validation check for validity of schemas, queries, [ORM](./orm.md) methods and document fields. - - Notice that the `dev-mode` plugin does not perform schema checks against the data see [schema validation](./schema-validation.md) for that. - -:::warning -The dev-mode plugin will increase your build size and decrease the performance. It must **always** be used in development. You should **never** use it in production. -::: - - - -### Import the dev-mode Plugin -```javascript -import { RxDBDevModePlugin } from 'rxdb/plugins/dev-mode'; -import { addRxPlugin } from 'rxdb/plugins/core'; -``` - -## Add the Plugin to RxDB - -```javascript -addRxPlugin(RxDBDevModePlugin); -``` - - -## Usage with Node.js - -```ts -async function createDb() { - if (process.env.NODE_ENV !== "production") { - await import('rxdb/plugins/dev-mode').then( - module => addRxPlugin(module.RxDBDevModePlugin) - ); - } - const db = createRxDatabase( /* ... */ ); -} -``` - -## Usage with Angular - -```ts -import { isDevMode } from '@angular/core'; - -async function createDb() { - if (isDevMode()){ - await import('rxdb/plugins/dev-mode').then( - module => addRxPlugin(module.RxDBDevModePlugin) - ); - } - - const db = createRxDatabase( /* ... */ ); - // ... -} -``` - -## Usage with webpack - -In the `webpack.config.js`: - -```ts -module.exports = { - entry: './src/index.ts', - /* ... */ - plugins: [ - // set a global variable that can be accessed during runtime - new webpack.DefinePlugin({ MODE: JSON.stringify("production") }) - ] - /* ... */ -}; -``` - -In your source code: - -```ts -declare var MODE: 'production' | 'development'; - -async function createDb() { - if (MODE === 'development') { - await import('rxdb/plugins/dev-mode').then( - module => addRxPlugin(module.RxDBDevModePlugin) - ); - } - const db = createRxDatabase( /* ... */ ); - // ... -} -``` - -## Disable the dev-mode warning - -When the dev-mode is enabled, it will print a `console.warn()` message to the console so that you do not accidentally use the dev-mode in production. To disable this warning you can call the `disableWarnings()` function. - -```ts -import { disableWarnings } from 'rxdb/plugins/dev-mode'; -disableWarnings(); -``` - -## Disable the tracking iframe - -When used in localhost and in the browser, the dev-mode plugin can add a tracking iframe to the DOM. This is used to track the effectiveness of marketing efforts of RxDB. -If you have [premium access](/premium/) and want to disable this iframe, you can call `setPremiumFlag()` before creating the database. - -```js -import { setPremiumFlag } from 'rxdb-premium/plugins/shared'; -setPremiumFlag(); -``` diff --git a/docs/downsides-of-offline-first.html b/docs/downsides-of-offline-first.html deleted file mode 100644 index dea455e0d0f..00000000000 --- a/docs/downsides-of-offline-first.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - -Downsides of Local First / Offline First | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Downsides of Local First / Offline First

    -

    So you have read all these things about how the local-first (aka offline-first) paradigm makes it easy to create realtime web applications that even work when the user has no internet connection. -But there is no free lunch. The offline first paradigm is not the perfect approach for all kinds of apps.

    -

    You fully understood a technology when you know when not to use it

    Daniel, 2024

    -

    In the following I will point out the limitations you need to know before you decide to use RxDB or even before you decide to create an offline first application.

    -

    It only works with small datasets

    -

    Making data available offline means it must be loaded from the server and then stored at the clients device. -You need to load the full dataset on the first pageload and on every ongoing load you need to download the new changes to that set. -While in theory you could download in infinite amount of data, in practice you have a limit how long the user can wait before having an up-to-date state. -You want to display chat messages like Whatsapp? No problem. Syncing all the messages a user could write, can be done with a few HTTP requests. -Want to make a tool that displays server logs? Good luck downloading terabytes of data to the client just to search for a single string. This will not work.

    -

    Besides the network usage, there is another limit for the size of your data. -In browsers you have some options for storage: Cookies, Localstorage, WebSQL and IndexedDB.

    -

    Because Cookies and Localstorage is slow and WebSQL is deprecated, you will use IndexedDB. -The limit of how much data you can store in IndexedDB depends on two factors: Which browser is used and how much disc space is left on the device. You can assume that at least a couple of hundred megabytes are available at least. The maximum is potentially hundreds of gigabytes or more, but the browser implementations vary. Chrome allows the browser to use up to 60% of the total disc space per origin. Firefox allows up to 50%. But on safari you can only store up to 1GB and the browser will prompt the user on each additional 200MB increment.

    -

    The problem is, that you have no chance to really predict how much data can be stored. So you have to make assumptions that are hopefully true for all of your users. Also, you have no way to increase that space like you would add another hard drive to your backend server. Once your clients reach the limit, you likely have to rewrite big parts of your applications.

    -

    UPDATE (2023): Newer versions of browsers can store way more data, for example firefox stores up to 10% of the total disk size. For an overview about how much can be stored, read this guide

    -

    Browser storage is not really persistent

    -

    When data is stored inside IndexedDB or one of the other storage APIs, it cannot be trusted to stay there forever. -Apple for example deletes the data when the website was not used in the last 7 days. The other browsers also have logic to clean up the stored data, and in the end the user itself could be the one that deletes the browsers local data.

    -

    The most common way to handle this, is to replicate everything from the backend to the client again. -Of course, this does not work for state that is not stored at the backend. So if you assume you can store the users private data inside the browser in a secure way, you are wrong.

    -

    safari database

    -

    There can be conflicts

    -

    Imagine two of your users modify the same JSON document, while both are offline. After they go online again, their clients replicate the modified document to the server. Now you have two conflicting versions of the same document, and you need a way to determine how the correct new version of that document should look like. This process is called conflict resolution.

    -

    document replication conflict

    -
      -
    1. -

      The default in many offline first databases is a deterministic conflict resolution strategy. Both conflicting versions of the document are kept in the storage and when you query for the document, a winner is determined by comparing the hashes of the document and only the winning document is returned. Because the comparison is deterministic, all clients and servers will always pick the same winner. This kind of resolution only works when it is not that important that one of the document changes gets dropped. Because conflicts are rare, this might be a viable solution for some use cases.

      -
    2. -
    3. -

      A better resolution can be applied by listening to the changestream of the database. The changestream emits an event each time a write happens to the database. The event contains information about the written document and also a flag if there is a conflicting version. For each event with a conflict, you fetch all versions for that document and create a new document that contains the winning state. With that you can implement pretty complex conflict resolution strategies, but you have to manually code it for each collection of documents.

      -
    4. -
    5. -

      Instead of the solving conflict once at every client, it can be made a bit easier by solely relying on the backend. This can be done when all of your clients replicate with the same single backend server. With RxDB's Graphql Replication each client side change is sent to the server where conflicts can be resolved and the winning document can be sent back to the clients.

      -
    6. -
    7. -

      Sometimes there is no way to solve a conflict with code. If your users edit text based documents or images, often only the users themselves can decide how the winning revision has to look. For these cases, you have to implement complex UI parts where the users can inspect the conflict and manage its resolution.

      -
    8. -
    9. -

      You do not have to handle conflicts if they cannot happen in the first place. You can achieve that by designing a write only database where existing documents cannot be touched. Instead of storing the current state in a single document, you store all the events that lead to the current state. Sometimes called the "everything is a delta" strategy, others would call it Event Sourcing. Like an accountant that does not need an eraser, you append all changes and afterwards aggregate the current state at the client.

      -
    10. -
    -
    // create one new document for each change to the users balance
    -{id: new Date().toJSON(), change: 100} // balance increased by $100
    -{id: new Date().toJSON(), change: -50} // balance decreased by $50
    -{id: new Date().toJSON(), change: 200} // balance increased by $200
    -
      -
    1. There is this thing called conflict-free replicated data type, short CRDT. Using a CRDT library like automerge will magically solve all of your conflict problems. Until you use it in production where you observe that implementing CRDTs has basically the same complexity as implementing conflict resolution strategies.
    2. -
    -

    Realtime is a lie

    -

    So you replicate stuff between the clients and your backend. Each change on one side directly changes the state of the other sides in realtime. But this "realtime" is not the same as in realtime computing. In the offline first world, the word realtime was introduced by firebase and is more meant as a marketing slogan than a technical description. -There is an internet between your backend and your clients and everything you do on one machine takes at least once the latency until it can affect anything on the other machines. You have to keep this in mind when you develop anything where the timing is important, like a multiplayer game or a stock trading app.

    -

    Even when you run a query against the local database, there is no "real" realtime. -Client side databases run on JavaScript and JavaScript runs on a single CPU that might be partially blocked because the user is running some background processes. So you can never guarantee a response deadline which violates the time constraint of realtime computing.

    -

    latency london san franzisco

    -

    Eventual consistency

    -

    An offline first app does not have a single source of truth. There is a source on the backend, one on the own client, and also each other client has its own definition of truth. At the moment your user starts the app, the local state is hopefully already replicated with the backend and all other clients. But this does not have to be true, the states can have converged and you have to plan for that. -The user could update a document based on wrong assumptions because it was not fully replicated at that point in time because the user is offline. A good way to handle this problem is to show the replication state in the UI and tell the user when the replication is running, stopped, paused or finished.

    -

    And some data is just too important to be "eventual consistent". Create a wire transfer in your online banking app while you are offline. You keep the smartphone laying at your night desk and when you use again in the next morning, it goes online and replicates the transaction. No thank you, do not use offline first for these kinds of things, or at least you have to display the replication state of each document in the UI.

    -

    CAP theorem

    -

    Permissions and authentication

    -

    Every offline first app that goes beyond a prototype, does likely not have the same global state for all of its users. Each user has a different set of documents that are allowed to be replicated or seen by the user. So you need some kind of authentication and permission handling to divide the documents. -The easy way is to just create one database for each user on the backend and only allow to replicate that one. Creating that many databases is not really a problem with for example CouchDB, and it makes permission handling easy. -But as soon as you want to query all of your data in the backend, it will bite back. Your data is not at a single place, it is distributed between all of the user specific databases. This becomes even more complex as soon as you store information together with the documents that is not allowed to be seen by outsiders. You not only have to decide which documents to replicate, but also which fields of them.

    -

    So what you really want is a single datastore in the backend and then replicate only the allowed document parts to each of the users. -This always requires you to implement your custom replication endpoint like what you do with RxDBs GraphQL Replication.

    -

    You have to migrate the client database

    -

    While developing your app, sooner or later you want to change the data layout. You want to add some new fields to documents or change the format of them. So you have to update the database schema and also migrate the stored documents. -With 'normal' applications, this is already hard enough and often dangerous. You wait until midnight, stop the webserver, make a database backup, deploy the new schema and then you hope that nothing goes wrong while it updates that many documents.

    -

    With offline first applications, it is even more fun. You do not only have to migrate your local backend database, you also have to provide a migration strategy for all of these client databases out there. And you also cannot migrate everything at the same time. The clients can only migrate when the new code was updated from the appstore or the user visited your website again. This could be today or in a few weeks.

    -

    Performance is not native

    -

    When you create a web based offline first app, you cannot store data directly on the users filesystem. In fact there are many layers between your JavaScript code and the filesystem of the operation system. Let's say you insert a document in RxDB:

    -
      -
    • You call the RxDB API to validate and store the data
    • -
    • RxDB calls the underlying RxStorage, for example PouchDB.
    • -
    • Pouchdb calls its underlying storage adapter
    • -
    • The storage adapter calls IndexedDB
    • -
    • The browser runs its internal handling of the IndexedDB API
    • -
    • In most browsers IndexedDB is implemented on top of SQLite
    • -
    • SQLite calls the OS to store the data in the filesystem
    • -
    -

    All these layers are abstractions. They are not build for exactly that one use case, so you lose some performance to tunnel the data through the layer itself, and you also lose some performance because the abstraction does not exactly provide the functions that are needed by the layer above and it will overfetch data.

    -

    You will not find a benchmark comparison between how many transactions per second you can run on the browser compared to a server based database. Because it makes no sense to compare them. Browsers are slower, JavaScript is slower.

    -
    -

    Is it fast enough?

    -
    -

    What you really care about is "Is it fast enough?". For most use cases, the answer is yes. Offline first apps are UI based and you do not need to process a million transactions per second, because your user will not click the save button that often. "Fast enough" means that the data is processed in under 16 milliseconds so that you can render the updated UI in the next frame. This is of course not true for all use cases, so you better think about the performance limit before starting with the implementation.

    -

    Nothing is predictable

    -

    You have a PostgreSQL database and run a query over 1000ths of rows, which takes 200 milliseconds. Works great, so you now want to do something similar at the client device in your offline first app. How long does it take? You cannot know because people have different devices, and even equal devices have different things running in the background that slow the CPUs. So you cannot predict performance and as described above, you cannot even predict the storage limit. So if your app does heavy data analytics, you might better run everything on the backend and just send the results to the client.

    -

    There is no relational data

    -

    I started creating RxDB many years ago and while still maintaining it, I often worked with all these other offline first databases out there. RxDB and all of these other ones, are based on some kind of document databases similar to NoSQL. Often people want to have a relational database like the SQL one they use at the backend.

    -

    So why are there no real relations in offline first databases? I could answer with these arguments like how JavaScript works better with document based data, how performance is better when having no joins or even how NoSQL queries are more composable. But the truth is, everything is NoSQL because it makes replication easy. An SQL query that mutates data in different tables based on some selects and joins, cannot be partially replicated without breaking the client. You have foreign keys that point to other rows and if these rows are not replicated yet, you have a problem. To implement a robust Sync Engine for relational data, you need some stuff like a reliable atomic clock and you have to block queries over multiple tables while a transaction replicated. Watch this guy implementing offline first replication on top of SQLite or read this discussion about implementing offline first in supabase.

    -

    So creating replication for an SQL offline first database is way more work than just adding some network protocols on top of PostgreSQL. It might not even be possible for clients that have no reliable clock.

    -

    no relational data

    - - \ No newline at end of file diff --git a/docs/downsides-of-offline-first.md b/docs/downsides-of-offline-first.md deleted file mode 100644 index 80fe94f1518..00000000000 --- a/docs/downsides-of-offline-first.md +++ /dev/null @@ -1,136 +0,0 @@ -# Downsides of Local First / Offline First - -> Discover the hidden pitfalls of local-first apps. Learn about storage limits, conflicts, and real-time illusions before building your offline solution. - -import {QuoteBlock} from '@site/src/components/quoteblock'; - -# Downsides of Local First / Offline First - -So you have read [all these things](./offline-first.md) about how the [local-first](./articles/local-first-future.md) (aka offline-first) paradigm makes it easy to create realtime web applications that even work when the user has no internet connection. -But there is no free lunch. The offline first paradigm is not the perfect approach for all kinds of apps. - -You fully understood a technology when you know when not to use it - -In the following I will point out the limitations you need to know before you decide to use [RxDB](https://github.com/pubkey/rxdb) or even before you decide to create an offline first application. - -## It only works with small datasets - -Making data available offline means it must be loaded from the server and then stored at the clients device. -You need to load the full dataset on the first pageload and on every ongoing load you need to download the new changes to that set. -While in theory you could download in infinite amount of data, in practice you have a limit how long the user can wait before having an up-to-date state. -You want to display chat messages like Whatsapp? No problem. Syncing all the messages a user could write, can be done with a few HTTP requests. -Want to make a tool that displays server logs? Good luck downloading terabytes of data to the client just to search for a single string. This will not work. - -Besides the network usage, there is another limit for the size of your data. -In browsers you have some options for storage: Cookies, [Localstorage](./articles/localstorage.md), [WebSQL](./articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.md#what-was-websql) and [IndexedDB](./rx-storage-indexeddb.md). - -Because Cookies and [Localstorage](./articles/localstorage.md) is slow and WebSQL is deprecated, you will use IndexedDB. -The [limit of how much data you can store in IndexedDB](./articles/indexeddb-max-storage-limit.md) depends on two factors: Which browser is used and how much disc space is left on the device. You can assume that at least a couple of [hundred megabytes](https://web.dev/storage-for-the-web/) are available at least. The maximum is potentially hundreds of gigabytes or more, but the browser implementations vary. Chrome allows the browser to use up to 60% of the total disc space per origin. Firefox allows up to 50%. But on safari you can only store up to 1GB and the browser will prompt the user on each additional 200MB increment. - -The problem is, that you have no chance to really predict how much data can be stored. So you have to make assumptions that are hopefully true for all of your users. Also, you have no way to increase that space like you would add another hard drive to your backend server. Once your clients reach the limit, you likely have to rewrite big parts of your applications. - -UPDATE (2023): Newer versions of browsers can store way more data, for example firefox stores up to 10% of the total disk size. For an overview about how much can be stored, read [this guide](https://developer.mozilla.org/en-US/docs/Web/API/Storage_API/Storage_quotas_and_eviction_criteria) - -## Browser storage is not really persistent - -When data is stored inside IndexedDB or one of the other storage APIs, it cannot be trusted to stay there forever. -Apple for example deletes the data when the website was not used in the [last 7 days](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/). The other browsers also have logic to clean up the stored data, and in the end the user itself could be the one that deletes the browsers local data. - -The most common way to handle this, is to replicate everything from the backend to the client again. -Of course, this does not work for state that is not stored at the backend. So if you assume you can store the users private data inside the browser in a secure way, you are [wrong](https://medium.com/universal-ethereum/out-of-gas-were-shutting-down-unilogin-3b544838df1a#4f60). - - - -## There can be conflicts - -Imagine two of your users modify the same JSON document, while both are offline. After they go online again, their clients replicate the modified document to the server. Now you have two conflicting versions of the same document, and you need a way to determine how the correct new version of that document should look like. This process is called **conflict resolution**. - - - - 1. The default in [many](https://docs.couchdb.org/en/stable/replication/conflicts.html) offline first databases is a deterministic conflict resolution strategy. Both conflicting versions of the document are kept in the storage and when you query for the document, a winner is determined by comparing the hashes of the document and only the winning document is returned. Because the comparison is deterministic, all clients and servers will always pick the same winner. This kind of resolution only works when it is not that important that one of the document changes gets dropped. Because conflicts are rare, this might be a viable solution for some use cases. - - 2. A better resolution can be applied by listening to the changestream of the database. The changestream emits an event each time a write happens to the database. The event contains information about the written document and also a flag if there is a conflicting version. For each event with a conflict, you fetch all versions for that document and create a new document that contains the winning state. With that you can implement pretty complex conflict resolution strategies, but you have to manually code it for each collection of documents. - - 3. Instead of the solving conflict once at every client, it can be made a bit easier by solely relying on the backend. This can be done when all of your clients replicate with the same single backend server. With [RxDB's Graphql Replication](./replication-graphql.md) each client side change is sent to the server where conflicts can be resolved and the winning document can be sent back to the clients. - - 4. Sometimes there is no way to solve a conflict with code. If your users edit text based documents or images, often only the users themselves can decide how the winning revision has to look. For these cases, you have to implement complex UI parts where the users can inspect the conflict and manage its resolution. - - 5. You do not have to handle conflicts if they cannot happen in the first place. You can achieve that by designing a write only database where existing documents cannot be touched. Instead of storing the current state in a single document, you store all the events that lead to the current state. Sometimes called the ["everything is a delta"](https://pouchdb.com/guides/conflicts.html#accountants-dont-use-erasers) strategy, others would call it [Event Sourcing](https://martinfowler.com/eaaDev/EventSourcing.html). Like an accountant that does not need an eraser, you append all changes and afterwards aggregate the current state at the client. - ```ts - // create one new document for each change to the users balance - {id: new Date().toJSON(), change: 100} // balance increased by $100 - {id: new Date().toJSON(), change: -50} // balance decreased by $50 - {id: new Date().toJSON(), change: 200} // balance increased by $200 - ``` - - 6. There is this thing called **conflict-free replicated data type**, short **CRDT**. Using a CRDT library like [automerge](https://github.com/automerge/automerge) will magically solve all of your conflict problems. Until you use it in production where you observe that implementing CRDTs has basically the same complexity as implementing conflict resolution strategies. - -## Realtime is a lie - -So you replicate stuff between the clients and your backend. Each change on one side directly changes the state of the other sides in **realtime**. But this "realtime" is not the same as in [realtime computing](https://en.wikipedia.org/wiki/Real-time_computing). In the offline first world, the word realtime was introduced by firebase and is more meant as a marketing slogan than a technical description. -There is an internet between your backend and your clients and everything you do on one machine takes at least once the latency until it can affect anything on the other machines. You have to keep this in mind when you develop anything where the timing is important, like a multiplayer game or a stock trading app. - -Even when you run a query against the local database, there is no "real" realtime. -Client side databases run on JavaScript and JavaScript runs on a single CPU that might be partially blocked because the user is running some background processes. So you can never guarantee a response deadline which violates the time constraint of realtime computing. - - - -## Eventual consistency - -An offline first app does not have a single source of truth. There is a source on the backend, one on the own client, and also each other client has its own definition of truth. At the moment your user starts the app, the local state is hopefully already replicated with the backend and all other clients. But this does not have to be true, the states can have converged and you have to plan for that. -The user could update a document based on wrong assumptions because it was not fully replicated at that point in time because the user is offline. A good way to handle this problem is to show the replication state in the UI and tell the user when the replication is running, stopped, paused or finished. - -And some data is just too important to be "eventual consistent". Create a wire transfer in your online banking app while you are offline. You keep the smartphone laying at your night desk and when you use again in the next morning, it goes online and replicates the transaction. No thank you, do not use offline first for these kinds of things, or at least you have to display the replication state of each document in the UI. - - - -## Permissions and authentication - -Every offline first app that goes beyond a prototype, does likely not have the same global state for all of its users. Each user has a different set of documents that are allowed to be replicated or seen by the user. So you need some kind of authentication and permission handling to divide the documents. -The easy way is to just create one database for each user on the backend and only allow to replicate that one. Creating that many databases is not really a problem with for example CouchDB, and it makes permission handling easy. -But as soon as you want to query all of your data in the backend, it will bite back. Your data is not at a single place, it is distributed between all of the user specific databases. This becomes even more complex as soon as you store information together with the documents that is not allowed to be seen by outsiders. You not only have to decide which documents to replicate, but also which fields of them. - -So what you really want is a single datastore in the backend and then replicate only the allowed document parts to each of the users. -This always requires you to implement your custom replication endpoint like what you do with RxDBs [GraphQL Replication](./replication-graphql.md). - -## You have to migrate the client database - -While developing your app, sooner or later you want to change the data layout. You want to add some new fields to documents or change the format of them. So you have to update the database schema and also migrate the stored documents. -With 'normal' applications, this is already hard enough and often dangerous. You wait until midnight, stop the webserver, make a database backup, deploy the new schema and then you hope that nothing goes wrong while it updates that many documents. - -With offline first applications, it is even more fun. You do not only have to migrate your local backend database, you also have to provide a [migration strategy](./migration-schema.md) for all of these client databases out there. And you also cannot migrate everything at the same time. The clients can only migrate when the new code was updated from the appstore or the user visited your website again. This could be today or in a few weeks. - -## Performance is not native - -When you create a web based offline first app, you cannot store data directly on the users filesystem. In fact there are many layers between your JavaScript code and the filesystem of the operation system. Let's say you insert a document in [RxDB](https://github.com/pubkey/rxdb): - - You call the RxDB API to validate and store the data - - RxDB calls the underlying RxStorage, for example PouchDB. - - Pouchdb calls its underlying storage adapter - - The storage adapter calls IndexedDB - - The browser runs its internal handling of the IndexedDB API - - In most browsers IndexedDB is implemented on [top of SQLite](https://hackaday.com/2021/08/24/sqlite-on-the-web-absurd-sql/) - - SQLite calls the OS to store the data in the filesystem - -All these layers are abstractions. They are not build for exactly that one use case, so you lose some performance to tunnel the data through the layer itself, and you also lose some performance because the abstraction does not exactly provide the functions that are needed by the layer above and it will overfetch data. - -You will not find a benchmark comparison between how many transactions per second you can run on the browser compared to a server based database. Because it makes no sense to compare them. Browsers are slower, JavaScript is slower. - -> **Is it fast enough?** - -What you really care about is "Is it fast enough?". For most use cases, the answer is `yes`. Offline first apps are UI based and you do not need to process a million transactions per second, because your user will not click the save button that often. "Fast enough" means that the data is processed in under 16 milliseconds so that you can render the updated UI in the next frame. This is of course not true for all use cases, so you better think about the performance limit before starting with the implementation. - -## Nothing is predictable - -You have a PostgreSQL database and run a query over 1000ths of rows, which takes 200 milliseconds. Works great, so you now want to do something similar at the client device in your offline first app. How long does it take? You cannot know because people have different devices, and even equal devices have different things running in the background that slow the CPUs. So you cannot predict performance and as described above, you cannot even predict the storage limit. So if your app does heavy data analytics, you might better run everything on the backend and just send the results to the client. - -## There is no relational data - -I started creating [RxDB](https://github.com/pubkey/rxdb) many years ago and while still maintaining it, I often worked with all these other offline first databases out there. RxDB and all of these other ones, are based on some kind of document databases similar to NoSQL. Often people want to have a relational database like the SQL one they use at the backend. - -So why are there no real relations in offline first databases? I could answer with these arguments like how JavaScript works better with document based data, how performance is better when having no joins or even how NoSQL queries are more composable. But the truth is, everything is NoSQL because it makes replication easy. An SQL query that mutates data in different tables based on some selects and joins, cannot be partially replicated without breaking the client. You have foreign keys that point to other rows and if these rows are not replicated yet, you have a problem. To implement a robust [Sync Engine](./replication.md) for relational data, you need some stuff like a [reliable atomic clock](https://www.theverge.com/2012/11/26/3692392/google-spanner-atomic-clocks-GPS) and you have to block queries over multiple tables while a transaction replicated. [Watch this guy](https://youtu.be/iEFcmfmdh2w?t=607) implementing offline first replication on top of SQLite or read this [discussion](https://github.com/supabase/supabase/discussions/357) about implementing [offline first in supabase](./replication-supabase.md). - -So creating replication for an SQL offline first database is way more work than just adding some network protocols on top of PostgreSQL. It might not even be possible for clients that have no reliable clock. diff --git a/docs/electron-database.html b/docs/electron-database.html deleted file mode 100644 index 658ccbe1724..00000000000 --- a/docs/electron-database.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - -Electron Database - Storage adapters for SQLite, Filesystem and In-Memory | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Electron Database - RxDB with different storage for SQLite, Filesystem and In-Memory

    -

    Electron (aka Electron.js) is a framework developed by github that is designed to create desktop applications with the Web technology stack consisting of HTML, CSS and JavaScript. -Because the desktop application runs on the client's device, it is suitable to use a database that can store and query data locally. This allows you to create so-called local first apps that store data locally and even work when the user has no internet connection. -While there are many options to store data in Electron, for complex realtime apps using RxDB is recommended because it is a database made for UI-based client-side application, not a server-side database.

    -

    Electron

    -

    Databases for Electron

    -

    An Electron runtime can be divided into two parts:

    -
      -
    • The "main" process which is a Node.js JavaScript process that runs without a UI in the background.
    • -
    • One or multiple "renderer" processes that consist of a Chrome browser engine and runs the user interface. Each renderer process represents one "browser tab".
    • -
    -

    This is important to understand because choosing the right database depends on your use case and on which of these JavaScript runtimes you want to keep the data.

    -

    Server Side Databases in Electron.js

    -

    Because Electron runs on a desktop computer, you might think that it should be possible to use a common "server" database like MySQL, PostgreSQL or MongoDB. In theory, you could ship the correct database server binaries with your electron application and start a process on the client's device that exposes a port to the database that can be consumed by Electron. In practice, this is not a viable way to go because shipping the correct binaries and opening ports is way to complicated and troublesome. Instead you should use a database that can be bundled and run inside of Electron, either in the main or in the renderer process.

    -

    Localstorage / IndexedDB / WebSQL as alternatives to SQLite in Electron

    -

    Because Electron uses a common Chrome web browser in the renderer process, you can access the common Web Storage APIs like Localstorage, IndexedDB and WebSQL. This is easy to set up and storing small sets of data can be achieved in a short span of time.

    -

    But as soon as your application goes beyond a simple todo-app, there are multiple obstacles that come in your way. One thing is the bad multi-tab support. If you have more than one renderer process, it becomes hard to manage database writes between them. Each browser tab could modify the database state while the others do not know of the changes and keep an outdated UI.

    -

    Another thing is performance. IndexedDB is slow, mostly because it has to go through layers of browser security and abstractions. Storing and querying a lot of data might become your performance bottleneck. Localstorage and WebSQL are even slower, by the way. Using these Web Storage APIs is generally only recommended when you know for sure that there will be always only one rendering process and performance is not that relevant. The main reason for that is the security- and abstraction layers that write- and read operations have to go through when using the browsers IndexedDB API. So instead of using IndexedDB in Electron in the renderer process, you should use something that runs in the "main" process in Node.js like the Filesystem RxStorage or the In Memory RxStorage.

    -

    RxDB

    -

    RxDB

    -

    RxDB is a NoSQL database for JavaScript applications. It has many features that come in handy when RxDB is used with UI based applications like your Electron app. For example, it is able to subscribe to query results of single fields of documents. It has encryption and compression features and most important it has a battle tested Sync Engine that can be used to do a realtime sync with your backend.

    -

    Because of the flexible storage layer of RxDB, there are many options on how to use it with Electron:

    - -

    It is recommended to use the SQLite RxStorage because it has the best performance and is the easiest to set up. However it is part of the 👑 Premium Plugins which must be purchased, so to try out RxDB with Electron, you might want to use one of the other options. To start with RxDB, I would recommend using the LocalStorage RxStorage in the renderer processes. Because RxDB is able to broadcast the database state between browser tabs, having multiple renderer processes is not a problem like it would be when you use plain IndexedDB without RxDB. -In production, you would always run the RxStorage in the main process with the RxStorage Electron IpcRenderer & IpcMain plugins.

    -

    First, you have to install all dependencies via npm install rxdb rxjs. -Then you can assemble the RxStorage and create a database with it:

    -
    import { createRxDatabase } from 'rxdb';
    -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
    - 
    -// create database
    -const db = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageLocalstorage()
    -});
    - 
    -// create collections
    -const collections = await myRxDatabase.addCollections({
    -    humans: {
    -        /* ... */
    -    }
    -});
    - 
    -// insert document
    -await collections.humans.insert({id: 'foo', name: 'bar'});
    - 
    -// run a query
    -const result = await collections.humans.find({
    -    selector: {
    -        name: 'bar'
    -    }
    -}).exec();
    - 
    -// observe a query
    -await collections.humans.find({
    -    selector: {
    -        name: 'bar'
    -    }
    -}).$.subscribe(result => {/* ... */});
    -

    For better performance in the renderer tab, you can later switch to the IndexedDB RxStorage. But in production, it is recommended to use the SQLite RxStorage or the Filesystem RxStorage in the main process so that database operations do not block the rendering of the UI. -To learn more about using RxDB with Electron, you might want to check out this example project.

    -

    SQLite in Electron.js without RxDB

    -

    SQLite is a SQL based relational database written in the C programming language that was crafted to be embedded inside of applications and stores data locally. Operations are written in the SQL query language similar to the PostgreSQL syntax.

    -

    Using SQLite in Electron is not possible in the renderer process, only in the main process. To communicate data operations between your main and your renderer processes, you have to use either @electron/remote (not recommended) or the ipcRenderer (recommended). So you start up SQLite in your main process and whenever you want to read or write data, you send the SQL queries to the main process and retrieve the result back as JSON data.

    -

    To install SQLite, use the SQLite3 package which is a native Node.js module. You also need the @electron/rebuild package to rebuild the SQLite module against the currently installed Electron version.

    -

    Install them with npm install sqlite3 @electron/rebuild. -Then you can rebuild SQLite with ./node_modules/.bin/electron-rebuild -f -w sqlite3 -In the JavaScript code of your main process you can now create a database:

    -
    const sqlite3 = require('sqlite3');
    -const db = new sqlite3.Database('/path/to/database/file.db');
    -// create a table and insert a row
    -db.serialize(() => {
    -  db.run("CREATE TABLE Users (name, lastName)");
    -  db.run("INSERT INTO Users VALUES (?, ?)", ['foo', 'bar']);
    -});
    -

    Also you have to set up the ipcRenderer so that message from the renderer process are handled:

    -
    ipcMain.handle('db-query', async (event, sqlQuery) => {
    -  return new Promise(res => {
    -      db.all(sqlQuery, (err, rows) => {
    -        res(rows);
    -      });
    -  });
    -});
    -

    In your renderer process, you can now call the ipcHandler and fetch data from SQLite:

    -
    const rows = await ipcRenderer.invoke('db-query', "SELECT * FROM Users");
    -

    The downside of SQLite (or SQL in general) is that it is lacking many features that are handful when using a database together with UI based applications. It is not possible to observe queries or document fields and there is no replication method to sync data with a server. This makes SQLite a good solution when you just want to store data on the client or process expensive SQL queries on the server, but it is not suitable for more complex operations like two-way replication, encryption, compression and so on. Also developer helpers like TypeScript type safety are totally out of reach.

    -

    RxDB Electron Database

    -

    Follow up

    -
    - - \ No newline at end of file diff --git a/docs/electron-database.md b/docs/electron-database.md deleted file mode 100644 index b93643a5d64..00000000000 --- a/docs/electron-database.md +++ /dev/null @@ -1,139 +0,0 @@ -# Electron Database - Storage adapters for SQLite, Filesystem and In-Memory - -> Harness the database power of SQLite, Filesystem, and in-memory storage in Electron with RxDB. Build fast, offline-first apps that sync in real time. - -# Electron Database - RxDB with different storage for SQLite, Filesystem and In-Memory - -[Electron](https://www.electronjs.org/) (aka Electron.js) is a framework developed by github that is designed to create desktop applications with the Web technology stack consisting of HTML, CSS and JavaScript. -Because the desktop application runs on the client's device, it is suitable to use a database that can store and query data locally. This allows you to create so-called [local first](./offline-first.md) apps that store data locally and even work when the user has no internet connection. -While there are many options to store data in Electron, for complex realtime apps using [RxDB](https://rxdb.info/) is recommended because it is a database made for UI-based client-side application, not a server-side database. - - - -## Databases for Electron - -An Electron runtime can be divided into two parts: -- The "main" process which is a Node.js JavaScript process that runs without a UI in the background. -- One or multiple "renderer" processes that consist of a Chrome browser engine and runs the user interface. Each renderer process represents one "browser tab". - -This is important to understand because choosing the right database depends on your use case and on which of these JavaScript runtimes you want to keep the data. - -### Server Side Databases in Electron.js - -Because Electron runs on a desktop computer, you might think that it should be possible to use a common "server" database like MySQL, PostgreSQL or MongoDB. In theory, you could ship the correct database server binaries with your electron application and start a process on the client's device that exposes a port to the database that can be consumed by Electron. In practice, this is not a viable way to go because shipping the correct binaries and opening ports is way to complicated and troublesome. Instead you should use a database that can be bundled and run **inside** of Electron, either in the *main* or in the *renderer* process. - -### Localstorage / IndexedDB / WebSQL as alternatives to SQLite in Electron - -Because Electron uses a common Chrome web browser in the renderer process, you can access the common Web Storage APIs like [Localstorage](./articles/localstorage.md), IndexedDB and WebSQL. This is easy to set up and storing small sets of data can be achieved in a short span of time. - -But as soon as your application goes beyond a simple todo-app, there are multiple obstacles that come in your way. One thing is the bad multi-tab support. If you have more than one *renderer* process, it becomes hard to manage database writes between them. Each *browser tab* could modify the database state while the others do not know of the changes and keep an outdated UI. - -Another thing is performance. [IndexedDB is slow](./slow-indexeddb.md), mostly because it has to go through layers of browser security and abstractions. Storing and querying a lot of data might become your performance bottleneck. Localstorage and WebSQL are even slower, by the way. Using these Web Storage APIs is generally only recommended when you know for sure that there will be always only **one rendering process** and performance is not that relevant. The main reason for that is the security- and abstraction layers that write- and read operations have to go through when using the browsers IndexedDB API. So instead of using IndexedDB in Electron in the renderer process, you should use something that runs in the "main" process in Node.js like the [Filesystem RxStorage](./rx-storage-filesystem-node.md) or the [In Memory RxStorage](./rx-storage-memory.md). - -### RxDB - - - -[RxDB](https://rxdb.info/) is a NoSQL database for JavaScript applications. It has many features that come in handy when RxDB is used with UI based applications like your Electron app. For example, it is able to subscribe to query results of single fields of documents. It has encryption and compression features and most important it has a battle tested [Sync Engine](./replication.md) that can be used to do a realtime sync with your backend. - -Because of the [flexible storage](https://rxdb.info/rx-storage.html) layer of RxDB, there are many options on how to use it with Electron: - -- The [memory RxStorage](./rx-storage-memory.md) that stores the data inside of the JavaScript memory without persistence -- The [SQLite RxStorage](./rx-storage-sqlite.md) -- The [IndexedDB RxStorage](./rx-storage-indexeddb.md) -- The [LocalStorage RxStorage](./rx-storage-localstorage.md) -- The [Dexie.js RxStorage](./rx-storage-dexie.md) -- The [Node.js Filesystem](./rx-storage-filesystem-node.md) - -It is recommended to use the [SQLite RxStorage](./rx-storage-sqlite.md) because it has the best performance and is the easiest to set up. However it is part of the [👑 Premium Plugins](/premium/) which must be purchased, so to try out RxDB with Electron, you might want to use one of the other options. To start with RxDB, I would recommend using the LocalStorage RxStorage in the renderer processes. Because RxDB is able to broadcast the database state between browser tabs, having multiple renderer processes is not a problem like it would be when you use plain IndexedDB without RxDB. -In production, you would always run the RxStorage in the main process with the [RxStorage Electron IpcRenderer & IpcMain](./electron.md#rxstorage-electron-ipcrenderer--ipcmain) plugins. - -First, you have to install all dependencies via `npm install rxdb rxjs`. -Then you can assemble the RxStorage and create a database with it: - -```ts -import { createRxDatabase } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -// create database -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageLocalstorage() -}); - -// create collections -const collections = await myRxDatabase.addCollections({ - humans: { - /* ... */ - } -}); - -// insert document -await collections.humans.insert({id: 'foo', name: 'bar'}); - -// run a query -const result = await collections.humans.find({ - selector: { - name: 'bar' - } -}).exec(); - -// observe a query -await collections.humans.find({ - selector: { - name: 'bar' - } -}).$.subscribe(result => {/* ... */}); -``` - -For better performance in the renderer tab, you can later switch to the [IndexedDB RxStorage](./rx-storage-indexeddb.md). But in production, it is recommended to use the [SQLite RxStorage](./rx-storage-sqlite.md) or the [Filesystem RxStorage](./rx-storage-filesystem-node.md) in the main process so that database operations do not block the rendering of the UI. -To learn more about using RxDB with Electron, you might want to check out [this example project](https://github.com/pubkey/rxdb/tree/master/examples/electron). - -### SQLite in Electron.js without RxDB - -SQLite is a SQL based relational database written in the C programming language that was crafted to be embedded inside of applications and stores data locally. Operations are written in the SQL query language similar to the PostgreSQL syntax. - -Using SQLite in Electron is not possible in the *renderer process*, only in the *main process*. To communicate data operations between your main and your renderer processes, you have to use either [@electron/remote](https://github.com/electron/remote) (not recommended) or the [ipcRenderer](https://www.electronjs.org/de/docs/latest/api/ipc-renderer) (recommended). So you start up SQLite in your main process and whenever you want to read or write data, you send the SQL queries to the main process and retrieve the result back as JSON data. - -To install SQLite, use the [SQLite3](https://github.com/TryGhost/node-sqlite3) package which is a native Node.js module. You also need the [@electron/rebuild](https://github.com/electron/rebuild) package to rebuild the SQLite module against the currently installed Electron version. - -Install them with `npm install sqlite3 @electron/rebuild`. -Then you can rebuild SQLite with `./node_modules/.bin/electron-rebuild -f -w sqlite3` -In the JavaScript code of your main process you can now create a database: - -```ts -const sqlite3 = require('sqlite3'); -const db = new sqlite3.Database('/path/to/database/file.db'); -// create a table and insert a row -db.serialize(() => { - db.run("CREATE TABLE Users (name, lastName)"); - db.run("INSERT INTO Users VALUES (?, ?)", ['foo', 'bar']); -}); -``` - -Also you have to set up the ipcRenderer so that message from the renderer process are handled: - -```ts -ipcMain.handle('db-query', async (event, sqlQuery) => { - return new Promise(res => { - db.all(sqlQuery, (err, rows) => { - res(rows); - }); - }); -}); -``` -In your renderer process, you can now call the ipcHandler and fetch data from SQLite: - -```ts -const rows = await ipcRenderer.invoke('db-query', "SELECT * FROM Users"); -``` - -The downside of SQLite (or SQL in general) is that it is lacking many features that are handful when using a database together with **UI based** applications. It is not possible to observe queries or document fields and there is no replication method to sync data with a server. This makes SQLite a good solution when you just want to store data on the client or process expensive SQL queries on the server, but it is not suitable for more complex operations like two-way replication, encryption, compression and so on. Also developer helpers like TypeScript type safety are totally out of reach. - - - -## Follow up - -- Learn how to use RxDB as database in electron with the [Quickstart Tutorial](./quickstart.md). -- Check out the [RxDB Electron example](https://github.com/pubkey/rxdb/tree/master/examples/electron) -- There is a followup list of other [client side database alternatives](./alternatives.md) that you can try to use with Electron. diff --git a/docs/electron.html b/docs/electron.html deleted file mode 100644 index f5eee3ea223..00000000000 --- a/docs/electron.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - -Seamless Electron Storage with RxDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Electron Plugin

    -

    RxStorage Electron IpcRenderer & IpcMain

    -

    To use RxDB in electron, it is recommended to run the RxStorage in the main process and the RxDatabase in the renderer processes. With the rxdb electron plugin you can create a remote RxStorage and consume it from the renderer process.

    -

    To do this in a convenient way, the RxDB electron plugin provides the helper functions exposeIpcMainRxStorage and getRxStorageIpcRenderer. -Similar to the Worker RxStorage, these wrap any other RxStorage once in the main process and once in each renderer process. In the renderer you can then use the storage to create a RxDatabase which communicates with the storage of the main process to store and query data.

    -
    note

    nodeIntegration must be enabled in Electron.

    -
    //  main.js
    -const { exposeIpcMainRxStorage } = require('rxdb/plugins/electron');
    -const { getRxStorageMemory } = require('rxdb/plugins/storage-memory');
    -app.on('ready', async function () {
    -    exposeIpcMainRxStorage({
    -        key: 'main-storage',
    -        storage: getRxStorageMemory(),
    -        ipcMain: electron.ipcMain
    -    });
    -});
    -
    //  renderer.js
    -const { getRxStorageIpcRenderer } = require('rxdb/plugins/electron');
    -const { getRxStorageMemory } = require('rxdb/plugins/storage-memory');
    - 
    -const db = await createRxDatabase({
    -    name,
    -    storage: getRxStorageIpcRenderer({
    -        key: 'main-storage',
    -        ipcRenderer: electron.ipcRenderer
    -    })
    -});
    -/* ... */
    - -
    - - \ No newline at end of file diff --git a/docs/electron.md b/docs/electron.md deleted file mode 100644 index 689daa63a11..00000000000 --- a/docs/electron.md +++ /dev/null @@ -1,48 +0,0 @@ -# Seamless Electron Storage with RxDB - -> Use the RxDB Electron Plugin to share data between main and renderer processes. Enjoy quick queries, real-time sync, and robust offline support. - -# Electron Plugin - -## RxStorage Electron IpcRenderer & IpcMain - -To use RxDB in [electron](./electron-database.md), it is recommended to run the RxStorage in the main process and the RxDatabase in the renderer processes. With the rxdb electron plugin you can create a remote RxStorage and consume it from the renderer process. - -To do this in a convenient way, the RxDB electron plugin provides the helper functions `exposeIpcMainRxStorage` and `getRxStorageIpcRenderer`. -Similar to the [Worker RxStorage](./rx-storage-worker.md), these wrap any other [RxStorage](./rx-storage.md) once in the main process and once in each renderer process. In the renderer you can then use the storage to create a [RxDatabase](./rx-database.md) which communicates with the storage of the main process to store and query data. - -:::note -`nodeIntegration` must be enabled in [Electron](https://www.electronjs.org/docs/latest/api/browser-window#new-browserwindowoptions). -::: - -```ts -// main.js -const { exposeIpcMainRxStorage } = require('rxdb/plugins/electron'); -const { getRxStorageMemory } = require('rxdb/plugins/storage-memory'); -app.on('ready', async function () { - exposeIpcMainRxStorage({ - key: 'main-storage', - storage: getRxStorageMemory(), - ipcMain: electron.ipcMain - }); -}); -``` - -```ts -// renderer.js -const { getRxStorageIpcRenderer } = require('rxdb/plugins/electron'); -const { getRxStorageMemory } = require('rxdb/plugins/storage-memory'); - -const db = await createRxDatabase({ - name, - storage: getRxStorageIpcRenderer({ - key: 'main-storage', - ipcRenderer: electron.ipcRenderer - }) -}); -/* ... */ -``` - -## Related - -- [Comparison of Electron Databases](./electron-database.md) diff --git a/docs/encryption.html b/docs/encryption.html deleted file mode 100644 index 5f70792a5a3..00000000000 --- a/docs/encryption.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - -Encryption | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    🔒 Encrypted Local Storage with RxDB

    -

    The RxDB encryption plugin empowers developers to fortify their applications' data security. It seamlessly integrates with RxDB, allowing for the secure storage and retrieval of documents by encrypting them with a password. With encryption and decryption processes handled internally, it ensures that sensitive data remains confidential, making it a valuable tool for building robust, privacy-conscious applications. The encryption works on all RxDB supported devices types like the browser, ReactNative or Node.js.

    -

    Encryption Storage Layer

    -

    Encrypting client-side stored data in RxDB offers numerous advantages:

    -
      -
    • Enhanced Security: In the unfortunate event of a user's device being stolen, the encrypted data remains safeguarded on the hard drive, inaccessible without the correct password.
    • -
    • Access Control: You can retain control over stored data by revoking access at any time simply by withholding the password.
    • -
    • Tamper proof Other applications on the device cannot read out the stored data when the password is only kept in the process-specific memory
    • -
    -

    Querying encrypted data

    -

    RxDB handles the encryption and decryption of data internally. This means that when you work with a RxDocument, you can access the properties of the document just like you would with normal, unencrypted data. RxDB automatically decrypts the data for you when you retrieve it, making it transparent to your application code. -This means the encryption works with all RxStorage like SQLite, IndexedDB, OPFS and so on.

    -

    However, there's a limitation when it comes to querying encrypted fields. Encrypted fields cannot be used as operators in queries. This means you cannot perform queries like "find all documents where the encrypted field equals a certain value." RxDB does not expose the encrypted data in a way that allows direct querying based on the encrypted content. To filter or search for documents based on the contents of encrypted fields, you would need to first decrypt the data and then perform the query, which might not be efficient or practical in some cases. -You could however use the memory mapped RxStorage to replicate the encrypted documents into a non-encrypted in-memory storage and then query them like normal.

    -

    Password handling

    -

    RxDB does not define how you should store or retrieve the encryption password. It only requires you to provide the password on database creation which grants you flexibility in how you manage encryption passwords. -You could ask the user on app-start to insert the password, or you can retrieve the password from your backend on app start (or revoke access by no longer providing the password).

    -

    Asymmetric encryption

    -

    The encryption plugin itself uses symmetric encryption with a password to guarantee best performance when reading and storing data. -It is not able to do Asymmetric encryption by itself. If you need Asymmetric encryption with a private/publicKey, it is recommended to encrypted the password itself with the asymmetric keys and store the encrypted password beside the other data. On app-start you can decrypt the password with the private key and use the decrypted password in the RxDB encryption plugin

    -

    Using the RxDB Encryption Plugins

    -

    RxDB currently has two plugins for encryption:

    -
      -
    • The free encryption-crypto-js plugin that is based on the AES algorithm of the crypto-js library
    • -
    • The 👑 premium encryption-web-crypto plugin that is based on the native Web Crypto API which makes it faster and more secure to use. Document inserts are about 10x faster compared to crypto-js and it has a smaller build size because it uses the browsers API instead of bundling an npm module.
    • -
    -

    An RxDB encryption plugin is a wrapper around any other RxStorage.

    -
    1

    Wrap your RxStorage with the encryption

    import {
    -    wrappedKeyEncryptionCryptoJsStorage
    -} from 'rxdb/plugins/encryption-crypto-js';
    -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
    - 
    -// wrap the normal storage with the encryption plugin
    -const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({
    -    storage: getRxStorageLocalstorage()
    -});
    2

    Create a RxDatabase with the wrapped storage

    Also you have to set a password when creating the database. The format of the password depends on which encryption plugin is used.

    import { createRxDatabase } from 'rxdb/plugins/core';
    -// create an encrypted database
    -const db = await createRxDatabase({
    -    name: 'mydatabase',
    -    storage: encryptedStorage,
    -    password: 'sudoLetMeIn'
    -});
    3

    Create an RxCollection with an encrypted property

    To define a field as being encrypted, you have to add it to the encrypted fields list in the schema.

    const schema = {
    -    version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -      id: {
    -          type: 'string',
    -          maxLength: 100
    -      },
    -      secret: {
    -          type: 'string'
    -      },
    -  },
    -  required: ['id']
    -  encrypted: ['secret']
    -};
    - 
    -await db.addCollections({
    -    myDocuments: {
    -        schema
    -    }
    -})
    -

    Using Web-Crypto API

    -

    For professionals, we have the web-crypto 👑 premium plugin which is faster and more secure:

    -
    import {
    -    wrappedKeyEncryptionWebCryptoStorage,
    -    createPassword
    -} from 'rxdb-premium/plugins/encryption-web-crypto';
    -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb';
    - 
    -// wrap the normal storage with the encryption plugin
    -const encryptedIndexedDbStorage = wrappedKeyEncryptionWebCryptoStorage({
    -    storage: getRxStorageIndexedDB()
    -});
    - 
    -const myPasswordObject = {
    -    // Algorithm can be oneOf: 'AES-CTR' | 'AES-CBC' | 'AES-GCM'
    -    algorithm: 'AES-CTR',
    -    password: 'myRandomPasswordWithMin8Length'
    -};
    - 
    -// create an encrypted database
    -const db = await createRxDatabase({
    -    name: 'mydatabase',
    -    storage: encryptedIndexedDbStorage,
    -    password: myPasswordObject
    -});
    - 
    -/* ... */
    -

    Changing the password

    -

    The password is set database specific and it is not possible to change the password of a database. Opening an existing database with a different password will throw an error. To change the password you can either:

    -
      -
    • Use the storage migration plugin to migrate the database state into a new database.
    • -
    • Store a randomly created meta-password in a different RxDatabase as a value of a local document. Encrypt the meta password with the actual user password and read it out before creating the actual database.
    • -
    -

    Encrypted attachments

    -

    To store the attachments data encrypted, you have to set encrypted: true in the attachments property of the schema.

    -
    const mySchema = {
    -    version: 0,
    -    type: 'object',
    -    properties: {
    -        /* ... */
    -    },
    -    attachments: {
    -        encrypted: true // if true, the attachment-data will be encrypted with the db-password
    -    }
    -};
    -

    Encryption and workers

    -

    If you are using Worker RxStorage or SharedWorker RxStorage with encryption, it's recommended to run encryption inside of the worker. Encryption can be very cpu intensive and would take away CPU-power from the main thread which is the main reason to use workers.

    -

    You do not need to worry about setting the password inside of the worker. The password will be set when calling createRxDatabase from the main thread, and will be passed internally to the storage in the worker automatically.

    - - \ No newline at end of file diff --git a/docs/encryption.md b/docs/encryption.md deleted file mode 100644 index 0687b68ad55..00000000000 --- a/docs/encryption.md +++ /dev/null @@ -1,172 +0,0 @@ -# Encryption - -> Explore RxDB's 🔒 encryption plugin for enhanced data security in web and native apps, featuring password-based encryption and secure storage. - -import {Steps} from '@site/src/components/steps'; - -# 🔒 Encrypted Local Storage with RxDB - - - -The RxDB encryption plugin empowers developers to fortify their applications' data security. It seamlessly integrates with [RxDB](https://rxdb.info/), allowing for the secure storage and retrieval of documents by **encrypting them with a password**. With encryption and decryption processes handled internally, it ensures that sensitive data remains confidential, making it a valuable tool for building robust, privacy-conscious applications. The encryption works on all RxDB supported devices types like the **browser**, **ReactNative** or **Node.js**. - - - -Encrypting client-side stored data in RxDB offers numerous advantages: -- **Enhanced Security**: In the unfortunate event of a user's device being stolen, the encrypted data remains safeguarded on the hard drive, inaccessible without the correct password. -- **Access Control**: You can retain control over stored data by revoking access at any time simply by withholding the password. -- **Tamper proof** Other applications on the device cannot read out the stored data when the password is only kept in the process-specific memory - -## Querying encrypted data - -RxDB handles the encryption and decryption of data internally. This means that when you work with a RxDocument, you can access the properties of the document just like you would with normal, unencrypted data. RxDB automatically decrypts the data for you when you retrieve it, making it transparent to your application code. -This means the encryption works with all [RxStorage](./rx-storage.md) like **SQLite**, **IndexedDB**, **OPFS** and so on. - -However, there's a limitation when it comes to querying encrypted fields. **Encrypted fields cannot be used as operators in queries**. This means you cannot perform queries like "find all documents where the encrypted field equals a certain value." RxDB does not expose the encrypted data in a way that allows direct querying based on the encrypted content. To filter or search for documents based on the contents of encrypted fields, you would need to first decrypt the data and then perform the query, which might not be efficient or practical in some cases. -You could however use the [memory mapped](./rx-storage-memory-mapped.md) RxStorage to replicate the encrypted documents into a non-encrypted in-memory storage and then query them like normal. - -## Password handling -RxDB does not define how you should store or retrieve the encryption password. It only requires you to provide the password on database creation which grants you flexibility in how you manage encryption passwords. -You could ask the user on app-start to insert the password, or you can retrieve the password from your backend on app start (or revoke access by no longer providing the password). - -## Asymmetric encryption - -The encryption plugin itself uses **symmetric encryption** with a password to guarantee best performance when reading and storing data. -It is not able to do **Asymmetric encryption** by itself. If you need Asymmetric encryption with a private/publicKey, it is recommended to encrypted the password itself with the asymmetric keys and store the encrypted password beside the other data. On app-start you can decrypt the password with the private key and use the decrypted password in the RxDB encryption plugin - -## Using the RxDB Encryption Plugins - -RxDB currently has two plugins for encryption: - -- The free `encryption-crypto-js` plugin that is based on the `AES` algorithm of the [crypto-js](https://www.npmjs.com/package/crypto-js) library -- The [👑 premium](/premium/) `encryption-web-crypto` plugin that is based on the native [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) which makes it faster and more secure to use. Document inserts are about 10x faster compared to `crypto-js` and it has a smaller build size because it uses the browsers API instead of bundling an npm module. - -An RxDB encryption plugin is a wrapper around any other [RxStorage](./rx-storage.md). - - - -### Wrap your RxStorage with the encryption - -```ts -import { - wrappedKeyEncryptionCryptoJsStorage -} from 'rxdb/plugins/encryption-crypto-js'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -// wrap the normal storage with the encryption plugin -const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ - storage: getRxStorageLocalstorage() -}); -``` - -### Create a RxDatabase with the wrapped storage - -Also you have to set a **password** when creating the database. The format of the password depends on which encryption plugin is used. - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -// create an encrypted database -const db = await createRxDatabase({ - name: 'mydatabase', - storage: encryptedStorage, - password: 'sudoLetMeIn' -}); -``` - -### Create an RxCollection with an encrypted property - -To define a field as being encrypted, you have to add it to the `encrypted` fields list in the schema. - -```ts -const schema = { - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 - }, - secret: { - type: 'string' - }, - }, - required: ['id'] - encrypted: ['secret'] -}; - -await db.addCollections({ - myDocuments: { - schema - } -}) -``` - - -## Using Web-Crypto API - -For professionals, we have the `web-crypto` [👑 premium](/premium/) plugin which is faster and more secure: - -```ts -import { - wrappedKeyEncryptionWebCryptoStorage, - createPassword -} from 'rxdb-premium/plugins/encryption-web-crypto'; -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; - -// wrap the normal storage with the encryption plugin -const encryptedIndexedDbStorage = wrappedKeyEncryptionWebCryptoStorage({ - storage: getRxStorageIndexedDB() -}); - -const myPasswordObject = { - // Algorithm can be oneOf: 'AES-CTR' | 'AES-CBC' | 'AES-GCM' - algorithm: 'AES-CTR', - password: 'myRandomPasswordWithMin8Length' -}; - -// create an encrypted database -const db = await createRxDatabase({ - name: 'mydatabase', - storage: encryptedIndexedDbStorage, - password: myPasswordObject -}); - -/* ... */ -``` - -## Changing the password - -The password is set database specific and it is not possible to change the password of a database. Opening an existing database with a different password will throw an error. To change the password you can either: -- Use the [storage migration plugin](./migration-storage.md) to migrate the database state into a new database. -- Store a randomly created meta-password in a different RxDatabase as a value of a [local document](./rx-local-document.md). Encrypt the meta password with the actual user password and read it out before creating the actual database. - -## Encrypted attachments - -To store the [attachments](./rx-attachment.md) data encrypted, you have to set `encrypted: true` in the `attachments` property of the schema. - -```ts -const mySchema = { - version: 0, - type: 'object', - properties: { - /* ... */ - }, - attachments: { - encrypted: true // if true, the attachment-data will be encrypted with the db-password - } -}; -``` - -## Encryption and workers - -If you are using [Worker RxStorage](./rx-storage-worker.md) or [SharedWorker RxStorage](./rx-storage-shared-worker.md) with encryption, it's recommended to run encryption inside of the worker. Encryption can be very cpu intensive and would take away CPU-power from the main thread which is the main reason to use workers. - -You do not need to worry about setting the password inside of the worker. The password will be set when calling createRxDatabase from the main thread, and will be passed internally to the storage in the worker automatically. diff --git a/docs/errors.html b/docs/errors.html deleted file mode 100644 index 3d8a9c5894c..00000000000 --- a/docs/errors.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - -Error Messages | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxDB Error Messages

    -

    When RxDB has an error, an RxError object is thrown instead of a normal JavaScript Error. This RxError contains additional properties such as a code field and parameters. By default the full human readable error messages are not included into the RxDB build. This is because error messages have a high entropy and cannot be compressed well. Therefore only an error message with the correct error-code and parameters is thrown but without the full text. -When you enable the DevMode Plugin the full error messages are added to the RxError. This should only be done in development, not in production builds to keep a small build size.

    -

    All RxDB error messages

    - -
    - - \ No newline at end of file diff --git a/docs/errors.md b/docs/errors.md deleted file mode 100644 index 3fe0bfb26ac..00000000000 --- a/docs/errors.md +++ /dev/null @@ -1,14 +0,0 @@ -# Error Messages - -> Learn how RxDB throws RxErrors with codes and parameters. Keep builds lean, yet unveil full messages in development via the DevMode plugin. - -# RxDB Error Messages - -When RxDB has an error, an `RxError` object is thrown instead of a normal JavaScript `Error`. This `RxError` contains additional properties such as a `code` field and `parameters`. By default the full human readable error messages are not included into the RxDB build. This is because error messages have a high entropy and cannot be compressed well. Therefore only an error message with the correct error-code and parameters is thrown but without the full text. -When you enable the [DevMode Plugin](./dev-mode.md) the full error messages are added to the `RxError`. This should only be done in development, not in production builds to keep a small build size. - -## All RxDB error messages - -import { ErrorMessages } from '@site/src/components/error-messages'; - - diff --git a/docs/files/alternatives/aws-amplify.svg b/docs/files/alternatives/aws-amplify.svg deleted file mode 100644 index 0ca1b20d416..00000000000 --- a/docs/files/alternatives/aws-amplify.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - Amplify - - - - - - - - - - diff --git a/docs/files/alternatives/firebase.svg b/docs/files/alternatives/firebase.svg deleted file mode 100644 index 9f13a9a1077..00000000000 --- a/docs/files/alternatives/firebase.svg +++ /dev/null @@ -1,55 +0,0 @@ - - - - logo_lockup_firebase_horizontal - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/files/alternatives/meteor.svg b/docs/files/alternatives/meteor.svg deleted file mode 100644 index 7859402095d..00000000000 --- a/docs/files/alternatives/meteor.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/alternatives/meteor_text.svg b/docs/files/alternatives/meteor_text.svg deleted file mode 100644 index ebdb9559d98..00000000000 --- a/docs/files/alternatives/meteor_text.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/alternatives/pouchdb.svg b/docs/files/alternatives/pouchdb.svg deleted file mode 100644 index f833c277094..00000000000 --- a/docs/files/alternatives/pouchdb.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/docs/files/alternatives/rethinkdb.svg b/docs/files/alternatives/rethinkdb.svg deleted file mode 100644 index 30c8eead049..00000000000 --- a/docs/files/alternatives/rethinkdb.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/alternatives/supabase.svg b/docs/files/alternatives/supabase.svg deleted file mode 100644 index 60cbc71dc7c..00000000000 --- a/docs/files/alternatives/supabase.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/files/alternatives/watermelondb.png b/docs/files/alternatives/watermelondb.png deleted file mode 100644 index c8b3d573241d091735fc39148b25dfae1beacf42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45436 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 X^M4;;klm(2o>6rbtsD8*?mhb-H_En= diff --git a/docs/files/animations/realtime.gif b/docs/files/animations/realtime.gif deleted file mode 100644 index 2f43708092bc4467e06a930e1b61f2db4f9129d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 894875 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

    P3#@R7Yk%#Z*%BOJt>s-TsL}lzno{QvW(t`7 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

    @E;Yt!P3lHp|=>fxJ0c3wN|`0{n_Biu3$Ba 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

    ;t-aB@K;T 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

    2Cb3*V z6}I!NF$-Vpmd#?9EvlC1*cYrWmu>J?9Hy4JZ3i_vd-;(TWqD@}p9ziSYR{pwB921> zdP|`KOW}5_k+G}M@HX)T+>L-fmX(p0^`(^9_#i6If3m_#UWwGlORqIuH>-l&a1=JgsaMY0OUX5qaF5M!d$+(i`qK+tV)eu+KZY9QUGb(m- zq-t|aZ$c~qS98i0&2DX>DtYJ`xYC6;X^76kzOf~+v5mJqKe@htxqdjcz7xB>SGE0H z4?_lqilh4qALH%P≫L2=1-GDOZELHsMp7FL=8M4#aNZ`RXcojpY3rwfq*2VC?%x zn)KM$FP%S^-#fM2bClmEx8FX5{LelfvJ;57KV;uXf8Xi3(Te}b*nS_~Z1J1H<|H3APVB zUJksjrevp&t74D+tB(&R(HQJ|Tc=tv->k93MY?-U_S+p<`W+=!4->JUruglD+n&(k zz}EsEXLpAQ$AKfUSNnty0)Zzb!1ez&Ct0Wv82Sn8mEC)gm-S+W^U|wHoaZ=lk4r$bje;=5R@&@qrNstD|47tepXnuev-3(ynSYYboJ-uSgE%S+xA5MZ0ISWN4u_vVF0+1 zfI9;`MR!=0p~Gr2#0ZJ&9qI+**}?D)R@0^{5+_bq<8D4+o?SB?6i#n#18?tuGk5IQ zISG^1exs+;SEYCuW{v zowqZc>w3FqC3YC9Fx+$SU$>pTzuUbJaVN|QiwMm!vhvN(uYL5yPPN z^-c4CjPIOUwC^x9PbHik@Pno!s`xBMelKun7b_zk@Un~5lF;@K{N*VD^U?Ocigtpi z<`h5gkGA3ytmP&@4vz-(x5MGz3j6h|XnM4b&S8sT=y=u3bFY)4_0=d0N}q`lxu=;rC}w;Hie$$03~Q=@pO?`tOu$scaTxXNV3L2IbRXjX8oM zVQ6;3pr!=O5?FB-VT<#6d z+_auRWDtpN8q8=Q5}!+bGwsG?B#~b6mu~v4*+l3>7V<(lZO-QxF|T!rDZ&gMBZ4KA zf0L@2AIxA8A2cqS(#4+mxAMa*w%Q$GjDe@WN&nnTj;1hMbZ>h7`Jj~4>nnW#i1**U z`>m?(Ps1D~@ zb{wWVrHTFs&PYNb)_e@>UMmY~UzpPzt*7D7oATBp)|%?fle};NMhcFbAF8V2ZcFzn zrvN;zT_f~J1m*h42q9y;=WwnzW8e1(ilEbDny@Q;K)l$AG&dGw5@uKqUA~%|wt7X; zUv02i{@B|r&P%Iz`B6k3y3P}y{^`0dsCnqQZ@B%_E95O=E9tmhui*OrN8Hr_@^t9I z&E1L?oHEmodxW!Te~HrfVKPCCfM>I?6c2ktYEXf-of|dUV)HaVCLZyhhiRg0oE)!u z&4hi2y~iVGXJy<+kidUZO@Ga8U534mWB;DdL_2C?1p#yfu<|h?_`TldO6On>({dMt zp@=YgI$o2z2f;)vs=fZUpG&9?nh%k5Y)GnlE~xw1HE*~-*|qNf^0{h^FZ3GQ$qJb_ z?Uw%AagBh?A<6x8?6qYk;hMiIA>v;5#K_U%Pami;++73Y?DiVf=1Lo@-le;CA_X_} z$O1O+*olXJ1FUIdUFT)Eranqk9>9NYL&TVfFKT>_;U2$qL)Fx^qt!lar~3Onp11VC z@BXa#`@cN>L--@9i0h};OK-#6c+v7X198~p$oi2mlp9gyU=is3Fj(AzT%Tx8@2~(r zewanpJN!|U9}HhtYU2e=sP*ZnQT0lN$rv!q7F5#R*ZZhRyX5!}(zTMTmvgSrZ+yOY zrXyxl2pjW=t1#c%q6beaM{94HP=j!Wd6KvR{){I8>~i#Dn6MZ(wsMS-DtPt^a{v+jhnYzqq82ykN*wo=Y;{gs{8P`V^86rY@CHBUI zx1mhGKU=hl3r*8S`7-{-)e}agAy{tv;ERmQx+ppf^cojUl5>mEPB~{3FXLG@bI+`g zx;!#V-Ha_4FgiFSgJ{ueG$G>-?u(@H-=NVjGLRiR;!#*bL)I#}i0yX!sQxC>oeLm? zrnn^;{2r$C!;%^I_DLQlQ;F`j>M(>fE%??R6g-9rbN>9a5IFTx^f@BTefoJ!14le4 z24MVvqNZ#hb*T2frRGj4H9ZmKdBcmTP>4r#Cz@qnl;JkWfS&{&;h6s!>*gs+p!VE9 z^cIDgy+5b6~&IDDpvHeGt?&B&0vu1SE z?>u^9`4H?ndTb-kN|IwKNe<2N+MZo3nVei0>bQeKJw@K_uU%Z+nMF$TyD)3>*_sEhYtSmryWF;8nY?hLGtvO z9-9A`Fr!jSarD2!;^Y#pfo@O(npJd6zOQ|h5^N?qr<$v3#Hv=6OlA(@vRjwV-E46V z(OS>Oq$A;3`+t5ZP6G_7jx|U4j-29`!Zxx_)bp_4eh8OV*X8_1)(--rT1?lbFY0=Z zk$-khq@>W#sJ;j*-wOAtV`#X0BpNn}d!Ig~d-Qj?#g>zyE`ICT{ObrpYud#;I$!}+ zszF_AM*Z{RPugb-!0=IfkU9|*(P<&ZH9Ju5Y!+d*Vval>>YE~SV>#n%_0dFoA$@r* zrcGCnvLJc7;H_JkJmic9b&Xc^$Sz-R>UjTNYq@|h4LZYn&eWs5@^;`uxwX_b)zMw& zzo7}i}(yDrqQN(Dm~zrL%Zvgb}&u0z_J*4}#d;rTg+w8$=13VIB5 z3D`#@Q~m~)+&i0}oM$ANOdJybO*L@Zfp8zJJ`8(|N&DS?xbC1vT;H2ajH8~0jOZTm zlz2_qG}`e~w*KbRs2qgQ+=Tz(cQZ?{GBFr&#+Uu2n$*2$<`M2(nyGuH3^?w#33AoK zpwj((?7hft7X=|iMHVHchXnS?&!Lt()T&E;qaOS>G4Vc0Cme*go8bqrw0Wi z-uHg^Jpldxf-T@@ibQA?GXlSkj4qXRH#|3w_5XF`Uan3EK1}+r-2MXi-5@u36=jrT zI>)Rb>6ZM<%T9~;M8r5pxl}+!ZkMI>63KJNG z9vb*f3d7MbF=xDeohNF;L0fbB`>tBlOqDyVQF zruZzTge$I0C9c9QuF5a|Lrz>xS6tmzT*FsfGe%r1OI*8hNbw->ZEvvZNvPdwec?ho zrOkIEDhXqDi3X)l-hJVA0b!bk@20_n!Z8w-SrS&264sp(Hj~5Se^3t2BPm&#N`?DMMZ`!&W=TN~LVjR|)rs&jIi*W|l!$+pO2Cya_xzrfz+in6 zssfF`w&BLGk^bc?of;#ZmL;8DDV@4?A zuMQj_(bo+^>CH*`Ep`dhknhe&0Bg)J_1Y2XQnV<3g#$T-LtTX<*w2MiF%T0xgyAjz4G(}5vec$j{giF7>Z?^|pTV`!!TOo$^J;2%$;~`7&u~PA= zQ}KCH5x%MTa-oQLRz$*6LZ((i;dpKID51$Kq3bDO*eN{>hS|{pWa=V2zIHZm%HvKc z;Sq}@;kH52L~Xgl+9zc@8)XRvl!@e(iS?98?376%%4D(1)4X4xJkp64f%uw>gHx5;|{}Cd+lH z!VOn>kEi;9T9t=G^`n3)PprykxcnD8)vplMZ?USp*{Xb1s{CE50#mAjTdG2rs={zp z5xgIw)IYv+{16lPAuj(zaBKb}f@48AMJaY+^tNKEYC}nG>WBPg`*!6|p(F;|-Z1}w zFmvuOQ%9vA@@i^&YU*}s8W1(j*d-JuwSTy3I$cXTMHtFVYLA6s7PCuso`6^Tat7yf z+Raz?lzt!2a5Fn~bBMY{th!~kx>c3Bb(gx$l)CMfy4|I^JzU)ZPs5Q~!-+$~SwO=@ zUc*&S!_7{^9irh8yW#;aSkoOzb!m~G(tvDfq`w(s#Am4;DKrV?eT^nPoo2U&?ZR}$CM?fv z9j_{#_AZ@{DV@$OovurrZn#blo^G#zhBuwIagkOQueyhv`km7FY^S{$19$!>0r)mzKnqWZJa(S}n` zt+O?yx4osebE&rr*W1I>|4psG&!K-HpkFbyHd>`pN)|sZs&{Iqcb2VxUZsE0rT=;n z>S{~>`cfYT*S|&-b-@Dk^6rJ#F9yg!LlhcARL)&&JcCh)C|l@^KTDW~WjLpg0XoUfYs3#{+7Nf!5bw$m_+kj6 z(UV06XesIb6)+-F*z-?{24fhJ+8dGi8Ii{sQREm=E*omWLOq@$E$;zF38DJCWfU~O zDLIW91dZP)7{4~6XYsAz8EtBO}J@H-gBCK zIMQ|Y3^gug0@#P?D24ieHQ~uI`BrVhtFQ%cGWiyUp@tdu>1vM+XevT;(DW`$tCUKh zdtXf7R2*S%D&c2(OCLtHZ3MN%AbdvCf+hQJZH}*(DZH4{yPGP9nX1s3srnt*K|>X5 z(G4sygma8Vj%&5nH8*+!5_hzeZAF5oL>A#p6Y;UsShMCV|Yb^g(Y#ou%G&i?5 zx3D*tFbuKCF}JQZx9K*woi?}IHn+brcX%;(1X?)JSU7W9SjQbnB$&G?Sh&X>x%nNt z$60vhSa?-icy}LrezvfXICe8Pm$F1t=si#`HVfjk41T>$1P;@>57Ah~pqRT7vTbKA*zhW4#(YNwy>xypc z%4zGWZR_f*vto7hTA)oGiH*8aXuY6KgMv+?zD<+8O|zd(OPozBiFJFmO~>m=4vDp@ zVQAO3O}l%jMr)|L-(fJP?SPp?_rzL*Kcwzk0d4LR{Iw zXdJFN9c~33{wO%y={x*q@9<0XT4#DLXNE63a0O>3 z1Lq<#r-w?1$GF>vxa)tw>vyTn?76qBfNS>aTQ-C<7s!R1*5y5y%LgGB9z~ar1}>i* zTt54|e2I7Yn(Okd#)Y@Xg>S}%f5!#Z?C|tUu}0YWEv>64m+SZVwl`m##mf|3B@A38 z9bBdSU8Un)WpZ6*Yh2}e?y7n(zhAp5B3zX~Zpwfp78*BIA-5ljZfXW@>JDxi{%)G_ zZfeJ_S~YGuJ#M-)ZhAXz`qyp-2sgtOR&9{GF_*iEkh`g(yP1Kzxr4g}^WBD@yH&2c zb&b1CJf&sAZ<`%=`)hXxggaHFyCbcKGna>pkVi`)hKQtxyMu>^|37n556@f=?-~!E zk^gMN!vc_y=pWF~0Z0fWc9Pe6J3nRv3KAv)34ui=RSWG4#w29b9j(n92nWBB$&#we zABra9vECf5D;SB#|M&l8y?uoO@Bd=Geb?~+ZN1$v?A=kC=`X9Jbj#whqYT^T)1yqs z;djSbuFF=(*`7yb$2q=#Pmgm0Fj!BZAtcr(c@b~RPx50vpPdvWNU)w3{#3U_0%1VpN&&n&C&(11phY_sjm5s~R=T)so<>%F%f6vZqdNJ58 zY6nSdF6u_#R$SCiem=iwn3Z6=Y+O{gxolcBuefa9bU(jr*$rd6YCZU6bJccITyfQY z(R_Z@0UKt!?z~&Jx$e3@s<`fc{(FAig9KoQ^`ep5!ul|oD`EY(UoKz+U`h6yK_U&? zn;|lb%9~*-kBgfTx^VW}QN~o;+cB1s%G+`FmW$i}Z|dz=xl+x?)lXNQ|E`{{djVX} zut8FX=bKUHn&;ceFW1k1W+l1ccZ(Vh@c&jVYT$o2J+9&ZcEh<|?hjHOULH(U;&tNP!!V9UJPDXAUFn!#w^u` ztqltzn}lL~8SMjl!-DB>^Drf)`Ux^%AuMuv*czk#B<-+J?wCAW3#kE$by(Qf$vmLP z=m58f2ijiI9@ZCrBL~e9LR3bIRs(llsIhjw=GCIWReG_en zTR=7g>2Z||f+(8%UZKxW zay9G_R1~AbcNS|TTFw~1P_Pb#T%{-U%ZGk-x6JGM!6MOYhC5noS4*CMBcb%SVQ`tTrscgZ6K~G6qR8#03h~yTk3*< zd1JB{AU2CY2HmOVI)mkdneM?q~3&3N(7nW!14J)q~!De~)n?VDRZkoymHlBxe`; z&Wja1ScZ(l?wZbhcqEJ_Go^V|UqD>9Mx@3;MWNsqzU+Op*>=)|R2Hg0X~XwH8Y@ zMkF^+*VbfVb{fj-j0!&pqOY$F6)hdW7jUzXcYXLl^6>}i4{B7S3hyAl=7#J9reoH! z^ciP_sC#Hq;T0SZ-jZx3H(to>vvKCtsEg-BmSe%-OzjcIF?HF4)uiDLxT&nda(jYBL^L0)O z1xH^-6ecqLo{~SHCZL@Z{V&6 z0`2}1DdoY(9Gpy2e%gu2i9fGEf>SumfY}&rlO=zMKyzn-!eiT!V0 z-1kYI+RsKsieBmK5uAU=%5BYms$pqvNqoy=5bXOJs7s(ok(!acEo|NN4u#w22UOYp zKjWp!KrcV<=^Nb}6OA*oSjT`ltkZ@!XWIK$ae1{y)AmNWkP~qqq_tMt#)5Q~z(C=F zY^qV=)_D0V=gg!IhxSuT!y}*`(89%v>ZZ&j^k$ zVr<(x#e{DCZ-hAg<20Dvn3TkfRrU7GA{32E=mlVAQTj%HWkSP7(9PMvgw`ZP_)N&9(|8*nW zPU&|BixIE5_k=-E0~EC^rEVD^vQ#d(*8kj8PgICR@SkkRrQxt?E|H^>n+lD)nq!#T zb)%+ALI6eyGP8$I{D1h3;o$lIe*EG_DPPvvM%VvZB7Y#RNjnOrQ3~9Y6icx{P6c?< z?Mc(`0$LLAb^~yKIvV~nC3t%xMVERZW#6#jzByu4j;pDe|@j zfor%aWrEVKX$b9}KmMMoAF<5(f!YD1n&6NpxG2mcMKk7~@@+^sSzh=M0!@Z`R^1Dr zN?fZLQ=%-JqU(k!gLkO-sYzoqM437;1RYt)PcxhITi@?_fmYahUWEFGOvS zum*t_hBq;?7G;qYZl7V>PlCcx@S9q5 zu;~pT#P|;^i7Y2}FP=$Cdx^4nNq`&q%T+@B2ZHy~NkU?Y>Vb(Wh`?m+z9h!?Ngv6@ zo+FZWMv3?%iNvvpdDaM|ACmb@lhyK)rPf?^oPN^oCCilVtA{ycn7_}3t`af#NkswdPaJBR$F?`S~~P0J)bg^91_2ik2-!hxEGF!be+oeI!^vv$E%pUTr-fvm`Wf{M`GDaga#!l1g zPt$}8H5&I+=F*h)=~c)-Wv_Z=ucv2kwqP&wVLqn9M>}lonAZH(?=bW|WT&(3> zJ>JnBZ$B;zb{Sp zcUUTicY)+h{%m@_Z=~$!r~+XMA};K_k;Oa_??TzU0zPdpX;h)YBjNW9aQkARqIS`j zyh2QoBK7v7PxwV7ttq+`#d_BHXfj}J)?&+X0)20=YDTd=E1{-0*y6F+m6yQA8f>Rs z;+;X@WDRy{FA0dkx6v;4q9_eJ!-tF)hPRi}BAiNCy@UP7OOv9&k=Dh@-esik3qOpf zdXtx>J(i(5;dFsZfdVUI96cN zS9DTTq6G4FdxOhaEBo3ZL)PG9?t;1yU ziLUh<<@L~vdUl^O+lP9Ev-%GcrSB0s4I(lPUu{ZX>9;TC4T2pd0+fwn9q-Gv8l^HD zy+1U{Wajy;HA;>*D)Hqh@-=;BZBjpns%18@M>XkoKy{v)XwRCAqoGDR%@i`tmO4<2 zj%K3rW_ui{9c7D-b0ew~D6I|julEZ>Vz8rZi)s*`PsNuh(qtE$R(+Jl)Q1+8g%+&7 z)`$+qx1OMMuP>n!VTtE&g?(DQ_ggWM+tOtjzqPixxwK(AwdPeYeS89DKY{!*+Z{i& zB6{0Hok}A8=cRG*)DL#cfA|NjrePb4;ug%Fxla(1DTHsUMR54Y@0$ zzN5~h6C<$Gp)j3Sq|5%i6CJVFg`G^NT%W#B!QQCDw^{*-T1@|7)K#lPuqzAxoymRh z#0dRH2&3$QTXdxPNaaZrK27vIMzo+9^`g}QQSy2bNI;&wUKHd$U>zPldmmbiG_MZ` zR}M@>1^j^gI?mrmM&G~up$hCG6N zMGnZx4^HL=%Rsrs640b;hYWN%R402k0`NYtg9TwA+s$EQ-XT={dg&N6PhTkK3ZSmz zpD6O3z(^cV&B7NFo~$tLL%`4maA{ID82)3Ml6LCh5ANNJsYj)nPWwG|;5%KL-*pnh za#YE~@P7K7YUXy6_VQvH#y|7gNPp~{dET6Pd7eR{o<$LuMbn$bfXrfM&tiAY;%?0X z;j>`sIRb$>BE2~h$Q)Vr97We0)z%yhe2$KK{`EM3QE&b&WS%8^p0#V9eQTZ*KF>|P z@IheVBSLTCGi2dw_5yF$0{_;6AbdfXdQnthQA}@90&ZMT-~;meNHE6xHdu6ir( zkQI;mDbHBZ4Ud_B1b9AnOlO^(|52^V=dXmxiw0+}ehXQRp%#sXuO*ZbRl^iq0TkEyd8}$Mkjd~l+kd4;tjrOjM z&aI8V3H=^8n zuwDc!%1}cc(bJIjo;a`rmG+$Iu%8kD>~UC52>^;5fHNIIegc4)6ENiX8}$Ih3*Od% z?LAKIrO^RDe-r?;2jsi}C%UYBfrF>tSYN0-JN814fM z7*2B}7q|D36FYCWy*~i!1P)3A*YE9Or^oHiDx9F!L9SnO>>Qg@E1L}Tn@9?~=b2Y` ze|D~)cdDP-m@+osonPJRZ{GU}v?fnYm9$)3wPSQ=z-wQ3j9UgC+sMX4Hw3_4Y+h&v zFshv!8pI79?Ja}QZG7T7W4yp0pIfv8*!gzLdDjiAfnYR(d*X)X56&QZt?>8&9?s{U zTZAwMiV+@s`wvEA|67H-`#;zy@2%d(-%Y*gSfT^(O`|Ks3#TjnNB9FEECl`}cY}tE zEyM-Zq5TnhITJ>--P;T9g@fF=?@;M+G_M6=;9o%sJty4?W;-(*E0^P4Ktn_)PGYxH zk6Kk|*A2;p8&_D*6e_IRR z-Sf*s2qSI==&^F=u_EuWn)az4K~XF8)a?IMr2N#{^VE6$y+#_pail$Rhgg!W^WDzV zr#}@6x{f7J4}_cscTaImvxF z>v_4@dAU+VfzcvvL5R1tC}G@~>kd5L6YX2qFGztRyTU=}cr;?KYh5%9k6JJUGjUKX zikLa0b^dziHGwYRheob)AeF=UF|(lkX&fi{V(?3DyZ$aZL~!K!M!+z z;?P2IDDG~hxD|&|pp;_8EeTGL;x576J-8HihZc8=dk*_ObIyF{=FHwR`)1F4x4BB@ zFPYyn>siZsD3d>p^w_Z8ak0aVitJ=D?)JH>HC6A_w8Qu58I4;1%&Z%PODmtQ|Iea7 zibeuVZQ%0B|AAejKi%NMW-LR@ADzbV(r&6iElWPb@XCI!+@upsV|4AXRF806@6Ry0 zaawElMWDYnzIFcF7e%X(X?*9hGy1<&Z$Dli$oh=%dwzO)skcia0~xC%QSoKDq|nH$ zs-%FlAzad!EcsQ^*zbF}WN-zys$}pb0Nk>Khzna;VhvetxmS8t)qSxIF5L1Iw)xfa zRNss%WvM;3sugJc0X&LxW+XL=3^B4iN=!-blogn>LU@$f3iGEF=u3NfR5%*9YJQ_+ zT=J-L4=~oM@|L!qtMboV)v5`uli;cf?dI32i=6fnmx|tO)oMr}03?hbP?_pp)Shye zh#@{=>$;B$v>=jRDTabNEtU6u37vAh+jXBbB+#x}lw@8s_MbH5+#1wAS=a06D7f+K z8rc5&KI`wgf;B&kUO&QP=pTHgXAWV~?NRbLezj;KC*7cLn*|bB(k450W3Z0LEnYGb z)6zAZb+{5R{yqSDzhG2ta&1_iXwtZ3<;$eU=eb$XXzD$bcg^Eixjnz?*UEom+RsVc zWEPAcjWiP60axYy7X>s}W`+AeX|B)#Q3bWxg%~@4}RJB|vyCz!i88 z0x)DH=}7@wVbOd%L|>f&UaTSJI1;~NVqFXHqVyqp0zrZ<4yZ(-LTH>?QW)~&mb9f2 zePUW&K=la}vh*q$_BAP79=agXE+h!f_nKd?>?b2Wzspu^sfiYrw6OnlsQB*oEX=Lx z{VR7?G@%7Z6fLtQgaiQOe+e5W2YzHiUQuLz6jGEX4F@mY4~PvSVFD7PsHy5uIf?FK z9A^TFkM&J?NVq%pR`Uqmk}YV&30uWUwHOQdtl4$KSWtr)?Qg1r>4)cDIc(vEcik$8 zuzmrmmF1C?VXreWp@#`?eM~4a-c~?LQMD2Hqy_;f>7E2)h`)1!WFZ1VxW&yO#BrOn z^jp1RJk3hajv=XF;sRd1AXT@9=?s1QZG|K0XzfrJsx5tmcNpB_hDh%t4g+#IdNDsZ z`&5uksDNokLZe(erWt>`+Q~AdGTQlBy84w z-X$dhK+VWX-ixph{*=nOAHuxYe{clvwJPi3+_)`J&f(@)r|TyD7@tjZkd0xuVoCdJ zD@5??5@D$NY>A%Qq?&bj%xeo&s^wed%jI zY=wtotZv`luX5=5uR@W$OLQ{+{ft8%k8RvrrrN~6U=j%B?( ztp;Pdd(}|fBQp(_xxu-5hWBlUJa3l_<{AVfvSu-DsM26QuCWYv0R#3Xtww7tz=jV} z4ys+U9OZirjRSH{KmF2-lSh6xppPg^X#O@n(4B9&tv2PWY&AJ?_Ym{DaPoY~JpHpu zYTK3j<~7@DdfhPJehT{Lvn}%Zer~?wrth2IRqN;H>-kOunsY!gi7_(S0vsss9Q3Nq z>^Jv97e3fIgh|vKOK+i@tiQ?)6#M_w+e76-D=N z*0))6dMy6_jQ%6JPt=AdX>r6>{zvNU%O-f^;^;T(p9Tw10k2!VcUO#(f;?EyO>SwPQ%uy#e|N z>6$4NxT5HGMsG;znyq|U#ad6LaSos4M ztcgVj^E~FQU1eTNbZdgSCeoG>0x}dRrbh_R7%FW2Z0Xile!M|xTMLTI4eiHj-@=n} z{=QnjF1cwxvYPf@G2!YF7~>uS#g8H&{JOUXBNCw4}L1MPu@ z@vbq!vZSX2T@C&^$SR;RhQ^Y`Lu7f($-U*1@uAS^{rsjMSM@24qZ{yXaoY6AxN-Fq z82s?3UcjT@=<%d)to1MMoX3z6$61ns*V2uN=U3e|)3BSzNlJ+uPD$@|!2xL=VcL7o zkC|68Jw8Wl9Y@orB3GsU?M;$d-f2;Y=ktPH4|0@fw7!3t#ub7cBUbOdmsFN<%$t1A z-QGXt-#s6|1+UH`G<-R_Hfh#?h?_oIzw?;&$8CkqyYE3hClH6b$Zz8HIhFU-X|qDRCXJapnKypn7NK%Y1`Mm`*~4vy6e$DV;> z8FvE9Qf_+MZoND9F5pBC30`ThU(iXk8F3(A7ujQcb}J2ms0d-Y1eq}pO0ZO%RM*N! zsTNBq^c8Vd?>ZWi_WhhLc&!vs2oDXPbmYF&%3W77b~k!L4ZV+adTiICl60w&^!@K{ zuHJaowhXp+t?bm&+}b^Yi_(bE{qB|rX=-gA7UQ0vH$5fZJumGjw7PEL%O3tOJtIRh zwGllMs=sWI>P2R#d1rbyzDmi2$ns#yj!^VQyp?5%$k37Q)%esqVlJB^BlAJEMn0l9 zKBafKShlQHmeo>%VyRd0Pomir#DpQD>0O3{mcp z?6t`rE~y(Xts9OG0Q+a7f9)=WUDmNo4;3-~F4fO=L;}`n|E{z8U9YX89HjECyD&>+&r0nRl_UMe&=&bALT*&Br!stT&=wjXIQt#;U z%;?J2=<4O@8enW`on&l-aqQ2E8e6OCSY1N-it@IrdX`<^t}NyA7xjJFI27$#y%h}I zjj@x_=W8FrS|xh)%dmR_)W<8ZNm6n{`h^}_(Sjb3+GND!1W^VdzTD(1>q*jM!UNYya^G6J08NVekNm-tRI?v>^FAK0OwvBpP@_$~ zIj(sv$8A72#kgIAyZOOZ_#;zP(tpK0UccZTd>F{6|C6`}=D+_VagPB-j{lvwht_}N z9{-Jd?Bypp-R~C_R@@(yHJ;obRt<1I9MwUXwT_$q8~6AxxW|JN%b+yn|BHJFuI9x; z%hG`K{{{CL8dCQZ@I`gi!2n~RT}qNy2!j8DHOjMLX7*}Ut}TS7D)n?CxR$1 zvoX|)q{)USz`~a~1W`q@EXtGNhL^eIqeb$9!;{fomw9x!#fl2bQ*o)6`K)Ti%6h|7 zi7l4}Tv5fUw#w6~OP4UA(PDLv;pxo#%R))q5>1HmOfKbBk)m3OR?_ecO!%r;Gpa

    8iqW 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 Thp*>Qa1CSB3PTxbq#gec+h#;^ diff --git a/docs/files/animations/realtime.mp4 b/docs/files/animations/realtime.mp4 deleted file mode 100644 index c21dd6de24df9dd3ebf7736f5bcc707d2a63b16e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137286 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

    $IJDQeuJwH8yE%}LaQZ@;2CIKT#c!f<>zvYQ#i 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 YGr>;+1_TW7DFa@XcA)kDZ5#Ig044!eqW}N^ diff --git a/docs/files/audio/heartbeat/heartbeat.wav b/docs/files/audio/heartbeat/heartbeat.wav deleted file mode 100644 index 9ef79872da349ca2967f1d408f256a50fd1caad1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150224 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 diff --git a/docs/files/chat-app.png b/docs/files/chat-app.png deleted file mode 100644 index f2041f4eb3fbedbc1754f00a057da90d5706a2ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150757 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 &i^Ip>ege+xVvdsX~2S0dIQo>No&u4mG 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

    ebgcvE{ zSrLSE>(>4N7k*d&FwBNx*A$3r;YG{O2nuO{Mku6wX9XXS}O!@aIgY=#Bz8 zW{{M)W<#pF6%{5<%+w%7VJH{=eL>F;dx=;VsITw=hAxZcoV>n)%?1}fJeZ3m61x#z^Cc#eR0{V*LC*d*E(S5|bFVpm>#qMRzq70v~XX$2Zf({V2y!y)l2 zn9_%x3@-3(6ObewR1EbkB=IYwo`vMrlyPSUnyI4~lKM@%ER0B)728{x$*X8_xlbQv zCr4NZRFUoSpfu@HOZjJ&xFm4>@}SJL83-k90F@X|(nOxd#TP|eeuYK>QUyVWWls|r zg)W1wYi5{%IzK|h@_#gh6q&rzlUU90MiyYPB+!es=|jVl!-9CcGR-Hw!)Dv`xkZ>W z)WG+A8@P9OiR))P-cd4uIkE&KfZqDvm79|=WxKYN#u>9yvt*+o!4R>xCmqW?_2Sf- zS!0O78CP7hWT0iTYOFOhcdZ|lu0GaePp7xFFQANL3$e89V97kt4Xzy~LnulGE|Ye! zl?7vtPb92J)K`#~47?QJ;)&5Ua$M)e?Z8QlTSz{wnr9P`BuZh>c?njTr?#-KT_KsQ zjW=Lmy~cQ&Oxr3;9J-c)?Ux6q!5Qn4vRw5Lz}j7IcMm~)=b{CAVzdnK1%nJ;Xd*A6 z(Hl*aw7bl|X-!~^W!5`Gv<{T%;l^%CefD1C`jMGF4WORGI<;yi0igMY@}e98205gG z#Vv$|Rp)MGunMVh&bCGW<(CZr?%lWK|Gh20xw+AjG}rOinKl46dvHt`TeVgd(&W2; zFi}=46r+h$;+~xVk!zPO0Yp#vEcX|MJvTi)f0t-z}x~QrMLDjxX0N zws_Kwnh~sSsbhIQo)MflJm^j*<0rNIa~#n-)G7QIgq;>+AIQ2OezkCP0xlK=WqSyT zqfBA+4XI|xVecn9Dkn+C!J}N*4Drmpyjp`m=MKDPF6^p|Etv|fa{10_;+We(Pf4u1 za(v_1JD2GX)oJ!x05tRS(zNeb2B#8_JLNzV(&qZ12aoa8a(_Y`kJeJvK1|_x$&V{3 zS;ldBeqj2sli@MoURAgf`~D zCW?j@p(6HYu-h4iu97KKfr~kgWZU_Y73znGh#}4?huTs?B|Wv@{XE>+6^<#75WiBm z(FqcKYACWM&p3Obl3okr&Lshkp;ilm&oM%yKp$_$e;rgljXuLVgyoV zugthIBkUhWWhID($?~Aqc5uAe;o`@1k8CO&j5b^t& zwy#4^uA)RCDk}`kDytaI8`h7tGc+WA(XJ9yVWEDq$8Ey6MEvR)04A1oMRYa$k+lq{G`tqGuD8nwq?@O1hj zQwFY%M5uDx`c!P=QOKa$?+E{^@yN>|Z8Jj7sB=0&cg z*_2c;~{?LcUHjF2o#6*^$Xuo!K|rQ*Ec+1Q5I=e-%T*pr)QJ` zDDn8Xyo4Mf`?+?~!l&SBV#*dXz=gO1iH0ZcHN#lPYB$iqHh*gG&c3;L`+MQrM?e|w zJq#FqwFd2gFSaR@f%$G}Z8-8j88fk(a%i*~_;~3qEmCc#uG%E=nSO{vgoK;k)C~crVp^i>UtRcuVj-D$Sf=tpP0W%F0UX<`_~XwbIQW zE#bn-fFRstA>zLRY&zak*_*dz?R~Fje5t_uc#i;dEQk7@`w?Q74~y|hNtvwNLZ191F*T7r7Iy1-lT1_MxoEUf!4GoR7w6vxEoMV?Dx#>TDgibe2bG*W%Q>J4>v1peI ztWYH~Qp|-D6E?Z;?wi1iel+Tz##V+>?`$1@_YOF8V8Rh~t;_QtPM9n-#dho`9eR@l z!LSzQ^0Kq5)qB+v(r8~%f&d3GS#tHN0aAr>VD&MAR=3evLp*%7g1ldSr+?EaDO=c; znVr3TRrSZ0?X^I?r275zQOa3cE#10VZ~93sTrgzM(%roY8STV_SCcafveju+%;Wt% zx)n^@)}LLIA29D+Zb>tMScFK@d=If*$JE9d&N1*<`X*;1ZGxs@SmhRw-WO*T2*iqu z>(N?z<}B7u5pI}RRjmRQJBy|3CZSJm4a2yLPtryoo4vl(eRZx*7bGDjuD&;^0uRFAikSGA^Xt#6 zAyimCG*?u3;6!F+HzBKbY~VT`0)QrG-e3&P2PGfC$zPqSFMR5>N04%SD$e6eZN^`0 zty5dgBtnwgVA++CU!W!V?f4f2Huf%Z$X`_-K2{4@hOV%?lDfzB+@_y4fv&2Xh%7Lw zaVb=b{MQoyj;eva=bV45_innh=jxZTGW%<-OHlP+*UQl6{$#&Mj0xme(!IOP*r5fh zyuxsfZbvx1eA4hXM)!Y+Nft5wosXiBL2rS88=5NMJ@0<`HbE-MZ}+VUvx%)OpOLHCnE~{mpLUcj{)Q_li^d1`jtkFjh_5 zTIiEx&3p10%@>XVSaW3I|Hf2n(v<_@I06%B)_zHoB2!@__TI z#sZn^o#V}Tb}dzICWi{~v*H_Uv;?|I(!uJ=3tSk{`Ev(MT4+~?lc zeO=dWe;W5I*{LgWW+CZQ79q7F@tdn&V;v3&k0+})`M8w8?M?{KuefQmAgdjuV=S!p1GgG43^r;fR+!mjxr^O67t#scl>MPxv z%rQ^P4HcGcrAmyk4DhoiDf)(@4a%CdLZ4k3WcU8~+x#6DC|TyZ;!8~8)H00_X!6c) zGrHr+#z*ltg=Vje7>~u_^-jIpPw$uI;$}_W=$Ek^`oz)N$y9@|w>;ckSiL6FeH?WW z-m!eFFQ#cC+Fl7s)*sh0gccnZ&CdFZNK1Fk*sVHstSTLN#2=tM9H6t$+&+ezy5)Yn zxQhsg0p7l?OC>%dI*UKNYG0YsEPG9U_}@TvkEo|PHcZL{)`)v%X{_|h#j{U{@CdmN z%k!yNUF$~7XdnYiXSK+Y6qyn1wZ!9P5=>D1(8u3R7=BiR@m@t)C%T7wbf91KO*l=K`_wY= zMLy+bluRCW2P36Q8s?zi%y%l@bKW4}2USIe+%3i|Kp>H^Gu~_fC(VCN(EI3TQXVcj zuk^;-Y%~y22=kXD#!=TKG?1+tx7yAh*5}`@UDEFGt4H5N_6LzYe(|p3<39rE&Z8!v zbCt81k))Rd==E6$tZgeVw{6w6@S^x9$_i874ZTs!=J}aHZ!C@+TN=1!QBwf!`V{n< zjM2PdmX;%2RHNe#U?sL3YaEA_Qi#Pip?<(i4;6VAT!Xn|EG zsgwPOo4>w62ntPF(~Z6Dn{Au_7W@H-VlgAt6HYkF!Ei!tU;X*zixMdgtJ&91Z3Tb& zha)W&P6{5#bhFzdPXmEhoC&}@GhDbqp4cAuIEOaL>QoIMpVi&hv?Db93O()#j=X)b zgJu4(#+>!$8w)LIgc;ll|1Wls4+5<{3fk7p{HkqV$;mAJ2$HxkE+0ba#h?G{-3-Sw z8R`mv200a#kXd2RMb+~S{l#ZMqQLw_qPR6^sh*gnJiqG3ylRjY-fPUyN&(tnkk(-OTUKuc_T^kQ0=7`dJ6RcUe{f=AC*{5-iF?r5hIQnr0yT`$VK_31UYMe=-aPpia)kwD6k-$CK+kD0~cLBkjscXM~JK0_n zM=d=lMr;wk;{^n5!WH+t?5dB8hEA%_+^jT}tk*SP1BG}MQpQ)AX9lc#>x9fZFfn0#9ly;*W6Gh7 zRjX=zhPvZmZNlre{NET<3_Zg{wK&-2FM@PF%8_$8dd=o>YlKLds4L9;{j0qQtsd^T zu3yy281R-bj@Bh3j4=c-G5n^1GxpIY zGR$h*W!Y9mva)}Ww7#Bn~J+>>CcCV6jsY$Ogl?h5KS|Zx<>Mn zD%qZu9EyJ8&1X%tLdzGL2E6!6k3({=s~~&iit}RME~w+$U6l#{mZPkqjfJiMPRe(CNrRGEh|D}RsMf7D^3a)8T`a%wKbE$@YBLH3Ucv$_}l{Cg2kopn20);h<|VQ+Hb zRLPRd7TbW%^R3k9372=prP-h_<6(bw+5s1_yg&kx!gywZQ?+*7G`BzK6J^ zD5{D7-Lz$2nkM00*f@JkS&L>ue_p{pq*C`Hf%9h(53M7STppMkotwr<&xN5po$EqK z(d~{O2SYE#Q|nfv)Gf)w+QoNW}wIW_JFsYx(u1Yk z)4!?ubUs=>ca@m!e%44Evn=34+uOr3klCbG% ze9b<}%5I7(5>n}iE>)OLf1QkH;ou~Oc@ek*<=$ks%r znW!zkHP(H=BR=&5TSx3~g&aWAuj!ejc&V52R`Z2#{;eORorc*EGJ_M%t2&#hU6bQ; z{z#$j^MS>m^&bl41L7k#RYim8KfZ*yx3?@=_a1l{lpbEkDicwaeew+5l=9gY!7>1< z6>pb4glK4^SnbrFbF-HT;=P0LZ-r~FoY;ki6ft+2O|Kd^1lL{TebZ5mo-kH@5sU{g za73d1(NoPtHt7TVdr7I!0I^~_mXfe*juE!1#wKG_^k(T>xLF1m`HO42BdY}PU;}oq ze)8U|VoN^0p&X@2Z+iz;Y-7EFE&Br+q0@ALN-Q%F-WPDF@Gh@_j@93i6Dr4BZ}HQQem` zQa77HBp$@v5NP2WaarFdTiu-3D6!_=xafT<#Rp(myy1XBnXT(AJ6q*k14sGD$sB{w z2`(PYKKeyqGvL?CpxaAaTg?f45;hYcuNCs@^<~qS{ih*H7aX-S|6KD!{}E2TnPi0B zM9y9JcpAV*q?V0-tvpb5{^EjrSVH8N%4TMH)INU-r3|@@>x-mN(+dU$%Kl&^zJvkn z+OC%oBAyzG;e|gItk>#Lg-bAWmxhu%No4(=YmJXoP^@-fOVVo-|=bu*i?yl zNi%xew~@o5CVXV_|9q>tR_i}kJOCw1ZhLh;ei&O&Gx_`P ztfzi}|46J33eOSNk0AV?GlY8yNsN}SR|@~v10XuCwzd`kU7VNt-|IX%y2r}Huwa+Q z?8y0zmOLGHU>Ob#g3yx#2O_;c9cRRGhR-D7|KEc1$}3IlJczKwhu6 zsY$!JG?Ui#s5NC0BJpAX9Ox=1|vtXZn^8CN&pBpU)FdF%ST0pxXEZkgE z^Cj13i#bGIOElE(B6RjsBk(Oi4gds_sC+;NO3S4(ih|tyIt`@^;CI`VhWPK$gTv>$ z5W-MoPEOlpl8w}z846zSp-PyOxyZ13dwS4!cx7z}8jH>*rICZ)zy1{oN z>zF>QJ{mb-iw|Hpz-`^9kQV;$IQO`>=kp!D?)fH-42`{KP?xx%?RqDsZi+bEY2@?0 zxKdX`^?YN83Vb$%z<=8yH;gdvu)dzI`=71y-CyzfMrt1G6A(jhy8lfL7^+6ix1Lc0 z5J(0vD5K*M8-nYsYn}f)7+{&2cD3)PUz0sBY~=M8`SL$&XJ%!Y3`BR^r#wYW6BhYz z{kwGb#Rh@JF9#WXFN49^_Zc?G-EY;^>`bcP2?+_l6CSim1?xj;K>xpK;eH@$6;uHP zAP=1!aKPRHG_-V?;n%U`&x54q)r(Sb2!V9xW#O&@&>gsdFWZmsX0}Zlp?(ovb$?{i z_4erYo^nK?l2R?I>usV!6)*Ut;2_{)VF=pdayx!SM*^01-akK<^58wlNe5PqQvW9BDbZHi#u@$0%(o{4S$ z!s4uk9M78BnjEf=^}9);Xh6d3Co)^KhzY(Oi{8bz9XFviy!F_J=253<(xNU3Ex%1X zpf?d`je2wY@}i?grY)BPv6=o*ldZj#`xgkls_O5p^S@1CkPJ0wjQwFQ0&I=6!1Ds+}`+V_jQdi8N?yH>JtSh3^ zf`GeW8d2Bo&uapnAO4?dg9QH9FQft0ehG)(165||RTE@B{kZLZRn_zU7`ZM^yNbB# zx*J^exLf~WhB)P0xnG~jxxY5)LO;!sa=%qW7)q_F)}t=}?nryVr>_W5#cgWH+uB~~ zm@d~hh>3}NqYH0j<-n2eTHZv*^}XGC03z}3w@2fK^nI_oJM2vNyhU6Zby(Sa>Je~V zB@Q_)=t2bKNZg#HVSSJFKTJD*6>t;GfH=X5?eQ?Z-dKd*^-?B7FNXEhvTt`W0xm6( zG2&{&IoAt5>;3axCmF^52en9{l11I`nonA*?|FUK^y96n?8nFr2EXlc4?h^hqbe&*h~RWw-2We`M>j5?splmaa(5KFiirFu zYZmZ8qU-9_1vE5Bfn{`1>ZhuwXvq^`&*9;{nSdMVYKT6LM3ioMs^8Ak9%t%3B>GJU zX#jE)?D3#b>AL$Z?oVM@?c4lWXT;3+R++l}ptq};42dQPJu5{Vi3lRH_)Lr(VV^s% zSlG+)*C+$dVwN*N$G2{cqzvfYMlq}RBU=234%%uoP&c=k*Z$JMNte`hs80%(<;xzM zu9E|Bc)-nYj=xVM57joWa2I@3dh``I;G|aV^JCB$3;a0C_n0q^!S{;o_2q_{FAVF1 zn*ljG#ASXm{-diBa>@|!yzM3{4}OwVeYf|m`W3WXYC4h-ZB2T`36A`zRX=aqo{S$K z7H!J*Kv^T#^za9I zqz1zS2lg_j`A$Lr6Lr3H<%q^F$+unY*L4l}zsyq&0sb#1sC56o@w}=GKCFaT=v_MzIo1ms@KKcEdXPPYUM9c2X@$ee_cND4{iBAg@XeM=a&ER{QbHISe2|#h9?6x;+3m$zyc1hjM>NRIW z3a=n&fdPn}V$^m{n^{?>5!51FKk#tX1H@JwLl5)LhI~l`@pR1Fyr0)}AAz zcBmS4-Vt<9l^%q%Is{9MLjBmWO1hBh0cYM5RmZajEI-ZJ9Z7)%)>Y(z;k-l&gl!6*w%jdgOd`o{HTcb(izVV9Q)ySVPCYGVK_0jh1E`PN=kV%S-mQOkG zRuh=K0_u@PK=KJ3m%Z{MOG``p`=3rf6~5;*MZad~jddT`v5|&*K>aV$&ZGlQ0*tzj z`j+`51+KV%A!l+ZqaK%Vm7;fx7kEe+``$wZQZrlbb(g%VvcX=KEI^-v!-8gQbAKsc zAsn>q6Fp++z zpm6gf1X)-e;D;>hZ+=lv2qao3VAMV8`nJnG{TLpKy6hY1x`l<7W815(Ao|1|OHiXX za1ZgcxDI%9_1&)C$#NH}&;KkfreWmVgb*TS5HNeQzhVTtr$Fw}23%f^Ur`34PcA}H zhgj>yz}Sp!EK-|I@2bsE`^^C-S|T_Fo9nLe-;29^kvmz-S4ZWj8~Y`_o@RN)UfbqU zB{npOkB!~Cr}I!l&-yl1pdA&F*yMwt-IbBP?MgbM%UBS(-GaKmGQC5HA7ysNw(pQGb# zh8(|Lta=8?^bRTMEAK4-FC_l=bJIQ-ylTNNhY+x@6|(O14tjUG>LTE=Drzz|vs>6= zyMC)aVLIC`CMkQc+h)r{bG}iq-|z)&soNkJJQGbEksCPy zTRs8jjXRx}J}K5m>5`fzhN%e19UmO(za}0#N(B0~4gufYC`;cgNdr~{ZC#S$KJZ%) z3RAy5MD={J^!>b9jwBAt*7}&)-LT#^af~X3>HrZC394ZuWP^D04FCUmiW^L&VbHw@dYgpk*+o|) z%F_G9sazo7%q;u9|9D)bLlo7)Fm}JZIhvD-y53;%SoK2i-YkRhAr2VdPxSbZ(76;F z@R0vyuniK)(0NvU5qp1R*6um(|K**MywhQoP4>-zO((xBG}C8$8Fi8sP#Lf>6L8w$ z0=>N*z`~L!IDB~@4h`5gf?l6jp4<{Rord9I? zqzuTh<89jvX ze4~>k77cs9ICjgh{z2^3nGI?S0Y#vzL+|SiYn_2}kD(x^sxPWhWb#`!H?Hu}{$>Bum0)AW4kFYW*peX6fB|Y^!2BsC1T8 zC-L{$Pz3eZr5|+8)>A%VwB+7-zw~Qv3uke9j1j5b1QKgS)#Cu=x!2`)0G9Ha>0ka& zazQWFTMSU!<+LaGx=*!$rdVWkBIh~&hhINRZ$6G$X=4_W*)1!q+AGSZU*f_5F~W)J z)Bin7AGgllDw5%?(WU^3Lw_nhFUMQMw=gWT_x||uI=fYgfFecuoMd`QK#XUuW6#nV z48!?E4s(S+P-;EoJb9gAjm!XdDa(wpxQm)C{#dLD_UldN-N-+IO}MCz3zq8_S!|P} z@9?OqNLbDXs^mfdBnJI4PjvY@_{t2>%)X|RqXzw~8s*QY$9SzKYA|bACICl!)|uK__YiDFDz>+Ao&d6q$Gm3y6Njf%8@rc# zD<}q-K42#?Nh?JW4@h#{q9s_rT1z4l3!5+oBu;r%N%R3q36+`#Ub9bw#nmD0){p>+ z5o;1o!R?mcdj;ksoN}x&_WD5~vY?OHOnBUb9X79bKSVjKsyyl?dh(hePWH6(GxMW# zSg^LBA9R1_UfeC(aF9Ao1r3xSGIT)cz@DOt8jx-v-;iehm;(CmlK;N4G5MX5l(Jqw7|bwa$74_&ihhwKNNK{nN-lB z9L->6*EP$as@>WTp)_rc7@P5>wo*p8=i5fFChEK|&b2!A=rlLs5i<^anoZu1fnoY6 z7EJwe-cl-k} zXC(}nRaP`bTaWVmpno@Ti^yLI4;h{25NdBX=J7H?GUSy9 zZS51$K&BGo5BYCTg}YqShqfnj{0@WE{Zh^48r#We;}1m?4P98ay|QgW{!s<8+J*f{ zJHA!suT1qWP9ElJl~@(UPtw`*X&Sn{;F0Sv3)6O?q2Bi8Ttrto^QYf=K^qW2PWJWu5rL%FQcM<8=%uaM_;i&_4a=EPib!!BD$ojMB6hQ%e6**Ct)9;3)AGJV( z=q8Ed{pSt&%WMUNR6lY^V zpwZ=u98#9_u@Y?x&Bfqw(rKYMYh~HiT-dL{|6ko~St(6r>F1}0tr_3kPt}IdWrbYE zYFQt@H2ZN8I7OHCCkulpd55~kUT6`S$yT10$6sng!&Kn?YY@P$VIMm#u2~df$WUbe z29i@!*xA{g?x>c?c=W;-*N9%=ng|b5y-At}w676ig>4?0Et^=ioL?ff>iK?;3J1Ri zH_N_d!n6&K2+;@>9656%eQ`;oy|uZ>?kD`tMOeQK=ab7c$|7@iNCEY%DWuYrRR*C* zAqJ7@=seln@!uI5ub=hFR`pFHR-HiWupU&C2kKycZKAx|*+A4(1Onr3Ys!I}2%@`q zJelCjek8|Bk=(j}(%{|3^bPAoQk{9BXT~f*c5+$%=E4)iVNLOSNn!~d82n0{?w^Gz z2CtwS686Q7+l3gC_YS;a@o$~zIVMsNrIluE!KA-R>r?(QK8_4$^3;*E$~tvm!KEy> z@G%hS!KE{f=;eQWh!;+PS$5s>@{RY+y z-{O*VI?HOF$d+h2y10V@%(`29TySR+ea6kkp@WEka4U}N{wZd~SOIUhbLit(xu11x z4B?mx^BtC}QK6l73T~+s&j^4b9Ej(!sgJD%MS7SYb*>~;yi%Df-Sd{B`7|Ro!c|C` zwTRqS`8UdO6aCDDM7057wJA0A*&Wr@D5YKoS>*@x0wlATs=KkSs>EL|1 zqoTn~<`(=(9zWcK@GO(KIo}aEPUHZR3NM=Q-+d#>vp>x0>;Yzr>CCayQ~&jfK{-HG zOoB;C>gL*-!lMi?WYVUXnk{Wjox&VTlw4B%@#jvDly8M=zio(okJoL zW5S7!Po?x^k`x-vZ1m~XS#24m1Zvlh?rrBmD0R66c}SJJcNn`}+iASc%1K+SvdSS< ztF=B;yhAnH`Q?N;Yg%@)yBe>m(!KW)v;|(e2?N2lWqx&mPo_VMSvD#MCb)f9%CX;fo$TZ*QZlYltVv0_)`4w%nzrFFv>;}#{QWO=;oE^|(W_Cd^E#%4VkH0|GSJ@-`rzi)C=pV@_xbD% zOOLbLAS{yTg|nazh1cofGw&ROUTh#_O&)n)?Lcv%fwAKdKZ}v@621_=u@1kP!%>II z>=zfl)Pv`THlfQ!v8#VFfBmcP;oY2nSa_N-VVcY|7WIuc?gd1Ec$o;uKk6lknXU7V zZ;6SYde3=~)0qJxXItUffSZk#yXnZqiGVu5f5|XZH^bb%fUb3kd|nZCQAi1`fQb6c z4_#!a_?_79cuW!^)d!X_XoQ>0$?@r}3+A_Jqx+M%^_Bp^9m`+Lk=eY)b^Sl~ZyJ8A zKwxhlo*YnDCSpn%S9sLdl%x8cW})!w&UUF}qp(ui+wh3R9%U%Xz|Z>s%WKz-D0q#$PNs^`Q60hGBwDyzP$QtSF!Q=E@x5N-?*4 zO-}@ra!I}Y<{PGnQuQ$@^EP;Zyz+*ObrM7DZMG%5OMF~F9PiVh~s~In~}=J-+VTM3sk#= z$07b&Za0-Vo$$w*sU7vUtiFgHKIEa^j6gkmIS4!v06xM`&A$J0ar`suO_+}NAqQG& zXK)Vk*oCiCJL~>hVGz#uJc+QbcKrtqvo_V=ZLPomfYku3iTSy?rF#%N8=E_KsVxKW z{4cCs0gav+x}hvnw4Ip4{0lvBjJ7b zXY{zyC;vI>(<#iO2!c@}(|Xd+4B{E}v&r+_&9L6`QP)8$YxcdI;lKJMD13G13*S9I zKLm;>Beq%%jW)P{uF#h>zz&_O<60FS^QIRB^X#t+dY#=$v}>yQWo%{ny6&9k1%L+! zpdnwc*X(|sMizhhS@^z`%#1cExk~opp4qOUqOy|Q?44ef@&B_gB{1QX@tK74aWDZq z>W2fMC*4!fo&(P~2#EGkWp{w~>XfjdD2qo*ul8wd6KG`i&42oU|0zFL+XpOu2&JM| zgW1-2Mu5=-qpDuz$oMQN0tP}4(emBe1E_V6*5yXjTz;;FX+K) z%*bhLIB9lvHvi)g0Pg`OL*xKC&AGc^r8ZZ_Jsil^fl{Ufvds3KU99`--8hbB=1Zhp zFFA}hgGN`YRC_5{`l`)6Lmfd~F#yKp(E|*|unx1FLxp$&^Ptb}R4()RtwtK0b`@(^ zL}ENN+*@_A&jMy%89~3ouG^QiqJlR1!0!67(C7M9HO8=z4y`KrC&VshR$OnLr=x{e zDP^*rWfC8`zkHR5B{qO<-B2DmNEb=8I2PuZsL#w4l>)wCjpx)*BfN!4Zx(hipOGcU zA6n{>5@(?2l>r?tBY9s`Y~XjWhb%U4z$l^16|pP%?fU%b@Y_p$>sS8zm8D+oj2G+eM! z2m6jndWpZ9Bp%PxXF@HAX{@~}R?KP3EsO+2MMZD>^=`aE2?&9QoBc4b=iiMjbHDn2ED=*z=u8h?+o58OEm>{+v5Ju%aWf@O}hPa ztA5tWbOxXj0R7xkvAidFpz68PgE8Azi^pS6%YyoeAhuT-qre0V4S^V6c>!X^f=EEe zZ-qGsHjPVDQD# zb^OA9V5#@}*=KoeQ1^*G*?K!0DQ0vr5wfuPq}XsQ#ME@=jUZ=rrX(YVjB36tluBXGzWGj}l-SMh zle%?wKU4h_O`;45bIaa1Q6(zgKnu^=1xShG-$|IUvUC^7kLcI?^A znWRyHxoSeC=h~Ac3c6mjK38L-f734Mqqyl4pPCMqa7eRsF19rWNA=_uzl-*sN@@+8 z$nE24mt%!lllHlq7+K}lmqF-cDAVfhEdP`=9q4mijJn`n%x#HA{k+LdH6^-EPHZbP zKA``ZdXruvQmXHA-|eAIV_UbqBP)OgTC1}Ul^Me==uURl`{63Rd`+@VFHUM7WAtOr zgMSReB=LL1)Muy%K9ididzquSX-U@y@!ZrZdu+>-Q&OY&=!jW*sE57GwgjV{|3qNp zsMc0^hf0NLwnIdul}SbO3=vI&Wytq!&um^&vme^k9)X|sxi&By+0v_y=dS-G7LI=z zZY{Q#Dln+BS7a3_ph32ZguT-}Um|3X)TxAA{VlJ?d<=CtQS%RJWu0Z#t@neLo<{Nt zS37&k|K7k9&rOGk(aev6*^??6zu%>6Y^ulS|B08I9s84hfM`;ZmE~Do{M~G)@5Mn| z+fba%HEi7jz;NPXlo@pktyYl*?_x0-)2eI^j4j1d_Wj1|QEoy^6af$Ks+jM3{sMrf zr7Pp#$|=yb5WV_;VQcX}k$i-o2ubIG!And~q%sBs zk6GhcghTJxTX9$I$Dp@TvHHDm70o<=Lu!F&dW-hj;-lG@uh?WSu6XUUZ>D1)b_4B|LJZfG{E0Hqo1fc-%+NvC`Zh=&(X@Sqg)>G51C#whsma&` zATKPc(VT|C(h`)y&3Y8a+*I?Zdw>_~{hRc3d_28H9Te>tN`I#a9+R*9mM>^PZZlCPHBhz|0v+O z8Jdjt=MGbaKNhDkNU&y_BZ>wICpbzVAHC$pK_Q@7yIE&#VvxwV`-X;VMeg=HqSVGf zj%={vPcPpfVf(5hVGmwtk@LYx4P4`up_IhR9i->g$)JKn*$Vq}>h%}@mCfb7{Vb4MC z&+CVjwTTuImFlU6{gwFz=ryYxYl=zn>|j5@0uL%pcOjxBwF#0L&_) z`QhcnBoCj;OUC>?gxr>gh)mj?JYH`c*GO})k`m{pK{CeAAco-FcY=HxZ`R-(pC9|` z6g3daGL5_hMHFy|KOaW7>zYox3vouzXi5L$!XwL>l-1{*ebI1Bq`St*Z<)8CRAExK zvv{JyamfNBb;=)QJn^4XHABqj8WBlH#Ke}hX>$vN@3~6f?;tsG za>D%&EU;FJ@P}n@8VV9GS+PG7C8^0iV<|^}>!13DCiF=})Ze8@e!NP8k(&GJm8k{+ zaW(&j(}M$A`?f5RkS3##8=(;p)co z&I3PE_6@|&uf5VMadAgps*_rYZ{aWF7H~Kx?)hIFN=(X?Qq-rzFg3}%mP#*mgJ0%h zS#el;bv7z<$Z#qt|HjV)82^{q4uhwntGJ(^+@-q?M7kBcRi;j`0-0!P9~24(-`=Ge zEn^{1SSSzVciQAuNWe=;Mu#n*?c5hu}s!PN7{a_*-uXOUo z?nFYuL~};y?kk6UiSNwZN{*b=i7y}3@q}()9A_D5d%T}-5I&Ik0|+{A@ss*KM$^rA zzs6EvVW_?X!WsN3w%JvP$s+e*Kcs+Pt|yl*ZdTp(DU5|Wt~egNx77Py{-aGu*q>-knR2bGRDac72?gw4f>oO@_Bz{( zj$BLe2Cnds1~AQ8w-ZU{w$a#SuCED5h=a8Cr{d$pxJnarA|<1BBW_KDWOOTUQi=2H zL_J>hM#gU#%|&|&c$&6}KC|zY(5B&$bA@?gXTQKhKkrx-(CXl5@7!+v+jhS%iApv* z7L?0#6vmw^ZnM2C)62HvBnm^{Y?yt#no!6|l@S|5e`F=%Cg>``Q zK{9)+acNAYY7=Fw-9R`D=$T?l#qkjKpUBGmnRI)uqb|LkX3^%IrH~AdIKEC}B{d`c zu5x9P#DvF3E!0Pz$^V$#Sng#h^#aK=JiZJeXnYSpS{nG(PD5FvT{_z5myWGVf=$4>yDCEmx zx*2(Z6*)y$o7z&Q!J=zPI8@T9 z&($?H%9GOla*HBtvT!O^t?V&AtSf!?^D+khM<7WF$m!GBV;aO$not&`%uDtJH^m1O zofaoXPcD|~b9RDdf$88=R}@kuQF;@Y%RT2ca4KN1F8AE8TZ4+9EQU2`tN$&(2uPmD zF5jNZexDh)*656aT5%H;_~Y%i;{2q8taaVs3;Q#-Up7DX$iJr_mPNf)k==er(PBNe zlerN8cz!j~a#sReMq_iptmvoZL3sf9%GKomc~e&A99nQ@Q%v7zsEhm}|{O zu*qy1&V|aAP{jA;0s^kULfqERn_+*p;~n%Pbh;j>T$Uv|CeruA?{gq?GSLsz$-;=ZCr4gE%(N0Sb8@0@Hpdv2D z8h)GyIf2)BwL1=1@c{qpLaXhM?~!K=6J{5%evD(JJbAeXoT0AC+>h%TboZwZdvi?nbY@j zI+={ZuH{7wxT2Dr?~=isc%Yi}onS}(R_&2M=X`iOSm_a9&o8F_v$c?$z#LO<{&=cV zl|5B6Gw$!Xp=zyGZf0(3wy5AQbkO)oyUGmy)DQbkeYtPo0HVbYF*?Z0rqHi9dB?*HuAC zn~q454!dpKdbJA$iz^tZvuA0AoYEPHdTa0&hp~IVMg5z-R&8K@zgV(bklIRf;4k<^ zfmz?5UD{Le%2@Vi#s~+fL~SIU$e@h6usbTf7FDu$zv7vA(Bz~f3GHZ;nlY}QYr0IZj&A4BdVo?=0|K|wd} z+}P17rRF331IxiH(7Z(^W0scg(*I{O?ocD2-v1Q+)i3~-)`53hMpF(C*@Q=E1dNx^ zJ;} z9Sp@L0Sc(UlJB<4u1^e1OjZwfbWSN93OdZH9{a5ke$qbl_SZY?s@4gaWYXpwb6le3 z=wU18#OnVax)m`aAYzw9z(n$8$(boyaa?XZwjf;{ZHICBowG=rt`u%pp;jqPpEl?2 zLFtLc5pqxk&^!Lhxv{Pe9n^7#2mYn()i30Fap~DYb2{G*q4$tfTB$ZG_o26W+fut6 z`MURsZk+?Sd%pb#&qRHLE}8xyLIPX>^f6x6H!@nbhsI>QH&%W@Ic4p!_}dcJuIbHi z;rB~+ZfXQ!q4uB}F+D)|5~MH}69b+NrQLsEIw zb&aHI@6wW?*W6><(9kVn!8V-_{0|KRrXDa^^3Vr1o3!7~0kr?@5;;BBe6WYs1caSC z8k17(s2l0#NjVonE)r;!XLRRCXXk!ToboSgJ-wr9ofwiUur#F3;)!a55FkmM8tJ$P zE`4DR*-ir}&Vg2p06VVD7>x-3+^*{R<;EL~6C+5j$j|H0 zhQZ`c+QTbcDDI_R%RbCv3Hhvpo`C{I*45M;pu;E3YKoXBhhY;7sINDUV*5qYw`*D` ze^rDH!c6U)zWIg@EAkS!Q7~%}(f|HtctBuE%VKgdJ7khpmX`ErNr$Jh8G|{P)Obq$ zGvJ5y^)lUp%-~efk9Wf7ggNBR@Tqwo{j(#BvZj$-gnmPeE?3eU$)|+sXbVihur*>x z2+KCk%1Yb-zrxFsDyJ}5V9hSnlrf|ob$?u~Ti*BbU0aqVU{VA$ES8u!ljs821KB&U zBRv>?>(cr%)Nvkp_DS430I-yhi>G~htEmS3U5#XnS%0KRmP#K>D4X@H;^`}fXxCXE z`Oi;6xR8$Q1Q`xNWE&snPb&@5D^73*yq5R`={n#!gprDIkt?}fyb7Mh` zvBRh8-rREfqH>qL;fF)%#bls)Dk-}fow)nq?LqaxHBlaZbZo3y!2N|V#PeSyDLYjd zXS(dSEA2L+&TAt``Ss7%{v5sKQ-8Mh?O(JGZvlj^dEL^Fziw+-++~+ZzV%ZGK}Bbd z0<1C8+oy;=HMwf_Wyw=%DJlOCw`giADr6VqRXgDxFZ!I_gldd0RxwA&&jp#1|Mdd5 z*Ve_Oo zy>;+?4=pk1HHB#UpBE3tl@&FM*okc~newwQL( z3M6WTrKonbR2LI58*~;#jjg)z?Xhy4x<(cNzwr04q~7?A<(H7zuN!YD7Rv@TrzLzA zy7J1rm=Xb3P{Crqn!oYbNn_hg9NdDjaZAjlcjJqpw>^u{Qlj5cK2>7)JUTpefENVc zk%1}`FU|P0JBdUn$&}LY-rn#6Q`8K3nzm9v*T{rqsJ5fu=gv-7B#`74Q@i$RlV6p% zu^@`exG5QHAIa!2$VHc|`7KYo&aG<%yE*Cw( zOOpluLjWy#ow+vvBjvcIze0$18sue_nUsxOyLnskF#4Zlo=;MP$vfg=wA298OR|kM zhPmwdJE8e2p0r1;B_fhWg;mT_Yu5RDw~o>3Dh4kL<~T8A>mw~%t14ek8R&Rq#J|Z^ zj>`HH_D`%Rb9p*e>h_DeIn>Vg&j?lZiW$6-vx7P(`@3t*x%J`vnz9f=WiF&QK_EK(<%5P0_B5^0@j*;e~0 zQ66VI$nN?iZpYw1&j`SX+jlh{aD48&bcjR`{L|mL_K28+8R$j9n)%dQE`;Tqpj9Kp zx{?F?rJ4|aC>AKbxaCu^6Tv}0r?u(W|3}wb2GtR4;i5Z`1b5d2cXto&5Zv9}-GVy= z*FbQG;4Z=4-QC@tH{_i2s_w12^9O1JLwC>g>h85ZiBRQngliKcO1jb?xmFS-1c7Fz zSo(fqf!3wi!r4dcQG`u6c=JHt)G`d3M^o8ZxR8eDX8<<~Vc!AvJma7+lK47(V&RV~ zH%!7=KOxF9p;!R5iIzo3ERERzJIz)#dfVR5d$TP(!C zq!?f^$XUQyrXEEJ2I^ao!3~Q-o5ua00H!`Q8JaZR_J8y#mR(T!#GDd#Tob_%gLc?I zvr=*Z&7PZ31A$@!UiY|97sdfO%%1_vCQf|A*Ds9Ds9EShed^bb9cVa}jN}>~-r~Y` zMp*xoU`VT+Y#IjXDSfPn&6Bz#Ngf2BI2DSisB%KSek}3btmIG#KjuL@ybU z-&&SNLWn71rJRHBznLa>`B5mak!*4bnSt{Yb8aBr0&s89H5x6aSM0tB92-7K)?a zH?P$L}IEVMrZ}Os_CaKh`LrL^vcn;YrHA;c>k0aPgvw~2g>mYiyrFSZO9ju`*^gwTUP2o&Qd8F9d}~CgLAWU@z&KhFJ&ZNNq8|>D z{uZ(MIjS>&WhV+j;XMc+z{3E@kRN(OR(i0K9_6_So&sOT9s{Y4q9DJS9fSnPLz|5u z0g{yK&HV5&dj%tqb~O<+1Cy|aS0>h0XXhKDw6o#NQMM0Ww3Rx=Rn*`?iC1Ziu-j_x zXmaQTsF!VX3G7vcu3zVtzeZ&DCl&)NgoIdyAOb=_rTl-LZJU|_D66N=O^BSy@6H-Y zm@7TxcH3CePy{vZ63$jmTIAhTM|Ig!RN2^*&cYN$GHW&%FT_j1ChR}{hBJO2{KhRo zg}8w_r6koKH_qau6?6HuDnQ;GQjmgJ4SKxoC-cCMTODSiA;ur4nDtNb@vLl?cno7z zsHQeTk|e<7xdJ~d@T08+mEGpHA}*;<}?AM?T{ox!cC$R<(yKXWiB z0y(9h-g@4f3m?cca@cTaATkVX2e3FKgiO~u+_@K>cW&~BfLc2L;)UJ?0xJPwjUXh! zS?itl!%1E90ahy;2i+xcsDg;;7JK3mbg3%8?$!92lm&7MA(i@(ho*h@w<&fK&nGeN zzRRv8scqqmZttHp_$F%Yt_*d=+SH^<1f{>#o8}9KNCD+ZXRa5CtMMBY%8(P8Qa3VY z2~RpOZBr+SlT0B>F|Yt@lgk-uTmN(<;c^!RaU_Qd<9qP}gF`W_=2J&P1o2q=9X$3Z z_}1r5Q*eP}-XcJ*QQV8o^bE1SO{X+r2I!nz>cwsG_>6&}QrG-iQ@8HTnsuy+J{xi{6NjQM4s{_C@(H zAu^HjR=H zyLL7b7JN+JkZAKdb&^RX5|Cl2$~lVK^Qfbxy4{%!zxgDp1aumFE}n&qC-1OlT&$D6 z2EVaxPm}@#C^=-8P~~qmC6Y?WY8MM0k%5Br4l8Y%y_2^!C^>laMH5iD7F`7cZc+a` z$X11#dU#*fqHb!C1b6`Xqg#Qu$vWv_ap8|lkkkZDj_-ntM8zsn8;$TK?rk)_1%N`r zLW=3rO7#o~RPf+S<8RZSO@3re%b^|lWffgWXvhWaT+tU}Tb=mqIA z2SrZs&z+Q9o>(Ss#L-IJffg1>X6G&x={~kC6!cLlS>D+Jw-*MAJxn!Id3FIaW@;#e zk_p5!QtTr)!@F9fv3jerU8&g%NFXHXJGDTO{Csm~Le({|P5h`_;VHt36okskGS)ex zWr2Z%L}5Kl;jZ8$!kRu^9{l&BcwxnA(e0f~Em{`1<@c?P@|GLQ`ye_=ywI5raj#Dp zq7CX8DhQqtL7VMH7RwVr zt2m?Ha{FBg~NMi8d@5V2C9t6iI`M)iMJC~H-*^+VR5~mD zgIx~(w(@DUqHta9{`<*Gc|ApEcG#=bd26(xKK(pAR| zMiytzU@MFto|sV0<}q6+)mf`@Ftxq8iTQ0*aEPLF+?rt}&FS%?p%-m1TlO)V**KRL z>Eg%#T7`@&85k<1`sH;ToLZzlMYTgJZHxmho1lR4t~OhyEW@NK(A8`4J0l-JF9nq2 zCxl^6+|0s(4|&e%1QZtzT0S*$Ls3g_ssWOBu5z`0leCosanLbVYw{lxkqMLSEa=*6 zG4xdVXW5SFQu;EASnqzrl2PVoI&yyPC6%R&*!}GMRH&(<&MIYfD3&WAG*zt>lN0dA z9TMc*t4yhQBPuO!cnQG%-79S<3HtzxjiI5Sr0t(%Jr01J-(~D6tPWyRKasBy(726{ zJ+@mdag&3gz$MU=g%ZvCe0;nn9+985r9VbIP)sIfErlvBV+B02ND-68G`~wh zEU)um<7bU=i~+fTof#}$@llmwPBYWFy?$JUW9;HG`yVGYU5%8&1)e+1vS6nFxNT%v zeIrrg^?ub{cP%QeomC(8?9=fpdYZmH9C9-hpESUzKA5U1W^%)I-NTRb>xcU_2{z)S zljIeYWSFqw3Jv%QNlXHSf(tD1iFdnHms`EHJG?ce`L=<9cZ9Y!A=z1sQYeudYQt*E zSippfV7+6uuxJ7n{{(EH?|l77Qp)u96DQJUV}pqdl5v9#Z((dw<9`F;vq13a2GJ{Cm}9iAM4t?FH3M z;EMQsnJM$)nap#IoTi)S{xrgyqmm{xy5$eM(;=^#kr_I~>QuDn;8g}RcVyRW?}zsU z(mVBI$rnJIdz~JP-yoN9pi^J1092Dx6%7Imp+s}dVPkv*PX+P}CR}mX`*dxEyvcDE z!fCLz^|a`#Kl!t?yJYR#pXwBal-w+bHi`Ct8iZG^tY#v>L1!q)Jm(ahp!W3{W?E65 zb*oDnd?{x~uq4Z3istm@q6i{)K+vHt`(FD|MxH|~RD~;(K06x@yEN%3 z$lLpa49{X?HZ?QJ!SFMy3@DDX$=Ta?`ATsj7)y)B5A#0ISTQr zqmFJSnyNN+9KKL>=4XN4-#ZCBj1s@%i<55z2$p;HUJ|U*MR?dqGSv|&hw{43cI`Fv zVK`*s;}L_G++$2ZTjbMmIVGf@h=T0!tYcDzZ4rMMWt}rHecYH*QP# z5A?zC059yl!&z2@g@XgtvO(oZ`SF1VMuLq`JLF6Y<(By(8 zAb^Z|l*d~tZ%!Xe(qD~y-G{Y}5P<%Zf*8YSXgl31O`Zq3p+15CRLwlX z1}Pi7a?xf&I8KL3-T6H%+yK_^-HILv1>?6HhQPW=QlRY6$(bIjl=Yn5AgpOH5V6=j&p99n|_2j z(E+pdzMDpbSvuUSC;Gew$uH_{!3ZV4sx@SdmFG1~A0(0c8cw z;S`PL@p>S1@Cv*Yqb#%eqz|A)Gm?O7tB#{wWyKvc)oXJRlZgRp$Clih{ZD#o@L%Ct zobk6q4cu~ckV;H96}?s`Ph@6Ie1ZGh%FpD=bn{)GM%Z)s<&P*H(M>zDneipLi<|`J z9Y*BW`n2>9uFb_A!(|l-Tcp8)?8KBk@5Du=)m^Z(40RGTYWFmFmuDvyF!vqDL~3Ty>C>x#3?P z;_)jw^)vE!Vl3T$!?aLIa*s@nU+rR)khL4m1eA!Mpexwdx=OeAx!ng=6Jm%Hf{UYS zO7&k*r~+1nP8s@bNs@Jx1z=PM$~Laj-KkFPZ;e+b!o0CY83R+}ciA;ZQj2C!G2yZj z0@P5jxpM2G6qfp<3L;MF-xNoA2+zx@p_pX_#?o|%nWDK^Dwj#Q|BXlb?!52y`2)oL ze2j3$uHCv;LyhZmhRx#1X+tH&rO9pz-3xnV&qT$>w|7AeM9x3hk-gSrAMm~byTabW zQZWUP68}MUDG%Dn*T)SMgbPHs+qgQM+=%CHgq+cAUoWJ;=UrcTvuxe=7ZbP06g{sO zezzLxerY*kCxzjei?-MH;DxnvG7h54C$=gMOSF+>zQtX-(C=J(3jlmf$SjxC z&Ff=hOZtkn&!2Pd><}NyF^o$u6%m^j53n+F#Y-rnrmU`B6^L(n_#__L0vM}sp3g&{ z+(H2Vz~=xZO_jabPd`d`AJ#ngnWa7F>|T;X^3M+ZpMr0BLQ#Uocqu2l>uHwY9JC*H z5pp^-`Q#2nTucIn2+|J&`MeJ$!MZc77PLP;CuKa^Z6E!@5yK2h;T(-x^thofT!-NK zKM~oM!1ezm3ooKmQBeUEfS$62lbYZD;6pQiXHC^KG&HodwEj;LF|JF;Ea1kR!G{vA z!htoCH9lNyqM*~Ntmd?TDudfMWA5}1zFnnNKzS(VRU*4|l%S$b!Pouo5&Z~r=LVIQ zm($YGZB_W1YW#Ce>jJ&|+i{vM-rNi1OsHyW)AIR`qyPJnAecw!*MM=~Nu_8yzILFH zSBBp%e3xL6!C9jN0O>9q;KsB?;c_tY@vUSb-h_SF`;Nklz0IA1VaEYW?#U5rC?}hh(Se z*jRZ3Nc82q3e!27!wUcdV`OBcufMsNk9tD(?zaZ~?gwx{&BFHD`TVH3uO3Ks=NA6O z7~!2G_cHYXR1*;ef}!7|65yhpW*xTi+rQ4TJuFT>8}7gDe^;l14|H#BThI!N+2o2z z##1U%1n~ah;-qX+Zvb|AaS?k|qs~aR{1KpmB*4o8-9C{9%6*VOMYfaV~|t?w24Fm+0Q!Cit`_OFh56f=l-K8xP$Igg!U)dR5_fu0?iTJ#y-+zd5<)IC;iP|YP+vQ5@_uRRq&5>f)_pxtOy_<%PL)7WNON8W5xmj&4uh*kkdiy9&t(cC* z!}(sC_MzhMgwI20>X7e`6y^i)Os0)3SxOcKR)@(B?8Ake#5338G>V^EBtR#*aZENZEZRAeToL)ihlUmYE&gpF1VMn^9pq)<{1X*m-UDS^@jMQ|HmQ$2*78*fj z2@+9~kkZwfFW%)^%rqs6Re0)R61Zm0QSXxr$(*S)U7-pYrKL`4Dht@+fR>zp==Yv| zLlu@=XNLzNrtYvu<%52pS4;3B359%T96{a?h6i=9z`>{vN}R)n3PFwxYyhNj5NL4c zl6p7Hl+Al;WEuuxx|NHYy9JX%qwL>sFapC7K0tF&Y|M#DCQ(IfA8%z|tX=3e#UTZ0!ixq|# zX8ehxENU;IWI&O)Grtc)$TvqqG2py$@;+Z)`)d|bl(qO6iEu_16hVOT1C+@}a$^o; z0(tGR0d7I0PLuFgoVu8VPl@Sc5dFm23TU@^R3* zx|-bms)hAgWNi9ohz2vu%|tWY5X;R+rq{-dj9AB1l)R54_Ney`cKr|#dS0324mBE# z4zc@Sy!wJeKMiuX6=TLy3{?6f8kLo04yAgwPjqppZCT}sX&~VP#6FP=Bzm=W9J3dVYr5zyNNCaHLO_Z14)SIv9JPLx}qN# zXl^{Bx>9wRNeK`eH3Qj71H)5F%m`Y?cFPmG;VInzTZ(PQukX^9JdzTM%lA4FFox;g zG}|-B!dT?*|L1{!r4Y~LNSxpO@|fF8Apkv8V|d6OKekC7W-VmR57QjgMGFHm<@i8R zTv{w8wlMX;7ULdsB$6lp1Aw|y>sKQIg ztClaq?a~M^@mFT|2eHkQ;Otkrj@oH{RWy|%$RY>L*?oW{K$Qj;2K}J->z~f_*EfX* zb3ZQ7H)MlT6WdX*q?CvQnBrfD9)+nFZ|g+sj1R`gE=2lms+2RvT8>(CPLM;B zAV3*uc^PL5W#Hnm!h(G9>$TXyxZ-O~vV?u*!Zy5sWbbU8d~rXOy6dJ~YJLZNf=^$a z*6)M-u0lK_8WK3t5~_{W0#v~#(X5%j6(c~`>luy2Oiajbl?2NGA~T{og+!AaG4)vF zTpqRo$D9x67-TFly|e(&5hk8>qUo<1NM0R;b#SwLD6uuhUxmDLIe-wW! z0E8&LbN=o7SdG+_Kfd-hnIX=Gu=h)wLZVv0N4O41WSBK3Cm5ks7R48-3gQC8SRclU zLm5K;1gYwefFi2rt9PG#^+Jnra=~bX3u@%doOM^G8AdpKx2vy>x|xWnn{8Psv4vyr zcO%l4UudqeY!QUE)ZeU5Q&8t}Yo2I+LP<+X;}VUW6CUlNjwBjlgF0BR32lpdsXSRU z+@iPrFAUmZVq$tL^;DyEOo6?ufU4ULbe8b8YO3}}nT&a2b|!1NIhrKA%=lg>t*@oz zq2A2mlG$-{)I+-gJJVN=k2o$7lEx15g58$+H(lU)i&TAfAk!v2c2dATm&AnHcK4$m z(J>RysygFzH99fw4gTYm0`sOgM7Wj9*&+Edgd&67k9ImSO>#0j)qsr4kJ#9GH`~D! z7Tl#95V<+W%V$VwMR^qY{Qf-DzqL};bqV^eiRf`qBE!V7ill!VjA`?l1hkDmfN+U^ z^*4!=kWH@di&GeliwhI>T%aHZZJBnGFv-8(=EmDjGFn+I)QFSSkXA33a^vCQm0gFV zxl_I+WK~yJ=j3#KkwLfo>;8PK+X$`Om?{b^&+4w$;&ZUUNIOmAWt9ap+k)=Pu~~;C z5`g+`S-2uQc{UbySkzXh{h=kN?47mGPh+ci;|?cWk7H?oI6<7{l9`P|(pHF2j$z~r z+AylT6IYtC%1+acCWkU0Bd17t7TkU6?Kx*l1F+sunnbDjIfE)@G#R^zn2J*E?rnKVTCd1VBkK48B&Ec&ODRY~A#ycg1o9}DyB`h(BQ~i96qw|xiD`)RB0@vRBuC}k2h9Nq z4o&G6^D<=2TnxAMh3ra3mk7zns1C?d#`6mcSmCu>^J`I2QKzS;1IC)yF6U|d=p1^I zg~0J*WDn_LD4`wR!^P!Jo~!_hS|#$2<_O+-T& z+h%3fvUI;2dHWU&U~0GR9a9bdRp8-g7W=5C>2oW*v#uL~(Py&z+Z1~}A}gh~aGas~ z;F;owFrIHpG)q?&d&UQ@ZUj1@rh_LrR~BovL?Xy0(Q#=2 z7fB*G1?zJnSf6X*9=hoo#h&GGFNa8U9-%RJIog-X&L)n6Oi6wP`JLW0goB}W%G-%y!# z|E0LPnrT^0HwNe-o6HYn`+N#RMvjs1m+)DbGLLeszv7S7ZO!;M4JwjbP*VpoA!ElK z&gqGylVwB1O+SklRHtT@(Dp!IdXtQpht_;>9tbp67>yzkQiS~_X>zGfnunZfQgT9y*N^2Ric@}R^9dyKq4NAgqt}!I)+(00Z|qRF#?d%LaJtmq03NR zp|Ep?TvQ|$5RCeiBr<@rIvTNZvfAMD`uLm2z>!Lf?k+N@Wex&vJcKQz!h#S@6U8}8h|5CA$MEYZMrqgMTfsB3-g zHy@;csqZ~r#k0kT&NuS?fZBVNFTim&YhnNR_-E9%p|R?<g|S5Z?@N&52TGu*wTeS7B-E&($RAUIA$M6>}fcK-uQ z+UoGs+&jmS7`f<(Bt*%LnT1*fhQL$|_WlGXWAD9kE^vR9`L;YUffU};)YRm6G5H-Q zq~ZSHFD0IUDeJSf)?dl?+dlyZ{6n3F;f)U{!S}V3y1Z<_WmmYRcD~(+SKavi;18X@0#x1AIlKcq>&9%O#-En>R{PtF&NC~`B zrFxC2E*rOknMY0YKSRb_fW*6#mXCOb?Gz97$_w;aEM!(=r|6|={xh~`!%l%+7N9y~ znh%7Kq$X0KHyxk9OMI^v(G9t*0#}9VWf>d}qzx9IFz`V4Ct;GYlgYcr1@1IB4*(!y> z_r2S!2vNYn4~6eHM{$}&ckmAM2vTB+8&W_Bu;u{kuX>qs$qe7if$WU=&E*hX-=06@ zNKb!%zvvgQ>jARNdko-#2C0Z@cK&A^IsO8Di4qYJ!G0X` zybs%auUmYxWg0FQJs5Oa*huQVz-MvqJp`@O5u?=1KuCv30@c>{^!5l6Z>*@pG=M2D zQ$G3}p?CB#l?a$CyRzUo-UoXcwd!z(rLQf|uOLbw1HHW&P6wR!!jMT@|G^U+%|IQtJq=Cjj<9cm$xqcVw2!{}iG6bxio+M0K@+%2>FqpwbMjua z>hzNLZ#@);U#ObRtK;nXkW~nLqtwc1`QL38K9g@f-AhD`T%L8cA*r9HXM!o z(thER?&4ibOv5ikLho0%kHJI2@3sG--@Q8_)VLp69t3$gMM& zx|kcjua}3;6;t8gM6!5TBWk7;>)YQ)0xM zX9_M@v~4LX3;>1ocd9Xz>t{_Ok`OmSqbp9)FmqCe=I`#k@;glz?o-FkyFD#-Hl!6* z)G)dwRkrm5yva%qj^g44BuG+JBOgGn6^2ZToWCT$*QJW{QC?9BUkpUV2F1pTuhB7S zG7QP4xQ>aD{Sx9V$=BpbT1*nVAd${DzJB=tvZNvC=ls=AsfJEX5*HH?YrNZYo}wzg z%cwSED;xv*QD#Akgc_5|%BH^AnyAvyqQ5OBK1MthE0rQ5Kdg2}d|4H5VsEURiv^mK zg31;ksd|7FwU6-J zoyavD?+`m^k>GNtZKaFZ3{%ghy@|>|B#w-&mPoX#u~bLbS{Y<}(5xAzx%^d9S@h?0 ztruQ~sHLms+1K#JDQ8C&CBKon{LCt_Z}YdAeSAIk5e zZNuVK%pni+%RT{p6Cc=?^sFn)#{>cRFK1PbIF_B|05Pkk6@9in=ALKZb(>4lG)qSch3;) zPyje@SZVT*#sD=0Xq;%brbX(*kADB2mEYxCBxN54y1xlj*X|H3H zw&gv!4(iHrM+za|k5cQLrfUOqSw3a`K`$YVe5#lxM;Z|zW^Oh!_zijQ3ZI2Ot;O|M zy5XQbGMGA4?XKBYYULv@8AB~xd@>@%0CQMJHPd|LxMLYyaUl*X5^+XDISi=dl6xmv z8A=EgGT}HbBg*6mi&=Ne5Rgr7dqS!uO%^hNtHJe2SYe%g3U5MafIj?dZqM(Ph(u&h z#;i1%Ft~am#@OLJhvEZhKMT{(_elETDXe$`eo#*2a@+hg=vM1TID}ALc2Ti0@=Z#P zxN}Zg2;IhBrT|OaOl?z_dX2*uyr;@?9Rz|zGvt<@BJK^akI4oOrx;(k|3+Kw3$H5> zvN&^w?Ww7-n4m-xZNr%3M8@cidzDw7;m*n-Ub66(!}qpIp_A*!hkz-FhQ@?a8LmfS zWDPKTSsc`;yBo!CdzlLE!to%3 zdPy{$mFokNxCh^v#pIZMvkkzd_G=FNLQmu7LE3&dptzf_zcZ{p?DlFVNi1qf*6zsW>DPvqu za84};vWQ?DNq~WH#~`%8$mdvLa}>Ft0&z%Z_&a>dU~_152>uwzcFRZFM67^(Rwo6$ zCry4P7$hwPHXij|EKqQEhfPRHAZhs)#khUm|F8h_-zHGNNWPYxdEm?~2yV4RAb z97nE`bNNe2LU2@*jSKmu|67mtOta;OLzRqfJ8Y^$|HY z*vIN_gZv<6DFE9S?5&FVjN=`;B8>#i?92d{xB_!j+sxY1(p{K`t4EwVu<=i=W3 zm{CR4T#+zIhwL{BPtjZ2o@8h3Uea+s%U)NC@QREQJLs!Rd}IB~FFulw(6p&g^k}A{ zz6=NY5pn=KRzN&3kV~96Z_FD<5f+rPlX~2u*r2E^zmpqpKgkH5m@1AFUrLe|No**T zBD?a2-AF|=js2iL3>Svs*1(rGC@&5#q0Z}YA5m}jd=l3fAY~HEtt8KMfU(j0VgMJ2 zD&3`~Fk*p92Z>7tJsl^(_%~O$ICrNi7=oa;$s1<3n`cLgkt|neVSxBkFAdg%)U3F= zNLY#%`o%#+E~#OR;S{nYuH=ZZqcR00VbPOjaUrohXQooz$u&$4t0LPdJtQPm!l2lQ z>GfDnC8JO<(L_uXEi4RDu}Ybc$j~n$?YVui(j3p2wR3!J>D6d7|D+R57k(=+7$^a% z8OI~S49aDZ&3 z_)5Rz?*bD3pYp|2lOi>H@P2BB- zjBx)zh_I|F`*PTytx9)E`j*&pmfpUlELVvC=M=WM>7nJ8APA(cEX5Zt#4oWc>8U&v zo_pc&w^C}V3fEFeXk>;bv;0U?9jHDf44wm5A(#C@u%8* zyS%F@T1{`~?MZ}S(Upx2y*JL{qcS{R=%o!L0aLWjsI8$0Qk2Gcnp6j<4aC$+wl&Xc z>+m%u8dWxq=U_U_GgSO7MK+ggo2tF>$g8OU|1O3~m~X$LrSAT~5GWRKLL=?P%GgM& zh;0#${-6;CWZR%|`MkNG?Pq~}PQdsklxXOdul}*;_9TqtFXn*6JTZulygkuZlnyPF zVY|cNK=zM7{a2a8^EL|6T+|81>Jx!J{rw*>{O>>)n8{``uF%eV`>t8j5HUS)00fM= ze_6;-L~awiBSIPeMyR+y3(a#AwWd4#QxYMwXbgOz_v3PZpIp07kx%FbqYKcUK|MGa zg6Y#vxlL8kDOx%KO37ce0m^=mMG=l}PE#|wLj*w8&iMVPzNo$uhT%=6Upu66=txjw zuh`tuYb4Ad0hF_qV1UB;I3r?rumQ`Qs#}plz&JEAUU_>r0LCiQ|M$l#D@_>uI#Xhn zhDC8fR;nn@Hck=J?9ccT6bSWa|?dB+6#n$aZfY%tc@@Xs(Dm4`RA1h;JB;K@P2x$ zZMOY|2Ix?ui`_qV!dUg-0BK#tR64*FOr(-E+8APJCd~KUgltGkGGVS0Kf`mwLHh0J zVWToocH5Kd)jv|_e)*9naF=dvr0=O-GZV))pIwmZ>Gz+R1OrSI0BZ)V`|ccqm2C8K zbJ*6rr7~?pJm+nE3S~}p8i+6!Ki2#uv&8CL2H)ebu$7k9EAK3J;FceS-GM_o0WMoy?#V&$Gi`N z^aTvSNS)C-ZJV-cOxQM39EIvYTcb#yCBA=*;Kxe(~NocX>4OZv9ha;_+6-=lvQFaXt|W&bQj=^puFN zr%>TJR*oSfg}bo}mnzG1exkv4YjcQnAK4s>@bcIV8`KerAdSm;eImULlexz7J*evD zT!mM(&GzWj<>(fQ_v(cxxXt0Hm8~3u_2&9&?rp^1V+3JYoX=oAi_QnoL%%D0m@aQW zI6GOJCOQXxi~!%lvx+eFdNZ0qXL-oyc-)cUQGT{IeYL{_7=Es2&~m?S{kovL;_1xK zIC;7Fa_Uvbi_rRatF~fo%;qKSjN9AOwDW1|4O$Sqebu24_{S9|w%6D9@S@%gp^!RW z&ntJ)xbF0)ncG7;D|W6Oz#&c{*!tw5bC31Rr_cYgQq=mZ&iwRS=XZlBIQ&<0*>h!@ zh4;Vp%<`cQ)?4>I$t1d5?QEtydp%Y8Hx_l4%Qx$*KoDCk>RiQZwmwD!db)=BcDhPb zP`QStE(M@h4F6q4D1OR-fH4*3JGN1os&9EJQ+d^Itb1$ei7t?-od);8?XdsH%`!^! z)5~kh9t6I-?jFinPx)KPNwd3w$r=v(<)MK~YQ-7PdAQB3jPtC$-WyNge!>M#-HP4H zxQ6jY^6kp&6u1V24z1ABz&Y$Qyw^+J3;1cC=9{!m zGmHBv&DA_gG-?$5^L<|X67RttbG`GCmd~53XQAzV<=*QHQ~j!s&Rc4&29Ah9Q2XMH z*OK$KS7Q7cMT`3}gpWmQ!plz9eUrHC+p2=g^ZDSb#_6iVkosP$0Yr^S+rtl*`);~B zO^oYZ8ieQLzrHLun-?b+k{s9_UTi)~;L&J*HSaD^(6&4=(~6DhO{U9U4A&L*U*L`EO{v?AI$E&aJ#PuZvbLVn^!+ zN2(i@OHl~8m~W6jE+HViUB}h~sh%EAxYqpzHg5KANydb9INhHTj-J|X=2NryuLk1tebX^*E=Rq+F$>!y}p*E>5J;T=o;ue&uXj> zdj#fG@HHBYdmOBvDvd+A+bNdJY;0_p*DeD4xRsUG=>ao^SMIpTt?qF{ASDYnG$Tcm zWFPn*8J#!*(rn+LMhDMzH{VI)C<4?d-1FAllTZ2a;*!hdS)Ck6hQMdN^>W7LHT&n{ zCW6?~ODCZ6t>bh2U2pF6-cWFQd8qD-m;T-S*N$lIwyo7^N$_^cYp?d7D~$}FLF;X; zCP#1Ip%;e=+TxcX*MZHs79Wo7+ve%s>)hI%4zRafeS(<0^8^&jxyR@3CX+}J=2Jtg zw%e(|?+IFUJPtxvE-D#*uF9RL_**nUIKL^Jkh_{n z+Fub>obq_;i<$!`r)JrcMZn9@V{O96)s=e6ncL^6{0x8a#Zh!^t@qQr7SUf_g9ctI#wgLCS*DIHdrxBC4Cq7&+zq>JR$Ni<3=Fb^? zwwoL5(F~i*N+mP)jmK|10BV4ndwH~$wnh_3W5eiSB~Trkh9Rm~4vytjl<8b-E{#2{ z!2If*8e1Iq80u=SfD!Pk^;)}sEpPw96j-412nkxZY=lK5N$T-4{d1SNGG=tgN9*N$ zi4bYs2IMi2!IOH<8d#xiAFN!wtPE&yzs^~O>p-s_tRaAbTtA&WxC|vN-|~II4@da$ zwN6jvu&r$3>eI=N!c`pF&A!#s>f?-sXy2yb*bVpIBplA%50}SZe<|R@wWq$A>*d_r zcsWQ;dz{VWZ1oATt;L2w=zP(CS>td&RB6WzN8lN|8I4(mJNoch_U-Qn&^h!XlT89$ z`xVX__E-&7+okO@lP*S73k3a3#d$OMV#fl@MetelTsHsjt-F`IlJ(LDd%YH}Jrie7 z18UxY$4p)Avd}Z^e=U8;ccuGwyx9C@*WXj4o~DiB^XmHg_baB~SdfPrF=E{nW)HRH zc`|eMK;~#>CNL5LC_`c;QmtK5s@(eno22rRC*&6=9u^P2BM4-Gcz?MbTgJ_n#Xw(| z_trF&d4K2f`LkZ1(Kt@~Q=K6A*vZ@DY<>M2(pk99+}vC<0sb0&9C0ZL14wnLnsiwk zl|=3bjQ9QJ>%bjvz`o9n4p-$xaXp<(7tR@6`n9vQ=I{LcD>C?(;{otM-?-a{3o-MN z2pPMb8r_pxvu|3O08g|_!`t3X>X>jTb zwn(fPeA)z0uXmwC9hAR7M|pLjyYRyRC63gQ?{JDiZ|MegBDz zO4+lepV(dMG%=Q3P3T~yA?InAs;Cmy62SJZL;W6(z=JcrH)A|jo6d)FTt*6M?4T=e zl0crGrbyC}CNp@S#j6!$YrQ`A&>9^5 zFr@ok#j^3_7BCv!-T)>pcsmEHkKji(%eF&%@^**o?nbCIh%z?I5Un07?VsBDt3`hi zK;;oSXsIxLSH`Os7cahR-jEY;bFz!_cfs|ahyLuQj%@6gdGf~Z;ndw~gYCFPy*O7P zWS*)tSa!`M`LU^zdopiLkBL!ZgM;e1H%#m+EB29-v)guHcA+fy?06-6EPha--via4 zPl+W1)NB76`c1C0T)poehGX}G-m3$G(Rhz8s$bp~%K#L5I+p7t#FO`*W_sST5RX^E zde}e4Cx%lgqngyTR_%b0aLm*y!_Dg4) zL{1<5v)6*PPoVSq?#H~7*7J?(MjlZ?hE?4S2$y5G$K3b8G+uv{Z=sK&y;gnpFs>dd z80aGfI2QWXl87^Z2CW7<#GQP*^G@`;9O(Q;-xc|EI`#I{4a>F5y0=ikm;9G8xn!~C zhDK*;w&}YE0IU56lzXSzFyjC^#xD@RlVsce++}USrFpd1Jl)bvlU%emqmWGv8Xzn` zig0`L;Bj3o8Hma}e|X(I6-0QXA}MV>!9lR$dhJSj&D5xGYob|gM(2Ii$~u44m>4^5 zu*e@mlL^$kJNJD8Y+2u!T$Z0?eA1UNd0ZyBosZXASJS+oyYH8inW~(xoN)9j+8x$o zwo@!BmYwHLxo~1}l1`T%4~cA!-wu_TR$WqD4o^C9zEo&^31r&IV%qyadUD0#xE-TW z|7xu9TwHs)-r)e;g4KOQ5W(B(lHGZ#oa^myoT!5D;@g{sm)Fq-0+}oArdQXNTaeS?Y<(^0ha|WA*8=tHRsm zsF`l9*XGbSOJTRt;O$h)XK!@2+VVwdZd?})KF=9eduqtXLUwEOC);xCR`K2!u1d1D zl5w9I&bu5JXz=#5q=wV!ERVX=deZ}pg0?BPFMAq))k|$278@bvHp7JoCrlk5UzACJ zDqYZyIrLDg<~!#w74D68_Ec`O8GNuAE-tyd&hs{{-X;rFh~ta_e|_?hV!wTV1&*PQ z+Imp;^u=3jv5f=rr+fSDvM&_^uKVFnx8sfuj*#*t*OQg#v-{cdM(VOvp;DVZKD2Uo z^RX(6}8*6N=mHH>*EMtiw{VC%u>S^Ayb-g{_9zM7|e)ouHWezQ-0 zi{s{e^@I~nz30iBClPJHNQ+{~^vGEZNmH$rY7)f%1;OEwW++Se9atptxETepLP z5uWD|@W($#wQx@RoOq2mFVyUPx#W5BerzAA^S#6+9aN_qt~Igbk-45Z#eGj9gmEL^Bp2lpXK&xaef%x`!!xX z0AMo#NTR`&8@)YRReD#CcPi0BI*p_%kGquI2#z26?m+*4ti5GW98cIix)30X1(zT} zg1fu>;x3B?cb5P`f(B1mU~z)GyGwxJ4#9#255X-22>&6!_ul(f-KzWP&IhWt*q!O= z?&*2@obx<~HEc(}DxTu=)S>-IZKPaCd>BCAWl|OsIOL)L>Uag}u*u|IpY#q6iegDy zh=8BwrwhImT~FiD=$v(S#amo}z>rf^W{6Ln_cVsgSVLihYp5RMNeo3Xo?O+3eqxZc zb-aNJf(|DK)NHjfzKkIzd%09A>Evz<=SC<{624yenH0FOicQlgU`q8}`~?8-J?Y1p zbBr3NraiaDZ%|_&ix2Tt9!~RxdB^9*?;XqG2!q<^5#y1JX&K$66xh(+|9=$byWYrm zgh{ZOi`%hW@eRTekJN;{mC7ZaMMx6OsTKl(m z#YqjCnHL{cv=tVAa&xjx`GiR^EC=Yr1-b+x8({l!EkrsdoLj*L7 z@26M>-FT2e4XHZkQIt|)FgrMy-5ms~veWO;)D5vwppmjwoyhPw;6I+6MFs%`yN3WK z6y?vWyZOhx9}+SR{k!Gg8Y!csM+t!x2W+@kYx;a!Bpc`xs(4MBco86x?Sqt} z_7U)=$xs_9>S$3bC4y-k23X{&0j~D#%(Ii^tk3Z>k)N8S_dHm5Y27en!MO%hOB}za zYm*v&1-+8>kfJV6DMHsT7V95zPXK34Mf>Rz>ihk2C}@PCI}fkRJmIPQjd4lpQzf=8Q;#(k#I zn^PwbY|I{v>(t9j;P?sax6$=oYDq9ul<0_}qZP)~CbI%*3yhdsnUI;(U7_TDdIbD z43&p9Q-?nvJw?aWxQc2Ur6=|wlCLWm6i~Y??W;R}ml&~(#FnNvP(tc9@V$5y= z|K`hyTQs&*OwUO-c9pe?u1}<>Rx0Nl{=c!eYfbOc-7`=Wvicp=-c;yNy)+jm zu6fZ&j5_AurNFmVPBNm8k)nEtdR&dQ>n^8=6DlyAzeA)%Vh);Ca;miCcdAbDL{(!V3YSQ}3 z`PWDwkTWOysIS6L`$`6!Ze-3m#iKShY_6r*NLczOE?Ny<-}gSvJGKg?F40*;XvUrdn)O>v6PDu?ZjH~;AJkPO@rl!ZR6o>s~TAVtLl z>j@h`#t&`GJcLp(u0hbTo$V`E#c|T{HlHScg;=%NAhsG<{~(BOq_lQ_QVm0#lXE#u z-;{}T?RD0+MRw^+kDu)ybVUu-6icbAZ8xLj?a~q3dDf1WYn_N}+YZLK;}hU8l*IYu z({OpthM>7jK&?jG9R%z*GXU-lKyHTNp3cjmE{`12V3 z$J@&&B2CA$;jEBUta00)|MEfXaHEVor)7x({-nEf@2c1yrlv(zQisKUY(`w*V#V@9 z4$ksHVn62;uz0CbWRNvXg$K0&%Yw}D$zM342D_SLj6VC3e(R|);R@=2>7?Hh$q(&8 z4Itn4V~gU&13;iR$k|D;Ib(l3CQpqLv8P>vl}n(}S?XmkO)QP2r|s1^9HrS22kYZ( zQeOaGV_?=UV4aSSFD+y9YOK00b;ObxNZjdj=sD5Y&HLQoIqOjJdNwmUUue0Gv1 zN|rW_CYd;bnLs?95!dS-7d1sxde+${xJrhnltXQB_bb4yA$NeNf>^hi*5~ErhJE=T zLVJ&YTduAhdp>SuVCC*%E;OG;2}Y40wKNfKKa*S~qnNWH+A|w(ECQDIQ?hoks*Cms z4ei9qtN|+4b38-=;7ZSN`sd#g+*3TIBWd%>4)ivpmS<~ zCqHbm>En@X`mlK~a>Y@H-FGV`74<2z*MkCBF|VW6`Us(AcJ!%4?e{ATPs^A?qP z&r@)rCQH@U+x(Y{hFjUlHU-BLqjeGau_?gWFqe4U-cScw-?l+h9_2IUny2c3@?ZbL z8S5^#JcpgS<(H9X)M^NzDGc&wlXIT*i&URSFnw4vM_howe{Mc8AyMih|0kuLK|Ko3 zSWl?vGg3TA!q_AgtNG4$oamYaUov`S@_wqIf#RWnAtsO{NtZeMO#Y*2(8j6O$L`bn z`rVUXr;qHNSSVvDSe>VHTOU4)X%h>01;Vs^r0K^k{yIO8CuhdUcBtz+vzYw*=U@SDA4XcKaxjudnU`C3A5UN7HTpXCq5i^<&wXX zlo@ceA(_S+ji^L6>a$bO-t~N=LaVMg8}fNqfCR;46nJ4;^eZ|{S3Jz$QxppmsqrclsdnOmtY_0Y zsvHOhPJgKVrR_5uPWsu>^o(PGfu7nj`2-I0mDX}fP-{-NhH5Hn4OyP2XY-Rw)py({ zYSSg<`3e@uDoZu$b0&^EM3`qI%#5NA7tf?2b*txd0_pdxhSDw_4+xje?H3Wu2%tB{ zE_1@_K6|Slo2F6_G6VN2KQ1_TF?QW@fk1yWT?4fQ1c#hD{G5K{ALn?Te`)*8dN!T{ z0!`^vgkMY&p@>J`I8%Z^dnjYU+$mS9IO`2ekK)@4ZTC!ihV#Hg{kK4Qv*{%a6CO%{ zb9?^Dp9`Ut|0pzX?|*h_;g6?YbH79D5hyja-j)?L54z_m#A z9s8q4a2KN#y8V8^?TgE={H7W!u7CUMyL~@I2UR|zxvmBNoqBiZ+%CE%e4YLFd~r5h zsVN|_8@J=;*|IM3;YSEPOEkb zi6+PY*KWdZ3E&T*ka!C5SAl{V2lfC}O2vbI$aiu0rF!+FxCowc^Q|W6eLay#q{$5T zU+dU5q#XYVWXf7%uO*=t8WhlWbk|?zFMGr!_uvxdZ?`!40e(Zq^)FD+C%bO`rg42z z;&<#ct1!R?W}`jk6Ac(P1v_11CwqMJptCY4Px@`r1O$|(lh_#XxgROotNDnP$>Or# z?agw2IkLC$rIlaRCHi9J-NyHJ7c6|V!6DWa5)>Yw%~FZ~l9I8Zh|=LwX09sheJ}d(^n2F-X}`?%8Gyr7#|<75i4?FIDvd~oQp}sYqrfnEf0e>_7~%K#;WhGT zJ9VI;H2wVA8uRdAw>WPgEVuU~y&x)ZCv#-+KrS~`7-7uCac#<)@IpInSC@$8^I#)S z)&K}b)kanKplZjM);g*xzk_vTgA4aJr!@%l%nhjjloJFRmz z?gxSpfJ6e63qf}M$F#}}QXa0ya~sdudN!ggLN~`9_*Tyf#Ynzg4>Tv>eKXu0RTY#o zuFZWc>Z%1#UjWy9f4vb+?02ue6+ig$2t8>Uv4gKIdFEmy@3}~M}n97yS z{|uo8N(4%E-0o(08J5l4+x$CfM!ZiyROi#-Mgf~NP>-dTN>I$6uh-sZ7MV+t6D`um zhEJwMxjHsak4%&dumK0s?tsIUpc$7MQG%tZZJF`#SdTm8-?hG(nKZt*C}SM0`@-%9 z@Y*GDo?g5M%h=j#h7~|eWzE#ma_>+xP+oC>-0nBFe`sOCIyJ$J^i7vnOfuB} zh9Yv^c+>{qh z)^JoKrs`Gpb^Pl$=y3U)oLxZ9{!bT9qxlg?3r3_3fTkrUEzk=_D?}Cu z0U4i+@ZEad*;Ssj+yQ^P^i^xy=<20(O_PF`1|CJ0!e07}v5^lnxg&v$^;&5lmI962~lC%nC6)>dg zwg090K4cgEy^rqe>jRuBEG>boH|@?BzwvmOKYW#wefw7bY+u}=boK^({)jE6hvcdgg-zx1;ca<9TEl0= z=-mR(3zsc;L&IYnDv;whfOf+3urOyS)t@N_w~r>!gxdXD%#?_%h|8L&Jx2|$3{X6c z+iP`TlR|&Jf4af$hX4W+aR4ZdqoZt(R@ydDmT7g9mM!NS9NgFi3G5TQo=YeB-;ey$ zY?%#D%n3MpFM87Ix4CtmG7Q6qUcsO&ag~HUcFB#LESa z2`bEOZ~|i;!VIj$3zYMhS*p9*y!2YTH#CBJ73)^f4G8ZmX=Y``k{6OHHtcWczsg|= zL8X>U1*PPs&+T%P9ANfP-3q+P?<=H-oi}NC@buI?yLm+=&9&Xx=qhHrrqslN27^Z@ zGEv5%XjV(@)v078E1JRrlaO#I)anHGeR4xVT>I0}M z(nFwzZu-}Ga3kj<;chd-pGR*WqBuW+6+)?t9O&^riz%6rkxB|2fD`Kt3;hVb{P#5f zH!0c}&+Xgj&*&*u-KX<=%NOJBl;mJ2Uy8LuH+>^Oph+7How+!3xJ~caj>+q{qWL?P zXdtBE+R91hS-P53wet8+{K-g|AjCbWvQV)Va$4DXJ%8@LU@+)C!xSI$-nsP%1+hN2 z?=s*{GPw_p229|3r*Ml55aSsc4aU1TZ5SYc|5()X?9sU(o`IT76$H?LD+~8PGh>=H z4iarj68L@3ETv6F9_D?R1vo?dl83$q9|Te(&=IT7phRO01aee!b~>_&7(v)+c@xYL z$aNfMSfdOqm@QX^I6$@tv-Ia^|6LKbu;3{p z?Q#%>Ru;KM{UWjkbr=aQ5GGdg&8q5ooNxzz-_9o{0lhc(l>_P?%(E;vZH2u1W- zavWtE_#I0e=8dmX^f`MC$VfhAOdxS6D)7nn(y6CfLjcU|I55#^6-8{}R?jH1X{~1( z0KuwR$bNht1DYbR=Y$p^8|h+n(W~(H7jgHvilE;*Qlmp4+XiBV2XVqU5jIM<4M`jo zGx}VN&M2m{>v0wisD-v@WW~7z2?Rch8d{8eS=dPN3FksDBxFWI#odK|uMqWr0G@{Y zzUhRI3JW^|tn5-A8~$bGB!|DsC}N0Tyx>#^WN`D=>Df@uFYf+Bi%D7WaQuRf@xqIA zI|DfNP5eM`{MPT>h1kXTE#K;29Y6BYSwCi9lD%t7r^qd#Gn+23%gEdk0P%>r%qE;0 z7*C$Zr{h-N@{EU}fFb~Z7@J#`E^Ps0w60-$cNn&G@6Z$p*O5-J<9_XOJIeS~mU`|u z1bg};?x3~J-`Qd&X(AoB3Ir)`J#vKKla0p5&>$1xAQp2U0l+#oSI0qDOH2T2(iq;6 zOnwNq|Hx1BXF3+0BQZM`Ki6E8-{wlWgqfC#hkM-YSYKk7qZ`SUkjc`{Ii z-EhmbMpo%z8m&C#Xg_Ly_XYJN+>~ht=IEBhAotnoC7~}P209ZVhFtTGOtdjoW;;HB z{sA7B(?sH|P@!86yi`Eyx7$B9)!Nz?9tEXbHxQ&M%i4?+9)BH#+3Ljw8O*bWcgzg~ zp;ZHqHSc=pma1(OQ#xFfuN{5-3?nuD6_2lA6RGmOlm`By_te2`lfyesk-?UMJmIxB z!?hTrJgCtk?Zgcsf^F7_eQtQ6<-@alf?v)=^xHVI?QLd?nhq?O_0-%m#ThYj1v#@4 z3>LT!_cGFc<1|?-DSR7aDd(3V9MLKpMbAYiea!- zeLZw8#f=4OhL$SNMgwYPE&gBXMl!_lHb@EK%5tjGAs*xYe2?kRI|J1e#L|9T+|bj0 z9am_u*qy!AlK4vU+(09TLT9$rADTz5G;EC`(()1n`t2#FiC3pkXBP$3ceCaeD#s_N zrJ}4)4pW$6Oz^%m`cpIdNMpbsHHvSSL6)d6EGWooQ(7_B0*6g>?e+%Q)x929e?uCb z*Dk_dGu|ir1+^mJEwqS=wZ6b|dyaZ@)(bBO*93QH!jT#RL)5otyZP}lvemir)@!+X ziCPz%G7Cbp?+7bi&4Y2jhp1-qKL=7}($rI9)4zU|Z3qJrB9eC`sEs8l7gupS*)acJ zrKDxc;^nOube91^O8RwAYtWzbwo2qtk4bGH-|hTQkp~cWwh<)i#hem5d*75FIO`O@ zIKDp&-NYoNxbGey`}|E?IAMYwPvSxonjELR=0yfVOD!mB9oFWf+GUXYgm?Zmmd~33 zr*7oqFKsqj=CI8j?Vr2a&c9dzjWG;j#pS++61}ri0e6bULNJ%&qfbpM(Dr1|y-$Fv z@m7fTs%AGme(rpS3CrlflY2aAZB)R}ZRuAG=g&_>C$wZHynUanZB?NitN}(!bHy1x zgRWJW_M@V@qlFlu3qH`PQVq^gf9P<~P$j(eBDAbS{Xr6}Mc{jG#;ZL5*UBiwOwPq=c2rcI-x@u zcund%0IjStef+b)s{|AxpEa|XvHpC}Lc}XOS-@9ha3piMV$LTMMi*>;ZN(>M%JjdOJ8bxuEE?83}g$$B$~tufab6 zUk?|t&-CEDYOEL!Fzd6ett~gQK{pXTKEgq_8A3|o>Hu8kBKBJLC%g2psWM$H1pV0- zPk$&|No}kB@pvN8dpqHeiQ42hm@jgPxPeq_m7y_B3q!TPiMZPc-#tl z+V!4v-8r{$*hQruLBE%NM(G%!3{z)LOiTneJxAM#e?LyO0;hp0ZS^^_{&=@`k$uzs z_y8#T8@MhnFP~g@f==G8XEabvzL1_jGeznc1%9ptSrQFM6B+B95fPG4tyb?G{+VW6 zuM-(%#P*cX{FWme0K{DZb^(C6E;H6#V}BGrdi6XZCM4yIgEu!f#gz!PJRf&4F9__Z zggNYlie)uj`~OIX=@t~QagtKd1yOlO?@N>k)#-&{|8&3F`CV`)0NteAO_^`tN=u-@t5aP(PfA*_4kYHpW-{BUlMcSCamQhrYcT)OZC!LnHf+k=LDzRN zK^XM!(uK`W2N4L?T4q=sTj)DS2V7p|V5jQwIaNc5*Zf39h#ZltH$@YXyektDPmKpMtB9k*t8X;FY zTNHz9;)l-<&O%o=o6iz@_`c%~FmuUIxD>}&q?xwp^C=bLV)X`I`r?}=fr>uL&&wL1XPxY1|GR)Xd zJV4IE$=Fa+M{=1#CB5}kPj-x3S>(Gelc5eP*6P6N><)lMRkE8 zi;E=5*tv2*%IUcOqT9}=>0S-SQ<*MS$f-JDjZ$!MQT%+!SK+vrCO)rksL{JJ^Dm&@-yFKMK<{C_INT|Y zKk?#aw%ub18-g~i1v|A+Aq$kHa?D|Cm&3|+S_1D5mvvV%cK{wiBz$CtcpTl)X}3

    ({Rz49{ult!mofW9b@KelfIIXKu1B2ZrNO3E#5^Zb_Q?;y}R1IBJ`bS#XI}2TW z{q%lrd`L8(H;IcO(Z}6XG92g~dmsyi0#dqgDSY zD0x|=fn7Q?`>x3qmTa7_`0McLR9e)&1{ws}Xj!7o9y*XpsOS{(wTEyebuYwTQU{62 z^ZNTlj4mojL6!IBBzCg*c}E$S?T9$hv>rsICoxM*{j)s(x6 z&VP6i_e^?2tbLXVmRZ4s`+Oi&7+KZ(OB(A?X3b&EXG?lG3rSwi^Bvu&46lqMMg!bx z0XJA&sqOYDo8%|U?8FM(ftWfP4!6_GSCAfPHF>9ixaP; zlyaKi{pyo7E!@lQ(k1n#QN1Q!^&qg8Vn5^Oqm zLmo%0p#hNE6Wq~>&f0L~w7c(;(!7?Y79h%N9^Xl@(Ou0+$?zLtw;c3)HZ9(r%VPBR z8)(_(g`3LL-?B6of7k4lLpV8fy|P!XJbN!`voii-4`*~S&uR%18U(N0Ht4$2D%oNa zA|n@a;M%B3^e*@We#}ijzci_%ALFjXZ9Q`y%`ze9F|lkCuO#hqbd9Ct#>Q3MbdCB! zTXKWFG1H{^Xs?S_`Div_k@W-S>NHvDUm`zv7TU{#s=mN$I5VgFH zqmEXyFzY`bKS`$d2ECZR zglyYO))FIV-Q`2T*0nr|*#Z%%Z-~*d*^(7;8ty=R(dHl+<;=Ev-mwU6xaHAQ1A6Q1 z(zv^y#Uzhf(t;B+zO^@GG+p24Ok)A{{hs+`*`#VnS&i=OFP=lb71evFWLh*9!uvP0 z!D}9Q4I0y7%9=8Kk9np{5tLJLe8JXOI2RS>spdp-ix8H{LY5iI!(n)3t#(2}I2Br`HZtwr!i92vJ4N zF=B#)W=!jUB2q9jXN(DdEMwV&z!+S~2B%{wo1FFKYD6-`_miV(vF#TyLMg*UMs+@e zG#f$)D|hpHzIn}_-6s}XL)CZp)PdbfbjMo2rA7iPq>jN=WRR0*!7p>#W6h2fSk`I9 z!3ZT&thOd}X0)jz3PwCPPu;Ya!Ho(VdiF{C`a+A-H94b~~&8vVbN>o%-0oC`VdYgCe-pvO2`T4=Rf#5Oa-k39d_0PXRAFLj0WMYzrKE6+W04Ll%5LXSN}|h<#g;!#euGF7g7!R)ie!Tv&3M?pOzgjy zVHq^@a|Y=&AVqk`!$zjxL_)~HT}KsZQ|IA?JU~Qk&_QOeti{LC>t^{H#5y&IlM&=h zzc=p$z0Vm2uE!3jJ~9;b zzLx`mG~Se(x5b-Vp*Wmt3#H^+j!w(KsUr_GvVkyQboMnP@WMQB_WqTd?pEjue%(M# zprXU>mi`qF#3_NHBMwJO_*-(;c1U9W&?(T+7&2*_t^lNBL>IRB&tZRb1?X)`5JW~& zyTM%JZP2ZU7WH>w*@5gytWl$4+wwFd|JK8Qhm!dlmO=KUR`?bW0NX#?E$2(XPxx$q z-SRt+0f|xp_P(^l>8RNU2fgcPb?>Bi=lWUgDb#M7O1P?9!v zF}f=kH>fi@+l8y#udb}Dtgm;Al#{g0-MfQ#ndeA$%Yj%75|-x0*F0WZYI3_Ud9`s@8sOd=Icj- z8K%!gwX`e^rk&P1U7lr%ln|D=UzeuxhUD287TLWEu6M##6|}y3o4P$-%B!6XHlB?u zQNi*Hc6ixVMA~$6KzflM?@VM^P=Jw%gKxaTqq2hDamTkkO8 zV*T8p9E+pT91~MSla{l1?fG7ThBq>;gLIJ7@=wbG!&03-11db<>fP@>MtEVd=~PFL z1Si8db2voO`^}r2?q!MB7t7C}aU{E+t%b7m8yw$snd=K-6^q(fQ%6m4X5yvs3P8xh zW>s@P84S#if2+p_Az)8JFT9uQxjZzISjGhqe03Guo@wS$SA{0Rp(W{?!!TJ|;Z@U0 znDJtx);zZkE(D}(8ALD|oR!AUbdH9+$5Vk<7?E$`UROsIw9IHZgY&$o?3lZ=L}QW; zmIqSxRVA5`>8eVjN8l2lo5eKD$j%w!_C5k+R9bCuu&ePqd!tx{QUiO0|T%p%m?BQ@bB7uVTPtR4Q6 zw#+6>df$X`3ja2341^i1DuTJR=@0K=zkVpctq_Q(Dk6>uOVFHYZbc>g0Q`B*lNr=mZ+L}884 z$*yM5z(JSC5@&LwO(>>f`g1(3nK@Y@d5Y|jLI3JIJx3R1jiu4Ku?xIP5M#1x_3g~O z%&>(3L@xs~oKT2s6iPh_bDOUJEaoQEy(wnlH^HUI#Zt{6*7m_hL~@&$n(elVn@e$R zi2t!N&#LncYWpjKB?)|i^suS7S^4?5m~YF?`EY`J>$@0g@NrP$Jvm~Oa0+sxm_$NUlVm)NhevujYU^?hQF4n&T1RuAKGVwLl;G!Ir!pO>BaIL2}0Gb`70HlsiY8;tpz;nrkv0 z!3hF=rWem9G3`S?FR=k(Udo2oVVA`Bi~T*~M`(i0a0|ZA@pNL%LGQuq*>R_AAN3s{ z(_|kewl?@dL*(tsqP5`%K6cqGo40Z5Z}00Y&(Ui;Jr>ULv`HHyfpo0)2RXY#dejmw{dA(UeC_kGnu4zzJ8nCRw(AT&<0Y z7FntL4$?o`tD4v;*TrF(4EW6lXK8EN`HfS)q#8U za)Z)UdDdOpewO@BRBg|iPZ70fPu%VEkW81;F{hKb_4bFLmjdoFrt~4RB9EodX@#zx zW;vAkX>QvoE<|4&N~hYO$5*P;PV%YHgRZ~cWuH5i+BNfq%o_n;mK8d8oNeg*L`dO3 zQmtrD$SS;s_jY|qVq-a;VtOWUvN>6W)PP!9+Ch%@YK0G5cEK$);*5`W>2LQ@cLu#u zmDMlKBTDOn4?)K(X?}^V$4T?Xd%Y|AdHc)oqZEbdOBP?_d0p#H*ZR*Uu!YWzJuGJn zD%Ua5qNDJn-y4&mX{F4N-t+GtXz4uB%JN8@$4INFwn=|E(izk{)yGL^5QXHGG#>5` z9L%+f>_8h$t}K7nKhIyuj{arc86G1vddzgL7Ut~jJvp^~AROQvG_7R|W({6DuEin> zNLF2Nr9JofFx>uFY3T~uD800~k)7wh35y?tJeU3nHAqH^phJD%^T}I`ytth99fbcE zy)O0IGL~42S=9W1=(_~B;#hA_Iim9IYyiBxueKD22hp`nm;-i#jc8izG zrprQ@xVgT5w{~-Vb3<=cW+2aFTyi&GYcW{IPGmI`Q-iOg)-3ooIG3D^wklw3lE)VL z9l}h6dUK5b=u6fV`5VXEx$Lw;t?_o>)mjNw+dKjseCGWs!K+M8Hi8FATyqd;y-5u| zT61zec|7X)rY}@7hf^XNeiv3mhz281z+hi#5;OD%fK*#v1_O60plD2%bFSsVHA6+G zhNEU&1U596@U;v^KsQ)|dr#evlqiN46k)@i%usHvh~F@h03%gWS*Il)cBRdC7Nix< z6}jquBb%suLC&*+1aO-3EEpo|Vz%vY%2NzvvkgJ^Y=O?>uY(w%g1 zFa!yN(gPbX4w0iAu5!PDqp1<1<1?K3J$c8)yy6*w@+^QlEKWUd=S~eDschRI!c0hZ zqe=9Bw8!on^9!m5^G41*yEpb_dd;Z`Xd|A|VT)RV-w2W6vC`{qa;iHE>t^^9R8mMA z1Wx +pIdZHV#%vg_oi!(P4u1Rpjp88rS~!M68PMS%gV>Am50+>E7sdZl_D>1fs> zrxdd!DW-~ASIfzEOe6Y52CveNS_}B*y{OCZ5mt-QNL4zAC+0vf@gLlvfw@C8i3eDOH%J8{_GH4!#_x zq$W?_8JUXZ+NEfBY6payY?2$(<~pXY=OR>-F&Z@_kGRRZQ-I}D`x053H?iv!FU;i90U;MCHdgTmnItwkukx0%bY`q zTBMud*-p=UPD2zB!eqOxJ6rabopEg8JA$yhU0e#jq%pD1q#Nd^8ms6<&CUF!-2K!G z)TJlHaMtl^ZAh1*;zgF~=txo=7T!~@Giz&K#^A6rXl;_oqHEX!Pf?B?hyhtrp$^ug z2~;RUPS`<_jW;WI0LKJkYjm*C#4x6Z4V_2RW}AUQkughj9Kp{mN)9>nTK8kKA_fJHXL^5IPvRQu}8%zPkIe@qXY%MxO#&o^6>RG<(E?9)Mc z9I>d;s;`AZiXh-VFo=>(sOSJ`dW_HdiyVx`%=&e(DYbr}*qPbQ_iEkqXHq~RBs(8* z#l8J|*H>4Ssn>ib=)6lMp*O% zLOG3?jFMw={|DfCG{P5f#?jAhQ*?Fyk#~r~`TF!go!1Qm>2)Nck`}(KM_v!M88%CO z-n-Gy!2(mh$KLe{G01&f+QFxdlWuuBnO@~c;}_!*kw>vl7p}36=_U-Wo(+KSy) zXga#d@?}JVvLQ5@oT>pEfI(sqfO<~YOukJ34qWOdh7P02#g_%m&J()fBYaYk>YsZ1 zow_&5T!&OMgwm`PIqV90PmBa7z|JdjOJmSyDIv93a0hCKspW!ol}L}Qn10%mNXvCm zx$!`-@tN&SytL+F$*2$~hUmUe`u~Q=^6y7-)DDH*b{l^x8EsdI0C9=_~hUWD+dv zQAd(guPAxPT?&jjQyo6!6F&1#XD}#t7_U|Bh?Mo?@tt=3Mr_;91%VpNz&{&D=JQdg zqSCuB?U__mYayx*O;8ORRK+=-1S(X;v-ARNkdzXo!f*p`uu8ll*F8h0In6k8T9|C_ z*swZ_F-2$KA$YbW-9QYC6gZcohP2=N)7;+yGe*|5fkI6r{P_}V7AB#1 zirEl-VRuGZElVRbMecXZ;S#WILACgng7n8%GLq^@@VzoM@^Lq9!BZO-2cdjR$QM;C zq*ZU_WK_>X8Nt;L%olkkmOP_go>Wb=l2=9OZ97C)Qaxo6PNayNCkX<&Jk+^w1a*UB zGKFb7kG=*O^}gF#fAu|S(#7v|-Q>)xYxgLR3S6c(Qnc0T9gMD`q4)(A^!_|DS1`$Z zv58S@Ab@M~3>r1BJjf^WWreoX8MZbB|Gjb)x!|a|jIRYxU zv2xD~$CDX+KbGk`{|! z^GZ(nE7pz*gK1?y zqm`<*;0kbyD2DpD0!qjQ899;h3N!qR=CsFm>Z$J`DhVwz>HIu#dEocd4j(@h4EfJw zHjV2q@_S)9HyCMABS>KHr#@69cj)l&3ja`9hcSXSmIQKm`=))PkU;v?i%nkkH_EO&GuRst0J6lN{kOZf4KoCD{f&BAkA|sa|n>Xw5m6T2q2y`9_ zJJ?4=03qW2`BkNUUs!p81Oi(E^abhro`LMD)|zoQj9?^Cb~NGyhtWJPF&_=W`vQX^ zzDio9w_j8uY#4b!VCv^&hN*$&Z{Px*w&gsaQxSRDSna8R;f=E9DZj@1#)!mB!${Fa z2pR(DJOiz%aAtPTJEl*B&r1V|4cIkYy-uczY1)*_zz~OUOxC+4Ok0cIa3@CjpZKuA@_Ix&*yWkVqBScc%e+iW~#m(Vl|a`V9xP`#?(bRf&3KJjnb z4fHRb!^t@eT;f;oJ;GouWOw@_2y82L@%q^(AJCANHgvhrmI;f8+ZbK`6Ah|ci-g6b zIt!5?GQ{h_oOr;EEG0O@PC{AzK!gs!OR_DOE_qd?@CQNao}HgIWaCqXa3i*chOiVV z=d{VJ`-3S!<&zk>JRThhCx3cgaz8tSg|K|eJ0S=jb#(nUADI??w#!I^02=a?1@@65 z0|l?!)bWwAzj8_#T_SF9p;o2y6&;xUiGS`WnN#eoTqA;>PSG#XJfw$|B{yd|!_-j} z;usiJx(o=;!mLY3aupE=x$1UC>I1BM-5rZoxEaA@iv#9hqm4hDtV(t$uLU4EDub93 z8z4%x89NilEZhcaGyh1!XHTh$IuUPV8hvj832i!oZBwtioOY480(u!!!!mgIl)7({ zKh8MEH&OvcBY|%%f}JPiwzY7U2Y{bnNY%rGpH zMJe>)4reNjA#eN6EPDrvvOb?dg&Milq9G%JYZ-Xd*k(A?kWB-Qc7C^lp0}O)N+G_G zF7Eb?SQZ2V8^T(%US9eDu=R~1N;D9}FbyPiA~-gUAi0z(Yg9f15{!DUewl^QQJBm* zVWZSxg+YQ!0r#Br!~-*7h)rbSmK91{^bl85w>g9&BRk2)P(~@W;ZVu8oVUHm0K|b{ zTyQiHLxiVUpef;e(henCB3~zOXsJsKut30JjZBAZbDDYyc1VCLRaZ|}UCw@gO19$j z#t`KOS#1->;z)f$Mx$gb`e3$v4ipn$jAk-C z9@Yz0m1Ay*=NW1SL`B#S;7%(=bnY{~zvcQ;)A18r*yiUy! z&GNkIpha@rHa)gyw%Ac;hINGx-(=AvPh`HYCLk<_phZ&>pLg^sV3Lz2ez%ckEyosD zYO>C#TAy5MwvH*GitfN!o#{_J-QhuGQG>R+ttp<>?3Mq5rtIw-7JTh0>t?4aK0~w> zS*3J^j*{r;9lvY`rkOEhdcok({I;@{Du;~d5;C#mS20GPAo4htvuFO3joQIh1t|IT z6B;r7pz#Zg7UTg}qd`7P$$(nPua?Ms*JyR-bbHd={u@43Y}Qp>{^-dTYQ%Mx0@)`9 zWhG*m8QS5`K$7hZo6cCW^j**rI z0qO1>I;5K+&*u4`^L}{OCoULvtTlV>JAOgK=rrHNkV0ET*exFjllJ!j@^7~^dr{bD z7JWea^R2k}iq^Lieeq;E!Qt~P_1*ZA{%Vb1EeS=lRfuV^_J8(gzWN*#$FuBn7L?9z zlRJbYIp|nLp#)lZ_Po$r`B5pal;kv+uk#(*_~Q^>kx1d2Cr;aZ^M&iGoC3vMQzBB8 zlzDtw>syC>@OOe5%SYs(*~4B2?lD5Wx9`(Wr@qc|%XWDcX_NF^D!(#R*@S$kGwXE5 z=>J7uYp6aqrjZ|HfKMEkyZ6(_{2fJ?l03@*&(60^tkLP8xt!=NA5RqFuSb*iZjl_F z>hv_`_}|qoJ<$CwWeG3E%B_8?@`fXAhSD{AFgHIXCwsZ-)3z@1qzhkD@gO2spO>Uf zEMvx9M>_`|l6@z)>;#u$ZuvZoT|-6LlV~S-Wrcbm=X1A+v3_*{OJ1*{@j1phCpS+y z!@%QWaqkw}oqJbp2GllZSAkkayq&q1Y7N!&%ll<1AT`3OP7JdlH04ZYOJ1}l20YyA z0Xpcd@92xj3=CoyAn0*`8afkv@T--DeQGZJHDq}$`I561S)aCiY%er|sEPG02Vl;a zc##Y9n)z0Fz7KwCvh3g7G-J&~NDP6IFPX@p(78^W6iX?RkL67{~azg2P4jrx5t8oIqO_CH^Gj!IrxbP<3dzoH2MtP%facEsoXJ*mOOk7=d#cm@g(45JuSWOnJb3 zufO@QqGgml|CY-i{t}cQ^WLr$SA?9!eNeM_>^YCko1abp_MFkC zZ_JpfS+J<$Sc37N54uY+O@La{HJu;Q2hD5G+2dqN@ z8{ECgBDDrPXTg@Urp$2Bol0(J z?SUsyQp^95!mb=D(Q|{F@8mN+wj2;7qDbd6#iCb6Wm1xrlGxMh@EEyhYQWB26a$x}tUDmR01Vo%_rivly@4by8bBR{ycfquP0A&r zkYKPj)|e*==sS{U`xy&H1aO~S-}Q3GPvyB8k!^ANsMKJPT1?QLcp{I0IK>TX&Dbmg zP*}X>R(D5F`VO$*_=JS!?N2&V0~{h4?^Iq?1S-qPl9A4Ihj}8&7QZZ@1*`n{`8N{l zYuAXaQIxJYWGwrL^CxT91PH*b)!`M9#Yz&WsNl=eoe+?LK&lI&&@|P+SR@%O0)*lY zf_Rg|sma2I3X=uQE>LiNH|&VVW4~T1kzEBJm+x{RGITF~u&hUUjNK!~D%Ug1`83E2iPeQt(g)!GWRT=03rd!T zsKO2!D3CrX+T>?oZVd=zC)cHof(Rm+#6Z&Kp)~rg1PTBW7qfl>kmNy0>dQrnUR*_> zL&CC(*`>t+kg74pJgMGT$>q~7W*iiUMTU{13(F-8cZ>mW(=+{^W`g( zVK64a{`6D~O)ZVKa$6}>NO^ykOq-Q+K5$k*K!uoT;+H$)@-6TuX`_M~cPe8DVG8c!hLqvS%VB-V`Ylcwkef!Ifb2$5+Sa>%6e0|~p%dFT8<+&Caf^(j}) ziQN4VWG?6KDSnbzdU^?#KuJW&Ow+xR7+fH~ppdIMO3t4A8N;B2_wEBGE~+1>oKv|S ziGXh!;48pR131twre@HRtfbDrlI*5#$f3E#rB0~vvzPnpwLiueHLwAY2{mQqi>s@v z%TEn1wI#~oZ~pj2ru1cORr!pe=>NAi?zP< z>G?pAsBrCj)#95H0+0EW7r~$y8O(y-St|G8qqwi<;2pLVF?Q%HkY4-Q(skNAR)?~Q z{-yT+7qvScEfh zPnRz-elWc<(%trGIX(RXQhec<@$;uH0vyBbtK*;!R+jQ~yVg@R{Q~wY^dOpZa@oZn zJaNQQ6TFfo?#sUj5R`a}W9gOXBs|k>tirr$(IOG7$xeqY+IgC35&p0s7DwTs#|Pj4 zy(=|Hz+;%?l?7%?yXNK%Wht$Qr3}Azu!XUuFmb=jHq)%$b&VPizc42yg}bh65h%p(8SUO+0WOz zBt7s;|Dr%enT;ZdNWbmA2rp#lt;tT74oxV``@<61?@lLc9~h}#G>sYtfW?97QG9}a z!_&!mMowiGrPT7KKOD*y*Ab>bt7%Oi6fbPx+*kx6T3%)71UVlHOi|bE8t628`-X%dv8$(jConq%p!vvc7HS7Z0f|=+XdTv6?+WHI>w5}u7 zTH!#;0{!J=`+Ra)OXFVo)=jx+N0YH~SU z6;o$Ks))gL)?sLB;)WgY>IT>t*8o}J@{(hcUhcgO=~kKJ$f(P1v(o3Lo$*r3Vrg1B z7HxG3k(kMu6_%)+l5iyGd8`Uuiv-%rckac7BTy=?}-17BLmXn8oaMN-FS!?vE3m#>pKluhz zAHxMtU{>dZBqW1a$`=LhG5)+DY(IK$>6eAKpD^0lPvrSzYv zA|l4W_B|0tjL!O?Yk}rj-1*n{`I4~HBlBknygtjzalxG8n(`6h@u?|7pkKB#+y3Y_ z9KYG`#r;lq;c_r=^gF(L7Smw$WI5o)b6kd^kU_)D0}5g;a*nlil>J9KiQR#v7+w=S*AznH>Hjj%w(`aKTWt${G@`$no(b}en-Vy&(~S*N zMi+;u|CZg88N}Z%LkWCV6DKW(DpCMZ=xA2Iktb7F!`tAopn*$}p{He#CvyzWBtq32 zK||g7(zF>f%7Wv17za^>{!i%0vh)yrzqM33M~6Gm{#!7=^a0Pac9(<}s=qkPz%In4 zt*ut66yu?~zE&RMm2?uquK8zx$|I3lCF-iLQ;``{kq2$xQfiZe2AOf} z1m1mlr~AVuwRIJ+EOozvLva7O&$E0f&9MQK-aY@DK`cquE}Ip3s&q0TBkGIiA)J9x zJ7Ll${mc|;((hWcWxCs5(tkl4y#1*fy0q0bT^{g3Yq9*Vl1_)C*?Z9WG;7#@bEUY^ zRq{u#ZDJ3IS+&Cgs}}BX^sSXX_{|`CHT}7{5i~~Q1(+#2|FOTW2i))av29ZaH}b@R z25a9I^D{w3MA1Xo1_T1s1*puvyQbwY>h4FN+ODV+*2qL5pA$X{P}GW=4_Y<0RkEZ5 zCuuSCclbP)aeGT-8hwkc#7sp(PHv~0s#YYZrlP9K35)xf^lC__Y=*n-1mHwfSgyS6 zla0uDPathQZKDklY!u`%9#Y~iRP0Uoa&&up3k321V~YT3JMbh=#+oaE$8Ns?;dOpl zPDlvc7KP$Y=sy*V=?O%=2MM5Mi%hl>(o}>zFZNo9_&>svKS0ExlyIN2S70JJpOja;$T{0(>*=L(QX;oxyd z91Znw=`NCZcLEka@v6}p;2LgIZ56=wxx@%+hsO!|m>(JQh4F*o=w=N1Lm93i(=PeT z+jB_!5)b2U&0$5xoHrpPe9(1?Cifi|w)Fvb7v-QL{+t9%Cc5zlhcHSTr3 zH|_EXdA>jnq;rm3tyt=to@26hx9z^bHGxrDrI$>%*I7qm=Hl>wL#tm-MVvBA(}f;p z8$^DV7K}40==-B5(fvgs0dSi%enKtl&Ug@{ ztzR=b2nlCIk|x4LpSl(E1pa_UPbWm)XQYOzQZ~3BKRxEmTCU@-CtPQFp3e0@vroeVcHtYa1@K^CJ#*&}6eBJOH@)eKqrSbAdxBAVt$9KMC~t2hQ75Kf(D@^b@A0z705fNV%_S?K zMAlPRJe1-Vl2`88Z87{eDkINJ-SCU}y+*O9rFvOd-2a0Pf-^fx@R?mlt9!J&P>WJAeI zm8$8}VUa}BrzbXxVhZ>XbA%eW3SJ@r`ga?F0BZ4Fhqq3XlcMh=MckFXivAQbzZ9G?|SGv+QWl--E4*JdmieLHgl>|zC7f+ zUgmLp`9z>|xE-_Bg`*7pwO0!DJC8en+keg{&D++xSC~B%$9ufn@HlMw^!c37PQXRy zaOq*wdN^>{tAE=E{m)JV^x=Xq4Tn6 zqfSCHy@%1$2k8Zo`+qLiFpu+Fa}SZD74HMAfV2L!Rs#=vvQ4ONGh}ki*EMfK?c(=+*Y!Bd-4$Ch6VFl5-rgmk8AJStJ=5W%g>$YY zQ^rY66HN4+WDO}UYPEA(+{~#MNbrC5x;eEf!|2^wBhK_D6!(l0l>KNce%6d6;xyMX zOIB&v25;gzB)NTae-!~;cI(1Yd*BRZS`n@`>mByL+gS5FNu_M?vpGjy@!aeEHzqKI zKUuIfzLS{aBziHlpNwgAT|haDg_TJPUt8hA@pTeJ)NMH3$63BR^cFvt0^M{^Kb`co z!W#Dzh`KJ7MtYr7Z;bNcOg_t0ScgpTI-+v5%}$28QiVTjuR#OI0p^dju;F}x9ai=W* zRdW9Zx9jAvw#!N2N>)BEU#6iBGW%Wb&SZFprM-yQ!Vi0L+y%TY$XZuR_v?>;r-qDY zE#JkY6{#M;WxS`;Ua&zAR<3W9K%np^-(xYZd-10nu7}l;7#o$<65=+tPrvkJ7hir=;pOe$c{4Si@ODRfYL4)nfcPPWcjiIe;P5S~kZNBToILl|# zPU1Z07U_4h4txXCd#;gVKkP46uRK2M@lJL7OxHCrfZd#0S*459Vq#)0udZfLgN-gH zbz|A6=UI&#y^s3>!S^=%4#}z<;y^8x*gq6!xoTtM#Q73cm8$JHGfn^%%5Qvob@{bF zcQ$MBR_l`a?#O#H;mPaRt`c@|!3=cn@=UDk)bocRHJKDPl_=m*6{H{9Goe7*M78)VFeJ-f6Fp2K1oQn7E z*vTd*??)e3A9K!&jAQCkRxu3Sj%y^~KJlw(5&lh(-CpSZW(dyHgGAc}(oxXRhx?0; zQ}2Yl;>&+#B3IvJsoOUS{98QCs;?^~T0iyrhD9GcE#GA1h<=y3K5q5eoB{hhW$r*B zSLaR=)yJo>kK*^&uoe%N=Bk%aq0c5T;&_?Idt#?-$CdkytmX5(MgKfwq5W6gy;pw2 zkdWVJnaPhI=D*vYvvrBI-Fk#w9gFi`0P{Z3H8Ltc`^#hbX%t6AVd~nj#Qx@p>xxRe zjj#D(fU)6zqg@$#esyx~*wzW3Zw+&Vl^ZJ!?d;ck{TOuFCo$kTd7*Ew1pQ^1aNst5 zY(lhM#yP76FOAB)rVmak;Z;AVXO7!)W>hosz1!wXOwRIJ@4lG$d~=$-Li*cwP=)*q zS7(}zO5)_BI@O%#=<@974^@fJ4=Yd~O9#fAHO*e~1Hc8yPw?LIapUaBZsN^BP)COKvrD&Cjh93DmGjqWS(Lsutm5pwTh6X)3Nz5a zvwf(toaUCm21bXZpF>mfV4JHX>?!{iel_?6XFI+bQTH-THso=YqZ-J|QTohkd>rqmg{vXn+kCoLUWkm}0>ZQM)g6KCJ-5Z~wX;Q{Sw& z%1{S?zDb#lpC$HLTe)+}8KIbO_lBM>hxr*aD&LRDWR*wqpMRajG~zwC-Ix*KhX(3| zWjP6YX{sO^J7Q%NdY9PdeyHAFUQPczaNXLE zhIDkJ!hw=ee{}8MPm>H))kJ4Q1i`0NN*Q8_yFb7a;QN4@HH37($2`)v7Z@W_`H0qW zTq@n&U<_A5gLjUaW6Xd+Q_NvAIQRd$?V!P*EmZ8fZtCLj329h61N|4$^zMt$3jZ)* z%vH=*Nx)Cf4H{Y@`_ozNp=M#?ekgA9W5k?k`&BJ(eQxf&!6bh0I*F_irtAs8Ml%Ec z(2r~Kz4afRppI26_3d~bYN�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 &^5wbbp^VN{v9 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 diff --git a/docs/files/companies/atroo.png b/docs/files/companies/atroo.png deleted file mode 100644 index a5bf861fbf62788970f678425f174e29d7d51ae5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1826 zcmV+-2i^FIP)Pg$up2Br8;V!b05yS)o}kpsX;ckf>0Z?}c)Y~8{ zG_?YY3YAwOSz)+GBr4QRkQJ)U637aJv%`F&!dVVYMP$Xxh@k zMj1tgDr^&p3RPoXw9u&VSCB2#n`IUis%RTYR=8f4E!3(lD^zBq%%VbNIw&fPOygBq zp;G%ZC?SmTJ|x^WRfR2Vg0WfBm^==~x~3bh|}@`U7G81vzmNFXUx*I#2%p;p(Pmo4JU#e@@Enc}jafyitPZ>M9|6<4qy} zpwmVr#rp*o>&ef$CrtONZKam@Bz5+#5K{>CXRxXgV-5;Ajj#!GDluMqq1l7nZ-Ry9 zb{XiO)s{9Qg;B8o0s}zq!mck-Sg&@92N&@8>$?JlQT3|=65N5OUb+=JFT8%fz;G7= z9DlK=LK8YGjKbRWLr*bq?8TmOSh%)!{al{le#TzzhRR*x<~cs(Ljr!K=dQ4N5t#@M zLklh6Nude7OV9@%U%Kk1Fu0Uw=*PrT%SEBroCSi1LB@#-q5Z-^&%DR}eogy!3+w)k zc_26ne!LgjEi{Awx8TWVcI_6Li!ew?IC&-v?G+lojSPc8p7>zRV&Q%PVKB(2de#b~ zMwwv<1pNP&r9#~}H~dKn1CB2l6S69fXD>SimfCVgXw7NRVL z-W5m)PxP`B)@LCh$WMjo3%zB6r0~?LpR!Qb_5mR&2#?-OTbOnq#A2APFlr;D0jIm^ z3OCCH={OUmDAZ9K(sJTvioz(v%$l)<lUI`zRx1SAz{%CVh3<9*;lFlA zFSN4nX{t7Q;m(W&AwJt0xzNhqHO_TME!-%94QOF49Hr3sZLk8L+8tPEeb50;e&CO^ zhD`)Jj6F3{q4yD4n|0UK;n2dmS0u2+%u;=Lq4^2H7JRHVd=0A=23z1%EgV|7GXwVE zg`tIJ3vBX8t6!nJ-3~mqGOX|uv?)ZI^9L6OUjTtka@}xXq3vORNUH-2O%uT`{N%tj zH1B|A_{6S%bYZ4xtBMYM~ zb|HMEbyT6FU8++(zki|rAy43d$yaLq3-wO~PWVTwe_`+jxFOf=U${BzsE}5|xKLu| z9?gY)3!P0B#AB^~h1IenA=2?~)ThwhWJsdLTA#u;fh+LYK5J;+bts&^dZ^I(G&(%q zeYmhb3l3R)uuy-u4dgI!?!iKBz9w?#qhqZH*DxqM6&~+CShzj|1P)m-aiPR4=&`xA z!-dB2v}^oZ>u{l|fK%{9_fVnxIrmfX8j8$hM_4>m=zQut;@tg(+WB04#FMSadlT+J zPlSWu>noowm#A~@$lbfW-wnYgvlVQ>xR-hQ6o4vde#m3&^>AKM6LpX%+8 QmH+?%07*qoM6N<$f>{h%4*&oF diff --git a/docs/files/companies/moreapp.png b/docs/files/companies/moreapp.png deleted file mode 100644 index cc38225d3c849d2b80c022e1758358799bda03b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1033 zcmeAS@N?(olHy`uVBq!ia0vp^Q9vxt!3-q#Y*^6*q&N#aB8wRqxP?HN@zUM8KS04( z0X`wFK>Gjx|Lfkp1CkKX`Q!nm3ruU}U^aYFU@@$e^4 zVxB)wdi4s3;$FN+c=ZC?+Y@;svEqyqEeCS{ZgGryl=uDr|78c} z{r~^u|L5OlJKx9e-F7$N4zHu=#?@8oAz4e3cX!#(S9Il;S@|fxl7WFK+tbA{q~g}r zOD}^SIf%49)R#UY@U2DG(V^q2-cfOb3#kYK(o`=A8 zx!H@w_ANcwYq=xxv2>R2y0Zrh8s0?T=joi+Gof;Eq7VP?6E+LwFJEUf(la+ZVprdD zz0ERD`SL8`zP>Zl62C1^u2EqUxb(WUe)&uB_s9LCPi{z#{1~73P51R*RvnSlvQOS` zHZ0v+)GAxU5O*;(^&Gosn3dACJzCnLZ?qkBFNd)xOtP82lS}-)&gox?1(jK6)!dxK zrH_7!o6a02I#D|-Na6jCx%oGihaV_YdB3QTZ$egC!G%&iuim?w1)1J!ub+#%$Juc9 zc8=L@;p3NY=G+n#{&l8dvhbr7xeKp|D5&qAv##m6wU)@)bBrAv2X^{xsbg^oSDV#V z#+y6wjr_A*o$Y5^rZqlLQn;k#A^PD;Y)1{}o^ZCKmfZUoDykLtb!Y4{lN0%-cz4y~ ze`0sks;)Y|UN`f?JNDWnONQ23uj%?-VJ$_Ro?M;l1Yk#TR{E9fWoXgiU%|`iP}jcw>Zb0qdvCt&IQBSe=TD!< zPh@hAZPV=Cr01O@-zaXeDP-+Sm)BAE_8C-#mq@)6IV0X3e>WyLr`s)mqsPm|TrTrE z3^*89ut)A$ci&uGxcy&!l<&)Hb57h(``)6E*_c79JP`)^~qIrTr&8~b?2KQ~1W0~0iZr>mdKI;Vst037ly2mk;8 diff --git a/docs/files/companies/myagro.svg b/docs/files/companies/myagro.svg deleted file mode 100644 index 0480210668a..00000000000 --- a/docs/files/companies/myagro.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/companies/nutrien.svg b/docs/files/companies/nutrien.svg deleted file mode 100644 index e9596235441..00000000000 --- a/docs/files/companies/nutrien.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/companies/readwise.svg b/docs/files/companies/readwise.svg deleted file mode 100644 index 792b1158429..00000000000 --- a/docs/files/companies/readwise.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/companies/safeex.svg b/docs/files/companies/safeex.svg deleted file mode 100644 index 8840c106fa1..00000000000 --- a/docs/files/companies/safeex.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/companies/webware.svg b/docs/files/companies/webware.svg deleted file mode 100644 index 686769c5a92..00000000000 --- a/docs/files/companies/webware.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/companies/woopos.svg b/docs/files/companies/woopos.svg deleted file mode 100644 index 291a7b56d9f..00000000000 --- a/docs/files/companies/woopos.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/crdt-conflict-free-replicated-data-type.svg b/docs/files/crdt-conflict-free-replicated-data-type.svg deleted file mode 100644 index 1920ac701ac..00000000000 --- a/docs/files/crdt-conflict-free-replicated-data-type.svg +++ /dev/null @@ -1,132 +0,0 @@ - - -]> - - Hasse diagram - - - - - xyz - - {x,y,z} - - - - yz - - {y,z} - - - - xyz->yz - - - - - - xz - - {x,z} - - - - xyz->xz - - - - - - xy - - {x,y} - - - - xyz->xy - - - - - - y - - {y} - - - - yz->y - - - - - - z - - {z} - - - - yz->z - - - - - - x - - {x} - - - - xz->x - - - - - - xz->z - - - - - - xy->x - - - - - - xy->y - - - - - - phi - - Ø - - - - x->phi - - - - - - y->phi - - - - - - z->phi - - - - - diff --git a/docs/files/database-replication.png b/docs/files/database-replication.png deleted file mode 100644 index 0a90de045bf5d6b88e2e302288d89f9378f0fd99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10362 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 diff --git a/docs/files/document-replication-conflict.svg b/docs/files/document-replication-conflict.svg deleted file mode 100644 index b2b7f0c4767..00000000000 --- a/docs/files/document-replication-conflict.svg +++ /dev/null @@ -1,62 +0,0 @@ - - -]> - - Hasse diagram - - - - - ? - - {?} - - - - z - - {z} - - - - x - - {x} - - - - xz->x - - - - - - xz->z - - - - - - - phi - - Ø - - - - x->phi - - - - - - - z->phi - - - - - diff --git a/docs/files/gitter.svg b/docs/files/gitter.svg deleted file mode 100644 index ce348ec91e9..00000000000 --- a/docs/files/gitter.svg +++ /dev/null @@ -1 +0,0 @@ -chatchaton gitteron gitter diff --git a/docs/files/icons/angular.svg b/docs/files/icons/angular.svg deleted file mode 100644 index 4687f1f43dc..00000000000 --- a/docs/files/icons/angular.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/appwrite-small.svg b/docs/files/icons/appwrite-small.svg deleted file mode 100644 index 703d3704bb5..00000000000 --- a/docs/files/icons/appwrite-small.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/appwrite.svg b/docs/files/icons/appwrite.svg deleted file mode 100644 index 56f531b9118..00000000000 --- a/docs/files/icons/appwrite.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/arrows/double-arrow.svg b/docs/files/icons/arrows/double-arrow.svg deleted file mode 100644 index b2b5baa8914..00000000000 --- a/docs/files/icons/arrows/double-arrow.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - diff --git a/docs/files/icons/arrows/left-arrow.svg b/docs/files/icons/arrows/left-arrow.svg deleted file mode 100644 index a43dc54b043..00000000000 --- a/docs/files/icons/arrows/left-arrow.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - diff --git a/docs/files/icons/arrows/right-arrow.svg b/docs/files/icons/arrows/right-arrow.svg deleted file mode 100644 index b55dda57343..00000000000 --- a/docs/files/icons/arrows/right-arrow.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - diff --git a/docs/files/icons/browser.svg b/docs/files/icons/browser.svg deleted file mode 100644 index e89f250a46f..00000000000 --- a/docs/files/icons/browser.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/capacitor.svg b/docs/files/icons/capacitor.svg deleted file mode 100644 index 739a3d9cd3b..00000000000 --- a/docs/files/icons/capacitor.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/commit.svg b/docs/files/icons/commit.svg deleted file mode 100644 index 4f99d40ed03..00000000000 --- a/docs/files/icons/commit.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/cordova.svg b/docs/files/icons/cordova.svg deleted file mode 100644 index 268ec72ed04..00000000000 --- a/docs/files/icons/cordova.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/couchdb-text.svg b/docs/files/icons/couchdb-text.svg deleted file mode 100644 index 2c6819e404c..00000000000 --- a/docs/files/icons/couchdb-text.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/couchdb.svg b/docs/files/icons/couchdb.svg deleted file mode 100644 index e9e263c3b8e..00000000000 --- a/docs/files/icons/couchdb.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/deno.svg b/docs/files/icons/deno.svg deleted file mode 100644 index aa8437147e8..00000000000 --- a/docs/files/icons/deno.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/desktop.svg b/docs/files/icons/desktop.svg deleted file mode 100644 index 41c05a0b3a9..00000000000 --- a/docs/files/icons/desktop.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/discord.svg b/docs/files/icons/discord.svg deleted file mode 100644 index 3687d64ef86..00000000000 --- a/docs/files/icons/discord.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/download.svg b/docs/files/icons/download.svg deleted file mode 100644 index 6acfb9ce6aa..00000000000 --- a/docs/files/icons/download.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/electron.svg b/docs/files/icons/electron.svg deleted file mode 100644 index 6545b4856a4..00000000000 --- a/docs/files/icons/electron.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/expo.svg b/docs/files/icons/expo.svg deleted file mode 100644 index 8abdca3e540..00000000000 --- a/docs/files/icons/expo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/expo_text.svg b/docs/files/icons/expo_text.svg deleted file mode 100644 index e6ab93df4d3..00000000000 --- a/docs/files/icons/expo_text.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/expo_white.svg b/docs/files/icons/expo_white.svg deleted file mode 100644 index 582d9335344..00000000000 --- a/docs/files/icons/expo_white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/firebase.svg b/docs/files/icons/firebase.svg deleted file mode 100644 index 2f0a9392fce..00000000000 --- a/docs/files/icons/firebase.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/flutter.svg b/docs/files/icons/flutter.svg deleted file mode 100644 index f68ab36095d..00000000000 --- a/docs/files/icons/flutter.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/gear.svg b/docs/files/icons/gear.svg deleted file mode 100644 index abd74db51f7..00000000000 --- a/docs/files/icons/gear.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/github-star-with-logo.svg b/docs/files/icons/github-star-with-logo.svg deleted file mode 100644 index be82d07775a..00000000000 --- a/docs/files/icons/github-star-with-logo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/github-star.svg b/docs/files/icons/github-star.svg deleted file mode 100644 index f0976afc35a..00000000000 --- a/docs/files/icons/github-star.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/graphql-text.svg b/docs/files/icons/graphql-text.svg deleted file mode 100644 index 526d2f63ad0..00000000000 --- a/docs/files/icons/graphql-text.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/docs/files/icons/graphql.svg b/docs/files/icons/graphql.svg deleted file mode 100644 index 12d116d267d..00000000000 --- a/docs/files/icons/graphql.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/http.svg b/docs/files/icons/http.svg deleted file mode 100644 index 904d6a83295..00000000000 --- a/docs/files/icons/http.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/ionic.svg b/docs/files/icons/ionic.svg deleted file mode 100644 index a211304d9b0..00000000000 --- a/docs/files/icons/ionic.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/jquery.svg b/docs/files/icons/jquery.svg deleted file mode 100644 index 9b4bd85983a..00000000000 --- a/docs/files/icons/jquery.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/mobile.svg b/docs/files/icons/mobile.svg deleted file mode 100644 index b3ccc37d8ff..00000000000 --- a/docs/files/icons/mobile.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/mongodb-icon.svg b/docs/files/icons/mongodb-icon.svg deleted file mode 100644 index 06a5a7ef348..00000000000 --- a/docs/files/icons/mongodb-icon.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/mongodb.svg b/docs/files/icons/mongodb.svg deleted file mode 100644 index f3ae5d76451..00000000000 --- a/docs/files/icons/mongodb.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/nativescript.svg b/docs/files/icons/nativescript.svg deleted file mode 100644 index 60a6486f691..00000000000 --- a/docs/files/icons/nativescript.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/nats.svg b/docs/files/icons/nats.svg deleted file mode 100644 index f579438c891..00000000000 --- a/docs/files/icons/nats.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/nextjs.svg b/docs/files/icons/nextjs.svg deleted file mode 100644 index 26d22f3d5e9..00000000000 --- a/docs/files/icons/nextjs.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/nodejs.svg b/docs/files/icons/nodejs.svg deleted file mode 100644 index b303208a30c..00000000000 --- a/docs/files/icons/nodejs.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/person.svg b/docs/files/icons/person.svg deleted file mode 100644 index 6ba69c5e6cf..00000000000 --- a/docs/files/icons/person.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/pouchdb.svg b/docs/files/icons/pouchdb.svg deleted file mode 100644 index d3d3ad0febf..00000000000 --- a/docs/files/icons/pouchdb.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/react.svg b/docs/files/icons/react.svg deleted file mode 100644 index 237fe6b5607..00000000000 --- a/docs/files/icons/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/rxjs.svg b/docs/files/icons/rxjs.svg deleted file mode 100644 index 9cf4029c93b..00000000000 --- a/docs/files/icons/rxjs.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/server.svg b/docs/files/icons/server.svg deleted file mode 100644 index 1d9f9daaf01..00000000000 --- a/docs/files/icons/server.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/sqlite.svg b/docs/files/icons/sqlite.svg deleted file mode 100644 index 4b3c9e48d34..00000000000 --- a/docs/files/icons/sqlite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/supabase.svg b/docs/files/icons/supabase.svg deleted file mode 100644 index b859bbfa771..00000000000 --- a/docs/files/icons/supabase.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/svelte.svg b/docs/files/icons/svelte.svg deleted file mode 100644 index 910161cba7c..00000000000 --- a/docs/files/icons/svelte.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/transformers.js.svg b/docs/files/icons/transformers.js.svg deleted file mode 100644 index a0a2420a372..00000000000 --- a/docs/files/icons/transformers.js.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/twitter-blue.svg b/docs/files/icons/twitter-blue.svg deleted file mode 100644 index 6ccaa3c59b9..00000000000 --- a/docs/files/icons/twitter-blue.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/twitter.svg b/docs/files/icons/twitter.svg deleted file mode 100644 index dd2cc2f2eb2..00000000000 --- a/docs/files/icons/twitter.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/typescript.svg b/docs/files/icons/typescript.svg deleted file mode 100644 index a550f35f8be..00000000000 --- a/docs/files/icons/typescript.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/vuejs.svg b/docs/files/icons/vuejs.svg deleted file mode 100644 index c4cdb86b654..00000000000 --- a/docs/files/icons/vuejs.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/files/icons/webrtc.svg b/docs/files/icons/webrtc.svg deleted file mode 100644 index cc88c17cc27..00000000000 --- a/docs/files/icons/webrtc.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/icons/wifi/wifi.svg b/docs/files/icons/wifi/wifi.svg deleted file mode 100644 index 55cf0b347a7..00000000000 --- a/docs/files/icons/wifi/wifi.svg +++ /dev/null @@ -1,33 +0,0 @@ - - - - -Created by potrace 1.15, written by Peter Selinger 2001-2017 - - - - - - - - diff --git a/docs/files/icons/wifi/wifi_171923.svg b/docs/files/icons/wifi/wifi_171923.svg deleted file mode 100644 index 6a8bb28a7e0..00000000000 --- a/docs/files/icons/wifi/wifi_171923.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - -Created by potrace 1.15, written by Peter Selinger 2001-2017 - - - - - - - - diff --git a/docs/files/icons/wifi/wifi_1a202c.svg b/docs/files/icons/wifi/wifi_1a202c.svg deleted file mode 100644 index 0f28528c0a6..00000000000 --- a/docs/files/icons/wifi/wifi_1a202c.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - -Created by potrace 1.15, written by Peter Selinger 2001-2017 - - - - - - - - diff --git a/docs/files/icons/wifi/wifi_e6008d.svg b/docs/files/icons/wifi/wifi_e6008d.svg deleted file mode 100644 index 0ad28185db7..00000000000 --- a/docs/files/icons/wifi/wifi_e6008d.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - -Created by potrace 1.15, written by Peter Selinger 2001-2017 - - - - - - - - diff --git a/docs/files/icons/with-gradient/checklist.svg b/docs/files/icons/with-gradient/checklist.svg deleted file mode 100644 index f80c7afae04..00000000000 --- a/docs/files/icons/with-gradient/checklist.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - diff --git a/docs/files/icons/with-gradient/contribute.svg b/docs/files/icons/with-gradient/contribute.svg deleted file mode 100644 index 1a23f43cc83..00000000000 --- a/docs/files/icons/with-gradient/contribute.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - diff --git a/docs/files/icons/with-gradient/multiplayer.svg b/docs/files/icons/with-gradient/multiplayer.svg deleted file mode 100644 index a2e0d826f39..00000000000 --- a/docs/files/icons/with-gradient/multiplayer.svg +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/files/icons/with-gradient/people.svg b/docs/files/icons/with-gradient/people.svg deleted file mode 100644 index 14535c49e1d..00000000000 --- a/docs/files/icons/with-gradient/people.svg +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - diff --git a/docs/files/icons/with-gradient/replication.svg b/docs/files/icons/with-gradient/replication.svg deleted file mode 100644 index 8c5d36188d7..00000000000 --- a/docs/files/icons/with-gradient/replication.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - diff --git a/docs/files/icons/with-gradient/rocket.svg b/docs/files/icons/with-gradient/rocket.svg deleted file mode 100644 index 38e702a7626..00000000000 --- a/docs/files/icons/with-gradient/rocket.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/docs/files/icons/with-gradient/storage-layer.svg b/docs/files/icons/with-gradient/storage-layer.svg deleted file mode 100644 index d413127d0ef..00000000000 --- a/docs/files/icons/with-gradient/storage-layer.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - diff --git a/docs/files/icons/with-gradient/text/made-easy.svg b/docs/files/icons/with-gradient/text/made-easy.svg deleted file mode 100644 index ba45d6e4299..00000000000 --- a/docs/files/icons/with-gradient/text/made-easy.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - diff --git a/docs/files/imprint-email.png b/docs/files/imprint-email.png deleted file mode 100644 index da4c361b74a65ccf0ce8ceed706b12e466b48e0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1864 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

    yN<60lF^i0;7Sw^> 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 diff --git a/docs/files/indexeddb-custom-index.png b/docs/files/indexeddb-custom-index.png deleted file mode 100644 index a10085a06cf20b47f66fc46b821f8fc97a931ec1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23808 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 Q>I?uKn4xB=`u&K10kNUgP5=M^ diff --git a/docs/files/latency-london-san-franzisco.png b/docs/files/latency-london-san-franzisco.png deleted file mode 100644 index 69516aeb84b192ca4ea2d5e1d5547b4a4db5cfff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16815 zcmb8Xbzha=6Ysr2knY+vA|N2$AT8b9-6bt0jew+dhk$@|Nq0-PbV+x2o%Q|Q_jv&4 z`a{_-*zD_CYt77OX5K@Xl7b`}G7&Na0zs3O5>tUdVEnb!1CMOp{h0QFzDU^M~ie|?*AEkTEB zbB_t@_x_D5FCRfew$ubEDwQI&q!6V)etsUKa9!?Vo9jl}Tu{{eC*StflZ(55XCBWR zNP#gj`EVje(7tMhKnl?uC8p%}xX49n^q7dqk9uhZ>+fE}1~~FW8fzIEW-AnaxWGst z4$lqj{2@jeD@A2~kC+9!4*zZETX%PNZ*Q*{rE)QjXathDa+3M?hcsneyzl+eal^jS z6|?UXWt54aAxOcZ0m8z{xZ=uG(rl;j~LQ%RMPj} zZQb1;LyR%uSc#%Oefk6^LV*~#!4rN?7ADgT*3k%R;o#t4ZM{e7N2sH#8yXT)+!~I8 z&>q_U?WanS7^O&@83R5F94vb1+d?#F`Zc%VlN)wa)i`mDl%SxX>ua}0J%giQJq8by zUH*8Pe6Sb{_z}G(doR*7@zlKSdQ7uc96Dthc@y7y|7kH?pY@Z^7C|~mwG9o)MKEU! zhTsG1{YT%Wr>E=c>gHn;q2r3H(4X?}tvfCgPTSPppKlGdT&kfM_>U5!hniYg z6ztZ&MWl=$NU(Ms5af^#6@3Ht#Q4;Zq~D3eormP$;9$b)HvO|pS5XmN#q5`D_`k>&HJ%dBbqbo z^+r25sNI)d0yn2?Yetrq{W}*S6;_&58WP?mh^n! z*R0dF;eYL);*Y~q;v$ohkbLbnu9>%Efyx{_^YHMbq^1@nSHyQ3K}ku=uIW91Inj~2 zHT$@^)%CS2!-@Q^uh(V3Z#yr+2WD58(4bfTPB9C&s_;FISF1seQpdSkl~(D5)wB&K z`CT!o2Mj%KTEVh?y)ebN6$fm9zcDnefL$fP69VyV_p`AH&;4b?3`d(dn9l8Ro}|DC zR%4)&!M0{zLsQe(87(}QHoQQE4&pDGv%9xvZD&_{O$5`;QtOi6s8?Q8RAf^DtJmyS z2EJM-SsOqghyMVRR$ysifsTREXbBBj?-IyS+CAIo7Z4E8*Vmt6J5(*2K0IU)S2i^@ zWhwnQ^?PjR!h=6Rm;yU2hKddoF)cm4xw-khs`dQ%_z#sL*Z^U8!2=#lI66aF_AHf7 zUE#ZL{TtuO1dxM8-;vEvPrKfoZ#^=~ybAE2+7na$T~bn__CB)LKiRDeC zrV@I5%Kp~9jtB?q0V14z{TEA11Rb~~7;5eH?of=zVw8&6^mett zg1xAysHZ0%aEerlaFNCDR04qG`V5bF9P4S58Wx6R;2$kcpV)TVg~B0!04XLD^YtMP2OVo=0 z{?!QTbX>UDL}=PCfufs2X;S6Rd+}={g(=qHcj4e*MZWxZeYhD8Lco|*4QD^S^Y%1= zhXBKW%>Gk-czj&mzXALfm2}(nf^ENNG9&)b@i9}&pDpLc39HEd4TFmM(=Nm~s!WB# z#UtO1C~jnL*?=Fk#Z!A33YON2U+8JW|H1!CQZAX{d?U;-)Mrv9MTH$E23(H9gD5R- z@yvd4e>yaTH_zd!$18Y#Ub}gDRA6{xkp?lhq{Q~~XFTx<+u3p_`A^tkU;8)CJoxSF zn=x^UfLZ^@&yEWT386=hQKR1qHJIiBJ2nX`rmV)6Do2GqVa0(R*5PMbrS-;K3>wl3 z?jBFejBN6wQE#k}2n`gqpyay}?J&9C!Qr7?zKTsPUu!}GU=-C5mX>6|sI9M1GCMrxsOgIr`+-??< zemvx0Ihv9ua>Kld1aW_@q${shw`Niz6v|k{ee{exl}l^7@P(C?IxPnA>;U5wF-n++ zDpRP&R{{-MTzcGa(SIg{Ydqx|C7eX^E-o%v-E4e>qOC*OYc6|}`TP~(y(U#!sLLuJ zK78Q)o|=`_=KJL3b!H#_8$lp(?&}AjO|Qf25vmp-XZIFB3;)BQZlo%(tqgOxV^I@%fpBb@!x3ZHLT7ITg90xbI zVWaa_&&4Kx&Cphy6ctO~&dmcUx?~X(ajU^9@T?joi8AI#3F!&MX$8qiN!QocgEv?_ z(Fd-4L7gDbA=iglrL8P3q6CZ5h8NG+#1FuIa^X?crNtc`8?*F_XGJ~O-Suy*-mCLw zh2;0X%-D&~6aLH;s}{c6J;@Q9RLw?OX_U;YJDNSVrlqC5e*GHx(!G-5VLg<5yGn)ywb|#v4Qq5LI5;@YkX|%r+@uP; zF(akH@fk5#bZTm<|IS?oJv_IywUv~V^bW&R`|rjX0~1rh>NYq9dQ73^P7p|l@m)8A zN!6Skmn~RerDiA$rL?oNb2XymVIz#VaX8pKvLyE0sEj6Z%18ZhItj4c&K zd>sUKY0JeVO|BpyAi&iyr`IH4hF_uvSn#a))5j}FYclPXxTsmp)=Oqv>_jiIjE z16${XirGnD%&$aw2Q!B)Y6i@_?l1SiXN4F8B`Ej>*@K59D>ZfC?#V!3pOl!Gn1qCX z=ne!~Cs?ZZflIGeg~A}^;F{7L-=dDXp@S>n_b*pjqBoY8mkC2zQER|+w6^LKzTMD* z(b3l*al}``h5yL1WjG^_&^P)T0U>W`vYv<|5c+ADOi_)&?@DK{5C?uUt4Cr3h($iz;acXF56BHEmO&a4XgIrx+nyvaW z6XA*rc%JucoMl{t)s6CMB@>^RnVIP#?H({Y2bu#Md)`o`CcX01)Kuh~NdXOiGq(AW zbZ%}gu8tja`ufGp_R;i0D&TSA)Re0jKCrXL_ZLely#CT4M!Sq{3SDKJ{N0kPbO8jJ)Nh)<0~s|&CTih zj>#gnwg>Px4-g3Or|bJc6jGL!mhSHEeezxQ_1RoOk=IX6Bo)Y?v1x!T$e+0;5m=YS`k{40?@vJLF@Fiz6}F?}(i z&6%2ojm^1pCe#?3JOpk@{Z`lcIGO+-e_!7Rf=ltezoxQMsSTBu?3)(D@zK%9yjGqS zZFpK%7CIa(QB*-rj!4Dq&itTs{$x&0j%+d$(C7S%g$xJVsJF7PV8fN}LQfiE4E$U0r5ZhYtP}?y-#ysuOF8?f z3|Ppot8F$PtEdfEzKGGwP8PW$H4FaK=jJlo@xvwWtjWNQ+qpR{MMXvH83c_E(W?Ou zK}^Kqu`z;U6Ix!G{PX-|1DTWgX`3Dx$os{y$0^zLP50+6*5?t%srMxXni_s?^?YUe z^dGTO1xa}2bs~CI+Ux}r#ZsQo1h446c7ecGP(Y()gBvBGofN!`^dK0}y}d?}TK>~6EEaNbSyDi%{PJVCDwD`d=u0`l<6@@L=I+C(Bh&TY zo9q5is#Rar zju<6x;*DhC6gX5B<>h>t3aH({>w>hkvCnlcljQ%eF;IYdmfK6?Wr1P$_fs2<{ z`|_Ozw(+{5NQ%(wcV<{{tUNqcY^moBEXug*MQVEl!fdIiq1}Sn4wjaM2DnXDW^CGE z%OFNI^9p!H!`7_`umRwl)Gx|o_Gq@9C;rnoFBEcxh1`D#6MD#D#}%ly^?mf2vgQ7c z%+_|{M+W!ya=HD}$qCq3q5I&I2fw3#3=|Om5ov9VBG(bV{*Gn$j~_qM;_`j6jZmY% z+MUP)&V$@ivW6jj{jem@i*EhuVD@9qI8brV&%R{J<2JP*|I7$r=ipH52@MmY1exKC zjT1?Bb~dx~z-LjAE)Cc=E9z3GO#FC_!P(W?(>ewErOqk_ff&Hmz2*_^Ox19h@e?}w^vs90+HSiwl=>6A^t+%suwGn zYv&q)Up#I^Zu|V2&Do5$B}&_I{H}O;-On#V#VA2m-QxSi*UbVV4v>n4=ahviMH|PL zz}c^~egPiPqJ~g>LYSfwXktlfRnh;FaV1(@P(re`wI$@%0-BpGRVJ&@mMv8(4)t}= zPD5SW*LkK+#F~~w7DAQ=?dOr7*Lj3n7|#!;x(&{UCnxpw^?9^JVPe3cvrQfuQ%+9O z+^rx4e8?8JQz))@<+r04sl<8gjeqyf&xV*h?(z1aKq=vQD7#_xenrr7VyS__bLWI# z=r*3l>O6(G>ZG;o<=BuXiEH3lfyBNRx0)F`%grRa^0XD(UDb}0{b;>2cKlit%ff`| zI{O69?-9kX3Fh-C*b|nx;9M(EZ<3V-3FvWOpTrvlB%aUbJTM@eqzz|cU|?Woev7E$ zo+>itOCLx<8;*?#_c};~GS&!MFkv-1m%GlRgd3ci3APX9MLX3!rHBapEne#{?a!G{ z^#-bKpLLNSS_^V5SFKOkPv$5$5#jGp7I-8nV?o72IN{cgZxaa#W_)QE#THL;RXIoL zwx+og97t8BkE=~(`zI7hb=b1HNDU!EPY2x=K`|~$l52&NS2D{iRmMp$;X=inf6yW?>I02w z@8Gb*Ee;aC3(fLhGy7T$8eMJ)iJPeqcvzSswfik*zs9&c1yBbRAXBVGULPE^F3A87 z<&z$t_PD1^y+5h(Z=K{dyc8V{1Y)Nk699}OSrXQebZlw!%g4D8^+P0-UdnA}%LLU_ z!&SxSWds}6=ycbg?-;!OR36GSGr8|YA&}Rx&+{0WG_S5#K9tE2B16{7U-IQAkL7%J zbjQwD6WA`x76;w^_An%%`KYa|VACT|{HtMG`5oEK1%{otM+uKq29@$JOOH>RfGq-N zT31^;GCE2|P$-GH*?^=*0*Y+e`IqP9KV}@ z^)0LyZUg>%-KIQvavv=~^PG$~5 zAf7rI2Qxcnz$qfUeSN&?E`;(5l2jMH^8EdUdr_Fcn9E4x9VaV+?h1|Hbus}pZ4$Z& zCa6=9``#Ll9;M9N39^Rfm2+bzW}#(|@Dk??VMR%tEH`rlmtu6*N#0h(yATJ;`$~Vt zx5_M8VH$C3$yD<2rP)$1gDc&A?eFg+jx{A3Qpc~w7zPU*>;m&WxO zp@q9X_nWqxI)gVKfmM+&1v(*or5yHa!>RnB>VyB-XFh=O{Bti*tfyK;S&aeT5+$b7 zh^L(W1(e{zb3sU^jHP`^i6<(&hgA!ptIF>s?rM2sT)($TD?u6Sak(2iVb$WiH5hhf z`1j*}D@Nd|hdNS4_p`#kpwQIUv3g7xaIiE!un^1_J@b|~!$05hUco?whY;JS@Fotp z&YI*=A#;^v+Dr!;XYb#_q;AeprxI6L1f3oSo!+eY)}iPw$oP-l1jURKpiu{-W@dbM zvh=talV81y2y%Ei;evGB#%wP8nctr=dshhfZH_kZNDBx5n6R4s(9yk+2^_{o8y9+L zP{E#yl7PWeM0<2~zMoLZy_Lik3iEf6@SEekCV3=Q z1s7fRZzCTc4cocWTz^6fn}?lP71{-l6R{Z}!f)naI{qAmv3VSM-Zi&hz8ub?*pP&tI-y7Gr*Vb!ZW`oA1Ez{TD0yJy3)& zS{JGo2-{O_S4eob_Qt%1ly^vuFRsSF?JN!f!ctZGXmxE>`rs(Jsaw%R#Z#uP#8tnG z@WSBU(I$<R&1VG2S~Zf^r)~1*%hSL9&4q;sZ4o#W4O7~y z=u#a`-Rq8|gOKr)4{u_GvZWmB|*7<$G?-FIT zM~?wo(0);OT)VTiXA@V($!`g#ATi{JYPYPOdZp&SkD_FLkJ&5L*%RmOtZjdR3GsJL zW;APHKmRLBwrdd3|1$K_eDoyE`A*mg8}FdaadBec!rUN*I1Xiz%|89FY4oDr?PfSE zky1=&^y%2ip6Z{8J~MAA*tdp7YBFzuancmH*QO9aj3#3t5Je@#jf2xo!fe{kJu;V; zeiA=F6;qdWh(EDUPNV!Dc>4wwa;Am`fnXy8!G_)U`PUGZJ)D<+>0iFrF^@1wLPPef z5}$xHxFppMvCY^yRKmTw+*7repb%FEPM$*^wB7PmQey?kk%J$7+y9qrP#}gFAG6Ztrz+840wC&5G7hr=CiMVSX=X7RLr5}V_|{d_~lOQ4iC#chal|y zZ|@3zq!P!y^b4)b(9=2~4k-m>^hgDaFcP(2+I2AdumRZP zZC^~65LD4%AlMnt`wcfdl6YU)MF|K9K>JOnY}DnH(DOI+WmnnEC)w3Y6)w7X6PCUg z7Sa-skRqH|ZHeL1mX@oX1ivDTOpr5z*2R^#dxsUKz{p`0>}*Z9$e0);MtQc@`O2do z2v2a0@c0|2Y;Bo;@BfGiYNKV%P2rTksv#f~8PpQS&InN;x1uB2X+8_73^Q-!{yO3y z6Z#=n$+dwU)m?1%(?4j~$}UE~w3&%^qdlJA4lx4ZF_l!v2rPt!n+gW9*GG_$7#X=< zdz9x`3N6eb*t-aoQwaLiPx7+C{fP^M>>a$J--N0CA6ExF^gs%6?%i+kkyG*EJ*mA> zJ;Tmjd-9(SW0?%Y<*J?O7Jgv$VMi`17OF4=`d>m7?mxo8AVP-EDqv$gPd~iCSS18X zWL9=F>~m}oB^rGWm5V8bz|*`c&_GVAmui3(awq=Oiidf)FBx=r3Xmzp$~Dh^4WfCc z(fG*?Xj0ZM`uwXGNR-JOYFXL<3!rX9A;x9XTg9F9IsNuYx=dQKFFtSpFZk<^Rp?Fk z!8~!-^EJ2pUd|1%Ppscl_V9^M?w5x;_6IdWE)*%*F=+$~C|RbX);T&v_d&T8*PlUh zjN8DQ%fI)h;^PRpgCj=HL19cK_aB1)%K~Hz2!XoKp3n6pr@1{ROvV28Yq>lxH+6C^ z6}51@AO04Qa0osm37+;G9t%k_)$vk0NnZkv_vy`0VC1QDUkM>|=R0qa1%jWNb<&Wo zr9u~*#2k07cULFA`%gD7y$-Bl_aDyI$4p~?JbTm-1cL z-(m*gN^9-l#bhhIX(!l((f4ly2B>?N3K;zAjI*?~ns5*(``GiZG5SjJBZ3R81BAy{ z!(Q&lCF<()miQF)Hp8e?rC2ECs3v^4+rCJRbBL-~u?0gQU916!rqnzmEZ@{ORY3mDU}taA%|upB(%UF^4;R_?fv!3#@9F6Y6!%?J>6Pu7av`0L9&YsGUv6A2^i}eHdW+bNFlFg! zd~@0^`z<`TSf9DP-7vyf-Smz4X}x?~OIoizIKG_cKqHKs%Ju$xDe-0mTbJL9tZca8 zeQ-$L@IQ%vdlvsR$@7Hn8(+wu0`?CKm7Uo(9eF&ic=4ndAFGd-8da+jLZNh8a|zFz zA3wUgEKSE$Hhy#P&VoE~x7+;7RiGiA{}k=?rZW5tJ~=7~@h2f?YA5N6V-d_(*d7!7 zr@V^dw&!9tvMW#lyQ zS(+7IoAD3-fr{EpzC;;I<%N7wku>|KRufIK7ilI*?BT3}1ABS7H8B;l@a}kV)D~rF`l*Q$iI$=l-Zd@e;Gcx~ zOD?c$B$`=D7Ez7qBOU#bI$fF!X=~a~t@QYXs(0PWG+9Qw@#QzD*6(p>VK?K{LRrtY zQS75~nbJ8lQ@}%jdNU~K*;M3SdcQ#z&qa0FBo4_**ne3WLv>e2ftL!m2o@C+rEm`G zn4@U<%Y1CpEB{)KNxc3#eu5{+_}hSglpbY|2VKoG*LA!saad;1W?t}Z4mZ4(Mjmz@ zw<$vTbPjhfTd4$fi*s0IiWsnd3+m@v>kPT1C-;ij!sq^%h2oe3`glA2b~SDPN8gwA z^_&rl5=Yf&wph70ZJ2dO6lDDB$IYj>QPa)JK@<=iN)y;48?4VM;^;R75(?23)B8^#qa9TEBO9!!i{2Ip*TYO$#oNtv13w+-)@yKISn#Ihv^J{pVKat z5&jXc z^r9mRW7RuaEV`cV{DrB}dP*WW14kPxHD{Ol8A%=PxX_n9XWs2wk(&LgJR?0i1QzB! zc6C&mS#lUj+s}O))fPwjckw0=e@C8{_VyD;J87&UXuI-J?_Zo0%sYe%+WTfiD|``* zrmw=!**C52>8MTKfue0FDKT4_<99`A5Jm8t6D7}`9ZVfImFXFcMsJQw1{h`~bBMTGoVLOh~7xH*;->3!@1@C_9v>%`~d)SD# z?NFh&wdnFkKN;wzSvguF3vCgQwP2&6zmLjzcYOun7G~GzBl~$@)HJ%BB9z>2fp=lgVv8)umH= zdIknx#kfKN_TrF1md-LU$mGTabgOOKflI+D> z0!WtFni4(@PYDonBrKOAYByV2t=mthVyLgXLAQ$Sk{S~+h6)K{_30D9t2Rjmr~`6; zMc(Pn|JW^ZA-eSP(bXlEpQ8OArNy1SIzK;QQwtp5X^u>O)8~V~mzTf$Rjp);`0|}$ z;cn{9`FOhnKW1AwYoDzZu}LIxF9u(%byOxu{c%hE2ewGGhXs`qvr_!9Sm7tA>DSkD z>ly-(K#PHlgan`w)Q=4j!;_Pf*VkMj#?Fl-_Y;64>vIrHlp!S}+ZIx+O9i9`CR{*$ z4Cn+FP7T1LX(jobZw>%d!^MT&TY?H3+!`Yjlg3(>zBv8nR~qT_yzhcC`7(y&sP4M$ zS>yH#is%ve2(bQ2e@p`3VkiVC{KIDB=UUw#3$%49Zarfx!M;Y6}QVJfzXMX}T@&*TG?wgfxLAoBy z3KxBKbp={a>@Q}VGQn_GzP@dnqUiZMt%{c#1P15XBL3AT854h0m$y@@{)NXY`1!T> zniM_m7zl$Fe(RT;=r4F8n1KNG>IqAhGc+`ml$3mv-2i%Pz#e@~@e$#Gzy($9Jzf6L zZYMzVMfB1y3ADnhiGqUn_|wCU?1RYo#D%M-Od`jOzRdX8RcIemaQbhvsLjf@=lcV3 z43te?ym=aFEDjEi$fzhhUw-L0&?N@cjebaviIcl~{k+|1<)<=@gQcY6ZS4SQ;WH0!UteEPjt9_(K*X{g7c(QHdh6F8Ula8GL6KeN!_(80 z_?F+DoclGA5cD_p54&W#=PsklcE%7>&R9+d7AR==XeCigtK_Swf8izg#%|LpOaUb! zVPHZ+5s3jks-R95A)&DuDNvXL{aSznIZv=c{MG2u;G#);RNNDk{Z)#lA0NGu5cK<{ zFK2NU!py~;_Pg=a!<>LgR&w+*%2WRtp?iZIY+`0c<-^0KNR1UH_KrLOC0}L!?_UcJ zqOp{(!MVGC{(RG8+HnhHak>FbNxg&`%m9E1fL#HO3^XTd=UoExB4K|6FCcn_B=(hj zq*yRj6R+y1>#JQo-HLH!JvTLjJm*iIy$-~0THfb>G_u%~GvI$t?ST$>xD*Os^ysKU zk=lQ)Fj4~4Zhp`6uTvDkqOqAU06Ss8AG*KyqQJDWvDx3-1Kt+mKlocm2*n)thsu$f z@$Ul%zh&I8?E8nDnDL;aiHc=sS(`T6#=N{B&Fp;@v0%*bTmVy0tC1t(V$IR|fD^=5 zOiV-sfZOzu#l=O!V|vi_`5#Wv=V{}|}&d;@-?D@n%doj$d)Dj8y@3 zTJ^jd=`u^oawd&_&IX& z?2HV#*&p|xiVP%R_%?h&RqFYv)axb&u^-vy8Lso|;l)#DdQi?nSl*5#ePVQU^q^U_ z4f9t7T;+T%nyY{g2XQy$Z#rdUgoK`tx2!kAfVKqyl0+;8M3@SD#zRCK-0^M-Y(my2 z1gByFf@oG|eRPA9q8!{ToK7ciZ|{~;Lz666>3kJ&yG}rq@#4RN05Ff8ogK(+-gYwJ zM`ZHj7L8d^*#R88HJEtmLC6!N+iEhM1P|xp?JHEW;Er9mz^QK&_7u-eQhTy1ElG?W7S(=E43D2D^*WZ}(wm~k__+k=97b=_H>#1Ly%uU=c!uK_EK1#xAeiOsH~vRKr&amsrW3 z230xU#QPtJyH?>Z+|14UvObt_{{@}rrc<@#M*@C?5M%KC_4dp3cTXP~@Iky+#hn44 z08pKOXK&xW<%#Zo+2P3lz{eL78fx1pu109v$xk-c(<2suP_fwKck$ko(i2$(7kREi z@2cIInu21Hj$)8AxjgAh8`#b@R{FFh(?0-bs@q5kk zj4De2Tvja}(S`#qj${`14N;VWqT;NDR9hr0Xgv$v@8*d{FS%j9tbSZ>svT#5!ole9 zUTrguZH;;}V%gw?iJhMhF<+o@?1P4UBY1%JcJhc`#6Tz!5q<6n_7yK^0XjI09b7s4 z1S;q@>Toa&b;Wtj-Gdl|1PA*cS*=JDf4Reg8bpB@o{JZ8kUYT!f=;DRXP9KutCSJ- zT}Enwh0k^H8li{SmRV`yRM?;YcLj^S2@{L+V+KDA&}qPv`^6qAQsu*1sE!Hzhk&UOfniL35z0rZ*KsS`*FL(K#C?_50_3c0H8wv zp;0KTiO~?*18ig3k?H*MvJV;DFAxeaVY*l)0@*z|q^Qhv(ZZMwuWst5y>u>|I?7Rk zR|7qYW!X|&{9c~HIuDluIR)%`!b&Yi2{E|Kj18D09x}LjZEbBj`)(E1i$X+tuKI#Q zSStJo#o=BKtN)BUHELr7D!MEw_C zD-eSKnRF`g-o??@=aJ4aC$d*%1rZAPt5mre1H`dC(Ea!iCLb1`n4X?qT+|IBt}dV z1IcymvVC@HD&3v6iwZ9cETod*11G2Yh5+SQAYdb1_f$X!ww9pF1=%XiKu2d`b+zIz zk6WvO5TG^}4l9jVK$Ld^4rj9Nqp9{a=xVP!HhkR~{wN+HW+YU9K`%_7xIdWqUZv>w z0?IlsDL_`m$j!B#nwJ4A3#4GI6r8wn-h|e-JCg7Hr0D&j5B^sGBX;+05~w& ze?`wAyf&;qXp;mk(DaY1-`=F-M(v&!-7rfZ=`$ZLD=h_Br2FU3TkWZxQl4z7O916r zTm<6=w$|3Xrg1)iY;~Njm~@6PgISLLKEO23fp8j3po9(<$GTADY#OmL_Diki89X$k zN~g@NxfL*sB_;1Ib<=@OwziH40OA-01?Bzw_W*_HcdFI-#6hHJi&MqW48WZA9Mc)B zA3)&E2`?VGB|ADx42UQvln@WU%HCFO@9@qh`f3d2VXXxo5OA~`GXR9Mcn>eG?AuNb zfmo8rP+>Rfp&JGU7l`Iy_B#P?H&zPF#)KGymm-+A5+yS_o{Z(u5U1Rg)zuT{#!#qAB4D`8}0gg^o*z>3kUUMJxIbaHC%(O0PDvm*y5Cpg$J5ThM} zS{*dV?*6`xwzd-w3E?}s9+`hd^81wX(;H_$cPgf>xq|^m8Amny_wQtOX*ABlmh%J$ zTCY^$l)9EbVxSVhF=}-Rr#jt~0)*G56ot0X{c&V!Rzc!Yq2IiH^N`K&8E1cW3aeH~ zLP9cqh|hpABSXN0;&?DMF|mGeH@UF}?lw#eP+Wjp1eTk>Zc|GnLZ1-*Q={aImsj*LcuB#&8+wwwuid-D>LSC2OG_z4#3{C*_$4P{C zn5r2aS$DbGs8Zy;9!vm8qhcc%fV|I9S$TRk=H$RY#^>i7+uIG%QDP{*Whf8V#2d79 z|Hpvu6zWY2;)(+kGlwJbfIti?xKrf>Umh<`a|X-+m`h(Kf{O^ZWY6uM`h#|1c2+ZU zSpV0Dbw}tnDJI;+!h+7ZqKNWkFo6MW=)HewKx1vva9_MUTdMc%>6;3{{;KNgt|!AB zrT@~tP4d_*exxFBMpM5`Sm8bwl4uwPaB}v>#?p*EQSjG-5i1-V96Z}g&F>A%$CtMW z5_xoBA(>?cUb$O=N!i)jG*czJ!@w*jW~ z9>&L&iiYvE_LVgN9SH`MKo&fhDbb=B= zn<7^LeA^|i7_NAQVY{!JttcSsm+}(gfk4yAI(F>@x(`&=y>o`G2kc{}mzVXsavP71 zK8@n(Z@tzTN0jjcsbnYpcn#>F%QQP}6-j~-AKPM*76V7VOhRRS5JNNTsNX?8Y{o3>njD8gEiOB4RhfJ44U?BJR_X@fcA-TJRq;vdN(L-Csn`R|0 za@T;@oJn#ERi1*Sij`7mJ~D%D{~p2HIJ*TT>i?!c1ZIdmZQ{XJ+AyzYtU2;jUqHiI zP|lSOOkqFsEnAOR$5Ej$qoIX%-<+)OIL}aF4*<>#54m?wV?b3lhD!U0Is->5X?cEr z@8m?$52V|`bC{{w;mXVF3Pb!Uu?Hqm^c2lJJ$VIGx$q;*F55knIM~kJT`TExY+HT* z@ITZpe3|gkMSqUR3Y2JXpEO(J*=rLEt(@+d=@Omywdf!-_^l z6lLK~Qz3`+UQv7fVog?-7I%;^8)%K)!$ba!0q{$QEnKiZ`2=>Zz03BluCI63qjm-9 zS$Vt!=1)1apPuw#V8YPdIN#jdoZ8Z{5j4}$(U{VZ<>C0>{(mzn0ABm;K!ph0UAGm- zKOXdvUI4Jw)^33%^*aRva3#($b++C)mcFO8~Dhece5yF3y$3Vr(Pza z07UZj9p!SyV`EjF@r2|zU1j2I z`!Vahk3i4qA&ooz_^(mU0;(ip86{uiAs&NKLtFnGpm=Yw!vNV=D5UB^8KF`{LQd`n zK9Xr1aL<#u8YN&Nh3&P_cH!@hea}H;q3EJ6FtP@!hmP_wAf0DH9XfFa&2CUE((5}3 zuJq^GbiTX2y#=uld>2fr72Ri@s`=NTs;<*T-`#nZzak0G^_(Hk?X2#2EDQK_O^#a3-U1ho3V-r)*pIKm$9DYG-GsQ8=pCgqMfs zkG)LM>;X96H7+-xYb9dz8Oo5ZL7xcH5K93R@{kH}qClz~&^KV9ZpH>F@Xy^!#Cu^vP>KWLjr1ekr#4Q-#`Vxn&ET>!Mth=PO0?h@ zGqW6fS9uHH{g=vGNzq^;j;b$k}y&P7XUwEzuxe^VbdJ&i{ zh^cy0hM^`f%DR{-MYZV+o}-^djsg>mXoeWa4NyHk5JpL?G&|87b#8*WM~`|}a|&ta z&z}LF3;^~xs#gKR97H1uGJw4n!91Q^gQvy86~FQln0)|TM}2K=COtVHF7gN%aI(a6 zx(Usgi36I>bF^r}3XD24!ifM?3`PbtzPup_77c*{(D*oF%}1CQ6fd?*$-vYOQ2DoC zKqvv&xXbmfgfedb8K88LgB5DC9?MES&p{>QPC=0qC6J;8vIXin%MDIJve4Dl)$Ghn z#-Ask?wSI8^XRrD=6~LK`UDS*^rWSxf=ZB6z$*gJ(sy+n;ExN?|MzzRCilPy=QXy6 zbDm1ksJhUPxSFb}bw?gBG1kq(mU;*>DbGPt={TUmjH$5cR=q%&nkmtYfF`(gdIDu; zn5`V->gIM1>&k}O4Q9A|d&NVH|C?aSh@bm$q^fbX4rZN!BP5CnA#c~D0Nx^AQIOYO zhFY-}N>085|4WH7_79kSp^R<#e4yd>cK^R#$T^lFs3d|c)5H8l+yd;Jxp_XA3HA)p zV(`7&O7?`|BONe{1LxO&x}V%nkMQDMIw1J6va*W3T}eBu4|{sx+ObMV*GQCBkbL;S z-2JGd2cE8RSw+Rz*w_Vk+#>~|^U(rl+wTU6@q;UtKiw!w*1zm$(V>MKJ|qBP5d)-V l%SP!w7;*(AmyVa0mpS!qEwhr>DS+aDNQ*0om5Uk${vUEPdX@kH diff --git a/docs/files/leader-election.gif b/docs/files/leader-election.gif deleted file mode 100644 index a906290930d4da487fa6cfc880e3d4218d04bf8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167740 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

    jHlsm3J1UvwJEYJ^$~ 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 z zSxl@s8*Pwd5AXOprGz;dso*x5I7uF+?zv4xf01t5xH3E~?o6&C5XF-eXh=vQLuLFUf09MHjroP}~d zRKz}5abn5Y7*SxcBiIPT7LvmSghl%5+ic>L*m+b$`miF!nX_@Du(CvxyL5njv6$W)2ZLl|r;jh6W_?$#y@H9YrA@9! zADt$2$dbk|QPtFq?Qc;ELIjzGNvuKq%0wrL09lF{Gf6k0BJ0@%4GyZ6xkf<(wgRFn z9ifcIidaar2sw?x#?TO&?6g)P_G>1HkP$WjKy}!7R0MKea3LJXVaY4l9<%xjCZB;% zXKLOSpnwz!OPRkD7Kh@UC7mxS2Pk|M7Hy&gjaID z5K|$=;kY=VDEa8AYV+NuSsvb}Svp6Ym1A6L?BA(4L=6*R(i!B$uVCcjtOknEf%!JQ7ljhPaB@;1Vv(E%DZ@D#p?j?H3J`wd~+ zpE)uK=Z=OFjtS1)l+~8XFgy_N-qcBEOQwL z*Lta>=~?0(I{7V!R4F1Za>#uQ^E+(H3n}HgnDA6ebbd!F6BFhIWE0MTml6ko>l2}Y!y@@D%V1JO8JRIiR3asau2fLH$Gp~mJ$m!& zbCnz!rcPeDm|F8^m$EFl1{EOE54FJ7(kdmm4NpXyLD19FS~pW{>od%^w0QiQHu=pU zsIJ;c2!RTwdA$PdM0KtBmif&PGkJY;O{{)>wNrqrsb;yB0g-TVMYjGTgA-U|a&-oW z(gSN{ggHI^(hwY6lH{;xkj^NJ=~Z~e(H?zt^##Y}rHC>G$TdiCS`XHID6cu*caWef zcJ*uud2!~}nkMq|CbDpL)hsL@(%e3k|*_k2AOZW(*t` zjg;RTW&b4aKdZUnvHt6YHo+chp#T#e+8sm&HtmpI$jJ!X0qRI@z1QHeasmYQaVFQ!vh1oBrOsq6;Y zjO~V%fO&LU5WM+8-s^U-OGFKMcDSx zNoBenSk?~(!{<1+sh+jJdWwndfZFQ?GoI6XeciO$4&nmdm2Ma*&3|8dt;Aeotn`{b zLnBr}D2N*4-lcaMydm7R*S}iwqZ6I~`-GU>C_)!9Xk|b9*#%n4B&{uhN{Z0^!gI($zNX4@q~QxOcAF4WS2=X8a|qU>Y`gA@w1#0Jr?*7@5m){;2@H#d?*vlY-L!r5 zw1?@sg94Iq@JJt%v_7V__fhBhB!e?ZGHQtw_I0E!?m^av!R~_wYRTkb0jZxwf+eZB zsE5;}hl8Tw`KS?T{cz{6hcePABtHu4Q9UHa*UHf!ouj{|M*sOW3bZBA8VTy}hmRm& zO)@rGFu)cXVGAXrixQ1S@(YIU2NC5xOF^(e_6}A*rKe8Qexy%+R9bb*DEbkUOxfnH z4(m~~Qe^}3qw_YDSLW<7$K&J9=f{`maxTZm&Mu5Iv?n~)Ocdx1dmo>$bM5xMI}!MD zLiGQUPfTHOHo*O-@x@v8=$sW8`j;fF*ON&Z7Uup3gb&LnmPqliiWh*N`qHi zhDp+!<6O``?aMSADz$Pm=LU#%N8WBN3ROKMb>_Z*b0IXR1-A2?Sm2r;z&|pq@scElqU~FFNfhs%&q0H-5?X%7)__2d?@?Y6PY9wmsC` zClTxzCb!-G>y_oz;A2a6^8;KT?(I~2{FsW*jha(M*3n94%!%f>RxOQVW+B(Q?yRWv zo$dVo`0aS4?)Gb8XPwG3HY|p`*L2{1iwwDAOnq_uA7A&LiyW^lNGYQeA>Mvsoa8Lv z0ek*MHUaW};8a-}oErmes#Y|~`u-YcvcHad!88h%F zVc5zcuX@(XqAX=t;6QMR7gV<`haH_iA3?BSHa&_r74^F6_Xnx@IA*#oS z^NihG#09LL?T)*eo*6q5cJRonU$gB_RYjSEc1o+g#qdElr#%boeMmiqG&M z_FIP!BS?lz)WOiVPKkMb%oFx6ZXFd!|>z8-HM>aNM{LTEdRuF(1*0xx^ zqcM{USxg>Ld7kj}cp2W}La79!X&_o0G&y@3qjT_ygTCMHGyJAJCB-Na&*JF@F+!zY z*xiFsrB4$q-F;b*)=mDRze0RL@OsOu#j*R3EjN74v%K;7nE$cz(;?Yfm4>B$PNP6X zTAes>)=OzT>C_whapxY2wSmmGFynEUfyDNoHO;Vg0oTXczxj_drgnzXmlVQ#U_Tjw z6x&Uf+L4`lQ3ebBvs2Su7#pvehsGxMob^th_>ElbYOhm8I+|=rmfQG9GhXEiTRzBv z{k$dlg1ygVkijmt?V!;m{g44Y+Oy9X-G!?|ep*0k>Mwt)cSRwKn!w0bH|Yp0=9F4P zN7M_$tDIFVs@w!C;7rO`{-g;22O3 zf$wK(xH@+fhDZGgX(iEO0yf{AyK~y;MnQGwVpCf-U-gty24(uf&*67uSRr-{SZoZUm$_acnro8Y3hfgXy* z@_qZsn3G$*ID6FR5zac|%+(Ar`7Vp2;?c;l1T}Dq%oC|lOgZ4IN37y_*o(#r;b3-< ztvlA~VA)#7Xr$(_DN^4&7{9i@jwP(ao2+sY66UU2I+>w5FS!s9 z1#NFg%rZ}@$_sAMSFMquEC3@fWZ8?HC!VOP=gOIv#_FcELCPhvLQIT-`bWWfWTIY? ziGWBPTkbdO;6pp4)hI8Ql(khE;z|v!5A6z9{lC=#=0B3$7WLQ~Rbk3MJL>}4bEcK^dCp!j;Tej3 zCWI@TxJrO5pg|u$Gl5|#mvr6PQ`v0+XaOXIQ3gt+VlE}o6XSax-l-39+$+0C?E_*; zxO=WD3!&n`;9z3eB+VAF3VUxC-Co4Se`IK=v*0Z!88Y%Uzy(Usn%89crVM4dkBbir zHdGNd`5LI+sPJCg8hmrJ=?o!}hH)2G$(eUTx~**<8tKyfy@x-lKfop0nL6RttawR@ ze+-BTrtUdA#2KU+My;EdGziANsdzIPYo0K}*D$2SyQUmn<{0*n8scB;idre{qytTg zqE%Sosu3IqXQ}SZB{AXGvy6S8d+=7vSj~e1*t&wyJ}mTfVA}Bay2Ytu6$X@3Sa_OO zm&OyS#Gy@|r0w5L+fQ9@WSy+YqP=hp7CyOXY&wdWCr*-({d{Mfq!!>RjoSytqlfaAR?I=CpsG>>pw+J9VFJc7a1i2f4Xr*4%HQIcw%U9MQ8WflrM;E4%n z+pYgkOdhHtZsb3H6)9Q108sv_yRQ^3E85k&5%#Nah_Hr3kKky3!ST>DRXl2?7#dxE z>o#SRrSjPTx7S%iVFdQ8%*QHciq(OeG4*y~zww{&v{q;}FqhnVk$(+?1;KL;$4?9Axyw z3@RGeLr97t+R&$!e58=Zdl7$QOUs&is+UD1mlQ8bQMy)5f4UiVSFaSM+jM~TRBJG*z=!Ou0A)dCOf$F7e$B!jqrojsL$7+YqyLOrM7 zDkJ#Qzz2_T2F?DqQ$IOcRBE%IPv@JH_|8!t3buY5)>}*~Zm#Ul6{^h`Li^TN|D%tz z5ur5+lI(RPF{v)1cSQpu;H$hnd>?O$1}D-Xf{{d0 z8Om84b!!tSU_cgP!YvUfECtO}3|WkWhw0l=!UYuZr<2=F0P-X{wL)ST4S7wtB@GjB zLzqT!!g3gtQKqBPDY<)Lfy4i?@Vug$7F-VOWT8|fB&#y?BWdg>aV$!P{wmq^57^Cl zieC}pu@cgjUY@)NHA5$U7vho9Ojtp9!okAk6J9ALH;1Sw#YhE+01-xwLA>a*3&%X6 zLB++0kV_Ks*G-he0_;1PSwEAIUP6~}Jl8VNFGXk;8|kM23K!CC;J*O&X%pj^sc?psC1acAgduaVLdf0$V|Z zsBN4>MQ|0r9_CB&Jt*?z@G)Uzl;z-gnTYW9$`{m!WJko3HFqvFmUxOax0bO zctH1GPl@hLf zDU~)XlM5E1FF}9q;k*iUew;}HQljQ~<&>1vK|S(m zg^jNlQ=Upmt&9sVnZ~BKNw62>Q9I#`j5Nn2zhk%p^jFC>N0w?H zs-A;YgAl?cGY>)+69s^wtAJR_uC1uTG}1kviF6?w@+&|n(xdKXVkd-^j+x}VGUFq9 zG~;pdLL6<5PGP@aGtQ*QH`(nmu}h5!oTbanN@$NIb7WSs-#dD+g` z#kzTs$xBAaQOKn5D4Eqmejzp9XS)@6(7G1L4PcG?0*sMSJT1d;nDoJK`x0boSLD?j zK%P&A;n7)(moWz2*R)?xmw!a)fH=3I=gLjFm;Mo_`Ot}NgrP_9AkWI= zP+YmELNfxC_&u5SddLjvZnFylD_sp;3k{!;v_JE7l|877=2Vb!ljuREXDV&=(8_Yh zX>k>GxR^qw;%TYYRkNB)U3kh*k!QS4k87h6yaja|s@=7v_pfyUCA1;*ZIugkv2E$MmYD=w0+ys6$Bx(u@8(1Kov^8?TWG3BGlTP& z2LRY9A}iUEzZcW&iZ#D2kRE41E*&ov7*#ISs#fCT6fh16sUp`Jn-5fdxLWUa0=J;mf?)y*`;G)DU? zn9zt&(+=#qyU;ac)AcrhDl@q2rDukCrjQ=oZ9Szq^sU?0t;asF^}nM<|GF9qfy)1` z$QgH%?JM~>mGi38cx})e9|ts9abLzs9T~ZaXYr% ziPL?%#-e>OZm861&xt_7-j}zF|5Euwb8?gAxcAPoKk`E##AY-sc&{ydZfg;F&I&0> zSPtJecw*_(J@lPb1*FeDer8&-$>)?t^a|JBb)Jz` zeuMaHs$HpWqR1lCu8Bu5QUdCz$o50&PuYVCXd zqZ{p;`iydfbqe}5k5BjR14)S9qiMy}L_h)3LB@_s3 zl^{?-IC1O6%5I*@??7w@o>$V5;C>}df>-tBAc2Nya=<-s*noK>PzwpPZ{i;1?7#Lh zgW%aTr&O92X4#6?8_TqQ{W3-3SJV z}6Z zBV5=p((Rjnf&4E@tq+2Y`%D6A%M@Eb?gUnhr`19X3=|{D)dnM1P_~WyF0XsX=k*;e z3oFA3Hj%inha$C4Rle6P627WkxRcv=K66~4eb|>)?lJl5@Dqb*>NL{SVBn%YO;C+T zp`mwO?Nl!+euNQ>LOf=8RAsn-(trfv>6=Upuir&`n#eaWpUzq{ z5@bt4coeKGFXH|93Cbx0MW&o;zH592oHFv%ee^lcyL3h&pX#5_D(+Q72r0IMa@xJN zRC;(~(6RZ`Dd9Ga8ZT#*TbBBcg^jC+FTb(WNU5r@bB_&$N10a~8Gh)W`x6&J7vpoyj#0 zIP!W|WpN!>2$^w?@I-3ec))M4-8nXxQopH8^K^z%>KS6fZXcBg^iyZf;=N z#gw_bKCmsKQ`Zgk+P}H#=^}DhSg5S4u*%5aT$^wwwPVRiR&b?d*+cD7#L`*EWOQ=` zSmC56`58Yug51Drqk2K9XFdH)J&f9!S*|Tr#H@Kw6W0gFRMwlTCHPyCTm-+tgq}}# z(E24fj+U+0`puFMEw9@l+nYXLvQFC-u$eG^rpf-Y;}@e1dxpl(&xFxZ>Uhi?m}#q# zCYQ!A4>>h7;XMVwlA5nZKERcv@C--v2W*)}f*aYr*Q39f+c*8t$S82QzBB0h)-$(A zEhV?=^=!Ot3W^KjNtq34Xok&K1V^c|rl$G@M0(Xx5^r?9HajSZqG%!L*=nSjx5+Zz zAYe=X2FEQgoO5=dtBcYOe{KGt#&><*Dv(fmTYx0##XST^P;7XuHtTv4T=3LJ(tjl1 z7G2=Kd-w(CzhapGJ`nId`~Q6)z#~Jj3w3k>;#BoyQ?<)t)a3QuS1H>4+m|%ka}wpL zFoNUMdgSQ`T=qH=Jf{p!hYVG^FgIv{l*IS{6T<|!Xhhm|*!BiD07k>?`SB|q)&A$r zAFDpDgKloUdu_PfUugFjK_$YrH|~2FvpL*)<6%Gom`d4{*YL9A@L!J}3~$~K>$cJD z5WS5)Ej}#wR9VX+e7gTXG0Y>2R?N*B=U@IC!z|@DuoVJ3THZa%-+0~oE^K@2zAASv zJMe7N)RpxXuR=~`k3ZW38iF;~x*0koj(b6?h*KIZ+^5y6$|;3g+3%oBtA5uxzNC4- zDEj5f?x@r+R?#;%-G^BD%0E6|(k$PB7Jm5IaPLk3;%kcv>&Qmb_^ZQ(??NtGw<%v5 zwj{oXo>>W^rg4Tl_8xd(`>KGqVe88TUXatT0UjAl#v4!_pC&DBZ~^hNGY&=2zPrp6ITyv7iJGf)Xv zKHqHf*dCozc;>lDrE~vl3y?$?SnVau5iOB1dL_I8epR3L!6NJxE1$*?rDLe7YNACW zZfk$gNOW9~>&;SIjQS;3&jY*33dMd%CG7i%!)Sb5kiAqU^>KX?5&FPx+;C?Qdop6h zE~x%tsv?1KwbbrG@;KjokNwQN&}+@z*tn041IBwkZd7t?sb%?aVp)C%io^5ha2YBs zW6Miuo<#`9i&a4wt(+I@@38rJaM2$#$PQz^&0>W`f!zkDYFEVvboCbQwZbK~-A0#* zf|`fUi=}a}8BbwF!v^fy{;3c z*Z=-H;2%Uaaf*(fv`S;@Nvz=H4F^3?NvFb>N)Mm_Jxjr;U$K-R>1H?RR0BBpVS-D! z`2#`20q1Prt-^Kz97F^a3ZNGOjGU2R6C)e3#3?waSH~r2j%*P%7NiLE39CRixrmvS zIAX5xhd``qZ^H?ztd@ICKVu(aTzzOeQ$o|EA&npMB`yh?LQzHqA&2cKEt zp*U-k<5CGQccoj_1SW%RY6xU%8xmc{${~nmH5X{z3U7+<8k||GH1_w?Zl&Gp%Dkd< zZ{cj|qQih=BAccn%few7S2!y5H^|5>b67y*T29WWLPsz(A_uh#aPY0{EN(W9nnUqY zlS)7rTWNMmDpCza?;>u4Q-W;_wBKQdT%BM3(aaezss=$RVo298 zmaI~7-+GFh<2Ded!7A7jwf<4P!-Z^mWJ;E)FxBX$Gfj9DaCA`+Hmp>i1R=11%^~7Q z@hStfZmhi;uLUNs!%lvnBqie%;*`Na=I>Mjrxn4FqY9BAT$CS^P9oubHOrM;Zp5uH zW2j$}pBho)^NHEL)nIacoB)Ai2#}UfBTlcr498okQjp8escDlxNltgysvpSFh8;4o zsg?C%NC<`2ek`UbsHC~#>GRvK+PRJbB`--i8>!)2%gUyuZP5qkUJ(8 zA;q7!Wc5PrV#Y61sv>TPu}SPgeLbhM;-i7pFL!?w_(`3Xp zm_L+5KFmV;`{q#mm_UvuB(@2}7-J!7exs3Pt1ZBfmXHrxla3!n~ZA{n&C32pE~se9SJjOG4yrOozY+D)!2u1@g|r zFEsil`(29k2-~OzbyGC7$&M~^>@uWzW3kVcsWhK4JV!XTX;iaSDzFk32NvK@9ve|R z9f8w~mc|73s`F??H34*<#wd&ArSVNIF(!P4Tfo&y)j?k+t_y4Lb1b5%0vSy8u0$V+ z)yw(PNw9Q)6a?3b3z6UWT5p;6i=QIw{uIP%GvD@GjoMIx6L{|?C;M;C6_fWxAvJVk ze>k*t6@FkF%)dkwsqzkJf65#?c5cT&M_8!;KQip`Ta7BQAEAq;-|yNtA>5=E<8b-b zN4Kcp&8~Rc)-Npq3KBD7>v+5URm2rnRPdb|{!-G1sQVg|l$x~6=E||1+ngoOC@7*3t~?;=gKb=&c-eUirRO zk14b0seKo@@?-Mm$oGmAVeh)hPlr~#R}?TaC%K71s)cnu{K}15e==77-Vy8>rEitv zI^jZ;TP!Et(WjcXWenMDHd)qu(MaAlufI(# zJGPC?YCD{7qGeW*VP=~h8(}aZASbEiY#TTjQvv%lD9oH3AV}Q>_m=Q;KF}1yoTw)b zQ{rHgB<{DY3jPio%1-r0zJQ-q;+%_=S41Q5Y3p?|D6_1sbrWA z^PjqVQcn)Wz@ySMSbu%?wxRgmI(dfoDjjuKC7i-scMeYbtfBL}Igjli^<7Fk^YVi; z_R2GzW_FhYE)ZgVXqdC>g5iENZKICT#0^==J31ixE%V3M!=n@WhSIJ-ZGe8yxZ(O` zcYOpjS{-zlD8BJ;NMdh3v)mN$&DX3cRS`eq?MBw58MTR~ukRvTY}0hMe0(cm1zM~5 z^v}o(6??ayxU*%m25;kdU3=Eozh0loI{ssC=iwVSBlZRmx2-w%=~Vnn%zP>iWYG_8i8Jn$m z9~O?f_2U*=Y7N30=5ap%Lq)Zsv9ZLiI|GmeXUrmKBzFVD&;8}X1OWGaxETp( zfOHD6Nkp^fF={9%3SKM8%p(x)H_LQ_)~wi3m62qR5nj5^(R{03oV`L&p;>pR3j0!>xB8;eRHXm8ne4E zyIFj%9n#(P#}S_`|0IzOL$~}Pe`f2C43$eGCq0MX;e*Q*n^JIIswk?Wc?Pe!bt+bK zg27MwgLYb=?WH>FJ{i%bU0yJ zsnjwn!*AggEEb*g{9>$m_F9kMTm{u-f?LGujMG|JE?x5rua}N91fUD+0nG?d2oyLt zka5J+3l@KL)$mOPevfKP;1cry`(1;XmImr)x7ILdxrG}tlJimSm&^{NP|_-APgfiI zT0E|zZoUwwHOtJgMtcMV9XBYuPP$B2oWc2!mMZ@H-|YXFyY&D2Ar;_(0?_!MZ5h-V ziC{VwNPRGrC8}aX_n8*j@<*!N3D+!jrZ6<%&4qh@r^+(>h`6eF?WMF2Djwxv+az&1 z=80tmxgG!O?PyPSgfse&nQStrdd=1<2spRDe}4J-E0GQ=3d zw`J-_XOhrVL?_s>fsigxZE%Ljw@!_lwQV&=KB&p zUkWI{8O_mgliCE82k;u(f+Bs#-`F!$4cAZ=MlLmY9~%nlxh&f8Ao3n?mznsBi&QMO~+XFSM*AlBNq)IpUY;~nhVYS7>B>p7P}8#Sm%XG|A-I=8FS+Kg?rB#>Zz?w z`v=IkRXKl9f1;a>~91xbSUiSBBIV$*7?B5m&tc)D8Pit{Y&Z^J9N6N=8z@2b!Uu4)1 z=UG{F%5>MgX*5pSBI5AwY3WV;iR5g&?6!IAV@*DQ<~V~;T41x71wQ(OxS6yqoU}tI zb>*$umP8*#g{ffx>0bi74!c*cV0A{sm>5!@17MZyv_OJ_Tw)-g>=n$*!JMa2)o275 z5V`u}@~FqhK0pP#T zvA&Z0E*^~UM~K*Z?pzAG3_(vO!b=}*&D206Ooj%G_mH}+q3`y47)<0~NJT(QSEl-s zZ}a8r=aBo~ry9{!IB>l-^ylI0^8>~A{1J&^&1OCqR!5`%#(xf%R7W(QbsKW1(73`v z=auF?dTMpGF*Qbcs}du;CUU(#+CdN+aaIG+7j6yZGMslJ4E2y8-#WZ837>Q(``m!6#3Z{5ZU1Wa%&WcSrR$^)v);E9zz?D_6Jx|!-}`Ir!3L);dL?B zo*W2%K|-%{jM!M9m2WFLY2D}Tppq}=Gtrfy+Lh`vl3IqF3v>hnOM_Y~fH4%UX9>jg z*as#80-za4%z|jpkk-RzvBRkmRdYP-Ha9y3+n4Vaqmx%U&&PKN5x@xqo*LDJyo4FnFM%lVED)Iqbf{EV z_XuSP@)(!qg{Ttf@9tL{TgCdhk^5dM6c|{RR^?OIqj;s(UG_5r&QGIeN7iktm97W- zM`jE58Ohg9TOY-hs#=Ihy_$eGRjsDjdw3;fy?P3NaVR!lo;Rq|yQ~nP74`L6fHt%x z?!l#Phgos}^|5NysVxN+qHXr01#8kF(9g4CoSq?AbhPQ`rAAyeDp}P}JN+rRD=-CD z0a-0=R3G{Wo;-KSy6$_MxhIrt*p(GIu_?UoQAKz}Us|c3>7O<)?Izs}_N!}6G#A}P z7|Q2pJ$CCo#eka#76=b`J;)gdw2ysW`SY934@|=$5QMgo={u)9xcfHYXD~3&iF3R z??G|C7q*pn;UcM24)tr23^FYYw4MKUs8LBV&}LzKAZCWRPpAh_rXK1loI)o{nj-Lp zyP+pq36L;DEgeU*y-Yk&E5?4MfktD#`mv9*nJZ!}!DiACNN2NF_*tq23x&UN^daJ; z*zl}(_Z?YHMp9fPW^kp;Q}t7v_N+9hgK;G3MmZYo6{GUpa80;^gIb zJlaPQcAaq9MgK{Uj`D~PQ8z@-c7q7ctwCT>CU=aQL+o76afUa|tx|m?Y7C=PGV1}v z2oRo_tv5AaN_0aZTWJtE6M)b}J}pW%V5as?UOt_x9ZDTQ=%YAlY6$F?#JHgD0l%~2 zWZD|)!0KO(7|@FZT8WpeyBdqrNrtOBerZv*`Sn{x7*?RL5i@QNKQ^;K9!eVBV+z{sIuA=ylVeqX+t-L_KG1z}&ImZmKVG#2#a z82epwQ!l9*F8{Z4%FoW&BpU2{dF^}1mC^HV(a_&l?M#BIeYud>jA{}Z%{>3(tbf{W z5er;aAr0Ny^VI3K|9`Hf&zcfPF9Z#TTRjhf)%%1GdHc*ZA4W(Y5NTzw7><2kkd}Y- zX%9cH;}P+Y<<#9{f30oE|7M*qP&Qa{BfZ`3ZAZaU_wkPrNiW9^1)R+4bbi7Ra}F3k zen%8P>1~s{pYiK<-Rrv`0{^T2n_c|fjwt;0UoV{ByeueQl|WMF+z4r`{FJ)sZ`W;? z6k?Do7otl~J>A_t{x;f8miNbWEV{bFh;5%JDMIiSD8dI9SWzH_ET zNz)Y0Qi6hPn1~a&&lvfx#*{pQ z$CrfCjmDUo0L##1!`uLCSA#JfD5&Rw(<;K;h(%a;gd!VyjN!<6PwzBZbs-ZAU<;XH z0Yjm)H-n`R!>wi@lwiOca;!V}d;l)D8ZmDWaNet%7@Ywy*8q2XGZBIDzAX$nD4{DD zi?o_i&;jC%cNSOLlz0p)U;7cfVj!n?m2rqORS~%96=%2{F_n}w%)!!i-?h^?2 zmn>P@Q4zU10PAx}{~&(o0YYkdpi-;xe8dTVuT>y4f~D_cMOs<Z9zIS9~Ety zP-x<2DMC6!&$_pfX>D^R3eXv(7(zBqp*2k{f1p&}K{58esLtD52%*E7CZ7wsSmVV5 z_FGd6_b_I4JAPt7!2)>|j*DKA@<6Mw=*(v%_~SjQ;iF;k%n?uH`k0MjzwB*05CG|{ zIY3EFgFq(3!%-7=!w}+fX}ok>?t1bH{HUjq;}b6-#R`sH@`kl?AenyBNEE6R9Z^lW z)wq5`WkyXB&QSA-NVz9<;UwHL0urg+MA^bgS1OCR2pBM1fW&38AcYdY1B+0dt#I1$ z_gu7zv%Kz>zlT-wq@L`xHd=RmtCgw+sBM;wt&!p+`P*!?83?{RGqF=)6?`_2s9F!i zyG&M}@!am8OhkW~R=Ftc-L|{*)H3e=sya)5dTMpP$sgUSMN)n~tn~lp)kRFN<7ojw zrhc7N_pRiqotTqe91o^Z@fEWU`W)k$``Au4 zQfc?$9?c03#@9;^{Wapg>(^ooR2!o`%979Dok31Y_tb`=T@D?3f)qwg*vbWhzS(R~%1EPKD<#w}lx15WG?tLg9bxtj8N7vX&K(|bb+bsxh5wtt5ni@k1L z^ZH(n!afrBhafcsS=lxPXEKy;%<3js_CW91{d?ni8b?D+H>>oR^pVO$M_oV0Ea_jE zWY?Pdo!Jn^w#{{2sV{AOHgIEK+E1}*CQDOp&Rc#TfOk?M_@9?I83kQI<(9KugM7Aa)Ek8_8R2&a>2LOjQb8Oe z7ExxJZId}&aNpe7NqE{f@9yE)UN=h{`lcM;ohd~cFP8gXaagzr8kfAx(bWVQZuf#` zRW!d3_@2NUHfSjNFuDg%v6~DoPvJIe!Q%kGTN%eF^tNQ3=?ZMBxF5J97uBQM-8QtT z&bG+ZmvNBNDDEeQFtLbkHh*GRUgbxeMEwl zNuOGT=;U!}%_CNj%G%{dQZQ~-t730UolmslF&wJ-r*GNSF;}@0jH5b9sSXi-K_9jr z%F=Caz148&{Dri|A5X;?&e~9wyX8eQ<9wuXV# z5Bkqt`rkZ}|E+6qo+vHc+)x%?e-o~M{11+$InJ+IdA01rze?jD5Ph>Mh(5gZ{=rY< z2MnG7ltQw-Q*8(Mil+ic+8Sr?{|_E`vHg7Z+vLTJ!TCqE7n}2Rg5bOKcwMN;YcICQ z6x@vKxnOn2aqr|Muh)Ovxa0KKt48jqPTb%65<6UPPf-aNSFS((GIc9Aaft-iNB2| zpEE|kU(q@MZ0`&G{(k4E$9)vExnv9UEDH|nendTRFx=)T$o={*Gd8^_vuq}x-fucv zP;-1f>bHj8SmA+;yI*uq_M)F@x!*QCT*L98^uNlCMkK1HrXpDRr=HyUqMWU<&-Y2% z!M$UA1HEhRL5>!XxRCJ-FlHFW8^#M6_#0A|FLW4tkDpjQ~8^U z|NleRnZ`r?zit0Bi!qj2%piMX&A#thW*9bbBK&DUW~oR<&q9Y0f6&un<;FLJjeLv$PjoN9~)x;Q*%#6o|vw z?c`fP7skJD&Y^-#fXoz*dqf4U#F}|-$<%_c6aWn`a=Q!o6$ZDIc0A#ag5LdzIMHZT2Fitza4GdTyfVSdDz);5vi=^y_;IhF8 zGsiPr&xjXLr)TsI9g|Kel1sd{>onu_r+(Gzb&amtg|#HrXaP~7T(G9V(y1Se&D7d& zXIA7BO&LJ}0rK8TFLwg-POSNa-9=rcU_BNQDA|mF1V#dov`5coY}3>{?e*jU<@$`* zXiwRIR{eO&Tc1{Pqa8DtbzLRSE#lj7SNw%d(>ZmIOc<5#;968R6k`(o!DPHoBb)q< zE=;zZ0W=pQ<{5)s#>2Xb!`mN7kVY)t4??V&w{-^freG0p@4N5UK5aC+aXxm%kpG=h1fnZeGYvNZ>?r9o;ByeWu`L;L!RH3G@=18JN2?hTGGpqlWm5N^F&px^V z2mMk^epF*l0*4JpjFJ(XtvnpqAd_g9x9pKy)jf)|)p{o(V$|b?Hu9aeWb%-wj=QHj zaqQK4g~}y*tBc_+P6s2|Hix4E4fp^9DbDT^b#PBDiJOL*R`Y>Wd%_XOv7@5bsr&k) zpc8sFm567W0A0k@=X7Y|1+a4bz!P1;pV=lPUBt;q81xr`XI!`kx)Qa&4-6GVRJMQK<;zRV%MqNSDiGwcXO>Y(II`wlfMvQn*a;KB?**(^=-vw^l?a*vm z+jcx2cJaPpqQ>Fk-91eJJqL%Q&uNbuzR;UHyr_sps&-l|qAK?TddcEi|f1bPokv=%5EoDSzgD z-u;$$|M;wF_|K9=1>OgwY*y!Z5jhIHJF-wrQ9Xd=JYP>nDJG1k-))yQq$L? zSud{r(9kN_@X$&-A-g?gcetBz_6{OrHComHe{2aAOO_Kf!3j5ER=BueG6>^f;Re`Q z-O%J^?Zb^&OC%WPViqE>ACobQqyuktLtzMTm#7$8CPq%cdnE^GKRshHp0q1cAQ;a- zaFFykVao}BOZ@a!zB1yFqI`3nhKocB;i*LzEXAf#5g!G8Vc88&M(C(PD;+-pw6g;g z#v&v)S*e@4xU+D~!U$T5Bm9ev-Q@5g@%$gjdSL+s4VzSC0>(H^KlIx+$a7JsE0DtD zQ)^(F=j{^OTt57HDhZlPyOhdqE|Yp9!znh&7tw(p&5BngGOC`Ymw0Df?Ms(bkkt=V zrc($_P?1g2Re^24wc8`i1~bn<6KKNo4BQIW14-kbiHPs?OoErn&X0<2cSs)`&r+VU zJG!b_W19U8t?Xx;UE4<-Z_b_=&)#E`jdX*yxLeGWkTy(pHc0P8V+4V`^CLUe2MWhv zV;dd9jZ9Sp8u%|R`R^ag{kxXCf7XBJPyZ+0ER-7F(2YNqLlg`p2)3|lV0kooezSJU z$PbppFV@K2yjTuDzJ;G8Neryc$!R<(d|l|t5@s_39R|?SByc*yRmtqUftq4cDeBl} z1k1eTJlX9u5{4m5LXiOlchTFw5(*Ub3vBmh+SL@;^cOhvi}vUiD&+|y^$L6Fh49is zpj+6#R5*aYFhDPyg3H~BBS@F)jYMEu=LFxdg*GD)FbJ%|0g!p?3qdaQ(uIZ)sa<;u z4@edzniYBeDzvi0r#Kd6v=n8%D$4m)#FD&}Z+59*@1+YTFBM(7RNQjuLe2Iwp*uq$ z)VEo2$n>SqeC_f}#nm;%H)^)m{VKkGN&C&nfqB~HyJq-%{Rie*5=|%lkfjn2PZAzn zO5FHiV=*N$uZxAqzn__C5t=|NJ0T(|)74*+C9lZzzx=x8%EYTHulvvQ9MhFH`_pRu zqYpL8Ud_8|FA{S#GGIYc;!DfbZ=r-QEm=PpFFk zjV@+ei!iH}w^gQ71q!LiWvZw;eist7N0cHWOC`ffw~dxcI1!|rN~JPNB~O)Yn->~^ z#8gZ0SPl@p17f*Ogj%-osdDsdfA0pBz(fVv7YzT3RKQMc!b7NN!3`Qxo{kfV;Cr7^ zPLry1@yaDnvCA4RgiLRPkLpz}IUyQwE4)fb7gB!*cd!)~H18A~Ruy)t>d-!%N_*Ae z`KsW3*Kf^M#;IT5DJJa06DlMM$Ev|%b*tR>RWDCfriN`DG}&ggIeI|JKWp1^Y8lTt z&PGC|!9=M67pjV9wwhd3uefYpvFlWgZ5ZK)ZY^Nr0{8i?({K^$_@FS{CaCIGGw@)b zU+Lmjxx{KIxm_7GmBrOvRjFNqb=~{wI$n#8(N33<_jNWCl>%J#I@z;uP+_<4*g?X; zYpDewXYNGcI^hp}b1Ho-xWUG81nWWtZvcky`OecPjBmgjZiG5j|6aoWVB@CLZyXS; z`_02~ALD*;aT{deA1PH4zj42LwZG{&p#j_{j?l;XTEOF+-`%jvYB;|e_mx%qgLFf9 zyV-s7TU)m`O5Wfg5^lYJ-f+T`DtQ>UP+X@kebwVskk=!wYc(Awa5fDw>OS4WPA|) z6g&@=#Kmqd37yTuDMB+$e4VXSeW|%SQsg#r0C#LBVIiYN#fPwguU8qp!TXKXS#LaA z{Ewd~>rHdcdNWJ9C4YNMflteY(=A1pTZ-?ul)P!Vs&SoYAbn8Z*V131D^}=J0O5R< z;yM@Sg@?;Cl9d{;zW#pOo)VuZow1#FUKRwuzE>Oq{4Cfkb0&5KZuLk&oyn4j)(OXh?xtm+=vQ?V8zhh5F3$)RwFM0K=y10dXf`fF- z$2&r+WZ`S11_X@!1CXDPg>%GiC$?kP=xCK>jEEunW)EZ)z~3)!I<@`wHe#)#M*GE6 zb>i{u5+&_YZS67>?Q$FKvd)Be5ivoHI^?~#!=o_y(XL4i7?wHSn8?3?ryQf}Q0^0h zdDRz};X6(cio);W>-Kpwxgq3}T- z#*ZufgTbH9fg~IJHM&0c_wiv4624UtkW&=E;L}?3J)nsX!=sCeLoz-H(3a#!?(!v( z+m^|pU+_)a_3rIsbMlxmmR8gbQpS!pGGYlBlzt|s197vXjoTX=%dC++x713xDS?f~%dpQ^&Q zT?Xey!oM%%PuxjJiV#FZ3O)5rT!|2L=9nDh?gb->_t?h^zTexx_Z(r=Tm}5MSi8>GcWV7IA(ze1@h zdK}`my8*BfdLx!&RI#7&1OgF_bmLoiD&Vh)_XHrBo|rk|I~Y!fl#e?0ZfxXmfT-JR8zk*;raxAd?(toAANA5!_aglQAKY3*eekuTh%iyPeO zs+?Cfine##u3Zcuh5$ix-IF^K2_MBN$>9r?xw7HBAWy5_IX#dC01A4e4n%44Zj^K=FLq&V@c=4+oYLJtdxfFV(( zHK%XiV7|VOn5um~k|?yZ3b7OamxX->IP)Cgx0{^d4Gt##;V^tOag#R@JurxbU2hWt z;Kuvpp=ZT{km?6_`t%{6Z0yzADxizKnfEqT7x!*t{_m0#_6F`2 zwR!jC!o)?)M^TDSNo%-`ZZ!Nd#MLj{Ey&^tPH z=5EwFE4=;}r^FjImtFBpsb;c&oz>ut%J$iZa$g70a$S{`%KokDgT#ajm~BJEi4nbb z_@#s2-WgmOzcf!g=Q8f~a4AjeE7sb+k=fxqr5dfUr)A})dZWVo@0fa$;NhZ=SN|?4 zSbwvUSgxQfTluF3g{YRJzA9~g)BPHwvbj}E)mkinw+c^G$TtCz4|nSy9tVDSp8Mf=fN<`T+O{^GAF7$IlB)r`3S3_m z1fE+Bxwg7Xa`oV?RfkWj$8bL*b$-Si_<8)?&$w$pPd)k>kNbJ#-A~5WwZun1;O(zc zj!7`Dtz|q~%X+t#v$@7Ruy(zEZBN2yW&d9nihorn{8E?@E!iYq8zz>1{a&$4k(#F8 zh5|Wze%GDTzwz$3V`*_|`r@4f>-WyBH(y(CeYD>8ZvElrI(O?vhxJC+fsLMX8-3R{ z9zWU`yjINF+!)#V=hl;@u>*fzocl9=?a%8+ezKCg1P?Rm5IuEvYHGN%+R zyW`<|8|$%x`-Mc68SYNqi8r0p>-IOqeSN*B_-_69O|NS&J`3I(qgSM!H!sW_5BF;f zk-r#abSYdD92;wVYw>N!t*TxX!3^Fbs^J5XhV9}H>wkLg=AV{*Ip(95kJAaME3ylo zzHjaXx>%|2y*2x|K)E-utEHt+E1Rd?JtwHH`VPcrDkw*+PgG98;x^$UsYBdPj+6(= zd`_)gJJ4|pPNI-}e*+H3#xBUlB{9b1ry$rfcIRzmWgA>FxPn#5ORO)DA5nU;M}lAK z+K~O*-RwCy8Gd`BNgC8;tzIJED_G;&-Nejh9IqUo&WJ#^zZY^$5LQZoB>_4)dyBx9 zeNly!)yG+>Kko6gvLjXp8Sq~;2p`iCiv)6TQgCWn(51>ugcG3HmjV_a5EdSTS~~ub zc?88Ng%Lbb3&wyC`F_tT@rE-JwRd?;y%FC=Q{i|RxIKEq4 z4UNpEMV0Kh?Ec(Nq&sBS{$!Y<750v;n@AK45~}oVUP_S#i?k~8Hhh61$Si^NlINH4 z?n2FiN*yRTMv|50!CuQt9o6KgQU!<#mWP3GaQZMLL4oDN30gDRENNUVRY* ze1DB;!rw|g4FV;R_9%lfI7OOn$P(0pPZ22BB!bhE9XL>vtPkVtWXoPesRn8=;l$WI;G zC<-7iW+0{xQndJlscZRc4Q0#OdH2V}=|41ksVf1A z=xsu0-+U6XDNqOs={T7nyYnS_GiJ!}ivx@d5pR$fBW=BHwA5>1DYtiBn%Z$fWv6@>8gl zN$se((7{xoo*mdB=);*t;2VU0P0KN}6vy6uaTZ|+!T^i8{h3GS1rN`IO(vcua7b1| zbl})(u4w6gP(z9g1Prtbdu-Lebx;XSksjgNiR&WbFhR%!mIOr|FckS7+j=b7NQqN2 zn$-A3BAfX_$4E6J1#tHXx*ptoF|7_O^Bo@^Az!p5_}+X+(iYDy9h8kZn+`(6k8R~_n-_L!*xkN z+n3?R2@s1^RREd^7j|)nbn|#rZwpT)WtS=++YCE-(2#v$B2gOZ>l* z8qIo`b-Sa&AD$5eXo!W7R$8#5&CZ9&+AY9xIxF<@a}bb(OCTBMwG+h>(nyn zMP_(2mU-AWrA4wZClC>4+G{-7o_ns(5ZR-9&_QWmO$R(!GF8k$UtBsrnB>`z>5>|a z-7*>#&K4eD>#<(tCQ2uhfZRy85n3ZZJSb4Q+T~`L*TCx+t*duA*`LE6HRPP!ted&l zJapvf^HS{F`Wc0`J-tp)V{U3+uGYLnugUiYm<|ttKL$I3&51~MUovhOf1gFaJ+ME| zv_qtf#g)d3Fhng3AUY!T)ct|U)z*tz?aZ(G#ykX^13WA7T)8X}VgI$C4*-_K(3$oU zK$7@-`Y3|m+TrrTYwh^6I#x@|INTa}%i0JZY>btNFF|Y-!8R~8-oK13=-Bdc?y#iz z$kSuOF)Go>?q{6IKCGNB-lq+{7w z;J=8`06aNAdQU-9c+kNSD7HDYqdo*?o8XW?5Q2?R|B#SJE>ct+ib!3OL_HNgy{4$7 zlXLqjas83y`mYBR6xaHTFX0Rzk^XgW{xed%^}qL~>WEvVi4Q3FC*k3L?#+fWs$u9; z_N%@I#T|*jN|3r6MJ{(_k!zuQvvOx5O5{kShf@J`Z$|&mNRfQ{g{Iw|5H~lYJaySt z4>g9#ML%eyC&BaN8f4@gmm1fjU=q~t0 z*yeSObr1EUe__GB-mj(Sb4I~oujbfC$DiLnTr>XA=bTtd-@wO@IwHT`t2^;T5-NQ+ zWBGW98xEIr9XDGGJ`w4zY? z*xzpBcX7<&4uOUUbF{V1R%@O$cL)k9`7gJlxN9{)Lao$$Rv-=D}`iBURh$#(No_LfWdeMq5Bko+xCZ_*oqb;Wv`bqZB9+6u z_9bX90*0|JJ~&f?Sr70H+KefX#FYSK@aRCxN69vVgRnOxUDZ@mqqF*rlr(q*;4=-FrReeknJHAdQiFKOfoxhR64_`URa|8Eb`dptfW9gaUUMH_xf zBRUlL+kPwECCS@ScpgTQe!)fku^Q>N%F{>TYh|Ia2YQ>KH(q;k0?~$W2Yq|pVy3=A= zMYb~JcIL0H$M!QGwzA>KO~IYA1NU3P0MjH>Fy2jmqR0B{Y{T?}**Vrn@Fi5himumm&7@K< zev|!J`QX*Ca(t3peF>_}Hozs1T)Nv?IF$WaaFyr_3aiyrRmTmZ}pLiFsNM)#)j z>2p%Dq7LqS^LjJY&ib~Pom9Yy7l(Zj(hKwjeP{}JdLj|nk@<~0HCRsUDVLax`k3oG z-_Gy***ZQ{fBdeH;P-Ho*0Pa0d+VeZ?@%Y;?GpS}lgm)AkB6S2X;CIwsan7N*W*NC&Ya30^+dlj=kw2a3}nF4FmQZpR>3*vab81#H6 zNsj5alAlGe?(LEnM;lf*Oox_~cQi%xSo{^?6Q3o)VGeM^dcEl*5i!zMt_`gHHg1K3 zGkp%Ojrn=Pj9AlO{j{^+%)I9b7itmanxA{Dq4}DRvm$oY)CTzRk`#Q~C2U=9`(@O9 zFn$y?FGN767CqCgA%uIOyP4)Db-r|v)ud2FxdZ!doKe%$ZjI{pR!ps?4M+N;?qloTBWv0 zUUE)`MV-BwTlWCkUT;@hei>RzOja@T8 z?SmeaZ>rn(I_>b8*(HAZ)dw2L`MRVkx9NQ(lW%9%y@vfn;qe^T!PB;H4IlZ{Xp&>T zXxoJM{N1}@jA7i8);S9BGzXG@^4z^Y8f5`jHEcGOASpE4LADVqZ`9hYkk){K&v&QO z4$&3UACCQUnDS3bR@_t&)%$RG_K^}yJ3hbmHuq{V=FOU8SK6+(CzjtVrZmG$Usyw} zk00-^4|tlyZ%#C}!yPpPbI;2BSsC6AcQMG+cv6jESSjkQ<&r~?aFC>NC2xo24~g%& z7T3@*Q??rp2(TSQh+sgv%v}O_?LF$OwSTD)Z3>W4f}pJr%{3PYMv}LQVvz#!iYMU= z69a6QR{=4_K^d(5+hI}+P>>w=|7x(&NQUHr=P336?rtCsfab_#0dN>^a8M#n%ilib z13;q5Bp5jHO!q7@;s_mx!w40Po-XfGHSs>J2ol>P51e_SwcTt453tgpZ#NS|HabBB zukMSqiMEuDh5k$n zChG6do1Z$}sQqu&8o%G48nTF8?MO8(Y1Zj_6!zrE=|f+)GVt<=XLfHyyl%z>--}#t zO5)oun3 z<$@qYT;Qn2-J!jApm9jw<>OjP;OM4}lH{R5Sq7YF2<8gDTp}MM$Q)g7k|!4&{R7b6 zWFEOJ2HX=ETMFK0mGWjXQniuo_*6jNnC?)BEjEbev-AbvE|!$=X6+C}^@^1t@^Q(`m76D`c|T0U+kXyS zeK3QZ3~GDPwtg&$ba80&KIeUj(dk$5H+L$~pBRTM)wJ`sEWNSDdOh}6bRl=3U<7*O z6O)hlH5Y$DmuaS|v~R;MLh#aUhO--WIaQGrgzl#&DbHqVzl3fLF_`8OR*cY0aMpcT zCy})iBR?XpR#awq%Bap0s2A9SXp(-N`mdIN6?q*h6u($wbfYw&_66;y?tqY($dpW=oC< z*a*NwG&6+}apeB_kt$^5Zki=>`TX#0p?@C^d4L~UU^4$X!;3z@=KkY9w{SQjbMNq+ zxKoL0gw(wRA}|CTtdw2ytJRad=5RJLAsskhMuCa0li;Xw3_qk@4S&_z{f5QIt&10G zfuY@qzy-*-de7at`T9;d!Ymw+a6u1+GMr!%D~o&Y90Dc5ogdujH32{gMmoX48ixHa zWy3%SY5WL~6Auz%_;ei$=9}*n;w4HYFMJamG#=vZXor+5yr0eb-I*5*4%<7#t#pJ# zxWkQEv+~(w52R~xMav-hG(1p17)35R1iX%Jg`}XFw6|+(%T{M1W;4TosCxaqUQ%ws zmOBGz7x%iVmluqDKl$_6^QokL8mC=CkL$ATB}9Bb(sRC#$T*jXJw;T-g8PquAd86z zFt8mYtwm2BNdT-g1O8u%v;dDQ4U&;UQn_p)tNH*`rpOx5<9Yz1Oh0jA< z*zn(5m`x7*?=AdKkqisUggE~7$6nR%Pg-@6HwqE66&ze$er*h>;tnL!BV~Qe)@J|9 z#z#JI1rP(2)2rX6%)yoh0kL9NIxL~)p^K0B=gDLpyki&ZCrglV?75*|=Zjr*G^8af z@JSu=rIv)l9h%ul-_D}3I{^a+g+bH#k@`J1RtNW}fmpG8IICvwc?|L>HCl}`?s#F} z-Gle<-;`=fCpN%n*Rh}_N#M~Z4Y-mxOnnBhcQbVYXJ1P3^*l@+nQA<@!*4?)=G3Hq zDkn+0ZU`@R^zHf@zF8kv(ZS=ue5K>GqytlWqBnP6zlBZET3~M3OqM&-dNOPpbMRdI zvA1n!j-d+#4&deQhR&@lygMLm2|ms%M^9M1x(3tw!ocG{>^)qJqF zgyH#w2Ey^cm`UY6wpdsUWL;fbygh9F^>flNn{NuiC{0o+o+Gbp5be-%zPxtKYB&vP zoh{xqY>k=^EK69esJTuKuT8HauK=tzvGNMnh)jb z$W!rly6?2d`t^{1Ru)KcN&$29KKN3)%_47KKY60ghTqs)s{$v7_%kC8CaY0o1%Osy zNrr1Ds#ErK2?3qjs8PoTjPm8)>P6ug6nIM3W0Hpe*GU^x+}5{hQ7z52S#9f>wK-@c z47OZ@aJ8NAKj9;?plv0SLPBtNS#qF)LK7^O(6;Q_B6^$h9y^BIE_`CUHh7Ee%C+kC z&cjQ=-D3GD+lNO-Uiy~!qxzArq~;?j6M(+(WL$85myM>=pBpbwSG4ffCI3E!=fXD2Oji*BCwtWH2`?8rXjBH@~>?M0uZOcF|1QeBn)2%s`4SbLf2 zBAqU|3dn;fw_5Ub{u+TSK0u(*L~jac@`16slU6I5ks(;) zD0<^YZ@uiv&=9!Yk*Sr$?nhei{5D4f<6P$gfTJ--J_q;i*IT3Jby)wVQOL3rqJhrT zj~*dYDIc=}{S*4M?mjo!q~#@ALW`9TmOWNpYRkGa2g%eMQwtPzTnziO9gHAYp<*qx zydCjNsBK32qJw!3Dm4{*J0h4Yoq4KAhs6vpY1n!P8ZZsC%)Sp_q^JI>JTG%pq{9@t z`)H!lYlIh+wK0R-!k8DKhpxE)vHd_^D~Pj0k7*_ioA}ToyQA3~NxN)LWqhi>dRo6L z*M7bF*EYie&fNqcm&|JySC)j_)6d$l=h) z^{dF@0x^pgw;nzoxp+2}y9l@2FrW}N3*t0w{39DPuRb5w7qVW-G9Pgj`L%n{5Wat! zCdO#@ax!dX5{8mCebTu$(l%^5&0cS{g4d~q#4BjqtOHv2lDq-~NP}Z}=UQH8h+%&7WsQizpo_Xeh!&N?)*C-4JAG9GmFC^Z@cG z21JZxu&f?c?aZ{Ox_B51+GcONO(OX6bHD1Q)PA50hEvnu5RK$n=X6UGWSWYJ-?Q8A z%>VxK8ZBns`WsQRb=`WEeQQ7YU)^6U3? zsTL0U41OISWRI@^w=hkK=g%h$a~Vp zs{aT@zCYjs-_b0YbZ>FW?5GcH!{_HN(FCQHo*H6Y{n7oY*}g~ST8~az??7f0gpKQ# z`GbceC)ojCr5~PIS9;Jbu35wh=+K7r>I#od!`7=?_8qqa#pnEp^)p)(1WoQ{qcw|2 zZ$uvTqW`2ieEaGkdPdq?HO#|t%fm7L*xl&_252%BivPSlM{3IIk)}9)i2(0=B;fWJ zLOWd-kBxmK2alV25z>BNi}+A}S6oTP#o&d-2SvIGDMq(eFkQKpbC5|ovLEe+RQ(2H zjxbgMcQ{!Dt~+e8N)8!LmCpZ33xoX*@^kq2e=;1xd;IGm_s_X$jv``Xk{#qJ)NC0k zP379M?#wMa?Mi}{M#xkjsf1~2V?}>Ho9bv0P&(4EM(P`C@dE|ag1<^(U-VH}L z2Jo0amF=S|(DXNjMZ4~-?8YX;(9X?EbXOn+uRh&0_UN3PaY6dC*rydv&_gb@>l5Z$ z!f|EOza}^?68hGs@*oNlorT&|-3u9C7 z9=)S0lSQ2K?Sa+!Ogkn=^r^#9mf<+v3+rk}(`$0(Az*5nj3H@cgo3kfdpx=f3c8YT zwm~9UNJ9wBDk-*Mp)zCLW_kPx(rxZrt|AgNQm`v)Nx9bRqM;SG>p*vxS~pZK05?1y zPFmQwy(`PW&t%wY4Js0}TC)twvtGiMhR<(|E0$P#7l&5nMTmc*6>oGg-xmcFsO4E3 z&av`xTtNGkdHocKnBhrQC_Ro5(cknnT>XN zZDS-`UPLt_fA3ahJMoqNS(#4YW7u3ALw|oo0MB-ofv$cBTJ1&rZyP|ShOl?uIsgmF z{(UQp|LmrPbA;;B=a)N6*0QvGUM4*_w_*`4(O07fN(If7D-XY%v^cw99EUgU7jbeB zls7AOj@UbObm0SR&e(sMtEGS|t}4!c({^(6i3@GOjL7tdD*cY#h`}u@X_>dj-+VSI6 zsBpnwVq8#j|M$0D1_&SzNdI~Mpt;4ABqUVuo8m7UfwyHw3onMIj8Y|tR-HXsUN>@E z9!K6#ft-A*(Uhkii3PXW zou1`EB8O8nw~Um%Y~)*c8uGNF>J6(Vs-|3h#I3K@C294@uyg?vnHUg~E#1&iD`#Pv zvPH5f^jY(-*H7<0z1(yWr6L}3)7Pwe+CrDHw6n0b>{+AR8_#Xn>$iZrpmSDs(2Q^G zJ~!r`*@Rt#uNu!}zV8-Ms)9$ty)ATo%*I5OYEDyl7hd0mYMxBR>+Z@na61^VyF#Cd zes2iAef-Lo?DGZ$ZC0+{^tj}dBU5uys9z%lyaHb*XleH!i4tQXlP<_e85zZrr_rR~ zYQrHD>AvM*^UaO(9jJ%&nXMQqBXUt zL#EQzrC5`d#b0RysyV^30WuQ-7^4wiD4xmt z;H5#EnWftaTQ)(NkQywGWh=6ypzMj+$GVm$mm~CN9aIQy2@Vi5(Suvp0^cTtso(-F~(?eP1QleVQV>1 zDg;{bNlW&E@>#cWR%_5|tKWda`oP1#P9xUvq1_oe^Ben6FzGJ6CpFb&uSG%gq@YGz zg^je9{Slf5ElK`~0S??(q1KVxQR`aZ?ArNVHmd~#xn%jCfrYj=`P)a@BvSfl51$db zZnOZQ{N9JFO7UOoS9{)gsGb}rE_I3S@;TbA{_kh`{}L30nP6x&CI#NO%dSVmnr^P6zBp~mj&aYeI18hG~UgJF_il0vWog|3^Vf8CCh2q z1OpuR&N0MotxhKYrCJ~H>uc&JQ2gG}hxU2jIX7liL4KJdlH+pG9l!xP>Qv2TYS@b^ ze9YAHI@F<7po_9YMH*Z(Q=Lfi=hTrGhz=P4yAS$FN@Lwx)7)sV zy0rciYEAaydi^Kseq~z@!v59h2GEZx4Dz!5cNCuko-An=N%)@*>OcB0v|CPhruagL zGqXXl$24{lo$SHEis=N?PVI%}+z`d$fZr>4XuhJuf6ck0KUO%JCalUh-KloV=lcig z?4j0g>z7!wZe0J5b@q1H+sFSk=e~JWTH|=#tJ?>k*SsmO;#Fv*Bz`L1*;N1bK4hJ3 zy{nA9Ud~ARTPNAf@vm?pY8*YKhAE94`6r66rSbhhk-_0f2g7YP{bH`9z6)*T=nrVsm3(-t72jvfb1gJ%?7bY(qxSJ~Hj;1Zip7Io=@dsy zZ}!P|)I6k^9b4~7+LN(Pd*KDml|ds2M3HSYV(OJ0nQKnWHdI$q5E6XrtT=D<+#+en zplaXBpy7*P+bo?|w9VVX#$PNNVEoQ8GgxV2@<@;QYlle4I?GYa5tYuuJD5K!GO*v8 z%GJv;81vpeboXUY`TnRe-+kE?ufv*LWI#kzzxe67fGQmybRJd2u}lBJ**bi=gM0wF z9j$S1;)Il1;~fQEwcujOt=pPDdGt#s%S`Jk;CE;)%QHEL-h{^;jNf(*@jPKF@}-jh zpt+Zf8-EbbED$Fl&gvYpcvrm}3)NLno5Ub`ccI0iFoL3R+=GiXSqMkC7=DXE7#PY# zHM>|_gy`)uT;#3r!_UmY5~QmnMp8sEBaJAK#PJ7O$LW?Se52utLzpYf1iS1vP{N9F z+@YkOlW$m?Nf4Hs^=!hVAud4xc*Ug`>o_inWJy^m)hjDg!4eg#&h?iHYbq&wtjf+U zb5adzE!!#U=bInlT3C_5R4rjBtS{bq_7_EJ4Xs;HA$D5iZ9;pq;9|O(e7;d>=bgGrEm8YeiR$thHr1sBqhA7ICz@JI=LBp- zYms1j>G}tnZQRF@F7bO2$Ucc)$xZqti|{3w5A=w?1MFc%Y^HPFA(2OYTtbDsl?xyX zJR(tqCZJd==mI)~u!Sc#q>D&C>#Ji%kkP(0qB%MD=BpVwDQ~#00y)W*XDb7|6D^J==Ny3G%~Bx2ENmnxx{iSA zG=&K%=^|j-l&wD_DB=~%iPXOG#9oGtS`0pGo&Zvv9xapaSDS=n1%tZI)wCFR+@+> zH|H$lDO%TihlMLUna`Mp@UCtrj8BnGHvCa@s{GzHTz+aqfOyYHiXNx*MKHTl#A=B` zcya2=QanQBm_xX5Im^qdU|QU9>2O#;yI_z97D#frq~GraJ#{_B`^cz3AHB@6iD^s- z_mHcg2U_R*%5DC~UCPNDsROSa@73N-R+bq>yW<%klAD}QJV?x5PA75$bCwjMG5%D4 znOBJ(a@IVo$Rc-Zl>}L#^#gy<;`AmCu)8hwN8CYkJ659li}PDbqU3neP@hA$brp|s zmc`~@Afu#?`zK=!XXNzfU?nI01yP(bl$JNYsXi;kNR=U5Tn+T%M))r6VM+KD*_lAb zVV{X<50%6oGwL$jEM^AnxYjeddK~kJi@%(rnynfmGJT*)LK5HsO!$6)r|G(AUdna# z3AJIVXCKA$n{5=;<4DBZqjGhbQyQDpD2n-UjsyiYS@~ZAkbK|qm@5~Vb~j5+~_Y zxD5h~a0TOFIa1C5>;*mOIKAwsIf~F4hbpxi!Q5-1DBfc@YJ~oX#+c3Ex4r&h_^>_Q zd~T`Ut(mGHUn&&x{rR}^aX2_-l_>UdoA^x!g}MA{!QafpuC1;~Ql<^evnG=wnRCku z`flk?x|6;a4j?}m+(J<`;e=e=gP9$;lTR}zMVyYdDSOJpXrc)qwmDf@VTxUx6{HHC zd{>_o5fgpkn2WsBZ)``D4hK2?q$#0rc9KL<5nrZjSf=xuf>al$OS8&9D{3u3 zs=df=Gb?^{<0yWH__Qh2z%P;>Q!*!3S#7U-wE=sGUM6~^)85=cPbkX5R_;CoNf)vYQh6yFm-G^{BY9P|3$oZpkcGQKY5ZmMlMTC%Hbx&U31+`b$uiq;-g+% zBa3DOxQzD@aTO==+vv#T^^CO74` zlxh$sBXFe3GK+EH0vd@>yo2=C5LcOm?M~k*lyIVc4U_j%xzH5tqY0#84_9FEfhgf zds>j4&dhZX$#eRVE9RPa{EDcMG~`-onhX-)p|c&^O@)Qz!P$V8ZvK1+)+najSHDb+ z+MHmK{7|Gge2c52l=T&!dbK_OJH&3M%=kwcN8BW}D(~7EP`H?Y%{x($@V9j~eHh7$ zW!rN=^HPqmoHVbaV*k>}$3Iwk&}=IJut&@Ws8CU2Op$N#<6-sGEG`Yp zTUE8mbKNR$YfH3$lq}8Z-d=INy*jJ{(0#$M@lAiu%|g!4KW=a9-ubFHNdV#StK2|vIb5APV5|INDfdSJ^gdN+pRCZhTA>$E5uh&k223K= zL#d@y5Pz1NU9GgZRcX~xY4fw(v`)|x$8O0}0h_9{JXz*)tLkJ&mHT{^hZXwErJJYq zs$J(1K3A*#^s0NP)q(TXK|ia5JNWh;e;Ng4o^o%oLW}ov}k_F!OW?$R(%4qtb*h_(t zwSNI@R72`2n-oS<>;#|!RuNdT`L%~&w-aGsLUy!`;k>r(|FSMa@#S3XI=UPT3TiPm zvEY(Q^f4xn7cm20T4o&TuXRr01LNfRqy-?HYql9?Y9_F!pdiz)UH+Zh00PaHsx9-KFtH%p=WfYPR#vvdv+3 z8Pl3Qzg};CVf5){EKhfOiV#bS|#=n!;r*O0P-!!svvIQphRkcP|s%{>V?_9h4|keu%(J=EXS{_`!l5L}*U?qKV zkG0UMu4)i#n#6RT!d=vVl_V4e9Cx;5saix_{a7m`c>ct0B#+j@-V%!x%ge_85|6;F zwcA&B3(twMq${kK#`akFm0f_=ieoPl*DR!|W{MvwsjOGms}8$XN>vxO{NT}oUI`iU zZh5~uS6g%Z`D9&v%f`k%E{F%HcBH-9_;B|fddU>ixx4Z4L027alh!AAezURnZCyQa zn!*lf!esdFn~xqn|LM_7DCJYj!l9>XS5Wn;sL3gbD zasEqd)|-2Q#DA?4nBW>g@gIp2oZ^GB4hs z`BhF$4J1l9>x~?hqqCUZ6mvbv|G~>FL*7{`4sVqnhm`PiDtGngt&GXQ1f@kj1XJM7 zY3sjW;A*Q*^IYwe;lOp;ISUcBYnESq_JWn}9< z(ZLt5T=ZSlHI6?6G^E#U;hi6d>9QP3xF~LPn#0A#J@8@KyXf-g7EG-maK_n+pzT$@ zl&7RUFoGrVnZ_InTHgKhmyiuKl@Rb2+)q?TZcPlg>1H$7=R0m3bpi9bOD$-=quKs5 zhkh*>o#3^){wcLd)d~UKw8t%Kd zZI9u=J|yz*GQh#5{x*VcNc_Akq*n#zIsqRMIDn%NeRC-V5fM9K=-hC4QAgo3>wDr) zQ1f80J1s2>ZmAKJn=lsSiraqV4^)BSc9UqqZlA(hjvn$#wE^1?`AH*#-~Ov^WuVyb z4&vMTxtoe3yLLqeF$xZau0eBV6>io17KVjazh)YhT>7_4Vii0ApgH585epSt8G``V z7b_MxN-VduUR@szTbU{>Ef{_@WrWKi9b?#s;3+qYPPZ~e2E%fO5;G1Bh`B!Z={9S~ zuyJ9Mj}8^&oY6?L%&xWt($5H7DN7}CQ*(Um*sUI}_7>?H?=PFs*(@wLyA$qP?VPQb zR@nR#Mg$NwjeHenH3N2&jz=6|c;vGcDrf5`jq@d~LAMPJp&3++Vz_)yJ|I@Y74rFY z*Oh|}gvIvo)bvED9FpHwZTz+z8*=4d5Aljuoq1pI!$53y0(bB?M3tz`m$l zTs#U2=~Q;RS>L|1hIsntYv{s>k{b%}1waZu-V(Mp9e;4byh|U5fXhg31*e-*oEilq z{o`sJr7gnrVNhU=d7W-;bk`)jHr6jF^6T7aLMHKfgJ^JB=HG*7xy}lp7+} z%ghR%;2@HtOjsP-txsDhL*?z|rPM>8rI*v7pn^fYD%jgw9f!uosqVMQ7AKz9Z7w(3 z8H>#{`03-Ea=0&$51(bKr)f?4wk}Q8hyJ;2pV-5rDV+{&XV0K`gG;e4srkRA|0Fjz@ozL zcxBzPm^*i{NG^|^C<1-&=v!-=kuyR3rN&u1VHkcZg=*At6Z0<_4G2^NmI3@f2jp*E zz+Xx@wG2>3vy6xvqJjG@Fuv}uob18aH8SYYd{{XYEobz%*JLzbsCKycFYad1VXwcu zCQFabYjHTmUSi%NmJ6pl6=^fq?4ynD<01n1Db6uw_jVV+Bw5nk^{%obI?v{bf$O_@ z=L5doa=mByAj|pO&4A;9uiBoxKHI8#w9W&@kuWUere{~xM^|{M^13PLZKR3I)Oev* zz-)`HH=8H?Ffdo|S|s}jqh0!)663^`ph&UsMSr{fIc%{p)!{PenIe$xh5`o7_jUc~aN zQ)g%HzwQW~n2h+vHb8oEVJEnW`}_uNhwDh2{-l}SD<5!wk2aHEj4kzlxe$-E4Mm3Q zyT(3KQ*?l^2-qfhk)=L6#A2bz78Sj$0xMb1G{y^_1F9`$-a|;fF?71FeI&MV-3pn=F)b*^x=KJ=O4+71qj=iAqmlwa3o&jk zWo3Ocq(;G%SS&|NQWVc^)Yeqji2>Ezxm<-ldIwS|7>>?vOKE}o?W?AdjZLBuUOy^P z@smMpDWrKF*Nu8yV~ja+Yr$_^{{|1N8BuW{N zsoCp%ilbWSdc8V-F`u@|L6I))p!cU0aRY?c@F|QolLS&SzvH4A4@aDjP1=dpBdYC9|sazb)P;4c4OPIbcES#%cP_@&_PLi5kG`p^x7?VGK^Y_-ypF=@gXqe5ty%P9Z7s z>w62i>o|Os+68-V_@-m>bjHyO9o>&NMjknzK0F3t6Ah=Q`AtQ7#{q}M+97Ng#s<<9 z;5IZ8td@rBW=1olAZ!ZmAb!onq_hVq4#L4R`TDS#Tn6T`9FQl8$v@uT%547%UtsR^ zKqD49zI+m)cd`aiMGII-dHI6 z@H+_|-~-DkNvl#uK?jlOWziivn}RVdS|6GnPS3@Vc4u=>Jlif9ToJ?I861HOUd)2a z0IRk`k`<>9@9bE$_M<}dT{>?eBiswKgk}M~mY9vb#226o28b)=^at|+RxKy4zH+{8 zI=6D7XZXN=6~8Q+M5P>xg24TTNPs1?hj3Ay>O=TihEDg>;Lpzc<7BSQ+McG@n0MVb&sYzrvgNAq4Zi&-(v{~8&8NTmZCR80}QD_*s9pRusF>0 z^E__gRc@_Q4l9>A+!GoiZ-&TVg6@WH;VyKNS_>wvfi?DCzr2}R3XT(qi>UQ`nXl@> zND2W;c{qSm`Y7^9$NV=*|MBx(zoWVR(qIn&`B=8{(p2{)Z|t6hvf*lD=5_hwjaSo^ z6EKfa(VMZ7ANLXr09xiaZ(jq@rsOGOeR6foSdy)fjkLdoy1rK-@r`b7xEDPi6k6KS z-1f5AD2M~N1_;t_kKYd->|>b}HpbrJVFC6a6n*&Rwn<+*x#K)6(L^uoZQr2q)+56H z0OjyeVT9@}Yva$i@|Av|lMFt0$8TL->|~}th+4CL_cNeR68eMn4+sNwjakv~>(K*> z&UPlCipTz|Qmp~ioHU5!|M42)je}eM&+_=c*H9*wMUUN|>SdfQ@BH7_keXYDjeoY+ z*ncgL=SD0u2#^Aiht-yM{!8~9FsmxxL%&Q~H?J@+`Fj;~A}`%t9La#?O5YQ2tow7M z<^Jndo0kbH8eSysx`3UHes<3Xwrvy`hs37(#R?b0&^9TD-THTf)O6mzRzbdriP5yl znIsCj?!=!SV2Y|HV@&z?CuuyxqSh>4vgo$$<4bn!jhY8XzGtGM@sZLT@6JDN+gkPv zyGu(9dh=8dT22WFcUqqNINMZV`s~T$%ZV9hkO!904X=+}I+!+DYxY~N{0^q59@stY zx(@j5c3NzGy0vrTptF(A69O<<0e^grCx)kX@vqlV&A@g3<1R&Nzd&J`*5rO~I$CuB zO9cFhFfL#KUs0Z-KyDuUJ4KbK@yc&Gov>Q7oT0zFzMM&9Rap6(?)jHI4NrczZ)}Qq zy$;GZacCx)$Fyc^Tn{K-exJVv(4H0eWP>HAUqAop}D_+?h%D!x9!QJ5^?sVUvZ)hL~yN(GJFT6*c$+Q%bSmx9sFrZ%ZL^0Jkvdm z2~$w;IoSxUWeslqJ#e1cE&0Ja^T=Z$GF_>E%o+6<@xhqd4|Ppb2YxzmQU?3a_Hr2h z2=Ba4l#s699zhEzQw{n%Rz547UD??pYB$yIJmW6O-ZGiRLgcSTs8U>UTD^taQF$m?&apqDcE~NDcRogxM zFjW)il;&Qlk?v|U4(7-W+n^2FIT&$&>t!K*C*nFbJA0qmk3mFN>|1%_&rfVTk$cd& zGNNOD^51Qu94LG#2USl0*~7wt3;%5s|M45Q1(Q-EUdjKb2F&E*3Wwmo%oC{K!)JmV zUWOcoxJL>X1Xhjbq+J1kQO)@zG@G7kB;2oHk!llG(1fL9w-R4t#*e9KQ#_FS^745L`<4MN%eaoBidq zdykPuUtjfxGaYAau_|W(imoQWcrj@p8U3vbT8`49QDHOck*ztb|o3~4}Cz7?f3z2LE7tA z7kX|(g1`IknOWp*)Ijb`|JX^K>zac#mti`t?Cgj2K~u-Vvi01=D>H~!ykHc4ATVeA z#7EAf8P|C7Sm_c}%_Vdg|J>y}#*<^tgRBF6EfYq&cpfmBj~_p!1#^sDbjsWGDi(5M z4oL%Ups>L>gF>JtNo&Bl3?ppNXWJ1OjoqRga7L_w#L5AE-2CKm%#;S8T=B7? zbGJjuw2SrEJsNyGED3-wPzRu0053!?E5N7XKKJ#oXS&E!N>sgBXfU_l8>_zidMh{2 zH?#xA)`#kL0A3<@X;g0y$1XaUMdwARNd+;+NtCAmFe!g!>?E$6ENvmRfYw@0;*D2Q zI4(tk^G@&dBWJ7)GbS|%<-Eia%?VIeBi$qTPLv}aLM2V4|`D?7$B`ag&M%pfh;;vc;O zI(suoSFRmJof>6U*w6gp&sfyc{UY9C`~x31aXJL`Rf{vmztY}du*S>9DX~bRgV=O~ z^|C_n$212VhbuP@5Fa|F2Y5_wWoY{?Xl3$?A2aJG?iNG9^xlPPUd7AH!>L99q2MUH zUzGU{VS4lNccR3h=4UT5Pc!34I(=$XenAEdbcB^aC_2zT$q59IH{w*sBxqsFZ#be6 z--CMi0b%LO(85Mvps0hDi6av9M~GWJh^D0qe~D|9*t>lc~G4D5+3^Ct-b zL$G|8;JZ~lFYaMQ?BM0bxeH|>Pt_1I&)1q3b0ISPnnTN_`ML7* zl}L*ZJueboB?yo&D637{z6o0DRjrE)hbI@Wg0Qrw`_kw6w+5k?HMpM}G>}ghS^WEo z5d*In>_3wzF@z_kJ9>s&(H+5fSs>}L=^EQ|fsx|J%B691om`p>*cP~o60lkN5du1j zVlc)C2NGI8Z7qu?N%;fXoZ;0@p4mcVJ23@30KS{b(32Wxy4_3cppR?oBhGZk0pzz; zI7+pL)5#n7eG8e3w+7O`+u0Nl>E;I4Jm5^o*_}5E5}X}1e12Apxo8F}E7R*@NtX&s zk65X1st^T--PHAFV~`brv8yVaBy6HV#Lm}KNWhb|2q{Wv)*S?=KqYKVzI=O!kQ{%! zV~+namjUw6-6MQ*(%}--4r_qlga+s4&;v*J<~;H*yfOS^zrm*9Xo09%;H%qt2S=_3 z?UKCrGibABpCp^5i5UnquwFQ~H1p7)$t>OL;SI}5db%ogzxO!1Y$u~%HYha3tl|#3XO+$$bGIevauf4n5ooEfGixHXe_g-Y0n3Pe(ah zNq6PyBHeV`dfsIQ57a)-2R0Ez?FM;XYmJ#W5jm=X0^C-6Vc~-uaKlM>o!I2qBnABW z?Sp)IDzB!f=A^vlGu`-Gtvp(Vyqf-1l@03(wb1^h^@^H9nnm(dMQQdAC9v@qia@?H zd|U^Jqb}Ts4(m;-0GbbH?%zEW9$5PCp}82Sb`tt$egy_r-TIG@$|YmICz0)fLA$yV zrX^qjt7y_AO^h~t+#)g^NwvxoWzj@4bAs@efPGXPwe);X>V+4xPsUh?&}f#;n<{ON zws(mJ&~xK3Pg^V@ng!3lymr3ki7oV_L8qJpCC+zm@59Mp_^frbD1Ptct;}O_ESLud zFd8@ic-YSLoRSQqU-`@f?5n)s)YpWlgRdX5iM}OM@$U$h!CDtS+!Qm{hFhE&b9IiM zWzEP@-f%0s;Rp@(gfNEgPrfQ|@4S@Z3_s-tjcjc7Og$Vu+F;9Pp(45!Rwyfmqj~i_ z9qVb(decIk*Es=!<3nW1#-1Yl+8o2eT&}w-KpoxhKjy^=x@N&8gE)?_3pNK1dmxzf zL6??26c3m!G~>g^DOC!0Ua($)s7dGyXhpsv^4cX)jRg#IZ4+2d7C1ytI^3O7Ie^GJ zXdg=VlLBTc+qg}N<)=&88mag(;|_p<&DnMJSLzEGW*moT_+yvv2=dmo&q6e?Wn=Z=`r_X)M zrtN*_de?d5C^Yy=ixop3c+sNU^bJXQdm~^5oEc_HK2_qy&p8*^l@Prt&cV`%Pf3~5 zP{igHZCggu`I&m21yZ zDJNUL0S%;zODaW5rj5!ucWmDvD^F`L0Q6Hw*;Ix~$!|z}0)EIXo$2em5`A~BYxhgx zNNlHI<)#~Xyw>s3(BPR^7AQJKNn7B>U(d+WY%KCk!T(RTEDm0+R{y$M|5v?v^~i_2 zMBLjA6eR#WoPvF;G*Gq-gd@JHpP6h3WE&h_ZsD#R%}3NC0;LAxBrmhDRR8pKc&k}J zG%_3}eYMCBeZjtqQDe?Y9DfJUIIJSP4haExiyG<(M*IADFxNDI&C>&3bR7G%ZvMtT zkr5zFr9%3e0;X@5arjb`Aiy?I!$Q2ba5C;Yz|@nQoHvJxN80wb)QiwqVQWaA6E>c( zlZhxhvHXeiI5;kSu-&~Gn8*q5#Nmdp7u@s~8e0?gJoy)?M zeV2K7f(2LE!kNJ)Qu{t#gw3YApey+wsphRgrs}`>{ z4^BSvnSKW$3<*&N7)jEuXSWe@seBr9{^YKD&_KuaEbJL8Jdj2NEccesHvqK{p5?8W zm3X#~%n%r0sf=ZlOlm84HGX($?tT6^rt+E5iAskd+C^#;T{L(8g=6dCj9y{y!T2Lo zAr6yZV;<4YWn)C)Rrp=vC?!|wSiA|CjLJvZPKRGiGbYM#ss#8wk<@BMNfC#SA~8h# zR*%kJ0ve*kF^s_&im|ChT<@ncU6Ban9pPS!r@KpxLZD6GD z{yqe#VoOd$YyG~09<}B_!Sa#xnmrtvg8ZOOZkVr#!yB$))aqcXh`eoAJ&QqKSa=YuPPP?F)Wq zBYFp(SC9f02)ezjT)?A?RlxKQZJHDbdO_@rTR;xu;SFVv`dG6IjLI-553YFi{Jd5m z-cnm&FV_^nzPqa3fBaDW>qf;g_AIKg_@hAW2aaK*-*1iI#f{iVV^_qEWnSmI7IiBo z#oz=yqxfEcdWZ{fM&;15P|V2F8&wE=;mNsexA6lflOLBqOUgkVr^W3o?zen;-HIZ= zesV-)?Imc`I1hJgnU7t|Ryx7$se3$Tqul!7rrt>B#a~P=xnSQnZ8@xRqyvn7m;M!C z83+1(aO`>kdtD!vT1<)AmH<qMYG(RytBDue`#;CVkrd}^PbXsc?ullz8-3%9QwKL?HDg>)s|^{ zs0-Z0^UT`B_L$nmtq8T}kuuE}66 zfdEIAiWf~4zfmAWeLWBpCh&o#J4nj-3yvVYl*0?`(Y^1asp}y9|$1C z>C;1MZ7#S&3gBKLlL+mCuKR@=4Cq8I)#Y|7>_M5m2WgrjPW8&D;A;Wz;&wE1$UM|BzZ&w3=IP9sMR(!nFGH>d}bVE<;WXKjuh< zMHVh6CHLNZLSU>@YQmh~5iRmqa+zrOR7sc_s`eFxf4 z-Xe%O*MGJDwbsW{-t9M$FdzBb?EirGsZS7)wo+x%IRwyYO!X-!ldiIH7|@v+Gagr2 z5W~?03kca%weIG1>r}Ol$Z=K=pPX@{H5IjJfP>#@jC=qW!2@LW_HIFd-*Lc@X8}l( zq9Q85-jCt^PXE`KH!9Ed_j0t5B^(`Xa5T_?%h1HGy)^HDxq||NeuFzX2@A?w))Spg zM3Md33hMQbj6@s7?LOXd{cp3eci@oRDJ~2LGc1k`+Sp6Y^Q5CEkU?;NdxL#V$k5@B z`xRt%UU(y0G15Pl6*T_2N;?=Sct)FJe|IJ)3N$15Ss?QJJl&iere$bWz=j55YXMJo zIFPF`Rm~y}Q1qcMv6Dp#l|T3ZX|)|$U@PkUXA=Wp@>4s@pA{$&ThaU3_#(Hiy4(jV*MF`I z+(#r5_DfF{5d;^j;?6;WJ6y6cnxPp{dlnDViYCs_U1AT%2WQf)@}|wgk2FlD5*9M> zKeTPnY5VyDkb>|UM5+^2mUL3I4cC9M5tII_WfT3Vk-rS79CjRxJW(b>Zo^BPdK=$O zlR)&^DT^#11*e?n6BEZ@t~ixY;fox?84Q}eV15conues!+tnNb5eI9C3hDgHS{ z58^N+N{l2v)8mL)dME1desn6Sww;B`&?AyQuJdbb2lSueyKOawO~RjnbJ7B7or9W2 zlJ-nm(*!j~IXK=x$d`3EyU>52QaVTTObJ`Ra?^w!xsnNmfT-6+<8B1s*k5zf)q>@~ zMu=ul=hg%lbT7D%$8AAs%=BO%Mg&JS3RE#sS`ph^MGJi17#ZV!)>1TKjiQHTG2%regolsk`QI=pbCd_|I!$=`Q^^!-Tm3a6MDPM z9Qh;PXfR?O2UMdQzXmwCi^Dg!P)0&?-l#j@n7w!Pvp@WpI2;q{$fokX5>01`o!y`c zvLky~RG}r^EGlgPE%p##0t5J)5KwTWMO{RiaVj^b5)A?DC=8jr%mO?wm_lcBZov|W zT$~(4zC(yg6!|w$nqlU%bz`VB_sT~}LS zAKdcHbKoRDtvqLZh5b$AnCX#!D;1K!MnW8%5&SiT#6g7rV^BxF`VU8qgAb$JSNpsQ zTts_3Tu0Dx$zbe9hbhQW%jrNwi>)i(1l@OTJ!!`RO6jps(>ehPOTnN0vL-t6go#738i%ipLe#C-Hi;^KJjcU{3ss?y9u%+_FI zaa<4*@~R^(iI!cgbL3*X#;RB96Fhvo1Fy?pFKyz%-L5EOm7l0|@LSw+)9PsLL;yzI z1n&P_Lem=uDt2GK}K{&$06|LR#fHVq5P@epN8%I z@y;UZ!)mv&$J-ILQ*5G=MRWaW+kyu zIlo~su*ZhquE@|^*ykhj9uSz&$T0LlR!LR>KyalQ2?%(_;=f2GS>Z6evCue+|u0hP%^E+(yc^ z#u@OVduq{#3m3!ChMTiH6Z+q1u@gu3+d@ZmygoNl;BG!mDBv45cf#;zf%)3S!k0)u zyUS%+#^T$4(})-V&Z>38sEwmWz$PRwhlV!sB@Knc=mI5?J^e?3$t-KqJiuVn;BC|} zBR%D8W+^!reillU*anxbq+>MaNuzgTpnSm=U8zJm%6W7R`#W;k^e{kI_dAOmHg=F) zBECnGj#a`a^@umd4pLhHg9E6Yg;7KhAFi5_^F5~KiN5%a4N?qVQx4eS|H@@V#aOQq z5BC0DI>v*Ss@OluJTdU-k)o-8Ij+%VJqc)}tou;yUmjl;j{q0*jKNH-@c>D4IE!Q# z(h%v|9{=7-RmH2Pb7>t%vb)&Hoa=46Ykw!Ir4!=mN<=Z2l_Dv&_Ukgw9s z#oHSdGYxhfs4jh?JKxEHXvx4ui6_;k4cPX zVfBY0F1I}{chS4cMM_yxUhl#Dsau-9D}Z3l0}F9 zEE-TLP6>+M-S#l3G4uSD1TLTQ9|Zj-o3Oy3{|hLCfd8-Gps?(}zAb{oxS*!*zkOR4 zjZ4Ow{+)`s1COO49)-J=!#T311Fj0&>G@`PvLSeot^VJ9(if{TCT@zL;i(x^ zGMb#io%$PjXqrbZ89BN!YMxSH-^Dvy)fRgb_@q6Q|3)4jC?0xm^;{63wt39&B#1Uolp3c>a9u4r zq$;t<8{P-{wq_o*KWwmmyh~Tgw-VvjFZ^=aDf?G8v_CTBOAkHsBTG1R%JN8Chn{zEYqy4XEUWS(^ zL4;C|Hc-#FD0lGJ6b0A!ZM&aNXgre|)}g$|h)0{5i$r7ucF&s!#3ha&*>(xz(%#7p zdz-R;osT2n^GnTPT*Rj1a=P|v(y~PQ!rgb7M?jvTQdE03n5zPW^s8JII9{L|_~L9H+QZlTYa} z7t3R?t<-7fkt%acgAYQj`N_G9p5f*0QbR~}_!gNZoRci8bOV@-S80`h#8AGZrnY*z zk<&Ld+PE<^HK>*5G{(=4FA7xlG5a{8T;xFMS1QdVvj=Zp`VjP(+4Zp@d?s6ik?(c8sX66~Z+ zZD056mgpvtQ;b^G(4*k z+P66>Y94qXUt%VE1N49~+888g=fX0y=jNuDP1R)m3k&|)O=pC_>s+>UOyK~*LB@|? zWBOLRwx*mbN= zSScsEJDRD#wlQvF3kMBPKSR_m;-du?Y6i4w8q+-i9D96ZwAcWND>*%uj{>Cxh=m{x zX9L3REpKA3uC!0TU*mPF;r03{3nKlb1T7=;IxM=`jf;s`4gzI*x{AX9F~QAIN|HQ~ zg|nX`Ua&d;lN|#v0569gjx+K^p=t)jH7VBZDR@In0<6$x5-T>6RVf&!Ir9jmJ|!~A zb%++vZnemL**iSmG5{ zGM2W`&T~VPx#bVzsPt?(M;cQ#htM->LXveUE(Q2XDKPp=nd9pa$OUWyE&u>zXP5Z; zQf?_lH6}o7uy6&>9&vnW3>F}A9QBDmRLr29b|?iWix76ASFGS{IX{i?PU+ct*OT19 z%jBWHaOSZ_x5(-Yi6OEc{d)`qV6dbj%(P@#(nHWvY=%itO)0Gdg)hP0yuJ(*WK&b3 zCPgjorGH$tX5k$b=A!Qdn2iG2-|Pt|41m&WU@ncNM+?pX(Vl(SB^-=nPl|6u6wdX{ zfuf9t3AU&~m#(U-9pMDHUEzRwa~p>nrz5KpHbLHj6mQyj=9GnPom2kEbVYWL;5CbG zL3bV_H)^tt!!Z+GR)4M_iZR@^AW>7E2waAia<5PlE>DLf3vEI~O_O36Kd+<*;ww1g z9Bj=;7zit}sZdl+FInVdeyVMr+BM4_6~UrXVeSNhc0xDH04ucigN%?C0stz}(N$Vp zd`z7?8pdmEM%cUBC|qdd!r`B9lO^jjkU8M%oLLZWxU>pF~QH)GCb2Szkrn71ndvS8RvjXtoKKG{~+>b)N zC6wk9R7ZjlPuMGYAfIN>%#5vSN&6k3N;uR`u{W~V*_i2EoQ=8tZJ+gU9fuzAP)^zx z0gijx!$h+=>(~ZM_A2U!iSN(3$}b*kg?ZN$abWHyxNjx6h2Pbml^?9Q3Cf<_7bOYd zCMWxQeXM+!U(&h;bbv)cz+Q^mKeFP+zVWjI{&HvFW|Q3{I^AXzSk}Zt**_)pmlO~q1X@}lf|PN z>BX@-(AxFo`o$=i)UlqM)+Kq;><+>UjD^mei@bk)N~myrT{K{Q8BnVgAXQ9*3Lhg1 zs7O%GezWvrpcdiT$lS(SSZ zjW{(CwuN>mTYxUI0a6a^6ZD@S@?wfpJ$Nt1L~S^4)yBPQefI64+FnQqM3egIQhw}1L`*y)ev=BLVlOCs?(nHrWBi?w=S z$LuYoZ7w3E4`F22V6EA)22MyD(6p9oJwLGJS6TIBJOxWyor3A(|QE=5XIAluN#bx zr-XY&CWP=v)JiLG4@Ggtqjo5uWeW964ZX)iH8{Wzus4p762l3J5d?I!JUZ4QDS93J z6$Ovxe&@-zd%#Sh3MYfe!(5l-n~}){1}u+$g01i`6%w7LM@V@JW&xt zNL30dDv9ra640%a3g=0ERFKl>m)gFE`o%;cG|*9#aUPyr2c9U9N;XszKHQcDA`hSK zrA-Q_KPRM57uQkJ!!rj^-~E^YYg>D1inT#aZ(N0NKFMO0Z$O@s7}-^`>AI{U<5l`E+3NuNXj>~mC(4^&Q(bgf3>+$`Cq zMR8IMl&C>lY23qVsB$JWiN?L`l@Z~>PA0OL2eX8@BzEqhaP5iS7MY(2=!b2oZ3l!L zJ@@+FTvW9H+uu-4L$V zo}Axz0zf>Uk(9&&jYXBgegI_ps&SvLk&N);Bs;KwDu9PFQ6YZ${vw&%i8()K^DVCA z{n4KK%M-OnMd8T>+f43XOzxkP{}=KQS*YoFVmR1n8h!J@anes7iC>y1H!AE}Fw7S? zd!bM=l%Tuy9aV*9xpXB(tu{Zpu&AT9XmGXwWbu7tqQ20+r_6v$f=8B)S zXO4>897wH9V+z`5=AQW%SS>F1nhSa6P4YBO_ zc4GbW)Qf1AuLIC50N9vIRrkOB199hbd-3&Q)KAyqeng4Pts?w{udt{(!mB(}!V2;aO1YCNn;>h9e3)llC8( ztW?j+`kuQXk%?tJsS!iBuNCI)w`JmQR~G(z9#O57UD;>kZZScLWferW& z!*jV#x_Rpx_cyNctXy3up?nuO>>sUr_Tvz+X;8~CD! ziX0FAy%PSb3*>~z{?i3A(}|k@8%0W69krlhF#wY;zWU2t2%~0g=ngR!T7#c-tOY$uV0uS$?Tfn(6^a6;e}nH$^Pbmz zt9c1#W$}EK4=ACBk(KIT6hR6o)L$AYQTo2{`mgkkH>0f=--WGpJ*f>F_MY!0sn$ZU zbtPddDB`wM}ai1xnEYeLLRT(bMS6IMz>?N4}Faji6)`T)4D_eSGy~vq(u* zKyGW(va>B@DXEpP1aIGwS-UBI?WVi`bKj3e(#EZ6$ZNY_@|2Pf$hzC}TEHZ{!!CWc zGw>YEt>}*Gks>g?W9Q?YiKkC*{QkLknM-^3)Xsp!8J@4=avN+6{EKcczWn;+q`(I_2#eq z9rDe?lG@Wuf-S{n^>Vt_fvK)!uI*WG5AErw9VAAaYYib8vB|SqaOS4&S#gT6EWgwt zLv0Db9E{FX$PeyuFNx^V5C)l3j#jdTNlU{-w1?lCOg&IamJs~|T9{n!xm18JE=D9P zIRT6jnVVuG4DTvosTjc<(15?40~@tDHrdJdD24~DBX(TuGq?24~s5i#*uVd zPxfOQOcejBh0HZ3ggxxi>OIx2;!cP~J}EDzq(r|R3ZUI4+aGvoE`U@iA7!$YY}L9W zSgS_KkI0S51kkbfrayQoJaFGmR`F6BXTYMv-TU$17};EH=OI2b%0#l7a6aO^1Y?B!+)e6%IH*2 zwiggFL&RnBxLYa%?l`%U5?fwHwvYh@2cdgO4T;1u&ba=B`dJ*hswznx4GJ+EyTK3k zFomCo)2E4evR(>}1carc1s@OwntU!DcN!5T9}Ts}kdK~}>%OL3{T8H3@x;Jg_hDvi zoBQRxaOp{2GtM7@<=sNt7SZq{6GwOK2z+>rOl=aA&PtY`xqv z+rr+GNX}3-y^yoK1AIfh2SH%cK_dcy3C9tYLs-*n&qUsge8COZFjXw@!rnj+iNniN zad-+3w6UMaz@jyBp?rQe6_}YJGws`TJUUDgW@TFVneYV;7|()!H3g<7Rw}ZVlgOp# z$t_(^=Vx0t69$9aBa=Ll1`o|NDe4fNT$sqkf_QOmVyaewijWAsTkj^R`&_|xZjDWq z;)yFGNW)msmbPwz4LZ~;7?!t8G{LO&Begb3LTa4V91&AVI*iZKIn0rfGs zV7i*T+5s98PQvy$EU}C+*`pSROA!V&AJ^i0@OaHaP^} zPCn+k`;c;mDnHFslO#a--;BA-Fx$8Q{CSK}|DdF-CjeRZg2+a8bCeP}#SegPc$$1S zpBX*%oI4D&2@J38KovxyM@;u}3-}E*4rxtq{FW0X8kmcPGGdj2D~w#B zaTvm4mQ`gmT6wJQxSNHIF25N8w$&q{#wIdu+oOK=o1IJs5`cnS!52{iO4?hE246{H zP_K9ym#lt6mow;FN%vIb7gKNmMX*|)&fABicuhMCX#;d+tHvbkJd`gt2?`jN9k!0@ z;VlSOPxBR97Mh71(7xFyW1*hN>mJP?f@i^;9$T*9!i&D54)PzTqb_se0GtaQn(L5x zeym*LI!m;E5*83!_ZE4|6(sYE6eHMa%m-Wdf$UGBM8X*dlAoY;5o=MEUS%+}YMY5# z5G_7}pk>`f-B?lVPSj|2c=GW{ywY2>mno5p9+S&`JZBbDtWwFhvRt!H$}u2F7tdS2 zj@<)@0DwfmIjTHO%Asm5z$DK3z6Zz`IKq2exO|#-kFEsJpup(WGqM~l6$vVvXZU{2 z=3`C2dyv?zbG!RxuWgxTL@8e(c(JY|4HynH;=$Gr#@BX70ZM~kn?nTm7zCP7(+Wk1cqU)O7w?Bb)cnO3rv-_3G(J z4l<}6Ovr*=FX~Me1Lz!BHVO)U{Is3tQj_69*h?9WZlu{54u7+tS5z=$fWs9kbCKFB z)#pdG0VuqO6HTN|8rcgDmmA+4y7Gm+5s`7doF|XKbN23SMH}i;THcfOhp1SA?3! z*4}qicFm&1?_cN6M=(4jrVt}0{&|-u(y1+fu59Q)*{ZXf-Jn>nZi}sdxWB(%!@y>i7Tuzh=ygVP?$OcgDUmb|KAJ zvP6xN6w1C=LlmVNW6e53D3vWysu7`5jeU(#5~Z?LLcJ^{O3nA#>%Dwmzt1_JbH3;N z{sYIk=6O9H*ZqFK-RI6V7ya4Q?i6KQUPnce?BDrFeP0$_C5SAakVC+9?UHo~Nx0vx zIL>++MJ3BlRK?E$XEK|-O;8?QCtcf`l}eF*ht6(N$exoB>Gi=XDM-(v!D5lvmUZFC zD$@_=v!E^T2Rh|Ln{N9`&H^f>cG>e&$cZK1s%&woGGxuB=F@P7ta;q6Ir0; zN)+b?xiY2q3rdHIg;NNp^fRH#?rku>_AxPeia>-uf!-?ikt|>U72oqo{F~lkUXy1a znP+i7Z>ID-a!bDL{`^o%szY(U)BSwsbNSYkRJG##?OO`m{?I!L-X|0sxL@EkUT|=u zAT&}g1$`l4|AnBq3n7vhjGHfnj$b&kae=l!|1+<|J3{`%67ITSAw=(p=PSHjhwEKJ zZDGT$pnq-@MtQvOPw{` z;-9i_jZ%!pdhzXzi+AoDJBsqI`d~+vP#SFb&GCyYh~6t)Ya4gNyLnOl@n?5k2y3eIC% zY`R8H;6RyJx?Ejknbd&`|6DeR(6Rx8L1AS`9qvbqpiBQ}LdWY>&%0Z=b+~24`|Gxa1+kZ<=S1xt;Li1?>1NF=CkL2VaZteN^vN6(FGk%N@ zayTMg%wIvMz%?_b`z{Gj_*mW|2SB><>gfUH`b@;)jEFdDEhb77cBqw zD=AqfCig}j8$0o^hgGa%Y$G3Z)HFxV#BX_|5NdF5^&@9rQ;IjWF(zWJQRnrj&g)kZ zT`ffJ#jh6Gy53ELHxHe)dbIMEGt;l;b?fo3pWw^F*{&=Pp?%*b&Ufg%qaJfPl3X3R zU+Ew{YKJxyQ!Yzt>S>*bmk3gSZYX2LLrx{0456kGj~ufT$OeLT#^HAFGh*`)s;Rod zqY_g(K)re@+tNM1$Uj_iw#fL!$gyNz*Pgtrgz(et-O?rGC3Oese>-Z(H`dyHtj5Yhgj?sbPNuUZ~pY}dxW_4|Bp z%w2ki%*?O(!zpbj^ABE}+Pz0iSb;NdplRKePq}eaFhlDaC;aH6^=A)nUGO@y@YgXi zzm#^}{K>+nC7$ruZrmPs1kCcBc$E`#U^+PPNxD zHb%MVd^7S0&iZETX_M#t+-KW~!7YHPBRKAV{qmYwMAPRrv!FY|YZK!3=iQ*;Kw$%c zD@LlA$!e@CWimv%ptSn*aI`w3GA8LPSmIXY#L|yf+Sfn9^##bHghBC)p|4?5H>A zhw8wA!hOQ^4x_?+6ctsjT0A{Z~HcDEOb*ByF?m z857MoeSCvoerL=2!6&z+_O2wmuWmc>aQ&&j7EO~f9`X&w;k|!_95DR-DfiOL(?8ah zH)rqr1!aqx$M4zL(7cD$d>penKW=z==-}3~$-l%)t&)E!5q*CmJg^o&X+gV!N{XBC z^g&zyp}iizDu(v*Rf$doRT`^{#$Ouem5=unbjRyMIrOXKU+;MiCDy&zvr|LQA$a2N z80F40mw7tmTtQ_2w$WcaKDr(ws!WSoKpfKX6|BUEJ-h`W@q0R~ZSlZuLm~k6?HEIv z?Z&$3lhkXtEBrfqsxm*nvJP#rM$ALWE&}?1bku-fj%9xJaIf39+PmrE1F_vqB5f)0 z{SnOZP542V5MANr?kq8BM|*VgN?f<0EO2nx#L*Bt!=I*XRe zpDJ^4qXr&~k=fPvE!zpjv(Ho+ypskwmQ8aL-J?#h1CZ zo#veZ{+T-Ei+vX?W3elJ+UrGzD6xkgdj_;>Yk9s|{Hh-A#<@OZ`Z)^jSca2Gw1nYy(R{Dra~5vV+}%TZ@49A?7JI&y;ssR^2^7P# zUXwgxYbBIq0kf|&4C&97WFEW(2cC^FZ6>vo6qG6Lx;_%@4lQ?5UWVj1w2*`Dfpw*I z!@x=*y!h*qTqmn5(J->EcM)Vjd0RbZjh2d=w9(0p>zUz`WH4bs&b=kKkNnDO z8Flr9hbyn%_+V?Ymb;N57T4ggr&H5aThT$(*SqJJ-06&C-*vBqz?BAllI==h0xJ&f zFQP~8q0E;OoHq^_m$Qn`68-QE*3WL;@X0yjl_2?qWMg&wB{r@Ew#WH~z4-?PybYpF zzM;Ka|u?b?odxj)e zs5u9WLbC>ie09yx*_zGmVIG&dONb8r2VOl>Ju{9H{aTiNcCj^L)q(1Da36kVnc?_* z302`-#DB^m5px>O-g+TUU8V0L3$BVnc;{yag|6#TqGjzd>(zt<}5h#r$DJF%j7vy`-F#9l91%R1LzJz4n_`vZvTO-H6^mhc>@XWNL* z_haHB%7htnN!yG*;p4pwfls{tNqCG4W0>#Rhx?EaP{{g!!acEU}Qf(TvAl z4vCUJ&B>-E3WT*e_tz!wc|Ut0fz8?lMNfXZe@Uz7(>Y$zgVl!s7?l5|&aj zuY)CZ!u*!ur)GmA76<+kUp~bmWzQPSY5! z2Bgdm-h0`QV%qGxv1>3gBd8xzX4SHN4`v@t`#7PB;oj$@S_y@T1V{@jNDpW1Mq6wD z`cyrgGID+Aw;P_n<~@cUj5g_hI}GWchj<^pY+AtA1D|0uJA-yi?{^%ouAGPxm_*(MDMZo68h#fR3rEFLdCUa})8=fw8e|6VB? zYWZLaDYK`bogDvY&VJXAXOJ>mz3b6`mD!v}i@`%b{KkH-H4i=da$@M`+n>L`KQ!HL zaNZX?Da~E)+4Xp(aA@;`1$Tp!^Z1W4JMYQ;F*fvg?dD%KUrup$ z^N%w7a_INkL+-C7D5Uyv7x%|&?(g-XCmT=OxW9iw%B%z(ZbnxYKZ=N@ql@VL&2;P- zU0|I~koa4f^+*tlO^_%`kZMi{jMSWAVTlq9MKgx72SYWMpRdRe6DaqC&X?tvvLs61bbCUB|($4iHszmZ`vt&1q zWcS!)kD}xQ&B3g4&Lqb)x`zA?0P`>4!lQ(huWSmmof(z&p#h=kYf$?Ym^Q6a}w| z(XxN_in4IIKKva-7Wtk~fbip9GPyG#sOea4IkUF7-y~vm?1fY-=2h&%=nd~vjRUXz zf?2*Z*}^*@3Y1dAdhw zP*~NyRX~5_NU5!kh=`B1n(ZVV!*i}@Pn9Y^NhwEA=PQG3_&tr&DJ3@cJV$WrNFD~) z;PDElAJZY&YxG*#X29^8YVA@R*3)FdV4X_ov#j$$w=21<0YXWf!Szmjt>5z%6{}oJ`Ab zGb&yXSHfz0pi?_DD5A63-X*Xa0Z%qh;nZO@6D#Wn3~gr_jO?kOj ztTvyUS7LZiZfSsTM~l)B!4M<@olp7gDw;78z6tk(teJflRWd$ixr9sF-ge5|Fr zUFzB_Anbj%*-jb_j;i7OG?KuHW`SmcMhfaLD!hr&5`cm4i_|Zo)xzq8_H`*oNtf$HfaWYRj!=Ml&+kAfNA<2v``>VQDfX#uOa%puo zEwwW>p|t4tPy{ddbQ(nqW`4R4$y5Pjeqa(C=Rpw}t+wYkA=0;&v~L^qN!8#=v9Y~% z{t|c(xS3oj;=}-40=eF1kvU0^>!>}mw%!gK(?=p@^m%p=y0t%)@$r!S`M*V_5aDHZ z2O@6qwA1O*?A(MnU%I$tL?KK_AB#gwhcDKMuYJhvCE?76yU-Vt%hkNm}qk;&lhH^P*`Nb&RL~nElVi^ zCaeTeQiYfzM8+;+XWRPHMGfZ2+hS=jJdKE7K_^0PJov#)>wIYvMe&D1a_ASbjAf4v zF_)F?U#TFFoQ5>@kPx$fuzGpPtKSD|Ydd4xia8b1fofrLO@Z08bboV-VYGhMk!Gdj zxiOTuTi(YGD<8C`I`C-pA z1dvW7WYG%yCqCR(sV@$cwpsLJwo!-f|0z=+f@>yj21<`pZeez}h z+kB{H*7uXLO-~fFZle0p`qMjSWS@zoq2Cj!6o)-&ci+LK$1Jw`?${+YMQ|`%ZzWvm zP$oK0@!NQ)WV6mC3Qng9oLX;}v|^>%Z;ptK+Df#M9Z2p2(_)v3I!M`dnZeF84b6=f zKi9jhmJ;xZ61ofoZY!B_Su2QRnfNnH&2m@Hq+b7}AeV95=J{_<_tm^y za_FH4Hw(KOuE8cvx9yUak9*s=)#z|ZTv1~;`YLag%ca1mZb|tqC~}kZ*X+1Oo;T}j zjyW(u3$~q+U!%ud4R%?{9g-SR=XT%gbA{t#(io7NtIMSMSh5UpTI^bywSf7j9Ob`k zgvHjoySU4XF2b|&K6HwuW6|;j}_+Ck(l#DDTsX6a%qc!LOfAK%xzlU z(*fSHTE<66k{0!xL$GtEkmf8KnczvdUQt!FoDU42I9G3pP}n>R4y`x$u(3gu%p)P~ z{Pjz=qF*CXX0vVliv$E$tU({OEo6qjmTe=yqJW>pwBfl9-S#g&3+(pEIp5=hROw+0 zoFdL#`{siiqGRi+G8;bll_h>-6?!A#_%xgE;gY~(4(>-OW*BmI5yT!a`5toiuDD}@ zd@!|3Mk!Qetq-oByl0q>EnSLaFnNilfd*p%>V;8PPb8ku7tkw21T7zIX_e&C5ZO!k zk5t|~BRqMM-XyxK6f@|gDt?NVqD0)!DQ3|jhD*ddqO})6VdJJ=)FGp6mlG| zL)2(&mN7catT`+H4?P~P0J0UB@R=U?gC!h$O>7+?@{;hTq$DmAkw%Pms^Zf-20z3W zI1b>uNjw|mkZCgSNtRhS;Q2*_A0px9M+BM-jP#iCQM2w$YJXQWm!q=S7sKG4ZF>aa1<{6%OL*q(ChbL*;UCCnk9}$V%Txr~o?F zkAr#wkn_i}SuD&m)_I=mr_p9{YxEP>0dF@A88nI8OU3OYV>U=}kb90x>N>4o@OG+Ohe*qQP2o^tmPcT@u`qgIr`?uw3Htf+@zq zov5*2qwsQ*yz7(vZ4RExrgn>4U^|2uuQ` z-^IKX`js*^f=lO>;f-6h{+?mt=vpB>_rDq;oYM)qSKe2p^psvf_gs08xKU zN=F6buMO|rV9OALA&V@|;3s~DM009PDnfw;cEf4Z0o(5p(We63++|`^Ll%zvgi*KZLFlTW*cAh^E2Mxzdk~svKUo`qx|% zx}f!V{^8>{t&bLeK3?hz4|i{CN0e^YxS83s3wL#5Yb!{Ppb#DxQrl zVe_}Ju@h{8O*TQMRmiec#H&>-zEz^6Rce!6KHMs|*-DgYQ?zVT_G(kH6qs4UX+*SX zPqgW7wvlAo4J_M@yxL9T+s#Va&0E?nC)%wx+sX0m1*8sJua52U9S$WOPAwhI6CFD@ zJE$_9yDdB2ygJ?EJ3UG|543c8O>`dI?DUc8^0VyPK7b2~?+R(bg|&1=OmrRD?4rqZ zM_G19dvza=?~X0$KH1V8Khb?=vzso{!?5g0^6E*6?@24^Np`cW&z$JV-t5WAyw9}k z&G+iP5Z_x=(tEL`w`8LC%4Tn=OkcTWU!_-H*`iWaN#Bi@zS@bt+naqXnf|+${WTLx z4e|ZWCH)Ut`dcRYA8+=LOF(ZP{}tu3p#U@U-vQ=7#eDxIX|w(=q<0HT)A<)kI~pDG zxAq2S8rI}O+MBC6oONADIWf?-uS6qi=#s~6r}q;z^}&N4*(0FHmMQ==;abnU`i#me zc9)krWjTr7P~UeHL~5pu@PZRA?ddMD^*6?At~nXQS$ij&f`5Efklj)EMcMYC=C!T; zO(W8bH?xO_?cR?zg@P+Dye*$UQvoqiYsL%wuB~UKf%5RZ!>{fIX4>?BjfydNwHvh` zO(ZPPOoEXyUIdrdiWkl6ocBC(N}E&wfgTa)E}T?D*mMvy5PcB_$H&8V1kb75`nE9k z{kKXQiq4Dgyi4I$q}-AQ;b}vzmj>m0Rg5B?BH?yd^B_O0ohUXE$!@{OSw5FMIqvoR zZGzxo7@dLDMU$mC=&yM2>sS3CO2N$rXEf%KIGJiRUXh(FT?w8Vt1+q-9o!Zx1i+?` z5)AXw%O)#9>qF776;x}FKWFNd=VD+kCh00NLtV|$4eSuK1E%z#*?epq6Jh?iM9B%j zwI|<;7S`InFG8Mfr-M{QS_!K0 ztCP>wiq{5a-oTS-$1<+CInb4Wu&$GeVtMB3M^U6U4dHjO@4l>uX@vVwA{g5&}@@yb_U0Z=PpP1w>W=9o!N7s&sl zKeSg%P47Bj-fEKnlBaP8#2a#~W_ODJ196iIk)DeG%jx_dCk*=?FdZVx?amSY&1z4G zl#;cEx`-XmClhKmdj6Oo_%?ugCtp64yFDDGnT%#Dr^fg|>aGY-+*x>D)BB=`hI&FF z*3TmLTJ?*YGIo3Y`tE&FxQeXDO{kIHG{(S>`a(}xMCF7mtC-I}Mu^4<&zEq~A2Pj# zJtwMmhVN(&sdNI<^jGF5YShW7Tj%b%=kU{yjiz-zn4XuW2M>WB#k59NXwD%ug~KiR z&z%_OVcIji?80s1LT)0$o`?4vGK|eiQG%tJre>cAQlMJ$#L8ocyb#hN^yh?zXcCuqPCd#01LU5TgI zfnYSzteBwt)0RS3_(gaI(lL83RZ9?X{DH{f`|u4*W1y=}Qc^fsefP+xmPhd2Qwa^y z9hTZPKnEPi41Zg=Ar3F2Fd1cL6MAw-z8X^N6XpWzIuqS233ud=Nezj%LB;fdMX1Dq zCj}FFI#)nx&Oq9QpqvIiDN*NK zBnRWPP#GxVXj3poL!e;}%N7L_CHoh|-n*NE7Z>3LgXFqnbou$NaP z?bId7fo;X#>=eMr#e1$DY1oeLuv2?m0%L1X9mr(KSVRGJ%lxE&8pTUOSwPg@EjOD80s@%Z zBwuKpH{;6+A=sltm7eK=QZ!p1CV%mYCZpw}G*M_@&3nNwXk z$XlZE_Q`JdLwk+xnm2I*6B)CJpjGVp|Dz^3^RQ;$Xz33x}mB6$q6*xuNs>AJ^wlLiI&MU1V^9s&Wo!&rbB{xO3VAq_GGihB=6{hyCWEBs%&3A#+ z=H{vogP^LEpu~Ynmx->ig4V!o({$HXzTfqkh_v`UecRliOAakJJK1l(zCJS)u<6|3 zPw9fdqDqJe*IkHxC5BIpq`a@^SUss$U>XX0QP^`mJJXwrp$7w^Rj!jQH*kIPesdB0-w0p*>cpdZrasANy?kZkL@Oax8(Z0@KKP zKrx3Hw*-|B8jblo$cwM>={HNbia<++U2sB_iz)gtUK* zNpwbNfxiM?a75v~=>>;FJ}2gw&t=vO-9Q#7Q?E$CS-Tqld6xcH&FUO<$dvzc$O3rC z|C-hmWgIwHTTlMQzk83vFwr>d<%KDwvCsQiM-cs#_7Am^bX1$>?%I8vV#7Faq=1Kx zyGT(2V>Jk$Ti1;l57wqGHT}hZGZNeowIp-wta0)K%j&V8FV>$0EsHfgbbRYkaK*b_ z?0MA|#w_8yci{4+YJ;P1MM}0WNj8R$HVT$h34AgJXE6e{PNbP_R#v~Cp6VWy^1k+x z$eoBIyn1W^I~d@Va?8*=;zd5Z%JPR)!&y%g=h)U;^}!M2wf6;D>Ti5HyU!!ulU5;Z z(tWu;M%CehQEOnc&E{(7sgnB8kqcXSz~}u2Gsq`p?t{Bt!sQpBLuSD%CTl*E_iR_x z?7TzT>4o)9#mS2N3J0L-2nW5*cesyf5D|X9+HeSBD1jtHuBZ)_G$xs!!n+V(k9RF6 zkUO`@Y!Bfi1jd4k=IOr-`Cy)#iTG6Q+%7ytIVA)ewa_w2;YT1?$yTca{xUn(M3TCY zFDA}UV-U(PwrC_RQS`XXV@8S+&krGMkReh}7J=~girR=rs{wW$l{^CA@@#n{e+$d5O+@$kKqI*L) z9fp6kl(ve&S#)G&9C4Ov_k`Ap0bV731YQKkg2gX|?mf0$&EM|?)CEq}@5zu;Y_OAK z9-&Z~s8%(a4OhD ztiTAVL0#b=tNA+Jp9Wk^2m@ZLjx0gb5Se-xi;sG~TQ4{x&v+67WsM>L%O$aK@uDGk ze%r<0>F{d?a2vhVxxEPjbPnC+Z)sd?6NS5tM3!t9d3`VZHG*NsCrU?n7a_bPw;X;| zpE`K^P2i0$6DixdfN!k)sLYnA`L3*=$G=F^M?hCrz?=i4;w*Qbkhc5Au(AVF1|}{5 zgy?o^r(M9Ko$sW32jh{KbZb3GhuRo0LP``5@$|xnPh2eKRV62S2Aj`ZI?N{Qa|n7O_}5ZvS4MkH4xrBhJbms z9OIR#_8872dJuWY#7U3Vbn-SKDjfm$(1%HVA#jpR+*wL^smrnO?xY&Dh%n^`@L>Sq zo`gX$p}BSj-(-I4&aJV{f_PC!rr@xnO6g>pIbg$Ek$P>4)RF}Bv(zoYSdov`(ooJ9 z3_~Fx+%Dz1ehKi^AE_T4-S$jx@2pt^Qy8ZnJwp6zGb%-t*0P0Z0U{KbYH_pIhqi?m zG|Pbnh(EV&3g&~~wyHjRu|d68lX~_f@*fiXY3MMi{^u~!;A8^%8r0eaQQin_6;NzN zQS8Y&(4HZ_ZGYR>n#p_NV*2UY=suyER1gnamxxmCa%@UpPZQ;3H--_tv!kQ6?192j zKx;ql^3lPe=}4@{lHVJnFrufFch734pgW?xI&u50@ZqHARd9OcLNfj|9YNjyaX_mv z`RJ2$w|2FpoU`0@LUYuS@p}=^Z@^-AQ0E*LNP0g?o-t5*x7xJTiQ*CdX`i zK9noX9jtl%J%wBhU13=^*T2Ysm$T73!$cN3v*Ip){H&!k$**pIUezVtDDs)xq1AY! z&c-A1Z;cQfXN;J$L=5QcfSaxONgIJyk0h>-Af2q#5_^xw$t*euUr90nm<|Xk8C9x<1z?qq3 zwLX{lcH3Iz_aQe&1RJh@L7Rgk3YqQ6*>-cFwOg0#VaQ9-deAW>Dy{5`1ag%GBvi9m z@f3np?M^=HCkP{Jm=i`iRbjS-WQj9rkPomuL_q*N9XYmL5m^?QYqcGewhL_5&RI); zs(kLUm7zS0(0N-rj0FsY-%b$;ec=F0J{3Pj&|RH?(+rZ~0T$m%_0v2yM3k)+f5+^> zh;2;pB$E*O2MF8DBdJUg#MG84Udlnjhz8gr z^=Yjmh8itX;Ktyf z>n09P7ZJ9l7LkRpMi`2>j1ojTO)9_UH^UHGm~ zADm|-Wrx;PV$CJpaFJ4LG|yoYQw+Xkv!CY^9O@W1K?htT_gs^_ z*m|X5jNhP#?fBQp0a+D-(Z+Ah!Xxe*m_jz3&nMxC^HaY*kU;ed?0LY{jPgB+uEc0I zN+>Y3-@j7e=m9f8#=$$Eb?Ym3(6Q>*p$qq1$aQZ&jp~*g0vS5}Tlycxh!_kSjm#Fm z+6$Dqk^S$QM1J0hg?keT=yg{EPUFs3496jFev!koAjEOm{*VD5n1(B~_sQ1P=$uTu z)?)4SNwBY+KST2-Bi%3bQ5nWG_T&E4r?8(yf;9m8pS>#sgrGu}Tf2GXfzNJxSzeSj ze`WtmeFsPS2e;S6tIoU4S8tLP`L%BLxOS^tGiq}@aMSFr?#&Z#Esg?%mh`@pX0SG1 z(=nfVt&JGu#9OhqClj9*%@hl(pw#Np?6TXe^UKg5p-zP4fFMJWM+ohN*wCz}R*8kr zFAr*5X7a!g?8NcE|Uk#S)nb$G9Mkf&0h)X=a07|7|S`(=z@L#Y-Oq_UHTVXjWrPYWRcz;JM+6H zIRVP0)1+Rf(XR9P@jNQw6}@KBD|yA(Yif3UeXbYp<`p`>SKZg!=Lq+~?_-ilAC_~r z6DCnHXeFcD30a{5N=F?lhYePY2I65pMg8g@pg`3?z4A>WIQW#;nCda9OkDJEvpUk+3!nk=+(vrd%T$bJNK zTX>x~jPw8@^HYfkzhzv^;*2~Odgg!%vhB%=Ld>3OWo+MYw$z9?hn9r!f@K|r=GlGJ zL|!-sxvw5UJn<3F@r6X)0qSQGK5m)hl4dv0u9pTeIV zXqWSSs^zjrA!oO3yWC@_OFoKu4w`|aFk?1bmvZr7WJdNU$A0Tqr~Mb#{D~jXY(Wp- z9D@k9oKPua>u&`-*=R=o2PrIYp9QDuAQnd}O4NG>16ucKbbwh(5Z|4UfnM|x>qtv6 zt);4tN;MUm(YozPlS%y4DFh%`OFP%mC0Nr~u+;T}MaY>sd1Bvwk|q}AhnFQLgx_$1 z=`6Vl#PcijKm2(+ekf{xrCBSDr?uOTRf^LyvXNiKE!nY&1aZK=C+?fFkB_l0)x%dD zI3OuPWd~qqUxopn1ZgPu`9t*@eseBYlpHYyhGuSiyeEN>9fY7oCFMnuX6SgG&-V-K zT^sz%cJTiJA54ed2mT8m#L*29|BSe#Ev1tk2(sRATJj!kQ1`FG%6~;%dRHJ$s9wyQ zXLj{fF2#>Q<+w!d9w}xy>H?h9pgvr&eaE@o7e#8GS5dD*&+IW_H8(wW+<(^hqF~=0 zl_y=(2r#UCZlC7iM@|hPqfJL%2dUf>(S7~k`0ByVn}wn8nhx>sT7A-V_swmB(&BS_ zp1!)7g8z<-)4Fi02}FB0_Ro*LYXK$;G1nHBgIlXz<}cdiiB3BKsV&h6_OPgZj<;Zo z5N2twCr{m?Z_JAqHBv}~uD6qsKAn8{95e%yPf%M*QS(A}Vd}1~ldvSNP{_&XeYdLj z%QiX__6D|}n^}tX=!&N1fFycAhH<)&oIy@#X>$)`7wnbDG7Avr?gHGGD2e-~}tgHAl_~)mUF+`c=vDjC0%G+_+OauLjz{WHQ+sou5a3 z_Em!_&EKl8R#dFIkbd&^Iin0UcoqW-ZUGX1X`rfty^SY5MHEPnclVK`97r&v0C`Kk z?g6{vi`ZTO4z0|x~H60n%o*4Nm6%4xJ@jjD9b+nO9B#8ZRw;&t&h zS=OFzy!)t5I-*D1;jPvTGNLkkgq#ToIoReiZDrR1nTgbA&8brL-~kF$xpq(r@#&*k z8Alp>NH*5Dso(qZowceHh!s%nCvPJtm?Nn3hH#y z)pcekpa8)%zZKE?rc>*x`bg>%cqkV}&gJ1DERsE}wFvy|r_3=`u)Z}gjcIW@)Tc2i zU`McNAJN*nhwAPmvnAm&=l0=~YB$JHqiD9;+o=MM+9^Ov+mjAh-Euc>gw9rh+BQC| z#*Qyes&8Mk^6r>~wP>~YchQ}sGkFxCYspl-)qGTw8PEQ9haT9YJx@tL?WF*$AlGJ97!K|Ly+f_1 zZiDX_XMeFFE(5aS!CZuQbfSFd7#XeTv$xiLt>I`OFNH-z0k6GspqY%Gqh%WIr@`(u zpVq?uXeDU)Oo~~SQjVnl9M!A7Kn#Ba*}vHPrp*hhe90n|lK@~_X6}#K%}XJs6B7A5 zq{nf0Ts|Y|7B21zUkGP;ZO?xODvdT=3;PR6r$4PA=~XU=%uXYpf7&r7ZB!z6A+Dl- zuSSJKj;2dr^nY)gdDndobq~@z@7;WPr;a+W8Ka_j-Q&O?_qfUD7mc(TKP1sq%ZnBJ zuqq<1zwn|FMf&mmf;F*y%t*=^<&xv7GxtFHsQ0NI243!uIbBaPnr5|quLke^a_W;) zSCX_e-$+YLDFNivl?NhAvlT%A7>?=GEX+W{_dn9?3_c<->1=pgX1i~-T zn-wp!;7iI&qhIcI27crkJMS*EF4h^=o>(_*ya^ThifhbRjcNhiGwTG0V2;+lw{ev_ zJUj~EYci+EouT#HXa?tnO?4))1 zH{;%uz$*bAe(e7A4iNwZi?uk*Jydz2i@anapQtgFcVsD70=%g#>;z4?xzn zbbz4Ejb_X3e6M4^Ux-kS5_3;i8qTNc?%Up_0FEk)q(+6Sz&vH$sIb>3u8l=?3G;jo zzM^F<5Pe9VBiln(yNUh^gn2^!k(4R|s38vlYAf*~N}Zs~GhB2bC?rdK)Gt}lkg5gm zjov}Zn&UcBRRCf7ik9QjdKf)SrBa2-`2_7I=Rm0n=*i#R7s*qzMG$nd6{!q3pUr>> zpsxb{NHI<)dEi5tg8S3uF3)|n%)%pax^M3GYw*RXb9D7;_~=U6wB5XyW6XJ-gv$A& ztzq!}wEkl}=WLj|HwRXD;ZKoi@kr=CL$r` z0hW=8(<039Yl0HvpaYE^)}9YK-`qXoAb-vT^8)L_b4f1=ZRPV$%=WW1(S{&43vvC^>pew(e(7{rUX5R%&3Mw@e70=W0BpdCVf*` zw9JZs?M};ChiltqzxQ;TebCRrE?*|XSgF>dQ${=q@(S0gn1Sd3NoHoHvYKPB(}9)q zOc}JQ{(iv(2_BH`oT8ow1Flx*^K+8WgqP^7hbqd_<6~XML5@(Ma^*rpJX$xLj~+1_ zRrpW@O&Fp$r&rGu@$FAF;JqsVh=vMt#57(Q=-7E+_2O83&vq32+>w*3m%x%LrBQ5h;ZcmA_G?F>&Tz4$rvy5&cx9vQlA)@2;*i9)b{7!m%wD5XNZZ2$f$I?zfB6aRsJ zQ$$d^Fd#z$^Y6mYzrTvR3mv@yRp@J{5M9q(&;J2-d!DLe_H8f=SzXkIu39C+Wi|hv z!FfL*2wE3?AU_}le?GYwOH|IuD=&{(D4e{Kko3d- z3$4E(v>rI~c|ADEdN#`NzWAjk+PylV_Q!|p|I^rc2Q`)c`~Rd65|ThdhXhC@fGnqN(e4gidzhAHRpOM`Sky=XmZk!K6z;TlV?bM`7^$zy7hy}i;@;6`2 zd1P)x&R%zOj7iNlQA;*VdkPj(at}hxLX?LwQg-?BJVfVL$@&ISm0L8*&gz;c2co*c0*Ypo}kdg=fAg z2w%3pidhh5gA87%1}m3y0^qReH`I;f_5<1;xO@dUaDNh@;DU6V zkJ4s*-H#%O&UaQ8O4FeVh8%4g)FW5L>s^wfzgcWNmsHm*?Z~i>Q0C|mcBP8ML0R+l zrZ7*yniz>}QUl(Er%7vhKa>Se6i!Y$JH$k{NdXpS%h~F0oYXiF@lgIVIucV0gF6G; z>yPM{yY`IO6G}-QGV)G~l4H)bRF@Ta4% zp3vdA%JCftiZzNcCP}?P_bUy_a^}UyM+y%ETqkcsHj*oK10tdh%w0aAT?gFBytcEo z^v&Z=XkPG#kh^d%(5~zF<4u5}kQS~9Na6%ANB{}KhLT4L1A3npiR}RpNw)>Sb#Vc1<=>06^j8)yseS_?8CA{o!B#wEphb zQm@%Mp11c3YSw!)Yq>-EbYzXUJ7WT#I7`QC{SuKQUp8HmEZ=;=bmGl}*a=2fHdja7*`oc-%Yjq~VJXQwQVE_^-H7oHFmlzY(FGC%F_zIw;I8 zqicHoen(zEpBN?3W@Ss4!#RvfSC$d#Slp&EFX?!%ddI@AfnhzdiH1UntN(=c z8r84<9o9S5<(s)+pQj9hGEnqUE;UTkE#-d{263;se}ghaD#gi`4@3`?l}(J-nMK^b zX72ExR$xRz#gpR!-Br?1OmKdf-CifE zmSLiHQUeqXwEqLI{H|{lUTPTmV#IGFEPT>BN72nJ{`EwIsaP7~^L`E85~5kT+dbM* zHv7x!i@a~I1Mb;seS}C3KhdH8va-DoD4ib<30PD})5R37j`}1e zHrjxrl|Fa4NTsB>d&p!WEKbyTwxO3C_BJyA1*0BY%=7g=U|Js!)G?eDTcmrtV%PR2waq< zPWf)+8qK)2y48(QdfnAks1p66o0P@e+);~O1=@`FHwtZe<#Bl8c+$2+AA;Og2zK0D z^{h2lw|aUJJC^jv^nZU0vMlGqC4{t2z!ydhW@bxy@dZ^P^tuLGHZSC{L2#Vu13B>etfUZToP1aCb8hoqk4$wuDqWLN!n}TI>*i2wE5L=_;#H zGS8@=X80*qNH$LJuO4UlN`9uvUF?6R2Y6T8v zGSh}ah(^a4KsS)6$Hq$!8uke{x)yTH?E^VZSe=m?(VbM;4O_)ITbQzOp=YWl4Tw*5 zuUm=V(4@XJN$C$Nsr6*5S1^?y&Bph>`}JI9pZ;`L^0)0XULFDUg&%g`>4WV5T}WY% zz20;BFM3ixlZ$K>jH$7saX2wZuf>(5%1F(pr4k4L8$K=u5M7zJ#`Q!TPf}`~#K3r* zT1dHhxiRD?LUsgd4@i7w4hvnA9q+bkA<=UYE?b5p@T?hTuX&=k01H33HQ^$3ZBQaZ z{5^X-!{WxEl#9_A+-t;etnznv;(m_T7~^fJvm33u*mLk+Ohfk&r36_C2yN~xV?yx} z^op0#;Sz{9Lh2WjVB{3>oIU<59GW$#I_bgg_k9(!A;=(h;nKC%7AEAtFNIHtO5bO=+h?Nr(Zx6qxc9Yri%^>2f&L`? z8vr3JK8}{uvmx$Yx7m4}yPdt?BSmVKKWbFZ;2#;WkR7H0Uc+5Kf!-;roUSxMaRMMLcXNf?wkkAD}rgEv~YnGhOL-BO`w=4~D zdQJi+6>_Zsf>~l=6Qg=y>Pb-G89xURA0na^=wK1WPYu{wBR>AzYZWyOSanQ@Ehixi z-;+~Rn`#s=mA$Bz_54Ivrf6`VupW+{h3)88;x+&}lFMQ->~66uO+B4@LAjwT!QN_* z^37gwU`kOz#05Fwdpq$c+oUQyq$iwWs(%yHj}B1eEgjdK7jnfQ4klRJ$crv=_N)dI z#!y(&wMx;DZS6%uiQc?{;ssHjQw`w95tbF_W9r5iq~C*8xOhLNq5)IR-j`uH!q^*a zQHkF0?HvQSxo0^5;vJJtnEHs`$xemu0`&`XdP3-}5G=~X9#KAxhQ(V4_x!=6S?jT5 za4M*i9E42b$Gopktz~BEFO9A==bLrWB_DKjOTQYol-nCZxI5Dmh1uiDa~79mCcz?Y zTo&e#X%f6nAtB+o94G%Oyz6}03k#%NS%0kJX410TjVI6LW^BYHX6UfH>!Qae1ECUp zYaI#~qUc|V?cbUgc{MIpHEJU!zfOmxXr-f)0N8ViHKe!+1*HT_$Rk;ZV5aDiiok6c zawWx_IRe41(G@#D8>A+V?S|pPTGt~LA2C2=Y8Aep)URW!dhKvBOrnl6U~;UReYEMr z<1twWg;z|JgJcgne={vp^?Qa5^L8H^{^rsS2-6x@=N^WOVGunL9mTH*%{VA|)kAp6 zV_s>PiJ>Jo=N#d{WMj4Du)46pPS3R?CcQEfqzqk6yWCJ$n8ILb-%hqO zW>0jm{PIjjs~-!bK87gtHNmy`EbTb|U}@?uVFRK*I^Mg6urS!yF^3nLB&W)bauLSa z_}swV!}9I97mP-`t0>o0%xgLk#=(%)jD{*v>HC+`Yh%$^X!M2fw!YnwuNU@DQb_paF^ypE4s zD&aXveX6~+IyOqp_U&LlwUJzMTzyNPFX$goOwUWeWXTT;`pq7UtA~4Q6Z$tDBz?Il zSlLv`uNrOwc|-ZYAT$E65#4AVwf#)htxihoVX|4U!bzddj^I zN~NhQOzY{C>`5M~WVU3A0yyaJYApM3)e8xH zo9hwmQg(I+JA#7{-|qgG!oV?0yEN-ew|qW?eQYz!+|i}eLH-&<{t{l{SBByvHHFFb zR8J0cOAqH090@eZwGYbQW`jQl(%Uf)HgmYLxgdbD&o{T;Z^;JoETrj4X1 zG+#*rCHID)^j+eB$$9m%^O~LKwV$5fDJQ9+ht)MLqWTs61+SDXD>CaWvUpl#`Mrn^ zCKM$9f>)}`{kz!$&dPxBf58{Q8D5=V$fYJM4Q91+sw&cAUa05V6e;*eSNX^`la%O>vwOh0=fI06PJtuFbNAIe7*ks&M~1q3P~lkcTXn2@L!N?)8)4? zVPKaeRvd7TK%PlO1tA2o^w$%YozRj;sh4gU z|Yow`tv~-mAN|oV!v>pTYTcwbxP|O}x#50+#O%P2V4)c;Tnj189OO`ZnAfK(xvInJK03V!~`QE(T zCxZh#n&kQZ1+$HY5G>8&nU}lK^DYqg{(7r)%;HC}mmF=Wcp|UpNf_c~!Cd@AZjNRw zh(t_g{5>%yTMH0 zVy@BCz)YT@z9o!Hov>BGqO(d*xZdgTWgqS8p6ek5Em^rT*ID5!4%S`qW8IIO)7hd(x$z8u{ISZ zJx&S<)RaMx^ltv1%$BT1D97D?BU7<1a>&Cu$LY1Nc>hS;L;Pu1^>E8T-%5AtMzPm= z_UhmS)_5#Fbu?!L17j#Bsxx<+Zboh7c0X^l5v9Gfedtd8176iGF2PG47T8 z8CX9^T<__Hlb1fanVyQ$>lXbqJI{iv^ObphzB*;$+UTLQ|)0xHaIsX@}U?L`OFTW6fbU z(8PI^71IXp%I?=s=42+V2%rQm!zzNAny`jLd^3RvZ_~hG8N{%E>2Sba;1{Tw?8Y3@ z8<6`Uz&OWO6GweP=5cpkNQ1T1Aje*-o}BaHT8QnUdioENewM)+L-MT_?kUn6<;jfH zjX`Js`PET^b_$}CKa@dg#S6X4T~vC_?lCb*qwB>7%3>V*%-$EWbQ`-NfQf@?M^OGQ zq&0jOFwnQ=0ZClxEfjE=g!qdr?a#_k>WZypF1s(kYEfpVBMU(f%$NU6SF|GbqrCNc zNIQcRpG7mIp9Q6O588+wFhNKm=F!g4DTL8VL|rNVfoFrY{4%H9_(@?ygog_DG>)&x z$5n#68}vAe$DK*sB@2;dH zTP8z%cO_h9r7iK$`mz;wK1Ek@RbiG{O?|^>yNvY6-POyezKgfq+Xj^j`usw+`A}YL zbTy`I#z}4y5Haodx^gJu;;!W##N^f1f=s{K%u=s1mcc7|#FvXc&7g2bI|6Q+k034w1R6~wcv(9dQ-G)@}!z)ZD#-YUZ2K~nBJCza&i zNQZM9KVqos5D89$jr=pe%J)zt5Yh4Lu9xLw&g%@zX&mLiHGKNHHJH-2Y^Jh{w@KE5 zilqEH7hcTGO)_CXi(mt&9f2tlpDPt4ex^dJJqtJsFc|{>miSbaFe*s^Jz6l*Z2+RJ&Oef&y(T8W1WuGwnsdvd} zId))#&t9QA^#ttU^`oXWQBG)Y)rPamB?PbDlS38^J_V}p}}rTKdO)MN+{jH~hMTNk47$)Z;iYld!d z`gV@8@{V?;NKGL7sr>oey~QbV%QN;yj{4|W3me71CfU1%Ad98<+8QZCuchiY?O@oY zZb$o5?WTDV(c?RM|-9+6v z;)2GgCO-al)lK8lOIJ=w4bnP3mL6?bbT5$mWct1>JTxRVXUg|PSVwo>X$KpH< zkAX(0;Yrf$db$j*s%TeK5IO+p62NwEc83sF(9pXJb8sLU{rF7@!!02k`s)Xxs-YeJ z-kxF=`KTEOOX#)a6{~9KxrRlkqOZZ^wHQ%)U)6rEV`*!LcmI559IOU3b-q7x<>#F6 zp>JHV2kV&!FP*4{;Bq{VFJH7ei3mDNDJUy=#;`h1Cm-H(gJp4wCn|ofG=Mb0&Deg{ zS(S7D=T-5)sdC%DI^+7z{6&?U8#sFRJ_LIN*?*bRyS3bVgo8;TR_iN3=TB-GV^zQoZ_gs7{=F#-I>Z>Oq>W)-0vy62z7b31H z&Z_p5bDfgaF~MEKvs~~>!%crtrA{ zpPO_Da1izY^kNR`pNOgweG4vitEAs@oJ5f_z`9g`z7)$dhmxWex4pon?ddQYQKY~=^Li!6xPavC#U`#wg{Yf5dsAbt0c->!;=Jz<% zg=Kj3#jGDk9tgL*bztL7k(yDs#c5?Jaa3bc%_G9D4636ZugQ!A8r%r# zZL8CfQ=AL$?n*b(n-1JRC1sX3YaGA$z)vCqOE67dZa8qmUh-{U#1ycmLx|sZCvNKc z-o^b=m)ehhxZOUtm8dh_5vvy5ds}C&?icTsreGh@ebi_RR z!?n`KfbNXN25$!;3I{WM)zl2iV4^3)2%rK3isU6pq#ba% zufnyy7FU|5SQOfb(j}|XE!^(Iav^Q5^GuV|@q642>=cjW=E!O5=OUduHtb3FB?b0% z`;x3#LSJ235Zyouvj78&9v{+E+$Z)8?_; z_+1)ju>5(`_g7ud12;UiCN%89^Z4SAxP9ZZaXoN}P(DQW^zv;KG^?=)jmN~t7#Jw@?oTPIGI01ZOe`DsX+)S`H;$`qEVv z2-L!unl&c1&ZdCtH=ZhJA0Dy=QoT|EG!B63cHmJXkhU%;*NhhLA*OGq%n{M=l@|<{ z_ca=(L)UcV6@57GxTSHvly4R)?X&uT zqaoini&2Ci6}j%=@9~`GLWBwNIP9_U@Q^gXun7WiPJ+m|GjP`?2COv@Mdx(ba=Xzo zq2mR3@rGz?VIIbC9icU76K6Iju%;8<_dV-abTIYGcf8)V2WQ}@_7!8A2j~q=z%Hxo zO&MEj;r$%rlvWy6vU{BMZ-lnw@GqK%pw(+}4-H?jFb+)%a&PDeO5%KO=-O+E)Q$|j zo8#EXWNXQLr5QW3^~;ZJrtE#%aRoW{345@XE4{3qsqM|6vPduh)V~7P@tAW}1={dV zds>HnSwtE~_iGCp*dBzG-QXN1sxusD{;l~j%sRrVU^gwfS`^$6(|PVI3{ZRXjwTBc z93`p_FYLMSJh?^|!r|)NR?GKaT1a45MYA+q*}j))KFS*$fDO2i!t?9gXzyKK2qOQi#rf9mHKC63~YqSI7J z^QKN*Fr#H;uR#H_k0ysG{S*wC(Ksnsgo$k4GPAM#xI`{SE{U1VKm#{*d=o zh9MjnGavI|=1HWpO#`WF7MxSKP(|_jTlDIAF%%)SM+~uZ_rC+hAQ}|#`JX`X|8P5S z%!@{6p3(d1I4cj=M1(W;6Gc(a#^72|qF2Wk`T=uC>B$i3_pkG?_78#ng zPZqmTBW$s;B_&86Na5hXj7LGVhkNPX4UCtqkLh_o4I;T4``W+gMQKp8U3rrs6rm-s^^9mfI$uuBqqIgSBr`zZxSKM6|gCKzSvswk9S3RT0>x*QU1qPk&aVl9jDKDdJBevpdCqEX#RT5 zOs4`5#=QHLf)}zRG%?vKoE7DQ&du01Q7a892r7XlOAJ8ouC$K+hB}cZW@VvG=fbhX zpfQ9KsUpUqZDi3J2(HDY0-uufS*CK25?k!Q;DWk$0l5MeLSh})$5S3(kPY*jEMf?q z@CQ}RW@{cW@wFLOs$Dy3(nc5PN{zO#Ip|gx0(1b(Cx~Sgnk{yd#8H4Y3o?cx4~7;P zy`2F|b6=xHBaT@{pwqCSK;X~a^naxw|JOlp7g$tu{7+F436DPf-&z(jXfw|S)?xis zj2PHezu7@N-53xKMs7WhkvA{`W*Kig)}OWKM+4eO9J6kK^*&0o@6fwvw~rIvdY>f$~pd*cMZU*3jAyIW<_!M!)-x{S!5E+KP6t=<0il9f#;$vCGqJyXC+$?T6c#w%xB0~*NdLML%{=5 zTaI)gpkKRaBpvg|;zEwz-G(b>sdIF?i1@n1L-+&VBBdPEyVio}?UA^-LhDb93zjfX z!+dqBDt-jvy(Q5t{Ze}>*k;T3bHVw8J3Gg$tp5zzz3Yd?7oHA0irb@eT)Sxi>J(j5 zXYGU}^J#z}4i9>9J;Z>G$qg~fp83=U zeG6GuKv&Q!%aH+UP5I`qk11lZdZ36wI%#RX+Jb-@w$|v`SA6VOMCT6NZ7dMYBA}dt zx-B9F90|m3*Y$J@cceE%ohLj9cC^sc4nV!**B zLm|w&zWri&eOZ>xF4rB!P~brnJf;O8dS=l#Epj+0Ks)HoF2u)boE}t2gkp1wS=q`^ zqNa{oD*~DvV~4mUH5=j*lf{Rr_P9SGe2g=?cMHnoO?)tE)x2%;?QUeH_g>7`bbH-@ z*DN&v1YrK(_W}_a_?-GrX}5`N6E6B!&9b@rVfF*SiUkVNp_tC>@lRmu zJEl_Vws1S)C1tkdw!nTO4th)HZM{3mXmq(HtOgNyxoc#H-2V1(w+*<((>OJU2ta$(gBlkZOX9OM`|Z)ET6SPrI^5@$&h~{X z1aAB)s+Cd141d{`ux*KV{B+d#$cv?o8i&%O<#6lOiqEucm%>RI>d%f%o3I0DqmCW}#&@nK!K-BKsTkacIvzd`{k~{;{i~${MvXLO@;a zz84PPfpuZvEA@nn*Ve2EQ}?-lFRzMrJwRK?eMX<}S{ zVUYx-%OUS`hfF~GGynL#ystb}sGYKh!6qgied^hcG|?nUscH|schVJVmj6y+X@F1* zS@83BE)&oTX2}9RFY8hMgH7aKtkoW#*GiMJ&FS5M9-t>mH_nkR#N!NVVGqKTAbcne zOJT|aa3sLF>fe$s0r;g;_oHmRtDe zzaSDXD;copck&Za`?o)Ch)}fKS`MqJ|2Q!kpbd5CVAR;_>?EDpnEFE^{lx5x$Pk_C zxz_iy56*1|>#$Sa@1tGJX+1+&vm4C=oN^DmjT|peGg*xP!$u+yOf--+^Jp%-wVtRM z%G$Up`B4|j;aKMn)Wr`g8HC#asfqOR0`iXi@nQQ*+J4VwDe!e>xQ*oL`<)-zb5qka zn}}KIwD7i@qbVnJt-F@dr2XF){qERy7WQPO2|;axa?gChvwx*`Ykx)nno$CV>hscs zrvXr291@s}htst;=mzk?|Ks}|e z^x?4}8y5E22+Phk&=j<7^q>UGm$A5Q5#{g(CIDc`&nou!V}ersplAFvn$-ZwGnh^k z-0r%-_;fOD=7tS-*eo1q(nzD-8b!o^d4w#r5tTOr4x+7l4=2o800GD@)7M7(Y0aU= z(Uvx{Mlqz{RE>;LYEElxdLMX%AvxBc8t|HNWPaY6?DF5%$KBV^Jb+lRhM+ZOdjhOqlf1|L6#diq7DFC2_9EIqbWWIF|0f@b zWtv5Xd#u8T%OY0|mnrmDnZKoBx&Qw8S2@2^{!Ye24`UAga;0Oq>w>%kJZMjl_rL2U z&IclPfKG)!VH$07uc@($Yq2;%8{=~H|D2pT8e(`x5Pa3kNlfV><`0r?Lha@Q1 z1KnroK0?>464?)6QG_lnkG2n;<~VW<%~ev5BCjBFV6av&Ijk? zI?P{;U>uQw@lTN!gl>y;Bms#)l759-Fr5SXZ=s8QjG+68ABMA$LWG{9P!56ZMbP$& zM>e3Jmh%zGK|eijT|htGrl`+<3zSdHN3?(C`;Kl2(uO?y!yTUgu)W|Rrqjo^BoXXm zq&$YPPt$Ye@H~Y&kvL|^OyoSyEm1hf2qC!`9zrlZ;5@ zI}_`|#(Z=c!}H4D>OsU{+^;avi2jk7HyraVKtIYJ9{c#5sQDxOJMI6-#kvsm_{aB$ z=6wLQSbW8cV^QPLtZG=61V-Yy%SK2m;d$%Tqu^|ChAus~l%OBS=E{=v5^Z%5kmJ1dK_*>(B^<+ zh*UwBZkwYBUAL`BAwst$9ri|+{qoacEcbuYJNTb*#54?-VOcYfyGR3uTM@cUltD^k zTpZGb978r@{3qlKKEwJjy3zj`-7I{Dbt0p%?dD(@`#3`k!@|gMjKh98Jb%)9wP9M? zHAQF_A+}>WTK6Y^#r=NvKXpfX;hN?q_M@vPdNzPm0_tLpWlTodSTA~Q!!X1!mOs4i zLYt6<7&b!J9>MyOb204!1oax8qkri+tSi=w@IjU%Sl9nZKXJ6_@P6QLdH<32G3H-^ z3?VzQ%tHumU+yoN0~n@tTZ#PY_k=I{$6|W4^Y1=QIAI(;&YThKd*nBKPPZk2emcJ; z5`tkIM}IG$aKpGvWDCYWM{w@>^Z9#>55uq=y4`<^$GQ+x{|FDyX)6DG_GkXzb*B3> zwgDW$X&L(`Ya!}*6655N6BtjwGq|W9>Po~SbRVN#>`&xvbj>ggT_&wR_9KQA!a%T% z|GiEkQ!pOemr;g!0}-?tZ7aHshuf+Hp4$m!Eui^DBw#A>e)j@wd z#>=9My22F%+v#_{f4lVig4Dz3TmR!U|IYLOby$n;E5F<0|FJ6-7!m1(ZA1Uidu|;wYe%V#re)j^b=)`3* z7l3YJZwG_|@Kr(3?;DEjMX>#R-{Nu~+r@7Rf_=*mZSGfrU>o~m+xpK%Qjt1<02abS zoDl4b0X?`y9)|=W`;ia$I>PyOl?Q_Dzv@0N(^0QLlo9BL6e6Vv$_~PGLD;{74kDj% zn=FikBd>88hG{pn;`Vwzf-+*4BG`}lvyf`sZrdVvak=h_;9M7va^i<@35aDTqMZ`4 zk0qg-RDfFnMFi`V{1dnBSof4-1ohrbBC+@?KzXT8kuIbkmy=?MGBOsKj5s1okyS`E zl8WRZN0BSYP2?%kh4f>W6+@JfvB+e^5m}0?LZXpWBo8@?TtRLkPmwO9A75=^xO~Sx zunXs(-DvOKI2L!0MkXNBk%fp45``oJl;HwbrbrkJzEDX0b*hh|ELmncpk#7JeSjb2OWt>90 zo<;xpeE^qG-j!px-LuAR5Vl9XKfp~*WDofb?op&5&-&_08ni}Foc0% zE(b!$004S zlJF-GPEp7+Ae{Yi+pr9e4mJScl7Y*e%|I*@!Pny*Al&?baDRx)O{|C4bmTh_-WcaS zfKze{5WWStwYddE03I6#V0h(WJl+_K>;fWi1hNI`0U~Gt5TO_!IvH_9mLjW=Xe1TM zLyjU>kekR;e0`}QXxFg!xHZ6XB3yuoM0t_L$R&J*V!fi!eo<)isCMKFE}v14)mZN8 zEaV7s8M%RU0I|jwxrRqTSnsvHK&*?$V;CL~(Q|>=07xY+k9=?m$42CkOx)6pLNNcO zbRaIz1L6wW{|efyY(9eem!ZyOsB;235h4#Dt8HgLGOT#P#%YEJo#9OSxJM2sEwSoA6cKw)&^a1e+ z`&>85>qdE>u?{`s5G!Ohf_?N0%Kth8S%jdBud9(HWG8YEIgivLO-Kjw9Y_gnBm#*C zQW9NBbfp}Dm4ML=uoJWIu8i zNPWzs{}|~6(&8gB1mr|7T*8e3a%KaN4tIf^12SQ4CiUM z9MlAIeh`ogCIPuf8c3JxKrS{yt^v8k2gs!aE=@CmTz(ixx2XumyQAw-3#2E?@WMLz zSmTi!*4a-IQAJQbzL!Y9Imikm7}N^BFG4DTEZ75NG3vPw>vdohkOyA_d1MBVCq@8y2J3lgH6A;ntSfoQ zQ3P#uCbte6F);3|+csAG*DkhKm#)?=IAP(>yn(~*S;mUANtNkp=d z1IRh#8uAc%jeG<0CJU(o@>VK>dVh`q2B#kw#zMfDF$owe76Zd06Br>2fD!fx7!ePE zu{seLYeIpsE)W>en0{jqFgBe7M$%7UY>op)sw*(Iv4D~3jK`|;aElTNj2szYVQ!<2N?CGNG;NYbO7VVd|)(G0ppGpFdFL-tkYeT zcYh`@9^?Y!VGAy&o+23c_%Se^qCU^{5ldja2m(e69~f=ghz&4aVVXBt!05aLj1Qi` z_&gdp4~!ml1j9W?kt@LXg6Y4QA($SQF^sPqV0;$>rtmvpO56kHh`GQVnFUOR6Tnm~ z2d2^hFjdqLL&O@v=cDWqSHvHfs(!#!TL?_94-$nWBH6%PB!i4WCLs>U5@aQ^9@&EI z2BvotFn#0^9mE{5LtGG)>9Yn&Mskot$OWVhX-3{4y};zZ0A`#fG6UI&bOUpf8!+RY zfthdwm`RvExeJ&n>wvjA9+;_PftiMNNjm_{ty7R&z}$8pm>HkHu<}R$$F3h*v1VKCHnIg7G2{7}Sh%BOoY(Ow?{vPBwf;QZPviD3z z9Fe8K+`AW;1!#}LLSPn$0dv0&_a`DVfr)Dt=0nus zVF(h7qyw{A9hi?d0P_i!@x%{VgCrw4$RPyFdxCPFG$U`2USK{ILgW!0#2m3hT!7hq z8Ca}DU@1%kmTm^HEM$Q-*%4TlNk|^BrhEX_R25)Na{|`%6Tq@Zze5?Y9Nzc4-NCsFTmw*+H&%#|0KVacEMOM^ZV68fR%^-{3>AWDFD{qHApg&1FV90U=@A^R*@*Mim}f7(A}qmi~-jEKm>I@!~j-_ z8e)i8BXbcqBm{{?u-wBlfOTXCu#Q>*tEvcCb>D$?^8m0K(B8MvhId8*s}Y~wn*yx+ z<-mFv0Ia6Bz~R86Uwmd`H>V0C>1)+f}n zrxsY>On}vkZSe#1_rCzvAoc}H3fOo~&nEqWEop?zMwTN%z?M1&Y|cku%j5uCb{sMt zSqSWrF~F8{1GanwuobkCR$wcpAh}2hauKOV9wBdmt$YgDqn-d8=OVW18YCG(nW~47 z3rHQ(jJ!d5fvqNl$Rj$4Ibw&nAb!XiBpJy;4j~tiI;0tSgY*KMD}=}+I*2)9hqxeq z$QmRW*tP?}o-U54Ao_?UG7DLT1R^m=8j_D3L&}f_t z{P>AhhdYkz6%y{lH8!>2hGTdGM1al+$fxQ7n7|wQ@Za2=9YqMw?ru6pl!Uxkr zLe~ZQ_(pO~jEu&QGchurfRX-@k)e|e4cDw$V?f`&2nqBEHV6s#Go(u~@Q(}%#55tH zkpUsW5tF!H9-bavRz_UBVPR#=_4e@$4DniJWi$!@<9Y;p1g?wlp+nptA1l25!HtOW zM4u5iG-4el$KP(@-d4u?MwkSDaf1TZ`gpt1vgjOc;U2+$K32wNTrdCdkRT5?%xcVy z4EG5P42ZxK7HciMy&}=$6&8fQy?s2q*M|iASeY2>8yjVPw zLVSHAd?KyPxRL(hm?6T-lp7clvdY6B18%?LjJXkk0bZ!e?+7DqaQJW$UI9TKk+d2C z!I3`UfgYF$<2?hT!adfxd4&XpdJHRsw!s@U0l_E&6NY=xX?(*yf_!Mb*Z2hZ`A3GL zZ>?Bf+h%Nov4+a%m4!XLxoURGXVq1+(67~(^lG7RfC zfg2Et*1|SHW16Dn!>o*e51=*MCnaH$FfZH|m)-XSYj?Y@6Lm|@IDr2s`e$egsJ|7v z8CG+S>V`{KGm2~iiwpQ(p&%?ih%2$>ukiGx9u!Tg`G2@{o?i7)^>*RX&l1-B!=nb0 z-xJju?oxv&DrRYZltRgun?~t)@FXl5S^9NK1KHv2n1!_tSso)bYqF z3j@X7gPYgHQf>k{ZpuXc@mAeyfn!k`ZNs`^-OCq}D#|E+k{jX5-?pn=Yp(mnpjedM zUZ`6sC=h-Y9B!{q-K+n=h^rzTyGm7-dORO$BQ;NWGOK6zo}H!4=%qtz2|*p1E8|9W z_4!r55r`V+yJiWfm&79iytLPh5)#@*MMdVu&9)=iF+lIxi;v~jax;0rrFi2C#e?3-Rk2ZwL=^Gz;)JT@{d=?@pOLV4x#G3WyVBjsS0=?HMK5}rZ_=RnMf035# zK8*t}@08w6+PUAd(t0iDDeLX7; zFGbG@#P}|8ao*E3?xybEZFTP87Z3(n+2cck!8r9rw?{q)t`K{qLHCueD4i*`vQtQ1 zV6u6@)0M2^H*7q2kh?3|i4zu)7%6nUa>G%7H^8aD>zY>8^5R`_zpWo$t*V>}F;$2*258s}n!hro@h0n0S?8 zr!a1ee)`osfnNJ!ujK8A)m+uTULS~N54~eeoi6gKb;`FE`26gu`tj4&U)&k0HdS&x zZp1sa&cnXJ{rz0{ZalxRnqk+>+PJD^blcF z>;9piTPJ(oFW9rqNb;g~mG+*{x4=a!@W%>(cV-B-6FbsR?{W=a0R?<1z7M#cah*aI zCx^K3^W{dl19$$d8NDR`2%}V%&B$)w_r^~&&QJ68Pp%?QLBC0gUsCk+;YZ+kS?Zoi zo@^x2vAsKnCp6%7(`vpcUXsGTpqPw&f`D`LB5jCOS! zAVT%ZEso^g2r7H3!bqH2x^J^X3m+nx>t-$!<7lLkI`XskJ}WB(qX`W>u`y$O8Y6k< z2Jj#=l9}2jo za;#x|u7USxKjnLF! zuJEdkau+z;+|Kwy=qAlh)6;jf4l%M5rav`B2mX+V5-?`RDkp?cC((xAuJAm)SJppO zjqUFyi{%xyieVTJpn!$zH^xzvy4oh!J_>;=~qShl>JGLv0=cdNTcf4ty< zG#q#aYEfY}hkJcBKKOSP&Pkt^lI?a!pvJ3Nk~E1i?x1gnt)x|UqHQKBg_vC!7~;HuMsz>fCrGonk?BqVp_3kl0?v<CwQrV%@DRpe^V8 zaI1}+JHOAw!pPD#HGL|+|NZCmv*H~OZrMlTIO2-y%h(N7C@JpFc?)tnggM3M zGj?yXvroxqgdCphr~-o6wrk>}mYcaGENWW)6OY~qcTivGvM>8#p7i}Np|c!VDQ0Ha zef6V(s|5P5m0OiH4$PlnZF8BeLQ;ZH<1}W>3J~5ayAXP0J<> z?pEdz@ei)4O&05J-ERBg5y&lke}3Ju0xDLJ4bDx|7zZZRQG%l4irc%)yT0H7ElA&9 zF|ciH2UoN)d&g(5tF20wrw$gcU%7xfxscB!m(32$+7BGDGYXF-`6P}V9vF?jyKz!S zx*i^%ovAmY;5)HZ!0`mP66)VZen-pIisYot=qDh zb9b9NaJ<6<@KXiDed8?RvayYT&0~5V3o~lbL2Z;);b68{eb5cd^B6n?yIlu(s9eK3q89-IdC7#uV*-q zrGA9p3&=cZP{Q0dCO0ZomnX`QeKqmR*F#%#4OYhbEKb>eRcnwhX7J-3rz>_-MsSkP z)j|H&{YpEpLv ze5@{n#=@JCRwq4Q5l^J3O}zL8!cW2+^n3Zs(!3)lCdohZPg3NMI1Y82rmH)>u?2$1 zVlNYDKhqOm?2&YF?pleInq0qTPrCDZs4uRF!8 zr2|{HcePC&8-Khhz4F?M=L#AZ?bd*VgL#vt)zHkZjZtjFqYaU(?oDn?NDiHN`2$tI zqeE_r(YRb(c;P(20RgYex-sTQdv}2dH*F^MGcOlh?HD+fJi8pS)jzV22g=5Lan|N- zNe=`WcGi!KpXqB}IW#vHm@O8>Q<;rshv;P-E+axiCBud4#YZzcGxuF{c(Fut*7Q)t z-5FvT^p&Qkxn&5MrLN@G+wuW&?(vOY`7{Q6Y>iXTm-O@(4ZmJCq3CHFFbTeL1kcax z(Zm<}>Q@ehqyUEvK{vQ_DsN=U&$=sEEHqCnJzsDpfvN5S7fIn=rygs)Uv1j|$5K*= zp>lML=*75{1*y~{Si#eOTU;)mqMm{?U&765K2bOoPyJ|r#xx(V^A_yExO-)D1LUga z=;S_C6)F=9IER{ldP&QoaH5={oGE+E>rzG)#b@jf%zzpl#j%Pn?-8$=k1sc-au) zF=>g{cWHf0B4xL~0SWW^eQLH4Gh)M9mWaYn(KRP85)iOUNb-IXyZ$`eXN)#!IK%}} z;7W($vX+5wr<+Z-9=4em+FDLeD(D}I9v|oHgEkG7{8gFQ& zroid(T);0SEJF4;Tj@&Zry{3|geI;}=cZc<-IV?G8G9br0!S7YxDxu-bWNx_o)8ew zNZ1^jvu9G|+v>!li!O$Oee$}gGM4?6yCAZ^yB>QLz3j(y(FMtW3*?3Z2fvq*g}@QI zL<>U|u500@z7V)8KrCxN`&v*?kh|^x-0(^g(eQqpEBCQodg`ST(~exzNU3*83b6xL zLFXT-QI;apM|oUwTz0bApyrtCwH_38_XvY}6L;mK{g&xHbEPIP^s=s|+P@Piy`>=a zrjKl26G1I?f;vdrA|h>OEPwcCxc~%4-%K6I- z2^fmOGhxZpH+%E**Go~AayeZCR8!?t)lpgp=Y9PyYgy8^{=^B28Xyk8Z{;4nSP^V8 zULxU`oj&Oij#es_z%~T)7 zPw-MuWr(~#UDKYN_DO{VMG<3Sj!@8KE!|NucZnAKij(nd6<@k5YM6+7@MD>}HFG8q(?H#OMf?{TkanrL;`0kz$dnPM`adSJ zziznv=@vC){R(^7WMISjD*%~TQ&X4 z9P!p9TO-Hr;LWo%-Cq^s|ndmN;~cUQ88rQ!Z%9O<&DyqUYjD+ zRWi4y?TuH;c`GYhW++o(jh~=zYu&?7LnOnZ&`G;6@!XcodBPj~SIUEhiu>+w;)^An z1XMTCptxz_-o-UK_!U|Jg=3a(@+)WwSvouHjb>(NCtvk-%&ym;2D}n~4CuSOd@x;E zGkE1m>hsqO^Jyk$>)(}Y2#OLGJS!`wJRfVjUe^2>_T)jv>k6uF0IvxI3zP|f+9^Np{fle?!r z)}FN>W$0M6>E=}1SU0L2uX*qbxe9vw+j756TClC@{-~2|p72Coyso^|iY$JAJh8FL z86u)R(v6L$xFr{Y%LP#4#Z>i#-uAK~i&JBIP2)R2@$EhkqB1bu@w=YzDhoadQ@G-mMMt%DH)IDUW z(UfY#5;OMlo9jY8dnNUf`znt;p$1|Ivo*ep{CuPQ-p(?NYrR#Kt{BpIYJ4z5*qWYy z+UL%;9@roNyXY5=*Ub*LxOy3#nep_2!K|l6$%5|vrIQoON8T7dq@dcb0>|W*Yffzt zmG@k9{u!Sgnbsp^3kz~f%}yx8qZ_Z&<8Uhstj9YUBGm^@cHKAP!6kD(>+s#wOIKtE zLd07V-=9_A-CKiJ0PwlVG!<{k=Q|baR9J_NEaa1~Ta=v=PiKG-ko?0d@dG@FGPl~~ z;+&+2e>CBWGbimX1_%XR(VZ%IlEEV8(RKLzMds;&mpP6Vbby{v!HQ4#pT4OtVq;2h zQ$yHu4Q6cY|C*HB5t=t=^z3%9Fsws&nPQ-AVZ9qQg#=mDlQ)#>c1QMxmQ{&u7<=vs&t9q+{QaDdG>s z63P`VCTFforYnW7SBR?;AzAS^PP?o=p}u`fu>r_2ENUfhFVADdq*hGE8$J||;c3G* z@fJy;z724BN;G%Wy<_=%U*njc3_+f zc8z#R-c*?%y$!NPMq^q8S$<+c9711(%sAY}zQ260lp4`dD(lBD9GI5Xt#6q)#X6;y zb3B=xD{D9r%x|4xkGU0eY-Qk40ndAaY~%CFI@WwCM*9fS2cKEo%ndW=V(A0)R>g!* z5Q)n5)oo`UZdMz)cYvuyuG(U9IEgiJ?OAI)F%aUzREcezAGgCM779Od+8YZ(3io{E zKByMWmx&o(DA4vNNp}q%@OZ=qVOf^Q_%Gi_jNN37e`7gAzFc7CY8(r#Is%1bX=$dn zWMp2qHws8Wij5*qMEu&BhB6QC~kagXd`zqx+`zjydV}XtEaIj0FN#gxlal{h!# z1C!M7i|FO=i{G5Bvqeev^5VuM9&R$QR?n)_l++7bfQ!wq79ozy4uA})TSm>8ABPDJ ztcf_-RN(A>ez)T6!=(_D;uC3{vG0JxJy!wn!1Y$dVs_ElH>EmGSQ69qTEt_?qO-kx z*R<*06SMY>c6^8m5=us-abhQoQ$MLb0qYicF9|ua`xr{_X%EU3Fn9}Ou`6A5+sDilfd%V2|!@0l&_J~kX!_gu3FwUVjbX$d6H^VM<*2kffaoP(D zo@I^mm`mkF*gdNehU#Ul>3p;_zYP%v;gO37;UH#&y82G_Y^u*4xJE^SsfB9S%xB%( zw4%aDn4`f0`AME5cH};>et8iH;F1gjR{Q2l5_`z^^Uj3UICE|zBq20NA~FO4lkYwh8@^y8D!GCSaRizTO%}2xl~fZ>(uySM1qX3 z(z9wJxHk!gR>>L&14 zwKp9dnQOP*mTRcP^iF7v3+v_L150Ozx^$o`SPtaR*cCX19jeB=Hd)?s4vO6!i$n zi=%Q%aY|qkAA`>@?smyP#F7|IM7Z zv2g~+Sgr-lt7Pql_|fFti_}7=E$VMu-NG!x->IdMTk_SZ7_e=TOxl%VK80eQ+Fie+ zl4?|b>%u;oGmYAyf6RA-T5spNq)x73y%5**zS!d^>m7>6He0F&PqPhaL66F6Y&*0!YOZ}^g1D~Uk+ZU5J=Be z_*@!zF=70eM};P6i|b~W&)aN@sU!vY#{A^oXVTZsC@9^sI9?}cs^#~&wpb#q_EeW8?A>TonK zyI$7ja(#52XunO21%B4cYSCHfuC-Zg%ONsqbC`L`RH<>cI98HuJR?9p5G(~epW7)< zC}M+X8(Km!zDC7oGz2C zqRc&+?mPLw72(=%kxXewuYW`G{h5`#AiMh&^YEU~gp`8fG+3cZtqkMKx8tQ= zhne#>I0$KfIQnrw4aX@66XG%{tf}ti$1CWgFJ^|8L45Ie?h;Bxlqei=jW}y{d(hEI z7Mg@nYrNnHuFDVCf>Q>eOO))&qxk8Lv7R{kW%*b^LoEyEp5Ah+DKOYkhAa>6agj@jD6C@6 zy*opa4}5)tCf#5SmB#z2o3vVSdIf%o7_J04I0q8p^&l(?B%H41Gg)Y@#qKP@g|E)t z(QbcMcVxWGyKA!^Nqo|Ckh%KJ^u-EshskX!`tlTUO~6@5VP1^`C#9 zd|4sPBh=6Lu|IVcE^UHo1KfIb{l#@9rTd?UtAf-n@omzMHI@OhIl#tsuOlAR@X0ut zUk)w)Gp_J>-XKcOSayl``eu&7M&6r`_^DqoH+9h|3*uC@>^w|>uPQv+mZ`=Q2>Jyt z4opW}=HjHnRRH0ffnO`zbiQO-%Jt05%+qE{>L;i1#G32}<88!$(B)7Av9-Rw?!e_9 zIZ{Y6j)dEYJU*JpJa{ODBQEFGTEk%NRN)ydjvY>mf>1h-BkRw1GPbQeN~+H)PMLp_ zw=ljwzMNimXU#oQ!j17`>$oubO6`-=lg*z;Q8rAKi=isEMhwBrb z&|$yswVlWLehXP5n(CGhwn=g6N|3B(3k|#|D9px0UAZbCE-CBH8{sSYhq3U4;xy~tK8mN&ga^RPhpZOOgYZv>eost`J#e0Q6+)jMI6cI;iQxX$kszVv8}R+Yq%R39`(s!B){Szn}1 zR2_Q;_L`28l3%?xr?1~6UX(o44J<9DQT588)91biifGF=;d!imZqi|V};BU$o#GgTfNpYPjXTorz>_|eTd zHZ`rY>5g71vOt||oLa(t>Te>a&h&qvW)x8KWz+RJ$~VZ4v2s?`t&K$7E5^aSZMwCx zKkpYZ$T*$0S!uC&WGVb{)Y$`i)bSlQUD+!4^_Z^)%lmC)iT5k1dn|orf;QeJYxJd=i*}sMMC^eN+zhBP;8yjj~34a)(O) zB+b;HREnneV$MKyfuC&{o+x#I&cxSyA3f@BJA!(xjg)%&6X>8Ks|=2Tw{$d z9w$k$OUXbMs>nxto=Xil2~k7z9i0F463*W*==1@7Tg?c6vu$>3@O8TX3{SM#J(aKi zTtFyjvc?_ZG|P|4OCP^XS$lSR8GTD8WrqgW^Gr?gwF-j2wL2uG%y+FkXZdmiDqi7F z5uP@?J^6t>-7wX;X640uD}TtkwzX36u6*7Qp(4r2Y4SM#Kx4s|#6dhYhOCj!irej9 z9WlQO4Q#R5tf%fHW8zG{sGnpD>%6%j`K2{&wyguzJET~$!T9aYPbaST$MzZV|12xb zX7?s6OF#%X&bq6Yi52Unp4oES^L7joCudL)!qbY;uD40i7!)iM6wbRMI&o9NwzR2g zLlpZI6ulQ#7!ft~Na`f*uV=qSSIK{4jxL}1ZIv#;6!$N_;AXdpAv*Cw=Nd0xd5H<{ z&Q(f;PT47XXY9Mi!4QGWJKihx4Mxp_{JT4~KIW(-#rB7Ed;F=@Yn$E0{Jq#kW>1V@PU1$(AkA zC-bVSs+9OVan}2><;=r(+(lHK6HYI7+kDQcY-7)-wOM{|s39&#xm{Xv5= z^wT@*ysRjy?ge0!^S&rXRS0(=O!*1X+h4y5{Cxs9Nv)AVJw-o_?(=n>cwGxgiDl-fk6|hvD zF0)m!MMyW4)u=jRk6Y~i?ki!AJa%;RNjJB)Cei2hd#$N1imE&m_U86ZPbH?iJt-u$ z%8BjmTa1TvYC+RnG7x0S>m(?QX+bZ0o5cy2ulSMak ztN~Bu@gnN(CZ65k3&#->JHE3+UZA;^F^}cryB(n-Qz|obFwROHGfDXd{;|!as}>Qu9Ahic6yb+d;4I`IBbKXFv5GGoRR@7k@X} zj-uFm@J4kYYe?MvPo*~4XnjmriBwo6;7MB-# zww3KO8eMNI&}#l@QxPt3&vly8^J(vwq-1<;D)tu7*Uh>^jnwx(X5)T+iE3+*QO4-B z*xFA-sC@kLodo8he!LOJziRMzH7z`-<8$(y^*?OGx5=AIs}awT(91r19L=*OQK;JZ zrmBf^cSAUOt!^5i*F0V_{4bTo*&n)=ij-QV#25xdip8aqI$(k6g9MV zuio19HIoImDXKf*mh7DbLf(+Ya-K_350;fJa~lvZ{Zn|5P2MIHKHsC{Qpw5@qj}=` z7Y+Yw?nQM>R%FAAe5%Lj|ctNKoi zP@{+JmDnMJtEB?dG)tFxFR#A%KG^?bW-OgZdEa~^ybRiHBKTdbc#KV6aa@J8fT-a~ z+An6wayM(u*(19)UN^yrxN$T~X{6?ZxA=;igiG;8e~s}yU1=BFVjy%-iL|#ZX?m5` z=M}!CAi9P>ZqJ&!GW^bN1AvDsN+TmKUUl%j_l9%hV$!s2+2gl>k$CX?WVz#dp+akc z>yal}XEI@Yr1XM4UP*crgL5<1C}(~}?*%1?tPJL? z_KIDVDvrL%UMr1H=QYesj;bhS{4j0L41IY9?;C}D;KXxrK6OmG^Oe;2nKyBom13@G$Rvs+Sfzp zIPOL{_*satc_)PO^bAz6K=O#2to5P(pOf)(5Z^w0r4wx86&dGI`L0mOTD1HKW6Ude z%eOq!E}rgP7o$^#Y`G+hS$Zm5uHv$IDTm`(>mSG7d8=MERwbsJR6YE>4@5>7!bg`l z`%R~TY`Y1uhTxDES}}Bt4;N1hgf=}efJ5xd##ga5p{z0ynLXCG{H zntQX%pRK-WXT?UxC*MjRv31io8w|8S%-zO$#q(qt*%a6{f$k zyVn1*Wim9)SrOzOCs39+8U2!5JoDJ(C(OD{gSA zm#lNfY9A6xuJiR;^qlRTq$U|9y*!cNDxq?a4cKAd&kwZ{E;zNEzY2OFqQ6YI_K7+C4}JuR3XDps)1;HCSjYdSrn zkGS!r@*KW9QfDQKYI~QuQ2WaGUV+mkbyDy76?QOWidU)sU=`{Ac+ckfYkm02i_h}D z%T=^FICI7ci)p3)p|G!nos{kS(tUlh?>XP+8wt(M3shnL(N6Dp>axXS&leX>bECxy zj3$b#{P`-tC^prvQCV27ZDi+wR_MAf@tcH7vc3CdT-SZYaSTjZ6^3I}>oWfQcXk@` z9&-tgiINRt%YDY(kpdy2d%IvpvyS|>9bi*>YaG908aBX@wZtiYQc842iL=$1QqiCB zVp7c`iyp1UZ(OE*my%>N&Nb{%p7FrdoCM&BI{`=c;?)+Ai#1-=HeoQ%rSm@i@u%uS ztD}!*ob11o;9-6Dq@_Zz&*_Q6iX)rPeTsWH1V%E&J1E(+CU{+ipL(f9%;V5<>s5kY1avnCFca6SUiGkXozj-#RCJux3KP-l#wlv zLO_7 zdC@D;Kz#5#^7xuHZu;5G>cpM1#-2Cr{FZj5;EM*yu<1^aFRJz~&-YQuNg|I)}e_g>bmG@_^wy?#ccFT^4 zJrg%NMzos>inx2H<6y@@h>`4TU`LtS{wesui% zcQ(}?4zVlsB4R&wmYn;rfe7AtRcQ0jVA`fDt@5F=uBB%j@(vsz%1cJbb8=ty+pp+K zaFkz^Lj@>lcTYVy*1ThfgwLHglc6X%Y9a`M=ATs8O z+R%rj0&Rx!A&;S0kGpI2RXb(A4>iYc;cZLbJ*6Nhpis2B;bgR{=8eQaH=)E(lhy@k z4uQSpA_5{55BpRU)^<-FS|`Ib5pBE5%uu$=Ww|_;y{sj&@1g`lW$SdMb{^-Ed(KBn z5a%!BdMqjT#(^i!IakHU#VvCAD5|lY8nG=B5{yn5t(33dEL?Duy2x+}d-d%|vI|G= zh`L2+i@3zkX+uquBm!b$zca6AHWi$udVdBk7WJAp;-zEg*G&hGK7R3i@2v`zJ+r9y z8WU`J;{%uXQ{Z!N#+rfBNBhEeQJaFM1UOpv{v5GR(lTmMlk;9V<0B!pRb&1ad2b#L z<=e)M-?JEl!Pv(>)`;w(Y-1^VmV~qzOCk!XC^BOw$`VB>ODHW!NF_6NS&9-ZVo;W{ z48qvv{@v<%dis8k zd1+2SmK+(E!J?sS`RUZ63m8m}A@sg_H(9*+BT1?uej1vsvIqbH2jR9pz=73iywfl;-{a8(Htp;`^x(ZB>y!WYj)(dLRJrEPKYh*#`U!^ z(+%b}Ba8RDK#x(MNkEt?*ohEem)V}Bp&bZ55mvNHodeY%r8BXex|c1UiCz)*ugpUL zG7;=Ct!P^S_e{4b%;N>*pTjZAbW`=3B-Qx_e|+Vj5#%Xk?x;sJ$pHI-?2pgAL@X5u)stWa8R4!NTfkiEq@F^Qy|~ua{{^9@e)Y z6JtbJ=GVO`9Q&#!eLx+6-DAO?P3doZ`F3TNd;a0kvefHF7d=mqGyBWW4l}%81sqXH z-B_1*bDO0MujTII>(5fXh$l^W^>14#U*9IlrRqkSFyCvK4o-m4h%+K-r~6TKJO9s& z*UPa|MY|jPZ?U&d7td0r?J;6|9Pas6)pjj~ofMiZy2oF%eqYTZX&mH|YT)he*^rz~ zXC7J((&ILWI_r2dV1?4y$76FIA9)ZQ;kktf!o@tK#zikCI(|G$+e=sgmZQI)-5mDu>#eY;#UZ1F z^_Z@oDVdaE(x)+QgDKbWDzWy^Ls=jg7P$?O^+7BJva{)A-u@EObhq%Wt%TdjB)9dl zq(HEVFMq)|eV?dxtosUhy=hN{pzSWwpwPu+pZ2@E)^@K+MyvUR=iV^bkkXOp z0wOrpZstU;Y`_TSnyJ1rEHRPeF7632Fa<9HZ<(AXzT)xv5R3YiO0%vpK>Q9St4FdJ-Pl+BDr}ytyx?*}m z0DOqkP&;ehh7Rl=mpn{v)zpq2V~%ZQ@Mhn!Yl`%pN_*6l@-EC7eNu$5pNMZXmr z#UgNEz4z2g0R&^nlWH)EF9LTMK2kIGnuOT^uLwO}9b3@CyM~nioLLdI@>3!Pcn|3wmpbIHvR}}B??H4V$}POXY0;V!xTtCZ>^{RLGWGgJotw4p$q*e z0jQ7KlXr(DhqToMx8XkRpVnws24=8@WvEORmd$j|iaRk6F8R zLa>7{@lOk>8s8lK)k4QkBt4KGT)8EFF#ElG9tg6E*^w>1L`Cv&^He0aGM_8V-em%U z85q6twiF|#8xzAw1Iq2gwGfWZDu>bl8FdKJ)6y`2 zv_TU}fONdv@7iKD$@VgR9+G2Kt3wjz9r>7i=liNxwsNF){ozja&IKy9cgLb02)?2Q1>MV7)Te9+&*Ko08n}rcrd9k_L3f>DjlqIB z;-9$@v12>bKgB>ai9^QYT1r18mnoN+H!fB<3BQbKD4cs;uz$zh7h{ED6)ull^3i<@ z2V=-=6{UGlsWlT*$Q+TeHv&5%16Kv-z9=mbcjV^cg!)qKF0PZHqPA|lnK`%Om9}cU zZ@o>P<8~_SVaj>;>~9Um+uc4CxA>Y-CKA# zQ%_XNB^0er)Eg$dbh58{B5^b3S8$8&Ah?Yjey_FV3^Q20`F;S1ir5PSjNrPYwhCl) z&mO`gW8BBwSpqIAr$)!xGXB>pM8eLgN|2QeRI z=1P$SzDdWj(NJM9udV8}*a6La3MWJFxE^UE2bq{U^wXbr@}<8iJMVe80#cnzCyK0LB$zG6_n_ZDp57MSuV0=s5iPzKh zmcsbY=b$_@)qNG@;If<;+5rzShn=XsHyWQx=}(^!#e}ZaZR6)P(Lk5v;lz(Bd-X^W zSX``CAKNSRf1PcR;T>rcD+l&T5o3Kg6Z1VkM~Pc}hKd6wCVv*Gb*ek^-lt3g@?uEG z?HZNEA>Q$NNL)SlQ+QWnao}aO)ojBD;~mk%aV0d7c($c@xBV2Wz)~$qXb@>7y@21d zNwU%+vjS>C#e1+0jc(}0jRFcic8G2J<)Rk1c=5+}YqJBE!g=X=zSH4SeH!dBBUW$_yPXG$Gw7ZlNUKs3`RoLiF8N$bl)d2 zvV*^>b|eew0ap@Nh%3j)!o)3c_7p1yFczFA?>#zq6iP5pTwGo35E@ZvZ}SGwol)}L zt>Oy1l6(yyZLJMqC|B4eSQMgxgtJHRL%yoj@?j1Ht`rlrJwh|Ojfcy+$HYv-{Jz*Z zW1k)KTP0+pvU#c>jy)z26wUpU0aMs#?9iM(qh6%1<$i3mUQ<1*Z^H3PR*{-(Z9JTY ztZ=eA@o-r}!@7DaF4PemYznTh9IhjNG}cCZ?0B%tbqE^11bFY|drX8Tm|NyO=^7G=p-%p9O9BrdHfu{#%zq#@j=-X$LL*aTt?k}Dfz~P7SW&ejPl4rJie(kx#QnoN&G@6t6tT0C2eJeWw zp^T+{s;Z7lLJp@%P?&zac~6Uav1)VQen^4E;au?Pg-B;KUhdns(J|iCp2LTykW)}s zLDhK`6umHSvp;1AR_w51uKYI+NN)d!FT?mCvI{D7quAl<76!oh^z^Zpa0AB<8CPgo zYoMq`C2u#{u+gE-T7?OFWbGNfSLZ710Zl#G=j1vuTCf=%3RILf zcxpZnX4&v#GK;BfCL!!)vZ;REQX^nW*Riv^`tB6_V}z)%58LH-I)}$TlWQkIv7qVX z60RURDcIvJdt6}ZRwv`EAJ)(dZVS^wvg2s>Z!i_=gjXhakQUjRL+fBF!fD6Zd($p1 zQHghiN7)A+g|0(83MuTLx5XfSXzOj0Vae4X+}Yu`r1PT<#iz?bCJg<*Q6dX*I$Lk; zegBY2k0E*weWQTAby2u3kNaAwvhSdc$KPqndjbN50Y!O94ICNDiWsWu#-A%Z|Gnkr+Fh zYsbwpbY74^nilO(T2QXh(7QpRlLUjAF0cT4FNt?VuHp`d(if=Gu)BZW6#K;!C`$(& zyllZnq7Bp{YK}dYer&x6G7#PocR?dG(>mKK?<;wsoIHx*vjEG%0J7qwG~okKZm(`UlOX^oH3a@#MPIVf933t zf0gIg;@1>OrWy>D+c8E~u-BlGH}LEV@DSEhtk@nVE#dr+@@V{;PI+3RXm~5Flc?K( zANc-!lT->teC=0V_K{Bm=db+OTT&gz2N}Z5>vAgmsS6YrYIdHcdj>S_DsQfA8OzWg zoq)+|U_bai-)<}47XTV9^2FaAZ0`T`g|van{1aE}w;X@K01C7v5A0ygx=}pgY-Dd` zJQ>((j9Ctv-%uzxdIC^%rtB&gRj<2@J>u;RDGSZtoNQz z`Kr)yuXiUPncY4{h&#FY5gGx-e=>$t5Jt&=sUX<@XMD4G3J)Mn-5$_<_NSL*&}+YXX3gd1dp-Mv|d5Yq*vQuC1JtYhm-rwtH0LQM#x4kqRr+ z8To&5GW;zIpL_w{T_X9t*0Bo+VMy#>QQ+f|$OAroPuxiYw*i`3s~75!=hII0i{f0sIl6!U0zYIH z_*Xk={}v)Z#U^cATg(g(DYD53iYO)VQuzg4l&=FmV`4D3@|2-9$GOKE+_bx=Q2^3K z?Eh3@$8W&`l5Ard?2T*JFzgB7*O8wtXgFxghA;OY21B8?Xfhq4kr&f{u%gQ501`a?X`scwZzWN@)l~=93CN-FD>I&e>0~{X-bQ2uc9aDF;QQ{)wpm zOE6UdZeFF#gSp#sP2W(!SAeZe@9r?p{MUX5kj2G@3*1p4>ZP$tiX`dp0rFcyRRNB! zO6*O;>Wb7wC|9KPc0Hb+v%sZhPu}-aR*caYI0(f2FF(y+hZQJ4J6}1aY(uOOlpC&g z#H{$)9FY2Pdf7)0nixVKm)5(3eY<1&DZ@;J)t|y{X~AsOQvAs=5s8ca!{7uB<>m9% zYmUXd_fmYYQ@>qA=u$X*7y=t=MJopQ%M*Ql27rIe5UN{Z+-3wh&P%)R`QUVtB{!RO z$BvvDFaYsW6(Vg10Yj6zY1Mbt-G`wIv;LZoAaRKPTO4$@br+Mue9zsgj zoQ^MciATUVlc7qO4FUp>zgvE)Q#vQF`3kPz)rBMdJr_d>HvXO9?%%5njkQooSIpF= z{08wpZQ2Q1x+Z9mrIh`{VEDUP(dTupl914*U8cd#Oh+}}mmPNhd)9`gSvWM&(9m5d z&HN|dMCzeU$f$AcC~NL zFE5|0fzIBbEEZFM!Pc>^tJ3}Z0CBdFGeqPzj&Ds2BqRcQ{<^PTYj9#7LZ38fX9XgFT7c5 zWvNJ-*cP2UP4(Ji&FsAg@Nx1<7}DSg0g0)nRF^N(NN3QML#F0rzEVCZT?oHKYXAV5 zi11GAEu1JD-_e6~X)y1Nl4GX>Zigx6aEmt#mXmB2M1JQ(5=-xL4XgHIiqH*;B}I8F zc=9OUbp7KWpT&VdvRxaGbIXO&%acv~J5Xm1hs%{e5!;zxUFPQqvDs zhzI#=Ag31;%0U_4SBFeV;3S|NP-D}7R%bK2f9AMozKmaaksbJwsm<1pv2A~pAEo4v zRnkz*cFtqI3pq#+WYV~WCG9L;6w{?m!r8w*rYu*@r^_F3_r544;@Of(dC?LC1gmkw zVlQ0{E9O|Z8g9%QcF?n1wnJ{pDze1XOi?eV-G#1(!d|RreLGvgv%kg6`)mRLLqgOp zKjg|8QpDSKagvB&F}dC&(0u&d6`@9#TmbKIrd$Ed;#M#(9zFx~QK@PRZVYAp>RSPj z-tjn|m39<5rvzEg0Yw0(N1)&oK4)Fy^59Qs3+bM=nfH4ip}S32ckZG zv^N4xi|Wi09cksl@j1Tw;5JW?K&nnpLX?Y6DNa*2=nN}qu5S8IS`k~LxKSi zp^=Zo@iS|sUZ~Y5hSX|dasIHY{6*2*r`QyjC9Gk)FNr*FSG`E}$l$g%x>uzm74B}d zSqez)LTJ9b?U7sGn|SAbfSQQpK-7JgIZ8f!57ZI1!Qa^6_?!MJ=;P>nJ#=FDey0Sm zZmHrXeEki+kvcCDetMP;3rN>LWqTeRYI3rZORr}VK4PBQ+PK)&b3e+^Og$L#_{0%w zX0CWsy<5G#Z}_w5dU`YqmsEQ`_F$q+(~A~+$6T9fy|rgLdU0gw6&@U9&o5*ecr5Rh zTUSxr!OYG4pCNiBsRvYy`>KbBPbQh2Qw1h>_)b37Bz~oj_lR(O*e&e}1PGn=;E|>P zVZbH2Y{m1Z@WTT_H8eWlV)jHoE^B|ZZrYA_R|i=J^qij4H6ib*Ks$bOeZM)sGMeigPn{9GtaB~eaRS_^kW!JKbuq}QDH-M> z#~XI7fPtvqZ!bu<@Gv%hnQcd6wOP21SVWST5(fd_k~(fM5C7P8_jM8QC}M0i{o=sO z?Wfvmzumn{h;IH$+K`ZWjJbdD?3iOk)TeeK?%9`aGog9;>VQ!gOX&qZGQ{IY`(goH zvab0K{6{kYAna1$rh`<-;fqj#vT&tJbc~7!bf}+1?!Y*XH`Va)+x2YOAH(3HH=!XC zMC*~VcA#?Zs-+^_)uH(^;vp4?(FUopLUTIQI^yA0vy6U7Fl0kR16&osD9 zk`2tAjC3$fd8z(v1w@LDt~yHJ0fB2Rssh>%6Ps&{9d3*jl>poM=Umki3r-EJ!EF*8 zhfhT09beE8CsWTqXr#h<{Qa~~T?8902%QxC2Ce|0K^{L z!>J%4J4BJQt>uZc8?0KQs->^oH$R+j<3$MS7*QH6!zy?6JcUv6Sh8|DBH2Vf$q&y> zJ+VnBa#tEq5Z<-xiaAJwqgd=mwd(`vDmkj0Laij~sn|7};`dLN*`$Y%yq-UvlSH5F z5=oPn%{pq-T_^s+&!X(nT4lJ4lJAAX#peENzXkxg7Ql(*5obqzRW^t4Zhu8D9LAvQn{GCtL6|!3)l)S`vYg#6q&s!&BS#|H;P@hjmztHJ|5UKcJ zv%99pD}95%`;dODpL}`QxeKi3*6mq%=FS93!=uY%eL_|zPM(R(BTap`=?*zhvBufvV>mAF-X|A>d;(-!tp+j*xtM& zV|Z=3JL<)f0ux*}PJGw@*SB%cT>`H75CK@@tTEq;Ky0fy`Fd6Ng%zUj-aCe2{k~@${dM< zMexqfr9S!iBmj4=nY=%tCo!z3r*7#&^~sx>@8?!`pE&tu|5f2miU>KaXoEYiu+=E< z*1~l#;3BvT#@kq*ZMa)_>*e!sh_DYp2Epr$y-JV}v2eRQIA6-O_sZ1ceFJ5VbOw>r zSC4>5A6(WlxO52GX1l?GXGl*HkHkdGG8H3}Ndp7ko#^*{vr6e_vlp3&3v}InLOy&| zTTIXSk^Y*SFZVp@-rVYsN4(w=hJiyMI-2J;wt&i3qgqCm;U!O)*TT7oalvi}*k4V* z1Y@{u{5u5XKJ~u-qPu?cV1T82a8k5GJcR}gD*JexBJy|p8o`e zDLex@tHdW)WZNg*8LsW`Brlw&?Wnn>!wmgEt*%<7fI3t>3=@Po9O=R@PaOBT6^4K( z1&+hJu|7FGEW0n@BAAeAU6&~`QMd7E%;e|^U89n&pr0?phu6r>iag=W^Pr6f#k7O- zdathS30s}l#p54m^DZ*Mr^DTCejA)?Alz(7jTJy$Kmo^%*^_;D8XVn>Cmydbh>^BB zq-1cEZV_EHZO@ySy7ZM&}CP2+Z%be3rofWaKH$l z^(eePh@VbteaQ<5)9_gqz^ItAx)wD;5f6Jc&R6RjFBF8tI9{5&I7$^v_NWK?O0cfj z>i4gC4E3BK!#f>l-;f6XmIk@bx8~aVqJu*N&@##okWXc8u!(*mW>7v2F3_+`t@^%M zz?H|d%NxtU9Z;>H zx(C&YuqXg~hcj!W0#z5h(Alnl;3a^i5b`LJ54b4+f~hthd>jD0cPd5NgZS&0KaUTA z%=^DT4|p!kOY;2R`v?AupAvszEId@sBkX5wI@;ldH+J4J>-F?Dx@mOX=uK<}6dQ)O_tZN6#|GHf1ZOa21_?0&eMN&b)-E_^84!dGLB&Ym%`;{Werjp{31Eh!3 z)LS+yn~Ny(llp(*RzbgURT}J01}av9*F@3{VHHV=zZJN8he`4SII9dRjFJd_6z&e4 z6xHQs=DB-u#V=YT^0@Adaov}H1ZXAJ0tW?Ej|rHnf!9|Mu6utTe);7o16y;yTZx|V zAY`p1pg4AYPSxB8KNap_{TDnK_8Xt2!IxnHQc8#H$KFr=Fifvj1DsA@X3zM-l6Z+k zk1!Qu%lTppM$3P`xwxTl0D6oEir+z9C4`#?h7T29*`CVlG> z@7xM4rQ^OZb8UF>wL4Ewqk)>ylvcA@qmG@aEZ`df{ZyfjBFZ_vz29KYS4o*7HLh{fF zB*5A&{B&3vWUW3J@*I?j_LP0g2rO<0Hr&|gULRilagFF>e52{PQ(kY-1uoP1yFRwA z0S%qFmMJOvf{_vGRs-qvt*1Xifyjf~bMqWV*3!iDHbrKSrmr&anSr|Gm#Dw+ugKpR zG!5ZNpOxa2OL#zqtzzQ2(>$bk_LQk|1gV!?G_EDNN&+{lo`oSBbMvA~uSf72eBcEo zHdYzCbmX32Tmz%-O?`G@Wi09F(MVBDUtCw-DSP47J2Crc76%^H{9Km3<7Kny+jL}3 zL|mQZb{KYz=iNd9M@{Zuqt5Rao~;asW6y*fu05{X7E3?(eBcG8jm$qho+z}zrsNT+ zmG_1UTxH{T3vn}*AcgJPo>+LLdzQH}URe7&h~vw*zV%7j`hQR~B3HB?VVXdhfO8^;v0r)3>!RX2WAA9M`5yA0;-$lffP}bNo z?l1)JL|TH#j~V_&pynogH^td75@6#=BaJ+&iGPQf9~bGqH6Y`SRKI$LB|4(-TY<$J zlWk2;18rptY47TE=JT$Rfz{&WB+~seQ>r$rrHC)r{;G87Z%B{|&#@I8DdizDp4nil zuFGcR(FWWR7g90IMuKTV#c@M2Hg-}R39jVDrJ zm7>paIc-*%d2iCoRJwMo%8lxDqWwDDamAkDK2k>RRr`jSfaO{G`@9ZGVE;^EDyOcpPwF7@(_lE5fox$lqnuUg456`#Uvc5) zPr1l%uW`F&$M!%JO4D*S|J~Z>ox?cU!yVB9@5{A@AOJj)JCR$S5B$z_zH?!wT5i4c zZ_G6DH)h&uM`n{2coeZCJs_I2v6nG7`S3ZU3I-byViF+_#<#fD~FXS6`Wv*_gHfslr!}WrKpyGi+_*Y0F;B0y*l2fmT zCMLB<3k2Ohrhfebwq!_Kb+z7|`@C`9Y>oVr64Losn?NOs-Xgdzk&(Bf_gy#|-+&a_ zU_Imfx~A=8*|D*0-+^$sJI7QxF}Y5WK*)>z#v{E~U##k@v3~L+0zaCKf0}2WAPU0yMkOlY}s^9K63LUn1Pw5M25^DSvU1H!xK=e|nyvogItnW^*}DV7)wkj&~g zLYXgC)~t*sAX@uxLgvcvRljLo6*xcfS~OX|>GEb6BJRblflV2k&%ON(%op981O@^- znbKK)rf>u9?{|6y+y-3}g(mXn-YJTy&G>RREy*PfHmx;3LqvJ$6#59)nhAJ?1740# zJ@T_}cysCvlC!NgjK)Ygap1uHph%nNiWFB%w2tmq{$Nwqjgz$L55prF$DIC_sMEjq z2pu-)Gt^bQs%t32$NA`WCSBt0JDuf(?)S0#!Ob9pxc-z%o8a>En+!PQ5a=!i#(uZ0 zP9(IDD&i>j0R-*g_RZ&*{OLvertEh;URjd8`i8avSig%kb%F)rhBsL$RE$CP1p0Ja z$lrNi|Fu~VZ%UDXt*=#p>!$#ZD(~j!b+`r5kc+)%_0q;ehQqlTr=D0#gX?Nf+$Tmx zKLXLbM^4ZK^Tt2cQyA>>iIpEEqrDbYAucS~$+CDBMtm%2pPC2oSC5r82m`a12dN+!{mJcoj1 z)Yjr9fn9;Q1q<762hwb7u0^cO)BU2+f3a;bzcviwJxD%7)>H?xKcm^PHz(6v~#$0T++0Bb%m$m^o?mUu87_jPmGCtlf-1h^T&j6Zn z4N}@49#;}`#L_oiy`$$XL%7-AK~4aXM*ZoN^zf5k1w7}NK<7(a(nLb3%@{jKHm3dA zEC&7FOHffn6~o>Xmf{HS~pjb^rZfI#}aL}HiOHTfL#p&DbnQ6#`$t+D{-SbU$OxztB z(p#CJTdWX;wRKE(`bQOwF(X@E+zn<#c(Yowb%iikt|q3P2x;3Dny?X~;@9WdaX%c~ zRPy5)UZP>c{^aTPYsUcXoM^P!YJ0WSdFhpcM8Be*^$nOMt=Y@p`NhjXsx8mqtOrr$ zi*&Pkfm>&cBIg=Bq|59oLrJVr*i`@I3tZ()Jy-5Si+S*agtNOeEOt|-3%D6%S9_(_YzkhiC0??YE@;zIYH+Dtx=k$CAw!UAi*D1sK<{1m znJtgEHIhC%!9)VtIhgt^v#-_-bhQ4T^!9D7{#%@3`#xuZfN!-UFNk`Y*gC6Jt2lgk z9=SOzZ3ZS7(m70`!ML^Z)N6vi2Rz;fhRo;awr9CRBY9OKH4p9S_#v<4oe>pJ|C26M z&e5ngSwQ^SkEmc&mF*lDT-ld~eSO`Vgt_v~D|p%ZeBen2tgw07e!EB3=RivM6sK&` zHX1K{uSxd!gOw58xnc5Ojf{d;>%SSrkgWx?RW_6id5M{%5-&ZMrc{e=-v^)+b?X}y zi_?P8M;lKaCLYu>p*s3Jd)1kcgY?|naZHzqQQH7ii{E@I2P@!*yLs~IuS?8y#23S? zDbM6*NDOr9#pMm)$fhcTSqq!n776dPu1XPoxlH+Ml)-oZUM8uqCIys&!lei4gd3>K z>~$VkM>k+8^X-mHJie!ikU=RKAloZwoX!9=Y)O*7Mk+s@Cpv)NSK;!{_$*O~?N(9s!vI3l7&ugyf}34~{>K`+B-NC1U{3#Pl(R zsk|LUlxWUZ-z{D=m|d#Eu(p~BAHe7+XFeMSA)O{3tPTVDo#nC_zxq*I!-o#xDqH%^5cS;6U~8-4>Kr`peO zG*x%Igar*@$zm{vZ?tz0WE_wtN6)nxN`g#mxi;sf*wPK50e5d4iSB`DPq#0;%O$2? z;mL~R62w#-=T;VO>O?818(+fMlfc>keCS2?esV<+!wh|zBh3Hr{r?dVE@-1emU7_H z`!WZS-W7j-hX(pTxOgaB`1inv!vCPwq44NGpF=w0f2p=WRJ`=R!Y2O;d;TjN{jYH0 zzrv0G3XlFX{7*rJ$|wD==O+IOd;TjN{jYH0zrv0G3XlFX{Qp$_IU2V%KGb~x8-R;q zDJn;0U(2_dN;(B_oyf3J+A%V$;ABLTLY?wy8w-}pt$Bv^hJZC_ZbFgSpFzrrY+Y*A zIY+$Y_#;l^08{@T-$5pD@wPi#<7XPAN4^AI$HaR|bI~257-+DZ6a+M(Vexq%aWMO7 zA>(b3LwQ3$10Lt`@VezIbf#$ozpm3QhuAz9lhN;C7vaL>t`is7DqAyMUN+&e0wJ+P zpl@b5336{Qrae_1Uc`GlgB7gBK1;TD5@Je8UhOfI=HfRwsM7g5=H$}K3S$o7*zq;7 z_}a&D=w@>@i-XrUCsoaIDoY-Lo0`|?oP1i8$RJZYa{6@&2B+>(J+wPZ4SUyvfhS`=iJpWsdZYupG7Qxk70si*lR^o?8U?|wJyUqibz(`R%+T~#VXTDeIyHP)Z&0f*+4J5n10 z9#)_w4k)eXV_#YizQyd8FR`(>^{Kf+^)**gol(fW+k||{u#b`9wt7zxhX$>|V`_bV z+vIod$h9bcje@+N!wSr+&aie?iyQkZxIn%T&zzlP1^Qsa7s+>kdzeEq&ztNQxZ*c2 zQiJJO8<8iphh_;ZfoLqxxprQ`GU@D2jk`!s;SSCRw0C6hIB#XEhsHdXcS1MsaajW2 z734W9GU#a zaBlEX5#uMEH>-8^4+ z-;xGbsosGCavz7BdERU;oZY-qKHuB3&2=DBDdN-0nS9}p2gv1>cmT#7Z*z@xkLrlQ z%aL3FZB%8!gv5)?1wDaPI3T=pP$~1DIEI_Rl!C(mk}LcvK^K)jM@~~Kl5@SFNW(;6 zl`b*>x(vW>k#RSfLr8BaoM)K;Xmv&ayg+97>|S=RH4@Fzh47)NB6L6m`cBh=n5WI)Y`oi{OQ0DWUCc@#%wUS289v}Hz z-?0Y{f8AyV$b`CV+S379^@?nLfDK8pp~L3myyqT*!wlGz|Kb<-nY=Of;sdRZAcJQB zFGW<$VpfbjeKZUFpdJEgWC6w#1^Ng0rB9;RAe`Zt6%x5Uqr*;<6zL0KAom~J14bUi z6iiu!m_bZT54-+-@|8MiHI*Q61G)-=!7C*dw11;zeZn``;@~TSo%VZP<%-6V5 z`Oe_c`*fanHT6{QR>oU4kt@2@gG zf8ltx6>aCNA$IDqQtTrt>e&WrZiSf|XQCNkc+#(2wrlp#o^0RPWj*z;J$Ht|C{+H+ zhF~a}os*Dor4(2-E)D*^LgOT7#-(xRl~Xy*QtqlZ%r)k5zVAUf&22(Kwbz0>L;uxjiHey6q0S7hZ(@M&8;7K~xY7jkTZmIK2{C9)y4keG};j zxB<*W%O8~>!w_jZ&ZP2gGqy(RNlwGEi-Hkhhoy4ZSj)lX_zlh<#3I^>vt>V*N^YoS zJ$wp+`4M$Jmf3mNcUAh^Dqc@u4u3~n_%O&O9KZX>w&3(dkn|z(fvfrn61Z5oQ+%Qg z@(BqxB*sLb`EF3-Gmi+lTRxFpJ=gACDKG(|Bt+G3O{7hUfQNWt%|<3tqfbov-p{R< z_oef`p%LBRk_$SO^v-u~Y+kJE`n;Cyr#d4wjOflW*f~HMi8;R;^0<%a*vv-(b+9*^ zG^`Z6(vHO>;1KPZWwu8=`d6hbwkqv&_rb8TU{?5>6NhF=H2y27yKYNASKdsGcROW# zm|(gyIAT*;MM)_TuZ+|OGNUp)^EUzsLHjVowX0mzeV)#Xq(`1D&Q=zCVaF% zSgXbe3=4ye${0I;Qx0RQ+&2=3Y2TxChvC$PeAbI|&|EKuN?Rysx~f z`*a*cgI^y9<8EcuUuW>8$-c*@?>tNSxOwdG3}}AnEQtvUtszLPw9L6I>z{8(??3Ok zwWjSF`6(tQlF~hfmvZWT{U7Fkp~8qPLwkvOQR|X~_MqFaw49lIaVuJS*9;M3Ms~gw z)?h4q@76SK+pe(Njjq;uYuyItax}qe79|EkW5AhueK2$hz%<)(Ha< zpIpfmR}Z(^4>i{wFbnUP3o~CDU%13yI@G7M&mbnLj`L6qEZq4O`Sx9ev$dHbBzgV3 zv1u@xBH1?v^!Q}Y!f`6S$)?Kw&SiM4;%l9Jrqvq_KDF4TLl#0DXJ088d9K@2H#ZJG zLCE_q-y&{E?pq$zWzP4K`e4L0-3L}_Ef*4r9#jOU%hSMy1b}^csHpZDMi-O)=j_M7 zg%J+O6M=2K1*CerHAF$}mQVEmAHRvv$v)SryKpKG1j%=G&1uL`}EG3}!!5UBZR-5eIFR@f*)=GosdO-5N zH^S5ih1qsj`*u+6)PX3j5=lr4nkRxUo1fjqtBaQ5&5dchqsQdb%Z40j0|4F=a*s>U z$R-2Azy+9JE+A%FSHLc9lSJEdJZVpIq>t%w2SL}W;E;e#|8W|eB}}-+x!uHpL%RI4 zy?PRSH?a6)FPizpS)GN)TL-{`5kszx~1zNo%G`X-Rr-t z4a?X%pF7MOqJPYg#Q<9>PgFCgjyAutO`#;X3=2k??w0Gze7 znoO93KNWELU=_?E!%WCIoM}a?0JcLC7eWB=C$brakTIqy`LLTb;7qm*KfeC&Bd z`Pe#yO@Q-_n7cnun$^gCg#WGq%x^tIP)0ou_wA1 z$yinJP&6w!z{K|WWK4*Rx>xcCcomW=gOWFmDi}0=vr*XiL2mt9%t4T01f>pv%m^=D ztyjYCL?i}|JSlX(((9hVy>|Y~bv)6?aUN|p|B;RbfDc@ESkgVPMtExMT(a0t*s}-g zE-Lp{HW9MBl;3iNfh`CvVGqhq-giXfy2I)+b_j zwRGGc>so5a(dfEJi%w>@aCLN?xls$bS0+P(TmpUhvJxZ*6ca2ZUk*hjs*4_La|#&U zW+Ax@U|E7xv?LC_OqdkLk`s3NdrsDcVY`V#5e+Xc4Jf!3A2Nd+lpB#1baopX%!rvq zQlO^U$ji=n7fgWwsXc`2Kll#bo$Dddfv(*#^TheOXCu#gG8@|A?9svbF@DbZ;+Wl} z`944+h>k$HHF{9-ua8&AiG(OY7loZ@mANwPU=?l;XrZ>l2BUwxmC?8*!4d%v+SQ&f zCNO$NSOaaR*AWFAH&rM5KsYhS1^{hBnY~7=IhWbygP#~eg#j7mQ7Asw*A1Sl4!Dhm z4@PC$RiDP`2so$xcZ|#rK3zl&Jn#Yxb2K}kp@u-atXkkS>DNH<0nE`09RW323B*FhV#{gEg&@6{$6p9W%&iP0Y z8Tg$}16sH>A7W^jpsy(&hEbj4%j#*5!KuSzJ)8BO(h-Gs9x!xNz77lL5jjuuU6 z=`wCdqMoFMiT}`Jb`Tq>|DdhpH5um%|ilhGX+a7BY z1a#i#)E6fFnO2@`!FOL?(SRs^F)5D4uA0Ih8J5HJ6I&202B6BeOC4eFMq_dIFYywL zb}yyX(IA`n99A+?{>D-X7D8cEh{$O%F0-)ssS2%Ko3$5k_}jM!NpIqnjChQuk-;2@ zdfEPy_q7c+V?CO=8l{N`t znqHXpB~lEbXscn>2>QAiU7V?x&>67%X#*SFmgznimJ_!fAfpC4bfLl_s8M8e$YQv} z54}&>e>Nc0rf9MrxkUs-Yrs{13`RU(0>xhC;R@Wd+#7JVMTNMQsk>9ni9+_thpx># z=lC6gSglbQ5j=68e!SDdM^}2v<5HFs_f}EoNjR7|L0b#J3k+rk8`5H|_p(}TkN-%R zNl;3c;1h?Gweb5i@b3&qkxCNhYv4GavH7`JcaicU8Pf(v6!BOMVBcQyUgCLjnyPS4 z178P#gf7xn&>n3iLH3J2lm9u1FGC(*=i6#q-ekM1+2m?~KQ_;EE=e()B6U{_C4Hj)<2ZM*(o=@x? z%NFBOA*k$3)(et5>xe*CdcCZbSEsu+nmJ4tk#wT2yv*_a{}_7{c&OU#ulO|Eh;fdq=hLJvYg-TdA`r{ zdA^_D>%a8s^&02QIdjf^UDtiz*Y&uU@GQy=c-^|!P>6{t{1$Kx^xl<~y%dFE6i* z2Hzs!{5ol{ex=J{p@T8%m`dx%b=Nok{I5VVzOyNjFqhU=`XU5PrI(k?* zL%YrUi3(rqf_1egMK0!m9jOs(DiboYdD_V^icRz_crlf~xNSv5Y%(A5tc#cNDiyyk zR@jUuoQBpJT2ZqfUJ-n7>Jq5EQ8My?O*44IbmcJl| zz7PdpPjv%nLD7vzmfjtfY&HIe=c7<3L*I%?00Cnl(h-aBN!fMoJ;G6!Hd@B-vGou6 zwWu7P>r}EE*{@Lk(ZX^n3`iXWjBk>?%eC1s5>wNQM0Y2p7*EZ$Ky`+n1?UVwgxOd; z9gC2TaQtr4D)UrjWmw&3h zWg_U)A`qqQZ(wl`9sgAWvy$E~vnw*(C**V7Aqp5GUp5Ds*{cWOfeD|7Mvn~ChP-1a z%rX_ncxC$0Dhw&FP?m$iolNqZk)}IOm(OzoZ+itllS^H+#`!%q!#f*wr-bQAD-*>(cbt(JlKb3teqrd+z6j4cY%HU3b{ z7Kusq68UI_{f;A~(j5aC7#36TH@|`4lE36_XTXl_Rx^Uq|C}ygQnug5<7gnVS91@Q z!pgQO;VYpY%$GJ=DdgehWekqL`>33l+RGUSQrh{)KQ$C{oIA76yH>!s|HnaP72L@5 zd^4E*YPNRYH>frE<9SF_u8!Yq`ec;8V7A%e<)OZ~iw_ESh$wJntPTB`i?#ZTLlUC! z_ZKE%xm$!H)|D8aSkM;OclAwi(t~guU1UWKElc;~8r=5xM@i?5AnaU-{{6nl?j=Wf zyM9cHaSx`peG+lxJ13X;!Y%A{71fSC@ACjzsjTj3G{!Zy|2*GRA(HM?Zm-s-DjJ%- zbi=#~O=1irc(jXk$Q*jZIQgB6Ac_jFpI*c%og-fH`i=sKOd_Kwu%;rkuQGD_Q0b>o zR5`$!hD;7gIs}(0a$lO)1V|129<*VCdKfhR2#P@mLi@l1jxbN5686qU1=Ud@4ef_5 z23)?)pi(UEjCl(1!3^Rh9 z`le+iCclkxnf$L2`O_%B-q(65KF=+S3tX~jP)Khmq!~w)8r0c71ar0<*B6<-y(_q0 zm{b%#1#5pqwH5?aRV>m-?D+?=i4#xi99UZkM~HBDboJgq zAWwxn`)0?Ot~_h^Nz)xl{_xdSKma#O06iX%fr#H*WA+|PfB;yX2qvK5PssU1C}Hi- zrE?y>!#+2)!oC`izMzaF260(CqT2ZV9OHh3PU3gt_bzvSmhDZ7DN8D05y-i1I0de2 zfvRNPm=BQ!+u~A)O!5#c<`6r=+?x|+ZkXtE*B%G(@oNMWm_1&S@}C+wQh6oPU?t1g zYH3Q&Dz{_@P+L;1Coxi_NIy`amdm8*-mKqz%C*SsXfA(1kB#Nf94eC&6tw+v|H{3p zbgbbCybnvJMX~a9_bcBhkB%S+GzWy+cHNpoj@qq#%?O@_6y5VTMS;Md5f97HV*d^= zfVS`dtL=Ijh6^mQfsf=)@o=@=E@XY+>D)bIs6w? zd|@?@yFet~CgZ+VMo4kl>BW57)2xqfMKATS6e;1OaxbF}nKr#kOKsEEDy}s+yLTtc zDu*6zHhy|Cx=N*FJP@;jgh0&y8R>t!N(Yw04B#LPc0HTD!%PZIg91bW`zze2X?L(r zu2dF6G+X`r)B47l(n&0)v1t`{Mb_>a5Lp`YI%E3g%QsbaFS+{QjA4P2W)^!)d!A|4NPlt|;V0;o^cIT^unF3OPi+zw*WklT0>`upUmI`{qtddq_?y zSoLMKTb1!mn8zgZO%b@<3hI>m@X=;-_4T75|5e@#Utw5$Pet0}araXtS-%*sYiWui za|Z;a>^qX$vn(&%Pz%tXb?it|;Ko|+#pVek|BU)AG_>I;Q^AAFuMS}&Xv$^Z1vdH& zM`+O(1OgRLE>B`ZWZVXMQ43K7yVcJwD2HU2H)Q?d=8c#joiWWtAr74q|w8ox^DSjgW# zp|N*pI8t<5;|Pk^P!G};KPPIfFPt8IWoV580?vRo*UxS@GHn+ z@&mW_IKiV?s_q9_V`7Kh;#d4@A463Uc9(EYlEjDzcIY_Cy5Ks2opB1%=tL_;YQ3C*aD(aOR>C;}N!t#TZwU{tuJR zL9->MM?DotTro7gt#sy9pLvelyzKBg-cgcuyf~Y0(ebB)86L5sH5z`3IkL@lUYd0y zkpvVI!fyHPIKoPr+*nkI&5+mEM6g6mW(%P)$HXzz!c;~DdX$@ZIFQ2N>Aw7&{U!dy zFc)hoSDOcIAFA(1Sv(@y+;O)Gk-qo&F7n-u9BFek{8;XV-thzMml$>hGbpZqJJVS_ zPZ;>;Rg0G#;ys!`KrFW|sBBEDxU))?9k+EYgcA)j=;vqFnrr?%^8>hYT6V{e&l4v< zMEIk`b4RQS=E}M8#y@q(=kY-4>@n9U2vOZW!k(p5Z@(pT+|dd*yE7{<*tCsoh{VW? zf(DxB@^}ac-#X|^IUiH2t1W(qu>594CdW^Nrj&Qi(-ONllB;BqxloKP*7=wtXNV!+ z=Kj4^0Jw(X{w)#kSmnQtZT{;x;J=Pz|9$*uX`zGzm!t2b*t`**o5Y%~xNIfLGI0i? zEOXq#imi>4#zxt_9-`KlBEtwREex?MIGXn8l5&b}<#$~Vybf5JeZ8$T^jjLP*A|%N zqGHjG?)O6+C62I?J0G1rH6P)ALQ@eFT5Fe_aRgg*-2Meb(4;leKc~xF#!qbw{q%XE zv8l{uP8vu&z7yn%{pNWer(B5F5C14@ln)!gF@HMmu!9Q$>&GdfW$%<0VXd*ABHqa_ zhx(2le8W#Lr++0F9mM?Lst9v}{(?PmutE_OJuwbpeUDvwYh5m1v2P=U=_@@zT0G)I zJ>9so=XGJc8d`*_1B6yO-II_i2G)^fsH4k-Y_@voLd7iU@%NArfCEf$_bErd7ncBJ z%*cFQrV@NI?f}r4(1FB)%@p@q$MKCnnxtl&@;-cVt_A&b*M`Ow`k|EtfyoeMnyRZUyaC zpT3QFNkL`OC=EYO6Ww`xksDq zw`J#@*%Vb=Ra?9oDQ-E~f46`3I@R8byk^|)DU7;o64Pl-GXW5g2Z2p)hK7#KiCm($R&D_5#Iz^Vw~VuK?x9M3Tb zy^&du18PRp+hRGCL1}-CC)UVi&-1|SpAIXY#|c%{2xtnLie!wZ=m>Zj}<6kC`Y?rDeo*1>Q~wR?j!7~i+kz#O=X{WjqSBX zy!F3aR_>j9-;Hio9^DL>LoxTlfJcPM%9n?u#6!>Xd3Uifp4aT5k`o42bk!B>LN6G? zbadAx?-h}goflYw51KGs&7S1hs8q4qU^TyP5!sBX_t-oeo9Somo-Fz(z-bm>4umQ9 z{HW@685En^bZdF)`3#(S2A(h=)bKOU=2$4yAKmLI;*XOzA6fBD=>h_^B1^M8y1ZbD9aC?jZOGoVmiAwD|%sN7z+}Ew*!_zBXpNqj)gXF zk^D>4=I!N~GvQbG*O`2FAqA|d-&Zzy`GJd>J2t+=G>mr!Ks=j(f|4x0accX|*fmsr1t8?1&a+(!=k`WtQ~SV^VrxgJ6Z_I zS;?zw@PKR{t$1X#v)3@hxZ6}bhsPCvuZ6_bdI!nx)m~Q$89R6z;LQi)0DHl zMbz@6@$!W@@NC(BYi74jlR%@lj5c{Bo_nU0-Lo{3#i|Ndxle_IsRTcOnk+cejv{jv&@S`qivSuE9g8G zmghj9dru)3l*F$W=48bgQL=V2DtBBnTsF@ij~-F7p(nMh2{(mtVK$#@v#}}^@0qH5 z`FU4H017_p+D*;ta1Tz^7BeG0SO(Nup1|foD(6FzdCx)^Q2LCXRp_{IpUOpk_38Dn z<2}$@y$K7Gd|7MLoWf6I*y;Z-APxI&I|~D`rN!F{88u@j{_1bIo)drk!Q8dH8HFebV^>-AT;OXP&v#FcKlWpz~Yo9OL3P!F^YgR5wLS?^J~%LAZ)w}D1p3G9Z3 zzy`}pJ+i~hHuZsQT4VZjjArk0{Q1G$zTVhd;r1&z$A(n3zBED}E#o3*pt~ILezMyU z#U0(-D?KX`zlWynq^2yT5Z)1HoBd$7aof$*8rY!nwr?v0?&i?$J7f^RNQIp#N>^MT zPdp{vc?e1A944*$GQ*cB#djYM!>NGsJ+w^vlud_SuHMXd_y8_>fpa`2VCAvpcs5eU zfL&9wlutVG#OA+gk)q4(9gVbY4-xJ^;%(mpO4hXx8I2dQ{#drj3XZv{Vt?(sM2SQ1 zDN)MLnzsZLN8ayQ-GiAvKuKmD+s%359nN+HHVIZ0&`F7uM{+bu?fjq3bv^T;Y+AwV-I-JMC8|?(Lf^m=Bnb3B{A?|cQj{v<9pSVsZ3x&oI zvWPA|?s4M9?m$Dv&h#Yt2&3dSh=+NWGN6l~ga{jI7`l}a@m3hKfQ@XW>TUP{NaTSKaqQly%RU4oPQD7b{3Rg#Dt34nw1(>>1RoB1Vyxs%>4>#DiEC>)lE**X& ziTe8Y0@?=18Luq3=XDcuF1=(iGBO)KyoWT0{~mC%QdwNp_d+4BTbg7J{=%5(XXNxn ztM$s2#AWL(kn}9&#`t?h^&6vX_Vl6TUTGvnu<>z4p#B*IXP}&6Y;r_pH2M_(;=34> zYIXV>j3`Ro>lp8`2$8UdHDniwp$&F*f0yZV?@w%pQwj zn8W7L4^R`~1;4$*i=|Y(D~q-oD0Q+)@-r)w$6$sxKmn2Z#Eqf7{ex`Rk*;roDr8zJr8 z>qk^LuOoJr@K+J15}wID724JR>CPCGuGD{|3)&+#=!Y)Au=G>7D_P^OMTnv7q;3}8Tgz}}*g{uW?6)s6sKf{=twGKs9C9>iLgYN^h+zjD!B*>*3yJ_u_i1mYo zz_bA!dSh`cL?vARdnk8VOhRhWxi$my>wM5xi*TehM&ATpf6=w%VB!iYFIxtq0uhd^ zn&yfvY&gP28or|vC{x;{JrhmJQW;aRMWX>9VVMu;joLlVB4jRfboUl&KhM)7$=+5M zJQ{M7G>V7}O~=t(x7I&5p4j9SI{bK^@ZN&F8{a*A=L;dNIs_nDVqgkG@2FI2)Z5qjV~&k2(QsK-O?s(l*SioTi+UNyJ~pY117$R_q3glLls2zOj8SiHHgC zPPg2DnV;DRNl5Z{gwcBfef&2F*A|XQUAhvrG=fk*?@vojg&_mRxMXFo3!&Tn3EBH# z_!C_biB*U9L3C`#w*(HKqdZ#(_jJ5+3oN8Uk-2nVoU&m5J)uC4{ZXyAvwy3{6K;Bd z0gcfhv4u<2Ar?U#P5YuW?|JSOixnb+S~GmGDh~dA+^51Q{DCk1`W>6Zq@O2lu3m>T zJ1#ycC;6e!-U?f6P=!-nMXQ(LvTkq{y?T1;vMl{_=Ao2)6FSSM+jk5sVxZxo90>^e!yNr#K^-(}AP|{%I3U$dx;I|U^rGU{mC6J1GMRNVa0{ft<&6O@ zpRq;i9ac!TOWq5uKEecT6D$&scQ#9;9$q5y=OuRvnW*kle=gXQeX_U_GHS*HKwbha zo+z}eoR7~zNMFCH!xEb#i1Ova=~xu(sMVz{X<-OLPaBx z=6isihMe|ztNn|k2E80CoLuu6{%W0aj@hM~T)@?~KCdtMk+VX*JZL3jMphCs5w@Na zJ#V^7t{PWNuAvYP7d%J%cZmkIC>7U8Gl1F1lPuoySITvdk}_4T71mc|))JWQ{rVc4(r!}os+Xm3oi|4LxGsec}?#)K5_`37$#82|RV&P7*J_hs* z$~N2k9+f$jb}{>YgyfxNCooN-c+RiWg*t9zP*+!>4`(2pb9lf2qFyx$l6A1nbbZ|2 zubF945+XV4L7r$`oOQzfaJ@`j>T1w0Io)D?YX78qre1HlOcKNk1oArN=9M6u;r3F& zQ63nJX|Aen`1Q#9)($0r(z)|jj30f+?endUL@6AEuxg_6kg~IlQjyXOr7^q*)DdYN zKL?9&o<8FbLl@w0q>~y9#W=sluV6W_1)|T@S1(LSw15jd;peA29hI(-!z~-50xR0bxt{(@qJ~a2Lp+Ym`k}i0wr64=)ny2?IZc1>9)zWoUi70l zih~Ozy(z)cZJmULeIbyuIn4J{PlJdKi+=2bJch#5Z9cxHN^ zjd5gURaF0Ak(RsIP0kZ4XZ@_WbkTCVBem+9Df-3OJVnf!YEmJw>&~`fY?|mKiGMe7 z+Ue8ujJ6=-{!?F{p3QNuh*Zxr;eH=A=S^1n##L44*Y5}rzH@lq!eo9khdTHBaj)3n z|G_!VK%7Hnn)`30!=+{~08A8m1~`BjLF%L9SJ*oq5db7~dFt zDG93;agi6AxpCOArvHc0LLR`e+`bd-M~;_JB)B_XZV!uJ$^Xi-aR~By(Uk*H3+m>8 z%F=+FP@~{lR$^#q)VVefVdt< zduo&|P#ABjv+h#0Nu2k7 zZ$!Q7?(~IQy&$n9nV?N?Ty2M;jan_3&vUn9y^qJ zA?i>QDBADtWi^vFFVx+;OZXZEHF} ztQg*WeOS6*+Nb`2%8kL9eEAyOWB=x?cr7e(h&yvb&t9r)hF?)rXyPD`ZkeJm++AD* zTVwWw5&AkqS>c03o9p>%7j&+nPQiLBJ3^@Qn^=G%3KvVLzlnl%hHwccKw|7!`VeuE z1WS6W*VeJy2A61g6?+Ys9vi(!@RW~pi$g>Vt8YRdo~5lhcWq=aMZJg$_Q?vJQnyVN zzIY00@|!hQsbkdN5Os3p1;qbcSffT0K13^uNE?Szg#wnC^f*YSPnq`Q=&qmYIsF4- z_M)eRF)r?eYR9(C=0D>2(n7+q+c?kbVm{9mhwl1|PfS9SmKc0Uz3-^lQ0|$OuT7G5 z_3PPlxgV|Ceo$I+@eSEGaK1N0WiT#;zgnv8P879kikY0)htlP>PmnyA*%3hl$iiSi zZ0_WdNh>g$huxaRsC5OlFtX?aO=teTDE)GN+$5RT5Sb%2~`WH&si zO?u@Kfo0C82Q1SYOEw%mE$YeHflJz$`g)Vvb>%5PtY6xMx4-&)fU;2QOKc&EOlb9_ z@oftJl=n$d8X@dV*uF~rC+us^k{-!KdX={@6RucFnXQe|GQI^?`I?k8b>`PULh&+4 z$SOIYP|eEQaB;yO*6BM(itiDF=>6IG=wJc~{Bf8j4s=JvP>iU@~48-0~!M zFrmp49efShWM**Fv^eI9taR+7q~-KeK2vN2N09I?DUK>X;2PD`{;Q^{*05{kTFFaX zg329Ws;jFyO!!Xc{jy5_P!ToVPUrAV71p?hvKZZM&HuE(0h#X6_2uXL!q*T`pD_AQZUJE;ZaVxfI@}YJdDl1B5y#VH2Flb+3Qz zDlZJZe^)llX8koC*M+X?;}UGFS*4+=#JiQC&pEA~I=8^xjbxF&Tk-|Y`sk%|6f>_I z_joH;D7ORC&GkslP{;bfJWjbu%Y-q?ekRa>nw$|>3X2U|_5TDV zsM{O*G6VKR#bnH_#`z~SM_m~?jvgq1A^2{YZXZOD2h-#w4~%rW<_?9yC)>8{x8;$c zcabT7)#5jiG!pa!7oGnkt-hfA!Xot$d!pgbXji5ipvzfH*3@QrT|kVji?Jat;zfP8 zB1PI!WAH+=3u|eC1xy`Ar|=0nUr$5Ffqj4u8rE_Jg|}E=kZo^S{g7h=YE1p@g(OI#L`n0GJo*P3VQ&(W(6qnqO~<}>f_S6&rIpEPE51w_w(+yfYWQdc1^ zVC|PtiUMxwMKz2K_r%SGOJFi^)ZFYRW;y5SkaM*?y+8B4Isk(&~=6Rn< zF<$ri`mca3FQ*5Waf78xlv*Fj#JA1|9af4^BXefmo;QgsC@>VG`v8ZPOU?aV=8PwE zgqHI-H!@p6$IuwAz=|?Yx(aY04nsn&X&pcJ%~9}Z6r>JC>~L=)r%7-1DNy$aP$RP* zUSsYO-#*+N9!FjaB<$*sqn%>zDh$^j@MZ@ft`K_dI#V-#IOn(Rt{ro$IzlqWt+}Bj z)FMxeG_;^OlNbMH+f8TP<*wLt(xPm&ke+}0^P^(TM-?lun1+&@Rp3zA~LBqE|Wk+D9@IFB<+C3=0U?Yr?L*#PcmTMb^0v`t4sGjgnNpB$gyMk~*`X#r+ z{KI)aD*48F>|7Dtq8HF}Cm|tti_*~2z>Z^285uTYWwrFVb=Q>uJ{c+^rdM|(Oq{mJ zyimAf>xloW%jV^>eke}M9;YSr)6VYv$YaVjGY}4xI429!tlh<*KRHd_)#nf4A&hip zgCy~U*@~cm7+0ViktEF2phwAG33(AkcjSNOA*XuOyTOB{CUzG^5H!?I3;)4T{?eq_ z#1A?s3Dpf{$&F_`L~refO;0isEXp&{w=yNjtjuuQiHdbcP|E;MPxh`Eu%b@=D^b56eSs!dWpW*^7ThA_*{vtWrmG0 zVhc0b6E9dMk_n{^rOO#GSqch>v>qQctm(@km6}4Fr2!FW(bH>So*~j?x4jWQy{VkO ziE0Lv1@ziYAJculhn!%6WEgtIS&qBunYg?|WSUf&JQTIXmxlD$L@!P$(?m8% zk62t!yTtdAiDU`f&)CNt6W>&IY`ylg-=_21&X+2BY~H?*1b-eIUeu)l`IT8wMS=yz zu9uG?H^d{hc4ZE5=rnpr-uOTD7=N>El7jx|Y#VDNh zQe@o{2h?Pm#oJO2ewK8a?w{*^W!CXzsb5!|SCEPh;D<2&x+8ks#4o)rX`SHXa<~53 z;iPgZX$ETdKuasV#tevpl2XHGbn?e$`VY_UP*~XmzVf1mjwFyI zgq*glm*y!dUX_d7zjcZuoCn=r#JuuekI3_v?>n8lE;UL_Y}<64O?BuQ8;xYn9!kR& zg>7>S(oRiS48zRwYZCpr@kwhiu84UF*lzd>PFy&jm-XZQIDC)Ev{Qe`glXDu5UQ^F z6Z0iyi)@t#1U|^K{-qDKe4s>$y%)mZND@{xGSA-WrP#&INy?J#&z@U;bJMqSfOYfx3pe$fX~M5p_pscE!21>YUrE$a2q-RZ*Hv?(eQ%167lG09vt z$}@CSL0>^7*ko)m4vrR^Hxy9-Y%cA9&5L2jXZ*d}kRj{EK3mQrOMn!7Uh0IcAFTU~|#2$3txhO*JUM+BO*>nXY7xbk2 zi&s*fd*tsNRVMuLw0PHAawmojD7~{2&p9t;=~rH9wZKKXzP$6!K4{}r`No<{3$|gc z;`cs$eCSxO`oPl%4hON)i$6GVi&Cb&>`Zs;GozQt_Ps88?;aN{R6KjOOUf=%mmZUv zPho!B8HpVQz8Bu4Dm3yg9Io+SIC3=iVz`rw@Q!NoG*i^=@5zlL!k|ZVk{Z7ThU63Q zV&0#X(R&4a*(P*G^tpNOWsgQzHBBl39cdi_M)um2qD4H4F!}jab%g){)zUh1>o55^ zQv*7)`ozz+{!q7qWSq&XTu)%yr|lhzo8c+SZWOE^xM0EKAAo8Y`HK`@>bQd6)Wuh+ z>LnpT%dQ`mj$3^B`G~CT(~GH%?C7#4uW#1sVMVV9e_SL~tg(vPGt6Zz--*ZX%aj zzxQ29rk3rA>;Tu^Vs%LyB8h61Z9OlW$}26Xe!)^XmVMq|EO3PF8pto__L242FAinb z#fJ6Ge@Vphv+d_^9NB^D&;3lSxIY$S`MCVN;jzsV&neQkI+OSOP{Q&Mkwbc~?}~?h zYD#|jN>Oj~?Vn=k=%X&BpZ^jE#2?0DqLZyG5F>5YIyPW-$I>mMfG3TlgF7w{0vV4g zp1eI4lAgEbVem4Gop41{sqO6O`5|%jR}7xNtHbii1>3v;&{@p?&^_N}#o}?TFb`>- z(q4_A-e=Q2)`1?shsL4{>AB)bI}glW%J!WzP0M|Bt)_fa=Ao8hOEzRHw=cP!$zdS9 z1Mw;e?3x6VFEc_$=pfUo{MPF@_r7;@+Z{bddTL#ZGl*Z$wqt%7&n%~A#CM1sRT5o^ zNC%n*-AFv<&*MQnj$@q?K5t!REqk}@w}F#zcY5;yg@RbG(Hm=$cetF_er!0&1InnW zb&jmfvwJZc_5?C@L>x}5Dx}^&%>e3LLf?6Hd2-4(>~}J>gQ-~|ILfiH&1P@brBUh)Fg;SA*_vV(a)8?W@r^Lm1FXc^BeLtUFcDc zBsAw`9%cGT(31vOy)p&4XmIl?4R?L)es2z4A?U~Xt`~XQLYJzFduAf6` zX!6H5>8}7e=-+D|fC^1Bs>%EJ@$mmXhEW0k`5w8l zwM`+!Jc<0%l7HEcKCjc++ZrJVn?hTbP7%M-8ta>s+*TvhbRpujQUc%HFQRq+lx|#F z&d}oAYUIsH7ay*hW&+{vTkqZFvPUzc%Ip&3aFz@Fe(uXg5jR%~F_|FV~?RhP%-oT5sP51#6hZl(1fO5MxzZN0RX9#_C#BYA|?EDZVLDi4rA{ak*_9HL-;P=dsOnVYIagR{A*b6JhL83UR_ia|P1W?|+9iN}* z-AIE;&Twv|0vvd0Mm^ws^`4}ckc;tpB|vb`QD{hVF&I26yqRT`hpKM8fMy8Leo%T} zzhst5DbLP%X%26avk_y0WZp*GNGBNMQc8`(ZNb3+JQTdlJLI$yzvY2q7BlOqEU||s6hqP z&UY)=?6}pxJ_Ij{LlqGRI5pNRJ~e8suCy;*p_TLAX2pMi($+Tfh#{C`*uzOoPa7;Cq#n33!Vkr+#n}LT$lz@ z)R72##TB}iqZ|v;i_vtlud}(qsE%)!p*@ba^GDRwuRO#%H_pp+czbkX2qz)L&g64k z_$60X9Sw8BEm^> zWwjFb>arA!APSwbjza?rpFSc`N@6P|j#i z-e#CN9ylqZ%d}!LkVAy`6XL^zU0frUze`H?E;0A>1Xf20N|XI17}KKK4eCk&P1=em z!_?or7#YF?G)X9#D4;1KBai8)(}Zj6Ko!6wlG{C+AeiV;E!=Op*DB&O@JmAtlc5Gg-cL_9jbfjExS z+qPGGVI~+EbkDxWz3Yozh*2p1;Uhce-i-~-xyR?`K2gGaI7v@~XL`w>`AmuSwIz{@ z9Z>=!E+Uqyw)30~&DTTpCTqOSpL+=o4b>CXa;+057tYD_PI3Ox|Z@_(FtRborqYpz>Ma-G6hOM_2CBep1gnIV#=M+EDX`nQ?J zQ}(8R$Ge5;-%H%*Im(odUXy6SQ;9k}j z#Y{45tvAtFBEXvHAS7wTE3gL{x0to0Pzwq=KjkNZ2} zxv#BicWbxLWbA6Mjv>qaj-B!S`81wgUBBh{u}a<(?C7wlueag6!*5$(!D}Y?y1^K+ zv)at4p||cGIU3e4kBr0*Bo(Bw*(H|}_T>sJ50(FYm1Dk--$_iw_TXa2x{gDYb<@B9 zvs>c)maw0swnH~o$f-n2Ts#zI_iNLwG0U_@TcYa@L=TqgPwVr76UiL zoKK9hnhFk?VhfHytt`P7wOv4YluM(?Y1ISb8S4t*fo&%_VA0eM4e` zp!`#K>Zcn;=tL%L{k$T+`#J|Hk!_1$lSw^6$4fK}BJ;Y5*2>PpHP_GVRQb#J(uT&@ z6W!VFTu!{~ysSkqic>fzdzY%_8(Y=oRwGFB_o&$@dSTt3V^JPxg{>JOa@#XXox^)o zgpiQ@MfkXjR)r6TfY+rDiC*?EaM|aCMeuOcH5&NshZ?HYBigHj?ENSJA6;FH60;zp}_)PH>US7*_JXk#M zug3rKdzb2g>-L3M^eV0+LJXO3X^tP!c~{q%TfwQQd`95aU`n-Icv)d}of@sj_`blt5(k|oC0f|Q4@{0RhWFo7U{_*z@ z(_lxTp}R6@ZJGD)@3dCSOcB4BmpS~YN(mcus@8%J;f5+FGm7W5Le}(OyFdS*9T;g{ z!i*u;2Wn3lJ~!OZW#g23!Af73gW$9x&)l!Q^iiWQSrrl*dw*=5Kw4~C+KDt6?2OHt z?I?uFr;!>()PB|Ic#$(C(?Gl02MyRv%*o+xlB~_YCmMb#!hHz`gQ55AXxk(cyBEJ+o_d5!G`!ewaRlQyo`6FOabUd$iz24vlh3=}s z6-B=pqhZFF2^C>6Vr2?ecl^kVd^O9IqpZ98Me$mvlTA>femq%sp$%2@(Y8fD$0ju?fHfMQmO$Te&mQXHmJ^=(I;Jnkb z%w{DQCYYA%h>0?U^thp=RB_SsKX4U=ZmY!Kx=Gwdaa$w!Gk+h6gg0amY9;8A)7WGP z{#mbAWY)K=LyPSuHf=|hxjxpV5kd+@Nteuda_?$!^8?ZCn0OvOH?397=n}s0=hqp* z8M${2u9k}3>~Bu!%F6rw+fy4>1-hSiLdZe*ug794Un3I*IoAF6-GrTO$C5mJCC<%w zQ|{i!hhJB$@?g3jEg`j@Tjc&nYX`8|tqtVn{%xBaU1+4uOMIKTdbv(^-1K&Kgs~?j5~2veH)`huc@frHNgLIpMMP27j{G1nqR zEtw(pV}r#GFvC&LQ|}^V%@ctuM>sQdQX1>A88JwL%Qj!6%1zH|ALTfFC3T0L) zlZnK3*F?g$axXDV#4U>wWpLz~BK9H*m)PwiKU43q@!h|vhMZc$Et0yp2rH0(`PVR3 zjKYK7g=s8jrte@Hd&W2=4TU8aNFjBW^%hZ*978RQ@{%~{QC})VX4~z_Gsx>a6~4VM zy&P{F&=BqtxY&DC_Vj80UD}t|V|XxLa@1+Y`P{J7LWoy_dCn7qY%(17qUQI=GjPNr zBG6%@tP60o-FPuN9;Iss(b7Jk0F59Vtefc8KEGiI!^FgZ8gs?Cnbbs~VR47;6@((x z{n4q$Axyz)l4DKV(qZ8;VTwDWHkU4kU-h(x`q3eQUlrrwm?keO;xAmEnD}t9gFs(p zkgd^Vw&M24avU{oz4dUgd%gHO%|Qqe4MK>>W|hr3I~H#0NQYlQG&|;A@in>M_LDr% zK+IKC>DNMDYhLZ|TO~tL{FD8K9j-k*hxY5l1=>R63l95f8GG_-dcaoiV?OKW7El4F zwMM!MM|jK6x;(_QpZEG%2c=cPD{_!-SHt$h+>JWtWjzb$K8E!DL9$ACV@@nxbGmr( za~V3SnX~L3`;(^R+d7y}75|U;O2d3A^xLxtic}KIZ)U}Z5`KP#SeR#-{`VE)-7wwc zv>4ZHjq>+?GY9SOoOkjSU2Lq?(IGi2Q$$%&#m2%eJ}QOsO;lu9P4%zSBV2gpb&jaU zFm;{R9M;N1j-R@x%cHE90SAA4PVfmCg=T{zV!Azs1DI-{@cIzOD~o6Ue)A?A@()X% z$^0Gxnjv;1rgj%8x6HhI16OKNUCndqLLKeDsJa|h)JtQ~HTu}iy&=%f_ZI(v#03dNc^=4p5t1O4BUD<5T4g4AyuFS_|y=w8_U+>oB1O zgCh9l5s4!ricTtm7kko{fDRY|v7O@w-vp+e;FvNKhK-{}>20X%j5YJ8S8U6pAMT+UwuH8!=R6aI3>u9mo2T z)!Q+Q<5b`Ch~2gZK1jL*&~1V7mO~^U^fruq;AapS;Pc!7O&KBt1S3eDL@k(#H^rTC z)kK9B&zF##QSClLYLS`SLH2EP(nav{hu{lOCW;&p{_E#xN-Vf2D`Q2;8yt58V>8R@ z7Il_>qHXDGFw>;5Sn0Nf%^7g~eONN){32`+O9}X&xxMsE{5LMnJ+4nJ>O>6*lyhnE zGS10R2meBEO=fP(qrAQ+Z(9MB7IVVI+qIC%hV{?NS%AL6#WVZ5oHgO*BBnALj-TIr@jtOY-w% zYfR}Wj=&4?^A+hpAvzs}4l#fDmR5LgXZ~o9N@Q{ochEw1yRt8ka7Jm!=BU9EJlJ2X zwAdmqU*?;MOaFkZrIfw5f^90qiTlqRg0 z=6@E$i7~eAq!lCq^6+ii`2^oxF{HbXna5to=(If>9EJ@W57kkj{OPM3_|OFoVIkwV zyGhQdapP?rA<(4hB=G@6(bX3?!gISboJi6)t@EnSNP2IIy(e4(7g|#Mlp9}5Gri&) zHrb`7Vw`R=;&WNHaue_PntaI!G9cYUxF5+tu8Z|Ri>Kz$lFH6$pd-is_{r0*HrpkG z-v|GcfO2ej=LTF#+|S3`^_Zpay=B!Jt$|`}AYuoOQ@{B>S-tQ{s7Clnb7Iunz3ZdZ zF1u8$=RK^nZ$$)^MC;3yt;`s9ZF*#NV;EQvKX8j#tTPN&Y^5R$7q^g-Mv|fqjx~tx z=T=;6H)#r|Bv@l8YShrB;d|haadcWdt7cd*S|wO(U)krN{;4Q$YHK~wiR` zw+j>aiTi|r3N5FkG-%~l@{)4N#4g3F%W=u~9_Vs>x32RV2}i{12rF%3vZ&1cubg8I z4H#!x;hRUdRj@wbClGXrLiR(*KA@!4F2V8d#jb>SQ;kh7l!@=1o%SJj+m(XY>Fz-fT~_NMLet0sJ$-#F5f zP0z-&SL-ba7aupIho8@_PR+w6c*EjFHhR<|Lay*q=Xm)R1CPuD5O^jS2|s=4fzuqu zR=2we6yAt^KC^NI7!h0g$>;Y`^4NR?Th{!()o@$mCg1ePU$ct>R3E`h^&w&?v}vcU zFCmENCsxGrgfG@(^$l?Keh{3}?PzTnszA!b?Z9TVQt8N>I|#boFFFowu&mHE>G-fp zO#`>rL zJyu_P!Sl(efa+GjH%_z9Qaw!%gl9De+_PP0Q^^g-ya{PHjS;(AZq3%^BX| z=?l*)%;GJ_80RdQ(aiBXT3Hp>{xQDRqI_kzGa+Y9F?tkOanYN{zw%u9DPh2sAf`KK zOc>-URxrmRS$P6wxr>Y)1KhhjHMg}KErj`5v|Jh57z`?%!EyAe)PTEF8!$~LSvu9k zS1d~Jx!akKS=U|nWG%f&4s27QP6~uxRv7aL4D6%Bb2+52QC#)YIPEY1=kIvgHReQt z2j1{ukq8Ls9orx4+Px5jd$_Y`xNRT|fpfVa=mr;;S4=}zKrN37YZ;ez?$dNo&9=Bk zCXbg_N8KE zDrV;mk}d1>zB`uCkrzHdCT(8VkD}Pxw-iw zPZ**sO#Un%-l6dIVKIMNqHM2~GjW{VG^!#QV@6Y_GqHIV?%YS;Q>Js?+Gk{A2QdsT zityM7Dzc<%%MstD<}wLgLP~_!h?f8abg2UQ6`H2MDzw+2`l)iXX!Z?Lr)oSwy=Ari zLlxXz2{ralK%OvufRjIwXvA}sUcsNXnIg!@Jk(e9i<5iu;1E8F_^X0~jp zOrK(eTXFwpwR2ub8j0}IQHp9Z{7pharBO~30IH^I7@$?IWYf`@RhJaYx}we=pntwY zHa=Z^d3&6-e9(*-pC{#Uk4{Sx*8OgEY>9*7$AcN5JK&GCCLr5DZ5Ml_4$+x&aINhtABZV&eis6J3%skH_`8;6_c$P~0+ezrm680gY z?dA0pgMMS4rOAl$vBks?rd(Q+!>zF|5Ywo?d6GX~HSkm+X3oRBw`E5jylFE~ykm)6 z&7R2+da&Dd&ymXy)NgbpoAIu2GS{(Qa>s^%B}IzIua)263N>ZhIw7dIYFy=fob@Qf zblEM01kUxoPwUY%`OA29XDmRrnADbf##l!1W!I0{Ip;#-cNaJbNYB#INo?kfy=?c( zx*ho7dj{7&*R$!4chA$GpGb(MW4sZdG22Bsk@L(r>LfNYLnZE&!mX3c<(>||Bu$Uj zz$v0k*DbA{B}kbk@b5yA$bf5~M%D(7Zb0EDQ^>D1TssBV;di_@Y7gU9afZY}8=ZzvJ!~UW;1&a!zUF z(IDi;a%El=Q(Ck7LPw5=ApcxbrgiZdQIryk{d!O}$hnk#tF{XIS2wT(ry{~FK9}wn z+1K#67Rs2#k$&)F1cLlqgB=94)DkaPILb9+1IM7YuKNgn94hFY6uf5MrjORf` zO|6Y3ljW0Oh0<_cf2I`ZIEZ?l)-F1uakZlOg>d;Cfg~Q;O;S|rC=YUaaOS;yWn$)< zhjZcQTP<&MzY9YA#ACLWy!(8xZY~NgjChc;Z*9Y2Ydx@GZ(}>Ws7a#Q&)J%{Op4wi ziHAq^1y8#FC}){hcJzJXGMeI^?6bswI6}2e_6gQMTewv79H{PN3ev*IE*h^t32-y} z#4VW_i!}JI!UU}}nXPa3rYY{H&%<$tx25ti`6uq2D8F*pWUu={o2}9-46#$39jepR zvB{cLo2dDEPN7?1PuAPwV;3-|1p%!7b6%id_;mjy#-wfz6Si~^RC+1N`^xud&{8va z<4%!AQm(JPi?QHbk_#X=j|%&k9|MrL!8JWk5q$kHfVMUQSOKIVi4BJUE+)|yh`&m8 zYremh+`t4>GF0DdUB(VcKnJXG{iL98lzIH~VFBh_IG=v&O1kGeA6}tm$^8w^xa<<( zqVN6XnPgUAPux06*$cq#>-$sad1}VoN=KC!Y<{CRZ+5`B9vj*b zvkItPu92a&+Fhgsi0w%E(05DVFmsQ1;I+^J9y0fJYENay#>qOo()Yx3DdR%RCr!~4 z^zUD7n}0degs&p&DjG?q*V9x3Y*Pl;t$fNl19z&nniMWW=NRwSm=cw$1S=m@QCizb zI5pcsWsMwZi>)9*`7h^RsKdHV=%mv@J!XB-}bL z8^T3Z0GQHkTE6C@a6Ap9CK1b$^b3~Y#tbCkMF6u09!`9ZM zH9uVz_<@*`bU(pY`~02LqmmOyo#h?w#6fB78~9|Q#Yk<=%GM(*;WVTv_Prern~6ck z$uuE;yp{xE<-<&DHZHK=B3&qAe2epy*=S=U{;Y&o0d}-=gR_6-PO|xcKnBMZOl zg!3D3BrCr^YNcZOQD53^`*Dr0dz*xqNbf4uwT`Fa9;&v`;W^(m;c}TDXdrusbQD$? zB#>hsUI+#cJT>r&!3n69q8WNeDy8M9<`$c5DIgBn<08EpYkL)$H0+L%0=KoUwy17; z1Ys0VJ}Up-Cfc=5G_q6>Ic=b{8=;uK8R?5906WLFB$>TCfKvt zcpVEA#P%*n_gOQte3?Z{&*G%}&3lKe@UFQZ2Q`!)YNU(|E$`u|sR2n9`ztY_)rDq7 zs47&+Q53W}(s+okO~VIgnJQ^eG1n65h}WebIRkb)h^aq+H<@YCO?tjFB5HJZhd~sF zsSZ*}=bE?%4dr#{-wAO-GR_g)duVIukAs_->U|AXpHqv1h1rDX;+;K1PVaet>(-~e zhD14ukGC8L7Sc8=wtsrXaO!yWtIE>!c0%zJ$HYSwB>j~mvp>9s#_$(n{AX$&ktPQH zLXTN{SDu<*+4Q>k=Gz^#pdK5d^@W3{#t>xR?*ln9Dc$MVoLX}F@WQ|#6IrKJ(*JJF z1A90$&7Aa_K`%G%cRRMgOXY%#FLUT-ZShmjVx+zBcVFBVSbM9A3@BzwZwnvHwLJ~p z>3T!;a3G>oO`I2PmRE?xp!d)6r+GJ?$&mT9>XPG`oo}0ne4NG%;z0^Pht)MJUTEuM z(U)_+K8=**Qj3_S`fbs;PmS9-e=ChMxP0z1+H9Qz#A;25yatChI^OzQTTyucr6IBZ zwdOfQ|7D%c$Hc@xXNX8}H*YqZ60wi4+^v98DLe2j(YwT?lssv`f0JH}8gxG_LXlDi z@Yet`DS%k~=Ks8}9{X1I*XNFig~YIl^8eo7KT%CW6r{(+nE$ynn;`b52>-sB?OAks z@}oCZVND^{x=oLr6g+Zq>(l@snZ&_HQOSR>Q#`d$80EJ+l1tq>Kw1r`ReNL?DnG6r z_JQgm{5lnH(7qoCE9WWkXrsNW`Ayospx*rwckjA}vPH@+-lyC|-UjU1$e&Lzie=YG z$sYZ=V=>n6y4fU)u*qX;;uuL@Z~F7ctQ;6zWxlKmYbRm~hVmS85IaqiO9hC1{+(51 z*7dPIIyOX}hik5TAj^p2r3rlo1mLrv8qkogb{F*Bdb4cWg7zaS3y=c=j*E#0f>*<( z7S@!uh;AncNkfbshGasNUpiZ8X3YCG7m$#25#CQH5=w6wd+@~ywhG~F_SbJ}mQ-q* zATTqAxz23pNeh*{IwNx4P^BHCGXy5yiaof@LipXTZhTnMaU72l^iJfEo|Mh|ZVe8U z?%oy4&`0UYwWa9`Z`V{u7ELM0r%?uUQs#odv1e4ZQp(kZyw=Xv1E`tvu2l^g)))`fVMNY!SzM)Vf=XBRa4ZSrE0Ik*M7~UEfyZ1cq_<%UOk%-~#Nxfj?(KbtoY8z%ZzWBA zm?>MA@UHi27}Cn@c-}B)I@nouBnDCPuE2+!%z1Qq#ZuR1#(6&C*?OuDsx@@0FYUbH z&5`+~I2O`v3}eGa(qPd&6}p0}!s3M8c-dNM)9lNYhYhE1J2if8L$0u0J* ze?*&}Vjo{8dhSEw`sGduM*vaKbjL?DVuTjXE1ihdUrTO=MSjoxdkuPkDYT zJ9T8S#8^R(GSfaFt~ekw^VD$fKVB`dk$Dci@W0=@eCvVDVtWP+vHm0UFW(kBg&fhW zqm^P!#=kY@D@;ys{6|yQEn0SP$M7n26C^5kdsTG(I@QdiO683bs@;-~x6egU0a-{K zTmjNg4n^i7A1pioQLampTDqe{DT}f zCu+?UXWn1?@uij1b$(-@){`;KXYGZI?$mKT^el8lrRZ?aYiv^JXL#FrF6X$<+>YCh z)ziD7K1BewZ4(R&4y#ak&~SZS3-?@86>ToA<5%Pye`-l~8Ddk7(_O?lHb3n9(p3FE z1KjsUWpjV&!bR`G#q|Y7uYA6Er!Sw6{X&WlwpF1j45W8&wRT@W^yLDCJ9nAg;pL#fO-!SS@?t(%OO-lm8Xn*)If-%A zVsmUIUV7ml=p?%NtB*aEzgy$+=5HS%h1dA4GtkwGHuuZcUSil1g-7;U9IpSwK7wZR zdnd6zw43%G2|>INdo|kV(#1O~<_zps8(S#Y%f2z5OKNtsxM;IxcRkEGM=Y8GqzEpP zG&$p^DoQ>#SjNZle&M)F3xgKLUMmxoPGbdRpd9@G@sOF5fkOWAq z!%XKVdx}mUlO)LfImpN}!e*C)g38q8`wmiq_|r(2VqW{HWgY^?QE`I&-~{z$YY(IO z`?C85@t=u`^CjGw>Ci;SWm+zJ`B~^3B)Dq>k}beN*St7;ptyX2crvbeY}_e{4wIcHyH?Qp@K3dL6~8{zGS8ty;{AyjGcI@n_kJF-?^SRJOpX zg!5eng3?A3H5XIh8XP^18XVr}x;H@p9o@P17T|G~!Z{k9zj}T#UO-z5o++}izfGy;)EB5;g;g3d$3Xo6V@TOv(R%*t!8+`5>D z5%&nHjR_eCtC@uG1!Vz(5BF<8PgGf;C zkH#cuUBC7=wqw6;BZWjAIfE}MsAuMsO`P}?VCj$uSEA+?I}cRbX6%cFx&JGKZ_{!J zU-RVkb#(GynZna>qQp zadh@SM+ssJY0$C48q1ma_Yb>&=Cx6N zxem*|r4KCOg`KGi4mecMbMqI^$CFFUU3wYf*&;XAwDKLrCIxDM((2}`CP|Eo4D~W# zx9W>d=^ZHk!R|e~rT#P8vC-;{2c5%SBr~&^a(>&hubsn|+NV19SG6w=Z9SN4Ojo#v zEfy?pCx6VW#HN2w)CE;lNITeZ?Fvb3#X2Ojef*@w&u^^fVAH39habSY?x7pkW31T1 zY`wx@sOBJ+tY+WJUs>PiE2YA}Nug9dL|^u^1jH854D_FsihBmRHOQDNKEw zH_hDItnk6o$xb%hdjLP6C}-mC%wMrTR$Kw@hR-8H&fB|>^l#`Zcv7l_fpGzYKe72X z=@KF4^&bN2n6TOD_aFXr;pU_NFBLrjwU!9>!Ew4Jvd81!DL&!&=$&8eB##j!LP&)5 zu(RKWb~zNVh;PWePerx@VvMtAPEu|U9b*+~vG{>pPwbQ8AI~H7uTJsT0;ck2q0HHQ z_hezWRiR7!jkhOu9~~otBrbCyJl=KBx~(eGDaYqp0YKLsleN$xnXQi-O1#{jEmgKd zX9<0KvQgWjsD5cWyCc&kD&YVhRH!W~J)s-6vpP2_l$l4Vm&!3)wK#~ekReOo{ZFpH znT!@)LxD~!7Z(Me0=`ZhFNyoyVY){|1Rj=K?i(S1qroM@ewrpEpW?*VG zZK-DX6)GBT2YQCv{WoDFA`@!0U4`oZ0g%-BPe(969 zJGq!vk4fCDhwoSmtA9t%|6KUfYQN*Rdho*ql|&T5cDlWsUXEi7!btaQqY_V zs1&gK2e8r;xl=qL{WXio$T0imWH1GNK2q)h1m6LKJ(Dz`S`2A|hbgF)+Obpr?a_=m z0}Or5wG&aX@V+RqSLNhmrfef}?xu97aLN%SRb3nf$T=&Hscq=bD-zCJL9g)EUiH~H z-=Exz+gvGBA)mow>2(H8*1ARMGk0GTJc^oKXrQzt&oF}yc^r$tKvS=u+1Mg3-nC?vv_<*@bG_mSVeph^e)vNk zACDPt+Te0e6sD<=|J9+bATK{w&-72l{C$(46zm8Y)6jqgA6&dRHue-y_EF>#?aifjA&3kWZ08$HqpQyGGY7MTe1h%9)m);_!Dw zC_7`7`n>kCL+czSU0PXg3lUz9__YIfwwgCBTsQZ^A&Mv3 zLf=Y2Yo%##5wU7|JfL-b4X&MGdSqGJG670k^2YZV5#d0FIte0v_g1AkXI*H5Mm|8z zn}}OSOx}aoI0573xWfAd-Ew4ven;3o_c1WPxLrCx#~z4$eTx8K_Q0pTcu$#zFwpl~ zZrz4!N0QF#GaIk@?&aUk zY+CvAd(){{@+VQ@X=D4|yiayvD56vWAIdJ1bEcM$(F0fw!oT9kOD@X3(UaL`X_hun zfg>WWM1rI`a8Jf;HIbX~tj@T?d_3M!B(;AQilCR+oiG60C{zi7UNHhF?{qO4ke^0U z0o6*yLkPgRZ`u8u8xVFuI3SkC4+4QQM`Je4K&Hrl?c#;Q|Mzo13=8970;)hNV1b6` zm8sisq|n)gcbAa3=r0;^w+^|FFD^r4amrErF*&$!y%QPj;|E5fFZ&zjNGSrkT;Lj6 zbZ-09g0rv#sI$Cop~u~9IXVB7YM{q7y^D%lnQXUX>nGU@P?L*;OD|^n#ZkflIcrni z!JEf4+>;qQT%Q9U+<+Lrpv15UD|ys{ZKs>>LasHxfTJC^(rpyyrFJY&Tn*5Vg>+F2 zAP5=QD;>*;T^As|$Yt(LLMz1^1qsbFHvk~7P+>0n$l|~c-Pq*@$1q%c7kj_j-)KWU0JeSd%| z;xcT0<{9&En{Aqf7AR3cZ^r{-FK@v3gg~anHP|Uhw4Y!-LrZ2!~MVKl3 zAn7R$5s5hWvV>FNnetL{p7H*SaMHP>&G7kEUkx`*M2ry0=BrczvJrs5cZxBZb>!lA zAPHKGfxNTqjt6ai?g)m`q(eTV_$PzuKRz|>qKvYcZX(Ti-v#Sg+Nz zoPip(>0-4?Cgb^%n1bZIUn(9)=z@XizHccVg!4QOk{a;%B6$VzJzg^)3^zmtWayvu zpw01l4Ib*ZtzxACe2i|UL(j>bK=0Q!J(FEpnH|HhH|l(cXdw+sfpcT?^+h=_hDh0N zIO#y%5s--<{Ihb##bMLb+&4HGnHd>rccG{+;R(0D(P0fg{8vM1EmNr-?wTl|a)G9JTKh}(5f9C;Ti;0#DI-pP0Zo^A!ed?HY;waO;wVgg_JIrt zcsMZN2qR3u3}JKP>K{expNv1N$Dk;vI-I-^DCsRvTv)~1HMzl!rmLxSj}0P{_MZ@O z&T@Q8*My$pDPKZXT>LC5;qyl0>`g&9SwY!T_h??JhmT18Uh98TWlTBCv!MO;qf{iD zC3h@(f)Ayb&*Bdq;bV{QvWaHcD|hhmCHq*YZ*PRbc^CvhkbX&ERQYGzgj5vE7o`Xd z<_u$NSli@vd;YD`03?+v{f%V0oHqZDwAX*6WBwyu^!K#TGAVO+QmO&1%W}6oQR<(q zvwY#p7hAICVcdYaStp zg*xrJWV6AsqKOSo@Fs8DQ!u1s9ijkFfj}w(+g^?~bgaYOBW!13_Aa+^ zUttB(YbJRx=Do)C!kPNhfFg91cGo)<;PTK~ zt7?$!xH8UQ%s1x3GGcMZ$pW)1XZ+EO9-b1nqHMT>xow2N!PTZCE!qk^`$wK>His;2}KQaIf z-$6+ER=To5DtyNNiw!p(+_*~N61Idc2soC7-If@qomN!m+73~f?wGi%Nquz83(4Hi zoW|L6nY=_%L%Zi>au_lhNDq+9c zMTRDKJeC0I{p*i4z#riAo9oYSUr~HCdV>9+M)AD6QO&M9t$*wLOaNP!+i}ZUtG#`{N7Q9Awny#e_FFiZ_e!6+#e*5}vAIp|rt$NJ zE2>g_bJnkZ6=RNPuIpV+_inr^ke^Z*xWE*A_aW!tBhA7V0EVFCNw7^as zS`?8BB}v>4-2a`Hhf^KSIWea(#Kf6tLC(%#I13KgQrwd-XX7;mx$IYU8;|nya`E@6 z*WaQ@^<;++&PaL%Hljr2#Y>9^Sj~fmt%5+5$61>KMMm++yNpj~?tGl|l51dOP7b0- zx{qkp?ViI_nyJ2AW|eWo%CwN!I*Z!53Hb&_hGEpApy+^q{p%CuMk z4mY0`2Ft0|yrq|no9{dz5<8e9;(%+uyFD~{4j73b4Eb-o<;r;XJbr982MB9?*(Hqv zv>K4a+u;8>f(4U}-%M!f60lp)g%8~2#l9x|$5ybzfTT_NyE9|F^g-jW&5GCK%vC{f zSS9l^r-E<}1M&ygtaf>a)wjzh-OMrO)w+s*S>#~Mcie8yfp8PbC{Tf-B=P5kIbOxV zE8T*=O;*a~+xa!+mKgV=C~2;fEM3%LrlN;S$ShD!s6(%GEL=Gz#3=~3^0yo9OMpSl zhM%m)%=Y(uP9I61>o~YMF5N={!S+8ThnP!vnY0I4M(V03VyXms=G1SWt}+q`b#~es zIcMmnwW|Kc1!{M<08mJ;&pZg$`bQ&-=Xm+vpC9&K;A~Zvu4mVAMtj>?V(n z={slf-pRA>$LdpD9i~~Y7f)QloJIH1@7{HM7LhxBWzpgNg+lWT$mE_Q!dhVxm;+T9 z%c9=)rrgVf4DYCXDTnn7X8wzw^6Lkg9^lG^=WSm3%eViOXmd?w!^Ye`W@6L@=k<94 zmJ@jgQu&b%^bUrhVd@EcO{GFud(g!}5o&twe6RHT%hS4-RcQwr?W` z=hiLpPVV<)wbn-6S({UdsSjou1&?%AVu;Qd@AtIG&<_%qE-YNx)b!MKp#$HYf#<&w z#6D>9ENJU&jBWa}*U$HO*O|Eg+IYuy`{}{xl7*GE3Injv3bvYi(&pw*bxk~3y+Jo> z8g^o$IAtN%O!SJJ%j=}a(Ap!90_q&XSa-1{I9ppv)kuT#>ISzN6;O@j21UX>=ErE% zV_n%+Byxo^R`d7chdxCe$~N}8u{+A%Im>AFld0VCaoxiN-&qGn`S(rp?5#;FQK^LP z@9iu+nOs?MqqPn~ms~T;!EdP^J`lMSUhxhBmoU8BI;okJzFL^Vq8uOzeb45GV9kPR zMKB~9-*x`$CwN#q8Jx8)-e&OL6y?8S>fJ0mGAGJsMy`ju7OkR<|2ip}3Bw(?2K@ax z%Wwy%fJi14htp72N?uX!MIQ?kSsoi@NgWM@7miVb&=%gmIq>GW`_+ULmh2~6;jqYA zPArEI(_y6xua60n1Nd2FwO&h;HmS%0?2$s7lmxt?#e(X8-H`8}8HYJq+yOlRKro2* zx5dNz7y;`2|&mGuAbRVeL1uF!e1YNh`Qj~}SruM-%4+39aX9y`n_n;p)E|`#ZKYO{r z&uj89uJg9os;o={lnek z#%o2Xu5d!?jgSU%$K!^?$At)?wGS2p5!M6X+nXmutbPj|UFdg#}urq`!bz zWC;&VAQ-+(zTu;x*9W=%NO%h)InBX?tLJ=IQu8VI#rA$(ZKjZ8%CuA??6gdLnv@|?E8kgRI5i{Du4?H8eS_Tns- z@G8+Ms%Ez2`1Q>8%ZZGPy*vbCyEa)yZs+B@XWxE}mvCJYRaG)-`cOXp{?TL}9ZN5X zek8rUa7{z4>SP#w=*w(yP0+2-ZH5M|*d&HYutDs_qFo^#6BauqE=bP~1|6tsNHA2O z0W!D-ohGM0t-Cym*G(T{{nhn&9N@4bK)pZ0_0_R|_0RLmJ((&8$a}MT!%lu&f2+Qp zy_vloqY+!G^3QqD z2#}?abA&7U=RW-kGyMW^U>^gA1d3=LPsf)N=$!xC840la;{Xf6b-{uEk3mCYEraF4 ztF4#WNPh-RRg(4Z#Tz5p5=j1YheQ@eU%b1zIBR2&rOHy&p6M453Jou`3Auk=@KO$6 zNn-TF+}5h=YnMhY{=BB;k+{sb(`(lDXxvm>(0 zW!;-lQ>^}Nt5yFs#W$6y0p_>!ccilivL?gC#de=5hekpgu#Kz7;riUP&NMnapE>XzQ397e%Dz4cpoT|Spx2~bb+#OhyV;ZMHba%kju z|22ie!JmUa^gTA-9yeO#U{^6raP7pIvcu(Nj~^@^>X+T!=dmX==&$>cP(iN3>>->l zzvy(pPCN289jW|cF5z(h>${VSq$0?64KePAQ#9jvt~7~NHxT6ZUf-kSm!Pn)c%oOf zyF-7zrtikH2#oH*{_AVxB;5lWNv%Be`b=4Qd9qC{CiAn{|Hjy`L-}&wpM#2c_ElCI zotNib>JJo=37({@!k5GLOqoNP4hm^HiNMeh6$NIoJ2qCn*1&Den>*hUBK*23BOzNs zXnJAwk(xG0XFN1waMWY&7+s^tiS6Rb4yly8g$=J(ZMLyZI(I=tQ%A{RpJhpPvh@+s ztYOvvwVzoZP20p!C1$g~Xg5W0#bgxMtt-algoD0QW-{&UPs;n6GR_=@b0;>eJa9xo zWNP^@X>n_F#Q*H?U$4kem%|Hn3^`oCDE?z67gOkYi*eOF9$Z{O{nsIEXjwrW2rK~W z@c#!>-G=Bxom~7*XLo$#W<1A8OhtTwfndsS4Ci&@+`h{F%9|A78?tal*K%Z}735d2 ziinx|QMll8!TeRimnAmbi4QQ5Z=?wF#u;ZaiCMf0EtGRBesd)387hybT09}oi}!2v zg{gLz%aO-t+Oaul+P_K;@q&K?8eqEdZ+HR37a&Zh&i>o+5DohGw99r{&#%i9i#=JE?i`U7U!3Cw@EwOd;hOr93Yx5Q#2H_=Q&;!yq6eu z8B=-QP2hI3gexmWuN#CI@S_(5+(iYl?a4yg463{{BFnq?%X;iqJyUY)mp&8yw@M|F zx}w|7-w*paym&8EStfqB)PYIT`AsE~=wm@_eER0Rx*4f;i`Y#CUfs`!PVgdYnqFx9 zc!jJ9=E?9EM~gLW9EQ(b(bk4SL`jI0xn`V(yF>&z&Y*sIEXu+ESltW!wl4=TRzT0d z!7ud~7xve1oO<5*d~lIZ_-|GI-%3m^H_?Ao>HlhzimzP8t`a0soNNcz`5P9&0X5$Z z7Qt>FLb;0VFc@SbQ_*)5Jc}F-y`9VeM3f7E+X6)x2z3la#AWY_ z-P}TF5o)vaici-5z-g{fY}8x<*#;B7w!R)rsl%E2WwR~9@ec(R`Hm(@Fzw}y%>15i zNLripF#d@bk@rc0_P%*DF7+F|M90-~kv7bYUfW{d2&^IZVjGGwbQT=ZiTwwb9ZwJML{d{Ckym_uyLw04~8ngV7)L{&0Z^7YS~uWPqJ_qtvJBs zB79~7a?na4K;?0(V@4knN5P@e9VH2Ptr|SHh1{m|;+wlOoJ)P6CZfpECKPUiQ2^sr z;TRBtI*L-Z9?xR%41PvGl^{$o3QeC70W9(@&mvIAuE;r>wYc} z%K5vHa}H6tW7Fyr_s}O_19$i|WQbTj9D)Oc#C^ZbyY8s3~4_|SR z(=C8%p>GQ5Po)#SP0r7`_Uyvf#BF{!)G0Xx2rq)S54Jl8qmF`LQ#okUW1>pfQS;_Za(;iDgw;1ZIcwqD_@pi9pFLu(+2bb_0w z1?L}~n70Lg!XD@`%$!X`I()EwEI=--5LaWY2;<|XF#&a(Jucg7;=1_tNkq+F`RP90 z-R@_(#-ZEAG3W@PHsinmBvtf#t_7J51fC;L_7LilS)gS}ZU-IX7-un8o9#MhbNXcD zl%Q>=jB~KdRyURYp%3CO)2i<6jV(?(V>&VFP34z4y7{-1f}&49Q(u-$luRFH{lF*TOZ6K}QY`lunbkD)#2*)SbAQ2+aHgySkLC#HAj$ z5BeyxNXBlbe~oUvb+e4a76&KHi(C$k2=;%JvDKz#hD_3EO6uETttl(5fuDdvrZQQb z`rW|%@X1&GJ0CeNt{;X0DWO;j{muj&vAE1yRv=+SFjBgrEAV{WO)=- zX4w3juS-3$&7;3B7c$ci-hPCmuDw)G4`vFn>}5n1W32CWsB2>!_V_}>&XwDX-;TbB zm-BpL-!eUf@-! zhmye?!P}j(&+F^3x(9wO?O0jgQl7QgBz?5xkoVZ5@@$?9zkfG(W3`4`&M4F!;1ThC zwF&!@0KV&{J(CV}`8NAKn)gU_t&Xg+uKFf-c7j79f0_I9{rOh9U9&@TTsj6`j&AOA zu9Mc9r?}+{WnK;ra&UpU{snV^R;N$N$=`jSyZ;6@O>Zm&fU1h}^4x!4oBDoy?THG2 z0DoYC@|?`PLH(A`hhE~^O9cg?3qm}j>R}NS_>SWYj$G?=bVBPZJ@FyX4jcC1#OUat zQ(nSVLCdCD$SLLX(!U`sIC^wx$%C}rb5C>T`1%r2g{h0Fx36tDckGsD zA`5(%5Y4@@sc~P{CsTONEdSfF0}AwnM}~&Yz%NE)I^w-NqD)g^R?X$C5BbrlR;L> zQ{tHch+Gk1v)BO*lZ&GipX&nnv>)p$ay3t)$mw2&z|hbJhO#_6q5-&++8G0Whcy`j zgD_jr&qXAf4E>)B8p>jQ516~Yv^x_bOgczsL|scp7d?JYWWuve{u%`Nq#R^UM+4+gdY7aSD@%p z!j_o+G-pL2jyJO2|9ae`r`SN-K?lB%EEt}8!OC|5tz5L3*=He(=L;2Vc04sGrko92 z+Ke28;}zI_iwctaOB?6uh(+^I|0@oG`;Kyr%h~C^*}iw+shHTI>L%Y6 z-<^bZQ8!h4V*EMzV&}R2{5J_?K76P+jeYu%H19m~08h15quIJ&I-&s-)e3W_2_*+v z(Q9!R`h>!GBn$z7E5=!r?0q-M_Foo%pg0S9w**aJ5~LDkyna1a=r-DoLEs_=ro;_PH@e{v}l#S1q=oi<#YklS$P&AIQex9L%h5OVmjOMM=8s{Q;nf zhk%b)A@C;o1(#K}`~);lmmvLIe2>`Kvrz-M%jTQE#^)W$JMUkAT9(?s3n+wzr!GZE zW-hEQ#IAm@X<~$IK?vUge}sux ziO2;bY6c+%3)GIE8FlZVuhSL$^HnD{jw;*LaxSVAc+S~ID}Sri6imJ{|H3c(z*|!e zE3@QmE!X^h`qFS1a!!za#XlmVLzKF27N8XF&qq)xenr{2mz~mM1t9N;d5^ZDd3ISo z1yGPD&jrd7^@C9z`y*@CN~vmOU%Ao(ynSC&#Y_95)E92N6;gX9{-E*64M^t6tEO_H zf%7Itkwo4-!WVwAJ#bG}$;Ty5{pvcTTG6|Bo9a>|<4^z62?9RY@#ijta#`~JT5F!v z!}F|dc0y>J5tq=C?wICkzDquy81?y!V2?W@l5HTc$vc$0p+QIN^a)R?0U(&1UM>8S zm*=PX{75WIT*hKtYuGV@UrCbQM_qeT&i6_1cWbf!WGWzYS>|e?_+Z(n{si(>S3w_p z0x%lu5C#@nAvSz8&+7QwgA3425P1)@KeutUIg3$!K1tBlo<}P_9m!5SUjI;zHE8qk zGqa3uY3Tfjp)Qsqq58)7-uk-lKT<24@w5ADxPp=n^9D^KJNsO&2W+F`=6TN?OMbvv z=$fh^t$u1+NEWtz(q^|Z{M)b&gIg-Q+wG+6#8YaD1$F$5xZnY!dt%kSf<=YriG!y2 zsfsAm*oAMmyoqX?NpJe65V{*>G|G}w_t&tfDVNskbl9r1}Qr8RP)s(U8Sr?!CTn+xX z8oP5=y3Ob5(F02`h)ZK3oaQl3->Jh>@}yzQWEOHt@v?FeuchH+A~cY`pbfzdKF;AE zBx`~G{?7jXVPjw_sKl+9y!eBpsLGLx5p@nBS<{&i$%WKes40+vd^x+#pt}cW=0`@( zUHcv!8^L+wx{VI^%|$DP35r-nRQx4}1T~SEL*j`qAefec&;VH&g;drhe*4X*#4y+3 zq&8?X*}Wx!q_X$k3?`lPYC`L{&#hZb6(=yL?<5~hWCK{@Xd;MdyTe>+=cf@fcL=W3YOtkCO%$$*$ec~mp>RV1q@lgz{BbD&lfs2 zr4;tpX+~RKz}EpTbLW=|0X~PXwE*Li| zNvu)lUz2|#UZ)^x^p4~r6_-yVx2pKJ?gOH}5GjRGL_3k+l|P<6J|ps7Pf#22bzZl+ z`p8(D0>-J)+@IQ6E?k)tpD^kL%YC=>*_dUh1Q-IhxFzxSOuwta4yZ*Yfpf0b+HFoIdieszZe!CVw z597goTV{0<@wdGD7s|(HcaGKnBNwo*NGJp$#gE-!~fIvmCpH0qWnL)H1D6j z4Vi-R``~)WcX#aagZw^gl@+5hf@73t1mF{nyw3uV0w|f+=N})fVSJER`=x z{=oV}LiUU1Y~t{r#2&Fc(SIET>1uz+D)|P@p!i~9a~QBOMK(Y@E-CcJH${9oQce~H1QjvZ72C1)!nC}| zCn@~7kNVGxS&q1QHxQ9y0YaL^BqTK6^6dARcO9NvuRc@J5tYpS{453N5-9Uln%;s1 z;pPV^QX;W}R>jQ%BU#1ZA*_CVeH8q>Gw;==L!R)}Cb2!4KjvbLGOV`>eEJ@~3nNvD zovh&;gjoa1d_wnVTTGCxi;V<|$s2_=i7XV0iw)S%Op0AM^8LxNVdC_hh zu9`~Kw(NUN^?2|4(0jAA)oj~GpV16Cm@@cEi*RY7s;rUYMO1Z5iXJLgl*J%cbuzac zqp01Z_?p7SYgo3S!0z2*z2x;{xl!SoZAZ?x#k^l*@DQnn_h6sJC<)F`O}`f9rdNy4 zNLixvtBw*Mb60z9(*`ca+m#UmW%HHY6ri zoJdaNj=%ds`T)w?(Z^@)W1Ru#SNT*#0kK)80rzXIEuT1f)%(}ZzYo7d!2;2arzrLn zOP14$q`WwV?qU=bI1fc7C+q8`ihT(6-e7I9FMb(sF>~t|WSw2#++&UAbUJUUQS#;O zHGQ+1z>@@jSFg9t2NK&)o`Yld@dj!=b=2)VIRiHmW$XMYOb}|PMsQ)#?5O?zUk^=S zO8J|nphC*>*-?cItxGCvWESylG2f4;-Ffy_($|K|D8LH8_w{|k#gq?{!tL8u==){~ z!Lef2i4xI25t>CTfe`h?Sx!~tb~oL!Lzk+w@d3{)P|)@4aEs zBijyhnPK)T{QG8K&j&PkTDgUL#<2^yF3c3gmn&jHI6hV!_jJ}}#P%}UM1yem-jWHn z`Hqw<9Wb%CC5OEoxqF6@Vsi$l7^gYt9blhv~+QlsJ9%T^+Z=E_stoekpB0^#65 z`%nTO-x2r>cJe;;b|4Gnd=%&6$48)n@=sWOZO~FmuE1lPL>E(yQ1qH(X|Z zaG1a-w>5R|+pF0qETM83>=oU1n1Uy0Os2X=2A`3ta(YM$^S@_1>$D zTm-h4!KE;r-N>AEvtHo`vN`XVa%OvU3n?4vt&fl8`Y3kFJ})Sq=Pgz~sX!rO>fSTI zxtC{{h?En7ADP>Z%MMSMqRW)-hAoUCj&%K^x{JX~+tl9b+*_si`MX{@j`Y#Vp-hfB3uU+@2ja*uguOo>`+>8eYg+u6xQDq4*E4FxLG8uZXbm!f(!VoEnVR zWVnIR$7<~iWn;j0TPy9{23%uQTcl^Rh7Ho1vx8TlqvozBBo}L4QD16)yvkdLBBd3m zgN+GZZ$_o}R_w2mEVm$3gdBr+``Hg$3VFAz1)J7c8GYs5MAScq3JBroSGj_NIyL6X z0JJ=s%6xbk}%5WxMMC`{P%nH>Zii#suC72$|Vxenl4RiyK0R`;o?C*Cefjj+O4!f5Pj{%>^Q?;cX87zqSfUe{{VR5nmpmJ z9c2-T83Y%KZfPrayP~!1jM#0VMMTzklAltCm!JZAr)~%{C&+HOxzNw)VeC?#xq{kt zRz~s7GVBU^7CoY_t;~y|k<6P$mqJ;KIMQUxBwhC?G4Q>~91H@MH^~QZ9x8edLM_n) zx>xMaPtGSjU6Q&f$CzdLk#VMKQR7|eETKq5Qq?Kry>x)*LW6N@c!n|i07!5=SjMF_ zJ?RN?J~WwoXIF7)iY~fSoB{~^L*5(-_lkSDGVX;JGLhtU{J=*9 zjpoFyDwdRdsxM#l2eOI*b(?fEQ-qoIUwxG zi|QM~c0U0MoTacT?)ZG7??7uYM!itSiTdbq3=4ycuCZakZ2nd3vBL;GV?%hl_O*!7 zK>Vhy^7}bGc<~(imD1JnBh~OmOsum`H`g)axzg;u(8;J<2FD}buan{HNoiiOv3KI6 z!ypufTkoKK)kT@AJDpoj_IxyRKAb<)`|&`@xa3bfMii`A^f~f3Bn?r%)nsv+VUT3X zn@?+BQ(-gZvh^jteegP=Nb`rOB%`IZ`8>&~f7a7JB#))&QS=6jsrm4s=KTu{T*c?& zopNEz@QHKDZu`_kH|F0xsEmdOrhvF$C6zgbx9vEGy!Si+L^OnFv##X{{7ktQzl&=b z^eQrO@j2PO_cvBpU{Kjj$%Z%lhgf5Di8d=K+cGSZ75R-PUIu=Wc)Y+RG1H^B6TVpB zS>Umt5%x^`_}p}MM)OcjHY_r_(t zu=Jq392q9VYqUUZDDb*bL8zzMJM5(_z%l|Teiqrb@uKnd(zN!st7T*EjHj~izLw}L za0v)0Hr$@|f#oh%ufbUH2H>_+gSTSo3yoXD53ay~t4wL;t*EG7;lLH{`~f(1q!L2U zhe!@3NN?jJo~Ftj>^fK~>)!=?&lF}*aKSo`{c^pUH$LvH8^I`>5QAbn+hg^K!N&K#MdafyZ`#0>vE_&fb!6-N&GUv29a`_JX7 zua)d|SXr%wX<1?DkoSC2y`N3zHv4--*vk07Or=5?ZL^VN)ATuKpU;C7b~DY<3xl5q zDIyW~Z_y1FU;(NI;qR^Owo+iWY>1XpW!1JRZ^yFGo0GvC4;bRnj5r<%walGx2#WWW zW`Nut&tQIfWq3!i_ex#oy|ysxTcX&E#|+NO)EIwf#&`)AO)~uNZ5_8VX|`^Ah-Bce zG4Om{ZtxMNf6^H2e6mxkiSR#n=IGnPtfWpttZnp9+_wv+5ymfpHuylzbX;9E5E9mP?AP9F zrySLUaT>0Z30xlBT&C)3ioHT>?{I!bIas9ck7fB#6JDqVzz~Wu9aLyjLkA1~S%H1` zM$eqcOU8?9=5uxX7Ukf}b+jZ_DC~MS0v<(2`tQ5QbMyrB=puffyblk$ft3P?iqb>{ zg1t`RWuq85C&Y=uZqCmV5-|Ct`*lRJB!qVlcEIDEbPjNT-fKqzX1UZwgV%%Sp?Zm> z^98EQ#Xu40(x~X^mIYEg+tE@T6WTrPh9s33iXwiegg#w?6{*A;RD`u@koqG$&*#_Afr=!>M9 zBgcfuUS4HM$x)efj+e5Huj3Ej3q19-WyKq#Lw@SANf)oR;JOKqWg&=s!(?p(sXI-=cyJv5w%078rD9<>pMZ}e6<+)~ z4QV@QM_rJ(_`>8i9Jd2#FIk+)SR-+W^A5N!%10ZoKmiI?$D2OOCQQ;3za_{inz?sN zHR6E2S*uRpdAXxwTFx(VLkZ0ZEWCUvyc!=(m^ULk{aF~Z3&1}0t;R6A98=>#iflOT z@Rp##df_yiwS0rk?zrSz%HqPwPMmpXQ*^WG33opYI)`T}kwv@M^>-H0w%ZP#kke*0 zwdPu|Pqz0|v!6dR@jL=3tm?U!k5X$ZZT54M?rD6}RGxYQVlGq^48jlL-o=fR(*V`E ziGi2azvxP3UN{KH#6eZw`}g(kofh&`S#L*qyX@%lSlAe7S%P6(iG@oIB%5pdt*>qx z=U*i=)~Og(zF{7{^-VFy#Azz)&nhnX!#CUKyT~=F+~;|-G*0diZgPhYQ1JHG2c@=R zm>S`VK>=pp@_@u_xvcN@&UI2)z?-rYOMhY~WREUBi3ANduV1`3I9M}U zAC!MKvP1D)-tFe3wijICq0(`i(LpQ%NTI+qVD(nwG*qFvIm8vr>woht84Ams)oebf zJ1!t-`n2e6+-Ug1TVpC{oS12ozU2xZztcRzH?d{>udKc%i$s)*I4c_AryE97+|UyZ z;%W_-BL*?SQ$kudOO)0_bJ|zx_c&h6-}e-Owjl@9Zf-315%1BTLQ5W~y6|e40))k8 z+AbKbXNWRq<$XbOKVnxDeV=mQ<=`E+FNnVY1l1t6srQTLHxVKgz&s}cZh;ycEAhc2 z&$|UbOEV5n05yne`Ar|@(k43k-N}t&EnQr{SJQEw!mT>|5z)R+xL_pVS@+;k&4%oS zOLR7Fb)$;oPJDC~h0(VUwj%|^h|OAQoUyZX`)UWU zQ!iE!NK?>U_{o%oNjl+qdiuyt-P;RLiT22pw34?RM9kj)prJx^h3GsuZrd`B;mP=V zskR?p)9IJkw(^_>;u^|Bz=})|fO5szOt4nk<{t@w5Lt&h3R6(&Sy-mM!TUvheXF7W z;^B6vM0mKLzYmw%HVuZKpCDmIl)JWbi*fT4dF}e&)$HQ=Ow~At+o6xYxn~c|D@oGi z6c&8A7hz8B(jFJ?3)?AW_q{Mb|Ft;BK_X%uvrEk#gLIt=D1y(R4}0i}X?k9TMdS?{ zw_MP-ZS@`v57gcit|hO`SHA8z913qLT}=u25IfHNvcK`N5u^EhVG#mPtIKjrbq;Ak zb~zI0RcOP8lH+$~ApG35ASF9Xb$+RZ^m4eAa~I3P+p^7SRHjz&$((&7SEmM*drFqW_ooLWUK4x=5q`51cY2V8h zKbV4fS>8wTwRK(D)C8b{M-P*xr1VjK0^J}`m+^QcPWt)rN`QwJ4J83v{XM%n1Q~=x zTsF>KLb18jt};~{5&%C_WE&<(b$N}2OX}eL=E)-aEk1p_XeoWj(o!vy?bQx05X6DK@ zqrX*jH@L5^fUdNaPGg7(T{SA~macT{R@0EvsQ`2MbIs>g>APaj;CUdJezI0MJ8X^) zBy_(jz#9U^b1g7ci_fOr;z0>bG;lpINkSuMp$r0!yuQ9YfgrK>lAESHM_KsYNcGKM ze!8Lw`By#ODr{aO&nOToX7lEEl=BX4e%yH}NmW$r_dv%{sZ>hv>hR_GdNg;2*4ZiA z;kjVDYs=k)-jc%bg9CuoU!64q{j5M~f9``yMK+(q{ctIn%GJ$RdRkOU_u_6Zy0j<# z9PeQ|^UgBf+Pamlz@}I_zV~HbmDh$6C9U7wbO)~tJQ*mJROK?Cp8v)5+i!pmC=^pL zJ(wGGhz%ywfLOdwJa43ulWfgkHiV^ymuc)fugYqs1SH`J0?HaB5L%JS*lB=8K_@Y5 zz2iB~W~GIel$IBzWO9CUj;*fwfw&m_dlFvxg{e=Lx7Ir%8ri)5h9iWs>YG>@NX9kYJaD6&_uP;Z`5L6{St+PwvkvLm%_@zTl_&Btn`z{vm*;E4r&q2V?0Ro)!(i^L zUtgx$L`|Q+52LReR8+XbpZw(uUM`Np#UjdH@Ub`9%ieSsD$oLDCu!twP4_;&f-^&Q zup5>h>T1i~sk{_k9>65b^>JO-iS~g5C%SK#@i^N=i)QfeMGE=+LjOF^$ujxY;&cyu>t{7N!sGJNAlu$w0{ zu8urfXx=2hBYujwP_b{fSEEX8z`*+C(h3|l_XsWzYdd~YMl3z-cG<^~yUVxUr8g|iYyBCe`^zc{!-(PnrFF8+G^{I-hKGYc*6GaI?!2xjkzoK5&wVE>(Q zcyjR8<-GofNUA^8?Xoat2FJv6?Yq7gDIlt8d402jgcmm7mlo34`1k zc=C~M!_oy2`?Fwm4Q5Bx@a8^5EiJEqYaKE73t=8yf%V$_*d4jFHE)z(G}mi1p>prQ zp)=GflH66|tT4uKG$#vb$i)85DbwqAM_^%KU&@ZtcAV)EXkd9HM$5ub^))r@i6d?G z%$|tyQ;(GOe}DJ8V`+ZrK>G(ay^?!t z>_&nIDxbJ6YrT_7Y}XkaBJF#k)|+$k;iZ<(ZhThk<-%k~Zgeq(!)jl3HEMlOKa~oY z?@T^E*^?dl zeObBrf-R$A%_p3`_@Me%h3&~cwGu7K6|wTiuqvqm-Vj-VI8OF(3}qn5P}q?>O7QAj zk|M=`+O*sHbig_(4wb3TCQcK}jhvgA`_=-rL4TX}+)8jsAEclMZ&}_?=<|57KC5kX zQ71f5AE$Qc`--;@-`WWcKm9XR-*$;?9|c!weqrAOHpv!jj^BWK3B**!ZhJ%Y z(5EjlgSg|jzq-8rDtGzkAm42K5n=2pubV4}mgNE-7MhL~bT=Xta~`On$(W0Q=*Y9u zYZ?;;+;vQ(D+>$E)C#0rP?E{afdz_j;E3|XJ4RKgEoZ&0zA@M4etsJgw7aevb?%=b zqrPpWtss3t^%zX~KM}dYKShhg1htpz=uvgA(>FGN`>}*Q&z-r}+p>;-RWHeYG}~W- z-m{vzVIXX`vK>c+G+vDU)|_v>eMTo@5dJg{Fq=EbYw_D#n%EX6H=a;m$x1741+ycW z@VoyIcvJZazaAs|{(oG7*eo%cSte2yg0{<%EXSA}%w!Ms#7-_q5cXNhU32T|Xzop1 zgSa`Y!cp-KvW;zLo~WYPzq(|~ZG>t3J}-KT$Lz!T&a@8<{J!B|Jm`9>V-F=@CXz_7 zy#)P8`)Rv}HYT3)_xM(3>9_|X3SVBe6>#y0XlUc!krT7OPh&=Odfr@WSfZc$K(gRg z?{slcO2RdBhQ@_9$5Om@0U;^_tLCtA3Xyt}1yM51eDPD@XM6wU=zJojUr|la?ibHm zW;>O7f=&3hVuH5E`N{D>-aIqWcqN4^j>0750K*Is6Ms@LpX4>rpC`jRA9`$MG9rO% z>|OUaY2C=*_*FY1Aj*_;o3+|f00EtBplXN&E3Rkvq3&Pv`Q|;OcKY@DW|_5Q%e?cs zBgSMHRd+y2=Ji0%SX>ihlB~DH9JQW}IFfn*KgnV!LTCEvt1qcA%G+K*HnVsBz9e0U z@Xws1g|W}1$q(lFLQ_T@`adN4S~@F|nY}=TYBn88B*yFggBa@CLp!kX`%L;T58>%jxlLN1JHNOeKFY;D5|dP^YcVd_{* z354^lkK$FHrH9E_ojv_^I8ni8)yDMf)$ioC_z}v5QI>6wXYrR-0w5r%CA@dE*3wOo zI{Ylcd%d)2Wi*!D1!vz2+O%X|>+odkac97f7$H|jX+a&U4YZ2=kw}!pq*c&RQfO>J z!opc)3X_6T?94(rU-2WNlN7&}EKnrkrhdZ7bly|(hZk10s0g3B9ZuJlSLj!x^PnKd zB=r?f7Q}|5;*C`WNi5O={=2=bqjhb)qgD^EqLwCybcipb6?rAFWS7IcG`LIsX!beatr zLEl6FED6-Y7I_u2B-qSOD|U4@d^F=&pqzS5j-J?P8;c~b6G<%2<09J!UvYB;o-+&G z`P1x`?`b6&iVqLoHru%{+iP@#M6Rcpzt^xge)gDwZO;FeqPQ@m5i|)A_)2Q$ztX1H zzIvs@hkmOlamD`%yPj10rE7^ge2GLs0@M&7vh$9a+Kb6O*>y=Sho#0-Hm>-kC*b3{ z)kjGk;(V*^!30ZS(dyq>)k_qpSdEZ~^T&Ak!cPZPR`&#P?8nRdcwr4{tsS87Vzmz29h^F$HitJ}>KK^OnyTn6$$Xwc*C!rE%mt6;cJ<)~~PSH@$Q%KW-H z{PdpA(<{CPAJ`@rd(WH-=%}FmMPa zv5rwl=H14V+mK~KP`rRF6JBHiI3uvNf9ZnLTLfIG9pNBN{w1&9K8Mxq=XCA#I)E=22;(99=>?3)^vmNs&CtQ}oA z4O1LGhfHy(YNW2u%=-yNcPrQW>+L3KIlJSoQgy1k?@_*zRp7fX(K(e|5gbPxNq zbhRTo`zLPC$or^3?Oy=&~os0e0EX=$Fgz8TMszyp#vyu$7J5_*~+IF~uN*{Yu$ zzxVs`n0=A-{%F|mWU9T&;gZek&*HA*$zu!^{gw~LD}$N^lW>nW1EX#$vPQfXw*7MQb7YHV#;W$+3f?9mtc6*7zAK&H_jh+WBMTN(NDC1Tg~5Y zs+E52#6~tz6Ref`LX-yhOb3EmDV zR+0bG=;IL6?gFhlQ87)@Zy$fST12^eM?6v^=tGm|)zv%3RxtdA&n7PQciiqziF-CU z5U;O1+mf*I#iLIC6*VY&mK$rkrOARTw69=?T70bv2g67l0;##0yBqf!8_}ZwSu_ZJ zZtIz|Bu5b|++nLCou*aUye_xI>J!>IKar0pXsxTN;CGF{FqmFVaGcnUo$cJd?u zy$}J(u6ZydAEXdJ;4609k#S4GTwr3+-RF@RqUbk7@f&OeXaoS0eF!eQ95L@8tb<`z zny!zFlkJlLC#tb=q#nCeGzO>1CDhiR-@GgdYKUYjNM$lS3!p6yDV~ z+04bM*zL>^W|#b&Hu*CK=o{+rJYMszxxYeV7Lp&pEm2K>E~qEke{PigZV|#VvY`b; zW>de(>Xo=VQNOf2WiQypZH1u*&HZR;%iUtrkp$Oe-WB?*9KHJbXB1LP+6_p}V9Lfi zc3)U;{f>de<&C2BY&N!S!A!sWUgSEwHK9~ymYi$nUcnGk4N*khaiPdj=Br<4e1i<@ zb4pEYyT#NFnBpAx=J~rp3KHF=$ors0hB#x1y^%hv{@s{-=>lM_X<2TJt`60{vO&&} zw;D;M?w`MPo}2^I#BE==q27dkSrt|qD0{%ze)2{pKf2If48$?tWu)~i@6spa^7%cy%VDY+h*Wz^x8 zpI@!uZ!GSTODbAd$#l_#Tm;0y&4Ld9ZF(!|lGo80tBM?iy6b-{V`d1wjks%fquD!$ z#%&aRRGZ&y*~yj-Al^^9*<>pE@srE(uS4(rUyRqA+iD^MRw%=bDSg=xC!xGh$-nPB zub$7(<7He$x$knyn@eK8&(K(|-$EvS&c)n&JNh1F|1qc5D>Bi1S zjbGVpK(X;v9xHyG&ieK~;|DHae3YS1q@MzU2kbwhVq$BW=x|BGErrz_ZRhN}QB4#L z3LDzE)!~xhr?HoI=IPAMr!j<%0NJ@oDlfVyRQt(T4e#$;pB895tDPesWH}5zVjz?V zLTzWt<;PNMq&MlzNclF9?|;rJj>+qNkRBc8x6Ql5MY%U-Cl5=)RQ;mj8cgNb%byx9 zSN8aA+|&IPlg0n}c!hiynE>J9hoW0u5B`L>=ah<#kMxgGbR?V;0+B z3jZ!kqfk4@q5Q*cI9~bU2xYjLs4ru{WcFUt;ZW7>WwiXqK2I^`SoWZd(kpBa}c~@&~9~ zDMiw3oU~n4^$RO>P{CJtdMbPcZ|pG2%cp5}ldeZ)zv*8%QB@;h{q-cxzIPa7|BG~` zRQKukwDaOZ+RU3o->9c6G*kMKT_0hLhaC~kO96-z8M{DF$}VZDqg!Kh}}cm`u)e7a?c zhSIq2e4XAK-A5Ve_u{KN(b6(W#q=t^Woixgn~w%sZyns|Ri1VX@ZpUm^Swfg9+AW+ z>fptD-3Hv%#dr$8)_It5E5_gDBYz2FGm`!9z63J=AV@mGWrOWK_MAG>L(#}OIykmO zUt~kTDS*TAgHKwv`U4xz@5Pfz!K2R>s3b7$9Mcw^*(7wt_&ZkU!h5kX3pHb73U1r4 z?gt1BdIH~JL0P0?HHu@^_%rV6)VgGCY1-E+J*^)wgJ-d5g70`N?C5^lsKoXM9r4LU zEHcw1huE26n()v+Y686f;{okB-q?y{OHc-()m!cP>Cv4lyJoMbd=6Ws^Da=Q-$3S1 zH5X5ANOy@B&+I(XR8*AWHS7FzGcWBn%k5k_*>mrEg{8zoNmfetNcnf~dcWOJ$rd{7 z^+wW0h6O&WK-Qz`)dd-&ZbuoOsxOhLT)m&A(B(PJsAM0u2Fn8Uc3uTF#G}$$sWnxMEbo6bx$GYo zZbzgZSB?B96uf@DQEVvxQNXI?uk68T(w)h{jwlkjabxGBH>u;my{+G52hVrw0D4?E zNNKq&t+KF&0wzsQS7SuaR2P3o{n|WcnLSAtC>jsaCa*zNB23*R;(C1?xV<6ax8HG{ z!fK#VhL3fhq~Xqwb|Q>#I*Uetonp#S-m^VKHM3=~uL&(uZK1%5I?Zxk@C+ywK8%fv zF&{(MWacE)_5T z#kiy|Z~^{>5Z2V}`dFEKMj}UN6V7D^q=COrq$Oj>c|{DRDva5X@N{taAn6~cPqoh>(3k8xLjL4Hus3RO#W`^ok2%mk^4z}=kgQkCki00K?^SMCwB-^c0ue`E zh5kle>ba=H?GwL~6T>w;{o!$_;nw|-u!QfU2PgMSmLepC=tj}={y9{S_47lo88FTI zAE|-iKW^HNA6`*Uq$N4V$bfmJLitm# z>3$Kz(laE>?sxKoOTVm5_vam{Bk#q|VDAa^YO>ZM_8o=&eaIB~7NcKw{ZIf?QgEUP z&n{9Zk9W^hkt;dTL~@Hg8A~y1;PWGhkE-Sfw}`g@c?w;WCRrNlde;zp4fwJvU$$$e zXs&ABx;>6zwYYfp%S)*$yKJ)|zI@kBhP6Y#q=~(hRz{!$*Z@2Ru6UyamgQQDFlf7v(hMW|^s&oq26{&DJ-m(`SKz zDP{K=I)=4A%kIsDKtJcn>q6>FOSvu(H)u+;x)bx{*1_ma7M0i0Eei{fa!==h)fO6y zMX=Ag7+eE#))7GxN6~>S1an?>O-Yhe3pX`6Hwt^^ARbr&yDu0U6cc%eqNzeeTPCE1 zzKqGNx0Xz$ebMTp;Ex_OwMkJaDP&jFVF;6v*<-K}{thJak7Eq+j|B9nh7A>cP{^2f zI1`qm%VaBj|9o2vkLIx96;h#Tnnv{kGaZ}r_Ax5KL2HUHWp|$PyC-@KKBKn~6k5#g zBXvi8<4W2t62D)M!Ee{~%^Gb-{~pJ$vhNhU&=UHqVG{fyY3J_L{3HZ&eG6UI;A;5W z1LO=Zji}O-IKafJlwPngERaxHLQ=JkOX2m@Ix3%y; z_V^^k)~!IiLuhkQT#kn1`@6HRQF)Z~T=hy48fuawb#I$r-nMy+K)fpHHR+Gy|yLyIEJC?$zf~bhF3orEee^Tj-SfR9bExT-Q9XLw{Qi-LfH(=p4qWEV(1lG}TkBRLJ(4*=WT)q^x;`a2BW}lt{q`KNj{EY2*x% zY=OWwj@uU%RLmDfQTPqf^geFiV+#g4s83Sf>C4adK#@1H#${ho@B{uSRTp*N_l#KD ztA=hv{r*)s{O5^2CbZSN<_`7#mVGY={dp_g0XJLr9y#2QMU!@Mf>q8Ix*V#B66)1cf;UfsJ5|@u^ zG(ut))t&AF8uB#N+h7qxA%S|XTj4!|#Di{xMD#Q;bmk*`*hDMoet65R;k zP3IRm!hFe3(y0_FnSJc-3rf>5DHJFdgY}wp|sg()7hfzr z>H3z=C*b*__*`1HBOMsvt&Xa$u$*AaJ%VVDM603}l)h_7@!K~dkPUc>b%`?hhjB3UcWWw)<2Fne;9fj9sOtN`t&IPO z;e+Czor=$e%lOIgkN^Im-9qZWBOOG#_`hd-M4TbS0DjD`Is26K-joB^Jgzws2~nnx zIsEaWK>im>Slpr35QBzW+(L>`h5SR}p3Z3-#sw%NFJS6yWvDIZ@r<(HgiLGSYJ={~ z`LtlhTXpwO+Dac+Ov~0a_@jbchrLZ&@g<&}+oexS@&r`B$L|HglO-u55wKmM=pkx+>O?ce>A{`dP`TN*Ti$rz@H7=K&& zBQIP{S}GkNPCQgR6QKw*KVR2;Fd&0Y^sEIRKd+jPoy9o7Q^h=#zxQ@0%{Rj65#L%wLOmCOc)09FWg9#zl z_mBKC3!^~TO_ndm24+mO$}c{HvEhFk@ZHjS5%}t@^MH?)YyzunKAw=zq5wk}h?iOK zN(f4pS+??WW9=l;7=r^F$8Ii$D+Le=;DgPE4L%kz(^Q(BHQ1Y-zrTWPS3W{u6e?Hkit0mdt$rXxggwU zMA3xb>-{l2#J^p>zokke(yHS>%TQ#!y@m+FzT0y|!*^wJ zcJu}s!|-_un?4v36ZapJwmmEV+MLbc^7Xr&@o`VRG^GEOnYQF^zrrrJo)WzGoJKMzfnqC9)Uy0 z5%t}sapHZvId{nW@(hC|rixgu8zLn{P9g_9FN}q%*k)ziHo%b1!X^yQP}wb|A95}P zWfCr>GT1v@x6aMd*c0L`?v}eqwikduc2a}@JYNDPVd-zWvW|3uF@9J4bn8RS=Qos! zP61&GQio*V6gnW#QJjc)wjq!(#NT?I}yjJ~kqTxcismW^!T8tw22Y4^+;=`wq3j@! z8Vt|*9M7&b`+TAE-IK2?T`)D_ACUphEuX|86Rret(MTPd+289NTdspc=JewK^>XNz zb~%LK5KbZtS;Pn@VUggECbF>t_K_Ntc#_4mruZ#$G6lPgkp7G`7$%=$ynWYv-zFAu zSr9+f+o4lrt{@OCCJJItp^6LI{6R-rUBTR81S5-NxL$Y+)3tf%JMfA_;vtD}0{(Ar zVz=z+L#=6MiQGw|$2G(O8?w<6F*^~=4G!7fx9-IZ5dH`z(}UcIlcsc^0tt18*vtQ^ zBg0TmcA}_|SO2uFsEMmssY|1Uo?2h2`Qrh2?LIqN;cDTg@jyk;>x&sv^!D9O&RRQ- zo>&n1*b(KA%k|}^c1Uqi{&s_R%Pv0Dfe7Wq8%jQmYsM4)e)fN>N6&1Xa}RwqH2*U` zEEgTT+d>pEe*?OI`07i6!40=agzOPup2|T2ZivWOJKo6dii};BXD-%3gT74cosbnI z=XozC&D=K(v21fuqq>SCU5|6|(%gH;jnV9gouEO&Z_hqdBtvXK3SXrya&P<{0Q;8W z{xi5p0n*>A$oAv=Z}t8k%nX2cOS}E~FLJ(-OehOXx%2mbk>F|@bf{fg-``x+JbgRz zY_yvf`W!t~5&qVH03U}VPHiM@SUvFtI=J_M4M0k$)Kpwf;)}o#FC(gM>hf z06I^z9{?z+6wKHTGD9GK4dTd0!uSL-1^3k#0HPz17_j=oL3Tz5sU=qaxBdNp)Ir(? ze_Eo60L__T3nG0KX-sVmPmUV3oOZHB4u?zt_0G8+S&mjfB2Tq70SG44Av#rEPpq`U zFK)}Gf`F@z1_EV*!2R?vn5Inpd;42kkB+-ZnqMM!hv;z+q^DGNroydC2~;e)-$t2$ zT9T2`u;`HBaK>z%_h@*8-h{SQSSz085AzAqIH=q@mjVPYg?@MlnNp@6$b{QJ9GPcq ze1?!JqEArB*!OF0eF=$fp_Sbc-LU_4I7!5incHWg2;vn*nP4YHWmHa@j5T6QCk(^ySp9zt6Hwqz30fcBZfRwmIhJhl2Gv-^v;0MenZMXmmvkb&;B92=k z3~{{bKzfU;)XPY9E<|!af{{Bh>Hn1&0u3~U-0>UYDO=h@JcTKI>q+KjL5Sr5`WJu> zLOi4TKnRdjJCJZa@~XY{x&<#w`jiSGpgOF0hV({v;%%1fbWC7@$M|w~Q%oD$$k}6MVxE}34i+zmc1tcW=W4;caUK>T( zG}E3JrdA&Q5z>PpNU$M}wQ});c9@Yb(kdu$CjDX)>nVPZ?5n!6m8 zL}nGy(i(^+JwZf(^vL)kQEN5Wdd=d}>Nm-^>{eooX-a>W9*Sv85t*2<`vYNgF$D+Q z(_Xs-nCy|RCK+UaaGM|}zy8ajA;NM09m(v>H;WM$zr3Bf@285g0cfAz_unAZhRsuQ z6L2ECF%_)8m9@DBH(Z#nJ$-XS*asmT0w6)39~^#b<#pXw6SD(vtDa(nWQp>MVeWQZ zI>satb1(y)Cbx_7?t#CjD6$~9udE@nPCz-z_VGT_{m`m`#T(_`NjQQ}?WD9aXY2a zxgD=DS#QrKBNEy=im{qtMe)@<9;}Z4tSi**tuw4iG65h972(MRrNni4d&#_qfiKr@ z2vGr@WgiPi{A*vE$LOq@pSBNFTtYWcd3E2nVMJ6>CMkT=wW9^_o2J^g&!+)tK-3eES`EWqG?8%AcCYjC zu5e=eMr*~5qkZ>tV06|$69yh{IsZ&Lo)g&sdLK6EdfxF16ALS_=pY3};f@#|B{Ai) zne^P0e@vl3@+KSs*ExogMfRScvP;nw@P@%3>{tV*e_z$&PVh#CPJJUQ)q$Kxkm|+A z3_M3NT>!XS$^5(0V*7M-Q-7|jC++jN5&&hQP#zU-#)R`!({4&ZD z$}F)S)!*~^GKUAZWC^dWX1m?zeobPo6jK*W`J&${?vuCh?*aUOti1_5l;8V5eD2xp zV;}oiqr_MWrHox6(n6&SA*4tPLUWIOtB6EOL)ulOMGM9jMWvLbl&L7CLJC>t{-5dd z{r>*H@9%j%ujlprpGPut&)oM}u5-?HuIoD2^}bFD4ScrE$wVf?-D+Dpw(QEPXjYB? z`wMk=6nef=ML_TnDkmNK6wg~LbNotzfBLOx8}_thC7|M!`JFmm!+8U+p8wu-oT$~{ zdaW{Jtx}mVX%v5xcDJN_L3YT?(t+;Dl|O*X!!Q@u%fAp0j+wLYQMeeixT0EOdy@*8 z`j8>shVF6Ln{mIdqYHiN{?M*9>I1FLO z91M&%OkqIsTy}-tmd)ih-^6ynLZeq#fQ`eDyAy#yl(2;HG2nil>-}9aj6DY){*h~a z4ipqyX$sfQ?#~KUMd4{8!0Y)${`2Yw9}w7J{UHyll}+GW#O7zGMhEH-%}-Awdqd6! zNln+nEYG@VFJj?i&1`{X2rME0%pKdQpkS zIO1|Z%cHxZVW#h*}s! zeEjpKtGki~ho*tUd;;{;1Z~&)ZI*xJ0zP!`HdR#z+^i#(@6wo^Vsv+G5=iopbi;=w zUtVQ+hQC%PL`DW?R(wd=#COxXp4Lgx1lrrqa1>v6pH-|er`S~8D8SD=KS^Y{(8|^f zMJe4wQvoKUf@5|IME2}3-(;;q*)oH>nxc|8D5^CU#Srf{Vj-7aQ z>&yd7FtPsF%i{W(Vj%NjVEL`;DP9KYcEFaiqxEkz_v&LOYx)*|3Y%5irb=}T9KIH? zS5~_n?BA4%{l+bA{Pn2Vcz){6!0!l1X1Lfo0hNY;j8$Wv%~ z&0LK^kBRK~bvOiyHTJUg>*X&7+FsdZ-AO>~({n?n&&Ad<#zLkk+l$zsOrv!lOPOha(Y-b^2Z}Ch6Gk(a(PF&&<*0;rj>D@cVxpngpv4XdC%`9qazSL*+bm_~(-A*u34k zDy1mQ`?SCKwx!p~2xhPg6sbG-^c{B{IU_lWrS0?MD5Ab1Qjw!`CFvXW>NF1=U0JgX z%E!x~ae_==Ym58NIs5HI)6WoUq_yXI*q0KMgNY6KM$<&lRCs5N*pMvwSh_+akBlbc zd*XW=KiGd@d*4jD>;z}{m18h5CUhY?$G%IGBWT?V!HL%u2l}50xdBubrg?_W4f_X* zbhu~V6SHhdecXVaBbwSh5_iz@T_?C$JUKx*3-D;F&sUosAhYx1p5>$0m7F}zkAmj5 z5xu?(SUp&nnK3#%b)j@>{kjQKyMnxKorOSY{|9o&TP+9NFWc)eL1uXTTbcUPgK)g_ zB0<8d7Se^cg;}@GUgKE*irNfa_*ZfY%W1>nw~JT$zpK&A#zNeA+ufnjtF@DF=v@Y>V?bIV?uxj`aC?#{&DtTKB}VJpNI&tX zXQl|ro!_n7THhTr@jWfx85?a(&ub~X>{pKx_q@?Ry}@SoHo?ApV4D~>$VBg&6#L94 z-yQJ+fNLmQQl|;e*r0dysxuQj-@-c=oGXt`!)UW(+NT#qjL0~=0ZDG3zyG>pn}0I* zk|ZP+RXhf#v1@4(QCBAxC~M-bV>lpJ7jtRpZm{VRC^bV_35{!T_yYI+XGOo<#h8Fj zf>~KM99Z~jU7&h@t2rI-`SZeSob~iYmj~(CoCsWHNRy%tS8n^r_H}mIPs{-Gldn3{ zXbBet&C23wU&pn6*@KnyJSjwPmUAs)+HkB^WMQuBd>y`h@MPKLr`S^zG70$yYrG^^ zZwE;#3!7yGH`tC36o-1>sm*WoMA9@E=w04yK~RqZrF)AN_}ph6TlY%wBK+=m}Z({3n2_@X6%HKg^zv zB=)T=d)$|mz8j3B$6+{INsDJue_o0vero)Tp=}VYK7BxLah}V4FR=?Y0v;Y8bISsC zZd-a&eP?=SCKFKIyn8BP&Owe6cz#bi5tRnoM6C>Gqy_}Sh((0B;|u6sJ{q|`Kk~A* zjn%@}&)UY}VzuIx+W%R#DNAeFQebygkN2paSJJr3ck9hRdMZOxjS2{816Up_P6ps8fCBM zANm253k6k5qdz^Kkk=mfF3i2Y_Fb~ha?b3voM7FttU{N)+)?j zzPT6YSlz`NY%cnH&5OLJ8os|me`p$rc}nTLI2}Qu z*j@8PpK|e*k^#H3M{WL*5drNhQ{C|9&W-mLe{HqzAjN=;BS=?s5ZPvDU-83jYoqGDdXc~hG=Hwo;{Nr^o%W)0HCjgcr}n~ zO6_d}h|qq52SFWBQpLleqT!7I!BZ({yV^$@#uM4xXm=|0cibSbKOLotQyoDO%8G|d zGM84(fs-Etv`)ZGP&g9{O`ek;e;BrgA^`wLA+-q43CQ0xJM)uV=0ol$GPTkdGl`wt z3%8uWhBSMy-;m}s@`kxefBjP!l{MoD6M(|~``Rb~i6^@ekhJbsvH*WwZu=(oYaWap zu{uLD#eH(5Uwu0TPEl}<_v^Kbt)A9{n?n1Yr6>XaM=#d>!+CQ@NmX$IBGI3LE{upN zzJZH2!r@Z0^uNxW>h-W024_)VWWrM28pU(|PT5%~%0wEC3VPOWF4sMMe^W{(Q4WFN zkWyWPHD-%;ny+lFnn(+LSr7239)ZcuT~^_uPZEp<&@JYNGe%sQ4?htu?~ zssFQMDlUCI1772!aJ@Fzp6$JYpc+D=X%JW2!OPbkL+5J*@0c=;pe=a zqT{;!&Gtk;L!G*OZ?GqjxrI6*B z9cgF1E;Q!Sxz$Gw-92h2zVMjIg2y#mUh#ccrO8_;3l_-eo6XensFJHV_Nz}#m6fFI zNR|};Xzdg>zL)=pP4F)vBynRU%iXwcwVf{j!$ALodJeAFpAQy7XU`13Qr?dPNA z!^k39uQbd|95&(BJRAjS0U#{|y+9~$37j~oO}_R|JD zmxo#_yuYsUT56U%O*?mSF%@yVYoI+$(YrjRO(HV%L+;*4O*!8Z(1~k1KfHGRoss#* zfa6=`Wnc00&e}yUxH7OMVeS1+CDTRzHU%6LABp*o0Ho)ne^wE+t^}#=tD{}~6D)Y~8pQ#nZ zZ3(o=JH-q5o&34cBZgu3@;1p37ZHyqZrItEK6s6w^P1x86=gHpy`$KStRVI7#gSu# zPkMv4G$DUgL|J52y~K-2Vr#-Wfqnr@9t)?eHIk=&lG*F-d=%%r#u_EiA`Xj)Twk+l z?f2E+`A{~epg8woKv`7lZ(g|sE-4`Ub0E8RYJ1}a>afXvD!i?%A|o<%85(n|Z$MVFQ^ZWj{kPoQl}%Px8g}KRz+-+*Wax$-wMm zz>f2D3Wha%mCsbjr(yL2W9E!odrZEW%zVUniyoGQju)N!!a~49#Z9<^pJ;TQzrynF z;ElC>J$v2fYB19pcI649HIF@->mR8REEyF!4WLCy7U+{JZhX$vQ11uQY`iko3Bp}nq+&5NHHwieG_lU5Pu*f>-U@+dIxH78E3A(<|kfiS`9*PEUVR{ zWYpFm95Il19Cg2_yoY9i7vb?7 zdyb;4;A|>)^z^K~bJsWGr8RO>ZhpILL=*iUfy%9O^K;^{A;TXYz23Zp`Q_QzHQvN@ zl*!k*$iEvkG~1zcfD&B}9i8&OaFvlrLX$8);OD==rOSTIUvTv>=hpp`eIc#caF`;c z0HF8Z2!gH7_%TQ08CGxdAr(<{uQceqBvl6Xsf!5!42(j(@~MD?>~AMXYFfF~urkO7Rs zkLMN*9h${>xZcxSI%ucP+!=ca@tmkY5?sdzCEebv+nuB0Y3}ct(N>>q7_E&07NWO3 z`5!eP64>*011_t@YO=;geoTnqjAV<@-d2!B7q3hC^%TjnEFL#PYxhK4Q#etp{h(0&^-7 zDOnVr*?i%CG#~fNp(8;rYffTN*>vs}##K;qxlY^ZuGLjeE4B!oP^)yEG3O#lE$o;E zA$oxeaZ4p5EI4fOQ`h=Y&fci1?g)XQR3Is{%>u(-1I5IYRUei&{eCkBzGe4ktQZwY zG!1x^3Q*tVtF`LOe@LU@`yLhYuAXNnY_Y%*q( zZV5Q?_7@Pf9{y?g(~#6yt9n?8{98WVrEt;d_j5q;+*h;w9h~ql1uf4#rV_SuB77kb z3Xlvz)`u9&Kgj4G zQLmW=Uyb=53a+LTocr|v6`Vl$z@hOG47vDL|8Al1 z1Hj{5%b1{h&}%~3Q2zeN1;xxboU0G-h(nR8+5u^DynYjh2bL`69X%Zg5UyQN8o)D? z+w+?2PUhR|(3PnB2lZuV*BPDn$_NW>w>60`HTRkufH;A|()bkO>C;7>``IXdh;m+S z-LS=)XFc|$#=Ga(&)C8{)S%rMxv^Hc+f}*WCTX7+!$i|rU~PsXJI2JrTd^m?d$8-< zY7hP%>G>ZoYJj`|Ilu$82I~tDWSjQ_AonhVHbWm&igz*?ak-VI?ocE;I6I$pUED0MrngK$k zE`?brX+h6mE9T;nt`Ml4phVK@D9iA^rdsz%oZCayI~PBq63W;%Q7Gm?xeB7eixy}I zn+>~i?G0I(H0OYo(Y%JUHKT^zgyKZ=*?LB)fci*TbVKK-&G`0{N^DZkxy) zE~45bPIEJ!Te0hQuLfow(6#VbP3D&*pbA#XYTd92PgywOIh2l1X^=yp$QgEV|uuF~u}46iSc|kzM{N ztAn+8JDv-8;*M2DL~i_wN1+h4c`QYM+5E2bvNW#${H~<&urgzfD?|^PBwctAqP5$2 z=A*Vr!n(oJ);5!vr%HF@MoKfi)wOKqv-4f7{+nLtwX(Vk7-p^Q`T6$`_6Rn|=4EfE z;ZU-4_e}?JQATwn6jQ-9=punjAZJq6+#M4FZ(;w8>E7kRs{3ia~vM z1A|!kMhUknF*U*hn=dHX+?I}Y_brfHT;2D~3G3iWu_})i3mkgM-bbIWL~mL-<}aqc zNyV_bN-O`Td$BG4gPqbo=gdlG1a#vF+0Wasrc?=U|ZtBF@Uf$2RHixYQJMMjVQV761{~rdQIqQH@_u z8R<&p&Tqr!r%7AXJ`R|AiQkA#tKL=8`W~zABi!Jrrs>yVzp!F#VkWkFGH!D8_^(`P zd7F2bfPnA8nNZ9wVdEHuWR^}<+do+tY3%xIVErj&xu+4{mk6G;wZ28ru*<Xgb`pK8ZIhd}jDT_5*;+!c%^6gPD^s@%+w{ zCW}_AU`Tmyt!^Kferl8TK00CE;cRGK*mZ3DSB{0#x(h37aShbwE57Pj*^8jeX73A% zVJ}QEOk)f%_UyVAsj{g)u41{BPh0@NtGD94)6Y3bb2>cfPIQLvGJleZ@n*ClZ^KnP3 z;5M;SW9@$FwqK&l#}baU(~s2;ZSO1h$ zr>`FHRb_wy&O5l$9{n(LpsBWx{Q`@+P;*YTT3(Q;GId*$BeLddiCw_7-xNI1o4`6I znw;9dr5dqAczf1dthW&iXcXvd2rPf8GGK#EWsACOr(xY)*NkkhVo4_2ZH|AiuQ~?H zrK3X~j9pwmV{-}6)+zcD`i4XD%HR*a$$q%VOF8qtV=w3M_Xd6Wi?OQ#PG*8U>7atI z)hXeE06{1XnAz$w!FtG!OXzRc%N+~Qqq*#Qa&xrliDw>#8x(q=UT8;D>F$uKx_)t= z(hk4t^({vtco)YfdmzUVslIPoz1(z??ZJ=nicD-?ca#2QDZ=>6M=)i-F7g!9dQX>R)3L#4BJH(jfI3wdz4gOo=pcoF-+(FPv! zb5Mo7YcoZ%NS({G1@Btx%%&WFU8k|OV7Bg6V*^md~ArB-0bt3utpPEQvs5yc| z0hL$)CaI2`Yvq5K`f8shpfW&x@Z;0xF_F9^yP_vwVTc@VQFQdyF_Abut*V4=*fhqW zoHMH~JimWO5C=!fX>+u)EFh8COHsfPQ(dIB_vzER#9LX=N=zkNlFQI^W%4!Zs;sTp zHvpJ`FG-MSm?eaYXKb_Sgk7}_?8gmU=?(B+^Y|P?&F>w?UAAsAp0(_R z;5)e_JgxCp#@PYvBUEotPwv^R%ig~``K4QVSr5(bXyh(z_x+GSXRApZ*-=D!Fma#j z<~|HBU<8TkR^oTQc=N|{^Xbp2Ool4c;jq}#er1`*ba9*6tqgD|((*QB<*B@jCpw(@ z_rFUXXW?sm=6pyFw&SA696@J7dfG_9#@^Hdg&Jy;)cme;?(Y_ZF2rC^u8~y79$b~6 zio@bW)yDg;g457l5<>wGoZYIlX6ds}qo;lx>3e&VqE=|$72y3eZ+0KM-~W{A1QXbb zKf2kT(xfnYNG+S51&1!$E1s(+W)@pPp_-#)mvwm=TQ(}q4PXMxr}vi47PwtYio)(_ zrMuTR+=vWWw`apAwUBL$oiN8%ZftC6ya;2rVvqmMZ*WVAbR`NT2r$31< zoZ=tEFc*+cVNqlzL|hM;S+VP}rtbM^mG>^IqqWN*%=r$nUm;7H)CXp#G_?k{)C+FD z3EmNS1)Fb@Udv?9O+GR)4tvq6clpPPEzblkW{=n9Z`CPCn`?sn7|xxID2`KQjayW@ zQ}liDkC0A4ts6 zY~GWz@Kiw4j1<;?Y2o2Z7t_hO2gQZ;&LOuhm@a)_eW=5wJ-&W^)3==)X6CQ~Y?@HJ z^_A^fMJ0k3_1EO++b5f_n)7{*R@mgEL;701QMklf`vEk4k|aR_L(}*K@7--4f->?u z7VQeBXscEp`bN<(9OH}Yl-Sb+ezVZ1WGTlJQ+M4sE+4PCxf8rx&LiW}`gS}#jr&7q z3s^;k7Mpd}O35Ame0}DN`6hKIjakOE;f&wcLo;Gm=sFLNLR9W@&b?=enL-a7 z_t+X!&rijk5zGvgFFXG8OIH)75&72z0;MZN28M)?enSP44qeWeJU|dPXb=GmB9Q+j zAg7d^dN5E4H`#$sKxM$W)b@(WV{*f6&dT48iMWbk2`r=?d1j4uH&YmfmE?zHIqkMr z8P|*dSh0`AkNJ+7HSl=Shj93elPeD=ZEpH?n!@!XA9YrYB6wx$1P|1}I3IQd>;nr> ztqL_#HKsb17O*v8t~Q@9KQ^42INmM$d-Nrt-9#~4E`Kg;1z(;Jsli#-KVR}XiN%GD1{ zg==7fl>qg3HOz-PP_pw*(`X5TCGWybvt~6Huq=4D;dyJ+qPwUC#w=AJbK4P_;&l)VPD<=JGGP z7$T*}&t0X*Yh@*DX8J#E$|^gG6b7~6CTQDks%M`r?)gT_=F5CqE(IYD1jwRG5;A%X^E_#S!}5sFS10%P_cu3!<*ZU6O)%M})lHhdCk3D9`9KwUN^9SYZ7HP`WL z2L^=JUnc&t(ANk7l9$+j3;6gkyXIfMPS{?V{^mO-i#uHZU%jC)p@PCR1U#5t-}XaPV3D5*J7Jg`kx8XK9mm9z5!=el19<^gSJ4WUEH zlNua}{D4mMSI*`5zWfZcOu(O3CSpDa7{P0HzJ4!`fsMsT_Qzd*$nn?k01^7HPxhHI=9BQ*xbeD5+S?^J0$FTohPTF%r!!BQ^I0+L zuwfhFW8*?s4yqp1%@{JkV$hs0@x(>kNiUq^jS?>EMvlsjjiKW1p1veG8~A@yn+&O^@F3Rpa;CM|rjt0FA?3Xd7M zM6UB~Lo0Ee6#k>E=*w{;JvU*M2drI4Ibez+NQz2Z(}(I;85;5>aQnsW%rw1}O0j1OV`Q7e}<(%s{jNU!LhU;n`9yh6gi@Z z*~FymqC^`&rZ_3q@>ckmu)+HUJX%F|w)qnonW2xJJRC3GR*5Mh-co%vBcp^*pjI5% zJfLOw;P|m|G0tx_{%sz`;`kP5N(`ueHVZn-x2pa6-U9+|m@>M|U0hEbb%7*<+yI_* zfSso(YS~%KnR1IxRUS`f!xl|XgP<@JFrkGAr?q466nZu(8j)7MBXLVg)0T`UIpPPeRP7%EZb3HOx zWFId!F7DgLGtXXxGR1-Jh(7Fr(V?g-G z{WUy{=>+m8`yU*yrGxu3FPrxpPvc&wuMbr7BS>pTof7Fehn?X}o(>G0j}meNl5C`? z@X!b>UOg3gq~31~@0{iKLvWp=x8Y2G{$hU*taz_;e=`L%`My7jLQ10_;C~8qE8d7u zb`kb!Y8Gf7$EI0;&M4*CaWz^j++HMZt7lNCT123@EI>A|@U;!xs1WE>hc_aA%(yFY z8u!hsI`ZM#ZMTnY-liA04tktI)k*p?E`#94+_5VR+(iw=bD+WFCyZgnjTKC_pWs|;a7F2PMbUvY-c(uc%6{1 z@(uGlurSmGJ%d|kuZ=lq`bA2zx)-cCo_rvmM66G;dYO81nnT&d!nHhJY&VptUyaQT z@ShX2=d;yz3vgj;WIn!p@5c*KcQM!9SLmGZy>`~Rbp{P~KK9cPzno(!pT9fvc)bq~ zx3gx_qeWU}^m|Rb@T6H32!nc-ism=2HT<~-{A9#oQfZq}mws(ha+zN&-Dl zIZGnjvf8pmhw687`h=!Rz*O(<1&j($Wlwivd)R&!9mTOI<>E2DOSk6IcRpm&)+&{K zB1pB5X^AZpm;J=zu+}IUAd)p|C*Woa2*~$cD4qh=e^NQq<9D!rrc!72=&hO>xcR6+DP)3Z~~S%AjjJZi8Fo|&4%@BQ{zM}5`E#$`fO zn0Vm8mrN~6w^)f0s!q1$HDH}8!``GTC+x8V!;0Vpjj1oOsbA>EZDhK6mssC^n>?k8 z3~P;fdt)kXy=L6E8&yTW*aK-iVb5Ry2!+QJKjVbNF9@)&WflTz7)me}u;3XrJff5J zEVh!4CDV7DcmxPMX%E_XWq3`p*}`6~DWt`trT1>zCdN15c&ALzw5fjSmTH>v6U(cu zyzYnSH0xtBLt*SdNW1TXdQ3-mu_vHFoh<1#A8cfS??fIhip@K-1@oKRB6+D{r_PCF z&BGbf^R4=J7T;+k0(st)jEG@s^9}5&8TD8(2CSVwo3k`!n`fq}xd?c7SUo z)iz)+Pz(pwJZ8|-^w$`YAo>APLMdVx?NSlz+p%Eilgim-iy^}YOn=XN8uc$@bZP>> z{@@uL-|_ueN~xj?(=H4LEGS;~d?c1+5KiRtmmk~Sd>bRs8>_ZcwRY=B#G>nlSjoeA z%7onw-n_)2!;h{c%84x3YFG^EC&SE@Q!TMAol6%5JEd(LY2d*M z!OM?8zY@_$?h($i#}MUvkg#e@qK)hP!sBhYksaDB@6QjEnC+|YxzCO*=^y{lV1sqY zj}D>k36FavVqGofU)~hG9!q%}1DYnGcil7`FY>(cRJ-2q;Uua_dx_=GJ8{2cU#6^* z!oDOPsr8Y#IxKCTf2@2aU()@J_gffu&Y{ET7Md7maS`UElUo&cR3dN3ivJS!|B?y?Tf%w&h!|#Hhh)nYu}9(chz* z4vuIfa1vj%SRnD$F3iCO`-3mZdWjxFWqwAMmOEW{1LBIMw@hW2q7 zJBI@|cw(H0;j{e7|J~h1B;8k;MU^V=yz+GuzJ@+{K+BJA$xtTCnA_1_G?gAU1Q)?l zH^%x$BXcS*lV7H@v7gF@8&t7G{g#ufoo=5-mCX0OsyEaRRMij6u<{=qI*QG@%XP1F zgyCoy_SgA*7H&{XKvjlKs}yDI`{0ku!M)dicui9en75)r0i2@Z0w@|rw$KM+4r*L_ z@KxI6o>V`eTLyPNyv_#@(BrPeJtI|n#uOP%ZCbv{tM#^8isYesOi+#L#q@*Cz$R_!!gyVsJ7e5p z{7I2t$H?8uSK`UG8&zCQC61G_Og>qiM&+fPo~XU$gyNgkU-Uu~$CV z6#7sTP${ox{PC_W5TQs^#>p=BlBzmW*a?EzwMa(?RUv8xj@ZMn1T@4o#zgs{W74 zOFGdk!?5S**~vA8G4 z7+5Ce*or80D+KNA`vAX7hT&v>!pEnlWB#rO064U2*0+0`mYzr4cw)FBfac9O6>NRCg%kdiRZ zJSBgS{-l_sP4d}6MCq2Kxg4D}ku~;BuYS;QJRM}gO0$p8iG<0cP|Mfc*Asek4%dnV zi?koFUBOwl@a<{Z)%j6u3}n82+Y=-9ZCRAG2wyWVt2@ANJ{l8R2k8sRc*nSJs$1@K zzpZX~-8YgXUtSVoH92!P=lSP3xPZZ9ail5S>a>2xQwWw6Lwa=DV{y>dcsJMni=9;8L%wmOQUZB!B{>>u4 zVBRr*cT6w|NZ;{U;jd4&tIHl(#j%O=MiKvjr5-&4f}!zXJb!fRieZdSet0L$~HhKYu?#BG8#3lwzgdsJBX1jpA>FS9&&fADmayt(O4`z z4Q0t(v?Fp;JZ*1x1{&H?o?l$a>dN>`Ja)<=pV+a{FfOf$i^sQ--B&cP%{KUbfk`6b zJerGW*bv0<>t7zadL6b!FR5pt)p;+GN3(I0i8_YMTGCd2)eoI#V}}7KM^kCL+$`~i z{BD(3HQ%qPjKmxu|q{IhmpnpWyt%;N8fgRkm@6yq#-cUxE)*w@w1oa(&LeHy3$ zBDux>Io2*f#ii&-m&YFbfZdtR`#?C5(~y^P#*DEE1A~ynrH;8$9afY3oE3j#RHwEZ znt#$(K2851fR;?KW^en7s;aJ|$7L?9EgJn(|E{<9OY7r|^%py){;@ze9$TfU>0tRW zQ^rn52by|gf#k`!bP7FXWe?|gv*GU&5e7xurVUz+01GUH<{W(hx%4^g4<|SjR_#%y zk@suwfoIPJOdD58sTWY>k;%XDENm%+s#;@SxgYz987bwyFTz@1nmcQ#vi~mWyVZMx zKRtO;Tx_v)cX%rga(kw}s$6KaRL$LU{VTO0h@`Enox;!xyu8s%>)E1j%K7KG47=Cb zm%Z-bS2spG5Bx3V@0wKrk(;V_Fd@qiyA{@rGHrHIHcL}>fBmsn? z{}Bf102FA72&EmUy=dzGEkv;LTkP4BPeVS{3oqyY)u#Tw|7ha>{iR74Y`Zu<1qGRj z{s64UC;sqy*xvv<7-9FXK)e5k7e4qG%pibR z0{;OWvqy+PVB4sPc!Cf`Po0(I4I!p;isIH-LjMyzMb&Q|AiRXn3If z_vc@+k__0OL?O(9ZKD>Ei7<3ML&C*RzS!DlN{eyt_dxl7O%%w-MM69V0tz9dOn>&` zAFja@q|-!ZOf2>a3!BRUE^D?IavpE;U-iJTb5802+?eFlXFMrDEKlNPae`ZRx|u

    p^@p1CG1O)7PDY5k`u|Bl-fw&ko4oW{1%BnLPFM>(y#kFFjYSos9eM_io2Qw=ZPR@s4aA&fOE3KcoLKQK({J2c0QCgQUrcZ985aQXhI=dI^1+Juz2r7GYRSMx7#|(0!Fm>9ixOO?+g zcy}8db(cv{<@^9|d_7XttRo%qlzAz$Df4pJUem`j(EIi&=qhU+t-gdxnMP9gsLKxq z{1{t7OE+lRP#{u~>dmG>JCQ#^X%7cf7+=h%Zdi0|UkWk+8^P~%<~Q5g%(}Ch9SDa1 z)rq@8pb9%%7pP%dF1drOx2?JaL>>_0iNBc};<=k_1h_WjtLKt$=8|f&-@fyjFO_az zP-}3>`Hufgcwma;{$XuFb!f%>EOdN0YDsz?@ecXYCuOkwMh!22g>kK}x`CIbHS6CK zcuT($>4m!R8n4P-8-_7LIM}DAso%)^2N`C9&K|PIe@qGjk=oo*+g%9 zd7Ot*S!s5jZIQL!v(d3oqNb#%9hF-7?=C<@00@0^rX{9p@j6|%@>@ei!MLrDyIaq| zV&@Eip{uEB`qw*K;#f#;YU8ibm2D5Fqa`E*4#)nr_QF&m)P=wV;9bbv4>O9pC#QD< z9q!q)%g`urum``jiTQp&&@3NnZyxvhdflvyTv+M$!b3OXQLueiKirUTVTK&P(PU_rNF`JX zD|!zxjBg!CP7gD4wIwQ}jPOWKs`VHe1!tb$1)2oAz&MA%m+{BO9+L^%w+l(>H z+_OdeTuiW6W2*jk(*h-kSA$)uIMy8+F-Pq9uc{$Lj+U@$+E=$Sw@jVK+I^zCg3V)s zQhjKp!jcNPh1z)aQN%x%U3qQH$S7;(`G;Hm9V+j$A0@^*ejilk}%cB-T(bO#I;F8 z7mWQ^dH-K=ZvH3Jhu3!hSw7^%|4|?0hW~k8_CKy0|Ht)*|8^}BC!7g(KgZ&DQ4?76 zSk##6gNAnDdx4gO;DeravzznJNOlH0QK0>dtUjj>iIT}n=CG{wR`*iK64rZV;J$NE z6{>Q6D17&a1?VcElV%}78rNf02bfFsp<2rm#T&SYYm1#;U&V6&2INpRzD#27 zlWrsgsj;H)3@e3ysvy0jU=t9&u%~~!+w$-3qCH=ppGN^x{`i)VJb0hjp}Y1w_hvYp z5e&0Xj>lgjd=TD@9J%@%wrDvvfP4uk*_(7-;J?oR{s!>GEAfhU1@PApv;#)Uft!sQ zoSVCKrlqm?JA}z|&-{PPK+7n3NKYNf1peC7R1E?3_>O%k3Bz8%(!mNk+%h-j-0Vd_ zwxhIe`HArqilnrhYhY0UF5L1IexE7OPFh_-_KKm^TD#}Rkj*s==F#=Q5Lve@XBECV z9T&ngZP+BbdhdbyX$|c_sgn+4Pc(Au=RHJrhg&B5&ERWyi#FBXcOpr-ry^5_oK6k#=`OTG8KBR6#?p%I-s!jb-{`q zn%LF)d2?{kIItlr8oT;mDGn!V(fYAHy^PrY?Sgw;C*;W zh4s_MyU#UJ6sA)mE|30+*L+@P%EknN#BF|=oMc$Okq^sP5jwblULTYJ&Yu~&-XgrH zfpNG9*w+Y0d#Mp1F`-8;V~@rW?J?D4mcka{?8Jm7!k_Sajj^qw@DqVP(hh7OPaxNm z>y1x9t{sUy@`NjCg$jpt1-~#(`on<8`>)d=@&~o7aqaW8tU3%8nj-H4|J)K#u_9+E z@N=N810eMh)l_`XAJ*0;Jx)wzQUD#UoPKf3f4u>A>94hqvY+#Cp>>WbBhV4{+g(Xu zf8%}qSS0DPhcoth4kfIDA7xl*dZ2)=2oJG`w~i!>rRz?E{c`HJ0L{|j^3gKi!PGU9 z5)I}TFS5*gU+z|nfc6Se*B&^Cy{M6Gk^IUpW!MgqQFdCPnF&`p4 zQ;XRw!a(qwBs)#SR%IaT?tLWh5;-%OEV6IohtC^TkuSYA*fic;qr}P&ii%QPTtoA$ zrdnO?CG&We$lIwpmXc;lW?13q_nAAQSjTHR$Gd(3o#Zo=SGe`)9cQKGgFbVp<>+sS zbm4I9I2Rgpxq95koey1*x|l=OI%gbMG{;uU3St+4BqYuPwt5ep5O+myA36 zl9FP4wX5Oki;xya;*m7lqZ3g;JgMPsN75r!ipSd*r&qVF-gjx4Nvka>z0F=0?y>re zLnm%;?!UHuu+4U${&B1!vwmmSg`ewp42(xwX1OoVtqoaZD8Ejx^V?Q^j*`KbPTa+J zamLxjx>YmhG%!pw9wE|!f!fFp^w`h_{Jis+Ei^0RSbzs!Po#tUaCW~>aXj!R??!V3 z^hA<7zT6&XVNpQ=0%yQmxxfUPu2yaZe4d!X71ytgSPmO1s~} zns^TeGe=l2Mnd2|VBZpakEdw%Ua=(Rf(Nm5!N$!8fl|9#Hd&fnade;&+CF?UgO;*iUdkF3edjasO zF;27M6?&R_y8}UcO_XqXK?}Xeg6Rjnm*G-0VM>D6xzi#8chSA5t5j(*$7+1(GnAwr zMCVwK-?_2Bao0hJ#6Sv8VH)`DpN4iqz*`tJChphpDsa!Q$7K~o@X*)|Si+bJS8;2b zTW;1H|J*(Y2#NcYP96eF#5*k}?k`1MbDs2vYi@BWyyh`=^EJ6~vE0CCDp;)h%aysn zaN(5(Ksj$eXH&!6e|BwCz{babP5^Y{4)AJvg3By;FD48(^Z~N z!nV6?OSn=uoJf86;NX>~nKsbM*5!vyuK^**TYSD}U+S{Occ$t9A7Z?{#)&5X)B&a( zCwqSYZS;uH!VHn(#H9^k5x5kHsY3vs|M;0C3Vvb&dDMWaz`$R^%Z1b|bor6P(d)VW zaQk&j)4Q0Q>k$+Qvtxo=T#}M|GC)uy&2<|f4oUJr$6e#KvE6`by2Q(j3Fw-DYIfP) za3wP}*1y@T9UJ2T`GWsN-FpBvwY6=aYbPNI5Fqp-B~$@Hx}YM2-W9NbVhLSrAlN~& z=^X(JO#v0K16HsAp;`b%#fAu>C<+J>R6rp6u5i9{{_}r#?##V&XYS0+K*HYa?6p^a z%kw^OVuq!b=d%s<&>d_nyEA1fx!BBeRsO6e9I^2ABa9Df$qcd|OC)+JH2bc1Vu4gt z#K}WnByC6EUq{>&A)Ep>y@zYl-ZCu7^UV^}mET0FV9t>p1qmjxYSzapQj-5B%@r0^GlkF`gx& z7^Y*xn^|eD_u6Y`R`@Z%lCwKm5-1{ftU?a*&GyMA=F8G_2z5VlF146WKmV}8PBDHL zAI0|Yr^e9wZ)obIP-fPU!Fn!I(rwnVQF2JI7NFZrWxo$!h0-+57K&off&gvJq5z=D zZEZ(njxu66^~bV_nhBq z;4|xj&4NKn=8x4LgKS^TgbDT1cTfuwGQh!Rthm-pi4BR{^eMgT`wY;)b-FwGNoVG$ zq)4mHJ|I8!>S!2Hb-_0pxkQ1B(`%KcX0f8CvFca{bb*No{@w7%TAnn{YX}1Ul6XkJ z)3rP28XK^y^v3R_8lnP-79>yP>-AQC_bYh9 zas>+L+dN@(lu*SZBLL_Da50ZNt^>ct+vR0UAp!a&;M0QGl-hCi0Y6|jPWHhf*slwq zB@2}y>%vPZkSWkWmz&LBDD%W>r865+f6hFWqTK51`=X!r;cfD6ZOB-PQmNM77C=a= z#keG1`L*5|wfUM=B`a!2!@_iXz2*5OKi459zhLH;nW>E(N;s+8STW~+)N>%nvoBds zzF~5t-T!WEoH@_XQzV7rjEJ7OTC64-W7AbT?`uGtQcjx~xcZ2O*Fm&*N%~z!$^2qX zDBbZ4-|IU&Tb{Sv5z3nSWb=r$H|_p%tv33}UX%MFD<@bwcU$^KVYml;CD6dhpzK?& zL&Y;-d;I;z=xe=0xA)%r7><=ZaqpS$+rhi2IY;2B>oa=ag{Iljt66L7NG=T zH-+BZdgk`mp^AeIhu^*WI!K3p5VMmTPTJ&C1D{C`V_13-gkSuCEu6Rp5Cy|oUxEJ7 zGf;#g`=KC)q5y~@hJT&o9AvE842w$6NTBlxKQ;+NY#m~DH?A+p+K@*a+Ov+YGBOY% zL4Bf|yeuOgHj!MASM3TqBo|9K4Hk7X7M;li&^>0Avo6J$yA^Bo-}qHHXR+ zX*)^|BCe|GFzgW{}&4dZz#X4l7!1`}}+@&nMJwh^_I@KDooYw@7h-n~7 zDWR+^ess@>A9|EDKeIB*B@}6@VLnQ}6}G|k{boS<5+&}5j-Yt)xn=r8&}O+x^Wbfj zQw#OSZy~yDDv6kjlewJbJWZuG9_+nYtW+b>k5FX8 zVhFmde)tJ{1_zDv2ixK14c+yvaSb#5TTOFVIDi+cAZGSr6?+Iaj_{nVJQ+ z*zrm%fp-Sf1}UfR)T|>Tg3l$yxnaC>ywZH-9~eU!7=Hnmr}9+t@)c4dBEmk!Q`Vyy zR4%_O)N;taJ+Am5;1kt*sM*5qx(VMdC8bWekNv3i%(39vQ|;wu`Qc{_?;COLz6Who z+d6i)Sn}^VEquT#>b#X|@pE#u17vN$4<`KmJQ?p{dnCn4yd(|*(wm9F!e!o82c%7{ zcf}&586QO9AbKy+FL{S5eoW>f^yJ>@80)5G#nq@OX0gDxRO)&nF%b(GAKSX?Tqri| z*IM^K?b|GDr9}s|$Kbv}7P zs+(hBk$R1 zA4I0Nb!FHiZ%*NETa$)7HkTA~R_sa9FhWHZnvxIkl`w~|sjAXX!LmKoe^c_a-af!I z{o?%LBFdXGywFF6{*ra4R+g=DYDYfDSwfoo+z`Gn?6|=JAtGM(S2+|u17P*}D#GA+ z(JKY)LtB$JA(Vkp#7w;{`@G8QRVLIUUh+^t7g2{cp!I0x%X)tKfQvJajyWvUj;q+gN6Cm4f|*NuD!GjU4yYI zhw|}yU|8q_1VcN_62S&db$tMl0h!5L_OosRxA}5dsY7RM6TL6p2ZDoGdz*9wOi$3+ z`=ILuT)yCTfK(y4Pij=oxw8pvA`1*18|4pthp(62@5jvJOb5jjMZa9{un`85C|jem z=7+bI)Ez5<^)o7y^@d_=Yo4U~B`-Nus8O;ln^~H%Le@U06p- zlRlLNR};QJqGD&8mCT8`&%ur@iE?2#neSuB)y7tt>qBEhi?&v|B~#P(XOW3Dg7T3P ztw`_*rZxiJAyq{QIv$$kN%OqL6BbCL@Zk$13ct?0@U%OS@Q6jIOO8psP(OTAKzzQ$ z{nz@>*k$U*W^TN}x#A-zaKJAok}^+5m(YKSf5&bCoY|6yq-5&ylUB|gmAK0X7_DZR zLeKVMz6~lbUefvd|uO}Iv z3V=v`LfDGMC7qu|^{Wvd?QPw(Ia1G=@H4p~`2sflNXj5rtD(Kg%pBuO-?&Ay+KOSt zs#DjxB63zgOx|1gJf%0XkIAdm{8Avu-*oec$1&yQ)uGHVFdyTvcE87l3@#j#P5cmR zBS_KMs+b|E6pV}hq$zy*OGJkD(HD5mv34c-9;N9C-c1H9#8JM&_@naN(b0#qDE{eP zdQwYhP|`23-+EhXLg*2Hi#zSOiy__JYT!Uaq=jPW;@2=jj3Y4q&I^G)<_-=L_Uv~m z_4txztN%mve7nc(KHjaNqd_dDgo@s{kSgT&5(&w9Z%9W7XW<$K^4x*?gE(N>g_e6=r7(&fKDoK1&pLmo4?2(&Es9mGUJz8 zy0oJSuCg*fpVS7T>1X-W?ea+Y)ko{$pxZt^QIAHnrf<7ii*Z_g*hb6jGq3ew2`j{n z3{{O(l(^VVWuawF?^c+e#Js8y@~xzX{b?TqExouH3-m}y7{pvva8anQgP=&W#*jx> zlQeYZCa@nYU_hhV%0x>NU5QuP$!2L%8ez8ek@G^y$rpFF@?*UOjZH`LtxU1KJczu| z#k%eDBB>!Z&mWP>-|D?dnwVh5_6BD+D&=z7CeI!BzdErMN~{)upB1~jJL6N@y$cy- z9h8+wkcV0dLYS;+KuYDc#Kk>wj$kpEk!L0c_+0yBM7uf^wNt-BXhr_I9P0WdtR`#; zDsc+kiZS8$cEdw8ay zf^Wwp$zsJWaMu!Am{5ITC*|FVrVgoVo(WWIcEWVK4!!MN4(80B4>6flK=;g{`&nC4 zl#+sY5PNTn6N}MfityTTa0ol`Ct8W%IEcsR9>Q&VTXjTi1B@W$Njx z0(b7N?8Ckz$;m>a{?#d!XNf{4rd*};$M&&X&=N&$BWi{6#85~*YD1p>Qsz7(w33+5_muX{){lO8G z`3_t%=DQ_*3}a$-CiY!jCH>Bkfs;i0wXa`JFC14}2aSF)XMNUuV}61<)j=IK71fmf zq=RYojig`8A;Ywj`qnu(MO;w8Ak)Yk-9E0td2bssAEov)VhG`TDos`=_XsFL$ zu||MK1`0aJPl|-_^GPukTemOsaHoJkMjT)v1?MO@0wU_HI^;+mWpd34WjeQMX*x)I zcvkti?reR=j9+U4FfUtn8V0&?8Di9&X8kfWZ_Sgf!NPr0PbzTXrG9(dK0{a2M2~at zkLyZU`%HC;$5~Qjj{xn}#|=)TXGibt1z8|+Y$VJ;O5}z;z`3LM82}0-@F}P~+1w1# zK@3~LfBxu&*aW~PR1p?43oQPx4?;h71!G(ZR9JRx_+>y=*tO{#tSOK=wG+?<4gos9 z&(wzdSxtrjSix-;*6UT%Ok(p&SW3%_&!<4=v2i0KXaS8mw!W^D5Tk7)f&sxRebooJ zaNz}d$A(f4*Vn`5J0e5Px_hK0BkSe{mzpnvm(`Z@xjAaL3sKG*gtB9w-4+&DZpb_;^;0I~ddX)|H4B-|M5HElt-^-Ox^&P4v3wGsI$(3(7;4`rLGEXR zNPnVG_58`rH3d{HX%z((Z}&?eQ0zOrz&%DwR7Jp<&E%MOU1 z&GBqqTH;efoE2+UREi45F5|N)6|qKQ&fd)^LnY=UpHK#$ntRZ64iRuzhBqCpKIW-B z5?yvs*nG{@U0J{4UjBZT?J0}fe*T1V-YDZe+&$G*H?zi*Ec@PY;=f34by9p?V5N-7 z<~daRwfzTXvX6~2ji(Jb;3UdL&K;-Y}~e3d7{Xicns%2&SZni%rt8)iWfGtEPbhKQ zHj=qWRmRs)4#X+7zhRyquIj5fLf6N$UlQ_829k>Y@QQ}h4hLjb4j1iztO#WIR(!Nt zCJ({6afw9{A!-}0r9JS_0)WN~6JSwll;92?2NfwLU^rw3$ZO!7&glO;|tr^2(|jU+ldn z=zxqi61JaL$nH&Ka*T}>%wAkzmA)wYDnxFPx=c;AG`ZRLkykUGm5Sd8;0|Lku^DpD zKV91a*Dw+IC{ds-3rDBu`%WJy2n4QEp<*@t{fl2{-ZG%OU#cc;I}T6an76pP`iet@ z&&zM=D!vS`MH5J+0=^3>u0 zA@~n0N+1%#apJbtmVgf^z5MsFgr!?ob0u<$F`vl2yo&r~&*82G!uuT$E5FR4!0K3SZiko)(PU)QURGA_&hI+C)=yx014_?yEmf) zC;=3;83>E`dO$KlI$#5uM}&=k)@k$*a$b9TwgnK}{L5rAm`!NWesG|-5;xRc(_SCl zYYqhCY%8|NmD7J^3mtD@ff|#Z^BHB|)D0E@-=8|w$`dRhd)tUmJ>=n*xojowBNUu4 zmACG%7(P=Y4^%r?&e@gGDAzg*T6I9WEJ}M*XIn91(Na<4O-th6s>ko^x%c2+;}Yn+ zRix91HhWl_32UsY7JiT#hXkM3ctg*K?JoMaGf$2{qpxu%k^fe-E|BUH1Lou(v_hOdE6H`@jq?N>p?$>H9 zJ5@d3{b@bpS0K-J#tNM9AGMm6K5OZIur>hry?Of0m+hl94gvrS+0+Hqhq16ZO6!`W z&o6$`2z=2&z}Do$tfSq2nuM%BH#`_E zaXSYNxFQ6IM?L&V{djkk``5@DC_(NPx>I&OcDWvN53De%J#f}cK<@D+7gs#4i0~m* z$b9Gd^J(*n=MhPx1VPFmNja4RII|C2UaeEYhMBk(r#PZn*N3lkHeqoI$-_R^r%(|& z!WR9hKS9TxDXwoS`|x|z(w{3zW8-lQ0{4bSB#ZCV(ecS~=AUW~^1QCLL|Wc(ybIQDl>@qW`Bx3+4v^Xeiv6OK>pS2O-d4r$X8$bTMHNQU#-pYv@26 zX&Q$EAHaXYY%{pssKj2f``Y2)wLr{T+`oDK(qfT&GV41Uh}-h^19^ojzxEZ0PqJ2k z5`HP0pB^dF6`=z_Lz7|VWHOU@I&57lkciEy6TDv=)lhL^-wW(TLzbAsDPL}Y&l$y@ zTL9#_*4Wy@;m#l5hD!Yq(6vejhc8!d<{r-=<#zey+{ea_U2yEU*vEb9!@}us^m@Ru z#GU2p2J5Eh)RAn%j+?HQb%sh)PY~NP^71(_3N0*#;uFJq(1RT4wcJ-gzY^d_>19g&n<6eJsKDCST{9K+-Q<}F#uaA zVjzrbeJ2{M8Y;I6`rDe_D3<%W!KKd}EYIK9qoB6%8yOeypAHs(F~2n`87X>MA1$Dh zX%HAa|Gfq;kucFnpibkBZsb^c)!yBpFfrI~h65nk8bFjX@utF>!u3oRj%J=-Lc-24-=D=kMU82H7N8dh;#^qWHm`(JryJqkY%Jv^_(Hpv zArssXu*u=LjKHzqa8ZXIUa5AKY?;d_d8givUY1l!<|c7-d4PNM-XP*S3Umx6n^45} z#2Jwv=kI#TDkJwKR|*I%JdzMw6C0B7HZ*c^i{q4nsx1#!F4Nrv6QeY*P!NB#?QG&q zp#J+!I+e4Fb_dQ`1PMMAd}JCEyy}}B`+7o_1>!pWLW}47cz2jl{(@l-$LlMvVG|?R z9CnRcKZ4cId!4MDsjS!ujFsGv1c+SaY<^GjcE|T<>&}86Gt$#q!_KW&* z_v4=4N)i{j%rCrque_qniFsmk^DSiRCwBbD1SZSov(`NJk(v?b(zqkOXb?^$oN!Ab z|A$Bs_ZMMnrc55Y$?222BukJ!d;Uy9Nd4R$D=Y70>1oFY8!pvfrk|yp&c4F}Whh*O zZILzJK27`+TkNGJ^r654vw;y@phQ%-(^m347Sv5*c2k%7Jht9}+$h`LB4NMIS%<$~;_xjSC6>nZ&xzalv zp^%lokV^LGTW=egmRusyFn{l<9)|;?fdu#x&%SYB5^hcR0I~Efx-W3~VlH{_l#;mO z_3Y3DnmXcl=SRc0$|oBu$3y38(^UGdVctR;+Cs&mt0(#}HstoAFY7)QvOWI$&1r*a zu5Dr9G6(FAZTb}(Cl9P1S}u~slu?*^3TJKNO;eoy2))!E5p@QRh*LJ=UA_{C&d zdYYU#e;x%pLC$g?D09aYoEdO&(p#KKU4lhBvSc#}FX~B8npEX)4gt^%)YIm$k{v%*{YY zc!|~4k`vQs81Z+7Xs-=WB_U?yZ^N2z#k!@nHLP?#ulOrDCGYU2-$@~^yeDW>Az~o4 zWXn%08_A*9e`3CxG7}lAA5)EmQjcLcziX$q-aVwcMi~O@s99Z`$Hj)EY0u%;h*|!o z4M*ut#G;%$ca@nPf0Wd!RKfmjX}ZXhCd&m@SD@s#JqcM1D}JRJXc*+Q9E@W=UK5n? z{oO}Pj2#H))nC|rVOIV^|AJ(5< zjm^dH10^L-JPH*_^u`TpYuZ-bX8N$2W3nW(1{}NU`Z$+Vb%m&%;d08Ai{EFtcX<>& zo}b4A>2Z>5#C;7bGkemHQY#hR1Ox}x81z%$Tw6FGco_7lc*iwOq+`E8xbo>vdp{=^ znJh`1{BX%?!xx6~+avc2lzew9HFesR9Q|Wy+{G0CXZS6_Sw;hj`16OdHb=;s(bq$3 z7RD7v1^tY!$qIjsSXl5D_`j#960_7gzWqz-VkG^>@}XY4?4VlN_jSN6Zd;M|_O%;} z84#S%>@~&*oU*PQJZ7?VBgJw?mhn%IH$$9F4EaRzJWh47?ti_pQOvUHEYKm#pO_B! zw9zW-n?w1A1hm7?RoJY6q!}{#zARAE+!ps*!^V}p?mak=Y8yVr+BipXSBz3O%PG%i zU!KlezOqUkE=BOw90f&BQ`zOo&CT}K?@;{fHw0akh)0$+B(rx$Qp*^v$3yaDYAazT zU=5{ZjFW$DwOnTL@a+G7=wpMpjknY^r6hvm08&%HLphTCt(Wof?rUWbpYBE zsMurwBxiw1hpiz?-U~b?@t3Q|H0@k=N|Za>Oo2}CT%k2O&!1W`ywkVe|B4rE;*^f%p;?_C2YKlhbEr{fJi=t)~Eoaan-(oIjmm&G* zJvE&;9N7_C)G&%ykq{>Ft3bNi@!tRL%|?iVijg@n3A1DpaCH8MIv^1Ewl93Xndeg9 zkPpWh4(Qtm8sAFQyubo?SdIb1kTK}XRTgqIT|nISX7CuH%3t1r_~j_KDJ@H^A%5lC ztdF6y=Kt~0Jnka?d|?Tz32!8<-_&ZzVuTi`>16cg2}?PT$Ki<2(J9MSHT zXB~>@kQ^W!Z+(5II~1E2GP1!dkIJtYn51$7Zhv#zKW3x6>-LT&qn;xR_xw}%?u@8g zD8bEe$?uQMz4eQC#S2*l_E!dCXvIHkF*pGcY%#Qd_oY*da!-=IqoETs&Ir1(=s=Xr z!zWz8+gz$1#!x=A2om`)K2Z1i-e9Q_-r2&m4()L+LVFPQt&INQFI6^6i@42#C0vPU z7eaXC#00Ns{EL_`%W?(t!|q3ZddNG$KAQ6IVO=rCh4KC5=})~;SaMY~=`7!#zn2W) z592#xbf~IwQs;C&$kzCj@5HQQjB?F@cJ@--bbML z!=N=+|H6wFB+RM@lP(p_LR8ASNWlvk*SU8l_Wcf0)? zzlbccg80S7c4K)85YB4l&BpG|)x1(!S6QWBn+op(Ey+uDpqIUbk05%#Gz>h=&Y_%Z zA6k|OHX8*b&oKKQSwa*3FPH8(Z0bYDQYCCag-r&imDv9GuZ-R+CK{9~Az*#HLd2-7 zQ(g0|a=ZxmwgLPU>bd>s``jPI4p_*_p*=Xm4WafNR^bsPHix#5avf!+UQ+xDl8-N( zH}1&4zi|HX;d0qr$mUnBx^G)m{_yw@Ht>cS1YWTg zKVx6@VO*TlKaEz$19kpSBkAV(TD11SC8(9 zS{xsmyj;f;fB`Rr3sVC6Pd)yhMo7)_0AZe1jsZ}*rBCBlIXq1^{JD9K0>qUipank1 z`F+dJ{|j-4NMDQ75LmKAz%lR5cqtK#;g^{Z7}W<@HtOe*T&Jfok42a z(Yugdu`0MNL~ozIDzdR(JK(Yjt7Fcpd%Y!m22OHJJqyYQwN&?(qsH8lV?u45bR5+z zrex3hcQfLW8=t4zH#_`WK6qkO&r1p|)4|#9E@pM9v|NH*C(TWIszYYUd-=7|!}VWa zVJ5P6$9$9nWT@5-Tne0~2HW&QXNIqL);^dE#^xzi|I`u=jDN2R0Ish83)KvdRnVoJ ze_j9oEvovzLj7bkc;MmAPGB01$E1gNa&X42GUsO! z+ATJ7`dKg?4otnx!j0QNu`YQrA8Ah~WI|uQHlx2ldSYq90@UhI^shvvuuCvZk`3~y z&o{~D-FiE$_sdYu@8tcn31MFVQi9MKsR8mp2ngT_>&^J&*$fwhk4D}uCx3(0WED4k zAG_0f+z-F1@L+m{pax_%fgXMWUC8yz8ARm4NA{}&rbi%EDG&OE&H55G78 z*zHK#Qbg$Jt8Q&SsT$-IlfUk0HMdHk`e4VW9R>zheSxTfkpNsaVrvOH3F?|;TfVFe ztbrI$GYreDz%yUqz>>4^y(n@qi`xv4wXh8ilc9yFtOkenG-#D8B$leBb@-xExH{*J zwZ7gHCHb(vvR7F!Q&*X$9iGt2F<^mYOP7WwW+i9k(J3M{`NTG#5_oeUmH9jW2Q5!hRoVuN1v4n9y1P}H>ML@p@r0>f>fdS z%y!j`#lC*}bQa-HKfmyB3aWMUa_*r1NW{_Lv3BvxfoJwxuV1s>6Yg-wK=!tc_!?Ca zi)Zpr>1>ANfmU#VoPlp8PUjIVvY_+>oXwU__fs#IgkocKL!BBV-mEI0iHR?J zfb;u#@tLS0Q}d~;i;_p5812izXv02 zM)7NAk#FwfN`2?QXuEX}>M!Z0VY)vo5UPygAHmz2XXNHPgP*~%vlTMQL97vp#pJL+ zjKlIgbBJ++=Sz9#j_ZRkec@iI>3G9ykEK%&nQ$ni{=`xL3lGyIMu#o2Ig~(>PP{4W zBs%Yul7dYjtQcGu{psD)p%(9SxV@yRa)B#KKBcdc)zu1eP*JhbkB3=CGKzLW z$2WBUK(saOIbGMj<|f#%tY)GV;2<2f`-lJPFDpi_ZP?2k zcgHj11-xrAcF8R}hC+Q{!>*f7gfw4vt~HYZ7BrO5pDX{%1=jvL>Q8 z32AAvwxc(T+^ATpQvtd5C&rW-a7h4b1ⅇ-gFH8TV*8hH1xay4go(xN8P|ShEmz!j9Zwo#$2& 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

    pVvj>Jkhp^YgyAm@;!$`_`?nWg| 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 ae*Y-P{iA&0ALYh>l!yPb{Qm{W?0*2hkP~45 diff --git a/docs/files/loading-spinner-not-needed.gif b/docs/files/loading-spinner-not-needed.gif deleted file mode 100644 index b68f05f18ef3e0a8125601d614a101e9ec43b247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223251 zcmeF&S6CB!zwrH;NtsCj2ME15R6#)lg3^Qp0@B2Q2o}_cpfoX5LD4lK0V1d?Dj+Co zXo}c^fFhzR6crUEQUqO=ps1j(WmHrI|H3wojh9zE^UZgDL;~=JQ|f z@9XTc`3vX={s8_tmRMN)D%kfcFZb7Pdw*r_{FRdYYkT6a*loXJqJM4X{fb;ay>`uX z`09z!kRL09zXt{W^jrSJ+v|s?=Y*T6Iz28L(IB8 zee=d-d)v3pj`w$NKfT*EaPQv0{d6b#q?~7htqw%Q$vq` zK6^Ux{Mq-H&p#_)eo(%AGprm|{^v2QeD!L0WaRamw0 zeLFeZ*t^O1qmv)sPyYRJ^3z|Fs=p^cf13QFn)>>A>g$)u@qhX`{$*nP>-X`m-~QeB zKcC~Xeg8H-@qK*q-%WiVpZf9bpC-Ql)6XBXP5+$ur^%oHZgP5ZwyFQ`Ca0(V-Sp)2 zY`>=dUz(Yo{_oE8U$kJKuvOk{u8+e)CIOti9!!4{0n+TZ?LQaCKbHxB%m959BR`q6 zO^9gCkL;3FbmXJv0p))6mA4A@7RNv9s;|29JLX+r3*W5qK+;Xqn zzv1+Qs>D=HY zUPpm(;Fa@F8e;qEHr&5*;m@o5*Y{2YUcLDIdgj;n&+lKo^zsj!Kr;zymJN4^wH9pb zZmxfQM`9j$GU(dnH}^{yC%ovs*6^-J>Ro8EqNQ=HuXfeBjSpIyJ`BpX+&{VE`jx-_ zY)<{~;=%Q+pI*v^w7J2p&7WU)9a*sHVe7T8?-W&mr-E;^eETreknr;1jq5)?DLZBg z=dQfj`t$2(-?>daH*ZY+P`$o?YULj{e@#t%{qVBqk3atPFMw>V#ECkwN&#Y3tIVM< z8C42VU+ZBJBRqCES8r?WaGp`d=x{!kXZ=cSQ4;%VpY`e5R|U3LMqd>&Z(G0K@Ax?O z^#SL%wXYAle;{8l4FGyb&Z zt|XG$DTALs&*%rB>uM`<&04mtE<0Z#2g;ZQAxGQKUoKd14tZ_ubs)_?wk$7n-B#_H zT^t{=0gM3m0FzdfZF(|^@wQm*n-b5ySfmkGao%cyjb?P@(|$wdD9}L^;!>fy3BC7& zPsRHXvTkH-NUlyK9^z}R=G2~hx#-HV^E%mjHT#S+_@N3@>&W9dfJ3564vDNA?0nk& zqI`8%JJ*Y}D2wVj+FM3L;=S5SO|7qQyBu&`(>e zfi|ToU)T9-xoT*OaQHkM-x&Gsss7d7<15O#qPSLQqOlGV)K*DF0t)?>un-VYKAomfub9j$|wR#}(-d>s`Eq3(W3-j7a5e zpJQG2fazGb21v2v6nYWT=$tNs!zfQ+9F|}vZ?ZJP6jtVu=Lp8#<0g;h$JjoccnBow z>Are%CIA;?-9M+*DxF7<5Y?d?_$k0P6d!K_wl*}pYzmg+E2@S18K|IfA$B#byAJ%` zfzKm`3Und^)lMnqa>6z8%Evx#rYAgmJ+8E#Icq1F$!J-nZQ^1zuU|;m$hQNF z_@+6vLenoxQK!fiuoec;Y;l~BDc@@@Ge*|xKm)u>DD7#N!O{pZSMFv9Y ze)+~`wL&dN99?hjXN}t53GM&1F0JbpOZQd5OA<4&{lgQzhf7?R;hQN8%YMxk9@*K& ze@<|%)pD1~5OanA@kYG}3!M<>_ZWdXDu?=|d6Z@?GKA)`sFFp-9F`QS_a-|j^3pIf zaBv++srcvI%dbF9eeXZITQvFGM3pT{~_=VM!{-)_0&qHj(qa+agp<@)$? zMiF9bKGUvWnugF4`Po90WJewbrfdKWC{E~Rhaox9ufRdCHey9Z-o5uM(qV0}EusRA zi*PkdM|`~o5ZN92aVPB@q^?o0`1J#>=IY+VCI-W-g0(@%wpl_N1&VbI>ci_ea;U|j z0#CRL5aXrC>>i_iw8nbW0-wtx9R{u%$c6c}z|svEziOg$XUL8E!ZN3U3hdLM?Cr~*1^XZ2=OCOR8?4hrVf z{tB~)bIv7bx7~5T!TIU3*Y%SV>)0lhc5iuqXvJ1y`Zsk9$B!K(cNPKpCSpSe)^(Te zOQ-h?2TR z)=?`|7D`}<)B_)~lGS$iGqQJK@Mr=EL?oXqVh|RHpOTlza~2$wqG63dU{-60;p?Xl zjeaeb6r+o{41F@gy35K-lHkU*f8@#~oa-AVL$cv+pMQyOn?q_|k;-)@OqL-z86ky9 zL4q^!dfy}7^y43ozrU_`yyPJw`7PAVkjKR9qFK72}Tb5+D(8x*ic{5~nGE$QPqBT{7^Q6BW|#8Jd9 zMWZf&Q>k&dRy6W<0d9iMTBib++f0tFT-kg5eG{B^Cq^8Gm{)6h0hG23N8Wxpt%Cn-~$;;#xSbYH-D;J>lhOz$nse2G>uHi0nLDtk-!otLP^RV%J&>1ZB{Hl#YCpV z(7reRGwb_(81hgD45YP18mJ(ycW!MFL}u~F_&^c~8ZS-!OiXdk!@5N!a+*Gdbshe+#jKpW3JO(=A&3AN+`jey!oCR{}J zq?^*xF+hz8s>^{Dwctq+$Qa!`-Vg4~2>)S4U|X&5Q;;;GS8jzF_jv0KI0DZUJh27{TW|u{t3NYY9rhJk|DJghphnfU32Eb?0Q0>TGXfyCPaV2q> zvamMp%MtXRGZN1Q@>yF0qc@0HJ{rnMNJ7bwl9O0SF}i1?6GOp7;y4f+DxOIP3B&Lw zG9gHw&*Op*V<1Zz5XmD~;Xq&pcx7=+(l?;3ME$ZP&w&flHp6r&XoG_B7(hZnQ#r>H z1MC|k_7nrpzm@qA8Lczus_zYZT-)i%=EoM?ianqJZTkS%F%qf_c3^_*6{Hv?HC4XD zgcYoaiuOFJevK8ougM<{ff?v38zy8SgBGzMEolbPG_vvQ@s$;HZHaGgv3WTPlbN8t z1c>Ls7ZHL>v3jw>YiSc{BS5Ap0`86pH{>EP-_8mLAOT`q1^sP}CMx}zl2hbEG`<3` z#34&QWGjdCc|eMiO=Kg1;ZWTWV_})EeU^DEzS$bvXUl@r72q}B;9@xtQ3S4034@gd z)+o3UwQt90K5rvzj;I^R9iFW&+_^dhVbk)^10*J}gC!)lfn48RffZrh#lACfKg}w+ z)S{#6=U)5ImxCGrsLS_pkO5FV6;ec4Fi9;#qzBf7t?S5#Ff>VVL|c{$1KfC&+AXE$ zXs>br@@d1TXv4todDWPPE5tfudWe$D1Yj1Bj3K>m1JrYnR7JIx;2aeNZ*PN#b=T;R zxE@p4$McW6O2M-~lU!x1J)OY_4j3tgJ1yvGXvJWFfG=U&NkF2COkjeh7&wy)8Yd?X zUIw!3G{jP1ehooeQe!1; z)P|L^*qgQkSk9DyZChzXp64Pot{qDsd^J;SISD+;B#)G+=g0vA7XUg$sXw#Lh6@#F zXHDj08Jfa#xIhvhGu#ZXijAK8Uc+)V__U6FXLR@X#TAsxfc>p3#%Ft?w8mBm8Yqvt zsvrYZ#WmS!4XhEeM;;)A>t*|19wTi~kOC9|hB!HOtH_X;ufV7j`AJ(80))s;7s&OV zmIwe1`oVwQ*67AyU0#+!HDn=$%#`8ZwQ6P;1ZLF)x>8COAZaSHP(tfEs(wXDUN;#I zVQ{*9_Kpj%bAeAfX9#T+eH%L>*XQpd@Y6o#sx<{f`g?T^7jauWdy^TM~SBi{R!w5Q+iz4E#nkrTSPA<}lF{X?A9O^4chJ@9}`p@8oj{ zAgzR!k0W!o!Ee`rUB|RIORlM%M|+q2F*FM5@jxxUYrGrU-4wlaJ+h0WCgv4&)?qn5 z&WT*qIUDG*AsjAEu;nJYBpjf!0GTtq^GCQ=9l2!bDuO93iRU?&iMDc!2O;>Bl6sK` zoGb!5^#p?u=y@hys3NB_Pi%yj&sP9*2DQ4Gu-DinKR5J*jEr(+wnC>FJBgHYw81Xk z(^di4+wN84-*Hu*AbBkvtb|(bT?rcBq>F)puPcw1sejd6T!SM!xPYeg0){t~cRHA< zu0ZwVh;iuCQT5^{9NZkZ*qn3Q5>8{Dcq2lH0BD3kkdh230b3y`WZqd;(P&Tvu5fG3 zkaZb2?hBi6n0Z3E80(qL%p{t^fxGR(3o#0oP1}d4NjxlZ;OQ4iGVs9R8~J2kvZ*pM z==37y1ltl1Ao5$sc)+=_gW2hJk8RLY`9UpyGr5f}Qi8jeKyxLFEHQAqEW`6qbK#%O zPzBxT+yy2NGU0*R@)Hg$C`IOfV_p;a!6t6Y3>KDQr-pIwDaelQ?a)z&{-1NXI&LW`tFVJ_S=sr7Tq z4TBL^@*@gKdcl+n+%a+`DgB!{NSHbNAk(fT3te+%o2%?5#UXAm6uka~LX>l?CBW1D zt+}=Y18LaQ+d+bISKGA~ZB^Xb(~C5eFh(XO4R?t#_CR$`S0Mpm@K6W<)L;mAekHCzyxTjr1ky2*L~p5Qte76a$z2=8@QRU z9^4(i5|NSzv$sB>*B0uW7k#`AdBKWwPYAy)fs~%^LbhO z1JPA~htCBf&0olj72td(DB{7e1e}L~$De7pa*?xpK?^y!@O-%ldo+ep*HyC(F(3~; zq#M_8K@GgW0gGJSuOiH6e?qnjEnXuT}SfL|-c_sI+UYw}Z}4 zf4N9wLHDbfZcKTEL!2jyudULKGDZSS(SSSMYV;a|kpR)w{M=sZ)xNurc;Udjed!k2 zDl~@!Zk?l{!TP+mmQGz^(sU}a_g=4VQ~7DycSp?vet5%Z@pQh8SZCFfXEt!ek+!~XcwUFe^)5QBnjyKyR^&e(zechu zRrde(FYU}q_PPr!JUFw$Jm&`AsgUtq)) zYo+m$mEzJvueVn0DjZd#u9;Zrs#9qqiS3xP+&%eIQ9VIX^XrZH?rGCwub~

    uL#! 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

    v=DwPtV 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�Uud_TSuTsakwFiA4@mCd{UtJ4 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%0AOw8?BKj+n5i$rs)&mX zjU^Kv#Iekli6i;`hArWfuQaq=p*do`%8+ptU9gkLWE&Fki2$~d4acQ?{}bzyV`XPJ zRTz1M$fog3zR3!+W-vwS>A)f}et1J@rRXFDwNO_!H1#3h#(Ek1O4%CF+$%#qIMeo~ z_-EGCI)Ad51{!vxB~%NTDj|^oL_^zDd?i4J{-B9n(wl34YlJPKF|AhW#b$*XiI-6H z81uqam{2LHvPP0S7zE|+X&Li)V2YvA+R~!{o-&Q~FN$P;^%s|J8VGGkhi9k2h54=5 zbjvZsIKs@~LY3cZKV=b8@+>DXA)T)ZXv831XIQuLmnuGHZYbYwEy}|WZ6UFRUCY&K zZ>mtLtRlPfCRUM8KUQn12TN^3pSV7Dh=uMoOJf8vnC&D<@BINoMep}n=+U8>lPkGE z#yRqCGhxD^#h~3e-1&(Djf&+OT2+iJ;6}QdPdY0&Hl^}#?|F~`8pa>vndoR6hRL*X zZ^for#XY6ab5FA+)m__#PRtfWy^;oUi&(GAy%onQVQ|bb;ZhWj)&FtiVKKP<=1>F#FldgiQ5VI*izhZ| za(1jk;c>Z|qCw#h8@{+nt&0p1h3+c{jTer&s?pJqKKPx(f$96q=il%=DICE8Q1SA} z*gkbAk9i<)+1=L0c9kSzo^iy?n`J8pSoh|s!O2zOitPOA$< zW{CttMY+kUNrvP~k!C3z!lNq9`Ur%pG}wS9idj? zH)zfRLEK|nk~NVMHeLo1jePj~or;yDz|gO(!5O1E8Zku6v66+^2}2+tXA~e@H%yuU#+(lf9mT9#1ZasV z@V$GX*dVBqJgc97zfG_@3OOCD32qVLVwL5 zVx&F9rYG!UFZazAhOr4f0AZxel^~ZrNs`ubtakuV>|OAnZ2exIJ67ymoVppyh0=LY zkXe8{GpJ`9-^dT8hM3mDNEXdfkr8Ay>9TW@>uxVs_CWKc#B`Bdp#?-Y5hGB4B}e7IzR7L#2Uf`fgidnvl!pPDfAG>yc|lPP zz%03Rq|pu|l8`cH!Ei3znuy}moE`64Z{=hX#^A+E-!QmYe}lHwc%Ii95ECwAH5msH z>yF{S?Is!8gwwJ##Q;Hk$bgF>@LZ-P#3ll?JGtSs3w4*;$=H|Rv)9KqM*-)ksE`BQ znBLbzCWfL6l{-KP8#x5*RhAw%3i4h@2N}W^1`Qnc1J?n_x^Rzi2ZxJSNL@lW_dCl# zxM__=J^nH|LKg5>7kXF>r%T}$bl0?qm`2`!C3|kFWQECWLwR1IK4{Hs-su!*G207| z!Ume~&}kmXST`_~I4vPW(jZU*u%*kJ*~qvFaFMEdz6?Lq)#52`8@|!v$p)o`=waGn zB9U}d0%u6!Ga_P$^CB8CSi09IA(ICMbG8kK)F8p@wiq{q7=>cm9wLfSqyZoY$lwOF z0#J|1&S_p+U}(dodv&sgeLdxvKpI*hpenK%XLt<;97rh--u%YJXBaueO_U1U`4a=x1inS?&{o2#314kCbXgx@LGCCz-D1__(E~0KaN-iM>^arB?GVt{%Mv)C{9A>ZB=vFR)%fYpV!;MOk zKc=Pd$2xj6Okcu@pK}h@4}mvFHH06B_i{>k6Nq6Gpv;5PgxMdNz^M?`gLj~vMc4G- zx9Jt(cY2|MD)+oh^sf2!;fn{)QkJbACTy;B&5&&eOW-D*CWQ+rM=u3TOOarSiwYe& zH$^yT;g1LEy1*nQPNCx6eY_V<8;Zp3xn5elK7}0WAKGPGvKxuD3b|t7`&U4bX63XC z4o_;^!D}I38_=t1xv|<(wc1^QeLi4sLvbPIb|Qe6lxoic88Xkse4xodTmfSUKdW3{ z=9433tnr-0-CSyYurD^N%qsFYwuG3*k-O!9V0v8`KtE4GgLz(%7*3sYzf*-NDJb8v z5ec3%pN2^OR0nnXKm3sb9fC7eYh}>Zg^`_0L6#J6JnCv}$tcjx2p9boPDlLj!QtFa zHXB)T6h?EYAUPIdtoyD(SD52$F^;X_Kwph9q4ZwD(#S#8z(e${$L5`na*4>bej7Me z9e~m$NIDH7a8I*k+jDuYaq}ltYq@(kPzXx7TBBMa>6R>X4E*Ydmk=($*(Q)7cdFer zW>|1BAqA%&KPp$_e1yT+G;+ z^3Mwxf^hTmgs}WcKox-Y3Rxs>fPlSAtAyCosJiQJ_n^X9_@CIIa7@xXpiYAnw-%nb zcviEoF^_s}pA2+b%P?)}^4*G(%3Px}$TjptEiUx;t6TUObh7!9>TU=C4^NYCUvmr? z5A(e~J)T}X5jM0uUQ;7PsVDsA08_H|ND(zB>7oG{hu%WuZmfLRa}WxK=Bq-x0BEi%LuwMh+7S1!XL3?bi{S`a4K56sSJ_pyoGN{fv!I?FGDBAI#rAyK@0Fx*F-fzL?GRxCkgoU+>I@WC{v3 zoTj*1g&Z2R;}C`<0~9&fm+P=rK#!#;eM`u7s14q@VsKO8z3vw;GG^bySy0}u=ldl# zXJ;?EO}`!vfil*USFUT2_cl##mTK`vLO3_9YMByk)&1#kLdM^dD;AZ#ZZs;hp?zdx z30Ls_ditvCEmZQ`V0vC`;Dzj%!zI!`m#_iloy6ash+nn4Ugg;|(X^&`ugwz|<$dJn z1q{OLYvuTa%D^DAO=Nrb=>x!u6V!<{M^wJvW z_%nV#a1YOp&gAyaXa7Cc2gnwIaA6So_}iMY{S}LIXGpSVrUqmZ#Xp?A-0qW;f#%P; zHK&aY6$e9}e*4N&lupY#;V1Og**qv7o(7_M1bLix*!aDk^#WFM@dzDyxxWu$6xrXp z2-pT{ou#U;&}HSokvXR&+P-t8@+d{lSgHO=6<=1g`N)7_Q)qPKWhprBR|Cr z9MW5vs~a`f&n`%LI9kvYU+Wrn(tokLbaSb=_;4f3S$-VrnC~?GYj?^w5rh*^h{o}= zG6;+~Yckn&mvDM#vEtTCbE+FpO(O=OZQt{6ge!v0vL??2i8LGeE*wA#Nd{ICCV}3k z*8k3&|L~+*efi1T0i(w;9$3P4wtSv%6{_Wjq5hN%mAl3Nl3^^3FgtWtzm-U=EvZKJ ze3{JxIUCWD>(QxOFV+{H7gZp}%!gGznNoWrm;Jm>ZA~SAt z7kuKoeUD(vs`w;U16|1zsh`}U8;EBU3s2FSjV4q~Iz5l?oKI9XBs!Z&0-P0MO^su9 zvN){O+uK=0g>qHSk)q(|*@bu`vO~6l4NuawB6GLH+HIF#b_7}R_lF&>*>1FC)rC=J zKF{N=@7ufZKIz-2zjsV1kJ#jLfy!Cn@U1BQ1;Hn2{CHP^QDd*w z!{$YCT_M!zIYeBbboFi!h!EAVC98XYXYF%kdxcYIx?c*VY*@&fL3p|UcQz93VzkLt?wn|;TB+GKq;jS_c z@jzM&mG^aRi+K`iv-6B!B13*;fycDKldXe2!WB zPx?ViQqgsIz5K}@9;7aMLKN?|D4Nqc!xN}g*bA7Z`<&=lO<_>(kaFQ7f1~>e7IT$O zZTShg1~jYo9humi|1TX_%tvit-_+6^Z)}i2ZEHVhiJnmQ`-at+O~Pb~^DU8}bIr@? z@z6D(9*jeCoVB?g=ZXBGzUR)&e3?ZK&{12g(ZPi7zrixf&*2Q2lO;Z> zhOi~2`?bFWt1%^lEa@APMf5+4zSI(lopjKIgCUS*#9YZe^lPWjiYkHH>BgmABH)kn z>N&*B$vPi1L$7NTj+IvI@!*r({71f7!VsR35AzdZ2Qu*1l-RreLab&B88Q>q0N0O} z_Z6grn2Rc~vPeh1ZzMbMb2gR`QkIOB z1uFucg`Dm%0}7yT*HgHAT`e(e2uphWZB^)Y)8e(mbevdLa7co!=n!mnR~jO$hVxhCEwajF9Asj}$XB`%Y(nzCuV*)okX$x1)d^l|q$%E( zD3(?@WeR&(w(79_=QXEv)9gd}K^J%kk6pLwQdig$mpbC3y*hYxbV*S?GmGTg=u0%5 zP)W2hJ}v1{A5Meu#fd6)v!FSewV2a&E0^dc#ry&lvNhfBf_Z1&5<(?dtsxGwZHO9S z>K3IRW~7=i>T80}6cSJlF^tCt5yB-;2VV`%V(ocWu)KIHz)FMGe^s6X%MP7Z4W&%M z6d@pu#1JW6a+@9D#BjV<>jOW_mLX=0rk4$h1b2?`wdF^qwPCv zi_45!zcr6}#f-r_0u8T(-rZJ@nD*E%}j(G~BqSk!2iyhNQRn`GI7G z<1G3VeX`;H-U~gA*lT2Zjs-__=2{;%`B_n1VW`n%Em5_%{7(lj%Fz7~R``r%chuM2 zNTKLh&zNXcZ&IC!`VR5etGhfVZA^Nenjhb;H?uYiGU1HNEczA4h6%H@p7n0VTfA>9 zV0M>I_928;UnYs*AGz?V{8zhV{XP^5H9TrIELif?dM<6lr6I~-raK{Mo8s!&KQ+3u zu`6fCe~-^%9(5pwldtY9%Zsv5^}Xa1m{m~cW2EAs%j-QIl4qIkZCf(SH$U`in!KU> zX_U`CcRkU{$OjV)w)B}s@VaBm^L`nXNB-L0Dt;4a0IDc%{OIkdO&I^YSWEB=dVN># zC}KC+)z+!0r^x5JO3k0nf2t`BZYUI{kS=l{IHa zjq?`~*1l@F2fjCR(|E2C+I_U%@(J3mncw^D>B7Eter;6C=f`Gr-n3TEUNw_T#k@FS zY4CZQR=Tf(2|&bgh=+tZ{uS2?t8tbUI0m_k&Gr}+=3qd9&CH6H2UR96e<`$_ac%6t zicE@SV9GC`pcZjsixfm9ri}Agwq}tOhnAsZ#(!${39$Zkc!6RRlH)J!_D6C;#0*8S z2SXKXDdcVLLKs0r_eMJ=>TL1d!IeQG0@sUVf>DJ%U7D7I@vBUFo?Vq;bAzT5hn4@ns&_e7D4fQs@n4N47 z1dWnW!O24B97_(+)FmWv+WgkaV}1iiXrR$TmvLx~o0fe@Hy=B6o^L_4qV?<$45mNM zw+k(_A4Qgj5*@GQhj5K?zJ-Lvd>%4n{%#28%Qnkk4W&EusnA({SIo?L-i2B@DrH|0BY=!I`#q?bU%4{y(p2rZ0kFJZkOD)S%ORMwF1pnNrLS9;ZrQ%Oct`YFW*g!`x|?s-hVh}tM8fA8)swsk2UjG2#3$M`yGx~ow<7B z{EHi{UvB&Xj>vO@Z6+fZ97Zm(M%qJ1F2#>@q>fw`jC7WbT&W-FY9G1UH*#%alS-jcIb z;7zIe%`uak;|@3Pux|b}5qk4({LOo*H}4B>PL}?7xOAv4h!b)~pGX-~aW- z{?}U&n;pasl8<0^PzXCHj2#pm8onVQaEI?I9-Ud@>Q-m(&~9bbZfV(NZhqawq}$kd zKwp1EN9T^Z#v>H{8-~B(aKA7Zc_#0_$ua%=6Xe7b7W+?w4+IzGBoquU5(xkJrR0Q^ zywj(u`VTOrsre5)wRGu%uI_@q-hzStFEV+-&~QO+s4_SEZDAn?um0h!ty>rN?EZCN|1W;l z_k#yMq^IBJ?zpgh`^2a|pyf@$8 zz5V|F-H#9dC5JaR`*ZHo&woIqe^?~B*hxNqeEsrs{-5zn9>V)SZQ=c!+v%Sc-p_^q zppgDI7xKsd3$G-9eBr-hb&@km|Ko|B{-1p$IkNQU|3sGldm>BG{XO+bfh&GQSrwC2 z5u@UGqnDf7D06vBlLc>b4e}GOoJpt#E_mxCw!dl6IZ$yW%x3e$vI2vxT}|dXN$rN4 z!}6uEIhq9%8Np@5e*Wu|#SNshq1mH5`*lkbpW_q*(YTq~r{rYRXbX*+tdq-17*sI3 zChgOAui)@i7PGfD2U%5;vA&fj9be=%UR#koVYK)Cm@gxDLPk~E)k$WlhbqPuwrFnS z=NoKqZ}VQdky^Ti+1A;%`D9&3Z9e-7IWA9w^%#|(NSPQTFj%5wKFUaJ^D(^5Ts?MT zo1ilHujJ0yp$^z~9REjMYgRtHJU*7CWYZ@3+V=Tzd2vMbzt=D$t`7tM~y19>JfF_X(^}?gc@cOoD!es)1xP4$>=UYOpsOb z;@Xso(0^HKK7zBIv+I#{v|aEj<+cy&N7ETB^=QSpVfqP^ZA|5eL@Ghgud@r($G*(U zUOcz*@pA{S!k=5_CW3p1*=B2Rw>Xa`=3A0X(_(4`q&+e1hYTN1RV{+LOTs~~7av*<*U9nKVl+?xm8Y zR1y|R3H_;?a(4NLz+_5Hc88W~KHIQ(4Q_QAJ&s{&X-FWx*0o2(IL!v>U#=8PoZheQxz@pKi+dcE zAF5s&rIAp;gKng?6hms{LDmz7ymHEr{`@9BnTsA$DDWabl&#HsmVJBCOiitxGXPt+Yl!cH=Aky3KsUiSDI&Vy0O+jh=-v6(T#a z`i1wwq+5)d_b-lB1tMaHPE5nwkv?PnAotupEGhYW!m^ued|f!NGD3LD@UZNrj(;p# zHq)nHPrFLhWs-OM8mTrHFkz-m=n zx!Vx%9(v(^jE;%gHYA&FOUDrMvl>}v=y1$eP?=gsY)$D_ekE*MQ+zkfM@BYG5nl69 z@5?5)pEN8b|6w}OO)9a&Dy~O!LdFdXf`p6jV$|mHJ?@42XU!z}D#zv}WfWh?7HNWyN;d0V_MQ(&7pn$tD@QWQYfcRM_k{pQ`t#F-iGs&^Wc46h!Ii z!L1UVtKfnvTnScvQu5xFo>f<9h-=McEWrmO!9AiX9nVBfqn4ba;O2ROB=RdCje zIJN9fzPeD1%Neglwb$A%1{m$mF{eEzMh|&f;Q6rKI2~5k%GMqL@GrZPaf4@gaEvK* zMW27#cE*m;E@WAZep6oMz+A4)2vZxPDw`-{sr-YJR)B0R9N}KR9!%N7I0S|9|>+6#|%Dg z%r;;Cb?eC&aj5_PyBcrBuxF?tAy~>ceD#8)Bu0$F>jXz11?K zxha21QPiq9p?UAkA!g&<@!`M87rmVG7#}dNsYiUxD_Ti`uleg2^#oRMDCrT+i`HNK&FQj`X1^o zpjmk`6pTzg9>XRDk~GyYbpEB!-EoL6c34M-jNt>zMTt*E5b_l?iVxQPij@wb_*Cq=nu}X0HQz4AM^JF< z*ftzD5`;v4i(WcKDYl z=$U)CpeE(QgQlB6TrG0%>moK$$_pe1IE!%WP~<3^5W!jJJsUedLp|?>R!B;1M4&<& z97+Qn0O)KU#1`Y0MtR|4gIY_|LV}3n>Vg$ag+gG{h+v}+dD%M7nr%|(-b=Zb3cn#6 zUOP`!+(R8J-&!}zsf=gAweV_kK-w{!9e{I@fNEZ7)Jv)#y%aZ=!m9wa`ZAoyku)9@ zAY$(l!wg~kLlZQd91tYI&rd)rXTw5;dDxxEpWY6?(vUejoFG4}{tGrJ05hK4Jsie}#N0x+3pohXfUqC=M# zQ^TbR*uYtvr!;VmUmm6%bTAD)!A3H9!OPKvtgmNI| zsnoIF0mqPmYz~Njfeodh@(q1APRL}ilc_g!WjVSV-LXo-h>-0`B@@~?#HFSIHk>2G ztm6tL~(&U6F>mVLGn2dA}RLtCqN#iB%NQ9%spqmsd2?O;wlk_=088OHWBp(9qa6F=%`r+RC$D#|vB|+?q{?T6+qwzH)4u!aDHeUpZ*r#9~&F zuhh47@}qk@7D8*B+zuCz!^iM`~WYyA}nFN!7C+dA~tjuKT!ugO9Kz6nHJEGIEoKmp%cP| zEVB;W%@l;*h--6EWvhiM%Qv*SVt6k;SrkFAMc8ByI`^awLm`a|-gI`e7vk(iIApoo zKmj?L7x?@PnkR(!h~YZkZlz6&aBU?!ng?g1U`Q%7l?uhPPGZN9=I_`s?es|pWZ3|` zqX~D=Y5m1J;K^4?M}+C#QXE_8c#4K_s@QKgsTT6_#H*JG)#4=!?XkSpoSfz>K zidn*<3!0AxjF^DoY`DT6`ef!2ASS1BTkn9aU@S3*4u_$jqXg&0k@uKjT9~}S?4Krf zY!HS|I;;y%!j`k-g}!w*D0JG>&t1Z(U?-UgA-m1+?E+WOkeJIwDm!45c+RvtWjh~$fH=a(NKVx`)S)UpX$I%b1O0`L7vCoA;;cK{3<>B#SGWkn!o#VVy!0iN zxrm;RO{ns>;Dmg^+6f_}GDN-wA0~w2@?cB^SmOj6`vib(ggrDj51KqzakzE7Q^U(I zoSn0yU@y*)SVTki@Zgz?+jq?}>}gP?qiPlxf3ZlcvQJ!}g0}PE(HGQJ!gJ6kBo%1^$A4s~s*klf@FRw2|O^WS|%AKs3!plCrE^ zA`cmXqlL|nOqQXcawiX+#!E05UU}_1xB%ZaEhZ%C|Zt_GTfsyTWnRNHcOl zK`s|Gfpp`EyQS1->?&-~@rZn!a=%M8_p-r-*a`4mIhvk7~7 zS>tyiweRGNe?AJ^t_Szf72+0Qy#~-=9*GjKT+V?Gj<%nDgY^^#=Hc%oT|}yB@a;EU zPwB9pH!hF^=WyWFgtGw>?q3C9B*&vC3Du2&qu5Y(oRnHZNEVKCx?fG;hGf!UxpOT~ z+CFZK`*XGYyZ;Ny<(pnYBH5Rr{yk~HSu@T-`9#s+R}Rq*+3^N9atC>~F=@G#_e?vk z%?|#A55zIx+ZN!+MkJD!az78}#>NE*;gD1uZ8;K?M>;{?Wm!T<5=%)7fT|2U_PAMh zHIy!dwX3^N^|yG5V1;Y&`sHqi$`kyOu^!SYsDyP9*9*-dS3X=+9Nf0hyJ7bSs{3rv z*xm%};@BOvkX>t_RXH-yVD;!4A>1GW3Fe!F7!Mmx3@FP@j$+JS4>vFL{&>hEFi8Fq z)DTWXvGl~bPWK`iecTg1<$*qXQlY@V*s2#{^iOrjpAh7m+`ucbKBSu*~Fhas`fLBbet=i}0<|HPE?rk3FMF!r2 zLZR&;@z(vvL$R^&k(1QdVNhFLb}~*gOC4It#(6Aam&t8vvl5iM{iy&-U!{;Ui!(m~ zDj3U?KZ9Bz&Pj^9ayVlb4~~4LWN+!=#DNqPgGXH-6X&j6JPP%nhVE(H**lBq>4CDv zqy7cW>mY0A&Awa2wsxcS3iAk89O z`V#zvkSzby`IqZjhhC?OJ3v14bBlcr9YVrJ-DJ2W(B#Er;t^p=JVQbM$aLQ|+)6RV z<0*#3euY#|jrW3mACxj^x6NipungC69FB!vbUcL;k1#CeZK^qlks0o(jYov!f_x2Q zpL?^5)}~|bZp&!66?ABJK_g@foGOCXsC;=!ZtOXatMnlp0pO2LZaVC@iZo2mHtZUW z4z)u$%L;nT0Gy4556%Gzl=V1B!ALgD4+Xa;ei^?AM(-ofEL|svBxc1!L0r&H^lrEK zBPGZ)pJ!=NqEIA+qeM@f(Hmefn$7NGh%;0JmoMYe!B4So&nxvn^yb0*nnmqVpjoeO3j#_Htw; ziupPHdJUOX8E4&B@rh$%?VmbCBL&wJjG~S7uElwpkUXvs2f9wj*F&^z3qu*Ur9*~- zEAu?{O2KQoJIlLDIzA)PH}}~0ekdzPv)eN&Sy%5(9KmqM>Nr7rw?Gc6#G95(0r8Z;7KWu_*~k1cVlmyw)dg%gaN ze=X?!NO`4j$+tVsCuvuE8}`SCM@~j{m#@s)Jib%EeQ1e`&^M`W;|rn78RV_4(OkdU zH=M!CF}sApF-xpMlfj$AYf$126N6Xe{9~^3YE8N3^Ruti{FG~rk&>AFy6b%PO3#9& zshteGPT^3TFrd-X)=MKIzRhci!jz@aUyG%Qv`hHP=|W1QbV}KaWj`Yqaf?xsp0c-%`&CXKIlT0*09Awo)i0%XIrGqT4HRUH&J3 z%3_=fS)sHK^=OyYDN{E5Q_zD=%e?%E4>k(vfI^FR!Gd$J@ff~44$+Ad*0z#ccv4aD zdyZYb?uG9qWbap;^LQ&n2c%dZN$Jkj%cb=cPHA14qEHsC5>dQoDTbJhx1Bmy(&|dZ z8^03uiJ7Nz9HW!Y-fe8Ao@_L_s(tBEprP&`Y-W*<-|#dc!l#Q-7#Pscw^b{AaYGcC z%TX$*okhNeMI|Nl5Ut;9)n5;oac+iPmFpmtjoCVdWVd6&?se7)zHx_roBEwM9&%Ei zDDz--#g6G1|2((Mm((+zU(!es2&ti&{|kF>8q~zvE^2quNxG9jXhs168wiLD8s-@i z2&153Qgi`^LB%-?Dhg^QX2dWGI0Xb`QX`6@qJ~KU6$6S3hvf>0ia4yOs5r4s-uK;m z*FIHepE|$3v%jiS^;8!{@hc?Vou{w+x;_&u9cEvanD}p=bQk2PH0QWA&JQK#pWHCc zfK4kE3)o?M-KKI*9%oOj@NaTCOnm~+B&k{L>g@FvSk)7VjAQ_I8}}HC7x%hOh{B=@+8S^GWP1OCp&H(6I+QI7?gKLpKq%% zm%3S$#Q3$xQx=DCJ{DM?nTua>630p*yUhVG`LX1AP7QffDT2hvJGZh>(oMSir17wpZrZE zT^`_zkUeE8uq?_(OO_OuDlfEY9V*g5Ixxzw%{l%?5ccB z^t*i*xWuam3zMj3`6fOOCP+7WhIC#w<^{y48#An;Gjl4O?bq|rLXRQUhvWX-C==sq zx-Y?{6GOZpD^{uEwq|j2`5BENlE>XzL-UnntLS)2ruY%H;&RA_c06Q!G;R%nk$qB^ zw;C*A>J%s74Mwp-^W+`_!bEUUpN}dhVa_hfb1PkV+jJ_OpCoo#t{_Lw}X1{2-IqWss-C*3mE>#~9bikLaA?;9bStnB77k^w1=x ztrLaQqy|1ABlD59U&hW}&g?U47vl`_nogK=d1~ccyryg0x-H>%G#-}rmsrQgUMr0W z9QPG@autMc?s>);V$g70j$g}aHiT#^a}%<`*zuWl>)n3?oDwL?(o|1I1ZeiOduv@F z&eThA=EQL`wHpqMHR>kyC30!`_}01&L#sqFNfXt^#GZxE_AbXTQP4>ICObxsp~Rrr zO}a+g#;(S77-GrEQ_sjk&YB(R*fJ;aS%>B&rAEmZl;R$D+S+= z`z-h#-)BxptNJtv|LlBETwMjeQ%NA%ppS5F13gBhlsx8CEius%qk2Ixz$^DTLQqLv zn{?i8Mz6lrl2 zTtbhWVh5Yuc@3opZn#`LDr~Lpp)kwa*3JMvi>DT(Ry*>LjJK*GZ!zO*M=@G&>G>gT z@mCLDywEU$^sZR_lXIQ0zvt;HwoK0mM!}%aig(ZdA<^$$4vJug|^qW(5;ET?Y z)R=44pV2!u4UFW8XK1==G%XK9DHUfktZj6bRL~ku?h6=e=@$N;lTo$s+!4`uD-zzM zuih$c^^4&->P%Th)gWGr9Xd2Ubcy?ST=-MuLNKm^C4p@+>y_^qr=y~MG#@wRc2St> z8v{EV^o-J>PUFb{=#zOVt#r}Tc*+kRkFra0xdiCGfm2Qy?*vu}-?A1T==pFcH?}f5 zZ!gszzQCBFB{@dyR?n5``PBS+Xyf~1)cUB?=;z^QF&PF)tD-|yD@EC^$?;RBB^XUo zd)}MUTL*}>Ae_nGv13l}!=~Q@t+jZtR)LT-Z9Y)zTbg_^dj6IQ<3#%(kesmc{U4wA zH-P=?6$0aEmP3_p-{|>Kctop*GjLzvGyU#*Yi94mPOs(Gx;)r#00X;x`i$12rD#lT z{a6b4N7PkLm;L1Jvye9n>h{&F+DppXrE4B4f5Lmq`1;N$^K9de#wb~(UB^kp zk2V=^x&%A4ysW1eoXsqZ=71Gft}aglW=S`ow^oL7vA#qw`H|pnQC}j%);tjy*kcTu zyoJ%i9}@;;X|xgvcr2*#FiWTtiSw$uAsXjRZYd7o2<*jIgt;lk*W=y9B%Lf{w(Is__}zQRzEubYEkU<>%soqus*o5A4Zhq3@A_b{Sit2>-BLS=Xv8M zc~qH=yY3}Mw9(MO+0YEPk}8au100aYXzS$Xy2JBZ7%zQs{?fkitv7e8+%S}*Nj|WZ z*iCZ)TLYSYyw9_e3f<>lOJBBt*fspSDLmayj7bv~7m=4UePicQ=5FDw{H$xr*Uy!E zl3xXS6!LQy;-*qD2Gb@!7D9$tKxH4)o9oK{nByVES|EHh4{I|Zcx`bi@To^g{lGCH z-QDBp@ytUv$xgGH+3rm>x(eQsD!wV|ttn~K_Av7SuHCuc7b*+Nkp>@sFm!Tx|4=GU zn1P%7SjQX3*~l?XqZ;~Lz9)S7v=Uhgfql3)3vJ=e2E;AadHyoKDaYP~-$dr$mTH9v zMYl@Cw*-<~B?AG1abZ>h_C_slaScyDxy(HfS81R`mVyh5dWxud2cK%BQS*YOJ`YW>)%onx!Bqmch9$+t?G z()&L!KK)N9mGbZZGctw8{~IzzCjU>!lu}5wV1d#%^;1{(n~u(`j?S9}I#2cV?im^k zEm|~WVmv}MePTv^Nu|CwHT`I6`q|WU&eZf9mHNZnTq&*khs?^xW}Zg-H>S$P`IndH zF9!XW5~WhwpIEG4krB%Eg|+fdaL@q;T`8V&a&~lda&T~RaCCB1Ciz@kT-;pU+}+$g z+&nxzJn7zaKc-)3NT`x6iwKMOw-p`{6&|@^9Xn^u+Q!(pVK)0!V&a#L8@_Me^ke(B z?`f&uccy<#OPxqdy|X8ymCLOVW|!yWmK79K79A`rK3F9xIbK?Nrm}LpqT)kY>9?}d zABQV{96$E6vEgTH%Xi7yuNOPMbYA-0+4-uov$wPJrc^rEfAjXOfqO$k_ix{Ra_7#+ zp~3IURNvq&Ww!78@ZGQXM`!Qf|Lfty50A!YpFEy>`sAO^DEYsrtnV*he4l=$Oz-`p zyZ4`|tPg*E|ET!(>BG0#k8`u1<~}Re?6)t<_4)h1kgR_me=3h(W`BP9{PXLVpL1V- zepA|_{vEpdmm%suJW)yj>woEk`qwZ2e{PHV4`55lVDh?#nmIKi+InlhINe zU=}vU;9-@wvU%`4$pZB;KDK>oXtA;Y$g0P?`fO~jv#YUKctAmlqzY8*f*3`~$QA-8 z5EZD=bxoF^*12q#Z*pL+J9p6mmpUuP&79}C)wKl$FRx^Z^|h82%SQ0322!y=Ev?)K zQEjyZKoyQk`#{Hd_*8*u*4Ac4<$N@3mg|z&w6j%){x#pgf$R zaAM%d1i)jo=?EvbcN4tpUi6SZbq8Gr_wBve|0euS+RX|1Qw?gPE-pyTYPSSLykrtP zh{G~L42Hj3L3gw_x!d0*U7EPHSoK4S|8ecrDqF8ESl?5!L?G=3RlTHPftFwe_7*{z z8P1tEo?x2ILT7NsJo=y z&PE;??CutQfOm_YGl%l9&MN#=DyMI#djU4+BcqKZw=JC12yNf_oTLOxsoSR3oT@%) ze&yy#pG6m7wR5|GT)+6P?F^}#VmNcARA_%2MJ0QEM{^3e(XPal%8EZAeW^|J!1==vd`TG8R zK*e3o{i>zF7%6NFVh8ALQncy2D|5@-$!ghA2cqZGO?zD0A{MUIb;$0VTs42Rs_*U; z0J$?0jLXCz;-SDS1dJ&-GGxqb;;KAAAz>$usu1yhUxKR4p7bSLyM@uWwo&0UfmECZ z)TMlmrEEPb9wWX>{Z^ufB*rKGqZWJ8XV7f7s>;Xofu+2=Xoc8Umn)LGPRSFk!EyQq zW9+icY~|BGJkk_>nj`BboVy}b;Q|DgI}G*_ivd*S)v~qy=Zuf)8qI&1?FmxUs&0wy z)f<)&elfPM25Tp5M%XzCH5k>c88I%FBRwGl6KlMpnW`DPrM))T^&WX*O3V_(bpT!E z9{mT}bc*{xZ*o0$kZJl*w>Y$X*{Tdyzm?u(f%k)y3FjWuXW-iW zaFrgY3-mF?*+G_*?E2zqMw@{?C2qj@6iLbr#U~Wdq%B|?eUUD8Cj0cqbmM}#*LOX7 zTK85m$Uf0Lm|=&n3o z5r}&}i^zDTeW&4cUn2eCS<4obOj^%q3sewz^^=sYCsK7{>f`9U-6xk6vUPRtjBT={ zL#^ao>J(kjV*3Sa0{Eo=d88vaq)ww^+$tavLxk0+D(X*p6l)e%yGe@cdd@|PF7u^LAUY zk`JxdULU10nMvDsBK!rH$ZN7*btP_hs0t-_S@Ksj9;qcv(=W9z#i|MOa3S-55r*xw zDtGT#`citM>MuW~e_Uvhx1i-_&vxu)#PDziGq_}j(BpA)wndFf*Yq=CR{VOCJb~$h zhr^LAr4_cxg0SC@vcv9o3{G%xt~QcQ{62=zgi}3iHJaz5>;i;P8q2WFNSrm6;;Ed& z&roES?zL?omf#I2(HPwfW0hEi^1p#Vf2!g%|BB=qJm$*6tho4wVYXVGJCQcmNxswG zyXDqALZApKk@Z_;<`b}A$m`tet6*vm3dXNPK?8ZWv);lS{IE1rLrNcWVS%UzpKTu( zZ#0h1zyyQgB#A^-V*w@9<9tEYpTuck5moS)Jn?DqlAWsaAK)DrEwQTUfEg(sKBZQF zx~&VKbSdzLkr7z;=)5%>S-g@D!}C!;`I$G+5xoHnl2?ZZb208030W-IUCfAeCKn-) z?J3RkfHKG!)S;g-7|9Z9aY&R49A=`mCG@3IksE6YD6f+qlitF#FXQgS61()qGU zC0=>;fxJ1(=xCXwns1nSRWhNEesb&LSOT!$l&J zK;qT@ktLL4Y@&qv0QSTE-Sdee7`GnQ|CC0vCAYrx?0~3;=qr@^~IpL@?8@E;b2 zK@Tv4=7p zXf6}%f^(xFZv*K^6-XY*wHIML=*)O2Sj}ITJU2TsGXj1v zHJ{+j3Qd%n#n74am^D}F=vPe|c)Z1*@6 zDUvPIWoLu7P#bPLsg|@;5~MFvzG@hHbVO*s+udI;qQuw;+psdQhWhm-YAdRQNL`02L1|Ptsm%jxCv>Hz}p1=>D-+#1{~j+ z(!5dYV;{Lk*Q#&Mq((vvizdZOgLP@UJ&~4s-}_KS>ftb%wQ7|bQ$qN<3nHMsdhVY&>E8u@J?1rJPTrMJoM~7hSCG?riJV9 zPQ*&VSaxN|Vq|5d^E!msrGTIHx!ci@a#6;UW{AOZG<&@{HV9l54ej;^|0Y6iDAsEU z#!;q@j>Vc^w(^c7p5X3PITvo(1h@jZMhwCFD$D{grn|qeT3mWgsi{jP&UIkE2dS5c z!jujt9f_Tu8064tO6u5>iE&^hHFJu*{NuY%0glaPiQF<0ZI6;0*l&SV^K;+MRI1J} zhVpRetF`JS^<6SBo(?s2TIEZi`E61{P7AajX;MCny>!dn_nZ3gY@lhR=iG}5@<-0P z3tMnga6FBNI)MfXH*FNutE}$rJcSK|9VB5CJ<893(oC7nc1eq*H!FkMsE_RH5))(T zen<5Z_PS)E>@DVDzFWBXftt1raz{!cl7p`50>Rkd)z7mbXS5)ISb?HpU1`;@2H~#< zL8K8lg9Qo2B-aI$W;&FtC)~xUjGM*3w@W)WiNCH#DU;`FajM(!D_%tsdGa!pc6tJc z>pBk>T@2yK@J=Y!6LoH8!(Kt)#kCqg>!HD#b3<-)cm&=(s0>z}R^eIywVBk6WP|Ff zEFbNTqbV6I`%Pu~2S|3%g@Sm3F}VSN#PTR9`uEmF8hQ7DjAL<=?YIc@q!E=Ehw5k_L3DL+1~ zNQ4d)D-oEmK^F;_Drf=YR~>I zUB~h9tn>_Eha-1)ia62@scxi0U8Y#DmekP%?2@J23o5lp4&Q2tw4nTSHe|AAiKP%j zR}`9d6Ss*kZr(!pk%pY-LSw>;0ym_B26>`bJ=r=ETlw|@Q^mHR^2}eN8|*E;^e%~R zT3>-nb+Gwd-?Eo}a3`2_Ig=ytAK(XHb*$Wu>qH(eTNsIyzDT_Os2IMmC52n*!QN8L zhBDAnY&SPv2GRhmkFrf9TjoTEyR0ZG+SgZp+hAJI8e;OG z`%YQfdjHn0PZjVeKI#*mGXT>SZiaIFg;Zkpnow7EYc&Td%UShe)_TO5Y$*4O7fBwu zoZ7E&v^Ptq}a7?V0Im=QoWXmSYT1tcwV= zT!LA|hQg*&LAU-1_T|dU=+ll1XQ<>f!0NOQJYOw@ETem|VWi?&Tb<9R&R%J>!QrA3 z!3>4@^XFw3z8;RO2Xhp@#RxR>1xb~HCgqs0YRvvzNG(|7b2=fe?cx?m#Etv#GhHj= z!oU!f&TJ`p>-{Ue$*@HtWIG@_9bBFY^k`f_)7kN^a#00BfXZ7fVu&Rc7<+VOk$nFP zEkZUz)XJ}PMPgIg@%lkfA*;$xa?)M2BL~fMkw)s&l7!stbiksqO#?|Jv>v^fEK-89 zf_MbVmcbRAqns_s*-1ZL@d27Pkxlcbyhz_EIjOSd94;Qty^SIJz~(Qau_b4pZ$VNy zYfO-|J=SL?P$*ehZeBbe5sc3?iHhybgvF1v)j~E^c*;Le!2OTY@iHUbwRn zU{t+~t#a^uT5!`tiSK^{6aDXpOptVM-yd|tnaks!3F;E-0S8gME&lW$JI`KzUV}Tl zdEe=bR6|OPtB+HP$v018T1e@E0N*dWvqs+ z`y<2d?K+6}m0=Nuwl$^~9)d6rj5#>1-R5CipmhzM}@82K*OyO;aiX5U2eM5 zr}0Oh?%#WjzwbBL@^wSPqpq?U&yguk;7lyk4L>5UAb%X|7#iOxj(in_oTraGx*XLm zEgvB%lkQ*+4PM6r^~IM4GqqdTaGC<|B*83XW6inPx2j!BfNORDRLIWF>U_Fs4BWQ2 z^Y6RvI-;8nTyP!7C-bGJlVW^t&nQM{evr-z4C*ge zNrqn!Y3I*Y>jT%60<*<5+$Qp$&rV|EMde~uuo_Q@QQ9y4$hxxI#|S zMc=rKzjCvz$Q9z|B=w0{V(_M>;G1eJeS3(lfp;Y;FIq-HuS|6#3 zWz*mqHfbkK^eheg{$QIA@^m@*dJ%HF3Qst?ORgTJ)3snSs6yt0V;?D7sxVm zTR~hF`tWuR$(Dom zYgY+?K9BEfcZqx8q-(!l1_zAVY5j1AN3(_)JR07(kUL0HTA-ps<2gh2wKjiDLS27B zaS0k-G}sxqR`SM^Q&3Pydp{nCTuA(xIxi=+qvB_2GdP>?txJ(&8D93|JihjjJ*Nup&QFo?i+xn~Xb*8DKB|TEB%#Xd z#FBt={ocsUZcXjo6n2Q${ES8^|KPIpsf^~Z3HCuoT6ID~lKQZLFMHdcH;?`Hb^Ehx z``$dfkj$zLPP|?0SX|k%#h1MyNy23~sw}fV+)}4GF3+WULYxmsr1E9%$52t-p7Z!sk#!&emu+2pq7MFestNQ{Oq`7bHm-&?2Fz)xQVe=PoU9 zAGY?M54_#%v*I?UI5@IfkV}?5mqTx^lYOyW$&!2Z;Yr9n)Ic{LK6Gm|g6sJ;eHy#e z*W7M>v4|-WG_QH9?7$o7uW6weF6G!>Bd6vG&cc_b+Ltf8fs3$OLvYOlmlxd@S-+_2 zc}_UUjZRWWm0x%df#_b+sZxE1$C$Fl>z%hz)t6Of1|I1!QSfCeph0oV*;=r`-$lH# z6xUmV%lqU|hdI;`tk*|YcWDaelPu*@0*%mZAF_H~w&SWb+XRAeyn_@BRs9txEW4AT zwBvb9Dd;lF<_80OM$(dH-uNq0TV-JIavoveI;%iro66gvOo5K)So;_!rlFeQ{~sfggCmu*wvNx%&BhMqfpv(FdQCs*}Jj$+Dg~ zEMd$#v!3eK=9vtUzD|Yl45`H2_=6V7yn~M8$%$$KS{p1Ye0od3DFHKse8^2IK1VLY6C)h6ogf#J;wBm&= z4uR$eJIHHfemfP|^PDRWVbG+GYeKSqFrHY-G11d0roCmgOwp!2EI{>-&(R{c&W_qm zgNsjfr9PQ@kPo`KOTQoTHvh2mO~cCpqKS(9sO!-XIq(|QFWuTCo^?Qs3I04-Q0zn6 z*i^j0N8hBt>I`C3=rki|;BzRLDb55d!?a2a> zH||=0)cYPPKRM>Z^=tw^>R$1pQrMlIUwxcXhO|AyMbC)*fG&&aZR8{2TzK9iN+U`u z!Ct=v7>@2QT$*l7Y5N{WaO`9p*s1(R3;W(|OvpQdZ>23CWa|2iX7}9XZzDWn7<^f* zy;^}G`_jc&YgB5%VvxdgeTeC!;07DNIGy`X@eVBIz)yi-r7%IuFfud>)r`%-c1kl@GYNq!l>YOEKV4|!h0dh8^Lgb?h zC$*GAQ4ZP66d2UKjzXU7TCVRncQzf?BMqRG!x;tEOXmjz6LjuZEpP5adqe_?mLK@4 znG2`Nn9oMyA?>M3$^{>{gVSt3b7P^Jg9$jEort*G!BCe>%Rdjmq2mDl89Qf!xC7q5 z^*7>8v?uY){S$xJpD@^q^36YlgRYWZX5A`EpM&MB^B`$Qsv1%Sh790e6^?dy?x>@!H4V+3sRJ@hD^&z=UylzuM zDw^jx9-gsA`m_H3;v13(ogx2bKCb%A=k?o~@W|SShEv#BbUXKz zIO5!%boDO_ZC6n@Bl87z+3Gq`+@F>01%8o5k>8uScsE+;VoQGa=!>nM%a(h1CSB@T zne#E+yu{bQAwk`HAU@C%5Ng^{HR9+xu$&f><1oq78fVOKThwb?{7w?n7es`VL>^3^ zpigl8%zla?r(_1~1N%^RDJmJjed5B^0+5Rb3!^*E3o=m;7qH~XD@s5&&GF!8-@iP5bD_X$ zYA(lMe%09}yDb_RsT|0w%9s@D;&c7O!M{vnx>Yg*F9vzlZfRTV+={b)wn)*nHD`4+ z1?~e>lF$vmSJfevIdW>u`8;vW+I?zTjHY*m>sqrW)elLDC+6O)E7{+z8qMKfKP369 z`uP)Lw9Hq!{3GmOy?11^|69mHuk?5NJ{2$UJ=+~`K5z?3LUjKeZvF9TgWRG+@}Zwe?eUd?Cm-e(Ll_Vp$% z1*u@F)i20#SBo}{+7V2B7Q=g4k#twT*4JDY)?RV+r}`e4A9k`7wr@N3^2G1XI$FxJ zy6e2j2)s;u^6%4W*DgJ4^k6U9Qq@DAFzSO+d!I6BQn0Bi&@@$H61sNZxGR!?>|(zQ zcbS0S81~eezr8h|X14{-!dH6Q$asEX;{c|z zPN17676JTPyKI*MHI>e54Pv1)IlpsH!C&W%UYaBdH_iU3>hyaWeKGUgJxKowsqk>Tpw;B zt#AP?I=zluz3%p)H@wTs-ol5T?kD4W9^``0Y>6&SJ$6ZXOCRJ@rm?;>q2HXyfL?ij zkC1M8+K7wMRbX7Cg7!M&6?4MBOs}14!r3?ZzWdQ-<^XQY>fe50$=CbvGMaY<&OsBmCMLThOi&NtBZbQPWC0EXi{Yp(jL%qR7i4g~C=1}+Kj-d-nc zY{Kc5cLQWlT}Cw;1gg>VHWNZedBBlR0Umd5X8D3F>j6;=)iPbzrrXD+$o4x=u&~N| z`y&&VP9NHbMQ`r+Qr`|#6=JJ329G(IGakS`4n*GzMGI9R3<&aBTosvtiVPT)2oi)9 zK@xh@gTN?ezo``Kr5kvBYUr>0enFMrnalmFtn)*4g>E7NO@R%lF534E=g`@^zy5Og zR;&Yh`%K?$RqQRnG(W{5pJ5T8%ewODWdHtVWAfX8mZz86?%ckaRVQ#T+g?xCbr2Sm zA6?nhkaa$I|H;coaY46mcL$Aws%V1^13q{;cis>H{bB0hpuML!=;CeZ(XLyv3wH-U z3@Ufz4~`sOJSn_We!2CI^YiArPaK9Dz6A^5+X<6&Z;^ZWgFB|OBaU*xJ&)lxZx?Ww zXP4>XZkL->HRHUJK}VY4V~oH_A-LK%{CW1UPnBS4YxAX655Ejya?-sYeJj21-1{|k zZ+`aP-#8hdEyI|}u#Pg&Plk(<;n&LuJ7xde%a9QpWTXxmxnHI-CR2SOqkNXB;YSed z5p}Z>4aX5pzY(pd5$*LOIy*-eWRK`pjOaCt=y!}P>>n{08!>z_V)S`r5q=ca9yK-_ zHE|p@^&6!|jhd|=HQzb9ID6Eh;@p2L25T(3Vr)&r*xHV<-}=X5#>Qe_jKzH(TZezh z)_xdo_Ap_6&41;|O8A$EO370xmyXW7me&8e-=_qzloBhY%IaT$*1wMbwFc`42);$s zCKoJtWMnwDXwj&#vCPC|*wl2`jCyym`CSW(5ethy7cYKoZmuvl|7>P9XJ+=DYWmaM z?APMOzm(G#R#x-Nmd@MR&O12#a(4dZ=Jw0m>zA+3ub`k`%0gcl>sM6dzqzhrV}2zj z{MwZKGllbW@1CE0-p_2|524^~R%Y*(&56r{{pfTrFHcWTkAHAl${)Nuy_DTR2A#=d z2KWaoSC#=+vLeGHS4XX08@)Du&2KSle@kE|Y}%Ndo|c}qH%q|d7v>k1mz68Ke#(|# zOH)g0bL+ns{Z5~0J9GB*S;<++Imx;9bM5Eb&tEuyp{xCTUwiw#GiUy6Yx{7j@mu}L zA9c0=$owh6t(NAWXV3iXxbXAJp-#;1d$iuXT0Dt;(+TK{xueg8cBkF?)^P+N0fe*9}G z1ApJ={<;2@_EUme|8!>k!>FaSW&Lk?t^d$w{Rh+ap9_Hhy^UH*Mr-i@FL7Y;-ijyk57QsHV3_2@rYSkKrwqD+rv@nXi{iu7k2!Og z=(g7DmRNeS&#(=ziNsK?bNeosap0QBR8`vwa=)DM)w*r)^QBGdx0DCZM8@MAu6{hO zi3j_@RwH$L-+W*)@C`Uol0tB!@xiS$p>fmZC_H!J?06JlGEE1DZcBl5xn-)#!~rG} zIcH>dyvbADIx0C`QNp0G?DNVK7!A?#33#83?c;PVcag3Xa8v?ZFa3&{cWl6U zQWb`R!xV%737BKIx#|}#<${)f0roNmQovE(i6Ck|x1|*Qa}3I`@vcR8j(p#G>$=-% zYt`)OSVoI>VK_5^k}B#osLvLyd|L~9OV$~2WVD0VwxE|R=o*@6-kuH<7`a17MlVA8 zZ9^ElIgEO-7@|A)XyJ)MOwOwArFK-EY>P$ThZjJe`F|bUM2pZHl`o@(EzeG}6zKLK z1l#F?;uA9Yx+V8>jCH(6*6K=EDZs^0Z-Qbalbfkr5067BokX4 zoz7jA@v*E-)C+C=ec260pO(z7@BY?+;&8156?Wc6-6gd_%Uhx%_?t|_PtXC~{JsGv1$abn)y|-8P_^vL3*8_G_!fBxZMrMqDL2+d)@!bjg46c^upZM?BaKJk zx#B2e^!{(xXUlyGBFP%7iu^PpMF5-uV9E4(o<_pjl}OtRq1qI(@PBo$kAl<4F`J^t zNzZsbU5N&`$kk##lRVn2Kotu*W&@2IevPiCw~eVj%W1y1KYaODOQvys)Z_d<5^-76 zpX$*xj2gA1#bOR?Q-NS{ItL9}6@nQA_2otHirN#{q*fGU%b$)XY`=ZlT!Df)@5eCs zx#r!r38aYfIxYA~pp{*TjHlaOf7Z zrDrJ9b0vb>Kb&$p?gQOOu_AZ1O1;{e5GgsF{+n4A zeJ3h5(`C`3jFS-!&tdvJ_}*P)%6X`co#<7AmLs8vBS>-SDIE+e^rK?4Le2zP`~-vx ztO2a*bPSdweHl`}J&GW#$Y4T!mHDlN)h|HX!0%)WRxBy`b@uo6nd_$k z;f#hTj3*aoKDha~fByH)+XVGp@FqXBm?nH~(g&ycN{#vmV*x*n)vE`RA6*DkntU)B z=8fA(^N|~IJ4#QgLrL@&eEZCiICU0J+}Ul)CzWjxs^{nFsgw@*Wvj$*+;>+f^&6Ss zC2Q2Bb5Dg-h_9#(XyR2=txhqnzvOSNj50W~#}DP@qIaZCV0@WRi?)it0T04wbW`%A z&#A!<#vLx$Uq%YPaeDd?xc(2i&jizJp!@gWfdqKNLV}rr2)h1DeS!B!_})$KJFU1$KPX56`p}`BC=L&Bvb1s7OQd}gOHBp#*Up`KNTQ0mN-c}r z1P}`VVk-hOxb*Mka85tqC4>2zo^ z3bK({+8{X*eg}xs4S|X%ciFlk(T4JAyySOaE=iJ2R;E{U?b zb*KfWa_%j5EBl1qDam$bhXsiMM>Z})0b)f=Z*k(c!+{LZwksVOnT|NpIeu|C?vN-< zY3-g(1oEZc?zAYL2Am;*Hr?0iMq%|NfYDQs83lq9$wRA(o{xclCjxj5u7;lO%Z|Qj zj-2eYtoB3dMOhCnAv^_WD+b&ZK7JAqPb&@plF1#GKFFSxA4oUr-8^rZUJ?-*jc#hP z_^TH!gAjPq4+l9Y15b1qoPaic37C>VZ|y*<-$~!shk2wUT)MD793V&mH8$YN+6I_4c?58d5L)4Jcnag@A8Oc7kCzLjMMsM=A#30J>kMyadmPX-$Y> zO@xMNGv0qSVg9~jic1P)N0Sv;H!0|-@YY0dAO`kk7X4PWL6e5t%%tp{=g^&53?@68 zsY$xTA`c{nXezQu>gD7S5VxVKy;Qwk!l_xJQQXV%mqD(F;SbZONDkSpQva|A$B=-5 zIxu!I!WVgLjIiCGx;MlH5zCq1qhW6;%P{Usx;7F3I&KjJcp}E2Mtpa zTd}*Qr2aLReAF0WH_9>2vUP^>r2PPkjOLZE0Rs@y-zVK3CZl3eRI=*{t%=2MG=L%l z+)n~UPRp7kkRFJ!2P)>)<1Ci=Uc6O$yc(B#DK($t*;co*uFMaiVMrWc0sc^H9RSs+ z?^D{CB#_f)4^++@opW*#`KhM^esX4OLItdWyBW#R`e5TP zibKr7dviH71%w?THC_f&YT%_X=GF$rIy0PrMl4f~$wy}4KJ2-DKC2rg`G^8Ff%w~4 z;;GdDPpo0;K!{gl+U{IVu7%N8iHlOm`&b}w%7e@X$SiDV8FOln`5T8zJr62t|02&AF_7y>gK7mD# zL&!bs)>81Y-#pSGgJZv91umeY2+We%Vn2}Fk&rCZDP=dk$pm3aS!01no%AEeF5sMLu?O&UYp0XYl(R-Et-EXaP1WTW;ab>3 z?7>V#I%th~Bn*}XIB`H@R}4W0dGx_WEmcqnabD5lwxAFl?BA{(N#28cHYEh^=khuE zq`lIBEpwp11Y#<@8!QlSk)NX++MY@t4LBfrU4H8Vykc_kURtRt4^m@Bkrlw8D~`*$ zWI94jV&B{lb2F8Voc298l;%YEK=k7_;aRwRAc@DqWwiPguxHcLa!7 zS+tXSbkI8n`8mrZm(IhR9QLd<56vd8_-#N>0X}&$9Fno_5DN!f0&ppV4e1WbTvyHzzNfF8cuDGQH=`769#&5^erTaquw@D%NCim1j^<#h|{ z;DRq-LK9E5#8kq{*lv|VtTnf3$R0F&H-?*lx3sx=bC1-pYrfvxwD_%OpeIsj$Pl)o zv8t;Ac9M^#MHuOYdJ&?>@3&r(!oZejgbuokmL6*a=OTCSM{b6VJb**Hmn$$PT|3ld z{afc%j&NxwPu2A_t(V?DsuVX^I!L>Mle%h<0p||1j4#UXAo+>i+|k5*dIfRzX7>Yt zA%k#^7;KFnh^z4V44LI=U+ltTy&nC>N;pIXeQB)x=WHE!Mw}xG zECR5`bnJ2&KEb`)0(hoW92V1ZTNT~v%n@A5sE*eQRStkhL0lvwK>X13SI^cxZ7+|E zLIa~yV&cL!P|UV12(VVA;aoc)p>k0nLMGrru z{OalcmWY#%n;xpq0;`H&xYO3}=iHcLpBeg8*-0i=U9*hdi`D}j!Bk6sB*qtokE3wK z<5$PFrq(I#t76a*z-5TxLkFMp5!|DztJTvJ5}x4Y*MR6P$nQhlBh?$UGhR4}!H9>@ z-=WBH#iN!qARifSq}|aehK!b@jkilirxDJ& zY!NW6dKH&*4C5+&2!4Q|ytW_IhdV4l+Jm>m6x@?vpkDO;L-H6E$t!-=D?I=H-#N9w>T}Z zx@NKIkZL^XXCn7eE8r%HtqcL_O&^B@Ah;FXhi2Q;v(L(jSt!nvm4vH@%HOv}wrl)3 z37uWBchjq-ehR4h+RD1yfUgwxz!8U=+*G&;S4wfzvwpso$kqBU+J9`gZ~0FD?~Dwt zvPu*+C5t)rD+i)~BuQe53V_Za^dN^z0Pf>j;ig9#)=BZlIPsR}esiS(#?_DXHX&z^ zVeAxRcnr+m52hnTvAAr=6wLp-_(b5z?YdfzXqp=C$98(@nH9ozb|@x zHTsB|NZhV;juya>CT}~hkkvAWpVeT{_3p1JK7;{9MXKN zqk5NcyZNX&PQL9to|nZ~3rz30^!(?g#&Ez(2E7hHk|90~CE&bRr+{<$PygMMHQ|$b z%rdIx!KTsP6%D#^2D;W-y>vIDB!Jk>J!s@c;NpnjJu5ypSuB(YUeH(WFP^jbAMCwn zR1^E#?>(6r$Rwc*p%{7yQE6hR(v%4V2#6RE6u}Y@6%gG48}>;70wM;)jvAUE+Y%H7 zQQV;^Vhf6G>)tzJ!yc@NnE#pm-)G(TIqP}u=gsrt+%HbJn9K@US&NlqX4dulT%Rva zXPYHHV>};xxZJX9`gp)!7OpF55SZ66q5}U^R z4^Niuy!Q***S=$wTF$KLDKd3V$vKFanmJ%)x~mpOPIXQQ7N^K%o1Yg*%90Hp0#P-k z#a2rFX3o=FW=zhS!#CBnX6K^<<7`KGgMKj(?;JJISZr86J-_h!D3TY+>?Ma!2iH8~ zJKS7o^9jMu#{N%e)PC-l1as%G5Enputw@Avd+N<9K7_Rq7?DEne2?&%_0P==r2f z0lBY$nPU~1ktONezMVE}s1mbCiO2&ZZPk=i&0eO7F4|#|9UD4*mD5X8ySP-P+C~-P zQ9c)?8dgAzK{hYX_xqF3Lm9emW+Gr+1CV~N(u&FOgIS6>pV;S;m+Xw#bHW)0C}J## zl6d(yIz5AYC|d`aLI((??I9bqZjYX20nUoAph<4ukuwXbc=?)FBu3c-=kjXKYpytd zXTI!ClEe8}k3-aeA>~|eicId9uX`@%*mW%veYZ^2ZRk@j| zL42nVbQk(_H)g*WZOoZFXjdrTQPsXSMM&{zA5AX}FtTDf`!*WSIK$Cm$Uk~s*3Oe$_P53}rFB0?Da#H{`@xu}qHmGrC*plnVXWGWi> zeiDx{LLdvfD?_-t}$`MjDDLX6aS-n)7x)^P~E-#cQ)2N8qI{UPJQf3@3!^(q&d6r~XwgML6Nn&_*5d>4evm zD1{|ogin%wej;$`>@>90-*-_A;-*MeucJ-~vy8Z=Lg<6NxM1hP1E<6AoYLqd>`{;a_1It3d zH3k>}>x70=1tJPF-xS| z=9LK*li&b_ply|~%Z<+|LA#AEDoxWH9VVzaz4QPz#H_-h8A8d#zUo3oL3ZL|gu-IX zE=2Q5%p6N67-4bzZwNb0SS8Nmnhl%e0>d>ray&j{UJ5wG*l}dxIKk^%zP7M-)q`f6 zwGflh`S~1P;QK71sVE|+*SnnJ&FWbm6ptC>9N3=CtO-u$$>)+Vh3NQ{bs1GF(TXDE zdpUDI3eNUX0Sv}vBt+N`ty0MOcqcW#W5udtZL-dxJ*wHWazq82YG#dgBGXkw*9$KS zeVsKQat~wLk&0t8cJ8y?Wkmk4&tG!xITCwaZR!?-E`H74NA$o=dnOEAf2=g^+$UR@ z`zE#eg;i@VW7XC#GwoMa)LNA>x@cB_c&8C^WWEQVB?8XWj-HBY7!Y$-G#BL$oSE|V zc;!6P3S?_d&k@)uf~k#YBfS-xI=+@Ie0T7X<^6e$3+0gLTksOSO@je_bN)M;1n9&1 zn3y>uZZ?vzz0KbXc{;Jk^`mNv{)UC3EZ~^p{^^9ume2J;f%q@V- zn_X84EoSs29Wv0|&sqdz<#`NAZ4&urn!P0JfXp)r`@<>N_6h^}S7zP2B^5Dga<9$R zG?RB-4C+9!tf$5zO%--<-o+u$>z#L1k*!;$Uhpq^dm+&U1Nb|XRbjOp4XkxB3;fsQC{gj`Bi3cq*T^6#6ulMqjFvSRUr&mV`dZU9wLW_DrMkYY1vw(#UI% z@LV3kDJMF@BxU zh;_AC!tmmoXmi>Z8~gIHH7Vaju6f7x9H$bIZ>MKMi8p`z!`5v-Z(mWblvSpir0K#2 zrPM;-mIEWdO*m;1a)30`fz41BHkl_S4`eOraQ*y}{HxMdTRE?>)ktk6)k#}!o9gkhIG4}|;q9M3 zUAXiE>|G*H7IG)lg>6sJ%ie?mi@fEwj7!r|Z^sa0$I5v0Kk~DYRiD@wJm{rR)s75Vba1b{{ z0c%7OxUno*0R=7yn^YHGe+KjpXq|2m(fGUgNjLP;Rqov8`TWgJ(*pp6f)UAZ6k2Ml z+hYJo#sZK~7trCsVTS-oD2fbo3VcN!f#d2=Guyq|4higfmmAgV?-V;R&Po9I?nd#K zEQ1-EGnHo5j*a59Yq*`jso;Su0`nf`vppKa(Puq@Y-xz>@`lforZfEQ7?DyPZ2Q@M z4kiKhcs&r0+oLcy+$?smCyrRcOKtZKuvuPrMV?XZ?y-Ljo9sDAnOfKB+(=qRQjq1f z&YG~`V%f);muFRV7rPS%vA#VS)iZb$4B+Y9B&|zqS$*P_@c;?KSO30ah9)A!wcz5@ zo?RJT9F_gv#QxcC5r+c6L^hHXJ7bzJ5|6?&)KV4$+&JGjqqrbI5ney@s_BBD@s$2E zzRp=ZN;Xfv!k4-oW;a&ti|M=2{FcX2+O-T`vpOC1ssD;(RMwILOWC#oM$o75=+m1e zQybem*2I3B4|}xm?bIkqLt^2wt?strqhL>B*ry+oK*g0S>>JJEXoVtLFC(Zw1!F=< zLD&PV$KqOjZTo=7jYlo}j`E5dS{maNke58*(;0~;Dh<$0f6R+JU49u(-j6Y31+Qg+ ze8`(2_2x?hk@L?6Z#GB6FZdqaZk_KeZjG>See|7uPI&cG;;kmqqXb58KYId3kLwF?=WBh0DuSa3w$K;Nkznc3}MP52&?~^r}{7d z^uNlohP>5SpwxNq<*j(!8X(Df3f=i-k)wGBTGh&(6xq$;nx{a%FCA?z(mBa2zixD%!bo zXXWn7!-o$yHZ~IERa+Do_cB#9%I=e3SUheDbyL$C%e?L+E*ZQyC z=)bDDdiD3t&bQ5~uZ;~q2po&3`nvJPhVc`}$D38-t>*|RYrNy)c&B>2r~60Wl^@so z$8O#HKA<7QSziY4e7ZaM@!s8!1djFa!M8^bM<4$_`p2WuKOc|&`Nx+hf9ZyX-amc% z=Gil%-adQw;l+!Q;o*<3UVnW3dgS$+FK^y_d;4bW?dvfD%KGqrY()3{Rh) z1Iqe;?)%R41sjzjL$~FV5=aT1pye~1kI+0&kX2bG8xC8aNu7LDFFkA)btrO2y4&%B*q>1utF>;UncM!1kA1s;^_J0Gvd|{iNDQ)_`|{dN2@83M@54rPW-n(xGA4azlNP;SFa{V1W3wUw>%cS zHkKg1d~z^($S0!lv02My`_S7l;cdrrea~hua39dSiY;=xjqnA&CCq3S$xUYP8c}D1 z?I@=Y+pfbpK|i}8oeRIRpKAv07~&qI8Qs42yV+XT7L8-@;H0bLLtd@C@?k+XnV+1| z^K1e$Uj9J2x1EHZ|C-)MR^HZ)v9^o@V@CDJnr?&ouLB{kOw%@R)Z}{nA()i?_=Ky? z#+idgs8wZ&tl!8rOwO(~9gOOsJrl_QKO-)DtbU{NobH80ATzNW{sRnALfzF%5S@G1 z;l`Kfn}s`<9ILhcwxHlxc5c&}HhF@h0+p9c%&^!t$|Z+zAji+u3x_ctFhMD1JO<3_ z83sx8bGl4#zAUn}h)sWG!=D-^2sgH?S=fSfQKcFpnI+w@o(>q{0+>Bo zjh177VMgL}t0#iRCRgFd4vfwsC1@(*huaKteC0TpDWu=A(Fr3GJkXqu*CciZ(EjmV z4&CGt>4p^!C7w4mtnVi|Y0{8~Q-n~c5O$@eQ)ec|S{`w~%ghw>3tPHYhNV8Mo^+c! zE0Z-d`C?6dKUV0Syz9VHL6-?%CH|cPn_W!7jAWRE`MKIOFgeX&OhgqkoT`FF^%zww zP3Tmc4(nAtXiS0Fwq-U`5g;*>Gv)W6W5A0?OT8w96-U(EEM~u=+nk(#W5ph>fhH9* zbMr5@8I6NNu^!h2xpD{G6QPZFQ&$Qxak7Mb>DPrmW4Oj3L#YJgd(HTF#WOCRM4qs_ zzzGM?#E|qwm2V$hsrl}?93yj7S%zKAdWoK`TM;TCURQ=H#9#bn`UexC;knK=kj zraZt6h}e7M*e?fS0y-Z!6qO}poJ{meeuKH0#ZEJk!7s+7%mFcsR#K6|Gx`X}be$_< zDT6sWbpu~pv@Nm=*}88~_-bx_hS?5wG%Ef+DwI$?Ox9Qn#Ej#|V2esOczSr02TW== z&KEF!I1_^nhNMXerOa*2iSB{HB{S5_Dw+}p!gSDp$$geJOqmin5GS!q+a0JC10gEV zGIQ?gVATsoGSlmq8i-!dg3qVWWg?sE^e83^jhmzhe-Y`tQt?$>q|_0l z@ES{DzmS?RIp*^=r6y}wV9>4~h?j>|Fip+R9#wF!h)Z7M^6*C4%$2X6NyhIczFa%X zdv76Qz}y#BS%z$d8Zss1^$`KEN%knY;4w&feg>cv3gI74PpWEc<*srMB&3RThQ|}r z`-O%qm-VC&^qoryFzjSeM;D{VZ`#%%Kfv??KlN#B(&5EN%eoM@vKsJJlk64BUn2>! zN=ON!W-zPl&UVt>$#YI8NDH-wrZ(+)W~j>R*1s&Ao!;YDUgwTnSia1q*+aR1?DaPvJe}f z{TK``CbRblXTHfm8x`a)67uyVx2b9}PcUakD{1x~SjSFQs5A6yhtWqzsZEpRU@na* z2;ZWCyqTb#lH@D$S+vZeL%C6TXESzs-NNVV4w?Hoh$KH73<-Tyq>AJxS`n%y`F(~a z&w*F77ZApkoC%A0O4L}6Y!Skhy4gE4(DOT_?V1_Ef;rQcAOvBucF^Jmj(~$CZkK$a z9|Vz>E4#@0`_NuPaI?a@34?8u{f9AmeHS#vGOsC$G);vT0`P~kkZlGW41ibU@RF}_ z^(;8A74=$Yeohth@uhPIhw3~xrsZ7LzxI&xMdS!9WW>)S_-h)C3I6%aRk;*_xil#d z#K6PITqHmhW343-gJ@Pd@27s~R+T<%ni`ptOS=dK`N^GYHPZqW>01QI$UIU32Mq&4 z!<2?UiwM0*Fb{Lzty}JQXZx^#@}hzi_-bB3BB^8<+JYj@jU;;&2~!wBcg*#P&;>btn@>|hPbDVL6Wn6_ z(MV++(O5o7Xw`5SgAuFJ*Zc?NUUf@H0c$+-(QUb+Oc`tVS z{02Sog(VRPA$$@`O~mTp2`Cf=AbcEh#LF$1kbQYty(D2Cd}zgYbPp4LeHNIetFj%S zN(psIWMReb;-f&QQo5a-K#kI-{2?=Yw;OU`0uwMF!m`HKc%B3hvpFOVwhJ_)MG0aY zWRUf4I3F#K#6z>9&=LS%I6P}#IL{Iz2_McbQmlMeY$j1dkvekt?y2$ViP8Phqg`l` zI$!Bm=}7Wl#>UQ^sRL!RsdV^P_A2x8DN&;QPj{#6T0-J*W)d+a`oiRv`>)s4|;Qk05|9gEYaZG|oa1 z5O0u1xeyR6d4bjn5U~hpLTL?w=+vc(geZ6`QxdAp?(jK)3@xgcKvfZFD@xgd!jCOL zFAfoBxd%+61q)-uBEQ*1p*1Y@VXGeCDr*{a^DPL-id1<2c}$Z=@~?9#IJ(VGC~Cnd zyR}O%`1ogA)3>G@esMEQ=bVbY&~mQ=J-qZ+-(S%t1(IJQW^o{Y1;odZ)Uj1tunZai zMro0EgGRe?xV;^CvY%O~4pzmW*)!n}5u|~=*`S)^X#fW?;V2xJqWioA(k+Vk6Fl^U zj;u5Xp){JKAbj$*(*?dT!p~!zhiZcwYjFf;B6ps;T&y64s*0V=-17w!S}roMnuo2a3}3-v>OlrHa%ghRus z{O92$Cp`uQF(JizpJ7ym*HKHC!cz%dkOH<}=IN+AX^(_jsnf1y&Zt##M;gwN~DUl(9tyzH0DRNSsej6uacy?PqP<< zN8-OlVD)})cha;+8YUwSmZ1j^q8)04B?yNGFRc0%+J>!|ID*7nP*X3qEM^*NrRa&V zrt0pq@lZ|N5EH3WOScWJ&kYEy_iN3l9eZ>J3p>R09#qt|_umk8ojm*hi}AdKRLhidg_7|afPMl2I|J5i7{@IX8=t#y|Ww%$#$ z(~y`d(&@x-J1w`j-Rz`xzpI!E{m~vX{Tk(Z%OVBAet`_ay{92r1F!@`&h}U5O+KNF zKn`XiDeHbQ%s?FMK))Q+9S-u@!mLv+wN$`;%b=q&nCgd~*|>0Y4cx!Z`vhlh&R3{d zh*5@oxDo7^W)$5Nqy|v&^xi+h#zWkUp89+qwaC$9wLrGP^e=6qs)Cv z4=$_~tyA71n-w)ri|(Qg-Ho|Nt9Uv$Zys{4$0yw&$eUBy0Z@Daurrb5jqm#-7!Fj= zVq>sWI4BTPv#^J;`svqZyBp5bb&EF6v;siq>8+nysx6h!#jD9bQm?Q266CGB;Qy@p zo*Q;Chsj5`Z9cki&&FS#yP_rPU?&u5B|iCUNL*ssfJfq^FpmxR19j}PGZr=zuc=+I zSu+y{6OKpmL~&bvZm;@r>V^_=d0i_O!6BN5BDa{omMLfe{B3&5FGx_JiYdl6?iyPv zR>c2#=(incoRey@e{sz)ah6pfMFJRpdbVwoY{A00^p_}s0 zS9D4ugH{C8qf-W;a>VBFAN1PG93sw`lNNt3*hjRx_IXoq3-fJ?oA&p>>?WvQ6!>sG zNzW5_ZNs7IZU7U78*8?17ad=~rEXK~z4R#9Qb2N5!9sQWw|02&MQ|im@!O8vj@3~3 zM8w$xvl6}_V9jZhkX;yxoevKew(n6stOx6miZja9@Tt{sy&qg8bl)^K?88Jz4OE#3 z4&p$VhP++(U{M-Pj>6Y%7vJ3nok%@3Q~9Sgr^RsKSF@1LNv@a;3NByu`ufK6#|>X9 z?~sbot`kJ+-yoR?IqnQRam-VM0ilEf&k^fADuLf^pw()tg#(1$5biB~;0QpP`@yy< zI9+G3_#%AZ5OgyYmEq;gxo4Ji0C>=QQ!)IagCJG64Qr^CTKyu1iu8IREMLTYv4B_m zJFQs#&~QG9aDHLHy~SoUxsDwA{lkYp=fAdE9w9&)G*lS}K4AaqTZ&;gc5Vi69E_*@ zY=817^P&}@Xd0lt+l2(FFWM-e#baciCop5$?Ew5Y!f?T~GO^rd97pc9BzVm8*ANxSg5CIjw1q zOL`qX#4K>gwJm$SS}G-*FnoLT97*HdIk)R)9f>@Y@+JG;vG}Zh*f#O#!+AxXujk0f zC|exqdOWMR&roV{+uyGMDbA2i5V2Dpc$oDYSY@DLAe`PW4`EdwtaN@}e$)?gd@HD{ zu6J^E?{fhgP0JZV<9-fYRqGn_VAp8%F+UQSt->Hvo}h6K%M~tfJT4KrC2j^+m9vBz zEoh`>iIK|zr=Od?u+pjJe=)j@oTdI8iBkke>v@?NJ_BGzCL_#jO{6QU-X46$FTY?y z7m~}Y_CJwS`fA^U)?)z%lYi3dPRF>P>hZpI(8G&`*vqgex8ECUrktbX#$;TwRWN$@ zaMz*CNR!Q@dNjh>#l@sBGCR+}&~id!bwz=pwbx~vU#_PiY+ye7O z+}=qq13I}t$WjY!;f($}rxWMQj_^ymy~^tu($v#RqNx1!lXCcPTPH+SA>QUAV zt#%I8Lxn@5CJ*N(ZTiqV?XSf0(RE^Dlv^+tS#EpdX!tsLW+8WMSlDZ#4;hw(ugdk3 z$qP}7LvyHHmOOnVq1VZQb(%RP@?S&8$dgP@GmE3Eb}X%U9$8+eOHO6C_G}6lwP7OkT8{CJ?nlQE`Sh{BT z;}Yu$$b>^p^Y@T;2J8Bs#U4!0wK_Co&>xX86%4k5_SX+5mPw)d*xq=0aYlcgV^K)n z)!d;GrqSRW*-mG}@}$>Q3i&6dqrXloZ;l$NEu3xqdv%=I{kSZtDSscS$f+Ni&NAME zE-Cfas3D8<$SbJW8KgXX$C^9CMT(-SgdrMq+E94))Rh^V-c6`r%dZCL&Pu0aPTR7p z#$8$nwaE=z`#Fk$H%!K)DeSG`%TG<0v-N!T_X61KAU9DBdt|23mSE6CJ+&G#Q)o9t z_N7imo27SiqktKz9+!Pl;&Ur+Ngd%Q$85ZgIQ2G~F7R@UQ(7LIfza%WF~-I+oVECT z$+`ff%WU-JZwD|I*)p+{-hvyj@~Vya$~fd^FPh2>3wd0vCT|rWDZWdP@ZoN!1&lDy zbpzW^WHH`aG0z=#0TI`7aoN`;vP#5hLx;;Cn5QYykH8Z$lfkuCOq`VMM2i)6(ceai z?FFUIMY@!W{!HAsPmAnmygy-LV04U0fkl((aabPEEYD|VO0{Wmk)4;XDuAVSucSY% zh_q`S89^b5&Fb`$qgt*}tbiNiq7gGaxdx`eeLQddt8?L_;uZ5lmQMUTt+2+KzAZq4 zN`x@`GuP~7rejbEa8CY3NVo2(o2?LdN;CQ=Nz`|_t5m#wgCdge1LUTBy^MuEF>MU! zM)zw@RxWU3S?*ixD$3iQ<9|m?DcU9S+mn%L+DS|vULEst$jH( z4dHcUmUr^%WYE>m6sNd?mZy>GsF#OvXtlP5s73)~(vd@3ASYPQf%ej}%b%5E9hwoSFK8Obe4 zP=Iv4{H;T=u-GRjO@73>x^HrD0g$!NFz+XM6NowJ%*%ZOmF^e*{2yvh(`N=$@Q z+aR$jjRJ2LNnc?LG!KYHo*$dqitP#8!1%qCVF_u?b_x*Iq57{V+o06WKe8I z3Y%>!iHmJEw=d9f4OTauwMA;IAI@@L-QIK(oQ|Oz)8a#o8r}U=Y zaWC3??XSyidk>nem}l&SSUvzu%5a#i-AH2ebuR5|qVtXB{8B*eR1T!kNJlQJ!vb|& z`sSN9!WgtsF15ZSFqjAe(-v?8k&I|nzO++C602$Mo2AVV_+-cTnR;gSFiX!zbM5 zCQH;Gcb~d$;F}4)*%^9@_4w70qaxc0#}9KW+7)5)KbQ`h^@`2HVXFvz6usHUUzs}v z+JCCSGz#U-5i}cmGVFCpqnqCU>pgrqwZo}REwygLe;607*A*0P{`hH3OkJfl71$e? zy5+-59ItEiC$G9tubgJTZNE=k!k=FD=dSL1$KM5X_S$y|e>{$=zVmK!(1r`MRxZc@ zjhBpqdsg%pa4JbAee*5>gZcJ%ZA0?3(C=4K4l+wS%(%5~Wq`}T*-r#iB z>6X_>N*Xj&Hqfb#PIotWqrPCJ6=Wlx)ZKBr2ja@xOc`t8w* z&~G!LLu!KzpYV)FoxVJmP{A~t%=)))-1&XBp$rciPCqEBkt<0X%w?BiN^ghnn9G4I zK8IQQ_Wa=kU7+~+W$=!q!0UgAqUEDC-hu3#Nt`oCX$fLxEjfTa}b_D~w%veHf z5G(K+4*TOmhXtFbUM=y;mqm!Z7j_^LD;*jY=WGsO;i3=9hhThT-O|Gcn}&hU^R&t$2$-Ib!x#~d#1 z%UXeiB?r=(mMMrV>CORkRP3lEtxd%hLlNgQ;po^MQQEM1A-qv(@6=4byfRvv9v*Am zXJ6d?HLHM)kXBWg8D}0!`IRn64&`|8RvL8=dLI#0T|L_45Q+C3_$7W@A^~xCY*t(cgS}RpFNp2?dI$8?bqs#KarIdA+V<## zVfQFBrjKOci*X+tU3Ae%d_))js=WCoOV)Ui()0|sbCJj%I0%M4YJy|bk7gAey!o-x z?%ZI+qH!pcY2$fY=8H&c2?Efk{b_3Kr=DALHpH&3yAdtv^mUPXX(dy%p+1S@j+WK$l zmbv-=Cfy=*+5`*+!~dIc>%V5hzQXWp3gt11-ZwWNw6eNwW213!&`h3ud&-o%US5Cr z_ze5`e)RVn_46I`_xlkrZG3vjco_F*ROEkhTtwXAytzN;C;udDTIp%y%a@I>$R7V? z)sI}!$6r?ck)5?PIy#InX9b54H6vttSXfw8R8(wi>_6_Txk+>9C(mEBa8Y`C`tr=> zE3>k)v$I#MSg~s5sx<_-wRY{s4I8#@*(}EK0;z0ANy+YA75jGYKCpN1p#ul14nwf84(}_Tc{L{d-^U-}`v~ zzV6|JH-G%`>M!l^lcDENhF%Okeev|^%V$qtKY#ZA#q&=uo_~A!;@j}cZ?A^GzIpxa z-J8+(Z%048`=>z^V_T>s(V`Um$K`v>&;{%^{Q zK)inZ9hFFI|EV88#)bN=SL#{aYa+rVA_YaZgQ|4VuOAEvzO=5>b@ zKjbu3diT53^IVrMYsv(#STC(46-{i~Tz`Gfv>jm7zNMv|lk5&;Zm@KbXjNpF%zJgq z4sLD_yvz`ZSd$ZX!l%0(8{fubM0dR6C12`U*MDH^SL+vy>`Lq1PV@|BCv69VFl-qH zd~A$8kerfLU(23Ib=H@*#0c0%rN65kEsQwb#yhonuOqrI*7UodGP21Et32Mn{NUDv znk+#-p1?N&T`-*HjnZjcaLoY{3Dynp*_ZSw@p~%;>6D2FNI_ zUi4PerKc7wU{hI}Lh|BRUTlEdV5Cv>VLSUUuA#ecg34t}X_MLnES9Jnt=Tm*AJS(X zSa&lgHRQ!Dqx$Sunyo1xKRrSsKs$vxdqQC+i~n0~&58`o6T(wq;@RCV1dxTpS3 zJ&Fv1a4nce9X2ao6nV4mL+LN!yY4-jY}Xi7S88ll+H|GQX!>bB`-mxwbXi|iU4h)6 zDW#3IEbOc9PX~23E$xjxC}g&+ex@YV4v`Kwep5uB*pXiQYqHWIfg0oWX7(EBArI~> z3YVoj)w=ME=?dIZqcwdVROAdk07xxLvj(7mWut2|dYiVffS|lAnD~UpI9b1y(*ypC zdB&)RNjJ*T?q%_V&OO}W)THcr-H#Q&vxe6-33_)6=aq!%l!lu#dzmSkQ!-2CI&h$X zl--9%R$jB3<}ze#mn63=eN6%zNv5AM`IqJzW+`8NJ$5%wSv_Ub%sSp^+w$TwolXmL zB@=qshLZxank;C%2xg9-l#k%6pPQ$$saDYFd0YWfdL}<@kgw*Xud`0Zj2+S<#6*T4 zEu;5EN=T7)v(|(G!&Z)~^zBX}{^&@rhxJxRkdG zudlgTfp}LVMN>m|(Qa*CW+l+xGSV^gU&>|nORnNJz7osk%pRkF^-=>m3-@qQVln=1 z*@wfeC5?^HS69W{x7#}5rvL*di~_U(8Px+|Py`S*=tJMcgy}!1zUfPwlOucOHTq}-BkxvfmYKf`4wd}~Fl+;Md}#3k+tH*cgG#xn z0@U-eP_;FhU=hSff;mw{&_WVm0QY*@svnAnwN)Yc^LMYUxoR1J2_a$uQCkG?TTCz1 zmT)Jq`U_ku@zp*GkEKy}!PAEz%WX&ljmn}9#^7e}YTq=%W{Y+2)6g=TmTrDcX;cm| zSjy~a6KO!3w@!4A8DtaH1}LP`nl@Q$M{Q9SxGgx4=oefx#i}#VaPZCs%{7c!wv01s zkaEwr*}!>RDZS0gFilIvoNB(_<`a{Z)s2(QoI4ON&Ow^*3p;Sx_+RnwI`>-l9)ZR@ z6n4Nyv6vWawCY?X3TImZ_Yt<8*J;wAj!3T|br}JOKy=XZgjF9)-xq{Oshyg>pR=<% zY%OKI5Vk7uiLly35h}X@&{hXTU?jOMqBUe3k$ba7$kt3HzaHiCnds1gc0b{m&&ipP2O80O(rt`Nvb$ov7_X zu@l@yu7zK6Az8ilc*ox;A^ziEIb$ST08 z$#U;RYcZaC^SgDX+GO1YD2K{KkMj*Cp4JP&)T_Xfo%vinP=1*YNVL-iB8(4TJFon} ze|&W!f?7A9m{%HRK6>T1N10FL(_8Q&A2peAAF-_mLQq=2kXo$Hr>fCYN@Obrd2%2> zVLph>-MlL%a}ux#N4Dxf#F+&DO=L`L#-N88P@|zmn;PucMcM+f%Z1s)lhJN9rAkSu zQXyN2g-481rhp6;D^m)f$C0!mMUsJf9xmX)m(hNl+C~UPbVxZyD-}VtdB8>{T87Ov zQGuo^00E|>9ALA0<<~kcR!tlEH|6CuA@14z^<@M(mx=t!1`0Kh<(JJyXvQXdmX~^- zf|;hLqZvlID~|)nxd|)VM1UWRxX%G-YQSAbuF+*gRny8I1anY!oo?N5@5Yx*>P#sB zDv`ipg#H3ZJOgfGB7RE1FA=)X3z6V8a2mCaPYP0^lwm|7+VBOY_y}fDbjUk%$g-YX ztwzKGr1`Q%zXqAQ58x(joPU!45<=r^T%f)LV%D!FdHDoupg~(mbXB7Lb!4G zE=cP{2>XUH3W;^(5ELRSOSf{SgK2TK5@_v9i&h}?-Am_ofI7i2X2c-NT1nomlupM} zEO4lojmnu@&F9W~DM0>Y0i_svPJvWC1zgvlC0bB-M-Lzhz=Sxe>OfqRJ-Ih)b1Ui` zY2K#t>$tNfz?)j63;i8NwyU?&RS4vjQ(FO*;nJpzO(A$txeD52zTW!z6cbbmc_Ab= z$xmKUB-n1G1PB35ehXBjTli9kWb6i(ZZHWwZ@y|&lAG_`sv(cx-fXG>d=%^G%!-$s zUq-r-(IO;lKd=cyPiVLxj?%WPFqkLmg3}Z zajDMeNWgv$n0J4j$sDNA%L*#olQfNkZbvZ#1rn4@@xt>vClL$1DN_U(5zGNIkwzu0 zO^tB&Cmn4>r<_N9Gz&%g4SS6SsHHk$U4pI@A)8dtCK0kzLoHM6FricAia4t$ho&>2 zKplCzvhXFER$BoCtBREK!IO4D397;IrGT|vufQeLEA^n>-N1wso_>}78-!cnf)Ns zeYBXsv!M_H5^Cw1_mT6?+o0~1)Fr6-ucV(+nKimeWU_3ya5{HlWt6iGZjsC zPZF>DC@faRzhk4gVr2slJtaV@mH<#Lts=m!2&2WH-fxXVjMlhFS<`JRYMFpw<`j)u zGV%=YQx~(VsmpN#fTl|N(LNue{8CFRMq{cXYY5m>f_J(uj=rryfYp8v20DZv!aTYX_1Ad+ymaG*cwfla~mN8j3;Z7-xNDHKvehcmD` z1#Q(JHy;IS_9i{KT~V*zTD2PKeVCqmfV6od({P$w$i4Y~x&R7u_e&AAh?t`o1Z$Vi zlnWuUuIS|;@o}S_8~){8N?Zh+B+OFmzktbA@t(rpkZRga0pM3jdYSC*5{@`cqt`PH zk=V0HRd2S=|Mc&{XS2~ZtbV;4iK^_FqE=Wa0J(zTyBa9U9{1-bI@_6o10-LJ-^M{| zKDw@|Y}C^-13UQ#Wmu#I2KZqIDzbUBHOuxMK$h3gb^sN_XZHs0CwZbPLK;$0CxpZF zF&6AH763s?BzuMW`qI8dlv zZEG3YIccwAb-Yy?Z3l*I5hF#EFtVNZHid8eoLbq+WKE+S4L!wv* z35v?q(8I`lLV;+c14{(qG-hTQn#(Ywy|_nTu01t=ymxNu*|{3>G|}I}KlU@gA4f`5 zzglx@GS@bs$Jsk1M0lnD3LiegT`5J~24oTNB)t ziB{eTPTd`tbtO=uy+cIvPR(zno`xcx&FOj?KuKJ`9jJf-q(v3|_E{w{Y2_{gGLq^l zHkDRVP{=WejP**nZa7{<=G>f=C3fCUuW(H+5C{y-i|gjtlhi?E!P!RbvIM!_Z8v( zZ9?Q>WEx!l=s^aMFQMIW^-uW<=C?wi3Ye-Rx392l1t=0FUPdW%_yy|q20NaY)Q}}eXkY|paWq#WTtaYK5lA)sl z&Z>FtsOAU}W_!n#q&MX>9jzgbYRJug%Z0xCjC7C9P|`#JGzYzqfPo!nfDlau{=TPU z$z2EQt`776!QPt&HMR8*y2;)<$xZ^enP*5KU_gX`$UG!r3WFLD5$AxQh^RpnQ8}JW zKp513D4^&`5EXF>3X0+oASftcKvV{Ypr|;W;E0I4H|PC#cXf5&f7h+LAG&YVrG6h$ zq>AFxs=e2G*7Kl~ZUT{SwCna&tCb19Y=x9IbbRYsu%8gRF(mjB?yrO3UOFLa?aJFi z7SsvF2wSvqP zh`{U{2fAD%yA0Qz*{67D&aE4nLHNZ%cAZS%*!^8d#Y6$I*4dkrN$vx{n_ulTE z*N=SKt2;sX_!6dRuIp-mtFOZVUIfldGqsx((Y=tflUU1veUKrX0`OOKt&r)|Xf22u zVD&B(NJn85U=e*7n1G2NQEnAX?8s$ZHJIFn-$NUU*oG`?KeJ+W7Oft2%jLz7y^9Jo z^UfF#Z#{`hd5XH!I7&p+XgmL3Lsj>u;Qj0>8pEMD#o&|z=f*?PoIipa5a0U?scVp8 z$D`QJQ~>v` zJHz3GL|Dxh%$Dht$N}-5?%IA_t}*^%u=9}x>BUpceR;&BVgLIJ5j~fW6~7nyXr8!| z9=%Zz_zDRY`IlQ*&*{INP?#onh)P)fF`>@?F{!P&OYdt}rv}gmsu8t-R~=%$eUI3= z|6`!g$Q5h5dOGLxtDdZsmd-xfK{xxBfC|fCr_409H`3i%=Q9jO8Dhmd8O6i_x(oU)g+F)Qq z-t*o_3LTz(R)w*eq>YuHT&XwsB=?1DoKGa-G5QKA+#`VFvyQ9$wCU0M2V^0su4rW=E^6Q7c zQ^)kryBtpP8vZU0U9#M+?>O&9orhw7K?Xim-zHtc#{jEUWLd_daNpE}#xKzwIu>wB zWn99p_ygp?2mE>ricc0k%AQdt6#(^yMcPNKpWZ^#9F1vPY?v?3=ylqPr1ID(^YD}6 zwAgP}jIv%e&vJ$}CYh=}!+2vw>31-Su$$PPdiBl8md%B%KK5)}w$B@V`ghjYiMY;# z;#srvYLd_pysb!LJUQTmbwY33bp^k6JGtOR@5D>)QIlptvD;l&lbmrlnkKnYzEzE7T?;z5|7^Y>OBQzW z&Bv|Fw$KOlADc3v4~B<00Kw@Z?|69_hsxs(?Hpfjnnix|5p6*??|238{C4BdfBnnN zh=P@Y$OIOdyIlNe#;(oT8}ni@=x@69yFxPkF&qsIuKt0*rL1n=9{WkOVQ8nwNh|Me zyURltbx2nDyzps}DbVS1cm>s7OO%Az+rV_2@2Z00(S%ne*`*PK9B*J831K%BJXI^U zUqcQoT&?vVXGrYIHLbY17ifcN6k(y3+}gu+>r?Vp>urE$WPFl?e@2GWGu?T9A7)u}*X{o;1D|8=yEcJUwb;(3OR7AY)0at{myV@LP&Y5kYvEo=QeA@SsI~1jv`CHhKHkb0GFH>wQDdN z|3z;FKlm;H7S2yV-#AgaG!d9Z^?Ap(ZX*PGPVCMj9cOc-GjKw6jgdqhvf5TETvVMz zcop&?KAH{~h}57RwH05c5V@w=ovrA|kcFZNzPr|?GdCy*8B)-UMyjUql*MWKjH8|; z7gKYrgOZ(RD^YN?;`T@@5BNi1KiwC8aSto03hYFM>ZkGTih_*!@m4--ZD+p7Dlq38Vu*g`d{HfST-u6&}%BOcxG@CG+u#$GiyjmaOuWQrNd zMR{sF1MSr|kRma}n}03Q-5E+0C!l5+0g}j;ooLU@SeUmw2u6{kRW-_ z+@_DWLFn3-B05Bp@=QL+67Y?XiRXtWpLbSiFY?H%Qs=&pC1qixVn|nV^$7e#Jzoc( zr>D+C1=VGdr8!AhiUt_(u)FXyU1?lJg8oI|57QC!k{~+pFB3HJ+NQ8orv=~~y_d$P z*h-siT+nppx*GdOqSDveLxW#gHiOtM6}-wwsR(j;905gpnBErfX$+AC8BE)bH{p;33aiA%Gt<}RaI zt1z>Y8B!G*gP(~{$gg%pBxUKlG>zblB>7Tvve81l4hXNTz5Kg~>^H8a!~ zEd5^kBar5}o`>@1LJo}z$bR72cNPsWsFYx$CacNSbvw?q1hmbm%+=hv|H1z2sSoe~ z=Vp#G2b+=}cn6&7nza+stt+!)M7#(U)~Ze87VQd~H{9nSy3Wq-`7pVw*qJVp$-QfXuM^lm0(1u^V?>aC@Sc#YVRjok-xTQzd)z# z;-~F~!{GC1-r+1x-uV!1r)HlS>Ds%##=voV*ojuGSFSovDv60f_DKkI4?hqZ|4H}WyzjO(aa3- zQWS(_^2`UV@=2JFLd2TemW8^pw>bQB@ok5h#2eY&z*JVdKpFmI4&aI^`F+HD%eKx$ zKh)GRk+mPrir%b~L$4VYz6wEEr(xC<(#On1=eg(t886n5XNgeqr6LDX%bwiGbbG;^ zPX7WnW{D_7I1u@(1(>zF^Dmt_cC|&plgIKk;AA>8pB2%}LRsZNEU_p85t;BzadJMe zQyi++UM4|l>li_7=xMSzPSw26GLY>VO%Zn#G{jQdrW)d%lFw+*0p? zL{Z4L&=o$SRYDY4$G1r2zq*GK)^z5XVOVB&meoQH{*216Zg!Ji;2&jpGJyl>=cf+Al;DO95 zVq;u+Ay<^QpR@z_wyG?C|8?D{$ZGIj{&;jf2^A63R{BT)6WufO6j0fq!-;;cRpu=C z&e+OcOyc4C_eWh?faY!Ys2@YTzb(ERxk#3HzksT}2V6T-c+QOn7&P4&9trfRYY#p+ zP|jD$jQah`@RpF!#V3xksxK1ru)Hf8%jH{hAlIhjNh&B>3PsCBEZv8RH%uZl`|g$D zF$Rm5J$xA1^KjLF-$VR=Pk9}Dyz|84T}_X7cRbF0`1p@UuO9FD_V`cCAkTP^?=UEs zKPU_v6fGIdOC8MLK3I@9C_Xq?cw(@qX|T9su;k(3-dBVBz76ij3`vZKN*#vE<_{eR z8!BHibTD=3(DtEY`Uk;Ww> zO{pW7w~t)O8)-f`a`nW>wWg7lj*;sRM{c|tx%qA67Uqe<_(`k7leYO!+VdX&XB^uC ztzS$l8q=!B{&OhpKmF=I%8}ZTq;|ALN$qG^H?6r$3%zO0Wkll4zk`&M`uZ9}!w*JA z?~RQ=n3_(QoBy!1{0Eq`w*GBvJ8ft8%bxPf!Qt2J*;7>Nq_fjk7nhGT+ItU=_wzl! zczI2Fdrf(J{lmKX`ThAGq6!<-a*=ey67VPFw$b z^QPa~+kgL&`&%fS78guwdciqhh4J9g~YwQE;yZtk8vd-6o0lH%g>{gR3U(a$vSFZfLa{0@ZE3dCM_ussEThXd)Yrn1RxYKdF>rUsr zu6sTAx_j>R^mc2f_kK_BgWmfOd+!h4zdzD@|4nc2=brAL_wN4c(zf8brn~R`Qr(|= z^iXRk`}$-=^X#cc{rvN&`s>RV-(HRVc=KxV?VF$P-%fpa|LgC6@{s?{ME2wBm+#;H zW4`|QuAOf`etet!@%`uIkDrs1zkdGw_e@UzoSdHg@sFGA$G877-?bmKwleKk|Bgrg z6O8;HxU^sYKw$sSY5!)_{?9|x{u`tA|Kx+#R(9+E=h*%?b8KS=Ci|E~s!Rnqte3Iu zVB7ty&}W{Uqd;#Bt3+jN?b@&N0lDCE zoZNL!cN2g!@KdXAhaFV(DeaysCqiJ$m?;LrA~wQ^F^vb>eNJc#ojFM+ktGh%>n-lg zU9^bOH8A_H>a8JCUOLUTHflgTD|cQ}tikpzq)mNQ*)y%k>1P7?q?uZ-@&1$0cU33h zjht~ZBPA{;G}|s{ew*&Z?uh2>+NeI)kTi*t;VCz*(sVBpgjjy_PzVhz)m){%^R{Dx z2Q~gj0D}PN*-ki6`nyLTNI9&$a4FcR>7(PzV=WFjqHB(iXEn7#RtH^D3N4u;1khu0 zm`yijV#Q7p){h&9*U>QS`+rD08vb6h zGTkuLg)Dx0qHxwBwk(1+noofclT9kdwGU0eJ^Yx-j8l#phs4fZVnpVK(FZJ3IBsSz zL%4}4}Q~4U+ z`CFQ-!y+*THG-H4)CTc5<75yC3NMc(9Ttb;ZnfeG9wfc`&g2lsz7FLHwu7DjVsozz z`SYXBhN^!=9C8G5Q75UbX9+)vGqL(QeY&o$cvHA&dShJU9MqX^C;(vzP z;Mo*3KGVl~*6KSbN2|CpxXa)dG|^oq*3n%@4e@F^-D5$UhrgKx>3LuPrgO641$rpr zw^Zc&N4qY+oj(cL724|bZ*7_3fb;w%F?>ZEzLLPOTvz}t_E5v0L?@Ya*@?L`8#8Ci z!pO%|LJN%=zt#uz=92_5ct&nHm3h)x0(f;68*fq^4=6NmMo2ZJaH=h+_^BH)rdZ~e z*6v`^3Yn*&z~IW+mH%=Bh(F&@^#Y`U?7j_)q~12Oi9OO zwkw}4{MpYBu;YeUv53{L@?ZRM9B(u|?j7Hnzs{WpIUkp?K&SCsmQ5Ys>>?gxO8dC>IVa4@4=0$`SDva$7rNZihXPz%F9De$R{Otu zdntHpb=WgY2_kkvn}=u*(E2efo>ADRmx9k3V{BN!7FtwFv+Q7j*Bu(TyR=N7|3DFd ziGzgBt(T(JgNPLa3H_kH2n=Cdj50+eH3{QE1uV_TZX>;8iy}0wdJ+Z1(xd2+rcuN_ z^!x?cOSRB z=D*|%^BqCG<};YNgY++P3i#D1XJ0T&7=G!eC}`a~TzTO6r`6y0GExbkKUF;AKoz4y zsk0h!nYN*w@YIaMa(r132$cxmbAEpfr99D~2d+bkEIRn=6t1E4`?Zd89JL`BX ziR0G+`o}C!(zhvM7_nD&PF|b0z_kaWG=C#4OdQ5Nkzd;Kp-n%N9qN$(v(?SAO|SI3 z8_#=LzQwl9`25Wf##bU1SdDg$uNCUoK1`1d88gm*1lt=m&`bl6Havsb5#?N1>Atln zUZp||fu09J(__66Knw13SZg{YiRh7Y3wPe6X2 z0bqK=p0{bA@pvoqGal4!Jd;(R-CvQQMg{8#*bKGO#g&1xOt}k&@IsH6ky+UIDa$K4 zkmcsW11n$|##ouX-&J>+APv#KclRNM;{L1ofxx&ZQJ`0513A{&=x6FM3|2P~W0Yj< z^R=+c3x$Y8iiU%@twdlpnE%+n)jbjTa%yIwlW8Y^ef{oM=OLLO3ptU>!IphJ?RaBY@y&^HL7RLHkBJlqP%yfHX! zIp@zj9>-ce&j(5T{e{j{Z;s@J`uxzX54Yw;{1}T6nhwr`wyOq$% zHtc43J}g_|-9VfvWHU?*DM3DQJ~U*GW5hN#{!#?waS(7;VGn8XIxaL}vOO}q;n7e}z+#w*ylW>8oimT?kba;0-8k6e8_BrSgqT*(MDJHn|pexr^G%%knz#+?DH>;QDt zjyk$_ZJVUJDKbJ)33Za8? z;sFJgaR=o_L#os)t_Gf14_ReF&6S?MnjD=U*y>B@p&!@TVQiwLzWVMPmRNSdDL*s%a&}L3N z#Bg0~;H$%j!`=uc2lYdahZJ>sN2*z}CQ=wLf|a1(S_93#f_6rMWbMUJ4UjpnEUvSv zh?iT=T$i2|Lv-2tB%{cOUe%MgVIG;PKFxTu6G_g$iL;Vf68t8f>AI&~s?nW=WYlH#k!P z%o0HfSs5R&cqj=U%3U`TEf3&lQMbN4^4Izev7KP*HvHEetAi!;&dTAN=3rpDK~-(+ zTGi=P9yXU3geT*npMmS|A}0Zy7)3nGJqX4wYNNPLKxZ|&H`&cn0cOxD41-{4ILgIW>;CP&`b&B(Y zHhf|Q6o_ITTUvMYbYRsmw&ytd(|6rHJ^|+K*g8{Y=%LDhXhaLHL}@@5iFWP8#-N~H zJFt+{XxBO?Vg)v0BhDs2+Smd#y>{_5>vExYT;JBcm7M*?5N^xq<8udn4UUk`S2?jr zJP8TfZU{suoT^Z`ooSvc3s`pfeBpp|Vh(Z6VW%iAi-lsEN%l0(lsjFi^xSw>!?@(N5CX$OSJh)jJVypm|a%eLT^7saRqCi$cFq7n1^YREY zV&7|@#9xoFH=2g~Bie@3gD+a!fTbAjt4tC;Qd&%`qRtq*% z0$9qrf?IPK)O&a8lxJH!1hHL$#O%YzD(+%O15?kCDtW!-{ZM{FNzd09|ELYu z#~_cURWnLx;ce9G(9i?zcYnMGGucExTH1F9>LN)LG_y6I{?=~uuyi|^QO z&s)rH7<&-NYEunf1?H&G{`4#s&ow{+vCkOSE8x<-Aejd^DgbxRV2Wzss53T@e%WGB zyURJw`#t1qr2&6+-LvcUxituAl(GU!ySkO+0u22bSP>=!^&+zJpAWmeE1;_ zOYOgz#wovucA`VopPNf)r&cmT=yJdod1#@kVUw`oE0)C_g&t4dn8WMP2B0$8vLbk& zljbSBbdB(cmwbhUX^B5zeIMU{?kIR3C`}h`gT!3?!fwEf?Ki6jpQ(ldd0>cq^_(8# zdMO-6zud5dVax{TicaY-Ov(saLTc=)?3=9ITQrU~-vGe{z)U=;$Gcc_NG^fQ zbp6jqk=!>zpB}*>q{WlPg;rlms+SQfcw5#^+=vi8BukghLxjd8V5T4tOVGn;dAMP7 zoMSiY`~vz{mk1g+IB_5HauuVo$wjV)w|Ag1s~Iem8q)^J--D^!iN!oZ`RJ}KIuxvU%}sts2J15{8fZo@XYu4$E{%*?&L`P$#dxagNR%jP^>*# zdyfv#F7@mX58jbb=~F*?F>G+LN^p11Zu}NDMCYznf5ckvGj5?}M`<4`DggFnAX1~s ze0tG}3zg95xf6OU17dfoL8gF|FwL*g%+=~@g_e&l}D=JTgEOl}! znE{vCzLMFJ`e6^>gKLq4cVXYR##IXFywR{#;7l<#6WT=t>-MZ!@d-@JB5p<=($vz? zJa~=Y=#M2W?ei)(JOC>P_eRlT_Vbh@fpKppb*sY{3TED+lXqp+LZGEd3lH|;s1vRD z?Due?>+s7N-Cc_r2NQ^`b>iqfNFn|BtLgeMJwi_u} z!*G^!wB-M>W6O@9@EMxX$9KES>7Fw$_u?9r_g&Ke6hL$u^dkgcJqJ$>jw^n~I4p%@ zB+dAf5$7+%sr6_NMQ#XZ^yo|=bD#Ek+x1N|cjKh>8Dp;)AV?uT-mOy8k(a#6nUGz#f)2C6Vf354mF8zf@m5z-l!mP}!LMv%W z7{qC{ns#yghy#W2C(EjGVx-0h?>()W+*?|rO9-Z>$Qjrp3&`_7Z8cx~I_B{IY%8;{ zcXE1h9A<}Q>>KB7ja*`7>kyj{3#hdxD8_mTyw=WFXH3nI7df7^eZ+FSWzdr(QI}|VI1OW2aYdaNXz4U&X>ED^@`6I4?unYc*1`E!%RZ;vJ?Qk9DWZv19n0iWW+-jq z*wO>y5O_2ISzICt@azZ$fKiXNqM)j;3=!g!l=z>7 zzEUHy-cps6EGnUhMJxU*$3{$zt8T@G1?vB1iS6|)zu7V?mo%ee&y^I%Q#|d?ZSg7; z;_VU_!}!FTu~3l6GY9RHz$LT^MV@JG`Xh;%qC#UIIU+NvIx`DJc9-sm!Gfi5HqC? zM$6M=g~lT{la5DWkSyW)Z0u5%^>5(xPDNmf9Mj4?Wr5 zt5PxU=!jZN63>cDWXiX=ZU76~^*%Gs@Smii-OFu0ZYr>MHBamFc|dR13$j5w9FKav zwhixNG96wrY951Zb4>%3czlqEOhR+n{Jd2M%)T7Lx`k~3$&L-s zW5TYwvBW&nbvI z>Jx%^`O#UJagVq#{gT*v5{7(zW~2kYdOfT8A6wb-Q{2E*gHvJoY*v2gy#7#pUWxSE zp@l2fhLj%IR5ON`_@=%`$VD_Io@tQkbL3vHx6ni`h3sj39Vy4l zKgUVijC6SJ%qaX@Br>2!iE&(-);gvJ-+e*be^wH3)}jc%2Bmec8e^U_h7-Vf(Ze&e zJGRPk%Y(GGen>4K(-`=9xokZn29Z%hE-npSVI<`)Xx#2m{v0~h=BkgIjY8wJT##Xj zdD-&XJB3m7P7(?q$y+KY9S$ z2~ad6N333pw8Q>3Z^6FgOT?qlVxKU-ev71JQd62zf4K^+Lp=@H@}wi47h!9&Ef|X< z$7Vg*eq(tvgYPZF*ebY~xg0bx7VcxPBzex|tp?;&1f%~#u;mZX6vATXZzv;Q26Y z`>e@PfC5d5mJhf{NMwpwU~-;=bd%#j?R^3A|qsyIaTX#I##T{GYoY1h0%3%6w zFKi~Dbz2+X*&4=)4yB1qE>^Z1NZ2B44QW9p@2}_&C~V_tud>wfIT^3~*Bn*Y;qc2^ zEsaj|S2-Ay=cr%O%^EIgxuIRIR}W?xgx!lzc<9jBti9xQZP2BXx7?9?-W2+}H_5TK z5|m-6luVpw`JmqRN+>?nqi`PA@a!s-(E4uFni-47iHYN+fX-ooOyWE z!7Zq6vNd0)YpdVdda=ni{X7=$Lf&;@obd@OC7jBx5?+vziO3{5J#=+UaQKKnK~au>gM z^X;tjNiDFXDIWgS-DwF`wev|YZXV9m!~~u*=j)`HiUK$9Slfn+TEC3A_m2#t>XE!h zkBW4odF?@S`C;*=hM&}*Y%_m1-!OgV7`kWuy%%O5H1Vq*AGzs-GTX%SDYZp)T1={(cVDr(yd;vPgZxf-<3NEOe}~%_kyhENpx3Z0G2HCKs23H`=dz5bRyPOJ zBc@3Jm2r}|3sW4Nh$J_+U2S?c;hZCT=PB!;*zj=yTGd&lqUqj4*M3UpcTxb$wb|f> z;E%0se;wYro#ivoe08mqxf*jEp^Ul1*K!_UHKTx=7)TeB+9-bF?+>6 zUe@PW{*PL6iPX^CquP*)z(ft_nEotJz`8_dP z9x!_Ede%JfgU3vpfs$F4-Xii5d_8>Z#0E5HF~&!JPM3`)Yj+`0=2)IIE>15zEw~DW znMbPsa;9<41Hf6Wz!kSm{!%z2tu98PWfnKyP27|;iypL_Bqj=sXf}%`c(!!W^LK?2 zth0isHvI8MU6;1}dGnpVhP<~>#_G&|l|{TQF0>K{wOhc^9Kecm9EaDEJ-{1cQAwNM zg0UNdDDU1&el+_0$&qW$lhnWMI@Sgp{}m#hejxt+{??;Q&do#o7aHEWx4df%z^4+j z)hUX2C-AG5zq>epO$k1lDr8U7-4Tg?=5F1S^<6`-(2!VP}$H{1?TlLyb;RH{n4x)<*Z*rOwo8-r5L0^UKN8Fy=yRzDwKHjDlLxo0k`i^( zy<>7up zG_c!!jxxTxv%I^jw)<{l_dR8I_ds{gSaK!ldeOuf6uCe#MviHM4@5iy;PhWfghVEfm3Ho{`u>?d?eweq`tSEWxUU-Oy8B$&@#%8Yq!y8? zJw9C{`zO|@m3Gyi{zuw%v0=KYar$cW^!1kMTQ{fM+oo@KOyBGJb-!23KK<%bO+D!Q zIq=~7qlaGxA5RPoPK*ry{bc0*(_rtBE(SzmLE9 zIsRtq?VHJWZ-0Dv_wB>`Z=XJV`}^bfiN7a5Yo@+_{vR5R|254xIX(4nyd7KLj6|52#_-6+)33jwEx=EOz~4b3^qW){v~va6~1p!bb9 zyj7|=X`MFM)BkEomAX`jRPmNQm{VT9;q}pEXBAv~pFx5- zi^Inlu;gf@D%V_3&unFS>#XX~-F9+k$Z+RCLo9YqL zV%f}X*Ku5_;9;3c%Y8_Fa#6u`lO#OuCh6rb78TjP^?g-yLL4oWvL)p%iP^~kbeTqi zyYy3#3=LX-j|A{2JwO6_RpCE|_9Jze9K&QP0%P`&d0406(D;m|57>b9+abT)Bzr@ag+r0oALODavmb> z3?{2e$G(Y;mO7Vz8vl|n}cSUz)F!T72Z{e)J)GdB?f!gLj2k_3HZyOaGt&9TAqtu|%v(QdV7n*eQ z;N|L+*_%`>OOczQZ*w^mz{72q0kd*q7?VbQow{RNNiSQJ#gvsys*0!gBaHKH9EOx4&kV{45XSEJ2%bS`VzDGU5F1m$|uiTPploNw7g- z_!O5!VLh@D&ql~GD(v@_7#m3kkGM?=I;!cl;nIR+j~BRIiK5t9cFxY`URHwxFjDs; zCa|0bYy?+gS4%OAOk_~xNTLsW0;kx(sRl>ip7>0^XQ9r7rMd++FDmbxPX}f>bk3N8 z%2#}glI?Qe$S}t=UxcKdz|2?haH~%CDNLPrewR#Neo@Tp**`737R}U zX39|n*i9nnzPTNPD@4IU5a*r!#fB6ME85h3y$QiHQk4T$R4pVxHVDOBAzh( zD$*UjlXqZc8d}Yh6j9xi1*SQt>DiKo&zNru1oEbO@>T+CbEv+EZid$ykMlJ2WJ*uy zz0lSbtMnvL(YVqvFjDkxlZ?ngUYy7#;rS`a5~8b^9f1;2xA@y_YUAU%NMZ4ZWPN5O z8W)a$Hacw>-LI+41hPoIgai3&_R2eR)SmyYYIyPup1&S5^g`0f#mE zTb-0NwZzN83q7%bdtzr$G@HLQ=?33yoFQs&1z#WJ9J;{CBN!A8x*=gHg!8IeXu$UwlW!(E8@ysxCz5>wgj)9wI-68Gkykt|IZ2H$^NR_t& zS&U-Bo?NtU#taEGDCe~$5ewMH83NKYdELhv6dvUySv){r<}IJcPH0`(oA<8>NhJxx z2}WET4(c%_U=V^AOF;S85hC4ozM1cCPc*19Nw z663@{n=8;4)}kpSXt|+Y5!X3{L8RaIjmJ^`^?jXA_M-i$@LUd%)S+F@ViL8U6D-ti z4-!tmc*p2jC6)+%}q9h^-A#>)Yw6mPZ8s1e!0Gu%mU!~1!!$k~zP-i~%) z$9F zef_0_Y;XdHKNO;0?vfmaoK`JsgXlPY*o7Bira)V9(Z(v;E-&PZr{@9K_>3Gds?GGd zi2p+cx=L0H6p2QPJ)@`%zt+K#m=$k4g@8UjfV;TQ@qScNN~5h^-;t2#-g8eG0qf3G>uLki}Q;5j~Uu+zfpZ4tZ>04&|g zYsW<{!TU+vr^68*Z@&&37`=l#vKH+~gK|lbs|xK#ikq#{50C5cwa?sdP2Na z(jR9;Xi6p8c!rlJQv~pi7r+1knD4$nQh(EDz%dPNAVj;6Ak|jFZpj`;T45ax+6paC z`Vmu!5M-Pz9U9o54WDjD*>Iw&cn6Fm+bwA^Lf-DyI{iH~Fi4IYFn7qyOVo3RmzpL( zL;4vhAx5>{L7FucHTz)!m{Xo^)H)}a9%w=X9B2hPY%~Q09}6${&`8lrVOiU{>ZP35 z4{+TTK=jMPAeC><6=IDPd}{A%jm#+}ZMTw^Qe_LuHSE4dq>xm>TU%tyAnwtIey;6H z87?D!2KO4xA(HVt1x_R(3}0ThTaoBU59ZSVT_xBTy6M-W>LY4?nFn04GEktB#61yIvgO(*`Vm{?u1L2WjxF>IVP1(BbMUV)_I3~N2*Bh z9%OSJ>d-MCu#0uvpNo659;EDYT2)9Q3CN6skV9Bphyg0|rTR0Z${q6Ip@EG5pn zJ=5?jaCHDQ7lMC&&*nIw=g|-{OM2Cl@b?aO! zL@q{KD%5JcmR<5#)8T8TI!ACPdjnJ{;7Wqv6y(>}WQYLe@7P#If}WlBCSHub zTZY3l5X-|GB`@YPFgg5cgD_1L>e`?tZhzn=tsd(d=3em zeaJ=IBXQ;7T*nLD$6Y<8$45zo`I4rJvU51WA}Ib?9tUWh7w3e4v*p{lTayIbfEo!t zs58)$2%Rc-d1TM+UX0E*)7wi8Flj%mLjncdMSD=NUlg%S19I-6wGQCH3KuFJUNFbt zBoF(o=)#%Z7nUjf@iJL;7GRxzNvOG8y>@5f9hcYR_!5lIAMDCeHO_K*4KePBM{2P4 z&@Jl{+MgXJRpFYCL~NdoP-e10Ym~@bh|Y;1TB_(lin<+U(LcOPbl4@p1n%1#prQq7 z)Yd7N2ii!TEfH`RH-|C-uOKzWuDGy9J{xX0QT_6S!dd#%-l??)m?J4M-~^&-Vahdh z{JSkYg3sy0q|Mu%=A+`zaB+t`oc=HN-aD$P^?%UaB|Vf4gx(T52pEbGdJ+NzL<}7f zH8ep)4T_58Xc|RCjTA*i4NXx|gQBA1F*HSwB_MX?1Z-GOR8VX=v(NWC^P6?&{$}03 z?wYxGP1XzKk1SX#r0sVw1gmMGKQm77YG=_vKMK|$CkfE}p&X96BuguZU{MB|+#sWOithuN}z_aWi}P5;jy z{ke$aL7=Xvgs?|_2Gwo?j~4`Yx&;e^;YMPJaGTTt)9KLCaAyrcL@>U%hcLcCZLGJC ze!`S@VEjJUM()ZMZu6sW5#5-*_XQ!W3w?_MKfgs)ifFPfcf|$NHoVkhh?t?e9M^r} z*bnR)A#5W6%@m-e5cHRwXEOF0Bq2<>666Cok5@a_gAbEE52KJ|bslY(GW zpK^O^S`8!fZPc^Fl);Z3kwd}+x5aR&CcFxPN25VYDm*m+`F_UtKGss|c(=Yhx*#t+ znZm@l36u>!)eZ%a^&`U1_MV#${W;O{y{*K{ag1o}o=6@)2wa#K^?fOG7E&(XXM=Q0=}{&^_%}_AArS~KJ9x9Uh_;GF9Nf=LCMcl`n@rRo zL+;wJk5F{o`@1DJMvj3H0HOk19yVVX83cyU+5@gw02(7ugu4H00cKzy7|P$?sUUnL zGv;6123j}$H38}@EMjZ$+nLDP>j4&Wc+L#snPn=H-3j4m^!`1xzZsS&i4s*4MR|9} z%^+gk%(x#ylF(L6Qn#LD2m3vuosqn5inTTGe?! z?GA?6NpZ+Xja#`1d4%a9nw;=2o6$1UH;5IdjryZWTG!r z12VA{3k}vV4%!HF?bWc5H-af5oXkiKQV@VzVz4I5oQbjjOk#Xns*XkqJFg$# z=ykb@aM+T#2{o{&;ok%vD`$=PTmbP^pv{Yq=Bhi`PeV1?NSlDLMYX|+MNCyp&fbA( zZg^*C;Nq#;PFQ$2@G^|gfJBN?5%9rVv!_#mU$FqnxJZ`pZpV8f{j*tY!P!D{*oODk zQVkDKh<|KR+YLZv?1ER%p#{6Br~IQr<^66SNqnkC7N$wjGKsbwWU&ll{eH!^jkg{6 zusRk$v=>c^wg@caU!<+f;@muh; z9aJU{2F9{)9}-}7Z8-J3F?Ja~Jd=pTqe?HzKIM`wfoWTncwrJBsqV!Y`z{m^%&Voc zWE|Ycjb=suA#TtTj*QWA2W<}bda%!*)^{tFWW2KyU8Q=2Sg%=JL36Qki?7yHaa}WU zHzj*CiU-QfKCF(@M#Q@={(bt{Wlw)EwM_kxabflQ(Sd!bv{pCcU*D4xUfxaTl$6}) zqP5IDw1DLEUWFvEiL^bvB0C2uCx+}!GS)uHC4^rmIRnJ=9qV4bF|Xb_{e?T)HI~sD-T%hTBAa@F;BrMkSP&uAy$Cd5A8ljX@%y6)pQ<63Z zH(|)`cfFOvbTOc~r+G*q4<@J|Z^n)bGMdZriZD*iF=+IzMdi`v13zYv=jymQFifQC z9AjpVTEW!Km#ql1b&$17Ifj9yn7`Qxv}&5K8W0pd6 zOb{H9dDx5*Q&B$1zRuK7?**l$cj-!RtjBqdgK_DaojH=bS*jKeei>D8*ig%ysAaC1 zV8RT?HaVob(UNmFbVr2WyxiTtk++-b5nc;5m^v;%AGY9>?dMIy`l;rFe2MegQ+%}4 z-s9$I-J%mkc`2YbGHoJ>p%e%nAw8sU^Q}^I)BB`FOKXo42kJe^s z!19=9S{>rO+O^75>{;G7U#s9vao1og>2&iBn}*KfH7o`WrSBZ4t^JYKxR`i9*E8gMn{*xGgZQ82A_4V zJ0QVQR5!Ig@k7s0EnTBz;9y3!G6I`PbF(- zOCK?!LeBOU-4H#|X?*D7PXNphBwtWhz~wuuRQH!L7*=d;{mMT9Rqm9d8G z3L8}{y79=w#nGi4v)N^NoNS9D&xr9Q$Eh=A>Nq{B{f{{uVro}>YFT}q!6cbh;xej3 z0WB=K8k|u9*M(rH$H)*Zss6?!%lJ~tMqrK;L28*8SrIg;#CuFOTSNrJB%Ek9*f7n~ zTdsy_>M`W-g9VKBywmNdu@+M1M#vPXoQ6XAQrT>2LV(L@?dyrb?r6n@tLc!nG#sWT}%x*+2gzEr=zgXz?! z6A%%YP`w<|_tpSUG7F#bJ5pL;KNjuy5#uV@#tLd#6uKu)0Q(8?sL7fOu^|UO zi!GAe70A=@4@>p)8RFPVQDqXpm#C+hgX1!xRfQt!8{C9byNtK(nE-!{b3j9kUFreY zlokkdTplX>bf>LMQE{}XNuIykYyehm{sYbp+gg8=K7 zsh*ajkS~t@_~(w4XHd>CevvzWw(}_!#*q>b8RQCpZB*PPLotqEypRz|Bm53+Lnj<1 z@S-9$vi3a5#iyu#AlNioGlusz>(TA)AhS5PnTGW3bD0xCx1KBG@Lt%JYkNg4C(auj z8xl5H4sY>bG!D*A>)n}Ho#V*p>A`swjDOES(m73AErm5$H@-+0RmmR-tS~#OdV%CM z8fHhXK6?KYQO}!+tWlb=It{ydpj(*L`@Zu}-FT z)S+U6ya2E=7Rz`ipopGE>sgh^k_iwYL@6R?XgZlCpQ*Jf&m%`%O5L>dd3XOR^FNR( zq=XWBT#eOCe7beD!SosG7Bd=Nwg<6gc3>(x-xoBu%c3}$5B2BLL5;aM*IvZK4Xuh< zEPs+((qy!Q30u765n|h37-uQO7miev{v3Gx;>ajg|H>KAnj>osL&Qkrppe|9rtZ!6 z#F{ilwgp4Bm=FK=1JB-ohhB zNwdW?xBzqLQG;1Nf%=eW;8h`gyv1Azvk^=fvqj(nUrA(c zAroN$Tr&Txn@lNble#OIANrWCIp?JWt;Z;-G)~pafe)^l}|e2JsHDVk+jy4@PkJ9#ZZOriV(9#{FE7Np(6iP8pj)cs}26advk~Muek+ zae5WOrM6e+$?xe^ko!byX?{@j-v)a766hbTbmU;4 z7aPb(~@PMr5;>n%DYIrT8JJ*2yItJB=xV#;JCU- zy0fls4`y{4K(7J_(<@nq?oxwlG#)JC@T8FpOmLd0s7Gk2+93rnw)LQ)8Hg6=nQ1MO zd`4JtL=STHL+fV+n2RjhL=>SN zjt`oqSIpr`gXR+w)sWo=uAM`Fflt48+u+vDKR#@@-ZnD()G+Ll1r`Jo;^ekZ*F{n_ zKzgN-j!eXwIMaoAmlqGTZ52n&uZXPdz1YumdoURCJ8QzZhkgF29KIy@Eax&dvT=G^u<)l*A|UNn5t zoN?RN0TZf(Z6AoJ58(R>y+pZm=3v{kEdQa;QqS0msKGhp?tw^5*!kGoxVpw8Nv6l# zE11d{LxXGYl)W(}(x?f{TteyNhCu;S!g+qva5Z$(frn2Xy7PK=_V;TNjkKpQHW(Z# zqhsUmghqBBaol>_cq;x5c=K;$jznOD3hhlN!05KPj@Mn@U1Cff+f}KR+x!}GGq%*H z9vn}q2vNab#k9l{=}d0G?Ph4k1M$@9Vc(GbQ#xC|P+Ui$0591cZz1fKd?)Bd{gE73 z8-DEPqw&Gmkx-g67_c+^afcZ(!bu*9$Q_AXJrY$q!mS&LZXJm^GctQ%B=+veoEIZ; zQzLV+cX`Hl;~noN%(|NxaW^UXZgTG3l+|}rOYf%rza4J;ACz8O{@n_9OpwL9e2?Sy53@$=Z_5n>I_O(#kDc zwr}5FTk{WVcKE>lbB%IUOY__2rfHN8Ll=sPwH^L>y#2?ij_+qWzn(k$<-+;T-4`b> z|Ng13ce1~4^2)%c!NIYcH>Pgi`l7l$Ii&hDJoNs~@S8h#-rgN~fBzmzihX|k@blBh zlc+Rn^y%Bt(U+s6WB+yiIrgV|d~E#r__G(!U%Yzp^7X4%Z(dEjpLqS(>(`&r=Hu&$ z>3lZfc(Ey zAiw_j_Vpjh7P`_5_w=#_u!km!y7TP*Uw-~M0nt^aQ#X8$uI z7mA);{6FZ~|7!HCh8MXf$vr8-aCX`e?z%*GahIsfa=Dr|SeI_ygww zsGF2CDh?T(A&UG zOMky_B%ykzz14!OGQ_umFF}?Fym?NnLM0O)svMeQpWX=^Aul3OaClj@y0p(YdK}+x z6cyVspgUmqe)re!MIGTgHV%c8U5kr`Xp1mCk^Y$~l?Yo|AP6^uJL3B=I&J*O^XM_H zD?XG^%f-vQ5u7`7_T&le(8n*}$v?S1{V%TESs%O8%BR~y8WAR6CPH$$cx#_pOvt$Y zih7nm)-A)1w?ANHKV%Pe@WGaJ*#Upfr|-HSRhsYdAHyYmZ_4f%w>E`iWu%^&;Y+K$ z@T2e&kta+CibSN4Njm$f_49`F3i?&$=jYagiq-xh71xFO1t+vJhm%Iu9YfzD9R@qg z7Pgcki=+o-b{WrAEWGOzdBmxwEk(cKT=IL&&5A0#a)4zz0Q9;`({>G&GC5cD=xsvf zDAKuP&ul>VIraDQ8(Z@cxRI)pdUDGcs4pa6v%8>?SWPb{d#F<`a1{)Z(hftop){|a z+G3qUPu4!2V3Vk;L8IqNJX_ss_8izEt`#ls+na>1@$0xh@FCy0QR?8p>aFM(8-CvV zlxboR8kL`!h`zi&?K*vIFttYyZR(k3?10isq|8m~5DQh& zj%v$$CKp(E8zu?%pdMh315(>bHTl3>oQ|g|h~>GG#t&XJ6ggV*DNVnt~X!A@HuHxa*v z|C&-ZT+JZtei@`)CWX6}nt|CR3CP+j8F@_8BTso2Vb)$b_ta(YqF8S<$pM3JB;U%o~ zf%kV}#@6X@?MN;HFw=_(dsVzd;uMOq)e<9q+hg2wXBnl_s}4Hf^HHcw^K9PNY0 zj>@VR|0YtLKdd}B)+||R&IkMSI0W;~9xKdv>DyNMxu@KI#)=uzw`(Mn!ZgVnMUYXH zl!doPU$5MSe!5-C-^-afcvQNd|3SUpG{4Pw4HA!g!mKQx09)J;f3Xy-bWU^jIO+CC zG%4%~+6|l(@CSes}g?}vRNRq4hUieC(Z~34Q@pU&j zXcqp|TRvOVsV>%0)-Z2jk67(k=XB6Tf~;31O94@y#f13!g`JfF6*OJer4_iPOng}J z15$XKC83EZxqxNud@2hMeHEP`F4j*_AG6;(sCXR}=3u0_$F&+(o;0M&B&65ig`XP< zvemHR9Cw1bJWb5#AJ-Kh--nlP!P(?!4nhH(@rk8>27W5Uuv8r7d5J2mD-H`i^P zDzzvUVth2Ll?H>@QW=}jeT+$5ub%x^^{3_V5{zA+h8QgeFNJiC65EBiFv8fiS;%p_ zjfyNA;T!VR1^yas!IRRrzfBf|x%BLqDHG`qQqLMq_pnF!;%jpNc=RzqDi&1aTmptd z<>Bt`Q@p<}sY!94p@YYqWKp~T*yg^enHZU}E$!8zt9R95z40yufRdQWu}~xLMH%D6 zoDA0I4Am84KcA-YWnq=c{ug|xaOi`XU%T_rGY)pfGMB!MjoOMC9WmG$T0nw_P1-gVcu47lCv)+F)o8UCl7t_*wQ$jHx*5_!2 z6U1UZ{?<#WDRmZTNZ<9fJD2Nb!K#eSIjGm*(x*qoiY*R-m1evitgmL)cauNrArSut zM^VVLYV21r?Uv6=Sq^8WLtePubx@`T{*<)Vg1?BRim5Wje=d#DkI$Deb1nI4Eh>=E zg7p(Z_R2YKa_km9KN2J-rTBXz4wg}ylJEO1ltA8V2o-DBn)O4OyI?CJlL7ET1tCF5 zD%3-;S{olCM~?2srEB0~`RqbI+#R0N9}a)2b;^}v7XWLbcarkdOl!n}#@*zq5?(yx z2eI;IhC`l&Wg)T+3A;qH1Q=LMO!5Og6iBWNc9MaSJ-o^?<6Ac9*h0e`MSvenSl8t|(G zCB?v*z&uzKCmV)xx)RwelDlSOU=v}X8m2QBDiSYw~w{o2m)m`m}M0W{MK4>K!ot)(?K(=5SlV!u$x+|1Q%v`-B z$;?j#nPQ{6WV0hm7^$-P(mjG_Cq&{@?K#g+^N}X)6%vB;z@O=f-EX>P$Bc7 z?}v8cq-R_b&aRaW!(+|GHd8*j)9@zB>LVILupq=px#I{M-*Fc_#xT6?U99kN((S?d z(gTX84cM(vg&zt|fv%6{b)BU$frvn)D%lvfK!7`_T3SAUox29o_~5Rj$gdP7v%P#I_c_FFgyGvg9rK~oB$%hDR1?)q|UdBIQinA^{E+$^CI(_;+t4d=9JJ4d3w(SaFz|gLR#$Mx9|K?Mn6XeH6$=26>{r zViS_DDsrLR`)|Lc+w72ENqL9A5#ncoesm-ch@ep;b_q7lnYUztCdZBU+d(G2n9tAV z&xbgMIaywMdDtX6_FN#gs{o5~xK(t?=aD0%p}IWr274KV1`A!D9fZNT6}1g40DrWW zR7}OVe`k^ta2@@0EbDj(ufmAFcHSDW)_8dU6%GP0EvC4amj*Xl=&Uqj}jFKZW+dP z_a0=c96L+3XH&!?697)93tjyJOa<_b@7h9!qC;lqLmZC#JhB(K9%O`irV!Xg9bzSO zda61!8$%46LRmGI$_>e5hQR4jR};a2S@5Dk&ovlVA0F=ABsNRIuMfvFnXsb@jCR2I zQQchyIAn%lOd|F|dPmozvnl*T_@VtZ@BzF5DNl3CublZj)xD#OP>pw8sH_<`maq1i zO|mO*=FScf`dO>snqI;}0laJk5#r`zHPiVh+n_Dc8O!r?}NoA{;&Q3^+0=uKvC8*_K`&Yk5^(X}e;gcW+zkc^o z)>sYP?-hJ`W zF`URhzcS?M3}mYY?w|4wli_YA8NvkPkHkC$ zmZ^aAKPhiYaTKfW<+D3ZeM&MjUyObjvEAA+73%79N-8PghV!+M%#;(n4Xr-?H#h9alSkTnlsSy9fxyf(rS#P=yB_ z=rr^y7At%+dm~r|Bmv(UWr8N>K`siIBR{rm-?3S;KL+gZ@2(Q_gbgPdSK&t7{qzH? zv%y;%pn`KDY}pOZ_5&~r|18D7yn&jbebch?*?ygCgcqlZnzFzU!JG^YG|`(%RiMwn zl0soK;>Ac(V$iz|rUKC#Oo|Zyy3c5<605BT?dOBW0;of`I}yNow1Z*DR*N~1&y$W8 zvo5_P(25FO34uqkIPh(AP0coBHlEgggXDd5HH_(*Y-%2c^W=oZ046;GbOmq<95D;P zc*~$bIkr%7%V^9kLG}-W7Cib4qyn+XxggQGAmFrV?kZa$>|u>PUj-g7KQaAe3F50H}Qxu@J0CMGt#yFGV6(StPCY-U5o~i$w(OEcQMu!5axFvrWbf|H2)USTm zK1-yYb7*{=A;)G5UMGY=ITk^37cV=0xdIecM-n+_V5>k5`;(pr;XGX4!)go-(UMqR8 z zy}ffbd8(Z~h5459hu3VVvip%?K##{5E>1RiITT2yzO&d#%8^4qLi&EgJ<2#drK7%$ z9rCNOhjhb9LjeJE=}n`U5~{)5b4U&VTh0c5E{7EX0Xo{gnr!|6g$@TFA!JfF{PrHc z+%#X0a%9zp*IR=Tg%W%FDCoo6*nn2hoz^uJJX>tI-dYJV)6S)Q;uyk23s-^S96UN2w|HZI?Gi{SbZ4g8rdK@KIyuIn(Yuq!3r>>qj1Q{EdMoRYvCYu>uc#>Fk4!+OcTSy_CAKs;5dn|L(&_`-p` z$!}9mEV#4@Ynk#c?Nsi~UGHH>CIDgXq3GG#__8G~p04J_ z)0y;4I}eI)!Sqg;#89g1w<&-cKLYQsacN9>9wUS@uVqI;~2Un+MFuHvR= z9x~i+dqOUuSB<^1_Pea6wUGDm2s4+=b7hkg(-vhM%b|soUJ#6l|8hqU6-+wiE)2Y_ zl+GqPx2VpI`35orUSJfxC+JDMCFP9q2P_z4uBMiMH%!N1>$38tN6UP#3(0904Ejpz z=z^Kp>F3$cjE*KWN+flQxzEquUMY`lHR^41t?^nv!I!|!DEFl&4h$b8UB>vtdR=u$ zbdMG=)Q#|yVY(-%s%W+J$>(WZOX;1AZJ=%-eXb+<1~uZ8LDD!&8Fk>%nDqKaMaw?l z0^Sj^q40Um3`_ooHZk>O*Up*%DLSbdYffMh4uuAwwSkpwnWcvO2^RU|^_DX!^H&V4 zK9`oytpQ20rA8+lMwt^bo1{lfvbo>No^spu)G?Pj!`T(&h*_0m<<=R&J4I%Oudh7d zraq{wvAj4Wp1+OxfVGw0t!WIVtYq%OAL9pbbOUN{oLRK_Z|s9b96^^(092Wsc;4kF zmrHo(dm-~S6_b=hHrCr%f%86^d-8F}pKnEnmRqH4k$7n)!etDjz#JV9DKNe@vTrIg z3Fl3q&82MC*bP%4EiN#>vHZ~L?UqS_^82uG&WAY{kw@YX5*_*YWVw|AI}aE4K)=ze zbK&b}C{jivc#hPYH_nVri!OIX>91{}<5uBi1~CZOu_`k_f~%TwQC${J=_!WHEgS-i z22Ardy8Bf?^BoVpSjk38SKgSr)%akuk2BRUp})V{-~RDCUus9?cI)psLX6#k5<8OH zD3!C-$=nRQE@elt`!BPICQ zwVk#pW83tUDIxnZK}7sK7&1`_ zf2Cs_w9}=CnL=;L)jgx>)vCt5R(8I-U0JR5V&}RMK+pCX__mmS>?nhsQ;h~@lh~j^ zmyqBu5D~Pe&v?1hGx8pY^*72(eeyNJFiaL=>wxzJGVwvvBBT?A;L?s;hRSxuIPrzj zYcGiT0=-13APCpVWX=L5B->%=>9*Kn{b-hH+b1Ggpd*A%fTkA=$i671W+ULAv>TWe znN~`PqhwLB0o)FkEFES(i09OS*OT}dk7>}-Gyb^gq|(`<5g=AmcY|~hsiedrkRA-jgib5@(R$j7ZPg*ED^}_({646E zFI8-DA(N!o02w4Gxvp^lY%6D(sh7lxO-AJ8kF4kJ;o$nn=%p5naDN98zP9v}TcLb+ zB!};Ih{-0XXIq+b6o%#%V+K`e94je(xI9CSSF^(@YJ89#BEmYkfCL60rl^F3L}eeV zG%)F<^*93OR(2&-izpLvytfJ!p#kNO1x>5;uK_d8*%5p*Xmu7nfPPAfkzPRyZv6GN z@5@ufBA^i$cnly18FmZ(bZ>Lz1dE7H{Wr%l;nw~?r_zxK!~7FY_vR6Gu5&9r zIoGlC8!;9KsK6(SC`VgF>AbYM>||(89jOCjPQ80vPbDXxVO5wlDIZ^aboa8hlx>_4 zlmVHh`4>-!=SM3f%Ui@cQ^#&#s;h~mzA1U855RH5mA1zleP~ByeK8DXX1l7W`?)ay z>d32~InYR}W)rMErxC4Qiw{j9D>E2e7sHOJpJz@APq326$^Vv+59uHQl=wv^SWhRRTfk~&;BZHrg6g3EjtWJ zmr2A@bFo@t-3{P^kY2OO`9_p4YtLPJ+Dg$r%8B$3oUxlPis7nD+r8wF^@Q+d`qg-; zg4ST|VxPE)?q*bR_2}%oZpjz}EamihV1_%eu7!wE_K3FGv(t5swB4!-nVdufAlG>-+q{ByvKA1_Pvsl@z}xD8-USsE&6 zNGO4fsuiCdd}*YVG)78Sw8h>3uPdOo)qpQVXejdpD-FGxPS#ReMdZcy3{Vvzksw1dWtrZd9 zMXsw{^y}rBxf%`WBW%1^hS`7Tz^ij7p}tdgM1Oe?DFuNon0rdbXU@aj;E1j+t*-Pq z+K*FyD6@J%Ofk>M#p!RTFyWOWaT(fs!R~#gi%ZK_AO89LSe_7MBP-658Beq7Lq?aK z{QAhBbxq#N(YhLJt(&?u{kN%`t-8sq!sQSGpK%l6M3`IGiGs$;NVzC<3^*>vQu)?o z7m*oL6zzKHlh5UG7vM{Hhl3#O@&<`({bfpfNVf#?*MtF5R@7s0e7s0MixdIuV=zoT zReMQt-J@K%Fua-f7Dwl~gn&U(F8OnIuR#m-@@etI#GY?8VNPAz%Vz!T+-%7o>nn7p zoA&a-#cv?P*%Gs~EtW3KQZ-$13fu`=pFCYy#?TddZDe4$eJJtN<25x*O#)v z>u6g5`$V1;?WZysmJ8Txm3(m^>@(ojfj<4;l*V3f5Xg_ zdy~yTDGFgNAe9OGg9WPwIfsGxS1n=0g}Rs%14e#I?^h6a1s$FVlZ`HhJ8=SBgdHK2<4K*DzWq3E${DP2Xz}3e+Q_M(ClNiVUQ!;0 z#skk(*6NjjwCUbca(fqzavLXLuHCL%>^!?7obKL7v-0BGVzIF1=CkK zu+!>c=h9)9y4(Mmg$sL!ZhXhf@s9VbJ3bM2e3S3Y%Dv;a`i_6;9Y)=qfYv*KXYK?I z+zGyWC*;MQ(5X9N*b%1j2+MJVJ!>TVe<6D2Ar}JwIl&e4Pe&2|e@C|d27v$R0>Quk zhl1k2Ij;XGD5AgfUm`IS<F@WA;r}%-;A?QuG&5{Eoc%2_;yX%nMRR||&i*ks?jNIAQqs?q+?n@-+q|)lmLgB{W z)~zimE-uc_&Q4EHPfbcpNr*?krzR)QOHExke}2)j6m0{~l@xd;j46s|OFp z9zGm>`0(kYM^7I=8h!kD{K=E&qfcM|Ir@G~{c(Kk^YiCZFJDYeyqcPrn0o#C)0;P+ z-oE*SdcxknoBr^A`mYbun!lz$e*72c_4(V>e_tr&_5I7_KZw^q>&riD`d{lmD6fA& zum5Hd`-kBA*ZL2v>)#O9|G(I+e=}Vu!FB%s5M2K|5L_cOk`l~KJQGGaFYL<9Ru0z&bZv0lNJ25v-FxpfU?5|7_TlJ{fWCN$x;CpaV{$GVrSB{tfvd^d{c z_D-*Ul1&The$KCDt4QT;GBzpZ!N;hhM;A_BcR3Z=a%f*Iu7GP7v0BU_TgM7nIHOop z`?{TfO&78BtppA09kve5*yql^X16c4^BV0qses!agyK6a*>m0pyzftWAIZW+Ei!z) zvYCV5c1T`!!Su}A4|bFl!|3NP2g7BpcNWGPI9qMYDmP@bD+zl2*7$&;=cH7M4Z0S5cI^V!qK%q&<%Q7fLtLVv|ZB`7Su%{9A z6kla-nxKoInGa~o9b$aHvkag)z4^^6M?RhAoa_$jcxoKwdtGa16>d2*V)GOESwjIx3Q<0w z2r+X6&AKa=KEbE(V5$|1xLjr9KLUhUO)lA>cf@k^-L4B7kLSj_K;wA7ANi{-@k?tjxAe4%54B+bBvgwMC6D;K91`JaCq< z$}+0nLGPZ+)d5!~woqMWU#4==9ptZtzQKmuc~SVa}2xf6M$bY#K+Z+>jm+x5Gxwu%hbnhq*mA$^P+mk*t+MFl(<4y zghv&{+or*G+vwNq1U0*Lw6qpNgxQT+2D+{Bpw38%;Ig*U2rE8=Q&akTCvC=@Ye3)0QdrGizlk!3DOiJEIoIM#RQaHP4j^ zyXRgjBVV6%il!fcDh9>m9BSJ4(>PV!BO1Po}`x?tcTrF!0 zsY|PjAVSh;o1T+gem%62pR)Xk2)7o^phtF;+i3tCEuV#q@UHwZ?64}L3)HQYO9LLv z)KfiUlEggRh3XNHqra5{z<2z8N^z(RZzX5zhCykhWR1krm-;i(kjxM9T%trCAb zV7F6)tWQ5q0h0OrLhJgT^|YNzL_^cRLXjZy-J*k)Ai*x5qF-;e#m@H)6zNi7HF{Po zI9h#Vmo?X*c!P9-_N!Ayu?W{at6gW>6LZ06kbI>cW}4ac#u2icH!*KG)tcb0J-c$l zB3EQi>0cImqVGe3+l8Ap2yyAe`>iX)=h#ru%UXNVxc@ji-#FICh1}D(4tkrcP!)^o$AMa!kPWoUX(6nBAjOr-pK!x#F!W z-Xl?MAi@2?%LupQQgllW>+jOL0&jLk+QlZGzQ{z4H&V1uR#RkI;iMg`Om!H47%^x| zZjj+)Txi&aHB$~%noJs{-#}2|dfu|PoN|%2d1n2x2rab;V_e8QWu+17J~4Y}@1CRY zzIFoV^cpnzsWupFV#&8D=O8Z|&#q{Y42)`WO}kjs44q`8#BdA4A@enJWvO+(%)>dm zbGuz?h0_;Jd5(S#Wruc5Q%RS2#mRBxfLA0>mB*Dc3qYu153`bf&A6@6sH<(jx_}pD z*AA`PmEGThK^Mt?f0~B;dHc0i=vGA2Ipp^p5>*s5%6$_)OF?rs| zX5m8I1hV-aaX}8f9v{8Am!n*kQqAWi4+1p-Wf$?PC{5LJ!8D1l$MV0QBG1u9(C zT1uAye-#h0dPRCKAh?HbyV$S5FPbKRmePrXDVWpcK2PYPnGqrHM?^*dOpeEg${{Nu zTp-6p31KabSsKGGIP-4)aLrn zepLE)9BoVJ$IVxrh5jp7cqqX_|9L@*s-2xnNU9}}2tQ#A-DMzhK@y1%*Bpj=s+Y;G zMvtyRS~VzRQxT)W$iLU|gqRZ*%xzHID*SxCKH?cQsZtVY1gs{HRgyd4QtS>WbB8{N8V958J`z^Q zFcCt`3MF1H#Ai=Xw^Q*gIR_FRk? z{>ous25-f3evBDPC#Z2TOqhn07^xuZo%6%L>`Y!_upPm$4*_(|Z#G_}l~jx~6_~mY znyR7iuYz{fQ}=4(aLsiT10wncN|S+RJh~MfjuE=Is&E(2L3X=ITxw)_>#ELYi`IQg zm>fi%berf>zXo6M^+Zh80~af0g$0NY)Cw@mcp{rjyjN88&1r*-e)iSFeo->!HoGbk zgvrmzS3Dzdfg*DO)aC7GDu;^tb=%c4hH(EA1%AeVVed_YnpoF`?WDWY8JL{%mfAmjDm`at}rR$6af{LrC}5lH7-$5SsD-(6nXL6B8zHjrVC}IcM4}Kf z(4BJ?0F4e(K}lx={B8~w#Ui4?4&n0Jv=+4FA#D>2X^n>X*eCo}@*FOt1CayRAcG5S zuqCeR1tw3!JP+{RT+Ay6-*QDzFFJ>|agjJMNWMCoyVhHrcore=l*5@aQ7&L_A_wi` zbkeNgb?h@b&j{KPaCA0u2_+`ERi0RhR7qiP4wedteOricV;&T9$^yH=+fP+wf9b`t z&xOEm3(A`D(s`1WFDxe(_@~k0aEbrw)R1xoyh!PHs{#Tti37_dFD85q*(>52Bhu@0 zy%amQQixeN$tCm`Z!z%45F9QAJH~+Ra;Xi2oJ6~r7I86;8%o5VDC+`Vu0+mrhzp*1 zZF$4$9xK5#m8D-`R=);Ed8)J`oMHuC{JyIkqn|(^1UK&}R@R~|bm3$(=dv&LdtI}| zv0~LMX!J$wh7p!9@=$(xBQA)ubgOig8~YL^O09qcfHt|7IC~2gn95#n>r5#^E^czT zxDE#o>I7Im^_t7sKcb)vko`qt__<1e#wyk#5WlzNm#IL&^k`AoyIM7%gd$D&*#lSB zQ9W&lL6<#%C<@lTHl^X`$w8(Z4pl^Xvv>iL)mUkHhhgq~Pb3}Z@5*7kE`nWlB57>U z$r@+E!PhK@vLx4Sd6#7o7xnxuZr*#bNqBOBZld{4=$dWrA}O(JIdKtgbr~NlK%F?O z9TWwyjd>-FcAdiAMsX>t-ngfV3$=9NgJf5RnD)HvwJi_vVN&9L8YNAVOQW5L)3^6f z6qeNk>pZ&p#)#ox0d%?cSq?Fs3kA}kM}&^KnItxHQBSQs)eq|+B1a@Um=ZW&L8_AT zDH8n6aAdCw-Gl{2^=a&9Ln<;9*8d$o_N4RBCS(_G<;g23soyo%om|s|mwGd{=mJG= zehu#PEjb0`ej_eIQUL}2(?h%)jR=n8^ID15inJT#sZI~Br_EengTg{329N;8C=SH| zn87D*Z*BG4<5>L9!tsj6YU0*yopvjTqjP{g>Bw};QPOV}k%yo@08A3n2p1*%xur}+ zRJ-kkG+I*mLvSaXII|uUug7E5&SP6J#g52(ulMWDUfr{o*)phV`-#fR6Pee4xmYZW&SX5BUWvP)!R^vPtv{jK4yPtGvRYywX!^IrH=FC+?*7e@^o3o`y4A|gz*H)(3{Z=d_ z8U$<{&ST-sKu*4CHQIj~=Oc|ejjNekeJGz+Wr=IsNn2>71h+`SbS04Y*I*iL^^hBp z;HO_rBQ91#YgrFdM+i%#K#N+)wq`i_RG*0-(k3G|_3y+&n;(1cmwpKaK7j|@R&P9A zhU@cklcFOdlK%HFZ(%KH`CCTc;`21HDG$IjUTzBFHWuV4$GahRulWT#?CbbPG^`K)?!|^6*+NhJKjRRd;zj093`sWU4dPp4ev=7 z175!}QORvDCYR}a8z0OeRYT^iQ@ED>g;y|R)#V+%>y_MhtxW{&IwnD$#a+8=;iw0FO(xn>h1OD9 ziRZm2i)8KUW~ZP;Xm$rCh{Ge`F^r#~8hL4>3>-IvgNBa7&{Ow+niRw^h566k` zp5PC8qr2&g7P$7GmJthRd2gPIZvICoqT`?rk(& zj-_Oq9oR?O*u)jj6`(dz7~vb!uaQkZHWvX<4kWet#iAfz7m-46;+ZR_7AhPbV-F|gyAfK>G4tS{(^oweJ5Ng&UHr)MLE5&H zL0uKzSQ@y9OZ+q0<^mmFrkEjX5e9!lHmHRBpK@gwTy$@Ag(l6Wwf!bh_qMD zXyxEMudFeP17X8cQO3*P#r$W2>*9sZIL5IRAD&)Xrnz|WyIUfPrjeW8Vn%&=bnIp) z5A{r;q9ZKLkv+*7XIp5@GfS#gSPChI!Bd=LF*dfEjo~vw75#|it;j$pTK%}fC|J$C zT5+JzZ1wl_rP?7~*H~{BzQIB@1&TBWmSM7m=e{Ie16C8GqS2sJB=ATZ-B3O! z`YGGRFqOpj4~#3O7%mE6zAXwn;F79iVH~`X;N4ay5Fvgf4qpwkzn}8W&89`nzcSt& zvEb&8Lehjw6RmCj^RZq{Q`T07raL{g5kzhTtH_`)bNu8!U6u|%aLEJ<5a}+n2lO(O za(shY469ZnFuEgc&tOpan3mD9>EL2rw<=8=H88E`YgX77Glzrpp$`G20bv8 zh7%TM3>xXxAzW5ax##Q8r-_w*NMh3}t0ynDtkySNS-bO(ONJFFtrI#np+ukabN6gNHa)-mdxPTq`%LR+uGN2Cn(apch_gt9{HW4F23v35AO%Xh=eLZ4r zqh@P>G74Ljg&~!Z^TO%T!QXWcdL@&rUF64a1q~sFZI2q{SS&*BNjdntAC&?)H zdSyJi$^Jlz!=b6*fbS3X#dknvVw^xLm5wt_9Uv@01=drR8Sq9>qeyx|EahTkXpGutDv`BWG+PqcB{=o0Q9lkjj zp0HJg@Mpbx0W&V%RN76EeXz7Or-hjJAuvtUv3akwHs-a$m(V8Bh>9Zh1*9NL*jl!h z(qPa<(bb&X@ATDUbcDN;~M@O*TGIi}C z?RQGzBEKL_cbwz0gDfvWTPhn!oJKW)wkWu{gwLi2=FaJ@vWwYrh zY%`7$0^?H5#(!L|s{||y%r+wGLh)4geCTET8;cWf*PXGcRa+$k3>w*m+M;`u)uiC` zuHyY#=rDQ-O{D}N67_hDtm86twh6_H2e+O(x9i2sXZAzY)Z^ja_#=>6$4gP565U&V z6^GnQ6EpRAODtKP=2~N>=Y&W+EOy^LJDf5rFCDz!xE^RjR4Z<D? zQPjLeq9>HNgC(ZfPfkbGH0W75COF0<-2C$Z%}}0i(5pcc;>UQOmREL039or&6{U)62r7Vqxrj?qFjh;~<69;c2p02!|UyW{EQ{ z+fD+Hk4PwSReU2ahdqY*9;FwU(41cBM`x9()#YW3AATvn7y7lE4E=cB@_|;%({04{ zhv9q7Riy{W>iy{MVco>nw1b;ZEPF7*&R|wY9P~@?py*rgQVzuSS2L z*KYbSukp=r$N9W@^p0O+pMf`sQUe@`(=i+z6|i85)9))`ZawXTUMsa;Fvtk z@IkJRfaPQB9S54f!|g%L>pxXL_AnT~g;zuxU61h&G3+(}{&v#|wMzx|ArA|7e7y6W zDp1rS-LZ6wr?)392&jH>^r;9Wl9wMMkw6xcEn#K=_%!m`OG_ zx+yRsXw=$2IYy48`+T9Q_~p(bKUqB~iBTFHux5WrEDBQF7=-b5XR5zNOxLxS$9zam z83-Vjk#1VgwG|yfsFitmKXHPfu~9Ims*)_jX~p4DF?eb6}jwZZaxd>(-U4E?ClZYwy53H2yIDSg}<|vGrL^ zTMiG6sYE1rTce<6=7M>0eyhyOK@Qw+@$~NU3-?=i-&ORXtMB-v_4Qz~Pi~i22-(L* zI#Yv}D{xv9T#X4FHvZ{lr2a%AylvGrzluL^!jDE19?AE~_3JgMuhkjrzc_1astjSd zRiT6UU4Eh^ZJ;L$OtLglt1pWp{pu_^dD$C^U~ zf2|25b!sY@LM2m6g16>CD`TqVpkP4n`arU`OD=uLX33jRVWqg+jj4iDin>N)kjA~| z+$RW8+#YMa*X6J8gaP)dSPf5_N{*cTK`mRVRY8Nqgh&7 ze{)#|1}Y;Xm5GVU)b#IVZmz-fb4>hI-7q^>>xA zwdHRF3kx&;+WxOFV^8;N->un!JG1xh&dTr4{wAOKyUqBU67y~iK78|N@a3aN<3o?f zhlgK3eTo$tKVa&u7tjA*iWifkqZ4B<-@F`uGyZzw)tk4kC*HrA_&D+QGlpPIy!r8W zv+?!x+c(qiCVswuH;sW<|Dv#zKR$i>@%i(QFJGpJ(-CUE%Vx}Wc~ zasBDnN8^?INy|6HD`f;1nPn%aRf*g>;j*Ux)-MH3{fiEVd5;yDi2p{jO1IJ$5~vDU zmuWqnQek^g6?XcVDrEFGl2JgTqJvBuL5k)=r`Z$W+$yBoWOsejyNE+=;ir%0A)imO zj^Hi^5%rTL41#_x&FCtQ zqg{H{N^gjZ=xMoh}EYN@ceM@QT+SjRGOTL+ zDhesYoH)z6f^Rt8S>9@oi6M|J3FejJ38e?{CT$Oj=HQkPbBqibRBh6$^@-`F(E{qW zVKLE3xxp#Q2Yga49>jL=BPwA{sr%rAZl?r+S zqoBbJb`Eel7~v`fZi+}aTAgq7qzzfp_+d|GWQDs&B(DrG)4*P~OdMZi|KKeWJ|9Hu##*HUj5t%OeGA zC38WmINrfk%8pTU2{`6nODt{Tl6qzHSz<ENmpO64Q?EO>wB(iJ8l{7g5U-QD zs)OLf0llS~xn6xIJxuui6KH%I?$??pbXhM->c3g&QtI3#@OUf3=RlBj;dFk1(DlqS@HAkC8Z@b7u;msn!{Ym z86jWCw@-uB$V)flgfR4OQ=QQRCf=lmI3fV+SLrqEGYY1Z|KL(m>5vcS^s+5hB@3%_ z(2I9!HN7}|;}P86(w|(d6?uf48|nLI;%fuQzX@LA8F`jFWtu9w*t46<-rhx+JBB&d zT2aVhqQmH&?A))nlQRPwRSb1@TTzs{jRt6QR_nWj;E3RN%WiktZ{f6$lWmY+cG2OF zaGYrCA(Ir`+5qxr(OSTrbnX>A?;VZUcl9y4wy80UT2o|J$p#JkWRI{jgV!EFnHGs* zHYE$Uz%2zs;u^H%RiK$q?SVaj31d*UR3BM@q*l&j6wv4>Zt^-MFHT|{r&DoGvFeHs z4~{2daLswb&E^gZQb+i?pV4h0^s{PPZ)sSYQ(!_~x6cB3(WCv}@Ox}XMtrpBWY82U z?E?)YVj*5#L5i&68`vz=iI>+LD*MTpBYK1#>Z7FH(#@aBhXjE(e6=&JL7IIA;ON2* zLg~>{Dtbr<+?ZA?I1-TUG2OcKjZW7df9@HMc>|28yoV9AeJ zdxUR3I7cs4bc%c}Wj1KZ3d=SLG|x|44ITWU4 zpx1z7CkwLZzmcAAU=}N(jVU;aj7nkSh_t|6L-+xG=+-juYb>#UJyQ#xa)g~zy4|xL z0lv7xGtq##4DU#T_legmjH0+OJ=_o*W5cBZGGe&6fF!|&m{Q2n5F!UpVecSG)|MUs z`P+j6?8qjuc)(!G0fd-@gPL5C94=V&8J{inaYw?-6mSw7KE6k<4M&{*f@kOmK6L}} z@)SHRMW3?+&&Ayw6RL!{IItUV(52nV0(-hOj-mp6?4dde`_N)NP$r!XT1tz)xgsUq z)R7{j-9WDn4Xu7--5@8`g?bn&_Y|DOeW?&x^id~%q`=awGGJw4XLJS~sZ}m_%nl%S zz%(?}6bD$)ms=p9w+GT$>5@~0oT}2T=Wf`o3;O_MhBauf0F&gf!FK9;)~3QKhpR?7 zbCT2hi4+foyV)%buF}CowhOd`3+rQvmXs6;=sSToli-adKp+=x78cEZ#UD1**R2XP z$hEFRAPi*QdFt>hr|2VDKJua`&&6)nyEzx+dDOOEGn@iLWPhjgE&gg zk-^9Gpbgw?GGke3BD}X(Z&Q8bbk_C-eDV>_F0^Z@2^(<5?lgsuz7%|Ut32zwu%HN+ z{G}YALGQ3t=TE8SUZw*Zr0P!?jfk%oKT~yRZwS1eh1P4E@ z0(!Q?1r_-I6qtd4mMHkC6@$1|`XO6Qv`PMw5G@7pbx6Bf0tc`#?2d~`w;UDR^DQN0 z7qWLxZuUy;G8*iH1I!;SFqNz)%ce*$&xvPxQ2}TQ3 z^ei2M*qO#GV4eaWn}w%J;Z42A-KABT?45>OIFAdx745y2yLW{*p<1z(`!J`COa89E zl+gob<47U`CXmz1LG~qgEjO!)a^xOKZoyk%{KOt;muy)u6@1>Kv0s+s zNC(ahIcLj`YDoZEosMcvE#0GQE34#ym2Q#71JY(LyhTEmaCU)F3!02L0Vurs6etVz zaFL?Pvc1mSXz1daB;_JA6zi7(G!9(nM)6QOq$r&0k;N;s^8`O|eu|_jX|z5U)Ywjd zSO>X92iw}9JQ}7jD|eKOM^MUc9O+39T<|c!K|6UBhkykeS8xgOI0uR)Id}?Zf;&s8 zA#de0b;bhN7ML>vWwL)c-~rFNadWuLHiSg23dC57429=h6ejGy5J-#Fmu`=!#|KIL z$|Rth91K#%M}X_?C6Xjs3Qcjg8l!xJfv{Tyu=2=h&lG1l;eIFFzaI4ddA1Bu5jTk8 zLk|;YuHk)fLR;RsIO(}qX-k}hkgr@!h@zy)Lay}x0&0_!+2D<^);VIl3k}xp(z>r9Q7(sFE6Iig$Q5axoQG_Y`8s+a z$qFAs*~&FmVAev>hbf#Zvg=?8ya{Q+NGKi(d2j$r1oAyuRN4%1*e%w0wR|pNg{;N< zddt&r68+iAzveXJS0Qyuc;%feo4DAy2-Iste#P`ik*tS!aNP{;Ou#jN#ac^A$yN7#4eXk*9j8WQ>5tK!U?@!MFAEcf}^g)^p6@TxqIY~Me0-n6QE6yD3Ha_B*6xSd}n$O%f|a~5Ej3|~zHZ@1hm?F7>3whc;{ zyDCjn+xX zek=`b0?-j+?JJnhx&U>r0(kJ{?VV+**Xlld{?deQKIl?rL=Iw8O%-74-c#$UfK3pV zZ*y0^D@kINFF+&#`u1-0J*o|yMXc{Wt5y)b1_5BXb}f#$9)#vBl?p?+z>^Y(<5E5Y~m)pxeRm#1+Kv_{yO$b5Q%0ucL`1KUAz z(zZ3QGn{GzobiC)LkrI?E5`yDyKzvKN0tQ&n4#b%TA(>CJd>R^XOtW`um5;Nf8{{S zDg`k`23kolJyU>*6fAP6Z<}6fc?L+w2{*IXltzQyFJVy+)rQ*+ zaz^C|KRK<8L~>|p$#r0Jzs5e<@%MS2MX?P_~f`gK~m;`6yQzk$#CEh%M_v6BX80@(P zg7x_MZ2I+9Sm%s>m83sJcJ6s(e~1*Y84em_!a;)iy%;w_Blb+^r=XCh{4}8?1n7|L z##)9e5iXs#vK381b7;Yo6k5s;lN+~!0a@#Vo{fN=6z@zYZox*a?UB1l>{e1G?f2|5 zFK0>)_o<^2ZzlyDWEdhz@OyT{cki=`IZ%#dw}g9bTK6_&No-mpNv^=FjsYUSm1W;O z9V8O-H=C1_?vOv9D%AnDejHzwN85%;kX@WodA_8xFwZCehzK_`Li8%$s+ zp=E6B51vneHkmEiZ!qn-H0k+rPWRIt8+Jd$)7hn?&l+|=yysYPpYZgijqJsg0hA_v z693cFTmgERkmlW`da9#G<#)6&SFkSR{0iKHkTZ}PwZhJmhsf7FK}RWg=Gz0kOxsvi zGG+#Yq_3I11W}r99ggTHxpd}EfxrBm@;yP-#5~Vqw**OV*ZU&WV}Yi~_+sYTr%dDJhH^YRR((oXYx;gOMQ^VlZO+ANjK(KYj%*&SQFjoSZW9S zNrnSC30QWMNdZMWRp>^HJoBaK4T4@Wz>?dSAfH5?ckKTD@#FK47{jy-d1J~`E0@4Q zG|+V}Fc)#8OJNL9%fbaYj)OUzfMsgy@{)c2TI@l{Mk?v>?%)?^msP7=h=QG8 zE|ARK3VU_l_yd0+?r5Ms(<1%ptu)#F5k%0l5_qxzX+y|?if<8mfVUWKk1k4*E6L3} z>1_DaJslyA(Ej4b^`*FT=2LG!BRJk(9Zx<%W9ugCmz`jdVL+?Q5`=<_sJ*53eH#cp zYVI_h(t10lrncT3m9qQX5>kcMJ+2Q^UZ!4Q+pFhDD6;L*bbrbL3+KtJboCq*Q>oGi zRfgvDT)B)vK)k9G|Fc}{MCh?Yj*d=?ND!)A;S}GN^=e7j_`!Qs7M|N6?}wzJNAy4+ z+F7v`(>kM40nNKj153T2%>GeXRL@b=m({9DFRs(P66m~&Qk?y$Y-5Q<0rlI1&z&U} z8+xZ$7sWLt9)hIkpIvrL#5sG=e9?*c>8-Et9uJJYx1P=g2$R3{s0_~Q2CdxnaC$#K z7}ii*I>ph=(yQvz3czW{D<2sBuH}Q9=d}n-RcYC0BY1*AewEh>7x}0IfrO3vial~civ0Eg)}AaeGHFGoR@e_?XVOv7e>_; z{Yn3V?)j>|0}@e?h=f*wAEV}m0nUI~0tla^v?RH{n-b}|tg;$CDF|oO1y#h8 z#!*+coZY9wjEd^L;X>CX-f!wvElZl2#e6G`RqEWO*Gain3*F;r#e00-DMqC#Ke^?+ z46CRPn>lbvKdr5UcX*4uvX2KoNg9mJKb1)qWe@MK)f@CWpkWcD zq~E1DwaLJz}=Bz0>Zd3|lu zggOZm4Z}@7I2z8w< zVV*m!a-x@CC9=|QA1^8!nSPH7b>p}-dr+C!dMjVftZA@p>l0w{$Ulx3=|rNI5Grya zXqtS57Yj^{c_A+-8#p1^--c3t`O~MnO+OrbH|9zXXq+or=Cr_vTAsFAH;94OP)l+Z zkOTGkC)K#P_$q9k~9VH3IkJ@^XP%GV44x*sPt+mtNHs&zpoqd%- zA$8S?wZ#5IVHs?j_zBr+UsCM~D!!Pn;Msj~!E1=JPE z3?^Af0U81`aE>I~@RS1x?he|9>r}Vk@FTYdsj*~f+H4t5V`6ixDaz0q;V!H^^yqB5 z%PZTKehe#ZB_uDA(lOp#c|cJ2>BN*YyuG_l0iH4e11(=PUbIxcAaWZc)uBv5nR zD2ve`OfSaQ$(KP3hVj~;>GGCsk6R40Lah6)we1Yxf{w!-S{uYs%h#VnB~$BO<^Ir* zQ`8Xcp2#+xw}LNeHlyWAUd-aX{F|gvSo0cJ&AzKFAg<Zv1F`07d z`tM$hARDh#hDHIcsMt)X$3UD&TzOF-RI8mP=DB#&qxq%$eImkM+bPZ?D;uJsuHkk(7k**WdG-G0bm6(xYbLi2bsByb+mM1vd}bApiQ?dHAFkZ#vy$-5 z8UL61fx1I|xFhwnu6DLkUlozcBZEdoe*Y223RXz>@-63{=lg5jkddJ>kq>MI(MZ973FFCDvf(D=pFFCZ$ze^2M)WqsH`erLjV zNRkDmof-@*N1BL&FE4f+iyaNtxBD>On>Lzrq<7opN0UHBl|ns<-A|w+{LKL}XuB=b zOlZspR2C4aGNOae)mi=U-go=-tDm$#R=>i05(l_7u=WMKATzPz@JTIQRdj(@3eS?TxARP(ejCQbc zJN3@XBQAVh^E7UAy5fR(Pvg?xKaCt0xa2hm+;qFux8#ILhvhj%T-kHK0p6%G=}2I! zsvhhvCp&)T3U|FXxxeEi>6dSJkMkXENvX`1cV}cm8*0ao8%qJ*MnzVUF8?3sUn}m{ zO@Ys+4K?voKDZ*5@dT_;;~zL}>;C)N9_^@?Ol0k@xRR=b(emb|yKDZs4@~%cZx7&K zxO8C8JSva;rTd=kOEjL)_{aWTBXJ;S=qG`lw}uZLqb%auW3#2f~N)EMxbHiK8<1Cl!)w( z4qTXcD}W1p3+@PQy?$0|KUcIUuXNFl)>{X@I$Ag$PVpsqAm??xf-;ao zSLBj96>lcT8w}eSaReLmBtDIP>&5}!hdpK4{u`rA|JrnGyI#Ms-olv~*9u{Hr9F5% z55L!Ku5Wkn3Uz*Zt>wdJyeHGWSt^ta^w9DFC$^VUEX$K~wXjlw$>pF=7pxW71x zqTI+dv1c-I&PPF29;hdsU#{83l0b6i4@l>fXd@TB8HY9F|*^v-~( z?fQC>hoV2ljf^UTmrT_f$qh7>Torc6rYX@Fd05|y3LC)wnJj?XS9gILyg&Z7Yd3$> z!;rhsz3&~1G-AvJMuLLYP(h#2bL#S;iwC^pHJ31&kkP1uIOz4y)jV{Xt!#?cDZakm7_3d*K>vk{!MdxIdF!Lz9G`aT76Rx25XG%MaXQ zCIin#EPr(0hh81MI!?ZBBQk76w76CD+{F*3dm8TC1bTpg)BwUa);Ddu^3%W>oWO;9 z&yZjE_Uw`q%@VDg2j4F8^5gFxaPeA_+HTnM-~uD8dM+Lkl4y>KY^|J8Mz_y4Wyc#ibnbQf8n zp@}PEH!NR~8nZl|#p3!0)Y;kf=;}Vu(wc$Gz3iL=Q`7%VoMnligFbvAv| zEJlrGXU*j0&J+~P3iz|4J%5&${aJC~&m&cT9$5k0#b~b|?bq)%o;tB_-|m8f?c29wpc(eHEoWO^ULKFj!$7mL(lX5Kb-eocnWmkA7H2(6_tMTuz$EV)Bntp@9UlZ7xdiVC*`*&X^-zg{GfBx|P%ZJHtA18nO zL&`P%>F@gD&o7^Te))_A7=M2Ig1NZhI{{%)g?Gn2YNl(ZzofVgJr~ z{qyyINs9evC=7e^|Fw2iP?t5u_cu4(IZR8sT^-hP^6oLOtal^*EvN4PLKjfX!dn|3 z)G;gU*W7MB{qPj4F8p}-rKU$`;#$&vzkTV<&;@o^iCM(uvrk%5A2zMIbNSq}E1Z|N zk4IcN|NHgaFYkW8bLGN|n_N)MJhDwX+9lF;SUb>m@#QVCb;OCttIeUy`z1iIVOv9e+$SIH$YyQf8Zu80q40BqC-YN+v}TOu2Le4J$ajAvOkaj0{b z+Vc1ql0oE1$6_qYCE@*I@m1VI-#&?9V6^ni&6Z0LV?YPcw*qRklAUk&FSwf6Usu{3 z&k4;_D8A|%%*$+rZ)}Tnud$eAkv!|tojZS_Ro~G#8o>IKud)XECHR_6iN`Nh;m%Z_ zx}$X(fMB6djZ^UU*&W~LtkfC0MnpO;SbJeL{Tm6rbq~V#g@ybP(EqFS7nHFWZ3yLXx>H>nC*j_3yF&YW!=^zG0qcD zwS;oM2Bu^a>R$}Z+@YD*7tm&VKyhN{!ZK`dMQbt3rBMA|#$MnFP!=8Z%|aS1_0bkS zBv>w4o{O*Xknt^SI><4@LFRT*;`xqRggw#gVvMzYnIVj2zI_6<#$K-jZ%0>oV}A7$ zixBErF3V#W@Vv|cFHb8ppIeb^eky!3A`>%I!rMV}-BR^pnYEFaZyZ^n#Lrdl);zzH zt0v?EC?+O$_c~6HAY>jjVV!rMgnn6aSwE6zvI_-jyl8@cGNcv3>eQC9uNbFuSxfsY zwFOpo0o`~_ZmGb6&%SEYUS_g`i?5+8@fO3DI!C0SR-=J%IBGQ8Iqo2*w-ei%GYHYb}=hrZcCJtnZ!&5frg6Jq_w?N(z&zJ}i(sG^-eRS0^ zF`tqk_3?{5w=+?Xq+OfJ48cA;t`ffGN2Sn^EdzX!B)uh9z_{MecDv9Q)bnyz4GtYd zl{~|3Pap%N1P)fcEV4ejkZRb+LGyF}K6(b$EFaATHg3H+g3P7DhkJXyOX-RR+1yoLKG}33+Om|02x1!H&2KBD>m6|hOpVIglk zAahAPa>OrivSSNF zr1*{Swg^M}W`clXM+^@#lXBtm@4Pwm1XPgw8f1!z^hq7^otIoa+>?l)PpF`f2Gr1S z?)>D@BlF|dV54NbQF=R|~m&`a2{-AGyG0 z+gn1Y&TZ1QY`#ARjEFN|YA;1A38^e`(A4LptE=L}$hL$g%E7wK#0x<>c%nxmUL%Fx zWjulqr%OWgx6_nlF^%9mVM%hCVCa68#bu~lmN4W3hbdg22acEKF;!N z@{~9-eC4J;${9gzY6cw=Me1G}0Et_5%Ms^%c65_2uUVyAt{4;05|S+%`Q2?b6#vu? zO#!EFnxxORR(;Y4m#m^>&)YM!YKsV)2eh{~UYuc+uuiJW)DtR%^9Qcp(FlV~VA|^? z+kdKaQd@$QY+}x7$qw_yecBW22k7X)9=)@Q&oPQ9diSWtY`%;X=Sa4xK2O>;Tt93s z;k~>pPn^r%al$52O@Oy{0DWrlN>S#EFY>(bpu1N5+aZ<~bitx98e!wMpnDn#a9(S;qBtd2y{}2G>!erM#(d2s}o*0w|9@jn$d;@ zQa;`46XP}Jlq&24bPF`=S?M+Ky`vrUrxNamh51iYCIIt9eNO`=NaU%$YZDX2tLhGCI z=x8yk3$MxMp4#^WM`YrN(K3OVZnD|}4Tg?O4P{Ysf^bQa$hJ)ZnGdpwfqgtmob>6@ z%%p0ybi8h}QfS(C4{*#)v)iHM>d&HGbnQ^}wl_a5-X`oc@QN|*R%Z8ED{y!k26wT3 zrHE0|h3AlgNL37E1&wBJTraXWw=9W-0ImGtZUa8OQOC* zC3X}WmOo1dI&pzg2wch{wXD~xQ}Q+mK!z2k+YLG|ffKjk9u9GnE_1awcp~?IvG<-) zO|1RHZZb1TCZP?z3PUJ{9y-#Tgx)0570^&b6x4u-*wd)CAfVVo5wUEIqKMc+QBeUS zHc+=aASx=lV@FY*Gy8e|=d82VIsdcHI-lP6te15!KEQ$xlLa%m@9TG6M5?R=Mx4ZB zU~3&j_9)rGNiN)3GOAnZZv^3+4=#cz=%NQ1Z*_IIk$2xN!7jYaSYYwM5)6} zFme!!&lCGo&X7E$Y;z_+mlKWfE}lFDDu^(TFXLEld=|8FP9~fpfjpTZxBz6&5@H%( zMC6r=cU6&okPUyvyph2|E;6QK^`d(!LhQPrZS=vA4)+Io++c} z-CrByN_%qN3oNl}P(lN4#il6W&)Yr^R}-bMhir5HsxLp~LlA^Ae0UDe)os>B3`RNe4c_$QCKc8O2q9 z`sAFL31`5Z@+>7~tqOdfob-$dAF;{MR}wAdp{sBC*R^V=$iPSr>GVbIRAymZ_9C-U z)>Kcxye4RCsOMlk%964plv}j#*+-#qxU9sH0ECH%4ssH1VTr*!=co?ddXczANaFKF z6n^<1Qze0YB0xnxg}}x?h`~o`)fjZNEy0>#zfn?eB|SXbwFWMr_{zK(xX{s+mO=oN z+P!cLYZeojAM6<+L!$`6(zD1WDJh9dImlb~Oh!%QEpSpoDctQ3MYt*_R}ADs8F1LQ z+0k;1%>**5@1XVaYCuYUJ;n(yOMRw*V-d)O3-}UT_wy(XKL|5UTsOyz;3Z>-fDg6a zZ`RT-OW`cvFRuZ+A`aBA3}uoQD4;-DKwcK8MklF-f(yAwql6NNKnxYpMhUoJV6rr< zK?2%jlXR?T^JKYR5>|xF1(R;8#_4An2#iuPWwkrs)c#qL1D-h|2Ecm{sO#mFw)3Rj zBm34x=v2xms}$sX1(_$KY-q$ib{Prx@&D*ZA(h0IuV<(LR}P3YHI$G@x4#l>!GbF#H`sFrZVV^E}NXk*vsq1SI^83u!+ZtXL2r4h`gaSaPBAPjHF?wDACaXCqfgkTn`B(n`X%g zh??Oaea2k9C2r&5?0to}mj)w|lR%&4NE4sJQ1R(pV6P6~jgicAbii*H8%;asno^FW zBK~iiFkhq*IaG{$V0Zu%1rMYU>3mY3h(df4@X{2Xyx_HCA4&^h1V~toOwuuk0VFgm zkgR((T$8|`tIr4Uvx-D%v6d7(^BJ7}1T4gCc;2m%iIRApuRD@i9ziMNPBF+f9a8= zuZcJ*w@w=DAm8Vu$eMw{hY8vTxs-SrgkeyfZM}U4wLsC^7{oO==C@F)TW z%xMXo5FfRwbY&btVYR=sRp!^eL z_zGN-+gHCNf4vk+YA>+FpN2W$LQViG4NL0O-iy>YvohzU-Tr1u5%5SDPPb?LZzgHwfd)+xATzBZ+X{Nd^#6bMtt6XZO_^p27Iu6|GX#( zNZk$E{zNR=G zY!I=Kb7rA7HGYb;=E~q=6`<9Jg%U_{sC&dq4_)=FOO+dvWRRcY{){mjAVLTF?h$TL zh#g*@GW6Ou58D|lS`v2&0~PQ@l=<1f;_jhKw;X11z-kecmxn*197Y6w?M+Qy+O!gs z6s7{`s#7kqImu`4lMsScOp5 z19~6tODt69O!)XS4CFCDUL+CZH$j~~v~`lJdAgvimgG{a)Z!B@x%eFi^x;9V64J>P z+w(vmgx|JF_H@w+v{u%yC4-9FARrMcR=}w;sR8E^+Zw5nlA?H^iwd0iL;b$KJIM9E0t!E;7$un}r{ER8j5JVfKqHNtyzqB0E8wN0@<{V3WFGIdmNMZ& zCUw1vW2ShKCxYA-p|QLLb5yasa_CdErvafB&nNGHr(M7&-`uRa;f&u$Rxz}di6|+R zFnM~08^yg~#fMT6DoyvDs}JRUk4B92O@K5Byf;Hhcov{*27?#VU6jaf=A44Z=kfeY zBt}Y_mk_abYzu9a8M&Y(Ur{#v^Qm$>QV$AMk-%JjFNL%A0& zJ{G1jKln=Bo0wbkdVq;PXsNQl<~>ij_!R1z7i7x^tWh9R8M;vhWk2tn)34#qU4qKr z>sp{&lG%}j+s@jQrPz8*XMPCJMM`-MsA+to;!wisH z)$9iH%5@F**_wv|(n#A+=hPxHqaTmT3IqcV5d8|v1R4Zs|m2iI&ZyK!JPybpe zWG^k96+$Ho=~m(j#LWL(O6JX>u&bMX&ydVgRNU^;i#Bnq}@hdXGovlhhp8 zdR1lgc@+>*#|Ta9t$mXjl_T2uC4X6W_U&0ce_q)_u~_tLs&YfW9+SiUnCVri6L+mf zTuRX}%WPz_+qtdwN0(Hk(2=(tb`VXi=qFYw_@GpJQ7l>skWNyG0RBK@Wga){aG%hW z6+OYqg&#^-qGN#_F(Sjpit&I?i^Q&>#!H*$TP8n~5d{#E5_`te+Ols4V~3=xGL(If zUanyV2`InG_STg&|16@G$Zf$WwwJ36k~;p{z+uz!j2fv99~ifF>{{GdG*M_*cW_JQ z#7qDnna9Pm)!$}IoFuA@awAUb zC~SAK)+@U@%yzHL>i8xCnBO+bZpY0IYA@V^@yE(29#SIJMuHK257y2gF;e>v58se& zgu`E0dsi}`oV^*Mu7;S4XC;9p8^N({by%(F@ z;TMD z_nC$tkVGCec&3-DRygaIvcN>hZKU}H8p3J@EtzahOlRH2R5K3N1?kjE*X#KeV!zro z*2BHXJqNCD@$}y}w{ZMhkfddu`ca|{a3je?My1t1d3<4}NJnU+9=ti8N~9%)1iXu( zTW%r%o#qO_M%JLgBMezL^3PHZ$df^8=`3+iElnb)q)v$KD=_iwe4^k-Plo22T%(1a zABb!Hs3zYOmQMs*gCIe#P77UpcRLX6c7~`o$?Ynu$fVuffKk#AvS+J6qp-gFn|~8n ztlz5{F<}e`$^=^YU`$EwBh8mSVZL$A+BI@B?|dn%g@F<&eX}AIN;i=@o$44&?4r3j zw@ebUk5A#TGG4D3YqSF1h%_ZNLY#(z{dlaG3z@S9hBIgp;X*zA1z}0;Lv@^E-8w=7 zWaDE=TiX}>v7;I~-1UkCG6+PYnI`gF@o6-6xGp*y>%cef=KJpLqRyV(Nx3YiQQkm? zQW<1zCZK_pJ%-^tLHwU&(1|ZRs!6A%UmZI5cmHCmb{TYW_$8>(EvM#4#eQFQm?pNe zw8csnV|j+gG9S=Lp}ZadBbEt-L(#daX7p>+YzJlJ=R>fNZWgR%W7Gv>Tq0w_K|4Pj z)Q(d`QLf0TEYZ^FC7nS*82*spM>A*z|~{M*6Q0OMAFwF5*4)&zL!R z4=+9cU_@7o9ww^u_~P08ezY-{y|lek>@?A!CFm1sd@+4y`zr!%-~jRXBTq#KUAuq_ zB85K*v*fktV0NSj-sv?zw{z#CDxyK_{q)b9AGgi^a58fEQl`Q5b#1&IV!lHvoY71{ zZS|)xjYkhHji=N}aTs@3OB}e&{Ptq^k_v}!vNHFIF2cQZfuWf%;-})<*&8`~GtQ8< z+Q&e?t?aGPSd};bd#}y6e3M7gF@p;u0~&8ccpn7RBM3~74-1V}#S`E7FF_kI^9mt1 zLy$676>Z#=`1b)yZlGjWb>&$%<1WJH1mw6|seoimvQQWS0V@a~K0mEq zuR1Pt9O*qBxZ3bS>2vSLPabJnkAhr9xxWhC`%0b7bzcexH99xdKx?7v15y zTNLp@B>bpgsK%UduW5c$wYQGp^kjy_|y9&1(d!^_Y$kDu#NV|1O%vnhxZYChFu;-lq!d-!ngsT3cF{ z!lvSa_Nbaldp@LR56>ltwr%xyRkTy&2j8TEj~(C$9_T>;nc=PO!&oW(TDb&jvA_7; zs%vkzfLfy|;*{D>d74WO_`^WU1i_30+hkNRq>X2l*Iw-c{DyI1v2}PV_G-UJq#xlR zL7>kd^u>#=G_z^1LLZ0lob16i^6{SS?21U1e-nm|w=Ax5pVd`69$>^Z;%{{psSZ*S)l0s=Cb7S`l zPjDRWD)8SgKxg`ZafcJOYQgmJpvXM-^3R~B0^`+o^YrMeYx^GhvRX=jN&M!oyuMTq z*3WD}5Wrs!26TXS6~v-9d<#S(!tas8#80CFTct3{eoimkn>g7+_ZRudyIr?}W$HJ} zf_uf0VE_KUrj4_0`p(li7hh=yc}|KQrq1u5L$pv4jifD<`c~6I)E_-3;<$M-!t5wS?t>vHXaS{XYRAE2t`81jNvG*P={+r`AE3V@~Xo3gE`;|@#Ssq zQ8Y*V%8FE3cX-)Rp1Hvt&HcXJ;3A0l-U>EGLc?B=gLr_EGGvRkz$90=czo+j0Cp_k za(hU&U)%JJ^TEC6PhMSlvj6Ehi=u4W8V|e`b91dV9Octw(nr# z+xmEsmr-xoFen!Gmp{Nf_@beuG4>+nv}h(v#++Gb>z z=SWS+NNwUs-I9^rYev>+{5J$y5^fNK;Tc>FhC9Ll;J>&JF6v%q{k#}B7RhJQYL^8NXr-~M|36|Xst zj(!~*`!@dK%d7DpI7c?|`se?_k-dHUb@JV}f0~YyKR&$w@%M+Hs(%QwAOGNEpMU;G zCHD2dJYxUuIQ|znHvRL*^v|F8`t{HH-^F47QHlLu39|q0EB}Aw#s04l94;4Y`(NG1 z{~_dJ4sjo#+sVR`>K+4O!a7|>wKYA*I(cDfn4vH4W1oRt8b@Tl=t*rK%2&+kqi4sF z%19b1cmZp+hk`&W?wzB{*xEm*53M8s;q)c8OZtqm&^V3-0NWD`b(^_CnkACV+-Rwz z@6o2MnmU#9Pr{!{HD{bRO1jm(HWpA>&Z-fNW|yBqv1r^ui??3WxX-?+n&x@Sz@>!A zA{$3DiEvun-WW|&cwd*nHrOHl*lMrHqm7bJ!QnP!?aZKdRKXW%IOi(xx85oH1`N#M zeQd+$n>Q>!e!Xh%$q)%IyK+|Q17){H>I1)COANH01s4#SceS?gEN}}*8_lrY~ zP0J&E%5QgyUWAcvAEC$4&{*e&K}oi5s0KY-eiYyRapjnMMJq7%;*`8T1EEkV!pgRx zxnO23-7Q*rV4FR4O3+BnMnsyvQk4hQtnH6Hs;@#N z7}40q2^tugkSqgzi++5M;)Z5c+DLN)str@c^ZVEp8wDbmF6V=WT{&4dZ)(6Qp?a}D zyUz%K|CAeS-lENTgLYs+n#+W&3M_5>DWRP_5XF_9~@Y;~6NK)fTMNS(t)Hl=zvu+^3CjHwR=Pwh#L+_DdMz~roB~M1bT&Ltc z#1?7PcY&lKk^x*r&g#2i)cJ^T?q!2ENziL?b40zLS4g3uv$E73FLb&&`b_v~lrEAy-uke}E$V&4>U za+-1vbgS!ayX?}2N-fGJv|^UjBu*e33d*J$6ZeE7u8RAl z)@d;R?_^|FMJ(l;j#JS3ioj|PLN=*4IPHec(U}-6a2=LvOkq!3axAk-qD3a>Bwge_ ze#=fJptqER1j*0FW|f$Ekj}>mH+D7fcAa8lAIY9+qw-`XXnH$DCuzK4r)WrExVa8A zW^U6ev3d0tKhOpKex&YSVxpmtk(rXO(68HNwl`EB#BHvt@+S9VANo2cXdRYE+(bGR zsM!2_2OQ4{dS-hz(|H0r43Bi*^jDRZFA?c)L`1V_t~XTF+vJSxkm-S+gXu>E8vMS= zFGcm+1K=dE2eO%Ym-e{SX?xc#?;B@KYLzd1r|aQlE-&Z{mr`^DTaUz4XpWa=vh+@t z(bBky@r3zKM;q=~`+z9c0M5LTYwgU=ATLzAdar?>T5zb(q643oY(?SXc6Z#@0gLd% zgbk=CHI4($8qOdOi59TKyGna-%T;~PGlNb=X{*M#ws$^e)OYfwlR}rA9d2wG$9qYk zvpWojS*%}3S$lc(G&$ho1Y8@NxLQYkBIIEMiDGpiRV{GJ`+D<9c+Ile;cR* z%wT%T^4_cz5_{RlKM9Q)1Uq&1?(N|vtoS*~%Kmnw0Ns>%a zGbt?(*6P)XeDvsL5mTfw4^K5_gcvU55tjuFyt;K?kbR8NYEYD+bCOXyD+Sj&K@M7u z)~u?id*#mR_ic|b{}?I$(4>E%1YL?xJ#8j@^8FW|WT}+TzkscIAxK!Zhg)jZt$0r6 z^DTGdV@Wu1G6jT9Zp(hK^2x7OaP2We6ep+=gqn3_s8xt%cHb>iq#T} zW*N8T5^uVVU$1H9s>MfF>4cwF^Dbf00#UvZuM0U~6TYS(j`nq~#w)CFMSJs#rA&ye z0&L{?JL3WtFUUX%8Y6(C3S`KMLtqjxf0=L>D0nol+mkr36j{EMvPcSUVur5gf#tfu zI+c&7EHurNoUS4fZ|I%mQkt#)A-}Zt#4`!BWE5f%*cADifEK_M7eK1O$KQdvka*?V zB|B<0>J%bf6jXC1<5~!S1EzDcJvo3wt1Z}&Q{kb1n81#`FYt|{iFr(uFEEP%S)%JT zxMIpMQ79zXs|wgEaN?muRkOp#U}PUBZibuSPhokX)&%_Q&4fp!V_-Ux;Cg+o8*hP+ ztzI*Kk>sdVh1|_U5}eK?f6gJ|y0WkimLqS|2qn~svor+B{LD_ta>9Rbd2V-)b_Ri*OC{$#{Kb}z1?ZD!l7`P4%1ohWW5h{rPclsdjBM;Fi>qGa$WCafC0WYAAe%Hrh$1$jcY z>(p#Gow;hE9(8peF;-OWAPaTiZ3|0rFmR=$`%Sal?mElNxCXvmZj_O7b{FZ zQsyX%-EgEdgPJJ=?NGw_IMEORQwh{vZDq8xw!g=TUUu50%HUD!dAE8Nb`??=GfSL# z3+fe147u@i>xdyPT^_xf*c)6U@H$QxybKh;9ZQKJdelV1 zjw4n(ynBgrB~UKU<}kW=w%)=KIh-cJ|%2WWNN|AM4;{G0oACoFG?ZKAeS+ zHawHm(PP(v<*@lTxT|01u&WTR}XnHM?O($o423rfiZg$l@>R@6pMKBFQi){M@hloQ>w%}8m^=VBV$>u2WX z*jE%^d8saEHRqhuDJyvG1)BszGV%@Rd_>B#Wg>I4;h27#eAlG{Gtu`FWs(y{{7mP^QR=O2dW)7Gh$#<~O3Z;L%u zBvqsi)P5?|?_y00^7DtsuLVdmpW>rBW1zzQji8&fOcw<*IR5L=6yex5iY44}b0cMa zfHxL%@FhtwHhannDIZ=Gxw>RA3f`*$CO_Ms$O2E@zqo!jIe}i39kS|S?_76;8~1~h z-+?Te;ebv5?lo>aU+ZuNUe3HYc8R?6l2`h&>MqU! zL61a)U~|5v4Rw3D$m2Sk%JTta;KKbH@A9G?r9qn%g-+uRrCe%!#Obovr1uX?AD9L^ z65?uVGS(r{d#q{@Jl!5%P<*}Cp&A}@xVlsVgQIYvcYcYAvYmenJbx^634WP~zTTl- zUylaY=5iIq8ZsU%ppfiOP~DP*Lcp#JK7Nd-sWwNp1Sst$eJ{l~v`L?LU)(4K^Pp8Y zQ)7;SnP`9ozvV_yj&T7s{1tvdyT|s!JCR^pDG@*bpb9j!zwlwn>6yvt{aKPNSxCgc z%6(gMy%?${vcNyKNk$ri_u4cX8!W1L5xR~PH=E!ts}hWGscDjQC%y12saupXvncaOBrMCTqt_$(DPfWPM*7>z zU+2-u=^c5x9u4O($8#?A$}KUewDkng7K_EvtG6lf4Z1CITe5ArzKDD7od3mz@}1YI z^|l=8UI!#gQEY&NW_Mz!@rnJ0-Y)V@MjMbaRVVp4s{4@O#bMOTHYOz?CHzGUUT3k4 zWh?sq#(;i>?M2pB!7Ufe^M^aI5N~0qIGCaD&jrZV%L5HhF8ZL@ULZiQ8OjX?)#*5s@wY7 zcXAL?1P=w21Asfi~7K$yRUVgVVe5WBLvey9{K}w(&O_6KSiHAo4_35C(;D zNLyvPW&6P$zb=wVU}0(}9w6GOLtU)ATLa#*e{lKIuFM-&qlOCLPQVcD%%3@JB{*Ca zW9VWo-{i}GLULOn1lm5wQ+#s*`84do)Yal7&opv4@v|>JpeF50cLj;p|#Ezq0 zs;DC>(zDk<;j*M+I%zuU}7FHKh; zUis03dD;L4T(Pw>8-}Btw9t=icHr*9JMhbxBSR$)8zlKDcV32FJsf#R^-}XyJwn|q zzwW&hd>aF&qaexzQ2xy=ODR7VS)X)%=e+7~m%p+il--(^$zJln=b~4OtOIpbYybKT z|K&7%`)Br+KUglv)b$u&)&M0uFkpE!GSWE#Y0GkS2QOCIPLpCqGaHee3QCrYq^bWc zEVFK|+hhy(0>Rr z4U5nNQ}km@l4rj-`tuP9J-;wVO&84A5wO0nWJZyvcXOnC`y#aYV{4Ud407g-#kWt!4Km6b7hv5S{kDY&V$nW$~`wG7#}VF7ONQsURGory^#6gKLnY- z(&-QPU-ga)Hucl_=1-0Zkg|GbI=mj9e?FJ&*K9tHOw5%+N$TFkVthqq~SH}Lp@z(cwiCFwS6)=9csF&*EMWb z&=9LfZ8Jyf>@9J4W_39pDzMb*tZ)$-7xCRn)vAVAlJct@nbf4HZ}gl3HgPt!w%XR! zaL2hDYR|u{I*aNSD(ULXBI(Rqk{R-oTfQ~YZhS{T)l=7h2(ojWE~AKDs9M_3QHlkB zTQp2R<>S8JX>7TYtQ9^iJe6GJlv9`7pY(k#3@bdPN?$`s9I+>+_s?H zqRc1r!xt6M>9Pf;2h>+}bnmL{t=F*B>qOsQnWE7$ww5EyVushQnQq(>;r!Ez@*7^C zq2@ju-uoh=b7okI>UHxcbp3J_c|skYQIKv@(Xc?xFLHOs@)M_TtZ!1rt&o$@vWho0 zJGLKyclv3sCu&voIoX$|N4?pNnsmytUTqKm*!@iCQ({?Z*UHS&aygsN1x$bK@6(*s z{7WuU_wQS<^ZnVD%Y}FLugKO}Xwf+Os?o)-Czou0Zd@yp9U3FP@8Z~Xa zU8Zm5f0Olo8_F8DoIB{;2k5U?HBihU`@T|FueITbpZz1j%EvB8udaWWH~vBmTCK>~ z>a6MrewJTUUpUuz2Z3I(ErU*{dGwvC*g8J`si?6Z*(I1rPF+bLGwp|ZjXGr{#->rr z%04!A#{V%vllKyERtlFpvS}aF?+Oijl?|HKAR-AT+`34hWlKf=CH)Dm!bfGQ$Ago6$5u8YZ?d9AIIXtIr1fOLt}8|wiV zj*}_dj;2u`^w1?Zmuy}MnY2hD3o&6u2D4$_O8$&QPj=t3&Pb$r%>yvq*kGBnUPP~1 z&%x=^Gx5xxj3(a&x9wkPapk$RLe3@E2M)_zjCyR)vH4eiyHR{Mg)htuL*|8uwU+6< z4|Oac*_w^Qfj+G8O>*)rUuY*x6gXJKRRua~LhEkHNx04XuquaM8N58JDYevl{QTL+ z*PSB~ZI2Vb1X|u5$H3K`@`Z1dIR}nQgJzgvArG;%J$--Jk@i)Gr&&_lLjZ06JUt5! zmWJ-JU`Ox!spUr7`E%-t8b$78YMi*fYSYOgttSsAlZLyk&WP2gXk=&T9bnC1Rnm3= zqd7rZlPd_+jgi%h^qWZ@g|IC&9W!%n5u}&f`p1f$97to;1Su?+9c<|qJ5o?YKgkTX zFo|C5X%yeR^Gdg=vLwSkc`rTo(ugeomB1Kp5vF1Vpa%w47y*Y3rfNbuY~1{EUg!e0 zaJ0MIeH?te7KRD68ixr6dY07cSvg51k&<7DkY4#rA6=o$ZgxB0DQGWjwt0`Z@RIxO zxWuDX@l?Mr9jGoAT<{I?)>2C7g~8!eaa2|N%85UWh}VsGRsKaEH$H5y>e6mRv&)Aw zPD2r_;<)KD_xe#BbGpRqw`O_};$&-=m;J?mRfxFp|`V1bPXm=;a zdUGL9=clKsI>P#yvt#EY>8fD5E6MtS>D}UQ0+)e<@2q7+y3mMg)VY1wAzDC<#7cDQ zmmBZZ6qe?3drY5~tf)%e3z0s{4O?C#LBmpRs?Vf|ZyH}^Hk+MVa{8*NiWGjXh+dh( zIP`J368!akmH2h5uV(mXRtGmic{GGg=*Vl%e6_{|L zH>5YhKhIjeXdITS6&nQ^6|I%q_NTq_ckZL4C`EJzQQ>9F(5+X9FWxywoiCZzdzMvn z^?N#H_ez4sE46A@r8}v+pX|7m4)n&4YkT$;cACXiIh8nrcCB4%aeR7(b>pD#)i$l* z#o`UqGsYSZi~G>y==Z}fu6!-@PXB93Y>`Wa4>@$vf@RdR6wgh>XND^F{xmuTuVsT%(+m z=`iYDnGWT+&kvkajv8uP5y=hu)j`I$tS%cXB-B2>R<6KIZc{-hWmO0#MEFf$?nFkTWEz|6YN@7NhCEHLW>1C*e@3NY@N*{gvW zy_(}NOD5QSQQ%}Gdfos>4PV>a=DoM3i@}pu5=wjHfDfNpAA0;QpAcTr?e=Rvc`XQ@ zmEvaMcKODAhzXxw%qE)21xCmja=qZ#ML1XiKA>aMRe^hhg8nsB5v*WMzUX>C&H9c7 z_(RvDj|Z6Q^i*=iFVyxtcp}stZc`w96Pf6XN#)NtAsr2PdNyQeEAV`%0!R?fNs~XG z?jovR&%A8=F@D#z){4(T6<;vhPJ99M3V`%*=pkvshOMadyH>=LwdV8-&sO+g?_+MRq*}<8IMKwlV7x(v_t9Whf zck5jLo!z%) z4Lt1~c=ll6&+&ohUk3hy29Rm*o*pwy=8U7`KYc_iI&Q=I zr<;iTv2aTkuFKNUn4!`BL8@?#7K!u^SoMFRs{U_FjlYS+Hwbdq!s4op%^5q!9%pAU zlUeBQzSz?<(%TF3@eZ8h%^?>jFlJ1_QMxN!B{xwbQB zWT#J`!ax4N*B|)j)2B|$PRrWb+AdtU(An8}_3G8`?(XZoy*F>%xZT$`c6VpFd4~`TPU7ZT)-w`1S=~Q{TQ$egF1j>ibXJw)J1@+rJsA|2@Yz_5BxK zWcVE(r>f$cPv$>f|7@NP+ zmxS&Mb}QG7Fstr0UL8!olU|q(e(R*^_o;1u)DXHpZPFM zAK(;J>S^ao2nPKpNluTtYd>ap#ODjXcegpP`IdD}u+A;(eJQ0R3Y{m#%yFbZ z2+geXu&=hwgI$juagRQJ;)svBYuHisTRK#Fucm3Gt=#-2Y?u}thgceRR1x*fF&=@q zNkM-XboS&&@YKb!4JVG&X|l?L&PK;Mp1E#on&48N=8BJnV^TRW=_FeMwpI~XP~5m> zMf+1P=rz)LgZHkx?h(^YGs4Hzk=}DQ@8l(H9ex^XSRxaU%}Y1}z4BbDCegT~Q=nI) zr#|00S}B$Fj6E`2sU9E~6tK>oyyJY`@9~3**<{Z`?6y9GBPVJ$=XdGtf~`wQr`Vj* zJIK9{J*PZYA3V{0*<1hzH6-M_UQbyrriL|)Tao}xGqlwFC+*zr2lND#Fw?Xr;SB$T zTDGOaK)=I;Xpk~@95*JfAMhNwIK%tE4)|C92Wyu1xd;QmQ6bkioU^M`Zxg?X1nB4U z-;&6=t{e+W2?~Jg>L>g3PQ7(Pto1tVg$5U_2PL-iw!P~Z==?w^@46AE{v||UE%DPg zprX^a(|*0bbizQ7K=rx6yXQwyZw|;MUiIcwVru!y;|<*|Vp!+q-}WoJJx>Z&?$OKI zG2ey6I}A5t9%U+lnh<`DwMyKy85qrkDnI+YH3QeZ|emrrcPn7r`@9=!v9-6Z8v z9zr!E$)5xl;tq!d-UfXh2EZJKqf|mO55~~AdL)>Uk>=9;pxZG~6nTEswzfk^pkbJU zqcqEYE8#0ts74L{2&_Zv9bhF3_|;IQ!K)*ia|p!nE?OEKOr&&^tl4N%wtt^>J?C25 zoXI3^+k;P;Y^q*nBW=i+fSM`&h*c;cWEuk|__gGW5>G`E4CP&?rLroDF1BDp#wzCTGX`$ zmkRZ;cRO-&y8jjgA?nKKB$}i=<|JKxwE}&NN@@avuRfPQRL^5ThKU$Do#5@>zJi|omn2e zcyvL+5-y<2Bak>GqQftD1dstuv^#BHzoZ#ES0C@LU{>rz-)>6c$#J+Wa-h&ad$Hos z!^sxXUkkY9(CCR1Cl&K}Mp8i>;WTziwSXix&`DIb{OymAavBj%^``e(A5e()vObiu zm9-j%V^yKGYtgt|E}+gQhU%czr=Fl^Ci#Sr$PAQ^jgf(tT5C~O;y2-E|Hi(Dm+B`N?h zB7}kkrEqOA((_41ou3Qqt-`Lu-=svy5^+S&5Y5Px8S6NEKqFjmLn*y(F(tcd5(~|n zhju^es}otE4H`T3`}iaw)kzNpjFob7_F4gHQrm2McnfTcz!}<6gz$d3zH@rlG_6+~ zz+<$u#?owGwB<*%)8?)A05N!A(Ci*G>xmNIB@$5Q@q(mQg}2GsST@3!FL9cpklZjn zjIL%>)TRGLl_C|b-Aj#8A6}Y}b}BBBh2DFZP{0xltx43^OuHVY`MmQGj�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 diff --git a/docs/files/logger.png b/docs/files/logger.png deleted file mode 100644 index 09ebe71346780c56dfeeb7458ae23683981391dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50062 zcmafaWk4KF*JUFCf+uM3pb75o5C~2P?(XjHkO0BmEx5aTa0~A4?mEc!^UAmTXLtJ# zJu_WJb=Q@1&b=KXFDs6Mh=&LO0E)y{Q3U{iNdW*T0|aRBo2mFMa_|p~gRq1m0s_L) zhTJ;%@q^V6Pl#T!kk!oc>t zFtd@XaLW|4*6ct85-KzsOk75K;O`oq8zI{vx#o55lKb!#@|Wr<*zI-bo82Ze%6!MF zeZ`eiWDM@K>}Lxrn@+=irv8U9X;h+j+NdLQbO@WHdFoHUMJL*R(7iOj5voNCY}E|W zs7X20sgtJ7bKu;^c7^(gg&~bPrMMD8h=doc=c|Vs%$5*95@&7Q#)yp1XUv;8+{dklhdCSW3F(F@FZ=38HvVD^fp-+3=nx9xJE-6VFOE_N|G^RFJxSze;9?4f7 z^0#8~_)yXSDB@$}=h_64z#$mf9;uQzNTiz}>N zFA02x8w?t)K5MC|xm|SZUB6#LAsW_qN{Vj({PXE*f=4b7ar@dY^Hlr1{+(gIo)c>V znc*g6yKA3mYcL?YXZ0f*95R6@k?Um}-$Pl8INGc8-_bG^a0Bye*er_K={zwIWPRH1 zzh>OZ?N;u12;B5$%{JSJ1krs-ce#G8A2K;b^m!v-evn)97Q(PHh%w|h)i%Cf^iHpx zAXgiJLADTLXd~zyg!nwtQIv?v?##D@-`ncpu9fmJ%<=y-_0yU6u*#37=CGo)~8MJzIl2+Y#NTU2?TRl#QwqI7?s*C|Cw%3JjG?l;oNn12VXvqbvlu- zS;z6QC2{R*-h#P(FxlM^9eh;*^R=?+#MS!=kv{_ zco$FNuj%$lv-%5sRA%>;JL-HD1CrKC_l0c7CcMsH24}lG_Uf)t4iMa*xVj7z>8q0Vg*gAnguU@XQLVWEB=s%`zMC}Kz<~bQYTmnYirEt z)VnZC)du_h$_;glSrV!UVlKDMuU8q0go@Nk;KmG|$yvF*%MI}GX|#J`yyVYIZEJ=K zl&8`DQfqUQ8+cPvUL!82gS#>IEn%1cy+-mMkyL&hpNKXqcCW5oAzt*oJ!&^f)8QEO z2derLhXq`w!UqkRGR0yYKT!r5CluFt%F()7MfAJZcQ0$@!m6td5n2v;l2{AMrLR|= z3vntRw~mA~>B$f)GNg$hH}cgjAtSkalW!LU)x>Yw*}{%zcTy!;8odsT3;VO`;meb_ z;M@0>J=x!f7q61;oCZ+V|1DTTt=$q-EWpVwu=$aL622BaV@6<9_v<{Z=43d#v6cLF zk->wbzp|e8t?P*#E(#+DN9NPZ^gj>tN*3L0tQ|W*a!HdmX#ZkV$NA-)u>E4GYIK#l z*A4o}dn2P>ni`h|vE1#9wzd;yXwRc=Be_#IT8Soc+t9@9^?0J^VCgJJN36aN30i)% ztgJN2J){ony}!i;M2_4fe&g0V+d+WvBrsro(xu8|^34vjF84hws=kpB%s^h!vkpuyA**~m0sKI)8c9Z#cF+h@t@)PDpv==w`?wwDNBsT}i<&vC^enw&B z`Ou5hpMl=B5lStDR%`mY1CFiD_c1kpI*(YmEoGC?;Ip{-^b9N|g_@Fph+H32QNt`U z)ZRfmfxZIXcL6~z`;$%v>40J6*l9RVsya!HEou@0mq#E>`I4^r#Yzv;+qoAy3d@Hr zGBT=L<^t!TL4pRGK|yN4 z)fb!g#GtdE>ll%;;=P(9^q3`T{2NSR;(~pHNzZ$)Sc+380g0A~SABU01zWc|(hN~* zuCQLMj3Yk`1nmrb^?W^$clQ3A$Q-tDMv3sN&9Q5Vd|*WW+0iiSiUxS@(r*#26{X<| z%)w`I+AUm;R8>hqj|h62%_MR>H&hUen$Kg-+|=z(YZa5&ZS@%zygBOT{dJ`qpoc5} zi2yr%H0RB)+P4zaUx(pGl$~}AzfH@yp$g%@ST~&YRnBKM+t=Dog&#t5ojzKggkrAFaPD$OBC44H(cAWGo-B1*C3qH-I!4I_v+-)R*MJidk@1K1S z56#+6bIYHT0pQImW(7Y*(~D-0L;b=HN+Ltz37@?ExnFhnvgIuDk1yI{NFF5Az162} zu1zK}h(BZ;VS$Sq0qg4Jv|jrvf*wvlboHU}{!i_bee+ah<el3$RV)*)Bxz z@;$Jkiq-$pLgE8z?5?Zk)5G{u{EHtp0Qd{!8psvIh>-e-&L4jcXjJS8VF*TC*a?3( z2-8r8v#;hgyiIR2m(W$~uC@w+{=B~8B|?S`$F+eA7gfcv8PF!^gc=r# zNAvS#o6+WEmeC_%Yd#FlaN#bQ*~J?HX#8;YZuMMnx{??wkmIhOusw}Jv3gk;hv6u* z+Of^j`AO3Ta5C5Y<2^P>m@V5(*kB9k#Lpz$EnC6so0@U4Xw>aNW8|hk-%gqc8|>#zu2U?#wYEx}Xv-z_2`0bnyY8P*MjL`2!TY`Z@v)yqj@1_{s#$Yh zr?>+z5fS%Nl)36Hu{9rY)0EdwPZ!?K(li8f!=QiG=%IJ-FGK0WmyUy@)XY7Q%}Y&9 zWf>hUqm;d9x?XAHJ+{&jfvMBhsqkDYYR=}qfjmwLi8^m)G#a>MepZX9&oaJXLheCc z`TDSz>q0z={&VMAyW@0e`FCg1YFCM9LsP4N0j#F_1Bo2lnCxsP(chLmCRb# zy^w|T509T`L=h7AS8EF4b&$&QCOvR7(6z(Dx$MYvKEW(SVQEl>`e^&?EBndIGB&mM zz+YY3P@24rC%B7hLh8Q929n>7qOH-W*qE}*fmy-02TuK~th4gjswcDKhLG4}&yNpc zMfEe=#4Gi$(c@2r2$1fYrJSuXcbk-b5)f!PXSVRQMjo%-)A3X^jjKJK;9NiD;_JVs zhc6`z9p98JzM^fgwL+RZw*>1ZE>XVQqCe5(=kcnwF6W6(KqthofIMGD6F5nD^V8VQ?2^d3^@Y&cK^U%7BCyjU z#$7E|Zefa)ay8-5ym{3<63aa(Tdy5NGyG3rlnke|$_R8Tj!=jRJKwWn2JP_UJ83=Jn? z68j@-zJIcdxF1)VP*KeebH2YosG3BCR~u?SqZgjvB!1dZ9!Xfac(T&*Yv1ha>2|qg zEty&JZXD3TF)Wi|BMCqQ)&ody>E3oi6^csY*|ArkdlGCnCHo)tFFc^H3vKUV&)=mC zf1JF-Hw|@H7oh}zkFw!m{NZv7mb4o6M0ieP0-H3Xi|5v=T}oXstez_>jz6^B+zY zJt3tojb*7Yx)H_B{KD@@m=PcOK}MN(_hV_Cl`XbYnF&6DNkT41XV^>U zNryDzndRK{M9=Y94Z?Oh2JIGnb7jruXZ&5oQoG=Feu9nbS<4nFTNG$1IqwNR7bCs( z5BTde=g$5c%d5Vl@m1`{2J%)d{Kx2btnOf~hM@;O?yc>>9$iCmx zGtkpXh}yT8z9_4`#oxTs*<~Oce22w5d+$@nH=>{@cT9)?{RGH!XEWr7X$>*Ej3Z-`X<;}Kg(zszk;~UX@LC{MfMFCD zD@``-eV<1-kDeH{-QY=%1n};jYI3EBh^-(T4&f2>i@u3udx;hZMd2V->#oQpJb}bxs`)j=C2XCsy z)yC5vPA-P6U_f^;uvz?30a@)=zwH<;Ax=PF4~OyX^{wpH^E5wQNIKgbbDyhkmAx~9 zSwGDV6Sy^r*NzAaLqWQASSA>mGi@$jg2^H(&g|n`dx=Ic*%e2c}NGqXMPq zdq)L`nR6pUet6fJRR!=~xoT=c36gOrs2PjZ`D~-<$;z8qwk^WfN!wmst}t5=dn`xs z{aw#+@${M6Wu&48%mjW{8q=rHu}ZuTDt7o4BX-EYBm=?35nB0)uf^*5<*KJXnA>-2V0Z1dOs9pE>%gb^^HhNh^ZmH0)#l(` z28h@G0jgHK))pTpxA>9Jo*8+sdm2uWjkK zL)_+!J?iX&GAvS27=`Is-CMFd_UaLa|7@)_JYCedtt@FgzFrB4qxO>-rnwl2xo1~l zUObpysR${XT_6cSJe7ncKSBW?1{>mDvZp*x%B&u?dSH@^d{)>vO{R;C`}OQCxk_W= zERy;9$B-^7cT{;e7pepkQtaobZ7)r!EFz`~(FKNbTOLp_Ij9@ORYkLo9hcp*^XUhp zkjWhhd=UZ8j>wvIy?oqtyIq3}I^HpQC?_E??4GtrkzAPzVGB@7Aj(|9jy-E&wGS+_ zV^iS$beo!az{Fs&{4Hn>avLrCC%&U(MeN-F#7uLpoQ02Vj`-6+nk5a~9Dz%1F$%o# zbOhg@2YmYmlBJ?C&bjCsOJ172vryz}yAeBaDZII0G4&)%2kxa9rhBV|lHkq#KkJtx zB9Bu@q49`-?q)eJ-cs5-=AUK{n%^X``#VQ|^i@#=n90OBAAv-=KBy{)?-9*rcIA3fVMTSP${$MU|q& zD1l;*eN{k9$K4#=;e?gO)sIilkZF(WRU@##?sqfvg^zHsJSpRn75UL5R3tb*%{N}_ zysm27ILq1ZQs^-#&=3gByc)kvd+^)}r#ftni-UF%@Ijqf7$0XBcu1M8ghisE|6wpr z%x7btIT`oc(`hTj-B7bVj{pykePA`E$H{qJ9!jfIeDcX!!V2qsKikVT5SFiPWw zT=5dxYUujMc>a!8U8{kPK)Y1mp;@zSD;9xl?QjtRoW85Sof4u20J!1i)z4Lp3f@$Y zJ(Y``@U7yRj}33bzNicgEd2TPh3b#!)fZdrSXo83%4SY7GJb{-In~GBw|g6U@AP28 zjjbwGNw7np4wXL9V^lTP*OkAKq9M|vogMD3)qhU`>$?=!o88gZOP|*D0hgV_vo=KCUOF*shxG!%k7qQiV@@Y2$>ff4=P*wE;b~b zJi@)CANm8tU)~qi^Wqzcxt&~ZEodVKtyG`4Y=bgvMd^oh64bMj!ZLk+4LE);*^ zqd$*K27aZb!_y3->=v`HOdB(SH!&o)Xn}dJe*ra@QX{=Bf&Mn$XwXB(9?DHJSLPd< zow53dG2&jP7j3Q6WegTNH)+JVG(;dP`Ynw`Iq~2Hr-H}ogyf3iuXeG|rN22Br;T-0 zw^}8YKKmLOJbX};s#6dG7&~JmpoC$7ZU{w5gjBhJ3X5$NBUk7ng{w4mp*g1fcj`%1 z=e%~?4&`FWx4rQwXa?r5`Lb~{0Pdbux^(_;7B$W}o`J1>;>58FYde4C>+a9VBZmsm zg7nz$c8c&#(kn(~F5;Dr68h9=xxbac0$G)+$ayh<+t%F^66cE_5rkot_N~42_%12} zTh7fDIal7iTPXuPkoM&1W@58U@4B{HrH!4R4kJa44O59s!Tvi#42)Insqzp+e0YDh z{E$kio~Y#gHH+?@YSRyrVW5?9Lt9ydK_SU=lSjiKF0azMu-)?kanNqkVcp!vn07CVD>WehH4 z$O+zJuRUTK-{Il1)CUS_7n+2|--;-j)V|HXYmrq692j$_geYU7Sg}6}f&=0ngfGGf zuxU|G3F^7bE!$?KZm`f;7Kew_&$Y8RUUbgB4pbP!vQmn00qBxB=0XpA-d!!f#67(F{Wuul#PgpG}?%@7K$!ohomkSH>)6_T<%NT`db^saI1(n zk#gT9OB5qmxm6~};wsNdpS?jb z@XAP(s_-pe8JJeD-Bl#A#%?X%Bha3ru79KEL=iCsrOKcCw8e3Tb57RX4D<8AQJ9j< z*Q~4iL|9ogh@*W&v5lV;NDAgrAOFyE>Cw-zasCi?dXNV7@lk`a4R*n21@ryR+qDr+ z&?n3yc-R_IP}q&P6oNux}OZ@(~LKYcp@{b{iq%h&xeE_XO+KhB7hg-od2FoIXh#=+?Yx9J}_yO8$@tDU4{NIJd>8mbHZZt1{ zF38Y`m*=DiusKOV!FX>hLxQum;~&E|PyVX;BMtxv`i;gf17RB<(5joSEV@T|vsG!m z6R4utb=0K7d<0iB)4G=WDc}G&<+_YVa4uVc#8|<%Uah zVSTYG)uqqC{%u*(fbuCMe(sy-De}LJ`L%YZ6AwYV(}Su>Om*6wVJY&rud0+bHa$bo5b)V6 zt?{5Yj{Dh5@$g1p7X@KGF^w-N=|Y+oCvkf(5gi4~2Hw_t-qHp=*30TETxI3XMpJ_| zc4$!0gD`YwS4D^0V%1e(14H7@$yS`(;T>;--zul?Mm{5~i|(Jzko))*JDER5xG-Y2 zK7BVxy&-OhdT+i(>CjnH3h*yxCVN$Ff93y3i!T05@9-Q+(cv@}g!gwE@D-jI*;BlS zp>;jTOI0XFq*i?MfcSQbbUuL7_4?sPKmNCH^fy6PYsUsWVcEZ% zc)*qbKCcwdS72Js?O{JeQK(6kmUe`}S}3u$G}kUO3b<*?{Y={-)c1=_x=CvcZK>7E zV&qQ4pna{`-~so?WGcr%gWu4T&lz^yPb6!~rwsF*Jvn!D6!Oho5_;Es9{Teik3#ms z-J?(TRrhKc^5x{jmm!BZ0VLKvTf9z63VYSH;5!OG;jXYW<_}1tNRPY;tFP?bBnb zk&pI^jih9?oksRe?JQB{4gTRr&XzrM?GR3Zhrc0?t4lrV5A?!s53wz$oi^|FTz%97 z;E?1bDQ(AK_Gf{Y^PN{;o=^5Ch6_de_btNE4YuoY5uQsw z1FD10mX)L;D4$X)9~zT7x$24dW7}Y$S6|I#-88!=AM~5OGAE+n<>I@2l-Q=~|D#DA zXJK2uG*HQC1K{3IOis4hRjnN-s$C-{HIa_Mz*pWNU3R#WJRWxzh8QG>N$S6^_avf% zH@=IGw%BFYSFXeRcDf@~um!6Cu3@(WGII=I`?}2gpWk~i4UY|~MzkB?j1rnc0b^Uc z!MkS>+Rn0Y#snGte}d=s+FPz^B&56R$M008n%W)a=yCDR58mr7zsws!dd;!tI6Qly zEreitm!J~H;q~}kB47ZZzz?}zbJ^wCFmXR1b6myVvwM~S)!EkF1NZEXoLB%J*x%cG zpE&5AYN@j<{~ebAxky)l(q7@P``$pLp-kD?g4BG{Nb^A!$ zTKCQhYn=VdUa9g{zz^p&_WXE!l5Zm>!RoYpDQAiDFkq=E)hQR^!*$_2I!Vi?#(3x( zJX-T){iPx5{4@_CzNPY(#@(UB&^)}2Nvo7`^C_8UuUrm^=Ie;8%fEUrlDdCGy9Nf{uAz6h-+p7+s|w2%u7l>Pvn61m42B~WdEO^z z){U@y-MG;?Q`)R2BjXsoNq*1e*}qB`_8tK-%;0RPBBXqFY7V8-+AvDI+pIsj;$`@q zXy1#??ip2N(^hW%oQw&l04*~srT1EQm;!br(%|g2>T*<0HDgKVO%wze@u)AG{ z!;^@vpt3PS#LXBmF2hGhM9k-6o0=we7d9@eSFJF4Uzb$ETqhS|L=eL^NzAK34Nh9Pv zzj|=!_z@^=-SlN?KBr0tEtA1eS6LA zbLv8$$f3LL<2XK+cJnS+FC>J@l+)@GGNr9e0uSHc-Hn6vYt6l+e|RqBpVbmLtro>g z$sv__QF>!NNLs3iLKHl$dnTVBq|dSmdk0fWb|7tBj_>(HF;g7EKT) zGPB9M|8yl#{-5X4SNKjJ(SLHFXJUyxeN`^lJca8!!iM^1j+;U@lT4*aoeBa3*qi{r z5w)JIiTB_S+<0~PPHtSSmkj$K|J&)nfD)SipLGZ(G5*h*{vYRMONCODu{%3Ed~TPp zfcy3S#_{ope$}FQW#T5qPODBK`%Rr)y5JkpB|)u!OyegujBsTY>^-I znvH*p5tk&!5^VSXegu-341(VsJ?*C20J=xBWn!fmeuAwVu<-B}ks3UGr058u@V~$8 zYDq{8Hai{JJ2#Q~p8JR(ED3+3v zl2(f|A)9%edfC{(K%@K3;b1HkhvocVbEU)Wk>TM~M!oJVp@4f&ej)TPU%n*LYjN9c z{%P~LQ!dwBfaB7DHuH?_@2fLi3Q0*x+1z}up+OWhdFzW2{q>J7W0G{fdYSSkOliug zpYKT*Lv*a?XdkqmHI45rRj@rdG9EVsk7p2Ppvi?lh7ViqX_PiL-cJ{Oe|UI+8|UWY zl1X7592+b53Nj^jl$r0Fj5Y(?P^9B_N7d@o+rX;e<>lpQDhK5L-gN2*@&{(afv9h} zVpc27PCdaWOAR*tmCDk7MMXsxbLDkaRSVTdVPG|fy)7$C_vUcs-Me>0L_}qifpOny zvBky3Erur#998~xRH>%L#Z80v=3h>?M8v;%D_EpR#O2Pa|6;;mFqXmN;(f0Bn!)Fx z-Qg{gr+`9CG#@O9;NNN2I?7C~3QTI2&o{u#lEw zrol9a%awt`DUeOSytsHct{F$p_~&Mdz8B!}EOjL_8T5hM-`ds&xjiXyIb3b?I5;>U z^qCe04Xe*|HSXc0VXeBlTDeqpV{0omJ-yBOWbrKqrF0Ub-pOL!!otEcok&APb29IV z9tP%YcEZ_1^)0_z)Y+`Hv)~EhHU7(k^QBn$lRyK+ppyOdfhBl+&&0%pLA~~Ckz!1N z^>Sl$N(vqp*3Q-z1}3KC<@O*N|9w`FN}KzQxslNh=rEiF5vxV@AN+r(#Zt;Jn+|92 zy2TLG&6wX@Z1oq&q|OFQvBE`c<%&nXY=$u;(5gWLG|Hv-7yZQ1Emc9Ltmc11>}T_8 zYvYDbB(vouC8exREbBs4Vq=DfhF0wzJ%jYyWkW+lt=HPi5;<+x1=&-r{*+iI3%=bC z!TRa9n)LlDbN`J1HtL$aql!=crk#2O#oSL74(8Cg3pZ`OZ24#p-MzCK=Wwc2v5WDs z`I7g8xJA&u7kIGdq3i3qlde`hkFa2G*1j+6R=U^awgl+Zf`S0>^mtUEu8|;Gr1%1! z0qE%HB=M4&{9cRQC7|`ruCA_5P1S4^A>Ekifg~Gch1%oxm=&S>wqQsqgbv1xi13v<4>?V1YkDA!&xN1eSw(YMZmt5~meXi&8?+#gxl_Id z>lN#q#R54b?}wfBNFIGuB59JuBP>MNrTW)KD@dezWbRk;#djDUn}3ROayAK>syZ?s zwhm$o_QrJpph)p>VQEXi+xui1lQ2rV&7EtuVTF*8(BtON=#Nz3qb^dgLNNkvgNhbC zN1Awyj_Tq0=?GIsgfnXS%T@rN1d@!am-wGgIu#jhUj0_>+48@8Ju#2>c4liD&P@7) zvaq!mxJ{;gT6sMK1j3|Bj#g@u2G9icu9^~Ne|S--j~ z$w*m2jmFv+6_lAN`cFgD)S8b?s}BcXmCKNEZl4oZ#$!KH#{*P3;*zFV|RB0zgpMgda`oE%fsV_5UYx#ZI*z6vw_R9u|nKt?VCeR1=8T~ ze(m`LQVBeowtM`DW+TV+UGA3E-2xdpLZHOdFD}S>7Ysn6l>r7%6qcxv^73-v{CuMa zTU&_)os)~JPHfDWWM?{c3(O}TpdEmr3-tI@>5rrS3BwP~BnX?J30+)V;0EjA)|-rH zd@qoF2Rk8~C?(rY8Luddl78vjxh@5^L?j?Wtsl;ihlny;sqat!{S1a~7~oatHJK06 z!(`z9{cQQ;)&69gMnf`7PhU8p2PD%cG%O6ijQw+wjzFf|-Y6jpWfHP}eM7_R=G6cL zf8=yCepzWLf8?+8>tjM(&f}{Aggfn1At5sHNK`lg2L}gCh`HhdF1B#UxPk>!g9hB` z{JNdKi4`@OFziieZ~*`9e7l(1F zJ`Y0`nW_Y8mnT?UzQv4NP#&{gG~g^+t4Cdjb^V9{`JR5R{j&?z+IXwI?E(Tk0O-1o z{(2^Rcno1^+*9#R{RAcd+bX4j%j0jpK)L2TyHNAp6dR8DDA#Ez%pI|b$yyj9tD;;> z7P0V@U(aIJLc8sd4v3Ynv~!h15kiqWx$5{$XZ za$HZbXefWJ3ihEomA-*g`DjW!S?gL)&l(5=1B(v})g|RfXxhz==NNs-;|T;9(7x74 z@Mw2;Dw?lHP=GJ_iEKjHtDph*F$mqd15GEGN%#sZMZR7Mmnk=#7i-e1P+AxoIT21w zOt6@YS?UFmV_{(}Zr$IzGCv7g3_}A=-&BToJhh^---$;M433O=-k)!PW;GCZ+n6Ah z>z0(v<+#73tgK8=Pv5q@Ld@@}n#eib*Vi{R6uMm9xwx1zXvodUIlr(FA2xJzs8^+m zjg1`f*!CinVOCf{4uD>q_x72R{|X#v5=4=vtWhY-)TUZY^`IS4P1_->E7b_{~E2MkG3<1;tZg~M;VU!|c zQbIe6G3SfhzW-Ody#|9ACYFHodE^lJoZw$IuXL_F`V$E7 zod{XHIdNQN!PrROb@p&|=}BA6uT3BM`h#WSjM+Ioa7k`L?$50_Qh3R!M%+BZGr}+{9K=>-J5fV9FOakGR1P@~`~$XW4bNGok0&a53KHm|kcDc1BvGYk z#=OiVZq!&RPoYV(e8P0z63L1^T+Cr-Xr{3-6GTGa)zyo?S>Tmah9xHpXEUnO0j&`0 zC@^o_Ie3~MrsuyYiBeQmw+93@zfCaqJ<9Z`{Yb1RlZIh;=Oq89W$U|6$S+f!_AeyBl|{&iHJ2fhkSalJ3BRcRP!oHZuA~K zK7rcaps)GH(c$QT>Bv_;=L!~V7FV{c7tRKBTU#h!Fv4;(k#CVSQjkcJIvutLqF zFp((0vcsURPH}*U%am z)oJ6NIJ$dA%L-Cc*HZ9FVyEYpV!9N*4#0a-re@230wlwN5}Z-%I*7|*5-C4V`;bBZ z>U?|l^(FOQF#2K+#g!*2vONPNNUMq|941W2JU%bHfOICm7NjpWP!{AY{Di=J3=Ae@ ziw98= zWE@)=;y$6}zU-}{$J`?SS@C2Fqh=Mt2Ir_TL$GjGMS?G_E2ng>x1tGdgCX1=&iAEWUNGsGIVSX#_F$yn&oT; z_YFmnH8q1igEWtRSW7VzHVZq)&3~q?$naWFTVBNlo}xYVv?B4Pu!*Vv#`=v+#1GR` z(~_*!6(S*JGP!E91AvkXlWLp0da>bAQPfvlS{C5;-0TedSkog&z(^krpzM*(jw(!0{GA0_ z8%R^T$xZvx@+M3{P=9|^(Q&%cvbVd74dU0cGr5AP1IOl$4j)CuxYShqrrxgK60zzp zqh%o&RABtGTx(y^#SQpM{s{U}i_;Oi{q_L1^4Hu6VPWC1G_D$u34vSIcDL%`?yUxV zqNe5sA>a03Z1{~;C5R+fym0HSSBfDI|6IjZZ{s$6G+kq~q+B3mOVH0)TC4aqTb`HK zor3C>;(ds{!&P;4jmO<>mi#Ac>v9PR3E_>aP(%rEpYz3F0K9Oq+zDVhxO~&G`TXGu zPb5F8%N%Nbp~eI;sC#)iO|MV>Q(QvA@!t4wAUJSu9LtIQXMFq&B$jIF(lt|DEKoXW zUDxK-%@Fnj4}?g2wa5_I(y4bi_PBW#~Y0{_qx-C>FMc{rG}QqM$hXBak>ubAYrve+l}rZq`mP>0iTzrmuHBD z92O3a%}TRUkz%=aTeA|Af2QZ9gu1%AzWydCF6@n^m$=jy7Mku1#XCDYZ)|MPRn(Z7 zvMz$O9*@TZBzo+Yb2CIvc!9#%*JpEQlX+4b8^oyi?AM1gzsbZSoDL?9rU%|_|Cm~J zGr6BBk)V>xP$-!RfQNXvU1ajRJ%ZRDuP%7d&{@wJ3dn5t0?Fm!?ANG}F7pa4NXhS7 z%zir#mAMSQ^iPO^)Q)^hTPnQa>kelyw#?L zsvnNC5?4VpaS&ne#VlQJB{3|MA9Y4nPpR|@?IN5DG!vjxb7K;RJ|=oLDa+VE45dL~ zVS1!ns&Tw|rNhUe(z`=Usqv7h!~!bC$1{D5^|t@^Aostu*o3awpPjPY0>SV~qg`%Q z8Cd6ToEX4U4iYT~cOL*06V;ZE>LrX-nX}YC!k=e!SkxKb%qHg|Qs|y=QL)>7tMPWe zduU;oNU%n|!SFv?VsZ8|Y0S>*k5hwj>2sCcUrYH4bCSd-8WQH$Q?z z79{X_3Pn;0w4hS*)q;k62UK_PIjlA1<)Z=uL_m@@G&Dr7-Fgq|0XO>-xk2`;42m2p zB;-`GX`GJx@=8kaT{YmlKcKaMEZZ_3v9Gu$h?<0(c+|PA$b0)XURQy*N$C?g$>3tc zdTQ-k@jF?oF5w1H*|<4fSz1@=VrF6Sd0jb&mjOdu&ejyE12&*YJu@!w>UlW*d4*#b zH~62x1SSvbt0RwiNheT#K*FI%2oh#tVIhi~1G5rH+XY*W+fcCDThr1zv5#S?NfzM_ zA31`$MfAEXzL$Y}7@^Ld^QDEI^|p4o-o)k~Qp{O9okkHoXz2E@1N@JJgM$kT$;;hE zxfe0^&d>o_7=^y3_=QLRh>jQe6Wk8}ktM;g^0oUci2uY^vb(Gp~u~0`=?r{2av3L8T&5n3qvM>%N%`iWH zoH-cE2lv(t1K-=Dnqq(ETr-E+-;*wX>RPJc8!UG;eTCLLOiSN?Nv7b7Sb9{!_5!=<9 z&3lUTh)%63%Le9#=X8DbFo#;mf+G<;mmHlwB9OlP-SC+rZWl1~Tu1krQrfP-Z;*Yp zBLaRad=419zkr12mq=MIj|cgaQV5BTK?+SG8>CgbJzMJ z?Uggv($)D_^Hq{Uxnu?jy8=^1(e(T6i5vowmklHVrNE~{p8kD$$F%?tkM;;!DuQsl z{nc$rT$z$%U6uOns6XMi)Ml5OmY64;q*7Ag?`TAW(en^-gLS9f7&@+BwKW{y6S-)PcCT+VM0oXBTQR!Q-5y`}0*g)l;G%J0lX{NT+cDpJ=)s+>X4h@MklNDP--fOU?nwH2Q;v=2|j%uDt2 zjRiqL_G<9~UU$sVh0Vq8roON6*|GG`3G%(1ev(wo-Htfd7z z9{Sqk0Jf59Et+^?D2Ym)Zh1=NSql0PPtEi$4i#rr%B!m-$0n||rKbP$h#%w-msirD zItv(lOf*|F{$&^o)!sWl90aH$U)x@Fbp?o#d!8QecT+p(a2$Z{&&G-|}x0@#y)kN4q}V*K+a#UIqp#kCoq8gJXkB*U#+u`1md= zI8!q_8@aT2;fEWiDXNM3IiXRl9D2uVMK1Lxzcg+~q0wAaFlH!tI3k6+*sT}x6-x4d z$e!-(f)|=fJUw^+zAzXtz?jKPO)m>*d!AIne={EHYy}x}1pN{IhqaGZ2b&%5Ix9iJ zmU}bc`?iQIUa?wL8mO#fq}pMP_nt_d#m`R)B}Jj2V(M*b&nC_1nK(L_oY#C!=^-;! zOi?d`^OZ~<>F)No()*^S_7;e@Z+f$&$-ojXxwAO`m4?O+FMOf5v|0UPfoh{)Hbbq& z%tE5*981cZhwbG4Kwy>@lH$mdTuutC?;bu~m7jRE@uEFBk2pFtrMutRy-XQdu;;C` zbU2(b;K_uCPzy72oBlD$4D@-@n?KuoL84sx3@}>$d>zU|63D>9ZZl|*pn(QKBIU{2 z^(*qe_={Oi^Rlc=u0m0jfG6Z8@haC~3k(ea0`7MI)?%r8#{-1e<;K?W?^JK?bd_%E zu%SH=B}qd^JJJ;g`GOX!{CjHTCfy+CN8jG#oaNZ1$DL$LA{g^P3;CORHqpOyb(`)1 z*dArF65CV+KQJMe6cs@M$d!172M5=)&GAyNEPwCLFQzIKESp-X+3CGcE^WTT`~G8r zc;UfuKbB^KTT^AgtUe`@+pg7OHd^iN)wVnS5GC9tt@sWg5&r;04H`*fV@TJ3*Gx;l zyv+0;+o}VfLk#3z;_lQrzg+6zikXLp2x#Qyk)S5eFF^o6030cRtnql02sT$8uz_)` zcKTxXu07qkAwPe2HodleRaK(9u|%x)oiKMG)4|407?1V zw+qE?VVyTervH-~{bYatCj){x^Zm6_WrWy&6Jm5kT^;WKBwA|o02IyM1?r2V_&=PD z(6ut}7Oxioz>MP;4cfmhqWp2FN9pEEDIO@{+xq{{<^N}n&v*W;irRl7vqlZw+XU*Q zu+UHdP`gT0CvIvlngm_(@E@R%1Z%ZqG26%n7B&N>Q)-kb4qQT6D^xHI>gt?8rMqx?Y&}^Fyhs!S0oETZ$*^Ni%hD*k>0MQLU4o~@9tI(b(jDP+FfUjb1WA)4 z_sYl!GLVsAptZmm(8b8YQd3!(HIZ^jBSHQiq&h}MGmh+{RD!t^rmT3=6J-=MG$kPH z3%6#AmsA3QzqYouv2mXv^U3k?U#mb6L!@J6%g+j9ZrKPodLGXA>luI)CJm3IH z5G5)?`$~)D7HZ!|g1?rQm7yefy*xck705wlwYDygj)n`HZQ0`l34e_KYOW~lD`sWQ zCrbJbP*qc_I|-$fadxg3%eAw!bL*w-0tfZ#SGBb8#14AK&sqK2+}tcKrUuJVsHBlX zzZJ}kj3`XoYS`E+l+xxxCG(0w{$E-;ZOUrXb~Af~4ez%c+L`i(D0u9g-S+J>YO6BA(sy}jED3ie7`%Y}-IiwF8ELFf#Y93~E~=jfvK z20ZZPk4x!6HnwNqq}A-`w&D*y@7U^U=45F&02D$%RkA{Z;7@9hCOs8ev#uOLA=S;u zY+q$3tTe5L_SP)+3_-VNKyjJm`X~ZVMKrZtw8{=ng>Z!T9AGcRx$QCrUD~hp)FVs zHDmWN@pqK!q2Vy8yEAcessjN+Wu>c8B0GYa1`HsCo}8RafLZ{)=ugPF{{_-GU-ifR zgxBrz&&o>MD1+lamTS5f0+wJweIhr>>Cdpdy84iDjmCa4tS`6`Qj*1VJJlbQ7mAV8 zzD;f)f<;>Z9TfVLOMPBnnnToC^4?O@(127E3E+&VS+HbJ)dCN7b#ulVP5SYX5mpu! z(3Ty!(?^ZBIKeSi`j!8OC zfzRiK0Dy%S0!tcYWo1qfVNiC=Q;7fdiCO{1xBjeA)7k^Rq)@T=@X-9SQJDmJ9R-!c z)lZYY!{@aI%%}+=hr+vrM$y;!rA9o9RnhclpyulvF8ftTEEhG zyamm)nCb?NdY@t292<$YWhXga(nw7$xm^7FTw1TtNcPKjp#!MD!@73M0_@5KM*=J)zjP9oz2+`WhaXrWW@{T z+JOQT&3WHI`~CPKUX!N|DhmMM;o-6J2VBGHv;!-NB3tR+pPwTm(mZr)hA3u zf0B92`jV28s=#kWigFpe9}}}KTzQ$l<^C_$-YP1tty>o@ED(YvSa1Tt-KB7McY+0X zcMT+H@Zj$5PN50z?h@SH{mx{q{qKES+wDA@cHSn`s4<6h?_cjV{@x2|(u@@d$}PNq z&l|cQG!3MEP1L#DK5icHy|X^FqL`ogz4hT&+#lEEJ$8u5=Rn>Av8Oknxw&7D>+S$6 z0D*Z~RF~YK-*xS-!cO==a|l2@^f#$xne8n)f-+SKl#9yhjiLM^R9PxNi^@u8v;p?n zOezq^kjjgJMnt)afV=JpjS+;4^WV?S=c81Tw+LWl2ubHE88;*3aq}}sOh~{EG+1yd zCJE!oEI9|xV0={r5ORPd$Wt;mH7#Jv%2g^7)K&{qp=K+GT#o06v$3(EprCATZySY* zkW}U7UT3Di@`HX)5%WU9!ZHbT#n5iB>1j5Tl|^p)SOq*cBWo*P1;2s?%_%(ll;a4J zzk?kgTc(ee0O+}nx&7lp=8uU9C2PH?u#!SzI1pQHRVN#6xCZUn5^ z+!`EDcNaUku4=ScmT8=T1(Z((LIQOl(Zux|^?0YN6sd4=aaq*if&j5fLqh}P+!&EO z&vWlk-i3Adyc5G4$cT;ISYH=X(^ga47P*TZ8VkQ)MGTMpgyPV&w6yf;r1@3r0-Ye_ zqhf`Dc^AyN-xpPT%9mg^nB+p>!ru?3#!2Pn&KIj_nPp&geYVFg?f7=BjI7U9>>irT zu5|$9G!)3D5@$N=^KA;DVwiD6-sGc6!^(kDRE z^obrTtf?0Nhzgg|n)0TMI7ea(5)`&Z5Ygvc2U1W`nF3-D*XV=>?^M*)Ev+?a23B3B zq(6rj$XqMF8FcA{wQj3r+mcH%(fH*=v%fkr1q-Uodt{KlimMKk)|D<(i_KaCcIO{c zZaNslspLDXK0GbJf{xq-6M#tTd}RJgO(p=_he|X&4UyJ7F%gOklnGs5{v;THsIEmz zPy+3T7#CSyBZfzzrKp(2W(qLio^u=vWAt3%b}6t)N=jmD&39EAv{+%<8ZB$h++PF$ za@Soll^)v%G9lG9HFR`z(-v&PaVBDAt+2?!2Q*z-LHHHssI@@_N3ncq^P^@H3Z~>R-1e>cElGHV z$_8DW6c;`UNJULeOX(P=bP}KD?B{H3?=;&swfOq)eJR%v8sx%ciDvE1)Ddo#f>wtAQGIC|pZlc(i zKCe6h5+J65E40>#lM)TWzM()t$^fx5jn-j4CSXl`Ejum5LBZr z@ltu55gaCtG#H2%$*lMopx+X_F=Tp=yW^zPaZ(j;HKurKX{a z4Xo`E)%?{{CB;sbQVI(K(Ny{4X9^jITc?vKH1RHkecS5cXG0` zg&u?oDl4OqbS$RJ@|B8!*e}@nIVv`m6fnPNXcoaf_y$h3fZdg-Oo$_6s>~b~8VZ2z zvJ!N4b>+Sdq}R5Be((U6k;GR*hZQ@(9^fLYp&<(iZ%ynUQrW|m&2$kdE-bwDy*>u> zg<5!mZkt$Y*ix1+#kkQt65fRpi~iVFuKHYY>J`5_xkGdPQ#s?lbWR~d2LmdOnxs|o z4IM1>o-@b1k!Q;FgW=EWew!Fsjk%BMC%yc3%#Pb5^US6vOHIn!+HXuNpgn!7z-e-H zuj}71W`6Wge|Pw9uLvZ&T>CaxVGBJL%9Y2NGM(Eg^-0~(Fk58=C^vIcnzFGYtAd*I z+jUm4r}E8_eJ}BaB3gH{Nec^P)RiV=E1lI)r$H#0RyA*>Rfd%;A3RuHx_A_S%zdtr zvV2e8I5IVBDlRIjIRZr5JC{N?&)fjn3zIH0xyz7UGzmfzKcd|}G3?d=Ma4E-c@(L* ziwi3fP_dq}Agtx|eW`(0+Qix@o1q1jVe~$HZ)k3A#@Z_FHzN7E>(uOLU86zEs!@|D zKh@P2ipU|-)a?dWbdhmI5=tH7AM@_{RY{$>fPe4CneGOAk_-Xetl2Ez9?_2nP=~_a zDt&@9RN1qc?Km~^c&}2*(KX-10RrDBd{IfsMH-AEZUtFve;^XhJI3l|o7pII)0@xX z*(iyr2_ONii`Wy3*Hb-+&+MS!+z6BL!MtzG>k(WKYXRKs$oy+g{GEk8CvE^mh46tO z&EpdqEM$2l#a&yDmfRpJysWN>HFkpxeT7d%kuU>2;B!YRaIl=q!#52 z38Ys6toL9*!zU6?z!~Q$CB?>~FKkOTxHb~p8{KorsiX{>`_}fOK-dJ)yyU~9r_LxH zKp-zjGKr*MhxK%qhE?g0^dX9b!8~;8!D?Whvr7{;bC4gWMT#yFc4I1LV{`MXJ%g+) zKH8~o2>!q8XD<`Hh1oI!#bu?udWk(o4<=~UR~%+G3S-Js(+fEFiG^8^A7Mcf20kc_ zar5+d@%nOQ@%!NmWee9~DwPa7pdyoePykO$}IZw$tS`cM$4#P!y zdWL|XeC7?aUHNr*!TEYo3)W(fGWdHu7x65#U#I>lik2NGK7GRABD|)W8u>8FAH3Wt zNp7dUM80}S$XkFw>0nv|Yp*UhL@boOpFZwI9UL5(SCUV(BM?_??cB-9TQa`4u(aHA zaK}T38Eg{D1c5fKvRt!z=QGL5*>T5&km5}1HFBB9O=y-wAd+8pvHGXUR3R78Op+uS5!^o!%z+-Wq z#`G6Zoci4vP$k|DU$b~LKBYTgD<#QRRLzAyF&lk?X;h@FaG$^Kp6-Yx9GuTJlHDFg z66B^}>AerqQ{2?3v$OW`;Tx>BP+ADlp_By6>+Z55!j9X2H?CQ>Y3MhS%ABE4fQRa! z>)~LPk(QA7%_-*;cehRLPhA9l5Ej5i>Ie(%>1o6&_~VGx%pa!l$^7)w6eq~*ga#2x z7+f(n1Lm~E!xow`U^=M=VLO%4q&Aic9Go0*}`-`L}HTndn}6DOWWF3z=vH% z%VUSv$;Tc zLkDj3%84ViEL)x6zpHe)LGYk5flHyF=rv=d&SL)>e&#~|DwhPAd4f2tF=sCZ?U>^u zNfA069G5@wn7(x8jno^%qSaAO2TM!KBNs>nE6pboNjNxqs2>hW38D~g+P!=5=mj9%kdcw`d%G1Oi%XKAv#ITg30hEafzK5Rvt*_#2STh@uRXN{ zGN^HW6Yx?lFXL|<0A|KCzkjD3BL*2Hi>t||IF-*~-~BplI+FXwzhgn(l&Kx)iI^_p z(b_-7&&Njy!o|hSoqr9hF9md|^KJ$CZ8V;rJH*Y+n0<*-ICD2P4&hEKuda@HrHv7{ z1C^%wUQ1OK^E7MB&PC4HRu5R@bq@=b3iyKN=BoppO07yd>j56fOrmP>=on|K^d`0k zO_`_eZfOfI8=eyegilvd%Y%FrSHm+3Ijr+ejD(AtULZnMy%<8ydoq5pw%3#;P48%$ zXnqs1Arl_RH+4UwHdcRAqbnXK8uB3X^Zn|#v#E&f7sxaTlDR!zl1f@iY6NL9IM^7fVI(DXh;d%8luUVk{pyjzQlANpuD3QvG+Xe5# zk37{$EWtST*N8B1{)-OKn;Rey&oqIxJgsw=5wDnlM1i^+wwUrAnOKg>2rg2flLs6e zG#p`^DMfGiX*?@RP)=o~0@~LVncoi>!jusU?me6fW~>8}I@j}WDxEiFWPh;%mO^vT zC>U1|?Q2ZTyP`!Q525r=^bJ~N+;c0(5gtNKSk!F=@@!06Iy1zkJIB=k9M9UiY}h0$ zhrN5!b9C8l4j+av&J(61*d>Q-vLvtbJ>o36Aj0sZ-`0%kvv8M6mr>nR-$t?xYK%=} z9%V6lO;zTbfzMTd_1yIiOvx-Kpbf3O;WjaO@x{W!3*%z-13I0FDt z=E;C4u&>VV)g&8(KxGOhehgokaMA{$(hqneCHJZ5a+Z*Zy!`IR z8-Tx=C!c+2Zr zx?aguYtbG1sK^cXbd$l%fC6R2uWduUbXXG|isb>KqRi<#IM=z!OzGBlOhLca%5VW^ z1y*oO$^GpP)3SKfRPKk^yI^$Ex+$EK(JVLW3dQ#ucDda65j{O(X>!=;=%l>*KaFR5 zmE2i1QoRDlIp2fce;&|Bse_QxnnHohDzCHEYdO8E>%D@HdQjI&D=I3eMEgIj#GwdI~DIO{=AaI{2n-PLA$iD1UdJ ztyddyz@OE)tI=opm}(DF{zz&AB|*opS&^Zpr^gWb8JBBeq0MQkpSu7Z}-)!7A9W_~_--c=Y2 zw(PsBFwyr&#QBq}xAgLPv+pIzU?NOnCBLa~6a3B>*i&OKc(0@5XlQj9H^Hejuza}A zx4{R+W62ICDNI&iBM(_{>)`=`suROkzTswbBqC2xEpD8h*5`O9#T8$q9FV$cDM96K z{iMCWkXn=X@3YHfNl7s={1MyCCo}1X<=0AYK?na6zi|weTXTV|#1cshh`O zb^U7yGLNU{+oX7(AF3YKTBBddwKXRF`Uj8kTqbMUqt!^w!q47D^Q) zm^Mu8(f4)T88N#$81~{(BmAhPlPYCM;kyIeP7wL8rk;x92!RF|^_UL#+0R-C5^|pc zjKiK1Sbj_9Uh6zwOQ_^lVSA~nyGkl4#Vp&XzY%TwmKIN4W&@1Ro^5X8{M<1cDxaGdI&)qEpFr7FS))U>71#Sm9ZqI65z6|()cb$ zYRj7_#+LFks=6HBtRS_lgln&KHTPW?cjDU&e6xH6X+NTO?+B<$sBbg+E+;&EBJxt& zj9B(6EK2V4Opq@1R!wTy_EBL3oYqejc%M+~vZ^ekYv)ugG(*guF)LG#pjGO_=`1uQ z0a8?fu+Se>V+|7Ytdizx&B#MLGX`=?)y)pir`&0Pl3%N!e^h|?w`AK-1Y+d|PhX(f zLsrm_>z&M{KG*H7vMWS3;@0Q0GLV@6R_c;BO6_jHIQN2WA;hDzqN7PESD@^;l~upJ zTa%WwlA7qJif;{`x1w(l5sA~;dLm(bt?B#|sUUIYI-VB<7qK$*V13!3UHHMpghx~{ zn{hI|u9Hivo`hZ{j; z)ivL6F;KBqeUuU^6e!R@>tm4P9@T*@(>m53E)=R046o{xOb+HwKFCNG9K-W+pg;=P zz{M6x5Dn^-?84w+fJXe--YsrRjGF8{!(jbjzf%!(#9{o9-c*myAeG>p-b=!Lo^5@i z7wpb78U#`a*k;N`naA)X(WY3qMk^--iI7K_IfT&i71C*va$am&5q5KgW=kM+$GD-? zf`}Eyvw6Z5P0my>4vOQNt`&uHYL~JbWlBO@5?5KU{dfDq>b(UTCKkK=CrZ5&DIe}i zeMu&+zmV+mC7xQ?9o&n>rJF`g<`2Dx_V2&;dn!{!|9-aoKECGf zLm}QT2dqD%5u6P*Mo9iVWZ57MYW{inFcr?U;=6Zs&sa|ikfT6z`v0~fhhsY#6h+6C zWdUbrXiL;RW!ZpfL)`>IN8+)72(lq~hw@Ze85tx)uuxuAU@y#`g~w3UWg^TMLZ|<+ zyO5K$J}a*QcYe&FS8MLn8jjKH4??-7L!3T@s}-+ocWGMb+~VI4{&zb;sT z_HBE$pK^wpN{Qs%VM)6BKcDnJ(}?G zjp0HiraNd}+1F|l3;ENoMW+@}L9}Ool<${A;n;v9*R;erqxRg%N2{;{=rS9w*Pl?dN%^jFB4&Gy*Fl zeUk7Qc z+psLge=o>6`tJ(zOpyqpruWPANrK0(-B!tjEne+l;!7)<^s_pV$CX!1-W;WDjCKFO zAUd+x18%lhJIG=NjE9+5qh&3X7m7xbFt|+EKrZx)@yEQ?xJ4b1SggzcyH}7Kjpd)4 z`1?NU?^z(?P2`QjU_qQ@b|C;33**<|%FfLVn1#hE7DB;7S$0i2(aC)=+!5PH*!(&x zEAuv&B%gtkGAcA_t>M=BA?I4Y9sV^R)!NF+Q+V}B|L-;bnS2cy^E{Ak?iS@+XhcLv zM8w&11r`aEpTQE7q7IV|KoQQX3Y?1A|CfAcz!mm~0lzjg{Xbyh|KnsrY9q`@0snnL z6$)A5fq(u)lrD^ltKm*V`Ioja0{3;Zgz)INxw%!cnoXL4A^XW$c9l^7ZV{L$G&}fz zpU5!)6G(Fb6@h!@(SpFc@S6USW?QdBg zVw7Jfe=bsgW=|QUdrJG z8P7)j?O)K7g!GAbcAY~(Z%p`Th2pM9P}%Kje%_rBI%DMXeqy{Z_+pNVJ>>OgEF23F zR+bbvBJID$Y?`{VvghP*gG}>fHTbv%QeHj+dCbWp8ck;zeQ0lgs&{|9l_V95c)s0` z|1~~DNSQb^JBvr;_Pf*IS3q1${(oTs#AOpX-KUF*eoajflJ#-4Y~JnYrLsSrhb?vx z(%cRK;pv0?6k8k?mzEQY!b$(3$I!SE`V?;OiM#~fo5!%MG_)JkLH-NzNJ7Z=!a*Pk z9+T%t%SP`--t_4uu2yGm>tMPz;M=yCrn}oLOcjCaZE@HfHrIXIkwE0JclC=WpPD|$ z-QW!$x$r;V_|j{hj|5&>@@w7OD=I2#q$~-;#<~mX1Ld{uLD%gMBPqTwz3odjuD~bg zu(2-v#YDc`UYin$$@4I9Nq5c%96V>6%8|VHv)=6|5s{IodY+yU`pkMj_pJ%(iqhM) z2ibNTpjx&ACSnIm%STb+Lr`9Q( z=(g9VXt+Jpx*tN3K?t^a95W#0e|UVOh!KvA%&}6df7p12P9bY<#Tvp#iz4@Eh{sFb zkXx&Q(Oq4A9-Y$@oZWZv7(oC=B^ZD>%;1}+4W~4G0>60dt;+L09RkScgXPC%vJ-;^ zFh$~!Cl`Li;R=^Y%{&B_WtB@XzqL8vWTmAfk^s!-ynwVi%yg87CA00GK02J{wyTi- zvYmJ*_lEoes7OorPI%w~5mjt?ih!^`)z3q?Oxh+NSx)Ml59&2*c0%1eT0#Dj5OsBM z1N+qoy_VZcCrrD1Dq~h@t<_CAL5bS)=>Sbd^YU?>4^OID4=94<3{s%{s z(Fu#X6|%&;k=M*eVc6}L4ZTD_-kmPqZ~;u0IF!NTUR+*&{0$phKEu9ya+GHWXd~eJ zbI4VTF$u^*CwuMX&Fc7W@V{Ka3Qs1;CLKPZ|J@S9n)~z94S$Pq=kUL`<>_4KXj#+w zs%fLQY1t+;8^~N{J8`$JFq&NME_+@--?ZB%%WS`?da$uR3uCZ)wjQkAOIUS%$)1~= z^E(LkAEomo5yoH_eC6|hJTks8b zaz(MzNVj74W_a)6h(pg>qdgzE>jT@iD?NCYRp7JqjYa^~L1QukfR1`ELsEF=7TC%JFZwNv719FkIvHTPDTn^KMEeV!a<%CyTAC{0F_ zT-Uoo-b@ACP_wXXT#WKRSx@!=#2QY-Pyd^nii%3r)R$RJO*QXh0q_#@lR|xFR1hA= z^ZgyRp3hykDFBH4jhJ|c@|ygp-Fn3^oIYe!gnNz*K*!<_2J*`=slh!a7H|g z`s&6%W6M{3z?NCaDoNK~Y{DF}s1x0DLglG6d%RtGdO+0;#&WXsCoa7|D;VW_SkHnd zLTdbZd)7oomgnvsbmal`S7;wfb{1tcU^+Uo;J6@++?hAccsUKYSzlk+Z?lGCS*>@O zeD;mxX|dd?UuCy`JoL@T&C9#@fvJa@Tq$>9;kWw@;FX-#yI!a7G}z3uTg_GK|NOkY zIBl~{I<>#Qj|*9*M-WnVcK(zy8`i>jabyvF=kFhz!fx&JP{u)7Tx8QZdGKw_W&v{8 zRF~%90#wHU<@tF0J~4u}i9m7tH#5PTD?mKTrLwwD=C8KB9H$%}miiq4Xk~TX=NlMQ z9=GneniI%PI#4VDkB&3BQm@bKyDbyFqThH`5ANBL!%qO8?Mz$xhkQ@66=pO)!I$w| z^nWaNzX+ct^0=)?kV{XFPO@Kqv<&z&LYpy(h@bD~9A~nk(P5-ZGIoo3-XD$w4jqSO zmHlPtWWJ`MyxivehxvrM2Y`4>*A=D*>Fc$+P*&hyO{Af}@JAEpMa z-eetDQ_*@BQI(Yyj){*VZep?>Rio?sbfv(7`qyK~s%Nx*JaT&u5hwEfJW@(iemD6k z)S~WmcyQ1#v3{NSuMgq$rIvqAf4CX>=IL&YPP+jf{dgmipOD|@vC`nzirWTqt1iFs zzz+Zy0$@%6=o(B%44L$wh895e8kgfX4^ReW2$Zt`G_sT7OK%PFdAc{B%-`DH=DXj` z!S4;pzU@Mn2iiW6b8xsmTxVWK{8i`AX8yR~LHng0J@1FZHw*-P4nr>$O-)SznGo`N zI2juo3kr5-i-!HFI{h7hO8)Vq70@DNG@Um=*JBT;c!J7oY;+sX77aonNM#(uW;s(D930$ByzIZ9kz#yX%HRvnauguHfy_|N-DBY~TPoV3v- z44RIl&R-7zeFkh>&U#|y`84(PDyA)b@AoKLb$uU>8esh73bb3?>~|LY{@$tw`#)A- zfbw31jppR8WJJ7PFnbpJ6l-<=c(q-_dL#m1eEw)T99Q<74>Li_#R@Zk**b#>O*9@%esQqIG0#mQ~C!vNZ znESm5fd?(vZhz`o{j&(TzxLsuk$`=u@s;|Ba}M;cvpt-SSijfw z45jYiA@cH#J`&B2t2vYL=+D?U|Hy!UIJgo)b)o7%EcqW7o%V9;5R=6;l}~5xn)~JU zVPmlUg>Mrg_ILHZtTGQJwa51d<#gPRfg7BHXqygPpu;=w7st`osOaeV>p<5PcXb)7 z!@EP=zw7zHIqGozutfv<4b+@+JKUc7>Uzs+ak?xux^NuM@}KgW{+$@Xxz9bW21+)= zV;cveZzDl-Nl6!%6W4g!kg%|qS^j4}tJ_mNo0dHW)W^Hq zsvPk{L&hh0DaKJ8B09MyeOkt{aZ!#<_6r{g6Q|7wj+#o|v`c=Z0z`1`Huw1dT;B{k!Qr4v#52&M>R+s}1IyyGC=Darp6S133U61T) z_MbO@+;g}XiD=%8Icd`-56!M>)7AQ1r{&DO{PYGp9FOC8EGuBmn(&|bm6|_sJpiUz zMQLFokNLVV>XRtYuC=2_k6k7?3hX?P=N#BfQ{KY7ge>y+)N~O3(J&7Q7|xLx{?MCe{|NJwEp2OuIjg|HLKmKPG zJqJMlQ)Sa-?v!80zsq5kIRr8iBfk3&KfPJ46~BZCExW4itm|`yDMXSjXk=AFfh7Es zrNWV19f7&C-arG;wS$0>-`)Xk zSRwqo0lM_j3tl~JgaW*7ZVKPr2pvVU_Gi;x-uA}y#bIkIQ;r{}y$7PP;3Ya<2Go`e zb=@5^*Sbh{j78vAQcgzrN6s7udw6(3k1kVD>Q;!2(`)Z860`>vB9?l#t=$fGSlS6^ z9_Y<$t1_Ooa5v?IrKKW<`@JjM8jsjG2$)*#CX>P@sX?4t7S9H*c_%T%HBUW}1$b7p zphwegDsNMMD#12UsE)O5m^LGbJZ@y1CO1L-0SmZsr~POpvf{=E)eUocj_`T6kJpyy zcJF3C&a>DRb1FmrQJ+tZ$eOb0;RxoY)iVma>tbI0<{O~tuQ>htPRh4kRQ!W(bSSww zk7t=}9JyMWGx{hMm@ZF6nr$&y*a#?v$Sft214GsPQ&9}GmrCtM!SEn~P6f&Ffs}$= zRGG>93YXF$0OB3XoJ_gtWa59HeAaq@6$743a$7R1%0Ud+AR{f+6B zT!doXVxSIO&jCdqRO*TST`yII;}1N1kX`mr%;bPw#H*6UFAT=+DLL?@R#sFRti{b+mvR-mI-RJ|zn#+N8LU@-G?qI-V;|CYnSHO*Chb4u z;`8m>1{?qYuaka>YH2Um!0ue);UWOJ31Wyujl+T>;*v}hLQ2ZlecB7H3;@9(*HZOd_wxh`DeyM}C zcaxrBVgv7m-cBr7@M_O`hmn5embG#Up{GAxb$jckXar|xw`6O)w9S0e+lwIl<$Lx7 z=^j&msAu4W@Vda;}hOMnD2ekE>_-P}Deput4nw*MV=Iz6^01ZG3)D{>FO2}Jb}`tKHa%P9$R$(B2A*HDa4R9(`L)J zt^NK%RV+wJuD!DKcl!-e?BrBV2BG)ie%p%kCK8*womW}^)vu8O3Y+)87v%&&#uw=u z4+;1l_dQU!afeA27iDts*j-HChFBv5`3P0qO=OlMsfD#Y7MtZYty8Nu4681sy0D30 za`%zl&2aa79g6)7ZN@?oTVLzxz1b7Ofs1wcgD^Q&O;v~Ol_bpomRhKd!@i0a56h;o zEmGBL!9Ce;-O1i;t2T7%REgU3(kYC@D34x{)|Tp(ySeEn6f8EMXYHir?(jnb@6jzy zDXy*drtbdM`gIlOfY_{}*<;)RAa68#7w&>8+BcV)xL9CHZ9D}o8Qshk8^Mp($ZlwF zs4tw^lp3SbUffH5Vk@~(h44Hcj`xq_x`)B2*E^8#=-S-bc~?z$ntUvzK>BW3g*o{8 zx!=C=PCTB_ywd$uf#nMiB=SW*VOSj5T{K_3VnnkFvY#MaN3Rwf5yg-kx6IG>4rGC+ zbHl&|3nJoUtZo@O>%3p*t^reN-JQ0y*=yb5@u&0Y+FaZHTrJ;oZC==JzhlwcnPqLp zV7>>A1;ogzjD6auW#l>hoIK!BF!gZtJ1FSozMxGrgwB^5VAoNvw3ky=Zx(b?wUd%) ztYh%BhNXjMYN}fIkKLnr$+uV(H|y2@9$_iyU8qFw@A@W4&`^yVzk96q|FdmCsCIimQZVle#FSvqX-cJVu4ehSE>Wj=eRHQSFRr0i zQMU(prw>r3+&DkzmNa^6iG?-9zT9+#tzv#ZMCY|si6IUh^>*~nFM^mDNzq*R-##`_ z^jwFfIZI9q4$7w&Rk?G1083r~mpYC+zwf=nm(C$0rCrx>pAb+-A3sZJ?3;^hMR1Ff$~& zr$hz0WU$8L;Y(wM+cp28bi!D4$GhOJWw;*Xpv(5{J#5{ivLA{>Pihksq8GcrwO(Pazhk9%9;ahSXY)o|}*C>gd10tv?!*y0wdGD**1dDqk(w$W&{3Tat8>4HBv zZwGhL_3ra6D3Ivn%ZIA9IlkDLf8+4sX*F{>NyQjOh0x@MT~U;j0?TJ)lcNh=uQzml zPT}{wAQt*9@@;EFPYNotJI}WQYu={pn=U){%|h`{K>lp!ntdY78ab?Qa)X3zz%n)X z9)6ibRt_QuST!M1!pZ%XyXIh0TQtI|4W*!i9=6E_OnYjgEbRAN|t%pbY}i|Kka!Cs&-V=44lSE zujA@o51lv?!z$B9YN6}70-48iW{Az6}R$yIM$&6hB(G@wrNEHNX$ zL%(etHqOq8Q-m)=Ps6{_#_`RJUsNE0xPxL-gjj)}r}QN|SaC&Z=4nxq<9D1C2oHtw zvvly}z3x|(LtAZe)$n^2OdKjpvC(80W1IM+=gm4Qgj(-@ZK}i-#oU^Knv0iKTix6# z0*+J7i%+P9fy3V-aj}D1X7)@t|dYw zDFbDLkU_tl9BCMB@|!;{N?rtSQ60kauNEazW43rQ5Dw8obO44RgHNS z4crgf-ZBSr>zW*A;8KO7C$f<59c7FzF|l=Q!%Woj9~R%cc-{>~_cJ9sCaDh;S@sst zYifVAh69O(^{yKgpvZ#!aw$bS(xjw;*b4Eq1|3QZvbEJ#20kc?MdiELE0B7Gl!vFY zLW5WM0rtgnb2io+ywY^3oQt$+Qviq9y;-9QEsDUkSd5iY({kJ26Z7csMl^W-_{&UP zp9_S}Yom9PMeJk59v(7CiYqQUlTXK*j*XKX>HASy?z~;4i`NUMcTS0`l1NS(+1IEV zoC`opmZHc}dqYo9;*`W%=eV!9KA)CS=B4UZ=bMcr8oi*H1oS_h^{g+5aSXn0jZJx) zPWc7=z>abd+3pk)s1Il0MVWU3VEba4w+wK8lTiX;<>0s9sdXe2_niu1dn^NiUs!>H~BUfClDd2r%NZX&gi zF>;@Pw2bJ~Q{QQI*YD`XUS3t|`}tbQ{Vn}R*q+UsLA0@y%;m{_b)r^8U9nHi*28 zflaL8gh>b(du9nofHcv>U&_hAw|A8FPBH->e1?m_w!qaX@}W34G~Qn69}eUm!$@MK z^w~Ntu6O-tN*RF;@1~sy^mz5+JesG!qYUMAYsfX+$Xki&h}qcSgZ_nk8+5JeD3qVyd7{{oyPc( zJ^K6_3TTAfUPP1u0&DmyPi}W28 z^ooveRa32R@pZ_7=Mi<`s`t-12S?o>$vY`0ei_LE@Dd>;DpO#!qw>cS-d}YV+gYfn zVI&C9ZoWIWT^Q1r5nYtVKHs>gxCIv;`c}qQj|$z+1EE+&AN3;C)@vVYQAWnv+DCMj ze-AJ;&?ZkGN<|!6$>0b#&aBp26Oc|H;?*vnK|wl3TL|dw?#NYb^vCm zOnQYJXU3d4#3JtErT#SN^2m0VLW>k)YBB@Jc?~&`A7H>OvvOUH;3S=tb8S30AAkM^ z7`~R*(?c0i`w+lyD+Mb|QfR_}fP+=t%(%RYw%kay0?wA2au6Bb}OqCK!Z8fz3Dqlr0H<+cL^i9T;s=2?2osKho5~ z3TD!Youc7NBkhtRP3wAS7^Z=+WK~sxpHjy)dqT^i^1{E-MDM7NPZ5g4wee1ZjK$Y$ zKWeDZACU%B*`i-v(?b00P&m^d&Bm@oSfO0HqE5nl6!n4d+mzo0(ve%9dS(&%~UAVNy8AW2MBg<6Xz=pv>$Q z`^!VRPjuC3gcTzU4H{{~<%WG`13uS21AyB)f|K?*aUQF5#zX@4IH=-ICNa0Sz>#%$ z==G^;vT}1NfnPkf&jX5t!^`+0ix+mKLd?0So9mEH{W*;#9;chAg2H4$XqX==3SEOq z8a2Och{pK`vY*J~#+N-DRSMqwHEMRgC~rLUurF%Hqg%<@^qw_;(A0`Y$4QQ1f*o@}bylf%7?|qq+ zQZ~BY-Q@7)=B3mrIsQFd8ZhBpV2S@sG~^Mc4NJ+wiCAI3?XJvm1pl(X|l_HN|9sk#s7SOEkRCpDA5j8YUOnRg4}r&I-- zXp_TtNGNuWpy9Ag_F!UMo%GQN^s-dKq`45Lx{Zh4=i~xC&rEh+-6Ok;1e8#CKUw#C zI&tLJ+{Q_r_6NQQ*e`! z7lnH-^N>BohUdLWz+Z=Bq81t%o9Ys@S4AH2^|l`xM&zPO2AthWFZHdw0K?cE%*=cO zpermfNK!;lrQuWj^O$&00kU+9vqjGYayKvs2GsU<$#j0cY5oXuf1l0b)SFq%ltaQ~ zl8YVy8skuU{y>1aYC{t_-beJL+-??5+rD&ubR8-gkQ|6_raEM(e&cPR*_m>K{4$uz zS5eMm?OH`zos(Ct{4xxLvApVndm)XyBatV!i;*H@zo31l+}& z&im{*2sKoPr)Bbq9DE+f0s1-rslL*Fdz`NWh*+q9>AA-znIz#dq|IK*0}tv+RJ6|| zLdN5FfUrZL$KCY@UkLe54stjDQQ2p+bHH;cTb|uwb2j^##S-q?>MTH35SyK{-~J&< zk;X;UnoDg~{{lmOG0IAf&6S#MH55wLPD z28ULUDBF#tdi-i7AYtv?9J=?DwQH~2H}~>7lheTEZ#5MG(Q)fqC5?i~=5dl>p$_AL-@e zT3`FhWf-#~FJXOFL{;MGwmLT*Ue4d1(felISa_osH5kTE`d(zUeN*A95N?S8g&5Uw zdUVq*Bz8ha76?0#gCQoqR|l@BVJb}O5pvHCj`PR~`B0z_r@xolB58Sfn&((az{TBz zYeev%NB%MpqoLcnE10@G;|K2P?gCmt+$tCE({vnM8<7lXPI>IqGF_L<^thcFEJx#- zR>ojRvh}o%L7U`QPYD5(l72w+7+)8jo@?g*aF7-Cvo=WDb*RP6`&}oxJZ5uf`vt+4l2MJ+BSBzycB1D1B)$ZlYas? z3n4hwkE<6e{leVyGjeNg(P)`epKCpyulL3qPKd^*b??W{Wj#gOX{NkQo#|1oM@Xh7 zgW1)roT_LL=Vgr_+qA~_xiZ$LGcsLa7qh~ex)RLi-7wE9-=nt+(Q4(!r4`&txnG!#k|eye=}9ricejP6^OECJ zGpWHMq_M*z@v9s^q%7`g|0Js@zXK@NLhxHWoyY!HqZGZ3%hN*NFtvPR#<(y(C?Yo7 z)>`S>TIkb`VT=!aLGu6}zKZnS3VYay8*A6m3XkW!Q>B5;yPWq{tvEi44i=y^NsKZAY4WXHbF?pcjDlRb&otw9U=5Il#TkOBi)2^74(S!m` zi-?jJrAziZWE#NdbdL1q?3(9useP#!n4llC5LW8_mWVRaKbx0E2XZ9F6ud-4=+vd1 ze8_@gOv)1~FXDX%P{p>jk27CF+rNLbc+3_+$SM!U7EO_! zyL=>0&UV2{e7Q27Z-~6QVUX0J%}6VB+iByoQJagmecr*&V_1&oqNMw|y;t!iZLZvX4kLWa)h$=d;1!Rcy@ z4`&v4)848TGWkLE%7dZE^f$h!r=FJ3BKg6G1BbyCCNxAu0d)Y_+4&7R{O%@FQK2j5 zp3dykPHulE7tdpvZ7R2p8@oD(7wC-H>3DUEbUcS|=&OCu@WB_-Y6AR$OgNH<6~ z(hY0yJnLO+eaHItKK9?u9~I|4?=i=?YK(cE=P9Sbo0^1|KT-seRo0S@QmMjkrJ(I= z%Hkb*;-z?TBhlMi_c7jefjy2g0W*sVyEiX4DvRBn9NR9m)8E$FuI<2eKW{C++{;Ye zknvShRXvwc&}A(vePjFTGdRi9!K^Qzyz8qxx72`_xd_#_S29w&$YiNeR#lFY!@!cU zakdPQ$Ni85^SgKL0^NEazYe@UZ2G!;?=ZTJsbYVe!NXEZivZzizw};;VWmgU;GgdC z_QVwAb=R=DzntdDqqO_}cY>o+NiWf}qQExDIgOBk%Kujj`FV>|?V0N2h1@_Lfzs;Q z!`F<-zU&<&(A2sU(ja4OEr9pA0N>(c>TSa3V@n4K?HkX^dlA3a?TUd0CMJDl+tX9{ z;FTY<=KZG!F&^;UV>We#Qq~oAvXQ+<2F89=thzG>ci#=PWXnyco(1ORp@rX@xO?W$ zk%kB=4RR|7nigMV)R9nEg&$xeLo8n#W=QiS4si&1Lgf=X%b1QlbRZ8pKjU>aK1#{6 zgVQf^W%Ba^B@VUp^8N=TaPLoSA=uMz>g!8A@_nE4PQg3aag{F7e&VmO$FoJW=u}WU zfq)7~w||DKV{~;iXhJrJC>hb)?&Ui}7P__a$S-XU{{AiYDnDG3Muyx`7;w*QAnFo3 zLPqPRFZEYRk~^TPx;%45TSOCu6mZ%WbrYk%eTguel;kFrIh!9e4{a+iu=)rmsG4Qp zgFFDw?E(4}3h3-k(hubtb?}bJRY+PjIE4w1n9^5Ap+3~E2c`S*!NA5+U z1SrtAZ`+wi{rL`dy^mfYu7n_7I@(IP2brL;aGfaDq7@S0-8u{d{6v!svbScPCA3ka}&;+d4fX%~XR;dtU{G zxE$=aZ1u0HsVaN5Opuyx;lFmwLCm-eHk15}L*cJto_f8Z_T*p?&Rno$l4#6NM?M{;zk&o~*xpisF7Hg)=DSiMe3^8; zD6b=za8oA#rl($VXx{Q9mzjEO`gx|zN>8oF#KzRU$&+%AF=)kjbOCF6#Jiag%rwEQ?jU7u$PIi=aY?uoG$=%8P zF^d~ho6XEG{+c$*`~eRsH{qEMJ@zKd22e@+H{r#6%flZ3V*~%_D%Q)>|ACQ!qstL^ za_+Y_TJUTQzB+A_L)OL6tL1E***Vq2o1Mf@Ohrt^b8(a22B6DHuP?og7kgL|=V5)%F4?Zx5VHI|UzQLjXoo)|~1g;Mfv zyeB4IIa#zlR57Ues?8ch|I5wY>sx&|K1R{IMMqlUxf*xO)Q8!Fs{`^spOfdb&XmjU z5^6(&#QHbRpB)W6c3tUwP#?-l?>k$QohrUr4-G6f&8gO+)p@wrF>@?l`i=^Y_y=$Y zx-^513+(gFx6OX45QmwO%JB5CV4ZNX?@>2?v7@W)o?-y)MM8gMFIv26dOQkYbu5O7p zX}n#2uZ^(X?V2sE5}7vTIC?iXwUgA~fHO7ufSQRfO5M<*)lfvySm$!(nTbFw=vz|}Z`jw)&j09q?u1brv zc4%`bps5LUxVKK(JO7MHG8l)~yK&Beew(rB-LrOqx{eaIcM;HU+C%rir8+z5H4!Nk z%=O`Qp*}LX*gGQ}R<6=;!&kIo)i$l;<-d0K)6pZS(+Tt4XrDty)m4KU(tHC?bL=@F z)i1Ya+#jeR(j%!GU#DB-*L=))FSW~Dp3!6ssqpiQ^`md&{<&={C6aja=)A_uzYu_D z00(#kh@A<}w`#6z;GzV%B~s%(LxgGIn}FK)ODJhx7Fw#3H6PC}sLhwrMsYh18<-fo zJ`83shqxiKlBdt9zPjtlu*qSqoqxwCsN~VrvUyI|=F;m*jN;%#au}s&qD%($mhG8N^3)(ek~aGWHZZ%&y9u~>Zz-p&aPp~ z9Hpf-TUvH(!sC{~f$<69pW={bfdobAJQBY+Mfhl8V@m8bS_k_gKtK9nebfyRp(W=! z38cqK2?t@qjVv4%Y9I1Fc$jNGY@i$xc(%OMJn-SQQo_@>m?9#%pecmGR|>cGK%pjL zCB2}b)E!+!0Y}?xS8)EVogn;$AR($T_Ls1dfxG*+-V(3q;SKjL?siD}*83cWJ(SkDTEv5V!>nUoJ2Y!W8M626Fg|^>WbbRIDb|e*z%p*#1jV9_pntK*LWD+pb5_^yDl-{wk_UM=Tu1KyjJcu;(lhSt))fJWgA4v+?Nb+@y#0f@lhTBN^QtBNy}%`* zb)m_%_F*2pQkhwi9TE}o9gDa<*}cPNlgC-Wz9@=qG`B~Y3wBj>`mJ@@TDck_qM>X( zLaOXpfogZaSeb>+3&E}9?L@AXK|5U342vu#u4GcaH1IoQIH&%hiaeB@7y94w4(6K7 zu5?C)QrN~~@}Gy)tFk?2+%5M&JG?>`1nAqx)2o<)f(?XOyVo_5=Y1s3b<0!L8F+P^ zV^4Qawzpox%x->1@fdpkj9Yko>d%>Z!NFAPM+@?+hh*fh?(TT9;q<8=gXK3r-f&D# zkLI@Dpl*3JDfrHwa*&#aB+N5v+TSQ`%2Lip;AJej|6*;s29Mff2PV6saaDw4dT64h`VXK#W9quWx>B9e%VsrbknUL1E zcVIvo%OYZl7#&JXjB`iKt{Q!Uh0UkCzAqo%QKg0w`;|%VUP99h+e8zWjqawB?R6Z28b*B7qJY{G3=7%vHrEr;N4>Wrph zPuvNoS~ce_`R$hOExasf6Fy@J@_qb0qW=byzd4vl( z5uxiLM9FsH#jRnr@vOsqY$tY!a|8JDCoAl~l{c@$D!bd7Q@0?duMl`&2M|eQ%zdG6A-6Bnk)tMI2$(TWu0bQq-FY=IoB>qbIL%HB!1;u>``^{O9urXlubjLVnVkQ&)~>s-H!; z3`>dTi4&R*yMHs;Bk_xBZeuyI$MZd|!xoBus_27)vI86>sss-~J~iVM3{Gw9pIZ5{ z$|w<)9?`fHLEc*bHfhqLuKo+pRn&j+FJd?9Y3JL2@qfxMy8o@Aaypp*Md!Z41@`$E zn2`#Z!~X5+mk0n~_fN3?|Ie*f<2*(O9|AhW6pF3-8I@O~cX+c@5d!*yj34bt@xx3! zJY6}xx~uVzemYT^_%tO~Y)Ieh-Auq0yyC0Go3qz~6TbibrFTlHDxYp^4d4|EBk&F` zZP5nGzR`%JAj&(37zy+eVjrl(Sy_A-kI=`@>qpf{?zMqnmG~MX131mIuH4lLf%|Pgx!^ST= zM@Or%yulD$x@ii~G~M=a-&|U1-R50YqAi{Q{C_X5t=aEF3l#b34;G`I| z>KvV&??J!0lucT3vE|VupU34$XJ_ZcgcBIw9#c5by7}RU=(07U4}c65oFepi?yjzb z83JuhPLF-=Bk14e-!|Kbj$D}&Y&2L!DELay#|8}wFBD=XsyMH8@0CM0?dA2R{a1PG>V1gRSvBQnKHd3t(I zmFc+OULJwTCKT`@ggC5c#{p_2h0_+uqSyhn1hl-l34{f~PrdmVB@Yh|6%`c(5E_3^ zPExoWOy0i_i;l*e)3>*`7ZVc$%-=%7!hj2rkdV;V*EcLY9Nb9v%r1g}laZ2g<9K}l z$efs*oPrsHA?4th1Wen54dE}@pCTiJcKY3g=8NmIT^JuyBu>tH0EYu$lfh(GadIqN z+XaB|2&uQ3EYSd1kv7*86M%?v*`I}nLh%@OW@~p#wdx6ph(h7mnp5?Y$_qF_{P9;- zZ?tnh?bTP&0DHU{Fb7dl7|=I!Zf53@fdM)uCUl5Vr)h0xXSPg-M^8_WBek)i;k(xz zHxExUz_`fD%0@&)IBX8(nqLnDw%V zp#d0To#oWfj~|)9M*xNm!XP5r-`VMpkRpo~5fcMSqOqP+$*iU!*$lhDw%`z-IXXJt zo=xd3wYc{%&evIM0a08a>e<=RF*-KJ<8m+$77_*yA&w7E%Q+R8tOH;eb#`8CbfAKm zQCYq3J*cSi&-dq+fJV>WGL_8NxR@9r1?7PR2AYuL(^DX4MhOA>b#A8}$OjmEA8!xy zFJQyBx3_NzpUI4Y>*jzu833J0MbPr{0v|~0{Ij*a4fDwV9T3n3M0I9%`qq!*>C}L3 z)>k57*XD2foq;%_p0}6Ls_uga2{j- zU2lJQHNy2Z@j;6eJs} zFn}cN>kAGGqxVt+D*$E-L?fW0Ov3xAedx^{EYNZb2@eM`W)vt&%}{vWoQH>m%+^^G z+?<|nkAY8=YSv0gNF)I!a6d%!jiEFi{SN=IurRUkmq4yLxbqLx4#cLlYRrD*0fySY zmq)80D#dI6_D9AB%zc1Kj*piY;GEH+w_tTXJ^ow*!D2o>zVPty*RNj#4D;&FP7^S% zkeDJm_E&tkk_g?PGFuhrvfr7IL@NkSh1R1vUg@EK-asrww8gO z9z>5Jp!Egl^)#wYa&vR}yl!8BGP&^|x|6w4Fj*j-9mlqb!04ZsIe}4dYgCLnP zAfAaE7L-MOK1~~%RzCt99(-J-DecKS$Oq63x3qXVI@W*?4Z{CSBG8Ll-M%s(11mh0 zE1ej_N(N&25}-Q=;TjeQs0jlFY9Ku2dA6fsYikP!2M5V3DFIc$^NS1bi-R;krCndo zRJ)_NYP2*!>_W)=p?#uQ?e6xLjh!8=E}zM-7eE6*(YC(w@dw5SnBb%Eqx?@81ry+R zFr*9&gTH?Lnw&fbAq9w28Jy5TggnkAmuALpZf>jH;gN(~LJH#zcB??!t~(6>1h_dc zFx67cM{3*oN<(oYBl7y6IvZJ8S-?bQz6=k^Z9NYE{%!z|gOrq%g2EW&?ep{V^z`)H zXIRz7wjh3JYtI8;6pJMGygD{^{sY1=kS^;OqLWusGp#TC_Dzs1xDRBb z!54bpU-c|3fXmnK@9%&7_`ypY$>8EB}3RR&g;Hz#N@gS%vtJho>i)QDC1fAAa~A=W!Gj7UGgH zVwU1l>;qyjR*Gr$y%jxOMSZq>C)|ID>(d}0Dz2V@`bZVubzfRcD`)T^h6hkz4( zVnqh|dTiAMmUI*a@|ROs}Y@*wN7e6zzaz*47enJDOeHpgk^+ zz&EKftC5*fL%-{@m*eGA;BPZ(CnqNp6B97soOUPCUb21g`xY38KwwINg-qZ)u(3S* z!N@2sDvC650Oje^>HMRkBm2hh1qDbD09Cd#{|bH1v;u(8HRiD?DL}0n8Tt|yW(BIB zGN5Z^WNZwi2IeOw;`gI^R*?gQu(7d$m7l9S* zA8y>G)!(Z2=Pi%Zjw1*ofI|JV;733#2%aA3BEHGVA-%)6=um@ z>*aM1aOn>A_CQhlIW#gp9u^si=yP$nWNBtr0Q7I#L6L}xh8BvhK07@P@*t=^098Jy zGpi8!rPHq|!Q-KzNTXE&4F~{3HHa*%{^8c{1LGq7q1wvBgZIYe0SM7m2SovmZCorY zvS z1`3%m?}xh!kj?YnC&NOSnVD1NdXZsasT|f{gMtuE9(O=n0tH#w)%4}9#Op1OjDFo3 z5E2@iF$ut*R^gz6(k}eLI`w(m6RO1LU2JW2W~xAp)U+-L*NUc`B7pbB90(oT-qM^A)tL_G42OZ zu+DagA3#Uq)0?WY3l<(SfuYqo7>qAC@g@10@++o zAcHKI<^~82;`nBp06-Zaq-|$wKxttJ9Na3&3q)T4#t&7?&&vZ2nMb3Phl7Xbd@%0{ z)(Q9^V7@nSV1R&wl<2iR%Du1Qgn~TT>Uy#Pz`vNmA^^q=Opm_#6+ApVC>z{CC1Rj3sGtzt*mwmJAoKx*Ulm^2tA2zQ?U2*z(a>6zx51r_AfNdNhKZY?T1^ zX>t-0TL4#Cg{ZPCHN^H0@?FvCAvn8Q0E@o)@el*{zue*P*1sEcq5tg9X>S~j{g@h- zEuCRrm`$F3lsB%}d)!w({rA)BZAz}dc~DS70j_n0f`Y``y-3ToF6OD9b{CV1_Q&(| zZ}D~dDJrxS6r%cS>?+Q@-2c~h--3SVV5XW1?8@@ogux_X6yb%D3DiA3FJEc)E!An} zU}uldGY`}UwJKDiQ61E?-U#(a_3s!*q68%~nlvQ5qy`Ug{h9@EAVkFPawcV zl$J&W9dOkW*O+*g0uio?t63fOr6ZoNSn8}i_678A`>DaVzsqqofSSVE(HdX zg-P{4Pjg>xg@eyw_2NIb=+;PnpO=@106lqEAr0zHzzVG*%BP_(mY(c9a3<_!Rs2>J91De|N-GA?IMaPhYUp%Bn)j zKCwF4og@$cU%v3)Q<~g@!Yc2ks?Thbg-wTX>nAyyG36vMMR@f#3F{~)Q9=vQ5zT^S+tz@p8e-~@t&Ge zGmk@kJM%Am{{J}oqM;f}55{78hBa}nxv`JcHk@VY&hY2~ilRwkUN1rppHjv!r&q5- z-?|Oy!`4=BFrS4N^C`G=Xi91kT)jYNKQC17M%AXi=}g&P>9w@&u~yZ)hwnU_V@T(V zD=yZ^#knVoj_XTeQb&1Q*tln7z25J__l&#Tef3G(qTaTB=B*Aqu|!X*jK5S@-@i+X z7bk4}HOO>bgEA}weWklM z9n-Tq8f?y%L8n)d!qpUp0u>8)IiWVJy8lQeS}{GOuJkw4)Y}k9uq?RYBH2U=mMt~% zUiuJtp&UE#XGF9}jfdt2hTC1smkfCvry4(y2mk-c%Hy za>~`-VP?g0QbSuy$;68%V~0g==+?+3nNDD^J?&Sx8`Y(fwgwWf<(OzIfS5<-pqeZqv-7bf#?rkh;QorL- zH4+LFsY|?puqS)r^9+cm>q zy-oHebBKyl&e)Ny?`aby^46LlapdiH5p~ijMbr0a1sju9mX$H9YQak_y{Mm4@A#DW z&J8Wr51%BSxVprU!$3Ha^Ir59A7O}O7@2-7SV?6v)qy+mn$PVDi>dTZ{6!`$dv zf-4V`qUc&zwIEA)K7UHSCjlEGjbVn`*L~DAZ4CLJlUEJPorJEvw6KR>j0enn`O@RO z8xYe*<9|heJB5xJ`1#l?i5U_}oULA)fIY%(qOg&33Ywo&d~&q)Q`>?Xt(5a(Z{gVV=XAB-R>kvAl4E&SI|LWmd{w;exx?Wx` zi`bCQ>C)z1Z9T=%e3n1_@pss(8S1JQA{Ypv>A0T6$R0riON_`MfqcD7`My_%(=u)zCvnt9;GQ5Kg7=4)$cSYu!8 zRhkl4V~y>OGHhNsUy<0UrV~QPp-I*CUGW)DCv({!#?kDiRr*GVZ)b$JU3qAt{Z&_E zJFitw8Ka+!f6Cy;(8@oVLEQ1cz`NarV>^1jI4eBb>R{&UL(z7(+issYd0StYr7w*H zU3P^Zd?-hN_&wL8FBI4qQh0>;yZy9V(a+Q3j~YbsRqeUp+R8Iep00T?vX(KS{oRJ{ zmu)QUj#l_gf8urjjKC%&PJF{j)>L;N!;1en)j2rpxzTkTxH@pfJLX15?_kHijH-N3 zEbr+Xwf~|j13~8jv8y+dJlua{M~$216#lKUs?Ei2cFI^7GEB34T{u;p)SVv-CHMrL z$FuR{Y}ItOv&{FNv^KBhP;vyGc%>Z08YRP%*EE z1oIIT^Z1Q#%KP~la;+X~neV($9s?!DfA=NXSffbLqDXB&WhblL|Nr3_ ze~iW{D~@i$GyiQQ2ClLr_p2hbe}+1R6;Y>BQ!+nbY`Xad;rQ^VjO%Rt?9{+(&HL)< z(=88~@9oW4w*~Q=9LpyRS1RUx=~T+cY}rg-sP&ecuVXg1)Cc@+i^dh_Lb5Ff`5B$E zaJ4!`B*oy;?PfSfZS84xx!2PK#gebrMr_Y$=mO~OqCC-|nu)<$cKRX~33y96G@}dK zCej3&O+Cok>0}C>uBp;m^1sPUDxYHKLVq)1FM3yJdQb!_*RfNl7A}i9A-z%_7@9|m zlnYinr!JBri?tG{#ctz>rtSFRD@DsWWMZ^I#7k^$WAT?k{Dl3JwybId^Gd%!KQWS! zMBjPov@+>!!QWiiKRwBw;zN5p_B+GEdG4qgGcIeBGXoYDE%=T2nQG6H@slQ$gKEQj z{um=y4|S!goeN?V5rP@Kz?KxA5w~3>iZ?H6?r5@4{NZHIx~X`r7D)>} ztO5X4%2JJ-D6P16j^RsYP=nLq%*MAd7W{>(#KkAUw`s4N!|22=~z_i>+@Ef$# zT9nYAyKu7IykDk%PhJ|vUsPu6}`>*81LSKqHJf?N4uMy3c+^*vy=qYw+sncrLH~4%eJb(9!u@#Nf1> za`AHZp}X*;JmdR|ea^FiK%z79o#9G4nC0`aIW0Mx#L>}&Nrp}IWa;R*rPctZ7+r~+ zm~OoAyTD(pBX6j2p4)I&Qc&`Xi3^)5W+2NBrrMu4C;DWv(aha*Xmyxat_+ z@co`0cgwqQbPztNAn1u@i7`b@LV!BeB2P)`MhYULz5m9n{W4+@tr&hcePNm4~`0RI0%=MwzU$xaYuwpn9IhR`{66AgTn3MI)u#hQLN`+4& z73}8vQxuyXUPK=?+a+6F?t}IObEoiAq5CETs9Bg1sbTu299`w@P_I^G7@DIT!c~AxMqxH+Cy^-`T-D1T z7t6&ES`xES9r{trBlau(bn}Ss;5DL@NLFfC$$F4WDeud6HMOOO%}KrPNcERZ*~x~X z4u~C4dtF+#_uqsr#QOEkrx}Z(#yrW5*6S;Nb1$dao-KLTc*O=v3)MYvPf$4u`*g5B zOJchoYV0-rZ5K^71pcux5XcborOIF9ENmA>@MdEl{U(4|>mzwR>BUer4;1y6Uw_sA zEI%==q*(1jehm|v#>RZ|giz1X>W_TedXVZ<{-+{X3O4T!kRK|9PlVH{_}cFFoO|%f zD$5OK$_K@5iEFKAIkb`%YIMi2@AX+*^2J5OpU9$Ix*r9b9;WlToghJY@Jt7bO>>30 z-pyQ&n)dQXMc^`iq(7Ec{zribUe75$}o#6o~oc zetyYn!s(ge)z7R;;J$f#{%7~7x*q+(P`G0bJ(KBwN&39J@IK9hM4Xe@Q&?X&ydwbJ>%NR(^dV#&Kp% z-0G!1|K6|sca!9<%XTmVH^N5X2Ko~3`+kYh$q|l`D_*4vm2B03EFu2L;msrKm($;e z@1v3vlNlv0tTtgF&skSWWAgQl%><(S7N^h#|Av;$3s3r6wib11VY+(eaw}>7R=HXn zh4;HV`XUNCAyfnfmVZM;u+EQG(1KJ431&L-egJY5>9p9MO*;xjeDEes7-L;`Cv|vL zDwhTNcsROoTYG~>AI4K-ty=|?H~<4_GUijq4CLmpyu?Yn?O9g@x=TvqBcnzjs8KP^ z6YyD|T#Fi}u(4qWlfT?iX_99J%}76)QDH*bKp z)YrOzWrhSXM2=j(Xfu*c;+C^*uUo!$7`tqsl3n2OoT-?&+93=6;`yE4u`A^F zfE9x^XZp1EjF~2J2ER@ruz80cVLq#qZnL!A4NS??wmwH!nyA7h8Ak=5jXQ zpto90&%T_+kwoTy3JH?M7Mx6Ec9hHHo5=Rq5azEtcHH=z1`qEM%!0?Mc8UZh75bpP z^Seo_3yyh|ou$l>(Cd&MN^Nz|OSfy`)^sY7DFIeYO^<=cNr!>EWwwQS$nmSPay7d? z5*+uwZcJBb*|B{i)UP0o*;VR^5=LEAJg@X4mGG-bPwU=9?pa)=rwRRnbj%Y;jPpTn z)#*>Se|2}AZx>un?TM_z;gt}#r+&-IFx^oJK+E=A#0#l5Vgj`#`O99G6qrvc9VaU$ z<{}TdKMhssE_96rL4wj+10X#FzSk7T@=wV7nuqY9Ilh{PIDFJd$cpX9NTj)ejH1Z; zWH4poqiC{pBA=MhewNJ|`-CM=JcYRRj&gXGFNloBmvpam4~K(z z^M3AnmEeZyXmWDooPb46PfLJ-s?>^=F=+Qb)_pv-0Kths`Ma|(DPE*{&Bk=of+-xs zt|sHlCJ5Rq-Ph4-c&5h(#>n8rAj3Ymi(ZbHineC=$t2K3N7H$Tu2*_M(o(f;=D8J< zP`@G%WR_2(6`F|~HQPrLN3%6|DdzMO*4y4XyE%ViItcgPUcae!|tOXQzw zy&)HmU(T)d&t=}in6t{qZv{;+0yUhBoKh$w_%tsH3i+jr#H>+>f~=RfjM> zbxnh8M`QtaG_f{vfgu&aEpk_r) zM`qz5V!^U#IEI`>@-%eoRT`q&B2MO^q_s%gkwcv!h|jop@2nR|;4J>W=v2<&SMt0b zSGF}iYDo2AkG1&N4t5ec4hVxqKWty=mG`yk##$EDSA8N}lwI1ttPNIH2p5n00cUw6 z_wj{-g;t}uX=X?8#1d6J0khB+Vz&K~5H05ie|6f6-ztqT#R>nM^cC?bQ9YjY(eXK< zPH_B}nxGQ=R#a{4(4Sv_~nWyXbx2<$YeZo zYE}mBZeRR`E2kH*SeH((JcXA^s}xDT8Xu4fJnogXd9g} z2s}Kb&FT1YOAr?Nyvv3aJmzO(Os)FLQ7D|X3w5+_eb~+l&8q$-s~1}0`d_Vcp3m)^ zE#*In;Vr%)e09o@`p;RS=W6^tk=^ExSZ^I=YM#y2gcj4H#ZCcqEZ z))#m1wjxNGhp8(lPQgD%y$loJd|qal+88Xe=H&aO`CegPkhG-N(&W^?`I75=evh196LQ8+ez(>74Jfe_<^%oi#2L}*OmF`w z-Hiy6r~5Y7X*w%QTXe0H>B+hCyvf->i=8k-x3a14gH-9DxI!Zq$PWJyOl)lky&>Me~A_{F_f)v)=rAG5S7v>pK<}ki5BoE!No7 z0dI7AvZaYZh1t#r!)$w-+CYr!z(rF<-IE-sVl2{St!k^6LN+t$#k9)oa6FG)nl?Sf z`_px4&w{3F<-c6Nm!{r|Vs!|L^SeBm<}A7OWiqu5J>(BC=D!uftUjn%TU3%#i#;Oh zt*Kr|=I^H}&kun2e=qCk7&U}nB&K>>5sL~zurrUm08|&U8ZVMkzZQ0H%3N$ub!SGW z>N_Kdr?$Nu*t9cioFANd2I;m)-Z{8W-_%$s8S3N4URTxcTA5oSLw$$U zs)uinIJjECqR(JoYbD`RYa4#p>I$7Q#1F(D@0pmZhJ(O{yDQ?()WQCQr?&oP-E{N9 zdYKiumIMTGgbAa}s$7Ivv>c&o31 zWr`md9OA_o-M^#tV#mzCJW3@IHLI4aNQ8|$Qb{3L&|p; zHxau0_SYM6OS~>Ysp#r_ee>gjWbrV9g1uKJXbcIz2#+saS4L%mI$<|p+s7_*VEBuV z`SJRVPG1G~=+nO*oG(E~ovMOgbY$@29_O`+0o%=eA$nuDbnhBC&+( z2AA!)#-1NOsw?4@qTnyKoeb+}E`@lto(MjHzDr1$8_!jYmu@}>5ay+YTsido*v-T1 za`c7f#rnOSGBG~4*f{4;nIJE{RztQg7*sYBiv7}>{Op{Yy5YF;f zj}r_yr!!#8vX#{vZA7hIXc(GU9nAmWr`^b{{CqIEzDll$AE|Zq8QnihU6H(3QtSKW y+sq}E%9LG<8LD9v)OIcEB7YVvSQ1r6fi!Lvs8+3snFiK5*Q9=~zF5c3z63kFn z#?*H5jX|0*1&x_0UP48uGu@Jnxt6)hIp3b=Xqy`Zz41Ad_KeTj*?F<&yYKUTe!p`V z$1NkTxSbq1#&YH;j*H+pE}jraxJ01W={OWgt|iVPT_6X9`Vaw85Pirg*JKz5f2$Jw z%?dPRYVpG|Et{Mkz5|LasmR%sg5v%6U>&x|rlq(3GgRBsp-i}q#|Q2cE#H}G5k(Ob zU1Jz%?7`5-el#iTiIy~3vXKeSwKWa7J2If&o-Uos;S1GLbN#uL4>~_Zl|X!n zXTL^*M*yEvh5TK2P`EeKN5P)EC_Su%%{av@FCclbjZ8_IndlzFLd<>N;FCl+NGlR}&sL;df^7~G+tG!l+?2XA#Y))lHc3d(l&lJP`)8$(ks->3f zBU)?ezGelTPjl{3SWA%SOTm}Aq;jbTbmuR`#4rL4v^@g|1P_E;lIUUv#?D>-LeDRwixB>ox1Np10C|t{q z{MA;xK0Xb%)4xVki|)Jwc`L0bh+sz^`R&!m!dikoUkbjwIqQIWxfN6^E7U8jcy%N& zFLY1$X}7&A+Grr!%ih#H7Iklim$e%L2$}OP2?tmz^6ZKT3f4+24VJyos@) zh`ei0$m9#rLVHkSniFFrH?%LBJK5(&TBCU_9Z!BO_EP-y`<;^l%68k4OKKa%P$Hj} fS-S}RgBdj3a7q|IkQ;;W_-6 diff --git a/docs/files/logo/icon.png b/docs/files/logo/icon.png deleted file mode 100644 index ebda89cd9c84f085cfb6b7b566ec6c2f8bb3ac32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 527 zcmeAS@N?(olHy`uVBq!ia0vp^=|J4W!3-qBWZb)elwW{Pi0l9V|J@6GfFv&P@Auy? z_ufCoQ$KdSfLj>mo0 zK*BG1c~6vR#l6k9_GfS1Uv9Uh=(ue8oxI#cd_x%&*CIUZ(y@B6IR z%4!Cuho-+<@uXwoW;0G z1H4yk-R!*f!kvW;r4w&iA2EEIn)yP?@C#=hw@2)Sxw}|_@xb8e>gTe~DWM4fhfV>y diff --git a/docs/files/logo/logo.svg b/docs/files/logo/logo.svg deleted file mode 100644 index 5570300b61c..00000000000 --- a/docs/files/logo/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/logo/logo_text.png b/docs/files/logo/logo_text.png deleted file mode 100644 index ba865a34228a300fbb7a2ab6686384aaad7fea11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1674 zcmaKsZB$GN7{_O=!;zO*s}Ke`T9Ha9hVF@8q%pCBN@=P&<+PP+dQ&nD+hLGtBsE3M zA`GJ@y%IH!-kYWlZSQKfmpgZRnbN(c=GL8ixA0*Y^VHXXIzO#K*u&PE%6k%;Edj%1vYg|Z;!;E1p3I8x7f~_DB_8{it^E|> z^JLz1-P^t?y`t0(+9<~nh2@M0al}-P*H{8y?APqe;eP~>>h%x%__*j`%C(379V4v` z)R-MuOQoA(=T5O`St44{>$HJUfq<9)#6U2C&MR zxLo|xL>;yJlv+q613EYV71%>h22q(yBk6thc>X=Ce5ywEm;0r#TCvv_gn#5Lu{qfW zWd*|Wkp{qcmks#_B&>WOTP}jy3i41^Gz>7OQ?F>k>nx%8jK=8){EwlQRklfH)_5@t zP)EgdQ^X3P3cz6*wOuv8>bzZEOiJC;V{OO?%my8GBofliIn~IsqDki1uFE_NG70y> z*lD-M9&|f|y0Wz%JNNOGcn~j$aOih`@tkQMP*E``vky3>#G~yeYUIWzn;64ALsIz_ zec;qEkOJ^@6|MPplC3U+W~xbM&fUiQcssw_r0Ed4e$Ca6L1AZp4U4;RA=LOWreSkj zoua@bLh@=-L4ynN%7Mu#WTKu$XQx&pcfp{>+%WCvpC~W$qbK#1s#ax74%G!kFuAK# zIWoe|c}t0}<|faZfOIUgLgs0jVsYh=ly@eC7}~&N%9b`%<^?40Mq~vrwN{(~++Mw% zl@Pi}+*^c$DflZ4wr+7-vgbHYhQr7ySWXW++sKR~3fhgFh))dSBVOKOY-D){o_dY) z_hTr+dL(dwF5Iv_|Bg;P#}oYxnhsXg;|*9p1gbl-L1(ruv@7OZwyg~>LTV>jwRl^+ z#$Y}+1%WNXtk$QS$^0bdX*0!#1B5Te{=_eh+3|?28{Uq}@RBv&2v`eb;LRQ8Ys9he zAg?>V3`pu^L8^0A`4Yp7^esyYqqNit=}8TVo*=?7MKtG+>qU>GIn98@D5zGY%FhyA zMFY%=7yj={CfQ)*3M|CsQU>0M8V)v@&2k>C8Wi$1hl$s)a9y6{G_5=;j)+<67@@0C z0VJvhOP#{pJ673qLKzl(Uu;S(ywTdsT-5VCP;1;YQr!0V>3&d!D+ie43-W`A-p^^a z>40~gIGOZoKex?dK}h+NHgR`&Y^C31op9X;pam>yNb)F5`Zh;*eNd>n0Ki#|X4y`*1Vr6ZU8#cd; zAYNWsKjPhG-m4hLJ&OCuXW=sZ{b(-YBN03*Z4vRglDB%K^_mNEM3Yq7Fp+on_TGtF zD!55@=t0}hg=#s&z7dYcOyI_6{LXZH3k)t-x=&dZ$3ZH=x}`!#X!brE^8Bq5R4%eJ z< \ No newline at end of file diff --git a/docs/files/logo/logo_text_white.svg b/docs/files/logo/logo_text_white.svg deleted file mode 100644 index 0ab9484861d..00000000000 --- a/docs/files/logo/logo_text_white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/logo/rxdb_javascript_database.svg b/docs/files/logo/rxdb_javascript_database.svg deleted file mode 100644 index b6493a6a81a..00000000000 --- a/docs/files/logo/rxdb_javascript_database.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/logo/rxdb_mini.svg b/docs/files/logo/rxdb_mini.svg deleted file mode 100644 index be2a656c36c..00000000000 --- a/docs/files/logo/rxdb_mini.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/files/longwhite.jpg b/docs/files/longwhite.jpg deleted file mode 100644 index 39f9af6897f830b6de0f5e1b5adfddd1f94dbde2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 891 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 Bdd2_% diff --git a/docs/files/multiwindow.mp4 b/docs/files/multiwindow.mp4 deleted file mode 100644 index 60a7e9c6d437bf833282680575081bdf5d518394..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235454 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

    f6 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¨Sew!4oZ8)PN?9*CAjs<
    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
    Q!R|Oa2_@~
    
    diff --git a/docs/files/no-map-tag.png b/docs/files/no-map-tag.png
    deleted file mode 100644
    index 01abd401bee39a3b5b0bef519260660a36226819..0000000000000000000000000000000000000000
    GIT binary patch
    literal 0
    HcmV?d00001
    
    literal 3216
    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
    
    diff --git a/docs/files/no-sql.png b/docs/files/no-sql.png
    deleted file mode 100644
    index 0098b45352e923d28f52683b228b2364723139b8..0000000000000000000000000000000000000000
    GIT binary patch
    literal 0
    HcmV?d00001
    
    literal 4676
    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
    IH$9X73w>542mk;8
    
    diff --git a/docs/files/reactive.gif b/docs/files/reactive.gif
    deleted file mode 100644
    index 86c4862e2af67a926cb6d93fcabe95e0e9a675a8..0000000000000000000000000000000000000000
    GIT binary patch
    literal 0
    HcmV?d00001
    
    literal 61756
    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
    Q64SgTYjTzY54g7m0B2>|g#Z8m
    
    diff --git a/docs/files/reactive.mp4 b/docs/files/reactive.mp4
    deleted file mode 100644
    index 5996abc9ef9a1817b0cc147c39a5f5f0ba2115e1..0000000000000000000000000000000000000000
    GIT binary patch
    literal 0
    HcmV?d00001
    
    literal 73287
    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�zZ5ZMGB@fJZQ^-(u>2tRM7^j)|F~qmW
    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
    
    diff --git a/docs/files/rx-storage-performance-browser.png b/docs/files/rx-storage-performance-browser.png
    deleted file mode 100644
    index b0eb4631a35055a37471c6cf17a071ec6b7a74ee..0000000000000000000000000000000000000000
    GIT binary patch
    literal 0
    HcmV?d00001
    
    literal 70997
    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
    
    diff --git a/docs/files/rx-storage-performance-node.png b/docs/files/rx-storage-performance-node.png
    deleted file mode 100644
    index f0e424e49e1f4e61596e533282b7d46ded7c8ca8..0000000000000000000000000000000000000000
    GIT binary patch
    literal 0
    HcmV?d00001
    
    literal 50579
    zcmc$_byQqUxb8^;NpKG?f#B{CG`PEaaEIUyNpN>}2=4B5@Zj2b<8F;>1JiupIcM(N
    zJNK?xv+kOyf2wKr?y4L$t6lp0j6&RSeU>KM;>+o-(-=rI2
    zD?lq)XAx;NczF2b4aIfnpZG4~S}v*%<}U6=PG&F`_6~MtjLs%bW@h%zmJTjpSb!i5
    z%qJLWF<~{2%wv$59=0wa%o+P~H&cxZw-im(n}wf2`U^j!O6E_a%Ws$T=Lb%i7?hM`
    z#Kh5Kl~lYI(=YwL3F}-n;^e$cpp6`lra6yS@J(c=ihhg4fPsO0o5&GzcXN9Nw!#>q
    zFcB%iCmLqGf%XdK#|x4eJIs$9VRiLuO^Y`^NG;#LlA%w|z`g!6=)E2LYprC9KK5FF
    ztrg~gef`k?ehT@u#wLWG3@!hEAF%E&L1k|}L?Kw9WNE7|Y5@kIitldm#v}^nILN;E
    z#MULJ$?i>!C`$N})1Rt)RNy{3FS#^@XUiYu(N|N2+sHQEodoTOE-xIG)*Nt9DURf8
    zgYiFnzBn8ouGTChpjD$XoNwv`?}p&lRV&Kj)fT2S5=2z3JW7p&4bH&Q4?bOtSv^iV
    zm`r6Y+CJXDnA$-%YIRLp)@0tbqj6^YxHR`=1%2++hqalS13ta3u(?JBPlw1bXOu4U
    z_|)@m>SX95@Uj>2*+hmfwV5UrthTa=^lpY|5)4+}$ZJ%N#8S-Sx}N
    zq(qCM_ny@0z|_v=4}{9-$saAc+FDJ3@dg+@k`tOOY-LoEMI?l)PJOVK=Ml}!uI!sz
    zD|eET8q9Db7v|L+rPj>&j%OW@rBTbxN!x6tR?yd0cwU^^~;uM0j(g>KdwX!IO6%u_@@-`p;
    zY`FlwLZ`vLQrmCuc(OC;LNWt?Il7BLa4lJ9K2A-(J-JdhWwnCu8jsDWXK2bUM2^7t
    z2(Mu>k6(iAD4LxBJt#Q+9qV-KKKyKu0==b
    z=w~1ZEVGNjxoI=R7>QM(&7Z=4CXsU|m~6iry?AHwKyp%iPcQN%JbO=R&G5ScjGs5+
    z%k|smuh_oSlEj(uiFCcK+|=pyqg1QOw|vt1^BkI(E=w4OCbImXlC^$P5w1xGN4t3){*DP!~8hQfe
    z-~wxlcduO7)Qs2{-+oS6y&S1V824+i|B;Z58BuNpavV5t|JcTUE-Kf}7fsBC2OVu1tG{z}sUe^AnX6mF0#3zc)#LwXJ2
    zgs)0uErXFJwL0)dcTI*hnLooqbn8BozBJzW^n6vuW%->EW+dytJ4x@l{qYgQL@5f)
    zu-_ESU$)mRb*ol?Y?am#IDJOdJ^u3>UT@I84Le&yPQy=?YSgo7G%AnxOv`$%n4ET?
    zU)cFri%!1yUEn}*m%pcp9k)Q+={h?;1(ne8;h)XrHdjIbSV2n6m?W%_S);ASW9*q1
    z>w#)RfAonMRv!PoNj2`bNHc`xV!2(LtUVDirJ2Tb#6A0#)}7-Si}XXLpRCvpI-|vJ?7$E_Y{$VBm`_7C&6X8
    zbtM=@((iE{10NHg1QsKckMh~;E@Y$_WCa&Q1B|9EdQVcfXYYz7sd(ue^)$u8p{)^g
    zu7s5?FLXYRZrzF&s9u<8w6drp>)w$>(#D3xE26OHpN|o@jkU$8kkk9LmL|~6xB}^E
    z2V7_04`@NYmm%oS%sTh2h7!@z%E9AVi_Md`7NVORELWbW-6>$9!bwO70qWYyNkHGP
    zk`yThQXw8*H6;4=piNokRcZjj3h!iQA@`k&R}#`4WxU0u?Lt+#VVLUkr3O7S1rCUy
    zy4Sj$vG593)Z7r?L~j1D=1RrX*xLB6wUrTwm#hkl#6nd+erGx3(q0K5%!t3*Jd|

    qO3P2enf#R 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 K%N9x-1^ge;!_UhA diff --git a/docs/files/smartphone/desktop.svg b/docs/files/smartphone/desktop.svg deleted file mode 100644 index 68422a731c8..00000000000 --- a/docs/files/smartphone/desktop.svg +++ /dev/null @@ -1,8 +0,0 @@ - - ionicons-v5-h - - - diff --git a/docs/files/smartphone/desktop_white.svg b/docs/files/smartphone/desktop_white.svg deleted file mode 100644 index 459821b8d09..00000000000 --- a/docs/files/smartphone/desktop_white.svg +++ /dev/null @@ -1,8 +0,0 @@ - - ionicons-v5-h - - - diff --git a/docs/files/smartphone/index.html b/docs/files/smartphone/index.html deleted file mode 100644 index c1aa96c71d3..00000000000 --- a/docs/files/smartphone/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - diff --git a/docs/files/smartphone/phone.png b/docs/files/smartphone/phone.png deleted file mode 100644 index 29b9a53572ff19fd515496c5e066de931fabdebc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 241699 zcmafb2RPgP*SA%(Rw-H{wA3z&B1Vj=J*zg+qN=J^%p$gy8Z}Fis@)o`P3=)iYlNcq zY((r8WWDKq|DWf7|DX4HulKrgxgyB#m-9X6b3W&D&hgU3NSl%VDm@t)8KbVw9WydA zDij$RT`w&)=@rNwDH}4%>P_7{>gItnTWvJyc753diF7tSnVhohu~$CB6m$^+sU{ki z^!OqL)adwM@+3+#eIZO@gD^_{{SMCql6zKM@)Fq?P98etc5*$fA%9@iBR$P^k?W!Z z5raP$**_xQZ+^DXJiob<-8dX%6tHO0`0W0C%l(e9j|;pHyCN?zaEM!da{R}Wn3`DL z%nSeX)jz+NF3(j|`_Etf*B=*r@8Zk*zu)Krg9{Ti>L2gE;T(AQLw`*Z(|Q@1g;w!wE;FMquLE$oiNz&@XuHwf0&;9B(QFx59Z)3&(%o?$~X| zu0_!Bdd+?YB3GvSfv`D`9s(Sx={HA4xkN2Kk z@5?%k>ESvs{%Cy1s)&5nOZ*_sdpTGKjmIp)J1p0L2W;@^WDgy-Mikc7VOc?~ zvs8H#M%IV2`Zv?>8F^!3S6PL2SlxPV7u|=z-BvzNCn)>+RYIozYNtiY4Jtw7x^XIWvjjED{V%(#D$)5P1bY`3;Mm?1VF7S`X) zvU2AapK8gKeSVeGHAMv`x24ZY0Xyli(>Rz{_;I5A!l$^efB9iAbrkd;e#g#5K*9(@ zo~*}6F!7hQZz$mqp2Z;9YVv3#UxM_heLs|!zb+}c;pXX?_1UR^aAT~{WunaVmh%8h zBdqrY>&}~*85_*Y#hy6ktdO-T~e&m8!&aD3C%Iu1mcp#OJh^0Qw=SpPdh zO&m|h;e>QzQh6efuosti%+5DTiWLb;>We86lr$iA`kjCRe00c*!hqccM5E`Tvclo&@1VJ)-BzLBDnpS|<3V@# z^IxlWtJ9izEqBKpbTNmG{>-q1g#P5^``^4?SZeet{kT2&xZJoI1^@JQbF47#2t8#S ze6l5?4e(3H0xq2#a?y8?r=K68(!fT$$e_01W6;y*sa(t>eR5EnCgV~O(RowM>)%#+ z)H;xR4A>MJ9ap=Sy|>=d#u}Jj4}$dEZwM!1|A33AObkAk-wapfFxl;8Gfp=SJ4idg zE)p01_gfjBzZY4l4)@VrEAaKLD0;qMH=(oYf6SybH350|kje02{H>MqmGqav5a zVG->>r8`|sp21w3N@l+ixcDSF^8ppaPCm(PuPa@WLWQyY=vdQHjA~vZJe9=|{!s!a zYr@b+$I5q$mqM?E5gr{7{lxBhlH>S@JaFMGGeG>FkzcWkVDB+TN@C_;Ip+nvJq4mm z|I%>>5!>;Z6l;?#1@bomM--i&ZO0Y_rKBl`H`5}T;qsDO&q?X$(4qYkmw1V4=g<@- zvofEt>RFNUelMGmlxG|-4Ch_i&->gUY(D{_pmH>-`AqtkHZXKzyT@ArSzem&vj_}Y zV-2_%?ZmP>ZVcXTzs}3!ySJnsM8e-W|K9zjDCQPfJ_jD+R_(}OH4N{bb-OpwclXP# zD$;|#pC6!*xxddvxXYu%T&1}jkQ-QSx`JP^DoQ~0*S{foFgG?x9Kpa3dt>n%K8zOL z=gO^KT~S@QKE%9#XqA4U;Q<&C?G(f_6o;(km9lRMNjqT1^r6p=?_@C!MF+)&791Y! zkAR7-A30AGLtB!TLw>6q^1v(7riq7eqA~=Q?b#~Xo9wibUJ|z9v##Q+RFxRKGc{YM z7Z3DCU1CuMpTXvj)h~e`JxV&m|OYV{1*>}NpN%#fcYPj^4 z6Mlczza#_Y4Co1H_!)TH?|B)VX0RiF@wb$r=|kS=8F0t8%db<9)T%E}DSu_|Ss$z- zW%{45?zh5POZRxSR5w5)O@XS1(t5fhu4dSZhx7FeoT?SHvL=Gt!Xm z)+4uJBF=^zq9uuD_M9fX?sv0ZQ;CMuV>WPedKl2F{7@FzQN}`E8*@Y|#+Z!+<1_p;2Sq1pP7h5$>*ddU3svWdl zKgG1ly2hru+L=?%l6)9M^NVhH{FSCJ%h#7qX;ujrqM+scc?+>lChDfvrmUZt6B<{P z#6HDB6)Yf>9gtv@U=WGLHq`xoR*J=8dLWcTqh1M6nlVixChD= zzz`!mI%d!myr_GIhKv|99~y(7hs{>OJr`sSsJG>!ch9pYr^b*Q*j1UqkXNZ;nSM%} zr7{x@(VNl3%sb;}sK(0$p)Y{@?>r)>tM2x_E)LzFbtNi;Z!QQSVrrH{-{;~n!iRm5 z@_8L$+#~1RpryvfmRDTHxv2+2M@fkF6)<|bWOtuLDFZ@j=L1GZBHL+*SN6wIQ!%4o z<~>)_^1(!vVUGe#Xjw-w1|1-PMt!*daSlo1b}n;G-a!ls!2pR~L?sWs;T4HH>qfBR zgv_+M=~a+lVq&5XZoeNmd1IsfYQ|9rnh>bdf?wJXNm5kpJp6uMf&F0`dM)oR>}erp zUvVF6cy4VJ3>K`1JWaq6tS9_5x4q1XpowSN^Kp={7T|WNRw)=o(8Sx$S7E0P`vnS~ zBk)pSm9UPVyKHBep8Z1Jj!k9V4;?L)>)3mZ&2Gh5QP8~Z+1q*|PfI{3SQpu!C^Sv% zSK{#A$H%NTJewD#VdC)$XNNs%#~lpq7|$=_e#ZG>fwlI44RHV2rO1HMb#UuwE7AL)zAlZ#vk6zSj!MwvlcTl&HsXf z-pxy6H%hXOcg!eO@!p4cZ9xgKhFT>)# zsxVs*38At#4X{^&C8H1WFqeawQ70-1^r633@+DyrAvmTCUH*}PnIr8C+YM``AjzLW zxf7Fj+L$$WRl}ynfr>8dEDVda!ast&tf^AoXpy|7IRgr_8)CX=_xU#9;MEB0rokiz zQm_kD&l$E|v7sUW&VK6CqyR%h!^Ds!N??jH?0o#-Yy{>&*j^+Us$zeQ zfK>PEt3wUjvGcowZKTq0y5dTte0a0`Lf~q3cwR?3<*O_l-tCcujg(FR7b}zQZt}H` z>ANqqeQ=eDd3!6O;c;iaQ@X$d$bBwOSrcs>Abb* ziO~4QpX?fg8|Q9J@yqtL_MS_^6YXa~R}Vg+ri9u|+Khbdu!Rqp8l{uU z{BLgJd4plSBE!CAM*3y*2z02{`bVM>=1_^fl$wtqvz=u78F+z36m#|J)dK`}Un8#ZQ%g%r2Z(z1sQJ`zIpE&Cdtu-t zZRHon3H?IFY2BY+&;Xc)f9!i}T+Q|`Nk(bUFeKKFqO}42+d6EA;G5O&8_);Kw->l~ zR78jx#~Pl6R>`z8bU?lqoU=UvLPNZRzMp_6p2Z9r62Auh`0+z4h#HSgaA(FN zZ+r+vp1I8c+drP&oY;>>^f-+x6Lm+7%~Ynat23o#&wu*Ke@HGoOjxH+yehX@oln;x z{vNT5d6~LUYf{yH{Tfo24Ny&Dpy^zmW+VqPfNxh<@G9P&(X9*8F2 zq*{{rO3MS>3mQ2f=+8F9Ah>_37P+zEk$juy1*_1xn36@#8QQwbpl9<*MJVtc6{0D= z#)K$w#5*;$yY+?6JNi7l0OML_?_@g|xH2el6sCK%Lm*Krbw_ghIoMFSKvqb1(OpOP zxE}`jta^TyXAy=Aq1nVe>bQjM&p_ZLl;r1BT;WoV5#d>62z4@FlGB}Zog2xdkIwj!vQ#m(pXmhWWrhrvj7z-D@BWAbJ|sE^(pR+V zjnG*2MHK1oJh=YzcgKU2u%NN@yxG0IcZac@zGYFRz^$S?+Xd(q!Bwm-PCx462DAG=6=rIk3-Y8A zDfAC7jYoyx5n~wENP&X$wEB=#P^>N>q3(?BGR#a!$o(t^boIP=1leO8Fms+(lJ@#H zt_*r35BSqtSB7j1sa>9ey#AyElHbykQGz?oML&1Rzl<1j%6<~F88fWOJN0Y$0pf5O zX}obIc~G+h&jdgtvtS*%+t5j)KvF@l2ye+VW}r(0?N=y?YZLR(9ay}wvFMkgmQu9w zh67#}g^XNB!jWLjf)oA54%1zx-}-jkW{Zgn`a~v#oZ6*4S9XL@=db!ZMw$-OR+59mf+Wf+D}Q{GycY_8iq;6~ zR6xwZc`0iQxU~6?ZIMAauJ@3h={2fE-Tk<#!V#cKaNUr0o^cqF3VWtaHbiCNzjXPu z7yGi7iDj`h=y2|-nom;ObIf34`>{l0CLoiDNRq)9cOHrNm92_%73ov?&16#{%?l$R zMD#u1Y3{EC(&#I0=tIs^=e&9tZ~1Lb^bE*|Ds0GJeMr!cr;a9utde)#R_4Pc(uC(J z;=X=1O$;=@o<8yNfLkz<3h4j&v;LDNjl`fb=>u-|{I?UQ0&))rWIFii=R07FAupXh z?xbBkYf?zLS(Jx)>Gb->LUNKVBmsqNb~}*VY=7@?V~#i2`>r3aMjlswzYhY#ecv|myFu-_!pNI$y7rdUuKlBFkBjkZi z+GhV7X{X4u0qjdrp_1#Op{B?4i%ITr2g>Ct2$w=EMT@;7Y^YlM91pJ#B~cmrVh>26 z`R396FQ?yE6+0(nC;Cm^4y=9xcJG@=BRUoQ?7!AGOWd6I#%dg(?-w9BKa_zg4;74B zLic8!w)77P6AvA*@q_RptP>Um{%GJ-#&ouuU381-r_$rC>CasUYx@RoAxsAH!^wlm zCWMW{@qA7{;2qXboJmdD`f%9N$LkltlRnKV1y8v0HOXBM3 z=on6ijmZWqN%G#T*a|x;1U9d?FY%=r$+;PFu6uPys<#-aw@g7`^Y?EBdiQC>?~=5h zdFAb9U*uq}qVF0>I)3doUb2qt^SvtM;9NFZ=j?P{OJ7l0E!?YUn(8){<>@d=jX;v^ z1$B4^^v{K&_+psr2?0i$IU4N8$@e!Pmn{Y*=Evk$3e#pm4cLng(Ph-_ss{0C?G4lxZu~YIXJdXc z5&~%PqE(s1kkOSB*<(qj36%2WCrF3o834O);KY6YxuWCL8UI!KQ&Z1(wPE_+nM5`r zBPeL2m8(y{$GEE=Q=CN{;mXzG#Lt zwm8dlF_pS~6VETjR%4E?s3EI(Xs47=V-qis2baSal+&1UXy~RO8sA?RNUWK78RgO! zxnX@+T6(y_<^_OC=NQX~*Z*{O%SysnqZ9;LCjl5SE+B(uqt*Z3?rjTSN^n z(?wfp@%5TDh;(&zm+b`ij`V_8z)J`q@7Iyxkb84svwU8~#q7*4l1XD&<;@MIr&?(w_tv_F;0c zexRb=xL=ljdc=7<=`9XfA)|;i$Dy4u0 z-E*CeU$0W5RF~re%R8~Pc1`5zI;X2hYF)?N8Kms;JsYul1$|lAlK@4uc5{Ybi!Fjr z7=1j%C?aa#SJu%kr~eq@nsJOb-yXD4T~F$m8+Rd96qz=~&)|CYs>Q>LW}06$9J4&P z?=z;f&YjtAr-0GWDYGot=K~=LE=Kb23Xc8lGOl;M?Vkr1#l`?8H{%+f{<`+3r3bJj zPgsUpb}D?gihhvpX?6L4)3G2yy+uHqrHrpkyi9?HnHS2yw-Ai3JRntSKNO?LJW6aI zu{=}*nd>}_yKMitV(2}G;LUnL+Z?TqTJhZAqH)MZ_wV9{Bi)uT1hlU%h}~5rqc|k3 zWGK^Sy+J_253lo~I%W>yTJnX%{e!0>k!qmk6ExK+QIE)0I58y|D`+`!4hc4Fs9+EZ zuzV3*bRZ-SY9j{3p+m#>q#^cgn{tpXgUqWTq512n;X}KLx{QJzZ?KH&Qt^xBlW^ z`TdP_&wZ&k&mQvL76s5sBi&1_eZ{|h)anpSj}W|#R77WQ95BkcF4ueW+3O8wS=2yP*4$%yLnXc zLylc%Q z#bRTC3+Sa=+@7p1n-bpiS z#_;WJ#i16GresV~sKXlPtZZ0ZQ>qv$b!nuKGzOl16O;B|{J*XAC9MBx%8+VLkZ@di zWtmRkOYb~IMo}nIZg5jrR>!gb4f5Kvu+8QwO+Q;qQlpj3NDGjGoDh7 zRm`~MChnVPx^%TB=ak!c)kuNmgZO=CL*V%PYSYJ8YlX|h1VqXSk5s_!=V>eYAV`+3 zu#tTu4!r^5tp}sdi*GIt=PqU+Bz{;du7X&vgE0mE@6z{InLjFMt-G1Ex~&?UA@DAV z9f*wE@Iq2u{_QIGT-kf@Dy;b9#Jc6?ss4O>I+mc92i8UPtKBvt;q4?&!VjA{5muDZ z&I$0GJka%>_xTN*JZYRjN%|2!Gtw6`U{kB$$7kYxXB&0l(k6~fHqJbD53kAo$Z&X2 zFF&K9%y4L|X$K5q7y<>R+1EeGcsl*5tCE=P@^xc^Z4xT=={@Dk(OZu=TF8nDIaxW* zlVLa~B+JT22>yeuFVp2RQrqo}oS(X+%%rS|?3wJDpjRQCBGKOHyg#0W>0x0dcf@EX z*HVdDI@RZzuW;D`LlE#$T?*WRu}d$AXgzK$*%f9NGZDjLVDS9rp`;#vN+G#%IT}*V z?`ZMDR(t@B6gmV;+)0cVGQ_`_h3w!&v>f`?4~CVW7e57xwc#a;9MBCQ_cjp=0*4r& zSPwRNSWEc!Zb)Hbk{xaQZn$J*LS-R2Zu8s~PA zWdvHR*w1{J>8=gY_!5QsHWk}eS%V z;QlRo=E`n73C`ZiW;>{E(~-~_RMPp`IHn3-pimsDsxOG&eXLWQ1V+J~LthbhWh(n? zZPd~ch=Pg1bK_tO{TKnAOlMu!!IBD=TEwd4@$pb)1?<+NymB*AOx7;I%3TlGR|y)Q z40b;rWh)em6Mg#O&UaFd&vjF7R8AT`M@(zIXDn1phOk|ErtzVHiL zkKj)lJNy{f!jMXfuT`F(D8vuNDbc?=^KGV!@_Kcmz~O`Ij9^q6DEJy{aW9be^xcY; zhML9GoD4)Sdr1L{r~<8AuaoTj*W0{3zPLj&Vg5F-K(6M#va%QZ>VsB=B;=;7_Df`d zh1-ttTcnx6TUaX$e6PgdWyUZ(rS7Gd4rqJ8m}~_#UOF^Ues6wPb|1UmduwlX>a6Ga zSCu83rYeqx2M{|&P2F|2gBwM=z^QJ(l)IUXe=q z-dF;SJ+Yj2e?<4hRn}QTeo6d-@Np?!=JOVB>5_!LdB`Lx)w&d$6%6vQv@FlE6_)G$ z(K4si%+R4Wu%!AJC8&0c@J7N*Z?_fSB zzg&l0!C32lkDV6u%^=dZfQmn@V`iDo_ao$2A6l2G>CkvD+)AeL3&kH#tp{{q^A2a? zgND8E3FKU&ye}lwu88J0XvEiWJS@!=upX%_k)uY!-AP$2krnG*LG4vmR55yLC`_e5 zK2js&I{e+8l=_TnT}S+LWL%TjPL{300rCB-O+^Z)Z7lmUgtJ$`6*(m~7=Qd=7OC(8 zp`0|%I*mh(TP3$h(d$rwI}AZ7)9IEnqf~ysamq#XR<2HAma??Uw%&kQs^nkqY7f&CEvkx5|3kK2^A8js@fNF0Nfw%%ov!~_ z)yF@*tMW0Xj+xX*4J*++o`u~AR6fi(X2TxI6k|{g_cgaz=5A($Ea_~#p(;)zIO{}C zTk}I{o1P5hQGKh`7#1F|5#ROTU$TCI`6{5lRe=-=ay6VWMp~)v=~J?d3nvQxer;0T z=|svF^+zOUHQg7?gP`0~{Q@$c|M*mqQjZvs&u&T3=p2Sq?DVKCUg1({$HE-3?~J%T zQ(ihMA;?YQ+6BcorB+!xcYNVkyM;!wOo^zNyoM6WB1%jI?bdfhRW~1iQb$a=kz#cI z`EFZM_s;y6srv$f9_tS`0?D=T_jZl19I5lRkL%MZ-DTYz6hru4=%^mI)KZ={C}TaTsJnu3umNm8khIFpKZe>>-wI;{A~41hEJ{_ z$le|-`xoe)v#9}Bd+sxGXpYJ;-Z5rSPvB>~8@h3&SYY6dK)1Pu5zydKeJ`Um#GTK& zY`v^nL;Ra2BD17Dqux`RryiJxOkt~#9dAoZry9{~%Z>E3e=`{=T{-BXn+=7LnB3(W z3;Lo;iwqD^k1@N}2qP)CHvFMtNE(Vc%GMJjDjpTsBPRSjT;fg@W~J6dETTZ$1{8~m zSmwoFJMZA+jx-Gv{gt{%Kz+EfTTHz~XTNe@c2cT1p3&CPAWimiXOSkgD zJ@|S0)A^R4jMSghz@qFrlBGp8hga%3xWsrWH>bzci%Udqa}xRk%*}bC0z=RW7mXf^ zXuYF8iwX;8tCWqxj;iLvsTfoFsKQxS5mN~i6mBcx#W{;6)bI0{v%pChJ=_bSc|X5H|dGBU&m_Mmu6Xi{DWFg3f3RK0%eKLmqDi zA$;f*nBc)rYIm4j>}6!pImyLj{?=VK>;mXlB<}I&NFc9J)5X!b_V&fYV9F~u?oDMd zuZ)Y6v)ag{#p(v*L5np;l8YKvajN0@(rVAT-9Ejb47uQD+aA&!f?EY*Et3w=10%=c6N^Q8!ywRY@Ink4LOsOCB5nWdXaw#hFY4@IK2 zZGQ}hA@azgYA8}~LsC4RKAQfOlL`6Q=gINo_tgG8I6-TrKIBd`=DMpm?ZHD~?n6u2$ zy!)==J0Utq+nLL^G88`w+9S>i0udCTG8Qt$tc;ze zGQ_y6Xk}_<=w9R5=*_y=Jco`X*c$nyH+@9|Lc4=vmUfGeLJ9P!_qMoctim$>m^6aZ zs(iW>bug;Q+`RssY)k6xB_18yk!(Tx7&QqEygORI1%iQH?$4Y%}j9{N7}9y*QbkTq|Q`7)EFMNLI@hh9k1?3 zkgTgKD%Y!TX7OU`S3T|Vd4jiII1eaMEwZ<$A3W# zUiKPu6NCoMSczeF#!%DGPtXoJs9|01%I6b9am zpZR@nnDVFWWLP?QGtd#%gut)$CEF$<8hBNL6;i%xxYDGVXC;VYhp!!_TUZ#hwe!$P zpR9(Mi&rs3lV|WkeH=OEe@fAJ_ZlMUE5UuMb(bv=P%YrY;uxM7vM<-k$=~y(=2vm~ z0fSo}l7vf(7nEG368T=C;Yy+s8%L!NVmqB_S4axgWkhi$%=9c%4wig$v^lKSU3Q*D zeW@gS*lrLtmlsi&XFpygWAWM)?eev<@(QTkJmn@j$G@GD3#Rf#K!?PapK_>WQ6pUH zixPa#O`ke)MtWLHEXP04McR(XwBFF(F7*{_yOHN#a{q~bi;p2-YcR!V5z;)BD|7$$ zns{TeMZGN|+u-Lz-Ki^5JGRqjM%Hx!R=~*uNP$ZC`;IO@f4N>w7?mS4p4^VcZNAPe zE#yzz>CfQbpTX*Zt|*$raobSv1!~mbMby&z>g*z+A(zxfsG=YnM$v2f!puoys{U3@ zym|Rw3#M{4FBJadX+Uc+p{TBX%chV((>g1(y`~%(We0yi{ zHNBkoZ+;@aRbyhRJgf}ItqTVojD08X<&76f?wlQA;&}YhgIhj2B-}izxS?KAbf6Cc zyBRi(2K#zrL(mNsH0{6X&N8t5Unfy}z!cB!d+7Kj{gT^6Zt z2njkI$%P*oHj5_-1{w@RGGj?>erE9IH}7adTCEJoY}}e5JICfbDl%h3VMV9vifht! zy^m&^D`uL#0{ZYLaRa{t^u5%m)nRt30h22AE~+oOuES6%nB`*FQsF-65)-I9Zm((KM=+mK*k636 z0b1l&FPA`xenV7=fjFf6fG;dxj^`Qv$yE90AErL6hDFMQ65lz|QGnV27i0B3-!XTe zVo$cwC7lcYvmV3QR6V4Ar;t40_8|6S#|WRj5M^t?#;&Ye2&y>CuAnoLDGx=!W0gM2 z`_Jt~s`D2{eSB%|Y+GE5TlKv7U? z)J4RVzh7`p8Fs$qmnA3B{FJL0pucgvv4Oul8xmfMz20=U+M$i72ur|pNRpx;7x!l~ zVCdc1f5<2Ym7?-}1WHxdF(f<6HO_bxI?O?QRsRD(-7 zaliS*=^ox!D*DK-Lpnu1dqIsaRZOTFjo|;d@4pY&*bR9pcPIW=f}?^|I^vyCwYGLl zIN)4u15S3t|7Tlbh_mBVD`>BaX8p?|zRH$^(S6)ISWFy!5s^WL7<;;}w0M@33nQFW zk(o9Lo3P8O#Ed>+!t#5l_Z!_%Nh15scvV)|)8{3=E`Rmi#VGiw+6X4|@js97U;g&T zjA^9Dw~6^KJDoY>k?JKW)iO)T7*z(+VQx7A)Bg1GpM|z$ zLBh^H)o;jtlF_j&BGU(bmsx0g-YCY^DR&d}BC_{32iFCuxbDeuM{lMwiP9znr8tMc z9ie>p5tO?1z*!V;uD_p-5#UPl zE-4yDIn}`~CtJU&lH(R1H#(XI{26n@v}06)j>fbBW#jkk74bj$>{%&Vp>w2JmKyh| zo0d|PG)&)(-L&|9JrrMX_>y@>`%ys^;*$9Hba$&abPB^2$$I!`DFGqXI7jX%3ZLy{eHewR#NYzarU zzh9zT=i73M8C|g72gD4YjR*&_-=Mz~l|O3ZOW>=lP1)9Ad|$}-vOF-wz!TCM`1zh? z9Ml>O2?)qFL8VB1tZ@K;koZB5jK6?NO{YQ~eJN&9$g;RP9Ao}OCl1_Hrm@76LA6{% z@0CQ~)mV{olde018*%wsq!Kh*`AUx-fi0JQSUDzE<}RmPca?Dw(D@K)7^&IXK8s#0WC?_#FrI}vu~sj%q@+E z-j!O0D;m7MP^4L`=9)fkU7(;wvcsRa{$CM0TaOYYrJwqa2}cdTIzc`#_L@o@xuK(> z^yXa*peh2hbj3B7AC8?vuDuk>PeHg&n<|R>ls9gx>*Rfto}H5N;v0ody_$Fbd-CAR`$l>=-?~hLKrLRK z==vt44sbPnVnR|*`AxL>d3hS$#&7he=aW_haL}ouEBVx@bU^@>0;ZcmQUP(c?FpN$ z)S|hnw+q~uC}5%8!nsu)ZAGk-Z#b&QMQZbGusH2?_BBYG9MG7XhX3D|_}er$qM$d@ zzL_iQAfrHJpy1GBbwE>6{>i2$C|vRAftT`B!(V0JwmZak=wlaBo#%y&PHFe7XGh)$ zi-8{=k<~81=@3|e-YN_y+eqo!l3Gy$Jr-uM85x@uGZZi_Q((r9lJ|v2Eu2UNcDQYcErAhcl3jL20`rAc@>Gs5_P_&y(w*i4n>VO8{Uoyc^#t4wjudx7fSMz5iX zGv~YB4<>xBEs1)~^+)*Dq6+p4C2@?kNn6hh{hQ6behxIGybZb{73BONx};G9m*}Jz zcV$+g?=mIr#mBO5dfvTUx;d;H{XdAse_6$V8f9=Jjf5G)o@om8mlq#gpsAvy6j!^w zi2g|J9qwQEsSsm{y9=YP0E^z@G34++~%t*|DEWLr>dj)ImA(9o1M=`W6y>Kgw;SsK`wA=mgj$Is+BXdmbqA)vj6eVzt9x+z)9}e-+T*vaoaqd5k<}d%Wzkui>W3YhcHVnE| zZxpg1P{%08-k9x;@pm1)>xj|hujx~Nbwxt<)Lji}uHO=GzS~ptOm6W{9AAdD%;KY1^SE@`&>g|YwPsP_VL4(Q!Mpj0*6*!K97qYtHRk=zl?V`#B+ zSp{bAuJ=2(i|3h#3GXO*^q|~27*dd2K%PGwQw{W;C()6@oB=31g-Qzrg8wj7Ck{WI zSrk9cZ5vKyaLHJ1duh=?HvHgzRQIq@_4=|cd>8FVY@@Rj2FebVs=HH=9}R&0C%UP+E1t7MQO>*l*j zh0@@)XZ)|SfMk>wy+|nkQi;lkf0Pb?-%%ck@iOxP+MR%mt+Ytm-y3Qa@QqnVZa^v% zkAg|&O?y$|8Jw7nG`A|On$-Z=AXG>wbMQJjq}NaOL5)J-o?}+?fO)HO%C7;P4jG-e zOJq=mWDDqq7u)CquPAbM>I7?vjlU}t%VrW!xF*;KKgN-`ZR(6x6jYlU5kvORr1-Z> z-*0KVR#aHPalu4e=n|Fhr*~0g8`C4pN0uQEfh#2W^JU0y8Mrrr)ls)J`+j2-^dhs$ zQOed#{ZKad$L;uOM{k z&%*bY=Bs7hO|jlLCQ2p_i@^B#9hTKvr1@6)Bmevv*N;0Gm0Z;XcD9E>;8 zY^jTy7}fw0d4M-bv?+u88cEGE^+q{;k%|5Y?Psv&w<%xGiefI(%Ohyy%B53uXV|XC zdi6y^3q&fcFUw2ZPK>|sJJp=_jo2MsmMWH*P7>C&2nec!!i0)eJ)sZBvVVqtX0Z~J zkCu7i%JPSKkm^F?uE-=KfjwQ5xa{n@H`m{-+W3(LZXj8vy)%E4R$4Mnog;!^La{A#~5;1Xr+4w`sU>PXLZ=m&!SXZS*Fv}_bGG5 zXc29sVk!<#AW;f2;%PE*12pZ$p)Lke1Nm=3OHDLE&Z-RLkK#9?ACjs4i6GM`ssF+q zl0A}c{NphH;MCuo0_q$cz>}p$$-N@3zcX$mAY0TU1kiowNkyR2SAO+N_0RHdJxXKJ zm&(tc9ucATq?9#T<-{sXqJ^Yo{wB8{h&N)8WH<8bQ{2$;vFG*B>KCc{fANNYRk-}0 zu6r2v*Q2B^aLhU`Y4x*``9wph{HEgwOsZo*HOMiEIi*XI7H$r3ha=iHKfLK0Z_3Rd zA5THD7V$d)e@P=HhHrDnX`CHtM^Q%nd0Jiz(!wIcnlx7^fgZZZYHe5de+7Bfo0N(f zgy%m!JNvI}eb2I{NK+}cc(n5c?ItanL}I22C@ZeNyI!;^bguL&;PCekpFe|Ke>hZQ z{$T;niQg3+nyW9lyC0ra3J(tHJid9hHN z|Bn?`FL30(7?qmM!=%DV} zpL);0*!e%M{@-@_D-#<06sl6uK1*TRqTS{xX}yFfsO}*!o!{QzE~ut_z&+gW{T#F7 z_kEK@9)c7~BkX@#A^69}!=G1vi_f)rtp}ko4nd7;d4Sw8v0gJz zl&IEH`D`p`k)DMyiu^Xx{Pwg>g5?N)`%BScaz%#^@|Y)5`Esc}`HLfh}Ub>G*sIY!_ z)4sGtQ?N@m5Lf&w?4%YBpxz+c>a73p^^5zZqU#Z@q+O-;Io}aK0F5&*cOVckmde!6 z-;+Hyo%~&^KR1dkgp{vRTvDn){D6GP{|fT|hMB)InDZb7s;<Y`scq^BssYmSDQLOK3+nMiL*S4LQhr>r5ScA$gZ?pFDtbet-N`Q zKAUvOQZ4`?C5@K!xprt#qV@&PQQx87q^tbLmH$H1E2KUP0HE{OByM|y`Tr31)=^P^ zU)wN<(qNz>t${N876=p zYFtQ?ynuiCsXyrY*OL6CAm=(hkgn$IKS=VFWFNQIhLvSYPZMk#{61Oa_8bKV;-vTl zXxMYFKmVT1H0jVQ#=7ag={8x9i{KIyzh75652*2s{LZ_qjrq#bm~#k7?i;Lp4wrLHkCTG;5IE{4gnE#PEJme-Mmr{6%Nfa)zBCyvGTCWY z@p$8Lc{;5i=>HbJ0kloV0Ao>9uh>GquONcP3V0KtcE6+uKD9r&AOXY5-atIyj6ZYu zz=m#Mzb6U)Yp1Wg^xrf7dguOYLd@;K4;}2yT8V%+$N_(1MGo{Z|00l@wg!&Vel4%O z!z#Z6LDvc(fcdpNq5eA}@5sMj^x-q%v8yZZ%;dQ>dQZG`Og@?V;SrA}j!Ci{R_@YL?$jxQtT92ELp0mCY4c;Q)1~9>x8kwUjM`c3& zukZS=<3;$vJQC7sYOY~$hxfQz7i zg>BF>W7IXD(Ikt0iNN&^qT+t0_}ZXNLd%8eNvD5(XMU5c{nu=d=xh^+C6it49VRW_ zP42;3HHdE~ji)-H2H*-fiHf4M{Ujgnh z0cW%%dPgcH7t2qmHF_0?#63|npEvk@LyjQh`YTz2JHD{Jm6vM}NTh^5p~TH)E+|@H zQ{r0cDhKwKh-^&V2Yw*l44ZJC53%LRU&brOYqdbZ=zvKh5)u$&Qoc$$xbn>l0C@o- z;Q!vxtJ4H14Yg;;G`u%?aP<719Vu)Nz_ z{@Z_I+r9ADJm3Yi!%FqGsAsWsE9uW|FV|xzL-5Y$#1fSzZe1PDG|94{|o6u6^2 z&QIj0Yu%wOGybF7O-^ia)_8>FPd-+hYGN1B5cEPnMGjxJdCAPPE+M7jIOMHLL>I(+lqr60;j$Q|k=^^jS6n!zj=_EJH34?(!6Mzv zW4Qo#FBl^tRycUQjS=?lToNx6?T>Gu#Rw%FOb4*(@3%w|V@#mMfM0{&G5*)O|1uNu zZk|KKusx@GwtOJ49kh^>&4KLQZphiH^t|+_TrV4+;CRioseTV0`aGNxc6O1*a4z@p z_pjNm8>Qnqu*5A;T;rz53pdA~A7MNeVzSu%m6y0!2;S9p|FdkU3nTQ7$p8J-s)s%> z-Irv+M2#Q!Zq_FeVoPp-K=OSq*QW%JYMnOqj<>@+Ki%KVrja{rp?$xAoda}rY``t9 zy3&U<2**;*Q3#VfmX!+#Wvrc7m4-wpc*0*312h=rzqa>(^OnDW0n|Z>uzkaZoDe>i z8ZOWYga&iF4|hs(h4n!aP!_HzJaVet1+`XYH^grg2x6x^PS?*ufj~#A_ONEN{p&q; z^0k%Qef>G?e1wh9jISx(4tI$q3C0c43nKR+uc3$X4kJ4ugyInf-HaOh>2(-2EIcnK zpIT$xs?o&n%c8%tMT5>aflq6}*&yHtu!|1^8A=Wv#M5XJUup5cYj$Z7Gjum@nx2S4 zvQ}ch1IXb!a9$-flgM!M#N!rIuq1lbAGYZ4g@0TGobV@rTGGC;23E9Lbi#og$<;fR zT&^sq)JeZb9Ss6dpWIj|;)KPdUtvA{5=ZG1Mnu^Uyn@qthRYSkNsCOxN6mnq03gC% zQN+dc%W!2@{a3d8?``};U;s?xpqAXSXqZG@z&QgMR%9H&NF9EvgUpS<70gwQI z8zI&Wq}Qut0ZD)uL1iB*1*O0Y7|9i#hFH>NgRZM-Vx55ZI?zy7%^}8!0b^WtW^a0G zDuWlleQM=YcGkLsY4}ba=TFXu&-6cW<$wDsz#ItwRM`OFd6Xxg$pp%s1vsks`oz9N z951|B5=qD>*=b^{K_;$X`HMyU3mH9EZ2H;n{_NNd;$m?rG%(&s?E=X3M<;_fDrAU2 zZ1E4I%#W}qWp@B}1?&cl%K7tk=#A^xUp=w_Rs5eTNsTN%5eccdI9W59ssG%Q`%1-X2q8io=S%wB zpNXQsP--b9jhyGdHZYq4^GH(Q--mY<6|@^ai6&gZS*wq!k0V@Vtj4S00!h%NXV!fe z_p=e9G>QlVI>4^-s?Oxgv*lGUn3qHR<3@{SCE>}3z%e?6INw1wg)rk0VS!5A3)nAq zTp$g{{D-fBI{CrmZ*~8_7WwQ4GqTBAselCsaz8wkO!|`fI(B9Ko;$PVSgQUt)9VW8 zY;V|D(~UbJH})?M-d_$&LX2-MoxYHSz`n!fUBw`D0m>|pjsM?6yhn@${I??@P>6z) zd)$(Ohe{KWERP5=8PHSJ!w^h?QR{#W0o@-nnAqc#R5m8dbcu?`0Zgx3fuCdFNTd4Pt>nHf zIHwQ7vj^c^R%f!r5m=%AX}$JPh9aqohi%cwSGqva2k4l+K2;=zen=Rj1~~Xsqhjw$ zfL=OcjRh&$&hv@{)NO-WXBdnwQsXHH(?2^ezPWS#_XZq=VbZ|tCnV4!3)!5ko8+>x zddV7TtkTQagdbaF#f0aPy%~R%Fw)i%{$^S?Sp%wy7#tRc3<(M;xDPzGFt=?dsk2&( zH!+ruJk<-^FQ%m>XLCZSS{18GD{P#-7C~)aHs(ys6jVvqzUgHAz8Kd2?d>HIkZGFB z2TcD815&MLdn+BK*go+&ZAa(nl*`M_%ZtrWw=1q;$V9%i*N5O{$6}0r5)CGG{<<7N zrzis^HPZI4(RcX6YE82L*W%g5kpq|br|{6$D;U@nyd|%+5U(bYmv^ju(h+a zw2AP4O-9~<3q*0aOCdjKnVMwDV{S7$vL>eT3DokKmka6Jf2Tqipy1Q8Spdxm_Sr%cw}-J{(D%}EuyiG49xhqtm`H{zbh;YZ%d^-euBc|>woleBAeo|mY2e@)d z%xO5-0uKPRle0%_dMyT42yDSDO<5=XYO%p+XOJLamst%B)xI5b>-V5#j_psLBvGLmWi>`9EoR!h)ndo6@ zOG^g!G*-oEq5-q^J(t#wM8DR~!XTAzKQp;vA~lk@GIO<^VwLqO)s?jiUnuK(pgF{B zN;!1V98Nv&;zW#4B`S#zI4jMNY{Je~_a|2+7&C_&zxHSi425*vB&V(VY((ty3Mk=Z zph&TO!pL31W?Z>)*L}+?Wlqjbj3IAL0E34nz@R1&*vZ2~r=Yl4IMK>cnnMt7=wIW1 zLW?okPtsinh}<{-6B1Q2LgU#At`JR)9cg9RERqHmCKN64*Hw~E8x(3p+k6Y|8k%l7 zAi_Me@K=m0mN4biTLf5jXy^Lu=frJ$l!vbCl{gfM!f|#T#AgMfT@f zMb_Ofz!rgzNeeHD$tTpg6+OQ;&G>ZO$=Dz~dBgI`8n4pPAu{Y%pvUd9S&D5h zHDDy>DCfF*6nx`q;wVr^TR=#`@G+@P!40=+{|4$Pz)bW1ix%v_!|r_qkZs-qKsKnL zGAwK=D<~<`Ek8Y`vCgEM;C^5EOMAu zE1I8UpJXlDd}bH&yK+Ih{QaiM2m_0C(*=|O^=&d{p=aDF&Km3)kSk)8M(4Sj#b?r^ z7$@Qo9~>v5rww_bAic}91|}t3vj_6+TOB*C#@TwCsDhLx){`#=YGST?a6rPMk^Bf$ zC%)6hY!6J~qB52b2&UmNkm!pD#Uqk{FaVv=F!_OPXKVBD({~clxo}jDbhW*7?#q~) zH4$Z0SCo2@8u}$!zN$iCmmJrt88=$DyC`eFes*)n1F% z0XX5e8he2iWanJXLsd@imqi-?f)+rbUtMnyu3TpM-#fttLR#6_2wuUMFE-y19!d!h zcv=w(Sz!F0C!L{~#6}XT^MGAFFS6V0ebjo@VaHDmUCx-=wMqL?GGWN$^1~e~I$zQE z%X*{L`%++|PIa*Rz-WjrJk|c0o-cfKLOt_Uyfim znZ7pyF~}_4#IP@(A*kBXA!hA!kNd3F$kO^#{6 z=fV7oxena$T_-(`ssp_zr(8AKTy-b-l_w_&3uCml9qx5{2fwS{_Kbc^End)ZZVYtE zfgs~vg?f=+OUVIWgLnSVTK~meqOuvGbpPl-pihzWCyu&@WbV)0tFO>qYaxYu)ex1` z;EgJ)R2yqiiHK{Z-%J@F6?N+D>CCs2*!Y?-#U3+xL_g}*U24BE6=X6wY-2ySqgG^x zZRd0B`D6hSer*}Ay|6OoN-gjXIpAd|xIr=QA8ZYu-MTx@HzrvhDz9p?vp34O96O&F zHBl4=7{R#R61Zr+anip3qH_Vmo*&hTLibo)nrO89RdGl23)zHIC_hy*?bcyTbLbuX zF~KjxBO3%Ue||4l>ra@|ewBSeV*t`D@ijT&ANur9P)0AeEG_K)4{4kp0E+^QSdARZ z^P(+;`NiNehA&&DMKOtmBsys|BiFWO#p`#~1=RjnX%lGMJ$0BaUmxerOm+{YbL+_B zGd$3x9-5k+nd)b@ME2H8V$xLf!P)P{u|u9-dmsT#d~y&A;Jl${1${ntK#SGLQ#5o8 z($Y~8So!hYiDKL{_K~Ds1UCsKf-#dzpKVRZ+P=WHHObv}jGbeZt8$KpU=?RaS*KLU zsfQyD?skE@O1Q-6{m;=|)p7opfcWEzZm;zo|3^c!4G$%DfeooUUi~XaOSF}0F`jvW z7hX!!-NEkV%?S6A2}X^Y!^?2?>C9 z{T`5Y-TTcZ77FQbe>d(mfn&4Pm)aAD$1!1$MF7Wd7{wDbCB--2@_+j55^RB4&~+1K zJ-iTCR!3=VaxC{u)=Ga|7h|N-xA*&9dvpi9d4?#m=yWMsKt>wtZHNg!JLIUsqBrZo zx&um{SIF^)oVz-_D^BG)kV67;zCX)b^n)?|Q>8^a%Pr%HimeY_UEAD78kpTJUc(a( z@a$le{nCvpP)gNK#?6kQ%~R1)_v0x0jg27VV>B7xZmb_hh(#D~X&&AnZHZLb{ESJ{ z;08Yt{;@h#p1+5ko^Gg2bHL+w)&42)w!S!e0w+&U_@bV*&M14;mxuz<5|%uJ1M;&0 zrb5`OYKMVs3lp7JiM6U`6_?i?*KSnNAw}KRZrGoo9qo6DO!$Nkd#?SEo`A6!PW>&r z10>x45jz0gC|=ON2N@IqyLf+vJ6|6us{I_Z3sQy*xtLD64ei_i4B3oPc<)@N`>8vm z$JKT;p5J&Ux00_ULoal7NZ)n;H+PN0>QGw#9<2z^dqH6i;U1jWw0pFJ(X_$1Ev3u& zhJ&#a#a?XLk(o-7@)WF#f-V^2Orm*KIa#-WlF~AHRjZA&LJE_PU~rFN^Vfl1c!(Kd z%>cwWxx}esygycI--t=)V;*@C)+yGCf{GzDR z3u<3>PGjb~7@J^QSv15~!P`7towvID`KNn1g#)@t#7yWaol*SwEd&9u|YaFz?^xnGQ| zWF=?o_{ZM`vkiR(1P6gMhMwltP%ZzBdyF~ma{^kfW0s?}ZppfzewNy|3ktU_j?~E> z=za)EEVjx|{It`)0j~GTG3!mja9~G?Up_t@vF(rOp~_uJ8QwNZcTub=QM%7cVY)E(-NnIpYP+?4$I)tG z0z_3|QDBx-+}$9mIni+YXDpGb@!(1!Us0iqrL17bmkd|x*Wzz1Y3vWDoqueI;24EI z%BC-h%l#C(cm6r+m3m#83Cv%~S8991bf zaBl#Tt&2pD`N_p&cCZbC@(r+!5Ph9Szi;^8dFjbED%^nqm~p;6thk^P)0Iezis!%X z0+fE__3iH|8s8r2VLSljG!4`cmRgl1ck)7|FTQdye3D&kPb;b%3Z8v9YIh)1xv=Wg zF1UH@rR&n^QqtHwMu{azE);?VuH?*ME{1PGE6l$-12hV z$SV0-N(M8^`uS`Q=(I{_IYtXN`6@5m8NSgz+j6p>0k*8gp*IHH${CIx=CzHZ!$Dv5 z@<<5V%}AI@1~gF3Ky5fVUas0(G+;zID?e*iIpE;-;cwwf5b(l9d;L;!h^npdbD zdCx-#q(vmel7VwSZD!)Tvj0d3tZ|b_HM8w(p0Xp0UD?UY_ITCN{tTmPd~oL16L0&w zIg5O7s650z1yxo!MFi(ceh+NZHEQJA@M2ot+;`(+AhyeellxGRXNcI%$3M3i{)Ynx zED8{>AY^I2exS*fL<20t2f!IY_oX3H9Ae#q#$wC)BpMtF<;dOQYXTqdq;bp?5g&RT z^|8rZ1`We3m^9SomUP;W?OFp2FUFklvDvg3LBSzWxqt?WRr*A>`h>NLc0j^wVRyGs z;Xuz3p?f%0=co!5PImg-C4TWd>ph6M<^;5!QSq*Cu+G!7yyq4^^uCuNqrZsY@1GTT zj)`~$g`2sO1Xd752eLpwukGe#zrGG4-zzOOv~*7Jfst{hAv03-{D+6zW@eivSS6t2 zzj*l^HVW-0<{}ps2GrXzs?nlW5Rrsf0h?%8a59Gy$R%IPh{93RNP)8oBV}Y)qtNrmUY3#5TNgptXGI&IfY%)ub zxz>xI;>VrEJuiL0<*zP9t-KqEiKGIAl%I0Fl*c2v)LtQxT6r!Vkeh0`>jUpQ0Sq_W zSqZHRdVc)wD?1K|PDUV${-OKnLAQ#HOpPJJ82Z`qakBLJ#6mK&wP$M@`*3F33ih6avUFv1w7OaN$i&kQ zqG(Upwa;!|%bFrt^{j)xFdJTUGr-nFgRLOBO2Rh7Ps@d%ofYI3*6*WEUMrCg-o}8{ zM6Tk>q8+xpKB0_od`DM(@9o%ucTyydNy3eRth}W5Yylj77ZZTatr_Y;*T`fmzNDqNW(#Mg4HEXktwaA z1`-aA-vvUGD}nP!7t-AA_&*$+WATpsE~~m3BXsOw3`W3Ab6bz zj7I)S+=vc+1j;DBCe;5Xl$@c!v;VtHKn)2Mw;qQ=G{*;RG|b|A#FUEs^3}kq!gt!= zo1K*blH&|~geo_?jr#ml@>#0b!kY)5K1KjTAC_A^r#@jTq&(~As3qKGwZ7}(-syke zjDrWV1x%C-i?fpWNSi++Sm@B}6S;J1GhF z2Indf1l-mPB3~N_ajf_BPFVeF0rc=FDRq7w|r%&nX|I7j?!Zjx0Z4n5 zX+P@JO=iCxvKbx%Bw1&XG3`HqP{2;fXOEUg5ufZnSCju>B`(!Y+&nR9Hjjsw?mX@t%Wh#LioZtoR)OAA%)ZQ8%FsUmg>a}@}3 zAexv4dvXKvXb0&4(kL1U^u!_VIf2}z$GHiQ0d&Ky7ck+lsq^$+uQZdb0&U@aM<7D9 z|NZ@uZO2+LxV0^ojUwIg?7oF}z^|njS3VR-Nr=5+9~7iC&xPa;HD<4L9zc^!1=YhR zFEKEJw|C$2#pW?b_F-R`(c*ECKUk4ybfW+8Fr$iv=u)CJOY>H1SpFNv`xkxz-{-Ds z1Dg8^c!Hj8Y)rb3QGNVsU09^Y8Pol!r7;T>0|XU2>>z(Dcj6WoJ8~eJo2erDUZY>A z(lsmDJ4F_Dly8Q2706~^l3_n>X4k3)JR}Uj72d(Mn7yms(v8jit(Y2y^P||LlM)O( zIRlj?-XcmNZ#)F199OB-v(-bqxX$!SE!F5>%~I64koWo&fJQWd`7l0mCy^r!PAzz| z&PidLx8@8djzS%r>E^cwl)m_@SmWuE{0y`4)m3CD+ny>6Ic#%l1k5>GFM?zLrrUWf-R4SCC`c9bz*@DEDzaSKl#8vEq6O ztVn;K4h$6@8C~mnBHSzqo{8*>7#E49n;d2;6?A-~Gs1Dj47(^OM=McnLz9ep;b# zJM;0|-s+I_$pMxb&)z7`!~OK-re4kBj|nf7Y`z|*N?)Adp<$sg1$mJDW+%APiAI7^ zf+_bn-eI5WkpIs9A!tYg_eYK?bu(Yon?1g~)HquT9a`GNcv_ltREE0$O=^~=P?#Yx5j2munW%EiZPZ9V2UG`LeyGTmO(ObqiW2 zEVwu4Vr`Z-g?BRf{gnFT8R3`+DEhGbkT=kODizPnYz!Ei1%IPO z6LTKQWpa}2*AtJAYmYnNCA(UfTSm(BFSlXTtQODkVmdz`R;zr}b*Zr)cau=oE!5U- zQTq0|5_c%YP}<~Io3`19VUZ^q!v)c_lT2x%EFy9vydNWiTi%WwP+HJKxs7C%qIuIY zJ7Np@jemdB;xjywY5}okBAbKp#zGw5`<=US;wD912@oyQMu^k!(>MVj zcI&F~$y`VZ39LL3w}7mAqSo6%q9~)_lEzVKXb7E{F??@hKs9uARN8fa^-s3Yc$ieF zB7xR(Kkb0eHX)>my};VPXGL?5a5f8slKf$gY#fGv$Pr*J8bJgXyQ?4pvxSvK^lPQc zGFRh`U%IC}3oA_ad;MN=%;XJ~vt)e6nl*G{CBs_t&bYI`~7Q}xJM@2OrVn& zU*>2(I6GPVE?o@pt+IkFU}TyVNqOHxYt31wW9~o&4_LgjaQP@ZC`wrq2rjx zS>B@EzwIbfF7u<;6(Qi!%6d=;{aN_q{dM^+Sybv$xq>c#$YDEMc`!-q?9;^FPmD)W z5Td@Vz+Dl)m=D`y6_m4db4|x%L^tMs3jJw z0Jyq#mpJ*X8Xjb|5BYs&_HX}k0q^X-_PhgX!|v`sl84O9`0IqESFYcDvf3lAd&mu^y}# zxVlfC=pzU+nDo+}#P@B|b{gn=)*CmU@#`7}ye6*sd1($WF^v@Y$NLLrXwA9N_tebS z)TCGTD_P~|flE+}1@YlMpOtNz9%przhLm=%zZn>0VW!bBF^8tnA%d*zxKK=vrF^-m zT=q6-)V1GF?qO2vj@y{S-d@JTetN-NmHx%40-4X@XPB>muSUs~)N!LL`K9H%RaTB= zyWZ2cI~>^8lMxz3K{MkU!9WYKDQWvx3m@@EFzR62DBj`aZEx^ ze_r(WSS_UPs}z7*8P{Vmfk$?r<^UrX?h5=3pC0C0tQ%@>nlgzMtSy0V4PcQNawJ3IZ{3mTr&lu$R%b03`CVaF}|K}IWG}wnfoz&9`>J+apao zyQnLdT{b@OS@lT8@t)t0ag(U$oHp9jnqywth@&decQK-Z9-B5B#$Pbkb zFm-%RazQL!Y!lka3udSO`P3^4#DRyq^OsB+abyHZ-kR$FjW+|jA+k)@i-QsrR8T$D zv`FC58e>t38D{GXo;ak&KrG?~g5wwkyYuW}TwGp|lE6L7Zt-D(T;}@%axr9A{X2WS zx2R4Yue^VDvXVB0i^W-*qmwoEgC$C(G9lD~s!|q6<*)VxwFXQZNHc6}O1%nWCtc9& znJ*tab3JNys?P?5v;%qE1Z{pcE7qy}{>2!)4%52C?Rr&xY*14t{Mt$=~0rPg`kfg`@x>W0TH%Jb_2K6}QOT>Q496JOf zQsTib*S0dkq%X-vT0NFPkP0s+h_Zwj5^wQ~JrhzozCeY6;8sAt8D9MGu4)OZkA|pv`p2=uZ>qA;|Jg8@ChLMHp`6v5~@rl zh?ibkE6)-JVs7n9VhW<7XAYuVni{Pv=}B<+?n0El&FG3{1X>V=okDp zyF8t4b-^K{vCV>!3qBV%2lMT|4vtNV>6uIo_jFW(F(dq{J2oN&<@*$_iSi}-D zfq>8CtS?N`q4qZB>hs8HmT><^lUuiRz#3U=5Z!Wf6(+>N z?N*=NU`L$k0?&O8)p^=ABeCBKHaH~#7w^ROfG5t*vspo7s&WDIP3YC1*XJpg@AYc# zPc?x*&k{4gHKZohPE_Tb`Mi(w5VsGfy@0$?9A~Z%CH1#HbX~ggS zFM_8F)?ZR?k2TePsNJeus`Lr@vgqZkd9yXNcS!n9GR5E{R-}X2+F%<0JCx5-5`CPO zR*Vk!bQHsI)*gMR zHIx?t!onx~x!Q9!;nk~O7UECE%746i`86B)?A?K5u1-q}fw8@%Cd(Eb4I(PA--H^W z8Bv=`WMR7*^)=qLott;WR5IxXY}5}-*_DN}Hkd%}KKQk$bp~XOGV~JV2oOg2*W5u~ z9b>u>vgudAa{khXpT##j4OAJc?|G4fg~$E<(;eQuL@zC+k3X$)Qy)op^H4*ZQl&fC zD??f`yCAJLQES;Pl(ZKeb|XGMu%n9-H2V%cbE!^;G(=duO^*qYAl^c<5`l|3mL!$} zqHy4Yu94!o`lE>yD-b|4e1lX~4*w?4+lMlS*PnU{oKdV*fCsk3L-7tPq}X!_(nt;h zT=yQo9bg!?t1%S4Z?1WB-B66`s4@vgDUyOg^41pC`d3?q<5{QOvn)jUCuJ|ksY8CE z3!L^wKAzv8U%q*m_KZTXj(*r@64@u+nn$Ov=jCBs7~L8;f_33=a!{9OI2CDkwrmkonzSI%Gva)#r{{Y z`OO37laSrdMnBQN)Wt}Muy<~*Ow>L`4s8AYI5EF8rc<7Zdf#!=^MvGhCdTve&8ds< z#9BLP{Lq`@w??wjPu65cMn)bXph}pb(TCDL2uh6O{=sPDZ8D{$B#VuLg0){MmE^76 z_xXh0O&!MCtRYd^uU_srAQ|(Ub&El7K-5tu4V{>$9~H)^HsnWE*DwG^2q@`>uTBZF zSs~!w_Re{O3Nr3_0*=G-mj(fq%iSWpCf51wCe+E3@YL-`I^Vu$WKH^~nov>6nHrY$ zN9w`|eQqS;{b)M9=Ae(;+~B6n1bR~afEy&G7p{5}j#^@SoB0Q74o`s>kCGb-RJN*{ ziz$+tyP>AXZ9nJ|;-ixMWU%`BG5xz#CQB{Fd@k7R;KVV3P7S1+tE4NdS-KTWO4}75 zS(c9QW4?ofeRY=*Xdszy&ARfJjsCF0>XoZ6_}>qP0@J|rMw7ruzNSt{NXS|wGxW9g zZ`{+*k~f;}!(SMFQ-}SG&0>nyR0-kfUd-qfxS=sdPimDLWYlPOV%?ZCp0pI+HxX^U%dn~bw4W#syp zbTTa1ezy%<>4P)Xr$Qz?y!kxr-dba56Z=K$@$jZLiQ3AsDvytcd3$+_xN#@ z@jkfOKI*MV;CZ&$qk7Jsbg8Fgg%6Pmp|3OmZc4Nf`NM6mg0#D*t&)9Yv9x@u5WZ29 zeExaD{V3ErvF5?Kv=1d_NX8Obl{u-aBSzWh=p@*2B)2*6$+m{FXGr*?oP$-&{!7~X z)bQ{?Tr4OKevqV>m4gcZo@m|P*%rPd<=cU3KU&!3b36$%p6#fE?^9i*B~~Af6rHSk zersQ=i@JyuhaXgGAS*sd6tUAhOskL}&e>JeAsbGx{a`B@Z8mIde^C;w7*DiU@B6%~ zHmG|W7h`hQxSju)dVIq8J%{SrCLh=@R>n!-&0keuTm=KpB=D{SC(uq1J^>U2PBkpWvHG>sZ_s=cu?EUlu~ZjG=7$a>ZVv}aZ{a^Ar)~5j!#1i{ z7j%ebJS1t}jdWtrOIf0_T_foCe)8CtgciUl0r4zWXO0_wut0yi?S*e75Ax;$HSU*J zuxw6L8c9Px*sSp@d=^77ls^EBK#1#llUq&MK4g20(zR~IF=fplt}OiqO98?yZ?>jv z5hQ)@ORA@>bKYSlCv}z^tPe(#dlgsoio9%gtK#pFcPCnFQbrfR||o%+9ly!s~<6qMR%|a z)O-}m4h#qgt45Ni7X8JRI{-Iz;Z6YVRPN4+X^B>{O`f+RYt!YmMU#AGb?ky3@SQJ> zt+?EIFh)#h&7#@1?0<;kw59BmsXZ-M7iaWV-r{zn#`vRROG(SnI*v#)&j;*O(=kJx zm+DL97g1gM#|*|7qn?lWM=tz=tuG2m6Hl0_pB~F%M0OJ2!VnQ@rO*g1y(em%i+lo8 zEF=m(MI{0c6jT-XghRJ>*{~qGi1?)!#mU!n1Re-;kNexCF%n;wz3%H~WdFs%EU1-k zEu7pTc=FsG4@dwRwDd?x4yf>1h#T@W@RPzfngc1uXOmCP>~UlC)`%zU z7%B`D#CK^`YC7-1vBj$5yWVaiO}&#Zm{O<4`&*z+`jV~sb*sC?WFI`BM;VMZ;*6lN z9Vs+I0}Jk3@!5aecJg3d8Qkr~5MX#W#etL5>&?UOHeqhdO? zDyWTO)J@jUq9;D>*H)iT1?&t=UrM_ypHD~9mg`3xFH&Im`&dJ4I5AU0m1Gg8x88{H zm@|P=5~Uyu4nD#(PX`#C2TPsG;{&w{zui@nvsf?qb_k8yh!l@n)VW0DP9NdLRUgq} zg)g0QFC-vBQ&AfOn+k_nH`A8~xzjg)=ck(;1Yn+?d4DVEQqWUNc>BGr%OIaxw8hxe zQYtz##>DW>R5m}K-KVz?GV+ff$=D09>e$;CbHw8P0A>cj6>e8j@$&k{SSqN*+yEwq zt&2^nJjJfw*3&m*9lLIGg-coN&gQrnvRK}Aa~7{(O1Gcd$f2 zUdA2hJC+KxHA7gP>sRUQC4CqL?cbKBW4$#no* zJXj@u&LrQYQL`pH-fHXda0>uO29(2L6-;dGj1h6ITyw{@--RiKW#FSEf|h*UyIQlJ zeDg#8yj!D-clkXJ#^Jt~Qs`z$v_JZbA8fy+M>aN`Q}0ezV%|km8xco6Z<+l zbF}ZfSA4 z+%B?rV*El6dTCjH%G?0Id85l2z9DF# znYRFU-D41I9V>`+Dk?PO(AaMKCemt^;LV7e%u5=U^rAu)2)euC86PKwkwX!r>WRWY z=Mq{6J|C${iJtvcWbg1$boqy$y_bWRqjQ)GdG+co*Bkkb87T59r2uek*#?T$kGbm@ zcyv8#HQUl#=ql#COL;#)3cWN8$qITa#zv@S+R}3J(Sj}>F2vtMW@FpFcqk4(yqM!& zoUA)zcezMD57fQvX6PjF+}GF<7kA~j?7cj_Y_9|C!AT1ZQ+gnFPKhDw=9Y)*1ick{ z{#^>f!Hguq$1*A@&G}bl7%M~0@t~iMwq_%DR8#K>CdB^toFF+Q3Mlf|4`h$guw`+?#Qk*90(;7HO?pUf)SgSb zTvF9VC!e2$E#@(}GcK3gw)L%)_`#Ic^C&S`$FcXdho6nyF+)>^snOmL-`WR*j`#aU zgKNBCLux-GVj>@JPHnRS)@%E6 zy2A#m>nszWx%skn?-av(TvkFl9X^H<%v!r2(^Jb!O^pZ-ETq;-(20y1RWp+2?p&Ct zhLIg8$k>z`FE74S|Co_?{Yz!YHOSe`e2C(pO@DmPM-uFe41wH;aSo68XV@NaAAuX` zE+;H9cnOj-%PEW=d8ulY`OPWeLsu|p*C{C`q3*=}cw7I{?0BZ`jLK#6{lyE9?YeV@ z9q!9DAZK@qlkL{?lrQQoEb*^bRs*nvVB*R9`6*sFZZaBhz|9_99!&!0Z}4y3pYdN)N9ch9|G{f+M&$5Y_S>`RtI`iW+KurB!+ zXStEL(~SG2j+B^&p4P)RTB@AsYWIo?&>T5bWeYnF-0fDIXL24pozrc-p1V40@=mim z#e7eNn4#`9LKCIMnd6~O2V(*w*Q-~?;&rUUZ+LO~R)37O!ZAcKn@$96Ii}S zsVNr|9$rYcx<%ZOL%w{i9r(w*AXpoAiAsL%*@+bz$UiX99np+CotVx+g^#h*&I?m_v zJAjLCg1&zGy(c%Qoz42<>*^B{Y_#yO@%o&}D0=t%#OX!VIA9(ys{Dy>^ArwccF(1) zio4}Aqrydb4OdsbQQp;*Fqw^}B*Ee=p75H+ui^MH7vz>yydvHSLS}sEb8U6hKa<9y zcUUnMXQ2xvi0GmY%l6Lhs9a`QWdc)#EH9;B{q z_v@egRd2CgDsr9gEb|@jblRUF7}|ElPyHsG*8=#;D<3fj^$ zVheL0Va!{8nvxtTD0C8HuSr2}z;68}rNX!$FUD}tNdgYOoS}8OTSfNjZ~E|_n>*LL zwW#j)xTMC6_^dHDX*tbH#&E&89vh4PhAT_Lr5-MP@nJ<=%hqH{^_YK^`;M&89_`X( za_?JZk_)QDMqKn^Jao>M;@~KV_u5F-(uL0)kwZwi-Sd)nH#f{ANn~f}`>s(zlIA>r zC3#8t!UFwZTipinTD0%|jbyh;Nl1+O=~D zxd!@Oo&>W&fDW|ljk7?N%VVM($eg_VayWS^s!f(aPS`k!meBF%PDCTC3^NUcHQf!1 zf+d~0Ta2GY3G_}!7M01c{Rov)mJeT85@YrQ%OZJ%rHO-bkhvbuSJ5NsAAdixi2Wp~ z&0;IJ_6v-S(~ar(dlaW9DAX`l;0L4GAXY&)1oDngN9^#mbGMz7BUN7o*l7UK$9mpy z0`NQJK@r33uSjJ3BCo)aYoF=0zGpru*`d6dQ?Wq#;JAqwtWADoQ2b$ct8BW<@YDRw zr|kI`1LDz67r#{&D?N7t>^Eu-k-L~j)K$BQi7w}Hdep2ZC+LI@xjG%vKn6&kOD9+Ap zAb@*1`}N9$i%O!MSsDU;0h+?;PPl_Du#;O}@C`d@NVl;68g3-a83V1f{~3zyfBHIY za$0oqw4a#od8a(pTCGznK6gq`bTI~S)w?}EJLIWK?0lzp@eaR8L4HAT^fv(R0j``H zKa$WxvQlE;_k=QW!0`jr{8tV=|Cq5ddco`J@KHZX;N)v*-?K=tLS-mzxx-Z*@d7{Q zXGe?g7rLE1--%&yuqXZmfDuSQf^Wof;9?pgQKea0mhh2oJS;qnT+cDQH`41JicdLhqadJzp4t7}f(rP?Xz@SZDgTW$F&MaSm zEF^Z@{LM)ZBD#3mQz7Ymk=uAJlcCM;(DMPm(`Lt>0(U2dguDGL%FM*vMf${y5;=e5 z`%SQ1UJI%IHT#LRxs|)kbF>aHY`11W3OzS>M+$w55o&6hQ7WlQ4(tl~3D7qT>=RuH z{h4wjgixU#kMyP;XE6${9QmI8hpJp=OD+SF#Il+Gu5qBcU{9X5te?K-gZKzg(R$3g z&pFSfi&EBQ6TGSn6ASHMSHhLVn~u^9@Vu@YMfm5;YD+pwO87=aMcEj-b(8rOl8(O< zMHsXaa}Ir+Cz5px!_9|mm)#1 z{r&&{$NTZP_u_hwb6)E_U(eU;%uL38lDUKt_4*QA*6Qyz!F|&yr+^3H^js`hG)aV| zUMEUw#z+ITeG!GS_a{fxe;LVRV}O1FfXc@m+aao7!W zf&0f+L^E40@j{<%zKggSz6+&iktEdFKQlu?Isv3Hqp(FDZkJz?t@$IH*V4mWt<9wL z>P$&q(+G4dYFp+Y;9$ouwdpX(p*f(r&+@@D19;1+lB!BYgK{`}T|Zp7SlB`Rg8`&) zPB7f+hJ`}r#zy>O-~&#Fg(ocTz3Vh$F8cOM(`4|H0?m6( z%}=K{#KoQF{Bu8kH2j#C7r&3JHR@_m9UELgi;If3w>*A&SwLWnM?ymB^XJctPoGgZ zh|6LCzL6!`(9=EoPztYgyQ?U@kTgCcl3T=n{*p>ZGn5w5(xT?|W{f|nNO9V(NR|3e z1h}}QNI8peb>pf_%>u&_)cKVcGTExG%nL|zI_dE@HwIH;M^ajh%|?W z&C{v3{MgqdP5Y4iweGj- z6wbUTSGQ~as68L%KuY%H7Qo97PN>Y(WDQa(j)lA9xAV3jz?8WL7Zce8x%GSr-T0Xj74l(^o~kJ@2tpg@F7 z$}{^QO$rndu?z^kd%9IDOE#5=lxcKgQewoW*38t#^kw(m(Rn(ooI}MX(E!Fp>lWuD zK6GfIh>FUi@&F{PRaHGZBjGVxdJSDl__VaB#1%nlw$@lcex5C2DV@N2c|IBgY@k3W zLV4sv_l9Zo)ypIkRYL%kb&g zWxlIej?_Lc!MRD4cwNj>N4IS_rZrUb*TTU1=TF7=^U5sAW+8KQbabs?n}xmJ2bKDe zU+g}hc`gL=R_V*aaU(skLm8&`AsOz%bm?y-9jor9ixZ-0SC#w%@vM;wnP+-eQKmYF z2_Gov<6nQaY-$>nE|mG;!Fui;Qw-PJ@BGU`H=ea``z`tYm0KU!;<+DE*m6l@e_013Le z70Yk@c?AL_u70LndOw#o#)3Kd!CT|xt4ix(TH!@*?8)?LS+TG^&$bP7YOmqpH)QYC z=>?1m>O5(Wsw;{v_vM*Ht4xnOVK=mDQ{*Y{Oo$wG6O)*Sp7`HQEcThU8zo7Vb>5?4 z^*q;jdGo%Zo=UdikY>{N-C8Q^LYT6Ng5(sUjc=R2&Z({X>O-30g2UzZqmq2r(?L9a zfA(-{iTuG{ImySq1@QMsU5g?i=2x@9@hDp%2=-Q5NVXxe*}T26VGnrh?1 zM0T!iQp}7A<}twtRA%4HeI6htDqi}zYQio0ciE5b*?6?69DXv?9Cp{t_E1;e-yx2da#rFWt>Eo* zsI*GiPweIOvbQ(U)z!7MnDh@o9v%|)D)7rx*W8&7GvLZBpjiGyzMMK0n*9k>U1XUv zV>ytqC(B`euR7!Lp1_$z>9?yUQX{u{FKX%zap}CCF6-^Q_}a@4d;L1kB6Sot@F4qp z6;8zB&dk?0g%m8YflJattS$(5fpFirJb5-%rDEAYv8pnr?z@)z zA;%6Q72JBNYy^vHsc=g<7BrQ7dYH#N*DO0&iAsK4%(dQc zaQ(m|D(q!etWLBZqP|O+J4UCcw?7H#_x571q5VU1Mf+iIxlylU1u|UK@zVa&#c3yi zEV>jcD^`kAs=~0tomYxBBNor-XO&6w@Z5gKuX)jKkq_(K@`}>05-W-o@QZrCSa!zR zE-U6oHb|6fax3wAqS4NZ21=>1!A0A@zVUdr#r0Qj^Y*XP=gLyWdDnYyC4mJKr&>}WDz9Wa4yW~Q zGlmG&+}K#?s75d%)c!y}9K*Sr(Xwl2eVuy4!|B;;Y=7@|krFZx%Ms()WQb)~blZ z!nrrk=WI^RozyIlxt|qiOXy%-#JJC`u+G=2z4!zpqFnyOx^$O#$%^^bc^{hI7X_vp zisQ`whZzo5WL|!qFOR{WxnBwBQ})4Pa_$Ci((2+oNO1{v8M`lyq4LKCtltTxOoo*N zr+VJP7I_@MR(1FK%7wI>`}07E1pQo@rL_$2)JsFKNGTE&Ebt?pWbJn7x}k=~O7dm_ zOBGw8-!<|ADip;nA=#8A`uTCmafur5PX3zrWVix~y}(IDiJkK^?8e#U@8RgKy0fp< z6)GIhi$uV=^SHi58}0`+OznJq)hf3=Eg=)R?Y-yZz8|#Qv}xGh{I$imRY_0NB5x7H z6f7)iP?Kqra(UW=mz(=dwvAJ@h$zC-wH&$WYUqGT=U$ggPJNRy`Y_8b_suZ&eiK(- zHC+zhEVwsf7uQ zp}Ituezbb#H>khk+mQh0VkQEx2u(|JNVZK^Vg!(q-KAL z5Y?RSKTTPN-{8QbMb78RN}AsaYcpi2AVpqsGrN9^;pcd8(2bD}J-(ai?pYH}%9(<< z36i&{_iK()g!WJSc%C)!e(#V6WjW;-)V{)+s<3lB{iWStS;BvTkSil~R1&!=D~tz= z(!_CvjxVM!`E}=zn@=@T66$9ODxC9rMjI^5(7M-USBNx%CpBqv|EnkRR)y>-9?y+j1OxJbq?_z^j+^osE*YRBKTt z)!oWjnh$AGNxUW3`IdB&Bmg<@Nf*Pum^vwr#wRQ2d>RuwgDj(od1J}KHmvJf2l;NEAx7QmlXR(R#zE+?| zoBxcwxyRqM^TSU32`7;U_Ew33n7zuLewDWvHdI3%lCy49LdBQj?N(r|f zIi}NOj!;)?w_oXYu-bZt8C|Am1$htUe_{q=0zq;Z#Cg}l!bA4ifW z#5D?WyrV?Ja&wkJ+wG&J=0lokFQv_|>Mk?mMbhuXQueJ6)8btnL`I==Jt2CM0;}S$ zc>B-UxYd@{6{WT74vSjpDcm;iCp6_NrD-o4CsZr5S_6)B6zCH?B> zNeZG$SB~^h*{mU;ehf>Dl~bJ_?Yz(G4BMo`rZe2Mc$_I*;@Z4%@Ok*z(q%(oLe$bX zz2)ZbI90F$idaLu28iW*UVhKWFH}*v6~jhNt^6^*&xD@vg(JKyf(l&|A3t!s6ZZO! zzUrO!+had{2K4;8ZzMK37{}A-_TJOb>yhOB)yj#^o6i;AbhzDB!)?the$h)P))M(E z=2iYk#239PPD9r!&OTENuVG1k)AszkhTlM9uvnAopP$2=`N>erkNUl4uKzp>k)hOhPPVz=b}&2w0bbgZ!7KQL<2sd9|wd%2EHQ9-D8>|o6F+xkyt&+du^ zyU=7U4>(|iY;cH^5Kon$bQWk+>}pPgsi#hrKGTul<*!mgFJ2(%A{fE zBLE5;nRz5cMMMlmn2Ur<^v$5^5*5n}3!lXW?ta5CyM(&uWkZuay2@FRSu2NVCUm{) z83Z)w^_v%9f72y4BM1R*B}a&&5j5~(k%eDk?R`*}z@^U#PoOd8^vVlT&Q`z_M9(^Q zKA;p;b#9!7eyX!SPGdK|`f|FYGPNV{%BzOW4`zznWDp+$#!&}|sgG@=1ax*fu;TkU z2&?2=LFJ~cpI+kGI#U9=?za?CY8wPm8XM5Q82MW;zMe@PE;Fgekl7Z@hp!>$pF->) zwks)J8okL=z}zUf66`v*h^BaSbG)L9@=ET0EM0k%XMn@-vx3;NN9hsG*Ygj==GDY; zE|K!gHTFhtnf5|F6`jC97F`~mYxObovGFmKYY^QQPoIpVE7Ndfcz>`r!pT(d-uf4t|rpon3^m4@^pRrz57<}{9y>AshSj->$PB27evg` zA?5zg8JwmJXEHCbs{s`$sulKJN5J!0pz{h5jah`eRNq6tim?E?SB~3CIu5DS1y|5G zNLoFml#lby9WwWEqnr)sZQ3f%+?*a`tt-PKOlVKgxX%TK`>7mcx1sm=@Ll2`tHlpW zKWbDO2wTh1DY(b?I&x>jXpcdsUmm}%vwj@5?-CKwjC zQ|fQ?<)NYW1I1dXkGL${t>GIHuENWiBiZ8&A=kwDpGH<~S2rTSHTXM01UTo&H^EAX zt}h}jprGtEHx35F9&CKSf%ennnW>92y(Ac{#Jaw4OV6)Q1!Gvq3 z@(PD6m8|#y>cuksSQK5EPv3bCV;cpyTSR)D^<#&US8ZyBg4^FIs|2=3pKyS z^h~pic3UE^q3e;_kN7W~Q*Z9+$%#rn_&FX_#i8_89@Da5OE&X)eeF{F9n#R2Q=iC{ zM^;A^Q~dMGvi+3EpWaPq=k2PAdW|>c1@#=nH|Kr@K2evd>iJ?+xl21(Mo8JoR=6@p zSgDUv+iqHBXFxlVDV3u5-_;pc;wc9{NYbAN>@58J0m!rle3r@|35DY70v($uaKam^ z+b_r@*1f94j2hd*m|QKJ&#;qn%&;YCkk z)#~iK?b5DFy=^IxZ7(b$O*JnmeZKxH{%!matxtGDljd{;IT`MA*uw!qO+yjd zfV&vDoo9U%fEr%6#?5?dNqePA`J;OyuBDal2evMdJic#oJ@opgQZ6B0mCvPBm*$z9 zpU!QBBuNvsi)))Jr8IKtB-r(AtUvn5IkNVnBDvJO?)4eAD-KlI$8tW-D@n}_{vCHt zt7xncM%_w`&99Xgrzw{W<96#bXRMfADGNE#F#e+YfVX^IG^fqj9o00$#YHPLyQF1z zOzl{5O=lRHGhWncbF)V90N8Kvv2)*>0A#AyR(u8MqC4a+x0Mj3ww_A`0CxNlK#X&w z5KOU3KmAIkKUM8~d#a2B=RV2Z0BDk~&1?E@b17m|12Mwpj^0Yo?P8}cx&G9^vAIt+ z`bj@v(e?UnwHwPJ@vp{8y+?E(D6)$4oqOR+<&A11gH>XOJ!VBK-gGG4Nq7<_C`}D6 zcKIA|ISd6h+T+iM>6xnXG`M0QA1Y9{InGu*JfIOs3%M*qGF_Kl*|@wj&PcYC);@9Q zT~)g4ceo%RdPyIUv;(i(DtsKAS8Y*6#9~ks#MBxe3o70lBn%Ecuyn)81>Sz zuio)Zs&-KfYrmsxY5ehgYjgCg+~b%b7)RcX?oF#=ukZ?od-n$DLI@5Bx;I%;-wt6LfiKN#`x<@W{W$1>|N8*y(|Y*ceN^xXpxTQO#Sz9Su)=*rAn;c85@tkZk8#l)@6mIx zA7O4RYlvoz3M}6ssTSt!{BANe>_wvj6u^&}0c?e`r$TN44oHF@Wy1^Uxhd9dejgHi znkR!JnQUG-mCVH4ENhWUWvT3C%;VPOgI%v`44WwDkbT>iv7^bRfs!c4u)-apHfHa4 zu8Trfhm`f7bK)*3)O%K>T2vS8vzMrj$k-~-MoN1+?NQ+?M2HIItvK1~B%1+Lt_hV?5Cl2x-KmxKrKXe{h9=4l#tVPOFMYKi__M< z3Jht#*AI}*dQ%c$ee3kQFF8612^ZC~Tc&^Eao8Y~-W@^_@iLE&afWd|D0|S&)nq9t zT{ku|Y>#vR_V<8;WO>HxzP&Q(KJ6Vg3+Q*MS8VW@Sr3zyTMQuo6T}tp#t-RsIGyM) zH5o25N{g;PQ>Pf0nD|)z+zI41QY(i^>(S9-!CGGcEu$G6sIb9u3~3bkkf%&rStz^w z6eOlnH@HVo6Q)kY-u=uW!Lw}>P`QkT{C7Fk`Ze?*aQ~7zPqmz~i5^O<`+B?eJA;yA zAEaBjH=)r)1^bH|@?Q8X%{i7OQctjY5N;~W(J!gF~h?i3G7T>-K0hK z2$c(HM{+ZAc33)kFGp&0f51Wi5oZ}IVW;$VagcOr$mzuUI+B;sDpH7`kPkyWcUm92 zx`q=!_>kbSKFwF=c!Mx>iG~^vIE-)Iih01&8d0%e#NF5$>w7@h)YkT? zNBiyv4qlmdUrcu3L+hK)6SW+S1WAc0MJC9Og^diDXF!TuGoK+Jf1W-^x3i_?$TZr} zbgaOK!s3pFR;9LX^lj^V>B+MMEpi5Y9m&G6_wOIlbkshk&|&nvd%m57n7=UlqBJxP zPssx|z8a;s9Jfdp<0yq2ZXYJ3G6|Qk6VkQftp;TgNd8<<<;7-!`aA_d%sVi|j7O&z z*aBm%Qwaoj``g>6aArpJ{kn)C=!KKX0tyfpa8YLox;F zjiP7>D=@m+unS33;OBFr{h6+ahkIx1&ia@duxQuD>&iR5&a+zc)At^#F92!;b%D{e zK5ohPl2N}=z34pl32oLU;r`Oqmr>nWVtML9uS@5kUOt?j9pe~+;{PUvyRfMXL27^& zG-W~i58N5cE(ec5pe~&>*U9lz^KrKVl)5P&^@?b3kd`&RLIaZjI~`NILt% zna?FAUK}9ajfCdENq8w-h>TkdLOYn9D}y^GxR!bmZ$%>aPu|Z$oR5rs=$D;hfSWZeGPt&d7$S0lEHdq9eX8DZ{5LswG+-()7UqX$p7q8ib zB3uV-DcOUl04k#)DURFF&ya&}(0bj}=kKlG^>MUEJq}F)_B1#UNjmMwhoQxGN3}Wt zfGEkMd@(jd$HwWMa>h0f?Ay!BsvhT6I@#kq%D!ny^=#S>Fpcsb_R$N_g|PKNl&?3-!tFc zz+NTZeHR&J%;hewSZsCbDfZXQFBLht^r`x{`~vOM`9vQ)zgM*L^F(8Rywp}Qc$c1~ zGC0)Y)@k>>?1+O=M%rBDhK-3*CSL_Jb8-<}`o`n$vF1)}Y*EwGbe<#kGJV(10s2hz zaK+mjY%J4)ONSGI4=%nbs((e)pz)2No%$w8ydH?OvDS)u^CB}ZkiW@kv4ff~r|Ci+ zL!}o^MX~3Do`2UeQT#EPEY+z$QEG3mXULuKoJ81JYe!9?wj{W_ zraeB})hhe!a8QKo%hE_?dGd^%=s0>vNBb@03w?^bgxeCqGlDk+Mi#^M+X0_IU1uPM zM^aP0yz8Oi2KAx5j$UDC0jM65ZWyZ8*F*$$7)i$cREB;aQHMh!Zz>4OlA`sDJKS@MSp1FHXLMirb)I?KO@=d4G%PlBPfr|snol9&uOd7} z#!QHb(o5E!NcdVA{Al!heAnkP=O!C-XGM?Gdv>3KeX-}r#>3LEy#7D32L>XeQXP1+ zCpN9xqE_^1;(dZx*iG);D}#Lu*k+ZtE5~3y!X*eQBwDA)w-s}Q!74sq8piE+k-+Et z6<4=!#|amIkcEwN=cF$r#AZyQXDGd zrv{k34tIdz0krci2`-Wv%l!dR2JM+913Qz-=xDIX{rv?!n&auGA*W~Gnb<%c&t(-G ziUk3IRss7BTPkn%*NbG)K6GvgCB}6;-=H1Ov!ebp%vo_Z3>lb4qa=bjO8Xo@GBv2?M%i`n0|73qJKWXn7l zB7c^Oouy(HG7Gr&i^m_fLVV8|oTV$E7KgekmrP9;V8aj|U zjEdh`qv^nT`RsAchkU05bw>o9o zIO`p5pVWEWX++R{a)=qjPA6v#E#HH2U8f#Lz1Dj{ld`6r>Lua)r^rb`BH&b=S%d_o z>=V%*<1_!ME(Aq6OoO>)BaVya(vbGDtX*;OBKJ05OxKJk--r3x#fZ;yJo6%tq^2`` z;1zYA{G6P9gm7(d9fDzk{_&mwH%7*I-IW?YjV6Ji!rW01mvb=K`ib051SN+o|4r++aWuv6lck9me8<2-482 z5vRxU@$vtdE_1r^W}|L*{V8?&hZISN)#+zMD5t(^KS|^*h}E{KXRAkctptn^QonPW z$keIBI+Ye%1|dJrXP7)*h!^TzZwDn-d39&i`$8{IWhi{$1zkW{o_5xTQjD?G|7Re! zc>0fr6hU|AMcfp~fE*S%yMhYkv+?(gP(4wcS92xYmvV`n^-ZkzG#*?r_HnwgAac<{ zVnJl=&exwXXuG%%yhbd*5%P59bJwx)xKMyA=`7VmhDSu2|5c z%WEwe>@*9il0w(opM(}^;Jpb=^fMF%_MnOsw^H8z2*yet zv%+rtxu*0%Ad*vS>43i%^|?)6Q9x$B=oVbUvPNx zq%-UZ1JPRoxE^V8Ol-{5R4{e#I^_x_M?Q(uYtct3Y#;#!_Gx+Am2P!vFSrT1=kJZ@ zFa1400ieCy*~%Mp2~6*ba92k;G%)=_%$U&XpN*~<4y>~AhP(9* z93acwbw3v)Ri9B@$C}3Eavk10<%c_TV0`Go}Ao5Gl~=>#6_1ep00|Zf}n$- z3hax~LC|Qe&+G5}i9D64L#oMe8!dZkFN+n~cscW_Q+q9Id}894^p88&$gDZoArjBR zJgMx^w|{BjG1L%v3yQ)~ZIScUroJA>$Yevf79}41tW3|KztG;1+HUmr zZ+=gWW)_rB@A0*4^wFw+Ip*8>g4Z5p)_hsRns{rCyqYf-;hzA74nEiSPI; zLG~EcKk)tuG=Uid#tP?5wfMY{5|2|v0qoZrw}8SY)5Jx2*Lj<-msDJ0ZVbm1UaFtI z*JYkJ4|n1t>itDaH#l*YshD)L|<>5IjsY90+3vEF9h`pU4N}vK5kK%C99#| z3)(h8Wa^jzzV2q{bBLnbQCS&o;-mCD6lWqhZ&c~g6F8NTTKb44>@N_3*Oo;ckJn{h zoo8s}?~E(z4OvZ}**u%|;bR2CDQbg)qQ65=7W1n}gba73)yeT|3(TW6&TmDpRR;E9^htxAe<-cNC&vbW|YmBS?Z;;hK&=}cS$7GSI!5*2&tfAL2RE^-X_xN z`L2+EyeO#fB8qleXeMi_N3r>n zW$Onp(k%ScdqQ$r%v(y%{)RSOk%Vis+8?Fq*2D2^(^^E^EBseGL7Nne*$XV!r=s;t zJ`HiK&Q4FihdF(7&F4TftPA%g)|Dln(g^atsDA#OwuP^c_x2sC&?xx=9#Bt6 z#m}_k1XD3yk_T>yM6uLFgM_}A1WQo@DH3Gt3Xb8sVxDI_ywC7FGnU@+p{4Rez1YS5 zPi2faW|oMpDiiAk+gQ>su(h7rFKu+Og49=OVr%AID9SVCo%OZ-`Gl!Up59q%IZ8M1 zFH1OcUUG8}GP|O{v>VuHuL!GOs(vS1MEdk2|Jd zM5|m`E(U!eDrmKzs5sm7rzT89fCf z+S_GWlojudA0XK4*rCr1D`c5nC|8Bo0& zYRSUQq7PimO-=^}wG^`qrDXG?htyvx0L>x%>ud1u0jF>oMX|Oz_b7?b>$-P!NCGF7 z-rewjW>V@{>ye#~B4m#vE6q4FYPDih?!G>KBZ+83{)p+)8y7MKH#u#|aWtxqweZD_ zan+#1w0wMO5lGH?vt;`IvQZx&C&)91m(NQBXSzeA7RA5Hd)NH-dMU^UlP<3?u5~+a zvP7kSy30%`Q7PzP8r0BWtJv=?^nEMt31I=OAaAgccp2{YLk{w^(Hv^-4jUAqzTw|; zpV^j7HYmw;B}Kt%G2|05ifkF}E}c@1ysMThWdVY?>6r(}`$l1~4Hd1&q1rvYwn6K+ zniU!<@L-ti@5LnkRhbOu%hSU#qUHlo@ShyX^u5;hV*XJXpSjIgD&`=yKksFZe>7PZ zKV<75^Pwmp?;sz_*kjI9O;RG(Fexo!)(E;rEqmH-Jc*z?J#{6!zJBUQG%sDZ_3X#M zLV2c)Q14NUb2C17?>*u6#F!_|sowD4IPgP(6fQ$9Z&BGqp;EZ87@_14z7bAtC?h$(4(oA>Gw$@?Z-~j?i9;q-=ZxU6O&L?wSXE-NNyWBhcV#J$z9=#lj{I*0?Ex2 z4jF(I-UBw3df}nJTN4S+*S^{m#ZN~LAQEyksNuXuGDE=X*w}eGUkt+M1D6#%pj?L2 zrX`W4noIde0Up=H9H=d++yN9J6UXU*5Qsl;{5f0SqPKgaj z2tuCp!*|ZQKDkTRvd)B}P~>5+Xt?gy!@|ZUv`A@RUpBb+k{Dm9lACpuOvpTH!7&RQ z)+xNx`hBR}MwBqCe*sf2@j?(#B7%^kKMG3iS6L^|{iMn}Lu1vEo$KSW!)Edr;%G1c zOEqV#Q{<2p$PGPk5lfvTnE7bL!Y7cDO3%`(#I~BPL3aFhc{X&5=+M8r8T7YlFM1B~ zByrH8gwrDw{Ve~LuWq?o%(Cto?~K7g_`ZSZm|5OD9d5R!Xw0H=f*m4O1KQKNI2{tT z5zNWCQJO)0pmC!9Gh`{X1(arfaWf)5EW!_M3Eld$TuoFw6G07vp%_$9@2;`s_<31l zRrHbsm?$eWi0ohd=3A5CuvFN9#o*%9aWsA^dG5$6AzTYkZ2?X^MkV&m z&l6r>{6a?iU-6wvF6I8<8JWLyCM_o`tEg@tfi_`cPHg#_<36MXTEeoo5hF>Q6&pdz zil=T}1XCa~TOjD?PD_;cAYCVQ4ARigCHkq?r%}Bq1r-ATGeQ47jTs1B6sgCVcFOpF zHPs)5<20)pz!{h8%u@EjlB@WsdZhz^-1#(cD~U zCr&H=+)(;+H;JUPnD{ZVb*HmZ*7-V7tL&hX^UPQzZN{QV=CGXdiwKXDEC^zFwRvBm zUTxIL^Ni;R_jz6Ob9??(Wsct{F9g8G52lEn_$yRSH`3ieujgg<>GiMhkra@Tw)xf+ zv%1wYaF>!Y*Wr$ay)ZQ`#&oKnM*!JWMw7A9ei!IFiv4Wt{#0hFwMdaf>9XIja)Men zdy6=GbyIR4o67#;WyEFr2P!TvBW5SnX%SI*s4%K)RqJotA+L5VEiE-QHSf!@j81;} z{{8#1EW9645Whj|`#R_b1cxf$2Mu@rRgETcoRPp6tKFem<%7Q_5r_jzUI({N>DuOC)~}-*0IRixndFxG-}(kP&xqu&`!6sLwx>Xp4URwe z5lMr+T%O5ra<-A#tvF$E@!jOA#Z$9_#h}N>km`Sz3(<2u#+3zN$ndvqaeQ(b{HeeJ z9tRhP_EBpOt;5_@fXl3WuRHtqUbW%3a|*r_ItRDiQ_{GFR}d2XD?JmsOQr@syWTDn z8$`)wPb3B!;!wY&js>X;n9?1D*{p?p4mEdjt~=+~CA1hFN(H&ufoyMz0lX+pmdF6u zz&Y6XR*qx6$xwL751Xssh*s;gKPwcwO%Xp_Dy{DFSi+dgiOIaAE2jD3UYkVt>5%ZT zIWFy|k^Y*Wt+|4jjN*`euvxDIK;ePO(!!RxFeWN$U2RwK2gK7Tz#Q*vJ@2S8Gqn4ra zu^u8eI{I>~fN6|C^+6>5-2eKmzy1sV{+8>X8v(4oOZluS2-i{$I zn^=7GMrU=}A~Zl_-}&HE4Sw=(DwGy*7-D9UK%X6YZFsSKr%%5(L20FYVcHNU(`RBG z4H8h|td`D5ei>2QZ61X5*7VaNRwyhh8yGa%+}zwhjUyR9M-<_96uEzJ_R`%TMnYB> zlIS@qVX*m78mg@*b=XmF3at|F*ym8SJ1sGa1o&4LNR-wv`G|?H%3{{mp2}mqe5^cI zkN!L4K+RyG$$#_MJy54}R?)hvM(4*Xd%x2C%f4Y7fH?2&?p{rV6KuMGR#{4VVm|Zce{XmQG!{bg zqZQEg-oG0WOzr~F`77*^Bmf)9QcCu~R&EVG9=c^#5dbnzj*)_&>ZdsFv4bVv>yyGJ zKA&?c{}mWd08Fit^y{mts)AqNkpz2t|B;^9HdI@y5;Py*f9Na7nEDLC(9P}b#}w$U zIUswh4%PGpF;)or<*nc63!((=uC4+&NggiKsEFu`7JdpU1o7PID=9Jnefcf>DxiD9 zHf6v?ljnz^dtWuG{{0;hjS0K%oI0OACj@!}{tE1H1 z(UDO_ww2VsacT=NU}}rE`s0NgDov?c1dMI~idwcp;Y}d(&6JV5a+m@R6Yw*Teo)H3 zMK%FQ7Qj9Z*HLuRAU#W93`ui}LE4u<`;0xRV3dG!9>Mb02&(Yg&LmNDD6UQ_z7Y=V z>v90u7xPcou(r0&A_i?~+NpNW9HAX4@(W^(BuHI22OC>j-l)X#-|LP3j9PjvI*Lcx zhR$NS3;ur$&EK&Fu6g6R0D5R}FtQ<>E%OR`A5<^%p}RD6bsqC&x;~&rY*XHuaa~R*I3#*wI9eZ|> z?fJnqju8%Dq~|J6DD7#L6KfZ11llD1g5oqQJ^q8S0n_+f7vE8$op`Hw(9J)7MDpt8 zHG&<^5f4}tm=YQ^hfSo1gn=jJTYg1?L7rK65UFJ~u;W)`vKSz0OHw{qht*oXNCUw^5 ziQtdbZ0aUtAkyA6gWHyb9+txLy^g}uPNt_`)lXiUUd*F5aWub)e7s`6^V1cR#^?pm z3@FLTTb7RtebHa#>H|Ndu|w(vv8^1tNe0KTiO+~VyJ0`pyJptb+Ipb4EUkb5=!T-K z5|tv0Nn_js>S`wye-DQ}_^$mPo;51Cas`6P$hff2n)*V$%*2Uw9?Qe|TcJkA{g9n| zOf)T^>n8%7VBi1PAy+p3G-d{dg4U7CMP>)-h7+hx8fs{b)@`0M}A?F2!<9O4BL z@Af-=l82sy{-G>O2@6#JxN=};{)7#`f5orNp3HX1V*F+D{)u1Bnr8XOp@PT!V>18# zD%J(nMr=H4_cIuQh#du=4R9n2|7ZY^fIntTlMXw+3{b|km2m~n4mSjFvq`c^rNhHU zk8j?;A9MzCWk2rHEk7rw5I6m&SVh0P9+FKIO-WfXvL9Y|5rf&kC^O(4ANe!=vX625G1`p@iTo;q1FF=O;<4vV@&AZ zXz{OD*=O3U#O8HrdwEP9wC~Agb^d*ktTVWYRph^p9WU>HJR_*+qyeP4 z+y6euzn@O5=0A`0(Fr?#mUU2k<;MUgG&_zW(YHHWGYfhQuFxx~r z3*-(x9)CGfQ1Ol@;dCXzsi7f%MhZm>2G=JhTkZvFY_-Nm29lKZ%9^oUGXb{r4 zjK8d>z#Xs~Xk7Lj57G`o+K&fX{T1H-uPdEFxc2Adyq5rJftD?d)bGbSkzR1AKXOXX za|%rHFp7Uf3Iz2oVCb1Rj0?67*-tXqfBpq;(EiV1T*txUqjePlRR>YjKdO{*VxE>{ z!4iKuqlpr0O?*=zO$+gfS&*LQb6LmjdXf6kqcnEIj5>{a=_)_M$HAHvj(m65{LF#_ z-9E`bp8Qyq0G^a4(tT((F!&1KI26{kiPPIj(LW>(ur;R-d`XY}rYT89k>6QN#*Dg5 zgbq~_ls13N&5)CyUvk0!;wAj-@aS-8_YY<6ud=*fr-osH(;8?uV=Kewinf?Jj7b&X z#D?Y$>VHPyuf~FAM`3uXX9 z$>0CRzXMv2pVTz574+;HsFy|IeGPu#jI-t7g51W_@)*2B*E973X>f9o2KT;f z1U_SuPnG{@RXRB-ULZ~eeWVSg7F&*50+p}e4hV6Y#NXfXpx2jNOa7gF6;;r-37>U$ zSuzzy1nJ41{xc_kY1?M^gr0Kt*sB!L5QDI@fB$AYl zruRf7|8XK<)y91WSHaF@aP6gFiMlI(lK$F2;AO9XUSD@WS>&n7>tMmYed65yae`j- z*eqC(UVpUJMIj+Aeq+of5YB@21RY{VKBrO^!#;!$X#RUFa-#jtp2SQ4j)E&k^5aJ! zFluZ>h0+WBc$DfD!-}E+!SMV~^snjZL2AF?GI{u&r20T4|C_bIjPGx6{z@1UK+q%i z)2R3sw*2Hv)5HN-Wzx*At>swAjF_>f7dW+ESE1iwlfUMtz4XM!bmQ62VSm^eYS{Qh zfEC7G_~rZN;a{Y#2U~16&`uih7X*?h2BJD!I^VcPRvdyW@13;!Y|P?B&1Kk z*$cg@mpMCU1gwrD4|mSN2|p3>ZHal@&M}vfUp=E5G*( zO@^sVt=oE2FI{2cUcTxds$+J+M7`Wfk;jFo*62eCz570n5Cb~u$?eBlHPV0NqyOw4 zyLf81uEX1XZBZwSg5Z$-1KU?JjF$$0JDvtEo?!^oODCf`WPfWvW1MG#GWX=ETd}pb zKVmUEZNYH*k;co2xs->&DVK-?XtF3G4hAXV$`qdG*opI2it&xnqOx)6zPUywn}mK>*{u5(S1kzPAwH|$vS^B@fTm|XXqw(c9*PKD1> z8mUuF$IZsaT3S)j9zEYIQZEliaoYxXJ@bxwS-@eP(QewG5-8W6Kei>8AFfTA3G+BQ zS9yHXA$4JqZR;>|@9-@08Ek)NVmIOv(<{6i*k{pzrWF4h7J5-aE32{PGEZLWVMCpC#0p%(eT`G_Gp z(v^tY&m-YeVvS+&O!4DBM@N{~xm60x0VC3mcY3x>;H}gZ;B0}*+f!$QSBFRBD z*9QC9)u!+eeQ6ixV7l_JTkpRkPPj6ofpc@a$1WG`KGYl# zHa_CpvhuRUeqXpJYAS(&HcC(WhO&-*$Kgp<^J25FAO|*foXyLzOrn#_C)WBnILh54 zqRCsS1ZLuAGHSk#^&?drn~#!7Ca(pG^bVF4ix|MlL=!4)Z) z`E@M=Szx|b!dLF0Z`s>beg9t?gPMPRAGEQHcXLJJ-t-As_>3ka$G2_bl44IZd+*cT ztzsBAo*E$2@Hy%;O25{SSe#}%_TTI4yBx@E8HYp}nivxInVal+{R6wO{ZXgW)v&chrgUkvey}QGZ@P}kP zRMcO5K^DwoMsj|Eu7+A_B@so&NY*=)2Ip~ftSm)2R|Ihh}CvJLV#0|MVXwl zU;KUVA1eIwkk+K1w3zVe>uwv!M91ML6AV7FS#SlCH~Tx9e@F!hhLIziw^rKRz?xia z`XFC!GAxfwkq00J*MGn19|rjETP+|Q2i~=2nq)s{whhh99HaFBMHmRl#hAS)uC4_#hfKFfWT!c7vc zpF@WE*3VCp9q0cU1+vr^nEQVdq2z&$M7CRp7f6=g^JG}~X&l-|7koMFA4@EK`dC;o zW4Nibj~egq@9mWeJ|dOmm%+#kisLTPZ=Vz2u%nEvk}K?mld`W*7QI>sPZWLpcL}(t z@^nog)i#WeXF(Na*VotYB*n;gfwM;B7l058pp=N*ZTfGltxsrK z8&8`f@^n`GU%#G4{)o>Z7lkhv$i|RaiO8ZO0g8=Cmu=^dqxN^gv(M2HhmsVzuf(H} zPCf^h1o~Lr7qT(VTo)AFe+$Tng!3lPvycSp-wDVwA1J{^5ba02X>DyqvcKS4R5)@t zf2V;?drS7;)c<+?JHc)*kkg45r7~;CHERU)gCwEC8yWvD5+h;n!GF~;{%lE(w@`RC zafQK?7h)~EJUmKzdNa>5UwNxCnm{0oNVuq_gM<6og59&*?0<1z7!Dj6vH9W5YIk}Qi;7%lR$XRM~b{Ua>CHS8={1-(39UnP=u51|hE(KE1 zwCm>JFf#uNXA2yJ^asu<*rky_7=fg3$Xe3>bB6yBGk-qFxRDcyiLkP^E*n?=yA0`K z&g%m)sG9Gk(`Hg)Hb4I{pr56i+8=J(6FpXZXXt?%H8c(=vRZj#1Uo-_vfzL^Dth{a zwl+!JbxbU*y$76aGC0bJx`u`!XX(U4YvUF&rSTEnv@8MTizWfOe7YreG!NYZ>xlT*!)WOJL5NcC4>lG7j|J%BG0a2dhRY z-qqH0ar;-JIWcr!2U-nZvo*?Nz+&xVmTHW2k{HQZziPjo_s{Q1t=`2!CXPJKYy7IM z_1ShrKHrjZeQ><$c<(^zqHNFZA+l-+WVMNG?$Nkmyg5jG(rQVba-yTd6(1bmmL7xA ztH>fgN^89;plxjW?%ZNzNx)#kXI;faIX*7wAg3Wy3CC&q#3?HH{DxC-v$C*7EoR+P zIRRnewfMc<(_`CA#<|H}{Dw&ag+ibpoA4GBS65@Y!ZpjqS*wfTBQN1w1uH z+XXMUkAefZQY|_{G7$=EdB|wJh=G-eT)3AsdyHgFoDSJ2h;GKRy^ZVUP<-)(I4T;2 zl(qxY0;WDPo|%dfp=23^p%nH61{#pNNnLY;OPDpRnCvuPKwV<)?i^Z$=GUad=x?yU z67!ZJo69v{loz)un%telIa-0?@D` zeBoy;mV+cd*N6i4g4~-wQ7L1;tKa6%NdOg21Pe*H98;`Pn~!p$j(gtbmJ<^qX2dYF zF(J;C1oLDXghOTu1|G?sV{4oyaL92ml>UX*U3FE|<#6B@^8Y@~~ zggtqivS!#H=X#pNl9u&$3>6Ks&O~6MpN_I&3zqcH*kN`IrV9*lkQm+h>^dn7GZtHE ze|xysitUs|t<~1Evh!j}d(3s3QHNx1!XSyYDvI8N%~QQ}u;9(ltC-8hlOnM8z~id1 zMeHbO5e-G~r(nAT{(Yyj|`>54$eA4|{pB{~;tULT- z7n9?Yft)0Rzz>^)Z!5e*ctPt)PtTS6$6NH3#NLWOZjysPE_GL?oCEnxklwt$5>o6R zoMlV02s*MC9DaAuZh<3hZCL!-wT(eZdB%j5PU!Y#<)MwpNsvPuuKaJQe6C@6`pcXG4Wm+LjnIv(*b4W`j=a^IVzl$%(%qVAzq3JP+8ZGvyIa!tYRAn>I09@t>&VLV7tCbk#L?vMpsRiNIy+`B~ec^Wyu#q|Ez z$C#OsyUd5cix=HxI7V{LR6JqyhS;mZ=E3QaaE+&#PVT87KU?jLOn@1;ZWHu7Ub|l$ z5oZw7vJQZ%Z=pa&{p3g;F`y4>X)u9*jahO^-!lFpk{dP%+hf|Ok15A~TyQNGml~kc z`H1_i%=P%}c&$v}NR<$yyu@fCth`x8?E6IPDO^>)!1hIM?iZ!Mi+Xj;2%0gN9rsP< zj?GkMp&RZOQ*B!R5%S*|{I-9s(IX$qf?!G4cKY}vQE>!U9@)K*CrB!v11Pi?P|39= zYn^oz(?51S8w#lW4cvZ4*B2K5Ez|P{4WRLgRc+yjJL+mK2khq3Q3{A+D!!$S)4}7L zL5rZ15g^S{@YiFp6ue*DTyS&EO@>WDxTw~@#ze#gX&z|~=rNiZ1gj|^E~Udn4B@dK z;d@GQX}_6qr#wmXS^_u(<;ZBNeL<4pw5kOY<`O`d7|UxIcJs(uyi(K1-n+y|-ggnR zuhe3*sgoITG*CoS7+uL?Uzc815``4YA85s1Ok}sZ(u!Gaa&%a#4V8vRr3Zdh##L4Z zAjq`2g6I(@3h*ljR(8Ts9QlZ%(S9jcH}tGL4HU7(#r(70W@+Poc8_@9je3w1o}H-h(yz^2;Hh?ewG&3mXK2=eufn^CHoAbi z=u$lM6|(*?9Qt;v%gc40OHp|_GuSMvvbA{A$NdRWH(E25ru`=f64Aul8)V03r=woV zNR1y#Vt=hB3yhRfUGa0N>ISc%qYApoW;QWdz-J%Cm6#HM)9KIhwh_d-DyoWI`zLFY z`%Xw(dV^J{N5VR{JkI&oUy9-fzZ#L-<6MzG3bY&d|GfrixO;j!cZjJ_?oDd(x-}w1 z2n*CrsO%+W9>&6el-3Y-1E?ST`(GC`hE znZ7Z}`VAxNo)dCj)CHN;Dk30_S6}d|^{OUFY59JHsmw*tkiOT%40bV76I-3?)5K-Sq`>6GhF#`J%yfO}GW4Q`$fXg^{KVF17sPQ5zQR z%5RJA3%eb)#chPU+&Y7awc@(fW?T4xm|tp#dZ+uP+a|RS9#qaSpM1P8HTl;8t{4kl zG_$>8(Kn_h4dmi6BJMByrTjJq2_-LIC^gA-C@Zta{ylfczZJ*Fp9g1hG*Jmyh1DW# z_9s1;b-CgtnGsFhUam-!yM7g~Bx>!;Ygoq2uT~GPstKzyZwpPgPL1gGcDI1<7l51& zRFj&nIHQc~DbecpyFV(Lc7E37%ds7nR?~mrr+)o_YB5bObGKbT-f(VT8$dP!5Y)hIpVWu3Hq!yaI>ig=_TSt+s1#E?9^(Je}NpU=UBv@!m(l;b_ zQS^1LnYFUDRiuxZPX?9lY3z}2-qm@8h4e*HnyXq+&dH2mQh7KB0g*h5@*eMmiMlxR zwerqlWgP4KZrZBg=d>?(wBbdj-c4M2(-cf!Cg{%!<_+!*$sMaN*vVqN(97taE}=yQ z(=LbVsO09%=V7aWNH7$bg0cyzlKO9`6wK3*iTPt6kX11_p{2rG?p#rfNS1z9BnxUh z^3kf`s!}bt1$DB5f~o+0g6qkt$}Mdl9c<)eq4Hf*`BP3rQ)KQq=)xw=h_I)k=0 zcU|uDnAD>!r0FRZ&~?dgvdj}7|6)(^`-&O5vmXO%k} zWxh}!B_>fMqy4!67qf};qrs;RZ~ASWBjQJ!R1^`$1v5^&NhUMPG$LUg;^+d51>WxB zYF-VeXo)>MTTd{?EOVgH_xnu5S)@~JA+K@!iXe&;z<1JwNasq;vfm7!7kpmO55TYbH<%5M7la~~PP(*Bj)^twqH>Sc8 zOhZtt@35IE)6t%q;TlaX$kWvZXYW9<4MAiO-2c21nG`~oZYRuNP2XkCY?_GI^_VWc6~_@D7LYs<~? z#8nnc{xL?oZKJICMJqXuZ5(e&+F1#C!Z-Df>%Uj_s9W1^Zb;Y|;shK76;Y_TB$yB8 z+-S9L3q=`T(QngBhBd{1%ZBu(BvqaR^H(0k`lJp?4C#F_TI(gFE2aFYqPbV3C$=wu z?q@rI)@{!ylN(jF*;|77x;u&Mm&WK;8y#>i98a@cIW8(p_KMF{r@X8tKP^8+S%d^j zM{0EHzLboaaAp=#t&NdY*I9$&SQncMy5=@*wp7d#tQ+$$E(}uN!z`JG)x{;c|QC) z7;m{S1G&z$uMVB@S)2>)RJQ&f9)=JB$~!F3|rIoE>0y1+0Qon zLFRK(ck_O~?BduWS~0?Qpy+j|;4M=GPpIKH%mnHHPRYrpL7Uba;-L@c%y{$nywvV3 z(0r42=?M#l%&Q|PdUWb_zf{j`D+Bm8-x}o7OEA=WtRSeK#u*Wj6eX<+LYKyl#!)%l z3LTefVW{@-56q7~fOJlqK{|(1AcXW-0y$mdc#Mz5S?HwN-Dx}cEXOB+ko>DFZv2kS ziT2PdZiaqNXlq2cQATGWxe-zS)u^(V;ppe$a~0(o^_kq8tsLm5+?+v1d{=9b2hY~} z*w1nKmq9WzF@6|qRKmz!R|L{C2JmqP2d2$7Jms0iMIN@sI4*vdjiH$EZ~xmuP0WId zjG~J5WYUTk{n0d`_jfmuSL9`?i9^*kfhu1nzjes_GD^{WO^%a^!Oiw)2dCItsCD%ojhw?`M zP1O?jVxopJjsg}1WmkGP!MhP$fmoVIkM z8hCO}33Qq`sPMU1SuG_WU7g&a@0qJF?WyvvhulY)fd^x{lbYU2c`Y3R^}jI!J;gBv zNDa8rY6GF6qeP!1GA|`MT1ePG?OFXiv1qhXAnV4qCzP;$+C5-&VZKq<-hE}{AF6ub zL$T7Z&&bpM+t24_pFFAV0I0BgbFg)>7pisW9pQFV<%w2l68=3ZR0o7!5+gS?J#f_F zyeH3gU75NiWk($(2|aSDICDx9EKc%ew#vDJZzdr;@ zNnSeEr`Flv?Y>&W?jH$iNsDw`3S-q<8D8)f7->gnr26fp>H7?~>brNhitNm%IQ?E4 z{n<0y_zLS>aihd|+T&j>!zW=BDqhF?omzxD^9b|F%tSx{#ME zF#SGik5gB4T)DO&%IUO^CWR%gd39xxO%#@{{qvL|JS3$aG8Q2`b~$j9)U@g*xN;%b z6~R@g;mtY|1`W5KJ-n_jdzXP_u^L;lTrB(TC!K?+S%GlxBK0-X~Nw!7Gllf zSV_Wjy>pxC)qiqi#Jb+MoB%xql$&P6SxmaOXSCYSA8pU<$u3=QirxUdx+4LNtB?9h z{i&F*?3kxp1GQ)fvK;K2b7|@wr1I~mU?Z<523}!kR!i(@DUsd#E=}qZm-SY)f?W4~ zh8p|@Lf+kC%QE=T;C^euN~a9WyKHL-Bzi`!gV0%9I9cP6-2rVEhraKdcnFilh&M7H2mdZS`Uot8DcBXx z7=p#fpNtbmm0m;P#6* z(DooSsr47RB)xU_G1}H!m0e*VolPuO-zb`dVzvepEq2*XfU=QZ7WgZ|Zv1l6+s5zo zp^MW)B6J%f;c4`NW)TjGw0AW%dpRr?_MDtm9Bry9Yg%3YB(1r^@}L0V`C~#8>zQ=X zZcs%&b>p%`mhPEMaWMl!$^Bu8_mc&G5=^xRUg|oAu0RO}^UhZ9&uJhA-XBk*@Gn^q zx2V+qH7G6~w*<_urJ%&zb*q!DSfIlQEKS!F;8XIUHv{NR9M4vfaGBWpHvrYJ8d_9n z^EDuN$1fa0xYwWL7TS{>n&Y?-QmAt$s;sExsRck9yQPw5wxZG{6ZrVEewgc^`OtCX z$GriK8pG$cUuqWPB+-L*GTG7s2nF2?#Z35@!e*``YGsHH1HZ>4-$b z|6Vq#6(PBf855HDEcO{c5T`Bd?apT2SUpj8Qx)nJkK>n|uHQ$dmgEd>%+YNpHRUN$b-id= zx$%G;Y`@I! z{+Dxj(#Se;7!||VPGsGjCLw^&=$E7x#1n<3mQ?{5?`bxH zGNpD;o3*O)3>_;Sc}&Arc4SY_XY|FvCx|eli7Cz<&rM|O_`jQm17Xu9bCM`GJN`V3 zEtO>phHA=!D6F#EbfvjsHTXjX&Tp5$IWk5!ybjBCAs!aTnt0XZlPDJ+B9f%kEgsjd&orCs42g!-kIgTUPAm*lJ1LN z6AEtnJ(+;se&@%X*Wk;(3(fX>e4cB>()&PEegqeKap(&Wkyg#?kk0KT+!Kd3noWt5 zXP8U1xQJ!nD-i8$Teu`EVJj-R#B);76*LQ~xCDuhSJ3uQDjJWRF%f0CO^{J&JX8x& z`z^1ZKSqBv`m3ooF}g|6!EfRVK+Igp`Kr-NzmJcF9np7$BOLoR$#X9&Y0=x*;1G!o z^MS?c@$=heKBoHRb*&XWkj1y5cxl4&8)q6@@s_iA#}h zj0m%@tO>geoO%0}o2XnEZitvS`LH5g%#9-qpisIDnk^I@r*LRAvN*}dshFN9n(5UA zqx6rpKh;jJ5Mo2icLdb?mo2$DZ+lz`Z1Cj`3y==61KVGR_}AfT_vMI3n+sg2$uqi9Luy8HLlO1Hs$BL_pCENXTotKQ@wx%4puY#=us0f^0 z5+ZBYmFk4beCXVE2e`1B0WqraL%Bk6Jeypopg98fMVw)YU% zQGSh({>74~a8|J`{W~f4^VLGJcLF^f7@OwD_5M*Ijn+)x6Tycw9KIs_?*NAMl{*~} zYRsCn2&&QcXi)P?=!`Q8*+$0%XIf%bX35r9c(9H|)1cXjrhpfYRhemIg2Vxn;d_vR z-wA=B#4UB7y&p>BSJK#Nz@*N;K&(p|_bA)=?ofE}?DrB(?Fe=jlQsM1%B@N$=+{O8 z(P?=Q`O&Dus5~g|WL&_4BV*)uuqpQJu8J@0+7 zwGF;X2l&n{iJZhHf)MlGv2T-NP$*Zz-n{hvRJqblg)o)ipoehGeSPIq2MijEZ)-8MdQg~GW26$v-d}H zsh0@ecAB`_k=%XvDXxflWOmE#jDp8^*CMs{%>Fdhvs_8`j4UL%G_6{h%kG;>*M6fUx3#yHm_k{bzZ`!VHJ|4o z+FC18Hkr#r!pJewZNpqvgMG?7M$z)b^)mb!G`zQ0#x92=udZr9=OIE#l{>&~N3Tod zE%RQM5y9g}Ai<^ahDICihNV0s8nG|+a3XcI?0v9`>{|2Omc`^a9eLfbH4U!o`91#p zmtTXMFe)ob@xm8_H`E0mw&$uhty$>QH4wO{>Zy5u_7rU2L?kenRlmuT1vc`ccXtBl zGJ#76b67{ZlwRE@=5%5ag{n+j)YG&tCX(;^O+>mP=b78Oo`k?w_mmd^vtsxb38^U4 zCExVD%WODr>quTP_)wiK_y;@HuV7NpVCyQD3MFO@6o;*=qSU=%?&Vk1jIDwLpWk~u zQ_xj^8Ta<>Ri&rdlwfKqbX-^}GF;rO`xBNhlavilU=6bzZtH#t8}nX)$avN|9S&x+~DL{zU1$F z+D;~|%SxsfN+VbJURJ*iOJGQ5f>}R4Xv`HMq~Em4sn+Pk90keg@qBCSN8fjFCzL$h z9$ef;8f&2w@QlJDu~aJYGuh|NlZ*`ub-RA88dHT$dm16)XpeWD*%AllJ!Rrqdibc- zzWO17WA$0yjB!9L@$W~zTi9;6S`pBPOv9*FKk|IXtEW;Ij#*>YOgerVE;R(;H~y3N zHW(Xw_e8k+vjJ**N@UypYeP5wF-Ogk3TL)@G9Fy3$M$F|9}Vz&#N1e}j%!($V<>_4 zn-9ol7!gWqX+8@SHKqPEW%cDZskzmgt@*UsMlPaNtmSEtO5uvwPD zqj{zl)+h&$S7H4da?DK`H&~{{rFh*XxXTRFAcZ+lC^rdVEwC8+^UWpH9;n}xa9a8Zs?%0z*G3j zidn+_Iee-$i-ybiKKUT|y^A~`HU>D*EyVR1#9WaCwbhc-seIEXbUL5gJQq2NG=T;~oWCKkc%85`@r<{q2b6rw{)3vgh@Qdd5Mj|AY#hHpk z5_oJXIWC}(;sMhk!}d@aE~=)pd8R`y-!IQNBy;vW_x6#4 z{tG1wJq|`1Pi&KThEYr!Nfh;ZhyIp+DY=8@bEYMKBK(mgQGNXcAt)aZ1hZjgyJ$J&v2TFTkDb#5@z)%CG zueEx2gS8(NV}~%)d|fctlfhn6!>h0(<^(*{om#E88bP`8@oEpZGw|)Y!AIqp{oXCQ zhmThmi;tU$WC@LvVxCTC+-)s5x)w zK;Vu?l?*V~NQ$Rj$dsJhdPW2cBN`zGr{*G)5Vje6!nme1n}(#2$KC%IXBRbKr5iTd zl6=F&a>D&jCZW@MeqQ%!25suoGx89kXRgna9lXeJ zGcEzL3?C?7`TGd5nSKCmn7-#s@VVfxF>&V1_r1VMy16R>K6G(c{yb-|c)zBqf4rWO zRDJFg^?Z%wvKIw7kq|b9+gd~9EK%Nu^~0kjw6T8o(T)IWf{9#_pI~397kPoBH)+tz zX3gA33%6oG5!*;Jk5&cn_REZ(-i3@HsS7ecf~sslZ-bpjHe^%EVkGT??iF0?w*e=j zO##NM?2-3H89~Lej!8(r7`uNx^V!vP0S;$kF@f!K{TDWZeUXQcSJ9m^vk!lRoo)TY zw8)RYQ&uF`83tkqn8~z~!oZY;+&-hRb)S z<=ceNH=p#QA~68Tr~>q1^L7kYGuBr zGqWzuNF%8)WOPrOiBYi~{mVyH^ri4PS7i2@%w#l;u!frRUnq&Z9Gt6=3Z_OJ8Ajkw9=GA?L^S)s0l%xlGC_H@Jy zl!gc8)v2o5CbmnuP2^Ca<#RH}YGNjw;-B80Tgf4=5#eWtt|Z#!P-MIgvJqkinLBwP zRJaEVMHOdNT-ia!6_&oPbeEnvf`?jPcD(({GyTTmRI&uS@1{qaG303*`l~w0&^pD8 z&?$dZ_z>~V2BJ|@$0`rIMuw=Hz=wmDJL2aonfexE{&r#<~app_2n!V!1KGVe%%^*lu5L9_KdBLCTnwT)4jgwbxw zbP;oGp3Y>Z)krVEV+A+q>U1UN&F_iAug$a}q>k*=*v%=}!p2J<)0Lo(d-FS4|+BkQipqrX4TvsM7xwypTEUYi|~rXF2l zB~>54S!YWf%z$bMy#sEPeZU#^exNyxobIG;C(^}t3+u1xvVD#_R}>jb=Z_g;>?5`P zy7l9R8(-FT97C4*E~<{8deBTsC( zT7T)EHaI+`u=k`qaahKDRznY($UO1Y#m@+zlUj-XI!YT@y`?56P0yMiQCwAaArW}b z=No8xhC3E?RJUD&$TunrtIi_&4rm1;I_$ezA zyVlUt)JxE7{tZD?1|>_D@t6wqK&^A(WMb zY5apY*7B1@laei2S)MeNAYM?LFDr$;Hz97u4FkY+ZA~*}Q^te8Fqer~C$($c!s_jq zkKgWWFeN57kDgqCmXXpJE3y`yNfle#3rHB}a00``r0*wb3|eFlB&+WC5^}+QN;^KO z5*SmFlom(li64xX6`;L|C+E634%6nTRX0!7W-r=7x68s#*V~j%og>zjt`jGh8_W!A zHB+OjHTd7a8wqBR%VNFDOZqNa$&pQm4^*3yr)0-DA=0>>8A2%+68#IC%xj0BReNo9 zaxMKA@2Fb%SP+*Y(4;_4kLMxsP~Wg+;k_5%Os5K6@h7+OB-EEF;~A>}Ug&tO?^M*! zv{bG*W+h8Y(O!4<3l#(&U1*XqMt?D)jfvP{=xR|!n)`*iKzzFJ&qYkFNuu&mt-p9v z@4E^B$m(AeC2!?)XVOVGAagPGV-KDEU|mAlbkTu)Dt^%r6e*)1&X@OmL+$(0AM$)c zbD2dIvq$pn=2mAEej*t=+N?^|pj7~c{d04nOdIx`N@ z=EaR{m-;f&ku^{a{59>@m!g=9j>pjkMy}2@6=ewp*(><)iVpPR$QAK74YtwUl25 zG$TrX9r?bZE(nhh80|Zi2nE`0ejB$t3RdEzo=-3fL=YbIT<*31s(1VqC*){;J)#G4 z_`#i2e@r)Ia)&x!M=OKWVSs#krK2vd{M7U>xG3zOhgDDS%4W3@;5b%~;8~V^gmQ+f zq7^$vm{XT${9beD5O@WqmLg|6+zLn(WpkxQ+kSZX#d>WDWnMBS=A4p;q76UhiCb*JmvHuUV?DHUO%3(@k z$tPo$0$;uV(XW3mG)e;l^jK6Wv*0Yk{a)Bv=(zJ<8g|s9w|xqdi9sbs*km;F+)yQM zBmAb!;})u&KUY-v0RArRImIEU8zT*k~2m(NX!2D}Rfl&`t#p_IFI; z=|5|CI~&byV8dYElJvy5zBOvv#z<}7Fi;cQ^saDbUCt--Q4O%o1sif*A4_7!$s~JZ zrrpuuE%*Y|jr@cCP7<;Mp@W6fo*e0(l3u26gdrwXB#qVk3fJGK4jt!1<|AKcU0m!d zy3U~$Hri9>J3I&(UWpd9c;Q!3E{4UfG-Iu9t%4IG1z%k`(K1pOJqn^ak^KF<(ACd= z8B=j}vs3zQkDTCg6~4=b-^XQ-yES?t&gSrJ|-!mRKoJB;ph70H6|wh-DA z&CbiqWT6V&+KS`K!qOcC-dlYcpS|Iv>I*luW+;n^KZj51)H`aPUlyVckMox+30LOt z32+3gy8z2HKMwSRU1r*#kTcazS2To-khxW+w#)cK$gs_IZ~L!QJ4X`ONR$sFLTMzn zP?aT(^!hJ7cHw_N`an#0e;6wDbLHV~yW1!g1#_r0B;F!{-i228(IrGQrxT+&HhKeeFWXQ+(`^Ch_ z!`Q}-RcnwY*GC9eUY#V)))ZMLP2 zFXLd4$FA(svVZ4n%Ily;6ct;_q3PJ+kirVu)59t-CsyeUM^uvqonglFPcHkuB+L{h zsI2=-yj7EAOcJbc9RW^EWCLwc%pcf;Z@wlJHY5|!73vzC&M@6m=Z#=0$rGQJ;xofz zou9AYK)W*8C8ZZ87|gp~GAK-Xf8xL#=Q|v0R*b2S&Z_G9dANBzjz0NdL%3~r$*xnn z6!T%*5^r@a9l{v^Q^B2dRnW0h2N$Dd)LZ`&{Q02xZi5c%wl5ZVRB+a6!y7_W&y1UqUIVqZq306-kzCH{~%21CHWCwj_;5 zKlNu2%DfyXaA&&oW2p;Q>+3J#!!-FIo^Wstm~iyQTMpv{+rBc^lVlJVD3_a%m+A=~ zZ4Le9q4&bT9W7zk7lZkrk!H%kZ)6A%wLb^&@NUo$PyF&C>A2brTNPugjoC8A zZf@Y}Hpy?y^!cyR+l9<$6NKS{FO|{hmLB-gP4r+f`x85Y*4sQtHLBtTsj{MJL>;Sg z{rgoJpVM(gb`KVls^!%GNn2Rh72sN@{zgVANy7ik277z101rcDd6rEPI3lJC<^r@| z_yMTgke_rE3EQas7MJHXTw-J5jXk`xEO&P;405MyZ@(8(TRg?dxA)y^V5O7)qv*5j#c&6WTpu=k3yC2Mo6~6U!02GX{#-@5I%j`4o#h!v`?G6WWN^tlmOmwWFsz zi+3oPCSC$VZD{f}RN?Gh)pP-T+1JMC64MZpXwRl#X5hP-yMvFwSZD> zK9GWP?_6$@{3a-ui9)phmxaxtQ+?KqderY`J>8cUkh zB@;4)F)2z%99*v2pWQ{4uD`=;GLD7D+d`-6PP?&bB>+cDk&lg-2PzCc?ZA%&2yWt~ zw%$GJdw#2W+HS|E;eShnY3jv_8nh0S@&i2CSkuaRojE#X2iop903xn+GrqVQ@V(f& zLYfmjWyOcW)kI_GaBPO$INbl6vSD1PFQYgl`Q+;_QUZ+ z8!kY8JcCF^|D%_{BpXc}Yj@cFr{4o6*B#g5P|li*?-R+*!J6r*^$^tZef z*_F00npy(rD($9)d%|?S?M@hmb$6($$k0WBSvy9KBJW3tJeYvgu9Q_*mDFc+=Y=v> zg=+}$ihhW6%8K+|!o}(Z!>1?1nPM1>8(S_HTXBnW%T&ohAI(VH(lJ$cz-YOXvA z$GfXqp`iJB13Y+U2s54GWAf?rgG}p z6+rJu9eFZjxPxxdTWFEaS%p5D6clC!P-KzOV1XA1Z=`ou|=K!^%oaL6#dP(AZYLWeF- z4~7o7#6hP03S(4riqwoCgHRC@Z9cOJv7f_I$EVzfa+rK-?bzwk0r+_00CJvgmQ&Sc zAXo7wu7Wv&H`X;=NmU!n2`dK#56rVMFx=l3QYHD$nELD>R?L6NjxraP%lBP;$e{Z~ zT*hhVt|S(LEEa<#CRkC&fNFke2B?N>qvcdleHqWg92qX3=1bI&_ia%yBABL7)(&P2 zFb&$V@{f=7eGX;Syb-=?E!Pko$`nW=Ue@nOw@rSk5SW?F5>yYeal-I3%6qz#Zv!bk zH}`AR?#Vi{9^uQ)z2R08Q*n|IgYEx{n6V!I zSXb>KWR}q2AS1%YUT8*>*no;yInl(GBHv*NsYklV@;md3GQD_fP}tBjd*+zwFku9! zJ+hBlyu?&+^r4GRF_Yb?TT66R(Zn~h#X|N;gTdE~5^LW=4w;-Io7xOg9X_G>&#TPeOG}=QVBHxa_ zchZibld9f9*5OpGB8reN=CcN9oe86r&!1?`aV~sL_<00=l zL*5tdl>)%~#T4M?h#7eG{KDz`S_T;LCBuBRNf>k%&=0z7o?*0kC;$BvTtU_%$gl%s z?=keoDe_jU@}iKI?CB8D=$-YR&i-@by_$8@sltuE2}uK3r@j z=Z`2>T4~n&Z=VF33+c4c=?+G(J&JjQjbha(xw1^TGfrG??V%(#!9q){toLidTLKe2 zHkW8|jt0%XKek(q0pRzZ6CJiS`KpFp-qYr1t$e}&vjytNb zFpXAdcE!Y2D#-yi{UIH1toY5B>W>hRamTb5+|=$T)#tDX-6*?(8o}qT+L&OxYoNkz zBS=hYkog-k^n`FcWnR^Q{Jfs~q)zCoIjrfQY)E|`Qqh9*>^)h#6ke%2P#?b_VdX%= zxKy^^i!gY?ntw5UZOr13tk9jD-|(Zhn~;tqJ!cR@{fbCM+Zu!*8I|H9;O$)YG3UwE zEV(mSo=y9i-Pa&Pf9%v)m(C57M<=N}n%CzhV3(0VNh{1DV}@K^t{0u3aRe{Zq1oT1 z1bkn?S`Dm0Grs{U6TW1FEU4YabuSvCBBh2nq@c0xC^GT4)wZ00Bi2 zDS;8BLlBb?dhCh_7^(=NXb=$y(jhcadN+ZD7NR1A5J-dok(&RBW#;>>?|t9zUH@5Y z*23J}d(Sy{@BKXc+56m#-5qs`>*B17d?@U(y(8*P{Iknd3Ra-o#7f;ruj}nhSpQ0h zo~lpbf?eCSdMgMiRMInirNr&vbBHret#h^kahCiBX^eL}x_6hp`lkb@l~V5354Dy2 zxt+Fa^lj=wSW5MD8KKN~%>&&t0e7FpDw}Z^0<{i5{QW*BMT+eZ?zlZ%2#dck_2EH=>J@Fb?28V@ ze@17-_qUiut`(kr)2#g`tD6~GcM&Nq{8-caacAYkg*It*81`8QY2U7QYSm7*8~XBY z^nV!LeGKd^qrceX=VF21H#Be#3Yokh#Z;g@jwNV|M1wtU=d(Ry5C0u!BjS)3$4Z^* z!cUXlI~>iKG8OJMAnjkxIv*a92p$;RPV?>TV>RT(T!$@-wnc)iqm z)3nStyuKl~mt($N?t7%d^_z39Uzqsl{)guFBWq&T7do$Ur9M46V4JkL%7C)7^39Fi z&Cr?SNK&X%wdL;kae2xk7w5d#UP>2s3Mo&S;|8WI&g@U9FSq)lBYDK|cGnQ4>ZGBR z)K$`}2Nu#M#-1e+_zSpmdB(<#(k~}j>95L$K+_R#DAMVx#gTQkS)BSDT6JhJdgEh@!$P}SD^A_sxaFX6 znFEj%DllarH>&%-mO#Kc4q@Kb7AOpLcFmzS1qF`4Nuc+)+rDj$Ac_g`Y*vhd<3d_uKvmunXle*p6b&P-A*rH)X1~25WA? zbR8n*Dr4oARxwP`56`tmMltW-e%vBQ#59|s^)a!d&$)DN;l$($s&U4VPustwKNC3N z6-s=T%N5m<*cX>>tbMZVmE6Who~PcW%IrZ;YVAP}Y8+cBiEOt*H)ZV!TawvRI_F&9 zLROlruwyUyeF(&rQ20C?vG|jQZBcJ3<=>GBPxJMS~uEUzN*hZI}1b zd+wchuw@Uo!X(U^Wq>{aWwVvhF~1tV6K^IC$kOr1=8({bYnDK;cJZ(>;l8?R4lxza zZ1pVim`_q_+tbb_X%iSdzJV=ZoB=l9*9?30c# zQi-DE2z!_2s9&^JjC|qx)mQ9c?BopzGWQNE_?g(t7oNw?n*Vv=fwScw2AA$9}K;?JBfs0J}nZg4ZHg>GJeuD&fc!ub!m?IM9n*~BFjYC z+KjcpbeN4y1hYvo&rYXwVyRDnXxnioXN;+`%dagyItaYVz(Wx*()TO!w%l@rYh~9h zW^VLv6Kw2NAo7|}anj6a4O(gLs+kGeS!RF!N9*4WU7USY$yRq?dME9d_?2orVb~HJ zU^|xga zrDwV+ltzR$_^ofj%C8#6MvFKB#d1Q_>suBg_z*}BGB8jnFlo^5ynVPcVcg~r%VW(@ z_}tScRt634uQS`f#`e)X6M zul?)JGcT&bYfK2`%DYhCRwN5Aeag5z0-vHAQuY`*$3pTRBUNbDQrOfCwSlX|+_PX4 zJsWS1p5ERW6}z~*Gs^=m81DnwShn(RC}_kF>+_xj^D?wWN0(^77pya`AF8K;+`Z$3!FS7< z^<{DMJ3P;0EH4I^(tMiL;=$H#!$Y8ej=bwO8+30z``29;HQ&zYuA?Qzg8t%yoA@~9 zML?n5FgU9fq{KyQ!rzrAUPh)VP!8t9U4{9Ig|u`CrWGewL= zxQI1hIUBaENzJmMqqX>$`{cf}-ne@vopHx~SCA!TrSVy=Mq##1rF{umsPQL7$oaJw zp3?0ko%})t^Ww=il4ebz!l>Jcq^#UgbSZx{t1`b*K~dGdP1U=@|GlP5um5|U;!K4o zWHdl5C%?g_B-c;90A)>wU%zA@Y(GYa|LAD*Od7w*bF__gtSU)B4_4@i->7D~! zPrs~B!0dJDnG4v?wd~=#`V-$M#lT;*ksFitMV4poyO)`Gm-Mdf)NY}6?D5OC+cji* z7B71QXus-A>m zRO&)g=p_*~Xp+n)M#esZcS2*~1=r&_9%uHZDw!n7sB{+HdFq(h0!@(l%y_x)c-^J8 zk27_dH~9MvB+ewpXq@6PwSx0=xt#v7ncfcnkKFF!A`eqrh4AS1kDhr7FbTdUbCO${ z+kL+)eZKiwZk=Saw%)IFW6H7fSGNW~Q3}4gZ3Qu4^l-+T+E%}v+oNMz*LBby7S*O# zbMAevNI14mWYMV-RP3k)PWtOiAcKkF)ehBx$MqIJ$Hkoiimk)0^TwfH>Niz@{jLVt ztYJ$==KHIJtV|V^l$Io92T}Zwdk?3MItQ>; zl%9m#O6IFEawY0Uhxlj1qxSEB!RlaZ{A0D-)-Vg~^~6^YIzRlR*WrWftO{=+_&4I` zPMe&ba6a|4>(Q7+y0)ox;rkG?%^7nef9_OpDR{gQ0)xDK{%2N>DuTneWd&`lpff@- z6)|%6KbP0Xy)l^$&!4w7`8`K_!hw!XuYs+F^Ei+<#FP9*ggqaAJ74?>q=Q(c0xyRD zwe$;XI9&g>6{oCgn#Jqh<3{_?yN)7cQq>8erWY*7F5IBVGk#}X4<4jGUp~enx^Kri4(KOzD4oe##mqgfczK8;B@HpT%3avCb3u|+ z@iA(b9Y0t#Z1uWLRe%{wOuf1uLS@d+97e-IX0en69!*IYxf3P+b-l!_39{sTGCo&!)UZ zJe|mUx_LY04}MHb&sr1`%`RZMr0M65F7EZob?Vlm7I4ZQj4#|ZwxwqHBUq>3N)woq z8r37jo+ga}YDpIAU?==FApkdVLxiN+z(w>XLCje}YqgGyMO>hxQE$@Y#59a?>BGdP zPCF=fVo!t@s;1;YMB;0aouoWhM1;?78UK9yoy?W6xkf z25&62C zD|x-F66e|XlG%7yeKEWi<5=K$hBfEuQ&yQ~a=tDCHP2EjB{V70E0siqb?P`tKQ`rFK}Y9pNKi@3OOajs$)}x1rDTrErb2C!u@<*e91-m6(m1_3 z*t;|%E!{m`YRseBBv+J49GgbY3W*`a(&XBgPbh}LlERIjg@Hb%gaG>@RL=U?JTrFs zU$~*>>=6+^`gAKrhPKlWH#FnFyaZ3z?~$P={{@?bnJfsM74k4Cm)lVCS(}vKzUQ$+ zt69NFm0~Ng;pReRSZIb5-517z77`*E=~sqS*k=osI=SecGQ9RQV)^Twb}X=@wO?VM z@^$munY1C|RBZ&M((sKzcb&9vdn?luRxlDl$)XPq5%t32z;{>Rh{!96y1E788Jq3k-_azZkx7PcuOvc~b*b7z^ODn@oEV&+yP zUmj26FCVpf`*!a4f=;|A`5KpK0UnJHS@nvK_p5Yr+3Rzxw@=jyyQcMv&ZMZnW)qi6 z^Kz~A8;DI&z-Sh@8lI#BuhqQZI7i7g^>Wp|;jZ7j@zk24j(H~jW|zz@F#K~uFU!=n z7k4RMzpE}(s+^Y=7A1C>+QOA2mZ`z5%6rAs2p7EImf7%^=Ld>5c1|H8&&{V$j(h)c ziJEt%IC$jlJ!(>u(A#`OWUr#vU0a*-^ZQwLj?{kQcD8BlNFrJA9&^Qnz|sNyFUp@g9Cw zh7tq=HSghJ;)~3W3qfo9-BZ$9-BMT#wEe~SUINT!lHzsXW9M_36A&w}khPjU6ntjM z7VpVL`WM+WzP${Iiz#m~MIy~2A|vC~eF;ewmlQkdx*s4D{$S2I2R}ECsr{tNoLiFC z7zup71z~|_4Ob$vjEPEnXGprL)t61smDT1LQFJe}*bz_N47p^UQp z&&E_^D69Wi<#A$!gX948?P+flmzv*csDoB@Wek0v$xwa9@u88+`q(d2%Vf=)edrDOcbf*WX zOah3sux`H5!1%&E?ULLfhspaVl4KA1Uxz{C8T87JR%YEjd3~1&ypg_ujDXES-L~-~7?34b@QZPd!2!l=7v_m5P{Bxt^597n09qKjflZBacCs9-V=Lbu@ z(S1@duV6W5Y{F4nE!_@G$p}{UGJD!TedWcF@)-I^U3}qw*~>iW{r3yB+1IF;fWQV~ z;eJW*xJD&en(v8n5PdhAG)~Tr5fD0DTRX(qfsARgEb5v^G{n@r2s!cb2umUolNZao zIPaK!gc4QNs8=4d1Ayc-)*>!nTwK48cwgJHjE((zgreJ5Uu!Jd zt%h0HvkkS{K(Pb1p$8GBi7A+`5>M+d<{lH!H@6p}v?1$V;uyme;DqAokr z`tey5-Nfn+;&EniUPuYcfhEDxQ_j%sm+L0pcUTxo%gqaU$q8PBaY|=%r*_YtOmhD$ zcVuyP^z-6%ORKbj*Z9!Av5)1@sHfiQFS$B<_oaI~{ywGIyc`(BqK3aftrte*SLuf1 zP-t2BYh~X|6x!9N41SVi$AX*DJ!l_NU6X1K>L!I~lu)-89~@A=tWnae&bl`bbD{M( zDpySzve?Y!hbVnEuL#AP3u`5YY^oOPXFEvtu&WSps2$sjIBN$}rp4zH!QVk-aJbHu z7N$SqOh495tz7oyNK`OzR#p6Fjy>gE)b9T!=>D91@G2jZd;FpY_xxXy=;^UG{+$Bp6cW9jzU5%I^Xa0}+)t;B%~jwNt*Nm71_2Ca5@Z^7jx{beJ*cs)fwsQk-a{S?K)1yRoRa>;V|_%~(e#+vY9!mnl z!=o%~F@r>7eNAurGT(*v`Ia;#O1X$Lv!7ppviy_ZPBf-3WAZ}0sQi{V8NTm$=p$~~ z+Q1aAk+@f~p9g)<7wwTyTysiV9U|s%z&Y&ny6YOKX8vUjW({VL*QLd3Vz1Rv%)|Lk z>wJfe>21&NreS^$STzf`M_vl&ezZ~Xr|;dX;+}BlPLt`>yl<9mq~;cH3Hjqxx`MyP zh=SrXdy~Mc@di!)qYpAF{O|bT$=?02c_=kM4)2z2R^E|D(w_glQh$u9qKkOp)8Qyn zfE+p`9<2PjfT~K#@3wWO-AgkAyeqIgpQS}7nh%)e*|UNqhbVI`0w^rV{|vCzkM=ZG zXSpbSi-&iJ!tWle>xs7Iuc)!6BSn)nBir)r-#7mVroPDx&TC&YUH(;I8R zM`-U_)Z%J-Spj_)Yn)!zK^(SE>PJ(pSmQzt&M-F2a#Kn6CZ#fXJ#3*3)T9l5&~7#$uAPod&a9*(bFkQPf?X*`fDY>rYg!< zckobcCC5&~4}KFB#0{|5@Cz?QAw)4Aw7k2LK^h_NC9igoF(*=%JJOZl1Cn_uHO}Q> z-dpohO4%`#&i>byZt!6aEzf*Yhnt_ChdQe=2H5GWBWu=4^DkNhHQHW-QChdDgjo;< zr?c+orz|wtP|SndYyCNxD>Pwk%gY*9nnfvE9NyRH(X4TuwQKdqSw^CRyvwccZ!841 z+AK^%+-MUtCp+Hd!Z4Rei;I&+38^LUIl_g7%9T);ZI*VtFZbPl9gL@mUi~WXK2~^Z z+w5m2!*Khr%0bm%;yVJzT!K7SOp|rIv2(T4@GX%(it{N(CV?GMX|w}T_6^Xu#6kn& z!w1OVg;dS}68xH6(#LoAQ$C0Y3%i5|y4U(!@P~sWbpwOZHbNm{<8w?xL`1}RPJ!42 za;ePkCE`}9Jsx3y$&`4=y}`_@;36}DX2UkGwsd=8fmIx6A8TZrja5!HQgl;F^X&Xw zC?u~Mp@I6EQeCeF%IAyhOY_^2?fLe}#d+7Wot}&N*>c{Ll~9XrhzlwM)A(l z+i0J{QLSNqXYJtZ$|_)Ug@j{^J=*>!&EeodR)Dpk=>I#cFXue)tKGYlBtUdYZ1ZQSGUaq7UAzw0{4lDgW*!c6EjEwyqXw`gGy5 zg7t&_-ZgLi@nzWPo0BHb`+W)`*Y2zwI8{I%pe25&4?0N#_ zy(M7U3eq}~9`_iLRMZ{p8jXbi?YVznnfUM#@_7KCEY6$*zYR`QG^Dq5OSUIG-YAr1 zcvjU99~lviebD0euSf9rRUlHZz8EAmSd0mfu2}{PclhX;yjZ_CsO&@D3gbCK2JaZ= zDY0MH|M>Y4C{^cZ>i;n{!G$*v-%GBw8xZBT@;^o)pX-vL8l$V^q5&>%?56Q}{6i$R z^Z6ll*-Lf?#((@5^E|0B{+yp!D8sKlMAEgs)@A_FjbppJFifDU8%MIMcKx51=sQZ% zC9=}jDfV=8B$-BusS8F#CI_biUfI_;8Z`bC89chVrpo(bq(?+#)PH(zKUZz{Zl=W0 ze1R1f9`9~}ADUd;R~PDBTUq6O)#1)?&(TDv&3kN@|Jq8BFcXOA!a<+0#-E$S{Z8mV zzNex4i`eHAU5gv5Dk?N1qNCL}6@a8_{D2lvgB(IbtI=zjT@k38M#Oj}n2hR?^F_rZ zndg?6O8Mz^t(H$@3j%D9q+Cy|G9pe&%&5Bqih5z8=!Q{)^e0$5w7iMiUEzDvsJbm0 zDequ}&mG>3&X=Z@Mh7PBXNrW0jf*$M zx4HN|N!ZN}y-h<3`6nibPNiGjn1h$Y%?+&s?JZ2scv^#*;HKg zmbNm6neEaa9?M@T9$2x)9B;Sh+OWp+_$dR!LXs(+Llw;mX!1y8$ifX2B2C|ez90>l z?xHH|1%Hi0*&sF}TNl>hDhFhpz)`xkE6%T4-W$G?(|SvF-So`cg7r`B8$znTinC7a z8C-zQP!ovFI`lK~2JdZ?&t0>Voz_%jnby_@qNzloLr00p1~5rQ zbG6rvO{U1JAFy3pP!<{9Bh{66?%z*=W|Pb3!%8em;j}>mE!;-P^m#GHV41JCqgN8C z+dA7~|6U04r6wBA3pvZj!RACI`^_A;`!4uQB{%=Phpki*WYSEx@h7 zV-vRzq|};*6BV$8Nn;2dTwoc3wXlTdT4C95?{0Hj(xC}tgg>$^U2BG+42&$!NUQ5V zhD*Wqtpo66;ik4oWbkRb1fu^PAU-thls0;FY^R0aR(}~Po_rgB#llkg^V5G5bH5K# zNrSW@c=X{7V|*?N+g0g*M?J?LUfDQzGzxj<-u4_Y(08d^tMpl-A6*ZDwu!n{n6^F) z_~s7h(Was9Kel%J142G`v=x}P~Wh=kP0;y7d&?l9wymV59ym5+uFC6cbRNf844ynNl7%CXUKThPVkI9=qR&bxfH+f}iceHY}Yy1AKMWk)4u zhA;I=@84NKG_D?7*R{52Gw%T3zf-wF+A*VwvQxQVI(0~70g-Hm&z*XZ6jBui->HoG z07=GB8$IJwG$uZcZ?Dy4OwYam0mN@&qwp6uj40y;z0~f-aH;8w?GAqQ3?YiS1hExT z4%L_e^owCYoK>H>nGZr4Q4TY6D_NKodK+hZ0}FrqAgNkjz8`$PWe0!6=aY27Q<&J) z6t-)iL~i5+;?wZXAYI* zb3EF3!CJ2E+S9rq4fjr`tL(wLwrUh6Zg^fY>8YN&->4qvy2dn5$&b6Pcvx{$eoE>5 zC%3w5Ek0dk@7xgOlE+hOR>|#y9isXPw#u;WXjR9>s^kb{L8#lfINPmysS*uBahrW} zUdkNhJSTLN7LSfj(JF+0(iY9W0v|?)OzQHWq8<(6b=*e)P9Q?+3t=v>H}0eji?2fQ z@|9n;LtlMJm+g-lT(tz`M?CrRHLLNO<%B%?eALRP8J#UT)YljBk&hy(|GC@5Oot-+Ho93xphiWh0tzc~6nnlTAB!?_|!s`S-l%A742D@`#MN zBLoY4?vwup!VMtacrxQ_;%?@NmjCAZxj^T>Pg$R>5#5t=cH)8q4w`KlCi5SC;tMM1dZ;i^7eS_O|Pxlay>ZP=3kMxzbErADc=A8qg}h0Cps1(*FM~Mv`>p#EheRE+fT$Gb~Bm1Mp8Hb=0wLp-Yml(a+;Q%sn2j)O9 zYgmfbP%oS$8!PUF#38|D^wGDD13xOJ#QAZAVoq=k5*utmTv>^^{MR8Mg3U9b^ z@m^ImV+YU$hOThNee^%khDG&{bHjYP%+g!(l603>vq#J^i>j(}!%VleH7X7SV}esgDDuj(=e}5wU&+%%^+U%7T4&0^?JQYav`@OkGnGPEh``jnHmyb_Fs;OezaMWq?OsV1t~W6 z_T4*kJlXR#nfKmtOq`jjX(Rogkk|qM$_Q4e2Ws>Ut^reHbf;_hTe#qAYXM#cO=RBh zxM1tz?EG)@o_A8Ppv-@=Bj9YQs>~C;04G)dEsM7)mcsE-lPhQTV+p~=kn$FhiEr1Z z?WmBYfp;`j$o?Bj($@pEx%85}llcmb7qns(<_@w%vQnUZyn8uJ82i;5p@ z+WD`km<>W2=D3%d{deL4lQD+e-zdQN)->Ia&-I%m=Zqk$A90IKTB``0#7W(2py%U+ zC3dmcRF0D)#QnIkAm(**onSL~p?bue#2jweG?E+)NbhvN75KS1_rf7&3yoU*66m;f1j1->)CNSeMi$$B2j5UD53H*Z>5 zysh(T!#<|NxCrytC_y$cPAeQ#;B~3FS)`_5sF327o2=>rZ9(b+VfeZuICk=gjRdSM zIxjZ4ydd5aomUKRdoxcFq!Z?QuKNq$ho49};S&dHNV3B6Trg z0?7o!dx!>DSH3}vxguFLrOBg(jt=igwr|*Wf>hb5NU8+*ov?duyj$su5_-Wx6+|Tr zJQKYZ13+B`A%*jMf=Cf&&vMa03`zE^XqZRY2WCviu#_XnFFum=gOch#b&n`sUKHhs z5SDV$i@C}c>tQ2LBU8#3K8+Wwrr53#V>(6h=q_c~-Z>Tzo70v3xO&Bl-E5u`Ix-BQ z)-tdF%aivj23U>)@ZH2(03poNPl5|yvTyDbWE$FX9p+)YJLn5wsb@fR7v{=VV+K2d zLP^oZZt$H2Mbb`R=z(u*3j1?u2aOhC8+Q$6}tI(+Hq8Hop)_jknb% zgyFyC5hkUce3oXhq{BVRhWHr-8chjKa z&qVBKzJ0m+6~Z^PMzMznwB>pin;`VR7?RU%4-u}4ay7a50Q2~g5l@nQRl#sdV0r}7 z9&xEnen9?eBtyT%SDG|Xu7&VCnLE{D)Q~$Uc>X}lAEN-=?r^>Z^O^A_(_+6vQWy7?gthNBoV(|q04+IH|60Q)M zc(;3{9^7$E(QiPqb6lApmyCIxQrG56Z>(BT!*JpCgE2KJb^Zk?_)fny$~!=Ls+05u zo}$4Oh>Jn2C+G`wJ-GTbPIyG?BVpM3dIQ2fV`sM_$$DW}ie3RkL%R%YVNqS3oat1^ zu&WCicRbyl)P-sL`W6!`K@LP8Cymu&9Mq?ljKUW$r}YxZ=bk-(YU1Nia>v-n1c`jq zP_nt;@kvI<7Szt2J7s(B-o2X)&6bN}ZgB>>Plp!bQ>u|R4#e|RkaH(wp1I$Kl{Ws@ zi1H6k8W7v~YjX;kL*R=<(-@>Ki5M@=bnLSG&+cL~DvcXT4gmfQdxKTdR(mJT3@tGE z8`OR}$N%ts!Y9DtaPIliB-oH3dk`EtszA!(nI!3Ht&XjI-c+p-9e4z>_dog^tTYBW z3KNh7>tKAlsYz12(v~bK+SHuqNY(!#*Y(XoK`Y#k5vyu-iZhoMs;woUiQpCBaU{f@v$ zGOAjRMa5PEmJMV%Js`_T0a;E7$Z|xZ3Q3i3_qy?_gMYTF8I6mbF?7E=YY`PdZ|jGF z5KYUz>O7OA0$!Us@Ot^qit|)xjwFmCP*;nj{BY)d^uR+ zIVyx0%s4R!9>fvS;yv)tzTMztBXJn2k@EnGR(k?+8~=IKhd1l?9(TSIan0Y~ADq9E zJ~=5l`2hLt+rR8?*C*)~vf>$IjZlrkFZMyzpPeg!F3VUi1#^|(&78|hvt~HNvAv7| ziP?|+{o7d?&WpxGIWvn^{4G_L`6?*SptbRuM&%c?1DU^ovgTR-F6uQqLR3ULgVw-j;OjuvBHk3c36F5=0>6Kks+O#4q>bgwdZFEhMl zFUkP&ec9zlC7Dg4>9IL_K*@d&Mw|b^tTiMCYBSLG2npV@IAa}!gu4Sy_z;i}XVy?GRBs`-0yXH=6BA(%DV4$XLD7F~H;+>2Ikm`%&Q zsm67iD)W;gmG^$T`AKW_oG%x1%oQ|`TnI=_%#ln@*s_7%;?n3oHWM4C64tz>6~ovz zP_b;k2ugESRTgI=qP=8~7oG=wtoVk822-E*2N_^he@(6}5N7@^skd*gZU->?@6WFH zBrx{Vzy-hA{tdAQP*Dd#nE7_=bL$t4Avni4_~7p~Mzr$Tz*g#P1L1;-3nQuM1MNA8 zF#_lPH)n1lwi;%;+SS`8*K);^FV5`%UJg!84vq z!#j6B>}tF7$xmnbK4aeRsvRh7Sbs_Apq*d*mujn_Ky7W%lI!s-L7c`}48@24Pm*+s zzkEy}4i>E6^m_})I?g_bjEvm21kH9Qxn|2gg;GnMFh3@FBl499bFR=!lDWbp!;GW% zc{-=AeW;gUS`qOn&?K@n4!Y^vIIrz}<%LJ2v0vTn3L<)!0(ug~0@*?fbBDwfR!K|R zyvS-7-ZM84ZiBy$6G;XTySvy+Nw(E*K5MV&Mq#w26)!f z9_-KACBHJmlau;n|8BHy`b|qW&H@wYF7`3iGlT5eg7`hPwoW1=dcXG5li61U68QH} z>-R+7I|+fNc6<&5q>2wMKjNO_4TL$6y!_)l`Col<%!k98s#9TKqB;&Q-9I}xA9Z#B zWiK7VW!krhB&q8k%M-tQ77n>yPYT!LmG#_tdxJlHHeG1qX+*D}}~ zq8oJfcIrJXcd_vjV=Z?|sW-JNG%a|3vQ?KiES-*73+mzPnHoYEX9ddXh~{aGhtM@R z){mpPd-I1mDm8Uv+&!O zc@Qi^IW(K|d{Z9a=Hn<`&0xDL_kZ7C4YK3!#_@;FD|3-%beA3y zOtLqbpTX4g3rKn+n0HM%)0y$HVV;~lM^ICCurOf*|Ant6i6 zWaJfn6U`B_v@sz1X~kLWc*;peTD<%bEPnYdX;OqKz^pJDkekgRVMOnQ2;>+|^V9VL z6UMOS+e+E}8qwd3|Ci11K1Gti=awr1j)XZens!>VpCT>t5MB7HVQBUyiyd|XFuqCB z%-&=$n(CLw-GN#n1<^EyW#r^iVDN9u;`5_Glj($`HATy9H4(hlj@~0hG9i`K{b4yi zoeukYfTZ;OX4V5GZ!cu2=YA;ZIIJUmVQW|LLeyF16+5?(ku;mRtj{3}E5_Ml8kSuN z;HjIOMLsboe;EJzW#X>AqVn&tioZsKNg{s5Aw1QhkU*QsPVyx;Eu7?j5R%`Ln1D3@H)tJ%yw06za#cTyj z{Ra>@V}yVB^{t^tpH#De9*^T%N#hWsn^zt03yI67ht8S+J3e}d#N3g;$x<3uOC!Lv zLC=w}rE~@>*BEw$3g;axFSo zHPv#-E4h98Cs=tItxx5+P3tJCqSIpc-pzImo-s+bT}kLTvSd2DwJv_c2B$VkOl<;P zFF_8)Qhz-0(rwpnQJE{)!^732NQ(ppFArm0^safu%wLYxhSOA2M`r+>yfgMCK`Z% z%l8=&Z|3lRhF^tmSO^h91gpbrv25TWXhmt*b)%-R(xM=9qHj9(HIs_W@Zd-mfsR8v@rK0492GHHqz9-_LuZ+K71@ZzA(x=$}ua{?pj3Ls?ufwqa%R1f5{fDrTYoa1bS=YdQ(p@Ef=a^i$l1lt1i4`Y#NFa$C8Q=+$~d(?dplYb+$=gf$aWD0 zasHa;&fSRPq|yhE`=9KIh<+&aqgK$FqLK9F%Qaypaw!0bEMZ#LV!JeYwRBCj;~n4T zJJtlN`1Bvs0>1H$C=tQ?CHZRZWM(oF>}1x^FS!Tk#7|>Y?o%T%U-^I-nLVcf7y@gg zCS)x0zQnBF|MZ?new6g9U_5zIk7iA`k){EiGS?B0AefZ9cS{6;&8Rgy1^UPjUyF3a zbfNnW0^B77i5ZY3SBUI*-+TK;{5NJUd3qG9-T%=#}4lAVCkp6G=PpTOB{mOq(#DDb!@@aQ}rgcbM>~iueo_0M{4&l)07|w zy#pi?&;b}}>9m%F$4jU~Qm+adn#$r6741yVp3OTE>QCq?DA@*$grpS*a0y zjbLJv1*oX|d!|4T5qOJ!iBY-ter9U%)QJ|)RD{uw<^6i)CsNe{$|2>_^ys)HLZ}S1 z*_(q1_H%?E+P+0XESqeppI|Hz)L=k-^5luP1kju=Ffg#6Dd3v~&>)s{bSJZ|D&h{p z=>I)CA&{8MQzC@B_iAZie|Xj}4ts&)oiW?H*b9p4^vj^>4eF4)IpWdw zr2c+ZmTPa+I%9}juhvbA=MI5^6%hh@$q;9OO*QU%PGJAS)&AF4#@Dvh|6}cH=TOne zr49=^l-DYk{@W_&_TP>G4n-o@lAOrh*_LQQx%&s_x`cX!1bYiZLH|e`y9Fx^ve^Sa zkDe5|2v}vnORz^m&`S6H3~OT)Ai5wUt(@%5kp`_XAK5A}H%_ig>U9w7(*Hq%HGG9Il^@_gJ>nEl7 zOiD&c$x2E(#mvViwd9ePH4|&WKP!zZdr8T+PacT3nW%iO`YAv2fLEd5+)VDqZ+ojdmv*jn^-}vy6 zkF=4ZmAXpd?rCLVEd&TJu+=Tsm)3*YolsD4&)*Bb9?*u19(eD;k{qoJ-@%d@i9hL} z5cz|k{~jE-nGR|z`CEgCxj>mxphL6K0Y4Sa-?H7eS|o`98T8d-0D(KEL2u~Ezl}f? zTseNPKq&%mZGUw9AYkTfP~MM|HSbslieJKii+A;|CiTqkPzEwa<@qB8K;w%OaEb#0 zicUB76U)R}q%TeG+XFc6I4D!qA}?KfjIehFK)dnVvpJWbctp?IYf(n-s{eZvTia`P zi6Uv(4QW)--RY0}42{PYan1M-F>+%c{So+p)nHkCqap18cBlU?QE@r!dvkeRz{i&K z2A|DYd0T|cMj^XQTn01e!qiAY`ym&wr0AMhT@P-Ey_ln@ut=(QDCL$Y z$ZJYRKD2221cLpU8ULWl3Hc*yO39#hJ;FUjh$TJVS*FZQvcqNHDHfXZt0S?CGcuOduj)-FEsUbThP zQ^V)=20s`Mh%lqk8>j^z(PBHS(4&|8jxkq6(^ITUt)wzjHWYp!=?!3(L~Jo(mF0$iUf@ z%Hnh4Hvi=E4kX?kh6r6+%7FMU#Npp|35;G?srnpv!~}{+#c4-r@eS86ZhD5FNHjE4 zBq5pE2PQeV;s`2_!e6LXhzoEkW-TU-PqpT>4@aOD6_QcA5dC@B>{2pP}q zbp`GL@jQBqtL`@-F0u`a*Fxp8qWDhzjpCWDIWqe7nDjl573~a#GMa2S8u93+8WDP z&4(N5cC5lY+5X-~-~D{=X%zi!;4UaeD+z-moMT?MiB5F-bsa>1u@N;Q(**E#Kfk>j ze4Kwn_avF7DwDp+V*cD6f^)xrlAG+TrXCvjcpoUkA+4=>`#gaGrB5LkvR$HumZm^N zd#{#_broe_m=gFExyjW6!R2fLCS}XfUBICiKWU^jyUQ^LNIy`Y&l<^44)O zN+tl-)+yI@!Uz%1l)2hxzQznKJ=g681%sWk#xv+POj2$C1C*!?OTT?cB8a*JYRQUhNS) zC+xj6H6&`L7615gOJs4e4!KOB_+x?p8KD!RqG@DqEC36*tLutX@4YGBn^|Rm?-33n z&5>BArv5BrtVIhs+FdOxM;J?q9O@Dv!y33}CwfKT;7rRV6`WK+QWAD$xrisfwEKgE z1x=lJ|6pL(*AOD#CACP<5N6w&ETj^3(%uCt&}1%je3N^bKfdk=8r@cad+EWXTtSXt zO1>#j2B36e?7#p(U>3+a$E1xxiUjJO-qO+?*6Xei8-`LwY`m6!6Jjp{;x>wx&x8K4 zbc~c$%L)6aJ+qj0Spg%_11LpQA<;A`koY z@#9_C*#E4Yl{w#dfqZ)Cqjc|i81us~)(cp5Bo1m2&-?c}Hkvdp4KKN>s5}$?#mod*d`)f&JlOCfDSK<@`cL~GBr=X;yN+mg)0UmXn|M?v->2o)A6cEgf9ZtX~4*iK*%Nvfv3~`RwSdgI-_P;qu zDk#>EIJ1te8wCi=5uB8D5rk`+&NF+RD{>m8-ZLQ8$-{sT3=hz7;SPLICeC|;>N?^) zu$6PHa}nLvWE%KMpSJ%ZlHzhVd3_5?$tQ+Io&N-JH8S0?&o>uAV9O?i@j%jKmNo5jh}f{07)ar(z&#aQZQ>9d;;bY6YR=6hsP zVNQRsjqq7M1DCjGL;jj|i&*2D?qOrtX1@QQ0VHGtbq+9P@P&jWxgS`f zd3vV5wE$OivkHB%X7eds|S|Dw5vJ!WonoyQ;OLhdb^P(34ZQ!cv z_|TLG_Y=q#sAr^b(D*+_Ic zx>0PuHUNs|bpbgmExyi3g@I?FkS{rb;%k~X$7kTm5t#|p6(vhVo#ckm; z8gFOtJ+cQgXZY)iTl&vE3ntBx@H{#~T-ef&jXfBaUK#BjADN~UNe$5f41-%YqU%u0 zv%Sa;pc^`yUW?ccP7p#H{5vr{cLIE;(8;i4wfn>J~v|196>^M!4u zKH0;fB6D~C=glKB?&4eUK1~2hrK$a|Z8{vT#`ij?#fzW>*i<#3!EkenVE#)+OEivk zbb1Cf3~t<5L&G??RLcCIVTwjdvjz(r+h`EZ{n$(sl<-Wr2-4?!Gc$*d6-*t?pB?Y4 z5n>%aH+rW|C`rfs4G6S~c=$1j7k#ueU0X48=I!Bw^ej0ZhHE_UJbUrGpO!~f|6?1f zn_A)c&x~PJH?KL}$$QPa+*SxCTJwtz3!|JcCXN=s!^0zgT~RXfu+S?W$w5WtrXN`$ zum6vR>hr6_M0Hp4Ad=zyi%on{3zCth!<-^wXV z#mtkkr5`DiKB3H_o+H0A(_XzYP^pV(<|A7&`}6EQwjJU<(OHIBi|)v|d}ewMByG;s4j8jze8T^$8TT9`^B(%P&ucmrZx3O#WD`tPOVE zSNGV#NsSl~6cF+HwH_CCJJ&xMZ$F%@Lmc5O0hOY7I^^M?!~di!hld(SsFe3w&bfv8 zKbdJiu7ASdaB)b7)XN*i4uAZEM6OB?D3BrpDnfwMGvi~Gkx1r`>#OJ3=!Je5&UK1@{K?pT<^x;qip{m-6{{XBJk1nFl*@ z?nRIbb{Q|p>xj&sFSI!o(YxaQswJJG_A1eYhp#Y6+M zUG4;F+pBVm%^_tM8foekAioIP5}GvZvV4~Xy<;E~RU|c1#rg|B9?v~-Gq z2lT#B$ZxCW-Ufc13akv6+7$?l6DAcevpjG46P-tnS<=`={BTX?nG6nf9;*0_Md*bd z>a}cTV7&!Tki(@I*(;MadlOLWSBAQ&1wiE+hGlVa6PWvI1DwYXgz^^j35CYAT|haj zM*gcyej|@q%kx$#zluy*yU93sAE#$vimwPi$NcF$GyPjP<^NAWE zK4Moq*JImldadY9jq4QCSa^^sJ)8d7YoCQ;;*ld=^Ks2f&e%B#&!0zsQI^~r-4IA* z7-tIlj4oz2CBp}pl-Nu1KBzhK1FSTE$6PgH9lHS+(-RK7)FY8<|4DsDfcQJqftTQE zqf4e$?I(o>2XPCV5S@HT!x$;Pt6!{%=||Rn+g$x)D&AkuUWCG3T@d%!N?V&w>g(61 z<*svgvsC=t&i@rK)zV^2Pg8X@=5Jc}&>yASuo;(K&#)<-4b$Z@dtfLaxEFK#V#&F< zwWwvj3I5#td&%{&KfUU!T~asry>Au)Ma#PVHfUZ|Nsh>YSh)yZ18@Er18?j1)E@)< zM5|66%QUJb7xk@m{#u|U-tJ@d@z98PM}01WBrjUB#nPU9-nCAsC~62N_TTX^g%ahDZEErJo)-kf1Dp`rN;OcpPGYI=$ zBu+&TeR0w+FACJuM36%bcLj?;Cu74hi`hbP$JYA!;(9_4LV;TkSuK(Wim_U|@r?$d zeB?tG7Secn`u31mOwlc1XX4L3+B{i*J;4kKDetG{{=UFR4nH__7EjN7xRq_YUm#8$ z-r}65L8xx;=Zlmu#pb%Yx{`8p$&ZVtr*Tf{iNDm9n4SiMuompi^);n=+v|72sLoHj zT_iiV|Ng-DOspcVQj+iLF$HOTt*dcDB_^u*$%fqE(~AcIS=<6vaK~?b4_vH}IQ{x2;7a)oIjBTXtpNCFZ?s+(Ck~R|hT$T43SRU$L~v4XSbBb9E(G5qmATu@)97Lu(ur{y6&Op|LRrv?;y~FY-&B7+|Dsv282& z__3c>_K5}G*b`E5nBd89J$D>nZGXgKSlCCpn;6-$@IF}Ad;4i)Q_U%rBTkE~o9q4U z$6xRrx_IHX5k`LT_7gYREx?`&J8gwxgT9%Ktbrv2mVH0`mc6ZQxWE7IsYHqQp5ONv zpZ=~sVZCL;r}2#(XJ!7gSXPmhFsceCqNJy){6o5jh3=dLZFfK}PfD2{$DdxHb__SM zP#wpLF~0svgzduFTROH&<@btdk5Bcwq`{~dSjriLH97r?>Eimh!fP>UMRj6p(+>^j zN(@Y=hYu<%vmd{t%u;K^s%ak2v+yoasbZ1OARoUZ;ii$ro4TVCTTbnCB zg=nuh@{!ivqiUXw6`FFY4BU8_i%?`30s5gUOc5YH*r}z7FPJFU$tcf#V~52rfzNyA zV?hlS8os$CJ&IuJbuQ{C>e-7-Q5=^&6FfugI4=DATi-zY?}oT?-4sh~*p$A8%JJZg`=VsN8nB3 zEjbW#S=dHJxf&lBS2Jn%uQDqo1#`QxS$xH5_V4WohKn!{G`8IKp51E;%C_4oI z@j0^Q!$L^(`q5`(G=FYvLL(hE=u{g$OBY2p8yt+r=o&uXIGkll1dOhX!;XJ@5@A)M zs-~vvzBn|Qc25VNb=oQL;31>0XSt?*5pT*zZtWHe`?q7!HRUB#X!a(W=uoiV!I|^( zY&W4lf4F=m6syC-^hf1QE^6&AC*FG#rx?$55HX%Yj1&~Jo!(C07;%~{HL997!r%a1bj+*Ah3 zi~9VPP_`;AHm~z6>^cXDdsRH1(;vJzV^<$_W>6=Q(9=|3FP>PAsdW1G_QB+EVo1z( zOCt*|YQoy`kT3rXr>xtgX|Ft~zU)5?7sCZEhL?*>gEn@Hq@*MTKJ}RX$7ex+@;(lo z^yWmDJSqDzN2Kx4%GC&sDBf#x6>wqMx;d`LlHce%S%)eozA2vxwhfLcH z?!`9v#>XW3qm;y*P?$k?zxwTyP^#IB%SHBoN~q52U5Po5}D2E{4$ zw}!GLEv&lb{-k$kN&PA>)?O3XsENI8YO_0g=!}8nTGrC+;|!{!VVkYY@lmOS=a~jx zBI%JFVI31T5!+`<2cr3n0)27ZN_)pE)bY?Cg1!1UuPKR0JZsWxvJDykj!;{CWZJL^ z^av31MJx?+6FrqZ!fe&0rKJba+2ym>xv)4SNGYP&MsQ=hNqXtS^(tFI!At?1T@w%$ zL(c92&c8I=g5ve?!XjdtqK{0}h=M0ix^Q7Bo{-~hgo`s7UGrVO$H`c1f-;m)M!sIQ z;3n*KcK1Y~n{$LwUqAWd7W5&2n}s8BKKw^Q6sG7~))u@%j)`&%Ch}12*nS%81cAGO z*_=VBzsl&HcKG-gEh~$7mRfME^#11gy|aHEQy@x>y2ep2Pn$wNoN?3Y(=x;9hvMC0 z1~FAl|F()ci^DYWFD2Xrnfs_5uDHE-P<~w4n;OUekJS>;u8rOH_V$srwJKAI6bglK zjD?+MQ%so~en8%qyi<#_>#~KWb5I2b!GjlTpF%KyfR)R+ z3MfjHs2E5@d!_GuJFl@tD&N(G|7$PK#fG@lJtWH?a&FSM!}}d*8#X=67bXBD|CB>l z{z@rz|EH3=cw930=fCk8@*w3kilou3QVkC8We3{W*z|Jm2N1bA*hn^fk$Fek72V+&7}~{RG<%2zZ5div*jVd4rC^fva=l z4jsj-#be#GJM~LPV91$$z^T{0LQUs>z4F5e2&9Ha$kxh}@~00%HNFMfZrMg`UQo8* z1ad^8L0O5@`VpDKY$+7o*iqPTq@04M$M!BK8_sWPH}I3Yvq@rd=$ufy5el<}!ERJHxtboE=-HzlO zd6%C;8d;joL&BiNPGJGEM9Fx=Y+wuo#QG> zq>K#18o}!4-CtPZFmof1vXxse-z$>hzO6wn@UGrxz=EmV zjte{Gna8^vPIE|^U1j>g@U}e2tN*XJoqWYb;K+!zujn{h4e))cY$?B8@CdCcuqNV0 z4?%_t+n_tdAiR*I1Q;}T|8xTnk5YYQuo~S@9TX$myLm5#7h`a-}}VZ26mrY0n2(ksf{W&$nt8BbA~b z)ZS~~z%mPVZ=kjLj>4dnSA!-Ur0>MBuZ|ZBZBcv%lDJyBZDpjhU~pZ%t5o&-r!tdc zVR909I|R3?vsrRs-4)XUS)JW}C$O`Pj19C-kEweaiIgOlD=&qPW8Bj-1q8q~QD^cX z6QEf~0ho?mYlVgHwfQ&j_y|HkZmfdBlU>#c3dDc{D`CgEwvTw>qC0`iw2FH}kM`rU z=4GL4qA-HXZW3!1p`?NXL;6fR}`qzo=PQam3wB zUVK1nWXS2f5tHV?Ye?a5TUz2l2^am^{84u+GzgTZ3Af2Bk#>r5N`iHY4AwprX)5o> zSV+a*VZd4>QDVkxOmz7bkmy?6*qIMvgjDz2Poo!@G+Y_3c>T!z={sWzIhYy&)hb^A zrpDiR0VYaGt1!H;}5g?a60=d4LgeZeyLzakuj$yfbwa*0xm8>8C z(?I2jfF5}wMH|}`Cv74b9Cgmkkt~mb6il{(v7EV^e{+5=MQ%kI)G8^D zW;VW2v80FZ3bC&CPn9>vbRDNAo|V>puG#i3yEff>;c2~xX;zDzxT@6}*XmWdb29YD zm6D~OH%xWDBWs4geyryXIZ%;gOD$p@F0>sB6&gjGHWl{PJq_nKo%LYz!|Cb)iSg9O zf{`u1LJ(^z7gnPuvOg;~XEOZl2R?FxH!fb>%UR<+Mt7?9$d;oHU3Y!LWc3q5t}qzS zWGabfy#<4=AU^Xdz;s+GfRRSeYI)Mg=XBzN2;5_i`<~sPcA5dqq0_D>R2(n-EP-49 zok;C`Xs$1&=;!D)24S*}h)5Wztm3QmCbuv0q!@dhx>xpB`2%r&+#H*rg@*+^C(kuv z-Jka!Y{ro1P0Ir3lIAhw*_PkWWv{VARv6YZSB zOsiF`s+E!U{w_~iw6713Q5yV67^#dq*ft^q0y*C1V!fccWSKK-(hk~krXr0rt*P%ia3~4;*he)me;2l*y{X` z?>nq1Pa3{Fv=8TgdFcRcQZ<+N@;vVm1C$26VMWz#CdUtZ6(sasm6*3D_twlxd^T$$33rrMEd5#(?#LT(&9(dF5G~;pATBYEPl;bmy=V80 z9}mi?myXu%X~e*?MbNLzlmv(Ty!!KGnfRC>1KFkN4v;}WWyr{vPM-FvL`C%N9U3j?MI2<(O?M%*BU?iJNxl1&o4OmY-n8m zBd6MiNm2L13^ij|R$U6j68PG#$*tCW-LjPk$ONg+#mSI{RTs1y35LkbM&%b3d8|(0 zf%-i7=Zr5d+jDJO>O!fzWW5?SaXhs#cI*uXTtF9l$7cXrNz9ys1nQ`GUTGR z`r|rEj6>h&-VbC$U*I#9!Rd2jGlKa4^=7up&3JmV5@&c}p=8sV48-j`=!?7W84|pb zQDMxDwSORNM5OTgJMjPgeC!JWIMhRtstfGK5ys06xYWg)VJ*w*;a5F9jJlO^D4PZ; z4+c_JP$CgxgKL7F*>k;3BBKe^Iak|7y*6PvzC3fAu*Kw+$&Yz!mhW{(hQB+G4vQa= zIj1g4whz0K=!5+Q8u)?>9T*E&989i<6yQ9uZg-D^J~si)kR_a74@hK1Qv0gQ)2njL zr@mKaMx;&DhoB{TGtX$R5Uj+m^=3ILZWWa_FfMFe$AkN(J1R^igME+CDs&II+7L&D zT1s@=J2vch{W$R`K=f#E=E7QDf%!33@rK6=ymh%-y|L`BRuwFg+L`z)k2Gf!zU(>XzR+~v5rFF~_S+_sdRR})-)q|00N zQg(h}r@5n_u|N;y2?Nn>(ps0VbD8nFs=BqwOm;H$M2w`2Ce3ojBn?hj^=ZuXdW%YS zH>`EBT3A)+3bpoTIx4z8-oE}CKl92*Llo-iL7z=Oce->`R%p*=jy|KNcbQF8g_y1Q z_lbH}?X$doM?OAo`jw&BFzQG=N=-2-8QPo^)mc~xqWwT3d1|Z~NRlm0a+#@7`TVrG zy+_YpMzT#yd;7WNUT$z_hn&ITPj)*sEy$8v&r#rH&rgj0(8$0H?Q?c{w5ybDY3jGXpEbzYsA>N) zYj6pV{%H03UyfB?o+M_`SWTm(3;=f3($}YrV&3gm8 zdko@qA;yd|#m4Pgd(o`+QGzCXZpf=*k#m&bS5UH1B)Ok3Zqy~<(dI1ebh|;hqagW` ziyaE^0j|2@+PLG56#@OqSE{m6MGA){C&Db^y_998ejYyZ@`8}<<3HIXid8n zPD)OWp%cq%cA&bRciSq*;w$EWISBjA>20{d^8b`42Cxi4x4L6)6~<-G!au;@?A|Z= z62T!a(9Yr7tN0@^ROSYUOITy5Z|p{IoZ0or%+G~=MKNGjAf5lVJml~1Z)WoyD=Ir` zw9v{tp|bM)33+*1E7dc%E5Bizl_D`R*49^;=i1F8sYGQqHVY(_*u{{L8U}w~?-{X(8r=d$p8wT;V z2|}CEkIwpnXEc1%tjCMog zRfX;U_dD2>`iCIKf&)oH90=WWvPx`1bzDv)BDqG8Sa>TZ`X^Dr+$tVBtTrRI=ay`W z_6#oX$XptljS*(yP7R@WnAs@TRtsF>=q&}(SlQ7d%(damlUf3TgcBy)=71Z|xmChU zbKm3K+yvp_5_Y`to9{3e zlV}o`)}F(KwaB&(tIaECZB}EJ)wu~C`!eXy3F%#?pR4xqlRfk4MY%5ek!4aIvEoAA z{F<^$p@vT5LZase?h)C}IQkNkQmTiq=*p65CVTBWlk&wnp4=#uu=F7p5;HMSrvLon z!lQnJ-bEcq#}uqcdJT;*&m``NwXXJijBA%|(Sj&>#cE_H6xKFj&=q2O`RVT|Yz-~v z6gHEkRlpG%OW{35f;4dW{ZHBKo>eZUSBB2c&idwI%1@XRt!-^*0QK)OLx^Q4o<{cY znoQ9l9r-X-mqah&)j~VxhS2E9n~^y5m20^Ztl49oYNtB5YB33G3!Gx!%YB>!-fMH-4FXy8lFkFr!|&ZbfzMhsj*w<% zAGPYscmw2m)*Gkn+|5&tJbhXwgKayJsWg$!y{C-ZAVhW$l_?W)I@9J%=v}=)n1waJM4`>r;o5s&nl^M^R*R>-m*Qrm0{?* zR>w;a8jl)z>bYcEMPf(gBFaZKs#mWGIo`&WW*BrHpJ?h93~J!42@5lN)`ayY1gdc! z7ogEZtxQR#rpw04%16Aw4$&VkHgnbNFpysYRYL1rGncOWnJZ65-os?cKcjN7U zoYK;%+25^H{3+N5i*5Q^mvwG)VI6v?lj+{kzztKpZ9;#lS~vQDqgtx5f=1L^1nXBO z1gZ^}yU)Lu$Fuq=%G0PfrT1k*yS9-;8})8qkVY|O$c8xe5NPLDMVR*K5tQZXFLUTc z9`Pb2E4{WZzLRdE>C+m-H`Y>oi{SBu!3gm7si4L+X5DPH7iAXR(C+T(J5WoWthB~B z={~5*(bE>g4^6On6~2sl0aB#L4T3snl4ddf#-0RWf)TV5HBW zyu2aaNWriD{Ti8hmB<5mxLUuEv#*v z8P9d~^cgem5cX;JIyD-}9>!#DAGtjsxRw%T9Qr`YP=uTOv~D>6>Je#C1u})g%j-OB z0V?(nJ8d;w_D7AYp(MLIo)~v#O^YEj>uB9~KI|Pt&*bawg-Kjcy&dEF#=5z*j!Zy;mb55c{+XV;odc}qE|=P?Nk)7vsL`e{Oz#7me9hXlclLoS<8 zFaq3eLO?Lig2Wy=Q#Sq>>%-hNp2i&Kn9Z;vI?XT}e#e%ir2 zVv~^`;O`tHlIf)QfxuqcDcrUNQNa&bc!Z5BFUsz9Saf3>m~OMXpSHF)2xt!XXm0H3 zDBh%`?OH~9r_5gNnylk&dj8WOmUlUwU2CaRk$J?*+sjM5r4{b?+bfbC2G<0k6GNPB z-sTC?yPGw#Ew+Li3=YT%!a+T4&=c&RoppHHV@8sj`@^~HwM^^m@-}%?S5;Or(I02V zyIr*Kjb7CgI*OCl)5CSGvgi2scFCB_7K1}<#8r!g$0$OwuGCqGd}<#9a^7!Y0tvF^ z3n$plxE`xY@orUvDk!+d zrx`!?`0QRA`sI`&6l>qK5{N3dK~-p?>%8mIcoEv6aR-WRXzaH<)xW4AZ)(lc71HFXv_5Mh6zO)_QbOR~s}e?|SBm&1Bn(YR?4(HHt6aOZ0PbsdpX~ zwh@0xnVxjFuwgh)y376I?bt4 z9&UpsH|+mdDzvmzB^xDC zN0IA6u=Qe~uz@bckzwc_Z1ps_dX>lQ(|~Bju#wwTlAG2XJwjHAaj51j-^^ZRc+OFK zeB*4|`C~U^v*+w#(u(FEsMZurN=`%1+$|tW_5#h3|5~l;u-fz9WgJw4puPF2v7JNm zYEXmuh*5998ZJMNP33gG|2xOP(LKHNW+V+SEjs`oi^sAizaWM+|9%Pw>Y#k5-AkyObl-Cgnd|N z(H!POY*$0ent5zA$=KdGc~;lp7Qis}o8#i;g&jw>vYd=cP|N64psB4rByIv0JM;v@ za`Hszd87CaL^msy^^+s7)VgnHSCUt!tmRz~pO(r3YBWizC^~heK}XEx3Be|mhD2U6Fe1hW9~O$0f956@VFjJ;U_I)DlW11 zQ0>>D&qe};BK#DQLYpAm+NP)1_Xdf+I?9zu5jOAo+G@&0$b6EbnGhkj`YXio=eG-P zgV7doSi{6@WtMUWd3Se`^kq=wp4q8t3+&30IL9--CN)h3 zEEVp1X!O=UCcb=>W@Dj3!nn?kb*yWFOriY7S4eXnUOq^xRjDJMu+Lzo4OZr9kMwkz zCC^d`jgM2t?^Kni%4Y=e-r9a{6W2{aJ+*?5u;h+IDIcMs&}evS6_o&DKC#6Qw|vRYGAomIt&qdEYaeu8Kj6ryty!hd6=PwICrOyZ#>X) z{RC7hwaI`e;6jH(hbjVbpA}jpS4B@bPq`|$26}4A zO@;aGb3p}7BqThYbBXl}hPk!t5A@7tHp@mT&;HuyCzj#kf}LicWBPKvonw#cRT%Hf zmOeQe!5Lr!|w%se4Q7jGL2|2eiz zOKOf=tiWkDc2`r6MY4IDkywt#17~~T{nr1gp4~f0TO^gHvv6Tg92CXd{rKpiMvR>` ze6R~!BN*o{Lo)TlO;of(%CJ)Q;Xu6id8`2O=~2Wd^p9M}+|F@F^%Ns%uHrZjh@G0i{?}-cEIek?#_Iy6is~F`I(WF&z+MV-iSpYn9|L0A;{BGZ?9WCPhQQw|TV!kM%1zvl z9=2}pXg4A3W*jdMo&4yW9D3q_ZLW#F&)9WOvV3Vs1n2Wh)@ZYa+AvXDy8!W1Hevky z<)_+>2nUy=;j>Bqi-Clmo~uNuepwD>zS@1~rN*Gh+^%jw%f%TgY*XC|s#gOP+GgWe-$$WI;~=O?R2oo$vU zxh6{}QyyL#;>Ld1591-Mte9di4+T3HNcjACO43VtzvNDIZ3L&6!$c5c3iX{wh{IYc1XUeKXKWWAO)Cu#UwC8kh@kNb!y?#H!heNGQ9u4e zJvjRQ0wJ-Bgl0`xX6_kis73x+o!SM-C4~rGdP_$-a3 z!UH!f=jfajQ=a;m)d&kd3x>b$fpi8tf00Pp)voXqWg+!-&(@4lMDDN?pOu*Sp&eum zl~;QfZoE9D*UdGvcU+6o%_`S|E$%hQNKaoiwaNI0&ECmPFk6EsNNFbm1y{HC30w*5 zb>VVVkEbpSS}u4Y!PWAFO>UQS4j-zm^+{8RQDx&sq(JH@=Z+#xDC`hg79W*y(0+Gw z1NN)Z`l0DS_*s0`%bZJtA~ukK@w+P!G_W78Sls%A8p_vef6BZWEy3qqAX-~nhY4sW z&r6ccp85lg^R-3bT0m!`rpU{zik#MHy_|pLT2QDzM<&R4NOF-apCOdt;1Dp?Ht+8; z(|WwTADl9DY>_9q1$1#;1Z+FP8q*mE5wU!WMS=P~6BpLnI(-71stC`6Wnex{9xBLi zfdF>4Mc4K9dS?VfS^E>sg_Y~3N}#@!BpObC^vC(}{rzY3HbcGZw>6+mQp$FbOTRcn zeIyp0WUlPRsxqfYlrpRbo| zEh8cA26bZwrGi-0nLjOtvb3~J)}?vu*|Vp?V;T+I#aJ|C_41_4Ab2SHc8@5Q_nN8( zW&@2-cNvl|C~_(hOP2*{zh4ljZi;;M<9B{?xr_<^lwJ?t%$`!>$cJFx%PHx!SC_D5 zeuwCrcp?z_5DYYy<3I7lZHSxtbr*BL1{+N$Uv>P4iB@?&MXl^I%a%H#2AMe%DMvQj zNjwq7|A~%~vd$6Dw2Ax~YNAz;PYDDQzD9kbZQLL+azHI(t2~bktj5k_be}~FeqyEV zo+4o8A{0rj>{@x##aD$U{Qv9R+`dJluCBkw7(VNcTGsRar=T={D#5O0%Z(Lzsp0CW zF2034)_vb$n#vwoKb(D|K39-6Y+T2#=%QDGTrCQ5vn0l7&P7fx0-TGa^*#^B>ESEU z=iG9;y_UuYcMfMNlDh0l8v@ZSv_3@d_{itaBe(WJpz_YIlAine$lQdm*Cpq@;jzE& zfVEU5K!LHkF8s&)XMt?S!mc}Z_h)wONxErUT5r%H&{}8Er*YR|In}t^JlXC_y4a?b z6i$86VICP9GxpLe6t={(3u;s=rEAtI)m=C3^_SGo$-mT-j^ZiUgBsWwW`wui0T4;+ zDdu`D1gTTk$P_z?o8wkWsB!hqgy{-N{&5|cyepPKxsj4h^Y9M{Q1>B!jt|1Aa3co+ z=24QK7q}^_urxh)*N*wf%hnONY0@JS0v4ix5(DKNkGie%e(J4>Z0} zqCmBau*>_aIYU>Eq^jk$zsQn(2#KEs)-AA&h#P6CYPtEVv)wI@?JQxfN9B+9epw3wdB z+!hcJXbfrFmK=71T*9yOM)e@g(J_zbU~R@t7K>nRnWhtujm@-K6g5gNFCYwyZ z?Ukw>Zh09RkGihNq!|`C-L-hIH~+||SitO$VkN88|T}8$lb;Tn#cAH4?7K7#M)bzhc?* zuRzV~U$`YLu1T&`KzXPm^e7tVs;l8z9*7tItKNYN+c7VCg!!Z+7j?PdGjAD*o6b-u zdQ(8>a^(u%5=yaxFk$eeAv0}q(kTgNn959xkzx-^bLKywNcvej`@g?Z+MJ3e@8vl6 zmHB}NuR5`=3FJvxrZ#@vM@~I28WLd)Y?*!~r-<^bC@%gw&F3kHr-L}>ve7XvGIjrn zJ8)^@VwhHGve;_Ii0@X{jVZJsauam_8I8p`0tbNY8jeVrnDGZGEzrx{FxKUHO1yim z{MjG}KbYKbS!OE>=gfMd1)w6}(BSV6&WF%)Za$v6hnbw3B)&eTSrx*@Fa7eCTZ*|~ zi~Z>Hj#v`W-PWT!^*Uw0>n#Eo1COF3jt2c5gflqI2?-Rv;~hpRfmXgktqq2s z%JNiGtoNy{DG8xW>!455!FhCKBox%Fvu?bwK^|YGZ_t)zZqPzna~?ESNz4322O;09 zKEvsLoTibH(cFc`Fo(XXnyAb8GW|Tg5m#JI_c(u&xrr`pPcLlG6NUhxtD^W*U=R+? zG9JcW*J(OR7Van(_};pZF*ly_Z zOSV5P1%p!wLm;CFcPU^Cp8I>_(;%*J*cvi1T)zx2%kG2|1o`FJE))zNEJ`SQC%UcG<$mEihW(1TBO00Zelr9fC zG}0Y*;wvv`CGt_87l6iXZh>b)zf?{^+*{K(lgM5(Nsu1Fyz;o?9BH! zLxpd==tQK<66a*tX*fS)s3_$*JciejK{Wj?7X&s%y~l!KGFZN@WkN1Y8A52)B@o11cS;5O9-_s=RQO&6((>}L&82w3gsfN( zG2s{Z9_ZtM#?dSyh0_Uy6w$-xkD!%e3^)BB8WTjvomlUDMQNEE(8`XnV2VM1`Lx^V z!TGn*0n${7wyOPpS;~>OZ`n$2#NTfgv4;z)2R|thIx2p?wlTbmkra~SGLSoWs*9DW zE;xzbw8Q7~K!ckHPucCt8YsII59E6C|?`NE0O7RJ( z)Kulym4|8=gu?`ImTWh;rNG6teM5yXz8j$b<_jT$ZNPxBtBKbQ43O^hxHPM6gh+0z z-HDb_dKN3~fbCKIZL6Z$qg#h*;RY{oQgWHZI$HeY69@Oxl3PVar?v*deChp*cJ6Q5 zm;_W4vsEGA0*%HUNuQrEeJqH(8=vLYq@3pr*Oj6BEq9NKI?>?G-1Dmwt0J4$aUS|$H6??;Sd$mP zFf-_L3@!a)@Vak-a6!u=g=(z*VjUXWaX_-Rqk(67HM6M4YTq-C6D!}5W4t2SNV|}` z?ny7xOOCc95qLtjdO`H&`#+#`>#8e5EiiAIAlg}g1MPJqt5JiQ&28eKk7a#zo@Gc1 zpSyJt{C7Z?spr&h9dD+e*%-HRp<@h8yFyJSzyA<+vtBhyHTZuxd-J#^@8)f^{n@P$ku|2%BJiP7F$`;Dxe}pfq;StvI+#kj@CzI4Nr=I0)k2u6$v5)NZ4Fhln6*z z0)&8q0Rki#kbOIIC&9MwdEfIn=lGW&AjzHYGIPx}*USVQiaITLvO!k6Cl;4uxhXB- z3r<>Rzs|Xc)@xY7Ak06|Rj%}7C6}lyy@RnW?>Iewx**;3R`)CobQ_iVq}Jv+b;cPv zIXTcF-i(JX<2g{S#{6>fO!$k{s`lPLK>@73wJ2|-*nvAl!ML42KkGH{eV*99{hG0S z7l4!m$+#XPv0eQ3FIb44AV1Pc<|a9-wR!YQ9@;&+*!cAP8M&E`l?*;n{hNK4jO+OXHAoMznf}7m!uVQ!v`ySvA)N%KF=%GQ=Tc4gKEEw%OU)!TIz%5m z+cp0$%SP|hot_tLU;oloF&pE3It;C=+Nr_HAiOErU4LHiYSZmglf+ou%CWg88+K>| z`H+xs@;5nSh8c~hq;8X0lmlHoVkE8o7{_vFC@ARa+C)lxD>njlp+j&cn>~73qku4U zR#8>eHvXN3L?S=P80CTUQD^5yFv0 zLjKUHz}Th}R8f0(j^N0_qy=rs)dm0aOtj-~xy|L!O@+d*cx7f7&d;ypjg0{fwj2ZP zIgBsuM3irt?SWs9zYssCRBeabqya;gYy$20XqXVvd|TfgUmYXG#f@Dlf}2H1{Ocv$ zBuE`D7(vLFh&zSBFd;c)9HPtU^0`#GnY%L>;E4F$-}il~Pr=R0&-`xK>?7L(U+zbI zAyRm@T0R^iBV(B$=+)t>CI-1TXQia3ZbzEBz*JjD=+cm3J}l9pK%SWjT1rq?!a1ik z$sYibfte)=Pg=kB>c0`=zW18>+=-K0A$BQ#=*GZ(xcRO-@Wjqw{O(%=QmZUZ37HC* zFi1v5qM_S-om*pn(s}l)rRS8n7;pQ|pRF46HS?!0zgxOgy}0xV(8<*6qogB8WYlsj zHY69fos`zmto^PyB=BG%C==MElWXqOX-9gOCu4uQP_O>Okz)VKzuF(@MTJ!FYjGfQ>>a4@_6Cqdo1BRc53ls6nTT%73Yx ze|ay-jlZ04=y1)jOdNHo;GBtJnVf~~Dbr1Uwi3fA<|9!h?#Y{nwUAtN#n19ho)hmObUv%%| zf1jQSL7&1mcMo2D{@}5>t~MTh*fp{Affz55*8 z^(RmYk}iKV5)0{E(C_&GB073t2X4>SAD|xXw!yb=>2xh3Il}w#`E6U@tXrSj@aI+K z2Vu?szSzT(j&||hK=cqj*rK=Fz`Ym+im zW}qcj3HyhCwVq+yMr0I6Y5ePA9gvl;MfpHP0>#`{K-RSMyL0QzRw*fzu)S{9TzCj5 zX?Mlp&QM=EDPbFXlUKK1coqu~Sw8+Ck^Hp6OmlK_^`!VCaW&Kce+e1}7SXxjH_Wjg zf%ti~V7+=8p`I@WS7|{zeb0Kx1&Tn<6ehf-C(mSJrV~y^@+1+kKRf7k&CErxBW2W}kNc@)a-Pvy@I8K-o)G7jJH^Jw)WAUFgnrkkT z(7)fj=^=QS^4)$wSNh#Z5tbjIX}jfW8cRqHLS?g0S0si|p2r z`3{32g@UY56d`kwDm1+Z;?c^CMk;MI;-2q4G_$K!PmUWr-X)z89&V1f{L7&+I7N0Q zk?(nrpZ>6PT%a)~yphJQ;??rVSk^%HVs`Z@ z+27LETUMA%CkbBJMA0sh7QR8e>9OW2fA8~ki_DjgSp)6^qZ(PaX~x_7ZqruoNGbQf z5fEo5bNuSks{Qvzxqp}$!1y{yH(E6ol0&VEpTY-D{z2s1y9eK;Uwy@|m}~+8F#EC5 zkE$qJ-p!xYWo)PO#_SA2FP|xS5@BUQ^FA^sJx8_snIYWp7n^s%fAowP9494%%axzARs;@0zyCs2@eUgQ8rm$`I173R za*^hw@Jl12j+lSFdL{u^Jv}NRMdSz8JMU9u2b$9M3L9{~Qxtu45N@Ukij8z9W<>8Q zEBxGe9IJFDPS^m0d5DyEmP9{*@p5swAA@ttEQjWCGjudYW_a+2AO+mV7#^!s%93IH z?K9Bb+!yMvNsv`Y zGBpj@U$r=Kevw{Ttx(#t+;W-~>{m?Dv78(!In9i6*6zEjkFf?iI}c+s^Ke7ZTp5Kz z8Mf}a?K$8${cz0MEk;ENd%ZF<0XLU5cB~vfPRPp2>Nm!-gD`GU5=2pNl+?Qx3Apug zzokXf(P_r}`i9Un8Ch2;vXE_aOS-YsD5FZ!}>C)y8eZ;0kLQ&<4NY zH)dZSR1X_V@X{r@o2utZ#NX{iEG`sV?v3dxeQw3;p%x7vo$E&N%W{TY?7k1$xP?1E zKOc8ZsR2FnCBC3G&%KwRq#Ug-+5mz!{Kzc{f=W8XFpVG1 zF{gPS4K?*EQc5AJ_hpX<(nhV~aFvyz4PG{q+>+@T*i=f9X;Mz^vXf9=f6Hy3ISm~6 zddr>!bSb6CLHN@Ug;aYIedbf2CS&T$m#yPe=ufeKGW=Z(ZoFdB+J6N)GaWo|;8+bM zECz?IT&nd^mlb$bFJCg!4>FY^ghY-h3|z}z)F!NaTC5NWv5zz|*EVmRoVr(38!`F@ zT@mHI%L%1xG&OrN0`;0Lh}DnqR$ZR_m@HUi-WYJ^tz0eRJO@>=Y-o_xxOW#5ztR>#>%gjuD)14(jp>z0N!-v7s zMH2ry6t3V=g`{X>aNI)4-5{$%Z3A#VLogE~$3g+7; zHDqNHS0X;0jF|J18o;kz{wazx&B~#=xjpsrjY|!8$jSGKe0rPK*MqxL1ORMR@^7bAi6)>qUPEKn z348GeNpVa3`b4MAQHe-?MO1IDZoHkDsS2}iG>GJ)Tt7pG@nWHIq0dMZR4X^u#gKPU)yMnRfA%u&%jniP;bS? z#?q2-Hr2EClH9d6E24IH;1)2Tkl->N>`+ihg1L9?R-{or%W3RG0xn#>dz-`jyl7Xz zJ!~W3q=y6Q>gr%yk>sfdl+)D~Al4gZ3VKQr-n>b@r;h*Cx>rMCs81>mN8QpOM?^i= zZEIgk%QL54d+1kB?xd)=FJ$JHXX%HY>kSn&UK{M+CNlR<#sPbrP+`GgRly$mPI87@ z3SG zp*zql7U~S*Qd3j!qf*xW;pV;MPKZZpRsY{7hg@r|bYxXiuvOnN8{U>~1N&XT7Ob;2;(R!|%5^Gcry9y>^ ziv$fHE=3Fs-=6I*j14*Gxjfd{HQVns)StYtTwTT~LB&5RAwSl!=ldi=Z4fww<{(Sj zLuYI0Va*1&v-Cr02YseS+FQE2?QywdM~l|5e|?-b_eqOwe; z11iGi^LH4odMEf(xWn-lpO%c+phvu3k|D_*{2`FdX1CfdEIKCVmQPOwNfCXUvv~e1 z57)(eF(L!U6#C!T^opXQ3!&WM&k6gK*zxt(2RKT({i8Q*>hrF;3KrjoEau+R5-jHV z)mL}V+%DrxZ!3Hl@<%UgUWMm;!{&K6GX}HImt1Vw! z(sKM3Pl~)2a_oFVNTXb?nj)KjC$bfBw=?;I=&eFXIQSD7ZiU}TqvPYCW>=RjJU6*V zbe!ekIM3WOrx};e=PJQ(h=9Bsvqe@OdeAAdHzt9*jI13YgUt$Jt}F3YS7b-up7r}1 z(s^h`b0L^~!rORhBODP6+6id+1BR`$9PcM^qbJ_dU{H#S zx1!YbRL9fKX{^E4(K0m|V1EL($Ki~PjVA%HII@G7gkC5>k}36#b+@TF0odqsl1AN; zT#MWbi)n%CPKKe&X@P=t(WtSVjbl(v@UbO?`=(3(AkNT9T9)7^YYgT|F0tTfW40Vh zra5Y$5{m7fZ)@o-*0i_J=YR*MoO!EE1oPljBr%n#e+|pujh&ULjsqw3$?|;Pp zGtr!scZo!|#Rl$CRvv(f4oo1yg-db_pirD84Y#~Fhd54wn-(-E6Rzs})Bo_qtys}5 z15dkpfWbjy<;-Z}r7Ua#CJOcuNo#5E5W@V5?bv-bc)1-r_A0U{nfz|J zq&WdYpXyStkP~p!9M8jW{OdQyB1pCFaCvF{Yl-m$*kc0hr_M6HCOZCJvR^%2xf#pc zdd^SCP_-3FNo4Qa^V+dV<%UK716No7{@F_vAzw~b1b@O+XlieFHqe!i4jVgaw3Jvn zkh~^4mP0>fc4V@_!_zA+T=QAJS5oT3(Ii~aRV;#9(puEZZFL`O)}{>?M*nDY6~>D!17f3Cs##O82iWHWF-oMU_olvdDxeZsDrRigM`y zHUVJq!Hf8dAfCI~6TGeBev;48MHbA~ZuwpRe1cC{X9&SKmtbHEA`udFC4zu!OwpsJzZz%LiOL%w5I`5eGjBsD9t`+D-P1E)D z`h-El3x*~nJ7!;@Wo2YzU%I|Ni2HQ1B4XCN!bo4z*~njgImAOdYq5hRh`rKWlTXKN zC6XUd_VIl@2_=AQ9LhZ{&S!XSj|;)9$APEEOSWp3=;-N5VV}TJ&S==@iY<9qfi3mL z3ZxCBXP#pqED5*mZEjX8?{pEnv$Ox+4A@#^o`K~Ruj~Iucn;y_ku(kGtf+v92&1)Y z*T!vZ_&)6(S@#`hDIqx2RIdy=$8>%O=TqImF*d!GJJr+}gG1q`>kdosVm4;z)fQPg z$E_I7OB|fdiC5VBO6U;|DajZb8M(sBM$aW?*ZJ`lk_1FIJcL0!-st_xi$Rj_ecNu{ zQ-2L1<%Xcp%ctu~yid51RFpGprAMCYxJBDnM=jweY?rz93wZ?ac7fjfe7MUDe|fgEKDf3n-=Tl< zsz!Zj{qjM=(x=?7Fu`1j{oqJi{~dhqzN$_bI~p-!o4vov+c%_L35$t#{^B>DXdGT* zV@ZSA=A!V%^B+qM!%l?FW6r`3Y$rUsg!CtO-g=Jnq2;T=i_NhRgZ$ zyM(sbxoSgD3IP{s4DdrsiA@*q1f>JB889&vcH{DyR8JC^`F0E16OaF*nKB4K@)~NI zQDhIQRVUy~69@Fp62BLoCJ*f+Y77oER-5ZuZ+X((6+9wSA=0+UYls};(R_H^oOVxY zfVIW1R*;+{K0-%y7`)!favC(ulOhbWB_ktIgE2U%{@J%htA7D++2^H%?X4EG0kBHh zrV4A;tby(_8w;AzcoEtxi+cdwe}4lTMLzi!jZwLZ&En5LwuyWa;}3zk^8p5DlRbnw zg|7oF2S)>6YfW%ep>$*+u$CI(8=RS8ELX{HVP!B$tSu6}<*CkRkMqj*u<=dUge|$v zP10Rtp_YH7>jRM}9oRotI4yx}W6*$%e+ zE1fVTChA0&OeEI=mI3jvh&!HoY_sj4y56s1M_UK)IhzhfeIg2+{swPmz%DHRP55|a zX{SG@sk_YIRj}Oi?Rs-sfaaSNTbU6sQ+JlIEzG_x<#=A)4TX71XW0X-s!L-JW_#!2 z1^u77A)LmR(4qEZ*YzR=ns%y+BKu>De!!QbMy4T}Ym>6#0PMuNT3QU;zE?P#yk$Tj zRZzWch1qKw<6Jp4?cqD$MMUr~U)jbpJw-tB?K|ukoI8f;$_wabv0&hCK^Mgf z(~>ozrMV0f{Y3un$baEKf1^@-!$=PLA{+aHfsl${T_X@$@?0mBj>)*lJHbrNzyJ0x zHvy&wvG;;cpFW)*>#MH*-iP`NRnqN|N)C1|WNCg10trndwC|?&qM0pB>B>kpa$C6Q znc4x3dS`5iij$#M#2WH%cn(~yZ`z7-ZZtRD8UT#57clJm+>rbDEz)$=kVrZal0I<4Es4+AYk>m#CjQk8RjTe*EOIBp?x|S}1 zE3^`Yw;)1mL8n>1PhpZ|q^0)(^+x{B@hQlQ^w~Y-+gs2U6nb`MD})^v{&m?8MDl$i zc>_WS7()#=IBGJF4R*lRjK(gP-w$)St}2UMNZyZ#L$|WFu7lohP7#8z1l){IkD`c+ zJ1pevw_)ilBxZF9Vs7x3?$Pz_IX!mSk*lMu_dFqZ4q%i|ST2X~jyV`U8EHV>a$y~< z`zP@14j!HmfM3~8(ASx-LISh9S(TRnrb|bh)86Dpl944GzF|}QelmC9{XJrcr-#w< z@PoG@gBhktHe)NVxoBojudIrL{e1+c+ZRpHUOR%@{&JHD*h+p!YU9PP#7%-f#h*N8 z)s@}Azga+^8CrPmoKnCBE-ZXK(Yg}p{HLM*E#_b13!wVT5d+55^mLrq!t^^lA^I}O zSnya(wtu~xmio7)x5VJ{^dAW6&HMzn2a#eOa#L-GdXpJGFk&iBr7pE`T=kO9zy21g zgsTC~IwJ-Ou^{oDkIiWjQ2MvDw6uEtX3c1XGSRu~IkE6Ts(RM^AY9m1*eze_(FT3M zM)g#pnyo3C|Ezqxs=Sjp7g0x@2%-)IT)06C$i@1RM#skEs+NIP^1>J`zAvb)Q@dkM zS^$F%PF&*0RWiAefV0d(IrLm0p&~xvWW&#mOn>$;iu8u$i%rxhZ?@)zdw&NWvPdDD@?A#^f zU=Zf^y;mpJSeRXPru@AAc(>3Qa^&>rBewgm&7KVzNUhHhdY?5fc^}0Db zu>dF;XP{<=lClUd55M*w{_GLKpEZjZJF zt%rKg`Q@B6gjAfa%&t4nwcK3yD?8Zs4o-%einD~&tY1r>EV97H-7hUI9X=sSU?nLs zQY_y$I_WE}aWJ-|jc207eETn?ybw}`*T)!0+#nt?upSUEd*#C^kujDRGKh85lUaOw zKT8HjhueTIb)R_+CvNe5Ja~yzB$EOw`vUwj0GjUa10P;qt-a2< z&U7U$yedrV4<7>R%l-P_c~?elywpIfa@Jm5btQ*N#Kr}0Bl52_iiDakjD))igwSJ0 z{eBqJs-df@3nmyUph4FS%EnzGLNVf(XC0sF6S%8pgCtn25xLO`OC6`$+0 zawfuMMWJrO4X)_m^kA9t8WwHZ!zp};s6OCmAkEcmNCD2_5q$^}M}bc^26kn7N^GE4 z-7M`Y2CVRDVM1rFGy&lQYe%(~?P?R+vGh^lUVtl3$4x=cRUA_c?`*&NipJZ64T!rJ&Tp(6pjg(ky581jAiUAO`Jk{&HM zuZ%|54i9@kPMMxMH0NYPQaQ{X8*OO}!qOx*a}DPWA^kuJwCO4JKVpOm zQLI9RidrV$x{5CSPKxlTQkQ*0np=Y8(B#Tpm)2y6_8!Ub0OV80rbj7WMeMzBZ|~dt zzE33JDEHLIqi+%UoFeEVh+KSxp?6Lu8}X)KzI3Z4Bjp$Hj|QRD8*tQ@%m6DIG@@xV z;RW48m%e{Txm1%_v4`!I+boVdRbTgD2nk1ir zv7nT6czB%&WD|XZpV9YXWVp|b-S7>2QhXjK;5auc_c0H>VHu&c4?A0fs#%PIPbU2n z1B)IMNY4K~zFl=8|Hx8eASjnxJ#7D`Nt|EZw($qLw0Ap zh7CK)|MO8JJb01Fk4I(G!}#2LlLBQ8=Y-s9L2yLC2d%=0t~ig2PSRFBR{k~?lptOU zqj=A>0BHnm;@FTkKQ(ltCj)rEeOLZ$~csm0*$RRDn4R1d<4!w?_yc_?AnBgz* z{};Uf-+ukS(P@8+s>B@Gb_pb5*1rr#!v!)O;2^puN)m8xAu0$fS=ISolcA%dv#pua z7m(}IQ|50t!dcSnfM_}(V5kkK*$_SF8dgWE9Gh)iSQ#B|MMBB<8Ak)%9v<-WdvO>8 zYK-o=hI>WkcNZ1~A47aU<7ADEWN&Orsv9EM)F@PHOE*VM4hdqHqIZ-=eS&z2rku{o zaCJL!r1+_`l$F;hb*TRIy*X2);f89^wX>jY2%gJYbO0t5sw0IU@!2Cl82`Vr(tkTf z`*&~||2QVj)AmYO{v!b9O5=btxNqfvm0iqi%+PC&2`F;E_mdveo7cqR508%maT6(1 zS~GORx@JcGXdPWCcRS%yu1&M4aF^bnt-{TYCBPcA%)TPFgj~3!T@?|cy~)&cXLI#| zoi_3^iKbzp+F8qkW)TxF#_NTV(nTw6N=d!36|bd&962I*0y#j=fcLSkTMY-&O1shn zo~xvkcBMSG1it!0%F>gunE{vdphzoq|s`)#VflQJT=idN_nbQfP;Ea)e` zdj}Wh7(<4)S-PqNuCvJHj3=Q>%|O@_V`f2{@Sp{VE?dSCutP+0#hu88Q3}Mcr$X~Z z60r|UlH61el1g7%ww=5crX0phAXX&95<>B>_Z0kHC7^@an@|9-1>uHt_v-b-)EHkJ zzqltB3Nvaa4LDQ74Ty9DPr0Tvn0`%>U6REg=JR8DODwRQ%U2o!EC^=#bAbXzSF-5b zs}?E2RL2Bsc9j%Yvjf)P(oEZXk45egJq_W3{e^7wlQ*X!rS^QFC#aVUZA14_G~c(Y zpRg~!@573_S~n5ca4N-W|4J2tRk_@KPSt=_g*=w{NId&47U$64gc`57AFqZG5=crr z^)9e96LZGl)6k3AS>^8_cI>ztlAhcq{_3@*Ta~cOyn8nwl)zRE{x27}7>KYcNUm^3 z$g8{Z2$(|u88#j>IP;_EJtcyC4%5xo?dFu(`OdOwDe$tH7tre{+g;6JYTPJRUDO z@Z1up_K8T&x92$xIzvL+7*Br#M+_rcO42{YQIcz0|YS@jm^vL&P(lOIPQs{Q+O+i zvj^~-Fm@Em&ShFhMq0|=;i*=Q=CKm@Pq7z2VhIwf?sn{Clx|*xjZ+eoX!}j> zr5SN_lok2{=;0Ti{&3INf~1m2Ak-}{EyQo6+nzKRxit?}XeX@s6bm%!KyPpFeU+4# z>g9G-1r_paUTL36WsI3gwygziWzKYE=>Cd42oNAxYPCrPgY_m${PBqodKIx$&CxM* zn%X`EsnP9i#Sg}8=BRK2*3uG!D0vlwH(}t~2THA`J4r@HCjQEmZ&%5jlb`_YHvf&D zdb8Oruz}Fl+NuR-bxL|jvkty$lsqwwd7nPorsh!cRI|DsN6Isv0sk4g$?uHv>Nk*u zZxHbE#@MkUC9Lj)F{{wKXW)~2FQn}^Rq~tcdxK8PPP6RbRJXRbZ(A9NUQGIZQ9jUu zCJ^|qKE!EQzJPCIH~57{(#GsUiycjt^ZVxWXW4yA>{+Rme&-rx)48{^HOeN(RnzBh zH%C02C-NbUEVeD$kHX?{bNUXp!A}4@+cdD?8NS0#=XxJO;rXibC$l={ZC1FZiBe7> zKlg@>=IaC1k_jdTNk${ZXp1u|%YE^Y0)()dANQv_+6+oHLcDrg=FV|7329YV2Sgs! z^fpE3`GrAixI%U1nHxe4I18R$Lu0p9I@>MEyDz0BOCEF&1XXNFL8%@fE9p@^6aA@d zu1AD>03zN<4&k)D4Vn7#*rnm~DU+t^$fdT&GeTMW)Yy7ZLe$<9aNi!l7~yfMRS};m zSrMSKtnYvOc#bjZ-k-c~C9)@=e!|1kX`4@DeqnHsS8;JcQaFoj%4n~nZ3yT}pP2XW z$_SX4^S16v^9(=Hb$g;@?Dww3i7BKl?#`95?4=?XV%rA)$wrq9Eu>>O83u)ISaq7( zsTPU2u0Nk|;kZYBQc{SGUT$6q_3!Y<_Y^KWCKp>~UFHUTRfw6&sKDr#0WSU#D3> z04+zWFmfRG&coEZ?e2*kcF>06WJhg9h?6v=D1^bBhibN|p`qMJz|P$aH`5V5Up=fH zY1*!^GFw0J>KYVMiL?O5(p<>JS6b2nC=iFFtha1~wAnaH%oXeeMAUGMxtFM(ahylQ z!Q22~O!JT|HsX~VLZ{!nNjQdq=CVfZ6!1JcT=~#X#QQ<*aBbtca{8Cfh8c@lt(jk)6uV2TGKTaE$}G(Yr(h;h!qh4g$KgYy?;p6VoA_pIVid1r3YB*G5YC ziqt=YKQru(95$mhVjV=A1tY!lQn_gS+ysZKY-wTP0$qJ;ue-(26PsV0T3ZT$CnV1d zNUj(Hp=p@+wjGPNSXh#%Yqh-I&l;*5sQE1OS2C9V4F+YSkU?7lmVfB>;~}m0OLK+9 z*$F-C+VKsGQHu>eDmm201|2#Dv8nAUIr){lJ9_RO(sL#`ln48?WIoqOk-Hdd3r<=7 zT|0vTRr!_*k=kGxR93>jI!YLlg5)FMoFPJMJ4BX_$U-53fl(75Ue#Y<2mW8Z0MylR zlH83#VQ}IO(5C2WDs``sFghT|37ClD|5qr81H~4E0GXQaQ&5GAdV}kO*Ec>S_!Rm$ z0Amh&xNTI|JDq^5w^`X$H9g1;9U4`>F{B{6YX_P)5Snh~Ubl!xLQu_aAAiEkVAFl zmN#t*h?nDTPY4mm2|K~f@k)GHi^Z7H)=R0MT%IZ02MAPa z;U+Whn#hWLc+K=6s^19PZ8poUe zCXi5S=8U%)8)iw5^1}~gnHX*DlfM(=>Q_;C_CE_hF@>Y5AGrh2ms(rj-*s9y~#K(Oe)k*$+O`e20pwJ>>u0hdKi|rOwXMlTRsSL%WSNhP@;|Z5WR7Oos))R*^f!4%OQnVra+?} z>;p=@>E5bNN+iCg^jshyJCupEvUQe-B7!20C!ADjRz--w#Yj-IB}k5&WgNDcuEbU` zjS3V4KMNookHGL`K3_B|@54^Gt_aYPmnVQYc$-X`OmrnevPlo?!aQ1~_bK1=PiVKY zYUwD^O;6`1P6y=|dh)tQh5BO6_ioM*wpQ*_!Zv|?6ckOs)0t=QS7HM(&52G5h4Qx3 z7A2tbrC7Fz69YCv6PTt_{?O4#QHc$(FsG=f=zA|ckfMZp*#vD9Y6yMRVS(e&Y3C5w zcf8jWkjsV*8_X~mjAT2);vL3Hb4}i~h!Yu!U}))9vA7~&%#1lYBEq?h3X4zO2lEd$ zsUF7i_7%8266KzS@9o?0N;1?TTw6>ulp!0X2dVABI-t(f|Nagz$WYtR&_0u&E;D`3 zG1+(el_W(A^Ir!KB%eoU%5Pz^WKbpJanlP53C(gl6Z{AXwJq6;`cCt2KL<5Bo zce8*|vXPU!y(yr1L*h1Dz(I1MONq10g=K8d^Tnpq?BeM(qHj=fX+gZ5mwf>WK{tTu zG95r0aFDr~+pvZCUIq|MwXZoiq)q@p9jR-*$8 zQr_1f_a|7>R5KDvkYhV3Dz{YC`G2t9bR3ch4X8lE{H4OeLVZZ5;cz%`w=9M+WwN}) z+|S15%am_YYLHC7Mm9>eAp7>b#Fqhu+E|6GEc|xb1vcF;lj?#TtdXv5L|+eFFBQaR zy6@e*p4{<*x{nuUtdSk%euW{B_q@o@_GzT!u!s=e~B-I_B=%Mx@l$jhR71C!a8Z2kyy_-SEPx) z?CVyL1Q>kN3F67Xjqv(I##=APyjR+g`iS=h+G2#o=;TQLnYZ*R}oUfVn*BG1$o;HLp=~icMOm6?)Y2L zAmJlL5a}~u?(P##9C`-mlNy+scOpNkS=A4Mgp;BgdrgTDwbJpj}J zxzgAeV#&v^4-4{J1p4#I3h}~xCFE(^10Vo$D!cS^R!D!W%Rs}eU}GW~)X#?OBwR^OMvotx>To3I$;!md@{Hj3(+6p{S zgFb>6`=g=+pg~__Z$Yt0!YSR0IrUW}C7 z%0Y+-q8A0bp+oXZh0ILRuH0>bFYNMBB#;6b1X#aGG|f?8F^S}`A0B>bIYVqBw2=iL z#Ok{|c1#wNWynwBfD8Hsqy7^S5@W9<^+wQ$cspfWLka71ci}Gh0#{ba@HjV7j#X-j zU|46_opH>j%%p;dXnn%shsM!#>MMES&4B`ojn>NndwMe<5=7{}F8#$R1>paD9nP3h zJ5p0mFVHvLY~fpcN6VymF`K>*n&}PqI|x}SA6CgWfAw7WH|qp79uW5EgHV+d{kMuW zh>y$QAl%Yqs5w{l5XH&tAYgz1=3fT*`6aWzz%W8HwK}5U!a)JRb2oZF(NaDZ)OB_M@*Y&!UZ>I1 zH0qIC1QBLSd%N9tlmvI`8pKz-YSK7O7kzxxg1g!HKIjO8h>70ng9(XfZtw32GNUJMduo0}zS1qw-Zlcuuqulr05#%1STehswW4s6jHEUK@|9eV3J z06;wKb9D1ZX0<{!>T~$2^|18vT1!c3>FC|;W#8e5M|`Z$-Ml-9B8(KF?uymTAF~4> zGU2gG$?wbn(+s$^LJkne->8+Fq95a+mFp_e0kUZ|pgy3(OdSj}0Xgb3B-4XzzpEJP zKn`c$DLjwQ-!5`ycfS>*896yI^?Dbw-a>o>L=H0KNqo`~bvN7+1iO`ixAMo*Dx&AV za63!=oWWUb^;gTWSO3X>WobqVs^99RKY*>JuAv{pRIPXx@~;9p3%9tm)D^kq#cIoA z)R!{bxr1RMZFOE^fcdSAZM+N3h0JB$<;JSM_?3YieEmpjhsW)7idRP+tpjAgt+Zi8 zane;Z@uFzV4t6!EUOrq^gwI`p{u+-LoxAs)$UW0yY?P3wN9eG`hDWEyiTw9{l?Ecf zE=(jNSH9Jez5ulI*qGyHD5q572`#Dc&H}(giNMe*BXJjbQzy30fFtDFsGBXwZ|vbs zuT@97_RjqzDMBBjl|x$nibJ@Kh{J<2;Wg_v{r!EY52k-{N>g`5@SChr$g>zXx1;4* zXiV<~5`8!=`%ILtf!o~-xesKuPM|l{)r)i_G&_O`S=PUsV5lo)b}Fc zVadbOMZtD0SJE?lkKU!9fdojxG5mPt%=T6YRKGm%M!Wr&&I$kyqj~6xdsm)sIj>~4 zv2U@l4B#@L&J2J{O2FkIfs7a+Hrf?HgHnbgk*v=O7@z>U=C>}#L82xsqBt%3l%BtvLD$QvSEp!nFX?w7B)TX8; z7f3pSYXz4x`h*6Laltvsclr-WaWDnXKz7u32}W(^nj9i!RQ~A&aw|s_VZYk8B818- z^|qowZ_y(L(Ae%eT5sVbv-^-J+R25Oz4B3s#%dkNBh-{Ux8X7GDCd7RyOCfK zSp9m@lX?UFwecw{#^4q}JQIuvvc~(IW#w;OK^UDpuTM=hz#VaNXV%g(16pE00342` zb>9i2oB^GDW|);bvt*dtwS9>N>E=``L2k1`>`Mhgoz#l2QPqT=-#b+EQsd`}z~S+) za3l_mAB!+D(1FwNIMn}sOt2dXHQn7;SKT!e?ms$F4m5<0y@S0gFP+lD=#|gQGm4ibpCd)fBN!&e>V`td$JC0;FBpnsOuzbx_}ql`1nXoDU; zK5-yJwV=~dPqS%*G$kw|CtKPO)RlgU?0DuK#SF^o-5xzb_S<*c_X8^4o|AN(O4p7@)ou_X&yn$yBBiy4(GHj4^$eu7=2RST%>yfQ=~ zZ7}Z%gtT2ZHQP9!emN^W2=xk2>Ggmyysbhr^7m$(ntlSgA>a!mA}YQjW&~bBK2!a^ zJtPy1{uH63GRBEG+?Fj{gjbLa`DN77r`uZYNETjS`+&`HkWNCEfhjCo&errriHaiV z!9~KYcWprPpll)i{h|m|@zTSHOWQjxAt52fL|lRDD|=83na)qF2M0b_(4@YD3n7*$ ze$`I5h{sW&M;02B23@{p(4`kgbU^K3P8#j&1^lpSiT7E@oTjnd{&-c6Wu*i~o2cRk z4;}y~Wisy(sU~~88G>bTtzQC;m!S*0e689*&L(>N9rS2eA06qr%009~>3xYZlnqdb zzQQ2F@-Rq4iR9c;FALJbyRQ zg>>794#RkgeNKe=Q=!d3SL_6gsLn9~X#2z~G+fYM3z%HFx4f72&;QQXz7k3s1{p&)?KKx{I9GCF92c7gm%MDHy3*UU*zrq%bAFHK4{*JfKaW>;%V zMu)nnW|`=2hlso;z97nUnFszIoDlvmC*)R4DK!h6Ooy`(8s;fI3YuCV2}c^J9q6!fuGuO_5b5G~X9p3$1rqVzewWw%eX^DW(R+&>y8S1VM7Udg!=k)z11;FJv z+tyVApg%_rCU56Xpx)_WS%$8bHZyHU+0*!Xnw89emUEa%)GgOl)r1pVlS-=_Ui34yIZMKgmMcv3avLId7O#e zx_j^_(WU9zZ+^K<`eWOU7pif)PUyWypPYEtnLhQdqhl=O`^(MKfsXQB$S);eDmaf=*dufCLt5MhEH+P`yZzlAs0FR9To0~eRI0rE0;zo9nn=BO zXbl{RrX5^*#2&UsJT5+rCgN^wfs3cd5PfI(>_X5u9iKc(n+qIlS7iTbUJ0_q!Q~qR zA2B8MOy?d^p}aOikib#M@v4N9y83R4SNv7_-BaX8^!KMgDjs;fEE%br7~#ae%f={h zto0a;8Rb7A%;!008&#(s1+5#=9qluwJ0+@~YwR~s?Uuu2 zXKv%XI-c%(b!IK)i6w1rlIBJ9ef#G%_#z`!mi<@K@HIRQzKBW@E^iy3%!#8-+y=^o zobxk7Z44^G5hHI+gll36tq{>^whCN}*T2*LH5nd6f*9J_-gmetteF4u|PoxYV=42o~9*@8ELDLfsdJk@9Um6rhFwG9E+Z zSLL(%ONPW9$Dy{_(_lY?<5MsfL3{b~m<* z4}CsS16pev`=&1U?8t7&Vg1qjkxTd&`?Yd;c$3D3-gSK&SI$t&y?Xg!FaH(qSzbP< z#hnOdqMSlT|08NZlK=1^gZV5gADo-(m@4llDEAV| zvqH3VjVA*ZM@?7gvz?uNvHP^TT`k<*iz#mU8PYzj7cyat)Awn~J{P--FV_Euwuqws z^c03)my)0pk3lHj!=n12Yh4Y9isL)%g3L)On3k0B8`rP9uxUZHFS8nc7bS?!;vj~8 zP~vX}J$W|2IHFD^=|4*N>WC1xLOAnV8c`j?a3d9oQA#=#P$T;=^!`DeJA?Dm4Z32B zf=ntx3=N1Y=aA%{EagviPJTi7^w>UK!n41>UddPXxJhzTohZP0p9wbsRR0sH%$wD- zPwevIt~QkEx;JGiHo(iJdnX|49vT3~Mdvzo;y+ocO({iZm;X53)+ZA$HQlDjPMI;; zG2;`7@{Q!*ne7fV)qh(N`bwm6xzM^}*tfG7MeZwBCWi-jgiP0NwBaW@WcO^r`^v_Y z>-ny{foV~ch{lq(9mDo8`C{I|2`SJ)r+usX8q&5#-%58k9D^TEY%) zFt2-?3WluuKd0qG)>1ZjNq04Lo~mj-CJMU})Zwo{)8)J4cz2-w&*wQI0IPySOCP#EOXE*f+L!9q)Ci|3H-NF%HyQK zxpx(r)WAWDXg|Cp7m6pZ`A;uW{il{BRyGs)X$tUO;3Ti^n2`u<-C`OiqdOKms>@IC z(%V!QG%8VJ^*WGM#}iCh71Yh=_Qga;3LYFB+~Vp|m$0v;rFWZ;ZTbDmJe7yR)`mPZ zrs)f})fJAb`6DQrzQ`cCSa0VxTyyS9K>9Q}>G<}Poi21SA7hu7PB3#y{!|AE-^N`a z9IIQc<4#Au6`Z^SP>|g7Q72k}*Z_a>axn9W1uZmisPz`J?LXTtoM4(K*Sy3}1@E!Upz&Rd<1U4#fPJAC=iy z3JpT0|7Oz(RJIO=0mP-+seF4o*<))dnjI;HY9O`Ls#zM;BMcL+LBEYbNh!x?doOHS z8O!5`@8U;a3Kc@yRo%ZSY)0%!r}#B=SFhd`;1qyp2OH<)#rPc)sQHsmjGB zZ|Q-wb5LUVi`KT==5Xa05B(wst_TytgEt2sMGgjasy(XoT; z>twoB&!DQyTXyAOKzfKun+bGjVVChy#+n6lanpuS#V`J+M|F!bQtR^>gv)^ z$|M0~3=t4Q7y@Amgpi!;Nr-jt^S$5i48QZ|?uJO7=f1CDU2Cli5Yo&c=f}2Zu$=~C zjddaGhd=q5=s0@z_EX^eo+(QWc29=!!JQi zTXqsIdy3{v#GpovB=(uKZk)1BC-8Eq87wPn5eL2|JC}y|!&Ye3C>IH;|(nn3k z*yS(d=;e?F3z{i0LDCZNb=k@i78*}uVJ~(OhDPcuaW)?>Y!+XZhJ5|)Ts=4Ro9){h z0sn~jBVn5!q>NE@S(}a2kd^+%*C)uvR?;Je$*d!qq}FL&O_o?&?C(NBj*L-rquv>M z<Yqy;ZCP)m9MT^{JMq zGgia&8q;hSC0Dm- z&0c(f6L*f-4>Bge}m-8C=UlIz%^=b=Wn)uG?j z5z#o?s_XVc#hkRtxp1q|qPaRzT+KoWus4P~_mtddkKkSLOtl-Pb31A05Cbd(Fyp=G z(os_^p=isrbiZS~_&QC>u zdYyH4#}pT7eEI~E|n_}b@#3*_C50M*~Tqc z2=E~$#s#mgHZYLg+!~{-K-2rLkIx0p)~k5^@H}bhF!y)fvF;Z4+vgH^A*S~fHriO!^uFF)Se=4XV#)v-!eXBxU^Y_6dvh1p=G zAsv+`EfFE7F%zT7ow~L^c$D8dhl1&vM-7cGJ#TDv>1h zf-AqoxL&*V9Y~!~`!C*w6b^N#-L8S7t>f6Ws&9P3d%Q6`<(R7lkblm!yw=yhO3?1_ zZYF}aqQgSST8Mea5TuccB%uVw@P|GVNM-pgvz~o9c($>E7v+EXqSs>p+a0_{yMvw< zsUBlJ`C_!GZGEh~S-8m=FCLMS9-_b*LwPq0J7XK1xSZm>niE(DYonmn)c#$PUD={2 zms?aCg>Ef94G0Vx&TxC~X=1S?bYNoj5Ly7yY6h(wM62Y(Bqh5(es7TaYn%+(Qx>%6 z_y7e?SDJSN2R?qBOE-BCivhvbtpj9;C64{YPBP>|=!PFj$dkw`FNOKN=@$^XB9x?0 z!+8;IShiVd&W{CJgs$%H3cbb4Y<7(1C|PN6ECRRwBOzr#PgbjXz>!rdZy=Uz5og@% zU!7;nbdSN1$v#L*9&PMY53;ijn0tk$nCSDVF@|sV((0_mXa#wZ7_3LA0%y8+I1KMK zAZ5i#QE9A<<@&*HA!m*Z$rrO5j{|L~hq0^ysN%3zoWNsXRNqZOnK}}xm)A7^`Fr2A zA%Cxia6_3nZYNEz-suoMa4LV*yP{?n_xh{yN|t@7sve_=67yP8&B3rYDoMlh7Fg}K z<(vcGeXxN8f3>}E?G%9}MOcU7+*Y9*y)xucgUF0Ub`_&1NGc+zqK@B+M?HeLyV3ok za)W^j!)WTGkJMGdKi9u>nH`$~Uqru1sbF2qKFXZ^?umoN`cjhKB5XtH9G2>OVkJv@ zP*I~{h%}jR>|?WGGw8bL?#*{L#E>EP*nBZM<4sqGrfZqVut1o+2qW*hV3}k z@2lP7_=xb?F2||Xku?MGeof&>#A1LyTb=4*w8n&mEUlIEF9Gp94Bcw_`fVOC{ucRj zOI$wy%yGA3bYq$l#$EVZ8|`?CkaEgt#!Qvh7J zQ(sZ7!g-rbGy8L)f2G8GHwJ0e?!vA2rJ%|95DmRG21B*VF|ZV$_M_)5%(!x4*Av|2 zZDkwFjSqNWav!`@PDpJkzpo_kjaAZ&xl$J#0J#NlhGPZ!dIvKwdLYQ9;n-(tlk!p3<;NdI-2@H; z{O#|Ii0k&D3Uw=^d}G;@cREFB`|xM1q^Dvks@=uGymuJ2Hhm!y1Di5(LqL<&enE_O zt1FCUjO_`DZP-#+!w03Ju9YGVx3Zr5FML6qF+w^(;${bEgeBON+%PK=F}z#OgGo9H zXX(jtUK6QnWyaX`cNLq*Ia7(`glTzq-!r#Pq6bSTmWI%Mp{#lumTpAa*!dVbf(=|6 zU;mn#(J4i{)ngl?f7q%MeoRQE=6T-_WmCzJno_WKN)QrCbHXrI6t0WT>XbIR*@Qo( z{A|0SI|wK+U_0EZ*0DbgtQjPXp4nCvAJ4gEGx&|i@(U$73ib7gs{{pZDCZgLd~fBJ zX0$9><=oBm8J5s_4tY#Bz5sBs7%_X@k)f3#1-aBX9vR>-7r(ab$C=J8b*lqoNbbB{ zd1J8}-6EnN-ICrf#`I=gXKzH?jCo7r;F^@whna^4dzjKwMQ0&GEzvA9^Ge)T%f?E# z03RR3ZaFDB0k=$(kL9|YTdP8kg+Zqq@-|HGOJ9EJB@SwhNN{g!c>DJJCzTPP3JH*y z-W>1UOXG}mn5&S|X8f-3nmiW`=rIH^D^kgd!+fgmP{pI`=Tt~!&P#W>{r~OH6)>ug zwr{+;`z^nvQ2~Pi0Wr&(4~hiAkUCNxJaE+z^9+RQ`EyH7!tH#JpVYBazgHFx1ke4( zaNyymm!_6<=v8Zs*X!ElX!k_R?sKLO`DE5(Lw8LbCAB42e^*e)?eu^Dpkiz#-y467 zv~d_wIUPxcyG-dUStG9wINpKBn`ZF5+G(R23Ip$E3T1u(aJx6a>-hvZ>d$cnQ9*0o zfC=#M&Sea?d6Z-Ds^o_RMOJOni6?UK07v}i%X-IRtnB#C;rpQFQYhaaB_U0bv=4Rr zuC93P+R##i`KXEcTzC*ZSeCQCol+P~P>?{xQJtkg_HqDaB}joH5X-~yLL(>|PTV4_ zun_hX*zslZAiaNUe=4e_psZM7fpJ4~qnN$zen18+!!fYKDm+|7j$qyO5- zJ#?dO7C59^3hP8G>eN05}K0H0y|EcfD1IC!{j>seyWEHuaCO}nc8q+isC0RfHN^s|z7RSzBw+Yu_ z$Puc13e{ApgARCUI6zj%n^3#=60hS?{^5hjF)q!1gnG*`; z^%9!8MREmwI(zNO3tqt2t#rZ;l`xi9xdmK1_Pu*{k?x!&(&~ri=H?GEG}VwBHl}G> z-)m_*?-r_rzp;P~Dzg4OWCztI0M*mu5myj;0ENThI`iN~0ngRZ#U*E<_n&^kBTjh> z%G}&s6)Z!5W~OLUuE@_Mn}Xq!LT=^8i3*dqM7j~{ZUn?ONmP#J)dvC&6fd?2>gVq& zsxNK^k z%V6diY#-YGSt4`w+{2>>4w@#NPi@foN_^@T*kxF923hB=q(7g&Lw^0zcBA#`5jn)T z4Vu@Y)vkImH7d5bM_6~aa1F<8h&3gIrV16N-{d13J*kICsI{fo(TQaw>WfFL;{(+= zoF?k1w^WckME#D2C++OhrnH$TakXlPf$rSS{?1*ql3nKVb!l%teEuA0v)%xs`5acD z6+87n^;}({hQ2M*JI2CumN1Q*HhX_un5HoV1U5$smq7PW^g;X+G!b*4b+7Nd@ z0lhAv(%4&3ck5-<;_r!(Ypg{TN%e82EJ7>gff&j-H{4K7C^mTc;qBEo36Coo;akxC zYU`tQa+C-zb1I)9Eghg*ut81S9p~j{WmVdd4A^qEft52=-hgNs?mxbcO!^O+C0{f( zBtos4q2i=({ruXGs^SxGUdKF$r!YZ_UhBqQWiX6zOGbzs>@o)|G57?YUwO&?;@v9N zC5$*VMvR6CRM)0I9>IN{aRm&&-i)t$du zggCF6z9Qg3AFbvCOrQ01dq^1VS0O2(h{s^o_bHH)sSe7kH+vH;n~2#F{POEzy}u#S zgIS+e$g~AnyieT(6=Ifc#1$~fS^!;?-rEf*ZP)=+BX4`G;>=uZBc1~}p}sl{!>nc9 z8e%W_FqRYT^cblQ4SYt#4Rnv?dQ38s9a7T!M65idq7?9)3qv)WCyYj=>aq0b!e(4G zy_%sZ>=7-&Syf|b*Q;w}`<6FGU7c0+9QZIfGZ|IB(k^^}H2(9WmbzoUQ{5Sw&{@&^ zdRY%J%L-Gsid~($!T)(G9jZzst|R#RmN#3(1gQNn8zgES!Xi^*aN$FgMF7eeK~RT! z)(WZ4u1F>QXttTLCrA){YI@25bw#i(12NQYa8%A?FXtE#5nMX`Oa&CFm8+wXFe%(A zxH>+r5N^=Qb6>a7=H^sb7sY7^wdj+x07Dj77O{D5hUnHx8hqaHFQPw>g}I5VlD6;I z(KOYQ2RP#0V**go2wpnUgjhQfY(7@&fVr>f5KF=G7|2wK%;0&({9h!BmS4|}_Q0z2ielF<6+=e;Y%Nu9A@%9wV50`ty&h4Yo`&gu}s0H~d z(!6E2nOC9xV?VruesxzDy#@k*C3E(%y3zpbP(5dPb=|#Af=lCwjWy|49Xl8t9Bk@} z-{*-E@5ydzEqJKv8yMttnFK*a3xMv<3K)j)55PMRAbbq0|0jWDlfus%7Tkh{iat=L z0G*TN{Q=`1a#}^vRQjZq_@cud;ON{d(TuGGUNZ&ZO#Pl=5 znS0wl|9~A!UDHLAU&S_@Dy&BegqLA)vlxU7aqXCU6voO+Z*PT89WR|(=`3beUVmji zwrJzmTq|K0%SHPd5~-u`0Dd?a%#K%eG7Kv9^=nuvFHh?4*<N|dS27AC5NeP7g`1tW-Xi!1fewa80^Vm<$Pm{4#K{osWFwV$jFCUU2 z$H^Lv@(|w&Z;BL{!5>c8cH_#&QB>(!f=#(c|719(Dgx5BJTk!om+KTU*n_HgrRZa=fnxvwo#SmQa10 z%aDXv%eWQ1QAYg-n}|@_HrBKpG+L~5hcWI9@G&5O+EQ1zf&1&GGGj60pv0`5H0e)1 z+HMAoPLgH+ahX%7jiz0hFd&ELvd33YUuq(AK-h+Yu%<`-1V+ldIUvmOibB@?1Q!w^ z>q12h4ce=rPyDKQOavg6G$A-`+7ZDM)`OJDpQ9bvr1Xk_7Q(5)So6q{onVnIVDFxR zF&I>Eybk!G0+DpkbBj3W$Cv6%?;sE zT<~~MJwz?=^tQ27{<7tyChX^fu`PQD#&}E53?fDM=(<5VL67_{CMraFD!9<1-CxJS z6-PJ1jFn##F{*50$5T}xOHzLLow63sqE1wzQRjf!@dAHlADm1V*xORT3p=~;$Rw6wn72e3b1te;LlIT-xj4eKa z8(x#v*?n`BiNd_tiuNHmD| zCAIx_OTbc$mPZ1HK8O>ajz`7S!I~TAXID$IkAElllvsYCKvnw*#)l0ECIV^xn{OJR z>=4M#E%+e)^*YsZ5NG*MM9q$OY9^qa*xJ`!xl&bUkMDz=K zsVv!~1Mh$CTZSQz?%Meb&`7x1kgn2KNkBT!QhGIqUq!35A829XhW1c4SIaNHV#z7QeUeB-wKxIiy^91mY~%r?E$wJTfF z_t(Xr)bA39RQ(9&nVV5 z>+u9fQ8(=SgWu<@wRi&#(mNNepg9|@piwJf<-JOq$8Hy?; zwSgy64}c-X1`h-w1+p9L2WUoW==lc>fo6(d6pyO|5`Z9sFdd0)2jVJR9l>J{S9b*1 zxC^jSeu=}sY>3Zz_yYy2Ok1gIIHLZ!iJ^0@Hty)-1?d&1HJiOXvwC4%G*Q}t^> zDWpn=v9RE`!zZYzmO_{{y(dv_YkHYBO%*z5k%Oj(&e^5+>7Y+IJz75`OHSSD6A_O` zSPMc9@8%7vRvrh96=~WDajLy{EaBrX8Oq=u}n4OPBj8xqc^G?6Vk z&YswhwSzfS?zax0l(lRiBPx-ipGJRNt)K)iXO~83_1jh72uVaHTg5$w&`2TxAYEl8a1cD9V zd%NnAzX#jKg+&4Ss_uo&2O1d}1owdHN8J#VK*AD67e7|%IsGyyjf`9B2mqtROS^aP z-i1+^fP#SCBnIs`EUa_tYF)zh{3utjDf}!Ejqt=8zf#rhfQ1axbI zOo?nC!KHxKbg-~FtuR=Hj$2#*-n)D|1))}aNW^6;j=bRNP9+d`%p5`&fM z3%QH%9FY7%W37uBQs?pGYBZ^!v8+n!a+C)}dt|77`3JS1cEY z^ct2-)D1aO5V#=6==a{yxDi{sZ;sp8#aJu^KH8doZ_|g^kYZ6<@iyNw-k`x81lrBS zDBN0!TKj{?%Jm)P_qWq>wj1C&@4-uXG%e3MkL%3fi4JvEX8JAHraLilUL!9JI@Q^= zJOJ}%aHcNl0Wdsw(GKr~*Rr{^usiylapLTuEor>PL)F#F)}_a9?7(4XPcfT#5!pV7 zUyiyQ8IVD7t^()>PJVic=LqZDjfjgA>C6|W{sojsY%ME<|N36IfWgggZw^^WPlFBQ zX`&A`)dsl4Vk+TRUy1Q09LMWmUImO!t2YNP(kHCJ9JJQh3fv%ne!UgFGH(FtML5gm ze9-*}T-#r_3dKYS8jB-SFdR$N&B+Dd+DQw}Xrf)9tDn;yi<8TgMEmkM@n*kBV`jqWjQTvln4oKtU4oC z6(99gT7QsMhWkQkQh%p-y!Mlj58&9IpYL*ZIg$vO2ftX}%TA5X(fj27$AIK>@nMGm z{vz-z8rTM4v)St(1X&QmzP@?$h;r43Zw0v@DXAc@AV46DLeVG1TLl@2&mlxwT{ruQ zk5%t6*dJ#N3ihgGWoNMV{ZGOxRA<5DB1ZvV#|)7fAybX>pG-A+fWBUQl<>Di5 zf=TUK)6YiL&2NOj(haWN7qtikOMQa}+20J%^r)epabDBR7;$)-zaXVl2!nP9W{3R= z(v6qQInP9C!`w*kCJK3}t#Slk0Gpl~3fe)k^vr;G2DB;*2s8Hc=N?AlAC9*7n0MX{ z3`9(J!!Z3BNZ${@vy#S{d_lKleZB+$;wGMD^nU<+P;nD@4btY5%Rx%_aW{m~4Gj*D z86^1DN=T3nXmKBF+6B16Cf48Ie*_Cjh=r;D)4z`CyEeZnR&S{3?cneOq|Iz52;Oe}C)PFzh@pbm}HS6_QEZ!k#@ z2Z^*nZ|dUM)HZsQksUX5Xl<%u4D8Ib^FMNUX?k2J-q9Pw{Odab=T0JYAAYb{MJo9H zcvx9S1J`HF9_q%QJ=rTs3{~_Eo7TzXU6PhhPFp!!rS^1k9vc#il>pvjFP9XfGZd< z=zbVs;fl9D-A`+mNC)dZF+pa2>8F($#dm(mN_v{yG6@*h25toom?2wHvmR5JXuF!W`-vEq3Vx%j;2}1 z?mi!UeX*L+W2PV3p&Rs_ROtH$VV7)1>+P8Nm1{VAk@`gjTD2-q2_|R_t+|$tm#NVD zb}}9}R5hIh4BE!>Tqs^Qw@&CmtXoS50Bk;nAVub6oQjsvRE8dZ7as;N1MLPD>uI~G zvD$A2-!D51L)~8A0ncPJdZZ$NmzfyC*uc&S*YSCCJk1Q~gFr?Bn_bfNH4AVbhW$tH zsqj5V5G7Amt_+G!CqkA4na}z#yY8Q1D3Ei&IRb)f`>z4$SDDO4Rz>+IzX)^jnUP5T zGf&lm*ABDq+w{NVWXn_lR0Sc$=@OQ)m41N3QKHi?$h^OXB{DROH2zlS#HXk3ph8Nu z?FcDqIJ>2#4^6vji~Jd*$18&DhL%=0ia7Zo7s7%9=$uad+09}H);4l4EM_Tf1Fdf3 zL@f*@^dl7Ttm#!YaKKM7>-QJk@?n$JDS*iSriu^CEx7@kt=!+-hqSpTURxUp{y4d6 zi}H+bZi!PD%2I7T65^u|*)Pt;imM$=P_hx_1G+8)#@I2(O$|$PCtzBG=g-0T%{b8v z>FE%>Mu8Sejw`_WA0?%gT=P;Qkr$izjugLqfwT-ZC?A+~L_!%0Xf84{hf=hEaU%5m znV>+2&J2SxC?$pM`DP@BZvnsg#`gpmg(E@Vj<9ZanwUQF+8DdSK7l-Sm~qp4xo7!> z3;eLM#D!3+dh~BRjv2Kh%`y@L`ftc@&6HsNPNKa(mcXBDl;I>j1!7nk6i?ky5BS>< zR!0Xk)||K?UPJ%Om`gc8*%>WnU~ik)L9hX2ncw0Zb3(Z5e(=SX2LzlP=s+W)4T6Fq zn;!%0MnfPeGlP95-#(Ukmjxh7BVRLd*2IVC_Q=dvRVxj#V@VA3fMU6;a*} z{7W76cCWc8*EG*3lC&vD;K~=P@c?EvAT}X{JUmO%4xo$&)zv$A>?%RIgpgwXuTqi# z6GVhQf>vzXwrvO(9Rx74R~|t1m_i?keA`Qgqv11=D&4E^Z>7U&@_DkGCKWoaEocHY zpxIh9mkyIi-y6}AzAr+>BUH1FNOOKgnT@?S*T0W}^NipIH^!q|r1PUnnl}7QlMpg? zd#)$?oRO7jy6U)WENnKLHL!dmdjEp*9a|IFTK0T%@~{dX0Gj}e0NV_Q1bnMojdm7f z1rHG)EJ4@#J$w^Dk$~0!X7|4ckTQg558;JA#RAEIBoMTa{fu`6gj)nJLUe@xU=#mA zu20B>L7*WK&^mrV?*pDkK|w*%QKz$}Nk<+dqal$b0KK_(A&(TEaHtwzRI^;LH7Bqu zYmJSQ;&op_0}$gQ+8Qk(RjVnr{sJbNR(0aS^{iQu_SZ7Q#vdbghiAVuLZP=GE>_X2 zpq;cWV#qOmciz#E$*kQ!#~p<8lc>9=BLB)Bk)~jogY6!XuSXA@9sDOr0RuU^OYNj#LqQi z5aryF5_FM}a)KGmZ*u>O_ur#o<@NYnGLJg}1Zmx1(BMG+)&A$B;V*yt_*9vV9d@Sg z0`PI3e{&=A01#^Gj*HWX6RDp_NDK%qHYf;}@d`9#`ll1Ge8(F080K8QTgq1E>TIzM z7+oNYf7KTMu!|EJdGRh$=f{AbrX9(y`te??bG!2XtWQ3E$87$0<9e@Yy{?ne0&_{}Awg1u{B> z>w!dZ8pwC{z$I_Ijh}&e<1mZ};M(~snY)||_*EZ*HV&51nTWz2qqfILND&e4K;4QJ zyoZkTn^K|6DRK|J|CvXxzf{{cHW9r()?%~LD5g;_VWqd+3o8Ffy4ctpccyc7u){md zCb2Lo+)-a##JRk&w7on@)#(<-*RSz6VfnXd=Kuvk5Fr1A?QRI?3>*>p8jFve)c@^J z`qSQG8~`28`kdGtoabF)_Q7aHD6_x3246M5@j2_4gzHL<2yE%=pIXBr@DIkbEl55_ zLNfTheYEr46azwVIgCHk3(Ba|M+DtJg8YA)y8iz(syigLE>@5GLV*p}eg46VkN7jh zc%;Fo!f`p3AO19nxN}&zIO-NmqdL}-k=b1;Q1O0(d-GLWZme%T@H0>PXTX3iXnwpa zCGI7%rU?kNYnIz$l1=c#V!fVy;Ir1@skhfkcdcZVq_!>6n5obCFtVCbAAH>FD$Cn( zA<4Yye!)u8aHm})2GqV!eHA$7R4L857@nG&H?2vJV7g+!XBwvK~Jay(26hESX!C%yiMLy^x(hQ~UK}7DmSVw+mpbgpiTo zxx)kv`X8qp6K%hlFvNjm+kM6igs(B1rYfE5KxzCLaY~Pu`+$)}6-;P%wx(&T1QM$w zw{2Nbp~d4l62jHi4oN)q+UxH)TYvY`r7S|25O&qn5H z)JSORb4so-^S7XzYdehCUH3-o*^PJ5UHY6Zm-U9Ls@HD>nbJIBA4;M+hc#rgeM@nN z&;`MG@If^@AwGT1=>V$y@#a``-$ii8Ap2g_1+TXM2hBqBaRt}InpmeiK6yZ)ORwWhzb`jIv(FvxLatB~UjCeW{C?PKLAEH54QgeD}A z=wk?|$0Or7v{a+}^=*w){&K;B%i=#g) z5Le9&3BrRi z$(zB#g%=!PRj6m$bGU!R(QBE*K)0>9(Uv^=e&H`_>qE=mO1^OufA{85LgCt4W(;PH zi+5?)$N4Gl<)FkAuj~woTpyj;N^NS39TGRMT}$&{Eps;C2c_?9gBqzGk$mlK18VYL z7knBmw~Zz%Z5uV|pvNlUkMHdDT)p}%kZy#g>cS~|q06XnpNpL4_Uebz@TogRZnTHJ zmh8&Rb2MyqN!j0}^~5k}1>co4W4!zV+HFAdX3W+?z>54xV&QVU=b=-m5CZHuFyN~z zQae{00dsK#ONvG?8+asus}ObwDEwd9%3F2KlB+e9YnMn40oTylxq`HdWOD#Cv@nx7 zD#D=e#c#|wX9BP&`cm*2$RzaB{sIjuA*7VynE`lgZjVM3rwI_A3Nm=U3Lwkk(WeA{ zXKhBj?4DOY?hBR+pm>ACAd`{iMNqJZ#qE?fL}|GIb~~hTr3$&^6QHHW2JA{$YCb`x zHY&vq?@7U}lKnp{dpBejdYu^I>9bGftt}v6-=z-r@q(dJKtg-<*2XF)!to7LRNQ{% zP`&!7G(`%xI5!t=!)4S*$V+oCnx=!WO-nn&@lEORCz%S_W#)ONz_Sk#EjEZoT4`mJ z^^m$XA6uX2mS8Ct{L-1%smu31`=k5uTh%=wH-2&b%=k<@{X~jP|E=QJXMWB&UtO*l zq!AuFcF1m5^uX@sgrED1jCXzZFAenwncF|AJafD6v?t@w(`lbS4=+uQ?{iI1%3%AY zCk7Wj8QF2@4^q(FMsWLD8gn>umot5Fs&FoV!u;1~ZXiiOHg+S=xf^=1E1NGP2OI&A zjhaZZIS=l64uWRyi*QV%;P!0)mKGtP*zWs*w8uo0hAih?0~?>ne(5?m>m)G`clQ>D zzQ2D-cxfHsDPK1(qzQ9(j|*K6*#Y3S9`W0FcE0BYj34G3ka>A+U}m&g5Bw+JXO0;X zi)4oUk@n>LYnZvk>au?d_Mn_((?vR(J%j2baNUa*LkneMqa{r4nFemCIh)#J9~NED zR>>F{$W`_A^J(?)2&-C-?mX`J4lLRhP9|!RS|6&FG~FMym6|H}ft01u-QO<`cy`;q zZo-*(pzrV5d=TfsZSN=v@+ zE*#_i`DTW5dn*x*!L5vRfY-?4zT{$KtKN%pB-DXV|8G}puXZR6A02^dE15DNYTn+w zE9#R^qA|Yl2jN$j+m>a>mjtQq3zR1zrKfxEqC^V(`0K$1G5Pj!WHAp6m80o&y5ifc zoe4%&kN>4qo380STp6dV$PEIb~+9r!)QDVht7T=kwEtQPmD^9P!4?iRKWc@BZ zX;2U6PtdL`WV3hkeFXp9c)_9GYikz%rhRyLm29*=x>BpsG&^V?;cJgmrq^>NcHwZA z?0IgjCf%Q_AAQ%|lHeXiTlQ5Ax_s)GDSnS{bhLK>!Ng3yjL`k-LgX8}YX3Z?l<`{`n=A@(Lo%ZC2WbZg$Wd_3999^R=l(L!{oY>up2FD_=!rI3>mmK zC5`oGs{ETuK~!oEaM0Wi zE$pED7qYeEm$Mp2N#t^F}oI@-mf33qsJZ*-c0r9v;HGoAuPxp@RfKmt#9*D^8z3IvydNPjwjI8Uph-rNT}Ez z68{q_8DM5bQkF`B%oWz3^6#R*agl$P^*&+L#`-yk9)FHZQ2E)qyYxHP+lyDMl)Lw6 zlA;ki0^VZ_xn&=L*}~{-#>Wma>-Ja71s`~)yJitQ(uLd4sB2@~p$zQD)-ZcBu9KEk zYpcG`R)6OdS8)9@sx_6ociGq1iP{#1$(73zy`Ow3C@9FURj!e^bTtAd=!&nkx}gdi z%}()pL*J()D7^n4MDhEzRp7D-r%^hzMXBOG?;(()qg-jeUweA{65MV2{xq9@PkFn* zQgo4I2MySz7%bXkgrI{Ir}paXnwyHsE~qNXr55zzmWn0=gg)n|n2TTsN5@LxR5fPy zh7In}k(Lfw8ei?Jvl?Zl`^)=zLtb5NNf}$`F0}W}*Ma!eU9P#iiI_BSL}5bXn1N-; zDO2yK(wZ-82qdS*?p(_faTQY5ncK*wtw>Dnj{slFgWcgn)E}2IiP4xmtHSnz zM|r;)SNQ+PuP5fe2*WfUg?H=twJ#jMJz_Mi0d4-ZRe&tkl4G2hU0A4s)D`GBFEsUi zxIfnF7`7u)yMiLQEk;*rPrO-MXYQ65es=2a)Hlu2c+_VWWD=ImoJ zLZW3i)Vzn;F7`uGKy5{jsVGKnB@2zVdtw`hGh>_XY-4UtEux|@IRE#Js~fr-3~4Ex zvR)Oln(=y;61{96@O|CQj`&?TXUCca35n4dCdc}i-D0~U$t)Ky?lUEkdHtRH3%Z*u zD&nTAMNZ40#gtjDde)UhJ#&AIHB$eeHWn7Lhd+Z-_+{?1q>i6(@rt z{;3@Dm>ns0g48C>t|&#Hj=*TvIJ>saCF2c|>hUD5QS5bQ+*T8~CqCc=T!>g2(RH(6kGAnX*v#SnR2&&Nfc;!%FU> zX?T*qUB`#o@`et3@4!2`RD?clV&V=A3nf4AnTQj!K4;?!sFSbw;r>e~DQY~Q30o3u z>O(^i+)T(}v)s4{jwn~|Ld;L-MU0d4D~6Lpih%!<7lTU!KdwoS(jHzn&txRO#);7OO=UjzV!dB? zwUVS+7@bwS{KzDJz+&o5?$)f6iNs4<6Y<-K$7s8}a!(;_S-5HPn@YDvc!UDlmAWxO zK_GkmKZ;IZu1W2{$3l7LRA`RZlLT&HH~`;@ceBnX#>hHe{o36XO-ei$sR0rikAE$0 zHH&YqVth{SIZaGh6Dl#TAe1P01^51$L^+{S?oq3-A|0X_xMLPV$E;3e#f*n`rE@p( zS}ztC!QP))=P}Fmj>b8CmPK&z9Ci$g-y4RqsoPKGay%Kel%a1WhM72{t};spYs(Nw zaghOL(VbWH9p^WecrVF(>MT?{XyxVXV>F6|)mhI&sPhRgZMAl!?S|Bs{U8|$+796E z-U&0m)kT4(>Obq}|Eq@w8Ze!=2LyrO&jTiBRTT}2clTJ>w%oDS%4W*fWf^P2KzAld z#U*)(1@}~HTv;<;$T}mh7UHJnP@m+Y)4PI*LXf9APZ?fk)L}0K@vpA+zX6PuA&{QFzHO~;6a#BD*yy79^(g7s@p0kl)}mY9A8^&04# z2R18!r%3CQNIw2j@cXs!`$aG{{MZYfwIUsm@2+J{<)Oi89O04Bgg_XVoRVS!m9=$U zjw|Wcn(?@TG9^eL#qn=LPC2)_;zd%*y~1maq@z``bNp^PukmRS`_!PEs$-6?##Xb& zGKHB?PT7SGR@Cp74p{IQ!ch`sIPJJ7{S7e*hcU`}nM?Xod(yirVqMN{QAiVWtVH=n zcN=laIC0c=INpL_6732i@vA;(=PVu1n#ub<-92fs?QC=KQ)QTL;Pjv;5IExP5rG_a zkzmp_IH<5G+~EDED+H5{Y?FA-{F14ljNlhu(XxN;o+d59D&l{@jU1qM7eR|wwMlzg z**Z8dAgJ4q!v7bA49|5x{RjT7F?1aZd;FLVHEF*ZjaXe>Vw~_3N^3{7D=kE7$|5*L z)zQ!tw52wcr8%w)QbzXiL{Y6+-|?Tw<`OjP36-e!M#-Z8?+YE9KBsf+_@EtrwsUb- zvaqATBQ!Y-d4asHkrFa9-d7p&o!1~%LvLl$1a{OGHZ<2`lvg}Bw`y2*6?&xccq3wW z^1}JVgJoIW_ZKcd$gmA&k(oAa_&#C+~$9;CH`N!(!&Y$ zl{ZIzqP+r*MKj3eN>mblz3T4nE)T7P3(Yseqphv&YARxKQ10)lx_CzDxE-P86#4Jt ziQE{53~Kto-_O zz1xPwxuLRr6?)&GG~WLMl=xdznwsl_HC8+VWb8sH(ri;%ROr91eC_LMfj#Rfzf9=P zwfMu`+gqhk;O>@V{Ar5}7w3NkANX${hPMQ30>KOzP$r>a&>d6P~p#IoBF`<6UVDT9%>8d@p2d!*SRdWD<@_k)M@hSAuBFDs2 zUOlV(u0^4Bsmldg(&s3x?1Tr|d3g%!YhQ^RYydG(CJ3(QsRGG20+#%@595Cqjaeu! z($hhYo_=Oip$xcEa!CK~m!!`>s4C%i_mf5m^9iCr@R0BSJp1=nF^%7=@}e=aW43y0 z)JSVR$mA= zfguCry$cb@D)YmVvC{fdNX$QAl5oG^N?xfk)~Z94KWaVtREd-&)JAfK8d1I1Rs^Ji zNTWl9YW+weWhyxalv7tr4zB-1i?p&P*t}H-^67f4-nTaR0r5fnl)T`tMm~lqDJcog zYY$QW34DYHu?nS7>{l06r_K^TKs3rypdJ36RHoz+-o9ec+0)7Qp0~a228`B6EwZSo z^CEKRp3OLu(oXms96T-qS%s4N`0qGn&;6k>p!mu_F>AtiN$Zl;$TjaKVpP<34(K(S`v3#y7QOb@d#8I-Xs* zZ~}@`YUg$stP{z;8?5Div9m9peJg`n&j9R1sk-PCzf`>!EgO+F(**OFzjk+!M9WV> zA<#)ut@ZZuY8Uld`0%#ouCWT7hTdM$Jk~wV-H1bbeNgoBluk7$BIL;qZwTFy zdt9bW4|X}F<2PC~d7?(aPp_S}su%$$&@m_068kGuAr#w^Rr zV=CYPr_HLP=?+s*lu@CdY(R|0&GkC8Lt$m;b4s41-k!8aZF+hbT9||Ns|u){34xYw zX6j(}2&U!}s&+iR*LSA+~=_PE*kKoz?=6rKL$h|aUFyf*)(U;MwAR{@TEbPF;j@!Qk+y$ zsTzrimBL-*Ke$t61_-^LjTrg0HPBwXMQ72Ipq6Ir1dGN z*A(GZ!F;Es?tH|xPn#}7&;4ist39y2aPfA(Ac>u8j{BF=?`69On<6oQ>=-AC9#V3V zqFJm~gBGv<>Jb$v^fEGoTru@jUDYQg2g*GL_s8xZ6b}*((esm@`51n@2DOiPXwU=X zy(s-+c>hX$`p}|-$MBj1dr+X<1h4zJcjb(0Iy_ID*uIa)iSTHQTj znuxu2_2OvdHjv?+jf1YDJDEhlLpYI|AgSUpjLQ)iSCZ_IMP%UmAVo@(jIm5T;gda2 zb!;Vr7cD;wd6n&?A=-)lIAsbHy!;vA)J4xY<$46EL=^ZSwt&NSADZtr^+fOeadW_v zpQw zz?KsGXy?+j1Ulh8c_7SX^}IDs)Ve4|JA4D%3m_2K%R&kr6^z?@vM$SzVGgeV7&)xw zN=e;>!h7<8q`_H(4Q{Zt3^K^T@lp2LVpblF6eA{2^7Zpe@WQrb+Ddhi)-k4Ymi{I} zi162gvCwELlp^{eKL+C&DSA4{%2|<4k7&n|ca~^RG@}MJ8pn*vo73ll1BZ;6T?p;> z^xN0f>s~a~owYH4|y7Wkt%_-5pUUpawsZr<|?P8VDzyrBgE6^7)Mu&fTeFNSn7JT2 zK<=C@+yRR{&^~x_a*VOqjx{`~x*yG$7dY9kt?x5dSUzQJ+C?9q`EHlexi+&=Zy9 zmsh`bb5&h zow%FtZP_o<#l}SJ1N2sgHhNa`n4A$CDcap8h~8Pp69X-im%M2&3o$=heSJ&5Je;vf)OhY16OlPBi* z7z74N{9;qScRqwyBW#9)^B10;AR)Ok0<)(A-2iQ3aW9k_cC}i0F|HqJ3r|fT2R!b` zGKsxuBIyS5um?aJminL0x`w_P9$xg%um8LrR{$eUm?G?^*@Z0kkaiRTPGEodpVri* z%!rtsoed3L3PF_Y1h!WdLxSk zUj5Z*vm#n;y;O9sSq!$lAojJHuj-TB6UolCqVEbc+Or~S7t$e|NKINmUs?$M46>Rr zIpBd0r5j*oEK?#tl+MEaCLb z-MxE)Br}0zTz)24l-OdTgSIUPK+mbEAi}WP2hVwkvSYq_GNcHGn zmdqwubKNU`QlV~x5+4T!ooG|>70L%SJEF4h5?zwj)%K+TVpqqG5<`ZZ*sShk3+J;%%56ZitDT#i z41;}DGl13!aB*=kE`VDj=rSI;MPppy`0(-5dVqRhp^hxbLEfPrLAB;P_p&!Q&**$Nz=RE0qjy@z-xkC z)-tlspb@C~>)*!@8X(ib7b4Gp@Cxn-a^PeHFxJw|82KVWqv22VBx7}Z)Y^3}`bp{b zsktFh_i%rct--25@38ELG@1Ntv}`JHoHFZeZ3 zBfyl4Ih9wK;O7tHS%4f?8U^VaIoh@wB=W5m0p0APJo3@&rbrFS_UqO8JL`FZQ7I%n z%9OF@aOnM+vo6}U<19uMR{0~k*0 zv)i;Cy4E?dF2T*q=nx-NO$qvPtCvSizi-^RwSfVz8HZ~xcuzq z0dj{H%yF?!ab9+V0I#nvJnm>pOdklm#P>Jt$p*FKl+~IN#7RWEFS;4P0oEeV)3MHR z%DVA%?I$a>@^N0z@}_y;z-B3S5cGdG0! zFGOam9m}@l;PuBB_%Rc*$GCR2A5vj#DTW$+d`=aBb_7T%i$s{8;(-+S2E) z6IoZ7tXA{K^yRC6g!aBC)IXk4bc@_ds~d~y)rd)=Xlc?ZUK!G%fSxOG9;K%{kHQ%4L^+u`8^+|G3+CFBr6fXW z6D~x$q-vRKps8o-E+2{HjNH2K0l~HPO*Ofote&-`rJhxzo&}JH_gOqOPFdK8b{umT zoU)<3?|FI&*)03-=yn!38Gal{fbQvvn=DCkz&e!Q1T;YbBuIAK_f;W+jm1l{ar74p z{L`QgI~5aP+qLk0{_gi2RSB%{HxhAls>xb84>Tk zFz_(F?R7Kx3tV}?&A1zyn$4*%eoyn+8s{}R*Cw~Y2^LlIYIA^#=Ug)lcP62H!vDFm zrA~+&E_iXCI_7Rvj_T1_OY7WBlC%5vYDnzZAG=*wrCGAtKHPjR_#l07#gu)o**+#; zp0sg?5-z>5a#xY0ZtLS|iq}=kR&R?EOv7EgY5={ppL`H#F=YaSv6G4BEGCpXe8lk% zR8|0tZeIUKt8NEK`LX{=*wv9C!e49PMfR0i2kd-fyiU{D5S&Cb}`P+>5(>_v>RX5V?PuR)#r z{{5ck_4LO%y_zw;^I5Lt{eEB96*!`~+qN)?j!|1_gPj&hS#)4WQis3g5pw)}%$~rJ z?R^1zY&k@b>lTs{0khSy*ptYhRm0Wi>wEXx^N9cz3tlk~Zfv|@80XhdS3`|zKq&`} zDg<%!1=&kB`n4dtGFxeLp6D~LaHA}^DJ+*reTgsSR-bRnv~(SwDD!FSDQC6weVnR3 z_O@x)oym`#v*qt<%Eflu@k@3|&0cDmEB_w7b`3>G(UP}vhg{L3L$kJvbsuD(xz0p; zFXTo0%ibGW$QUlMQ&@}(0F++9f!GjCsfv<7?XZXC?+flsgp{hImJKtZJSvGsXP!d> zwv_Xr+R&{=(Y(RrG3S`Y)0Qx>0&+o`0^3ef1PHVhz)(31t(FE(A^$vImsEyEs#!{WLF> zFlPJIeV~7OZCex+NNw!WM`ApFmVGUvy56ba;_Xf&@S4__$oefAlI(rNgpdZ+I4973KAa$Mt=|nK!XR~s1mI47C5YeQ1ZqD>o-|p; zCk=wc?3|$^Qu(Pvz79K1!&;x?MhFvNNA3$qM~=YcrD~|a;YW&BY|OFkN@C@W4y*S- z4Qx}yGo0dXJ3h&$d!~X38KRNM3$M(;bvJw*POI2$!zZb@XF8a0aZ8@xuZ>p+$1?dn zI@5lrb~+Q)^xMasru62K`hIOs(lLs({j0MB3u?^yaRybrQi69HCXkY37>#-KUL^xA_0;>HTIaZXa4*G9u!Qi8WX=^Sr`;AAS%I;{XO+isu~Alwz% zM~jxoEFPjOI#XXmX4QJhLj>9{ya=={;u|if?~g7YUHb(k4gh=nu77ma1_>1fvbT!t zn?ODom%@0x%zDw;nd}^xu7_>U$6d?jzv)}tHtKDUWe>mxNFC(eEq%pNgS}JVFR|C^Fe93FBwlC!T7bCUPlqm79>u-a#G?s6M5hpMYlUKtRI?6&}&VHH(Tf0$2 zkmi)xTD%0F>s%O+ZL#C4rLVsQ3P_%7ED!k7s!O4ZXS`p7uNt_<#f6~*=&as2u8aCE z1Wto_%G~?va3L;(hHMa;gclmds_u{!uEl`EDSgqN%?~j!zt79KV!lv*4D${a;g6le zkv;Jx6)#6WvBZu3Y|6CnyFMr3Zbp4YhpL^12UtZ}r)Mgt>{5perY9@Pr3K4Fqp7C# zABx9*x(Ad8*v&7^et$aRt3J9i1p(50c&jjqr&-fSV%HR?0D$7IK|moZ)z>HE6+-kI zp-YoW1=GNjkrCt|E-gZIC`XC`&6G99&>P3UgOzU6SE-JkT1X}EIGwyZa#{$GovQ^k z<^KHFh=a28-|_>~W@>Zcd4H1EgH8zw@Zgb=kv$RCXhkFR`hJ|DC+m@aJYBV26BVlr0zJu0jD{BCB z5vx!-k#?H0>xk>kcBN*g{KQ52jR`@{QW7Udj|!N^Nbh}K!04MjZ?3N)=o>?myrA2N zgBeV;VYT(mZR#@#wEcEdvxO!L*KX&Lc8N8wgwPL=E4a3GgQ(zb+M0u_d+V*pCb@VN5y0h{y zu^UEL-k|~}6`fjBLD=Hb^WBx*t91TtMbAQM@kyDfWn;g2>&`>k5s^1s+%Hx|H}3UA zVda);j#5@_+vGq2L^DkNXl)Mt%;VOV0Gh+qtG8^nl-D~DXj}JS?gJ-A)j*q>R?*Mf$nJX7NQx9UZlx1rO1?%sJV+qMyBEtgk!JQ5h;<`M&(#y$Z}2w%FKP zZ?}yfOMoq(WS4Yq){yUk5o8%pwR}>_8+&`sZTW?EhPkHaEd<`DIm?Jjx3g{;aX-F1 zt|!CZwNM-S^=IXZ@Zt2xBSDb^HwID;3FVatMPM5%Ql89%atMVbpB5p$2!xyyr*(B6 z{=WDib8;t%>BnVAz5B=gxW<+8tQwP`i2TIj+&UeCNboN+29Cs=N}JOgEm^^A=6}R` zR-6>~8QO5~+RMKG{c`bQm47BZ&B}o^>mMY_HKMA?hB^l?51sc%u7W@T%uzu>0RTep zd+!UVZ?}go&@k`g(41tNnZ7=Y++eqSMt&h5I?S>B!JNa`tUv!4wOI3GjEsY4(c%z! zd}1;!bE0G8AQd`cyWX@Ec^)0{{CTB4t8kSfY0sLP%bz%BC*@YdHKxZgdvEclaTjx> z#~hNFg5AB!5j1E~9yOnEGbQFgeI(Wpi4h%$OhcE$RS72_lZ3$p?+!Vv1Gp$}PBKpI zoxo$HTzZHKY|=phAfAD!_kB!&76^L~r4$sEnm1-#=IUUS9R0%CF|*sl1o(i&3dayO zI*S5xAXZg-hyrb}IXwVyVWYa?Gx6X zd@;LRFS!Q5HylKg3TQj`A}|dE|2J(c;hwFC&*aQznHuzLsc;M>aIm-NIR0*uxP5RZ zYcWOlGA6%&4&pV1s=T_64opViNV4lF-9-yrgb)~lwN;SpYjblLMmenH(sEgS22&Zc zKow6}HdD)GH%NZQAFEYN+J)`FS(-fklN5ud@JEFaeEs26WoGl~Qya^|oZ1hpn0`wh zGxoRfk#%*!w#8F5R3E3`Hfc$hrvPY1c(Ejy@5D9w3H!MX^b>92XBOO(P+1 zz(5n1YB>@I8=tJKILUQQSE%BLqfIwSmG@?(C2@AlO;A-OixN68(5;mX21dm%xL8Y2 zmiqfgemgDzuCf``kEG==(Uym3u*b4&9qY+l8^#Awap~0~`HO8q@A`#Jg4qbG=}Jxf zI=4EHJm^YidwWz)tQ0x^bDIwIPz_xE38y_o)L+S1G~h0<1}=p6`hYr(Q67MH+P43F zUwXxMhq)i`Y*V^~maD2Y6c)a972>WrW#-wW($G!CWBnZgA2pXhSM)qxna}+?St+Ji z@6Zgw?)h*-F;riJn7rvyN_eMK519R0|6pT=P_#DtfP#@SpsdY{NuYg4{fNM`P5>i&1N+Y+8VdAg$CMRUho=PEW%V#2 zc`l2a&<8qLxx{SDpZmC+erPhA08+tTn0B+)DbE6NH+baTKKa z%I`SbZCyAD{CnI~^cF5<`fQ5Ixf%aM8LrqIIM(5Dy%(GgGrZ*j#!8 zA%y%x2=HVYR6^{_Yrm^nCP&K6eH^dU+}J@U4}FpQWde|ASlVGo_=`w@m!{W@tTjae z88mW5t9n_XBW7_=fF;Qw3kgf70$vj%*qW+T%9KAAq|kIIfbeO;jyD zsqXCv-a;7KY+NH6WSS{A#ln~ZCJ^^{gP;%$GVI@6!oIl>9LR#IOD?rSJL)yY8W^I= zw(|KiHb;;?O9=ntm~5S@NGcW2wWdD`k`F6@>G=^zURQDw5JCsUI?_G@hk$mP1Tvw_ zTAJeb+Xk^J{>WILXnUz+jQ}!M7Q^*y)uR-PuGsv&UH9T9NYPnhocgTSoL+R?` z0Dn-EhG07iPqHUnAZu?4)3`G-Ke$Dc0?N!_z%Cr-IK@OoEo5VuMV9R9p@cY3xMy== zhQ;!tL`zpeewO{u z>Vrj*(o9@e=iXJIHovbmT*lQx%{t;x*5Kin9(^g{b?vhWa^M4bfs%$qD~du)3x@xL z^1d@`$}B-i$Sh8xh2VY7_trMBBYC9|Q-v$^{|3%RNxIdV53d z)Mj{|d!~p(T@N0e$IViJn+3`LDNag@I3nQx=7*#xr;tfR_L;i`n6bRy?KnHuR+ZkZ z^71_Tmr7Lpg_Xlt1ukg zj2jsAu{k0id>{QAb>F;{0@F;-o4T3SBxdm;QTXyWo?woJ-RUuP&6=x>b5)_|yfRtI zc3**)^Z5Bfv%GvJ-8*40Ex=NJmr%TiF1RiK@^?Mi2{a^^za%DHyNfV63eds_Lv&w# zXJ>Ry3a+jN3Ocfuh3|BKL{g%4mB;Gu97lQ%)1wp_1okjehCRn|BSRsOetn1<1k@TF zCBFu2CtX3jH<|y?oNgR5yrKV?LW1{bO^|>9;s+nQfwR$d zY-{Mu73gdT%PHW=j-fO+v(N=L^AFZvWyvdKt_0oN@V!9z5I|3Uy~3)6hOnO)IXJV?&&mU&-*<5IYfo{#|PF5D*rdK~qKyQ0p8m1=+@Gyx}cH3E0%YY1!&&v4e? z8>L%GDZloP4X(lOIMez?_`lWJ{;$$ex)kE_E4Z~j2-j|W!hMWs;POt@jMI;^rNZM) zT~>4zNt1}Ql@IUci?T_jZ} zIz=54bsCmnHD2uYnw?AwLUJBA7i&*g7BeZw8Lm6a9G;y2&r=TCj)suS)+%=d_Bd>~ z167vj_&-AwNstRMA&{HiUfS|Jjj%>)fH~M;h*qnO3m+)W1eyL8`ojDV_@{xo|JzSE zeeYjKP{4}(zQlAXOa4BX)ujR@r%P7tTyoTr|-9NS&U9+GG})pF)8n{Oe5iE)oTLvlT<>t?Z_CdLj01;7I3^U^z9f z^f-JLGtCu9&>{wJ-Okqw3k#e1g!@}6 zJRu>Lc8q5s@=wi=Fa7d4pU+;?q3NUmlN*6M0M%=>k=lkB2w0E_ zD3Cuu^a3$jY41kFq6?z9{^2yJv%B^%0vfrrBPb9iPJT^J0Hc}`HOdfuz=D%@?0U>j zLiD^#r&gpyQX5{JlA#c!oHL;S_%YLOddZE8aJSHUO%j@=`~s2ut!*B9_6_Fc=UjH&yHJ*YyBa_Pc9L8=hVx;S)2D#P4( zaY}a4X>7@JN^$J<41d5A>&|^B3$e1vgeT$JT}-#of z0lxBFBNEO;L5=`KKGZ9Z4NK2hK*2Ri`XA!DN)HPJF0)l`?k@Gh)wr*9-(IZ)JV0yx zbET7shNjl|+6|Y`F_`?-hk%XsbXjX(g$ViRRnGZP#5@fZM)eu1+M}H8Y_k^vY)?lL zB6!L&K*S%Wv166X`3|KqWe}j)OUh;>Vsn24x?{dR}y>Xs_ycec0t60VDh zPh3t>6*}{n)coN(`*8Vo9H{i-;@$7SbRRjrneLl0Vq7J7&W;_L<#UXycdF%w*2p4C zGRt|2#@1perRyOeU0f(kFLc>8(&cFN)y;9H)T@7FCl#kVD|K+XTVhcxe{IG12?&tD2-;R^0tddgt2h`{#w-lXhnSKy{UqG;I$EX>X zGnJ;-m_Pm5g`^8UqM%@fDm}A^TlcrHh^cRPaE2^{3Q+#U6Se7`q@(mc&h1%jx=OKW8=KtNf#hq*QOo-8Bxj+@=zB3Y%E@cHM_oe$5y-`s9X@>6&{GNu z{_L3v+Z^D}DFFc<3cXV?!?|!yN`dN?1+gmg^uC9C*rmR9ol-6;in%fO5NF3!qY2WJZR@XfJP7NE_C+RX{Q6}FxsYF`XvdDm zeJbH4w44}GrW;rWhVR(#-6T;UGD~EfzCWW-F8|ualdy}~UO0Y!{^>Z0AaX%_ac z2q|hFgy*1OU>Fo1G!N!DHG%r}#;AA}7omVTFwOn%!JB9w98ZaZD8DPS6MFrDZ9`8d z*`g+N8?1U4i}kb3O233PS}V^TlQ#lLhwiTa52=+Pewf54QN2h_WPWM9i`8bnnM4P6{Admbh{!BoZk<$HT+bPXB9 z(SPrwwLex`|CalnDNzNE?W094)Vg=lu^or68vCPxCv>swPDoe&jORh=tW%qk=pX;CLw^0!1ywMs=a^HA^v7Dh(X3N%(R zLeZ7icvzbDfT!Ng-8!=hn=k$@Fzr=rz&L7uwoMBYt#Qh#U0Yz-pp}+AM1!b)_4pla zKdo=rVeuujvAHRtY_2fyK!RPza|oZC97xoU3u{IV|R>^hg9m9Gq+bG9SNOBa70 zz&|HW249Ik?wrzmr}=m-UWnIy^HX$vM3tcc1uq^J7KWAWqf*;syW~j!+Vp4tw|5WI zWZ8fFYTpmiqAWRR^dtQ1?%r=T9yvS^NG{qqS_~Id#1%>3Tq$^^3hDL5XGqJ&nK(pl zn^IzNGbX)%e<7Yod+WG~#iJ7h11zCkqO zk?ju?p~5c{dnd78>rr9*>K-sW$_(*IYOU(#7I85l8>Jd$8~d>6T9>u&2(+E}nAkWO zw`KBOdPV>DnB7-y1sMELSGsIv__CYg=B=!HC4zT3LJmzWpeZGY;K^p?a_IV?MGw!T z<@kjfydpMgq0S+jH2Ch}7L2Dzg-k zFOAK9;Uw69;ao*B0L7VK02pPm`xMMxkJ3w&PaeF$LxKI~?4Ux=-hUGW`%Bgh$6x6R z3m~$$w0Rn6TS>$=EcR@Hd=ph$j&SCBL{*`W|7-;*UNJTn} zsISV>Y}L5v!tX(nG2xR)lNK+@QRu{yQ>WPH=|oS4ck=^yh- z*u%O%2h!lgmy~o)RrHV)(2})l){vp(?l4ye%(841_bg?jh4R0yAK1KQNGZ=@JnPsY znwsZbPJ$)Ib|yp~odrgaz9%C;odZW&;zi&MQ8O21C^@;gtpVUZl2$#7SMhm^O)wRq zN&$ur^YQSMcUtxpv;_9mwR~pdKT_BCT+h17U)0p2COcM~`lz5LQc#kTGelbZ>Qg6F_unma@)i7oOjdEt!rgPRk_l4DUX;J7~gb62L=r(5D1 zcjA3z{Q-F3viD0a9wW9O3DNWkZ2*J8!r9TJoIFL-9Ib!4G8e9}xWwR4I>$37^%+JM z%aN>k_tK)^@>VP@%(R6SMxfvduUl-7Rz*_CfrT8~PWIHRT8ExNQ4*!duz4&Bj z1{WK0v{rZh+^ln2QD(JN)*F3R>Tu(Ld5C^4QP-Nj+~*y^YXw`T>hqp&PqzY_PsGmOHW6~Jbff0CT7&T z67!H(ylS&1HZaY3=4EA72$TuxF>gTvQU->j!8xV89j);T*(QC*QVp-BLuuH+<1#_( z#&OeDaoZq`rH;MD24{6mSEfo29B>FaD}`4H@C)KCPAs7n%DpR9 zB=Jt^VzKSB`6p+k4xJB7+Y&f(IR7~1kcC5YclV87k;Ch0i1E1#hn4bR$b)YB*EGK! zf(oQh+@vxk`Ehfc38z#^aKWEU=-6z%amv+m`dt#P93eUNEfUr>; zKrz0(w5p~4Bk*+3pYLDbacya7`Sndv)|JSh| zy3!V(HSu@Evrvmu4pi>GIXsD-TrOQoB&$ayBtF@Bxk2n@ulm?2k+i4J&-OTEiRr%f zic)sUfyk}zA>+CuJ?fTfaH+*28beYyuwbLid&jw$d={{Yc0EQ(#TTfIE)6tWMaf(Y z8ab)kP>mVN4La=Pv)>EXto9UCLiaZvmb!Q5*Fs)_n%<>uX%;R_aTD3-wUg%(pGZx_ zYp;tw2OLzhI~?7{z#g0gdmztMg#sEt1b4n~sUFe8}uu#m|)dSA(;uc2UJhDZ|E}$utqbXuDL{4^zMpv&UH~RPw^jg*o zOg_6oxQ0pCJhNMChV|uvm>=4{yt*=;McqNB!QqZeTm*^FRbIFROT1Apgxl6)d0ZQD z_8$Y_Lr=Ok`r{0!rDlN2?^uZq!%8Ivu%B$K&lu?MTZc&1sMQS6jW_w&#jUZ+5#lxv; zR?-RbppM$zC^wIQ{Zbh!(}@KFlsg4{YYy@46j;^N9Y#$k^Ia|_DH@V}$U~X$*fSWi zxhDBe`Ner$&;DxXSUKaB)?EX%sZ*ldMx70Rl<`hpxocGpH`(H@y}e`+FX5W!yWwB9 z`o3tePA;CmH@zP}?jmihn;gbcWLBDI_WgWuQUB(g(}z>-+rn;6Uo0CK&pA<+FwYeE z{6xB7o$a}kB`JgKv?^;b1L0+ts=MQ%0t=EChK*zMO+!%N)h$#cpHWl2xrob)6#c?4 zj#d}vWca}ng@vVtMYE@uWB7!vKOXJ4eKGjPqRiAJ&&khW#As=CVx^-Fv9hKn&$9$N zB(0`HzdbT6g!%!=ocSBXHtk&P!OH2RqL&(isjVl9&nT;h@QL(%Kkq%SAAEyy`9NfZ z+c8R6d1V-7kfey_g|J~QIA%Cz8nn&+ov9+ps`yf_v1_F7wY85nG&VIQ5s4p5 zJjBE)5?ZHGsCo|@_Uge(2s`Yn!>N5P*X?^`Cam3LVx%p$L<+sDQPbCtkk(+@8U3wh zuM`}2(PSs4Ni7eB2f6%_Hxx1fsQeo0?4PuDd}CK=_*`zphufJbVURo=?gj1Mv5#K{)t~dW zxT<$Y9SW#me1=O9#5b9hPad!LiPAkFHLT}kQ+iuYDHR+qU8KbD*QbovZg!E!C>Y}n z%eR`i9Q$=aS`AC`s=+r2ZrE?RSblTYww*8xfb-YeAYa|FaVj`#b2tA_?@&Do!hq~Q zI#ZI9wJj}QBQaQYdF0-{k0{>fctu8X$q*!R1!Nu+uVV3Cd!6tu183S;Yo^(AT>oZ5 z7bc;p!)H^^qXKY#f37ECoYm8t3)`ytGTB_r-<={HB;)^lE?lP6!(12IT2ut@Y@u^3KM?E5Ih*sJz8Du65= zC?F=*EHehSW7D5IFI~L&@E>W$UdW`=py}<8A78b|f1r3N5~fCU9D8nP>RoDe%Z=a=aU@%OD2oi}N#XfzMfDq;W(NMf) zsc1mo6yo$VLs|;MGVK>m2ns5?FG}Y))XCA_qH~4>>==I_2AB^`2n}QYWreAW9X1vQ zbGpT6ON}J4qm8+l>aDqE>7q5sdez<3DVi#yL#|5(&+bx;@!PW)w?F2V1rg_| zjkDu!Yr)Ss=x6A(EmA40u5vzV&Ut-z_}=!WjqHc#7ePsbe#HB3NKD{f7?Wfiv5qd> zeEOK{cd+3^J14=}=HD0(506MCCn(TO%FS(>s(`Ub0R8>jE`lU}@8@;bhY!*RclqNq zVo^fXk3<=JNlv4-qrwmgjop)KHvhgAiuxlTa|s{{9l&5OnrKpYzpcxa-1 z@;Gk;zR&DNM=vMhHUZU%x@R#TWM5#d)De^h)A9KExi@b8DoT|YNNzW)xpj2o_P<9C zKLA^B;QG)V&!0bki=_VRc>{tOQfTk@^(naWkT)##(IUW7dhNM7V$VMuIv^Cai+AIf z%pL`F>SVw{@qFYkTt7^R?+sz8z)$^X!Kg7Muyf6M-72sm|LtSx=SiaFp6 za!DC$qAtNm0><_#4IeMB45x^!P1SKN_l+H)ao3kCp%Q!N<^~MHlV9!(a1@9*&2}|0 zG>m0YYoEZq2uDK%>xMrsZq*cFY%CPZn1>_v;@nX)H*4B=wd#}@NLn-|mE7TD+fbl06sBcp?Png{~Bmp@qWk5x*K3HJO#bT zN&zRT7MC92`LRRj!| zK`W4s44zxZ-vk1{DBf3U26VTnNq3>30B@wM?6rOS_Fw|RCIE>@sAMp#X`+<)$fM1l z&B8A^-8rj%G@GY#ex58oL$qi1zv-z-s+7;KR3v4pu4hX+WcT>$A)`0)4ikeqlF64{ zskXHvnH?_Xz7{i|6Ic6jiLzCV%e%v)3T`MvC$#>h` z1pcz}@>WxqAm^^AA0Z(j=3SoTKO`m&O7%&jEXKCh$Ep!o#c#*%W|!)p?>WD|%ztf_ zBigh4a-&E83t#*XMDl<2$^Ue=h$8~C1by}cAQVbqH% z7YJ0W89S={QGsMBp5w>A-Y5IEytAl?5UL?4VY{PRGTxa!h&eRj8gb`k>>N6bm64XY zV?0>TjLp~go{a&-S2;sbD~j^@x!QL=(@)`}%z>8lY(ha~>g%THYlYcPoi2^R!@7;W zR>h?LYlMy^B3W0k>ErjjL2Jy*;Na-^XfJl>;)I!xe4is-I=BdySNn?F+YJjX@ylkM z9e@36Q$ua-xBpzOu-#l3b#?Wl6#O~GjdlD94)H(MG5ebM`|qcZnAm1wnf;D#*bc-% zAhshdO#qU;C%-Z$#N3qm5{ zoM^LyS0%@~G1D|U!m+Bf$`AkrzEU&#N?y2DJ;Y{{;5fqESe>fXo6?aKReC;Whhwsp zeuz=(Jq4_>^9AgT?#(YhyH1f*gZD2T8o>V@i?e%v`MH#e#xxZ5?eKRXZ@Zp=l6XND z=H{i~b$cHbe7lbQH^#^)+S}WE$fz;ZK&->D%?5q%XY62rBH#>IbG?P57+;*l!~Zh2 z*T4TFYvhns`GZWf7jP1(0hZ^AzP^?5ZxQ6rix8ZEfrsk2O#yHfkZ8j$^B35AbP-mX z`!){&F6^oFh3VlPa%l3eokV{6)wEssr996SkA=I4j@dGtW$l#)-g|Kn9RzergGD`B$(O(;(_4?~*QAaQtdOjcI) zmFkvPn8)D_RVf8K^mkib|HQKq)vEj&E_!ASr|29Ob#I0cU&Pyg_eK!c^G z>VVNJKL6_*%fdJQEj&kfqN5ZD^IqrVGp1A)=V z$Pjw-J{k7rdCq?ld*cOxwzaXp{bp_YT2n9UeP|D|{q*;-Q>RXCzm@NNi+&Fvcy}ro z!(NR!DQO_l^skduqp5D5QMr0*!2?Z6mQ*Pbo5J?f`BlMf^rmUREp^wX5Nr}G$UbP{ zbcHD%O0|p87HlbTQ+*N+SBIMa(OWU)p;N%Krw}97wKrbaE&&{A{A^Hg@GWT`mvl5` za|OCSq`RkQQ|jj`2v-i-zsDE2M_TF|rR#N&9O?n$X#7u;!ekpLaJq(w3M&NT9RBN= zooeUA{Is_hCCn9*aI}{mOY^T+T~-``IB@g;!~uNOweGig<&h~76~IPNW_b=4b)>5_ z=GTXvHXK#PCV-t7(S%V*jbPd?3`XO~U($YupMTrY@65o3;!HAbKk~x$okla#ria@S z|B0C0#)!X+L(wi+A%P$4_OA!2dORpiyWsJCEA_4(+yOEWcwRV*P3o^ItEzU&2~D&+ zyFA(+$l3MH1J+j6&wI|?3i0YSYEPujss zKDdZEfBt?)>;*>$Jw>8CX~F=_vHrRkydKqv0gpEy^glojoZL{PC;s=wM&3@m?TaHX z0Qay)ztFQi$+v$9F;c7SQ5vr%T#BdtS0l-2XWI(|XPjdi#L%#d&Ec0=q%^Worrj~9 zupLfDo=KFHn&+l$e=yRvQ@RD^NDXR?gXBb z$0Rgl(q|$*N}&4W1i=lInCS-{st;1za+Ws;Z*)NF9hL$#4CJ*bx=y=tlvu=r()uI_ zZK8Db3$Zm3Gyy4)_%c;yW!(}q{eGXHWZ!-|I?vDw9|g%lgg<9{?|M82L@YPdS;=yB z_~WiMVXFs&Qe`^B&jA)FLGN_6_E_(EDCSqUJX_;lZ<{01gJ(FHIDNk&DG8{p0|yRl z7KNpM_ks+>svaxtL60G}UZxd)?j{d6O8vFOwJ+r2Hze!xR#CZ;N_tZ%WIKF(D8GIB z%?PoYj6}=&Tds$Vqs%qy%Oy7KzpKssv?!oQhZb;VO#;QDc5z080-bb?bc#V`Q-2j% zaZcNlx_NC%Bapdt9h`|GScDR zfJbrh4+%nxs0#HIi{-$xu9Nf_#@jDIZzKQoR|<=awANg`xi9158cRJr*~D+Zg{=5A zC&t1;A94m3Grs0#NRsu%syDKDBz$=G3|DPn@k>fziJT0`$GJY(K^W{@eC1MjTv0`4HbVa=(}bXZ(EFQK$lx+)UDnh_=mLy&aZ`9wWjm4?FzE* zWa{T>=v0RKWI2;yQQjnGRbG3TSnzP&!h%iDI5g;R>x&Uv%(SW+~1i}I?b&*&M5O6 z0QE>;kq6-FcIRx~VdxthkFLUMWNQy2-GsBQGu!1zsT1X21JmXn zCqm%oJQ3_O6CY_?6Vkah{}n`5>d4Pif&89ub)Zq?q2VnkgSaUocF}IfYOmRw)NN(# zPgqOw&wWHfPdUSp0Xb5FdXQk+0GfX|VM1HDN{QxkKm+~rzxX5aUwu_hW?Sm4m=tO>^J4AjuqV1Apv zYJ8-FTPr&oA>*PVHKk5#aB5IH$$`|pIj7`jzJ7A373JZ|>+~+Bcsm~669OVyUdnl& zVh-CqMT@lu3C!MY{ssXYD1OdhFAzS+kszjAXn0#yrM8iQKEi`8og+A1yOLDVknbAE zvui1*WZ91uXYZ{zwtSqM$3ZViP{Yeh8ra2?w+oW(Ungs6YsW!w(w6uqnpI=t!v4Gy zA2@QQWx~p1S&PsiWUSda$LC&b5KKxuUfDC#8c3%4g;jjO0|lBCC#FthJ!|%CetOtd z{ud(jC={4VzeAD#4jlQ~p5sWAlqpc*Wl7QLiBOyzD{pbh{L$s0J=x3@^rQG7?Z%I( zvNpD7N=^>H`6;wFt|DQiLpXS8Un~Ee;l+&M_9U00CQ=RSDDH@8)!EyMOI{PHwRR8|eM?ZwQ=P!r+ zy*Dm6Sgy?YmW&)pmi?Cw;E#dR6t3>$1f0;V2snQmF4jr zo9B_FI6uF9fQ5z2PQ{xIx}fOs-Y&2PqUhW6X6Wp8j#&5{q!WIkCTWPc2tgZT4^2e3 zWRU+Dy`5!Bpq;3~cQxZHp-QrAhsb*NoRlG2-4cC)gmj>31q%4h|i`H1Ho9>Z`y z&1Ppjx{KGa=9vTYRvm-Lw<>x z_LilmF702{$CN#|83+%sQx=;!bp}KYgT5fKn_Gug{B>P1e)} z4A}kiZzl>4hFF44L!EMZe}97wz@1sip!+B>lOyd4a%a?rKIHUCD&O2afYSd$a10oNf zrr?c7)fC^sz!6FEg!UL-hZCRw^u?L9gk32w+j-HDQD z>mZ|;B2_!h_Jll(R0xSg2R~(>Dwd^Q6G=b#!alOkQsr}cgY>*Y8MjNwj~pH$1|4>5?W}+h0d{D^nT(_CaJ}en=2pDUFSd1^@h5$ZJROmzq7kKl?Ay6IXVa{kC8GWL?6QzQ&do0BxDokuihDNTAw>O+n$4# zG0ifH$u>^xlS;I&@ogwj&k~NG>}o6?+!Z5_*3^uTKh7ud*%e^QLttfrTcRO^)e9$0 zprG`OjqPHTSxy1vQz_`F`{%ltZ9Akg@gJ11q4B#KmGm0KDgYSA29WmBnxxi+jW-dZ zk4=Hp+NvKC9Q??TSox(omkXn1H3Q+PVvC3uPTjhE!|V921K>=vAkj?Q7>o0mSxq3xbbS)bjYCiM_$Ea+|u1b-9Va6tGrguup- z0NRUo0KmTq)M00^%mKFnh5^W7cxGYPPjnS|BjcOj-5;^y#JK3|CkEk7+?fX%%zsQ@ zw$<{VpDlS^je4qVfK}BD(3&9CHA&qyiS}%Ws1PJSR%*_6yp_0t6@j)68(?OOx%!$hOK+eaJKEf0V=qi2uh<`>a1&2RNXSRe9*n;i#AGME0?Kqt z)jl(R>Z446#aqskKhjT`v$ON5)2Csw7(l+Dt_1S=qr}q!Ud$>r%~SsP0#Ox(od%4w z;I-I4s1S*uv^XV}%VC9o0zlXJ_pyr&d3MIGT+k<|cWSs%l#=T41CIHf>K?+LwZriU zf7=iDF02q*!{`8+e3as@0~v}ml6I6f8aOW-Knz1N57pQ6)2*L~OF86j(&V4fm*HbS zrY5nrz0b}dIFU8=xgPMwT_p(hwN&u9)iuE zk_D%fM%OPvzZ_AH)Mi_#{&Y9n-KDYop@Fm);5iX>Tba_vS%xpGR(f|tl_fKfeDl_= zosR%*Af12sXNzi6gc4S?LCV6+Ec;NFshS+Xx`a72LEXY4f|6AwO`AVaYF9E2*4epl zYtF6cv{0Q7jrkU4iS^liff|W*yB%!SEkjNKPLVggaZr1jmZL0*yB9I#R_<6VV_Di6 zSzuT__++r24JAA`;;B>B9QQ+6BUe)6d1B&H_}|@2tGHIZms;FiayTmBUA>1xbASKM zsnIUkY+WY@z{;xz(pIAg35Vw!p6C0+)eFtyR$vXH?5w{gA9bKU~I9Dc_G9^ z{09_Gjp#!}YZ zBF~xq*D~e5lps@PArrIu+EKsGB=XibxBpoCNjZd%0yG+6Iur7GOlTdW4AE-Kzi2et zv^W5rGYd=8@6JdHAc|S%zJhHIeRV@`K^q&t;NFD&e91B9-vPkPK@rT z8-!8|-RoLl!c7jEO!S+Jjhd<2)eY({p5yGrOF#Im!gDn2$b|F>Q^o$C5PM9)*h#UpF^oG?(f}-U0pLeJ#jA+Ry

    >mgJP_F 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≥ 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

    @|G9t2u0>!`CSIaQL3m5Ny3>b@X5C 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

    jK<7}2JY^J&IYU|uB)kC`~_ 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

    <0kZL{V6E0cFuF{|GPt$LjvAFuh2F(hJ5& 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 diff --git a/docs/files/twitter_follow.png b/docs/files/twitter_follow.png deleted file mode 100644 index 27ba8b8799f1ee881863a74318550f4ba87de3a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3237 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 XiY@S{TFWG+00000NkvXXu0mjfqK8@& diff --git a/docs/files/typescript-query-validation.png b/docs/files/typescript-query-validation.png deleted file mode 100644 index 5a937d2f86d2efabc7a9ddae90ebecbc2df6490c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58331 zcmbTd1yEdFvo@MH4ul~m%$m_ zxtk>KIp2T&bL&>!RfQFM?^(Nh_3Ederj9$PWXtt6X_IK`J;NE`yb0w7y7 z%9fSt)N6V(M6DY~$XCtJ7+1KaP{a@K=;|=0twfbCu@L=vN_Ul8x=6SvN${zHJWu!5 zBLsPx$er;kNB&2mu*bhIQ8YUdha>#FtV+V&zZFvdTK|8$Mj#1)-}JKzaqwyPpKHeH zPL`2@nYbS$Y^u?mE?ujF5!cNrJ_N$ySC2-!F1!WvUTD-Zf<6Cw|GCoth~B z6x<|;NUgYDz}!xJR*~e9}1)QT3CO6Jj-RUCn zwMWpCNrC*fPoF~cPb6@UCYc~h5PJbcs+a5T^(4;+pS{Egh(Z_tQbPk*71k5lrs1lZ zYC*_5zW$W$>z!D=w^qaYK0N0u;|E$*@=VS0KZnZArd;#?yi@~KJvU@)vrLrIGha;E zM92@Mmw;3pUDud3L@YFC@q^_mpT(^A#CfO0gh1Ek*<3v~=K>_)pGvXXPmEydI81x9 z^DI+j;G!e()>jV8g=H(;z9u!hZ86>|=`BoEMT!bL$|($jq_#46p`ZlNL(hgmPJP=9 znX=*(9li_3%cB>j7rL*0&*h`FA{(UO{rcnbV%5UV;ym*E8z#YB`Q^@*!Js&8l_Y_x zPc#PI)_JbgeTzeJiP8?>$Z+NEh>3UY&en}0^2?+N3`8hPj$wNE!a|l^GI?5ybqGi! zt;N)R&Xf0asC-Z1z{5WBynTx?lttiJwRQEAZ0g>H?=gwa(!Q6wM7OuU>0pR zWfks4LELjrp{hE1Vr$cn)?fWjXa?ihR3ZB}Y zuK6snkdo>`#*l9XRqz1LLv!I72R$lwwAxn~dd+btv(eX;Qo>m16>D!9F7CCP zQOrjkVKxgHy4adMEe;L6afLb`=V)~IxC*S)VGw-wN)VF9WK05IwxmMR-oIa`Nf*hg z*p=)UoMCmCeUw@(KM}MwJ&8Jo?tbawTUOiu?DS)Te8t2m_5we}nJr76Os2g0iqZk= zSwcxq`B6<%ok&v5xv2IL{Ahhj1hyYZdE+{_gG4d*hTKReyE^VIfy5Snjrkos>v)oK z86BIExb$o7lTqGyc4O?z{*;ofYs0CT6-d9v)r41-+)W4HftO~VC-aCYk!@0nM)6JP z+72{Xt2=tZsUrMlSpvRMl`Au&&_e2|s(*}Yx@nT)vv#iT2m0rB@xE7h=?5~Omd*;I zEYHiaEqMXSz%@u$Fg1Jn81G5ZCx&WECc)rOIg(uSMGl%hm@!jy)OP7rtTuX41FhbvFet0`Pip2x!mg!j7 zIW%!P|Mv831Y)?@_zhz&3A50B-J@RW9qob(B!Nr_?dC{8WuG)ZOgD+_!o10A=gY6x zl+AFN*+$MXwz&-jlR%X$|DqL%B<$=?#)a6RJg4l3Uh&peGBa`X{@>PQ=U5c(LM<+h)fA;t{J;fO-~H#=JUPR-<0T#;z^!UDF%ZrTp?b%ko{%r1QBZX$qk`8 zPSkGwKMJnP*e<8s9Zh^=O@}K3+t}qD1$N_>;0Wi!)=NAM&eUFQG@nY=QIH&SH!fY!Ui_42aPF^4GT1C^J0ieW|M@)B+GM z{*!iTE%#)-RkLr*R*}s`eAb$u;#u>f{9`v=bK{oEj~~hSSY=O+eW)p^U18}LC!pah zL{FBINvw0-i;>tN$9I5oBqGmN-fF4MejEyjN8}Ft`daE(X{elZuv8t4I8+I*1jV^# z9?nb|GE@_LbkzqI>+a60R&9Kq!fl>i_so~G9(u`l&fkw8a&wR<_BCh4qEqd9j1Mf4 zfTvkI%|3rK^%JohGFG@5+^MaLKq?NnaUB|v!!F(@y(M>W2G3oi#)VkMMb{_UDOpw} z1b0UGU|(9yQ?82BZ<>})sGw-1sS)rwj7H}HTrRprXsI?sr=X#GT7|01;b7`dmGaIv?4>LV8Fl?H->eCLt)ezxWT{z|{Ted$Q~E6XCFrO{3Ssal!5+rW-x2UPmaLeyf9-PsoyO T43XjV%$jyrcs|i>=5RTT+Bm-KD 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

    |InGqbV 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

    tqX&V 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 I`h)QQ0FdD_`Tzg` diff --git a/docs/files/typescript.png b/docs/files/typescript.png deleted file mode 100644 index 8a18699f9a9bd5070c6ec0fcfa638cb02d15ba82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10784 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ȳd7Zdg7@=8Yr*JfN?*5|MAV9!(j zNArGPbL5bFVy<(w#hMKMqNv3!lnY7a59{b0dn`gIml1p?*P7FnZYr16c{-kVk}H;p zAn51f6w5k~A_S?>0E5m7+&u~KGf`NKKi7Etmxr%+x)3Gd;1mfe@$9+03J{n@j-apk>74m^-d>GsQGx5)?GQ$x!zhY7BdUoug(Vf9a~M-D1mPRRz3UO1W+ya z;e0Lky5@c8ng!StQu8W+fyfEo4OBfTyiMsSmIFdV#>6zeW=a+FWP#mLWDUF^V01m- z%!p{>RTuWU=mJUUH?-Ewt)9##g#fVz{r-jrmpwaQG|KVV4Tu6kfI(e`wElC6Z@IO* zR?ASB*Z}<8shE1%Gx+2Z0jYT*?Ni7gh~Ex95Ej-b0lBONz3&Ai=A#AJ;|=^Qo2h!S zcsWaO>Z*S1+j?~j57rD)i)TEL_ytZzkcHSWUlu|Y_g-?c)d&J$Y?do!X{@~`0#RRX ze@Yh~dOZNr4Nc3jKe`8FA6>j;52@*iZm01@q)8BfewZu5qV0TFAe0|U9=_A2>2=4- z9L)30;;~!iGrx8ymW`)KhF$p+9XKk&$9Q;V7xts|A~MwT&tk%q3?j5=0aQ>H-J>o2 z?hJK*vIrF7O&HJeJvP{szw{o@=@H*f?9tfj_?9!tCSrr(@q>Rq;G+9EIx zov)9!>i2)Ze4P-=>f{sT5WZ0Jzu3D0n#H(NS9B4sJ#>_|`T&Mput3eN`Upfr8O*o-c8-A8u73lL)d7RoK z4xHt^d2ZVe%!%q(%uw4S1QfjQ0Iv)aNLg|LJ1ym$pHylCx-25bXF}f6_h*iU*Yq2j z*AcBh5I!+TlKGop>m_~s%jnDZ+Ph2*2dLkyP^Rd1_uIEBjapu<+}v@lgOHDrle=QZcv>G?$xg+DP z>-QaD?!o|bLwY_S2Gya}lDEwz--2DnzmeMb^ZNI1w1|ubhYI#HFR7t``0&5qfuE1` z2nTjYJd5$0vby+01=pqzz&0)NwMi+CamQ;3>4jy80IxJ~L!QL{Itjiok_WCg^(@eX zV=CW&!k4V-2L6%d{NLMjYvggI9m0JdpL}5D9Hh1VN4E&cGAsruaFX;EjCvY4+t9P+ z>mu&k8f??*J1OVnTJ>|oJU4!(J~RJ*Nvt1}eRrBN%mHK$b|2+uJ~mc9w$j#Kw%`X6 z78DlZ6BOeU6gLo(kQNn@7Lno+6qFVeoVp(gjxhay2DrN0INAmL?+4`ji-2t&g4C6@ Kl*%4jzWQGXVUqj+ diff --git a/docs/files/used-by-many.png b/docs/files/used-by-many.png deleted file mode 100644 index d6896c36cff09067e0d72dbd23cd56b50b208e23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 523542 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 z�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 RK_uZ{k%AHE<=bTI3H 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żh%21z(8KT(rdvRZBRPQMIl%dZ$a73wlS@aW=3 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 oLl) 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 z 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°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 diff --git a/docs/files/why-no-transactions.jpg b/docs/files/why-no-transactions.jpg deleted file mode 100644 index 79fa72627ef5ce775bb27af46105e715456f835c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30135 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 diff --git a/docs/fonts/AtkinsonHyperlegibleMono-Italic-VariableFont_wght.ttf b/docs/fonts/AtkinsonHyperlegibleMono-Italic-VariableFont_wght.ttf deleted file mode 100644 index fa3878ac56408a60fa3728d3b9327b3080a1040d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55696 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 - - - - -Fulltext Search 👑 | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/fulltext-search.md b/docs/fulltext-search.md deleted file mode 100644 index a0898d34873..00000000000 --- a/docs/fulltext-search.md +++ /dev/null @@ -1,96 +0,0 @@ -# Fulltext Search 👑 - -> Master local fulltext search with RxDB's FlexSearch plugin. Enjoy real-time indexing, efficient queries, and offline-first support made easy. - -# Fulltext Search - -To run fulltext search queries on the local data, RxDB has a fulltext search plugin based on [flexsearch](https://github.com/nextapps-de/flexsearch) and [RxPipeline](./rx-pipeline.md). On each write to a given source [RxCollection](./rx-collection.md), an indexer is running to map the written document data into a fulltext search index. -The index can then be queried efficiently with complex fulltext search operations. - -## Benefits of using a local fulltext search - -1. Efficient Search and Indexing - -The plugin utilizes the [FlexSearch library](https://github.com/nextapps-de/flexsearch), known for its speed and memory efficiency. This ensures that search operations are performed quickly, even with large datasets. The search engine can handle multi-field queries, partial matching, and complex search operations, providing users with highly relevant results. - -2. Local Data Indexing - -With the plugin, all search operations are performed on the local data stored within the RxDB collections. This means that users can execute fulltext search queries without the need for an external server or database, which is especially beneficial for offline-first applications. The local indexing ensures that search queries are executed quickly, reducing the latency typically associated with remote database queries. Also when used in multiple browser tabs, it is ensured that through [Leader Election](./leader-election.md), only exactly one tabs is doing the work of indexing without having an overhead in the other browser tabs. - -3. Real-time Indexing - -The plugin integrates seamlessly with RxDB's reactive nature. Every time a document is written to an [RxCollection](./rx-collection.md), an indexer updates the fulltext search index in real-time. This ensures that search results are always up-to-date, reflecting the most current state of the data without requiring manual reindexing. - -4. Persistent indexing - -The fulltext search index is efficiently persisted within the [RxCollection](./rx-collection.md), ensuring that the index remains intact across app restarts. When documents are added or updated in the collection, the index is incrementally updated in real-time, meaning only the changes are processed rather than reindexing the entire dataset. This incremental approach not only optimizes performance but also ensures that subsequent app launches are quick, as there's no need to reindex all the data from scratch, making the search feature both reliable and fast from the moment the app starts. When using an [encrypted storage](./encryption.md) the index itself and incremental updates to it are stored fully encrypted and are only decrypted in-memory. - -5. Complex Query Support - -The FlexSearch-based plugin allows for [sophisticated search queries](https://github.com/nextapps-de/flexsearch?tab=readme-ov-file#index.search), including multi-term and contextual searches. Users can perform complex searches that go beyond simple keyword matching, enabling more advanced use cases like searching for documents with specific phrases, relevance-based sorting, or even phonetic matching. - -6. Offline-First Support and Privacy - -As RxDB is designed with [offline-first applications](./offline-first.md) in mind, the fulltext search plugin supports this paradigm by ensuring that all search operations can be performed offline. This is crucial for applications that need to function in environments with intermittent or no internet connectivity, offering users a consistent and reliable search experience with [zero latency](./articles/zero-latency-local-first.md). - -## Using the RxDB Fulltext Search - -The flexsearch search is a [RxDB Premium Package 👑](/premium/) which must be purchased and imported from the `rxdb-premium` npm package. - -Step 1: Add the `RxDBFlexSearchPlugin` to RxDB. - -```ts -import { RxDBFlexSearchPlugin } from 'rxdb-premium/plugins/flexsearch'; -import { addRxPlugin } from 'rxdb/plugins/core'; -addRxPlugin(RxDBFlexSearchPlugin); -``` - -Step 2: Create a `RxFulltextSearch` instance on top of a collection with the `addFulltextSearch()` function. - -```ts -import { addFulltextSearch } from 'rxdb-premium/plugins/flexsearch'; -const flexSearch = await addFulltextSearch({ - // unique identifier. Used to store metadata and continue indexing on restarts/reloads. - identifier: 'my-search', - // The source collection on whose documents the search is based on - collection: myRxCollection, - /** - * Transforms the document data to a given searchable string. - * This can be done by returning a single string property of the document - * or even by concatenating and transforming multiple fields like: - * doc => doc.firstName + ' ' + doc.lastName - */ - docToString: doc => doc.firstName, - /** - * (Optional) - * Amount of documents to index at once. - * See https://rxdb.info/rx-pipeline.html - */ - batchSize: number; - /** - * (Optional) - * lazy: Initialize the in memory fulltext index at the first search query. - * instant: Directly initialize so that the index is already there on the first query. - * Default: 'instant' - */ - initialization: 'instant', - /** - * (Optional) - * @link https://github.com/nextapps-de/flexsearch#index-options - */ - indexOptions: {}, -}); -``` - -Step 3: Run a search operation: - -```ts -// find all documents whose searchstring contains "foobar" -const foundDocuments = await flexSearch.find('foobar'); - -/** - * You can also use search options as second parameter - * @link https://github.com/nextapps-de/flexsearch#search-options - */ -const foundDocuments = await flexSearch.find('foobar', { limit: 10 }); -``` diff --git a/docs/html/dev-mode-iframe.html b/docs/html/dev-mode-iframe.html deleted file mode 100644 index 415c045b1e5..00000000000 --- a/docs/html/dev-mode-iframe.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - -

    - This is the page is shown in an iframe when the Dev Mode of the RxDB JavaScript Database is enabled. Do never enable the dev-mode in production. Do always enable it during - development. -

    - - - diff --git a/docs/img/apple-touch-icon.png b/docs/img/apple-touch-icon.png deleted file mode 100644 index c4ea6b30dac1bcd888997f765be791660b0b09e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2159 zcmcIldo+~m8t0hJAZfN+4Y|va+%ihW)cM9V#wC}DoKe_&SDF(;@=Zw7)Fi^DEp19+ zBqAEyb@*f~y4aH)--yPgNuu^AjAAyK8uql#KWFvVS!bR7uJydX^{)3_&w8HU^RC}7 zGbq4YM+>W^qN1YXLm^R>*z_gP>dKw)RDHV=R1>M*MAZ@DHn#Ghd4fVqR8i5;`x2^s z=DKJV6|}w&2?$BPIVXwvG33qWo`mvSlmXm6hEEiZahNiC+`m?xadis=cU-TIahQ}d z+=Lw;uFNZv{a}xE`*x5_qC9j^x4fjqF?d9+d1z2!&UK8Pbu8>?{abHj^zcaA>Zd*H zS%;TK8eRK;OIdYYR9JTw-goa`iQYatdy_D2t*q*+6%t5tgb6&n`B`-^8$32sc~Ril zWUe!B1Tmn52$3s-j2{E>%))m8nk*LG0{bFX5*^X!I_30aCUT(IOpX;1ajhD+Kkq0r z9e~Et_@mdq#~ROUOgxeqcL13oWy8af*PS240$HV%*5e7* zryi9A=MjYlvR-JUtWM9N+W@TJV{^R%e{>3Jt~XAtitw$jwMUSib9^K~n{|(_%HwKB zcwH&!+^gQX`p;P^Kklc2pvMN_>cbkD$%J=u6(7aPT{rXmUEBZ*FLNu;w9yBxE5<4g zmZeho|5%QZv~`bR27NgIJ6Hw;@TD|KKX@m7w>IwlIbbbHraL|uVItoKqt>A|ZxS_Y z#uHxkQsBIfZuZ8B-XK`?X}Z^|R0Dg+fn!?S9+{<)QGxT^y+Ur3M|E+OWvX2(&DgDr zYYj&c7AAkbLR&BsHqDiQBg|sz$9WeHSutpdRL6b1Vz6CMd4U_e2bEJvgy~!V4OlE( z$gI=D6>-$T%s4zyKJhQlJ2M6EwtVh#2FkyuyFUZjo)}S@Zh-}TQua$UBDjOEdz6%M z)hq(G&-WB?hw)nvU+%Ddu!lx#tT@{ieDX%S=4giL04VX4Y?a`l<%4G;AeZ9Bn9)*W zC&~x-(p1v=!PtwrR#dEs72WJKh5ejWg*Q#r!+Z<$h}0nRlgsE$k>D0G zT!J2bjvmzm#;`!DCHFVN;2;F{a03qc!7Z zCr%0D=WUVWZ2`QiLcb5suIjH}*N6(6_4BctJ0sNvdJ>9F{4EjpviS{LiEsjO+#)26 zJDDc%szU!K2WLF&t9iht)f4AzT1A1mzHxu|f`?8PzYsA94S&c(8z%7DG*0T`!j5U$ zvI`KF{eS4>zvO7jqb)D@LBsDa*}k7%xNYm2lPk9Dy8nj?5Z22)>74m>FM9IzWtOPT zwzAE{y=adB1fQ0*0W=W{k5VTG`18Mj^T<(6-twfXkB+I5wOxVI3%gU~OU(=7?9%Tv zrNSFwLaBHO12!MB6*qTym$W8S{I<4gwXMqml5ZNRKOd-7L;i~=yhZ!;hkZ3uC5eU& zsAZ&?(U52bggs@R6d4^6J0yD*yp)^xorqa|e-{)qmU3&}c(hULtyf}!lanb0uWq?I z8Tu;!qFC5GTD` z#!RC$r9!!T0iCsYCs_)&Ym=6T+(n{GRLYtOP+q+OSCm!5dzq`6A}t9!B5G#j$4!Lx z9__kZVoe`@b=N-C)4r6c>)Y?Gmd|TcoU3hL%dz{WW42{zpz|^}*c%%x3LOq1vG>RK zHYBB7OxMARe(GB(Hsg@JM3-8S1*Oz+F%kESZRogfa*!huwIT98*xB2w$l^_u^|c-4|A@1A!G}ZM zj%(V_)XnPAaNhs^mh>hp&N3{kR|F)r<^oRQr|Ve7bPRUvD8wGJd+P;_zf(G6KodG= z&fl)nH)+WIEmBxsfC!A04)_BOY6KUV@qR1UV|M4xoSHTjM{Jaj!nbe&8ujek7m@wk o@?#vry>?16+Ttt!RWbj5P3@vspr2?_!25FNvp0amBYwyE6Pf1}4*&oF diff --git a/docs/img/benefits-column-mobile.svg b/docs/img/benefits-column-mobile.svg deleted file mode 100644 index 4a04eedf2e3..00000000000 --- a/docs/img/benefits-column-mobile.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/docs/img/benefits-column.svg b/docs/img/benefits-column.svg deleted file mode 100644 index fd202775175..00000000000 --- a/docs/img/benefits-column.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/docs/img/community-links/discord-logo.svg b/docs/img/community-links/discord-logo.svg deleted file mode 100644 index 695502b38e6..00000000000 --- a/docs/img/community-links/discord-logo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/img/community-links/github-logo.svg b/docs/img/community-links/github-logo.svg deleted file mode 100644 index 7843d688e0d..00000000000 --- a/docs/img/community-links/github-logo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/img/community-links/linkedin-logo.svg b/docs/img/community-links/linkedin-logo.svg deleted file mode 100644 index 891410e1da1..00000000000 --- a/docs/img/community-links/linkedin-logo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/docs/img/community-links/stack-overflow-logo.svg b/docs/img/community-links/stack-overflow-logo.svg deleted file mode 100644 index 1f30ceb7c9b..00000000000 --- a/docs/img/community-links/stack-overflow-logo.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/img/community-links/x-logo.svg b/docs/img/community-links/x-logo.svg deleted file mode 100644 index 3b5c206593c..00000000000 --- a/docs/img/community-links/x-logo.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/img/docusaurus.png b/docs/img/docusaurus.png deleted file mode 100644 index f458149e3c8f53335f28fbc162ae67f55575c881..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5142 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 F{0H{b<4^zq diff --git a/docs/img/favicon.png b/docs/img/favicon.png deleted file mode 100644 index ff7c081d6353d66f8f6c9970cdfefa7f6b4623c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 525 zcmV+o0`mQdP){OuZ%?<$$~dcX5uvi|b<{_gkqqSE-8 z&iSg={`dR**zE5qnEvzm`n=!u*4O|-tFz<@csP$>fh~*PM(53m6u*6b-CE4L?ZHz{&WZ=__d(m_V-jK!OH##xKaO zBCG*OAiIi?24RSX*F%<*{oC^ikm0VEAJ zU>g_@60O03@e7dT-A6kOX1u_1{XGd9fWZCN7aD8u06J - - - - - - - - - diff --git a/docs/img/hero-group-mobile.svg b/docs/img/hero-group-mobile.svg deleted file mode 100644 index 57a69174d92..00000000000 --- a/docs/img/hero-group-mobile.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/docs/img/hero-group.svg b/docs/img/hero-group.svg deleted file mode 100644 index 0752ec2f8e3..00000000000 --- a/docs/img/hero-group.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/docs/img/hero.svg b/docs/img/hero.svg deleted file mode 100644 index 6a062bba745..00000000000 --- a/docs/img/hero.svg +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/img/next-column.svg b/docs/img/next-column.svg deleted file mode 100644 index 40c9426253c..00000000000 --- a/docs/img/next-column.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/docs/img/rxdb_social_card.png b/docs/img/rxdb_social_card.png deleted file mode 100644 index ab919ed1796079f225441765410fe4f78c42b7c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59084 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 diff --git a/docs/img/steps-column.svg b/docs/img/steps-column.svg deleted file mode 100644 index 26654c226b0..00000000000 --- a/docs/img/steps-column.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/docs/img/thumbs-up-white.svg b/docs/img/thumbs-up-white.svg deleted file mode 100644 index 0f70ac4329e..00000000000 --- a/docs/img/thumbs-up-white.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - diff --git a/docs/img/thumbs-up.svg b/docs/img/thumbs-up.svg deleted file mode 100644 index 67c8dc1f284..00000000000 --- a/docs/img/thumbs-up.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 783a7ab6e37..00000000000 --- a/docs/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    The easiest way to store and sync Data inside of your App

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/install.html b/docs/install.html deleted file mode 100644 index 10261194734..00000000000 --- a/docs/install.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - -Installation | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Install RxDB

    -

    npm

    -

    To install the latest release of rxdb and its dependencies and save it to your package.json, run:

    -

    npm i rxdb --save

    -

    peer-dependency

    -

    You also need to install the peer-dependency rxjs if you have not installed it before.

    -

    npm i rxjs --save

    -

    polyfills

    -

    RxDB is coded with es8 and transpiled to es5. This means you have to install polyfills to support older browsers. For example you can use the babel-polyfills with:

    -

    npm i @babel/polyfill --save

    -

    If you need polyfills, you have to import them in your code.

    -
    import '@babel/polyfill';
    -

    Polyfill the global variable

    -

    When you use RxDB with angular or other webpack based frameworks, you might get the error Uncaught ReferenceError: global is not defined. -This is because some dependencies of RxDB assume a Node.js-specific global variable that is not added to browser runtimes by some bundlers. -You have to add them by your own, like we do here.

    -
    (window as any).global = window;
    -(window as any).process = {
    -    env: { DEBUG: undefined },
    -};
    -

    Project Setup and Configuration

    -

    In the examples folder you can find CI tested projects for different frameworks and use cases, while in the /config folder base configuration files for Webpack, Rollup, Mocha, Karma, Typescript are exposed.

    -

    Consult package.json for the versions of the packages supported.

    -

    Installing the latest RxDB build

    -

    If you need the latest development state of RxDB, add it as git-dependency into your package.json.

    -
      "dependencies": {
    -      "rxdb": "git+https://git@github.com/pubkey/rxdb.git#commitHash"
    -  }
    -

    Replace commitHash with the hash of the latest build-commit.

    -

    Import

    -

    To import rxdb, add this to your JavaScript file to import the default bundle that contains the RxDB core:

    -
    import {
    -  createRxDatabase,
    -  /* ... */
    -} from 'rxdb';
    - - \ No newline at end of file diff --git a/docs/install.md b/docs/install.md deleted file mode 100644 index 113d0babc86..00000000000 --- a/docs/install.md +++ /dev/null @@ -1,71 +0,0 @@ -# Installation - -> Learn how to install RxDB via npm, configure polyfills, and fix global variable errors in Angular or Webpack for a seamless setup. - -# Install RxDB - -## npm - -To install the latest release of `rxdb` and its dependencies and save it to your `package.json`, run: - -`npm i rxdb --save` - -## peer-dependency - -You also need to install the peer-dependency `rxjs` if you have not installed it before. - -`npm i rxjs --save` - -## polyfills - -RxDB is coded with es8 and transpiled to es5\. This means you have to install [polyfills](https://developer.mozilla.org/en-US/docs/Glossary/Polyfill) to support older browsers. For example you can use the babel-polyfills with: - -`npm i @babel/polyfill --save` - -If you need polyfills, you have to import them in your code. - -```typescript -import '@babel/polyfill'; -``` - -## Polyfill the `global` variable - -When you use RxDB with **angular** or other **webpack** based frameworks, you might get the error `Uncaught ReferenceError: global is not defined`. -This is because some dependencies of RxDB assume a Node.js-specific `global` variable that is not added to browser runtimes by some bundlers. -You have to add them by your own, like we do [here](https://github.com/pubkey/rxdb/blob/master/examples/angular/src/polyfills.ts). - -```ts -(window as any).global = window; -(window as any).process = { - env: { DEBUG: undefined }, -}; -``` - -## Project Setup and Configuration - -In the [examples](https://github.com/pubkey/rxdb/tree/master/examples) folder you can find CI tested projects for different frameworks and use cases, while in the [/config](https://github.com/pubkey/rxdb/tree/master/config) folder base configuration files for Webpack, Rollup, Mocha, Karma, Typescript are exposed. - -Consult [package.json](https://github.com/pubkey/rxdb/blob/master/package.json) for the versions of the packages supported. - -## Installing the latest RxDB build - -If you need the latest development state of RxDB, add it as git-dependency into your `package.json`. - -```json - "dependencies": { - "rxdb": "git+https://git@github.com/pubkey/rxdb.git#commitHash" - } -``` - -Replace `commitHash` with the hash of the latest [build-commit](https://github.com/pubkey/rxdb/search?q=build&type=Commits). - -## Import - -To import `rxdb`, add this to your JavaScript file to import the default bundle that contains the RxDB core: - -```typescript -import { - createRxDatabase, - /* ... */ -} from 'rxdb'; -``` diff --git a/docs/key-compression.html b/docs/key-compression.html deleted file mode 100644 index 312b570bbb7..00000000000 --- a/docs/key-compression.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - -Key Compression | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Key Compression

    -

    With the key compression plugin, documents will be stored in a compressed format which saves up to 40% disc space. -For compression the npm module jsonschema-key-compression is used. -It compresses json-data based on its json-schema while still having valid json. It works by compressing long attribute-names into smaller ones and backwards.

    -

    The compression and decompression happens internally, so when you work with a RxDocument, you can access any property like normal.

    -

    Enable key compression

    -

    The key compression plugin is a wrapper around any other RxStorage.

    -
    1

    Wrap your RxStorage with the key compression plugin

    import { wrappedKeyCompressionStorage } from 'rxdb/plugins/key-compression';
    -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
    - 
    -const storageWithKeyCompression = wrappedKeyCompressionStorage({
    -    storage: getRxStorageLocalstorage()
    -});
    2

    Create an RxDatabase

    import { createRxDatabase } from 'rxdb/plugins/core';
    -const db = await createRxDatabase({
    -    name: 'mydatabase',
    -    storage: storageWithKeyCompression
    -});
    3

    Create a compressed RxCollection

     
    -const mySchema = {
    -  keyCompression: true, // set this to true, to enable the keyCompression
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -      id: {
    -          type: 'string',
    -          maxLength: 100 // <- the primary key must have set maxLength
    -      }
    -      /* ... */
    -  }
    -};
    -await db.addCollections({
    -    docs: {
    -        schema: mySchema
    -    }
    -});
    - - \ No newline at end of file diff --git a/docs/key-compression.md b/docs/key-compression.md deleted file mode 100644 index 10da91f27db..00000000000 --- a/docs/key-compression.md +++ /dev/null @@ -1,66 +0,0 @@ -# Key Compression - -> import {Steps} from '@site/src/components/steps'; - -import {Steps} from '@site/src/components/steps'; - -# Key Compression - -With the key compression plugin, documents will be stored in a compressed format which saves up to 40% disc space. -For compression the npm module [jsonschema-key-compression](https://github.com/pubkey/jsonschema-key-compression) is used. -It compresses json-data based on its json-schema while still having valid json. It works by compressing long attribute-names into smaller ones and backwards. - -The compression and decompression happens internally, so when you work with a `RxDocument`, you can access any property like normal. - -## Enable key compression - -The key compression plugin is a wrapper around any other [RxStorage](./rx-storage.md). - - - -### Wrap your RxStorage with the key compression plugin - -```ts -import { wrappedKeyCompressionStorage } from 'rxdb/plugins/key-compression'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -const storageWithKeyCompression = wrappedKeyCompressionStorage({ - storage: getRxStorageLocalstorage() -}); -``` - -### Create an RxDatabase - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -const db = await createRxDatabase({ - name: 'mydatabase', - storage: storageWithKeyCompression -}); -``` - -### Create a compressed RxCollection - -```ts - -const mySchema = { - keyCompression: true, // set this to true, to enable the keyCompression - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 // <- the primary key must have set maxLength - } - /* ... */ - } -}; -await db.addCollections({ - docs: { - schema: mySchema - } -}); -``` - - diff --git a/docs/leader-election.html b/docs/leader-election.html deleted file mode 100644 index 1bd34b85aef..00000000000 --- a/docs/leader-election.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - -Leader Election | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Leader-Election

    -

    RxDB comes with a leader-election which elects a leading instance between different instances in the same javascript runtime. -Before you read this, please check out on how many of your open browser-tabs you have opened the same website more than once. Count them, I will wait..

    -

    So if you would now inspect the traffic that these open tabs produce, you can see that many of them send exact the same data over wire for every tab. No matter if the data is sent with an open websocket or by polling.

    -

    Use-case-example

    -

    Imagine we have a website which displays the current temperature of the visitors location in various charts, numbers or heatmaps. To always display the live-data, the website opens a websocket to our API-Server which sends the current temperature every 10 seconds. Using the way most sites are currently build, we can now open it in 5 browser-tabs and it will open 5 websockets which send data 6*5=30 times per minute. This will not only waste the power of your clients device, but also wastes your api-servers resources by opening redundant connections.

    -

    Solution

    -

    The solution to this redundancy is the usage of a leader-election-algorithm which makes sure that always exactly one tab is managing the remote-data-access. The managing tab is the elected leader and stays leader until it is closed. No matter how many tabs are opened or closed, there must be always exactly one leader. -You could now start implementing a messaging-system between your browser-tabs, hand out which one is leader, solve conflicts and reassign a new leader when the old one 'dies'. -Or just use RxDB which does all these things for you.

    -

    Add the leader election plugin

    -

    To enable the leader election, you have to add the leader-election plugin.

    -
    import { addRxPlugin } from 'rxdb';
    -import { RxDBLeaderElectionPlugin } from 'rxdb/plugins/leader-election';
    -addRxPlugin(RxDBLeaderElectionPlugin);
    -

    Code-example

    -

    To make it easy, here is an example where the temperature is pulled every ten seconds and saved to a collection. The pulling starts at the moment where the opened tab becomes the leader.

    -
    import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
    - 
    -const db = await createRxDatabase({
    -  name: 'weatherDB',
    -  storage: getRxStorageLocalstorage(),
    -  password: 'myPassword',
    -  multiInstance: true
    -});
    - 
    -await db.addCollections({
    -  temperature: {
    -    schema: mySchema
    -  }
    -});
    - 
    -db.waitForLeadership()
    -  .then(() => {
    -    console.log('Long lives the king!'); // <- runs when db becomes leader
    -    setInterval(async () => {
    -      const temp = await fetch('https://example.com/api/temp/');
    -      db.temperature.insert({
    -          degrees: temp,
    -          time: new Date().getTime()
    -      });
    -    }, 1000 * 10);
    -  });
    -

    Handle Duplicate Leaders

    -

    On rare occasions, it can happen that more than one leader is elected. This can happen when the CPU is on 100% or for any other reason the JavaScript process is fully blocked for a long time. -For most cases this is not really problem because on duplicate leaders, both browser tabs replicate with the same backend anyways. -To handle the duplicate leader event, you can access the leader elector and set a handler:

    -
    import {
    -    getLeaderElectorByBroadcastChannel
    -} from 'rxdb/plugins/leader-election';
    - 
    -const leaderElector = getLeaderElectorByBroadcastChannel(broadcastChannel);
    -leaderElector.onduplicate = async () => {
    -    // Duplicate leader detected -> reload the page.
    -    location.reload();
    -}
    -

    Live-Example

    -

    In this example the leader is marked with the crown ♛

    -

    Leader Election

    -

    Try it out

    -

    Run the angular-example where the leading tab is marked with a crown on the top-right-corner.

    -

    Notice

    -

    The leader election is implemented via the broadcast-channel module. -The leader is elected between different processes on the same javascript-runtime. Like multiple tabs in the same browser or multiple NodeJs-processes on the same machine. It will not run between different replicated instances.

    - - \ No newline at end of file diff --git a/docs/leader-election.md b/docs/leader-election.md deleted file mode 100644 index deea8272839..00000000000 --- a/docs/leader-election.md +++ /dev/null @@ -1,96 +0,0 @@ -# Leader Election - -> RxDB comes with a leader-election which elects a leading instance between different instances in the same javascript runtime. -Before you read this, please check out on how many of your open browser-tabs you have opened the same website more than once. Count them, I will wait.. - -# Leader-Election - -RxDB comes with a leader-election which elects a leading instance between different instances in the same javascript runtime. -Before you read this, please check out on how many of your open browser-tabs you have opened the same website more than once. Count them, I will wait.. - -So if you would now inspect the traffic that these open tabs produce, you can see that many of them send exact the same data over wire for every tab. No matter if the data is sent with an open websocket or by polling. - -## Use-case-example - -Imagine we have a website which displays the current temperature of the visitors location in various charts, numbers or heatmaps. To always display the live-data, the website opens a websocket to our API-Server which sends the current temperature every 10 seconds. Using the way most sites are currently build, we can now open it in 5 browser-tabs and it will open 5 websockets which send data 6*5=30 times per minute. This will not only waste the power of your clients device, but also wastes your api-servers resources by opening redundant connections. - -## Solution - -The solution to this redundancy is the usage of a [leader-election](https://en.wikipedia.org/wiki/Leader_election)-algorithm which makes sure that always exactly one tab is managing the remote-data-access. The managing tab is the elected leader and stays leader until it is closed. No matter how many tabs are opened or closed, there must be always exactly **one** leader. -You could now start implementing a messaging-system between your browser-tabs, hand out which one is leader, solve conflicts and reassign a new leader when the old one 'dies'. -Or just use RxDB which does all these things for you. - -## Add the leader election plugin - -To enable the leader election, you have to add the `leader-election` plugin. - -```javascript -import { addRxPlugin } from 'rxdb'; -import { RxDBLeaderElectionPlugin } from 'rxdb/plugins/leader-election'; -addRxPlugin(RxDBLeaderElectionPlugin); -``` -## Code-example - -To make it easy, here is an example where the temperature is pulled every ten seconds and saved to a collection. The pulling starts at the moment where the opened tab becomes the leader. - -```javascript -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -const db = await createRxDatabase({ - name: 'weatherDB', - storage: getRxStorageLocalstorage(), - password: 'myPassword', - multiInstance: true -}); - -await db.addCollections({ - temperature: { - schema: mySchema - } -}); - -db.waitForLeadership() - .then(() => { - console.log('Long lives the king!'); // <- runs when db becomes leader - setInterval(async () => { - const temp = await fetch('https://example.com/api/temp/'); - db.temperature.insert({ - degrees: temp, - time: new Date().getTime() - }); - }, 1000 * 10); - }); -``` - -## Handle Duplicate Leaders - -On rare occasions, it can happen that [more than one leader](https://github.com/pubkey/broadcast-channel/blob/master/.github/README.md#handle-duplicate-leaders) is elected. This can happen when the CPU is on 100% or for any other reason the JavaScript process is fully blocked for a long time. -For most cases this is not really problem because on duplicate leaders, both browser tabs replicate with the same backend anyways. -To handle the duplicate leader event, you can access the leader elector and set a handler: - -```ts -import { - getLeaderElectorByBroadcastChannel -} from 'rxdb/plugins/leader-election'; - -const leaderElector = getLeaderElectorByBroadcastChannel(broadcastChannel); -leaderElector.onduplicate = async () => { - // Duplicate leader detected -> reload the page. - location.reload(); -} -``` - -## Live-Example - -In this example the leader is marked with the crown ♛ - - - -## Try it out - -Run the [angular-example](https://github.com/pubkey/rxdb/tree/master/examples/angular) where the leading tab is marked with a crown on the top-right-corner. - -## Notice - -The leader election is implemented via the [broadcast-channel module](https://github.com/pubkey/broadcast-channel#using-the-leaderelection). -The leader is elected between different processes on the same javascript-runtime. Like multiple tabs in the same browser or multiple NodeJs-processes on the same machine. It will not run between different replicated instances. diff --git a/docs/legal-notice/index.html b/docs/legal-notice/index.html deleted file mode 100644 index 94f30c7a035..00000000000 --- a/docs/legal-notice/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -Legal Notice - RxDB - JavaScript Database | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxDB Legal Notice

    Daniel Meyer - RxDB
    Friedrichstraße 13
    70174 Stuttgart
    Email:
    RxDB Email

    German Legal Notice

    Umsatzsteuer-ID nach §27a Umsatzsteuergesetz
    DE357840955
    Verantwortlich für den Inhalt (gem. § 55 Abs. 2 RStV)
    Der oben genannte Eigentümer.
    Hinweis gemäß Online-Streitbeilegungs-Verordnung

    Nach geltendem Recht sind wir verpflichtet, Verbraucher auf die Existenz der Europäischen Online-Streitbeilegungs-Plattform hinzuweisen, welche für die Beilegung von Streitigkeiten genutzt werden kann, ohne dass ein Gericht eingeschaltet werden muss. Für die Einrichtung der Plattform ist die Europäische Kommission zuständig. Die Europäische Online-Streitbeilegungs-Plattform ist hier zu finden: http://ec.europa.eu/odr. Wir weisen ausdrücklich darauf hin, dass wir nicht bereit sind, uns am Streitbeilegungsverfahren im Rahmen der Europäischen Online-Streitbeilegungs-Plattform zu beteiligen.

    § 1 Warnhinweis zu Inhalten

    Alle Inhalte dieser Webseite wurden nach Treu und Glauben mit größtmöglicher Sorgfalt erstellt. Wir übernehmen keine Gewähr für die Richtigkeit und Aktualität der bereitgestellten Inhalte und garantieren nicht, dass diese Daten jederzeit auf dem aktuellen Stand sind. Diese Webseite kann technische Ungenauigkeiten oder typographische Fehler enthalten. Wir behalten uns vor, die Informationen dieser Webseite jederzeit und ohne vorherige Ankündigung zu ändern, zu aktualisieren oder zu löschen. In keinem Fall haften wir Ihnen oder Dritten gegenüber für irgendwelche direkten, indirekten, speziellen oder sonstigen Schäden jeglicher Art.

    § 2 Externe Links / Externe Verknüpfungen

    Diese Webseite enthält Verknüpfungen zu Webseiten Dritter, zum Beispiel eingebunden durch Links oder Buttons. Diese Webseiten unterliegen der Haftung der jeweiligen Betreiber. Bei der erstmaligen Verknüpfung jeglicher Webseiten Dritter haben wir die fremden Inhalte auf das Bestehen etwaiger Rechtsverstöße überprüft. Zum Zeitpunkt der Überprüfung waren keine Rechtsverstöße ersichtlich. Wir haben keinerlei Einfluss auf die aktuelle und zukünftige Gestaltung und auf die Inhalte der verknüpften Seiten. Das Setzen von externen Verknüpfungen bedeutet nicht, dass wir uns die hinter der Verknüpfung liegenden Inhalte zu eigen machen. Eine ständige Kontrolle der Inhalte sämtlicher externen Verknüpfungen ist ohne konkrete Hinweise auf Rechtsverstöße nicht zumutbar. Bei Kenntnisnahme von Rechtsverstößen werden betroffene Inhalte oder Verknüpfungen unverzüglich gelöscht.

    § 3 Urheber- und Leistungsschutzrechte

    Die auf dieser Webseite veröffentlichten Inhalte unterliegen dem deutschen Urheber- und Leistungsschutzrecht. Jede vom deutschen Urheber- und Leistungsschutzrecht nicht zugelassene Verwertung bedarf der vorherigen schriftlichen Zustimmung unsererseits oder des jeweiligen Rechteinhabers. Dies gilt insbesondere für jede Art oder Abwandlung der Vervielfältigung, Bearbeitung, Verarbeitung, Übersetzung, Einspeicherung und Wiedergabe von Inhalten in jeglicher Form. Die unerlaubte Vervielfältigung oder Weitergabe einzelner Inhalte oder kompletter Seiten ist nicht gestattet und strafbar. Die Darstellung dieser Webseite in fremden Frames ist nur mit schriftlicher Erlaubnis unsererseits zulässig.

    § 4 Besondere Nutzungsbedingungen

    Soweit besondere Bedingungen für einzelne Nutzungen dieser Webseite von den vorgenannten Paragraphen abweichen, wird an entsprechender Stelle ausdrücklich darauf hingewiesen. In diesem Falle gelten im jeweiligen Einzelfall die besonderen Nutzungsbedingungen.

    § 5 Rechtswirksamkeit dieses Haftungsausschlusses

    Dieser Haftungsausschluss ist als Teil des Internetangebotes zu betrachten, von welchem aus auf diese Seite verwiesen wurde. Sofern Teile oder einzelne Formulierungen dieses Textes der geltenden Rechtslage nicht, nicht mehr oder nicht vollständig entsprechen sollten, bleiben die übrigen Teile des Dokumentes in ihrem Inhalt und ihrer Gültigkeit davon unberührt.

    - - \ No newline at end of file diff --git a/docs/license/index.html b/docs/license/index.html deleted file mode 100644 index 445a38b7fd1..00000000000 --- a/docs/license/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -License Preview - RxDB - JavaScript Database | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/llms-full.txt b/docs/llms-full.txt deleted file mode 100644 index d84285d8ff6..00000000000 --- a/docs/llms-full.txt +++ /dev/null @@ -1,22772 +0,0 @@ -# RxDB Documentation - -> Authoritative reference documentation for RxDB, a reactive, local-first NoSQL database for JavaScript with offline support and explicit replication. - -This file contains all documentation content in a single document following the llmstxt.org standard. - -## Alternatives for realtime local-first JavaScript applications and local databases - -# Alternatives for realtime offline-first JavaScript applications - -To give you an augmented view over the topic of client side JavaScript databases, this page contains all known alternatives to **RxDB**. Remember that you are reading this inside of the RxDB documentation, so everything is **opinionated**. -If you disagree with anything or think that something is missing, make a pull request to this file on the RxDB github repository. - -:::note -RxDB has these main benefits: - -- RxDB is a battle proven tool [widely used](/#reviews) by companies in real projects in production. -- RxDB is not VC funded and therefore does not require you to use a specific cloud service to rip you off. RxDB can be used with your [own backend](./replication-http.md) or no backend at all. -- RxDB has a working business model of selling [premium plugins](/premium/) which ensures that RxDB will be maintained and improved continuously while many alternatives are dead already or seem to die soon. -- RxDB has years (since 2016) of performance optimization, bug fixing and feature adding. It is just working as is and there are close to zero [open issues](https://github.com/pubkey/rxdb/issues). - -
    - - - -
    - -::: - --------------------------------------------------------------------------------- - - - -## Alternatives to RxDB - -[RxDB](https://rxdb.info) is an **observable**, **replicating**, **[local first](./offline-first.md)**, **JavaScript** database. So it makes only sense to list similar projects as alternatives, not just any database or JavaScript store library. However, I will list up some projects that RxDB is often compared with, even if it only makes sense for some use cases. -Here are the alternatives to RxDB: - -### Firebase - - - -Firebase is a **platform** developed by Google for creating mobile and web applications. Firebase has many features and products, two of which are client side databases. The [Realtime Database](./articles/firebase-realtime-database-alternative.md) and the [Cloud Firestore](./articles/firestore-alternative.md). - -#### Firebase - Realtime Database - -The firebase realtime database was the first database in firestore. It has to be mentioned that in this context, "realtime" means **"realtime replication"**, not "realtime computing". The firebase realtime database stores data as a big unstructured JSON tree that is replicated between clients and the backend. - -#### Firebase - Cloud Firestore - -The firestore is the successor to the realtime database. The big difference is that it behaves more like a 'normal' database that stores data as documents inside of collections. The conflict resolution strategy of firestore is always *last-write-wins* which might or might not be suitable for your use case. - -The biggest difference to RxDB is that firebase products are only able to be used on top of the Firebase cloud hosted backend, which creates a vendor lock-in. RxDB can replicate with any self hosted CouchDB server or custom GraphQL endpoints. You can even replicate Firestore to RxDB with the [Firestore Replication Plugin](./replication-firestore.md). - -### Meteor - - - -Meteor (since 2012) is one of the oldest technologies for JavaScript realtime applications. Meteor is not a library but a whole framework with its own package manager, database management and replication. -Because of how it works, it has proven to be hard to integrate it with other modern JavaScript frameworks like [angular](https://github.com/urigo/angular-meteor), [vue.js](./articles//vue-database.md) or svelte. - -Meteor uses MongoDB in the backend and can replicate with a Minimongo database in the frontend. -While testing, it has proven to be impossible to make a meteor app **offline first** capable. There are [some projects](https://github.com/frozeman/meteor-persistent-minimongo2) that might do this, but all are unmaintained. - -### Minimongo - -Forked in Jan 2014 from meteorJSs' minimongo package, Minimongo is a client-side, in-memory, JavaScript version of MongoDB with backend replication over HTTP. Similar to MongoDB, it stores data in documents inside of collections and also has the same query syntax. Minimongo has different storage adapters for IndexedDB, WebSQL, [LocalStorage](./articles/localstorage.md) and SQLite. -Compared to RxDB, Minimongo has no concept of revisions or conflict handling, which might lead to undefined behavior when used with replication or in multiple browser tabs. Minimongo has no observable queries or changestream. - -### WatermelonDB - - - -WatermelonDB is a reactive & asynchronous JavaScript database. While originally made for [React](./articles/react-database.md) and [React Native](./react-native-database.md), it can also be used with other JavaScript frameworks. The main goal of WatermelonDB is **performance** within an application with lots of data. -In React Native, WatermelonDB uses the provided SQLite database. Also there is an Expo plugin for WatermelonDB. In a browser, WatermelonDB uses the LokiJS in-memory database to store and query data. WatermelonDB is one of the rare projects that support both Flow and Typescript at the same time. - -### AWS Amplify - - - -AWS Amplify is a collection of tools and libraries to develop web- and mobile frontend applications. Similar to firebase, it provides everything needed like authentication, analytics, a REST API, storage and so on. Everything hosted in the AWS Cloud, even when they state that *"AWS Amplify is designed to be open and pluggable for any custom backend or service"*. For realtime replication, AWS Amplify can connect to an AWS App-Sync GraphQL endpoint. - -### AWS Datastore - -Since December 2019 the Amplify library includes the AWS Datastore which is a document-based, client side database that is able to replicate data via AWS AppSync in the background. -The main difference to other projects is the complex project configuration via the amplify cli and the bit confusing query syntax that works over functions. Complex Queries with multiple `OR/AND` statements are not possible which might change in the future. -Local development is hard because the AWS AppSync mock does not support realtime replication. It also is not really offline-first because a user login is always required. - -```ts -// An AWS datastore OR query -const posts = await DataStore.query(Post, c => c.or( - c => c.rating("gt", 4).status("eq", PostStatus.PUBLISHED) -)); - -// An AWS datastore SORT query -const posts = await DataStore.query(Post, Predicates.ALL, { - sort: s => s.rating(SortDirection.ASCENDING).title(SortDirection.DESCENDING) -}); -``` - -The biggest difference to RxDB is that you have to use the AWS cloud backends. This might not be a problem if your data is at AWS anyway. - -### RethinkDB - - - -RethinkDB is a backend database that pushed dynamic JSON data to the client in realtime. It was founded in 2009 and the company shut down in 2016. -Rethink db is not a client side database, it streams data from the backend to the client which of course does not work while offline. - -### Horizon - -Horizon is the client side library for RethinkDB which provides useful functions like authentication, permission management and subscription to a RethinkDB backend. Offline support [never made](https://github.com/rethinkdb/horizon/issues/58) it to horizon. - -### Supabase - - - -Supabase labels itself as "*an open source Firebase alternative*". It is a collection of open source tools that together mimic many Firebase features, most of them by providing a wrapper around a PostgreSQL database. While it has realtime queries that run over the wire, like with RethinkDB, Supabase has no client-side storage or replication feature and therefore is not offline first. - -### CouchDB - - - -Apache CouchDB is a server-side, document-oriented database that is mostly known for its multi-master replication feature. Instead of having a master-slave replication, with CouchDB you can run replication in any constellation without having a master server as bottleneck where the server even can go off- and online at any time. This comes with the drawback of having a slow replication with much network overhead. -CouchDB has a changestream and a query syntax similar to MongoDB. - -### PouchDB - - - -PouchDB is a JavaScript database that is compatible with most of the CouchDB API. It has an adapter system that allows you to switch out the underlying storage layer. There are many adapters like for [IndexedDB](./rx-storage-indexeddb.md), [SQLite](./rx-storage-sqlite.md), the Filesystem and so on. The main benefit is to be able to replicate data with any CouchDB compatible endpoint. -Because of the CouchDB compatibility, PouchDB has to do a lot of overhead in handling the revision tree of document, which is why it can show bad performance for bigger datasets. -RxDB was originally build around PouchDB until the storage layer was abstracted out in version [10.0.0](./releases/10.0.0.md) so it now allows to use different `RxStorage` implementations. PouchDB has some performance issues because of how it has to store the document revision tree to stay compatible with the CouchDB API. - -### Couchbase - -Couchbase (originally known as Membase) is another NoSQL document database made for realtime applications. -It uses the N1QL query language which is more SQL like compared to other NoSQL query languages. In theory you can achieve replication of a Couchbase with a PouchDB database, but this has shown to be not [that easy](https://github.com/pouchdb/pouchdb/issues/7793#issuecomment-501624297). - -### Cloudant - -Cloudant is a cloud-based service that is based on [CouchDB](./replication-couchdb.md) and has mostly the same features. -It was originally designed for cloud computing where data can automatically be distributed between servers. But it can also be used to replicate with frontend PouchDB instances to create scalable web applications. -It was bought by IBM in 2014 and since 2018 the Cloudant Shared Plan is retired and migrated to IBM Cloud. - -### Hoodie - -Hoodie is a backend solution that enables offline-first JavaScript frontend development without having to write backend code. Its main goal is to abstract away configuration into simple calls to the Hoodie API. -It uses CouchDB in the backend and PouchDB in the frontend to enable offline-first capabilities. -The last commit for hoodie was one year ago and the website (hood.ie) is offline which indicates it is not an active project anymore. - -### LokiJS - -LokiJS is a JavaScript embeddable, in-memory database. And because everything is handled in-memory, LokiJS has awesome performance when mutating or querying data. You can still persist to a permanent storage (IndexedDB, Filesystem etc.) with one of the provided storage adapters. The persistence happens after a timeout is reached after a write, or before the JavaScript process exits. This also means you could loose data when the JavaScript process exits ungracefully like when the power of the device is shut down or the browser crashes. -While the project is not that active anymore, it is more *finished* than *unmaintained*. - -In the past, RxDB supported using [LokiJS as RxStorage](./rx-storage-lokijs.md) but because the LokiJS is not maintained anymore and had too many issues, this storage option was removed in RxDB version 16. - -### Gundb - -GUN is a JavaScript graph database. While having many features, the **decentralized** replication is the main unique selling point. You can replicate data Peer-to-Peer without any centralized backend server. GUN has several other features that are useful on top of that, like encryption and authentication. - -While testing it was really hard to get basic things running. GUN is open source, but because of how the source code [is written](https://github.com/amark/gun/blob/master/src/put.js), it is very difficult to understand what is going wrong. - -### sql.js - -sql.js is a javascript library to run SQLite on the web. It uses a virtual database file stored in memory and does not have any persistence. All data is lost once the JavaScript process exits. sql.js is created by compiling SQLite to WebAssembly so it has about the same features as SQLite. For older browsers there is a JavaScript fallback. - -### absurd-sQL - -Absurd-sql is a project that implements an IndexedDB-based persistence for sql.js. Instead of directly writing data into the IndexedDB, it treats IndexedDB like a disk and stores data in blocks there which shows to have a much better performance, mostly because of how [performance expensive](./slow-indexeddb.md) IndexedDB transactions are. - -### NeDB - -NeDB was a embedded persistent or in-memory database for Node.js, nw.js, [Electron](./electron-database.md) and browsers. -It is document-oriented and had the same query syntax as MongoDB. -Like LokiJS it has persistence adapters for IndexedDB etc. to persist the database state on the disc. -The last commit to NeDB was in **2016**. - -### Dexie.js - -Dexie.js is a minimalistic wrapper for IndexedDB. While providing a better API than plain IndexedDB, Dexie also improves performance by batching transactions and other optimizations. It also adds additional non-IndexedDB features like observable queries or multi tab support or react hooks. -Compared to RxDB, Dexie.js does not support complex (MongoDB-like) queries and requires a lot of fiddling when a document range of a specific index must be fetched. -Dexie.js is used by Whatsapp Web, Microsoft To Do and Github Desktop. - -RxDB supports using [Dexie.js as Database storage](./rx-storage-dexie.md) which enhances IndexedDB via dexie with RxDB features like MongoDB-like queries etc. - -### LowDB - -LowDB is a small, local JSON database powered by the Lodash library. It is designed to be simple, easy to use, and straightforward. LowDB allows you to perform native JavaScript queries and persist data in a flat JSON file. Written in TypeScript, it's particularly well-suited for small projects, prototyping, or when you need a lightweight, file-based database. - -As an alternative to LowDB, [RxDB](./) offers real-time reactivity, allowing developers to subscribe to database changes, a feature not natively available in LowDB. Additionally, RxDB provides robust [query capabilities](./rx-query.md), including the ability to subscribe to query results for automatic UI updates. These features make RxDB a strong alternative to LowDB for more complex and dynamic applications. - -### localForage -localForage is a popular JavaScript library for offline storage that provides a simple, promise-based API. It abstracts over different storage mechanisms such as [IndexedDB](./rx-storage-indexeddb.md), WebSQL, or [localStorage](./articles/localstorage.md), making it easier to write code once and have it work seamlessly across various browsers. While localForage is great for storing data locally in a key-value manner, it doesn't provide the real-time reactive queries, [conflict handling](./transactions-conflicts-revisions.md), or revision-based replication that RxDB does. This makes localForage a useful choice for straightforward caching or persistent storage needs, but not ideal for advanced offline-first scenarios requiring multi-user collaboration or complex querying. - -### MongoDB Realm - -Originally Realm was a mobile database for Android and iOS. Later they added support for other languages and runtimes, also for JavaScript. -It was meant as replacement for SQLite but is more like an object store than a full SQL database. -In 2019 MongoDB bought Realm and changed the projects focus. -Now Realm is made for replication with the MongoDB Realm Sync based on the MongoDB Atlas Cloud platform. This tight coupling to the MongoDB cloud service is a big downside for most use cases. - -### Apollo - -The Apollo GraphQL platform is made to transfer data between a server to UI applications over GraphQL endpoints. It contains several tools like GraphQL clients in different languages or libraries to create GraphQL endpoints. - -While it is has different caching features for offline usage, compared to RxDB it is not fully offline first because caching alone does not mean your application is fully usable when the user is offline. - -### Replicache - -Replicache is a client-side sync framework for building realtime, collaborative, [local-first](./articles/local-first-future.md) web apps. It claims to work with most backend stacks. In contrast to other local first tools, replicache does not work like a local database. Instead it runs on so called `mutators` that unify behavior on the client and server side. So instead of implementing and calling REST routes on both sides of your stack, you will implement mutators that define a specific delta behavior based on the input data. To observe data in replicache, there are `subscriptions` that notify your frontend application about changes to the state. -Replicache can be used in most frontend technologies like browsers, React/Remix, NextJS/Vercel and React Native. While Replicache can be installed and used from npm, the Replicache source code is not open source and the Replicache github repo does not allow you to inspect or debug it. Still you can use replicache for in non-commercial projects, or for companies with < $200k revenue (ARR) and < $500k in funding. (2024: Replicache will be free and Rocicorp are working on a new Zerosync product to succeed Replicache and Reflect.) - -### InstantDB - -InstantDB is designed for real-time data synchronization with built-in offline support, allowing changes to be queued locally and [synced](./replication.md) when the user reconnects. While it offers seamless [optimistic updates](./articles/optimistic-ui.md) and rollback capabilities, its offline-first design is not as mature or comprehensive as RxDB's - the [offline data](./articles//offline-database.md) is more of a cache, not a full-database sync. The query language used is Datalog, and the backend sync service is written in Clojure. InstantDB is focused more on simplicity and real-time collaboration, with fewer customization options for storage or conflict resolution compared to RxDB, which supports various storage adapters and advanced conflict handling via CRDTs. - -### Yjs - -Yjs is a [CRDT-based](./crdt.md) (Conflict-free Replicated Data Type) library focused on enabling real-time collaboration - particularly for text editing, although it can handle other data types as well. While it provides powerful conflict resolution and peer-to-peer synchronization out of the box, Yjs itself is not a full-fledged database. Instead, you typically combine Yjs with other storage or networking layers to achieve a [local-first architecture](./offline-first.md). This flexibility allows for sophisticated [real-time](./articles/realtime-database.md) features, but also means you must handle indexing, queries, and persistence on your own if you need them. Compared to RxDB, Yjs does not offer built-in replication adapters or a query system, so developers who require a more complete solution for conflict resolution, data persistence, and offline-first capabilities may find RxDB more convenient. - -### ElectricSQL - -2024: ElectricSQL is being rewritten in a new Electric-Next branch, which focuses on partial syncing of ("shapes", which makes is basically a NoSQL like document database) of data from a remote Postgres DB to a local clients written in TypeScript/JS or Elixir. The write path is not yet implemented, neither is client-side reactivity. The ElectricSQL backend is written in Elixir. - -### SignalDB - -SignalDB provides a reactive, in-memory local-lirst JavaScript database with real-time sync, bit it doesn't offer the same level of multi-client replication or flexibility with storage backends that RxDB provides, and through a RxDB persistence adapters you can actually use SignalDB for the front-end reactivity while relying on RxDB for backend sync and persistence. - -### PowerSync - -PowerSync is a "framework" for implementing local-first solutions. It centralizes business logic and conflict resolution on a central, authoritative server (PostgreSQL or MongoDB), vs RxDB that also supports custom backends. Both RxDB and PowerSync can be used with a variety of storage backends, but PowerSync uses SQLite as the front-end database which has shown to be slow because the WASM-SQLite abstraction increases read and write latency. In terms of client SDKs, PowerSync offers Flutter, Kotlin, and Swift in addition to JS/TypeScript. PowerSync offers man client technologies, PowerSync is under a license that restricts commercial use that competes with PowerSync and the JourneyApps Platform. - -# Read further - -- [Offline First Database Comparison](https://github.com/pubkey/client-side-databases) - ---- - -## RxDB as a Database in an Angular Application - -import {VideoBox} from '@site/src/components/video-box'; - -# RxDB as a Database in an Angular Application - -In modern web development, Angular has emerged as a popular framework for building robust and scalable applications. As Angular applications often require persistent [storage](./browser-storage.md) and efficient data handling, choosing the right database solution is crucial. One such solution is [RxDB](https://rxdb.info/), a reactive JavaScript database for the browser, node.js, and [mobile devices](./mobile-database.md). In this article, we will explore the integration of RxDB into an Angular application and examine its various features and techniques. - -
    - - - -
    - -## Angular Web Applications -Angular is a powerful JavaScript framework developed and maintained by Google. It enables developers to build single-page applications (SPAs) with a modular and component-based approach. Angular provides a comprehensive set of tools and features for creating dynamic and responsive web applications. - -## Importance of Databases in Angular Applications -Databases play a vital role in Angular applications by providing a structured and efficient way to store, retrieve, and manage data. Whether it's handling user authentication, caching data, or persisting application state, a robust database solution is essential for ensuring optimal performance and user experience. - -## Introducing RxDB as a Database Solution -RxDB stands for Reactive Database and is built on the principles of reactive programming. It combines the best features of [NoSQL databases](./in-memory-nosql-database.md) with the power of reactive programming to provide a scalable and efficient database solution. RxDB offers seamless integration with Angular applications and brings several unique features that make it an attractive choice for developers. - -
    - -
    - -## Getting Started with RxDB -To begin our journey with RxDB, let's understand its key concepts and features. - -### What is RxDB? -[RxDB](https://rxdb.info/) is a client-side database that follows the principles of reactive programming. It is built on top of IndexedDB, the [native browser database](./browser-database.md), and leverages the RxJS library for reactive data handling. RxDB provides a simple and intuitive API for managing data and offers features like data replication, multi-tab support, and efficient query handling. - -
    - - - -
    - -### Reactive Data Handling -At the core of RxDB is the concept of reactive data handling. RxDB leverages observables and reactive streams to enable real-time updates and data synchronization. With RxDB, you can easily subscribe to data changes and react to them in a reactive and efficient manner. - - - -### Offline-First Approach -One of the standout features of RxDB is its offline-first approach. It allows you to build applications that can work seamlessly in offline scenarios. RxDB stores data locally and automatically synchronizes changes with the server when the network becomes available. This capability is particularly useful for applications that need to function in low-connectivity or unreliable network environments. - -### Data Replication -RxDB provides built-in support for data replication between clients and servers. This means you can synchronize data across multiple devices or instances of your application effortlessly. RxDB handles conflict resolution and ensures that data remains consistent across all connected clients. - -### Observable Queries -RxDB offers a powerful querying mechanism with support for observable queries. This allows you to create dynamic queries that automatically update when the underlying data changes. By leveraging RxDB's observable queries, you can build reactive UI components that respond to data changes in real-time. - -### Multi-Tab Support -RxDB provides out-of-the-box support for multi-tab scenarios. This means that if your Angular application is running in multiple browser tabs, RxDB automatically keeps the data in sync across all tabs. It ensures that changes made in one tab are immediately reflected in others, providing a seamless user experience. - - - -### RxDB vs. Other Angular Database Options -While there are other database options available for Angular applications, RxDB stands out with its reactive programming model, offline-first approach, and built-in synchronization capabilities. Unlike traditional SQL databases, RxDB's NoSQL-like structure and observables-based API make it well-suited for real-time applications and complex data scenarios. - -## Using RxDB in an Angular Application -Now that we have a good understanding of RxDB and its features, let's explore how to integrate it into an Angular application. - -### Installing RxDB in an Angular App -To use RxDB in an Angular application, we first need to install the necessary dependencies. You can install RxDB using npm or yarn by running the following command: - -```bash -npm install rxdb --save -``` -Once installed, you can import RxDB into your Angular application and start using its API to create and manage databases. - -### Patch Change Detection with zone.js -Angular uses change detection to detect and update UI elements when data changes. However, RxDB's data handling is based on observables, which can sometimes bypass Angular's change detection mechanism. To ensure that changes made in RxDB are detected by Angular, we need to patch the change detection mechanism using zone.js. Zone.js is a library that intercepts and tracks asynchronous operations, including observables. By patching zone.js, we can make sure that Angular is aware of changes happening in RxDB. - -:::warning - -RxDB creates rxjs observables outside of angulars zone -So you have to import the rxjs patch to ensure the [angular change detection](https://angular.io/guide/change-detection) works correctly. -[link](https://www.bennadel.com/blog/3448-binding-rxjs-observable-sources-outside-of-the-ngzone-in-angular-6-0-2.htm) - -```ts -//> app.component.ts -import 'zone.js/plugins/zone-patch-rxjs'; -``` -::: - -### Use the Angular async pipe to observe an RxDB Query -Angular provides the async pipe, which is a convenient way to subscribe to observables and handle the subscription lifecycle automatically. When working with RxDB, you can use the async pipe to observe an RxDB query and bind the results directly to your Angular template. This ensures that the UI stays in sync with the data changes emitted by the RxDB query. - -```ts - constructor( - private dbService: DatabaseService, - private dialog: MatDialog - ) { - this.heroes$ = this.dbService - .db.hero // collection - .find({ // query - selector: {}, - sort: [{ name: 'asc' }] - }) - .$; - } -``` - -```html - - {{hero.name}} - -``` - -### Different RxStorage layers for RxDB -RxDB supports multiple storage layers for persisting data. Some of the available storage options include: - -- [LocalStorage RxStorage](../rx-storage-localstorage.md): Uses the [LocalStorage API](./localstorage.md) without any third party plugins. -- [IndexedDB RxStorage](../rx-storage-indexeddb.md): RxDB directly supports IndexedDB as a storage layer. IndexedDB is a low-level browser database that offers good performance and reliability. -- [OPFS RxStorage](../rx-storage-opfs.md): The OPFS [RxStorage](../rx-storage.md) for RxDB is built on top of the [File System Access API](https://webkit.org/blog/12257/the-file-system-access-api-with-origin-private-file-system/) which is available in [all modern browsers](https://caniuse.com/native-filesystem-api). It provides an API to access a sandboxed private file system to persistently store and retrieve data. -Compared to other persistent storage options in the browser (like [IndexedDB](../rx-storage-indexeddb.md)), the OPFS API has a **way better performance**. -- [Memory RxStorage](../rx-storage-memory.md): In addition to persistent storage options, RxDB also provides a memory-based storage layer. This is useful for testing or scenarios where you don't need long-term data persistence. -You can choose the storage layer that best suits your application's requirements and configure RxDB accordingly. - -## Synchronizing Data with RxDB between Clients and Servers - -Data replication between an Angular application and a server is a common requirement. RxDB simplifies this process and provides built-in support for data synchronization. Let's explore how to replicate data between an Angular application and a server using RxDB. - - - -### Offline-First Approach -One of the key strengths of RxDB is its [offline-first approach](../offline-first.md). It allows Angular applications to function seamlessly even in offline scenarios. RxDB stores data locally and automatically synchronizes changes with the server when the network becomes available. This capability is particularly useful for applications that need to operate in low-connectivity or unreliable network environments. - -### Conflict Resolution -In a distributed system, conflicts can arise when multiple clients modify the same data simultaneously. RxDB offers conflict resolution mechanisms to handle such scenarios. You can define conflict resolution strategies based on your application's requirements. RxDB provides hooks and events to detect conflicts and resolve them in a consistent manner. - -### Bidirectional Synchronization -RxDB supports bidirectional data synchronization, allowing updates from both the client and server to be replicated seamlessly. This ensures that data remains consistent across all connected clients and the server. RxDB handles conflicts and resolves them based on the defined conflict resolution strategies. - -### Real-Time Updates -RxDB provides real-time updates by leveraging reactive programming principles. Changes made to the data are automatically propagated to all connected clients in real-time. Angular applications can subscribe to these updates and update the user interface accordingly. This real-time capability enables collaborative features and enhances the overall user experience. - -## Advanced RxDB Features and Techniques -RxDB offers several advanced features and techniques that can further enhance your Angular application. - -### Indexing and Performance Optimization -To improve query performance, RxDB allows you to define indexes on specific fields of your documents. Indexing enables faster data retrieval and query execution, especially when working with large datasets. By strategically creating indexes, you can optimize the performance of your Angular application. - -### Encryption of Local Data -RxDB provides built-in support for [encrypting](../encryption.md) local data using the Web Crypto API. With encryption, you can protect sensitive data stored in the client-side database. RxDB transparently encrypts the data, ensuring that it remains secure even if the underlying storage is compromised. - -### Change Streams and Event Handling -RxDB exposes change streams, which allow you to listen for data changes at a database or collection level. By subscribing to change streams, you can react to data modifications and perform specific actions, such as updating the UI or triggering notifications. Change streams enable real-time event handling in your Angular application. - -### JSON Key Compression -To reduce the storage footprint and improve performance, RxDB supports [JSON key compression](../key-compression.md). With key compression, RxDB replaces long keys with shorter aliases, reducing the overall storage size. This optimization is particularly useful when working with large datasets or frequently updating data. - -## Best Practices for Using RxDB in Angular Applications -To make the most of RxDB in your Angular application, consider the following best practices: - -### Use Async Pipe for Subscriptions so you do not have to unsubscribe -Angular's `async` pipe is a powerful tool for handling observables in templates. By using the async pipe, you can avoid the need to manually subscribe and unsubscribe from RxDB observables. Angular takes care of the subscription lifecycle, ensuring that resources are released when they are no longer needed. Instead of manually subscribing to Observables, you should always prefer the `async` pipe. - -```ts -// WRONG: -let amount; -this.dbService - .db.hero - .find({ - selector: {}, - sort: [{ name: 'asc' }] - }) - .$.subscribe(docs => { - amount = 0; - docs.forEach(d => amount = d.points); - }); - -// RIGHT: -this.amount$ = this.dbService - .db.hero - .find({ - selector: {}, - sort: [{ name: 'asc' }] - }) - .$.pipe( - map(docs => { - let amount = 0; - docs.forEach(d => amount = d.points); - return amount; - }) - ); -``` - -### Use custom reactivity to have signals instead of rxjs observables - -RxDB supports adding custom reactivity factories that allow you to get angular signals out of the database instead of rxjs observables. [read more](../reactivity.md). - -### Use Angular Services for Database creation -To ensure proper separation of concerns and maintain a clean codebase, it is recommended to create an Angular service responsible for managing the RxDB database instance. This service can handle database creation, initialization, and provide methods for interacting with the database throughout your application. - -### Efficient Data Handling -RxDB provides various mechanisms for efficient data handling, such as batching updates, debouncing, and throttling. Leveraging these techniques can help optimize performance and reduce unnecessary UI updates. Consider the specific data handling requirements of your application and choose the appropriate strategies provided by RxDB. - -### Data Synchronization Strategies -When working with data synchronization between clients and servers, it's important to consider strategies for conflict resolution and handling network failures. RxDB provides plugins and hooks that allow you to customize the replication behavior and implement specific synchronization strategies tailored to your application's needs. - -## Conclusion -RxDB is a powerful database solution for Angular applications, offering reactive data handling, offline-first capabilities, and seamless data synchronization. By integrating RxDB into your Angular application, you can build responsive and scalable web applications that provide a rich user experience. Whether you're building real-time collaborative apps, progressive web applications, or offline-capable applications, RxDB's features and techniques make it a valuable addition to your Angular development toolkit. - -## Follow Up -To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: - -- [RxDB GitHub Repository](https://github.com/pubkey/rxdb): Visit the official GitHub repository of RxDB to access the source code, documentation, and community support. -- [RxDB Quickstart](../quickstart.md): Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects. -- [RxDB Angular Example at GitHub](https://github.com/pubkey/rxdb/tree/master/examples/angular) - ---- - -## Build Smarter Offline-First Angular Apps - How RxDB Beats IndexedDB Alone - -import {Tabs} from '@site/src/components/tabs'; -import {Steps} from '@site/src/components/steps'; - -# Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone - -In modern web applications, offline capabilities and fast interactions are crucial. IndexedDB, the [browser](./browser-database.md)'s built-in database, allows you to store data locally, making your Angular application more robust and responsive. However, IndexedDB can be cumbersome to work with directly. That's where RxDB (Reactive Database) shines. In this article, we'll walk you through how to utilize IndexedDB in your Angular project using [RxDB](https://rxdb.info/) as a convenient abstraction layer. - -## What Is IndexedDB? -[IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) is a low-level JavaScript API for client-side storage of large amounts of structured data. It allows you to create key-value or object store-based data storage right in the user's browser. IndexedDB supports transactions and indexing but lacks a robust query API and can be complex to use due to its callback-based nature. - -
    - -
    - -## Why Use IndexedDB in Angular - -- [Offline-First](../offline-first.md)/[Local-First](./local-first-future.md): If your app needs to function with limited or no internet connectivity, IndexedDB provides a reliable local storage layer. Users can continue using the application offline, and data can sync when the connection is restored. - -- **Performance**: Local data access comes with [near-zero latency](./zero-latency-local-first.md), removing the need for constant server requests and eliminating most loading spinners. - -- **Easier to Implement**: By replicating all necessary data to the client once, you avoid implementing numerous backend endpoints for each user interaction. - -- **Scalability**: Local data queries remove processing load from your servers and reduce bandwidth usage by handling queries on the client side. - -## Why Using Plain IndexedDB is a Problem - -Despite the advantages, directly working with IndexedDB has several drawbacks: - -- **Callback-Based**: IndexedDB was originally designed around a callback-based API, which can be unwieldy compared to modern Promise or RxJS-based flows. - -- **Difficult to Implement**: IndexedDB is often described as a "low-level" API. It's more suitable for library authors rather than application developers who simply need a robust local store. - -- **Rudimentary Query API**: Complex or dynamic queries are cumbersome with IndexedDB's basic get/put approach and limited indexes. - -- **TypeScript Support**: Maintaining strong TypeScript types for all document structures is not straightforward with IndexedDB's untyped object stores. - -- **No Observable API**: IndexedDB cannot directly emit live data changes. With RxDB, you can subscribe to changes on a collection or even a single document field. - -- **Cross-Tab Synchronization**: Handling concurrent data changes across multiple browser tabs is difficult in IndexedDB. RxDB has built-in multi-tab support that keeps all tabs in sync. - -- **Advanced Features Missing**: IndexedDB lacks built-in support for encryption, compression, or other advanced data management features. - -- **Browser-Only**: IndexedDB works in the browser but not in environments like React Native or Electron. RxDB offers storage adapters to seamlessly reuse the same code on different platforms. - -
    - - - -
    - -## Set Up RxDB in Angular - -### Installing RxDB - -You can [install RxDB](../install.md) into your Angular application via npm: - -```bash -npm install rxdb --save -``` - -### Patch Change Detection with zone.js - -RxDB creates RxJS observables outside of Angular's zone, meaning Angular won't automatically trigger change detection when new data arrives. You must patch RxJS with zone.js: - -```ts -//> app.component.ts -/** - * IMPORTANT: RxDB creates rxjs observables outside of Angular's zone - * So you have to import the rxjs patch to ensure change detection works correctly. - * @link https://www.bennadel.com/blog/3448-binding-rxjs-observable-sources-outside-of-the-ngzone-in-angular-6-0-2.htm - */ -import 'zone.js/plugins/zone-patch-rxjs'; -``` - -### Create a Database and Collections - -RxDB supports multiple storage options. The free and simple approach is using the [localstorage-based](../rx-storage-localstorage.md) storage. For higher performance, there's a premium plain [IndexedDB storage](../rx-storage-indexeddb.md). - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; - -// Define your schema -const heroSchema = { - title: 'hero schema', - version: 0, - description: 'Describes a hero in your app', - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 - }, - name: { - type: 'string' - }, - power: { - type: 'string' - } - }, - required: ['id', 'name'] -}; -``` - - - -### Localstorage - -```ts -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -export async function initDB() { - // Create a database - const db = await createRxDatabase({ - name: 'heroesdb', // the name of the database - storage: getRxStorageLocalstorage() - }); - - // Add collections - await db.addCollections({ - heroes: { - schema: heroSchema - } - }); - - return db; -} -``` - -### IndexedDB - -```ts -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; -export async function initDB() { - // Create a database - const db = await createRxDatabase({ - name: 'heroesdb', // the name of the database - storage: getRxStorageIndexedDB() - }); - - // Add collections - await db.addCollections({ - heroes: { - schema: heroSchema - } - }); - - return db; -} -``` - - - -It's recommended to encapsulate database creation logic in an Angular service, such as in a DatabaseService. A full example is available in [RxDB's Angular example](https://github.com/pubkey/rxdb/blob/master/examples/angular/src/app/services/database.service.ts). - -### CRUD Operations - -Once your database is initialized, you can perform all CRUD operations: - -```ts -// insert -await db.heroes.insert({ name: 'Iron Man', power: 'Genius-level intellect' }); - -// bulk insert -await db.heroes.bulkInsert([ - { name: 'Thor', power: 'God of Thunder' }, - { name: 'Hulk', power: 'Superhuman Strength' } -]); - -// find and findOne -const heroes = await db.heroes.find().exec(); -const ironMan = await db.heroes.findOne({ selector: { name: 'Iron Man' } }).exec(); - -// update -const doc = await db.heroes.findOne({ selector: { name: 'Hulk' } }).exec(); -await doc.update({ $set: { power: 'Unlimited Strength' } }); - -// delete -const doc = await db.heroes.findOne({ selector: { name: 'Thor' } }).exec(); -await doc.remove(); -``` - -## Reactive Queries and Live Updates - -A key benefit of RxDB is reactivity. You can subscribe to changes and have your UI automatically reflect updates in [real time](./realtime-database.md) even across browser tabs. - - - -### With RxJS Observables and Async Pipes - -In Angular, you can display this data with the `AsyncPipe`: - -```ts -constructor(private dbService: DatabaseService) { - this.heroes$ = this.dbService.db.heroes.find({ - selector: {}, - sort: [{ name: 'asc' }] - }).$; -} -``` - -```html - - - {{ hero.name }} - - -``` - -### With Angular Signals - -Angular Signals are a newer approach for reactivity. RxDB supports them via a [custom reactivity](../reactivity.md) factory. You can convert RxJS Observables to Signals using Angular's `toSignal`: - -```ts -import { RxReactivityFactory } from 'rxdb/plugins/core'; -import { Signal, untracked, Injector } from '@angular/core'; -import { toSignal } from '@angular/core/rxjs-interop'; - -export function createReactivityFactory(injector: Injector): RxReactivityFactory> { - return { - fromObservable(observable$, initialValue) { - return untracked(() => - toSignal(observable$, { - initialValue, - injector, - rejectErrors: true - }) - ); - } - }; -} -``` - -Pass this factory when creating your [RxDatabase](../rx-database.md): - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -import { inject, Injector } from '@angular/core'; - -const database = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage(), - reactivity: createReactivityFactory(inject(Injector)) -}); -``` - -Use the double-dollar sign (`$$`) to get a `Signal` instead of an `Observable`: - -```ts -const heroesSignal = database.heroes.find().$$; -``` - -```html - - - {{ hero.name }} - - -``` - -## Angular IndexedDB Example with RxDB - -A comprehensive example of RxDB in an Angular application is available in the [RxDB GitHub repository](https://github.com/pubkey/rxdb/tree/master/examples/angular). It demonstrates [database](./angular-database.md) creation, queries, and Angular integration using best practices. - -## Advanced RxDB Features - -Beyond simple CRUD and local data storage, RxDB supports: - -- **Replication**: Sync your local data with a remote database. Learn more at [RxDB Replication](https://rxdb.info/replication.html). - -- **Data Migration on Schema Changes**: RxDB supports automatic or manual schema migrations to manage backward-compatibility and evolve your data structure. See [RxDB Migration](https://rxdb.info/migration-schema.html). - -- **Encryption**: Easily encrypt sensitive data at rest. See [RxDB Encryption](https://rxdb.info/encryption.html). - -- **Compression**: Reduce storage and bandwidth usage using key compression. Learn more at [RxDB Key Compression](https://rxdb.info/key-compression.html). - -## Limitations of IndexedDB - -While IndexedDB works well for many use cases, it does have a few constraints: - -- **Potentially Slow**: While adequate for most use cases, IndexedDB performance can degrade for very large datasets. More details at RxDB [Slow IndexedDB](../slow-indexeddb.md). - -- **Storage Limits**: Browsers may cap the amount of data you can store in IndexedDB. For more info, see [Local Storage Limits of IndexedDB](./indexeddb-max-storage-limit.md). - -## Alternatives to IndexedDB - -Depending on your needs, you might explore: - -- **Origin Private File System (OPFS)**: A newer browser storage mechanism that can offer better performance. RxDB supports [OPFS storage](../rx-storage-opfs.md). - -- **SQLite**: When building a mobile or hybrid app (e.g., with [Capacitor](../capacitor-database.md) or [Ionic](./ionic-database.md)), you can use SQLite locally. See [RxDB with SQLite](../rx-storage-sqlite.md). - -## Performance comparison with other browser storages -Here is a [performance overview](../rx-storage-performance.md) of the various browser based storage implementation of RxDB: - - - -## Follow Up - -Continue your deep dive into RxDB with official quickstart guides and star the repository on GitHub to stay updated. - -- **RxDB Quickstart**: Get started quickly with the [RxDB Quickstart](../quickstart.md). - -- **RxDB GitHub**: Explore the source, open issues, and star ⭐ the project at [RxDB GitHub Repo](https://github.com/pubkey/rxdb). - -By combining IndexedDB's local storage with RxDB's powerful features, you can build performant, robust, and offline-capable Angular applications. RxDB takes care of the lower-level complexities, letting you focus on delivering a great user experience-online or off. - ---- - -## Benefits of RxDB & Browser Databases - -# RxDB: The benefits of Browser Databases -In the world of web development, efficient data management is a cornerstone of building successful and performant applications. The ability to store data directly in the browser brings numerous advantages, such as caching, offline accessibility, simplified replication of database state, and real-time application development. In this article, we will explore [RxDB](https://rxdb.info/), a powerful browser JavaScript database, and understand why it is an excellent choice for implementing a browser database solution. - -
    - - - -
    - -## Why you might want to store data in the browser -There are compelling reasons to consider storing data in the browser: - -### Use the database for caching -By leveraging a browser database, you can harness the power of caching. Storing frequently accessed data locally enables you to reduce server requests and greatly improve application performance. Caching provides a faster and smoother user experience, enhancing overall user satisfaction. - -### Data is offline accessible -Storing data in the browser allows for offline accessibility. Regardless of an active internet connection, users can access and interact with the application, ensuring uninterrupted productivity and user engagement. - -### Easier implementation of replicating database state -Browser databases simplify the replication of database state across multiple devices or instances of the application. Compared to complex REST routes, replicating data becomes easier and more streamlined. This capability enables the development of real-time and collaborative applications, where changes are seamlessly synchronized among users. - -### Building real-time applications is easier with local data -With a local browser database, building real-time applications becomes more straightforward. The availability of local data allows for reactive data flows and dynamic user interfaces that instantly reflect changes in the underlying data. Real-time features can be seamlessly implemented, providing a rich and interactive user experience. - -### Browser databases can scale better -Browser databases distribute the query workload to users' devices, allowing queries to run locally instead of relying solely on server resources. This decentralized approach improves scalability by reducing the burden on the server, resulting in a more efficient and responsive application. - -### Running queries locally has low latency -Browser databases offer the advantage of running queries locally, resulting in low latency. Eliminating the need for server round-trips significantly improves query performance, ensuring faster data retrieval and a more responsive application. - -### Faster initial application start time -Storing data in the browser reduces the initial application start time. Instead of waiting for data to be fetched from the server, the application can leverage the [local database](./local-database.md), resulting in faster initialization and improved user satisfaction right from the start. - -### Easier integration with JavaScript frameworks -Browser databases, including [RxDB](https://rxdb.info/), seamlessly integrate with popular JavaScript frameworks such as [Angular](./angular-database.md), [React.js](./react-database.md), [Vue.js](./vue-database.md), and Svelte. This integration allows developers to leverage the power of a database while working within the familiar environment of their preferred framework, enhancing productivity and ease of development. - -### Store local data with encryption -Security is a crucial aspect of data storage, especially when handling sensitive information. Browser databases, like RxDB, offer the capability to store local data with encryption, ensuring the confidentiality and protection of sensitive user data. - -### Using a local database for state management -Utilizing a local browser database for state management eliminates the need for traditional state management libraries like Redux or NgRx. This approach simplifies the application's architecture by leveraging the database's capabilities to handle state-related operations efficiently. - -### Data is portable and always accessible by the user -When data is stored in the browser, it becomes portable and always accessible by the user. This ensures that users have control and ownership of their data, enhancing data privacy and accessibility. - -## Why SQL databases like SQLite are not a good fit for the browser -While SQL databases, such as SQLite, excel in server-side scenarios, they are not always the optimal choice for browser-based applications. Here are some reasons why SQL databases may not be the best fit for the browser: - -### Push/Pull based vs. reactive -SQL databases typically rely on a push/pull mechanism, where the server pushes updates to the client or the client pulls data from the server. This approach is not inherently reactive and requires additional effort to implement real-time data updates. In contrast, browser databases like [RxDB](https://rxdb.info/) provide built-in reactive mechanisms, allowing the application to react to data changes seamlessly. - -### Build size of server-side databases -Server-side databases, designed to handle large-scale applications, often have significant build sizes that are unsuitable for browser applications. In contrast, browser databases are specifically optimized for browser environments and leverage browser APIs like [IndexedDB](../rx-storage-indexeddb.md), [OPFS](../rx-storage-opfs.md), and [Webworker](../rx-storage-worker.md), resulting in smaller build sizes. - -### Initialization time and performance -The initialization time and performance of server-side databases can be suboptimal in browser applications. Browser databases, on the other hand, are designed to provide fast initialization and efficient performance within the browser environment, ensuring a smooth user experience. - -## Why RxDB is a good fit for the browser -RxDB stands out as an excellent choice for implementing a browser database solution. Here's why RxDB is a perfect fit for browser applications: - -### Observable Queries (rxjs) to automatically update the UI on changes -RxDB provides Observable Queries, powered by RxJS, enabling automatic UI updates when data changes occur. This reactive approach eliminates the need for manual data synchronization and ensures a real-time and responsive user interface. - -```typescript -const query = myCollection.find({ - selector: { - age: { - $gt: 21 - } - } -}); -const querySub = query.$.subscribe(results => { - console.log('got results: ' + results.length); -}); -``` - -### NoSQL [JSON](./json-database.md) documents are a better fit for UIs -RxDB utilizes NoSQL [JSON documents](./json-database.md), which align naturally with UI development in JavaScript. JavaScript's native handling of JSON objects makes working with NoSQL documents more intuitive, simplifying UI-related operations. - -### NoSQL has better TypeScript support compared to SQL -TypeScript is widely used in modern JavaScript development. [NoSQL databases](./in-memory-nosql-database.md), including RxDB, offer excellent TypeScript support, making it easier to build type-safe applications and leverage the benefits of static typing. - -### Observable document fields -RxDB allows observing individual document fields, providing granular reactivity. This feature enables efficient tracking of specific data changes and fine-grained UI updates, optimizing performance and responsiveness. - -### Made in JavaScript, optimized for JavaScript applications -RxDB is built entirely in JavaScript, optimized for JavaScript applications. This ensures seamless integration with JavaScript codebases and maximizes performance within the browser environment. - -### Optimized observed queries with the EventReduce Algorithm -RxDB employs the EventReduce Algorithm to optimize observed queries. This algorithm intelligently reduces unnecessary data transmissions, resulting in efficient query execution and improved performance. - -### Built-in multi-tab support -RxDB natively supports multi-tab applications, allowing data synchronization and replication across different tabs or instances of the same application. This feature ensures consistent data across the application and enhances collaboration and real-time experiences. - - - -### Handling of schema changes -RxDB excels in handling schema changes, even when data is stored on multiple client devices. It provides mechanisms to handle schema migrations seamlessly, ensuring data integrity and compatibility as the application evolves. - -### Storing documents compressed -To optimize [storage](./browser-storage.md) space, RxDB allows the [compression](../key-compression.md) of documents. Storing compressed documents reduces storage requirements and improves overall performance, especially in scenarios with large data volumes. - -### Flexible storage layer for various platforms -RxDB offers a flexible storage layer, enabling code reuse across different platforms, including [Electron.js](../electron-database.md), React Native, hybrid apps (e.g., Capacitor.js), and web browsers. This flexibility streamlines development efforts and ensures consistent data management across multiple platforms. - -### Replication Algorithm for compatibility with any backend -RxDB incorporates a [Replication Algorithm](../replication.md) that is open-source and can be made compatible with various backend systems. This compatibility allows seamless data synchronization with different backend architectures, such as own servers, [Firebase](../replication-firestore.md), [CouchDB](../replication-couchdb.md), [NATS](../replication-nats.md) or [WebSocket](../replication-websocket.md). - - - -## Follow Up -To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: - -- [RxDB GitHub Repository](https://github.com/pubkey/rxdb): Visit the official GitHub repository of RxDB to access the source code, documentation, and community support. -- [RxDB Quickstart](../quickstart.md): Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects. - -[RxDB](https://rxdb.info/) empowers developers to unlock the power of browser databases, enabling efficient data management, real-time applications, and enhanced user experiences. By leveraging RxDB's features and benefits, you can take your browser-based applications to the next level of performance, scalability, and responsiveness. - ---- - -## Browser Storage - RxDB as a Database for Browsers - - -**Storing Data in the Browser** - -When it comes to building web applications, one essential aspect is the storage of data. Two common methods of storing data directly within the user's web browser are Localstorage and [IndexedDB](../rx-storage-indexeddb.md). These browser-based storage options serve various purposes and cater to different needs in web development. - -
    - - - -
    - -### Localstorage -[Localstorage](./localstorage.md) is a straightforward way to store small amounts of data in the user's web browser. It operates on a simple key-value basis and is relatively easy to use. While it has limitations, it is suitable for basic data storage requirements. - -### IndexedDB -IndexedDB, on the other hand, offers a more robust and structured approach to browser-based data storage. It can handle larger datasets and complex queries, making it a valuable choice for more advanced web applications. - -## Why Store Data in the Browser -Now that we've explored the methods of storing data in the browser, let's delve into why this is a beneficial strategy for web developers: - -1. **Caching**: -Storing data in the browser allows you to cache frequently used information. This means that your web application can access essential data more quickly because it doesn't need to repeatedly fetch it from a server. This results in a smoother and more responsive user experience. - -2. **Offline Access**: -One significant advantage of browser storage is that data becomes portable and remains accessible even when the user is offline. This feature ensures that users can continue to use your application, view their saved information, and make changes, irrespective of their internet connection status. - -3. **Faster Real-time Applications**: -For real-time applications, having data stored locally in the browser significantly enhances performance. Local data allows your application to respond faster to user interactions, creating a more seamless and responsive user interface. - -4. **Low Latency Queries**: -When you run queries locally within the browser, you minimize the latency associated with network requests. This results in near-instant access to data, which is particularly crucial for applications that require rapid data retrieval. - -5. **Faster Initial Application Start Time**: -By preloading essential data into browser storage, you can reduce the initial load time of your web application. Users can start using your application more swiftly, which is essential for making a positive first impression. - -6. **Store Local Data with Encryption**: -For applications that deal with sensitive data, browser storage allows you to implement [encryption](../encryption.md) to secure the stored information. This ensures that even if data is stored on the user's device, it remains confidential and protected. - -In summary, storing data in the browser offers several advantages, including improved performance, offline access, and enhanced user experiences. Localstorage and IndexedDB are two valuable tools that developers can utilize to leverage these benefits and create web applications that are more responsive and user-friendly. - -## Browser Storage Limitations -While browser storage, such as Localstorage and IndexedDB, offers many advantages, it's important to be aware of its limitations: - -- **Slower Performance Compared to Native Databases**: Browser-based storage solutions can't match the [performance](../rx-storage-performance.md) of native server-side databases. They may experience slower data retrieval and processing, especially for large datasets or complex operations. - -- **Storage Space Limitations**: Browsers [impose restrictions on the amount of data that can be stored locally](./indexeddb-max-storage-limit.md). This limitation can be problematic for applications with extensive data storage requirements, potentially necessitating creative solutions to manage data effectively. - -## Why SQL Databases Like SQLite Aren't a Good Fit for the Browser -SQL databases like SQLite, while powerful in server environments, may not be the best choice for browser-based applications due to various reasons: - -### Push/Pull Based vs. Reactive -SQL databases often use a push/pull model for data synchronization. This approach is less reactive and may not align well with the real-time nature of web applications, where immediate updates to the user interface are crucial. - -### Build Size of Server-Side Databases -Server-side databases like SQLite have a significant build size, which can increase the initial load time of web applications. This can result in a suboptimal user experience, particularly for users with slower internet connections. - -### Initialization Time and Performance -SQL databases are optimized for server environments, and their initialization processes and performance characteristics may not align with the needs of web applications. They might not offer the swift performance required for seamless user interactions. - -## Why RxDB Is a Good Fit as Browser Storage -RxDB is an excellent choice for browser-based storage due to its numerous features and advantages: - -
    - - - -
    - -### Flexible Storage Layer for Various Platforms -RxDB offers a flexible storage layer that can seamlessly integrate with different platforms, making it versatile and adaptable to various application needs. - -### NoSQL JSON Documents Are a Better Fit for UIs -NoSQL [JSON documents](./json-database.md), used by [RxDB](https://rxdb.info/), are well-suited for user interfaces. They provide a natural and efficient way to structure and display data in web applications. - -### NoSQL Has Better TypeScript Support Compared to SQL -RxDB boasts robust TypeScript support, which is beneficial for developers who prefer type safety and code predictability in their projects. - -### Observable Document Fields -RxDB enables developers to observe individual document fields, offering fine-grained control over data tracking and updates. - -### Made in JavaScript, Optimized for JavaScript Applications -Being built in JavaScript and optimized for JavaScript applications, RxDB seamlessly integrates into web development stacks, minimizing compatibility issues. - -### Observable Queries (rxjs) to Automatically Update the UI on Changes -RxDB's support for Observable Queries allows the user interface to update automatically in real-time when data changes. This reactivity enhances the user experience and simplifies UI development. - -```typescript -const query = myCollection.find({ - selector: { - age: { - $gt: 21 - } - } -}); -const querySub = query.$.subscribe(results => { - console.log('got results: ' + results.length); -}); -``` - -### Optimized Observed Queries with the EventReduce Algorithm -RxDB's [EventReduce Algorithm](https://github.com/pubkey/event-reduce) ensures efficient data handling and rendering, improving overall performance and responsiveness. - -### Handling of Schema Changes -RxDB provides built-in support for [handling schema changes](../migration-schema.md), simplifying database management when updates are required. - -### Built-In Multi-Tab Support -For applications requiring multi-tab support, RxDB natively handles data consistency across different browser tabs, streamlining data synchronization. - - - -### Storing Documents Compressed -Efficient data storage is achieved through [document compression](../key-compression.md), reducing storage space requirements and enhancing overall performance. - -### Replication Algorithm for Compatibility with Any Backend -RxDB's [Replication Algorithm](../replication.md) facilitates compatibility with various backend systems, ensuring seamless data synchronization between the browser and server. - - - -## Summary - -In conclusion, RxDB is a powerful and feature-rich solution for browser-based storage. Its adaptability, real-time capabilities, TypeScript support, and optimization for JavaScript applications make it an ideal choice for modern web development projects, addressing the limitations of traditional SQL databases in the browser. Developers can harness RxDB to create efficient, responsive, and user-friendly web applications that leverage the full potential of browser storage. - -## Follow Up -To explore more about RxDB and leverage its capabilities for browser storage, check out the following resources: - -- [RxDB GitHub Repository](https://github.com/pubkey/rxdb): Visit the official GitHub repository of RxDB to access the source code, documentation, and community support. -- [RxDB Quickstart](../quickstart.md): Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects. - ---- - -## Empower Web Apps with Reactive RxDB Data-base - -# RxDB as a data base: Empowering Web Applications with Reactive Data Handling -In the world of web applications, efficient data management plays a crucial role in delivering a seamless user experience. As mobile applications continue to dominate the digital landscape, the importance of robust data bases becomes evident. In this article, we will explore RxDB as a powerful data base solution for web applications. We will delve into its features, advantages, and advanced techniques, highlighting its ability to handle reactive data and enable an offline-first approach. - -
    - - - -
    - -## Overview of Web Applications that can benefit from RxDB -Before diving into the specifics of RxDB, let's take a moment to understand the scope of web applications that can leverage its capabilities. Any web application that requires real-time data updates, offline functionality, and synchronization between clients and servers can greatly benefit from RxDB. Whether it's a collaborative document editing tool, a task management app, or a chat application, RxDB offers a robust foundation for building these types of applications. - -## Importance of data bases in Mobile Applications -Mobile applications have become an integral part of our lives, providing us with instant access to information and services. Behind the scenes, data bases play a pivotal role in storing and managing the data that powers these applications. data bases enable efficient data retrieval, updates, and synchronization, ensuring a smooth user experience even in challenging network conditions. - -## Introducing RxDB as a data base Solution -RxDB, short for Reactive data base, is a client-side data base solution designed specifically for web and mobile applications. Built on the principles of reactive programming, RxDB brings the power of observables and event-driven architecture to data management. With RxDB, developers can create applications that are responsive, offline-ready, and capable of seamless data synchronization between clients and servers. - -## Getting Started with RxDB -### What is RxDB? -RxDB is an open-source JavaScript data base that leverages reactive programming and provides a seamless API for handling data. It is built on top of existing popular data base technologies, such as IndexedDB, and adds a layer of reactive features to enable real-time data updates and synchronization. - -### Reactive Data Handling -One of the standout features of RxDB is its reactive data handling. It utilizes observables to provide a stream of data that automatically updates whenever a change occurs. This reactive approach allows developers to build applications that respond instantly to data changes, ensuring a highly interactive and real-time user experience. - -### Offline-First Approach -RxDB embraces an offline-first approach, enabling applications to work seamlessly even when there is no internet connectivity. It achieves this by caching data locally on the client-side and synchronizing it with the server when the connection is available. This ensures that users can continue working with the application and have their data automatically synchronized when they come back online. - -### Data Replication -RxDB simplifies the process of data replication between clients and servers. It provides replication plugins that handle the synchronization of data in real-time. These plugins allow applications to keep data consistent across multiple clients, enabling collaborative features and ensuring that each client has the most up-to-date information. - -### Observable Queries -RxDB introduces the concept of observable queries, which are powerful tools for efficiently querying data. With observable queries, developers can subscribe to specific data queries and receive automatic updates whenever the underlying data changes. This eliminates the need for manual polling and ensures that applications always have access to the latest data. - -### Multi-Tab support -RxDB offers multi-tab support, allowing applications to function seamlessly across multiple [browser](./browser-database.md) tabs. This feature ensures that data changes in one tab are immediately reflected in all other open tabs, enabling a consistent user experience across different browser windows. - -### RxDB vs. Other data base Options -When considering data base options for web applications, developers often encounter choices like IndexedDB, [OPFS](../rx-storage-opfs.md), and Memory-based solutions. RxDB, while built on top of IndexedDB, stands out due to its reactive data handling capabilities and advanced synchronization features. Compared to other options, RxDB offers a more streamlined and powerful approach to managing data in web applications. - -### Different RxStorage layers for RxDB -RxDB provides various [storage layers](../rx-storage.md), known as RxStorage, that serve as interfaces to different underlying [storage](./browser-storage.md) technologies. These layers include: - -- [LocalStorage RxStorage](../rx-storage-localstorage.md): Built on top of the browsers [localStorage API](./localstorage.md). -- [IndexedDB RxStorage](../rx-storage-indexeddb.md): This layer directly utilizes IndexedDB as its backend, providing a robust and widely supported storage option. -- [OPFS RxStorage](../rx-storage-opfs.md): OPFS (Operational Transformation File System) is a file system-like storage layer that allows for efficient conflict resolution and real-time collaboration. -- Memory RxStorage: Primarily used for testing and development, this storage layer keeps data in memory without persisting it to disk. -Each RxStorage layer has its strengths and is suited for different scenarios, enabling developers to choose the most appropriate option for their specific use case. - -## Synchronizing Data with RxDB between Clients and Servers -### Offline-First Approach -As mentioned earlier, RxDB adopts an offline-first approach, allowing applications to function seamlessly in disconnected environments. By caching data locally, applications can continue to operate and make updates even without an internet connection. Once the connection is restored, RxDB's replication plugins take care of synchronizing the data with the server, ensuring consistency across all clients. - -### RxDB Replication Plugins -RxDB provides a range of replication plugins that simplify the process of synchronizing data between clients and servers. These plugins enable real-time replication using various protocols, such as WebSocket or HTTP, and handle conflict resolution strategies to ensure data integrity. By leveraging these replication plugins, developers can easily implement robust and scalable synchronization capabilities in their applications. - -### Advanced RxDB Features and Techniques -Indexing and Performance Optimization -To achieve optimal performance, RxDB offers indexing capabilities. Indexing allows for efficient data retrieval and faster query execution. By strategically defining indexes on frequently accessed fields, developers can significantly enhance the overall performance of their RxDB-powered applications. - -### Encryption of Local Data -In scenarios where data security is paramount, RxDB provides options for encrypting local data. By encrypting the data base contents, developers can ensure that sensitive information remains secure even if the underlying storage is compromised. RxDB integrates seamlessly with encryption libraries, making it easy to implement end-to-end encryption in applications. - -### Change Streams and Event Handling -RxDB offers change streams and event handling mechanisms, enabling developers to react to data changes in real-time. With change streams, applications can listen to specific collections or documents and trigger custom logic whenever a change occurs. This capability opens up possibilities for building real-time collaboration features, notifications, or other reactive behaviors. - -### JSON Key Compression -In scenarios where storage size is a concern, RxDB provides JSON [key compression](../key-compression.md). By applying compression techniques to JSON keys, developers can significantly reduce the storage footprint of their data bases. This feature is particularly beneficial for applications dealing with large datasets or [limited storage capacities](./indexeddb-max-storage-limit.md). - -## Conclusion -RxDB provides an exceptional data base solution for web and mobile applications, empowering developers to create reactive, offline-ready, and synchronized applications. With its reactive data handling, offline-first approach, and replication plugins, RxDB simplifies the challenges of building real-time applications with data synchronization requirements. By embracing advanced features like indexing, encryption, change streams, and JSON key compression, developers can optimize performance, enhance security, and reduce storage requirements. As web and [mobile applications](./mobile-database.md) continue to evolve, RxDB proves to be a reliable and powerful - -
    - - - -
    - ---- - -## Embedded Database, Real-time Speed - RxDB - -# Using RxDB as an Embedded Database -In modern UI applications, efficient data storage is a crucial aspect for seamless user experiences. One powerful solution for achieving this is by utilizing an embedded database. In this article, we will explore the concept of an embedded database and delve into the benefits of using [RxDB](https://rxdb.info/) as an embedded database in UI applications. We will also discuss why RxDB stands out as a robust choice for real-time applications with embedded database functionality. - -
    - - - -
    - -## What is an Embedded Database? -An embedded database refers to a client-side database system that is integrated directly within an application. It is designed to operate within the client environment, such as a web browser or a [mobile](./mobile-database.md) app. This approach eliminates the need for a separate database server and allows the database to run locally on the client device. - -## Embedded Database in UI Applications -In the context of UI applications, an embedded database serves as a local data storage solution. It enables applications to efficiently manage data, facilitate real-time updates, and enhance performance. Let's explore some of the benefits of using an embedded database compared to a traditional server database: - -- Replicating database state becomes easier: Implementing real-time data synchronization and replication is simpler with an embedded database compared to complex REST routes. The embedded nature allows for efficient replication of the database state across multiple instances of the application. -- Use the database for caching: An embedded database can be utilized for caching frequently accessed data. This caching mechanism enhances performance and reduces the need for repeated network requests, resulting in faster data retrieval. -- Building real-time applications is easier with local data: By leveraging local data storage, real-time applications can easily update the user interface in response to data changes. This approach simplifies the development of real-time features and enhances the responsiveness of the application. -- Store local data with [encryption](../encryption.md): Embedded databases, like RxDB, offer the ability to store local data with encryption. This ensures that sensitive information remains protected even when stored locally on the client device. -- Data is offline accessible: With an embedded database, data remains accessible even when the application is offline. Users can continue to interact with the application and access their data seamlessly, irrespective of their internet connectivity. -- Faster initial application start time: Since the data is already stored locally, there is no need for initial data fetching from a remote server. This significantly reduces the application's startup time and allows users to engage with the application more quickly. -- Improved scalability with local queries: Embedded databases, such as RxDB, perform queries locally on the client device instead of relying on server round-trips. This reduces latency and enhances scalability, particularly when dealing with large datasets or high query volumes. -- Seamless integration with JavaScript frameworks: Embedded databases, including RxDB, integrate seamlessly with popular JavaScript frameworks like Angular, React.js, [Vue.js](./vue-database.md), and Svelte. This compatibility allows developers to leverage the capabilities of these frameworks while benefiting from embedded database functionality. -- Running queries locally has low latency: With an embedded database, queries are executed locally on the client device, resulting in minimal latency. This improves the overall performance and responsiveness of the application. -- Data is portable and always accessible by the user: Embedded databases enable data portability, allowing users to seamlessly transition between devices while maintaining their data and application state. This ensures that data is always accessible and available to the user. -- Using a [local database](./local-database.md) for state management: Instead of relying on additional state management libraries like Redux or NgRx, an embedded database can be used for local state management. This simplifies state management and ensures data consistency within the application. - -## Why RxDB as an Embedded Database for Real-time Applications -RxDB is a JavaScript-based embedded database that offers numerous advantages for building real-time applications. Let's explore why RxDB is a compelling choice: - -- [Observable Queries](../rx-query.md) (RxJS): RxDB leverages the power of Observables through RxJS, enabling developers to create queries that automatically update the user interface on data changes. This reactive approach simplifies UI updates and ensures real-time synchronization of data. -- [NoSQL JSON Documents](./json-database.md) for UIs: RxDB utilizes NoSQL (JSON) documents as its data model, aligning seamlessly with the requirements of modern UI development. JavaScript's native support for JSON objects makes NoSQL documents a natural fit for UI-driven applications. -- Better TypeScript Support Compared to SQL: RxDB's NoSQL approach provides excellent TypeScript support. The flexibility of working with JSON objects enables robust typing and enhanced development experiences, ensuring type safety and reducing runtime errors. -- [Observable Document Fields](../rx-document.md): RxDB allows developers to observe individual fields within documents. This granularity enables efficient tracking of specific data changes and facilitates targeted UI updates, enhancing performance and responsiveness. -- Made in JavaScript, Optimized for JavaScript Applications: Being built entirely in JavaScript, RxDB is optimized for JavaScript applications. It leverages JavaScript's capabilities and integrates seamlessly with JavaScript frameworks and libraries, making it a natural choice for JavaScript developers. -- Optimized Observed Queries with the [EventReduce Algorithm](https://github.com/pubkey/event-reduce): RxDB incorporates the EventReduce algorithm to optimize observed queries. This algorithm reduces the number of emitted events during query execution, resulting in enhanced query performance and reduced overhead. -- Built-in Multi-tab Support: RxDB provides built-in multi-tab support, allowing multiple instances of an application to share and synchronize data seamlessly. This feature enables collaborative and real-time scenarios across multiple browser tabs or windows. -- Handling of Schema Changes across Multiple Client Devices: With RxDB, handling schema changes across multiple client devices becomes straightforward. RxDB's schema [migration capabilities](../migration-schema.md) ensure that applications can seamlessly adapt to evolving data structures, providing a consistent experience across different devices. -- Storing Documents Compressed: RxDB offers the ability to store documents in a compressed format. This reduces the storage footprint and improves performance, especially when dealing with large datasets. -- Flexible Storage Layer and Cross-platform Compatibility: RxDB provides a flexible storage layer that can be reused across various platforms, including [Electron.js](../electron-database.md), [React Native](../react-native-database.md), hybrid apps (via Capacitor.js), and browsers. This cross-platform compatibility simplifies development and enables code reuse across different environments. -- Replication Algorithm for Backend Compatibility: RxDB's replication algorithm is open-source and can be made compatible with various backend solutions, such as self-hosted servers, Firebase, [CouchDB](../replication-couchdb.md), NATS, WebSockets, and more. This flexibility allows developers to choose their preferred backend infrastructure while benefiting from RxDB's embedded database capabilities. - -
    - - - -
    - -## Follow Up -To further explore [RxDB](https://rxdb.info/) and leverage its capabilities as an embedded database, the following resources can be helpful: - -- [RxDB GitHub Repository](https://github.com/pubkey/rxdb): Visit the official GitHub repository of RxDB to access the source code, documentation, and community support. -- [RxDB Quickstart](../quickstart.md): Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects. - -By utilizing [RxDB](https://rxdb.info/) as an embedded database in UI applications, developers can harness the power of efficient data management, real-time updates, and enhanced user experiences. RxDB's features and benefits make it a compelling choice for building modern, responsive, and scalable applications. - ---- - -## RxDB - Firebase Realtime Database Alternative to Sync With Your Own Backend - -# RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend - -Are you on the lookout for a **Firebase Realtime Database alternative** that gives you greater freedom, deeper offline capabilities, and allows you to seamlessly integrate with any backend? **RxDB** (Reactive Database) might be the perfect choice. This [local-first](./local-first-future.md), NoSQL data store runs entirely on the client while supporting real-time updates and robust syncing with any server environment—making it a strong contender against Firebase Realtime Database's limitations and potential vendor lock-in. - -
    - - - -
    - -## Why RxDB Is an Excellent Firebase Realtime Database Alternative - -### 1. Complete Offline-First Experience -Unlike Firebase Realtime Database, which relies on central infrastructure to process data, RxDB is fully embedded within your client application (including [browsers](./browser-database.md), [Node.js](../nodejs-database.md), [Electron](../electron-database.md), and [React Native](../react-native-database.md)). This design means your app stays completely functional offline, since all data reads and writes happen locally. When connectivity is restored, RxDB's syncing framework automatically reconciles local changes with your remote backend. - -### 2. Freedom to Use Any Server or Cloud -While Firebase Realtime Database ties you into Google's ecosystem, RxDB allows you to choose any hosting environment. You can: -- Host your data on your own servers or private cloud. -- Integrate with relational databases like [PostgreSQL](../replication-http.md) or other NoSQL options such as [CouchDB](../replication-couchdb.md). -- Build custom endpoints using [REST](../replication-http.md), [GraphQL](../replication-graphql.md), or any other protocol. - -This flexibility ensures you're not locked into a single vendor and can adapt your backend strategy as your project evolves. - -### 3. Advanced Conflict Handling -Firebase Realtime Database typically updates data with a simple last-in-wins approach. RxDB, on the other hand, lets you implement more sophisticated conflict resolution logic. Using [revisions and conflict handlers](../transactions-conflicts-revisions.md#custom-conflict-handler), RxDB can merge concurrent edits or preserve multiple versions—ensuring your application remains consistent even when multiple clients modify the same data at the same time. - -### 4. Lower Cloud Costs for Read-Heavy Apps -When you rely on Firebase Realtime Database, each query or listener can translate into ongoing reads, potentially running up your monthly bill. With RxDB, all queries are performed [locally](../offline-first.md). Your app only communicates with the backend to sync document changes, significantly reducing bandwidth and hosting expenses for applications that frequently read data. - -### 5. Powerful Local Queries -If you've hit Firebase Realtime Database's querying limits, RxDB offers a far more robust approach to data retrieval. You can: -- Define custom indexes for faster local lookups. -- Perform sophisticated filters, joins, or full-text searches right on the client. -- Subscribe to real-time data updates through RxDB's [reactive query engine](../reactivity.md). - -Because these operations happen locally, your [UI updates](./optimistic-ui.md) instantly, providing a snappy user experience. - -### 6. True Offline Initialization -While Firebase offers some offline caching, it often requires an initial connection for authentication or to seed local data. RxDB, however, is built to handle an **offline-start** scenario. Users can begin working with the application immediately, regardless of connectivity, and any modifications they make will sync once the network is available again. - -### 7. Works Everywhere JavaScript Runs -One of RxDB's core strengths is its ability to run in **any JavaScript environment**. Whether you're building a web app that uses IndexedDB in the browser, an [Electron](../electron-database.md) desktop program, or a [React Native](../react-native-database.md) mobile application, RxDB's **swappable storage** adapts to your runtime of choice. This consistency makes code-sharing and cross-platform development far simpler than being tied to a single backend system. - ---- - -## How RxDB's Syncing Mechanism Operates - -RxDB employs its own [Sync Engine](../replication.md) to manage data flow between your client and remote [servers](../rx-server.md). Replication revolves around: -1. **Pull**: Retrieving updated or newly created documents from the server. -2. **Push**: Sending local changes to the backend for persistence. -3. **Live Updates**: Continuously streaming changes to and from the backend for real-time synchronization. - -## Sample Code: Sync RxDB With a Custom Endpoint - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -import { replicateRxCollection } from 'rxdb/plugins/replication'; - -async function initDB() { - const db = await createRxDatabase({ - name: 'localdb', - storage: getRxStorageLocalstorage(), - multiInstance: true, - eventReduce: true - }); - - await db.addCollections({ - tasks: { - schema: { - title: 'task schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string', maxLength: 100 }, - title: { type: 'string' }, - complete: { type: 'boolean' } - } - } - } - }); - - // Start a custom replication - replicateRxCollection({ - collection: db.tasks, - replicationIdentifier: 'custom-tasks-api', - push: { - handler: async (docs) => { - // post local changes to your server - const resp = await fetch('https://yourapi.com/tasks/push', { - method: 'POST', - body: JSON.stringify({ changes: docs }) - }); - return await resp.json(); // return conflicting documents if any - } - }, - pull: { - handler: async (lastCheckpoint, batchSize) => { - // fetch new/updated items from your server - const response = await fetch( - `https://yourapi.com/tasks/pull?checkpoint=${JSON.stringify( - lastCheckpoint - )}&limit=${batchSize}` - ); - return await response.json(); - } - }, - live: true - }); - - return db; -} -``` - -### Setting Up P2P Replication Over WebRTC -In addition to using a centralized backend, RxDB supports peer-to-peer synchronization through WebRTC, enabling devices to share data directly. - -```ts -import { - replicateWebRTC, - getConnectionHandlerSimplePeer -} from 'rxdb/plugins/replication-webrtc'; - -const webrtcPool = await replicateWebRTC({ - collection: db.tasks, - topic: 'p2p-topic-123', - connectionHandlerCreator: getConnectionHandlerSimplePeer({ - signalingServerUrl: 'wss://signaling.rxdb.info/', - wrtc: require('node-datachannel/polyfill'), - webSocketConstructor: require('ws').WebSocket - }) -}); - -webrtcPool.error$.subscribe((error) => { - console.error('P2P error:', error); -}); -``` - -Here, any client that joins the same topic communicates changes to other peers, all without requiring a traditional client-server model. - -## Quick Steps to Get Started - -1. Install RxDB -```bash -npm install rxdb rxjs -``` - -2. Create a Local Database -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -const db = await createRxDatabase({ - name: 'myLocalDB', - storage: getRxStorageLocalstorage() -}); -Add a Collection -ts -Kopieren -await db.addCollections({ - notes: { - schema: { - title: 'notes schema', - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { type: 'string', maxLenght: 100 }, - content: { type: 'string' } - } - } - } -}); -``` - -3. Synchronize - -Use one of the [Replication Plugins](../replication.md) to connect with your preferred backend. - -### Is RxDB the Right Solution for You? - -- **Long Offline Use**: If your users need to work without an internet connection, RxDB's built-in offline-first design stands out compared to Firebase Realtime Database's partial offline approach. -- **Custom or Complex Queries**: RxDB lets you perform your [queries](../rx-query.md) locally, define [indexing](../rx-schema.md#indexes), and handle even complex [transformations](../rx-pipeline.md) locally - no extra call to an external API. -- **Avoid Vendor Lock-In**: If you anticipate needing to move or adapt your backend later, you can do so without rewriting how your client manages its data. -- **Peer-to-Peer Collaboration**: Whether you need quick demos or real production use, [WebRTC replication](../replication-webrtc.md) can link your users directly without central coordination of data storage. - ---- - -## RxDB - Firestore Alternative to Sync with Your Own Backend - -# RxDB - The Firestore Alternative That Can Sync with Your Own Backend - -If you're seeking a **Firestore alternative**, you're likely looking for a way to: -- **Avoid vendor lock-in** while still enjoying real-time replication. -- **Reduce cloud usage costs** by reading data locally instead of constantly fetching from the server. -- **Customize** how you store, query, and secure your data. -- **Implement advanced conflict resolution** strategies beyond Firestore's last-write-wins approach. - -Enter **RxDB** (Reactive Database) - a [local-first](./local-first-future.md), NoSQL database for JavaScript applications that can sync in real time with **any** backend of your choice. Whether you're tired of the limitations and fees associated with Firebase Cloud Firestore or simply need more flexibility, RxDB might be the Firestore alternative you've been searching for. - -
    - - - -
    - -## What Makes RxDB a Great Firestore Alternative? - -Firestore is convenient for many projects, but it does lock you into Google's ecosystem. Below are some of the key advantages you gain by choosing RxDB: - -### 1. Fully Offline-First -RxDB runs directly in your client application ([browser](./browser-database.md), [Node.js](../nodejs-database.md), [Electron](../electron-database.md), [React Native](../react-native-database.md), etc.). Data is stored locally, so your application **remains fully functional even when offline**. When the device returns online, RxDB's flexible replication protocol synchronizes your local changes with any remote endpoint. - -### 2. Freedom to Use Any Backend -Unlike Firestore, RxDB doesn't require a proprietary hosting service. You can: -- Host your data on your own server (Node.js, Go, Python, etc.). -- Use existing databases like [PostgreSQL](../replication-http.md), [CouchDB](../replication-couchdb.md), or [MongoDB with custom endpoints](../replication.md). -- Implement a [custom GraphQL](../replication-graphql.md) or [REST-based](../replication-http.md) API for syncing. - -This **backend-agnostic** approach protects you from vendor lock-in. Your application's client-side data storage remains consistent; only your replication logic (or plugin) changes if you switch servers. - -### 3. Advanced Conflict Resolution -Firestore enforces a [last-write-wins](https://stackoverflow.com/a/47781502/3443137) conflict resolution strategy. This might cause issues if multiple users or devices update the same data in complex ways. - -RxDB lets you: -- Implement **custom conflict resolution** via [revisions](../transactions-conflicts-revisions.md#custom-conflict-handler). -- Store partial merges, track versions, or preserve multiple user edits. -- Fine-tune how your data merges to ensure consistency across distributed systems. - -### 4. Reduced Cloud Costs -Firestore queries often count as billable reads. With RxDB, queries run **locally** against your local state - no repeated network calls or extra charges. You pay only for the data actually synced, not every read. For **read-heavy** apps, using RxDB as a Firestore alternative can significantly reduce costs. - -### 5. No Limits on Query Features -Firestore's query engine is limited by certain constraints (e.g., no advanced joins, limited indexing). With RxDB: -- **NoSQL** data is stored locally, and you can define any indexes you need. -- Perform [complex queries](../rx-query.md), run [full-text search](../fulltext-search.md), or do aggregated transformations or even [vector search](./javascript-vector-database.md). -- Use [RxDB's reactivity](../rx-query.md#observe) to subscribe to query results in real time. - -### 6. True Offline-Start Support -While Firestore does have offline caching, it often requires an online check at app initialization for authentication. RxDB is [truly offline-first](../offline-first.md); you can launch the app and write data even if the device never goes online initially. It's ready whenever the user is. - -### 7. Cross-Platform: Any JavaScript Runtime -RxDB is designed to run in **any environment** that can execute JavaScript. Whether you’re building a web app in the browser, an [Electron](../electron-database.md) desktop application, a [React Native](../react-native-database.md) mobile app, or a command-line tool with [Node.js](../nodejs-database.md), RxDB’s storage layer is swappable to fit your runtime’s capabilities. -- In the **browser**, store data in [IndexedDB](../rx-storage-indexeddb.md) or [OPFS](../rx-storage-opfs.md). -- In [Node.js](../nodejs-database.md), use LevelDB or other supported storages. -- In [React Native](../react-native-database.md), pick from a range of adapters suited for mobile devices. -- In [Electron](../electron-database.md), rely on fast local storage with zero changes to your application code. - ---- - -## How Does RxDB's Sync Work? - -RxDB replication is powered by its own [Sync Engine](../replication.md). This simple yet robust protocol enables: -1. **Pull**: Fetch new or updated documents from the server. -2. **Push**: Send local changes back to the server. -3. **Live Real-Time**: Once you're caught up, you can opt for event-based streaming instead of continuous polling. - -Code Example: Sync RxDB with a Custom Backend - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -import { replicateRxCollection } from 'rxdb/plugins/replication'; - -async function initDB() { - const db = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage(), - multiInstance: true, - eventReduce: true - }); - - await db.addCollections({ - tasks: { - schema: { - title: 'task schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string', maxLength: 100 }, - title: { type: 'string' }, - done: { type: 'boolean' } - } - } - } - }); - - // Start a custom REST-based replication - replicateRxCollection({ - collection: db.tasks, - replicationIdentifier: 'my-tasks-rest-api', - push: { - handler: async (documents) => { - // Send docs to your REST endpoint - const res = await fetch('https://myapi.com/push', { - method: 'POST', - body: JSON.stringify({ docs: documents }) - }); - // Return conflicts if any - return await res.json(); - } - }, - pull: { - handler: async (lastCheckpoint, batchSize) => { - // Fetch from your REST endpoint - const res = await fetch(`https://myapi.com/pull?checkpoint=${JSON.stringify(lastCheckpoint)}&limit=${batchSize}`); - return await res.json(); - } - }, - live: true // keep watching for changes - }); - - return db; -} -``` - -By swapping out the handler implementations or using an official plugin (e.g., [GraphQL](../replication-graphql.md), [CouchDB](../replication-couchdb.md), [Firestore replication](../replication-firestore.md), etc.), you can adapt to any backend or data source. RxDB thus becomes a flexible alternative to Firestore while maintaining [real-time capabilities](./realtime-database.md). - -## Getting Started with RxDB as a Firestore Alternative - -### Install RxDB: -```bash -npm install rxdb rxjs -``` - -### Create a Database: -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -const db = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage() -}); -``` - -### Define Collections: -```ts -await db.addCollections({ - items: { - schema: { - title: 'items schema', - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { type: 'string', maxLength: 100 }, - text: { type: 'string' } - } - } - } -}); -``` - -### Sync -Use a [Replication Plugin](../replication.md) to connect with a custom backend or existing database. - -For a Firestore-specific approach, RxDB [Firestore Replication](../replication-firestore.md) also exists if you want to combine local indexing and advanced queries with a Cloud Firestore backend. But if you really want to replace Firestore entirely - just point RxDB to your new backend. - -### Example: Start a WebRTC P2P Replication - -In addition to syncing with a central server, RxDB also supports pure peer-to-peer replication using [WebRTC](../replication-webrtc.md). This can be invaluable for scenarios where clients need to sync data directly without a master server. - -```ts -import { - replicateWebRTC, - getConnectionHandlerSimplePeer -} from 'rxdb/plugins/replication-webrtc'; - -const replicationPool = await replicateWebRTC({ - collection: db.tasks, - topic: 'my-p2p-room', // Clients with the same topic will sync with each other. - connectionHandlerCreator: getConnectionHandlerSimplePeer({ - // Use your own or the official RxDB signaling server - signalingServerUrl: 'wss://signaling.rxdb.info/', - - // Node.js requires a polyfill for WebRTC & WebSocket - wrtc: require('node-datachannel/polyfill'), - webSocketConstructor: require('ws').WebSocket - }), - pull: {}, // optional pull config - push: {} // optional push config -}); - -// The replicationPool manages all connected peers -replicationPool.error$.subscribe(err => { - console.error('P2P Sync Error:', err); -}); -``` - -This example sets up a live **P2P replication** where any new peers joining the same topic automatically sync local data with each other, eliminating the need for a dedicated central server for the actual data exchange. - -## Is RxDB Right for Your Project? - -- **You want offline-first**: If you need an offline-first app that starts offline, RxDB's local database approach and sync protocol excel at this. -- **Your project is read-heavy**: Reading from Firestore for every query can get expensive. With RxDB, reads are free and local; you only pay for writes or sync overhead. -- **You need advanced queries**: Firestore's query constraints may not suit complex data. With RxDB, you can define your own indexing logic or run arbitrary queries locally. -- **You want no vendor lock-in**: Easily transition from Firestore to your own server or another vendor - just change the replication layer. - -## Follow Up - -If you've been searching for a Firestore alternative that gives you the freedom to sync your data with any backend, offers robust offline-first capabilities, and supports truly customizable conflict resolution and queries, RxDB is worth exploring. You can adopt it seamlessly, ensure local reads, reduce costs, and stay in complete control of your data layer. - -Ready to dive in? Check out the RxDB Quickstart Guide, join our Discord community, and experience how RxDB can be the perfect local-first, real-time database solution for your next project. - -More resources: -- [RxDB Sync Engine](../replication.md) -- [Firestore Replication Plugin](../replication-firestore.md) -- [Custom Conflict Resolution](../transactions-conflicts-revisions.md) -- [RxDB GitHub Repository](/code/) - ---- - -## Supercharge Flutter Apps with the RxDB Database - -# RxDB as a Database in a Flutter Application - -In the world of mobile application development, Flutter has gained significant popularity due to its cross-platform capabilities and rich UI framework. When it comes to building feature-rich Flutter applications, the choice of a robust and efficient database is crucial. In this article, we will explore [RxDB](https://rxdb.info/) as a database solution for Flutter applications. We'll delve into the core features of RxDB, its benefits over other database options, and how to integrate it into a Flutter app. - -:::note -You can find the source code for an example RxDB Flutter Application [at the github repo](https://github.com/pubkey/rxdb/tree/master/examples/flutter) -::: - -
    - - - -
    - -### Overview of Flutter Mobile Applications -Flutter is an open-source UI software development kit created by Google that allows developers to build high-performance [mobile](./mobile-database.md) applications for iOS and Android platforms using a single codebase. Flutter's framework provides a wide range of widgets and tools that enable developers to create visually appealing and responsive applications. - -
    - -
    - -### Importance of Databases in Flutter Applications -Databases play a vital role in Flutter applications by providing a persistent and reliable storage solution for storing and retrieving data. Whether it's user profiles, app settings, or complex data structures, a database helps in efficiently managing and organizing the application's data. Choosing the right database for a Flutter application can significantly impact the performance, scalability, and user experience of the app. - -### Introducing RxDB as a Database Solution -RxDB is a powerful NoSQL database solution that is designed to work seamlessly with JavaScript-based frameworks, such as Flutter. It stands for Reactive Database and offers a variety of features that make it an excellent choice for building Flutter applications. RxDB combines the simplicity of JavaScript's document-based database model with the reactive programming paradigm, enabling developers to build real-time and offline-first applications with ease. - -## Getting Started with RxDB -To understand how RxDB can be utilized in a Flutter application, let's explore its core features and advantages. - -### What is RxDB? -[RxDB](https://rxdb.info/) is a client-side database built on top of [IndexedDB](../rx-storage-indexeddb.md), which is a low-level [browser-based database](./browser-database.md) API. It provides a simple and intuitive API for performing CRUD operations (Create, Read, Update, Delete) on documents. RxDB's underlying architecture allows for efficient handling of data synchronization between multiple clients and servers. - -
    - - - -
    - -### Reactive Data Handling -One of the key strengths of RxDB is its reactive data handling. It leverages the power of Observables, a concept from reactive programming, to automatically update the UI in response to data changes. With RxDB, developers can define queries and subscribe to their results, ensuring that the UI is always in sync with the database. - -### Offline-First Approach -RxDB follows an offline-first approach, making it ideal for building Flutter applications that need to function even without an internet connection. It allows data to be stored locally and seamlessly synchronizes it with the server when a connection is available. This ensures that users can access and interact with their data regardless of network availability. - -### Data Replication -Data replication is a critical aspect of building distributed applications. RxDB provides robust replication capabilities that enable synchronization of data between different clients and servers. With its replication plugins, RxDB simplifies the process of setting up real-time data synchronization, ensuring consistency across all connected devices. - -### Observable Queries -RxDB introduces the concept of observable queries, which are queries that automatically update when the underlying data changes. This feature is particularly useful for keeping the UI up to date with the latest data. By subscribing to an observable query, developers can receive real-time updates and reflect them in the user interface without manual intervention. - -### RxDB vs. Other Flutter Database Options -When considering database options for Flutter applications, developers often come across alternatives such as SQLite or LokiJS. While these databases have their merits, RxDB offers several advantages over them. RxDB's seamless integration with Flutter, its offline-first approach, reactive data handling, and built-in data replication make it a compelling choice for building feature-rich and scalable Flutter applications. - -## Using RxDB in a Flutter Application -Now that we understand the core features of RxDB, let's explore how to integrate it into a Flutter application. - -## How RxDB can run in Flutter - -RxDB is written in TypeScript and compiled to JavaScript. To run it in a Flutter application, the `flutter_qjs` library is used to spawn a QuickJS JavaScript runtime. RxDB itself runs in that runtime and communicates with the flutter dart runtime. To store data persistent, the [LokiJS RxStorage](../rx-storage-lokijs.md) is used together with a custom storage adapter that persists the database inside of the `shared_preferences` data. - -To use RxDB, you have to create a compatible JavaScript file that creates your RxDatabase and starts some connectors which are used by Flutter to communicate with the JavaScript RxDB database via setFlutterRxDatabaseConnector(). - -```javascript -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageLoki -} from 'rxdb/plugins/storage-lokijs'; -import { - setFlutterRxDatabaseConnector, - getLokijsAdapterFlutter -} from 'rxdb/plugins/flutter'; - -// do all database creation stuff in this method. -async function createDB(databaseName) { - // create the RxDatabase - const db = await createRxDatabase({ - // the database.name is variable so we can change it on the flutter side - name: databaseName, - storage: getRxStorageLoki({ - adapter: getLokijsAdapterFlutter() - }), - multiInstance: false - }); - await db.addCollections({ - heroes: { - schema: { - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 - }, - name: { - type: 'string', - maxLength: 100 - }, - color: { - type: 'string', - maxLength: 30 - } - }, - indexes: ['name'], - required: ['id', 'name', 'color'] - } - } - }); - return db; -} - -// start the connector so that flutter can communicate with the JavaScript process -setFlutterRxDatabaseConnector( - createDB -); -``` - -Before you can use the JavaScript code, you have to bundle it into a single .js file. In this example we do that with webpack in a npm script here which bundles everything into the `javascript/dist/index.js` file. - -To allow Flutter to access that file during runtime, add it to the assets inside of your pubspec.yaml: - -```yaml -flutter: - assets: - - javascript/dist/index.js -``` - -Also you need to install RxDB in your flutter part of the application. First you have to use the rxdb dart package as a flutter dependency. Currently the package is not published at the dart pub.dev. Instead you have to install it from the local filesystem inside of your RxDB npm installation. - -```yaml -# inside of pubspec.yaml -dependencies: - rxdb: - path: path/to/your/node_modules/rxdb/src/plugins/flutter/dart -``` - -Afterwards you can import the rxdb library in your dart code and connect to the JavaScript process from there. For reference, check out the lib/main.dart file. - -```dart -import 'package:rxdb/rxdb.dart'; - -// start the javascript process and connect to the database -RxDatabase database = await getRxDatabase("javascript/dist/index.js", databaseName); - -// get a collection -RxCollection collection = database.getCollection('heroes'); - -// insert a document -RxDocument document = await collection.insert({ - "id": "zflutter-${DateTime.now()}", - "name": nameController.text, - "color": colorController.text -}); - -// create a query -RxQuery query = RxDatabaseState.collection.find(); - -// create list to store query results -List> documents = []; - -// subscribe to a query -query.$().listen((results) { - setState(() { - documents = results; - }); -}); -``` - -### Different RxStorage layers for RxDB -RxDB offers multiple storage options, known as RxStorage layers, to store data locally. These options include: - -- [LokiJS RxStorage](../rx-storage-lokijs.md): LokiJS is an in-memory database that can be used as a [storage](./browser-storage.md) layer for RxDB. It provides fast and efficient in-memory data management capabilities. -- [SQLite RxStorage](../rx-storage-sqlite.md): SQLite is a popular and widely used [embedded database](./embedded-database.md) that offers robust storage capabilities. RxDB utilizes SQLite as a storage layer to persist data on the device. -- [Memory RxStorage](../rx-storage-memory.md): As the name suggests, Memory RxStorage stores data [in memory](./in-memory-nosql-database.md). While this option does not provide persistence, it can be useful for temporary or cache-based data storage. -By choosing the appropriate RxStorage layer based on the specific requirements of the application, developers can optimize performance and storage efficiency. - -## Synchronizing Data with RxDB between Clients and Servers -One of the key strengths of RxDB is its ability to synchronize data between multiple clients and servers seamlessly. Let's explore how this synchronization can be achieved. - -### Offline-First Approach -RxDB's offline-first approach ensures that data can be accessed and modified even when there is no internet connection. Changes made offline are automatically synchronized with the server once a connection is reestablished. This ensures data consistency across all devices, providing a seamless user experience. - -### RxDB Replication Plugins -RxDB provides replication plugins that simplify the process of setting up data [synchronization between clients and servers](../replication.md). These plugins offer various synchronization strategies, such as one-way replication, two-way replication, and conflict resolution mechanisms. By configuring the appropriate replication plugin, developers can easily establish real-time data synchronization in their Flutter applications. - -## Advanced RxDB Features and Techniques -RxDB offers a range of advanced features and techniques that enhance its functionality and performance. Let's explore a few of these features: - -### Indexing and Performance Optimization -Indexing is a technique used to optimize query performance by creating indexes on specific fields. RxDB allows developers to define indexes on document fields, improving the efficiency of queries and data retrieval. - -### Encryption of Local Data -To ensure data privacy and security, RxDB supports [encryption of local data](../encryption.md). By encrypting the data stored on the device, developers can protect sensitive information and prevent unauthorized access. - -### Change Streams and Event Handling -RxDB provides change streams, which emit events whenever data changes occur. By leveraging change streams, developers can implement custom event handling logic, such as updating the UI or triggering background processes, in response to specific data changes. - -### JSON Key Compression -To minimize storage requirements and optimize performance, RxDB offers [JSON key compression](../key-compression.md). This feature reduces the size of keys used in the database, resulting in more efficient storage and improved query performance. - -## Conclusion -RxDB offers a powerful and flexible database solution for Flutter applications. With its offline-first approach, real-time data synchronization, and reactive data handling capabilities, RxDB simplifies the development of feature-rich and scalable Flutter applications. By integrating RxDB into your Flutter projects, you can leverage its advanced features and techniques to build responsive and data-driven applications that provide an exceptional user experience. - -:::note -You can find the source code for an example RxDB Flutter Application [at the github repo](https://github.com/pubkey/rxdb/tree/master/examples/flutter) -::: - ---- - -## RxDB - The Ultimate JS Frontend Database - -# RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications -In modern web development, managing data on the front end has become increasingly important. Storing data in the frontend offers numerous advantages, such as offline accessibility, caching, faster application startup, and improved state management. Traditional SQL databases, although widely used on the server-side, are not always the best fit for frontend applications. This is where [RxDB](https://rxdb.info/), a frontend JavaScript database, emerges as a powerful solution. In this article, we will explore why storing data in the frontend is beneficial, the limitations of SQL databases in the frontend, and how [RxDB](https://rxdb.info/) addresses these challenges to become an excellent choice for frontend data storage. - -
    - - - -
    - -## Why you might want to store data in the frontend - -### Offline accessibility -One compelling reason to store data in the frontend is to enable [offline accessibility](../offline-first.md). By leveraging a frontend database, applications can cache essential data locally, allowing users to continue using the application even when an internet connection is unavailable. This feature is particularly useful for [mobile](./mobile-database.md) applications or web apps with limited or intermittent connectivity. - -### Caching -Frontend databases also serve as efficient caching mechanisms. By storing frequently accessed data locally, applications can minimize network requests and reduce latency, resulting in faster and more responsive user experiences. Caching is particularly beneficial for applications that heavily rely on remote data or perform computationally intensive operations. - -### Decreased initial application start time -Storing data in the frontend decreases the initial application start time because the data is already present locally. By eliminating the need to fetch data from a server during startup, applications can quickly render the UI and provide users with an immediate interactive experience. This is especially advantageous for applications with large datasets or complex data retrieval processes. - -### Password encryption for local data -Security is a crucial aspect of data storage. With a front end database, developers can [encrypt](../encryption.md) sensitive local data, such as user credentials or personal information, using encryption algorithms. This ensures that even if the device is compromised, the data remains securely stored and protected. - -### Local database for state management -Frontend databases provide an alternative to traditional state management libraries like Redux or NgRx. By utilizing a local database, developers can store and manage application state directly in the frontend, eliminating the need for additional libraries. This approach simplifies the codebase, reduces complexity, and provides a more straightforward data flow within the application. - -### Low-latency local queries -Frontend databases enable low-latency queries that run entirely on the client's device. Instead of relying on server round-trips for each query, the database executes queries locally, resulting in faster response times. This is particularly beneficial for applications that require real-time updates or frequent data retrieval. - - - -### Building realtime applications with local data -Realtime applications often require immediate updates based on data changes. By storing data locally and utilizing a frontend database, developers can build [realtime applications](./realtime-database.md) more easily. The database can observe data changes and automatically update the UI, providing a seamless and responsive user experience. - -### Easier integration with JavaScript frameworks -Frontend databases, including RxDB, are designed to integrate seamlessly with popular JavaScript frameworks such as [Angular](./angular-database.md), [React.js](./react-database.md), [Vue.js](./vue-database.md), and Svelte. These databases offer well-defined APIs and support that align with the specific requirements of these frameworks, enabling developers to leverage the full potential of the frontend database within their preferred development environment. - -### Simplified replication of database state -Replicating database state between the frontend and backend can be challenging, especially when dealing with complex REST routes. Frontend databases, however, provide simple mechanisms for replicating database state. They offer intuitive replication algorithms that facilitate data synchronization between the frontend and backend, reducing the complexity and potential pitfalls associated with complex REST-based replication. - -### Improved scalability -Frontend databases offer improved scalability compared to traditional SQL databases. By leveraging the computational capabilities of client devices, the burden on server resources is reduced. Queries and operations are performed locally, minimizing the need for server round-trips and enabling applications to scale more efficiently. - -## Why SQL databases are not a good fit for the front end of an application -While SQL databases excel in server-side scenarios, they pose limitations when used on the frontend. Here are some reasons why SQL databases are not well-suited for frontend applications: - -### Push/Pull based vs. reactive -SQL databases typically rely on a push/pull model, where the server pushes data to the client upon request. This approach is not inherently reactive, as it requires explicit requests for data updates. In contrast, frontend applications often require reactive data flows, where changes in data trigger automatic updates in the UI. Frontend databases, like [RxDB](https://rxdb.info/), provide reactive capabilities that seamlessly integrate with the dynamic nature of frontend development. - -### Initialization time and performance -SQL databases designed for server-side usage tend to have larger build sizes and initialization times, making them less efficient for [browser-based](./browser-database.md) applications. Frontend databases, on the other hand, directly leverage browser APIs like [IndexedDB](../rx-storage-indexeddb.md), [OPFS](../rx-storage-opfs.md), and [WebWorker](../rx-storage-worker.md), resulting in leaner builds and faster initialization times. Often the queries are such fast, that it is not even necessary to implement a loading spinner. - - - -### Build size considerations -Server-side SQL databases typically come with a significant build size, which can be impractical for browser applications where code size optimization is crucial. Frontend databases, on the other hand, are specifically designed to operate within the constraints of browser environments, ensuring efficient resource utilization and smaller build sizes. - -For example the SQLite Webassembly file alone has a size of over 0.8 Megabyte with an additional 0.2 Megabyte in JavaScript code for connection. - -## Why RxDB is a good fit for the frontend -RxDB is a powerful frontend JavaScript database that addresses the limitations of SQL databases and provides an optimal solution for frontend [data storage](./browser-storage.md). Let's explore why RxDB is an excellent fit for frontend applications: - -### Made in JavaScript, optimized for JavaScript applications -RxDB is designed and optimized for JavaScript applications. Built using JavaScript itself, RxDB offers seamless integration with JavaScript frameworks and libraries, allowing developers to leverage their existing JavaScript knowledge and skills. - -### NoSQL (JSON) documents for UIs -RxDB adopts a [NoSQL approach](./in-memory-nosql-database.md), using [JSON documents as its primary data structure](./json-database.md). This aligns well with the JavaScript ecosystem, as JavaScript natively works with JSON objects. By using NoSQL documents, RxDB provides a more natural and intuitive data model for UI-centric applications. - - - -### Better TypeScript support compared to SQL -TypeScript has become increasingly popular for building frontend applications. RxDB provides excellent [TypeScript support](../tutorials/typescript.md), allowing developers to leverage static typing and benefit from enhanced code quality and tooling. This is particularly advantageous when compared to SQL databases, which often have limited TypeScript support. - -### Observable Queries for automatic UI updates -RxDB introduces the concept of observable queries, powered by RxJS. Observable queries automatically update the UI whenever there are changes in the underlying data. This reactive approach eliminates the need for manual UI updates and ensures that the frontend remains synchronized with the database state. - - - -### Optimized observed queries with the EventReduce Algorithm -RxDB optimizes observed queries with its EventReduce Algorithm. This algorithm intelligently reduces redundant events and ensures that UI updates are performed efficiently. By minimizing unnecessary re-renders, RxDB significantly improves performance and responsiveness in frontend applications. - -```typescript -const query = myCollection.find({ - selector: { - age: { - $gt: 21 - } - } -}); -const querySub = query.$.subscribe(results => { - console.log('got results: ' + results.length); -}); -``` - -### Observable document fields -RxDB supports observable document fields, enabling developers to track changes at a granular level within documents. By observing specific fields, developers can reactively update the UI when those fields change, ensuring a responsive and synchronized frontend interface. - -```typescript -myDocument.firstName$.subscribe(newName => console.log('name is: ' + newName)); -``` - -### Storing Documents Compressed -RxDB provides the option to store documents in a [compressed format](../key-compression.md), reducing storage requirements and improving overall database performance. Compressed storage offers benefits such as reduced disk space usage, faster data read/write operations, and improved network transfer speeds, making it an essential feature for efficient frontend data storage. - -### Built-in Multi-tab support -RxDB offers built-in multi-tab support, allowing data synchronization and state management across multiple browser tabs. This feature ensures consistent data access and synchronization, enabling users to work seamlessly across different tabs without conflicts or data inconsistencies. - - - -### Replication Algorithm can be made compatible with any backend -RxDB's [realtime replication algorithm](../replication.md) is designed to be flexible and compatible with various backend systems. Whether you're using your own servers, [Firebase](../replication-firestore.md), [CouchDB](../replication-couchdb.md), [NATS](../replication-nats.md), [WebSocket](../replication-websocket.md), or any other backend, RxDB can be seamlessly integrated and synchronized with the backend system of your choice. - - - -### Flexible storage layer for code reuse -RxDB provides a [flexible storage layer](../rx-storage.md) that enables code reuse across different platforms. Whether you're building applications with [Electron.js](../electron-database.md), [React Native](../react-native-database.md), hybrid apps using [Capacitor.js](../capacitor-database.md), or traditional web browsers, RxDB allows you to reuse the same codebase and leverage the power of a frontend database across different environments. - -### Handling schema changes in distributed environments -In distributed environments where data is stored on multiple client devices, handling schema changes can be challenging. RxDB tackles this challenge by providing robust mechanisms for [handling schema changes](../migration-schema.md). It ensures that schema updates propagate smoothly across devices, maintaining data integrity and enabling seamless schema evolution. - -## Follow Up -To further explore RxDB and get started with using it in your frontend applications, consider the following resources: - -- [RxDB Quickstart](../quickstart.md): A step-by-step guide to quickly set up RxDB in your project and start leveraging its features. -- [RxDB GitHub Repository](https://github.com/pubkey/rxdb): The official repository for RxDB, where you can find the code, examples, and community support. - -By adopting [RxDB](https://rxdb.info/) as your frontend database, you can unlock the full potential of frontend data storage and empower your applications with offline accessibility, caching, improved performance, and seamless data synchronization. RxDB's JavaScript-centric approach and powerful features make it an ideal choice for frontend developers seeking efficient and scalable data storage solutions. - ---- - -## ideas for articles - - -- storing and searching through 1mio emails in a browser database -- Finding the optimal way to shorten vector embeddings -- Performance and quality of vector comparison functions (euclideanDistance etc) -- performance and quality of vector indexing methods -- What is new in IndexedDB 3.0 -- how progressive syncing beats client-server architecture - -## Seo keywords: - -X- "optimistic ui" -X- "local database" (rddt done) -X- "react-native encryption" -X- "vue database" (rddt done) -X- "jquery database" -X- "vue indexeddb" -X- "firebase realtime database alternative" (rddt done) -X- "firestore alternative" (rddt done) -X- "ionic storage" (rddt done) -X- "local database" -X- "offline database" -X- "zero local first" -X- "webrtc p2p" - 390 http://localhost:3000/replication-webrtc.html - -X- "indexeddb storage limit" - 590 https://rxdb.info/articles/indexeddb-max-storage-limit.html -X- "indexeddb size limit" - 260 https://rxdb.info/articles/indexeddb-max-storage-limit.html -X- "indexeddb max size" - 590 https://rxdb.info/articles/indexeddb-max-storage-limit.html -X- "indexeddb limits" - 170 https://rxdb.info/articles/indexeddb-max-storage-limit.html - -X- "json based database" -X- "json vs database" -X- "reactjs storage" - -## Seo - -- "supabase alternative" -- "store local storage" -- "react localstorage" -- "react-native storage" -- "supabase offline" - 260 -- "store array in localstorage", "localStorage array of objects" -- "real time web apps" - 170 -- "reactive database" - 210 -- "electron sqlite" -- "in browser database" - 90 -- "offline first app" - 260 -- "react native sql" - 110 -- "sqlite electron" -- "localstorage vs indexeddb" -- "react native nosql database" - 30 -- "indexeddb library" - 260 -- "indexeddb encryption" - 90 -- "client side database" - 140 -- "webtransport vs websocket" -- "local first development" - 210 -- "local storage examples" -- "local vector database" - 590 -- "mobile app database" - 590 -- "web based database" -- "livequery" - 210 -- "expo database" - 390 -- "database sync" - 8100 -- "p2p database" - 170 -- "reactive app" - 260 -- "offline web app" - 320 -- "offline sync" - 320 -- "react native encrypted storage" - 1000 -- "firestore vs firebase" - 1300 -- "ionic alternatives" - 480 -- "react native backend" - 720 -- "react native alternative" - 1000 -- "react native sqlite" - 1900 -- "flutter vs react native" - 5400 -- "react native redux" - 3600 -- "redux alternative" - 1300 -- "Awesome local first" - 10 -- "tauri database" - 170 - -- "sqlite javascript" - 2900 -- "sqlite typescript" - 260 - -- "sync engine" - 390 -- "indexeddb alternative" - 70 - -## Non Seo - -- "Local-First Partial Sync with RxDB" -- "why the indexeddb API is almost perfekt" -- "how to do auth with RxDB" -- "Where to store that JWT token?" - ---- - -## RxDB In-Memory NoSQL - Supercharge Real-Time Apps - -# RxDB as In-memory NoSQL Database: Empowering Real-Time Applications - -Real-time applications have become increasingly popular in today's digital landscape. From instant messaging to collaborative editing tools, the demand for responsive and interactive software is on the rise. To meet these requirements, developers need powerful and efficient database solutions that can handle large amounts of data in real-time. [RxDB](https://rxdb.info/), an javascript NoSQL database, is revolutionizing the way developers build and scale their applications by offering exceptional speed, flexibility, and scalability. - -
    - - - -
    - -## Speed and Performance Benefits -One of the key advantages of using RxDB as an in-memory NoSQL database is its ability to leverage in-memory storage for faster database operations. By storing data directly in memory, database operations can be performed significantly faster compared to traditional disk-based databases. This is especially important for real-time applications where every millisecond counts. With RxDB, developers can achieve near-instantaneous data access and manipulation, enabling highly responsive user experiences. - -Additionally, RxDB eliminates disk I/O bottlenecks that are typically associated with traditional databases. In traditional databases, disk reads and writes can become a bottleneck as the amount of data grows. In contrast, an in-memory database like RxDB keeps the entire dataset in RAM, eliminating disk access overhead. This makes it an excellent choice for applications dealing with real-time analytics, high-throughput data processing, and caching. - -## Persistence Options -While RxDB offers an [in-memory](../rx-storage-memory.md) storage adapter, it also offers [persistence storages](../rx-storage.md). Adapters such as [IndexedDB](../rx-storage-indexeddb.md), [SQLite](../rx-storage-sqlite.md), and [OPFS](../rx-storage-opfs.md) enable developers to persist data locally in the browser, making applications accessible even when offline. This hybrid approach combines the benefits of in-memory performance with data durability, providing the best of both worlds. Developers can choose the adapter that best suits their needs, balancing the speed of in-memory storage with the long-term data persistence required for certain applications. - -```javascript -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageMemory -} from 'rxdb/plugins/storage-memory'; - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageMemory() -}); -``` - -Also the [memory mapped RxStorage](../rx-storage-memory-mapped.md) exists as a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance is replicated with the underlying storage for persistence. The main reason to use this is to improve initial page load and query/write times. This is mostly useful in browser based applications. - -## Use Cases for RxDB -RxDB's capabilities make it well-suited for various real-time applications. Some notable use cases include: - -- Chat Applications and Real-Time Messaging: RxDB's in-memory performance and real-time synchronization capabilities make it an excellent choice for building chat applications and real-time messaging systems. Developers can ensure that messages are delivered and synchronized across multiple clients in real-time, providing a seamless and responsive chat experience. - -- Collaborative Document Editors: RxDB's ability to handle data streams and propagate changes in real-time makes it ideal for collaborative document editing. Multiple users can simultaneously edit a document, and their changes are instantly synchronized, allowing for real-time collaboration and ensuring that everyone has the most up-to-date version of the document. - -- Real-Time Analytics Dashboards: RxDB's speed and scalability make it a valuable tool for real-time analytics dashboards. It can handle high volumes of data and perform complex analytics operations in real-time, providing instant insights and visualizations to users. - -In conclusion, RxDB serves as a powerful in-memory NoSQL database that empowers developers to build real-time applications with exceptional speed, flexibility, and scalability. Its ability to leverage in-memory storage, eliminate disk I/O bottlenecks, and provide persistence options make it an attractive choice for a wide range of real-time use cases. Whether it's chat applications, collaborative document editors, or real-time analytics dashboards, RxDB provides the foundation for building responsive and interactive software that meets the demands of today's users. - ---- - -## IndexedDB Max Storage Size Limit - Detailed Best Practices - - - -import {VideoBox} from '@site/src/components/video-box'; - -# IndexedDB Max Storage Size Limit - -IndexedDB is widely known as the primary browser-based storage API for large client-side data, particularly valuable for modern offline-first applications. These apps aim to keep everything functional and interactive even without an internet connection, which naturally demands substantial local storage. However, IndexedDB has various size limits depending on the browser, disk space, and user settings. Being aware of these constraints is crucial so you can avoid quota errors and deliver a seamless user experience without unexpected data loss. - -Offline-first apps have grown in popularity because they provide immediate feedback, zero-latency interactions, and resilience in poor network conditions. Storing big data sets, or even entire data models, in IndexedDB has become far more common than in the era of small localStorage or cookie usage. But all this local data is subject to quotas, and that’s exactly what this guide will help you understand and manage. - -## Why IndexedDB Has a Storage Limit - -Browsers need a way to curb runaway disk usage and safeguard user resources. This is accomplished through **quota management** policies, which can vary among Chrome, Firefox, Safari, Edge, and others. Some browsers use a percentage of your total disk space, while others rely on a fixed maximum or dynamic approach per origin. These policies are designed to prevent malicious or poorly optimized web pages from consuming an unreasonable amount of user storage. - -Chrome (and Chromium-based browsers) typically allow you to use a percentage of the user’s free disk space, whereas Firefox historically prompts users to allow more than 5 MB in mobile or 50 MB in desktop. Safari often sets tighter maximum caps, especially on iOS devices. Edge aligns closely with Chrome’s rules but can also include enterprise or corporate policy overrides. Understanding these default or dynamic limits prepares you to plan your app’s storage needs appropriately. - -## Browser-Specific IndexedDB Limits - -IndexedDB size quotas differ significantly across browsers and platforms. While there isn’t a universal rule, the following table summarizes approximate limits and any notes or caveats you should be aware of: - -| Browser | Approx. Limit | Notes | -|----------------|---------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------| -| Chrome/Chromium | Up to ~80% of free disk, per origin cap | Often cited as 60 GB on a 100 GB drive. Shared pool approach. Quota usage can prompt partial or extended user approvals. | -| Firefox | ~2 GB (desktop) or ~5 MB initial for mobile | Older versions asked permission at 50 MB for desktop. Ephemeral/incognito sessions may require repeated user prompts. | -| Safari (iOS) | ~1 GB per origin (variable) | Historically stricter. iOS devices limit quotas further. Behavior can differ between iOS Safari versions or iPadOS. | -| Edge | Similar to Chrome’s 80% of free space | Can be influenced by Windows enterprise policies. Generally aligned with Chromium approach. | -| iOS Safari | Typically 1 GB, can be less on older iOS | Early iOS versions were known for more aggressive quotas and data eviction on low space. | -| Android Chrome | Similar to desktop Chrome | May exhibit warnings in especially low-storage devices. The same 80% free space logic generally applies. | - -Historically, these limits have evolved. For instance, older Firefox versions included `dom.indexedDB.warningQuota`, showing a 50 MB prompt on desktop or a 5 MB prompt on mobile—many developers wrote about these notifications on Stack Overflow. Since around 2015, Firefox has changed its quota approach significantly. Likewise, Safari used to limit data more aggressively on older iOS versions. Some older tutorials suggest comparing IndexedDB to localStorage, but modern browsers allow far larger and more flexible storage with IndexedDB than the old localStorage or cookie-based setups. - ---- - -## Checking Your Current IndexedDB Usage - -To assess where your app stands relative to these storage limits, you can use the **Storage Estimation API**. The snippet below shows how to estimate both your used storage and the total space allocated to your origin: - -```js -const quota = await navigator.storage.estimate(); -const totalSpace = quota.quota; -const usedSpace = quota.usage; -console.log('Approx total allocated space:', totalSpace); -console.log('Approx used space:', usedSpace); -``` - -[Some browsers (all modern ones)](https://developer.mozilla.org/en-US/docs/Web/API/StorageManager/persist#browser_compatibility) also provide a `navigator.storage.persist()` method to request persistent storage, preventing the browser from automatically clearing your data if the user’s device runs low on space. Note that users might deny such requests, or the request might fail silently on stricter environments. Always handle these outcomes gracefully and design your app to degrade if persistent storage is unavailable. - -## Testing Your App’s IndexedDB Quotas - -The best way to handle real-world usage is to test for low storage conditions and large data sets in different environments. You can fill up the space manually by writing repetitive test data or running scripts that bulk-insert documents until an error occurs. - -Real-time usage monitors or dashboards can keep track of your `navigator.storage.estimate()` results, letting you see how close you are to the max limit in production. Developer tools in Chrome or Firefox can simulate limited storage situations, which is crucial for QA: - -
    - -
    - -This short tutorial shows how you can artificially reduce available storage in Google Chrome’s dev tools to see how your app behaves when nearing or exceeding the quota. - -## Handling Errors When Limits Are Reached - -When the user’s device is too full or your app exceeds the allotted quota, most browsers will throw a **QuotaExceededError** (or similarly named exception) when trying to store additional data. Often, the request to IndexedDB simply fails with an error event. Handling this gracefully is essential to avoid crashes or data corruption. - -A typical approach is to wrap your write operations in try/catch blocks or in `onsuccess` / `onerror` event callbacks. If you detect a quota error, you can prompt the user to clear out old items or reduce the scope of offline data. Some apps implement a fallback system that removes less critical documents to free space and then retries the write. - -```js -try { - const tx = db.transaction('largeStore', 'readwrite'); - const store = tx.objectStore('largeStore'); - await store.add(hugeData, someKey); - await tx.done; -} catch (error) { - if (error.name === 'QuotaExceededError') { - console.warn('IndexedDB quota exceeded. Cleanup or prompt user to free space.'); - // Optionally remove older data or show a UI hint: - // removeOldDocuments(); - // displayStorageFullDialog(); - } else { - // handle other errors - console.error('IndexedDB write error:', error); - } -} -``` - -## Tricks to Exceed the Storage Size Limitation - -Even if you plan well, your app might need more storage than a single origin typically allows. There are a few advanced tactics you can use: - -If you store binary data such as images or videos, consider compressing them via the Compression Streams API. For textual or [JSON data](./json-based-database.md), a library like [RxDB](/) supports built-in [key-compression](../key-compression.md) to shorten field names or entire documents. This can be extremely helpful when storing large sets of objects: - -```ts -// Example: How key-compression can transform your documents internally -const uncompressed = { - "firstName": "Corrine", - "lastName": "Ziemann", - "shoppingCartItems": [ - { - "productNumber": 29857, - "amount": 1 - }, - { - "productNumber": 53409, - "amount": 6 - } - ] -}; -const compressed = { - "|e": "Corrine", - "|g": "Ziemann", - "|i": [ - { - "|h": 29857, - "|b": 1 - }, - { - "|h": 53409, - "|b": 6 - } - ] -}; -``` - -Sharding data across multiple subdomains or iframes is another trick, though it complicates communication. When you need truly massive offline data, you might store part of the data under `sub1.yoursite.com` and another chunk under `sub2.yoursite.com`, using `postMessage()` to coordinate. This can circumvent single-origin limitations, but it introduces extra complexity. Another effective method is to let data expire automatically—perhaps older records are removed if they haven’t been accessed for a certain period. - -
    - - - -
    - -## IndexedDB Max Size of a Single Object - -There is no explicit cap on how large an individual object or record in IndexedDB can be, other than the overall disk quota. If you attempt to store one extremely large object, you will eventually hit browser memory constraints or the global storage quota. In practice, you’ll encounter out-of-memory issues in JavaScript before IndexedDB itself refuses a single large write. A helpful test can be seen in [this JSFiddle experiment](https://jsfiddle.net/sdrqf8om/2/) where you see browsers can crash when creating massive in-memory objects. - -## Is There a Time Limit for Data Stored in IndexedDB? - -IndexedDB data can remain indefinitely as long as the user does not clear the browser’s data or the origin does not run afoul of automated eviction policies (e.g., Safari or Android might remove large caches for sites unused over a long period when space is needed). Typically, there is no “time limit,” but ephemeral modes or incognito sessions have their own rules. If you rely on permanent offline data, request persistent storage and handle the possibility that the user or the OS could still remove your data under extreme conditions. Especially Safari is known to be very fast in deleting local data. - - - -## Follow Up - -Learn more by checking the [IndexedDB official docs](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API), which detail store design, error handling, and quota usage. If you need a straightforward way to manage large offline data with compression and conflict resolution, explore the [RxDB Quickstart](../quickstart.md). You can also join the community on [GitHub](/code/) to share tips on overcoming the **IndexedDB max storage size limit** in production environments. - ---- - -## RxDB - The Perfect Ionic Database - -# Ionic Storage - RxDB as database for hybrid apps - -In the fast-paced world of mobile app development, **hybrid applications** have emerged as a versatile solution, offering the best of both worlds - the web and native app experiences. One key challenge these apps face is efficiently storing and querying data on the **client's device**. Enter [RxDB](https://rxdb.info/), a powerful client-side database tailored for ionic hybrid applications. In this article, we'll explore how RxDB addresses the requirements of storing and querying data in ionic apps, and why it stands out as a preferred choice. - -
    - - - -
    - -## What are Ionic Hybrid Apps? - -Ionic (aka Ionic 2 ) hybrid apps combine the strengths of web technologies (HTML, CSS, JavaScript) with native app development to deliver cross-platform applications. They are built using web technologies and then wrapped in a native container to be deployed on various platforms like iOS, Android, and the web. These apps provide a consistent user experience across devices while benefiting from the efficiency and familiarity of web development. - -## Storing and Querying Data in an Ionic App - -Storing and querying data is a fundamental aspect of any application, including hybrid apps. These apps often need to operate offline, store user-generated content, and provide responsive user interfaces. Therefore, having a reliable and efficient way to manage data on the client's device is crucial. - -## Introducing RxDB as a Client-Side Database for Ionic Apps -RxDB steps in as a powerful solution to address the data management needs of ionic hybrid apps. It's a NoSQL client-side database that offers exceptional performance and features tailored to the unique requirements of client-side applications. Let's delve into the key features of RxDB that make it a great fit for these apps. - -### Getting Started with RxDB - -
    - - - -
    - -### What is RxDB? - -At its core, [RxDB](https://rxdb.info/) is a **NoSQL** database that operates with a [local-first](../offline-first.md) approach. This means that your app's data is stored and processed primarily on the client's device, reducing the dependency on constant network connectivity. By doing so, RxDB ensures your app remains responsive and functional, even when offline. - -### Local-First Approach -The [local-first](../offline-first.md) approach adopted by RxDB is a game-changer for hybrid applications. Storing data locally allows your app to function seamlessly without an internet connection, providing users with uninterrupted access to their data. When connectivity is restored, RxDB handles the synchronization of data, ensuring that any changes made offline are appropriately propagated. - -### Observable Queries -One of RxDB's standout features is its implementation of observable queries. This concept allows your app's user interface to be dynamically updated in real time as data changes within the database. RxDB's observables create a bridge between your database and user interface, keeping them in sync effortlessly. - - - -### NoSQL Query Engine -RxDB's NoSQL query engine empowers you to perform powerful queries on your app's data, without the constraints imposed by traditional relational databases. This flexibility is particularly valuable when dealing with unstructured or semi-structured data. With the NoSQL query engine, you can retrieve, filter, and manipulate data according to your app's unique requirements. - -```ts -const foundDocuments = await myDatabase.todos.find({ - selector: { - done: { - $eq: false - } - } -}).exec(); -``` - -### Great Observe Performance with EventReduce -RxDB introduces a concept called [EventReduce](https://github.com/pubkey/event-reduce), which optimizes the observation process. Instead of overwhelming your app's UI with every data change, EventReduce filters and batches these changes to provide a smooth and efficient experience. This leads to enhanced app performance, lower resource usage, and ultimately, happier users. - -## Why NoSQL is a Better Fit for Client-Side Applications Compared to relational databases like SQLite -When it comes to choosing the right database solution for your client-side applications, NoSQL RxDB presents compelling advantages over traditional options like SQLite. Let's delve into the key reasons why NoSQL RxDB is a superior fit for your ionic hybrid app development. - -### Easier Document-Based Replication -NoSQL databases, like RxDB, inherently embrace a document-based approach to [data storage](./ionic-storage.md). This design choice simplifies data [replication](../replication.md) between clients and servers. With documents representing discrete units of data, you can easily synchronize individual pieces of information without the complexity that can arise when dealing with rows and tables in a relational database like SQLite. This document-centric replication model streamlines the synchronization process and ensures that your app's data remains consistent across devices. - -### Offline Capable -One of the defining features of client-side applications is the ability to function even when offline. NoSQL RxDB excels in this area by supporting a local-first approach. Data is cached on the client's device, enabling the app to remain fully functional even without an internet connection. As connectivity is restored, RxDB handles data synchronization with the server seamlessly. This offline capability ensures a smooth user experience, critical for ionic hybrid apps catering to users in various network conditions. - -### NoSQL Has Better TypeScript Support -TypeScript, a popular superset of JavaScript, is renowned for its static typing and enhanced developer experience. NoSQL databases like RxDB are inherently flexible, making them well-suited for TypeScript integration. With well-defined data structures and clear typings, NoSQL RxDB offers [improved type safety](../tutorials/typescript.md) and easier development when compared to traditional SQL databases like SQLite. This results in reduced debugging time and increased code reliability. - -### Easier [Schema Migration](../migration-schema.md) with NoSQL Documents -Schema changes are a common occurrence in application development, and dealing with them can be challenging. NoSQL databases, including RxDB, are more forgiving in this aspect. Since documents in NoSQL databases don't enforce a rigid structure like tables in relational databases, schema changes are often simpler to manage. This flexibility makes it easier to evolve your app's data structure over time without the need for complex migration scripts, a notable advantage when compared to SQLite. - -## Great Performance -RxDB's [excellent performance](../rx-storage-performance.md) stems from its advanced indexing capabilities, which streamline data retrieval and ensure swift query execution. Additionally, the [JSON key compression](../key-compression.md) employed by RxDB minimizes storage overhead, enabling efficient data transfer and quicker loading times. The incorporation of real-time updates through change streams and the **EventReduce mechanism** further enhances RxDB's performance, delivering a responsive user experience even as data changes are propagated seamlessly. - -## Using RxDB in an Ionic Hybrid App -RxDB's integration into your ionic hybrid app opens up a world of possibilities for efficient data management. Let's explore how to set up RxDB, use it with popular JavaScript frameworks, and take advantage of its diverse storage options. - -### Setup RxDB -Getting started with RxDB is a straightforward process. By including the RxDB library in your project, you can quickly start harnessing its capabilities. Begin by installing the [RxDB package](https://www.npmjs.com/package/rxdb) from the npm registry. Then, configure your database instance to suit your app's needs. This setup process paves the way for seamless data management in your ionic hybrid app. -For a full instruction, follow the [RxDB Quickstart](https://rxdb.info/quickstart.html). - -### Using RxDB in Frameworks (React, Angular, Vue.js) -RxDB seamlessly integrates with various JavaScript frameworks, ensuring compatibility with your preferred development environment. Whether you're building your ionic hybrid app with [React](./react-database.md), [Angular](./angular-database.md), or [Vue.js](./vue-database.md), RxDB offers bindings and tools that enable you to leverage its features effortlessly. This compatibility allows you to stay within the comfort zone of your chosen framework while benefiting from RxDB's powerful data management capabilities. - -### Different RxStorage Layers for RxDB -RxDB doesn't limit you to a single storage solution. Instead, it provides a range of RxStorage layers to accommodate diverse use cases. These storage layers offer flexibility and customization, enabling you to tailor your data management strategy to match your app's requirements. Let's explore some of the available RxStorage options: - -- [LocalStorage RxStorage](../rx-storage-localstorage.md): Based on the browsers [localStorage](./localstorage.md). Easy to set up and fast for small datasets. -- [IndexedDB RxStorage](../rx-storage-indexeddb.md): Leveraging the native browser storage, IndexedDB RxStorage offers reliable data persistence. This storage option is suitable for a wide range of scenarios and is supported by most modern browsers. -- [OPFS RxStorage](../rx-storage-opfs.md): Operating within the browser's file system, OPFS RxStorage is a unique choice that can handle larger data volumes efficiently. It's particularly useful for applications that require substantial data storage. -- [Memory RxStorage](../rx-storage-memory.md): Memory RxStorage is perfect for temporary or cache-like data storage. It keeps data in memory, which can result in rapid data access but doesn't provide long-term persistence. -- [SQLite RxStorage](../rx-storage-sqlite.md): SQLite is the goto database for mobile applications. It is build in on android and iOS devices. The SQLite RxDB storage layer is build upon SQLite and offers the best performance on hybrid apps, like ionic. - -## Replication of Data with RxDB between Clients and Servers -Efficient data replication between clients and servers is the backbone of modern application development, ensuring that data remains consistent and up-to-date across various devices and platforms. RxDB provides a suite of replication methods that facilitate seamless communication between clients and servers, ensuring that your data is always in sync. - -### RxDB Replication Algorithm -At the heart of RxDB's replication capabilities lies a sophisticated [algorithm](../replication.md) designed to manage data synchronization between clients and servers. This algorithm intelligently handles data changes, conflict resolution, and network connectivity fluctuations, resulting in reliable and efficient data replication. With the RxDB replication algorithm, your application can maintain data consistency across devices without unnecessary complexities. - -- [CouchDB Replication](../replication-couchdb.md): -RxDB's integration with CouchDB replication presents a powerful way to synchronize data between clients and servers. CouchDB, a well-established NoSQL database, excels at distributed and decentralized data scenarios. By utilizing RxDB's CouchDB replication, you can establish bidirectional synchronization between your RxDB-powered client and a CouchDB server. This synchronization ensures that data updates made on either end are seamlessly propagated to the other, facilitating collaboration and data sharing. - -- [Firestore Replication](../replication-firestore.md): -Firestore, Google's cloud-hosted NoSQL database, offers another avenue for data replication in RxDB. With Firestore replication, you can establish a connection between your RxDB-powered app and Firestore's cloud infrastructure. This integration provides real-time updates to data across multiple instances of your application, ensuring that users always have access to the latest information. RxDB's support for Firestore replication empowers you to build dynamic and responsive applications that thrive in today's fast-paced digital landscape. - -- [WebRTC Replication](../replication-webrtc.md): -Peer-to-peer (P2P) replication via WebRTC introduces a cutting-edge approach to data synchronization in RxDB. P2P replication allows devices to communicate directly with each other, bypassing the need for a central server. This method proves invaluable in scenarios where network connectivity is limited or unreliable. With WebRTC replication, devices can exchange data directly, enabling collaboration and information sharing even in challenging network conditions. - -## RxDB as an Alternative for Ionic Secure Storage -When it comes to securing sensitive data in your Ionic applications, RxDB emerges as a powerful alternative to traditional secure storage solutions. Let's delve into why RxDB is an exceptional choice for safeguarding your data while providing additional benefits. - -### RxDB On-Device Encryption Plugin -RxDB offers an [on-device encryption plugin](https://rxdb.info/encryption.html), adding an extra layer of security to your app's data. This means that data stored within the RxDB database can be encrypted, ensuring that even if the device falls into the wrong hands, the sensitive information remains inaccessible without the proper decryption key. This level of data protection is crucial for applications that deal with personal or confidential information. Encryption runs either with `AES` on `crypto-js` or with the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) which is faster and more secure. - -### Works Offline -Security should never compromise functionality. RxDB excels in this area by allowing your application to operate seamlessly even when offline. The locally stored encrypted data remains accessible and functional, enabling users to interact with the app's features even without an active internet connection. This offline capability ensures that user data is secure, while the app continues to deliver a responsive and uninterrupted experience. - -### Easy-to-Setup Replication with Your Backend -Ensuring data consistency between your client-side application and backend is a key concern for developers. RxDB simplifies this process with its straightforward replication setup. You can effortlessly configure data synchronization between your local RxDB instance and your backend server. This replication capability ensures that encrypted data remains up-to-date and aligned with the central database, enhancing data integrity and security. - -### Compression of Client-Side Stored Data -In addition to security and offline capabilities, RxDB also offers [data compression](https://rxdb.info/key-compression.html). This means that the data stored on the client's device is efficiently compressed, reducing storage requirements and improving overall app performance. This compression ensures that your app remains responsive and efficient, even as data volumes grow. - -### Cost-Effective Solution -In addition to its security features, RxDB offers cost-effective benefits. RxDB is [priced more affordably](/premium/) compared to some other secure storage solutions, making it an attractive option for developers seeking robust security without breaking the bank. For many users, the free version of RxDB provides ample features to meet their application's security and data management needs. - -## Follow Up - -- Try out the [RxDB ionic example project](https://github.com/pubkey/rxdb/tree/master/examples/ionic2) -- Try out the [RxDB Quickstart](https://rxdb.info/quickstart.html) -- Join the [RxDB Chat](https://rxdb.info/chat/) - ---- - -## RxDB - Local Ionic Storage with Encryption, Compression & Sync - - -When building **Ionic** apps, developers face the challenge of choosing a robust **Ionic storage** mechanism that supports: -- **Offline-First** usage -- **Data Encryption** to protect sensitive content -- **Compression** to reduce storage usage and improve performance -- **Seamless Sync** with any backend for real-time updates - -[RxDB](https://rxdb.info/) (Reactive Database) offers all these features in a single, [local-first](./local-first-future.md) database solution tailored to **Ionic** and other hybrid frameworks. Keep reading to learn how RxDB solves the most common storage pitfalls in hybrid app development while providing unmatched flexibility. - -
    - - - -
    - -## Why RxDB for Ionic Storage? - -### 1. Offline-Ready NoSQL Storage -[Offline functionality](../offline-first.md) is crucial for modern mobile applications, particularly when devices encounter unreliable or slow networks. RxDB stores all data **locally** so your Ionic app can run seamlessly without needing a continuous internet connection. When a network is available again, RxDB automatically synchronizes changes with your backend - no extra code required. - -### 2. Powerful Encryption -Securing on-device data is paramount when handling sensitive information. RxDB includes [encryption plugins](../encryption.html) that let you: -- **Encrypt** data fields at rest with AES -- Invalidate data access by simply withholding the password -- Keep your users' data confidential, even if the device is stolen - -This built-in encryption sets RxDB apart from many other Ionic storage options that lack integrated security. - -### 3. Built-In Data Compression -Large or repetitive data can significantly slow down devices with minimal memory. RxDB's [key-compression](../key-compression.md) feature decreases document size stored on the device, improving overall performance by: -- Reducing disk usage -- Accelerating queries -- Minimizing network overhead when syncing - -### 4. Real-Time Sync & Conflict Handling -In addition to functioning fully offline, RxDB supports advanced [replication](../replication.md) options. Your Ionic app can instantly sync updates with any backend ([CouchDB](../replication-couchdb.md), [Firestore](../replication-firestore.md), [GraphQL](../replication-graphql.md), or [custom REST](../replication-http.md)), maintaining a [real-time](./realtime-database.md) user experience. Plus, RxDB handles [conflicts](../transactions-conflicts-revisions.md) gracefully - meaning less worry about clashing user edits. - - - -### 5. Easy to Adopt and Extend -RxDB runs with a **NoSQL** approach and integrates seamlessly into [Ionic Angular](https://ionicframework.com/docs/angular/overview) or other frameworks you might use with Ionic. You can extend or replace storage backends, add encryption, or build advanced offline-first features with minimal overhead. - -
    - - - -
    - -## Quick Start: Implementing RxDB with LocalSTorage Storage - -For a simple proof-of-concept or testing environment in [Ionic](./ionic-database.md), you can use [localstorage](../rx-storage-localstorage.md) as your underlying storage. Later, if you need better native performance, you can **switch to the SQLite storage** offered by the [RxDB Premium plugins](https://rxdb.info/premium/). - -1. **Install RxDB** -```bash -npm install rxdb rxjs -``` - -2. **Initialize the Database** - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -async function initDB() { - const db = await createRxDatabase({ - name: 'myionicdb', - storage: getRxStorageLocalstorage(), - multiInstance: false // or true if you plan multi-tab usage - // Note: If you need encryption, set `password` here - }); - - await db.addCollections({ - notes: { - schema: { - title: 'notes schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string' }, - content: { type: 'string' }, - timestamp: { type: 'number' } - }, - required: ['id'] - } - } - }); - - return db; -} -``` - -3. **Ready to Upgrade Later?** - -When you need the best performance on mobile devices, purchase the RxDB [Premium](/premium/) [SQLite Storage](../rx-storage-sqlite.md) and replace `getRxStorageLocalstorage()` with `getRxStorageSQLite()` - your app logic remains largely the same. You only have to change the configuration. - -## Encryption Example - -To secure local data, add the crypto-js [encryption plugin](../encryption.md) (free version) or the [premium](/premium/) web-crypto plugin. Below is an example using the free crypto-js plugin: - -```ts -import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -import { createRxDatabase } from 'rxdb/plugins/core'; - -async function initEncryptedDB() { - const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ - storage: getRxStorageLocalstorage() - }); - - const db = await createRxDatabase({ - name: 'secureIonicDB', - storage: encryptedStorage, - password: 'myS3cretP4ssw0rd' - }); - - await db.addCollections({ - secrets: { - schema: { - title: 'secret schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string' }, - text: { type: 'string' } - }, - required: ['id'], - // all fields in this array will be stored encrypted: - encrypted: ['text'] - } - } - }); - - return db; -} -``` - -With encryption enabled: - -- `text` is automatically encrypted at rest. -- [Queries](../rx-query.md) on encrypted fields are not directly possible (since data is encrypted), but once a document is loaded, RxDB decrypts it for normal usage. - -## Compression Example - -To minimize the storage footprint, RxDB offers a [key-compression](../key-compression.md) feature. You can enable it in your schema: - -```ts -await db.addCollections({ - logs: { - schema: { - title: 'logs schema', - version: 0, - keyCompression: true, // enable compression - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string' }, - message: { type: 'string' }, - createdAt: { type: 'string', format: 'date-time' } - } - } - } -}); -``` - -With `keyCompression: true`, RxDB shortens field names internally, significantly reducing document size. This helps both stored data and network transport during replication. - -## RxDB vs. Other Ionic Storage Options - -**Ionic Native Storage** or **Capacitor-based** key-value stores may handle small amounts of data but lack advanced features like: - -- Complex queries -- Full NoSQL document model -- [Offline-first](../offline-first.md) [sync](../replication.md) -- Encryption & key compression out of the box -- RxDB stands out by delivering all these capabilities in a unified library. - -## Follow Up - -For Ionic storage that supports offline-first operations, built-in encryption, optional data compression, and live syncing with any backend, RxDB provides a powerful solution. Start quickly with [localstorage](../rx-storage-localstorage.md) for local development and testing - then scale up to the premium SQLite storage for optimal performance on production mobile devices. - -Ready to learn more? - -- Explore the [RxDB Quickstart Guide](../quickstart.md) -- Check out [RxDB Encryption](../encryption.md) to protect user data -- Learn about [SQLite Storage](../rx-storage-sqlite.md) in [RxDB Premium](/premium/) for top [performance](../rx-storage-performance.md) on mobile. -- Join our community on the [RxDB Chat](/chat/) - -**RxDB** - The ultimate toolkit for Ionic developers seeking offline-first, secure, and compressed local data, with real-time sync to any server. - ---- - -## Local JavaScript Vector Database that works offline - -# Local Vector Database with RxDB and transformers.js in JavaScript - -The [local-first](../offline-first.md) revolution is here, changing the way we build apps! Imagine a world where your app's data lives right on the user's device, always available, even when there's no internet. That's the magic of local-first apps. Not only do they bring faster performance and limitless scalability, but they also empower users to work offline without missing a beat. And leading the charge in this space are local database solutions, like [RxDB](https://rxdb.info/). - -
    - - - -
    - -But here's where things get even more exciting: when building [local-first](./local-first-future.md) apps, traditional databases often fall short. They're great at searching for exact matches, like `numbers` or `strings`, but what if you want to search by **meaning**, like sifting through emails to find a specific topic? Sure, you could use **RegExp**, but to truly unlock the power of semantic search and similarity-based queries, you need something more cutting-edge. Something that really understands the content of the data. - -Enter **vector databases**, the game-changers for searching data by meaning! They have unlocked these new possibilities for storing and querying data, especially in tasks requiring **semantic search** and **similarity-based** queries. With the help of a **machine learning model**, data is transformed into a vector representation that can be stored, queried and compared in a database. - -But unfortunately, most vector databases are designed for server-side use, typically running in large cloud clusters, not to run on a users device. To fix that, in this article, we will combine **RxDB** and **transformers.js** to create a local vector database running in the **browser** with **JavaScript**. It stores data in **IndexedDB**, and uses a machine learning model with **WebAssembly** locally, without the need for external servers. - -- [transformers.js](https://github.com/xenova/transformers.js) is a powerful framework that allows machine learning models to run directly within JavaScript using WebAssembly or WebGPU. - -- [RxDB](https://rxdb.info/) is a NoSQL, local-first database with a flexible storage layer that can run on any JavaScript runtime, including browsers and mobile environments. (You are reading this article on the RxDB docs). - -A local vector database offers several key benefits: - -- **Zero network latency**: Data is processed locally on the user's device, ensuring near-instant responses. -- **Offline functionality**: Data can be queried even without an internet connection. -- **Enhanced privacy**: Sensitive information remains on the device, never needing to leave for external processing. -- **Simple setup**: No backend servers are required, making deployment straightforward. -- **Cost savings**: By running everything locally, you avoid fees for API access or cloud services for large language models. - -:::note -In this article only the important source code parts are shown. You can find the full open-source vector database implementation at the [github repository](https://github.com/pubkey/javascript-vector-database). -::: - -## What is a Vector Database? - -A vector database is a specialized database optimized for storing and querying data in the form of **high-dimensional** vectors, often referred to as **embeddings**. These embeddings are numerical representations of data, such as text, images, or audio, created by machine learning models like [MiniLM](https://huggingface.co/Xenova/all-MiniLM-L6-v2). Unlike traditional databases that work with exact matches on predefined fields, vector databases focus on **semantic similarity**, allowing you to query data based on meaning rather than exact values. - -> A vector, or embedding, is essentially an array of numbers, like `[0.56, 0.12, -0.34, -0.90]`. - -For example, instead of asking "Which document has the word 'database'?", you can query "Which documents discuss similar topics to this one?" The vector database compares embeddings and returns results based on how similar the vectors are to each other. - -Vector databases handle multiple types of data beyond **text**, including **images**, **videos**, and **audio** files, all transformed into embeddings for efficient querying. Mostly you would not train a model by yourself and instead use one of the public available [transformer models](https://huggingface.co/models?pipeline_tag=feature-extraction&library=transformers.js). - -Vector databases are highly effective in various types of applications: - -- **Similarity Search**: Finds the closest matches to a query, even when the query doesn't contain the exact terms. -- **Clustering**: Groups similar items based on the proximity of their vector representations. -- **Recommendations**: Suggests items based on shared characteristics. -- **Anomaly Detection**: Identifies outliers that differ from the norm. -- **Classification**: Assigns categories to data based on its vector's nearest neighbors. - -In this tutorial, we will build a vector database designed as a **Similarity Search** for **text**. For other use cases, the setup can be adapted accordingly. This flexibility is why [RxDB](https://rxdb.info/) doesn't provide a dedicated vector-database plugin, but rather offers utility functions to help you build your own vector search system. - -
    - -
    - -## Generating Embeddings Locally in a Browser - -For the first step to build a local-first vector database we need to compute embeddings directly on the user's device. This is where [transformers.js](https://github.com/xenova/transformers.js) from [huggingface](https://huggingface.co/docs/transformers.js/index) comes in, allowing us to run machine learning models in the browser with **WebAssembly**. Below is an implementation of a `getEmbeddingFromText()` function, which takes a piece of text and transforms it into an embedding using the [Xenova/all-MiniLM-L6-v2](https://huggingface.co/Xenova/all-MiniLM-L6-v2) model: - -```js -import { pipeline } from "@xenova/transformers"; -const pipePromise = pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2'); -async function getEmbeddingFromText(text) { - const pipe = await pipePromise; - const output = await pipe(text, { - pooling: "mean", - normalize: true, - }); - return Array.from(output.data); -} -``` - -This function creates an embedding by running the text through a pre-trained model and returning it in the form of an array of numbers, which can then be stored and further processed locally. - -:::note -Vector embeddings from different machine learning models or versions are not compatible with each other. When you change your model, you have to recreate all embeddings for your data. -::: - -## Storing the Embeddings in RxDB - -To store the embeddings, first we have to create our [RxDB Database](../rx-database.md) with the [localstorage storage](../rx-storage-localstorage.md) that stores data in the browsers [localstorage](./localstorage.md). For more advanced projects, you can use any other [RxStorage](../rx-storage.md). - -```ts -import { createRxDatabase } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -const db = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageLocalstorage() -}); -``` - -Then we add a `items` collection that stores our documents with the `text` field that stores the content. - -```ts -await db.addCollections({ - items: { - schema: { - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 20 - }, - text: { - type: 'string' - } - }, - required: ['id', 'text'] - } - } -}); -const itemsCollection = db.items; -``` - -In our [example repo](https://github.com/pubkey/javascript-vector-database), we use the [Wiki Embeddings](https://huggingface.co/datasets/Supabase/wikipedia-en-embeddings) dataset from supabase which was transformed and used to fill up the `items` collection with test data. - -```ts -const imported = await itemsCollection.count().exec(); -const response = await fetch('./files/items.json'); -const items = await response.json(); -const insertResult = await itemsCollection.bulkInsert( - items -); -``` - -Also we need a `vector` collection that stores our embeddings. -RxDB, as a NoSQL database, allows for the storage of flexible data structures, such as embeddings, within documents. To achieve this, we need to define a [schema](../rx-schema.md) that specifies how the embeddings will be stored alongside each document. The schema includes fields for an `id` and the `embedding` array itself. - -```ts -await db.addCollections({ - vector: { - schema: { - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 20 - }, - embedding: { - type: 'array', - items: { - type: 'string' - } - } - }, - required: ['id', 'embedding'] - } - } -}); -const vectorCollection = db.vector; -``` - -When storing documents in the database, we need to ensure that the embeddings for these documents are generated and stored automatically. This requires a handler that runs during every document write, calling the machine learning model to generate the embeddings and storing them in a separate vector collection. - -Since our app runs in a browser, it's essential to avoid duplicate work when **multiple browser tabs** are open and ensure efficient use of resources. Furthermore, we want the app to resume processing documents from where it left off if it's closed or interrupted. To achieve this, RxDB provides a [pipeline plugin](../rx-pipeline.md), which allows us to set up a workflow that processes items and stores their embeddings. In our example, a pipeline takes batches of 10 documents, generates embeddings, and stores them in a separate vector collection. - -```ts -const pipeline = await itemsCollection.addPipeline({ - identifier: 'my-embeddings-pipeline', - destination: vectorCollection, - batchSize: 10, - handler: async (docs) => { - await Promise.all(docs.map(async(doc) => { - const embedding = await getVectorFromText(doc.text); - await vectorCollection.upsert({ - id: doc.primary, - embedding - }); - })); - } -}); -``` - -However, processing data locally presents performance challenges. Running the handler with a batch size of 10 takes around **2-4 seconds per batch**, meaning processing 10k documents would take up to an hour. To improve performance, we can do parallel processing using [WebWorkers](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers). A WebWorker runs on a different JavaScript process and we can start and run many of them in parallel. - -Our worker listens for messages and performance the embedding generation on each request. It then sends the result embedding back to the main thread. - -```ts -// worker.js -import { getVectorFromText } from './vector.js'; -onmessage = async (e) => { - const embedding = await getVectorFromText(e.data.text); - postMessage({ - id: e.data.id, - embedding - }); -}; -``` - -On the main thread we spawn one worker per core and send the tasks to the worker instead of processing them on the main thread. - -```ts -// create one WebWorker per core -const workers = new Array(navigator.hardwareConcurrency) - .fill(0) - .map(() => new Worker(new URL("worker.js", import.meta.url))); -``` - -```ts -let lastWorkerId = 0; -let lastId = 0; -export async function getVectorFromTextWithWorker(text: string): Promise { - let worker = workers[lastWorkerId++]; - if(!worker) { - lastWorkerId = 0; - worker = workers[lastWorkerId++]; - } - const id = (lastId++) + ''; - return new Promise(res => { - const listener = (ev: any) => { - if (ev.data.id === id) { - res(ev.data.embedding); - worker.removeEventListener('message', listener); - } - }; - worker.addEventListener('message', listener); - worker.postMessage({ - id, - text - }); - }); -} - -const pipeline = await itemsCollection.addPipeline({ - identifier: 'my-embeddings-pipeline', - destination: vectorCollection, - batchSize: navigator.hardwareConcurrency, // one per CPU core - handler: async (docs) => { - await Promise.all(docs.map(async (doc, i) => { - const embedding = await getVectorFromTextWithWorker(doc.body); - /* ... */ - }); - } -}); -``` - -This setup allows us to utilize the full hardware capacity of the client's machine. By setting the batch size to match the number of logical processors available (using the [navigator.hardwareConcurrency](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/hardwareConcurrency) API) and running one worker per processor, we can reduce the processing time for 10k embeddings to **about 5 minutes** on my developer laptop with 32 CPU cores. - -## Comparing Vectors by calculating the distance - -Now that we have stored our embeddings in the database, the next step is to compare these vectors to each other. Various methods are available to measure the similarity or difference between two vectors, such as [Euclidean distance](https://en.wikipedia.org/wiki/Euclidean_distance), [Manhattan distance](https://www.singlestore.com/blog/distance-metrics-in-machine-learning-simplfied/), [Cosine similarity](https://tomhazledine.com/cosine-similarity/), and **Jaccard similarity** (and more). RxDB provides utility functions for each of these methods, making it easy to choose the most suitable method for your application. In this tutorial, we will use **Euclidean distance** to compare vectors. However, the ideal algorithm may vary depending on your data's distribution and the specific type of query you are performing. To find the optimal method for your app, it is up to you to try out all of these and compare the results. - -Each method gets two vectors as input and returns a single number. Here's how to calculate the Euclidean distance between two embeddings with the vector utilities from RxDB: - -```ts -import { euclideanDistance } from 'rxdb/plugins/vector'; -const distance = euclideanDistance(embedding1, embedding2); -console.log(distance); // 25.20443 -``` - -With this we can sort multiple embeddings by how good they match our search query vector. - -## Searching the Vector database with a full table scan - -To find out if our embeddings have been stored correctly and that our vector comparison works as should, let's run a basic query to ensure everything functions as expected. In this query, we aim to find documents similar to a given user input text. The process involves calculating the embedding from the input text, fetching all documents, calculating the distance between their embeddings and the query embedding, and then sorting them based on their similarity. - -```ts -import { euclideanDistance } from 'rxdb/plugins/vector'; -import { sortByObjectNumberProperty } from 'rxdb/plugins/core'; - -const userInput = 'new york people'; -const queryVector = await getEmbeddingFromText(userInput); -const candidates = await vectorCollection.find().exec(); -const withDistance = candidates.map(doc => ({ - doc, - distance: euclideanDistance(queryVector, doc.embedding) -})); -const queryResult = withDistance.sort(sortByObjectNumberProperty('distance')).reverse(); -console.dir(queryResult); -``` - -:::note -For **distance**-based comparisons, sorting should be in ascending order (smallest first), while for **similarity**-based algorithms, the sorting should be in descending order (largest first). -::: - -If we inspect the results, we can see that the documents returned are ordered by relevance, with the most similar document at the top: - -
    - -
    - -:::note -This demo page can be [run online here](https://pubkey.github.io/javascript-vector-database/). -::: - -However our full-scan method presents a significant challenge: it does not scale well. As the number of stored documents increases, the time taken to fetch and compare embeddings grows proportionally. For example, retrieving embeddings from our [test dataset](https://huggingface.co/datasets/Supabase/wikipedia-en-embeddings) of 10k documents takes around **700 milliseconds**. If we scale up to 100k documents, this delay would rise to approximately **7 seconds**, making the search process inefficient for larger datasets. - -## Indexing the Embeddings for Better Performance - -To address the scalability issue, we need to store embeddings in a way that allows us to avoid fetching all of them from storage during a query. In traditional databases, you can sort documents by an **index field**, allowing efficient queries that retrieve only the necessary documents. An index organizes data in a structured, sortable manner, much **like a phone book**. However, with vector embeddings we are not dealing with simple, single values. Instead, we have large **lists of numbers**, which makes indexing more complex because we have more than one dimension. - -### Vector Indexing Methods - -Various methods exist for indexing these vectors to improve query efficiency and performance: - -- [Locality Sensitive Hashing (LSH)](https://www.youtube.com/watch?v=Arni-zkqMBA): LSH hashes data so that similar items are likely to fall into the same bucket, optimizing approximate nearest neighbor searches in high-dimensional spaces by reducing the number of comparisons. -- [Hierarchical Small World](https://www.youtube.com/watch?v=77QH0Y2PYKg): HSW is a graph structure designed for efficient navigation, allowing quick jumps across the graph while maintaining short paths between nodes, forming the basis for HNSW's optimization. -- [Hierarchical Navigable Small Worlds (HNSW)](https://www.youtube.com/watch?v=77QH0Y2PYKg): HNSW builds a hierarchical graph for fast approximate nearest neighbor search. It uses multiple layers where higher layers represent fewer, more connected nodes, improving search efficiency in large datasets​. -- **Distance to samples**: While testing different indexing strategies, [I](https://github.com/pubkey) found out that using the distance to a sample set of items is a good way to index embeddings. You pick like 5 random items of your data and get the embeddings for them out of the model. These are your 5 index vectors. For each embedding stored in the vector database, we calculate the distance to our 5 index vectors and store that `number` as an index value. This seems to work good because similar things have similar distances to other things. For example the words "shoe" and "socks" have a similar distance to "boat" and therefore should have roughly the same index value. - -When building **local-first** applications, performance is often a challenge, especially in JavaScript. With **IndexedDB**, certain operations, like many sequential `get by id` calls, [are slow](../slow-indexeddb.md), while bulk operations, such as `get by index range`, are fast. Therefore, it's essential to use an indexing method that allows embeddings to be stored in a sortable way, like **Locality Sensitive Hashing** or **Distance to Samples**. In this article, we'll use **Distance to Samples**, because for [me](https://github.com/pubkey) it provides the best default behavior for the sample dataset. - -### Storing indexed embeddings in RxDB - -The optimal way to store index values alongside embeddings in RxDB is to place them within the same [RxCollection](../rx-collection.md). To ensure that the index values are both sortable and precise, we convert them into strings with a fixed length of `10` characters. This standardization helps in managing values with many decimals and ensures proper sorting in the database. - -Here's is our schema example schema where each document contains an embedding and corresponding index fields: - -```ts -const indexSchema = { - type: 'string', - maxLength: 10 -}; -const schema = { - "version": 0, - "primaryKey": "id", - "type": "object", - "properties": { - "id": { - "type": "string", - "maxLength": 100 - }, - "embedding": { - "type": "array", - "items": { - "type": "number" - } - }, - // index fields - "idx0": indexSchema, - "idx1": indexSchema, - "idx2": indexSchema, - "idx3": indexSchema, - "idx4": indexSchema - }, - "required": [ - "id", - "embedding", - "idx0", - "idx1", - "idx2", - "idx3", - "idx4" - ], - "indexes": [ - "idx0", - "idx1", - "idx2", - "idx3", - "idx4" - ] -} -``` - -To populate these index fields, we modify the [RxPipeline](../rx-pipeline.md) handler accordingly to the **Distance to samples** method. We calculate the distance between the document's embedding and our set of `5` index vectors. The calculated distances are converted to `string` and stored in the appropriate index fields: - -```ts -import { euclideanDistance } from 'rxdb/plugins/vector'; -const sampleVectors: number[][] = [/* the index vectors */]; -const pipeline = await itemsCollection.addPipeline({ - handler: async (docs) => { - await Promise.all(docs.map(async(doc) => { - const embedding = await getEmbedding(doc.text); - const docData = { id: doc.primary, embedding }; - // calculate the distance to all samples and store them in the index fields - new Array(5).fill(0).map((_, idx) => { - const indexValue = euclideanDistance(sampleVectors[idx], embedding); - docData['idx' + idx] = indexNrToString(indexValue); - }); - await vectorCollection.upsert(docData); - })); - } -}); -``` - -## Searching the Vector database with utilization of the indexes - -Once our embeddings are stored in an indexed format, we can perform searches much **more efficiently** than through a full table scan. While this indexing method boosts performance, it comes with a tradeoff: a slight loss in precision, meaning that the result set may not always be the optimal one. However, this is generally acceptable for **similarity search** use cases. - -There are multiple ways to leverage indexes for faster queries. Here are two effective methods: - -1. **Query for Index Similarity in Both Directions**: For each index vector, calculate the distance to the search embedding and fetch all relevant embeddings in both directions (sorted before and after) from that value. - -```ts -async function vectorSearchIndexSimilarity(searchEmbedding: number[]) { - const docsPerIndexSide = 100; - const candidates = new Set(); - await Promise.all( - new Array(5).fill(0).map(async (_, i) => { - const distanceToIndex = euclideanDistance(sampleVectors[i], searchEmbedding); - const [docsBefore, docsAfter] = await Promise.all([ - vectorCollection.find({ - selector: { - ['idx' + i]: { - $lt: indexNrToString(distanceToIndex) - } - }, - sort: [{ ['idx' + i]: 'desc' }], - limit: docsPerIndexSide - }).exec(), - vectorCollection.find({ - selector: { - ['idx' + i]: { - $gt: indexNrToString(distanceToIndex) - } - }, - sort: [{ ['idx' + i]: 'asc' }], - limit: docsPerIndexSide - }).exec() - ]); - docsBefore.map(d => candidates.add(d)); - docsAfter.map(d => candidates.add(d)); - }) - ); - const docsWithDistance = Array.from(candidates).map(doc => { - const distance = euclideanDistance((doc as any).embedding, searchEmbedding); - return { - distance, - doc - }; - }); - const sorted = docsWithDistance.sort(sortByObjectNumberProperty('distance')).reverse(); - return { - result: sorted.slice(0, 10), - docReads - }; -} -``` - -2. **Query for an Index Range with a Defined Distance**: Set an `indexDistance` and retrieve all embeddings within a specified range from the index vector to the search embedding. - -```ts -async function vectorSearchIndexRange(searchEmbedding: number[]) { - await pipeline.awaitIdle(); - const indexDistance = 0.003; - const candidates = new Set(); - let docReads = 0; - await Promise.all( - new Array(5).fill(0).map(async (_, i) => { - const distanceToIndex = euclideanDistance(sampleVectors[i], searchEmbedding); - const range = distanceToIndex * indexDistance; - const docs = await vectorCollection.find({ - selector: { - ['idx' + i]: { - $gt: indexNrToString(distanceToIndex - range), - $lt: indexNrToString(distanceToIndex + range) - } - }, - sort: [{ ['idx' + i]: 'asc' }], - }).exec(); - docs.map(d => candidates.add(d)); - docReads = docReads + docs.length; - }) - ); - - const docsWithDistance = Array.from(candidates).map(doc => { - const distance = euclideanDistance((doc as any).embedding, searchEmbedding); - return { - distance, - doc - }; - }); - const sorted = docsWithDistance.sort(sortByObjectNumberProperty('distance')).reverse(); - return { - result: sorted.slice(0, 10), - docReads - }; -}; -``` - -Both methods allow you to limit the number of embeddings fetched from storage while still ensuring a reasonably precise search result. However, they differ in how many embeddings are read and how precise the results are, with trade-offs between performance and accuracy. The first method has a known embedding read amount of `docsPerIndexSide * 2 * [amount of indexes]`. The second method reads out an unknown amount of embeddings, depending on the sparsity of the dataset and the value of `indexDistance`. - -And that's it for the implementation. We now have a local first vector database that is able to store and query vector data. - -## Performance benchmarks - -In server-side databases, performance can be improved by scaling hardware or adding more servers. However, [local-first](../offline-first.md) apps face the unique challenge that the hardware is determined by the end user, making performance unpredictable. Some users may have **high-end gaming PCs**, while others might be using **outdated smartphones in power-saving mode**. Therefore, when building a local-first app that processes more than a few documents, performance becomes a critical factor and should be thoroughly tested upfront. - -Let's run performance benchmarks on my **high-end gaming PC** to give you a sense of how long different operations take and what's achievable. - -### Performance of the Query Methods - -| Query Method | Time in milliseconds | Docs read from storage | -| ---------------- | -------------------- | ---------------------- | -| Full Scan | 765 | 10000 | -| Index Similarity | 1647 | 934 | -| Index Range | 88 | 2187 | - -As shown, the **index similarity** query method takes significantly longer compared to others. This is due to the need for descending sort orders in some queries `sort: [{ ['idx' + i]: 'desc' }]`. While RxDB supports descending sorts, performance suffers because IndexedDB does not efficiently handle [reverse indexed bulk operations](https://github.com/w3c/IndexedDB/issues/130). As a result, the **index range method** performs much better for this use case and should be used instead. With its query time of only `88` milliseconds it is fast enough for all most things and likely such fast that you do not even need to show a loading spinner. Also it is faster compared to fetching the query result from a server-side vector database over the internet. - -### Performance of the Models - -Let's also look at the time taken to calculate a single embedding across various models from the [huggingface transformers list](https://huggingface.co/models?pipeline_tag=feature-extraction&library=transformers.js): - -| Model Name | Time per Embedding in (ms) | Vector Size | Model Size (MB) | -| -------------------------------------------- | -------------------------- | ----------- | --------------- | -| Xenova/all-MiniLM-L6-v2 | 173 | 384 | 23 | -| Supabase/gte-small | 341 | 384 | 34 | -| Xenova/paraphrase-multilingual-mpnet-base-v2 | 1000 | 768 | 279 | -| jinaai/jina-embeddings-v2-base-de | 1291 | 768 | 162 | -| jinaai/jina-embeddings-v2-base-zh | 1437 | 768 | 162 | -| jinaai/jina-embeddings-v2-base-code | 1769 | 768 | 162 | -| mixedbread-ai/mxbai-embed-large-v1 | 3359 | 1024 | 337 | -| WhereIsAI/UAE-Large-V1 | 3499 | 1024 | 337 | -| Xenova/multilingual-e5-large | 4215 | 1024 | 562 | - -From these benchmarks, it's evident that models with larger vector outputs **take longer to process**. Additionally, the model size significantly affects performance, with larger models requiring more time to compute embeddings. This trade-off between model complexity and performance must be considered when choosing the right model for your use case. - -## Potential Performance Optimizations - -There are multiple other techniques to improve the performance of your local vector database: - -- **Shorten embeddings**: The storing and retrieval of embeddings can be improved by "shortening" the embedding. To do that, you just strip away numbers from your vector. For example `[0.56, 0.12, -0.34, 0.78, -0.90]` becomes `[0.56, 0.12]`. That's it, you now have a smaller embedding that is faster to read out of the storage and calculating distances is faster because it has to process less numbers. The downside is that you loose precision in your search results. Sometimes shortening the embeddings makes more sense as a pre-query step where you first compare the shortened vectors and later fetch the "real" vectors for the 10 most matching documents to improve their sort order. - -- **Optimize the variables in our Setup**: In this examples we picked our variables in a non-optimal way. You can get huge performance improvements by setting different values: - - We picked 5 indexes for the embeddings. Using less indexes improves your query performance with the cost of less good results. - - For queries that search by fetching a specific embedding distance we used the `indexDistance` value of `0.003`. Using a lower value means we read less document from the storage. This is faster but reduces the precision of the results which means we will get a less optimal result compared to a full table scan. - - For queries that search by fetching a given amount of documents per index side, we set the value `docsPerIndexSide` to `100`. Increasing this value means you fetch more data from the storage but also get a better precision in the search results. Decreasing it can improve query performance with worse precision. - -- **Use faster models**: There are many ways to improve performance of machine learning models. If your embedding calculation is too slow, try other models. **Smaller** mostly means **faster**. The model `Xenova/all-MiniLM-L6-v2` which is used in this tutorial is about [1 year old](https://huggingface.co/Xenova/all-MiniLM-L6-v2/tree/main). There exist better, more modern models to use. Huggingface makes these convenient to use. You only have to switch out the model name with any other model from [that site](https://huggingface.co/models?pipeline_tag=feature-extraction&library=transformers.js). - -- **Narrow down the search space**: By utilizing other "normal" filter operators to your query, you can narrow down the search space and optimize performance. For example in an email search you could additionally use a operator that limits the results to all emails that are not older than one year. - -- **Dimensionality Reduction** with an [autoencoder](https://www.youtube.com/watch?v=D16rii8Azuw): An autoencoder encodes vector data with minimal loss which can improve the performance by having to store and compare less numbers in an embedding. - -- **Different RxDB Plugins**: RxDB has different storages and plugins that can improve the performance like the [IndexedDB RxStorage](../rx-storage-indexeddb.md), the [OPFS RxStorage](../rx-storage-opfs.md), the [sharding](../rx-storage-sharding.md) plugin and the [Worker](../rx-storage-worker.md) and [SharedWorker](../rx-storage-shared-worker.md) storages. - -
    - - - -
    - -## Migrating Data on Model/Index Changes - -When you change the index parameter or even update the whole model which was used to create the embeddings, you have to migrate the data that is already stored on your users devices. RxDB offers the [Schema Migration Plugin](../migration-schema.md) for that. - -When the app is reloaded and the updated source code is started, RxDB detects changes in your [schema version](../rx-schema.md#version) and runs the [migration strategy](../migration-schema.md#providing-strategies) accordingly. So to update the stored data, increase the schema version and define a handler: - -```ts -const schemaV1 = { - "version": 1, // <- increase schema version by 1 - "primaryKey": "id", - "properties": { - /* ... */ - }, - /* ... */ -}; -``` - -In the migration handler we recreate the new embeddings and index values. - -```ts -await myDatabase.addCollections({ - vectors: { - schema: schemaV1, - migrationStrategies: { - 1: function(docData){ - const embedding = await getEmbedding(docData.body); - new Array(5).fill(0).map((_, idx) => { - docData['idx' + idx] = euclideanDistance(mySampleVectors[idx], embedding); - }); - return docData; - }, - } - } -}); -``` - -## Possible Future Improvements to Local-First Vector Databases - -For now our vector database works and we are good to go. However there are some things to consider for the future: - -- **WebGPU** is [not fully supported](https://caniuse.com/webgpu) yet. When this changes, creating embeddings in the browser have the potential to become faster. You can check if your current chrome supports WebGPU by opening `chrome://gpu/`. Notice that WebGPU has been reported to sometimes be [even slower](https://github.com/xenova/transformers.js/issues/894#issuecomment-2323897485) compared to WASM but likely it will be faster in the long term. -- **Cross-Modal AI Models**: While progress is being made, AI models that can understand and integrate multiple modalities are still in development. For example you could query for an **image** together with a **text** prompt to get a more detailed output. -- **Multi-Step queries**: In this article we only talked about having a single query as input and an ordered list of outputs. But there is big potential in chaining models or queries together where you take the results of one query and input them into a different model with different embeddings or outputs. - -## Follow Up -- Shared/Like my [announcement tweet](https://x.com/rxdbjs/status/1833429569434427494) -- Read the source code that belongs to this article [at github](https://github.com/pubkey/javascript-vector-database) -- Learn how to use RxDB with the [RxDB Quickstart](../quickstart.md) -- Check out the [RxDB github repo](https://github.com/pubkey/rxdb) and leave a star ⭐ - ---- - -## RxDB as a Database in a jQuery Application - -import {VideoBox} from '@site/src/components/video-box'; - -# RxDB as a Database in a jQuery Application - -In the early days of dynamic web development, **jQuery** emerged as a popular library that simplified DOM manipulation and AJAX requests. Despite the rise of modern frameworks, many developers still maintain or extend existing jQuery projects, or leverage jQuery in specific contexts. As jQuery applications grow in complexity, they often require efficient data handling, offline support, and synchronization capabilities. This is where [RxDB](https://rxdb.info/), a reactive JavaScript database for the browser, node.js, and [mobile devices](./mobile-database.md), steps in. - -
    - - - -
    - -## jQuery Web Applications -jQuery provides a simple API for DOM manipulation, event handling, and AJAX calls. It has been widely adopted due to its ease of use and strong community support. Many projects continue to rely on jQuery for handling client-side functionality, UI interactions, and animations. As these applications evolve, the need for a robust database solution that can manage data locally (and offline) becomes increasingly important. - -## Importance of Databases in jQuery Applications -Modern, data-driven jQuery applications often need to: - -- **Store and retrieve data locally** for quick and responsive user experiences. -- **Synchronize data** between clients or with a [central server](../rx-server.md). -- **Handle offline scenarios** seamlessly. -- **Handle large or complex data structures** without repeatedly hitting the server. - -Relying solely on server endpoints or basic browser storage (like `localStorage`) can quickly become unwieldy for larger or more complex use cases. Enter RxDB, a dedicated solution that manages data on the client side while offering real-time synchronization and offline-first capabilities. - -## Introducing RxDB as a Database Solution -RxDB (short for Reactive Database) is built on top of [IndexedDB](./browser-database.md) and leverages [RxJS](https://rxjs.dev/) to provide a modern, reactive approach to handling data in the browser. With RxDB, you can store documents locally, query them in real-time, and synchronize changes with a remote server whenever an internet connection is available. - -### Key Features - -- **Reactive Data Handling**: RxDB emits real-time updates whenever your data changes, allowing you to instantly reflect these changes in the DOM with jQuery. -- **Offline-First Approach**: Keep your application usable even when the user's network is unavailable. Data is automatically synchronized once connectivity is restored. -- **Data Replication**: Enable multi-device or multi-tab synchronization with minimal effort. -- **Observable Queries**: Reduce code complexity by subscribing to queries instead of constantly polling for changes. -- **Multi-Tab Support**: If a user opens your jQuery application in multiple tabs, RxDB keeps data in sync across all sessions. - -
    - -
    - -## Getting Started with RxDB - -### What is RxDB? -[RxDB](https://rxdb.info/) is a client-side NoSQL database that stores data in the browser (or [node.js](../nodejs-database.md)) and synchronizes changes with other instances or servers. Its design embraces reactive programming principles, making it well-suited for real-time applications, offline scenarios, and multi-tab use cases. - - - -### Reactive Data Handling -RxDB's use of observables enables an event-driven architecture where data mutations automatically trigger UI updates. In a jQuery application, you can subscribe to these changes and update DOM elements as soon as data changes occur - no need for manual refresh or complicated change detection logic. - -### Offline-First Approach -One of RxDB's distinguishing traits is its emphasis on offline-first design. This means your jQuery application continues to function, display, and update data even when there's no network connection. When connectivity is restored, RxDB synchronizes updates with the server or other peers, ensuring consistency across all instances. - -### Data Replication -RxDB supports real-time data replication with different backends. By enabling replication, you ensure that multiple clients - be they multiple [browser](./browser-database.md) tabs or separate devices - stay in sync. RxDB's conflict resolution strategies help keep the data consistent even when multiple users make changes simultaneously. - -### Observable Queries -Instead of static queries, RxDB provides observable queries. Whenever data relevant to a query changes, RxDB re-emits the new result set. You can subscribe to these updates within your jQuery code and instantly reflect them in the UI. - -### Multi-Tab Support -Running your jQuery app in multiple tabs? RxDB automatically synchronizes changes between those tabs. Users can freely switch windows without missing real-time updates. - - - -### RxDB vs. Other jQuery Database Options -Historically, jQuery developers might use `localStorage` or raw `IndexedDB` for storing data. However, these solutions can require significant boilerplate, lack reactivity, and offer no built-in sync or conflict resolution. RxDB fills these gaps with an out-of-the-box solution, abstracting away low-level database complexities and providing an event-driven, offline-capable approach. - -## Using RxDB in a jQuery Application - -### Installing RxDB -Install RxDB (and `rxjs`) via npm or yarn: -```bash -npm install rxdb rxjs -``` - -If your project isn't set up with a build process, you can still use bundlers like Webpack or Rollup, or serve RxDB as a UMD bundle. Once included, you'll have access to RxDB globally or via import statements. - -## Creating and Configuring a Database - -Below is a minimal example of how to create an RxDB instance and collection. You can call this when your page initializes, then store the `db` object for later use: - -```js -import { createRxDatabase } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -async function initDatabase() { - const db = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage(), - password: 'myPassword', // optional encryption password - multiInstance: true, // multi-tab support - eventReduce: true // optimizes event handling - }); - - await db.addCollections({ - hero: { - schema: { - title: 'hero schema', - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { type: 'string' }, - name: { type: 'string' }, - points: { type: 'number' } - } - } - } - }); - - return db; -} -``` - -## Updating the DOM with jQuery - -Once you have your RxDB instance, you can query data reactively and use jQuery to manipulate the DOM: - -```js -// Example: Displaying heroes using jQuery -$(document).ready(async function () { - const db = await initDatabase(); - - // Subscribing to all hero documents - db.hero - .find() - .$ // the observable - .subscribe((heroes) => { - // Clear the list - $('#heroList').empty(); - - // Append each hero to the DOM - heroes.forEach((hero) => { - $('#heroList').append(` - - ${hero.name} - Points: ${hero.points} - - `); - }); - }); - - // Example of adding a new hero - $('#addHeroBtn').on('click', async () => { - const heroName = $('#heroName').val(); - const heroPoints = parseInt($('#heroPoints').val(), 10); - await db.hero.insert({ - id: Date.now().toString(), - name: heroName, - points: heroPoints - }); - }); -}); -``` - -With this approach, any time data in the `hero` collection changes - like when a new hero is added - your jQuery code re-renders the list of heroes automatically. - -## Different RxStorage layers for RxDB - -RxDB supports multiple storage backends (RxStorage layers). Some popular ones: - -- [LocalStorage.js RxStorage](../rx-storage-localstorage.md): Uses the browsers [localstorage](./localstorage.md). Fast and easy to set up. -- [IndexedDB RxStorage](../rx-storage-indexeddb.md): Direct IndexedDB usage, suitable for modern browsers. -- [OPFS RxStorage](../rx-storage-opfs.md): Uses the File System Access API for better performance in supported browsers. -- [Memory RxStorage](../rx-storage-memory.md): Stores data in memory, handy for tests or ephemeral data. -- [SQLite RxStorage](../rx-storage-sqlite.md): Uses SQLite (potentially via WebAssembly). In typical browser-based scenarios, localstorage or IndexedDB storage is usually more straightforward. - -## Synchronizing Data with RxDB between Clients and Servers - -### Offline-First Approach -RxDB's [offline-first](../offline-first.md) approach allows your jQuery application to store and query data locally. Users can continue interacting, even offline. When connectivity returns, RxDB syncs to the server. - -### Conflict Resolution -Should multiple clients update the same document, RxDB offers [conflict handling strategies](../transactions-conflicts-revisions.md). You decide how to resolve conflicts - like keeping the latest edit or merging changes - ensuring data integrity across distributed systems. - -### Bidirectional Synchronization -With RxDB, data changes flow both ways: from client to server and from server to client. This real-time synchronization ensures that all users or tabs see consistent, up-to-date data. - - - -## Advanced RxDB Features and Techniques - -### Indexing and Performance Optimization -Create indexes on frequently queried fields to speed up performance. For large data sets, indexing can drastically improve query times, keeping your jQuery UI snappy. - -### Encryption of Local Data -RxDB supports [encryption to secure data stored in the browser](../encryption.md). This is crucial if your application handles sensitive user information. - -### Change Streams and Event Handling -Use change streams to listen for data modifications at the database or collection level. This can trigger [real-time](./realtime-database.md) [UI updates](./optimistic-ui.md), notifications, or custom logic whenever the data changes. - -### JSON Key Compression -If your data model has large or repetitive field names, [JSON key compression](../key-compression.md) can minimize stored document size and potentially boost performance. - -## Best Practices for Using RxDB in jQuery Applications - -- Centralize Your Database: Initialize and configure RxDB in one place. Expose the instance where needed or store it globally to avoid re-creating it on every script. -- Leverage Observables: Instead of polling or manually refreshing data, rely on RxDB's reactivity. Subscribe to queries and let RxDB inform you when data changes. -- Handle Subscriptions: If you create subscriptions in a single-page context, ensure you don't re-subscribe endlessly or create memory leaks. Clean them up if you're navigating away or removing DOM elements. -- Offline Testing: Thoroughly test how your jQuery app behaves without a network connection. Simulate offline states in your browser's dev tools or with flight mode to ensure the user experience remains smooth. -- Performance Profiling: For large data sets or frequent data updates, add indexes and carefully measure query performance. Optimize only where needed. - -## Follow Up -To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: - -- [RxDB GitHub Repository](/code/): Visit the official GitHub repository of RxDB to access the source code, documentation, and community support. -- [RxDB Quickstart](../quickstart.md): Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects. -- [RxDB Examples](https://github.com/pubkey/rxdb/tree/master/examples): Browse official examples to see RxDB in action and learn best practices you can apply to your own project - even if jQuery isn't explicitly featured, the patterns are similar. - ---- - -## JSON-Based Databases - Why NoSQL and RxDB Simplify App Development - -# JSON-Based Databases: Why NoSQL and RxDB Simplify App Development - -Modern applications handle highly dynamic, often deeply nested data structures—commonly represented in **JSON**. Whether you're building a real-time dashboard or a fully offline mobile app, storing and querying data in a JSON-friendly way can reduce overhead and coding complexity. This is where **JSON-based databases** (often part of the **NoSQL** family) come into play, letting you store objects in the same format they're used in your code, eliminating the schema wrangling that can come with a strict relational design. - -Below, we explore why JSON-based databases naturally align with **NoSQL** principles, how relational engines (like PostgreSQL or SQLite) handle JSON columns, the pitfalls of storing data in a single plain JSON text file, and the ways [RxDB](https://rxdb.info/) stands out as an offline-first JSON solution for JavaScript developers—complete with advanced features like JSON-Schema and JSON-key-compression. - - - -## Why JSON-Based Databases Are Typically NoSQL - -### Document-Oriented by Nature - -When your data is stored as JSON, each record or document can hold nested arrays and sub-objects with no forced table schema. NoSQL solutions such as [MongoDB](../rx-storage-mongodb.md), [CouchDB](../replication-couchdb.md), [Firebase](../replication-firestore.md), and **RxDB** store and retrieve these documents in their “raw” JSON form. This model integrates smoothly with how front-end applications already handle data, minimizing transformations and improving developer productivity. - -### Flexible, Schema-Agnostic - -Traditional SQL tables enforce rigid column definitions and demand explicit schema migrations when you add or rename a field. By contrast, NoSQL solutions accept more dynamic data structures, allowing changes on the fly. This means a front-end developer can add a new field to a JSON object—perhaps for a new feature—without the friction of redefining or migrating a database schema. While this is possible, it is often not recommended. - -### Aligned With Evolving User Interfaces - -As modern UIs frequently manipulate deeply nested or changing data, developers find it easier to store whole objects directly, saving time that might otherwise be spent performing complex joins or normalizing data. For instance, frameworks like React, Vue, or Angular are inherently comfortable with nested JSON structures, which map more directly to NoSQL’s “document” approach than to relational tables. - -## Is NoSQL “Better” Than SQL? - -It depends on your application. **SQL** remains exceptional for complex aggregations, enforced relationships, and sophisticated transaction handling. But **NoSQL** is often more intuitive and easier to maintain for “document-first” applications that: - -- Thrive on flexible or rapidly evolving data models. -- Rely on hierarchical or nested JSON objects. -- Avoid multi-table joins. -- Require easy horizontal scaling for large sets of documents. - -Relational databases are still a top choice for many enterprise back-ends, especially when advanced analytics or strongly enforced referential integrity is needed. But if your application is predominantly storing and manipulating JSON documents (e.g., user profiles, real-time chat logs, embedded items), a JSON-based or document-oriented approach can greatly reduce friction during development. - -## When to Prefer SQL Instead of JSON/NoSQL -NoSQL solutions—particularly JSON-based document stores—provide a natural fit for flexible, nested data in UI-heavy applications. However, certain scenarios may benefit more from a **SQL** solution: -1. **Complex Relationships**: If your data demands intricate joins across multiple entities (e.g., many-to-many relationships that can’t easily be embedded in a single document), a well-structured relational schema can simplify queries. -2. **Strong Integrity and Constraints**: SQL excels at enforcing constraints such as foreign keys, unique constraints, and advanced triggers. If your system needs strict data validation and complex business logic within the database, SQL might prove more robust. -3. **High-End Analytical Queries**: Relational databases can handle sophisticated aggregations, groupings, and joins more efficiently. If your app frequently runs advanced SQL queries, a NoSQL approach may complicate or slow down analytics. -4. **Legacy Integration**: Many enterprise systems are built around existing relational schemas. A purely NoSQL approach might mean rewriting or bridging systems that are heavily reliant on SQL constraints and transformations. -5. **Transaction Handling**: While many NoSQL solutions have improved transaction support, it can still lag behind well-established SQL transaction models. If ACID properties and multi-operation atomicity are paramount, you might prefer a tried-and-true relational engine. - -In short, if you prioritize advanced relational queries, robust constraints, or complex business rules at the database level, SQL remains a powerful, and possibly superior, choice. For user-centric, fast-evolving JSON data, though, NoSQL or JSON-based solutions often reduce the friction of frequent schema changes. - -## Storing JSON in Traditional SQL Databases - -### JSON Columns in PostgreSQL or MySQL - -To accommodate the demand for flexible data, several SQL engines (notably **PostgreSQL** and MySQL) introduced support for **JSON** columns. PostgreSQL offers the `JSON` and `JSONB` types, enabling developers to store raw JSON in a column. You can also index specific paths within the JSON to speed lookups on nested fields: - -```sql -CREATE TABLE products ( - id SERIAL PRIMARY KEY, - name TEXT, - details JSONB -); - --- Insert a record with JSON data -INSERT INTO products (name, details) VALUES -('Laptop', '{"brand": "BrandX", "features": ["Touchscreen", "SSD"]}'); -``` - -Although this approach merges the best of both worlds (SQL queries + flexible JSON fields), it can also create a “split personality” in your schema. You might store stable data in normal columns, while unpredictable or nested details live inside a JSONB field. Some projects flourish with this hybrid design, others find it a bit unwieldy. - -
    - -
    - -## Storing JSON in SQLite -SQLite also allows storing JSON data, typically as text columns, but with some additional features since **SQLite 3.9** (2015) including the [JSON1 extension](https://www.sqlite.org/json1.html). This extension can parse JSON text, perform queries on JSON fields, and do partial updates. However, storing JSON in SQLite does require you to ensure you’ve compiled SQLite with JSON1 support or to rely on a library that bundles it. While possible, you still won't get quite the same schema-agnostic ease as a full document store, but it’s a pragmatic solution for smaller or embedded needs on the server side—or occasionally in the browser if you run SQLite via WebAssembly. RxDB uses this in its [SQLite storage](../rx-storage-sqlite.md). - -## JSON vs. Database - Why a Plain JSON Text File is a Problem - -Some developers consider storing everything in a single JSON file, typically read and written directly from disk or local storage. This approach, while seemingly simple, usually does not scale. Key issues include: - -- **No Concurrency**: If multiple parts of the application try to write to the same JSON file, you risk overwriting changes. -- **No Indexes**: Finding or filtering items in large JSON text requires scanning everything. This is slow and quickly becomes unmanageable. -- **No Partial Updates**: You often reload the entire file, modify it in memory, then write it back, which is highly inefficient for large data sets. -- **Corruption Risk**: A single corrupted write or partial save might break the entire JSON file, losing all data. -- **High Memory Usage**: The entire file may need to be parsed into memory, even if you only need a fraction of the data. - -Databases—relational or NoSQL—solve these issues by handling concurrency, enabling partial reads/writes, establishing indexes, and ensuring transactional integrity so you don’t lose everything if the process is interrupted mid-write. - -
    - - - -
    - -## RxDB: A JSON-Focused Database for JavaScript Apps - -Many NoSQL databases operate on the server, whereas RxDB is built for client-side usage—browsers, mobile apps, or Node.js. It specializes in JSON documents and embraces an [offline-first](../offline-first.md) philosophy. - -### Key Characteristics -1. **Local JSON Storage** - -RxDB stores each record as a JSON document, closely matching how front-end frameworks handle state. This eliminates complex transformations or manual JSON parsing before writing to a table. - -2. **Reactive Queries** - -Instead of complex SQL, RxDB uses JSON-based [query](../rx-query.md) definitions. You can subscribe to query results, letting your UI automatically refresh when data changes locally or from remote sync updates: - - - -3. **Offline-First Sync** - -Built-in replication plugins push/pull changes to or from a remote server. If your app is offline, updates get stored locally, then sync up seamlessly once a connection is available. - -4. **Optional JSON-Schema** - -Though it’s a document database, RxDB encourages you to define a JSON-based schema for clarity, indexing, and type validation. This helps maintain data consistency while still allowing a measure of flexibility for new fields. - -### Advanced JSON Features in RxDB - -- **JSON-Schema**: By specifying a JSON-Schema, you can define which fields exist, whether they are required, and their data types. This is invaluable for catching malformed documents early and imposing mild structure in a NoSQL setting. - -- **JSON Key-Compression**: Large, verbose field names can bloat storage usage. RxDB’s optional [key-compression plugin](../key-compression.md) automatically shortens field names in your JSON documents internally, reducing disk space and bandwidth: - -```ts -// Example: how key-compression can transform your documents -const uncompressed = { - "firstName": "Corrine", - "lastName": "Ziemann", - "shoppingCartItems": [ - { "productNumber": 29857, "amount": 1 }, - { "productNumber": 53409, "amount": 6 } - ] -}; - -const compressed = { - "|e": "Corrine", - "|g": "Ziemann", - "|i": [ - { "|h": 29857, "|b": 1 }, - { "|h": 53409, "|b": 6 } - ] -}; -``` - -The user sees no difference in their code—RxDB automatically decompresses data on read—but the overhead is drastically reduced behind the scenes. - -## Follow Up - -JSON-based databases naturally align with NoSQL because they accommodate evolving, nested data without rigid schemas. This makes them appealing for many UI-centric or offline-first applications where flexible documents and agile development cycles matter more than heavy relational queries or constraints. - -SQL can still store JSON—whether in PostgreSQL’s JSONB columns, MySQL’s JSON fields, or SQLite’s JSON1 extension. For some teams, a hybrid approach pairing SQL for relational data with JSON columns for more flexible fields works well. However, storing everything in a single monolithic JSON text file is rarely advisable for anything beyond trivial tasks—databases excel at concurrency, indexing, and partial writes. - -Tools like RxDB provide an even simpler, [local-first](./local-first-future.md) take on JSON documents—particularly for JavaScript projects. With offline [replication](../replication.md), reactive queries, optional JSON-Schema, and advanced optimizations such as key-compression, RxDB streamlines building dynamic, user-facing features while preserving the core benefits of a robust document database. - -To explore more about RxDB and its capabilities for browser database development, check out the following resources: - -- [RxDB GitHub Repository](/code/): Visit the official GitHub repository of RxDB to access the source code, documentation, and community support. -- [RxDB Quickstart](../quickstart.md): Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects. -- [RxDB Examples](https://github.com/pubkey/rxdb/tree/master/examples): Browse official examples to see RxDB in action and learn best practices you can apply to your own project - even if jQuery isn't explicitly featured, the patterns are similar. - ---- - -## RxDB - The JSON Database Built for JavaScript - -# RxDB - JSON Database for JavaScript - -Storing data as **JSON documents** in a **NoSQL** database is not just a trend; it's a practical choice. JSON data is highly compatible with various tools and is human-readable, making it an excellent fit for modern applications. JSON documents offer more flexibility compared to traditional SQL table rows, as they can contain nested data structures. This article introduces [RxDB](https://rxdb.info/), an open-source, flexible, performant, and battle-tested NoSQL JSON database specifically designed for **JavaScript** applications. - -
    - - - -
    - -## Why Choose a JSON Database? -- **JavaScript Friendliness**: JavaScript, a prevalent language for web development, naturally uses JSON for data representation. Using a JSON database aligns seamlessly with JavaScript's native data format. - -- **Compatibility**: JSON is widely supported across different programming languages and platforms. Storing data in JSON format ensures compatibility with a broad range of tools and systems. All modern programming ecosystems have packages to parse, validate and process JSON data. - -- **Flexibility**: JSON documents can accommodate complex and nested data structures, allowing developers to store data in a more intuitive and hierarchical manner compared to SQL table rows. Nested data can be just stored in-document instead of having related tables. - -- **Human-Readable**: JSON is easy to read and understand, simplifying debugging and data inspection tasks. - -## Storage and Access Options for JSON Documents -When incorporating JSON documents into your application, you have several storage and access options to consider: - -- **Local In-App Database with In-Memory Storage**: Ideal for lightweight applications or temporary data storage, this option keeps data in memory, ensuring fast read and write operations. However, data is not persistet beyond the current application session, making it suitable for temporary data storage. With RxDB, the [memory RxStorage](../rx-storage-memory.md) can be utilized to create an in-memory database. - -- **Local In-App Database with Persistent Storage**: Suitable for applications requiring data retention across sessions. Data is stored on the user's device or inside of the Node.js application, offering persistence between application sessions. It balances speed and data retention, making it versatile for various applications. With RxDB, a whole range of persistent storages is available. As example, for browser there is the [IndexedDB storage](../rx-storage-indexeddb.md). For server side applications, the [Node.js Filesystem storage](../rx-storage-filesystem-node.md) can be used. There are [many more storages](../rx-storage.md) for React-Native, Flutter, Capacitors.js and others. - -- **Server Database Connected to the Application**: For applications requiring data synchronization and accessibility from multiple processes, a server-based database is the preferred choice. Data is stored on a **remote server**, facilitating data sharing, synchronization, and accessibility across multiple processes. It's suitable for scenarios requiring centralized data management and enhanced security and backup capabilities on the server. RxDB supports the [FoundationDB](../rx-storage-foundationdb.md) and [MongoDB](../rx-storage-mongodb.md) as a remote database server. - -## Compression Storage for JSON Documents - -Compression storage for JSON documents is made effortless with RxDB's [key-compression plugin](../key-compression.md). This feature enables the efficient storage of compressed document data, reducing storage requirements while maintaining data integrity. Queries on compressed documents remain seamless, ensuring that your application benefits from both space-saving advantages and optimal query performance, making RxDB a compelling choice for managing JSON data efficiently. The compression happens inside of the [RxDatabase](../rx-database.md) and does not affect the API usage. The only limitation is that encrypted fields themself cannot be used inside a query. - -## Schema Validation and Data Migration on Schema Changes -Storing JSON documents inside of a database in an application, can cause a problem when the format of the data changes. Instead of having a single server where the data must be migrated, many client devices are out there that have to run a migration. -When your application's schema evolves, RxDB provides [migration strategies](../migration-schema.md) to facilitate the transition, ensuring data consistency throughout schema updates. - -**JSONSchema Validation Plugins**: RxDB supports multiple [JSONSchema validation plugins](../schema-validation.md), guaranteeing that only valid data is stored in the database. RxDB uses the JsonSchema standardization that you might know from other technologies like OpenAPI (aka Swagger). - -```javascript -// RxDB Schema example -const mySchema = { - version: 0, - primaryKey: 'id', // <- define the primary key for your documents - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 // <- the primary key must have set maxLength - }, - name: { - type: 'string', - maxLength: 100 - }, - done: { - type: 'boolean' - }, - timestamp: { - type: 'string', - format: 'date-time' - } - }, - required: ['id', 'name', 'done', 'timestamp'] -} -``` - -## Store JSON with RxDB in Browser Applications -RxDB offers versatile storage solutions for browser-based applications: - -- **Multiple Storage Plugins**: RxDB supports various storage backends, including [IndexedDB](../rx-storage-indexeddb.md), [localstorage](../rx-storage-localstorage.md) and [In-Memory](../rx-storage-memory.md), catering to a range of browser environments. - -- **Observable Queries**: With RxDB, you can create observable [queries](../rx-query.md) that work seamlessly across multiple browser tabs, providing real-time updates and synchronization. - - - -## RxDB JSON Database Performance - -Certainly! Let's delve deeper into the performance aspects of RxDB when it comes to working with JSON data. - -1. **Efficient Querying:** RxDB is engineered for rapid and efficient querying of JSON data. It employs a well-optimized indexing system that allows for lightning-fast retrieval of specific data points within your JSON documents. Whether you're fetching individual values or complex nested structures, RxDB's query performance is designed to keep your application responsive, even when dealing with large datasets. - -2. **Scalability:** As your application grows and your [JSON dataset](./json-based-database.md) expands, RxDB scales gracefully. Its performance remains consistent, enabling you to handle increasingly larger volumes of data without compromising on speed or responsiveness. This scalability is essential for applications that need to accommodate growing user bases and evolving data needs. - -3. **Reduced Latency:** RxDB's streamlined data access mechanisms significantly reduce latency when working with JSON data. Whether you're reading from the database, making updates, or synchronizing data between clients and servers, RxDB's optimized operations help minimize the delays often associated with data access. Observed queries are optimized with the [EventReduce algorithm](https://github.com/pubkey/event-reduce) to provide nearly-instand UI updates on data changes. - -4. **RxStorage Layer**: Because RxDB allows you to swap out the storage layer. A storage with the most optimal performance can be chosen for each runtime while not touching other database code. Depending on the access patterns, you can pick exactly the storage that is best: - - - -## RxDB in Node.js -Node.js developers can also benefit from RxDB's capabilities. By integrating RxDB into your Node.js applications, you can harness the power of a NoSQL JSON db to efficiently manage your data on the server-side. RxDB's flexibility, performance, and essential features are equally valuable in server-side development. [Read more about RxDB+Node.js](../nodejs-database.md). - -## RxDB to store JSON documents in React Native - -For mobile app developers working with React Native, RxDB offers a convenient solution for handling JSON data. Whether you're building Android or iOS applications, RxDB's compatibility with JavaScript and its ability to work with JSON documents make it a natural choice for data management within your React Native apps. [Read more about RxDB+React-Native](../react-native-database.md). - -## Using SQLite as a JSON Database -In some cases, you might want to use SQLite as a backend storage solution for your JSON data. RxDB can be configured [to work with SQLite](../rx-storage-sqlite.md), providing the benefits of both a relational database system and JSON document storage. This hybrid approach can be advantageous when dealing with complex data relationships while retaining the flexibility of JSON data representation. - -## Follow Up -To further explore RxDB and get started with using it in your frontend applications, consider the following resources: - -- [RxDB Quickstart](../quickstart.md): A step-by-step guide to quickly set up RxDB in your project and start leveraging its features. -- [RxDB GitHub Repository](https://github.com/pubkey/rxdb): The official repository for RxDB, where you can find the code, examples, and community support. - -By embracing [RxDB](https://rxdb.info/) as your **JSON database** solution, you can tap into the extensive capabilities of JSON data storage. This empowers your applications with offline accessibility, caching, enhanced performance, and effortless data synchronization. RxDB's focus on JavaScript and its robust feature set render it the perfect selection for frontend developers in pursuit of efficient and scalable data storage solutions. - ---- - -## What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications - - -A **local database** is a data storage system residing on a user's device, allowing applications to store, query, and manipulate information without needing continuous network access. This approach prioritizes quick data retrieval, efficient updates, and the ability to function in [offline-first](../offline-first.md) scenarios. In contrast, server-based databases require an active internet connection for each request and response cycle, making them more vulnerable to latency, network disruptions, and downtime. - -Local databases often leverage technologies such as **IndexedDB**, **SQLite**, or **WebSQL** (though WebSQL has been deprecated). These technologies manage both structured data (like relational tables) and unstructured data (such as JSON documents). When connectivity is restored, local databases typically sync their changes back to a central server-side database, maintaining consistent and up-to-date records across multiple devices. - -### Use Cases of Local Databases - -Local databases are particularly beneficial for: - -- **Offline Functionality**: Essential for apps that must remain usable without a consistent internet connection, such as note-taking apps or offline-first CRMs. Users can continue adding and editing data, then sync changes once they reconnect. -- **Low Latency**: By reducing round-trips to remote servers, local databases enable real-time responsiveness. This feature is critical for interactive applications such as gaming platforms, data dashboards, or analytics tools that need near-instant feedback. -- **Data Synchronization**: Many modern applications - like chat systems or collaborative editing tools - require continuous data exchange between multiple users or devices. Local databases can handle intermittent connectivity gracefully, queuing updates locally and syncing them when possible. - -In addition, local databases are increasingly integral to **Progressive Web Apps (PWAs)**, offering a native app-like user experience that is fast and available, even when offline. - -### Performance Optimization - -The primary performance benefit of a local database is its proximity to the application: queries and updates happen directly on the user's device, eliminating the overhead of multiple network hops. Common optimizations include: - -- **Caching**: Storing frequently accessed data in memory or on disk to minimize expensive operations. -- **Batching Writes**: Grouping database operations into a single write transaction to reduce overhead and lock contention. -- **Efficient Indexing**: Using appropriate indexes to speed up queries, especially important for applications that handle large data sets or frequent lookups. - -These techniques ensure that local databases run smoothly, even on lower-powered or [mobile devices](./mobile-database.md). - - - -### Security and Encryption - -Storing data on user devices introduces unique security considerations, such as the risk of physical theft or unauthorized access. Consequently, many local databases support **encryption** options to safeguard sensitive information. Developers can implement additional security measures like **device-level encryption**, **secure storage plugins**, and user authentication to further protect data from prying eyes. - ---- - -
    - - - -
    - -## Why RxDB is Optimized for JavaScript Applications - -RxDB (Reactive Database) is an offline-first, NoSQL database designed to meet the needs of modern JavaScript applications. Built with a focus on reactivity and real-time data handling, RxDB excels in scenarios where low-latency, offline availability, and scalability are essential. - -### Real-Time Reactivity - -At the core of RxDB is **reactive programming**, allowing you to subscribe to changes in your data collections and receive immediate UI updates when records change - no manual polling or refetching required. For instance, a chat application can display incoming messages as soon as they arrive, maintaining a smooth and responsive experience. - - - -### Offline-First Support - -RxDB's primary design goal is to work seamlessly in offline environments. Even if your device loses internet connectivity, RxDB enables you to continue reading and writing data. Once the connection is restored, all pending changes are automatically synchronized with your backend. This [offline-first approach](../offline-first.md) is ideal for productivity apps, field service tools, and other scenarios where reliability and user autonomy are paramount. - -### Flexible Data Replication - -A standout feature of RxDB is its [bi-directional replication](../replication.md). It supports synchronization with a variety of backends, such as: - -- [CouchDB](../replication-couchdb.md): Via the CouchDB replication, facilitating easy integration with any Couch-compatible server. -- [GraphQL Endpoints](../replication-graphql.md): Through community plugins, developers can replicate JSON documents to and from GraphQL servers. -- [Custom Backends](../replication-http.md): RxDB provides hooks to build custom replication strategies for proprietary or specialized server APIs. - -This flexibility ensures that RxDB fits into diverse architectures without locking you into a single vendor or technology stack. - -### Schema Validation and Versioning - -Rather than relying on implicit data models, RxDB leverages **JSON schema** to define document structures. This approach promotes data consistency by enforcing constraints such as required fields and acceptable data formats. As your application grows and changes, RxDB's built-in **schema versioning** and migration tools help you evolve your database schema safely, minimizing risks of data corruption or loss. - -### Rich Plugin Ecosystem - -One of RxDB's greatest strengths is its **pluggable architecture**, allowing you to add functionality as needed: - -- [Encryption](../encryption.md): Secure your data at rest using advanced encryption plugins. -- [Full-Text Search](../fulltext-search.md): Integrate powerful text search capabilities for applications that require quick and flexible query options. -- [Storage Adapters](../rx-storage.md): Swap out the underlying storage layer (e.g., [IndexedDB in the browser](../rx-storage-indexeddb.md), [SQLite](../rx-storage-sqlite.md) in [React Native](../react-native-database.md), or a custom engine) without rewriting your application logic. - -You can fine-tune RxDB to your exact needs, avoiding the performance overhead of unnecessary features. - -### Multi-Platform Compatibility - -RxDB is a perfect fit for cross-platform development, as it supports numerous environments: - -- **Browsers (IndexedDB)**: For web and PWA projects. -- **Node.js**: Ideal for server-side rendering or background services. -- **React Native**: Leverage SQLite or other adapters for mobile app development. -- [Electron](../electron-database.md): Create offline-capable desktop apps with a unified codebase. - -This versatility empowers teams to reuse application logic across multiple platforms while maintaining a consistent data model. - -### Performance Optimization - -With **lazy loading** of data and the ability to utilize efficient storage engines, RxDB delivers high-speed operations and quick response times. By minimizing disk I/O and leveraging indexes effectively, RxDB ensures that even large-scale applications remain performant. Its reactive nature also helps avoid unnecessary re-renders, improving the end-user experience. - -### Proven Reliability - -RxDB is battle-tested in production environments, handling use cases from small single-user applications to large-scale enterprise solutions. Its robust replication mechanism resolves conflicts, manages concurrent writes, and ensures data integrity. The active open-source community provides ongoing support, documentation updates, and feature improvements. - -### Developer-Friendly Features - -For developers, RxDB offers: - -- **Straightforward APIs**: Built on top of familiar JavaScript paradigms like promises and observables. -- **Excellent Documentation**: Detailed guides, tutorials, and references for every major feature. -- **Rich Community Support**: Benefit from an active ecosystem of contributors creating plugins, answering questions, and maintaining core libraries. - -These qualities streamline development, making RxDB an appealing choice for teams of all sizes. - ---- - -## Follow Up - -Ready to get started? Here are some next steps: - -- Try the [Quickstart Tutorial](../quickstart.md) and build a basic project to see RxDB in action. -- Compare RxDB with [other local database solutions](../alternatives.md) to determine the best fit for your unique requirements. - -Ultimately, **RxDB** is more than just a database - it's a robust, reactive toolkit that empowers you to build fast, resilient, and user-centric applications. Whether you're creating an offline-first note-taking app or a real-time collaborative platform, RxDB can handle your local storage needs with ease and flexibility. - ---- - -## Why Local-First Software Is the Future and its Limitations - -import {Tabs} from '@site/src/components/tabs'; -import {Steps} from '@site/src/components/steps'; -import {QuoteBlock} from '@site/src/components/quoteblock'; -import {VideoBox} from '@site/src/components/video-box'; - -# Why Local-First Software Is the Future and what are its Limitations - -Imagine a web app that behaves seamlessly even with zero internet access, provides sub-millisecond response times, and keeps most of the user's data on their device. This is the **local-first** or [offline-first](../offline-first.md) approach. Although it has been around for a while, local-first has recently become more practical because of **maturing browser storage APIs** and new frameworks that simplify **data synchronization**. By allowing data to live on the client and only syncing with a server or other peers when needed, local-first apps can deliver a user experience that is **fast, resilient**, and **privacy-friendly**. - -However, local-first is no silver bullet. It introduces tricky distributed-data challenges like conflict resolution and schema migrations on client devices. In this article, we'll dive deep into what local-first means, why it's trending, its pros and cons, and how to implement it in real applications. We'll also discuss other tools, criticisms, backend considerations, and how local-first compares to traditional cloud-centric approaches. - -## What is the Local-First Paradigm - -In **local-first** software, the primary copy of your data lives on the **client** rather than a remote server. Rather than sending each read or write over the network, you store and manipulate data in a [local database](./local-database.md) on the user’s device. Sync then happens in the background, ensuring all devices eventually converge to a consistent state. - -This approach is increasingly popular because it leads to **instant** app responses (no network delay for most operations), genuine **offline capability**, and more direct **data ownership** for users. Local-first apps also sidestep outages and if the server or internet goes down, users can keep working with their local data. When connectivity returns, everything syncs. This makes the user experience **more resilient** and gives them control of their data, which is especially appealing when privacy concerns or limited connectivity are key factors. - -Local-First software: A set of principles for software that enables both collaboration and ownership for users. Local-first ideals include the ability to work offline and collaborate across multiple devices, while also improving the security, privacy, long-term preservation, and user control of data. - -## Why Local-First is Gaining Traction - -The push for local-first is driven by a few key new technological capabilities that previously restricted client devices from running heavy local-first computing: - -- **Relaxed Browser Storage Limits**: In the past, true local-first web apps were not very feasible due to **storage limitations** in browsers. Early web storage options like cookies or [localStorage](./localstorage.md#understanding-the-limitations-of-local-storage) had tiny limits (~5-10MB) and were unsuitable for complex data. Even **IndexedDB**, the structured client storage introduced over a decade ago, had restrictive quotas on many browsers: For example, older Firefox versions would **prompt the user if more than 50MB** was being stored. Mobile browsers often capped IndexedDB to 5MB without user permission. Such limits made it impractical to cache large application datasets on the client. However, modern browsers have dramatically [increased these limits](./indexeddb-max-storage-limit.md). Today, IndexedDB can typically store **hundreds of megabytes to multiple gigabytes** of data, depending on device capacity. Chrome allows up to ~80% of free disk space per origin (tens of GB on a desktop), Firefox now supports on the order of gigabytes per site (10% of disk size), and even Safari (historically strict) permits around 1GB per origin on iOS. In short, the storage quotas of 5-50MB are a thing of the past and modern web apps can cache very large datasets locally without hitting a ceiling. This shift in storage capabilities has unlocked new possibilities for **local-first web apps** that simply weren't viable a few years ago. - -- **New Storage APIs (OPFS)**: The new Browser API [Origin Private File System](../rx-storage-opfs.md) (OPFS), part of the File System Access API, enables near-native file I/O from within a browser. It allows web apps to manage file handles securely and perform fast, synchronous reads/writes in Web Workers. This is a huge deal for local-first computing because it makes it feasible to embed robust database engines directly in the browser, persisting data to real files on a virtual filesystem. With OPFS, you can avoid some of the performance overhead that comes with [IndexedDB-based workarounds](../slow-indexeddb.md), providing a near-native [speed experience](./localstorage-indexeddb-cookies-opfs-sqlite-wasm.md#big-bulk-writes) for file-structured data. - - - - **Bandwidth Has Grown, But Latency Is Capped**: Internet infrastructure has rapidly expanded to provide higher throughput making it possible to transfer large amounts of data more quickly. However, latency (i.e., round-trip delay) is constrained by the **speed of light** and other physical limitations in fiber, satellite links, and routing. We can always build out bigger "pipes" to stream or send bulk data, but we can't significantly reduce the base round-trip time for each request. This is a physical limit, not a technological one. Local-first strategies mitigate this fundamental latency limit by avoiding excessive client-server calls in interactive workflows, once data is on the client, it's instantly available for reads and writes without waiting on a network round-trip. Imagine, transferring **around 100,000** "average" JSON documents might only consume **about the same bandwidth as two frames of a 4K YouTube video** which can be transferred in milliseconds. This shows just how far raw data throughput has come. Yet each request still has a 100-200ms latency or more, which becomes noticeable in user interactions. Local-first mitigates this by minimizing round-trip calls during active use and using the available bandwidth to directly transfer most of the data on the first app start. - -- **WebAssembly**: Another advancement is **WebAssembly (WASM)**, which allows developers to compile low-level languages (C, C++, Rust) for execution in the browser at near-native speed. This means database engines, search algorithms, [vector databases](./javascript-vector-database.md), and other performance-heavy tasks can run right on the client. However, a key limitation is that **WASM cannot directly access persistent storage APIs** in the browser. Instead, all data must be send from WASM to JavaScript (or the main thread) and then go through something like IndexedDB or OPFS. This extra indirection [is slower](./localstorage-indexeddb-cookies-opfs-sqlite-wasm.md) compared to plain JavaScript->storage calls. Looking ahead, there might come up future APIs that allow WASM to interface with persistent storage directly, and if those land, local-first systems could see another major boost in [performance](../rx-storage-performance.md). - -- **Improvements in Local-First Tooling**: A major factor fueling the rise of local-first architectures is the **dramatic leap in client-side tooling and performance**. For instance, consider a local-first **email client** that stores **one million messages**. In 2014, searching through that many documents, especially with something like early PouchDB, could take **minutes** in a browser. Today, with advanced offline databases like **RxDB**, you can use the [OPFS storage](../rx-storage-opfs.md) with [sharding](../rx-storage-sharding.md) across multiple [web workers](../rx-storage-worker.md) (one per CPU) and use [memory-mapped](../rx-storage-memory-mapped.md) techniques. The result is a **regex search** of one million of these email documents in around **120 milliseconds** - all in JavaScript, running inside a standard web browser, on a mobile phone. - - Better yet, this performance ceiling is likely to keep rising. Newer browser features and **WebAssembly** optimizations could enable even faster indexing and query operations, closing the gap with native desktop clients. I even experimented with GPU-accelarated queries (using **WebGPU**) which, while still in experimental stage, might deliver client-side performance that outperforms servers which do not have a graphics card. - These transformations highlight why local-first has become truly practical: not only can you sync and work offline, but you can handle **serious data loads** with performance that would have been unthinkable just a few years ago. - -## What you can expect from a Local First App - -[Jevons' Paradox](https://en.wikipedia.org/wiki/Jevons_paradox) says that making a _resource cheaper or more efficient to use often leads to greater overall consumption_. Originally about coal, it applies to the local-first paradigm in a way where we require apps to have more features, simply because it is technically possible, the app users and developers start to expect them: - -### User Experience Benefits - - -- **Performance & UX:** Running from local storage means **low latency** and instantaneous interactions. There's no round-trip delay for most operations. Local-first apps aim to provide [near-zero latency](./zero-latency-local-first.md) responses by querying a local database instead of waiting for a server response​. This results in a snappy UX (often no need for loading spinners) because data reads/writes happen immediately on-device. Modern users expect real-time feedback, and local-first delivers that by default. - -- **User Control & Privacy:** Storing data locally can limit how much sensitive information is sent off to remote servers. End users have greater control over their data, and the app can implement [client-side encryption](../encryption.md), thereby reducing the risk of mass data breaches. Its even possible to only replicated encrypted data with a server so that the backend does not know about the data at all and just acts as a backup/replication endpoint. - - - - **Offline Resilience:** Obviously, being able to work offline is a major benefit. Users can continue using the app with no internet (or flaky connectivity), and their changes sync up once online. This is increasingly important not just for remote areas, but for any app that needs to be available 24/7. Even though mobile networks have improved, connectivity can still drop; local-first ensures the app doesn't grind to a halt. The app _"stores data locally at the client so that it can still access it when the internet goes away."_ - -- **Realtime Apps**: Today's users expect data to stay in sync across browser tabs and devices without constant page reloads. In a typical cloud app, if you want real-time updates (say to show that a friend edited a document), you'd need to implement a [websocket or polling](./websockets-sse-polling-webrtc-webtransport.md) system for the server to push changes to clients, which is complex. Local-first architectures naturally lend themselves to realtime-by-default updates because the application state lives in a local database that can be observed for changes. Any edits (local or incoming from the server) immediately trigger [UI updates](./optimistic-ui.md). Similarly, background sync mechanisms ensure that new server-side data flows into the local store and into the user interface right away, no need to hit F5 to fetch the latest changes like on a traditional webpage. - - - - - -### Developer Experience Benefits - -- **Reduced Server Load**: Because local-first architectures typically **transfer large chunks of data once** (e.g., during an initial sync) and then sync only small diffs (delta changes) afterward, the server does not have to handle repeated requests for the same dataset. This bulk-first, diff-later approach drastically decreases the total number of round-trip requests to the backend. In scenarios where hundreds of simultaneous users each require continuous data access, an offline-ready client that only periodically sends or receives changes can scale more efficiently, freeing your servers to handle more users or other tasks. Instead of being bombarded with frequent small queries and updates, the server focuses on periodic sync operations, which can be more easily optimized or batched. It **Scales with Data, Not Load**. In fact for most type of apps, most of the data itself rarely changes. Imagine a CRM system, how often does the data of a customer really change compared to how of a user open the customer-overview page which would load data from a server in traditional systems? - -- **Less Need for Custom API Endpoints**: A local-first architecture often simplifies backend design. Instead of writing extensive REST routes for each client operation (create, read, update, delete, etc.), you can build a **single replication endpoint** or a small set of endpoints to handle data synchronization for each entity. The client manages local data, merges edits, and pushes/pulls changes with the server automatically. This not only **reduces boilerplate code** on the backend but also **frees developers** to focus on business logic and domain-specific concerns rather than spending time creating and maintaining dozens of narrowly scoped endpoints. As a result, the overall system can be easier to scale and maintain, delivering a **smoother developer experience**. - -- **Simplified State Management in Frontend**: Because the local database holds the authoritative state, you might rely less on complex state management libraries (Redux, MobX, etc.). The DB becomes a single source of truth for your UI. In an offline-first app, your global state is already there in a single place stored inside of the local database, so you don't need as many in-memory state layers to synchronize​. The UI can directly bind to the database (using queries or reactive subscriptions). All sources of changes (user input, remote updates, other tabs) funnel through the database. This can significantly reduce the "glue code" to keep UI state in sync with server state because the local DB does that for you. With Local-First tools, "you might not need Redux" because the reactive DB fulfills that role​ of state management already. - -- **Observable Queries**: One of the big advantages of storing data locally is the ability to **subscribe** to data changes in real time, often called **observable queries**. When the data changes - either from the user's actions or from a remote sync - the local database automatically updates the subscribed query results, and the UI can redraw without a manual refresh. This reactive pattern can make apps feel much more live and responsive. - - In the beginnings this was mostly done by watching a changes feed (like in PouchDB) and **re-running queries** whenever data changed. However, this early approach was **slow and didn't scale well**, because the entire query had to be recalculated each time. Later, RxDB introduced the [EventReduce Algorithm](https://github.com/pubkey/event-reduce), which merges incoming document changes into an existing query result by using a big [binary decision tree](https://github.com/pubkey/binary-decision-diagram). With this, updated query results can be "calculated" on the CPU instead of re-running them over the database. This makes query updates almost instantaneous and scales better as your data grows. Nowadays, many local databases have added similar features: for example, **dexie.js** introduced `liveQuery`, letting developers build real-time UIs without repeatedly scanning the entire dataset. - -- **Better Multi-Tab and Multi-Device Consistency**: Because the source of truth is on the client, if the user has the app open in multiple tabs or even multiple devices, each has a full copy of the data. In browsers, many offline databases use a storage like IndexedDB that is shared across tabs of the same origin. This means all tabs see the same up-to-date local state. For example, if a user logs in or adds data in one tab, the other tab can automatically reflect that change via the shared local DB and events​. This solves a common issue in web apps where one tab doesn't know that something changed in another tab. With local-first, **multi-tab just works** by default because there's "exactly one state of the data across all tabs". Similarly, on multiple devices, once sync runs, each device eventually converges to the same state. - - > If your users have to press F5 all the time, your app is broken! - -- **Potential for P2P and Decentralization**: While most current local-first apps still use a central backend for syncing, the paradigm opens the door to [peer-to-peer data syncing](../replication-webrtc.md). Because each device has the full data, devices could sync directly via LAN or other P2P channels for collaboration, reducing reliance on central servers. There are experimental frameworks that allow truly decentralized sync. This is a more advanced benefit, but it aligns with the ethos of giving users more control and reducing dependence on any one cloud provider. - -These advantages show why developers are excited about local-first. You get happier users thanks to a fast, offline-capable app, and you can differentiate your product by working in scenarios where others fail (e.g. poor connectivity). Companies like Google, Amazon, etc., invest heavily in reducing latency and adding offline modes for a reason: it improves retention and usability. Local-first design takes that to the extreme by default. - -## Challenges and Limitations of Local-First - -However, this approach is not without significant challenges. It's important to understand the drawbacks and trade-offs before deciding to go all-in on local-first. Let's examine the flip side. - -You fully understood a technology when you know when not to use it - -Critics of local-first approaches often point out these challenges. Here's a comprehensive list of cons, criticisms, and obstacles associated with local-first development and proposed solutions on how to solve these obstacles: - -- **Data Synchronization**: Data synchronization is arguably the hardest part of local-first development, because when every user's device can be offline for extended periods, data inevitably diverges. Ensuring those changes propagate and reconcile with minimal user headaches is a major challenge in distributed systems. Two main approaches have emerged: - - **Use a bundled frontend+backend solution** where the backend is tightly coupled to the client SDK and knows exactly how to handle sync. A common example is Firestore (part of the Firebase ecosystem) where Google's servers and client libraries collectively manage storage, change detection, conflict resolution, and syncing. The upside is you have a turnkey solution, developers can focus on features rather than writing sync logic. The downside is lock-in, because the sync protocol is proprietary and tailored to that vendor. In many organizations, this is a non-starter: existing company infrastructure can't be uprooted or replaced just for a single offline-capable app. This lock-in issue can arise even if the backend is not strictly a third-party vendor but simply another technology like PostgreSQL, because it still forces you to consolidate all your data into a single system that you might not use otherwise. - - - **Custom Replication with Your Own Endpoints**: Alternatively, tools like RxDB allow you to implement your own replication endpoints on top of your existing infrastructure. This is the approach relies on a lightweight, git-like [Sync Engine](../replication.md). The server remains relatively "dumb," focusing on storing revisions, tracking changes, and marking conflicts, while the client library does the actual [conflict resolution](../transactions-conflicts-revisions.md). During sync, if the server detects a conflict (e.g., two offline edits to the same document), it notifies the client, which then decides how to merge them, whether via last-write-wins, a custom merge function, or a [CRDT](../crdt.md). Setting up custom endpoints does require more development effort, but you avoid vendor lock-in and can integrate seamlessly with your existing database(s). Your system simply needs to support incrementally fetching changes (pull) and accepting local modifications (push), which can be layered on top of nearly any data store or architecture. - - Tools which support "any backend" are of course harder to monetize because they cannot sell SaaS services or a Cloud Subscription which is why most tools use a fixed backend instead of an open Sync Engine. - - -- **Conflict Resolution**: When multiple offline edits happen on the same data, you inevitably get **merge conflicts**. For example, if two users (or the same user on two devices) both edit the same document offline, when both sync, whose changes win? Local-first systems need a conflict resolution strategy. Some systems use **last-write-wins** (firestore) or deterministic revision hashing to pick a "winner" (as in CouchDB/PouchDB)​. This is simple but may drop one user's changes. Other approaches keep both versions and merge them either via an implement ["merge-function"](../transactions-conflicts-revisions.md#custom-conflict-handler) or require a **manual merge** step (e.g., like git conflicts or showing the user a diff UI). More advanced solutions involve **CRDTs (Conflict-free Replicated Data Types)** which mathematically merge changes (used for rich text collaboration, for instance). Libraries like Automerge or Yjs implement CRDTs to "magically solve conflicts". But in practice, using CRDTs is also complex and has its own trade-offs and sometimes not even possible like when you need additional data from another instance for a "correct" merge. No matter which route, handling conflicts adds complexity to your app logic or infrastructure. In cloud-based (online-first) apps, you avoid this because everyone is always editing the single up-to-date copy on the server. Local-first shifts that burden to the client side. - - Here is an example on how a client-side merge functions works in RxDB: - - ```ts - import { deepEqual } from 'rxdb/plugins/utils'; - export const myConflictHandler = { - /** - * isEqual() is used to detect if two documents are - * equal. This is used internally to detect conflicts. - */ - isEqual(a, b) { - /** - * isEqual() is used to detect conflicts or to detect if a - * document has to be pushed to the remote. - * If the documents are deep equal, - * we have no conflict. - * Because deepEqual is CPU expensive, - * on your custom conflict handler you might only - * check some properties, like the updatedAt time or revision-strings - * for better performance. - */ - return deepEqual(a, b); - }, - /** - * resolve() a conflict. This can be async so - * you could even show an UI element to let your user - * resolve the conflict manually. - */ - async resolve(i) { - /** - * In this example we drop the local state and use the server-state. - * This basically implements a "first-on-server-wins" strategy. - * - * In your custom conflict handler you could want to merge properties - * of the i.realMasterState, i.assumedMasterState and i.newDocumentState - * or return i.newDocumentState to have a "last-write-wins" strategy. - */ - return i.realMasterState; - } - }; - ``` - -- **Eventual Consistency (No Single Source of Truth):** A local-first system is **eventually consistent** by nature. There is no single authoritative copy of the data at all times. Instead you have one per device (and maybe one on the server), and they sync to become consistent eventually. This means at any given moment, two users might not see the same data if one hasn't synced recently. Users could even make decisions based on stale data. In many applications this is acceptable (the data will catch up), but for some scenarios it's problematic. For instance, an offline-first banking app that lets you initiate a money transfer offline could be dangerous if the account balance was out-of-date or if the transfer needs immediate consistency. Essentially, **not all apps can tolerate eventual consistency**. If your use case demands strong consistency (e.g., inventory systems where overselling is a big issue, or real-time collaborative editing where every keystroke must be seen by others instantly), a purely local-first approach might need augmentation or may not fit. - -- **Initial Data Load and Data Size Limits:** Local-first requires pulling data **down to the client**. If your dataset is huge (gigabytes), it's simply not feasible to download everything to every client. For example, syncing every tweet on Twitter to every user's phone is impossible. Local-first works best when the data set per user is reasonably sized (up to 2 Gigabytes). In practice, you often **limit the data** to just that user's own data or a subset relevant to them. Even then, on first use the app might need to download a significant chunk of data to initialize the local database. There is a **upper bound on dataset size** beyond which the initial sync or storage needs become impractical. You cannot assume unlimited local storage. If your data is too large, local-first will either fail or you'll need to only sync partial data (and then handle what happens if the needed data isn't present locally). In short, **local-first is unsuitable for massive datasets** or data that cannot be partitioned per user. - - -- **Storage Persistence (Browser Limitations):** Storing data in the browser (via IndexedDB or similar) is not as durable as on a server disk. Browsers may **evict data** to save space (especially on mobile devices). For instance, Safari notoriously wipes out IndexedDB data if the user hasn't used the site in ~7 days. Other browsers have their own eviction policies for offline data. Also, users can at any time clear their browser storage (intentionally or via something like "Clear site data"). This means the local data **cannot be 100% trusted to stay forever**. A well-behaved local-first app needs to be able to recover if local data is lost, usually by pulling from the server again​. Essentially, the server still often serves as a backup. But if your app had any purely local data (not intended to sync), that's at risk. **Mobile apps** (with SQLite or filesystem storage) are a bit more stable than web browsers, but even there, uninstalls or certain OS actions can remove local data. This is a challenge: How to cache data offline for speed while ensuring if it's wiped, the user doesn't lose everything important. Cloud-only apps by contrast keep data in the cloud so it's typically safe unless the server fails (and servers are easier to backup reliably). - -- **Complex Client-Side Logic & Increased App Size**: A local-first app tends to be more complex on the client side. You're essentially putting what used to be server responsibilities (storage, query engine, sync logic) into the frontend. This can increase the size of your frontend bundle (including a database library, possibly CRDT or sync code, etc.). It also increases memory and CPU usage on the client, as the browser/phone is doing more work. Low-end devices or older phones might struggle if the app is not optimized. Developers need to consider performance tuning for the local database (indexing, query efficiency) just like they would on a server. So while the user gains benefits, the app developer has to manage this complexity. - -- **Performance Constraints in JavaScript:** Even though devices are fast, a local JS database is generally **slower than a server DB** on robust hardware. There are many layers (JS -> IndexedDB -> possibly SQLite under the hood) that add overhead​. For example, inserting a record might go through the DB library, the storage engine, the browser's implementation, down to disk. For most UI uses this is fine (you don't need 10k writes/sec in a to-do app, you need maybe a few writes per second at most). But if your app does heavy data processing, the browser might become a bottleneck. - - The key question is _"Is it fast enough?"_. Often the answer is yes for typical usage, but developers must be mindful of not doing something on the client that truly requires big iron servers. For instance, full-text indexing of a million documents might be too slow in a client-side DB. **Unpredictable performance** is also a factor: Different users have different devices. A query that takes 50ms on a high-end desktop might take 500ms on a low-end phone in battery saving mode. So performance tuning and testing across devices is needed, and some heavy tasks might still belong on the server side​. For example if you build a [local vector database](./javascript-vector-database.md) you might want to create the embeddings on the server and sync them instead of creating them on the client. - -- **Client Database Migrations:** As your app evolves, you'll change data models or add new fields. In a cloud-first app, you'd typically run a migration on the server database. In a local-first app, you have not only the server DB (if any) but also every client's local database to consider. Upgrading the schema means you need to write migration logic that runs on each client, perhaps the next time they launch the app after an update. Clients may be offline or not upgrade the app immediately, so you could have different versions of the schema in the wild. This complicates data handling (the sync protocol might need to handle multiple schema versions until everyone is updated). Providing a smooth migration path for local data is doable (many libraries provide [migration facilities](../migration-schema.md)), but it requires careful testing. In a worst case, a failed migration on a client could brick the app for that user or force a full resync. This is a **much bigger headache** than just migrating a centralized DB at midnight while your service is in maintenance mode. 🌃 - -- **Security and Access Control:** In cloud-based apps, enforcing data security (who can see what) is done on the server. The client only gets the data it's authorized to get. In a local-first scenario, you often need to **partition data per user** on the backend as well, to ensure users only sync down their own data (or data they have permission for). One simple strategy is to give each user their own database or dataset on the server and only replicate that. For example, CouchDB allows creating one database per user and replication can be scoped to that DB which makes permission handling easy. But if you ever need to query across users (say an admin view or aggregate analytics), having data split into many small DBs becomes a pain. The alternative is a single backend database with a **fine-grained access control**, and the client asks to sync only certain documents/fields. That usually means writing a custom sync server or using something like GraphQL with resolvers that respect permissions. In short, **implementing auth and permissions in sync** adds complexity. Also, any data stored on the client is theoretically vulnerable to extraction (if someone compromises the device or uses dev tools). You can [encrypt local databases](../encryption.md) to prevent extraction after the server "revokes" the decryption password to mitigate the data extraction risk. - - -- **Relational Data and Complex Queries:** Most client-side/offline databases are [NoSQL/document oriented](../why-nosql.md) for flexibility in syncing and easy conflict handling. They may not support complex join queries or ACID transactions across multiple tables like a full SQL database would. This is partly because replicating a full relational model is much harder (maintaining referential integrity, etc., when data is partial on a client) or not even logically possible. For example if you have two offline clients running a complex `UPDATE X WHERE Y FROM Z INNER JOIN Alice INNER JOIN Bob` query and then they go online, you have no easy way of handling these conflicts. - - If your app has heavy relational data requirements or relies on complex server-side queries (aggregations, multi-join reports), you might find the local database either cannot do it or is too slow to do it client-side. The lack of robust relational querying is something to plan for and you might need to adjust your data model to be more document-oriented or use client-side libraries to run [joins in memory](../why-nosql.md#relational-queries-in-nosql). Most tools use NoSQL because it makes replication easy and implementing true relational sync would require extremely sophisticated solutions and even needing an atomic clock for full consistency across nodes (like google spanner). So, **if your app truly needs SQL power on the client**, local-first might complicate things. - - > In Local-First, most tools use NoSQL because it makes replication and conflict handling easy. - -That's a long list of challenges! In summary, local-first approaches introduce distributed data issues on the client side that web developers usually didn't have to deal with. Despite these challenges, the local-first movement is steadily growing because the **benefits to user experience and data control are very compelling** and modern tools are emerging to mitigate a lot of these difficulties. All of these are solved or solvable for your specific use-case, just keep them in mind before you start architecting your local-first app. - -## Local-First vs. Traditional Online-First Approaches - -So now that you know the pros and cons about Local-First. Lets directly compare it to your previous "online-first" stack: - -### Connectivity and Offline Usage -- **Local-first**: Apps like WhatsApp store messages locally on your device, letting you read past messages and even compose new ones without a stable network connection. Once online, the messages sync with the server and other participants. -- **Online-first**: Purely cloud-based apps typically stop functioning (beyond simple caching) when the network or server goes down. They rely on a constant connection to fetch or store user data. - -### Latency and Performance -- **Local-first**: Because data operations happen on the device, you see near-instant interactions (e.g., typing and reading chats feels very responsive, as the messages are on your phone). Syncing occurs in the background without delaying the user. -- **Online-first**: Most interactions involve a round-trip to the server, adding network latency and potentially requiring loading states or fallback UIs. If the network is slow or unreliable, users can experience delays when sending or receiving updates. - -### Complexity and Conflict Resolution -- **Local-first**: Much of the complexity like storing data or handling conflicts, shifts to the client. WhatsApp, for instance, caches all messages locally and queues unsent messages offline. Once reconnected, it must reconcile with the server and other devices, especially if the same account is used on multiple platforms. -- **Online-first**: A single central server manages data and concurrency, so clients remain thinner. However, the app becomes unusable if connectivity is lost, and any server downtime directly impacts all users. - -### Data Ownership and Storage Limits -- **Local-first**: Users hold a complete copy of data on their own device, retaining control and quick access. This can raise challenges when data sets are very large; phone storage might be insufficient, or backups may be harder to guarantee. -- **Online-first**: Storing all data in the cloud scales more easily, and providers often manage backups automatically. On the downside, users depend on the service and must trust it to protect their data. - -### When to Choose Which -- **Local-first**: Particularly helpful for scenarios where offline operation and immediate responsiveness matter, such as chat apps (like WhatsApp), field tools in low-connectivity environments, or any use case where users can't rely on being online 24/7. -- **Online-first**: Well-suited for systems that demand real-time central control or massive data aggregation with minimal offline needs, such as large-scale analytics platforms or services where guaranteed immediate global consistency is essential. -- **Hybrid**: In reality, most modern apps often blend these approaches, giving users partial offline capabilities (caching, queued updates) alongside a robust central service. This hybrid method offers the benefits of local speed and resilience, while still leveraging cloud infrastructure for collaboration and global reach. But a truth local-first app is way more than just a cache. - ---- - - - -## Offline-First vs. Local-First - -In the early days of offline-capable web apps (around 2014), the common phrase was **"Offline-First"**. Tools like **PouchDB** popularized the notion that developers should assume devices are often offline or have flaky connections, so apps must continue to work seamlessly without a network. The guiding principle was *"apps should treat being online as optional."* If a user has no internet access, the application's core features still function, saving or queuing data locally, and automatically synchronizing once connectivity is restored. - -
    - -
    - -Over time, this focus on offline support evolved into the broader concept of **"Local-First Software,"** (see [Ink&Switch](https://martin.kleppmann.com/papers/local-first.pdf)) emphasizing not just offline operation but also the technical underpinnings of **storing data locally** in the client application. While offline-first is primarily about resilience to network loss, local-first highlights ownership, privacy, and performance benefits of keeping the primary data on the user's device. Most tools these days extended the original offline-first concepts, adding real-time reactivity, custom sync, and more nuances like conflict resolution or encryption. - - -However, the term **"local-first"** can be **confusing** to non-technical audiences because many people (especially in the US) associate "local first" with *community-oriented movements* that encourage buying from nearby businesses or supporting local initiatives. To reduce ambiguity, it may be clearer to use **"local first software"** or **"local first development"** in your documentation and marketing materials. When creating branding or logos around local-first software, **avoid using the "Google Maps Pin"** as a symbol. This icon typically implies geolocation or physical locality further mixing up the notion of "location-based services" with "on-device data storage." - -## Do People Actually Use Local-First or Is It Just a Trend? - -If we look at **npm download statistics**, we see that **PouchDB** - one of the oldest libraries for local-first apps - has about **53k** downloads each week, and **RxDB** - a newer library - has about **22k** weekly downloads. Other local-first tools often have even fewer downloads. In comparison, a popular library like **react-query**, which does not focus on local storage, is downloaded about **1.6 million** times a week. These numbers show that local-first libraries, while used, are not as common as some of the more traditional tools. - -One reason is that **local-first** is still a new idea. Many developers are used to traditional "online-first" approaches, so switching to a local database and then syncing changes later can feel unfamiliar. Developers must learn different patterns, deal with offline synchronization, and handle possible conflicts. That extra work can be a barrier to adoption which might change in the future as tooling improves. - -While most of RxDB is open source, there are also **premium plugins** that help sustain RxDB as a long-term project. Because people purchase these plugins, we gains insights into how developers are using local-first features: -- About **half** of these users mainly want **offline functionality** for cases such as farming equipment, mining, construction, or even a shrimp farm app. -- The **other half** focus on **faster, real-time UIs** for to-do or reading apps, a space launch planning tool, and various dashboard apps. This range of use cases highlights both the resilience offline mode can offer and the performance boost that local databases can provide when synced in the background. - -## Why Local-First Is the Future - -Early in the history of the web, users **expected** static pages. If you wanted to see new content, you **reloaded** the page. That was normal at the time, and nobody found it strange because everything worked that way. - -Then, as more sites added **real-time** features - auto-updating feeds, live notifications, single-page apps - suddenly those older "reload-only" sites began to feel **slow** or **outdated**. Why wait for a manual refresh when real-time data was possible and readily available? - -The same pattern is happening with **local-first** apps. Right now, most sites are still built around network availability. We see loading spinners whenever data is fetched, and we simply wait for the server response. As local-first experiences become **commonplace** - removing spinners, letting users keep working when offline, and syncing in the background - everything else will start to feel **frustratingly behind**. Users won't tolerate slow or blocked interactions if they've seen apps that respond instantly and remain usable offline. They'll expect that as the default and we'll likely see growing pressure on developers to eliminate those extra loading steps. For many users, the experience of **immediate local writes will become not just a perk, but an expectation!** - -## See also - -
    - - - -
    - -- Discuss [this topic on HackerNews](https://news.ycombinator.com/item?id=43289885) -- [Local-First Technologies](../alternatives.md): A list of databases and technologies (besides [RxDB](/)) that support offline-first or local-first use cases. -- [Discord](/chat/): Join our Discord server to talk with people and share ideas about this topic. -- [Inc&Switch](https://martin.kleppmann.com/papers/local-first.pdf): The "original" paper about Local-First from 2019 where the naming of local-first Software was first used and described. -- [Learn how to build a local-first Application with RxDB](../quickstart.md). - ---- - -## LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite - - - -# LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite - -So you are building that web application and you want to **store data inside of your users browser**. Maybe you just need to store some small flags or you even need a fully fledged database. - -The types of web applications we build have changed significantly. In the early years of the web we served static html files. Then we served dynamically rendered html and later we build **single page applications** that run most logic on the client. And for the coming years you might want to build so called [local first apps](../offline-first.md) that handle big and complex data operations solely on the client and even work when offline, which gives you the opportunity to build **zero-latency** user interactions. - -In the early days of the web, **cookies** were the only option for storing small key-value assignments.. But JavaScript and browsers have evolved significantly and better storage APIs have been added which pave the way for bigger and more complex data operations. - -In this article, we will dive into the various technologies available for storing and querying data in a browser. We'll explore traditional methods like **Cookies**, **localStorage**, **WebSQL**, **IndexedDB** and newer solutions such as **OPFS** and **SQLite via WebAssembly**. We compare the features and limitations and through performance tests we aim to uncover how fast we can write and read data in a web application with the various methods. - -:::note -You are reading this in the [RxDB](/) docs. RxDB is a JavaScript database that has different storage adapters which can utilize the different storage APIs. -**Since 2017** I spend most of my time working with these APIs, doing performance tests and building [hacks](../slow-indexeddb.md) and plugins to reach the limits of browser database operation speed. - -
    - - - -
    -::: - -## The available Storage APIs in a modern Browser - -First lets have a brief overview of the different APIs, their intentional use case and history: - -### What are Cookies - -Cookies were first introduced by [netscape in 1994](https://www.baekdal.com/thoughts/the-original-cookie-specification-from-1997-was-gdpr-compliant/). -Cookies store small pieces of key-value data that are mainly used for session management, personalization, and tracking. Cookies can have several security settings like a time-to-live or the `domain` attribute to share the cookies between several subdomains. - -Cookies values are not only stored at the client but also sent with **every http request** to the server. This means we cannot store much data in a cookie but it is still interesting how good cookie access performance compared to the other methods. Especially because cookies are such an important base feature of the web, many performance optimizations have been done and even these days there is still progress being made like the [Shared Memory Versioning](https://blog.chromium.org/2024/06/introducing-shared-memory-versioning-to.html) by chromium or the asynchronous [CookieStore API](https://developer.mozilla.org/en-US/docs/Web/API/Cookie_Store_API). - -### What is LocalStorage - -The [localStorage API](./localstorage.md) was first proposed as part of the [WebStorage specification in 2009](https://www.w3.org/TR/2009/WD-webstorage-20090423/#the-localstorage-attribute). -LocalStorage provides a simple API to store key-value pairs inside of a web browser. It has the methods `setItem`, `getItem`, `removeItem` and `clear` which is all you need from a key-value store. LocalStorage is only suitable for storing small amounts of data that need to persist across sessions and it is [limited by a 5MB storage cap](./localstorage.md#understanding-the-limitations-of-local-storage). Storing complex data is only possible by transforming it into a string for example with `JSON.stringify()`. -The API is not asynchronous which means if fully blocks your JavaScript process while doing stuff. Therefore running heavy operations on it might block your UI from rendering. - -> There is also the **SessionStorage** API. The key difference is that localStorage data persists indefinitely until explicitly cleared, while sessionStorage data is cleared when the browser tab or window is closed. - -### What is IndexedDB - -IndexedDB was first introduced as "Indexed Database API" [in 2015](https://www.w3.org/TR/IndexedDB/#sotd). - -[IndexedDB](../rx-storage-indexeddb.md) is a low-level API for storing large amounts of structured JSON data. While the API is a bit hard to use, IndexedDB can utilize indexes and asynchronous operations. It lacks support for complex queries and only allows to iterate over the indexes which makes it more like a base layer for other libraries then a fully fledged database. - -In 2018, IndexedDB version 2.0 [was introduced](https://hacks.mozilla.org/2016/10/whats-new-in-indexeddb-2-0/). This added some major improvements. Most noticeable the `getAll()` method which improves performance dramatically when fetching bulks of JSON documents. - -IndexedDB [version 3.0](https://w3c.github.io/IndexedDB/) is in the workings which contains many improvements. Most important the addition of `Promise` based calls that makes modern JS features like `async/await` more useful. - -### What is OPFS - -The [Origin Private File System](../rx-storage-opfs.md) (OPFS) is a [relatively new](https://caniuse.com/mdn-api_filesystemfilehandle_createsyncaccesshandle) API that allows web applications to store large files directly in the browser. It is designed for data-intensive applications that want to write and read **binary data** in a simulated file system. - -OPFS can be used in two modes: -- Either asynchronous on the [main thread](../rx-storage-opfs.md#using-opfs-in-the-main-thread-instead-of-a-worker) -- Or in a WebWorker with the faster, asynchronous access with the `createSyncAccessHandle()` method. - -Because only binary data can be processed, OPFS is made to be a base filesystem for library developers. You will unlikely directly want to use the OPFS in your code when you build a "normal" application because it is too complex. That would only make sense for storing plain files like images, not to store and query [JSON data](./json-based-database.md) efficiently. I have build a [OPFS based storage](../rx-storage-opfs.md) for RxDB with proper indexing and querying and it took me several months. - -### What is WASM SQLite - -
    - -
    - -[WebAssembly](https://webassembly.org/) (Wasm) is a binary format that allows high-performance code execution on the web. -Wasm was added to major browsers over the course of 2017 which opened a wide range of opportunities on what to run inside of a browser. You can compile native libraries to WebAssembly and just run them on the client with just a few adjustments. WASM code can be shipped to browser apps and generally runs much faster compared to JavaScript, but still about [10% slower then native](https://www.usenix.org/conference/atc19/presentation/jangda). - -Many people started to use compiled SQLite as a database inside of the browser which is why it makes sense to also compare this setup to the native APIs. - -The compiled byte code of SQLite has a size of [about 938.9 kB](https://sqlite.org/download.html) which must be downloaded and parsed by the users on the first page load. WASM cannot directly access any persistent storage API in the browser. Instead it requires data to flow from WASM to the main-thread and then can be put into one of the browser APIs. This is done with so called [VFS (virtual file system) adapters](https://www.sqlite.org/vfs.html) that handle data access from SQLite to anything else. - -### What was WebSQL - -WebSQL **was** a web API [introduced in 2009](https://www.w3.org/TR/webdatabase/) that allowed browsers to use SQL databases for client-side storage, based on SQLite. The idea was to give developers a way to store and query data using SQL on the client side, similar to server-side databases. -WebSQL has been **removed from browsers** in the current years for multiple good reasons: - -- WebSQL was not standardized and having an API based on a single specific implementation in form of the SQLite source code is hard to ever make it to a standard. -- WebSQL required browsers to use a [specific version](https://developer.chrome.com/blog/deprecating-web-sql#reasons_for_deprecating_web_sql) of SQLite (version 3.6.19) which means whenever there would be any update or bugfix to SQLite, it would not be possible to add that to WebSQL without possible breaking the web. -- Major browsers like firefox never supported WebSQL. - -Therefore in the following we will **just ignore WebSQL** even if it would be possible to run tests on in by setting specific browser flags or using old versions of chromium. - -------------- - -## Feature Comparison - -Now that you know the basic concepts of the APIs, lets compare some specific features that have shown to be important for people using RxDB and browser based storages in general. - -### Storing complex JSON Documents - -When you store data in a web application, most often you want to store complex JSON documents and not only "normal" values like the `integers` and `strings` you store in a server side database. - -- Only IndexedDB works with JSON objects natively. -- With SQLite WASM you can [store JSON](https://www.sqlite.org/json1.html) in a `text` column since version 3.38.0 (2022-02-22) and even run deep queries on it and use single attributes as indexes. - -Every of the other APIs can only store strings or binary data. Of course you can transform any JSON object to a string with `JSON.stringify()` but not having the JSON support in the API can make things complex when running queries and running `JSON.stringify()` many times can cause performance problems. - -### Multi-Tab Support - -A big difference when building a Web App compared to [Electron](../electron-database.md) or [React-Native](../react-native-database.md), is that the user will open and close the app in **multiple browser tabs at the same time**. Therefore you have not only one JavaScript process running, but many of them can exist and might have to share state changes between each other to not show **outdated data** to the user. - -> If your users' muscle memory puts the left hand on the **F5** key while using your website, you did something wrong! - -Not all storage APIs support a way to automatically share write events between tabs. - -Only localstorage has a way to automatically share write events between tabs by the API itself with the [storage-event](./localstorage.md#localstorage-vs-indexeddb) which can be used to observe changes. - -```js -// localStorage can observe changes with the storage event. -// This feature is missing in IndexedDB and others -addEventListener("storage", (event) => {}); -``` - -There was the [experimental IndexedDB observers API](https://stackoverflow.com/a/33270440) for chrome, but the proposal repository has been archived. - -To workaround this problem, there are two solutions: -- The first option is to use the [BroadcastChannel API](https://github.com/pubkey/broadcast-channel) which can send messages across browser tabs. So whenever you do a write to the storage, you also send a notification to other tabs to inform them about these changes. This is the most common workaround which is also used by RxDB. Notice that there is also the [WebLocks API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Locks_API) which can be used to have mutexes across browser tabs. -- The other solution is to use the [SharedWorker](https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker) and do all writes inside of the worker. All browser tabs can then subscribe to messages from that **single** SharedWorker and know about changes. - -### Indexing Support - -The big difference between a database and storing data in a plain file, is that a database is writing data in a format that allows running operations over indexes to facilitate fast performant queries. From our list of technologies only **IndexedDB** and **WASM SQLite** support for indexing out of the box. In theory you can build indexes on top of any storage like localstorage or OPFS but you likely should not want to do that by yourself. - -In IndexedDB for example, we can fetch a bulk of documents by a given index range: - -```ts -// find all products with a price between 10 and 50 -const keyRange = IDBKeyRange.bound(10, 50); -const transaction = db.transaction('products', 'readonly'); -const objectStore = transaction.objectStore('products'); -const index = objectStore.index('priceIndex'); -const request = index.getAll(keyRange); -const result = await new Promise((res, rej) => { - request.onsuccess = (event) => res(event.target.result); - request.onerror = (event) => rej(event); -}); -``` - -Notice that IndexedDB has the limitation of [not having indexes on boolean values](https://github.com/w3c/IndexedDB/issues/76). You can only index strings and numbers. To workaround that you have to transform boolean to numbers and backwards when storing the data. - -### WebWorker Support - -When running heavy data operations, you might want to move the processing away from the JavaScript main thread. This ensures that our app keeps being responsive and fast while the processing can run in parallel in the background. In a browser you can either use the [WebWorker](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API), [SharedWorker](https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker) or the [ServiceWorker](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) API to do that. In RxDB you can use the [WebWorker](../rx-storage-worker.md) or [SharedWorker](../rx-storage-shared-worker.md) plugins to move your storage inside of a worker. - -The most common API for that use case is spawning a **WebWorker** and doing most work on that second JavaScript process. The worker is spawned from a separate JavaScript file (or base64 string) and communicates with the main thread by sending data with `postMessage()`. - -Unfortunately **LocalStorage** and **Cookies** [cannot be used in WebWorker or SharedWorker](https://stackoverflow.com/questions/6179159/accessing-localstorage-from-a-webworker) because of the design and security constraints. WebWorkers run in a separate global context from the main browser thread and therefore cannot do stuff that might impact the main thread. They have no direct access to certain web APIs, like the DOM, localStorage, or cookies. - -Everything else can be used from inside a WebWorker. -The fast version of OPFS with the `createSyncAccessHandle` method can **only** [be used in a WebWorker](../rx-storage-opfs.md#opfs-limitations), and **not on the main thread**. This is because all the operations of the returned `AccessHandle` are **not async** and therefore block the JavaScript process, so you do want to do that on the main thread and block everything. - -------------- - -## Storage Size Limits - -- **Cookies** are limited to about `4 KB` of data in [RFC-6265](https://datatracker.ietf.org/doc/html/rfc6265#section-6.1). Because the stored cookies are send to the server with every HTTP request, this limitation is reasonable. You can test your browsers cookie limits [here](http://www.ruslog.com/tools/cookies.html). Notice that you should never fill up the full `4 KB` of your cookies because your web server will not accept too long headers and reject the requests with `HTTP ERROR 431 - Request header fields too large`. Once you have reached that point you can not even serve updated JavaScript to your user to clean up the cookies and you will have locked out that user until the cookies get cleaned up manually. - -- **LocalStorage** has a storage size limitation that varies depending on the browser, but generally ranges from 4 MB to 10 MB per origin. You can test your localStorage size limit [here](https://arty.name/localstorage.html). - - Chrome/Chromium/Edge: 5 MB per domain - - Firefox: 10 MB per domain - - Safari: 4-5 MB per domain (varies slightly between versions) - -- **IndexedDB** does not have a specific fixed size limitation like localStorage. The maximum storage size for IndexedDB depends on the browser implementation. The upper limit is typically based on the available disc space on the user's device. In chromium browsers it can use up to 80% of total disk space. You can get an estimation about the storage size limit by calling `await navigator.storage.estimate()`. Typically you can store gigabytes of data which can be tried out [here](https://demo.agektmr.com/storage/). Notice that we have a full article about [storage max size limits of IndexedDB](./indexeddb-max-storage-limit.md) that covers this topic. - -- **OPFS** has the same storage size limitation as IndexedDB. Its limit depends on the available disc space. This can also be tested [here](https://demo.agektmr.com/storage/). - -------------- - -## Performance Comparison - -Now that we've reviewed the features of each storage method, let's dive into performance comparisons, focusing on initialization times, read/write latencies, and bulk operations. - -Notice that we only run simple tests and for your specific use case in your application the results might differ. Also we only compare performance in google chrome (version 128.0.6613.137). Firefox and Safari have similar **but not equal** performance patterns. You can run the test by yourself on your own machine from this [github repository](https://github.com/pubkey/localstorage-indexeddb-cookies-opfs-sqlite-wasm). For all tests we throttle the network to behave like the average german internet speed. (download: 135,900 kbit/s, upload: 28,400 kbit/s, latency: 125ms). Also all tests store an "average" JSON object that might be required to be stringified depending on the storage. We also only test the performance of storing documents by id because some of the technologies (cookies, OPFS and localstorage) do not support indexed range operations so it makes no sense to compare the performance of these. - -### Initialization Time - -Before you can store any data, many APIs require a setup process like creating databases, spawning WebAssembly processes or downloading additional stuff. To ensure your app starts fast, the initialization time is important. - -The APIs of localStorage and Cookies do not have any setup process and can be directly used. IndexedDB requires to open a database and a store inside of it. WASM SQLite needs to download a WASM file and process it. OPFS needs to download and start a worker file and initialize the virtual file system directory. - -Here are the time measurements from how long it takes until the first bit of data can be stored: - -| Technology | Time in Milliseconds | -| ----------------------- | -------------------- | -| IndexedDB | 46 | -| OPFS Main Thread | 23 | -| OPFS WebWorker | 26.8 | -| WASM SQLite (memory) | 504 | -| WASM SQLite (IndexedDB) | 535 | - -Here we can notice a few things: - -- Opening a new IndexedDB database with a single store takes surprisingly long -- The latency overhead of sending data from the main thread to a WebWorker OPFS is about 4 milliseconds. Here we only send minimal data to init the OPFS file handler. It will be interesting if that latency increases when more data is processed. -- Downloading and parsing WASM SQLite and creating a single table takes about half a second. Using also the IndexedDB VFS to store data persistently adds additional 31 milliseconds. Reloading the page with enabled caching and already prepared tables is a bit faster with 420 milliseconds (memory). - -### Latency of small Writes - -Next lets test the latency of small writes. This is important when you do many small data changes that happen independent from each other. Like when you stream data from a websocket or persist pseudo randomly happening events like mouse movements. - -| Technology | Time in Milliseconds | -| ----------------------- | -------------------- | -| Cookies | 0.058 | -| LocalStorage | 0.017 | -| IndexedDB | 0.17 | -| OPFS Main Thread | 1.46 | -| OPFS WebWorker | 1.54 | -| WASM SQLite (memory) | 0.17 | -| WASM SQLite (IndexedDB) | 3.17 | - -Here we can notice a few things: - -- LocalStorage has the lowest write latency with only 0.017 milliseconds per write. -- IndexedDB writes are about 10 times slower compared to localStorage. -- Sending the data to the WASM SQLite process and letting it persist via IndexedDB is slow with over 3 milliseconds per write. - -The OPFS operations take about 1.5 milliseconds to write the JSON data into one document per file. We can see the sending the data to a webworker first is a bit slower which comes from the overhead of serializing and deserializing the data on both sides. -If we would not create on OPFS file per document but instead append everything to a single file, the performance pattern changes significantly. Then the faster file handle from the `createSyncAccessHandle()` only takes about 1 millisecond per write. But this would require to somehow remember at which position the each document is stored. Therefore in our tests we will continue using one file per document. - -### Latency of small Reads - -Now that we have stored some documents, lets measure how long it takes to read single documents by their `id`. - -| Technology | Time in Milliseconds | -| ----------------------- | -------------------- | -| Cookies | 0.132 | -| LocalStorage | 0.0052 | -| IndexedDB | 0.1 | -| OPFS Main Thread | 1.28 | -| OPFS WebWorker | 1.41 | -| WASM SQLite (memory) | 0.45 | -| WASM SQLite (IndexedDB) | 2.93 | - -Here we can notice a few things: - -- LocalStorage reads are **really really fast** with only 0.0052 milliseconds per read. -- The other technologies perform reads in a similar speed to their write latency. - -### Big Bulk Writes - -As next step, lets do some big bulk operations with 200 documents at once. - -| Technology | Time in Milliseconds | -| ----------------------- | -------------------- | -| Cookies | 20.6 | -| LocalStorage | 5.79 | -| IndexedDB | 13.41 | -| OPFS Main Thread | 280 | -| OPFS WebWorker | 104 | -| WASM SQLite (memory) | 19.1 | -| WASM SQLite (IndexedDB) | 37.12 | - -Here we can notice a few things: - -- Sending the data to a WebWorker and running it via the faster OPFS API is about twice as fast. -- WASM SQLite performs better on bulk operations compared to its single write latency. This is because sending the data to WASM and backwards is faster if it is done all at once instead of once per document. - -### Big Bulk Reads - -Now lets read 100 documents in a bulk request. - -| Technology | Time in Milliseconds | -| ----------------------- | ------------------------------- | -| Cookies | 6.34 | -| LocalStorage | 0.39 | -| IndexedDB | 4.99 | -| OPFS Main Thread | 54.79 | -| OPFS WebWorker | 25.61 | -| WASM SQLite (memory) | 3.59 | -| WASM SQLite (IndexedDB) | 5.84 (35ms without cache) | - -Here we can notice a few things: - -- Reading many files in the OPFS webworker is about **twice as fast** compared to the slower main thread mode. -- WASM SQLite is surprisingly fast. Further inspection has shown that the WASM SQLite process keeps the documents in memory cached which improves the latency when we do reads directly after writes on the same data. When the browser tab is reloaded between the writes and the reads, finding the 100 documents takes about **35 milliseconds** instead. - -## Performance Conclusions - -- LocalStorage is really fast but remember that is has some downsides: - - It blocks the main JavaScript process and therefore should not be used for big bulk operations. - - Only Key-Value assignments are possible, you cannot use it efficiently when you need to do index based range queries on your data. -- OPFS is way faster when used in the WebWorker with the `createSyncAccessHandle()` method compare to using it directly in the main thread. -- SQLite WASM can be fast but you have to initially download the full binary and start it up which takes about half a second. This might not be relevant at all if your app is started up once and the used for a very long time. But for web-apps that are opened and closed in many browser tabs many times, this might be a problem. - -------------- - -## Possible Improvements - -There is a wide range of possible improvements and performance hacks to speed up the operations. -- For IndexedDB I have made a list of [performance hacks here](../slow-indexeddb.md). For example you can do sharding between multiple database and webworkers or use a custom index strategy. -- OPFS is slow in writing one file per document. But you do not have to do that and instead you can store everything at a single file like a normal database would do. This improves performance dramatically like it was done with the RxDB [OPFS RxStorage](../rx-storage-opfs.md). -- You can mix up the technologies to optimize for multiple scenarios at once. For example in RxDB there is the [localstorage meta optimizer](../rx-storage-localstorage-meta-optimizer.md) which stores initial metadata in localstorage and "normal" documents inside of IndexedDB. This improves the initial startup time while still having the documents stored in a way to query them efficiently. -- There is the [memory-mapped](../rx-storage-memory-mapped.md) storage plugin in RxDB which maps data directly to memory. Using this in combination with a shared worker can improve pageloads and query time significantly. -- [Compressing](../key-compression.md) data before storing it might improve the performance for some of the storages. -- Splitting work up between [multiple WebWorkers](../rx-storage-worker.md) via [sharding](../rx-storage-sharding.md) can improve performance by utilizing the whole capacity of your users device. - -Here you can see the [performance comparison](../rx-storage-performance.md) of various RxDB storage implementations which gives a better view of real world performance: - -
    - -
    - -## Future Improvements - -You are reading this in 2024, but the web does not stand still. There is a good chance that browser get enhanced to allow faster and better data operations. - -- Currently there is no way to directly access a persistent storage from inside a WebAssembly process. If this changes in the future, running SQLite (or a similar database) in a browser might be the best option. -- Sending data between the main thread and a WebWorker is slow but might be improved in the future. There is a [good article](https://surma.dev/things/is-postmessage-slow/) about why `postMessage()` is slow. -- IndexedDB lately [got support](https://developer.chrome.com/blog/maximum-idb-performance-with-storage-buckets) for storage buckets (chrome only) which might improve performance. - -## Follow Up - -- Share my [announcement tweet](https://x.com/rxdbjs/status/1846145062847062391) --> -- Reproduce the benchmarks at the [github repo](https://github.com/pubkey/localstorage-indexeddb-cookies-opfs-sqlite-wasm) -- Learn how to use RxDB with the [RxDB Quickstart](../quickstart.md) -- Check out the [RxDB github repo](https://github.com/pubkey/rxdb) and leave a star ⭐ - ---- - -## Using localStorage in Modern Applications - A Comprehensive Guide - -# Using localStorage in Modern Applications: A Comprehensive Guide - -When it comes to client-side storage in web applications, the localStorage API stands out as a simple and widely supported solution. It allows developers to store key-value pairs directly in a user's browser. In this article, we will explore the various aspects of the localStorage API, its advantages, limitations, and alternative storage options available for modern applications. - -
    - - - -
    - -## What is the localStorage API? - -The localStorage API is a built-in feature of web browsers that enables web developers to store small amounts of data persistently on a user's device. It operates on a simple key-value basis, allowing developers to save strings, numbers, and other simple data types. This data remains available even after the user closes the browser or navigates away from the page. The API provides a convenient way to maintain state and store user preferences without relying on server-side storage. - -## Exploring local storage Methods: A Practical Example - -Let's dive into some hands-on code examples to better understand how to leverage the power of localStorage. The API offers several methods for interaction, including setItem, getItem, removeItem, and clear. Consider the following code snippet: - -```js -// Storing data using setItem -localStorage.setItem('username', 'john_doe'); - -// Retrieving data using getItem -const storedUsername = localStorage.getItem('username'); - -// Removing data using removeItem -localStorage.removeItem('username'); - -// Clearing all data -localStorage.clear(); -``` - -## Storing Complex Data in JavaScript with JSON Serialization - -While js localStorage excels at handling simple key-value pairs, it also supports more intricate data storage through JSON serialization. By utilizing JSON.stringify and JSON.parse, you can store and retrieve structured data like objects and arrays. Here's an example of storing a document: - -```js -const user = { - name: 'Alice', - age: 30, - email: 'alice@example.com' -}; - -// Storing a user object -localStorage.setItem('user', JSON.stringify(user)); - -// Retrieving and parsing the user object -const storedUser = JSON.parse(localStorage.getItem('user')); -``` - -## Understanding the Limitations of local storage - -Despite its convenience, localStorage does come with a set of limitations that developers should be aware of: - -- **Non-Async Blocking API**: One significant drawback is that js localStorage operates as a non-async blocking API. This means that any operations performed on localStorage can potentially block the main thread, leading to slower application performance and a less responsive user experience. -- **Limited Data Structure**: Unlike more advanced databases, localStorage is limited to a simple key-value store. This restriction makes it unsuitable for storing complex data structures or managing relationships between data elements. -- **Stringification Overhead**: Storing [JSON data](./json-based-database.md) in localStorage requires stringifying the data before storage and parsing it when retrieved. This process introduces performance overhead, potentially slowing down operations by up to 10 times. -- **Lack of Indexing**: localStorage lacks indexing capabilities, making it challenging to perform efficient searches or iterate over data based on specific criteria. This limitation can hinder applications that rely on complex data retrieval. -- **Tab Blocking**: In a multi-tab environment, one tab's localStorage operations can impact the performance of other tabs by monopolizing CPU resources. You can reproduce this behavior by opening [this test file](https://pubkey.github.io/client-side-databases/database-comparison/index.html) in two browser windows and trigger localstorage inserts in one of them. You will observe that the indication spinner will stuck in both windows. -- **Storage Limit**: Browsers typically impose a storage limit of [around 5 MiB](https://developer.mozilla.org/en-US/docs/Web/API/Storage_API/Storage_quotas_and_eviction_criteria#web_storage) for each origin's localStorage. - -## Reasons to Still Use localStorage - -### Is localStorage Slow? - -Contrary to concerns about performance, the localStorage API in JavaScript is surprisingly fast when compared to alternative storage solutions like [IndexedDB or OPFS](./localstorage-indexeddb-cookies-opfs-sqlite-wasm.md). It excels in handling small key-value assignments efficiently. Due to its simplicity and direct integration with browsers, accessing and modifying localStorage data incur minimal overhead. For scenarios where quick and straightforward data storage is required, localStorage remains a viable option. For example RxDB uses localStorage in the [localStorage meta optimizer](../rx-storage-localstorage-meta-optimizer.md) to manage simple key values pairs while storing the "normal" documents inside of another storage like IndexedDB. - -## When Not to Use localStorage - -While localStorage offers convenience, it may not be suitable for every use case. Consider the following situations where alternatives might be more appropriate: - -- **Data Must Be Queryable**: If your application relies heavily on querying data based on specific criteria, localStorage might not provide the necessary querying capabilities. Complex data retrieval might lead to inefficient code and slow performance. -- **Big JSON Documents**: Storing large JSON documents in localStorage can consume a significant amount of memory and degrade performance. It's essential to assess the size of the data you intend to store and consider more robust solutions for handling substantial datasets. -- **Many Read/Write Operations**: Excessive read and write operations on localStorage can lead to performance bottlenecks. Other storage solutions might offer better performance and scalability for applications that require frequent data manipulation. -- **Lack of Persistence**: If your application can function without persistent data across sessions, consider using in-memory data structures like `new Map()` or `new Set()`. These options offer speed and efficiency for transient data. - -## What to use instead of the localStorage API in JavaScript - -### localStorage vs IndexedDB - -While **localStorage** serves as a reliable storage solution for simpler data needs, it's essential to explore alternatives like **IndexedDB** when dealing with more complex requirements. **IndexedDB** is designed to store not only key-value pairs but also JSON documents. Unlike localStorage, which usually has a storage limit of around 5-10MB per domain, IndexedDB can handle significantly larger datasets. IndexDB with its support for indexing facilitates efficient querying, making range queries possible. However, it's worth noting that IndexedDB lacks observability, which is a feature unique to localStorage through the `storage` event. Also, -complex queries can pose a challenge with IndexedDB, and while its performance is acceptable, IndexedDB can be [too slow](../slow-indexeddb.md) for some use cases. - -```js -// localStorage can observe changes with the storage event. -// This feature is missing in IndexedDB -addEventListener("storage", (event) => {}); -``` - -For those looking to harness the full power of IndexedDB with added capabilities, using wrapper libraries like [RxDB](https://rxdb.info/) is recommended. These libraries augment IndexedDB with features such as complex queries and observability, enhancing its usability for modern applications by providing a real database instead of only a key-value store. - -
    - - - -
    - -In summary when you compare IndexedDB vs localStorage, IndexedDB will win at any case where much data is handled while localStorage has better performance on small key-value datasets. - -### File System API (OPFS) -Another intriguing option is the OPFS (File System API). This API provides direct access to an origin-based, sandboxed filesystem which is highly optimized for performance and offers in-place write access to its content. -OPFS offers impressive performance benefits. However, working with the OPFS API can be complex, and it's only accessible within a **WebWorker**. To simplify its usage and extend its capabilities, consider using a wrapper library like [RxDB's OPFS RxStorage](../rx-storage-opfs.md), which builds a comprehensive database on top of the OPFS API. This abstraction allows you to harness the power of the OPFS API without the intricacies of direct usage. - -### localStorage vs Cookies -Cookies, once a primary method of client-side data storage, have fallen out of favor in modern web development due to their limitations. While they can store data, they are about **100 times slower** when compared to the localStorage API. Additionally, cookies are included in the HTTP header, which can impact network performance. As a result, cookies are not recommended for data storage purposes in contemporary web applications. - -### localStorage vs WebSQL -WebSQL, despite offering a SQL-based interface for client-side data storage, is a **deprecated technology** and should be avoided. Its API has been phased out of modern browsers, and it lacks the robustness of alternatives like IndexedDB. Moreover, WebSQL tends to be around 10 times slower than IndexedDB, making it a suboptimal choice for applications that demand efficient data manipulation and retrieval. - -### localStorage vs sessionStorage -In scenarios where data persistence beyond a session is unnecessary, developers often turn to sessionStorage. This storage mechanism retains data only for the duration of a tab or browser session. It survives page reloads and restores, providing a handy solution for temporary data needs. However, it's important to note that sessionStorage is limited in scope and may not suit all use cases. - -### AsyncStorage for React Native -For React Native developers, the [AsyncStorage API](https://reactnative.dev/docs/asyncstorage) is the go-to solution, mirroring the behavior of localStorage but with asynchronous support. Since not all JavaScript runtimes support localStorage, AsyncStorage offers a seamless alternative for data persistence in React Native applications. - -### `node-localstorage` for Node.js - -Because native localStorage is absent in the **Node.js** JavaScript runtime, you will get the error `ReferenceError: localStorage is not defined` in Node.js or node based runtimes like Next.js. The [node-localstorage npm package](https://github.com/lmaccherone/node-localstorage) bridges the gap. This package replicates the browser's localStorage API within the Node.js environment, ensuring consistent and compatible data storage capabilities. - -## localStorage in browser extensions - -While browser extensions for chrome and firefox support the localStorage API, it is not recommended to use it in that context to store extension-related data. The browser will clear the data in many scenarios like when the users clear their browsing history. - -Instead the [Extension Storage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage#properties) should be used for browser extensions. -In contrast to localStorage, the storage API works `async` and all operations return a Promise. Also it provides automatic sync to replicate data between all instances of that browser that the user is logged into. The storage API is even able to storage JSON-ifiable objects instead of plain strings. - -```ts -// Using the storage API in chrome - -await chrome.storage.local.set({ foobar: {nr: 1} }); - -const result = await chrome.storage.local.get('foobar'); -console.log(result.foobar); // {nr: 1} -``` - -## localStorage in Deno and Bun - -The **Deno** JavaScript runtime has a working localStorage API so running `localStorage.setItem()` and the other methods, will just work and the locally stored data is persisted across multiple runs. - -**Bun** does not support the localStorage JavaScript API. Trying to use `localStorage` will error with `ReferenceError: Can't find variable: localStorage`. To store data locally in Bun, you could use the `bun:sqlite` module instead or directly use a in-JavaScript database with Bun support like [RxDB](https://rxdb.info/). - -## Conclusion: Choosing the Right Storage Solution -In the world of modern web development, **localStorage** serves as a valuable tool for lightweight data storage. Its simplicity and speed make it an excellent choice for small key-value assignments. However, as application complexity grows, developers must assess their storage needs carefully. For scenarios that demand advanced querying, complex data structures, or high-volume operations, alternatives like IndexedDB, wrapper libraries with additional features like [RxDB](../), or platform-specific APIs offer more robust solutions. By understanding the strengths and limitations of various storage options, developers can make informed decisions that pave the way for efficient and scalable applications. - -## Follow up - -- Learn how to store and query data with RxDB in the [RxDB Quickstart](../quickstart.md) -- [Why IndexedDB is slow and how to fix it](../slow-indexeddb.md) -- [RxStorage performance comparison](../rx-storage-performance.md) - ---- - -## Real-Time & Offline - RxDB for Mobile Apps - -# Mobile Database - RxDB as Database for Mobile Applications - -In today's digital landscape, mobile applications have become an integral part of our lives. From social media platforms to e-commerce solutions, mobile apps have transformed the way we interact with digital services. At the heart of any mobile app lies the database, a critical component responsible for storing, retrieving, and managing data efficiently. In this article, we will delve into the world of mobile databases, exploring their significance, challenges, and the emergence of [RxDB](https://rxdb.info/) as a powerful database solution for hybrid app development in frameworks like React Native and Capacitor. - -## Understanding Mobile Databases - -Mobile databases are specialized software systems designed to handle data storage and management for mobile applications. These databases are optimized for the unique requirements of mobile environments, which often include limited device resources, fluctuations in network connectivity, and the need for offline functionality. - -There are various types of mobile databases available, each with its own strengths and use cases. Local databases, such as SQLite and Realm, reside directly on the user's device, providing offline capabilities and faster data access. Cloud-based databases, like [Firebase Realtime Database](./realtime-database.md) and Amazon DynamoDB, rely on remote servers to store and retrieve data, enabling synchronization across multiple devices. Hybrid databases, as the name suggests, combine the benefits of both local and cloud-based approaches, offering a balance between offline functionality and data synchronization. - -## Introducing RxDB: A Paradigm Shift in Mobile Database Solutions - -
    - - - -
    - -[RxDB](https://rxdb.info/), also known as Reactive Database, has emerged as a game-changer in the realm of mobile databases. Built on top of popular web technologies like JavaScript, TypeScript, and RxJS (Reactive Extensions for JavaScript), RxDB provides an elegant solution for seamless offline-first capabilities and real-time data synchronization in mobile applications. - -Benefits of RxDB for Hybrid App Development - -1. Offline-First Approach: One of the major advantages of RxDB is its ability to work in an offline mode. It allows mobile applications to store and access data locally, ensuring uninterrupted functionality even when the network connection is weak or unavailable. The database automatically syncs the data with the server once the connection is reestablished, guaranteeing data consistency. - -2. [Real-Time Data Synchronization](../replication.md): RxDB leverages the power of real-time data synchronization, making it an excellent choice for applications that require collaborative features or live updates. It uses the concept of change streams to detect modifications made to the database and instantly propagates those changes across connected devices. This real-time synchronization enables seamless collaboration and enhances user experience. - -3. Reactive Programming Paradigm: RxDB embraces the principles of reactive programming, which simplifies the development process by handling asynchronous events and data streams. By leveraging RxJS observables, developers can write concise, declarative code that reacts to changes in data, ensuring a highly responsive user experience. The reactive programming paradigm enhances code maintainability, scalability, and testability. - -4. Easy Integration with Hybrid App Frameworks: RxDB seamlessly integrates with popular hybrid app development frameworks like [React Native](../react-native-database.md) and [Capacitor](../capacitor-database.md). This compatibility allows developers to leverage the existing ecosystem and tools of these frameworks, making the transition to RxDB smoother and more efficient. By utilizing RxDB within these frameworks, developers can harness the power of a robust database solution without sacrificing the advantages of hybrid app development. - -5. Cross-Platform Support: RxDB enables developers to build cross-platform mobile applications that run seamlessly on both iOS and Android devices. This versatility eliminates the need for separate database implementations for different platforms, saving development time and effort. With RxDB, developers can focus on building a unified codebase and delivering a consistent user experience across platforms. - -## Use Cases for RxDB in Hybrid App Development - -1. [Offline-First Applications](../offline-first.md): [RxDB](https://rxdb.info/) is an ideal choice for applications that heavily rely on offline functionality. Whether it's a note-taking app, a task manager, or a survey application, RxDB ensures that users can continue working even when connectivity is compromised. The seamless synchronization capabilities of RxDB ensure that changes made offline are automatically propagated once the device reconnects to the internet. - -2. Real-Time Collaboration: Applications that require real-time collaboration, such as messaging platforms or collaborative editing tools, can greatly benefit from RxDB. The real-time synchronization capabilities enable multiple users to work on the same data simultaneously, ensuring that everyone sees the latest updates in real-time. - -3. Data-Intensive Applications: RxDB's performance and scalability make it suitable for data-intensive applications that handle large datasets or complex data structures. Whether it's a media-rich app, a data visualization tool, or an analytics platform, RxDB can handle the heavy lifting and provide a smooth user experience. - -4. Cross-Platform Applications: Hybrid app frameworks like React Native and Capacitor have gained popularity due to their ability to build cross-platform applications. By utilizing RxDB within these frameworks, developers can create a unified codebase that runs seamlessly on both iOS and Android, significantly reducing development time and effort. - -## Conclusion - -Mobile databases play a vital role in the performance and functionality of mobile applications. RxDB, with its offline-first approach, real-time data synchronization, and seamless integration with hybrid app development frameworks like React Native and Capacitor, offers a robust solution for managing data in mobile apps. By leveraging the power of reactive programming, RxDB empowers developers to build highly responsive, scalable, and cross-platform applications that deliver an exceptional user experience. With its versatility and ease of use, RxDB is undoubtedly a database solution worth considering for hybrid app development. Embrace the power of RxDB and unlock the full potential of your mobile applications. - ---- - -## RxDB – The Ultimate Offline Database with Sync and Encryption - - -When building modern applications, a reliable **offline database** can make all the difference. Users need fast, uninterrupted access to data, even without an internet connection, and they need that data to stay secure. **RxDB** meets these requirements by providing a **local-first** architecture, **real-time sync** to any backend, and optional **encryption** for sensitive fields. - -In this article, we'll cover: -- Why an **offline database** approach significantly improves user experience -- How RxDB’s **sync** and **encryption** features work -- Step-by-step guidance on getting started - ---- - -## Why Choose an Offline Database? - -[Offline-first](../offline-first.md) or **local-first** software stores data directly on the client device. This strategy isn’t just about surviving network outages; it also makes your application faster, more user-friendly, and better at handling multiple usage scenarios. - -### 1. Zero Loading Spinners -Applications that call remote servers for every request inevitably show loading spinners. With an offline database, read and write operations happen locally—providing near-instant feedback. Users no longer stare at progress indicators or wait for server responses, resulting in a smoother and more fluid experience. - - - -### 2. Multi-Tab Consistency -Many websites mishandle data across multiple browser tabs. In an offline database, all tabs share the same local datastore. If the user updates data in one tab (like completing a to-do item), changes instantly reflect in every other tab. This removes complex multi-window synchronization problems. - - - -### 3. Real-Time Data Feeds -Apps that rely on a purely server-driven approach often show stale data unless they add a separate real-time push system (like websockets). Local-first solutions with built-in replication essentially get real-time updates “for free.” Once the server sends any changes, your local offline database updates—keeping your UI live and accurate. - -### 4. Reduced Server Load -In a traditional app, every interaction triggers a request to the server, scaling up resource usage quickly as traffic grows. Offline-first setups replicate data to the client once, and subsequent local reads or writes do not stress the backend. Your server usage grows with the amount of data—rather than every user action—leading to more efficient scaling. - -### 5. Simpler Development: Fewer Endpoints, No Extra State Library -Typical apps require numerous REST endpoints and possibly a client-side state manager (like Redux) to handle data flow. If you adopt an offline database, you can replicate nearly everything to the client. The local DB becomes your single source of truth, and you may skip advanced state libraries altogether. - -
    - - - -
    - -## Introducing RxDB – A Powerful Offline Database Solution - -**RxDB (Reactive Database)** is a **NoSQL** JavaScript database that lives entirely in your client environment. It’s optimized for: - -- **Offline-first usage** -- **Reactive queries** (your UI updates in real time) -- **Flexible replication** with various backends -- **Field-level encryption** to protect sensitive data - -You can run RxDB in: -- **Browsers** ([IndexedDB](../rx-storage-indexeddb.md), [OPFS](../rx-storage-opfs.md)) -- **Mobile hybrid apps** ([Ionic](./ionic-database.md), [Capacitor](../capacitor-database.md)) -- **Native modules** ([React Native](../react-native-database.md)) -- **Desktop environments** ([Electron](../electron-database.md)) -- **Node.js** [Servers](../rx-server.md) or Scripts - -Wherever your JavaScript executes, RxDB can serve as a robust offline database. - ---- - -## Quick Setup Example - -Below is a short demo of how to create an RxDB [database](../rx-database.md), add a [collection](../rx-collection.md), and observe a [query](../rx-query.md). You can expand upon this to enable encryption or full sync. - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -async function initDB() { - // Create a local offline database - const db = await createRxDatabase({ - name: 'myOfflineDB', - storage: getRxStorageLocalstorage() - }); - - // Add collections - await db.addCollections({ - tasks: { - schema: { - title: 'tasks schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string' }, - title: { type: 'string' }, - done: { type: 'boolean' } - } - } - } - }); - - // Observe changes in real time - db.tasks - .find({ selector: { done: false } }) - .$ // returns an observable that emits whenever the result set changes - .subscribe(undoneTasks => { - console.log('Currently undone tasks:', undoneTasks); - }); - - return db; -} -``` - -Now the `tasks` collection is ready to store data offline. You could also [replicate](../replication.md) it to a backend, encrypt certain fields, or utilize more advanced features like conflict resolution. - -## How Offline Sync Works in RxDB - -RxDB uses a [Sync Engine](../replication.md) that pushes local changes to the server and pulls remote updates back down. This ensures local data is always fresh and that the server has the latest offline edits once the device reconnects. - -**Multiple Plugins** exist to handle various backends or replication methods: -- [CouchDB](../replication-couchdb.md) or **PouchDB** -- [Google Firestore](./firestore-alternative.md) -- [GraphQL](../replication-graphql.md) endpoints -- REST / [HTTP](../replication-http.md) -- **WebSocket** or [WebRTC](../replication-webrtc.md) (for peer-to-peer sync) - -You pick the plugin that fits your stack, and RxDB handles everything from conflict detection to event emission, allowing you to focus on building your user-facing features. - -```ts -import { replicateRxCollection } from 'rxdb/plugins/replication'; - -replicateRxCollection({ - collection: db.tasks, - replicationIdentifier: 'tasks-sync', - pull: { /* fetch updates from server */ }, - push: { /* send local writes to server */ }, - live: true // keep them in sync constantly -}); -``` - -## Securing Your Offline Database with Encryption -Local data can be a risk if it’s sensitive or personal. RxDB offers [encryption plugins](../encryption.md) to keep specific document fields secure at rest. - -#### Encryption Example - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; - -async function initSecureDB() { - // Wrap the storage with crypto-js encryption - const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ - storage: getRxStorageLocalstorage() - }); - - // Create database with a password - const db = await createRxDatabase({ - name: 'secureOfflineDB', - storage: encryptedStorage, - password: 'myTopSecretPassword' - }); - - // Define an encrypted collection - await db.addCollections({ - userSecrets: { - schema: { - title: 'encrypted user data', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string' }, - secretData: { type: 'string' } - }, - required: ['id'], - encrypted: ['secretData'] // field is encrypted at rest - } - } - }); - - return db; -} -``` - -When the device is off or the database file is extracted, `secretData` remains unreadable without the specified password. This ensures only authorized parties can access sensitive fields, even in offline scenarios. - -## Follow Up - -Integrating an offline database approach into your app delivers near-instant interactions, true multi-tab data consistency, automatic real-time updates, and reduced server dependencies. By choosing RxDB, you gain: - -- Offline-first local storage -- Flexible replication to various backends -- Encryption of sensitive fields -- Reactive queries for real-time UI updates - -RxDB transforms how you build and scale apps—no more loading spinners, no more stale data, no more complicated offline handling. Everything is local, synced, and secured. - -Continue your learning path: - -- **Explore the RxDB Ecosystem** - Dive into additional features like [Compression](../key-compression.md) or advanced [Conflict Handling](../transactions-conflicts-revisions.md#custom-conflict-handler) to optimize your offline database. - -- **Learn More About Offline-First** - Read our [Offline First documentation](../offline-first.md) for a deeper understanding of why local-first architectures improve user experience and reduce server load. - -- **Join the Community** - Have questions or feedback? Connect with us on the [RxDB Chat](/chat/) or open an issue on [GitHub](/code/). - -- **Upgrade to Premium** - If you need high-performance features—like [SQLite storage](../rx-storage-sqlite.md) for mobile or the [Web Crypto-based encryption plugin](/premium/)—consider our premium offerings. - -By adopting an offline database approach with RxDB, you unlock speed, reliability, and security for your applications—leading to a truly seamless user experience. - ---- - -## Building an Optimistic UI with RxDB - - -An **Optimistic User Interface (UI)** is a design pattern that provides instant feedback to the user by **assuming** that an operation or server call will succeed. Instead of showing loading spinners or waiting for server confirmations, the UI immediately reflects the user's intended action and later reconciles the displayed data with the actual server response. This approach drastically improves perceived performance and user satisfaction. - -## Benefits of an Optimistic UI - -Optimistic UIs offer a host of advantages, from improving the user experience to streamlining the underlying infrastructure. Below are some key reasons why an optimistic approach can revolutionize your application's performance and scalability. - -### Better User Experience with Optimistic UI -- **No loading spinners, [near-zero latency](./zero-latency-local-first.md)**: Users perceive their actions as instant. Any actual network delays or slow server operations can be handled behind the scenes. -- **Offline capability**: Optimistic UI pairs perfectly with offline-first apps. Users can continue to interact with the application even when offline, and changes will be synced automatically once the network is available again. - - - -### Better Scaling and Easier to Implement -- **Fewer server endpoints**: Instead of sending a separate HTTP request for every single user interaction, you can batch updates and sync them in bulk. -- **Less server load**: By handling changes locally and syncing in batches, you reduce the volume of server round-trips. -- **Automated error handling**: If a request fails or a document is in conflict, RxDB's [replication](../replication.md) mechanism can seamlessly retry and resolve conflicts in the background, without requiring a separate endpoint or manual user intervention. - -
    - - - -
    - -## Building Optimistic UI Apps with RxDB - -Now that we know what an optimistic UI is, lets build one with RxDB. - -### Local Database: The Backbone of an Optimistic UI - -A local database is the heart of an Optimistic UI. With RxDB, **all application state** is stored locally, ensuring seamless and instant updates. You can choose from multiple storage backends based on your runtime - check out [RxDB Storage Options](../rx-storage.md) to see which engines (IndexedDB, SQLite, or custom) suit your environment best. - -- **Instant Writes**: When users perform an action (like clicking a button or submitting a form), the changes are written directly to the local RxDB database. This immediate local write makes the UI feel snappy and removes the dependency on instantaneous server responses. - -- [Offline-First](../offline-first.md): Because data is managed locally, your app continues to operate smoothly even without an internet connection. Users can view, create, and update data at any time, assured that changes will sync automatically once they're back online. - -### Real-Time UI Changes on Updates - -RxDB's core is built around observables that react to any state changes - whether from local writes or incoming replication from the server. - -- **Automatic UI refresh**: Any query or document subscription in RxDB automatically notifies your UI layer when data changes. There's no need to manually poll or refetch. -- **Cross-tab updates**: If you have the same RxDB database open in multiple [browser](./browser-database.md) tabs, changes in one tab instantly propagate to the others. - - - -- **Event-Reduce Algorithm**: Under the hood, RxDB uses the [event-reduce algorithm](https://github.com/pubkey/event-reduce) to minimize overhead. Instead of re-running expensive queries, RxDB calculates the smallest possible updates needed to keep query results accurate - further boosting real-time performance. - -### Replication with a Server - -While local storage is key to an Optimistic UI, most applications ultimately need to sync with a remote back end. RxDB offers a [powerful replication system](../replication.md) that can sync your local data with virtually any server/database in the background: -- **Incremental and real-time**: RxDB continuously pushes local changes to the server when a network is available and fetches server updates as they happen. -- **Conflict resolution**: If changes happen offline or multiple clients update the same data, RxDB detects conflicts and makes it straightforward to resolve them. -- **Flexible transport**: Beyond simple HTTP polling, you can incorporate WebSockets, Server-Sent Events (SSE), or other protocols for instant, server-confirmed changes broadcast to all connected clients. See [this guide](./websockets-sse-polling-webrtc-webtransport.md) to learn more. - -By combining local-first data handling with real-time synchronization, RxDB delivers most of what an Optimistic UI needs - right out of the box. The result is a seamless user experience where interactions never feel blocked by slow networks, and any conflicts or final validations are quietly handled in the background. - - - -#### Handling Offline Changes and Conflicts -- **Offline-first approach**: All writes are initially stored in the local database. When connectivity returns, RxDB's replication automatically pushes changes to the server. -- **Conflict resolution**: If multiple clients edit the same documents while offline, conflicts are automatically detected and can be resolved gracefully (more on conflicts below). - -#### WebSockets, SSE, or Beyond - -For truly real-time communication - where server-confirmed changes instantly reach all clients - you can go beyond simple HTTP polling. Use WebSockets, Server-Sent Events (SSE), or other streaming protocols to broadcast updates the moment they occur. This pattern excels in scenarios like chats, collaborative editors, or dynamic dashboards. - -To learn more about these protocols and their integration with RxDB, check out [this guide](./websockets-sse-polling-webrtc-webtransport.md). - -## Optimistic UI in Various Frameworks - -### Angular Example -
    - -
    - -[Angular](./angular-database.md)'s `async` pipe works smoothly with RxDB's observables. Suppose you have a `myCollection` of documents, you can directly subscribe in the template: - -```html - - - {{ doc.name }} - - -``` -This snippet: - -- Subscribes to `myCollection.find().$`, which emits live updates whenever [documents](../rx-document.md) in the [collection](../rx-collection.md) change. -- Passes the emitted array of documents into docs. -- Renders each document in a list item, instantly reflecting any changes. - -### React Example -
    - -
    - -In [React](./react-database.md), you can utilize signals or other state management tools. For instance, if we have an [RxDB extension](../reactivity.md) that exposes a **signal**: - -```tsx -import React from 'react'; - -function MyComponent({ myCollection }) { - // .find().$$ provides a signal that updates whenever data changes - const docsSignal = myCollection.find().$$; - - return ( - - {docs.map((doc) => ( - {doc.name} - ))} - - ); -} - -export default MyComponent; -``` - -When you call `docsSignal.value` or use a hook like useSignal, it pulls the latest value from the [RxDB query](../rx-query.md). Whenever the collection updates, the signal emits the new data, and React re-renders the component instantly. - -## Downsides of Optimistic UI Apps - -While Optimistic UIs feel snappy, there are some caveats: - -- **Conflict Resolution**: -With an optimistic approach, multiple offline devices might edit the same data. When syncing back, conflicts occur that must be merged. RxDB uses [revisions](../transactions-conflicts-revisions.md) to detect and handle these conflicts. - -- **User Confusion**: -Users may see changes that haven't yet been confirmed by the server. If a subsequent server validation fails, the UI must revert to a previous state. Clear visual feedback or user notifications help reduce confusion. - -- **Server Compatibility**: -The server must be capable of storing and returning revision metadata (for instance, a timestamp or versioning system). Check out RxDB's [replication docs](../replication.md) for details on how to structure your back end. - -- **Storage Limits**: -Storing data in the client has practical [size limits](./indexeddb-max-storage-limit.md). [IndexedDB](../rx-storage-indexeddb.md) or other client-side storages have constraints (though usually quite large). See [storage comparisons](./localstorage-indexeddb-cookies-opfs-sqlite-wasm.md). - -## Conflict Resolution Strategies -- **Last Write to Server Wins**: -A simplest-possible method: whatever update reaches the server last overrides previous data. Good for non-critical data like “like" counts or ephemeral states. -- **Revision-Based Merges**: -Use revision numbers or timestamps to track concurrent edits. Merge them intelligently by combining fields or choosing the latest sub-document changes. This is ideal for collaborative apps where you don't want to overwrite entire records. -- **User Prompts**: -In certain workflows (e.g., shipping forms, e-commerce checkout), you may need to notify the user about conflicts and let them choose which version to keep. -- **First Write to Server Wins (RxDB Default)**: -RxDB's default approach is to let the first successful push define the latest version. Any incoming push with an outdated revision triggers a conflict that must be resolved on the client side. Learn more at [here](../transactions-conflicts-revisions.md). - -## When (and When Not) to Use Optimistic UI -- When to Use - - [Real-time interactions](./realtime-database.md) like chat apps, social feeds, or “Likes." -Situations where high success rates of operations are expected (most writes don't fail). - - Apps that need an [offline-first approach](../offline-first.md) or handle intermittent connectivity gracefully. - -- When Not to Use - - Large, complex transactions with high failure rates. - - Scenarios requiring heavy server validations or approvals (for example, financial transactions with complex rules). - - Workflows where immediate feedback could mislead users about an operation's success probability. - -- Assessing Risk - - Consider the likelihood that a user's action might fail. If it's very low, optimistic UI is often best. - - If frequent failures or complex validations occur, consider a hybrid approach: partial optimistic updates for some actions, while more critical operations rely on immediate server confirmation. - -## Follow Up - -Ready to start building your own Optimistic UI with RxDB? Here are some next steps: - -1. **Do the [RxDB Quickstart](https://rxdb.info/quickstart.html)** - If you're brand new to RxDB, the quickstart guide will walk you through installation and setting up your first project. - -2. **Check Out the Demo App** - A live [RxDB Quickstart Demo](https://pubkey.github.io/rxdb-quickstart/) showcases optimistic updates and real-time syncing. Explore the code to see how it works. - -3. **Star the GitHub Repo** - Show your support for RxDB by starring the [RxDB GitHub Repository](https://github.com/pubkey/rxdb). - -By combining RxDB's powerful offline-first capabilities with the principles of an Optimistic UI, you can deliver snappy, near-instant user interactions that keep your users engaged - no matter the network conditions. Get started today and give your users the experience they deserve! - ---- - -## RxDB as a Database for Progressive Web Apps (PWA) - -Progressive Web Apps (PWAs) have revolutionized the digital landscape, offering users an immersive blend of web and native app experiences. At the heart of every successful PWA lies effective data management, and this is where RxDB comes into play. In this article, we'll explore the dynamic synergy between RxDB, a robust client-side database, and Progressive Web Apps, uncovering how RxDB enhances data handling, synchronization, and overall performance, propelling PWAs into a new era of excellence. - -## What is a Progressive Web App -Progressive Web Apps are the future of web development, seamlessly combining the best of both web and mobile app worlds. They can be easily installed on the user's home screen, function offline, and load at lightning speed. Unlike hybrid apps, PWAs offer a consistent user experience across platforms, making them a versatile choice for modern applications. - -PWAs bring a plethora of advantages to the table. They eliminate the hassle of app store installations and updates, reduce dependency on network connectivity, and prioritize fast loading times. By harnessing the power of service workers and intelligent caching mechanisms, PWAs ensure users can access content even in offline mode. Furthermore, PWAs are device-agnostic, seamlessly adapting to various devices, from desktops to smartphones. - -## Introducing RxDB as a Client-Side Database for PWAs -At the heart of PWAs lies efficient data management, and RxDB steps in as a reliable ally. As a client-side NoSQL database, RxDB seamlessly integrates into web applications, offering real-time data synchronization and manipulation capabilities. This article sheds light on the transformative potential of RxDB as it collaborates harmoniously with PWAs, enabling local-first strategies and elevating user interactions to a whole new level. - -
    - - - -
    - -### Getting Started with RxDB -RxDB emerges as a reactive, schema-based NoSQL database crafted explicitly for client-side applications. Its real-time data synchronization and responsiveness align seamlessly with the dynamic demands of modern PWAs. - -#### Local-First Approach -The cornerstone of RxDB's philosophy is the local-first approach, empowering PWAs to prioritize data storage and manipulation on the client side. This paradigm ensures that PWAs remain functional even when offline, allowing users to access and interact with data seamlessly. RxDB bridges any gaps in data synchronization once network connectivity is restored. - -#### Observable Queries -Observable queries (aka **Live-Queries**) serve as the engine of RxDB's dynamic capabilities. By leveraging these queries, PWAs can monitor and respond to data changes in real time. The result is an engaging user interface with instantaneous updates that captivate users and keep them engaged. - -```ts -await db.heroes.find({ - selector: { - healthpoints: { - $gt: 0 - } - } -}) -.$ // the $ returns an observable that emits each time the result set of the query changes -.subscribe(aliveHeroes => console.dir(aliveHeroes)); -``` - -#### Multi-Tab Support -RxDB extends its prowess to multi-tab scenarios, guaranteeing data consistency across different tabs or windows of the same PWA. This feature promotes a seamless transition between various sections of the application, while minimizing data conflicts. - - - -### Using RxDB in a Progressive Web App -Integrating RxDB into a Progressive Web App, driven by technologies like React, is a straightforward process. By configuring RxDB and installing the necessary packages, developers establish a solid foundation for robust data management within their PWA. - -## Exploring Different RxStorage Layers -RxDB caters to diverse needs through its various RxStorage layers: - -- [localstorage RxStorage](../rx-storage-localstorage.md): Leveraging the capabilities of the browsers localstorage API for storage. -- [IndexedDB RxStorage](../rx-storage-indexeddb.md): Tapping into the browser's IndexedDB for efficient data storage. -- [OPFS RxStorage](../rx-storage-opfs.md): Interfacing with the Offline-First Persistence System for seamless persistence. -- [Memory RxStorage](../rx-storage-memory.md): Storing data in memory, ideal for temporary data requirements. -This flexibility empowers developers to optimize data storage based on the unique needs of their PWA. - -Synchronizing Data with RxDB between PWA Clients and Servers -To facilitate seamless data synchronization between PWA clients and servers, RxDB offers a range of replication options: - -- [RxDB Replication Algorithm](../replication.md): RxDB introduces its own replication algorithm, enabling efficient and reliable data synchronization between clients and servers. - -- [CouchDB Replication](../replication-couchdb.md): Leveraging its roots in CouchDB, RxDB facilitates smooth data replication between clients and CouchDB servers, ensuring data consistency and synchronization across devices. - -- [Firestore Replication](../replication-firestore.md): RxDB synchronizes data with Google Firestore, a real-time cloud-hosted NoSQL database. This integration guarantees up-to-date data across different instances of the PWA. - -- [Peer-to-Peer (P2P) via WebRTC](../replication-webrtc.md) Replication: RxDB supports P2P replication, facilitating direct data synchronization between clients without intermediaries. This decentralized approach is invaluable in scenarios where server infrastructure is limited. - -## Advanced RxDB Features and Techniques -### Encryption of Local Data -RxDB empowers PWAs with the ability to encrypt local data, enhancing data security and safeguarding sensitive information. This feature is indispensable for applications handling user credentials, financial transactions, and other confidential data. - -### Indexing and Performance Optimization -Performance optimization is a top priority for PWAs. RxDB addresses this concern by offering indexing options that expedite data retrieval, resulting in a snappier user interface and heightened responsiveness. - -### JSON Key Compression -RxDB introduces JSON key compression, a feature that reduces storage requirements. This optimization is particularly beneficial for PWAs dealing with substantial data volumes, enhancing overall efficiency and resource utilization. - -### Change Streams and Event Handling -RxDB introduces change streams, enabling PWAs to react to data changes in real time. This capability empowers dynamic updates to the user interface, promoting interactivity and engagement. - -## Conclusion -In the ever-evolving landscape of web application development, Progressive Web Apps continue to redefine user experiences. RxDB emerges as a pivotal player, seamlessly integrating with PWAs and enhancing their capabilities. With features like the local-first approach, observable queries, replication mechanisms, and advanced encryption, RxDB empowers developers to create responsive, offline-capable, and data-driven PWAs. As the demand for sophisticated PWAs continues to surge, RxDB remains an indispensable tool for developers aiming to push the boundaries of innovation and redefine the standards of user engagement. By embracing RxDB, developers ensure their PWAs remain at the forefront of the digital revolution, offering seamless and immersive experiences to users around the world. - -## Follow Up -To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: - -- [RxDB GitHub Repository](https://github.com/pubkey/rxdb): Visit the official GitHub repository of RxDB to access the source code, documentation, and community support. -- [RxDB Quickstart](../quickstart.md): Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects. -- [RxDB Progressive Web App in Angular Example](https://github.com/pubkey/rxdb/tree/master/examples/angular) - ---- - -## RxDB as a Database for React Applications - -In the rapidly evolving landscape of web development, React has emerged as a cornerstone technology for building dynamic and responsive user interfaces. With the increasing complexity of modern web applications, efficient data management becomes pivotal. This article delves into the integration of RxDB, a potent client-side database, with React applications to optimize data handling and elevate the overall user experience. - -React has revolutionized the way web applications are built by introducing a component-based architecture. This approach enables developers to create reusable UI components that efficiently update in response to changes in data. The virtual DOM mechanism, a key feature of React, facilitates optimized rendering, enhancing performance and user interactivity. - -While React excels at managing the user interface, the need for efficient data storage and retrieval mechanisms is equally significant. A client-side database brings several advantages to React applications: - -- Improved Performance: Local data storage reduces the need for frequent server requests, resulting in faster data retrieval and enhanced application responsiveness. -- Offline Capabilities: A client-side database enables offline access to data, allowing users to interact with the application even when they are disconnected from the internet. -- Real-Time Updates: With the ability to observe changes in data, client-side databases facilitate real-time updates to the UI, ensuring users are always presented with the latest information. -- Reduced Server Load: By handling data operations locally, client-side databases alleviate the load on the server, contributing to a more scalable architecture. - -## Introducing RxDB as a JavaScript Database -RxDB, a powerful JavaScript database, has garnered attention as an optimal solution for managing data in React applications. Built on top of the IndexedDB standard, RxDB combines the principles of reactive programming with database management. Its core features include reactive data handling, offline-first capabilities, and robust data replication. - -
    - - - -
    - -## What is RxDB? -RxDB, short for Reactive Database, is an open-source JavaScript database that seamlessly integrates reactive programming with database operations. It offers a comprehensive API for performing database actions and synchronizing data across clients and servers. RxDB's underlying philosophy revolves around observables, allowing developers to reactively manage data changes and create dynamic user interfaces. - -### Reactive Data Handling -One of RxDB's standout features is its support for reactive data handling. Traditional databases often require manual intervention for data fetching and updating, leading to complex and error-prone code. RxDB, however, automatically notifies subscribers whenever data changes occur, eliminating the need for explicit data manipulation. This reactive approach simplifies code and enhances the responsiveness of React components. - -### Local-First Approach -RxDB embraces a [local-first](../offline-first.md) methodology, enabling applications to function seamlessly even in offline scenarios. By storing data locally, RxDB ensures that users can interact with the application and make updates regardless of internet connectivity. Once the connection is reestablished, RxDB synchronizes the local changes with the remote database, maintaining data consistency across devices. - -### Data Replication -Data replication is a cornerstone of modern applications that require synchronization between multiple clients and servers. RxDB provides robust data replication mechanisms that facilitate real-time synchronization between different instances of the database. This ensures that changes made on one client are promptly propagated to others, contributing to a cohesive and unified user experience. - -### Observable Queries -RxDB extends the concept of observables beyond data changes. It introduces observable queries, allowing developers to observe the results of database queries. This feature enables automatic updates to query results whenever relevant data changes occur. Observable queries simplify state management by eliminating the need to manually trigger updates in response to changing data. - -```ts -await db.heroes.find({ - selector: { - healthpoints: { - $gt: 0 - } - } -}) -.$ // the $ returns an observable that emits each time the result set of the query changes -.subscribe(aliveHeroes => console.dir(aliveHeroes)); -``` - -### Multi-Tab Support -Web applications often operate in multiple browser tabs or windows. RxDB accommodates this scenario by offering built-in multi-tab support. It ensures that data changes made in one tab are efficiently propagated to other tabs, maintaining data consistency and providing a seamless experience for users interacting with the application across different tabs. - - - -### RxDB vs. Other React Database Options -While considering database options for React applications, RxDB stands out due to its unique combination of reactive programming and database capabilities. Unlike traditional solutions such as IndexedDB or Web Storage, which provide basic data storage, RxDB offers a dedicated database solution with advanced features. Additionally, while state management libraries like Redux and MobX can be adapted for database use, RxDB provides an integrated solution specifically designed for handling data. - -### IndexedDB in React and the Advantage of RxDB - -Using IndexedDB directly in React can be challenging due to its low-level, callback-based API which doesn't align neatly with modern React's Promise and async/await patterns. This intricacy often leads to bulky and complex implementations for developers. Also, when used wrong, IndexedDB can have a worse [performance profile](../slow-indexeddb.md) then it could have. In contrast, RxDB, with the [IndexedDB RxStorage](../rx-storage-indexeddb.md) and the [LocalStorage RxStorage](../rx-storage-localstorage.md), abstracts these complexities, integrating reactive programming and providing a more streamlined experience for data management in React applications. Thus, RxDB offers a more intuitive approach, eliminating much of the manual overhead required with IndexedDB. - -### Using RxDB in a React Application - -The process of integrating RxDB into a React application is straightforward. Begin by installing RxDB as a dependency: -`npm install rxdb rxjs` -Once installed, RxDB can be imported and initialized within your React components. The following code snippet illustrates a basic setup: - -```javascript -import { createRxDatabase } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -const db = await createRxDatabase({ - name: 'heroesdb', // <- name - storage: getRxStorageLocalstorage(), // <- RxStorage - password: 'myPassword', // <- password (optional) - multiInstance: true, // <- multiInstance (optional, default: true) - eventReduce: true, // <- eventReduce (optional, default: false) - cleanupPolicy: {} // <- custom cleanup policy (optional) -}); -``` - -### Using RxDB React Hooks -The [rxdb-hooks](https://github.com/cvara/rxdb-hooks) package provides a set of React hooks that simplify data management within components. These hooks leverage RxDB's reactivity to automatically update components when data changes occur. The following example demonstrates the usage of the `useRxCollection` and `useRxQuery` hooks to query and observe a collection: - -```ts -const collection = useRxCollection('characters'); -const query = collection.find().where('affiliation').equals('Jedi'); -const { - result: characters, - isFetching, - fetchMore, - isExhausted, -} = useRxQuery(query, { - pageSize: 5, - pagination: 'Infinite', -}); - -if (isFetching) { - return 'Loading...'; -} - -return ( - - {characters.map((character, index) => ( - - ))} - {!isExhausted && } - -); -``` - -### Different RxStorage Layers for RxDB -RxDB offers multiple storage layers, each backed by a different underlying technology. Developers can choose the storage layer that best suits their application's requirements. Some available options include: - -- [LocalStorage RxStorage](../rx-storage-localstorage.md): Built on top of the browsers localstorage API. -- [IndexedDB RxStorage](../rx-storage-indexeddb.md): The default RxDB storage layer, providing efficient data storage in modern browsers. -- [OPFS RxStorage](../rx-storage-opfs.md): Uses the Operational File System (OPFS) for storage, suitable for [Electron applications](../electron-database.md). -- [Memory RxStorage](../rx-storage-memory.md): Stores data in memory, primarily intended for testing and development purposes. -- [SQLite RxStorage](../rx-storage-sqlite.md): Stores data in an SQLite database. Can be used in a browser with react by using a SQLite database that was [compiled to WebAssembly](https://sqlite.org/wasm/doc/trunk/index.md). Using SQLite in react might not be the best idea, because a compiled SQLite wasm file is about one megabyte of code that has to be loaded and rendered by your users. Using native browser APIs like IndexedDB and OPFS have shown to be a more optimal database solution for browser based react apps compared to SQLite. - -### Synchronizing Data with RxDB between Clients and Servers -The offline-first approach is a fundamental principle of RxDB's design. When dealing with client-server synchronization, RxDB ensures that changes made offline are captured and propagated to the server once connectivity is reestablished. This mechanism guarantees that data remains consistent across different client instances, even when operating in an occasionally connected environment. - -RxDB offers a range of [replication plugins](../replication.md) that facilitate data synchronization between clients and servers. These plugins support various synchronization strategies, such as one-way replication, two-way replication, and custom conflict resolution. Developers can select the appropriate plugin based on their application's synchronization requirements. - - - -### Advanced RxDB Features and Techniques -Encryption of Local Data -Security is paramount when handling sensitive user data. RxDB supports [data encryption](./react-native-encryption.md), ensuring that locally stored information remains protected from unauthorized access. This feature is particularly valuable when dealing with sensitive data in offline scenarios. - -### Indexing and Performance Optimization -Efficient indexing is critical for achieving optimal database performance. RxDB provides mechanisms to define indexes on specific fields, enhancing query speed and reducing the computational overhead of data retrieval. - -### JSON Key Compression -RxDB employs JSON key compression to reduce storage space and improve performance. This technique minimizes the memory footprint of the database, making it suitable for applications with limited resources. - -### Change Streams and Event Handling -RxDB enables developers to subscribe to change streams, which emit events whenever data changes occur. This functionality facilitates real-time event handling and provides opportunities for implementing features such as notifications and live updates. - -## Conclusion -In the realm of React application development, efficient data management is pivotal to delivering a seamless and engaging user experience. RxDB emerges as a compelling solution, seamlessly integrating reactive programming principles with sophisticated database capabilities. By adopting RxDB, React developers can harness its powerful features, including reactive data handling, offline-first support, and real-time synchronization. With RxDB as a foundational pillar, React applications can excel in responsiveness, scalability, and data integrity. As the landscape of web development continues to evolve, RxDB remains a steadfast companion for creating robust and dynamic React applications. - -## Follow Up -To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: - -- [RxDB GitHub Repository](https://github.com/pubkey/rxdb): Visit the official GitHub repository of RxDB to access the source code, documentation, and community support. -- [RxDB Quickstart](../quickstart.md): Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects. -- [RxDB React Example at GitHub](https://github.com/pubkey/rxdb/tree/master/examples/react) - ---- - -## IndexedDB Database in React Apps - The Power of RxDB - - -Building robust, [offline-capable](../offline-first.md) React applications often involves leveraging browser storage solutions to manage data. IndexedDB is one such powerful tool, but its raw API can be challenging to work with directly. RxDB abstracts away much of IndexedDB's complexity, providing a more developer-friendly experience. In this article, we'll explore what IndexedDB is, why it's beneficial in React applications, the challenges of using plain IndexedDB, and how [RxDB](https://rxdb.info/) can simplify your development process while adding advanced features. - -## What is IndexedDB? - -[IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) is a low-level API for storing significant amounts of structured data in the browser. It provides a transactional database system that can store key-value pairs, complex objects, and more. This storage engine is asynchronous and supports advanced data types, making it suitable for offline storage and complex web applications. - -
    - -
    - -## Why Use IndexedDB in React - -When building React applications, IndexedDB can play a crucial role in enhancing both performance and user experience. Here are some reasons to consider using IndexedDB: - -- **Offline-First / Local-First**: By storing data locally, your application remains functional even without an internet connection. -- **Performance**: Using local data means [zero latency](./zero-latency-local-first.md) and no loading spinners, as data doesn't need to be fetched over a network. -- **Easier Implementation**: Replicating all data to the client once is often simpler than implementing multiple endpoints for each user interaction. -- **Scalability**: Local data reduces server load because queries run on the client side, decreasing server bandwidth and processing requirements. - -## Why To Not Use Plain IndexedDB - -While IndexedDB itself is powerful, its native API comes with several drawbacks for everyday application developers: - -- **Callback-Based API**: IndexedDB was designed with callbacks rather than modern Promises, making asynchronous code more cumbersome. -- **Complexity**: IndexedDB is low-level, intended for library developers rather than for app developers who simply want to store data. -- **Basic Query API**: Its rudimentary query capabilities limit how you can efficiently perform complex queries, whereas libraries like RxDB offer more advanced query features. -- **TypeScript Support**: Ensuring good TypeScript support with IndexedDB is challenging, especially when trying to enforce document type consistency. -- **Lack of Observable API**: IndexedDB doesn't provide an observable API out of the box. RxDB solves this by enabling you to observe query results or specific document fields. -- **Cross-Tab Communication**: Managing cross-tab updates in plain IndexedDB is difficult. RxDB handles this seamlessly-changes in one tab automatically affect observed data in others. -- **Missing Advanced Features**: Features like encryption or compression aren't built into IndexedDB, but they are available via RxDB. -- **Limited Platform Support**: IndexedDB exists only in the browser. In contrast, RxDB offers swappable storages to use the same code in React Native, Capacitor, or Electron. - -
    - - - -
    - -## Set up RxDB in React - -Setting up RxDB with React is straightforward. It abstracts IndexedDB complexities and adds a layer of powerful features over it. - -### Installing RxDB - -First, install RxDB and RxJS from npm: - -```bash -npm install rxdb rxjs --save``` -``` - -### Create a Database and Collections - -RxDB provides two main storage options: -- The free [localstorage-based storage](../rx-storage-localstorage.md) -- The premium plain [IndexedDB-based storage](../rx-storage-indexeddb.md), offering faster performance -Below is an example of setting up a simple RxDB [database](./react-database.md) using the localstorage-based storage in a React app: - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -// create a database -const db = await createRxDatabase({ - name: 'heroesdb', // the name of the database - storage: getRxStorageLocalstorage() -}); - -// Define your schema -const heroSchema = { - title: 'hero schema', - version: 0, - description: 'Describes a hero in your app', - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 - }, - name: { - type: 'string' - }, - power: { - type: 'string' - } - }, - required: ['id', 'name'] -}; - -// add collections -await db.addCollections({ - heroes: { - schema: heroSchema - } -}); -``` - -### CRUD Operations - -Once your database is initialized, you can perform all CRUD operations: - -```ts -// insert -await db.heroes.insert({ name: 'Iron Man', power: 'Genius-level intellect' }); - -// bulk insert -await db.heroes.bulkInsert([ - { name: 'Thor', power: 'God of Thunder' }, - { name: 'Hulk', power: 'Superhuman Strength' } -]); - -// find and findOne -const heroes = await db.heroes.find().exec(); -const ironMan = await db.heroes.findOne({ selector: { name: 'Iron Man' } }).exec(); - -// update -const doc = await db.heroes.findOne({ selector: { name: 'Hulk' } }).exec(); -await doc.update({ $set: { power: 'Unlimited Strength' } }); - -// delete -const doc = await db.heroes.findOne({ selector: { name: 'Thor' } }).exec(); -await doc.remove(); -``` - -## Reactive Queries and Live Updates - -RxDB excels in providing reactive data capabilities, ideal for [real-time applications](./realtime-database.md). There are two main approaches to achieving live queries with RxDB: using RxJS Observables with React Hooks or utilizing Preact Signals. - - - -### With RxJS Observables and React Hooks - -RxDB integrates seamlessly with RxJS Observables, allowing you to build reactive components. Here's an example of a React component that subscribes to live data updates: - -```ts -import { useState, useEffect } from 'react'; - -function HeroList({ collection }) { - const [heroes, setHeroes] = useState([]); - - useEffect(() => { - // create an observable query - const query = collection.find(); - const subscription = query.$.subscribe(newHeroes => { - setHeroes(newHeroes); - }); - return () => subscription.unsubscribe(); - }, [collection]); - - return ( - - Hero List - - {heroes.map(hero => ( - - {hero.name} - {hero.power} - - ))} - - - ); -} -``` - -This component subscribes to the collection's changes, updating the UI automatically whenever the underlying data changes, even across browser tabs. - -### With Preact Signals - -RxDB also supports Preact Signals for reactivity, which can be integrated into React applications. Preact Signals offer a modern, fine-grained reactivity model. - -First, install the necessary package: -```bash -npm install @preact/signals-core --save -``` -Set up RxDB with Preact Signals reactivity: - -```ts -import { PreactSignalsRxReactivityFactory } from 'rxdb/plugins/reactivity-preact-signals'; -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -const database = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage(), - reactivity: PreactSignalsRxReactivityFactory -}); -``` - -Now, you can obtain signals directly from RxDB queries using the double-dollar sign (`$$`): - -```ts -function HeroList({ collection }) { - const heroes = collection.find().$$; - return ( - - {heroes.map(hero => ( - {hero.name} - ))} - - ); -} -``` - -This approach provides automatic updates whenever the data changes, without needing to manage subscriptions manually. - -## React IndexedDB Example with RxDB - -A comprehensive example of using RxDB within a React application can be found in the [RxDB GitHub repository](https://github.com/pubkey/rxdb/tree/master/examples/react). This repository contains sample applications, showcasing best practices and demonstrating how to integrate RxDB for various use cases. - -## Advanced RxDB Features - -RxDB offers many advanced features that extend beyond basic data storage: - -- **RxDB Replication**: Synchronize local data with remote databases seamlessly. Learn more: [RxDB Replication](https://rxdb.info/replication.html) -- **Data Migration**: Handle schema changes gracefully with automatic data migrations. See: [Data migration](https://rxdb.info/migration-schema.html) -- **Encryption**: Secure your data with built-in encryption capabilities. Explore: [Encryption](https://rxdb.info/encryption.html) -- **Compression**: Optimize storage using key compression. Details: [Compression](https://rxdb.info/key-compression.html) - -## Limitations of IndexedDB - -While IndexedDB is powerful, it has some inherent limitations: - -- **Performance**: IndexedDB can be slow under certain conditions. Read more: [Slow IndexedDB](https://rxdb.info/slow-indexeddb.html) -- **Storage Limits**: Browsers [impose limits](./indexeddb-max-storage-limit.md) on how much data can be stored. See: [Browser storage limits](https://rxdb.info/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html) - -## Alternatives to IndexedDB -Depending on your application's requirements, there are [alternative storage solutions](./localstorage-indexeddb-cookies-opfs-sqlite-wasm.md) to consider: - -- **Origin Private File System (OPFS)**: A newer API that can offer better performance. RxDB supports OPFS as well. More info: [RxDB OPFS Storage](../rx-storage-opfs.md) -- **SQLite**: Ideal for React applications on Capacitor or [Ionic](./ionic-storage.md), offering native performance. Explore: [RxDB SQLite Storage](../rx-storage-sqlite.md) - -## Performance comparison with other browser storages -Here is a [performance overview](../rx-storage-performance.md) of the various browser based storage implementation of RxDB: - - - -## Follow Up -- Learn how to use RxDB with the [RxDB Quickstart](../quickstart.md) for a guided introduction. -- Check out the [RxDB GitHub repository](https://github.com/pubkey/rxdb) and leave a star ⭐ if you find it useful. - -By leveraging RxDB on top of IndexedDB, you can create highly responsive, offline-capable React applications without dealing with the low-level complexities of IndexedDB directly. With reactive queries, seamless cross-tab communication, and powerful advanced features, RxDB becomes an invaluable tool in modern web development. - ---- - -## React Native Encryption and Encrypted Database/Storage - - -Data security is a critical concern in modern mobile applications. As React Native continues to grow in popularity for building cross-platform apps, ensuring that your data is protected is paramount. RxDB, a real-time database for JavaScript applications, offers powerful encryption features that can help you secure your React Native app's data. - -This article explains why encryption is important, how to set it up with RxDB in [React Native](../react-native-database.md), and best practices to keep your app secure. - -## 🔒 Why Encryption Matters - -Encryption ensures that, even if an unauthorized party obtains physical access to your device or intercepts data, they cannot read the information without the encryption key. Sensitive user data such as credentials, personal information, or financial details should always be encrypted. Proper encryption practices reduce the risk of data breaches and help your application remain compliant with regulations like [GDPR](https://gdpr.eu/) or [HIPAA](https://www.hhs.gov/hipaa/index.html). - -## React Native Encryption Overview - -React Native supports multiple ways to secure local data: - -1. **Encrypted Databases** - Use databases with built-in encryption capabilities, such as SQLite with encryption layers or RxDB with its [encryption plugin](../encryption.md). - -2. **Secure Storage Libraries** - For key-value data (like tokens or secrets), you can use libraries like [react-native-keychain](https://github.com/oblador/react-native-keychain) or [react-native-encrypted-storage](https://github.com/emeraldsanto/react-native-encrypted-storage). - -3. **Custom Encryption** - If you need more fine-grained control, you can integrate libraries like [`crypto-js`](https://github.com/brix/crypto-js) or the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) to encrypt data before storing it in a database or file. - -
    - - - -
    - -## Setting Up Encryption in RxDB for React Native - -### 1. Install RxDB and Required Plugins - -Install RxDB and the encryption plugin(s) you need. For the CryptoJS plugin: - -```bash -npm install rxdb -npm install crypto-js -``` - -### 2. Set Up Your RxDB Database with Encryption - -RxDB offers two [encryption plugins](../encryption.md): -- **CryptoJS Plugin**: A free and straightforward solution for most basic use cases. -- **Web Crypto Plugin**: A [premium plugin](/premium) that utilizes the native Web Crypto API for better performance and security. - -Below is an example showing how to set up RxDB using the CryptoJS plugin. This example uses the [in-memory storage](../rx-storage-memory.md) for testing purposes. In a real production scenario, you would use a persistent storage adapter, mostly the [SQLite-based storage](../rx-storage-sqlite.md). - -```js -import { createRxDatabase } from 'rxdb'; -import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; - -/* - * For testing, we use the in-memory storage of RxDB. - * In production you would use the persistent SQLite based storage instead. - */ -import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; - -async function initEncryptedDatabase() { - // Wrap the normal storage with the encryption plugin - const encryptedMemoryStorage = wrappedKeyEncryptionCryptoJsStorage({ - storage: getRxStorageMemory() - }); - - // Create an encrypted database - const db = await createRxDatabase({ - name: 'myEncryptedDatabase', - storage: encryptedMemoryStorage, - password: 'sudoLetMeIn' // Make sure not to hardcode in production - }); - - // Define a schema and create a collection - await db.addCollections({ - secureData: { - schema: { - title: 'secure data schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { - type: 'string', - maxLength: 100 - }, - normalField: { - type: 'string' - }, - secretField: { - type: 'string' - } - }, - required: ['id', 'normalField', 'secretField'] - } - } - }); - - return db; -} -``` - -### 3. Inserting and Querying Encrypted Data - -Once you've set up the database with encryption, data in fields specified by your schema will be encrypted automatically before it is stored, and decrypted when queried. - -```js -(async () => { - const db = await initEncryptedDatabase(); - - // Insert encrypted data - const doc = await db.secureData.insert({ - id: 'mySecretId', - normalField: 'foobar', - secretField: 'This is top secret data' - }); - - // Query encrypted data by its primary key or non-encrypted fields - const fetchedDoc = await db.secureData.findOne({ - selector: { - normalField: 'foobar' - } - }).exec(true); - console.log(fetchedDoc.secretField); // 'This is top secret data' - - // Update data - await fetchedDoc.patch({ - secretField: 'Updated secret data' - }); -})(); -``` - -**Note**: You can only query directly by non-encrypted fields or primary keys. Encrypted fields cannot be used in queries because they are stored as ciphertext in the database. A common approach is to have a small subset of fields that need to be queried unencrypted while storing any sensitive data in encrypted fields. - -## Best Practices for React Native Encryption - -- **Secure Password Handling** - - Avoid hardcoding passwords or encryption keys. - - Use secure storage solutions like React Native Keychain or react-native-encrypted-storage to fetch the database password at runtime: - -```js -// Example: using react-native-keychain to securely retrieve a stored password -import * as Keychain from 'react-native-keychain'; - -async function getDatabasePassword() { - const credentials = await Keychain.getGenericPassword(); - if (credentials) { - return credentials.password; - } - throw new Error('No password stored in Keychain'); -} -``` - -- **Encrypt Attachments**: -If you need to store files (images, text files, etc.), consider encrypting attachments. RxDB supports attachments that can be encrypted automatically, ensuring your files are protected: - -```ts -import { createBlob } from 'rxdb/plugins/core'; -const doc = await await db.secureData.findOne({ - selector: { - normalField: 'foobar' - } -}).exec(true); -const attachment = await doc.putAttachment({ - id: 'encryptedFile.txt', - data: createBlob('Sensitive content', 'text/plain'), - type: 'text/plain', -}); -``` - -- **Optimize Performance** - - If performance is critical, consider using the premium Web Crypto plugin, which leverages native APIs for faster encryption and decryption. - - If big chunks of data are encrypted, store them in attachments instead of document fields. Attachments will only be decrypted on explicit fetches, not during queries. - -- **Use DevMode in Development**: RxDB's [DevMode Plugin](../dev-mode.md) can help validate your schema and encryption setup during development. Disable it in production for performance reasons. - -- **Secure Communication**: - - Use HTTPS to secure network communication between the app and any backend services. - - If you're synchronizing data to a server, ensure the data is also encrypted in transit. RxDB's [replication plugins](../replication.md) can work with secure endpoints to keep data consistent. - -- **SSL Pinning**: Consider SSL Pinning if you want to prevent man-in-the-middle attacks. SSL Pinning ensures the device trusts only the pinned certificate, preventing attackers from swapping out valid certificates with their own. - -## Follow Up - -- Learn how to use RxDB with the [RxDB Quickstart](../quickstart.md) for a guided introduction. -- A good way to learn using RxDB database with React Native is to check out the [RxDB React Native example](https://github.com/pubkey/rxdb/tree/master/examples/react-native) and use that as a tutorial. -- Check out the [RxDB GitHub repository](https://github.com/pubkey/rxdb) and leave a star ⭐ if you find it useful. -- Learn more about the [RxDB encryption plugins](../encryption.md). - -By following these best practices and leveraging RxDB's powerful encryption plugins, you can build secure, performant, and robust React Native applications that keep your users' data safe. - ---- - -## ReactJS Storage - From Basic LocalStorage to Advanced Offline Apps with RxDB - -# ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB - -Modern **ReactJS** applications often need to store data on the client side. Whether you’re preserving simple user preferences or building offline-ready features, choosing the right **storage** mechanism can make or break your development experience. In this guide, we’ll start with a basic **localStorage** approach for minimal data. Then, we’ll explore more powerful, reactive solutions via [RxDB](/)—including offline functionality, indexing, `preact signals`, and even encryption. - ---- - -## Part 1: Storing Data in ReactJS with LocalStorage - -`localStorage` is a built-in browser API for storing key-value pairs in the user’s browser. It’s straightforward to set and get items—ideal for trivial preferences or small usage data. - -```jsx -import React, { useState, useEffect } from 'react'; - -function LocalStorageExample() { - const [username, setUsername] = useState(() => { - const saved = localStorage.getItem('username'); - return saved ? JSON.parse(saved) : ''; - }); - - useEffect(() => { - localStorage.setItem('username', JSON.stringify(username)); - }, [username]); - - return ( - - ReactJS LocalStorage Demo - setUsername(e.target.value)} - placeholder="Enter your username" - /> - Stored: {username} - - ); -} - -export default LocalStorageExample; -``` - -**Pros** of localStorage in ReactJS: - -- Easy to implement quickly for minimal data -- Built-in to the browser—no extra libs -- Persistent across sessions - -**Downsides of localStorage** -While localStorage is convenient for small amounts of data, it has certain limitations: - -- Synchronous: Reading or writing localStorage can block the main thread if data is large. -- No advanced queries: You only store stringified objects by a single key. Searching or filtering requires manually scanning everything. -- No concurrency or offline logic: If multiple tabs or users need to manipulate the same data, localStorage doesn’t handle concurrency or sync with a server. -- No indexing: You can’t perform partial lookups or advanced matching. - -For “remember user preference” use cases, localStorage is excellent. But if your app grows complex—needing structured data, large data sets, or offline-first features—you might quickly surpass localStorage’s utility. - -## Part 2: LocalStorage vs. IndexedDB - -While localStorage is simple, it’s limited to string-based key-value lookups and can be synchronous for all reads/writes. For more robust ReactJS storage needs, browsers also provide IndexedDB—a low-level, asynchronous API that can store larger amounts of JSON data with indexing. - -**LocalStorage:** - -- Good for small amounts of data (like user settings or flags) -- String-only storage -- Single key-value access, no searching by subfields - -**IndexedDB:** - -- Stores [large](./indexeddb-max-storage-limit.md) JSON objects, able to index by multiple fields -- Asynchronous and usually more scalable -- More complicated to use directly (i.e., not as simple as .getItem()) -[RxDB](/), as you’ll see, simplifies [IndexedDB](../rx-storage-indexeddb.md) usage in ReactJS by adding a more intuitive layer for queries, reactivity, and advanced capabilities like [encryption](../encryption.md). - -
    - - - -
    - -## Part 3: Moving Beyond Basic Storage: RxDB for ReactJS - -When data shapes get complex—large sets of nested documents, or you want offline sync to a server—RxDB can transform your approach to ReactJS storage. It stores documents in (usually) IndexedDB or alternative backends but offers a reactive, NoSQL-based interface. - -### RxDB Quick Example (Observables) - -```ts -import { createRxDatabase } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -(async function setUpRxDB() { - const db = await createRxDatabase({ - name: 'heroDB', - storage: getRxStorageLocalstorage(), - multiInstance: false - }); - - const heroSchema = { - title: 'hero schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string' }, - name: { type: 'string' }, - power: { type: 'string' } - }, - required: ['id', 'name'] - }; - - await db.addCollections({ heroes: { schema: heroSchema } }); - - // Insert a doc - await db.heroes.insert({ id: '1', name: 'AlphaHero', power: 'Lightning' }); - - // Query docs once - const allHeroes = await db.heroes.find().exec(); - console.log('Heroes: ', allHeroes); -})(); -``` - -Reactive Queries: In a React component, you can subscribe to a query via RxDB’s $ property, letting your UI automatically update when data changes. React components can subscribe to updates from .find() queries, letting the UI automatically reflect changes—perfect for dynamic offline-first apps. - -```tsx -import React, { useEffect, useState } from 'react'; - -function HeroList({ collection }) { - const [heroes, setHeroes] = useState([]); - - useEffect(() => { - const query = collection.find(); - // query.$ is an RxJS Observable that emits whenever data changes - const sub = query.$.subscribe(newHeroes => { - setHeroes(newHeroes); - }); - - return () => sub.unsubscribe(); // clean up subscription - }, [collection]); - - return ( - - {heroes.map(hero => ( - - {hero.name} - Power: {hero.power} - - ))} - - ); -} - -export default HeroList; -``` - - - -By using these reactive queries, your React app knows exactly when data changes locally (or from another browser tab) or from remote sync, keeping your UI in sync effortlessly. - -## Part 4: Using Preact Signals Instead of Observables - -RxDB typically exposes reactivity via RxJS observables. However, some developers prefer newer reactivity approaches like Preact Signals. RxDB supports them via a special plugin or advanced usage: - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -import { PreactSignalsRxReactivityFactory } from 'rxdb/plugins/reactivity-preact-signals'; - -(async function setUpRxDBWithSignals() { - const db = await createRxDatabase({ - name: 'heroDB_signals', - storage: getRxStorageLocalstorage(), - reactivity: PreactSignalsRxReactivityFactory - }); - - // Create a signal-based query instead of using Observables: - const collection = db.heroes; - const heroesSignal = collection.find().$$; // signals version - // Now you can reference heroesSignal() in Preact or React with adapter usage -})(); -``` - -Preact Signals rely on `signals` instead of `Observables`. Some developers find them more straightforward to adopt, especially for fine-grained reactivity. In ReactJS, you might still prefer RxJS-based subscriptions unless you add bridging code for signals. - -## Part 5: Encrypting the Storage with RxDB - -For more advanced ReactJS storage needs—especially when sensitive user data is involved - you might want to encrypt stored documents at rest. RxDB provides a robust [encryption plugin](../encryption.md): - -```ts -import { createRxDatabase } from 'rxdb'; -import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -(async function secureSetup() { - const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ - storage: getRxStorageLocalstorage() - }); - - // Provide a password for encryption - const db = await createRxDatabase({ - name: 'secureReactStorage', - storage: encryptedStorage, - password: 'MyStrongPassword123' - }); - - await db.addCollections({ - secrets: { - schema: { - title: 'secret schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string' }, - secretInfo: { type: 'string' } - }, - required: ['id'], - encrypted: ['secretInfo'] // field to encrypt - } - } - }); -})(); -``` - -All data in the marked `encrypted` fields is automatically encrypted at rest. This is crucial if you store user credentials, private messages, or other personal data in your ReactJS application storage. - -## Offline Sync -If you need multi-device or multi-user data synchronization, RxDB provides [replication plugins](../replication.md) for various endpoints (HTTP, [GraphQL](../replication-graphql.md), [CouchDB](../replication-couchdb.md), [Firestore](../replication-firestore.md), etc.). Your [local offline](../offline-first.md) changes can then merge automatically with a remote database whenever internet connectivity is restored. - -## Overview: [localStorage vs IndexedDB vs RxDB](./localstorage-indexeddb-cookies-opfs-sqlite-wasm.md) - -| **Characteristic** | **localStorage** | **IndexedDB** | **RxDB** | -|--------------------------|---------------------------------------------------------------------|----------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------| -| **Data Model** | Key-value store (only strings) | Low-level, JSON-like storage engine with object stores and indexes | NoSQL JSON documents with optional JSON-Schema | -| **Query Capabilities** | Basic get/set by key; manual parse for more complex searches | Index-based queries, but API is fairly verbose; lacks a high-level query language | JSON-based queries, optional indexes, real-time reactivity | -| **Observability** | None. Must re-fetch data yourself. | None natively. Must implement eventing or manual re-check. | Built-in reactivity. UI auto-updates via Observables or Preact signals | -| **Large Data Usage** | Not recommended for large data (blocking, synchronous calls) | Better for large amounts of data, asynchronous reads/writes | Scales for medium to large data. Uses IndexedDB or other storages under the hood | -| **Concurrency** | Minimal. Overwrites if multiple tabs write simultaneously | Multiple tabs can open the same DB, but must handle concurrency logic carefully | Multi-instance concurrency with built-in conflict resolution plugins if needed | -| **Offline Sync** | None. Purely local. | None out of the box. Must be implemented manually | Built-in replication to remote endpoints (HTTP, GraphQL, CouchDB, etc.) for offline-first usage | -| **Encryption** | Not supported natively | Not supported natively; must encrypt data manually before storing | Encryption plugins available. Supports field-level encryption at rest | -| **Usage** | Great for small flags or settings - -## Follow Up - -If you’re looking to dive deeper into **ReactJS storage** topics and take full advantage of RxDB’s offline-first, real-time capabilities, here are some recommended resources: - -- **[RxDB Official Documentation](../overview.md)** - Explore detailed guides on setting up storage adapters, defining [JSON schemas](../rx-schema.md), [handling conflicts](../transactions-conflicts-revisions.md), and enabling [offline synchronization](../replication.md). - -- **[RxDB Quickstart](https://rxdb.info/quickstart.html)** - Get a step-by-step tutorial to create your first RxDB-based application in minutes. - -- **[RxDB GitHub Repository](https://github.com/pubkey/rxdb)** - See the source code, open issues, and browse community-driven examples that integrate ReactJS, Preact Signals, and advanced features like encryption. - -- **[RxDB Encryption Plugins](https://rxdb.info/encryption.html)** - Learn how to encrypt fields in your collections, protecting user data and meeting compliance requirements. - -- **[Preact Signals React Integration (Example)](https://github.com/preactjs/signals#react)** - If you want to combine React with signals-based reactivity, check out example code and bridging approaches. - -- **[MDN: Using the Web Storage API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API)** - Refresh on localStorage basics, including best practices for small key-value data in traditional React apps. - -With these follow-up steps, you can refine your **reactjs storage** strategy to meet your app’s unique needs, whether it’s simple user preferences or robust offline data syncing. - ---- - -## What Really Is a Realtime Database? - -# What is a realtime database? - -I have been building [RxDB](https://rxdb.info/), a NoSQL **realtime** JavaScript database for many years. -Often people get confused by the word **realtime database**, because the word **realtime** is so vaguely defined that it can mean everything and nothing at the same time. - -In this article we will explore what a realtime database is, and more important, what it is not. - -
    - - - -
    - -## Realtime as in **realtime computing** - -When "normal" developers hear the word "realtime", they think of **Real-time computing (RTC)**. Real-time computing is a type of computer processing that **guarantees specific response times** for tasks or events, crucial in applications like industrial control, automotive systems, and aerospace. It relies on specialized operating systems (RTOS) to ensure predictability and low latency. Hard real-time systems must never miss deadlines, while soft real-time systems can tolerate occasional delays. Real-time responses are often understood to be in the order of milliseconds, and sometimes microseconds. - -Consider the role of real-time computing in car airbags: sensors detect collision force, swiftly process the data, and immediately decide to deploy the airbags within milliseconds. Such rapid action is imperative for safeguarding passengers. Hence, the controlling chip must **guarantee a certain response time** - it must operate in "realtime". - -But when people talk about **realtime databases**, especially in the web-development world, they almost never mean realtime, as in **realtime computing**, they mean something else. -In fact, with any programming language that run on end users devices, it is not even possible to built a "real" realtime database. A program, like a JavaScript ([browser](./browser-database.md) or [Node.js](../nodejs-database.md)) process, can be halted by the operating systems task manager at any time and therefore it will never be able to guarantee specific response times. To build a realtime computing database, you would need a realtime capable operating system. - -## Real time Database as in **realtime replication** - -When talking about realtime databases, most people refer to realtime, as in realtime replication. -Often they mean a very specific product which is the **Firebase Realtime Database** (not the [Firestore](../replication-firestore.md)). - - - -In the context of the Firebase Realtime Database, "realtime" means that data changes are synchronized and delivered to all connected clients or devices as soon as they occur, typically within milliseconds. This means that when any client updates, adds, or removes data in the database, all other clients that are connected to the same database instance receive those updates instantly, without the need for manual polling or frequent HTTP requests. - -In short, when replicating data between databases, instead of polling, we use a [websocket connection](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API) to live-stream all changes between the server and the clients, this is labeled as "realtime database". A similar thing can be done with RxDB and the [RxDB Replication Plugins](../replication.md). - - - - - -## Realtime as in **realtime applications** - -In the context of realtime client-side applications, "realtime" refers to the immediate or near-instantaneous processing and response to events or data inputs. When data changes, the application must directly update to reflect the new data state, without any user interaction or delay. Notice that the change to the data could have come from any source, like a user action, an operation in another browser tab, or even an operation from another device that has been replicated to the client. - - - -In contrast to push-pull based databases (e.g., MySQL or MongoDB servers), a realtime database contains **features which make it easy to build realtime applications**. For example with RxDB you can not only fetch query results once, but instead you can subscribe to a query and directly update the HTML dom tree whenever the query has a new result set: - -```ts -await db.heroes.find({ - selector: { - healthpoints: { - $gt: 0 - } - } -}) -.$ // The $ returns an observable that emits whenever the query's result set changes. -.subscribe(aliveHeroes => { - // Refresh the HTML list each time there are new query results. - const newContent = aliveHeroes.map(doc => '' + doc.name + ''); - document.getElementById('#myList').innerHTML = newContent; -}); - -// You can even subscribe to any RxDB document's fields. -myDocument.firstName$.subscribe(newName => console.log('name is: ' + newName)); -``` - -A competent realtime application is engineered to offer feedback or results swiftly, ideally within milliseconds to microseconds. Ideally, a data modification should be processed in under **16 milliseconds** (since 1 second divided by 60 frames equals 16.66ms) to ensure users don't perceive any lag from input to visualization. RxDB utilizes the [EventReduce algorithm](https://github.com/pubkey/event-reduce) to manage changes more swiftly than 16ms. However, it can never assure fixed response times as a "realtime computing database" would. - -## Follow Up - -- Dive into the [RxDB Quickstart](https://rxdb.info/quickstart.html) -- Discover more about the [RxDB realtime Sync Engine](../replication.md) -- Join the conversation at [RxDB Chat](https://rxdb.info/chat/) - ---- - -## RxDB as a Database in a Vue.js Application - -# RxDB as a Database in a Vue Application - -In the modern web ecosystem, [Vue](https://vuejs.org/) has become a leading choice for building highly performant, reactive single-page applications (SPAs). However, while Vue excels at managing and updating the user interface, robust and efficient data handling also plays a pivotal role in delivering a great user experience. Enter [RxDB](https://rxdb.info/), a reactive JavaScript database that runs in the browser (and beyond), offering significant capabilities such as offline-first data handling, real-time synchronization, and straightforward integration with Vue's reactivity system. - -This article explores how RxDB works, why it's a perfect match for Vue, and how you can leverage it to build more engaging, performant, and data-resilient Vue applications. - -
    - - - -
    - -## Why Vue Applications Need a Database -Vue is renowned for its lightweight core and flexible architecture centered around reactive state management and reusable components. However, modern Vue applications often require: - -- **Offline Capabilities:** Allowing users to continue working even without internet access. -- **Real-Time Updates:** Keeping UI data in sync with changes as they occur, whether locally or from other connected clients. -- **Improved Performance:** Reducing server round trips and leveraging local storage for faster data operations. -- **Scalable Data Handling:** Managing increasingly large datasets or complex queries right in the browser. - -While you can store data in Vuex/Pinia stores or via direct AJAX calls, these solutions may not suffice when your application demands a full-featured offline-first database or complex synchronization with a server. RxDB addresses these needs with a dedicated, reactive, browser-based database that pairs seamlessly with Vue's reactivity system. - -## Introducing RxDB as a Database Solution -RxDB - short for Reactive Database - is built on the principle of combining [NoSQL database](./in-memory-nosql-database.md) capabilities with reactive programming. It runs inside your client-side environment (browser, [Node.js](../nodejs-database.md), or [mobile devices](./mobile-database.md)) and provides: - -1. **Real-Time Reactivity**: Automatically updates subscribed components whenever data changes. -2. **Offline-First Approach**: Stores data locally and syncs with the server when online connectivity is restored. -3. **Data Replication**: Effortlessly keeps data synchronized across multiple tabs, devices, or server instances. -4. **Multi-Tab Support**: Seamlessly propagates changes to all open tabs in the user's [browser](./browser-database.md). -5. **Observable Queries**: Automatically refresh the result set when documents in your queried collection change. - -### RxDB vs. Other Vue Database Options -Compared to traditional approaches - like raw IndexedDB or local storage - RxDB adds a powerful, reactive layer that simplifies your data flow. While tools like Vuex or Pinia are great for state management, they are not fully fledged databases with features like replication, conflict resolution, and offline persistence. RxDB bridges the gap by providing an integrated data handling solution tailor-made for modern, data-intensive Vue applications. - -## Getting Started with RxDB -Let's break down the essentials for using RxDB within a Vue application. - -### Installation -You can install RxDB (and RxJS, which it depends on) via npm or yarn: - -```bash -npm install rxdb rxjs -``` - -## Creating and Configuring Your Database - -Within your Vue project, you can set up an RxDB instance in a dedicated file or a Vue plugin. Below is an example using [Localstorage](./localstorage.md) as the storage engine: - -```ts -// db.js -import { createRxDatabase } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -export async function initDatabase() { - const db = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage(), - password: 'myPassword', // optional encryption password - multiInstance: true, // multi-tab support - eventReduce: true // optimize event handling - }); - - await db.addCollections({ - hero: { - schema: { - title: 'hero schema', - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { type: 'string' }, - name: { type: 'string' }, - healthpoints: { type: 'number' } - } - } - } - }); - - return db; -} -``` - -After creating the RxDB instance, you can share it across your application (for example, by providing it in a plugin or a global property in Vue). - -## Vue Reactivity and RxDB Observables - -RxDB queries return RxJS observables (`.$`). Vue can automatically update components when data changes if you manually subscribe and store results in Vue refs/reactive objects, or if you use RxDB's [custom reactivity for Vue](../reactivity.md). - -**Example with Vue 3 Composition API:** - -```js -// HeroList.vue - - - -``` - -## Different RxStorage Layers for RxDB - -RxDB supports multiple storage backends - called "RxStorage layers" - giving you flexibility in how data is persisted: - -- [LocalStorage RxStorage](../rx-storage-localstorage.md): Uses the browsers localstorage API. -- [IndexedDB RxStorage](../rx-storage-indexeddb.md): Direct usage of native IndexedDB. -- [OPFS RxStorage](../rx-storage-opfs.md): Uses the File System Access API for even faster storage in modern browsers. -- [Memory RxStorage](../rx-storage-memory.md): Stores data in memory, ideal for tests or ephemeral data. -- [SQLite RxStorage](../rx-storage-sqlite.md): Runs SQLite, which can be compiled to WebAssembly for the browser. While possible, it typically carries a larger bundle size compared to native browser APIs like [IndexedDB or OPFS](./localstorage-indexeddb-cookies-opfs-sqlite-wasm.md). - -Choose the storage option that best aligns with your Vue application's requirements for performance, persistence, and platform compatibility. - -## Synchronizing Data with RxDB between Clients and Servers - -RxDB champions an offline-first approach: data is kept locally so that your Vue app remains usable, even without internet. When connectivity is restored, RxDB ensures your local changes synchronize to the server, resolving conflicts as necessary. - -- [Real-Time Synchronization](./realtime-database.md): With RxDB's replication plugins, any local change can be instantly pushed to a remote endpoint while pulling down remote changes to ensure consistency. -- **Conflict Resolution**: In multi-user scenarios, conflicts may arise if two clients update the same document simultaneously. RxDB provides hooks to handle and resolve these gracefully. -- **Scalable Architecture**: By reducing reliance on continuous server requests, you can lighten server load and deliver a more responsive user experience. - -## Advanced RxDB Features and Techniques - -### Offline-First Approach -Vue applications can seamlessly function offline by leveraging RxDB's local database storage. The moment the network is restored, all unsynced data is pushed to the server. This capability is particularly beneficial for Progressive Web Apps (PWAs) and scenarios with spotty connectivity. - -### Observable Queries and Change Streams -Beyond simply returning data, RxDB queries emit observables that respond to any change in the underlying documents. This real-time approach can drastically simplify state management, since updates flow directly into your Vue components without additional manual wiring. - -### Encryption of Local Data -For applications handling sensitive information, RxDB supports [encryption](../encryption.md) of local data. Your data is stored securely in the browser, protecting it from unauthorized access. - -### Indexing and Performance Optimization -By [defining indexes](../rx-schema.md) on frequently searched fields, you can speed up queries and reduce overall resource usage. This is crucial for larger datasets where performance might otherwise degrade. - -### JSON Key Compression -This [optimization](../key-compression.md) shortens field names in stored JSON documents, thereby reducing storage space and potentially improving performance for read/write operations. - -### Multi-Tab Support -If your users open multiple tabs of your Vue application, RxDB ensures data is synchronized across all instances in real time. Changes made in one tab are immediately reflected in others, creating a unified user experience. - - - -## Best Practices for Using RxDB in Vue - -Here are some recommendations to get the most out of RxDB in your Vue projects: - -- Centralize Database Creation: Initialize and configure RxDB in a dedicated file or plugin, ensuring only one database instance is created. -- Leverage Vue's Composition API or a Global Store: Use watchers, refs, or a store like Pinia to neatly manage data subscriptions and updates, preventing scattered subscription logic. -- Async Subscriptions: Prefer using Vue's lifecycle hooks and the Composition API to manage subscriptions. Clean up subscriptions when components unmount or no longer need the data. -- Optimize Queries and Indexes: Only query the data you need, and define indexes to speed up lookups. -- Test [Offline Scenarios](../offline-first.md): Make sure your offline logic works as expected by simulating network disconnections and reconnections. -- [Plan Conflict Resolution](../transactions-conflicts-revisions.md): For multi-user apps, decide how to merge concurrent changes to prevent data inconsistencies. - -## Follow Up - -To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: - -- [RxDB GitHub Repository](/code/): Visit the official GitHub repository of RxDB to access the source code, documentation, and community support. -- [RxDB Quickstart](../quickstart.md): Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects. -- [RxDB Reactivity for Vue](../reactivity.md): Discover how RxDB observables can directly produce Vue refs, simplifying integration with your Vue components. -- [RxDB Vue Example at GitHub](https://github.com/pubkey/rxdb/tree/master/examples/vue): Explore an official Vue example to see RxDB in action within a Vue application. -- [RxDB Examples](https://github.com/pubkey/rxdb/tree/master/examples): Browse even more official examples to learn best practices you can apply to your own projects. - ---- - -## IndexedDB Database in Vue Apps - The Power of RxDB - - -Building robust, [offline-capable](../offline-first.md) Vue applications often involves leveraging browser storage solutions to manage data. IndexedDB is one such powerful tool, but its raw API can be challenging to work with directly. RxDB abstracts away much of IndexedDB's complexity, providing a more developer-friendly experience. In this article, we'll explore what IndexedDB is, why it's beneficial in Vue applications, the challenges of using plain IndexedDB, and how [RxDB](https://rxdb.info/) can simplify your development process while adding advanced features. - -## What is IndexedDB? - -[IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) is a low-level API for storing significant amounts of structured data in the browser. It provides a transactional database system that can store key-value pairs, complex objects, and more. This storage engine is asynchronous and supports advanced data types, making it suitable for offline storage and complex web applications. - -
    - -
    - -## Why Use IndexedDB in Vue - -When building Vue applications, IndexedDB can play a crucial role in enhancing both performance and user experience. Here are some reasons to consider using IndexedDB: - -- **Offline-First / Local-First**: By storing data locally, your application remains functional even without an internet connection. -- **Performance**: Using local data means [zero latency](./zero-latency-local-first.md) and no loading spinners, as data doesn't need to be fetched over a network. -- **Easier Implementation**: Replicating all data to the client once is often simpler than implementing multiple endpoints for each user interaction. -- **Scalability**: Local data reduces server load because queries run on the client side, decreasing server bandwidth and processing requirements. - -## Why To Not Use Plain IndexedDB - -While IndexedDB itself is powerful, its native API comes with several drawbacks for everyday application developers: - -- **Callback-Based API**: IndexedDB was originally designed around callbacks rather than modern Promises, making asynchronous code more cumbersome. -- **Complexity**: IndexedDB is low-level, intended for library developers rather than for app developers who just want to store and query data easily. -- **Basic Query API**: Its rudimentary query capabilities limit how you can efficiently perform complex queries. Libraries like RxDB offer more advanced querying and indexing. -- **TypeScript Support**: Ensuring good [TypeScript support](../tutorials/typescript.md) with IndexedDB is challenging, especially when trying to maintain schema consistency. -- **Lack of Observable API**: IndexedDB doesn't provide an observable API out of the box, making it hard to automatically update your Vue app in real time. RxDB solves this by enabling you to [observe queries](../rx-query.md#observe) or specific documents. -- **Cross-Tab Communication**: Managing cross-tab updates in plain IndexedDB is difficult. RxDB handles this seamlessly - changes in one tab automatically affect observed data in others. -- **Missing Advanced Features**: Features like [encryption](../encryption.md) or [compression](../key-compression.md) aren't built into IndexedDB, but they are available via RxDB. -- **Limited Platform Support**: IndexedDB is browser-only. RxDB offers [swappable storages](../rx-storage.md) so you can reuse the same data layer code in mobile or desktop environments. - -
    - - - -
    - -## Set up RxDB in Vue - -Setting up RxDB with Vue is straightforward. It abstracts IndexedDB complexities and adds a layer of powerful features over it. - -### Installing RxDB - -First, install RxDB (and RxJS) from npm: - -```bash -npm install rxdb rxjs --save -``` - -### Create a Database and Collections - -RxDB provides two main storage options: - -- The free [LocalStorage-based storage](../rx-storage-localstorage.md) -- The premium plain [IndexedDB-based storage](../rx-storage-indexeddb.md), offering faster [performance](../rx-storage-performance.md) - -Below is an example of setting up a simple RxDB database using the localstorage-based storage in a Vue app: - -```ts -// db.ts -import { createRxDatabase } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -export async function initDB() { - const db = await createRxDatabase({ - name: 'heroesdb', // the name of the database - storage: getRxStorageLocalstorage() - }); - - // Define your schema - const heroSchema = { - title: 'hero schema', - version: 0, - description: 'Describes a hero in your app', - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 - }, - name: { - type: 'string' - }, - power: { - type: 'string' - } - }, - required: ['id', 'name'] - }; - - // add collections - await db.addCollections({ - heroes: { - schema: heroSchema - } - }); - - return db; -} -``` - -### CRUD Operations - -Once your database is initialized, you can perform all CRUD operations: - -```ts -// insert -await db.heroes.insert({ id: '1', name: 'Iron Man', power: 'Genius-level intellect' }); - -// bulk insert -await db.heroes.bulkInsert([ - { id: '2', name: 'Thor', power: 'God of Thunder' }, - { id: '3', name: 'Hulk', power: 'Superhuman Strength' } -]); - -// find and findOne -const heroes = await db.heroes.find().exec(); -const ironMan = await db.heroes.findOne({ selector: { name: 'Iron Man' } }).exec(); - -// update -const doc = await db.heroes.findOne({ selector: { name: 'Hulk' } }).exec(); -await doc.update({ $set: { power: 'Unlimited Strength' } }); - -// delete -const thorDoc = await db.heroes.findOne({ selector: { name: 'Thor' } }).exec(); -await thorDoc.remove(); -``` - -## Reactive Queries and Live Updates - -RxDB excels in providing reactive data capabilities, ideal for [real-time applications](./realtime-database.md). Subscribing to queries automatically updates your Vue components when underlying data changes - even across [browser](./browser-database.md) tabs. - - - -### Using RxJS Observables with Vue 3 Composition API - -Here's an example of a Vue component that subscribes to live data updates: - -```html - - - -``` - -This component subscribes to the collection's changes, [updating the UI](./optimistic-ui.md) automatically whenever the underlying data changes in any browser tab. - -### Using Vue Signals - -If you're exploring Vue's reactivity transforms or signals, RxDB also offers [custom reactivity factories](../reactivity.md) ([premium plugins](/premium/) are required). This allows queries to emit data as signals instead of traditional Observables. - -```ts -const heroesSignal = db.heroes.find().$$; // $$ indicates a reactive result - -``` -With this, in your Vue template or script, you can directly read from heroesSignal() - -```html - -``` - -## Vue IndexedDB Example with RxDB - -A comprehensive example of using RxDB within a Vue application can be found in the [RxDB GitHub repository](https://github.com/pubkey/rxdb/tree/master/examples/vue). This repository contains sample applications, showcasing best practices and demonstrating how to integrate RxDB for various use cases. - -## Advanced RxDB Features -RxDB offers many advanced features that extend beyond basic data storage: - -- [RxDB Replication](../replication.md): Synchronize local data with remote databases seamlessly. - -- [Data Migration](../migration-schema.md): Handle schema changes gracefully with automatic data migrations. - -- [Encryption](../encryption.md): Secure your data with built-in encryption capabilities. - -- [Compression](../key-compression.md): Optimize storage using key compression. - -## Limitations of IndexedDB - -While IndexedDB is powerful, it has some inherent limitations: - -- Performance: IndexedDB can be slow under certain conditions. Read more: [Slow IndexedDB](../slow-indexeddb.md) -- [Storage Limits](./indexeddb-max-storage-limit.md): Browsers impose limits on how much data can be stored. See: [Browser storage limits](./localstorage-indexeddb-cookies-opfs-sqlite-wasm.md#storage-size-limits). - -## Alternatives to IndexedDB - -Depending on your application's requirements, there are [alternative storage solutions](../rx-storage.md) to consider: - -- **Origin Private File System (OPFS)**: A newer API that can offer better performance. RxDB supports OPFS as well. More info: [RxDB OPFS Storage](../rx-storage-opfs.md) -- **SQLite**: Ideal for hybrid frameworks or Capacitor, offering native performance. Explore: [RxDB SQLite Storage](../rx-storage-sqlite.md) - -## Performance Comparison with Other Browser Storages -Here is a performance overview of the various browser-based storage implementations of RxDB: - - - -## Follow Up -- Learn how to use RxDB with the [RxDB Quickstart](../quickstart.md) for a guided introduction. -- Check out the [RxDB GitHub repository](/code/) and leave a star ⭐ if you find it useful. - -By leveraging RxDB on top of IndexedDB, you can create highly responsive, offline-capable Vue applications without dealing with the low-level complexities of IndexedDB directly. With [reactive queries](../rx-query.md), seamless cross-tab communication, and powerful advanced features, RxDB becomes an invaluable tool in modern web development. - ---- - -## WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport - - -For modern real-time web applications, the ability to send events from the server to the client is indispensable. This necessity has led to the development of several methods over the years, each with its own set of advantages and drawbacks. Initially, [long-polling](#what-is-long-polling) was the only option available. It was then succeeded by [WebSockets](#what-are-websockets), which offered a more robust solution for bidirectional communication. Following WebSockets, [Server-Sent Events (SSE)](#what-are-server-sent-events) provided a simpler method for one-way communication from server to client. Looking ahead, the [WebTransport](#what-is-the-webtransport-api) protocol promises to revolutionize this landscape even further by providing a more efficient, flexible, and scalable approach. For niche use cases, [WebRTC](#what-is-webrtc) might also be considered for server-client events. - -This article aims to delve into these technologies, comparing their performance, highlighting their benefits and limitations, and offering recommendations for various use cases to help developers make informed decisions when building real-time web applications. It is a condensed summary of my gathered experience when I implemented the [RxDB Sync Engine](../replication.md) to be compatible with various backend technologies. - -
    - - - -
    - -### What is Long Polling? - -Long polling was the first "hack" to enable a server-client messaging method that can be used in browsers over HTTP. The technique emulates server push communications with normal XHR requests. Unlike traditional polling, where the client repeatedly requests data from the server at regular intervals, long polling establishes a connection to the server that remains open until new data is available. Once the server has new information, it sends the response to the client, and the connection is closed. Immediately after receiving the server's response, the client initiates a new request, and the process repeats. This method allows for more immediate data updates and reduces unnecessary network traffic and server load. However, it can still introduce delays in communication and is less efficient than other real-time technologies like WebSockets. - -```js -// long-polling in a JavaScript client -function longPoll() { - fetch('http://example.com/poll') - .then(response => response.json()) - .then(data => { - console.log("Received data:", data); - longPoll(); // Immediately establish a new long polling request - }) - .catch(error => { - /** - * Errors can appear in normal conditions when a - * connection timeout is reached or when the client goes offline. - * On errors we just restart the polling after some delay. - */ - setTimeout(longPoll, 10000); - }); -} -longPoll(); // Initiate the long polling -``` - -Implementing long-polling on the client side is pretty simple, as shown in the code above. However on the backend there can be multiple difficulties to ensure the client receives all events and does not miss out updates when the client is currently reconnecting. - -### What are WebSockets? - -[WebSockets](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket?retiredLocale=de) provide a full-duplex communication channel over a single, long-lived connection between the client and server. This technology enables browsers and servers to exchange data without the overhead of HTTP request-response cycles, facilitating real-time data transfer for applications like live chat, gaming, or financial trading platforms. WebSockets represent a significant advancement over traditional HTTP by allowing both parties to send data independently once the connection is established, making it ideal for scenarios that require low latency and high-frequency updates. - -```js -// WebSocket in a JavaScript client -const socket = new WebSocket('ws://example.com'); - -socket.onopen = function(event) { - console.log('Connection established'); - // Sending a message to the server - socket.send('Hello Server!'); -}; - -socket.onmessage = function(event) { - console.log('Message from server:', event.data); -}; -``` - -While the basics of the WebSocket API are easy to use it has shown to be rather complex in production. A socket can loose connection and must be re-created accordingly. Especially detecting if a connection is still usable or not, can be very tricky. Mostly you would add a [ping-and-pong](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#pings_and_pongs_the_heartbeat_of_websockets) heartbeat to ensure that the open connection is not closed. -This complexity is why most people use a library on top of WebSockets like [Socket.IO](https://socket.io/) which handles all these cases and even provides fallbacks to long-polling if required. - -### What are Server-Sent-Events? - -Server-Sent Events (SSE) provide a standard way to push server updates to the client over HTTP. Unlike WebSockets, SSEs are designed exclusively for one-way communication from server to client, making them ideal for scenarios like live news feeds, sports scores, or any situation where the client needs to be updated in real time without sending data to the server. - -You can think of Server-Sent-Events as a single HTTP request where the backend does not send the whole body at once, but instead keeps the connection open and trickles the answer by sending a single line each time an event has to be send to the client. - -Creating a connection for receiving events with SSE is straightforward. On the client side in a browser, you initialize an [EventSource](https://developer.mozilla.org/en-US/docs/Web/API/EventSource) instance with the URL of the server-side script that generates the events. - -Listening for messages involves attaching event handlers directly to the EventSource instance. The API distinguishes between generic message events and named events, allowing for more structured communication. Here's how you can set it up in JavaScript: - -```js -// Connecting to the server-side event stream -const evtSource = new EventSource("https://example.com/events"); - -// Handling generic message events -evtSource.onmessage = event => { - console.log('got message: ' + event.data); -}; -``` - -In difference to WebSockets, an EventSource will automatically reconnect on connection loss. - -On the server side, your script must set the `Content-Type` header to `text/event-stream` and format each message according to the [SSE specification](https://www.w3.org/TR/2012/WD-eventsource-20120426/). This includes specifying event types, data payloads, and optional fields like event ID and retry timing. - -Here's how you can set up a simple SSE endpoint in a Node.js Express app: - -```ts -import express from 'express'; -const app = express(); -const PORT = process.env.PORT || 3000; - -app.get('/events', (req, res) => { - res.writeHead(200, { - 'Content-Type': 'text/event-stream', - 'Cache-Control': 'no-cache', - 'Connection': 'keep-alive', - }); - - const sendEvent = (data) => { - // all message lines must be prefixed with 'data: ' - const formattedData = `data: ${JSON.stringify(data)}\n\n`; - res.write(formattedData); - }; - - // Send an event every 2 seconds - const intervalId = setInterval(() => { - const message = { - time: new Date().toTimeString(), - message: 'Hello from the server!', - }; - sendEvent(message); - }, 2000); - - // Clean up when the connection is closed - req.on('close', () => { - clearInterval(intervalId); - res.end(); - }); -}); -app.listen(PORT, () => console.log(`Server running on http://localhost:${PORT}`)); -``` - -### What is the WebTransport API? - -WebTransport is a cutting-edge API designed for efficient, low-latency communication between web clients and servers. It leverages the [HTTP/3 QUIC protocol](https://en.wikipedia.org/wiki/HTTP/3) to enable a variety of data transfer capabilities, such as sending data over multiple streams, in both reliable and unreliable manners, and even allowing data to be sent out of order. This makes WebTransport a powerful tool for applications requiring high-performance networking, such as real-time gaming, live streaming, and collaborative platforms. However, it's important to note that WebTransport is currently a working draft and has not yet achieved widespread adoption. -As of now (March 2024), WebTransport is in a [Working Draft](https://w3c.github.io/webtransport/) and not widely supported. You cannot yet use WebTransport in the [Safari browser](https://caniuse.com/webtransport) and there is also no native support [in Node.js](https://github.com/w3c/webtransport/issues/511). This limits its usability across different platforms and environments. - -Even when WebTransport will become widely supported, its API is very complex to use and likely it would be something where people build libraries on top of WebTransport, not using it directly in an application's sourcecode. - -### What is WebRTC? - -[WebRTC](https://webrtc.org/) (Web Real-Time Communication) is an open-source project and API standard that enables real-time communication (RTC) capabilities directly within web browsers and mobile applications without the need for complex server infrastructure or the installation of additional plugins. It supports peer-to-peer connections for streaming audio, video, and data exchange between browsers. [WebRTC](../replication-webrtc.md) is designed to work through NATs and firewalls, utilizing protocols like ICE, STUN, and TURN to establish a connection between peers. - -While WebRTC is made to be used for client-client interactions, it could also be leveraged for server-client communication where the server just simulated being also a client. This approach only makes sense for niche use cases which is why in the following WebRTC will be ignored as an option. - -The problem is that for WebRTC to work, you need a signaling-server anyway which would then again run over websockets, SSE or WebTransport. This defeats the purpose of using WebRTC as a replacement for these technologies. - -## Limitations of the technologies - -### Sending Data in both directions - -Only WebSockets and WebTransport allow to send data in both directions so that you can receive server-data and send client-data over the same connection. - -While it would also be possible with **Long-Polling** in theory, it is not recommended because sending "new" data to an existing long-polling connection would require -to do an additional http-request anyway. So instead of doing that you can send data directly from the client to the server with an additional http-request without interrupting -the long-polling connection. - -**Server-Sent-Events** do not support sending any additional data to the server. You can only do the initial request, and even there you cannot send POST-like data in the http-body by default with the native [EventSource API](https://developer.mozilla.org/en-US/docs/Web/API/EventSource). Instead you have to put all data inside of the url parameters which is considered a bad practice for security because credentials might leak into server logs, proxies and caches. To fix this problem, [RxDB](https://rxdb.info/) for example uses the [eventsource polyfill](https://github.com/EventSource/eventsource) instead of the native `EventSource API`. This library adds additional functionality like sending **custom http headers**. Also there is [this library](https://github.com/Azure/fetch-event-source) from microsoft which allows to send body data and use `POST` requests instead of `GET`. - -### 6-Requests per Domain Limit - -Most modern browsers allow six connections per domain () which limits the usability of all steady server-to-client messaging methods. The limitation of six connections is even shared across browser tabs so when you open the same page in multiple tabs, they would have to shared the six-connection-pool with each other. This limitation is part of the HTTP/1.1-RFC (which even defines a lower number of only two connections). - -> Quote From [RFC 2616 - Section 8.1.4](https://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1.4): "Clients that use persistent connections SHOULD limit the number of simultaneous connections that they maintain to a given server. A single-user client SHOULD NOT maintain more than **2 connections** with any server or proxy. A proxy SHOULD use up to 2*N connections to another server or proxy, where N is the number of simultaneously active users. These guidelines are intended to improve HTTP response times and avoid congestion." - -While that policy makes sense to prevent website owners from using their visitors to D-DOS other websites, it can be a big problem when multiple connections are required to handle server-client communication for legitimate use cases. To workaround the limitation you have to use HTTP/2 or HTTP/3 with which the browser will only open a single connection per domain and then use multiplexing to run all data through a single connection. While this gives you a virtually infinity amount of parallel connections, there is a [SETTINGS_MAX_CONCURRENT_STREAMS](https://www.rfc-editor.org/rfc/rfc7540#section-6.5.2) setting which limits the actually connections amount. The default is 100 concurrent streams for most configurations. - -In theory the connection limit could also be increased by the browser, at least for specific APIs like EventSource, but the issues have been marked as "won't fix" by [chromium](https://issues.chromium.org/issues/40329530) and [firefox](https://bugzilla.mozilla.org/show_bug.cgi?id=906896). - -:::note Lower the amount of connections in Browser Apps -When you build a browser application, you have to assume that your users will use the app not only once, but in multiple browser tabs in parallel. -By default you likely will open one server-stream-connection per tab which is often not necessary at all. Instead you open only a single connection and shared it between tabs, no matter how many tabs are open. [RxDB](https://rxdb.info/) does that with the [LeaderElection](../leader-election.md) from the [broadcast-channel npm package](https://github.com/pubkey/broadcast-channel) to only have one stream of replication between server and clients. You can use that package standalone (without RxDB) for any type of application. -::: - -### Connections are not kept open on mobile apps - -In the context of mobile applications running on operating systems like Android and iOS, maintaining open connections, such as those used for WebSockets and the others, poses a significant challenge. Mobile operating systems are designed to automatically move applications into the background after a certain period of inactivity, effectively closing any open connections. This behavior is a part of the operating system's resource management strategy to conserve battery and optimize performance. As a result, developers often rely on **mobile push notifications** as an efficient and reliable method to send data from servers to clients. Push notifications allow servers to alert the application of new data, prompting an action or update, without the need for a persistent open connection. - -### Proxies and Firewalls - -From consulting many [RxDB](https://rxdb.info/) users, it was shown that in enterprise environments (aka "at work") it is often hard to implement a WebSocket server into the infrastructure because many proxies and firewalls block non-HTTP connections. Therefore using the Server-Sent-Events provides and easier way of enterprise integration. Also long-polling uses only plain HTTP-requests and might be an option. - -
    - - - -
    - -## Performance Comparison - -Comparing the performance of WebSockets, Server-Sent Events (SSE), Long-Polling and WebTransport directly involves evaluating key aspects such as latency, throughput, server load, and scalability under various conditions. - -First lets look at the raw numbers. A good performance comparison can be found in [this repo](https://github.com/Sh3b0/realtime-web?tab=readme-ov-file#demos) which tests the messages times in a [Go Lang](https://go.dev/) server implementation. Here we can see that the performance of WebSockets, WebRTC and WebTransport are comparable: - -
    - - - -
    - -:::note -Remember that WebTransport is a pretty new technology based on the also new HTTP/3 protocol. In the future (after March 2024) there might be more performance optimizations. Also WebTransport is optimized to use less power which metric is not tested. -::: - -Lets also compare the Latency, the throughput and the scalability: - -### Latency -- **WebSockets**: Offers the lowest latency due to its full-duplex communication over a single, persistent connection. Ideal for real-time applications where immediate data exchange is critical. -- **Server-Sent Events**: Also provides low latency for server-to-client communication but cannot natively send messages back to the server without additional HTTP requests. -- **Long-Polling**: Incurs higher latency as it relies on establishing new HTTP connections for each data transmission, making it less efficient for real-time updates. Also it can occur that the server wants to send an event when the client is still in the process of opening a new connection. In these cases the latency would be significantly larger. -- **WebTransport**: Promises to offer low latency similar to WebSockets, with the added benefits of leveraging the HTTP/3 protocol for more efficient multiplexing and congestion control. - -### Throughput -- **WebSockets**: Capable of high throughput due to its persistent connection, but throughput can suffer from [backpressure](https://chromestatus.com/feature/5189728691290112) where the client cannot process data as fast as the server is capable of sending it. -- **Server-Sent Events**: Efficient for broadcasting messages to many clients with less overhead than WebSockets, leading to potentially higher throughput for unidirectional server-to-client communication. -- **Long-Polling**: Generally offers lower throughput due to the overhead of frequently opening and closing connections, which consumes more server resources. -- **WebTransport**: Expected to support high throughput for both unidirectional and bidirectional streams within a single connection, outperforming WebSockets in scenarios requiring multiple streams. - -### Scalability and Server Load -- **WebSockets**: Maintaining a large number of WebSocket connections can significantly increase server load, potentially affecting scalability for applications with many users. -- **Server-Sent Events**: More scalable for scenarios that primarily require updates from server to client, as it uses less connection overhead than WebSockets because it uses "normal" HTTP request without things like [protocol updates](https://developer.mozilla.org/en-US/docs/Web/HTTP/Protocol_upgrade_mechanism) that have to be run with WebSockets. -- **Long-Polling**: The least scalable due to the high server load generated by frequent connection establishment, making it suitable only as a fallback mechanism. -- **WebTransport**: Designed to be highly scalable, benefiting from HTTP/3's efficiency in handling connections and streams, potentially reducing server load compared to WebSockets and SSE. - -## Recommendations and Use-Case Suitability - -In the landscape of server-client communication technologies, each has its distinct advantages and use case suitability. **Server-Sent Events** (SSE) emerge as the most straightforward option to implement, leveraging the same HTTP/S protocols as traditional web requests, thereby circumventing corporate firewall restrictions and other technical problems that can appear with other protocols. They are easily integrated into Node.js and other server frameworks, making them an ideal choice for applications requiring frequent server-to-client updates, such as news feeds, stock tickers, and live event streaming. - -On the other hand, **WebSockets** excel in scenarios demanding ongoing, two-way communication. Their ability to support continuous interaction makes them the prime choice for browser games, chat applications, and live sports updates. - -However, **WebTransport**, despite its potential, faces adoption challenges. It is not widely supported by server frameworks [including Node.js](https://github.com/w3c/webtransport/issues/511) and lacks compatibility with [safari](https://caniuse.com/webtransport). Moreover, its reliance on HTTP/3 further limits its immediate applicability because many WebServers like nginx only have [experimental](https://nginx.org/en/docs/quic.html) HTTP/3 support. While promising for future applications with its support for both reliable and unreliable data transmission, WebTransport is not yet a viable option for most use cases. - -**Long-Polling**, once a common technique, is now largely outdated due to its inefficiency and the high overhead of repeatedly establishing new HTTP connections. Although it may serve as a fallback in environments lacking support for WebSockets or SSE, its use is generally discouraged due to significant performance limitations. - -## Known Problems - -For all of the realtime streaming technologies, there are known problems. When you build anything on top of them, keep these in mind. - -### A client can miss out events when reconnecting - -When a client is connecting, reconnecting or offline, it can miss out events that happened on the server but could not be streamed to the client. -This missed out events are not relevant when the server is streaming the full content each time anyway, like on a live updating stock ticker. -But when the backend is made to stream partial results, you have to account for missed out events. Fixing that on the backend scales pretty bad because the backend would have to remember for each client which events have been successfully send already. Instead this should be implemented with client side logic. - -The [RxDB Sync Engine](../replication.md) for example uses two modes of operation for that. One is the [checkpoint iteration mode](../replication.md#checkpoint-iteration) where normal http requests are used to iterate over backend data, until the client is in sync again. Then it can switch to [event observation mode](../replication.md#event-observation) where updates from the realtime-stream are used to keep the client in sync. Whenever a client disconnects or has any error, the replication shortly switches to [checkpoint iteration mode](../replication.md#checkpoint-iteration) until the client is in sync again. This method accounts for missed out events and ensures that clients can always sync to the exact equal state of the server. - -### Company firewalls can cause problems - -There are many known problems with company infrastructure when using any of the streaming technologies. Proxies and firewall can block traffic or unintentionally break requests and responses. Whenever you implement a realtime app in such an infrastructure, make sure you first test out if the technology itself works for you. - -## Follow Up - -- Check out the [hackernews discussion of this article](https://news.ycombinator.com/item?id=39745993) -- Shared/Like my [announcement tweet](https://twitter.com/rxdbjs/status/1769507055298064818) -- Learn how to use Server-Sent-Events to [replicate a client side RxDB database with your backend](../replication-http.md#pullstream-for-ongoing-changes). -- Learn how to use RxDB with the [RxDB Quickstart](../quickstart.md) -- Check out the [RxDB github repo](https://github.com/pubkey/rxdb) and leave a star ⭐ - ---- - -## Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression - - -Creating a **zero-latency local first** application involves ensuring that most (if not all) user interactions occur instantaneously, without waiting on remote network responses. This design drastically enhances user experience, allowing apps to remain responsive and functional even when offline or experiencing poor connectivity. As developers, we can achieve this by storing data **locally on the client** and synchronizing it to the backend in the background. **RxDB** (Reactive Database) offers a comprehensive set of features - covering replication, offline support, encryption, compression, conflict handling, and more - that make it straightforward to build such high-performing apps. - - - -## Why Zero Latency with a Local First Approach? - -In a traditional architecture, each user action triggers requests to a server for reads or writes. Despite network optimizations, unavoidable latencies can delay responses and disrupt the user flow. By contrast, a local first model maintains data in the client's environment (browser, mobile, desktop), drastically reducing user-perceived delays. Once the user re-connects or resumes activity online, changes propagate automatically to the server, eliminating manual synchronization overhead. - -1. **Instant Responsiveness**: Because user actions (queries, updates, etc.) happen against a local datastore, UI updates do not wait on round-trip times. -2. **Offline Operation**: Apps can continue to read and write data, even when there is zero connectivity. -3. **Reduced Backend Load**: Instead of flooding the server with small requests, replication can combine and push or pull changes in batches. -4. **Simplified Caching**: Instead of implementing multi-layer caching, local first transforms your data layer into a reliable, quickly accessible store for all user actions. - -
    - - - -
    - -## RxDB: Your Key to Zero-Latency Local First Apps - -**RxDB** is a JavaScript-based NoSQL database designed for offline-first and real-time replication scenarios. It supports a range of environments - browsers (IndexedDB or OPFS), mobile ([Ionic](./ionic-storage.md), [React Native](../react-native-database.md)), [Electron](../electron-database.md), Node.js - and is built around: - -- **Reactive Queries** that trigger UI updates upon data changes -- **Schema-based NoSQL Documents** for flexible but robust data models -- [Advanced Sync Engine](../replication.md): to synchronize with diverse backends -- **Encryption** for secure data at rest -- **Compression** to reduce local and network overhead - -### Real-Time Sync and Offline-First -RxDB's replication logic revolves around pulling down remote changes and pushing up local modifications. It maintains a checkpoint-based mechanism, so only new or updated documents flow between the client and server, reducing bandwidth usage and latency. This ensures: - -- **Live Data**: Queries automatically reflect server-side changes once they arrive locally. -- **Background Updates**: No manual polling needed; replication streams or intervals handle synchronization. -- **Conflict Handling** (see below) ensures data merges gracefully when multiple clients edit the same document offline. - -#### Multiple Replication Plugins and Approaches -RxDB's flexible replication system lets you connect to different backends or even peer-to-peer networks. There are official plugins for [CouchDB](../replication-couchdb.md), [Firestore](../replication-firestore.md), [GraphQL](../replication-graphql.md), [WebRTC](../replication-webrtc.md), and more. Many developers create a **custom HTTP replication** to work with their existing REST-based backend, ensuring a painless integration that doesn't require adopting an entirely new server infrastructure. - -#### Example Setup of a local database - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -async function initZeroLocalDB() { - // Create a local RxDB instance using localstorage-based storage - const db = await createRxDatabase({ - name: 'myZeroLocalDB', - storage: getRxStorageLocalstorage(), - // optional: password for encryption if needed - }); - - // Define one or more collections - await db.addCollections({ - tasks: { - schema: { - title: 'task schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string', maxLength: 100 }, - title: { type: 'string' }, - done: { type: 'boolean' } - } - } - } - }); - - // Reactive query - automatically updates on local or remote changes - db.tasks - .find() - .$ // returns an RxJS Observable - .subscribe(allTasks => { - console.log('All tasks updated:', allTasks); - }); - - return db; -} -``` - -When offline, reads and writes to `db.tasks` happen locally with near-zero delay. Once connectivity resumes, changes sync to the server automatically (if replication is configured). - -#### Example Setup of the replication - -```ts -import { replicateRxCollection } from 'rxdb/plugins/replication'; - -async function syncLocalTasks(db) { - replicateRxCollection({ - collection: db.tasks, - replicationIdentifier: 'sync-tasks', - // Define how to pull server documents and push local documents - pull: { - handler: async (lastCheckpoint, batchSize) => { - // logic to retrieve updated tasks from the server since lastCheckpoint - }, - }, - push: { - handler: async (docs) => { - // logic to post local changes to the server - }, - }, - live: true, // continuously replicate - retryTime: 5000, // retry on errors or disconnections - }); -} -``` - -This replication seamlessly merges server-side and client-side changes. Your app remains responsive throughout, regardless of the network status. - -## Things you should also know about - -### Optimistic UI on Local Data Changes - -A local first approach, especially with RxDB, naturally supports an [optimistic UI](./optimistic-ui.md) pattern. Because writes occur on the client, you can instantly reflect changes in the interface as soon as the user performs an action - no need to wait for server confirmation. For example, when a user updates a task document to done: true, the UI can re-render immediately with that new state. This even works across multiple browser tabs. - - - -If a server conflict arises later during replication, RxDB's [conflict handling](../transactions-conflicts-revisions.md) logic determines which changes to keep, and the UI can be updated accordingly. This is far more efficient than blocking the user or displaying a spinner while the backend processes the request. - -### Conflict Handling - -In local first models, conflicts emerge if multiple devices or clients edit the same document while offline. RxDB tracks document revisions so you can detect collisions and merge them effectively. By default, RxDB uses a last-write-wins approach, but developers can override it with a custom conflict handler. This provides fine-grained control - like merging partial fields, storing revision histories, or prompting users for resolution. Proper conflict handling keeps distributed data consistent across your entire system. - -### Schema Migrations - -Over time, apps evolve - new fields, changed field types, or altered indexes. RxDB allows incremental schema migrations so you can upgrade a user's local data from one schema version to another. You might, for instance, rename a property or transform data formats. Once you define your migration strategy, RxDB automatically applies it upon app initialization, ensuring the local database's structure aligns with your latest codebase. - -## Advanced Features - -### Setup Encryption -When storing data locally, you may handle user-sensitive information like PII (Personal Identifiable Information) or financial details. RxDB supports on-device [encryption](../encryption.md) to protect fields. For example, you can define: - -```ts -import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; - -const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ - storage: getRxStorageLocalstorage() -}); - -const db = await createRxDatabase({ - name: 'secureDB', - storage: encryptedStorage, - password: 'myEncryptionPassword' -}); - -await db.addCollections({ - secrets: { - schema: { - title: 'secrets schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string', maxLength: 100 }, - secretField: { type: 'string' } - }, - required: ['id'], - encrypted: ['secretField'] // define which fields to encrypt - } - } -}); -``` - -Then mark fields as `encrypted` in the schema. This ensures data is unreadable on disk without the correct password. - -### Setup Compression - -Local data can expand quickly, especially for large documents or repeated key names. RxDB's key compression feature replaces verbose field names with shorter tokens, decreasing storage usage and speeding up replication. You enable it by adding keyCompression: true to your collection schema: - -```ts -await db.addCollections({ - logs: { - schema: { - title: 'log schema', - version: 0, - keyCompression: true, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string'. maxLength: 100 }, - message: { type: 'string' }, - timestamp: { type: 'number' } - } - } - } -}); -``` - -## Different RxDB Storages Depending on the Runtime - -RxDB's storage layer is swappable, so you can pick the optimal adapter for each environment. Some common choices include: - -- [IndexedDB](../rx-storage-indexeddb.md) in modern browsers (default). -- [OPFS](../rx-storage-opfs.md) (Origin Private File System) in browsers that support it for potentially better performance. -- [SQLite](../rx-storage-sqlite.md) for mobile or desktop environments via the premium plugin, offering native-like speed on Android, iOS, or Electron. -- [In-Memory](../rx-storage-memory.md) for tests or ephemeral data. - -By choosing a suitable storage layer, you can adapt your zero-latency local first design to any runtime - web, [mobile](./mobile-database.md), or server-like contexts in [Node.js](../nodejs-database.md). - -## Performance Considerations - -Performant local data operations are crucial for a zero-latency experience. According to the RxDB [storage performance overview](../rx-storage-performance.md), differences in underlying storages can significantly impact throughput and latency. For instance, IndexedDB typically performs well across modern browsers, [OPFS](../rx-storage-opfs.md) offers improved throughput in supporting browsers, and [SQLite storage](../rx-storage-sqlite.md) (a premium plugin) often delivers near-native speed for mobile or desktop. - -### Offloading Work from the Main Thread - -In a browser environment, you can move database operations into a Web Worker using the [Worker RxStorage plugin](../rx-storage-worker.md). This approach lets you keep heavy data processing off the main thread, ensuring the UI remains smooth and responsive. Complex queries or large write operations no longer cause stuttering in the user interface. - -### Sharding or Memory-Mapped Storages - -For large datasets or high concurrency, advanced techniques like [sharding](../rx-storage-sharding.md) collections across multiple storages or leveraging a [memory-mapped](../rx-storage-memory-mapped.md) variant can further boost performance. By splitting data into smaller subsets or streaming it only as needed, you can scale to handle complex usage scenarios without compromising on the zero-latency user experience. - -## Follow Up - -- Dive into the [RxDB Quickstart](../quickstart.md) to set up your own local first database. -- Explore [Replication Plugins](../replication.md) for syncing with platforms like [CouchDB](../replication-couchdb.md), [Firestore](./firestore-alternative.md), or [GraphQL](../replication-graphql.md). -- Check out Advanced [Conflict Handling](../transactions-conflicts-revisions.md) and [Performance Tuning](../rx-storage-performance.md) for big data sets or complex multi-user interactions. -- Join the RxDB Community on [GitHub](/code/) and [Discord](/chat/) to share insights, file issues, and learn from other developers building zero-latency solutions. -- -By integrating RxDB into your stack, you achieve millisecond interactions, full [offline capabilities](../offline-first.md), secure data at rest, and minimal overhead for large or distributed teams. This zero-latency local first architecture is the future of modern software - delivering a fluid, always-available user experience without overcomplicating the developer workflow. - ---- - -## Backup - -# 📥 Backup Plugin - -With the backup plugin you can write the current database state and ongoing changes into folders on the filesystem. -The files are written in plain json together with their attachments so that you can read them out with any software or tools, without being bound to RxDB. - -This is useful to: - - Consume the database content with other software that cannot replicate with RxDB - - Write a backup of the database to a remote server by mounting the backup folder on the other server. - -The backup plugin works only in node.js, not in a browser. It is intended to have a backup strategy when using RxDB on the server side like with the [RxServer](./rx-server.md). To run backups on the client side, you should use one of the [replication](./replication.md) plugins instead. - -## Installation - -```javascript -import { addRxPlugin } from 'rxdb'; -import { RxDBBackupPlugin } from 'rxdb/plugins/backup'; -addRxPlugin(RxDBBackupPlugin); -``` - -## one-time backup - -Write the whole database to the filesystem **once**. -When called multiple times, it will continue from the last checkpoint and not start all over again. - -```javascript -const backupOptions = { - // if false, a one-time backup will be written - live: false, - // the folder where the backup will be stored - directory: '/my-backup-folder/', - // if true, attachments will also be saved - attachments: true -} -const backupState = myDatabase.backup(backupOptions); -await backupState.awaitInitialBackup(); - -// call again to run from the last checkpoint -const backupState2 = myDatabase.backup(backupOptions); -await backupState2.awaitInitialBackup(); -``` - -## live backup - -When `live: true` is set, the backup will write all ongoing changes to the backup directory. - -```javascript -const backupOptions = { - // set live: true to have an ongoing backup - live: true, - directory: '/my-backup-folder/', - attachments: true -} -const backupState = myDatabase.backup(backupOptions); - -// you can still await the initial backup write, but further changes will still be processed. -await backupState.awaitInitialBackup(); -``` - -## writeEvents$ - -You can listen to the `writeEvents$` Observable to get notified about written backup files. - -```javascript -const backupOptions = { - live: false, - directory: '/my-backup-folder/', - attachments: true -} -const backupState = myDatabase.backup(backupOptions); - -const subscription = backupState.writeEvents$.subscribe(writeEvent => console.dir(writeEvent)); -/* -> { - collectionName: 'humans', - documentId: 'foobar', - files: [ - '/my-backup-folder/foobar/document.json' - ], - deleted: false -} -*/ -``` - -## Limitations - -- It is currently not possible to import from a written backup. If you need this functionality, please make a pull request. - ---- - -## Capacitor Database Guide - SQLite, RxDB & More - -import {Tabs} from '@site/src/components/tabs'; -import {Steps} from '@site/src/components/steps'; - -# Capacitor Database - SQLite, RxDB and others - -[Capacitor](https://capacitorjs.com/) is an open source native JavaScript runtime to build Web based Native apps. You can use it to create cross-platform iOS, Android, and Progressive Web Apps with the web technologies JavaScript, HTML, and CSS. -It is developed by the Ionic Team and provides a great alternative to create hybrid apps. Compared to [React Native](./react-native-database.md), Capacitor is more Web-Like because the JavaScript runtime supports most Web APIs like IndexedDB, fetch, and so on. - -To read and write persistent data in Capacitor, there are multiple solutions which are shown in the following. - - - -## Database Solutions for Capacitor - -### Preferences API - -Capacitor comes with a native [Preferences API](https://capacitorjs.com/docs/apis/preferences) which is a simple, persistent key->value store for lightweight data, similar to the browsers localstorage or React Native [AsyncStorage](./react-native-database.md#asyncstorage). - -To use it, you first have to install it from npm `npm install @capacitor/preferences` and then you can import it and write/read data. -Notice that all calls to the preferences API are asynchronous so they return a `Promise` that must be `await`-ed. - -```ts -import { Preferences } from '@capacitor/preferences'; - -// write -await Preferences.set({ - key: 'foo', - value: 'baar', -}); - -// read -const { value } = await Preferences.get({ key: 'foo' }); // > 'bar' - -// delete -await Preferences.remove({ key: 'foo' }); -``` - -The preferences API is good when only a small amount of data needs to be stored and when no query capabilities besides the key access are required. Complex queries or other features like indexes or replication are not supported which makes the preferences API not suitable for anything more than storing simple data like user settings. - -### Localstorage/IndexedDB/WebSQL - -Since Capacitor apps run in a web view, Web APIs like IndexedDB, [Localstorage](./articles/localstorage.md) and WebSQL are available. But the default browser behavior is to clean up these storages regularly when they are not in use for a long time or the device is low on space. Therefore you cannot 100% rely on the persistence of the stored data and your application needs to expect that the data will be lost eventually. - -Storing data in these storages can be done in browsers, because there is no other option. But in Capacitor iOS and Android, you should not rely on these. - -### SQLite - -SQLite is a SQL based relational database written in C that was crafted to be embed inside of applications. Operations are written in the SQL query language and SQLite generally follows the PostgreSQL syntax. - -To use SQLite in Capacitor, there are three options: - -- The [@capacitor-community/sqlite](https://github.com/capacitor-community/sqlite) package -- The [cordova-sqlite-storage](https://github.com/storesafe/cordova-sqlite-storage) package -- The non-free [Ionic](./articles/ionic-database.md) [Secure Storage](https://ionic.io/products/secure-storage) which comes at **999$** per month. - -It is recommended to use the `@capacitor-community/sqlite` because it has the best maintenance and is open source. Install it first `npm install --save @capacitor-community/sqlite` and then set the storage location for iOS apps: - -```json -{ - "plugins": { - "CapacitorSQLite": { - "iosDatabaseLocation": "Library/CapacitorDatabase" - } - } -} -``` - -Now you can create a database connection and use the SQLite database. - -```ts -import { Capacitor } from '@capacitor/core'; -import { - CapacitorSQLite, SQLiteDBConnection, SQLiteConnection, capSQLiteSet, - capSQLiteChanges, capSQLiteValues, capEchoResult, capSQLiteResult, - capNCDatabasePathResult -} from '@capacitor-community/sqlite'; - -const sqlite = new SQLiteConnection(CapacitorSQLite); -const database: SQLiteDBConnection = await this.sqlite.createConnection( - databaseName, - encrypted, - mode, - version, - readOnly -); -let { rows } = database.query('SELECT somevalue FROM sometable'); -``` - -The downside of SQLite is that it is lacking many features that are handful when using a database together with an UI based application like your Capacitor app. For example it is not possible to observe queries or document fields. Also there is no realtime replication feature, you can only import json files. This makes SQLite a good solution when you just want to store data on the client, but when you want to sync data with a server or other clients or create big complex realtime applications, you have to use something else. - -### RxDB - - - -[RxDB](https://rxdb.info/) is an local first, NoSQL database for JavaScript Applications like hybrid apps. Because it is reactive, you can subscribe to all state changes like the result of a query or even a single field of a document. This is great for UI-based realtime applications in a way that makes it easy to develop realtime applications like what you need in Capacitor. - -Because RxDB is made for Web applications, most of the [available RxStorage](./rx-storage.md) plugins can be used to store and query data in a Capacitor app. However it is recommended to use the [SQLite RxStorage](./rx-storage-sqlite.md) because it stores the data on the filesystem of the device, not in the JavaScript runtime (like IndexedDB). Storing data on the filesystem ensures it is persistent and will not be cleaned up by any process. Also the performance of SQLite is [much faster](./rx-storage.md#performance-comparison) compared to IndexedDB, because SQLite does not have to go through a browsers permission layers. For the SQLite binding you should use the [@capacitor-community/sqlite](https://github.com/capacitor-community/sqlite) package. - -Because the SQLite RxStorage is part of the [👑 Premium Plugins](/premium/) which must be purchased, it is recommended to use the [LocalStorage RxStorage](./rx-storage-localstorage.md) while testing and prototyping your Capacitor app. - -To use the SQLite RxStorage in Capacitor you have to install all dependencies via `npm install rxdb rxjs rxdb-premium @capacitor-community/sqlite`. - -For iOS apps you should add a database location in your Capacitor settings: - -```json -{ - "plugins": { - "CapacitorSQLite": { - "iosDatabaseLocation": "Library/CapacitorDatabase" - } - } -} -``` - -Then you can assemble the RxStorage and create a database with it: - - - -### Import RxDB and SQLite - -```ts -import { - createRxDatabase -} from 'rxdb/plugins/core'; -import { - CapacitorSQLite, - SQLiteConnection -} from '@capacitor-community/sqlite'; -import { Capacitor } from '@capacitor/core'; -const sqlite = new SQLiteConnection(CapacitorSQLite); -``` - -### Import the RxDB SQLite Storage - - - -#### RxDB Core - -```ts -import { - getRxStorageSQLiteTrial, - getSQLiteBasicsCapacitor -} from 'rxdb/plugins/storage-sqlite'; -``` - -#### RxDB Premium 👑 - -```ts -import { - getRxStorageSQLite, - getSQLiteBasicsCapacitor -} from 'rxdb-premium/plugins/storage-sqlite'; -``` - - - -### Create a Database with the Storage - - - -#### RxDB Core - -```ts -// create database -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageSQLiteTrial({ - sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor) - }) -}); -``` - -#### RxDB Premium 👑 - -```ts -// create database -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor) - }) -}); -``` - - - -### Add a Collection - -```ts -// create collections -const collections = await myRxDatabase.addCollections({ - humans: { - schema: { - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string', maxLength: 100 }, - name: { type: 'string' }, - age: { type: 'number' } - }, - required: ['id', 'name'] - } - } -}); -``` - -### Insert a Document - -```ts -await collections.humans.insert({id: 'foo', name: 'bar'}); -``` - -### Run a Query - -```ts -const result = await collections.humans.find({ - selector: { - name: 'bar' - } -}).exec(); -``` - -### Observe a Query - -```ts -await collections.humans.find({ - selector: { - name: 'bar' - } -}).$.subscribe(result => {/* ... */}); -``` - - - -## Follow up - -- If you haven't done yet, you should start learning about RxDB with the [Quickstart Tutorial](./quickstart.md). -- There is a followup list of other [client side database alternatives](./alternatives.md). - ---- - -## Cleanup - -# 🧹 Cleanup - -To make the replication work, and for other reasons, RxDB has to keep deleted documents in storage so that it can replicate their deletion state. -This ensures that when a client is offline, the deletion state is still known and can be replicated with the backend when the client goes online again. - -Keeping too many deleted documents in the storage, can slow down queries or fill up too much disc space. -With the cleanup plugin, RxDB will run cleanup cycles that clean up deleted documents when it can be done safely. - -## Installation - -```ts -import { addRxPlugin } from 'rxdb'; -import { RxDBCleanupPlugin } from 'rxdb/plugins/cleanup'; -addRxPlugin(RxDBCleanupPlugin); -``` - -## Create a database with cleanup options - -You can set a specific cleanup policy when a `RxDatabase` is created. For most use cases, the defaults should be ok. - -```ts -import { createRxDatabase } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -const db = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage(), - cleanupPolicy: { - /** - * The minimum time in milliseconds for how long - * a document has to be deleted before it is - * purged by the cleanup. - * [default=one month] - */ - minimumDeletedTime: 1000 * 60 * 60 * 24 * 31, // one month, - /** - * The minimum amount of that that the RxCollection must have existed. - * This ensures that at the initial page load, more important - * tasks are not slowed down because a cleanup process is running. - * [default=60 seconds] - */ - minimumCollectionAge: 1000 * 60, // 60 seconds - /** - * After the initial cleanup is done, - * a new cleanup is started after [runEach] milliseconds - * [default=5 minutes] - */ - runEach: 1000 * 60 * 5, // 5 minutes - /** - * If set to true, - * RxDB will await all running replications - * to not have a replication cycle running. - * This ensures we do not remove deleted documents - * when they might not have already been replicated. - * [default=true] - */ - awaitReplicationsInSync: true, - /** - * If true, it will only start the cleanup - * when the current instance is also the leader. - * This ensures that when RxDB is used in multiInstance mode, - * only one instance will start the cleanup. - * [default=true] - */ - waitForLeadership: true - } -}); -``` - -## Calling cleanup manually - -You can manually run a cleanup per collection by calling `RxCollection.cleanup()`. - -```ts - -/** - * Manually run the cleanup with the - * minimumDeletedTime from the cleanupPolicy. - */ -await myRxCollection.cleanup(); - -/** - * Overwrite the minimumDeletedTime - * be setting it explicitly (time in milliseconds) - */ -await myRxCollection.cleanup(1000); - -/** - * Purge all deleted documents no - * matter when they where deleted - * by setting minimumDeletedTime to zero. - */ -await myRxCollection.cleanup(0); -``` - -## Using the cleanup plugin to empty a collection - -When you have a collection with documents and you want to empty it by purging all documents, the recommended way is to call `myRxCollection.remove()`. However, this will destroy the JavaScript class of the collection and stop all listeners and observables. -Sometimes the better option might be to manually delete all documents and then use the cleanup plugin to purge the deleted documents: - -```ts -// delete all documents -await myRxCollection.find().remove(); -// purge all deleted documents -await myRxCollection.cleanup(0); -``` - -## FAQ - -
    - When does the cleanup run - - The cleanup cycles are optimized to run only when the database is idle and it is unlikely that another database interaction performance will be decreased in the meantime. For example, by default, the cleanup does not run in the first 60 seconds of the creation of a collection to ensure the initial page load of your website does not slow down. Also, we use mechanisms like the `requestIdleCallback()` API to improve the correct timing of the cleanup cycle. - -
    - ---- - -## Contribute - -# Contribution - -We are open to, and grateful for, any contributions made by the community. - -# Developing - -## Requirements - -Before you can start developing, do the following: - -1. Make sure you have installed nodejs with the version stated in the [.nvmrc](https://github.com/pubkey/rxdb/blob/master/.nvmrc) -2. Clone the repository `git clone https://github.com/pubkey/rxdb.git` -3. Install the dependencies `cd rxdb && npm install` -4. Make sure that the tests work for you. At first, try it out with `npm run test:node:memory` which tests the memory storage in node. In the [package.json](https://github.com/pubkey/rxdb/blob/master/package.json) you can find more scripts to run the tests with different storages. - -## Adding tests - -Before you start creating a bugfix or a feature, you should create a test to reproduce it. Tests are in the `test/unit`-folder. -If you want to reproduce a bug, you can modify the test in [this file](https://github.com/pubkey/rxdb/blob/master/test/unit/bug-report.test.ts). - -## Making a PR - -If you make a pull-request, ensure the following: - -1. Every feature or bugfix must be committed together with a unit-test which ensures everything works as expected. -2. Do not commit build-files (anything in the `dist`-folder) -3. Before you add non-trivial changes, create an issue to discuss if this will be merged and you don't waste your time. -4. To run the unit and integration-tests, do `npm run test` and ensure everything works as expected - -## Getting help - -If you need help with your contribution, ask at [discord](https://rxdb.info/chat/). - -## No-Go - -When reporting a bug, you need to make a PR with a test case that runs in the CI and reproduces your problem. -Sending a link with a repo does not help the maintainer because installing random peoples projects is time consuming and dangerous. -Also the maintainer will never go on a bug hunt based on your plain description. Either you report the bug with a test case, or the maintainer will likely not help you. - -# Docs - -The source of the documentation is at the `docs-src`-folder. -To read the docs locally, run `npm run docs:install && npm run docs:serve` and open `http://localhost:4000/` - -# Thank you for contributing! - ---- - -## CRDT - Conflict-free replicated data type Database - -# RxDB CRDT Plugin - -Whenever there are multiple instances in a distributed system, data writes can cause conflicts. Two different clients could do a write to the same document at the same time or while they are both offline. When the clients replicate the document state with the server, a conflict emerges that must be resolved by the system. - -In [RxDB](./), conflicts are normally resolved by setting a `conflictHandler` when creating a collection. The conflict handler is a JavaScript function that gets the two conflicting states of the same document and it will return the resolved document state. -The [default conflict handler](./replication.md#conflict-handling) will always drop the fork state and use the master state to ensure that clients that have been offline for a long time, do not overwrite other clients changes when they go online again. - - - -With CRDTs (short for [Conflict-free replicated data type](https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type)), all document -writes are represented as CRDT operations in plain JSON. The CRDT operations are stored together with the document and each time a conflict arises, the CRDT conflict handler will automatically merge the operations in a deterministic way. Using CRDTs is an easy way to "magically" handle all conflict problems in your application by storing the deltas of writes together with the document data. - - - -## RxDB CRDT operations - -In RxDB, a CRDT operation is defined with NoSQL update operators, like you might know them from [MongoDB update operations](https://www.mongodb.com/docs/manual/reference/operator/update/) or the [RxDB update plugin](./rx-document.md#update). -To run the operators, RxDB uses the [mingo library](https://github.com/kofrasa/mingo#updating-documents). - -A CRDT operator example: - -```js -const myCRDTOperation = { - // increment the points field by +1 - $inc: { - points: 1 - }, - // set the modified field to true - $set: { - modified: true - } -}; -``` - -### Operators - -At the moment, not all possible operators are implemented in [mingo](https://github.com/kofrasa/mingo#updating-documents), if you need additional ones, you should make a pull request there. - -The following operators can be used at this point in time: -- `$min` -- `$max` -- `$inc` -- `$set` -- `$unset` -- `$push` -- `$addToSet` -- `$pop` -- `$pullAll` -- `$rename` - -For the exact definition on how each operator behaves, check out the [MongoDB documentation on update operators](https://www.mongodb.com/docs/manual/reference/operator/update/). - -## Installation - -To use CRDTs with RxDB, you need the following: - -- Add the CRDT plugin via `addRxPlugin`. -- Add a field to your schema that defines where to store the CRDT operations via `getCRDTSchemaPart()` -- Set the `crdt` options in your schema. -- Do **NOT** set a custom conflict handler, the plugin will use its own one. - -```ts -// import the relevant parts from the CRDT plugin -import { - getCRDTSchemaPart, - RxDBcrdtPlugin -} from 'rxdb/plugins/crdt'; - -// add the CRDT plugin to RxDB -import { addRxPlugin } from 'rxdb'; -addRxPlugin(RxDBcrdtPlugin); - -// create a database -import { createRxDatabase } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -const myDatabase = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage() -}); - -// create a schema with the CRDT options -const mySchema = { - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 - }, - points: { - type: 'number', - maximum: 100, - minimum: 0 - }, - crdts: getCRDTSchemaPart() // use this field to store the CRDT operations - }, - required: ['id', 'points'], - crdt: { // CRDT options - field: 'crdts' - } -} - -// add a collection -await db.addCollections({ - users: { - schema: mySchema - } -}); - -// insert a document -const myDocument = await db.users.insert({id: 'alice', points: 0}); - -// run a CRDT operation that increments the 'points' by one -await myDocument.updateCRDT({ - ifMatch: { - $inc: { - points: 1 - } - } -}); -``` - -## Conditional CRDT operations - -By default, all CRDTs operations will be run to build the current document state. But in many cases, more granular operations are required to better reflect the desired business logic. For these cases, conditional CRDTs can be used. - -For example if you have a field `points` with a `maximum` of `100`, you might want to only run the `$inc` operation, if the `points` value is less than `100`. -In an conditional CRDT, you can specify a `selector` and the operation sets `ifMatch` and `ifNotMatch`. At each time the CRDT is applied to the document state, first the selector will run and evaluate which operations path must be used. - -```ts -await myDocument.updateCRDT({ - // only if the selector matches, the ifMatch operation will run - selector: { - age: { - $lt: 100 - } - }, - // an operation that runs if the selector matches - ifMatch: { - $inc: { - points: 1 - } - }, - // if the selector does NOT match, you could run a different operation instead - ifNotMatch: { - // ... - } -}); -``` - -## Running multiples operations at once - -By default, one CRDT operation is applied to the document in a single database write. -To represent more complex logic chains, it might make sense to use multiple CRDTs and write them at once inside of a single atomic document write. - -For these cases, the `updateCRDT()` method allows to pass an array of operations. - -```ts -await myDocument.updateCRDT([ - { - selector: { /** ... **/ }, - ifMatch: { /** ... **/ } - }, - { - selector: { /** ... **/ }, - ifMatch: { /** ... **/ } - }, - { - selector: { /** ... **/ }, - ifMatch: { /** ... **/ } - }, - { - selector: { /** ... **/ }, - ifMatch: { /** ... **/ } - } -]); -``` - -## CRDTs on inserts - -When CRDTs are enabled with the plugin, all insert operations are automatically mapped as CRDT operation with the `$set` operator. - -```ts -// Calling RxCollection.insert() -await myRxCollection.insert({ - id: 'foo' - points: 1 -}); -// is exactly equal to calling insertCRDT() -await myRxCollection.insertCRDT({ - ifMatch: { - $set: { - id: 'foo' - points: 1 - } - } -}); -``` - -When the same document is inserted in multiple client instances and then replicated, a conflict will emerge and the insert-CRDTs will overwrite each other in a deterministic order. -You can use `insertCRDT()` to make conditional insert operations with any logic. To check for the previous existence of a document, use the `$exists` query operation on the primary key of the document. - -```ts -await myRxCollection.insertCRDT({ - selector: { - // only run if the document did not exist before. - id: { $exists: false } - }, - ifMatch: { - // if the document did not exist, insert it - $set: { - id: 'foo' - points: 1 - } - }, - ifNotMatch: { - // if document existed already, increment the points by +1 - $inc: { - points: 1 - } - } -}); -``` - -## Deleting documents - -You can delete a document with a CRDT operation by setting `_deleted` to true. Calling `RxDocument.remove()` will do exactly the same when CRDTs are activated. - -```ts -await doc.updateCRDT({ - ifMatch: { - $set: { - _deleted: true - } - } -}); - -// OR -await doc.remove(); -``` - -## CRDTs with replication - -CRDT operations are stored inside of a special field besides your 'normal' document fields. -When replicating document data with the [RxDB replication](./replication.md) or the [CouchDB replication](./replication-couchdb.md) or even any custom replication, the CRDT operations must be replicated together with the document data as if they would be 'normal' a document property. - -When any instances makes a write to the document, it is required to update the CRDT operations accordingly. For example if your custom backend updates a document, it must also do that by adding a CRDT operation. In [dev-mode](./dev-mode.md) RxDB will refuse to store any document data where the document properties do not match the result of the CRDT operations. - -## Why not automerge.js or yjs? - -There are already CRDT libraries out there that have been considered to be used with RxDB. The biggest ones are [automerge](https://github.com/automerge/automerge) and [yjs](https://github.com/yjs/yjs). The decision was made to not use these but instead go for a more NoSQL way of designing the CRDT format because: - -- Users do not have to learn a new syntax but instead can use the NoSQL query operations which they already know to manipulate the JSON data of a document. -- RxDB is often used to [replicate](./replication.md) data with any custom backend on an already existing infrastructure. Using NoSQL operators instead of binary data in CRDTs, makes it easy to implement the exact same logic on these backends so that the backend can also do document writes and still be compliant to the RxDB CRDT plugin. - -So instead of using YJS or Automerge with a database, you can use RxDB with the CRDT plugin to have a more database specific CRDT approach. This gives you additional features for free such as [schema validation](./schema-validation.md) or [data migration](./migration-schema.md). - -## When to not use CRDTs - -CRDT can only be use when your business logic allows to represent document changes via static json operators. -If you can have cases where user interaction is required to correctly merge conflicting document states, you cannot use CRDTs for that. - -Also when CRDTs are used, it is no longer allowed to do non-CRDT writes to the document properties. - -## CRDT Alternative - -While the CRDT plugin can automatically merge concurrent document updates, it is not the only way to resolve conflicts in RxDB. -An alternative approach to CRDT is to use RxDB's built-in [conflict handling system](./transactions-conflicts-revisions.md). - -> Why use conflict handlers instead of CRDT? - -Conflict handlers offer a **simpler and more flexible** way to manage data conflicts. Instead of encoding changes as CRDT operations, you define how RxDB should decide which document version "wins" with plain JavaScript code. This approach is easier to reason about because it works directly with your domain logic. For example, you can compare timestamps, prioritize certain fields, or even involve user interaction to resolve conflicts. - -Conflict handlers are: - -* **Easier to understand**: you work with plain document states instead of CRDT operations. -* **Fully customizable**: you can define any merge strategy, from simple last-write-wins to complex rule-based logic. -* **Compatible with all data types**: unlike CRDTs, which are best suited for numeric or set-based updates. -* **Transparent**: you always know which state is being written and why. - -### Downsides of CRDTs - -CRDTs are powerful for automatic conflict-free merging, but they also come with trade-offs: - -* **Higher conceptual complexity**: CRDTs require understanding of operation semantics, version vectors, and merge determinism. -* **Limited flexibility**: you can only express changes that fit the supported JSON-style update operators. -* **Difficult debugging**: when merges don't behave as expected, it can be hard to trace the sequence of CRDT operations that led to a state. -* **Overhead for simple cases**: if your data rarely conflicts or needs human oversight, using CRDTs can add unnecessary complexity. - - -### When to choose conflict handlers - -Use conflict handlers as CRDT alternative if: -* You want full control over merge logic. -* Your data model includes contextual or user-specific decisions. -* You prefer a straightforward, rule-based resolution system over automatic merges. - -Use CRDTs if: -* Your app performs frequent offline writes that can be merged deterministically. -* Your data can be represented as additive, numeric, or array-based updates. -* You want minimal manual intervention during replication. - -Both methods are first-class citizens in RxDB. CRDTs focus on **automatic, deterministic merging**, while conflict handlers emphasize **clarity, flexibility, and control**. - -### Example: merging different fields with conflict handlers instead of CRDT - -For example, imagine two users edit different fields of the same document at the same time. One updates a `name`, the other updates a `score`. A custom conflict handler can merge both changes so no data is lost: - -```ts -const mergeFieldsHandler = { - isEqual: (a, b) => JSON.stringify(a) === JSON.stringify(b), - resolve: (input) => { - return { - ...input.realMasterState, - name: input.newDocumentState.name ?? input.realMasterState.name, - score: Math.max(input.newDocumentState.score, input.realMasterState.score) - }; - } -}; -``` - -In this example, if the two versions change different properties, the final merged document includes both updates. This kind of logic is often easier to reason about than designing equivalent CRDT operations. - - - ---- - -## Data Migration - -This documentation page has been moved to [here](./migration-schema.md) - - - ---- - -## Development Mode - -import {Steps} from '@site/src/components/steps'; - -# Dev Mode - -The dev-mode plugin adds many checks and validations to RxDB. -This ensures that you use the RxDB API properly and so the dev-mode plugin should always be used when -using RxDB in development mode. - -- Adds readable error messages. -- Ensures that `readonly` JavaScript objects are not accidentally mutated. -- Adds validation check for validity of schemas, queries, [ORM](./orm.md) methods and document fields. - - Notice that the `dev-mode` plugin does not perform schema checks against the data see [schema validation](./schema-validation.md) for that. - -:::warning -The dev-mode plugin will increase your build size and decrease the performance. It must **always** be used in development. You should **never** use it in production. -::: - - - -### Import the dev-mode Plugin -```javascript -import { RxDBDevModePlugin } from 'rxdb/plugins/dev-mode'; -import { addRxPlugin } from 'rxdb/plugins/core'; -``` - -## Add the Plugin to RxDB - -```javascript -addRxPlugin(RxDBDevModePlugin); -``` - - -## Usage with Node.js - -```ts -async function createDb() { - if (process.env.NODE_ENV !== "production") { - await import('rxdb/plugins/dev-mode').then( - module => addRxPlugin(module.RxDBDevModePlugin) - ); - } - const db = createRxDatabase( /* ... */ ); -} -``` - -## Usage with Angular - -```ts -import { isDevMode } from '@angular/core'; - -async function createDb() { - if (isDevMode()){ - await import('rxdb/plugins/dev-mode').then( - module => addRxPlugin(module.RxDBDevModePlugin) - ); - } - - const db = createRxDatabase( /* ... */ ); - // ... -} -``` - -## Usage with webpack - -In the `webpack.config.js`: - -```ts -module.exports = { - entry: './src/index.ts', - /* ... */ - plugins: [ - // set a global variable that can be accessed during runtime - new webpack.DefinePlugin({ MODE: JSON.stringify("production") }) - ] - /* ... */ -}; -``` - -In your source code: - -```ts -declare var MODE: 'production' | 'development'; - -async function createDb() { - if (MODE === 'development') { - await import('rxdb/plugins/dev-mode').then( - module => addRxPlugin(module.RxDBDevModePlugin) - ); - } - const db = createRxDatabase( /* ... */ ); - // ... -} -``` - -## Disable the dev-mode warning - -When the dev-mode is enabled, it will print a `console.warn()` message to the console so that you do not accidentally use the dev-mode in production. To disable this warning you can call the `disableWarnings()` function. - -```ts -import { disableWarnings } from 'rxdb/plugins/dev-mode'; -disableWarnings(); -``` - -## Disable the tracking iframe - -When used in localhost and in the browser, the dev-mode plugin can add a tracking iframe to the DOM. This is used to track the effectiveness of marketing efforts of RxDB. -If you have [premium access](/premium/) and want to disable this iframe, you can call `setPremiumFlag()` before creating the database. - -```js -import { setPremiumFlag } from 'rxdb-premium/plugins/shared'; -setPremiumFlag(); -``` - ---- - -## Downsides of Local First / Offline First - -import {QuoteBlock} from '@site/src/components/quoteblock'; - -# Downsides of Local First / Offline First - -So you have read [all these things](./offline-first.md) about how the [local-first](./articles/local-first-future.md) (aka offline-first) paradigm makes it easy to create realtime web applications that even work when the user has no internet connection. -But there is no free lunch. The offline first paradigm is not the perfect approach for all kinds of apps. - -You fully understood a technology when you know when not to use it - -In the following I will point out the limitations you need to know before you decide to use [RxDB](https://github.com/pubkey/rxdb) or even before you decide to create an offline first application. - -## It only works with small datasets - -Making data available offline means it must be loaded from the server and then stored at the clients device. -You need to load the full dataset on the first pageload and on every ongoing load you need to download the new changes to that set. -While in theory you could download in infinite amount of data, in practice you have a limit how long the user can wait before having an up-to-date state. -You want to display chat messages like Whatsapp? No problem. Syncing all the messages a user could write, can be done with a few HTTP requests. -Want to make a tool that displays server logs? Good luck downloading terabytes of data to the client just to search for a single string. This will not work. - -Besides the network usage, there is another limit for the size of your data. -In browsers you have some options for storage: Cookies, [Localstorage](./articles/localstorage.md), [WebSQL](./articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.md#what-was-websql) and [IndexedDB](./rx-storage-indexeddb.md). - -Because Cookies and [Localstorage](./articles/localstorage.md) is slow and WebSQL is deprecated, you will use IndexedDB. -The [limit of how much data you can store in IndexedDB](./articles/indexeddb-max-storage-limit.md) depends on two factors: Which browser is used and how much disc space is left on the device. You can assume that at least a couple of [hundred megabytes](https://web.dev/storage-for-the-web/) are available at least. The maximum is potentially hundreds of gigabytes or more, but the browser implementations vary. Chrome allows the browser to use up to 60% of the total disc space per origin. Firefox allows up to 50%. But on safari you can only store up to 1GB and the browser will prompt the user on each additional 200MB increment. - -The problem is, that you have no chance to really predict how much data can be stored. So you have to make assumptions that are hopefully true for all of your users. Also, you have no way to increase that space like you would add another hard drive to your backend server. Once your clients reach the limit, you likely have to rewrite big parts of your applications. - -UPDATE (2023): Newer versions of browsers can store way more data, for example firefox stores up to 10% of the total disk size. For an overview about how much can be stored, read [this guide](https://developer.mozilla.org/en-US/docs/Web/API/Storage_API/Storage_quotas_and_eviction_criteria) - -## Browser storage is not really persistent - -When data is stored inside IndexedDB or one of the other storage APIs, it cannot be trusted to stay there forever. -Apple for example deletes the data when the website was not used in the [last 7 days](https://webkit.org/blog/10218/full-third-party-cookie-blocking-and-more/). The other browsers also have logic to clean up the stored data, and in the end the user itself could be the one that deletes the browsers local data. - -The most common way to handle this, is to replicate everything from the backend to the client again. -Of course, this does not work for state that is not stored at the backend. So if you assume you can store the users private data inside the browser in a secure way, you are [wrong](https://medium.com/universal-ethereum/out-of-gas-were-shutting-down-unilogin-3b544838df1a#4f60). - - - -## There can be conflicts - -Imagine two of your users modify the same JSON document, while both are offline. After they go online again, their clients replicate the modified document to the server. Now you have two conflicting versions of the same document, and you need a way to determine how the correct new version of that document should look like. This process is called **conflict resolution**. - - - - 1. The default in [many](https://docs.couchdb.org/en/stable/replication/conflicts.html) offline first databases is a deterministic conflict resolution strategy. Both conflicting versions of the document are kept in the storage and when you query for the document, a winner is determined by comparing the hashes of the document and only the winning document is returned. Because the comparison is deterministic, all clients and servers will always pick the same winner. This kind of resolution only works when it is not that important that one of the document changes gets dropped. Because conflicts are rare, this might be a viable solution for some use cases. - - 2. A better resolution can be applied by listening to the changestream of the database. The changestream emits an event each time a write happens to the database. The event contains information about the written document and also a flag if there is a conflicting version. For each event with a conflict, you fetch all versions for that document and create a new document that contains the winning state. With that you can implement pretty complex conflict resolution strategies, but you have to manually code it for each collection of documents. - - 3. Instead of the solving conflict once at every client, it can be made a bit easier by solely relying on the backend. This can be done when all of your clients replicate with the same single backend server. With [RxDB's Graphql Replication](./replication-graphql.md) each client side change is sent to the server where conflicts can be resolved and the winning document can be sent back to the clients. - - 4. Sometimes there is no way to solve a conflict with code. If your users edit text based documents or images, often only the users themselves can decide how the winning revision has to look. For these cases, you have to implement complex UI parts where the users can inspect the conflict and manage its resolution. - - 5. You do not have to handle conflicts if they cannot happen in the first place. You can achieve that by designing a write only database where existing documents cannot be touched. Instead of storing the current state in a single document, you store all the events that lead to the current state. Sometimes called the ["everything is a delta"](https://pouchdb.com/guides/conflicts.html#accountants-dont-use-erasers) strategy, others would call it [Event Sourcing](https://martinfowler.com/eaaDev/EventSourcing.html). Like an accountant that does not need an eraser, you append all changes and afterwards aggregate the current state at the client. - ```ts - // create one new document for each change to the users balance - {id: new Date().toJSON(), change: 100} // balance increased by $100 - {id: new Date().toJSON(), change: -50} // balance decreased by $50 - {id: new Date().toJSON(), change: 200} // balance increased by $200 - ``` - - 6. There is this thing called **conflict-free replicated data type**, short **CRDT**. Using a CRDT library like [automerge](https://github.com/automerge/automerge) will magically solve all of your conflict problems. Until you use it in production where you observe that implementing CRDTs has basically the same complexity as implementing conflict resolution strategies. - -## Realtime is a lie - -So you replicate stuff between the clients and your backend. Each change on one side directly changes the state of the other sides in **realtime**. But this "realtime" is not the same as in [realtime computing](https://en.wikipedia.org/wiki/Real-time_computing). In the offline first world, the word realtime was introduced by firebase and is more meant as a marketing slogan than a technical description. -There is an internet between your backend and your clients and everything you do on one machine takes at least once the latency until it can affect anything on the other machines. You have to keep this in mind when you develop anything where the timing is important, like a multiplayer game or a stock trading app. - -Even when you run a query against the local database, there is no "real" realtime. -Client side databases run on JavaScript and JavaScript runs on a single CPU that might be partially blocked because the user is running some background processes. So you can never guarantee a response deadline which violates the time constraint of realtime computing. - - - -## Eventual consistency - -An offline first app does not have a single source of truth. There is a source on the backend, one on the own client, and also each other client has its own definition of truth. At the moment your user starts the app, the local state is hopefully already replicated with the backend and all other clients. But this does not have to be true, the states can have converged and you have to plan for that. -The user could update a document based on wrong assumptions because it was not fully replicated at that point in time because the user is offline. A good way to handle this problem is to show the replication state in the UI and tell the user when the replication is running, stopped, paused or finished. - -And some data is just too important to be "eventual consistent". Create a wire transfer in your online banking app while you are offline. You keep the smartphone laying at your night desk and when you use again in the next morning, it goes online and replicates the transaction. No thank you, do not use offline first for these kinds of things, or at least you have to display the replication state of each document in the UI. - - - -## Permissions and authentication - -Every offline first app that goes beyond a prototype, does likely not have the same global state for all of its users. Each user has a different set of documents that are allowed to be replicated or seen by the user. So you need some kind of authentication and permission handling to divide the documents. -The easy way is to just create one database for each user on the backend and only allow to replicate that one. Creating that many databases is not really a problem with for example CouchDB, and it makes permission handling easy. -But as soon as you want to query all of your data in the backend, it will bite back. Your data is not at a single place, it is distributed between all of the user specific databases. This becomes even more complex as soon as you store information together with the documents that is not allowed to be seen by outsiders. You not only have to decide which documents to replicate, but also which fields of them. - -So what you really want is a single datastore in the backend and then replicate only the allowed document parts to each of the users. -This always requires you to implement your custom replication endpoint like what you do with RxDBs [GraphQL Replication](./replication-graphql.md). - -## You have to migrate the client database - -While developing your app, sooner or later you want to change the data layout. You want to add some new fields to documents or change the format of them. So you have to update the database schema and also migrate the stored documents. -With 'normal' applications, this is already hard enough and often dangerous. You wait until midnight, stop the webserver, make a database backup, deploy the new schema and then you hope that nothing goes wrong while it updates that many documents. - -With offline first applications, it is even more fun. You do not only have to migrate your local backend database, you also have to provide a [migration strategy](./migration-schema.md) for all of these client databases out there. And you also cannot migrate everything at the same time. The clients can only migrate when the new code was updated from the appstore or the user visited your website again. This could be today or in a few weeks. - -## Performance is not native - -When you create a web based offline first app, you cannot store data directly on the users filesystem. In fact there are many layers between your JavaScript code and the filesystem of the operation system. Let's say you insert a document in [RxDB](https://github.com/pubkey/rxdb): - - You call the RxDB API to validate and store the data - - RxDB calls the underlying RxStorage, for example PouchDB. - - Pouchdb calls its underlying storage adapter - - The storage adapter calls IndexedDB - - The browser runs its internal handling of the IndexedDB API - - In most browsers IndexedDB is implemented on [top of SQLite](https://hackaday.com/2021/08/24/sqlite-on-the-web-absurd-sql/) - - SQLite calls the OS to store the data in the filesystem - -All these layers are abstractions. They are not build for exactly that one use case, so you lose some performance to tunnel the data through the layer itself, and you also lose some performance because the abstraction does not exactly provide the functions that are needed by the layer above and it will overfetch data. - -You will not find a benchmark comparison between how many transactions per second you can run on the browser compared to a server based database. Because it makes no sense to compare them. Browsers are slower, JavaScript is slower. - -> **Is it fast enough?** - -What you really care about is "Is it fast enough?". For most use cases, the answer is `yes`. Offline first apps are UI based and you do not need to process a million transactions per second, because your user will not click the save button that often. "Fast enough" means that the data is processed in under 16 milliseconds so that you can render the updated UI in the next frame. This is of course not true for all use cases, so you better think about the performance limit before starting with the implementation. - -## Nothing is predictable - -You have a PostgreSQL database and run a query over 1000ths of rows, which takes 200 milliseconds. Works great, so you now want to do something similar at the client device in your offline first app. How long does it take? You cannot know because people have different devices, and even equal devices have different things running in the background that slow the CPUs. So you cannot predict performance and as described above, you cannot even predict the storage limit. So if your app does heavy data analytics, you might better run everything on the backend and just send the results to the client. - -## There is no relational data - -I started creating [RxDB](https://github.com/pubkey/rxdb) many years ago and while still maintaining it, I often worked with all these other offline first databases out there. RxDB and all of these other ones, are based on some kind of document databases similar to NoSQL. Often people want to have a relational database like the SQL one they use at the backend. - -So why are there no real relations in offline first databases? I could answer with these arguments like how JavaScript works better with document based data, how performance is better when having no joins or even how NoSQL queries are more composable. But the truth is, everything is NoSQL because it makes replication easy. An SQL query that mutates data in different tables based on some selects and joins, cannot be partially replicated without breaking the client. You have foreign keys that point to other rows and if these rows are not replicated yet, you have a problem. To implement a robust [Sync Engine](./replication.md) for relational data, you need some stuff like a [reliable atomic clock](https://www.theverge.com/2012/11/26/3692392/google-spanner-atomic-clocks-GPS) and you have to block queries over multiple tables while a transaction replicated. [Watch this guy](https://youtu.be/iEFcmfmdh2w?t=607) implementing offline first replication on top of SQLite or read this [discussion](https://github.com/supabase/supabase/discussions/357) about implementing [offline first in supabase](./replication-supabase.md). - -So creating replication for an SQL offline first database is way more work than just adding some network protocols on top of PostgreSQL. It might not even be possible for clients that have no reliable clock. - ---- - -## Electron Database - Storage adapters for SQLite, Filesystem and In-Memory - -# Electron Database - RxDB with different storage for SQLite, Filesystem and In-Memory - -[Electron](https://www.electronjs.org/) (aka Electron.js) is a framework developed by github that is designed to create desktop applications with the Web technology stack consisting of HTML, CSS and JavaScript. -Because the desktop application runs on the client's device, it is suitable to use a database that can store and query data locally. This allows you to create so-called [local first](./offline-first.md) apps that store data locally and even work when the user has no internet connection. -While there are many options to store data in Electron, for complex realtime apps using [RxDB](https://rxdb.info/) is recommended because it is a database made for UI-based client-side application, not a server-side database. - - - -## Databases for Electron - -An Electron runtime can be divided into two parts: -- The "main" process which is a Node.js JavaScript process that runs without a UI in the background. -- One or multiple "renderer" processes that consist of a Chrome browser engine and runs the user interface. Each renderer process represents one "browser tab". - -This is important to understand because choosing the right database depends on your use case and on which of these JavaScript runtimes you want to keep the data. - -### Server Side Databases in Electron.js - -Because Electron runs on a desktop computer, you might think that it should be possible to use a common "server" database like MySQL, PostgreSQL or MongoDB. In theory, you could ship the correct database server binaries with your electron application and start a process on the client's device that exposes a port to the database that can be consumed by Electron. In practice, this is not a viable way to go because shipping the correct binaries and opening ports is way to complicated and troublesome. Instead you should use a database that can be bundled and run **inside** of Electron, either in the *main* or in the *renderer* process. - -### Localstorage / IndexedDB / WebSQL as alternatives to SQLite in Electron - -Because Electron uses a common Chrome web browser in the renderer process, you can access the common Web Storage APIs like [Localstorage](./articles/localstorage.md), IndexedDB and WebSQL. This is easy to set up and storing small sets of data can be achieved in a short span of time. - -But as soon as your application goes beyond a simple todo-app, there are multiple obstacles that come in your way. One thing is the bad multi-tab support. If you have more than one *renderer* process, it becomes hard to manage database writes between them. Each *browser tab* could modify the database state while the others do not know of the changes and keep an outdated UI. - -Another thing is performance. [IndexedDB is slow](./slow-indexeddb.md), mostly because it has to go through layers of browser security and abstractions. Storing and querying a lot of data might become your performance bottleneck. Localstorage and WebSQL are even slower, by the way. Using these Web Storage APIs is generally only recommended when you know for sure that there will be always only **one rendering process** and performance is not that relevant. The main reason for that is the security- and abstraction layers that write- and read operations have to go through when using the browsers IndexedDB API. So instead of using IndexedDB in Electron in the renderer process, you should use something that runs in the "main" process in Node.js like the [Filesystem RxStorage](./rx-storage-filesystem-node.md) or the [In Memory RxStorage](./rx-storage-memory.md). - -### RxDB - - - -[RxDB](https://rxdb.info/) is a NoSQL database for JavaScript applications. It has many features that come in handy when RxDB is used with UI based applications like your Electron app. For example, it is able to subscribe to query results of single fields of documents. It has encryption and compression features and most important it has a battle tested [Sync Engine](./replication.md) that can be used to do a realtime sync with your backend. - -Because of the [flexible storage](https://rxdb.info/rx-storage.html) layer of RxDB, there are many options on how to use it with Electron: - -- The [memory RxStorage](./rx-storage-memory.md) that stores the data inside of the JavaScript memory without persistence -- The [SQLite RxStorage](./rx-storage-sqlite.md) -- The [IndexedDB RxStorage](./rx-storage-indexeddb.md) -- The [LocalStorage RxStorage](./rx-storage-localstorage.md) -- The [Dexie.js RxStorage](./rx-storage-dexie.md) -- The [Node.js Filesystem](./rx-storage-filesystem-node.md) - -It is recommended to use the [SQLite RxStorage](./rx-storage-sqlite.md) because it has the best performance and is the easiest to set up. However it is part of the [👑 Premium Plugins](/premium/) which must be purchased, so to try out RxDB with Electron, you might want to use one of the other options. To start with RxDB, I would recommend using the LocalStorage RxStorage in the renderer processes. Because RxDB is able to broadcast the database state between browser tabs, having multiple renderer processes is not a problem like it would be when you use plain IndexedDB without RxDB. -In production, you would always run the RxStorage in the main process with the [RxStorage Electron IpcRenderer & IpcMain](./electron.md#rxstorage-electron-ipcrenderer--ipcmain) plugins. - -First, you have to install all dependencies via `npm install rxdb rxjs`. -Then you can assemble the RxStorage and create a database with it: - -```ts -import { createRxDatabase } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -// create database -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageLocalstorage() -}); - -// create collections -const collections = await myRxDatabase.addCollections({ - humans: { - /* ... */ - } -}); - -// insert document -await collections.humans.insert({id: 'foo', name: 'bar'}); - -// run a query -const result = await collections.humans.find({ - selector: { - name: 'bar' - } -}).exec(); - -// observe a query -await collections.humans.find({ - selector: { - name: 'bar' - } -}).$.subscribe(result => {/* ... */}); -``` - -For better performance in the renderer tab, you can later switch to the [IndexedDB RxStorage](./rx-storage-indexeddb.md). But in production, it is recommended to use the [SQLite RxStorage](./rx-storage-sqlite.md) or the [Filesystem RxStorage](./rx-storage-filesystem-node.md) in the main process so that database operations do not block the rendering of the UI. -To learn more about using RxDB with Electron, you might want to check out [this example project](https://github.com/pubkey/rxdb/tree/master/examples/electron). - -### SQLite in Electron.js without RxDB - -SQLite is a SQL based relational database written in the C programming language that was crafted to be embedded inside of applications and stores data locally. Operations are written in the SQL query language similar to the PostgreSQL syntax. - -Using SQLite in Electron is not possible in the *renderer process*, only in the *main process*. To communicate data operations between your main and your renderer processes, you have to use either [@electron/remote](https://github.com/electron/remote) (not recommended) or the [ipcRenderer](https://www.electronjs.org/de/docs/latest/api/ipc-renderer) (recommended). So you start up SQLite in your main process and whenever you want to read or write data, you send the SQL queries to the main process and retrieve the result back as JSON data. - -To install SQLite, use the [SQLite3](https://github.com/TryGhost/node-sqlite3) package which is a native Node.js module. You also need the [@electron/rebuild](https://github.com/electron/rebuild) package to rebuild the SQLite module against the currently installed Electron version. - -Install them with `npm install sqlite3 @electron/rebuild`. -Then you can rebuild SQLite with `./node_modules/.bin/electron-rebuild -f -w sqlite3` -In the JavaScript code of your main process you can now create a database: - -```ts -const sqlite3 = require('sqlite3'); -const db = new sqlite3.Database('/path/to/database/file.db'); -// create a table and insert a row -db.serialize(() => { - db.run("CREATE TABLE Users (name, lastName)"); - db.run("INSERT INTO Users VALUES (?, ?)", ['foo', 'bar']); -}); -``` - -Also you have to set up the ipcRenderer so that message from the renderer process are handled: - -```ts -ipcMain.handle('db-query', async (event, sqlQuery) => { - return new Promise(res => { - db.all(sqlQuery, (err, rows) => { - res(rows); - }); - }); -}); -``` -In your renderer process, you can now call the ipcHandler and fetch data from SQLite: - -```ts -const rows = await ipcRenderer.invoke('db-query', "SELECT * FROM Users"); -``` - -The downside of SQLite (or SQL in general) is that it is lacking many features that are handful when using a database together with **UI based** applications. It is not possible to observe queries or document fields and there is no replication method to sync data with a server. This makes SQLite a good solution when you just want to store data on the client or process expensive SQL queries on the server, but it is not suitable for more complex operations like two-way replication, encryption, compression and so on. Also developer helpers like TypeScript type safety are totally out of reach. - - - -## Follow up - -- Learn how to use RxDB as database in electron with the [Quickstart Tutorial](./quickstart.md). -- Check out the [RxDB Electron example](https://github.com/pubkey/rxdb/tree/master/examples/electron) -- There is a followup list of other [client side database alternatives](./alternatives.md) that you can try to use with Electron. - ---- - -## Seamless Electron Storage with RxDB - -# Electron Plugin - -## RxStorage Electron IpcRenderer & IpcMain - -To use RxDB in [electron](./electron-database.md), it is recommended to run the RxStorage in the main process and the RxDatabase in the renderer processes. With the rxdb electron plugin you can create a remote RxStorage and consume it from the renderer process. - -To do this in a convenient way, the RxDB electron plugin provides the helper functions `exposeIpcMainRxStorage` and `getRxStorageIpcRenderer`. -Similar to the [Worker RxStorage](./rx-storage-worker.md), these wrap any other [RxStorage](./rx-storage.md) once in the main process and once in each renderer process. In the renderer you can then use the storage to create a [RxDatabase](./rx-database.md) which communicates with the storage of the main process to store and query data. - -:::note -`nodeIntegration` must be enabled in [Electron](https://www.electronjs.org/docs/latest/api/browser-window#new-browserwindowoptions). -::: - -```ts -// main.js -const { exposeIpcMainRxStorage } = require('rxdb/plugins/electron'); -const { getRxStorageMemory } = require('rxdb/plugins/storage-memory'); -app.on('ready', async function () { - exposeIpcMainRxStorage({ - key: 'main-storage', - storage: getRxStorageMemory(), - ipcMain: electron.ipcMain - }); -}); -``` - -```ts -// renderer.js -const { getRxStorageIpcRenderer } = require('rxdb/plugins/electron'); -const { getRxStorageMemory } = require('rxdb/plugins/storage-memory'); - -const db = await createRxDatabase({ - name, - storage: getRxStorageIpcRenderer({ - key: 'main-storage', - ipcRenderer: electron.ipcRenderer - }) -}); -/* ... */ -``` - -## Related - -- [Comparison of Electron Databases](./electron-database.md) - ---- - -## Encryption - -import {Steps} from '@site/src/components/steps'; - -# 🔒 Encrypted Local Storage with RxDB - - - -The RxDB encryption plugin empowers developers to fortify their applications' data security. It seamlessly integrates with [RxDB](https://rxdb.info/), allowing for the secure storage and retrieval of documents by **encrypting them with a password**. With encryption and decryption processes handled internally, it ensures that sensitive data remains confidential, making it a valuable tool for building robust, privacy-conscious applications. The encryption works on all RxDB supported devices types like the **browser**, **ReactNative** or **Node.js**. - - - -Encrypting client-side stored data in RxDB offers numerous advantages: -- **Enhanced Security**: In the unfortunate event of a user's device being stolen, the encrypted data remains safeguarded on the hard drive, inaccessible without the correct password. -- **Access Control**: You can retain control over stored data by revoking access at any time simply by withholding the password. -- **Tamper proof** Other applications on the device cannot read out the stored data when the password is only kept in the process-specific memory - -## Querying encrypted data - -RxDB handles the encryption and decryption of data internally. This means that when you work with a RxDocument, you can access the properties of the document just like you would with normal, unencrypted data. RxDB automatically decrypts the data for you when you retrieve it, making it transparent to your application code. -This means the encryption works with all [RxStorage](./rx-storage.md) like **SQLite**, **IndexedDB**, **OPFS** and so on. - -However, there's a limitation when it comes to querying encrypted fields. **Encrypted fields cannot be used as operators in queries**. This means you cannot perform queries like "find all documents where the encrypted field equals a certain value." RxDB does not expose the encrypted data in a way that allows direct querying based on the encrypted content. To filter or search for documents based on the contents of encrypted fields, you would need to first decrypt the data and then perform the query, which might not be efficient or practical in some cases. -You could however use the [memory mapped](./rx-storage-memory-mapped.md) RxStorage to replicate the encrypted documents into a non-encrypted in-memory storage and then query them like normal. - -## Password handling -RxDB does not define how you should store or retrieve the encryption password. It only requires you to provide the password on database creation which grants you flexibility in how you manage encryption passwords. -You could ask the user on app-start to insert the password, or you can retrieve the password from your backend on app start (or revoke access by no longer providing the password). - -## Asymmetric encryption - -The encryption plugin itself uses **symmetric encryption** with a password to guarantee best performance when reading and storing data. -It is not able to do **Asymmetric encryption** by itself. If you need Asymmetric encryption with a private/publicKey, it is recommended to encrypted the password itself with the asymmetric keys and store the encrypted password beside the other data. On app-start you can decrypt the password with the private key and use the decrypted password in the RxDB encryption plugin - -## Using the RxDB Encryption Plugins - -RxDB currently has two plugins for encryption: - -- The free `encryption-crypto-js` plugin that is based on the `AES` algorithm of the [crypto-js](https://www.npmjs.com/package/crypto-js) library -- The [👑 premium](/premium/) `encryption-web-crypto` plugin that is based on the native [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) which makes it faster and more secure to use. Document inserts are about 10x faster compared to `crypto-js` and it has a smaller build size because it uses the browsers API instead of bundling an npm module. - -An RxDB encryption plugin is a wrapper around any other [RxStorage](./rx-storage.md). - - - -### Wrap your RxStorage with the encryption - -```ts -import { - wrappedKeyEncryptionCryptoJsStorage -} from 'rxdb/plugins/encryption-crypto-js'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -// wrap the normal storage with the encryption plugin -const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ - storage: getRxStorageLocalstorage() -}); -``` - -### Create a RxDatabase with the wrapped storage - -Also you have to set a **password** when creating the database. The format of the password depends on which encryption plugin is used. - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -// create an encrypted database -const db = await createRxDatabase({ - name: 'mydatabase', - storage: encryptedStorage, - password: 'sudoLetMeIn' -}); -``` - -### Create an RxCollection with an encrypted property - -To define a field as being encrypted, you have to add it to the `encrypted` fields list in the schema. - -```ts -const schema = { - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 - }, - secret: { - type: 'string' - }, - }, - required: ['id'] - encrypted: ['secret'] -}; - -await db.addCollections({ - myDocuments: { - schema - } -}) -``` - - -## Using Web-Crypto API - -For professionals, we have the `web-crypto` [👑 premium](/premium/) plugin which is faster and more secure: - -```ts -import { - wrappedKeyEncryptionWebCryptoStorage, - createPassword -} from 'rxdb-premium/plugins/encryption-web-crypto'; -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; - -// wrap the normal storage with the encryption plugin -const encryptedIndexedDbStorage = wrappedKeyEncryptionWebCryptoStorage({ - storage: getRxStorageIndexedDB() -}); - -const myPasswordObject = { - // Algorithm can be oneOf: 'AES-CTR' | 'AES-CBC' | 'AES-GCM' - algorithm: 'AES-CTR', - password: 'myRandomPasswordWithMin8Length' -}; - -// create an encrypted database -const db = await createRxDatabase({ - name: 'mydatabase', - storage: encryptedIndexedDbStorage, - password: myPasswordObject -}); - -/* ... */ -``` - -## Changing the password - -The password is set database specific and it is not possible to change the password of a database. Opening an existing database with a different password will throw an error. To change the password you can either: -- Use the [storage migration plugin](./migration-storage.md) to migrate the database state into a new database. -- Store a randomly created meta-password in a different RxDatabase as a value of a [local document](./rx-local-document.md). Encrypt the meta password with the actual user password and read it out before creating the actual database. - -## Encrypted attachments - -To store the [attachments](./rx-attachment.md) data encrypted, you have to set `encrypted: true` in the `attachments` property of the schema. - -```ts -const mySchema = { - version: 0, - type: 'object', - properties: { - /* ... */ - }, - attachments: { - encrypted: true // if true, the attachment-data will be encrypted with the db-password - } -}; -``` - -## Encryption and workers - -If you are using [Worker RxStorage](./rx-storage-worker.md) or [SharedWorker RxStorage](./rx-storage-shared-worker.md) with encryption, it's recommended to run encryption inside of the worker. Encryption can be very cpu intensive and would take away CPU-power from the main thread which is the main reason to use workers. - -You do not need to worry about setting the password inside of the worker. The password will be set when calling createRxDatabase from the main thread, and will be passed internally to the storage in the worker automatically. - ---- - -## Error Messages - -# RxDB Error Messages - -When RxDB has an error, an `RxError` object is thrown instead of a normal JavaScript `Error`. This `RxError` contains additional properties such as a `code` field and `parameters`. By default the full human readable error messages are not included into the RxDB build. This is because error messages have a high entropy and cannot be compressed well. Therefore only an error message with the correct error-code and parameters is thrown but without the full text. -When you enable the [DevMode Plugin](./dev-mode.md) the full error messages are added to the `RxError`. This should only be done in development, not in production builds to keep a small build size. - -## All RxDB error messages - -import { ErrorMessages } from '@site/src/components/error-messages'; - - - ---- - -## Fulltext Search 👑 - -# Fulltext Search - -To run fulltext search queries on the local data, RxDB has a fulltext search plugin based on [flexsearch](https://github.com/nextapps-de/flexsearch) and [RxPipeline](./rx-pipeline.md). On each write to a given source [RxCollection](./rx-collection.md), an indexer is running to map the written document data into a fulltext search index. -The index can then be queried efficiently with complex fulltext search operations. - -## Benefits of using a local fulltext search - -1. Efficient Search and Indexing - -The plugin utilizes the [FlexSearch library](https://github.com/nextapps-de/flexsearch), known for its speed and memory efficiency. This ensures that search operations are performed quickly, even with large datasets. The search engine can handle multi-field queries, partial matching, and complex search operations, providing users with highly relevant results. - -2. Local Data Indexing - -With the plugin, all search operations are performed on the local data stored within the RxDB collections. This means that users can execute fulltext search queries without the need for an external server or database, which is especially beneficial for offline-first applications. The local indexing ensures that search queries are executed quickly, reducing the latency typically associated with remote database queries. Also when used in multiple browser tabs, it is ensured that through [Leader Election](./leader-election.md), only exactly one tabs is doing the work of indexing without having an overhead in the other browser tabs. - -3. Real-time Indexing - -The plugin integrates seamlessly with RxDB's reactive nature. Every time a document is written to an [RxCollection](./rx-collection.md), an indexer updates the fulltext search index in real-time. This ensures that search results are always up-to-date, reflecting the most current state of the data without requiring manual reindexing. - -4. Persistent indexing - -The fulltext search index is efficiently persisted within the [RxCollection](./rx-collection.md), ensuring that the index remains intact across app restarts. When documents are added or updated in the collection, the index is incrementally updated in real-time, meaning only the changes are processed rather than reindexing the entire dataset. This incremental approach not only optimizes performance but also ensures that subsequent app launches are quick, as there's no need to reindex all the data from scratch, making the search feature both reliable and fast from the moment the app starts. When using an [encrypted storage](./encryption.md) the index itself and incremental updates to it are stored fully encrypted and are only decrypted in-memory. - -5. Complex Query Support - -The FlexSearch-based plugin allows for [sophisticated search queries](https://github.com/nextapps-de/flexsearch?tab=readme-ov-file#index.search), including multi-term and contextual searches. Users can perform complex searches that go beyond simple keyword matching, enabling more advanced use cases like searching for documents with specific phrases, relevance-based sorting, or even phonetic matching. - -6. Offline-First Support and Privacy - -As RxDB is designed with [offline-first applications](./offline-first.md) in mind, the fulltext search plugin supports this paradigm by ensuring that all search operations can be performed offline. This is crucial for applications that need to function in environments with intermittent or no internet connectivity, offering users a consistent and reliable search experience with [zero latency](./articles/zero-latency-local-first.md). - -## Using the RxDB Fulltext Search - -The flexsearch search is a [RxDB Premium Package 👑](/premium/) which must be purchased and imported from the `rxdb-premium` npm package. - -Step 1: Add the `RxDBFlexSearchPlugin` to RxDB. - -```ts -import { RxDBFlexSearchPlugin } from 'rxdb-premium/plugins/flexsearch'; -import { addRxPlugin } from 'rxdb/plugins/core'; -addRxPlugin(RxDBFlexSearchPlugin); -``` - -Step 2: Create a `RxFulltextSearch` instance on top of a collection with the `addFulltextSearch()` function. - -```ts -import { addFulltextSearch } from 'rxdb-premium/plugins/flexsearch'; -const flexSearch = await addFulltextSearch({ - // unique identifier. Used to store metadata and continue indexing on restarts/reloads. - identifier: 'my-search', - // The source collection on whose documents the search is based on - collection: myRxCollection, - /** - * Transforms the document data to a given searchable string. - * This can be done by returning a single string property of the document - * or even by concatenating and transforming multiple fields like: - * doc => doc.firstName + ' ' + doc.lastName - */ - docToString: doc => doc.firstName, - /** - * (Optional) - * Amount of documents to index at once. - * See https://rxdb.info/rx-pipeline.html - */ - batchSize: number; - /** - * (Optional) - * lazy: Initialize the in memory fulltext index at the first search query. - * instant: Directly initialize so that the index is already there on the first query. - * Default: 'instant' - */ - initialization: 'instant', - /** - * (Optional) - * @link https://github.com/nextapps-de/flexsearch#index-options - */ - indexOptions: {}, -}); -``` - -Step 3: Run a search operation: - -```ts -// find all documents whose searchstring contains "foobar" -const foundDocuments = await flexSearch.find('foobar'); - -/** - * You can also use search options as second parameter - * @link https://github.com/nextapps-de/flexsearch#search-options - */ -const foundDocuments = await flexSearch.find('foobar', { limit: 10 }); -``` - ---- - -## Installation - -# Install RxDB - -## npm - -To install the latest release of `rxdb` and its dependencies and save it to your `package.json`, run: - -`npm i rxdb --save` - -## peer-dependency - -You also need to install the peer-dependency `rxjs` if you have not installed it before. - -`npm i rxjs --save` - -## polyfills - -RxDB is coded with es8 and transpiled to es5\. This means you have to install [polyfills](https://developer.mozilla.org/en-US/docs/Glossary/Polyfill) to support older browsers. For example you can use the babel-polyfills with: - -`npm i @babel/polyfill --save` - -If you need polyfills, you have to import them in your code. - -```typescript -import '@babel/polyfill'; -``` - -## Polyfill the `global` variable - -When you use RxDB with **angular** or other **webpack** based frameworks, you might get the error `Uncaught ReferenceError: global is not defined`. -This is because some dependencies of RxDB assume a Node.js-specific `global` variable that is not added to browser runtimes by some bundlers. -You have to add them by your own, like we do [here](https://github.com/pubkey/rxdb/blob/master/examples/angular/src/polyfills.ts). - -```ts -(window as any).global = window; -(window as any).process = { - env: { DEBUG: undefined }, -}; -``` - -## Project Setup and Configuration - -In the [examples](https://github.com/pubkey/rxdb/tree/master/examples) folder you can find CI tested projects for different frameworks and use cases, while in the [/config](https://github.com/pubkey/rxdb/tree/master/config) folder base configuration files for Webpack, Rollup, Mocha, Karma, Typescript are exposed. - -Consult [package.json](https://github.com/pubkey/rxdb/blob/master/package.json) for the versions of the packages supported. - -## Installing the latest RxDB build - -If you need the latest development state of RxDB, add it as git-dependency into your `package.json`. - -```json - "dependencies": { - "rxdb": "git+https://git@github.com/pubkey/rxdb.git#commitHash" - } -``` - -Replace `commitHash` with the hash of the latest [build-commit](https://github.com/pubkey/rxdb/search?q=build&type=Commits). - -## Import - -To import `rxdb`, add this to your JavaScript file to import the default bundle that contains the RxDB core: - -```typescript -import { - createRxDatabase, - /* ... */ -} from 'rxdb'; -``` - ---- - -## Key Compression - -import {Steps} from '@site/src/components/steps'; - -# Key Compression - -With the key compression plugin, documents will be stored in a compressed format which saves up to 40% disc space. -For compression the npm module [jsonschema-key-compression](https://github.com/pubkey/jsonschema-key-compression) is used. -It compresses json-data based on its json-schema while still having valid json. It works by compressing long attribute-names into smaller ones and backwards. - -The compression and decompression happens internally, so when you work with a `RxDocument`, you can access any property like normal. - -## Enable key compression - -The key compression plugin is a wrapper around any other [RxStorage](./rx-storage.md). - - - -### Wrap your RxStorage with the key compression plugin - -```ts -import { wrappedKeyCompressionStorage } from 'rxdb/plugins/key-compression'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -const storageWithKeyCompression = wrappedKeyCompressionStorage({ - storage: getRxStorageLocalstorage() -}); -``` - -### Create an RxDatabase - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -const db = await createRxDatabase({ - name: 'mydatabase', - storage: storageWithKeyCompression -}); -``` - -### Create a compressed RxCollection - -```ts - -const mySchema = { - keyCompression: true, // set this to true, to enable the keyCompression - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 // <- the primary key must have set maxLength - } - /* ... */ - } -}; -await db.addCollections({ - docs: { - schema: mySchema - } -}); -``` - - - ---- - -## Leader Election - -# Leader-Election - -RxDB comes with a leader-election which elects a leading instance between different instances in the same javascript runtime. -Before you read this, please check out on how many of your open browser-tabs you have opened the same website more than once. Count them, I will wait.. - -So if you would now inspect the traffic that these open tabs produce, you can see that many of them send exact the same data over wire for every tab. No matter if the data is sent with an open websocket or by polling. - -## Use-case-example - -Imagine we have a website which displays the current temperature of the visitors location in various charts, numbers or heatmaps. To always display the live-data, the website opens a websocket to our API-Server which sends the current temperature every 10 seconds. Using the way most sites are currently build, we can now open it in 5 browser-tabs and it will open 5 websockets which send data 6*5=30 times per minute. This will not only waste the power of your clients device, but also wastes your api-servers resources by opening redundant connections. - -## Solution - -The solution to this redundancy is the usage of a [leader-election](https://en.wikipedia.org/wiki/Leader_election)-algorithm which makes sure that always exactly one tab is managing the remote-data-access. The managing tab is the elected leader and stays leader until it is closed. No matter how many tabs are opened or closed, there must be always exactly **one** leader. -You could now start implementing a messaging-system between your browser-tabs, hand out which one is leader, solve conflicts and reassign a new leader when the old one 'dies'. -Or just use RxDB which does all these things for you. - -## Add the leader election plugin - -To enable the leader election, you have to add the `leader-election` plugin. - -```javascript -import { addRxPlugin } from 'rxdb'; -import { RxDBLeaderElectionPlugin } from 'rxdb/plugins/leader-election'; -addRxPlugin(RxDBLeaderElectionPlugin); -``` -## Code-example - -To make it easy, here is an example where the temperature is pulled every ten seconds and saved to a collection. The pulling starts at the moment where the opened tab becomes the leader. - -```javascript -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -const db = await createRxDatabase({ - name: 'weatherDB', - storage: getRxStorageLocalstorage(), - password: 'myPassword', - multiInstance: true -}); - -await db.addCollections({ - temperature: { - schema: mySchema - } -}); - -db.waitForLeadership() - .then(() => { - console.log('Long lives the king!'); // <- runs when db becomes leader - setInterval(async () => { - const temp = await fetch('https://example.com/api/temp/'); - db.temperature.insert({ - degrees: temp, - time: new Date().getTime() - }); - }, 1000 * 10); - }); -``` - -## Handle Duplicate Leaders - -On rare occasions, it can happen that [more than one leader](https://github.com/pubkey/broadcast-channel/blob/master/.github/README.md#handle-duplicate-leaders) is elected. This can happen when the CPU is on 100% or for any other reason the JavaScript process is fully blocked for a long time. -For most cases this is not really problem because on duplicate leaders, both browser tabs replicate with the same backend anyways. -To handle the duplicate leader event, you can access the leader elector and set a handler: - -```ts -import { - getLeaderElectorByBroadcastChannel -} from 'rxdb/plugins/leader-election'; - -const leaderElector = getLeaderElectorByBroadcastChannel(broadcastChannel); -leaderElector.onduplicate = async () => { - // Duplicate leader detected -> reload the page. - location.reload(); -} -``` - -## Live-Example - -In this example the leader is marked with the crown ♛ - - - -## Try it out - -Run the [angular-example](https://github.com/pubkey/rxdb/tree/master/examples/angular) where the leading tab is marked with a crown on the top-right-corner. - -## Notice - -The leader election is implemented via the [broadcast-channel module](https://github.com/pubkey/broadcast-channel#using-the-leaderelection). -The leader is elected between different processes on the same javascript-runtime. Like multiple tabs in the same browser or multiple NodeJs-processes on the same machine. It will not run between different replicated instances. - ---- - -## RxDB Logger Plugin - Track & Optimize - -# RxDB Logger Plugin - -With the logger plugin you can log all operations to the [storage layer](./rx-storage.md) of your [RxDatabase](./rx-database.md). - -This is useful to debug performance problems and for monitoring with Application Performance Monitoring (APM) tools like **Bugsnag**, **Datadog**, **Elastic**, **Sentry** and others. - -Notice that the logger plugin is not part of the RxDB core, it is part of [RxDB Premium 👑](/premium/). - - - -## Using the logger plugin - -The logger is a wrapper that can be wrapped around any [RxStorage](./rx-storage.md). Once your storage is wrapped, you can create your database with the wrapped storage and the logging will automatically happen. - -```ts - -import { - wrappedLoggerStorage -} from 'rxdb-premium/plugins/logger'; -import { - getRxStorageIndexedDB -} from 'rxdb-premium/plugins/storage-indexeddb'; - -// wrap a storage with the logger -const loggingStorage = wrappedLoggerStorage({ - storage: getRxStorageIndexedDB({}) -}); - -// create your database with the wrapped storage -const db = await createRxDatabase({ - name: 'mydatabase', - storage: loggingStorage -}); - -// create collections etc... -``` - -## Specify what to be logged - -By default, the plugin will log all operations and it will also run a `console.time()/console.timeEnd()` around each operation. You can specify what to log so that your logs are less noisy. For this you provide a settings object when calling `wrappedLoggerStorage()`. - -```ts -const loggingStorage = wrappedLoggerStorage({ - storage: getRxStorageIndexedDB({}), - settings: { - // can used to prefix all log strings, default='' - prefix: 'my-prefix', - - /** - * Be default, all settings are true. - */ - - // if true, it will log timings with console.time() and console.timeEnd() - times: true, - - // if false, it will not log meta storage instances like used in replication - metaStorageInstances: true, - - // operations - bulkWrite: true, - findDocumentsById: true, - query: true, - count: true, - info: true, - getAttachmentData: true, - getChangedDocumentsSince: true, - cleanup: true, - close: true, - remove: true - } -}); -``` - -## Using custom logging functions - -With the logger plugin you can also run custom log functions for all operations. - -```ts -const loggingStorage = wrappedLoggerStorage({ - storage: getRxStorageIndexedDB({}), - onOperationStart: (operationsName, logId, args) => void, - onOperationEnd: (operationsName, logId, args) => void, - onOperationError: (operationsName, logId, args, error) => void -}); -``` - ---- - -## Streamlined RxDB Middleware - -# Middleware -RxDB middleware-hooks (also called pre and post hooks) are functions which are passed control during execution of asynchronous functions. -The hooks are specified on RxCollection-level and help to create a clear what-happens-when-structure of your code. - -Hooks can be defined to run **parallel** or as **series** one after another. -Hooks can be **synchronous** or **asynchronous** when they return a `Promise`. -To stop the operation at a specific hook, throw an error. - -## List -RxDB supports the following hooks: -- preInsert -- postInsert -- preSave -- postSave -- preRemove -- postRemove -- postCreate - -### Why is there no validate-hook? -Different to mongoose, the validation on document-data is running on the field-level for every change to a document. -This means if you set the value ```lastName``` of a RxDocument, then the validation will only run on the changed field, not the whole document. -Therefore it is not useful to have validate-hooks when a document is written to the database. - -## Use Cases -Middleware are useful for atomizing model logic and avoiding nested blocks of async code. -Here are some other ideas: - -- complex validation -- removing dependent documents -- asynchronous defaults -- asynchronous tasks that a certain action triggers -- triggering custom events -- notifications - -## Usage -All hooks have the plain data as first parameter, and all but `preInsert` also have the `RxDocument`-instance as second parameter. If you want to modify the data in the hook, change attributes of the first parameter. - -All hook functions are also `this`-bind to the `RxCollection`-instance. - -### Insert -An insert-hook receives the data-object of the new document. - -#### lifecycle -- RxCollection.insert is called -- preInsert series-hooks -- preInsert parallel-hooks -- schema validation runs -- new document is written to database -- postInsert series-hooks -- postInsert parallel-hooks -- event is emitted to RxDatabase and RxCollection - -#### preInsert - -```js -// series -myCollection.preInsert(function(plainData){ - // set age to 50 before saving - plainData.age = 50; -}, false); - -// parallel -myCollection.preInsert(function(plainData){ - -}, true); - -// async -myCollection.preInsert(function(plainData){ - return new Promise(res => setTimeout(res, 100)); -}, false); - -// stop the insert-operation -myCollection.preInsert(function(plainData){ - throw new Error('stop'); -}, false); -``` - -#### postInsert - -```js -// series -myCollection.postInsert(function(plainData, rxDocument){ - -}, false); - -// parallel -myCollection.postInsert(function(plainData, rxDocument){ - -}, true); - -// async -myCollection.postInsert(function(plainData, rxDocument){ - return new Promise(res => setTimeout(res, 100)); -}, false); -``` - -### Save -A save-hook receives the document which is saved. - -#### lifecycle -- RxDocument.save is called -- preSave series-hooks -- preSave parallel-hooks -- updated document is written to database -- postSave series-hooks -- postSave parallel-hooks -- event is emitted to RxDatabase and RxCollection - -#### preSave - -```js -// series -myCollection.preSave(function(plainData, rxDocument){ - // modify anyField before saving - plainData.anyField = 'anyValue'; -}, false); - -// parallel -myCollection.preSave(function(plainData, rxDocument){ - -}, true); - -// async -myCollection.preSave(function(plainData, rxDocument){ - return new Promise(res => setTimeout(res, 100)); -}, false); - -// stop the save-operation -myCollection.preSave(function(plainData, rxDocument){ - throw new Error('stop'); -}, false); -``` - -#### postSave - -```js -// series -myCollection.postSave(function(plainData, rxDocument){ - -}, false); - -// parallel -myCollection.postSave(function(plainData, rxDocument){ - -}, true); - -// async -myCollection.postSave(function(plainData, rxDocument){ - return new Promise(res => setTimeout(res, 100)); -}, false); -``` - -### Remove -An remove-hook receives the document which is removed. - -#### lifecycle -- RxDocument.remove is called -- preRemove series-hooks -- preRemove parallel-hooks -- deleted document is written to database -- postRemove series-hooks -- postRemove parallel-hooks -- event is emitted to RxDatabase and RxCollection - -#### preRemove - -```js -// series -myCollection.preRemove(function(plainData, rxDocument){ - -}, false); - -// parallel -myCollection.preRemove(function(plainData, rxDocument){ - -}, true); - -// async -myCollection.preRemove(function(plainData, rxDocument){ - return new Promise(res => setTimeout(res, 100)); -}, false); - -// stop the remove-operation -myCollection.preRemove(function(plainData, rxDocument){ - throw new Error('stop'); -}, false); -``` - -#### postRemove - -```js -// series -myCollection.postRemove(function(plainData, rxDocument){ - -}, false); - -// parallel -myCollection.postRemove(function(plainData, rxDocument){ - -}, true); - -// async -myCollection.postRemove(function(plainData, rxDocument){ - return new Promise(res => setTimeout(res, 100)); -}, false); -``` - -### postCreate -This hook is called whenever a `RxDocument` is constructed. -You can use `postCreate` to modify every RxDocument-instance of the collection. -This adds a flexible way to add specify behavior to every document. You can also use it to add custom getter/setter to documents. PostCreate-hooks cannot be **asynchronous**. - -```js -myCollection.postCreate(function(plainData, rxDocument){ - Object.defineProperty(rxDocument, 'myField', { - get: () => 'foobar', - }); -}); - -const doc = await myCollection.findOne().exec(); - -console.log(doc.myField); -// 'foobar' -``` - -:::note -This hook does not run on already created or cached documents. Make sure to add `postCreate`-hooks before interacting with the collection. -::: - ---- - -## Seamless Schema Data Migration with RxDB - -# Migrate Database Data on schema changes - -The RxDB Data Migration Plugin helps developers easily update stored data in their apps when they make changes to the data structure by changing the schema of a [RxCollection](./rx-collection.md). This is useful when developers release a new version of the app with a different schema. - -Imagine you have your awesome messenger-app distributed to many users. After a while, you decide that in your new version, you want to change the schema of the messages-collection. Instead of saving the message-date like `2017-02-12T23:03:05+00:00` you want to have the unix-timestamp like `1486940585` to make it easier to compare dates. To accomplish this, you change the schema and **increase the version-number** and you also change your code where you save the incoming messages. But one problem remains: what happens with the messages which are already stored in the database on the user's device in the old schema? - -With RxDB you can provide migrationStrategies for your collections that automatically (or on call) transform your existing data from older to newer schemas. This assures that the client's data always matches your newest code-version. - -# Add the migration plugin - -To enable the data migration, you have to add the `migration-schema` plugin. - -```ts -import { addRxPlugin } from 'rxdb'; -import { RxDBMigrationSchemaPlugin } from 'rxdb/plugins/migration-schema'; -addRxPlugin(RxDBMigrationSchemaPlugin); -``` - -## Providing strategies - -Upon creation of a collection, you have to provide migrationStrategies when your schema's version-number is greater than `0`. To do this, you have to add an object to the `migrationStrategies` property where a function for every schema-version is assigned. A migrationStrategy is a function which gets the old document-data as a parameter and returns the new, transformed document-data. If the strategy returns `null`, the document will be removed instead of migrated. - -```javascript -myDatabase.addCollections({ - messages: { - schema: messageSchemaV1, - migrationStrategies: { - // 1 means, this transforms data from version 0 to version 1 - 1: function(oldDoc){ - oldDoc.time = new Date(oldDoc.time).getTime(); // string to unix - return oldDoc; - } - } - } -}); -``` - -Asynchronous strategies can also be used: - -```javascript -myDatabase.addCollections({ - messages: { - schema: messageSchemaV1, - migrationStrategies: { - 1: function(oldDoc){ - oldDoc.time = new Date(oldDoc.time).getTime(); // string to unix - return oldDoc; - }, - /** - * 2 means, this transforms data from version 1 to version 2 - * this returns a promise which resolves with the new document-data - */ - 2: function(oldDoc){ - // in the new schema (version: 2) we defined 'senderCountry' as required field (string) - // so we must get the country of the message-sender from the server - const coordinates = oldDoc.coordinates; - return fetch('http://myserver.com/api/countryByCoordinates/'+coordinates+'/') - .then(response => { - const response = response.json(); - oldDoc.senderCountry = response; - return oldDoc; - }); - } - } - } -}); -``` - -you can also filter which documents should be migrated: - -```js -myDatabase.addCollections({ - messages: { - schema: messageSchemaV1, - migrationStrategies: { - // 1 means, this transforms data from version 0 to version 1 - 1: function(oldDoc){ - oldDoc.time = new Date(oldDoc.time).getTime(); // string to unix - return oldDoc; - }, - /** - * this removes all documents older then 2017-02-12 - * they will not appear in the new collection - */ - 2: function(oldDoc){ - if(oldDoc.time < 1486940585) return null; - else return oldDoc; - } - } - } -}); -``` - -## autoMigrate - -By default, the migration automatically happens when the collection is created. Calling `RxDatabase.addCollections()` returns only when the migration has finished. -If you have lots of data or the migrationStrategies take a long time, it might be better to start the migration 'by hand' and show the migration-state to the user as a loading-bar. - -```javascript -const messageCol = await myDatabase.addCollections({ - messages: { - schema: messageSchemaV1, - autoMigrate: false, // <- migration will not run at creation - migrationStrategies: { - 1: async function(oldDoc){ - ... - anything that takes very long - ... - return oldDoc; - } - } - } -}); - -// check if migration is needed -const needed = await messageCol.migrationNeeded(); -if(needed === false) { - return; -} - -// start the migration -messageCol.startMigration(10); // 10 is the batch-size, how many docs will run at parallel - -const migrationState = messageCol.getMigrationState(); - -// 'start' the observable -migrationState.$.subscribe({ - next: state => console.dir(state), - error: error => console.error(error), - complete: () => console.log('done') -}); - -// the emitted states look like this: -{ - status: 'RUNNING' // oneOf 'RUNNING' | 'DONE' | 'ERROR' - count: { - total: 50, // amount of documents which must be migrated - handled: 0, // amount of handled docs - percent: 0 // percentage [0-100] - } -} -``` - -If you don't want to show the state to the user, you can also use `.migratePromise()`: - -```js -const migrationPromise = messageCol.migratePromise(10); -await migratePromise; -``` - -## migrationStates() - -`RxDatabase.migrationStates()` returns an `Observable` that emits all migration states of any collection of the database. -Use this when you add collections dynamically and want to show a loading-state of the migrations to the user. - -```js -const allStatesObservable = myDatabase.migrationStates(); -allStatesObservable.subscribe(allStates => { - allStates.forEach(migrationState => { - console.log( - 'migration state of ' + - migrationState.collection.name - ); - }); -}); -``` - -## Migrating attachments - -When you store `RxAttachment`s together with your document, they can also be changed, added or removed while running the migration. -You can do this by mutating the `oldDoc._attachments` property. - -```js -import { createBlob } from 'rxdb'; -const migrationStrategies = { - 1: async function(oldDoc){ - // do nothing with _attachments to keep all attachments and have them in the new collection version. - return oldDoc; - }, - 2: async function(oldDoc){ - // set _attachments to an empty object to delete all existing ones during the migration. - oldDoc._attachments = {}; - return oldDoc; - } - 3: async function(oldDoc){ - // update the data field of a single attachment to change its data. - oldDoc._attachments.myFile.data = await createBlob( - 'my new text', - oldDoc._attachments.myFile.content_type - ); - return oldDoc; - } -} -``` - -## Migration on multi-tab in browsers - -If you use RxDB in a multiInstance environment, like a browser, it will ensure that exactly one tab is running a migration of a collection. -Also the `migrationState.$` events are emitted between browser tabs. - -## Migration and Replication - -If you use any of the [RxReplication](./replication.md) plugins, the migration will also run on the internal replication-state storage. It will migrate all `assumedMasterState` documents -so that after the migration is done, you do not have to re-run the replication from scratch. -RxDB assumes that you run the exact same migration on the servers and the clients. Notice that the replication `pull-checkpoint` will not be migrated. Your backend must be compatible with pull-checkpoints of older versions. - -## Migration should be run on all database instances - -If you have multiple database instances (for example, if you are running replication inside of a [Worker](./rx-storage-worker.md) or [SharedWorker](./rx-storage-shared-worker.md) and have created a database instance inside of the worker), schema migration should be started on all database instances. All instances must know about all migration strategies and any updated schema versions. - ---- - -## Migration Storage - -# Storage Migration - -The storage migration plugin can be used to migrate all data from one existing RxStorage into another. This is useful when: - -- You want to migrate from one [RxStorage](./rx-storage.md) to another one. -- You want to migrate to a new major RxDB version while keeping the previous saved data. This function only works from the previous major version upwards. Do not use it to migrate like rxdb v9 to v14. - - -The storage migration **drops deleted documents** and filters them out during the migration. - -:::warning Do never change the schema while doing a storage migration - -When you migrate between storages, you might want to change the schema in the same process. You should never do that because it will lead to problems afterwards and might make your database unusable. - -When you also want to change your schema, first run the storage migration and afterwards run a normal [schema migration](./migration-schema.md). -::: - -## Usage - -Lets say you want to migrate from [LocalStorage RxStorage](./rx-storage-localstorage.md) to the [IndexedDB RxStorage](./rx-storage-indexeddb.md). - -```ts -import { migrateStorage } from 'rxdb/plugins/migration-storage'; -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; -import { getRxStorageLocalstorage } from 'rxdb-old/plugins/storage-localstorage'; - -// create the new RxDatabase -const db = await createRxDatabase({ - name: dbLocation, - storage: getRxStorageIndexedDB(), - multiInstance: false -}); - -await migrateStorage({ - database: db as any, - /** - * Name of the old database, - * using the storage migration requires that the - * new database has a different name. - */ - oldDatabaseName: 'myOldDatabaseName', - oldStorage: getRxStorageLocalstorage(), // RxStorage of the old database - batchSize: 500, // batch size - parallel: false, // <- true if it should migrate all collections in parallel. False (default) if should migrate in serial - afterMigrateBatch: (input: AfterMigrateBatchHandlerInput) => { - console.log('storage migration: batch processed'); - } -}); -``` - -:::note -Only collections that exist in the new database at the time you call migrateStorage() will have their data migrated. - -- If your old database had collections `['users', 'posts', 'comments']` but your new database only defines `['users', 'posts']`, then only users and posts data will be migrated. -- Any collections missing from the new database will simply be skipped - no data for them will be read or written. - -This allows you to selectively migrate only certain collections if desired, by choosing which collections to define before invoking `migrateStorage()`. -::: - -## Migrate from a previous RxDB major version - -To migrate from a previous RxDB major version, you have to install the 'old' RxDB in the `package.json` - -```json -{ - "dependencies": { - "rxdb-old": "npm:rxdb@14.17.1", - } -} -``` - -Then you can run the migration by providing the old storage: - -```ts -/* ... */ -import { migrateStorage } from 'rxdb/plugins/migration-storage'; -import { getRxStorageLocalstorage } from 'rxdb-old/plugins/storage-localstorage'; // <- import from the old RxDB version - -await migrateStorage({ - database: db as any, - /** - * Name of the old database, - * using the storage migration requires that the - * new database has a different name. - */ - oldDatabaseName: 'myOldDatabaseName', - oldStorage: getRxStorageLocalstorage(), // RxStorage of the old database - batchSize: 500, // batch size - parallel: false, - afterMigrateBatch: (input: AfterMigrateBatchHandlerInput) => { - console.log('storage migration: batch processed'); - } -}); -/* ... */ -``` - -## Disable Version Check on [RxDB Premium 👑](/premium/) - -RxDB Premium has a check in place that ensures that you do not accidentally use the wrong RxDB core and 👑 Premium version together which could break your database state. -This can be a problem during migrations where you have multiple versions of RxDB in use and it will throw the error `Version mismatch detected`. -You can disable that check by importing and running the `disableVersionCheck()` function from RxDB Premium. - -```ts -// RxDB Premium v15 or newer: -import { - disableVersionCheck -} from 'rxdb-premium-old/plugins/shared'; -disableVersionCheck(); - -// RxDB Premium v14: - -// for esm -import { - disableVersionCheck -} from 'rxdb-premium-old/dist/es/shared/version-check.js'; -disableVersionCheck(); - -// for cjs -import { - disableVersionCheck -} from 'rxdb-premium-old/dist/lib/shared/version-check.js'; -disableVersionCheck(); -``` - ---- - -## RxDB - The Real-Time Database for Node.js - -# Node.js Database - -[RxDB](https://rxdb.info) is a fast, reactive realtime NoSQL **database** made for **JavaScript** applications like Websites, hybrid Apps, [Electron-Apps](./electron-database.md), Progressive Web Apps and **Node.js**. While RxDB was initially created to be used with UI applications, it has been matured and optimized to make it useful for pure server-side use cases. It can be used as embedded, local database inside of the Node.js JavaScript process, or it can be used similar to a database server that Node.js can connect to. The [RxStorage](./rx-storage.md) layer makes it possible to switch out the underlying storage engine which makes RxDB a very flexible database that can be optimized for many scenarios. - - - -## Persistent Database - -To get a "normal" database connection where the data is persisted to a file system, the RxDB real time database provides multiple [storage implementations](./rx-storage.md) that work in Node.js. - -The [FoundationDB](./rx-storage-foundationdb.md) storage connects to a [FoundationDB](https://github.com/apple/foundationdb) cluster which itself is just a distributed key-value engine. RxDB adds the NoSQL query-engine, indexes and other features on top of it. -It scales horizontally because you can always add more servers to the FoundationDB cluster to increase the capacity. -Setting up a RxDB database is pretty simple. You import the FoundationDB RxStorage and tell RxDB to use that when calling `createRxDatabase`: - -```typescript -import { createRxDatabase } from 'rxdb'; -import { getRxStorageFoundationDB } from 'rxdb/plugins/storage-foundationdb'; - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageFoundationDB({ - apiVersion: 620, - clusterFile: '/path/to/fdb.cluster' - }) -}); - -// add a collection -await db.addCollections({ - users: { - schema: mySchema - } -}); - -// run a query -const result = await db.users.find({ - selector: { - name: 'foobar' - } -}).exec(); - -``` - -Another alternative storage is the [SQLite RxStorage](./rx-storage-sqlite.md) that stores the data inside of a SQLite filebased database. The SQLite storage is faster than FoundationDB and does not require to set up a cluster or anything because SQLite directly stores and reads the data inside of the filesystem. The downside of that is that it only scales vertically. - -```ts -import { createRxDatabase } from 'rxdb'; -import { - getRxStorageSQLite, - getSQLiteBasicsNode -} from 'rxdb-premium/plugins/storage-sqlite'; -import sqlite3 from 'sqlite3'; -const myRxDatabase = await createRxDatabase({ - name: 'path/to/database/file/foobar.db', - storage: getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsNode(sqlite3) - }) -}); -``` - -Because the SQLite RxStorage is not free and you might not want to set up a FoundationDB cluster, there is also the option to use the [LokiJS RxStorage](./rx-storage-lokijs.md) together with the filesystem adapter. This will store the data as plain json in a file and load everything into memory on startup. This works great for small prototypes but it is not recommended to be used in production. - -```ts -import { createRxDatabase } from 'rxdb'; -const LokiFsStructuredAdapter = require('lokijs/src/loki-fs-structured-adapter.js'); -import { getRxStorageLoki } from 'rxdb/plugins/storage-lokijs'; -import sqlite3 from 'sqlite3'; -const myRxDatabase = await createRxDatabase({ - name: 'path/to/database/file/foobar.db', - storage: getRxStorageLoki({ - adapter: new LokiFsStructuredAdapter() - }) -}); -``` - -Here is a performance comparison chart of the different storages (lower is better): - - - -## RxDB as Node.js In-Memory Database - -One of the easiest way to use RxDB in Node.js is to use the [Memory RxStorage](./rx-storage-memory.md). As the name implies, it stores the data directly **in-memory** of the Node.js JavaScript process. This makes it really fast to read and write data but of course the data is not persisted and will be lost when the nodejs process exits. Often the in-memory option is used when RxDB is used in unit tests because it automatically cleans up everything afterwards. - -```ts -import { createRxDatabase } from 'rxdb'; -import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageMemory() -}); -``` - -Also notice that the [default memory limit](https://medium.com/geekculture/node-js-default-memory-settings-3c0fe8a9ba1) of Node.js is 4gb (might change of newer versions) so for bigger datasets you might want to increase the limit with the `max-old-space-size` flag: - -```bash -# increase the Node.js memory limit to 8GB -node --max-old-space-size=8192 index.js -``` - -## Hybrid In-memory-persistence-synced storage - -If you want to have the performance of an **in-memory database** but require persistency of the data, you can use the [memory-mapped storage](./rx-storage-memory-mapped.md). On database creation it will load all data into the memory and on writes it will first write the data into memory and later also write it to the persistent storage in the background. In the following example the FoundationDB storage is used, but any other RxStorage can be used as persistence layer. - -```typescript -import { createRxDatabase } from 'rxdb'; -import { getRxStorageFoundationDB } from 'rxdb/plugins/storage-foundationdb'; -import { getMemoryMappedRxStorage } from 'rxdb-premium/plugins/storage-memory-mapped'; - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getMemoryMappedRxStorage({ - storage: getRxStorageFoundationDB({ - apiVersion: 620, - clusterFile: '/path/to/fdb.cluster' - }) - }) -}); -``` - -While this approach gives you a database with great performance and persistent, it has two major downsides: -- The database size is limited to the memory size -- Writes can be lost when the Node.js process exists between a write to the memory state and the background persisting. - -## Share database between microservices with RxDB - -Using a local, embedded database in Node.js works great until you have to share the data with another Node.js process or another server at all. -To share the database state with other instances, RxDB provides two different methods. One is [replication](./replication.md) and the other is the [remote RxStorage](./rx-storage-remote.md). -The replication copies over the whole database set to other instances live-replicates all ongoing writes. This has the benefit of scaling better because each of your microservice will run queries on its own copy of the dataset. -Sometimes however you might not want to store the full dataset on each microservice. Then it is better to use the remote RxStorage and connect it to the "main" database. The remote storage will run all operations the main database and return the result to the calling database. - -## Follow up on RxDB+Node.js - -- Check out the [RxDB Nodejs example](https://github.com/pubkey/rxdb/tree/master/examples/node). -- If you haven't done yet, you should start learning about RxDB with the [Quickstart Tutorial](./quickstart.md). -- I created [a list of embedded JavaSCript databases](./alternatives.md) that you will help you to pick a database if you do not want to use RxDB. -- Check out the [MongoDB RxStorage](./rx-storage-mongodb.md) that uses MongoDB for the database connection from your Node.js application and runs the RxDB real time database on top of it. - ---- - -## RxDB NoSQL Performance Tips - -# Performance tips for RxDB and other NoSQL databases - -In this guide, you'll find techniques to improve the performance of RxDB operations and queries. Notice that all your performance optimizations should be done with a correct tracking of the metrics, otherwise you might change stuff into the wrong direction. - -## Use bulk operations - -When you run write operations on multiple documents, make sure you use bulk operations instead of single document operations. - -```ts -// wrong ❌ -for(const docData of dataAr){ - await myCollection.insert(docData); -} - -// right ✔️ -await myCollection.bulkInsert(dataAr); -``` - -## Help the query planner by adding operators that better restrict the index range - -Often on complex queries, RxDB (and other databases) do not pick the optimal index range when querying a result set. -You can add additional restrictive operators to ensure the query runs over a smaller index space and has a better performance. - -Lets see some examples for different query types. - -```ts -/** - * Adding a restrictive operator for an $or query - * so that it better limits the index space for the time-field. - */ -const orQuery = { - selector: { - $or: [ - { - time: { $gt: 1234 }, - }, - { - time: { $eg: 1234 }, - user: { $gt: 'foobar' } - }, - ] - time: { $gte: 1234 } // <- add restrictive operator - } -} - -/** - * Adding a restrictive operator for an $regex query - * so that it better limits the index space for the user-field. - * We know that all matching fields start with 'foo' so we can - * tell the query to use that as lower constraint for the index. - */ -const regexQuery = { - selector: { - user: { - $regex: '^foo(.*)0-9$', // a complex regex with a ^ in the beginning - $gte: 'foo' // <- add restrictive operator - } - } -} - -/** - * Adding a restrictive operator for a query on an enum field. - * so that it better limits the index space for the time-field. - */ - -const enumQuery = { - selector: { - /** - * Here lets assume our status field has the enum type ['idle', 'in-progress', 'done'] - * so our restrictive operator can exclude all documents with 'done' as status. - */ - status: { - $in: { - 'idle', - 'in-progress', - }, - $gt: 'done' // <- add restrictive operator on status - } - } -} -``` - -## Set a specific index - -Sometime the query planner of the database itself has no chance in picking the best index of the possible given indexes. -For queries where performance is very important, you might want to explicitly specify which index must be used. - -```ts -const myQuery = myCollection.find({ - selector: { - /* ... */ - }, - // explicitly specify index - index: [ - 'fieldA', - 'fieldB' - ] - -}); -``` - -## Try different ordering of index fields - -The order of the fields in a compound index is very important for performance. When optimizing index usage, you should try out different orders on the index fields and measure which runs faster. For that it is very important to run tests on real-world data where the distribution of the data is the same as in production. -For example when there is a query on a user collection with an `age` and a `gender` field, it depends if the index `['gender', 'age']` performance better as `['age', 'gender']` based on the distribution of data: - -```ts -const query = myCollection - .findOne({ - selector: { - age: { - $gt: 18 - }, - gender: { - $eq: 'm' - } - }, - /** - * Because the developer knows that 50% of the documents are 'male', - * but only 20% are below age 18, - * it makes sense to enforce using the ['gender', 'age'] index to improve performance. - * This could not be known by the query planer which might have chosen ['age', 'gender'] instead. - */ - index: ['gender', 'age'] - }); -``` - -Notice that RxDB has the [Query Optimizer Plugin](./query-optimizer.md) that can be used to automatically find the best indexes. - -## Make a Query "hot" to reduce load - -Having a query where the up-to-date result set is needed more than once, you might want to make the query "hot" by permanently subscribing to it. This ensures that the query result is kept up to date by RxDB ant the [EventReduce algorithm](https://github.com/pubkey/event-reduce) at any time so that at the moment you need the current results, it has them already. - -For example when you use RxDB at Node.js for a webserver, you should use an outer "hot" query instead of running the same query again on every request to a route. - -```ts -// wrong ❌ -app.get('/list', (req, res) => { - const result = await myCollection.find({/* ... */}).exec(); - res.send(JSON.stringify(result)); -}); - -// right ✔️ -const query = myCollection.find({/* ... */}); -query.subscribe(); // <- make it hot - -app.get('/list', (req, res) => { - const result = await query.exec(); - res.send(JSON.stringify(result)); -}); -``` - -## Store parts of your document data as attachment - -For in-app databases like RxDB, it does not make sense to partially parse the `JSON` of a document. Instead, always the whole document json is parsed and handled. This has a better performance because `JSON.parse()` in JavaScript directly calls a C++ binding which can parse really fast compared to a partial parsing in JavaScript itself. Also by always having the full document, RxDB can de-duplicate memory caches of document across multiple queries. - -The downside is that very very big documents with a complex structure can increase query time significantly. Documents fields with complex that are mostly not in use, can be move into an [attachment](./rx-attachment.md). This would lead RxDB to not fetch the attachment data each time the document is loaded from disc. Instead only when explicitly asked for. - -```ts -const myDocument = await myCollection.insert({/* ... */}); -const attachment = await myDocument.putAttachment( - { - id: 'otherStuff.json', - data: createBlob(JSON.stringify({/* ... */}), 'application/json'), - type: 'application/json' - } -); -``` - -## Process queries in a worker process - -Moving database storage into a WebWorker can significantly improve performance in web applications that use RxDB or similar NoSQL databases. When database operations are executed in the main JavaScript thread, they can block or slow down the User Interface, especially during heavy or complex data operations. By offloading these operations to a WebWorker, you effectively separate the data processing workload from the UI thread. This means the main thread remains free to handle user interactions and render updates without delay, leading to a smoother and more responsive user experience. Additionally, WebWorkers allow for parallel data processing, which can expedite tasks like querying and indexing. This approach not only enhances UI responsiveness but also optimizes overall application performance by leveraging the multi-threading capabilities of modern browsers. -With RxDB you can use the [Worker](./rx-storage-worker.md) and [SharedWorker](./rx-storage-shared-worker.md) plugin to move the query processing away from the main thread. - -## Use less plugins and hooks - -Utilizing fewer [hooks](./middleware.md) and plugins in RxDB or similar NoSQL database systems can lead to markedly better performance. Each additional hook or plugin introduces extra layers of processing and potential overhead, which can cumulatively slow down database operations. These extensions often execute additional code or enforce extra checks with each operation, such as insertions, updates, or deletions. While they can provide valuable functionalities or custom behaviors, their overuse can inadvertently increase the complexity and execution time of basic database operations. By minimizing their use and only employing essential hooks and plugins, the system can operate more efficiently. This streamlined approach reduces the computational burden on each transaction, leading to faster response times and a more efficient overall data handling process, especially critical in high-load or real-time applications where performance is paramount. - ---- - -## Local First / Offline First - - -Local-First (aka offline first) is a software paradigm where the software stores data locally at the clients device and must work as well offline as it does online. -To implement this, you have to store data at the client side, so that your application can still access it when the internet goes away. -This can be either done with complex caching strategies, or by using an local-first, [offline database](./articles/offline-database.md) (like [RxDB](https://rxdb.info)) that stores the data inside of a local database like [IndexedDB](./rx-storage-indexeddb.md) and replicates it from and to the backend in the background. This makes the local database, not the server, the gateway for all persistent changes in application state. - -> **Offline first is not about having no internet connection** - -:::note -I wrote a follow-up version of offline/first local first about [Why Local-First Is the Future and what are Its Limitations](./articles/local-first-future.md) -::: - -While in the past, internet connection was an unstable, things are changing especially for mobile devices. -Mobile networks become better and having no internet becomes less common even in remote locations. -So if we did not care about offline first applications in the past, why should we even care now? -In the following I will point out why offline first applications are better, not because they support offline usage, but because of other reasons. - -
    - - - -
    - -## UX is better without loading spinners - -In 'normal' web applications, most user interactions like fetching, saving or deleting data, correspond to a request to the backend server. This means that each of these interactions require the user to await the unknown latency to and from a remote server while looking at a loading spinner. -In offline-first apps, the operations go directly against the local storage which happens almost instantly. There is no perceptible loading time and so it is not even necessary to implement a loading spinner at all. As soon as the user clicks, the UI represents the new state as if it was already changed in the backend. - - - -## Multi-tab usage just works - -Many, even big websites like amazon, reddit and stack overflow do not handle multi tab usage correctly. When a user has multiple tabs of the website open and does a login on one of these tabs, the state does not change on the other tabs. -On offline first applications, there is always exactly one state of the data across all tabs. Offline first databases (like RxDB) store the data inside of IndexedDb and **share the state** between all tabs of the same origin. - - - -## Latency is more important than bandwidth - -In the past, often the bandwidth was the limiting factor on determining the loading time of an application. -But while bandwidth has improved over the years, latency became the limiting factor. -You can always increase the bandwidth by setting up more cables or sending more Starlink satellites to space. -But reducing the latency is not so easy. It is defined by the physical properties of the transfer medium, the speed of light and the distance to the server. All of these three are hard to optimize. - -Offline first application benefit from that because sending the initial state to the client can be done much faster with more bandwidth. And once the data is there, we do no longer have to care about the latency to the backend server because you can run near [zero](./articles/zero-latency-local-first.md) latency queries locally. - - - -## Realtime comes for free - -Most websites lie to their users. They do not lie because they display wrong data, but because they display **old data** that was loaded from the backend at the time the user opened the site. -To overcome this, you could build a realtime website where you create a websocket that streams updates from the backend to the client. This means work. Your client needs to tell the server which page is currently opened and which updates the client is interested to. Then the server can push updates over the websocket and you can update the UI accordingly. - -With offline first applications, you already have a realtime replication with the backend. Most offline first databases provide some concept of changestream or data subscriptions and with [RxDB](https://github.com/pubkey/rxdb) you can even directly subscribe to query results or single fields of documents. This makes it easy to have an always updated UI whenever data on the backend changes. - - - -## Scales with data size, not with the amount of user interaction - -On normal applications, each user interaction can result in multiple requests to the backend server which increase its load. -The more users interact with your application, the more backend resources you have to provide. - -Offline first applications do not scale up with the amount of user actions but instead they scale up with the amount of data. -Once that data is transferred to the client, the user can do as many interactions with it as required without connecting to the server. - -## Modern apps have longer runtimes - -In the past you used websites only for a short time. You open it, perform some action and then close it again. This made the first load time the important metric when evaluating page speed. -Today web applications have changed and with it the way we use them. Single page applications are opened once and then used over the whole day. Chat apps, email clients, PWAs and hybrid apps. All of these were made to have long runtimes. -This makes the time for user interactions more important than the initial loading time. Offline first applications benefit from that because there is often no loading time on user actions while loading the initial state to the client is not that relevant. - -## You might not need REST - -On normal web applications, you make different requests for each kind of data interaction. -For that you have to define a swagger route, implement a route handler on the backend and create some client code to send or fetch data from that route. The more complex your application becomes, the more REST routes you have to maintain and implement. - -With offline first apps, you have a way to hack around all this cumbersome work. You just replicate the whole state from the server to the client. The replication does not only run once, you have a **realtime replication** and all changes at one side are automatically there on the other side. On the client, you can access every piece of state with a simple database query. -While this of course only works for amounts of data that the client can load and store, it makes implementing prototypes and simple apps much faster. - -## You might not need Redux - -Data is hard, especially for UI applications where many things can happen at the same time. -The user is clicking around. Stuff is loaded from the server. All of these things interact with the global state of the app. -To manage this complexity it is common to use state management libraries like Redux or MobX. With them, you write all this lasagna code to wrap the mutation of data and to make the UI react to all these changes. - -On offline first apps, your global state is already there in a single place stored inside of the local database. -You do not have to care whether this data came from the UI, another tab, the backend or another device of the same user. You can just make writes to the database and fetch data out of it. - -## Follow up - -- Learn how to store and query data with RxDB in the [RxDB Quickstart](./quickstart.md) -- [Downsides of Offline First](./downsides-of-offline-first.md) -- I wrote a follow-up version of offline/first local first about [Why Local-First Is the Future and what are Its Limitations](./articles/local-first-future.md) - ---- - -## ORM - -# Object-Data-Relational-Mapping - -Like [mongoose](http://mongoosejs.com/docs/guide.html#methods), RxDB has ORM-capabilities which can be used to add specific behavior to documents and collections. - -## statics - -Statics are defined collection-wide and can be called on the collection. - -### Add statics to a collection - -To add static functions, pass a `statics`-object when you create your collection. The object contains functions, mapped to their function-names. - -```javascript -const heroes = await myDatabase.addCollections({ - heroes: { - schema: mySchema, - statics: { - scream: function(){ - return 'AAAH!!'; - } - } - } -}); - -console.log(heroes.scream()); -// 'AAAH!!' -``` - -You can also use the this-keyword which resolves to the collection: - -```javascript -const heroes = await myDatabase.addCollections({ - heroes: { - schema: mySchema, - statics: { - whoAmI: function(){ - return this.name; - } - } - } -}); -console.log(heroes.whoAmI()); -// 'heroes' -``` - -## instance-methods - -Instance-methods are defined collection-wide. They can be called on the RxDocuments of the collection. - -### Add instance-methods to a collection - -```javascript -const heroes = await myDatabase.addCollections({ - heroes: { - schema: mySchema, - methods: { - scream: function(){ - return 'AAAH!!'; - } - } - } -}); -const doc = await heroes.findOne().exec(); -console.log(doc.scream()); -// 'AAAH!!' -``` - -Here you can also use the this-keyword: - -```javascript -const heroes = await myDatabase.addCollections({ - heroes: { - schema: mySchema, - methods: { - whoAmI: function(){ - return 'I am ' + this.name + '!!'; - } - } - } -}); -await heroes.insert({ - name: 'Skeletor' -}); -const doc = await heroes.findOne().exec(); -console.log(doc.whoAmI()); -// 'I am Skeletor!!' -``` - -## attachment-methods - -Attachment-methods are defined collection-wide. They can be called on the RxAttachments of the RxDocuments of the collection. - -```javascript -const heroes = await myDatabase.addCollections({ - heroes: { - schema: mySchema, - attachments: { - scream: function(){ - return 'AAAH!!'; - } - } - } -}); -const doc = await heroes.findOne().exec(); -const attachment = await doc.putAttachment({ - id: 'cat.txt', - data: 'meow I am a kitty', - type: 'text/plain' -}); -console.log(attachment.scream()); -// 'AAAH!!' -``` - ---- - -## RxDB Docs - -import { Overview } from '@site/src/components/overview'; - -# RxDB Documentation - - - ---- - -## Creating Plugins - - -Creating your own plugin is very simple. A plugin is basically a javascript-object which overwrites or extends RxDB's internal classes, prototypes, and hooks. - -A basic plugin: - -```javascript - -const myPlugin = { - rxdb: true, // this must be true so rxdb knows that this is a rxdb-plugin - /** - * (optional) init() method - * that is called when the plugin is added to RxDB for the first time. - */ - init() { - // import other plugins or initialize stuff - }, - /** - * every value in this object can manipulate the prototype of the keynames class - * You can manipulate every prototype in this list: - * @link https://github.com/pubkey/rxdb/blob/master/src/plugin.ts#L22 - */ - prototypes: { - /** - * add a function to RxCollection so you can call 'myCollection.hello()' - * - * @param {object} prototype of RxCollection - */ - RxCollection: (proto) => { - proto.hello = function() { - return 'world'; - }; - } - }, - /** - * some methods are static and can be overwritten in the overwritable-object - */ - overwritable: { - validatePassword: function(password) { - if (password && typeof password !== 'string' || password.length < 10) - throw new TypeError('password is not valid'); - } - }, - /** - * you can add hooks to the hook-list - */ - hooks: { - /** - * add a `foo` property to each document. You can then call myDocument.foo (='bar') - */ - createRxDocument: { - /** - * You can either add the hook running 'before' or 'after' - * the hooks of other plugins. - */ - after: function(doc) { - doc.foo = 'bar'; - } - } - } -}; - -// now you can import the plugin into rxdb -addRxPlugin(myPlugin); -``` - -# Properties - -## rxdb - -The `rxdb`-property signals that this plugin is an rxdb-plugin. The value should always be `true`. - -## prototypes - -The `prototypes`-property contains a function for each of RxDB's internal prototype that you want to manipulate. Each function gets the prototype-object of the corresponding class as parameter and then can modify it. You can see a list of all available prototypes [here](https://github.com/pubkey/rxdb/blob/master/src/plugin.ts) - -## overwritable - -Some of RxDB's functions are not inside of a class-prototype but are static. You can set and overwrite them with the `overwritable`-object. You can see a list of all overwritables [here](https://github.com/pubkey/rxdb/blob/master/src/overwritable.ts). - -# hooks - -Sometimes you don't want to overwrite an existing RxDB-method, but extend it. You can do this by adding hooks which will be called each time the code jumps into the hooks corresponding call. You can find a list of all hooks [here](https://github.com/pubkey/rxdb/blob/master/src/hooks.ts). - -# options - -RxDatabase and RxCollection have an additional options-parameter, which can be filled with any data required be the plugin. - -```javascript -const collection = myDatabase.addCollections({ - foo: { - schema: mySchema, - options: { // anything can be passed into the options - foo: ()=>'bar' - } - } -}) - -// Afterwards you can use these options in your plugin. - -collection.options.foo(); // 'bar' -``` - ---- - -## Populate and Link Docs in RxDB - -# Population - -There are no joins in RxDB but sometimes we still want references to documents in other collections. This is where population comes in. You can specify a relation from one RxDocument to another RxDocument in the same or another RxCollection of the same database. -Then you can get the referenced document with the population-getter. - -This works exactly like population with [mongoose](http://mongoosejs.com/docs/populate.html). - -## Schema with ref - -The `ref`-keyword in properties describes to which collection the field-value belongs to (has a relationship). - -```javascript -export const refHuman = { - title: 'human related to other human', - version: 0, - primaryKey: 'name', - properties: { - name: { - type: 'string' - }, - bestFriend: { - ref: 'human', // refers to collection human - type: 'string' // ref-values must always be string or ['string','null'] (primary of foreign RxDocument) - } - } -}; -``` - -You can also have a one-to-many reference by using a string-array. - -```js -export const schemaWithOneToManyReference = { - version: 0, - primaryKey: 'name', - type: 'object', - properties: { - name: { - type: 'string' - }, - friends: { - type: 'array', - ref: 'human', - items: { - type: 'string' - } - } - } -}; -``` - -## populate() - -### via method -To get the referred RxDocument, you can use the populate()-method. -It takes the field-path as attribute and returns a Promise which resolves to the foreign document or null if not found. - -```javascript -await humansCollection.insert({ - name: 'Alice', - bestFriend: 'Carol' -}); -await humansCollection.insert({ - name: 'Bob', - bestFriend: 'Alice' -}); -const doc = await humansCollection.findOne('Bob').exec(); -const bestFriend = await doc.populate('bestFriend'); -console.dir(bestFriend); //> RxDocument[Alice] -``` - -### via getter -You can also get the populated RxDocument with the direct getter. Therefore you have to add an underscore suffix `_` to the fieldname. -This works also on nested values. - -```javascript -await humansCollection.insert({ - name: 'Alice', - bestFriend: 'Carol' -}); -await humansCollection.insert({ - name: 'Bob', - bestFriend: 'Alice' -}); -const doc = await humansCollection.findOne('Bob').exec(); -const bestFriend = await doc.bestFriend_; // notice the underscore_ -console.dir(bestFriend); //> RxDocument[Alice] -``` - -## Example with nested reference - -```javascript -const myCollection = await myDatabase.addCollections({ - human: { - schema: { - version: 0, - type: 'object', - properties: { - name: { - type: 'string' - }, - family: { - type: 'object', - properties: { - mother: { - type: 'string', - ref: 'human' - } - } - } - } - } - } -}); - -const mother = await myDocument.family.mother_; -console.dir(mother); //> RxDocument -``` - -## Example with array - -```javascript -const myCollection = await myDatabase.addCollections({ - human: { - schema: { - version: 0, - type: 'object', - properties: { - name: { - type: 'string' - }, - friends: { - type: 'array', - ref: 'human', - items: { - type: 'string' - } - } - } - } - } -}); - -//[insert other humans here] - -await myCollection.insert({ - name: 'Alice', - friends: [ - 'Bob', - 'Carol', - 'Dave' - ] -}); - -const doc = await humansCollection.findOne('Alice').exec(); -const friends = await myDocument.friends_; -console.dir(friends); //> Array. -``` - ---- - -## Efficient RxDB Queries via Query Cache - -# QueryCache - -RxDB uses a `QueryCache` which optimizes the reuse of queries at runtime. This makes sense especially when RxDB is used in UI-applications where people move for- and backwards on different routes or pages and the same queries are used many times. Because of the [event-reduce algorithm](https://github.com/pubkey/event-reduce) cached queries are even valuable for optimization, when changes to the database occur between now and the last execution. - -## Cache Replacement Policy - -To not let RxDB fill up all the memory, a `cache replacement policy` is defined that clears up the cached queries. This is implemented as a function which runs regularly, depending on when queries are created and the database is idle. The default policy should be good enough for most use cases but defining custom ones can also make sense. - -## The default policy - -The default policy starts cleaning up queries depending on how much queries are in the cache and how much document data they contain. - -* It will never uncache queries that have subscribers to their results -* It tries to always have less than 100 queries without subscriptions in the cache. -* It prefers to uncache queries that have never executed and are older than 30 seconds -* It prefers to uncache queries that have not been used for longer time - -## Other references to queries - -With JavaScript, it is not possible to count references to variables. Therefore it might happen that an uncached `RxQuery` is still referenced by the users code and used to get results. This should never be a problem, uncached queries must still work. Creating the same query again however, will result in having two `RxQuery` instances instead of one. - -## Using a custom policy - -A cache replacement policy is a normal JavaScript function according to the type `RxCacheReplacementPolicy`. -It gets the `RxCollection` as first parameter and the `QueryCache` as second. Then it iterates over the cached `RxQuery` instances and uncaches the desired ones with `uncacheRxQuery(rxQuery)`. When you create your custom policy, you should have a look at the [default](https://github.com/pubkey/rxdb/blob/master/src/query-cache.ts). - -To apply a custom policy to a `RxCollection`, add the function as attribute `cacheReplacementPolicy`. - -```ts -const collection = await myDatabase.addCollections({ - humans: { - schema: mySchema, - cacheReplacementPolicy: function(){ /* ... */ } - } -}); -``` - ---- - -## Optimize Client-Side Queries with RxDB - -# Query Optimizer - -The query optimizer can be used to determine which index is the best to use for a given query. -Because RxDB is used in client side applications, it cannot do any background checks or measurements to optimize the query plan because that would cause significant performance problems. - -:::note -The query optimizer is part of the [RxDB Premium 👑](/premium/) plugin that must be purchased. It is not part of the default RxDB module. -::: - -## Usage - -```ts -import { - findBestIndex -} from 'rxdb-premium/plugins/query-optimizer'; - -import { - getRxStorageIndexedDB -} from 'rxdb-premium/plugins/indexeddb'; - -const bestIndexes = await findBestIndex({ - schema: myRxJsonSchema, - /** - * In this example we use the IndexedDB RxStorage, - * but any other storage can be used for testing. - */ - storage: getRxStorageIndexedDB(), - /** - * Multiple queries can be optimized at the same time - * which decreases the overall runtime. - */ - queries: { - /** - * Queries can be mapped by a query id, - * here we use myFirstQuery as query id. - */ - myFirstQuery: { - selector: { - age: { - $gt: 10 - } - }, - }, - mySecondQuery: { - selector: { - age: { - $gt: 10 - }, - lastName: { - $eq: 'Nakamoto' - } - }, - } - }, - testData: [/** data for the documents. **/] -}); - -``` - -## Important details - -- This is a build time tool. You should use it to find the best indexes for your queries during **build time**. Then you store these results and you application can use the best indexes during **run time**. - -- It makes no sense to run time optimization with a different `RxStorage` (+settings) that what you use in production. The result of the query optimizer is heavily dependent on the RxStorage and JavaScript runtime. For example it makes no sense to run the optimization in Node.js and then use the optimized indexes in the browser. - -- It is very important that you use **production like** `testData`. Finding the best index heavily depends on data distribution and amount of stored/queried documents. For example if you store and query users with an `age` field, it makes no sense to just use a random number for the age because in production the `age` of your users is not equally distributed. - -- The higher you set `runs`, the more test cycles will be performed and the more **significant** will be the time measurements which leads to a better index selection. - ---- - -## 🚀 Quickstart - -import {Steps} from '@site/src/components/steps'; -import {TriggerEvent} from '@site/src/components/trigger-event'; -import {Tabs} from '@site/src/components/tabs'; -import {NavbarDropdownSyncList} from '@site/src/components/navbar-dropdowns'; - - - -# RxDB Quickstart - -Welcome to the RxDB Quickstart. Here we'll learn how to create a simple real-time app with the RxDB database that is able to store and query data persistently in a browser and does realtime updates to the UI on changes. - -
    - - - -
    - - - -### Installation -Install the RxDB library and the RxJS dependency: - -```bash -npm install rxdb rxjs -``` - -### Pick a Storage - -RxDB is able to run in a wide range of JavaScript runtimes like browsers, mobile apps, desktop and servers. Therefore different storage engines exist that ensure the best performance depending on where RxDB is used. - - - -#### LocalStorage - -Use this for the simplest browser setup and very small datasets. It has a tiny bundle size and works anywhere [localStorage](./articles/localstorage.md) is available, but is not optimized for large data or heavy writes. - -```ts -import { - getRxStorageLocalstorage -} from 'rxdb/plugins/storage-localstorage'; - -let storage = getRxStorageLocalstorage(); -``` - -#### IndexedDB 👑 - -The premium [IndexedDB storage](./rx-storage-indexeddb.md) is a high-performance, browser-native storage with a smaller bundle and faster startup compared to Dexie-based IndexedDB. Recommended when you have [👑 premium](/premium/) access and care about performance and bundle size. - -```ts -import { - getRxStorageIndexedDB -} from 'rxdb-premium/plugins/storage-indexeddb'; - -let storage = getRxStorageDexie(); -``` - -#### Dexie.js - -[Dexie.js](./rx-storage-dexie.md) is a friendly wrapper around IndexedDB and is a great default for browser apps when you don’t use premium. It’s reliable, works well for medium-sized datasets, and is free to use. - -```ts -import { - getRxStorageDexie -} from 'rxdb/plugins/storage-dexie'; - -let storage = getRxStorageDexie(); -``` - -#### SQLite - -[SQLite](./rx-storage-sqlite.md) is ideal for React Native, Capacitor, Electron, Node.js and other hybrid or native environments. It gives you a fast, durable database on disk. Use the 👑 premium storage for production; a trial version exists for quick experimentation. - -**Premium SQLite (Node.js example)** - -```ts -import { - getRxStorageSQLite, - getSQLiteBasicsNode -} from 'rxdb-premium/plugins/storage-sqlite'; - -// Provide the sqliteBasics adapter for your runtime, e.g. Node.js, React Native, etc. -// For example in Node.js you would derive sqliteBasics from a sqlite3-compatible library: -import sqlite3 from 'sqlite3'; - -const storage = getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsNode(sqlite3) -}); -``` - -**SQLite trial storage (Node.js, free)** - -```ts -import { - getRxStorageSQLiteTrial, - getSQLiteBasicsNodeNative -} from 'rxdb/plugins/storage-sqlite'; -import { DatabaseSync } from 'node:sqlite'; - -const storage = getRxStorageSQLiteTrial({ -sqliteBasics: getSQLiteBasicsNodeNative(DatabaseSync) -}); -``` - -#### And more... - -There are many more storages such as [MongoDB](./rx-storage-mongodb.md), [DenoKV](./rx-storage-denokv.md), [Filesystem](./rx-storage-filesystem-node.md), [Memory](./rx-storage-memory.md), [Memory-Mapped](./rx-storage-memory-mapped.md), [FoundationDB](./rx-storage-foundationdb.md) and more. [Browse the full list of storages](/rx-storage.html). - - - -
    - Which storage should I use? - - RxDB provides a wide range of storages depending on your JavaScript runtime and performance needs. - - In the Browser: Use the LocalStorage storage for simple setup and small build size. For bigger datasets, use either the dexie.js storage (free) or the IndexedDB RxStorage if you have 👑 premium access which is a bit faster and has a smaller build size. - In Electron and ReactNative: Use the SQLite RxStorage if you have 👑 premium access or the trial-SQLite RxStorage for tryouts. - In Capacitor: Use the SQLite RxStorage if you have 👑 premium access, otherwise use the localStorage storage. - - -
    - -### Dev-Mode - -When you use RxDB in development, you should always enable the [dev-mode plugin](./dev-mode.md), which adds helpful checks and validations, and tells you if you do something wrong. - -```ts -import { addRxPlugin } from 'rxdb/plugins/core'; -import { RxDBDevModePlugin } from 'rxdb/plugins/dev-mode'; - -addRxPlugin(RxDBDevModePlugin); -``` - -### Schema Validation - -[Schema validation](./schema-validation.md) is required when using dev-mode and recommended (but optional) in production. Wrap your storage with the AJV schema validator to ensure all documents match your schema before being saved. - -```ts -import { wrappedValidateAjvStorage } from 'rxdb/plugins/validate-ajv'; - -storage = wrappedValidateAjvStorage({ storage }); -``` - -### Create a Database - -A database is the top‑level container in RxDB, responsible for managing collections, coordinating persistence, and providing reactive change streams. - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; - -const myDatabase = await createRxDatabase({ - name: 'mydatabase', - storage: storage -}); -``` - -### Add a Collection - -An RxDatabase contains [RxCollection](./rx-collection.md)s for storing and querying data. A collection is similar to an SQL table, and individual records are stored in the collection as JSON documents. An [RxDatabase](./rx-database.md) can have as many collections as you need. -Add a collection with a [schema](./rx-schema.md) to the database: - -```ts -await myDatabase.addCollections({ - // name of the collection - todos: { - // we use the JSON-schema standard - schema: { - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 // <- the primary key must have maxLength - }, - name: { - type: 'string' - }, - done: { - type: 'boolean' - }, - timestamp: { - type: 'string', - format: 'date-time' - } - }, - required: ['id', 'name', 'done', 'timestamp'] - } - } -}); -``` - -### Insert a document - -Now that we have an RxCollection we can store some [documents](./rx-document.md) in it. - -```ts -const myDocument = await myDatabase.todos.insert({ - id: 'todo1', - name: 'Learn RxDB', - done: false, - timestamp: new Date().toISOString() -}); -``` - -### Run a Query - -Execute a [query](./rx-query.md) that returns all found documents once: - -```ts -const foundDocuments = await myDatabase.todos.find({ - selector: { - done: { - $eq: false - } - } -}).exec(); -``` - -### Update a Document - -In the first found document, set `done` to `true`: - -```ts -const firstDocument = foundDocuments[0]; -await firstDocument.patch({ - done: true -}); -``` - -### Delete a document - -Delete the document so that it can no longer be found in queries: - -```ts -await firstDocument.remove(); -``` - -### Observe a Query - -Subscribe to data changes so that your UI is always up-to-date with the data stored on disk. RxDB allows you to subscribe to data changes even when the change happens in another part of your application, another browser tab, or during database [replication/synchronization](./replication.md): - -```ts -const observable = myDatabase.todos.find({ - selector: { - done: { - $eq: false - } - } -}).$ // get the observable via RxQuery.$; -observable.subscribe(notDoneDocs => { - console.log('Currently have ' + notDoneDocs.length + ' things to do'); - // -> here you would re-render your app to show the updated document list -}); -``` - -### Observe a Document value - -You can also subscribe to the fields of a single RxDocument. Add the `$` sign to the desired field and then subscribe to the returned observable. - -```ts -myDocument.done$.subscribe(isDone => { - console.log('done: ' + isDone); -}); -``` - -### Sync the Client - -RxDB has multiple [replication plugins](./replication.md) to replicate database state with a server. - - - -#### HTTP - -```ts -import { - replicateHTTP, - pullQueryBuilderFromRxSchema, -} from "rxdb/plugins/replication-http"; - -replicateHTTP({ - collection: db.todos, - push: { - handler: async (rows) => { - return fetch("https:/example.com/api/todos/push", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(rows), - }).then((res) => res.json()); - }, - }, - - pull: { - handler: async (lastCheckpoint) => { - return fetch( - "https://example.com/api/todos/pull?" + - new URLSearchParams({ - checkpoint: JSON.stringify(lastCheckpoint) - }), - ).then((res) => res.json()); - }, - }, -}); -``` - -#### GraphQL - -```ts -import { replicateGraphQL } from 'rxdb/plugins/replication-graphql'; - -replicateGraphQL({ - collection: db.todos, - url: 'https://example.com/graphql', - push: { batchSize: 50 }, - pull: { batchSize: 50 } -}); -``` - -#### WebRTC (P2P) - -The easiest way to replicate data between your clients' devices is the [WebRTC replication plugin](./replication-webrtc.md) that replicates data between devices without a centralized server. This makes it easy to try out replication without having to host anything: - -```ts -import { - replicateWebRTC, - getConnectionHandlerSimplePeer -} from 'rxdb/plugins/replication-webrtc'; -replicateWebRTC({ - collection: myDatabase.todos, - connectionHandlerCreator: getConnectionHandlerSimplePeer({}), - topic: '', // <- set any app-specific room id here. - secret: 'mysecret', - pull: {}, - push: {} -}) -``` - -#### CouchDB - -```ts -import { replicateCouchDB } from 'rxdb/plugins/replication-couchdb'; - -replicateCouchDB({ - collection: db.todos, - url: 'http://example.com/todos/', - push: {}, - pull: {} -}); -``` - -#### And more... - -Explore all [replication plugins](/replication.html), including advanced conflict handling and custom protocols. - - - - -
    - -## Next steps - -You are now ready to dive deeper into RxDB. -- Start reading the full documentation [here](./install.md). -- There is a full implementation of the [quickstart guide](https://github.com/pubkey/rxdb-quickstart) so you can clone that repository and play with the code. -- For frameworks and runtimes like Angular, React Native and others, check out the list of [example implementations](https://github.com/pubkey/rxdb/tree/master/examples). -- Also please continue reading the documentation, join the community on our [Discord chat](/chat/), and star the [GitHub repo](https://github.com/pubkey/rxdb). -- If you are using RxDB in a production environment and are able to support its continued development, please take a look at the [👑 Premium package](/premium/) which includes additional plugins and utilities. - ---- - -## React Native Database - Sync & Store Like a Pro - -import {Steps} from '@site/src/components/steps'; -import {Tabs} from '@site/src/components/tabs'; - -# React Native Database - -React Native provides a cross-platform JavaScript runtime that runs on different operating systems like Android, iOS, Windows and others. Mostly it is used to create hybrid Apps that run on mobile devices at Android (Google) and iOS (Apple). - -In difference to the JavaScript runtime of browsers, React Native does not support all HTML5 APIs and so it is not possible to use browser storage possibilities like localstorage, cookies, WebSQL or IndexedDB. -Instead a different storage solution must be chosen that does not come directly with React Native itself but has to be installed as a library or plugin. - - - -## Database Solutions for React-Native - -There are multiple database solutions that can be used with React Native. While I would recommend to use [RxDB](./) for most use cases, it is still helpful to learn about other alternatives. - -
    - - - -
    - -### AsyncStorage - -AsyncStorage is a key->value storage solution that works similar to the browsers [localstorage API](./articles/localstorage.md). The big difference is that access to the AsyncStorage is not a blocking operation but instead everything is `Promise` based. This is a big benefit because long running writes and reads will not block your JavaScript process which would cause a laggy user interface. - -```ts -/** - * Because it is Promise-based, - * you have to 'await' the call to getItem() - */ -await setItem('myKey', 'myValue'); -const value = await AsyncStorage.getItem('myKey'); -``` - -AsyncStorage was originally included in [React Native itself](https://reactnative.dev/docs/asyncstorage). But it was deprecated by the React Native Team which recommends to use a community based package instead. There is a [community fork of AsyncStorage](https://github.com/react-native-async-storage/async-storage) that is actively maintained and open source. - -AsyncStorage is fine when only a small amount of data needs to be stored and when no query capabilities besides the key-access are required. Complex queries or features are not supported which makes AsyncStorage not suitable for anything more than storing simple user settings data. - -### SQLite - - - -SQLite is a SQL based relational database written in C that was crafted to be embed inside of applications. Operations are written in the SQL query language and SQLite generally follows the PostgreSQL syntax. - -To use SQLite in React Native, you first have to include the SQLite library itself as a plugin. There a different project out there that can be used, but I would recommend to use the [react-native-quick-sqlite](https://github.com/ospfranco/react-native-quick-sqlite) project. - -First you have to install the library into your React Native project via `npm install react-native-quick-sqlite`. -In your code you can then import the library and create a database connection: - -```ts -import {open} from 'react-native-quick-sqlite'; -const db = open('myDb.sqlite'); -``` - -Notice that SQLite is a file based database where all data is stored directly in the filesystem of the OS. Therefore to create a connection, you have to provide a filename. - -With the open connection you can then run SQL queries: - -```ts -let { rows } = db.execute('SELECT somevalue FROM sometable'); -``` - -If that does not work for you, you might want to try the [react-native-sqlite-storage](https://github.com/andpor/react-native-sqlite-storage) project instead which is also very popular. - -#### Downsides of Using SQLite in UI-Based Apps - -While SQLite is reliable and well-tested, it has several shortcomings when it comes to using it directly in UI-based React Native applications: - -- **Lack of Observability**: Out of the box, SQLite does not offer a straightforward way to observe queries or document fields. This means that implementing [real-time data updates](./articles/realtime-database.md) in your UI requires additional layers or libraries. -- **Bridging Overhead**: Each query or data operation must go through the React Native bridge to access the native SQLite module. This can introduce performance bottlenecks or responsiveness issues, especially for large or complex data operations. -- **No Built-In Replication**: SQLite on its own is not designed for syncing data across multiple devices or with a backend. If your app requires multi-device data syncing or [offline-first](./offline-first.md) features, additional tools or a custom solution are necessary. -- **Version Management**: Handling schema changes often requires a custom migration process. If your data structure evolves frequently, managing these migrations can be cumbersome. - -Overall, SQLite can be a good solution for straightforward, local-only data storage where complex real-time features or synchronization are not needed. For more advanced requirements, like reactive UI updates or multi-client [data replication](./replication.md), you'll likely want a more feature-rich solution. - -### PouchDB - - - -PouchDB is a JavaScript NoSQL database that follows the API of the [Apache CouchDB](https://couchdb.apache.org/) server database. -The core feature of PouchDB is the ability to do a two-way replication with any CouchDB compliant endpoint. -While PouchDB is pretty mature, it has some drawbacks that blocks it from being used in a client-side React Native application. For example it has to store all documents states over time which is required to replicate with CouchDB. Also it is not easily possible to fully purge documents and so it will fill up disc space over time. A big problem is also that PouchDB is not really maintained and major bugs like wrong query results are not fixed anymore. The performance of PouchDB is a general bottleneck which is caused by how it has to store and fetch documents while being compliant to CouchDB. The only real reason to use [PouchDB](./rx-storage-pouchdb.md) in React Native, is when you want to replicate with a [CouchDB or Couchbase server](./replication-couchdb.md). - -Because PouchDB is based on an [adapter system](./adapters.md) for storage, there are two options to use it with React Native: - -- Either use the [pouchdb-adapter-react-native-sqlite](https://github.com/craftzdog/pouchdb-react-native) adapter -- or the [pouchdb-adapter-asyncstorage](https://github.com/seigel/pouchdb-react-native) adapter. - -Because the `asyncstorage` adapter is no longer maintained, it is recommended to use the `native-sqlite` adapter: - -First you have to install the adapter and other dependencies via `npm install pouchdb-adapter-react-native-sqlite react-native-quick-sqlite react-native-quick-websql`. - -Then you have to craft a custom PouchDB class that combines these plugins: - -```ts -import 'react-native-get-random-values'; -import PouchDB from 'pouchdb-core'; -import HttpPouch from 'pouchdb-adapter-http'; -import replication from 'pouchdb-replication'; -import mapreduce from 'pouchdb-mapreduce'; -import SQLiteAdapterFactory from 'pouchdb-adapter-react-native-sqlite'; -import WebSQLite from 'react-native-quick-websql'; - -const SQLiteAdapter = SQLiteAdapterFactory(WebSQLite); -export default PouchDB.plugin(HttpPouch) - .plugin(replication) - .plugin(mapreduce) - .plugin(SQLiteAdapter); -``` - -This can then be used to create a PouchDB database instance which can store and query documents: - -```ts -const db = new PouchDB('mydb.db', { - adapter: 'react-native-sqlite' -}); -``` - -### RxDB - -
    - - - -
    - -[RxDB](https://rxdb.info/) is an [local-first](./articles/local-first-future.md), NoSQL-database for JavaScript applications. It is reactive which means that you can not only query the current state, but subscribe to all state changes like the result of a [query](./rx-query.md) or even a single field of a [document](./rx-document.md). This is great for UI-based realtime applications in a way that makes it easy to develop realtime applications like what you need in React Native. - -**Key benefits of RxDB include:** - -- Observability and Real-Time Queries: Automatic UI updates when underlying data changes, making it much simpler to build responsive, reactive apps. -- Offline-First and Sync: Built-in support for [syncing with CouchDB](./replication-couchdb.md), or via [GraphQL replication](./replication-graphql.md), allowing your app to work offline and seamlessly sync when online. It is easy to make the RxDB [replication](./replication.md) compatible with anything that [supports HTTP](./replication-http.md). -- Encryption and Data Security: RxDB supports [field-level encryption](./articles//react-native-encryption.md) and a robust plugin ecosystem for [compression](./key-compression.md) and [attachments](./rx-attachment.md). -- Data Modeling and Ease of Use: Offers a schema-based approach that helps catch invalid data early and ensures consistency. -- **Performance**: Optimized for storing and querying large amounts of data on [mobile devices](./articles/mobile-database.md). - -There are multiple ways to use RxDB in React Native: - -- Use the [memory RxStorage](./rx-storage-memory.md) that stores the data inside of the JavaScript memory without persistence -- Use the [SQLite RxStorage](./rx-storage-sqlite.md) with the [react-native-quick-sqlite](https://github.com/ospfranco/react-native-quick-sqlite) plugin. - -It is recommended to use the [SQLite RxStorage](./rx-storage-sqlite.md) because it has the best performance and is the easiest to set up. However it is part of the [👑 Premium Plugins](/premium/) which must be purchased, so to try out RxDB with React Native, you might want to use the memory storage first. Later you can replace it with the SQLite storage by just changing two lines of configuration. - -First you have to install all dependencies via `npm install rxdb rxjs rxdb-premium react-native-quick-sqlite`. -Then you can assemble the RxStorage and create a database with it: - - - -### Import RxDB and SQLite -```ts -import { - createRxDatabase -} from 'rxdb'; -import { open } from 'react-native-quick-sqlite'; -``` - - - -#### RxDB Core - -```ts -import { - getRxStorageSQLiteTrial, - getSQLiteBasicsCapacitor -} from 'rxdb/plugins/storage-sqlite'; -``` - -#### RxDB Premium 👑 - -```ts -import { - getRxStorageSQLite, - getSQLiteBasicsCapacitor -} from 'rxdb-premium/plugins/storage-sqlite'; -``` - - - -### Create a database -```ts -const myRxDatabase = await createRxDatabase({ - // Instead of a simple name, - // you can use a folder path to determine the database location - name: 'exampledb', - multiInstance: false, // <- Set this to false when using RxDB in React Native - storage: getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsQuickSQLite(open) - }) -}); - -``` - -### Add a Collection -```ts -const collections = await myRxDatabase.addCollections({ - humans: { - schema: { - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string', maxLength: 100 }, - name: { type: 'string' }, - age: { type: 'number' } - }, - required: ['id', 'name'] - } - } -}); -``` - -### Insert a Document -```ts -await collections.humans.insert({id: 'foo', name: 'bar'}); - -``` - -### Run a Query -```ts -const result = await collections.humans.find({ - selector: { - name: 'bar' - } -}).exec(); - -``` - -### Observe a Query -```ts -await collections.humans.find({ - selector: { - name: 'bar' - } -}).$.subscribe(result => {/* ... */}); -``` - - -Using the SQLite RxStorage is pretty fast, which is shown in the [performance comparison](./rx-storage.md#performance-comparison). -To learn more about using RxDB with React Native, you might want to check out [this example project](https://github.com/pubkey/rxdb/tree/master/examples/react-native). - -Also RxDB provides many other features like [encryption](./encryption.md) or [compression](./key-compression.md). You can even store binary data as [attachments](./rx-attachment.md) or use RxDB as an [ORM](./orm.md) in React Native. - -### Realm - - - -Realm is another database solution that is particularly popular in the mobile world. Originally an independent project, Realm is now owned by MongoDB, and has seen deeper integration with MongoDB services over time. - -**Pros**: -- Fast, object-based database approach with an easy data model. -- Historically known for good performance and a simple, user-friendly API. - -**Downsides**: -- **Forced MongoDB Cloud Usage**: Realm Sync is now tightly coupled with MongoDB Realm Cloud. If you want to use their full sync or advanced features, you are essentially locked into MongoDB's ecosystem, which can be a downside if you need on-premise or custom hosting. -- **Missing or Limited Features**: While Realm covers many basic needs, some developers find that advanced queries or certain offline-first features are not as robust or flexible as other solutions. -- **Vendor Lock-In**: If you rely heavily on Realm Sync, migrating away from MongoDB's cloud can be difficult because the sync logic and data format are tightly integrated. -- **Community Concerns**: Since the MongoDB acquisition, some worry about Realm's open-source future and whether large changes or new features will remain community-friendly. - -Although Realm can be a good solution when used purely as a local database, if you plan on syncing data across clients or want to avoid cloud vendor lock-in, you should consider carefully how MongoDB's ownership might affect your long-term plans. - -### Firebase / Firestore - - - -Firestore is a cloud based database technology that stores data on clients devices and replicates it with the Firebase cloud service that is run by google. It has many features like observability and authentication. -The main feature lacking is the non-complete offline first support because clients cannot start the application while being offline because then the authentication does not work. After they are authenticated, being offline is no longer a problem. -Also using firestore creates a vendor lock-in because it is not possible to replicate with a custom self hosted backend. - -To get started with Firestore in React Native, it is recommended to use the [React Native Firebase](https://github.com/invertase/react-native-firebase) open-source project. - -### Summary - -| **Characteristic** | **AsyncStorage** | **SQLite** | **PouchDB** | **RxDB** | **Realm** | **Firestore** | -| ----------------------- | ------------------------------------ | --------------------------------------- | ----------------------------------------- | ---------------------------------------------------------- | --------------------------------------------- | --------------------------------------------------------- | -| **Database Type** | Key-value store, no advanced queries | Embedded SQL engine in a local file | NoSQL doc store, revision-based | NoSQL doc-based (JSON) | Object-based (MongoDB-owned) | NoSQL doc-based, cloud by Google | -| **Query Model** | getItem/setItem only | Standard SQL statements | Map/reduce or basic Mango queries | JSON-based query language, optional indexes | Object-level queries, sync with MongoDB Realm | Document queries, limited advanced ops | -| **Observability** | None built-in | No direct reactivity | Changes feed from Couch-style backend | Built-in reactive queries, UI auto-updates | Local reactivity, or realm sync (cloud) | Real-time snapshots, partial offline | -| **Offline Replication** | None | None by default | CouchDB-compatible sync | Built-in sync (HTTP, GraphQL, CouchDB, etc.) | Realm Cloud sync only | Basic offline caching, re-auth needed | -| **Performance** | Fine for small keys/values | Generally good; bridging overhead | OK for mid data sets; can bloat over time | Varies by storage; Dexie/SQLite w/ compression can be fast | Typically fast on mobile | Good read-heavy perf; can be rate-limited, costly | -| **Schema Handling** | None | SQL schema, migrations needed | No formal schema, doc-based | Optional JSON-Schema, typed checks, compression | Declarative schema, migration needed | No strict schema; rules in console mostly | -| **Usage Cases** | Store small user settings | Local structured data, moderate queries | Basic doc store, synergy with CouchDB | Reactive offline-first for large or dynamic data | Local object DB, locked to MongoDB realm sync | Real-time Google backend, partial offline, vendor lock-in | - -## Follow up - -- A good way to learn using RxDB database with React Native is to check out the [RxDB React Native example](https://github.com/pubkey/rxdb/tree/master/examples/react-native) and use that as a tutorial. -- If you haven't done so yet, you should start learning about RxDB with the [Quickstart Tutorial](./quickstart.md). -- There is a followup list of other [client side database alternatives](./alternatives.md) that might work with React Native. - ---- - -## React - -import {Tabs} from '@site/src/components/tabs'; -import {Steps} from '@site/src/components/steps'; - -# React - -RxDB provides first-class support for both React and React Native via a dedicated React integration. This integration makes it possible to use RxDB inside functional components using React Context and hooks, without manually subscribing to observables or managing cleanup logic. - -The same APIs work in **React** for the web and in [React Native](./react-native-database.md). The only difference between platforms is the storage and environment setup. The React integration itself behaves identically in both. - -## General concept - -RxDB is internally reactive and emits changes via RxJS observables. React and React Native, however, are render-driven frameworks that rely on component state and hooks. The RxDB React integration bridges these two models by exposing a small set of hooks that translate RxDB state into React renders. - -Instead of hiding reactivity behind configuration flags, the integration uses explicit hooks. This makes component behavior predictable, avoids accidental subscriptions, and keeps performance characteristics easy to reason about. - -## Usage - - - -### Installation - -Install RxDB and React as usual: - -```bash -npm install rxdb react react-dom -``` - -### Database creation - -Database creation is not part of the React integration itself. RxDB is created in the same way as in non-React applications, including storage selection, plugins, replication, hooks, and schema definitions. - -This separation is intentional. React components should never be responsible for creating or configuring the database. They should only consume it. - -```ts -import { - createRxDatabase, - addRxPlugin -} from 'rxdb'; -import { - getRxStorageLocalstorage -} from 'rxdb/plugins/storage-localstorage'; - -async function getDatabase() { - const db = await createRxDatabase({ - name: 'heroesreactdb', - storage: getRxStorageLocalstorage() - }); - await db.addCollections({ - heroes: { - schema: myRxSchema - } - }); - - /** - * Do other stuff here - * like setting up middleware - * or starting replication. - */ - - return db; -} -``` - -### Providing the database - -To use RxDB in a React or React Native application, the database instance must be provided via a context. This is done using `RxDatabaseProvider`. - -The database itself is created outside of React, usually in a separate module. The provider is only responsible for making the database available to components once it has been initialized. - -```tsx -import React, { useEffect, useState } from 'react'; -import { RxDatabaseProvider } from 'rxdb/plugins/react'; -import { getDatabase } from './Database'; - -const App = () => { - const [database, setDatabase] = useState(); - - useEffect(() => { - const initDb = async () => { - const db = await getDatabase(); - setDatabase(db); - }; - initDb(); - }, []); - - if (database == null) { - return - Loading RxDB database... - ; - } - - return ( - - {/* your application */} - - ); -}; - -export default App; -``` - -### Accessing collections - -```ts -import { useRxCollection } from 'rxdb/plugins/react'; - -const collection = useRxCollection('heroes'); -``` - -The hook returns the collection once it becomes available. During the initial render, the value may be `undefined`, so components must handle this case. - -This hook does not subscribe to any data. It only provides access to the collection instance. - -### Queries - -To render query results in your component, use the `useRxQuery` hook. - -```tsx -import { useRxQuery } from 'rxdb/plugins/react'; - -const query = { - collection: 'heroes', - query: { - selector: {}, - sort: [{ name: 'asc' }] - } -}; - -const HeroCount = () => { - const { results, loading } = useRxQuery(query); - - if (loading) { - return Loading...; - } - - return Total heroes: {results.length}; -}; -``` - -The query is executed when the component renders. If the component re-renders, the query may be re-executed, but changes in the underlying data will not automatically trigger updates. - -This hook is well suited for static views, server-side rendering, and cases where live updates are not required. - -### Live queries - -Most React applications require views that automatically update when the database changes. For this purpose, RxDB provides the `useLiveRxQuery` hook. - -The hook accepts a query description object and returns the current results together with a loading state. - -```tsx -import { useLiveRxQuery } from 'rxdb/plugins/react'; - -const query = { - collection: 'heroes', - query: { - selector: {}, - sort: [{ name: 'asc' }] - } -}; - -const HeroList = () => { - const { results, loading } = useLiveRxQuery(query); - - if (loading) { - return Loading...; - } - - return ( - - {results.map(hero => ( - {hero.name} - ))} - - ); -}; -``` - -The component automatically re-renders whenever the query result changes. Subscriptions are created when the component mounts and are cleaned up automatically when the component unmounts. - -The returned documents are fully reactive RxDB documents and can be modified or removed directly. - - - -## React Native compatibility - -All hooks and providers described on this page work the same way in React Native. The React integration does not rely on any browser-specific APIs. - -The only platform-specific part of a React Native setup is database creation, where a different storage plugin is typically used. Once the database is created, the React integration behaves identically. - -## Signals - -In addition to the React hooks shown on this page, RxDB also supports alternative reactivity models such as [signals](./reactivity.md#react). RxDB's core reactivity system can be configured to expose reactive values using different primitives instead of RxJS observables, which makes it possible to integrate RxDB with signal-based approaches in React or other frameworks. This is an advanced capability and is independent of the React integration described here. For more details about how RxDB's reactivity system works and how custom reactivity can be configured, see the [Reactivity documentation](./reactivity.md). - -## Follow Up - -- RxDB includes a full [React example application](https://github.com/pubkey/rxdb/tree/master/examples/react) that demonstrates the patterns described on this page, including database creation outside of React, usage of `RxDatabaseProvider`, and data access via `useRxQuery`, `useLiveRxQuery`, and `useRxCollection. - -- A corresponding [React Native example](https://github.com/pubkey/rxdb/tree/master/examples/react-native) is also available and shows the same integration concepts applied in a mobile environment, with only the platform-specific storage and setup differing. - ---- - -## Signals & Custom Reactivity with RxDB - -import {Tabs} from '@site/src/components/tabs'; -import {Steps} from '@site/src/components/steps'; - -# Signals & Co. - Custom reactivity adapters instead of RxJS Observables - -RxDB internally uses the [rxjs library](https://rxjs.dev/) for observables and streams. All functionalities of RxDB like [query](./rx-query.md#observe) results or [document fields](./rx-document.md#observe) that expose values that change over time return a rxjs `Observable` that allows you to observe the values and update your UI accordingly depending on the changes to the database state. - -However there are many reasons to use other reactivity libraries that use a different datatype to represent changing values. For example when you use **signals** in angular or react, the **template refs** of vue or state libraries like MobX and redux. - -RxDB allows you to pass a custom reactivity factory on [RxDatabase](./rx-database.md) creation so that you can easily access values wrapped with your custom datatype in a convenient way. - -## Adding a reactivity factory - - - -### Angular - -In angular we use [Angular Signals](https://angular.dev/guide/signals) as custom reactivity objects. - - - -#### Import - -```ts -import { createReactivityFactory } from 'rxdb/plugins/reactivity-angular'; -import { Injectable, inject } from '@angular/core'; -``` - -#### Set the reactivity factory - -Set the factory as `reactivity` option when calling `createRxDatabase`. - -```ts -const database = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage(), - reactivity: createReactivityFactory(inject(Injector)) -}); - -// add collections/sync etc... -``` - -#### Use the Signal in an Angular component - -```ts -import { Component, inject } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { DbService } from '../db.service'; - -@Component({ - selector: 'app-todos-list', - standalone: true, - imports: [CommonModule], - template: ` - - {{ t.title }} - - `, -}) -export class TodosListComponent { - private dbService = inject(DbService); - - // RxDB query - Angular Signal - readonly todosSignal = this.dbService.db.todos.find().$$; -} - -``` - - - -An example of how signals are used in angular with RxDB, can be found at the [RxDB Angular Example](https://github.com/pubkey/rxdb/blob/master/examples/angular/src/app/components/heroes-list/heroes-list.component.ts#L46) - -### React - -For React, we use the [Preact Signals](https://preactjs.com/guide/v10/signals/) for custom reactivity. - - - -#### Install Preact Signals - -```bash -npm install @preact/signals-core --save -``` - -#### Import - -```ts -import { - PreactSignalsRxReactivityFactory -} from 'rxdb/plugins/reactivity-preact-signals'; -``` - -#### Set the reactivity factory - -```ts -const database = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage(), - reactivity: PreactSignalsRxReactivityFactory -}); - -// add collections/sync etc... -``` - -#### Use the Signal in a React component - -```tsx -import { useEffect, useState } from 'preact/hooks'; -import { getDatabase } from './db'; - -export function TodosList() { - const [db, setDb] = useState(null); - - useEffect(() => { - getDatabase().then(setDb); - }, []); - - if (!db) return null; - - // RxQuery -> Preact Signal - const todosSignal = db.todos.find().$$; - - return ( - - {todosSignal.value.map((doc: any) => ( - - {doc.title} - - ))} - - ); -} -``` - - - -### Vue - -For Vue, we use the [Vue Shallow Refs](https://vuejs.org/api/reactivity-advanced) for custom reactivity. - - - -#### Import -```ts -import { VueRxReactivityFactory } from 'rxdb/plugins/reactivity-vue'; -``` - -#### Set the reactivity factory - -```ts -const database = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage(), - reactivity: VueRxReactivityFactory -}); - -// add collections/sync etc... -``` - -#### Use the Shallow Ref in a Vue component - -```html - - - -``` - - - - - -## Accessing custom reactivity objects - -All observable data in RxDB is marked by the single dollar sign `$` like `RxCollection.$` for events or `RxDocument.myField$` to get the observable for a document field. To make custom reactivity objects distinguable, they are marked with double-dollar signs `$$` instead. Here are some example on how to get custom reactivity objects from RxDB specific instances: - -```ts -// RxDocument - -// get signal that represents the document field 'foobar' -const signal = myRxDocument.get$$('foobar'); - -// same as above -const signal = myRxDocument.foobar$$; - -// get signal that represents whole document over time -const signal = myRxDocument.$$; - -// get signal that represents the deleted state of the document -const signal = myRxDocument.deleted$$; -``` - -```ts -// RxQuery - -// get signal that represents the query result set over time -const signal = collection.find().$$; - -// get signal that represents the query result set over time -const signal = collection.findOne().$$; -``` - -```ts -// RxLocalDocument - -// get signal that represents the whole local document state -const signal = myRxLocalDocument.$$; - -// get signal that represents the foobar field -const signal = myRxLocalDocument.get$$('foobar'); -``` - ---- - -## RxDB 10.0.0 - Built for the Future - -# 10.0.0 - -One year after version `9.0.0` we now have RxDB version `10.0.0`. -The main goal of version 10 was to change things that make RxDB ready for the future. - -Notice that I use major releases to bundle stuff that breaks the RxDB usage in your project, not to add new features. - -## The main thing first - -In the past, RxDB was build around Pouchdb. Before I started making RxDB I tried to solve the problems of my current project with other existing databases out there. I evaluated all of them and then started using Pouchdb and added many features via plugin. Then I realised it will be easier to create a separate project that wraps around Pouchdb, that was RxDB. Back then pouchdb was the most major browser database out there and it was well maintained and had a big community. -But in the last 5 years, things have changed. A big part of the RxDB users do not use couchdb in the backend and do not need the couchdb replication. -Therefore they do not really need the overhead with revision handling that slows down the performance of pouchdb. Also there where many other problems with using pouchdb. It is not actively developed, many bugs are not fixed and no new features get added. Also there are many unsolved problems like how to finally delete document data or how to replicate more than 6 databases at the same time, how to use replication without attachments data, and so on... - -So for this release, I abstracted all parts that we use from pouchdb into the `RxStorage` interface. RxDB works on top of any implementation of the `RxStorage` interface. This means it is now possible to use RxDB together with other underlying storages like SQLite, PostgreSQL, Minimongo, MongoDB, and so on, as long as someone writes the `RxStorage` class for it. - -This means, to create a `RxDatabase` you have to pass the storage class instead of pouchdb specific settings: - -```ts - -// import pouchdb specific stuff and add pouchdb adapters -import { - addPouchPlugin, - getRxStoragePouch -} from 'rxdb/plugins/pouchdb'; - -// IMPORTANT: Do not use addRxPlugin to add pouchdb adapter, instead use addPouchPlugin -addPouchPlugin(require('pouchdb-adapter-memory')); - -import { - addRxPlugin, - createRxDatabase, - randomCouchString, -} from 'rxdb/plugins/core'; - -// create the database with the storage creator. -const db = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStoragePouch('memory'), -}); - -``` - -To access the internal `pouch` instance of a collection, you have to go over the `storageInstance`: - -```ts -const pouch = myRxCollection.storageInstance.internals.pouch; -``` - -## Other breaking changes - -### Primary key is required -In the past, using a primary key was optional. When no primary key was defined, RxDB filled up the `_id` field with an uuid-like string which was then used as primary. When I researched on github how people use RxDB, I found out that many use a secondary index for what should be the primary key. -Also having the primary key optional, caused much confusing when using RxDB with typescript. - -So now the primary key MUST be set when creating a schema for RxDB. -Also the primary key is defined with the `primaryKey` property at the top level of the schema. This ensures that typescript will complain if no `primaryKey` is defined. - -```ts - -// when using the type `RxJsonSchema` the `DocType` is now required -const mySchema: RxJsonSchema = { - version: 0, - primaryKey: 'passportId', - type: 'object', - properties: { - passportId: { - type: 'string' - } - }, - // primaryKey is always required - required: ['passportId'] -} - -``` - -### Attachment data must be Blob or Buffer - -In the past, an `RxAttachment` could be stored with `Blob`, `Buffer` and `string` data. If a `string` was passed, pouchdb internally transformed the data to a `Blob` or `Buffer`, depending on in which environment it is running. -This behavior caused much trouble and weird edge cases because of how the data is transformed from and to `string`. -So now you can only store `Blob` or `Buffer` as attachment data. `string` is no longer allowed. You can still transform a string to a Blob or Buffer by yourself and then store it. - -```ts -import { blobBufferUtil } from 'rxdb'; - -const attachment = await myDocument.putAttachment( - { - id: 'cat.txt', - data: blobBufferUtil.createBlobBuffer('miau', 'text/plain') - type: 'text/plain' - } -); - -``` - -Also `putAttachment()` now defaults to `skipIfSame=true`. This means when you write attachment data that already is exactly the same in the database, no write will be done. - -### Outgoing data is now readonly and deep-frozen - -RxDB often uses outgoing data also in the internals. For example the result of a query is not only send to the user, but also used inside of RxDB's query-change-detection. To ensure that mutation of the outgoing data is not changing internal stuff, which would cause strange bugs, outgoing data was always deep-cloned before handing it out to the user. This is a common practice on many javascript libraries. - -The problem is that deep-cloning big objects can be very CPU/Memory expensive. So instead of doing a deep-clone, RxDB does now assume that outgoing data is **immutable**. If the users wants to modify that data, it has to be deep-cloned by the user. -To ensure immutability, RxDB runs a [deep-freeze](https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze) in the dev-mode (about same expensive as deep clone). Also typescript will throw a build-time error because we use `ReadonlyArray` and `readonly` to define outgoing data immutable. In production-mode, there will be nothing besides typescript that ensures immutability to have best performance. - -```ts -const data = myRxDocument.toJSON(); -data.foo = bar; // This does NOT work! - -// instead clone the data before changing it -import { clone } from 'rxjs'; -const clonedData = clone(data); -data.foo = bar; // This works! -``` - -### The in-memory plugin does no longer work. - -The in-memory plugin was used to spawn in-memory collections on top of a normal `RxCollection`. The benefit is to have the data replicated into the memory of the javascript runtime, which allows for faster queries. - -After doing many tests and observations, I found out that the in-memory plugin was slow. Really slow, even slower then just using the indexeddb adapter in the browser. You can reproduce my observations at the event-reduce testpage. Here you can see that random-writes+query are slower on the [memory-adapter](https://pubkey.github.io/event-reduce/?tech=pouchdb:memory) then on [indexeddb](https://pubkey.github.io/event-reduce/?tech=pouchdb:indexeddb). -The reason for this are the big abstraction layers. Pouchdb uses the adapter system. The memory adapter uses the [leveldown abstraction layer](https://github.com/Level/levelup). Each write/read goes to the [memdown module](https://github.com/Level/memdown). - -So the in-memory plugin is not working for now. In the future it will be reimplemented in a custom memory based `RxStorage` class. - -:::note -You can of course still use the pouchdb `memory` adapter as usual. It is not affected by this change. -::: - -## What else is a breaking change? - -- Removed the deprecated `atomicSet()`, use `atomicPatch()` instead. -- Removed the deprecated `RxDatabase.collection()` use `RxDatabase().addCollections()` instead. -- Removed plugin hook `preCreatePouchDb` because it is no longer needed. -- Removed the `watch-for-changes` plugin. We now overwrite pouchdbs `bulkDocs` method to generate events. This is faster and more reliable. -- Removed the `adapter-check` plugin. (The function `adapterCheck` is move to the pouchdb plugin). -- Calling `RxDatabase.server()` now returns a promise that resolves when the server is started up. -- Changed the defaults of `PouchDBExpressServerOptions` from the `server()` method, by default we now store logs in the `tmp` folder and the config is in memory. -- Renamed `replication`-plugin to [replication-couchdb](../replication-couchdb.md) to be more consistent in naming like with `replication-graphql` - - For the same reason, renamed `RxCollection().sync()` to `RxCollection().syncCouchDB()` -- Renamed the functions of the json import/export plugin to be less confusing. - - `dump()` is now `exportJSON()` - - `importDump()` is now `importJSON()` -- `RxCollection` uses a separate pouchdb instance for local documents, so that they can persist during migrations. -- A JsonSchema must have the `required` array at the top level and it must contain the primary key. - -## New features - -### Composite primary key - -You can now use a composite primary key for the schema where you can join different properties of the document data to create a primary key. - -```javascript -const mySchema = { - keyCompression: true, // set this to true, to enable the keyCompression - version: 0, - title: 'human schema with composite primary', - primaryKey: { - // where should the composed string be stored - key: 'id', - // fields that will be used to create the composed key - fields: [ - 'firstName', - 'lastName' - ], - // separator which is used to concat the fields values. - separator: '|' - } - type: 'object', - properties: { - id: { - type: 'string' - }, - firstName: { - type: 'string' - }, - lastName: { - type: 'string' - } - }, - required: [ - 'id', - 'firstName', - 'lastName' - ] -}; -``` - -## For the future - -With these changes, RxDB is now ready for the future plans: - -- I want to replace the `revision` handling of documents with conflict resolution strategies that can always directly resolve conflicts instead of maintaining the revision tree. -- Implement different implementations for `RxStorage`. I will first work on a memory based version. I am in good hope that the community will create other implementations depending on their needs. - -## You can help! - -There are many things that can be done by **you** to improve RxDB: - -- Check the [BACKLOG](https://github.com/pubkey/rxdb/blob/master/orga/BACKLOG.md) for features that would be great to have. -- Check the [breaking backlog](https://github.com/pubkey/rxdb/blob/master/orga/before-next-major.md) for breaking changes that must be implemented in the future but where I did not had the time yet. -- Check the [todos](https://github.com/pubkey/rxdb/search?q=todo) in the code. There are many small improvements that can be done for performance and build size. -- Review the code and add tests. I am only a single dude with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors. -- Improve the documentation. In the last user survey many users told me that the documentation is not good enough. But I reviewed the docs and could not find clear flaws. The problem is that I am way to deep into RxDB so that I am not able to understand which documentation a newcomer to the project needs. Likely I assume too much knowledge or focus writing about the wrong parts. -- Update the [example projects](https://github.com/pubkey/rxdb/tree/master/examples) many of them are outdated and need updates. - -## Discuss! - -Please [discuss here](https://github.com/pubkey/rxdb/issues/3279). - ---- - -## RxDB 11 - WebWorker Support & More - -# 11.0.0 - -The last major release was only about [6 month ago](./10.0.0.md). But to further improve RxDB, it was necessary to make some more breaking changes and release the next major version. -In the last version `10.0.0` the storage layer was abstracted in a way to make it possible to not only use PouchDB as storage, but instead we can use different storage engines like the one based on [LokiJS](../rx-storage-lokijs.md) or any custom implementation of the `RxStorage` interface. - -In the new version `11.0.0` the focus is on making it possible to put the RxStorage into a **WebWorker** to take CPU load from the main process into the worker's process. This can improve the perceived performance of your application, especially when you have to handle many documents or when you need the main process CPU cycles to manage the DOM with your frontend framework. - -## Worker plugin - -Performance was always something RxDB had a struggle with. Not because RxDB itself is slow, but because the underlying storage engine (mostly PouchDB) or [IndexedDB is slow](../slow-indexeddb.md). This never was a problem for 'normal' applications that have to store some documents. But on big applications with much data, there was a bottleneck. - -With the Worker plugin, you can move the `RxStorage` out of the main JavaScript process. This makes it pretty easy to utilize more than one CPU core and speed up your application. - -```ts -// worker.ts -import { wrappedRxStorage } from 'rxdb/plugins/worker'; -import { getRxStorageLoki } from 'rxdb/plugins/storage-lokijs'; -wrappedRxStorage({ - storage: getRxStorageLoki() -}); -``` - -```ts -// main process -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageWorker } from 'rxdb/plugins/worker'; -const database = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageWorker( - { - workerInput: 'path/to/worker.js' - } - ) -}); -``` - -The whole documentation about the worker plugin can be found [here](../rx-storage-worker.md). - -## Transpile `async`/`await` to promises instead of generators - -The RxDB source-code is transpiled from TypeScript to es5/es6 JavaScript code via babel. -In the past we transpiled the `async` and `await` keywords with the babel plugin `plugin-transform-async-to-generator`. -Now we use the [babel-plugin-transform-async-to-promises](https://github.com/rpetrich/babel-plugin-transform-async-to-promises) plugin instead. -It transpiles `async`/`await` into native `Promise`s instead of using JavaScript generators. This has shown to decrease build size by about 10% and also improves the performance. - -## Removed deprecated `received` methods - -In the past there was a typo in all getters and methods that are called `received`. -This was renamed to `received` and all mistyped methods have been deprecated. -We now removed all deprecated methods, so you have to use the correctly spelled methods instead. -[See #3392](https://github.com/pubkey/rxdb/pull/3392) - -## All internal events are handled as bulks - -All events that are generated from writing to the storage instance are now handled in bulks instead of each event for its own. This has shown to save performance when the events are send over a data layer like a `WebWorker` or the `BroadcastChannel`. This change only affects you if you have created custom RxDB plugins. - -## RxStorage interface changes - -To make the RxStorage abstraction compatible with Webworkers, we had to do some changes. These will only affect you if you use a custom RxStorage implementation. - -- The non async functions `prepareQuery`, `getSortComparator` and `getQueryMatcher` have been moved out of `RxStorageInstance` into the `statics` property of `RxStorage`. This makes it possible to split the code when using the worker plugin. You only need to load the static methods at the main process, and the whole storage engine is only loaded inside of the worker. -- All data communication with the RxStorage now happens only via plain JSON objects. Instead of returning a JavaScript `Map` or `Set`, only [JSON datatypes](https://www.w3schools.com/js/js_json_datatypes.asp) are allowed. This makes it easier to properly serialize the data when transferring it over to or from a WebWorker. -- Events that are created from a write operation, must be emitted **before** the write operation resolves. This ensures that RxDB always knows about all events before it runs another operation. So when you do an insert and a query directly after the insert, the query will return the correct results. -- The meta data `digest` and `length` of attachments is now created by RxDB, not by the RxStorage. [#3548](https://github.com/pubkey/rxdb/issues/3548) -- Added the statics `hashKey` property to identify the used hash function. - -## Removed the `no-validate` plugin. - -In the past, RxDB required you to add one schema validation plugin. For production, it was useful to not have any schema validation for better performance and a smaller build size. For that, the `no-validate` plugin could be added which was just a dummy plugin that did no do any validation. To remove this unnecessary complexity, RxDB no longer requires you to add a validation plugin. Therefore the no-validate plugin is now removed as it is no longer needed. - -## Other changes - -- The LokiJS RxStorage no longer uses the `IdleQueue` to determine if the database is idle. Because LokiJS is in-memory, we can just wait for CPU idleness via [requestIdleCallback()](https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback) -- Bugfix: Do not throw an error when database is destroyed while a GraphQL replication is running. -- Compound primary key migration throws "Value of primary key(s) cannot be changed" [#3546](https://github.com/pubkey/rxdb/pull/3546) -- Allow `_id` as primaryKey [#3562](https://github.com/pubkey/rxdb/pull/3562) Thanks [@SuperKirik](https://github.com/SuperKirik) -- LokiJS: Remote operations do never resolve when remote instance was leader and died. - -## Migration from `10.x.x` - -The migration should be pretty easy. Nothing in the datalayer has been changed, so you can use the stored data of v10 together with the new v11 RxDB. - -## You can help! - -There are many things that can be done by **you** to improve RxDB: - -- Check the [BACKLOG](https://github.com/pubkey/rxdb/blob/master/orga/BACKLOG.md) for features that would be great to have. -- Check the [breaking backlog](https://github.com/pubkey/rxdb/blob/master/orga/before-next-major.md) for breaking changes that must be implemented in the future but where I did not had the time yet. -- Check the [todos](https://github.com/pubkey/rxdb/search?q=todo) in the code. There are many small improvements that can be done for performance and build size. -- Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors. -- Improve the documentation. In the last user survey many users told me that the documentation is not good enough. But I reviewed the docs and could not find clear flaws. The problem is that I am way to deep into RxDB so that I am not able to understand which documentation a newcomer to the project needs. Likely I assume too much knowledge or focus writing about the wrong parts. -- Update the [example projects](https://github.com/pubkey/rxdb/tree/master/examples) many of them are outdated and need updates. - -## Discuss! - -Please [discuss here](https://github.com/pubkey/rxdb/issues/3555). - ---- - -## RxDB 12.0.0 - Clean, Lean & Mean - -# [RxDB](https://rxdb.info/) 12.0.0 - -For the last few months, I worked hard on the new RxDB version 12 release. I mostly focused on performance related features and refactored much of the code. - -## Removed the `core` plugin - -In the past, RxDB exported all bundled plugins when doing `import from 'rxdb';`. -This increased the bundle size, so optionally people could `import from 'rxdb/plugins/core';` to create a custom build that only contains the plugin that they really need. -But very often this lead to accidental imports of `'rxdb'`. For example, when the code editor auto imported methods. -So now, the default `import from 'rxdb';` only exports RxDB core. Every plugin must be imported afterwards if needed. - -## Unified the replication primitives and the GraphQL replication plugin - -Most of the GraphQL replication code has been replaced by using the replication primitives plugin internally. -This means many bugs and undefined behavior that was already fixed in the replication primitives, are now also fixed in the GraphQL replication. - -Also, the GraphQL replication now runs `push` in bulk. This means you either have to update your backend to accept bulk mutations, or set `push.batchSize: 1` and transform the array into a single document inside `push.queryBuilder()`. - -## Added the cleanup plugin - -To make replication work, and for other reasons, RxDB has to keep deleted documents in storage. -This ensures that when a client is offline, the deletion state is still known and can be replicated with the backend when the client goes online again. - -Keeping too many deleted documents in the storage can slow down queries or fill up too much disk space. -With the [cleanup plugin](https://rxdb.info/cleanup.html), RxDB will run cleanup cycles that clean up deleted documents when it can be done safely. - -## Allow to set a specific index - -By default, the query will be sent to RxStorage, where a query planner will determine which one of the available indexes must be used. -But the query planner cannot know everything and sometimes will not pick the most optimal index. -To improve query performance, you can specify which index must be used, when running the query. - -```ts -const queryResults = await myCollection - .find({ - selector: { - age: { - $gt: 18 - }, - gender: { - $eq: 'm' - } - }, - /** - * Because the developer knows that 50% of the documents are 'male', - * but only 20% are below age 18, - * it makes sense to enforce using the ['gender', 'age'] index to improve performance. - * This could not be known by the query planner which might have chosen ['age', 'gender'] instead. - */ - index: ['gender', 'age'] - }).exec(); -``` - -## Enforce primaryKey in the index - -For various performance optimizations, like the [EventReduce](https://github.com/pubkey/event-reduce) algorithm, RxDB needs a **deterministic sort order** for all query results. -To ensure a deterministic sorting, RxDB now automatically adds the primary key as last sort attribute to every query, if it is not there already. This ensures that all documents that have the same attributes on all query relevant fields, still can be sorted in a deterministic way, not depending on which was written first to the database. - -In the past, this often lead to slow queries, because indexes where not constructed with that in mind. -Now RxDB will add the `primaryKey` to all indexes that do not contain it already. -If you have any collection with a custom index set, you need to run a [migration](https://rxdb.info/migration-schema.html) when updating to RxDB version `12.0.0` so that RxDB can rebuild the indexes. - -## Fields that are used in indexes need some meta attributes - -When using a schema with indexes, depending on the field type, you must have set some meta attributes like `maxLength` or `minimum`. This is required so that RxDB -is able to know the maximum string representation length of a field, which is needed to craft custom indexes on several `RxStorage` implementations. - -```javascript -const schemaWithIndexes = { - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 // <- the primary key must set `maxLength` - }, - firstName: { - type: 'string', - maxLength: 100 // <- string-fields that are used as an index, must set `maxLength`. - }, - active: { - type: 'boolean' - }, - balance: { - type: 'number', - - // number fields that are used in an index, must set `minimum`, `maximum` and `multipleOf` - minimum: 0, - maximum: 100000, - multipleOf: '0.01' - } - }, - required: [ - 'active' // <- boolean fields that are used in an index, must be required. - ], - indexes: [ - 'firstName', - ['active', 'firstName'] - ] -}; -``` - -## Introduce `_meta` field - -In the past, RxDB used a hacky way to mark documents as being from the remote instance during replication. -This is needed to ensure that pulled documents are not sent to the backend again. -RxDB crafted a specific revision string and stored the data with that string. -This meant that it was not possible to replicate with multiple endpoints at the same time. -From now on, all document data is stored with an `_meta` field that can contain various flags and other values. -This makes it easier for plugins to remember stuff that belongs to the document. - -**In the future**, the other meta fields like `_rev`, `_deleted` and `_attachments` will be moved from the root level -to the `_meta` field. This is **not** done in release `12.0.0` to ensure that there is a migration path. - -## Removed RxStorage RxKeyObjectInstance - -In the past, we stored local documents and internal data in a `RxStorageKeyObjectInstance` of the `RxStorage` interface. -In PouchDB, this has a [slight performance](https://pouchdb.com/guides/local-documents.html#advantages-of-local%E2%80%93docs) improvement compared to storing that data in 'normal' documents because it does not have to handle the revision tree. -But this improved performance is only possible because normal document handling on PouchDB is so slow. -For every other RxStorage implementation, it does not really matter if documents are stored in a query-able way or not. Therefore, the whole `RxStorageKeyObjectInstance` is removed. Instead, RxDB now stores local documents and internal data in normal storage instances. This removes complexity and makes things easier in the future. For example, we could now migrate local documents or query them in plugins. - -## Refactor plugin hooks - -In the past, an `RxPlugin` could add plugins hooks which where always added as last. -This meant that some plugins depended on having the correct order when calling `addRxPlugin()`. -Now each plugin hook can be either defined as `before` or `after` to specify at which position of the current hooks -the new hook must be added. - -## Local documents must be activated per RxDatabase/RxCollection - -For better performance, the local document plugin does not create a storage for every database or collection that is created. -Instead, you have to set `localDocuments: true` when you want to store local documents in the instance. - -```js -// activate local documents on a RxDatabase -const myDatabase = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStoragePouch('memory'), - localDocuments: true // <- activate this to store local documents in the database -}); - -myDatabase.addCollections({ - messages: { - schema: messageSchema, - localDocuments: true // <- activate this to store local documents in the collection - } -}); -``` - -## Added Memory RxStorage - -The [Memory RxStorage](https://rxdb.info/rx-storage-memory.html) is based on plain in-memory arrays and objects. It can be used in all environments and is made for performance. - -## RxDB Premium 👑 - -You can now purchase access to additional RxDB plugins that are part of the [RxDB Premium 👑](/premium/) package. - -**If you have [sponsored](https://github.com/sponsors/pubkey) RxDB in the past (before the April 2022), you can get free lifetime access to RxDB Premium 👑 by writing me via [Twitter](https://twitter.com/rxdbjs)** - -- [RxStorage IndexedDB](https://rxdb.info/rx-storage-indexeddb.html) a really fast [RxStorage](https://rxdb.info/rx-storage.html) implementation based on **IndexedDB**. Made to be used in browsers. -- [RxStorage SQLite](https://rxdb.info/rx-storage-sqlite.html) a really fast [RxStorage](https://rxdb.info/rx-storage.html) implementation based on **SQLite**. Made to be used on **Node.js**, **Electron**, **React Native**, **Cordova** or **Capacitor**. -- [RxStorage Sharding](https://rxdb.info/rx-storage-sharding.html) a wrapper around any other [RxStorage](https://rxdb.info/rx-storage.html) that improves performance by applying the sharding technique. -- **migrateRxDBV11ToV12** A plugin that migrates data from any RxDB v11 storage to a new RxDB v12 database. Use this when you upgrade from RxDB 11->12 and you have to keep your database state. - -## Other changes - -- The Dexie.js RxStorage is no longer in beta mode. -- Added `RxDocument().toMutableJSON()` -- Added `RxCollection().bulkUpsert()` -- Added optional `init()` function to `RxPlugin`. -- dev-mode: Add check to ensure all top-level fields in a query are defined in the schema. -- Support for array field based indexes like `data.[].subfield` was removed, as it anyway never really worked. -- Refactored the usage of RxCollection.storageInstance to ensure all hooks run properly. -- Refactored the encryption plugin so no more plugin specific code is in the RxDB core. -- Removed the encrypted export from the json-import-export plugin. This was barely used and made everything more complex. All exports are now non-encrypted. If you need them encrypted, you can still run by encryption after the export is done. -- RxPlugin hooks now can be defined as running `before` or `after` other plugin hooks. -- Attachments are now internally handled as string instead of `Blob` or `Buffer` -- Fix (replication primitives) only drop pulled documents when a relevant document was changed locally. -- Fix dexie.js was not able to query over an index when `keyCompression: true` - -Changes to `RxStorageInterface`: -- `RxStorageInstance` must have the `RxStorage` in the `storage` property. -- The `_deleted` field is now required for each data interaction with `RxStorage`. -- Removed `RxStorageInstance.getChangedDocuments()` and added `RxStorageInstance.getChangedDocumentsSince()` for better performance. -- Added `doesBroadcastChangestream()` to `RxStorageStatics` -- Added `withDeleted` parameter to `RxStorageKeyObjectInstance.findLocalDocumentsById()` -- Added internal `_meta` property to stored document data that contains internal document related data like last-write-time and replication checkpoints. - -## You can help! - -There are many things that can be done by **you** to improve RxDB: - -- Check the [BACKLOG](https://github.com/pubkey/rxdb/blob/master/orga/BACKLOG.md) for features that would be great to have. -- Check the [breaking backlog](https://github.com/pubkey/rxdb/blob/master/orga/before-next-major.md) for breaking changes that must be implemented in the future but where I did not have the time yet. -- Check the [todos](https://github.com/pubkey/rxdb/search?q=todo) in the code. There are many small improvements that can be done for performance and build size. -- Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors. -- Improve the documentation. In the last user survey, many users told me that the documentation is not good enough. But I reviewed the docs and could not find clear flaws. The problem is that I am way too deep into RxDB so that I am not able to understand which documentation a newcomer to the project needs. Likely I assume too much knowledge or focus writing about the wrong parts. -- Update the [example projects](https://github.com/pubkey/rxdb/tree/master/examples) many of them are outdated and need updates. -- Help the next [PouchDB release](https://github.com/pouchdb/pouchdb/issues/8408) to improve RxDBs performance. - ---- - -## RxDB 13.0.0 - A New Era of Replication - -# 13.0.0 - -So in the last major RxDB versions, the focus was set to **improvements of the storage engine**. This is done. RxDB has now [multiple RxStorage implementations](../rx-storage.md), a better query planner and an improved test suite to ensure everything works correct. -This let to huge improvements in write and query performance and decreased the initial pageload of RxDB based applications. - -In the new major version `13.0.0`, the focus was set to improvements to the **replication protocol**. -When I first implemented the GraphQL replication a few years ago, I had a specific use case in mind and designed the whole protocol and replication plugins around that use case. - -But the time has shown, that the old replication protocol is a big downside of RxDB: - - The replication relied on the backend to solve all **conflicts**. This was easy to implement into RxDB because the whole responsibility was given away to the person that has to implement a compatible backend. - - In each point in time, the replication did either push or pull documents, but **never in parallel**. This slows done the whole replication process and makes RxDB not usable for the implementation of features like **multi-user-real-time-collaboration** or when many read- and write operations have to happen in a short timespan. - - After each `push`, a `pull` had to be run to check if the backend had changed the state to solve a conflict. - - The replication protocol did not support attachments and was not designed to ever support them. - -So in version `13.0.0` I replaced the whole replication plugins with a new replication protocol. The main goals have been: - - Push- and Pull in parallel. - - Use the data in the changestream (optional) to decrease replication latency. - - Implement the conflict resolution into RxDB so that the **client resolves its own conflicts** and does not rely on the backend. - - Decrease the complexity for a compatible backend implementation. The new protocol relies on a *dumb* backend. This will open compatibility with many other use cases like implementing [Offline-First in Supabase](https://github.com/supabase/supabase/discussions/357) or using CouchDB but having a faster replication compared to the native CouchDB replication. - - Make it possible to use [CRDTs](https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type) instead of a conflict resolution. - - Design a the protocol in a way to make it possible to add attachments replication in the future. - -On the RxDocument level, the replication works like git, where the fork/client contains all new writes and must be merged with the master/server before it can push its new state to the master/server. - -``` -A---B1---C1---X master/server state - \ / - B1---C2 fork/client state -``` - -For more details, read the [documentation about the new RxDB Sync Engine](../replication.md). - -Backends that have been compatible with the previous RxDB versions `12` and older, will not work with the new replication protocol. To learn how to do that, either read the [docs](../replication.md) or check out the [GraphQL example](https://github.com/pubkey/rxdb/tree/master/examples/graphql). - -## Other breaking changes - -- RENAMED the `ajv-validate` plugin to `validate-ajv` to be in equal with the other validation plugins. -- The `is-my-json-valid` validation is no longer supported until [this bug](https://github.com/mafintosh/is-my-json-valid/pull/192) is fixed. - -- REFACTORED the [schema validation plugins](https://rxdb.info/schema-validation.html), they are no longer plugins but now they get wrapped around any other RxStorage. - - It allows us to run the validation inside of a [Worker RxStorage](../rx-storage-worker.md) instead of running it in the main JavaScript process. - - It allows us to configure which `RxDatabase` instance must use the validation and which does not. In production it often makes sense to validate user data, but you might not need the validation for data that is only replicated from the backend. - -- REFACTORED the [key compression plugin](../key-compression.md), it is no longer a plugin but now a wrapper around any other RxStorage. - - It allows to run the key-compression inside of a [Worker RxStorage](../rx-storage-worker.md) instead of running it in the main JavaScript process. - -- REFACTORED the encryption plugin, it is no longer a plugin but now a wrapper around any other RxStorage. - - It allows to run the encryption inside of a [Worker RxStorage](../rx-storage-worker.md) instead of running it in the main JavaScript process. - - It allows do use asynchronous crypto function like [WebCrypto](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) -- Store the password hash in the same write request as the database token to improve performance. - -- REMOVED support for temporary documents [see here](https://github.com/pubkey/rxdb/pull/3777#issuecomment-1120669088) - -- REMOVED RxDatabase.broadcastChannel The broadcast channel has been moved out of the RxDatabase and is part of the RxStorage. So it is no longer exposed via `RxDatabase.broadcastChannel`. - -- Removed the `liveInterval` option of the replication plugins. It was an edge case feature with wrong defaults. If you want to run the pull replication on interval, you can send a `RESYNC` event manually in a loop. - -- REPLACED `RxReplicationPullError` and `RxReplicationPushError` with normal `RxError` like in the rest of the RxDB code. -- REMOVED the option to filter out replication documents with the push/pull modifiers [#2552](https://github.com/pubkey/rxdb/issues/2552) because this does not work with the new replication protocol. -- CHANGE default of replication `live` to be set to `true`. Because most people want to do a live replication, not a one time replication. - -- RENAMED the `server` plugin is now called `server-couchdb` and `RxDatabase.server()` is now `RxDatabase.serverCouchDB()` - -- CHANGED Attachment data is now always handled as `Blob` because Node.js does support `Blob` since version 18.0.0 so we no longer have to use a `Buffer` but instead can use Blob for browsers and Node.js - -- REFACTORED the layout of `RxChangeEvent` to better match the RxDB requirements and to fix the 'deleted-document-is-modified-but-still-deleted' bug. - -When used with Node.js, RxDB now requires Node.js version `18.0.0` or higher. - -## Other non breaking or internal changes - -- REMOVED many unused plugin hooks because they decreased the performance. -- REMOVE RxStorageStatics `.hash` and `.hashKey` -- CHANGE removed default usage of `md5` as default hashing. Use a faster non-cryptographic hash instead. - - ADD option to pass a custom hash function when calling `createRxDatabase`. -- CHANGE use `Float` instead of `Int` to represent timestamps in GraphQL. - -- FIXED multiple problems with encoding attachments data. We now use the `js-base64` library which properly handles utf-8/binary/ascii transformations. - -- In the RxDB internal `_meta.lwt` field, we now use 2 decimals number of the unix timestamp in milliseconds. -- ADDED `checkpointSchema` to the `RxStorage.statics` interface. - -## New Features - -- ADDED the [websocket replication plugin](../replication-websocket.md) -- ADDED the [FoundationDB RxStorage](../rx-storage-foundationdb.md) - -## Migration to the new version - -Stored data of the previous RxDB versions is not compatible with RxDB `13.0.0`. So if you want to keep that data, you have to migrate it in a way. For most use cases you might want to just drop the data from the client and re-sync it again from the backend. To keep the data locally, you might want to use the [storage migration plugin](../migration-storage.md). - ---- - -## RxDB 14.0 - Major Changes & New Features - -# 14.0.0 - -The release [14.0.0](https://rxdb.info/releases/14.0.0.html) is used for major refactorings and API changes. -The replication or the storage layer have only been touched marginally. - -Notice that only the major changes are listed here. All minor changes can be found in the [changelog](https://github.com/pubkey/rxdb/blob/master/CHANGELOG.md). - -## Removing deprecated features - -The PouchDB RxStorage was deprecated in 13 and has now finally been removed, see [here](../rx-storage-pouchdb.md). -Also the old `replication-couchdb` plugin was removed. Instead we had the `replication-couchdb-new` plugin which was now renamed to `replication-couchdb`. - -## API changes - -### RxDocument objects are now immutable - -At the previous version of RxDB, RxDocuments mutate themself when they receive ChangeEvents from the database. For example when you have a document where `name = 'foo'` and some update changes the state to `name = 'bar'` in the database, then the previous JavaScript object changed its own property to the have `doc.name === 'bar'`. -This feature was great when you use a RxDocument with some change-detection like in angular or vue templates. You can use document properties directly in the template and all updates will be reflected in the view, without having to use observables or subscriptions. - -However this behavior is also confusing many times. When the state in the database is changed, it is not clear at which exact point of time the objects attribute changes. Also the self mutating behavior created some problem with vue- and react-devtools because of how they clone objects. - -In RxDB v14, all RxDocuments are immutable. When you subscribe to a query and the same document is returned in the results, this will always be a new JavaScript object. - -Also `RxDocument.$` now emits `RxDocument` instances instead of the plain document data. - -### Refactor `findByIds()` - -In the past, the functions `findByIds` and `findByIds$` directly returned the result set. This was confusing, instead they now return a `RxQuery` object that works exactly like any other database query. - -```ts -const results = await myRxCollection.findByIds(['foo', 'bar']).exec(); -const results$ = await myRxCollection.findByIds(['foo', 'bar']).$; -``` - -### Rename to RxDocument update/modify functions - -Related issue [#4180](https://github.com/pubkey/rxdb/issues/4180). - -In the past the naming of the document mutation methods is confusing. -For example `update()` works completely different to `atomicUpdate()` and so on. -The naming of all functions was unified and all methods do now have an incremental and a non-incremental version (previously known as `atomic`): -- RENAME `atomicUpdate()` to `incrementalModify()` -- RENAME `atomicPatch()` to `incrementalPatch()` -- RENAME `atomicUpsert()` to `incrementalUpsert()` -- ADD `RxDocument().incrementalUpdate()` -- ADD `RxDocument.incrementalRemove()` -- ADD non-incremental `RxDocument` methods `patch()` and `modify()` - -### Replication is started with a pure function - -In the past, to start a replication, the replication plugin was added to RxDB and a method on the RxCollection was called like `myRxCollection.syncGraphQL()`. -This caused many problems with tree shaking bailouts and having the correct typings. -So instead of having class method on the RxCollection, the replications are now started like: - -```ts -import { replicateCouchDB } from 'rxdb/plugins/replication-couchdb'; -const replicationState = replicateCouchDB({ /* ... */ }); -``` - -### Storage plugins are prefixed with `storage-` - -For better naming, all storage plugins have been prefixed with `storage-` so the imports have been changed: - -```ts -// Instead of -import { getRxStorageDexie } from 'rxdb/plugins/dexie'; -// it is now -import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; -``` - -### Encryption plugin was renamed to `encryption-crypto-js` - -To make it possible to have alternative encryption plugins, the `encryption` plugin was renamed to `encryption-crypto-js`. - -```ts -// Instead of -import { wrappedKeyEncryptionStorage } from 'rxdb/plugins/encryption'; -// it is now -import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; -``` - -### Rewrite the `worker` plugin - -In the past, the [worker plugin](../rx-storage-worker.html) was based on the [threads](https://www.npmjs.com/package/threads) library. It was completely rewritten and uses the plain JavaScript API together with the [remote storage plugin](../rx-storage-remote.md). **BUT** notice that the worker plugin has moved into the [RxDB Premium 👑](/premium/) package. - -## Performance improvements - -### Do not use hash for revisions - -In the past, the `_rev` field of a RxDocument data was filled with a hash of the documents data. This was not the best solution because: -- Hashing in JavaScript is slow, not running hashes on insert improves performance by about 33% -- When 2 clients do the exact same write to the document, it is not clear from comparing the document states because they will have the exact same hash which makes some conflict resolution strategies impossible to implement. - -Instead we now use just use the RxDatabase.token together with the revision height. - -### Batch up incremental operations - -When making multiple writes to different (or the same) document, in the past RxDB made one write call to the storage. When doing fast writes, like when you writhe the current mouse position to a document, the writes could have queued up to the point where the users recognizes performance lag. -In RxDB v14, pending document updates are batched up into single storage writes for better performance. - -### Improved tree shaking - -Many changes have been made to improve [tree shakability](https://webpack.js.org/guides/tree-shaking/) of RxDB which results in smaller bundle sizes and a faster application startup. - -### Refactor the document cache - -The whole RxDocument cache was refactored. It now runs based on the [WeakRef API](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakRef) and automatically cleans up cached documents that are no longer referenced. This reduces the use memory and makes RxDB more suitable for being used in Node.js on the server side. - -Notice that the WeakRef API is only featured in [modern browsers](https://caniuse.com/?search=weakref) so RxDB will no longer run on ie11. - -### No longer transpile some modern JavaScript features - -To reduce the bundle size and improve performance, the following JavaScript features will no longer be transpiled because they are natively supported in modern browsers anyway: - - [async/await](https://caniuse.com/async-functions) - - [Arrow functions](https://caniuse.com/arrow-functions) - - [for...of](https://caniuse.com/?search=for...of) - - [shorthand properties](https://caniuse.com/mdn-javascript_operators_object_initializer_shorthand_property_names) - - [Spread operator](https://caniuse.com/?search=spread%20operator) - - [destructuring](https://caniuse.com/?search=destructuring) - - [default parameters](https://caniuse.com/?search=default%20parameters) - - [object spread](https://caniuse.com/?search=Object%20spread) - -All these optimizations together reduced the [test-bundle](https://github.com/pubkey/rxdb/blob/master/config/bundle-size.js) size from `74148` bytes down to `36007` bytes. - -## Other changes -- ADD `push/pull.initialCheckpoint` to start a replication from a given checkpoint. -- The following plugins are out of beta mode: - - [RxStorage Sharding](../rx-storage-sharding.md) - - [RxStorage Remote](../rx-storage-remote.md) - - [RxStorage FoundationDB](../rx-storage-foundationdb.md) - - [New Replication CouchDB](../replication-couchdb.md) - - [Cleanup Plugin](../cleanup.md) - -## Bugfixes -- CHANGE (memory RxStorage) do not clean up database state on closing of the storage, only on `remove()`. -- FIX CouchDB replication: Use correct default fetch method. -- FIX schema hashing should respect the sort order [#4005](https://github.com/pubkey/rxdb/pull/4005) -- FIX replication does not provide a `._rev` to the storage write when a conflict is resolved. -- FIX(remote storage) ensure caching works properly even on parallel create-calls -- FIX(replication) Composite Primary Keys broken on replicated collections [#4190](https://github.com/pubkey/rxdb/pull/4190) -- FIX(sqlite) $in Query not working SQLite [#4278](https://github.com/pubkey/rxdb/issues/4278) -- FIX CouchDB push is throwing error because of missing revision [#4299](https://github.com/pubkey/rxdb/pull/4299) -- ADD dev-mode shows a `console.warn()` to ensure people do not use it in production. -- Remove the usage of `Buffer`. We now use `Blob` everywhere. -- FIX import of socket.io [#4307](https://github.com/pubkey/rxdb/pull/4307) -- FIX Id length limit reached with composite key [#4315](https://github.com/pubkey/rxdb/issues/4315) -- FIX `$regex` query not working on remote storage. -- FIX SQLite must store attachments data as Blob instead of base64 string to reduce the database size. -- FIX CouchDB replication conflict handling -- CHANGE Encryption plugin was renamed to `encryption-crypto-js` -- FIX replication state meta data must also be encrypted. - -## Migration from 13.x.x to 14.0.0 - -The way RxDB hashes and normalizes a schema has changed. To migrate stored data between the RxDB versions, therefore you have to increase your schema version by `1` and add a migration strategy. - -For some storages, the stored data of the previous RxDB versions is not compatible with RxDB `14.0.0`. So if you want to keep that data, you have to migrate it in a way. For most use cases you might want to just drop the data from the client and re-sync it again from the backend. To keep the data locally, you might want to use the [storage migration plugin](../migration-storage.md). - -## You can help! - -There are many things that can be done by **you** to improve RxDB: - -- Check the [BACKLOG](https://github.com/pubkey/rxdb/blob/master/orga/BACKLOG.md) for features that would be great to have. -- Check the [breaking backlog](https://github.com/pubkey/rxdb/blob/master/orga/before-next-major.md) for breaking changes that must be implemented in the future but where I did not have the time yet. -- Check the [todos](https://github.com/pubkey/rxdb/search?q=todo) in the code. There are many small improvements that can be done for performance and build size. -- Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors. -- Update the [example projects](https://github.com/pubkey/rxdb/tree/master/examples) many of them are outdated and need updates. - ---- - -## RxDB 15.0.0 - Major Migration Overhaul - -# 15.0.0 - -The release [15.0.0](https://rxdb.info/releases/15.0.0.html) is used for major refactorings in the migration plugins and performance improvements of the RxStorage implementations. - -## LinkedIn - -Stay connected with the latest updates and network with professionals in the RxDB community by following RxDB's [official LinkedIn page](https://www.linkedin.com/company/rxdb)! - -## Performance - -Performance has improved a lot. Much work has been done to reduce the CPU footprint of RxDB so that when writes and reads are performed on the database, the JavaScript process can start updating the UI much faster. -Also there have been a lot of improvements to the [IndexedDB RxStorage](../rx-storage-indexeddb.md) which now runs in a **Write-Ahead Logging (WAL)** mode which makes write operations about 4x as fast. -The whole RxStorage interface has been optimized so that it has to run less operations which improves overall performance. [Read more](../rx-storage-performance.md) - - - - - -## Replication - -Replication options (like url), are no longer used as replication state identifier. Changing the url without having to restart the replication, is now possible. This is useful if you change your replication url (like `path/v3/`) on schema changes and you do not want to restart the replication from scratch. You can even swap the replication plugin while still keeping the replication state. The [couchdb replication](../replication-couchdb.md) now also requires an `replicationIdentifier`. - -The replication meta data is now also compressed when the [KeyCompression Plugin](../key-compression.md) is used. - -The replication-protocol does now support attachment replication. This clears the path to add the attachment replication to the other RxDB replication plugins. - -## Rewrite schema version migration - -The [schema migration plugin](../migration-schema.md) has been fully rewritten from scratch. - -From now on it internally uses the replication protocol to do a one-time replication from the old collection to the new one. This makes the code more simple and ensures that canceled migrations (when the user closes the browser), can continue from the correct position. - -Replication states from the [RxReplication](../replication.md) are also migrated together with the normal data. -Previously a migration dropped the replication state which required a new replication of all data from scratch, even if the -client already had the same data as the server. Now the `assumedMasterState` and `checkpoint` are also migrated so that -the replication will continue from where it was before the migration has run. - -Also it now handles multi-instance runtimes correctly. If multiple browser tabs are open, only one of them (per RxCollection) will run the migration. -Migration state events are propagated across browser tabs. - -Documents with `_deleted: true` will also be migrated. This ensures that non-pushed deletes are not dropped during migrations and will -still be replicated if the client goes online again. - -## Set `eventReduce:true` as default - -The [EventReduce algorithm](https://github.com/pubkey/event-reduce) is now enabled by default. - -## Use `crypto.subtle.digest` for hashing - -Using `crypto.subtle.digest` from the native WebCrypto API is much faster, so RxDB now uses that as a default. If the API is not available, like in React-Native, the [ohash](https://github.com/unjs/ohash) module is used instead. Also any custom `hashFunction` can be provided when creating the [RxDatabase](../rx-database.md). The `hashFunction` must now be async and return a Promise. - -## Fix attachment hashing - -Hashing of attachment data to calculate the `digest` is now done from the RxDB side, not the RxStorage. If you set a custom `hashFunction` for the database, it will also be used for attachments `digest` meta data. - -## Requires at least typescript version 5.0.0 - -We now use `export type * from './types';` so RxDB will not work on typescript versions older than 5.0.0. - -## Require string based `$regex` - -Queries with a `$regex` operator must now be defined as strings, not with `RegExp` objects. You can still pass RegExp's flags in `$options` parameter. `RegExp` are mutable objects, which was dangerous and caused hard-to-debug problems. -Also stringification of the $regex had bad performance but is required to send queries from RxDB to the RxStorage. - -## Refactor dexie.js RxStorage - -The [dexie.js storage](../rx-storage-dexie.md) was refactored to add some missing features: -- [Attachment](../rx-attachment.md) support -- Support for boolean indexes - -## RxLocalDocument.$ emits a document instance, not the plain data - -This was changed in [v14](./14.0.0.md) for a normal RxDocument.$ which emits RxDocument instances. Same is now also done for [local documents](../rx-local-document.md). - -## Fix return type of .bulkUpsert - -Equal to other bulk operations, `bulkUpsert` will now return an `error` and a `success` array. This allows to filter for validation errors and handle them properly. - -## Add dev-mode check for disallowed $ref fields - -RxDB cannot resolve `$ref` fields in the schema because it would have a negative performance impact. -We now have a dev-mode check to throw a helpful error message if $refs are used in the schema. - -## Improve RxDocument property access performance - -We now use the Proxy API instead of defining getters on each nested property. Also fixed [#4949](https://github.com/pubkey/rxdb/pull/4949) - -`patternProperties` is now allowed on the non-top-level of a schema [#4951](https://github.com/pubkey/rxdb/pull/4951) - -## Add deno support - -The RxDB test suite now also runs in the [deno](https://deno.com/) runtime. Also there is a [DenoKV](https://rxdb.info/rx-storage-denokv.html) based RxStorage to use with Deno Deploy. - -## Memory RxStorage - -Rewrites of the [Memory RxStorage](../rx-storage-memory.md) for better performance. -- Writes are 3x faster -- Find-by id is 2x faster - -## Memory-Synced storage no longer supports replication+migration - -The [memory-synced storage](../rx-storage-memory-synced.md) itself does not support replication and migration. This was allowed in the past, but dangerous so now there is an error that throws. -Instead you should replicate the underlying parent storage. Notice that this is only for the [memory-synced storage](../rx-storage-memory-synced.md), NOT for the normal [memory storage](../rx-storage-memory.md). There the replication works like before. - -## Added Logger Plugin - -I added a [logger plugin](../logger.md) to detect performance problems and errors. - -## Documentation is now served by docusaurus - -In the past we used gitbook which is no longer maintained and had some major issues. Now the documentation of RxDB is rendered and served with [docusaurus](https://docusaurus.io/) which has a better design and maintenance. - -## Replaced `modfijs` with `mingo` package - -In the past, the [modifyjs](https://github.com/lgandecki/modifyjs) was used for the `update` plugin. This was replaced with the [mingo library](https://github.com/kofrasa/mingo) which is more up to date and already used in RxDB for the query engine. - -## Changes to the RxStorage interface - -We no longer have `RxStorage.statics.prepareQuery()`. Instead all storages get the same prepared query as input for the `.query()` method. If a storage requires some transformations, it has to do them by itself before running the query. This change simplifies the whole RxDB code base a lot and the previous assumption of having a better performance by pre-running the query preparation, turned out to be not true because the query planning is quite fast. - -Removed the `RxStorage.statics` property. This makes configuration easier especially for the remote storage plugins. - -The RxStorage itself will now return `_deleted=true` documents on the `.query()` method. This is required for upcoming plugins like the server plugin where it must be able to run queries on deleted documents. -Notice that this is only for the RxStorage itself, RxDB queries will run like normal and NOT contain deleted documents in their results. - -Changed the response type of RxStorageInstance.bulkWrite() from indexed (by id) objects to arrays for better performance. - -## Other changes - -- Added `RxCollection.cleanup()` to manually call the [cleanup functions](../cleanup.md). -- Rename send$ to sent$: `myRxReplicationState.send$.subscribe` works only if the sending is successful. Therefore, it is renamed to `sent$`, not `send$`. -- We no longer ship `dist/rxdb.browserify.js` and `dist/rxdb.browserify.min.js`. If you need these, build them by yourself. -- The example project for vanilla javascript was outdated. I removed it to no longer confuse new users. -- REPLACE `new Date().getTime()` with `Date.now()` which is [2x faster](https://stackoverflow.com/questions/12517359/performance-date-now-vs-date-gettime). -- Renamed replication-p2p to replication-webrtc. I will add more p2p replication plugins in the future, which are not based on [WebRTC](../replication-webrtc.md). -- REMOVED `RxChangeEvent.eventId`. If you really need a unique ID, you can craft your own one based on the document `_rev` and `primary`. -- REMOVED `RxChangeEvent.startTime` and `RxChangeEvent.endTime` so we do not have to call `Date.now()` once per write row. -- ADDED `EventBulk.startTime` and `EventBulk.endTime`. -- FIX `database.remove()` does not work on databases with encrypted fields. -- FIX [react-native: replaceAll is not a function](https://github.com/pubkey/rxdb/pull/5187) -- FIX Throttle calls to forkInstance on push-replication to not cause memory spikes and lagging UI -- FIX PushModifier applied to pre-change legacy document, resulting in old document sent to endpoint [#5256](https://github.com/pubkey/rxdb/issues/5256) -- [Attachment compression](../rx-attachment.md#attachment-compression) is now using the native `Compression Streams API`. -- FIX [#5311](https://github.com/pubkey/rxdb/issues/5311) URL.createObjectURL is not a function in a browser plugin environment(background.js) -- FIX `structuredClone` not available in ReactNative [#5046](https://github.com/pubkey/rxdb/issues/5046#issuecomment-1827374498) -- The following things moved out of beta: - - [Firestore replication](../replication-firestore.md) - - [WebRTC replication](../replication-webrtc.md) - - [NATS replication](../replication-nats.md) - - [OPFS RxStorage](../rx-storage-opfs.md) - -## Changes to the 👑 Premium Plugins - -### storage-migration plugin moved from premium to open-core - -The storage migration plugin can be used to migrate data between different RxStorage implementation or to migrate data between major RxDB versions. This previously was a 👑 premium plugin, but now it is part of the open-core. Also the params syntax changed a bit [read more](../migration-storage.md). - -### Changes in pricing - -The pricing of the premium plugins was changed. This makes it cheaper for smaller companies and single individuals. - -### Added perpetual license option - -By default you are not allowed to use the premium plugins after the -license has expired and you will no longer be able to install them. But -you can choose the **Perpetual license** option. With the perpetual -license option, you can still use the plugins even after the license is -expired. But you will no longer get any updates from newer RxDB -versions. - -## You can help! - -There are many things that can be done by **you** to improve RxDB: - -- Check the [BACKLOG](https://github.com/pubkey/rxdb/blob/master/orga/BACKLOG.md) for features that would be great to have. -- Check the [breaking backlog](https://github.com/pubkey/rxdb/blob/master/orga/before-next-major.md) for breaking changes that must be implemented in the future but where I did not have the time yet. -- Check the [todos](https://github.com/pubkey/rxdb/search?q=todo) in the code. There are many small improvements that can be done for performance and build size. -- Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors. -- Update the [example projects](https://github.com/pubkey/rxdb/tree/master/examples) some of them are outdated and need updates. - ---- - -## RxDB 16.0.0 - Efficiency Redefined - -# 16.0.0 - -The release [16.0.0](https://rxdb.info/releases/16.0.0.html) is used for major refactorings. We did not change that much, mostly renaming things and fixing confusing implementation details. - -Data stored in the previous version `15` is compatible with the code of the new version `16` for most RxStorage implementation. So migration will be easy. -Only the following RxStorage implementations are required to migrate the data itself with the [storage migration plugin](../migration-storage.md): -- SQLite RxStorage -- NodeFilesystem RxStorage -- OPFS RxStorage - -## Breaking Changes -- CHANGE [RxServer](https://rxdb.info/rx-server.html) is no longer in beta mode. -- CHANGE [Fulltext Search](https://rxdb.info/fulltext-search.html) is no longer in beta mode. -- CHANGE [Custom Reactivity](https://rxdb.info/reactivity.html) is no longer in beta mode. -- CHANGE [initialCheckpoint in replications](https://rxdb.info/replication.html) is no longer in beta mode. -- CHANGE [RxState](https://rxdb.info/rx-state.html) is no longer in beta mode. -- CHANGE [MemoryMapped RxStorage](https://rxdb.info/rx-storage-memory-mapped.html) is no longer in beta mode. -- CHANGE rename `randomCouchString()` to `randomToken()` -- FIX (GraphQL replication) datapath must be equivalent for pull and push [#6019](https://github.com/pubkey/rxdb/pull/6019) -- REMOVE fallback to the `ohash` package when `crypto.subtle` does not exist. All modern runtimes (also react-native) now support `crypto.subtle`, so we do not need that fallback anymore. - -### Removed deprecated LokiJS RxStorage - -The [LokiJS RxStorage](https://rxdb.info/rx-storage-lokijs.html) was deprecated because LokiJS itself is no longer maintained. Therefore it will be removed completely. If you still need that, you can fork the code of it and publish it in an own package and link to it from the [third party plugins page](https://rxdb.info/third-party-plugins.html). - -### Renamed `.destroy()` to `.close()` -Destroy was adapted from PouchDB, but people often think this deletes the written data. `close` is a better name for that functionality. -- Also renamed similar functions/attributes: - - `.destroy()` to `.close()` - - `.onDestroy()` to `.onClose()` - - `postDestroyRxCollection` to `postCloseRxCollection` - - `preDestroyRxDatabase` to `preCloseRxDatabase` - -### `ignoreDuplicate: true` on `createRxDatabase()` must only be allowed in dev-mode. -The `ignoreDuplicate` flag is only useful for tests and should never be used in production. We now throw an error if it is set to `true` in non-dev-mode. - -### When dev-mode is enabled, a schema validator must be used. -Many reported issues come from people storing data that is not valid to their schema. -To fix this, in dev-mode it is now required that at least one schema validator is used. - -### Removed the memory-synced storage - -The memory-synced RxStorage was removed in RxDB version 16. Please use the `memory-mapped` storage instead which has better trade-offs and is easier to configure. - -### Split conflict handler functionality into `isEqual()` and `resolve()`. - -Because the handler is used in so many places it becomes confusing to write a proper conflict handler. -Also having a handler that requires user interaction is only possible by hackingly using the context param. -By splitting the functionalities it is easier to learn where the handlers are used and how to define them properly. - -## Full rewrite of the OPFS and Filesystem-Node RxStorages - -The [OPFS](../rx-storage-opfs.md) and [Filesystem-Node](../rx-storage-filesystem-node.md) RxStorage had problems with storing emojis and other special characters inside of indexed fields. -I completely rewrote them and improved performance especially on initial load when a lot of data is stored already and when doing many small writes/reads at the same time on in series. - -## Internal Changes - -- CHANGE (internal) migration-storage plugin: Remove catch from cleanup -- CHANGE (internal) rename RX_PIPELINE_CHECKPOINT_CONTEXT to `rx-pipeline-checkpoint` -- CHANGE (internal) remove `conflictResultionTasks()` and `resolveConflictResultionTask()` from the RxStorage interface. -- REMOVED (internal) do not check for duplicate event bulks, all RxStorage implementations must guarantee to not emit the same events twice. -- REFACTOR (internal) Only use event-bulks internally and only transform to single emitted events if actually someone has subscribed to the eventstream. - -## Bugfixes - -- Having a lot of documents pulled in the replication could in some cases slow down the database initialization because `upstreamInitialSync()` did not set a checkpoint and each time checked all documents if they are equal to the master. -- If the handler of a [RxPipeline](../rx-pipeline.md) throws an error, block the whole pipeline and emit the error to the outside. -- Throw error when dexie.js RxStorage is used with optional index fields [#6643](https://github.com/pubkey/rxdb/pull/6643#issuecomment-2505310082). -- Fix IndexedDB bug: Some people had problems with the IndexedDB RxStorage that opened up collections very slowly. If you had this problem, please try out this new version. -- Add check to ensure remote instances are build with the same RxDB version. This is to ensure if you update RxDB and forget to rebuild your workers, it will throw instead of causing strange problems. -- When the pulled documents in the replication do not match the schema, do not update the checkpoint. -- When the pushed document conflict results in the replication do not match the schema, do not update the checkpoint. - -## Other - -- Added more [performance tests](https://rxdb.info/rx-storage-performance.html) -- The amount of collections in the open source version has been limited to `16`. -- Moved RxQuery checks into dev-mode. -- RxQuery.remove() now internally does a bulk operation for better performance. -- Lazily process bulkWrite() results for less CPU usage. -- Only run interval cleanup on the storage of a collection if there actually have been writes to it. -- Schema validation errors (code: 422) now include the `RxJsonSchema` for easier debugging. -- Added an interval to prevent browser tab hibernation while a replication is running. - -## You can help! - -There are many things that can be done by **you** to improve RxDB: - -- Check the [BACKLOG](https://github.com/pubkey/rxdb/blob/master/orga/BACKLOG.md) for features that would be great to have. -- Check the [breaking backlog](https://github.com/pubkey/rxdb/blob/master/orga/before-next-major.md) for breaking changes that must be implemented in the future but where I did not have the time yet. -- Check the [todos](https://github.com/pubkey/rxdb/search?q=todo) in the code. There are many small improvements that can be done for performance and build size. -- Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors. -- Update the [example projects](https://github.com/pubkey/rxdb/tree/master/examples) some of them are outdated and need updates. - -## LinkedIn - -Stay connected with the latest updates and network with professionals in the RxDB community by following RxDB's [official LinkedIn page](https://www.linkedin.com/company/rxdb)! - ---- - -## RxDB 17.0.0 - -# RxDB 17.0.0 (beta) - -RxDB 17 focuses on **better reactivity**, **improved debugging**, and **important storage fixes**, while also graduating several long-standing plugins out of beta. - -Most applications can upgrade easily, but **users of OPFS and filesystem-based storages must review the migration notes carefully**. - -:::note -RxDB version 17 is currently in **beta**. For testing, please install the latest beta version [from npm](https://www.npmjs.com/package/rxdb?activeTab=versions) and provide feedback or report issues [on GitHub](https://github.com/pubkey/rxdb/issues/7574). -::: - -## Migration - -RxDB 17 is mostly backward-compatible, but please review the following points before upgrading: - -### Storage migration required -If you use any of the following storages, **you must migrate your data** using the [storage migrator](../migration-storage.md): - -- OPFS RxStorage -- Filesystem RxStorage (Node) -- IndexedDB RxStorage (if you use attachments) - -For all other RxStorages, data created with RxDB v16 can be reused directly in RxDB v17. - -### Other migration notes - -- The GitHub repository **no longer contains prebuilt `dist` files**. - Install RxDB from npm or run the build scripts locally. -- `toggleOnDocumentVisible` now defaults to **`true`**. [#6810](https://github.com/pubkey/rxdb/issues/6810) -- Schema fields marked as `final` **no longer need to be explicitly listed as `required`**. -- Some integrations now use **optional peer dependencies**. You may need to install them manually: - - `firebase` - - `mongodb` - - `nats` - -## CHANGES - -### Features - -- Added [react-hooks plugin](../react.md). - -### 🔁 Reactivity & APIs - -- **ADD** `RxDatabase.collections$` observable for reactive access to collections -- **ADD** support for the JavaScript `using` keyword to automatically remove databases in tests -- **ADD** new `reactivity-angular` package -- **CHANGE** moved `reactivity-vue` and `reactivity-preact-signals` from premium to core -- **FIX** query results becoming incorrect when changes occur faster than query update [#7067](https://github.com/pubkey/rxdb/issues/7067) - -### 🧠 Debugging & Developer Experience - -- **ADD** `context` field to all RxDB write errors for easier debugging -- **ADD** improved OPFS RxStorage error logging in `devMode`, including: - - strict `TextDecoder` mode - - detailed decoding error output -- **ADD** internal `WeakRef` TypeScript types so users no longer need to enable `ES2021.WeakRef` -- **ADD** [llms.txt](https://rxdb.info/llms.txt) for LLM-friendly documentation access -- **CHANGE** `toggleOnDocumentVisible` now defaults to `true` [#6810](https://github.com/pubkey/rxdb/issues/6810) - -### 🗄️ Storage & Replication Fixes - -- **FIX** OPFS RxStorage memory and cleanup leaks -- **FIX** memory-mapped storage not purging deleted documents -- **FIX** `RxCollection.cleanup()` ignoring `minimumDeletedTime` -- **FIX** short primary key lengths not matching replication schema [#7587](https://github.com/pubkey/rxdb/issues/7587) -- **FIX** retry DenoKV commits when encountering `"database is locked"` errors -- **FIX** close broadcast channels and leader election **after** database shutdown, not during -- **CHANGE**: Store data as binary in IndexedDB to use less disc space. -- **CHANGE**: Pull-Only replications no longer store the server metadata on the client. - -### 📐 Schema & Index Validation - -- **ADD** enforce maximum length for indexes and primary keys (`maxLength: 2048`) -- **CHANGE** `final` schema fields no longer need to be marked as `required` - -### ⚙️ Performance & Internal Changes - -- **CHANGE** replace `appendToArray()` with `Array.concat()` for better browser-level optimizations -- **ADD** ensure indexes and primary keys are validated consistently across replication schemas - -### 🔌 Plugins Graduating from Beta - -The following plugins are **no longer in beta** and are now considered production-ready: - -- Replication Appwrite -- Replication Supabase -- Replication MongoDB -- RxStorage MongoDB -- RxStorage Filesystem (Node) -- RxStorage DenoKV -- Attachment replication -- CRDT Plugin -- RxPipeline - -## You can help! - -There are many things that can be done by **you** to improve RxDB: - -- Check the [BACKLOG](https://github.com/pubkey/rxdb/blob/master/orga/BACKLOG.md) for features that would be great to have. -- Check the [breaking backlog](https://github.com/pubkey/rxdb/blob/master/orga/before-next-major.md) for breaking changes that must be implemented in the future but where I did not have the time yet. -- Check the [todos](https://github.com/pubkey/rxdb/search?q=todo) in the code. There are many small improvements that can be done for performance and build size. -- Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors. -- Update the [example projects](https://github.com/pubkey/rxdb/tree/master/examples) some of them are outdated and need updates. - -## LinkedIn - -Stay connected with the latest updates and network with professionals in the RxDB community by following RxDB's [official LinkedIn page](https://www.linkedin.com/company/rxdb)! - - - ---- - -## Meet RxDB 8.0.0 - New Defaults & Performance - -# 8.0.0 - -When I created RxDB, two years ago, there where some things that I did not consider and other things that I just decided wrong. -With the breaking version `8.0.0` I rewrote some parts of RxDB and changed the API a bit. The focus laid on **better defaults** and **better performance**. - -## disableKeyCompression by default - -Because the keyCompression was confusing and most users do not use it, it is now disabled by default. Also the naming was bad, so `disableKeyCompression` is now renamed to `keyCompression` which defaults to `false`. - -## collection() now only accepts a RxJsonSchema as schema - -In the past, it was allowed to set an `RxSchema` or an `RxJsonSchema` as `schema`-field when creating a collection. This was confusing and so it is now only allowed to use `RxJsonSchema`. - -## required fields have to be set via array - -In the past it was allowed to set a field as required by setting the boolean value `required: true`. -This is against the [json-schema-standard](https://json-schema.org/understanding-json-schema/reference/object.html#required-properties) and will make problems when switching between different schema-validation-plugins. Therefore required fields must now be set via `required: ['fieldOne', 'fieldTwo']`. - -## Setters are only callable on temporary documents - -To be similar to mongoosejs, there was the possibility to set a documents value via `myDoc.foo = 'bar'` and later call `myDoc.save()` to persist these changes. -But there was the problem that we have no weak pointers in javascript and therefore we have to store all document-instances in a cache to run change-events on them and make them 'reactive'. To save memory-space, we reuse the same documents when they are used multiple times. This made it hard to determine what happens when multiple parts of an application used the setters at the same time. Also there was an undefined behavior what should happen when a field is changed via setter and also via replication before `save()` was called. - -- `myDoc.age = 50;`, `myDoc.set('age', 50);` and `myDoc.save()` is no more allowed on non-temporary-documents -- Instead, to change document-data, use `RxDocument.atomicUpdate()` or `RxDocument.atomicSet()` or `RxDocument.update()`. -- The following document-methods no longer exist: `synced$`, `resync()` - -## middleware-hooks contain plain json as first parameter and RxDocument as second - -When the middleware-hooks where created, the goal was to work equal then [mongoose](http://mongoosejs.com/docs/middleware.html). But this is not possible because mongoose is more 'static' and its documents never change their attributes. RxDB is a reactive database and when the state on disc changes, the attributes of the document also change. This caused some undefined behavior especially with async middleware-hooks. To solve this, hooks now can only modify the plain data, not the `RxDocument` itself. - -```javascript -myCollection.preSave(function(data, rxDocument) { - // to set age to 50 before saving, change the first parameter - data.age = 50; -}, false); -``` - -## multiInstance is now done via broadcast-channel - -Because the [BroadcastChannel-API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API) is not usable in all browsers and also not in NodeJs, multiInstance-communication was hard. The hacky workaround was to use a pseudo-socket and regularly check if an other instance has emitted a `RxChangeEvent`. -This was expensive because even when the database did nothing, we wasted disk-IO and CPU by handling this. - -To solve this waste, I spend one month creating [a module that polyfills the broadcast-channel-api](https://github.com/pubkey/broadcast-channel) so it works on old browsers, new browsers and even NodeJs. This does not only waste less resources but also has a lower latency. Also the module is used by more projects than RxDB which allows use the fix bugs and improve performance together. - -## Set QueryChangeDetection via RxDatabase-option - -In the past, the QueryChangeDetection had to be enabled by importing the QueryChangeDetection and calling a function on it. This was strange and also did not allow to toggle the QueryChangeDetection on specific databases. -Now we set the QueryChangeDetection by adding the boolean field `queryChangeDetection: true` when creating the database. - -```javascript -const db = await RxDB.create({ - name: 'heroesdb', - adapter: 'idb', - queryChangeDetection: false // <- queryChangeDetection (optional, default: false) -}); -console.dir(db); -``` - -## Reuse an RxDocument-prototype per collection instead of adding getters/setters to each document - -Because the fields of an `RxDocument` are defined dynamically by the schema and we could not use the `Proxy`-Object because it is not supported in IE11, there was one workaround used: Each time a document is created, all getters and setters where applied on it. This was expensive and now we use a different approach. -Once per collection, a custom RxDocument-prototype and constructor is created and each RxDocument of this collection is created with the constructor. This change is a rewrite internally and should not change anything for RxDB-users. If you use RxDB with vuejs, you might get some problems that can be fixed by upgrading vuejs to the latest version. - -## Rewritten the inMemory-plugin - -The inMemory-plugin was written with some wrong estimations. I rewrote it and added much more tests. Also `awaitPersistence()` can now be used to check if all writes have already been replicated into the parent collection. Also `RxCollection.watchForChanges()` got split out from the `replication`-plugin into its own `watch-for-changes`-plugin because it is used in the inMemory and the replication functionality. - -## Some comparisons - -(Tested with node 10.6.0 and the memory-adapter, lower is better) - -Reproduce with `npm run build:size` and `npm run test:performance` - -| | 7.7.1 | 8.0.0 | -| :-------------------------------------------: | :-----: | ---------- | -| Bundle-Size (Webpack+minify+gzip) | 110 kb | 101.962 kb | -| Spawn 1000 databases with 5 collections each | 8744 ms | 9906 ms | -| insert 2000 documents | 8006 ms | 5781 ms | -| find 10.000 documents | 3202 ms | 1312 ms | - ---- - -## RxDB 9.0.0 - Faster & Simpler - -# 9.0.0 - -So I was working hard the past month to prepare everything for the next major release of RxDB. The last major release was 1,5 years ago by the way. - -When I started [listing up the planned changes](https://github.com/pubkey/rxdb/issues/1636) I had big ambitions about basically rewriting everything. But I found out this time has not come yet. There is some work to be done first. So version `9.0.0` was more about fixing all these small things that made improving the codebase difficult. Much has been refactored and moved. Some API-parts have been changed to have a more simple project with a cleaner codebase. - -Notice that I use major releases to bundle stuff that breaks the RxDB usage in your project. By having only few major releases you can be sure that you can upgrade in one big block instead of changing stuff each few months. Big features are released in non-major releases because they mostly can be implemented without side effects. - -## Breaking changes - -You have to apply these changes to your codebase when upgrading RxDB. - -### All default exports have been removed - -Using default exports and imports can be helpful when you want to write code fast. -But using them also disabled the tree-shaking of your bundler which means you added much code to your bundle that was not even used. To prevent this common behavior, I removed all default exports and renamed functions so that they are more unlikely to clash with other non-RxDB function names. - -Instead of doing - -```typescript -import RxDB from 'rxdb'; -RxDB.plugin(/* ... */); -await RxDB.create({/* ... */}); -``` - -You now do - -```typescript -import { createRxDatabase, addRxPlugin } from 'rxdb'; -addRxPlugin(/* ... */); -await createRxDatabase({/* ... */}); -``` - -Also `removeDatabase()` is renamed to `removeRxDatabase()` and `plugin()` is now `addRxPlugin()`. - -Same goes for all previous default exports of the plugins. - -### Indexes are specified at the top level of the schema definition - -[related issue](https://github.com/pubkey/rxdb/issues/1655) - -In the past the indexes of a collection had to be specified at the field level of the schema like - -```json -{ - "firstName": { - "type": "string", - "index": true - } -} -``` - -This made it complex to list up the index fields which had a bad performance on startup. -To fix this the indexes are now specified at the top level of the schema like - -```json -{ - "title": "my schema", - "version": 0, - "type": "object", - "properties": {}, - "indexes": [ - "firstName", - ["compound", "index"] - ] -} -``` - -### Encrypted fields at the top level of the schema - -Same as the indexes, encrypted fields are now also defined in the top level like - -```json -{ - "title": "my schema", - "version": 0, - "type": "object", - "properties": {}, - "encrypted": [ - "password" - ] -} -``` - -### New dev-mode plugin - -In the past we had stuff that is only wanted for development in the two plugins `error-messages` and `schema-check`. - -Now we have a single plugin `dev-mode` that contains all these checks and development helper functions. I also moved many other checks out of the core-module into dev-mode. - -```typescript -import { RxDBDevModePlugin } from 'rxdb/plugins/dev-mode'; -addRxPlugin(RxDBDevModePlugin); -``` - -### New migration plugin - -The data migration was not used by all users of this project. Often it was easier to just wipe the local data store and let the client sync everything from the server. Because the migration has so much code, it is now in a separate plugin so that you do not have to ship this code to the clients if not necessary. - -```typescript -import { RxDBMigrationPlugin } from 'rxdb/plugins/migration'; -addRxPlugin(RxDBMigrationPlugin); -``` - -### Rewritten key-compression - -The key-compression logic was fully coded only for RxDB. This was a problem because it was not usable for other stuff and also badly tested. We had a known problem with nested arrays that caused much confusion because some queries did not find the correct documents. - -I now created a npm-package [jsonschema-key-compression](https://github.com/pubkey/jsonschema-key-compression) that has cleaner code, better tests and can also be used for non-RxDB stuff. - -If you used the key-compression in the past and have clients out there with old data, you have to find a way to migrate that data by using the json-import or other solutions depending on your project. - -### Rewritten query-change-detection to event-reduce - -One big benefit of having a [realtime database](../articles/realtime-database.md) is that big performance optimizations can be done when the database knows a query is observed and the updated results are needed continuously. In the past this optimization was done by the internal `queryChangeDetection` which was a big tree of if-else-statements that hopefully worked. This was also the reason why queryChangeDetection was in beta mode and not enabled by default. - -After months of research and testing I was able to create [Event-Reduce: An algorithm to optimize database queries that run multiple times](https://github.com/pubkey/event-reduce). This JavaScript module contains an algorithm that is able to optimize realtime queries in a way that was not possible before. The algorithm is not RxDB specific and also heavily tested. - -Instead of setting `queryChangeDetection` when creating a `RxDatabase`, you now set `eventReduce` which defaults to `true`. - -### find() and findOne() now accepts the full mango query - -In the past, only the selector of a query could be passed to `find()` and `findOne()` if you wanted to also do `sort`, `skip` or `limit`, you had to call additional functions like - -```typescript -const query = myRxCollection.find({ - age: { - $gt: 10 - } -}).sort('name').skip(5).limit(10); -``` - -Now you can pass the full query to the function call like - -```typescript -const query = myRxCollection.find({ - selector: { - age: { - $gt: 10 - } - }, - sort: [{name: 'asc'}], - skip: 5, - limit: 10 -}); -``` - -### moved query builder to own plugin - -The query builder that allowed to create queries like `.where('foo').eq('bar')` etc. was not really used by many people. Most of the time it is better to just pass the full query as simple json object. Also the code for the query builder was big and increased the build size much more than its value added. Only some edge-cases where recursive query modification was needed made the query builder useful. If you still want to use the query builder, you have to import the plugin. - -```typescript -import { RxDBQueryBuilderPlugin } from 'rxdb/plugins/query-builder'; -addRxPlugin(RxDBQueryBuilderPlugin); -``` -### Refactored RxChangeEvent - -The whole data structure of `RxChangeEvent` was way more complicated than it had to be. I refactored the whole class to be more simple. If you directly use `RxChangeEvent` in your project you have to adapt to these changes. Also the stream of `RxDatabase().$` will no longer emit the `COLLECTION` event when a new collection is created. - -### Internal hash() is now using a salt - -The internal hash function was used to store hashes of database passwords to compare them and directly throw errors when the wrong password was used with an existing data set. This was dangerous because you could use rainbow tables or even [just google](https://www.google.com/search?q=e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4) the hash to find out the plain password. So now the internal hashing is using a salt to prevent these attacks. If you have used the encryption in the past, you have to migrate your internal schema storage. - -### Changed default of RxDocument.toJSON() - -By default `RxDocument.toJSON()` always returned also the `_rev` field and the `_attachments`. This was confusing behavior which is why I changed the default to `RxDocument().toJSON(withRevAndAttachments = false)` - -### Typescript 3.8.0 or newer is required - -Because RxDB and some subdependencies extensively use `export type ...` you now need typescript `3.8.0` or newer. - -### GraphQL replication will run a schema validation of incoming data -In dev-mode, the GraphQL-replication will run a schema validation of each document that comes from the server before it is saved to the database. - -## Internal and other changes - -I refactored much internal stuff and moved much code out of the core into the specific plugins. - -* Renamed `RxSchema.jsonID` to `RxSchema.jsonSchema` -* Moved remaining stuff of leader-election from core into the plugin -* Merged multiple internal databases for metadata into one `internalStore` -* Removed many runtime type checks that now should be covered by typescript in buildtime -* The GraphQL replication is now out of beta mode -* Removed documentation examples for `require()` CommonJS loading -* Removed `RxCollection.docChanges$()` because all events are from the docs - -## Help wanted - -RxDB is an open source project an heavily relies on the contribution of its users. There are some things that must be done, but I have no time for them. - -### Refactor data-migrator - -The current implementation has some flaws and should be completely rewritten. - -* It does not use pouchdb's bulkDocs which is much faster -* It could have been written without rxjs and with less code that is easier to understand -* It does not migrate the revisions of documents which causes a problem when replication is used - -### Add e2e tests to the react example - -The [react example](https://github.com/pubkey/rxdb/tree/master/examples/react) has no end-to-end tests which is why the CI does not ensure that it works all the time. We should add some basic tests like we did for the other example projects. - -### Fix pouchdb bug so we can upgrade pouchdb-find - -There is a [bug in pouchdb](https://github.com/pouchdb/pouchdb/issues/7810) that prevents the upgrade of `pouchdb-find`. This is why RxDB relies on an old version of `pouchdb-find` that also requires different sub-dependencies. This increases the build size a lot because for example we ship multiple version of `spark-md5` and others. - -## About the future of RxDB - -At the moment RxDB is a realtime database based on pouchdb. In the future I want RxDB to be a wrapper around pull-based databases that also works with other source-dbs like mongoDB or PostgreSQL. As a start I defined the `RxStorage` interface and created a `RxStoragePouchdb` class that implements it and contains all pouchdb-specific logic. I want to move every direct storage usage into that interface so that later we can create other implementations of it for other source databases. - ---- - -## Appwrite Realtime Sync for Local-First Apps - -import {Tabs} from '@site/src/components/tabs'; -import {Steps} from '@site/src/components/steps'; -import {VideoBox} from '@site/src/components/video-box'; -import {RxdbMongoDiagramPlain} from '@site/src/components/mongodb-sync'; - -# RxDB Appwrite Replication - -This replication plugin allows you to synchronize documents between RxDB and an Appwrite server. It supports both push and pull replication, live updates via Appwrite's real-time subscriptions, [offline-capability](./offline-first.md) and [conflict resolution](./transactions-conflicts-revisions.md). - -
    - -
    - -## Why you should use RxDB with Appwrite? - -**Appwrite** is a secure, open-source backend server that simplifies backend tasks like user authentication, storage, database management, and real-time APIs. -**RxDB** is a reactive database for the frontend that offers offline-first capabilities and rich client-side data handling. - -Combining the two provides several benefits: - -1. [Offline-First](./offline-first.md): RxDB keeps all data locally, so your application remains fully functional even when the network is unavailable. When connectivity returns, the RxDB ↔ Appwrite replication automatically resolves and synchronizes changes. - -2. **Real-Time Sync**: With Appwrite’s real-time subscriptions and RxDB’s live replication, you can build collaborative features that update across all clients instantaneously. - -3. [Conflict Handling](./transactions-conflicts-revisions.md): RxDB offers flexible conflict resolution strategies, making it simpler to handle concurrent edits across multiple users or devices. - -4. **Scalable & Secure**: Appwrite is built to handle production loads with granular access controls, while RxDB easily scales across various storage backends on the client side. - -5. **Simplicity & Modularity**: RxDB’s plugin-based architecture, combined with Appwrite’s Cloud offering makes it one of the easiest way to build local-first [realtime apps](./articles/realtime-database.md) that scale. - - - -## Preparing the Appwrite Server - -You can either use the appwrite cloud or self-host the Appwrite server. In this tutorial we use the Cloud which is recommended for beginners because it is way easier to set up. You can later decide to self-host if needed. - - - -### Set up an Appwrite Endpoint and Project - - - -#### Self-Hosted - - - -##### Docker - -Ensure docker and docker-compose is installed and your version are up to date: - -```bash -docker-compose -v -``` - -##### Run the installation script - -The installation script runs inside of a docker container. It will create a docker-compose file and an `.env` file. - -```bash -docker run -it --rm \ - --volume /var/run/docker.sock:/var/run/docker.sock \ - --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \ - --entrypoint="install" \ - appwrite/appwrite:1.6.1 -``` - -##### Start/Stop - -After the installation is done, you can manually stop and start the appwrite instance with docker compose: - -```bash -# stop -docker-compose down - -# start -docker-compose up -``` - - - -#### Appwrite Cloud - - - -##### Create a Cloud Account - -Got to the Appwrite Console, create an account and login. - -#### Create a Project - -At the console click the `+ Create Project` button to create a new project. Remember the `project-id` which will be used later. - - - - - -### Create an Appwrite Database and Collection - -After creating an Appwrite project you have to create an Appwrite Database and a collection, you can either do this in code with the node-appwrite SDK or in the Appwrite Console as shown in this video: - -
    - -
    - -### Add your documents attributes - -In the appwrite collection, create all attributes of your documents. You have to define all the fields that your document in your [RxDB schema](./rx-schema.md) knows about. Notice that Appwrite does not allow for nested attributes. So when you use RxDB with Appwrite, you should also not have nested attributes in your RxDB schema. - -### Add a `deleted` attribute - -Appwrite (natively) hard-deletes documents. But for offline-handling RxDB needs soft-deleted documents on the server so that the deletion state can be replicated with other clients. - -In RxDB, `_deleted` indicates that a document is removed locally and you need a similar field in your Appwrite collection on the Server: You must define a deletedField with any name to mark documents as "deleted" in the remote collection. Mostly you would use a boolean field named `deleted` (set it to `required`). The plugin will treat any document with `{ [deletedField]: true }` as deleted and replicate that state to local RxDB. - -### Set the Permission on the Appwrite Collection - -Appwrite uses permissions to control data access on the collection level. Make sure that in the Console at `Collection -> Settings -> Permissions` you have set the permission according to what you want to allow your clients to do. For testing, just enable all of them (Create, Read, Update and Delete). - -
    - -## Setting up the RxDB - Appwrite Replication - -Now that we have set up the Appwrite server, we can go to the client side code and set up RxDB and the replication: - - - -### Install the Appwrite SDK and RxDB: - -```bash -npm install appwrite rxdb -``` - -### Import the Appwrite SDK and RxDB - -```ts -import { - replicateAppwrite -} from 'rxdb/plugins/replication-appwrite'; -import { - createRxDatabase, - addRxPlugin, - RxCollection -} from 'rxdb/plugins/core'; -import { - getRxStorageLocalstorage -} from 'rxdb/plugins/storage-localstorage'; - -import { Client } from 'appwrite'; -``` - -### Create a Database with a Collection - -```ts -const db = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage() -}); -const mySchema = { - title: 'my schema', - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 - }, - name: { - type: 'string' - } - }, - required: ['id', 'name'] -}; -await db.addCollections({ - humans: { - schema: mySchema - } -}); -const collection = db.humans; -``` - -### Configure the Appwrite Client - - - -#### Appwrite Cloud - -```ts -const client = new Client(); -client.setEndpoint('https://cloud.appwrite.io/v1'); -client.setProject('YOUR_APPWRITE_PROJECT_ID'); -``` - -#### Self-Hosted - -```ts -const client = new Client(); -client.setEndpoint('http://localhost/v1'); -client.setProject('YOUR_APPWRITE_PROJECT_ID'); -``` - - - -### Start the Replication - -```ts -const replicationState = replicateAppwrite({ - replicationIdentifier: 'my-appwrite-replication', - client, - databaseId: 'YOUR_APPWRITE_DATABASE_ID', - collectionId: 'YOUR_APPWRITE_COLLECTION_ID', - deletedField: 'deleted', // Field that represents deletion in Appwrite - collection, - pull: { - batchSize: 10, - }, - push: { - batchSize: 10 - }, - /* - * ... - * You can set all other options for RxDB replication states - * like 'live' or 'retryTime' - * ... - */ -}); -``` - -### Do other things with the replication state - -The `RxAppwriteReplicationState` which is returned from `replicateAppwrite()` allows you to run all functionality of the normal [RxReplicationState](./replication.md). - - - - - -## Limitations of the Appwrite Replication Plugin - -- Appwrite primary keys only allow for the characters `a-z`, `A-Z`, `0-9`, and underscore `_` (They cannot start with a leading underscore). Also the primary key has a max length of 36 characters. -- The Appwrite replication **only works on browsers**. This is because the Appwrite SDK does not support subscriptions in Node.js. -- Appwrite does not allow for bulk write operations so on push one HTTP request will be made per document. Reads run in bulk so this is mostly not a problem. -- Appwrite does not allow for transactions or "update-if" calls which can lead to overwriting documents instead of properly handling [conflicts](./transactions-conflicts-revisions.md#conflicts) when multiple clients edit the same document in parallel. This is not a problem for inserts because "insert-if-not" calls are made. -- Nested attributes in Appwrite collections are only possible via experimental relationship attributes, and compatibility with RxDB is not tested. Users opting to use these experimental relationship attributes with RxDB do so at their own risk. - ---- - -## RxDB's CouchDB Replication Plugin - -# Replication with CouchDB - -A plugin to replicate between a RxCollection and a CouchDB server. - -This plugins uses the RxDB [Sync Engine](./replication.md) to replicate with a CouchDB endpoint. This plugin **does NOT** use the official [CouchDB replication protocol](https://docs.couchdb.org/en/stable/replication/protocol.html) because the CouchDB protocol was optimized for server-to-server replication and is not suitable for fast client side applications, mostly because it has to run many HTTP-requests (at least one per document) and also it has to store the whole revision tree of the documents at the client. This makes initial replication and querying very slow. - -Because the way how RxDB handles revisions and documents is very similar to CouchDB, using the RxDB replication with a CouchDB endpoint is pretty straightforward. - -## Pros - -- Faster initial replication. -- Works with any [RxStorage](./rx-storage.md), not just PouchDB. -- Easier conflict handling because conflicts are handled during replication and not afterwards. -- Does not have to store all document revisions on the client, only stores the newest version. - -## Cons - -- Does not support the replication of [attachments](./rx-attachment.md). -- Like all CouchDB replication plugins, this one is also limited to replicating 6 collections in parallel. [Read this for workarounds](./replication-couchdb.md#limitations) - -## Usage - -Start the replication via `replicateCouchDB()`. - -```ts -import { replicateCouchDB } from 'rxdb/plugins/replication-couchdb'; - -const replicationState = replicateCouchDB( - { - replicationIdentifier: 'my-couchdb-replication', - collection: myRxCollection, - // url to the CouchDB endpoint (required) - url: 'http://example.com/db/humans', - /** - * true for live replication, - * false for a one-time replication. - * [default=true] - */ - live: true, - /** - * A custom fetch() method can be provided - * to add authentication or credentials. - * Can be swapped out dynamically - * by running 'replicationState.fetch = newFetchMethod;'. - * (optional) - */ - fetch: myCustomFetchMethod, - pull: { - /** - * Amount of documents to be fetched in one HTTP request - * (optional) - */ - batchSize: 60, - /** - * Custom modifier to mutate pulled documents - * before storing them in RxDB. - * (optional) - */ - modifier: docData => {/* ... */}, - /** - * Heartbeat time in milliseconds - * for the long polling of the changestream. - * @link https://docs.couchdb.org/en/3.2.2-docs/api/database/changes.html - * (optional, default=60000) - */ - heartbeat: 60000 - }, - push: { - /** - * How many local changes to process at once. - * (optional) - */ - batchSize: 60, - /** - * Custom modifier to mutate documents - * before sending them to the CouchDB endpoint. - * (optional) - */ - modifier: docData => {/* ... */} - } - } -); -``` - -When you call `replicateCouchDB()` it returns a `RxCouchDBReplicationState` which can be used to subscribe to events, for debugging or other functions. It extends the [RxReplicationState](./replication.md) so any other method that can be used there can also be used on the CouchDB replication state. - -## Conflict handling - -When conflicts appear during replication, the `conflictHandler` of the `RxCollection` is used, equal to the other replication plugins. Read more about conflict handling [here](./replication.md#conflict-handling). - -## Auth example - -Lets say for authentication you need to add a [bearer token](https://swagger.io/docs/specification/authentication/bearer-authentication/) as HTTP header to each request. You can achieve that by crafting a custom `fetch()` method that add the header field. - -```ts - -const myCustomFetch = (url, options) => { - - // flat clone the given options to not mutate the input - const optionsWithAuth = Object.assign({}, options); - // ensure the headers property exists - if(!optionsWithAuth.headers) { - optionsWithAuth.headers = {}; - } - // add bearer token to headers - optionsWithAuth.headers['Authorization'] ='Basic S0VLU0UhIExFQ0...'; - - // call the original fetch function with our custom options. - return fetch( - url, - optionsWithAuth - ); -}; - -const replicationState = replicateCouchDB( - { - replicationIdentifier: 'my-couchdb-replication', - collection: myRxCollection, - url: 'http://example.com/db/humans', - /** - * Add the custom fetch function here. - */ - fetch: myCustomFetch, - pull: {}, - push: {} - } -); -``` - -Also when your bearer token changes over time, you can set a new custom `fetch` method while the replication is running: - -```ts -replicationState.fetch = newCustomFetchMethod; -``` - -Also there is a helper method `getFetchWithCouchDBAuthorization()` to create a fetch handler with authorization: - -```ts - -import { - replicateCouchDB, - getFetchWithCouchDBAuthorization -} from 'rxdb/plugins/replication-couchdb'; - -const replicationState = replicateCouchDB( - { - replicationIdentifier: 'my-couchdb-replication', - collection: myRxCollection, - url: 'http://example.com/db/humans', - /** - * Add the custom fetch function here. - */ - fetch: getFetchWithCouchDBAuthorization('myUsername', 'myPassword'), - pull: {}, - push: {} - } -); -``` - -## Limitations - -Since CouchDB only allows synchronization through HTTP1.1 long polling requests there is a limitation of 6 active synchronization connections before the browser prevents sending any further request. This limitation is at the level of browser per tab per domain (some browser, especially older ones, might have a different limit, [see here](https://docs.pushtechnology.com/cloud/latest/manual/html/designguide/solution/support/connection_limitations.html)). - -Since this limitation is at the **browser** level there are several solutions: - - Use only a single database for all entities and set a "type" field for each of the documents - - Create multiple subdomains for CouchDB and use a max of 6 active synchronizations (or less) for each - - Use a proxy (ex: HAProxy) between the browser and CouchDB and configure it to use HTTP2.0, since HTTP2.0 - -If you use nginx in front of your CouchDB, you can use these settings to enable http2-proxying to prevent the connection limit problem: -``` -server { - http2 on; - location /db { - rewrite /db/(.*) /$1 break; - proxy_pass http://172.0.0.1:5984; - proxy_redirect off; - proxy_buffering off; - proxy_set_header Host $host; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded - proxy_set_header Connection "keep_alive" - } -} -``` - -## Known problems - -### Database missing - -In contrast to PouchDB, this plugin **does NOT** automatically create missing CouchDB databases. -If your CouchDB server does not have a database yet, you have to create it by yourself by running a `PUT` request to the database `name` url: - -```ts -// create a 'humans' CouchDB database on the server -const remoteDatabaseName = 'humans'; -await fetch( - 'http://example.com/db/' + remoteDatabaseName, - { - method: 'PUT' - } -); -``` - -## React Native - -React Native does not have a global `fetch` method. You have to import fetch method with the [cross-fetch](https://www.npmjs.com/package/cross-fetch) package: - -```ts -import crossFetch from 'cross-fetch'; -const replicationState = replicateCouchDB( - { - replicationIdentifier: 'my-couchdb-replication', - collection: myRxCollection, - url: 'http://example.com/db/humans', - fetch: crossFetch, - pull: {}, - push: {} - } -); -``` - ---- - -## Smooth Firestore Sync for Offline Apps - -import {Steps} from '@site/src/components/steps'; - -# Replication with Firestore from Firebase - -With the `replication-firestore` plugin you can do a two-way realtime replication -between your client side [RxDB](./) Database and a [Cloud Firestore](https://firebase.google.com/docs/firestore) database that is hosted on the Firebase platform. It will use the [RxDB Sync Engine](./replication.md) to manage the replication streams, error- and conflict handling. - - - -Replicating your Firestore state to RxDB can bring multiple benefits compared to using the Firestore directly: -- It can reduce your cloud fees because your queries run against the local state of the documents without touching a server and writes can be batched up locally and send to the backend in bulks. This is mostly the case for read heavy applications. -- You can run complex [NoSQL queries](./why-nosql.md) on your documents because you are not bound to the [Firestore Query](https://firebase.google.com/docs/firestore/query-data/queries) handling. You can also use local indexes, [compression](./key-compression.md) and [encryption](./encryption.md) and do things like fulltext search, fully locally. -- Your application can be truly [Offline-First](./offline-first.md) because your data is stored in a client side database. In contrast Firestore by itself only provides options to support [offline also](https://cloud.google.com/firestore/docs/manage-data/enable-offline) which more works like a cache and requires the user to be online at application start to run authentication. -- It reduces the vendor lock in because you can switch out the backend server afterwards without having to rebuild big parts of the application. RxDB supports replication plugins with multiple technologies and it is even easy to set up with your [custom backend](./replication.md). -- You can use sophisticated [conflict resolution strategies](./replication.md#conflict-handling) so you are not bound to the Firestore [last-write-wins](https://stackoverflow.com/a/47781502/3443137) strategy which is not suitable for many applications. -- The initial load time of your application can be decreased because it will do an incremental replication on restarts. - -## Usage - - - -### Install the firebase package - -```bash -npm install firebase -``` - -### Initialize your Firestore Database - -```ts -import * as firebase from 'firebase/app'; -import { - getFirestore, - collection -} from 'firebase/firestore'; - -const projectId = 'my-project-id'; -const app = firebase.initializeApp({ - projectId, - databaseURL: 'http://localhost:8080?ns=' + projectId, - /* ... */ -}); -const firestoreDatabase = getFirestore(app); -const firestoreCollection = collection(firestoreDatabase, 'my-collection-name'); -``` - -### Start the Replication - -Start the replication by calling `replicateFirestore()` on your [RxCollection](./rx-collection.md). - -```ts -const replicationState = replicateFirestore({ - replicationIdentifier: `https://firestore.googleapis.com/${projectId}`, - collection: myRxCollection, - firestore: { - projectId, - database: firestoreDatabase, - collection: firestoreCollection - }, - /** - * (required) Enable push and pull replication with firestore by - * providing an object with optional filter - * for each type of replication desired. - * [default=disabled] - */ - pull: {}, - push: {}, - /** - * Either do a live or a one-time replication - * [default=true] - */ - live: true, - /** - * (optional) likely you should just use the default. - * - * In firestore it is not possible to read out - * the internally used write timestamp of a document. - * Even if we could read it out, it is not indexed which - * is required for fetch 'changes-since-x'. - * So instead we have to rely on a custom user defined field - * that contains the server time - * which is set by firestore via serverTimestamp() - * Notice that the serverTimestampField MUST NOT be - * part of the collections RxJsonSchema! - * [default='serverTimestamp'] - */ - serverTimestampField: 'serverTimestamp' -}); -``` - -To observe and cancel the replication, you can use any other methods from the [ReplicationState](./replication.md) like `error$`, `cancel()` and `awaitInitialReplication()`. - - - -## Handling deletes - -RxDB requires you to never [fully delete documents](./replication.md#data-layout-on-the-server). This is needed to be able to replicate the deletion state of a document to other instances. The firestore replication will set a boolean `_deleted` field to all documents to indicate the deletion state. You can change this by setting a different `deletedField` in the sync options. - -## Do not set `enableIndexedDbPersistence()` - -Firestore has the `enableIndexedDbPersistence()` feature which caches document states locally to IndexedDB. This is not needed when you replicate your Firestore with RxDB because RxDB itself will store the data locally already. - -## Using the replication with an already existing Firestore Database State - -If you have not used RxDB before and you already have documents inside of your Firestore database, you have -to manually set the `_deleted` field to `false` and the `serverTimestamp` to all existing documents. - -```ts -import { - getDocs, - query, - serverTimestamp -} from 'firebase/firestore'; -const allDocsResult = await getDocs(query(firestoreCollection)); -allDocsResult.forEach(doc => { - doc.update({ - _deleted: false, - serverTimestamp: serverTimestamp() - }) -}); -``` - -Also notice that if you do writes from non-RxDB applications, you have to keep these fields in sync. It is recommended to use the [Firestore triggers](https://firebase.google.com/docs/functions/firestore-events) to ensure that. - -## Filtered Replication - -You might need to replicate only a subset of your collection, either to or from Firestore. You can achieve this using `push.filter` and `pull.filter` options. - -```ts -const replicationState = replicateFirestore( - { - collection: myRxCollection, - firestore: { - projectId, - database: firestoreDatabase, - collection: firestoreCollection - }, - pull: { - filter: [ - where('ownerId', '==', userId) - ] - }, - push: { - filter: (item) => item.syncEnabled === true - } - } -); -``` - -Keep in mind that you can not use inequality operators `(<, <=, !=, not-in, >, or >=)` in `pull.filter` since that would cause a conflict with ordering by `serverTimestamp`. - ---- - -## GraphQL Replication - -# Replication with GraphQL - -The GraphQL replication provides handlers for GraphQL to run [replication](./replication.md) with GraphQL as the transportation layer. - -The GraphQL replication is mostly used when you already have a backend that exposes a GraphQL API that can be adjusted to serve as a replication endpoint. If you do not already have a GraphQL endpoint, using the [HTTP replication](./replication-http.md) is an easier solution. - -:::note -To play around, check out the full example of the RxDB [GraphQL replication with server and client](https://github.com/pubkey/rxdb/tree/master/examples/graphql) -::: - -## Usage - -Before you use the GraphQL replication, make sure you've learned how the [RxDB replication](./replication.md) works. - -### Creating a compatible GraphQL Server - -At the server-side, there must exist an endpoint which returns newer rows when the last `checkpoint` is used as input. For example lets say you create a `Query` `pullHuman` which returns a list of document writes that happened after the given checkpoint. - -For the push-replication, you also need a `Mutation` `pushHuman` which lets RxDB update data of documents by sending the previous document state and the new client document state. -Also for being able to stream all ongoing events, we need a `Subscription` called `streamHuman`. - -```graphql -input HumanInput { - id: ID!, - name: String!, - lastName: String!, - updatedAt: Float!, - deleted: Boolean! -} -type Human { - id: ID!, - name: String!, - lastName: String!, - updatedAt: Float!, - deleted: Boolean! -} -input Checkpoint { - id: String!, - updatedAt: Float! -} -type HumanPullBulk { - documents: [Human]! - checkpoint: Checkpoint -} - -type Query { - pullHuman(checkpoint: Checkpoint, limit: Int!): HumanPullBulk! -} - -input HumanInputPushRow { - assumedMasterState: HeroInputPushRowT0AssumedMasterStateT0 - newDocumentState: HeroInputPushRowT0NewDocumentStateT0! -} - -type Mutation { - # Returns a list of all conflicts - # If no document write caused a conflict, return an empty list. - pushHuman(rows: [HumanInputPushRow!]): [Human] -} - -# headers are used to authenticate the subscriptions -# over websockets. -input Headers { - AUTH_TOKEN: String!; -} -type Subscription { - streamHuman(headers: Headers): HumanPullBulk! -} - -``` - -The GraphQL resolver for the `pullHuman` would then look like: - -```js -const rootValue = { - pullHuman: args => { - const minId = args.checkpoint ? args.checkpoint.id : ''; - const minUpdatedAt = args.checkpoint ? args.checkpoint.updatedAt : 0; - - // sorted by updatedAt first and the id as second - const sortedDocuments = documents.sort((a, b) => { - if (a.updatedAt > b.updatedAt) return 1; - if (a.updatedAt < b.updatedAt) return -1; - if (a.updatedAt === b.updatedAt) { - if (a.id > b.id) return 1; - if (a.id < b.id) return -1; - else return 0; - } - }); - - // only return documents newer than the input document - const filterForMinUpdatedAtAndId = sortedDocuments.filter(doc => { - if (doc.updatedAt < minUpdatedAt) return false; - if (doc.updatedAt > minUpdatedAt) return true; - if (doc.updatedAt === minUpdatedAt) { - // if updatedAt is equal, compare by id - if (doc.id > minId) return true; - else return false; - } - }); - - // only return some documents in one batch - const limitedDocs = filterForMinUpdatedAtAndId.slice(0, args.limit); - - // use the last document for the checkpoint - const lastDoc = limitedDocs[limitedDocs.length - 1]; - const retCheckpoint = { - id: lastDoc.id, - updatedAt: lastDoc.updatedAt - } - - return { - documents: limitedDocs, - checkpoint: retCheckpoint - } - - return limited; - } -} -``` - -For examples for the other resolvers, consult the [GraphQL Example Project](https://github.com/pubkey/rxdb/blob/master/examples/graphql/server/index.js). - -### RxDB Client - -#### Pull replication - -For the pull-replication, you first need a `pullQueryBuilder`. This is a function that gets the last replication `checkpoint` and a `limit` as input and returns an object with a GraphQL-query and its variables (or a promise that resolves to the same object). RxDB will use the query builder to construct what is later sent to the GraphQL endpoint. - -```js -const pullQueryBuilder = (checkpoint, limit) => { - /** - * The first pull does not have a checkpoint - * so we fill it up with defaults - */ - if (!checkpoint) { - checkpoint = { - id: '', - updatedAt: 0 - }; - } - const query = `query PullHuman($checkpoint: CheckpointInput, $limit: Int!) { - pullHuman(checkpoint: $checkpoint, limit: $limit) { - documents { - id - name - age - updatedAt - deleted - } - checkpoint { - id - updatedAt - } - } - }`; - return { - query, - operationName: 'PullHuman', - variables: { - checkpoint, - limit - } - }; -}; -``` - -With the queryBuilder, you can then setup the pull-replication. - -```js -import { replicateGraphQL } from 'rxdb/plugins/replication-graphql'; -const replicationState = replicateGraphQL( - { - collection: myRxCollection, - // urls to the GraphQL endpoints - url: { - http: 'http://example.com/graphql' - }, - pull: { - queryBuilder: pullQueryBuilder, // the queryBuilder from above - modifier: doc => doc, // (optional) modifies all pulled documents before they are handled by RxDB - dataPath: undefined, // (optional) specifies the object path to access the document(s). Otherwise, the first result of the response data is used. - /** - * Amount of documents that the remote will send in one request. - * If the response contains less than [batchSize] documents, - * RxDB will assume there are no more changes on the backend - * that are not replicated. - * This value is the same as the limit in the pullHuman() schema. - * [default=100] - */ - batchSize: 50 - }, - // headers which will be used in http requests against the server. - headers: { - Authorization: 'Bearer abcde...' - }, - - /** - * Options that have been inherited from the RxReplication - */ - deletedField: 'deleted', - live: true, - retryTime = 1000 * 5, - waitForLeadership = true, - autoStart = true, - } -); -``` - -#### Push replication - -For the push-replication, you also need a `queryBuilder`. Here, the builder receives a changed document as input which has to be send to the server. It also returns a GraphQL-Query and its data. - -```js -const pushQueryBuilder = rows => { - const query = ` - mutation PushHuman($writeRows: [HumanInputPushRow!]) { - pushHuman(writeRows: $writeRows) { - id - name - age - updatedAt - deleted - } - } - `; - const variables = { - writeRows: rows - }; - return { - query, - operationName: 'PushHuman', - variables - }; -}; -``` - -With the queryBuilder, you can then setup the push-replication. - -```js -const replicationState = replicateGraphQL( - { - collection: myRxCollection, - // urls to the GraphQL endpoints - url: { - http: 'http://example.com/graphql' - }, - push: { - queryBuilder: pushQueryBuilder, // the queryBuilder from above - /** - * batchSize (optional) - * Amount of document that will be pushed to the server in a single request. - */ - batchSize: 5, - /** - * modifier (optional) - * Modifies all pushed documents before they are send to the GraphQL endpoint. - * Returning null will skip the document. - */ - modifier: doc => doc - }, - headers: { - Authorization: 'Bearer abcde...' - }, - pull: { - /* ... */ - }, - /* ... */ - } -); -``` - -#### Pull Stream - -To create a **realtime** replication, you need to create a pull stream that pulls ongoing writes from the server. -The pull stream gets the `headers` of the `RxReplicationState` as input, so that it can be authenticated on the backend. - -```js -const pullStreamQueryBuilder = (headers) => { - const query = `subscription onStream($headers: Headers) { - streamHero(headers: $headers) { - documents { - id, - name, - age, - updatedAt, - deleted - }, - checkpoint { - id - updatedAt - } - } - }`; - return { - query, - variables: { - headers - } - }; -}; -``` - -With the `pullStreamQueryBuilder` you can then start a realtime replication. - -```js -const replicationState = replicateGraphQL( - { - collection: myRxCollection, - // urls to the GraphQL endpoints - url: { - http: 'http://example.com/graphql', - ws: 'ws://example.com/subscriptions' // <- The websocket has to use a different url. - }, - push: { - batchSize: 100, - queryBuilder: pushQueryBuilder - }, - headers: { - Authorization: 'Bearer abcde...' - }, - pull: { - batchSize: 100, - queryBuilder: pullQueryBuilder, - streamQueryBuilder: pullStreamQueryBuilder, - includeWsHeaders: false, // Includes headers as connection parameter to Websocket. - - // Websocket options that can be passed as a parameter to initialize the subscription - // Can be applied anything from the graphql-ws ClientOptions - https://the-guild.dev/graphql/ws/docs/interfaces/client.ClientOptions - // Except these parameters: 'url', 'shouldRetry', 'webSocketImpl' - locked for internal usage - // Note: if you provide connectionParams as a wsOption, make sure it returns any necessary headers (e.g. authorization) - // because providing your own connectionParams prevents headers from being included automatically - wsOptions: { - retryAttempts: 10, - } - }, - deletedField: 'deleted' - } -); -``` - -:::note -If it is not possible to create a websocket server on your backend, you can use any other method of pull out the ongoing events from the backend and then you can send them into `RxReplicationState.emitEvent()`. -::: - -### Transforming null to undefined in optional fields - -GraphQL fills up non-existent optional values with `null` while RxDB required them to be `undefined`. -Therefore, if your schema contains optional properties, you have to transform the pulled data to switch out `null` to `undefined` -```js -const replicationState: RxGraphQLReplicationState = replicateGraphQL( - { - collection: myRxCollection, - url: {/* ... */}, - headers: {/* ... */}, - push: {/* ... */}, - pull: { - queryBuilder: pullQueryBuilder, - modifier: (doc => { - // We have to remove optional non-existent field values - // they are set as null by GraphQL but should be undefined - Object.entries(doc).forEach(([k, v]) => { - if (v === null) { - delete doc[k]; - } - }); - return doc; - }) - }, - /* ... */ - } -); -``` - -### pull.responseModifier - -With the `pull.responseModifier` you can modify the whole response from the GraphQL endpoint **before** it is processed by RxDB. -For example if your endpoint is not capable of returning a valid checkpoint, but instead only returns the plain document array, you can use the `responseModifier` to aggregate the checkpoint from the returned documents. - -```ts -import { - -} from 'rxdb'; -const replicationState: RxGraphQLReplicationState = replicateGraphQL( - { - collection: myRxCollection, - url: {/* ... */}, - headers: {/* ... */}, - push: {/* ... */}, - pull: { - responseModifier: async function( - plainResponse, // the exact response that was returned from the server - origin, // either 'handler' if plainResponse came from the pull.handler, or 'stream' if it came from the pull.stream - requestCheckpoint // if origin==='handler', the requestCheckpoint contains the checkpoint that was send to the backend - ) { - /** - * In this example we aggregate the checkpoint from the documents array - * that was returned from the graphql endpoint. - */ - const docs = plainResponse; - return { - documents: docs, - checkpoint: docs.length === 0 ? requestCheckpoint : { - name: lastOfArray(docs).name, - updatedAt: lastOfArray(docs).updatedAt - } - }; - } - }, - /* ... */ - } -); -``` - -### push.responseModifier - -It's also possible to modify the response of a push mutation. For example if your server returns more than the just conflicting docs: - -```graphql -type PushResponse { - conflicts: [Human] - conflictMessages: [ReplicationConflictMessage] -} - -type Mutation { - # Returns a PushResponse type that contains the conflicts along with other information - pushHuman(rows: [HumanInputPushRow!]): PushResponse! -} -``` - -```ts -import {} from "rxdb"; -const replicationState: RxGraphQLReplicationState = replicateGraphQL( - { - collection: myRxCollection, - url: {/* ... */}, - headers: {/* ... */}, - push: { - responseModifier: async function (plainResponse) { - /** - * In this example we aggregate the conflicting documents from a response object - */ - return plainResponse.conflicts; - }, - }, - pull: {/* ... */}, - /* ... */ - } -); -``` - -#### Helper Functions - -RxDB provides the helper functions `graphQLSchemaFromRxSchema()`, `pullQueryBuilderFromRxSchema()`, `pullStreamBuilderFromRxSchema()` and `pushQueryBuilderFromRxSchema()` that can be used to generate handlers and schemas from the `RxJsonSchema`. To learn how to use them, please inspect the [GraphQL Example](https://github.com/pubkey/rxdb/tree/master/examples/graphql). - -### RxGraphQLReplicationState - -When you call `myCollection.syncGraphQL()` it returns a `RxGraphQLReplicationState` which can be used to subscribe to events, for debugging or other functions. It extends the [RxReplicationState](./replication.md) with some GraphQL specific methods. - -#### .setHeaders() - -Changes the headers for the replication after it has been set up. - -```js -replicationState.setHeaders({ - Authorization: `...` -}); -``` - -#### Sending Cookies - -The underlying fetch framework uses a `same-origin` policy for credentials per default. That means, cookies and session data is only shared if you backend and frontend run on the same domain and port. Pass the credential parameter to `include` cookies in requests to servers from different origins via: - -```js -replicationState.setCredentials('include'); -``` - -or directly pass it in the `replicateGraphQL` function: - -```js -replicateGraphQL( - { - collection: myRxCollection, - /* ... */ - credentials: 'include', - /* ... */ - } -); -``` - -See [the fetch spec](https://fetch.spec.whatwg.org/#concept-request-credentials-mode) for more information about available options. - -:::note -To play around, check out the full example of the RxDB [GraphQL replication with server and client](https://github.com/pubkey/rxdb/tree/master/examples/graphql) -::: - ---- - -## HTTP Replication - -import {Steps} from '@site/src/components/steps'; -import {Tabs} from '@site/src/components/tabs'; - -# HTTP Replication from a custom server to RxDB clients - -While RxDB has a range of backend-specific replication plugins (like [GraphQL](./replication-graphql.md) or [Firestore](./replication-firestore.md)), the replication is build in a way to make it very easy to replicate data from a custom server to RxDB clients. - - - -Using **HTTP** as a transport protocol makes it simple to create a compatible backend on top of your existing infrastructure. For events that must be sent from the server to the client, we can use [Server Send Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events). - -In this tutorial we will implement a HTTP replication between an RxDB client and a MongoDB express server. You can adapt this for any other backend database technology like PostgreSQL or even a non-Node.js server like go or java. - -To create a compatible server for replication, we will start a server and implement the correct HTTP routes and replication handlers. We need a push-handler, a pull-handler and for the ongoing changes `pull.stream` we use **Server Send Events**. - -## Setup - - - -### Start the Replication on the RxDB Client - -RxDB does not have a specific HTTP-replication plugin because the [replication primitives plugin](./replication.md) is simple enough to start a HTTP replication on top of it. -We import the `replicateRxCollection` function and start the replication from there for a single [RxCollection](./rx-collection.md). - -```ts -// > client.ts -import { replicateRxCollection } from 'rxdb/plugins/replication'; -const replicationState = await replicateRxCollection({ - collection: myRxCollection, - replicationIdentifier: 'my-http-replication', - push: { /* add settings from below */ }, - pull: { /* add settings from below */ } -}); -``` - -### Start a Node.js process with Express and MongoDB - -On the server side, we start an express server that has a MongoDB connection and serves the HTTP requests of the client. - -```ts -// > server.ts -import { MongoClient } from 'mongodb'; -import express from 'express'; -const mongoClient = new MongoClient('mongodb://localhost:27017/'); -const mongoConnection = await mongoClient.connect(); -const mongoDatabase = mongoConnection.db('myDatabase'); -const mongoCollection = await mongoDatabase.collection('myDocs'); - -const app = express(); -app.use(express.json()); - -/* ... add routes from below */ - -app.listen(80, () => { - console.log(`Example app listening on port 80`) -}); -``` - -### Implement the Pull Endpoint - -As first HTTP Endpoint, we need to implement the pull handler. This is used by the RxDB replication to fetch all documents writes that happened after a given `checkpoint`. - -The `checkpoint` format is not determined by RxDB, instead the server can use any type of changepoint that can be used to iterate across document writes. Here we will just use a unix timestamp `updatedAt` and a string `id` which is the most common used format. - -When the pull endpoint is called, the server responds with an array of document data based on the given checkpoint and a new checkpoint. -Also the server has to respect the batchSize so that RxDB knows when there are no more new documents and the server returns a non-full array. - -```ts -// > server.ts -import { lastOfArray } from 'rxdb/plugins/core'; -app.get('/pull', (req, res) => { - const id = req.query.id; - const updatedAt = parseFloat(req.query.updatedAt); - const documents = await mongoCollection.find({ - $or: [ - /** - * Notice that we have to compare the updatedAt AND the id field - * because the updateAt field is not unique and when two documents - * have the same updateAt, we can still "sort" them by their id. - */ - { - updateAt: { $gt: updatedAt } - }, - { - updateAt: { $eq: updatedAt } - id: { $gt: id } - } - ] - }) - .sort({updateAt: 1, id: 1}) - .limit(parseInt(req.query.batchSize, 10)).toArray(); - const newCheckpoint = documents.length === 0 ? { id, updatedAt } : { - id: lastOfArray(documents).id, - updatedAt: lastOfArray(documents).updatedAt - }; - res.setHeader('Content-Type', 'application/json'); - res.end(JSON.stringify({ documents, checkpoint: newCheckpoint })); -}); -``` - -### Implement the Pull Handler - -On the client we add the `pull.handler` to the replication setting. The handler request the correct server url and fetches the documents. - -```ts -// > client.ts -const replicationState = await replicateRxCollection({ - /* ... */ - pull: { - async handler(checkpointOrNull, batchSize){ - const updatedAt = checkpointOrNull ? checkpointOrNull.updatedAt : 0; - const id = checkpointOrNull ? checkpointOrNull.id : ''; - const response = await fetch( - `https://localhost/pull?updatedAt=${updatedAt}&id=${id}&limit=${batchSize}` - ); - const data = await response.json(); - return { - documents: data.documents, - checkpoint: data.checkpoint - }; - } - - } - /* ... */ -}); -``` - -### Implement the Push Endpoint - -To send client side writes to the server, we have to implement the `push.handler`. It gets an array of change rows as input and has to return only the conflicting documents that did not have been written to the server. Each change row contains a `newDocumentState` and an optional `assumedMasterState`. - -For [conflict detection](./transactions-conflicts-revisions.md), on the server we first have to detect if the `assumedMasterState` is correct for each row. If yes, we have to write the new document state to the database, otherwise we have to return the "real" master state in the conflict array. - -The server also creates an `event` that is emitted to the `pullStream$` which is later used in the [pull.stream$](#pullstream-for-ongoing-changes). - -```ts -// > server.ts -import { lastOfArray } from 'rxdb/plugins/core'; -import { Subject } from 'rxjs'; - -// used in the pull.stream$ below -let lastEventId = 0; -const pullStream$ = new Subject(); - -app.get('/push', (req, res) => { - const changeRows = req.body; - const conflicts = []; - const event = { - id: lastEventId++, - documents: [], - checkpoint: null - }; - for(const changeRow of changeRows){ - const realMasterState = mongoCollection.findOne({id: changeRow.newDocumentState.id}); - if( - realMasterState && !changeRow.assumedMasterState || - ( - realMasterState && changeRow.assumedMasterState && - /* - * For simplicity we detect conflicts on the server by only compare the updateAt value. - * In reality you might want to do a more complex check or do a deep-equal comparison. - */ - realMasterState.updatedAt !== changeRow.assumedMasterState.updatedAt - ) - ) { - // we have a conflict - conflicts.push(realMasterState); - } else { - // no conflict -> write the document - mongoCollection.updateOne( - {id: changeRow.newDocumentState.id}, - changeRow.newDocumentState - ); - event.documents.push(changeRow.newDocumentState); - event.checkpoint = { id: changeRow.newDocumentState.id, updatedAt: changeRow.newDocumentState.updatedAt }; - } - } - if(event.documents.length > 0){ - myPullStream$.next(event); - } - res.setHeader('Content-Type', 'application/json'); - res.end(JSON.stringify(conflicts)); -}); -``` - -:::note -For simplicity in this tutorial, we do not use transactions. In reality you should run the full push function inside of a MongoDB transaction to ensure that no other process can mix up the document state while the writes are processed. Also you should call batch operations on MongoDB instead of running the operations for each change row. -::: - -### Implement the Push Handler - -With the push endpoint in place, we can add a `push.handler` to the replication settings on the client. - -```ts -// > client.ts -const replicationState = await replicateRxCollection({ - /* ... */ - push: { - async handler(changeRows){ - const rawResponse = await fetch('https://localhost/push', { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify(changeRows) - }); - const conflictsArray = await rawResponse.json(); - return conflictsArray; - } - } - /* ... */ -}); -``` - -### Implement the pullStream$ Endpoint - -While the normal pull handler is used when the replication is in [iteration mode](./replication.md#checkpoint-iteration), we also need a stream of ongoing changes when the replication is in [event observation mode](./replication.md#event-observation). This brings the realtime replication to RxDB where changes on the server or on a client will directly get propagated to the other instances. - -On the server we have to implement the `pullStream` route and emit the events. We use the `pullStream$` observable from [above](#push-from-the-client-to-the-server) to fetch all ongoing events and respond them to the client. Here we use Server-Sent-Events (SSE) which is the most common used way to stream data from the server to the client. Other method also exist like [WebSockets or Long-Polling](./articles/websockets-sse-polling-webrtc-webtransport.md). - -```ts -// > server.ts -app.get('/pullStream', (req, res) => { - res.writeHead(200, { - 'Content-Type': 'text/event-stream', - 'Connection': 'keep-alive', - 'Cache-Control': 'no-cache' - }); - const subscription = pullStream$.subscribe(event => { - res.write('data: ' + JSON.stringify(event) + '\n\n'); - }); - req.on('close', () => subscription.unsubscribe()); -}); -``` - -:::note -How the build the `pullStream$` Observable is not part of this tutorial. This heavily depends on your backend and infrastructure. Likely you have to observe the MongoDB event stream. -::: - -### Implement the pullStream$ Handler - -From the client we can observe this endpoint and create a `pull.stream$` observable that emits all events that are send from the server to the client. -The client connects to an url and receives server-sent-events that contain all ongoing writes. - -```ts -// > client.ts -import { Subject } from 'rxjs'; -const myPullStream$ = new Subject(); -const eventSource = new EventSource( - 'http://localhost/pullStream', - { withCredentials: true } -); -eventSource.onmessage = event => { - const eventData = JSON.parse(event.data); - myPullStream$.next({ - documents: eventData.documents, - checkpoint: eventData.checkpoint - }); -}; - -const replicationState = await replicateRxCollection({ - /* ... */ - pull: { - /* ... */ - stream$: myPullStream$.asObservable() - } - /* ... */ -}); -``` - -### pullStream$ RESYNC flag - -In case the client looses the connection, the EventSource will automatically reconnect but there might have been some changes that have been missed out in the meantime. The replication has to be informed that it might have missed events by emitting a `RESYNC` flag from the `pull.stream$`. -The replication will then catch up by switching to the [iteration mode](./replication.md#checkpoint-iteration) until it is in sync with the server again. - -```ts -// > client.ts -eventSource.onerror = () => myPullStream$.next('RESYNC'); -``` - -The purpose of the `RESYNC` flag is to tell the client that "something might have changed" and then the client can react on that information without having to run operations in an interval. - -If your backend is not capable of emitting the actual documents and checkpoint in the pull stream, you could just map all events to the `RESYNC` flag. This would make the replication work with a slight performance drawback: - -```ts -// > client.ts -import { Subject } from 'rxjs'; -const myPullStream$ = new Subject(); -const eventSource = new EventSource( - 'http://localhost/pullStream', - { withCredentials: true } -); -eventSource.onmessage = () => myPullStream$.next('RESYNC'); -const replicationState = await replicateRxCollection({ - pull: { - stream$: myPullStream$.asObservable() - } -}); -``` - - - -## Missing implementation details - -In this tutorial we only covered the basics of doing a HTTP replication between RxDB clients and a server. We did not cover the following aspects of the implementation: - -- Authentication: To authenticate the client on the server, you might want to send authentication headers with the HTTP requests -- Skip events on the `pull.stream$` for the client that caused the changes to improve performance. -- Version upgrades: You should add a version-flag to the endpoint urls. If you then update the version of your endpoints in any way, your old endpoints should emit a `Code 426` to outdated clients so that they can updated their client version. - ---- - -## MongoDB Realtime Sync Engine for Local-First Apps - -import {Tabs} from '@site/src/components/tabs'; -import {Steps} from '@site/src/components/steps'; -import {VideoBox} from '@site/src/components/video-box'; -import {RxdbMongoDiagramPlain} from '@site/src/components/mongodb-sync'; - -# MongoDB Replication Plugin for RxDB - Real-Time, Offline-First Sync - - - -The [MongoDB](https://www.mongodb.com/) Replication Plugin for RxDB delivers seamless, two-way synchronization between MongoDB and RxDB, enabling [real-time](./articles/realtime-database.md) updates and [offline-first](./offline-first.md) functionality for your applications. Built on **MongoDB Change Streams**, it supports both Atlas and self-hosted deployments, ensuring your data stays consistent across every device and service. - -Behind the scenes, the plugin is powered by the RxDB [Sync Engine](./replication.md), which manages the complexities of real-world data replication for you. It automatically handles [conflict detection and resolution](./transactions-conflicts-revisions.md), maintains precise checkpoints for incremental updates, and gracefully manages transitions between offline and online states. This means you don't need to manually implement retry logic, reconcile divergent changes, or worry about data loss during connectivity drops, the Sync Engine ensures consistency and reliability in every sync cycle. - -## Key Features - -- **Two-way replication** between MongoDB and RxDB collections -- **Offline-first support** with automatic incremental re-sync -- **Incremental updates** via MongoDB Change Streams -- **Conflict resolution** handled by the RxDB Sync Engine -- **Atlas and self-hosted support** for replica sets and sharded clusters - -## Architecture Overview - -The plugin operates in a three-tier architecture: Clients connect to [RxServer](./rx-server.md), which in turn connects to MongoDB. RxServer streams changes from MongoDB to connected clients and pushes client-side updates back to MongoDB. - -For the client side, RxServer exposes a [replication endpoint](./rx-server.md#replication-endpoint) over WebSocket or HTTP, which your RxDB-powered applications can consume. - -The following diagram illustrates the flow of updates between clients, RxServer, and MongoDB in a live synchronization setup: - - - -:::note -The MongoDB Replication Plugin is optimized for Node.js environments (e.g., when RxDB runs within RxServer or other backend services). Direct connections from browsers or mobile apps to MongoDB are not supported because MongoDB does not use HTTP as its wire protocol and requires a driver-level connection to a replica set or sharded cluster. -::: - -## Setting up the Client-RxServer-MongoDB Sync - - - -### Install the Client Dependencies - -In your JavaScript project, install the RxDB libraries and the MongoDB node.js driver: - -```npm install rxdb rxdb-server mongodb --save``` - -### Set up a MongoDB Server - -As first step, you need access to a running MongoDB Server. This can be done by either running a server locally or using the Atlas Cloud. Notice that we need to have a [replica set](https://www.mongodb.com/docs/manual/tutorial/deploy-replica-set/) because only on these, the MongoDB changestream can be used. - - - -### Shell - -If you have installed MongoDB locally, you can start the server with this command: - -```mongod --replSet rs0 --bind_ip_all``` - -### Docker - -If you have docker installed, you can start a container that runs the MongoDB server: - -```docker run -p 27017:27017 -p 27018:27018 -p 27019:27019 --rm --name rxdb-mongodb mongo:8.0.4 mongod --replSet rs0 --bind_ip_all``` - -### MongoDB Atlas - -Learn here how to create a MongoDB atlas account and how to start a MongoDB cluster that runs in the cloud: - -
    - -
    - -
    - -After this step you should have a valid connection string that points to a running MongoDB Server like `mongodb://localhost:27017/`. - -### Create a MongoDB Database and Collection - -On your MongoDB server, make sure to create a database and a collection. - -```ts -//> server.ts - -import { MongoClient } from 'mongodb'; -const mongoClient = new MongoClient('mongodb://localhost:27017/?directConnection=true'); -const mongoDatabase = mongoClient.db('my-database'); -await mongoDatabase.createCollection('my-collection', { - changeStreamPreAndPostImages: { enabled: true } -}); -``` - -:::note -To observe document deletions on the changestream, `changeStreamPreAndPostImages` must be enabled. This is not required if you have an insert/update-only collection where no documents are deleted ever. -::: - -### Create a RxDB Database and Collection - -Now we create an RxDB [database](./rx-database.md) and a [collection](./rx-collection.md). In this example the [memory storage](./rx-storage-memory.md), in production you would use a [persistent storage](./rx-storage.md) instead. - -```ts -//> server.ts - -import { createRxDatabase, addRxPlugin } from 'rxdb'; -import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; - -// Create server-side RxDB instance -const db = await createRxDatabase({ - name: 'serverdb', - storage: getRxStorageMemory() -}); - -// Add your collection schema -await db.addCollections({ - humans: { - schema: { - version: 0, - primaryKey: 'passportId', - type: 'object', - properties: { - passportId: { type: 'string', maxLength: 100 }, - firstName: { type: 'string' }, - lastName: { type: 'string' } - }, - required: ['passportId', 'firstName', 'lastName'] - } - } -}); -``` - -### Sync the Collection with the MongoDB Server - -Now we can start a [replication](./replication.md) that does a two-way replication between the RxDB Collection and the MongoDB Collection. - -```ts -//> server.ts - -import { replicateMongoDB } from 'rxdb/plugins/replication-mongodb'; - -const replicationState = replicateMongoDB({ - mongodb: { - collectionName: 'my-collection', - connection: 'mongodb://localhost:27017', - databaseName: 'my-database' - }, - collection: db.humans, - replicationIdentifier: 'humans-mongodb-sync', - pull: { batchSize: 50 }, - push: { batchSize: 50 }, - live: true -}); - -``` - -:::note You can do many things with the replication state -The `RxMongoDBReplicationState` which is returned from `replicateMongoDB()` allows you to run all functionality of the normal [RxReplicationState](./replication.md) like observing errors or doing start/stop operations. -::: - -### Start a RxServer - -Now that we have a RxDatabase and Collection that is replicated with MongoDB, we can spawn a [RxServer](./rx-server.md) on top of it. This server can then be used by client devices to connect. - -```ts -//> server.ts - -import { createRxServer } from 'rxdb-server/plugins/server'; -import { RxServerAdapterExpress } from 'rxdb-server/plugins/adapter-express'; - -const server = await createRxServer({ - database: db, - adapter: RxServerAdapterExpress, - port: 8080, - cors: '*' -}); - -const endpoint = server.addReplicationEndpoint({ - name: 'humans', - collection: db.humans -}); -console.log('Replication endpoint:', `http://localhost:8080/${endpoint.urlPath}`); - -// do not forget to start the server! -await server.start(); -``` - -### Sync a Client with the RxServer - -On the client-side we create the exact same RxDatabase and collection and then replicate it with the replication endpoint of the RxServer. - -```ts -//> client.ts - -import { createRxDatabase } from 'rxdb'; -import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; -import { replicateServer } from 'rxdb-server/plugins/replication-server'; - -const db = await createRxDatabase({ - name: 'mydb-client', - storage: getRxStorageDexie() -}); - -await db.addCollections({ - humans: { - schema: { - version: 0, - primaryKey: 'passportId', - type: 'object', - properties: { - passportId: { type: 'string', maxLength: 100 }, - firstName: { type: 'string' }, - lastName: { type: 'string' } - }, - required: ['passportId', 'firstName', 'lastName'] - } - } -}); - -// Start replication to the RxServer endpoint printed by the server: -// e.g. http://localhost:8080/humans/0 -const replicationState = replicateServer({ - replicationIdentifier: 'humans-rxserver', - collection: db.humans, - url: 'http://localhost:8080/humans/0', - live: true, - pull: { batchSize: 50 }, - push: { batchSize: 50 } -}); - -``` - -
    - -## Follow Up - -- Try it out with the [RxDB-MongoDB example repository](https://github.com/pubkey/rxdb-mongodb-sync-example) -- Read [From Local to Global: Scalable Edge Apps with RxDB + MongoDB](https://www.mongodb.com/company/blog/innovation/from-local-global-scalable-edge-apps-rxdb) -- [Replication API Reference](./replication.md) -- [RxServer Documentation](./rx-server.md) -- Join our [Discord Forum](./chat) for questions and feedback - ---- - -## RxDB & NATS - Realtime Sync - -import {Steps} from '@site/src/components/steps'; - -# Replication with NATS - -With this RxDB plugin you can run a two-way realtime replication with a [NATS](https://nats.io/) server. - -The replication itself uses the [RxDB Sync Engine](./replication.md) which handles conflicts, errors and retries. -On the client side the official [NATS npm package](https://www.npmjs.com/package/nats) is used to connect to the NATS server. - -NATS is a messaging system that by itself does not have a validation or granulary access control build in. -Therefore it is not recommended to directly replicate the NATS server with an untrusted RxDB client application. Instead you should replicated from NATS to your Node.js server side RxDB database. - -## Precondition - -For the replication endpoint the NATS cluster must have enabled [JetStream](https://docs.nats.io/nats-concepts/jetstream) and store all message data as [structured JSON](https://docs.nats.io/using-nats/developer/sending/structure). - -The easiest way to start a compatible NATS server is to use the official docker image: - -```docker run --rm --name rxdb-nats -p 4222:4222 nats:2.9.17 -js``` - -## Usage - - - -### Install the nats package - -```bash -npm install nats --save -``` - -### Start the Replication - -To start the replication, import the `replicateNats()` method from the RxDB plugin and call it with the collection -that must be replicated. -The replication runs *per RxCollection*, you can replicate multiple RxCollections by starting a new replication for each of them. - -```typescript -import { - replicateNats -} from 'rxdb/plugins/replication-nats'; - -const replicationState = replicateNats({ - collection: myRxCollection, - replicationIdentifier: 'my-nats-replication-collection-A', - // in NATS, each stream need a name - streamName: 'stream-for-replication-A', - /** - * The subject prefix determines how the documents are stored in NATS. - * For example the document with id 'alice' - * will have the subject 'foobar.alice' - */ - subjectPrefix: 'foobar', - connection: { servers: 'localhost:4222' }, - live: true, - pull: { - batchSize: 30 - }, - push: { - batchSize: 30 - } -}); -``` - - - -## Handling deletes - -RxDB requires you to never [fully delete documents](./replication.md#data-layout-on-the-server). This is needed to be able to replicate the deletion state of a document to other instances. The NATS replication will set a boolean `_deleted` field to all documents to indicate the deletion state. You can change this by setting a different `deletedField` in the sync options. - ---- - -## Seamless P2P Data Sync - -# The RxDB Plugin `replication-p2p` has been renamed to `replication-webrtc` - -The new documentation page has been moved to [here](./replication-webrtc.md) - - - ---- - -## RxDB Server Replication - - -The *Server Replication Plugin* connects to the replication endpoint of an [RxDB Server Replication Endpoint](./rx-server.md#replication-endpoint) and replicates data between the client and the server. - -## Usage - -The replication server plugin is imported from the `rxdb-server` npm package. Then you start the replication with a given collection and endpoint url by calling `replicateServer()`. - -```ts -import { replicateServer } from 'rxdb-server/plugins/replication-server'; - -const replicationState = await replicateServer({ - collection: usersCollection, - replicationIdentifier: 'my-server-replication', - url: 'http://localhost:80/users/0', // endpoint url with the servers collection schema version at the end - headers: { - Authorization: 'Bearer S0VLU0UhI...' - }, - push: {}, - pull: {}, - live: true -}); -``` - -## outdatedClient$ - -When you update your schema at the server and run a migration, you end up with a different replication url that has a new schema version number at the end. -Your clients might still be running an old version of your application that will no longer be compatible with the endpoint. Therefore when the client tries to call a server endpoint with an outdated schema version, the `outdatedClient$` observable emits to tell your client that the application must be updated. With that event you can tell the client to update the application. -On browser application you might want to just reload the page on that event: - -```ts -replicationState.outdatedClient$.subscribe(() => { - location.reload(); -}); -``` - -## unauthorized$ - -When you clients auth data is not valid (or no longer valid), the server will no longer accept any requests from you client and inform the client that the auth headers must be updated. -The `unauthorized$` observable will emit and expects you to update the headers accordingly so that following requests will be accepted again. - -```ts -replicationState.unauthorized$.subscribe(() => { - replicationState.setHeaders({ - Authorization: 'Bearer S0VLU0UhI...' - }); -}); -``` - -## forbidden$ - -When you client behaves wrong in any case, like update non-allowed values or changing documents that it is not allowed to, -the server will drop the connection and the replication state will emit on the `forbidden$` observable. -It will also automatically stop the replication so that your client does not accidentally DOS attack the server. - -```ts -replicationState.forbidden$.subscribe(() => { - console.log('Client is behaving wrong'); -}); -``` - -## Custom EventSource implementation - -For the server send events, the [eventsource](https://github.com/EventSource/eventsource) npm package is used instead of the native `EventSource` API. We need this because the native browser API does not support sending headers with the request which is required by the server to parse the auth data. - -If the eventsource package does not work for you, you can set an own implementation when creating the replication. - -```ts -const replicationState = await replicateServer({ - /* ... */ - eventSource: MyEventSourceConstructor - /* ... */ -}); -``` - ---- - -## Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync - -import {Tabs} from '@site/src/components/tabs'; -import {Steps} from '@site/src/components/steps'; -import {VideoBox} from '@site/src/components/video-box'; -import {RxdbMongoDiagramPlain} from '@site/src/components/mongodb-sync'; - -# Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync - - - -The **Supabase Replication Plugin** for RxDB delivers seamless, two-way synchronization between your RxDB collections and a Supabase (Postgres) table. It uses **PostgREST** for pull/push and **Supabase Realtime** (logical replication) to stream live updates, so your data stays consistent across devices with first-class [local-first](./articles/local-first-future.md), offline-ready support. - -Under the hood, the plugin is powered by the RxDB [Sync Engine](./replication.md). It handles checkpointed incremental pulls, robust retry logic, and [conflict detection/resolution](./transactions-conflicts-revisions.md) for you. You focus on features—RxDB takes care of sync. - -
    - -
    - -## Key Features of the RxDB-Supabase Plugin - -- **Cloud Only Backend**: No self-hosted server required. Client devices directly sync with the Supabase Servers. -- **Two-way replication** between Supabase tables and RxDB [collections](./rx-collection.md) -- **Offline-first** with resumable, incremental sync -- **Live updates** via Supabase Realtime channels -- **Conflict resolution** handled by the [RxDB Sync Engine](./replication.md) -- **Works in browsers and Node.js** with `@supabase/supabase-js` - -## Architecture Overview - - - -Clients connect **directly to Supabase** using the official JS client. The plugin: - -- **Pulls** documents over PostgREST using a checkpoint `(modified, id)` and deterministic ordering. -- **Pushes** inserts/updates using optimistic concurrency guards. -- **Streams** new changes using Supabase Realtime so live replication stays up to date. - -:::note -Because Supabase exposes Postgres over **HTTP/WebSocket**, you can safely replicate from browsers and mobile apps. Protect your data with **Row Level Security (RLS)** policies; use the **anon** key on clients and the **service role** key only on trusted servers. -::: - -## Setting up RxDB ↔ Supabase Sync - - - -### Install Dependencies - -```bash -npm install rxdb @supabase/supabase-js -``` - -### Create a Supabase Project & Table - -In your supabase project, create a new table. Ensure that: -- The primary key must have the type text (Primary keys must always be strings in RxDB) -- You have an modified field which stores the last modification timestamp of a row (default is `_modified`) -- You have a boolean field which stores if a row should is "deleted". You should not hard-delete rows in Supabase, because clients would miss the deletion if they haven't been online at the deletion time. Instead, use a deleted `boolean` to mark rows as deleted. This way all clients can still pull the deletion, and RxDB will hide the complexity on the client side. -- Enable the realtime observation of writes to the table. - -Here is an example for a "human" table: - -```sql -create extension if not exists moddatetime schema extensions; - -create table "public"."humans" ( - "passportId" text primary key, - "firstName" text not null, - "lastName" text not null, - "age" integer, - - "_deleted" boolean DEFAULT false NOT NULL, - "_modified" timestamp with time zone DEFAULT now() NOT NULL -); - --- auto-update the _modified timestamp -CREATE TRIGGER update_modified_datetime BEFORE UPDATE ON public.humans FOR EACH ROW -EXECUTE FUNCTION extensions.moddatetime('_modified'); - --- add a table to the publication so we can subscribe to changes -alter publication supabase_realtime add table "public"."humans"; -``` - -### Create an RxDB Database & Collection - -Create a normal RxDB database, then add a collection whose **schema mirrors your Supabase table**. The **primary key must match** (same column name and type), and fields should be **top-level simple types** (string/number/boolean). You don’t need to model server internals: the plugin maps the server’s \_deleted flag to doc.\_deleted automatically, and \_modified is optional in your schema (the plugin strips it on push and will include it on pull only if you define it). For browsers use a persistent storage like Localstorage or IndexedDB. For tests you can use the [in-memory storage](./rx-storage-memory.md). - -```ts -// client -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -export const db = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage() -}); - -await db.addCollections({ - humans: { - schema: { - version: 0, - primaryKey: 'passportId', - type: 'object', - properties: { - passportId: { type: 'string', maxLength: 100 }, - firstName: { type: 'string' }, - lastName: { type: 'string' }, - age: { type: 'number' } - }, - required: ['passportId', 'firstName', 'lastName'] - } - } -}); -``` - -### Create the Supabase Client - -Make a single Supabase client and reuse it across your app. In the browser, use the anon key (RLS-protected). On trusted servers you may use the service role key—but never ship that to clients. - - - -#### Production - -```ts -//> client - -import { createClient } from '@supabase/supabase-js'; - -export const supabase = createClient( - 'https://xyzcompany.supabase.co', - 'eyJhbGciOi...' -); -``` - -#### Vite - -```ts -//> client - -import { createClient } from '@supabase/supabase-js'; - -export const supabase = createClient( - import.meta.env.VITE_SUPABASE_URL!, // e.g. https://xyzcompany.supabase.co - import.meta.env.VITE_SUPABASE_ANON_KEY! // anon key for browsers - // optional options object here -); -``` - -#### Local Development - -```ts -//> client - -import { createClient } from '@supabase/supabase-js'; - -export const supabase = createClient( - 'http://127.0.0.1:54321', - 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' -); -``` - - - -### Start Replication - -Connect your RxDB collection to the Supabase table to start the replication. - -```ts -//> client - -import { replicateSupabase } from 'rxdb/plugins/replication-supabase'; - -const replication = replicateSupabase({ - tableName: 'humans', - client: supabase, - collection: db.humans, - replicationIdentifier: 'humans-supabase', - live: true, - pull: { - batchSize: 50, - // optional: shape incoming docs - modifier: (doc) => { - // map nullable age-field - if (!doc.age) delete doc.age; - return doc; - } - // optional: customize the pull query before fetching - queryBuilder: ({ query }) => { - // Add filters, joins, or other PostgREST query modifiers - // This runs before checkpoint filtering and ordering - return query.eq("status", "active"); - }, - }, - push: { - batchSize: 50 - }, - // optional overrides if your column names differ: - // modifiedField: '_modified', - // deletedField: '_deleted' -}); - -// (optional) observe errors and wait for the first sync barrier -replication.error$.subscribe(err => console.error('[replication]', err)); -await replication.awaitInitialReplication(); -``` - -:::note Nullable values must be mapped -Supabase returns `null` for nullable columns, but in RxDB you often model those fields as optional (i.e., they can be undefined/missing). To avoid schema errors, map `null` → `undefined` in the `pull.modifier` (usually by deleting the key). -::: - -### Do other things with the replication state - -The `RxSupabaseReplicationState` which is returned from `replicateSupabase()` allows you to run all functionality of the normal [RxReplicationState](./replication.md). - - - -## Follow Up - -- **Replication API Reference:** Learn the core concepts and lifecycle hooks — [Replication](./replication.md) -- **Offline-First Guide:** Caching, retries, and conflict strategies — [Local-First](./articles/local-first-future.md) -- **Supabase Essentials:** - - Row Level Security (RLS) — https://supabase.com/docs/guides/auth/row-level-security - - Realtime — https://supabase.com/docs/guides/realtime - - Local dev with the Supabase CLI — https://supabase.com/docs/guides/cli -- **Community:** Questions or feedback? Join our Discord — [Chat](./chat) - ---- - -## WebRTC P2P Replication with RxDB - Sync Browsers and Devices - -import {Steps} from '@site/src/components/steps'; - -# P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript - -WebRTC P2P data connections are revolutionizing real-time web and mobile development by **eliminating central servers** in scenarios where clients can communicate directly. With the **RxDB** [Sync Engine](./replication.md), you can sync your local database state across multiple browsers or devices via **WebRTC P2P (Peer-to-Peer)** connections, ensuring scalable, secure, and **low-latency** data flows without traditional server bottlenecks. - -## What is WebRTC? - -[WebRTC](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API) stands for Web [Real-Time](./articles/realtime-database.md) Communication. It is an open standard that enables browsers and native apps to exchange audio, video, or **arbitrary data** directly between peers, bypassing a central server after the initial connection is established. WebRTC uses NAT traversal techniques like [ICE](https://developer.liveswitch.io/liveswitch-server/guides/what-are-stun-turn-and-ice.html) (Interactive Connectivity Establishment) to punch through firewalls and establish direct links. This peer-to-peer nature drastically reduces latency while maintaining **high security** and **end-to-end encryption** capabilities. - -For a deeper look at comparing WebRTC with **WebSockets** and **WebTransport**, you can read our [comprehensive overview](./articles/websockets-sse-polling-webrtc-webtransport.md). While WebSockets or WebTransport often work in client-server contexts, WebRTC offers direct peer-to-peer connections ideal for fully decentralized data flows. - -
    - - - -
    - -## Benefits of P2P Sync with WebRTC Compared to Client-Server Architecture - -1. **Reduced Latency** - By skipping a central server hop, data travels directly from one client to another, minimizing round-trip times and improving responsiveness. -2. **Scalability** - New peers can join without overloading a central infrastructure. The sync overhead increases linearly with the number of connections rather than requiring a massive server cluster. -3. **Privacy & Ownership** - Data stays within the user’s devices, avoiding risks tied to storing data on third-party servers. This design aligns well with [local-first](./articles/local-first-future.md) or "[zero-latency](./articles/zero-latency-local-first.md)" apps. -4. **Resilience** - In some scenarios, if the central server is unreachable, P2P connections remain operational (assuming a functioning signaling path). Apps can still replicate data among local networks like when they are in the same Wifi or LAN. -5. **Cost Savings** - Reducing the reliance on a high-bandwidth server can cut hosting and bandwidth expenses, particularly in high-traffic or IoT-style use cases. - -
    - - - -
    - -## Peer-to-Peer (P2P) WebRTC Replication with the RxDB JavaScript Database - -Traditionally, real-time data synchronization depends on **centralized servers** to manage and distribute updates. In contrast, RxDB’s WebRTC P2P replication allows data to flow **directly** among clients, removing the server as a data store. This approach is **live** and **fully decentralized**, requiring only a [signaling server](#signaling-server) for initial discovery: - -- **No master-slave** concept - each peer hosts its own local RxDB. -- Clients ([browsers](./articles/browser-database.md), devices) connect to each other via WebRTC data channels. -- The [RxDB replication protocol](./replication.md) then handles pushing/pulling document changes across peers. - -Because RxDB is a NoSQL database and the replication protocol is straightforward, setting up robust P2P sync is far **easier** than orchestrating a complex client-server database architecture. - -## Using RxDB with the WebRTC Replication Plugin - -Before you use this plugin, make sure that you understand how [WebRTC works](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API). Here we build a todo-app that replicates todo-entries between clients: - -
    - - - -
    - -You can find a fully build example of this at the [RxDB Quickstart Repository](https://github.com/pubkey/rxdb-quickstart) which you can also [try out online](https://pubkey.github.io/rxdb-quickstart/). - -Four you create the [database](./rx-database.md) and then you can configure the replication: - - - -### Create the Database and Collection - -Here we create a database with the [localstorage](./rx-storage-localstorage.md) based storage that stores data inside of the [LocalStorage API](./articles/localstorage.md) in a browser. RxDB has a wide [range of storages](./rx-storage.md) for other JavaScript runtimes. - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -const db = await createRxDatabase({ - name: 'myTodoDB', - storage: getRxStorageLocalstorage() -}); - -await db.addCollections({ - todos: { - schema: { - title: 'todo schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string', maxLength: 100 }, - title: { type: 'string' }, - done: { type: 'boolean', default: false }, - created: { type: 'string', format: 'date-time' } - }, - required: ['id', 'title', 'done'] - } - } -}); - -// insert an example document -await db.todos.insert({ - id: 'todo-1', - title: 'P2P demo task', - done: false, - created: new Date().toISOString() -}); -``` - -### Import the WebRTC replication plugin - -```ts -import { - replicateWebRTC, - getConnectionHandlerSimplePeer -} from 'rxdb/plugins/replication-webrtc'; -``` - -### Start the P2P replication - -To start the replication you have to call `replicateWebRTC` on the [collection](./rx-collection.md). - -As options you have to provide a `topic` and a connection handler function that implements the `P2PConnectionHandlerCreator` interface. As default you should start with the `getConnectionHandlerSimplePeer` method which uses the [simple-peer](https://github.com/feross/simple-peer) library and comes shipped with RxDB. - -```ts -const replicationPool = await replicateWebRTC( - { - // Start the replication for a single collection - collection: db.todos, - - // The topic is like a 'room-name'. All clients with the same topic - // will replicate with each other. In most cases you want to use - // a different topic string per user. Also you should prefix the topic with - // a unique identifier for your app, to ensure you do not let your users connect - // with other apps that also use the RxDB P2P Replication. - topic: 'my-users-pool', - /** - * You need a collection handler to be able to create WebRTC connections. - * Here we use the simple peer handler which uses the 'simple-peer' npm library. - * To learn how to create a custom connection handler, read the source code, - * it is pretty simple. - */ - connectionHandlerCreator: getConnectionHandlerSimplePeer({ - // Set the signaling server url. - // You can use the server provided by RxDB for tryouts, - // but in production you should use your own server instead. - signalingServerUrl: 'wss://signaling.rxdb.info/', - - // only in Node.js, we need the wrtc library - // because Node.js does not contain the WebRTC API. - wrtc: require('node-datachannel/polyfill'), - - // only in Node.js, we need the WebSocket library - // because Node.js does not contain the WebSocket API. - webSocketConstructor: require('ws').WebSocket - }), - pull: {}, - push: {} - } -); -``` - -Notice that in difference to the other [replication plugins](./replication.md), the WebRTC replication returns a `replicationPool` instead of a single `RxReplicationState`. The `replicationPool` contains all replication states of the connected peers in the P2P network. - -### Observe Errors - -To ensure we log out potential errors, observe the `error$` observable of the pool. - -```ts -replicationPool.error$.subscribe(err => console.error('WebRTC Error:', err)); -``` - -### Stop the Replication - -You can also dynamically stop the replication. -```ts -replicationPool.cancel(); -``` - - -## Live replications - -The WebRTC replication is **always live** because there can not be a one-time sync when it is always possible to have new Peers that join the connection pool. Therefore you cannot set the `live: false` option like in the other replication plugins. - -## Signaling Server - -For P2P replication to work with the RxDB WebRTC Replication Plugin, a [signaling server](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Signaling_and_video_calling) is required. The signaling server helps peers discover each other and establish connections. - -RxDB ships with a default signaling server that can be used with the simple-peer connection handler. This server is made for demonstration purposes and tryouts. It is not reliable and might be offline at any time. -In production you must always use your own signaling server instead! - -Creating a basic signaling server is straightforward. The provided example uses 'socket.io' for WebSocket communication. However, in production, you'd want to create a more robust signaling server with authentication and additional logic to suit your application's needs. - -Here is a quick example implementation of a signaling server that can be used with the connection handler from `getConnectionHandlerSimplePeer()`: - -```ts -import { - startSignalingServerSimplePeer -} from 'rxdb/plugins/replication-webrtc'; - -const serverState = await startSignalingServerSimplePeer({ - port: 8080 // <- port -}); -``` - -For custom signaling servers with more complex logic, you can check the [source code of the default one](https://github.com/pubkey/rxdb/blob/master/src/plugins/replication-webrtc/signaling-server.ts). - -## Peer Validation - -By default the replication will replicate with every peer the signaling server tells them about. -You can prevent invalid peers from replication by passing a custom `isPeerValid()` function that either returns `true` on valid peers and `false` on invalid peers. - -```ts -const replicationPool = await replicateWebRTC( - { - /* ... */ - isPeerValid: async (peer) => { - return true; - } - pull: {}, - push: {} - /* ... */ - } -); -``` - -## Conflict detection in WebRTC replication - -RxDB's conflict handling works by detecting and resolving conflicts that may arise when multiple clients in a decentralized database system attempt to modify the same data concurrently. -A **custom conflict handler** can be set up, which is a plain JavaScript function. The conflict handler is run on each replicated document write and resolves the conflict if required. [Find out more about RxDB conflict handling here](https://rxdb.info/transactions-conflicts-revisions.html) - -## Known problems - -### SimplePeer requires to have `process.nextTick()` - -In the browser you might not have a process variable or process.nextTick() method. But the [simple peer](https://github.com/feross/simple-peer) uses that so you have to polyfill it. - -In webpack you can use the `process/browser` package to polyfill it: - -```js -const plugins = [ - /* ... */ - new webpack.ProvidePlugin({ - process: 'process/browser', - }) - /* ... */ -]; -``` - -In angular or other libraries you can add the polyfill manually: - -```js -window.process = { - nextTick: (fn, ...args) => setTimeout(() => fn(...args)), -}; - -``` - -### Polyfill the WebSocket and WebRTC API in Node.js - -While all modern browsers support the WebRTC and WebSocket APIs, they is missing in Node.js which will throw the error `No WebRTC support: Specify opts.wrtc option in this environment`. Therefore you have to polyfill it with a compatible WebRTC and WebSocket polyfill. It is recommended to use the [node-datachannel package](https://github.com/murat-dogan/node-datachannel/tree/master/src/polyfill) for WebRTC which **does not** come with RxDB but has to be installed before via `npm install node-datachannel --save`. -For the Websocket API use the `ws` package that is included into RxDB. - -```ts -import nodeDatachannelPolyfill from 'node-datachannel/polyfill'; -import { WebSocket } from 'ws'; -const replicationPool = await replicateWebRTC( - { - /* ... */ - connectionHandlerCreator: getConnectionHandlerSimplePeer({ - signalingServerUrl: 'wss://example.com:8080', - wrtc: nodeDatachannelPolyfill, - webSocketConstructor: WebSocket - }), - pull: {}, - push: {} - /* ... */ - } -); -``` - -## Storing replicated data encrypted on client device - -Storing replicated data encrypted on client devices using the RxDB Encryption Plugin is a pivotal step towards bolstering **data security** and **user privacy**. -The WebRTC replication plugin seamlessly integrates with the [RxDB encryption plugins](./encryption.md), providing a robust solution for encrypting sensitive information before it's stored locally. By doing so, it ensures that even if unauthorized access to the device occurs, the data remains protected and unintelligible without the encryption key (or password). This approach is particularly vital in scenarios where user-generated content or confidential data is replicated across devices, as it empowers users with control over their own data while adhering to stringent security standards. [Read more about the encryption plugins here](./encryption.md). - -## Follow Up - -- **Check out the [RxDB Quickstart](./quickstart.md)** to see how to set up your first RxDB database. -- **Explore advanced features** like [Custom Conflict Handling](./transactions-conflicts-revisions.md) or [Offline-First Performance](./rx-storage-performance.md). -- **Try an example** at [RxDB Quickstart GitHub](https://github.com/pubkey/rxdb-quickstart) to see a working P2P Sync setup. -- **Join the RxDB Community** on [GitHub](/code/) or [Discord](/chat/) if you have questions or want to share your P2P WebRTC experiences. - ---- - -## Websocket Replication - - -With the websocket replication plugin, you can spawn a websocket server from a RxDB database in Node.js and replicate with it. - -:::note -The websocket replication plugin does not have any concept for authentication or permission handling. It is designed to create an easy **server-to-server** replication. It is **not** made for client-server replication. Make a pull request if you need that feature. -::: - -## Starting the Websocket Server - -```ts -import { createRxDatabase } from 'rxdb'; -import { - startWebsocketServer -} from 'rxdb/plugins/replication-websocket'; - -// create a RxDatabase like normal -const myDatabase = await createRxDatabase({/* ... */}); - -// start a websocket server -const serverState = await startWebsocketServer({ - database: myDatabase, - port: 1337, - path: '/socket' -}); - -// stop the server -await serverState.close(); -``` - -## Connect to the Websocket Server - -The replication has to be started once for each collection that you want to replicate. - -```ts -import { - replicateWithWebsocketServer -} from 'rxdb/plugins/replication-websocket'; - -// start the replication -const replicationState = await replicateWithWebsocketServer({ - /** - * To make the replication work, - * the client collection name must be equal - * to the server collection name. - */ - collection: myRxCollection, - url: 'ws://localhost:1337/socket' -}); - -// stop the replication -await replicationState.cancel(); -``` - -## Customize - -We use the [ws](https://www.npmjs.com/package/ws) npm library, so you can use all optional configuration provided by it. -This is especially important to improve performance by opting in of some optional settings. - ---- - -## ⚙️ RxDB realtime Sync Engine for Local-First Apps - -# RxDB's realtime Sync Engine for Local-First Apps - -The RxDB Sync Engine provides the ability to sync the database state in **realtime** between the clients and the server. - -The backend server does not have to be a RxDB instance; you can build a replication with **any infrastructure**. -For example you can replicate with a [custom GraphQL endpoint](./replication-graphql.md) or a [HTTP server](./replication-http.md) on top of a PostgreSQL or MongoDB database. - -The replication is made to support the [Local-First](./articles/local-first-future.md) paradigm, so that when the client goes [offline](./offline-first.md), the RxDB [database](./rx-database.md) can still read and write [locally](./articles/local-database.md) and will continue the replication when the client goes online again. - -## Design Decisions of the Sync Engine - -In contrast to other (server-side) database replication protocols, the RxDB Sync Engine was designed with these goals in mind: - -- **Easy to Understand**: The sync engine works in a simple "git-like" way that is easy to understand for an average developer. You only have to understand how three simple endpoints work. -- **Complex Parts are in RxDB, not in the Backend**: The complex parts of the Sync Engine, like [conflict handling](./transactions-conflicts-revisions.md) or offline-online switches, are implemented inside of RxDB itself. This makes creating a compatible backend very easy. -- **Compatible with any Backend**: Because the complex parts are in RxDB, the backend can be "dump" which makes the protocol compatible to almost every backend. No matter if you use PostgreSQL, MongoDB or anything else. -- **Performance is optimized for Client Devices and Browsers**: By grouping updates and fetches into batches, it is faster to transfer and easier to compress. Client devices and browsers can also process this data faster, for example running `JSON.parse()` on a chunk of data is faster than calling it once per row. Same goes for how client side storage like [IndexedDB](./rx-storage-indexeddb.md) or [OPFS](./rx-storage-opfs.md) works where writing data in bulks is faster. -- **Offline-First Support**: By incorporating conflict handling at the client side, the protocol fully supports [offline-first apps](./offline-first.md). Users can continue making changes while offline, and those updates will sync seamlessly once a connection is reestablished - all without risking data loss or having undefined behavior. -- **Multi-Tab Support**: When RxDB is used in a browser and multiple tabs of the same application are opened, only exactly one runs the replication at any given time. This reduces client- and backend resources. - -## The Sync Engine on the document level - -On the RxDocument level, the replication works like git, where the fork/client contains all new writes and must be merged with the master/server before it can push its new state to the master/server. - -``` -A---B-----------D master/server state - \ / - B---C---D fork/client state -``` - -- The client pulls the latest state `B` from the master. -- The client does some changes `C+D`. -- The client pushes these changes to the master by sending the latest known master state `B` and the new client state `D` of the document. -- If the master state is equal to the latest master `B` state of the client, the new client state `D` is set as the latest master state. -- If the master also had changes and so the latest master change is different then the one that the client assumes, we have a conflict that has to be resolved on the client. - -## The Sync Engine on the transfer level - -When document states are transferred, all handlers use batches of documents for better performance. -The server **must** implement the following methods to be compatible with the replication: - -- **pullHandler** Get the last checkpoint (or null) as input. Returns all documents that have been written **after** the given checkpoint. Also returns the checkpoint of the latest written returned document. -- **pushHandler** a method that can be called by the client to send client side writes to the master. It gets an array with the `assumedMasterState` and the `newForkState` of each document write as input. It must return an array that contains the master document states of all conflicts. If there are no conflicts, it must return an empty array. -- **pullStream** an observable that emits batches of all master writes and the latest checkpoint of the write batches. - -``` - +--------+ +--------+ - | | pullHandler() | | - | |---------------------> | | - | | | | - | | | | - | Client | pushHandler() | Server | - | |---------------------> | | - | | | | - | | pullStream$ | | - | | <-------------------------| | - +--------+ +--------+ -``` - -The replication runs in two **different modes**: - -### Checkpoint iteration - -On first initial replication, or when the client comes online again, a checkpoint based iteration is used to catch up with the server state. -A checkpoint is a subset of the fields of the last pulled document. When the checkpoint is send to the backend via `pullHandler()`, the backend must be able to respond with all documents that have been written **after** the given checkpoint. -For example if your documents contain an `id` and an `updatedAt` field, these two can be used as checkpoint. - -When the checkpoint iteration reaches the last checkpoint, where the backend returns an empty array because there are no newer documents, the replication will automatically switch to the `event observation` mode. - -### Event observation - -While the client is connected to the backend, the events from the backend are observed via `pullStream$` and persisted to the client. - -If your backend for any reason is not able to provide a full `pullStream$` that contains all events and the checkpoint, you can instead only emit `RESYNC` events that tell RxDB that anything unknown has changed on the server and it should run the pull replication via [checkpoint iteration](#checkpoint-iteration). - -When the client goes offline and online again, it might happen that the `pullStream$` has missed out some events. Therefore the `pullStream$` should also emit a `RESYNC` event each time the client reconnects, so that the client can become in sync with the backend via the [checkpoint iteration](#checkpoint-iteration) mode. - -## Data layout on the server - -To use the replication you first have to ensure that: -- **documents are deterministic sortable by their last write time** - - *deterministic* means that even if two documents have the same *last write time*, they have a predictable sort order. - This is most often ensured by using the *primaryKey* as second sort parameter as part of the checkpoint. - -- **documents are never deleted, instead the `_deleted` field is set to `true`.** - - This is needed so that the deletion state of a document exists in the database and can be replicated with other instances. If your backend uses a different field to mark deleted documents, you have to transform the data in the push/pull handlers or with the modifiers. - -For example if your documents look like this: - -```ts -const docData = { - "id": "foobar", - "name": "Alice", - "lastName": "Wilson", - /** - * Contains the last write timestamp - * so all documents writes can be sorted by that value - * when they are fetched from the remote instance. - */ - "updatedAt": 1564483474, - /** - * Instead of physically deleting documents, - * a deleted document gets replicated. - */ - "_deleted": false -} -``` - -Then your data is always sortable by `updatedAt`. This ensures that when RxDB fetches 'new' changes via `pullHandler()`, it can send the latest `updatedAt+id` checkpoint to the remote endpoint and then receive all newer documents. - -By default, the field is `_deleted`. If your remote endpoint uses a different field to mark deleted documents, you can set the `deletedField` in the replication options which will automatically map the field on all pull and push requests. - -## Conflict handling - -When multiple clients (or the server) modify the same document at the same time (or when they are offline), it can happen that a conflict arises during the replication. - -``` -A---B1---C1---X master/server state - \ / - B1---C2 fork/client state -``` - -In the case above, the client would tell the master to move the document state from `B1` to `C2` by calling `pushHandler()`. But because the actual master state is `C1` and not `B1`, the master would reject the write by sending back the actual master state `C1`. -**RxDB resolves all conflicts on the client** so it would call the conflict handler of the `RxCollection` and create a new document state `D` that can then be written to the master. - -``` -A---B1---C1---X---D master/server state - \ / \ / - B1---C2---D fork/client state -``` - -The default conflict handler will always drop the fork state and use the master state. This ensures that clients that are offline for a very long time, do not accidentally overwrite other peoples changes when they go online again. -You can specify a custom conflict handler by setting the property `conflictHandler` when calling `addCollection()`. - -Learn how to create a [custom conflict handler](./transactions-conflicts-revisions.md#custom-conflict-handler). - -## replicateRxCollection() - -You can start the replication of a single `RxCollection` by calling `replicateRxCollection()` like in the following: - -```ts -import { replicateRxCollection } from 'rxdb/plugins/replication'; -import { - lastOfArray -} from 'rxdb'; -const replicationState = await replicateRxCollection({ - collection: myRxCollection, - /** - * An id for the replication to identify it - * and so that RxDB is able to resume the replication on app reload. - * If you replicate with a remote server, it is recommended to put the - * server url into the replicationIdentifier. - */ - replicationIdentifier: 'my-rest-replication-to-https://example.com/api/sync', - /** - * By default it will do an ongoing realtime replication. - * By settings live: false the replication will run once until the local state - * is in sync with the remote state, then it will cancel itself. - * (optional), default is true. - */ - live: true, - /** - * Time in milliseconds after when a failed backend request - * has to be retried. - * This time will be skipped if a offline->online switch is detected - * via navigator.onLine - * (optional), default is 5 seconds. - */ - retryTime: 5 * 1000, - /** - * When multiInstance is true, like when you use RxDB in multiple browser tabs, - * the replication should always run in only one of the open browser tabs. - * If waitForLeadership is true, it will wait until the current instance is leader. - * If waitForLeadership is false, it will start replicating, even if it is not leader. - * [default=true] - */ - waitForLeadership: true, - /** - * If this is set to false, - * the replication will not start automatically - * but will wait for replicationState.start() being called. - * (optional), default is true - */ - autoStart: true, - - /** - * Custom deleted field, the boolean property of the document data that - * marks a document as being deleted. - * If your backend uses a different fieldname then '_deleted', set the fieldname here. - * RxDB will still store the documents internally with '_deleted', setting this field - * only maps the data on the data layer. - * - * If a custom deleted field contains a non-boolean value, the deleted state - * of the documents depends on if the value is truthy or not. So instead of providing a boolean * * deleted value, you could also work with using a 'deletedAt' timestamp instead. - * - * [default='_deleted'] - */ - deletedField: 'deleted', - - /** - * Optional, - * only needed when you want to replicate local changes to the remote instance. - */ - push: { - /** - * Push handler - */ - async handler(docs) { - /** - * Push the local documents to a remote REST server. - */ - const rawResponse = await fetch('https://example.com/api/sync/push', { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ docs }) - }); - /** - * Contains an array with all conflicts that appeared during this push. - * If there were no conflicts, return an empty array. - */ - const response = await rawResponse.json(); - return response; - }, - /** - * Batch size, optional - * Defines how many documents will be given to the push handler at once. - */ - batchSize: 5, - /** - * Modifies all documents before they are given to the push handler. - * Can be used to swap out a custom deleted flag instead of the '_deleted' field. - * If the push modifier return null, the document will be skipped and not send to the remote. - * Notice that the modifier can be called multiple times and should not contain any side effects. - * (optional) - */ - modifier: d => d - }, - /** - * Optional, - * only needed when you want to replicate remote changes to the local state. - */ - pull: { - /** - * Pull handler - */ - async handler(lastCheckpoint, batchSize) { - const minTimestamp = lastCheckpoint ? lastCheckpoint.updatedAt : 0; - /** - * In this example we replicate with a remote REST server - */ - const response = await fetch( - `https://example.com/api/sync/?minUpdatedAt=${minTimestamp}&limit=${batchSize}` - ); - const documentsFromRemote = await response.json(); - return { - /** - * Contains the pulled documents from the remote. - * Not that if documentsFromRemote.length < batchSize, - * then RxDB assumes that there are no more un-replicated documents - * on the backend, so the replication will switch to 'Event observation' mode. - */ - documents: documentsFromRemote, - /** - * The last checkpoint of the returned documents. - * On the next call to the pull handler, - * this checkpoint will be passed as 'lastCheckpoint' - */ - checkpoint: documentsFromRemote.length === 0 ? lastCheckpoint : { - id: lastOfArray(documentsFromRemote).id, - updatedAt: lastOfArray(documentsFromRemote).updatedAt - } - }; - }, - batchSize: 10, - /** - * Modifies all documents after they have been pulled - * but before they are used by RxDB. - * Notice that the modifier can be called multiple times and should not contain any side effects. - * (optional) - */ - modifier: d => d, - /** - * Stream of the backend document writes. - * See below. - * You only need a stream$ when you have set live=true - */ - stream$: pullStream$.asObservable() - }, -}); - -/** - * Creating the pull stream for realtime replication. - * Here we use a websocket but any other way of sending data to the client can be used, - * like long polling or server-sent events. - */ -const pullStream$ = new Subject>(); -let firstOpen = true; -function connectSocket() { - const socket = new WebSocket('wss://example.com/api/sync/stream'); - /** - * When the backend sends a new batch of documents+checkpoint, - * emit it into the stream$. - * - * event.data must look like this - * { - * documents: [ - * { - * id: 'foobar', - * _deleted: false, - * updatedAt: 1234 - * } - * ], - * checkpoint: { - * id: 'foobar', - * updatedAt: 1234 - * } - * } - */ - socket.onmessage = event => pullStream$.next(event.data); - /** - * Automatically reconnect the socket on close and error. - */ - socket.onclose = () => connectSocket(); - socket.onerror = () => socket.close(); - - socket.onopen = () => { - if(firstOpen) { - firstOpen = false; - } else { - /** - * When the client is offline and goes online again, - * it might have missed out events that happened on the server. - * So we have to emit a RESYNC so that the replication goes - * into 'Checkpoint iteration' mode until the client is in sync - * and then it will go back into 'Event observation' mode again. - */ - pullStream$.next('RESYNC'); - } - } -} - -``` - -## Multi Tab support - -For better performance, the replication runs only in one instance when RxDB is used in multiple browser tabs or Node.js processes. -By setting `waitForLeadership: false` you can enforce that each tab runs its own replication cycles. -If used in a multi instance setting, so when at database creation `multiInstance: false` was not set, -you need to import the [leader election plugin](./leader-election.md) so that RxDB can know how many instances exist and which browser tab should run the replication. - -## Error handling - -When sending a document to the remote fails for any reason, RxDB will send it again in a later point in time. -This happens for **all** errors. The document write could have already reached the remote instance and be processed, while only the answering fails. -The remote instance must be designed to handle this properly and to not crash on duplicate data transmissions. -Depending on your use case, it might be ok to just write the duplicate document data again. -But for a more resilient error handling you could compare the last write timestamps or add a unique write id field to the document. This field can then be used to detect duplicates and ignore re-send data. - -Also the replication has an `.error$` stream that emits all `RxError` objects that arise during replication. -Notice that these errors contain an inner `.parameters.errors` field that contains the original error. Also they contain a `.parameters.direction` field that indicates if the error was thrown during `pull` or `push`. You can use these to properly handle errors. For example when the client is outdated, the server might respond with a `426 Upgrade Required` error code that can then be used to force a page reload. - -```ts -replicationState.error$.subscribe((error) => { - if( - error.parameters.errors && - error.parameters.errors[0] && - error.parameters.errors[0].code === 426 - ) { - // client is outdated -> enforce a page reload - location.reload(); - } -}); -``` - -## Security - -Be aware that client side clocks can never be trusted. When you have a client-backend replication, the backend should overwrite the `updatedAt` timestamp or use another field, when it receives the change from the client. - -## RxReplicationState - -The function `replicateRxCollection()` returns a `RxReplicationState` that can be used to manage and observe the replication. - -### Observable - -To observe the replication, the `RxReplicationState` has some `Observable` properties: - -```ts -// emits each document that was received from the remote -myRxReplicationState.received$.subscribe(doc => console.dir(doc)); - -// emits each document that was send to the remote -myRxReplicationState.sent$.subscribe(doc => console.dir(doc)); - -// emits all errors that happen when running the push- & pull-handlers. -myRxReplicationState.error$.subscribe(error => console.dir(error)); - -// emits true when the replication was canceled, false when not. -myRxReplicationState.canceled$.subscribe(bool => console.dir(bool)); - -// emits true when a replication cycle is running, false when not. -myRxReplicationState.active$.subscribe(bool => console.dir(bool)); -``` - -### awaitInitialReplication() - -With `awaitInitialReplication()` you can await the initial replication that is done when a full replication cycle was successful finished for the first time. The returned promise will never resolve if you cancel the replication before the initial replication can be done. - -```ts -await myRxReplicationState.awaitInitialReplication(); -``` - -### awaitInSync() - -Returns a `Promise` that resolves when: -- `awaitInitialReplication()` has emitted. -- All local data is replicated with the remote. -- No replication cycle is running or in retry-state. - -:::warning -When `multiInstance: true` and `waitForLeadership: true` and another tab is already running the replication, `awaitInSync()` will not resolve until the other tab is closed and the replication starts in this tab. - -```ts -await myRxReplicationState.awaitInSync(); -``` -::: - -:::warning - -#### `awaitInitialReplication()` and `awaitInSync()` should not be used to block the application - -A common mistake in RxDB usage is when developers want to block the app usage until the application is in sync. -Often they just `await` the promise of `awaitInitialReplication()` or `awaitInSync()` and show a loading spinner until they resolve. This is dangerous and should not be done because: -- When `multiInstance: true` and `waitForLeadership: true (default)` and another tab is already running the replication, `awaitInitialReplication()` will not resolve until the other tab is closed and the replication starts in this tab. -- Your app can no longer be started when the device is offline because there the `awaitInitialReplication()` will never resolve and the app cannot be used. - -Instead you should store the last in-sync time in a [local document](./rx-local-document.md) and observe its value on all instances. - -For example if you want to block clients from using the app if they have not been in sync for the last 24 hours, you could use this code: -```ts - -// update last-in-sync-flag each time replication is in sync -await myCollection.insertLocal('last-in-sync', { time: 0 }).catch(); // ensure flag exists -myReplicationState.active$.pipe( - mergeMap(async() => { - await myReplicationState.awaitInSync(); - await myCollection.upsertLocal('last-in-sync', { time: Date.now() }) - }) -); - -// observe the flag and toggle loading spinner -await showLoadingSpinner(); -const oneDay = 1000 * 60 * 60 * 24; -await firstValueFrom( - myCollection.getLocal$('last-in-sync').pipe( - filter(d => d.get('time') > (Date.now() - oneDay)) - ) -); -await hideLoadingSpinner(); -``` - -::: - -### reSync() - -Triggers a `RESYNC` cycle where the replication goes into [checkpoint iteration](#checkpoint-iteration) until the client is in sync with the backend. Used in unit tests or when no proper `pull.stream$` can be implemented so that the client only knows that something has been changed but not what. - -```ts -myRxReplicationState.reSync(); -``` - -If your backend is not capable of sending events to the client at all, you could run `reSync()` in an interval so that the client will automatically fetch server changes after some time at least. - -```ts -// trigger RESYNC each 10 seconds. -setInterval(() => myRxReplicationState.reSync(), 10 * 1000); -``` - -### cancel() - -Cancels the replication. Returns a promise that resolved when everything has been cleaned up. - -```ts -await myRxReplicationState.cancel(); -``` - -### pause() - -Pauses a running replication. The replication can later be resumed with `RxReplicationState.start()`. - -```ts -await myRxReplicationState.pause(); -await myRxReplicationState.start(); // restart -``` - -### remove() - -Cancels the replication and deletes the metadata of the replication state. This can be used to restart the replication "from scratch". Calling `.remove()` will only delete the replication metadata, it will NOT delete the documents from the collection of the replication. - -```ts -await myRxReplicationState.remove(); -``` - -### isStopped() - -Returns `true` if the replication is stopped. This can be if a non-live replication is finished or a replication got canceled. - -```js -replicationState.isStopped(); // true/false -``` - -### isPaused() - -Returns `true` if the replication is paused. - -```js -replicationState.isPaused(); // true/false -``` - -### Setting a custom initialCheckpoint - -By default, the push replication will start from the beginning of time and push all documents from there to the remote. -By setting a custom `push.initialCheckpoint`, you can tell the replication to only push writes that are newer than the given checkpoint. - -```ts -// store the latest checkpoint of a collection -let lastLocalCheckpoint: any; -myCollection.checkpoint$.subscribe(checkpoint => lastLocalCheckpoint = checkpoint); - -// start the replication but only push documents that are newer than the lastLocalCheckpoint -const replicationState = replicateRxCollection({ - collection: myCollection, - replicationIdentifier: 'my-custom-replication-with-init-checkpoint', - /* ... */ - push: { - handler: /* ... */, - initialCheckpoint: lastLocalCheckpoint - } -}); -``` - -The same can be done for the other direction by setting a `pull.initialCheckpoint`. Notice that here we need the remote checkpoint from the backend instead of the one from the RxDB storage. - -```ts -// get the last pull checkpoint from the server -const lastRemoteCheckpoint = await (await fetch('http://example.com/pull-checkpoint')).json(); - -// start the replication but only pull documents that are newer than the lastRemoteCheckpoint -const replicationState = replicateRxCollection({ - collection: myCollection, - replicationIdentifier: 'my-custom-replication-with-init-checkpoint', - /* ... */ - pull: { - handler: /* ... */, - initialCheckpoint: lastRemoteCheckpoint - } -}); -``` - -### toggleOnDocumentVisible - -Ensures replication continues running when the document is `visible`. This helps avoid situations where the leader-elected tab becomes stale or is hibernated by the browser to save battery. -When the tab becomes hidden, replication is automatically paused; when the tab becomes visible again (or the instance becomes leader), replication resumes. - -**Default:** `true` - -```ts -const replicationState = replicateRxCollection({ - toggleOnDocumentVisible: true, - /* ... */ -}); -``` - -## Attachment replication - -Attachment replication is supported in the RxDB Sync Engine itself. However not all replication plugins support it. -If you start the replication with a collection which has [enabled RxAttachments](./rx-attachment.md) attachments data will be added to all push- and write data. - -The pushed documents will contain an `_attachments` object which contains: - -- The attachment meta data (id, length, digest) of all non-attachments -- The full attachment data of all attachments that have been updated/added from the client. -- Deleted attachments are spared out in the pushed document. - -With this data, the backend can decide onto which attachments must be deleted, added or overwritten. - -Accordingly, the pulled document must contain the same data, if the backend has a new document state with updated attachments. - -## Pull-Only Replication - -With the replication protocol it is possible to do pull only replications where data is pulled from a backend but not pushed from the client. RxDB implements some performance optimizations for these like not storing server metadata on pull only streams. - -## Partial Sync with RxDB - -Suppose you're building a Minecraft-like voxel game where the world can expand in every direction. Storing the entire map locally for offline use is impossible because the dataset could be massive. Yet you still want a local-first design so players can edit the game world offline and sync back to the server later. - -### Idea: One Collection, Multiple Replications - -You might define a single RxDB collection called `db.voxels`, where each document represents a block or "voxel" (with fields like id, chunkId, coordinates, and type). With RxDB you can, instead of setting up _one_ replication that tries to fetch _all_ voxels, you create **separate replication states** for each _chunk_ of the world the player is currently near. - -When the player enters a particular chunk (say `chunk-123`), you **start a replication** dedicated to that chunk. On the server side, you have endpoints to **pull** only that chunk's voxels (e.g., GET `/api/voxels/pull?chunkId=123`) and **push** local changes back (e.g., POST `/api/voxels/push?chunkId=123`). RxDB handles them similarly to any other offline-first setup, but each replication is filtered to only that chunk's data. - -When the player leaves `chunk-123` and no longer needs it, you **stop** that replication. If the player moves to `chunk-124`, you start a new replication for chunk 124. This ensures the game only downloads and syncs data relevant to the player's immediate location. Meanwhile, all edits made offline remain safely stored in the local database until a network connection is available. - -```ts -const activeReplications = {}; // chunkId -> replicationState - -function startChunkReplication(chunkId) { - if (activeReplications[chunkId]) return; - const replicationId = 'voxels-chunk-' + chunkId; - - const replicationState = replicateRxCollection({ - collection: db.voxels, - replicationIdentifier: replicationId, - pull: { - async handler(checkpoint, limit) { - const res = await fetch( - `/api/voxels/pull?chunkId=${chunkId}&cp=${checkpoint}&limit=${limit}` - ); - /* ... */ - } - }, - push: { - async handler(changedDocs) { - const res = await fetch(`/api/voxels/push?chunkId=${chunkId}`); - /* ... */ - } - } - }); - activeReplications[chunkId] = replicationState; -} - -function stopChunkReplication(chunkId) { - const rep = await activeReplications[chunkId]; - if (rep) { - rep.cancel(); - delete activeReplications[chunkId]; - } -} - -// Called whenever the player's location changes; -// dynamically start/stop replication for nearby chunks. -function onPlayerMove(neighboringChunkIds) { - neighboringChunkIds.forEach(startChunkReplication); - Object.keys(activeReplications).forEach(cid => { - if (!neighboringChunkIds.includes(cid)) { - stopChunkReplication(cid); - } - }); -} -``` - -### Diffy-Sync when Revisiting a Chunk - -An added benefit of this multi-replication-state design is checkpointing. Each replication state has a unique "replication identifier," so the next time the player returns to `chunk-123`, the local database knows what it already has and only fetches the differences without the need to re-download the entire chunk. - -### Partial Sync in a Local-First Business Application - -Though a voxel world is an intuitive example, the same technique applies in enterprise scenarios where data sets are large but each user only needs a specific subset. You could spin up a new replication for each "permission group" or "region," so users only sync the records they're allowed to see. Or in a CRM, the replication might be filtered by the specific accounts or projects a user is currently handling. As soon as they switch to a different project, you stop the old replication and start one for the new scope. - -This **chunk-based** or **scope-based** replication pattern keeps your local storage lean, reduces network overhead, and still gives users the offline, instant-feedback experience that local-first apps are known for. By dynamically creating (and canceling) replication states, you retain tight control over bandwidth usage and make the infinite (or very large) feasible. In a production app you would also "flag" the entities (with a `pull.modifier`) by which replication state they came from, so that you can clean up the parts that you no longer need. --> - -## FAQ - -
    - I have infinite loops in my replication, how to debug? - - When you have infinite loops in your replication or random re-runs of http requests after some time, the reason is likely that your pull-handler - is crashing. The debug this, add a log to the error$ handler to debug it. `myRxReplicationState.error$.subscribe(err => console.log('error$', err))`. - -
    - ---- - -## Attachments - - -Attachments are binary data files that can be attachment to an `RxDocument`, like a file that is attached to an email. - -Using attachments instead of adding the data to the normal document, ensures that you still have a good **performance** when querying and writing documents, even when a big amount of data, like an image file has to be stored. - -- You can store string, binary files, images and whatever you want side by side with your documents. -- Deleted documents automatically loose all their attachments data. -- Not all replication plugins support the replication of attachments. -- Attachments can be stored [encrypted](./encryption.md). - -Internally, attachments in RxDB are stored and handled similar to how [CouchDB, PouchDB](https://pouchdb.com/guides/attachments.html#how-attachments-are-stored) does it. - -## Add the attachments plugin - -To enable the attachments, you have to add the `attachments` plugin. - -```ts -import { addRxPlugin } from 'rxdb'; -import { RxDBAttachmentsPlugin } from 'rxdb/plugins/attachments'; -addRxPlugin(RxDBAttachmentsPlugin); -``` - -## Enable attachments in the schema - -Before you can use attachments, you have to ensure that the attachments-object is set in the schema of your `RxCollection`. - -```javascript - -const mySchema = { - version: 0, - type: 'object', - properties: { - // . - // . - // . - }, - attachments: { - encrypted: true // if true, the attachment-data will be encrypted with the db-password - } -}; - -const myCollection = await myDatabase.addCollections({ - humans: { - schema: mySchema - } -}); -``` - -## putAttachment() - -Adds an attachment to a `RxDocument`. Returns a Promise with the new attachment. - -```javascript -import { createBlob } from 'rxdb'; - -const attachment = await myDocument.putAttachment( - { - id: 'cat.txt', // (string) name of the attachment - data: createBlob('meowmeow', 'text/plain'), // (string|Blob) data of the attachment - type: 'text/plain' // (string) type of the attachment-data like 'image/jpeg' - } -); -``` - -:::warning -Expo/React-Native does not support the `Blob` API natively. Make sure you use your own polyfill that properly supports `blob.arrayBuffer()` when using RxAttachments or use the `putAttachmentBase64()` and `getDataBase64()` so that you do not have to create blobs. -::: - -## putAttachmentBase64() - -Same as `putAttachment()` but accepts a plain base64 string instead of a `Blob`. - -```ts -const attachment = await doc.putAttachmentBase64({ - id: 'cat.txt', - length: 4, - data: 'bWVvdw==', - type: 'text/plain' -}); -``` - -## getAttachment() - -Returns an `RxAttachment` by its id. Returns `null` when the attachment does not exist. - -```javascript -const attachment = myDocument.getAttachment('cat.jpg'); -``` - -## allAttachments() - -Returns an array of all attachments of the `RxDocument`. - -```javascript -const attachments = myDocument.allAttachments(); -``` - -## allAttachments$ - -Gets an Observable which emits a stream of all attachments from the document. Re-emits each time an attachment gets added or removed from the RxDocument. - -```javascript -const all = []; -myDocument.allAttachments$.subscribe( - attachments => all = attachments -); -``` - -## RxAttachment - -The attachments of RxDB are represented by the type `RxAttachment` which has the following attributes/methods. - -### doc - -The `RxDocument` which the attachment is assigned to. - -### id - -The id as `string` of the attachment. - -### type - -The type as `string` of the attachment. - -### length - -The length of the data of the attachment as `number`. - -### digest - -The hash of the attachments data as `string`. - -:::note -The digest is NOT calculated by RxDB, instead it is calculated by the RxStorage. The only guarantee is that the digest will change when the attachments data changes. -::: - -### rev - -The revision-number of the attachment as `number`. - -### remove() - -Removes the attachment. Returns a Promise that resolves when done. - -```javascript -const attachment = myDocument.getAttachment('cat.jpg'); -await attachment.remove(); -``` - -## getData() - -Returns a Promise which resolves the attachment's data as `Blob`. (async) - -```javascript -const attachment = myDocument.getAttachment('cat.jpg'); -const blob = await attachment.getData(); // Blob -``` - -## getDataBase64() - -Returns a Promise which resolves the attachment's data as **base64** `string`. - -```javascript -const attachment = myDocument.getAttachment('cat.jpg'); -const base64Database = await attachment.getDataBase64(); // 'bWVvdw==' -``` - -## getStringData() - -Returns a Promise which resolves the attachment's data as `string`. - -```javascript -const attachment = await myDocument.getAttachment('cat.jpg'); -const data = await attachment.getStringData(); // 'meow' -``` - -# Attachment compression - -Storing many attachments can be a problem when the disc space of the device is exceeded. -Therefore it can make sense to compress the attachments before storing them in the [RxStorage](./rx-storage.md). -With the `attachments-compression` plugin you can compress the attachments data on write and decompress it on reads. -This happens internally and will now change on how you use the api. The compression is run with the [Compression Streams API](https://developer.mozilla.org/en-US/docs/Web/API/Compression_Streams_API) which is only supported on [newer browsers](https://caniuse.com/?search=compressionstream). - -```ts -import { - wrappedAttachmentsCompressionStorage -} from 'rxdb/plugins/attachments-compression'; - -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; - -// create a wrapped storage with attachment-compression. -const storageWithAttachmentsCompression = wrappedAttachmentsCompressionStorage({ - storage: getRxStorageIndexedDB() -}); - -const db = await createRxDatabase({ - name: 'mydatabase', - storage: storageWithAttachmentsCompression -}); - -// set the compression mode at the schema level -const mySchema = { - version: 0, - type: 'object', - properties: { - // . - // . - // . - }, - attachments: { - compression: 'deflate' // <- Specify the compression mode here. OneOf ['deflate', 'gzip'] - } -}; - -/* ... create your collections as usual and store attachments in them. */ - -``` - ---- - -## Master Data - Create and Manage RxCollections - -# RxCollection -A collection stores documents of the same type. - -## Creating a Collection -To create one or more collections you need a RxDatabase object which has the `.addCollections()`-method. Every collection needs a collection name and a valid `RxJsonSchema`. Other attributes are optional. - -```js -const myCollections = await myDatabase.addCollections({ - // key = collectionName - humans: { - schema: mySchema, - statics: {}, // (optional) ORM-functions for this collection - methods: {}, // (optional) ORM-functions for documents - attachments: {}, // (optional) ORM-functions for attachments - options: {}, // (optional) Custom parameters that might be used in plugins - migrationStrategies: {}, // (optional) - autoMigrate: true, // (optional) [default=true] - cacheReplacementPolicy: function(){}, // (optional) custom cache replacement policy - conflictHandler: function(){} // (optional) a custom conflict handler can be used - }, - // you can create multiple collections at once - animals: { - // ... - } -}); -``` - -### name - -The name uniquely identifies the collection and should be used to refine the collection in the database. Two different collections in the same database can never have the same name. Collection names must match the following regex: `^[a-z][a-z0-9]*$`. - -### schema - -The schema defines how the documents of the collection are structured. RxDB uses a schema format, similar to [JSON schema](https://json-schema.org/). Read more about the RxDB schema format [here](./rx-schema.md). - -### ORM-functions -With the parameters `statics`, `methods` and `attachments`, you can define ORM-functions that are applied to each of these objects that belong to this collection. See [ORM/DRM](./orm.md). - -### Migration -With the parameters `migrationStrategies` and `autoMigrate` you can specify how migration between different schema-versions should be done. [See Migration](./migration-schema.md). - -## Get a collection from the database -To get an existing collection from the database, call the collection name directly on the database: - -```javascript -// newly created collection -const collections = await db.addCollections({ - heroes: { - schema: mySchema - } -}); -const collection2 = db.heroes; -console.log(collections.heroes === collection2); //> true -``` - -## Functions - -### Observe $ -Calling this will return an [rxjs-Observable](https://rxjs.dev/guide/observable) which streams every change to data of this collection. - -```js -myCollection.$.subscribe(changeEvent => console.dir(changeEvent)); - -// you can also observe single event-types with insert$ update$ remove$ -myCollection.insert$.subscribe(changeEvent => console.dir(changeEvent)); -myCollection.update$.subscribe(changeEvent => console.dir(changeEvent)); -myCollection.remove$.subscribe(changeEvent => console.dir(changeEvent)); - -``` - -### insert() -Use this to insert new documents into the database. The collection will validate the schema and automatically encrypt any encrypted fields. Returns the new RxDocument. - -```js -const doc = await myCollection.insert({ - name: 'foo', - lastname: 'bar' -}); -``` - -### insertIfNotExists() - -The insertIfNotExists() method attempts to insert a new document into the collection only if a document with the same primary key does not already exist. This is useful for ensuring uniqueness without having to manually check for existing records before inserting or handling [conflicts](./transactions-conflicts-revisions.md). - -Returns either the newly added [RxDocument](./rx-document.md) or the previous existing document. - -```js -const doc = await myCollection.insertIfNotExists({ - name: 'foo', - lastname: 'bar' -}); -``` - -### bulkInsert() - -When you have to insert many documents at once, use bulk insert. This is much faster than calling `.insert()` multiple times. -Returns an object with a `success`- and `error`-array. - -```js -const result = await myCollection.bulkInsert([{ - name: 'foo1', - lastname: 'bar1' -}, -{ - name: 'foo2', - lastname: 'bar2' -}]); - -// > { -// success: [RxDocument, RxDocument], -// error: [] -// } -``` - -:::note -`bulkInsert` will not fail on update conflicts and you cannot expect that on failure the other documents are not inserted. Also the call to `bulkInsert()` it will not throw if a single document errors because of validation errors. Instead it will return the error in the `.error` property of the returned object. -::: - -### bulkRemove() - -When you want to remove many documents at once, use bulk remove. Returns an object with a `success`- and `error`-array. - -```js -const result = await myCollection.bulkRemove([ - 'primary1', - 'primary2' -]); - -// > { -// success: [RxDocument, RxDocument], -// error: [] -// } -``` - -Instead of providing the document ids, you can also use the [RxDocument](./rx-document.md) instances. This can have better performance if your code knows them already at the moment of removing them: -```js -const result = await myCollection.bulkRemove([ - myRxDocument1, - myRxDocument2, - /* ... */ -]); -``` - -### upsert() -Inserts the document if it does not exist within the collection, otherwise it will overwrite it. Returns the new or overwritten RxDocument. -```js -const doc = await myCollection.upsert({ - name: 'foo', - lastname: 'bar2' -}); -``` - -### bulkUpsert() -Same as `upsert()` but runs over multiple documents. Improves performance compared to running many `upsert()` calls. -Returns an `error` and a `success` array. - -```js -const docs = await myCollection.bulkUpsert([ - { - name: 'foo', - lastname: 'bar2' - }, - { - name: 'bar', - lastname: 'foo2' - } -]); -/** - * { - * success: [RxDocument, RxDocument] - * error: [], - * } - */ -``` - -### incrementalUpsert() - -When you run many upsert operations on the same RxDocument in a very short timespan, you might get a `409 Conflict` error. -This means that you tried to run a `.upsert()` on the document, while the previous upsert operation was still running. -To prevent these types of errors, you can run incremental upsert operations. -The behavior is similar to [RxDocument.incrementalModify](./rx-document.md#incrementalModify). - -```js -const docData = { - name: 'Bob', // primary - lastName: 'Kelso' -}; - -myCollection.upsert(docData); -myCollection.upsert(docData); -// -> throws because of parallel update to the same document - -myCollection.incrementalUpsert(docData); -myCollection.incrementalUpsert(docData); -myCollection.incrementalUpsert(docData); - -// wait until last upsert finished -await myCollection.incrementalUpsert(docData); -// -> works -``` - -### find() -To find documents in your collection, use this method. [See RxQuery.find()](./rx-query.md#find). - -```js -// find all that are older than 18 -const olderDocuments = await myCollection - .find() - .where('age') - .gt(18) - .exec(); // execute -``` - -### findOne() -This does basically what find() does, but it returns only a single document. You can pass a primary value to find a single document more easily. - -To find documents in your collection, use this method. [See RxQuery.find()](./rx-query.md#findOne). - -```js -// get document with name:foobar -myCollection.findOne({ - selector: { - name: 'foo' - } -}).exec().then(doc => console.dir(doc)); - -// get document by primary, functionally identical to above query -myCollection.findOne('foo') - .exec().then(doc => console.dir(doc)); -``` - -### findByIds() - -Find many documents by their id (primary value). This has a way better performance than running multiple `findOne()` or a `find()` with a big `$or` selector. - -Returns a `Map` where the primary key of the document is mapped to the document. Documents that do not exist or are deleted, will not be inside of the returned Map. - -```js -const ids = [ - 'alice', - 'bob', - /* ... */ -]; -const docsMap = await myCollection.findByIds(ids); - -console.dir(docsMap); // Map(2) -``` - -:::note -The `Map` returned by `findByIds` is not guaranteed to return elements in the same order as the list of ids passed to it. -::: - -### exportJSON() -Use this function to create a json export from every document in the collection. - -Before `exportJSON()` and `importJSON()` can be used, you have to add the `json-dump` plugin. - -```javascript -import { addRxPlugin } from 'rxdb'; -import { RxDBJsonDumpPlugin } from 'rxdb/plugins/json-dump'; -addRxPlugin(RxDBJsonDumpPlugin); -``` - -```js -myCollection.exportJSON() - .then(json => console.dir(json)); -``` - -### importJSON() -To import the json dump into your collection, use this function. -```js -// import the dump to the database -myCollection.importJSON(json) - .then(() => console.log('done')); -``` -Note that importing will fire events for each inserted document. - -### remove() - -Removes all known data of the collection and its previous versions. -This removes the documents, the schemas, and older schemaVersions. - -```js -await myCollection.remove(); -// collection is now removed and can be re-created -``` - -### close() -Removes the collection's object instance from the [RxDatabase](./rx-database.md). This is to free up memory and stop all observers and replications. It will not delete the collections data. When you create the collection again with `database.addCollections()`, the newly added collection will still have all data. -```js -await myCollection.close(); -``` - -### onClose / onRemove() -With these you can add a function that is run when the collection was closed or removed. -This works even across multiple browser tabs so you can detect when another tab removes the collection -and you application can behave accordingly. - -```js -await myCollection.onClose(() => console.log('I am closed')); -await myCollection.onRemove(() => console.log('I am removed')); -``` - -### isRxCollection -Returns true if the given object is an instance of RxCollection. Returns false if not. -```js -const is = isRxCollection(myObj); -``` - -## FAQ - -
    - When I reload the browser window, will my collections still be in the database? - - No, the javascript instance of the collections will not automatically load into the database on page reloads. - You have to call the `addCollections()` method each time you create your database. This will create the JavaScript object instance of the RxCollection so that you can use it in the RxDatabase. The persisted data will be automatically in your RxCollection each time you create it. - -
    -
    - How to remove the limit of 16 collections? - - In the open-source version of RxDB, the amount of RxCollections that can exist in parallel is limited to `16`. - To remove this limit, you can purchase the [Premium Plugins](/premium/) and call the `setPremiumFlag()` function before creating a database: - ```ts - import { setPremiumFlag } from 'rxdb-premium/plugins/shared'; - setPremiumFlag(); - ``` - -
    - ---- - -## RxDatabase - The Core of Your Realtime Data - -# RxDatabase - -A RxDatabase-Object contains your collections and handles the synchronization of change-events. - -## Creation - -The database is created by the asynchronous `.createRxDatabase()` function of the core RxDB module. It has the following parameters: - -```javascript -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -const db = await createRxDatabase({ - name: 'heroesdb', // <- name - storage: getRxStorageLocalstorage(), // <- RxStorage - - /* Optional parameters: */ - password: 'myPassword', // <- password (optional) - multiInstance: true, // <- multiInstance (optional, default: true) - eventReduce: true, // <- eventReduce (optional, default: false) - cleanupPolicy: {} // <- custom cleanup policy (optional) -}); -``` - -### name - -The database-name is a string which uniquely identifies the database. When two RxDatabases have the same name and use the same `RxStorage`, their data can be assumed as equal and they will share events between each other. -Depending on the storage or adapter this can also be used to define the filesystem folder of your data. - -### storage - -RxDB works on top of an implementation of the [RxStorage](./rx-storage.md) interface. This interface is an abstraction that allows you to use different underlying databases that actually handle the documents. Depending on your use case you might use a different `storage` with different tradeoffs in performance, bundle size or supported runtimes. - -There are many `RxStorage` implementations that can be used depending on the JavaScript environment and performance requirements. -For example you can use the [LocalStorage RxStorage](./rx-storage-localstorage.md) in the browser or use the [MongoDB RxStorage](./rx-storage-mongodb.md) in Node.js. - -- [List of RxStorage implementations](./rx-storage.md) - -```javascript - -// use the LocalStroage that stores data in the browser. -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -const db = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageLocalstorage() -}); - -// ...or use the MongoDB RxStorage in Node.js. -import { getRxStorageMongoDB } from 'rxdb/plugins/storage-mongodb'; - -const dbMongo = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageMongoDB({ - connection: 'mongodb://localhost:27017,localhost:27018,localhost:27019' - }) -}); -``` - -### password -`(optional)` -If you want to use encrypted fields in the collections of a database, you have to set a password for it. The password must be a string with at least 12 characters. - -[Read more about encryption here](./encryption.md). - -### multiInstance -`(optional=true)` -When you create more than one instance of the same database in a single javascript-runtime, you should set `multiInstance` to ```true```. This will enable the event sharing between the two instances. For example when the user has opened multiple browser windows, events will be shared between them so that both windows react to the same changes. -`multiInstance` should be set to `false` when you have single-instances like a single Node.js-process, a react-native-app, a cordova-app or a single-window [electron](./electron-database.md) app which can decrease the startup time because no instance coordination has to be done. - -### eventReduce -`(optional=false)` - -One big benefit of having a realtime database is that big performance optimizations can be done when the database knows a query is observed and the updated results are needed continuously. RxDB uses the [EventReduce Algorithm](https://github.com/pubkey/event-reduce) to optimize observer or recurring queries. - -For better performance, you should always set `eventReduce: true`. This will also be the default in the next major RxDB version. - -### ignoreDuplicate -`(optional=false)` -If you create multiple RxDatabase-instances with the same name and same adapter, it's very likely that you have done something wrong. -To prevent this common mistake, RxDB will throw an error when you do this. -In some rare cases like unit-tests, you want to do this intentional by setting `ignoreDuplicate` to `true`. Because setting `ignoreDuplicate: true` in production will decrease the performance by having multiple instances of the same database, `ignoreDuplicate` is only allowed to be set in [dev-mode](./dev-mode.md). - -```js -const db1 = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage(), - ignoreDuplicate: true -}); -const db2 = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage(), - ignoreDuplicate: true // this create-call will not throw because you explicitly allow it -}); -``` - -### closeDuplicates -`(optional=false)` - -Closes all other RxDatabases instances that have the same storage+name combination. - -```js -const db1 = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage(), - closeDuplicates: true -}); -const db2 = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage(), - closeDuplicates: true // this create-call will close db1 -}); - -// db1 is now closed. -``` - -### hashFunction - -By default, RxDB will use `crypto.subtle.digest('SHA-256', data)` for hashing. If you need a different hash function or the `crypto.subtle` API is not supported in your JavaScript runtime, you can provide an own hash function instead. A hash function gets a string as input and returns a `Promise` that resolves a string. - -```ts -// example hash function that runs in plain JavaScript -import { sha256 } from 'ohash'; -function myOwnHashFunction(input: string) { - return Promise.resolve(sha256(input)); -} -const db = await createRxDatabase({ - hashFunction: myOwnHashFunction - /* ... */ -}); -``` - -If you get the error message `TypeError: Cannot read properties of undefined (reading 'digest')` this likely means that you are neither running on `localhost` nor on `https` which is why your browser might not allow access to `crypto.subtle.digest`. - -## Methods - -### Observe with $ -Calling this will return an [rxjs-Observable](http://reactivex.io/documentation/observable.html) which streams all write events of the `RxDatabase`. - -```javascript -myDb.$.subscribe(changeEvent => console.dir(changeEvent)); -``` - -### exportJSON() -Use this function to create a json-export from every piece of data in every collection of this database. You can pass `true` as a parameter to decrypt the encrypted data-fields of your document. - -Before `exportJSON()` and `importJSON()` can be used, you have to add the `json-dump` plugin. - -```javascript -import { addRxPlugin } from 'rxdb'; -import { RxDBJsonDumpPlugin } from 'rxdb/plugins/json-dump'; -addRxPlugin(RxDBJsonDumpPlugin); -``` - -```javascript -myDatabase.exportJSON() - .then(json => console.dir(json)); -``` - -### importJSON() -To import the json-dumps into your database, use this function. - -```javascript -// import the dump to the database -emptyDatabase.importJSON(json) - .then(() => console.log('done')); -``` - -### backup() - -Writes the current (or ongoing) database state to the filesystem. [Read more](./backup.md) - -### waitForLeadership() -Returns a Promise which resolves when the RxDatabase becomes [elected leader](./leader-election.md). - -### requestIdlePromise() -Returns a promise which resolves when the database is in idle. This works similar to [requestIdleCallback](https://developer.mozilla.org/de/docs/Web/API/Window/requestIdleCallback) but tracks the idle-ness of the database instead of the CPU. -Use this for semi-important tasks like cleanups which should not affect the speed of important tasks. - -```javascript - -myDatabase.requestIdlePromise().then(() => { - // this will run at the moment the database has nothing else to do - myCollection.customCleanupFunction(); -}); - -// with timeout -myDatabase.requestIdlePromise(1000 /* time in ms */).then(() => { - // this will run at the moment the database has nothing else to do - // or the timeout has passed - myCollection.customCleanupFunction(); -}); - -``` - -### close() -Closes the databases object-instance. This is to free up memory and stop all observers and replications. -Returns a `Promise` that resolves when the database is closed. -Closing a database will not remove the databases data. When you create the database again with `createRxDatabase()`, all data will still be there. -```javascript -await myDatabase.close(); -``` - -### remove() -Wipes all documents from the storage. Use this to free up disc space. - -```javascript -await myDatabase.remove(); -// database instance is now gone -``` - -You can also clear a database without removing its instance by using `removeRxDatabase()`. This is useful if you want to migrate data or reset the users state by renaming the database. Then you can remove the previous data with `removeRxDatabase()` without creating a RxDatabase first. Notice that this will only remove the -stored data on the storage. It will not clear the cache of any [RxDatabase](./rx-database.md) instances. -```javascript -import { removeRxDatabase } from 'rxdb'; -removeRxDatabase('mydatabasename', 'localstorage'); -``` - -### isRxDatabase -Returns true if the given object is an instance of RxDatabase. Returns false if not. -```javascript -import { isRxDatabase } from 'rxdb'; -const is = isRxDatabase(myObj); -``` - -### collections$ - -Emits events whenever a [RxCollection](./rx-collection.md) is added or removed to the instance of the RxDatabase. Notice that this only emits the JavaScript instance of the RxCollection class, it does not emit events across browser tabs. - -```javascript -const sub = myDatabase.collections$.subscribe(event => { - console.dir(event); -}); - -await myDatabase.addCollections({ - heroes: { - schema: mySchema - } -}); - -// -> emits the event - -sub.unsubscribe(); -``` - ---- - -## RxDocument - -A RxDocument is a object which represents the data of a single JSON document is stored in a collection. It can be compared to a single record in a relational database table. You get an `RxDocument` either as return on inserts/updates, or as result-set of [queries](./rx-query.md). - -RxDB works on RxDocuments instead of plain JSON data to have more convenient operations on the documents. Also Documents that are fetched multiple times by different queries or operations are automatically de-duplicated by RxDB in memory. - -## insert -To insert a document into a collection, you have to call the collection's .insert()-function. -```js -await myCollection.insert({ - name: 'foo', - lastname: 'bar' -}); -``` - -## find -To find documents in a collection, you have to call the collection's .find()-function. [See RxQuery](./rx-query.md). -```js -const docs = await myCollection.find().exec(); // <- find all documents -``` - -## Functions - -### get() -This will get a single field of the document. If the field is encrypted, it will be automatically decrypted before returning. - -```js -const name = myDocument.get('name'); // returns the name -// OR -const name = myDocument.name; -``` - -### get$() -This function returns an observable of the given paths-value. -The current value of this path will be emitted each time the document changes. -```js -// get the live-updating value of 'name' -var isName; -myDocument.get$('name') - .subscribe(newName => { - isName = newName; - }); - -await myDocument.incrementalPatch({name: 'foobar2'}); -console.dir(isName); // isName is now 'foobar2' - -// OR - -myDocument.name$ - .subscribe(newName => { - isName = newName; - }); - -``` - -### proxy-get -All properties of a `RxDocument` are assigned as getters so you can also directly access values instead of using the get()-function. - -```js - // Identical to myDocument.get('name'); - var name = myDocument.name; - // Can also get nested values. - var nestedValue = myDocument.whatever.nestedfield; - - // Also usable with observables: - myDocument.firstName$.subscribe(newName => console.log('name is: ' + newName)); - // > 'name is: Stefe' - await myDocument.incrementalPatch({firstName: 'Steve'}); - // > 'name is: Steve' -``` - -### update() -Updates the document based on the [mongo-update-syntax](https://docs.mongodb.com/manual/reference/operator/update-field/), based on the [mingo library](https://github.com/kofrasa/mingo#updating-documents). - -```js - -/** - * If not done before, you have to add the update plugin. - */ -import { addRxPlugin } from 'rxdb'; -import { RxDBUpdatePlugin } from 'rxdb/plugins/update'; -addRxPlugin(RxDBUpdatePlugin); - -await myDocument.update({ - $inc: { - age: 1 // increases age by 1 - }, - $set: { - firstName: 'foobar' // sets firstName to foobar - } -}); -``` - -### modify() -Updates a documents data based on a function that mutates the current data and returns the new value. - -```js - -const changeFunction = (oldData) => { - oldData.age = oldData.age + 1; - oldData.name = 'foooobarNew'; - return oldData; -} -await myDocument.modify(changeFunction); -console.log(myDocument.name); // 'foooobarNew' -``` - -### patch() - -Overwrites the given attributes over the documents data. - -```js -await myDocument.patch({ - name: 'Steve', - age: undefined // setting an attribute to undefined will remove it -}); -console.log(myDocument.name); // 'Steve' -``` - -### Prevent conflicts with the incremental methods - -Making a normal change to the non-latest version of a `RxDocument` will lead to a `409 CONFLICT` error because RxDB -uses [revision checks](./transactions-conflicts-revisions.md) instead of transactions. - -To make a change to a document, no matter what the current state is, you can use the `incremental` methods: - -```js -// update -await myDocument.incrementalUpdate({ - $inc: { - age: 1 // increases age by 1 - } -}); - -// modify -await myDocument.incrementalModify(docData => { - docData.age = docData.age + 1; - return docData; -}); - -// patch -await myDocument.incrementalPatch({ - age: 100 -}); - -// remove -await myDocument.incrementalRemove({ - age: 100 -}); -``` - -### getLatest() - -Returns the latest known state of the `RxDocument`. - -```js -const myDocument = await myCollection.findOne('foobar').exec(); -const docAfterEdit = await myDocument.incrementalPatch({ - age: 10 -}); -const latestDoc = myDocument.getLatest(); -console.log(docAfterEdit === latestDoc); // > true -``` - -### Observe $ -Calling this will return an [RxJS-Observable](https://rxjs.dev/guide/observable) which the current newest state of the RxDocument. - -```js -// get all changeEvents -myDocument.$ - .subscribe(currentRxDocument => console.dir(currentRxDocument)); -``` - -### remove() -This removes the document from the collection. Notice that this will not purge the document from the store but set `_deleted:true` so that it will be no longer returned on queries. -To fully purge a document, use the [cleanup plugin](./cleanup.md). -```js -myDocument.remove(); -``` - -### Remove and update in a single atomic operation - -Sometimes you want to change a documents value and also remove it in the same operation. For example this can be useful when you use [replication](./replication.md) and want to set a `deletedAt` timestamp. Then you might have to ensure that setting this timestamp and deleting the document happens in the same atomic operation. - -To do this the modifying operations of a document accept setting the `_deleted` field. For example: - -```ts - -// update() and remove() -await doc.update({ - $set: { - deletedAt: new Date().getTime(), - _deleted: true - } -}); - -// modify() and remove() -await doc.modify(data => { - data.age = 1; - data._deleted = true; - return data; -}); -``` - -### deleted$ -Emits a boolean value, depending on whether the RxDocument is deleted or not. - -```js -let lastState = null; -myDocument.deleted$.subscribe(state => lastState = state); - -console.log(lastState); -// false - -await myDocument.remove(); - -console.log(lastState); -// true -``` - -### get deleted -A getter to get the current value of `deleted$`. - -```js -console.log(myDocument.deleted); -// false - -await myDocument.remove(); - -console.log(myDocument.deleted); -// true -``` - -### toJSON() - -Returns the document's data as plain json object. This will return an **immutable** object. To get something that can be modified, use `toMutableJSON()` instead. - -```js -const json = myDocument.toJSON(); -console.dir(json); -/* { passportId: 'h1rg9ugdd30o', - firstName: 'Carolina', - lastName: 'Gibson', - age: 33 ... -*/ -``` - -You can also set `withMetaFields: true` to get additional meta fields like the revision, attachments or the deleted flag. - -```js -const json = myDocument.toJSON(true); -console.dir(json); -/* { passportId: 'h1rg9ugdd30o', - firstName: 'Carolina', - lastName: 'Gibson', - _deleted: false, - _attachments: { ... }, - _rev: '1-aklsdjfhaklsdjhf...' -*/ -``` - -### toMutableJSON() - -Same as `toJSON()` but returns a deep cloned object that can be mutated afterwards. -Remember that deep cloning is performance expensive and should only be done when necessary. - -```js -const json = myDocument.toMutableJSON(); -json.firstName = 'Alice'; // The returned document can be mutated -``` - -:::note All methods of RxDocument are bound to the instance -When you get a method from a `RxDocument`, the method is automatically bound to the documents instance. This means you do not have to use things like `myMethod.bind(myDocument)` like you would do in jsx. -::: - -### isRxDocument -Returns true if the given object is an instance of RxDocument. Returns false if not. -```js -const is = isRxDocument(myObj); -``` - ---- - -## Master Local Documents in RxDB - -# Local Documents - -Local documents are a special class of documents which are used to store local metadata. -They come in handy when you want to store settings or additional data next to your documents. - -- Local Documents can exist on a [RxDatabase](./rx-database.md) or [RxCollection](./rx-collection.md). -- Local Document do not have to match the collections schema. -- Local Documents do not get replicated. -- Local Documents will not be found on queries. -- Local Documents can not have attachments. -- Local Documents will not get handled by the [migration-schema](./migration-schema.md). -- The id of a local document has the `maxLength` of `128` characters. - -:::note -While local documents can be very useful, in many cases the [RxState](./rx-state.md) API is more convenient. -::: - -## Add the local documents plugin - -To enable the local documents, you have to add the `local-documents` plugin. - -```ts -import { addRxPlugin } from 'rxdb'; -import { RxDBLocalDocumentsPlugin } from 'rxdb/plugins/local-documents'; -addRxPlugin(RxDBLocalDocumentsPlugin); -``` - -## Activate the plugin for a RxDatabase or RxCollection - -For better performance, the local document plugin does not create a storage for every database or collection that is created. -Instead you have to set `localDocuments: true` when you want to store local documents in the instance. - -```js -// activate local documents on a RxDatabase -const myDatabase = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageLocalstorage(), - localDocuments: true // <- activate this to store local documents in the database -}); - -myDatabase.addCollections({ - messages: { - schema: messageSchema, - localDocuments: true // <- activate this to store local documents in the collection - } -}); -``` - -:::note -If you want to store local documents in a `RxCollection` but **NOT** in the `RxDatabase`, you **MUST NOT** set `localDocuments: true` in the `RxDatabase` because it will only slow down the initial database creation. -::: - -## insertLocal() - -Creates a local document for the database or collection. Throws if a local document with the same id already exists. Returns a Promise which resolves the new `RxLocalDocument`. - -```javascript -const localDoc = await myCollection.insertLocal( - 'foobar', // id - { // data - foo: 'bar' - } -); - -// you can also use local-documents on a database -const localDoc = await myDatabase.insertLocal( - 'foobar', // id - { // data - foo: 'bar' - } -); -``` - -## upsertLocal() - -Creates a local document for the database or collection if not exists. Overwrites the if exists. Returns a Promise which resolves the `RxLocalDocument`. - -```javascript -const localDoc = await myCollection.upsertLocal( - 'foobar', // id - { // data - foo: 'bar' - } -); -``` - -## getLocal() - -Find a `RxLocalDocument` by its id. Returns a Promise which resolves the `RxLocalDocument` or `null` if not exists. - -```javascript -const localDoc = await myCollection.getLocal('foobar'); -``` - -## getLocal$() - -Like `getLocal()` but returns an `Observable` that emits the document or `null` if not exists. - -```javascript -const subscription = myCollection.getLocal$('foobar').subscribe(documentOrNull => { - console.dir(documentOrNull); // > RxLocalDocument or null -}); -``` - -## RxLocalDocument - -A `RxLocalDocument` behaves like a normal `RxDocument`. - -```javascript -const localDoc = await myCollection.getLocal('foobar'); - -// access data -const foo = localDoc.get('foo'); - -// change data -localDoc.set('foo', 'bar2'); -await localDoc.save(); - -// observe data -localDoc.get$('foo').subscribe(value => { /* .. */ }); - -// remove it -await localDoc.remove(); -``` - -:::note -Because the local document does not have a schema, accessing the documents data-fields via pseudo-proxy will not work. -::: - -```javascript -const foo = localDoc.foo; // undefined -const foo = localDoc.get('foo'); // works! - -localDoc.foo = 'bar'; // does not work! -localDoc.set('foo', 'bar'); // works -``` - -For the usage with typescript, you can have access to the typed data of the document over `toJSON()` - -```ts -declare type MyLocalDocumentType = { - foo: string -} -const localDoc = await myCollection.upsertLocal( - 'foobar', // id - { // data - foo: 'bar' - } -); - -// typescript will know that foo is a string -const foo: string = localDoc.toJSON().foo; -``` - ---- - -## RxPipeline - Automate Data Flows in RxDB - -# RxPipeline - -The RxPipeline plugin enables you to run operations depending on writes to a collection. -Whenever a write happens on the source collection of a pipeline, a handler is called to process the writes and run operations on another collection. - -You could have a similar behavior by observing the collection stream and process data on emits: - -```ts -mySourceCollection.$.subscribe(event => {/* ...process...*/}); -``` - -While this could work in some cases, it causes many problems that are fixed by using the pipeline plugin instead: -- In an RxPipeline, only the [Leading Instance](./leader-election.md) runs the operations. For example when you have multiple browser tabs open, only one will run the processing and when that tab is closed, another tab will become elected leader and continue the pipeline processing. -- On sudden stops and restarts of the JavaScript process, the processing will continue at the correct checkpoint and not miss out any documents even on unexpected crashes. -- Reads/Writes on the destination collection are halted while the pipeline is processing. This ensures your queries only return fully processed documents and no partial results. So when you run a query to the destination collection directly after a write to the source collection, you can be sure your query results are up to date and the pipeline has already been run at the moment the query resolved: - -```ts -await mySourceCollection.insert({/* ... */}); - -/** - * Because our pipeline blocks reads to the destination, - * we know that the result array contains data created - * on top of the previously inserted documents. - */ -const result = myDestinationCollection.find().exec(); -``` - -## Creating a RxPipeline - -Pipelines are created on top of a source [RxCollection](./rx-collection.md) and have another `RxCollection` as destination. An identifier is used to identify the state of the pipeline so that different pipelines have a different processing checkpoint state. A plain JavaScript function `handler` is used to process the data of the source collection writes. - -```ts -const pipeline = await mySourceCollection.addPipeline({ - identifier: 'my-pipeline', - destination: myDestinationCollection, - handler: async (docs) => { - /** - * Here you can process the documents and write to - * the destination collection. - */ - for (const doc of docs) { - await myDestinationCollection.insert({ - id: doc.primary, - category: doc.category - }); - } - } -}); -``` - -## Use Cases for RxPipeline - -The RxPipeline is a handy building block for different features and plugins. You can use it to aggregate data or restructure local data. - -### UseCase: Re-Index data that comes from replication - -Sometimes you want to [replicate](./replication.md) atomic documents over the wire but locally you want to split these documents for better indexing. For example you replicate email documents that have multiple receivers in a string-array. While string-arrays cannot be indexed, locally you need a way to query for all emails of a given receiver. -To handle this case you can set up a RxPipeline that writes the mapping into a separate collection: - -```ts -const pipeline = await emailCollection.addPipeline({ - identifier: 'map-email-receivers', - destination: emailByReceiverCollection, - handler: async (docs) => { - for (const doc of docs) { - // remove previous mapping - await emailByReceiverCollection.find({emailId: doc.primary}).remove(); - // add new mapping - if(!doc.deleted) { - await emailByReceiverCollection.bulkInsert( - doc.receivers.map(receiver => ({ - emailId: doc.primary, - receiver: receiver - })) - ); - } - } - } -}); -``` - -With this you can efficiently query for "all emails that a person received" by running: - -```ts -const mailIds = await emailByReceiverCollection.find({ - receiver: 'foobar@example.com' -}).exec(); -``` - -### UseCase: Fulltext Search - -You can utilize the pipeline plugin to index text data for efficient fulltext search. - -```ts -const pipeline = await emailCollection.addPipeline({ - identifier: 'email-fulltext-search', - destination: mailByWordCollection, - handler: async (docs) => { - for (const doc of docs) { - // remove previous mapping - await mailByWordCollection.find({emailId: doc.primary}).remove(); - // add new mapping - if(!doc.deleted) { - const words = doc.text.split(' '); - await mailByWordCollection.bulkInsert( - words.map(word => ({ - emailId: doc.primary, - word: word - })) - ); - } - } - } -}); -``` - -With this you can efficiently query for "all emails that contain a given word" by running: - -```ts -const mailIds = await emailByReceiverCollection.find({word: 'foobar'}).exec(); -``` - -### UseCase: Download data based on source documents - -When you have to fetch data for each document of a collection from a server, you can use the pipeline to ensure all documents have their data downloaded and no document is missed. - -```ts -const pipeline = await emailCollection.addPipeline({ - identifier: 'download-data', - destination: serverDataCollection, - handler: async (docs) => { - for (const doc of docs) { - const response = await fetch('https://example.com/doc/' + doc.primary); - const serverData = await response.json(); - await serverDataCollection.upsert({ - id: doc.primary, - data: serverData - }); - } - } -}); -``` - -## RxPipeline methods - -### awaitIdle() - -You can await the idleness of a pipeline with `await myRxPipeline.awaitIdle()`. This will await a promise that resolves when the pipeline has processed all documents and is not running anymore. - -### close() - -`await myRxPipeline.close()` stops the pipeline so that it is no longer doing stuff. This is automatically called when the RxCollection or RxDatabase of the pipeline is closed. - -### remove() - -`await myRxPipeline.remove()` removes the pipeline and all metadata which it has stored. Recreating the pipeline afterwards will start processing all source documents from scratch. - -## Using RxPipeline correctly - -### Pipeline handlers must be idempotent - -Because a JavaScript process can exit at any time, like when the user closes a browser tab, the pipeline handler function must be idempotent. This means when it only runs partially and is started again with the same input, it should still end up in the correct result. - -### Pipeline handlers must not throw - -Pipeline handlers must never throw. If you run operations inside of the handler that might cause errors, you must wrap the handler's code with a `try-catch` by yourself and also handle retries. If your handler throws, your pipeline will be stuck and no longer be usable, which should never happen. - -### Be careful when doing http requests in the handler - -When you run http requests inside of your handler, you no longer have an [offline first](./offline-first.md) application because reads to the destination collection will be blocked until all handlers have finished. When your client is offline, therefore the collection will be blocked for reads and writes. - -### Pipelines temporarily block external reads and writes - -While a pipeline is running, **all reads and writes to its destination collection are blocked**. This guarantees that queries never observe partially processed data, but it also means that pipelines can block each other if they interact incorrectly. - -Problems occur when multiple pipelines: - -- read or write across the same collections, or -- wait for each other using `awaitIdle()` from inside a pipeline handler. - -```ts -// Example of a deadlock - -// Pipeline A: files → files (reads folders) -const pipelineA = await db.files.addPipeline({ - identifier: 'file-path-sync', - destination: db.files, - handler: async (docs) => { - const folders = await folders.find().exec(); // can block - /* ... */ - } -}); - -// Pipeline B: files → folders (waits for A) -await db.folders.addPipeline({ - identifier: 'file-count', - destination: db.folders, - handler: async () => { - await pipelineA.awaitIdle(); // ❌ may deadlock - /* ... */ - } -}); -``` - -To prevent deadlocks, consider: - -- Never call `awaitIdle()` inside a pipeline handler. -- Avoid circular dependencies between pipelines. -- Prefer one-directional data flow. - ---- - -## RxQuery - - -To find documents inside of an [RxCollection](./rx-collection.md), RxDB uses the RxQuery interface that handles all query operations: it serves as the main interface for fetching documents, relies on a MongoDB-like [Mango Query Syntax](https://github.com/cloudant/mango), and provides three types of queries: [find()](#find), [findOne()](#findone) and [count()](#count). By caching and de-duplicating results, RxQuery ensures efficient in-memory handling, and when queries are observed or re-run, the [EventReduce algorithm](https://github.com/pubkey/event-reduce) speeds up updates for a fast real-time experience and queries that run more than once. - -## find() -To create a basic `RxQuery`, call `.find()` on a collection and insert selectors. The result-set of normal queries is an array with documents. - -```js -// find all that are older then 18 -const query = myCollection - .find({ - selector: { - age: { - $gt: 18 - } - } - }); -``` - -## findOne() -A findOne-query has only a single `RxDocument` or `null` as result-set. - -```js -// find alice -const query = myCollection - .findOne({ - selector: { - name: 'alice' - } - }); -``` - -```js -// find the youngest one -const query = myCollection - .findOne({ - selector: {}, - sort: [ - {age: 'asc'} - ] - }); -``` - -```js -// find one document by the primary key -const query = myCollection.findOne('foobar'); -``` -## exec() -Returns a `Promise` that resolves with the result-set of the query. - -```js -const query = myCollection.find(); -const results = await query.exec(); -console.dir(results); // > [RxDocument,RxDocument,RxDocument..] -``` - -On `.findOne()` queries, you can call `.exec(true)` to ensure your document exists and to make TypeScript handling easier: - -```ts -// docOrUndefined can be the type RxDocument or null which then has to be handled to be typesafe. -const docOrUndefined = await myCollection.findOne().exec(); - -// with .exec(true), it will throw if the document cannot be found and always have the type RxDocument -const doc = await myCollection.findOne().exec(true); -``` - -## Observe $ -An `BehaviorSubject` [see](https://medium.com/@luukgruijs/understanding-rxjs-behaviorsubject-replaysubject-and-asyncsubject-8cc061f1cfc0) that always has the current result-set as value. -This is extremely helpful when used together with UIs that should always show the same state as what is written in the database. - -```js -const query = myCollection.find(); -const querySub = query.$.subscribe(results => { - console.log('got results: ' + results.length); -}); -// > 'got results: 5' // BehaviorSubjects emit on subscription - -await myCollection.insert({/* ... */}); // insert one -// > 'got results: 6' // $.subscribe() was called again with the new results - -// stop watching this query -querySub.unsubscribe() -``` - -## update() -Runs an [update](./rx-document.md#update) on every RxDocument of the query-result. - -```js - -// to use the update() method, you need to add the update plugin. -import { RxDBUpdatePlugin } from 'rxdb/plugins/update'; -addRxPlugin(RxDBUpdatePlugin); - -const query = myCollection.find({ - selector: { - age: { - $gt: 18 - } - } -}); -await query.update({ - $inc: { - age: 1 // increases age of every found document by 1 - } -}); -``` - -## patch() / incrementalPatch() - -Runs the [RxDocument.patch()](./rx-document.md#patch) function on every RxDocument of the query result. - -```js -const query = myCollection.find({ - selector: { - age: { - $gt: 18 - } - } -}); -await query.patch({ - age: 12 // set the age of every found to 12 -}); -``` - -## modify() / incrementalModify() - -Runs the [RxDocument.modify()](./rx-document.md#modify) function on every RxDocument of the query result. - -```js -const query = myCollection.find({ - selector: { - age: { - $gt: 18 - } - } -}); -await query.modify((docData) => { - docData.age = docData.age + 1; // increases age of every found document by 1 - return docData; -}); -``` - -## remove() / incrementalRemove() - -Deletes all found documents. Returns a promise which resolves to the deleted documents. - -```javascript -// All documents where the age is less than 18 -const query = myCollection.find({ - selector: { - age: { - $lt: 18 - } - } -}); -// Remove the documents from the collection -const removedDocs = await query.remove(); -``` - -## doesDocumentDataMatch() -Returns `true` if the given document data matches the query. - -```js -const documentData = { - id: 'foobar', - age: 19 -}; - -myCollection.find({ - selector: { - age: { - $gt: 18 - } - } -}).doesDocumentDataMatch(documentData); // > true - -myCollection.find({ - selector: { - age: { - $gt: 20 - } - } -}).doesDocumentDataMatch(documentData); // > false -``` - -## Query Builder Plugin - -To use chained query methods, you can also use the `query-builder` plugin. - -```ts -// add the query builder plugin -import { addRxPlugin } from 'rxdb'; -import { RxDBQueryBuilderPlugin } from 'rxdb/plugins/query-builder'; -addRxPlugin(RxDBQueryBuilderPlugin); - -// now you can use chained query methods - -const query = myCollection.find().where('age').gt(18); -const result = await query.exec(); -``` - -## Query Examples -Here some examples to fast learn how to write queries without reading the docs. -- [Pouch-find-docs](https://github.com/pouchdb/pouchdb/blob/master/packages/node_modules/pouchdb-find/README.md) - learn how to use mango-queries -- [mquery-docs](https://github.com/aheckmann/mquery/blob/master/README.md) - learn how to use chained-queries - -```js -// directly pass search-object -myCollection.find({ - selector: { - name: { $eq: 'foo' } - } -}) -.exec().then(documents => console.dir(documents)); - -/* - * find by using sql equivalent '%like%' syntax - * This example will fe: match 'foo' but also 'fifoo' or 'foofa' or 'fifoofa' - * Notice that in RxDB queries, a regex is represented as a $regex string with the $options parameter for flags. - * Using a RegExp instance is not allowed because they are not JSON.stringify()-able and also - * RegExp instances are mutable which could cause undefined behavior when the RegExp is mutated - * after the query was parsed. - */ -myCollection.find({ - selector: { - name: { $regex: '.*foo.*' } - } -}) -.exec().then(documents => console.dir(documents)); - -// find using a composite statement eg: $or -// This example checks where name is either foo or if name is not existent on the document -myCollection.find({ - selector: { $or: [ { name: { $eq: 'foo' } }, { name: { $exists: false } }] } -}) -.exec().then(documents => console.dir(documents)); - -// do a case insensitive search -// This example will match 'foo' or 'FOO' or 'FoO' etc... -myCollection.find({ - selector: { name: { $regex: '^foo$', $options: 'i' } } -}) -.exec().then(documents => console.dir(documents)); - -// chained queries -myCollection.find().where('name').eq('foo') -.exec().then(documents => console.dir(documents)); -``` - -:::note RxDB will always append the primary key to the sort parameters -For several performance optimizations, like the [EventReduce algorithm](https://github.com/pubkey/event-reduce), RxDB expects all queries to return a deterministic sort order that does not depend on the insert order of the documents. To ensure a deterministic ordering, RxDB will always append the primary key as last sort parameter to all queries and to all indexes. -This works in contrast to most other databases where a query without sorting would return the documents in the order in which they had been inserted to the database. -::: - -## Setting a specific index - -By default, the query will be sent to the RxStorage, where a query planner will determine which one of the available indexes must be used. -But the query planner cannot know everything and sometimes will not pick the most optimal index. -To improve query performance, you can specify which index must be used, when running the query. - -```ts -const query = myCollection - .findOne({ - selector: { - age: { - $gt: 18 - }, - gender: { - $eq: 'm' - } - }, - /** - * Because the developer knows that 50% of the documents are 'male', - * but only 20% are below age 18, - * it makes sense to enforce using the ['gender', 'age'] index to improve performance. - * This could not be known by the query planer which might have chosen ['age', 'gender'] instead. - */ - index: ['gender', 'age'] - }); -``` - -## Count - -When you only need the amount of documents that match a query, but you do not need the document data itself, you can use a count query for **better performance**. -The performance difference compared to a normal query differs depending on which [RxStorage](./rx-storage.md) implementation is used. - -```ts -const query = myCollection.count({ - selector: { - age: { - $gt: 18 - } - } - // 'limit' and 'skip' MUST NOT be set for count queries. -}); - -// get the count result once -const matchingAmount = await query.exec(); // > number - -// observe the result -query.$.subscribe(amount => { - console.log('Currently has ' + amount + ' documents'); -}); -``` - -:::note -Count queries have a better performance than normal queries because they do not have to fetch the full document data out of the storage. Therefore it is **not** possible to run a `count()` query with a selector that requires to fetch and compare the document data. So if your query selector **does not** fully match an index of the schema, it is not allowed to run it. These queries would have no performance benefit compared to normal queries but have the tradeoff of not using the fetched document data for caching. -::: - -```ts -/** - * The following will throw an error because - * the count operation cannot run on any specific index range - * because the $regex operator is used. - */ -const query = myCollection.count({ - selector: { - age: { - $regex: 'foobar' - } - } -}); - -/** - * The following will throw an error because - * the count operation cannot run on any specific index range - * because there is no ['age' ,'otherNumber'] index - * defined in the schema. - */ -const query = myCollection.count({ - selector: { - age: { - $gt: 20 - }, - otherNumber: { - $gt: 10 - } - } -}); -``` - -If you want to count these kinds of queries, you should do a normal query instead and use the length of the result set as counter. This has the same performance as running a non-fully-indexed count which has to fetch all document data from the database and run a query matcher. - -```ts -// get count manually once -const resultSet = await myCollection.find({ - selector: { - age: { - $regex: 'foobar' - } - } -}).exec(); -const count = resultSet.length; - -// observe count manually -const count$ = myCollection.find({ - selector: { - age: { - $regex: 'foobar' - } - } -}).$.pipe( - map(result => result.length) -); - -/** - * To allow non-fully-indexed count queries, - * you can also specify that by setting allowSlowCount=true - * when creating the database. - */ -const database = await createRxDatabase({ - name: 'mydatabase', - allowSlowCount: true, // set this to true [default=false] - /* ... */ -}); -``` - -### `allowSlowCount` -To allow non-fully-indexed count queries, you can also specify that by setting `allowSlowCount: true` when creating the database. -Doing this is mostly not wanted, because it would run the counting on the storage without having the document stored in the RxDB document cache. -This is only recommended if the RxStorage is running remotely like in a WebWorker and you not always want to send the document-data between the worker and the main thread. In this case you might only need the count-result instead to save performance. - -## RxQuery's are immutable -Because RxDB is a reactive database, we can do heavy performance-optimisation on query-results which change over time. To be able to do this, RxQuery's have to be immutable. -This means, when you have a `RxQuery` and run a `.where()` on it, the original RxQuery-Object is not changed. Instead the where-function returns a new `RxQuery`-Object with the changed where-field. Keep this in mind if you create RxQuery's and change them afterwards. - -Example: - -```javascript -const queryObject = myCollection.find().where('age').gt(18); -// Creates a new RxQuery object, does not modify previous one -queryObject.sort('name'); -const results = await queryObject.exec(); -console.dir(results); // result-documents are not sorted by name - -const queryObjectSort = queryObject.sort('name'); -const results = await queryObjectSort.exec(); -console.dir(results); // result-documents are now sorted -``` - -### isRxQuery -Returns true if the given object is an instance of RxQuery. Returns false if not. -```js -const is = isRxQuery(myObj); -``` - -## Design Decisions - -Like most other noSQL-Databases, RxDB uses the [mango-query-syntax](https://github.com/cloudant/mango) similar to MongoDB and others. - -- We use the JSON based Mango Query Syntax because: - - Mango Queries work better with TypeScript compared to SQL strings. - - Mango Queries are composable and easy to transform by code without joining SQL strings. - - Queries can be run very fast and efficient with only a minimal query planer to plan the best indexes and operations. - - NoSQL queries can be optimized with the [EventReduce](https://github.com/pubkey/event-reduce) algorithm to improve performance of observed and cached queries. - -## FAQ - -
    - Can I specify which document fields are returned by an RxDB query? - - No, RxDB does not support partial document retrieval. Because RxDB is a client-side database with limited memory, it caches and de-duplicates entire documents across multiple queries. Even if you only need a few fields, most storages must still fetch the entire JSON data, so subselecting fields would not significantly improve performance. Therefore, RxDB always returns full documents. If you only need certain fields, you can filter them out in your application code or consider storing just the necessary data in a separate collection. - -
    - -
    - Why doesn't RxDB support aggregations on queries? - - RxDB runs entirely on the client side. Any "aggregation" or data processing you might do within RxDB would still happen in the same JavaScript environment as your application code. Therefore, there's no real performance advantage or difference between doing the aggregation in RxDB vs. doing it in your own code after fetching the data. As a result, RxDB doesn't provide built-in aggregation methods. Instead, just query the documents you need and perform any calculations directly in your app's code. - -
    - -
    - Why does RxDB not support cross-collection queries? - - RxDB is a client-side database and does not provide built-in cross-collection queries or transactions. Instead, you can execute multiple queries in your JavaScript code and combine their results as needed. Because everything runs in the same environment, this approach offers the same performance you would get if cross-collection queries were built in - without the added complexity. - -
    - -
    - Why Doesn't RxDB Support Case-Insensitive Search? - - RxDB relies on various storage engines as its backend, and these storage engines generally do not support case-insensitive search natively, like [IndexedDB](./rx-storage-indexeddb.md) or [FoundationDB](./rx-storage-foundationdb.md). This limitation arises from the design of these engines, which prioritize efficiency and flexibility for specific types of queries rather than universal features like case-insensitivity. Although RxDB does not offer built-in support for case-insensitive search, there are two common workarounds: - - **Store Data in a Meta-Field for Lowercase Search**: To enable case-insensitive search, you can store an additional field in your documents where the relevant text data is preprocessed and saved in lowercase. -```ts -const document = { - name: 'John Doe', - nameLowercase: 'john doe' // Meta-field -}; -await myCollection.insert(document); - -const query = myCollection.find({ - selector: { - nameLowercase: { $eq: 'john doe' } - } -}); -``` - - **Use a Regex Query**: Regular expressions can perform case-insensitive searches. For example: -```ts -const query = myCollection.find({ - selector: { - name: { $regex: '^john doe$', $options: 'i' } // Case-insensitive regex - } -}); -``` -However, this method has a significant downside: regex queries often cannot leverage indexes efficiently. As a result, they may be slower, especially for large datasets. - -
    - ---- - -## Design Perfect Schemas in RxDB - -# RxSchema - -Schemas define the structure of the documents of a collection. Which field should be used as primary, which fields should be used as indexes and what should be encrypted. Every collection has its own schema. With RxDB, schemas are defined with the [jsonschema](https://json-schema.org/blog/posts/rxdb-case-study)-standard which you might know from other projects. - -## Example - -In this example-schema we define a hero-collection with the following settings: - -- the version-number of the schema is 0 -- the name-property is the **primaryKey**. This means its a unique, indexed, required `string` which can be used to definitely find a single document. -- the color-field is required for every document -- the healthpoints-field must be a number between 0 and 100 -- the secret-field stores an encrypted value -- the birthyear-field is final which means it is required and cannot be changed -- the skills-attribute must be an array with objects which contain the name and the damage-attribute. There is a maximum of 5 skills per hero. -- Allows adding attachments and store them encrypted - -```json - { - "title": "hero schema", - "version": 0, - "description": "describes a simple hero", - "primaryKey": "name", - "type": "object", - "properties": { - "name": { - "type": "string", - "maxLength": 100 // <- the primary key must have set maxLength - }, - "color": { - "type": "string" - }, - "healthpoints": { - "type": "number", - "minimum": 0, - "maximum": 100 - }, - "secret": { - "type": "string" - }, - "birthyear": { - "type": "number", - "final": true, - "minimum": 1900, - "maximum": 2050 - }, - "skills": { - "type": "array", - "maxItems": 5, - "uniqueItems": true, - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "damage": { - "type": "number" - } - } - } - } - }, - "required": [ - "name", - "color" - ], - "encrypted": ["secret"], - "attachments": { - "encrypted": true - } - } -``` - -## Create a collection with the schema - -```javascript -await myDatabase.addCollections({ - heroes: { - schema: myHeroSchema - } -}); -console.dir(myDatabase.heroes.name); -// heroes -``` - -## version -The `version` field is a number, starting with `0`. -When the version is greater than 0, you have to provide the migrationStrategies to create a collection with this schema. - -## primaryKey - -The `primaryKey` field contains the fieldname of the property that will be used as primary key for the whole collection. -The value of the primary key of the document must be a `string`, unique, final and is required. - -### composite primary key - -You can define a composite primary key which gets composed from multiple properties of the document data. - -```javascript -const mySchema = { - keyCompression: true, // set this to true, to enable the keyCompression - version: 0, - title: 'human schema with composite primary', - primaryKey: { - // where should the composed string be stored - key: 'id', - // fields that will be used to create the composed key - fields: [ - 'firstName', - 'lastName' - ], - // separator which is used to concat the fields values. - separator: '|' - }, - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 // <- the primary key must have set maxLength - }, - firstName: { - type: 'string' - }, - lastName: { - type: 'string' - } - }, - required: [ - 'id', - 'firstName', - 'lastName' - ] -}; -``` - -You can then find a document by using the relevant parts to create the composite primaryKey: - -```ts - -// inserting with composite primary -await myRxCollection.insert({ - // id, <- do not set the id, it will be filled by RxDB - firstName: 'foo', - lastName: 'bar' -}); - -// find by composite primary -const id = myRxCollection.schema.getPrimaryOfDocumentData({ - firstName: 'foo', - lastName: 'bar' -}); -const myRxDocument = myRxCollection.findOne(id).exec(); - -``` - -## Indexes -RxDB supports secondary indexes which are defined at the schema-level of the collection. - -Index is only allowed on field types `string`, `integer` and `number`. Some RxStorages allow to use `boolean` fields as index. - -Depending on the field type, you must have set some meta attributes like `maxLength` or `minimum`. This is required so that RxDB -is able to know the maximum string representation length of a field, which is needed to craft custom indexes on several `RxStorage` implementations. - -:::note -RxDB will always append the `primaryKey` to all indexes to ensure a deterministic sort order of query results. You do not have to add the `primaryKey` to any index. -::: - -### Index-example - -```javascript -const schemaWithIndexes = { - version: 0, - title: 'human schema with indexes', - keyCompression: true, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 // <- the primary key must have set maxLength - }, - firstName: { - type: 'string', - maxLength: 100 // <- string-fields that are used as an index, must have set maxLength. - }, - lastName: { - type: 'string' - }, - active: { - type: 'boolean' - }, - familyName: { - type: 'string' - }, - balance: { - type: 'number', - - // number fields that are used in an index, must have set minimum, maximum and multipleOf - minimum: 0, - maximum: 100000, - multipleOf: 0.01 - }, - creditCards: { - type: 'array', - items: { - type: 'object', - properties: { - cvc: { - type: 'number' - } - } - } - } - }, - required: [ - 'id', - 'active' // <- boolean fields that are used in an index, must be required. - ], - indexes: [ - 'firstName', // <- this will create a simple index for the `firstName` field - ['active', 'firstName'], // <- this will create a compound-index for these two fields - 'active' - ] -}; -``` - -# internalIndexes - -When you use RxDB on the server-side, you might want to use internalIndexes to speed up internal queries. [Read more](./rx-server.md#server-only-indexes) - -## attachments -To use attachments in the collection, you have to add the `attachments`-attribute to the schema. [See RxAttachment](./rx-attachment.md). - -## default -Default values can only be defined for first-level fields. -Whenever you insert a document unset fields will be filled with default-values. - -```javascript -const schemaWithDefaultAge = { - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 // <- the primary key must have set maxLength - }, - firstName: { - type: 'string' - }, - lastName: { - type: 'string' - }, - age: { - type: 'integer', - default: 20 // <- default will be used - } - }, - required: ['id'] -}; -``` - -## final -By setting a field to `final`, you make sure it cannot be modified later. Final fields are always required. -Final fields cannot be observed because they will not change. - -Advantages: - -- With final fields you can ensure that no-one accidentally modifies the data. -- When you enable the `eventReduce` algorithm, some performance-improvements are done. - -```javascript -const schemaWithFinalAge = { - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 // <- the primary key must have set maxLength - }, - firstName: { - type: 'string' - }, - lastName: { - type: 'string' - }, - age: { - type: 'integer', - final: true - } - }, - required: ['id'] -}; -``` - -## Non allowed properties - -The schema is not only used to validate objects before they are written into the database, but also used to map getters to observe and populate single fieldnames, keycompression and other things. Therefore you can not use every schema which would be valid for the spec of [json-schema.org](http://json-schema.org/). -For example, fieldnames must match the regex `^[a-zA-Z][[a-zA-Z0-9_]*]?[a-zA-Z0-9]$` and `additionalProperties` is always set to `false`. But don't worry, RxDB will instantly throw an error when you pass an invalid schema into it. - -Also the following class properties of `RxDocument` cannot be used as top level fields because they would clash when the RxDocument property is accessed: -```json -[ - "collection", - "_data", - "_propertyCache", - "isInstanceOfRxDocument", - "primaryPath", - "primary", - "revision", - "deleted$", - "deleted$$", - "deleted", - "getLatest", - "$", - "$$", - "get$", - "get$$", - "populate", - "get", - "toJSON", - "toMutableJSON", - "update", - "incrementalUpdate", - "updateCRDT", - "putAttachment", - "putAttachmentBase64", - "getAttachment", - "allAttachments", - "allAttachments$", - "modify", - "incrementalModify", - "patch", - "incrementalPatch", - "_saveData", - "remove", - "incrementalRemove", - "close", - "deleted", - "synced" -] -``` - -## FAQ - -
    - How can I store a Date? - - With RxDB you can only store plain JSON data inside of a document. You cannot store a JavaScript `new Date()` instance directly. This is for performance reasons and because `Date()` is a mutable thing where changing it at any time might cause strange problem that are hard to debug. - - To store a date in RxDB, you have to define a string field with a `format` attribute: - ```json - { - "type": "string", - "format": "date-time" - } - ``` - - When storing the data you have to first transform your `Date` object into a string `Date.toISOString()`. - Because the `date-time` is sortable, you can do whatever query operations on that field and even use it as an index. - -
    - -
    - How to store schemaless data? - - By design, RxDB requires that every collection has a schema. This means you cannot create a truly "schema-less" collection where top-level fields are unknown at schema creation time. RxDB must know about all fields of a document at the top level to perform validation, index creation, and other internal optimizations. - However, there is a way to store data of arbitrary structure at sub-fields. To do this, define a property with `type: "object"` in your schema. For example: - ```ts - { - "version": 0, - "primaryKey": "id", - "type": "object", - "properties": { - "id": { - "type": "string", - "maxLength": 100 - }, - "myDynamicData": { - "type": "object" - // Here you can store any JSON data - // because it's an open object. - } - }, - "required": ["id"] - } - ``` - -
    - -
    - Why does RxDB automatically set `additionalProperties: false` at the top level - - RxDB automatically sets `additionalProperties: false` at the top level of a schema to ensure that all top-level fields are known in advance. This design choice offers several benefits: - -- Prevents collisions with RxDocument class properties: -RxDB documents have built-in class methods (e.g., .toJSON, .save) at the top level. By forbidding unknown top-level properties, we avoid accidental naming collisions with these built-in methods. - -- Avoids conflicts with user-defined ORM functions: -Developers can add custom [ORM methods](./orm.md) to RxDocuments. If top-level properties were unbounded, a property name could accidentally conflict with a method name, leading to unexpected behavior. - -- Improves TypeScript typings: -If RxDB didn't know about all top-level fields, the document type would effectively become `any`. That means a simple typo like `myDocument.toJOSN()` would only be caught at runtime, not at build time. By disallowing unknown properties, TypeScript can provide strict typing and catch errors sooner. - -
    - -
    - Can't change the schema of a collection - - When you make changes to the schema of a collection, you sometimes can get an error like -`Error: addCollections(): another instance created this collection with a different schema`. - -This means you have created a collection before and added document-data to it. -When you now just change the schema, it is likely that the new schema does not match the saved documents inside of the collection. -This would cause strange bugs and would be hard to debug, so RxDB check's if your schema has changed and throws an error. - -To change the schema in **production**-mode, do the following steps: - -- Increase the `version` by 1 -- Add the appropriate [migrationStrategies](https://pubkey.github.io/rxdb/migration-schema.html) so the saved data will be modified to match the new schema - -In **development**-mode, the schema-change can be simplified by **one of these** strategies: - -- Use the memory-storage so your db resets on restart and your schema is not saved permanently -- Call `removeRxDatabase('mydatabasename', RxStorage);` before creating a new RxDatabase-instance -- Add a timestamp as suffix to the database-name to create a new one each run like `name: 'heroesDB' + new Date().getTime()` - -
    - ---- - -## RxServer Scaling - Vertical or Horizontal - -# Scaling the RxServer - -The [RxDB Server](./rx-server.md) run in JavaScript and JavaScript runs on a single process on the operating system. This can make the CPU performance limit to be the main bottleneck when serving requests to your users. To mitigate that problem, there are a wide range of methods to scale up the server so that it can serve more requests at the same time faster. - -## Vertical Scaling - -Vertical Scaling aka "scaling up" has the goal to get more power out of a single server by utilizing more of the servers compute. Vertical scaling should be the first step when you decide it is time to scale. - -### Run multiple JavaScript processes -To utilize more compute power of your server, the first step is to scale vertically by running the RxDB server on **multiple processes** in parallel. -RxDB itself is already build to support multiInstance-usage on the client, like when the user has opened multiple browser tabs at once. The same method works also on the server side in Node.js. You can spawn multiple JavaScript processes that use the same [RxDatabase](./rx-database.md) and the instances will automatically communicate with each other and distribute their data and events with the [BroadcastChannel](https://github.com/pubkey/broadcast-channel). -By default the [multiInstance param](./rx-database.md#multiinstance) is set to `true` when calling `createRxDatabase()`, so you do not have to change anything. To make all processes accessible through the same endpoint, you can put a load-balancer like [nginx](https://nginx.org/en/docs/http/load_balancing.html) in front of them. - -### Using workers to split up the load - -Another way to increases the server capacity is to put the storage into a [Worker thread](./rx-storage-worker.md) so that the "main" thread with the webserver can handle more requests. This might be easier to set up compared to using multiple JavaScript processes and a load balancer. - -### Use an in-memory storage at the user facing level - -Another way to serve more requests to your end users, is to use an [in-memory](./rx-storage-memory.md) storage that has the [best](./rx-storage-performance.md) read- and write performance. It outperforms persistent storages by a factor of 10x. -So instead of directly serving requests from the persistence layer, you add an in-memory layer on top of that. You could either do a [replication](./replication.md) from your memory database to the persistent one, or you use the [memory mapped](./rx-storage-memory-mapped.md) storage which has this build in. - -```ts -import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; -import { replicateRxCollection } from 'rxdb/plugins/replication'; -import { getRxStorageFilesystemNode } from 'rxdb-premium/plugins/storage-filesystem-node'; -import { getMemoryMappedRxStorage } from 'rxdb-premium/plugins/storage-memory-mapped'; -const myRxDatabase = await createRxDatabase({ - name: 'mydb', - storage: getMemoryMappedRxStorage({ - storage: getRxStorageFilesystemNode({ - basePath: path.join(__dirname, 'my-database-folder') - }) - }) -}); -await myDatabase.addCollections({/* ... */}); - -const myServer = await startRxServer({ - database: myRxDatabase, - port: 443 -}); -``` - -But notice that you have to check your persistence requirements. When a write happens to the memory layer and the server crashes while it has not persisted, in rare cases the write operation might get lost. You can remove that risk by setting `awaitWritePersistence: true` on the [memory mapped storage](./rx-storage-memory-mapped.md) settings. - -## Horizontal Scaling - -To scale the RxDB Server above a single physical hardware unit, there are different solutions where the decision depends on the exact use case. - -### Single Datastore with multiple branches -The most common way to use multiple servers with RxDB is to split up the server into a tree with a root "datastore" and multiple "branches". The datastore contains the persisted data and only servers as a replication endpoint for the branches. The branches themself will replicate data to and from the datastore and server requests to the end users. -This is mostly useful on read-heavy applications because reads will directly run on the branches without ever reaching the main datastore and you can always add more branches to **scale up**. Even adding additional layers of "datastores" is possible so the tree can grow (or shrink) with the demand. - - - -### Moving the branches to "the edge" - -Instead of running the "branches" of the tree on the same physical location as the datastore, it often makes sense to move the branches into a datacenter near the end users. Because the RxDB [replication algorithm](./replication.md) is made to work with slow and even partially offline users, using it for physically separated servers will work the same way. Latency is not that important because writes and reads will not decrease performance by blocking each other and the replication can run in the background without blocking other servers during transaction. - -### Replicate Databases for Microservices - -If your application is build with a [microservice architecture](https://en.wikipedia.org/wiki/Microservices) and your microservices are also build in Node.js, you can scale the database horizontally by moving the database into the microservices and use the [RxDB replication](./replication.md) to do a realtime sync between the microservices and a main "datastore" server. The "datastore" server would then only handle the replication requests or do some additional things like logging or [backups](./backup.md). The compute for reads and writes will then mainly be done on the microservices themself. This simplifies setting up more and more microservices without decreasing the performance of the whole system. - -### Use a self-scaling RxStorage - -An alternative to scaling up the RxDB servers themself, you can also switch to a [RxStorage](./rx-storage.md) which scales up internally. For example the [FoundationDB storage](./rx-storage-foundationdb.md) or [MongoDB](./rx-storage-mongodb.md) can work on top of a cluster that can increase load by adding more servers to itself. With that you can always add more Node.js RxDB processes that connect to the same cluster and server requests from it. - ---- - -## RxDB Server - Deploy Your Data - -# RxDB Server - -The RxDB Server Plugin makes it possible to spawn a server on top of a RxDB database that offers multiple types of endpoints for various usages. It can spawn basic CRUD REST endpoints or even realtime replication endpoints that can be used by the client devices to replicate data. The RxServer plugin is designed to be used in Node.js but you can also use it in Deno, Bun or the [Electron](./electron-database.md) "main" process. You can use it either as a **standalone server** or add it on top of an **existing http server** (like express) in nodejs. - -## Starting a RxServer - -To create an `RxServer`, you have to install the `rxdb-server` package with `npm install rxdb-server --save` and then you can import the `createRxServer()` function and create a server on a given [RxDatabase](./rx-database.md) and adapter. - -After adding the endpoints to the server, do not forget to call `myServer.start()` to start the actually http-server. - -```ts -import { createRxServer } from 'rxdb-server/plugins/server'; - -/** - * We use the express adapter which is the one that comes with RxDB core - * Make sure you have express installed in the correct version! - * @see https://github.com/pubkey/rxdb-server/blob/master/package.json - */ -import { RxServerAdapterExpress } from 'rxdb-server/plugins/adapter-express'; - -const myServer = await createRxServer({ - database: myRxDatabase, - adapter: RxServerAdapterExpress, - port: 443 -}); - -// add endpoints here (see below) - -// after adding the endpoints, start the server -await myServer.start(); -``` - -### Using RxServer with Fastify - -There is also a [RxDB Premium 👑](/premium/) adapter to use the RxServer with [Fastify](https://fastify.dev/) instead of express. Fastify has shown to have better performance and in general is more modern. - -```ts -import { createRxServer } from 'rxdb-server/plugins/server'; -import { RxServerAdapterFastify } from 'rxdb-premium/plugins/server-adapter-fastify'; - -const myServer = await createRxServer({ - database: myRxDatabase, - adapter: RxServerAdapterFastify, - port: 443 -}); -await myServer.start(); -``` - -### Using RxServer with Koa - -There is also a [RxDB Premium 👑](/premium/) adapter to use the RxServer with [Koa](https://koajs.com/) instead of express. Koa has shown to have better performance compared to express. - -```ts -import { createRxServer } from 'rxdb-server/plugins/server'; -import { RxServerAdapterKoa } from 'rxdb-premium/plugins/server-adapter-koa'; - -const myServer = await createRxServer({ - database: myRxDatabase, - adapter: RxServerAdapterKoa, - port: 443 -}); -await myServer.start(); -``` - -## RxServer Endpoints - -On top of the RxServer you can add different types of **endpoints**. An endpoint is always connected to exactly one [RxCollection](./rx-collection.md) and it only serves data from that single collection. - -For now there are only two endpoints implemented, the [replication endpoint](#replication-endpoint) and the [REST endpoint](#rest-endpoint). Others will be added in the future. - -An endpoint is added to the server by calling the add endpoint method like `myRxServer.addReplicationEndpoint()`. Each needs a different `name` string as input which will define the resulting endpoint url. - -The endpoint urls is a combination of the given `name` and schema `version` of the collection, like `/my-endpoint/0`. - -```ts -const myEndpoint = server.addReplicationEndpoint({ - name: 'my-endpoint', - collection: myServerCollection -}); - -console.log(myEndpoint.urlPath) // > 'my-endpoint/0' -``` - -Notice that it is **not required** that the server side schema version is equal to the client side schema version. You might want to change server schemas more often and then only do a [migration](./migration-schema.md) on the server, not on the clients. - -## Replication Endpoint - -The replication endpoint allows clients that connect to it to replicate data with the server via the [RxDB Sync Engine](./replication.md). There is also the [Replication Server](./replication-server.md) plugin that is used on the client side to connect to the endpoint. - -The endpoint is added to the server with the `addReplicationEndpoint()` method. It requires a specific collection and the endpoint will only provided replication for documents inside of that collection. - -```ts -// > server.ts -const endpoint = server.addReplicationEndpoint({ - name: 'my-endpoint', - collection: myServerCollection -}); -``` - -Then you can start the [Server Replication](./replication-server.md) on the client: -```ts -// > client.ts -const replicationState = await replicateServer({ - collection: usersCollection, - replicationIdentifier: 'my-server-replication', - url: 'http://localhost:80/my-endpoint/0', - push: {}, - pull: {} -}); -``` - -## REST endpoint - -The REST endpoint exposes various methods to access the data from the RxServer with non-RxDB tools via plain HTTP operations. You can use it to connect apps that are programmed in different programming languages than JavaScript or to access data from other third party tools. - -Creating a REST endpoint on a RxServer: -```ts -const endpoint = await server.addRestEndpoint({ - name: 'my-endpoint', - collection: myServerCollection -}); -``` - -```ts -// plain http request with fetch -const request = await fetch('http://localhost:80/' + endpoint.urlPath + '/query', { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ selector: {} }) -}); -const response = await request.json(); -``` - -There is also the `client-rest` plugin that provides type-save interactions with the REST endpoint: - -```ts -// using the client (optional) -import { createRestClient } from 'rxdb-server/plugins/client-rest'; -const client = createRestClient('http://localhost:80/' + endpoint.urlPath, {/* headers */}); -const response = await client.query({ selector: {} }); -``` - -The REST endpoint exposes the following paths: - -- **query [POST]**: Fetch the results of a NoSQL query. -- **query/observe [GET]**: Observe a query's results via [Server Send Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events). -- **get [POST]**: Fetch multiple documents by their primary key. -- **set [POST]**: Write multiple documents at once. -- **delete [POST]**: Delete multiple documents by their primary key. - -## CORS - -When creating a server or adding endpoints, you can specify a [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) string. -Endpoint cors always overwrite server cors. The default is the wildcard `*` which allows all requests. - -```ts -const myServer = await startRxServer({ - database: myRxDatabase, - cors: 'http://example.com' - port: 443 -}); -const endpoint = await server.addReplicationEndpoint({ - name: 'my-endpoint', - collection: myServerCollection, - cors: 'http://example.com' -}); -``` - -## Auth handler - -To authenticate users and to make user-specific data available on server requests, an `authHandler` must be provided that parses the headers and returns the actual auth data that is used to authenticate the client and in the [queryModifier](#query-modifier) and [changeValidator](#change-validator). - -An auth handler gets the given headers object as input and returns the auth data in the format `{ data: {}, validUntil: 1706579817126}`. -The `data` field can contain any data that can be used afterwards in the queryModifier and changeValidator. -The `validUntil` field contains the unix timestamp in milliseconds at which the authentication is no longer valid and the client will get disconnected. - -For example your authHandler could get the `Authorization` header and parse the [JSON web token](https://jwt.io/) to identify the user and store the user id in the `data` field for later use. - -## Query modifier - -The query modifier is a JavaScript function that is used to restrict which documents a client can fetch or replicate from the server. -It gets the auth data and the actual NoSQL query as input parameter and returns a modified NoSQL query that is then used internally by the server. -You can pass a different query modifier to each endpoint so that you can have different endpoints for different use cases on the same server. - -For example you could use a query modifier that get the `userId` from the auth data and then restricts the query to only return documents that have the same `userId` set. - -```ts -function myQueryModifier(authData, query) { - query.selector.userId = { $eq: authData.data.userid }; - return query; -} - -const endpoint = await server.addReplicationEndpoint({ - name: 'my-endpoint', - collection: myServerCollection, - queryModifier: myQueryModifier -}); -``` - -The RxServer will use the queryModifier at many places internally to determine which queries to run or if a document is allowed to be seen/edited by a client. - -:::note -For performance reasons the `queryModifier` and `changeValidator` **MUST NOT** be `async` and return a promise. If you need async data to run them, you should gather that data in the `RxServerAuthHandler` and store it in the auth data to access it later. -::: - -## Change validator - -The change validator is a JavaScript function that is used to restrict which document writes are allowed to be done by a client. -For example you could restrict clients to only change specific document fields or to not do any document writes at all. -It can also be used to validate change document data before storing it at the server. - -In this example we restrict clients from doing inserts and only allow updates. For that we check if the change contains an `assumedMasterState` property and return false to block the write. - -```ts - -function myChangeValidator(authData, change) { - if(change.assumedMasterState) { - return false; - } else { - return true; - } -} - -const endpoint = await server.addReplicationEndpoint({ - name: 'my-endpoint', - collection: myServerCollection, - changeValidator: myChangeValidator -}); -``` - -## Server-only indexes - -Normal RxDB schema indexes get the `_deleted` field prepended because all [RxQueries](./rx-query.md) automatically only search for documents with `_deleted=false`. -When you use RxDB on a server, this might not be optimal because there can be the need to query for documents where the value of `_deleted` does not matter. Mostly this is required in the [pull.stream$](./replication.md#checkpoint-iteration) of a replication when a [queryModifier](#query-modifier) is used to add an additional field to the query. - -To set indexes without `_deleted`, you can use the `internalIndexes` field of the schema like the following: - -```json - { - "version": 0, - "primaryKey": "id", - "type": "object", - "properties": { - "id": { - "type": "string", - "maxLength": 100 - }, - "name": { - "type": "string", - "maxLength": 100 - } - }, - "internalIndexes": [ - ["name", "id"] - ] -} -``` - -:::note -Indexes come with a performance burden. You should only use the indexes you need and make sure you **do not** accidentally set the `internalIndexes` in your client side [RxCollections](./rx-collection.md). -::: - -## Server-only fields - -All endpoints can be created with the `serverOnlyFields` set which defines some fields to only exist on the server, not on the clients. Clients will not see that fields and cannot do writes where one of the `serverOnlyFields` is set. -Notice that when you use `serverOnlyFields` you likely need to have a different schema on the server than the schema that is used on the clients. - -```ts -const endpoint = await server.addReplicationEndpoint({ - name: 'my-endpoint', - collection: col, - // here the field 'my-secretss' is defined to be server-only - serverOnlyFields: ['my-secrets'] -}); -``` - -:::note -For performance reasons, only top-level fields can be used as `serverOnlyFields`. Otherwise the server would have to deep-clone all document data which is too expensive. -::: - -## Readonly fields - -When you have fields that should only be modified by the server, but not by the client, you can ensure that by comparing the fields value in the [changeValidator](#change-validator). - -```ts - -const myChangeValidator = function(authData, change){ - if(change.newDocumentState.myReadonlyField !== change.assumedMasterState.myReadonlyField){ - throw new Error('myReadonlyField is readonly'); - } -} -``` - -## $regex queries not allowed - -`$regex` queries are not allowed to run at the server to prevent [ReDos Attacks](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS). - -## Conflict handling - -To [detect and handle conflicts](./replication.md#conflict-handling), the conflict handler from the endpoints RxCollection is used. - -## FAQ - -
    - Why are the server plugins in a different github repo and npm package? - - The RxServer and its other plugins are in a different github repository because: - - - It has too many dependencies that you do not want to install if you only use RxDB at the client side - - - It has a different license (SSPL) to prevent large cloud vendors from "stealing" the revenue, similar to MongoDB's license. - - - -
    - -
    - Why can't endpoints be added dynamically? - - After `RxServer.start()` is called, you can no longer add endpoints. This is because many of the supported - server libraries do not allow dynamic routing for performance and security reasons. - -
    - ---- - -## RxState - Reactive Persistent State with RxDB - - -RxState is a flexible state library build on top of the [RxDB Database](https://rxdb.info/). While RxDB stores similar documents inside of collections, RxState can store any complex JSON data without having a predefined schema. - -The state is automatically persisted through RxDB and states changes are propagated between browser tabs. Even setting up replication is simple by using the RxDB [Replication feature](./replication.md). - -## Creating a RxState - -A `RxState` instance is created on top of a [RxDatabase](./rx-database.md). The state will automatically be persisted with the [storage](./rx-storage.md) that was used when setting up the RxDatabase. To use it you first have to import the `RxDBStatePlugin` and add it to RxDB with `addRxPlugin()`. -To create a state call the `addState()` method on the database instance. Calling `addState` multiple times will automatically de-duplicated and only create a single RxState object. - -```javascript -import { createRxDatabase, addRxPlugin } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -// first add the RxState plugin to RxDB -import { RxDBStatePlugin } from 'rxdb/plugins/state'; -addRxPlugin(RxDBStatePlugin); - -const database = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage(), -}); - -// create a state instance -const myState = await database.addState(); - -// you can also create states with a given namespace -const myChildState = await database.addState('myNamepsace'); -``` - -## Writing data and Persistence - -Writing data to the state happen by a so called `modifier`. It is a simple JavaScript function that gets the current value as input and returns the new, modified value. - -For example to increase the value of `myField` by one, you would use a modifier that increases the current value: -```ts -// initially set value to zero -await myState.set('myField', v => 0); - -// increase value by one -await myState.set('myField', v => v + 1); - -// update value to be 42 -await myState.set('myField', v => 42); -``` - -The modifier is used instead of a direct assignment to ensure correct behavior when other JavaScript realms write to the state at the same time, like other browser tabs or webworkers. On conflicts, the modifier will just be run again to ensure deterministic and correct behavior. Therefore mutation is `async`, you have to `await` the call to the set function when you care about the moment when the change actually happened. - -## Get State Data - -The state stored inside of a RxState instance can be seen as a big single JSON object that contains all data. -You can fetch the whole object or partially get a single properties or nested ones. -Fetching data can either happen with the `.get()` method or by accessing the field directly like `myRxState.myField`. - -```ts -// get root state data -const val = myState.get(); - -// get single property -const val = myState.get('myField'); -const val = myState.myField; - -// get nested property -const val = myState.get('myField.childfield'); -const val = myState.myField.childfield; - -// get nested array property -const val = myState.get('myArrayField[0].foobar'); -const val = myState.myArrayField[0].foobar; -``` - -## Observability - -Instead of fetching the state once, you can also observe the state with either rxjs observables or [custom reactivity handlers](#rxstate-with-signals-and-hooks) like signals or hooks. - -Rxjs observables can be created by either using the `.get$()` method or by accessing the top level property suffixed with a dollar sign like `myState.myField$`. - -```ts -const observable = myState.get$('myField'); -const observable = myState.myField$; - -// then you can subscribe to that observable -observable.subscribe(newValue => { - // update the UI -}); -``` -Subscription works across multiple JavaScript realms like browser tabs or Webworkers. - -## RxState with signals and hooks - -With the double-dollar sign you can also access [custom reactivity](./reactivity.md) instances like signals or hooks. These are easier to use compared to rxjs, depending on which JavaScript framework you are using. - -For example in angular to use signals, you would first add a reactivity factory to your database and then access the signals of the RxState: - -```ts -import { RxReactivityFactory, createRxDatabase } from 'rxdb/plugins/core'; -import { toSignal } from '@angular/core/rxjs-interop'; -const reactivityFactory: RxReactivityFactory = { - fromObservable(obs, initialValue) { - return toSignal(obs, { initialValue }); - } -}; -const database = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage(), - reactivity: reactivityFactory -}); -const myState = await database.addState(); - -const mySignal = myState.get$$('myField'); -const mySignal = myState.myField$$; -``` - -## Cleanup RxState operations - -For faster writes, changes to the state are only written as list of operations to disc. After some time you might have too -many operations written which would delay the initial state creation. To automatically merge the state operations into a single operation and clear the old operations, you should add the [Cleanup Plugin](./cleanup.md) before creating the [RxDatabase](./rx-database.md): - -```ts -import { addRxPlugin } from 'rxdb'; -import { RxDBCleanupPlugin } from 'rxdb/plugins/cleanup'; -addRxPlugin(RxDBCleanupPlugin); -``` - -## Correctness over Performance - -RxState is optimized for correctness, not for performance. Compared to other state libraries, RxState directly persists data to storage and ensures write conflicts are handled properly. Other state libraries are handles mainly in-memory and lazily persist to disc without caring about conflicts or multiple browser tabs which can cause problems and hard to reproduce bugs. - -RxState still uses RxDB which has a range of [great performing storages](./rx-storage-performance.md) so the write speed is more than sufficient. Also to further improve write performance you can use more RxState instances (with an different namespace) to split writes across multiple storage instances. - -Reads happen directly in-memory which makes RxState read performance comparable to other state libraries. - -## RxState Replication - -Because the state data is stored inside of an internal [RxCollection](./rx-collection.md) you can easily use the [RxDB Replication](./replication.md) to sync data between users or devices of the same user. - -For example with the [P2P WebRTC replication](./replication-webrtc.md) you can start the replication on the collection and automatically sync the RxState operations between users directly: - -```ts -import { - replicateWebRTC, - getConnectionHandlerSimplePeer -} from 'rxdb/plugins/replication-webrtc'; - -const database = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage(), -}); - -const myState = await database.addState(); - -const replicationPool = await replicateWebRTC( - { - collection: myState.collection, - topic: 'my-state-replication-pool', - connectionHandlerCreator: getConnectionHandlerSimplePeer({}), - pull: {}, - push: {} - } -); -``` - ---- - -## DenoKV RxStorage - -# RxDB Database on top of Deno Key Value Store - -With the DenoKV [RxStorage](./rx-storage.md) layer for [RxDB](https://rxdb.info), you can run a fully featured **NoSQL database** on top of the [DenoKV API](https://docs.deno.com/kv/manual). -This gives you the benefits and features of the RxDB JavaScript Database, combined with the global availability and distribution features of the DenoKV. - - - -## What is DenoKV - -[DenoKV](https://deno.com/kv) is a strongly consistent key-value storage, globally replicated for low-latency reads across 35 worldwide regions via [Deno Deploy](https://deno.com/deploy). -When you release your Deno application on Deno Deploy, it will start a instance on each of the [35 worldwide regions](https://docs.deno.com/deploy/manual/regions). This edge deployment guarantees minimal latency when serving requests to end users devices around the world. DenoKV is a shared storage which shares its state across all instances. -But, because DenoKV is "only" a **Key-Value storage**, it only supports basic CRUD operations on datasets and indexes. Complex features like queries, encryption, compression or client-server replication, are missing. Using RxDB on top of DenoKV fills this gap and makes it easy to build realtime [offline-first](./offline-first.md) application on top of Deno backend. - -## Use cases - -Using RxDB-DenoKV instead of plain DenoKV, can have a wide range of benefits depending on your use case. - -- **Reduce vendor lock-in**: RxDB has a swappable [storage layer](./rx-storage.md) which allows you to swap out the underlying storage of your database. If you ever decide to move away from DenoDeploy or Deno at all, you do not have to refactor your whole application and instead just **swap the storage plugin**. For example if you decide migrate to Node.js, you can use the [FoundationDB RxStorage](./rx-storage-foundationdb.md) and store your data there. DenoKV is also implemented on top of FoundationDB so you can get similar performance. Alternatively RxDB supports a wide range of [storage plugins](./rx-storage.md) you can decide from. - -- **Add reactiveness**: DenoKV is a plain request-response datastore. While it supports observation of single rows by id, it does not allow to observe row-ranges or events. This makes it hard to impossible to build realtime applications with it because polling would be the only way to watch ranges of key-value pairs. With RxDB on top of DenoKV, changes to the database are **shared between DenoDeploy instances** so when you **observe a [query](./rx-query.md)** you can be sure that it is always up to date, no matter which instance has changed the document. Internally RxDB uses the [Deno BroadcastChannel API](https://docs.deno.com/deploy/api/runtime-broadcast-channel) to share events between instances. - -- **Reuse Client and Server Code**: When you use RxDB on the server and on the client side, many parts of your code can be reused on both sides which decreases development time significantly. - -- **Replicate from DenoKV to a local RxDB state**: Instead of running all operations against the global DenoKV, you can run a [realtime-replication](./replication.md) between a DenoKV-RxDatabase and a [locally stored dataset](./rx-storage-filesystem-node.md) or maybe even an [in-memory](./rx-storage-memory.md) stored one. This improves **query performance** and can **reduce your Deno Deploy cloud costs** because less operations run against the DenoKV, they only locally instead. - -- **Replicate with other backends**: The RxDB [Sync Engine](./replication.md) is pretty simple and allows you to easily build a replication with any backend architecture. For example if you already have your data stored in a self-hosted MySQL server, you can use RxDB to do a realtime replication of that data into a DenoKV RxDatabase instance. RxDB also has many plugins for replication with backend/protocols like [GraphQL](./replication-graphql.md), [Websocket](./replication-websocket.md), [CouchDB](./replication-couchdb.md), [WebRTC](./replication-webrtc.md), [Firestore](./replication-firestore.md) and [NATS](./replication-nats.md). - - - -## Using the DenoKV RxStorage - -To use the DenoKV RxStorage with RxDB, you import the `getRxStorageDenoKV` function from the plugin and set it as storage when calling [createRxDatabase](./rx-database.md#creation) - -```ts - -import { createRxDatabase } from 'rxdb'; -import { getRxStorageDenoKV } from 'rxdb/plugins/storage-denokv'; - -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageDenoKV({ - /** - * Consistency level, either 'strong' or 'eventual' - * (Optional) default='strong' - */ - consistencyLevel: 'strong', - /** - * Path which is used in the first argument of Deno.openKv(settings.openKvPath) - * (Optional) default='' - */ - openKvPath: './foobar', - /** - * Some operations have to run in batches, - * you can test different batch sizes to improve performance. - * (Optional) default=100 - */ - batchSize: number - }) -}); - -``` - -On top of that [RxDatabase](./rx-database.md) you can then create your collections and run operations. Follow the [quickstart](./quickstart.md) to learn more about how to use RxDB. - -## Using non-DenoKV storages in Deno - -When you use other storages than the DenoKV storage inside of a Deno app, make sure you set `multiInstance: false` when creating the database. Also you should only run one process per Deno-Deploy instance. This ensures your events are not mixed up by the [BroadcastChannel](https://docs.deno.com/deploy/api/runtime-broadcast-channel) across instances which would lead to wrong behavior. - -```ts -// DenoKV based database -const db = await createRxDatabase({ - name: 'denokvdatabase', - storage: getRxStorageDenoKV(), - /** - * Use multiInstance: true so that the Deno Broadcast Channel - * emits event across DenoDeploy instances - * (true is also the default, so you can skip this setting) - */ - multiInstance: true -}); - -// Non-DenoKV based database -const db = await createRxDatabase({ - name: 'denokvdatabase', - storage: getRxStorageFilesystemNode(), - /** - * Use multiInstance: false so that it does not share events - * across instances because the stored data is anyway not shared - * between them. - */ - multiInstance: false -}); -``` - ---- - -## RxDB Dexie.js Database - Fast, Reactive, Sync with Any Backend - -import {Steps} from '@site/src/components/steps'; - -# RxStorage Dexie.js - -To store the data inside of and RxDB Database in IndexedDB in the [browser](./articles/browser-database.md), you can use the [Dexie.js](https://github.com/dexie/Dexie.js) based [RxStorage](./rx-storage.md). Dexie.js is a minimal wrapper around IndexedDB and the Dexie.js RxStorage wraps that again to use it for an RxDB database in the browser. For side projects and prototypes that run in a browser, you should use the dexie RxStorage as a default. - -## Dexie.js vs IndexedDB Storage - -While Dexie.js [RxStorage](./rx-storage.md) can be used for free, most professional projects should switch to our **premium [IndexedDB RxStorage](./rx-storage-indexeddb.md) 👑** in production: - -- It is faster and reduces build size by up to **36%**. -- It has a way [better performance](./rx-storage-performance.md) on reads and writes. -- It stores attachments data as binary instead of base64 which reduces used space by 33%. -- It does not use a [Batched Cursor](./slow-indexeddb.md#batched-cursor) or [custom indexes](./slow-indexeddb.md#custom-indexes) which makes queries slower compared to the [IndexedDB RxStorage](./rx-storage-indexeddb.md). -- It supports **non-required indexes** which is [not possible](https://github.com/pubkey/rxdb/pull/6643#issuecomment-2505310082) with Dexie.js. -- It runs in a **WAL-like mode** (similar to SQLite) for faster writes and improved responsiveness. -- It support the [Storage Buckets API](./rx-storage-indexeddb.md#storage-buckets) - -## How to use Dexie.js as a Storage for RxDB - - - -### Import the Dexie Storage -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; -``` - -### Create a Database -```ts -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageDexie() -}); -``` - - -## Overwrite/Polyfill the native IndexedDB API with an in-memory version - -Node.js has no IndexedDB API. To still run the Dexie `RxStorage` in Node.js, for example to run unit tests, you have to polyfill it. -You can do that by using the [fake-indexeddb](https://github.com/dumbmatter/fakeIndexedDB) module and pass it to the `getRxStorageDexie()` function. - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; - -//> npm install fake-indexeddb --save -const fakeIndexedDB = require('fake-indexeddb'); -const fakeIDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange'); - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageDexie({ - indexedDB: fakeIndexedDB, - IDBKeyRange: fakeIDBKeyRange - }) -}); - -``` - -## Using Dexie Addons - -Dexie.js has its own plugin system with [many plugins](https://dexie.org/docs/DerivedWork#known-addons) for encryption, replication or other use cases. With the Dexie.js `RxStorage` you can use the same plugins by passing them to the `getRxStorageDexie()` function. - -```ts -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageDexie({ - addons: [ /* Your Dexie.js plugins */ ] - }) -}); -``` - -## Sync Dexie.js with your Backend in RxDB - -Having your local data in sync with a remote backend is a key feature of RxDB. Here are two approaches to achieve this when using the Dexie.js RxStorage: - -* **Dexie Cloud** provides a **managed solution**: For quick setups, letting you rely on its Cloud backend and conflict resolution. -* [RxDB's replication](./replication.md): Offers **full control** over your backend, data flow, and [conflict handling](./transactions-conflicts-revisions.md). - -Choose the approach that best suits your needs - whether you want to get started quickly with Dexie Cloud or require the adaptability and autonomy of RxDB's native replication. - -### A. Use Dexie Cloud Sync - -**Dexie Cloud** is an official SaaS solution provided by the Dexie team. It offers automatic synchronization, user management, and conflict resolution out of the box. The primary benefits are: - -- **Automatic Sync**: Dexie Cloud keeps your local IndexedDB in sync with its cloud-based backend. -- **User Authentication**: Built-in user management (auth, roles, permissions). -- **Conflict Resolution**: Automated resolution logic on the server side. - - - -#### Install the Dexie Cloud Addon - -```bash -npm install dexie-cloud-addon -``` - -#### Import RxDB and dexie-cloud -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; -import dexieCloud from 'dexie-cloud-addon'; -``` - -#### Create a Dexie based RxStorage with the Cloud Plugin - -```ts -const storage = getRxStorageDexie({ - addons: [dexieCloud], - /* - * Whenever a new dexie database instance is created, - * this method will be called. - */ - async onCreate(dexieDatabase, dexieDatabaseName) { - await dexieDatabase.cloud.configure({ - databaseUrl: "https://.dexie.cloud", - requireAuth: true // optional - }); - } -}); -``` - -#### Create an RxDB Database - -```ts -const db = await createRxDatabase({ - name: 'mydb', - storage -}); -``` - - -### B. Use the RxDB Replication - -For **full flexibility** over your backend or conflict resolution strategy, you can use one of **RxDB's many replication plugins** like - -- [CouchDB Replication](./replication-couchdb.md) Plugin: Replicate with a CouchDB Server -- [GraphQL Replication](./replication-graphql.md) Plugin: Sync data with any GraphQL endpoint. Useful when you have a custom schema or you want to utilize GraphQL's powerful query features. -- [Custom Replication with REST APIs](./replication-http.md): Implement your own replication by building a pull/push handler that communicates with any RESTful backend. - -Below is an example of replicating an RxDB collection with a CouchDB backend using RxDB's CouchDB replication plugin: - - - -#### Import the RxDB with dexie and the CouchDB plugin -```ts -import { replicateCouchDB } from 'rxdb/plugins/replication-couchdb'; -import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; -import { createRxDatabase } from 'rxdb/plugins/core'; -``` - -#### Create an RxDB Database with the Dexie Storage - -```ts -const db = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageDexie() -}); -``` - -#### Add a Collection - -```ts -await db.addCollections({ - humans: { - schema: { - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string', maxLength: 100 }, - name: { type: 'string' }, - age: { type: 'number' } - }, - required: ['id', 'name'] - } - } -}); -``` - -#### Sync the Collection with a CouchDB Server - -```ts -const replicationState = replicateCouchDB({ - replicationIdentifier: 'my-couchdb-replication', - collection: db.humans, - // The URL to your CouchDB endpoint - url: 'http://example.com/db/humans' -}); -``` - - - -## liveQuery - Realtime Queries - -Dexie.js offers a feature called `liveQuery` which automatically updates query results as data changes, allowing you to react to these changes in real-time. However, because RxDB intrinsically provides [reactive queries](./rx-query.md#observe), you typically do **not** need to enable live queries through Dexie. Once you have created your database and collections with RxDB, any query you perform can be observed by subscribing to it, for example via `collection.find().$.subscribe(results => { /*... */ })`. This means RxDB takes care of listening for changes and automatically emitting new results - ensuring your UI stays in sync with the underlying data without requiring extra plugins or manual polling. - -## Disabling the non-premium console log - -We want to be transparent with our community, and you'll notice a console message when using the free Dexie.js based RxStorage implementation. This message serves to inform you about the availability of faster storage solutions within our [👑 Premium Plugins](/premium/). We understand that this might be a minor inconvenience, and we sincerely apologize for that. However, maintaining and improving RxDB requires substantial resources, and our premium users help us ensure its sustainability. If you find value in RxDB and wish to remove this message, we encourage you to explore our premium storage options, which are optimized for professional use and production environments. Thank you for your understanding and support. - -If you already have premium access and want to use the Dexie.js [RxStorage](./rx-storage.md) without the log, you can call the `setPremiumFlag()` function to disable the log. - -```js -import { setPremiumFlag } from 'rxdb-premium/plugins/shared'; -setPremiumFlag(); -``` - -## Performance comparison with other RxStorage plugins - -The performance of the Dexie.js RxStorage is good enough for most use cases but other storages can have way better performance metrics: - ---- - -## Blazing-Fast Node Filesystem Storage - -# Filesystem Node RxStorage - -The Filesystem Node [RxStorage](./rx-storage.md) for RxDB is built on top of the [Node.js Filesystem API](https://nodejs.org/api/fs.html). -It stores data in plain json/txt files like any "normal" database does. It is a bit faster compared to the [SQLite storage](./rx-storage-sqlite.md) and its setup is less complex. -Using the same database folder in parallel with multiple Node.js processes is supported when you set `multiInstance: true` while creating the [RxDatabase](./rx-database.md). - -### Pros - -- Easier setup compared to [SQLite](./rx-storage-sqlite.md) -- [Fast](./rx-storage-performance.md) - -### Cons - -- It is part of the [RxDB Premium 👑](/premium/) plugin that must be purchased. - - - -## Usage - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageFilesystemNode -} from 'rxdb-premium/plugins/storage-filesystem-node'; - -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageFilesystemNode({ - basePath: path.join(__dirname, 'my-database-folder'), - /** - * Set inWorker=true if you use this RxStorage - * together with the WebWorker plugin. - */ - inWorker: false - }) -}); -/* ... */ -``` - ---- - -## RxDB on FoundationDB - Performance at Scale - -# RxDB Database on top of FoundationDB - -[FoundationDB](https://www.foundationdb.org/) is a distributed key-value store designed to handle large volumes of structured data across clusters of computers while maintaining high levels of performance, scalability, and fault tolerance. While FoundationDB itself only can store and query key-value pairs, it lacks more advanced features like complex queries, encryption and replication. - -With the FoundationDB based [RxStorage](./rx-storage.md) of [RxDB](https://rxdb.info/) you can combine the benefits of FoundationDB while having a fully featured, high performance NoSQL database. - -## Features of RxDB+FoundationDB - -Using RxDB on top of FoundationDB, gives you many benefits compare to using the plain FoundationDB API: - -- **Indexes**: In RxDB with a FoundationDB storage layer, indexes are used to optimize query performance, allowing for fast and efficient data retrieval even in large datasets. You can define single and compound indexes with the [RxDB schema](./rx-schema.md). -- **Schema Based Data Model**: Utilizing a [jsonschema](./rx-schema.md) based data model, the system offers a highly structured and versatile approach to organizing and [validating data](./schema-validation.md), ensuring consistency and clarity in database interactions. -- **Complex Queries**: The system supports complex [NoSQL queries](./rx-query.md), allowing for advanced data manipulation and retrieval, tailored to specific needs and intricate data relationships. For example you can do `$regex` or `$or` queries which is hardy possible with the plain key-value access of FoundationDB. -- **Observable Queries & Documents**: RxDB's observable queries and documents feature ensures real-time updates and synchronization, providing dynamic and responsive data interactions in applications. -- **Compression**: RxDB employs data [compression techniques](./key-compression.md) to reduce storage requirements and enhance transmission efficiency, making it more cost-effective and faster, especially for large volumes of data. You can compress the [NoSQL document](./key-compression.md) data, but also the [binary attachments](./rx-attachment.md#attachment-compression) data. -- **Attachments**: RxDB supports the storage and management of [attachments](./rx-attachment.md) which allowing for the seamless inclusion of binary data like images or documents alongside structured data within the database. - -## Installation - -- Install the [FoundationDB client cli](https://apple.github.io/foundationdb/getting-started-linux.html) which is used to communicate with the FoundationDB cluster. -- Install the [FoundationDB node bindings npm module](https://www.npmjs.com/package/foundationdb) via `npm install foundationdb`. This will install `v2.x.x`, which is only compatible with FoundationDB server and client `v7.3.x` (which is the only version currently maintained by the FoundationDB team). If you need to use an older version (e.g. `7.1.x` or `6.3.x`), you should run `npm install foundationdb@1.1.4` (though this might only work with `v6.3.x`). -- Due to an outstanding bug in node foundationdb, you will need to specify an `apiVersion` of `720` even though you are using `730`. When [this PR](https://github.com/josephg/node-foundationdb/pull/86) is merged, you will be able to use `730`. - -## Usage - -```typescript -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageFoundationDB -} from 'rxdb/plugins/storage-foundationdb'; - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageFoundationDB({ - /** - * Version of the API of the FoundationDB cluster.. - * FoundationDB is backwards compatible across a wide range of versions, - * so you have to specify the api version. - * If in doubt, set it to 720. - */ - apiVersion: 720, - /** - * Path to the FoundationDB cluster file. - * (optional) - * If in doubt, leave this empty to use the default location. - */ - clusterFile: '/path/to/fdb.cluster', - /** - * Amount of documents to be fetched in batch requests. - * You can change this to improve performance depending on - * your database access patterns. - * (optional) - * [default=50] - */ - batchSize: 50 - }) -}); -``` - -## Multi Instance - -Because FoundationDB does not offer a [changestream](https://forums.foundationdb.org/t/streaming-data-out-of-foundationdb/683/2), it is not possible to use the same cluster from more than one Node.js process at the same time. For example you cannot spin up multiple servers with RxDB databases that all use the same cluster. There might be workarounds to create something like a FoundationDB changestream and you can make a Pull Request if you need that feature. - ---- - -## Instant Performance with IndexedDB RxStorage - -# IndexedDB RxStorage - -The IndexedDB [RxStorage](./rx-storage.md) is based on plain IndexedDB and can be used in browsers, [electron](./electron-database.md) or hybrid apps. -Compared to other browser based storages, the IndexedDB storage has the smallest write- and read latency, the fastest initial page load -and the smallest build size. Only for big datasets (more than 10k documents), the [OPFS storage](./rx-storage-opfs.md) is better suited. - -While the IndexedDB API itself can be very slow, the IndexedDB storage uses many tricks and performance optimizations, some of which are described [here](./slow-indexeddb.md). For example it uses custom index strings instead of the native IndexedDB indexes, batches cursor for faster bulk reads and many other improvements. The IndexedDB storage also operates on [Write-ahead logging](https://en.wikipedia.org/wiki/Write-ahead_logging) similar to SQLite, to improve write latency while still ensuring consistency on writes. - -## IndexedDB performance comparison - -Here is some performance comparison with other storages. Compared to the non-memory storages like [OPFS](./rx-storage-opfs.md) and [WASM SQLite](./rx-storage-sqlite.md). IndexedDB has the smallest build size and fastest write speed. Only OPFS is faster on queries over big datasets. See [performance comparison](./rx-storage-performance.md) page for a comparison with all storages. - - - -## Using the IndexedDB RxStorage - -To use the indexedDB storage you import it from the [RxDB Premium 👑](/premium/) npm module and use `getRxStorageIndexedDB()` when creating the [RxDatabase](./rx-database.md). - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageIndexedDB -} from 'rxdb-premium/plugins/storage-indexeddb'; - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageIndexedDB({ - /** - * For better performance, queries run with a batched cursor. - * You can change the batchSize to optimize the query time - * for specific queries. - * You should only change this value when you are also doing performance measurements. - * [default=300] - */ - batchSize: 300 - }) -}); -``` - -## Overwrite/Polyfill the native IndexedDB - -Node.js has no IndexedDB API. To still run the IndexedDB `RxStorage` in Node.js, for example to run unit tests, you have to polyfill it. -You can do that by using the [fake-indexeddb](https://github.com/dumbmatter/fakeIndexedDB) module and pass it to the `getRxStorageIndexedDB()` function. - -```ts -import { createRxDatabase } from 'rxdb'; -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; - -//> npm install fake-indexeddb --save -const fakeIndexedDB = require('fake-indexeddb'); -const fakeIDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange'); - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageIndexedDB({ - indexedDB: fakeIndexedDB, - IDBKeyRange: fakeIDBKeyRange - }) -}); - -``` - -## Storage Buckets - -The [Storage Buckets API](https://wicg.github.io/storage-buckets/) provides a way for sites to organize locally stored data into groupings called "storage buckets". This allows the user agent or sites to manage and delete buckets independently rather than applying the same treatment to all the data from a single origin. [Read More](https://developer.chrome.com/docs/web-platform/storage-buckets?hl=en) - -To use different storage buckets with the RxDB IndexedDB Storage, you can use a function instead of a plain object when providing the `indexedDB` attribute: - -```ts -import { createRxDatabase } from 'rxdb'; -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageIndexedDB({ - indexedDB: async(params) => { - const myStorageBucket = await navigator.storageBuckets.open('myApp-' + params.databaseName); - return myStorageBucket.indexedDB; - }, - IDBKeyRange - }) -}); -``` - -## Limitations of the IndexedDB RxStorage - -- It is part of the [RxDB Premium 👑](/premium/) plugin that must be purchased. If you just need a storage that works in the browser and you do not have to care about performance, you can use the [LocalStorage storage](./rx-storage-localstorage.md) instead. -- The IndexedDB storage requires support for [IndexedDB v2](https://caniuse.com/indexeddb2), it does not work on Internet Explorer. - ---- - -## Fastest RxDB Starts - Localstorage Meta Optimizer - -# RxStorage Localstorage Meta Optimizer - -The [RxStorage](./rx-storage.md) Localstorage Meta Optimizer is a wrapper around any other RxStorage. The wrapper uses the original RxStorage for normal collection documents. But to optimize the initial page load time, it uses [localstorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage?retiredLocale=de) to store the plain key-value metadata that RxDB needs to create databases and collections. This plugin can only be used in browsers. - -Depending on your database usage and the collection amount, this can save about 200 milliseconds on the initial pageload. It is recommended to use this when you create more than 4 RxCollections. - -:::note Premium -This plugin is part of [RxDB Premium 👑](/premium/). It is not part of the default RxDB module. -::: - -## Usage - -The meta optimizer gets wrapped around any other RxStorage. It will than automatically detect if an RxDB internal storage instance is created, and replace that with a [localstorage](./articles/localstorage.md) based instance. - -```ts -import { - getLocalstorageMetaOptimizerRxStorage -} from 'rxdb-premium/plugins/storage-localstorage-meta-optimizer'; - -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; - -/** - * First wrap the original RxStorage with the optimizer. - */ -const optimizedRxStorage = getLocalstorageMetaOptimizerRxStorage({ - - /** - * Here we use the IndexedDB RxStorage, - * it is also possible to use any other RxStorage instead. - */ - storage: getRxStorageIndexedDB() -}); - -/** - * Create the RxDatabase with the wrapped RxStorage. - */ -const database = await createRxDatabase({ - name: 'mydatabase', - storage: optimizedRxStorage -}); - -``` - ---- - -## RxDB LocalStorage - The Easiest Way to Persist Data in Your Web App - -import {Steps} from '@site/src/components/steps'; - -# RxStorage LocalStorage - -RxDB can persist data in various ways. One of the simplest methods is using the browser’s built-in [LocalStorage](./articles/localstorage.md). This storage engine allows you to store and retrieve RxDB documents directly from the browser without needing additional plugins or libraries. - -> **Recommended Default for using RxDB in the Browser** -> -> We highly recommend using LocalStorage for a quick and easy RxDB setup, especially when you want a minimal project configuration. For professional projects, the [IndexedDB RxStorage](./rx-storage-indexeddb.md) is recommended in most cases. - -## Key Benefits - -1. **Simplicity**: No complicated configurations or external dependencies - LocalStorage is already built into the browser. -2. **Fast for small Datasets**: Writing and Reading small sets of data from localStorage is really fast as shown in [these benchmarks](./articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.md#performance-comparison). -4. **Ease of Setup**: Just import the plugin, import it, and pass `getRxStorageLocalstorage()` into `createRxDatabase()`. That’s it! - -## Limitations - -While LocalStorage is the easiest way to get started, it does come with some constraints: - -1. **Limited Storage Capacity**: Browsers often limit LocalStorage to around [5 MB per domain](./articles/localstorage.md#understanding-the-limitations-of-local-storage), though exact limits vary. -2. **Synchronous Access**: LocalStorage operations block the main thread. This is usually fine for small amounts of data but can cause performance bottlenecks with heavier use. - -Despite these limitations, LocalStorage remains a great default option for smaller projects, prototypes, or cases where you need the absolute simplest way to persist data in the browser. - -## How to use the LocalStorage RxStorage with RxDB - - - -### Import the Storage -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -``` - -### Create a Database -```ts -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageLocalstorage() -}); -``` - -### Add a Collection - -```ts -await db.addCollections({ - tasks: { - schema: { - title: 'tasks schema', - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { type: 'string' }, - title: { type: 'string' }, - done: { type: 'boolean' } - }, - required: ['id', 'title', 'done'] - } - } -}); -``` - -### Insert a document - -```ts -await db.tasks.insert({ id: 'task-01', title: 'Get started with RxDB' }); -``` - -### Query documents -```ts -const nonDoneTasks = await db.tasks.find({ - selector: { - done: { - $eq: false - } - } -}).exec(); -``` - - - -## Mocking the LocalStorage API for testing in Node.js - -While the `localStorage` API only exists in browsers, your can the LocalStorage based storage in Node.js by using the mock that comes with RxDB. -This is intended to be used in unit tests or other test suites: - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { - getRxStorageLocalstorage, - getLocalStorageMock -} from 'rxdb/plugins/storage-localstorage'; - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageLocalstorage({ - localStorage: getLocalStorageMock() - }) -}); - -``` - ---- - -## Blazing-Fast Memory Mapped RxStorage - -# Memory Mapped RxStorage - -The memory mapped [RxStorage](./rx-storage.md) is a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance is kept persistent with a given underlying storage. - -## Pros - -- Improves read/write performance because these operations run against the in-memory storage. -- Decreases initial page load because it load all data in a single bulk request. It even detects if the database is used for the first time and then it does not have to await the creation of the persistent storage. -- Can store encrypted data on disc while still being able to run queries on the non-encrypted in-memory state. - -## Cons - -- It does not support attachments because storing big attachments data in-memory should not be done. -- When the JavaScript process is killed ungracefully like when the browser crashes or the power of the PC is terminated, it might happen that some memory writes are not persisted to the parent storage. This can be prevented with the `awaitWritePersistence` flag. -- The memory-mapped storage can only be used if all data fits into the memory of the JavaScript process. This is normally not a problem because a browser has much memory these days and plain JSON document data is not that big. -- Because it has to await an initial data loading from the parent storage into the memory, initial page load time can increase when much data is already stored. This is likely not a problem when you store less than `10k` documents. -- The `memory-mapped` storage is part of [RxDB Premium 👑](/premium/). It is not part of the default RxDB core module. - -## Using the Memory-Mapped RxStorage - -```ts - -import { - getRxStorageIndexedDB -} from 'rxdb-premium/plugins/storage-indexeddb'; -import { - getMemoryMappedRxStorage -} from 'rxdb-premium/plugins/storage-memory-mapped'; - -/** - * Here we use the IndexedDB RxStorage as persistence storage. - * Any other RxStorage can also be used. - */ -const parentStorage = getRxStorageIndexedDB(); - -// wrap the persistent storage with the memory-mapped storage. -const storage = getMemoryMappedRxStorage({ - storage: parentStorage -}); - -// create the RxDatabase like you would do with any other RxStorage -const db = await createRxDatabase({ - name: 'myDatabase, - storage, -}); -/** ... **/ -``` - -## Multi-Tab Support - -By how the memory-mapped storage works, it is not possible to have the same storage open in multiple JavaScript processes. So when you use this in a browser application, you can not open multiple databases when the app is used in multiple browser tabs. -To solve this, use the [SharedWorker Plugin](./rx-storage-shared-worker.md) so that the memory-mapped storage runs inside of a SharedWorker exactly once and is then reused for all browser tabs. - -If you have a single JavaScript process, like in a React Native app, you do not have to care about this and can just use the memory-mapped storage in the main process. - -## Encryption of the persistent data - -Normally RxDB is not capable of running queries on encrypted fields. But when you use the memory-mapped RxStorage, you can store the document data encrypted on disc, while being able to run queries on the not encrypted in-memory state. Make sure you use the encryption storage wrapper around the persistent storage, **NOT** around the memory-mapped storage as a whole. - -```ts - -import { - getRxStorageIndexedDB -} from 'rxdb-premium/plugins/storage-indexeddb'; -import { - getMemoryMappedRxStorage -} from 'rxdb-premium/plugins/storage-memory-mapped'; -import { wrappedKeyEncryptionWebCryptoStorage } from 'rxdb-premium/plugins/encryption-web-crypto'; - -const storage = getMemoryMappedRxStorage({ - storage: wrappedKeyEncryptionWebCryptoStorage({ - storage: getRxStorageIndexedDB() - }) -}); - -const db = await createRxDatabase({ - name: 'myDatabase, - storage, -}); -/** ... **/ -``` - -## Await Write Persistence -Running operations on the memory-mapped storage by default returns directly when the operation has run on the in-memory state and then persist changes in the background. -Sometimes you might want to ensure write operations is persisted, you can do this by setting `awaitWritePersistence: true`. - -```ts -const storage = getMemoryMappedRxStorage({ - awaitWritePersistence: true, - storage: getRxStorageIndexedDB() -}); -``` - -## Block Size Limit - -During cleanup, the memory-mapped storage will merge many small write-blocks into single big blocks for better initial load performance. -The `blockSizeLimit` defines the maximum of how many documents get stored in a single block. The default is `10000`. - -```ts -const storage = getMemoryMappedRxStorage({ - blockSizeLimit: 1000, - storage: getRxStorageIndexedDB() -}); -``` - ---- - -## Instant Performance with Memory Synced RxStorage - -# Memory Synced RxStorage - -The memory synced [RxStorage](./rx-storage.md) is a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance is replicated with the underlying storage for persistence. -The main reason to use this is to improve initial page load and query/write times. This is mostly useful in browser based applications. - -## Pros - -- Improves read/write performance because these operations run against the in-memory storage. -- Decreases initial page load because it load all data in a single bulk request. It even detects if the database is used for the first time and then it does not have to await the creation of the persistent storage. - -## Cons - -- It does not support attachments. -- When the JavaScript process is killed ungracefully like when the browser crashes or the power of the PC is terminated, it might happen that some memory writes are not persisted to the parent storage. This can be prevented with the `awaitWritePersistence` flag. -- This can only be used if all data fits into the memory of the JavaScript process. This is normally not a problem because a browser has much memory these days and plain json document data is not that big. -- Because it has to await an initial replication from the parent storage into the memory, initial page load time can increase when much data is already stored. This is likely not a problem when you store less than `10k` documents. -- The memory-synced storage itself does not support replication and migration. Instead you have to replicate the underlying parent storage. -- The `memory-synced` plugin is part of [RxDB Premium 👑](/premium/). It is not part of the default RxDB module. - -:::note The memory-synced RxStorage was removed in RxDB version 16 - -The `memory-synced` was removed in RxDB version 16. Instead consider using the newer and better [memory-mapped RxStorage](./rx-storage-memory-mapped.md) which has better trade-offs and is easier to configure. -::: - -## Usage - -```ts - -import { - getRxStorageIndexedDB -} from 'rxdb-premium/plugins/storage-indexeddb'; -import { - getMemorySyncedRxStorage -} from 'rxdb-premium/plugins/storage-memory-synced'; - -/** - * Here we use the IndexedDB RxStorage as persistence storage. - * Any other RxStorage can also be used. - */ -const parentStorage = getRxStorageIndexedDB(); - -// wrap the persistent storage with the memory synced one. -const storage = getMemorySyncedRxStorage({ - storage: parentStorage -}); - -// create the RxDatabase like you would do with any other RxStorage -const db = await createRxDatabase({ - name: 'myDatabase, - storage, -}); -/** ... **/ - -``` - -## Options - -Some options can be provided to fine tune the performance and behavior. - -```ts - -import { - requestIdlePromise -} from 'rxdb'; - -const storage = getMemorySyncedRxStorage({ - storage: parentStorage, - - /** - * Defines how many document - * get replicated in a single batch. - * [default=50] - * - * (optional) - */ - batchSize: 50, - - /** - * By default, the parent storage will be created without indexes for a faster page load. - * Indexes are not needed because the queries will anyway run on the memory storage. - * You can disable this behavior by setting keepIndexesOnParent to true. - * If you use the same parent storage for multiple RxDatabase instances where one is not - * a asynced-memory storage, you will get the error: 'schema not equal to existing storage' - * if you do not set keepIndexesOnParent to true. - * - * (optional) - */ - keepIndexesOnParent: true, - - /** - * If set to true, all write operations will resolve AFTER the writes - * have been persisted from the memory to the parentStorage. - * This ensures writes are not lost even if the JavaScript process exits - * between memory writes and the persistence interval. - * default=false - */ - awaitWritePersistence: true, - - /** - * After a write, await until the return value of this method resolves - * before replicating with the master storage. - * - * By returning requestIdlePromise() we can ensure that the CPU is idle - * and no other, more important operation is running. By doing so we can be sure - * that the replication does not slow down any rendering of the browser process. - * - * (optional) - */ - waitBeforePersist: () => requestIdlePromise(); -}); -``` - -## Replication and Migration with the memory-synced storage - -The memory-synced storage itself does not support replication and migration. Instead you have to replicate the underlying parent storage. -For example when you use it on top of an [IndexedDB storage](./rx-storage-indexeddb.md), you have to run replication on that storage instead by creating a different [RxDatabase](./rx-database.md). - -```js -const parentStorage = getRxStorageIndexedDB(); - -const memorySyncedStorage = getMemorySyncedRxStorage({ - storage: parentStorage, - keepIndexesOnParent: true -}); - -const databaseName = 'mydata'; - -/** - * Create a parent database with the same name+collections - * and use it for replication and migration. - * The parent database must be created BEFORE the memory-synced database - * to ensure migration has already been run. - */ -const parentDatabase = await createRxDatabase({ - name: databaseName, - storage: parentStorage -}); -await parentDatabase.addCollections(/* ... */); - -replicateRxCollection({ - collection: parentDatabase.myCollection, - /* ... */ -}); - -/** - * Create an equal memory-synced database with the same name+collections - * and use it for writes and queries. - */ -const memoryDatabase = await createRxDatabase({ - name: databaseName, - storage: memorySyncedStorage -}); -await memoryDatabase.addCollections(/* ... */); -``` - ---- - -## Lightning-Fast Memory Storage for RxDB - -# Memory RxStorage - - - -The Memory `RxStorage` is based on plain in memory arrays and objects. It can be used in all environments and is made for performance. -Use this storage when you need a really fast database like in your unit tests or when you use RxDB with server side rendering. - -### Pros - -- Really fast. Uses binary search on all operations. -- Small build size - -### Cons - -- No persistence - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageMemory -} from 'rxdb/plugins/storage-memory'; - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageMemory() -}); -``` - ---- - -## Unlock MongoDB Power with RxDB - -import {Steps} from '@site/src/components/steps'; - -# MongoDB RxStorage - -RxDB MongoDB RxStorage is an RxDB [RxStorage](./rx-storage.md) that allows you to use [MongoDB](https://www.mongodb.com/) as the underlying storage engine for your RxDB database. With this you can take advantage of MongoDB's features and scalability while benefiting from RxDB's real-time data synchronization capabilities. - - - -The storage is made to work with any plain MongoDB Server, [MongoDB Replica Set](https://www.mongodb.com/docs/manual/tutorial/deploy-replica-set/), [Sharded MongoDB Cluster](https://www.mongodb.com/docs/manual/sharding/) or [Atlas Cloud Database](https://www.mongodb.com/atlas/database). - -## Limitations of the MongoDB RxStorage -- Multiple Node.js servers using the same MongoDB database is currently not supported -- [RxAttachments](./rx-attachment.md) are currently not supported -- Doing non-RxDB writes on the MongoDB database is not supported. RxDB expects all writes to come from RxDB which update the required metadata. Doing non-RxDB writes can confuse the RxDatabase and lead to undefined behavior. But you can perform read-queries on the MongoDB storage from the outside at any time. - -## Using the MongoDB RxStorage - - - -### Install the mongodb package - -```bash -npm install mongodb --save -``` - -### Setups the MongoDB RxStorage - -To use the storage, you simply import the `getRxStorageMongoDB` method and use that when creating the [RxDatabase](./rx-database.md). The `connection` parameter contains the [MongoDB connection string](https://www.mongodb.com/docs/manual/reference/connection-string/). - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageMongoDB -} from 'rxdb/plugins/storage-mongodb'; - -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageMongoDB({ - /** - * MongoDB connection string - * @link https://www.mongodb.com/docs/manual/reference/connection-string/ - */ - connection: 'mongodb://localhost:27017,localhost:27018,localhost:27019' - }) -}); -``` - - - ---- - -## Supercharged OPFS Database with RxDB - -# Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage - -With the [RxDB](https://rxdb.info/) OPFS storage you can build a fully featured database on top of the [Origin Private File System](https://web.dev/opfs) (OPFS) browser API. Compared to other storage solutions, it has a way better performance. - -## What is OPFS - -The **Origin Private File System (OPFS)** is a native browser storage API that allows web applications to manage files in a private, sandboxed, **origin-specific virtual filesystem**. Unlike [IndexedDB](./rx-storage-indexeddb.md) and [LocalStorage](./articles/localstorage.md), which are optimized as object/key-value storage, OPFS provides more granular control for file operations, enabling byte-by-byte access, file streaming, and even low-level manipulations. -OPFS is ideal for applications requiring **high-performance** file operations (**3x-4x faster compared to IndexedDB**) inside of a client-side application, offering advantages like improved speed, more efficient use of resources, and enhanced security and privacy features. - -### OPFS limitations - -From the beginning of 2023, the Origin Private File System API is supported by [all modern browsers](https://caniuse.com/native-filesystem-api) like Safari, Chrome, Edge and Firefox. Only Internet Explorer is not supported and likely will never get support. - -It is important to know that the most performant synchronous methods like [`read()`](https://developer.mozilla.org/en-US/docs/Web/API/FileSystemSyncAccessHandle/read) and [`write()`](https://developer.mozilla.org/en-US/docs/Web/API/FileSystemSyncAccessHandle/write) of the OPFS API are **only available inside of a [WebWorker](./rx-storage-worker.md)**. -They cannot be used in the main thread, an iFrame or even a [SharedWorker](./rx-storage-shared-worker.md). -The OPFS [`createSyncAccessHandle()`](https://developer.mozilla.org/en-US/docs/Web/API/FileSystemFileHandle/createSyncAccessHandle) method that gives you access to the synchronous methods is not exposed in the main thread, only in a Worker. - -While there is no concrete **data size limit** defined by the API, browsers will refuse to store more [data at some point](./articles/indexeddb-max-storage-limit.md). -If no more data can be written, a `QuotaExceededError` is thrown which should be handled by the application, like showing an error message to the user. - -## How the OPFS API works - -The OPFS API is pretty straightforward to use. First you get the root filesystem. Then you can create files and directories on that. Notice that whenever you _synchronously_ write to, or read from a file, an `ArrayBuffer` must be used that contains the data. It is not possible to synchronously write plain strings or objects into the file. Therefore the `TextEncoder` and `TextDecoder` API must be used. - -Also notice that some of the methods of `FileSystemSyncAccessHandle` [have been asynchronous](https://developer.chrome.com/blog/sync-methods-for-accesshandles) in the past, but are synchronous since Chromium 108. To make it less confusing, we just use `await` in front of them, so it will work in both cases. - -```ts -// Access the root directory of the origin's private file system. -const root = await navigator.storage.getDirectory(); - -// Create a subdirectory. -const diaryDirectory = await root.getDirectoryHandle('subfolder', { - create: true, -}); - -// Create a new file named 'example.txt'. -const fileHandle = await diaryDirectory.getFileHandle('example.txt', { - create: true, -}); - -// Create a FileSystemSyncAccessHandle on the file. -const accessHandle = await fileHandle.createSyncAccessHandle(); - -// Write a sentence to the file. -let writeBuffer = new TextEncoder().encode('Hello from RxDB'); -const writeSize = accessHandle.write(writeBuffer); - -// Read file and transform data to string. -const readBuffer = new Uint8Array(writeSize); -const readSize = accessHandle.read(readBuffer, { at: 0 }); -const contentAsString = new TextDecoder().decode(readBuffer); - -// Write an exclamation mark to the end of the file. -writeBuffer = new TextEncoder().encode('!'); -accessHandle.write(writeBuffer, { at: readSize }); - -// Truncate file to 10 bytes. -await accessHandle.truncate(10); - -// Get the new size of the file. -const fileSize = await accessHandle.getSize(); - -// Persist changes to disk. -await accessHandle.flush(); - -// Always close FileSystemSyncAccessHandle if done, so others can open the file again. -await accessHandle.close(); -``` - -A more detailed description of the OPFS API can be found [on MDN](https://developer.mozilla.org/en-US/docs/Web/API/File_System_API/Origin_private_file_system). - -## OPFS performance - -Because the Origin Private File System API provides low-level access to binary files, it is much faster compared to [IndexedDB](./slow-indexeddb.md) or [localStorage](./articles/localstorage.md). According to the [storage performance test](https://pubkey.github.io/client-side-databases/database-comparison/index.html), OPFS is up to 2x times faster on plain inserts when a new file is created on each write. Reads are even faster. - -A good comparison about real world scenarios, are the [performance results](./rx-storage-performance.md) of the various RxDB storages. Here it shows that reads are up to 4x faster compared to IndexedDB, even with complex queries: - - - -## Using OPFS as RxStorage in RxDB - -The OPFS [RxStorage](./rx-storage.md) itself must run inside a WebWorker. Therefore we use the [Worker RxStorage](./rx-storage-worker.md) and let it point to the prebuild `opfs.worker.js` file that comes shipped with RxDB Premium 👑. - -Notice that the OPFS RxStorage is part of the [RxDB Premium 👑](/premium/) plugin that must be purchased. - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker'; - -const database = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageWorker( - { - /** - * This file must be statically served from a webserver. - * You might want to first copy it somewhere outside of - * your node_modules folder. - */ - workerInput: 'node_modules/rxdb-premium/dist/workers/opfs.worker.js' - } - ) -}); -``` - -## Using OPFS in the main thread instead of a worker - -The `createSyncAccessHandle` method from the Filesystem API is only available inside of a Webworker. Therefore you cannot use `getRxStorageOPFS()` in the main thread. But there is a slightly slower way to access the virtual filesystem from the main thread. RxDB support the `getRxStorageOPFSMainThread()` for that. Notice that this uses the [createWritable](https://developer.mozilla.org/en-US/docs/Web/API/FileSystemFileHandle/createWritable) function which is not supported in safari. - -Using OPFS from the main thread can have benefits because not having to cross the worker bridge can reduce latence in reads and writes. - -```ts -import { createRxDatabase } from 'rxdb'; -import { getRxStorageOPFSMainThread } from 'rxdb-premium/plugins/storage-opfs'; - -const database = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageOPFSMainThread() -}); -``` - -## Building a custom `worker.js` - -When you want to run additional plugins like storage wrappers or replication **inside** of the worker, you have to build your own `worker.js` file. You can do that similar to other workers by calling `exposeWorkerRxStorage` like described in the [worker storage plugin](./rx-storage-worker.md). - -```ts -// inside of the worker.js file -import { getRxStorageOPFS } from 'rxdb-premium/plugins/storage-opfs'; -import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; - -const storage = getRxStorageOPFS(); -exposeWorkerRxStorage({ - storage -}); -``` - -## Setting `usesRxDatabaseInWorker` when a RxDatabase is also used inside of the worker - -When you use the OPFS inside of a worker, it will internally use strings to represent operation results. This has the benefit that transferring strings from the worker to the main thread, is way faster compared to complex json objects. The `getRxStorageWorker()` will automatically decode these strings on the main thread so that the data can be used by the RxDatabase. - -But using a RxDatabase **inside** of your worker can make sense for example when you want to move the [replication](./replication.md) with a server. To enable this, you have to set `usesRxDatabaseInWorker` to `true`: - -```ts -// inside of the worker.js file -import { getRxStorageOPFS } from 'rxdb-premium/plugins/storage-opfs'; -const storage = getRxStorageOPFS({ - usesRxDatabaseInWorker: true -}); -``` - -If you forget to set this and still create and use a [RxDatabase](./rx-database.md) inside of the worker, you might get the error message` or `Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'length')`. - -## OPFS in Electron, React-Native or Capacitor.js - -Origin Private File System is a browser API that is only accessible in browsers. Other JavaScript like React-Native or Node.js, do not support it. - -**Electron** has two JavaScript contexts: the browser (chromium) context and the Node.js context. While you could use the OPFS API in the browser context, it is not recommended. Instead you should use the Filesystem API of Node.js and then only transfer the relevant data with the [ipcRenderer](https://www.electronjs.org/de/docs/latest/api/ipc-renderer). With RxDB that is pretty easy to configure: -- In the `main.js`, expose the [Node Filesystem](./rx-storage-filesystem-node.md) storage with the `exposeIpcMainRxStorage()` that comes with the [electron plugin](./electron.md) -- In the browser context, access the main storage with the `getRxStorageIpcRenderer()` method. - -**React Native** (and Expo) does not have an OPFS API. You could use the ReactNative Filesystem to directly write data. But to get a fully featured database like RxDB it is easier to use the [SQLite RxStorage](./rx-storage-sqlite.md) which starts an SQLite database inside of the ReactNative app and uses that to do the database operations. - -**Capacitor.js** is able to access the OPFS API. - -## Difference between `File System Access API` and `Origin Private File System (OPFS)` - -Often developers are confused with the differences between the `File System Access API` and the `Origin Private File System (OPFS)`. - -- The `File System Access API` provides access to the files on the device file system, like the ones shown in the file explorer of the operating system. To use the File System API, the user has to actively select the files from a filepicker. -- `Origin Private File System (OPFS)` is a sub-part of the `File System Standard` and it only describes the things you can do with the filesystem root from `navigator.storage.getDirectory()`. OPFS writes to a **sandboxed** filesystem, not visible to the user. Therefore the user does not have to actively select or allow the data access. - -## Learn more about OPFS: - -- [WebKit: The File System API with Origin Private File System](https://webkit.org/blog/12257/the-file-system-access-api-with-origin-private-file-system/) -- [Browser Support](https://caniuse.com/native-filesystem-api) -- [Performance Test Tool](https://pubkey.github.io/client-side-databases/database-comparison/index.html) - ---- - -## 📈 Discover RxDB Storage Benchmarks - -## RxStorage Performance comparison - -A big difference in the RxStorage implementations is the **performance**. In difference to a server side database, RxDB is bound to the limits of the JavaScript runtime and depending on the runtime, there are different possibilities to store and fetch data. For example in the browser it is only possible to store data in a [slow IndexedDB](./slow-indexeddb.md) or OPFS instead of a filesystem while on React-Native you can use the [SQLite storage](./rx-storage-sqlite.md). - -Therefore the performance can be completely different depending on where you use RxDB and what you do with it. Here you can see some performance measurements and descriptions on how the different [storages](./rx-storage.md) work and how their performance is different. - -## Persistent vs Semi-Persistent storages - -The "normal" storages are always persistent. This means each RxDB write is directly written to disc and all queries run on the disc state. This means a good startup performance because nothing has to be done on startup. - -In contrast, semi-persistent storages like [memory mapped](./rx-storage-memory-mapped.md) store all data in memory on startup and only save to disc occasionally (or on exit). Therefore it has a very fast read/write performance, but loading all data into memory on the first page load can take longer for big amounts of documents. Also these storages can only be used when all data fits into the memory at least once. In general it is recommended to stay on the persistent storages and only use semi-persistent ones, when you know for sure that the dataset will stay small (less than 2k documents). - -## Performance comparison - -In the following you can find some performance measurements and comparisons. Notice that these are only a small set of possible RxDB operations. If performance is really relevant for your use case, you should do your own measurements with usage-patterns that are equal to how you use RxDB in production. - -### Measurements - -Here the following metrics are measured: - -- time-to-first-insert: Many storages run lazy, so it makes no sense to compare the time which is required to create a database with collections. Instead we measure the **time-to-first-insert** which is the whole timespan from database creation until the first single document write is done. -- insert documents (bulk): Insert 500 documents with a single bulk-insert operation. -- find documents by id (bulk): Here we fetch 100% of the stored documents with a single `findByIds()` call. -- insert documents (serial): Insert 50 documents, one after each other. -- find documents by id (serial): Here we find 50 documents in serial with one `findByIds()` call per document. -- find documents by query: Here we fetch 100% of the stored documents with a single `find()` call. -- find documents by query: Here we fetch all of the stored documents with a 4 `find()` calls that run in parallel. Each fetching 25% of the documents. -- count documents: Counts 100% of the stored documents with a single `count()` call. Here we measure 4 runs at once to have a higher number that is easier to compare. - -## Browser based Storages Performance Comparison - -The performance patterns of the browser based storages are very diverse. The [IndexedDB storage](./rx-storage-indexeddb.md) is recommended for mostly all use cases so you should start with that one. Later you can do performance testings and switch to another storage like [OPFS](./rx-storage-opfs.md) or [memory-mapped](./rx-storage-memory-mapped.md). - - - -## Node/Native based Storages Performance Comparison - -For most client-side native applications ([react-native](./react-native-database.md), [electron](./electron-database.md), [capacitor](./capacitor-database.md)), using the [SQLite RxStorage](./rx-storage-sqlite.md) is recommended. For non-client side applications like a server, use the [MongoDB storage](./rx-storage-mongodb.md) instead. - ---- - -## PouchDB RxStorage - Migrate for Better Performance - -# RxStorage PouchDB - -The PouchDB RxStorage is based on the [PouchDB](https://github.com/pouchdb/pouchdb) database. It is the most battle proven RxStorage and has a big ecosystem of adapters. PouchDB does a lot of overhead to enable CouchDB replication which makes the PouchDB RxStorage one of the slowest. - -:::warning -The PouchDB RxStorage is removed from RxDB and can no longer be used in new projects. You should switch to a different [RxStorage](./rx-storage.md). -::: - -## Why is the PouchDB RxStorage deprecated? -When I started developing RxDB in 2016, I had a specific use case to solve. -Because there was no client-side database out there that fitted, I created -RxDB as a wrapper around PouchDB. This worked great and all the PouchDB features -like the query engine, the adapter system, CouchDB-replication and so on, came for free. -But over the years, it became clear that PouchDB is not suitable for many applications, -mostly because of its performance: To be compliant to CouchDB, PouchDB has to store all -revision trees of documents which slows down queries. Also purging these document revisions [is not possible](https://github.com/pouchdb/pouchdb/issues/802) -so the database storage size will only increase over time. -Another problem was that many issues in PouchDB have never been fixed, but only closed by the issue-bot like [this one](https://github.com/pouchdb/pouchdb/issues/6454). The whole PouchDB RxStorage code was full of [workarounds and monkey patches](https://github.com/pubkey/rxdb/blob/285c3cf6008b3cc83bd9b9946118a621434f0cff/src/plugins/pouchdb/pouch-statics.ts#L181) to resolve -these issues for RxDB users. Many these patches decreased performance even further. Sometimes it was not possible to fix things from the outside, for example queries with `$gt` operators return [the wrong documents](https://github.com/pouchdb/pouchdb/pull/8471) which is a no-go for a production database -and hard to debug. - -In version [10.0.0](./releases/10.0.0.md) RxDB introduced the [RxStorage](./rx-storage.md) layer which -allows users to swap out the underlying storage engine where RxDB stores and queries documents from. -This allowed to use alternatives from PouchDB, for example the [IndexedDB RxStorage](./rx-storage-indexeddb.md) in browsers -or even the [FoundationDB RxStorage](./rx-storage-foundationdb.md) on the server side. -There where not many use cases left where it was a good choice to use the PouchDB RxStorage. Only replicating with a -CouchDB server, was only possible with PouchDB. But this has also changed. RxDB has [a plugin](./replication-couchdb.md) that allows -to replicate clients with any CouchDB server by using the [RxDB Sync Engine](./replication.md). This plugins work with any RxStorage so that it is not necessary to use the PouchDB storage. -Removing PouchDB allows RxDB to add many awaited features like filtered change streams for easier replication and permission handling. It will also free up development time. - -If you are currently using the PouchDB RxStorage, you have these options: - -- Migrate to another [RxStorage](./rx-storage.md) (recommended) -- Never update RxDB to the next major version (stay on older 14.0.0) -- Fork the [PouchDB RxStorage](./rx-storage-pouchdb.md) and maintain the plugin by yourself. -- Fix all the [PouchDB problems](https://github.com/pouchdb/pouchdb/issues?q=author%3Apubkey) so that we can add PouchDB to the RxDB Core again. - -## Pros - - Most battle proven RxStorage - - Supports replication with a CouchDB endpoint - - Support storing [attachments](./rx-attachment.md) - - Big ecosystem of adapters - -## Cons - - Big bundle size - - Slow performance because of revision handling overhead - -## Usage - -```ts -import { createRxDatabase } from 'rxdb'; -import { getRxStoragePouch, addPouchPlugin } from 'rxdb/plugins/pouchdb'; - -addPouchPlugin(require('pouchdb-adapter-idb')); - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStoragePouch( - 'idb', - { - /** - * other pouchdb specific options - * @link https://pouchdb.com/api.html#create_database - */ - } - ) -}); -``` - -## Polyfill the `global` variable - -When you use RxDB with **angular** or other **webpack** based frameworks, you might get the error: -```html -Uncaught ReferenceError: global is not defined -``` -This is because pouchdb assumes a nodejs-specific `global` variable that is not added to browser runtimes by some bundlers. -You have to add them by your own, like we do [here](https://github.com/pubkey/rxdb/blob/master/examples/angular/src/polyfills.ts). - -```ts -(window as any).global = window; -(window as any).process = { - env: { DEBUG: undefined }, -}; -``` - -## Adapters - -[PouchDB has many adapters for all JavaScript runtimes](./adapters.md). - -## Using the internal PouchDB Database - -For custom operations, you can access the internal PouchDB database. -This is dangerous because you might do changes that are not compatible with RxDB. -Only use this when there is no way to achieve your goals via the RxDB API. - -```javascript -import { - getPouchDBOfRxCollection -} from 'rxdb/plugins/pouchdb'; - -const pouch = getPouchDBOfRxCollection(myRxCollection); -``` - ---- - -## Remote RxStorage - - -The Remote [RxStorage](./rx-storage.md) is made to use a remote storage and communicate with it over an asynchronous message channel. -The remote part could be on another JavaScript process or even on a different host machine. -The remote storage plugin is used in many RxDB plugins like the [worker](./rx-storage-worker.md) or the [electron](./electron.md) plugin. - -## Usage - -The remote storage communicates over a message channel which has to implement the `messageChannelCreator` function which returns an object that has a `messages$` observable and a `send()` function on both sides and a `close()` function that closes the RemoteMessageChannel. - -```ts -// on the client -import { getRxStorageRemote } from 'rxdb/plugins/storage-remote'; -const storage = getRxStorageRemote({ - identifier: 'my-id', - mode: 'storage', - messageChannelCreator: () => Promise.resolve({ - messages$: new Subject(), - send(msg) { - // send to remote storage - } - }) -}); -const myDb = await createRxDatabase({ - storage -}); - -// on the remote -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -import { exposeRxStorageRemote } from 'rxdb/plugins/storage-remote'; -exposeRxStorageRemote({ - storage: getRxStorageLocalstorage(), - messages$: new Subject(), - send(msg){ - // send to other side - } -}); -``` - -## Usage with a Websocket server - -The remote storage plugin contains helper functions to create a remote storage over a WebSocket server. -This is often used in Node.js to give one microservice access to another services database **without** having to replicate the full database state. - -```ts -// server.js -import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; -import { startRxStorageRemoteWebsocketServer } from 'rxdb/plugins/storage-remote-websocket'; - -// either you can create the server based on a RxDatabase -const serverBasedOnDatabase = await startRxStorageRemoteWebsocketServer({ - port: 8080, - database: myRxDatabase -}); - -// or you can create the server based on a pure RxStorage -const serverBasedOn = await startRxStorageRemoteWebsocketServer({ - port: 8080, - storage: getRxStorageMemory() -}); -``` - -```ts -// client.js - -import { getRxStorageRemoteWebsocket } from 'rxdb/plugins/storage-remote-websocket'; -const myDb = await createRxDatabase({ - storage: getRxStorageRemoteWebsocket({ - url: 'ws://example.com:8080' - }) -}); -``` - -## Sending custom messages - -The remote storage can also be used to send custom messages to and from the remote instance. - -One the remote you have to define a `customRequestHandler` like: - -```ts -const serverBasedOnDatabase = await startRxStorageRemoteWebsocketServer({ - port: 8080, - database: myRxDatabase, - async customRequestHandler(msg){ - // here you can return any JSON object as an 'answer' - return { - foo: 'bar' - }; - } -}); -``` - -On the client instance you can then call the `customRequest()` method: - -```ts -const storage = getRxStorageRemoteWebsocket({ - url: 'ws://example.com:8080' -}); -const answer = await storage.customRequest({ bar: 'foo' }); -console.dir(answer); // > { foo: 'bar' } -``` - ---- - -## Sharding RxStorage 👑 - -# Sharding RxStorage - -With the sharding plugin, you can improve the write and query times of **some** `RxStorage` implementations. -For example on [slow IndexedDB](./slow-indexeddb.md), a performance gain of **30-50% on reads**, and **25% on writes** can be achieved by using multiple IndexedDB Stores instead of putting all documents into the same store. - -The sharding plugin works as a wrapper around any other `RxStorage`. The sharding plugin will automatically create multiple shards per storage instance and it will merge and split read and write calls to it. - -:::note Premium -The sharding plugin is part of [RxDB Premium 👑](/premium/). It is not part of the default RxDB module. -::: - -## Using the sharding plugin - -```ts -import { - getRxStorageSharding -} from 'rxdb-premium/plugins/storage-sharding'; - -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -/** - * First wrap the original RxStorage with the sharding RxStorage. - */ -const shardedRxStorage = getRxStorageSharding({ - - /** - * Here we use the localStorage RxStorage, - * it is also possible to use any other RxStorage instead. - */ - storage: getRxStorageLocalstorage() -}); - -/** - * Add the sharding options to your schema. - * Changing these options will require a data migration. - */ -const mySchema = { - /* ... */ - sharding: { - /** - * Amount of shards per RxStorage instance. - * Depending on your data size and query patterns, the optimal shard amount may differ. - * Do a performance test to optimize that value. - * 10 Shards is a good value to start with. - * - * IMPORTANT: Changing the value of shards is not possible on a already existing database state, - * you will loose access to your data. - */ - shards: 10, - /** - * Sharding mode, - * you can either shard by collection or by database. - * For most cases you should use 'collection' which will shard on the collection level. - * For example with the IndexedDB RxStorage, it will then create multiple stores per IndexedDB database - * and not multiple IndexedDB databases, which would be slower. - */ - mode: 'collection' - } - /* ... */ -} - -/** - * Create the RxDatabase with the wrapped RxStorage. - */ -const database = await createRxDatabase({ - name: 'mydatabase', - storage: shardedRxStorage -}); - -``` - ---- - -## Boost Performance with SharedWorker RxStorage - -# SharedWorker RxStorage - -The SharedWorker [RxStorage](./rx-storage.md) uses the [SharedWorker API](https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker) to run the storage inside of a separate JavaScript process **in browsers**. Compared to a normal [WebWorker](./rx-storage-worker.md), the SharedWorker is created exactly once, even when there are multiple browser tabs opened. Because of having exactly one worker, multiple performance optimizations can be done because the storage itself does not have to handle multiple opened database connections. - -:::note Premium -This plugin is part of [RxDB Premium 👑](/premium/). It is not part of the default RxDB module. -::: - -## Usage - -### On the SharedWorker process - -In the worker process JavaScript file, you have wrap the original RxStorage with `getRxStorageIndexedDB()`. - -```ts -// shared-worker.ts - -import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; -import { - getRxStorageIndexedDB -} from 'rxdb-premium/plugins/indexeddb'; - -exposeWorkerRxStorage({ - /** - * You can wrap any implementation of the RxStorage interface - * into a worker. - * Here we use the IndexedDB RxStorage. - */ - storage: getRxStorageIndexedDB() -}); -``` - -### On the main process - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { getRxStorageSharedWorker } from 'rxdb-premium/plugins/storage-worker'; -import { getRxStorageIndexedDB } from 'rxdb/plugins/storage-indexeddb'; - -const database = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageSharedWorker( - { - /** - * Contains any value that can be used as parameter - * to the SharedWorker constructor of thread.js - * Most likely you want to put the path to the shared-worker.js file in here. - * - * @link https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker?retiredLocale=de - */ - workerInput: 'path/to/shared-worker.js', - /** - * (Optional) options - * for the worker. - */ - workerOptions: { - type: 'module', - credentials: 'omit' - } - } - ) -}); -``` - -## Pre-build workers - -The `shared-worker.js` must be a self containing JavaScript file that contains all dependencies in a bundle. -To make it easier for you, RxDB ships with pre-bundles worker files that are ready to use. -You can find them in the folder `node_modules/rxdb-premium/dist/workers` after you have installed the [RxDB Premium 👑 Plugin](/premium/). From there you can copy them to a location where it can be served from the webserver and then use their path to create the `RxDatabase` - -Any valid `worker.js` JavaScript file can be used both, for normal Workers and SharedWorkers. - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { getRxStorageSharedWorker } from 'rxdb-premium/plugins/storage-worker'; -const database = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageSharedWorker( - { - /** - * Path to where the copied file from node_modules/rxdb-premium/dist/workers - * is reachable from the webserver. - */ - workerInput: '/indexeddb.shared-worker.js' - } - ) -}); -``` - -## Building a custom worker - -To build a custom `worker.js` file, check out the webpack config at the [worker](./rx-storage-worker.md#building-a-custom-worker) documentation. Any worker file form the worker storage can also be used in a shared worker because `exposeWorkerRxStorage` detects where it runs and exposes the correct messaging endpoints. - -## Passing in a SharedWorker instance - -Instead of setting an url as `workerInput`, you can also specify a function that returns a new `SharedWorker` instance when called. This is mostly used when you have a custom worker file and dynamically import it. -This works equal to the [workerInput of the Worker Storage](./rx-storage-worker.md#passing-in-a-worker-instance) - -## Set multiInstance: false - -When you know that you only ever create your RxDatabase inside of the shared worker, you might want to set `multiInstance: false` to prevent sending change events across JavaScript realms and to improve performance. Do not set this when you also create the same storage on another realm, like when you have the same RxDatabase once inside the shared worker and once on the main thread. - -## Replication with SharedWorker - -When a SharedWorker RxStorage is used, it is recommended to run the replication **inside** of the worker. This is the best option for performance. You can do that by opening another [RxDatabase](./rx-database.md) inside of it and starting the replication there. If you are not concerned about performance, you can still start replication on the main thread instead. But you should never run replication on both the main thread **and** the worker. - -```ts -// shared-worker.ts - -import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; -import { - getRxStorageIndexedDB -} from 'rxdb-premium/plugins/storage-indexeddb'; -import { - createRxDatabase, - addRxPlugin -} from 'rxdb'; -import { - RxDBReplicationGraphQLPlugin -} from 'rxdb/plugins/replication-graphql'; -addRxPlugin(RxDBReplicationGraphQLPlugin); - -const baseStorage = getRxStorageIndexedDB(); - -// first expose the RxStorage to the outside -exposeWorkerRxStorage({ - storage: baseStorage -}); - -/** - * Then create a normal RxDatabase and RxCollections - * and start the replication. - */ -const database = await createRxDatabase({ - name: 'mydatabase', - storage: baseStorage -}); -await db.addCollections({ - humans: {/* ... */} -}); -const replicationState = db.humans.syncGraphQL({/* ... */}); -``` - -### Limitations - -- The SharedWorker API is [not available in some mobile browser](https://caniuse.com/sharedworkers) - -### FAQ - -
    - Can I use this plugin with a Service Worker? - - No. A Service Worker is not the same as a Shared Worker. While you can use RxDB inside of a ServiceWorker, you cannot use the ServiceWorker as a RxStorage that gets accessed by an outside RxDatabase instance. - -
    - ---- - -## RxDB SQLite RxStorage for Hybrid Apps - -import {Steps} from '@site/src/components/steps'; -import {Tabs} from '@site/src/components/tabs'; - -# SQLite RxStorage - -This [RxStorage](./rx-storage.md) is based on [SQLite](https://www.sqlite.org/index.html) and is made to work with **Node.js**, [Electron](./electron-database.md), [React Native](./react-native-database.md) and [Capacitor](./capacitor-database.md) or SQLite via webassembly in the browser. It can be used with different so called `sqliteBasics` adapters to account for the differences in the various SQLite bundles and libraries that exist. - -SQLite is a natural fit for RxDB because most platforms - Android, iOS, Node.js, and beyond - already ship with a built-in SQLite engine, delivering robust performance and minimal setup overhead. Its proven reliability, having powered countless applications over the years, ensures a battle-tested foundation for local data. By placing RxDB on top of SQLite, you gain advanced features suited for building interactive, offline-capable UI apps: [real-time queries](./rx-query.md#observe), reactive state updates, [conflict handling](./transactions-conflicts-revisions.md), [data encryption](./encryption.md), and straightforward [schema management](./rx-schema.md). This combination offers a unified NoSQL-like experience without sacrificing the speed and broad availability that SQLite brings. - -## Performance comparison with other storages - -The SQLite storage is a bit slower compared to other Node.js based storages like the [Filesystem Storage](./rx-storage-filesystem-node.md) because wrapping SQLite has a bit of overhead and sending data from the JavaScript process to SQLite and backwards increases the latency. However for most hybrid apps the SQLite storage is the best option because it can leverage the SQLite version that comes already installed on the smartphones OS (iOS and android). Also for desktop electron apps it can be a viable solution because it is easy to ship SQLite together inside of the electron bundle. - - - -## Using the SQLite RxStorage - -There are two versions of the SQLite storage available for RxDB: - -- The **trial version** which comes directly shipped with RxDB Core. It contains an SQLite storage that allows you to try out RxDB on devices that support SQLite, like React Native or Electron. While the trial version does pass the full RxDB storage test-suite, it is not made for production. It is not using indexes, has no attachment support, is limited to store 300 documents and fetches the whole storage state to run queries in memory. **Use it for evaluation and prototypes only!** - -- The **[RxDB Premium 👑](/premium/) version** which contains the full production-ready SQLite storage. It contains a full load of performance optimizations and full query support. To use the SQLite storage you have to import `getRxStorageSQLite` from the [RxDB Premium 👑](/premium/) package and then add the correct `sqliteBasics` adapter depending on which sqlite module you want to use. This can then be used as storage when creating the [RxDatabase](./rx-database.md). In the following you can see some examples for some of the most common SQLite packages. - - - -## Trial Version -```ts -// Import the Trial SQLite Storage -import { - getRxStorageSQLiteTrial, - getSQLiteBasicsNodeNative -} from 'rxdb/plugins/storage-sqlite'; - -// Create a Storage for it, here we use the nodejs-native SQLite module -// other SQLite modules can be used with a different sqliteBasics adapter -import { DatabaseSync } from 'node:sqlite'; -const storage = getRxStorageSQLiteTrial({ - sqliteBasics: getSQLiteBasicsNodeNative(DatabaseSync) -}); - -// Create a Database with the Storage -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: storage -}); -``` - -## RxDB Premium 👑 - -```ts -// Import the SQLite Storage from the premium plugins. -import { - getRxStorageSQLite, - getSQLiteBasicsNodeNative -} from 'rxdb-premium/plugins/storage-sqlite'; - -// Create a Storage for it, here we use the nodejs-native SQLite module -// other SQLite modules can be used with a different sqliteBasics adapter -import { DatabaseSync } from 'node:sqlite'; -const storage = getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsNodeNative(DatabaseSync) -}); - -// Create a Database with the Storage -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: storage -}); -``` - - - -In the following, all examples are shown with the premium SQLite storage. Still they work the same with the trial version. - -## SQLiteBasics - -Different SQLite libraries have different APIs to create and access the SQLite database. Therefore the library must be massaged to work with the RxDB SQlite storage. This is done in a so called `SQLiteBasics` interface. RxDB directly ships with a wide range of these for various SQLite libraries that are commonly used. Also creating your own one is pretty simple, check the source code of the existing ones for that. - -For example for the `sqlite3` npm library we have the `getSQLiteBasicsNode()` implementation. For `node:sqlite` we have the `getSQLiteBasicsNodeNative()` implementation and so on.. - -## Using the SQLite RxStorage with different SQLite libraries - -### Usage with the **sqlite3 npm package** - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageSQLite, - getSQLiteBasicsNode -} from 'rxdb-premium/plugins/storage-sqlite'; - -/** - * In Node.js, we use the SQLite database - * from the 'sqlite' npm module. - * @link https://www.npmjs.com/package/sqlite3 - */ -import sqlite3 from 'sqlite3'; - -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageSQLite({ - /** - * Different runtimes have different interfaces to SQLite. - * For example in node.js we have a callback API, - * while in capacitor sqlite we have Promises. - * So we need a helper object that is capable of doing the basic - * sqlite operations. - */ - sqliteBasics: getSQLiteBasicsNode(sqlite3) - }) -}); -``` - -### Usage with the **node:sqlite** package - -With Node.js version 22 and newer, you can use the "native" [sqlite module](https://nodejs.org/api/sqlite.html) that comes shipped with Node.js. - -```ts -import { createRxDatabase } from 'rxdb'; -import { - getRxStorageSQLite, - getSQLiteBasicsNodeNative -} from 'rxdb-premium/plugins/storage-sqlite'; -import { DatabaseSync } from 'node:sqlite'; -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsNodeNative(DatabaseSync) - }) -}); -``` - -### Usage with Webassembly in the Browser - -In the browser you can use the [wa-sqlite](https://github.com/rhashimoto/wa-sqlite) package to run sQLite in Webassembly. The wa-sqlite module also allows to use persistence with IndexedDB or OPFS. Notice that in general SQLite via Webassembly is slower compared to other storages like [IndexedDB](./rx-storage-indexeddb.md) or [OPFS](./rx-storage-opfs.md) because sending data from the main thread to wasm and backwards is slow in the browser. Have a look the [performance comparison](./rx-storage-performance.md). - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageSQLite, - getSQLiteBasicsWasm -} from 'rxdb-premium/plugins/storage-sqlite'; - -/** - * In the Browser, we use the SQLite database - * from the 'wa-sqlite' npm module. This contains the SQLite library - * compiled to Webassembly - * @link https://www.npmjs.com/package/wa-sqlite - */ -import SQLiteESMFactory from 'wa-sqlite/dist/wa-sqlite-async.mjs'; -import SQLite from 'wa-sqlite'; -const sqliteModule = await SQLiteESMFactory(); -const sqlite3 = SQLite.Factory(module); - -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsWasm(sqlite3) - }) -}); -``` - -### Usage with **React Native** - -1. Install the [react-native-quick-sqlite npm module](https://www.npmjs.com/package/react-native-quick-sqlite) -2. Import `getSQLiteBasicsQuickSQLite` from the SQLite plugin and use it to create a [RxDatabase](./rx-database.md): - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageSQLite, - getSQLiteBasicsQuickSQLite -} from 'rxdb-premium/plugins/storage-sqlite'; -import { open } from 'react-native-quick-sqlite'; - -// create database -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - multiInstance: false, // <- Set multiInstance to false when using RxDB in React Native - storage: getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsQuickSQLite(open) - }) -}); -``` - -If `react-native-quick-sqlite` does not work for you, as alternative you can use the [react-native-sqlite-2](https://www.npmjs.com/package/react-native-sqlite-2) library instead: - -```ts -import { - getRxStorageSQLite, - getSQLiteBasicsWebSQL -} from 'rxdb-premium/plugins/storage-sqlite'; -import SQLite from 'react-native-sqlite-2'; -const storage = getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsWebSQL(SQLite.openDatabase) -}); -``` - -### Usage with **Expo SQLite** - -Notice that [expo-sqlite](https://www.npmjs.com/package/expo-sqlite) cannot be used on android (but it works on iOS) if you use Expo SDK version 50 or older. Please update to Version 50 or newer to use it. - -In the latest expo SDK version, use the `getSQLiteBasicsExpoSQLiteAsync()` method: - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageSQLite, - getSQLiteBasicsExpoSQLiteAsync -} from 'rxdb-premium/plugins/storage-sqlite'; -import * as SQLite from 'expo-sqlite'; - -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - multiInstance: false, - storage: getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsExpoSQLiteAsync(SQLite.openDatabaseAsync) - }) -}); -``` - -In older Expo SDK versions, you might have to use the non-async API: - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageSQLite, - getSQLiteBasicsExpoSQLite -} from 'rxdb-premium/plugins/storage-sqlite'; -import { openDatabase } from 'expo-sqlite'; - -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - multiInstance: false, - storage: getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsExpoSQLite(openDatabase) - }) -}); -``` - -### Usage with **SQLite Capacitor** - -1. Install the [sqlite capacitor npm module](https://github.com/capacitor-community/sqlite) -2. Add the iOS database location to your capacitor config - -```json -{ - "plugins": { - "CapacitorSQLite": { - "iosDatabaseLocation": "Library/CapacitorDatabase" - } - } -} -``` - -3. Use the function `getSQLiteBasicsCapacitor` to get the capacitor sqlite wrapper. - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageSQLite, - getSQLiteBasicsCapacitor -} from 'rxdb-premium/plugins/storage-sqlite'; - -/** - * Import SQLite from the capacitor plugin. - */ -import { - CapacitorSQLite, - SQLiteConnection -} from '@capacitor-community/sqlite'; -import { Capacitor } from '@capacitor/core'; - -const sqlite = new SQLiteConnection(CapacitorSQLite); - -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageSQLite({ - /** - * Different runtimes have different interfaces to SQLite. - * For example in node.js we have a callback API, - * while in capacitor sqlite we have Promises. - * So we need a helper object that is capable of doing the basic - * sqlite operations. - */ - sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor) - }) -}); -``` - -### Usage with Tauri SQLite - -1. Add the [Tauri SQL plugin](https://tauri.app/plugin/sql/#setup) to your Tauri project. -2. Make sure to add `sqlite` as your database engine by running `cargo add tauri-plugin-sql --features sqlite` inside `src-tauri`. -3. Use the `getSQLiteBasicsTauri` function to get the Tauri SQLite wrapper. - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageSQLite, - getSQLiteBasicsTauri -} from 'rxdb/plugins/storage-sqlite'; -import sqlite3 from '@tauri-apps/plugin-sql'; - -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsTauri(sqlite3) - }) -}); -``` - -## Database Connection - -If you need to access the database connection for any reason you can use `getDatabaseConnection` to do so: - -```ts -import { getDatabaseConnection } from 'rxdb-premium/plugins/storage-sqlite' -``` - -It has the following signature: - -```ts -getDatabaseConnection( - sqliteBasics: SQLiteBasics, - databaseName: string -): Promise; -``` - -## Known Problems of SQLite in JavaScript apps - -- Some JavaScript runtimes do not contain a `Buffer` API which is used by SQLite to store binary attachments data as `BLOB`. You can set `storeAttachmentsAsBase64String: true` if you want to store the attachments data as base64 string instead. This increases the database size but makes it work even without having a `Buffer`. - -- The SQlite RxStorage works on SQLite libraries that use SQLite in version `3.38.0 (2022-02-22)` or newer, because it uses the [SQLite JSON](https://www.sqlite.org/json1.html) methods like `JSON_EXTRACT`. If you get an error like `[Error: no such function: JSON_EXTRACT (code 1 SQLITE_ERROR[1])`, you might have a too old version of SQLite. - -- To debug all SQL operations, you can pass a log function to `getRxStorageSQLite()` like this. This does not work with the trial version: -```ts -const storage = getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor), - // pass log function - log: console.log.bind(console) -}); -``` - -- By default, all tables will be created with the `WITHOUT ROWID` flag. Some tools like drizzle do not support tables with that option. You can disable it by setting `withoutRowId: false` when calling `getRxStorageSQLite()`: - -```ts -const storage = getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor), - withoutRowId: false -}); -``` - -## Related -- [React Native Databases](./react-native-database.md) - ---- - -## Turbocharge RxDB with Worker RxStorage - -# Worker RxStorage - -With the worker plugin, you can put the `RxStorage` of your database inside of a WebWorker (in browsers) or a Worker Thread (in node.js). By doing so, you can take CPU load from the main process and move it into the worker's process which can improve the perceived performance of your application. Notice that for browsers, it is recommend to use the [SharedWorker](./rx-storage-shared-worker.md) instead to get a better performance. - -:::note Premium -This plugin is part of [RxDB Premium 👑](/premium/). It is not part of the default RxDB module. -::: - -## On the worker process - -```ts -// worker.ts - -import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; - -exposeWorkerRxStorage({ - /** - * You can wrap any implementation of the RxStorage interface - * into a worker. - * Here we use the IndexedDB RxStorage. - */ - storage: getRxStorageIndexedDB() -}); -``` - -## On the main process - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker'; - -const database = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageWorker( - { - /** - * Contains any value that can be used as parameter - * to the Worker constructor of thread.js - * Most likely you want to put the path to the worker.js file in here. - * - * @link https://developer.mozilla.org/en-US/docs/Web/API/Worker/Worker - */ - workerInput: 'path/to/worker.js', - /** - * (Optional) options - * for the worker. - */ - workerOptions: { - type: 'module', - credentials: 'omit' - } - } - ) -}); -``` - -## Pre-build workers - -The `worker.js` must be a self containing JavaScript file that contains all dependencies in a bundle. -To make it easier for you, RxDB ships with pre-bundles worker files that are ready to use. -You can find them in the folder `node_modules/rxdb-premium/dist/workers` after you have installed the [RxDB Premium 👑 Plugin](/premium/). From there you can copy them to a location where it can be served from the webserver and then use their path to create the `RxDatabase`. - -Any valid `worker.js` JavaScript file can be used both, for normal Workers and SharedWorkers. - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker'; -const database = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageWorker( - { - /** - * Path to where the copied file from node_modules/rxdb/dist/workers - * is reachable from the webserver. - */ - workerInput: '/indexeddb.worker.js' - } - ) -}); -``` - -## Building a custom worker - -The easiest way to bundle a custom `worker.js` file is by using webpack. Here is the webpack-config that is also used for the prebuild workers: - -```ts -// webpack.config.js -const path = require('path'); -const TerserPlugin = require('terser-webpack-plugin'); -const projectRootPath = path.resolve( - __dirname, - '../../' // path from webpack-config to the root folder of the repo -); -const babelConfig = require(path.join(projectRootPath, 'babel.config')); -const baseDir = './dist/workers/'; // output path -module.exports = { - target: 'webworker', - entry: { - 'my-custom-worker': baseDir + 'my-custom-worker.js', - }, - output: { - filename: '[name].js', - clean: true, - path: path.resolve( - projectRootPath, - 'dist/workers' - ), - }, - mode: 'production', - module: { - rules: [ - { - test: /\.tsx?$/, - exclude: /(node_modules)/, - use: { - loader: 'babel-loader', - options: babelConfig - } - } - ], - }, - resolve: { - extensions: ['.tsx', '.ts', '.js', '.mjs', '.mts'] - }, - optimization: { - moduleIds: 'deterministic', - minimize: true, - minimizer: [new TerserPlugin({ - terserOptions: { - format: { - comments: false, - }, - }, - extractComments: false, - })], - } -}; -``` - -## One worker per database - -Each call to `getRxStorageWorker()` will create a different worker instance so that when you have more than one `RxDatabase`, each database will have its own JavaScript worker process. - -To reuse the worker instance in more than one `RxDatabase`, you can store the output of `getRxStorageWorker()` into a variable an use that one. Reusing the worker can decrease the initial page load, but you might get slower database operations. - -```ts -// Call getRxStorageWorker() exactly once -const workerStorage = getRxStorageWorker({ - workerInput: 'path/to/worker.js' -}); - -// use the same storage for both databases. -const databaseOne = await createRxDatabase({ - name: 'database-one', - storage: workerStorage -}); -const databaseTwo = await createRxDatabase({ - name: 'database-two', - storage: workerStorage -}); - -``` - -## Passing in a Worker instance - -Instead of setting an url as `workerInput`, you can also specify a function that returns a new `Worker` instance when called. - -```ts -getRxStorageWorker({ - workerInput: () => new Worker('path/to/worker.js') -}) -``` - -This can be helpful for environments where the worker is build dynamically by the bundler. For example in angular you would create a `my-custom.worker.ts` file that contains a custom build worker and then import it. - -```ts -const storage = getRxStorageWorker({ - workerInput: () => new Worker(new URL('./my-custom.worker', import.meta.url)), -}); -``` - -```ts -//> my-custom.worker.ts -import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; - -exposeWorkerRxStorage({ - storage: getRxStorageIndexedDB() -}); -``` - ---- - -## ⚙️ RxStorage Layer - Choose the Perfect RxDB Storage for Every Use Case - -# RxStorage - -RxDB is not a self contained database. Instead the data is stored in an implementation of the [RxStorage interface](https://github.com/pubkey/rxdb/blob/master/src/types/rx-storage.interface.d.ts). This allows you to **switch out** the underlying data layer, depending on the JavaScript environment and performance requirements. For example you can use the SQLite storage for a capacitor app or you can use the LocalStorage RxStorage to store data in localstorage in a browser based application. There are also storages for other JavaScript runtimes like Node.js, React-Native, NativeScript and more. - -## Quick Recommendations - -- In the Browser: Use the [LocalStorage](./rx-storage-localstorage.md) storage for simple setup and small build size. For bigger datasets, use either the [dexie.js storage](./rx-storage-dexie.md) (free) or the [IndexedDB RxStorage](./rx-storage-indexeddb.md) if you have [👑 premium access](/premium/) which is a bit faster and has a smaller build size. -- In [Electron](./electron-database.md) and [ReactNative](./react-native-database.md): Use the [SQLite RxStorage](./rx-storage-sqlite.md) if you have [👑 premium access](/premium/) or the [trial-SQLite RxStorage](./rx-storage-sqlite.md) for tryouts. -- In Capacitor: Use the [SQLite RxStorage](./rx-storage-sqlite.md) if you have [👑 premium access](/premium/), otherwise use the [localStorage](./rx-storage-localstorage.md) storage. - -## Configuration Examples - -The RxStorage layer of RxDB is very flexible. Here are some examples on how to configure more complex settings: - -### Storing much data in a browser securely - -Lets say you build a browser app that needs to store a big amount of data as secure as possible. Here we can use a combination of the storages (encryption, IndexedDB, compression, schema-checks) that increase security and reduce the stored data size. - -We use the schema-validation on the top level to ensure schema-errors are clearly readable and do not contain [encrypted](./encryption.md)/[compressed](./key-compression.md) data. The encryption is used inside of the compression because encryption of compressed data is more efficient. - -```ts -import { wrappedValidateAjvStorage } from 'rxdb/plugins/validate-ajv'; -import { wrappedKeyCompressionStorage } from 'rxdb/plugins/key-compression'; -import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; - -const myDatabase = await createRxDatabase({ - storage: wrappedValidateAjvStorage({ - storage: wrappedKeyCompressionStorage({ - storage: wrappedKeyEncryptionCryptoJsStorage({ - storage: getRxStorageIndexedDB() - }) - }) - }) -}); -``` - -### High query Load - -Also we can utilize a combination of storages to create a database that is optimized to run complex queries on the data really fast. Here we use the sharding storage together with the worker storage. This allows to run queries in parallel multithreading instead of a single JavaScript process. Because the worker initialization can slow down the initial page load, we also use the [localstorage-meta-optimizer](./rx-storage-localstorage-meta-optimizer.md) to improve initialization time. - -```ts -import { getRxStorageSharding } from 'rxdb-premium/plugins/storage-sharding'; -import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker'; -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; -import { getLocalstorageMetaOptimizerRxStorage } from 'rxdb-premium/plugins/storage-localstorage-meta-optimizer'; - -const myDatabase = await createRxDatabase({ - storage: getLocalstorageMetaOptimizerRxStorage({ - storage: getRxStorageSharding({ - storage: getRxStorageWorker({ - workerInput: 'path/to/worker.js', - storage: getRxStorageIndexedDB() - }) - }) - }) -}); -``` - -### Low Latency on Writes and Simple Reads - -Here we create a storage configuration that is optimized to have a low latency on simple reads and writes. It uses the memory-mapped storage to fetch and store data in memory. For persistence the OPFS storage is used in the main thread which has lower latency for fetching big chunks of data when at initialization the data is loaded from disc into memory. We do not use workers because sending data from the main thread to workers and backwards would increase the latency. - -```ts -import { getLocalstorageMetaOptimizerRxStorage } from 'rxdb-premium/plugins/storage-localstorage-meta-optimizer'; -import { getMemoryMappedRxStorage } from 'rxdb-premium/plugins/storage-memory-mapped'; -import { getRxStorageOPFSMainThread } from 'rxdb-premium/plugins/storage-worker'; - -const myDatabase = await createRxDatabase({ - storage: getLocalstorageMetaOptimizerRxStorage({ - storage: getMemoryMappedRxStorage({ - storage: getRxStorageOPFSMainThread() - }) - }) -}); -``` - -## All RxStorage Implementations List - -### Memory - -A storage that stores the data in as plain data in the memory of the JavaScript process. Really fast and can be used in all environments. [Read more](./rx-storage-memory.md) - -### LocalStorage - -The localstroage based storage stores the data inside of a browsers [localStorage API](./articles/localstorage.md). It is the easiest to set up and has a small bundle size. **If you are new to RxDB, you should start with the LocalStorage RxStorage**. [Read more](./rx-storage-localstorage.md) - -### 👑 IndexedDB - -The IndexedDB `RxStorage` is based on plain IndexedDB. For most use cases, this has the best performance together with the OPFS storage. [Read more](./rx-storage-indexeddb.md) - -### 👑 OPFS - -The OPFS `RxStorage` is based on the File System Access API. This has the best performance of all other non-in-memory storage, when RxDB is used inside of a browser. [Read more](./rx-storage-opfs.md) - -### 👑 Filesystem Node - -The Filesystem Node storage is best suited when you use RxDB in a Node.js process or with [electron.js](./electron.md). [Read more](./rx-storage-filesystem-node.md) - -### Storage Wrapper Plugins - -#### 👑 Worker - -The worker RxStorage is a wrapper around any other RxStorage which allows to run the storage in a WebWorker (in browsers) or a Worker Thread (in Node.js). By doing so, you can take CPU load from the main process and move it into the worker's process which can improve the perceived performance of your application. [Read more](./rx-storage-worker.md) - -#### 👑 SharedWorker - -The worker RxStorage is a wrapper around any other RxStorage which allows to run the storage in a SharedWorker (only in browsers). By doing so, you can take CPU load from the main process and move it into the worker's process which can improve the perceived performance of your application. [Read more](./rx-storage-shared-worker.md) - -#### Remote -The Remote RxStorage is made to use a remote storage and communicate with it over an asynchronous message channel. The remote part could be on another JavaScript process or even on a different host machine. Mostly used internally in other storages like Worker or Electron-ipc. [Read more](./rx-storage-remote.md) - -#### 👑 Sharding - -On some `RxStorage` implementations (like IndexedDB), a huge performance improvement can be done by sharding the documents into multiple database instances. With the sharding plugin you can wrap any other `RxStorage` into a sharded storage. [Read more](./rx-storage-sharding.md) - -#### 👑 Memory Mapped - -The memory-mapped [RxStorage](./rx-storage.md) is a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance stores its data in an underlying storage for persistence. -The main reason to use this is to improve query/write performance while still having the data stored on disc. [Read more](./rx-storage-memory-mapped.md) - -#### 👑 Localstorage Meta Optimizer - -The [RxStorage](./rx-storage.md) Localstorage Meta Optimizer is a wrapper around any other RxStorage. The wrapper uses the original RxStorage for normal collection documents. But to optimize the initial page load time, it uses [localstorage](./articles/localstorage.md) to store the plain key-value metadata that RxDB needs to create databases and collections. This plugin can only be used in browsers. [Read more](./rx-storage-localstorage-meta-optimizer.md) - -#### Electron IpcRenderer & IpcMain - -To use RxDB in [electron](./electron-database.md), it is recommended to run the RxStorage in the main process and the RxDatabase in the renderer processes. With the rxdb electron plugin you can create a remote RxStorage and consume it from the renderer process. [Read more](./electron.md) - -### Third Party based Storages - -#### 👑 SQLite - -The SQLite storage has great performance when RxDB is used on **Node.js**, **Electron**, **React Native**, **Cordova** or **Capacitor**. [Read more](./rx-storage-sqlite.md) - -#### Dexie.js - -The Dexie.js based storage is based on the Dexie.js IndexedDB wrapper library. [Read more](./rx-storage-dexie.md) - -#### MongoDB - -To use RxDB on the server side, the MongoDB RxStorage provides a way of having a secure, scalable and performant storage based on the popular MongoDB NoSQL database [Read more](./rx-storage-mongodb.md) - -#### DenoKV - -To use RxDB in Deno. The DenoKV RxStorage provides a way of having a secure, scalable and performant storage based on the Deno Key Value Store. [Read more](./rx-storage-denokv.md) - -#### FoundationDB - -To use RxDB on the server side, the FoundationDB RxStorage provides a way of having a secure, fault-tolerant and performant storage. [Read more](./rx-storage-foundationdb.md) - ---- - -## RxDB Tradeoffs - Why NoSQL Triumphs on the Client - -# RxDB Tradeoffs - -[RxDB](https://rxdb.info) is client-side, [offline first](./offline-first.md) Database for JavaScript applications. -While RxDB could be used on the server side, most people use it on the client side together with an UI based application. -Therefore RxDB was optimized for client side applications and had to take completely different tradeoffs than what a server side database would do. - -## Why not SQL syntax - -When you ask people which database they would want for browsers, the most answer I hear is *something SQL based like SQLite*. -This makes sense, SQL is a query language that most developers had learned in school/university and it is reusable across various database solutions. -But for RxDB (and other client side databases), using SQL is not a good option and instead it operates on document writes and the JSON based **Mango-query** syntax for querying. - -```ts -// A Mango Query -const query = { - selector: { - age: { - $gt: 10 - }, - lastName: 'foo' - }, - sort: [{ age: 'asc' }] -}; -``` - -### SQL is made for database servers - -SQL is made to be used to run operations against a database server. You send a SQL string like ```SELECT SUM(column_name)...``` to the database server and the server then runs all operations required to calculate the result and only send back that result. -This saves performance on the application side and ensures that the application itself is not blocked. - -But RxDB is a client-side database that runs **inside** of the application. There is no performance difference if the `SUM()` query is run inside of the database or at the application level where a `Array.reduce()` call calculates the result. - -### Typescript support - -SQL is `string` based and therefore you need additional IDE tooling to ensure that your written database code is valid. -Using the Mango Query syntax instead, TypeScript can be used validate the queries and to autocomplete code and knows which fields do exist and which do not. By doing so, the correctness of queries can be ensured at compile-time instead of run-time. - - - -### Composeable queries - -By using JSON based Mango Queries, it is easy to compose queries in plain JavaScript. -For example if you have any given query and want to add the condition `user MUST BE 'foobar'`, you can just add the condition to the selector without having to parse and understand a complex SQL string. - -```ts -query.selector.user = 'foobar'; -``` - -Even merging the selectors of multiple queries is not a problem: - -```ts -queryA.selector = { - $and: [ - queryA.selector, - queryB.selector - ] -}; -``` - -## Why Document based (NoSQL) - -Like other NoSQL databases, RxDB operates data on document level. It has no concept of tables, rows and columns. Instead we have collections, documents and fields. - -### Javascript is made to work with objects -### Caching - -### EventReduce - -### Easier to use with typescript - -Because of the document based approach, TypeScript can know the exact type of the query response while a SQL query could return anything from a number over a set of rows or a complex construct. - -## Why no transactions - -- Does not work with offline-first -- Does not work with multi-tab -- Easier conflict handling on document level - --- Instead of transactions, rxdb works with revisions - -## Why no relations - -- Does not work with easy replication - -## Why is a schema required - -- migration of data on clients is hard -- Why jsonschema - -## - ---- - -## Schema Validation - -# Schema validation - -RxDB has multiple validation implementations that can be used to ensure that your document data is always matching the provided JSON -schema of your `RxCollection`. - -The schema validation is **not a plugin** but comes in as a wrapper around any other `RxStorage` and it will then validate all data that is written into that storage. This is required for multiple reasons: -- It allows us to run the validation inside of a [Worker RxStorage](./rx-storage-worker.md) instead of running it in the main JavaScript process. -- It allows us to configure which `RxDatabase` instance must use the validation and which does not. In production it often makes sense to validate user data, but you might not need the validation for data that is only replicated from the backend. - -:::warning -Schema validation can be **CPU expensive** and increases your build size. You should always use a schema validation in development mode. For most use cases, you **should not** use a validation in production for better performance. -::: - -When no validation is used, any document data can be saved but there might be **undefined behavior** when saving data that does not comply to the schema of a `RxCollection`. - -RxDB has different implementations to validate data, each of them is based on a different [JSON Schema library](https://json-schema.org/tools). In this example we use the [LocalStorage RxStorage](./rx-storage-localstorage.md), but you can wrap the validation around **any other** [RxStorage](./rx-storage.md). - -### validate-ajv - -A validation-module that does the schema-validation. This one is using [ajv](https://github.com/epoberezkin/ajv) as validator which is a bit faster. Better compliant to the jsonschema-standard but also has a bigger build-size. - -```javascript -import { wrappedValidateAjvStorage } from 'rxdb/plugins/validate-ajv'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -// wrap the validation around the main RxStorage -const storage = wrappedValidateAjvStorage({ - storage: getRxStorageLocalstorage() -}); - -const db = await createRxDatabase({ - name: randomCouchString(10), - storage -}); -``` - -### validate-z-schema - -Both `is-my-json-valid` and `validate-ajv` use `eval()` to perform validation which might not be wanted when `'unsafe-eval'` is not allowed in Content Security Policies. This one is using [z-schema](https://github.com/zaggino/z-schema) as validator which doesn't use `eval`. - -```javascript -import { wrappedValidateZSchemaStorage } from 'rxdb/plugins/validate-z-schema'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -// wrap the validation around the main RxStorage -const storage = wrappedValidateZSchemaStorage({ - storage: getRxStorageLocalstorage() -}); - -const db = await createRxDatabase({ - name: randomCouchString(10), - storage -}); -``` - -### validate-is-my-json-valid - -**WARNING**: The `is-my-json-valid` validation is no longer supported until [this bug](https://github.com/mafintosh/is-my-json-valid/pull/192) is fixed. - -The `validate-is-my-json-valid` plugin uses [is-my-json-valid](https://www.npmjs.com/package/is-my-json-valid) for schema validation. - -```javascript -import { wrappedValidateIsMyJsonValidStorage } from 'rxdb/plugins/validate-is-my-json-valid'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -// wrap the validation around the main RxStorage -const storage = wrappedValidateIsMyJsonValidStorage({ - storage: getRxStorageLocalstorage() -}); - -const db = await createRxDatabase({ - name: randomCouchString(10), - storage -}); -``` - -## Custom Formats - -The schema validators provide methods to add custom formats like a `email` format. -You have to add these formats **before** you create your database. - -### Ajv Custom Format - -```ts -import { getAjv } from 'rxdb/plugins/validate-ajv'; -const ajv = getAjv(); -ajv.addFormat('email', { - type: 'string', - validate: v => v.includes('@') // ensure email fields contain the @ symbol -}); -``` - -### Z-Schema Custom Format - -```ts -import { ZSchemaClass } from 'rxdb/plugins/validate-z-schema'; -ZSchemaClass.registerFormat('email', function (v: string) { - return v.includes('@'); // ensure email fields contain the @ symbol -}); -``` - -## Performance comparison of the validators - -The RxDB team ran performance benchmarks using two storage options on an Ubuntu 24.04 machine with Chrome version `131.0.6778.85`. The testing machine has 32 core `13th Gen Intel(R) Core(TM) i9-13900HX` CPU. - -IndexedDB Storage (based on the IndexedDB API in the browser): - -| **IndexedDB Storage** | Time to First insert | Insert 3000 documents | -| ----------------- | :------------------: | --------------------: | -| no validator | 68 ms | 213 ms | -| ajv | 67 ms | 216 ms | -| z-schema | 71 ms | 230 ms | - -Memory Storage: stores everything in memory for extremely fast reads and writes, with no persistence by default. Often used with the RxDB memory-mapped plugin that processes data in memory an later persists to disc in background: - -| **Memory Storage** | Time to First insert | Insert 3000 documents | -| ------------------ | :------------------: | --------------------: | -| no validator | 1.15 ms | 0.8 ms | -| ajv | 3.05 ms | 2.7 ms | -| z-schema | 0.9 ms | 18 ms | - -Including a validator library also increases your JavaScript bundle size. Here's how it breaks down (minified + gzip): - -| **Build Size** (minified+gzip) | Build Size (IndexedDB) | Build Size (memory) | -| ------------------------------ | :----------------: | ------------------: | -| no validator | 73103 B | 39976 B | -| ajv | 106135 B | 72773 B | -| z-schema | 125186 B | 91882 B | - ---- - -## Solving IndexedDB Slowness for Seamless Apps - -# Why IndexedDB is slow and what to use instead - -So you have a JavaScript web application that needs to store data at the client side, either to make it [offline usable](./offline-first.md), just for caching purposes or for other reasons. - -For [in-browser data storage](./articles/browser-database.md), you have some options: - -- **Cookies** are sent with each HTTP request, so you cannot store more than a few strings in them. -- **WebSQL** [is deprecated](https://hacks.mozilla.org/2010/06/beyond-html5-database-apis-and-the-road-to-indexeddb/) because it never was a real standard and turning it into a standard would have been too difficult. -- [LocalStorage](./articles/localstorage.md) is a synchronous API over asynchronous IO-access. Storing and reading data can fully block the JavaScript process so you cannot use LocalStorage for more than few simple key-value pairs. -- The **FileSystem API** could be used to store plain binary files, but it is [only supported in chrome](https://caniuse.com/filesystem) for now. -- **IndexedDB** is an indexed key-object database. It can store json data and iterate over its indexes. It is [widely supported](https://caniuse.com/indexeddb) and stable. - -:::note UPDATE April 2023 -Since beginning of 2023, all modern browsers ship the **File System Access API** which allows to persistently store data in the browser with a way better performance. For [RxDB](https://rxdb.info/) you can use the [OPFS RxStorage](./rx-storage-opfs.md) to get about 4x performance improvement compared to IndexedDB. - -
    - - - -
    -::: - -It becomes clear that the only way to go is IndexedDB. You start developing your app and everything goes fine. -But as soon as your app gets bigger, more complex or just handles more data, you might notice something. **IndexedDB is slow**. Not slow like a database on a cheap server, **even slower**! Inserting a few hundred documents can take up several seconds. Time which can be critical for a fast page load. Even sending data over the internet to the backend can be faster than storing it inside of an IndexedDB database. - -> Transactions vs Throughput - -So before we start complaining, lets analyze what exactly is slow. When you run tests on Nolans [Browser Database Comparison](http://nolanlawson.github.io/database-comparison/) you can see that inserting 1k documents into IndexedDB takes about 80 milliseconds, 0.08ms per document. This is not really slow. It is quite fast and it is very unlikely that you want to store that many document at the same time at the client side. But the key point here is that all these documents get written in a `single transaction`. - -I forked the comparison tool [here](https://pubkey.github.io/client-side-databases/database-comparison/index.html) and changed it to use one transaction per document write. And there we have it. Inserting 1k documents with one transaction per write, takes about 2 seconds. Interestingly if we increase the document size to be 100x bigger, it still takes about the same time to store them. This makes clear that the limiting factor to IndexedDB performance is the transaction handling, not the data throughput. - - - -To fix your IndexedDB performance problems you have to make sure to use as less data transfers/transactions as possible. -Sometimes this is easy, as instead of iterating over a documents list and calling single inserts, with RxDB you could use the [bulk methods](https://rxdb.info/rx-collection.html#bulkinsert) to store many document at once. -But most of the time is not so easy. Your user clicks around, data gets replicated from the backend, another browser tab writes data. All these things can happen at random time and you cannot crunch all that data in a single transaction. - -Another solution is to just not care about performance at all. In a few releases the browser vendors will have optimized IndexedDB and everything is fast again. Well, IndexedDB was slow [in 2013](https://www.researchgate.net/publication/281065948_Performance_Testing_and_Comparison_of_Client_Side_Databases_Versus_Server_Side) and it is still slow today. If this trend continues, it will still be slow in a few years from now. Waiting is not an option. The chromium devs made [a statement](https://bugs.chromium.org/p/chromium/issues/detail?id=1025456#c15) to focus on optimizing read performance, not write performance. - -Switching to WebSQL (even if it is deprecated) is also not an option because, like [the comparison tool shows](https://pubkey.github.io/client-side-databases/database-comparison/index.html), it has even slower transactions. - -So you need a way to **make IndexedDB faster**. In the following I lay out some performance optimizations than can be made to have faster reads and writes in IndexedDB. - -**HINT:** You can reproduce all performance tests [in this repo](https://github.com/pubkey/indexeddb-performance-tests). In all tests we work on a dataset of 40000 `human` documents with a random `age` between `1` and `100`. - -## Batched Cursor - -With [IndexedDB 2.0](https://caniuse.com/indexeddb2), new methods were introduced which can be utilized to improve performance. With the `getAll()` method, a faster alternative to the old `openCursor()` can be created which improves performance when reading data from the IndexedDB store. - -Lets say we want to query all user documents that have an `age` greater than `25` out of the store. -To implement a fast batched cursor that only needs calls to `getAll()` and not to `getAllKeys()`, we first need to create an `age` index that contains the primary `id` as last field. - -```ts -myIndexedDBObjectStore.createIndex( - 'age-index', - [ - 'age', - 'id' - ] -); -``` - -This is required because the `age` field is not unique, and we need a way to checkpoint the last returned batch so we can continue from there in the next call to `getAll()`. - -```ts -const maxAge = 25; -let result = []; -const tx: IDBTransaction = db.transaction([storeName], 'readonly', TRANSACTION_SETTINGS); -const store = tx.objectStore(storeName); -const index = store.index('age-index'); -let lastDoc; -let done = false; -/** - * Run the batched cursor until all results are retrieved - * or the end of the index is reached. - */ -while (done === false) { - await new Promise((res, rej) => { - const range = IDBKeyRange.bound( - /** - * If we have a previous document as checkpoint, - * we have to continue from it's age and id values. - */ - [ - lastDoc ? lastDoc.age : -Infinity, - lastDoc ? lastDoc.id : -Infinity, - ], - [ - maxAge + 0.00000001, - String.fromCharCode(65535) - ], - true, - false - ); - const openCursorRequest = index.getAll(range, batchSize); - openCursorRequest.onerror = err => rej(err); - openCursorRequest.onsuccess = e => { - const subResult: TestDocument[] = e.target.result; - lastDoc = lastOfArray(subResult); - if (subResult.length === 0) { - done = true; - } else { - result = result.concat(subResult); - } - res(); - }; - }); -} -console.dir(result); -``` - - - -As the performance test results show, using a batched cursor can give a huge improvement. Interestingly choosing a high batch size is important. When you known that all results of a given `IDBKeyRange` are needed, you should not set a batch size at all and just directly query all documents via `getAll()`. - -RxDB uses batched cursors in the [IndexedDB RxStorage](./rx-storage-indexeddb.md). - -## IndexedDB Sharding - -Sharding is a technique, normally used in server side databases, where the database is partitioned horizontally. Instead of storing all documents at one table/collection, the documents are split into so called **shards** and each shard is stored on one table/collection. This is done in server side architectures to spread the load between multiple physical servers which **increases scalability**. - -When you use IndexedDB in a browser, there is of course no way to split the load between the client and other servers. But you can still benefit from sharding. Partitioning the documents horizontally into **multiple IndexedDB stores**, has shown to have a big performance improvement in write- and read operations while only increasing initial pageload slightly. - - - -As shown in the performance test results, sharding should always be done by `IDBObjectStore` and not by database. Running a batched cursor over the whole dataset with 10 store shards in parallel is about **28% faster** then running it over a single store. Initialization time increases minimal from `9` to `17` milliseconds. -Getting a quarter of the dataset by batched iterating over an index, is even **43%** faster with sharding then when a single store is queried. - -As downside, getting 10k documents by their id is slower when it has to run over the shards. -Also it can be much effort to recombined the results from the different shards into the required query result. When a query without a limit is done, the sharding method might cause a data load huge overhead. - -Sharding can be used with RxDB with the [Sharding Plugin](./rx-storage-sharding.md). - -## Custom Indexes - -Indexes improve the query performance of IndexedDB significant. Instead of fetching all data from the storage when you search for a subset of it, you can iterate over the index and stop iterating when all relevant data has been found. - -For example to query for all user documents that have an `age` greater than `25`, you would create an `age+id` index. -To be able to run a batched cursor over the index, we always need our primary key (`id`) as the last index field. - -Instead of doing this, you can use a `custom index` which can improve the performance. The custom index runs over a helper field `ageIdCustomIndex` which is added to each document on write. Our index now only contains a single `string` field instead of two (age-`number` and id-`string`). - -```ts -// On document insert add the ageIdCustomIndex field. -const idMaxLength = 20; // must be known to craft a custom index -docData.ageIdCustomIndex = docData.age + docData.id.padStart(idMaxLength, ' '); -store.put(docData); -// ... -``` - -```ts -// normal index -myIndexedDBObjectStore.createIndex( - 'age-index', - [ - 'age', - 'id' - ] -); - -// custom index -myIndexedDBObjectStore.createIndex( - 'age-index-custom', - [ - 'ageIdCustomIndex' - ] -); - -``` - -To iterate over the index, you also use a custom crafted keyrange, depending on the last batched cursor checkpoint. Therefore the `maxLength` of `id` must be known. - -```ts -// keyrange for normal index -const range = IDBKeyRange.bound( - [25, ''], - [Infinity, Infinity], - true, - false -); - -// keyrange for custom index -const range = IDBKeyRange.bound( - // combine both values to a single string - 25 + ''.padStart(idMaxLength, ' '), - Infinity, - true, - false -); -``` - - - -As shown, using a custom index can further improve the performance of running a batched cursor by about `10%`. - -Another big benefit of using custom indexes, is that you can also encode `boolean` values in them, which [cannot be done](https://github.com/w3c/IndexedDB/issues/76) with normal IndexedDB indexes. - -RxDB uses custom indexes in the [IndexedDB RxStorage](./rx-storage-indexeddb.md). - -## Relaxed durability - -Chromium based browsers allow to set [durability](https://developer.mozilla.org/en-US/docs/Web/API/IDBTransaction/durability) to `relaxed` when creating an IndexedDB transaction. Which runs the transaction in a less secure durability mode, which can improve the performance. - -> The user agent may consider that the transaction has successfully committed as soon as all outstanding changes have been written to the operating system, without subsequent verification. - -As shown [here](https://nolanlawson.com/2021/08/22/speeding-up-indexeddb-reads-and-writes/), using the relaxed durability mode can improve performance slightly. The best performance improvement could be measured when many small transactions have to be run. Less, bigger transaction do not benefit that much. - -## Explicit transaction commits - -By explicitly committing a transaction, another slight performance improvement can be achieved. Instead of waiting for the browser to commit an open transaction, we call the `commit()` method to explicitly close it. - -```ts -// .commit() is not available on all browsers, so first check if it exists. -if (transaction.commit) { - transaction.commit() -} -``` - -The improvement of this technique is minimal, but observable as [these tests](https://nolanlawson.com/2021/08/22/speeding-up-indexeddb-reads-and-writes/) show. - -## In-Memory on top of IndexedDB - -To prevent transaction handling and to fix the performance problems, we need to stop using IndexedDB as a database. Instead all data is loaded into the memory on the initial page load. Here all reads and writes happen in memory which is about 100x faster. Only some time after a write occurred, the memory state is persisted into IndexedDB with a **single write transaction**. In this scenario IndexedDB is used as a filesystem, not as a database. - -There are some libraries that already do that: - -- LokiJS with the [IndexedDB Adapter](https://techfort.github.io/LokiJS/LokiIndexedAdapter.html) -- [Absurd-SQL](https://github.com/jlongster/absurd-sql) -- SQL.js with the [empscripten Filesystem API](https://emscripten.org/docs/api_reference/Filesystem-API.html#filesystem-api-idbfs) -- [DuckDB Wasm](https://duckdb.org/2021/10/29/duckdb-wasm.html) - -### In-Memory: Persistence - -One downside of not directly using IndexedDB, is that your data is not persistent all the time. And when the JavaScript process exists without having persisted to IndexedDB, data can be lost. To prevent this from happening, we have to ensure that the in-memory state is written down to the disc. One point is make persisting as fast as possible. LokiJS for example has the `incremental-indexeddb-adapter` which only saves new writes to the disc instead of persisting the whole state. Another point is to run the persisting at the correct point in time. For example the RxDB [LokiJS storage](https://rxdb.info/rx-storage-lokijs.html) persists in the following situations: - -- When the database is idle and no write or query is running. In that time we can persist the state if any new writes appeared before. -- When the `window` fires the [beforeunload event](https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload) we can assume that the JavaScript process is exited any moment and we have to persist the state. After `beforeunload` there are several seconds time which are sufficient to store all new changes. This has shown to work quite reliable. - -The only missing event that can happen is when the browser exists unexpectedly like when it crashes or when the power of the computer is shut of. - -### In-Memory: Multi Tab Support - -One big difference between a web application and a 'normal' app, is that your users can use the app in multiple browser tabs at the same time. But when you have all database state in memory and only periodically write it to disc, multiple browser tabs could overwrite each other and you would loose data. This might not be a problem when you rely on a client-server replication, because the lost data might already be replicated with the backend and therefore with the other tabs. But this would not work when the client is offline. - -The ideal way to solve that problem, is to use a [SharedWorker](https://developer.mozilla.org/en/docs/Web/API/SharedWorker). A [SharedWorker](./rx-storage-shared-worker.md) is like a [WebWorker](https://developer.mozilla.org/en/docs/Web/API/Web_Workers_API) that runs its own JavaScript process only that the SharedWorker is shared between multiple contexts. You could create the database in the SharedWorker and then all browser tabs could request the Worker for data instead of having their own database. But unfortunately the SharedWorker API does [not work](https://caniuse.com/sharedworkers) in all browsers. Safari [dropped](https://bugs.webkit.org/show_bug.cgi?id=140344) its support and InternetExplorer or Android Chrome, never adopted it. Also it cannot be polyfilled. **UPDATE:** [Apple added SharedWorkers back in Safari 142](https://developer.apple.com/safari/technology-preview/release-notes/) - -Instead, we could use the [BroadcastChannel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API) to communicate between tabs and then apply a [leader election](https://github.com/pubkey/broadcast-channel#using-the-leaderelection) between them. The [leader election](./leader-election.md) ensures that, no matter how many tabs are open, always one tab is the `Leader`. - - - -The disadvantage is that the leader election process takes some time on the initial page load (about 150 milliseconds). Also the leader election can break when a JavaScript process is fully blocked for a longer time. When this happens, a good way is to just reload the browser tab to restart the election process. - -## Further read - -- [Offline First Database Comparison](https://github.com/pubkey/client-side-databases) -- [Speeding up IndexedDB reads and writes](https://nolanlawson.com/2021/08/22/speeding-up-indexeddb-reads-and-writes/) -- [SQLITE ON THE WEB: ABSURD-SQL](https://hackaday.com/2021/08/24/sqlite-on-the-web-absurd-sql/) -- [SQLite in a PWA with FileSystemAccessAPI](https://anita-app.com/blog/articles/sqlite-in-a-pwa-with-file-system-access-api.html) -- [Response to this article by Oren Eini](https://ravendb.net/articles/re-why-indexeddb-is-slow-and-what-to-use-instead) - ---- - -## Boost Your RxDB with Powerful Third-Party Plugins - -# Third Party Plugins - -* [rxdb-hooks](https://github.com/cvara/rxdb-hooks) A set of hooks to integrate RxDB into react applications. -* [rxdb-flexsearch](https://github.com/serenysoft/rxdb-flexsearch) The full text search for RxDB using [FlexSearch](https://github.com/nextapps-de/flexsearch). -* [rxdb-orion](https://github.com/serenysoft/rxdb-orion) Enables replication with [Laravel Orion](https://tailflow.github.io/laravel-orion-docs). -* [rxdb-supabase](https://github.com/marceljuenemann/rxdb-supabase) Enables replication with [Supabase](https://supabase.com/). -* [rxdb-utils](https://github.com/rafamel/rxdb-utils) Additional features for RxDB like models, timestamps, default values, view and more. -* [loki-async-reference-adapter](https://github.com/jonnyreeves/loki-async-reference-adapter) Simple async adapter for LokiJS, suitable to use RxDB's [Lokijs RxStorage](./rx-storage-lokijs.md) with React Native. - ---- - -## Transactions, Conflicts and Revisions - - -In contrast to most SQL databases, RxDB does not have the concept of relational, ACID transactions. Instead, RxDB has to apply different techniques that better suit the offline-first, client side world where it is not possible to create a transaction between multiple maybe-offline client devices. - -## Why RxDB does not have transactions - -When talking about transactions, we mean [ACID transactions](https://en.wikipedia.org/wiki/ACID) that guarantee the properties of atomicity, consistency, isolation and durability. -With an ACID transaction you can mutate data dependent on the current state of the database. It is ensured that no other database operations happen in between your transaction and after the transaction has finished, it is guaranteed that the new data is actually written to the disc. - -To implement ACID transactions on a **single server**, the database has to keep track on who is running transactions and then schedule these transactions so that they can run in isolation. - -As soon as you have to split your database on **multiple servers**, transaction handling becomes way more difficult. The servers have to communicate with each other to find a consensus about which transaction can run and which has to wait. Network connections might break, or one server might complete its part of the transaction and then be required to roll back its changes because of an error on another server. - -But with RxDB you have **multiple clients** that can go randomly online or offline. The users can have different devices and the clock of these devices can go off by any time. To support ACID transactions here, RxDB would have to make the whole world stand still for all clients, while one client is doing a write operation. And even that can only work when all clients are online. Implementing that might be possible, but at the cost of an unpredictable amount of performance loss and not being able to support [offline-first](./offline-first.md). - -> A single write operation to a document is the only atomic thing you can do in RxDB. - -The benefits of not having to support transactions: - -- Clients can read and write data without blocking each other. -- Clients can write data while being **offline** and then replicate with a server when they are **online** again, called [offline-first](./offline-first.md). -- Creating a compatible backend for the replication is easy so that RxDB can replicate with any existing infrastructure. -- Optimizations like [Sharding](./rx-storage-sharding.md) can be used. - -## Revisions - -Working without transactions leads to having undefined state when doing multiple database operations at the same time. Most client side databases rely on a last-write-wins strategy on write operations. This might be a viable solution for some cases, but often this leads to strange problems that are hard to debug. - -Instead, to ensure that the behavior of RxDB is **always predictable**, RxDB relies on **revisions** for version control. Revisions work similar to [Lamport Clocks](https://martinfowler.com/articles/patterns-of-distributed-systems/lamport-clock.html). - -Each document is stored together with its revision string, that looks like `1-9dcca3b8e1a` and consists of: -- The revision height, a number that starts with `1` and is increased with each write to that document. -- The database instance token. - -An operation to the RxDB data layer does not only contain the new document data, but also the previous document data with its revision string. If the previous revision matches the revision that is currently stored in the database, the write operation can succeed. If the previous revision is **different** than the revision that is currently stored in the database, the operation will throw a `409 CONFLICT` error. - -## Conflicts - -There are two types of conflicts in RxDB, the **local conflict** and the **replication conflict**. - -### Local conflicts - -A local conflict can happen when a write operation assumes a different previous document state, than what is currently stored in the database. This can happen when multiple parts of your application do simultaneous writes to the same document. This can happen on a single browser tab, or when multiple tabs write at once or when a write appears while the document gets replicated from a remote server replication. - -When a local conflict appears, RxDB will throw a `409 CONFLICT` error. The calling code must then handle the error properly, depending on the application logic. - -Instead of handling local conflicts, in most cases it is easier to ensure that they cannot happen, by using `incremental` database operations like [incrementalModify()](./rx-document.md), [incrementalPatch()](./rx-document.md) or [incrementalUpsert()](./rx-collection.md). These write operations have a built-in way to handle conflicts by re-applying the mutation functions to the conflicting document state. - -## Replication conflicts - -A replication conflict appears when multiple clients write to the same documents at once and these documents are then replicated to the backend server. - -When you replicate with the [Graphql replication](./replication-graphql.md) and the [replication primitives](./replication.md), RxDB assumes that conflicts are **detected** and **resolved** at the client side. - -When a document is send to the backend and the backend detected a conflict (by comparing revisions or other properties), the backend will respond with the actual document state so that the client can compare this with the local document state and create a new, resolved document state that is then pushed to the server again. You can read more about the replication conflicts [here](./replication.md#conflict-handling). - -## Custom conflict handler - -A conflict handler is an object with two JavaScript functions: -- Detect if two document states are equal -- Solve existing conflicts - -Because the conflict handler also is used for conflict detection, it will run many times on pull-, push- and write operations of RxDB. Most of the time it will detect that there is no conflict and then return. - -Lets have a look at the [default conflict handler](https://github.com/pubkey/rxdb/blob/master/src/replication-protocol/default-conflict-handler.ts) of RxDB to learn how to create a custom one: - -```ts -import { deepEqual } from 'rxdb/plugins/utils'; -export const defaultConflictHandler: RxConflictHandler = { - isEqual(a, b) { - /** - * isEqual() is used to detect conflicts or to detect if a - * document has to be pushed to the remote. - * If the documents are deep equal, - * we have no conflict. - * Because deepEqual is CPU expensive, on your custom conflict handler you might only - * check some properties, like the updatedAt time or revisions - * for better performance. - */ - return deepEqual(a, b); - }, - resolve(i) { - /** - * The default conflict handler will always - * drop the fork state and use the master state instead. - * - * In your custom conflict handler you likely want to merge properties - * of the realMasterState and the newDocumentState instead. - */ - return i.realMasterState; - } -}; -``` - -To overwrite the default conflict handler, you have to specify a custom `conflictHandler` property when creating a collection with `addCollections()`. - -```js -const myCollections = await myDatabase.addCollections({ - // key = collectionName - humans: { - schema: mySchema, - conflictHandler: myCustomConflictHandler - } -}); -``` - ---- - -## TypeScript Setup - -import {Steps} from '@site/src/components/steps'; - -# Using RxDB with TypeScript - - - -In this tutorial you will learn how to use RxDB with TypeScript. -We will create a basic database with one collection and several ORM-methods, fully typed! - -RxDB directly comes with its typings and you do not have to install anything else, however the latest version of RxDB requires that you are using Typescript v3.8 or newer. -Our way to go is - -- First define what the documents look like -- Then define what the collections look like -- Then define what the database looks like - - - -## Declare the types - -First you import the types from RxDB. - -```typescript -import { - createRxDatabase, - RxDatabase, - RxCollection, - RxJsonSchema, - RxDocument, -} from 'rxdb/plugins/core'; -``` - -## Create the base document type - -First we have to define the TypeScript type of the documents of a collection: - -**Option A**: Create the document type from the schema - -```typescript -import { - toTypedRxJsonSchema, - ExtractDocumentTypeFromTypedRxJsonSchema, - RxJsonSchema -} from 'rxdb'; -export const heroSchemaLiteral = { - title: 'hero schema', - description: 'describes a human being', - version: 0, - keyCompression: true, - primaryKey: 'passportId', - type: 'object', - properties: { - passportId: { - type: 'string', - maxLength: 100 // <- the primary key must have set maxLength - }, - firstName: { - type: 'string' - }, - lastName: { - type: 'string' - }, - age: { - type: 'integer' - } - }, - required: ['firstName', 'lastName', 'passportId'], - indexes: ['firstName'] -} as const; // <- It is important to set 'as const' to preserve the literal type -const schemaTyped = toTypedRxJsonSchema(heroSchemaLiteral); - -// aggregate the document type from the schema -export type HeroDocType = ExtractDocumentTypeFromTypedRxJsonSchema; - -// create the typed RxJsonSchema from the literal typed object. -export const heroSchema: RxJsonSchema = heroSchemaLiteral; -``` - -**Option B**: Manually type the document type - -```typescript -export type HeroDocType = { - passportId: string; - firstName: string; - lastName: string; - age?: number; // optional -}; -``` - -**Option C**: Generate the document type from schema during build time - -If your schema is in a `.json` file or generated from somewhere else, you might generate the typings with the [json-schema-to-typescript](https://www.npmjs.com/package/json-schema-to-typescript) module. - -## Types for the ORM methods - -We also add some ORM-methods for the document. - -```typescript -export type HeroDocMethods = { - scream: (v: string) => string; -}; -``` - -## Create RxDocument Type - -We can merge these into our HeroDocument. - -```typescript -export type HeroDocument = RxDocument; -``` - -## Create RxCollection Type - -Now we can define type for the collection which contains the documents. - -```typescript - -// we declare one static ORM-method for the collection -export type HeroCollectionMethods = { - countAllDocuments: () => Promise; -} - -// and then merge all our types -export type HeroCollection = RxCollection< - HeroDocType, - HeroDocMethods, - HeroCollectionMethods ->; -``` - -## Create RxDatabase Type - -Before we can define the database, we make a helper-type which contains all collections of it. - -```typescript -export type MyDatabaseCollections = { - heroes: HeroCollection -} -``` - -Now the database. - -```typescript -export type MyDatabase = RxDatabase; -``` - - - -## Using the types - -Now that we have declare all our types, we can use them. - -```typescript - -/** - * create database and collections - */ -const myDatabase: MyDatabase = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage() -}); - -const heroSchema: RxJsonSchema = { - title: 'human schema', - description: 'describes a human being', - version: 0, - keyCompression: true, - primaryKey: 'passportId', - type: 'object', - properties: { - passportId: { - type: 'string' - }, - firstName: { - type: 'string' - }, - lastName: { - type: 'string' - }, - age: { - type: 'integer' - } - }, - required: ['passportId', 'firstName', 'lastName'] -}; - -const heroDocMethods: HeroDocMethods = { - scream: function(this: HeroDocument, what: string) { - return this.firstName + ' screams: ' + what.toUpperCase(); - } -}; - -const heroCollectionMethods: HeroCollectionMethods = { - countAllDocuments: async function(this: HeroCollection) { - const allDocs = await this.find().exec(); - return allDocs.length; - } -}; - -await myDatabase.addCollections({ - heroes: { - schema: heroSchema, - methods: heroDocMethods, - statics: heroCollectionMethods - } -}); - -// add a postInsert-hook -myDatabase.heroes.postInsert( - function myPostInsertHook( - this: HeroCollection, // own collection is bound to the scope - docData: HeroDocType, // documents data - doc: HeroDocument // RxDocument - ) { - console.log('insert to ' + this.name + '-collection: ' + doc.firstName); - }, - false // not async -); - -/** - * use the database - */ - -// insert a document -const hero: HeroDocument = await myDatabase.heroes.insert({ - passportId: 'myId', - firstName: 'piotr', - lastName: 'potter', - age: 5 -}); - -// access a property -console.log(hero.firstName); - -// use a orm method -hero.scream('AAH!'); - -// use a static orm method from the collection -const amount: number = await myDatabase.heroes.countAllDocuments(); -console.log(amount); - -/** - * clean up - */ -myDatabase.close(); -``` - ---- - -## Why NoSQL Powers Modern UI Apps - -import {VideoBox} from '@site/src/components/video-box'; - -# Why UI applications need NoSQL - -[RxDB](https://rxdb.info), a client side, offline first, JavaScript database, is now several years old. -Often new users appear in the chat and ask for that one simple feature: -They want to store and query **relational data**. - -> So why not just implement SQL? - -All these client databases out there have on some kind of document based, NoSQL like, storage engine. PouchDB, Firebase, AWS Datastore, RethinkDB's [Horizon](https://github.com/rethinkdb/horizon), Meteor's [Minimongo](https://github.com/mWater/minimongo), [Parse](https://parseplatform.org/), [Realm](https://realm.io/). They all do not have real relational data. - -They might have some kind of weak relational foreign keys like the [RxDB Population](./population.md) -or the [relational models](https://docs.amplify.aws/lib/datastore/relational/q/platform/js/) of AWS Datastore. -But these relations are weak. The foreign keys are not enforced to be valid like in PostgreSQL, and you cannot query -the rows with complex subqueries over different tables or collections and then make mutations based on the result. - -There must be a reason for that. In fact, there are multiple of them and in the following I want to show you why you can neither have, nor want real relational data when you have a client-side database with replication. - - - -## Transactions do not work with humans involved - -On the server side, transactions are used to run steps of logic inside of a self contained `unit of work`. The database system ensures that multiple transactions do not run in parallel or interfere with each other. -This works well because on the server side you can predict how longer everything takes. It can be ensured that one transaction does not block everything else for too long which would make the system not responding anymore to other requests. - -When you build a UI based application that is used by a real human, you can no longer predict how long anything takes. -The user clicks the edit button and expects to not have anyone else change the document while the user is in edit mode. -Using a transaction to ensure nothing is changed in between, is not an option because the transaction could be open for a long -time and other background tasks, like replication, would no longer work. - -So whenever a human is involved, this kind of logic has to be implemented using other strategies. Most NoSQL databases like [RxDB](./) or [CouchDB](./replication-couchdb.md) use a system based on [revision and conflicts](./transactions-conflicts-revisions.md) to handle these. - -## Transactions do not work with offline-first - -When you want to build an [offline-first](./offline-first.md) application, it is assumed that the user can also read and write data, even when the device has lost the connection to the backend. -You could use database transactions on writes to the client's database state, but enforcing a transaction boundary across other instances like clients or servers, is not possible when there is no connection. - - - -On the client you could run an update query where all `color: red` rows are changed to `color: blue`, but this would not guarantee that there will still be other `red` documents when the client goes online again and restarts the replication with the server. - -```sql -UPDATE docs -SET docs.color = 'red' -WHERE docs.color = 'blue'; -``` - -## Relational queries in NoSQL - -What most people want from a relational database, is to run queries over multiple tables. -Some people think that they cannot do that with NoSQL, so let me explain. - -Let's say you have two tables with `customers` and `cities` where each city has an `id` and each customer has a `city_id`. You want to get every customer that resides in `Tokyo`. With SQL, you would use a query like this: - -```sql -SELECT * -FROM city -WHERE city.name = 'Tokyo' -LEFT JOIN customer ON customer.city_id = city.id; -``` - -With **NoSQL** you can just do the same, but you have to write it manually: - -```typescript -const cityDocument = await db.cities.findOne().where('name').equals('Tokyo').exec(); -const customerDocuments = await db.customers.find().where('city_id').equals(cityDocument.id).exec(); -``` - -So what are the differences? The SQL version would run faster on a remote database server because it would aggregate all data there and return only the customers as result set. But when you have a local database, it is not really a difference. Querying the two tables by hand would have about the same performance as a JavaScript implementation of SQL that is running locally. - -The main benefit from using SQL is, that the SQL query runs inside of a **single transaction**. When a change to one of our two tables happens, while our query runs, the SQL database will ensure that the write does not affect the result of the query. This could happen with NoSQL, while you retrieve the city document, the customer table gets changed and your result is not correct for the dataset that was there when you started the querying. As a workaround, you could observe the database for changes and if a change happened in between, you have to re-run everything. - - - -## Reliable replication - -In an offline first app, your data is replicated from your backend servers to your users and you want it to be reliable. -The replication is **reliable** when, no matter what happens, every online client is able to run a replication -and end up with the **exact same** database state as any other client. - -Implementing a reliable replication protocol is hard because of the circumstances of your app: - -- Your users have unknown devices. -- They have an unknown internet speed. -- They can go offline or online at any time. -- Clients can be offline for a several days with un-synced changes. -- You can have many users at the same time. -- The users can do many database writes at the same time to the same entities. - -Now lets say you have a SQL database and one of your users, called Alice, runs a query that mutates some rows, based on a condition. - -```sql -# mark all items out of stock as inStock=FALSE -UPDATE - Table_A -SET - Table_A.inStock = FALSE -FROM - Table_A -WHERE - Table_A.amountInStock = 0 -``` - -At first, the query runs on the local database of Alice and everything is fine. - -But at the same time Bob, the other client, updates a row and sets `amountInStock` from `0` to `1`. -Now Bob's client replicates the changes from Alice and runs them. Bob will end up with a different database state than Alice because on one of the rows, the `WHERE` condition was not met. This is not what we want, so our replication protocol should be able to fix it. For that it has to reduce all mutations into a deterministic state. - -Let me loosely describe how "many" SQL replications work: - -Instead of just running all replicated queries, we remember a list of all past queries. When a new query comes in that happened `before` our last query, we roll back the previous queries, run the new query, and then re-execute our own queries on top of that. For that to work, all queries need a timestamp so we can order them correctly. But you cannot rely on the clock that is running at the client. Client side clocks drift, they can run in a different speed or even a malicious client modifies the clock on purpose. So instead of a normal timestamp, we have to use a [Hybrid Logical Clock](https://jaredforsyth.com/posts/hybrid-logical-clocks/) that takes a client generated id and the number of the clients query into account. Our timestamp will then look like `2021-10-04T15:29.40.273Z-0000-eede1195b7d94dd5`. These timestamps can be brought into a deterministic order and each client can run the replicated queries in the same order. - -While this sounds easy and realizable, we have some problems: -This kind of replication works great when you replicate between multiple SQL servers. It does not work great when you replicate between a single server and many clients. - -1. As mentioned above, clients can be offline for a long time which could require us to do many and heavy rollbacks on each client when someone comes back after a long time and replicates the change. -2. We have many clients where many changes can appear and our database would have to roll back many times. -3. During the rollback, the database cannot be used for read queries. -4. It is required that each client downloads and keeps the whole query history. - -With **NoSQL**, replication works different. A new client downloads all current documents and each time a document changes, that document is downloaded again. Instead of replicating the query that leads to a data change, we just replicate the changed data itself. Of course, we could do the same with SQL and just replicate the affected rows of a query, like WatermelonDB [does it](https://youtu.be/uFvHURTRLxQ?t=1133). This was a clever way to go for WatermelonDB, because it was initially made for React Native and did want to use the fast SQLite instead of the slow [AsyncStorage](https://medium.com/@Sendbird/extreme-optimization-of-asyncstorage-in-react-native-b2a1e0107b34). But in a more general view, it defeats the whole purpose of having a replicating relational database because you have transactions locally, but these transactions become **meaningless** as soon as the data goes through the replication layer. - - - -## Server side validation - -Whenever there is client-side input, it must be validated on the server. -On a NoSQL database, validating a changed document is trivial. The client sends the changed document to the server, and the server can then check if the user was allowed to modify that one document and if the applied changes are ok. - -Safely validating a SQL query is up to impossible. - - You first need a way to parse the query with all this complex SQL syntax and keywords. - - You have to ensure that the query does not DOS your system. - - Then you check which rows would be affected when running the query and if the user was allowed to change them - - Then you check if the mutation to that rows are valid. - -For simple queries like an insert/update/delete to a single row, this might be doable. But a query with 4 `LEFT JOIN` will be hard. - -## Event optimization - -With NoSQL databases, each write event always affects exactly one document. This makes it easy to optimize the processing of events at the client. For example instead of handling multiple updates to the same document, when the user comes online again, you could skip everything but the last event. - -Similar to that you can optimize observable query results. When you query the `customers` table you get a query result of 10 customers. Now a new customer is added to the table and you want to know how the new query results look like. You could analyze the event and now you know that you only have to add the new customer to the previous results set, instead of running the whole query again. These types of optimizations can be run with all NoSQL queries and even work with `limit` and `skip` operators. In RxDB this all happens in the background with the [EventReduce algorithm](https://github.com/pubkey/event-reduce) that calculates new query results on incoming changes. - -These optimizations do not really work with relational data. A change to one table could affect a query to any other tables. and you could not just calculate the new results based on the event. You would always have to re-run the full query to get the updated results. - -## Migration without relations - -Sooner or later you change the layout of your data. You update the schema and you also have to migrate the stored rows/documents. In NoSQL this is often not a big deal because all of your documents are modeled as self containing piece of data. There is an old version of the document and you have a function that transforms it into the new version. - -With relational data, nothing is self-contained. The relevant data for the migration of a single row could be inside any other table. So when changing the schema, it will be important which table to migrate first and how to orchestrate the migration or relations. - -On client side applications, this is even harder because the client can close the application at any time and the migration must be able to continue. - -## Everything can be downgraded to NoSQL - -To use an offline first database in the frontend, you have to make it compatible with your backend APIs. -Making software things compatible often means you have to find the **lowest common denominator**. -When you have SQLite in the frontend and want to replicate it with the backend, the backend also has to use SQLite. You cannot even use PostgreSQL because it has a different SQL dialect and some queries might fail. But you do not want to let the frontend dictate which technologies to use in the backend just to make replication work. - -With NoSQL, you just have documents and writes to these documents. You can build a document based layer on top of everything by **removing** functionality. It can be built on top of SQL, but also on top of a graph database or even on top of a key-value store like [levelDB](./adapters.md#leveldown) or [FoundationDB](./rx-storage-foundationdb.md). - -With that document layer you can build a [Sync Engine](./replication.md) that serves documents sorted by the last update time and there you have a realtime replication. - -## Caching query results - -Memory is limited and this is especially true for client side applications where you never know how much free RAM the device really has. You want to have a fast realtime UI, so your database must be able to cache query results. - -When you run a SQL query like `SELECT ..` the result of it can be anything. An `array`, a `number`, a `string`, a single row, it depends on how the query goes on. So the caching strategy can only be to keep the result in memory, once for each query. -This scales very bad because the more queries you run, the more results you have to store in memory. - -When you make a query to a NoSQL collection, you always know how the result will look like. It is a list of documents, based on the collection's schema (if you have one). The result set is stored in memory, but because you get similar documents for different queries to the same collection, we can de-duplicated the documents. So when multiple queries return the same document, we only have it in the cache **once** and each query caches point to the same memory object. So no matter how many queries you make, your cache maximum is the collection size. - -## TypeScript support - -Modern web apps are build with TypeScript and you want the transpiler to know the types of your query result so it can give you build time errors when something does not match. This is quite easy on document based systems. The typings of for each document of a collection can be generated from the schema, and all queries to that collection will always return the given document type. With SQL you have to manually write the typings for each query by hand because it can contain all these aggregate functions that affect the type of the query's result. - - - - - -## What you lose with NoSQL - -- You can not run relational queries across tables inside a single transaction. -- You can not mutate documents based on a `WHERE` clause, in a single transaction. -- You need to resolve replication conflicts on a per-document basis. - -## But there is database XY - -Yes, there are SQL databases out there that run on the client side or have replication, but not both. - -- WebSQL / [sql.js](https://github.com/sql-js/sql.js/): In the past there was **WebSQL** in the browser. It was a direct mapping to SQLite because all browsers used the SQLite implementation. You could store relational data in it, but there was no concept of replication at any point in time. **sql.js** is an SQLite complied to JavaScript. It has not replication and it has (for now) no persistent storage, everything is stored in memory. -- WatermelonDB is a SQL databases that runs in the client. WatermelonDB uses a document-based replication that is not able to replicate relational queries. -- Cockroach / Spanner/ PostgreSQL etc. are SQL databases with replication. But they run on servers, not on clients, so they can make different trade offs. - -# Further read - -- Cockroach Labs: [Living Without Atomic Clocks](https://www.cockroachlabs.com/blog/living-without-atomic-clocks/) -- [Transactions, Conflicts and Revisions in RxDB](./transactions-conflicts-revisions.md) -- [Why MongoDB, Cassandra, HBase, DynamoDB, and Riak will only let you perform transactions on a single data item](https://dbmsmusings.blogspot.com/2015/10/why-mongodb-cassandra-hbase-dynamodb_28.html) - -- `Make a PR to this file if you have more interesting links to that topic` diff --git a/docs/llms.txt b/docs/llms.txt deleted file mode 100644 index 950e67c92ee..00000000000 --- a/docs/llms.txt +++ /dev/null @@ -1,139 +0,0 @@ -# RxDB Documentation - -> Authoritative reference documentation for RxDB, a reactive, local-first NoSQL database for JavaScript with offline support and explicit replication. - -This file contains links to documentation sections following the llmstxt.org standard. - -## Table of Contents - -- [Alternatives for realtime local-first JavaScript applications and local databases](https://rxdb.info/alternatives.md): Explore real-time, local-first JS alternatives to RxDB. Compare Firebase, Meteor, AWS, CouchDB, and more for robust, seamless web/mobile app develo... -- [RxDB as a Database in an Angular Application](https://rxdb.info/articles/angular-database.md): Level up your Angular projects with RxDB. Build real-time, resilient, and responsive apps powered by a reactive NoSQL database right in the browser. -- [Build Smarter Offline-First Angular Apps - How RxDB Beats IndexedDB Alone](https://rxdb.info/articles/angular-indexeddb.md): Discover how to harness IndexedDB in Angular with RxDB for robust offline apps. Learn reactive queries, advanced features, and more. -- [Benefits of RxDB & Browser Databases](https://rxdb.info/articles/browser-database.md): Find out why RxDB is the go-to solution for browser databases. See how it boosts performance, simplifies replication, and powers real-time UIs. -- [Browser Storage - RxDB as a Database for Browsers](https://rxdb.info/articles/browser-storage.md): Explore RxDB for browser storage its advantages, limitations, and why it outperforms SQL databases in web applications for enhanced efficiency -- [Empower Web Apps with Reactive RxDB Data-base](https://rxdb.info/articles/data-base.md): Explore RxDB's reactive data-base solution for web and mobile. Enable offline-first experiences, real-time syncing, and secure data handling with e... -- [Embedded Database, Real-time Speed - RxDB](https://rxdb.info/articles/embedded-database.md): Unleash the power of embedded databases with RxDB. Explore real-time replication, offline access, and reactive queries for modern JavaScript apps. -- [RxDB - Firebase Realtime Database Alternative to Sync With Your Own Backend](https://rxdb.info/articles/firebase-realtime-database-alternative.md): Looking for a Firebase Realtime Database alternative? RxDB offers a fully offline, vendor-agnostic NoSQL solution with advanced conflict resolution... -- [RxDB - Firestore Alternative to Sync with Your Own Backend](https://rxdb.info/articles/firestore-alternative.md): Looking for a Firestore alternative? RxDB is a local-first, NoSQL database that syncs seamlessly with any backend, offers rich offline capabilities... -- [Supercharge Flutter Apps with the RxDB Database](https://rxdb.info/articles/flutter-database.md): Harness RxDB's reactive database to bring real-time, offline-first data storage and syncing to your next Flutter application. -- [RxDB - The Ultimate JS Frontend Database](https://rxdb.info/articles/frontend-database.md): Discover how RxDB, a powerful JavaScript frontend database, boosts offline access, caching, and real-time updates to supercharge your web apps. -- [ideas for articles](https://rxdb.info/articles/ideas.md): - storing and searching through 1mio emails in a browser database -- [RxDB In-Memory NoSQL - Supercharge Real-Time Apps](https://rxdb.info/articles/in-memory-nosql-database.md): Discover how RxDB's in-memory NoSQL engine delivers blazing speed for real-time apps, ensuring responsive experiences and seamless data sync. -- [IndexedDB Max Storage Size Limit - Detailed Best Practices](https://rxdb.info/articles/indexeddb-max-storage-limit.md): Learn how browsers enforce IndexedDB storage size limits, how to test and handle quota exceeded errors, and best practices for storing large amount... -- [RxDB - The Perfect Ionic Database](https://rxdb.info/articles/ionic-database.md): Supercharge your Ionic hybrid apps with RxDB's offline-first database. Experience real-time sync, top performance, and easy replication. -- [RxDB - Local Ionic Storage with Encryption, Compression & Sync](https://rxdb.info/articles/ionic-storage.md): The best Ionic storage solution? RxDB empowers your hybrid apps with offline-first capabilities, secure encryption, data compression, and seamless ... -- [Local JavaScript Vector Database that works offline](https://rxdb.info/articles/javascript-vector-database.md): Create a blazing-fast vector database in JavaScript. Leverage RxDB and transformers.js for instant, offline semantic search - no servers required! -- [RxDB as a Database in a jQuery Application](https://rxdb.info/articles/jquery-database.md): Level up your jQuery-based projects with RxDB. Build real-time, resilient, and responsive apps powered by a reactive NoSQL database right in the br... -- [JSON-Based Databases - Why NoSQL and RxDB Simplify App Development](https://rxdb.info/articles/json-based-database.md): Dive into how JSON-based databases power modern UI-centric apps, why NoSQL often outperforms SQL for dynamic data, how SQLite accommodates JSON, an... -- [RxDB - The JSON Database Built for JavaScript](https://rxdb.info/articles/json-database.md): Experience a powerful JSON database with RxDB, built for JavaScript. Store, sync, and compress your data seamlessly across web and mobile apps. -- [What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications](https://rxdb.info/articles/local-database.md): An in-depth exploration of local databases and why RxDB excels as a local-first solution for JavaScript applications. -- [Why Local-First Software Is the Future and its Limitations](https://rxdb.info/articles/local-first-future.md): Discover how local-first transforms web apps, boosts offline resilience, and why instant user feedback is becoming the new normal. -- [LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite](https://rxdb.info/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.md): Compare LocalStorage, IndexedDB, Cookies, OPFS, and WASM-SQLite for web storage, performance, limits, and best practices for modern web apps. -- [Using localStorage in Modern Applications - A Comprehensive Guide](https://rxdb.info/articles/localstorage.md): This guide explores localStorage in JavaScript web apps, detailing its usage, limitations, and alternatives like IndexedDB and AsyncStorage. -- [Real-Time & Offline - RxDB for Mobile Apps](https://rxdb.info/articles/mobile-database.md): Explore RxDB as your reliable mobile database. Enjoy offline-first capabilities, real-time sync, and seamless integration for hybrid app development. -- [RxDB – The Ultimate Offline Database with Sync and Encryption](https://rxdb.info/articles/offline-database.md): Discover how RxDB serves as a powerful offline database, offering real-time synchronization, secure encryption, and an offline-first approach for m... -- [Building an Optimistic UI with RxDB](https://rxdb.info/articles/optimistic-ui.md): Learn how to build an Optimistic UI with RxDB for instant and reliable UI updates on user interactions -- [RxDB as a Database for Progressive Web Apps (PWA)](https://rxdb.info/articles/progressive-web-app-database.md): Discover how RxDB supercharges Progressive Web Apps with real-time sync, offline-first capabilities, and lightning-fast data handling. -- [RxDB as a Database for React Applications](https://rxdb.info/articles/react-database.md): earn how the RxDB database supercharges React apps with offline access, real-time updates, and smooth data flow. Boost performance and engagement. -- [IndexedDB Database in React Apps - The Power of RxDB](https://rxdb.info/articles/react-indexeddb.md): Discover how RxDB simplifies IndexedDB in React, offering reactive queries, offline-first capability, encryption, compression, and effortless integ... -- [React Native Encryption and Encrypted Database/Storage](https://rxdb.info/articles/react-native-encryption.md): Secure your React Native app with RxDB encryption. Learn why it matters, how to implement encrypted databases, and best practices to protect user d... -- [ReactJS Storage - From Basic LocalStorage to Advanced Offline Apps with RxDB](https://rxdb.info/articles/reactjs-storage.md): Discover how to implement reactjs storage using localStorage for quick key-value data, then move on to more robust offline-first approaches with Rx... -- [What Really Is a Realtime Database?](https://rxdb.info/articles/realtime-database.md): Discover how RxDB merges realtime replication and dynamic updates to deliver seamless data sync across browsers, devices, and servers - instantly. -- [RxDB as a Database in a Vue.js Application](https://rxdb.info/articles/vue-database.md): Level up your Vue projects with RxDB. Build real-time, resilient, and responsive apps powered by a reactive NoSQL database right in the browser. -- [IndexedDB Database in Vue Apps - The Power of RxDB](https://rxdb.info/articles/vue-indexeddb.md): Learn how RxDB simplifies IndexedDB in Vue, offering reactive queries, offline-first capabilities, encryption, compression, and effortless integrat... -- [WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport](https://rxdb.info/articles/websockets-sse-polling-webrtc-webtransport.md): Learn the unique benefits and pitfalls of each real-time tech. Make informed decisions on WebSockets, SSE, Polling, WebRTC, and WebTransport. -- [Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression](https://rxdb.info/articles/zero-latency-local-first.md): Build blazing-fast, zero-latency local first apps with RxDB. Gain instant UI responses, robust offline capabilities, end-to-end encryption, and dat... -- [Backup](https://rxdb.info/backup.md): Easily back up your RxDB database to JSON files and attachments on the filesystem with the Backup Plugin - ensuring reliable Node.js data protection. -- [Capacitor Database Guide - SQLite, RxDB & More](https://rxdb.info/capacitor-database.md): Explore Capacitor's top data storage solutions - from key-value to real-time databases. Compare SQLite, RxDB, and more in this in-depth guide. -- [Cleanup](https://rxdb.info/cleanup.md): Optimize storage and speed up queries with RxDB's Cleanup Plugin, automatically removing old deleted docs while preserving replication states. -- [Contribute](https://rxdb.info/contribute.md): Got a fix or fresh idea? Learn how to contribute to RxDB, run tests, and shape the future of this cutting-edge NoSQL database for JavaScript. -- [CRDT - Conflict-free replicated data type Database](https://rxdb.info/crdt.md): Learn how RxDB's CRDT Plugin resolves document conflicts automatically in distributed systems, ensuring seamless merges and consistent data. -- [Data Migration](https://rxdb.info/data-migration.md): This documentation page has been moved to [here](./migration-schema.md) -- [Development Mode](https://rxdb.info/dev-mode.md): Enable checks & validations with RxDB Dev Mode. Ensure proper API use, readable errors, and schema validation during development. Avoid in production. -- [Downsides of Local First / Offline First](https://rxdb.info/downsides-of-offline-first.md): Discover the hidden pitfalls of local-first apps. Learn about storage limits, conflicts, and real-time illusions before building your offline solut... -- [Electron Database - Storage adapters for SQLite, Filesystem and In-Memory](https://rxdb.info/electron-database.md): Harness the database power of SQLite, Filesystem, and in-memory storage in Electron with RxDB. Build fast, offline-first apps that sync in real time. -- [Seamless Electron Storage with RxDB](https://rxdb.info/electron.md): Use the RxDB Electron Plugin to share data between main and renderer processes. Enjoy quick queries, real-time sync, and robust offline support. -- [Encryption](https://rxdb.info/encryption.md): Explore RxDB's 🔒 encryption plugin for enhanced data security in web and native apps, featuring password-based encryption and secure storage. -- [Error Messages](https://rxdb.info/errors.md): Learn how RxDB throws RxErrors with codes and parameters. Keep builds lean, yet unveil full messages in development via the DevMode plugin. -- [Fulltext Search 👑](https://rxdb.info/fulltext-search.md): Master local fulltext search with RxDB's FlexSearch plugin. Enjoy real-time indexing, efficient queries, and offline-first support made easy. -- [Installation](https://rxdb.info/install.md): Learn how to install RxDB via npm, configure polyfills, and fix global variable errors in Angular or Webpack for a seamless setup. -- [Key Compression](https://rxdb.info/key-compression.md): import {Steps} from '@site/src/components/steps'; -- [Leader Election](https://rxdb.info/leader-election.md): RxDB comes with a leader-election which elects a leading instance between different instances in the same javascript runtime. -- [RxDB Logger Plugin - Track & Optimize](https://rxdb.info/logger.md): Take control of your RxDatabase logs. Monitor every write, query, or attachment retrieval to swiftly diagnose and fix performance bottlenecks. -- [Streamlined RxDB Middleware](https://rxdb.info/middleware.md): Enhance your RxDB workflow with pre and post hooks. Quickly add custom validations, triggers, and events to streamline your asynchronous operations. -- [Seamless Schema Data Migration with RxDB](https://rxdb.info/migration-schema.md): Upgrade your RxDB collections without losing data. Learn how to seamlessly migrate schema changes and keep your apps running smoothly. -- [Migration Storage](https://rxdb.info/migration-storage.md): Effortlessly migrate your data between storages in RxDB using the Storage Migration plugin. Retain your documents when switching storages or major ... -- [RxDB - The Real-Time Database for Node.js](https://rxdb.info/nodejs-database.md): Discover how RxDB brings flexible, reactive NoSQL to Node.js. Scale effortlessly, persist data, and power your server-side apps with ease. -- [RxDB NoSQL Performance Tips](https://rxdb.info/nosql-performance-tips.md): Skyrocket your NoSQL speed with RxDB tips. Learn about bulk writes, optimized queries, and lean plugin usage for peak performance. -- [Local First / Offline First](https://rxdb.info/offline-first.md): Local-First software stores data on client devices for seamless offline and online functionality, enhancing user experience and efficiency. -- [ORM](https://rxdb.info/orm.md): Like [mongoose](http://mongoosejs.com/docs/guide.html#methods), RxDB has ORM-capabilities which can be used to add specific behavior to documents a... -- [RxDB Docs](https://rxdb.info/overview.md): RxDB Documentation Overview -- [Creating Plugins](https://rxdb.info/plugins.md): Creating your own plugin is very simple. A plugin is basically a javascript-object which overwrites or extends RxDB's internal classes, prototypes,... -- [Populate and Link Docs in RxDB](https://rxdb.info/population.md): Learn how to reference and link documents across collections in RxDB. Discover easy population without joins and handle complex relationships. -- [Efficient RxDB Queries via Query Cache](https://rxdb.info/query-cache.md): Learn how RxDB's Query Cache boosts performance by reusing queries. Discover its default replacement policy and how to define your own. -- [Optimize Client-Side Queries with RxDB](https://rxdb.info/query-optimizer.md): Harness real-world data to fine-tune queries. The build-time RxDB Optimizer finds the perfect index, boosting query speed in any environment. -- [🚀 Quickstart](https://rxdb.info/quickstart.md): Learn how to build a realtime app with RxDB. Follow this quickstart for setup, schema creation, data operations, and real-time syncing. -- [React Native Database - Sync & Store Like a Pro](https://rxdb.info/react-native-database.md): Discover top React Native local database solutions - AsyncStorage, SQLite, RxDB, and more. Build offline-ready apps for iOS, Android, and Windows w... -- [React](https://rxdb.info/react.md): import {Tabs} from '@site/src/components/tabs'; -- [Signals & Custom Reactivity with RxDB](https://rxdb.info/reactivity.md): Level up reactivity with Angular signals, Vue refs, or Preact signals in RxDB. Learn how to integrate custom reactivity to power your dynamic UI. -- [RxDB 10.0.0 - Built for the Future](https://rxdb.info/releases/10.0.0.md): Experience faster, future-proof data handling in RxDB 10.0. Explore new storage interfaces, composite keys, and major performance upgrades. -- [RxDB 11 - WebWorker Support & More](https://rxdb.info/releases/11.0.0.md): RxDB 11.0 brings Worker-based storage for multi-core performance gains. Explore the major changes and migrate seamlessly to harness new speeds. -- [RxDB 12.0.0 - Clean, Lean & Mean](https://rxdb.info/releases/12.0.0.md): Upgrade to RxDB 12.0.0 for blazing-fast queries, streamlined replication, and better index usage. Explore new features and power up your app. -- [RxDB 13.0.0 - A New Era of Replication](https://rxdb.info/releases/13.0.0.md): Discover RxDB 13.0's brand-new replication protocol, faster performance, and real-time collaboration for a seamless offline-first experience. -- [RxDB 14.0 - Major Changes & New Features](https://rxdb.info/releases/14.0.0.md): Discover RxDB 14.0, a major release packed with API changes, improved performance, and streamlined storage, ensuring faster data operations than ever. -- [RxDB 15.0.0 - Major Migration Overhaul](https://rxdb.info/releases/15.0.0.md): Discover RxDB 15.0.0, featuring new migration strategies, replication improvements, and lightning-fast performance to supercharge your app. -- [RxDB 16.0.0 - Efficiency Redefined](https://rxdb.info/releases/16.0.0.md): Meet RxDB 16.0.0 - major refactorings, improved performance, and easy migrations. Experience a better, faster, and more stable database solution to... -- [RxDB 17.0.0](https://rxdb.info/releases/17.0.0.md): RxDB 17 introduces improved reactivity APIs, better debugging, breaking storage fixes, and multiple plugins graduating from beta. -- [Meet RxDB 8.0.0 - New Defaults & Performance](https://rxdb.info/releases/8.0.0.md): Discover how RxDB 8.0.0 boosts performance, simplifies schema handling, and streamlines reactive data updates for modern apps. -- [RxDB 9.0.0 - Faster & Simpler](https://rxdb.info/releases/9.0.0.md): Discover RxDB 9.0.0's streamlined plugins, top-level schema definitions, and improved dev-mode. Experience a simpler, faster real-time database. -- [Appwrite Realtime Sync for Local-First Apps](https://rxdb.info/replication-appwrite.md): Sync RxDB with Appwrite for local-first apps. Supports real-time updates, offline mode, conflict resolution, and secure push/pull replication. -- [RxDB's CouchDB Replication Plugin](https://rxdb.info/replication-couchdb.md): Replicate your RxDB collections with CouchDB the fast way. Enjoy faster sync, easier conflict handling, and flexible storage using this modern plugin. -- [Smooth Firestore Sync for Offline Apps](https://rxdb.info/replication-firestore.md): Leverage RxDB to enable real-time, offline-first replication with Firestore. Cut cloud costs, resolve conflicts, and speed up your app. -- [GraphQL Replication](https://rxdb.info/replication-graphql.md): The GraphQL replication provides handlers for GraphQL to run [replication](./replication.md) with GraphQL as the transportation layer. -- [HTTP Replication](https://rxdb.info/replication-http.md): Learn how to establish HTTP replication between RxDB clients and a Node.js Express server for data synchronization. -- [MongoDB Realtime Sync Engine for Local-First Apps](https://rxdb.info/replication-mongodb.md): Build real-time, offline-capable apps with RxDB + MongoDB replication. Push/pull changes, use change streams, and keep data in sync across devices. -- [RxDB & NATS - Realtime Sync](https://rxdb.info/replication-nats.md): Seamlessly sync your RxDB data with NATS for real-time, two-way replication. Handle conflicts, errors, and retries with ease. -- [Seamless P2P Data Sync](https://rxdb.info/replication-p2p.md): Discover how replication-webrtc ensures secure P2P data sync and real-time collaboration with RxDB. Explore the future of offline-first apps! -- [RxDB Server Replication](https://rxdb.info/replication-server.md): The *Server Replication Plugin* connects to the replication endpoint of an [RxDB Server Replication Endpoint](./rx-server.md#replication-endpoint) ... -- [Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync](https://rxdb.info/replication-supabase.md): Build real-time, offline-capable apps with RxDB + Supabase. Push/pull changes via PostgREST, stream updates with Realtime, and keep data in sync ac... -- [WebRTC P2P Replication with RxDB - Sync Browsers and Devices](https://rxdb.info/replication-webrtc.md): Learn to set up peer-to-peer WebRTC replication with RxDB. Bypass central servers and enjoy secure, low-latency data sync across all clients. -- [Websocket Replication](https://rxdb.info/replication-websocket.md): With the websocket replication plugin, you can spawn a websocket server from a RxDB database in Node.js and replicate with it. -- [⚙️ RxDB realtime Sync Engine for Local-First Apps](https://rxdb.info/replication.md): Replicate data in real-time with RxDB's offline-first Sync Engine. Learn about efficient syncing, conflict resolution, and advanced multi-tab support. -- [Attachments](https://rxdb.info/rx-attachment.md): Learn how to store and manage binary data like images or files in RxDB using attachments. Discover features, performance benefits, encryption, comp... -- [Master Data - Create and Manage RxCollections](https://rxdb.info/rx-collection.md): Discover how to create, manage, and migrate documents in RxCollections. Harness real-time data flows, secure encryption, and powerful performance i... -- [RxDatabase - The Core of Your Realtime Data](https://rxdb.info/rx-database.md): Get started with RxDatabase and integrate multiple storages. Learn to create, encrypt, and optimize your realtime database today. -- [RxDocument](https://rxdb.info/rx-document.md): Master RxDB's RxDocument - Insert, find, update, remove, and more for streamlined data handling in modern apps. -- [Master Local Documents in RxDB](https://rxdb.info/rx-local-document.md): Effortlessly store custom metadata and app settings in RxDB. Learn how Local Documents keep data flexible, secure, and easy to manage. -- [RxPipeline - Automate Data Flows in RxDB](https://rxdb.info/rx-pipeline.md): Discover how RxPipeline automates your data workflows. Seamlessly process writes, manage leader election, and ensure crash-safe operations in RxDB. -- [RxQuery](https://rxdb.info/rx-query.md): Master RxQuery in RxDB - find, update, remove documents using Mango syntax, chained queries, real-time observations, indexing, and more. -- [Design Perfect Schemas in RxDB](https://rxdb.info/rx-schema.md): Learn how to define, secure, and validate your data in RxDB. Master primary keys, indexes, encryption, and more with the RxSchema approach. -- [RxServer Scaling - Vertical or Horizontal](https://rxdb.info/rx-server-scaling.md): Discover vertical and horizontal techniques to boost RxServer. Learn multiple processes, worker threads, and replication for limitless performance. -- [RxDB Server - Deploy Your Data](https://rxdb.info/rx-server.md): Launch a secure, high-performance server on top of your RxDB database. Enable REST, replication endpoints, and seamless data syncing with RxServer. -- [RxState - Reactive Persistent State with RxDB](https://rxdb.info/rx-state.md): Get real-time, persistent state without the hassle. RxState integrates easily with signals and hooks, ensuring smooth updates across tabs and devices. -- [DenoKV RxStorage](https://rxdb.info/rx-storage-denokv.md): With the DenoKV [RxStorage](./rx-storage.md) layer for [RxDB](https://rxdb.info), you can run a fully featured **NoSQL database** on top of the [De... -- [RxDB Dexie.js Database - Fast, Reactive, Sync with Any Backend](https://rxdb.info/rx-storage-dexie.md): Use Dexie.js to power RxDB in the browser. Enjoy quick setup, Dexie addons, and reliable storage for small apps or prototypes. -- [Blazing-Fast Node Filesystem Storage](https://rxdb.info/rx-storage-filesystem-node.md): Get up and running quickly with RxDB's Filesystem Node RxStorage. Store data in JSON, embrace multi-instance support, and enjoy a simpler database. -- [RxDB on FoundationDB - Performance at Scale](https://rxdb.info/rx-storage-foundationdb.md): Combine FoundationDB's reliability with RxDB's indexing and schema validation. Build scalable apps with faster queries and real-time data. -- [Instant Performance with IndexedDB RxStorage](https://rxdb.info/rx-storage-indexeddb.md): Choose IndexedDB RxStorage for unmatched speed and minimal build size. Perfect for fast-performing apps that demand reliable, lightweight data solu... -- [Fastest RxDB Starts - Localstorage Meta Optimizer](https://rxdb.info/rx-storage-localstorage-meta-optimizer.md): Wrap any RxStorage with localStorage metadata to slash initial load by up to 200ms. Unlock speed with this must-have RxDB Premium plugin. -- [RxDB LocalStorage - The Easiest Way to Persist Data in Your Web App](https://rxdb.info/rx-storage-localstorage.md): Discover how to quickly set up RxDB's LocalStorage-based storage as the recommended default. Learn its benefits, limitations, and why it’s perfect ... -- [Blazing-Fast Memory Mapped RxStorage](https://rxdb.info/rx-storage-memory-mapped.md): Boost your app's performance with Memory Mapped RxStorage. Query and write in-memory while seamlessly persisting data to your chosen storage. -- [Instant Performance with Memory Synced RxStorage](https://rxdb.info/rx-storage-memory-synced.md): Accelerate RxDB with in-memory storage replicated to disk. Enjoy instant queries, faster loads, and unstoppable performance for your web apps. -- [Lightning-Fast Memory Storage for RxDB](https://rxdb.info/rx-storage-memory.md): Use Memory RxStorage for a high-performance, JavaScript in-memory database. Built for speed, making it perfect for unit tests and rapid prototyping. -- [Unlock MongoDB Power with RxDB](https://rxdb.info/rx-storage-mongodb.md): Combine RxDB's real-time sync with MongoDB's scalability. Harness the MongoDB RxStorage to seamlessly expand your database capabilities. -- [Supercharged OPFS Database with RxDB](https://rxdb.info/rx-storage-opfs.md): Discover how to harness the Origin Private File System with RxDB's OPFS RxStorage for unrivaled performance and security in client-side data storage. -- [📈 Discover RxDB Storage Benchmarks](https://rxdb.info/rx-storage-performance.md): Explore real-world benchmarks comparing RxDB's persistent and semi-persistent storages. Discover which storage option delivers the fastest performa... -- [PouchDB RxStorage - Migrate for Better Performance](https://rxdb.info/rx-storage-pouchdb.md): Discover why PouchDB RxStorage is deprecated in RxDB. Learn its legacy, performance drawbacks, and how to upgrade to a faster solution. -- [Remote RxStorage](https://rxdb.info/rx-storage-remote.md): The Remote [RxStorage](./rx-storage.md) is made to use a remote storage and communicate with it over an asynchronous message channel. -- [Sharding RxStorage 👑](https://rxdb.info/rx-storage-sharding.md): With the sharding plugin, you can improve the write and query times of **some** `RxStorage` implementations. -- [Boost Performance with SharedWorker RxStorage](https://rxdb.info/rx-storage-shared-worker.md): Tap into single-instance storage with RxDB's SharedWorker. Improve efficiency, cut duplication, and keep your app lightning-fast across tabs. -- [RxDB SQLite RxStorage for Hybrid Apps](https://rxdb.info/rx-storage-sqlite.md): Unlock seamless persistence with SQLite RxStorage. Explore usage in hybrid apps, compare performance, and leverage advanced features like attachments. -- [Turbocharge RxDB with Worker RxStorage](https://rxdb.info/rx-storage-worker.md): Offload RxDB queries to WebWorkers or Worker Threads, freeing the main thread and boosting performance. Experience smoother apps with Worker RxStor... -- [⚙️ RxStorage Layer - Choose the Perfect RxDB Storage for Every Use Case](https://rxdb.info/rx-storage.md): Discover how RxDB's modular RxStorage lets you swap engines and unlock top performance, no matter the environment or use case. -- [RxDB Tradeoffs - Why NoSQL Triumphs on the Client](https://rxdb.info/rxdb-tradeoffs.md): Uncover RxDB's approach to modern database needs. From JSON-based queries to conflict handling without transactions, learn RxDB's unique tradeoffs. -- [Schema Validation](https://rxdb.info/schema-validation.md): RxDB has multiple validation implementations that can be used to ensure that your document data is always matching the provided JSON -- [Solving IndexedDB Slowness for Seamless Apps](https://rxdb.info/slow-indexeddb.md): Struggling with IndexedDB performance? Discover hidden bottlenecks, advanced tuning techniques, and next-gen storage like the File System Access API. -- [Boost Your RxDB with Powerful Third-Party Plugins](https://rxdb.info/third-party-plugins.md): Unleash RxDB's full power! Explore third-party plugins for advanced hooks, text search, Laravel Orion, Supabase replication, and more. -- [Transactions, Conflicts and Revisions](https://rxdb.info/transactions-conflicts-revisions.md): Learn RxDB's approach to local and replication conflicts. Discover how incremental writes and custom handlers keep your app stable and efficient. -- [TypeScript Setup](https://rxdb.info/tutorials/typescript.md): Use RxDB with TypeScript to define typed schemas, create typed collections, and build fully typed ORM methods. A quick step-by-step guide. -- [Why NoSQL Powers Modern UI Apps](https://rxdb.info/why-nosql.md): Discover how NoSQL enables offline-first UI apps. Learn about easy replication, conflict resolution, and why relational data isn't always necessary. diff --git a/docs/logger.html b/docs/logger.html deleted file mode 100644 index 19b5306aa18..00000000000 --- a/docs/logger.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - - -RxDB Logger Plugin - Track & Optimize | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxDB Logger Plugin

    -

    With the logger plugin you can log all operations to the storage layer of your RxDatabase.

    -

    This is useful to debug performance problems and for monitoring with Application Performance Monitoring (APM) tools like Bugsnag, Datadog, Elastic, Sentry and others.

    -

    Notice that the logger plugin is not part of the RxDB core, it is part of RxDB Premium 👑.

    -

    RxDB logger example

    -

    Using the logger plugin

    -

    The logger is a wrapper that can be wrapped around any RxStorage. Once your storage is wrapped, you can create your database with the wrapped storage and the logging will automatically happen.

    -
     
    -import {
    -    wrappedLoggerStorage
    -} from 'rxdb-premium/plugins/logger';
    -import {
    -    getRxStorageIndexedDB
    -} from 'rxdb-premium/plugins/storage-indexeddb';
    - 
    - 
    -// wrap a storage with the logger
    -const loggingStorage = wrappedLoggerStorage({
    -    storage: getRxStorageIndexedDB({})
    -});
    - 
    -// create your database with the wrapped storage
    -const db = await createRxDatabase({
    -    name: 'mydatabase',
    -    storage: loggingStorage
    -});
    - 
    -// create collections etc...
    -

    Specify what to be logged

    -

    By default, the plugin will log all operations and it will also run a console.time()/console.timeEnd() around each operation. You can specify what to log so that your logs are less noisy. For this you provide a settings object when calling wrappedLoggerStorage().

    -
    const loggingStorage = wrappedLoggerStorage({
    -    storage: getRxStorageIndexedDB({}),
    -    settings: {
    -        // can used to prefix all log strings, default=''
    -        prefix: 'my-prefix',
    - 
    - 
    -        /**
    -         * Be default, all settings are true.
    -         */
    - 
    -        // if true, it will log timings with console.time() and console.timeEnd()
    -        times: true,
    - 
    -        // if false, it will not log meta storage instances like used in replication
    -        metaStorageInstances: true,
    - 
    -        // operations
    -        bulkWrite: true,
    -        findDocumentsById: true,
    -        query: true,
    -        count: true,
    -        info: true,
    -        getAttachmentData: true,
    -        getChangedDocumentsSince: true,
    -        cleanup: true,
    -        close: true,
    -        remove: true
    -    }
    -});
    -

    Using custom logging functions

    -

    With the logger plugin you can also run custom log functions for all operations.

    -
    const loggingStorage = wrappedLoggerStorage({
    -    storage: getRxStorageIndexedDB({}),
    -    onOperationStart: (operationsName, logId, args) => void,
    -    onOperationEnd: (operationsName, logId, args) => void,
    -    onOperationError: (operationsName, logId, args, error) => void
    -});
    - - \ No newline at end of file diff --git a/docs/logger.md b/docs/logger.md deleted file mode 100644 index 95e093efa2e..00000000000 --- a/docs/logger.md +++ /dev/null @@ -1,89 +0,0 @@ -# RxDB Logger Plugin - Track & Optimize - -> Take control of your RxDatabase logs. Monitor every write, query, or attachment retrieval to swiftly diagnose and fix performance bottlenecks. - -# RxDB Logger Plugin - -With the logger plugin you can log all operations to the [storage layer](./rx-storage.md) of your [RxDatabase](./rx-database.md). - -This is useful to debug performance problems and for monitoring with Application Performance Monitoring (APM) tools like **Bugsnag**, **Datadog**, **Elastic**, **Sentry** and others. - -Notice that the logger plugin is not part of the RxDB core, it is part of [RxDB Premium 👑](/premium/). - - - -## Using the logger plugin - -The logger is a wrapper that can be wrapped around any [RxStorage](./rx-storage.md). Once your storage is wrapped, you can create your database with the wrapped storage and the logging will automatically happen. - -```ts - -import { - wrappedLoggerStorage -} from 'rxdb-premium/plugins/logger'; -import { - getRxStorageIndexedDB -} from 'rxdb-premium/plugins/storage-indexeddb'; - -// wrap a storage with the logger -const loggingStorage = wrappedLoggerStorage({ - storage: getRxStorageIndexedDB({}) -}); - -// create your database with the wrapped storage -const db = await createRxDatabase({ - name: 'mydatabase', - storage: loggingStorage -}); - -// create collections etc... -``` - -## Specify what to be logged - -By default, the plugin will log all operations and it will also run a `console.time()/console.timeEnd()` around each operation. You can specify what to log so that your logs are less noisy. For this you provide a settings object when calling `wrappedLoggerStorage()`. - -```ts -const loggingStorage = wrappedLoggerStorage({ - storage: getRxStorageIndexedDB({}), - settings: { - // can used to prefix all log strings, default='' - prefix: 'my-prefix', - - /** - * Be default, all settings are true. - */ - - // if true, it will log timings with console.time() and console.timeEnd() - times: true, - - // if false, it will not log meta storage instances like used in replication - metaStorageInstances: true, - - // operations - bulkWrite: true, - findDocumentsById: true, - query: true, - count: true, - info: true, - getAttachmentData: true, - getChangedDocumentsSince: true, - cleanup: true, - close: true, - remove: true - } -}); -``` - -## Using custom logging functions - -With the logger plugin you can also run custom log functions for all operations. - -```ts -const loggingStorage = wrappedLoggerStorage({ - storage: getRxStorageIndexedDB({}), - onOperationStart: (operationsName, logId, args) => void, - onOperationEnd: (operationsName, logId, args) => void, - onOperationError: (operationsName, logId, args, error) => void -}); -``` diff --git a/docs/lunr-index-1769435561373.json b/docs/lunr-index-1769435561373.json deleted file mode 100644 index c33de6cbd1a..00000000000 --- a/docs/lunr-index-1769435561373.json +++ /dev/null @@ -1 +0,0 @@ -{"version":"2.3.9","fields":["title","content","keywords"],"fieldVectors":[["title/0",[0,850.067,1,698.67]],["content/0",[]],["keywords/0",[]],["title/1",[2,682.507]],["content/1",[0,7.646,1,10.399,2,8.547,3,6.487,4,1.985,5,3.045,6,1.855,7,4.402,8,7.468,9,6.452,10,7.58,11,9.248,12,4.917,13,12.341,14,7.201,15,8.213,16,7.251,17,14.102,18,4.711,19,4.227,20,6.317,21,8.133,22,5.027,23,3.924,24,6.612,25,0.938,26,11.819,27,11.819,28,6.099,29,5.85,30,6.634,31,9.695,32,2.984,33,1.824,34,3.229,35,4.044,36,7.357,37,2.368,38,14.102]],["keywords/1",[]],["title/2",[39,1723.121]],["content/2",[0,8.084,1,11.081,4,1.545,23,3.98,24,5.146,25,0.992,28,8.601,29,8.249,30,9.356,31,10.25,32,4.209,33,1.928,34,3.414,35,4.276,36,7.778,37,2.503,39,20.692,40,5.691,41,10.081,42,18.091,43,17.54,44,4.152,45,4.23,46,4.826,47,14.91,48,14.91,49,7.014,50,8.219,51,3.568]],["keywords/2",[]],["title/3",[52,513.439]],["content/3",[0,9.356,1,10.699,3,7.938,4,1.788,5,3.725,6,1.671,23,3.659,24,5.956,28,7.463,29,7.158,30,8.118,31,11.863,32,3.652,33,2.231,34,3.951,35,4.948,36,9.002,37,2.897,51,4.129,52,6.026,53,7.289,54,7.5,55,20.223,56,17.256]],["keywords/3",[]],["title/4",[52,513.439]],["content/4",[0,8.446,1,11.242,4,2.121,23,3.485,24,5.377,28,6.738,29,6.462,30,7.329,31,10.71,32,3.297,33,2.014,34,3.567,35,4.467,36,8.127,37,2.615,52,6.301,57,15.579,58,5.706,59,14.406,60,5.812,61,8.379,62,6.674,63,3.416,64,10.533,65,5.106,66,11.34,67,6.268,68,8.187,69,4.863,70,3.799,71,13.056,72,7.415,73,7.955,74,15.579]],["keywords/4",[]],["title/5",[75,1204.817]],["content/5",[0,8.774,1,10.983,4,1.677,5,3.494,6,1.567,15,9.425,16,8.322,23,3.55,24,5.586,28,7,29,6.713,30,7.614,31,11.126,32,3.425,33,2.093,34,3.705,35,4.641,36,8.443,37,2.717,53,6.836,63,3.549,65,5.304,75,16.512,76,9.62,77,13.084,78,13.563,79,8.57,80,14.965,81,11.542]],["keywords/5",[]],["title/6",[42,1506.563]],["content/6",[0,6.502,1,10.657,4,2.067,5,3.694,6,1.657,12,4.181,23,4.007,24,5.906,28,7.4,29,7.097,30,8.049,31,8.244,32,4.222,33,2.212,34,3.917,35,4.907,36,6.256,37,3.349,42,18.596,43,17.051,44,3.339,45,3.402,46,3.882,49,8.049,50,9.432,63,2.63,69,3.743,81,8.552,82,8.391,83,8.729,84,10.645,85,5.776,86,4.845,87,4.167,88,4.112,89,10.774,90,11.992,91,17.11,92,5.113,93,11.089]],["keywords/6",[]],["title/7",[75,1013.728,94,975.122]],["content/7",[0,7.207,1,10.649,4,2.359,5,3.971,6,1.781,12,4.635,23,3.937,24,6.349,28,5.749,29,5.514,30,6.253,31,9.138,32,3.893,33,2.727,34,4.211,35,6.527,36,6.934,37,3.088,43,10.419,44,3.701,58,4.869,69,4.149,75,13.638,80,17.009,81,9.48,84,7.093,88,4.558,89,8.37,92,5.667,93,12.292,94,13.118,95,13.292,96,7.524,97,4.667,98,5.694,99,4.683]],["keywords/7",[]],["title/8",[58,495.646,99,476.718,100,501.136]],["content/8",[0,9.353,1,9.743,4,1.998,22,5.447,23,4.056,24,4.917,25,0.622,26,7.839,27,7.839,28,6.16,29,7.155,31,6.43,32,3.014,33,1.209,34,2.142,35,4.085,36,4.879,37,2.391,44,2.604,50,5.156,53,3.951,58,8.968,61,5.031,94,5.817,99,8.457,100,9.068,101,8.185,102,8.649,103,4.168,104,6.324,105,5.071,106,6.43,107,2.297,108,10.061,109,9.209,110,4.126,111,3.529,112,6.134,113,4.351,114,4.141,115,14.244,116,3.863,117,13.171,118,11.937,119,14.244,120,14.244,121,5.62,122,4.105,123,9.353,124,3.503,125,3.701,126,8.649,127,8.649,128,8.649,129,9.353,130,9.353,131,4.743,132,9.353]],["keywords/8",[]],["title/9",[104,1259.934]],["content/9",[0,9.056,1,11.115,4,2.22,23,3.801,24,5.765,28,7.224,29,6.928,30,7.858,31,11.483,32,3.535,33,2.16,34,3.824,35,6.143,36,8.713,37,2.804,68,8.778,72,7.95,73,8.529,99,5.884,104,16.865,133,16.703,134,9.454,135,16.703]],["keywords/9",[]],["title/10",[104,1060.102,136,904.237]],["content/10",[0,8.261,1,10.729,5,3.29,23,4.063,24,5.259,28,6.59,29,6.32,30,7.168,31,10.475,32,4.27,33,1.97,34,3.489,35,4.369,36,7.949,37,2.558,42,18.288,43,15.815,44,4.243,45,4.322,46,4.932,49,7.168,50,8.399,104,13.642,136,11.636,137,15.237,138,15.237,139,15.237,140,11.944,141,15.237,142,8.964]],["keywords/10",[]],["title/11",[100,580.619,140,1229.009]],["content/11",[0,5.712,1,8.257,4,1.614,6,1.02,23,4.214,24,3.637,26,8.83,28,4.557,29,4.37,30,7.327,31,7.243,32,2.23,33,1.362,34,3.566,35,3.021,36,5.496,37,1.769,44,2.934,45,2.989,87,3.661,100,7.58,107,2.588,109,6.812,110,4.648,116,4.351,140,17.122,142,6.198,143,10.536,144,6.475,145,10.536,146,10.536,147,11.819,148,10.686,149,6.46,150,10.536,151,5.716,152,2.098,153,15.575,154,3.873,155,3.141,156,5.579,157,10.536,158,6.634,159,15.575,160,10.536,161,3.328,162,3.724,163,8.518,164,4.891,165,10.536,166,5.712,167,4.579,168,9.743,169,9.22,170,9.22,171,2.751,172,6.076,173,6.263,174,6.263,175,6.553,176,3.845,177,5.418,178,10.536]],["keywords/11",[]],["title/12",[7,299.457,107,235.629,179,476.813,180,441.279,181,255.603,182,191.399]],["content/12",[]],["keywords/12",[]],["title/13",[25,104.266,179,779.313]],["content/13",[4,1.788,5,3.725,7,6.827,25,1.597,33,2.828,67,6.943,86,6.973,107,4.239,110,7.612,179,10.871,183,5.435,184,3.742,185,4.169,186,6.464,187,13.441,188,12.267,189,8.811,190,10.23,191,5.188,192,5.802,193,6.914]],["keywords/13",[]],["title/14",[194,1085.252]],["content/14",[4,1.602,5,3.338,6,1.497,9,4.772,25,1.225,33,3.131,45,2.959,53,4.406,64,7.052,65,5.067,67,4.197,107,2.562,152,2.077,180,10.006,182,2.081,184,4.417,192,3.507,194,14.103,195,5.523,196,3.246,197,7.439,198,4.13,199,4.994,200,3.892,201,4.029,202,3.209,203,7.839,204,4.935,205,4.017,206,3.713,207,10.154,208,12.89,209,9.128,210,6.943,211,8.433,212,13.529,213,10.431,214,10.431,215,8.125,216,9.645,217,3.726,218,7.956,219,3.877,220,5.465,221,10.431,222,2.844,223,5.363,224,3.163,225,3.739,226,5.326,227,5.363,228,4.555,229,5.851,230,3.295,231,7.439,232,6.2,233,9.128,234,4.825,235,9.615,236,7.171,237,6.84,238,7.052,239,5.326,240,2.329,241,3.877,242,5.75,243,4.798]],["keywords/14",[]],["title/15",[244,1723.121]],["content/15",[4,1.579,7,6.298,20,6.825,33,2.609,46,4.932,107,3.743,110,6.721,180,7.009,181,4.06,182,3.04,184,4.375,186,4.504,190,7.127,220,5.386,244,22.265,245,15.237,246,4.813,247,14.09,248,8.261,249,8.624,250,10.766,251,8.472,252,7.823,253,17.656,254,9.057,255,6.21,256,7.168,257,6.825,258,11.622,259,12.77,260,7.891,261,13.334,262,8.131,263,12.319,264,4.417,265,5.481,266,14.09]],["keywords/15",[]],["title/16",[261,1630.706]],["content/16",[1,6.414,2,5.272,4,1.492,5,3.108,6,1.394,7,4.493,25,0.957,37,2.417,51,3.445,52,3.966,53,6.08,65,4.718,69,4.493,75,9.307,76,8.557,86,5.816,88,4.936,100,5.331,131,7.3,152,2.866,183,4.534,184,4.212,189,7.35,205,3.74,206,5.124,220,5.088,224,4.364,225,5.16,251,8.003,260,10.059,261,21.505,267,12.064,268,14.395,269,12.064,270,14.395,271,5.106,272,6.137,273,4.259,274,9.307,275,4.793,276,8.745,277,8.302,278,3.875,279,8.557,280,9.182,281,5.582,282,10.98]],["keywords/16",[]],["title/17",[283,1561.679]],["content/17",[2,5.384,4,2.302,5,3.173,6,1.907,7,6.149,33,2.873,45,4.17,51,3.517,58,7.215,63,3.224,88,5.04,99,7.827,100,5.443,182,2.933,190,6.876,246,4.644,250,7.844,273,3.224,283,21.35,284,5.214,285,10.105,286,9.034,287,7.306,288,7.259,289,6.837,290,11.212,291,7.038,292,11.522,293,4.115,294,11.884,295,9.034,296,10.941,297,4.17,298,7.213,299,9.142,300,8.103,301,3.35]],["keywords/17",[]],["title/18",[302,1267.615,303,1372.068]],["content/18",[18,5.165,37,2.596,44,4.306,110,6.821,156,10.788,180,7.113,182,3.085,184,3.353,189,7.896,192,5.199,194,9.006,196,4.813,199,7.404,200,5.769,207,8.524,220,5.466,224,4.688,235,9.617,241,5.748,242,8.524,243,7.113,262,8.252,264,4.483,293,4.328,302,19.58,303,19.939,304,7.788,305,9.617,306,11.028,307,8.918,308,5.005,309,15.463,310,6.999,311,6.624,312,14.299,313,15.463,314,5.485,315,5.036]],["keywords/18",[]],["title/19",[302,1267.615,316,1141.31]],["content/19",[4,1.109,6,1.525,15,6.231,23,3.623,25,0.711,32,3.333,33,1.383,34,3.606,46,3.463,65,5.163,69,3.34,70,2.609,72,5.092,82,11.023,107,2.628,110,4.719,113,4.976,114,3.11,151,3.301,152,2.13,164,5.871,180,4.921,181,2.851,184,3.416,185,2.584,190,7.368,196,3.33,205,2.78,206,3.808,207,5.897,220,3.782,228,4.672,233,9.362,254,6.359,272,4.561,273,4.522,274,6.917,289,4.976,297,3.035,302,19.219,303,13.784,316,13.609,317,10.698,318,8.966,319,7.019,320,15.752,321,6.575,322,5.79,323,5.897,324,9.362,325,7.486,326,8.386,327,10.698,328,8.65,329,4.767,330,2.572,331,6.917,332,9.362,333,9.893,334,3.085,335,11.234,336,15.752,337,10.698,338,10.698,339,10.698,340,10.698,341,9.363,342,10.698,343,10.698,344,10.698,345,8.16]],["keywords/19",[]],["title/20",[346,1561.679]],["content/20",[6,2.151,33,2.873,46,5.728,136,10.206,180,8.14,181,4.715,205,6.311,206,6.299,217,6.321,220,7.855,346,14.831,347,8.14,348,10.016,349,11.442,350,15.486,351,13.871,352,15.486,353,15.486,354,17.696,355,6.974,356,8.231,357,12.621]],["keywords/20",[]],["title/21",[358,1723.121]],["content/21",[4,1.967,110,8.375,151,5.858,181,5.059,205,4.933,206,6.758,220,6.712,252,7.362,288,9.376,293,5.315,297,5.386,305,11.808,346,19.452,358,21.463,359,13.821,360,10.846,361,10.65]],["keywords/21",[]],["title/22",[362,1259.934]],["content/22",[33,2.109,37,2.738,107,4.006,180,7.503,181,4.346,184,3.537,194,12.286,201,6.3,202,6.489,205,4.238,206,5.806,224,4.945,272,6.954,273,3.577,293,4.566,304,8.215,311,9.037,346,13.669,362,14.263,363,15.082,364,8.843,365,16.311,366,10.161,367,14.274,368,10.271,369,16.311,370,10.271,371,8.509,372,10.546,373,4.206,374,13.187,375,8.509]],["keywords/22",[]],["title/23",[239,951.488]],["content/23",[33,1.97,61,8.195,134,8.624,152,3.034,184,5.221,189,7.78,192,5.123,202,4.687,206,5.424,239,11.55,240,5.051,260,7.891,273,3.341,274,9.852,282,11.622,301,3.473,373,3.929,376,14.09,377,11.944,378,9.155,379,6.971,380,16.466,381,4.917,382,11.631,383,14.09,384,15.237,385,5.581,386,11.091,387,8.874,388,8.547,389,7.835,390,11.341,391,7.674,392,7.087,393,8.195]],["keywords/23",[]],["title/24",[0,1010.306]],["content/24",[0,12.241,1,8.09,4,1.351,5,2.816,6,1.263,7,4.071,25,0.867,33,1.687,37,3.048,40,4.979,41,8.819,52,3.594,63,3.981,65,4.275,84,6.96,97,4.579,100,4.83,148,7.522,152,3.614,184,2.828,201,5.038,218,13.847,239,11.528,243,6,271,4.627,277,10.47,278,3.511,287,6.483,289,6.067,292,10.224,308,5.876,371,6.804,393,7.015,394,11.449,395,5.484,396,5.931,397,8.32,398,6.798,399,7.13,400,8.174,401,5.842,402,7.522,403,10.545,404,9.949,405,6.707,406,11.414,407,6.36,408,4.315,409,8.32,410,8.433]],["keywords/24",[]],["title/25",[411,1630.706]],["content/25",[0,9.434,4,1.803,33,2.843,86,7.031,134,9.849,152,3.464,180,8.004,182,3.472,184,3.773,222,4.745,273,4.821,287,8.649,288,8.593,411,19.24,412,17.4,413,9.012,414,8.594,415,17.4,416,14.634,417,7.835,418,13.64,419,10.572,420,10.572,421,9.012]],["keywords/25",[]],["title/26",[422,1723.121]],["content/26",[0,8.774,4,1.677,6,1.567,88,5.549,114,6.102,182,3.229,184,3.51,198,4.323,200,6.038,202,4.978,207,12.841,219,6.016,239,8.264,240,3.614,262,8.636,269,13.563,287,8.044,310,7.325,378,9.724,422,19.408,423,9.946,424,10.464,425,5.822,426,10.065,427,5.949,428,8.704,429,14.965,430,20.989,431,14.965,432,8.505,433,11.781,434,16.184,435,7.404]],["keywords/26",[]],["title/27",[436,1723.121]],["content/27",[0,8.322,4,1.59,7,4.791,41,10.378,107,4.98,125,6.074,154,5.642,181,6.049,190,7.18,196,4.777,220,8.025,229,8.61,230,4.849,239,7.837,246,4.849,262,10.819,265,5.522,289,7.139,290,11.708,308,4.968,323,8.461,382,7.893,385,5.622,436,20.992,437,6.024,438,7.592,439,10.741,440,7.1,441,11.708,442,11.173,443,13.432,444,10.741,445,15.349,446,11.425,447,9.791,448,12.41]],["keywords/27",[]],["title/28",[295,1145.198]],["content/28",[1,5.776,2,6.62,4,1.343,6,1.75,7,6.497,9,5.93,10,7.152,12,6.302,25,1.202,33,1.676,37,3.494,51,3.102,52,3.571,63,2.842,84,6.917,136,7.475,156,6.864,176,4.73,190,6.063,201,5.006,222,3.534,230,4.095,246,4.095,266,11.986,271,4.598,273,2.842,278,3.489,293,3.628,295,13.838,297,3.677,352,11.343,408,4.288,409,8.268,447,8.268,448,14.613,449,12.962,450,12.962,451,7.966,452,5.995,453,11.343,454,8.38,455,6.206,456,11.343,457,8.764,458,6.029,459,13.787,460,9.887,461,10.863,462,5.15,463,9.244,464,9.648,465,9.648,466,6.762,467,4.582,468,5.93,469,10.16]],["keywords/28",[]],["title/29",[470,1863.425]],["content/29",[4,1.59,6,1.486,7,4.791,15,8.939,20,6.875,33,1.985,125,6.074,184,4.397,201,5.928,202,6.237,220,5.426,234,7.1,240,3.427,254,9.124,289,7.139,305,9.546,311,6.575,366,9.766,373,3.958,382,7.893,385,5.622,387,8.939,471,22.702,472,13.432,473,11.425,474,8.852,475,14.193,476,9.325,477,11.807,478,9.546,479,9.222,480,5.522,481,8.461,482,8.391,483,8.255,484,8.61,485,12.032,486,9.124,487,9.665]],["keywords/29",[]],["title/30",[488,1561.679]],["content/30",[2,6.268,4,1.773,5,3.695,6,1.657,7,7.466,10,6.772,11,11.223,12,5.968,33,2.213,51,4.095,88,5.868,98,7.332,100,8.857,110,7.549,198,4.572,200,6.385,202,5.265,373,4.414,459,13.055,488,18.233,489,12.739,490,6.8,491,12.458,492,11.572,493,10.644,494,13.055]],["keywords/30",[]],["title/31",[417,705.949,495,1372.068]],["content/31",[5,3.788,6,2.14,10,6.943,40,6.698,52,6.998,61,9.438,62,7.517,63,4.847,114,5.101,190,8.208,230,5.543,378,10.543,381,5.662,402,10.12,417,7.901,488,14.706,495,15.356,496,7.09,497,15.356,498,10.913,499,9.222,500,12.279,501,9.023]],["keywords/31",[]],["title/32",[502,1723.121]],["content/32",[1,7.819,2,6.427,10,9.574,18,5.861,33,2.858,51,4.199,52,4.835,88,6.016,152,3.493,229,9.842,260,9.087,273,3.848,274,11.345,295,10.784,353,15.356,377,13.755,441,13.384,454,11.345,502,20.438,503,9.292,504,7.779,505,17.547,506,9.514,507,10.913]],["keywords/32",[]],["title/33",[508,1173.393]],["content/33",[4,1.923,25,1.412,33,1.741,37,2.26,52,6.306,60,5.023,62,5.768,63,2.953,86,5.441,92,5.741,99,4.743,111,5.081,152,2.681,183,4.241,200,5.023,202,5.709,260,9.611,273,4.657,281,5.221,292,10.554,293,3.769,297,6.024,308,4.358,319,6,322,4.95,334,3.882,370,8.478,379,6.16,454,8.705,501,6.923,508,14.412,509,13.464,510,6.828,511,13.235,512,5.511,513,8.004,514,4.827,515,6.649,516,6.923,517,7.3,518,13.464,519,7.242,520,6.094,521,10.886,522,12.45,523,7.242,524,8.829,525,7.076]],["keywords/33",[]],["title/34",[526,1723.121]],["content/34",[4,1.279,6,1.195,7,3.854,10,4.886,21,7.121,25,1.348,33,2.621,44,3.438,58,6.398,63,2.708,98,7.483,110,5.446,113,5.743,114,3.589,179,8.683,182,2.463,185,2.983,186,3.649,190,5.775,196,3.843,202,5.374,217,6.24,222,3.367,265,4.442,273,4.446,284,4.38,293,3.456,300,6.806,301,2.814,310,5.589,322,4.539,330,2.969,348,6.988,396,5.707,421,6.394,425,4.442,440,5.711,462,4.906,483,6.641,526,21.506,527,8.983,528,12.347,529,6.988,530,11.417,531,6.749,532,7.191,533,6.988,534,8.806,535,9.678,536,4.234,537,4.047,538,8.683,539,5.743,540,9.19,541,6.021,542,7.876,543,4.572,544,4.607,545,3.42,546,9.982]],["keywords/34",[]],["title/35",[547,1723.121]],["content/35",[4,1.351,5,2.816,6,1.263,7,4.071,10,5.161,25,0.867,37,3.506,41,8.819,44,3.632,46,4.222,51,3.121,52,3.594,65,4.275,70,3.181,75,8.433,107,3.204,110,5.753,114,5.277,125,5.161,181,4.837,184,2.828,185,3.151,186,5.366,225,4.675,230,4.12,272,5.561,273,3.981,275,4.343,277,7.522,278,3.511,284,4.627,293,5.082,301,2.973,308,4.222,322,4.795,334,3.761,379,5.967,440,6.033,490,5.182,529,7.382,537,4.275,547,19.309,548,8.213,549,6.855,550,7.382,551,5.935,552,6.855,553,5.842,554,6.245,555,8.112,556,4.659,557,5.182,558,10.224,559,8.32,560,6.907,561,6.136,562,7.522,563,5.587,564,6.033,565,7.382]],["keywords/35",[]],["title/36",[260,811.993,566,1077.888]],["content/36",[4,1.545,5,3.219,7,4.654,8,7.895,33,2.572,49,7.014,67,5.999,100,5.521,114,4.334,175,9.273,184,3.233,190,6.974,195,7.895,199,7.139,207,10.963,215,7.836,222,4.066,260,12.363,287,7.411,288,7.363,297,4.23,315,4.856,318,12.495,330,3.585,407,7.271,416,9.924,417,6.713,423,9.163,429,13.787,566,16.411,567,9.777,568,8.771,569,7.316,570,13.787,571,9.777,572,5.326,573,10.25,574,13.787,575,13.787,576,12.495,577,9.273]],["keywords/36",[]],["title/37",[578,1723.121]],["content/37",[6,1.52,9,7.181,25,1.044,65,6.743,70,3.828,86,6.342,107,3.855,110,6.924,181,6.116,182,4.105,195,8.312,198,4.193,202,4.828,205,4.078,219,5.834,240,3.505,242,13.428,243,9.464,272,6.692,288,7.751,304,7.906,416,10.447,479,9.431,544,5.856,561,9.679,578,14.514,579,10.148,580,7.22,581,6.661,582,11.54,583,13.736,584,10.613]],["keywords/37",[]],["title/38",[585,1723.121]],["content/38",[4,1.914,6,1.502,18,3.502,28,4.534,29,4.348,33,1.356,40,5.923,46,5.98,51,2.509,58,3.84,76,9.224,92,4.47,97,3.68,99,3.693,102,9.694,107,3.811,114,3.047,125,4.148,154,5.704,162,3.706,180,4.822,182,2.092,183,3.302,185,4.463,190,4.904,200,3.911,203,5.316,205,4.032,206,6.576,220,3.706,240,2.341,248,5.684,250,5.594,262,8.28,264,3.039,298,5.144,304,5.28,307,6.046,311,4.491,315,3.414,330,2.52,351,8.217,360,5.989,366,7.474,373,2.704,381,5.007,396,3.425,451,9.536,452,4.849,516,5.39,523,5.638,565,5.933,585,23.299,586,11.55,587,6.687,588,7.996,589,7.336,590,4.47,591,9.694,592,6.369,593,8.217,594,10.483,595,10.483,596,7.336,597,8.217,598,7.088,599,9.694,600,8.346,601,10.483,602,9.694,603,10.483,604,10.483,605,10.483,606,8.217,607,5.684,608,10.483,609,10.483,610,9.694,611,6.601]],["keywords/38",[]],["title/39",[612,1723.121]],["content/39",[1,5.849,4,1.36,6,1.765,25,0.873,33,1.697,37,3.061,49,6.175,70,3.201,86,5.303,107,3.224,181,5.582,185,3.171,220,4.64,222,4.972,225,6.536,226,6.702,241,4.879,265,4.722,273,2.878,278,3.533,297,5.172,301,4.156,310,8.253,315,6.824,319,5.849,330,3.156,396,4.288,416,8.736,423,8.066,467,4.64,483,7.059,536,4.5,537,5.976,545,3.635,554,6.284,561,6.175,563,5.622,565,7.429,612,16.86,613,4.624,614,5.677,615,11,616,9.184,617,6.95,618,8.066,619,12.137,620,12.137,621,9.36,622,5.326,623,13.125,624,13.125,625,10.011,626,10.011,627,10.288,628,7.429]],["keywords/39",[]],["title/40",[629,1506.563]],["content/40",[1,5.313,6,1.925,9,5.455,10,6.743,25,1.133,33,1.542,37,2.002,44,3.32,49,5.609,60,4.448,86,4.818,107,4.186,110,5.259,114,3.466,181,3.177,184,3.695,185,2.88,196,3.711,202,3.668,222,4.646,225,7.128,226,8.701,265,4.289,273,3.737,278,4.587,293,3.338,301,3.884,334,3.438,364,6.464,381,3.848,392,5.546,395,5.013,396,3.896,398,4.465,400,5.368,419,7.244,437,4.679,438,4.465,462,4.737,477,9.924,532,6.944,533,6.748,536,4.088,537,5.585,565,6.748,607,6.464,613,4.2,614,5.157,625,9.095,628,6.748,629,17.541,630,6.264,631,6.944,632,7.014,633,9.64,634,8.503,635,10.434,636,6.518,637,6.811,638,6.876,639,5.675,640,8.503,641,8.343,642,5.341,643,8.503]],["keywords/40",[]],["title/41",[644,1723.121]],["content/41",[6,1.592,33,2.126,40,6.275,152,3.273,162,5.811,185,3.971,186,4.859,205,5.509,206,5.852,220,5.811,230,5.193,284,5.831,315,5.354,355,6.478,414,6.426,481,9.062,483,11.404,606,12.886,625,12.539,644,19.606,645,9.671,646,16.439,647,16.439,648,10.352,649,13.291,650,9.481,651,16.439,652,7.871,653,15.201,654,16.439,655,21.202,656,9.772]],["keywords/41",[]],["title/42",[657,1723.121]],["content/42",[1,7.156,2,5.882,4,1.664,7,5.013,10,8.264,25,1.543,33,2.077,37,2.696,88,5.506,184,3.483,185,3.879,205,4.173,220,7.382,284,7.408,293,5.846,301,3.66,315,6.802,325,11.238,379,7.347,536,5.506,537,5.263,559,10.244,639,7.643,657,19.311,658,16.059,659,7.387,660,9.008,661,10.244,662,11.453,663,8.853,664,8.035]],["keywords/42",[]],["title/43",[665,1723.121]],["content/43",[4,2.128,25,1.182,33,2.297,37,2.123,40,4.828,41,8.551,100,6.579,107,4.364,181,3.37,185,3.055,195,6.697,205,4.616,220,6.28,225,4.534,226,6.458,230,3.995,240,2.824,241,4.701,248,6.857,260,6.55,297,3.588,298,6.206,372,8.177,391,6.37,420,7.684,437,4.964,478,11.05,515,6.246,536,6.092,599,11.695,662,9.019,663,6.972,665,23.112,666,12.647,667,9.647,668,6.55,669,11.067,670,7.094,671,10.599,672,7.866,673,6.597,674,6.507,675,5.882,676,9.206,677,9.913,678,7.964,679,12.647,680,11.067,681,12.647,682,10.225,683,8.85,684,11.695,685,9.206,686,11.695,687,12.647,688,7.684,689,6.913]],["keywords/43",[]],["title/44",[25,45.956,52,190.408,97,242.606,107,169.742,181,184.131,257,309.534,264,200.341,583,604.745,690,691.049,691,691.049]],["content/44",[]],["keywords/44",[]],["title/45",[52,513.439]],["content/45",[4,1.677,5,3.494,6,2.032,7,5.052,37,3.524,51,3.873,52,5.783,60,6.038,114,6.102,198,4.323,205,4.205,206,5.761,273,3.549,297,4.591,308,6.794,322,5.949,396,5.288,501,8.322,541,7.892,556,5.781,557,6.43,572,5.781,659,7.445,692,8.264,693,7.249,694,8.044,695,7.992,696,10.065,697,10.323,698,10.464,699,10.464,700,12.046,701,10.065]],["keywords/45",[]],["title/46",[4,140.222,52,372.867,257,606.144]],["content/46",[4,1.343,6,2.18,12,4.519,37,2.176,40,6.9,44,5.033,52,3.571,63,2.842,70,4.408,87,4.504,107,3.184,121,7.788,149,7.497,151,3.999,181,4.816,182,2.586,184,2.811,185,5.027,205,4.696,206,4.614,220,4.582,240,4.036,243,5.962,264,3.758,273,3.964,278,3.489,293,3.628,314,6.412,315,4.222,389,6.665,400,5.836,428,6.971,468,8.269,490,5.15,552,6.812,581,5.501,675,6.029,702,12.962,703,4.836,704,6.812,705,7.549,706,6.618,707,8.764,708,8.162,709,7.966,710,10.863,711,5.501,712,7.875,713,8.38,714,8.627,715,9.648,716,4.679,717,6.206,718,5.26,719,8.911]],["keywords/46",[]],["title/47",[4,123.338,52,327.97,72,566.533,510,603.606]],["content/47",[1,4.113,3,4.245,5,3.044,6,1.656,25,1.138,37,1.549,40,3.523,44,2.57,46,4.564,51,4.094,52,6.235,58,3.38,60,3.443,65,3.025,69,2.881,86,3.729,88,3.164,96,5.224,99,3.251,110,4.071,114,4.974,125,3.652,152,2.807,182,1.841,183,2.907,185,2.229,192,3.103,195,4.887,196,2.872,202,4.337,222,2.517,224,2.798,232,5.486,252,3.579,256,4.342,273,3.092,278,2.484,281,7.427,287,4.587,297,4.853,299,5.74,300,7.772,308,6.2,310,4.177,315,3.006,322,3.393,330,4.113,348,5.224,371,4.815,379,4.222,390,6.869,466,4.815,479,5.545,480,3.32,481,5.088,485,11.052,496,5.697,506,5.004,529,5.224,531,5.045,536,3.164,538,4.587,541,4.5,546,7.462,549,4.85,553,4.134,563,6.04,572,3.297,613,3.251,614,6.098,630,3.393,695,4.558,698,5.967,700,10.494,703,3.443,720,7.04,721,8.076,722,4.648,723,6.24,724,9.229,725,9.229,726,6.718,727,6.458,728,8.076,729,8.076,730,13.038,731,9.229,732,3.229,733,9.229,734,4.648,735,4.155,736,3.456,737,3.103,738,5.967,739,5.967,740,4.293,741,5.607,742,4.177,743,6.458]],["keywords/47",[]],["title/48",[25,79.157,171,310.82,191,357.826,257,533.158]],["content/48",[]],["keywords/48",[]],["title/49",[25,104.266,29,650.349]],["content/49",[25,1.625,28,10.568,29,10.136,30,9.73,182,4.127,257,9.264,319,9.217]],["keywords/49",[]],["title/50",[330,286.181,744,885.975,745,650.672,746,997.556]],["content/50",[6,1.347,9,6.366,22,5.67,23,3.702,25,1.262,46,4.504,83,10.128,109,8.996,155,4.147,162,4.918,164,4.369,183,6.804,198,5.07,257,8.502,330,4.563,366,6.702,425,5.005,722,12.625,744,16.08,745,10.376,746,11.661,747,15.407,748,15.346,749,15.907,750,12.176,751,8.551,752,12.176,753,12.866,754,10.907,755,13.914,756,13.914,757,8.996,758,6.018,759,13.914,760,12.866]],["keywords/50",[]],["title/51",[33,174.985,198,361.493,224,410.309]],["content/51",[4,0.991,19,4.344,22,3.803,23,4.207,24,5.002,25,0.636,32,3.067,33,2.262,34,3.318,35,5.595,37,3.276,49,4.501,52,3.993,63,2.098,69,2.987,73,4.886,111,3.61,114,2.782,151,2.952,158,6.025,161,3.023,167,4.158,198,2.556,224,2.901,257,6.491,264,2.774,271,3.394,275,5.824,297,2.714,334,2.759,355,5.711,423,5.88,440,4.426,462,3.802,467,3.382,510,4.852,531,5.23,539,4.45,551,4.354,572,3.418,590,4.08,607,5.188,622,3.883,630,7.172,668,4.955,723,6.469,732,3.348,758,4.138,761,6.965,762,7.122,763,4.886,764,5.23,765,5.733,766,11.716,767,5.466,768,9.992,769,6.965,770,4.725,771,7.008,772,3.969,773,6.893,774,5.23,775,4.581,776,6.897,777,4.264,778,7.122,779,6.369,780,5.067,781,9.568,782,5.629,783,8.373]],["keywords/51",[]],["title/52",[784,1141.31,785,478.129]],["content/52",[23,4.255,32,4.464,33,1.45,34,5.659,35,6.704,63,2.46,171,2.929,462,8.38,490,4.457,545,3.107,642,5.024,659,5.16,682,13.184,768,6.408,784,8.165,785,3.421,786,4.805,787,7.903,788,9.4,789,13.666,790,9.816,791,9.816,792,6.469,793,9.816,794,14.27,795,9.816,796,9.816,797,14.27,798,9.816,799,11.21,800,7.849,801,9.4,802,9.816,803,16.813,804,9.311,805,12.599,806,7.855,807,9.069,808,9.4,809,5.539,810,9.816]],["keywords/52",[]],["title/53",[273,261.029,284,422.228,545,329.694,735,535.943]],["content/53",[25,1.31,51,4.715,192,6.625,281,7.641,284,6.99,301,4.491,330,4.738,401,8.826,425,7.089,537,6.458,538,9.794,544,7.352,545,5.458,556,7.039,611,12.408]],["keywords/53",[]],["title/54",[167,517.318,183,374.904,722,599.526,811,885.975]],["content/54",[6,1.644,23,4.229,35,4.868,257,7.603,341,10.091,768,12.364,783,14.855,804,8.227,812,12.106,813,16.975,814,16.975,815,14.855,816,15.697,817,16.975,818,12.635,819,11.879,820,11.67,821,13.724,822,16.975,823,13.306,824,11.879,825,11.478]],["keywords/54",[]],["title/55",[257,702.281,826,864.293]],["content/55",[4,1.561,22,5.904,23,4.241,24,5.201,25,0.67,32,3.189,33,1.303,34,2.307,35,2.89,37,1.692,124,3.774,151,3.109,158,6.346,161,4.76,164,3.165,172,5.812,183,4.746,198,2.692,241,3.746,257,4.514,275,3.355,284,6.402,297,2.859,319,4.491,381,3.252,722,5.076,732,3.526,748,8.147,764,8.237,768,5.757,776,7.172,777,4.491,819,7.052,820,6.928,821,8.147,823,7.899,824,7.052,825,6.814,826,11.04,827,6.193,828,11.493,829,9.319,830,13.933,831,9.319,832,15.068,833,20.027,834,13.186,835,9.319,836,9.319,837,10.077,838,10.077,839,10.077,840,13.933,841,10.077,842,10.077,843,4.561,844,9.319,845,6.608,846,9.319,847,8.147,848,7.899,849,7.899,850,8.819,851,10.077,852,10.077]],["keywords/55",[]],["title/56",[19,356.811,25,79.157,52,327.97,257,533.158]],["content/56",[4,1.985,19,5.744,25,1.552,33,2.478,85,9.229,182,3.823,255,7.809,257,10.455,273,4.202,523,10.306,539,8.912,621,13.665,782,11.272,853,10.946,854,15.02,855,11.39]],["keywords/56",[]],["title/57",[25,89.993,202,416.281,563,579.706]],["content/57",[4,1.442,6,2.351,25,1.667,33,1.799,37,3.187,184,4.116,185,4.585,222,5.176,252,5.395,297,5.385,307,8.024,315,4.532,330,3.345,394,7.056,425,5.005,435,9.884,440,6.436,480,7.772,556,6.78,581,5.905,652,6.662,695,6.871,718,5.646,719,9.566,742,9.778,765,6.221,784,10.128,856,8.996,857,9.76,858,7.008,859,10.613,860,8.453,861,8.829,862,8.762,863,8.024]],["keywords/57",[]],["title/58",[52,432.005,703,584.959]],["content/58",[4,2.164,5,3.467,6,1.555,25,1.068,37,3.506,46,5.198,51,3.843,52,7.019,63,3.522,67,8.403,185,3.879,201,6.203,222,5.695,391,10.519,405,8.258,484,9.008,533,9.089,693,7.193,694,7.982,703,7.791,861,7.47,864,10.531,865,10.531,866,9.447,867,16.059,868,13.459,869,10.531,870,12.588,871,12.984]],["keywords/58",[]],["title/59",[52,432.005,179,779.313]],["content/59",[4,1.745,25,1.432,37,3.615,44,4.688,51,4.029,62,7.213,63,3.692,97,5.911,98,7.213,100,8.79,122,7.39,142,9.906,185,4.067,199,8.062,264,4.881,287,8.369,297,4.777,395,7.08,536,5.773,550,9.53,827,10.348,861,7.832,872,8.481,873,10.117,874,9.546,875,8.916,876,10.472,877,9.362]],["keywords/59",[]],["title/60",[37,199.834,51,284.834,63,261.029,689,650.672]],["content/60",[25,1.389,37,3.507,40,7.974,51,4.999,63,4.581,114,6.073,193,8.37,554,10.002,878,13.699]],["keywords/60",[]],["title/61",[191,471.331,879,610.406]],["content/61",[23,2.149,25,1.674,37,2.368,63,3.093,70,3.439,97,4.951,181,3.758,182,2.814,185,3.407,190,6.597,202,4.338,257,6.317,265,5.073,311,6.041,322,5.184,366,6.793,388,7.91,409,8.996,410,9.118,462,5.603,523,11.7,541,6.877,545,3.906,555,8.771,573,9.695,596,9.868,622,5.723,637,8.056,659,6.487,706,7.201,730,13.04,853,8.056,872,7.103,880,10.757,881,10.265,882,8.667,883,11.794,884,8.213,885,13.944,886,5.037,887,8.213,888,7.357,889,9.535,890,10.057,891,7.774,892,8.667,893,5.93]],["keywords/61",[]],["title/62",[25,70.65,33,137.374,37,178.358,51,374.991]],["content/62",[]],["keywords/62",[]],["title/63",[275,620.473]],["content/63",[4,1.882,5,3.92,6,2.186,37,3.049,51,4.345,200,6.775,232,10.794,275,6.046,334,5.236,421,9.404,440,8.399,481,10.01,527,9.337,529,10.278,556,6.487,557,7.215,694,9.026,697,11.583,703,6.775,785,5.538,894,6.959,895,15.218,896,15.218]],["keywords/63",[]],["title/64",[52,513.439]],["content/64",[6,1.774,37,3.075,51,4.384,52,5.047,114,5.325,182,3.655,186,5.415,200,6.834,222,6.191,273,4.017,278,4.931,322,6.734,405,9.42,536,6.281,541,8.933,560,9.7,563,7.847,695,9.047,732,6.409,897,12.013,898,12.594,899,13.335]],["keywords/64",[]],["title/65",[5,292.154,6,131.019,51,323.825]],["content/65",[4,1.477,5,4.388,6,2.308,9,3.191,30,3.281,37,2.394,40,2.662,44,1.942,51,5.066,52,1.921,63,2.479,70,5.163,87,6.264,96,6.399,103,6.354,107,1.713,113,3.244,149,2.893,155,3.37,176,2.545,181,3.799,182,4.588,185,3.962,186,3.342,192,3.801,196,3.519,198,3.02,200,6.119,202,2.145,204,3.3,222,4.915,227,3.586,240,1.557,246,2.203,273,2.479,275,2.322,291,3.339,301,3.738,304,3.512,314,2.474,330,1.677,334,2.011,373,1.798,382,3.586,392,3.244,396,4.659,401,3.124,407,3.401,479,4.19,480,4.067,512,2.855,520,3.157,525,5.942,532,4.061,536,2.391,537,3.706,543,4.187,559,4.448,561,5.319,617,3.693,675,5.259,692,3.561,697,4.448,704,3.665,706,3.561,708,4.391,711,2.959,717,3.339,718,2.83,786,4.843,863,4.022,872,3.512,886,4.039,887,4.061,893,4.754,899,5.076,900,6.449,901,2.662,902,3.984,903,5.638,904,5.076,905,4.145,906,7.731,907,8.763,908,5.638,909,5.466,910,5.737,911,4.448,912,3.638,913,5.844,914,5.319,915,5.191,916,6.449,917,5.844,918,3.947,919,4.88,920,3.693,921,3.612,922,5.319,923,4.573,924,4.448,925,5.844,926,3.561,927,6.974,928,6.103,929,6.449,930,6.449,931,4.145,932,3.173,933,5.466,934,4.286,935,5.638,936,3.466,937,3.046,938,5.466]],["keywords/65",[]],["title/66",[37,227.19,51,323.825,703,504.882]],["content/66",[5,2.945,6,2.228,12,4.756,22,3.58,33,2.421,37,3.864,51,5.116,52,3.758,58,6.858,63,4.106,86,5.512,96,7.721,114,3.965,182,2.722,185,3.295,201,5.268,206,4.856,240,3.046,252,5.289,275,4.542,322,5.014,334,3.933,405,7.014,437,7.349,531,7.457,536,4.677,551,6.207,685,9.929,693,6.11,694,6.78,703,7.977,785,4.16,866,8.025,893,5.735,926,6.965,939,11.028,940,11.376,941,10.153,942,8.196,943,7.169,944,7.651,945,10.692,946,12.613,947,9.378,948,13.641,949,13.641,950,9.079]],["keywords/66",[]],["title/67",[16,449.64,33,113.071,51,209.248,100,323.821,417,393.72,951,765.226,952,494.931]],["content/67",[3,9.151,33,2.572,51,4.76,79,10.534,85,9.582,100,7.367,114,5.783,182,3.969,240,4.442,417,8.957,462,7.904,554,9.525,560,10.534,699,12.862]],["keywords/67",[]],["title/68",[114,346.026,284,422.228,670,667.664,953,885.975]],["content/68",[4,1.915,6,1.789,33,2.39,70,4.507,182,3.687,200,6.895,284,6.556,301,4.212,417,8.321,533,10.46,537,6.057,545,5.119,613,6.51,701,11.494,732,6.466,920,9.786,924,11.789,953,13.756,954,9.713,955,10.659,956,11.637,957,11.228]],["keywords/68",[]],["title/69",[33,137.374,97,372.969,206,378.168,240,237.216,958,491.403]],["content/69",[33,2.39,70,5.567,97,6.488,100,6.844,149,7.666,182,3.687,200,6.895,206,6.579,240,4.127,301,4.212,314,6.556,532,10.763,543,6.844,673,9.641,704,9.713,786,7.917,893,7.771,911,11.789,940,11.228,958,8.548,959,16.173]],["keywords/69",[]],["title/70",[63,296.762,301,308.418,786,579.706]],["content/70",[3,8.655,12,6.56,33,2.433,44,5.239,63,5.062,70,4.588,182,3.754,200,7.02,240,4.201,334,5.425,417,8.472,514,6.745,536,6.451,617,9.963,680,16.465,717,9.008,786,8.06,956,11.848,960,15.212]],["keywords/70",[]],["title/71",[16,546.285,25,70.65,37,178.358,51,254.223,952,601.311]],["content/71",[25,1.375,37,3.472,51,4.949,96,11.707,114,6.013,202,6.362,560,10.952,699,13.373,715,15.395,961,11.401]],["keywords/71",[]],["title/72",[37,178.358,195,562.569,400,478.346,554,508.659,639,505.648]],["content/72",[1,8.781,25,1.31,37,3.308,44,5.487,65,6.458,182,3.932,186,5.824,195,10.434,255,8.031,400,8.872,536,6.756,553,8.826,554,9.434,639,9.379,962,14.667]],["keywords/72",[]],["title/73",[62,410.941,152,190.987,217,342.668,414,374.974,544,357.9,952,542.959]],["content/73",[4,1.985,6,1.855,21,11.051,25,1.274,70,4.673,152,3.815,182,3.823,200,7.149,217,6.845,293,5.364,414,7.49,533,10.845,695,9.463,701,11.917,812,13.665,894,7.343,920,10.146,963,7.401]],["keywords/73",[]],["title/74",[62,410.941,86,387.621,297,272.135,300,528.808,414,374.974,417,431.927]],["content/74",[25,1.336,125,7.947,190,9.395,196,6.251,297,5.698,300,11.072,541,9.794,630,7.383,904,14.62,964,20.085,965,12.491,966,16.832,967,14.62]],["keywords/74",[]],["title/75",[152,269.421,183,426.225,737,454.965]],["content/75",[6,1.908,25,1.31,152,3.923,183,6.206,196,6.133,272,8.401,438,7.379,536,6.756,545,5.458,737,6.625,968,15.446,969,13.323,970,15.03,971,11.713,972,12.922]],["keywords/75",[]],["title/76",[7,489.185,182,211.969,288,524.652,514,380.833]],["content/76",[7,7.411,25,1.31,182,3.932,196,6.133,200,7.352,255,8.031,394,9.992,409,12.569,514,7.064,553,8.826,586,14.667,614,8.522,645,11.592,921,10.205]],["keywords/76",[]],["title/77",[183,275.416,273,191.76,330,210.237,425,314.57,544,326.242,545,242.203,722,440.43]],["content/77",[6,1.486,23,4.19,32,4.29,70,4.944,164,6.367,183,4.834,196,4.777,273,4.446,284,5.445,297,4.354,301,3.498,330,3.69,396,5.015,425,5.522,525,8.067,537,5.031,543,5.684,544,5.727,545,4.251,622,6.229,804,7.439,893,6.454,920,8.128,973,8.255,974,9.791,975,8.255,976,13.432,977,12.864,978,12.864,979,12.41,980,12.864]],["keywords/77",[]],["title/78",[183,334.613,273,232.977,514,380.833,981,606.904,982,566.919]],["content/78",[6,1.963,63,4.447,155,6.045,278,5.459,512,8.301,622,8.23,910,8.16,963,7.833,981,11.585,982,10.822,983,12.055,984,12.464]],["keywords/78",[]],["title/79",[278,364.276,330,325.357,765,443.523]],["content/79",[25,1.349,33,2.622,252,7.864,278,5.459,293,5.677,297,5.753,330,4.876,334,5.847,545,5.617,614,8.771,765,6.647,973,10.908]],["keywords/79",[]],["title/80",[281,461.561,297,337.67,379,544.573,614,514.812]],["content/80",[6,2.285,25,1.298,51,4.671,58,7.15,65,6.398,182,3.895,278,5.255,281,9.153,297,5.538,334,5.628,379,8.931,613,6.876,985,9.079,986,13.42]],["keywords/80",[]],["title/81",[5,292.154,152,269.421,742,612.527]],["content/81",[6,1.926,37,4.008,63,4.362,152,3.961,334,5.736,419,12.086,525,10.455,660,11.158,718,8.073,742,9.004,944,11.158,963,7.683,984,12.225]],["keywords/81",[]],["title/82",[184,258.124,220,420.766,394,603.606,982,635.181]],["content/82",[6,1.908,51,4.715,155,5.874,184,4.273,219,7.324,220,6.966,240,4.4,394,9.992,395,8.285,554,9.434,613,6.942,617,10.434,622,7.996,982,10.515,987,12.74]],["keywords/82",[]],["title/83",[935,1506.563]],["content/83",[1,6.79,7,4.756,25,1.342,33,1.97,37,3.387,49,7.168,51,5.413,70,3.716,114,4.429,182,4.025,186,4.504,190,7.127,196,6.28,198,4.07,200,7.527,202,4.687,256,7.168,265,5.481,297,4.322,300,8.399,301,3.473,417,6.861,437,5.98,462,6.054,514,5.462,537,4.994,560,8.068,562,8.787,703,5.685,866,8.964,910,6.131,937,6.655,938,11.944,963,5.885,988,10.867,989,10.867,990,11.944,991,8.399,992,10.867]],["keywords/83",[]],["title/84",[191,471.331,879,610.406]],["content/84",[4,1.626,25,1.682,37,2.635,51,3.756,87,5.454,105,11.155,125,6.211,152,3.125,171,4.099,190,7.342,191,4.719,222,4.28,265,5.647,293,5.759,366,7.561,398,5.878,523,11.066,853,11.753,872,7.906,879,8.01,882,9.646,883,11.155,884,9.141,886,5.607,887,9.141,937,6.855,993,7.561,994,8.442,995,11.194,996,7.105,997,11.426,998,11.194]],["keywords/84",[]],["title/85",[25,79.157,33,153.915,51,284.834,401,533.158]],["content/85",[]],["keywords/85",[]],["title/86",[5,256.976,6,115.243,14,447.448,51,284.834]],["content/86",[5,4.65,6,2.085,51,5.154,79,11.405,999,15.678,1000,11.584]],["keywords/86",[]],["title/87",[4,140.222,33,174.985,561,636.63]],["content/87",[5,3.757,6,1.685,33,2.25,51,4.164,63,3.816,70,5.362,87,6.047,103,7.754,182,3.472,185,4.203,240,3.885,293,4.871,438,6.516,462,6.914,512,7.123,525,9.145,561,10.343,711,7.384,718,7.061,893,7.316,905,10.343,909,13.64,937,7.6,984,10.694,992,12.41,1001,14.583,1002,16.09]],["keywords/87",[]],["title/88",[6,131.019,87,470.257,181,360.573]],["content/88",[5,4.099,6,1.838,51,4.543,70,5.66,87,8.066,155,5.659,181,5.059,182,3.788,203,9.628,314,6.735,396,6.203,447,12.111,704,9.978,717,9.091,1003,15.35,1004,15.912,1005,14.482]],["keywords/88",[]],["title/89",[18,354.881,33,137.374,40,405.533,184,230.384,552,558.336]],["content/89",[6,1.657,18,5.717,33,2.813,51,4.095,69,5.343,70,4.174,86,6.915,176,6.246,182,4.341,184,4.718,196,5.327,222,4.667,265,6.157,301,3.901,307,9.87,322,6.291,330,4.115,427,6.291,438,6.409,537,5.609,552,8.995,553,7.666,565,9.687,589,11.976,613,6.029,912,8.928,973,9.205,986,11.766]],["keywords/89",[]],["title/90",[6,84.661,97,306.986,182,174.469,185,211.234,301,199.292,537,286.593,552,459.559]],["content/90",[6,2.281,33,2.143,40,6.325,51,3.965,70,5.197,97,5.817,182,3.306,185,5.148,202,5.097,222,4.518,284,5.878,293,4.638,299,10.306,301,4.857,330,3.984,348,9.379,396,5.414,399,9.058,529,9.379,537,6.985,539,7.707,553,7.422,611,10.434,717,7.934,893,6.967,912,8.644,920,8.774,989,11.817,1006,10.067]],["keywords/90",[]],["title/91",[33,153.915,51,284.834,62,509.904,1007,625.565]],["content/91",[33,2.269,51,4.199,70,4.279,176,6.404,182,3.501,185,4.239,222,4.785,240,4.935,273,4.847,373,4.525,381,5.662,396,5.733,426,10.913,428,9.438,473,13.061,512,7.183,543,6.498,664,8.779,718,7.121,732,6.139,910,7.06,963,6.777,994,9.438,1008,16.226,1009,15.356,1010,14.187]],["keywords/91",[]],["title/92",[185,256.637,273,232.977,373,273.982,675,494.15,692,542.465]],["content/92",[6,1.728,33,2.308,44,4.97,51,4.271,63,3.914,96,10.102,103,7.953,155,5.32,182,3.561,185,4.311,222,4.867,240,3.985,273,4.899,373,4.603,512,7.306,536,6.12,543,6.609,675,8.302,692,9.113,712,10.843,910,7.181,918,10.102,926,9.113,1011,12.068,1012,12.27]],["keywords/92",[]],["title/93",[103,473.413,182,211.969,301,242.127,786,455.105,886,379.495]],["content/93",[5,3.886,6,2.175,33,2.328,51,4.308,70,4.39,103,8.022,147,11.483,182,4.481,185,4.349,240,4.02,301,4.103,381,5.809,512,7.369,520,8.148,543,6.667,696,11.196,718,7.305,786,9.621,886,8.023,937,7.862,1002,16.646]],["keywords/93",[]],["title/94",[7,371.572,250,635.181,255,485.12,552,625.565]],["content/94",[3,7.938,7,5.387,25,1.148,33,2.828,46,5.586,51,4.129,113,8.026,196,6.807,203,8.751,250,11.671,255,8.913,257,7.729,258,13.163,259,14.462,291,8.262,396,5.638,462,6.856,525,9.069,548,10.866,551,7.853,553,7.729,937,7.537,965,10.732,1013,15.101,1014,15.101,1015,13.163]],["keywords/94",[]],["title/95",[5,256.976,6,115.243,185,287.538,480,428.201]],["content/95",[5,3.92,6,2.379,25,1.208,33,2.348,37,3.049,51,4.345,70,4.428,155,5.413,185,4.387,265,6.532,278,4.888,480,6.532,536,6.226,863,13.023,906,9.845,924,11.583,932,8.263,933,14.234,934,11.16,943,9.543,1016,13.516]],["keywords/95",[]],["title/96",[4,110.083,18,354.881,33,137.374,185,256.637,252,411.958]],["content/96",[18,8.146,33,2.308,44,4.97,51,4.271,110,7.873,185,4.311,252,8.662,265,6.421,278,4.804,638,10.293,712,10.843,732,6.244,785,5.443,936,8.871,937,7.795,963,6.893,973,9.599,991,9.839,1017,13.285,1018,15.619,1019,11.239,1020,14.958,1021,9.599]],["keywords/96",[]],["title/97",[6,102.858,70,259.088,87,369.18,228,463.992,913,890.35]],["content/97",[5,4.175,6,2.447,51,4.628,70,5.724,87,8.157,155,5.764,228,8.446,525,10.164,912,10.089,913,16.207,971,11.496,1022,15.159,1023,14.394]],["keywords/97",[]],["title/98",[16,493.273,33,124.043,51,229.553,100,355.245,417,431.927,952,542.959]],["content/98",[33,2.968,51,5.493,79,9.874,85,8.982,100,6.905,114,5.421,182,3.72,193,7.471,206,6.637,228,8.144,240,4.164,417,10.335,514,6.684,551,8.485,560,9.874,564,8.625,952,10.554,961,10.279]],["keywords/98",[]],["title/99",[114,346.026,284,422.228,670,667.664,953,885.975]],["content/99",[6,2.247,25,1.068,33,2.7,40,6.13,51,3.843,99,5.657,182,3.204,205,5.426,240,4.663,284,7.408,293,4.495,301,3.66,330,3.861,334,4.63,347,7.387,396,5.247,417,7.231,515,7.931,537,5.263,545,5.784,550,11.82,553,7.193,587,10.244,614,6.946,636,8.779,664,8.035,732,5.619,953,11.953,1024,7.555,1025,12.249,1026,12.249]],["keywords/99",[]],["title/100",[33,137.374,97,372.969,206,378.168,240,237.216,958,491.403]],["content/100",[3,7.873,33,2.813,51,6.023,52,4.716,92,7.297,97,7.638,182,4.341,206,6.092,240,3.821,278,4.607,308,5.54,310,7.747,514,6.135,543,6.338,587,10.917,693,7.666,874,7.588,911,10.917,937,7.475,958,10.063,1007,8.995,1027,14.343,1028,9.87,1029,12.458]],["keywords/100",[]],["title/101",[63,296.762,301,308.418,786,579.706]],["content/101",[3,8.281,33,2.904,51,5.858,63,4.925,70,4.39,155,5.366,182,3.592,206,6.408,240,4.02,291,8.619,293,5.039,301,4.103,310,8.148,786,9.621,893,7.569,897,11.805,959,15.754,963,6.953,1030,8.834,1031,13.104]],["keywords/101",[]],["title/102",[16,612.063,25,79.157,51,284.834,952,673.714]],["content/102",[25,1.579,33,2.548,40,7.522,51,5.681,182,3.932,398,7.379,437,7.734,560,10.434,952,11.153,961,10.862,1032,13.547,1033,14.344,1034,15.931]],["keywords/102",[]],["title/103",[183,275.416,273,191.76,330,210.237,425,314.57,544,326.242,545,242.203,722,440.43]],["content/103",[6,1.907,23,4.16,25,0.978,32,4.169,44,4.093,70,3.585,155,4.382,164,6.186,183,4.63,273,4.32,284,5.214,293,4.115,301,3.35,330,3.534,425,5.288,438,5.505,462,5.84,537,4.818,543,5.443,544,5.484,545,4.071,613,5.178,712,8.93,722,7.404,732,5.143,804,7.124,858,7.404,910,5.914,920,7.784,974,9.376,975,7.906,976,12.864,977,12.319,978,12.319,979,11.884,980,12.319,1035,8.93]],["keywords/103",[]],["title/104",[62,410.941,152,190.987,217,342.668,414,374.974,544,357.9,952,542.959]],["content/104",[7,5.62,25,1.197,46,5.827,58,6.593,152,4.472,186,5.321,196,5.603,217,8.023,222,4.909,278,4.846,414,8.779,544,8.379,572,6.43,701,11.196,785,5.49,936,8.948,956,11.336,973,9.682,1021,9.682,1036,15.087,1037,12.839]],["keywords/104",[]],["title/105",[62,410.941,86,387.621,297,272.135,300,528.808,414,374.974,417,431.927]],["content/105",[4,1.882,7,5.669,25,1.208,33,2.348,97,6.375,113,8.446,182,3.623,186,5.367,196,5.652,256,8.543,297,5.151,300,12.448,401,8.134,414,7.098,536,6.226,552,9.543,630,8.301,937,7.931,961,10.01,1038,11.294,1039,13.851,1040,11.583]],["keywords/105",[]],["title/106",[152,269.421,183,426.225,737,454.965]],["content/106",[6,1.774,25,1.218,63,4.017,92,7.81,152,3.647,183,5.77,202,5.635,284,6.498,293,5.128,330,4.404,396,5.985,438,6.86,514,6.567,544,6.834,545,5.074,737,6.159,910,7.371,963,7.075,968,14.359,969,12.386,970,13.973,972,12.013,1041,14.359]],["keywords/106",[]],["title/107",[7,489.185,182,211.969,288,524.652,514,380.833]],["content/107",[3,8.896,7,7.889,25,1.286,51,4.628,63,4.241,155,5.764,182,3.859,255,7.882,291,9.259,514,6.932,614,8.364,617,10.241,1042,12.504,1043,14.077,1044,19.339]],["keywords/107",[]],["title/108",[183,334.613,273,232.977,514,380.833,981,606.904,982,566.919]],["content/108",[6,1.838,25,1.263,63,4.164,183,5.98,273,5.09,512,7.772,514,6.806,543,7.031,718,7.705,963,7.333,981,10.846,982,12.386,1045,14.482,1046,15.35,1047,13.821,1048,15.35,1049,11.668]],["keywords/108",[]],["title/109",[281,461.561,297,337.67,379,544.573,614,514.812]],["content/109",[6,2.175,25,1.197,58,6.593,65,5.9,88,6.172,155,5.366,182,4.884,184,3.904,202,5.538,281,8.709,297,5.107,301,4.103,379,8.236,396,5.882,427,6.618,525,9.461,537,5.9,565,10.189,613,6.342,893,7.569,985,8.373]],["keywords/109",[]],["title/110",[278,364.276,330,325.357,765,443.523]],["content/110",[5,3.955,6,2.198,25,1.218,69,5.718,155,5.46,176,6.685,182,3.655,192,6.159,205,4.76,255,7.466,278,6.112,293,5.128,330,4.404,394,9.289,435,8.381,550,10.368,553,8.205,765,7.441,860,11.129,961,10.098]],["keywords/110",[]],["title/111",[5,292.154,152,269.421,742,612.527]],["content/111",[5,4.026,6,1.805,25,1.24,37,3.854,63,4.089,152,4.57,334,5.376,396,6.092,512,7.633,514,6.684,564,8.625,693,8.352,718,7.567,742,10.39,943,9.8,944,10.459,984,11.459,1050,13.298]],["keywords/111",[]],["title/112",[37,178.358,195,562.569,400,478.346,554,508.659,639,505.648]],["content/112",[6,1.671,25,1.148,37,2.897,51,4.129,58,6.32,65,5.656,69,5.387,99,6.079,113,8.026,125,6.828,155,5.144,195,11.581,196,5.371,200,6.438,252,6.691,264,5.003,400,7.77,438,6.462,536,5.917,639,10.409,743,12.075,875,9.138,876,10.732,985,8.026,986,11.863,1026,13.163,1051,13.527,1052,13.952]],["keywords/112",[]],["title/113",[184,258.124,220,420.766,394,603.606,982,635.181]],["content/113",[6,1.743,25,1.197,65,5.9,184,3.904,194,10.484,220,7.939,239,9.192,240,4.02,288,8.89,311,7.712,366,8.671,394,11.389,395,7.569,396,5.882,551,8.192,554,8.619,613,6.342,617,9.533,638,10.382,982,9.606,1053,14.111,1054,12.597,1055,8.948]],["keywords/113",[]],["title/114",[191,471.331,879,610.406]],["content/114",[4,1.318,6,1.232,25,1.621,33,2.307,51,4.931,63,2.79,70,3.103,87,4.422,105,9.674,114,3.699,125,5.035,152,2.533,171,3.323,182,3.56,190,5.952,191,3.825,196,5.553,202,3.914,222,3.47,252,4.934,265,4.577,293,4.995,301,2.9,366,6.129,398,4.765,401,5.699,428,6.844,438,4.765,462,5.056,523,9.597,525,6.687,537,4.17,622,5.163,648,8.012,659,5.853,853,10.193,872,6.409,879,6.947,882,7.82,883,9.674,884,7.41,886,4.545,887,7.41,888,6.638,893,5.35,910,5.12,937,7.793,963,4.914,993,6.129,994,6.844,995,9.075,996,5.759,997,9.262,998,9.075,1056,8.012,1057,10.287]],["keywords/114",[]],["title/115",[25,79.157,33,153.915,182,237.492,257,533.158]],["content/115",[]],["keywords/115",[]],["title/116",[182,270.003,200,504.882,257,606.144]],["content/116",[7,5.432,97,6.109,114,5.058,171,4.544,182,4.387,196,6.843,197,12.41,198,4.648,200,6.492,202,5.353,250,9.285,257,9.848,293,4.871,304,8.764,348,9.849,438,6.516,462,6.914,466,9.077,621,12.41,732,6.088,736,6.516,910,7.001,1058,9.012,1059,17.4,1060,16.09,1061,10.822]],["keywords/116",[]],["title/117",[22,312.383,33,153.915,182,237.492,257,533.158]],["content/117",[5,3.635,6,2.085,10,6.663,18,5.625,33,2.784,63,3.692,70,5.251,155,5.019,182,4.296,252,6.529,257,7.542,278,4.533,293,4.713,305,10.472,437,6.608,514,6.036,531,9.204,541,8.211,561,7.921,695,8.315,893,7.08,894,6.452,907,10.348,926,8.598,963,6.503,1062,12.533,1063,14.111,1064,11.783,1065,9.906]],["keywords/117",[]],["title/118",[25,79.157,33,153.915,437,467.161,1066,635.181]],["content/118",[25,1.375,33,2.979,72,7.527,85,7.618,182,3.155,186,4.675,196,4.922,202,6.36,255,6.446,257,9.261,284,8.172,293,4.427,414,6.182,428,8.506,437,6.207,442,11.512,462,6.284,474,9.121,479,9.503,536,5.423,560,8.375,614,6.84,617,8.375,637,9.035,963,6.108,1032,10.873,1067,10.693,1068,12.291,1069,13.254,1070,13.84,1071,14.624,1072,11.067,1073,14.624]],["keywords/118",[]],["title/119",[25,89.993,886,483.395,1074,739.744]],["content/119",[25,1.403,202,6.491,276,12.82,486,12.544,556,7.538,902,12.055,1075,15.707,1076,21.102]],["keywords/119",[]],["title/120",[25,123.921]],["content/120",[6,2.264,25,1.403,33,2.728,51,3.903,52,4.494,58,5.974,110,7.195,184,3.537,202,5.017,205,4.238,206,5.806,234,7.544,252,6.325,273,3.577,278,5.678,281,6.325,284,7.483,293,4.566,297,4.627,308,5.28,379,7.462,440,7.544,536,5.593,614,7.054,722,8.215,879,6.35,937,7.124,963,6.3,1037,11.632,1067,11.028,1068,9.696]],["keywords/120",[]],["title/121",[6,131.019,278,364.276,284,480.028]],["content/121",[6,2.361,25,1.622,99,6.287,183,5.621,276,10.843,278,4.804,284,8.65,301,4.068,330,4.291,356,8.302,438,6.684,537,5.85,538,8.871,545,4.944,558,13.99,613,6.287,862,11.239,937,7.795,963,6.893,1077,10.102]],["keywords/121",[]],["title/122",[107,332.397,181,360.573,732,473.461]],["content/122",[3,7.562,4,1.703,5,3.549,6,1.592,25,1.41,44,4.577,46,5.321,97,5.771,107,4.038,151,5.072,181,5.649,182,4.23,185,3.971,202,5.057,240,3.671,246,5.193,265,5.914,314,5.831,330,3.952,392,9.862,396,5.371,425,5.914,532,9.574,539,7.646,553,7.363,564,7.604,613,5.791,692,8.394,732,5.752,912,8.576,1078,13.291,1079,12.539]],["keywords/122",[]],["title/123",[6,151.799,184,340.004]],["content/123",[6,2.352,9,8.096,25,1.478,69,5.524,155,5.275,176,6.458,182,3.531,184,3.838,205,5.773,219,6.578,225,6.344,226,9.036,240,3.951,278,4.764,293,4.954,297,5.02,314,6.277,427,6.505,613,6.234,614,7.654,914,8.325,985,8.231,1080,13.871]],["keywords/123",[]],["title/124",[183,493.826,273,343.83]],["content/124",[6,2.117,25,1.148,97,6.058,183,6.888,198,4.61,273,5.536,284,6.121,297,4.895,301,3.933,330,5.258,348,9.767,396,5.638,399,9.433,425,6.208,462,6.856,536,5.917,537,5.656,544,6.438,545,4.78,550,9.767,622,7.003,919,12.075,937,7.537,1061,10.732]],["keywords/124",[]],["title/125",[281,524.746,297,383.895,379,619.122]],["content/125",[6,1.63,9,7.703,25,1.432,51,4.029,69,5.256,70,4.106,155,5.019,182,3.36,246,5.319,257,7.542,281,9.701,288,8.315,293,6.027,297,4.777,315,5.484,330,4.048,373,4.342,379,7.703,398,6.306,425,6.057,564,7.788,611,10.603,617,8.916,634,12.008,740,7.832,893,7.08,957,10.23,1081,10.348]],["keywords/125",[]],["title/126",[25,70.65,33,137.374,257,475.86,467,375.547,670,595.91]],["content/126",[6,1.592,21,9.481,25,1.093,33,2.742,107,4.038,114,4.779,181,4.38,182,4.23,183,5.178,186,4.859,257,7.363,265,5.914,284,5.831,301,3.747,308,5.321,322,6.043,398,6.156,414,6.426,417,7.402,467,5.811,533,9.305,537,5.388,539,7.646,564,7.604,613,5.791,614,7.11,622,6.671,695,8.118,732,5.752,954,8.64,991,9.062,1032,11.302,1068,9.772,1082,10.942]],["keywords/126",[]],["title/127",[4,123.338,25,79.157,182,237.492,257,533.158]],["content/127",[16,10.635,25,1.375,182,4.127,202,6.362,255,8.43,257,9.264,407,10.086,486,12.295,872,10.417,902,11.815]],["keywords/127",[]],["title/128",[25,79.157,29,493.733,257,533.158,264,345.078]],["content/128",[4,2.46,22,4.419,25,1.664,28,9.312,29,10.377,30,7.921,33,2.177,44,4.688,107,4.136,122,7.39,182,4.296,198,4.498,252,6.529,257,9.644,308,5.45,373,4.342,490,6.69,714,11.207,879,6.555,886,6.015,1083,14.735,1084,14.735]],["keywords/128",[]],["title/129",[330,286.181,744,885.975,745,650.672,746,997.556]],["content/129",[4,1.841,6,1.72,22,4.663,25,1.366,44,3.521,46,4.094,110,5.579,113,5.882,114,3.676,155,5.296,164,3.971,183,6.469,186,3.738,198,3.378,257,10.511,278,3.404,286,7.772,288,6.246,330,6.009,455,6.055,544,4.718,545,3.503,550,10.056,622,5.132,722,10.345,744,16.58,745,13.302,746,17.212,747,9.019,748,10.225,749,10.599,753,11.695,760,11.695,785,3.857,939,10.225,972,8.293,1085,10.599,1086,8.177,1087,11.067,1088,11.695,1089,7.294,1090,9.647,1091,12.647]],["keywords/129",[]],["title/130",[4,90.608,25,58.151,167,380.037,183,275.416,257,391.674,273,191.76,811,650.864]],["content/130",[4,1.335,6,1.247,23,4.1,25,1.379,35,3.694,46,4.17,83,9.377,155,3.84,167,9.015,183,5.668,224,3.906,257,8.061,273,4.549,278,3.468,293,3.606,315,4.196,330,3.097,341,7.657,360,7.359,410,8.329,425,4.634,496,5.205,538,6.403,543,4.77,544,4.806,642,5.77,643,9.187,734,6.488,768,10.281,783,11.273,804,6.243,811,13.396,815,11.273,816,11.912,818,9.588,821,10.415,825,8.71,873,10.813,894,4.936,1092,9.826,1093,10.415,1094,11.273,1095,12.881,1096,12.881,1097,11.912,1098,10.097,1099,11.912,1100,12.881,1101,12.881]],["keywords/130",[]],["title/131",[25,79.157,65,390.118,400,535.943,408,393.825]],["content/131",[2,3.98,4,1.651,5,2.346,6,1.826,10,8.753,16,5.587,20,4.867,21,6.267,25,1.471,33,1.405,37,4.011,44,3.026,51,4.514,52,5.198,62,4.655,63,2.383,69,3.392,85,5.234,86,4.391,87,5.537,98,6.825,113,5.054,114,3.159,234,5.026,256,5.112,275,5.305,293,4.46,297,4.52,308,6.725,323,5.99,334,3.133,385,3.98,395,6.699,400,9.355,408,7.319,467,6.668,496,4.391,515,5.366,536,3.726,539,7.411,564,5.026,614,4.699,659,4.998,676,7.91,692,5.548,873,6.529,874,7.064,894,4.164,926,5.548,1019,6.842,1102,8.088,1103,7.604,1104,10.866,1105,10.866,1106,9.106,1107,10.866,1108,7.347,1109,5.627,1110,6.207,1111,7.47]],["keywords/131",[]],["title/132",[6,92.877,25,63.794,205,249.247,219,356.567,240,214.197,613,337.935]],["content/132",[4,1.849,6,2.361,12,6.223,25,1.486,182,4.457,184,4.844,219,8.303,240,4.988,257,10.006,293,4.996,297,5.063,334,5.146,613,6.287,614,7.719,872,8.989,902,10.196,973,9.599,1112,10.609]],["keywords/132",[]],["title/133",[107,332.397,181,360.573,732,473.461]],["content/133",[3,7.503,4,1.69,5,3.521,6,1.579,25,1.403,44,4.542,107,4.006,151,5.032,181,5.621,182,4.209,185,3.94,192,5.484,240,3.642,246,5.153,257,7.306,265,5.868,314,5.786,330,3.921,392,9.812,396,5.329,425,5.868,532,9.499,539,7.587,553,7.306,556,5.826,564,7.544,613,5.746,692,8.328,732,5.707,785,4.974,799,11.213,912,8.509,1079,12.441]],["keywords/133",[]],["title/134",[225,562.039,226,800.578]],["content/134",[6,1.617,25,1.424,69,5.214,88,5.727,114,4.856,116,6.898,205,4.34,225,8.941,226,10.938,227,8.589,278,4.496,293,4.676,334,4.816,395,7.023,426,10.388,517,9.056,536,5.727,550,9.454,551,7.601,558,13.093,564,7.726,590,7.121,745,9.131,985,7.769,1019,10.518,1113,12.159,1114,8.529,1115,12.159,1116,8.302]],["keywords/134",[]],["title/135",[613,552.327,1117,1267.615]],["content/135",[6,2.14,25,1.47,114,5.101,155,5.23,184,3.805,205,5.743,225,7.923,226,8.96,227,9.023,240,4.935,278,4.723,297,4.978,298,8.61,314,6.224,396,5.733,545,4.86,553,7.86,590,7.481,613,6.181,914,8.255,985,8.162,1116,8.722,1117,14.187]],["keywords/135",[]],["title/136",[301,308.418,537,443.523,545,374.827]],["content/136",[6,1.592,25,1.093,70,5.171,182,3.28,202,5.057,205,4.271,257,7.363,265,5.914,284,5.831,288,8.118,293,4.602,301,5.349,314,5.831,330,3.952,425,5.914,438,6.156,525,8.64,537,7.692,538,8.171,545,6.501,565,9.305,893,6.912,920,8.705,937,7.18,984,10.103,1067,11.115,1068,9.772,1111,11.302,1118,10.629]],["keywords/136",[]],["title/137",[25,79.157,202,366.157,563,509.904,1119,686.479]],["content/137",[25,1.375,182,4.127,202,6.362,257,9.264,479,12.427,525,10.87,536,7.092,563,8.86,688,12.566,1119,11.928]],["keywords/137",[]],["title/138",[60,504.882,63,296.762,514,485.1]],["content/138",[6,1.699,25,1.167,46,5.68,60,9.027,63,4.847,92,7.481,103,7.819,152,3.493,182,3.501,198,4.687,257,7.86,273,4.847,396,5.733,405,9.023,438,6.571,512,7.183,514,6.29,590,7.481,693,7.86,737,5.899,926,8.96,943,9.222,1049,10.784,1120,16.226]],["keywords/138",[]],["title/139",[6,131.019,185,326.9,480,486.819]],["content/139",[4,1.788,5,3.725,6,2.325,25,1.454,33,2.231,37,2.897,155,5.144,185,4.169,192,5.802,200,6.438,205,4.484,206,6.143,293,4.83,297,4.895,308,5.586,399,9.433,480,8.637,614,7.463,863,9.952,914,8.118,932,7.853,934,10.605,1121,11.157,1122,14.462,1123,12.844]],["keywords/139",[]],["title/140",[116,491.54,278,320.414,330,286.181,356,553.65]],["content/140",[6,2.074,25,1.111,33,2.16,63,3.663,92,7.121,99,5.884,116,6.898,182,3.333,224,5.064,257,7.482,278,4.496,301,3.807,330,5.997,356,10.999,396,5.457,438,6.255,537,5.474,538,8.302,544,6.232,545,4.626,551,7.601,659,7.683,751,10.265,1124,10.799,1125,11.688,1126,12.432,1127,10.518,1128,12.159]],["keywords/140",[]],["title/141",[217,483.395,556,483.395,742,612.527]],["content/141",[4,1.773,6,1.657,25,1.447,37,3.653,46,5.54,63,3.753,217,6.114,297,4.855,405,8.8,512,7.006,514,6.135,532,9.967,545,4.74,556,8.544,571,11.223,693,7.666,718,8.829,742,9.848,905,10.173,958,7.916,984,10.518,1109,8.863,1129,13.837,1130,15.826,1131,17.115]],["keywords/141",[]],["title/142",[4,99.401,25,63.794,85,462.071,182,191.399,257,429.683,855,570.235]],["content/142",[25,1.403,85,10.164,182,4.21,186,6.237,257,9.452,855,12.544,879,8.215,1000,11.349]],["keywords/142",[]],["title/143",[4,110.083,167,461.722,360,606.904,811,790.76,1132,982.391]],["content/143",[4,1.175,23,4.206,25,0.754,35,4.713,44,4.576,121,6.813,155,3.38,161,3.582,164,6.657,167,8.402,183,6.089,228,4.952,257,5.079,278,3.052,304,5.711,341,9.77,360,6.478,381,3.659,462,4.505,487,7.14,538,8.169,642,7.362,694,11.664,696,7.052,748,9.167,758,7.108,804,7.965,811,15.779,818,12.233,858,8.278,888,5.915,889,7.667,965,7.052,994,6.099,1092,8.649,1093,9.167,1097,15.198,1098,12.883,1132,10.485,1133,9.503,1134,6.418,1135,11.339,1136,16.435,1137,16.435,1138,11.339,1139,11.339]],["keywords/143",[]],["title/144",[4,90.608,183,275.416,241,325.026,284,310.182,381,282.178,722,440.43,826,482.031]],["content/144",[25,1.298,33,2.524,183,6.148,222,5.323,241,7.256,257,8.743,284,6.924,297,5.538,381,6.299,396,6.378,398,7.31,569,9.579,674,7.15,722,9.832,826,10.76,828,14.889]],["keywords/144",[]],["title/145",[4,110.083,33,137.374,257,475.86,423,652.904,782,624.992]],["content/145",[25,1.177,33,3.141,73,9.036,155,5.275,182,3.531,198,4.727,252,6.862,257,7.926,278,4.764,293,4.954,423,13.656,427,6.505,466,9.232,717,8.473,782,10.41,786,7.581,901,6.755,910,7.12,1043,12.882,1140,13.172,1141,11.605,1142,12.882,1143,11.442,1144,15.486]],["keywords/145",[]],["title/146",[6,131.019,278,364.276,963,522.668]],["content/146",[6,2.095,25,1.439,63,3.723,92,7.238,182,3.387,227,8.729,278,5.826,293,6.058,334,4.894,513,10.091,514,6.085,544,6.333,545,5.995,550,9.608,551,7.725,554,8.128,718,6.889,937,7.414,963,6.556,1000,9.13,1047,12.357,1110,9.697,1119,9.79,1145,16.975,1146,15.697,1147,9.358,1148,11.879]],["keywords/146",[]],["title/147",[6,131.019,227,695.85,613,476.718]],["content/147",[6,1.671,22,4.529,25,1.148,40,6.587,44,4.805,45,4.895,46,5.586,76,10.258,92,7.357,184,3.742,205,4.484,219,6.414,225,6.186,226,8.811,227,11.246,240,3.853,241,6.414,278,4.645,293,4.83,392,8.026,396,5.638,517,9.356,531,9.433,613,7.704,1000,9.281,1019,10.866,1149,15.101,1150,13.527]],["keywords/147",[]],["title/148",[988,1328.96]],["content/148",[6,1.907,25,1.31,33,1.901,70,3.585,97,6.916,107,3.611,181,5.249,182,4.938,186,4.345,196,4.575,200,7.349,202,4.522,255,5.991,257,9.952,264,4.261,265,7.086,278,3.957,284,5.214,293,4.115,301,3.35,428,7.906,437,5.769,462,5.84,515,7.259,536,5.04,537,4.818,565,8.32,613,5.178,617,7.784,622,5.965,893,6.181,899,10.7,910,5.914,989,10.483,1065,8.647,1119,8.477,1151,9.504,1152,9.784,1153,12.864]],["keywords/148",[]],["title/149",[191,471.331,879,610.406]],["content/149",[4,1.579,19,4.567,25,1.666,33,1.97,51,3.646,87,5.295,105,10.939,125,6.029,152,3.034,171,3.979,191,4.58,196,4.742,222,4.155,257,6.825,265,5.481,293,5.648,366,7.339,398,5.706,523,12.166,853,11.526,872,7.674,879,7.855,882,9.364,883,10.939,884,8.874,886,5.443,887,8.874,937,6.655,993,7.339,994,8.195,995,10.867,996,6.897,997,11.091,998,10.867,1154,11.944]],["keywords/149",[]],["title/150",[6,115.198,25,49.41,114,215.99,182,148.243,200,277.201,278,200.003,284,263.555,1056,467.857]],["content/150",[]],["keywords/150",[]],["title/151",[25,70.65,182,211.969,200,396.364,401,475.86,878,696.684]],["content/151",[6,1.464,25,1.499,92,6.449,97,5.31,151,4.667,152,3.012,181,4.03,182,4.79,200,7.491,205,3.93,219,5.622,240,3.377,252,5.865,264,4.385,265,5.442,301,3.447,304,7.619,334,4.361,401,6.775,458,7.036,486,8.992,531,8.269,536,5.186,537,4.958,541,7.376,545,4.19,565,8.561,613,5.329,630,5.56,632,8.899,881,11.011,888,7.891,902,8.641,937,6.606,1001,12.677,1065,8.899,1155,10.227,1156,11.538,1157,8.992,1158,9.296,1159,12.677]],["keywords/151",[]],["title/152",[6,102.858,22,278.811,114,308.839,182,211.969,199,508.659]],["content/152",[5,3.467,6,2.379,70,3.916,87,5.581,114,6.071,155,4.787,182,4.167,192,5.399,199,7.689,252,6.227,255,6.545,293,4.495,392,7.47,423,9.869,438,6.014,462,6.381,545,4.448,613,5.657,735,7.231,893,6.752,906,8.707,912,8.378,923,10.531,926,8.2,963,6.203,1031,11.69,1062,11.953,1064,11.238,1160,8.144,1161,12.588,1162,14.85,1163,13.459,1164,9.869,1165,10.531]],["keywords/152",[]],["title/153",[6,102.858,25,70.65,114,308.839,437,416.956,1066,566.919]],["content/153",[6,2.358,25,1.526,92,6.692,114,5.981,116,6.482,181,4.182,182,4.105,183,4.944,196,4.885,198,4.193,199,7.515,200,5.856,205,5.346,206,5.587,219,5.834,240,3.505,252,6.086,265,5.647,284,7.298,310,7.105,437,6.16,462,6.237,613,5.529,614,6.789,617,8.312,638,9.052,910,6.315,1067,10.613,1068,9.33,1069,13.154,1166,10.293,1167,10.791,1168,10.293]],["keywords/153",[]],["title/154",[25,89.993,886,483.395,1074,739.744]],["content/154",[]],["keywords/154",[]],["title/155",[25,123.921]],["content/155",[6,2.422,7,5.256,25,1.12,52,4.639,111,6.354,114,6.259,202,5.18,234,7.788,248,9.129,278,4.533,284,7.638,293,4.713,301,3.838,308,5.45,311,7.213,366,8.11,400,7.581,438,6.306,537,5.519,545,4.664,548,10.603,551,7.662,613,5.932,614,7.282,617,8.916,937,7.354,1068,10.009,1169,7.703]],["keywords/155",[]],["title/156",[6,131.019,278,364.276,284,480.028]],["content/156",[6,2.289,25,1.111,70,4.073,97,5.864,155,4.979,182,3.333,183,5.261,196,5.199,202,5.138,246,5.277,278,4.496,284,7.598,293,4.676,301,3.807,330,5.15,356,7.769,396,5.457,425,6.009,537,5.474,545,4.626,717,7.997,732,5.844,893,7.023,919,11.688,936,8.302,1006,10.148,1035,10.148,1078,13.504,1170,8.529,1171,11.483]],["keywords/156",[]],["title/157",[107,332.397,181,360.573,732,473.461]],["content/157",[6,2.085,25,1.12,46,6.97,70,4.106,107,4.136,155,5.019,181,4.486,182,4.296,185,4.067,192,5.661,205,4.375,206,5.994,240,3.76,314,7.638,388,9.445,389,8.658,419,10.23,425,6.057,438,6.306,539,7.832,553,7.542,561,7.921,613,7.585,704,8.849,706,8.598,732,5.891,1172,12.008,1173,10.009]],["keywords/157",[]],["title/158",[6,151.799,184,340.004]],["content/158",[6,2.298,12,5.871,25,1.12,45,6.108,69,5.256,155,5.019,182,3.36,184,4.669,191,5.062,202,5.18,205,6.167,219,6.259,240,3.76,278,4.533,293,4.713,301,3.838,396,5.501,438,6.306,537,5.519,565,9.53,613,5.932,716,6.079,740,7.832,906,9.129,973,9.056,985,7.832,1174,10.23]],["keywords/158",[]],["title/159",[183,493.826,273,343.83]],["content/159",[6,2.415,25,1.111,44,4.651,87,5.804,92,7.121,155,4.979,182,3.333,183,6.747,196,5.199,228,7.295,273,5.47,276,10.148,304,8.413,330,4.016,399,9.131,425,6.009,462,6.637,538,8.302,545,4.626,712,10.148,858,8.413,963,6.451,1066,8.913,1170,8.529,1175,10.518,1176,9.542,1177,10.265]],["keywords/159",[]],["title/160",[281,524.746,297,383.895,379,619.122]],["content/160",[6,1.685,25,1.157,51,5.261,65,5.703,69,5.432,70,4.244,151,5.368,155,5.187,182,3.472,202,5.353,246,5.497,281,9.819,297,4.936,311,7.454,330,4.184,379,7.961,396,5.685,438,6.516,536,5.966,553,7.794,611,10.957,893,7.316,957,10.572,985,8.094,1178,11.765]],["keywords/160",[]],["title/161",[6,102.858,25,70.65,114,308.839,467,375.547,670,595.91]],["content/161",[2,5.837,6,2.239,25,1.382,52,5.725,86,6.439,114,6.041,182,4.146,196,4.96,200,7.753,202,4.902,222,4.345,234,7.371,252,6.18,265,5.733,278,4.29,284,5.653,398,5.968,437,6.255,462,6.332,467,7.345,536,5.464,560,8.439,563,6.827,613,5.614,614,6.892,699,10.304,732,5.576,874,7.065,986,10.956,1000,8.571,1032,10.956,1179,13.946]],["keywords/161",[]],["title/162",[25,79.157,65,390.118,400,535.943,408,393.825]],["content/162",[2,4.496,4,1.803,6,1.188,10,4.857,20,5.498,21,7.079,25,0.816,37,3.896,51,2.937,52,3.382,65,5.701,67,4.939,92,5.233,98,7.452,113,5.709,134,6.947,196,5.414,220,4.339,225,4.4,226,6.267,234,5.677,248,6.655,275,5.792,293,4.869,297,3.482,301,2.797,385,4.496,395,7.314,396,4.01,399,6.71,400,10.851,408,7.974,438,4.597,467,4.339,496,4.96,498,7.634,537,4.023,541,5.985,554,5.877,564,5.677,614,5.309,716,4.431,740,5.709,785,3.743,799,8.438,874,5.442,920,6.5,936,6.101,963,4.741,1038,7.634,1110,7.012,1148,8.589,1180,7.375,1181,10.741,1182,12.274,1183,6.766,1184,12.274,1185,9.924]],["keywords/162",[]],["title/163",[6,92.877,25,63.794,205,249.247,219,356.567,240,214.197,613,337.935]],["content/163",[]],["keywords/163",[]],["title/164",[107,332.397,181,360.573,732,473.461]],["content/164",[3,7.387,6,2.022,25,1.068,45,4.556,107,3.945,151,4.954,155,4.787,181,4.279,182,4.167,184,3.483,185,3.879,186,4.747,192,5.399,205,4.173,209,14.053,240,3.586,314,7.408,385,5.882,396,5.247,490,6.381,545,4.448,553,7.193,561,7.555,613,5.657,622,6.517,704,8.44,706,8.2,707,10.858,732,5.619,785,4.897,888,8.378,889,10.858,985,7.47,1186,16.059,1187,10.383,1188,12.984]],["keywords/164",[]],["title/165",[25,89.993,45,383.895,184,293.46]],["content/165",[4,1.639,6,2.002,12,5.514,25,1.052,40,6.037,45,6.535,131,8.02,155,4.714,182,3.155,184,4.996,196,4.922,205,4.109,219,5.879,225,5.669,226,8.075,227,8.132,240,3.531,255,6.446,265,5.689,278,4.257,293,4.427,301,3.604,428,8.506,438,5.923,519,8.506,537,5.183,541,7.712,551,7.197,554,7.572,613,7.284,862,9.959,937,6.907,973,8.506,1055,7.861,1189,9.836]],["keywords/165",[]],["title/166",[25,79.157,202,366.157,563,509.904,1119,686.479]],["content/166",[6,1.644,25,1.439,60,9.362,63,5.225,87,5.899,103,7.564,182,3.387,196,5.283,265,6.107,273,3.723,396,5.546,419,10.313,462,6.745,514,7.758,525,8.921,536,5.82,590,7.238,737,5.707,905,10.091,918,9.608,926,8.668,963,6.556,984,10.432,1049,10.432,1120,15.697]],["keywords/166",[]],["title/167",[6,131.019,185,326.9,480,486.819]],["content/167",[6,2.272,25,1.41,37,2.76,40,6.275,110,7.252,114,4.779,155,4.9,182,3.28,185,3.971,186,4.859,192,5.527,196,5.117,255,6.7,293,4.602,399,8.986,421,8.514,467,5.811,480,8.92,553,7.363,564,7.604,663,11.688,863,9.481,906,8.913,914,7.734,932,9.648,1123,12.236,1190,12.886,1191,10.486]],["keywords/167",[]],["title/168",[116,491.54,278,320.414,330,286.181,356,553.65]],["content/168",[6,1.555,25,1.068,76,9.546,92,6.847,97,5.638,99,5.657,116,6.632,152,3.197,182,3.204,191,4.828,196,4.998,202,4.94,224,4.869,241,5.969,265,5.777,278,4.323,284,5.697,301,4.76,311,6.879,329,7.156,330,5.908,356,9.714,438,6.014,536,5.506,537,6.845,550,9.089,565,9.089,668,8.317,751,9.869,1035,9.757,1125,11.238,1128,11.69,1170,8.2]],["keywords/168",[]],["title/169",[217,483.395,556,483.395,742,612.527]],["content/169",[6,1.657,25,1.138,37,4.015,114,4.975,182,3.415,196,5.327,202,5.265,217,7.771,293,4.791,405,8.8,532,9.967,556,7.771,564,7.916,693,7.666,703,6.385,718,6.945,742,9.848,904,12.458,918,9.687,931,10.173,958,7.916,1119,9.87,1129,13.837,1142,12.458,1192,10.644,1193,13.055]],["keywords/169",[]],["title/170",[988,1328.96]],["content/170",[6,2.07,25,1.422,37,2.29,45,3.87,60,5.089,63,2.991,97,4.789,107,3.351,114,3.965,181,4.989,182,4.592,184,2.958,196,5.828,198,3.644,199,8.965,200,6.986,202,4.196,217,4.873,278,3.672,284,6.642,293,3.818,301,3.109,330,3.28,334,5.399,356,6.345,437,5.354,462,5.42,480,4.907,514,4.89,525,7.169,537,4.471,556,4.873,563,5.843,613,6.596,705,7.944,706,6.965,718,5.535,732,4.772,742,6.174,860,8.287,932,6.207,973,7.336,1056,8.589,1164,8.383,1168,8.945,1172,9.728,1194,9.929,1195,11.937]],["keywords/170",[]],["title/171",[4,123.338,25,79.157,33,153.915,503,630.307]],["content/171",[]],["keywords/171",[]],["title/172",[33,202.738,503,830.247]],["content/172",[3,7.746,33,3.235,44,4.688,51,4.029,176,6.145,182,3.36,185,4.067,199,8.062,200,6.282,205,6.167,206,5.994,240,3.76,255,6.862,264,4.881,291,10.309,310,7.621,373,4.342,395,7.08,396,5.501,496,6.804,503,8.916,551,7.662,712,10.23,732,5.891,785,5.135,1141,11.042,1196,11.042]],["keywords/172",[]],["title/173",[33,153.915,182,237.492,503,630.307,544,444.09]],["content/173",[4,0.935,5,2.54,6,2.301,7,2.818,18,6.011,25,0.782,33,3.036,37,1.516,40,2.03,44,2.514,63,3.04,69,1.66,70,3.786,86,3.648,87,5.864,103,2.37,110,2.346,113,2.474,155,3.506,176,4.293,181,2.405,182,4.076,184,2.551,185,5.322,192,3.035,196,2.81,202,1.636,205,3.056,210,3.54,219,1.977,222,1.45,228,3.943,240,2.627,250,6.277,252,6.021,255,3.679,257,2.382,258,4.056,259,4.457,265,1.913,273,3.405,291,2.546,301,4.101,307,3.067,322,1.955,330,1.279,381,2.913,392,2.474,394,2.697,396,4.529,401,4.044,405,2.735,427,1.955,428,4.856,437,2.087,438,3.381,466,2.774,480,3.248,503,11.667,512,2.177,515,2.626,520,2.407,525,7.286,532,3.097,536,1.823,537,5.089,539,2.474,542,3.392,543,3.343,544,1.984,545,2.501,548,3.349,550,3.01,551,2.42,552,4.745,553,5.269,561,5.534,589,3.721,613,1.873,652,2.546,664,4.517,675,5.471,692,2.715,693,2.382,701,3.307,704,2.795,706,2.715,711,2.257,717,2.546,718,4.773,732,1.861,786,3.867,862,3.349,863,3.067,872,2.679,886,1.9,902,3.038,905,3.161,906,2.883,910,4.733,912,2.774,913,7.566,914,4.247,916,4.918,918,3.01,920,2.816,921,2.754,931,3.161,934,3.268,936,2.643,937,3.943,963,3.487,973,4.856,984,3.268,985,2.474,987,3.438,991,2.932,1005,4.056,1011,3.596,1012,3.656,1013,4.654,1017,3.958,1018,4.654,1019,3.349,1049,3.268,1180,3.195,1197,3.721,1198,5.318,1199,4.169,1200,5.318,1201,5.318,1202,5.318,1203,5.318,1204,2.735,1205,4.169,1206,5.318,1207,3.067,1208,5.318,1209,5.318,1210,5.318,1211,4.169,1212,5.318]],["keywords/173",[]],["title/174",[25,63.794,33,124.043,182,191.399,301,218.631,503,507.977,537,314.404]],["content/174",[1,2.277,5,1.103,6,1.468,7,5.508,8,2.706,25,1.378,33,1.128,37,1.917,46,1.654,51,2.088,58,3.196,63,2.504,65,2.86,69,4.215,70,1.246,86,2.065,92,2.178,96,2.892,97,1.794,99,1.8,110,2.254,113,2.377,114,1.485,116,2.11,125,2.022,152,3.513,155,3.404,176,3.184,182,3.026,183,4.776,184,1.108,186,2.579,194,2.976,195,6.047,196,5.141,198,1.365,202,1.572,205,2.267,217,4.824,220,4.037,222,1.393,235,3.178,238,3.455,239,2.609,240,1.141,250,2.726,255,2.082,256,2.404,264,1.481,265,4.108,273,3.623,278,1.375,281,4.428,284,1.812,288,2.523,291,2.446,293,3.78,297,4.302,300,4.81,301,2.603,311,2.189,319,2.277,330,3.247,334,1.473,366,2.461,379,3.992,394,6.848,396,3.731,400,3.929,401,2.289,414,4.464,417,2.301,425,1.838,427,1.878,432,2.685,435,2.338,437,2.005,438,5.679,462,2.03,503,4.62,512,2.091,514,4.093,525,6.001,529,2.892,536,2.992,537,3.743,541,2.492,542,3.259,543,1.892,544,5.658,545,3.163,551,2.325,553,6.049,554,4.178,560,4.62,564,2.363,565,2.892,572,3.117,613,3.074,614,3.774,622,5.48,630,3.207,639,5.435,645,3.006,660,2.866,693,2.289,695,2.523,701,5.427,715,3.803,718,5.48,722,4.395,732,3.053,734,2.573,737,2.933,738,5.641,742,3.949,743,6.106,765,3.743,860,3.104,872,2.573,875,2.706,893,3.669,902,2.919,912,2.665,920,2.706,931,3.037,936,2.54,937,3.811,943,2.685,952,2.892,954,2.685,956,3.217,961,2.817,963,1.973,965,3.178,966,4.282,968,4.005,972,3.351,973,4.693,981,4.984,982,8.092,985,2.377,987,3.303,999,3.719,1036,7.312,1041,4.005,1042,3.303,1049,3.14,1051,4.005,1052,4.131,1053,4.005,1054,3.575,1055,2.54,1110,2.919,1129,4.131,1167,3.513,1213,5.109,1214,5.109,1215,5.109,1216,4.725,1217,5.109,1218,5.109,1219,2.461,1220,2.919,1221,5.109,1222,5.109,1223,5.109,1224,2.976,1225,5.109,1226,5.109,1227,3.351]],["keywords/174",[]],["title/175",[191,471.331,879,610.406]],["content/175",[4,1.343,6,1.255,25,1.631,33,2.337,70,3.161,87,4.504,97,4.55,105,9.8,125,5.129,152,2.581,171,3.385,182,3.606,186,3.831,190,6.063,191,3.896,196,4.034,202,3.987,252,5.026,256,6.098,265,4.663,293,3.628,301,2.954,366,6.243,401,5.806,428,6.971,462,5.15,503,9.571,523,9.721,525,6.812,536,4.444,537,4.248,544,4.836,545,3.59,560,6.864,622,5.26,688,7.875,853,10.326,872,6.528,879,7.037,882,7.966,883,9.8,884,7.549,886,4.63,887,7.549,893,5.45,910,5.215,936,6.443,937,5.661,963,5.006,992,9.244,994,6.971,995,9.244,996,5.867,997,9.435,998,9.244,999,9.435,1147,7.145]],["keywords/175",[]],["title/176",[25,79.157,33,153.915,182,237.492,678,749.53]],["content/176",[]],["keywords/176",[]],["title/177",[182,237.492,199,569.907,678,749.53,878,780.572]],["content/177",[4,1.703,63,3.605,97,5.771,175,10.224,182,4.23,195,8.705,196,7.305,197,11.724,198,5.664,199,7.871,250,8.772,293,4.602,304,8.28,311,7.042,366,7.918,396,5.371,438,6.156,519,8.842,544,6.133,567,10.78,678,10.352,736,6.156,910,6.614,1038,10.224,1043,11.967,1207,9.481,1228,11.724,1229,16.439,1230,16.439,1231,16.439,1232,13.291,1233,13.777]],["keywords/177",[]],["title/178",[22,312.383,33,153.915,182,237.492,678,749.53]],["content/178",[5,3.389,6,2.222,10,6.211,33,2.968,37,2.635,63,3.442,70,5.018,171,4.099,182,4.105,252,6.086,264,5.965,293,4.394,322,5.77,428,8.442,437,6.16,531,8.58,678,12.955,695,7.751,696,9.762,705,9.141,893,6.6,918,8.884,926,8.015,963,6.062,1019,9.884,1062,11.683,1063,13.154,1064,10.984,1065,9.234,1110,8.967,1147,8.652,1234,13.154,1235,12.69,1236,12.304]],["keywords/178",[]],["title/179",[25,79.157,33,153.915,437,467.161,1066,635.181]],["content/179",[7,4.791,25,1.348,33,2.936,46,4.968,97,7.118,107,3.77,114,5.894,152,3.056,181,4.09,182,4.045,186,4.537,196,4.777,202,4.722,250,8.191,284,7.192,301,3.498,310,6.948,414,6,437,6.024,438,5.748,462,6.099,536,5.263,537,5.031,551,6.985,553,6.875,560,8.128,626,11.708,637,8.768,671,12.864,678,12.766,954,8.067,961,8.461,1015,11.708,1032,10.552,1036,12.864,1068,9.124,1237,11.173]],["keywords/179",[]],["title/180",[25,89.993,886,483.395,1074,739.744]],["content/180",[25,1.375,96,11.707,182,4.127,202,6.362,486,12.295,678,13.024,872,10.417,902,11.815,936,10.28,1077,11.707]],["keywords/180",[]],["title/181",[25,123.921]],["content/181",[6,1.579,25,1.085,33,2.728,51,3.903,52,4.494,63,3.577,69,5.092,114,4.742,152,3.247,198,4.357,205,5.481,206,5.806,219,6.063,234,7.544,240,3.642,278,4.391,293,4.566,308,6.828,396,5.329,399,8.916,440,7.544,545,4.518,613,5.746,614,7.054,622,6.619,638,9.407,659,7.503,674,5.974,692,8.328,784,11.873,785,4.974,809,8.055,963,6.3,1037,11.632]],["keywords/181",[]],["title/182",[6,131.019,278,364.276,284,480.028]],["content/182",[6,2.117,25,1.454,33,2.231,155,5.144,183,5.435,196,5.371,228,7.537,246,5.451,273,3.784,276,10.484,278,4.645,284,7.758,315,5.621,330,4.149,425,6.208,462,6.856,538,8.577,543,6.39,544,8.16,545,4.78,556,6.164,590,7.357,799,11.863,910,6.943,937,7.537,1068,10.258]],["keywords/182",[]],["title/183",[107,332.397,181,360.573,732,473.461]],["content/183",[5,3.635,6,2.085,25,1.12,44,4.688,70,4.106,87,5.851,97,5.911,107,4.136,151,5.195,155,5.019,181,4.486,182,3.36,185,4.067,186,4.977,192,5.661,240,3.76,314,7.638,385,6.167,392,7.832,396,5.501,539,10.015,553,7.542,562,9.711,613,5.932,678,10.603,704,8.849,717,8.062,732,5.891,879,6.555,1003,13.613]],["keywords/183",[]],["title/184",[6,151.799,184,340.004]],["content/184",[6,2.289,12,5.824,25,1.424,45,4.738,65,5.474,97,5.864,155,4.979,171,4.362,176,6.095,182,3.333,184,5.128,191,5.021,205,4.34,219,6.208,240,3.73,265,6.009,293,4.676,301,3.807,314,5.925,426,10.388,438,6.255,537,5.474,541,8.145,613,7.546,973,8.983,985,7.769,1016,12.432,1238,11.688]],["keywords/184",[]],["title/185",[183,493.826,273,343.83]],["content/185",[4,1.731,6,2.074,25,1.111,70,4.073,183,6.747,191,5.021,196,5.199,202,5.138,273,5.186,276,10.148,301,3.807,330,4.016,385,6.118,399,9.131,425,6.009,532,9.728,537,5.474,538,8.302,544,6.232,545,5.933,611,10.518,740,7.769,858,8.413,920,8.845,1066,8.913,1174,10.148,1175,10.518,1177,10.265,1239,13.998]],["keywords/185",[]],["title/186",[25,70.65,33,137.374,467,375.547,670,595.91,678,668.979]],["content/186",[6,2.012,25,1.06,33,2.687,96,9.02,97,5.595,100,5.902,107,3.914,179,7.921,181,4.246,182,4.146,184,3.456,186,4.71,196,4.96,202,4.902,255,6.495,272,6.795,278,4.29,284,5.653,295,9.794,389,8.195,428,8.571,467,5.633,479,9.575,536,5.464,551,7.252,560,8.439,614,6.892,617,8.439,622,6.467,678,14.56,732,5.576,989,11.365,999,11.6,1000,8.571,1240,15.936]],["keywords/186",[]],["title/187",[4,123.338,25,79.157,182,237.492,678,749.53]],["content/187",[25,1.375,182,4.127,202,6.362,255,8.43,407,10.086,486,12.295,678,13.024,872,10.417,902,11.815,1077,11.707]],["keywords/187",[]],["title/188",[25,89.993,373,348.994,678,852.135]],["content/188",[1,3.98,4,1.737,5,1.928,6,0.865,7,5.877,8,7.28,10,3.534,12,4.063,19,1.574,22,4.045,23,4.145,24,3.083,25,1.352,28,3.863,29,4.834,32,1.111,33,1.993,34,3.148,35,3.943,37,1.499,44,1.462,53,5.808,60,1.959,84,2.802,87,1.825,98,6.602,107,1.29,110,3.94,111,1.981,122,3.92,125,3.534,151,1.62,152,2.737,156,2.781,161,1.659,167,2.282,182,1.782,185,1.268,188,2.945,193,2.104,198,4.117,206,1.869,224,2.708,241,1.952,251,4.966,271,1.863,273,3.015,295,5.489,300,2.895,314,3.168,319,2.34,330,1.262,334,1.514,355,3.519,364,2.847,368,3.307,373,2.303,381,1.694,394,2.663,396,1.716,398,1.966,408,1.737,458,2.442,483,2.824,491,3.822,538,2.61,543,3.307,572,1.876,630,5.054,656,3.121,678,12.362,736,1.966,758,2.271,765,1.721,768,3,770,2.593,771,4.669,772,2.178,773,4.592,774,6.37,775,4.276,777,2.34,780,2.781,782,3.089,787,2.545,843,5.275,886,4.163,901,2.004,993,2.529,996,5.275,1160,2.663,1196,3.443,1220,3,1241,5.251,1242,4.116,1243,5.251,1244,13.749,1245,5.251,1246,8.931,1247,11.653,1248,7.816,1249,8.931,1250,5.251,1251,3.822,1252,5.251,1253,5.251,1254,3.55,1255,7.221,1256,2.972,1257,2.402,1258,7.816,1259,4.245,1260,4.401,1261,5.697,1262,3.227,1263,3.745,1264,3.908,1265,8.931,1266,8.931,1267,8.931,1268,2.719,1269,5.251,1270,5.251,1271,5.251,1272,3.822,1273,5.251,1274,5.251,1275,5.251,1276,2.781,1277,5.251,1278,2.593,1279,5.251,1280,4.116,1281,5.251,1282,5.251,1283,4.401,1284,5.251,1285,4.856,1286,5.251,1287,5.251,1288,5.251,1289,5.251,1290,5.251,1291,5.251]],["keywords/188",[]],["title/189",[25,79.157,65,390.118,400,535.943,408,393.825]],["content/189",[2,8.072,4,2.101,5,3.771,6,2.252,10,6.912,25,1.348,33,2.259,35,3.541,37,4.054,63,2.708,69,3.854,92,5.264,100,6.469,113,5.743,114,5.078,134,6.988,182,2.463,185,2.983,196,3.843,252,4.788,265,4.442,293,4.89,295,10.736,334,3.56,400,9.924,408,7.989,467,7.166,503,6.538,514,4.426,536,5.99,541,6.021,548,7.775,561,5.809,936,6.137,963,6.747,1030,6.059,1038,7.679,1110,7.053,1148,8.64,1292,12.347,1293,12.347,1294,10.348,1295,9.678]],["keywords/189",[]],["title/190",[6,92.877,25,63.794,205,249.247,219,356.567,240,214.197,613,337.935]],["content/190",[6,1.89,25,1.298,69,6.094,205,5.072,219,7.256,240,4.359,246,6.167,419,11.859,542,12.452,553,8.743,556,6.973,613,8.315,799,13.42,872,9.832,902,11.151]],["keywords/190",[]],["title/191",[107,332.397,181,360.573,732,473.461]],["content/191",[6,2.14,70,4.279,87,6.098,107,4.31,155,6.588,176,6.404,181,5.889,192,5.899,240,3.918,288,8.666,293,4.912,314,7.84,330,4.219,425,6.312,490,6.972,613,6.181,617,9.292,622,7.121,704,9.222,732,6.139,893,7.378,985,8.162,1114,8.96,1296,14.187]],["keywords/191",[]],["title/192",[25,89.993,45,383.895,184,293.46]],["content/192",[6,2.002,12,5.514,25,1.052,45,6.535,171,4.13,182,3.155,184,5.298,191,4.754,196,4.922,204,7.483,205,4.109,219,5.879,225,5.669,226,8.075,227,8.132,240,3.531,246,4.996,293,4.427,301,3.604,323,8.718,536,5.423,537,5.183,550,8.951,551,7.197,554,7.572,613,8.115,678,9.959,862,9.959,894,7.923,973,8.506,1148,11.067,1297,10.693]],["keywords/192",[]],["title/193",[25,79.157,202,366.157,563,509.904,1119,686.479]],["content/193",[25,1.336,63,4.404,151,6.196,202,7.387,519,10.802,525,10.556,536,6.887,563,8.604,864,13.171,872,10.116,902,11.474,1119,11.583]],["keywords/193",[]],["title/194",[60,504.882,63,296.762,514,485.1]],["content/194",[4,1.915,6,1.789,25,1.229,60,9.242,63,4.053,92,7.88,152,3.679,196,5.752,198,4.937,273,5.006,396,6.038,512,7.565,514,6.625,590,7.88,737,7.675,926,9.437,963,7.138,1119,10.659]],["keywords/194",[]],["title/195",[6,131.019,185,326.9,480,486.819]],["content/195",[5,4.062,6,2.417,25,1.251,87,6.538,155,5.608,176,6.866,185,4.545,196,5.856,297,5.337,480,8.303,863,10.851,906,10.201,932,8.562,934,11.563,1023,14.004,1298,11.305,1299,13.696]],["keywords/195",[]],["title/196",[116,491.54,278,320.414,330,286.181,356,553.65]],["content/196",[6,2.129,12,6.067,25,1.157,40,6.642,92,7.419,116,9.079,196,5.416,241,6.468,278,4.684,293,4.871,321,10.694,330,6.088,356,10.226,544,6.492,545,4.82,551,7.918,668,9.012,734,8.764,751,10.694,910,7.001,937,7.6,1035,10.572,1170,8.885]],["keywords/196",[]],["title/197",[217,483.395,556,483.395,742,612.527]],["content/197",[4,1.898,25,1.218,33,2.369,37,3.812,63,4.979,202,5.635,217,6.544,222,4.995,273,4.017,334,5.282,512,7.498,514,6.567,536,6.281,543,6.784,556,8.11,718,7.434,742,8.292,921,9.487,958,8.473,963,7.075]],["keywords/197",[]],["title/198",[988,1328.96]],["content/198",[6,2.128,19,4.315,25,1.565,33,1.861,68,7.565,70,3.51,97,5.053,107,3.536,125,5.696,181,3.835,182,4.696,190,6.733,196,4.48,202,5.975,255,5.867,265,5.178,278,3.875,284,5.106,293,4.029,301,3.281,366,6.934,428,7.742,437,5.649,462,5.719,523,7.742,536,4.936,537,4.718,563,6.166,596,10.073,613,5.071,639,6.851,642,6.448,678,14.819,732,5.036,893,6.052,910,5.792,937,6.287,973,7.742,989,10.266,1119,8.302,1167,9.896,1194,10.478]],["keywords/198",[]],["title/199",[25,58.151,33,113.071,179,434.636,180,402.245,194,509.266,220,309.108,315,284.809]],["content/199",[]],["keywords/199",[]],["title/200",[25,63.794,33,124.043,179,476.813,180,441.279,194,558.686,961,528.808]],["content/200",[]],["keywords/200",[]],["title/201",[107,260.952,181,283.072,641,743.425,893,446.695,1300,488.703]],["content/201",[6,1.972,9,7.074,12,5.392,25,1.028,33,1.999,51,3.7,58,5.664,99,5.447,113,7.192,151,4.771,180,7.113,181,4.12,182,3.085,185,4.921,194,9.006,205,4.018,220,5.466,230,4.885,250,8.252,264,4.483,291,7.404,310,6.999,314,5.485,315,5.036,330,3.718,410,9.998,425,5.563,455,7.404,478,9.617,503,8.188,504,6.856,506,8.384,582,8.674,622,6.275,641,10.821,652,7.404,664,7.737,674,5.664,707,10.455,1082,10.292,1227,10.14,1301,13.532]],["keywords/201",[]],["title/202",[4,110.083,108,554.215,207,585.638,240,237.216,1302,929.703]],["content/202",[1,7.101,3,7.331,4,1.651,6,1.543,25,1.06,33,2.687,155,4.75,180,7.331,190,7.454,194,9.281,220,5.633,227,8.195,235,12.923,236,10.956,237,10.451,240,3.558,241,5.923,242,8.785,243,7.331,307,9.191,372,10.304,396,5.207,414,6.229,467,5.633,551,7.252,639,7.585,736,5.968,860,9.682,873,9.575,1021,8.571,1110,9.104,1151,10.304,1189,9.911,1303,13.946,1304,13.356,1305,11.152,1306,15.936,1307,15.936]],["keywords/202",[]],["title/203",[225,426.689,278,320.414,563,509.904,1308,673.714]],["content/203",[4,1.639,6,2.002,25,1.375,33,2.045,40,6.037,69,6.454,88,7.089,180,7.275,182,3.155,192,5.317,194,9.211,205,4.109,222,4.312,225,7.412,226,8.075,229,8.871,231,11.279,277,9.121,301,3.604,440,7.315,545,4.381,632,9.304,636,8.645,640,11.279,668,8.191,732,5.533,739,10.226,891,8.718,897,10.371,914,7.44,985,7.356,1114,8.075,1309,7.44,1310,9.211,1311,13.254,1312,15.815]],["keywords/203",[]],["title/204",[207,482.031,264,253.505,674,320.274,890,623.629,1313,519.794,1314,623.629,1315,550.628]],["content/204",[6,1.617,25,1.111,33,2.16,63,3.663,152,3.325,180,7.683,182,3.333,185,4.035,191,5.021,194,9.728,220,5.904,235,10.388,264,4.842,273,4.697,315,5.44,330,4.016,373,4.308,500,11.688,664,8.357,674,7.846,716,6.03,718,6.778,719,11.483,866,9.826,905,9.929,918,9.454,996,7.56,1125,11.688,1316,15.445,1317,11.688,1318,16.703,1319,16.703]],["keywords/204",[]],["title/205",[185,287.538,273,261.029,462,472.946,1320,640.194]],["content/205",[6,1.935,25,0.999,49,7.065,60,5.603,70,3.662,103,6.692,180,6.908,185,4.827,194,8.746,222,4.095,241,5.582,273,4.382,284,5.327,293,4.204,301,3.423,455,7.19,536,5.149,537,4.922,541,7.323,544,5.603,545,5.535,590,6.403,622,6.094,631,8.746,640,10.71,660,8.423,696,9.34,703,5.603,732,5.254,785,4.58,893,6.314,926,7.668,1006,9.124,1020,12.585,1321,12.585,1322,12.141,1323,11.771,1324,15.017,1325,9.71,1326,9.229,1327,8.014,1328,15.017,1329,7.615,1330,11.771]],["keywords/205",[]],["title/206",[124,445.761,181,317.157,757,769.603,786,509.904]],["content/206",[6,1.657,25,1.138,46,5.54,70,4.174,181,5.797,182,3.415,185,4.134,186,5.059,194,9.967,278,4.607,305,10.644,314,7.717,315,5.574,334,4.935,392,7.961,490,6.8,536,5.868,539,7.961,561,8.051,564,7.916,614,7.402,786,7.332,886,6.114,957,10.398,1003,13.837,1075,12.739,1126,12.739,1331,17.115,1332,9.205]],["keywords/206",[]],["title/207",[7,331.64,46,343.888,373,273.982,1333,790.76,1334,1062.382]],["content/207",[1,6.942,3,7.166,4,1.614,7,4.863,8,8.249,37,2.615,51,3.728,52,4.292,58,5.706,97,5.469,99,5.488,125,6.164,182,3.108,186,4.605,195,8.249,196,4.849,199,7.459,200,5.812,220,5.507,246,4.921,264,4.516,373,4.018,395,6.55,432,8.187,506,8.446,524,10.216,542,9.937,560,8.249,622,8.308,645,9.165,736,5.834,738,10.073,799,10.71,985,7.246,1065,9.165,1068,9.261,1077,8.818,1151,10.073,1197,10.902,1303,13.633,1323,12.212,1335,12.212]],["keywords/207",[]],["title/208",[315,387.69,550,673.714,622,483.032,785,362.986]],["content/208",[6,1.617,25,1.111,152,3.325,184,3.622,185,4.035,198,4.462,205,4.34,219,6.208,220,7.572,240,3.73,252,6.477,299,10.388,301,3.807,315,5.44,330,5.15,356,7.769,371,8.713,537,5.474,545,5.933,613,5.884,652,7.997,706,8.529,926,8.529,1024,7.858,1045,12.741,1329,8.47,1336,14.617,1337,13.998,1338,15.445,1339,7.482,1340,16.703]],["keywords/208",[]],["title/209",[25,63.794,125,379.585,241,356.567,243,441.279,315,312.447,1341,775.576]],["content/209",[22,4.302,23,4.298,24,4.617,32,3.469,34,4.845,35,2.471,37,1.447,124,6.138,151,2.659,152,1.716,161,5.836,164,4.2,167,7.124,184,1.869,185,2.082,224,2.613,225,3.089,240,2.986,241,4.971,271,3.057,275,2.87,308,2.79,330,3.216,335,9.539,347,3.964,355,5.271,520,6.054,572,3.079,630,6.791,641,6.031,735,3.88,758,3.727,764,4.711,765,4.384,767,7.641,770,4.256,771,5.359,772,3.575,773,5.271,774,4.711,775,4.126,776,6.366,777,3.84,778,6.415,780,4.564,806,6.442,886,3.079,901,3.29,910,3.468,981,4.923,1024,4.054,1157,9.743,1256,4.878,1309,6.292,1342,9.043,1343,5.123,1344,8.618,1345,5.36,1346,6.574,1347,5.36,1348,8.618,1349,8.618,1350,6.574,1351,6.415,1352,8.618,1353,11.209,1354,5.236,1355,8.618,1356,5.497,1357,8.618,1358,8.618,1359,6.574]],["keywords/209",[]],["title/210",[171,250.496,184,208.027,191,288.379,272,409.004,1360,596.617,1361,515.945]],["content/210",[4,1.377,6,1.287,22,3.488,23,3.862,25,0.884,32,2.813,34,3.043,88,4.558,164,4.174,176,4.851,193,5.326,205,4.779,220,4.699,224,4.03,240,2.968,297,3.771,330,3.196,334,3.833,385,4.869,432,6.986,438,4.978,477,12.284,478,8.267,496,5.371,515,6.564,613,4.683,660,7.456,954,6.986,991,7.327,996,6.017,1326,8.169,1343,7.901,1346,10.139,1360,8.267,1361,9.893,1362,14.419,1363,14.419,1364,13.292,1365,15.354,1366,11.632,1367,10.747,1368,11.14,1369,11.632,1370,11.14,1371,11.632,1372,11.14,1373,11.14,1374,11.632,1375,13.292,1376,12.292,1377,8.604]],["keywords/210",[]],["title/211",[105,733.699,886,483.395,1378,841.635]],["content/211",[4,1.303,22,4.643,23,4.209,24,6.107,25,1.176,28,5.437,29,7.338,32,2.66,33,1.625,34,4.051,35,3.605,37,2.11,45,3.566,68,9.298,111,4.743,184,2.726,185,3.037,198,3.358,220,4.444,224,3.811,246,3.971,271,4.459,275,4.186,314,4.459,355,4.954,572,4.49,613,4.428,630,7.525,722,6.331,758,5.437,764,6.872,765,5.798,767,7.181,770,6.208,771,7.088,772,5.214,773,6.972,775,6.019,776,8.42,777,5.602,780,6.657,965,7.818,1191,8.019,1379,12.57,1380,11.624,1381,12.57,1382,12.57]],["keywords/211",[]],["title/212",[25,89.993,437,531.112,696,841.635]],["content/212",[1,5.67,4,1.849,6,1.232,25,0.846,37,2.136,44,5.738,46,4.119,60,4.747,63,2.79,70,4.351,86,5.141,107,3.125,109,8.227,154,4.677,180,5.853,181,5.49,184,2.759,185,4.31,192,4.278,194,7.41,203,6.452,205,3.306,220,4.498,236,8.748,237,8.344,252,4.934,273,3.913,278,3.425,310,5.759,314,4.514,322,6.559,385,7.547,398,4.765,477,7.41,478,7.914,496,5.141,537,4.17,565,7.202,568,7.485,590,5.425,614,5.503,622,5.163,650,7.338,704,6.687,891,7.014,1020,10.664,1032,8.748,1065,7.485,1109,6.59,1183,7.014,1361,6.844,1378,7.914,1383,12.724,1384,8.748,1385,10.664,1386,12.724,1387,12.724,1388,8.117,1389,10.287,1390,12.724,1391,10.287,1392,10.287]],["keywords/212",[]],["title/213",[6,71.935,7,231.936,25,49.41,33,96.074,37,124.737,182,148.243,262,634.931,963,286.966]],["content/213",[]],["keywords/213",[]],["title/214",[5,256.976,6,115.243,14,447.448,262,635.181]],["content/214",[]],["keywords/214",[]],["title/215",[87,544.842,181,417.762]],["content/215",[4,2.197,5,3.549,6,2.053,33,2.126,70,4.009,79,8.705,87,5.713,181,4.38,182,4.683,185,3.971,192,5.527,199,7.871,200,6.133,202,5.057,246,5.193,262,11.314,264,4.766,314,7.521,396,5.371,438,6.156,532,9.574,561,7.734,703,6.133,704,8.64,706,8.394,907,10.103,937,7.18,999,11.967,1393,13.291,1394,13.777]],["keywords/215",[]],["title/216",[561,876.641]],["content/216",[5,3.577,6,2.063,33,2.143,63,3.634,70,4.041,87,5.758,103,7.384,182,4.252,185,4.003,222,4.518,262,8.842,392,7.707,532,9.65,543,6.136,550,9.379,561,10.026,652,7.934,664,8.29,675,7.707,711,7.032,718,6.724,785,5.053,893,6.967,904,12.062,905,9.85,910,6.667,921,8.581,963,6.4,1180,9.956,1395,12.334,1396,16.57,1397,13.397]],["keywords/216",[]],["title/217",[182,211.969,301,242.127,786,455.105,886,379.495,1398,668.979]],["content/217",[5,3.521,6,2.393,12,5.687,44,4.542,70,3.978,96,9.232,182,4.665,185,3.94,240,3.642,262,8.704,293,4.566,301,3.717,322,5.996,405,8.387,520,7.383,544,6.085,693,7.306,712,9.909,717,7.809,786,6.987,886,5.826,887,9.499,893,6.858,926,8.328,943,8.572,957,9.909,983,9.696,1204,8.387,1205,12.785,1220,9.318,1398,10.271,1399,12.785]],["keywords/217",[]],["title/218",[6,115.243,185,287.538,480,428.201,1400,667.664]],["content/218",[4,1.788,5,3.725,6,2.325,33,2.231,37,2.897,70,4.208,155,5.144,176,6.297,185,4.169,192,5.802,196,5.371,480,7.868,551,7.853,662,12.307,663,9.513,863,9.952,906,9.356,914,8.118,924,11.008,932,9.952,934,10.605,982,9.208,1016,12.844,1123,12.844,1401,12.307,1402,12.561]],["keywords/218",[]],["title/219",[18,397.612,33,153.915,185,287.538,252,461.561]],["content/219",[5,3.549,6,1.592,18,7.082,33,2.742,44,4.577,110,9.353,179,8.171,182,4.23,185,3.971,196,5.117,222,4.483,252,8.222,262,11.314,291,7.871,293,5.935,299,10.224,322,6.043,496,6.643,515,8.118,529,9.305,712,9.988,718,6.671,732,5.752,936,8.171,973,8.842,991,9.062,1017,12.236,1018,14.386,1043,11.967]],["keywords/219",[]],["title/220",[185,287.538,273,261.029,675,553.65,692,607.783]],["content/220",[6,1.604,33,2.756,103,7.384,176,6.047,182,3.306,185,4.003,240,3.7,262,8.842,273,5.166,301,4.857,334,4.778,373,4.273,381,5.347,438,6.205,532,9.65,537,5.431,543,6.136,545,4.59,664,8.29,675,7.707,692,8.461,716,5.982,904,12.062,905,9.85,910,6.667,926,8.461,1011,11.204,1012,11.392,1042,10.714,1049,10.183,1403,11.817]],["keywords/220",[]],["title/221",[6,102.858,97,372.969,180,488.703,182,211.969,185,256.637]],["content/221",[5,3.665,6,2.307,33,2.799,70,4.14,97,5.959,114,4.935,180,9.956,182,4.318,183,5.347,185,4.101,196,5.283,222,4.629,262,9.058,293,4.752,330,5.204,334,4.894,425,6.107,544,6.333,545,5.995,617,8.989,862,10.689,893,7.137,910,6.83,936,8.437,957,10.313]],["keywords/221",[]],["title/222",[7,371.572,250,635.181,255,485.12,552,625.565]],["content/222",[3,7.562,7,5.132,25,1.093,33,3.035,49,7.734,92,7.009,113,7.646,196,6.599,250,11.314,255,6.7,257,7.363,258,12.539,259,13.777,262,11.314,291,7.871,297,4.664,308,5.321,310,7.441,334,4.74,438,6.156,533,9.305,536,5.637,548,10.352,551,7.481,553,7.363,590,7.009,866,9.671,937,7.18,956,10.352,965,10.224,1013,14.386]],["keywords/222",[]],["title/223",[18,397.612,33,153.915,184,258.124,973,640.194]],["content/223",[6,1.555,18,6.976,33,3.001,114,4.668,184,5.329,219,7.762,220,7.382,262,12.384,293,4.495,307,12.044,322,8.531,440,7.428,536,5.506,550,9.089,589,11.238,613,5.657,718,6.517,866,9.447,922,12.249,931,9.546,943,8.44,982,8.57,987,10.383,1037,11.453,1164,9.869,1404,16.059]],["keywords/223",[]],["title/224",[428,843.27,512,641.789]],["content/224",[33,2.799,44,4.727,63,3.723,86,6.859,176,6.195,182,3.387,185,4.101,205,4.411,222,4.629,240,4.833,262,9.058,265,6.107,273,3.723,417,7.643,424,10.975,428,9.13,438,6.357,512,6.949,536,5.82,718,6.889,785,5.177,921,8.791,937,7.414,963,6.556,991,9.358,994,9.13,1007,8.921,1010,13.724,1011,11.478,1012,11.67]],["keywords/224",[]],["title/225",[16,449.64,33,113.071,182,174.469,417,393.72,662,623.629,663,482.031,952,494.931]],["content/225",[4,1.985,21,11.051,33,3.018,79,10.146,182,3.823,193,7.677,206,6.821,240,4.278,262,12.455,417,10.509,533,10.845,564,8.863,703,7.149,961,10.563,1405,16.768]],["keywords/225",[]],["title/226",[114,346.026,284,422.228,670,667.664,953,885.975]],["content/226",[6,2.338,25,1.021,33,2.622,182,3.062,196,4.777,205,3.988,240,3.427,255,6.256,262,12.114,265,5.522,284,8.053,293,4.297,299,9.546,330,3.69,334,5.845,347,7.061,348,8.688,417,6.911,425,5.522,544,5.727,545,5.616,553,6.875,587,9.791,636,8.391,664,7.68,701,9.546,711,8.604,732,5.37,751,9.433,953,11.425,954,8.067,1025,11.708,1406,12.032,1407,11.708]],["keywords/226",[]],["title/227",[63,296.762,301,308.418,786,579.706]],["content/227",[33,2.66,40,5.992,51,4.923,52,4.325,97,7.223,103,6.994,114,4.563,149,6.511,182,3.132,186,4.639,192,5.277,206,5.587,240,3.505,262,8.376,273,3.442,301,4.689,308,5.081,310,7.105,417,7.067,496,6.342,543,5.813,551,7.143,581,6.661,713,10.148,714,10.447,786,8.814,874,6.959,897,10.293,898,10.791,937,6.855,955,9.052,958,7.26,963,6.062,1028,9.052,1030,7.702,1408,13.736,1409,15.696]],["keywords/227",[]],["title/228",[97,475.083,958,625.942,1410,1184.242]],["content/228",[3,6.908,7,4.688,19,4.502,33,2.584,51,4.782,92,6.403,97,7.015,98,6.433,100,5.561,125,7.907,155,4.476,182,2.996,206,5.346,240,3.353,262,8.014,272,6.403,291,7.19,310,6.797,314,5.327,389,7.722,417,6.762,492,10.154,514,5.383,515,7.416,583,13.142,636,8.209,785,4.58,865,9.848,897,9.848,911,9.579,924,9.579,936,7.464,958,11.073,963,5.8,994,8.077,1029,10.931,1411,13.142,1412,13.886,1413,16.746,1414,15.017]],["keywords/228",[]],["title/229",[16,612.063,25,79.157,262,635.181,952,673.714]],["content/229",[6,1.789,7,5.769,25,1.518,33,2.952,37,3.103,182,3.687,262,13.219,293,5.173,417,8.321,437,7.253,462,7.343,514,6.625,703,6.895,872,9.308,902,10.558,952,10.46,961,10.188,990,14.487]],["keywords/229",[]],["title/230",[7,489.185,182,211.969,288,524.652,514,380.833]],["content/230",[4,1.898,7,8.051,25,1.51,110,8.081,182,3.655,196,5.702,250,9.775,255,7.466,310,8.292,364,9.932,396,5.985,514,6.567,536,6.281,614,7.923,617,9.7,937,8.001,1169,8.381,1415,18.319,1416,16.939]],["keywords/230",[]],["title/231",[152,236.98,217,425.189,414,465.275,544,444.09]],["content/231",[4,2.243,6,2.095,7,6.756,25,1.439,46,5.495,58,6.217,152,4.309,182,3.387,217,7.731,222,4.629,293,4.752,414,8.46,533,9.608,544,6.333,572,6.064,695,8.383,701,10.557,732,5.939,954,8.921,956,10.689,1037,12.106,1187,10.975,1305,11.879,1417,9.279,1418,13.306]],["keywords/231",[]],["title/232",[62,455.105,86,429.278,297,301.381,300,585.638,417,478.346]],["content/232",[25,1.148,33,2.231,86,6.973,96,9.767,97,6.058,125,6.828,182,3.443,196,5.371,262,9.208,293,4.83,297,6.204,300,13.236,304,8.692,396,5.638,401,7.729,417,7.77,525,9.069,532,10.05,548,10.866,630,6.344,703,6.438,912,9.002,937,7.537,961,9.513,1040,11.008,1419,13.163,1420,15.957]],["keywords/232",[]],["title/233",[183,334.613,273,232.977,425,382.183,544,396.364,545,294.262]],["content/233",[6,1.685,18,5.812,25,1.157,33,2.25,44,4.845,155,5.187,183,6.925,262,9.285,273,4.821,276,10.572,284,6.172,330,4.184,399,9.512,425,6.26,462,6.914,544,8.203,545,6.09,613,6.13,712,10.572,722,8.764,732,6.088,858,8.764,914,8.186,1066,9.285,1170,8.885]],["keywords/233",[]],["title/234",[183,334.613,273,232.977,514,380.833,981,606.904,982,566.919]],["content/234",[23,4.155,25,1.304,32,4.149,63,4.3,116,6.028,155,4.351,164,6.157,166,7.914,182,2.912,183,4.597,262,7.789,273,4.3,512,5.975,514,5.232,543,5.405,544,5.446,545,4.043,718,5.923,804,7.074,910,5.873,918,8.262,921,7.559,963,5.638,974,9.311,975,7.85,976,12.773,977,12.233,978,12.233,979,11.801,980,12.233,981,8.338,982,10.462,983,8.677,1046,11.801,1047,10.625,1421,12.773]],["keywords/234",[]],["title/235",[152,269.421,183,426.225,737,454.965]],["content/235",[23,3.265,25,1.111,92,7.121,152,4.265,155,4.979,164,5.245,183,6.747,196,6.667,262,8.913,284,5.925,291,7.997,297,4.738,330,5.15,438,6.255,544,6.232,545,4.626,613,5.884,659,7.683,737,7.95,910,6.721,920,8.845,972,10.953,1041,13.093,1422,11.688,1423,14.617,1424,14.617,1425,13.998]],["keywords/235",[]],["title/236",[5,292.154,152,269.421,742,612.527]],["content/236",[5,3.494,6,2.032,25,1.076,33,2.093,37,3.911,63,3.549,103,7.212,152,3.222,186,4.784,202,4.978,262,8.636,293,4.53,334,4.666,392,7.528,401,7.249,467,5.721,498,10.065,512,8.591,536,5.549,551,7.364,579,10.464,581,6.868,718,8.517,742,9.5,785,4.935,907,9.946,944,9.078,963,6.251,984,9.946,1224,9.425,1426,12.345,1427,8.636]],["keywords/236",[]],["title/237",[281,461.561,297,337.67,379,544.573,614,514.812]],["content/237",[6,2.325,18,5.764,25,1.148,46,5.586,51,4.129,65,5.656,69,5.387,70,4.208,87,5.997,155,5.144,202,5.308,225,6.186,252,6.691,281,9.31,297,4.895,379,7.895,385,6.32,396,5.638,438,6.462,536,5.917,553,7.729,613,7.704,614,7.463,985,8.026,1428,15.957]],["keywords/237",[]],["title/238",[184,230.384,220,375.547,288,524.652,394,538.737,982,566.919]],["content/238",[4,1.849,25,1.187,180,8.21,184,3.87,194,10.394,220,8.62,239,9.113,240,3.985,255,7.274,310,8.078,394,9.051,395,9.393,553,7.994,554,8.545,560,9.451,613,6.287,622,7.243,639,8.495,982,9.524,1054,12.489,1055,8.871,1065,10.5,1151,11.54]],["keywords/238",[]],["title/239",[37,178.358,125,420.379,400,478.346,639,505.648,743,743.425]],["content/239",[3,7.622,4,1.717,25,1.417,33,2.143,37,2.782,51,3.965,58,6.069,65,6.985,88,5.681,97,5.817,99,5.837,125,6.557,182,3.306,195,8.774,200,6.182,262,8.842,264,4.804,293,4.638,396,5.414,400,7.461,438,6.205,462,6.584,639,7.887,743,14.913,875,8.774,937,7.237,991,9.134,1043,12.062,1051,12.989,1052,13.397,1065,9.748,1151,10.714]],["keywords/239",[]],["title/240",[3,488.703,278,285.979,330,255.425,426,660.735,765,348.193]],["content/240",[3,7.746,5,3.635,6,2.085,25,1.12,69,5.256,155,5.019,176,7.857,205,4.375,255,6.862,278,5.796,293,4.713,330,5.177,426,10.472,438,6.306,466,8.784,541,8.211,545,4.664,550,9.53,617,8.916,765,8.199,1118,10.887,1164,13.232,1429,16.838,1430,13.613,1431,16.838]],["keywords/240",[]],["title/241",[191,471.331,879,610.406]],["content/241",[4,1.343,6,2.015,7,4.046,19,3.885,25,1.575,33,1.676,37,3.035,49,6.098,63,2.842,87,4.504,105,9.8,125,5.129,171,3.385,181,3.454,182,3.606,186,3.831,190,6.063,191,3.896,196,4.034,202,3.987,262,12.015,297,3.677,428,6.971,437,5.087,462,5.15,512,5.306,523,6.971,560,6.864,561,6.098,562,7.475,613,4.566,617,6.864,622,5.26,642,5.806,688,7.875,732,4.535,853,10.326,866,7.625,872,6.528,879,5.046,882,7.966,883,7.027,884,7.549,886,6.457,887,7.549,937,5.661,963,5.006,994,6.971,996,5.867,1000,6.971,1056,8.162,1057,10.479,1187,8.38,1418,10.16,1432,11.986,1433,11.343]],["keywords/241",[]],["title/242",[1434,1195.939,1435,1167.014]],["content/242",[]],["keywords/242",[]],["title/243",[1436,1372.068,1437,1267.615]],["content/243",[33,1.42,37,3.73,58,4.022,114,3.192,180,5.051,185,2.652,367,14.05,670,6.159,958,5.079,1438,21.919,1439,10.98,1440,10.98,1441,13.455,1442,20.086,1443,22.215,1444,10.512,1445,10.154,1446,10.154,1447,16.055,1448,10.98,1449,10.154,1450,10.98,1451,10.154,1452,10.154,1453,14.846,1454,9.609,1455,10.154,1456,8.877,1457,10.98,1458,10.98,1459,10.154,1460,10.98,1461,10.98,1462,19.308,1463,16.055,1464,14.846,1465,20.88,1466,16.171,1467,18.979,1468,10.154,1469,10.98,1470,10.98,1471,10.154,1472,10.98,1473,16.055,1474,10.98]],["keywords/243",[]],["title/244",[1436,1630.706]],["content/244",[37,1.406,51,2.004,58,8.28,99,2.951,107,3.213,114,2.435,185,3.16,200,4.88,206,2.981,264,2.428,301,1.909,367,15.919,414,3.274,480,3.013,670,10.204,1259,6.772,1441,13.489,1442,19.912,1445,22.386,1446,7.745,1449,7.745,1451,7.745,1452,7.745,1453,14.883,1454,14.085,1456,6.772,1459,12.096,1462,14.883,1464,12.096,1468,18.247,1471,14.883,1475,13.081,1476,12.096,1477,13.081,1478,8.376,1479,7.337,1480,13.081,1481,8.376,1482,8.376,1483,8.376,1484,16.095,1485,8.376,1486,13.081,1487,8.376,1488,13.081,1489,16.095,1490,8.376,1491,8.376,1492,16.095,1493,8.376,1494,8.376,1495,7.745,1496,8.376,1497,8.376,1498,8.376,1499,7.745,1500,8.376,1501,4.785,1502,8.376,1503,8.376,1504,8.376,1505,8.376,1506,8.376,1507,13.081,1508,8.376,1509,8.376,1510,13.081,1511,9.522,1512,8.376,1513,13.081,1514,8.376,1515,8.376,1516,7.745,1517,7.33,1518,7.745,1519,8.376,1520,8.376,1521,8.376,1522,7.745,1523,8.376,1524,8.376,1525,8.376,1526,4.578,1527,8.376,1528,8.376,1529,8.376,1530,8.376,1531,8.376,1532,8.376,1533,8.376]],["keywords/244",[]],["title/245",[516,806.215,1436,1372.068]],["content/245",[5,4.336,52,5.534,107,4.933,308,6.501,315,6.542,650,11.583,1441,16.832,1534,20.085,1535,20.085,1536,14.055,1537,20.085,1538,20.085,1539,20.085]],["keywords/245",[]],["title/246",[25,70.65,179,528.056,208,580.745,220,375.547,315,346.025]],["content/246",[]],["keywords/246",[]],["title/247",[25,70.65,179,528.056,186,314.016,208,580.745,555,660.735]],["content/247",[25,1.336,96,11.368,190,9.395,201,7.757,208,10.979,237,13.171,556,7.174,643,14.324,1110,11.474,1304,16.832,1305,14.055,1540,12.491,1541,15.744]],["keywords/247",[]],["title/248",[107,292.374,181,317.157,582,667.664,1300,547.547]],["content/248",[5,3.665,6,1.644,25,1.129,51,4.062,58,6.217,99,5.98,151,5.237,161,5.363,176,6.195,181,4.523,182,4.318,184,3.681,185,5.228,192,5.707,205,4.411,243,7.809,330,4.081,373,4.378,388,9.522,454,10.975,496,6.859,504,7.526,506,9.203,582,9.522,613,5.98,622,6.889,639,8.079,652,8.128,914,7.986,1189,10.557]],["keywords/248",[]],["title/249",[4,123.338,108,620.948,220,420.766,1302,1041.648]],["content/249",[6,1.944,25,1.006,33,1.956,37,2.539,45,4.291,114,4.397,184,3.28,205,3.93,206,5.384,208,8.269,220,5.347,235,12.488,236,10.399,237,9.919,239,7.724,240,4.483,241,7.463,242,8.338,260,7.834,307,8.724,308,4.896,315,4.927,330,3.637,334,4.361,372,9.78,387,8.809,397,9.649,423,9.296,504,6.706,559,9.649,668,7.834,732,5.292,914,7.116,934,9.296,985,7.036,1019,9.525,1082,10.068,1169,6.92,1542,13.237,1543,15.126,1544,15.126,1545,15.126,1546,12.677]],["keywords/249",[]],["title/250",[225,426.689,226,607.783,563,509.904,1308,673.714]],["content/250",[6,2.002,25,1.052,40,6.037,69,6.454,70,5.042,88,5.423,155,4.714,176,5.772,208,8.645,225,7.412,226,10.558,227,8.132,229,8.871,230,4.996,231,11.279,241,5.879,271,5.61,319,7.048,322,5.814,395,6.65,409,10.088,426,9.836,545,4.381,650,9.121,891,8.718,894,6.061,972,10.371,985,7.356,1310,12.042,1311,13.254,1547,10.527,1548,10.088,1549,15.815,1550,15.815,1551,12.786]],["keywords/250",[]],["title/251",[207,656.155,718,483.032,1313,707.558,1314,848.901]],["content/251",[4,1.759,6,1.644,18,5.67,25,1.439,154,6.24,179,8.437,185,5.228,208,11.831,264,4.921,273,4.746,315,5.529,373,4.378,392,7.896,661,10.828,674,8.727,718,6.889,918,9.608,1199,13.306,1314,12.106,1315,10.689,1384,11.67,1552,11.67,1553,16.975,1554,11.879,1555,16.975,1556,15.697]],["keywords/251",[]],["title/252",[202,366.157,273,261.029,703,444.09,1320,640.194]],["content/252",[5,3.521,6,1.579,25,1.085,49,7.673,60,7.87,185,3.94,192,5.484,273,5.127,284,5.786,301,3.717,322,5.996,373,4.206,414,6.376,537,5.346,538,8.107,543,6.04,563,6.987,590,6.954,622,6.619,631,9.499,703,7.87,865,10.696,876,10.144,1183,8.991,1326,10.024,1327,8.704,1329,8.271,1501,9.318,1557,14.274,1558,10.024,1559,16.311,1560,11.213,1561,16.311]],["keywords/252",[]],["title/253",[124,397.855,181,283.072,297,301.381,757,686.894,886,379.495]],["content/253",[6,1.713,25,1.177,70,4.316,107,4.347,176,6.458,181,5.921,192,5.949,208,9.673,230,5.59,264,6.442,305,11.006,334,5.102,361,9.926,388,12.464,531,9.673,561,8.325,786,9.519,993,8.524,1168,11.605,1170,9.036,1562,12.882,1563,14.831,1564,11.288]],["keywords/253",[]],["title/254",[7,331.64,8,562.569,195,562.569,738,686.894,1333,790.76]],["content/254",[1,6.284,3,6.487,4,1.461,5,3.045,6,1.365,7,4.402,21,8.133,25,0.938,37,3.216,43,11.054,51,4.584,52,3.886,58,7.016,97,4.951,99,6.748,125,5.58,182,3.822,185,3.407,199,9.171,200,5.261,264,5.553,265,5.073,297,4.001,304,7.103,310,6.383,330,3.391,373,3.637,400,6.35,504,8.492,506,10.386,519,7.585,524,9.248,664,7.056,709,8.667,952,7.982,1030,6.92,1049,8.667,1065,8.296,1084,12.341,1335,11.054,1565,13.04,1566,12.341,1567,11.054,1568,14.102,1569,14.102,1570,14.102,1571,9.535,1572,14.102]],["keywords/254",[]],["title/255",[46,438.039,315,440.762,622,549.155]],["content/255",[1,3.017,4,0.701,6,0.655,19,2.029,22,3.667,23,4.208,24,3.81,25,0.929,32,2.957,34,4.358,35,1.941,37,1.137,40,2.584,45,1.92,114,3.208,116,2.796,124,5.232,125,2.679,151,2.089,152,2.782,161,5.091,162,2.393,164,3.466,166,5.984,167,6.072,179,3.365,184,3.03,185,1.635,191,2.035,208,6.033,220,3.901,224,2.053,225,2.427,239,3.457,241,4.102,242,3.732,243,5.077,265,2.435,271,2.401,275,2.254,301,2.515,307,9.294,308,2.191,315,3.595,330,2.653,335,4.828,347,3.114,355,4.349,356,3.149,366,3.261,381,2.185,398,2.535,438,2.535,440,3.131,454,4.377,462,2.69,466,3.532,490,2.69,520,4.996,537,3.617,541,3.301,545,1.875,572,2.418,630,5.924,639,3.222,706,3.457,735,3.048,740,3.149,758,2.928,764,3.701,765,3.617,767,6.305,770,3.343,771,4.422,772,2.808,773,4.349,774,3.701,775,3.241,776,5.253,777,3.017,778,5.039,780,3.585,806,5.316,845,4.439,876,4.21,882,4.16,886,2.418,901,2.584,912,3.532,981,3.867,1024,5.192,1151,4.377,1157,8.305,1173,4.024,1176,3.867,1189,4.21,1256,3.832,1309,6.573,1329,3.433,1338,6.26,1339,4.943,1342,7.462,1343,4.024,1345,4.21,1346,5.164,1347,4.21,1350,5.164,1351,5.039,1353,5.674,1354,4.113,1444,3.203,1573,6.77,1574,6.26,1575,5.924,1576,6.77,1577,11.037,1578,6.77,1579,5.473,1580,5.039,1581,6.26]],["keywords/255",[]],["title/256",[25,70.65,179,528.056,208,580.745,886,379.495,1074,580.745]],["content/256",[]],["keywords/256",[]],["title/257",[25,104.266,29,650.349]],["content/257",[25,1.463,28,9.512,29,9.123,722,11.077]],["keywords/257",[]],["title/258",[33,202.738,198,418.827]],["content/258",[22,6.024,23,4.135,24,7.923,32,3.946,34,4.269,35,5.347,37,3.13,275,6.209,355,7.348,764,10.193,776,10.925,777,8.309,845,12.228]],["keywords/258",[]],["title/259",[224,475.386,590,668.484]],["content/259",[23,4.251,34,3.855,271,5.973,572,6.015,630,8.726,631,9.806,758,7.282,765,7.057,767,9.619,770,8.315,771,8.627,772,6.984,773,8.485,774,9.204,775,8.062,780,8.916,1356,13.734]],["keywords/259",[]],["title/260",[315,606.931]],["content/260",[4,1.745,14,8.094,15,9.806,25,1.432,33,2.177,45,4.777,60,6.282,92,7.179,162,5.952,184,4.669,185,4.067,207,9.282,208,13.676,220,8.391,241,6.259,273,3.692,314,5.973,476,10.23,563,7.213,571,11.042,637,9.619,732,5.891,1042,10.887,1169,9.851]],["keywords/260",[]],["title/261",[19,318.465,184,230.384,886,379.495,1360,660.735,1361,571.393]],["content/261",[4,1.55,6,1.737,19,2.992,22,2.619,23,4.017,25,0.995,32,2.112,34,2.285,44,4.165,88,5.129,112,6.545,162,3.528,164,3.134,171,2.606,184,3.244,185,2.411,191,3,205,3.887,224,3.026,240,4.45,252,3.87,285,6.862,297,2.831,314,3.54,315,6.954,334,2.878,347,6.882,380,7.265,385,3.656,425,3.59,467,5.288,477,11.608,478,9.304,496,4.033,504,4.425,515,4.929,564,4.617,661,6.367,712,6.064,716,5.401,735,4.494,826,5.502,882,6.134,1024,7.038,1055,4.961,1326,6.134,1343,5.933,1346,7.613,1360,9.304,1361,9.651,1362,11.726,1363,11.726,1365,13.062,1367,8.069,1368,8.365,1369,8.734,1370,8.365,1371,8.734,1372,8.365,1373,8.365,1374,8.734,1376,9.229,1377,4.669,1582,7.429,1583,7.824,1584,12.095,1585,9.229,1586,11.726,1587,9.229,1588,7.824,1589,7.429,1590,7.613]],["keywords/261",[]],["title/262",[25,89.993,190,633.003,696,841.635]],["content/262",[6,1.329,14,7.071,21,7.919,25,1.251,33,1.775,44,5.237,60,5.123,107,4.62,181,5.717,184,2.978,185,4.544,190,6.423,208,10.282,230,4.338,236,12.931,237,9.004,240,3.066,264,3.981,273,5.061,315,6.126,322,5.047,330,3.301,373,3.541,400,6.182,413,7.111,500,9.608,563,5.882,590,5.854,607,7.444,622,5.572,668,7.111,674,7.858,732,4.804,862,8.646,865,9.004,886,4.905,961,7.569,1189,8.539,1211,10.763,1315,8.646,1556,12.697,1557,12.016,1591,13.73,1592,13.73,1593,12.016,1594,13.73]],["keywords/262",[]],["title/263",[191,471.331,879,610.406]],["content/263",[6,1.773,25,1.51,33,1.708,107,4.498,155,3.937,179,6.565,181,3.519,184,2.864,185,4.424,190,6.178,208,7.22,220,4.669,222,3.602,225,6.565,226,6.744,265,4.752,273,2.896,297,3.747,301,3.01,315,5.965,398,4.946,400,5.947,410,8.54,437,5.184,523,7.104,536,4.529,537,4.329,541,6.441,553,5.916,641,9.243,648,8.317,674,4.838,718,5.36,853,7.545,872,6.653,881,9.615,883,7.161,884,7.692,893,5.554,971,7.851,993,6.362,994,7.104,996,5.978,1034,10.679,1168,8.662,1187,8.54,1302,11.559,1314,9.42,1321,11.069,1326,8.117,1327,7.048,1562,9.615,1595,8.215,1596,12.214,1597,11.559,1598,9.615,1599,13.208,1600,13.208,1601,13.208]],["keywords/263",[]],["title/264",[2,294.246,25,53.425,33,103.882,182,160.29,301,183.096,414,314.027,537,263.302,1056,505.879]],["content/264",[]],["keywords/264",[]],["title/265",[63,296.762,401,606.144,1427,722.133]],["content/265",[2,7.745,4,1.169,5,2.435,6,2.047,12,3.932,22,2.96,25,1.406,33,3.125,37,1.893,63,2.473,70,2.75,86,4.557,87,5.689,96,6.383,103,7.295,114,3.278,182,3.266,186,3.333,196,3.51,230,3.563,246,3.563,301,3.731,306,8.043,386,11.917,393,6.066,405,5.799,414,4.408,419,6.852,438,4.223,496,4.557,498,13.151,537,5.365,540,8.394,542,7.194,556,4.028,560,5.972,561,5.305,587,7.194,636,6.165,674,4.131,694,5.605,708,7.101,712,9.946,740,5.246,785,4.992,893,4.742,910,4.538,912,5.883,918,6.383,922,8.602,931,6.704,937,4.925,943,5.927,961,6.217,991,10.623,1042,7.292,1171,7.753,1207,6.504,1552,7.753,1602,6.852,1603,8.602,1604,7.292,1605,9.451,1606,7.753,1607,10.428,1608,8.84]],["keywords/265",[]],["title/266",[10,620.401,467,554.237]],["content/266",[1,8.208,2,8.636,4,1.909,6,1.783,10,8.06,21,6.016,22,4.057,23,3.472,24,5.336,25,1.028,32,2.207,34,2.388,35,2.991,37,3.825,44,2.904,51,3.699,52,2.874,63,2.287,79,5.523,85,7.446,87,3.625,100,3.863,114,3.032,149,4.327,181,2.779,182,3.675,184,2.262,185,2.52,186,3.083,192,3.507,196,4.812,198,2.786,230,3.295,273,2.287,289,4.852,293,2.92,298,5.118,301,2.377,334,3.007,355,4.11,370,9.735,371,5.441,378,6.267,399,5.702,401,4.672,408,5.115,427,3.834,438,3.906,512,4.27,536,5.301,551,4.746,637,5.959,676,7.593,732,3.649,777,4.648,785,3.181,786,4.468,874,4.624,875,5.523,1058,5.402,1109,5.402,1110,5.959,1169,4.772,1427,5.566,1558,6.41,1609,8.433,1610,6.487,1611,7.764,1612,11.507,1613,5.799,1614,5.326,1615,9.645]],["keywords/266",[]],["title/267",[4,140.222,25,89.993,67,544.489]],["content/267",[2,5.69,4,1.298,6,1.213,10,3.138,21,4.573,25,0.833,33,1.025,37,1.331,63,2.748,67,5.042,69,3.912,70,3.789,97,5.454,113,3.688,152,3.827,155,3.735,182,3.835,186,5.682,191,2.384,196,3.9,205,2.06,265,4.508,271,2.813,278,3.373,293,4.941,301,5.61,304,3.994,306,12.589,322,2.915,330,3.013,356,3.688,386,5.772,395,3.334,396,2.591,414,3.099,428,6.739,462,3.151,467,2.803,498,4.932,519,4.265,531,4.334,533,4.488,537,8.068,542,7.993,554,3.796,560,6.635,562,4.573,565,9.991,613,5.473,617,4.199,622,7.163,632,7.371,639,3.774,712,4.817,717,3.796,785,2.418,892,4.873,893,3.334,899,5.772,910,5.042,923,5.2,937,3.463,961,4.371,988,5.655,1006,4.817,1038,4.932,1050,5.655,1056,4.993,1065,4.665,1070,6.939,1115,5.772,1118,5.127,1158,10.848,1159,6.645,1174,4.817,1180,4.764,1194,5.772,1207,4.573,1228,5.655,1232,6.411,1427,6.687,1605,6.645,1616,6.939,1617,8.104,1618,11.587,1619,6.939,1620,12.56,1621,6.939,1622,6.645,1623,5.361,1624,6.939]],["keywords/267",[]],["title/268",[25,63.794,33,124.043,37,161.05,264,278.105,875,507.977,877,533.369]],["content/268",[]],["keywords/268",[]],["title/269",[264,392.317,875,716.592,877,752.413]],["content/269",[4,1.59,7,4.791,23,2.339,58,7.426,70,3.743,108,8.007,175,9.546,176,5.601,182,3.062,195,10.736,196,6.31,200,9.009,248,10.992,264,6.581,293,4.297,401,6.875,554,7.349,567,10.066,580,7.061,614,6.639,637,8.768,738,9.924,799,10.552,875,8.128,877,11.272,892,9.433,893,6.454,963,5.928,985,7.139,1014,13.432,1625,12.41,1626,14.193,1627,15.349,1628,9.03,1629,12.032]],["keywords/269",[]],["title/270",[5,229.359,6,102.858,264,307.993,273,232.977,877,590.69]],["content/270",[5,4.697,6,2.106,44,4.765,70,5.306,113,7.961,176,6.246,181,4.56,182,3.415,252,6.636,264,6.307,273,3.753,293,4.791,375,8.928,382,8.8,705,9.967,785,5.219,875,9.063,894,6.558,910,6.886,920,9.063,924,10.917,963,6.61,1016,12.739,1191,10.917,1403,12.206,1630,14.977,1631,9.687]],["keywords/270",[]],["title/271",[25,58.151,33,113.071,205,227.2,206,311.265,264,253.505,877,486.189,1066,466.623]],["content/271",[6,1.604,25,1.417,33,2.143,44,4.614,63,3.634,105,8.984,182,3.306,186,4.898,202,6.556,205,5.537,206,7.586,252,6.425,264,6.178,334,4.778,414,6.477,437,6.503,462,6.584,474,9.556,531,9.058,536,5.681,555,10.306,556,5.919,875,8.774,877,9.213,902,9.466,903,13.397,952,9.379,990,12.989,1150,12.989,1194,12.062]],["keywords/271",[]],["title/272",[25,89.993,886,483.395,1074,739.744]],["content/272",[]],["keywords/272",[]],["title/273",[25,123.921]],["content/273",[5,3.725,6,1.671,9,7.895,12,6.017,25,1.454,33,2.231,107,4.239,122,7.574,151,5.324,155,5.144,176,6.297,181,4.598,185,4.169,192,5.802,264,5.003,314,6.121,392,8.026,414,6.745,710,14.462,718,7.003,732,6.037,785,5.262,910,6.943,914,8.118,1077,9.767,1185,13.952,1403,12.307,1632,12.075,1633,9.858]],["keywords/273",[]],["title/274",[107,332.397,185,326.9,732,473.461]],["content/274",[5,3.549,6,2.272,25,1.41,70,4.009,87,5.713,107,4.038,151,5.072,155,4.9,181,4.38,182,3.28,185,5.122,264,4.766,278,4.425,288,8.118,293,4.602,314,7.521,330,3.952,385,6.021,396,5.371,553,7.363,613,5.791,704,8.64,707,11.115,732,5.752,875,8.705,1004,13.777,1118,10.629,1148,11.504,1187,10.629,1634,11.724,1635,15.201]],["keywords/274",[]],["title/275",[183,493.826,273,343.83]],["content/275",[6,1.657,33,2.813,40,6.533,70,5.306,183,6.852,198,4.572,202,5.265,219,6.361,246,5.407,273,3.753,276,10.398,291,8.194,301,3.901,315,5.574,330,4.115,348,9.687,396,5.592,537,5.609,545,4.74,622,8.829,740,7.961,920,11.521,1078,13.837,1080,13.416,1632,11.976,1636,11.976]],["keywords/275",[]],["title/276",[273,296.762,414,528.967,1329,686.235]],["content/276",[6,2.166,23,3.79,32,3.155,33,1.928,34,3.414,63,3.27,216,13.787,273,4.907,334,4.299,385,5.461,414,7.773,462,5.924,474,8.599,532,8.683,622,6.05,639,7.096,695,7.363,804,7.226,805,9.777,865,9.777,899,10.853,926,7.613,931,8.863,945,11.687,991,8.219,1021,8.019,1056,9.389,1257,6.821,1325,9.64,1329,10.085,1444,7.055,1604,9.64,1632,13.916,1637,12.495,1638,11.687,1639,13.787,1640,14.91,1641,10.853]],["keywords/276",[]],["title/277",[63,261.029,183,374.904,555,740.294,981,679.981]],["content/277",[6,1.644,12,5.919,25,1.129,63,3.723,70,4.14,154,6.24,183,5.347,264,4.921,276,10.313,279,10.091,293,4.752,330,5.204,381,5.478,513,10.091,514,6.085,525,8.921,544,6.333,581,7.204,890,12.106,893,7.137,963,6.556,981,12.364,994,9.13,1031,12.357,1066,9.058,1325,10.975,1632,11.879,1642,16.975,1643,13.724,1644,15.697]],["keywords/277",[]],["title/278",[33,89.358,62,296.033,86,279.233,100,255.91,182,137.88,205,179.552,206,245.987,414,270.123,952,391.135,1021,371.675]],["content/278",[25,1.462,33,2.25,79,9.214,96,9.849,100,6.444,182,3.472,196,5.416,205,4.521,206,6.194,264,5.045,272,7.419,389,8.947,414,8.594,437,6.829,467,6.151,556,6.216,696,10.822,875,9.214,877,9.675,902,9.94,903,14.068,952,9.849,991,9.592,999,12.666,1110,9.94,1399,13.64,1645,16.09]],["keywords/278",[]],["title/279",[114,346.026,152,236.98,184,258.124,552,625.565]],["content/279",[6,2.305,12,5.162,25,0.984,33,2.559,37,2.485,100,5.482,114,4.304,152,4.439,155,4.413,176,5.402,184,4.292,205,3.846,219,5.503,240,3.305,310,6.701,322,5.442,385,5.422,414,5.787,560,7.839,613,6.972,732,5.179,862,9.322,906,8.026,914,6.964,931,8.8,954,7.78,968,11.604,973,7.962,985,6.886,986,10.177,1021,7.962,1025,11.292,1113,10.776,1172,10.558,1418,11.604,1632,10.359,1646,9.853,1647,14.804,1648,10.359,1649,11.604,1650,8.8,1651,8.538]],["keywords/279",[]],["title/280",[181,417.762,265,564.031]],["content/280",[6,1.881,25,1.292,70,4.737,107,3.536,151,5.992,155,4.291,176,5.253,181,5.175,182,2.872,185,3.477,192,6.53,202,4.428,205,3.74,206,5.124,240,3.214,246,4.547,264,5.631,265,5.178,278,3.875,297,4.084,314,6.89,385,5.272,392,6.695,414,5.627,438,5.391,542,9.182,553,6.448,554,6.892,561,6.772,582,8.074,590,6.137,613,5.071,704,7.565,707,9.733,732,5.036,875,7.622,877,8.003,893,6.052,914,6.772,961,7.935,1031,10.478,1165,9.44,1238,10.073,1403,10.266,1652,12.597,1653,12.597]],["keywords/280",[]],["title/281",[62,509.904,297,337.67,300,656.155,414,465.275]],["content/281",[6,1.475,7,4.756,21,8.787,25,1.342,33,2.609,86,6.157,100,5.643,125,6.029,186,4.504,196,6.28,255,6.21,300,11.122,301,3.473,414,7.886,417,6.861,512,6.237,525,8.008,533,11.419,536,5.224,543,5.643,548,9.595,552,8.008,590,6.496,598,10.302,630,8.315,639,7.252,673,7.949,695,7.525,705,8.874,718,6.183,893,6.407,966,12.77,991,8.399,1025,11.622,1040,9.719,1654,15.237,1655,14.09,1656,10.142]],["keywords/281",[]],["title/282",[152,211.512,414,415.272,435,486.049,552,558.336,765,348.193]],["content/282",[6,1.464,25,1.006,33,2.914,44,4.212,86,6.112,96,8.561,100,5.602,113,7.036,152,3.012,182,3.018,186,4.471,196,4.708,222,4.125,252,5.865,272,6.449,301,3.447,322,5.56,330,4.827,385,5.54,414,7.848,435,6.92,552,7.95,639,7.199,695,9.916,765,6.581,860,9.19,931,8.992,1016,11.259,1021,8.136,1108,10.227,1112,8.992,1164,9.296,1197,10.585,1264,11.259,1547,10.068,1616,13.237,1632,10.585,1651,8.724,1657,15.126,1658,15.126,1659,13.237]],["keywords/282",[]],["title/283",[63,343.83,555,975.122]],["content/283",[6,2.143,25,0.971,37,2.451,60,5.446,63,4.3,70,3.56,149,6.054,155,4.351,192,4.907,217,5.214,265,5.251,273,3.201,301,4.468,330,4.714,356,6.789,393,7.85,438,5.466,525,7.671,537,4.784,540,10.864,545,4.043,550,8.262,553,6.538,556,5.214,563,6.253,579,9.437,622,7.956,660,8.187,680,12.773,688,8.868,742,6.607,892,8.97,893,6.137,910,5.873,921,7.559,926,7.453,961,8.046,963,5.638,981,8.338,986,10.035,1045,11.134,1049,8.97,1053,11.442,1118,9.437,1660,14.596,1661,14.596]],["keywords/283",[]],["title/284",[4,110.083,25,70.65,264,307.993,875,562.569,877,590.69]],["content/284",[4,1.849,6,1.728,7,5.571,25,1.187,37,2.996,96,10.102,171,4.661,191,6.716,250,9.524,252,6.921,255,7.274,264,5.174,311,7.646,329,7.953,467,6.309,548,11.239,622,7.243,872,8.989,875,9.451,877,9.923,888,9.311,902,10.196,963,6.893,1610,11.1,1662,13.99]],["keywords/284",[]],["title/285",[25,104.266,1663,871.749]],["content/285",[6,1.543,12,7.245,21,9.191,25,1.629,28,6.892,29,6.61,33,2.061,44,4.437,49,7.497,110,7.03,113,7.412,190,7.454,251,8.861,252,6.18,264,4.62,265,5.733,323,8.785,427,5.858,529,9.02,617,8.439,875,8.439,877,8.861,879,6.204,883,8.64,886,7.423,887,9.281,894,6.107,992,11.365,998,11.365,1074,8.711,1075,11.862,1632,11.152,1663,8.861,1664,15.936,1665,14.736]],["keywords/285",[]],["title/286",[4,99.401,25,63.794,99,337.935,250,511.905,257,429.683,258,731.722]],["content/286",[3,7.22,6,1.52,7,4.9,25,1.368,83,11.426,97,5.51,99,5.529,155,4.679,196,4.885,202,4.828,250,10.979,252,6.086,255,6.397,257,7.031,258,11.973,264,4.55,265,5.647,291,7.515,304,7.906,394,10.433,396,5.128,401,7.031,410,10.148,438,5.878,462,6.237,536,5.382,553,7.031,554,7.515,622,6.37,749,13.154,875,8.312,877,8.727,937,6.855,965,9.762,1065,9.234,1080,12.304,1151,10.148,1666,14.514,1667,13.154]],["keywords/286",[]],["title/287",[25,79.157,65,390.118,400,535.943,408,393.825]],["content/287",[2,5.253,4,1.486,6,2.208,10,3.735,25,0.954,33,1.22,37,3.684,51,3.432,52,2.601,58,3.457,63,2.07,67,3.797,85,4.546,87,3.28,97,5.035,98,4.043,100,6.424,114,2.744,171,2.465,175,5.87,176,3.444,182,2.862,191,2.837,199,4.519,227,4.853,232,5.61,241,3.508,252,3.66,256,4.44,264,2.736,275,4.775,278,2.541,291,4.519,293,4.015,297,2.677,334,4.135,381,3.046,395,3.968,400,7.81,408,8.12,421,4.888,437,3.704,438,3.535,467,5.07,474,5.443,519,7.714,527,4.853,531,5.159,532,5.497,536,5.948,539,4.39,543,3.495,559,9.148,560,4.998,561,4.44,564,4.366,567,6.189,639,4.492,676,6.87,703,3.521,705,5.497,736,3.535,740,4.39,785,2.878,872,4.754,874,4.184,875,4.998,877,5.248,898,6.489,902,5.392,925,7.91,937,4.122,942,5.671,963,3.645,1030,4.631,1034,7.631,1038,5.87,1050,6.731,1109,4.888,1150,7.398,1295,7.398,1406,7.398,1632,6.605,1662,7.398,1668,7.398,1669,9.438,1670,8.259,1671,7.631,1672,7.631,1673,9.438,1674,9.438,1675,9.438]],["keywords/287",[]],["title/288",[6,92.877,25,63.794,184,208.027,205,249.247,219,356.567,240,214.197]],["content/288",[6,2.289,21,9.633,25,1.111,155,6.385,176,6.095,182,3.333,184,4.645,191,5.021,195,8.845,196,5.199,205,5.566,219,7.962,228,7.295,240,4.783,256,7.858,293,4.676,315,5.44,554,7.997,617,8.845,901,6.376,914,7.858,963,6.451,985,7.769,987,10.799,996,7.56,1174,10.148,1676,15.445]],["keywords/288",[]],["title/289",[25,89.993,184,293.46,982,722.133]],["content/289",[6,2.304,25,1.233,33,1.528,44,2.052,66,5.364,69,2.3,70,1.797,87,2.561,97,2.587,155,3.523,176,5.401,182,2.953,184,5.315,192,2.477,205,3.845,207,6.515,208,9.257,219,6.294,225,2.641,226,3.762,228,3.218,235,4.583,239,9.466,240,3.781,252,2.857,255,4.817,264,2.136,265,2.651,278,1.983,288,3.639,293,2.063,297,2.09,301,1.679,310,3.335,314,5.25,319,3.283,322,2.709,330,1.772,348,4.171,385,2.699,392,6.884,396,2.407,413,3.816,414,4.62,426,4.583,427,2.709,432,6.212,438,2.759,462,5.88,466,3.844,473,5.484,477,6.884,478,4.583,496,4.776,533,4.171,536,2.526,537,2.415,543,2.729,545,3.274,553,3.3,564,5.467,565,6.69,613,6.531,622,6.872,640,5.255,663,4.062,703,2.749,705,4.291,716,2.66,732,2.578,894,2.824,901,2.813,906,6.408,910,2.965,936,3.662,961,4.062,963,2.846,982,7.897,985,3.427,987,4.764,996,3.335,1030,3.616,1046,5.957,1047,5.364,1056,4.64,1066,3.932,1079,5.62,1087,6.448,1117,5.957,1118,4.764,1164,4.528,1165,4.832,1177,4.528,1195,6.448,1227,4.832,1297,10.006,1304,6.175,1360,7.351,1361,7.96,1399,5.776,1557,6.448,1583,5.776,1590,5.62,1624,6.448,1677,6.448,1678,6.814,1679,6.814,1680,7.368,1681,6.814,1682,7.368,1683,6.814,1684,6.175,1685,6.448]],["keywords/289",[]],["title/290",[25,70.65,37,178.358,179,528.056,877,590.69,932,483.439]],["content/290",[6,2.186,25,1.502,37,3.049,179,9.026,182,3.623,293,5.083,389,9.337,401,8.134,437,7.127,462,7.215,515,8.968,560,9.616,863,10.473,877,10.096,902,10.374,903,14.681,932,10.276,991,10.01,1194,13.218,1686,13.218,1687,14.681]],["keywords/290",[]],["title/291",[25,79.157,45,337.67,176,434.385,480,428.201]],["content/291",[5,3.151,6,2.143,9,6.678,25,1.304,33,1.887,45,4.141,103,6.504,155,4.351,176,7.155,182,2.912,192,4.907,200,5.446,222,3.98,291,6.989,308,4.725,373,3.764,385,5.346,400,6.572,480,7.964,487,9.191,536,5.005,556,5.214,569,7.163,659,6.714,863,8.418,897,9.572,906,10.63,914,6.867,924,9.311,931,8.677,932,8.922,933,11.442,934,8.97,1121,12.676,1140,10.864,1262,8.97,1384,10.035,1402,10.625,1632,10.214,1688,13.497,1689,14.596,1690,10.41,1691,12.773]],["keywords/291",[]],["title/292",[46,507.514,181,417.762]],["content/292",[5,3.389,6,1.992,25,1.044,70,5.018,87,5.454,151,6.347,155,4.679,181,5.482,182,3.132,185,3.792,192,6.917,202,4.828,264,4.55,265,5.647,314,5.568,361,8.804,385,5.749,396,5.128,438,5.878,447,10.012,480,5.647,553,7.031,704,8.249,706,8.015,717,7.515,785,4.787,892,9.646,893,6.6,910,6.315,914,7.384,932,9.362,961,8.652,1004,13.154,1123,11.683,1632,10.984,1652,13.736]],["keywords/292",[]],["title/293",[184,258.124,220,420.766,421,616.449,1663,661.815]],["content/293",[6,2.358,12,5.473,25,1.368,33,2.03,155,6.133,182,3.132,184,4.462,185,3.792,191,4.719,196,4.885,205,4.078,206,5.587,219,7.647,220,7.273,240,3.505,255,6.397,265,5.647,323,8.652,427,5.77,478,9.762,480,5.647,525,8.249,529,8.884,556,5.607,613,5.529,914,7.384,932,7.143,956,9.884,973,8.442,985,7.301,1080,12.304,1142,11.426,1174,9.536,1663,8.727]],["keywords/293",[]],["title/294",[5,229.359,6,102.858,205,276.033,206,378.168,742,480.872]],["content/294",[5,3.665,6,2.307,9,7.766,25,1.129,37,2.85,63,3.723,155,5.06,176,6.195,181,4.523,192,5.707,264,6.274,265,6.107,334,4.894,512,6.949,515,8.383,536,5.82,718,6.889,742,10.785,910,6.83,914,7.986,932,7.725,963,8.359,984,10.432,1050,12.106,1403,12.106,1606,11.67]],["keywords/294",[]],["title/295",[437,531.112,950,900.729,1314,965.11]],["content/295",[6,1.543,25,1.538,37,2.675,44,4.437,70,3.886,86,6.439,186,4.71,196,4.96,201,6.155,202,6.392,222,4.345,252,6.18,271,5.653,293,4.461,385,5.837,401,7.138,437,6.255,467,5.633,515,7.87,536,5.464,541,7.771,607,8.64,932,11.15,950,10.607,1019,10.035,1070,13.946,1314,11.365,1433,13.946,1622,13.356,1692,14.736,1693,15.936,1694,11.152,1695,13.946,1696,15.936]],["keywords/295",[]],["title/296",[191,471.331,879,610.406]],["content/296",[19,6.139,25,1.722,398,9.098,877,11.387,1158,12.586,1697,11.591,1698,20.48,1699,20.48]],["keywords/296",[]],["title/297",[37,178.358,52,292.723,703,396.364,958,491.403,1466,773.343]],["content/297",[]],["keywords/297",[]],["title/298",[37,227.19,52,372.867,703,504.882]],["content/298",[4,1.651,37,2.675,44,4.436,51,4.514,54,4.722,66,11.598,70,4.601,113,5.054,114,3.159,171,2.837,175,6.758,176,3.965,199,5.202,200,4.054,222,2.963,252,4.213,287,5.401,310,4.918,348,9.018,396,5.205,433,7.91,486,6.459,498,11.732,514,3.895,524,7.125,581,4.611,607,5.891,636,5.94,660,6.095,664,5.436,694,5.401,703,4.054,732,3.802,870,8.517,894,4.164,943,5.711,944,8.937,956,6.842,994,5.844,1058,5.627,1081,9.791,1148,7.604,1298,6.529,1320,5.844,1687,8.785,1700,10.866,1701,10.866,1702,10.866,1703,7.91,1704,11.879,1705,8.785,1706,10.448,1707,11.363,1708,10.953,1709,14.733,1710,8.288,1711,7.125,1712,11.149,1713,5.891,1714,10.048,1715,10.866,1716,7.749,1717,10.866,1718,7.91,1719,8.517,1720,9.509,1721,9.106,1722,7.91,1723,13.352,1724,7.025,1725,10.866,1726,5.844,1727,9.509,1728,8.088,1729,8.288,1730,10.048,1731,9.106,1732,9.509,1733,9.509]],["keywords/298",[]],["title/299",[51,284.834,52,327.97,92,507.5,703,444.09]],["content/299",[4,0.748,6,1.125,37,1.951,51,3.492,52,4.021,65,3.809,66,5.252,68,3.792,70,2.834,76,4.289,86,2.915,88,2.474,106,4.96,108,3.764,113,3.356,114,2.097,134,4.084,175,12.82,176,4.241,189,5.934,191,2.169,195,3.821,196,2.246,199,3.455,219,2.682,222,3.979,256,3.394,271,6.506,275,3.87,287,5.776,330,1.735,334,2.08,359,5.252,371,3.764,396,2.357,402,4.161,427,2.652,432,3.792,493,11.408,498,4.487,524,10.971,567,4.732,581,3.062,586,5.37,607,7.911,636,3.944,639,3.434,650,4.161,668,3.737,688,4.384,692,5.934,703,6.843,732,5.105,775,3.455,786,3.091,860,4.384,870,5.656,879,2.809,898,4.96,918,6.578,939,5.833,943,3.792,944,8.185,955,4.161,956,4.543,958,3.337,1090,5.504,1128,5.252,1178,4.878,1192,4.487,1199,5.656,1254,4.878,1294,6.047,1300,5.346,1320,6.251,1323,5.656,1631,6.578,1651,4.161,1663,4.012,1703,13.352,1704,4.543,1706,7.621,1707,10.407,1708,11.502,1713,6.301,1718,5.252,1721,9.74,1722,12.178,1723,14.021,1724,7.514,1727,6.314,1728,5.37,1729,5.504,1734,6.672,1735,6.672,1736,7.215,1737,6.314,1738,6.672,1739,7.215,1740,7.215,1741,12.229,1742,7.215,1743,5.504,1744,16.961,1745,6.672,1746,5.656,1747,4.878,1748,6.672,1749,5.504,1750,7.215,1751,5.146,1752,6.672,1753,7.215,1754,7.215,1755,5.504,1756,11.622,1757,6.314,1758,7.215,1759,7.215,1760,7.215,1761,6.672,1762,6.672,1763,6.314,1764,7.215,1765,4.603,1766,4.802]],["keywords/299",[]],["title/300",[52,327.97,581,505.129,993,573.347,1268,616.449]],["content/300",[3,5.548,4,2.074,6,1.168,10,6.798,23,3.05,32,4.235,34,2.761,37,3.87,51,4.111,68,6.339,70,2.941,176,4.402,228,5.268,246,3.81,256,5.674,264,4.981,278,3.247,287,5.995,293,3.376,298,5.918,308,3.904,310,5.459,373,3.11,402,6.956,425,4.339,551,5.488,692,6.159,703,4.5,711,8.493,868,10.108,896,10.108,901,4.604,944,12.233,1032,8.292,1298,7.247,1393,9.751,1540,7.501,1656,8.028,1703,8.78,1710,13.105,1719,9.454,1752,11.153,1767,10.108,1768,15.887,1769,10.108,1770,17.181,1771,10.555,1772,17.181,1773,12.061,1774,17.181,1775,12.061,1776,17.181,1777,12.061,1778,12.061,1779,8.292,1780,12.061,1781,12.061,1782,8.602]],["keywords/300",[]],["title/301",[20,533.158,52,327.97,1703,866.461,1733,1041.648]],["content/301",[3,5.646,6,1.684,20,7.792,37,3.69,64,8.299,65,4.023,85,5.912,106,8.438,148,7.079,152,2.444,171,3.205,191,3.69,196,3.82,197,8.754,203,6.224,230,3.878,264,3.558,278,3.304,301,2.797,304,8.762,373,3.165,402,7.079,537,5.701,539,5.709,543,4.545,581,7.382,692,8.882,693,5.498,703,6.49,708,7.729,718,4.981,740,5.709,787,5.948,792,7.079,858,6.182,861,8.091,891,6.766,894,4.704,924,7.83,944,6.885,972,8.049,1035,7.457,1165,8.049,1166,8.049,1264,9.136,1377,5.741,1466,8.935,1610,7.634,1620,9.924,1703,12.663,1706,8.049,1707,8.754,1726,6.602,1727,10.741,1771,10.741,1783,8.438,1784,10.741,1785,11.35,1786,13.636,1787,9.621,1788,12.274,1789,12.274,1790,12.274,1791,12.274,1792,8.438,1793,10.741]],["keywords/301",[]],["title/302",[278,320.414,457,804.809,703,444.09,1377,556.783]],["content/302",[5,3.184,6,1.911,23,4.033,32,3.121,34,3.377,35,2.808,40,3.738,49,4.607,51,2.343,52,2.698,70,3.597,116,6.09,121,5.884,152,1.95,176,3.574,181,2.609,230,5.604,264,4.276,278,3.97,395,4.118,398,3.667,402,5.648,463,6.984,467,3.462,468,6.747,493,6.091,494,7.47,499,5.147,515,4.836,544,3.654,607,7.996,636,5.353,700,7.289,711,4.156,718,3.974,727,6.853,732,3.426,745,5.353,785,2.986,907,6.018,944,8.272,955,5.648,1156,7.47,1194,7.129,1238,6.853,1356,6.247,1377,10.41,1628,5.761,1656,6.518,1697,8.347,1703,12.913,1719,7.676,1722,10.736,1765,6.247,1779,6.733,1782,6.984,1793,8.57,1794,9.056,1795,9.793,1796,5.95,1797,13.638,1798,8.207,1799,8.57,1800,9.793,1801,9.793,1802,9.793,1803,7.289,1804,9.056,1805,9.793,1806,9.793,1807,9.793,1808,9.793,1809,9.793,1810,9.793,1811,7.129,1812,9.793,1813,9.793,1814,6.167,1815,9.793,1816,9.793,1817,9.793,1818,9.793]],["keywords/302",[]],["title/303",[37,178.358,703,396.364,958,491.403,1794,982.391,1819,982.391]],["content/303",[4,1.395,5,3.557,6,2.056,19,2.605,23,4.033,25,0.578,32,2.849,35,2.492,37,1.459,44,3.748,69,2.713,87,3.02,110,3.833,152,2.68,171,2.269,181,2.315,192,2.922,217,3.104,222,2.37,264,2.519,287,6.691,297,2.465,308,2.813,319,3.872,322,3.195,356,4.042,396,2.839,413,8.533,433,6.326,468,3.976,493,5.405,533,4.919,551,3.954,556,4.809,563,3.723,572,3.104,614,3.758,636,4.75,683,9.42,693,3.892,703,3.242,736,5.041,737,2.922,742,9.087,757,8.704,864,5.699,901,3.317,950,5.784,996,3.933,1000,4.674,1042,5.619,1066,4.637,1147,4.79,1160,4.407,1183,4.79,1300,6.192,1384,5.974,1392,7.026,1558,5.341,1562,6.326,1819,8.036,1820,8.69,1821,5.784,1822,6.468,1823,6.812,1824,8.69,1825,7.026,1826,6.629,1827,4.874,1828,8.036,1829,7.605,1830,12.448,1831,7.283,1832,12.448,1833,8.036,1834,12.448,1835,12.448,1836,12.448,1837,12.448,1838,8.036,1839,8.036,1840,8.036,1841,12.448,1842,12.448,1843,5.543,1844,7.605,1845,7.283,1846,6.326,1847,6.468,1848,6.812,1849,8.69,1850,6.198,1851,8.69,1852,7.283,1853,8.036,1854,8.69,1855,8.69,1856,6.326,1857,8.69,1858,6.812]],["keywords/303",[]],["title/304",[52,292.723,572,379.495,736,397.855,958,491.403,1466,773.343]],["content/304",[2,8.167,5,3.196,7,4.621,20,6.631,37,2.485,51,4.736,52,5.453,144,9.098,198,3.955,230,4.677,246,4.677,364,8.026,398,5.544,409,9.443,458,6.886,463,10.558,498,9.207,572,7.965,693,9.987,736,5.544,855,8.8,861,6.886,865,9.708,870,11.604,893,6.224,968,11.604,984,9.098,1147,8.161,1179,12.955,1322,11.969,1407,11.292,1703,14.407,1826,11.292,1848,11.604,1856,10.776,1859,12.955,1860,11.292,1861,13.689,1862,12.955,1863,11.604,1864,14.804]],["keywords/304",[]],["title/305",[5,229.359,6,102.858,52,292.723,301,242.127,703,396.364]],["content/305",[6,2.341,10,5.433,37,2.305,44,3.823,52,3.783,70,4.587,134,7.771,181,3.658,185,3.317,272,5.854,278,3.696,287,6.825,301,3.129,329,6.118,373,3.541,452,6.351,453,12.016,468,8.605,484,7.702,561,6.459,567,9.004,636,7.506,664,6.87,683,9.608,693,6.15,703,5.123,711,5.827,809,6.781,876,8.539,914,6.459,943,7.216,944,7.702,1030,6.738,1109,9.741,1165,9.004,1656,9.139,1704,8.646,1708,12.931,1728,10.22,1751,9.792,1757,12.016,1826,10.473,1858,10.763,1865,12.697,1866,13.73,1867,13.73,1868,12.697,1869,10.22,1870,12.697,1871,11.101,1872,7.385,1873,13.73,1874,11.101]],["keywords/305",[]],["title/306",[191,471.331,879,610.406]],["content/306",[3,7.387,5,3.467,6,1.555,25,1.068,37,2.696,44,4.472,52,5.754,181,4.279,203,8.144,222,4.379,225,5.757,226,8.2,252,6.227,278,4.323,310,7.269,432,8.44,523,8.637,529,9.089,581,6.815,693,7.193,703,5.991,742,7.269,806,7.735,857,8.258,869,10.531,872,8.089,882,9.869,883,8.707,894,6.154,958,7.428,993,7.735,996,7.269,1326,9.869,1377,7.512,1466,11.69,1703,11.69,1875,14.053,1876,14.85]],["keywords/306",[]],["title/307",[23,122.44,25,53.425,37,134.874,185,194.068,315,261.663,480,289.005,742,363.633,877,446.678]],["content/307",[]],["keywords/307",[]],["title/308",[25,89.993,37,227.19,877,752.413]],["content/308",[]],["keywords/308",[]],["title/309",[37,178.358,181,283.072,414,415.272,1168,696.684,1300,488.703]],["content/309",[5,3.549,6,1.592,25,1.41,44,4.577,125,6.505,151,5.072,176,5.999,181,4.38,182,3.28,185,3.971,199,7.871,220,5.811,256,7.734,264,4.766,314,5.831,330,3.952,334,4.74,373,4.24,385,6.021,391,8.28,392,9.862,425,5.914,532,9.574,539,7.646,553,7.363,613,5.791,704,8.64,706,8.394,877,9.14,924,10.486,1079,12.539,1179,14.386,1332,8.842,1384,11.302]],["keywords/309",[]],["title/310",[108,705.951,462,537.688,480,486.819]],["content/310",[6,2.379,25,1.389,37,2.696,45,4.556,70,3.916,87,5.581,113,7.47,171,4.193,176,7.621,192,5.399,201,6.203,255,6.545,278,4.323,307,9.262,467,5.677,480,8.349,614,6.946,698,10.383,727,11.238,737,5.399,863,9.262,877,8.929,906,8.707,932,9.503,933,12.588,1190,12.588,1877,16.059,1878,16.059,1879,16.059,1880,16.059,1881,16.059]],["keywords/310",[]],["title/311",[6,115.243,614,514.812,742,538.773,1308,673.714]],["content/311",[2,6.427,5,3.788,6,1.699,63,3.848,136,10.12,152,3.493,176,8.066,202,5.398,315,5.715,391,8.838,392,8.162,393,9.438,498,10.913,512,7.183,556,6.268,622,7.121,693,7.86,718,7.121,742,7.942,918,9.932,921,9.087,958,8.116,984,10.784,1398,11.049,1784,15.356,1882,17.547,1883,17.547]],["keywords/311",[]],["title/312",[23,133.27,225,313.459,278,235.386,301,199.292,315,284.809,537,286.593,1313,519.794]],["content/312",[9,7.521,25,1.41,70,5.171,151,5.072,181,4.38,184,3.565,208,8.986,220,5.811,225,5.893,239,8.394,241,6.11,242,9.062,264,4.766,278,4.425,297,4.664,301,3.747,307,9.481,315,5.354,466,8.576,467,5.811,515,8.118,537,5.388,545,4.553,563,7.042,582,9.221,632,9.671,877,9.14,893,6.912,955,9.481,1006,9.988,1782,11.724,1884,16.439,1885,13.777,1886,15.201]],["keywords/312",[]],["title/313",[421,616.449,1187,769.603,1320,640.194,1747,804.809]],["content/313",[4,1.882,25,1.208,37,3.049,97,6.375,107,4.46,111,6.852,181,4.838,202,5.586,220,6.419,250,9.69,255,7.401,257,8.134,373,4.683,393,9.767,414,7.098,480,6.532,553,8.134,563,7.779,571,11.908,732,6.353,877,12.555,921,9.404,1747,12.278]],["keywords/313",[]],["title/314",[25,63.794,37,161.05,40,366.18,275,319.419,886,342.668,1378,596.617]],["content/314",[3,4.283,4,0.965,20,4.171,22,3.725,23,4.151,24,4.9,25,1.28,28,4.027,29,5.888,32,1.971,33,1.204,34,3.25,35,2.67,37,3.23,44,4.79,45,2.642,58,3.41,62,3.989,63,3.113,68,9.041,85,4.485,88,3.193,100,3.448,124,3.487,151,2.873,161,2.942,167,4.047,171,2.431,176,3.398,193,3.731,199,4.458,264,2.699,271,3.303,275,4.727,276,5.657,281,3.611,323,5.133,330,2.239,334,2.685,355,5.594,379,4.26,397,5.94,399,5.09,433,6.778,440,4.307,480,3.35,536,3.193,568,8.351,571,6.106,572,3.326,581,3.952,630,7.073,668,4.822,693,4.171,722,4.69,758,4.027,763,4.755,764,5.09,765,4.652,767,5.319,770,4.598,771,6.892,772,3.862,773,5.594,776,8.188,777,4.149,778,6.931,780,4.931,786,3.989,877,5.177,914,4.381,1168,6.106,1191,5.94,1219,4.485,1256,5.27,1257,4.26,1400,5.223,1887,9.312,1888,9.312,1889,5.863,1890,7.299,1891,6.516,1892,9.312,1893,6.402]],["keywords/314",[]],["title/315",[19,469.995,480,564.031]],["content/315",[4,1.005,5,2.095,6,1.418,19,2.908,22,4.629,23,4.187,24,5.055,25,0.645,32,3.099,34,3.353,35,2.782,37,2.459,45,5.004,111,3.661,149,4.024,151,2.993,152,1.932,161,3.065,167,4.217,185,2.344,200,3.62,223,4.989,271,5.195,275,3.23,329,4.323,334,2.797,355,5.771,425,3.49,438,3.633,480,8.282,490,3.855,496,3.92,572,3.466,581,4.117,607,7.94,630,6.484,631,10.273,737,4.923,758,4.196,763,4.954,764,5.303,765,4.8,767,5.542,770,4.791,771,7.068,772,4.024,773,5.771,776,6.97,777,4.323,780,5.137,932,4.415,1121,12.704,1262,10.841,1400,5.442,1479,5.442,1540,6.034,1690,6.919,1894,11.17,1895,7.4,1896,9.702,1897,11.84,1898,9.702,1899,9.702,1900,10.9,1901,9.702]],["keywords/315",[]],["title/316",[19,469.995,742,709.677]],["content/316",[5,2.747,6,1.232,23,4.151,25,1.187,34,2.913,35,3.649,37,2.136,124,6.682,152,2.533,184,2.759,202,3.914,271,4.514,298,6.244,301,2.9,392,5.918,438,6.682,536,4.363,556,4.545,572,4.545,630,8.211,718,5.163,737,4.278,742,8.076,758,5.503,765,6.754,767,7.269,770,6.284,771,7.149,772,5.278,773,8.12,780,6.738,918,7.202,921,6.59,958,5.885,1129,10.287,1147,7.014,1174,7.73,1220,7.269,1224,7.41,1617,6.638,1825,10.287,1827,7.137,1902,10.966,1903,13.281,1904,12.724,1905,11.766]],["keywords/316",[]],["title/317",[25,70.65,37,178.358,467,375.547,670,595.91,877,590.69]],["content/317",[5,3.665,6,1.644,37,2.85,58,6.217,110,7.488,114,4.935,142,9.986,152,3.38,202,5.222,265,6.107,278,4.569,285,11.67,322,6.24,398,8.105,414,6.635,527,8.729,556,7.731,557,6.745,563,7.272,588,12.948,694,8.437,698,10.975,742,7.684,877,9.438,892,10.432,1032,11.67,1906,16.975,1907,16.975,1908,16.975,1909,16.975]],["keywords/317",[]],["title/318",[191,471.331,879,610.406]],["content/318",[6,1.728,20,5.699,25,1.621,37,3.459,63,3.913,70,3.103,100,6.608,107,4.383,176,4.643,181,4.754,185,4.31,191,3.825,196,5.553,199,6.092,203,6.452,220,4.498,222,3.47,234,5.885,240,2.841,275,4.237,293,3.562,297,3.61,301,2.9,315,5.812,398,4.765,437,4.994,462,5.056,467,4.498,480,6.419,514,4.561,537,4.17,614,5.503,735,5.729,742,8.076,763,9.111,785,3.88,857,6.543,872,6.409,877,9.921,883,6.899,886,4.545,887,7.41,932,5.79,934,7.82,996,5.759,1007,6.687,1153,11.135,1158,7.82,1168,8.344,1433,11.135,1643,10.287,1910,12.724,1911,12.724,1912,12.724]],["keywords/318",[]],["title/319",[25,79.157,33,153.915,182,237.492,1913,723.164]],["content/319",[]],["keywords/319",[]],["title/320",[182,270.003,200,504.882,1913,822.159]],["content/320",[4,1.614,6,1.508,22,4.088,33,2.014,44,4.338,116,6.433,151,4.806,154,5.727,181,4.151,182,3.108,185,3.763,190,7.287,201,6.017,205,4.048,206,5.545,252,6.041,278,5.511,293,4.361,297,4.419,308,5.043,437,6.114,440,7.206,541,7.597,544,5.812,546,12.595,664,7.794,699,10.073,706,7.955,717,7.459,860,9.465,912,8.127,996,7.051,1015,11.883,1038,9.689,1187,10.073,1419,11.883,1604,10.073,1913,12.438,1914,11.11,1915,14.406,1916,14.406]],["keywords/320",[]],["title/321",[22,312.383,33,153.915,182,237.492,1913,723.164]],["content/321",[4,1.423,5,2.964,6,2.341,25,0.913,37,2.305,44,3.823,51,3.286,67,5.525,70,3.349,107,3.373,181,5.012,182,2.74,185,3.317,205,4.887,206,4.888,219,5.104,222,3.744,240,4.2,243,6.316,252,5.324,256,6.459,265,4.939,275,4.572,301,3.129,322,6.914,385,5.029,437,5.389,478,8.539,481,7.569,536,4.708,537,4.5,564,6.351,613,4.837,664,6.87,693,6.15,695,6.781,721,12.016,887,7.997,898,9.439,908,11.101,910,5.525,912,7.163,926,7.011,1009,12.016,1167,9.439,1322,11.101,1378,8.539,1589,10.22,1913,8.342,1917,13.73,1918,13.73,1919,13.73,1920,12.697]],["keywords/321",[]],["title/322",[25,79.157,33,153.915,437,467.161,1066,635.181]],["content/322",[5,3.695,6,1.657,25,1.447,33,2.213,51,4.095,52,4.716,152,3.407,185,4.134,234,7.916,240,3.821,256,8.051,273,3.753,278,4.607,284,7.717,293,4.791,301,3.901,314,6.071,330,4.115,537,5.609,539,7.961,613,6.029,614,7.402,652,8.194,704,8.995,722,8.62,732,5.988,937,7.475,1166,11.223,1170,8.739]],["keywords/322",[]],["title/323",[202,482.305,556,560.063]],["content/323",[6,2.18,25,1.202,69,4.046,70,3.161,72,6.169,107,3.184,125,5.129,176,4.73,182,3.606,184,2.811,192,4.358,257,5.806,273,3.964,278,3.489,281,8.07,284,4.598,297,3.677,301,2.954,311,5.552,314,4.598,315,4.222,322,4.765,330,4.346,379,8.269,381,4.183,392,6.029,396,4.235,425,4.663,438,4.854,442,9.435,490,5.15,537,4.248,538,6.443,545,3.59,584,8.764,611,8.162,613,6.367,697,8.268,718,5.26,732,4.535,734,6.528,740,8.407,921,6.713,1006,7.875,1071,11.986,1072,9.07,1073,11.986,1170,6.618,1176,7.405,1393,10.479,1751,9.244,1913,7.875,1914,9.244,1921,12.962,1922,11.986,1923,12.962,1924,11.986,1925,12.962]],["keywords/323",[]],["title/324",[25,89.993,886,483.395,1074,739.744]],["content/324",[]],["keywords/324",[]],["title/325",[25,123.921]],["content/325",[4,1.788,5,3.725,6,1.671,21,9.952,25,1.148,33,2.231,51,4.129,67,6.943,181,4.598,182,3.443,186,5.101,205,4.484,206,6.143,240,3.853,281,6.691,284,6.121,301,3.933,310,7.811,330,4.149,379,7.895,414,6.745,427,6.344,504,7.651,533,9.767,537,5.656,564,7.982,613,6.079,1067,11.668,1068,10.258,1172,12.307]],["keywords/325",[]],["title/326",[6,131.019,278,364.276,284,480.028]],["content/326",[4,1.773,6,2.106,44,4.765,116,7.068,182,3.415,183,5.39,330,5.751,425,6.157,438,6.409,451,10.518,538,8.507,544,6.385,545,6.026,622,6.945,638,9.87,668,8.863,745,9.356,751,10.518,858,8.62,1035,10.398,1085,14.343,1167,11.766,1847,12.739,1913,10.398,1914,12.206,1926,11.976,1927,12.458]],["keywords/326",[]],["title/327",[107,332.397,181,360.573,732,473.461]],["content/327",[6,1.671,9,7.895,25,1.148,107,4.239,151,5.324,155,5.144,181,4.598,182,3.443,192,5.802,240,3.853,246,5.451,310,7.811,314,7.758,392,8.026,427,6.344,477,10.05,545,6.058,613,6.079,622,7.003,706,8.811,707,11.668,762,12.844,812,12.307,985,8.026,1913,10.484,1928,15.957,1929,17.256,1930,17.256]],["keywords/327",[]],["title/328",[6,151.799,184,340.004]],["content/328",[6,2.074,25,1.111,51,3.997,65,5.474,69,7.382,70,4.073,155,4.979,176,6.095,184,4.645,186,4.937,192,5.616,205,4.34,220,5.904,225,5.987,226,8.529,227,8.589,281,6.477,297,4.738,301,3.807,315,5.44,330,4.016,410,10.799,438,6.255,537,5.474,622,6.778,740,7.769,985,7.769,1115,12.159,1141,10.953,1147,9.207]],["keywords/328",[]],["title/329",[183,493.826,273,343.83]],["content/329",[6,1.728,25,1.486,125,7.062,162,6.309,166,9.677,171,4.661,183,5.621,273,5.347,291,8.545,293,4.996,330,4.291,381,5.759,538,8.871,543,6.609,544,6.659,545,4.944,611,11.239,734,8.989,1006,10.843,1040,11.385,1170,9.113,1913,10.843,1931,11.239]],["keywords/329",[]],["title/330",[281,524.746,297,383.895,379,619.122]],["content/330",[25,1.24,69,5.821,70,4.547,219,6.931,264,5.406,281,8.901,301,4.25,330,4.483,373,4.809,385,6.83,397,11.894,425,6.708,537,6.111,545,5.165,613,6.569,741,11.329,1178,12.608,1422,13.048,1913,11.329,1932,18.646]],["keywords/330",[]],["title/331",[25,70.65,33,137.374,467,375.547,670,595.91,1913,645.446]],["content/331",[4,1.677,5,3.494,6,1.567,25,1.076,33,2.093,41,10.943,52,4.459,116,6.683,181,4.312,196,5.037,225,5.801,226,8.264,265,5.822,275,5.389,284,5.741,293,4.53,315,5.271,322,5.949,334,4.666,398,6.061,437,8.238,439,11.325,536,5.549,614,7,634,11.542,659,7.445,692,8.264,698,10.464,732,5.662,911,10.323,1167,11.126,1721,13.563,1783,11.126,1913,9.832,1933,12.686,1934,14.965,1935,12.686]],["keywords/331",[]],["title/332",[4,123.338,25,79.157,182,237.492,1913,723.164]],["content/332",[]],["keywords/332",[]],["title/333",[25,104.266,29,650.349]],["content/333",[4,1.731,12,5.824,22,4.383,25,1.659,28,9.264,29,8.885,87,5.804,97,5.864,113,7.769,144,10.265,171,4.362,190,7.813,191,5.021,319,9.545,328,13.504,452,7.726,490,6.637,722,10.789,1083,14.617,1180,10.036,1261,10.655,1263,11.912,1936,13.998,1937,13.998,1938,15.445,1939,16.703,1940,13.504]],["keywords/333",[]],["title/334",[33,174.985,198,361.493,323,745.978]],["content/334",[4,1.15,5,2.396,19,3.327,22,4.246,23,4.25,24,5.585,25,1.076,32,2.348,34,3.704,35,4.64,37,1.863,116,4.583,124,6.059,151,3.424,154,4.079,161,3.506,167,4.823,198,2.964,224,3.365,271,3.936,275,3.695,278,2.987,281,4.303,297,3.148,355,7.525,379,5.077,427,4.079,467,3.923,476,6.742,480,3.992,514,3.978,568,6.528,572,5.78,630,7.714,758,4.8,765,5.303,767,6.34,768,9.243,770,5.48,771,6.483,772,4.603,773,6.376,776,7.701,777,4.945,779,7.386,780,5.876,786,4.754,921,5.747,981,6.34,1058,5.747,1219,5.345,1256,6.281,1400,9.076,1540,6.902,1941,9.3,1942,8.699]],["keywords/334",[]],["title/335",[545,374.827,1913,822.159,1914,965.11]],["content/335",[4,1.632,6,1.525,19,4.722,23,4.207,25,0.711,32,3.956,34,3.606,35,3.068,125,4.233,151,3.301,152,2.13,162,5.568,164,5.871,166,5.8,167,4.65,183,3.37,188,8.835,224,3.244,273,2.346,284,3.795,301,2.438,330,2.572,355,4.216,425,3.849,427,3.933,476,9.57,490,4.251,538,5.318,569,7.729,642,4.792,716,3.862,732,3.743,768,13.58,771,4.286,812,7.63,824,7.486,983,6.359,1098,8.386,1526,5.848,1604,6.917,1656,7.121,1913,11.358,1914,11.234,1941,8.966,1943,10.698,1944,10.698,1945,10.698,1946,8.65,1947,10.698,1948,10.698,1949,9.893,1950,10.698,1951,10.698,1952,10.698,1953,15.752,1954,10.698,1955,15.752,1956,10.698,1957,10.698,1958,10.698]],["keywords/335",[]],["title/336",[25,79.157,65,390.118,400,535.943,408,393.825]],["content/336",[2,5.096,4,2.238,5,3.004,6,1.347,20,6.232,25,0.925,37,3.187,51,4.542,52,5.23,62,5.96,63,3.051,69,4.343,87,4.835,98,5.96,100,5.153,114,4.045,171,3.633,220,4.918,222,3.794,232,8.271,246,4.396,256,6.546,275,6.32,297,5.385,308,4.504,319,6.2,395,5.85,400,6.265,408,8.293,421,7.206,492,9.408,529,7.875,548,8.762,564,6.436,581,5.905,636,7.606,866,8.185,1030,6.828,1670,12.176,1871,11.249,1959,13.914,1960,13.914,1961,8.271,1962,12.866,1963,11.661,1964,12.866,1965,9.737]],["keywords/336",[]],["title/337",[6,92.877,25,63.794,205,249.247,219,356.567,240,214.197,613,337.935]],["content/337",[]],["keywords/337",[]],["title/338",[107,332.397,181,360.573,732,473.461]],["content/338",[5,4.026,6,1.805,25,1.24,70,4.547,107,4.58,161,5.891,181,6.116,182,3.72,185,4.504,192,6.269,240,4.164,273,4.089,314,6.614,315,6.073,396,6.092,622,7.567,706,9.521,717,8.928,732,6.524,1913,11.329]],["keywords/338",[]],["title/339",[225,562.039,226,800.578]],["content/339",[6,1.774,25,1.218,69,5.718,88,6.281,152,3.647,155,5.46,205,4.76,225,8.139,227,9.42,255,7.466,278,4.931,330,4.404,395,7.702,426,11.393,536,6.281,545,5.074,632,10.777,740,8.521,1116,9.105,1177,11.258,1310,10.669,1966,12.819]],["keywords/339",[]],["title/340",[613,552.327,1117,1267.615]],["content/340",[6,2.222,25,1.24,70,4.547,155,5.558,191,5.605,205,5.964,240,5.125,281,7.231,298,9.15,299,11.597,301,4.25,330,4.483,537,6.111,613,6.569,861,8.673,894,7.145,985,8.673,1174,11.329]],["keywords/340",[]],["title/341",[25,79.157,202,366.157,563,509.904,1119,686.479]],["content/341",[]],["keywords/341",[]],["title/342",[60,504.882,63,296.762,514,485.1]],["content/342",[6,1.822,60,8.612,63,4.126,171,4.913,191,5.656,198,5.026,273,5.062,301,4.288,512,7.702,544,7.02,693,8.428,737,6.326,740,8.751,905,11.184,1330,14.748,1427,10.04,1913,11.431,1967,14.748]],["keywords/342",[]],["title/343",[6,131.019,185,326.9,480,486.819]],["content/343",[5,4.336,6,1.945,25,1.336,51,4.806,70,4.898,182,4.007,278,5.407,297,5.698,480,7.225,863,11.583,906,10.889,924,12.812,932,9.14]],["keywords/343",[]],["title/344",[116,491.54,278,320.414,330,286.181,356,553.65]],["content/344",[4,1.967,6,2.247,33,2.455,224,5.757,241,7.057,330,5.58,356,8.831,537,6.223,545,5.259,659,8.734,668,9.833,751,11.668,1125,13.286,1126,14.132,1128,13.821,1170,9.695,1968,18.986]],["keywords/344",[]],["title/345",[217,483.395,556,483.395,742,612.527]],["content/345",[5,4.214,6,1.89,35,5.598,63,4.281,152,3.886,217,6.973,556,6.973,693,8.743,737,6.563,742,8.835,866,11.484,921,10.109,954,10.259,958,9.029,1784,17.082,1969,15.301]],["keywords/345",[]],["title/346",[4,99.401,25,63.794,85,462.071,182,191.399,855,570.235,1913,582.811]],["content/346",[2,4.222,5,2.489,6,2.068,18,3.851,20,7.45,25,1.106,33,1.491,44,4.631,60,4.301,63,2.528,64,7.794,70,2.811,111,4.35,121,6.926,144,7.084,155,4.958,166,9.017,171,3.01,181,3.071,183,3.631,191,3.465,198,5.212,210,7.673,246,3.642,264,3.342,273,3.647,284,4.089,304,5.806,314,4.089,323,6.354,360,9.501,381,3.72,385,4.222,392,5.362,427,4.237,439,8.066,468,5.274,478,7.169,514,4.132,538,8.267,545,3.193,622,4.678,664,5.767,693,5.163,736,4.317,786,4.938,858,5.806,893,4.847,905,6.852,906,6.25,914,5.423,1058,5.97,1108,7.794,1124,7.453,1143,7.453,1151,7.453,1176,6.585,1234,9.661,1671,9.32,1786,9.036,1792,7.925,1872,6.2,1913,7.003,1914,8.221,1927,8.391,1970,8.221,1971,11.527,1972,11.527,1973,11.527,1974,10.659,1975,10.088,1976,11.527,1977,10.659,1978,11.527,1979,11.527,1980,9.661,1981,7.673]],["keywords/346",[]],["title/347",[191,471.331,879,610.406]],["content/347",[4,1.413,19,5.613,25,1.657,33,1.764,51,3.264,85,6.57,87,4.74,105,10.152,125,5.397,152,2.716,171,3.562,189,6.965,190,6.381,191,4.101,192,4.586,196,4.246,202,4.196,222,3.719,265,4.907,293,3.818,366,6.57,398,5.108,523,10.071,536,4.677,853,10.697,855,8.108,857,7.014,861,6.345,872,6.87,879,7.29,882,11.508,883,10.152,884,7.944,886,4.873,887,7.944,937,5.957,993,6.57,994,7.336,995,9.728,996,6.174,997,9.929,998,9.728,1127,8.589,1154,10.692,1192,8.484,1913,8.287,1936,11.432,1982,11.028,1983,9.929,1984,8.701]],["keywords/347",[]],["title/348",[25,53.425,33,103.882,114,233.543,196,250.045,217,286.973,264,232.903,414,314.027,973,432.085]],["content/348",[]],["keywords/348",[]],["title/349",[33,137.374,114,308.839,217,379.495,414,415.272,636,580.745]],["content/349",[]],["keywords/349",[]],["title/350",[152,269.421,377,1060.767,701,841.635]],["content/350",[5,4.464,6,2.002,25,1.052,152,4.116,182,3.155,194,9.211,196,4.922,203,8.02,217,7.386,239,8.075,255,6.446,260,8.191,278,4.257,414,6.182,437,6.207,512,6.474,551,7.197,572,5.649,662,11.279,663,8.718,716,5.71,765,5.183,921,8.191,926,8.075,954,8.312,1183,8.718,1204,8.132,1430,12.786,1479,8.871,1651,9.121,1856,11.512,1933,12.397,1985,13.84,1986,10.226,1987,12.063,1988,12.786,1989,11.772]],["keywords/350",[]],["title/351",[639,644.087,765,443.523,1546,1134.114]],["content/351",[6,1.508,9,7.127,33,2.014,73,7.955,111,7.725,162,7.237,196,4.849,217,5.565,222,4.248,329,6.942,330,3.746,348,8.818,396,5.09,414,6.09,417,7.014,435,9.367,437,6.114,587,9.937,662,11.11,663,8.588,695,7.693,737,6.883,765,6.71,991,8.588,1407,11.883,1547,10.369,1623,10.533,1651,8.985,1659,13.633,1990,11.596,1991,12.212,1992,12.595,1993,10.533,1994,15.579,1995,15.579,1996,15.579,1997,13.633,1998,14.406]],["keywords/351",[]],["title/352",[70,290.285,860,723.164,920,630.307,956,749.53]],["content/352",[5,3.389,6,1.992,30,7.384,63,3.442,99,5.529,152,3.125,196,4.885,217,5.607,222,4.28,223,8.071,249,8.884,250,8.376,256,7.384,257,7.031,301,3.577,322,5.77,330,3.774,427,5.77,496,8.313,544,5.856,552,8.249,572,5.607,642,7.031,695,7.751,732,5.492,905,9.33,1021,8.442,1025,11.973,1326,9.646,1604,10.148,1614,8.015,1651,9.052,1666,14.514,1986,13.302,1999,15.696,2000,11.683,2001,15.696,2002,8.442,2003,15.696]],["keywords/352",[]],["title/353",[62,579.706,414,528.967,417,609.31]],["content/353",[5,2.619,6,1.175,33,1.569,44,3.378,70,2.959,107,2.98,114,3.527,122,5.325,152,4.353,171,3.168,182,4.006,196,3.776,201,4.685,217,7.171,222,3.308,234,5.611,255,4.944,278,3.266,301,2.765,306,8.652,322,4.46,377,9.509,379,5.55,414,4.742,417,5.462,421,6.283,452,5.611,466,6.329,501,6.238,503,6.424,537,3.976,552,6.376,560,6.424,563,5.197,639,5.774,640,8.652,663,6.687,693,5.434,718,4.923,732,4.244,860,7.37,876,7.545,914,5.707,943,6.376,1001,10.167,1007,6.376,1021,6.525,1037,8.652,1158,7.455,1173,7.211,1194,8.831,1220,6.93,1234,10.167,1356,7.738,1547,11.483,1560,8.34,1604,7.844,1651,6.996,1681,11.218,1729,9.253,1902,7.455,1986,7.844,1997,10.616,2004,9.253,2005,11.218,2006,12.131,2007,10.616,2008,12.131,2009,12.131,2010,9.808,2011,11.218,2012,11.218,2013,12.131]],["keywords/353",[]],["title/354",[381,384.109,417,535.943,965,740.294,2014,1190.303]],["content/354",[6,1.698,9,3.587,33,1.994,44,2.183,69,2.447,70,1.912,114,3.61,124,2.936,136,4.521,152,2.472,182,1.564,201,6.774,217,5.508,222,4.205,255,5.061,264,2.273,273,3.382,278,3.343,291,3.754,297,2.224,306,5.591,322,5.668,329,3.494,330,1.885,371,4.09,373,2.022,379,3.587,391,3.949,395,6.484,401,3.512,414,7.472,417,9.593,437,6.052,452,3.626,462,3.115,474,4.521,501,6.386,503,4.151,512,3.209,533,7.029,541,3.823,544,2.925,551,3.567,556,2.8,560,4.151,563,6.606,564,3.626,614,3.391,639,3.731,640,5.591,659,3.606,663,4.322,667,9.472,668,4.06,695,3.872,701,4.876,718,3.181,732,4.345,736,2.936,751,4.818,765,5.054,772,3.252,785,2.391,860,4.763,862,4.937,865,12.536,876,4.876,905,7.382,914,3.688,952,4.437,954,4.12,961,4.322,963,3.028,965,4.876,973,4.217,1021,10.282,1030,3.847,1161,6.145,1166,5.141,1169,3.587,1190,6.145,1195,6.861,1297,5.301,1315,4.937,1326,7.632,1329,3.976,1389,6.338,1395,5.835,1418,6.145,1547,5.218,1558,4.818,1560,5.39,1582,5.835,1623,5.301,1636,5.486,1645,7.249,1697,4.437,1728,5.835,1729,5.98,1846,5.707,1847,5.835,1986,5.069,1997,6.861,2004,9.472,2015,7.84,2016,7.84,2017,6.861,2018,6.145,2019,7.249,2020,7.84,2021,6.57,2022,6.57,2023,3.823,2024,7.84,2025,6.338,2026,7.84,2027,7.84,2028,7.84,2029,7.249,2030,6.861,2031,5.591,2032,6.338]],["keywords/354",[]],["title/355",[5,229.359,33,137.374,217,379.495,417,478.346,991,585.638]],["content/355",[]],["keywords/355",[]],["title/356",[217,425.189,372,769.603,1990,885.975,2033,962.349]],["content/356",[5,3.48,6,1.843,23,2.901,35,4.622,53,4.663,60,4.118,85,5.317,92,4.706,190,5.163,196,3.436,198,4.305,203,8.173,217,8.304,223,5.676,273,2.421,291,5.285,297,3.131,298,5.417,310,4.996,325,7.724,372,10.421,417,7.257,438,4.134,479,6.632,536,3.785,556,3.943,557,4.386,630,4.058,631,6.429,633,8.925,639,7.671,642,4.944,656,6.562,721,9.66,732,3.862,735,4.97,737,6.4,765,3.618,771,4.423,787,7.811,869,12.484,875,5.845,1066,5.89,1081,6.784,1310,6.429,1329,5.598,1402,8.035,1417,6.034,1427,5.89,1610,6.865,1616,9.66,1623,7.464,1651,6.366,1668,8.653,1856,8.035,1933,8.653,1986,10.421,1990,14.17,2033,8.925,2034,17.603,2035,9.251,2036,8.653,2037,10.207,2038,11.038,2039,11.038,2040,11.038,2041,11.038,2042,11.038,2043,8.035,2044,9.66,2045,9.251,2046,11.038]],["keywords/356",[]],["title/357",[5,292.154,100,501.136,217,483.395]],["content/357",[4,1.36,5,4.523,6,1.271,25,0.873,37,2.203,44,3.655,49,6.175,51,3.141,63,2.878,88,4.5,100,9.118,110,5.79,113,6.105,152,2.613,155,3.912,202,4.037,217,8.087,240,2.931,273,2.878,297,3.723,319,5.849,329,5.849,334,3.784,373,3.385,396,4.288,437,5.151,452,6.071,491,9.554,492,8.874,503,6.95,515,6.482,545,3.635,631,10.619,636,7.175,650,7.569,664,6.567,737,4.413,750,11.486,765,4.302,947,12.535,1015,10.011,1029,9.554,1261,8.372,1546,11,1763,11.486,1990,9.769,2047,13.125,2048,16.86,2049,8.486,2050,13.125,2051,11,2052,10.011,2053,13.125,2054,13.125,2055,11]],["keywords/357",[]],["title/358",[33,103.882,72,382.369,98,344.149,217,452.238,510,407.391,631,467.879,670,450.625]],["content/358",[2,6.827,5,2.298,6,1.519,12,3.711,30,5.007,37,1.787,44,4.369,60,5.855,69,3.323,88,3.649,98,9.396,113,4.951,155,3.173,156,9.87,182,2.124,185,2.571,192,3.578,196,3.313,217,7.348,230,6.499,255,4.338,278,2.865,334,3.069,391,5.361,409,10.01,438,3.986,440,4.923,483,5.725,496,4.301,498,6.62,501,5.473,545,2.948,556,3.802,581,4.517,631,6.199,636,5.818,642,4.767,650,10.75,674,3.898,693,7.029,732,3.724,736,5.877,739,10.146,887,6.199,912,5.553,1000,5.725,1007,5.594,1042,12.051,1114,5.435,1160,5.397,1171,7.317,1173,6.327,1297,7.197,1325,6.882,1356,6.789,1694,7.448,1697,6.024,1799,9.314,1965,7.448,2049,6.882,2056,10.644,2057,10.788,2058,6.789,2059,10.644,2060,8.119,2061,10.644,2062,7.084,2063,8.92,2064,10.644,2065,12.687,2066,10.644,2067,10.644,2068,10.644,2069,10.644,2070,8.605,2071,9.842,2072,9.314,2073,9.842]],["keywords/358",[]],["title/359",[7,299.457,25,63.794,33,124.043,217,342.668,264,278.105,625,731.722]],["content/359",[25,1.24,33,2.411,107,4.58,152,3.712,181,4.968,199,8.928,201,7.202,205,4.845,206,6.637,217,6.661,240,4.164,264,5.406,414,7.289,504,8.267,614,8.065,785,5.686,1172,13.298,1720,16.318,2074,18.646,2075,14.223,2076,16.318]],["keywords/359",[]],["title/360",[556,560.063,960,1267.615]],["content/360",[4,1.15,5,3.493,6,1.566,18,3.707,25,1.27,33,1.435,37,1.863,45,3.148,60,4.14,107,2.726,114,4.704,152,3.221,162,3.923,181,4.311,184,2.407,185,4.613,191,3.336,217,8.32,230,3.506,240,2.478,250,5.922,264,3.217,273,4.187,278,2.987,284,3.936,314,3.936,315,6.219,322,5.948,330,3.89,381,3.581,396,3.626,417,4.997,425,3.992,452,5.133,458,5.162,466,5.789,467,3.923,490,4.409,538,5.516,539,5.162,543,4.11,544,4.14,545,4.482,553,4.971,590,4.731,614,4.8,630,4.079,639,5.282,652,7.747,662,7.914,663,6.117,712,6.742,716,4.006,737,3.731,765,5.303,858,5.589,891,6.117,942,6.668,953,8.26,985,5.162,1147,6.117,1183,6.117,1651,6.4,1726,5.969,1846,8.078,1856,8.078,1927,8.078,1981,7.386,1991,8.699,2023,5.411,2049,7.175,2052,8.465,2077,9.3,2078,9.711]],["keywords/360",[]],["title/361",[25,79.157,202,366.157,217,425.189,563,509.904]],["content/361",[6,1.464,19,3.036,23,4.127,32,3.2,35,4.337,37,1.7,45,2.873,65,3.319,70,2.47,152,3.603,171,2.644,217,7.171,334,2.92,393,5.446,414,3.958,425,5.44,467,3.58,498,6.298,556,6.465,581,4.297,590,4.317,630,3.722,693,4.536,695,5.001,718,6.137,719,6.962,737,6.085,742,9.087,757,9.778,765,4.956,861,4.71,944,5.68,945,7.938,1065,5.957,1161,7.938,1162,9.364,1169,4.633,1183,5.582,1300,6.957,1567,7.938,1583,7.938,1755,7.724,1811,7.371,1825,8.187,1827,5.68,1828,9.364,1829,8.862,1830,13.984,1831,8.487,1832,13.984,1833,9.364,1834,13.984,1835,13.984,1836,13.984,1837,13.984,1838,9.364,1839,9.364,1840,9.364,1841,13.984,1842,13.984,1967,7.938,2079,5.785,2080,9.364,2081,10.126,2082,8.862,2083,9.364,2084,10.126,2085,9.364,2086,10.126]],["keywords/361",[]],["title/362",[191,471.331,879,610.406]],["content/362",[4,0.812,5,2.681,6,1.202,7,2.447,19,3.723,25,1.469,33,1.994,46,2.538,51,1.876,60,2.925,70,1.912,85,3.776,87,2.724,97,2.752,98,3.358,105,6.733,107,3.05,114,2.279,125,3.102,152,3.07,156,4.151,171,2.047,181,3.309,182,1.564,184,1.7,185,1.894,186,2.317,189,4.003,190,5.809,191,2.357,192,4.175,196,3.865,201,3.028,202,3.82,217,7.264,222,4.205,230,2.477,265,2.82,273,2.723,284,2.781,293,3.476,296,5.835,304,3.949,348,4.437,366,3.776,385,2.871,398,2.936,401,3.512,414,3.064,417,5.591,452,3.626,467,2.771,514,2.81,523,6.679,533,4.437,536,2.688,541,3.823,544,2.925,551,3.567,556,2.8,563,3.358,631,4.566,639,5.911,650,4.521,701,4.876,732,2.743,736,2.936,737,4.175,739,5.069,742,3.549,765,4.07,853,7.094,855,4.66,856,5.069,857,4.031,860,4.763,861,3.647,865,5.141,872,3.949,875,4.151,879,4.835,882,7.632,883,6.733,884,4.566,886,2.8,887,4.566,888,4.09,947,5.39,956,4.937,961,4.322,986,5.39,993,3.776,994,4.217,995,5.591,996,3.549,997,5.707,998,5.591,1021,6.679,1077,4.437,1127,4.937,1154,6.145,1192,4.876,1197,5.486,1233,6.57,1311,6.57,1315,4.937,1418,6.145,1659,6.861,1668,6.145,1913,4.763,1936,6.57,1982,6.338,1983,5.707,1984,5.001,1986,5.069,1990,9.243,2034,7.249,2048,7.249,2087,7.84,2088,5.591,2089,5.141,2090,7.84,2091,7.84,2092,7.84,2093,7.84,2094,5.835,2095,5.486,2096,7.84,2097,7.84,2098,4.937,2099,6.57,2100,7.84,2101,7.84,2102,6.338]],["keywords/362",[]],["title/363",[7,371.572,25,79.157,33,153.915,217,425.189]],["content/363",[]],["keywords/363",[]],["title/364",[33,174.985,217,483.395,1110,773.065]],["content/364",[4,1.744,5,4.252,6,2.422,7,5.255,12,4.087,33,1.516,58,4.293,65,3.842,86,4.736,152,3.351,155,3.494,195,6.207,196,5.239,200,4.373,217,8.734,222,3.196,251,6.517,256,5.514,297,3.325,304,5.904,322,4.309,381,3.783,382,6.027,394,8.536,395,4.929,396,3.83,416,11.204,417,5.278,421,6.071,486,6.968,519,6.304,553,5.25,558,9.188,597,9.188,598,7.925,639,5.579,674,4.293,695,5.789,701,7.29,938,9.188,956,7.381,973,6.304,1021,6.304,1036,9.824,1037,8.36,1038,7.29,1068,10.006,1157,6.968,1224,9.804,1305,8.203,1650,6.968,1651,9.708,1668,9.188,1986,10.884,2007,10.258,2023,5.716,2049,7.579,2103,11.722,2104,9.824,2105,11.722,2106,6.76,2107,10.839]],["keywords/364",[]],["title/365",[37,178.358,87,369.18,152,211.512,217,379.495,467,375.547]],["content/365",[2,6.796,4,0.9,5,2.906,6,2.366,10,6.52,12,4.694,19,2.605,25,1.096,33,2.746,37,3.944,51,2.079,52,2.394,53,3.671,58,3.183,69,4.202,84,4.637,87,5.726,99,3.061,114,2.526,152,1.73,155,2.59,176,3.171,182,4.79,185,3.252,186,3.979,198,2.321,201,3.356,206,3.093,217,3.104,219,3.23,222,2.37,230,2.745,232,9.795,240,4.741,249,4.919,252,3.37,260,4.501,264,3.903,265,3.126,297,2.465,314,3.083,334,4.751,408,2.875,432,4.567,467,4.759,478,5.405,479,5.221,504,5.968,519,4.674,525,4.567,531,4.75,535,6.812,536,2.98,539,4.042,554,4.161,560,4.602,562,5.012,564,4.02,613,4.742,652,6.445,674,3.183,678,5.472,697,5.543,740,4.042,785,2.65,856,5.619,932,3.954,936,4.319,962,6.468,965,5.405,987,5.619,1000,4.674,1030,4.264,1053,6.812,1081,5.341,1268,4.501,1295,10.552,1427,4.637,1611,6.468,1751,11.751,2108,8.69,2109,12.448,2110,8.69,2111,5.784,2112,5.699]],["keywords/365",[]],["title/366",[37,199.834,152,236.98,217,425.189,742,538.773]],["content/366",[4,1.432,6,2.084,25,0.919,30,6.502,37,3.614,45,3.921,53,7.981,63,3.031,96,7.823,152,4.286,155,4.12,182,2.758,186,4.085,202,4.252,217,6.749,252,5.36,255,5.633,273,4.721,288,6.826,298,6.782,308,4.474,334,3.985,401,6.191,438,5.176,455,6.618,466,7.21,480,4.972,514,4.955,556,4.937,560,7.319,581,5.865,617,7.319,622,5.609,703,5.157,718,5.609,737,4.647,742,10.968,843,6.256,914,6.502,944,7.753,963,7.298,999,10.061,2113,12.781,2114,9.064,2115,11.583]],["keywords/366",[]],["title/367",[6,92.877,330,230.639,435,438.882,765,475.882,2023,467.785]],["content/367",[4,1.01,5,3.173,6,1.907,19,2.922,23,4.03,25,1.31,32,2.063,33,1.9,35,4.214,45,4.169,53,4.117,69,3.043,72,4.639,152,2.926,155,2.905,171,2.545,176,3.557,177,5.012,182,1.945,201,3.765,205,2.533,217,3.482,227,5.012,240,2.176,248,5.285,271,3.458,293,2.728,297,2.765,301,2.221,330,2.343,334,2.81,373,2.514,381,3.145,382,5.012,398,3.65,435,8.093,545,2.7,556,5.25,572,3.482,590,4.156,600,7.904,630,7.769,736,3.65,758,4.216,765,5.798,770,4.814,771,7.088,772,4.043,773,6.971,774,9.67,775,7.036,860,5.922,985,4.534,987,6.302,1019,6.138,1144,8.53,1174,5.922,1211,7.641,1224,8.559,1345,6.062,1417,8.033,1444,6.954,1548,6.218,1625,7.881,1889,9.254,2023,8.626,2116,14.825,2117,6.392,2118,6.59,2119,9.747,2120,9.013,2121,5.99]],["keywords/367",[]],["title/368",[5,229.359,25,70.65,51,254.223,182,211.969,217,379.495]],["content/368",[2,5.837,3,7.331,25,1.538,37,3.882,45,4.521,46,5.158,51,5.533,52,4.391,69,6.487,113,7.412,114,4.633,182,3.18,183,6.545,198,4.257,220,5.633,273,4.557,275,5.306,281,6.18,293,4.461,297,4.521,301,3.632,437,6.255,519,8.571,536,5.464,537,5.223,545,4.414,553,7.138,554,7.63,613,5.614,962,11.862,1653,13.946]],["keywords/368",[]],["title/369",[25,79.157,33,153.915,63,261.029,217,425.189]],["content/369",[6,2.306,8,4.471,25,1.215,33,1.702,37,2.716,44,3.665,46,4.261,60,3.15,63,4.007,70,2.059,85,4.067,87,5.622,92,3.6,114,2.455,122,3.706,125,3.341,152,1.681,182,3.228,183,2.659,186,2.496,192,2.839,205,2.194,217,7.075,219,3.138,240,1.885,273,4.007,278,2.273,291,4.043,293,2.364,310,3.822,322,3.104,330,2.03,385,3.093,389,4.342,395,3.55,396,4.301,398,3.162,400,5.927,405,6.769,408,2.794,428,7.08,438,3.162,476,5.13,514,6.549,520,3.822,533,4.779,544,3.15,545,3.646,550,4.779,557,3.355,613,2.974,622,6.565,674,3.093,675,6.123,693,3.782,695,4.17,716,3.048,718,5.342,740,3.927,785,2.575,860,5.13,898,5.805,902,4.823,903,6.826,907,5.189,910,5.297,914,3.972,918,4.779,921,4.373,922,6.44,925,7.076,926,4.311,931,5.019,963,5.084,968,6.619,981,4.823,982,4.506,985,3.927,986,5.805,1007,4.437,1016,6.285,1030,4.143,1045,6.44,1050,6.022,1065,7.744,1123,6.285,1147,4.654,1151,8.511,1329,4.282,1419,6.44,1427,4.506,1571,5.709,1580,6.285,1606,9.05,1667,7.076,1668,6.619,1782,6.022,1984,5.386,1986,5.459,2122,8.444,2123,6.619,2124,7.389,2125,6.826,2126,5.62,2127,7.389,2128,8.444,2129,7.808,2130,5.537]],["keywords/369",[]],["title/370",[25,104.266,504,695.115]],["content/370",[6,1.644,25,1.129,63,3.723,182,3.387,196,6.736,202,5.222,206,7.704,217,6.064,222,4.629,240,4.833,252,6.582,255,6.918,265,6.107,355,6.689,401,7.603,414,6.635,462,6.745,504,9.595,622,8.783,639,8.079,674,6.217,899,12.357,907,10.432,963,6.556,992,12.106,2131,10.199,2132,15.697]],["keywords/370",[]],["title/371",[5,207.102,25,63.794,58,351.353,99,337.935,152,190.987,217,342.668]],["content/371",[6,2.022,7,5.013,25,1.068,46,6.76,58,8.5,97,5.638,99,7.357,152,3.197,175,9.988,182,3.204,186,4.747,196,4.998,199,7.689,217,7.46,222,4.379,252,6.227,264,6.054,278,4.323,291,7.689,394,8.144,437,6.303,536,5.506,542,10.244,560,8.504,567,10.531,622,6.517,643,11.453,674,5.882,701,9.988,1065,9.447,1151,10.383,2133,16.059]],["keywords/371",[]],["title/372",[4,123.338,33,153.915,100,440.795,217,425.189]],["content/372",[4,1.731,6,2.289,14,6.279,25,1.111,33,2.16,37,3.596,46,5.407,67,6.721,96,9.454,100,7.932,152,3.325,217,8.447,220,5.904,293,4.676,298,8.196,322,6.14,323,9.207,395,7.023,401,7.482,437,6.555,639,7.95,732,5.844,875,8.845,931,9.929,1021,8.983,2004,12.741,2104,13.998,2134,13.998]],["keywords/372",[]],["title/373",[191,471.331,879,610.406]],["content/373",[4,1.335,6,2.008,7,4.021,19,3.861,25,1.571,33,1.666,37,3.021,63,2.825,87,4.476,105,9.758,125,5.097,171,4.699,181,3.432,182,3.591,190,6.025,191,3.872,196,4.009,202,3.963,217,6.429,262,9.604,265,4.634,297,3.654,428,6.928,437,7.063,523,6.928,525,6.77,541,6.281,561,6.06,573,8.856,613,4.538,622,5.227,642,5.77,688,7.826,853,10.281,872,6.488,879,5.015,882,7.916,883,6.984,884,7.502,886,6.429,887,7.502,937,5.626,947,8.856,963,4.975,983,7.657,994,6.928,996,5.831,1000,6.928,1034,10.415,1056,8.111,1172,9.187,1432,11.912,2113,11.912,2135,11.912,2136,9.014,2137,12.881]],["keywords/373",[]],["title/374",[7,250.785,25,53.425,33,163.706,85,386.968,182,160.29,185,305.83]],["content/374",[]],["keywords/374",[]],["title/375",[4,123.338,33,153.915,67,478.927,185,287.538]],["content/375",[6,1.815,33,2.673,44,2.994,58,3.939,68,5.652,69,3.357,70,4.573,107,2.641,151,3.318,176,3.924,181,4.996,182,3.155,185,5.321,192,3.615,195,5.694,200,4.012,201,4.153,202,3.308,219,3.997,240,2.401,255,4.383,256,5.059,264,5.993,278,2.895,301,2.451,304,7.964,306,7.669,314,5.609,315,5.15,329,4.792,330,2.585,334,3.101,385,3.939,395,4.522,438,4.027,490,4.273,515,5.311,532,6.263,536,3.687,537,3.524,539,5.002,545,2.979,551,7.195,565,6.087,569,5.277,584,7.271,613,3.788,615,9.012,632,9.302,652,5.149,675,5.002,704,5.652,706,8.073,708,6.771,717,5.149,718,4.364,888,5.61,893,4.522,904,7.828,907,6.609,910,4.327,914,5.059,923,7.052,985,5.002,1011,7.271,1012,7.393,1030,5.277,1152,7.158,1158,6.609,1238,7.525,1394,9.012,1419,8.203,1590,8.203,1620,8.694,1634,7.669,1782,7.669,2138,9.411,2139,10.754,2140,10.754,2141,6.86]],["keywords/375",[]],["title/376",[63,343.83,514,562.039]],["content/376",[2,4.777,4,1.351,5,2.816,6,1.758,22,3.423,33,2.7,60,6.773,63,2.86,69,4.071,87,4.532,113,6.067,155,3.888,171,3.406,176,6.625,182,3.622,185,4.385,191,3.921,192,4.385,199,6.245,230,5.735,237,8.553,273,3.981,278,3.511,373,3.364,392,6.067,393,9.764,401,5.842,455,6.245,462,5.182,496,5.27,498,8.112,500,9.127,501,6.707,514,4.675,545,3.613,561,6.136,693,5.842,697,8.32,712,7.924,718,5.293,736,4.884,785,3.977,890,9.302,905,10.791,921,6.755,943,6.855,1112,7.753,1119,7.522,1148,9.127,1417,7.13,1427,6.96,1430,10.545,2025,10.545,2035,10.931,2142,12.061,2143,12.061,2144,13.043,2145,13.043]],["keywords/376",[]],["title/377",[480,564.031,932,713.465]],["content/377",[5,3.389,6,1.992,33,2.03,37,2.635,40,5.992,45,4.453,70,5.018,87,5.454,176,7.508,185,3.792,196,4.885,201,6.062,297,4.453,305,9.762,467,5.548,474,9.052,480,7.401,515,7.751,551,7.143,659,7.22,688,9.536,863,9.052,906,8.51,932,10.444,934,9.646,1066,8.376,1299,11.426,1410,13.736,1687,12.69,1981,10.447,2057,10.791,2146,11.426,2147,15.696,2148,15.696,2149,15.696,2150,15.696]],["keywords/377",[]],["title/378",[7,371.572,25,79.157,182,237.492,514,426.689]],["content/378",[6,1.685,7,5.432,25,1.462,33,2.843,44,4.845,107,4.274,181,5.858,182,3.472,256,8.186,278,4.684,284,7.799,301,3.966,310,7.876,414,6.802,428,9.359,537,5.703,539,8.094,564,8.049,573,11.963,614,7.526,675,8.094,692,8.885,907,10.694,961,9.592,1622,14.583]],["keywords/378",[]],["title/379",[284,480.028,301,308.418,537,443.523]],["content/379",[6,1.657,25,1.138,182,3.415,224,5.189,284,6.071,330,5.231,334,4.935,396,5.592,427,6.291,466,8.928,538,8.507,544,6.385,545,4.74,752,14.977,812,12.206,858,8.62,893,7.196,910,6.886,957,10.398,1031,12.458,1068,10.173,1077,9.687,1158,10.518,1175,10.777,1176,9.777,1617,8.928,1856,12.458,1926,11.976,2151,17.115,2152,13.055]],["keywords/379",[]],["title/380",[107,332.397,181,360.573,297,383.895]],["content/380",[3,7.275,6,1.531,25,1.052,46,5.119,70,3.857,107,3.885,176,5.772,181,5.509,192,5.317,203,8.02,220,5.591,230,4.996,264,4.585,290,12.063,304,7.966,310,7.159,314,7.334,330,3.802,423,9.72,425,5.689,438,5.923,490,6.284,553,7.084,562,9.121,564,7.315,613,5.571,622,6.418,674,5.793,704,8.312,705,9.211,706,8.075,707,10.693,732,5.533,737,5.317,1190,12.397,1417,8.645,2065,12.786,2153,15.815,2154,14.624]],["keywords/380",[]],["title/381",[6,131.019,184,293.46,639,644.087]],["content/381",[25,1.457,45,4.055,97,5.019,152,2.846,155,4.261,184,5.089,196,4.449,202,4.398,217,5.107,220,6.834,227,7.351,236,9.828,237,9.375,239,9.872,240,3.192,241,5.314,242,7.881,243,6.576,248,7.751,255,5.826,293,4.002,297,4.055,308,4.627,319,6.37,385,5.236,394,7.249,421,7.404,517,7.751,551,6.505,586,10.641,613,5.036,638,8.245,639,6.804,660,8.019,671,11.981,736,5.354,952,8.091,987,9.243,996,6.471,1078,11.558,1542,12.51,1662,11.206,1961,8.498,2075,10.904,2155,14.296,2156,13.219,2157,14.296,2158,14.296]],["keywords/381",[]],["title/382",[271,480.028,765,443.523,2023,659.894]],["content/382",[6,2.358,25,1.044,33,2.03,152,3.125,182,3.132,217,5.607,271,5.568,304,7.906,330,3.774,334,4.526,435,7.181,551,7.143,590,6.692,614,6.789,622,6.37,664,7.853,695,7.751,732,5.492,737,5.277,765,7.522,860,9.536,865,10.293,921,8.129,937,6.855,954,8.249,985,7.301,1039,11.973,1147,8.652,1224,9.141,1547,10.447,1606,10.791,1799,13.736,1993,10.613,2057,10.791,2159,15.696,2160,13.736,2161,11.973]],["keywords/382",[]],["title/383",[45,383.895,989,965.11,1305,946.964]],["content/383",[1,6.2,4,1.442,6,1.347,25,0.925,37,2.336,44,5.285,51,3.33,52,3.834,58,5.096,63,3.051,99,4.902,100,5.153,111,5.25,121,8.36,151,4.293,182,3.787,202,4.28,241,5.172,246,4.396,255,5.671,265,5.005,273,3.051,307,8.024,312,12.866,334,4.012,385,5.096,393,7.483,396,4.546,398,5.211,399,7.606,400,6.265,462,5.528,480,6.828,563,5.96,622,5.646,631,11.054,638,8.024,639,6.622,668,7.206,799,9.566,876,8.654,932,6.332,969,9.408,1047,10.128,1327,10.129,1329,7.056,1378,8.654,1389,11.249,1551,11.249,1580,10.356,2162,13.914,2163,13.914,2164,13.914,2165,9.408]],["keywords/383",[]],["title/384",[195,716.592,379,619.122,394,686.235]],["content/384",[1,6.79,3,7.009,6,1.475,25,1.013,51,3.646,52,4.198,58,5.581,69,4.756,100,5.643,181,4.06,182,3.04,195,10.684,196,4.742,198,4.07,199,7.295,200,5.685,206,5.424,240,3.402,264,5.849,265,5.481,297,4.322,321,9.364,466,7.949,524,9.992,562,8.787,588,11.622,668,7.891,715,11.341,738,9.852,743,10.662,937,6.655,952,8.624,954,8.008,962,11.341,983,9.057,985,7.087,1034,12.319,1043,11.091,1056,9.595,2094,11.341,2141,9.719,2166,15.237,2167,15.237,2168,15.237]],["keywords/384",[]],["title/385",[63,343.83,514,562.039]],["content/385",[6,1.531,25,1.375,37,2.655,60,5.9,63,3.468,70,3.857,121,9.503,149,6.56,155,4.714,166,8.575,182,3.155,192,5.317,284,5.61,301,3.604,498,9.836,512,6.474,542,10.088,663,8.718,693,7.084,701,9.836,785,4.823,892,9.72,893,6.65,910,6.363,914,7.44,921,8.191,936,7.861,937,6.907,950,10.527,963,6.108,983,9.401,1007,8.312,1047,11.512,1147,8.718,1207,9.121,1329,8.02,1378,9.836,1427,8.439,1605,13.254,2169,13.84]],["keywords/385",[]],["title/386",[253,1372.068,705,913.126]],["content/386",[3,7.445,4,1.677,6,1.567,20,7.249,25,1.076,67,6.512,70,3.947,152,3.222,155,4.824,182,3.229,184,3.51,202,4.978,203,8.207,225,5.801,230,5.113,252,6.276,255,6.596,278,4.356,293,4.53,297,4.591,311,6.933,366,7.795,437,6.352,447,10.323,512,6.625,527,8.322,541,7.892,545,4.483,550,9.16,693,7.249,736,6.061,739,10.464,996,7.325,1007,8.505,1116,8.044,1317,11.325,1729,12.345,2170,14.163]],["keywords/386",[]],["title/387",[196,421.191,202,416.281,938,1060.767]],["content/387",[7,4.937,25,1.375,45,4.487,106,10.873,110,6.976,152,3.149,186,4.675,196,6.435,198,4.225,234,7.315,297,4.487,308,5.119,401,7.084,447,10.088,466,8.25,529,8.951,536,5.423,549,8.312,560,8.375,614,6.84,869,10.371,884,9.211,958,7.315,986,10.873,996,7.159,1014,13.84,1077,8.951,1196,10.371,1233,13.254,1237,11.512,1305,11.067,1420,14.624,2094,11.772,2171,15.815,2172,10.693,2173,15.815,2174,15.815,2175,11.772,2176,12.397]],["keywords/387",[]],["title/388",[191,471.331,879,610.406]],["content/388",[25,1.552,33,2.477,37,2.368,44,3.927,68,7.411,70,3.439,85,6.793,97,6.725,105,7.646,106,9.695,107,3.464,181,3.758,182,2.814,185,4.627,190,6.597,193,5.65,195,7.468,198,3.767,222,3.845,264,4.088,278,3.796,284,5.002,301,3.214,334,4.066,437,5.535,474,8.133,481,7.774,531,7.709,537,4.622,541,6.877,565,7.982,639,6.712,648,8.88,861,6.559,883,7.646,886,5.037,888,7.357,952,7.982,1015,10.757,1030,6.92,1056,8.88,1065,8.296,1151,9.118,1153,12.341,1168,9.248,1418,11.054,1643,11.402,1697,7.982,2177,14.102,2178,9.868,2179,10.757]],["keywords/388",[]],["title/389",[7,299.457,25,63.794,33,124.043,185,231.733,1501,548.009,2180,887.06]],["content/389",[]],["keywords/389",[]],["title/390",[33,202.738,1501,895.677]],["content/390",[1,3.429,4,1.268,5,1.661,6,1.834,9,3.521,19,2.307,25,0.512,33,2.924,45,2.183,46,2.491,65,2.522,67,3.096,69,2.402,86,3.109,97,4.296,98,3.296,106,5.29,113,3.579,114,5.507,151,2.374,152,2.436,161,2.431,182,1.535,189,10.3,192,2.587,198,2.056,246,2.431,273,4.424,278,2.071,293,2.154,310,3.483,378,4.623,381,3.948,395,3.235,396,2.514,432,4.044,503,10.031,514,2.758,536,2.638,539,3.579,543,2.85,551,3.502,554,3.684,557,3.057,559,7.805,573,5.29,580,3.54,630,4.498,631,8.871,639,3.662,642,3.447,715,5.728,716,2.778,737,2.587,745,4.206,856,4.975,857,3.957,907,4.729,936,3.825,942,7.352,950,5.122,954,8.005,963,2.972,991,4.242,1082,5.122,1111,5.29,1147,4.242,1171,5.29,1183,6.745,1196,5.046,1207,4.438,1219,3.707,1294,6.449,1327,8.128,1356,7.805,1365,5.601,1479,4.316,1501,13.753,1589,5.728,1663,4.278,1749,5.87,1822,9.107,1823,6.032,1989,5.728,2025,6.221,2075,5.87,2104,6.449,2142,7.116,2165,10.299,2181,6.734,2182,10.708,2183,5.601,2184,6.449,2185,7.695,2186,7.116,2187,7.116,2188,7.116,2189,7.116,2190,7.116,2191,12.236,2192,6.221,2193,7.695,2194,6.221,2195,7.695,2196,7.116,2197,6.032,2198,7.116,2199,7.695,2200,7.695,2201,7.695,2202,7.695,2203,5.046,2204,7.695,2205,7.695,2206,5.728,2207,7.116,2208,7.695,2209,7.116,2210,7.116]],["keywords/390",[]],["title/391",[51,284.834,185,287.538,503,630.307,1631,673.714]],["content/391",[4,1.092,5,2.275,6,1.02,12,3.674,22,2.765,23,3.78,32,3.921,33,1.362,34,3.566,40,4.022,44,2.934,51,2.521,65,3.453,68,5.537,97,3.699,105,5.712,107,3.826,124,3.946,151,5.716,161,4.92,167,4.579,176,3.845,185,3.762,198,2.814,223,5.418,271,3.737,330,2.533,373,4.017,389,5.418,394,5.343,396,3.442,424,6.812,492,7.124,496,4.257,503,11.567,631,9.071,660,5.91,688,6.401,697,6.721,716,3.804,811,7.842,857,8.009,888,5.496,954,11.48,1183,5.808,1219,5.075,1479,5.91,1501,8.897,1540,6.553,1649,8.259,1746,8.259,1989,7.842,2180,9.743,2183,11.337,2184,13.053,2196,9.743,2211,9.22,2212,10.536,2213,14.402,2214,13.63,2215,13.053,2216,6.812,2217,10.536,2218,15.575,2219,10.536,2220,9.22,2221,10.536,2222,8.518,2223,10.536,2224,10.536,2225,10.536,2226,8.259,2227,9.22]],["keywords/391",[]],["title/392",[5,292.154,25,89.993,503,716.592]],["content/392",[4,1.306,5,3.69,6,0.947,7,1.012,9,1.483,12,5.137,14,1.218,19,1.753,20,1.452,22,2.566,23,4.157,24,2.018,25,0.65,32,4.083,33,1.033,34,4.417,35,0.929,36,1.691,37,1.341,44,2.224,45,0.919,46,1.049,49,1.525,51,1.912,63,1.752,65,1.062,69,1.012,107,0.796,108,1.691,111,1.223,113,1.508,121,1.947,151,1,152,3.108,154,1.191,155,1.743,158,2.041,161,1.024,162,2.824,164,4.626,167,4.25,171,1.527,173,1.927,185,0.783,190,1.516,191,2.402,196,1.009,198,1.562,201,1.252,222,0.884,224,3.426,230,1.024,246,3.089,264,1.695,271,2.074,275,2.66,281,1.257,289,3.716,291,1.552,293,0.907,301,0.739,308,1.049,311,1.388,334,2.303,355,1.277,362,2.191,364,1.757,371,1.691,373,3.251,381,1.046,396,2.61,405,1.667,408,1.072,414,1.267,419,3.553,425,1.166,503,11.512,512,1.327,513,5.813,531,3.196,539,1.508,543,1.2,551,1.475,563,1.388,572,2.089,590,1.382,596,2.268,630,5.05,631,5.695,639,1.543,668,1.679,695,1.601,711,1.375,716,2.111,718,1.315,737,1.966,758,4.887,765,3.205,770,2.888,771,7.102,772,2.426,773,4.453,774,3.196,776,2.783,777,1.444,780,3.096,806,3.848,857,1.667,886,1.158,888,4.168,907,1.992,910,1.304,936,1.611,942,1.947,954,1.703,958,2.705,963,1.252,994,1.743,1028,4.607,1077,5.535,1125,6.843,1141,3.835,1157,1.927,1164,1.992,1173,1.927,1183,1.787,1191,2.068,1193,2.472,1219,1.561,1220,1.852,1242,2.541,1309,4.601,1313,1.927,1320,1.743,1339,2.619,1354,3.553,1356,8.764,1359,2.472,1399,2.541,1403,2.312,1479,3.28,1501,5.587,1526,4.367,1614,1.655,1617,1.691,1631,5.535,1663,1.802,1713,6.126,1726,1.743,1783,2.228,1852,2.716,2037,2.997,2072,2.836,2079,1.852,2183,4.257,2203,3.835,2216,8.15,2228,4.46,2229,3.241,2230,3.241,2231,3.241,2232,3.241,2233,3.241,2234,3.241,2235,3.241,2236,2.716,2237,7.989,2238,3.241,2239,2.359,2240,2.997,2241,2.472,2242,2.541,2243,2.716,2244,5.407,2245,4.46,2246,2.997,2247,3.241,2248,3.241,2249,2.541,2250,4.584,2251,2.997,2252,3.553,2253,6.501,2254,4.522,2255,2.312,2256,3.241,2257,3.241,2258,3.241,2259,2.836,2260,3.241,2261,3.241,2262,3.241,2263,3.241,2264,2.997,2265,3.241,2266,2.997,2267,5.847,2268,5.847,2269,3.241,2270,3.241,2271,5.847,2272,3.241,2273,3.241,2274,3.241,2275,3.241,2276,3.241,2277,3.241,2278,3.241,2279,3.241,2280,5.847,2281,3.892,2282,3.241,2283,3.241,2284,2.716,2285,5.847,2286,2.62,2287,2.997]],["keywords/392",[]],["title/393",[86,480.967,1501,679.981,2288,804.809,2289,885.975]],["content/393",[4,1.103,5,2.298,16,5.473,22,2.793,23,3.135,25,1.044,32,2.252,33,1.376,63,2.334,65,3.488,69,3.323,86,7.532,92,4.538,105,5.771,106,7.317,122,4.672,151,3.284,161,3.362,182,2.124,186,3.146,189,9.517,191,3.2,204,8.82,219,5.833,222,2.902,232,6.327,264,3.086,273,3.441,293,2.979,341,6.327,398,3.986,407,5.19,421,5.512,426,6.62,503,9.87,514,3.815,539,4.951,543,3.942,551,4.843,554,5.096,562,6.138,592,6.467,630,3.913,642,4.767,648,6.702,716,6.729,736,3.986,901,8.373,936,7.8,942,6.395,982,5.68,1033,7.748,1074,5.818,1110,6.08,1219,5.127,1327,5.68,1501,13.11,1697,6.024,1705,8.605,1981,7.084,2288,7.197,2289,16.327,2290,18.639,2291,10.644,2292,10.644,2293,10.644,2294,10.644,2295,9.314,2296,9.314,2297,10.644,2298,10.644,2299,10.644,2300,10.644]],["keywords/393",[]],["title/394",[33,124.043,49,451.293,1327,511.905,1501,548.009,1651,553.247,2060,731.722]],["content/394",[5,2.789,12,4.505,19,2.471,20,3.692,22,3.39,23,3.674,32,4.144,34,2.958,46,2.668,49,3.878,68,6.789,70,2.01,86,3.331,107,3.173,114,4.631,151,2.543,152,4.324,155,2.457,156,4.365,161,2.604,162,2.914,164,2.589,173,4.9,186,2.436,189,9.208,191,2.478,193,3.303,219,3.064,234,3.813,273,3.494,301,1.879,341,9.47,371,4.3,373,3.332,388,4.624,398,3.087,405,6.643,481,4.544,503,11.001,520,5.847,533,4.666,543,3.053,592,7.849,597,6.461,631,7.524,642,5.787,673,4.3,689,7.062,754,6.461,764,4.506,806,3.971,861,3.834,888,4.3,898,5.667,901,3.147,902,4.709,911,5.258,926,4.209,982,4.399,1007,6.789,1058,4.269,1164,5.066,1219,3.971,1327,4.399,1333,6.136,1391,6.664,1399,6.461,1501,4.709,1602,5.008,1606,5.667,1737,7.214,1931,5.191,2060,6.288,2063,6.908,2126,5.487,2250,6.461,2288,8.735,2289,11.858,2295,7.214,2296,7.214,2301,5.258,2302,7.214,2303,4.433,2304,6,2305,8.243,2306,8.243,2307,8.243,2308,5.191,2309,8.243,2310,8.243,2311,7.622,2312,8.243,2313,8.243,2314,8.243,2315,8.243,2316,8.243,2317,8.243,2318,8.243,2319,8.243,2320,8.243,2321,10.032,2322,7.214,2323,7.622,2324,8.243,2325,7.622,2326,8.243,2327,8.243,2328,8.243,2329,7.622]],["keywords/394",[]],["title/395",[60,444.09,62,509.904,63,261.029,503,630.307]],["content/395",[5,3.173,6,1.423,33,1.901,37,2.468,44,4.093,60,8.289,61,7.906,121,8.832,152,3.922,186,4.345,188,8.245,222,5.371,246,4.644,273,4.32,322,5.404,341,8.738,381,4.743,396,6.436,409,9.376,428,7.906,440,6.799,503,10.431,520,6.653,557,5.84,558,11.522,693,6.584,695,7.259,714,9.784,736,5.505,737,4.942,894,5.633,926,7.506,931,8.738,963,5.677,990,11.522,991,8.103,1219,7.08,1220,8.397,1235,11.884,1501,8.397,2330,11.884,2331,11.884,2332,14.699,2333,14.699]],["keywords/395",[]],["title/396",[60,504.882,901,516.562,1501,773.065]],["content/396",[4,1.758,5,3.203,6,1.148,7,2.308,16,6.095,19,2.217,20,3.312,33,0.956,46,2.394,52,2.037,54,3.214,60,8.327,63,2.599,65,2.424,69,2.308,76,4.396,85,3.562,88,4.064,94,7.372,97,4.161,107,1.816,154,2.718,171,1.931,182,1.475,185,3.583,189,8.664,201,2.856,219,2.749,222,2.016,227,3.802,273,1.622,293,2.07,310,3.347,314,2.623,349,4.781,375,6.183,391,3.724,396,3.873,398,4.439,400,5.337,405,3.802,466,3.858,472,12.982,482,6.479,503,8.985,512,4.852,514,2.651,519,3.977,527,6.095,531,4.042,551,3.365,554,3.54,557,4.71,627,5.796,656,4.396,693,3.312,695,3.652,716,2.67,718,3.001,761,5.383,771,2.963,785,3.615,792,4.265,863,6.836,894,4.542,895,6.197,901,4.525,907,4.544,943,3.886,944,4.148,954,3.886,963,5.73,1030,5.816,1164,4.544,1166,4.849,1169,3.383,1207,4.265,1219,5.709,1320,7.979,1327,7.916,1341,15.015,1356,9.463,1378,4.599,1435,5.504,1501,9.693,1558,4.544,1571,5,1610,7.372,1646,4.922,1688,6.838,1737,10.373,1975,10.373,1989,5.504,2007,6.471,2181,6.471,2192,5.978,2209,10.96,2210,10.96,2288,5,2289,14.752,2330,5.978,2334,11.628,2335,11.853,2336,5.978,2337,7.395,2338,7.395,2339,6.838,2340,7.395,2341,7.395,2342,11.853,2343,7.395,2344,5.978,2345,7.395,2346,7.395,2347,7.395,2348,7.395,2349,7.395,2350,7.395,2351,6.838]],["keywords/396",[]],["title/397",[5,256.976,25,79.157,60,444.09,503,630.307]],["content/397",[5,3.057,19,2.07,22,1.812,23,4.201,25,0.459,32,4.284,33,0.893,34,3.733,60,8.134,88,2.367,152,1.375,155,3.343,162,2.441,164,4.447,167,3.001,171,1.803,201,2.667,219,2.566,252,2.677,291,3.306,298,3.388,341,4.104,503,10.173,514,2.475,557,5.627,580,3.176,630,2.538,716,2.493,737,6.029,758,2.986,765,4.642,771,2.766,773,5.581,774,3.774,775,3.306,806,3.326,829,10.37,894,2.646,901,2.636,1033,5.026,1111,4.747,1114,3.525,1140,5.139,1147,3.806,1148,4.831,1219,3.326,1276,3.656,1280,11.101,1309,5.276,1320,3.713,1341,9.067,1501,6.407,1526,6.131,1711,4.528,1970,4.924,2118,4.668,2216,4.464,2236,5.786,2244,6.384,2246,6.384,2249,5.412,2288,9.575,2289,12.136,2295,6.042,2296,6.042,2330,5.582,2352,6.042,2353,4.924,2354,5.786,2355,6.904,2356,5.582,2357,19.21,2358,5.582,2359,5.582,2360,13.182,2361,5.786,2362,5.582,2363,5.786,2364,5.786,2365,11.215,2366,6.384,2367,6.384,2368,6.384,2369,14.162,2370,14.162,2371,14.162,2372,14.162,2373,14.162,2374,6.042,2375,6.904,2376,5.139,2377,5.026,2378,6.042,2379,6.904,2380,6.904,2381,5.026,2382,6.384,2383,9.399,2384,6.904,2385,6.904,2386,6.384,2387,6.904,2388,6.904]],["keywords/397",[]],["title/398",[33,137.374,60,396.364,936,528.056,1327,566.919,1501,606.904]],["content/398",[4,0.486,5,1.752,6,0.455,9,2.148,23,4.222,32,4.655,33,0.607,34,3.299,37,0.788,40,1.792,49,2.209,60,6.67,61,2.525,63,2.35,65,1.539,67,1.889,69,1.466,79,2.486,103,2.092,107,1.993,108,2.449,122,2.061,134,2.657,151,2.503,155,1.399,161,4.031,162,4.51,164,5.876,167,3.526,171,2.119,173,2.791,185,1.134,189,4.143,193,1.881,201,1.813,204,2.221,219,1.745,222,1.28,228,2.05,246,1.483,273,2.798,291,2.248,298,5.258,341,9.374,389,2.414,396,1.534,398,1.758,405,2.414,407,2.289,452,2.172,458,2.184,490,1.865,503,9.908,514,1.683,519,7.75,520,3.672,543,5.336,557,3.224,590,2.002,600,4.364,660,2.633,674,3.924,694,5.326,703,3.997,716,1.695,758,2.031,775,2.248,804,5.192,805,7.026,806,5.161,818,6.039,894,1.799,901,5.5,926,2.397,937,2.05,950,3.125,963,1.813,1219,5.161,1224,2.734,1327,7.689,1501,7.289,1526,4.435,1631,2.657,1651,2.708,1931,2.956,1961,4.823,1969,3.68,1993,3.174,2060,3.581,2079,2.682,2161,3.581,2288,3.174,2289,11.737,2311,7.503,2352,9.376,2383,13.215,2389,3.935,2390,4.108,2391,4.695,2392,11.799,2393,8.114,2394,10.714,2395,8.114,2396,6.8,2397,10.714,2398,8.114,2399,12.759,2400,4.695,2401,4.695,2402,10.714,2403,12.759,2404,4.341,2405,4.695,2406,10.714,2407,4.695,2408,8.114,2409,8.114,2410,8.114,2411,8.114,2412,8.114,2413,8.114,2414,14.409,2415,11.799,2416,4.695,2417,4.695,2418,4.341,2419,4.695,2420,4.341,2421,3.494,2422,3.796,2423,4.695,2424,3.796,2425,4.695,2426,4.108]],["keywords/398",[]],["title/399",[63,343.83,2427,1195.939]],["content/399",[4,1.369,12,4.605,20,5.916,30,6.214,33,1.708,63,4.978,65,4.329,70,4.466,97,4.637,107,4.498,152,2.63,185,4.424,186,3.904,187,8.117,206,4.702,222,4.994,240,4.089,264,5.309,373,3.406,375,6.89,419,8.025,462,5.248,474,7.617,512,5.407,569,6.481,663,11.588,785,4.028,864,8.662,888,6.89,902,7.545,912,6.89,1007,6.942,1081,8.117,1109,6.84,1164,8.117,1207,10.562,1238,9.243,1595,8.215,1634,13.061,1872,7.104,1977,12.214,2045,11.069,2102,10.679,2178,9.243,2284,15.348,2427,10.075,2428,15.348,2429,9.42,2430,11.069,2431,10.075,2432,13.208,2433,13.208]],["keywords/399",[]],["title/400",[63,296.762,273,296.762,901,516.562]],["content/400",[4,1.73,23,2.983,25,0.771,33,1.499,44,4.65,52,3.194,60,8.469,61,6.234,62,4.965,63,3.662,67,4.664,86,6.747,103,5.165,149,4.808,189,8.526,192,3.897,206,4.126,240,2.588,272,4.942,273,4.978,278,3.12,297,3.288,301,3.806,341,11.635,381,3.74,402,6.685,420,7.042,482,6.336,519,8.981,520,5.247,543,6.184,551,5.275,674,4.245,699,7.494,704,6.092,713,7.494,785,3.535,792,6.685,806,5.583,888,6.047,901,7.472,918,6.561,963,4.477,1030,8.194,1081,7.124,1134,6.561,1501,6.622,1602,10.145,2060,8.842,2321,7.299,2323,15.441,2383,9.714,2404,10.719,2434,11.591,2435,11.591,2436,10.144,2437,11.591,2438,11.591,2439,16.699,2440,11.591,2441,10.719,2442,11.591,2443,9.086]],["keywords/400",[]],["title/401",[63,343.83,954,824]],["content/401",[4,1.024,12,3.447,35,2.835,63,3.257,67,3.978,114,5.767,125,3.912,188,5.545,219,3.675,222,2.696,301,4.066,322,3.634,334,2.85,424,6.392,503,11.827,527,5.083,531,5.404,540,7.358,554,4.733,693,7.991,696,6.148,736,3.702,888,5.157,898,10.211,902,5.648,918,5.596,954,12.526,958,8.252,1000,5.317,1110,5.648,1134,5.596,1183,5.45,1501,8.485,1511,7.196,1713,5.36,2114,6.483,2184,8.285,2211,8.651,2214,8.651,2215,17.82,2222,7.993,2288,6.684,2325,9.142,2421,7.358,2427,7.541,2444,6.006,2445,8.651,2446,9.886,2447,9.886,2448,14.853,2449,9.142,2450,9.886,2451,9.886,2452,9.886,2453,9.886,2454,9.886,2455,9.886,2456,19.836,2457,9.886,2458,17.841,2459,7.993,2460,9.886,2461,17.841,2462,9.886,2463,9.886,2464,9.886,2465,9.886,2466,9.886,2467,8.285,2468,14.853,2469,9.886,2470,17.841,2471,14.853,2472,9.886,2473,9.886,2474,9.886,2475,9.886,2476,9.886,2477,9.886,2478,9.886]],["keywords/401",[]],["title/402",[63,296.762,514,485.1,866,796.106]],["content/402",[4,2.043,5,2.109,6,0.946,9,6.735,12,2.036,16,3.003,19,3.775,25,0.65,33,0.755,35,1.675,37,2.75,45,3.572,49,2.747,52,1.609,60,4.698,62,4.185,63,4.324,65,4.127,69,1.823,86,5.088,92,2.49,103,7.3,105,3.166,106,4.015,107,1.434,118,4.894,136,5.634,152,2.507,171,2.551,185,1.411,186,2.887,187,3.589,201,2.256,206,2.079,222,3.434,246,1.845,256,2.747,273,3.884,341,3.471,378,3.509,382,3.003,391,2.941,397,3.725,398,3.658,407,2.848,408,3.232,439,4.087,442,7.111,460,4.454,493,3.632,503,10.85,512,8.387,514,5.277,516,3.003,520,6.663,540,4.347,543,6.066,557,6.509,568,3.436,577,3.632,643,4.165,673,3.046,674,3.578,694,2.903,703,2.179,718,2.37,775,2.796,785,2.979,857,3.003,874,2.589,890,4.165,894,3.743,912,3.046,921,3.024,926,2.982,936,2.903,942,3.509,944,5.479,954,9.883,955,10.216,1029,7.111,1086,3.776,1119,3.368,1169,2.672,1219,6.066,1254,6.605,1300,2.686,1314,4.165,1320,3.141,1325,3.776,1327,10.035,1398,3.677,1501,9.358,1526,3.192,1571,6.605,1651,3.368,1663,3.247,1697,3.305,1713,3.166,1765,3.725,1825,10.181,1843,3.725,1869,4.347,2161,4.454,2181,5.11,2183,4.251,2184,4.894,2187,9.033,2188,9.033,2189,5.4,2190,5.4,2211,5.11,2213,5.4,2214,5.11,2215,4.894,2226,4.578,2253,2.763,2288,6.605,2289,7.271,2303,3.141,2321,3.677,2352,12.882,2392,5.4,2415,5.4,2418,5.4,2426,5.11,2479,5.84,2480,5.4,2481,5.84,2482,4.894,2483,4.578,2484,5.84,2485,5.84,2486,5.4,2487,9.769,2488,4.251,2489,7.111,2490,5.84,2491,9.769,2492,3.548]],["keywords/402",[]],["title/403",[6,115.243,330,286.181,435,544.573,2493,1190.303]],["content/403",[4,1.086,5,3.35,6,1.502,23,4.211,25,1.032,32,3.284,34,3.553,45,2.974,60,5.789,70,2.557,125,4.148,161,3.312,162,5.485,164,3.292,174,6.231,176,3.826,192,3.524,198,2.8,227,5.39,249,5.933,264,3.039,271,6.553,330,3.731,366,5.049,373,2.704,435,9.342,503,10.813,536,3.594,545,5.117,557,4.165,590,4.47,600,5.638,673,8.095,745,5.73,765,7.144,886,3.745,954,5.509,1111,7.207,1204,5.39,1280,8.217,1300,8.498,1309,7.3,1501,5.989,2062,6.978,2227,9.174,2358,8.475,2359,8.475,2362,8.475,2381,7.631,2382,9.694,2383,13.004,2386,9.694,2494,15.517,2495,6.601,2496,7.631,2497,10.483,2498,10.483,2499,10.483]],["keywords/403",[]],["title/404",[33,113.071,107,214.787,185,211.234,329,389.66,331,565.374,512,357.937,1501,499.534]],["content/404",[16,6.027,19,3.514,33,1.516,46,3.794,51,2.805,65,5.517,69,3.659,71,9.824,86,4.736,103,7.501,105,6.355,188,6.575,192,3.941,196,3.648,198,3.131,215,6.16,222,3.196,246,3.703,255,4.777,273,5,288,5.789,297,4.775,311,5.021,330,2.818,331,7.579,368,10.6,382,6.027,387,6.827,407,5.716,452,5.422,482,6.408,486,6.968,503,8.914,543,4.341,582,6.575,592,10.227,631,6.827,645,6.896,672,7.29,736,4.39,866,9.903,869,7.687,888,6.115,912,6.115,940,7.121,954,11.314,993,5.646,1000,6.304,1086,7.579,1109,6.071,1152,7.802,1268,6.071,1435,8.725,1501,6.696,1706,7.687,1722,8.533,1822,8.725,2222,13.61,2321,7.381,2500,18.214,2501,11.722,2502,5.826,2503,11.722,2504,16.833,2505,16.833,2506,11.722,2507,9.477,2508,9.477]],["keywords/404",[]],["title/405",[191,471.331,879,610.406]],["content/405",[4,1.967,23,2.894,25,1.667,125,7.513,366,9.145,398,7.11,523,10.212,596,13.286,885,13.821,1435,14.132,2509,18.986,2510,16.615,2511,18.986,2512,15.912,2513,18.986,2514,16.615,2515,14.132]],["keywords/405",[]],["title/406",[107,260.952,185,256.637,331,686.894,703,396.364,1228,757.671]],["content/406",[]],["keywords/406",[]],["title/407",[107,332.397,185,326.9,1237,985.073]],["content/407",[5,2.176,6,2.178,18,3.366,33,1.303,46,4.877,69,3.146,70,5.228,107,4.919,113,4.687,136,5.812,155,3.004,156,5.336,161,3.184,171,2.631,176,6.586,181,4.015,185,5.434,186,2.979,205,2.618,222,4.109,230,3.184,240,3.364,264,4.368,265,3.625,272,4.297,279,5.99,298,4.945,314,5.345,315,4.908,318,8.445,321,6.193,392,7.009,438,3.774,455,4.825,512,4.125,542,6.428,548,6.346,556,3.6,562,5.812,565,8.529,652,4.825,674,3.691,676,7.336,703,3.76,704,5.296,716,3.638,732,3.526,735,4.537,740,4.687,785,3.073,893,4.237,910,4.055,923,6.608,932,4.586,943,5.296,971,8.957,985,4.687,1022,11.811,1023,11.215,1067,6.814,1109,5.219,1142,7.336,1228,12.871,1233,8.445,1311,8.445,1339,4.514,1417,5.509,1419,7.687,1564,6.428,1595,6.267,1604,6.516,1719,7.899,1860,7.687,1961,5.99,2126,6.708,2179,7.687,2431,7.687,2516,7.501,2517,8.819,2518,10.077,2519,10.077,2520,9.319,2521,9.319]],["keywords/407",[]],["title/408",[107,292.374,185,287.538,1541,933.04,2522,1190.303]],["content/408",[0,1.65,2,1.114,4,1.12,5,1.637,6,1.605,7,2.367,9,1.392,10,3,19,0.912,25,0.202,33,1.205,37,2.664,46,0.985,51,4.257,52,2.978,53,1.285,58,3.414,60,1.135,62,1.303,63,3.115,69,1.724,70,1.849,82,3.864,84,1.624,86,1.229,87,1.919,88,1.043,97,1.068,98,5.18,103,1.356,107,4.37,109,1.967,114,1.605,121,3.318,122,1.335,124,1.139,147,1.941,149,1.262,152,1.509,154,2.787,162,3.295,175,1.892,176,2.015,181,1.471,182,0.607,185,4.298,186,1.632,191,1.66,192,3.133,196,0.947,199,2.644,200,5.3,201,2.133,202,0.936,204,1.44,205,4.123,206,1.966,217,1.087,222,2.067,227,1.564,228,1.329,230,0.961,240,1.233,246,2.944,248,2.994,252,1.18,256,2.598,264,3.133,265,1.986,269,2.55,271,1.079,272,1.297,273,1.211,275,1.013,278,1.486,287,3.768,288,1.502,289,1.415,291,1.457,293,1.546,297,0.863,301,0.693,304,2.781,308,3.498,315,0.991,322,1.118,329,2.461,331,1.967,347,1.4,356,1.415,359,2.215,371,3.955,373,1.955,381,0.982,385,2.777,387,1.772,389,3.899,392,1.415,393,1.636,395,3.188,396,3.045,398,1.139,402,1.755,404,2.321,405,2.839,407,1.484,413,2.86,416,2.025,424,3.57,427,1.118,438,2.068,442,4.02,443,6.635,447,1.941,452,2.554,465,4.11,467,1.075,482,1.663,484,3.097,489,2.265,490,1.209,491,2.215,492,5.126,493,1.892,496,3.766,498,3.434,510,1.543,512,1.245,514,1.091,524,3.621,531,1.663,537,0.997,539,2.568,541,1.484,543,1.127,551,1.384,556,1.973,561,2.598,563,2.366,579,6.026,589,2.129,607,1.65,613,1.072,636,1.663,638,1.755,645,1.79,659,1.4,660,3.097,672,5.796,673,1.587,674,1.114,675,4.335,685,4.02,692,1.553,693,3.396,694,1.512,695,2.727,696,1.892,699,1.967,703,5.627,704,1.599,708,4.774,711,2.343,716,1.994,717,2.644,718,1.235,719,5.212,727,2.129,740,1.415,761,2.215,775,1.457,785,0.928,792,1.755,827,1.87,855,1.808,861,1.415,864,4.972,870,4.329,873,1.828,874,4.791,886,1.087,887,1.772,888,1.587,892,1.87,893,2.322,912,2.881,918,1.722,920,1.611,921,1.576,931,1.808,932,1.384,940,1.848,941,2.265,943,1.599,944,1.707,958,1.407,982,1.624,1000,1.636,1006,1.848,1011,6.302,1012,6.407,1027,2.55,1030,1.493,1049,1.87,1057,2.46,1066,1.624,1119,1.755,1157,1.808,1160,1.543,1166,1.995,1167,2.092,1183,1.677,1193,2.321,1220,1.738,1227,1.995,1315,3.477,1320,2.97,1322,2.46,1323,2.385,1327,4.046,1329,2.8,1339,2.473,1384,2.092,1411,2.662,1413,2.55,1422,2.129,1427,4.046,1501,1.738,1526,1.663,1562,2.215,1602,3.355,1605,2.55,1608,4.329,1614,1.553,1617,1.587,1630,2.662,1703,4.02,1706,1.995,1707,3.938,1708,2.092,1713,5.053,1716,2.17,1721,2.55,1722,2.215,1726,1.636,1741,2.55,1744,2.813,1755,4.212,1766,2.025,1823,2.385,1843,1.941,1869,2.265,1933,2.385,1935,2.385,1969,2.385,2005,2.813,2022,2.55,2070,2.46,2118,2.057,2125,2.46,2126,2.025,2146,4.02,2172,3.734,2243,2.55,2253,2.613,2254,1.722,2281,2.025,2286,2.46,2321,1.916,2329,5.106,2331,2.46,2431,2.321,2444,1.848,2467,2.55,2483,2.385,2489,4.02,2500,2.813,2502,1.512,2523,3.042,2524,2.662,2525,4.832,2526,3.042,2527,2.813,2528,3.042,2529,5.522,2530,2.813,2531,4.832,2532,4.628,2533,2.662,2534,4.628,2535,2.813,2536,3.042,2537,2.813,2538,5.522,2539,2.55,2540,3.042,2541,2.321,2542,2.215,2543,3.042,2544,2.662,2545,3.042,2546,2.662,2547,3.042,2548,2.813,2549,3.042,2550,5.106,2551,2.813,2552,2.46,2553,3.042,2554,2.813,2555,2.662,2556,3.042,2557,3.042,2558,3.042,2559,3.042,2560,3.621,2561,3.042,2562,3.042,2563,3.042,2564,3.042,2565,3.042,2566,3.042,2567,4.628,2568,2.129,2569,3.042,2570,3.042,2571,3.042,2572,2.46,2573,3.042,2574,2.662,2575,3.042,2576,3.042,2577,2.662,2578,3.042,2579,3.042]],["keywords/408",[]],["title/409",[107,292.374,185,287.538,264,345.078,2301,759.279]],["content/409",[4,1.773,70,4.174,107,4.204,185,4.134,186,5.059,196,5.327,202,5.265,222,5.932,264,6.307,279,10.173,287,8.507,329,7.627,334,4.935,727,11.976,886,6.114,894,6.558,963,6.61,984,10.518,994,9.205,1192,10.644,1237,12.458,2301,10.917,2580,17.115,2581,17.115,2582,17.115,2583,13.416,2584,17.115,2585,17.115,2586,14.343]],["keywords/409",[]],["title/410",[70,330.023,401,606.144,893,568.994]],["content/410",[4,0.665,5,2.28,6,2.056,9,2.935,14,2.412,18,2.143,22,1.684,33,1.366,37,1.077,40,4.031,44,4.344,46,2.077,51,1.535,54,4.59,61,3.45,63,1.407,70,4.525,87,2.229,107,3.832,147,4.092,149,2.661,152,1.277,155,3.148,162,2.268,176,3.854,177,3.299,180,4.858,181,2.814,182,1.28,183,2.021,184,1.391,185,5.413,191,1.929,192,3.551,199,3.072,205,3.497,206,3.759,207,3.536,220,2.268,240,4.143,243,2.951,256,3.018,264,5.941,272,2.735,273,1.407,281,2.488,285,7.26,293,1.796,299,3.99,301,2.407,314,3.746,315,4.384,321,3.943,322,2.358,329,2.859,330,3.751,347,2.951,373,1.654,381,2.07,385,2.35,388,3.598,392,2.984,395,2.697,401,2.874,402,3.7,410,4.148,439,4.489,452,4.885,455,3.072,480,3.799,490,2.549,512,2.626,520,2.904,537,3.461,539,2.984,543,2.376,544,2.393,545,3.728,550,3.631,559,4.092,632,6.213,636,3.507,638,3.7,645,3.774,652,5.057,663,3.536,675,4.912,692,3.276,696,3.99,701,3.99,703,2.393,704,5.55,706,3.276,708,4.04,709,3.943,710,5.376,713,4.148,717,3.072,718,2.603,735,2.889,751,3.943,762,4.775,785,1.956,863,3.7,892,3.943,906,3.478,910,4.249,920,3.397,957,6.416,971,6.278,991,3.536,1011,4.338,1012,4.41,1023,4.775,1055,3.189,1058,3.322,1176,3.665,1177,3.943,1322,5.187,1330,5.029,1419,4.893,1476,5.932,1564,4.092,1603,4.893,1624,5.614,1652,5.614,1798,5.376,1846,4.67,2057,4.41,2062,4.27,2070,5.187,2126,4.27,2152,4.893,2172,4.338,2179,4.893,2301,6.737,2302,5.614,2583,5.029,2587,9.766,2588,4.67,2589,3.943,2590,5.614,2591,6.415,2592,5.932,2593,6.415,2594,6.415,2595,6.415,2596,5.932,2597,6.415,2598,4.893,2599,6.415,2600,5.932,2601,6.415,2602,5.614,2603,5.614,2604,6.415,2605,5.932,2606,5.614,2607,6.415]],["keywords/410",[]],["title/411",[196,421.191,401,606.144,893,568.994]],["content/411",[0,1.65,2,1.114,4,0.966,5,1.192,6,1.94,9,1.392,15,1.772,18,5.537,19,1.655,25,0.202,33,1.837,37,0.511,44,2.111,46,1.787,49,2.598,51,0.728,52,0.838,53,1.285,54,2.4,61,1.636,62,2.366,69,2.367,70,3.678,79,1.611,83,2.215,86,1.229,87,1.057,88,3.196,92,1.297,96,3.125,97,1.939,107,3.705,110,1.342,111,1.148,116,1.256,122,1.335,125,1.204,144,1.87,149,3.145,152,0.606,154,1.118,166,2.994,171,0.794,176,4.413,177,1.564,181,2.879,183,1.739,184,0.66,185,4.65,186,1.632,189,1.553,191,0.915,192,1.023,196,2.901,197,2.17,198,1.475,200,1.135,201,2.928,202,0.936,203,1.543,205,2.422,207,1.677,215,2.902,218,2.321,220,3.295,222,3.297,230,0.961,240,3.172,241,2.818,243,4.287,246,3.414,250,1.624,252,3.614,262,1.624,264,4.118,265,1.094,272,1.297,273,3.48,278,2.041,281,6.153,284,2.689,287,1.512,293,0.852,296,2.265,301,2.463,304,1.532,307,1.755,308,0.985,310,2.499,311,3.248,314,1.079,315,5.168,319,2.461,322,1.118,330,4.278,334,0.877,351,2.385,355,3.673,360,1.738,364,1.65,366,3.652,373,1.955,378,1.828,379,3.469,381,2.447,385,2.023,391,1.532,395,3.188,396,0.994,400,1.37,401,1.363,402,1.755,405,2.839,409,1.941,413,1.576,425,2.727,432,2.902,452,1.407,454,4.902,466,2.881,473,4.11,477,3.216,478,3.434,490,2.194,496,2.231,508,1.916,512,1.245,513,1.808,514,1.091,527,3.899,533,1.722,537,1.81,538,2.745,542,1.941,543,3.451,544,4.032,545,3.349,552,1.599,559,1.941,563,1.303,564,2.554,565,1.722,568,3.249,569,2.71,573,2.092,579,1.967,584,2.057,589,2.129,591,2.813,592,1.848,607,2.994,611,1.916,613,1.945,625,2.321,630,1.118,632,1.79,636,1.663,638,3.185,645,1.79,652,2.644,660,1.707,664,1.522,667,2.321,668,1.576,669,2.662,674,1.114,675,1.415,693,1.363,697,1.941,706,1.553,711,2.343,716,4.771,718,4.907,732,1.932,735,1.37,736,2.839,740,1.415,762,2.265,785,1.684,786,1.303,792,1.755,809,1.502,858,1.532,861,1.415,862,1.916,866,1.79,876,3.434,878,1.995,888,1.587,891,1.677,892,1.87,893,1.279,905,1.808,908,2.46,909,2.385,910,1.224,912,1.587,918,1.722,947,2.092,955,3.185,956,1.916,963,1.175,971,1.808,973,2.97,981,1.738,982,1.624,984,1.87,985,1.415,991,1.677,1007,5.679,1011,2.057,1012,2.092,1017,2.265,1030,1.493,1042,3.57,1058,1.576,1064,2.129,1066,2.947,1072,2.129,1075,2.265,1081,1.87,1108,2.057,1112,1.808,1115,2.215,1127,1.916,1142,2.215,1156,2.321,1157,1.808,1168,1.995,1169,1.392,1170,1.553,1174,1.848,1175,1.916,1199,2.385,1204,2.839,1219,1.465,1220,1.738,1237,2.215,1268,1.576,1272,2.215,1310,3.216,1339,1.363,1360,3.434,1395,2.265,1398,1.916,1444,1.44,1522,2.813,1562,2.215,1579,2.46,1595,1.892,1603,2.321,1606,2.092,1644,2.813,1710,2.321,1755,2.321,1779,2.092,1798,2.55,1821,2.025,1826,2.321,1850,2.17,1858,4.329,1860,2.321,1872,1.636,1902,1.87,1927,2.215,1934,2.813,1967,2.385,1970,2.17,1984,1.941,1985,2.662,2018,2.385,2060,2.321,2109,2.813,2138,2.662,2152,2.321,2281,2.025,2516,2.265,2517,2.662,2533,2.662,2552,2.46,2560,1.995,2572,2.46,2606,2.662,2608,5.106,2609,3.042,2610,2.662,2611,3.042,2612,2.17,2613,3.042,2614,3.042,2615,3.042,2616,2.662,2617,4.329,2618,3.042,2619,3.042,2620,3.042,2621,3.042,2622,3.042,2623,3.042,2624,2.321,2625,2.321,2626,2.662,2627,3.042,2628,2.321,2629,3.042,2630,3.042,2631,2.662,2632,3.042,2633,3.042,2634,3.042,2635,3.042,2636,3.042,2637,3.042,2638,2.321,2639,2.55,2640,3.042,2641,3.042,2642,2.46,2643,3.042,2644,3.042,2645,2.662,2646,3.042]],["keywords/411",[]],["title/412",[107,292.374,185,287.538,703,444.09,1164,731.52]],["content/412",[2,0.898,4,1.535,5,0.979,6,2.01,7,0.399,9,2.074,10,0.506,11,0.839,12,0.446,14,0.922,18,0.819,19,2.57,20,1.099,22,0.928,23,2.837,25,0.163,30,1.154,32,0.271,33,1.551,37,1.321,40,2.719,44,4.028,46,1.144,49,2.568,51,1.704,52,0.974,60,0.915,61,1.319,62,0.548,63,1.197,64,0.865,65,1.158,67,1.422,69,1.103,70,3.528,71,1.072,78,1.072,79,0.677,84,0.683,85,0.616,87,0.852,88,1.872,92,0.545,94,0.795,97,0.449,100,0.908,105,0.693,107,3.872,108,0.667,110,3.142,111,1.711,113,0.595,114,1.027,121,1.474,124,0.479,125,0.506,136,2.038,148,0.738,149,0.531,151,0.757,152,1.418,155,1.053,156,1.299,158,0.805,161,1.116,162,0.452,164,0.77,167,1.066,171,0.641,173,0.76,176,3.129,177,1.261,179,1.219,181,2.624,182,0.255,184,1.707,185,4.496,186,1.34,188,1.376,189,0.653,191,1.363,192,2.882,193,0.512,194,0.745,196,2.45,197,0.912,198,0.944,199,1.174,200,0.915,201,2.109,202,0.393,204,3.37,205,4.314,206,3.506,207,3.484,208,1.341,215,1.289,220,1.93,222,1.723,224,0.388,225,5.055,226,2.315,227,2.331,228,0.559,229,1.376,230,2.25,231,2.521,234,1.135,236,2.43,237,2.318,239,0.653,240,3.52,241,2.349,242,0.705,243,1.626,246,1.997,248,1.33,252,0.951,255,1,256,0.602,262,1.309,263,1.034,264,4.655,265,0.46,271,1.254,273,1.88,277,2.038,278,2.308,285,0.879,289,0.595,292,1.003,293,0.687,297,1.003,298,1.734,301,1.244,304,3.587,306,0.912,311,0.548,315,5.036,319,2.02,322,3.393,325,0.895,329,2.02,330,1.892,334,2.054,347,1.128,351,1.003,355,2.807,357,0.912,359,3.3,360,0.731,366,0.616,372,0.827,373,1.169,377,1.923,379,0.585,381,1.14,382,0.658,385,0.468,386,0.931,387,2.058,388,1.376,390,0.952,391,1.235,393,0.688,395,2.995,396,0.801,398,1.324,400,1.104,401,1.099,402,1.415,404,0.976,405,2.331,409,2.254,410,0.827,413,1.27,414,0.959,417,1.104,421,2.827,423,1.508,426,1.526,427,2.007,433,0.931,435,3.258,437,2.143,440,1.135,452,1.635,454,1.586,455,1.174,458,1.141,462,0.508,466,0.667,468,0.585,475,1.183,476,0.777,478,0.795,480,0.46,481,0.705,482,0.699,484,0.717,486,0.76,493,0.795,498,1.526,500,0.895,501,0.658,503,0.677,514,0.458,515,0.632,516,0.658,520,0.579,524,0.839,527,0.658,531,3.455,533,1.388,535,1.003,537,0.419,541,1.196,544,1.319,545,0.979,546,1.034,552,0.672,553,0.573,556,0.457,559,0.816,561,0.602,563,0.548,564,1.135,565,1.388,571,0.839,573,0.879,576,1.072,577,0.795,579,1.586,581,1.041,582,0.717,587,0.816,589,0.895,593,1.003,606,1.003,607,0.693,613,0.864,621,0.912,625,0.976,628,3.09,629,1.034,630,0.47,631,1.429,632,3.212,636,1.932,638,0.738,639,0.609,640,0.912,642,0.573,648,0.805,650,1.415,652,0.612,656,0.76,660,0.717,661,0.816,663,1.948,664,1.227,668,3.273,669,1.119,673,1.844,677,1.003,683,0.895,692,1.253,693,0.573,697,2.892,698,0.827,701,0.795,703,1.319,705,0.745,716,0.886,720,0.976,726,0.931,727,2.473,732,2.492,736,2.367,737,0.43,740,1.644,745,3.455,765,1.158,772,1.017,773,0.504,775,0.612,786,1.942,787,0.62,789,1.072,808,1.072,855,1.458,856,0.827,858,1.235,860,0.777,861,1.141,864,0.839,865,0.839,876,2.198,880,0.976,886,0.457,888,1.28,889,0.865,891,0.705,893,0.538,894,0.49,896,1.072,902,0.731,907,2.172,910,0.515,911,1.565,912,2.365,914,0.602,915,0.952,921,0.662,922,0.976,931,0.76,932,1.116,935,1.034,940,0.777,941,0.952,943,0.672,944,0.717,946,1.183,952,0.724,954,1.857,957,1.49,958,2.525,963,0.494,969,1.659,970,0.976,971,2.101,972,0.839,985,3.313,989,0.912,993,0.616,999,0.931,1000,1.319,1006,0.777,1010,1.034,1021,2.936,1024,1.663,1026,0.976,1027,1.072,1030,1.204,1031,0.931,1033,0.931,1039,0.976,1065,0.752,1066,0.683,1072,2.473,1074,0.699,1081,0.786,1085,1.072,1086,0.827,1102,0.952,1103,0.895,1108,0.865,1109,0.662,1112,0.76,1113,0.931,1116,1.757,1118,0.827,1123,0.952,1126,0.952,1127,0.805,1150,1.003,1151,0.827,1155,0.865,1156,0.976,1157,0.76,1160,1.244,1164,3.884,1166,1.609,1169,1.617,1174,1.49,1180,0.768,1189,1.526,1207,0.738,1220,0.731,1227,2.318,1235,1.034,1238,1.717,1261,1.565,1262,1.508,1298,0.768,1301,1.119,1304,1.072,1305,0.895,1309,1.154,1310,4.993,1315,2.225,1326,3.355,1329,2.299,1332,0.688,1333,0.952,1399,1.003,1400,0.717,1403,0.912,1408,1.119,1411,1.119,1422,0.895,1427,0.683,1438,1.034,1444,0.605,1501,0.731,1516,1.183,1536,0.895,1541,1.003,1542,1.119,1547,0.851,1551,1.983,1558,1.508,1560,1.686,1562,1.786,1563,1.072,1571,0.865,1582,1.826,1595,0.795,1606,0.879,1609,1.034,1611,0.952,1619,2.147,1623,0.865,1631,0.724,1633,1.401,1651,0.738,1656,0.851,1671,1.034,1686,1.786,1690,0.912,1695,1.119,1704,0.805,1708,0.879,1711,0.839,1713,3.427,1747,0.865,1749,0.976,1757,2.147,1779,2.43,1792,0.879,1811,0.931,1826,0.976,1827,0.717,1846,0.931,1847,1.826,1848,1.003,1850,0.912,1856,0.931,1858,1.003,1860,3.458,1863,1.003,1869,1.826,1872,1.319,1874,1.034,1890,1.923,1931,0.805,1936,1.072,1940,1.983,1965,2.473,1966,1.717,1988,1.983,1993,1.659,2000,0.952,2012,1.183,2030,1.119,2031,0.912,2043,0.931,2044,1.119,2045,1.072,2057,1.686,2065,1.034,2089,0.839,2111,1.633,2127,1.119,2130,0.839,2131,1.474,2172,0.865,2175,0.952,2176,1.003,2220,3.093,2250,1.003,2281,1.633,2284,1.072,2303,0.688,2304,0.931,2331,2.857,2334,1.003,2421,1.826,2422,1.983,2426,2.147,2431,0.976,2483,1.003,2512,1.072,2516,1.826,2525,1.119,2534,2.056,2539,1.072,2550,2.268,2560,2.973,2567,1.072,2598,1.871,2603,1.119,2608,1.183,2617,1.003,2626,1.119,2628,0.976,2647,1.279,2648,1.279,2649,1.183,2650,1.279,2651,0.931,2652,2.268,2653,1.119,2654,1.279,2655,1.279,2656,2.268,2657,1.279,2658,2.453,2659,1.279,2660,1.183,2661,1.279,2662,1.279,2663,1.279,2664,1.279,2665,1.279,2666,1.279,2667,2.056,2668,1.279,2669,0.865,2670,1.279,2671,0.839,2672,1.279,2673,2.147,2674,1.279,2675,1.183,2676,1.119,2677,0.895,2678,1.279,2679,1.279,2680,1.279,2681,1.279,2682,1.279,2683,1.119,2684,1.279,2685,1.279,2686,1.279,2687,2.268,2688,1.183,2689,1.279,2690,2.147,2691,1.183,2692,1.717,2693,0.912,2694,1.183,2695,1.183,2696,1.279,2697,2.453,2698,2.268,2699,1.279,2700,2.453,2701,1.279,2702,2.268,2703,2.453,2704,1.279,2705,1.072,2706,1.279,2707,0.976,2708,1.003,2709,1.072,2710,1.279,2711,1.279,2712,1.279,2713,1.183,2714,1.686,2715,1.183,2716,1.279,2717,0.976,2718,1.183,2719,1.072,2720,0.805,2721,2.268,2722,1.279,2723,2.268,2724,0.952,2725,1.279,2726,1.279,2727,1.279,2728,0.976,2729,1.183,2730,1.279,2731,0.976,2732,1.279,2733,0.912,2734,1.279,2735,1.279,2736,1.119,2737,1.279,2738,1.183,2739,1.183,2740,1.072,2741,1.871,2742,1.279,2743,1.279,2744,1.119,2745,1.279,2746,1.279,2747,1.183,2748,1.279,2749,1.279,2750,1.279,2751,1.003,2752,1.183,2753,1.183,2754,1.279,2755,1.279,2756,1.279,2757,1.183,2758,1.279,2759,1.279,2760,1.183,2761,1.279,2762,1.279,2763,1.279,2764,1.279,2765,1.279,2766,0.976,2767,2.268,2768,0.895,2769,0.976,2770,1.183,2771,0.976,2772,1.183,2773,1.119,2774,1.279,2775,1.183,2776,1.279,2777,1.279]],["keywords/412",[]],["title/413",[107,332.249,185,211.234,388,490.486,670,490.486,732,305.938,991,482.031]],["content/413",[86,8.116,107,4.933,177,10.328,185,4.852,407,9.794,496,8.116,586,14.95,891,11.072,1456,16.238,2651,14.62,2778,14.324,2779,12.343,2780,18.572]],["keywords/413",[]],["title/414",[181,360.573,314,480.028,581,574.278]],["content/414",[5,4.314,6,1.454,70,3.662,107,4.908,114,4.366,136,8.661,151,4.633,162,5.308,176,5.48,185,4.827,192,5.049,207,8.278,240,4.462,246,4.744,264,5.793,314,7.088,315,4.891,385,5.5,388,8.423,392,9.294,440,6.946,465,11.178,490,5.967,520,6.797,521,12.141,561,7.065,636,8.209,664,7.513,674,5.5,710,12.585,856,9.71,891,8.278,1564,9.579,1582,11.178,1617,11.715,2044,13.142,2781,11.178,2782,15.017,2783,9.124]],["keywords/414",[]],["title/415",[63,343.83,675,729.273]],["content/415",[6,1.444,18,4.98,70,3.636,107,4.885,149,6.184,176,5.441,185,3.602,240,3.329,315,4.856,321,9.163,334,4.299,385,5.461,391,7.51,392,9.25,455,7.139,484,8.363,494,11.373,544,5.563,545,4.13,569,7.316,630,5.481,674,5.461,675,6.935,708,9.389,717,9.522,785,4.547,861,6.935,866,8.771,876,9.273,893,6.269,910,5.999,923,9.777,1011,10.081,1012,10.25,1035,9.058,1079,11.373,1158,9.163,1175,9.389,1339,6.678,1617,7.778,2126,13.237,2304,10.853,2331,12.054,2624,11.373,2784,14.91]],["keywords/415",[]],["title/416",[225,485.1,226,690.985,322,497.46]],["content/416",[4,1.534,5,3.196,6,1.916,11,9.708,61,7.962,69,4.621,70,3.61,88,5.076,107,4.862,176,5.402,181,3.944,185,4.781,205,5.143,225,5.307,240,4.979,252,5.74,264,4.292,278,3.985,314,5.251,322,5.442,427,5.442,478,9.207,490,5.882,496,5.982,521,11.969,561,6.964,616,10.359,736,5.544,739,9.572,912,7.723,914,6.964,943,7.78,1236,11.604,1301,12.955,1617,10.325,1870,13.689,2539,12.407,2708,11.604,2785,13.689,2786,14.804,2787,14.804,2788,14.804,2789,14.804]],["keywords/416",[]],["title/417",[6,115.243,37,199.834,703,444.09,1022,933.04]],["content/417",[5,3.389,6,2.358,37,2.635,70,5.018,87,5.454,107,5.054,122,6.889,171,4.099,176,5.728,185,3.792,207,8.652,222,4.28,252,6.086,293,4.394,423,9.646,425,5.647,484,8.804,577,9.762,641,10.984,693,7.031,862,9.884,934,9.646,971,9.33,1007,8.249,1164,9.646,1378,9.762,1985,13.736,2111,13.694,2134,13.154,2331,12.69,2516,11.683,2673,13.736,2728,11.973,2790,15.696,2791,15.696,2792,15.696]],["keywords/417",[]],["title/418",[1110,1064.513]],["content/418",[3,5.273,4,1.188,6,1.11,21,6.611,44,3.192,67,4.613,70,4.04,107,4.778,144,10.181,181,5.183,185,4.699,195,6.07,207,6.319,222,3.126,256,5.393,264,5.639,265,4.124,301,2.613,304,5.774,306,8.176,314,4.066,388,6.43,395,4.82,401,5.135,423,10.181,452,5.303,457,7.751,478,10.303,521,9.268,532,6.676,533,6.488,536,3.931,537,3.757,541,5.59,545,3.175,551,7.538,561,7.793,564,5.303,565,6.488,615,9.607,645,6.744,650,6.611,664,5.736,692,5.854,693,5.135,732,4.011,737,3.854,785,3.496,875,6.07,894,4.393,901,4.376,910,4.613,921,5.937,937,5.007,941,8.533,957,10.064,971,6.814,985,5.332,1007,6.025,1147,6.319,1158,7.045,1227,7.518,1427,6.117,1560,7.881,1595,7.13,1623,7.751,1848,8.986,2089,7.518,2117,7.518,2179,8.744,2236,9.607,2617,8.986,2793,11.464,2794,11.464,2795,10.601,2796,11.464]],["keywords/418",[]],["title/419",[107,384.917,181,283.072,185,256.637,670,595.91]],["content/419",[0,4.172,4,1.268,5,1.661,6,1.68,30,3.62,46,2.491,63,1.687,70,1.877,87,2.674,107,5.392,114,2.237,121,4.623,151,2.374,152,1.532,176,5.559,181,5.636,182,1.535,185,4.873,191,2.313,196,2.395,198,2.056,200,2.871,201,2.972,202,2.367,205,1.999,222,2.098,225,2.758,226,3.929,241,2.86,264,3.547,265,2.768,269,6.449,272,3.281,276,7.434,284,2.73,287,3.825,297,3.471,301,2.789,304,6.163,314,4.34,315,2.506,326,6.032,371,6.383,377,6.032,385,2.818,388,4.316,392,5.691,401,3.447,425,2.768,452,3.559,480,2.768,490,3.057,497,6.734,516,3.957,537,2.522,548,4.845,553,3.447,569,3.776,573,5.29,613,2.711,615,6.449,636,4.206,645,4.527,667,5.87,676,5.601,688,4.675,697,4.909,704,4.044,706,3.929,707,5.203,718,3.123,740,3.579,785,2.347,786,3.296,860,4.675,861,3.579,884,4.482,922,5.87,943,4.044,996,3.483,1019,4.845,1022,6.032,1023,5.728,1067,5.203,1077,4.355,1112,4.574,1185,6.221,1228,5.488,1417,4.206,1441,16.905,1454,6.734,1456,12.315,1499,7.116,1614,3.929,1747,5.203,1755,5.87,2077,6.449,2146,5.601,2161,5.87,2179,5.87,2308,4.845,2521,7.116,2577,6.734,2586,10.254,2596,7.116,2720,4.845,2724,9.107,2773,6.734,2797,7.116,2798,12.236,2799,7.695,2800,7.695,2801,7.695,2802,7.695,2803,7.695,2804,7.116,2805,7.695,2806,7.695,2807,7.695,2808,7.695,2809,7.116,2810,7.695,2811,7.695,2812,7.695,2813,6.734,2814,7.695,2815,7.116,2816,7.695,2817,7.695,2818,7.695,2819,6.734,2820,7.695,2821,7.116,2822,7.695,2823,6.221,2824,7.695,2825,7.695,2826,7.695]],["keywords/419",[]],["title/420",[4,99.401,107,235.629,185,231.733,661,611.918,2308,604.061,2827,959.288]],["content/420",[0,4.523,4,1.881,14,3.136,25,1.068,28,3.608,33,1.686,37,1.401,45,3.699,46,2.7,63,1.829,65,2.734,67,5.247,70,2.034,79,4.417,99,2.939,103,3.717,107,4.838,110,8.007,151,2.574,162,2.949,181,4.278,185,5.453,190,3.902,192,4.384,196,4.997,201,3.222,202,2.566,222,2.275,225,2.99,246,4.119,247,7.714,264,4.654,273,1.829,278,2.246,293,2.335,298,4.094,301,2.972,304,9.142,311,3.574,315,4.247,321,5.127,329,3.717,330,3.135,331,5.394,366,4.018,397,5.321,402,4.811,433,6.072,452,3.859,512,3.415,519,4.487,536,2.86,537,2.734,544,3.112,548,5.253,551,3.796,554,3.994,568,4.908,573,8.965,613,2.939,627,6.539,674,3.055,676,6.072,689,4.56,716,3.012,732,2.919,763,4.26,827,5.127,857,4.29,861,3.88,931,4.959,944,4.679,991,7.188,1109,4.32,1112,4.959,1147,4.599,1187,5.394,1219,4.018,1384,5.735,1434,6.363,1456,6.744,1541,6.539,1563,6.991,1620,6.744,1621,7.3,1872,4.487,1891,5.838,1969,6.539,1984,5.321,2179,6.363,2308,5.253,2444,5.068,2567,6.991,2577,7.3,2624,6.363,2714,13.54,2780,7.714,2828,8.342,2829,8.342,2830,12.058,2831,8.342,2832,8.342,2833,8.342,2834,8.342,2835,7.714,2836,7.3,2837,11.412,2838,6.991,2839,13.04,2840,8.342,2841,8.342,2842,6.991,2843,8.342,2844,8.342]],["keywords/420",[]],["title/421",[107,332.397,185,326.9,331,874.956]],["content/421",[6,1.374,14,3.5,46,4.595,54,4.047,70,4.692,88,3.193,105,5.049,107,3.487,147,9.055,149,5.888,156,7.517,162,3.292,181,3.782,185,4.156,196,2.898,200,3.474,201,3.596,202,2.864,222,2.539,223,4.788,230,2.942,240,2.079,264,4.987,301,3.921,315,3.033,321,5.723,329,4.149,349,6.02,371,4.858,391,7.15,392,4.331,407,4.541,452,4.307,455,4.458,468,4.26,493,5.791,499,4.894,520,4.215,537,4.652,539,6.603,545,2.579,569,4.569,584,6.296,614,4.027,696,5.791,712,5.657,713,9.178,717,4.458,727,6.516,735,4.193,736,3.487,740,4.331,750,8.149,858,4.69,861,8.002,886,3.326,891,5.133,893,5.969,894,3.568,910,3.747,912,7.405,914,4.381,919,6.516,957,5.657,1006,5.657,1040,5.94,1058,8.909,1128,6.778,1161,7.299,1170,4.755,1191,5.94,1384,6.402,1422,9.933,1606,6.402,1755,7.103,1863,7.299,1869,12.804,1927,6.778,1984,5.94,2062,6.198,2301,10.973,2351,8.61,2429,6.641,2624,10.828,2625,7.103,2709,7.804,2845,7.528,2846,9.312,2847,7.804,2848,7.804,2849,9.312,2850,9.312,2851,9.312,2852,9.312,2853,9.312,2854,9.312,2855,9.312,2856,9.312,2857,9.312,2858,9.312,2859,9.312]],["keywords/421",[]],["title/422",[861,866.742]],["content/422",[4,2.132,25,1.368,33,2.03,35,4.501,97,5.51,107,6.496,181,4.182,182,3.132,185,5.884,188,8.804,240,3.505,248,11.155,297,4.453,318,13.154,432,8.249,1228,11.194,1326,9.646,1365,11.426,1434,11.973,1598,11.426,2194,12.69,2308,9.884,2507,12.69,2860,15.696,2861,12.304,2862,15.696,2863,15.696,2864,15.696,2865,15.696,2866,15.696]],["keywords/422",[]],["title/423",[4,99.401,182,191.399,256,451.293,275,319.419,621,684.146,884,558.686]],["content/423",[]],["keywords/423",[]],["title/424",[275,522.063,308,507.514]],["content/424",[5,4.213,6,2.136,10,5.735,18,4.842,30,6.819,37,2.433,51,4.67,70,4.759,176,5.29,192,4.873,196,6.074,200,7.281,202,4.459,206,5.16,240,3.236,275,4.826,293,4.057,308,6.317,385,5.309,396,4.736,438,5.428,439,10.143,440,9.026,466,7.561,527,7.453,539,6.742,556,5.178,557,5.759,614,6.269,630,5.328,643,10.337,664,7.252,694,7.205,697,9.246,773,5.712,785,4.42,894,5.555,895,12.148,914,6.819,965,9.015,1058,7.507,1219,6.982,1726,7.796,1975,12.685]],["keywords/424",[]],["title/425",[19,287.561,37,161.05,185,231.733,855,570.235,872,483.169,901,366.18]],["content/425",[4,2.31,5,3.196,6,2.305,19,4.438,23,3.781,32,3.133,62,6.342,113,6.886,125,7.832,275,4.929,308,4.792,462,5.882,468,6.773,479,8.895,486,8.8,536,5.076,717,7.088,879,5.763,881,10.776,897,9.708,901,5.651,902,8.457,926,7.559,937,6.465,1000,7.962,1656,13.174,1769,12.407,2867,18.302,2868,17.32,2869,18.302,2870,13.689,2871,14.804,2872,14.804,2873,13.689,2874,14.804,2875,14.804]],["keywords/425",[]],["title/426",[5,207.102,6,92.877,7,299.457,217,342.668,322,352.639,2036,751.955]],["content/426",[5,4.729,6,1.872,19,4.285,23,3.851,32,4.091,35,4.1,37,2.4,70,5.342,152,2.846,217,5.107,222,3.898,275,4.76,278,3.848,297,4.055,440,6.612,556,5.107,557,5.68,572,7.825,660,8.019,695,7.06,926,9.872,936,7.106,961,7.881,975,7.689,1033,10.406,1259,11.558,1262,8.786,1351,10.641,1479,8.019,2017,12.51,2036,11.206,2049,9.243,2095,10.004,2489,10.406,2768,10.004,2876,12.51,2877,14.296,2878,14.296,2879,14.296,2880,14.296,2881,14.296]],["keywords/426",[]],["title/427",[37,199.834,185,287.538,486,707.558,703,444.09]],["content/427",[3,3.948,5,3.529,6,2.135,9,3.927,12,2.993,20,3.844,33,1.11,37,2.238,51,3.19,60,4.974,63,4.377,70,2.093,76,5.102,92,3.659,98,3.677,114,2.495,136,4.95,167,5.794,171,2.241,182,2.66,183,2.703,186,3.941,191,2.58,196,2.671,204,4.061,217,3.066,219,3.19,222,2.34,246,5.164,252,3.328,265,3.088,272,3.659,275,7.794,279,5.102,281,5.17,289,3.992,298,4.212,308,4.316,311,3.677,322,4.901,334,2.475,371,4.477,379,3.927,389,4.413,390,6.388,391,4.323,393,7.171,440,3.97,446,6.388,458,3.992,499,9.687,516,6.856,556,3.066,557,3.41,563,3.677,636,4.692,643,6.121,664,4.294,685,6.248,695,6.584,698,5.549,703,7.447,713,5.549,716,3.099,720,6.547,751,5.275,785,5.621,787,4.159,866,7.843,910,3.453,911,5.475,926,4.382,939,6.939,940,5.214,945,6.728,955,4.95,963,3.315,994,4.616,1027,7.193,1066,4.58,1082,5.713,1164,5.275,1178,5.803,1236,6.728,1262,5.275,1320,4.616,1327,4.58,1526,4.692,2004,6.547,2049,5.549,2254,4.858,2281,5.713,2882,8.583,2883,8.583,2884,7.193,2885,8.583,2886,5.9,2887,7.936,2888,8.583,2889,8.583,2890,8.583,2891,8.583,2892,7.193,2893,7.936,2894,8.583,2895,8.583,2896,7.936]],["keywords/427",[]],["title/428",[4,123.338,79,630.307,275,396.341,452,550.572]],["content/428",[]],["keywords/428",[]],["title/429",[275,522.063,391,789.701]],["content/429",[4,1.413,5,2.945,6,1.813,7,4.258,19,4.089,25,0.907,37,3.59,51,3.264,52,5.159,53,5.762,63,2.991,86,5.512,87,4.74,152,2.716,179,6.78,252,5.289,255,5.559,275,8.031,278,3.672,308,4.415,334,3.933,393,7.336,413,7.064,437,5.354,440,6.309,467,4.822,514,4.89,527,7.014,529,7.721,556,6.689,557,7.44,564,6.309,626,10.405,699,8.819,874,6.047,914,6.417,921,7.064,961,7.519,963,5.268,1030,6.694,1114,6.965,1142,9.929,1378,8.484,1961,8.108,2095,9.545,2206,10.153,2488,9.929,2541,10.405,2897,13.641,2898,11.937,2899,12.613,2900,9.079]],["keywords/429",[]],["title/430",[4,162.462,275,522.063]],["content/430",[2,5.748,4,1.626,5,3.388,6,2.358,10,6.209,37,1.787,62,4.56,63,4.088,67,4.283,92,4.538,114,3.094,125,4.212,151,3.284,152,3.124,162,5.547,171,2.779,179,5.29,182,3.719,217,5.605,222,4.279,230,3.362,232,6.327,265,3.829,273,3.441,275,6.85,278,2.865,279,9.328,293,2.979,322,3.913,334,3.069,385,3.898,386,7.748,391,5.361,428,5.725,437,6.159,467,3.762,531,5.818,536,6.391,541,5.19,643,7.591,664,5.325,674,3.898,693,4.767,694,5.29,695,5.256,714,7.084,785,4.785,868,8.92,879,4.144,905,6.327,907,6.541,911,6.789,926,5.435,958,4.923,963,4.111,1000,10.025,1148,7.448,1395,7.922,1426,8.119,1427,5.68,1614,5.435,1672,8.605,1716,7.591,1751,7.591,1767,8.92,1787,8.343,2063,8.92,2551,9.842,2731,8.119,2887,9.842,2901,10.644,2902,10.644,2903,10.644,2904,10.644,2905,10.644]],["keywords/430",[]],["title/431",[4,110.083,7,331.64,275,353.746,308,343.888,381,342.83]],["content/431",[]],["keywords/431",[]],["title/432",[52,372.867,275,450.597,670,759.062]],["content/432",[4,1.451,5,3.023,6,1.356,23,2.593,25,0.608,33,1.183,37,3.201,44,2.547,49,4.304,52,6.822,60,3.413,61,4.92,62,3.919,63,3.071,67,5.635,68,4.808,73,4.671,86,3.696,110,6.178,116,7.027,152,1.821,164,2.873,179,4.547,182,1.825,183,5.359,186,2.704,202,5.234,217,3.268,222,2.494,231,6.524,256,4.304,265,3.291,273,4.181,275,7.217,278,3.77,293,2.561,297,2.595,310,4.141,322,6.255,329,4.076,330,2.199,334,2.638,370,5.76,371,4.772,381,2.952,391,4.608,405,7.201,437,3.59,462,3.635,474,5.276,519,4.92,525,4.808,527,4.704,531,7.655,537,2.998,551,4.163,556,6.078,557,6.761,569,4.489,584,6.185,660,5.131,670,5.131,698,5.915,703,3.413,705,5.328,741,5.558,872,4.608,898,6.289,907,5.622,918,5.178,931,5.438,935,7.396,963,3.533,987,5.915,992,6.524,1082,6.089,1164,5.622,1180,5.497,1197,6.402,1320,4.92,1405,8.006,1422,6.402,1597,8.006,1713,4.96,1965,6.402,1993,6.185,2095,6.402,2444,5.558,2527,8.459,2612,6.524,2713,8.459,2906,9.148,2907,8.459]],["keywords/432",[]],["title/433",[98,509.904,308,385.295,395,500.481,874,527.718]],["content/433",[4,1.404,33,1.752,41,9.163,46,4.387,63,4.088,84,7.232,87,7.405,97,4.758,98,5.805,110,5.978,114,3.94,230,4.281,234,6.268,265,4.875,287,6.736,291,6.488,293,3.793,308,7.789,322,4.982,370,8.534,385,4.964,395,5.698,396,4.428,401,6.07,408,4.484,413,7.018,462,5.385,467,4.79,514,4.858,531,7.408,536,6.392,581,7.911,621,9.665,622,5.499,874,11.025,930,12.531,973,7.289,992,9.665,1000,7.289,1028,7.816,1106,11.357,1171,9.317,1191,8.645,1747,9.163,1961,11.081,1970,9.665,2908,13.552,2909,12.531]],["keywords/433",[]],["title/434",[275,450.597,670,759.062,1766,900.729]],["content/434",[5,3.414,6,2.23,37,3.471,63,3.468,73,8.075,86,6.39,113,7.356,131,8.02,182,3.155,196,4.922,200,7.714,205,4.109,206,5.63,256,7.44,275,5.266,301,3.604,308,5.119,392,7.356,398,5.923,490,6.284,540,11.772,543,5.857,699,10.226,703,5.9,775,7.572,901,6.037,940,9.608,1236,12.397,1417,8.645,1766,15.333,2910,15.815,2911,15.815,2912,9.836,2913,11.772,2914,15.815]],["keywords/434",[]],["title/435",[75,874.956,275,450.597,670,759.062]],["content/435",[6,2.022,37,2.696,51,3.843,52,5.754,75,13.502,77,12.984,114,4.668,121,9.649,179,7.982,182,3.204,186,4.747,205,4.173,206,5.716,248,8.707,256,7.555,301,3.66,308,5.198,371,8.378,398,6.014,417,7.231,536,5.506,541,7.831,560,8.504,698,10.383,720,12.249,920,8.504,926,8.2,940,9.757,959,14.053,963,6.203,1408,14.053,1526,8.779,1604,10.383,1623,10.858,2915,16.059,2916,14.85]],["keywords/435",[]],["title/436",[275,450.597,670,759.062,2917,1184.242]],["content/436",[4,1.703,6,2.272,10,6.505,21,9.481,22,4.314,37,2.76,44,4.577,51,3.934,67,6.614,68,8.64,196,5.117,281,6.375,293,4.602,437,6.452,531,8.986,550,9.305,564,7.604,703,6.133,707,11.115,856,10.629,1047,11.967,1058,8.514,1156,12.539,1295,12.886,1751,15.121,1963,13.777,2062,10.942,2134,13.777,2917,18.554,2918,14.386,2919,16.439,2920,15.201]],["keywords/436",[]],["title/437",[58,495.646,99,476.718,104,914.982]],["content/437",[6,1.743,7,5.62,8,9.533,10,7.123,58,8.226,76,10.701,99,7.912,104,15.186,179,8.948,182,3.592,196,5.603,275,7.478,286,11.063,297,6.371,308,5.827,387,10.484,437,7.065,536,6.172,617,9.533,2921,16.646]],["keywords/437",[]],["title/438",[94,841.635,275,450.597,504,599.958]],["content/438",[3,7.622,6,1.604,7,5.173,8,11.285,28,7.167,37,2.782,58,6.069,94,13.254,114,4.817,155,4.939,184,3.593,251,11.849,265,5.961,275,8.281,291,7.934,308,5.364,394,8.403,504,10.444,590,7.065,985,7.707,1377,7.751,1636,11.595,1671,13.397,1935,12.989,2922,16.57,2923,13.887,2924,16.57]],["keywords/438",[]],["title/439",[51,323.825,275,450.597,947,930.333]],["content/439",[4,2.094,5,2.65,6,1.956,23,3.35,32,2.598,34,3.983,37,3.896,46,3.973,51,5.26,70,4.242,73,6.267,161,3.878,167,5.335,184,2.662,192,4.127,201,4.741,210,8.17,217,4.384,219,4.562,275,5.792,293,3.436,297,3.482,308,7.511,315,3.998,381,5.614,425,4.416,427,4.512,510,6.224,543,4.545,549,6.451,564,5.677,572,4.384,587,7.83,773,4.837,785,3.743,947,15.112,1021,6.602,1300,8.002,1656,11.579,1706,11.408,1707,8.754,1902,7.543,1982,9.924,2845,9.924,2925,12.274,2926,12.274,2927,7.729,2928,17.396,2929,12.274,2930,12.274]],["keywords/439",[]],["title/440",[275,450.597,2931,1007.258,2932,1251.356]],["content/440",[4,2.352,5,4.377,6,1.963,7,7.087,8,8.128,10,6.074,25,1.021,33,1.985,46,6.563,50,8.461,69,4.791,185,4.897,275,8.041,297,5.751,308,6.563,373,5.228,381,4.953,496,6.202,642,6.875,901,5.859,941,11.425,1254,10.378,1377,7.18,1697,8.688,2923,12.864,2931,11.425,2932,20.992,2933,15.349,2934,15.349]],["keywords/440",[]],["title/441",[37,178.358,437,416.956,696,660.735,988,757.671,1110,606.904]],["content/441",[6,1.773,25,0.878,37,3.529,44,3.678,52,3.639,92,5.631,110,5.826,179,6.565,182,3.654,186,5.413,195,6.994,196,6.543,200,4.928,202,4.063,222,3.602,256,6.214,273,2.896,275,4.398,304,6.653,308,4.275,322,6.732,370,8.317,428,7.104,437,5.184,467,4.669,486,7.851,515,6.523,527,6.792,535,10.353,536,4.529,541,6.441,554,6.324,556,4.718,557,5.248,560,6.994,563,5.658,564,6.109,626,10.075,695,6.523,703,4.928,785,4.028,799,9.08,894,5.061,899,9.615,906,7.161,961,7.281,963,5.101,1050,9.42,1180,7.936,1207,7.617,1427,7.048,1606,9.08,1610,8.215,1623,8.931,1665,12.214,1767,11.069,1980,11.069,2206,9.831,2628,10.075]],["keywords/441",[]],["title/442",[191,471.331,879,610.406]],["content/442",[5,4.336,6,1.945,25,1.597,52,5.534,63,4.404,273,4.404,391,10.116,689,10.979,857,10.328,1711,13.171,2935,20.085,2936,20.085]],["keywords/442",[]],["title/443",[25,63.794,33,187.752,182,191.399,199,695.195]],["content/443",[]],["keywords/443",[]],["title/444",[33,174.985,199,647.923,486,804.418]],["content/444",[3,5.362,4,1.208,5,2.516,6,2.079,33,3.156,35,3.343,37,1.957,44,3.246,67,4.69,69,3.639,87,4.051,100,4.317,103,5.194,113,5.422,114,4.874,151,5.172,176,7.165,180,5.362,181,5.232,182,2.326,185,4.05,194,6.788,199,10.281,207,9.242,219,4.333,240,2.603,252,4.52,265,4.193,278,3.138,293,3.263,298,5.72,310,5.276,314,4.135,334,3.361,392,5.422,395,4.901,401,5.221,438,4.365,474,6.722,496,4.71,514,4.178,536,3.997,539,5.422,551,5.304,554,5.581,566,8.013,613,5.906,630,4.285,637,6.659,652,5.581,664,5.832,697,7.435,703,4.349,716,4.208,732,4.078,799,8.013,875,6.172,926,5.952,994,6.269,1228,8.313,1294,9.769,1611,8.676,1679,10.778,2075,8.891,2645,10.2,2937,10.778,2938,10.778]],["keywords/444",[]],["title/445",[25,58.151,33,113.071,199,418.671,437,343.191,1066,466.623,1237,636.528,2539,732.835]],["content/445",[4,0.641,5,1.336,6,1.955,7,3.199,12,2.157,25,1.473,30,2.911,33,2.357,40,2.362,44,1.723,46,2.003,58,2.266,65,2.028,70,3.2,87,2.15,96,5.801,97,3.598,99,3.611,107,2.518,116,2.555,125,4.056,134,3.502,142,3.64,151,1.909,155,3.055,175,3.848,176,3.74,181,3.496,182,3.045,183,1.949,185,1.495,186,3.029,192,2.08,195,8.08,196,6.72,199,7.306,200,2.308,202,1.903,222,1.687,230,1.954,234,2.862,240,1.381,246,1.954,248,3.354,250,8.143,255,4.177,264,4.424,265,2.226,276,3.759,278,1.665,284,5.999,286,3.802,288,3.055,291,2.962,293,1.732,297,1.755,298,3.036,300,3.41,301,3.855,304,3.116,314,4.654,315,2.015,330,3.155,334,1.784,356,4.767,373,1.596,385,2.266,392,2.878,394,3.137,396,3.349,401,2.771,421,3.204,425,2.226,428,3.327,437,4.023,438,3.838,462,4.072,466,3.227,490,2.458,525,5.387,537,5.001,541,3.017,542,3.946,545,1.714,548,6.454,553,4.591,560,3.276,565,5.801,566,4.253,567,4.057,573,4.253,588,4.719,613,5.376,614,2.676,617,5.427,712,3.759,722,5.162,732,2.165,735,2.786,738,6.627,745,3.382,875,8.08,892,3.802,893,5.517,909,4.85,910,2.489,936,3.075,937,5.731,947,4.253,961,3.41,962,4.605,963,2.389,973,3.327,985,4.767,992,4.412,1004,5.185,1006,3.759,1026,4.719,1043,4.503,1067,4.183,1068,7.8,1118,4,1126,4.605,1141,4.057,1169,2.83,1171,4.253,1172,4.412,1211,4.85,1237,7.461,1296,5.002,1305,4.329,1393,5.002,1422,4.329,1634,4.412,1635,5.721,1686,4.503,1872,3.327,2117,4.057,2172,4.183,2939,6.187,2940,6.187,2941,6.187,2942,4.85,2943,6.187,2944,6.187]],["keywords/445",[]],["title/446",[4,99.401,25,63.794,67,385.977,196,298.574,264,278.105,875,507.977]],["content/446",[6,1.951,25,1.417,46,4.386,58,3.21,63,1.922,68,4.605,69,2.736,70,4.04,88,3.005,97,3.076,99,3.087,107,2.152,142,5.155,151,2.704,155,4.937,175,5.45,176,3.198,181,4.414,182,4.579,186,2.59,192,2.946,195,9.87,196,4.217,198,2.341,232,5.209,250,7.23,252,3.398,264,4.802,265,4.874,278,3.647,288,4.328,291,4.196,293,2.453,298,4.3,301,4.593,304,6.824,306,6.25,314,3.109,322,3.221,330,2.107,334,2.527,373,2.26,401,3.925,405,4.506,425,3.152,428,4.713,438,3.282,490,3.482,531,7.406,537,6.109,542,5.59,545,2.427,548,5.518,551,3.988,553,3.925,560,4.64,562,5.054,565,9.375,567,5.747,588,6.684,613,4.773,616,6.132,617,4.64,622,3.556,632,5.155,664,4.384,693,3.925,695,4.328,699,5.666,704,4.605,706,4.475,718,3.556,738,8.76,861,4.076,875,4.64,888,4.572,893,3.685,918,4.96,936,4.356,989,6.25,1001,7.344,1026,6.684,1031,6.379,1043,6.379,1065,7.971,1115,6.379,1118,5.666,1123,6.523,1157,5.209,1177,5.386,1232,7.085,1315,5.518,1395,6.523,1397,10.954,1541,6.869,1617,4.572,1619,7.669,2945,8.763,2946,8.763,2947,8.763]],["keywords/446",[]],["title/447",[988,1328.96]],["content/447",[4,1.335,6,1.742,25,1.493,33,2.327,49,6.06,58,4.718,63,2.825,70,3.141,97,4.522,99,4.538,107,3.164,142,7.578,151,3.974,181,3.432,182,4.139,195,6.821,196,6.456,199,10.752,250,6.874,252,4.995,255,5.25,264,6.013,284,4.569,301,2.936,428,6.928,437,7.063,462,7.151,536,4.417,537,4.222,541,6.281,613,4.538,617,6.821,732,4.507,738,8.329,866,7.578,875,9.53,892,7.916,893,5.416,910,5.183,937,5.626,962,9.588,1000,6.928,1015,9.826,1056,8.111,1057,10.415,1062,9.588,1063,10.796,1064,9.014,1068,7.657,1171,8.856,1172,9.187,1194,9.377,1597,11.273,2948,12.881]],["keywords/447",[]],["title/448",[52,190.408,100,255.91,275,230.102,670,915.022,672,429.789,874,306.375,1766,459.966]],["content/448",[]],["keywords/448",[]],["title/449",[37,178.358,51,254.223,256,499.793,308,343.888,539,494.15]],["content/449",[4,2.143,65,6.779,67,8.322,107,5.08,308,6.695,878,13.563,891,11.401,2845,16.722,2949,20.683,2950,18.1]],["keywords/449",[]],["title/450",[1766,1240.307]],["content/450",[2,4.577,4,1.295,5,4.405,6,1.706,9,5.717,16,6.425,22,3.279,61,6.72,63,3.863,86,5.049,87,4.342,107,3.069,114,3.632,131,6.336,171,3.263,192,4.201,200,4.662,201,4.826,202,3.844,205,3.247,219,4.644,240,2.79,252,4.845,271,4.432,286,7.679,288,6.171,301,2.848,308,4.045,432,9.258,452,8.148,479,10.585,514,4.479,527,6.425,551,5.686,556,4.463,557,7,645,7.351,711,5.303,735,5.626,901,4.77,932,5.686,943,6.567,972,8.194,1066,6.668,1152,8.317,1402,9.096,1444,5.912,1649,9.795,1718,9.096,1751,8.911,1766,16.93,1844,10.935,2589,7.679,2612,8.911,2724,9.3,2838,10.472,2951,12.495,2952,12.495,2953,8.194,2954,10.472,2955,12.495]],["keywords/450",[]],["title/451",[275,620.473]],["content/451",[5,4.696,6,2.106,7,3.743,9,5.486,10,6.77,12,4.181,19,3.595,37,2.013,44,4.764,51,4.094,53,5.065,65,3.93,92,5.113,107,2.945,148,6.916,200,4.474,232,7.128,275,7.243,281,4.65,286,7.37,293,3.357,308,7.041,322,4.408,329,5.344,350,10.494,373,3.093,375,6.256,440,5.547,499,8.992,527,6.166,544,4.474,556,7.126,557,6.798,582,6.726,694,5.96,703,4.474,773,4.726,785,3.657,870,9.4,901,4.577,983,7.128,1160,6.081,1178,8.108,1183,6.61,1251,8.729,1315,7.551,1351,8.926,1633,6.85,1656,13.278,1726,6.45,1751,8.552,1865,11.089,1983,8.729,2095,8.391,2530,11.089,2653,10.494,2867,11.089,2868,10.494,2869,11.089,2917,14.973,2956,11.992]],["keywords/451",[]],["title/452",[52,513.439]],["content/452",[4,1.803,5,2.65,6,1.188,22,3.221,33,2.249,46,3.973,52,6.394,60,6.49,63,2.692,107,3.015,110,5.414,114,5.057,152,2.444,154,4.512,186,5.142,201,4.741,202,3.776,217,6.214,222,4.743,254,7.296,256,5.774,271,6.171,272,5.233,273,2.692,286,7.543,297,3.482,308,5.631,322,4.512,325,8.589,396,4.01,400,5.527,431,11.35,512,8.271,515,6.062,520,5.556,549,6.451,569,6.023,580,5.646,582,6.885,635,10.741,659,5.646,692,6.267,693,5.498,694,6.101,695,6.062,698,7.936,785,3.743,792,7.079,901,4.685,936,6.101,1066,9.283,1262,7.543,1763,10.741,2172,8.299,2502,6.101,2531,10.741,2886,8.438,2957,12.274,2958,12.274,2959,11.35,2960,11.35,2961,12.274,2962,11.35]],["keywords/452",[]],["title/453",[874,826.145]],["content/453",[4,1.78,5,4.32,6,2.112,12,4.205,14,6.458,25,0.802,37,2.025,51,2.886,60,4.5,84,6.436,87,4.191,97,6.032,98,9.343,103,5.375,110,5.32,114,4.994,125,4.772,162,4.264,182,3.993,186,3.565,187,7.412,196,3.754,200,4.5,204,5.707,217,4.308,230,3.81,273,3.768,286,10.559,287,5.995,288,5.956,289,5.61,308,3.904,310,5.459,322,4.434,395,7.224,396,3.941,479,7.247,496,6.942,510,6.116,674,4.418,693,5.402,873,7.247,874,10.22,896,10.108,901,4.604,963,4.658,1028,6.956,1082,8.028,1140,8.977,1397,9.751,1786,9.454,1821,11.435,1822,8.977,1872,6.487,2488,8.78,2963,12.061,2964,9.454,2965,12.061,2966,10.555]],["keywords/453",[]],["title/454",[100,580.619,672,975.122]],["content/454",[1,4.743,4,1.103,6,1.519,7,3.323,10,4.212,33,1.376,37,1.787,51,5.492,53,6.628,58,6.827,61,5.725,63,2.334,70,2.596,86,6.341,87,5.453,98,4.56,100,6.903,103,4.743,107,2.614,110,4.695,125,7.375,149,4.415,154,3.913,186,3.146,187,6.541,200,3.971,201,4.111,205,2.765,246,3.362,264,3.086,272,4.538,278,2.865,289,4.951,299,6.62,308,6.033,311,4.56,334,3.069,357,7.591,373,4.807,381,3.435,395,4.475,396,3.478,452,4.923,489,7.922,491,13.568,492,10.61,496,4.301,519,5.725,569,5.223,672,13.642,864,6.98,886,3.802,940,6.467,958,4.923,1038,6.62,1049,6.541,1058,5.512,1207,6.138,1224,6.199,1444,5.036,1526,5.818,1631,6.024,1663,5.918,1821,7.084,2049,6.882,2098,6.702,2172,7.197,2254,6.024,2308,6.702,2714,7.317,2733,7.591,2770,9.842,2967,9.842,2968,9.842,2969,7.197,2970,9.314,2971,10.644,2972,9.842,2973,9.842]],["keywords/454",[]],["title/455",[75,1204.817]],["content/455",[4,2.191,5,2.435,6,1.092,9,5.16,16,5.799,20,5.051,33,2.117,37,1.893,40,4.305,51,5.373,69,3.52,75,15.144,79,5.972,92,8.217,100,7.83,111,4.255,114,4.759,125,4.462,171,2.945,186,3.333,189,5.758,192,3.792,196,3.51,200,4.208,205,4.253,206,6.86,240,2.518,254,6.704,271,6.836,273,2.473,297,3.199,308,5.299,329,8.588,334,3.252,350,9.869,361,6.326,366,5.432,373,2.908,375,5.883,382,5.799,385,4.131,396,3.685,417,7.371,442,8.209,468,5.16,545,3.124,736,4.223,879,4.391,894,4.322,1066,6.018,1170,5.758,1268,5.841,1434,8.602,1595,7.014,1694,7.892,1707,8.043,1718,8.209,1765,7.194,1989,8.394,2118,7.625,2974,11.278,2975,11.278,2976,9.869,2977,11.278,2978,9.869,2979,7.625]],["keywords/455",[]],["title/456",[202,482.305,689,857.071]],["content/456",[4,1.985,22,5.029,25,1.274,37,3.217,51,4.585,86,7.742,92,8.17,114,5.57,177,9.853,202,5.894,276,11.641,308,6.202,407,9.344,420,11.641,481,10.563,891,10.563,1631,10.845,2308,12.066]],["keywords/456",[]],["title/457",[5,256.976,152,236.98,217,425.189,322,437.561]],["content/457",[4,1.36,5,5.136,6,1.765,14,4.934,33,1.697,46,4.248,52,3.616,60,4.897,63,2.878,72,6.247,100,4.86,152,2.613,182,2.619,186,3.879,192,4.413,200,4.897,201,5.069,206,4.672,217,8.497,240,2.931,271,4.656,273,3.998,297,3.723,301,2.991,308,5.902,322,6.703,357,9.36,373,5.403,382,6.749,482,7.175,557,5.215,572,6.513,631,7.644,672,8.163,736,4.915,773,8.256,880,10.011,1183,7.235,1351,13.571,1548,8.372,1821,8.736,1990,9.769,2488,9.554,2953,8.607,2980,10.288,2981,13.125,2982,12.137,2983,12.137,2984,11.486,2985,11.486]],["keywords/457",[]],["title/458",[281,524.746,297,383.895,379,619.122]],["content/458",[2,3.307,4,2.234,6,0.874,7,2.819,12,3.148,18,3.016,23,2.572,25,0.6,37,3.179,51,4.531,52,3.82,53,3.814,58,3.307,65,2.959,69,2.819,70,4.116,72,4.297,86,3.648,88,3.096,97,3.17,99,3.181,107,2.218,116,8.436,164,2.835,177,4.643,183,5.316,200,3.369,201,3.487,202,2.777,204,4.272,215,4.745,219,6.273,230,5.982,246,2.852,264,4.019,275,4.617,281,8.362,297,2.561,301,2.058,308,6.613,311,3.868,330,4.912,364,4.895,373,2.329,375,4.71,402,5.207,425,4.988,432,8.87,437,5.441,444,6.318,467,3.192,487,5.686,506,4.895,538,4.488,556,3.225,716,3.26,736,3.381,741,5.486,853,5.158,894,5.313,897,5.921,906,4.895,1081,5.549,1112,5.367,1128,6.573,1169,4.131,1170,4.61,1339,6.21,1617,7.233,1706,5.921,1726,4.856,2242,7.078,2253,4.272,2429,6.439,2492,8.423,2502,4.488,2542,10.092,2560,5.921,2572,7.3,2606,7.901,2653,7.901,2733,6.439,2907,8.349,2986,9.029,2987,9.029,2988,7.3,2989,9.029,2990,9.029,2991,9.029]],["keywords/458",[]],["title/459",[60,584.959,297,444.782]],["content/459",[5,3.289,6,1.763,14,3.844,19,3.065,23,3.874,32,4.786,33,1.97,34,2.341,37,1.717,52,5.016,60,8.741,63,2.242,65,3.351,97,3.59,98,4.381,100,3.787,116,6.291,152,2.036,162,3.615,164,5.717,188,5.736,203,5.185,215,5.374,219,5.662,230,3.23,234,4.73,248,5.544,272,4.36,273,2.242,275,3.405,297,2.901,373,2.637,382,5.258,396,3.341,398,3.829,418,8.016,501,5.258,510,5.185,519,5.5,520,4.629,543,3.787,557,4.063,634,7.293,642,4.58,672,6.36,703,3.815,711,4.339,773,4.03,785,3.118,792,5.897,859,7.8,874,4.534,987,6.612,1030,5.018,1183,5.637,1219,7.338,1224,5.955,1345,9.474,1526,5.59,1692,9.456,1724,9.849,2197,8.016,2303,5.5,2502,5.083,2542,7.444,2992,9.456,2993,10.226,2994,10.226,2995,8.016,2996,10.226,2997,10.226,2998,10.226,2999,10.226,3000,9.456,3001,9.456,3002,10.226,3003,10.226,3004,10.226,3005,10.226]],["keywords/459",[]],["title/460",[297,444.782,1028,904.237]],["content/460",[4,2.327,6,1.454,7,6.237,12,6.966,14,5.644,25,0.667,37,1.684,45,2.845,46,3.246,51,3.593,53,6.342,67,4.035,87,3.485,98,4.296,144,6.163,155,2.989,156,7.95,161,3.168,167,4.359,173,5.961,200,3.742,210,6.675,264,2.907,271,3.557,275,4.999,289,10.444,308,5.825,310,4.539,321,6.163,373,4.641,375,7.832,439,7.018,499,7.89,645,5.9,740,4.665,773,3.952,785,4.578,865,6.577,874,4.446,901,3.828,910,4.035,932,4.564,996,4.539,1028,13.425,1030,7.367,1112,5.961,1141,9.846,1236,7.861,1242,11.769,1251,7.3,1315,6.315,1339,4.492,1388,9.577,1558,6.163,1633,5.729,1766,6.675,1852,8.405,1914,7.152,1961,5.961,2252,6.093,2253,7.104,2254,12.709,2492,10.933,2964,7.861,3006,9.274,3007,8.405,3008,9.274,3009,10.029,3010,10.029,3011,9.274]],["keywords/460",[]],["title/461",[37,227.19,703,504.882,958,625.942]],["content/461",[4,0.841,5,2.755,6,1.235,7,2.533,20,7.064,34,1.858,37,3.263,40,3.098,49,6.003,51,4.278,52,4.926,70,3.112,79,4.297,88,2.782,92,3.46,114,2.359,122,6.922,131,6.471,148,4.68,154,2.983,176,2.961,191,5.375,192,2.728,193,7.163,200,3.027,219,3.016,237,5.321,240,2.849,271,2.878,275,5.251,287,4.033,361,4.552,398,4.779,457,5.487,476,4.93,490,3.224,498,5.047,507,7.936,519,4.364,539,5.935,545,2.248,636,6.975,693,3.635,697,5.176,703,8.956,711,6.692,737,2.728,858,4.087,874,3.598,944,8.846,958,9.986,1109,4.202,1143,8.25,1180,4.876,1313,10.628,1320,6.863,1339,3.635,1365,5.907,1377,3.796,1435,6.04,1466,5.907,1526,6.975,1631,4.593,1697,4.593,1705,10.317,1710,6.19,1711,5.321,1712,5.678,1713,9.693,1718,5.907,1723,16.29,1741,6.801,1766,13.737,1768,7.504,1771,7.101,1783,5.579,1993,5.487,2502,6.343,2534,6.801,2612,5.787,2718,7.504,2912,7.936,2972,11.8,3012,7.504,3013,8.115,3014,7.504,3015,8.115,3016,8.115,3017,8.115,3018,8.115,3019,6.801,3020,7.101]],["keywords/461",[]],["title/462",[63,343.83,689,857.071]],["content/462",[4,1.208,5,3.62,20,10.19,37,2.815,60,4.349,63,4.989,64,7.881,65,3.82,67,4.69,86,6.775,92,4.97,122,5.116,152,2.321,182,2.326,186,3.445,187,7.163,189,5.952,197,8.313,202,3.586,217,4.164,248,6.32,271,4.135,275,3.881,297,3.307,301,2.657,334,3.361,373,4.324,392,5.422,407,5.684,440,5.392,519,6.269,523,6.269,543,4.317,572,4.164,625,8.891,675,7.798,689,6.372,704,6.126,716,4.208,771,4.67,785,5.113,786,4.993,792,6.722,853,6.659,874,5.168,881,8.485,900,10.778,901,4.449,902,6.659,1146,10.778,1426,8.891,1427,6.22,1706,7.644,1707,8.313,1708,8.013,1766,7.758,1984,7.435,2131,7.004,2183,8.485,2197,9.137,2502,5.794,2554,10.778,2714,8.013,2884,9.769,3021,11.656,3022,11.656,3023,10.778,3024,11.656,3025,11.656,3026,16.766,3027,11.656,3028,11.656,3029,11.656]],["keywords/462",[]],["title/463",[301,357.335,786,671.65]],["content/463",[2,4.899,4,1.386,5,4.317,6,2.049,10,3.41,12,6.441,22,2.262,33,2.119,44,3.724,52,5.09,53,3.64,98,7.914,100,6.841,103,3.84,107,2.117,111,3.252,148,4.97,155,2.569,162,3.046,173,5.123,193,6.567,198,3.573,201,3.329,222,2.35,248,4.673,264,2.498,275,2.87,289,6.221,301,3.736,308,4.329,311,5.73,325,9.359,334,3.856,393,4.635,395,3.624,438,3.227,458,4.009,482,4.711,489,6.415,492,5.827,496,3.482,515,6.605,561,4.054,672,12.437,673,4.496,675,6.221,736,5.009,786,5.73,864,5.652,874,8.866,886,4.778,888,8.551,921,4.463,1028,7.714,1030,4.229,1058,4.463,1109,4.463,1204,4.432,1242,6.755,1251,6.273,1309,4.054,1313,5.123,1339,5.991,1602,9.958,1651,7.714,1663,7.437,1732,7.542,1766,5.736,1981,5.736,2049,5.572,2062,5.736,2253,4.078,2254,7.57,2449,7.969,2502,4.284,2714,11.268,2837,7.542,2898,7.542,2954,7.223,2973,7.969,3030,6.968,3031,8.618,3032,8.618,3033,8.618,3034,8.618,3035,8.618,3036,8.618,3037,7.969,3038,8.618,3039,7.969,3040,8.618]],["keywords/463",[]],["title/464",[230,427.504,527,695.85,675,629.441]],["content/464",[2,3.265,4,0.924,5,1.924,6,2.077,10,5.432,12,3.108,20,6.149,22,2.339,52,4.613,63,1.955,86,3.602,98,8.7,100,6.2,103,3.972,107,2.189,116,3.681,152,3.744,156,4.72,193,3.571,198,2.381,201,3.443,206,3.173,217,3.184,230,6.777,246,4.337,248,4.833,272,3.8,275,4.571,278,2.399,289,4.146,298,4.374,301,3.129,319,3.972,325,6.237,330,3.3,334,2.57,356,4.146,375,4.65,381,2.876,389,4.583,391,4.489,393,4.794,455,6.573,482,4.872,527,7.059,648,5.613,672,10.412,675,6.385,706,4.551,716,4.956,736,3.338,785,2.718,861,4.146,864,5.845,874,8.338,888,7.161,891,7.567,918,5.045,929,8.242,940,8.34,1028,7.917,1055,4.43,1300,4.1,1308,5.045,1339,3.992,1526,4.872,1602,11.426,1713,11.631,1946,7.206,1984,5.686,2036,6.987,2254,5.045,2502,4.43,2773,7.8,2964,6.987,3041,7.206,3042,8.242,3043,7.8,3044,8.913,3045,7.47,3046,8.913,3047,13.728,3048,13.728,3049,8.913,3050,8.913,3051,8.913,3052,7.8,3053,8.913,3054,8.913,3055,8.913,3056,8.913,3057,8.913,3058,6.799]],["keywords/464",[]],["title/465",[527,695.85,674,495.646,675,629.441]],["content/465",[2,5.272,5,3.108,15,11.312,52,5.352,63,3.157,100,7.193,152,3.867,189,7.35,193,5.767,230,4.547,248,10.531,275,6.467,289,6.695,301,3.281,407,7.019,482,7.869,672,12.08,674,8.052,675,6.695,736,5.391,771,5.767,864,9.44,874,8.611,888,7.509,891,7.935,1028,8.302,1030,7.064,1109,7.455,1427,7.681,1602,8.745,1713,7.804,1981,9.581,2254,8.147,2502,7.155,3045,12.064,3059,14.395,3060,19.423,3061,14.395,3062,14.395,3063,14.395,3064,14.395,3065,14.395,3066,14.395]],["keywords/465",[]],["title/466",[215,711.201,230,427.504,792,780.453]],["content/466",[2,4.869,6,1.781,52,5.068,62,5.694,63,2.915,86,5.371,100,7.811,103,8.197,105,7.207,152,3.662,193,5.326,215,6.986,230,4.199,248,7.207,275,4.426,289,6.183,301,3.029,308,4.303,319,5.923,373,3.428,381,4.289,482,7.266,490,8.381,648,8.37,672,13.118,675,6.183,736,4.978,785,5.609,792,10.608,859,10.139,864,8.717,874,9.351,891,7.327,1028,10.608,1339,8.239,1444,6.29,1713,7.207,2254,7.524,2502,6.607,3045,11.14,3067,11.632,3068,13.292,3069,13.292,3070,13.292,3071,13.292,3072,13.292,3073,13.292,3074,13.292,3075,12.292,3076,13.292]],["keywords/466",[]],["title/467",[215,711.201,674,495.646,792,780.453]],["content/467",[2,6.293,6,1.168,12,4.205,51,2.886,52,4.734,86,4.874,88,4.135,98,5.167,100,8.076,152,3.984,193,4.832,201,4.658,219,4.483,230,5.428,248,6.539,275,4.016,281,4.677,289,7.991,301,2.749,381,3.892,385,4.418,407,5.881,420,7.328,482,6.593,496,4.874,512,4.937,561,8.083,597,9.454,642,5.402,672,12.446,674,7.988,675,5.61,688,7.328,711,5.118,740,5.61,775,8.226,792,6.956,864,7.909,874,8.872,888,6.292,891,6.649,940,7.328,1028,9.908,1030,8.431,1602,7.328,2062,8.028,2254,9.724,2502,5.995,2898,10.555,3045,10.108,3075,11.153,3077,12.061,3078,12.061,3079,12.061,3080,12.061,3081,12.061,3082,12.061,3083,12.061,3084,12.061,3085,12.061,3086,11.153]],["keywords/467",[]],["title/468",[63,343.83,988,1118.181]],["content/468",[4,2.465,6,1.271,7,4.097,12,4.576,15,7.644,44,3.655,49,6.175,51,3.141,60,4.897,72,6.247,86,5.303,103,5.849,114,3.815,173,7.802,191,5.481,200,4.897,201,7.042,215,6.898,264,5.286,273,2.878,275,4.37,281,5.089,289,8.481,301,4.156,311,5.622,329,5.849,375,6.847,484,7.362,490,5.215,496,5.303,499,6.898,519,7.059,556,4.688,557,5.215,577,8.163,672,8.163,786,5.622,792,7.569,874,5.819,886,6.513,888,6.847,894,5.03,901,5.01,963,5.069,1028,7.569,1030,8.947,1109,6.797,1726,7.059,1821,8.736,1931,8.265,2206,9.769,2714,9.023,2837,11.486,2964,10.288,3058,10.011,3087,13.125,3088,13.125]],["keywords/468",[]],["title/469",[329,698.67,512,641.789]],["content/469",[2,5.289,4,1.496,5,4.202,6,1.398,19,4.329,25,1.294,33,1.867,37,2.424,40,3.636,45,2.702,46,3.083,52,3.979,53,4.023,60,3.553,62,4.08,63,5.017,69,5.445,70,2.323,98,6.186,152,3.473,156,5.044,176,3.476,188,5.342,191,5.244,193,5.786,219,5.368,223,4.898,230,3.009,241,3.54,246,3.009,248,5.164,249,5.391,273,3.167,275,4.809,288,4.704,301,3.291,319,4.244,329,4.244,381,3.074,382,4.898,391,4.797,432,5.006,452,4.406,458,4.43,490,3.784,496,3.849,512,9.013,514,5.177,519,5.123,537,3.122,554,4.56,564,4.406,637,5.441,689,5.206,736,3.567,785,2.904,786,6.186,861,4.43,874,4.223,894,3.65,915,7.089,936,4.734,1028,8.329,1038,5.924,1193,7.265,1205,7.466,1427,5.083,1444,4.507,1595,5.924,1610,5.924,1614,7.374,1713,5.164,1843,9.212,2253,4.507,2488,6.933,2531,8.335,2823,7.7,2900,6.34,3089,13.354,3090,9.524,3091,9.524,3092,7.089,3093,9.524,3094,8.335,3095,9.524,3096,9.524]],["keywords/469",[]],["title/470",[331,1013.728,512,641.789]],["content/470",[6,1.907,10,5.816,12,5.125,16,10.129,33,1.901,37,3.307,51,4.714,53,6.209,62,6.297,63,3.224,85,7.08,87,5.108,100,5.443,103,6.55,189,7.506,200,5.484,219,5.464,289,6.837,297,4.17,330,3.534,331,12.736,373,3.791,391,7.404,396,4.803,452,6.799,492,9.939,496,5.94,512,8.063,525,7.725,606,11.522,674,5.384,785,4.483,894,5.633,1028,8.477,1032,10.105,1268,7.613,1435,10.941,1706,9.639,1852,12.319,2254,8.32,2336,11.884,3097,12.864,3098,14.699,3099,14.699,3100,14.699]],["keywords/470",[]],["title/471",[191,471.331,879,610.406]],["content/471",[4,1.985,23,2.92,25,1.674,398,7.176,432,10.07,523,12.553,596,13.408,885,13.948,2427,14.616,2510,16.768,2514,16.768,2515,14.262,2715,17.718,3101,19.161,3102,19.161]],["keywords/471",[]],["title/472",[23,133.27,25,58.151,33,113.071,181,232.993,315,284.809,480,314.57,1643,706.971]],["content/472",[]],["keywords/472",[]],["title/473",[33,174.985,181,360.573,1110,773.065]],["content/473",[5,3.853,6,1.728,62,7.646,69,5.571,70,4.353,103,7.953,107,5.487,176,6.513,181,4.756,182,3.561,185,4.311,186,5.275,205,4.637,222,4.867,227,9.177,278,4.804,392,8.302,496,7.212,564,8.255,581,7.574,938,13.99,1228,12.729,1734,16.504,2520,16.504,2920,16.504]],["keywords/473",[]],["title/474",[149,493.733,709,731.52,713,769.603,1300,547.547]],["content/474",[33,2.195,70,4.14,147,10.828,149,7.041,154,6.24,181,4.523,182,3.387,222,4.629,230,5.363,240,4.833,402,9.79,446,12.635,455,8.128,543,6.286,652,8.128,674,6.217,708,10.689,711,7.204,713,10.975,785,5.177,893,7.137,909,13.306,910,6.83,923,11.132,1134,9.608,1152,11.299,2588,12.357,2656,15.697,3103,16.975,3104,16.975,3105,15.697]],["keywords/474",[]],["title/475",[108,620.948,281,461.561,379,544.573,985,553.65]],["content/475",[6,2.106,33,2.213,51,4.095,69,5.343,70,4.174,72,8.146,88,5.868,181,4.56,185,4.134,201,6.61,246,5.407,281,9.76,316,12.458,322,6.291,330,4.115,379,7.83,432,8.995,444,11.976,468,7.83,545,4.74,611,10.777,613,6.029,641,11.976,1006,10.398,1178,11.572,1356,10.917,3106,17.115]],["keywords/475",[]],["title/476",[6,102.858,301,242.127,537,348.193,1308,601.311,2625,810.359]],["content/476",[6,1.567,33,2.093,78,13.563,107,3.975,111,6.107,181,4.312,184,3.51,185,5.07,240,4.687,264,4.692,301,4.784,330,3.891,347,7.445,395,6.805,402,9.334,437,6.352,490,6.43,537,6.879,544,6.038,545,4.483,607,8.774,614,7,664,8.097,732,5.662,735,7.287,907,9.946,1055,8.044,1141,10.613,1167,11.126,1339,7.249,1582,12.046,2705,13.563,3107,16.184,3108,14.965]],["keywords/476",[]],["title/477",[149,493.733,240,265.779,718,483.032,1313,707.558]],["content/477",[6,1.592,70,4.009,107,4.038,181,4.38,184,3.565,185,3.971,191,4.942,205,4.271,220,5.811,222,4.483,230,5.193,240,4.734,264,4.766,490,6.532,581,8.998,674,6.021,694,8.171,711,6.976,717,7.871,751,10.103,887,9.574,963,6.349,991,9.062,994,8.842,1007,11.143,1606,14.576,1663,9.14,3109,13.777,3110,13.777,3111,16.439,3112,16.439,3113,16.439]],["keywords/477",[]],["title/478",[18,268.36,110,354.378,196,250.045,243,369.555,627,629.736,1197,562.176,1320,432.085,1384,552.302]],["content/478",[6,1.63,18,7.192,33,2.177,110,7.427,156,8.916,181,4.486,184,3.651,185,4.067,205,5.594,206,5.994,243,7.746,252,6.529,264,4.881,278,4.533,299,10.472,307,9.711,329,7.503,334,4.855,355,6.635,366,8.11,563,7.213,636,9.204,715,12.533,736,6.306,912,8.784,1017,12.533,1187,10.887,2127,14.735,2617,13.199,3114,12.257,3115,16.838]],["keywords/478",[]],["title/479",[23,133.27,25,58.151,33,113.071,181,232.993,437,343.191,462,347.44,1066,466.623]],["content/479",[3,9.062,6,1.423,7,6.149,25,1.478,33,2.873,50,8.103,51,3.517,52,4.05,99,5.178,107,3.611,181,5.249,184,3.188,205,3.819,264,4.261,273,3.224,284,5.214,373,3.791,414,5.746,480,5.288,514,5.269,537,4.818,541,7.168,544,5.484,545,4.071,554,7.038,659,6.762,735,6.618,863,8.477,875,7.784,877,8.173,934,9.034,1042,9.504,1049,9.034,1180,8.832,1264,10.941,2052,11.212,3116,14.699,3117,14.699,3118,14.699,3119,14.699,3120,14.699,3121,14.699,3122,14.699,3123,14.699]],["keywords/479",[]],["title/480",[19,405.656,1378,841.635,1663,752.413]],["content/480",[5,1.984,6,0.89,22,3.688,23,4.242,24,4.85,25,0.611,32,1.944,33,1.817,34,3.217,35,2.635,37,1.543,49,4.323,111,5.302,151,2.835,161,4.439,164,2.885,167,3.993,171,2.399,181,3.744,183,5.374,184,1.993,185,2.22,198,3.754,202,2.826,220,3.248,222,2.505,224,5.173,225,3.294,226,4.692,271,3.259,273,2.015,275,3.059,301,2.094,315,2.993,330,3.378,355,5.537,407,4.481,438,3.441,480,5.055,537,3.011,543,3.403,563,3.936,572,3.282,630,7.024,642,4.116,734,4.628,737,3.089,758,3.974,764,5.023,765,4.605,767,8.027,770,4.538,771,5.63,772,3.811,773,5.537,776,6.688,777,4.094,778,6.839,780,4.866,804,4.453,936,4.567,1157,11.359,1166,6.025,1168,6.025,1170,4.692,1257,4.204,1345,5.715,1346,7.009,1391,7.429,1406,7.202,1444,6.649,1540,5.715,1558,5.647,2125,7.429,3124,9.188,3125,9.188,3126,8.497,3127,9.188,3128,9.188]],["keywords/480",[]],["title/481",[25,79.157,46,385.295,181,317.157,315,387.69]],["content/481",[4,1.162,6,1.086,22,2.944,23,4.034,25,1.084,45,4.626,69,3.502,70,2.735,97,3.938,116,4.632,124,4.201,136,6.469,155,3.343,156,5.94,176,4.093,181,2.989,184,2.432,185,4.641,202,3.45,220,3.965,224,3.401,225,4.021,228,4.899,230,3.543,239,5.727,240,4.709,278,4.389,315,6.87,330,2.697,347,7.501,396,3.665,477,9.497,490,4.457,520,5.077,545,4.517,554,5.371,573,7.711,586,8.349,616,7.849,632,6.599,652,5.371,735,5.05,740,5.217,745,6.132,901,4.282,952,6.349,1024,7.671,1157,6.668,1169,5.132,1173,6.668,1177,6.893,1329,5.688,1339,5.024,1342,11.025,1343,6.668,1346,8.556,1347,6.976,1361,6.033,1571,7.584,1924,10.372,2102,9.069,3129,11.217,3130,11.217,3131,11.217,3132,11.217,3133,11.217,3134,11.217]],["keywords/481",[]],["title/482",[33,153.915,181,317.157,480,428.201,932,541.649]],["content/482",[6,1.365,19,2.767,22,4.49,23,4.202,24,4.867,25,0.614,32,2.984,33,1.823,34,3.228,35,2.647,37,2.872,45,2.618,70,2.251,87,3.207,92,3.935,98,3.954,151,2.847,152,1.837,155,2.751,161,2.916,167,4.011,176,3.368,181,2.459,185,2.229,192,3.103,198,2.465,224,2.798,271,3.274,275,3.073,307,8.131,334,2.661,355,5.556,385,3.38,480,8.14,536,3.164,564,4.269,572,3.297,590,3.935,630,6.289,726,6.718,737,5.752,740,4.293,758,3.992,764,5.045,765,3.025,767,5.272,770,4.558,771,6.855,772,3.828,773,5.556,776,6.711,777,4.113,780,4.887,863,8.131,914,4.342,932,4.2,1103,6.458,1121,9.116,1262,8.665,1400,9.596,1402,6.718,1628,5.429,1894,10.754,1895,7.04,1897,11.399,2052,7.04,2057,6.345,2079,5.272,2220,8.076,3135,9.229,3136,9.229,3137,9.229,3138,9.229,3139,17.108,3140,8.534]],["keywords/482",[]],["title/483",[191,471.331,879,610.406]],["content/483",[6,1.389,25,1.386,33,2.243,37,1.585,44,2.628,63,2.07,70,3.498,97,3.313,100,3.495,107,4.261,114,2.744,122,4.143,124,3.535,149,5.949,152,1.879,156,4.998,181,6.076,184,2.047,185,4.19,199,4.519,200,3.521,202,2.903,222,5.283,225,3.383,240,3.202,255,3.847,264,2.736,273,2.07,278,3.861,281,3.66,301,3.269,311,4.043,314,3.348,315,3.074,379,4.318,409,6.02,425,3.395,480,3.395,486,5.61,512,3.863,514,3.383,515,4.661,523,5.076,536,3.236,537,4.7,544,3.521,545,3.972,554,4.519,563,4.043,617,4.998,638,5.443,656,5.61,705,5.497,706,4.819,708,5.943,713,6.102,717,4.519,718,5.82,732,5.018,742,4.272,763,4.819,857,7.375,863,5.443,872,4.754,892,5.8,893,6.03,923,6.189,932,6.526,985,4.39,1007,4.96,1057,7.631,1110,5.392,1121,6.102,1158,5.8,1183,5.203,1187,6.102,1207,5.443,1326,5.8,1427,5.036,1541,7.398,1562,6.87,1847,7.025,1890,7.398,2123,7.398,2176,7.398,2588,6.87,2705,7.91,3141,9.438,3142,8.727,3143,9.438,3144,9.438,3145,9.438,3146,9.438,3147,9.438,3148,9.438,3149,9.438,3150,9.438,3151,9.438]],["keywords/483",[]],["title/484",[25,79.157,97,417.878,544,444.09,618,731.52]],["content/484",[]],["keywords/484",[]],["title/485",[401,606.144,544,504.882,618,831.659]],["content/485",[63,4.126,70,4.588,79,9.963,96,10.649,235,11.702,399,10.285,428,10.119,512,7.702,536,6.451,544,7.02,556,6.721,618,14.185,732,6.583,893,7.911,986,12.935,1019,11.848,1227,12.338,1540,11.702,3152,18.815]],["keywords/485",[]],["title/486",[62,455.105,70,259.088,544,396.364,618,652.904,893,446.695]],["content/486",[70,5.093,107,3.945,149,6.661,181,5.564,182,3.204,192,5.399,240,3.586,264,4.656,265,5.777,278,4.323,315,5.231,330,3.861,391,8.089,392,9.714,425,5.777,490,6.381,539,7.47,544,5.991,618,9.869,661,10.244,675,7.47,706,8.2,708,10.112,709,9.869,713,10.383,717,7.689,785,4.897,923,10.531,1127,10.112,1161,12.588,1332,8.637,2095,11.238,2126,10.689,3153,13.459,3154,16.059,3155,16.059]],["keywords/486",[]],["title/487",[40,454.363,62,509.904,552,625.565,1007,625.565]],["content/487",[70,4.873,131,7.615,149,6.229,152,2.99,184,3.257,185,3.628,225,7.163,240,5.014,243,9.192,278,5.379,315,6.508,321,9.229,330,3.611,334,4.33,381,4.846,385,5.5,513,11.878,545,4.16,550,8.5,553,6.726,622,6.094,627,11.771,711,8.48,717,7.19,718,6.094,736,5.624,858,7.564,1011,10.154,1050,10.71,1116,7.464,1141,13.104,1239,12.585,1339,6.726,1377,7.025,1779,10.324,1803,11.178,3156,15.017,3157,15.017]],["keywords/487",[]],["title/488",[25,70.65,97,372.969,264,307.993,544,396.364,618,652.904]],["content/488",[25,1.403,97,7.408,177,10.851,246,6.666,407,10.29,544,7.873,618,12.969,891,11.632]],["keywords/488",[]],["title/489",[33,137.374,185,256.637,544,396.364,618,652.904,1676,982.391]],["content/489",[3,5.392,5,2.531,6,1.63,8,6.207,18,3.916,21,6.76,25,1.31,33,2.177,37,2.826,52,3.23,63,2.571,69,3.659,70,4.105,85,5.646,100,4.341,107,2.879,114,3.408,122,5.145,155,3.494,181,3.123,182,2.339,185,5.507,186,3.465,192,3.941,198,3.131,220,4.144,230,5.318,240,2.617,241,4.357,252,4.545,264,3.398,301,2.671,314,4.158,315,3.818,330,4.047,385,4.293,388,6.575,398,4.39,425,4.217,467,4.144,468,5.363,483,6.304,490,4.657,496,4.736,544,6.28,545,4.663,617,6.207,618,7.204,704,6.16,706,5.985,785,3.575,861,5.452,910,4.716,915,8.725,923,11.039,957,7.121,993,5.646,1110,6.696,1127,7.381,1173,6.968,1329,5.944,1330,9.188,1430,9.477,1603,8.941,1677,10.258,1989,8.725,2624,8.941,3158,9.477,3159,10.258,3160,11.722,3161,10.839,3162,10.839]],["keywords/489",[]],["title/490",[301,242.127,330,255.425,537,348.193,544,396.364,545,294.262]],["content/490",[4,1.272,6,1.188,18,4.1,25,1.462,33,1.587,44,4.844,51,2.937,63,2.692,69,3.832,88,4.209,99,4.324,116,7.184,152,2.444,166,6.655,183,3.866,184,2.662,185,2.965,230,3.878,240,2.741,246,3.878,273,4.431,281,7.835,301,2.797,311,5.258,329,5.47,330,4.858,360,7.012,371,6.403,373,3.165,381,3.961,393,6.602,400,5.527,425,6.258,500,8.589,537,4.023,543,4.545,544,6.49,545,4.818,593,9.621,614,5.309,622,4.981,683,8.589,688,7.457,718,7.059,740,5.709,762,9.136,858,6.182,921,6.357,982,9.283,1006,7.457,1065,7.221,1077,6.947,1081,7.543,1118,7.936,1176,7.012,1927,8.935,1969,9.621,2152,9.362,2288,8.299,2322,10.741,2736,10.741,3108,11.35,3163,12.274]],["keywords/490",[]],["title/491",[184,340.004,240,350.087]],["content/491",[4,0.769,5,1.602,6,1.44,25,1.237,33,0.96,37,1.246,44,3.31,69,3.711,70,1.81,88,4.076,107,2.92,116,4.909,131,6.028,152,1.477,161,2.344,181,4.53,182,1.481,184,2.578,185,4.494,186,2.193,205,4.418,222,4.055,225,6.669,226,6.07,230,2.344,240,4.432,255,3.024,278,4.003,301,3.389,314,4.217,315,3.872,321,7.305,330,4.773,347,5.468,348,4.2,356,3.452,361,4.162,387,4.322,391,3.738,392,5.529,395,3.12,398,4.452,425,4.276,440,5.498,455,3.553,457,5.018,462,2.949,489,5.524,499,3.9,520,3.359,529,4.2,536,2.544,537,4.873,539,3.452,543,2.748,544,4.435,545,4.119,556,2.651,564,3.432,565,4.2,613,2.614,617,3.93,618,7.305,622,3.011,632,4.366,634,5.292,637,4.239,652,3.553,663,4.091,696,4.615,706,3.789,717,3.553,732,2.596,745,6.498,786,3.179,856,9.614,857,6.112,861,3.452,884,6.923,892,4.561,893,3.12,923,4.866,961,4.091,993,3.574,996,3.359,1006,4.509,1035,4.509,1053,5.817,1055,7.391,1116,5.908,1155,5.018,1158,4.561,1173,4.411,1176,6.791,1189,9.248,1540,4.615,1562,5.402,1618,6.862,1620,6,1643,6,1782,5.292,1905,6.862,1984,4.734,2023,3.619,2589,7.305,2624,5.66,2671,4.866,3164,7.421,3165,7.421,3166,7.421,3167,11.342,3168,9.962,3169,9.318,3170,5.66,3171,7.421,3172,7.421]],["keywords/491",[]],["title/492",[250,635.181,544,444.09,554,569.907,618,731.52]],["content/492",[]],["keywords/492",[]],["title/493",[19,469.995,257,702.281]],["content/493",[23,3.423,46,4.861,152,4.766,167,8.684,183,4.73,188,8.423,224,4.553,330,3.611,496,6.068,538,9.932,545,4.16,611,9.456,622,6.094,716,5.422,734,10.064,735,6.762,748,12.141,806,7.233,811,11.178,820,10.324,821,12.141,824,10.509,825,10.154,974,9.579,1006,9.124,1093,12.141,1099,13.886,1170,7.668,1356,9.579,1430,12.141,1479,8.423,1769,12.585,3173,13.886,3174,10.154,3175,15.017,3176,19.982,3177,13.886,3178,15.017,3179,15.017]],["keywords/493",[]],["title/494",[19,469.995,99,552.327]],["content/494",[4,1.36,6,1.765,18,4.384,22,3.444,23,3.985,25,1.213,32,2.778,54,5.704,99,7.975,151,4.049,154,4.825,158,8.265,161,4.146,162,4.64,164,4.122,166,7.116,224,3.98,252,5.089,273,2.878,293,3.674,304,6.611,330,3.156,427,4.825,517,7.116,545,5.05,557,5.215,642,5.879,734,6.611,819,9.184,820,9.023,825,8.874,826,12.48,936,6.524,947,9.023,974,8.372,983,7.802,1006,7.974,1024,6.175,1061,8.163,1124,8.486,1170,9.31,1177,8.066,3174,8.874,3180,18.233,3181,13.125,3182,13.125,3183,13.125,3184,13.125,3185,13.125]],["keywords/494",[]],["title/495",[264,345.078,544,444.09,577,740.294,618,731.52]],["content/495",[4,1.188,5,3.576,6,1.604,18,3.829,25,0.762,37,3.266,52,3.159,69,3.579,70,4.744,88,3.931,161,3.621,176,4.184,181,3.055,184,2.486,205,4.304,206,4.081,225,6.973,226,5.854,240,4.758,265,4.124,271,4.066,277,9.554,278,3.086,315,3.734,326,12.985,330,2.756,394,5.813,395,4.82,398,4.293,427,4.214,544,6.181,618,10.181,622,4.652,632,6.744,663,6.319,689,6.267,693,5.135,695,5.661,703,6.181,718,4.652,732,4.011,745,6.267,806,5.522,855,6.814,861,7.705,865,7.518,869,7.518,958,5.303,993,5.522,1035,6.965,1128,8.345,1147,6.319,1173,9.847,1232,9.268,1310,6.676,1330,8.986,1656,7.63,1738,10.601,1779,7.881,1846,8.345,1889,7.219,1965,8.022,2023,5.59,2051,9.607,2588,8.345,2624,8.744,2779,7.045,3092,8.533,3110,9.607,3168,9.607,3186,9.268,3187,11.464]],["keywords/495",[]],["title/496",[225,485.1,226,690.985,227,695.85]],["content/496",[4,1.188,6,1.604,14,4.309,16,5.895,25,0.762,44,3.192,54,7.2,70,2.796,107,2.816,114,3.333,152,2.282,193,4.593,205,2.979,206,4.081,222,3.126,225,5.938,229,9.292,230,5.233,231,11.814,240,4.343,264,3.323,271,5.876,277,9.554,329,5.108,330,2.756,347,7.62,457,7.751,516,5.895,545,3.175,562,6.611,565,6.488,590,4.888,593,8.986,622,4.652,632,6.744,637,6.549,732,4.011,737,3.854,739,7.412,751,7.045,857,5.895,876,7.13,901,4.376,972,7.518,1042,7.412,1046,9.268,1108,7.751,1110,9.463,1116,5.698,1177,10.181,1219,5.522,1238,8.022,1310,9.648,1552,7.881,1558,7.045,1722,8.345,1731,9.607,1871,9.268,1889,7.219,1987,8.744,1989,8.533,2058,7.313,2152,8.744,2243,9.607,2259,10.032,2429,8.176,2779,7.045,2969,7.751,3188,10.601,3189,10.601,3190,10.601,3191,11.464,3192,11.464,3193,11.464,3194,11.464,3195,11.464,3196,8.986]],["keywords/496",[]],["title/497",[4,140.222,544,504.882,618,831.659]],["content/497",[4,1.78,19,3.615,44,3.358,70,2.941,107,2.963,181,3.214,222,3.289,230,3.81,240,3.836,264,3.497,278,3.247,301,2.749,314,4.278,322,7.357,334,3.478,484,6.765,501,8.834,531,6.593,537,3.953,544,4.5,545,3.341,618,10.559,650,6.956,664,6.034,692,6.159,693,5.402,697,7.694,717,5.775,732,6.011,785,5.239,875,6.387,905,7.17,957,10.438,1000,9.24,1035,7.328,1108,8.155,1127,10.819,1149,15.035,1158,7.412,1207,9.908,1238,8.44,1315,7.595,1394,10.108,1748,11.153,1767,10.108,1779,8.292,1782,8.602,1787,9.454,2023,8.378,2057,8.292,2301,7.694,2588,8.78,2625,9.2,3168,10.108,3196,13.467,3197,12.061,3198,12.061,3199,11.153,3200,12.061,3201,12.061,3202,9.751,3203,12.061,3204,12.061,3205,12.061,3206,12.061,3207,12.061,3208,12.061]],["keywords/497",[]],["title/498",[191,471.331,879,610.406]],["content/498",[25,1.606,29,5.121,46,3.997,70,4.944,97,4.335,105,6.694,107,4.291,125,4.886,162,4.365,171,3.224,181,3.29,190,5.775,191,3.712,193,4.947,265,4.442,297,3.503,301,2.814,315,4.021,392,5.743,398,4.624,462,4.906,523,9.395,537,4.047,544,6.517,545,3.42,618,12.458,622,5.01,637,7.053,648,7.775,660,6.926,708,7.775,717,5.912,735,5.559,740,5.743,853,7.053,861,5.743,872,6.219,883,9.471,884,7.191,885,12.716,886,6.24,892,7.588,893,5.191,923,8.097,993,5.947,1005,9.418,1067,8.348,1151,7.983,1165,8.097,1168,8.097,1330,9.678,1391,14.123,1595,7.679,2089,8.097,2532,10.348,2815,11.417,3209,12.347,3210,12.347,3211,12.347,3212,10.805,3213,12.347,3214,12.347]],["keywords/498",[]],["title/499",[25,63.794,33,124.043,200,357.9,264,278.105,1152,638.508,2141,611.918]],["content/499",[]],["keywords/499",[]],["title/500",[200,504.882,264,392.317,1152,900.729]],["content/500",[1,5.375,5,2.604,29,7.126,70,4.19,85,5.81,87,4.191,96,6.827,122,5.294,149,7.126,151,3.721,155,3.595,176,6.27,181,4.578,182,2.406,186,3.565,192,4.055,195,6.387,196,3.754,199,5.775,200,7.466,256,5.674,264,6.323,298,5.918,301,2.749,314,4.278,331,7.798,392,5.61,423,7.412,462,4.792,524,7.909,536,4.135,545,3.341,550,6.827,553,7.695,554,5.775,560,6.387,561,5.674,637,6.89,697,7.694,712,7.328,718,4.894,862,7.595,875,6.387,893,5.071,962,8.977,985,5.61,992,8.602,1030,5.918,1046,9.751,1069,10.108,1082,8.028,1152,8.028,1191,7.694,1427,6.436,1546,10.108,1610,7.501,1651,6.956,1872,6.487,2032,9.751,2124,10.555,2141,13.912,2240,11.153,2253,5.707,2430,10.108,3215,12.061,3216,12.061,3217,12.061,3218,12.061]],["keywords/500",[]],["title/501",[25,63.794,33,124.043,205,249.247,206,341.47,1066,511.905,2141,611.918]],["content/501",[6,1.963,25,1.51,33,1.985,70,3.743,105,8.322,107,3.77,162,5.426,182,3.062,185,3.708,200,5.727,205,3.988,206,5.464,227,7.893,249,8.688,252,5.952,255,6.256,265,5.522,301,3.498,414,6,438,5.748,536,5.263,537,5.031,553,6.875,565,8.688,613,5.407,659,7.061,705,8.939,717,7.349,866,9.03,963,5.928,1183,8.461,1435,11.425,1604,9.924,1677,13.432,1678,14.193,2141,12.932,2546,13.432,3219,15.349,3220,15.349,3221,15.349,3222,15.349]],["keywords/501",[]],["title/502",[25,89.993,886,483.395,1074,739.744]],["content/502",[6,2.151,23,3.498,25,1.102,33,1.133,34,2.006,37,1.471,65,2.872,70,4.04,87,3.045,88,3.005,107,3.328,114,2.547,151,2.704,155,2.612,161,2.768,164,4.255,171,2.288,181,2.335,182,2.703,183,5.217,185,3.273,192,2.946,202,2.696,205,3.52,206,4.823,219,3.257,225,3.141,256,4.123,265,3.152,273,4.419,281,6.423,284,3.109,297,2.486,301,3.775,314,3.109,330,3.258,348,7.669,379,6.199,392,4.076,396,2.863,414,3.425,490,3.482,537,4.441,543,5.017,545,2.427,553,6.069,554,4.196,564,4.053,613,4.773,617,4.64,622,5.498,707,5.925,716,3.164,717,4.196,732,4.74,734,4.414,735,3.946,740,4.076,758,3.79,765,2.872,804,4.247,910,3.526,914,4.123,919,6.132,920,4.64,921,4.538,937,3.827,956,5.518,985,4.076,1005,10.335,1056,5.518,1178,5.925,1180,5.265,1211,6.869,1237,6.379,1329,4.444,1603,6.684,1604,5.666,1623,5.925,1625,7.085,1636,6.132,1686,6.379,1747,5.925,1785,8.103,1935,6.869,1983,6.379,2032,7.085,2076,7.669,2117,5.747,2141,12.855,2160,7.669,3223,6.523,3224,8.103,3225,8.763,3226,7.085,3227,6.869,3228,7.669,3229,8.103,3230,8.763,3231,8.103]],["keywords/502",[]],["title/503",[4,110.083,25,70.65,200,396.364,264,307.993,1152,707.127]],["content/503",[6,1.758,12,6.332,25,1.502,29,7.532,99,6.397,196,5.652,200,6.775,248,9.845,251,10.096,252,7.041,255,7.401,264,5.264,291,8.694,323,10.01,529,10.278,541,8.855,714,12.087,1152,12.087,1159,15.218,1167,12.484,1297,12.278,2141,11.583,3232,18.159]],["keywords/503",[]],["title/504",[65,390.118,400,535.943,408,393.825,872,599.526]],["content/504",[2,3.183,5,1.876,6,2.403,10,3.439,25,1.522,33,1.124,37,1.459,44,3.748,51,2.079,52,2.394,65,2.848,107,2.135,114,2.526,155,2.59,176,3.171,181,2.315,184,4.963,191,2.612,196,2.705,197,6.198,205,5.216,207,4.79,208,7.359,219,7.462,235,5.405,239,8.413,240,4.482,255,3.542,265,3.126,275,4.482,297,2.465,301,1.981,308,2.813,319,3.872,334,2.506,385,3.183,395,3.654,400,3.913,408,6.642,414,3.397,427,3.195,438,3.254,467,3.072,473,6.468,474,5.012,477,7.84,514,3.115,519,4.674,536,2.98,537,2.848,554,4.161,562,5.012,564,4.02,613,7.48,617,7.128,639,4.136,660,4.874,703,3.242,705,5.061,732,3.04,920,4.602,937,5.879,963,5.199,982,7.183,985,4.042,987,10.653,1031,6.326,1056,5.472,1066,4.637,1174,5.28,1227,5.699,1295,6.812,1360,8.372,1361,4.674,1583,6.812,1653,7.605,1662,6.812,1671,7.026,1961,5.166,2117,5.699,2135,8.036,2141,11.836,3233,8.69,3234,8.69,3235,8.69,3236,6.812,3237,8.69]],["keywords/504",[]],["title/505",[25,79.157,202,366.157,563,509.904,1119,686.479]],["content/505",[]],["keywords/505",[]],["title/506",[6,131.019,185,326.9,480,486.819]],["content/506",[6,2.389,25,1.218,70,4.467,182,3.655,185,4.425,202,5.635,278,4.931,480,6.59,501,9.42,525,9.627,542,11.685,863,10.565,906,9.932,932,8.336,933,14.359,1056,11.535,1401,13.064,1687,14.81,2141,11.685,3202,14.81,3238,16.939]],["keywords/506",[]],["title/507",[60,504.882,63,296.762,514,485.1]],["content/507",[6,1.822,25,1.251,60,7.02,63,4.126,70,4.588,234,8.703,467,6.651,514,6.745,536,6.451,543,6.968,910,7.57,920,9.963,926,9.607,990,14.748,1142,13.696,2141,12.002,3239,18.815,3240,17.398,3241,18.815,3242,18.815]],["keywords/507",[]],["title/508",[217,483.395,556,483.395,742,612.527]],["content/508",[6,1.789,25,1.229,37,3.103,202,5.685,217,6.602,334,5.329,514,6.625,525,9.713,532,10.763,556,6.602,718,7.5,742,8.365,904,13.453,931,10.986,936,9.186,963,7.138,984,11.358,994,9.94,1050,13.18,1066,9.862,1672,14.942,2141,11.789]],["keywords/508",[]],["title/509",[116,491.54,278,320.414,330,286.181,356,553.65]],["content/509",[6,1.822,25,1.251,70,4.588,99,6.628,265,6.768,301,4.288,330,5.549,348,10.649,356,8.751,438,7.046,537,6.167,545,5.211,717,9.008,920,9.963,1005,14.352,1056,11.848,1066,10.04,2141,12.002,2160,16.465]],["keywords/509",[]],["title/510",[988,1328.96]],["content/510",[6,1.217,25,1.477,70,4.992,107,3.088,155,3.747,181,3.349,182,2.508,183,3.959,184,2.726,185,3.037,196,6.915,198,3.358,200,6.6,202,3.867,255,5.123,264,3.644,265,6.364,273,2.757,304,6.331,347,5.783,371,6.558,480,4.522,525,6.606,536,4.31,550,7.115,553,5.631,563,5.385,617,6.657,640,8.965,706,9.033,732,4.398,860,7.637,893,7.439,910,5.058,914,8.323,1005,9.588,1056,7.916,1152,8.367,1163,10.535,1167,8.642,1172,8.965,1610,7.818,1623,8.499,1683,11.624,1684,10.535,1686,9.15,1998,16.359,2118,8.499,2141,14.171,2302,11.001,3238,11.624,3243,10.535,3244,12.57,3245,11.624,3246,12.57,3247,12.57,3248,12.57,3249,12.57]],["keywords/510",[]],["title/511",[191,471.331,879,610.406]],["content/511",[4,1.556,19,4.502,25,1.658,33,1.942,51,3.594,87,5.219,105,10.834,125,5.942,152,2.99,171,3.921,191,4.514,196,4.674,200,5.603,222,4.095,257,6.726,264,4.354,265,5.402,293,5.593,366,7.233,398,5.624,523,10.747,853,11.415,872,7.564,879,7.779,882,9.229,883,10.834,884,8.746,886,5.364,887,8.746,937,6.559,993,7.233,994,8.077,995,10.71,996,6.797,997,10.931,998,10.71,1152,9.996,1154,11.771]],["keywords/511",[]],["title/512",[25,79.157,33,153.915,99,419.316,182,237.492]],["content/512",[]],["keywords/512",[]],["title/513",[7,371.572,25,79.157,33,153.915,1066,635.181]],["content/513",[6,2.281,7,5.173,25,1.417,33,2.756,52,4.566,99,5.837,107,4.07,113,7.707,181,4.415,182,3.306,184,3.593,202,5.097,234,7.664,252,8.264,265,5.961,278,4.46,284,7.559,437,6.503,462,6.584,514,5.94,541,8.08,614,7.167,637,9.466,1067,11.204,1068,9.85,1077,9.379,2118,11.204,3250,16.57,3251,16.57]],["keywords/513",[]],["title/514",[25,123.921]],["content/514",[6,2.012,7,4.975,25,1.06,33,3.168,63,3.495,70,3.886,183,5.019,196,4.96,198,4.257,205,4.141,240,3.558,252,6.18,255,6.495,284,8.202,308,5.158,311,6.827,330,3.831,348,9.02,366,7.676,371,8.313,396,5.207,399,8.711,536,5.464,553,7.138,613,5.614,621,11.365,622,6.467,785,4.86,920,8.439,1068,9.473,1127,10.035,1166,10.451,1336,13.946,2076,13.946]],["keywords/514",[]],["title/515",[6,131.019,278,364.276,284,480.028]],["content/515",[6,2.358,25,1.044,33,2.03,44,4.371,99,5.529,125,8.141,202,4.828,246,4.959,278,4.225,279,9.33,284,7.298,297,4.453,322,5.77,330,3.774,334,4.526,425,5.647,520,7.105,525,8.249,538,7.802,545,4.348,593,12.304,622,6.37,712,9.536,732,5.492,858,7.906,910,6.315,973,8.442,991,8.652,1035,9.536,1061,9.762,1078,12.69,1170,8.015,1239,13.154,1377,7.342,1407,11.973,1604,10.148,3252,15.696]],["keywords/515",[]],["title/516",[107,332.397,185,326.9,732,473.461]],["content/516",[5,3.494,6,2.032,25,1.549,33,2.093,70,3.947,107,3.975,151,4.993,155,4.824,176,5.906,181,4.312,182,4.188,185,5.627,186,4.784,192,5.441,314,7.445,330,3.891,438,6.061,466,8.443,490,6.43,545,4.483,553,7.249,564,7.486,613,5.701,652,7.749,704,8.505,717,7.749,985,7.528,1003,13.084,1172,11.542,1296,13.084,3253,16.184]],["keywords/516",[]],["title/517",[6,151.799,184,340.004]],["content/517",[6,2.032,25,1.076,33,2.093,65,5.304,69,5.052,70,3.947,155,4.824,182,3.229,184,4.552,205,5.453,219,7.802,240,3.614,246,5.113,256,7.614,288,7.992,293,4.53,301,3.688,330,3.891,334,4.666,427,5.949,537,5.304,541,7.892,550,9.16,588,12.345,613,7.394,893,6.805,987,10.464,1081,9.946,1118,10.464,3224,14.965,3254,16.184,3255,13.563,3256,16.184]],["keywords/517",[]],["title/518",[183,493.826,273,343.83]],["content/518",[6,2.042,18,4.44,23,3.937,25,0.884,33,1.719,34,3.043,44,3.701,161,4.199,164,5.776,171,3.471,183,7.527,196,4.137,202,4.089,252,5.154,273,5.241,276,8.076,301,3.029,330,5.473,396,4.343,425,4.782,438,4.978,543,7.811,545,5.095,712,8.076,716,4.799,734,6.695,751,8.169,758,5.749,804,6.442,856,8.594,858,6.695,910,5.348,973,7.149,1035,8.076,1066,7.093,1170,6.787,1747,8.987,1931,8.37,3226,10.747,3227,10.419,3228,11.632,3229,12.292]],["keywords/518",[]],["title/519",[281,524.746,297,383.895,379,619.122]],["content/519",[6,2.063,25,1.102,51,3.965,65,5.431,69,5.173,70,4.041,155,4.939,182,4.252,200,6.182,246,5.235,281,9.976,288,8.183,293,4.638,297,4.701,330,3.984,379,7.581,466,8.644,536,5.681,564,7.664,614,7.167,617,8.774,717,7.934,785,5.053,893,6.967,963,6.4,985,7.707,1118,10.714,1178,11.204,1668,12.989]],["keywords/519",[]],["title/520",[25,70.65,33,137.374,99,374.253,467,375.547,670,595.91]],["content/520",[1,6.597,4,1.534,6,1.916,18,4.945,25,1.483,33,3.078,37,3.323,52,4.079,92,6.312,99,5.215,110,6.53,182,2.954,200,5.523,202,4.554,252,5.74,255,6.033,265,5.326,278,3.985,284,5.251,293,5.54,310,6.701,398,5.544,437,8.751,467,5.233,474,8.538,481,8.161,536,5.076,540,11.019,551,6.736,563,6.342,637,8.457,699,9.572,991,8.161,1000,7.962,1017,11.019,1032,10.177,1068,8.8,1082,9.853,1589,11.019,2616,12.955]],["keywords/520",[]],["title/521",[25,79.157,52,327.97,96,673.714,99,419.316]],["content/521",[4,1.94,6,1.321,25,1.245,40,5.207,41,9.223,52,6.341,61,7.336,63,2.991,99,6.596,114,3.965,182,2.722,196,4.246,222,5.106,252,5.289,255,5.559,256,6.417,275,4.542,279,8.108,284,4.839,293,3.818,308,4.415,322,6.883,334,3.933,393,7.336,408,6.195,487,8.589,496,5.512,536,4.677,549,7.169,559,8.701,587,8.701,659,6.275,692,6.965,699,8.819,700,10.153,712,8.287,732,4.772,858,6.87,893,5.735,956,8.589,986,9.378,1037,9.728,1068,8.108,1164,8.383,1234,11.432,1581,12.613,1984,8.701,2486,12.613,2909,12.613,2962,12.613,3257,12.613,3258,13.641,3259,13.641]],["keywords/521",[]],["title/522",[4,123.338,25,79.157,99,419.316,182,237.492]],["content/522",[12,4.181,22,5.235,23,4.082,24,5.906,25,1.53,29,8.274,32,2.538,34,2.746,35,4.907,37,2.013,54,7.436,99,6.027,124,7.47,125,4.745,182,2.393,241,4.457,255,4.887,275,3.993,291,5.741,355,4.726,408,3.968,467,7.689,481,6.61,529,6.787,600,12.863,776,8.144,777,5.344,779,7.982,786,5.137,879,4.669,981,9.774,1061,7.458,1075,8.926,1256,9.684,1257,5.486,1400,9.597,1663,6.667,1704,7.551,1769,10.05,1814,7.551,1942,9.4,3260,11.992,3261,11.992,3262,11.089,3263,10.05]],["keywords/522",[]],["title/523",[4,123.338,25,79.157,99,419.316,517,645.355]],["content/523",[6,1.677,19,3.658,23,4.094,25,0.811,32,4.262,60,4.553,99,4.299,149,5.061,161,5.473,164,5.44,171,3.186,183,3.843,224,5.253,251,6.785,252,4.732,273,3.799,284,4.328,291,5.842,293,3.416,330,2.934,425,4.39,517,11.887,543,4.519,545,3.38,581,5.178,622,4.952,854,9.565,879,4.751,937,5.329,973,6.563,1035,7.413,1061,10.774,1320,6.563,2354,10.226,3264,10.678,3265,10.678,3266,12.202,3267,12.202,3268,17.323,3269,12.202,3270,17.323,3271,11.284,3272,12.202,3273,12.202,3274,10.226,3275,12.202,3276,12.202,3277,12.202,3278,12.202,3279,12.202,3280,9.865,3281,12.202,3282,12.202,3283,12.202,3284,12.202]],["keywords/523",[]],["title/524",[25,79.157,65,390.118,400,535.943,408,393.825]],["content/524",[2,3.939,4,2.282,5,3.414,6,1.815,20,4.817,21,6.202,25,1.051,33,2.425,37,3.698,51,4.947,52,2.963,54,4.674,58,3.939,65,3.524,69,3.357,70,2.623,85,7.616,86,4.345,98,6.773,99,6.606,100,8.157,113,5.002,114,3.126,125,4.255,149,4.461,196,4.921,222,2.932,232,6.392,234,4.974,246,3.397,248,5.83,256,5.059,264,3.118,275,5.265,293,3.01,308,3.481,334,3.101,395,4.522,399,5.878,400,8.443,408,7.288,420,6.533,437,4.22,467,3.801,491,11.51,492,7.271,506,5.83,514,3.855,536,3.687,539,5.002,614,4.651,672,6.688,716,3.882,785,3.279,874,7.01,963,4.153,983,6.392,1019,6.771,1110,6.143,1173,6.392,1181,9.411,1185,8.694,1413,9.012,1434,8.203,1670,9.411,2731,8.203,3285,10.754,3286,10.754]],["keywords/524",[]],["title/525",[6,92.877,25,63.794,205,249.247,219,356.567,240,214.197,613,337.935]],["content/525",[3,6,6,1.758,25,1.207,45,5.924,65,4.275,107,3.204,114,3.792,155,3.888,181,4.837,184,4.528,192,4.385,196,4.059,204,6.171,205,5.425,219,4.848,225,4.675,226,6.66,227,6.707,240,4.663,241,4.848,246,4.12,288,6.441,297,3.7,310,5.904,314,6.44,330,3.136,334,3.761,427,4.795,490,5.182,519,7.015,536,4.472,550,7.382,551,5.935,554,6.245,613,7.953,622,5.293,732,4.563,785,3.977,894,6.957,914,6.136,931,7.753,985,6.067,987,8.433,1019,8.213,1067,8.819,1118,8.433,1148,9.127,1296,10.545,1630,11.414,2055,10.931,2117,8.553,2136,9.127,3287,13.043]],["keywords/525",[]],["title/526",[25,79.157,202,366.157,563,509.904,1119,686.479]],["content/526",[5,3.757,6,2.452,25,1.157,70,4.244,87,6.047,155,5.187,181,4.636,185,5.311,202,5.353,278,4.684,297,4.936,480,7.909,532,10.134,564,8.049,863,12.68,899,12.666,906,9.434,914,8.186,931,10.343,932,7.918,934,10.694,1190,13.64,1299,12.666]],["keywords/526",[]],["title/527",[60,504.882,63,296.762,514,485.1]],["content/527",[6,1.789,25,1.229,33,2.39,60,8.517,63,4.053,92,7.88,273,4.053,293,5.173,393,9.94,419,11.228,424,11.949,514,6.625,525,9.713,550,10.46,590,7.88,718,7.5,737,6.213,926,9.437,963,7.138,1238,12.933,1427,9.862]],["keywords/527",[]],["title/528",[217,483.395,556,483.395,742,612.527]],["content/528",[2,6.891,25,1.251,33,2.433,37,3.159,63,4.126,182,3.754,186,5.561,217,6.721,232,11.184,512,7.702,556,6.721,703,7.02,718,7.635,742,8.516,921,9.744,944,10.554,994,10.119,1045,14.352,1119,10.851,1129,15.212]],["keywords/528",[]],["title/529",[116,491.54,278,320.414,330,286.181,356,553.65]],["content/529",[6,1.728,25,1.187,40,6.813,116,9.225,151,5.506,196,5.555,202,5.49,278,4.804,293,4.996,301,4.068,330,5.371,356,8.302,438,6.684,537,5.85,538,8.871,545,4.944,551,8.122,734,8.989,735,8.036,987,11.54,1035,10.843,1128,12.992,1170,9.113,2968,16.504]],["keywords/529",[]],["title/530",[988,1328.96]],["content/530",[6,2.042,25,1.514,33,1.719,70,3.242,99,8.019,107,3.265,113,6.183,181,3.542,182,4.208,196,6.565,198,3.551,200,4.959,202,4.089,252,5.154,255,7.497,265,4.782,278,3.578,284,6.525,297,3.771,301,3.029,348,7.524,428,7.149,437,5.217,462,5.281,537,4.357,541,6.482,553,5.954,566,9.138,613,4.683,617,7.039,640,9.48,706,6.787,860,8.076,892,8.169,893,5.589,910,5.348,914,6.253,961,7.327,963,5.134,992,9.48,999,9.676,1005,10.139,1067,8.987,1068,7.901,1159,11.14,1163,11.14,1187,8.594,1684,11.14,1686,9.676,3288,13.292,3289,13.292,3290,13.292]],["keywords/530",[]],["title/531",[191,471.331,879,610.406]],["content/531",[4,1.579,19,4.567,25,1.666,33,1.97,51,3.646,87,5.295,99,5.368,105,10.939,125,6.029,152,3.034,171,3.979,191,4.58,196,4.742,222,4.155,265,5.481,293,5.648,366,7.339,398,5.706,523,12.166,853,11.526,872,7.674,879,7.855,882,9.364,883,10.939,884,8.874,886,5.443,887,8.874,937,6.655,993,7.339,994,8.195,995,10.867,996,6.897,997,11.091,998,10.867,1154,11.944]],["keywords/531",[]],["title/532",[25,63.794,33,124.043,52,264.317,99,337.935,264,278.105,462,381.156]],["content/532",[]],["keywords/532",[]],["title/533",[52,513.439]],["content/533",[5,4.601,6,2.063,33,2.143,37,3.578,51,3.965,52,4.566,181,4.415,182,3.306,186,4.898,200,6.182,222,4.518,232,9.85,286,10.183,293,4.638,297,4.701,308,5.364,322,7.834,395,6.967,501,8.52,556,5.919,557,6.584,563,7.098,572,5.919,630,6.091,659,7.622,692,8.461,694,8.236,695,8.183,911,10.57,1329,8.403,2095,11.595]],["keywords/533",[]],["title/534",[4,140.222,52,372.867,99,476.718]],["content/534",[4,1.857,5,2.764,6,2.282,9,5.857,12,4.464,23,1.951,40,6.84,44,3.565,52,4.937,63,2.807,69,3.996,70,4.37,79,6.779,97,4.494,99,4.51,107,4.402,149,7.433,151,3.95,181,3.411,182,3.575,184,2.776,185,5.41,192,4.304,193,5.129,205,4.656,206,4.557,240,4.001,243,5.889,272,5.458,273,2.807,298,6.282,334,3.691,373,3.302,385,4.689,490,5.087,520,5.795,525,6.728,559,8.166,675,5.955,704,6.728,709,7.868,713,8.277,716,4.622,718,5.195,719,8.801,893,5.383,914,6.023,924,8.166,1000,6.886,1062,9.529,1064,8.959,1197,8.959,1398,8.062,3291,11.838,3292,11.838,3293,11.838]],["keywords/534",[]],["title/535",[4,140.222,52,372.867,510,686.235]],["content/535",[4,0.965,5,2.01,6,0.902,14,3.5,16,4.788,25,1.28,37,1.563,51,2.228,52,6.447,58,5.199,63,2.042,88,3.193,92,3.97,99,3.28,110,6.262,114,2.707,125,5.617,142,5.478,152,2.826,155,2.776,182,1.858,183,6.06,186,2.752,195,4.931,196,5.354,202,4.367,222,3.871,246,2.942,252,3.611,256,4.381,264,2.699,265,3.35,273,4.542,278,2.507,281,6.671,286,5.723,293,2.607,297,4.88,300,5.133,308,6.705,310,4.215,319,4.149,322,3.423,330,2.239,364,5.049,389,4.788,390,6.931,398,3.487,425,3.35,438,3.487,462,3.7,479,5.595,480,3.35,485,7.299,506,5.049,510,4.722,536,4.867,539,4.331,543,3.448,545,2.579,549,4.894,553,4.171,559,5.94,563,6.081,587,5.94,614,4.027,630,3.423,634,6.641,659,4.283,692,4.755,700,10.566,703,3.474,727,6.516,728,8.149,738,6.02,742,4.215,943,4.894,951,8.149,963,3.596,996,4.215,1072,6.516,1164,5.723,1169,4.26,1335,7.299,1547,6.198,1697,5.27,1720,8.149,2114,6.106,2731,7.103,3294,8.61,3295,8.61,3296,9.312,3297,9.312,3298,8.61,3299,9.312,3300,8.61,3301,8.61]],["keywords/535",[]],["title/536",[25,79.157,99,419.316,171,310.82,191,357.826]],["content/536",[25,1.336,41,13.58,52,5.534,99,7.075,111,7.579,171,5.245,191,6.038,202,6.178,272,8.563,322,7.383,400,9.043,462,7.98,529,11.368]],["keywords/536",[]],["title/537",[25,104.266,29,650.349]],["content/537",[25,1.625,28,10.568,29,10.136,30,9.73,107,5.08,722,12.308]],["keywords/537",[]],["title/538",[33,174.985,198,361.493,224,410.309]],["content/538",[4,1.06,19,3.065,22,3.998,23,4.213,24,5.258,25,1.013,32,3.224,33,2.354,34,3.488,35,5.785,37,3.387,52,2.818,63,2.242,99,3.602,103,4.557,111,3.859,114,5.292,171,2.67,191,3.074,198,2.732,204,4.839,224,3.1,264,4.416,271,3.627,275,6.062,289,4.756,293,2.862,334,2.948,355,4.03,440,4.73,462,4.063,467,3.615,510,5.185,536,3.506,572,3.653,590,4.36,607,5.544,630,7.416,723,6.914,758,4.423,763,5.221,764,5.59,765,5.967,766,12.316,767,5.842,768,10.4,769,7.444,770,5.05,771,7.294,772,4.242,773,7.174,774,5.59,775,4.896,776,7.25,777,4.557,779,6.806,780,5.415,1540,6.36,3302,9.456]],["keywords/538",[]],["title/539",[784,1141.31,785,478.129]],["content/539",[23,4.255,32,4.464,33,1.45,34,5.659,35,6.704,63,2.46,171,2.929,462,8.38,490,4.457,545,3.107,642,5.024,659,5.16,682,13.184,768,6.408,784,8.165,785,3.421,786,4.805,787,7.903,788,9.4,789,13.666,790,9.816,791,9.816,792,6.469,793,9.816,794,14.27,795,9.816,796,9.816,797,14.27,798,9.816,799,11.21,800,7.849,801,9.4,802,9.816,803,16.813,804,9.311,805,12.599,806,7.855,807,9.069,808,9.4,809,5.539,810,9.816]],["keywords/539",[]],["title/540",[273,261.029,284,422.228,545,329.694,735,535.943]],["content/540",[4,1.865,6,1.743,25,1.494,99,6.342,182,3.592,183,5.67,204,8.518,265,6.476,273,3.948,284,6.386,289,8.373,293,5.039,301,4.103,419,10.937,517,9.76,537,5.9,562,10.382,722,9.067,732,6.298,735,8.106,826,9.924,936,8.948,961,9.924,3303,13.731]],["keywords/540",[]],["title/541",[99,419.316,183,374.904,517,645.355,722,599.526]],["content/541",[6,1.604,19,3.436,22,3.009,23,4.177,25,0.762,32,4.116,51,2.743,97,4.025,99,5.836,151,3.537,161,5.233,164,6.691,183,5.218,192,3.854,198,3.062,224,5.023,255,4.672,273,3.633,281,4.445,284,4.066,330,3.983,360,6.549,396,3.745,399,6.267,425,4.124,538,8.234,544,4.277,545,4.588,553,5.135,722,5.774,735,5.162,768,6.549,819,8.022,820,7.881,824,8.022,825,7.751,1033,8.345,1061,12.098,1170,5.854,3304,13.883,3305,13.883,3306,9.607,3307,10.601,3308,9.268,3309,10.601,3310,10.601,3311,10.601,3312,9.607,3313,10.032,3314,10.032,3315,10.032,3316,10.601,3317,11.464,3318,9.607,3319,9.607,3320,8.986]],["keywords/541",[]],["title/542",[826,864.293,3303,1195.939]],["content/542",[4,1.103,6,1.031,22,4.892,23,4.113,24,5.417,25,1.24,28,4.603,29,6.509,30,5.007,32,3.321,33,1.376,34,2.437,35,3.052,37,1.787,44,2.964,99,3.75,107,2.614,151,3.284,161,3.362,164,3.342,171,2.779,182,2.124,191,3.2,224,3.227,251,5.918,252,4.127,255,4.338,256,5.007,273,2.334,275,3.544,284,7.297,293,2.979,297,3.019,330,2.559,360,6.08,385,3.898,407,5.19,425,3.829,496,4.301,536,3.649,545,2.948,714,7.084,732,3.724,764,5.818,768,6.08,776,7.469,777,4.743,819,7.448,820,7.317,825,7.197,826,12.092,845,6.98,847,8.605,848,8.343,849,8.343,858,5.361,954,5.594,969,7.197,970,8.119,1077,6.024,1170,5.435,3303,15.691,3306,8.92,3308,8.605,3315,9.314,3321,10.644,3322,14.511,3323,8.92,3324,9.842,3325,10.644]],["keywords/542",[]],["title/543",[19,356.811,25,79.157,52,327.97,99,419.316]],["content/543",[4,2.34,19,5.443,25,1.634,67,7.306,85,8.747,99,6.397,182,4.505,255,7.401,291,8.694,349,11.741,523,9.767,554,8.694,580,8.353,621,12.951,853,12.9,854,14.234,855,10.794,1341,14.681,3212,15.891]],["keywords/543",[]],["title/544",[25,89.993,202,416.281,563,579.706]],["content/544",[4,1.567,6,2.419,25,1.499,33,1.956,37,3.371,184,3.28,185,3.654,201,5.842,202,4.653,222,4.125,265,5.442,278,4.072,330,3.637,425,5.442,435,9.186,480,5.442,481,8.338,514,5.422,536,5.186,553,6.775,556,5.403,563,6.48,613,5.329,614,6.542,652,7.242,742,9.088,765,4.958,856,9.78,857,7.778,861,7.036,869,9.919,872,7.619,932,6.883,1747,10.227,1782,10.788,3326,15.126,3327,15.126,3328,15.126]],["keywords/544",[]],["title/545",[52,432.005,703,584.959]],["content/545",[5,3.886,6,1.743,37,3.022,51,5.374,52,6.188,61,9.682,63,3.948,222,4.909,391,11.312,462,7.153,674,6.593,683,12.597,703,9.564,861,8.373,945,14.111,1025,13.731,1165,11.805,1558,11.063,3329,16.646]],["keywords/545",[]],["title/546",[52,432.005,179,779.313]],["content/546",[25,1.549,37,3.524,58,5.928,62,6.933,63,4.603,98,6.933,99,5.701,100,5.993,122,7.103,142,9.521,179,8.044,182,3.229,222,4.413,287,8.044,297,4.591,308,5.239,334,4.666,395,6.805,437,6.352,533,9.16,536,7.197,562,9.334,827,9.946,871,13.084,872,8.151,873,9.724,874,10.327,877,8.998,1000,8.704,1019,10.191,3330,14.965]],["keywords/546",[]],["title/547",[37,199.834,51,284.834,63,261.029,689,650.672]],["content/547",[25,1.389,37,3.507,40,7.974,51,4.999,63,4.581,114,6.073,193,8.37,554,10.002,878,13.699]],["keywords/547",[]],["title/548",[191,471.331,879,610.406]],["content/548",[4,2.051,23,2.256,25,1.65,52,5.453,99,5.215,181,3.944,182,2.954,196,4.608,198,3.955,200,5.523,202,4.554,234,6.847,256,6.964,265,5.326,273,3.246,281,5.74,284,5.251,304,7.456,322,5.442,385,5.422,398,5.544,462,5.882,496,5.982,523,7.962,563,6.342,617,7.839,642,6.631,659,6.81,692,7.559,738,9.572,853,8.457,857,7.612,883,8.026,884,8.622,885,10.776,910,5.956,912,7.723,931,8.8,937,6.465,996,6.701,1171,10.177,1583,11.604,2515,11.019,3331,13.689]],["keywords/548",[]],["title/549",[58,389.113,99,374.253,480,563.738,3332,1062.382]],["content/549",[]],["keywords/549",[]],["title/550",[23,206.245,480,486.819,2089,887.426]],["content/550",[6,2.23,70,3.857,87,5.496,155,4.714,176,5.772,182,3.155,192,5.317,228,6.907,385,5.793,480,8.789,551,7.197,556,5.649,674,5.793,718,6.418,855,9.401,863,9.121,869,10.371,906,11.21,914,7.44,1088,14.624,1103,11.067,1140,11.772,1147,8.718,1299,11.512,1401,11.279,1402,11.512,2057,10.873,2146,11.512,2592,14.624,3202,12.786,3324,14.624,3333,12.786,3334,15.815,3335,15.815,3336,15.815]],["keywords/550",[]],["title/551",[58,435.966,99,419.316,480,428.201,878,780.572]],["content/551",[4,1.451,5,3.024,6,2.099,25,0.932,33,2.466,37,3.201,44,3.9,45,3.974,58,7.94,69,4.373,98,6.001,99,7.637,100,5.187,110,8.411,185,3.384,200,5.226,222,3.82,241,5.207,255,5.709,265,5.039,297,3.974,308,4.534,400,6.307,458,6.515,480,9.035,551,6.374,556,5.004,557,5.566,614,6.058,894,5.368,932,8.677,969,9.471,970,10.685,971,8.326,1121,12.328,1262,8.608,1900,10.426,3337,14.007,3338,14.007,3339,11.325,3340,12.953,3341,14.007]],["keywords/551",[]],["title/552",[25,63.794,58,351.353,99,337.935,171,250.496,191,288.379,480,345.096]],["content/552",[]],["keywords/552",[]],["title/553",[25,70.65,29,440.672,45,301.381,334,306.314,1300,488.703]],["content/553",[25,1.588,28,10.326,29,10.612,44,5.539,45,5.643,480,7.156,1121,12.862,1262,12.225,3342,19.893,3343,18.395]],["keywords/553",[]],["title/554",[25,63.794,33,124.043,108,500.434,171,250.496,191,288.379,480,345.096]],["content/554",[1,3.507,2,5.662,4,2.111,6,0.762,10,4.929,19,3.734,20,5.579,22,4.057,23,4.195,24,4.299,25,1.169,32,2.636,33,1.018,34,2.852,35,2.257,37,3.715,45,5.778,58,2.882,62,3.371,63,1.726,100,4.612,114,3.621,151,2.428,161,2.486,167,3.42,171,2.055,186,2.326,191,2.366,198,3.327,200,2.936,203,7.839,204,3.724,223,4.046,224,2.386,271,2.791,308,2.547,334,2.269,355,4.908,378,4.728,381,2.539,402,4.538,437,3.089,480,5.561,481,4.338,529,4.454,536,2.698,537,2.579,564,3.64,572,2.811,590,3.355,607,4.267,630,6.461,758,3.404,763,4.018,765,5.066,767,4.496,770,3.886,771,6.193,772,3.264,773,6.092,774,4.302,775,3.768,777,3.507,780,4.167,932,5.668,936,3.911,1089,4.538,1121,9.995,1262,4.836,1400,4.414,1540,4.894,1612,9.271,1628,4.629,1894,9.501,1895,6.003,2913,5.857,3343,11.518,3344,7.869,3345,7.277,3346,12.455,3347,7.869,3348,7.277,3349,7.277,3350,7.869,3351,10.9,3352,10.9]],["keywords/554",[]],["title/555",[6,102.858,273,232.977,480,382.183,787,514.862,1308,601.311]],["content/555",[4,1.092,5,4,6,2.351,23,4.023,32,3.921,33,2.014,34,4.687,44,2.934,68,5.537,164,3.309,167,4.579,171,2.751,191,3.167,234,7.204,273,4.79,355,4.152,425,3.79,458,4.901,480,8.737,490,4.186,496,4.257,516,8.009,527,5.418,545,4.314,556,5.564,732,3.686,737,7.687,765,3.453,771,4.221,787,5.106,804,5.106,806,5.075,863,6.076,1112,6.263,1321,8.83,1417,8.514,1690,7.514,1900,13.791,2079,6.019,2717,8.037,2927,9.807,3345,9.743,3351,13.63,3352,13.63,3353,10.536,3354,10.536,3355,10.536,3356,9.743,3357,9.22,3358,10.536,3359,10.536,3360,10.536,3361,9.743]],["keywords/555",[]],["title/556",[58,389.113,85,511.73,99,374.253,480,382.183,855,631.517]],["content/556",[4,1.696,5,3.534,6,1.742,8,3.68,14,2.613,19,2.083,22,2.959,23,3.683,25,0.462,32,3.011,33,0.899,34,3.748,37,1.893,44,1.935,45,4.036,46,2.25,58,6.591,63,3.12,79,3.68,98,6.094,99,5.766,103,3.097,121,4.176,131,3.525,151,2.144,152,1.384,155,4.241,161,2.196,162,2.457,167,3.021,176,2.536,184,1.507,196,3.509,200,2.593,203,3.525,215,3.653,219,2.583,220,2.457,240,1.552,243,3.197,264,2.015,273,1.524,278,1.871,297,1.972,308,2.25,381,2.243,392,3.233,398,2.603,425,2.5,437,2.728,454,4.494,480,7.861,514,2.492,520,5.104,613,2.448,622,4.576,630,2.555,631,4.048,682,5.619,737,2.337,740,3.233,763,3.549,764,3.799,765,2.278,771,2.785,804,3.368,806,3.348,926,3.549,932,8.769,934,4.271,937,3.036,985,3.233,996,5.104,1000,7.652,1121,4.494,1147,3.831,1151,4.494,1191,4.434,1211,5.448,1220,6.441,1238,4.864,1298,6.775,1400,10.093,1401,8.041,1407,5.302,1580,5.173,1663,3.864,1690,4.957,1796,4.223,1822,5.173,1850,4.957,2023,5.498,2728,5.302,2927,4.377,3340,16.639,3349,6.427,3351,6.082,3356,6.427,3357,6.082,3362,6.95,3363,6.95,3364,6.95,3365,6.95,3366,6.95,3367,9.282,3368,6.082,3369,6.427,3370,6.95,3371,6.95,3372,9.45,3373,6.95,3374,11.276,3375,4.626,3376,6.95,3377,14.226,3378,16.368,3379,6.95,3380,9.867,3381,11.276]],["keywords/556",[]],["title/557",[191,471.331,879,610.406]],["content/557",[4,2.27,6,1.384,16,7.351,19,4.285,23,2.179,25,1.68,33,1.849,45,5.484,58,8.023,63,3.135,70,3.486,85,6.886,97,5.019,99,7.717,182,2.852,222,3.898,398,7.24,462,5.68,480,6.955,523,7.689,541,6.971,622,5.801,642,6.403,740,6.649,853,8.167,855,8.498,857,9.941,879,5.566,883,7.751,884,8.326,885,10.406,894,5.478,932,6.505,937,6.244,993,6.886,1039,10.904,2515,10.641,3382,14.296,3383,13.219,3384,14.296]],["keywords/557",[]],["title/558",[23,113.237,25,49.41,37,124.737,181,197.97,264,215.398,275,247.396,481,409.573,563,318.282,3385,540.846]],["content/558",[]],["keywords/558",[]],["title/559",[5,207.102,6,92.877,275,319.419,1160,486.458,1300,441.279,3385,698.297]],["content/559",[4,0.844,5,2.763,6,2.001,22,2.138,23,3.863,30,6.022,32,2.709,40,3.11,44,2.268,51,3.063,54,3.54,60,3.039,63,1.786,67,3.278,69,2.543,70,3.122,88,2.793,99,4.509,107,2.001,151,2.513,158,5.13,161,4.044,164,5.626,171,3.342,181,3.41,230,2.574,264,2.362,273,1.786,275,7.199,278,2.193,281,3.159,289,3.789,308,2.637,315,2.653,334,2.349,421,4.219,499,4.281,527,6.582,529,4.611,556,4.572,557,3.237,563,5.483,572,2.91,577,5.067,581,3.457,613,2.87,614,3.523,643,5.81,650,4.698,668,4.219,674,2.984,693,3.649,694,4.049,695,4.023,703,3.039,736,3.051,739,8.276,858,4.103,887,7.455,921,4.219,936,4.049,942,4.895,961,4.491,965,7.961,1325,5.267,1327,4.347,1384,5.6,1558,5.006,1604,5.267,1606,5.6,1719,6.386,1751,5.81,2019,7.533,2035,6.827,2052,6.214,2060,6.214,2095,5.701,2099,6.827,2254,4.611,2778,5.81,2870,7.533,2873,7.533,2884,6.827,3058,6.214,3304,10.727,3305,10.727,3312,6.827,3319,6.827,3385,5.93,3386,8.146,3387,12.8,3388,12.8,3389,8.146,3390,8.146,3391,8.146,3392,8.146,3393,8.146,3394,8.146,3395,8.146,3396,8.146,3397,8.146,3398,8.146,3399,8.146,3400,8.146,3401,8.146,3402,8.146,3403,8.146,3404,8.146,3405,8.146,3406,8.146,3407,8.146,3408,8.146,3409,8.146,3410,8.146,3411,8.146,3412,8.146,3413,8.146,3414,8.146]],["keywords/559",[]],["title/560",[52,292.723,108,554.215,275,353.746,670,595.91,1160,538.737]],["content/560",[4,1.303,5,3.819,6,1.713,16,6.464,37,2.11,44,3.5,51,3.008,52,4.875,60,6.6,69,3.924,70,3.066,87,4.368,114,3.654,171,3.282,217,6.32,222,5.582,265,4.522,273,2.757,275,5.891,284,4.459,286,7.725,293,3.519,308,4.069,400,5.66,440,8.183,480,4.522,496,5.079,527,6.464,541,6.13,556,6.32,557,7.029,563,5.385,569,6.168,572,4.49,581,5.335,613,4.428,659,5.783,692,6.419,693,5.631,694,8.793,703,4.69,773,4.954,861,5.847,898,8.642,973,6.761,1037,8.965,1327,6.708,1847,9.357,1861,11.624,1965,8.796,2035,10.535,2052,9.588,2070,10.163,2544,11.001,3385,12.878,3415,12.57,3416,12.57,3417,12.57,3418,12.57,3419,12.57,3420,12.57,3421,12.57]],["keywords/560",[]],["title/561",[25,53.425,37,134.874,481,442.858,856,519.427,1160,407.391,1308,454.709,1388,512.459,3385,584.799]],["content/561",[5,3.886,6,1.743,14,6.767,37,3.022,52,4.96,114,5.233,152,4.472,171,4.701,179,8.948,181,4.797,220,6.364,284,6.386,315,5.863,414,7.037,536,6.172,732,6.298,920,9.533,1183,9.924,1965,12.597,1986,11.639,3385,13.104,3422,16.646,3423,18.002,3424,18.002]],["keywords/561",[]],["title/562",[19,356.811,25,79.157,183,374.904,1378,740.294]],["content/562",[4,0.708,6,1.362,22,3.692,23,4.246,24,3.84,25,0.455,32,4.047,34,3.711,35,4.648,37,1.148,51,1.636,54,2.971,99,6.285,107,1.679,151,3.432,158,4.305,161,3.514,164,5.09,167,2.971,177,3.515,181,1.822,183,2.153,185,1.651,191,2.055,224,3.373,264,3.225,271,2.425,273,4.42,275,2.276,281,2.651,284,3.946,315,3.623,319,3.046,330,3.382,334,1.971,348,3.869,355,2.694,360,3.905,413,3.541,425,4.002,462,5.589,490,2.716,538,5.53,544,5.248,545,3.081,572,2.442,611,4.305,630,5.959,642,3.062,652,3.273,722,3.443,734,3.443,740,3.18,758,2.957,765,3.646,766,8.994,767,3.905,768,8.036,770,3.376,771,6.494,772,4.615,773,5.543,776,5.295,777,3.046,780,3.62,787,3.313,788,5.729,801,5.729,806,5.359,819,4.784,820,4.7,823,5.359,824,4.784,825,4.622,891,6.133,1061,6.919,1080,5.359,1143,4.42,1170,3.491,1256,3.869,1257,3.128,1300,3.145,1567,5.359,1987,5.215,2124,5.983,2130,4.483,3304,9.324,3305,9.324,3306,9.324,3307,6.322,3308,5.527,3309,6.322,3310,6.322,3315,5.983,3316,6.322,3318,5.729,3425,6.836,3426,6.836,3427,6.836,3428,11.125,3429,6.836,3430,6.836,3431,6.322]],["keywords/562",[]],["title/563",[4,90.608,183,275.416,381,282.178,826,482.031,1160,443.427,1313,519.794,3303,666.996]],["content/563",[1,4.648,4,1.081,22,4.834,23,4.047,24,5.336,25,1.028,32,3.898,34,2.388,35,2.991,37,1.751,45,2.959,78,8.741,99,3.674,111,3.936,114,4.494,125,4.127,151,3.218,167,4.533,183,5.802,196,4.812,198,2.786,222,2.844,224,3.163,271,3.7,273,2.287,275,3.473,284,7.226,297,2.959,319,6.889,355,4.11,360,5.959,381,4.989,407,5.086,452,4.825,529,5.904,563,4.468,581,6.56,636,5.702,642,4.672,664,5.219,722,7.786,732,3.649,764,5.702,776,7.358,777,4.648,826,12.998,827,6.41,850,13.529,943,5.482,965,9.615,969,7.052,970,7.956,1098,8.176,1124,6.744,1187,6.744,1196,6.84,1636,7.299,2075,7.956,3303,15.538,3308,8.433,3322,14.295,3323,8.741,3385,7.593,3432,10.431,3433,10.431]],["keywords/563",[]],["title/564",[25,70.65,37,178.358,480,382.183,1160,538.737,1320,571.393]],["content/564",[5,3.195,6,1.722,14,3.699,22,4.669,23,4.207,24,5.109,25,0.984,32,3.132,34,3.389,35,2.822,37,3.322,45,2.791,70,3.609,151,3.036,152,1.959,167,4.276,182,1.963,222,2.683,271,3.49,275,3.276,293,4.143,307,8.536,334,2.837,355,3.877,425,3.54,480,8.321,541,4.798,563,4.215,572,3.515,630,6.54,737,4.976,758,4.256,765,4.851,767,5.621,770,4.859,771,7.128,772,4.081,773,5.832,776,7.044,777,4.385,780,5.21,863,5.675,873,5.912,924,6.276,1121,6.362,1262,6.047,1400,8.302,1401,7.017,1402,7.162,1617,5.133,1894,11.289,1895,7.505,1897,11.966,1900,11.016,2304,7.162,2669,6.653,3385,10.774,3434,9.839,3435,9.839,3436,9.839,3437,9.839,3438,14.8]],["keywords/564",[]],["title/565",[181,417.762,315,510.669]],["content/565",[6,1.685,25,1.157,33,2.25,44,4.845,45,4.936,70,4.244,131,8.824,176,6.35,181,4.636,184,3.773,185,4.203,208,9.512,239,8.885,242,9.592,243,8.004,293,4.871,314,6.172,330,4.184,379,10.059,425,6.26,454,11.25,554,8.331,613,6.13,652,8.331,704,9.145,707,11.765,1170,8.885,1310,10.134]],["keywords/565",[]],["title/566",[25,63.794,52,264.317,275,319.419,670,814.443,878,629.078]],["content/566",[4,0.841,5,3.405,6,1.998,37,2.142,40,4.871,44,2.259,45,3.62,52,3.516,58,5.776,60,5.884,62,3.476,69,3.983,73,4.143,88,2.782,107,1.993,114,3.71,116,3.351,131,4.115,152,1.616,154,2.983,166,6.918,171,2.119,181,3.4,183,4.019,184,1.76,185,1.96,217,6.386,222,2.213,225,2.909,226,4.143,230,2.563,239,4.143,242,4.473,243,3.733,265,2.919,273,3.921,275,2.702,278,2.184,281,4.948,284,4.526,286,4.987,297,4.474,301,1.849,307,4.68,308,2.627,311,3.476,315,2.643,319,3.616,322,2.983,355,3.198,379,3.712,398,3.039,414,3.172,416,5.401,427,2.983,454,5.247,458,3.774,467,4.511,480,6.432,481,4.473,499,4.265,520,3.673,527,4.173,537,2.66,539,3.774,544,3.027,545,2.248,555,5.047,556,4.558,557,3.224,572,2.899,581,6.692,613,2.859,614,6.821,634,5.787,652,3.885,659,7.254,668,4.202,683,5.678,692,4.143,693,8.008,694,4.033,698,5.247,737,2.728,739,10.196,765,2.66,773,3.198,826,4.473,858,9.005,921,4.202,954,4.265,960,6.561,993,3.909,1007,4.265,1115,5.907,1207,4.68,1327,4.33,1329,4.115,1582,6.04,1980,6.801,2049,5.247,2058,5.176,2070,6.561,2082,7.101,2197,6.361,2736,7.101,2848,6.801,2979,5.487,3303,6.19,3439,8.115,3440,8.115,3441,8.115,3442,15.646,3443,7.504]],["keywords/566",[]],["title/567",[191,471.331,879,610.406]],["content/567",[1,4.113,4,0.956,6,1.656,14,3.469,19,5.129,25,1.372,37,3.215,44,2.57,45,2.618,49,4.342,70,3.438,73,4.712,85,4.445,96,5.224,99,6.027,105,9.276,106,6.345,107,3.463,113,4.293,114,4.099,125,5.579,152,1.837,171,2.41,181,4.559,182,1.841,191,4.238,193,3.698,198,2.465,200,3.443,202,2.839,217,3.297,224,2.798,225,3.308,227,4.746,255,5.746,264,2.676,265,3.32,275,3.073,278,2.484,284,3.274,301,2.103,308,2.987,311,3.954,315,3.006,334,2.661,366,4.445,398,3.456,409,5.887,438,3.456,440,4.269,474,5.323,480,6.155,481,5.088,523,4.964,527,4.746,537,3.025,541,4.5,556,3.297,557,3.667,563,3.954,590,3.935,613,3.251,637,5.272,732,3.229,737,3.103,765,3.025,826,9.431,853,5.272,855,5.486,857,4.746,861,4.293,869,6.052,872,4.648,879,3.593,881,6.718,882,5.672,883,5.004,884,5.375,888,4.815,934,5.672,965,5.74,991,5.088,993,4.445,994,4.964,996,4.177,1065,5.429,1167,6.345,1365,6.718,1565,8.534,1567,7.234,1622,11.816,1636,6.458,1733,8.076,1927,6.718,1982,7.462,2052,7.04,2123,7.234,2286,7.462,2444,5.607,3303,10.754,3385,12.454,3444,9.229,3445,8.534,3446,8.534]],["keywords/567",[]],["title/568",[33,202.738,180,721.234]],["content/568",[]],["keywords/568",[]],["title/569",[180,856.66,424,874.956]],["content/569",[6,0.841,7,2.713,9,6.159,12,5.745,33,2.131,44,2.42,51,2.079,70,2.119,92,5.739,97,3.051,116,3.589,155,2.59,176,3.171,180,9.768,182,1.734,192,2.922,196,4.19,200,3.242,211,10.883,252,3.37,254,5.166,265,3.126,291,4.161,301,5.471,329,3.872,361,9.242,373,2.241,375,4.533,395,8.928,416,5.784,424,13.729,504,3.853,537,6.959,551,3.954,614,3.758,630,3.195,663,4.79,664,4.348,675,4.042,692,4.437,741,5.28,745,4.75,785,5.659,910,7.466,924,5.543,925,7.283,928,7.605,943,4.567,957,5.28,967,6.326,971,8.002,1000,4.674,1064,6.081,1068,8.002,1086,5.619,1127,5.472,1157,8.002,1558,5.341,1602,8.178,1610,5.405,1629,6.812,1687,7.026,1966,6.081,1988,7.026,2055,7.283,2075,6.629,2117,10.805,2126,5.784,2192,7.026,2308,5.472,2321,5.472,2482,7.283,2488,6.326,2507,7.026,2560,5.699,2600,8.036,2610,7.605,2649,8.036,2709,7.283,3447,8.036,3448,7.026,3449,8.036,3450,8.69,3451,8.69,3452,8.69,3453,8.69,3454,8.036,3455,8.036,3456,8.036,3457,8.69,3458,13.461,3459,8.69,3460,7.605,3461,8.69,3462,8.69,3463,8.69,3464,8.69]],["keywords/569",[]],["title/570",[33,137.374,180,488.703,184,230.384,301,242.127,537,348.193]],["content/570",[4,1.243,6,1.931,9,9.126,25,1.138,33,3.092,44,3.339,45,3.402,88,4.112,92,5.113,111,4.525,131,6.081,176,4.376,180,10.58,184,4.326,189,6.123,194,9.965,203,6.081,205,5.652,208,6.555,210,7.982,211,9.695,212,10.494,219,6.36,240,2.678,291,5.741,314,7.076,330,4.114,356,5.578,363,11.089,381,3.87,385,4.392,427,4.408,468,5.486,482,6.555,484,6.726,545,4.739,613,4.224,636,6.555,711,5.089,735,5.399,858,6.04,892,7.37,905,7.128,1006,7.285,1035,7.285,1055,5.96,1166,7.864,1175,7.551,1176,9.774,1196,7.864,1422,8.391,1442,10.05,1444,5.674,1602,7.285,1926,8.391,2308,7.551,2507,9.695]],["keywords/570",[]],["title/571",[180,856.66,182,270.003]],["content/571",[6,1.795,12,4.121,18,2.461,19,2.209,23,3.89,25,0.984,32,1.559,33,1.528,34,1.687,51,1.763,70,3.609,97,2.587,114,2.142,116,3.043,155,2.196,161,2.328,162,5.231,164,5.318,171,3.086,173,4.38,176,2.689,180,7.79,182,3.379,183,2.321,184,1.598,186,2.178,188,4.133,192,3.974,202,2.267,205,3.071,206,2.623,210,4.904,211,5.957,212,6.448,218,5.62,222,2.009,240,1.645,252,2.857,260,3.816,273,3.714,281,2.857,291,3.528,301,2.694,330,4.071,347,3.389,361,4.133,366,3.549,381,2.378,385,2.699,389,3.789,413,6.121,421,3.816,424,4.764,469,5.776,490,2.928,496,4.776,520,3.335,536,2.526,538,5.875,543,6.865,545,3.274,562,6.817,580,3.389,587,4.7,592,7.181,611,4.64,683,5.156,686,6.814,708,4.64,716,2.66,717,3.528,734,3.711,737,2.477,758,3.187,785,3.604,804,3.571,824,5.156,876,4.583,910,4.756,928,10.343,936,3.662,957,4.477,981,4.209,982,3.932,1024,3.466,1108,4.982,1126,5.484,1127,4.64,1170,6.035,1196,4.832,1232,5.957,1300,3.389,1329,3.737,1423,6.448,1424,6.448,1425,6.175,1442,6.175,1602,7.181,1603,5.62,1626,10.929,1711,4.832,1743,5.62,1914,5.255,1927,5.364,1949,6.814,2029,6.814,2033,5.957,2126,4.904,2131,4.427,2378,6.448,2502,3.662,2555,6.448,2588,5.364,3153,6.175,3161,6.814,3177,6.814,3226,5.957,3227,5.776,3228,6.448,3456,6.814,3465,6.448,3466,11.819,3467,7.368,3468,7.368,3469,6.448,3470,7.368,3471,7.368]],["keywords/571",[]],["title/572",[191,471.331,879,610.406]],["content/572",[25,1.722,180,9.421,222,5.584,315,6.67,881,14.908,1158,12.586,3472,20.48,3473,20.48,3474,20.48]],["keywords/572",[]],["title/573",[25,79.157,33,153.915,182,237.492,2002,640.194]],["content/573",[]],["keywords/573",[]],["title/574",[33,153.915,44,331.436,182,237.492,2002,640.194]],["content/574",[5,3.548,6,2.052,18,3.788,25,0.754,33,2.125,37,1.904,44,3.157,46,3.67,49,5.334,51,3.933,63,2.487,70,2.765,103,5.053,107,2.785,114,3.296,154,4.168,181,4.379,182,3.279,185,3.97,192,3.812,202,3.488,240,3.67,252,6.373,256,5.334,265,4.079,273,2.487,278,3.052,284,6.857,301,2.584,314,4.022,315,3.693,319,5.053,322,6.042,330,2.726,334,3.269,371,5.915,385,4.153,395,4.768,396,3.705,405,5.831,437,4.45,535,8.888,544,4.23,545,3.141,553,5.079,613,3.994,638,6.539,639,5.397,693,5.079,696,7.052,704,5.959,706,5.79,718,4.601,740,5.274,937,4.952,990,8.888,1011,7.667,1012,7.795,1035,6.889,1061,7.052,1065,6.671,1077,6.418,1419,8.649,1589,8.44,1623,7.667,1655,10.485,1915,10.485,1961,6.74,2002,8.839,2095,7.935,3475,11.339,3476,10.485,3477,11.339,3478,11.339,3479,11.339,3480,11.339,3481,11.339,3482,9.923]],["keywords/574",[]],["title/575",[25,79.157,33,153.915,437,467.161,1066,635.181]],["content/575",[3,5.962,5,2.798,6,2.015,25,0.862,33,2.337,51,3.102,53,5.475,69,4.046,107,3.184,152,2.581,171,3.385,176,6.596,184,2.811,185,3.131,199,6.206,205,3.368,206,4.614,224,3.93,240,4.036,265,4.663,273,3.964,281,8.07,284,7.382,293,3.628,297,3.677,301,2.954,311,5.552,314,4.598,315,4.222,330,4.346,373,3.343,388,7.27,414,5.067,425,6.502,504,5.746,537,4.248,538,6.443,543,4.8,545,3.59,553,5.806,613,4.566,614,5.606,637,7.405,697,8.268,732,4.535,740,6.029,1061,8.061,1067,8.764,1068,7.705,1080,10.16,1118,8.38,1166,8.5,1170,6.618,1922,11.986,1927,9.435,3483,12.962,3484,12.962,3485,12.962]],["keywords/575",[]],["title/576",[25,70.65,33,137.374,467,375.547,670,595.91,2002,571.393]],["content/576",[6,2.198,10,6.074,18,5.127,25,1.348,33,1.985,37,2.577,52,4.229,86,6.202,111,5.792,181,4.09,182,3.062,184,3.329,185,3.708,202,4.722,225,5.502,226,7.837,252,5.952,255,6.256,256,7.221,278,4.132,284,5.445,288,7.58,293,4.297,299,9.546,304,7.731,400,6.911,437,6.024,462,6.099,555,9.546,582,8.61,635,13.432,732,5.37,973,8.255,991,8.461,1150,12.032,1397,12.41,1636,10.741,1933,12.032,1935,12.032,2002,8.255,3486,15.349,3487,14.193]],["keywords/576",[]],["title/577",[25,89.993,886,483.395,1074,739.744]],["content/577",[4,2.165,25,1.389,136,12.048,182,4.168,291,10.002,902,11.934,907,12.838,1694,14.618,2002,11.236]],["keywords/577",[]],["title/578",[29,772.941]],["content/578",[25,1.616,28,10.507,29,10.077,122,8.989,319,9.126,722,12.236,1083,17.922]],["keywords/578",[]],["title/579",[33,174.985,198,361.493,323,745.978]],["content/579",[4,1.06,19,4.566,22,3.998,23,4.225,24,5.258,25,1.211,32,2.164,34,3.488,35,4.368,37,2.557,45,4.321,98,4.381,116,4.223,124,5.705,144,6.284,151,3.155,158,6.439,161,3.23,167,4.444,171,2.67,182,2.04,190,4.783,191,3.074,198,2.732,271,3.627,275,5.072,278,2.753,281,3.965,291,4.896,293,2.862,297,2.901,355,6.003,379,4.678,427,5.6,432,5.374,467,3.615,480,3.679,514,3.666,572,3.653,630,7.416,758,4.423,765,4.993,767,5.842,768,8.702,770,5.05,771,6.103,772,6.319,773,6.003,776,7.25,777,4.557,779,6.806,780,5.415,981,5.842,1219,4.926,1256,5.788,1329,5.185,1400,8.545,1540,6.36,1589,7.611,1941,8.57,1942,8.016,2002,9.791,3227,8.016,3488,10.226]],["keywords/579",[]],["title/580",[25,79.157,183,374.904,284,422.228,2002,640.194]],["content/580",[4,1.06,5,2.208,6,0.99,19,3.065,22,3.998,23,4.267,25,1.013,32,2.164,34,2.341,35,2.932,161,3.23,164,5.717,183,4.798,241,3.801,273,3.992,284,3.627,308,3.31,330,3.662,341,6.079,355,7.174,425,3.679,538,7.572,543,5.641,545,2.832,572,3.653,622,4.15,642,4.58,722,5.15,734,5.15,758,4.423,768,5.842,804,4.956,818,7.611,819,7.156,820,7.03,823,8.016,824,7.156,825,6.914,858,5.15,1061,6.36,1098,8.016,1170,5.221,1308,5.788,1941,12.767,2002,11.602,3227,8.016,3489,10.226,3490,8.016,3491,10.226,3492,9.456,3493,10.226,3494,11.089,3495,9.456,3496,9.456,3497,10.226,3498,10.226,3499,9.456,3500,9.456,3501,9.456,3502,8.949,3503,7.611,3504,8.949,3505,9.456,3506,8.949,3507,10.226,3508,10.226,3509,8.949]],["keywords/580",[]],["title/581",[25,79.157,65,390.118,400,535.943,408,393.825]],["content/581",[2,4.689,4,1.857,5,2.764,6,1.735,10,7.091,20,5.734,25,0.851,37,3.471,51,4.947,52,3.527,58,6.563,63,2.807,69,3.996,85,6.167,86,5.173,87,4.449,98,5.484,100,4.741,103,5.705,154,4.706,192,4.304,195,6.779,220,4.526,256,6.023,275,5.967,297,3.632,308,5.8,329,5.705,334,3.691,373,3.302,394,6.492,395,5.383,408,7.799,467,4.526,491,9.319,492,8.656,562,7.383,581,5.433,636,6.998,639,6.093,874,5.676,898,8.801,956,8.062,958,5.922,1019,8.062,1110,7.314,1181,11.203,1261,8.166,1595,7.962,1871,10.351,1961,7.61,1962,11.838,1964,11.838,2002,6.886,3510,12.802,3511,12.802,3512,12.802,3513,12.802]],["keywords/581",[]],["title/582",[6,92.877,25,63.794,205,249.247,219,356.567,240,214.197,613,337.935]],["content/582",[6,1.21,25,1.357,45,3.545,70,4.296,88,4.284,107,3.069,136,7.206,149,5.183,152,2.488,155,5.251,181,3.329,184,2.71,185,4.929,192,4.201,204,5.912,205,3.247,222,3.407,225,6.315,226,6.38,240,4.556,243,5.748,264,3.622,278,3.364,293,3.498,301,2.848,314,4.432,330,4.906,347,5.748,379,5.717,385,4.577,517,6.775,537,4.095,545,3.461,564,5.78,584,8.448,613,6.206,622,5.071,638,7.206,652,8.435,704,6.567,706,6.38,707,8.448,711,5.303,714,8.317,718,5.071,732,4.372,892,7.679,893,5.254,910,5.027,914,5.878,1006,7.591,1024,5.878,1113,9.096,1115,9.096,1116,8.756,2002,6.72,2639,10.472,3514,12.495,3515,10.472,3516,12.495,3517,12.495,3518,12.495]],["keywords/582",[]],["title/583",[25,79.157,202,366.157,563,509.904,1119,686.479]],["content/583",[]],["keywords/583",[]],["title/584",[107,332.397,181,360.573,732,473.461]],["content/584",[6,1.713,33,2.288,37,2.971,151,5.46,181,4.715,182,3.531,185,4.275,200,6.602,240,3.951,264,5.13,265,6.366,314,6.277,347,8.14,392,8.231,532,10.306,553,7.926,564,8.185,622,7.181,707,11.965,904,12.882,937,7.729,1152,11.779,1155,11.965,2002,9.518,2141,11.288,3519,17.696,3520,17.696]],["keywords/584",[]],["title/585",[183,374.904,273,261.029,330,286.181,356,553.65]],["content/585",[6,1.699,18,5.861,25,1.167,152,3.493,161,5.543,183,5.527,252,6.804,273,3.848,299,10.913,301,3.999,330,4.219,374,14.187,385,6.427,399,9.592,496,7.09,515,8.666,537,5.751,545,4.86,727,12.279,732,6.139,734,8.838,856,11.345,858,8.838,919,12.279,973,9.438,1061,10.913,1967,13.755,2002,9.438]],["keywords/585",[]],["title/586",[6,131.019,185,326.9,480,486.819]],["content/586",[5,4.214,6,2.285,25,1.298,51,4.671,87,6.783,182,3.895,185,4.715,278,5.255,297,5.538,480,7.022,863,11.258,906,10.583,932,8.883,934,11.996,1299,14.209]],["keywords/586",[]],["title/587",[60,504.882,63,296.762,514,485.1]],["content/587",[60,7.149,63,4.202,191,5.76,273,4.202,405,9.853,581,8.131,590,8.17,718,7.776,737,6.442,868,16.058,898,13.173,905,11.39,924,12.223,984,11.776,994,10.306,1327,10.225,1427,10.225,2000,14.262]],["keywords/587",[]],["title/588",[217,483.395,556,483.395,742,612.527]],["content/588",[5,4.214,35,5.598,37,3.277,63,4.281,152,3.886,217,6.973,512,7.99,514,6.997,718,7.921,737,6.563,785,5.953,866,11.484,944,10.949,1426,14.889,1825,15.782,2590,17.082]],["keywords/588",[]],["title/589",[281,524.746,297,383.895,379,619.122]],["content/589",[6,1.758,25,1.208,69,5.669,70,5.507,155,5.413,182,3.623,198,4.851,246,5.737,281,8.756,288,8.968,301,4.139,311,7.779,330,4.366,427,6.675,537,5.952,588,13.851,611,11.435,613,6.397,893,7.635,957,11.032,1081,11.16,2002,9.767]],["keywords/589",[]],["title/590",[4,110.083,25,70.65,85,511.73,855,631.517,2002,571.393]],["content/590",[4,1.717,5,3.576,6,1.883,25,1.102,33,2.142,44,4.613,45,3.252,46,3.711,60,6.181,70,2.796,73,5.854,98,4.911,144,7.045,155,3.417,181,4.414,186,3.388,190,5.362,191,4.98,193,4.593,225,4.109,226,5.854,246,3.621,252,6.424,264,3.323,273,3.633,308,5.362,323,6.319,330,2.756,360,12.911,379,5.245,392,5.332,398,4.293,427,4.214,478,7.13,517,6.215,545,3.175,564,5.303,590,4.888,668,5.937,739,7.412,782,6.744,786,4.911,965,7.13,1061,7.13,1089,6.611,1092,8.744,1134,6.488,1143,7.412,1188,9.268,1298,9.953,1310,6.676,1427,6.117,1428,10.601,1589,8.533,1786,8.986,1966,8.022,2002,6.166,2301,7.313,3257,10.601,3482,14.497,3487,10.601,3490,12.985,3494,8.345,3521,11.464,3522,11.464,3523,11.464,3524,11.464,3525,10.601,3526,11.464,3527,11.464,3528,11.464]],["keywords/590",[]],["title/591",[191,471.331,879,610.406]],["content/591",[4,1.264,19,6.572,25,1.645,33,1.578,51,2.92,85,5.878,87,4.24,105,9.392,125,4.828,152,2.429,171,3.186,183,3.843,190,5.708,191,3.668,192,4.102,196,3.798,222,4.724,255,4.973,265,4.39,284,4.328,291,5.842,293,3.416,366,5.878,398,4.57,496,4.931,523,10.833,536,4.184,853,9.896,855,7.253,857,6.275,861,5.676,872,8.725,879,6.744,882,12.378,883,9.392,884,7.107,886,4.359,887,7.107,937,5.329,973,6.563,993,5.878,994,6.563,995,8.702,996,5.523,997,8.882,998,8.702,1127,7.684,1154,9.565,1192,7.589,1982,9.865,2002,12.937,3494,8.882,3529,10.678,3530,12.202,3531,12.202,3532,12.202]],["keywords/591",[]],["title/592",[25,63.794,33,124.043,52,264.317,264,278.105,462,381.156,2002,515.945]],["content/592",[]],["keywords/592",[]],["title/593",[52,513.439]],["content/593",[5,4.601,6,2.063,33,2.143,37,3.578,51,3.965,52,4.566,181,4.415,182,3.306,186,4.898,200,6.182,222,4.518,232,9.85,286,10.183,293,4.638,297,4.701,308,5.364,322,7.834,395,6.967,501,8.52,556,5.919,557,6.584,563,7.098,572,5.919,630,6.091,659,7.622,692,8.461,694,8.236,695,8.183,911,10.57,1329,8.403,2095,11.595]],["keywords/593",[]],["title/594",[4,140.222,52,372.867,2002,727.832]],["content/594",[4,1.857,5,2.764,6,2.282,9,5.857,12,4.464,23,1.951,40,6.84,44,3.565,52,4.937,63,2.807,69,3.996,70,4.37,79,6.779,97,4.494,107,4.402,149,7.433,151,3.95,181,3.411,182,3.575,184,2.776,185,5.41,192,4.304,193,5.129,205,4.656,206,4.557,240,4.001,243,5.889,272,5.458,273,2.807,298,6.282,334,3.691,373,3.302,385,4.689,490,5.087,520,5.795,525,6.728,559,8.166,675,5.955,704,6.728,709,7.868,713,8.277,716,4.622,718,5.195,719,8.801,893,5.383,914,6.023,924,8.166,1000,6.886,1062,9.529,1064,8.959,1197,8.959,1398,8.062,2002,6.886,3291,11.838,3292,11.838,3293,11.838]],["keywords/594",[]],["title/595",[4,140.222,52,372.867,510,686.235]],["content/595",[3,4.172,5,1.958,6,1.638,14,3.409,16,4.663,25,1.262,37,1.522,51,2.17,52,6.394,58,3.321,63,1.989,88,3.109,92,3.866,110,6.136,114,2.636,125,5.504,155,2.703,182,1.809,183,5.977,186,4.112,195,4.802,196,5.267,199,4.342,202,4.279,222,3.793,246,2.865,252,3.516,254,5.391,256,4.266,264,4.033,265,3.262,273,4.737,278,2.441,281,6.562,286,5.573,287,4.507,293,2.538,297,4.801,300,4.999,301,2.067,308,6.626,310,4.105,319,4.041,322,3.334,330,2.18,364,4.917,371,4.731,389,4.663,390,6.75,398,3.396,400,4.083,425,5.004,438,3.396,462,3.603,466,4.731,479,5.449,480,3.262,485,7.108,510,4.599,524,5.947,536,4.77,537,2.972,539,4.218,545,3.853,549,4.766,553,4.062,559,5.785,563,5.959,614,3.922,634,6.467,659,4.172,692,4.63,700,10.354,703,3.383,728,7.936,738,5.863,742,4.105,743,6.346,765,2.972,943,4.766,951,7.936,963,3.502,996,4.105,1072,6.346,1164,5.573,1335,7.108,1697,5.133,2002,4.877,2114,5.947,2731,6.917,3294,8.386,3295,8.386,3298,8.386,3300,8.386,3301,8.386,3533,9.068,3534,9.068,3535,9.068]],["keywords/595",[]],["title/596",[25,79.157,171,310.82,191,357.826,2002,640.194]],["content/596",[25,1.336,41,13.58,52,5.534,111,7.579,171,5.245,191,6.038,202,6.178,272,8.563,322,7.383,400,9.043,462,7.98,529,11.368,2002,10.802]],["keywords/596",[]],["title/597",[25,104.266,29,650.349]],["content/597",[25,1.625,28,10.568,29,10.136,30,9.73,107,5.08,722,12.308]],["keywords/597",[]],["title/598",[33,174.985,198,361.493,224,410.309]],["content/598",[4,1.024,19,2.963,22,3.898,23,4.222,24,5.127,25,1.186,32,3.143,33,1.921,34,3.401,35,5.688,37,3.33,52,2.724,63,2.168,103,4.405,111,3.73,114,5.186,151,3.05,158,6.225,161,3.123,167,4.297,171,2.582,191,2.972,204,4.678,224,2.997,264,4.306,271,3.507,275,5.941,289,4.598,293,2.767,334,2.85,355,5.853,440,4.573,462,3.928,467,3.495,510,5.013,536,3.39,572,3.531,590,4.215,607,5.36,630,7.292,723,6.684,758,4.276,763,5.048,765,5.847,766,12.009,767,5.648,768,10.192,769,7.196,770,4.882,771,7.148,772,4.101,773,7.031,774,5.404,775,4.733,776,7.069,777,4.405,778,7.358,779,6.58,780,5.235,1540,6.148,2002,5.317,3302,9.142,3536,9.886]],["keywords/598",[]],["title/599",[784,1141.31,785,478.129]],["content/599",[23,4.241,32,4.397,33,1.405,34,5.61,35,6.63,63,2.383,108,5.668,171,2.837,462,8.255,490,4.317,545,3.01,642,4.867,659,4.998,682,12.881,768,6.207,771,7.558,784,7.91,785,3.314,786,4.655,787,7.721,788,9.106,789,13.352,790,9.509,791,9.509,792,6.267,793,9.509,794,13.943,795,9.509,796,9.509,797,13.943,798,9.509,799,10.953,800,7.604,801,9.106,802,9.509,803,16.508,804,9.142,805,12.371,806,5.234,807,8.785,808,9.106,809,5.366,1300,4.998,1308,6.15,3537,10.866,3538,10.866]],["keywords/599",[]],["title/600",[273,261.029,284,422.228,545,329.694,735,535.943]],["content/600",[6,2.21,25,1.229,51,4.422,182,3.687,192,6.213,265,6.648,273,4.053,281,7.166,284,6.556,293,5.173,301,4.212,330,4.443,399,10.103,425,6.648,537,6.057,538,9.186,545,5.119,562,10.659,961,10.188,1061,11.494,2002,9.94]],["keywords/600",[]],["title/601",[4,90.608,183,275.416,308,283.049,722,440.43,1308,494.931,2002,470.306,3490,685.44]],["content/601",[6,1.623,19,3.494,22,4.4,23,4.167,32,4.155,34,2.669,51,2.789,164,5.265,183,3.671,198,3.114,273,4.306,281,4.52,330,4.031,355,6.607,399,6.372,425,4.193,538,9.759,544,4.349,545,4.644,735,5.248,768,6.659,778,12.479,819,8.157,820,8.013,823,9.137,824,8.157,825,7.881,1033,8.485,1061,10.427,1170,5.952,1663,6.481,2002,9.017,3226,9.424,3312,9.769,3313,10.2,3314,10.2,3318,9.769,3319,9.769,3320,9.137,3492,10.778,3494,8.485,3495,10.778,3496,10.778,3499,10.778,3500,10.778,3501,10.778,3502,10.2,3503,8.676,3504,10.2,3505,10.778,3506,10.2,3509,10.2,3539,10.778,3540,10.778,3541,11.656,3542,11.656,3543,11.656]],["keywords/601",[]],["title/602",[4,140.222,826,745.978,2002,727.832]],["content/602",[6,1.304,23,3.659,25,0.895,32,2.849,45,3.82,164,4.228,183,4.241,191,4.048,228,5.88,241,5.005,273,2.953,284,7.533,334,3.882,381,4.345,396,4.399,446,10.022,496,5.441,536,4.617,543,4.986,600,7.242,674,6.797,734,6.782,763,6.875,819,9.422,820,9.256,823,10.554,824,9.422,825,9.104,826,10.23,828,10.27,850,16.24,872,6.782,991,7.422,1093,10.886,1151,8.705,1174,8.18,1183,7.422,1264,10.022,2002,7.242,3226,10.886,3312,11.284,3313,11.783,3314,11.783,3318,11.284,3319,11.284,3482,11.783,3502,11.783,3503,10.022,3504,11.783,3506,11.783,3509,11.783,3539,12.45,3540,12.45,3544,13.464,3545,13.464]],["keywords/602",[]],["title/603",[19,356.811,25,79.157,52,327.97,2002,640.194]],["content/603",[4,2.34,19,5.443,25,1.634,67,7.306,85,8.747,182,4.505,255,7.401,291,8.694,349,11.741,523,9.767,554,8.694,580,8.353,621,12.951,853,12.9,854,14.234,855,10.794,1341,14.681,2002,9.767,3212,15.891]],["keywords/603",[]],["title/604",[25,89.993,202,416.281,563,579.706]],["content/604",[4,1.664,6,2.467,25,1.389,33,2.077,37,3.506,184,3.483,185,3.879,201,6.203,202,4.94,265,5.777,278,4.323,330,3.861,425,5.777,435,9.554,480,7.513,481,8.853,514,5.757,536,5.506,553,7.193,556,5.736,563,6.879,613,5.657,614,6.946,652,7.689,742,9.453,765,5.263,856,10.383,932,7.308,1747,10.858,1782,11.453]],["keywords/604",[]],["title/605",[52,432.005,703,584.959]],["content/605",[5,3.886,6,1.743,37,3.022,51,5.374,52,6.188,61,9.682,63,3.948,222,4.909,391,11.312,462,7.153,674,6.593,683,12.597,703,9.564,861,8.373,945,14.111,1025,13.731,1165,11.805,1558,11.063,3329,16.646]],["keywords/605",[]],["title/606",[52,432.005,179,779.313]],["content/606",[25,1.555,37,3.542,58,5.974,62,6.987,63,4.626,98,6.987,100,6.04,122,7.159,142,9.595,179,8.107,222,4.448,250,8.704,287,8.107,297,4.627,308,5.28,334,4.703,395,6.858,437,6.401,533,9.232,536,7.233,562,9.407,827,10.024,871,13.187,872,8.215,873,9.8,874,10.366,875,8.637,1000,8.772,1019,10.271,3330,15.082]],["keywords/606",[]],["title/607",[37,199.834,51,284.834,63,261.029,689,650.672]],["content/607",[25,1.389,37,3.507,40,7.974,51,4.999,63,4.581,114,6.073,193,8.37,554,10.002,878,13.699]],["keywords/607",[]],["title/608",[191,471.331,879,610.406]],["content/608",[4,2.051,23,2.256,25,1.65,52,5.453,181,3.944,182,2.954,196,4.608,198,3.955,200,5.523,202,4.554,234,6.847,256,6.964,265,5.326,273,3.246,281,5.74,284,5.251,304,7.456,322,5.442,385,5.422,398,5.544,462,5.882,496,5.982,523,7.962,563,6.342,617,7.839,642,6.631,659,6.81,692,7.559,738,9.572,853,8.457,857,7.612,883,8.026,884,8.622,885,10.776,910,5.956,912,7.723,931,8.8,937,6.465,996,6.701,1171,10.177,1583,11.604,2002,7.962,2515,11.019,3331,13.689]],["keywords/608",[]],["title/609",[116,250.367,240,135.375,670,845.279,1055,301.353,1109,313.99,1176,346.35,1361,326.085,2589,372.601,3546,451.274]],["content/609",[]],["keywords/609",[]],["title/610",[1109,811.993,1176,895.677]],["content/610",[4,0.847,6,1.738,7,2.553,12,2.852,23,3.825,40,3.122,51,1.957,69,2.553,107,2.009,116,3.377,125,3.236,131,4.147,148,4.717,149,3.392,151,2.523,155,2.438,162,6.347,164,4.977,181,2.179,205,5.992,206,2.911,220,2.891,222,2.23,223,6.602,240,4.623,248,4.434,272,3.487,301,1.864,311,3.503,314,5.622,347,3.762,392,3.804,396,2.672,398,3.063,420,4.969,438,3.063,440,3.783,452,3.783,456,7.157,457,5.53,490,3.25,537,2.68,539,3.804,545,3.556,616,5.723,711,7.62,718,3.319,741,4.969,786,5.5,901,4.901,906,4.434,908,6.612,910,5.166,914,3.847,955,4.717,957,9.63,963,3.159,991,4.508,996,5.811,1047,5.953,1055,4.065,1066,4.364,1082,5.444,1109,10.724,1119,4.717,1165,5.363,1175,8.085,1176,12.81,1199,6.411,1268,4.235,1297,8.681,1339,3.663,1359,6.238,1377,6.006,1564,5.217,1617,4.266,1726,4.399,2126,8.546,2436,7.157,2775,7.563,3109,6.854,3547,8.178,3548,8.178,3549,8.178,3550,7.563,3551,6.612,3552,8.178,3553,15.85,3554,8.178,3555,7.563,3556,8.178,3557,8.178,3558,8.178,3559,8.178,3560,5.953,3561,6.238,3562,8.178,3563,5.622,3564,5.833]],["keywords/610",[]],["title/611",[1055,926.214]],["content/611",[4,1.446,6,1.643,7,2.843,23,3.631,32,1.927,49,4.285,51,2.179,67,3.665,110,4.018,111,3.437,131,7.078,155,2.715,162,3.22,166,4.938,182,1.817,186,2.692,192,3.062,195,4.823,198,2.433,203,4.619,205,3.626,219,3.385,234,4.213,240,4.58,248,4.938,272,5.951,278,2.452,293,3.907,298,4.469,301,2.076,308,2.948,311,3.902,314,7.275,322,5.131,334,4.024,378,5.472,385,3.336,393,4.899,396,2.976,420,5.534,421,4.717,438,3.411,452,4.213,460,6.947,481,5.021,484,5.109,490,3.619,494,6.947,537,2.985,545,2.523,562,5.253,563,3.902,564,4.213,579,5.889,584,6.158,675,4.236,692,4.651,711,3.865,735,6.284,736,3.411,745,4.979,910,3.665,911,5.81,943,4.787,987,5.889,991,5.021,996,4.123,1055,10.194,1103,6.374,1109,7.228,1111,6.262,1158,5.597,1176,5.203,1207,5.253,1297,9.437,1339,6.252,1590,6.947,1617,4.751,1634,6.496,1646,6.062,1726,4.899,2088,6.496,2308,5.735,2421,6.779,2638,6.947,3041,7.364,3202,7.364,3565,8.422,3566,9.108,3567,12.214,3568,9.108,3569,8.422,3570,13.957,3571,9.108,3572,9.108,3573,8.422,3574,9.108,3575,7.971,3576,9.108,3577,9.108,3578,9.108,3579,8.422,3580,8.422]],["keywords/611",[]],["title/612",[116,558.828,240,302.163,2589,831.659]],["content/612",[6,1.566,7,1.783,22,1.499,23,4.033,32,3.939,35,1.638,44,1.59,51,1.367,65,1.872,92,2.435,108,2.98,113,2.657,116,9.469,131,4.862,162,4.381,164,5.5,166,3.097,171,3.236,173,3.395,186,1.688,191,3.725,198,1.526,205,4.203,206,5.167,219,2.123,220,2.019,222,1.557,240,4.536,243,2.627,246,1.804,249,3.233,264,2.78,272,2.435,278,1.538,293,1.599,301,3.308,308,1.849,310,2.585,311,2.447,314,6.213,347,2.627,356,5.764,373,1.473,381,1.843,385,2.092,396,1.866,425,2.055,427,3.525,440,2.642,467,2.019,490,2.269,496,2.308,504,2.532,529,3.233,537,1.872,545,2.656,561,4.511,562,3.294,564,2.642,616,3.997,630,4.556,695,2.821,711,2.424,716,3.462,735,2.572,736,3.591,737,1.92,740,4.46,771,2.288,786,2.447,894,3.675,971,3.395,979,4.618,996,4.34,1033,6.98,1055,4.766,1082,3.802,1125,3.997,1143,3.693,1175,3.597,1191,6.117,1224,3.326,1264,7.137,1309,2.687,1339,7.246,1350,4.357,1566,8.391,1617,10.19,1631,7.014,1638,4.477,1726,3.072,1787,4.477,1803,4.251,1928,5.282,2079,3.263,2118,3.862,2161,4.357,2175,4.251,2304,4.158,2589,5.893,2625,4.357,2912,3.552,3167,12.34,3367,2.751,3448,4.618,3575,4.998,3581,5.712,3582,5.282,3583,5.282,3584,5.712,3585,9.714,3586,3.294,3587,5.712,3588,5.712,3589,5.712,3590,8.867,3591,5.712,3592,10.804,3593,3.802,3594,5.712,3595,5.282,3596,5.712,3597,4.998,3598,5.282,3599,5.282,3600,5.712,3601,4.787,3602,5.712,3603,5.712,3604,5.712,3605,5.712,3606,5.282,3607,5.712,3608,5.712,3609,5.712,3610,5.712,3611,5.282,3612,5.712,3613,5.712,3614,5.712,3615,5.712,3616,5.712]],["keywords/612",[]],["title/613",[308,507.514,3546,1167.014]],["content/613",[3,4.921,4,1.937,6,1.81,22,2.808,46,5.099,51,2.56,58,3.918,63,2.346,65,3.506,66,7.788,68,5.623,69,3.34,97,3.756,110,4.719,182,2.135,186,3.162,192,5.296,195,8.341,200,3.991,205,2.78,219,3.977,234,4.948,240,2.389,265,3.849,272,4.561,297,5.303,298,5.25,301,2.438,304,5.388,308,5.099,310,4.842,322,3.933,334,3.085,356,7.327,392,4.976,396,3.495,398,4.006,407,5.217,419,6.5,438,4.006,462,4.251,484,6.001,496,4.323,504,4.743,531,5.848,537,3.506,551,7.168,558,8.386,565,6.055,579,6.917,584,7.234,606,8.386,671,8.966,675,4.976,692,5.463,703,3.991,705,6.231,735,4.817,912,5.581,937,4.672,963,4.132,996,4.842,1019,6.737,1038,9.796,1079,8.16,1187,6.917,1189,6.654,1207,6.17,1268,5.541,1339,4.792,1634,7.63,1685,9.362,1708,7.355,2308,6.737,2321,6.737,2560,7.016,2589,6.575,3546,17.694,3617,8.65,3618,10.698,3619,15.752,3620,10.698,3621,9.893,3622,10.698]],["keywords/613",[]],["title/614",[1361,1002.228]],["content/614",[4,1.967,6,1.063,29,4.555,44,4.47,45,3.115,46,5.197,51,3.842,67,4.418,72,5.226,182,2.191,186,3.246,187,6.748,190,5.136,199,5.257,200,5.99,205,5.425,219,5.968,240,4.662,248,5.953,265,3.95,272,4.682,288,5.423,291,5.257,297,3.115,301,3.659,308,3.554,310,4.97,311,4.704,314,5.695,322,4.036,345,8.376,356,5.107,366,5.289,373,2.832,385,4.022,438,4.112,467,3.881,477,11.053,496,4.437,515,5.423,537,5.262,571,7.201,645,6.46,660,6.159,717,5.257,732,3.842,826,6.053,879,4.275,936,5.458,937,4.796,996,8.591,1054,7.684,1055,5.458,1189,6.829,1227,7.201,1297,7.424,1332,5.906,1361,12.48,1590,8.376,1786,8.607,1823,8.607,2118,7.424,2182,9.609,2913,8.173,2918,9.609,2978,9.609,3167,8.376,3449,10.154,3546,8.173,3623,8.376,3624,10.154,3625,10.98,3626,10.98,3627,10.154]],["keywords/614",[]],["title/615",[248,850.067,703,584.959]],["content/615",[]],["keywords/615",[]],["title/616",[6,115.243,298,584.092,1339,533.158,1961,707.558]],["content/616",[4,1.578,6,2.382,19,3.065,25,0.68,53,4.319,54,4.444,58,5.579,72,4.867,73,5.221,88,3.506,110,6.72,111,3.859,112,6.706,116,4.223,131,10.23,151,3.155,174,6.079,192,3.438,205,3.958,240,4.817,241,3.801,272,4.36,297,2.901,298,5.018,308,4.931,314,6.458,329,4.557,334,2.948,335,10.864,345,7.8,381,6.51,385,3.745,396,4.977,403,8.267,418,8.016,496,4.132,515,9.962,522,9.456,561,4.811,711,8.561,786,4.381,855,6.079,932,4.653,1000,5.5,1055,5.083,1109,9.428,1169,4.678,1175,6.439,1176,10.4,1339,10.784,1350,11.62,1401,7.293,1633,5.842,1711,6.706,1902,6.284,1961,6.079,1974,9.456,2072,8.949,2589,6.284,2733,7.293,2912,6.36,3546,7.611,3585,14.27,3586,5.897,3628,10.226,3629,7.444]],["keywords/616",[]],["title/617",[703,396.364,711,450.843,757,686.894,1713,575.999,2612,757.671]],["content/617",[4,2.172,6,0.658,10,2.687,23,1.035,25,0.736,28,2.937,51,4.81,54,4.809,67,2.733,69,4.371,70,3.415,72,3.233,88,2.329,92,2.896,97,2.384,108,3.543,121,4.081,131,3.444,171,1.774,182,2.208,184,1.473,186,2.008,187,4.174,191,2.042,192,3.72,201,2.623,204,3.214,205,4.195,215,3.569,219,4.113,222,1.852,240,4.488,246,3.496,251,6.153,256,3.195,264,3.208,278,1.828,281,7.392,301,1.548,308,2.198,311,7.616,314,8.826,323,3.744,334,1.958,356,6.513,373,1.752,381,2.192,385,2.488,396,2.219,409,4.332,413,3.517,418,5.324,432,7.359,444,7.744,447,4.332,466,5.773,489,5.055,490,2.699,512,2.78,584,4.592,590,2.896,630,2.497,660,3.81,661,4.332,673,3.543,694,6.96,703,7.5,714,4.521,716,2.452,736,6.047,739,4.391,775,3.252,890,7.892,901,2.593,910,2.733,996,3.074,1058,3.517,1115,8.055,1160,3.444,1219,6.745,1298,4.081,1495,6.28,1595,4.224,1617,3.543,1633,3.88,1704,4.277,1707,4.844,1713,7.592,1718,4.944,1746,5.324,2089,4.454,2252,6.723,2303,3.653,2542,4.944,2612,7.892,2638,5.181,2669,4.592,2720,4.277,2731,5.181,3012,10.233,3169,5.324,3231,6.28,3585,5.324,3617,5.491,3629,10.194,3630,14.003,3631,6.792,3632,6.792,3633,5.944,3634,6.792,3635,6.792,3636,6.792,3637,6.792,3638,6.792,3639,6.792,3640,6.792,3641,6.28,3642,5.692,3643,6.792,3644,6.792,3645,6.28,3646,5.692,3647,6.792,3648,6.792,3649,6.792,3650,6.28,3651,6.28]],["keywords/617",[]],["title/618",[199,508.659,264,307.993,311,455.105,314,376.852,3515,890.35]],["content/618",[4,1.31,6,1.72,10,5.004,44,3.521,63,2.773,76,7.518,162,4.471,175,7.866,182,4.098,196,3.936,199,9.834,205,3.286,210,8.418,227,6.503,240,3.967,252,4.904,310,5.724,311,8.798,314,7.285,321,7.772,347,8.173,373,3.262,385,4.632,395,7.47,396,4.132,425,4.55,466,6.597,514,4.534,543,4.683,545,3.503,551,5.755,567,8.293,664,6.328,705,7.365,785,6.263,901,4.828,911,8.067,950,8.418,963,4.885,994,6.802,1055,6.286,1081,7.772,1127,7.964,1128,12.933,1160,6.413,1164,7.772,1339,5.665,1388,8.067,1405,11.067,1422,8.85,1558,7.772,1722,9.206,1726,6.802,1858,9.913,2744,11.067,3652,12.647,3653,12.647,3654,12.647,3655,12.647]],["keywords/618",[]],["title/619",[3623,1195.939,3629,1141.31]],["content/619",[3,7.387,4,2.164,25,1.068,40,6.13,70,3.916,116,6.632,131,10.59,201,8.066,240,4.663,254,9.546,255,6.545,293,4.495,314,5.697,375,8.378,420,9.757,467,5.677,499,8.44,510,8.144,516,8.258,552,8.44,711,6.815,894,6.154,1055,7.982,1109,8.317,1176,9.174,1227,10.531,1625,12.984,1729,15.929,2589,9.869,3623,12.249,3629,11.69,3656,13.459,3657,16.059,3658,16.059]],["keywords/619",[]],["title/620",[63,343.83,689,857.071]],["content/620",[4,1.295,16,6.425,20,7.891,40,4.77,63,4.859,68,6.567,86,8.245,107,3.069,114,3.632,116,5.16,149,5.183,162,6.227,193,5.006,222,3.407,240,4.556,248,6.775,301,2.848,331,8.079,349,8.079,387,7.277,428,9.475,462,4.965,496,5.049,514,6.315,551,5.686,554,5.983,556,4.463,596,8.744,606,9.795,675,8.194,683,8.744,689,6.83,861,5.812,891,9.711,955,7.206,1016,9.3,1055,8.756,1109,6.471,1165,8.194,1176,7.138,1189,7.771,1219,6.019,1361,6.72,1608,13.809,1617,6.518,1933,9.795,2304,9.096,2444,7.591,2589,7.679,3058,9.531,3167,9.531,3546,16.492,3563,8.59,3617,10.102,3621,11.554,3659,10.472,3660,12.495,3661,10.472]],["keywords/620",[]],["title/621",[675,866.742]],["content/621",[6,1.643,10,4.691,12,4.134,49,5.577,58,4.342,67,4.77,116,7.008,131,8.606,162,5.999,182,2.365,186,3.504,189,6.053,205,4.409,222,3.233,240,4.426,272,5.055,293,3.319,301,3.868,311,5.079,314,7.031,385,4.342,401,5.31,452,5.484,515,5.855,536,5.819,537,5.562,545,3.284,549,6.23,562,6.837,569,5.817,664,5.931,675,10.651,692,8.665,699,7.665,716,4.28,736,4.44,761,8.63,918,6.71,937,5.178,955,6.837,957,7.203,963,6.555,971,7.047,996,7.681,1035,7.203,1048,9.585,1055,8.435,1173,7.047,1176,6.772,1189,7.373,1297,8.016,1339,7.601,1590,9.043,1617,6.184,2589,7.286,2899,10.963,3052,10.375,3565,10.963,3617,9.585,3645,10.963,3662,11.855,3663,11.855,3664,11.855,3665,11.855]],["keywords/621",[]],["title/622",[1608,1460.68]],["content/622",[6,1.271,10,5.193,12,4.576,69,4.097,116,5.42,201,5.069,205,5.444,222,3.579,240,4.678,265,6.559,279,7.802,291,6.284,297,3.723,298,6.44,311,5.622,314,7.432,334,3.784,356,8.481,393,9.807,536,4.5,564,6.071,699,11.789,736,4.915,761,9.554,866,7.721,890,9.36,905,7.802,955,7.569,963,5.069,1030,6.44,1055,10.414,1117,10.611,1176,7.498,1207,10.516,1339,5.879,1608,18.647,1617,6.847,1631,7.429,1716,9.36,1726,7.059,2301,8.372,2441,12.137,2574,11.486,2589,8.066,3169,10.288,3666,13.125,3667,13.125,3668,18.233,3669,13.125,3670,13.125]],["keywords/622",[]],["title/623",[149,561.321,240,302.163,428,727.832]],["content/623",[4,1.865,86,5.205,116,5.319,131,6.532,149,8.604,182,2.57,186,3.807,201,4.975,205,3.347,222,3.512,232,7.657,240,5.014,278,3.468,310,5.831,314,7.966,334,3.714,356,5.992,373,3.322,385,4.718,393,6.928,401,5.77,428,12.078,466,6.72,482,7.042,494,9.826,545,4.985,564,5.958,673,6.72,693,5.77,699,8.329,711,5.466,718,5.227,866,10.587,905,7.657,918,7.291,955,7.429,963,4.975,1055,11.162,1171,8.856,1176,7.359,1185,10.415,1189,8.011,1207,7.429,1219,6.205,1297,8.71,1631,7.291,2114,8.447,2488,9.377,2589,7.916,3167,9.826,3671,12.881,3672,12.881,3673,12.881,3674,12.881]],["keywords/623",[]],["title/624",[4,123.338,67,478.927,73,607.783,232,707.558]],["content/624",[3,3.916,4,1.685,6,0.824,40,3.249,51,2.037,63,1.867,67,5.33,72,4.052,88,2.919,96,4.818,113,3.959,116,5.471,131,4.317,162,4.683,182,3.661,186,3.916,200,3.176,201,3.288,204,4.028,205,3.442,232,5.06,240,4.44,248,4.615,250,7.069,255,3.469,297,5.641,298,4.177,314,3.02,331,5.504,334,2.454,356,3.959,393,4.578,394,4.317,407,4.151,467,4.683,490,3.382,494,6.493,504,5.873,529,4.818,542,5.43,545,3.669,549,4.474,551,3.874,560,7.015,562,4.909,564,3.937,633,6.882,685,6.197,688,5.172,693,3.813,698,8.565,699,8.565,703,4.942,705,4.958,706,4.347,711,3.612,716,3.073,717,4.076,720,6.493,735,5.965,862,5.36,866,5.008,894,3.262,897,5.582,905,5.06,908,6.882,911,5.43,937,3.718,957,5.172,961,4.693,991,4.693,996,5.996,1038,5.294,1048,6.882,1055,6.585,1079,6.493,1109,4.409,1112,5.06,1119,4.909,1158,5.231,1164,5.231,1176,4.863,1180,5.115,1187,5.504,1189,8.239,1207,4.909,1297,5.756,1317,5.957,1623,5.756,1631,4.818,1634,6.071,1684,7.134,1686,6.197,1708,5.852,1730,7.872,1853,7.872,2063,7.134,2102,6.882,2429,6.071,2541,6.493,2572,6.882,2586,7.134,2589,5.231,2590,7.449,2625,6.493,2639,7.134,2916,7.872,3167,10.105,3546,9.86,3560,6.197,3582,7.872,3617,10.71,3623,6.493,3675,8.513,3676,8.513,3677,7.134,3678,7.872,3679,8.513,3680,6.493,3681,7.449,3682,8.513]],["keywords/624",[]],["title/625",[72,746.242,134,887.422]],["content/625",[72,9.844,97,7.261,134,11.707,180,9.514,234,9.567,248,11.214,356,9.62,740,9.62,2098,13.024,2741,15.776]],["keywords/625",[]],["title/626",[116,438.714,205,276.033,398,397.855,616,743.425,741,645.446]],["content/626",[4,1.875,6,0.98,18,3.383,19,3.036,25,0.673,40,3.865,49,4.764,116,9.306,131,5.135,148,8.722,155,3.018,180,4.658,181,2.698,183,3.189,184,2.196,204,4.792,205,6.376,206,3.605,220,7.097,223,5.207,228,4.423,240,4.041,246,3.199,272,4.317,288,5.001,301,2.308,314,3.592,315,6.997,345,7.724,356,9.338,381,3.268,397,9.647,398,7.518,403,8.187,455,4.848,543,3.75,545,4.189,616,7.086,650,5.84,668,5.244,711,4.297,716,5.46,735,4.559,740,4.71,741,12.197,785,3.088,901,3.865,1007,5.322,1170,5.171,1188,8.187,1191,6.459,1204,5.207,1329,5.135,1332,8.134,1339,4.536,1377,4.737,1711,6.641,1872,10.797,1931,6.376,2131,6.084,2165,6.847,2708,11.854,2886,12.443,3058,7.724,3563,6.962,3677,8.487,3678,9.364,3683,9.364,3684,9.086,3685,10.126]],["keywords/626",[]],["title/627",[72,566.533,351,933.04,1548,759.279,3623,907.934]],["content/627",[4,1.788,20,7.729,40,6.587,46,5.586,72,8.213,107,4.239,134,9.767,180,7.938,186,5.101,201,6.665,248,11.857,264,5.003,351,13.527,356,8.026,364,9.356,398,6.462,499,9.069,551,7.853,711,7.323,910,6.943,1089,9.952,1170,8.811,1227,14.342,1694,12.075,3109,14.462,3623,13.163,3629,12.561,3686,17.256]],["keywords/627",[]],["title/628",[191,471.331,879,610.406]],["content/628",[4,2.29,23,2.674,25,1.689,33,2.269,116,7.246,184,3.805,205,4.559,206,6.246,240,3.918,398,8.277,523,9.438,596,12.279,885,12.773,993,8.452,2194,14.187,2510,15.356,2514,15.356,2515,13.061,2589,10.784,3687,17.547,3688,17.547,3689,17.547,3690,17.547]],["keywords/628",[]],["title/629",[23,105.321,25,45.956,107,169.742,185,166.935,264,200.341,315,225.08,480,248.599,675,321.43,709,424.695,742,312.793]],["content/629",[]],["keywords/629",[]],["title/630",[107,260.952,185,256.637,675,494.15,709,652.904,732,371.696]],["content/630",[3,4.847,5,2.275,6,1.794,40,4.022,51,2.521,70,5.576,87,3.661,107,3.826,147,6.721,149,4.37,166,5.712,184,2.285,185,4.476,192,3.542,199,5.045,220,3.724,230,4.92,240,4.137,264,3.054,273,2.311,299,6.553,314,3.737,316,7.67,330,3.745,347,4.847,379,4.82,381,5.026,388,5.91,392,4.901,393,5.667,400,7.013,425,3.79,447,6.721,454,6.812,455,5.045,466,5.496,490,4.186,514,3.777,524,6.909,527,5.418,544,3.931,545,4.314,561,7.327,587,6.721,613,3.712,637,6.019,638,6.076,674,5.705,675,4.901,705,6.136,706,5.38,709,6.475,711,6.61,712,6.401,716,3.804,718,4.276,720,8.037,751,6.475,785,3.213,858,5.307,887,6.136,910,6.267,923,6.909,954,5.537,991,5.808,1011,7.124,1012,7.243,1024,4.957,1118,6.812,1127,11.667,1183,5.808,1403,7.514,1554,7.373,1967,8.259,2126,10.367,2241,8.037,3153,8.83,3691,10.536,3692,10.536,3693,10.536,3694,10.536,3695,10.536,3696,10.536]],["keywords/630",[]],["title/631",[25,58.151,107,214.787,185,211.234,264,253.505,556,312.357,675,406.728,709,537.397]],["content/631",[3,6.668,6,2.136,7,4.525,25,0.964,33,1.874,51,3.469,52,3.994,58,5.309,99,5.106,107,3.56,114,5.673,152,2.886,181,3.862,184,3.143,185,3.501,199,6.94,273,3.179,284,5.142,297,4.112,301,3.303,310,6.561,315,4.721,371,7.561,392,6.742,393,7.796,414,7.628,504,6.426,506,7.859,519,7.796,537,4.751,541,7.068,544,5.408,545,4.015,564,6.705,613,5.106,614,6.269,639,6.899,718,5.882,751,8.908,874,6.426,877,8.059,932,6.596,1329,7.35,1406,11.362,1662,11.362,3142,13.403,3697,14.495,3698,14.495,3699,14.495]],["keywords/631",[]],["title/632",[107,260.952,181,283.072,301,242.127,315,346.025,537,348.193]],["content/632",[4,0.523,6,0.836,19,2.588,22,2.97,23,4.119,24,2.981,25,0.336,32,1.068,33,0.653,34,1.977,35,1.447,37,1.45,44,2.404,45,2.45,46,1.634,65,1.654,69,2.696,88,1.731,114,3.29,124,1.89,131,2.56,136,2.911,151,2.664,152,2.667,155,3.373,161,2.728,162,3.052,164,3.553,167,5.822,181,2.301,183,1.59,184,4.187,185,4.237,191,1.517,192,1.697,196,1.571,198,2.307,201,1.949,205,2.94,206,4.028,208,2.759,219,1.876,220,3.052,222,2.355,224,2.618,230,1.595,239,2.577,240,4.129,241,1.876,242,2.782,246,1.595,255,2.057,264,1.463,271,1.79,273,1.894,275,2.875,278,2.324,284,1.79,299,3.139,307,2.911,314,3.063,315,2.812,323,2.782,330,3.946,334,1.455,335,3.6,347,5.205,355,3.403,356,2.348,371,2.633,392,4.016,395,2.122,425,4.071,427,1.855,455,2.417,466,2.633,467,1.784,477,5.029,480,1.816,490,3.431,545,4.17,550,2.857,553,2.261,559,3.22,572,1.803,581,2.142,590,3.682,611,3.178,622,3.504,630,4.924,632,2.969,639,2.402,642,2.261,652,4.134,668,5.86,674,1.849,675,2.348,706,2.577,708,3.178,709,3.102,718,2.048,719,3.47,722,2.542,732,1.766,735,3.888,752,4.417,758,2.183,764,2.759,765,2.83,767,4.933,770,2.493,771,3.46,772,2.094,773,3.403,774,2.759,775,2.417,776,4.11,777,2.249,780,2.673,806,2.431,858,2.542,861,2.348,882,3.102,891,2.782,910,2.031,914,2.375,917,4.23,926,2.577,1003,4.081,1024,5.323,1042,3.263,1126,3.757,1144,4.417,1157,8.949,1169,2.309,1176,2.883,1187,3.263,1188,4.081,1227,3.31,1309,4.062,1310,5.029,1336,4.417,1342,5.838,1343,3,1345,3.139,1346,8.631,1347,3.139,1353,7.237,1354,3.067,1361,2.715,1377,2.361,1400,2.831,1444,2.388,1540,3.139,1663,4.801,1782,3.6,1803,3.757,2126,3.36,2241,3.85,3551,4.081,3684,3.033,3700,5.047,3701,5.047,3702,5.047,3703,5.047,3704,5.047,3705,5.047,3706,5.047,3707,5.047,3708,5.047,3709,4.23,3710,5.047]],["keywords/632",[]],["title/633",[177,806.215,482,857.071]],["content/633",[]],["keywords/633",[]],["title/634",[6,102.858,185,256.637,330,255.425,544,396.364,618,652.904]],["content/634",[12,4.548,18,4.357,19,3.91,25,0.867,44,3.632,46,4.222,51,3.121,63,2.86,69,4.071,70,5.092,107,3.204,124,4.884,147,8.32,152,2.597,162,4.611,166,7.071,184,2.828,185,3.151,192,4.385,205,3.389,220,4.611,222,3.556,225,6.508,230,4.12,240,4.053,278,3.511,281,5.058,297,3.7,330,4.365,499,6.855,544,7.791,545,5.028,568,7.673,611,8.213,618,8.016,622,5.293,668,6.755,701,8.112,711,5.535,713,8.433,732,4.563,740,6.067,812,9.302,920,6.907,943,6.855,957,7.924,963,5.038,983,7.753,1006,7.924,1035,7.924,1111,8.967,1113,9.494,1127,8.213,1157,7.753,1220,7.451,1323,10.224,1444,6.171,1926,9.127,1984,8.32,2178,9.127,3168,10.931]],["keywords/634",[]],["title/635",[225,562.039,278,422.052]],["content/635",[4,1.492,5,3.108,6,1.394,25,1.292,54,6.256,69,4.493,70,3.51,88,4.936,107,3.536,152,3.867,176,5.253,181,3.835,185,3.477,196,4.48,205,3.74,225,7.88,226,7.35,229,8.074,230,4.547,231,10.266,241,5.35,277,11.202,278,3.875,293,4.029,395,6.052,426,8.953,632,8.468,650,8.302,732,5.036,737,4.839,740,6.695,745,7.869,950,9.581,954,7.565,969,9.733,970,10.98,971,8.557,972,9.44,985,6.695,1042,9.307,1140,10.714,1309,6.772,1310,11.312,1686,10.478,1722,10.478,1731,12.064,2845,11.638,3460,12.597]],["keywords/635",[]],["title/636",[435,717.317,765,513.868]],["content/636",[6,1.944,25,1.335,60,5.643,155,4.509,162,5.347,185,4.85,227,7.778,246,4.779,264,5.821,271,5.366,272,6.449,301,3.447,330,3.637,396,4.942,413,7.834,425,5.442,427,5.56,435,9.186,490,6.01,590,6.449,630,5.56,695,7.47,697,9.649,737,6.75,765,6.581,772,6.274,786,6.48,860,9.19,956,9.525,1020,12.677,1043,11.011,1177,9.296,1183,8.338,1192,9.408,1224,8.809,1406,11.857,1890,11.857,1992,12.229,2671,9.919,3711,13.987]],["keywords/636",[]],["title/637",[202,482.305,563,671.65]],["content/637",[]],["keywords/637",[]],["title/638",[480,564.031,1663,871.749]],["content/638",[5,2.371,6,1.554,19,3.292,22,2.882,23,4.153,24,3.79,25,0.73,32,3.398,34,3.676,35,3.149,37,2.695,70,2.678,155,3.273,176,4.007,185,2.652,271,3.895,278,2.956,297,3.115,334,3.166,355,4.327,385,4.022,480,7.511,498,6.829,572,3.922,590,6.845,630,6.977,737,6.381,758,4.749,765,6.22,767,6.273,770,5.423,771,7.604,772,4.555,773,6.327,774,6.002,775,5.257,776,5.226,780,5.814,863,6.333,869,7.201,906,8.705,934,6.748,1121,7.099,1262,6.748,1400,9.006,1402,7.993,1894,12.246,1895,8.376,1897,12.98,1900,11.95,2203,7.201,2669,7.424,3140,10.154,3202,8.877,3352,14.05,3712,10.98,3713,10.98,3714,10.98,3715,7.099]],["keywords/638",[]],["title/639",[742,709.677,1663,871.749]],["content/639",[6,1.239,23,4.127,34,2.931,35,5.139,37,2.149,124,6.711,152,2.549,184,2.776,185,3.093,191,3.849,202,3.938,224,3.882,271,4.541,438,4.794,556,6.401,569,6.282,571,8.395,572,4.573,581,5.433,622,5.195,630,8.233,693,5.734,737,4.304,742,5.795,758,5.537,765,6.776,767,7.314,770,6.322,771,7.18,772,5.31,773,7.062,774,6.998,775,6.13,780,6.779,887,7.456,943,6.728,1130,11.838,1199,10.035,1219,6.167,1398,8.062,1427,6.832,1617,6.679,1889,8.062,1902,11.013,1903,13.338,2082,11.203,2125,10.351,3339,10.351]],["keywords/639",[]],["title/640",[8,562.569,25,70.65,37,178.358,65,348.193,122,466.294]],["content/640",[1,8.536,2,5.165,3,8.812,6,1.365,8,7.468,20,6.317,37,3.216,45,4.001,51,4.584,52,3.886,58,5.165,62,6.041,98,6.041,107,3.464,113,6.559,175,8.771,185,3.407,199,9.171,200,5.261,210,9.387,232,8.383,240,3.149,256,6.634,287,7.01,297,4.001,310,6.383,319,6.284,395,5.93,400,8.625,504,6.252,514,5.055,524,9.248,536,4.835,560,7.468,567,9.248,622,5.723,675,6.559,709,8.667,716,5.091,763,7.201,866,8.296,873,8.473,1110,8.056,1112,8.383,1335,11.054,1427,7.525,1571,9.535,1871,11.402,3716,14.102,3717,14.102,3718,14.102]],["keywords/640",[]],["title/641",[63,343.83,1410,1372.068]],["content/641",[6,1.508,25,1.036,37,3.839,45,4.419,51,4.899,52,4.292,58,5.706,63,5.015,65,5.106,100,5.769,185,3.763,199,7.459,256,7.329,297,4.419,399,8.516,427,5.727,512,6.377,524,10.216,533,8.818,536,5.342,636,8.516,675,9.523,708,9.81,709,9.574,763,7.955,785,4.751,874,6.907,878,10.216,892,9.574,893,6.55,918,8.818,924,9.937,1236,12.212,1427,8.313,1608,16.048,1638,12.212]],["keywords/641",[]],["title/642",[46,385.295,289,553.65,2254,673.714,3719,1100.681]],["content/642",[3,7.683,4,1.731,6,1.617,12,5.824,33,2.16,45,4.738,51,3.997,70,4.073,155,4.979,200,6.232,230,5.277,273,3.663,289,7.769,322,6.14,408,5.526,544,6.232,693,7.482,732,5.844,740,7.769,785,6.532,891,9.207,910,6.721,914,7.858,920,8.845,1031,12.159,1134,9.454,1315,10.518,1388,10.655,1548,10.655,2253,10.136,2254,9.454,3720,16.703]],["keywords/642",[]],["title/643",[2,435.966,37,199.834,1614,607.783,1843,759.279]],["content/643",[2,6.118,6,1.617,37,2.804,44,4.651,63,3.663,69,5.214,70,4.073,224,5.064,278,4.496,322,6.14,356,7.769,385,6.118,405,8.589,563,7.155,564,7.726,581,7.088,675,7.769,688,10.148,693,7.482,709,10.265,739,10.799,893,7.023,937,7.295,1007,8.778,1029,12.159,1119,9.633,1123,12.432,1207,9.633,1614,8.529,1843,10.655,1969,13.093,2043,12.159,2717,12.741,3721,16.703]],["keywords/643",[]],["title/644",[191,471.331,879,610.406]],["content/644",[6,1.698,25,1.352,45,3.524,49,5.843,63,2.724,70,4.278,97,4.36,98,5.321,107,4.309,171,4.581,181,3.309,184,2.693,185,4.238,191,3.734,195,6.577,196,5.46,208,6.79,215,6.528,225,4.452,228,5.425,239,6.342,255,5.062,256,5.843,265,4.468,278,3.343,307,7.163,315,4.045,322,4.566,331,8.031,379,5.683,385,4.549,393,6.68,398,4.651,409,7.923,419,7.546,426,7.725,432,6.528,437,4.875,523,6.68,539,5.777,563,5.321,586,9.245,638,7.163,675,8.159,693,5.563,709,10.781,717,5.947,857,6.387,881,9.041,883,6.734,892,7.633,893,5.222,921,6.433,932,5.652,996,5.622,1228,8.858,1551,10.042,1598,9.041,1602,7.546,1621,10.869,2094,9.245,2243,10.409,3105,11.485,3722,11.485,3723,12.421,3724,12.421,3725,12.421]],["keywords/644",[]],["title/645",[23,206.245,45,383.895,2111,900.729]],["content/645",[]],["keywords/645",[]],["title/646",[29,772.941]],["content/646",[22,6.375,23,4.083,25,1.362,3726,13.064,3727,20.48,3728,20.48,3729,20.48]],["keywords/646",[]],["title/647",[246,427.504,301,308.418,2111,900.729]],["content/647",[5,3.024,23,4.042,30,6.59,32,4.588,33,1.811,34,4.366,69,4.373,84,7.475,89,12.007,124,7.141,154,7.009,229,10.695,230,4.425,246,4.425,249,7.928,272,5.972,301,4.346,373,3.612,483,7.534,490,5.566,706,7.152,735,6.307,886,5.004,1257,8.724,1332,10.255,2111,14.429,3030,11.325,3367,9.185,3684,11.457,3730,12.258,3731,12.258,3732,16.686,3733,12.953,3734,14.007,3735,14.007]],["keywords/647",[]],["title/648",[735,705.949,2111,1043.588]],["content/648",[12,5.432,23,3.947,32,4.333,34,4.687,89,9.81,124,9.096,171,5.346,230,6.468,330,4.922,452,9.47,688,9.465,735,10.296,786,6.674,1317,14.326,2111,16.792,3030,16.552,3367,7.504,3730,13.633,3731,13.633,3732,13.633,3733,14.406]],["keywords/648",[]],["title/649",[3736,1723.121]],["content/649",[23,4.19,32,4.804,89,9.665,98,8.685,124,5.748,164,6.367,183,4.834,360,8.768,483,8.255,593,12.032,735,6.911,809,7.58,1125,10.741,1257,9.275,2106,8.852,2111,15.11,2927,9.665,3030,12.41,3367,7.393,3730,13.432,3731,13.432,3732,13.432,3736,14.193,3737,15.349,3738,15.349,3739,12.864,3740,15.349,3741,15.349]],["keywords/649",[]],["title/650",[703,695.225]],["content/650",[22,5.375,44,5.702,151,6.318,186,6.053,329,9.126,483,11.015,711,8.691,1024,9.635,1268,10.606,2111,13.631,3742,16.558]],["keywords/650",[]],["title/651",[23,238.957,1814,987.288]],["content/651",[]],["keywords/651",[]],["title/652",[29,772.941]],["content/652",[22,6.375,23,4.083,25,1.362,3726,13.064,3743,18.938,3744,18.938,3745,18.938]],["keywords/652",[]],["title/653",[33,153.915,198,317.966,467,420.766,1814,749.53]],["content/653",[4,1.306,12,2.786,22,4.097,23,4.314,24,4.351,25,1.038,32,1.691,34,2.886,35,2.291,37,1.341,54,3.473,67,3.215,92,3.407,124,6.638,136,4.608,149,3.314,152,2.51,155,4.654,162,2.824,171,3.292,173,7.493,184,3.386,198,2.134,222,2.179,246,3.982,275,2.661,301,1.821,355,3.149,373,4.026,391,4.024,427,4.634,458,3.716,468,3.656,694,3.971,776,6,777,3.561,779,5.318,786,5.4,809,6.225,843,3.617,886,5.577,1058,4.138,1109,4.138,1157,4.75,1169,3.656,1204,4.109,1256,4.522,1268,4.138,1276,4.231,1320,6.78,1444,3.781,1511,11.365,1602,7.659,1704,5.031,1743,14.717,1814,13.515,1872,4.297,2088,5.698,2286,10.192,2966,11.032,3039,7.389,3263,6.696,3746,6.696,3747,10.192,3748,6.263,3749,7.99,3750,7.389,3751,7.389,3752,7.99,3753,7.99,3754,12.606,3755,7.99,3756,10.192,3757,7.99,3758,4.969,3759,6.263]],["keywords/653",[]],["title/654",[154,497.46,858,681.596,1814,852.135]],["content/654",[23,4.241,34,5.198,152,3.056,154,5.642,171,5.294,224,4.654,301,3.498,373,5.228,709,9.433,809,10.012,858,10.211,1602,9.325,1713,8.322,1814,12.766,1983,11.173,2058,9.791,2089,10.066,3263,12.864,3748,12.032,3750,20.992,3760,15.349,3761,15.349,3762,15.349,3763,14.193]],["keywords/654",[]],["title/655",[4,110.083,45,301.381,224,322.118,1814,668.979,3764,773.343]],["content/655",[4,1.651,7,4.975,14,5.991,23,3.167,34,4.758,45,4.521,62,6.827,73,8.137,152,5.188,154,5.858,183,5.019,224,6.3,467,5.633,809,12.101,858,8.027,894,6.107,1086,10.304,1125,11.152,1814,10.035,2783,9.682,3748,18.124,3763,14.736,3764,11.6,3765,15.936,3766,15.936,3767,11.6,3768,15.936]],["keywords/655",[]],["title/656",[3769,1421.376]],["content/656",[4,1.651,19,4.777,33,2.687,54,6.926,63,3.495,107,3.914,136,9.191,149,6.61,155,4.75,173,9.473,224,4.832,301,3.632,308,5.158,373,5.963,391,8.027,413,8.253,444,11.152,512,6.523,514,5.713,550,9.02,717,7.63,782,9.375,786,6.827,1058,8.253,1082,10.607,1398,10.035,1743,12.156,1814,15.429,2088,14.819,3715,10.304,3770,11.862,3771,14.736,3772,14.736]],["keywords/656",[]],["title/657",[25,70.65,33,137.374,100,393.423,142,624.992,1081,652.904]],["content/657",[]],["keywords/657",[]],["title/658",[33,174.985,142,796.106,437,531.112]],["content/658",[]],["keywords/658",[]],["title/659",[308,507.514,965,975.122]],["content/659",[4,1.109,5,4.036,6,1.997,10,4.233,16,5.501,22,4.134,23,3.959,28,6.813,29,6.534,32,2.264,34,4.722,44,2.979,51,2.56,58,5.769,60,3.991,70,2.609,87,3.718,99,3.769,104,7.234,107,2.628,142,6.294,154,3.933,161,3.38,164,3.36,171,2.794,184,2.32,186,3.162,189,5.463,202,3.291,222,2.917,230,3.38,232,6.359,265,3.849,273,3.454,275,3.562,286,6.575,297,3.035,308,6.675,322,3.933,334,3.085,389,5.501,440,7.286,527,5.501,535,8.386,549,5.623,556,7.852,557,6.259,674,3.918,694,5.318,809,5.283,965,13.671,2098,6.737,2502,5.318,2861,8.386,3773,9.893,3774,15.752,3775,10.698,3776,10.698,3777,10.698,3778,11.233,3779,10.698,3780,10.698,3781,6.824,3782,10.698]],["keywords/659",[]],["title/660",[3783,1863.425]],["content/660",[4,1.579,5,4.356,6,2.19,10,6.029,11,9.992,37,3.387,44,4.243,51,4.828,52,4.198,54,6.622,75,9.852,76,9.057,142,11.869,175,9.476,176,5.56,182,3.04,191,4.58,200,7.527,264,4.417,275,5.073,301,3.473,308,4.932,373,3.929,375,7.949,467,5.386,539,7.087,567,9.992,664,10.094,692,7.78,775,7.295,915,11.341,944,8.547,1109,7.891,1143,9.852,1444,7.21,1860,11.622,2301,9.719,3784,13.334]],["keywords/660",[]],["title/661",[100,690.067]],["content/661",[4,2.01,5,1.745,6,1.232,14,4.782,16,4.156,19,2.423,22,4.128,23,3.894,28,3.496,29,5.277,30,3.803,32,2.692,33,2.509,34,1.851,37,2.641,53,3.414,73,4.127,82,5.656,85,3.893,98,3.463,100,8.271,107,1.985,114,3.698,140,6.336,142,12.682,152,1.609,162,2.857,171,2.111,175,5.027,180,5.852,182,3.139,183,2.546,184,1.753,186,2.389,198,3.398,201,3.122,202,3.913,205,3.305,215,4.248,217,2.887,240,1.805,264,3.688,271,2.867,273,2.79,274,5.226,311,3.463,314,2.867,315,2.633,322,2.971,329,3.602,366,3.893,368,5.09,372,5.226,389,4.156,407,3.942,416,5.38,417,5.728,437,3.172,467,2.857,480,2.908,483,6.842,516,4.156,544,3.016,577,5.027,607,4.382,698,5.226,737,2.718,785,2.465,879,3.147,897,5.301,1021,4.347,1255,6.535,1631,4.575,1650,4.805,1713,4.382,1872,4.347,2467,6.774,2560,5.301,2753,7.475,2966,7.074,2995,6.336,3223,6.016,3785,6.774,3786,15.612,3787,12.722,3788,8.083,3789,8.083,3790,5.656,3791,7.074,3792,7.074,3793,7.074,3794,7.074,3795,7.074,3796,7.074,3797,12.722,3798,7.074,3799,8.083,3800,8.083,3801,8.083,3802,8.083,3803,8.083,3804,8.083,3805,7.074,3806,8.083,3807,8.083,3808,7.475,3809,7.475]],["keywords/661",[]],["title/662",[25,123.921]],["content/662",[4,1.646,5,2.613,6,1.172,7,2.913,8,2.928,10,2.188,12,1.928,18,1.847,20,2.477,22,4.52,23,4.145,24,3.221,25,1.379,28,2.392,29,3.87,32,3.009,33,2.054,34,3.636,35,4.939,37,2.032,44,1.54,45,2.647,51,1.323,52,2.571,61,2.974,63,1.213,73,4.765,83,4.025,84,4.979,86,2.234,100,7.678,103,2.464,107,1.358,108,2.885,111,3.521,114,1.608,122,2.427,142,12.197,152,1.858,155,1.648,162,1.955,164,1.736,171,1.444,175,3.439,176,2.018,180,4.292,182,2.837,183,1.742,185,1.336,186,1.634,191,1.662,192,1.859,196,1.721,198,3.798,200,2.063,224,3.67,251,3.075,264,4.122,271,1.962,273,3.118,275,1.841,284,1.962,288,2.731,319,2.464,330,1.33,334,1.594,359,4.025,373,1.426,387,3.221,400,2.49,408,5.699,414,2.162,421,2.864,534,3.944,538,2.749,539,2.572,543,3.455,544,2.063,555,3.439,572,1.975,630,5.227,660,3.102,722,2.785,736,2.071,737,1.859,757,3.575,758,2.392,763,7.26,764,3.023,765,1.812,770,2.731,771,4.85,772,2.294,773,3.677,774,3.023,775,2.648,777,2.464,787,2.68,804,4.522,805,3.626,875,2.928,894,2.119,975,2.974,1077,5.281,1143,3.575,1160,2.804,1219,2.664,1300,2.544,1308,3.13,1313,3.287,1320,2.974,1333,4.116,1613,3.075,1891,3.87,2106,3.189,3778,3.323,3781,7.721,3786,10.593,3790,3.87,3791,4.839,3792,4.839,3793,4.839,3794,4.839,3795,4.839,3796,4.839,3798,4.839,3805,4.839,3810,4.839,3811,8.166,3812,4.839,3813,3.36,3814,3.626,3815,4.839,3816,4.839,3817,4.839,3818,8.166,3819,4.839]],["keywords/662",[]],["title/663",[191,471.331,879,610.406]],["content/663",[25,1.336,33,2.597,179,9.983,188,11.266,205,5.219,206,7.149,857,10.328,883,10.889,886,7.174,1444,9.504,3186,16.238,3820,18.572,3821,17.576]],["keywords/663",[]],["title/664",[6,151.799,435,717.317]],["content/664",[6,2.085,152,4.288,193,8.63,435,9.854,1058,11.155,1388,13.739]],["keywords/664",[]],["title/665",[3255,1561.679]],["content/665",[]],["keywords/665",[]],["title/666",[334,537.276]],["content/666",[2,5.749,18,5.243,20,10.281,25,1.044,28,8.898,29,6.511,37,3.454,46,5.081,65,5.144,81,11.194,94,9.762,107,3.855,122,6.889,186,4.639,196,4.885,222,4.28,271,5.568,373,5.306,398,5.878,458,7.301,642,7.031,853,8.967,879,6.111,886,5.607,1089,11.866,1264,11.683,1697,8.884,2667,13.154,3280,12.69,3822,15.696,3823,12.304,3824,15.696,3825,15.696,3826,15.696,3827,15.696,3828,12.304]],["keywords/666",[]],["title/667",[20,702.281,569,769.371]],["content/667",[14,7.27,20,11.32,89,12.178,98,8.284,198,6.27,202,5.949,458,8.995,886,6.908,1114,9.875,2892,19.671,2976,16.924,3829,19.339,3830,14.394]],["keywords/667",[]],["title/668",[186,463.43,3831,1313.99]],["content/668",[20,10.243,28,6.738,46,6.627,97,5.469,98,6.674,111,5.878,155,6.816,156,10.841,186,4.605,198,4.162,202,4.792,255,6.349,330,3.746,368,9.81,373,5.28,409,9.937,441,15.616,516,8.011,711,6.611,879,6.065,1024,7.329,1108,10.533,1310,9.073,1648,14.326,2098,9.81,2099,13.056,2194,12.595,2301,9.937,2976,13.633,3832,15.579,3833,15.579,3834,15.579,3835,14.406,3836,15.579]],["keywords/668",[]],["title/669",[1074,857.071,1147,864.293]],["content/669",[44,6.06,1147,11.997,1598,15.842,1749,16.601,3255,18.239]],["keywords/669",[]],["title/670",[387,1085.252]],["content/670",[20,8.541,28,8.247,29,5.81,44,3.9,67,7.672,71,15.98,72,6.667,89,8.82,109,9.057,114,4.072,152,2.789,185,3.384,186,4.14,190,6.552,301,3.192,311,6.001,361,7.857,366,6.747,373,6.001,387,8.158,466,11.309,510,7.103,596,9.802,674,5.13,769,10.196,806,10.442,1147,10.511,1339,6.274,1716,9.99,2308,8.82,2344,11.325,2642,11.325,2707,10.685,2892,11.739,3255,11.739,3280,11.325,3830,16.136,3831,11.739,3837,12.953,3838,14.007,3839,12.953,3840,14.007,3841,14.007,3842,14.007]],["keywords/670",[]],["title/671",[1792,1077.888,1872,843.27]],["content/671",[]],["keywords/671",[]],["title/672",[504,695.115,581,665.361]],["content/672",[23,4.293,24,6.214,32,3.81,34,4.122,50,9.924,151,5.554,164,5.653,167,7.824,355,7.094,1260,15.087,3843,18.002,3844,18.002,3845,15.754,3846,15.754,3847,15.754]],["keywords/672",[]],["title/673",[257,702.281,581,665.361]],["content/673",[22,4.567,23,4.312,24,6.006,32,3.682,34,3.984,50,9.592,151,5.368,164,5.464,167,7.562,355,6.857,834,15.227,1260,14.583,3845,15.227,3846,15.227,3847,15.227,3848,21.986]],["keywords/673",[]],["title/674",[581,665.361,1263,1118.181]],["content/674",[8,7.176,23,4.356,24,4.678,32,2.868,34,3.103,45,3.844,50,7.47,87,4.709,125,5.362,144,8.328,151,4.181,162,4.79,164,4.256,167,5.89,171,3.539,196,5.802,203,6.872,355,5.34,366,6.528,1220,7.742,1254,9.163,1260,11.357,1872,11.461,2942,10.623,3845,11.859,3846,11.859,3847,11.859,3849,11.859,3850,12.531,3851,11.859,3852,13.552,3853,13.552,3854,13.552,3855,11.859]],["keywords/674",[]],["title/675",[1090,907.934,1792,818.312,1872,640.194,3375,792.272]],["content/675",[4,1.882,22,4.766,23,3.442,151,5.602,154,6.675,203,9.208,438,6.8,1090,13.851,1617,9.473,1792,15.524,1872,13.218,3375,12.087,3856,16.792,3857,18.159,3858,13.851,3859,13.516,3860,24.577,3861,18.159]],["keywords/675",[]],["title/676",[972,887.426,1845,1134.114,3375,900.729]],["content/676",[4,2.231,14,6.33,22,4.419,23,3.282,25,1.432,33,2.177,45,4.777,51,4.029,87,5.851,111,6.354,154,6.19,198,4.498,458,7.832,763,8.598,950,11.207,972,14.12,1026,12.844,1792,11.576,1845,18.045,1872,9.056,1914,12.008,2813,14.735,3375,11.207,3862,15.57,3863,19.893,3864,14.111]],["keywords/676",[]],["title/677",[25,89.993,45,383.895,628,765.941]],["content/677",[]],["keywords/677",[]],["title/678",[25,89.993,628,765.941,785,412.676]],["content/678",[4,1.556,19,4.502,23,4.1,25,1.493,32,3.178,45,4.26,110,6.624,124,7.483,171,5.218,177,7.722,260,7.777,373,3.873,414,5.87,476,12.14,545,6.22,590,6.403,628,11.31,737,6.718,785,7.602,1114,10.203,1300,9.192,2671,9.848,3865,13.142,3866,15.017,3867,11.455]],["keywords/678",[]],["title/679",[785,568.257]],["content/679",[4,1.818,40,6.698,44,4.886,64,11.864,152,3.493,186,5.187,246,5.543,260,9.087,301,3.999,329,7.819,398,6.571,476,10.661,515,8.666,545,4.86,711,7.446,716,6.335,785,7.745,879,6.831,993,8.452,1024,8.255,1155,11.864,1991,13.755,2165,11.864,3865,15.356,3868,17.547]],["keywords/679",[]],["title/680",[29,772.941]],["content/680",[4,1.622,5,2.73,22,5.073,23,4.253,24,4.364,25,1.181,32,3.312,33,1.037,34,4.067,35,2.3,36,4.184,37,1.347,44,2.233,45,5.039,70,1.956,111,5.906,152,1.597,171,2.094,198,3.378,224,2.432,225,2.875,241,2.981,246,3.994,271,2.845,275,2.671,319,5.635,334,2.313,373,2.069,467,5.533,476,11.744,572,2.865,590,3.42,628,13.971,630,5.754,737,5.262,758,6.769,765,5.13,770,3.961,771,6.271,772,3.327,773,3.161,774,4.385,775,6.054,776,6.018,777,3.574,779,5.339,780,4.247,785,4.773,787,3.887,879,3.123,1160,4.067,1219,3.864,1300,3.69,1309,3.773,1712,5.613,1931,5.051,2121,7.771,2671,5.26,2768,5.613,3726,5.116,3747,6.485,3867,6.118,3869,8.021,3870,8.021,3871,8.021,3872,12.644,3873,8.021,3874,8.021,3875,8.021,3876,6.485,3877,8.021,3878,7.019,3879,6.485]],["keywords/680",[]],["title/681",[628,765.941,785,412.676,1165,887.426]],["content/681",[4,1.664,14,4.128,18,5.363,19,3.292,23,4.108,34,2.514,54,4.772,62,4.704,65,3.599,67,6.46,97,3.855,107,2.697,152,3.196,171,2.867,201,4.241,222,2.994,301,2.503,334,3.166,373,5.984,381,3.543,476,11.531,557,4.363,600,5.906,611,6.914,628,11.818,656,6.527,667,8.376,668,5.687,716,3.964,737,3.692,775,9.087,785,7.493,804,11.246,942,11.403,955,6.333,975,5.906,1041,8.607,1165,10.529,1192,6.829,1268,5.687,1300,5.051,1712,7.684,2079,6.273,3659,9.202,3867,12.246,3878,9.609,3879,15.344,3880,9.202,3881,14.846]],["keywords/681",[]],["title/682",[69,371.572,373,306.972,490,472.946,785,362.986]],["content/682",[4,1.181,23,4.404,33,1.474,34,2.61,53,4.816,54,4.955,67,4.587,69,3.559,152,3.285,172,6.575,186,3.37,187,7.007,222,3.109,230,6.126,246,3.602,322,4.191,396,3.725,490,4.53,628,9.339,668,5.904,736,6.179,785,5.032,804,10.3,901,4.352,1192,7.091,1479,6.395,1646,7.589,2031,8.131,2508,9.218,3878,9.977,3879,17.183,3882,11.401]],["keywords/682",[]],["title/683",[628,887.422,787,759.84]],["content/683",[4,1.556,23,4.203,34,4.12,45,2.845,69,3.131,88,3.439,152,4.471,154,5.519,171,4.699,184,2.175,186,2.964,205,2.606,225,3.595,273,2.199,373,2.586,425,3.608,427,3.687,438,3.756,458,4.665,476,12.998,556,3.582,628,10.185,668,5.194,716,3.621,771,8.005,785,6.524,787,10.368,804,4.86,993,4.831,1165,6.577,1169,10.273,1204,5.157,1257,4.588,1300,9.841,1417,5.482,1614,5.121,1686,7.3,2058,6.397,2130,6.577,2131,6.026,2321,6.315,2671,6.577,2677,7.018,2779,6.163,3778,10.812,3867,7.65,3879,12.138,3881,9.274,3883,8.776,3884,9.274,3885,15.014,3886,15.014]],["keywords/683",[]],["title/684",[152,312.153,809,774.288]],["content/684",[23,4.082,34,5.087,88,6.068,124,8.321,152,3.523,154,6.505,171,5.802,447,11.288,628,12.577,785,5.396,809,8.739,810,15.486,2130,11.605,3879,14.307,3887,15.276,3888,15.486,3889,17.696]],["keywords/684",[]],["title/685",[184,340.004,628,887.422]],["content/685",[5,4.098,6,2.092,19,4.171,25,1.262,53,5.877,152,5.199,184,5.267,186,4.113,192,4.678,220,4.918,223,9.76,230,4.396,239,7.105,241,7.055,334,4.012,368,8.762,427,5.115,543,5.153,545,5.257,569,6.828,628,13.747,737,6.381,772,7.873,785,7.407,942,8.36,1111,9.566,1792,9.566,1862,12.176,1872,7.483,2075,10.613,2861,10.907]],["keywords/685",[]],["title/686",[629,1267.615,3890,1567.878]],["content/686",[4,2.521,6,2.068,25,1.298,33,2.151,40,4.4,45,4.718,70,2.811,88,3.952,92,4.915,110,5.085,152,2.295,162,4.075,177,5.927,184,2.5,186,3.407,202,3.546,217,4.118,220,6.897,222,4.535,230,3.642,233,10.088,241,4.285,246,3.642,273,2.528,274,7.453,288,5.693,310,5.218,381,6.893,387,6.713,398,4.317,414,7.627,421,5.97,435,5.274,452,5.332,515,5.693,551,5.245,607,6.25,628,13.357,629,13.447,668,5.97,732,4.033,765,3.778,785,5.072,857,5.927,894,4.417,1000,6.2,1169,5.274,1204,10.033,1224,6.713,1227,7.559,1595,7.169,1604,7.453,1821,7.673,2023,5.621,2165,7.794,2628,8.793,2683,14.555,3333,9.32,3891,11.527]],["keywords/686",[]],["title/687",[4,162.462,628,887.422]],["content/687",[4,2.469,18,5.67,67,6.83,70,4.14,152,4.744,217,6.064,225,6.085,230,5.363,319,7.564,330,4.081,334,4.894,396,7.071,516,8.729,628,14.203,667,12.948,668,8.791,717,8.128,754,13.306,772,7.041,785,5.177,1040,10.828,1134,9.608,1310,9.886,1646,11.299]],["keywords/687",[]],["title/688",[179,779.313,628,887.422]],["content/688",[4,1.62,6,1.514,7,3.306,18,5.222,19,3.174,21,6.107,25,1.04,45,3.004,46,5.06,70,2.583,79,5.608,85,5.101,86,4.279,114,4.545,118,8.875,125,4.19,152,3.7,171,2.765,177,5.445,179,5.264,192,3.56,222,2.888,225,8.494,227,5.445,228,4.625,229,5.94,230,3.345,231,7.552,252,4.106,271,3.756,278,2.851,322,3.893,330,2.546,381,5.997,395,4.453,425,3.81,440,4.898,483,5.696,486,6.295,496,4.279,510,7.928,536,3.631,545,2.933,552,8.216,590,6.665,614,4.58,622,4.297,628,12.965,630,3.893,639,5.04,645,6.23,668,5.484,715,7.882,717,5.07,732,5.47,737,3.56,739,6.847,785,3.229,894,5.991,1082,7.048,1116,7.771,1197,7.41,1309,8.743,1310,9.105,1558,6.508,1596,9.792,1728,7.882,1889,6.668,1966,7.41,2032,8.562,2304,7.709,2612,7.552,3892,10.59,3893,10.59,3894,10.59,3895,10.59]],["keywords/688",[]],["title/689",[577,975.122,628,887.422]],["content/689",[4,1.481,6,1.384,44,3.981,64,9.666,67,5.752,111,5.394,217,5.107,225,6.93,254,8.498,271,5.071,296,10.641,297,4.055,322,7.107,330,3.437,334,4.122,389,7.351,425,5.143,440,6.612,462,5.68,486,8.498,545,3.96,598,9.666,607,7.751,628,13.283,639,6.804,761,10.406,785,5.896,952,8.091,1047,10.406,1108,9.666,1310,12.758,1501,8.167,2106,8.245,2186,13.219,2301,9.119,2421,10.641,2422,11.558,3592,10.641,3896,14.296,3897,14.296,3898,12.51,3899,14.296,3900,14.296,3901,14.296,3902,14.296,3903,14.296,3904,14.296]],["keywords/689",[]],["title/690",[225,485.1,1110,773.065,1309,636.63]],["content/690",[4,1.906,6,1.781,14,6.915,25,0.884,49,6.253,63,2.915,70,3.242,92,5.667,107,3.265,113,6.183,114,5.347,179,6.607,181,3.542,184,2.883,225,6.594,226,6.787,230,4.199,264,3.854,272,7.843,298,6.523,395,5.589,425,6.617,515,6.564,529,7.524,573,9.138,628,11.939,639,6.327,715,9.894,858,6.695,901,5.074,905,7.901,921,6.884,954,6.986,965,8.267,971,10.934,1220,7.593,1239,11.14,1309,8.653,1310,13.257,1479,7.456,1646,8.847,1728,9.894,2078,11.632,2677,9.302,2804,12.292,3767,9.676,3905,13.292,3906,12.292,3907,13.292,3908,13.292,3909,13.292,3910,13.292]],["keywords/690",[]],["title/691",[19,240.822,65,263.302,225,287.985,381,259.246,628,454.709,737,270.095,1309,377.942,1310,467.879]],["content/691",[6,1.247,11,8.447,19,5.395,23,3.969,32,2.726,35,5.161,65,5.898,70,3.141,79,6.821,88,6.171,113,5.992,152,3.583,161,4.069,164,5.651,204,8.516,225,4.618,241,4.788,246,4.069,271,4.569,298,8.831,301,2.936,310,5.831,330,4.327,545,5.745,552,6.77,592,7.826,628,7.291,632,7.578,668,6.671,737,4.331,772,5.343,785,3.928,1116,6.403,1309,6.06,1310,10.481,2552,10.415,2690,11.273,2692,9.014,3170,9.826,3583,16.642,3911,12.881,3912,12.881,3913,12.881,3914,12.881,3915,12.881,3916,12.881,3917,12.881,3918,12.881,3919,9.377,3920,11.912]],["keywords/691",[]],["title/692",[45,444.782,506,850.067]],["content/692",[]],["keywords/692",[]],["title/693",[23,161.915,408,351.501,506,575.999,3921,832.767,3922,890.35]],["content/693",[2,5.421,4,1.534,5,2.124,6,0.953,12,7.774,23,4.194,24,3.396,25,1.183,32,4.491,34,2.253,35,2.822,37,3.743,45,4.199,68,5.171,73,5.024,151,4.566,167,4.276,189,5.024,198,3.954,273,2.158,289,9.87,293,2.754,355,3.877,373,2.538,408,6.547,438,3.685,490,5.881,506,10.729,556,5.287,643,7.017,652,4.711,716,3.552,843,6.699,894,3.771,983,11.763,996,4.454,1612,13.242,1628,5.788,1716,7.017,2253,4.656,3921,7.713,3922,8.246,3923,7.324,3924,16.451,3925,16.451,3926,9.839,3927,9.098,3928,14.8,3929,14.8,3930,9.839,3931,9.839,3932,9.839,3933,9.839]],["keywords/693",[]],["title/694",[1021,1002.228]],["content/694",[33,2.874,506,12.051,689,12.151]],["keywords/694",[]],["title/695",[23,146.203,107,356.649,181,255.603,185,231.733,577,596.617]],["content/695",[]],["keywords/695",[]],["title/696",[46,438.039,405,695.85,527,695.85]],["content/696",[4,1.526,5,4.475,6,2.007,9,3.347,14,4.418,15,4.261,16,3.762,18,2.444,19,2.193,37,1.228,40,2.793,44,3.272,46,2.368,49,3.442,51,4.72,52,4.058,61,9.071,70,4.113,72,5.594,75,7.599,77,5.915,107,1.797,111,2.761,122,3.211,124,2.74,131,3.71,147,4.667,149,6.11,162,2.586,171,1.911,176,4.289,181,1.95,182,1.46,186,4.354,191,5.553,204,3.462,205,3.827,215,3.845,220,2.586,222,3.205,230,2.311,240,3.289,254,4.349,271,2.595,275,3.913,287,3.637,304,3.685,315,2.383,330,1.759,382,3.762,391,3.685,392,3.403,396,3.84,405,3.762,413,6.087,418,5.735,457,4.947,458,3.403,467,2.586,490,2.907,498,4.55,507,7.309,515,3.613,521,5.915,539,5.467,545,2.027,576,6.132,581,3.105,673,3.817,674,2.68,694,3.637,703,6.292,711,3.105,716,2.641,736,2.74,773,2.883,812,8.382,827,4.497,855,4.349,864,4.798,866,4.304,878,4.798,884,4.261,894,4.504,944,8.262,958,5.436,967,5.326,1109,3.789,1158,4.497,1160,3.71,1174,4.445,1317,5.12,1327,3.904,1389,5.915,1413,6.132,1444,3.462,1526,4,1617,6.131,1705,5.915,1706,4.798,1707,8.382,1708,5.03,1710,8.965,1712,5.12,1713,3.967,1722,5.326,1724,4.731,1743,5.581,1745,6.766,1766,7.823,1902,4.497,2242,5.735,2431,5.581,2533,10.285,2534,6.132,2537,6.766,2671,4.798,2714,10.126,2720,4.607,2861,5.735,3094,6.403,3097,6.403,3274,6.132,3934,7.317,3935,7.317,3936,7.317,3937,6.766,3938,6.766,3939,6.766]],["keywords/696",[]],["title/697",[10,470.996,15,693.228,37,199.834,51,284.834]],["content/697",[4,1.471,5,5.052,6,2.368,18,4.743,19,4.256,37,2.384,46,4.596,51,5.224,52,3.912,53,8.129,70,4.693,156,7.519,184,3.079,185,3.43,191,4.268,205,3.689,220,6.803,229,7.964,246,6.079,278,3.822,308,4.596,357,10.126,364,7.698,410,9.18,444,9.936,487,8.941,663,7.827,668,7.353,809,9.503,873,8.531,894,7.374,932,6.461,1112,8.44,1143,9.18,1332,7.636,1333,10.568,2720,8.941,2724,10.568,2728,10.83,2729,13.129,3940,14.198]],["keywords/697",[]],["title/698",[225,667.984]],["content/698",[4,1.228,5,1.966,6,0.52,12,1.873,18,4.662,22,1.41,23,2.127,33,1.805,37,0.902,40,5.327,44,2.536,46,1.739,54,2.335,62,2.302,67,3.664,70,3.809,72,2.557,86,2.171,88,5.356,107,2.237,110,2.37,114,1.562,116,6.45,125,3.603,148,3.099,152,4.743,154,5.13,161,1.697,162,5.998,181,2.426,183,1.692,184,3.026,198,2.433,201,2.075,203,2.725,204,4.309,205,4.698,206,1.913,217,1.919,220,3.219,224,1.629,225,8.329,226,9.233,227,7.176,228,2.347,230,2.877,231,9.953,240,3.116,242,2.962,246,2.877,252,2.083,271,5.541,273,1.178,277,3.099,278,1.446,279,3.194,282,6.946,288,2.653,296,3.999,298,4.469,301,1.225,310,2.432,322,4.357,325,3.76,330,4.348,366,2.588,381,2.939,387,3.129,388,3.014,407,2.62,419,3.264,437,2.109,455,4.36,481,2.962,482,2.937,483,2.89,490,2.135,520,2.432,544,2.005,552,2.824,580,4.189,597,4.212,607,2.913,622,2.18,628,6.708,630,1.975,631,3.129,632,3.161,664,2.688,673,4.751,689,2.937,716,5.639,734,2.706,736,3.41,771,4.749,775,4.36,858,2.706,894,3.49,906,2.913,1009,4.702,1072,8.294,1074,2.937,1081,3.302,1086,5.888,1114,4.65,1116,2.671,1125,3.76,1160,2.725,1166,3.523,1169,2.458,1173,3.194,1192,3.342,1268,6.138,1272,3.911,1332,2.89,1398,3.383,1444,2.542,1560,3.694,1571,3.633,1611,10.388,1724,5.888,1822,3.999,1946,4.344,1966,3.76,1970,3.832,2129,4.968,2178,6.373,2334,4.212,2444,5.533,2541,4.098,2552,4.344,2589,5.597,2598,4.098,2605,4.968,2677,6.373,2683,4.702,2708,4.212,2979,3.633,3067,7.969,3515,4.503,3563,3.694,3715,3.474,3919,3.911,3941,9.107,3942,5.373,3943,5.373,3944,5.373,3945,11.852,3946,5.373]],["keywords/698",[]],["title/699",[180,721.234,3947,1449.827]],["content/699",[7,5.234,12,4.064,18,3.894,22,3.059,33,2.168,70,2.843,88,3.997,107,2.863,148,6.722,156,6.172,180,10.465,181,3.106,184,2.528,185,2.816,192,3.919,194,6.788,196,3.628,205,5.102,206,6.989,211,9.424,219,6.232,220,5.927,222,3.178,246,5.296,264,3.379,273,2.556,301,3.821,321,7.163,330,4.031,361,6.538,373,5.538,424,10.84,490,4.631,496,4.71,499,6.126,570,10.778,650,6.722,675,5.422,704,6.126,716,4.208,736,4.365,740,5.422,769,8.485,865,7.644,888,6.081,910,4.69,1066,6.22,1251,8.485,1554,8.157,1610,7.249,1634,8.313,2098,10.557,2114,7.644,2117,7.644,2183,12.204,2192,9.424,2281,7.758,2421,8.676,2482,9.769,2586,9.769,2741,8.891,2813,10.2,3454,10.778,3677,9.769,3948,11.656,3949,11.656,3950,11.656]],["keywords/699",[]],["title/700",[985,729.273,1860,1195.939]],["content/700",[4,1.71,6,1.104,16,5.862,18,7.099,22,2.992,70,5.183,72,5.426,107,4.053,114,3.314,124,4.27,152,3.285,181,5.663,184,5.098,185,2.754,198,3.046,205,5.038,220,5.833,246,3.602,264,5.622,278,3.069,301,2.598,366,7.948,373,2.94,374,9.218,388,9.255,402,6.575,433,8.299,464,8.486,476,6.927,482,6.232,487,7.179,501,5.862,544,6.156,545,3.158,579,7.371,582,6.395,648,7.179,716,5.957,736,4.27,740,5.303,812,8.131,886,4.073,894,4.369,1155,7.709,1204,5.862,1332,6.132,1564,7.273,1695,9.977,1991,8.937,2430,9.555,2517,9.977,2617,12.934,2642,9.218,2783,6.927,3919,8.299,3937,10.543,3938,10.543,3951,7.978,3952,9.218,3953,11.401,3954,11.401,3955,11.401,3956,11.401,3957,11.401,3958,11.401]],["keywords/700",[]],["title/701",[305,975.122,359,1141.31]],["content/701",[5,2.371,6,1.554,14,6.035,15,9.35,18,3.668,19,3.292,25,0.73,33,2.454,40,4.191,44,3.057,65,3.599,70,5.659,72,5.226,88,3.765,92,4.682,107,2.697,144,6.748,152,4.423,171,2.867,181,2.926,184,5.032,186,3.246,192,3.692,198,4.289,201,4.241,219,4.081,220,6.709,222,2.994,228,4.796,239,5.607,241,4.081,242,6.053,243,5.051,246,5.072,264,3.183,273,2.408,278,4.322,305,6.829,316,7.993,322,4.036,334,3.166,359,11.687,368,6.914,396,6.822,421,8.315,426,6.829,534,7.831,716,6.852,736,6.013,737,3.692,747,7.831,856,7.099,894,4.208,906,5.953,912,5.728,1160,5.568,1173,6.527,1564,7.004,1863,12.585,1926,11.235,1966,7.684,1970,7.831,3469,9.609,3919,7.993,3959,10.98]],["keywords/701",[]],["title/702",[33,174.985,205,351.607,435,619.122]],["content/702",[5,2.666,6,1.195,14,6.567,33,2.85,70,3.011,88,4.234,107,3.033,111,4.659,125,4.886,147,7.876,148,7.121,152,4.036,156,6.538,162,7.166,181,3.29,182,3.485,185,2.983,186,3.649,192,4.151,196,3.843,201,4.769,205,4.539,220,4.365,222,3.367,223,6.349,227,6.349,254,7.339,264,3.579,293,3.456,301,2.814,330,4.2,398,4.624,435,10.64,444,8.64,487,7.775,545,5.615,568,7.264,737,4.151,765,5.725,864,8.097,995,8.806,1204,6.349,1224,7.191,1332,6.641,1564,7.876,1629,9.678,2111,8.218,2443,9.678,2532,10.348,2707,9.418,2752,11.417,2783,7.501,2830,11.417,3680,9.418,3960,10.805,3961,10.805,3962,12.347,3963,9.418,3964,12.347,3965,12.347]],["keywords/702",[]],["title/703",[58,574.258,63,343.83]],["content/703",[1,3.778,4,1.681,5,3.502,6,1.921,7,4.122,9,3.879,12,4.604,15,4.937,19,2.541,25,0.878,30,3.988,33,1.096,37,2.217,40,5.041,41,8.929,44,3.677,51,4.382,52,3.639,62,3.632,63,3.557,67,6.526,70,3.22,84,8.656,86,5.336,97,2.976,107,3.244,114,4.715,124,3.175,125,3.355,151,2.616,152,1.688,154,7.295,173,7.85,181,3.519,186,2.506,187,5.21,198,2.265,200,3.163,201,5.1,219,4.908,234,3.921,240,1.893,246,2.678,264,3.828,278,2.282,293,2.373,308,2.744,357,6.046,364,4.597,373,3.406,395,3.565,399,7.219,400,8.245,408,2.805,458,3.943,469,6.646,496,3.426,501,6.79,544,4.927,545,2.348,642,3.797,648,5.338,660,4.755,683,5.933,689,4.634,703,3.163,785,2.585,787,4.109,886,3.028,889,5.732,902,4.843,940,8.023,983,5.04,1030,6.48,1602,5.151,1713,7.16,1827,4.755,1874,6.854,2023,4.134,2065,10.676,2130,8.66,2175,6.31,2427,6.467,2443,6.646,2555,7.419,2567,7.105,2610,7.419,2738,7.84,2739,7.84,2740,7.105,3158,6.854,3159,7.419,3448,6.854,3564,6.046,3966,8.478,3967,8.478,3968,8.478,3969,8.478,3970,8.478,3971,8.478,3972,8.478,3973,8.478,3974,8.478,3975,8.478]],["keywords/703",[]],["title/704",[967,1141.31,3963,1195.939]],["content/704",[6,1.384,14,5.374,33,1.849,37,2.4,46,4.627,62,6.124,63,3.135,65,6.336,107,3.511,156,7.57,176,7.994,177,7.351,181,3.809,189,7.3,192,6.5,205,5.023,220,5.053,264,5.605,272,6.095,273,3.135,306,10.195,321,8.786,372,9.243,373,5.649,391,7.2,407,6.971,482,7.815,543,5.294,555,8.891,703,5.334,723,9.666,888,10.086,967,14.073,1109,7.404,1315,9.002,1339,6.403,1602,8.685,1650,8.498,2131,8.59,2281,9.515,2308,9.002,2560,9.375,3067,12.51,3564,10.195,3976,14.296]],["keywords/704",[]],["title/705",[6,151.799,1021,843.27]],["content/705",[4,0.982,6,1.684,7,2.96,14,3.564,25,0.957,33,2.7,40,6.64,44,2.64,46,5.63,62,6.165,63,2.079,65,3.107,69,2.96,72,4.513,100,3.511,107,5.129,114,5.057,152,2.865,156,5.021,181,5.563,184,4.767,186,2.802,189,4.841,192,4.838,198,3.844,201,3.662,205,3.739,220,3.352,222,3.924,234,6.657,246,4.546,272,4.042,273,3.814,315,3.088,329,4.225,362,6.411,372,6.13,382,4.875,385,3.473,392,4.41,398,3.551,414,6.799,417,7.832,421,4.91,442,6.902,443,8.297,451,5.827,452,4.385,466,4.946,476,5.76,499,4.983,501,4.875,537,3.107,541,4.623,556,3.387,569,4.652,650,5.468,674,3.473,705,8.381,886,3.387,894,3.633,1021,9.355,1189,5.897,1251,6.902,1326,8.844,1329,4.808,1579,7.665,1650,8.555,1651,8.3,1694,6.635,2021,7.946,2031,6.762,2136,6.635,2175,7.057,2194,7.665,2308,5.97,2617,7.432,2771,10.977,2781,7.057,3919,6.902,3977,8.297,3978,9.481]],["keywords/705",[]],["title/706",[2,294.246,25,53.425,33,103.882,37,134.874,65,263.302,84,428.702,100,297.505,506,435.568]],["content/706",[]],["keywords/706",[]],["title/707",[33,202.738,506,850.067]],["content/707",[4,1.602,6,1.497,7,6.36,8,10.788,12,8.444,14,5.813,22,4.058,33,1.999,51,3.7,67,6.222,69,4.827,70,3.771,122,6.787,204,7.317,246,4.885,373,5.254,385,5.664,486,9.192,504,6.856,506,8.384,544,5.769,696,9.617,716,5.583,740,7.192,920,8.188,983,9.192,985,7.192,1110,8.834,1160,7.841,1329,7.841,1646,10.292,1706,10.14,3469,13.532,3979,12.959,3980,15.463,3981,15.463,3982,15.463,3983,15.463]],["keywords/707",[]],["title/708",[33,153.915,206,423.703,240,265.779,1051,933.04]],["content/708",[4,2.032,12,6.836,33,3.06,53,6.166,176,5.327,182,2.912,240,3.259,260,7.559,289,6.789,311,6.253,329,6.504,372,9.437,373,5.056,381,4.71,387,8.501,418,11.442,424,9.437,506,12.832,524,9.572,855,8.677,886,5.214,894,7.513,983,8.677,1112,8.677,1124,9.437,1261,9.311,1403,10.41,1716,10.41,1821,13.05,1847,10.864,2033,11.801,2541,11.134,2969,13.256,3448,11.801,3593,13.05,3715,12.676,3984,14.596,3985,14.596]],["keywords/708",[]],["title/709",[23,192.952,52,221.356,75,519.427,100,297.505,179,399.314,275,267.502,506,435.568]],["content/709",[2,3.395,4,2.142,5,3.054,6,1.37,12,7.208,18,3.097,33,1.829,37,2.375,41,9.565,51,4.594,52,5.289,63,3.762,69,2.894,73,4.733,75,9.147,79,4.909,84,4.947,87,3.221,171,3.694,177,7.275,182,1.85,191,2.787,192,3.117,200,6.401,219,3.446,222,2.528,228,4.049,230,4.469,246,5.42,252,3.595,254,5.51,264,2.687,273,2.033,275,4.711,281,5.486,289,4.312,292,7.267,297,2.63,301,2.113,308,5.553,330,2.229,373,2.391,378,5.57,379,4.241,381,2.991,386,6.748,387,8.239,389,4.767,391,4.669,400,6.37,403,7.495,408,4.681,413,4.801,419,5.632,421,4.801,440,4.288,482,7.733,504,4.11,506,7.67,527,4.767,544,3.459,660,7.935,674,3.395,716,3.347,740,4.312,785,2.827,856,5.994,894,5.421,912,7.38,932,6.438,940,5.632,983,11.411,1081,5.697,1089,5.346,1112,8.409,1114,4.733,1166,6.079,1564,5.913,1631,5.247,1706,6.079,1926,6.487,1931,5.837,2429,6.611,2560,6.079,2652,8.572,3979,7.769,3986,9.27,3987,8.112]],["keywords/709",[]],["title/710",[25,123.921]],["content/710",[2,3.801,4,2.183,5,1.356,6,0.608,7,3.239,12,5.37,14,3.901,18,2.098,19,3.111,20,2.813,22,3.48,23,3.994,24,3.582,25,1.443,28,2.716,29,4.304,32,2.806,33,2.205,34,3.904,35,4.416,37,1.742,45,2.944,51,1.503,52,3.654,53,2.653,62,2.69,63,2.276,69,1.96,72,2.989,73,6.771,84,5.537,85,3.025,100,4.911,107,1.543,114,1.826,122,2.756,152,2.066,164,1.972,171,1.64,180,2.889,182,2.07,183,1.978,190,2.938,191,1.888,198,3.542,201,4.008,202,3.192,203,5.262,219,2.334,220,2.22,222,1.712,224,3.146,228,2.743,246,1.984,264,1.821,273,2.908,275,4.415,281,4.024,285,4.317,289,4.827,315,3.38,319,2.798,355,2.475,373,2.676,382,3.229,385,3.801,389,3.229,397,4.006,398,3.886,400,2.828,408,6.97,414,2.455,467,3.668,480,2.259,499,3.3,504,2.784,506,9.245,508,3.954,510,3.185,538,3.121,543,3.843,544,3.872,568,3.694,639,2.989,722,3.163,736,2.352,737,2.111,742,2.843,763,3.207,776,4.939,777,2.798,785,1.915,787,3.043,804,5.029,805,4.118,857,3.229,886,2.243,983,9.155,993,3.025,1160,3.185,1329,3.185,1613,3.492,1697,3.554,1891,4.395,1963,5.263,2106,3.622,2170,5.496,3169,4.923,3778,3.773,3781,8.459,3810,5.496,3816,5.496,3817,5.496,3818,9.081,3819,5.496,3921,4.923,3922,5.263,3988,6.28,3989,15.4,3990,4.674]],["keywords/710",[]],["title/711",[25,79.157,100,440.795,385,435.966,1051,933.04]],["content/711",[4,1.626,5,2.297,6,1.907,7,2.021,12,7.429,14,4,16,3.33,23,3.617,28,2.801,29,6.508,32,2.867,33,1.752,34,1.483,35,1.857,44,1.803,50,5.866,53,2.735,58,2.372,70,2.595,73,5.434,82,4.531,100,7.89,114,3.094,116,2.674,125,2.562,152,1.289,154,2.38,161,2.046,162,3.762,163,5.235,164,4.927,167,2.814,171,1.691,182,2.123,183,2.039,184,2.308,185,1.564,186,1.914,189,3.306,191,3.199,196,2.015,198,2.843,201,2.501,202,1.992,204,3.064,205,1.682,217,2.313,219,2.407,222,1.766,230,2.046,232,3.849,240,2.376,251,5.917,271,2.297,273,4.087,274,4.187,278,1.743,289,8.063,300,3.569,315,2.109,322,2.38,329,4.742,355,2.552,368,4.077,372,4.187,398,2.425,407,5.189,416,7.083,417,7.805,437,2.541,457,4.378,480,2.329,483,5.724,500,4.531,503,3.429,504,2.871,506,5.77,520,2.931,543,2.398,544,2.416,557,2.573,577,4.027,630,2.38,674,2.372,698,4.187,737,2.177,742,2.931,785,4.131,787,3.138,886,2.313,894,2.481,897,4.246,901,2.472,926,3.306,966,5.427,983,9.327,996,2.931,1021,3.483,1068,3.849,1170,3.306,1173,3.849,1268,3.353,1339,2.9,1554,4.531,1588,5.076,1617,3.378,1631,3.665,1650,8.053,1651,6.137,1710,4.939,3223,4.82,3633,5.666,3778,3.891,3781,4.13,3921,8.342,3923,4.82,3991,6.475,3992,10.334,3993,10.642,3994,12.528,3995,6.475,3996,6.475,3997,5.988,3998,6.475,3999,6.475,4000,6.475,4001,6.475,4002,6.475,4003,6.475,4004,6.475,4005,6.475,4006,6.475,4007,6.475,4008,6.475,4009,6.475,4010,6.475,4011,6.475,4012,6.475]],["keywords/711",[]],["title/712",[191,471.331,879,610.406]],["content/712",[4,2.392,25,1.535,33,2.985,179,9.352,188,10.554,205,4.889,206,6.697,398,7.046,506,13.538,857,9.675,883,10.201,1697,10.649,3383,17.398,3821,16.465,4013,18.815]],["keywords/712",[]],["title/713",[23,161.915,25,70.65,37,178.358,185,256.637,480,382.183]],["content/713",[]],["keywords/713",[]],["title/714",[6,131.019,273,296.762,480,486.819]],["content/714",[2,6.043,4,1.71,6,2.183,9,8.872,25,1.29,37,1.914,44,3.175,46,5.341,52,3.141,63,3.618,67,4.587,87,3.962,100,4.222,107,2.8,114,4.797,125,4.511,152,4.231,182,2.275,184,2.472,186,3.37,223,8.485,273,5.156,278,3.069,389,5.862,396,3.725,408,5.459,425,4.101,480,9.243,516,5.862,703,4.254,737,7.145,762,8.486,772,4.729,785,3.477,855,6.777,874,5.055,894,4.369,926,5.821,963,4.403,1122,9.555,1124,7.371,1191,10.525,1278,5.63,1325,7.371,1327,6.084,1558,7.007,1614,5.821,1690,13.829,1827,6.395,1961,6.777,2131,6.85,3361,10.543,4014,11.401,4015,11.401]],["keywords/714",[]],["title/715",[278,422.052,1400,879.453]],["content/715",[5,3.665,25,1.129,33,2.195,70,4.14,87,5.899,220,6.001,252,6.582,264,6.274,293,6.058,334,4.894,480,7.786,590,7.238,639,8.079,782,9.986,787,8.227,886,7.731,926,11.051,1134,9.608,1400,14.865,1749,12.948,4016,16.975,4017,16.975]],["keywords/715",[]],["title/716",[480,564.031,4018,1449.827]],["content/716",[4,2.121,5,4.42,6,1.982,25,1.036,44,4.338,45,5.808,63,3.416,73,7.955,85,7.504,264,4.516,364,12.398,480,9.496,556,7.313,674,5.706,873,9.36,886,5.565,1400,14.151,1690,14.601,2117,10.216,2861,12.212,4018,21.146,4019,15.579,4020,15.579]],["keywords/716",[]],["title/717",[4,123.338,25,79.157,45,337.67,480,428.201]],["content/717",[4,1.614,22,4.087,23,4.099,24,4.338,25,0.836,28,3.443,32,3.296,33,1.625,34,2.878,35,2.283,36,4.152,37,2.97,45,5.807,50,4.388,51,1.905,58,2.915,86,3.216,97,2.794,103,5.601,108,4.152,111,3.003,114,3.654,122,3.494,152,1.585,171,2.078,186,2.353,188,4.465,198,4.725,200,4.689,204,3.766,222,2.17,223,4.093,271,2.823,275,2.65,308,4.068,334,2.295,355,3.137,370,5.012,371,4.152,381,2.569,408,4.158,480,8.591,572,2.843,590,3.394,607,4.316,630,5.725,645,4.683,737,4.225,758,3.443,764,4.351,765,5.104,770,3.931,771,6.24,772,5.213,773,4.953,774,4.351,775,3.811,776,5.982,777,3.547,780,4.215,787,3.857,843,3.603,932,3.622,958,3.682,982,4.247,1029,5.794,1121,13.234,1224,4.636,1261,5.077,1262,10.871,1268,4.122,1276,4.215,1300,3.661,1308,4.505,1400,8.736,1628,9.162,1691,6.966,1894,9.587,1895,6.071,1897,10.161,1900,9.355,3348,7.36,3876,6.435,4021,7.96,4022,7.96,4023,7.36]],["keywords/717",[]],["title/718",[4,123.338,200,444.09,308,385.295,1121,769.603]],["content/718",[22,4.604,23,4.237,24,4.287,25,1.167,32,4.304,33,1.606,34,2.844,35,3.562,36,6.479,37,3.414,45,4.976,52,3.422,103,5.535,198,3.318,200,6.545,222,3.387,223,6.387,355,4.895,480,6.311,763,6.342,932,5.652,982,9.361,1121,11.342,1400,9.84,1628,7.307,1691,19.339,4024,10.409,4025,16.221,4026,12.421,4027,11.485,4028,10.32,4029,6.479,4030,17.542,4031,17.542,4032,10.869,4033,17.542,4034,12.421,4035,12.421,4036,12.421]],["keywords/718",[]],["title/719",[330,376.96,1400,879.453]],["content/719",[4,1.567,18,5.053,33,3.231,37,2.539,45,4.291,65,6.581,70,3.689,92,6.449,152,3.012,162,5.347,171,3.95,185,3.654,198,5.364,311,6.48,329,6.74,330,4.827,398,5.665,435,9.186,458,7.036,480,5.442,557,6.01,661,12.808,674,5.54,843,6.847,1169,6.92,1377,7.076,1400,14.7,1796,9.19,2900,13.364,3043,13.237,4037,15.126]],["keywords/719",[]],["title/720",[480,564.031,3367,755.218]],["content/720",[5,3.521,6,2.042,23,4.23,32,3.452,124,8.756,171,4.259,271,5.786,355,6.428,480,8.893,572,5.826,630,5.996,758,7.054,765,5.346,772,8.75,1400,9.149,2121,10.024,3367,11.908]],["keywords/720",[]],["title/721",[480,564.031,2253,741.882]],["content/721",[4,2.121,24,5.377,37,2.615,44,4.338,53,8.648,73,7.955,79,8.249,154,5.727,171,5.346,172,8.985,289,10.637,373,4.018,408,6.774,425,5.604,439,10.902,462,6.19,480,8.227,484,8.738,531,8.516,888,8.127,1397,12.595,1400,11.484,1827,8.738,1885,13.056,2253,11.938,2254,11.588,2281,13.627,2492,9.465]],["keywords/721",[]],["title/722",[1327,836.666,4038,1167.014]],["content/722",[]],["keywords/722",[]],["title/723",[4,110.083,185,256.637,401,475.86,1327,566.919,4038,790.76]],["content/723",[2,3.536,3,2.649,4,1.292,5,2.085,6,1.413,9,4.417,10,3.821,12,2.008,18,1.924,25,0.642,33,1.249,37,0.967,44,3.471,45,4.611,46,1.864,51,2.31,60,8.258,63,3.564,67,2.317,69,1.798,70,3.558,92,2.455,107,3.062,110,2.54,113,2.679,114,2.807,134,3.26,151,1.777,152,2.482,155,5.57,181,3.888,182,2.487,185,3.012,186,1.702,191,1.731,192,3.246,202,1.772,222,1.57,224,2.928,228,2.515,240,1.286,246,1.819,255,2.347,264,3.614,273,3.857,278,1.55,281,4.834,284,2.043,291,4.623,293,1.612,297,3.537,298,2.826,301,3.326,310,2.607,314,2.043,322,4.583,330,1.385,334,1.661,341,3.423,364,3.122,379,4.417,382,2.961,385,4.566,387,3.354,393,3.097,396,1.882,405,4.965,438,2.157,440,2.664,480,3.473,483,3.097,514,2.064,536,1.975,537,4.086,543,3.576,545,4.042,553,2.58,563,2.467,569,2.826,582,3.23,611,3.626,622,2.337,636,3.148,640,4.107,650,3.321,652,2.757,660,3.23,675,4.491,676,4.192,693,2.58,701,3.582,704,3.027,705,5.623,709,3.539,718,2.337,732,2.015,737,1.936,762,4.287,785,4.45,856,3.724,858,2.901,886,2.057,887,5.623,893,2.422,904,4.192,914,2.709,922,4.393,924,3.674,936,2.863,942,7.491,943,3.027,963,4.815,985,2.679,1023,4.287,1030,2.826,1042,3.724,1049,5.934,1155,3.894,1171,3.959,1174,3.499,1237,4.192,1268,2.983,1276,5.113,1327,12.926,1329,2.92,1378,3.582,1385,4.827,1394,4.827,1427,3.073,1437,4.656,1563,4.827,1633,3.29,1690,4.107,1931,6.08,2130,3.777,2671,8.176,2741,4.393,2797,5.325,3110,4.827,3561,4.393,3758,3.582,3906,5.325,4038,10.861,4039,8.45,4040,3.833,4041,12.467,4042,5.759,4043,5.04,4044,5.759]],["keywords/723",[]],["title/724",[4,123.338,25,79.157,1327,635.181,4038,885.975]],["content/724",[2,2.661,4,1.211,5,1.569,6,0.703,22,4.408,23,4.262,25,1.224,28,3.142,32,3.103,34,3.357,54,3.158,60,6.267,69,2.268,105,7.948,107,2.871,108,3.79,109,7.556,111,2.742,114,2.112,151,2.242,152,3.665,161,2.295,164,3.67,173,4.319,174,4.319,192,2.443,198,1.941,224,4.445,234,3.361,251,6.498,273,2.563,366,3.5,373,1.874,427,2.671,467,6.951,474,4.19,490,2.887,496,2.936,580,3.342,642,3.254,694,3.611,703,2.711,706,3.71,736,2.721,737,2.443,763,5.967,764,3.972,772,3.014,773,4.605,785,2.216,786,6.28,806,5.629,861,3.379,923,9.614,1183,6.442,1204,3.736,1219,3.5,1300,3.342,1308,4.112,1327,10.493,1354,4.414,1444,3.438,1526,3.972,1639,10.807,1891,5.084,2169,6.358,2203,7.664,2303,3.908,2676,10.227,3092,5.408,3726,4.635,4038,5.408,4039,10.227,4045,11.687,4046,11.687,4047,7.266,4048,7.266,4049,14.66,4050,7.266,4051,4.765,4052,7.266,4053,7.266,4054,10.807,4055,7.266,4056,7.266,4057,6.719,4058,7.266,4059,11.687,4060,7.266,4061,7.266,4062,7.266,4063,6.719,4064,11.687,4065,7.266]],["keywords/724",[]],["title/725",[25,104.266,29,650.349]],["content/725",[]],["keywords/725",[]],["title/726",[28,805.94]],["content/726",[25,1.616,28,8.858,29,8.495,30,11.429,122,8.989,373,5.282,1133,17.163,1177,12.586,3828,16.053]],["keywords/726",[]],["title/727",[122,688.164,477,913.126]],["content/727",[28,8.945,29,10.136,30,9.73,44,5.759,122,9.078,458,9.62,477,12.046,722,12.308]],["keywords/727",[]],["title/728",[112,1221.989]],["content/728",[4,1.882,9,8.308,19,5.443,22,5.926,25,1.208,28,7.854,29,7.532,30,8.543,44,5.056,51,4.345,112,16.117,125,8.935,297,5.151,493,11.294,4066,18.159,4067,16.792,4068,18.159,4069,16.792,4070,22.581]],["keywords/728",[]],["title/729",[112,887.426,144,831.659,1254,914.982]],["content/729",[4,1.677,8,8.57,23,3.988,25,1.396,51,3.873,92,6.9,111,6.107,114,4.705,122,7.103,144,12.899,193,6.484,250,8.636,257,7.249,280,10.323,504,7.175,569,7.942,590,6.9,598,10.943,1178,15.75,1254,10.943,1263,11.542,1377,7.57,1937,13.563,2720,10.191,2923,13.563,4071,16.184,4072,14.965,4073,14.965,4074,14.163]],["keywords/729",[]],["title/730",[190,633.003,323,745.978,1663,752.413]],["content/730",[4,1.849,19,5.35,20,7.994,65,5.85,67,7.181,89,14.067,98,7.646,114,5.188,190,8.349,250,9.524,251,9.923,271,6.331,297,5.063,300,9.839,323,9.839,642,7.994,1124,11.54,1263,12.729,1586,13.99,1938,16.504,3656,14.958,3828,13.99,3837,16.504,4075,17.848,4076,17.848]],["keywords/730",[]],["title/731",[25,79.157,29,493.733,97,417.878,1177,731.52]],["content/731",[18,6.285,23,3.518,25,1.251,44,5.239,97,6.605,111,7.1,122,8.258,196,5.856,441,14.352,571,12.338,1177,14.185,2334,14.748,2667,15.768,3828,14.748,4077,17.398,4078,17.398,4079,18.815,4080,18.815]],["keywords/731",[]],["title/732",[22,489.037]],["content/732",[7,5.927,22,6.579,23,4.082,24,6.554,25,1.667,54,8.252,98,8.133,111,7.164,580,8.734,1077,10.746,1261,12.111]],["keywords/732",[]],["title/733",[556,560.063,742,709.677]],["content/733",[]],["keywords/733",[]],["title/734",[438,506.782,556,483.395,742,612.527]],["content/734",[22,4.996,23,4.259,24,5.563,32,4.029,34,3.69,35,3.165,36,5.758,37,2.706,45,4.572,108,5.758,124,6.036,171,4.209,198,4.305,271,3.916,275,3.676,355,4.35,370,6.951,371,5.758,408,5.333,438,4.134,556,6.8,572,3.943,600,5.937,630,5.925,742,9.475,758,4.774,764,6.034,765,3.618,770,5.451,771,6.458,772,4.579,773,4.35,774,8.81,775,5.285,776,7.671,777,4.919,780,5.845,806,5.317,843,4.996,1276,5.845,1300,5.078,1308,6.248,1417,6.034,1628,6.494,1903,11.996,2121,9.905,4081,14.904,4082,10.207,4083,16.117]],["keywords/734",[]],["title/735",[3758,975.122,4040,1043.588]],["content/735",[]],["keywords/735",[]],["title/736",[4,140.222,19,405.656,67,544.489]],["content/736",[4,1.481,6,1.872,51,3.421,97,5.019,173,8.498,176,5.217,205,3.714,228,6.244,240,4.317,281,5.543,301,3.258,308,6.258,311,10.053,314,5.071,407,6.971,444,13.529,462,5.68,554,6.845,735,6.437,812,13.788,894,5.478,994,7.689,1055,9.609,1219,6.886,1268,11.345,1320,10.398,1339,8.66,1421,12.51,1526,7.815,1713,7.751,1869,10.641,2286,11.558,2552,11.558,3641,13.219,3790,10.004,3835,17.877,4084,17.877,4085,13.219,4086,14.296,4087,14.296]],["keywords/736",[]],["title/737",[437,731.343]],["content/737",[4,1.471,6,1.375,25,0.944,40,5.42,51,3.398,87,4.934,148,8.189,162,5.019,186,4.197,201,5.484,219,5.278,225,5.09,228,8.405,246,7.393,252,7.462,281,9.074,311,6.082,395,5.97,398,5.317,407,6.924,410,9.18,437,5.572,482,7.761,581,6.025,652,6.798,886,5.072,897,9.311,982,7.577,1072,9.936,1089,8.189,1421,12.425,1617,7.407,1726,10.35,1765,9.057,2089,9.311,2130,12.62,3758,15.684,4040,12.809,4088,14.198,4089,14.198]],["keywords/737",[]],["title/738",[45,337.67,111,449.151,3758,740.294,4040,792.272]],["content/738",[22,6.091,23,3.98,25,1.263,45,5.386,111,7.164,438,7.11,3726,12.111,3758,14.435,4040,16.686,4090,18.986,4091,17.557,4092,18.986]],["keywords/738",[]],["title/739",[19,469.995,125,620.401]],["content/739",[19,3.701,22,3.24,23,4.179,24,4.262,30,5.809,32,3.697,34,4.641,35,3.541,37,2.073,124,4.624,162,4.365,164,5.486,173,7.339,186,3.649,193,4.947,224,3.744,275,4.111,281,4.788,301,2.814,311,5.289,355,6.884,373,3.184,421,6.394,600,6.641,735,5.559,765,4.047,776,8.314,777,5.502,780,6.538,886,4.41,912,9.113,1024,8.218,1155,8.348,1256,6.988,1400,6.926,1511,8.988,1526,6.749,1942,9.678,2121,7.588,2535,11.417,3758,10.864,4084,16.153,4093,12.347,4094,12.347,4095,12.347,4096,12.347,4097,12.347,4098,17.469,4099,12.347,4100,12.347,4101,12.347,4102,10.348]],["keywords/739",[]],["title/740",[278,364.276,2239,985.073,3758,841.635]],["content/740",[7,4.23,12,4.725,15,7.893,22,3.557,23,3.955,32,2.868,51,3.243,67,5.453,72,6.45,79,7.176,87,4.709,88,4.647,116,5.596,164,5.854,167,5.89,171,3.539,184,2.939,220,4.79,222,3.695,246,4.281,278,3.648,281,5.255,296,10.087,298,6.65,301,3.089,345,10.337,455,8.925,499,7.122,582,7.601,745,7.408,775,6.488,1058,7.018,1109,7.018,1309,6.375,2062,9.02,2239,15.511,2281,9.02,3758,14.966,4040,12.408,4091,12.531,4103,13.552,4104,13.552,4105,13.552,4106,13.552,4107,13.552,4108,13.552,4109,11.859]],["keywords/740",[]],["title/741",[19,469.995,735,705.949]],["content/741",[19,6.524,23,3.317,2669,14.715,3758,13.535,4110,20.125]],["keywords/741",[]],["title/742",[398,587.16,1697,887.422]],["content/742",[19,6.2,234,9.567,257,9.264,279,12.295,281,8.02,373,5.334,696,12.863,2669,13.985,4110,19.126,4111,20.683]],["keywords/742",[]],["title/743",[2502,926.214]],["content/743",[7,5.432,8,9.214,12,7.666,40,6.642,50,9.592,51,4.164,65,7.206,69,6.863,81,12.41,88,8.264,184,3.773,219,8.172,281,6.747,319,7.754,373,4.487,427,6.396,2183,12.666,2638,13.273,3169,13.64,3758,13.674,4040,14.634]],["keywords/743",[]],["title/744",[25,89.993,45,383.895,4112,1094.088]],["content/744",[]],["keywords/744",[]],["title/745",[4,140.222,45,383.895,4112,1094.088]],["content/745",[22,5.004,23,4.125,24,4.835,25,1.268,32,4.035,33,2.466,34,3.207,35,4.017,36,7.307,37,4.217,52,3.86,198,5.791,224,4.247,355,5.52,370,8.82,371,7.307,408,4.635,425,5.039,454,9.057,455,6.707,490,5.566,1628,14.322,1902,8.608,4028,11.217,4029,7.307,4112,15.416,4113,16.686,4114,14.007,4115,16.686]],["keywords/745",[]],["title/746",[1902,963.564,2079,895.677]],["content/746",[4,1.773,23,4.007,32,2.538,37,2.873,45,3.402,54,8.67,124,10.104,154,4.408,171,5.209,184,2.6,273,2.63,293,3.357,301,3.9,371,6.256,373,3.093,427,4.408,468,5.486,572,4.284,716,4.329,773,4.726,785,6.083,871,9.695,955,6.916,1257,5.486,1552,8.244,1726,6.45,1814,7.551,1902,14.697,2079,6.85,2900,7.982,3601,16.718,4028,7.055,4113,14.973,4115,10.494,4116,11.992,4117,11.992,4118,11.992,4119,11.992,4120,11.992,4121,11.089,4122,11.992,4123,11.992,4124,11.992]],["keywords/746",[]],["title/747",[4,123.338,151,367.227,241,442.435,1902,731.52]],["content/747",[23,3.282,32,3.563,37,2.827,45,4.777,151,5.195,164,7.454,241,6.259,373,4.342,785,5.135,1377,7.876,1902,10.348,4028,9.906,4112,13.613,4113,14.735,4115,14.735,4125,16.838,4126,23.736,4127,23.736,4128,20.772,4129,23.736,4130,16.838,4131,16.838]],["keywords/747",[]],["title/748",[25,89.993,1377,633.003,1617,705.951]],["content/748",[]],["keywords/748",[]],["title/749",[25,89.993,1377,633.003,1617,705.951]],["content/749",[1,1.096,4,1.513,5,0.531,6,0.558,7,0.526,8,0.893,12,0.303,14,0.634,18,0.563,20,1.102,22,0.443,23,0.592,24,1.102,25,0.421,30,0.408,33,0.889,34,0.386,35,2.998,37,1.064,42,0.702,44,1.082,45,1.103,46,1.033,51,0.208,53,0.712,54,0.733,58,0.318,60,3.9,61,0.467,63,0.37,64,0.587,65,1.046,69,0.271,72,0.803,76,0.516,87,0.302,88,1.333,89,1.062,97,0.592,99,0.306,100,0.911,107,0.414,112,0.569,113,0.404,124,0.921,125,10.014,131,0.44,134,1.392,151,1.199,152,2.155,154,1.901,155,0.503,161,0.533,167,0.377,171,2.629,172,0.5,174,0.516,177,0.446,179,0.431,183,1.432,184,1.374,185,0.771,186,0.256,190,0.406,196,0.27,198,0.853,203,0.44,205,0.829,210,0.578,215,0.886,217,1.14,222,0.871,224,2.673,225,1.144,228,0.737,230,0.777,234,1.798,239,0.861,241,0.323,242,0.93,246,0.274,258,0.662,260,0.449,271,2.248,273,1.73,274,1.09,277,0.5,280,0.554,281,0.654,284,0.308,293,0.472,297,0.246,298,0.426,301,0.198,311,0.722,319,0.387,329,0.387,330,0.405,334,1.311,341,2.31,347,1.132,349,0.561,355,0.665,356,0.404,361,0.946,366,0.418,373,1.488,378,0.521,379,0.397,382,0.446,385,0.901,391,0.437,394,0.44,396,2.416,407,0.423,408,0.287,413,1.653,425,0.312,427,1.671,435,2.08,438,0.632,447,1.076,455,2.176,458,0.404,467,0.307,468,0.772,469,0.68,474,0.5,477,0.505,480,1.398,487,0.546,490,0.345,508,0.546,510,0.855,516,1.999,517,1.731,537,0.284,539,0.404,543,0.911,545,0.884,556,2.642,557,2.055,566,0.597,569,1.207,572,2.818,580,3.164,582,0.487,584,0.587,590,2.459,600,0.467,628,2.2,630,2.329,637,0.496,642,0.755,652,0.415,656,2.31,659,2.379,663,1.356,664,0.434,674,0.318,694,0.431,695,0.429,703,1.45,711,0.368,735,0.391,737,4.393,741,2.361,742,0.763,763,0.443,765,4.787,770,2.554,771,0.348,772,1.886,773,3.968,774,2.125,782,0.992,785,0.514,786,0.722,787,0.421,800,1.18,804,0.421,809,0.833,827,0.533,828,0.662,843,1.759,847,0.702,848,0.68,849,0.68,861,2.947,869,1.613,871,0.702,874,0.385,886,1.14,901,1.484,941,2.376,942,2.731,996,0.393,1021,0.467,1024,1.502,1040,2.036,1061,0.54,1089,0.5,1114,1.256,1116,0.838,1158,15.54,1160,0.44,1169,2.899,1174,0.527,1183,0.478,1204,3.537,1219,1.872,1220,0.496,1256,0.491,1276,2.058,1278,0.429,1295,1.322,1299,0.632,1300,1.469,1309,2.139,1327,13.505,1345,0.54,1354,0.527,1356,1.076,1361,0.467,1377,2.964,1400,2.18,1417,5.917,1444,0.411,1479,4.691,1536,0.607,1548,0.554,1552,1.691,1628,0.51,1648,0.607,1650,0.516,1697,0.491,1712,1.18,1726,0.467,1779,0.597,1786,0.68,1792,1.691,1827,0.487,1872,1.717,1891,0.607,1903,0.646,1961,0.516,1986,0.561,1987,1.286,2023,3.09,2062,1.638,2079,1.405,2080,0.802,2114,0.569,2131,0.521,2136,0.607,2165,0.587,2239,0.632,2252,0.527,2253,1.164,2301,0.554,2303,3.978,2308,0.546,2321,1.062,2353,0.619,2376,1.255,2396,2.062,2429,0.619,2496,1.791,2502,0.838,2508,0.702,2568,2.234,2707,0.662,2779,0.533,2781,0.646,2823,1.363,2847,0.727,2884,0.727,2913,0.646,2942,1.322,2953,2.094,3114,0.632,3170,2.435,3367,1.538,3442,0.759,3494,3.765,3586,0.5,3629,0.632,3633,1.476,3646,1.413,3715,0.561,3742,1.363,3747,1.363,3764,1.791,3823,0.68,3830,0.646,3883,0.759,3888,0.759,3977,2.794,3994,0.802,4057,2.275,4121,0.802,4132,0.868,4133,25.286,4134,25.286,4135,0.868,4136,0.868,4137,2.46,4138,0.868,4139,0.868,4140,0.868,4141,0.868,4142,0.868,4143,0.868,4144,0.868,4145,0.868,4146,0.802,4147,0.802,4148,0.868,4149,0.868,4150,0.868,4151,0.868,4152,0.868,4153,0.868,4154,0.802,4155,0.868,4156,0.868,4157,0.868,4158,0.868,4159,0.868,4160,0.868,4161,0.868,4162,1.686,4163,0.868,4164,0.868,4165,1.18,4166,0.802,4167,0.868,4168,0.868,4169,0.868,4170,0.802,4171,0.868,4172,0.868,4173,1.559,4174,0.759,4175,0.868,4176,0.727,4177,0.868,4178,1.476,4179,0.868,4180,0.868,4181,0.868,4182,0.868,4183,0.868,4184,0.868,4185,3.81,4186,0.868,4187,0.868,4188,0.868,4189,0.868,4190,0.868,4191,0.868,4192,0.868,4193,0.868,4194,0.868,4195,0.759,4196,0.868,4197,0.759,4198,4.203,4199,2.153,4200,0.868,4201,0.868,4202,0.868,4203,0.868,4204,0.868,4205,0.868,4206,0.868,4207,0.868,4208,0.868,4209,0.868,4210,1.686,4211,0.868,4212,0.759,4213,0.868,4214,0.759,4215,0.868,4216,0.868,4217,0.868,4218,0.868,4219,0.868,4220,0.868,4221,0.868,4222,4.182,4223,3.193,4224,0.868,4225,0.868,4226,0.868,4227,0.868,4228,0.868,4229,0.868,4230,0.868,4231,0.868,4232,0.868,4233,0.802,4234,0.868,4235,0.868,4236,0.868,4237,0.868,4238,0.868,4239,0.759,4240,0.868,4241,0.868,4242,0.868,4243,0.868,4244,0.868,4245,0.868,4246,0.868,4247,0.868,4248,0.868,4249,0.868,4250,0.868,4251,0.868,4252,0.759,4253,0.802,4254,0.868,4255,0.868,4256,0.868,4257,3.193,4258,1.686,4259,0.868,4260,0.868,4261,0.868,4262,0.868,4263,2.46,4264,0.868,4265,0.868,4266,0.868,4267,3.193,4268,0.868,4269,0.868,4270,0.868,4271,0.868,4272,0.868,4273,1.559,4274,0.868,4275,0.868,4276,0.868,4277,0.868,4278,0.868,4279,1.559,4280,0.868,4281,0.868,4282,0.868,4283,0.868,4284,0.868,4285,0.868,4286,0.868,4287,0.868,4288,0.868,4289,0.868,4290,0.868,4291,0.868,4292,0.868,4293,0.868,4294,0.868,4295,0.868,4296,0.868,4297,0.868,4298,0.868,4299,0.868,4300,0.868,4301,0.868,4302,0.868,4303,0.868,4304,0.802,4305,0.868,4306,0.868,4307,0.868,4308,0.868,4309,1.686,4310,0.868,4311,0.868,4312,0.868,4313,0.868,4314,0.868,4315,0.868,4316,0.868,4317,0.868,4318,0.868,4319,0.868,4320,1.559,4321,0.868,4322,0.868,4323,0.868,4324,0.868,4325,0.868,4326,1.989,4327,0.868,4328,1.686,4329,0.868,4330,0.868,4331,0.868,4332,0.802,4333,0.868,4334,0.802,4335,0.759,4336,0.868,4337,0.868,4338,0.868,4339,3.401,4340,2.46,4341,0.868,4342,0.868,4343,0.868,4344,0.868,4345,0.868,4346,0.868,4347,0.868,4348,0.868,4349,1.203,4350,0.868,4351,0.868,4352,0.868,4353,0.868,4354,0.868,4355,13.344,4356,0.868,4357,0.868,4358,0.868,4359,0.868,4360,0.868,4361,0.868,4362,0.868,4363,0.868,4364,0.868,4365,0.759,4366,0.868,4367,0.868,4368,0.868,4369,0.868,4370,0.868,4371,0.868,4372,0.868,4373,0.868,4374,0.868,4375,0.868,4376,0.868,4377,0.868,4378,0.868,4379,0.868,4380,0.868,4381,0.868,4382,0.868,4383,0.868,4384,0.868,4385,0.868,4386,0.868,4387,0.868,4388,0.868,4389,0.868,4390,0.868,4391,0.868,4392,0.868,4393,0.868,4394,0.868,4395,0.868,4396,0.868,4397,0.868,4398,0.802,4399,0.868,4400,0.868,4401,0.868,4402,0.868,4403,0.868,4404,1.686,4405,0.868,4406,0.868,4407,0.868,4408,0.868,4409,0.868,4410,0.868,4411,0.868,4412,0.868,4413,0.868,4414,0.868,4415,0.868,4416,0.868,4417,0.868,4418,0.868,4419,0.802,4420,0.868,4421,0.702,4422,0.868,4423,0.868,4424,0.868,4425,0.868,4426,2.062,4427,0.868,4428,0.759,4429,0.868,4430,0.727,4431,0.868,4432,0.727,4433,0.868,4434,0.868,4435,0.868,4436,0.759,4437,0.868,4438,0.868,4439,0.868,4440,0.868]],["keywords/749",[]],["title/750",[6,102.858,33,137.374,330,255.425,435,486.049,765,348.193]],["content/750",[]],["keywords/750",[]],["title/751",[227,806.215,293,438.887]],["content/751",[4,0.73,6,1.877,9,6.569,23,4.231,32,2.412,108,9.452,111,2.658,151,3.517,152,3.86,161,7.124,162,7.215,164,2.212,174,4.187,224,3.456,227,5.861,240,1.573,271,7.788,286,4.329,293,1.972,334,2.031,381,2.273,435,5.215,468,5.215,493,4.381,549,3.702,572,2.516,590,3.003,600,3.789,737,2.368,758,6.21,765,5.938,772,2.922,773,6.501,782,4.144,910,4.586,1074,3.851,1116,3.501,1183,9.095,1219,3.393,1300,9.776,1325,4.555,1359,5.373,1392,5.695,1406,5.522,1617,8.607,1765,4.494,2206,5.243,2495,9.041,2496,14.114,2583,5.522,2967,6.514,2984,6.165,3555,6.514,3560,5.128,4441,7.044,4442,7.37,4443,13.276,4444,15.856,4445,14.357,4446,14.357,4447,12.564,4448,15.856,4449,7.044,4450,7.044,4451,7.044,4452,7.044,4453,7.044,4454,7.044,4455,6.165,4456,7.044,4457,7.044]],["keywords/751",[]],["title/752",[4458,1561.679]],["content/752",[4,0.871,6,0.814,14,3.161,18,6.09,23,4.223,32,3.858,34,3.695,44,3.654,54,3.655,62,3.602,70,3.2,149,3.488,152,1.674,154,3.091,161,5.098,164,5.067,167,3.655,183,2.649,198,2.246,201,3.248,224,2.55,278,3.532,292,6.592,301,1.917,373,4.702,402,7.568,425,3.025,435,10.357,455,4.026,464,6.259,484,4.717,513,4.999,600,4.523,641,5.885,648,5.295,694,6.522,734,4.236,758,6.979,765,2.756,775,4.026,782,4.947,806,6.321,886,5.764,888,6.845,897,5.515,917,7.048,958,3.89,993,4.051,1108,5.686,1109,6.796,1257,6.004,1300,3.868,1377,7.548,1444,3.979,1526,4.597,1552,5.781,1617,4.387,1709,7.776,1710,6.414,1724,5.437,2098,5.295,2252,5.109,2444,5.109,2495,5.295,2496,9.552,3781,5.364,4032,7.359,4198,7.776,4443,7.776,4444,7.359,4448,7.359,4458,7.048,4459,8.409,4460,8.409,4461,8.409,4462,8.409,4463,7.359,4464,8.409,4465,8.409,4466,8.409,4467,8.409,4468,7.359,4469,8.409,4470,13.122,4471,8.409,4472,8.409]],["keywords/752",[]],["title/753",[4463,1630.706]],["content/753",[4,1.69,14,6.131,18,7.81,23,4.122,32,3.452,33,2.109,70,3.978,111,6.155,149,6.766,161,5.153,164,6.624,183,5.137,224,6.396,348,9.232,402,9.407,435,10.697,734,8.215,4473,16.311,4474,16.311,4475,16.311,4476,16.311,4477,16.311,4478,16.311,4479,16.311]],["keywords/753",[]],["title/754",[435,717.317,3367,755.218]],["content/754",[5,2.681,6,1.698,22,3.26,23,4.16,25,0.826,32,2.629,34,2.844,108,6.479,152,2.473,161,6.425,162,6.201,167,8.839,171,3.243,224,3.766,246,3.924,271,4.406,330,4.218,368,7.821,373,3.203,435,8.026,451,7.633,468,5.683,545,3.44,569,6.095,572,4.437,631,7.234,736,4.651,737,4.176,740,5.777,772,5.152,809,6.134,1169,5.683,1220,7.095,1300,5.714,1308,7.03,2496,9.041,3367,8.45,3368,15.351,3764,9.041,3963,9.474,4444,17.798,4448,17.798,4480,9.245,4481,17.542,4482,14.702,4483,12.421,4484,12.421]],["keywords/754",[]],["title/755",[51,284.834,281,461.561,379,544.573,435,544.573]],["content/755",[3,8.814,4,1.985,25,1.274,51,5.585,116,7.913,155,5.711,219,7.122,224,5.81,246,6.053,281,9.051,373,4.942,435,8.766,734,9.651,1256,10.845,2130,12.565,4463,16.768]],["keywords/755",[]],["title/756",[184,340.004,435,717.317]],["content/756",[4,1.69,18,5.448,25,1.085,37,2.738,45,4.627,88,5.593,152,3.247,166,8.843,184,5.07,205,4.238,220,5.766,240,3.642,271,5.786,373,6.03,394,8.271,435,11.713,493,10.144,1024,9.924,1444,7.718,1827,9.149,2165,11.028,2502,8.107,2720,10.271,3684,12.675,4043,14.274,4339,14.274,4485,13.187]],["keywords/756",[]],["title/757",[33,153.915,373,306.972,427,437.561,435,544.573]],["content/757",[19,5.35,33,3.153,53,9.436,69,5.571,177,9.177,184,3.87,198,4.768,227,9.177,271,6.331,373,4.603,427,9.394,435,10.22,545,4.944,765,7.322,886,6.375,2253,10.57,2492,10.843]],["keywords/757",[]],["title/758",[37,263.223,435,717.317]],["content/758",[]],["keywords/758",[]],["title/759",[581,790.783]],["content/759",[4,0.916,6,1.612,12,3.081,14,3.322,22,4.37,23,4.066,24,3.05,25,0.907,32,1.87,33,2.976,34,3.122,35,4.775,37,2.796,52,3.758,54,3.841,65,2.896,68,4.645,70,4.061,124,3.31,154,3.249,162,7.151,164,2.775,198,2.361,224,6.482,275,4.541,301,2.014,334,2.548,335,11.876,355,5.374,396,2.887,408,5.51,435,10.194,458,4.111,483,4.753,513,8.107,590,5.815,592,5.369,600,4.753,674,3.237,727,6.184,741,5.369,776,6.491,843,4,891,4.872,958,4.088,1110,5.049,1169,4.043,1256,5.002,1257,7.619,1354,5.369,1558,5.431,1765,10.622,2036,6.927,2136,6.184,2252,8.285,3114,6.433,3880,7.406,4028,8.023,4029,4.61,4430,7.406,4486,17.312,4487,8.172,4488,8.172,4489,8.838,4490,8.172,4491,8.172,4492,8.172,4493,8.172,4494,8.172,4495,8.172,4496,8.172,4497,8.838,4498,8.838]],["keywords/759",[]],["title/760",[25,70.65,271,376.852,435,486.049,2172,718.317,2779,652.904]],["content/760",[4,1.175,12,3.954,22,5.073,23,4.271,25,1.41,29,4.703,33,2.741,34,2.596,35,4.713,37,3.245,65,3.716,162,4.008,164,3.561,271,5.83,275,3.776,293,3.174,334,3.269,355,4.468,373,2.924,408,3.752,435,9.699,513,9.77,592,6.889,600,6.099,776,7.822,958,5.245,1257,5.188,1354,6.889,1765,14.355,2172,7.667,2252,6.889,2779,6.968,3828,8.888,4077,10.485,4430,9.503,4486,15.198,4487,10.485,4488,10.485,4490,10.485,4491,10.485,4492,10.485,4493,10.485,4494,10.485,4495,10.485,4499,11.339,4500,11.339,4501,11.339]],["keywords/760",[]],["title/761",[23,146.203,25,63.794,271,340.282,763,489.824,993,462.071,3375,638.508]],["content/761",[4,1.825,18,4.174,22,5.815,23,4.04,25,1.72,33,1.616,69,3.901,72,5.947,151,3.855,155,3.724,271,7.238,368,7.868,373,3.222,435,5.717,487,7.868,745,6.83,763,12.988,827,7.679,993,8.486,1077,7.072,1220,7.138,1377,5.845,1694,8.744,1796,7.591,1970,8.911,3375,8.317,3859,9.3,4502,12.495,4503,24.909,4504,12.495,4505,12.495,4506,12.495,4507,12.495,4508,12.495,4509,17.616,4510,12.495,4511,12.495]],["keywords/761",[]],["title/762",[4512,1561.679]],["content/762",[]],["keywords/762",[]],["title/763",[188,1045.231]],["content/763",[25,1.447,297,6.174,517,11.8,879,8.473,4513,21.763]],["keywords/763",[]],["title/764",[517,850.067,2023,764.557]],["content/764",[4,1.818,6,1.699,9,8.028,33,2.269,65,5.751,152,5.057,171,4.582,249,9.932,330,5.314,373,5.7,375,9.154,483,9.438,517,9.514,557,6.972,659,8.072,737,7.431,1278,8.666,2023,11.799,4514,17.547,4515,10.913]],["keywords/764",[]],["title/765",[4,162.462,67,630.847]],["content/765",[4,1.898,121,11.007,122,8.04,125,7.249,167,7.961,193,7.34,241,6.809,322,6.734,499,9.627,668,9.487,954,9.627,1127,11.535,1157,10.889,1434,13.973,1558,11.258,1986,11.844,2031,13.064,4512,15.352,4516,18.319,4517,18.319,4518,18.319,4519,18.319,4520,18.319]],["keywords/765",[]],["title/766",[581,790.783]],["content/766",[6,2.198,14,6.886,83,13.335,107,5.577,151,5.652,173,10.889,174,14.667,330,4.404,427,8.346,510,9.289,517,13.377,1114,9.354,1276,9.7,1278,9.047,2953,12.013,4521,16.939]],["keywords/766",[]],["title/767",[787,903.071]],["content/767",[6,1.104,23,4.132,30,5.364,124,6.179,152,3.285,161,5.213,162,7.513,163,13.34,164,5.181,167,7.171,171,2.977,458,5.303,483,6.132,517,6.181,572,4.073,734,5.742,775,7.9,785,3.477,787,7.996,843,5.16,975,6.132,1092,8.696,1175,7.179,1257,10.318,1276,6.037,1278,9.576,1724,10.668,1796,6.927,2023,5.56,2252,12.912,2783,6.927,3883,9.977,4521,10.543,4522,11.401,4523,18.599,4524,11.401,4525,11.401,4526,11.401,4527,11.401,4528,11.401,4529,9.977,4530,21.253,4531,11.401,4532,14.439,4533,9.977,4534,10.543,4535,19.391]],["keywords/767",[]],["title/768",[30,876.641]],["content/768",[23,4.135,30,10.024,124,6.204,152,3.298,161,5.233,162,6.876,163,13.393,164,5.202,167,7.2,458,5.332,483,6.166,517,6.215,734,5.774,775,7.932,785,3.496,843,5.189,1092,8.744,1114,5.854,1175,7.219,1257,10.34,1276,6.07,1278,11.994,1796,6.965,2252,12.945,2783,6.965,4273,10.601,4523,18.646,4529,10.032,4532,14.497,4533,10.032,4536,11.464,4537,11.464,4538,11.464,4539,11.464,4540,11.464,4541,11.464,4542,21.307,4543,11.464,4544,11.464,4545,11.464,4546,11.464,4547,19.451]],["keywords/768",[]],["title/769",[468,852.533]],["content/769",[23,4.112,124,6.408,152,3.406,161,5.405,162,7.052,163,13.833,164,5.373,167,7.436,468,9.126,483,6.45,517,6.502,734,6.04,775,8.192,785,3.657,843,5.428,1092,9.147,1175,7.551,1257,10.523,1276,6.35,1278,12.156,1796,7.285,2252,13.216,2783,7.285,3888,10.494,4523,19.036,4529,10.494,4532,14.973,4533,10.494,4548,11.992,4549,11.992,4550,11.992,4551,11.992,4552,11.992,4553,11.992,4554,21.752,4555,11.992,4556,19.948]],["keywords/769",[]],["title/770",[4239,1630.706]],["content/770",[4,1.967,23,3.82,32,2.945,34,3.186,68,7.312,76,8.271,111,8.757,152,4.301,154,5.115,164,4.369,186,4.113,198,3.717,224,5.755,241,5.172,286,8.551,373,3.588,427,5.115,458,6.472,517,12.582,561,6.546,639,6.622,717,6.662,806,6.702,894,5.332,1089,8.024,1114,7.105,1170,7.105,1204,7.155,1278,10.669,2079,7.949,2842,11.661,2927,11.952,4239,18.905,4557,13.914,4558,13.914,4559,13.914,4560,12.866,4561,12.866,4562,13.914]],["keywords/770",[]],["title/771",[33,202.738,504,695.115]],["content/771",[]],["keywords/771",[]],["title/772",[10,620.401,33,202.738]],["content/772",[1,4.601,2,2.286,4,1.368,5,2.851,6,1.486,10,2.47,14,2.347,22,5.516,23,4.04,24,6.69,25,1.348,32,3.597,33,1.984,34,3.891,35,4.4,37,3.403,40,2.383,46,3.342,53,4.362,60,2.329,62,2.674,63,1.369,65,2.046,69,1.949,70,1.522,73,3.187,84,5.51,98,4.423,100,6.781,103,2.782,111,4.983,149,2.589,154,2.295,156,3.306,162,2.207,171,3.448,179,3.103,191,3.969,193,2.501,202,1.92,203,3.165,217,2.23,222,1.702,224,1.893,228,2.726,234,2.887,240,1.394,273,2.264,293,1.747,295,6.346,301,1.423,314,3.663,334,1.8,355,2.46,364,3.384,368,3.931,373,1.61,395,2.625,408,5.077,413,3.233,414,2.44,426,3.882,440,2.887,467,2.207,496,2.522,504,2.768,510,3.165,527,3.21,534,4.452,537,2.046,543,2.312,555,3.882,556,2.23,557,2.48,577,3.882,607,3.384,673,3.256,674,2.286,689,3.412,695,3.083,765,2.046,777,4.601,780,3.306,804,3.025,805,4.094,890,4.452,1007,5.427,1193,4.761,1205,4.893,1248,9.036,1329,5.236,1613,3.471,1893,7.099,2010,5.047,2098,3.931,2112,12.709,2121,3.836,2488,4.544,2927,3.931,3563,4.291,3813,6.273,3814,4.094,3951,4.368,3992,11.704,4029,3.256,4085,5.772,4563,11.704,4564,9.036,4565,5.231,4566,5.772,4567,5.463,4568,5.463,4569,6.242,4570,6.242,4571,5.231,4572,5.463,4573,10.325,4574,5.772,4575,10.325,4576,6.242,4577,5.772,4578,6.242]],["keywords/772",[]],["title/773",[2,435.966,25,79.157,33,153.915,504,527.718]],["content/773",[2,8.563,4,2.185,5,2.422,6,1.86,7,3.502,10,4.438,11,7.356,12,5.686,14,4.217,15,6.533,20,5.024,22,4.279,23,3.677,24,5.629,25,1.278,32,2.374,34,2.568,35,4.676,37,1.883,54,4.875,81,8,94,6.976,156,5.94,186,3.315,191,3.372,230,3.543,246,3.543,271,3.979,330,2.697,355,4.42,357,8,404,8.556,405,5.768,408,3.711,425,4.035,459,8.556,467,3.965,496,4.532,504,9.351,673,8.507,674,4.108,703,7.168,777,4.998,827,6.893,894,4.298,944,9.147,958,5.188,1030,5.504,1143,7.252,1272,8.165,1466,11.87,1612,12.137,1613,6.237,1648,7.849,1765,10.402,2502,5.575,2821,10.372,2979,7.584,3990,8.349,4579,11.217,4580,11.217,4581,11.217,4582,11.217]],["keywords/773",[]],["title/774",[2,389.113,10,420.379,37,178.358,315,346.025,875,562.569]],["content/774",[2,8.822,4,1.985,6,1.854,10,8.847,11,7.316,12,3.89,14,4.194,18,3.727,19,3.344,22,5.027,23,3.897,24,5.607,25,1.08,32,2.361,33,2.72,34,2.554,35,3.199,37,3.754,63,3.562,107,2.74,149,4.628,204,5.279,219,4.147,230,6.646,321,9.982,334,3.217,355,4.397,400,5.023,408,3.691,504,4.946,555,6.939,568,6.563,577,6.939,703,4.162,732,3.903,777,4.972,782,6.563,879,4.344,958,5.161,1169,5.104,1595,6.939,1613,6.203,1614,8.294,2112,10.652,2172,7.543,4029,5.82,4564,14.214,4565,9.35,4566,10.317,4567,9.763,4568,9.763,4583,12.39,4584,11.157]],["keywords/774",[]],["title/775",[25,70.65,33,137.374,219,394.886,432,558.336,4585,858.926]],["content/775",[4,1.857,5,2.764,6,1.239,12,4.464,14,4.813,18,4.276,25,0.851,33,3.159,37,2.149,46,4.144,49,6.023,62,7.676,65,4.196,148,7.383,154,4.706,161,4.044,171,3.343,184,4.483,185,3.093,204,6.058,230,4.044,240,2.859,246,4.044,249,7.246,272,5.458,273,2.807,289,5.955,293,3.584,314,4.541,373,4.621,401,5.734,405,9.214,408,5.929,413,9.28,427,6.587,432,9.418,503,6.779,504,7.945,543,4.741,555,7.962,652,9.899,716,6.469,735,5.764,785,3.904,901,4.887,1007,6.728,1086,8.277,1317,8.959,2516,13.338,3979,10.729,4585,14.488]],["keywords/775",[]],["title/776",[191,406.809,879,526.845,2132,1251.356]],["content/776",[4,2.175,7,5.052,14,6.084,25,1.549,33,3.187,81,11.542,182,3.229,188,9.078,198,4.323,234,7.486,260,10.87,301,3.688,314,5.741,373,4.174,398,7.86,408,5.355,503,8.57,504,7.175,537,5.304,857,8.322,883,8.774,886,5.781,993,7.795,1147,8.921,1444,7.658,1571,10.943,3186,13.084,4586,16.184,4587,16.184,4588,16.184]],["keywords/776",[]],["title/777",[23,161.915,107,384.917,181,283.072,185,256.637]],["content/777",[]],["keywords/777",[]],["title/778",[62,455.105,149,440.672,385,389.113,713,686.894,2587,982.391]],["content/778",[6,1.384,9,6.54,18,4.775,30,6.725,34,3.273,37,2.4,40,5.457,70,5.342,107,3.511,149,9.087,162,5.053,181,3.809,182,2.852,185,3.453,192,4.806,200,5.334,220,6.834,223,7.351,240,4.317,264,4.144,301,3.258,330,3.437,334,4.122,387,8.326,455,6.845,496,5.777,520,6.471,544,5.334,652,6.845,675,6.649,711,6.067,713,12.5,714,9.515,716,5.161,717,9.257,785,4.36,809,7.06,1006,8.685,1204,7.351,1554,10.004,1646,9.515,1926,10.004,2356,11.558,2424,11.558,2444,8.685,3158,11.558,4589,14.296]],["keywords/778",[]],["title/779",[46,385.295,281,461.561,379,544.573,581,505.129]],["content/779",[5,3.266,6,1.944,18,7.529,25,1.006,33,1.956,52,4.168,53,6.389,69,4.722,70,3.689,88,5.186,107,4.932,181,5.35,182,3.018,192,5.085,201,5.842,215,7.95,219,5.622,228,6.606,246,6.343,278,4.072,281,9.96,287,7.518,311,6.48,330,3.637,333,13.987,379,6.92,432,7.95,444,14.05,581,6.419,586,11.259,754,11.857,1762,13.987,2130,9.919,2645,13.237,4590,15.126]],["keywords/779",[]],["title/780",[22,312.383,222,324.571,675,553.65,719,818.312]],["content/780",[6,1.263,18,4.357,61,7.015,103,5.812,107,3.204,149,5.41,171,3.406,181,3.475,182,3.622,185,3.151,191,3.921,205,3.389,220,4.611,222,5.694,228,5.696,240,4.053,254,7.753,272,5.561,273,2.86,301,2.973,373,3.364,401,5.842,421,6.755,442,9.494,465,9.708,490,5.182,512,5.339,514,4.675,579,8.433,590,5.561,673,6.804,675,10.502,703,6.773,708,8.213,709,8.016,718,5.293,719,15.522,772,5.41,786,5.587,889,8.819,944,7.316,1134,7.382,1339,8.131,1427,6.96,1444,6.171,2146,9.494,2178,9.127,2289,9.708,2431,13.847,2546,11.414,2548,12.061,3443,12.061,3785,10.931,4591,12.061,4592,13.043,4593,13.043]],["keywords/780",[]],["title/781",[180,622.502,389,695.85,607,733.699]],["content/781",[6,2.128,9,5.616,25,0.816,33,1.587,44,3.418,46,3.973,70,4.242,97,4.309,107,4.273,149,5.091,152,2.444,180,8.002,181,4.635,182,2.449,184,2.662,186,3.628,192,4.127,198,3.279,205,5.25,220,7.77,228,5.361,240,3.884,272,5.233,273,2.692,276,7.457,282,9.362,293,3.436,301,2.797,311,7.452,330,2.951,347,5.646,356,5.709,360,7.012,421,6.357,444,12.173,487,7.729,496,4.96,538,6.101,543,4.545,544,6.49,545,6.427,736,4.597,737,4.127,812,12.406,1055,8.647,1058,6.357,1111,8.438,1170,6.267,1204,6.312,1268,6.357,1765,7.83,1869,9.136,1876,11.35,2954,10.287,3947,16.086,3951,8.589]],["keywords/781",[]],["title/782",[6,92.877,70,233.946,694,476.813,717,459.299,958,443.717,1007,504.155]],["content/782",[6,1.972,69,4.827,70,5.906,107,3.798,149,6.414,181,4.12,182,4.546,191,6.124,201,5.972,205,4.018,220,7.202,222,5.555,223,7.951,240,4.549,293,4.328,314,5.485,334,4.458,381,4.99,385,5.664,490,6.144,543,5.726,579,9.998,673,8.067,694,10.126,711,6.562,716,5.583,717,10.909,994,8.317,1007,10.707,1127,9.737]],["keywords/782",[]],["title/783",[8,630.307,256,559.973,264,345.078,1134,673.714]],["content/783",[4,2.186,8,7.039,18,4.44,22,4.827,63,2.915,70,4.486,107,4.518,149,9.442,181,3.542,182,4.208,186,3.929,200,4.959,205,4.779,222,3.625,249,7.524,264,5.333,272,5.667,288,9.084,301,5.446,311,7.88,330,3.196,401,5.954,444,9.302,465,9.894,490,5.281,717,6.364,736,4.978,786,7.88,875,7.039,894,5.094,1058,9.526,1109,6.884,1127,11.583,1158,8.169,1166,8.717,1332,7.149,1427,7.093,1726,7.149,1931,8.37,2141,8.479,2489,9.676,2532,11.14,2724,9.894,3659,11.14,3661,11.14]],["keywords/783",[]],["title/784",[44,436.57,307,904.237]],["content/784",[5,2.681,6,1.969,18,5.86,33,1.606,40,7.763,46,5.678,61,6.68,65,4.071,87,4.316,103,5.535,107,3.051,125,4.915,149,5.152,180,5.714,181,3.309,182,3.5,184,4.41,186,5.185,198,3.318,200,4.634,205,5.742,206,6.244,220,4.391,222,4.783,223,6.387,240,2.773,246,3.924,249,7.03,264,5.086,273,2.724,307,7.163,322,4.566,330,2.986,357,8.858,371,6.479,373,3.203,425,4.468,440,8.114,466,6.479,490,4.935,520,5.622,534,8.858,589,15.464,590,5.296,694,6.174,711,5.271,716,4.484,717,5.947,729,10.869,894,4.76,912,6.479,1309,5.843,1339,5.563,1649,9.736,2120,11.485,3089,11.485,3919,9.041]],["keywords/784",[]],["title/785",[44,436.57,1017,1167.014]],["content/785",[4,1.343,5,2.798,6,2.18,18,6.952,33,2.337,53,5.475,70,4.408,88,6.198,99,4.566,107,3.184,110,5.718,125,5.129,144,11.108,149,5.376,176,4.73,181,3.454,182,2.586,185,3.131,186,5.343,201,5.006,220,4.582,230,5.71,240,2.894,252,7.009,254,7.705,264,5.24,281,5.026,301,2.954,322,4.765,330,3.116,371,6.762,398,4.854,413,9.361,451,7.966,455,6.206,482,9.881,520,5.867,544,7.765,717,6.206,736,4.854,889,8.764,943,6.812,1017,9.648,1065,7.625,1112,7.705,1204,6.665,1251,9.435,1628,7.625,1970,9.244,2616,11.343,3158,10.479,4594,12.962,4595,10.863]],["keywords/785",[]],["title/786",[191,471.331,879,610.406]],["content/786",[5,4.062,6,1.822,25,1.535,107,5.67,181,5.013,185,5.576,191,5.656,271,6.674,273,4.126,331,12.165,703,7.02,857,9.675,879,7.325,1761,17.398,4596,18.815,4597,18.815,4598,18.815]],["keywords/786",[]],["title/787",[6,115.243,572,425.189,1021,640.194,1614,607.783]],["content/787",[]],["keywords/787",[]],["title/788",[1040,1188.656]],["content/788",[154,7.918,224,7.587,590,9.183,1038,13.395,1040,13.739]],["keywords/788",[]],["title/789",[111,510.637,224,410.309,1040,863.219]],["content/789",[4,1.413,23,4.235,32,3.963,34,4.287,35,3.912,111,5.147,151,7.441,161,5.915,172,7.867,198,3.644,224,5.677,572,6.689,580,6.275,765,6.137,768,13.778,1040,14.68,1116,6.78,1437,11.028,1614,6.965,2121,11.508,2495,11.791,4599,11.432,4600,16.386,4601,13.641,4602,12.613,4603,11.937,4604,13.641]],["keywords/789",[]],["title/790",[427,576.359,901,598.491]],["content/790",[154,7.757,224,7.497,427,7.757,590,8.997,901,8.055,1038,13.124,1278,10.421]],["keywords/790",[]],["title/791",[111,449.151,224,360.904,427,437.561,901,454.363]],["content/791",[4,1.377,23,4.316,32,4.817,34,5.471,35,3.812,151,5.675,161,5.811,193,5.326,765,6.029,768,13.003,806,8.86,901,7.021,1437,10.747,2121,11.304,2495,11.583,4599,11.14,4600,16.097,4602,12.292,4603,11.632,4605,17.009,4606,13.292,4607,13.292,4608,18.394,4609,13.292]],["keywords/791",[]],["title/792",[901,598.491,3367,755.218]],["content/792",[6,1.444,23,4.17,32,4.735,34,5.123,151,4.6,154,5.481,161,4.71,224,6.03,590,6.357,630,5.481,765,4.887,768,11.361,771,5.974,806,7.182,901,5.691,1038,9.273,1278,7.363,2121,9.163,2495,9.389,3367,10.778,3369,13.787,3372,12.495,4480,11.098,4599,12.495,4600,17.403,4605,13.787,4610,13.048,4611,13.787,4612,14.91,4613,14.91]],["keywords/792",[]],["title/793",[25,104.266,152,312.153]],["content/793",[2,4.404,23,3.754,25,0.8,29,3.123,33,0.973,37,2.52,45,3.411,46,2.437,51,3.592,52,4.136,58,2.757,63,3.292,84,4.017,94,4.682,99,4.236,100,4.453,131,3.818,142,7.074,152,2.394,184,5.191,185,1.819,198,2.011,202,2.316,208,4.115,225,2.699,239,3.844,240,1.681,241,2.798,242,4.15,255,3.068,260,6.227,273,2.637,275,4.999,277,4.342,284,2.67,294,6.086,300,4.15,315,2.452,355,2.967,362,5.09,370,4.74,391,3.792,406,6.588,408,6.61,414,2.943,435,5.501,480,2.708,501,3.871,504,5.331,506,6.519,508,4.74,514,4.31,556,2.689,561,3.542,563,3.225,628,4.261,652,3.604,670,9.616,672,4.682,742,3.407,765,3.941,843,3.407,874,5.331,878,7.885,883,4.082,886,2.689,1007,3.956,1054,5.268,1055,3.742,1074,4.115,1077,4.261,1102,5.603,1103,5.268,1133,6.309,1276,3.986,1278,3.718,1327,4.017,1329,3.818,1360,4.682,1361,4.049,1377,3.521,1501,4.301,1598,5.48,1614,3.844,1766,5.011,1792,5.175,1814,4.74,1843,4.802,1872,4.049,1875,6.588,2018,5.901,2023,3.671,2111,5.011,2112,4.937,2253,3.562,2376,5.603,2377,5.48,2492,4.574,2900,5.011,3367,3.626,3656,6.309,3758,4.682,4038,5.603,4040,5.011,4112,6.086,4165,5.268,4279,6.961,4512,6.309,4614,6.961,4615,6.588,4616,5.48,4617,9.706,4618,5.369,4619,5.268,4620,5.742,4621,7.528,4622,7.528,4623,7.528,4624,7.528,4625,7.528,4626,7.528,4627,7.528,4628,7.528,4629,7.528,4630,7.528,4631,7.528]],["keywords/793",[]],["title/794",[25,70.65,33,137.374,63,232.977,414,415.272,1875,929.703]],["content/794",[]],["keywords/794",[]],["title/795",[4,140.222,785,412.676,792,780.453]],["content/795",[4,1.818,23,3.99,34,5.06,69,5.478,152,4.4,186,5.187,230,5.543,373,4.525,381,5.662,487,11.049,696,10.913,736,6.571,785,7.379,792,10.12,1089,10.12,2381,12.773,4632,16.226,4633,17.547,4634,17.547,4635,17.547]],["keywords/795",[]],["title/796",[60,277.201,62,318.282,273,162.935,519,399.61,569,364.591,685,540.846,785,226.576,1147,409.573,4636,650.198]],["content/796",[4,0.753,19,2.178,23,4.318,25,0.483,32,3.103,33,0.939,60,7.336,62,7.196,63,1.593,65,2.381,70,3.575,111,6.338,152,1.447,155,2.166,164,4.604,171,1.897,177,3.736,193,2.911,272,3.098,273,4.714,301,4.195,322,4.296,373,1.874,514,2.604,515,3.588,519,3.908,543,2.691,569,7.194,600,7.885,630,4.296,685,15.649,703,5.47,737,6.611,785,6.556,804,7.105,861,3.379,865,4.765,886,2.595,890,5.182,891,6.442,917,14.077,942,4.365,944,9.422,1029,5.289,1075,5.408,1152,7.779,1444,6.937,1571,4.913,2568,10.259,2720,4.575,2927,4.575,3770,8.699,3778,7.022,3951,5.084,4637,7.266,4638,13.557,4639,6.719,4640,11.687,4641,7.266,4642,7.266,4643,5.695,4644,11.687,4645,7.266,4646,6.719]],["keywords/796",[]],["title/797",[60,504.882,92,576.973,171,353.369]],["content/797",[4,1.639,14,5.945,22,4.151,23,4.179,32,3.347,33,2.045,60,9.458,63,3.468,85,7.618,273,4.534,329,7.048,364,8.575,484,8.871,804,7.665,974,10.088,1086,10.226,1571,10.693,1983,15.051,2079,11.812,2303,8.506,3097,13.84,4636,13.84,4647,15.815,4648,15.815,4649,15.815]],["keywords/797",[]],["title/798",[60,396.364,65,348.193,737,357.175,1697,601.311,2321,668.979]],["content/798",[4,1.59,6,1.773,19,3.096,20,4.626,22,4.027,23,4.008,25,0.687,32,2.185,45,2.93,60,8.769,62,4.424,63,4.016,65,3.385,70,2.519,85,4.974,88,3.541,103,4.602,114,3.002,122,4.533,134,5.845,152,2.056,164,3.243,177,5.31,186,3.052,187,6.347,196,3.214,203,5.237,224,3.131,273,4.445,373,3.958,381,3.333,398,3.867,425,3.715,426,9.544,484,8.608,512,4.227,514,5.501,537,3.385,581,4.383,642,4.626,737,6.156,800,7.227,804,5.005,975,12.986,1540,6.423,1547,6.874,1610,6.423,1641,7.517,1667,8.655,1697,5.845,1724,6.677,1981,6.874,2228,7.877,2321,9.663,2502,5.133,3174,6.983,4650,9.037,4651,21.734,4652,10.738,4653,9.55,4654,9.55,4655,9.037]],["keywords/798",[]],["title/799",[149,440.672,186,314.016,273,232.977,718,431.12,4212,929.703]],["content/799",[4,1.723,14,4.333,19,3.455,23,4.114,25,1.106,32,4.129,34,3.808,44,4.631,88,3.952,155,3.436,164,5.223,166,9.017,171,3.01,186,4.916,191,5,222,3.143,273,5.175,301,2.627,373,2.973,381,3.72,382,5.927,453,10.088,487,7.259,490,4.58,504,5.111,538,5.73,543,8.388,589,8.066,600,6.2,696,7.169,711,4.892,805,7.559,974,10.609,981,6.585,982,6.151,1155,7.794,1174,10.105,1204,5.927,1268,5.97,1332,6.2,3515,9.661,3597,14.555,3680,8.793,4212,10.088,4656,16.632,4657,11.527,4658,11.527,4659,16.632,4660,16.632,4661,11.527,4662,9.661]],["keywords/799",[]],["title/800",[5,229.359,6,102.858,152,211.512,1160,538.737,3367,511.73]],["content/800",[2,4.022,4,1.138,6,1.554,7,5.012,15,6.395,23,3.82,25,1.262,32,3.398,33,1.42,34,3.676,49,5.166,62,4.704,63,2.408,69,3.428,82,7.684,83,7.993,86,4.437,149,4.555,152,4.772,154,4.036,186,3.246,187,6.748,215,5.771,217,5.735,228,7.012,249,6.215,264,3.183,273,3.521,278,2.956,279,6.527,301,3.659,322,5.902,364,5.953,378,6.597,381,5.181,382,5.646,484,9.006,496,4.437,507,6.829,520,4.97,561,5.166,577,6.829,630,4.036,650,9.259,673,5.728,695,5.423,716,3.964,737,3.692,771,4.399,918,6.215,1030,5.388,1388,7.004,1749,8.376,1983,7.993,2049,13.5,2239,7.993,2459,8.877,2876,9.609,3367,9.142,3876,8.877,4663,8.877,4664,10.154,4665,10.98,4666,10.98,4667,13.455]],["keywords/800",[]],["title/801",[12,593.444,273,261.029,2253,563.222]],["content/801",[4,1.696,6,1.866,7,3.52,9,5.16,12,6.72,25,1.089,33,2.492,37,1.893,45,3.199,51,2.699,60,4.208,63,3.59,70,4.7,136,6.504,182,3.266,189,5.758,200,4.208,222,3.075,256,5.305,265,4.057,273,3.59,278,3.036,279,6.704,289,8.964,322,4.146,379,5.16,385,4.131,391,5.68,396,3.685,414,4.408,439,7.892,499,5.927,512,4.616,514,4.043,525,5.927,540,8.394,544,6.108,545,3.124,607,6.114,717,5.4,732,3.946,785,5.877,893,4.742,909,8.84,910,6.587,914,5.305,918,6.383,920,5.972,937,4.925,943,5.927,950,7.506,983,6.704,984,6.931,1008,10.428,1028,11.114,1049,6.931,1141,7.396,1157,6.704,1220,6.442,1315,7.101,1388,10.443,2126,7.506,2252,6.852,2253,5.336,2254,12.71,2492,6.852,3240,10.428,3719,10.428]],["keywords/801",[]],["title/802",[4,123.338,45,337.67,517,645.355,955,686.479]],["content/802",[4,1.188,6,1.11,12,5.776,25,0.762,33,2.515,45,5.518,62,4.911,63,3.633,76,6.814,103,5.108,125,4.536,136,6.611,149,4.755,151,3.537,182,2.287,189,5.854,222,4.517,241,4.261,278,3.086,279,9.847,293,3.209,301,4.433,322,4.214,391,5.774,393,6.166,395,6.965,400,5.162,414,4.481,424,7.412,481,6.319,501,5.895,515,8.181,517,10.546,537,3.757,545,3.175,551,5.217,627,8.986,673,5.98,716,7.022,718,4.652,732,4.011,785,6.498,787,5.556,809,5.661,866,6.744,899,8.345,907,7.045,910,4.613,921,5.937,936,5.698,943,6.025,947,7.881,963,6.398,984,7.045,986,7.881,993,5.522,1010,9.268,1045,8.744,1049,10.181,1066,6.117,1190,8.986,1207,6.611,1238,8.022,1384,11.389,1547,7.63,4668,11.464,4669,11.464,4670,11.464,4671,11.464]],["keywords/802",[]],["title/803",[45,444.782,198,418.827]],["content/803",[]],["keywords/803",[]],["title/804",[25,123.921]],["content/804",[25,1.635,45,6.973,124,7.823,228,9.124,557,8.3,772,8.665,826,11.516]],["keywords/804",[]],["title/805",[534,1328.96]],["content/805",[14,6.826,151,6.967,174,10.794,188,10.186,193,7.276,534,18.338,539,8.446,572,6.487,580,8.353,622,7.369,716,8.152,772,7.532,861,8.446,1074,9.926,1114,9.272,1604,11.741,1827,10.186,2356,14.681,3767,13.218]],["keywords/805",[]],["title/806",[2058,1188.656]],["content/806",[4,1.31,6,1.224,14,4.754,23,3.952,25,0.841,32,2.676,45,5.04,53,5.342,125,5.004,151,3.902,154,6.531,171,3.302,172,7.294,174,7.518,188,9.966,193,7.118,224,3.835,301,2.882,334,3.646,467,8.295,515,6.246,517,12.077,534,9.019,569,6.206,572,4.518,622,5.132,642,5.665,716,4.566,765,4.145,843,5.724,861,5.882,901,4.828,1040,8.067,1086,8.177,1108,8.551,1169,5.786,1272,9.206,1276,6.697,1747,8.551,1783,8.694,2058,14.209,2098,7.964,2121,7.772,2339,11.695,2356,10.225,2495,7.964,3767,9.206,3778,10.675,3781,8.067,4672,12.647,4673,12.647]],["keywords/806",[]],["title/807",[2376,1386.998]],["content/807",[]],["keywords/807",[]],["title/808",[765,513.868,3494,1141.31]],["content/808",[4,1.201,23,4.246,32,3.534,35,6.142,158,10.515,201,4.477,224,5.063,228,5.062,246,3.662,271,5.923,557,6.635,572,4.141,630,8.692,723,7.837,737,3.897,758,7.222,767,6.622,770,8.246,772,8.119,773,9.317,1021,6.234,1196,10.95,1278,5.724,1356,7.394,1417,6.336,1437,9.371,1479,9.367,2004,8.842,2021,9.714,2106,13.091,2512,9.714,2602,10.144,3494,15.59,4674,11.591,4675,10.144,4676,11.591,4677,11.591]],["keywords/808",[]],["title/809",[2376,1386.998]],["content/809",[]],["keywords/809",[]],["title/810",[319,698.67,901,598.491]],["content/810",[4,1.614,23,3.702,32,4.333,34,5.561,35,5.871,152,3.102,161,4.921,164,4.892,349,10.073,549,8.187,656,9.261,737,5.238,806,7.504,888,8.127,901,5.947,1116,7.743,1196,10.216,1278,7.693,2021,13.056,2376,11.596,2768,14.326,2769,11.883,2953,10.216,4442,10.073,4675,20.012,4678,18.932,4679,13.633,4680,14.406,4681,15.579,4682,14.406,4683,14.406]],["keywords/810",[]],["title/811",[319,698.67,4684,1267.615]],["content/811",[23,3.845,32,4.333,34,5.561,35,5.871,46,5.043,111,5.878,164,4.892,375,8.127,557,6.19,806,7.504,1278,7.693,1961,9.261,1986,10.073,2376,11.596,2396,13.056,2502,7.743,2768,14.326,2769,11.883,4199,13.633,4222,12.595,4675,20.012,4678,18.932,4679,13.633,4680,14.406,4682,14.406,4683,14.406,4684,12.595,4685,13.633,4686,15.579,4687,15.579]],["keywords/811",[]],["title/812",[19,405.656,1196,887.426,1986,874.956]],["content/812",[23,4.303,32,4.249,34,4.597,35,4.338,164,4.75,271,5.366,572,7.172,630,8.826,758,6.542,765,4.958,772,8.328,773,7.912,1278,7.47,2106,11.58,2495,9.525,3174,10.227,3494,11.011,4688,15.126,4689,20.078,4690,15.126,4691,15.126]],["keywords/812",[]],["title/813",[19,469.995,1479,879.453]],["content/813",[23,4.279,32,4.509,34,5.255,35,5.346,164,4.256,193,5.43,271,4.807,572,4.841,630,8.437,758,5.861,765,4.442,772,5.621,773,7.346,787,6.568,806,6.528,1356,8.645,1479,7.601,2106,12.289,2495,8.534,2602,18.647,2768,9.483,2769,10.337,3174,9.163,3494,9.865,4663,10.957,4679,11.859,4692,13.552,4693,13.552,4694,13.552,4695,13.552,4696,13.552]],["keywords/813",[]],["title/814",[4697,1723.121]],["content/814",[]],["keywords/814",[]],["title/815",[561,636.63,571,887.426,1704,852.135]],["content/815",[2,6.217,4,1.759,16,8.729,25,1.129,33,2.195,40,6.48,54,7.378,67,6.83,122,7.451,151,5.237,186,5.017,187,10.432,191,6.506,198,4.535,241,6.31,246,5.363,273,4.746,373,4.378,561,10.182,571,11.132,590,9.228,1656,11.299,1704,13.628,1783,11.67,2443,13.306,3770,12.635,3784,14.855]],["keywords/815",[]],["title/816",[54,681.416,1704,987.288]],["content/816",[4,1.639,6,1.531,54,6.873,61,11.121,122,6.942,152,3.149,191,4.754,228,6.907,273,5.703,301,3.604,360,9.035,361,11.598,385,5.793,493,9.836,538,7.861,561,7.44,580,7.275,775,7.572,886,5.649,955,9.121,965,12.859,1049,9.72,1134,8.951,1143,10.226,1259,12.786,1697,8.951,1704,9.959,4698,20.159,4699,15.815,4700,15.815,4701,15.815]],["keywords/816",[]],["title/817",[273,343.83,1196,1028.176]],["content/817",[4,1.759,7,5.299,46,5.495,70,4.14,72,8.079,88,5.82,125,6.717,198,4.535,204,8.032,246,5.363,273,4.746,329,7.564,361,9.522,375,8.855,381,5.478,382,8.729,427,6.24,452,10.011,455,8.128,543,8.015,1196,11.132,1254,11.478,1332,9.13,1552,11.67,4165,15.145,4698,18.94,4702,16.975]],["keywords/817",[]],["title/818",[4,140.222,241,503.001,1704,852.135]],["content/818",[7,4.493,23,4.011,32,3.046,34,3.296,54,6.256,107,3.536,111,5.432,151,6.782,173,8.557,174,8.557,198,3.845,223,7.402,224,4.364,241,7.22,246,4.547,272,6.137,427,5.292,561,9.138,571,9.44,630,5.292,765,4.718,1074,7.869,1192,8.953,1276,10.285,1638,11.283,1704,13.843,2106,8.302,2121,8.846,2444,8.745,2495,9.064,2886,9.896,2953,9.44,3880,12.064,4165,10.073,4697,13.311,4698,12.597,4703,14.395,4704,14.395,4705,17.961]],["keywords/818",[]],["title/819",[273,343.83,514,562.039]],["content/819",[]],["keywords/819",[]],["title/820",[581,790.783]],["content/820",[4,1.997,6,1.092,8,5.972,19,3.381,20,5.051,22,4.296,23,4.351,25,1.089,32,2.387,34,2.582,37,2.748,52,3.107,69,3.52,88,3.867,152,2.245,164,5.141,193,4.518,273,4.924,301,2.57,408,3.731,514,5.868,765,3.696,771,6.559,804,7.934,975,8.805,984,6.931,1398,7.101,1526,8.949,1614,5.758,1641,8.209,4028,9.631,4515,7.014,4706,16.37,4707,11.278,4708,10.428,4709,11.278,4710,11.278,4711,16.37,4712,11.278,4713,11.278,4714,11.278]],["keywords/820",[]],["title/821",[22,411.473,869,1028.176]],["content/821",[4,2.422,5,3.52,6,1.086,7,3.502,8,5.94,19,4.888,20,5.024,22,2.944,51,2.684,60,8.36,62,4.805,63,2.46,65,3.676,70,3.977,85,9.254,97,5.725,122,7.157,152,2.233,171,4.258,182,2.238,186,5.679,187,11.807,203,9.743,222,4.446,273,4.213,279,6.668,301,5.107,304,5.65,373,5.439,408,5.395,426,10.142,484,6.292,504,4.973,514,7.561,543,6.039,642,7.304,694,5.575,737,3.771,761,8.165,911,7.155,975,10.333,1219,5.403,1220,9.315,1395,12.137,1981,7.466,2088,8,2131,6.74,2136,7.849,2344,9.069,4715,11.217,4716,11.217]],["keywords/821",[]],["title/822",[1,331.087,23,113.237,183,234.015,241,276.168,284,263.555,381,239.762,722,374.225,826,409.573,4717,742.988]],["content/822",[]],["keywords/822",[]],["title/823",[25,104.266,883,850.067]],["content/823",[]],["keywords/823",[]],["title/824",[105,850.067,648,987.288]],["content/824",[3,6.487,4,1.461,8,7.468,19,4.227,23,2.149,25,1.274,40,5.383,45,4.001,49,9.012,58,5.165,99,4.968,113,6.559,152,3.814,188,7.91,196,4.389,203,7.151,250,7.525,251,7.841,257,6.317,297,4.001,398,5.281,407,6.877,515,6.964,523,7.585,674,7.016,706,9.781,763,7.201,853,8.056,881,10.265,883,7.646,884,8.213,885,10.265,886,5.037,888,7.357,936,7.01,993,6.793,996,6.383,1062,10.497,1081,8.667,1158,8.667,1168,9.248,1326,8.667,1598,10.265,2123,11.054,2444,8.568,3742,15.487,3823,11.054,4718,14.102,4719,14.102,4720,14.102,4721,14.102]],["keywords/824",[]],["title/825",[284,480.028,569,664.05,828,1032.224]],["content/825",[4,1.849,19,4.452,22,6.08,23,4.15,24,5.127,25,1.186,32,2.092,33,1.278,34,2.263,35,2.835,37,1.66,99,3.483,108,5.157,111,3.73,124,3.702,154,3.634,158,6.225,164,3.104,171,3.879,188,5.545,241,3.675,257,10.676,264,2.866,273,2.168,284,7.036,349,6.392,454,6.392,467,3.495,572,3.531,776,4.705,804,4.791,815,12.998,819,6.918,820,6.796,821,7.993,824,6.918,825,6.684,826,10.935,828,11.33,834,12.998,844,16.498,845,6.483,846,9.142,873,5.94,1061,11.096,1093,7.993,1300,4.548,1308,5.596,2002,5.317,2995,7.749,3323,8.285,3651,9.142,3767,7.196,3987,8.651,4722,9.886,4723,9.886,4724,14.853,4725,9.886,4726,9.886,4727,9.886,4728,9.886,4729,9.886,4730,9.886,4731,9.886,4732,9.886,4733,9.886]],["keywords/825",[]],["title/826",[87,413.633,241,442.435,284,422.228,572,425.189]],["content/826",[6,0.953,18,4.944,19,2.949,23,4.148,25,0.984,32,5.037,88,3.374,92,4.195,116,4.063,152,4.225,171,3.865,183,4.662,185,2.377,186,2.908,193,3.942,241,5.501,249,8.377,272,7.585,273,3.246,284,5.25,301,4.055,381,3.175,427,3.617,543,5.481,572,5.287,736,3.685,737,5.981,809,4.859,826,14.491,847,7.955,848,11.602,849,11.602,1276,5.21,1278,4.859,1646,15.396,2669,10.007,2927,9.32,3308,7.955,3564,7.017,4165,6.885,4734,9.839,4735,9.839,4736,9.839,4737,9.839,4738,9.098,4739,9.839,4740,9.839,4741,7.505,4742,9.839,4743,9.839]],["keywords/826",[]],["title/827",[99,656.442]],["content/827",[]],["keywords/827",[]],["title/828",[276,952.558,1631,887.422]],["content/828",[4,1.481,18,6.458,25,1.457,58,5.236,63,3.135,76,8.498,79,7.57,99,8.267,121,8.59,171,3.733,183,4.503,186,4.226,204,6.764,250,7.629,255,7.879,284,6.858,319,6.37,323,7.881,330,3.437,360,8.167,381,4.613,421,7.404,517,11.877,527,7.351,664,7.153,722,7.2,734,7.2,740,6.649,954,7.513,960,11.558,967,10.406,983,11.492,1061,12.024,1124,9.243,1161,11.206,1167,9.828,1316,13.219,1407,10.904,1636,10.004,1827,8.019,2979,9.666,3859,10.641,4744,13.219]],["keywords/828",[]],["title/829",[581,790.783]],["content/829",[4,0.994,6,0.694,18,1.36,21,2.348,22,4.373,23,4.241,24,2.473,25,1.042,28,1.761,29,3.98,32,4.135,33,2.527,34,2.197,35,2.752,37,1.203,45,1.155,50,2.244,54,1.769,58,1.491,67,2.883,87,2.49,88,1.396,99,6.883,108,2.124,113,1.894,149,6.024,151,1.256,152,1.426,158,2.563,161,5.774,164,4.561,166,5.203,167,3.114,168,8.873,171,1.063,182,2.306,184,1.554,186,1.203,191,2.154,193,1.631,198,3.087,206,1.449,210,2.71,224,4.403,240,0.909,255,1.659,264,2.077,273,4.155,275,1.356,278,1.096,280,2.597,284,1.444,293,3.687,319,1.814,323,2.244,330,2.307,334,2.066,341,4.259,355,3.781,360,2.326,361,2.283,364,3.885,368,2.563,399,2.225,425,4.157,427,2.634,468,1.862,490,2.847,496,1.645,516,2.093,517,8.497,533,2.304,538,2.023,539,3.333,543,4.877,545,2.658,557,1.618,572,1.454,582,2.283,735,3.226,747,2.903,751,2.502,757,2.632,765,2.348,768,6.602,769,2.963,776,3.41,777,1.814,778,5.333,780,2.156,782,4.215,786,3.069,804,3.472,818,5.333,819,2.849,820,2.799,825,2.753,886,1.454,894,1.56,910,2.883,912,2.124,915,5.333,983,8.633,1040,2.597,1049,4.403,1061,10.898,1114,2.079,1141,4.698,1143,2.632,1160,2.064,1170,2.079,1220,2.326,1251,2.963,1268,2.108,1300,1.873,1308,2.304,1313,2.42,1320,2.19,1444,1.926,1716,2.903,1914,2.903,1965,5.014,1991,3.191,1993,2.753,2136,2.849,2913,3.03,2950,3.563,3264,3.563,3265,6.27,3271,3.764,3304,6.005,3305,6.005,3306,3.412,3323,9.685,3525,3.764,3726,2.597,4436,6.27,4442,2.632,4512,3.412,4745,4.071,4746,4.071,4747,4.071,4748,4.071,4749,4.071,4750,4.071,4751,4.071,4752,4.071,4753,4.071,4754,4.071,4755,4.071,4756,4.071,4757,4.071,4758,7.165,4759,4.071,4760,4.071,4761,6.625,4762,4.071,4763,4.071,4764,4.071,4765,4.071]],["keywords/829",[]],["title/830",[58,495.646,99,476.718,394,686.235]],["content/830",[4,1.717,33,2.756,37,2.782,45,4.701,46,5.364,51,3.965,58,7.805,64,11.204,65,5.431,88,5.681,92,9.086,99,8.761,195,8.774,198,4.426,255,8.685,293,4.638,308,5.364,490,6.584,517,8.984,636,9.058,664,8.29,723,11.204,782,9.748,894,6.35,1058,8.581,1160,8.403,1663,9.213,4766,14.501]],["keywords/830",[]],["title/831",[826,1027.214]],["content/831",[4,1.492,25,1.292,46,4.659,65,4.718,99,7.744,114,4.185,152,2.866,179,7.155,183,4.534,186,4.255,193,5.767,222,3.925,241,5.35,250,7.681,255,7.916,265,5.178,284,8.982,297,4.084,323,10.707,329,6.414,381,4.645,395,8.167,420,8.745,515,7.109,517,7.804,551,6.55,557,5.719,563,6.166,622,7.882,722,7.25,723,9.733,732,5.036,826,10.707,861,6.695,869,9.44,954,7.565,1058,7.455,1077,8.147,1124,9.307,3041,11.638,4767,12.597]],["keywords/831",[]],["title/832",[191,471.331,879,610.406]],["content/832",[3,7.331,6,1.543,19,6.229,25,1.06,33,2.061,37,2.675,49,7.497,58,5.837,65,5.223,87,5.538,88,5.464,92,6.795,99,8.145,113,9.665,182,3.18,195,8.439,199,7.63,255,6.495,276,9.682,319,7.101,402,9.191,539,7.412,581,6.763,723,10.775,747,11.365,782,9.375,854,12.492,1058,8.253,1192,9.911,1663,8.861,1984,10.166,2356,12.884,3264,13.946,3265,13.946,4436,13.946,4761,14.736]],["keywords/832",[]],["title/833",[33,174.985,58,495.646,99,476.718]],["content/833",[]],["keywords/833",[]],["title/834",[33,153.915,58,435.966,99,419.316,437,467.161]],["content/834",[4,2.64,25,1.31,33,2.548,58,7.217,67,7.928,69,6.151,73,10.061,99,6.942,179,9.794,437,7.734,452,9.114,857,10.132,1147,10.862]],["keywords/834",[]],["title/835",[104,1259.934]],["content/835",[4,1.132,5,3.453,6,1.548,7,3.41,12,3.809,23,3.379,32,2.312,34,4.332,37,1.834,44,3.041,46,3.536,51,2.614,58,5.858,65,3.58,70,3.9,73,5.577,77,8.831,87,5.558,99,5.634,104,15.661,113,5.081,114,5.501,154,4.015,156,5.784,171,2.852,186,3.229,189,5.577,202,3.36,215,8.405,222,2.978,230,3.451,232,6.493,251,6.073,265,3.929,267,9.154,273,3.507,275,3.637,287,5.429,297,3.099,308,3.536,311,4.679,322,4.015,334,3.149,364,5.922,366,5.261,373,2.817,381,5.161,401,4.892,437,4.287,440,5.052,447,6.967,466,5.698,499,8.405,527,5.617,549,8.405,556,5.713,557,4.34,674,4.001,694,5.429,785,3.331,920,5.784,969,7.385,996,7.239,1109,5.657,1548,6.967,2094,8.13,2098,6.878,2861,8.562,2868,9.559,3773,10.1,4768,10.923,4769,10.923,4770,10.923,4771,10.923]],["keywords/835",[]],["title/836",[100,690.067]],["content/836",[4,1.758,5,1.344,6,2.033,9,2.847,12,2.17,14,3.872,16,3.2,20,2.788,22,2.703,23,2.334,28,2.692,29,4.272,32,1.317,33,1.704,37,1.729,40,2.376,44,1.733,45,1.766,46,2.015,50,3.431,53,2.629,58,7.69,63,1.365,65,2.04,69,1.943,73,3.178,82,4.355,84,3.321,87,2.163,98,2.666,99,7.132,100,8.822,107,3.237,110,5.812,113,2.895,114,4.452,125,2.463,152,1.239,176,3.759,181,1.658,182,2.055,183,3.244,184,2.234,185,1.503,190,7.164,198,2.751,202,4.053,205,1.617,220,2.2,222,2.809,241,3.828,252,3.994,264,2.986,273,3.359,274,4.024,278,1.675,284,2.208,293,1.742,301,2.347,304,3.135,310,2.817,311,4.412,314,4.674,315,3.355,319,2.773,322,3.786,330,1.496,334,4.416,355,2.453,364,3.374,372,4.024,373,1.605,375,3.247,379,4.712,381,2.008,386,4.53,387,3.625,389,3.2,393,3.347,398,3.857,400,2.802,409,3.97,416,4.142,417,5.933,435,4.712,437,5.171,479,3.739,483,5.54,484,3.491,496,4.162,515,5.087,529,5.83,533,3.523,536,2.134,537,3.376,544,5.714,545,2.853,548,3.919,563,2.666,577,3.871,613,2.192,614,2.692,634,4.439,660,3.491,693,2.788,695,3.074,698,4.024,705,3.625,716,2.247,729,5.446,737,2.092,765,2.04,785,3.141,860,3.781,879,2.423,894,2.385,905,3.7,910,2.504,943,3.271,984,3.825,989,4.439,1021,3.347,1066,3.321,1378,8.195,1631,3.523,1636,4.355,1650,3.7,1697,3.523,1874,5.032,1940,5.032,2467,5.216,2502,3.093,3223,4.632,3808,5.755,3809,5.755,4772,6.224,4773,5.755,4774,6.224,4775,6.224,4776,6.224,4777,6.224,4778,6.224]],["keywords/836",[]],["title/837",[0,1010.306]],["content/837",[0,13.708,1,10.267,4,2.006,5,3.092,7,2.192,14,2.639,15,4.089,18,2.345,19,2.105,22,5.349,23,2.509,28,3.036,29,4.715,32,2.406,33,1.852,37,1.179,45,1.992,54,3.051,58,8.602,63,1.54,72,3.342,73,3.585,75,7.35,79,3.718,99,8.117,100,7.169,104,7.686,107,1.724,114,2.041,122,3.081,127,6.492,128,6.492,131,3.56,152,3.278,158,4.421,162,2.482,182,1.401,184,3.922,191,2.111,198,1.875,202,2.16,204,5.379,205,1.824,206,2.499,215,3.69,239,9.236,240,2.538,241,2.61,243,3.23,272,4.847,273,2.493,301,2.591,308,2.273,319,3.129,329,3.129,334,2.024,355,2.767,376,6.492,386,5.111,390,5.226,395,2.952,411,6.144,414,2.744,427,2.581,448,5.676,466,5.93,467,2.482,487,4.421,499,3.69,507,4.366,520,3.178,537,2.301,542,4.478,543,2.6,557,2.79,582,3.938,620,6.492,637,4.011,645,6.688,862,4.421,879,2.733,894,2.69,944,3.938,1077,6.434,1134,3.974,1378,8.909,1548,4.478,1631,3.974,1711,4.604,1783,4.827,2172,4.747,2344,5.676,3223,5.226,3333,9.191,3563,4.827,3748,5.503,3767,5.111,3830,5.226,4779,7.021,4780,7.021,4781,11.368,4782,7.021,4783,7.021,4784,7.021,4785,7.021,4786,7.021,4787,7.021,4788,7.021]],["keywords/837",[]],["title/838",[25,123.921]],["content/838",[2,3.82,4,1.984,5,2.251,6,1.497,7,2.456,9,2.073,14,2.958,18,2.628,19,1.358,22,3.268,23,3.938,24,2.716,25,1.471,28,1.96,29,3.264,32,2.207,33,1.61,34,3.228,35,4.76,37,1.751,44,1.262,45,2.958,46,1.467,53,1.914,58,6.746,61,2.437,63,1.726,69,1.415,73,2.314,85,2.183,89,2.853,97,1.591,99,6.488,100,6.82,107,3.059,108,2.364,111,1.71,113,2.108,114,2.287,122,1.989,152,1.567,155,1.351,164,1.423,171,2.055,176,1.654,180,3.62,181,1.207,182,2.081,183,2.478,184,1.706,185,1.095,186,3.082,190,2.12,191,1.362,192,2.645,196,1.41,198,2.102,199,2.17,201,1.75,202,1.394,204,2.144,222,1.236,224,2.386,239,2.314,242,2.498,264,1.314,271,1.607,273,3.39,284,2.791,293,1.268,297,2.958,301,1.033,311,1.941,315,3.397,319,3.506,323,2.498,330,2.507,334,1.307,373,1.169,381,1.462,385,1.66,388,2.542,394,2.298,396,1.481,398,2.947,399,2.477,401,2.03,408,4.664,414,1.771,420,2.753,421,4.075,425,1.63,440,2.096,480,2.831,514,1.624,536,1.554,537,1.485,538,2.252,541,2.21,543,2.914,544,2.936,545,1.255,553,2.03,555,2.818,556,1.619,568,2.666,571,2.972,572,1.619,600,2.437,614,1.96,630,4.578,656,2.694,659,2.084,689,2.477,693,2.03,694,2.252,722,2.282,732,1.585,736,1.697,737,2.645,742,3.562,757,2.93,758,1.96,763,5.325,765,2.579,770,2.238,771,4.178,772,1.88,773,3.101,774,2.477,775,2.17,777,2.019,787,2.196,804,3.813,805,2.972,857,2.33,894,3.015,910,1.823,932,2.062,954,2.381,975,2.437,993,2.183,1015,3.456,1030,2.224,1077,2.565,1147,2.498,1160,2.298,1197,3.171,1219,2.183,1256,2.565,1257,3.6,1268,2.347,1300,2.084,1305,3.171,1308,2.565,1313,2.694,1320,2.437,1378,6.486,1566,3.965,1613,2.519,1697,2.565,1755,3.456,1811,3.299,1821,3.016,1891,3.171,1893,3.115,2098,2.853,2106,2.613,2178,3.171,3367,2.183,3563,3.115,3778,2.723,3781,6.652,3790,3.171,3810,3.965,3811,3.965,3812,3.965,3813,2.753,3814,2.972,3816,3.965,3817,3.965,3818,6.886,3819,3.965,3990,3.373,4185,3.798,4620,3.456,4789,4.531,4790,4.531,4791,4.19,4792,4.531,4793,4.531,4794,4.19]],["keywords/838",[]],["title/839",[566,1281.072]],["content/839",[4,1.432,6,1.63,14,5.195,16,7.106,33,2.177,44,3.848,49,4.229,63,1.971,70,2.192,107,2.208,114,2.613,121,5.402,134,5.088,162,3.178,181,2.395,185,2.172,190,4.205,196,2.798,199,4.304,201,3.472,202,5.811,205,2.336,207,10.414,236,6.181,237,11.038,241,3.342,255,3.664,260,10.559,272,3.833,273,1.971,287,4.469,301,2.049,308,2.91,311,3.851,315,6.641,330,2.161,331,5.813,366,4.33,407,6.738,413,4.656,421,4.656,423,5.525,433,10.059,435,4.113,437,5.423,439,6.291,440,4.158,481,4.956,485,7.047,532,5.236,541,4.384,548,5.661,563,5.92,566,15.413,572,3.211,576,7.534,577,8.594,581,3.815,633,7.268,639,4.279,642,4.027,664,4.498,668,4.656,676,6.544,693,4.027,703,3.354,732,3.145,907,5.525,914,4.229,938,10.832,996,4.069,1000,4.835,1022,7.047,1030,4.412,1065,5.289,1109,4.656,1142,6.544,1224,5.236,1305,6.291,1395,6.692,1558,5.525,1582,6.692,1610,5.591,1863,7.047,1885,7.534,1980,7.534,1988,7.268,2114,5.895,2123,7.047,2660,12.778,2778,6.412,3020,7.867,3041,7.268,4795,8.313,4796,8.99,4797,15.565,4798,8.99,4799,8.99,4800,8.99,4801,8.99,4802,8.99,4803,8.99]],["keywords/839",[]],["title/840",[23,206.245,194,788.126,208,739.744]],["content/840",[4,1.94,5,2.945,6,1.321,33,1.764,46,4.415,58,6.858,72,6.492,73,6.965,99,6.596,107,3.351,114,3.965,176,4.978,181,5.697,182,2.722,183,4.296,184,4.061,190,6.381,194,10.905,197,9.728,198,3.644,201,5.268,202,5.76,205,4.865,207,10.322,208,11.688,220,4.822,235,8.484,236,9.378,237,8.945,238,9.223,241,5.07,248,7.396,289,6.345,297,3.87,305,13.298,311,5.843,329,6.078,366,6.57,373,3.518,423,8.383,516,7.014,641,9.545,645,11.016,698,8.819,886,6.689,1134,7.721]],["keywords/840",[]],["title/841",[935,1506.563]],["content/841",[0,3.806,5,3.555,6,1.387,16,5.845,25,0.467,37,1.179,44,3.989,54,3.051,60,2.619,63,1.54,67,2.825,70,1.712,98,3.008,100,2.6,104,4.747,107,1.724,114,5.628,131,3.56,152,1.398,166,3.806,171,2.968,181,4.819,183,2.211,184,1.522,185,3.978,197,8.107,199,3.361,207,7.896,217,5.117,220,4.018,236,4.827,237,7.455,239,7.314,242,3.87,260,7.418,272,2.993,273,4.654,277,4.049,278,1.89,284,5.841,301,3.265,315,6.305,328,5.676,330,1.688,348,3.974,355,2.767,378,4.218,393,3.776,394,3.56,414,5.599,416,4.673,417,6.45,435,5.201,454,4.539,467,4.018,481,7.896,503,3.718,527,5.845,537,3.726,544,2.619,545,1.945,556,2.508,557,2.79,561,3.303,563,4.87,566,12.435,572,5.117,581,2.979,614,6.195,630,4.179,636,3.838,650,6.556,659,3.23,674,2.571,693,3.145,695,3.467,703,4.241,742,5.145,765,6.345,806,8.712,954,3.69,960,5.676,969,4.747,993,3.382,1030,5.578,1315,4.421,1329,3.56,1536,4.913,1631,3.974,1636,4.913,1705,5.676,1728,5.226,1961,4.173,2022,5.884,2073,6.492,2083,6.492,2118,4.747,2156,6.492,2625,5.355,2848,5.884,2942,5.503,3199,6.492,3442,14.409,3746,5.884,3858,5.355,3898,6.144,3997,6.492,4154,6.492,4795,6.492,4804,6.144,4805,7.021,4806,7.021,4807,5.503,4808,7.021,4809,7.021,4810,7.021,4811,7.021,4812,7.021,4813,7.021,4814,7.021,4815,7.021]],["keywords/841",[]],["title/842",[191,471.331,879,610.406]],["content/842",[4,2.243,16,8.729,19,5.089,25,1.585,33,2.799,46,5.495,58,8.727,99,8.394,179,8.437,188,9.522,205,4.411,206,6.042,398,6.357,857,11.129,883,9.203,886,6.064,894,6.505,993,8.177,1444,8.032,3186,13.724,3820,15.697,3821,14.855,4816,16.975]],["keywords/842",[]],["title/843",[184,340.004,239,800.578]],["content/843",[]],["keywords/843",[]],["title/844",[2778,1328.96]],["content/844",[5,5.011,103,8.461,152,3.78,184,4.117,205,4.933,225,8.32,271,6.735,277,10.95,278,6.248,408,6.282,786,8.133,1220,10.846,4817,18.986,4818,18.986,4819,18.986,4820,17.557]],["keywords/844",[]],["title/845",[2651,1356.449]],["content/845",[45,5.643,184,5.548,224,6.032,239,10.158,246,6.284,297,5.643,674,7.286,703,7.422,757,12.862,2252,12.086,2542,14.481,4821,19.893]],["keywords/845",[]],["title/846",[581,790.783]],["content/846",[4,1.598,5,1.693,12,2.734,18,2.619,22,2.057,23,4.325,25,0.521,32,1.659,109,5.069,111,2.958,116,3.237,124,4.651,131,3.976,151,2.419,152,3.07,154,2.882,161,2.477,164,3.9,184,4.146,185,1.894,201,3.028,224,2.377,239,9.761,241,5.732,243,5.712,246,3.923,282,5.98,293,2.195,301,2.83,305,4.876,319,3.494,330,1.885,334,2.26,347,3.606,348,4.437,373,2.022,398,2.936,451,7.632,458,5.776,467,7.189,490,3.115,520,6.98,538,3.897,598,5.301,694,3.897,711,3.327,735,5.591,886,2.8,901,4.74,1024,5.842,1109,4.06,1114,8.956,1176,4.479,1257,3.587,1339,3.512,1343,4.66,1347,4.876,1354,7.545,1401,5.591,1580,5.835,1602,4.763,1743,9.472,1747,5.301,2381,9.04,3579,11.483,3586,7.162,3756,6.338,4051,5.141,4326,14.181,4822,4.66,4823,6.57,4824,7.249,4825,7.84,4826,7.84,4827,7.84,4828,7.84,4829,7.84,4830,7.84,4831,7.84,4832,5.591]],["keywords/846",[]],["title/847",[225,562.039,278,422.052]],["content/847",[4,2.042,45,5.59,184,5.148,193,7.895,222,5.373,225,8.51,278,5.304,674,7.217,1220,11.257,1276,10.434,2131,11.839,3560,14.344,4421,15.931]],["keywords/847",[]],["title/848",[19,469.995,1536,1097.157]],["content/848",[22,2.225,23,4.236,32,3.875,44,2.361,111,7.488,131,4.299,151,5.004,154,3.117,155,2.527,161,2.678,162,2.997,164,2.662,171,2.214,184,3.517,193,5.291,198,2.265,224,4.004,239,8.282,241,7.376,272,3.615,287,4.214,301,1.932,305,5.273,330,2.038,347,6.075,373,2.186,419,5.151,451,5.21,467,6.473,481,4.673,520,10.555,530,7.84,592,5.151,711,3.598,716,3.061,726,6.171,737,2.85,772,3.517,891,4.673,901,6.192,1024,6.212,1169,3.879,1309,3.988,1343,5.04,1347,8.213,1942,6.646,2303,4.56,2912,11.388,3223,6.31,3339,13.114,3586,10.56,3823,6.646,3923,6.31,4051,8.66,4326,13.114,4822,7.85,4823,11.067,4824,7.84,4833,13.594,4834,13.205,4835,13.205,4836,8.478,4837,8.478,4838,8.478,4839,8.478,4840,8.478,4841,8.478,4842,13.205,4843,8.478]],["keywords/848",[]],["title/849",[703,695.225]],["content/849",[4,2.263,23,3.12,33,1.362,51,5.227,65,3.453,69,3.289,72,5.015,171,4.067,193,4.221,219,3.916,235,9.687,239,10.452,240,2.353,246,3.328,281,4.086,314,6.573,323,5.808,355,6.138,396,3.442,437,4.135,438,3.946,447,9.935,458,4.901,479,6.331,493,6.553,613,6.527,659,7.165,660,5.91,662,7.514,688,6.401,703,8.149,711,6.61,716,3.804,736,3.946,737,3.542,757,10.07,861,4.901,943,5.537,955,6.076,1109,5.457,1176,6.019,1298,9.358,1300,4.847,1339,4.719,1389,8.518,1438,8.518,1466,7.67,1694,7.373,1713,8.444,1844,9.22,2018,8.259,2360,8.518,2612,7.514,3629,11.337,3681,9.22,3790,7.373,4844,10.536,4845,10.536,4846,10.536,4847,10.536,4848,10.536,4849,15.575,4850,15.575,4851,10.536,4852,10.536,4853,10.536,4854,10.536,4855,18.529,4856,10.536,4857,10.536,4858,10.536]],["keywords/849",[]],["title/850",[72,746.242,134,887.422]],["content/850",[]],["keywords/850",[]],["title/851",[33,202.738,741,952.558]],["content/851",[0,8.707,23,3.98,32,3.399,33,3.178,34,3.677,35,4.605,45,4.556,198,6.199,239,11.85,240,4.663,373,4.142,425,5.777,520,7.269,587,10.244,711,6.815,741,9.757,901,6.13,2106,12.044,2197,12.588,2733,14.894,3586,9.262,4859,20.884,4860,16.059]],["keywords/851",[]],["title/852",[58,574.258,99,552.327]],["content/852",[22,5.593,23,4.013,32,3.507,58,6.069,99,5.837,144,10.183,184,3.593,224,5.024,239,8.461,251,9.213,347,7.622,520,11.645,738,13.779,901,8.135,1024,7.795,1347,10.306,3586,9.556,4051,10.866,4326,13.397,4822,9.85,4823,13.887,4861,21.311]],["keywords/852",[]],["title/853",[184,293.46,194,788.126,208,739.744]],["content/853",[]],["keywords/853",[]],["title/854",[581,790.783]],["content/854",[4,1.602,22,3.269,23,4.266,28,3.404,29,5.166,32,4.053,33,1.611,35,2.257,54,3.42,60,2.936,70,1.919,108,4.105,124,2.947,152,1.567,154,2.893,171,2.055,183,2.479,184,4.417,190,3.681,192,2.646,194,9.003,208,10.469,224,5.807,230,2.486,240,1.757,241,2.925,246,2.486,251,4.375,264,2.281,293,2.203,301,2.839,319,3.507,329,3.507,330,1.892,334,3.591,347,5.73,381,2.539,398,4.664,438,2.947,467,4.403,520,3.562,572,2.811,580,3.62,590,3.355,630,2.893,664,3.937,674,4.562,716,2.841,735,5.608,737,2.646,771,3.153,786,3.371,886,4.449,901,3.004,1024,5.86,1160,3.991,1276,4.167,1300,3.62,1308,4.454,1325,5.088,1347,4.894,1377,3.681,1438,6.362,1827,4.414,1889,4.955,2502,3.911,3756,6.362,3880,6.595,4051,5.161,4332,11.518,4349,8.883,4804,10.9,4822,7.404,4862,7.869,4863,7.869,4864,7.277,4865,16.253,4866,7.869,4867,7.277,4868,7.869,4869,7.869,4870,11.518,4871,7.869,4872,11.518,4873,7.869,4874,7.869,4875,10.9,4876,6.887,4877,7.869,4878,6.595]],["keywords/854",[]],["title/855",[278,422.052,809,774.288]],["content/855",[18,7.383,25,1.167,44,4.886,65,5.751,152,4.817,171,5.771,184,4.793,208,9.592,315,5.715,330,4.219,334,5.059,361,9.842,427,6.45,446,13.061,467,6.203,582,9.842,737,5.899,809,11.949,1345,10.913,3887,12.063,4879,13.061]],["keywords/855",[]],["title/856",[171,409.414,4880,1449.827]],["content/856",[5,4.137,6,1.855,18,6.401,25,1.552,44,5.335,52,5.28,152,3.815,184,4.155,185,5.638,202,5.894,208,12.759,364,10.389,561,9.014,1204,9.853,4880,17.718]],["keywords/856",[]],["title/857",[4,90.608,18,292.098,33,113.071,184,189.626,208,478.003,1169,400.06,1204,449.64]],["content/857",[4,2.041,22,3.858,23,3.883,25,1.31,32,3.111,33,1.901,34,3.366,53,6.209,73,7.506,152,3.922,155,4.382,164,4.616,171,3.838,182,2.933,208,10.768,230,4.644,273,3.224,315,4.788,458,6.837,516,7.558,737,6.623,740,6.837,751,9.034,807,11.884,858,7.404,1169,6.725,1204,7.558,1257,9.012,2502,7.306,3887,13.543,4864,13.593,4875,20.771,4881,14.699,4882,14.699,4883,14.699,4884,14.699]],["keywords/857",[]],["title/858",[184,340.004,1325,1013.728]],["content/858",[4,1.958,23,4.223,32,2.925,33,1.787,44,3.849,124,5.176,164,6.761,184,2.997,208,10.329,224,6.528,225,4.955,347,6.358,419,8.397,467,4.886,600,10.162,740,6.429,785,4.215,1024,6.502,1325,12.217,1356,8.817,1548,8.817,2321,8.703,2717,10.543,2741,10.543,4051,9.064,4804,12.095,4822,8.216,4865,12.781,4870,12.781,4872,12.781,4875,12.095,4885,13.822,4886,18.895,4887,13.822,4888,12.781,4889,13.822,4890,13.822]],["keywords/858",[]],["title/859",[25,89.993,184,293.46,4618,965.11]],["content/859",[]],["keywords/859",[]],["title/860",[4,140.222,25,89.993,4618,965.11]],["content/860",[6,1.365,23,1.407,25,1.372,33,1.823,37,2.367,45,2.618,69,2.881,70,3.438,82,6.458,87,3.207,97,4.95,107,4.202,114,2.683,149,3.828,151,2.847,161,2.916,176,3.368,180,4.245,181,3.757,182,1.841,184,3.057,185,3.406,186,4.167,192,3.103,202,2.839,203,4.68,204,4.367,205,5.651,206,5.019,207,5.088,220,6.048,225,5.054,226,4.712,227,4.746,240,2.061,246,2.916,252,3.579,262,4.925,264,2.676,265,3.32,278,5.156,284,3.274,285,9.693,293,2.583,301,3.899,305,5.74,308,2.987,311,3.954,314,3.274,315,3.006,330,2.219,360,5.272,366,4.445,392,4.293,401,4.134,425,3.32,428,4.964,479,5.545,536,5.866,537,5.607,545,2.556,554,4.419,565,5.224,582,5.177,613,3.251,614,3.992,626,7.04,632,5.429,637,8.054,638,5.323,639,4.393,735,4.155,739,5.967,740,4.293,862,5.812,894,3.537,914,4.342,932,6.416,971,5.486,973,4.964,989,6.582,1007,7.41,1041,7.234,1060,8.534,1116,4.587,1157,5.486,1197,6.458,1393,7.462,1567,11.052,1603,7.04,2692,6.458,3990,6.869,4618,12.201,4891,14.099]],["keywords/860",[]],["title/861",[240,302.163,1732,1184.242,4618,965.11]],["content/861",[4,1.773,6,0.612,14,2.375,18,3.484,20,2.83,23,3.104,25,1.225,29,6.412,33,1.722,35,2.991,44,3.708,45,1.792,53,2.669,58,2.314,73,3.226,87,2.196,94,3.929,98,4.468,106,7.17,108,5.44,111,3.935,124,2.366,125,2.5,136,3.644,152,4.055,155,1.883,164,3.275,171,4.809,177,3.249,181,1.683,184,2.262,185,2.519,186,1.867,189,3.226,190,4.878,191,4.647,198,4.92,205,2.71,207,7.341,224,6.176,235,8.282,238,9.004,240,2.974,243,2.906,254,3.756,271,2.241,278,1.701,334,1.822,359,11.252,373,3.434,378,3.796,396,3.407,420,3.838,427,2.323,438,2.366,446,4.703,468,2.891,497,5.529,545,1.75,552,3.32,568,3.717,580,2.906,590,4.446,652,3.025,659,2.906,674,2.314,677,4.953,737,4.477,765,3.418,809,9.622,858,3.182,886,3.725,894,2.421,971,3.756,1050,7.438,1089,3.644,1174,3.838,1264,7.762,1300,4.797,1308,5.903,1313,3.756,1320,3.398,1345,3.929,1444,2.99,1638,4.953,1823,4.953,1966,4.421,1986,6.743,2502,3.14,2669,4.272,2781,13.709,2783,6.336,2953,11.219,3455,5.842,3503,4.703,3858,7.955,3887,4.344,4074,5.529,4618,17.639,4879,7.762,4892,6.318,4893,19.034,4894,5.842,4895,6.318,4896,6.318,4897,6.318,4898,6.318,4899,5.529,4900,6.318,4901,5.529]],["keywords/861",[]],["title/862",[25,70.65,171,277.416,184,230.384,191,319.37,4618,757.671]],["content/862",[18,4.04,22,4.935,23,4.231,24,4.174,25,1.251,28,3.28,29,5.016,32,3.98,33,0.981,34,2.769,35,4.326,37,1.273,108,3.956,125,3.001,151,2.339,161,2.396,162,2.681,171,3.939,184,4.078,191,3.636,198,2.026,205,5.207,206,2.699,207,4.18,223,3.899,224,4.574,235,4.716,238,5.127,240,1.693,271,2.69,275,2.525,323,4.18,334,2.186,347,3.488,355,2.988,373,1.956,387,4.416,396,2.478,407,3.698,467,2.681,482,4.145,572,2.709,630,5.545,677,9.48,735,3.414,737,2.549,757,4.903,758,3.28,764,4.145,765,3.964,767,4.332,770,3.745,771,6.044,772,3.145,773,4.766,774,4.145,775,3.631,776,5.756,777,3.379,780,4.015,809,5.972,845,4.973,886,2.709,1024,3.567,1276,4.015,1300,3.488,1308,4.292,1313,4.508,1320,4.078,1343,4.508,1347,4.716,1354,7.348,1526,6.611,1646,5.047,2106,4.373,2121,7.432,3709,6.355,3726,4.837,4618,16.457,4822,4.508,4832,5.408,4879,5.644,4902,15.085,4903,6.355,4904,7.583,4905,7.583,4906,7.583,4907,7.583,4908,7.583,4909,7.583,4910,7.583]],["keywords/862",[]],["title/863",[45,337.67,184,258.124,703,444.09,4618,848.901]],["content/863",[4,1.208,20,5.221,25,1.115,46,3.773,51,2.789,69,3.639,70,2.843,72,5.548,88,3.997,131,5.911,152,3.909,154,6.163,184,2.528,205,3.029,224,3.534,225,4.178,230,3.682,246,3.682,278,3.138,279,9.966,288,5.756,297,3.307,319,5.194,329,5.194,347,5.362,360,6.659,373,3.006,378,7.004,381,3.761,394,5.911,396,6.415,501,5.994,556,5.989,632,6.857,674,4.269,677,9.137,711,4.947,758,5.041,785,3.555,787,5.649,792,9.669,886,4.164,1417,9.165,1466,8.485,1575,10.2,1713,6.32,2004,12.788,2057,8.013,2058,7.435,2252,7.082,2353,8.313,2354,9.769,2396,9.769,2572,13.555,2766,12.788,2953,12.876,4199,14.672,4618,15.313,4643,9.137,4911,11.656,4912,11.656,4913,11.656,4914,11.656,4915,11.656,4916,11.656,4917,9.424,4918,11.656,4919,11.656,4920,11.656]],["keywords/863",[]],["title/864",[184,340.004,1054,1097.157]],["content/864",[]],["keywords/864",[]],["title/865",[4921,1863.425]],["content/865",[4,1.773,5,3.695,6,1.657,25,1.138,35,4.908,184,3.711,217,6.114,240,3.821,243,7.873,373,4.414,394,8.679,438,6.409,695,8.452,882,10.518,886,6.114,894,6.558,1054,16.737,1262,10.518,1617,8.928,1822,12.739,3990,12.739,4563,13.055,4893,19.039,4894,15.826,4922,17.115,4923,17.115,4924,17.115,4925,17.115]],["keywords/865",[]],["title/866",[581,790.783]],["content/866",[5,2.435,19,3.381,22,4.296,23,4.125,25,0.75,28,4.878,29,6.79,30,5.305,32,2.387,35,3.234,44,3.14,45,3.199,69,3.52,108,5.883,124,4.223,152,3.259,154,4.146,162,3.987,184,5.368,224,5.843,240,2.518,251,6.27,314,4,347,5.188,356,7.614,373,2.908,716,5.91,735,5.078,771,4.518,886,6.884,901,4.305,1024,5.305,1054,16.39,1259,13.235,1276,8.669,1300,5.188,1343,6.704,1347,7.014,1354,9.946,1713,6.114,2178,7.892,2768,7.892,2927,7.101,3601,9.451,4051,7.396,4822,6.704,4926,19.272,4927,11.278,4928,14.326,4929,11.278,4930,11.278,4931,11.278]],["keywords/866",[]],["title/867",[278,422.052,809,774.288]],["content/867",[18,7.383,25,1.167,44,4.886,65,5.751,152,4.817,171,5.771,184,4.793,315,5.715,330,4.219,334,5.059,361,9.842,427,6.45,446,13.061,467,6.203,582,9.842,737,5.899,809,11.949,1054,12.279,1345,10.913,3887,12.063,4879,13.061]],["keywords/867",[]],["title/868",[25,58.151,45,248.063,184,293.328,1360,543.842,1361,470.306,1992,706.971]],["content/868",[25,1.349,45,5.753,152,4.038,162,7.169,184,5.238,193,8.126,1058,10.503,1360,12.613,1361,10.908,1388,12.936,1992,16.396]],["keywords/868",[]],["title/869",[25,49.41,45,210.774,107,182.5,181,197.97,184,161.122,260,384.788,301,169.334,315,241.997,537,243.512]],["content/869",[]],["keywords/869",[]],["title/870",[202,482.305,556,560.063]],["content/870",[25,1.454,107,4.239,166,9.356,171,4.506,184,3.742,204,8.165,219,6.414,226,8.811,235,10.732,238,11.668,260,11.326,278,4.645,297,6.204,315,5.621,319,7.69,330,4.149,425,6.208,545,4.78,894,6.613,1843,11.008,2671,11.316,4563,13.163,4932,15.957,4933,17.256,4934,17.256,4935,17.256,4936,15.101]],["keywords/870",[]],["title/871",[638,904.237,878,1028.176]],["content/871",[3,5.332,4,1.201,25,1.11,45,4.737,51,2.774,68,6.092,82,8.111,131,8.468,171,3.027,182,2.313,184,3.621,199,5.55,205,6.48,206,5.944,219,4.308,220,4.097,243,5.332,260,12.916,264,3.36,272,4.942,291,5.55,297,3.288,299,7.209,314,8.052,330,2.787,334,3.342,347,5.332,356,5.391,373,2.989,374,9.371,423,7.124,462,4.606,504,5.139,514,4.155,545,4.625,613,4.083,638,6.685,659,5.332,735,5.219,785,3.535,876,7.209,879,4.513,1055,5.761,1124,7.494,1173,6.89,1189,7.209,1663,6.445,1716,8.267,1843,7.394,1961,6.89,2692,8.111,2918,10.144,3262,10.719,3785,9.714,4563,8.842,4617,15.287,4936,10.144,4937,11.591,4938,11.591,4939,10.719]],["keywords/871",[]],["title/872",[171,250.496,191,288.379,205,249.247,260,496.808,315,312.447,4617,620.238]],["content/872",[1,1.67,2,2.44,4,1.129,7,1.17,10,1.483,18,1.252,19,1.124,22,4.417,23,4.177,24,3.759,25,1.256,28,1.621,29,4.518,30,1.764,32,3.378,33,1.935,34,3.426,35,2.578,37,1.829,44,1.855,68,1.97,87,1.303,88,1.285,105,3.611,107,0.921,108,1.956,110,1.654,111,1.415,122,1.645,124,3.366,151,1.157,152,1.326,161,1.184,162,1.325,164,3.918,171,1.739,176,1.368,183,2.098,184,3.245,185,1.609,186,1.108,190,1.753,191,1.127,198,3.691,201,1.448,203,1.901,204,1.774,205,3.242,206,2.371,207,2.066,219,1.393,223,1.928,224,6.306,234,1.734,240,4.451,243,5.01,260,10.968,271,2.363,282,5.081,314,3.188,315,2.928,334,2.592,347,3.064,355,3.542,373,2.809,381,1.21,396,1.225,407,4.383,427,1.378,438,2.494,476,2.277,482,2.049,504,1.662,511,2.673,572,2.379,574,6.159,630,5.867,735,2.999,757,2.424,758,2.881,765,2.946,770,3.289,772,2.763,773,5.897,774,3.641,775,3.189,777,2.968,780,3.527,785,1.143,809,3.289,843,3.015,845,2.458,876,2.331,886,4.457,894,1.437,1024,3.134,1084,3.28,1089,2.162,1242,2.938,1255,3.031,1300,1.724,1308,2.122,1313,2.228,1320,2.016,1333,2.79,1343,2.228,1347,4.143,1354,6.617,1377,1.753,1444,1.774,1612,4.958,1633,2.141,1724,7.042,2023,1.828,2106,7.195,2165,2.535,2502,1.863,3586,2.162,3592,2.79,3593,2.495,3726,2.391,3739,3.142,3856,3.466,4432,3.142,4515,6.774,4617,8.933,4822,3.959,4832,2.673,4893,3.28,4899,3.28,4903,7.533,4936,3.28,4939,3.466,4940,3.749,4941,3.749,4942,3.749,4943,3.749,4944,3.749,4945,6.661,4946,9.531,4947,6.159,4948,3.749,4949,3.466,4950,3.749,4951,3.749,4952,6.661,4953,3.749,4954,3.749,4955,11.579,4956,7.928,4957,8.988,4958,3.749,4959,5.582,4960,3.142,4961,6.159,4962,3.466,4963,3.142,4964,3.28,4965,2.859,4966,3.749,4967,3.749,4968,3.749,4969,3.28,4970,5.221,4971,5.582,4972,3.466,4973,6.661]],["keywords/872",[]],["title/873",[191,471.331,879,610.406]],["content/873",[19,5.59,23,2.842,25,1.527,66,13.573,144,11.459,185,4.504,260,9.657,264,5.406,308,6.036,398,6.983,428,10.029,1598,13.573,1697,10.554,2176,14.616,2588,13.573,4974,18.646,4975,18.646,4976,18.646,4977,18.646,4978,18.646]],["keywords/873",[]],["title/874",[25,63.794,131,486.458,184,208.027,205,249.247,240,214.197,241,356.567]],["content/874",[]],["keywords/874",[]],["title/875",[1663,1036.075]],["content/875",[4,1.424,6,0.508,12,1.829,14,0.745,18,1.752,22,3.056,23,4.248,25,0.593,32,4.345,33,0.256,34,3.146,40,4.445,44,1.034,45,1.054,46,0.641,49,1.748,53,0.837,63,0.434,67,0.797,68,1.952,86,1.501,88,0.679,92,0.845,97,0.695,99,0.698,106,2.554,107,0.913,108,1.033,111,2.953,114,0.576,116,5.674,122,0.869,124,1.391,131,3.969,148,1.142,151,1.146,152,3.162,154,1.366,155,0.59,161,2.472,162,4.116,164,5.816,166,2.844,167,1.615,171,1.725,177,1.019,180,0.911,183,2.811,184,3.34,186,0.585,191,1.117,193,1.488,198,0.992,204,0.937,205,3.868,206,1.322,220,1.313,222,1.013,223,1.019,224,0.601,225,3.555,230,3.133,234,0.916,240,3.829,243,4.562,260,4.622,264,1.077,265,0.713,314,2.344,315,0.645,322,0.728,330,2.146,335,1.413,347,4.105,356,4.613,360,1.132,373,1.353,380,1.442,381,1.199,382,1.019,385,0.725,390,1.474,397,1.263,398,0.742,425,0.713,427,0.728,440,0.916,452,0.916,455,0.948,460,1.511,467,0.7,474,1.142,483,1.065,496,0.8,501,1.91,504,0.878,513,1.177,516,1.019,520,2.991,557,0.787,561,1.748,568,1.165,580,1.709,589,2.6,592,1.203,616,1.386,626,2.834,630,2.877,661,1.263,689,1.083,711,1.577,716,1.894,722,2.642,734,3.942,736,0.742,737,1.249,740,0.921,741,2.257,745,2.868,757,1.281,758,2.858,764,2.031,771,5.744,773,0.781,785,1.6,880,1.511,886,2.796,894,0.759,901,1.418,906,2.014,910,0.797,919,2.6,971,1.177,993,0.954,1024,5.834,1055,0.985,1069,1.66,1074,1.083,1109,1.026,1112,2.208,1118,1.281,1125,1.386,1160,1.004,1169,0.906,1175,1.247,1176,1.132,1180,1.19,1191,2.37,1224,2.164,1227,1.299,1276,1.049,1300,2.413,1308,1.121,1309,4.198,1313,1.177,1317,3.671,1320,1.065,1332,1.065,1333,1.474,1339,1.664,1342,6.705,1343,1.177,1347,1.232,1350,1.511,1354,2.257,1359,1.511,1395,1.474,1479,3.706,1540,4.11,1614,1.011,1641,1.442,1650,3.928,1741,1.66,1811,1.442,1872,2.822,1889,1.247,1970,1.413,1993,1.339,2000,1.474,2131,1.19,2178,1.386,2303,1.998,2390,1.733,2443,1.553,2482,1.66,2502,0.985,2589,2.283,2693,8.305,2740,1.66,2751,5.18,2757,1.832,2795,3.435,2823,1.601,2886,3.607,2912,1.232,2913,1.474,2979,4.468,3167,1.511,3280,4.241,3311,1.832,3551,1.601,3564,1.413,3585,6.135,3586,2.143,3590,1.832,3592,5.825,3593,1.318,3597,4.591,3598,1.832,3599,1.832,3611,1.832,3684,6.997,3715,2.402,3771,1.832,3951,1.386,4051,1.299,4442,1.281,4447,1.733,4485,3.004,4632,1.832,4643,1.553,4667,5.538,4767,1.733,4822,4.652,4928,7.809,4946,5.782,4947,3.435,4949,1.832,4969,7.809,4979,1.981,4980,1.981,4981,1.981,4982,1.981,4983,1.981,4984,1.981,4985,1.981,4986,1.981,4987,1.981,4988,1.981,4989,3.435,4990,1.981,4991,1.981,4992,1.981,4993,1.981,4994,7.826,4995,1.981,4996,1.981,4997,1.981,4998,1.981,4999,3.715,5000,1.981,5001,1.981,5002,1.981,5003,3.715,5004,1.981,5005,1.832,5006,1.981,5007,3.715,5008,1.981,5009,1.981,5010,1.981,5011,1.981,5012,1.981,5013,3.715,5014,1.733,5015,9.068,5016,5.342,5017,3.715,5018,1.981,5019,5.246,5020,1.981,5021,4.851,5022,1.981,5023,5.246,5024,3.715,5025,1.981,5026,1.981,5027,1.981,5028,1.981,5029,1.981,5030,1.981,5031,1.981,5032,1.981,5033,1.981,5034,1.981,5035,1.981,5036,1.981,5037,1.832,5038,1.981,5039,1.981,5040,3.715,5041,1.832,5042,1.981,5043,1.981,5044,1.981,5045,1.981,5046,1.981,5047,1.981,5048,3.715,5049,3.715,5050,3.715,5051,3.715,5052,1.981,5053,1.981,5054,1.981,5055,1.981,5056,1.981,5057,3.715,5058,1.981,5059,3.715,5060,1.981,5061,1.981]],["keywords/875",[]],["title/876",[40,516.562,741,822.159,869,887.426]],["content/876",[14,5.526,25,0.978,40,5.611,106,10.105,111,5.547,116,6.07,125,5.816,131,9.989,184,3.188,205,6.43,219,5.464,240,4.398,243,10.22,271,7.881,305,13.818,330,3.534,481,8.103,512,6.017,545,5.456,734,7.404,879,5.723,894,5.633,1016,10.941,1339,6.584,1548,9.376,1633,8.397,1765,9.376,1890,11.522,2429,10.483,2912,9.142,2979,9.939,3020,17.239,3586,8.477,5016,11.884,5062,14.699,5063,14.699,5064,13.593]],["keywords/876",[]],["title/877",[25,89.993,184,293.46,240,302.163]],["content/877",[]],["keywords/877",[]],["title/878",[581,790.783]],["content/878",[22,5.05,23,4.053,25,1.28,28,6.141,32,3.005,34,3.251,45,4.028,124,5.317,154,5.219,184,4.734,224,6.619,240,5.461,243,8.852,251,7.894,271,5.036,347,6.531,663,7.827,726,10.335,735,6.393,765,4.653,886,5.072,1024,6.68,1347,8.83,2303,7.636,2912,8.83,3586,12.59,4822,8.44,4833,11.899,4971,18.295,4972,13.129,5065,13.129,5066,14.198,5067,13.129]],["keywords/878",[]],["title/879",[5068,1723.121]],["content/879",[14,5.337,23,2.933,51,3.398,65,4.653,116,7.947,154,5.219,162,5.019,164,4.459,182,4.669,183,4.472,184,3.079,191,4.268,205,6.08,240,4.297,243,8.852,271,7.743,373,4.963,375,7.407,394,7.2,435,6.496,452,6.567,545,6.046,663,10.608,734,7.151,765,7.155,1058,7.353,1134,8.036,1219,6.839,1697,8.036,1765,9.057,2062,9.451,2429,10.126,3586,8.189,3951,13.466,4109,12.425,5068,13.129,5069,14.198]],["keywords/879",[]],["title/880",[1299,1356.449]],["content/880",[6,1.592,23,3.577,164,5.162,183,5.178,205,6.098,240,3.671,545,5.873,711,8.998,726,11.967,734,8.28,879,6.4,906,8.913,1111,11.302,1134,12.001,1299,11.967,1332,8.842,1536,14.837,1993,14.336,2023,10.339,2301,10.486,2912,13.187,4833,13.777,5067,15.201,5070,16.439,5071,15.201]],["keywords/880",[]],["title/881",[5072,1723.121]],["content/881",[18,5.579,23,3.265,64,14.483,67,6.721,152,3.325,164,5.245,183,5.261,184,4.645,205,5.566,240,4.783,314,5.925,330,4.016,396,6.999,425,6.009,487,13.488,516,8.589,545,4.626,557,6.637,734,8.413,1633,9.542,2598,12.741,2783,10.148,3380,14.617,3859,12.432,5072,15.445,5073,16.703,5074,16.703]],["keywords/881",[]],["title/882",[40,516.562,241,503.001,3585,1060.767]],["content/882",[4,1.59,6,1.486,23,4.069,28,6.639,32,3.248,34,3.514,40,5.859,44,4.274,46,4.968,51,3.673,58,7.426,116,6.338,171,4.008,184,3.329,198,4.1,240,4.527,251,11.272,297,4.354,308,6.563,334,4.426,381,4.953,711,6.514,1339,9.081,1536,10.741,2049,9.924,2912,9.546,3585,18.929,4822,9.124,4971,12.864,5075,15.349]],["keywords/882",[]],["title/883",[184,340.004,242,864.293]],["content/883",[]],["keywords/883",[]],["title/884",[581,790.783]],["content/884",[4,2.122,25,1.362,46,6.629,184,5.268,186,6.053,242,11.289,458,9.526,857,10.531,1089,11.811,1321,17.163]],["keywords/884",[]],["title/885",[198,317.966,240,265.779,242,656.155,394,603.606]],["content/885",[4,1.214,6,0.512,18,3.003,19,3.513,23,4.212,25,0.352,32,3.998,35,2.578,44,2.503,86,2.138,107,1.3,116,2.185,124,3.366,152,4.18,154,1.945,161,7.408,162,1.87,164,5.636,173,3.145,184,1.147,188,6.573,190,2.475,198,1.413,205,1.375,206,1.883,225,3.222,229,5.042,230,2.84,240,1.181,242,4.955,243,2.434,246,1.671,272,2.256,273,1.16,305,3.291,341,3.145,347,2.434,356,2.461,360,6.695,451,3.252,455,2.533,513,3.145,545,1.466,592,10.225,600,6.303,630,5.691,645,3.113,703,3.354,758,3.888,771,7.569,773,6.632,809,4.439,827,5.524,891,4.955,1055,2.63,1116,4.468,1169,2.421,1257,4.112,1300,7.121,1317,3.703,1339,2.37,1345,5.59,1548,3.375,1650,3.145,2106,6.759,2131,3.179,2303,2.846,2444,3.215,2692,3.703,2693,12.003,2779,3.252,2912,7.288,3656,4.434,3684,11.35,3764,3.852,4128,4.63,4485,4.278,4515,5.59,5014,4.63,5076,5.291,5077,5.291,5078,5.291,5079,5.291,5080,11.719,5081,11.719,5082,4.893,5083,4.893,5084,7.866,5085,5.291,5086,5.291,5087,4.893,5088,5.291,5089,5.291,5090,8.312,5091,5.291,5092,8.989,5093,8.989,5094,5.291,5095,13.817,5096,5.291,5097,5.291,5098,5.291,5099,11.719,5100,11.719,5101,8.989,5102,8.989,5103,5.291,5104,5.291,5105,11.719,5106,5.291,5107,8.989,5108,5.291,5109,5.291,5110,4.893,5111,5.291,5112,8.989,5113,4.893,5114,5.291]],["keywords/885",[]],["title/886",[25,104.266,205,407.374]],["content/886",[4,1.164,6,0.562,22,0.844,23,4.296,25,0.528,32,3.456,35,2.276,44,2.21,54,1.398,65,1.054,68,3.052,87,1.118,88,1.991,107,1.95,113,2.701,116,1.328,124,2.973,131,4.93,151,0.992,152,3.095,161,4.32,164,3.529,172,1.855,174,4.719,180,2.671,184,3.541,186,0.951,191,0.967,193,1.289,198,2.12,220,3.437,222,0.877,224,2.407,229,1.804,230,1.016,237,2.109,240,2.509,242,8.57,243,5.169,246,1.016,273,3.581,278,0.866,280,2.052,293,1.625,305,2,314,1.141,329,1.433,330,1.396,347,6.29,356,3.692,360,3.317,398,1.204,425,1.157,451,1.977,458,2.701,467,4.433,543,1.191,549,1.69,557,1.278,568,1.892,572,2.836,580,1.479,581,1.365,592,4.823,600,1.73,645,1.892,652,1.54,656,1.912,694,2.886,703,5.102,711,3.369,714,2.141,726,7.077,735,1.448,736,1.204,758,1.391,765,1.054,771,5.025,775,2.78,786,1.378,806,4.683,809,5.55,876,2,886,1.149,901,1.228,910,2.336,955,1.855,975,4.269,1024,8.579,1055,4.832,1074,3.174,1089,1.855,1114,5.738,1116,1.599,1175,2.025,1192,2,1194,2.341,1254,7.598,1257,1.471,1298,1.932,1317,4.063,1320,3.123,1339,4.355,1343,1.912,1354,7.619,1511,2.341,1526,1.758,1554,2.251,1650,3.452,1663,3.229,1724,2.079,1783,2.211,1827,1.804,2000,2.394,2079,1.837,2098,2.025,2589,1.977,2693,8.944,2720,2.025,2842,2.695,2912,10.985,3114,2.341,3564,4.141,3586,8.459,3684,9.341,3709,2.695,3759,2.521,4051,5.206,4339,2.815,4442,2.079,4822,4.719,4832,2.294,4833,6.653,4879,4.322,5082,2.974,5083,2.974,5084,2.815,5090,5.37,5115,8.99,5116,5.082,5117,3.216,5118,3.216,5119,5.807,5120,13.605,5121,7.86,5122,7.938,5123,3.216,5124,3.216,5125,2.974,5126,7.938,5127,3.216,5128,2.974,5129,7.938,5130,3.216,5131,3.216,5132,5.807,5133,3.216,5134,7.938,5135,3.216,5136,3.216,5137,5.082,5138,3.216,5139,3.216,5140,3.216,5141,3.216,5142,3.216,5143,3.216,5144,3.216,5145,3.216,5146,5.807,5147,5.807,5148,3.216,5149,3.216]],["keywords/886",[]],["title/887",[280,677.68,467,375.547,737,357.175,1183,585.638,4442,686.894]],["content/887",[6,1.154,23,4.31,25,0.793,32,2.523,161,3.767,164,5.351,171,3.113,191,3.584,224,3.615,242,9.393,280,12.684,334,3.438,347,5.485,375,6.22,397,7.606,398,4.465,467,7.029,468,5.455,516,8.762,557,6.771,580,5.485,737,4.009,765,3.908,772,4.946,806,8.208,809,5.888,1024,8.016,1114,6.088,1169,7.796,1183,6.573,1783,8.197,2912,7.415,3503,12.683,3586,6.876,4051,7.819,4442,14.028,4822,7.087,5115,11.025,5120,10.434,5121,9.64,5150,10.434,5151,11.923,5152,11.923]],["keywords/887",[]],["title/888",[5153,1723.121]],["content/888",[4,1.02,12,3.431,19,4.437,22,2.582,23,4.318,25,0.984,32,3.132,35,2.822,151,3.036,152,3.94,161,7.043,167,4.276,220,3.478,224,2.983,240,2.197,242,8.159,243,8.184,249,5.569,265,3.54,287,4.891,347,4.526,356,4.577,381,3.175,458,4.577,510,4.99,580,4.526,758,4.256,806,7.129,910,5.955,1024,4.629,1114,5.024,1309,4.629,1339,4.407,1479,8.302,1560,10.175,2023,4.798,2165,6.653,2420,9.098,2693,7.017,2912,6.119,3586,5.675,3684,12.75,4051,6.452,4595,12.404,4822,5.849,5005,9.098,5016,7.955,5121,7.955,5150,8.611,5153,9.098,5154,13.686,5155,16.451,5156,17.79,5157,9.839,5158,9.839,5159,9.839]],["keywords/888",[]],["title/889",[5160,1863.425]],["content/889",[4,1.632,19,5.604,22,2.808,23,4.285,25,0.711,32,2.264,151,5.768,152,2.13,161,5.906,167,4.65,222,2.917,224,3.244,225,7.392,240,2.389,242,5.897,293,2.995,329,4.767,347,7.246,451,9.68,531,5.848,572,3.822,580,4.921,597,8.386,630,6.872,765,3.506,806,5.153,857,5.501,906,5.8,910,6.338,1024,5.033,1114,5.463,1309,5.033,1560,7.355,1631,6.055,2106,6.17,2912,6.654,3586,6.17,3742,8.65,3923,11.724,4051,7.016,4078,9.893,4822,6.359,4876,9.362,5084,9.362,5087,9.893,5121,8.65,5150,9.362,5154,9.893,5155,9.893,5161,18.695,5162,10.698,5163,10.698,5164,10.698,5165,10.698,5166,10.698,5167,10.698,5168,10.698,5169,10.698]],["keywords/889",[]],["title/890",[5170,1723.121]],["content/890",[4,1.69,6,1.086,9,5.132,19,3.362,23,3.953,25,0.746,49,5.277,54,4.875,65,3.676,68,5.895,88,5.591,92,4.782,113,7.585,116,4.632,151,5.031,154,4.123,161,3.543,171,2.929,172,9.404,174,6.668,184,3.536,191,3.372,205,2.914,220,3.965,222,3.059,224,3.401,240,3.641,242,8.989,250,5.986,262,5.986,287,8.105,319,4.998,330,2.697,371,5.851,373,2.893,398,4.201,399,6.132,432,5.895,467,3.965,496,4.532,520,7.381,538,5.575,539,5.217,598,7.584,711,4.76,726,8.165,861,5.217,901,4.282,906,6.081,993,5.403,1062,8.349,1339,5.024,1401,13.702,1704,7.063,1713,6.081,1747,7.584,1751,8,1766,12.788,2612,8,2912,6.976,3593,7.466,4051,7.356,4832,8,5071,10.372,5121,13.184,5170,10.372,5171,11.217,5172,11.217,5173,11.217,5174,10.372]],["keywords/890",[]],["title/891",[184,340.004,1055,779.313]],["content/891",[]],["keywords/891",[]],["title/892",[240,302.163,886,483.395,1055,672.63]],["content/892",[22,5.373,23,4.227,24,7.067,25,1.036,32,4.333,33,2.014,34,5.236,36,10.68,198,4.162,223,8.011,240,4.571,656,9.261,843,7.051,886,5.565,1055,10.176,1343,9.261,2783,9.465,3567,13.633,3593,10.369,5175,20.473,5176,14.406,5177,15.579,5178,15.579]],["keywords/892",[]],["title/893",[240,302.163,314,480.028,1055,672.63]],["content/893",[14,5.728,22,3.999,23,4.185,32,3.225,34,4.619,35,5.786,46,4.932,184,5.432,186,4.504,205,3.959,224,7.3,240,3.402,490,6.054,716,5.501,886,7.207,1055,7.573,1343,9.057,2131,9.155,2783,9.257,3586,8.787,4051,9.992,4822,9.057,5179,20.176,5180,15.237,5181,15.237]],["keywords/893",[]],["title/894",[241,692.634]],["content/894",[4,2.46,22,5.171,28,8.522,63,4.321,110,8.692,171,5.145,293,5.516,323,10.862,467,8.392,512,8.066,943,10.356,1575,17.244,5137,17.244]],["keywords/894",[]],["title/895",[25,49.41,45,210.774,107,182.5,181,197.97,184,161.122,301,169.334,315,241.997,362,502.363,537,243.512]],["content/895",[]],["keywords/895",[]],["title/896",[25,70.65,45,301.381,202,326.806,362,718.317,556,379.495]],["content/896",[25,1.403,51,3.903,107,4.006,176,5.952,180,7.503,184,3.537,205,4.238,207,8.991,219,6.063,220,5.766,226,8.328,235,10.144,238,11.028,240,3.642,278,4.391,315,6.871,319,7.268,334,4.703,362,15.809,496,6.591,504,7.231,545,4.518,894,6.25,1262,10.024,1651,9.407,2241,12.441,2671,10.696,4932,15.082,5182,16.311,5183,16.311,5184,16.311,5185,16.311,5186,15.082]],["keywords/896",[]],["title/897",[638,904.237,878,1028.176]],["content/897",[4,2.471,6,1.279,45,3.747,51,3.161,68,6.942,82,9.243,152,2.63,162,4.669,180,6.076,184,3.971,191,3.971,199,6.324,205,6.41,240,2.949,264,3.829,272,7.808,314,4.685,330,3.176,362,15.349,410,8.54,423,8.117,496,5.337,556,6.542,618,8.117,653,12.214,659,6.076,735,5.947,739,8.54,771,5.292,882,8.117,932,6.01,934,8.117,1024,6.214,1039,10.075,1064,9.243,1114,6.744,1124,8.54,1174,8.025,1262,8.117,1650,7.851,1704,8.317,2677,9.243,2692,9.243,2728,10.075,3684,7.936,5187,12.214,5188,13.208,5189,13.208,5190,13.208,5191,13.208,5192,11.559,5193,12.214]],["keywords/897",[]],["title/898",[23,146.203,25,63.794,171,250.496,191,288.379,315,312.447,362,648.611]],["content/898",[2,1.356,4,1.282,5,1.422,10,1.465,18,1.237,19,1.11,20,1.658,22,2.832,23,4.006,24,2.274,25,0.912,28,1.601,29,2.732,32,1.883,33,0.852,34,2.037,35,2.552,37,1.494,44,1.031,45,1.869,51,1.576,52,1.02,54,3.868,65,1.213,88,1.269,107,0.909,108,1.931,111,4.073,113,1.722,121,2.224,122,1.625,124,1.386,147,2.361,151,2.032,155,1.103,158,4.148,161,3.41,162,1.309,164,3.885,180,1.703,183,2.075,184,2.34,185,0.894,186,1.094,190,3.081,193,1.483,196,1.152,198,4.235,203,1.877,205,4.545,223,3.387,224,3.272,228,1.617,229,2.077,230,1.169,234,1.712,240,1.471,241,1.376,254,2.201,264,1.073,271,1.313,273,1.951,275,2.193,280,2.361,285,4.529,301,1.501,314,1.313,315,1.206,322,1.361,330,0.89,334,1.067,347,3.03,355,1.459,361,2.077,362,12.705,373,1.699,381,1.195,388,2.077,396,1.21,407,1.805,423,2.275,425,1.332,440,1.712,452,1.712,458,4.139,467,4.847,482,2.024,520,1.676,538,1.84,545,1.825,556,4.898,557,1.471,572,1.322,590,1.578,630,5.828,631,6.286,659,1.703,716,1.337,735,1.667,736,1.386,737,4.16,741,2.249,743,2.591,749,3.103,751,2.275,757,2.394,758,1.601,764,2.024,765,4.055,770,1.828,772,1.536,773,4.253,774,2.024,775,1.772,776,3.135,777,1.65,780,1.96,806,4.286,809,7.829,845,2.428,886,2.353,894,1.419,934,2.275,942,2.224,947,4.529,954,3.462,975,3.543,1024,5.077,1049,2.275,1064,2.591,1114,4.544,1126,2.755,1169,1.694,1219,1.783,1257,1.694,1262,4.048,1300,1.703,1308,2.095,1313,2.201,1320,1.991,1325,4.259,1326,2.275,1343,2.201,1345,5.535,1347,2.302,1354,4.002,1377,3.081,1417,5.9,1422,2.591,1588,2.902,1614,5.511,1650,7.355,1651,9.646,1724,4.259,1731,3.103,1827,2.077,1829,3.24,1831,3.103,1889,5.604,1965,2.591,1990,6.624,2071,3.423,2106,5.132,2152,2.824,2198,6.091,2321,2.331,2480,3.423,2544,3.24,2669,2.503,2676,3.24,2728,2.824,2835,3.423,2848,3.103,2921,3.423,2969,2.503,2979,2.503,2980,2.902,3186,2.993,3422,3.423,3684,2.224,3711,3.423,3887,4.529,4442,8.865,4515,4.097,4744,3.423,4832,2.64,4879,2.755,4901,3.24,4903,3.103,4955,7.458,4956,4.795,5120,3.24,5186,6.091,5187,3.423,5192,3.24,5193,3.423,5194,3.702,5195,3.702,5196,3.702,5197,3.702,5198,3.702,5199,6.587,5200,3.702,5201,3.702,5202,3.423,5203,3.702,5204,8.899,5205,3.702,5206,3.702,5207,3.702,5208,3.702,5209,3.702,5210,3.702,5211,3.702,5212,3.702,5213,3.702,5214,6.587,5215,3.702,5216,3.702,5217,8.899,5218,3.702,5219,8.899,5220,6.587,5221,3.702,5222,3.702,5223,3.702,5224,3.702,5225,3.702,5226,3.702,5227,3.702,5228,3.423,5229,3.702]],["keywords/898",[]],["title/899",[191,471.331,879,610.406]],["content/899",[23,3.955,107,3.855,184,3.404,185,3.792,225,5.627,227,8.071,276,9.536,308,5.081,324,13.736,362,10.613,517,8.51,561,7.384,659,9.464,857,8.071,884,9.141,907,9.646,932,7.143,996,7.105,1077,8.884,1092,11.973,1158,9.646,1196,10.293,1326,9.646,1598,11.426,1650,9.33,1792,10.791,1803,11.683,2176,12.304,2588,11.426,5192,13.736,5230,15.696,5231,15.696,5232,15.696,5233,15.696,5234,15.696,5235,15.696]],["keywords/899",[]],["title/900",[6,66.906,7,215.722,25,45.956,51,165.365,176,252.189,184,149.858,219,256.862,315,225.08,1360,429.789,1361,371.675]],["content/900",[]],["keywords/900",[]],["title/901",[1361,1002.228]],["content/901",[4,1.264,6,1.677,46,3.95,51,2.92,58,4.469,86,4.931,109,7.89,200,4.553,205,3.17,210,8.122,219,4.536,240,3.868,264,3.538,265,4.39,299,7.589,301,2.781,311,5.227,314,7.144,438,4.57,466,6.366,473,9.083,477,13.485,478,7.589,480,4.39,496,4.931,536,4.184,537,3.999,562,7.037,582,6.845,621,8.702,660,6.845,663,9.55,674,4.469,675,5.676,701,7.589,717,5.842,718,4.952,786,5.227,878,8.002,932,5.553,996,5.523,1032,8.389,1054,8.539,1055,8.611,1087,10.678,1119,7.037,1207,7.037,1297,13.618,1361,11.792,1590,9.308,1593,10.678,1823,9.565,1961,10.298,1967,9.565,2118,8.25,2123,9.565,2182,10.678,2444,7.413,3546,12.894,3623,9.308,3624,11.284,5236,12.202,5237,12.202]],["keywords/901",[]],["title/902",[86,324.619,205,208.735,240,179.382,315,261.663,401,359.844,638,463.325,1360,499.645,1361,432.085]],["content/902",[4,1.156,5,2.409,6,2.037,30,5.249,67,4.489,88,3.825,107,2.74,121,6.703,151,3.442,162,3.944,176,4.071,184,2.419,185,3.924,205,2.899,235,6.939,240,4.992,246,3.525,264,3.234,285,7.67,291,5.342,301,2.543,310,5.05,314,5.762,315,3.634,334,3.217,385,4.086,392,5.189,393,6.001,410,7.213,413,5.778,452,5.161,477,6.498,478,11.912,496,4.508,500,7.807,512,4.567,532,6.498,533,6.315,564,5.161,656,6.632,673,5.82,675,5.189,718,6.591,719,11.167,785,3.402,826,6.15,914,5.249,921,5.778,956,7.025,1011,7.543,1012,7.67,1022,8.745,1102,8.304,1103,7.807,1207,9.368,1219,5.374,1227,7.316,1303,9.763,1326,6.857,1360,6.939,1455,10.317,1685,9.763,1719,8.745,1848,8.745,2057,7.67,2143,10.317,2639,9.35,2720,7.025,3109,9.35,3114,8.121,3898,9.763,5238,11.157,5239,11.157,5240,11.157,5241,11.157,5242,11.157,5243,11.157,5244,11.157,5245,11.157,5246,11.157,5247,11.157,5248,11.157]],["keywords/902",[]],["title/903",[7,250.785,25,53.425,33,103.882,184,174.216,477,737.328,1360,499.645,1361,432.085]],["content/903",[5,2.681,6,2.14,25,1.167,33,2.268,51,2.972,122,5.452,152,2.473,171,3.243,176,4.533,184,4.41,185,3,191,3.734,205,4.558,235,7.725,240,4.934,252,4.816,276,7.546,278,3.343,299,7.725,301,2.831,314,4.406,315,4.045,319,5.535,322,4.566,330,2.986,334,3.581,380,9.041,383,11.485,396,4.058,414,4.855,426,7.725,468,5.683,473,9.245,477,10.217,478,7.725,496,5.019,529,7.03,537,4.071,541,6.057,545,3.44,552,6.528,582,6.967,587,7.923,613,4.375,638,7.163,716,6.333,732,4.346,735,5.592,786,5.321,826,6.847,1189,10.91,1323,9.736,1360,10.91,1361,9.435,1567,9.736,5249,12.421,5250,12.421,5251,12.421,5252,12.421,5253,12.421,5254,11.485]],["keywords/903",[]],["title/904",[4,110.083,25,70.65,45,301.381,184,230.384,1361,571.393]],["content/904",[4,1.831,5,0.989,6,0.444,7,1.43,8,2.426,14,1.722,18,1.53,19,2.381,22,3.293,23,4.106,24,2.742,25,0.944,28,1.981,32,1.681,33,1.36,34,2.873,35,2.278,37,1.765,40,1.749,44,2.928,45,2.983,46,1.483,51,1.096,53,1.935,54,3.452,65,2.603,67,1.843,70,2.565,88,1.571,97,2.789,108,2.39,110,5.535,114,1.332,125,1.813,151,1.413,152,0.912,154,1.684,155,2.368,161,1.447,162,1.619,164,1.439,171,1.196,183,3.312,184,4.545,186,1.354,193,4.213,198,4.46,203,2.323,205,2.064,219,1.703,224,4.303,240,2.348,241,1.703,264,3.049,271,1.625,275,3.502,293,2.224,301,1.044,308,3.404,314,5.035,323,2.525,334,1.321,347,2.107,348,2.593,355,1.805,366,2.207,381,2.563,388,2.57,389,2.356,392,2.131,398,2.975,440,5.804,458,2.131,467,1.619,474,2.642,477,7.308,486,2.723,504,5.563,519,2.464,572,1.636,580,4.837,582,2.57,630,5.218,642,2.052,674,1.678,716,1.654,736,2.975,758,1.981,764,2.504,765,2.603,767,7.168,770,2.262,771,5.027,772,1.9,773,4.945,774,2.504,775,2.193,776,3.781,777,2.041,780,2.426,787,2.22,826,2.525,853,2.617,857,2.356,866,2.695,883,2.484,886,4.482,901,1.749,920,2.426,1024,2.155,1038,2.849,1055,3.948,1089,2.642,1157,2.723,1174,2.783,1224,2.668,1257,3.634,1300,3.654,1308,2.593,1309,5.903,1313,2.723,1320,2.464,1343,2.723,1345,2.849,1360,7.804,1361,8.365,1362,8.243,1363,8.243,1365,11.322,1367,3.704,1368,3.839,1369,4.009,1370,6.657,1371,4.009,1372,3.839,1373,3.839,1374,4.009,1377,5.869,1391,3.704,1444,4.976,1584,8.502,1585,4.236,1587,4.236,1588,3.591,1697,2.593,1713,2.484,1746,6.227,1902,2.815,2203,3.004,2502,2.277,2783,4.826,2969,3.098,3563,3.15,3586,2.642,3601,3.839,3851,4.009,3987,12.421,4832,3.267,5255,4.581,5256,4.581,5257,4.581,5258,4.581,5259,4.581,5260,4.581,5261,4.236,5262,4.581,5263,4.581]],["keywords/904",[]],["title/905",[184,340.004,735,705.949]],["content/905",[45,5.29,162,6.591,171,4.869,184,4.978,228,10.025,246,5.891,301,4.25,314,6.614,315,6.073,329,8.309,375,9.727,467,6.591,477,10.86,735,10.335,1257,8.531,1326,11.459,1361,10.029,1746,14.616]],["keywords/905",[]],["title/906",[240,350.087,826,864.293]],["content/906",[4,2.132,14,4.001,19,4.704,21,6.138,22,2.793,23,3.343,25,1.044,32,2.252,34,2.437,40,4.063,44,2.964,45,3.019,46,3.445,54,6.82,125,4.212,181,2.836,184,3.403,193,4.265,198,4.192,203,7.958,222,4.279,228,4.649,240,5.552,241,3.956,246,3.362,288,5.256,293,2.979,301,2.426,305,6.62,314,6.612,322,3.913,334,3.069,366,5.127,381,3.435,440,4.923,477,9.139,481,5.867,515,5.256,529,6.024,541,5.19,600,5.725,668,8.127,705,6.199,716,3.843,826,13.427,854,8.343,993,5.127,996,4.818,1019,6.702,1055,5.29,1147,5.867,1297,7.197,1309,7.382,1343,6.327,1360,6.62,1361,8.44,1363,8.343,1378,6.62,2603,9.314,2913,7.922,2969,7.197,3529,9.314,3580,9.842,3593,10.445,4963,8.92,5176,9.842,5261,9.842,5264,15.692]],["keywords/906",[]],["title/907",[477,913.126,2023,764.557]],["content/907",[23,4.25,32,3.178,34,3.438,54,6.527,124,7.483,151,4.633,161,6.313,164,4.716,167,6.527,172,8.661,184,4.87,240,3.353,241,5.582,347,6.908,477,14.517,826,8.278,1024,7.065,1257,6.87,1298,9.023,1362,11.771,1584,12.141,2023,7.323,3951,10.509,4185,16.746,5265,19.982]],["keywords/907",[]],["title/908",[184,258.124,225,426.689,745,650.672,1361,640.194]],["content/908",[6,1.508,7,4.863,25,1.036,33,2.014,46,5.043,69,4.863,88,5.342,151,4.806,152,3.102,171,4.068,184,3.378,191,4.683,193,6.242,205,4.048,222,4.248,225,9.283,230,4.921,241,5.791,278,5.511,334,4.492,373,4.018,395,6.55,398,5.834,473,11.596,510,7.9,622,6.322,642,6.978,716,5.624,739,10.073,745,8.516,1113,11.34,1114,7.955,1116,10.176,1309,9.631,1859,13.633]],["keywords/908",[]],["title/909",[72,746.242,134,887.422]],["content/909",[]],["keywords/909",[]],["title/910",[334,390.178,4334,1251.356,4335,1184.242]],["content/910",[4,2.091,12,7.035,23,4.237,32,3.225,45,4.322,51,3.646,110,6.721,111,5.75,112,14.833,162,5.386,164,6.336,251,8.472,257,6.825,440,7.048,477,8.874,858,7.674,901,5.816,1254,10.302,1263,10.867,4128,13.334,4335,13.334,5266,20.176,5267,15.237,5268,15.237,5269,15.237,5270,15.237,5271,15.237,5272,15.237]],["keywords/910",[]],["title/911",[112,696.684,308,343.888,504,471.004,1055,528.056,1361,571.393]],["content/911",[3,5.58,4,1.788,22,4.528,23,4.146,25,1.147,28,5.247,29,7.156,30,5.707,32,2.567,34,2.778,51,2.903,73,6.194,94,12.486,112,11.313,113,5.643,251,9.592,256,5.707,297,4.894,308,5.584,319,5.406,347,5.58,375,6.329,389,6.238,394,6.152,458,5.643,467,4.288,504,5.378,741,7.37,1024,5.707,1055,11.483,1361,11.761,1362,9.509,1363,9.509,1367,9.808,1368,10.167,1370,10.167,1372,10.167,1373,10.167,1377,5.675,1584,9.808,1796,7.37,2079,6.93,5137,15.097,5273,12.131,5274,17.252,5275,17.252,5276,12.131]],["keywords/911",[]],["title/912",[5,207.102,6,92.877,176,350.079,184,208.027,205,249.247,480,345.096]],["content/912",[4,1.295,5,3.803,6,2.262,25,1.172,45,6.286,70,4.976,87,4.342,105,6.775,155,3.724,176,7.446,184,4.425,185,3.018,192,4.201,193,5.006,205,3.247,222,3.407,255,5.093,272,5.327,293,3.498,385,4.577,437,4.904,458,5.812,480,8.72,531,6.83,532,7.277,541,6.093,553,5.597,556,4.463,564,5.78,674,4.577,732,4.372,863,7.206,906,6.775,914,5.878,932,8.016,933,9.795,934,7.679,971,7.428,1023,9.3,1035,7.591,1056,7.868,1063,10.472,1163,10.472,1191,7.97,1299,9.096,1361,6.72,1400,7.009,1631,7.072,1633,7.138,2118,8.448,5277,12.495,5278,12.495,5279,12.495,5280,12.495,5281,12.495]],["keywords/912",[]],["title/913",[191,471.331,879,610.406]],["content/913",[14,6.131,19,4.889,25,1.644,46,5.28,107,5.182,171,4.259,181,4.346,191,4.903,202,5.017,225,5.847,241,6.063,278,4.391,315,5.312,398,6.108,432,8.572,523,11.346,563,6.987,861,9.812,883,11.437,893,6.858,993,7.856,996,7.383,1360,13.12,1361,8.772,1598,11.873,2176,12.785,3722,15.082,5282,16.311,5283,16.311]],["keywords/913",[]],["title/914",[3367,897.578]],["content/914",[]],["keywords/914",[]],["title/915",[45,383.895,111,510.637,3367,651.834]],["content/915",[22,6.195,23,4.018,25,1.298,45,5.538,111,7.366,438,7.31,3367,11.37,3726,12.452,5284,19.52,5285,18.05,5286,19.52]],["keywords/915",[]],["title/916",[438,506.782,765,443.523,3367,651.834]],["content/916",[4,1.534,6,1.433,23,4.306,32,4.189,34,3.389,124,7.412,155,4.413,171,3.866,271,5.251,355,5.834,458,6.886,480,7.12,572,7.07,630,5.442,758,6.403,765,6.487,772,6.141,1276,7.839,1400,8.304,2106,8.538,2121,12.164,2495,9.322,3174,10.009,3367,11.465]],["keywords/916",[]],["title/917",[5287,1723.121]],["content/917",[4,2.216,6,2.07,22,3.58,23,4.019,25,0.907,32,2.887,34,3.123,35,3.912,58,6.858,111,5.147,112,8.945,161,4.309,162,4.822,186,4.032,198,3.644,297,5.312,308,4.415,549,7.169,630,6.883,771,5.465,773,7.379,1089,7.867,1090,10.405,1278,6.736,3367,12.002,3368,11.937,3372,15.693,4147,12.613,4480,10.153,4610,11.937,4664,12.613,4917,11.028,5288,13.641,5289,13.641,5290,13.641,5291,15.693,5292,13.641,5293,12.613,5294,12.613]],["keywords/917",[]],["title/918",[5293,1723.121]],["content/918",[6,1.789,23,3.479,32,3.911,34,4.231,88,6.337,381,5.964,510,9.372,630,6.794,771,7.405,773,7.283,1313,10.986,1993,12.496,2353,13.18,3007,15.488,3367,8.902,3372,15.488,4610,16.173,5287,17.09,5291,15.488,5295,18.481,5296,17.09]],["keywords/918",[]],["title/919",[5297,1863.425]],["content/919",[23,3.121,32,4.334,161,7.674,771,8.205,1169,9.37,3367,11.702,4442,13.241,4480,15.244,5298,16.558]],["keywords/919",[]],["title/920",[5299,1723.121]],["content/920",[23,3.216,32,4.466,161,6.666,1278,10.421,1479,11.836,3367,11.91,5300,21.102]],["keywords/920",[]],["title/921",[5299,1723.121]],["content/921",[23,3.919,32,3.843,152,3.615,164,5.702,166,9.845,183,5.719,301,4.139,356,8.446,468,8.308,569,8.911,716,6.556,734,11.374,1074,12.344,1278,8.968,3367,12.385,5301,18.159]],["keywords/921",[]],["title/922",[4480,1386.998]],["content/922",[25,1.418,630,7.837,879,8.299,1646,14.189,3367,10.268,4480,15.867,5302,21.318]],["keywords/922",[]],["title/923",[806,897.578]],["content/923",[1278,10.977,2206,16.545,3367,10.707]],["keywords/923",[]],["title/924",[771,746.606]],["content/924",[771,8.906,773,8.759,3367,10.707]],["keywords/924",[]],["title/925",[630,685.004]],["content/925",[630,8.171,773,8.759,3367,10.707]],["keywords/925",[]],["title/926",[2353,1328.96]],["content/926",[6,2.129,1219,10.594,2353,15.685,3367,10.594]],["keywords/926",[]],["title/927",[5303,1561.679]],["content/927",[6,2.273,25,1.286,68,10.164,330,5.643,381,6.241,408,6.398,773,7.621,2117,12.682,2288,15.87,2334,15.159,3367,11.306,5303,19.671]],["keywords/927",[]],["title/928",[5304,1863.425]],["content/928",[277,12.684,1219,12.199,3367,10.594]],["keywords/928",[]],["title/929",[468,852.533]],["content/929",[23,3.091,32,4.292,34,4.643,161,6.407,468,9.278,549,10.658,1116,10.08,1444,9.596,3367,11.634,5298,16.396,5305,20.28]],["keywords/929",[]],["title/930",[5306,1863.425]],["content/930",[6,1.855,23,3.836,32,4.939,34,4.387,161,6.053,167,8.328,549,10.07,1116,9.524,3367,9.229,5291,21.095,5298,15.491,5307,16.768,5308,19.161]],["keywords/930",[]],["title/931",[5294,1723.121]],["content/931",[6,1.872,23,3.852,32,4.967,34,4.428,161,6.109,549,10.164,1116,9.612,3367,9.315,5296,17.883,5298,15.635,5307,16.924,5309,19.339,5310,19.339,5311,19.339]],["keywords/931",[]],["title/932",[5312,1863.425]],["content/932",[4,0.932,5,3.634,6,1.63,22,3.627,23,4.223,24,3.103,25,0.598,32,4.315,34,3.854,35,2.578,36,4.69,37,2.826,45,2.55,51,2.151,52,2.477,72,4.279,161,2.84,171,2.348,176,3.281,186,2.657,187,5.525,193,3.602,198,3.691,201,3.472,224,2.726,230,2.84,271,3.189,297,2.55,308,4.473,330,2.161,355,3.543,356,4.182,373,2.318,375,4.69,407,4.384,408,2.974,455,4.304,458,4.182,507,5.591,549,4.725,572,3.211,600,4.835,630,3.305,659,4.135,674,3.293,742,11.158,758,3.888,765,2.946,772,3.729,773,3.543,827,5.525,944,5.043,1116,4.469,1628,5.289,1793,7.867,1827,5.043,1872,7.432,1965,6.291,2079,5.136,2085,8.313,2121,5.525,3367,11.432,4028,8.129,4029,4.69,4032,7.867,4611,8.313,5285,8.313,5298,7.268,5307,7.867,5313,8.99,5314,13.819,5315,13.819,5316,13.819,5317,8.313]],["keywords/932",[]],["title/933",[1276,986.75]],["content/933",[]],["keywords/933",[]],["title/934",[198,418.827,224,475.386]],["content/934",[4,1.683,23,4.253,32,2.361,34,2.554,35,3.199,44,4.523,45,3.165,69,3.483,124,4.178,151,6.898,152,2.221,174,6.632,198,4.339,222,3.042,224,6.779,225,3.999,241,7.119,246,3.525,467,9.038,490,4.433,556,3.985,561,5.249,571,7.316,572,3.985,765,3.657,843,5.05,901,6.2,1040,7.117,1309,5.249,1704,7.025,1916,10.317,2023,5.44,2106,6.434,2121,6.857,2495,7.025,2496,8.121,2953,7.316,3174,7.543,3367,7.824,3739,9.35,3756,9.02,4421,9.02,4458,9.35,4620,14.61,4705,10.317,4876,9.763,5318,9.02]],["keywords/934",[]],["title/935",[35,534.362]],["content/935",[4,1.882,33,2.92,35,7.048,65,5.952,88,7.743,204,8.592,224,7.796,361,10.186,474,10.473,879,7.07,942,10.911,2203,11.908,2568,12.707,3446,16.792,4643,14.234,5319,18.159,5320,16.792]],["keywords/935",[]],["title/936",[765,610.733]],["content/936",[4,1.985,25,1.552,152,3.815,189,9.784,193,7.677,217,6.845,222,5.225,224,5.81,590,8.17,674,7.018,695,9.463,765,8.586,1224,13.593]],["keywords/936",[]],["title/937",[151,483.714,4620,1195.939]],["content/937",[151,6.137,174,11.825,224,6.032,572,7.106,590,8.482,716,7.182,861,9.253,901,7.594,1040,12.689,1192,12.372,2512,16.672,3367,9.582,4620,15.174,5321,19.893]],["keywords/937",[]],["title/938",[435,852.533]],["content/938",[65,6.647,174,12.055,219,7.538,271,7.194,435,11.05,765,6.647,861,9.433,1444,9.596,2079,11.585,2496,14.763,4458,16.996]],["keywords/938",[]],["title/939",[33,202.738,224,475.386]],["content/939",[23,4.105,32,4.58,33,2.799,34,3.887,35,4.868,124,6.357,154,6.24,164,5.331,198,4.535,224,7.608,496,6.859,765,5.564,768,9.697,780,8.989,1098,13.306,1169,7.766,1337,14.226,2121,10.432,5322,21.643,5323,16.975]],["keywords/939",[]],["title/940",[151,574.895]],["content/940",[]],["keywords/940",[]],["title/941",[23,238.957,183,493.826]],["content/941",[6,1.699,23,2.674,116,7.246,154,6.45,161,5.543,164,7.976,183,6.961,224,5.32,330,4.219,356,8.162,468,8.028,545,4.86,630,6.45,722,8.838,736,6.571,787,8.504,5324,17.547,5325,23.487,5326,17.547,5327,17.547,5328,17.547]],["keywords/941",[]],["title/942",[787,903.071]],["content/942",[4,1.865,23,3.423,32,3.81,33,2.328,34,4.122,35,5.162,152,3.584,161,5.687,162,7.939,224,5.458,425,6.476,480,8.08,737,6.052,765,5.9,787,8.724,806,8.671,1278,8.89,2023,8.778,3778,10.816,3781,11.483,4515,11.196,4663,14.554]],["keywords/942",[]],["title/943",[5329,1723.121]],["content/943",[4,1.614,23,3.12,32,3.297,34,3.567,35,4.467,88,5.342,152,4.553,155,4.644,161,4.921,162,5.507,224,4.724,225,5.585,278,4.194,382,8.011,385,5.706,458,7.246,474,8.985,556,5.565,569,7.645,787,9.922,806,7.504,858,7.847,901,5.947,993,7.504,1169,10.462,1204,8.011,1278,7.693,1337,13.056,1417,8.516,1856,11.34,1859,13.633,2779,9.574,3778,9.36,3781,9.937,4515,9.689,5329,14.406,5330,15.579]],["keywords/943",[]],["title/944",[4252,1630.706]],["content/944",[4,1.343,23,4.068,32,2.743,34,2.968,35,5.183,61,6.971,68,6.812,69,4.046,103,5.776,152,4.143,154,6.644,161,6.575,164,4.07,201,5.006,225,4.646,301,2.954,381,4.183,490,5.15,543,4.8,545,3.59,572,6.457,736,4.854,772,5.376,787,10.912,792,7.475,1149,11.343,1278,8.926,1377,11.472,1479,7.27,1779,8.911,1796,7.875,2023,6.321,2301,8.268,3196,14.168,4252,15.818,4515,11.242,5331,12.962,5332,12.962,5333,12.962,5334,11.986,5335,10.863]],["keywords/944",[]],["title/945",[5336,1863.425]],["content/945",[4,1.976,14,5.266,23,4.21,32,4.035,34,4.366,62,6.001,63,3.072,125,5.543,152,3.796,161,4.425,164,4.399,177,7.203,201,5.41,293,3.921,381,4.52,427,5.149,468,9.918,490,5.566,543,7.061,572,5.004,771,5.612,792,8.078,1155,9.471,1204,7.203,1278,10.706,1377,8.919,1479,7.857,3196,14.947,5337,19.068,5338,14.007,5339,14.007,5340,14.007,5341,14.007]],["keywords/945",[]],["title/946",[5342,1630.706]],["content/946",[23,3.498,32,3.946,34,4.269,35,5.347,152,3.712,161,5.891,162,6.591,224,5.654,291,8.928,787,9.037,806,8.982,1169,8.531,1278,9.208,2000,13.879,2058,11.894,3778,11.204,4515,11.597,5335,15.627,5343,17.243,5344,18.646]],["keywords/946",[]],["title/947",[4253,1723.121]],["content/947",[23,4.269,32,3.178,34,3.438,35,5.73,63,3.293,69,4.688,86,6.068,88,5.149,152,2.99,154,5.52,161,4.744,201,5.8,272,6.403,373,5.153,512,6.147,806,7.233,1278,9.868,1377,9.347,1479,8.423,3196,15.663,3778,9.023,3781,9.579,4515,12.428,5334,13.886,5335,12.585,5342,17.487,5345,15.017]],["keywords/947",[]],["title/948",[5346,1723.121]],["content/948",[9,6.081,23,3.862,32,2.813,34,3.043,35,3.812,46,4.303,76,7.901,88,6.307,147,8.479,148,7.666,152,3.662,164,5.776,189,6.787,201,5.134,225,4.765,229,7.456,373,5.87,452,6.148,464,9.894,484,7.456,545,3.682,630,4.886,785,6.432,1166,8.717,1278,6.564,1298,7.987,1377,8.604,1417,7.266,1697,7.524,1796,8.076,2252,8.076,2381,9.676,2671,8.717,2769,10.139,2779,8.169,4419,12.292,4515,8.267,5342,20.913,5347,12.292,5348,11.14,5349,13.292,5350,18.394,5351,22.762]],["keywords/948",[]],["title/949",[642,834.662]],["content/949",[4,1.915,23,3.775,32,3.911,34,4.231,152,3.679,224,5.604,493,11.494,642,11.096,805,12.119,861,8.596,901,7.055,1049,11.358,3174,12.496,4652,12.933,5352,17.09,5353,18.481,5354,18.481,5355,18.481]],["keywords/949",[]],["title/950",[800,1303.973]],["content/950",[4,1.614,23,3.702,35,4.467,151,4.806,152,5.023,161,4.921,164,6.429,172,8.985,222,4.248,224,4.724,273,3.416,481,8.588,557,6.19,642,10.243,736,7.667,804,7.55,861,7.246,862,9.81,901,5.947,1417,11.191,3564,11.11,3778,9.36,4766,13.633,5352,14.406,5356,15.579,5357,15.579,5358,20.473,5359,18.932,5360,15.579]],["keywords/950",[]],["title/951",[4176,1561.679]],["content/951",[23,3.986,32,4.035,34,3.207,53,5.917,62,6.001,63,3.072,68,7.362,69,4.373,88,4.803,152,4.633,161,7.352,172,8.078,188,7.857,201,5.41,215,7.362,373,3.612,556,5.004,557,5.566,642,8.541,771,8.686,800,9.802,804,6.788,809,6.917,894,5.368,1085,11.739,1169,6.409,1417,10.423,1614,11.882,2117,9.186,2321,8.82,2768,9.802,2769,10.685,4176,11.739,5361,14.007,5362,14.007,5363,14.007,5364,14.007]],["keywords/951",[]],["title/952",[5365,1561.679]],["content/952",[4,2.254,22,5.71,23,3.836,25,1.138,45,4.855,111,6.458,151,5.28,152,3.407,158,10.777,164,5.374,198,4.572,217,7.771,224,5.189,458,7.961,3726,10.917,5365,14.343,5366,14.343,5367,18.233,5368,15.826,5369,15.826,5370,15.826,5371,17.115,5372,15.826,5373,14.977]],["keywords/952",[]],["title/953",[5366,1561.679]],["content/953",[4,1.95,22,6.553,23,2.868,33,2.433,68,9.888,116,7.77,151,5.805,152,3.746,164,5.908,169,16.465,217,6.721,224,5.705,716,6.793,787,9.118,4468,16.465,5367,19.344,5374,18.815]],["keywords/953",[]],["title/954",[468,852.533]],["content/954",[6,1.838,23,2.894,34,4.347,134,10.746,152,3.78,166,10.294,198,5.072,224,7.037,271,6.735,407,9.258,468,11.469,493,11.808,765,6.223,2779,11.668,5375,18.986,5376,18.986]],["keywords/954",[]],["title/955",[1726,1002.228]],["content/955",[2,6.593,6,2.175,34,4.122,183,5.67,184,3.904,191,5.412,198,4.809,224,7.422,427,6.618,452,8.327,468,8.236,569,8.834,572,6.43,607,9.76,809,8.89,843,8.148,1332,9.682,1337,15.087,2783,10.937,3320,14.111,5377,18.002,5378,18.002]],["keywords/955",[]],["title/956",[23,206.245,5379,1353.247,5380,1353.247]],["content/956",[34,5.034,46,5.632,51,4.164,64,11.765,69,5.432,111,6.566,151,5.368,164,6.904,182,3.472,192,5.85,224,6.666,281,8.525,373,4.487,413,9.012,468,11.027,745,9.512,1111,11.963,1726,11.825,5381,17.4,5382,21.986,5383,17.4]],["keywords/956",[]],["title/957",[5384,1863.425]],["content/957",[23,3.121,32,4.334,124,7.669,161,7.674,427,7.528,572,7.316,1257,9.37,1276,10.845,2303,11.015,5385,20.48]],["keywords/957",[]],["title/958",[3769,1421.376]],["content/958",[4,1.369,6,1.279,7,5.717,10,5.226,22,3.466,23,2.791,25,1.218,33,2.935,45,3.747,51,3.161,149,5.479,151,4.075,154,6.732,198,6.064,224,6.374,271,4.685,301,4.174,311,5.658,366,6.362,425,6.588,427,6.732,452,6.109,458,6.144,468,8.378,469,14.355,572,4.718,694,6.565,703,7.843,716,6.612,763,6.744,843,5.978,901,5.042,1058,6.84,1169,6.043,1178,8.931,1276,11.132,1891,9.243,2062,12.189,2252,8.025,3863,17.618,3864,11.069,5318,10.679]],["keywords/958",[]],["title/959",[843,843.452]],["content/959",[]],["keywords/959",[]],["title/960",[782,1096.24]],["content/960",[22,4.723,23,4.182,24,7.16,25,0.857,32,2.726,33,1.666,34,2.949,35,5.161,37,2.163,50,7.101,54,7.822,124,7.768,151,3.974,174,10.698,198,3.441,241,4.788,275,4.289,286,7.916,355,5.076,408,4.262,467,8.352,600,13.165,764,7.042,776,8.566,777,5.74,779,8.574,879,5.015,981,10.281,1077,7.291,1256,10.186,1257,5.893,1400,10.095,1704,8.111,1814,8.111,1942,10.097,3263,10.796]],["keywords/960",[]],["title/961",[35,534.362]],["content/961",[1,7.819,4,2.29,6,2.14,33,2.858,35,6.338,37,2.946,84,9.364,88,7.578,89,11.049,116,7.246,122,7.702,204,8.303,219,6.522,408,5.806,432,9.222,474,10.12,590,7.481,716,6.335,773,6.915,843,7.942,2131,10.543,2203,11.507,2720,11.049]],["keywords/961",[]],["title/962",[37,312.842]],["content/962",[3,5.132,4,2.558,5,2.409,6,1.08,7,3.483,8,5.908,19,3.344,22,4.263,23,3.948,24,5.607,25,0.742,32,3.437,33,1.443,34,3.719,35,4.658,36,8.473,37,3.216,40,7.311,41,7.543,46,3.611,51,3.887,63,3.562,65,6.277,67,4.489,122,7.129,152,2.221,188,6.258,201,4.309,234,5.161,260,9.919,275,5.408,278,3.003,297,3.165,314,3.958,334,3.217,355,4.397,396,3.645,399,6.099,408,7.721,504,7.201,661,7.117,776,7.731,777,7.238,920,8.601,958,5.161,1261,7.117,2389,9.35,5386,10.317,5387,15.02,5388,11.157,5389,10.317]],["keywords/962",[]],["title/963",[1400,1045.231]],["content/963",[4,2.004,14,7.27,33,2.501,171,5.05,193,7.748,222,5.273,224,5.864,480,8.444,674,7.083,737,6.502,773,7.621,1400,13.166,2354,16.207,4455,16.924,5390,19.339]],["keywords/963",[]],["title/964",[1256,1054.703]],["content/964",[7,4.463,8,7.57,12,4.985,19,4.285,33,1.849,51,3.421,58,5.236,69,4.463,70,3.486,88,6.629,99,6.811,116,7.984,124,5.354,140,11.206,171,5.048,198,3.819,204,6.764,219,7.186,222,3.898,246,4.516,264,6.351,298,7.015,301,3.258,311,6.124,427,8.627,432,10.161,438,5.354,504,6.338,506,7.751,736,8.788,1178,14.811,1205,11.206,1256,8.091,1257,6.54,1392,11.558,1398,9.002,1444,6.764,5391,14.296,5392,14.296]],["keywords/964",[]],["title/965",[981,1064.513]],["content/965",[4,1.677,25,1.396,33,2.714,44,4.506,54,7.034,62,6.933,63,4.603,124,6.061,171,4.226,177,8.322,180,7.445,183,6.611,215,11.031,228,7.068,246,5.113,271,5.741,273,4.603,382,8.322,401,7.249,514,7.524,543,5.993,545,4.483,648,10.191,706,8.264,981,11.99,982,8.636,1444,7.658,2172,10.943,5393,14.965,5394,16.184]],["keywords/965",[]],["title/966",[4214,1630.706]],["content/966",[1,5.602,14,4.725,20,5.631,23,3.568,24,6.107,25,0.836,32,3.744,33,1.625,34,4.051,35,5.87,37,2.97,63,2.757,67,5.058,69,5.523,88,7.019,124,8.32,154,4.621,171,5.345,198,4.726,203,6.375,296,9.357,382,6.464,396,5.78,427,6.503,484,7.051,487,7.916,531,6.872,776,8.42,779,11.775,843,5.69,1112,7.472,1298,7.553,1377,5.88,1398,7.916,1444,5.948,1648,8.796,1792,8.642,1796,10.748,1872,6.761,1983,9.15,2560,8.243,2950,11.001,4195,11.001,4197,11.001,4214,20.49,5395,12.57,5396,11.624]],["keywords/966",[]],["title/967",[5397,1723.121]],["content/967",[23,3.972,24,7.172,32,4.397,34,4.758,35,5.959,37,3.489,88,5.464,124,7.782,154,5.858,198,4.257,407,7.771,427,5.858,637,9.104,776,9.89,779,13.831,843,7.213,1726,12.436,4195,20.234,4197,13.946,5393,14.736,5397,19.215,5398,15.936]],["keywords/967",[]],["title/968",[5399,1723.121]],["content/968",[4,1.303,6,1.217,7,5.523,8,6.657,9,5.751,19,3.768,22,3.299,23,4,24,4.339,25,0.836,32,2.66,34,2.878,44,3.5,51,3.008,54,5.463,65,4.12,87,4.368,131,6.375,151,7.224,161,5.589,280,8.019,293,3.519,297,3.566,308,4.069,355,4.954,373,4.562,381,4.056,396,4.107,510,6.375,549,6.606,592,7.637,674,6.48,772,5.214,773,8.067,1074,6.872,1116,6.248,1377,5.88,1617,6.558,2334,18.353,3862,11.624,4146,11.624,5303,10.535,5399,11.624,5400,12.57,5401,12.57,5402,12.57,5403,12.57,5404,12.57,5405,12.57,5406,12.57,5407,12.57,5408,11.624]],["keywords/968",[]],["title/969",[901,711.307]],["content/969",[]],["keywords/969",[]],["title/970",[23,238.957,183,493.826]],["content/970",[116,8.457,154,7.528,161,6.47,164,6.431,183,6.45,230,6.47,356,9.526,722,10.315,843,9.27,5325,18.938,5409,20.48]],["keywords/970",[]],["title/971",[5365,1561.679]],["content/971",[4,2.142,6,2.002,22,5.426,23,3.723,25,1.052,33,2.045,45,4.487,111,5.968,124,5.923,151,4.879,152,3.149,158,9.959,164,4.966,172,9.121,174,9.401,198,4.225,217,7.386,224,4.795,458,7.356,480,5.689,737,5.317,1649,12.397,1690,11.279,3726,10.088,5365,13.254,5366,13.254,5367,17.328,5368,14.624,5369,14.624,5370,14.624,5372,14.624,5373,13.84,5410,15.815]],["keywords/971",[]],["title/972",[5366,1561.679]],["content/972",[4,2.081,22,6.302,23,3.061,33,3.105,151,6.196,164,6.307,217,7.174,4468,17.576,5367,20.125,5411,20.085]],["keywords/972",[]],["title/973",[2111,1240.307]],["content/973",[18,7.049,33,2.729,84,11.261,222,5.754,230,6.666,674,7.729,1268,10.929,1317,14.767]],["keywords/973",[]],["title/974",[3759,1460.68]],["content/974",[161,6.735,549,11.204,843,9.649,912,11.121,1116,10.596,3758,13.258,4040,14.189]],["keywords/974",[]],["title/975",[5412,1723.121]],["content/975",[4,1.523,22,5.17,23,4.082,33,3.069,46,4.758,161,4.644,164,6.186,172,8.477,189,7.506,301,3.35,373,5.08,381,4.743,456,17.239,549,7.725,972,9.639,1116,7.306,1155,13.319,1157,11.71,1427,7.844,1637,12.319,1814,9.256,2114,9.639,2281,9.784,2445,12.864,3770,14.662,3772,13.593,3963,15.026,5413,14.699,5414,14.699,5415,19.699,5416,14.699]],["keywords/975",[]],["title/976",[1726,1002.228]],["content/976",[2,6.427,6,2.14,24,6.057,33,3.385,34,4.018,161,5.543,183,5.527,184,3.805,191,5.275,198,4.687,427,6.45,452,8.116,468,8.028,549,9.222,572,6.268,607,9.514,1116,8.722,1332,9.438,1726,13.014,2783,10.661,5417,16.226]],["keywords/976",[]],["title/977",[468,852.533]],["content/977",[4,2.27,5,3.086,6,2.121,14,5.374,18,4.775,22,3.752,23,3.339,25,0.951,33,2.833,34,3.273,37,3.246,70,3.486,107,3.511,152,2.846,191,4.298,198,3.819,275,4.76,385,7.081,407,6.971,427,8.053,435,6.54,468,10.022,507,8.891,561,6.725,607,7.751,843,8.751,944,8.019,1656,12.868,1992,11.558,2502,7.106,2723,13.219,2779,8.786,5418,14.296,5419,14.296,5420,21.906,5421,13.219,5422,13.219]],["keywords/977",[]],["title/978",[5423,1723.121]],["content/978",[22,5.123,23,3.867,25,1.298,32,4.131,124,7.31,161,7.457,427,7.176,572,6.973,843,8.835,1257,8.931,2303,10.499,5423,18.05,5424,19.52]],["keywords/978",[]],["title/979",[224,564.997]],["content/979",[7,5.013,23,4.052,32,3.399,34,3.677,51,3.843,116,9.584,164,6.558,281,6.227,427,7.677,468,7.347,569,7.88,734,12.378,765,5.263,768,9.174,843,7.269,1170,8.2,1276,11.059,1987,12.249,2121,9.869,2495,10.112,2502,7.982,3431,14.85,3767,11.69,5425,16.059,5426,16.059]],["keywords/979",[]],["title/980",[107,214.787,180,402.245,185,211.234,264,253.505,315,284.809,622,354.85,1329,443.427]],["content/980",[]],["keywords/980",[]],["title/981",[310,538.773,315,387.69,1329,603.606,2628,907.934]],["content/981",[4,1.347,6,1.754,12,2.897,19,2.491,25,1.307,33,1.074,37,1.395,40,3.172,46,4.208,51,3.832,52,2.289,53,3.51,69,2.594,70,2.026,88,4.457,103,7.135,107,3.193,154,3.054,176,4.744,181,4.267,182,1.658,184,2.819,186,4.733,196,2.586,198,2.22,205,5.108,206,5.7,220,7.368,225,4.66,230,2.625,240,1.855,243,3.822,246,2.625,260,4.303,264,2.409,278,3.499,280,5.3,281,5.041,290,6.338,297,4.543,301,1.894,310,3.761,311,3.559,314,2.947,315,5.899,322,4.779,330,1.998,364,4.505,372,5.372,373,3.352,382,4.272,385,3.043,388,4.661,394,6.592,397,5.3,421,6.732,440,6.013,484,4.661,486,9.518,490,5.165,513,4.939,514,2.978,520,3.761,545,3.601,552,4.367,553,3.722,579,5.372,582,4.661,587,5.3,706,4.243,718,3.372,742,3.761,792,4.792,874,3.684,894,3.184,994,4.469,1053,6.513,1160,8.12,1189,9.959,1296,6.718,1329,8.12,1422,5.814,1564,5.3,1650,4.939,1713,4.505,1850,5.926,2025,6.718,2057,5.712,2089,5.449,2098,5.232,2130,5.449,2161,6.338,2303,4.469,2741,6.338,2876,7.271,3023,7.683,3190,7.683,3785,6.963,5427,8.309,5428,8.309,5429,8.309,5430,8.309,5431,8.309,5432,8.309,5433,8.309]],["keywords/981",[]],["title/982",[152,236.98,315,387.69,659,547.547,1329,603.606]],["content/982",[18,8.603,23,2.651,46,3.973,65,4.023,82,8.589,134,6.947,162,7.77,171,3.205,184,2.662,205,6.579,225,4.4,230,3.878,246,3.878,330,5.285,347,8.002,380,18.039,458,5.709,580,5.646,659,5.646,1024,5.774,1116,6.101,1177,14.261,1278,6.062,1310,7.148,1339,5.498,2131,7.375,2667,10.287,2692,16.238,2720,7.729,3642,18.422,5434,16.086,5435,18.685,5436,12.274,5437,12.274,5438,12.274,5439,12.274]],["keywords/982",[]],["title/983",[315,387.69,579,769.603,659,547.547,1329,603.606]],["content/983",[4,1.005,18,4.892,23,4.345,40,3.703,62,4.156,63,2.128,65,3.18,152,4.199,154,3.566,161,6.663,164,4.599,183,3.056,184,3.176,204,4.591,205,4.583,206,3.453,225,5.25,229,5.442,230,6.207,240,3.27,373,2.502,380,12.84,394,4.92,483,7.876,513,10.486,579,6.273,580,4.463,592,8.897,600,5.218,716,3.503,734,4.887,879,3.777,901,5.59,1074,5.303,1177,9,1309,4.564,1339,4.346,1479,8.214,1872,5.218,2303,5.218,3684,11.806,3764,7.062,4442,6.273,4485,7.844,5015,8.131,5440,12.815,5441,9.702,5442,9.702,5443,9.702,5444,8.971]],["keywords/983",[]],["title/984",[2886,1077.888,3684,942.051]],["content/984",[4,1.976,18,4.679,19,4.199,107,3.441,114,4.072,116,5.784,152,4.633,161,4.425,183,4.412,184,4.135,191,4.211,204,6.628,205,3.639,220,7.663,229,10.695,240,3.128,319,6.242,388,7.857,389,7.203,397,8.935,425,5.039,457,9.471,483,7.534,580,6.444,737,6.411,771,5.612,786,6.001,827,8.608,919,9.802,1024,6.59,1332,7.534,1339,6.274,1479,7.857,1811,10.196,1872,7.534,2303,7.534,2693,9.99,2717,10.685,2886,13.109,3684,15.441,3764,10.196,5440,12.258]],["keywords/984",[]],["title/985",[116,647.46,183,493.826]],["content/985",[10,5.433,25,0.913,49,6.459,79,7.271,116,9.983,181,3.658,183,4.325,184,2.978,205,6.281,220,8.158,240,3.066,293,3.843,301,3.129,314,4.871,315,4.472,319,9.561,330,3.301,373,3.541,375,7.163,381,4.431,388,7.702,398,5.142,455,6.574,580,6.316,616,9.608,716,4.957,734,9.474,741,8.342,912,7.163,1024,6.459,1332,7.385,1564,8.758,1872,7.385,2098,8.646,2424,11.101,2751,14.744,2886,12.931,3684,12.891,3951,9.608,5015,19.341]],["keywords/985",[]],["title/986",[6,131.019,240,302.163,3961,1184.242]],["content/986",[4,1.94,6,1.32,9,4.043,18,2.952,19,2.649,23,3.797,25,0.588,32,1.87,33,1.143,44,2.461,54,3.841,65,4.47,88,3.03,107,2.171,124,3.31,152,4.887,155,4.964,162,3.124,171,3.561,173,5.253,174,5.253,184,4.06,192,2.971,204,4.182,220,3.124,228,3.86,229,9.341,230,5.915,243,6.273,301,3.108,319,3.938,330,2.125,341,9.899,347,4.065,361,4.957,381,4.401,425,3.179,427,5.013,467,3.124,520,6.173,557,3.511,580,4.065,652,7.973,711,3.75,737,6.802,770,4.364,809,10.558,827,5.431,953,6.578,967,6.433,1024,4.158,1074,4.831,1114,4.513,1160,4.482,1169,4.043,1175,5.565,1177,5.431,1183,4.872,1257,4.043,1280,6.927,1283,7.406,1309,4.158,1339,3.958,1614,4.513,1831,7.406,1889,5.565,2146,6.433,2321,5.565,2330,11.026,2381,6.433,2444,5.369,2669,9.221,2677,9.543,2693,6.303,3684,8.194,3887,9.376,4063,8.172,4879,6.578,5202,8.172,5440,7.734,5445,8.838,5446,8.838,5447,8.838,5448,8.838,5449,8.838]],["keywords/986",[]],["title/987",[225,562.039,278,422.052]],["content/987",[4,1.039,18,8.326,23,3.422,54,4.359,67,4.035,69,3.131,88,5.148,152,3.583,154,6.615,155,2.989,162,3.545,171,2.619,181,4,184,2.175,198,4.011,205,5.191,225,8.049,228,4.38,230,3.168,240,2.239,241,5.581,267,8.405,301,3.422,330,2.411,380,16.345,387,5.841,388,5.625,455,4.802,483,5.394,484,5.625,661,9.577,772,4.16,857,5.157,1109,5.194,1113,7.3,1114,5.121,1116,4.985,1173,5.961,1220,5.729,1276,5.311,1309,9.399,1332,5.394,1339,4.492,1388,6.397,1438,12.138,2058,6.397,2079,5.729,2308,6.315,2598,7.65,3014,9.274,3564,7.152,3642,15.081,3859,7.465,3951,7.018,4421,8.108,5318,8.108,5434,13.883,5435,13.883,5444,9.274,5450,22.454,5451,17.995,5452,17.995,5453,10.029]],["keywords/987",[]],["title/988",[1342,1259.934]],["content/988",[4,1.263,5,0.578,6,0.817,14,1.848,18,2.82,19,0.803,22,1.29,23,4.329,25,0.738,32,2.785,34,2.256,44,1.897,46,0.867,51,1.176,54,3.669,65,0.878,69,2.127,73,1.368,116,4.07,122,1.176,124,4.929,147,3.136,148,3.929,151,0.826,152,3.545,154,3.623,161,3.113,162,2.408,164,3.484,167,2.137,171,2.574,172,1.545,173,1.592,180,2.261,181,1.31,183,1.548,184,4.054,185,2.039,192,0.901,193,1.97,198,0.716,201,1.035,205,1.77,206,1.75,220,3.484,222,0.73,224,0.812,225,1.762,228,1.17,229,1.502,230,0.846,240,2.477,241,2.532,246,0.846,264,0.777,281,1.906,293,0.75,301,1.924,307,3.929,311,1.147,315,1.601,319,1.194,330,1.182,335,1.91,347,5.607,356,4.584,364,1.452,373,1.268,381,2.199,387,1.56,388,1.502,397,3.136,398,1.841,400,1.206,425,1.769,427,1.807,452,1.239,455,1.282,458,2.287,467,4.653,490,1.953,513,2.922,516,1.377,520,1.212,557,2.707,580,4.534,590,1.142,600,1.441,616,1.874,630,0.985,645,2.892,648,1.687,652,6.302,711,1.137,734,2.476,735,2.213,736,1.003,737,2.838,741,1.627,745,1.464,758,2.126,771,3.382,772,1.111,806,1.29,809,6.019,861,1.246,879,1.043,886,2.434,894,1.026,901,1.022,910,2.741,950,3.272,958,1.239,1024,5.219,1055,1.331,1109,1.387,1114,6.223,1173,1.592,1176,1.53,1191,1.709,1220,1.53,1256,1.516,1257,4.509,1268,1.387,1276,1.418,1309,4.636,1317,1.874,1320,3.664,1332,2.644,1339,3.052,1342,4.607,1343,1.592,1345,4.237,1347,3.057,1350,2.043,1351,1.994,1353,5.71,1354,5.129,1359,2.043,1377,1.253,1479,2.757,1511,1.95,1526,1.464,1540,1.666,1564,3.136,1580,1.994,1602,1.627,1614,1.368,1726,1.441,1779,1.841,1803,1.994,1827,1.502,1872,3.664,1889,1.687,1993,1.811,2062,1.783,2203,1.757,2241,2.043,2303,2.644,2444,1.627,2502,2.444,2589,1.646,2669,1.811,2693,4.859,2720,1.687,2733,1.91,2751,2.1,2886,1.841,2912,1.666,2927,3.096,2979,1.811,3114,3.579,3560,1.95,3567,4.302,3569,2.477,3573,2.477,3575,2.344,3586,1.545,3642,7.075,3684,5.922,3709,2.245,3756,2.166,3758,3.057,3759,5.341,3764,1.95,3887,5.804,4051,1.757,4222,3.975,4349,1.91,4442,1.732,4638,4.546,4667,4.12,4822,1.592,4879,1.994,4989,2.477,5015,2.245,5037,2.477,5041,2.477,5128,2.477,5454,2.679,5455,2.679,5456,2.679,5457,2.679,5458,2.679,5459,2.477,5460,2.679,5461,2.679,5462,2.679,5463,2.679,5464,2.679,5465,2.679,5466,2.679,5467,4.916,5468,4.916,5469,2.477,5470,2.679,5471,2.679,5472,2.679,5473,2.679,5474,2.679,5475,2.679,5476,4.916,5477,4.916,5478,2.679,5479,2.679,5480,2.679,5481,2.679,5482,2.679,5483,2.679,5484,2.679,5485,2.679]],["keywords/988",[]],["title/989",[281,524.746,297,383.895,379,619.122]],["content/989",[4,2.101,12,5.352,22,4.028,25,1.348,33,1.985,44,4.274,45,4.354,51,4.851,62,6.575,63,3.366,69,4.791,171,5.928,177,7.893,184,4.923,201,5.928,246,4.849,281,8.803,373,5.855,379,7.022,427,8.345,504,6.805,716,5.541,782,9.03,1169,7.022,1256,8.688,1257,9.275,1547,10.216,2088,10.947,3758,9.546,3759,12.032,4040,10.216]],["keywords/989",[]],["title/990",[278,422.052,1377,733.4]],["content/990",[4,2.012,6,1.684,12,3.306,19,2.842,23,3.481,25,0.631,67,3.815,79,5.021,86,3.831,111,3.578,122,4.161,125,3.752,152,3.866,164,4.519,166,5.14,184,3.121,205,3.739,222,2.585,229,5.318,230,6.135,240,2.117,278,4.682,287,4.713,301,2.161,310,4.291,334,2.734,347,4.361,356,4.41,427,5.29,446,7.057,455,4.539,457,6.411,463,6.762,474,5.468,476,5.76,568,5.578,572,3.387,580,8.001,652,8.328,734,4.775,737,6.529,745,5.183,771,3.799,919,6.635,1024,4.46,1048,7.665,1058,7.453,1113,6.902,1204,4.875,1220,8.221,1332,7.74,1339,7.791,1377,11.007,1547,6.311,1779,9.894,1889,5.97,1890,7.432,1988,7.665,2062,9.579,2175,7.057,2179,7.232,2239,12.662,2429,10.264,2502,4.713,2767,8.767,2978,8.297,3280,11.635,3746,7.946,4109,8.297,4917,11.635,5064,13.308,5486,9.481,5487,9.481,5488,9.481,5489,8.767,5490,9.481,5491,9.481,5492,9.481,5493,9.481]],["keywords/990",[]],["title/991",[932,847.955]],["content/991",[4,1.967,184,4.117,205,6.514,206,6.758,220,8.205,330,4.565,361,10.65,413,9.833,737,6.383,939,15.35,1175,11.956,1889,11.956,2058,12.111,2693,13.541,2728,14.482,2771,14.482]],["keywords/991",[]],["title/992",[4832,1328.96]],["content/992",[4,2.187,151,6.51,161,6.666,183,6.646,184,4.576,252,8.183,1342,14.268,4832,15.05]],["keywords/992",[]],["title/993",[183,586.914]],["content/993",[23,3.745,124,7.274,152,3.867,164,7.717,183,6.118,184,4.767,285,9.896,347,6.622,373,5.009,455,6.892,652,9.3,716,7.012,734,12.377,772,5.971,1024,6.772,1175,9.064,1257,8.886,1309,6.772,1339,6.448,1377,6.733,2088,10.266,4349,10.266,4832,10.266,5359,17.961,5494,14.395,5495,14.395,5496,14.395,5497,14.395,5498,14.395,5499,19.423,5500,14.395]],["keywords/993",[]],["title/994",[4878,1561.679]],["content/994",[34,5.17,49,8.543,107,4.46,161,5.737,184,5.576,301,4.139,361,10.186,458,8.446,464,13.516,549,9.543,786,9.673,1116,9.026,1444,10.685,2088,12.951,3196,14.234,4349,12.951,4878,15.218,5501,18.159]],["keywords/994",[]],["title/995",[5502,1723.121]],["content/995",[4,1.799,5,1.661,6,0.745,14,4.6,18,2.57,19,2.307,23,3.817,25,0.512,32,1.628,34,5.026,54,3.344,124,6.5,125,3.045,148,10.01,149,5.075,152,1.532,155,2.294,161,2.431,164,4.783,176,2.808,181,2.05,182,2.441,183,3.854,184,4.587,185,2.956,196,2.395,205,1.999,229,8.544,264,5.032,281,7.345,301,3.956,315,6.889,361,4.316,373,3.928,381,2.483,402,4.438,413,6.337,427,2.829,499,8.005,545,2.131,549,6.431,557,3.057,581,5.193,713,7.911,716,2.778,758,3.328,886,5.441,1090,9.333,1112,4.574,1116,9.416,1134,4.355,1169,3.521,1204,6.292,1256,6.926,1444,3.641,1511,5.601,1726,6.581,1743,9.333,1803,5.728,1811,5.601,2088,5.488,2251,7.116,2707,5.87,2979,10.299,3751,11.315,3759,9.591,4878,15.875,5396,7.116,5502,14.085,5503,7.695,5504,7.695,5505,7.695,5506,7.695,5507,7.695,5508,7.695,5509,7.695,5510,7.695,5511,7.695,5512,12.236,5513,7.695,5514,7.695,5515,12.236,5516,7.695,5517,7.695,5518,7.695,5519,7.695,5520,7.695,5521,7.695]],["keywords/995",[]],["title/996",[2751,1460.68]],["content/996",[4,1.556,20,6.726,23,3.045,40,5.732,116,6.201,148,8.661,164,4.716,173,8.927,177,7.722,184,3.257,205,6.22,220,7.064,240,3.353,265,5.402,301,3.423,315,4.891,330,4.804,373,3.873,425,5.402,520,6.797,716,5.422,751,12.28,1140,11.178,1339,6.726,1511,10.931,1526,10.923,1564,9.579,1648,10.509,2088,10.71,2560,9.848,2751,17.603,2886,10.324,3551,12.141,3606,13.886,3684,9.023,5016,12.141,5522,19.982]],["keywords/996",[]],["title/997",[4349,1328.96]],["content/997",[34,4.735,156,10.952,161,6.534,184,4.485,191,6.218,549,10.87,1116,10.28,1143,13.373,4349,14.751,5523,20.683]],["keywords/997",[]],["title/998",[3952,1506.563]],["content/998",[23,3.061,34,5.498,184,5.207,373,5.18,568,11.816,2241,15.32,3561,15.32,3952,16.238,5524,20.085,5525,20.085,5526,20.085]],["keywords/998",[]],["title/999",[468,852.533]],["content/999",[4,1.915,18,6.173,34,4.231,152,3.679,154,6.794,184,5.764,224,5.604,468,8.455,809,12.233,3092,16.992,3561,14.097,4349,13.18,5527,18.481,5528,18.481,5529,18.481]],["keywords/999",[]],["title/1000",[5530,1863.425]],["content/1000",[23,3.061,124,7.522,161,6.345,184,5.571,464,14.95,516,10.328,735,9.043,2783,12.202,4349,14.324,5531,20.085,5532,18.572]],["keywords/1000",[]],["title/1001",[5533,1863.425]],["content/1001",[23,3.249,124,7.983,161,6.735,184,4.623,3952,17.235,5532,19.713,5534,21.318]],["keywords/1001",[]],["title/1002",[171,353.369,241,503.001,5535,1251.356]],["content/1002",[5,2.144,23,4.224,25,0.661,32,3.786,34,3.413,37,1.668,44,2.766,54,4.317,88,3.406,152,3.562,164,3.119,171,3.892,184,4.852,193,3.98,220,3.511,224,5.425,229,5.572,230,3.138,240,2.218,241,6.651,246,3.138,301,2.264,347,9.801,381,3.205,652,7.137,827,10.996,886,6.391,1024,8.417,1075,7.394,1177,6.105,1309,7.013,1342,10.079,1347,9.271,1444,4.7,1961,5.905,2303,5.342,2502,4.937,3037,13.784,3174,10.079,3684,13.942,3951,6.951,4822,8.861,5535,13.784,5536,9.933,5537,19.884,5538,9.933,5539,9.933,5540,17.892,5541,9.933,5542,9.933]],["keywords/1002",[]],["title/1003",[5543,1723.121]],["content/1003",[23,3.836,30,7.275,32,3.272,51,3.7,121,9.291,124,5.791,152,3.079,155,4.609,184,4.941,281,8.835,373,3.988,425,5.563,427,5.684,706,7.896,912,12.634,1147,8.524,1332,8.317,1342,10.455,1787,12.121,2241,11.795,2705,12.959,2744,13.532,3758,12.671,3952,12.502,4040,10.292,4822,9.192,5543,14.299,5544,18.839,5545,15.463,5546,15.463,5547,15.463]],["keywords/1003",[]],["title/1004",[184,340.004,3367,755.218]],["content/1004",[6,2.393,18,4.44,25,0.884,45,3.771,49,6.253,88,4.558,152,4.532,162,4.699,184,4.574,220,6.502,224,4.03,230,4.199,297,5.218,315,4.329,347,9.703,364,7.207,398,4.978,438,4.978,516,6.835,545,3.682,569,9.026,572,4.748,580,9.703,771,5.326,809,6.564,886,4.748,1024,6.253,1111,9.138,1329,6.741,1966,9.302,2353,9.48,2900,8.847,3367,12.442,4480,9.894,4482,11.14,5303,11.14,5343,12.292,5548,13.292,5549,13.292,5550,13.292,5551,13.292,5552,13.292]],["keywords/1004",[]],["title/1005",[184,340.004,1024,737.602]],["content/1005",[5,4.099,6,1.838,25,1.263,40,7.247,63,4.164,184,5.033,205,4.933,220,6.712,240,4.239,329,8.461,347,8.734,356,8.831,514,6.806,1024,11.794,1189,11.808,3092,14.132]],["keywords/1005",[]],["title/1006",[25,89.993,315,440.762,650,780.453]],["content/1006",[4,1.759,5,3.665,14,6.381,97,5.959,107,4.17,181,5.767,185,5.228,240,3.79,263,13.724,310,7.684,315,5.529,405,8.729,452,7.852,568,9.986,632,9.986,1042,10.975,1151,10.975,1173,10.091,1610,13.461,1614,8.668,1634,15.435,1848,13.306,1961,10.091,2125,13.724,3173,15.697,3243,14.226,5553,16.975,5554,14.855]],["keywords/1006",[]],["title/1007",[69,331.64,184,230.384,224,322.118,246,335.617,1434,810.359]],["content/1007",[5,1.462,6,1.069,18,2.261,23,4.2,25,0.929,32,4.028,33,0.875,34,3.199,44,1.885,107,1.663,148,3.904,151,4.311,152,1.348,154,4.057,155,2.018,161,2.139,162,2.393,164,3.466,166,5.984,167,4.797,171,1.768,181,2.941,184,4.353,185,2.666,191,2.035,198,1.808,206,2.41,224,3.346,240,1.512,243,3.114,246,2.139,278,1.822,288,3.343,314,2.401,315,2.205,330,2.653,335,4.828,347,5.077,348,3.832,381,2.185,392,3.149,499,3.558,520,4.996,539,3.149,590,2.886,630,2.489,632,3.983,703,2.526,708,4.263,716,5.044,736,2.535,737,2.276,771,2.712,809,3.343,876,6.864,886,3.942,914,3.185,957,4.113,1024,5.192,1039,5.164,1134,3.832,1141,4.439,1170,3.457,1173,4.024,1268,3.506,1325,4.377,1342,4.577,1347,4.21,1366,9.658,1388,4.318,1392,5.473,1589,5.039,1610,4.21,1634,4.828,1646,4.506,1663,3.764,1697,3.832,1798,5.674,1850,15.44,1920,6.26,1931,4.263,2515,5.039,2714,4.654,2783,4.113,2809,6.26,3243,13.506,3790,7.723,4822,8.305,4899,5.924,5554,12.227,5555,11.037,5556,6.77,5557,13.972,5558,6.77,5559,11.037,5560,6.77,5561,6.77,5562,11.037,5563,11.037,5564,6.77,5565,6.77,5566,6.77,5567,16.115,5568,11.037,5569,6.77,5570,6.77,5571,6.77,5572,6.77,5573,6.77,5574,11.037,5575,6.77,5576,6.77,5577,6.77,5578,6.77,5579,6.77,5580,6.77]],["keywords/1007",[]],["title/1008",[315,387.69,1850,848.901,5581,1190.303,5582,1190.303]],["content/1008",[18,7.267,33,2.213,44,4.765,65,5.609,161,5.407,166,9.279,177,8.8,184,4.718,185,4.134,301,3.901,310,7.747,379,7.83,385,6.268,401,7.666,474,9.87,520,7.747,569,8.398,648,10.777,716,6.179,1042,11.066,1204,8.8,1366,14.977,1850,15.516,2714,11.766,3243,14.343,3684,10.283,5583,17.115,5584,17.115]],["keywords/1008",[]],["title/1009",[107,235.629,182,191.399,185,231.733,315,312.447,650,553.247,667,731.722]],["content/1009",[6,1.025,18,5.222,19,3.174,37,1.778,44,4.353,65,3.471,70,5.004,88,3.631,92,6.665,107,2.601,114,4.545,134,5.994,162,5.526,164,3.325,171,2.765,181,2.822,184,4.968,185,3.777,186,3.13,190,7.313,191,4.7,198,2.829,203,5.37,246,3.345,264,4.532,272,4.515,278,2.851,315,3.449,348,5.994,392,4.926,393,5.696,396,3.46,397,6.755,452,4.898,484,5.94,564,4.898,575,9.792,581,4.494,693,7.002,716,5.644,718,4.297,719,7.28,740,4.926,861,4.926,886,3.783,893,4.453,923,6.944,971,6.295,1037,7.552,1119,6.107,1134,5.994,1143,6.847,1156,11.925,1160,5.37,1192,6.586,1268,5.484,1325,6.847,1595,6.586,1610,6.586,1729,8.077,1765,6.755,1846,7.709,1850,7.552,1856,7.709,1926,7.41,1984,6.755,2018,8.301,2134,8.875,2138,9.267,2525,9.267,2588,7.709,2708,8.301,2717,8.077,2783,6.434,3162,9.792,3274,8.875,4349,7.552,4595,8.875,5228,9.792,5554,9.267,5585,9.792,5586,10.59,5587,10.59,5588,10.59,5589,10.59,5590,10.59]],["keywords/1009",[]],["title/1010",[3769,1421.376]],["content/1010",[79,9.371,111,6.677,131,8.974,164,5.557,166,9.594,184,4.819,301,4.033,373,4.564,463,12.621,598,16.423,711,7.51,1024,8.325,1309,10.453,1377,8.278,1588,13.871,1902,10.875,2344,14.307,3274,18.622,5591,22.22,5592,17.696,5593,17.696]],["keywords/1010",[]],["title/1011",[152,312.153,185,378.748]],["content/1011",[]],["keywords/1011",[]],["title/1012",[45,337.67,111,449.151,152,236.98,185,287.538]],["content/1012",[22,6.091,23,3.98,25,1.263,45,5.386,111,7.164,152,4.991,185,5.607,438,7.11,3726,12.111,5594,18.986,5595,18.986,5596,18.986]],["keywords/1012",[]],["title/1013",[45,337.67,447,759.279,843,538.773,1276,630.307]],["content/1013",[5,4.796,14,6.65,23,3.882,24,4.339,32,2.66,33,2.647,34,2.878,35,3.605,36,9.229,37,2.97,45,3.566,62,5.385,63,2.757,68,6.606,124,8.32,136,7.25,152,4.835,171,4.62,185,5.867,198,4.726,224,5.364,381,4.056,391,6.331,427,4.621,447,13.058,600,9.515,765,4.12,776,5.983,782,7.395,786,5.385,843,9.266,1276,6.657,1617,6.558,2495,7.916,4320,20.543,5597,12.57]],["keywords/1013",[]],["title/1014",[5598,1863.425]],["content/1014",[4,1.512,6,1.898,23,4.211,32,4.149,33,2.535,34,4.489,88,5.005,152,4.408,161,4.611,162,5.16,185,5.348,198,3.899,224,4.426,549,7.671,771,8.87,1116,7.255,1169,6.678,1204,7.506,1796,8.868,2927,12.346,3778,11.78,3781,12.506,4741,11.134,5599,16.431,5600,14.596,5601,14.596]],["keywords/1014",[]],["title/1015",[5602,1863.425]],["content/1015",[6,1.713,23,4.082,32,3.745,33,2.288,34,4.052,152,3.523,161,5.59,185,4.275,198,4.727,224,5.366,549,9.3,771,7.09,1116,8.796,1169,10.166,2058,11.288,2927,11.143,3778,10.633,3781,11.288,4741,13.498,5599,14.831,5603,17.696]],["keywords/1015",[]],["title/1016",[5604,1630.706]],["content/1016",[23,3.032,32,4.21,34,4.555,161,6.284,549,10.455,642,8.91,771,7.97,1116,9.888,1169,9.101,4442,12.862,4741,18.212,5599,16.672,5605,18.395]],["keywords/1016",[]],["title/1017",[5604,1630.706]],["content/1017",[23,3.98,32,4.018,152,3.78,161,5.998,164,7.289,183,5.98,360,10.846,734,9.563,1169,8.686,4442,15.007,4741,14.482,5604,16.615,5606,18.986,5607,18.986]],["keywords/1017",[]],["title/1018",[4741,1421.376]],["content/1018",[6,2.198,23,4.271,32,4.804,34,4.641,46,6.562,64,6.983,68,5.427,87,6.363,152,3.646,164,3.243,177,5.31,183,3.253,185,2.495,223,5.31,272,4.403,280,6.588,300,8.459,319,4.602,330,2.483,468,4.725,581,4.383,630,5.641,737,3.472,765,3.385,771,4.138,773,7.216,1278,5.1,2927,6.503,2942,8.095,3042,9.55,3629,7.517,3778,14.122,3781,11.681,4741,7.877,5335,8.655,5599,12.861,5605,9.55,5608,15.345,5609,15.345,5610,10.327,5611,10.327,5612,10.327,5613,15.345,5614,8.655,5615,10.327,5616,10.327,5617,10.327]],["keywords/1018",[]],["title/1019",[2377,1356.449]],["content/1019",[]],["keywords/1019",[]],["title/1020",[198,418.827,2377,1141.31]],["content/1020",[4,1.898,6,1.279,7,4.123,12,7.33,18,6.117,23,4.082,32,3.876,34,4.193,65,6.002,151,4.075,152,2.63,164,4.148,167,5.74,193,5.292,198,3.528,224,5.553,230,5.785,234,6.109,366,8.821,413,6.84,510,6.698,771,5.292,806,10.126,1276,9.698,1309,8.615,2203,13.786,2207,12.214,2216,15.416,2245,16.035,2249,10.353,3684,7.936,5618,13.208,5619,13.208,5620,13.208,5621,13.208]],["keywords/1020",[]],["title/1021",[4,140.222,67,544.489,2377,985.073]],["content/1021",[4,2.081,6,2.325,45,5.698,65,6.583,97,7.051,185,4.852,202,6.178,499,10.556,1560,13.808,1963,16.832,2377,14.62,5622,20.085]],["keywords/1021",[]],["title/1022",[6,92.877,60,357.9,166,520.104,184,208.027,389,493.273,5623,839.484]],["content/1022",[14,5.944,19,3.224,23,4.037,32,3.968,34,4.733,44,2.994,60,5.899,62,4.607,67,4.327,69,3.357,111,4.058,152,3.733,162,3.801,164,4.965,167,4.674,171,2.808,184,3.429,185,3.82,191,3.233,224,3.261,230,3.397,272,4.585,273,3.467,278,2.895,373,2.773,374,8.694,468,4.92,773,6.231,805,7.052,806,9.032,894,4.121,963,4.153,1086,6.953,1141,7.052,1175,14.504,1309,5.059,1402,7.828,1479,8.869,1614,10.556,2031,7.669,2043,7.828,2203,7.052,2216,6.953,2245,8.203,2249,8.429,2303,5.784,2377,7.828,2489,15.049,2779,6.609,5624,9.411,5625,10.754,5626,10.754,5627,9.944,5628,9.944,5629,10.754,5630,10.754,5631,9.944,5632,9.944,5633,10.754,5634,9.944,5635,10.754,5636,10.754]],["keywords/1022",[]],["title/1023",[1327,722.133,4038,1007.258,5623,1184.242]],["content/1023",[6,1.21,23,4.186,32,4.689,34,5.073,45,3.545,60,4.662,111,4.715,162,4.417,164,5.532,167,5.43,273,2.74,373,3.222,468,5.717,580,5.748,631,7.277,806,9.828,936,6.211,963,6.804,1309,5.878,1327,9.401,1614,8.995,2192,16.497,2203,8.194,2216,11.39,2245,9.531,2249,9.795,2303,6.72,2489,12.824,2779,7.679,4038,13.112,5624,10.935,5627,11.554,5628,11.554,5631,11.554,5632,11.554,5634,11.554,5637,12.495,5638,12.495,5639,12.495,5640,12.495,5641,12.495,5642,12.495,5643,12.495,5644,12.495]],["keywords/1023",[]],["title/1024",[6,92.877,114,278.869,152,190.987,366,462.071,2714,659.493,5623,839.484]],["content/1024",[4,1.481,6,2.272,23,4.103,32,4.966,34,5.373,152,4.361,155,4.261,164,4.489,167,6.213,224,4.335,240,3.192,520,6.471,716,5.161,741,8.685,771,5.728,806,10.552,910,5.752,1309,6.725,1359,10.904,2203,9.375,2216,12.5,2245,10.904,2249,15.155,2714,13.291,5624,12.51,5645,14.296,5646,14.296,5647,19.333,5648,14.296]],["keywords/1024",[]],["title/1025",[901,598.491,2377,1141.31]],["content/1025",[]],["keywords/1025",[]],["title/1026",[5649,1723.121]],["content/1026",[12,7.003,34,5.881,152,3.999,373,5.18,448,16.238,549,10.556,1116,9.983,2216,15.526,3770,14.95,5650,20.085]],["keywords/1026",[]],["title/1027",[1726,1002.228]],["content/1027",[34,4.599,154,7.383,425,7.225,843,9.091,1134,11.368,1251,14.62,1276,10.636,1633,11.474,1726,10.802,2216,15.526,2783,12.202,5651,20.085]],["keywords/1027",[]],["title/1028",[468,852.533]],["content/1028",[5,4.295,12,6.936,34,4.555,152,3.961,366,9.582,468,9.101,886,7.106,1272,14.481,2216,15.437,2227,17.408,3092,14.807,4043,17.408,5652,19.893]],["keywords/1028",[]],["title/1029",[4,140.222,754,1060.767,2377,985.073]],["content/1029",[]],["keywords/1029",[]],["title/1030",[1309,636.63,2216,874.956,5653,1251.356]],["content/1030",[7,5.669,9,8.308,12,6.332,51,4.345,70,4.428,88,6.226,151,5.602,191,5.459,281,7.041,301,4.139,373,4.683,452,8.399,459,13.851,543,6.725,592,11.032,650,10.473,663,10.01,886,6.487,1309,8.543,1332,9.767,1726,9.767,2216,11.741,3715,11.741,5653,16.792]],["keywords/1030",[]],["title/1031",[1309,636.63,1796,822.159,2216,874.956]],["content/1031",[53,7.539,125,7.062,278,4.804,361,12.53,373,4.603,455,8.545,584,12.068,785,5.443,1134,10.102,1309,11.472,1377,8.349,1548,11.385,1628,10.5,1697,10.102,1796,13.572,1803,13.285,1811,12.992,2197,13.99,2216,14.444,2893,16.504,5654,17.848]],["keywords/1031",[]],["title/1032",[131,538.737,711,450.843,889,718.317,1309,499.793,1633,606.904]],["content/1032",[53,7.738,107,4.5,131,9.289,148,10.565,181,6.05,182,3.655,205,4.76,224,6.884,230,5.787,373,4.724,375,9.556,464,13.635,499,11.932,674,8.316,711,7.774,1134,10.368,1309,10.681,2245,13.973]],["keywords/1032",[]],["title/1033",[230,303.048,499,504.155,674,351.353,1385,803.95,2216,620.238,5655,959.288]],["content/1033",[4,1.029,6,1.443,9,4.545,12,3.464,19,2.978,23,4.185,32,3.155,34,4.553,53,6.296,69,3.101,72,4.728,88,3.406,89,11.267,98,9.127,122,4.36,147,6.336,154,3.651,164,4.681,167,6.478,183,3.129,219,3.692,224,4.52,230,4.709,246,3.138,273,2.178,299,6.178,315,3.235,361,8.361,373,2.562,499,9.403,650,5.729,656,5.905,674,6.553,716,5.382,717,4.756,806,4.785,1000,5.342,1035,6.035,1298,5.968,1309,8.417,1552,6.829,1961,5.905,2117,6.514,2203,9.775,2216,15.003,2245,13.648,2692,6.951,5649,13.784,5656,9.933,5657,9.933,5658,17.892,5659,9.933,5660,9.933,5661,9.933,5662,9.933,5663,9.933,5664,9.933,5665,9.933,5666,9.933,5667,9.933,5668,9.933]],["keywords/1033",[]],["title/1034",[1278,920.243]],["content/1034",[]],["keywords/1034",[]],["title/1035",[787,903.071]],["content/1035",[23,3.032,34,4.555,35,5.705,151,6.137,152,3.961,154,7.313,224,6.032,787,11.571,3320,15.593,3778,11.953,3781,12.689,4515,12.372,4663,16.083]],["keywords/1035",[]],["title/1036",[642,834.662]],["content/1036",[23,3.557,32,4.055,34,4.387,151,5.911,152,4.647,154,7.044,224,5.81,600,10.306,642,11.274,806,9.229,861,8.912,3320,15.02,4165,13.408,5669,19.161]],["keywords/1036",[]],["title/1037",[151,574.895]],["content/1037",[]],["keywords/1037",[]],["title/1038",[]],["content/1038",[23,3.955,32,4.858,35,7.132,152,3.712,161,7.252,425,6.708,458,8.673,480,6.708,736,6.983,737,7.717,1690,13.298,5670,17.243,5671,16.318]],["keywords/1038",[]],["title/1039",[]],["content/1039",[23,4.111,34,3.489,35,4.369,151,4.701,152,3.034,161,4.813,164,6.336,183,4.799,301,3.473,330,3.663,407,7.43,545,4.22,557,8.987,656,11.993,716,5.501,734,7.674,735,6.861,1268,7.891,1425,16.909,2303,8.195,3855,13.334,5671,13.334,5672,24.078,5673,15.237,5674,20.176,5675,15.237,5676,20.176,5677,15.237]],["keywords/1039",[]],["title/1040",[3629,1356.449]],["content/1040",[4,1.602,23,4.123,34,3.54,35,6.534,87,5.373,151,4.771,164,7.155,183,4.87,381,4.99,496,6.248,557,8.095,584,10.455,772,6.414,1278,7.636,1423,13.532,1424,13.532,1425,12.959,1986,9.998,2206,11.51,3855,17.829,4684,12.502,4766,13.532,5670,14.299,5671,13.532,5678,15.463,5679,15.463,5680,15.463,5681,15.463,5682,18.839]],["keywords/1040",[]],["title/1041",[545,516.138]],["content/1041",[22,5.219,23,4.246,25,0.992,34,3.414,45,4.23,110,6.577,111,5.626,114,5.781,152,2.968,171,5.193,274,9.64,458,6.935,545,6.198,673,7.778,975,10.696,1300,9.148,1444,7.055,2927,12.523,3726,9.511,3865,13.048,3867,11.373,4956,14.476,5683,14.91,5684,13.787,5685,13.787,5686,13.787,5687,14.91]],["keywords/1041",[]],["title/1042",[1114,951.488]],["content/1042",[6,2.085,23,4.097,32,3.563,34,3.855,114,4.895,151,5.195,152,3.352,161,6.802,162,5.952,164,5.288,451,10.348,545,4.664,557,6.69,1268,8.72,1300,7.746,5688,16.838,5689,21.531,5690,21.531,5691,16.838,5692,21.531,5693,16.838,5694,15.57]],["keywords/1042",[]],["title/1043",[744,1386.998]],["content/1043",[6,1.805,23,3.79,34,4.269,35,5.347,152,3.712,171,4.869,272,7.95,280,14.642,468,8.531,975,10.029,2058,11.894,2303,10.029,2953,15.053,5682,21.226,5694,17.243,5695,18.646]],["keywords/1043",[]],["title/1044",[225,426.689,901,454.363,1298,715.187,2671,780.572]],["content/1044",[4,1.889,18,4.384,23,4.17,25,0.873,34,5.183,152,2.613,161,4.146,164,4.122,186,5.389,223,6.749,225,4.705,271,4.656,277,7.569,279,7.802,330,4.384,381,4.235,468,6.005,501,6.749,516,6.749,545,3.635,673,6.847,744,9.769,775,8.73,901,5.01,975,12.176,993,6.322,1114,6.702,1177,8.066,1268,6.797,1278,6.482,1300,9.638,1377,6.139,2089,8.607,2381,9.554,2671,8.607,3867,10.011,5348,11,5696,13.125,5697,13.125,5698,15.956,5699,12.137,5700,13.125]],["keywords/1044",[]],["title/1045",[5701,1863.425]],["content/1045",[18,5.861,23,4.074,32,5.12,34,5.06,124,6.571,134,9.932,161,5.543,164,5.51,975,9.438,1177,10.784,1278,8.666,1526,9.592,3876,14.187,5699,16.226,5702,17.547,5703,17.547,5704,22.102,5705,17.547,5706,17.547]],["keywords/1045",[]],["title/1046",[23,238.957,183,493.826]],["content/1046",[18,6.645,23,3.032,154,7.313,161,6.284,164,6.247,183,6.266,722,10.02,1268,10.302,1278,9.824,3876,16.083,4820,18.395,5707,19.893,5708,19.893,5709,19.893]],["keywords/1046",[]],["title/1047",[468,852.533]],["content/1047",[4,1.967,5,4.099,45,5.386,152,4.991,161,5.998,171,4.958,224,5.757,273,4.164,468,8.686,582,10.65,1134,10.746,1814,11.956,2502,9.437,3748,18.194,5710,18.986,5711,16.615]],["keywords/1047",[]],["title/1048",[468,486.049,545,294.262,736,397.855,785,323.976,2031,757.671]],["content/1048",[4,1.932,6,1.312,14,7.007,19,5.588,23,4.013,34,4.268,88,6.392,124,6.981,152,4.242,155,4.039,161,4.281,162,4.79,164,4.256,171,5.993,184,2.939,330,3.258,455,6.488,468,9.749,545,3.754,557,5.385,737,4.556,785,6.498,807,10.957,809,6.692,1086,8.762,1114,9.518,1300,6.234,1889,11.738,1993,9.163,2031,9.665,3887,12.815,4102,11.357,5459,17.238,5712,13.552,5713,13.552,5714,13.552]],["keywords/1048",[]],["title/1049",[809,920.243]],["content/1049",[18,6.119,23,3.931,34,4.194,122,8.04,124,6.86,164,5.752,557,7.279,734,9.227,809,9.047,1065,10.777,1257,8.381,1278,9.047,1345,11.393,4442,11.844,5711,16.031,5715,22.704,5716,18.319,5717,22.704]],["keywords/1049",[]],["title/1050",[809,920.243]],["content/1050",[23,3.681,34,4.643,124,7.595,557,8.058,809,10.015,1257,9.278,1268,10.503,4684,16.396,5711,17.747,5718,24.152]],["keywords/1050",[]],["title/1051",[5614,1561.679]],["content/1051",[4,1.395,6,1.304,23,4.131,32,3.927,124,5.042,161,5.863,171,3.516,217,7.586,277,7.765,381,4.345,510,6.828,515,6.649,572,6.629,737,4.527,809,6.649,975,7.242,1114,6.875,1257,6.16,1300,6.194,2378,11.783,2560,8.829,2900,8.962,2979,9.104,3367,6.485,3887,9.256,4365,11.783,4482,11.284,4515,11.542,4955,15.553,4956,13.509,5373,16.24,5719,11.783,5720,12.45,5721,13.464,5722,18.558,5723,18.558,5724,18.558,5725,13.464,5726,13.464,5727,13.464,5728,13.464]],["keywords/1051",[]],["title/1052",[5720,1723.121]],["content/1052",[4,1.626,9,7.181,23,3.498,32,3.322,63,3.442,88,5.382,152,4.096,161,6.5,217,5.607,425,5.647,427,7.563,451,12.644,482,8.58,500,10.984,572,5.607,714,10.447,880,15.693,901,8.761,1272,11.426,1278,10.16,1444,7.427,2719,17.243,2768,10.984,3058,11.973,3823,16.127,5614,13.154,5729,15.696,5730,15.696,5731,15.696,5732,15.696]],["keywords/1052",[]],["title/1053",[5733,1863.425]],["content/1053",[23,3.121,32,4.334,124,7.669,161,7.674,427,7.528,572,7.316,1257,9.37,1278,10.114,2303,11.015,5734,20.48]],["keywords/1053",[]],["title/1054",[4165,1303.973]],["content/1054",[]],["keywords/1054",[]],["title/1055",[642,834.662]],["content/1055",[23,4.105,32,3.592,152,3.38,154,6.24,164,5.331,171,4.433,198,4.535,223,8.729,224,5.147,273,4.746,481,9.358,493,10.557,543,6.286,642,10.673,787,8.227,804,10.489,975,9.13,1479,9.522,3174,11.478,4165,11.879,4652,15.145]],["keywords/1055",[]],["title/1056",[800,1303.973]],["content/1056",[23,4.228,32,4.752,35,4.306,152,2.99,171,3.921,246,6.313,273,5.25,341,8.927,543,5.561,556,5.364,642,10.059,736,5.624,800,15.715,804,9.684,818,11.178,975,8.077,1278,7.416,1417,8.209,2768,13.983,3174,13.511,4442,9.71,5735,15.017,5736,15.017]],["keywords/1056",[]],["title/1057",[805,1221.989]],["content/1057",[23,3.938,32,4.966,34,5.016,152,3.849,154,5.255,155,4.261,161,4.516,164,4.489,171,3.733,186,4.226,228,6.244,273,4.804,278,5.204,300,7.881,349,9.243,543,7.159,549,7.513,552,7.513,630,7.107,800,10.004,806,6.886,974,9.119,1116,7.106,1169,6.54,1278,9.548,1796,8.685,3357,16.919,4442,9.243,4561,13.219,4662,11.981,5737,12.51,5738,14.296,5739,19.333,5740,14.296,5741,14.296]],["keywords/1057",[]],["title/1058",[23,238.957,183,493.826]],["content/1058",[4,1.404,18,4.527,23,4.19,32,3.945,33,1.752,34,3.103,88,4.647,154,4.982,162,4.79,164,6.691,171,3.539,228,8.141,246,4.281,273,4.088,360,7.742,368,8.534,402,7.816,483,7.289,538,6.736,543,8.911,544,5.056,557,5.385,734,6.826,757,8.762,787,6.568,974,8.645,977,11.357,978,11.357,979,10.957,980,11.357,1147,7.47,1268,7.018,1320,7.289,1332,7.289,1579,10.957,1826,10.337,2783,8.233,4663,10.957,5742,13.552,5743,13.552,5744,13.552]],["keywords/1058",[]],["title/1059",[545,516.138]],["content/1059",[4,1.579,22,3.999,23,4.237,32,3.225,34,3.489,44,4.243,45,4.322,111,5.75,152,3.034,164,4.785,273,4.424,349,9.852,373,3.929,543,5.643,545,6.265,673,7.949,804,7.384,901,5.816,974,9.719,975,12.166,1278,7.525,1300,9.281,3867,11.622,4652,10.662,5684,14.09,5685,14.09,5686,14.09,5745,15.237]],["keywords/1059",[]],["title/1060",[23,206.245,744,1007.258,5746,1251.356]],["content/1060",[23,4.176,32,3.682,34,3.984,151,5.368,164,5.464,171,4.544,273,4.821,349,11.25,373,4.487,543,6.444,804,8.433,974,11.1,975,12.963,1278,8.593,4455,19.24,4652,12.176,5747,17.4,5748,17.4]],["keywords/1060",[]],["title/1061",[23,206.245,1114,690.985,5749,1251.356]],["content/1061",[23,4.23,32,3.452,34,3.734,151,5.032,152,3.247,161,5.153,164,6.624,273,4.626,349,10.546,373,4.206,543,6.04,673,8.509,804,7.905,974,10.404,975,11.346,1278,8.055,1300,9.704,2381,11.873,4652,11.414,5698,18.461,5750,16.311,5751,16.311]],["keywords/1061",[]],["title/1062",[23,206.245,468,619.122,5752,1353.247]],["content/1062",[23,4.178,32,4.51,34,3.794,152,4.951,161,5.235,224,5.024,273,3.634,349,10.714,468,7.581,549,8.708,600,8.912,804,8.03,809,10.524,955,9.556,974,10.57,975,11.462,1116,8.236,4652,14.913,5753,16.57,5754,16.57]],["keywords/1062",[]],["title/1063",[5755,1863.425]],["content/1063",[6,1.52,23,4.254,32,3.322,124,7.705,152,3.125,161,4.959,164,7.65,273,3.442,771,6.289,804,9.971,942,9.431,974,13.124,975,12.344,1257,7.181,2228,11.973,2303,8.442,2927,9.884,4652,10.984,5756,15.696,5757,15.696,5758,20.574]],["keywords/1063",[]],["title/1064",[45,383.895,273,296.762,5116,1184.242]],["content/1064",[4,2.396,22,5.453,23,4.102,25,1.06,32,4.397,34,3.649,45,5.895,111,6.013,273,5.573,407,7.771,543,5.902,901,7.932,2508,16.8,3726,10.166,4662,13.356,5116,20.234,5759,15.936,5760,15.936,5761,15.936,5762,14.736]],["keywords/1064",[]],["title/1065",[19,469.995,273,343.83]],["content/1065",[4,1.852,19,4.868,23,4.206,25,1.08,33,1.442,35,5.788,46,2.22,60,2.559,63,1.504,67,2.76,76,4.077,122,3.01,152,2.807,155,2.044,161,3.524,164,5.612,170,6.002,172,3.956,174,8.38,193,2.748,228,4.872,229,3.847,230,2.167,273,4.613,274,4.435,280,4.375,328,5.545,341,9.654,385,4.086,396,2.241,417,3.088,427,4.101,451,4.215,454,4.435,467,3.943,479,4.121,496,2.771,514,2.459,556,3.985,572,2.45,587,4.375,642,6.315,674,2.512,773,2.703,787,5.406,804,7.871,806,6.791,857,7.249,942,6.702,974,10.36,981,3.918,982,3.66,993,3.304,1030,3.366,1169,5.103,1257,3.138,1327,5.953,1351,5.105,1417,6.098,1548,4.375,1641,8.12,1646,4.565,1946,9.019,2049,4.435,2301,4.375,2321,10.227,2502,3.409,2508,9.019,2568,11.365,2677,7.806,2979,4.638,3490,5.376,3778,13.069,3920,6.342,4173,13.037,4174,6.002,4639,6.342,4807,5.376,5763,6.859,5764,17.87,5765,17.87,5766,6.859,5767,6.859,5768,6.859,5769,6.859,5770,6.342,5771,6.859]],["keywords/1065",[]],["title/1066",[60,504.882,92,576.973,171,353.369]],["content/1066",[4,2.087,23,4.124,32,2.582,54,5.303,60,8.638,63,3.799,134,6.907,152,2.429,156,6.462,164,3.832,177,8.908,186,3.607,187,7.499,196,3.798,246,3.855,273,5.425,373,3.147,381,3.938,408,4.037,512,7.091,514,4.374,539,5.676,800,8.539,804,5.914,975,12.453,1086,7.89,1540,7.589,1547,8.122,1571,8.25,1641,8.882,1667,10.226,1724,7.89,2079,6.971,2178,8.539,2228,9.308,2589,7.499,3174,8.25,4636,15.16,4651,20.273,4652,12.122,4653,11.284,4654,11.284,4655,10.678]],["keywords/1066",[]],["title/1067",[1552,1281.072]],["content/1067",[4,1.653,6,1.545,14,2.095,23,4.272,24,1.924,32,4.09,33,1.574,34,2.788,35,1.598,36,2.908,37,0.936,40,2.128,44,2.616,49,2.622,60,6.453,62,4.024,63,3.499,65,3.079,68,2.93,86,4.92,88,1.911,92,4.005,122,2.447,124,3.518,152,3.664,164,5.432,171,3.732,183,2.959,198,1.489,223,7.349,273,5.211,329,2.484,334,1.607,364,3.022,373,4.461,375,2.908,381,1.799,396,3.069,398,2.087,401,2.497,408,1.844,490,3.733,516,4.831,519,5.053,520,6.469,543,4.509,561,2.622,582,6.829,590,2.377,694,4.669,703,2.08,765,3.079,785,3.713,804,8.918,805,3.655,811,4.149,858,4.732,879,3.657,942,5.644,974,5.992,975,9.303,1219,2.685,1377,4.394,1526,3.047,1552,15.653,1796,5.707,2079,3.184,2228,4.252,2353,3.975,2389,4.672,2568,10,2927,7.667,3114,4.058,3126,5.154,3919,4.058,4170,5.154,4652,3.901,4662,4.672,5772,12.175,5773,5.574,5774,5.574,5775,9.394,5776,5.574,5777,5.574,5778,5.574,5779,5.574,5780,5.574,5781,5.574,5782,4.878,5783,5.154]],["keywords/1067",[]],["title/1068",[5782,1630.706]],["content/1068",[5,3.29,6,1.475,14,7.584,25,1.013,30,7.168,33,1.97,37,2.558,44,4.243,60,5.685,63,3.341,67,6.131,73,7.78,124,5.706,152,4.503,171,3.979,198,4.07,219,5.664,228,6.655,273,3.341,289,7.087,373,5.203,378,9.155,381,4.917,382,7.835,385,5.581,396,4.978,408,5.041,516,7.835,543,5.643,561,7.168,582,8.547,652,7.295,1028,8.787,1339,6.825,1552,15.551,1633,8.704,2079,8.704,2253,7.21,2254,8.624,5782,13.334]],["keywords/1068",[]],["title/1069",[5719,1372.068,5784,1449.827]],["content/1069",[9,5.786,19,3.791,23,3.809,25,0.841,32,4.714,33,1.635,34,4.068,35,3.627,63,2.773,151,3.902,152,3.537,161,3.995,162,6.28,198,4.746,246,3.995,272,5.392,273,2.773,284,4.486,287,6.286,301,2.882,330,5.356,341,10.561,373,3.262,381,4.081,407,6.167,543,8.69,572,7.336,737,4.252,740,5.882,1114,6.458,1272,9.206,1315,7.964,2741,9.647,2779,7.772,4165,15.588,4233,11.695,5719,11.067,5737,15.548,5762,11.695,5784,16.429,5785,12.647,5786,17.767,5787,12.647,5788,12.647,5789,12.647]],["keywords/1069",[]],["title/1070",[5790,1863.425]],["content/1070",[23,3.121,32,4.334,124,7.669,161,7.674,427,7.528,572,7.316,1257,9.37,2303,11.015,4165,14.331,5791,20.48]],["keywords/1070",[]],["title/1071",[310,709.677,2628,1195.939]],["content/1071",[4,2.022,25,0.964,33,1.874,46,4.692,60,5.408,62,6.209,63,3.179,85,6.982,86,5.857,114,4.214,125,5.735,183,4.565,189,7.401,217,5.178,260,7.507,273,5.686,274,12.617,300,7.99,373,3.738,385,5.309,414,5.666,417,8.786,421,7.507,433,10.551,484,8.13,512,5.933,514,5.196,561,6.819,921,7.507,963,5.598,981,8.28,982,7.735,1030,7.113,1081,8.908,1183,7.99,1326,8.908,2781,10.789,4655,12.685,4807,17.293,5792,14.495,5793,14.495,5794,14.495]],["keywords/1071",[]],["title/1072",[3769,1421.376]],["content/1072",[2,2.009,3,4.264,4,0.568,5,2.598,6,1.661,7,2.893,12,1.913,19,1.645,23,3.607,25,1.507,30,2.581,32,2.547,33,1.199,34,1.256,35,2.658,37,2.02,44,3.939,49,2.581,52,1.512,58,2.009,60,2.047,63,3.467,65,1.798,67,7.349,69,2.893,88,4.126,92,2.339,96,3.105,125,6.256,152,3.636,156,2.905,161,2.928,182,1.849,192,1.844,202,1.688,204,2.596,205,3.127,206,4.284,217,1.96,219,2.039,220,1.939,224,4.289,228,2.396,273,4.879,291,2.627,293,2.595,297,4.866,310,2.483,322,2.017,373,2.39,375,4.835,381,2.991,385,2.009,398,2.055,405,2.821,438,2.055,452,4.287,455,2.627,467,1.939,496,2.217,501,2.821,512,2.246,515,2.709,520,4.195,536,3.178,537,1.798,543,4.457,554,2.627,559,7.677,561,2.581,569,2.692,577,3.412,614,6.118,630,2.017,631,3.195,633,4.435,637,3.134,639,2.611,650,3.164,664,2.745,670,3.077,693,2.457,703,3.458,714,3.652,732,1.919,737,6.14,738,7.781,762,4.083,804,4.492,864,3.598,901,3.538,911,3.5,918,3.105,926,2.801,937,2.396,940,3.333,943,2.883,963,3.58,974,5.912,1000,2.951,1042,7.781,1049,3.372,1112,3.261,1113,3.994,1141,3.598,1325,3.547,1327,9.154,1329,6.103,1558,3.372,1560,8.274,1631,3.105,1632,3.839,1633,5.295,1641,3.994,1735,5.073,1931,3.455,2032,4.435,2079,3.134,2112,3.598,2239,3.994,2288,3.709,2459,4.435,2542,3.994,2568,9.899,2900,6.169,3550,5.073,3592,4.083,5770,16.889,5795,5.486,5796,5.486,5797,9.269,5798,5.486,5799,14.145,5800,14.145,5801,9.269,5802,5.486]],["keywords/1072",[]],["title/1073",[4614,1723.121]],["content/1073",[]],["keywords/1073",[]],["title/1074",[19,558.59]],["content/1074",[4,0.854,5,2.789,9,5.91,19,2.471,23,4.172,35,3.705,60,3.075,124,5.966,171,3.373,219,3.064,224,2.499,271,2.924,334,4.593,440,3.813,474,4.754,480,4.647,556,2.945,569,4.045,572,2.945,580,3.792,590,3.515,600,4.433,642,3.692,736,3.087,737,6.063,758,6.89,765,4.234,768,4.709,770,4.071,772,3.419,773,3.248,774,4.506,775,6.185,879,3.209,1219,6.223,1258,7.214,1283,15.113,1285,11.946,1320,6.948,1416,11.946,1417,4.506,1479,4.624,1518,7.622,1712,5.768,1713,4.469,1900,6.136,1991,6.461,2358,6.664,2359,6.664,2360,19.122,2361,10.827,2362,10.445,2363,15.113,2364,6.908,2366,7.622,2367,7.622,2368,14.731,2374,7.214,2953,8.472,3170,6.288,3227,6.461,3367,3.971,5803,8.243,5804,7.622,5805,8.243,5806,8.243,5807,8.243,5808,8.243,5809,8.243,5810,8.243,5811,8.243,5812,8.243,5813,8.243,5814,8.243,5815,8.243,5816,8.243,5817,8.243,5818,8.243,5819,12.919,5820,12.919,5821,12.919,5822,8.243,5823,8.243,5824,8.243,5825,8.243,5826,8.243,5827,8.243,5828,8.243,5829,12.919,5830,8.243]],["keywords/1074",[]],["title/1075",[198,361.493,224,410.309,765,443.523]],["content/1075",[23,4.083,34,4.689,765,6.712,768,13.878,2495,12.896,5831,20.48,5832,20.48]],["keywords/1075",[]],["title/1076",[271,661.001]],["content/1076",[198,5.365,224,6.09,271,8.518,293,5.622,737,6.753,758,10.386,765,6.583,886,7.174,1219,9.674,2496,14.62,2583,15.744]],["keywords/1076",[]],["title/1077",[770,920.243]],["content/1077",[4,1.985,152,3.815,224,5.81,249,10.845,334,5.525,474,11.051,556,8.337,557,7.613,580,8.814,737,6.442,770,9.463,772,7.948,773,7.551,1417,12.759,3170,14.616,4222,15.491]],["keywords/1077",[]],["title/1078",[556,483.395,1417,739.744,3490,1060.767]],["content/1078",[4,1.778,5,2.001,6,0.898,23,4.236,25,0.616,32,3.631,34,2.122,69,2.894,124,5.298,152,2.817,171,4.48,198,3.779,271,3.288,334,2.673,438,3.472,556,6.857,557,3.683,572,3.311,590,3.952,600,7.609,630,7.057,642,6.337,737,5.768,758,4.009,765,3.038,767,5.296,770,6.986,771,8.73,772,5.868,773,7.565,774,7.733,775,4.438,787,4.493,1074,5.067,1141,9.277,1160,4.701,1417,11.3,1783,6.373,1903,10.53,1931,5.837,2106,5.346,2121,5.697,2781,12.769,3490,16.204,3778,8.5,3781,9.024,3884,8.572,4515,12.857,4738,8.572,4956,15.048,5833,9.27,5834,9.27,5835,9.27]],["keywords/1078",[]],["title/1079",[60,695.225]],["content/1079",[4,1.442,25,1.437,40,5.311,44,3.874,59,12.866,60,9.352,68,7.312,111,5.25,122,6.107,155,4.147,171,3.633,177,7.155,224,4.219,228,6.077,241,5.172,273,3.051,297,3.947,334,4.012,341,8.271,396,6.201,408,6.28,479,8.36,543,5.153,590,5.932,630,6.977,659,6.4,737,7.802,765,4.56,770,9.374,773,7.48,774,7.606,1219,6.702,1345,8.654,1712,9.737,1946,11.249,2104,11.661,2321,8.762,2353,9.923,2677,9.737,2900,9.261,2953,9.124,2980,10.907,3223,10.356,3747,11.249]],["keywords/1079",[]],["title/1080",[19,469.995,60,584.959]],["content/1080",[4,2.084,14,3.28,23,4.255,25,0.58,32,1.847,60,8.275,124,3.268,171,4.314,191,2.623,198,3.608,204,4.129,206,3.106,222,2.38,240,1.949,271,3.095,273,1.914,334,3.894,440,4.036,447,11.863,556,3.117,572,4.824,600,10.818,630,8.835,674,3.196,737,6.762,758,5.841,765,2.86,767,4.985,770,4.31,771,6.619,772,5.602,773,7.926,774,10.166,775,6.466,1219,7.958,1345,8.399,1356,5.567,1417,4.77,1427,4.657,1479,4.895,1611,6.495,1712,9.45,1827,4.895,1903,6.495,2106,5.033,3747,10.919,4398,12.488,4515,5.427,4650,7.637,4956,13.537,5836,8.726,5837,8.726,5838,8.726,5839,8.726,5840,8.726,5841,8.726,5842,12.488]],["keywords/1080",[]],["title/1081",[3367,897.578]],["content/1081",[4,2.165,111,7.883,224,6.334,765,6.847,861,9.717,2953,13.699,3367,11.84,4480,15.549]],["keywords/1081",[]],["title/1082",[54,809.864]],["content/1082",[4,1.395,23,4.208,32,2.849,54,9.947,107,3.307,152,2.681,171,3.516,271,4.776,334,3.882,556,4.81,557,7.374,572,4.81,590,5.741,600,9.981,630,8.825,659,6.194,737,6.239,758,5.823,770,6.649,771,8.509,772,5.585,773,8.369,774,10.145,775,6.447,787,6.525,975,7.242,1170,6.875,1417,7.36,1783,9.256,2228,10.27,2980,10.554,4515,8.374,4956,9.801,5843,13.464,5844,13.464]],["keywords/1082",[]],["title/1083",[3170,1421.376]],["content/1083",[23,4.143,32,2.66,63,2.757,96,7.115,124,4.708,155,3.747,171,4.62,183,3.959,186,3.716,228,5.49,246,3.971,271,4.459,330,3.022,334,5.101,438,4.708,512,5.146,556,4.49,568,7.395,572,4.49,600,6.761,630,8.607,737,7.469,758,5.437,770,6.208,771,8.202,772,5.214,773,8.067,774,9.671,775,6.019,975,6.761,981,7.181,982,6.708,1089,7.25,1114,9.033,1417,6.872,1444,5.948,2980,9.854,3170,17.86,3859,9.357,4515,7.818,4956,9.15,5845,12.57,5846,12.57]],["keywords/1083",[]],["title/1084",[396,442.138,516,695.85,772,561.321]],["content/1084",[4,2.164,19,3.292,23,2.447,25,0.73,33,1.42,87,3.816,171,2.867,172,6.333,183,3.458,217,3.922,228,4.796,234,5.079,375,5.728,458,5.107,482,6.002,483,5.906,572,3.922,659,5.051,736,4.112,737,3.692,765,6.22,772,6.66,879,4.275,942,6.597,1006,6.671,1108,7.424,1257,5.024,1278,7.929,1377,5.136,1614,5.607,1796,6.671,1885,9.202,1886,10.154,1903,8.173,2023,7.829,2376,8.173,2568,7.684,3767,7.993,4185,9.202,4222,12.98,4643,8.607,4684,8.877,4901,14.05,5174,10.154,5320,14.846,5847,10.98,5848,18.979,5849,10.98,5850,10.98,5851,10.154,5852,10.98,5853,10.98,5854,10.98,5855,10.98,5856,10.98,5857,10.98,5858,10.98,5859,10.98,5860,10.98,5861,10.98,5862,10.98,5863,10.98,5864,10.98,5865,10.98,5866,10.98,5867,10.98,5868,10.98,5869,10.98,5870,10.98,5871,10.98,5872,10.98,5873,10.98,5874,10.98,5875,10.98,5876,10.98,5877,10.98,5878,10.98,5879,10.98,5880,10.98,5881,10.98,5882,10.98,5883,10.98,5884,10.98,5885,10.98,5886,10.98]],["keywords/1084",[]],["title/1085",[3769,1421.376]],["content/1085",[2,1.739,4,0.849,5,3.88,6,1.647,7,1.482,8,2.514,9,4.944,19,1.423,23,3.234,25,1.251,30,6.049,33,0.614,35,4.161,37,0.797,53,3.461,60,3.057,63,1.797,65,1.556,70,1.158,72,2.26,76,2.823,79,2.514,97,1.667,105,2.574,107,1.166,111,1.792,121,4.923,134,2.688,151,1.465,152,3.159,155,1.415,162,5.61,171,2.14,177,4.213,186,1.403,192,1.596,193,1.902,196,2.55,198,3.876,203,2.408,217,2.927,224,5.157,225,2.937,227,2.442,234,8.698,241,1.765,246,2.588,254,4.87,271,1.684,273,1.041,279,2.823,293,1.329,300,4.517,301,2.93,310,3.709,311,2.034,330,4.089,334,1.369,355,1.871,373,1.225,401,2.127,407,2.315,408,1.571,413,2.459,425,2.947,427,3.012,440,2.196,458,3.811,479,2.853,482,2.596,496,1.919,510,2.408,512,1.944,514,1.702,531,2.596,536,1.628,560,2.514,563,2.034,569,2.33,572,2.927,590,4.608,598,5.54,614,3.544,630,4.727,659,8.65,673,2.477,695,2.345,716,1.714,737,5.718,758,2.054,765,7.102,772,6.582,773,3.229,775,2.273,779,3.161,782,4.82,785,1.448,843,2.149,876,2.953,879,1.849,894,1.82,901,4.908,912,2.477,941,3.534,942,4.923,950,3.161,973,2.554,1086,3.07,1114,2.425,1148,3.323,1174,9.641,1183,2.618,1224,2.765,1257,3.749,1278,4.046,1280,8.471,1298,2.853,1377,5.055,1548,5.226,1562,3.456,1574,4.391,1593,4.155,1796,2.885,1811,3.456,1827,2.663,1872,4.407,1889,2.99,1987,3.622,2022,3.979,2023,2.315,2330,3.839,2358,3.839,2359,3.839,2360,10.395,2361,9.057,2362,3.839,2363,6.867,2364,3.979,2374,4.155,2424,8.737,2496,3.456,2626,4.155,2847,6.867,2953,3.114,3189,4.391,3460,7.17,3561,3.622,3767,5.964,3830,3.534,3859,6.099,3960,4.155,4102,3.979,4174,4.155,4620,6.25,4685,4.155,5318,3.839,5421,4.391,5422,4.391,5614,3.979,5851,7.576,5887,4.748,5888,4.748,5889,4.748,5890,4.748,5891,4.748,5892,4.748,5893,4.748,5894,4.748,5895,4.748,5896,4.748,5897,4.748,5898,4.748,5899,4.748,5900,4.748,5901,4.748,5902,4.748,5903,4.748,5904,4.748,5905,4.748]],["keywords/1085",[]],["title/1086",[1007,824,4617,1013.728]],["content/1086",[]],["keywords/1086",[]],["title/1087",[1007,824,4571,1313.99]],["content/1087",[105,10.02,107,4.539,222,6.225,240,5.097,290,14.097,301,4.212,398,6.921,424,11.949,462,7.343,736,6.921,936,9.186,1007,13.019,1625,14.942,1966,12.933,4571,19.132,5906,18.481,5907,18.481]],["keywords/1087",[]],["title/1088",[7,371.572,12,415.037,69,371.572,373,306.972]],["content/1088",[4,1.343,6,1.255,7,4.046,12,7.257,24,4.474,25,1.202,46,4.196,51,3.102,54,5.633,69,6.497,70,3.161,87,4.504,88,7.136,97,4.55,105,7.027,107,3.184,116,5.353,124,4.854,149,5.376,154,4.765,171,3.385,186,3.831,205,3.368,206,4.614,222,3.534,240,4.647,243,5.962,281,5.026,297,3.677,311,5.552,330,3.116,364,7.027,373,3.343,424,8.38,425,4.663,426,8.061,427,4.765,462,5.15,490,5.15,504,5.746,581,5.501,660,7.27,662,9.244,716,4.679,843,5.867,901,4.948,936,6.443,996,5.867,1007,6.812,1204,6.665,1242,10.16,1256,10.23,1611,9.648,2098,8.162,2252,7.875,2733,9.244,2988,10.479,3681,11.343,4166,11.986,4571,10.863]],["keywords/1088",[]],["title/1089",[4,110.083,149,440.672,191,319.37,2043,773.343,2253,502.693]],["content/1089",[4,1.865,7,5.62,12,6.277,37,3.022,69,5.62,86,7.274,149,7.467,171,4.701,191,5.412,222,4.909,240,4.02,278,4.846,413,9.323,552,9.461,673,9.391,711,7.639,894,6.899,1193,13.731,1611,13.399,2253,8.518,2254,12.712,2733,12.839,3680,13.731,3979,15.087]],["keywords/1089",[]],["title/1090",[2,351.353,4,99.401,37,161.05,70,233.946,659,441.279,2102,775.576]],["content/1090",[2,8.692,4,1.523,10,8.362,11,6.392,22,5.169,23,4.03,24,3.364,25,0.977,32,3.11,33,2.287,34,4.05,35,2.795,37,3.73,63,2.138,67,3.922,70,2.377,84,5.201,85,4.695,89,6.138,94,6.062,97,3.422,111,3.678,124,3.65,171,3.837,184,2.114,222,2.658,230,5.588,234,4.509,240,2.176,246,3.079,296,7.255,334,2.81,381,3.145,400,7.965,413,5.048,455,4.667,463,6.952,468,4.459,496,3.939,663,5.373,674,3.57,711,6.237,777,4.344,785,2.972,845,6.392,894,3.735,993,4.695,1180,8.83,1342,6.59,1343,5.794,1612,7.255,1614,9.033,2057,6.701,2431,7.435,2495,6.138,2502,4.845,2574,8.53,3593,6.488,3813,8.928,4023,9.013,4029,7.666,4583,11.21,5908,12.861,5909,9.013,5910,9.013,5911,7.881,5912,9.013,5913,7.881,5914,7.881]],["keywords/1090",[]],["title/1091",[1007,824,2010,1267.615]],["content/1091",[4,2.042,25,1.31,65,6.458,67,7.928,122,8.649,240,4.4,437,7.734,736,7.379,1007,10.356,1648,13.789,2146,14.344,2165,13.323,2284,16.514,2628,15.03,3564,14.053]],["keywords/1091",[]],["title/1092",[69,371.572,316,866.461,649,962.349,736,445.761]],["content/1092",[4,1.958,6,1.829,10,5.469,25,0.919,69,5.898,70,3.371,111,5.215,182,2.758,184,4.097,191,5.68,192,4.647,218,14.412,222,3.769,228,6.037,240,5.167,243,6.358,289,6.429,316,15.671,329,6.159,373,3.564,378,8.305,385,5.062,400,6.223,457,9.345,496,5.585,515,6.826,569,6.782,580,6.358,649,18.71,663,7.619,674,6.92,711,5.865,894,5.297,1007,7.264,1112,8.216,1315,8.703,1606,9.502,1623,9.345,2043,10.061,2115,11.583,3236,10.834,5915,12.781,5916,12.781,5917,13.822,5918,13.822]],["keywords/1092",[]],["title/1093",[66,985.073,649,1094.088,1388,863.219]],["content/1093",[4,1.545,22,3.913,25,0.992,46,6.437,63,3.27,70,4.85,88,6.819,181,3.973,184,4.313,186,4.407,187,9.163,192,5.013,218,11.373,230,4.71,240,4.44,288,7.363,316,10.853,321,9.163,373,5.129,381,4.811,385,5.461,391,7.51,499,10.452,501,7.667,649,12.054,650,8.599,663,8.219,674,5.461,675,6.935,708,9.389,716,5.383,894,5.714,982,7.956,1141,9.777,1220,8.517,1388,9.511,1398,9.389,2146,14.476,3790,10.433,5916,13.787,5919,14.91]],["keywords/1093",[]],["title/1094",[33,174.985,184,293.46,4585,1094.088]],["content/1094",[4,1.534,25,0.984,33,2.559,63,3.246,97,6.948,171,3.866,180,6.81,182,2.954,184,4.292,191,4.45,219,5.503,222,5.397,230,4.677,240,4.419,249,8.379,278,3.985,289,6.886,315,4.822,385,5.422,395,6.224,424,9.572,482,8.092,504,6.563,515,7.311,638,8.538,674,5.422,711,6.282,973,7.962,1007,7.78,1388,9.443,1398,9.322,1444,7.005,1902,9.098,2010,11.969,2111,9.853,2115,12.407,2838,12.407,4585,20.638,5915,18.302]],["keywords/1094",[]],["title/1095",[4,123.338,238,804.809,408,393.825,1007,625.565]],["content/1095",[12,5.778,19,4.967,25,1.417,37,2.782,46,5.364,88,5.681,111,6.253,149,6.873,179,8.236,191,6.406,222,5.811,228,7.237,234,7.664,240,5.26,260,8.581,314,5.878,364,8.984,397,10.57,408,5.482,504,7.346,569,8.131,673,8.644,711,7.032,1007,11.2,1827,9.294,2112,10.866,2115,13.887,4563,16.255]],["keywords/1095",[]],["title/1096",[25,104.266,240,350.087]],["content/1096",[]],["keywords/1096",[]],["title/1097",[886,560.063,4617,1013.728]],["content/1097",[1,8.75,4,1.208,22,5.153,23,4.062,25,1.513,28,5.041,29,8.144,30,5.484,32,2.467,33,1.507,34,3.839,111,4.398,131,5.911,151,3.596,154,4.285,186,3.445,193,4.67,198,4.479,240,5.289,243,9.032,246,3.682,251,6.481,271,4.135,389,5.994,569,8.227,661,7.435,843,5.276,861,7.798,886,5.989,1077,6.597,1089,6.722,1540,7.249,2303,6.269,3592,14.615,3593,7.758,3715,7.536,3813,7.082,4432,9.769,4617,7.536,4959,16.455,4960,9.769,4961,15.503,4962,10.778,5911,9.424,5913,9.424,5920,14.672,5921,11.656,5922,11.656]],["keywords/1097",[]],["title/1098",[4,140.222,4617,874.956,5923,1251.356]],["content/1098",[1,10.153,4,1.602,22,5.347,23,4.016,25,1.515,32,3.272,33,1.999,34,4.665,62,6.624,63,3.391,222,4.216,256,7.275,381,4.99,420,9.395,763,7.896,1631,8.752,3592,11.51,3593,10.292,3813,9.395,4617,9.998,4959,17.074,4960,12.959,5911,12.502,5913,12.502,5920,13.532,5923,21.069,5924,20.373,5925,14.299]],["keywords/1098",[]],["title/1099",[4,140.222,4617,874.956,5926,1251.356]],["content/1099",[1,10.19,4,1.614,22,5.373,23,4.023,25,1.521,32,3.297,33,2.014,34,4.687,62,6.674,63,3.416,86,6.295,381,5.027,420,9.465,763,7.955,3592,15.239,3593,10.369,3813,9.465,4617,10.073,4959,17.158,4960,13.056,5911,12.595,5913,12.595,5920,13.633,5925,14.406,5926,21.146,5927,20.473]],["keywords/1099",[]],["title/1100",[243,721.234,4617,1013.728]],["content/1100",[6,1.141,14,4.431,23,3.011,32,2.495,35,5.666,40,4.5,44,3.282,65,5.54,111,6.378,154,4.333,164,3.702,184,2.556,204,5.578,205,4.392,206,6.016,222,3.214,224,5.991,228,5.148,234,5.453,240,4.819,243,11.907,246,3.724,271,7.009,307,6.798,314,4.181,330,2.834,331,7.622,334,3.399,407,5.748,435,5.393,543,4.365,569,8.294,590,5.026,592,7.162,630,4.333,637,6.734,716,4.256,736,4.415,765,7.074,773,4.645,901,4.5,1081,7.245,1180,7.083,1276,6.242,2130,7.73,2131,7.083,2303,6.34,2502,5.859,3586,9.748,4617,7.622,4965,8.992,5928,11.788,5929,15.629,5930,11.788,5931,9.24,5932,11.788]],["keywords/1100",[]],["title/1101",[184,340.004,243,721.234]],["content/1101",[4,1.335,6,1.247,23,3.906,25,0.857,32,3.809,34,2.949,35,3.694,45,3.654,53,5.441,92,5.492,152,2.565,164,5.651,184,5.308,205,5.389,206,4.585,224,6.809,240,5.275,243,11.26,293,3.606,314,6.384,315,4.196,319,5.74,334,3.714,347,5.926,396,4.209,569,6.321,886,4.601,901,4.917,1024,6.06,1329,6.532,1347,8.011,3586,7.429,4822,7.657,4946,11.273,4965,9.826,4969,11.273,4971,10.796,5065,11.912,5929,11.912,5931,10.097,5933,12.881,5934,12.881]],["keywords/1101",[]],["title/1102",[243,721.234,307,904.237]],["content/1102",[4,1.39,6,1.299,7,2.701,22,2.271,23,4.112,25,0.892,30,4.071,32,4.24,34,4.239,35,2.482,45,2.455,65,2.836,69,5.13,87,4.663,131,6.804,152,3.272,183,2.726,198,2.312,205,4.27,224,2.624,230,2.734,240,1.932,243,9.751,264,2.509,273,2.943,293,2.422,304,6.758,307,12.225,314,3.07,319,5.979,335,14.289,414,3.383,416,5.76,467,3.059,510,6.804,516,4.45,520,7.438,543,4.969,554,4.143,556,3.091,630,4.933,656,5.144,711,5.694,717,4.143,785,2.639,804,6.503,809,4.274,879,3.369,901,5.122,910,5.399,1068,7.976,1102,6.441,1103,6.056,1124,8.676,1191,5.52,1339,3.876,1350,6.601,1351,6.441,1417,7.335,1993,5.851,2912,8.345,3465,7.573,4617,8.676,4667,11.245,5931,6.784,5935,8.654,5936,8.654,5937,13.418,5938,8.654,5939,8.654,5940,8.654,5941,8.654,5942,8.654,5943,8.654,5944,8.654,5945,8.654,5946,8.654]],["keywords/1102",[]],["title/1103",[4964,1630.706]],["content/1103",[23,3.854,32,4.354,33,2.03,34,4.711,35,4.501,54,6.822,198,4.193,224,4.759,228,6.855,240,4.594,243,11.206,396,5.128,569,7.702,711,6.661,773,6.185,2058,10.012,2079,8.967,3593,10.447,3813,9.536,4964,22.132,4965,11.973,5911,12.69,5912,14.514,5913,12.69,5931,12.304,5947,15.696,5948,20.574]],["keywords/1103",[]],["title/1104",[1309,737.602,1536,1097.157]],["content/1104",[4,2.128,5,2.73,6,2.42,19,3.791,23,2.708,70,5.432,92,5.392,161,5.613,186,3.738,200,4.718,205,4.616,217,4.518,240,2.824,293,3.54,305,12.773,539,5.882,568,7.44,572,4.518,580,8.173,592,7.684,661,8.067,711,5.367,726,9.206,737,6.905,771,5.067,1074,6.913,1134,7.158,1188,10.225,1224,7.365,1272,9.206,1309,5.95,1536,14.372,1602,7.684,1889,7.964,2023,6.167,2049,11.487,2203,8.293,2303,6.802,2912,12.773,3339,10.225,4447,11.067,5949,17.767,5950,15.548,5951,15.548,5952,17.767,5953,12.647]],["keywords/1104",[]],["title/1105",[273,343.83,1114,800.578]],["content/1105",[4,2.245,5,2.23,6,2.097,7,3.224,19,3.096,23,3.582,32,2.185,34,2.364,35,2.961,44,2.876,63,2.265,65,6.002,67,4.155,68,5.427,79,5.469,87,3.589,88,5.262,151,4.734,152,3.646,161,6.404,167,6.669,171,2.697,172,5.956,174,6.139,184,2.239,201,3.989,205,3.987,224,3.131,240,4.089,243,9.325,273,5.41,373,3.958,396,3.374,414,5.998,520,4.674,549,5.427,568,6.075,592,6.274,661,6.588,685,11.17,716,3.728,1074,5.645,1114,10.35,1536,12.814,1641,7.517,1827,8.608,1970,7.365,2178,7.227,4617,6.677,4888,14.19,4965,7.877,5931,8.095,5950,16.025,5954,10.327,5955,10.327,5956,10.327,5957,10.327,5958,10.327,5959,10.327,5960,10.327,5961,10.327]],["keywords/1105",[]],["title/1106",[330,376.96,2023,764.557]],["content/1106",[4,1.873,5,2.798,6,1.255,7,4.046,19,5.418,23,3.912,32,2.743,34,2.968,35,3.717,92,5.526,124,4.854,151,5.576,152,4.483,161,6.575,205,5.407,224,3.93,230,6.575,240,2.894,243,8.315,330,5.693,396,5.906,458,6.029,499,6.812,545,3.59,580,5.962,685,15.15,737,4.358,772,5.376,787,6.282,993,6.243,1257,8.269,1444,6.133,1633,7.405,2023,8.814,4485,10.479,4965,9.887,5931,10.16,5951,11.343,5962,12.962,5963,12.962,5964,11.986]],["keywords/1106",[]],["title/1107",[60,584.959,240,350.087]],["content/1107",[4,2.231,23,3.94,25,1.119,44,4.687,60,8.032,63,2.571,68,6.16,111,4.423,152,3.351,171,4.396,184,2.542,186,3.465,205,3.046,206,4.172,223,6.027,240,2.617,273,3.692,334,3.38,378,7.043,385,4.293,389,6.027,425,4.217,514,4.202,515,5.789,557,4.657,737,6.622,758,5.07,765,5.517,775,8.06,879,4.563,1010,9.477,1089,6.76,1276,6.207,1280,15.44,1283,14.108,1327,6.255,2089,7.687,2358,9.477,2359,9.477,2360,15.925,2361,9.824,2362,9.477,2363,14.108,2364,14.108,3859,8.725,3887,13.541,4165,8.203,5016,9.477,5842,15.566,5950,10.258,5965,11.722,5966,11.722,5967,11.722]],["keywords/1107",[]],["title/1108",[240,350.087,737,527.124]],["content/1108",[4,2.238,6,1.347,23,3.292,32,2.945,34,3.186,35,3.99,44,3.874,63,3.051,65,4.56,68,7.312,79,7.368,152,2.77,171,4.956,193,5.575,198,3.717,205,5.613,224,4.219,230,4.396,234,6.436,240,5.182,243,9.938,246,4.396,500,9.737,590,8.093,659,6.4,737,7.802,765,6.221,861,6.472,880,10.613,1169,6.366,1900,10.356,2000,10.356,2502,6.916,3823,10.907,4965,10.613,5968,24.288,5969,13.914,5970,13.914]],["keywords/1108",[]],["title/1109",[737,527.124,2995,1229.009]],["content/1109",[23,3.931,32,3.877,86,7.402,155,5.46,162,6.476,205,4.76,240,4.09,330,4.404,557,7.279,737,7.633,1114,9.354,1796,11.129,2995,14.359,5951,16.031,5964,16.939,5971,18.319,5972,18.319,5973,18.319,5974,18.319]],["keywords/1109",[]],["title/1110",[273,296.762,396,442.138,2568,946.964]],["content/1110",[240,4.712,273,4.628,373,5.442,396,6.895,1298,12.679,2568,14.767,3380,18.467,5975,21.102]],["keywords/1110",[]],["title/1111",[225,562.039,278,422.052]],["content/1111",[4,2.187,225,8.863,243,9.707,278,5.68,745,11.535,1276,11.174,1309,9.927]],["keywords/1111",[]],["title/1112",[3769,1421.376]],["content/1112",[4,1.523,14,5.526,25,0.978,28,6.358,29,6.097,45,5.588,63,3.224,65,7.282,79,7.784,110,6.484,111,5.547,122,6.452,154,5.404,189,7.506,201,7.608,205,3.819,206,5.232,207,8.103,236,10.105,240,4.398,243,9.062,251,8.173,297,4.17,348,11.15,396,4.803,523,10.595,569,7.213,589,10.286,596,10.286,602,13.593,684,18.216,693,6.584,853,8.397,932,6.689,941,10.941,1134,8.32,1298,8.832,4617,9.504,4797,13.593,5976,14.699,5977,14.699,5978,14.699]],["keywords/1112",[]],["title/1113",[10,420.379,18,354.881,25,70.65,284,376.852,4619,743.425]],["content/1113",[]],["keywords/1113",[]],["title/1114",[198,418.827,4619,1097.157]],["content/1114",[4,1.717,10,4.536,18,7.118,22,5.592,23,4.05,24,5.718,25,1.294,32,4.116,33,2.142,34,4.454,35,3.287,37,2.781,45,3.252,69,3.579,107,4.069,111,6.251,154,6.09,171,2.993,191,3.446,198,6.037,234,5.303,275,3.817,301,2.613,425,5.959,427,7.15,572,4.095,736,4.293,776,7.885,777,5.108,779,7.63,843,7.498,901,4.376,2239,8.345,2303,6.166,2459,9.268,3726,10.567,4619,13.612,5979,16.566,5980,16.566,5981,11.464,5982,11.464,5983,10.032,5984,10.032,5985,10.601,5986,11.464,5987,11.464]],["keywords/1114",[]],["title/1115",[6,131.019,10,535.472,230,427.504]],["content/1115",[4,1.696,6,1.092,7,5.11,18,5.468,19,3.381,23,3.223,34,4.841,51,2.699,76,9.731,88,3.867,151,5.051,154,6.018,155,4.88,161,3.563,162,3.987,164,6.052,167,4.901,171,4.275,225,4.043,230,5.172,246,5.172,281,4.373,301,2.57,330,2.711,373,2.908,375,5.883,381,3.639,440,5.216,451,6.931,455,7.838,545,3.124,557,9.602,566,7.753,592,6.852,661,7.194,673,10.053,709,6.931,758,4.878,786,4.831,889,7.625,1028,6.504,1074,6.165,1114,11.466,1155,7.625,1268,8.478,1300,5.188,1332,6.066,1961,6.704,2206,8.394,2677,7.892,3503,15.739,3715,10.585,4560,10.428,5988,19.272,5989,16.37]],["keywords/1115",[]],["title/1116",[6,151.799,18,523.738]],["content/1116",[5,2.798,6,2.015,18,6.038,23,4.068,32,5.326,53,5.475,87,4.504,215,6.812,217,4.63,246,4.095,249,7.336,427,4.765,455,6.206,496,5.237,520,8.181,572,6.457,580,5.962,650,7.475,736,7.794,737,4.358,772,9.34,901,4.948,1479,7.27,1863,10.16,1986,13.456,3236,10.16,4619,9.07,5990,12.962,5991,25.167,5992,12.962,5993,12.962,5994,11.343,5995,12.962,5996,12.962,5997,12.962,5998,12.962]],["keywords/1116",[]],["title/1117",[183,586.914]],["content/1117",[4,1.512,7,4.556,18,6.549,23,3.875,32,4.149,46,4.725,51,3.493,69,4.556,87,5.072,164,4.584,183,8.007,198,3.899,234,6.751,241,5.425,281,5.66,284,5.178,360,8.338,381,4.71,490,5.8,517,7.914,520,6.607,538,7.255,544,5.446,545,4.043,566,10.035,659,6.714,722,9.875,772,6.054,826,8.046,848,11.442,849,11.442,901,5.572,1028,8.418,1309,6.867,4685,12.773,5994,17.157,5999,14.596,6000,14.596]],["keywords/1117",[]],["title/1118",[517,733.699,826,745.978,4619,946.964]],["content/1118",[4,2.08,7,3.787,19,3.637,22,4.528,23,4.169,24,5.955,32,4.889,33,2.231,34,3.95,35,3.479,37,2.037,86,4.902,87,5.995,107,2.98,111,4.578,122,5.325,161,3.832,241,4.509,250,6.474,257,5.434,284,7.122,427,4.46,517,6.577,552,6.376,722,6.11,764,6.631,776,5.774,826,11.067,828,9.253,830,11.218,831,11.218,835,11.218,836,11.218,840,15.953,845,7.955,847,9.808,848,9.509,849,9.509,4619,8.489,5983,10.616,5984,10.616,5994,10.616,6001,17.252,6002,12.131,6003,12.131,6004,12.131,6005,17.252,6006,12.131]],["keywords/1118",[]],["title/1119",[785,412.676,1814,852.135,4619,946.964]],["content/1119",[18,7.667,22,5.399,23,3.713,25,1.044,45,4.453,103,6.994,111,5.923,188,8.804,198,4.193,201,6.062,230,4.959,301,3.577,330,3.774,425,5.647,458,7.301,483,11.066,507,9.762,736,5.878,782,9.234,785,7.712,786,6.724,843,7.105,1310,9.141,1656,10.447,1765,10.012,1814,9.884,2126,10.447,3726,10.012,3743,14.514,3744,14.514,3745,14.514]],["keywords/1119",[]],["title/1120",[63,296.762,272,576.973,3715,874.956]],["content/1120",[2,6.507,4,1.841,6,1.224,10,7.03,18,6.861,25,0.841,37,3.448,51,3.026,63,4.885,65,4.145,69,5.546,72,6.019,86,7.179,110,9.06,155,3.77,186,3.738,222,4.845,225,6.369,230,7.037,254,7.518,278,4.783,281,4.904,385,4.632,427,6.531,452,5.85,455,6.055,496,7.179,507,7.866,512,5.177,514,4.534,519,6.802,555,7.866,674,6.507,688,7.684,889,8.551,1427,6.749,1548,8.067,2043,9.206,2838,10.599,2892,10.599,3715,8.177,3830,9.413,4619,16.421,4917,10.225,5985,11.695,6007,12.647,6008,11.695]],["keywords/1120",[]],["title/1121",[184,340.004,4619,1097.157]],["content/1121",[4,1.318,5,2.747,6,1.728,18,5.96,19,3.814,22,3.339,23,4.054,24,4.392,25,0.846,32,4.361,33,1.645,34,4.718,35,3.649,37,2.136,53,5.375,70,5.025,88,4.363,176,4.643,184,4.844,219,6.632,224,5.41,315,5.812,347,5.853,425,4.577,496,5.141,776,6.056,779,8.469,785,3.88,862,8.012,886,4.545,1024,5.986,1276,6.738,1343,7.564,1360,7.914,1361,9.597,1362,13.986,1363,13.986,1365,9.262,1367,10.287,1584,10.287,1746,9.974,1827,7.137,4619,8.904,5983,11.135,5984,11.135,6009,12.724]],["keywords/1121",[]],["title/1122",[5,188.782,25,58.151,33,113.071,234,404.467,556,312.357,557,347.44,2931,650.864]],["content/1122",[]],["keywords/1122",[]],["title/1123",[4616,1356.449]],["content/1123",[4,1.25,18,4.029,25,0.802,37,3.36,60,4.5,66,8.78,70,2.941,97,4.234,107,2.963,144,7.412,176,4.402,180,5.548,181,3.214,182,3.428,184,3.726,186,3.565,202,3.71,205,3.134,220,4.264,234,7.947,240,2.693,273,2.645,297,3.422,319,5.375,322,4.434,371,6.292,405,6.202,421,6.246,427,6.316,432,9.029,480,4.339,481,6.649,556,6.137,557,6.826,663,6.649,674,4.418,675,7.991,692,6.159,711,5.118,716,4.354,741,7.328,742,5.459,784,8.78,785,3.678,886,4.308,921,6.246,985,5.61,1133,10.108,1180,7.247,1610,7.501,1629,15.687,1783,8.292,1935,9.454,2011,11.153,2117,7.909,2931,16.233,3086,15.887,4616,15.876,6010,17.181,6011,17.181,6012,12.061]],["keywords/1123",[]],["title/1124",[4,162.462,67,630.847]],["content/1124",[2,2.471,4,1.969,5,3.472,6,1.35,18,2.254,19,3.3,25,1.479,33,1.423,37,2.7,40,2.576,45,3.955,63,2.414,67,2.715,97,3.864,111,2.546,116,4.546,122,2.962,125,4.356,144,4.147,152,1.343,179,3.354,180,6.413,182,2.196,183,4.391,184,4.122,185,3.368,186,1.994,189,3.446,191,2.029,192,2.269,196,2.1,201,4.251,205,2.86,206,3.918,207,3.72,208,3.689,219,5.182,220,3.891,228,2.947,234,5.091,235,4.197,236,4.639,237,4.425,238,4.562,239,3.446,240,3.113,242,3.72,246,2.132,249,3.819,254,4.011,263,5.456,273,2.414,284,2.394,297,3.123,298,3.311,301,1.538,308,2.184,315,2.198,316,4.912,330,2.646,373,3.595,381,5.19,396,4.555,398,2.527,399,3.689,400,3.038,401,3.022,405,3.47,408,2.233,427,5.913,432,5.785,435,3.087,439,4.722,440,3.121,504,2.992,510,5.582,512,2.762,519,8.651,556,2.41,557,2.681,638,3.892,711,2.864,718,4.467,736,2.527,743,7.703,771,2.704,785,3.357,843,4.982,862,4.249,894,2.586,910,2.715,918,3.819,955,3.892,1038,6.846,1054,4.722,1055,3.354,1089,3.892,1160,3.422,1174,4.1,1176,3.855,1204,3.47,1314,4.812,1329,3.422,1335,5.289,1361,3.629,1388,4.304,1398,4.249,1554,7.703,1579,5.456,1580,8.193,1629,5.289,1650,6.543,1827,3.785,1966,9.755,2033,5.456,2089,4.425,2095,4.722,2112,7.218,2702,6.24,2931,10.377,2988,5.456,3563,4.639,4616,16.188,6013,10.179,6014,6.748,6015,6.748]],["keywords/1124",[]],["title/1125",[4,140.222,408,447.737,4616,985.073]],["content/1125",[4,2.028,20,5.192,22,5.137,23,4.217,24,6.756,25,1.302,32,2.453,34,2.654,35,3.324,37,2.803,45,3.288,54,5.038,63,2.542,65,3.799,107,2.847,151,3.576,154,4.261,171,3.027,198,3.096,222,3.161,224,3.515,234,5.362,373,4.306,408,3.835,467,6.919,512,4.745,513,9.926,546,13.501,656,6.89,659,5.332,777,5.165,785,5.092,843,5.247,857,5.96,879,4.513,883,6.285,958,5.362,985,5.391,1219,5.583,1354,7.042,1613,6.445,1860,8.842,2927,7.299,3813,7.042,3977,10.144,4616,12.155,5125,10.719,6016,18.1,6017,11.591,6018,11.591,6019,11.591,6020,11.591]],["keywords/1125",[]],["title/1126",[4,110.083,37,178.358,516,546.285,2931,790.76,4616,773.343]],["content/1126",[4,1.973,5,2.383,6,1.069,12,3.849,23,4.112,24,5.563,32,3.411,33,2.462,34,3.69,35,4.622,37,3.514,53,4.663,54,4.797,76,6.562,114,4.685,116,7.861,124,7.129,155,3.29,171,4.209,186,3.263,191,3.318,198,2.949,219,4.103,246,3.487,264,3.2,279,6.562,345,8.42,355,6.351,373,2.847,427,7.695,432,8.47,487,6.951,516,5.676,734,5.56,1089,6.366,1256,12.601,1257,8.709,1629,8.653,1713,5.985,2638,8.42,2823,8.925,2931,14.17,2988,8.925,3114,8.035,3169,8.653,4616,13.857,5908,9.66,6013,10.207,6016,10.207,6021,16.117]],["keywords/1126",[]],["title/1127",[84,722.133,94,841.635,408,447.737]],["content/1127",[]],["keywords/1127",[]],["title/1128",[2778,1328.96]],["content/1128",[86,8.887,552,11.558,1663,12.228,6022,21.993]],["keywords/1128",[]],["title/1129",[2651,1356.449]],["content/1129",[23,3.283,25,1.432,45,6.11,763,10.998,1160,10.922,1891,15.072]],["keywords/1129",[]],["title/1130",[581,790.783]],["content/1130",[4,1.602,22,5.347,23,4.266,24,7.032,25,1.355,32,3.272,33,1.999,34,3.54,35,4.434,37,2.596,45,4.387,84,8.252,89,9.737,94,9.617,171,4.038,368,9.737,408,5.116,1028,8.918,1257,7.074,1613,8.598,3813,9.395,4029,8.067,5908,17.829,5909,14.299,5910,14.299,6023,15.463,6024,15.463]],["keywords/1130",[]],["title/1131",[25,79.157,33,153.915,234,550.572,2112,780.572]],["content/1131",[]],["keywords/1131",[]],["title/1132",[202,482.305,6025,1567.878]],["content/1132",[4,1.712,6,2.405,19,2.616,25,1.338,33,1.746,37,2.774,44,2.43,60,6.164,63,1.914,86,3.526,87,3.032,92,3.721,103,3.889,114,3.926,152,3.702,155,4.026,183,2.749,186,2.579,192,2.934,201,3.37,202,2.684,222,2.38,234,4.036,252,3.384,273,4.664,285,5.999,291,4.178,293,2.443,297,3.831,301,1.989,308,2.825,322,3.208,329,3.889,334,2.516,348,4.939,395,5.678,396,5.398,400,3.929,401,3.909,405,4.487,414,5.279,510,6.848,514,3.128,525,4.586,536,2.992,537,2.86,545,2.417,556,3.117,557,3.467,563,3.738,590,3.721,613,3.074,617,4.621,622,3.541,693,6.049,695,6.669,717,4.178,718,3.541,732,3.053,736,3.268,742,6.113,910,3.511,926,6.896,936,4.337,943,4.586,950,5.808,954,7.098,962,6.495,963,5.216,985,4.059,1030,4.282,1045,6.656,1048,7.055,1050,6.224,1119,5.033,1150,6.84,1171,5.999,1235,7.055,1314,6.224,1595,5.427,1604,5.642,1821,8.989,1822,6.495,2004,6.656,2017,7.637,2023,4.255,2078,7.637,2112,10.834,2116,7.313,2236,7.313,2568,6.107,3367,6.505,4650,7.637,6026,8.726,6027,8.726,6028,8.726,6029,8.726,6030,8.726,6031,8.726,6032,8.726]],["keywords/1132",[]],["title/1133",[29,772.941]],["content/1133",[4,2.405,28,9.343,29,9.626,44,5.285,46,4.504,50,7.67,83,10.128,94,11.805,192,4.678,205,4.932,240,3.107,271,6.733,319,6.2,324,12.176,373,3.588,394,7.056,466,7.258,493,8.654,876,8.654,996,6.298,1268,7.206,1310,8.103,1517,12.176,1846,13.817,2079,7.949,2094,10.356,2112,16.823,3830,10.356,3831,11.661,4565,11.661,6033,13.914,6034,13.914,6035,13.914,6036,13.914,6037,13.914,6038,13.914,6039,13.914,6040,12.866,6041,18.981]],["keywords/1133",[]],["title/1134",[581,790.783]],["content/1134",[4,1.215,22,4.418,23,4.285,24,5.81,25,0.78,32,2.481,33,1.516,34,2.684,35,3.361,37,1.968,54,5.094,63,2.571,87,4.073,98,5.021,122,5.145,152,2.334,171,3.061,271,6.987,308,5.449,330,2.818,355,4.619,394,5.944,467,5.951,512,4.798,513,6.968,519,6.304,520,5.306,656,6.968,694,5.826,711,4.974,777,5.223,859,8.941,1038,7.29,1354,7.121,1517,14.731,1613,6.517,1724,7.579,1984,7.477,2079,6.696,2112,14.117,2515,8.725,3764,8.533,3790,8.203,4563,12.84,4564,14.731,4565,9.824,4567,10.258,4568,10.258,6042,16.833,6043,10.839]],["keywords/1134",[]],["title/1135",[379,717.317,427,576.359]],["content/1135",[4,2.231,12,5.871,19,5.047,25,1.12,33,2.177,44,4.688,69,5.256,88,8.139,186,4.977,191,5.062,198,4.498,202,5.18,222,4.591,240,3.76,246,5.319,282,16.423,301,3.838,329,7.503,504,7.465,536,5.773,711,7.145,1024,7.921,2112,14.12,2542,12.257,2560,11.042,4563,16.423,5585,15.57]],["keywords/1135",[]],["title/1136",[52,432.005,408,518.75]],["content/1136",[]],["keywords/1136",[]],["title/1137",[52,372.867,63,296.762,689,739.744]],["content/1137",[2,6.32,37,4.031,52,4.755,63,4.796,86,6.973,97,6.058,100,6.39,103,7.69,193,6.914,215,9.069,230,5.451,272,7.357,273,3.784,405,8.873,516,8.873,672,10.732,689,13.125,861,8.026,874,9.696,958,7.982,1058,8.937,1427,9.208,2322,15.101,6044,17.256]],["keywords/1137",[]],["title/1138",[4,140.222,52,372.867,408,447.737]],["content/1138",[4,1.923,22,5.573,23,4.208,24,6.406,25,1.412,28,5.823,32,2.849,34,3.083,35,3.861,37,3.116,50,7.422,52,5.113,62,5.768,63,4.07,92,5.741,198,3.597,273,4.657,301,3.069,330,4.462,355,5.306,373,3.472,513,8.004,514,4.827,557,5.35,763,6.875,843,6.094,1354,11.275,1613,7.486,1633,7.692,1981,8.962,4028,12.493,4029,7.024,4428,11.783,6045,10.554,6046,13.464]],["keywords/1138",[]],["title/1139",[52,372.867,58,495.646,6047,1251.356]],["content/1139",[4,1.404,19,4.062,20,6.07,22,4.892,23,4.013,24,6.434,25,1.24,28,5.861,29,5.621,30,6.375,32,4.509,34,3.103,35,3.886,37,2.275,50,7.47,52,7.019,112,8.887,151,4.181,164,4.256,172,7.816,308,4.387,355,5.34,373,4.807,408,4.484,452,6.268,504,8.264,1613,7.535,1648,9.483,4028,12.536,4029,7.07,6048,17.238,6049,17.238,6050,17.238,6051,17.238,6052,12.531,6053,11.357]],["keywords/1139",[]],["title/1140",[37,263.223,2336,1267.615]],["content/1140",[4,1.766,5,2.574,6,1.65,22,4.472,23,4.043,24,5.882,25,1.322,32,3.606,34,3.901,35,3.419,37,3.642,52,5.978,65,3.908,70,2.908,88,4.088,151,3.678,154,4.383,161,3.767,164,3.744,185,2.88,222,3.251,252,4.623,287,5.926,293,4.77,308,3.859,355,4.699,381,3.848,396,3.896,510,6.046,572,4.259,674,4.367,736,4.465,809,5.888,894,4.569,1192,7.415,1235,9.64,1613,6.629,1869,12.683,2025,9.64,2336,16.077,2953,7.819,3041,9.64,4028,10.025,4029,6.22,6053,9.992,6054,11.923,6055,11.923,6056,11.025,6057,11.923,6058,11.923,6059,11.923,6060,11.923,6061,11.923,6062,11.923]],["keywords/1140",[]],["title/1141",[52,372.867,408,447.737,703,504.882]],["content/1141",[4,1.865,23,2.744,25,1.197,37,4.11,44,5.013,45,5.107,46,7.27,51,4.308,52,6.188,63,3.948,275,5.994,297,5.107,334,5.19,704,9.461,763,9.192,872,9.067,889,12.172,1160,9.129,1891,12.597,2215,15.087,6063,18.002]],["keywords/1141",[]],["title/1142",[408,518.75,508,987.288]],["content/1142",[]],["keywords/1142",[]],["title/1143",[37,199.834,52,327.97,508,749.53,670,667.664]],["content/1143",[4,2.208,5,2.926,6,1.312,23,2.065,37,2.275,52,5.136,60,6.955,62,5.805,63,2.972,86,5.476,97,4.758,100,5.019,103,8.307,186,4.006,189,6.92,190,6.339,191,4.074,203,6.872,230,4.281,241,5.037,273,2.972,297,5.288,308,4.387,329,6.039,334,3.907,373,3.495,381,4.373,397,8.645,408,6.168,508,8.534,512,5.547,513,8.056,516,6.968,607,7.347,674,4.964,718,7.565,763,6.92,894,5.193,940,8.233,944,7.601,958,6.268,1821,9.02,1872,7.289,2336,10.957,3007,11.357,3367,6.528,4024,11.357,6045,10.623,6064,13.552,6065,13.552,6066,13.552,6067,13.552,6068,13.552,6069,13.552,6070,13.552]],["keywords/1143",[]],["title/1144",[4,123.338,25,79.157,37,199.834,508,749.53]],["content/1144",[22,6.35,23,4.074,24,7.629,32,3.713,33,2.269,34,4.018,35,5.032,37,3.711,108,9.154,198,4.687,355,6.915,511,15.763,764,9.592,777,7.819,1300,8.072,1613,9.756,4970,17.325]],["keywords/1144",[]],["title/1145",[2,351.353,52,264.317,58,351.353,271,340.282,308,310.517,6047,887.06]],["content/1145",[4,1.413,19,4.089,20,6.11,22,4.914,23,4.019,24,6.463,28,5.9,29,5.658,30,6.417,32,4.525,34,3.123,35,3.912,37,2.29,50,7.519,52,6.646,112,8.945,151,4.208,164,4.283,172,7.867,308,4.415,355,5.375,373,4.829,408,4.513,452,6.309,504,8.302,511,13.354,764,7.457,777,6.078,1613,7.584,1648,9.545,4970,16.76,6048,17.315,6049,17.315,6050,17.315,6051,17.315,6052,12.613,6053,11.432]],["keywords/1145",[]],["title/1146",[4,140.222,511,965.11,6071,1184.242]],["content/1146",[4,2.208,23,4.082,24,5.72,32,3.507,34,3.794,35,4.752,37,2.782,45,7.055,67,6.667,88,5.681,151,5.112,172,9.556,184,3.593,201,6.4,355,6.53,395,6.967,408,5.482,480,5.961,508,14.834,1613,9.213,4970,16.705,6071,14.501]],["keywords/1146",[]],["title/1147",[25,79.157,220,420.766,315,387.69,508,749.53]],["content/1147",[1,6.327,4,1.471,6,1.863,14,5.337,21,8.189,25,0.944,44,3.953,49,6.68,58,5.2,85,6.839,184,4.173,185,3.43,193,5.689,202,4.368,204,6.718,207,12.034,220,7.717,225,6.898,252,5.506,272,6.054,278,3.822,293,3.974,299,8.83,315,4.625,334,4.094,382,7.301,408,4.698,419,8.626,437,5.572,508,8.941,511,13.724,536,4.868,556,5.072,622,5.762,652,6.798,664,7.104,732,6.733,886,5.072,887,8.269,891,7.827,971,8.44,1065,8.353,1110,8.111,1378,8.83,1663,7.894,2154,13.129,6072,14.198]],["keywords/1147",[]],["title/1148",[4,123.338,207,656.155,315,387.69,511,848.901]],["content/1148",[22,5.121,23,4.017,24,5.002,25,0.964,28,4.138,29,6.011,32,3.067,33,1.874,34,3.318,35,2.744,37,2.433,45,2.714,52,2.636,70,3.534,108,4.991,114,4.213,124,3.583,154,3.517,162,3.382,167,4.158,185,2.311,198,4.673,206,3.406,207,13.009,225,3.43,226,8.931,240,2.136,252,5.619,293,2.678,305,5.951,315,4.72,355,3.771,398,3.583,401,4.286,408,3.166,425,5.213,427,3.517,437,3.755,467,3.382,511,17.566,536,3.281,613,3.371,614,4.138,634,6.824,668,4.955,740,4.45,764,5.23,777,4.264,845,6.275,882,5.88,901,3.652,1064,6.696,1170,4.886,1300,4.401,1308,5.416,1313,5.688,1417,5.23,1536,6.696,1868,8.848,2094,7.122,2675,8.848,4867,8.848,4970,11.359,6071,17.074,6073,9.568,6074,9.568,6075,14.491,6076,9.568,6077,9.568,6078,9.568,6079,9.568,6080,9.568]],["keywords/1148",[]],["title/1149",[4,123.338,25,79.157,184,258.124,2692,832.941]],["content/1149",[4,1.668,6,0.811,14,3.148,19,2.511,22,4.774,23,4.11,24,4.515,25,1.07,32,2.768,33,1.083,34,2.995,35,4.615,37,2.196,40,3.197,45,5.598,49,3.94,97,2.94,108,4.369,111,3.16,184,5.038,198,2.237,201,3.235,220,5.69,224,5.516,225,3.002,226,4.277,227,4.307,239,11.863,240,1.87,241,3.113,242,4.617,243,6.017,246,2.646,271,2.971,272,3.571,273,1.837,307,7.544,308,2.711,315,4.261,334,2.415,355,3.301,462,3.328,511,11.479,572,2.992,622,5.308,630,6.687,639,3.986,758,3.622,764,4.578,765,4.287,770,4.136,771,6.449,772,3.474,773,5.155,774,4.578,775,4.01,777,3.732,780,4.435,845,5.493,936,4.163,975,4.505,996,3.791,1219,4.034,1300,3.853,1308,4.741,1309,3.94,1313,4.979,1343,4.979,1347,5.209,1540,5.209,2106,4.83,3586,7.544,4326,10.576,4822,4.979,4823,7.019,4903,7.019,4970,10.254,6081,8.376,6082,8.376,6083,8.376,6084,8.376]],["keywords/1149",[]],["title/1150",[180,622.502,273,296.762,2631,1184.242]],["content/1150",[6,1.773,9,6.043,19,3.959,23,3.46,25,1.398,33,1.708,44,3.678,45,3.747,63,2.896,99,4.653,154,4.855,155,3.937,162,4.669,164,4.148,183,4.16,198,3.528,202,4.063,224,4.005,273,4.978,284,4.685,293,3.697,301,3.01,315,4.302,319,5.886,330,5.054,334,3.808,385,4.838,396,4.315,399,7.22,410,8.54,425,6.588,438,4.946,490,5.248,508,8.317,511,9.42,536,4.529,537,4.329,538,6.565,543,6.782,544,4.928,545,3.658,636,7.22,660,7.409,734,6.653,735,5.947,858,6.653,888,6.89,889,8.931,1125,9.243,1176,7.545,1384,9.08,2631,11.559,6085,13.208,6086,13.208]],["keywords/1150",[]],["title/1151",[516,546.285,763,542.465,1902,652.904,3375,707.127,3858,810.359]],["content/1151",[3,5.613,4,2.087,14,6.512,22,3.202,23,3.07,25,1.339,37,2.908,40,4.658,45,3.462,70,2.976,87,4.24,103,5.438,114,3.547,151,3.765,154,4.486,155,3.637,203,6.188,291,5.842,297,3.462,334,3.518,385,4.469,408,5.732,437,4.789,466,6.366,467,4.313,468,5.583,486,10.298,508,10.909,512,4.995,514,4.374,539,5.676,557,4.848,607,6.616,642,5.466,763,11.195,872,6.146,906,6.616,994,6.563,996,5.523,1122,10.226,1147,6.727,1180,7.332,1204,6.275,1617,10.507,1672,9.865,1902,10.646,1940,9.865,2077,10.226,2502,6.065,2642,9.865,2836,10.678,3375,8.122,3858,9.308,3863,16.88,3864,10.226,4024,10.226,6087,11.284,6088,11.284,6089,11.284,6090,11.284,6091,11.284]],["keywords/1151",[]],["title/1152",[45,337.67,63,261.029,408,393.825,689,650.672]],["content/1152",[4,2.101,16,10.428,37,3.405,62,8.688,63,5.296,67,8.16,408,6.71,508,12.77,894,7.772,2443,15.897,3661,16.996]],["keywords/1152",[]],["title/1153",[275,396.341,408,393.825,514,426.689,2900,792.272]],["content/1153",[]],["keywords/1153",[]],["title/1154",[581,790.783]],["content/1154",[4,1.818,22,4.604,23,4.221,24,4.287,25,1.352,32,3.712,33,1.606,34,2.844,35,3.562,36,6.479,37,3.414,52,4.833,107,3.051,114,3.611,193,4.976,198,4.686,275,5.841,287,6.174,329,5.535,371,6.479,381,4.008,408,7.712,425,4.468,427,6.449,514,7.29,571,8.145,745,6.79,843,5.622,1074,6.79,1628,11.965,1827,6.967,2900,11.676,4028,10.32,4029,9.151,6092,15.351,6093,17.542]],["keywords/1154",[]],["title/1155",[275,522.063,408,518.75]],["content/1155",[]],["keywords/1155",[]],["title/1156",[401,702.281,556,560.063]],["content/1156",[6,1.685,15,10.134,22,5.77,24,6.006,45,4.936,122,7.637,171,4.544,172,10.035,230,5.497,275,7.321,323,9.592,405,8.947,420,10.572,527,11.305,614,7.526,626,13.273,674,6.373,776,8.282,1030,8.539,1204,8.947,1385,14.583,1663,9.675,1847,12.952,6094,17.4,6095,17.4,6096,17.4]],["keywords/1156",[]],["title/1157",[703,695.225]],["content/1157",[4,1.481,6,1.872,10,5.657,37,2.4,44,3.981,51,4.626,54,6.213,63,3.135,67,5.752,87,4.968,190,6.687,275,7.814,289,6.649,371,7.458,386,10.406,389,7.351,467,5.053,499,7.513,527,7.351,534,10.195,555,8.891,694,7.106,703,8.756,720,10.904,785,4.36,865,9.375,886,5.107,894,7.409,914,6.725,969,9.666,1029,10.406,1193,10.904,1320,7.689,1548,9.119,1713,7.751,1723,11.981,1846,10.406,1965,10.004,2165,9.666,2254,8.091,2612,10.195,3188,13.219,3990,10.641,6097,14.296,6098,14.296,6099,14.296]],["keywords/1157",[]],["title/1158",[4,123.338,25,79.157,275,396.341,408,393.825]],["content/1158",[22,4.981,23,4.257,24,5.542,25,0.73,32,3.398,33,1.42,34,4.781,35,3.149,37,2.695,108,5.728,111,4.143,152,3.196,198,2.933,224,3.329,271,3.895,273,2.408,275,3.656,334,3.166,355,4.327,572,3.922,630,7.676,758,4.749,764,6.002,765,5.262,767,11.928,770,5.423,771,8.366,772,4.555,773,6.327,776,7.642,777,4.893,780,5.814,787,5.321,804,5.321,805,7.201,886,3.922,1157,11.282,1257,5.024,1300,5.051,1308,6.215,1313,6.527,1320,5.906,1345,6.829,1444,8.98,1613,6.105,1641,7.993,6100,10.98,6101,10.98,6102,10.98,6103,10.98]],["keywords/1158",[]],["title/1159",[20,475.86,275,353.746,308,343.888,332,929.703,504,471.004]],["content/1159",[4,2.121,20,9.17,21,8.985,22,5.373,23,4.023,24,7.067,25,1.036,32,3.297,34,3.567,35,4.467,37,3.437,51,3.728,114,4.529,275,8.087,308,5.043,332,13.633,355,6.139,389,8.011,504,6.907,764,8.516,776,9.744,777,6.942,1169,7.127,1613,8.662,1648,10.902,2731,11.883,6104,20.473]],["keywords/1159",[]],["title/1160",[2,495.646,315,440.762,408,447.737]],["content/1160",[]],["keywords/1160",[]],["title/1161",[2778,1328.96]],["content/1161",[2,6.537,4,1.849,6,1.728,10,7.062,33,2.308,34,4.086,37,2.996,63,3.914,107,4.384,149,9.266,192,6,301,4.068,373,4.603,512,7.306,711,7.574,736,6.684,745,9.756,782,10.5,785,5.443,786,7.646,792,10.293,1058,9.243,1426,13.614,1554,12.489,6105,16.504]],["keywords/1161",[]],["title/1162",[2651,1356.449]],["content/1162",[2,9.095,4,1.62,5,3.375,6,1.799,7,4.88,10,4.19,12,5.451,13,9.267,23,1.614,25,1.365,34,2.425,37,3.12,45,3.004,50,5.838,51,3.741,54,4.602,61,8.408,62,6.697,72,7.441,149,4.393,152,2.108,184,4.03,217,3.783,223,5.445,230,3.345,271,5.546,297,4.435,301,2.413,315,6.684,323,5.838,364,5.741,381,5.045,399,5.789,408,5.172,435,4.845,455,5.07,461,8.875,462,4.208,463,7.552,468,7.152,469,12.254,510,5.37,552,5.565,673,5.524,763,5.407,786,6.697,827,6.508,952,5.994,955,6.107,1000,5.696,1058,5.484,1160,7.928,1204,5.445,1298,6.363,1614,5.407,2250,8.301,2421,7.882,2422,8.562,2428,8.875,2724,7.882,5914,8.562,6106,10.59,6107,9.267,6108,15.575,6109,10.59,6110,9.792,6111,9.792,6112,10.59]],["keywords/1162",[]],["title/1163",[581,790.783]],["content/1163",[2,6.889,4,1.949,10,7.443,22,4.936,23,4.271,24,4.739,25,1.251,32,4.54,34,3.144,35,3.937,36,7.163,37,4.059,52,5.183,193,5.501,198,3.668,246,4.338,315,6.126,355,5.411,408,7.099,843,6.215,1628,8.078,4028,11.065,4029,9.812,6113,16.46,6114,15.764]],["keywords/1163",[]],["title/1164",[467,658.712]],["content/1164",[2,6.605,4,0.854,7,2.573,10,5.112,11,5.406,12,4.505,22,3.39,23,4.263,25,0.548,32,1.744,34,1.887,37,3.775,44,2.295,51,1.973,54,3.583,60,4.82,63,1.808,69,2.573,76,7.679,88,2.826,103,3.673,124,7.334,136,4.754,148,4.754,149,3.419,152,1.641,155,3.851,161,4.081,164,2.589,167,3.583,171,4.16,184,3.455,192,2.771,198,2.202,201,3.184,219,3.064,222,2.248,230,6.187,246,2.604,273,1.808,293,2.307,345,6.288,373,3.332,380,6,385,3.019,391,4.152,427,3.03,458,3.834,459,6.288,467,6.375,513,4.9,557,3.275,590,3.515,736,3.087,765,2.702,785,3.94,843,3.731,901,3.147,969,5.573,983,4.9,1058,4.269,1089,4.754,1116,6.421,1169,3.771,1354,5.008,1377,3.856,1551,6.664,1633,4.709,1724,5.33,2131,4.953,2281,5.487,3375,5.487,3551,6.664,3770,6.136,5412,14.731,5783,7.622,5914,6.664,6043,7.622,6108,10.827,6113,7.214,6114,10.827,6115,14.731,6116,8.243]],["keywords/1164",[]],["title/1165",[2,389.113,37,178.358,184,230.384,315,346.025,435,486.049]],["content/1165",[2,6.629,4,1.875,19,3.036,23,4.233,24,5.22,32,4.546,33,2.596,34,4.596,35,4.337,37,3.921,52,2.79,65,3.319,88,5.185,124,3.792,155,3.018,184,4.353,198,5.363,224,3.07,230,3.199,234,4.684,273,2.221,297,2.873,315,5.895,364,5.49,373,3.9,381,4.88,399,5.535,435,8.281,458,4.71,843,4.584,1204,5.207,1255,14.633,1342,6.847,2131,6.084,4028,5.957,6108,15.169,6113,8.862,6114,15.169,6115,9.364,6117,15.123,6118,10.126,6119,15.123,6120,10.126,6121,10.126,6122,10.126,6123,10.126,6124,10.126]],["keywords/1165",[]],["title/1166",[2,574.258,408,518.75]],["content/1166",[]],["keywords/1166",[]],["title/1167",[2778,1328.96]],["content/1167",[4,2.187,15,12.29,97,7.408,958,9.761,1030,10.355,1327,11.261,1821,14.046,6125,21.102]],["keywords/1167",[]],["title/1168",[2651,1356.449]],["content/1168",[2,6.769,10,7.313,22,5.991,23,4.126,24,7.88,25,1.229,32,3.911,34,4.231,35,5.3,37,3.103,355,7.283,777,8.235,1612,16.992,1613,10.276]],["keywords/1168",[]],["title/1169",[295,963.564,408,518.75]],["content/1169",[]],["keywords/1169",[]],["title/1170",[2778,1328.96]],["content/1170",[5,3.788,6,2.343,12,6.118,40,6.698,52,4.835,61,11.887,103,9.849,124,6.571,149,10.036,273,3.848,301,5.037,373,4.525,405,9.023,408,5.806,527,9.023,711,7.446,736,6.571,761,12.773,786,9.468,6126,17.547]],["keywords/1170",[]],["title/1171",[2651,1356.449]],["content/1171",[4,1.703,5,3.549,6,2.053,7,5.132,11,10.78,12,5.732,15,9.574,33,2.126,34,3.764,51,3.934,53,6.944,61,8.842,124,6.156,215,8.64,217,5.872,297,4.664,301,4.832,461,13.777,462,6.532,463,11.724,773,6.478,952,9.305,1256,9.305,2049,10.629,2428,13.777,3758,10.224,4040,10.942,4791,15.201,6107,14.386,6127,16.439,6128,16.439,6129,21.202,6130,16.439]],["keywords/1171",[]],["title/1172",[581,790.783]],["content/1172",[1,10.399,4,1.461,6,1.365,10,7.58,14,5.301,22,5.027,23,4.19,24,6.612,25,1.274,32,4.054,34,3.229,35,4.044,37,2.368,51,3.375,52,5.994,54,6.129,114,4.1,162,4.985,171,3.682,295,11.772,355,5.557,467,4.985,777,6.284,1140,10.497,1248,16.763,1571,9.535,1613,7.841,2303,7.585,6131,19.155,6132,14.102,6133,12.341,6134,12.341]],["keywords/1172",[]],["title/1173",[1,830.371]],["content/1173",[1,11.353,5,3.82,6,1.713,10,7.002,52,4.876,58,6.481,81,12.621,84,9.443,99,6.234,114,5.144,167,7.691,222,4.825,295,14.928,302,14.307,329,7.886,642,7.926,806,8.524,1196,11.605,2178,12.383,6135,17.696,6136,17.696,6137,16.364]],["keywords/1173",[]],["title/1174",[281,524.746,297,383.895,379,619.122]],["content/1174",[2,4.66,4,1.849,6,1.995,10,5.035,11,8.344,12,4.437,18,4.25,25,0.846,33,2.664,45,3.61,50,7.014,51,3.045,69,5.57,72,6.056,79,6.738,97,4.467,149,5.278,154,4.677,162,4.498,171,3.323,198,4.766,219,4.73,264,3.689,273,3.913,279,12.249,281,9.908,295,13.727,311,7.644,373,3.281,381,4.106,427,4.677,455,6.092,507,7.914,510,6.452,716,4.594,792,7.338,843,5.759,926,6.497,1256,7.202,1257,5.821,1339,5.699,1554,8.904,1711,8.344,1726,6.844,2058,8.117,3375,8.469,3650,11.766,3758,7.914,3784,11.135,4040,11.876,6138,12.724]],["keywords/1174",[]],["title/1175",[6133,1372.068,6134,1372.068]],["content/1175",[1,5.776,4,1.343,10,9.958,18,7.521,22,3.402,25,1.202,33,3.062,62,5.552,63,2.842,69,4.046,88,4.444,124,4.854,147,8.268,148,7.475,149,9.34,154,6.644,155,5.388,171,3.385,177,6.665,186,3.831,222,3.534,224,3.93,228,5.661,230,4.095,295,11.108,373,5.367,381,4.183,467,4.582,510,6.573,668,6.713,716,6.525,782,10.633,1089,7.475,1157,7.705,1309,8.503,1444,6.133,1564,8.268,2114,8.5,2252,7.875,3770,9.648,6133,11.343,6134,15.818,6139,11.986,6140,12.962]],["keywords/1175",[]],["title/1176",[72,746.242,134,887.422]],["content/1176",[4,1.395,23,4.338,45,3.82,46,4.358,50,10.23,51,4.441,171,3.516,257,6.031,295,11.405,328,10.886,494,10.27,499,7.076,642,6.031,737,4.527,879,5.242,1116,9.224,1257,8.49,1261,8.589,1263,15.145,1377,6.298,1586,10.554,1711,12.17,3828,10.554,3849,16.24,3951,9.422,4577,17.161,6141,18.558,6142,13.464,6143,13.464]],["keywords/1176",[]],["title/1177",[4,123.338,33,153.915,295,731.52,1827,667.664]],["content/1177",[4,1.471,23,3.931,25,1.28,30,6.68,32,4.072,33,1.836,34,4.406,87,4.934,162,5.019,230,4.485,241,5.278,290,10.83,295,8.726,308,4.596,319,6.327,330,3.414,355,5.595,394,7.2,419,8.626,556,5.072,557,5.641,751,8.726,785,4.33,858,7.151,894,5.441,1257,6.496,1300,6.531,1827,10.794,2707,10.83,2785,13.129,3778,8.531,3781,9.057,3887,9.761,4102,11.899,4365,12.425,4482,11.899,6137,13.129,6144,14.198,6145,14.198,6146,14.198,6147,14.198,6148,14.198,6149,14.198,6150,14.198,6151,14.198,6152,14.198]],["keywords/1177",[]],["title/1178",[516,546.285,763,542.465,1902,652.904,3375,707.127,3858,810.359]],["content/1178",[3,5.613,4,2.087,14,6.512,22,3.202,23,3.07,25,1.339,37,2.908,40,4.658,45,3.462,70,2.976,87,4.24,103,5.438,114,3.547,151,3.765,154,4.486,155,3.637,203,6.188,291,5.842,295,7.499,297,3.462,334,3.518,385,4.469,408,5.732,437,4.789,466,6.366,467,4.313,468,5.583,486,10.298,512,4.995,514,4.374,539,5.676,557,4.848,607,6.616,642,5.466,763,11.195,872,6.146,906,6.616,994,6.563,996,5.523,1122,10.226,1147,6.727,1180,7.332,1204,6.275,1617,10.507,1672,9.865,1902,10.646,1940,9.865,2077,10.226,2502,6.065,2642,9.865,2836,10.678,3375,8.122,3858,9.308,3863,16.88,3864,10.226,4024,10.226,6087,11.284,6088,11.284,6089,11.284,6090,11.284,6091,11.284,6153,12.202]],["keywords/1178",[]],["title/1179",[2,495.646,408,447.737,1614,690.985]],["content/1179",[]],["keywords/1179",[]],["title/1180",[2778,1328.96]],["content/1180",[2,7.687,4,1.677,5,3.494,6,2.032,10,6.404,18,5.406,33,2.093,34,3.705,63,3.549,107,3.975,149,8.706,192,5.441,273,3.549,301,3.688,373,5.413,452,7.486,480,7.551,507,10.065,512,6.625,516,8.322,645,9.521,711,6.868,736,6.061,745,8.847,782,9.521,785,4.935,786,6.933,792,9.334,1058,8.381,1426,12.345,1554,11.325,6105,14.965,6154,16.184]],["keywords/1180",[]],["title/1181",[2651,1356.449]],["content/1181",[2,9.077,4,1.272,5,4.362,6,2.247,7,5.43,10,4.857,12,6.066,13,10.741,23,1.871,25,1.157,34,2.81,37,3.69,50,6.766,51,4.163,54,5.335,61,9.356,72,8.28,149,7.216,152,2.444,215,6.451,217,4.384,223,6.312,230,3.878,297,3.482,301,2.797,455,5.877,461,10.287,462,4.877,463,8.754,510,6.224,673,6.403,763,6.267,786,7.452,952,6.947,955,7.079,1058,6.357,1077,6.947,1160,8.821,1204,6.312,1298,7.375,1614,8.882,2250,9.621,2428,10.287,2724,9.136,3367,8.379,5914,9.924,6107,10.741,6108,14.579,6110,11.35,6111,11.35,6155,12.274,6156,12.274]],["keywords/1181",[]],["title/1182",[2,435.966,4,123.338,408,393.825,1614,607.783]],["content/1182",[2,6.889,4,1.949,10,7.443,22,4.936,23,4.271,24,4.739,25,1.251,32,4.54,34,3.144,35,3.937,36,7.163,37,4.191,52,5.183,193,5.501,198,3.668,355,5.411,408,7.099,843,6.215,1614,9.604,1628,8.078,4028,11.065,4029,9.812,4583,14.347,6114,15.764]],["keywords/1182",[]],["title/1183",[281,524.746,297,383.895,379,619.122]],["content/1183",[2,8.167,4,2.466,7,6.178,12,7.774,33,1.914,37,3.996,45,4.2,46,4.792,51,5.336,53,6.253,58,5.422,69,6.96,88,5.076,99,5.215,182,2.954,264,5.738,281,7.675,289,6.886,311,8.479,329,6.597,373,3.818,490,5.882,736,5.544,743,10.359,889,10.009,1072,10.359,1614,11.385,2130,9.708,2492,12.025]],["keywords/1183",[]],["title/1184",[6,131.019,10,535.472,480,486.819]],["content/1184",[2,8.009,4,1.788,5,2.619,6,1.175,10,4.8,18,4.052,22,5.269,23,4.12,24,4.187,25,1.454,32,3.651,34,2.778,35,3.479,36,6.329,37,4.146,52,3.343,152,2.415,186,3.586,200,4.526,223,6.238,249,6.866,265,4.364,273,3.783,355,4.781,370,7.639,371,9,373,4.449,408,4.014,480,7.866,507,7.545,645,7.137,737,4.079,1089,6.996,1121,7.844,1614,10.251,4025,15.953,4027,11.218,4028,10.149,4029,9,4583,13.159]],["keywords/1184",[]],["title/1185",[10,535.472,34,309.835,230,427.504]],["content/1185",[2,7.886,10,8.52,14,6.33,18,5.625,23,3.282,32,3.563,37,3.985,54,7.318,124,8.063,155,5.019,161,5.319,171,4.397,230,5.319,321,10.348,330,4.048,373,5.553,496,6.804,785,7.238,1086,10.887,1614,8.598,4028,9.906,4583,12.844,5914,17.408]],["keywords/1185",[]],["title/1186",[499,711.201,703,504.882,958,625.942]],["content/1186",[2,6.021,5,3.549,23,3.231,32,3.479,37,3.94,54,7.145,62,7.042,63,3.605,149,6.819,152,3.273,201,8.189,215,8.64,230,5.193,499,12.334,527,8.453,590,7.009,736,7.94,786,7.042,1220,9.391,1310,9.574,1511,11.967,1614,8.394,1712,11.504,1814,10.352,2436,14.386,4028,9.671,4583,12.539,6157,21.202]],["keywords/1186",[]],["title/1187",[260,811.993,408,518.75]],["content/1187",[]],["keywords/1187",[]],["title/1188",[260,700.837,408,447.737,703,504.882]],["content/1188",[4,1.639,25,1.625,33,2.674,37,2.655,63,3.468,69,4.937,76,9.401,88,5.423,230,7.277,240,3.531,260,11.93,273,3.468,279,9.401,280,10.088,297,4.487,301,3.604,326,12.397,334,4.56,389,8.132,504,7.012,516,10.632,545,4.381,674,5.793,747,11.279,843,7.159,1268,10.708,1633,9.035,2301,10.088,3092,11.772,6158,15.815,6159,15.815]],["keywords/1188",[]],["title/1189",[4,140.222,260,700.837,408,447.737]],["content/1189",[4,1.949,22,5.631,23,4.111,24,6.492,25,0.913,28,5.938,29,7.802,30,6.459,32,2.906,34,3.144,35,3.937,37,3.158,108,7.163,109,8.878,174,8.162,198,3.668,251,7.634,260,12.93,314,8.186,408,4.543,580,6.316,727,9.608,773,8.455,777,6.118,843,6.215,901,5.241,1300,6.316,1613,7.634,1663,7.634,3813,8.342,5387,19.839,5389,12.697,6160,13.73]],["keywords/1189",[]],["title/1190",[23,161.915,25,70.65,37,178.358,2427,810.359,3529,929.703]],["content/1190",[]],["keywords/1190",[]],["title/1191",[63,296.762,408,447.737,689,739.744]],["content/1191",[4,2.022,5,4.213,6,1.889,7,4.525,8,10.333,19,4.345,25,1.298,33,1.874,37,3.276,40,5.533,46,4.692,51,3.469,52,3.994,58,5.309,63,5.176,65,8.315,84,7.735,99,5.106,100,5.368,122,8.565,193,5.808,206,5.16,215,7.618,240,3.236,329,8.696,375,7.561,381,4.677,391,7.301,408,4.796,520,6.561,641,10.143,703,5.408,769,10.551,861,6.742,874,6.426,1981,9.648,2719,12.148]],["keywords/1191",[]],["title/1192",[10,620.079,37,178.358,670,595.91,1637,890.35]],["content/1192",[2,8.137,4,1.833,5,2.714,6,1.982,9,8.094,10,8.791,16,6.464,18,4.199,25,0.836,30,5.914,37,3.73,63,3.88,73,6.419,107,3.088,149,7.338,152,3.522,177,6.464,215,6.606,228,5.49,230,3.971,246,3.971,273,2.757,373,3.242,375,6.558,405,6.464,410,11.438,459,9.588,483,6.761,484,7.051,490,4.995,496,5.079,507,12.732,527,6.464,587,8.019,694,6.248,716,4.538,888,6.558,952,7.115,955,7.25,1030,6.168,1058,6.51,1089,7.25,1134,7.115,1205,16.046,1426,9.588,1444,5.948,1614,6.419,1631,7.115,1637,14.826,2055,10.535,2488,9.15,3963,9.588,6161,12.57]],["keywords/1192",[]],["title/1193",[63,343.83,689,857.071]],["content/1193",[4,2.353,15,10.669,25,1.51,63,4.979,67,7.371,171,4.783,203,9.289,329,8.163,527,9.42,581,7.774,642,8.205,689,10.014,785,5.586,879,7.132,1931,11.535,1981,15.112,1984,11.685,2131,11.007,2502,9.105]],["keywords/1193",[]],["title/1194",[1981,1240.307]],["content/1194",[5,4.313,33,1.941,37,1.684,86,6.067,107,4.42,148,5.784,152,5.251,154,6.615,186,2.964,187,6.163,193,8.997,198,2.679,201,3.873,224,3.041,230,3.168,246,4.743,249,5.676,273,3.292,301,4.101,334,2.892,373,4.641,381,3.236,490,3.985,520,9.043,552,5.271,642,8.06,716,5.42,736,8.012,761,7.3,771,6.015,775,8.616,782,5.9,787,10.368,792,10.378,879,3.904,1219,4.831,1313,8.925,1552,10.322,1713,5.437,1724,9.707,1981,11.978,2036,14.106,2169,8.776,2252,6.093,3661,8.405,4176,12.582,4430,8.405,5347,9.274,6162,10.029,6163,10.029,6164,10.029,6165,10.029,6166,10.029,6167,10.029,6168,8.776,6169,10.029]],["keywords/1194",[]],["title/1195",[37,178.358,51,254.223,63,232.977,114,308.839,689,580.745]],["content/1195",[2,6.651,4,1.882,20,8.134,37,4.126,51,4.345,52,5.003,63,4.952,67,7.306,73,9.272,114,5.279,246,5.737,378,10.911,397,11.583,413,9.404,484,10.186,568,10.683,874,8.051,886,6.487,1614,9.272,1662,14.234,1984,11.583]],["keywords/1195",[]],["title/1196",[37,178.358,63,232.977,114,308.839,689,580.745,6170,1062.382]],["content/1196",[4,2.379,37,3.13,58,8.407,73,9.521,99,6.569,100,6.905,142,10.97,182,4.58,205,5.964,206,8.171,240,4.164,260,9.657,381,6.017,408,6.169,506,10.11,516,9.588]],["keywords/1196",[]],["title/1197",[0,850.067,408,518.75]],["content/1197",[]],["keywords/1197",[]],["title/1198",[0,733.699,77,1094.088,408,447.737]],["content/1198",[0,13.187,1,3.017,4,2.08,5,2.383,16,3.481,19,3.308,25,1.48,33,1.807,34,1.55,37,2.346,45,3.964,46,3.572,49,3.185,51,1.62,52,1.865,63,2.42,67,4.441,70,2.692,72,5.253,92,2.886,111,4.165,125,2.679,136,3.904,152,3.208,161,2.139,164,2.126,179,3.365,182,1.351,184,3.495,191,2.035,192,3.711,196,3.435,198,1.808,201,6.855,202,3.395,203,3.433,205,2.868,206,3.929,218,5.164,232,4.024,239,8.229,240,3.12,246,2.139,249,3.832,254,4.024,271,3.915,272,4.706,273,3.534,277,6.365,278,1.822,301,2.515,315,2.205,329,4.918,330,2.653,353,5.924,356,3.149,359,4.928,361,3.797,370,4.263,371,3.532,378,4.068,387,3.943,391,3.41,395,2.846,396,5.265,398,4.133,399,3.701,400,3.048,406,5.924,408,7.163,409,8.913,410,4.377,413,5.716,435,3.097,442,4.928,466,3.532,467,2.393,468,3.097,482,3.701,487,4.263,493,4.21,545,1.875,552,3.558,555,4.21,560,3.585,598,4.577,607,5.984,648,4.263,673,3.532,688,4.113,714,4.506,744,8.215,747,4.828,785,2.064,886,2.418,952,3.832,958,3.131,1066,3.613,1072,4.737,1077,3.832,1086,4.377,1116,3.365,1268,3.506,1325,4.377,1329,7.085,1332,3.641,1398,4.263,1580,5.039,1656,4.506,1711,7.238,1726,3.641,2112,4.439,2172,4.577,2242,5.307,2542,4.928,3333,5.473,3748,5.307,4591,6.26,4595,5.674,6171,6.77,6172,6.77,6173,6.77,6174,6.77,6175,6.77,6176,6.77]],["keywords/1198",[]],["title/1199",[2778,1328.96]],["content/1199",[1,9.217,5,4.465,184,4.485,239,10.561,253,18.1,1305,14.473,2170,18.1,6177,20.683,6178,20.683,6179,20.683]],["keywords/1199",[]],["title/1200",[2651,1356.449]],["content/1200",[63,4.675,215,11.204,277,12.295,278,5.738,393,11.466,1261,13.598,6180,21.318]],["keywords/1200",[]],["title/1201",[581,790.783]],["content/1201",[0,8.843,1,7.268,22,5.536,23,4.277,24,7.281,25,1.085,26,17.679,27,13.669,31,11.213,32,3.452,34,3.734,35,4.677,37,2.738,55,19.507,92,6.954,109,10.546,126,15.082,355,6.428,467,5.766,1613,9.069,6181,16.311]],["keywords/1201",[]],["title/1202",[112,887.426,144,831.659,1254,914.982]],["content/1202",[0,8.707,4,1.664,8,8.504,23,3.98,25,1.068,51,3.843,81,11.453,92,6.847,111,6.06,114,4.668,144,12.834,193,6.434,250,8.57,257,7.193,280,10.244,569,7.88,598,10.858,1178,15.692,1254,10.858,1263,11.453,1377,7.512,1937,13.459,2720,10.112,2923,13.459,4072,14.85,4073,14.85,4074,14.053,6182,16.059,6183,16.059,6184,16.059,6185,16.059]],["keywords/1202",[]],["title/1203",[1,830.371]],["content/1203",[0,11.8,1,9.698,7,6.794,8,11.524,201,8.406]],["keywords/1203",[]],["title/1204",[0,645.355,4,123.338,33,153.915,1827,667.664]],["content/1204",[0,9.677,4,1.849,22,4.684,23,3.716,25,1.486,27,14.958,32,3.777,33,2.308,87,6.202,170,15.619,241,6.634,290,13.614,308,5.777,319,7.953,330,4.291,394,9.051,419,10.843,785,5.443,894,6.839,1827,10.011,2707,13.614,6186,17.848,6187,17.848]],["keywords/1204",[]],["title/1205",[25,49.41,33,96.074,98,318.282,287,369.302,395,312.401,408,245.826,873,446.421,874,527.51]],["content/1205",[]],["keywords/1205",[]],["title/1206",[874,826.145]],["content/1206",[4,1.318,37,2.996,51,3.045,52,4.916,53,5.375,58,4.66,63,2.79,84,6.79,86,5.141,87,4.422,92,5.425,96,7.202,98,10.075,103,5.67,182,4.111,192,4.278,200,4.747,202,3.914,205,3.306,206,4.529,222,4.865,252,4.934,275,4.237,287,8.869,293,3.562,308,4.119,334,3.669,356,5.918,395,5.35,396,4.157,438,4.765,489,9.471,512,5.208,514,4.561,525,6.687,536,4.363,557,5.056,562,7.338,659,5.853,692,6.497,785,5.441,873,10.721,874,9.136,932,5.79,963,4.914,971,7.564,994,6.844,1023,9.471,1041,9.974,1082,8.469,1106,10.664,1207,7.338,1427,6.79,1604,8.227,2970,15.614,6188,12.724,6189,12.724,6190,11.766]],["keywords/1206",[]],["title/1207",[703,584.959,874,695.115]],["content/1207",[4,1.335,5,2.781,6,2.008,22,3.381,51,4.307,53,5.441,63,2.825,66,9.377,70,3.141,87,4.476,98,5.518,177,6.624,182,2.57,192,4.331,222,4.907,230,4.069,256,6.06,278,3.468,287,6.403,289,8.371,297,5.884,308,6.714,361,7.225,395,5.416,402,7.429,476,7.826,483,6.928,539,5.992,590,5.492,613,6.34,674,4.718,703,4.806,704,6.77,872,6.488,873,7.74,874,7.979,901,7.918,958,5.958,1028,7.429,1075,9.588,1124,8.329,1377,6.025,1595,8.011,1617,6.72,1706,8.447,1707,9.187,1708,8.856,1797,11.912,1845,10.796,1862,11.273,2253,6.095,2254,10.186,2492,7.826,2964,10.097,3939,11.912,5489,11.912,6191,12.881]],["keywords/1207",[]],["title/1208",[46,438.039,308,438.039,874,599.958]],["content/1208",[4,1.765,6,1.154,10,2.947,23,4.135,25,0.495,32,4.735,34,5.122,35,2.136,46,2.411,67,2.997,84,3.974,87,2.588,98,10.225,107,1.829,124,4.464,162,7.028,186,2.201,198,5.311,222,2.031,228,3.253,230,5.382,286,4.577,298,3.654,308,4.825,311,3.19,326,5.838,329,3.319,330,1.791,349,4.815,375,3.885,395,3.131,465,5.543,498,4.632,510,3.777,529,4.215,572,2.66,580,3.426,613,5.251,662,5.311,663,4.105,674,4.366,758,3.221,769,5.421,773,4.698,869,4.884,873,4.475,874,5.285,901,2.843,955,4.295,958,3.445,1081,4.577,1170,3.803,1183,4.105,1332,4.006,1444,3.524,1526,4.071,1718,5.421,1726,4.006,2502,5.925,2669,5.035,2896,6.887,2970,6.517,3011,6.887,3030,9.638,3236,11.684,3445,6.887,3563,5.12,6192,7.447,6193,7.447,6194,7.447,6195,7.447,6196,7.447,6197,6.887,6198,7.447,6199,7.447,6200,7.447,6201,7.447,6202,7.447,6203,7.447,6204,11.921,6205,7.447,6206,7.447,6207,11.921,6208,7.447,6209,7.447,6210,11.921,6211,7.447,6212,7.447,6213,11.921,6214,7.447,6215,7.447,6216,7.447,6217,7.447,6218,7.447,6219,7.447,6220,7.447,6221,7.447,6222,7.447,6223,7.447,6224,7.447]],["keywords/1208",[]],["title/1209",[63,343.83,874,695.115]],["content/1209",[16,7.301,20,6.36,25,0.944,37,3.231,52,5.302,61,7.636,63,4.22,86,7.776,87,4.934,98,9.351,103,10.428,162,5.019,191,5.785,192,6.47,193,5.689,198,3.793,230,4.485,273,3.114,275,4.728,287,7.057,293,3.974,301,3.236,308,4.596,322,5.219,395,5.97,402,8.189,510,7.2,537,4.653,543,5.258,554,6.798,564,6.567,659,6.531,674,7.048,689,7.761,692,7.25,716,5.126,787,6.881,873,8.531,874,6.295,1610,8.83,1638,11.13,1821,9.451,6190,13.129,6225,14.198]],["keywords/1209",[]],["title/1210",[4,123.338,25,79.157,408,393.825,874,527.718]],["content/1210",[4,1.327,14,4.813,22,4.703,23,4.2,24,6.185,25,1.489,32,2.709,33,1.655,34,2.931,35,3.671,36,6.679,37,2.149,45,3.632,53,5.408,89,8.062,98,7.676,107,3.145,364,6.941,373,3.302,375,6.679,389,6.583,408,6.84,476,7.778,747,9.13,763,9.15,874,7.945,1028,7.383,1040,8.166,1160,6.492,1180,7.692,1891,8.959,2253,8.479,2502,6.363,2516,9.529,2969,8.656,3680,9.765,4029,6.679,6226,11.838,6227,12.802,6228,13.669,6229,12.802,6230,11.838,6231,9.319,6232,11.203,6233,12.802]],["keywords/1210",[]],["title/1211",[4,99.401,289,446.197,381,309.561,874,425.298,2253,453.912,2254,542.959]],["content/1211",[4,2.2,22,4.87,23,3.782,24,6.406,25,1.412,32,2.849,33,1.741,34,3.083,35,3.861,36,7.024,37,2.26,53,5.687,84,9.903,87,4.679,151,4.154,230,4.253,289,9.878,297,5.265,308,4.358,375,7.024,382,6.923,401,6.031,489,10.022,539,6.263,674,4.931,675,6.263,718,5.464,738,8.705,874,8.228,894,5.16,901,5.14,940,8.18,1028,7.765,1636,9.422,1708,9.256,2253,6.371,2254,12.02,2502,6.692,2964,10.554,3019,11.284,4029,7.024,6234,11.783,6235,19.637,6236,13.464]],["keywords/1211",[]],["title/1212",[97,475.083,241,503.001,2255,965.11]],["content/1212",[14,5.77,22,5.321,23,4.009,25,1.348,32,3.248,37,4.054,45,5.751,53,8.564,97,5.389,98,8.685,154,5.642,184,3.329,189,7.837,370,9.665,373,3.958,515,7.58,723,10.378,874,6.805,2253,11.426,2255,14.459,4029,10.576,6234,17.742,6237,17.795]],["keywords/1212",[]],["title/1213",[4,99.401,53,405.208,171,250.496,843,434.208,2253,453.912,4178,839.484]],["content/1213",[4,2.394,6,1.175,14,4.56,19,3.637,22,3.184,23,3.521,25,0.807,32,2.567,37,2.037,53,9.236,86,4.902,98,5.197,103,5.406,117,11.218,124,6.461,171,4.505,184,2.631,186,3.586,187,7.455,198,3.241,217,4.333,240,2.709,280,7.738,289,8.024,322,4.46,401,5.434,425,4.364,438,4.543,452,5.611,543,4.492,549,6.376,572,4.333,579,7.844,674,6.319,772,5.032,773,7.912,785,3.699,843,9.087,874,7.648,894,4.649,1377,5.675,1388,7.738,1646,8.075,1827,6.805,2253,10.347,2254,9.764,2255,8.652,2353,8.652,4029,6.329,4178,15.097,4432,10.167,5408,11.218,6228,9.253,6234,15.097,6238,12.131]],["keywords/1213",[]],["title/1214",[58,389.113,99,374.253,506,575.999,874,471.004,1052,858.926]],["content/1214",[4,2.352,6,1.617,7,5.213,25,1.11,33,2.531,37,2.803,51,5.432,53,4.896,58,6.116,73,5.919,84,10.445,87,6.802,94,7.209,98,4.965,99,5.883,100,6.184,101,14.613,202,3.566,204,5.485,210,15.109,230,3.662,264,3.36,287,5.761,289,5.391,294,9.371,297,3.288,308,7.348,323,6.39,381,3.74,389,5.96,395,4.874,408,3.835,421,6.003,496,4.684,504,8.678,506,9.054,552,6.092,579,7.494,582,6.502,785,3.535,873,6.965,874,8.678,886,4.141,901,4.425,1052,9.371,1124,7.494,1718,8.438,1931,7.299,3563,7.969,3921,9.086,3924,10.719,3925,10.719,3927,10.719,6239,11.591]],["keywords/1214",[]],["title/1215",[65,211.691,87,224.451,98,454.945,219,240.08,287,321.043,308,209.074,395,446.538,873,388.084,874,286.357]],["content/1215",[4,1.386,6,1.295,65,4.385,70,5.161,84,9.859,87,7.932,98,11.386,176,4.882,196,4.164,219,4.972,230,4.226,246,4.226,287,6.649,293,3.745,308,6.851,326,10.486,375,6.979,395,10.877,396,4.371,420,8.128,447,11.785,482,7.313,723,9.045,785,4.08,872,6.738,873,11.101,874,9.383,1106,11.211,1160,6.784,1987,10.204,2118,9.045,2136,12.929,3236,10.486,5544,12.37,6197,12.37,6240,13.378]],["keywords/1215",[]],["title/1216",[222,369.003,857,695.85,874,599.958]],["content/1216",[20,9.173,98,10.407,287,10.179,304,10.315,308,6.629,395,8.611,873,12.305,6241,20.48,6242,20.48,6243,20.48]],["keywords/1216",[]],["title/1217",[408,518.75,652,750.686]],["content/1217",[]],["keywords/1217",[]],["title/1218",[581,790.783]],["content/1218",[22,5.186,23,4.226,24,4.069,32,3.577,34,2.699,37,3.992,40,4.5,151,6.096,161,3.724,162,5.975,164,3.702,183,3.713,205,3.063,206,6.016,272,5.026,275,3.925,298,5.784,572,4.211,652,10.94,771,4.723,776,8.045,777,8.805,845,7.73,996,5.336,1339,8.85,1617,11.259,1726,9.09,1872,6.34,2203,7.73,2638,8.992,4928,14.791,6244,16.902,6245,11.788,6246,16.902,6247,11.788,6248,16.902,6249,16.902]],["keywords/1218",[]],["title/1219",[240,302.163,581,574.278,1055,672.63]],["content/1219",[2,4.153,4,1.175,18,3.788,22,5.073,23,4.151,24,3.914,32,4.091,33,2.5,34,4.426,37,3.559,45,3.217,49,5.334,87,3.94,114,4.778,151,3.498,184,2.459,198,5.164,240,4.316,246,3.582,272,4.834,382,5.831,385,4.153,408,3.752,413,5.872,423,6.968,504,5.027,580,5.216,652,10.15,777,8.614,843,5.132,845,7.436,1055,9.609,1582,8.44,1595,7.052,1612,12.233,3586,6.539,3593,10.939,3813,6.889,3923,8.44,4585,9.167,4963,13.774,6250,11.339,6251,17.876,6252,10.485,6253,11.339,6254,11.339,6255,15.198,6256,10.485]],["keywords/1219",[]],["title/1220",[241,503.001,1339,606.144,1617,705.951]],["content/1220",[4,1.404,23,4.164,32,4.509,33,1.752,34,4.268,37,3.13,154,4.982,161,5.889,164,4.256,167,5.89,193,5.43,205,3.521,217,4.841,241,5.037,246,4.281,427,6.853,572,4.841,590,5.778,652,10.202,901,5.173,1339,6.07,1617,7.07,2175,13.875,3586,7.816,3593,9.02,3778,12.803,3781,13.592,3813,8.233,4963,11.357,6251,12.531,6252,12.531,6255,12.531,6256,12.531,6257,13.552,6258,13.552,6259,13.552,6260,13.552,6261,13.552]],["keywords/1220",[]],["title/1221",[408,518.75,1843,1000.13]],["content/1221",[]],["keywords/1221",[]],["title/1222",[4,140.222,45,383.895,1843,863.219]],["content/1222",[4,1.642,5,1.766,6,1.535,16,4.205,18,2.732,19,2.452,20,3.663,22,4.16,23,4.316,24,2.823,25,0.544,32,3.354,33,2.523,34,1.872,35,2.345,36,4.266,37,2.156,52,4.367,63,1.793,65,2.68,67,3.291,69,4.008,87,2.842,107,2.009,111,3.086,122,3.59,193,3.277,198,3.43,224,5.444,273,1.793,275,4.275,287,4.065,329,5.721,330,3.087,334,2.358,381,2.639,408,7.164,427,3.006,435,3.742,460,6.238,467,4.539,514,4.602,557,6.298,659,3.762,694,6.382,765,2.68,776,6.111,777,3.644,843,3.702,886,2.921,940,4.969,958,3.783,1169,3.742,1204,4.205,1526,7.018,1628,7.553,1713,6.961,1843,15.597,1872,6.905,1984,5.217,2121,5.026,4029,4.266,6262,11.872,6263,12.839]],["keywords/1222",[]],["title/1223",[408,518.75,2492,952.558]],["content/1223",[]],["keywords/1223",[]],["title/1224",[581,790.783]],["content/1224",[]],["keywords/1224",[]],["title/1225",[12,546.69,2492,952.558]],["content/1225",[4,1.626,7,4.9,12,5.473,22,5.399,23,4.205,25,1.368,37,2.635,40,5.992,52,4.325,98,6.724,193,6.289,287,7.802,408,7.594,432,8.249,920,8.312,1628,12.104,2253,10.86,4028,13.502,4029,8.188,4708,14.514,6237,16.127,6264,13.736]],["keywords/1225",[]],["title/1226",[12,546.69,289,729.273]],["content/1226",[4,1.327,14,4.813,22,5.426,23,4.31,24,6.185,25,1.192,32,2.709,33,1.655,34,2.931,35,3.671,36,6.679,37,2.149,50,7.057,52,3.527,98,5.484,109,8.277,174,7.61,193,5.129,432,6.728,467,6.334,557,5.087,580,5.889,630,4.706,656,7.61,777,5.705,1094,11.203,1401,9.13,2253,8.479,2255,12.78,2492,7.778,2733,9.13,4028,7.531,4029,6.679,6231,9.319,6265,16.57,6266,11.838,6267,11.838,6268,12.802,6269,12.802,6270,11.838,6271,11.838]],["keywords/1226",[]],["title/1227",[97,475.083,2226,1060.767,2253,640.323]],["content/1227",[4,2.06,7,5.319,22,4.472,23,4.108,24,5.882,25,1.443,29,4.946,32,2.523,33,1.542,34,2.73,35,3.419,36,6.22,37,2.002,45,3.382,89,7.508,98,9.294,122,5.233,186,3.524,198,3.185,223,6.131,238,8.062,298,5.851,432,6.266,552,6.266,580,7.839,642,5.341,656,10.129,763,6.088,843,5.397,1168,7.819,1180,7.164,1261,10.87,2023,5.814,2226,9.346,2253,9.409,2255,14.181,2492,7.244,2516,12.683,2969,8.062,3680,12.998,3790,8.343,4029,6.22,6231,8.679,6232,14.912,6265,15.757,6272,15.757,6273,11.025,6274,11.923]],["keywords/1227",[]],["title/1228",[97,475.083,241,503.001,2253,640.323]],["content/1228",[4,1.865,37,3.022,97,6.32,98,9.621,152,3.584,241,6.691,243,8.281,373,4.643,398,6.742,432,9.461,745,9.841,993,8.671,1124,11.639,1263,12.839,1586,14.111,1617,9.391,1989,13.399,2253,12.129,2255,12.839,3715,11.639,6237,14.111]],["keywords/1228",[]],["title/1229",[172,780.453,427,497.46,2492,822.159]],["content/1229",[4,1.898,22,4.808,37,3.075,46,5.93,98,7.847,151,5.652,154,6.734,161,5.787,162,6.476,171,4.783,241,6.809,348,10.368,378,11.007,381,5.911,427,6.734,2079,10.465,2131,11.007,2253,10.743,2492,11.129,3586,10.565,6231,16.527]],["keywords/1229",[]],["title/1230",[171,353.369,1256,765.941,1257,619.122]],["content/1230",[7,5.256,14,6.33,37,2.827,53,9.095,63,3.692,88,7.383,116,6.953,171,5.622,177,8.658,198,5.752,289,7.832,330,4.048,413,8.72,432,11.316,490,8.555,512,6.892,566,14.802,843,9.746,1256,9.53,1257,7.703,1298,10.117,1339,7.542,2253,10.188,2254,9.53]],["keywords/1230",[]],["title/1231",[184,340.004,2492,952.558]],["content/1231",[4,1.086,22,5.359,23,4.237,24,5.356,25,1.229,32,3.91,33,1.356,34,3.553,35,3.006,36,5.469,37,2.605,52,2.888,53,6.554,63,3.403,73,5.353,85,5.049,107,2.575,184,4.727,198,2.8,223,5.39,242,5.779,289,7.217,298,5.144,311,4.491,361,5.88,373,4.002,381,3.383,408,5.134,413,5.429,432,5.509,452,4.849,467,3.706,747,7.476,780,5.551,843,7.024,886,6.599,1124,6.778,1142,7.631,1276,5.551,1343,6.231,2106,6.046,2253,8.741,2254,8.783,2492,6.369,3726,6.687,4028,9.128,4029,8.095,4822,6.231,6237,12.163,6264,9.174,6275,10.483,6276,10.483,6277,18.474,6278,10.483]],["keywords/1231",[]],["title/1232",[703,695.225]],["content/1232",[51,5.208,199,10.42,308,7.045,539,10.123,2492,13.222]],["keywords/1232",[]],["title/1233",[3769,1421.376]],["content/1233",[4,2.577,25,1.24,45,5.29,53,7.876,87,6.48,88,6.393,408,6.169,423,14.107,427,6.855,432,9.8,747,13.298,843,8.44,1074,10.193,2253,11.768,3006,21.226]],["keywords/1233",[]],["title/1234",[408,616.535]],["content/1234",[]],["keywords/1234",[]],["title/1235",[73,800.578,1378,975.122]],["content/1235",[4,2.583,23,3.423,37,3.77,51,3.594,52,4.138,87,7.804,97,7.015,100,8.316,101,13.142,103,6.692,142,8.834,275,6.654,325,10.509,404,11.455,405,7.722,408,7.921,440,6.946,506,8.142,508,9.456,527,7.722,607,8.142,763,11.467,958,6.946,1029,10.931,1663,8.35,2000,11.178,4426,12.585,6279,15.017,6280,15.017]],["keywords/1235",[]],["title/1236",[19,469.995,323,864.293]],["content/1236",[19,6.139,25,1.362,171,5.348,193,8.205,222,5.584,322,7.528,323,11.289,400,9.221,408,6.776,484,11.487,639,9.747]],["keywords/1236",[]],["title/1237",[5,229.359,6,102.858,51,254.223,61,571.393,932,483.439]],["content/1237",[4,2.016,5,3.576,6,2.063,22,5.592,23,4.05,24,3.957,25,0.762,32,2.426,34,2.625,36,5.98,37,3.794,44,3.192,51,2.743,52,4.564,53,4.842,97,4.025,155,3.417,193,4.593,215,6.025,222,3.126,234,5.303,264,3.323,329,5.108,480,6.998,580,5.273,637,6.549,659,5.273,673,5.98,694,5.698,718,4.652,742,9.644,765,6.375,891,6.319,932,7.538,958,5.303,963,4.428,993,5.522,1121,7.412,1262,7.045,1377,5.362,1894,12.636,1895,8.744,2023,5.59,2107,10.601,4028,9.746,4029,5.98,4081,15.318,4082,10.601,6281,11.464,6282,11.464,6283,15.318,6284,8.986,6285,8.744]],["keywords/1237",[]],["title/1238",[149,561.321,273,296.762,1207,780.453]],["content/1238",[4,1.717,6,1.11,7,3.579,12,3.997,15,6.676,22,5.592,23,4.05,24,3.957,25,1.417,32,2.426,33,1.482,34,2.625,36,5.98,37,4.077,52,3.159,136,6.611,149,4.755,193,4.593,198,3.062,273,3.633,275,5.516,301,2.613,322,4.214,368,7.219,373,4.272,381,3.699,391,5.774,396,3.745,512,4.693,514,6.973,637,6.549,736,4.293,786,8.333,936,5.698,1030,5.625,1058,5.937,1843,10.567,2252,6.965,2253,9.204,2900,11.026,4028,9.746,4029,11.115,6092,14.497,6228,12.636,6231,8.345,6262,15.318,6286,11.464,6287,10.032]],["keywords/1238",[]],["title/1239",[230,335.617,440,491.403,674,389.113,675,494.15,692,542.465]],["content/1239",[2,7.967,4,2.067,5,2.589,6,2.106,10,4.745,22,5.235,23,3.96,24,4.139,25,1.327,32,2.538,34,2.746,36,6.256,37,4.015,149,4.974,193,4.805,198,3.203,215,6.302,230,3.788,275,3.993,289,7.958,323,6.61,440,5.547,507,7.458,514,6.133,520,7.745,673,6.256,674,4.392,675,9.279,692,6.123,786,5.137,859,9.147,874,5.316,890,8.552,1339,5.371,1614,8.737,1850,8.552,2253,9.439,2254,9.684,2900,7.982,4029,10.406,4583,13.051,6092,14.973,6235,15.822]],["keywords/1239",[]],["title/1240",[40,516.562,188,759.062,408,447.737]],["content/1240",[]],["keywords/1240",[]],["title/1241",[2,682.507]],["content/1241",[2,7.286,3,9.151,4,2.061,5,4.295,6,2.312,7,6.21,12,6.936,15,11.586,37,3.34,222,5.424,510,10.088,674,7.286,1030,9.762]],["keywords/1241",[]],["title/1242",[275,620.473]],["content/1242",[5,3.99,6,1.789,25,1.229,37,3.103,51,4.422,53,7.806,114,5.373,162,6.533,171,4.826,191,5.556,222,5.039,275,7.601,308,5.982,408,6.115,527,9.503,674,6.769,886,6.602,958,8.548,1261,11.789,3990,13.756,5386,17.09]],["keywords/1242",[]],["title/1243",[23,238.957,52,432.005]],["content/1243",[4,2.061,37,3.34,52,6.579,63,4.362,67,8.004,85,9.582,114,5.783,222,5.424,368,12.526,408,6.582,510,10.088,674,7.286,874,8.819]],["keywords/1243",[]],["title/1244",[23,238.957,874,695.115]],["content/1244",[2,7.018,4,1.985,25,1.274,37,3.217,51,4.585,53,8.094,63,4.202,85,9.229,87,6.658,98,8.208,114,5.57,222,5.225,308,6.202,395,8.057,408,6.34,516,9.853,674,7.018,874,8.495]],["keywords/1244",[]],["title/1245",[23,206.245,84,722.133,94,841.635]],["content/1245",[4,2.101,12,7.071,21,11.696,25,1.349,37,3.405,84,10.822,85,9.769,94,12.613,222,5.53,504,8.991,674,7.428,1051,15.897]],["keywords/1245",[]],["title/1246",[37,227.19,45,383.895,370,852.135]],["content/1246",[2,5.96,4,2.183,5,3.051,6,1.083,7,2.148,10,2.723,12,7.344,23,2.728,25,0.94,33,1.446,37,3.393,40,2.627,44,1.916,45,4.008,51,3.381,52,1.896,63,3.569,65,2.255,69,2.148,73,3.514,79,3.644,149,5.861,152,2.227,182,2.232,192,2.314,198,3.775,222,5.512,223,3.539,224,3.391,230,2.174,235,4.28,272,2.934,273,1.509,275,4.705,285,4.731,286,4.229,287,3.42,288,3.398,289,7.569,301,1.568,370,12.078,371,8.489,373,3.644,378,4.135,382,3.539,396,3.654,399,3.762,408,7.975,413,3.564,427,4.112,452,3.183,504,3.051,506,8.823,507,4.28,510,3.49,512,6.661,514,5.065,556,2.458,557,2.734,652,8.571,674,7.403,785,2.099,786,2.948,843,3.115,888,5.835,983,6.649,996,3.115,1028,3.969,1058,3.564,1160,3.49,1388,7.135,1444,3.256,1614,5.711,1615,6.363,1617,3.59,1628,4.048,1633,6.389,1716,4.908,1827,3.86,1843,10.38,2183,5.009,2253,8.47,2254,3.895,2281,7.445,2483,5.394,2492,6.795,2638,5.249,2900,7.445,3092,5.122,3153,9.374,3921,5.394,3922,5.767,6288,11.185,6289,6.882]],["keywords/1246",[]],["title/1247",[37,199.834,114,346.026,1102,885.975,1103,832.941]],["content/1247",[4,2.242,5,2.559,23,1.807,25,1.439,33,1.533,37,3.844,52,3.266,58,4.342,63,4.745,99,4.176,100,6.285,110,5.229,114,6.291,140,9.293,142,6.974,206,6.041,222,6.244,240,3.789,260,10.265,293,5.549,370,7.465,382,10.192,408,6.558,414,4.634,428,9.128,504,5.256,506,6.428,508,12.482,548,7.465,555,7.373,556,4.235,557,4.71,674,8.387,894,7.596,932,9.02,2112,11.129,2709,9.935,2931,12.632,4616,12.353,6290,11.855]],["keywords/1247",[]],["title/1248",[25,104.266,2389,1313.99]],["content/1248",[]],["keywords/1248",[]],["title/1249",[274,1013.728,417,705.949]],["content/1249",[4,1.395,14,5.061,16,6.923,23,4.056,25,0.895,32,2.849,33,2.746,51,3.222,100,4.986,114,5.395,152,2.681,164,4.228,186,3.98,187,8.275,196,4.191,205,3.498,206,4.793,217,4.81,230,4.253,273,5.265,274,8.705,341,8.004,381,4.345,416,8.962,417,9.562,437,5.284,467,4.76,554,6.447,785,4.106,804,6.525,818,10.022,857,6.923,975,9.981,1526,7.36,1749,10.27,2175,10.022,2308,8.478,2560,8.829,3447,12.45,3476,12.45,3778,8.09,4515,8.374,4807,14.547,6291,13.464]],["keywords/1249",[]],["title/1250",[33,153.915,240,265.779,288,587.825,417,535.943]],["content/1250",[4,1.512,25,0.971,30,6.867,33,3.06,53,8.282,63,4.3,65,4.784,154,5.366,155,4.351,182,4.722,205,3.792,206,6.979,240,4.943,273,3.201,288,7.208,334,4.209,364,7.914,373,6.104,417,8.828,499,7.671,543,8.198,659,6.714,773,5.752,785,5.979,1173,8.677,1339,8.782,1554,10.214,2136,10.214,2288,13.256,6292,14.596,6293,14.596,6294,14.596]],["keywords/1250",[]],["title/1251",[297,444.782,300,864.293]],["content/1251",[4,2.197,33,2.126,44,4.577,114,4.779,125,8.39,155,6.32,177,8.453,273,5.147,274,10.629,300,9.062,301,4.832,304,8.28,373,4.24,375,8.576,381,6.842,417,7.402,483,8.842,491,11.967,515,8.118,737,5.527,771,6.587,773,6.478,1169,7.521,1633,9.391,2023,10.339,3715,10.629,4807,12.886,6295,16.439]],["keywords/1251",[]],["title/1252",[273,343.83,2781,1167.014]],["content/1252",[4,1.59,7,4.791,14,5.77,19,4.601,23,3.931,69,4.791,70,3.743,72,7.306,111,7.65,114,4.462,192,5.16,217,5.483,273,5.296,322,5.642,382,7.893,385,5.622,417,6.911,421,7.949,486,9.124,510,7.784,773,6.049,804,9.825,1165,13.295,1310,8.939,2049,9.924,2303,8.255,2781,11.425,2927,12.766,4807,12.032,6296,15.349,6297,20.274,6298,15.349]],["keywords/1252",[]],["title/1253",[114,393.395,152,269.421,414,528.967]],["content/1253",[6,1.908,25,1.31,33,2.548,152,4.726,224,5.975,276,11.972,381,6.359,414,7.702,659,9.064,737,6.625,785,6.009,1650,11.713,1651,11.364,1990,14.667]],["keywords/1253",[]],["title/1254",[7,371.572,46,385.295,288,587.825,572,425.189]],["content/1254",[]],["keywords/1254",[]],["title/1255",[561,876.641]],["content/1255",[]],["keywords/1255",[]],["title/1256",[981,1064.513]],["content/1256",[]],["keywords/1256",[]],["title/1257",[4,140.222,300,745.978,552,711.201]],["content/1257",[114,5.519,152,3.78,161,5.998,171,4.958,177,9.763,272,8.095,273,5.09,300,10.466,322,6.979,417,8.549,630,6.979,732,6.643,910,7.639,1219,9.145,1650,11.286,2098,11.956,2165,12.837,2842,15.912]],["keywords/1257",[]],["title/1258",[501,958.188]],["content/1258",[25,1.31,46,8.247,152,3.923,181,5.25,225,7.064,277,11.364,278,5.304,379,9.015,381,6.359,501,10.132,659,9.064,6299,19.705,6300,19.705]],["keywords/1258",[]],["title/1259",[1021,1002.228]],["content/1259",[46,7.195,184,4.82,421,11.512]],["keywords/1259",[]],["title/1260",[334,452.062,765,513.868]],["content/1260",[6,2.107,205,5.655,435,9.957,2116,18.239,6301,21.763]],["keywords/1260",[]],["title/1261",[]],["content/1261",[]],["keywords/1261",[]],["title/1262",[408,518.75,2253,741.882]],["content/1262",[]],["keywords/1262",[]],["title/1263",[12,546.69,2253,741.882]],["content/1263",[4,1.731,22,5.622,23,4.246,25,1.424,37,2.804,40,6.376,52,5.902,193,6.692,408,7.087,920,8.845,1628,9.826,2253,10.136,4028,12.601,4029,11.174,6237,16.791,6264,14.617]],["keywords/1263",[]],["title/1264",[12,546.69,289,729.273]],["content/1264",[4,1.395,14,5.061,22,4.87,23,4.311,24,6.406,25,1.234,32,2.849,33,1.741,34,3.083,35,3.861,36,7.024,37,2.26,50,7.422,98,5.768,109,8.705,174,8.004,193,5.395,467,6.56,557,5.35,580,6.194,630,4.95,656,8.004,1094,11.783,1401,9.602,2253,10.048,2255,9.602,2733,9.602,4029,7.024,6228,14.156,6231,9.801,6266,12.45,6267,12.45,6270,12.45,6271,12.45,6287,11.783,6302,13.464]],["keywords/1264",[]],["title/1265",[97,475.083,2226,1060.767,2253,640.323]],["content/1265",[4,2.08,7,5.385,22,4.528,23,4.12,24,5.955,25,1.454,29,5.032,32,2.567,33,1.569,34,2.778,35,3.479,36,6.329,37,2.037,45,3.441,89,7.639,98,9.367,122,5.325,186,3.586,198,3.241,223,6.238,238,8.202,298,5.953,552,6.376,580,7.936,642,5.434,656,10.255,763,6.194,843,5.491,1168,7.955,1180,7.289,1261,11.005,2023,5.916,2226,9.509,2253,9.5,2255,12.304,2492,7.37,2516,12.841,2969,8.202,3680,13.159,3790,8.489,4029,6.329,6228,13.159,6231,8.831,6232,10.616,6272,11.218,6273,11.218,6303,12.131,6304,12.131]],["keywords/1265",[]],["title/1266",[97,475.083,241,503.001,2253,640.323]],["content/1266",[4,1.792,20,4.208,23,4.29,32,4.401,45,2.665,50,5.179,89,5.916,98,4.025,124,5.352,162,3.321,193,3.764,203,4.765,241,6.43,467,3.321,514,3.368,596,6.575,656,11.491,894,3.6,921,7.402,947,6.459,1028,5.419,1116,4.67,1143,6.075,1216,8.688,1224,5.472,1257,6.539,1261,5.993,1262,5.774,1263,13.786,1380,8.688,1586,11.204,1728,6.993,1872,5.053,2222,11.555,2253,6.763,2255,10.193,2677,6.575,3236,7.365,3849,8.222,3850,8.688,3851,8.222,3990,6.993,4069,8.688,4496,8.688,4646,8.688,4773,8.688,6226,8.688,6230,8.688,6305,9.396,6306,14.293,6307,9.396,6308,14.293,6309,14.293,6310,9.396,6311,14.293,6312,9.396,6313,9.396,6314,14.293,6315,14.293,6316,9.396,6317,14.293,6318,14.293,6319,9.396,6320,9.396,6321,9.396,6322,9.396,6323,9.396]],["keywords/1266",[]],["title/1267",[33,153.915,246,376.028,1713,645.355,2253,563.222]],["content/1267",[4,1.825,5,2.698,7,3.901,12,4.357,23,3.877,24,6.081,32,4.318,33,3.021,34,4.033,35,5.052,37,3.426,65,4.095,88,4.284,149,5.183,154,6.476,198,3.338,204,5.912,222,4.804,246,7,298,6.131,427,6.476,490,4.965,716,6.36,743,12.327,785,3.81,786,5.353,843,7.974,940,7.591,1058,6.471,1254,8.448,1398,7.868,2130,8.194,2222,10.102,2253,10.484,6228,16.901,6231,9.096,6287,10.935,6324,20.404,6325,12.495,6326,12.495]],["keywords/1267",[]],["title/1268",[172,780.453,427,497.46,2253,640.323]],["content/1268",[3,6.076,19,3.959,22,5.517,23,4.04,25,1.218,32,2.795,37,3.075,52,3.639,97,6.429,98,5.658,151,4.075,154,4.855,161,4.173,162,7.431,164,6.601,171,3.449,198,3.528,241,4.909,257,5.916,348,7.476,381,4.262,427,4.855,580,6.076,1147,7.281,1937,11.069,2079,7.545,2253,10.741,2264,12.214,2266,12.214,3586,7.617,4028,10.774,4029,9.554,6228,13.969,6231,15.302,6237,14.355,6327,13.208,6328,18.313,6329,13.208,6330,13.208]],["keywords/1268",[]],["title/1269",[100,580.619,408,518.75]],["content/1269",[]],["keywords/1269",[]],["title/1270",[37,227.19,63,296.762,689,739.744]],["content/1270",[6,1.433,7,4.621,12,5.162,29,6.141,37,3.996,53,6.253,84,7.9,85,7.131,86,5.982,100,9.453,114,4.304,175,9.207,264,5.738,271,5.251,325,13.85,368,9.322,389,7.612,393,7.962,421,7.667,437,5.81,467,5.233,504,6.563,506,10.731,524,9.708,567,9.708,673,7.723,675,6.886,859,11.292,875,7.839,937,6.465,940,8.994,1204,7.612,1261,9.443,1339,6.631,1628,8.709,1874,11.969,2430,12.407,2541,11.292,2969,10.009]],["keywords/1270",[]],["title/1271",[4,140.222,100,501.136,408,447.737]],["content/1271",[1,5.617,2,2.926,4,2.224,5,1.725,14,3.004,18,2.669,19,3.779,20,3.579,21,4.608,22,4.652,23,3.848,24,2.758,25,1.427,32,2.668,33,1.033,34,1.829,35,2.291,37,4.192,46,2.586,49,8.339,50,8.606,58,4.617,60,2.981,63,1.752,65,2.619,81,5.698,88,2.74,99,2.815,100,9.002,111,3.015,122,3.507,149,3.314,152,1.591,172,4.608,176,2.916,193,3.201,198,4.171,203,6.393,204,3.781,249,4.522,251,7.009,271,7.273,273,2.764,288,3.946,297,4.429,373,2.061,389,4.109,396,2.611,398,2.992,420,4.854,452,3.696,496,3.229,506,4.332,514,2.864,520,3.617,534,5.698,539,3.716,580,7.182,703,2.981,763,9.051,777,3.561,843,3.617,861,3.716,879,4.908,1077,4.522,1112,4.75,1168,5.24,1613,4.443,1697,4.522,1893,5.493,2969,5.402,3367,3.849,3659,6.696,3715,5.166,3811,11.032,3813,4.854,3814,10.238,4426,16.17,4428,6.992,6331,6.992,6332,7.389,6333,6.696,6334,7.389]],["keywords/1271",[]],["title/1272",[3814,1221.989]],["content/1272",[4,1.556,19,4.502,25,1.329,28,6.495,33,1.942,37,2.521,40,7.628,46,4.861,65,6.549,87,5.219,100,8.865,110,10.56,125,5.942,154,5.52,198,5.338,246,6.313,308,4.861,366,7.233,375,7.834,440,6.946,496,6.068,519,8.077,554,7.19,920,7.952,993,7.233,1038,9.34,1169,6.87,1444,7.106,2969,10.154,3563,10.324,3814,9.848,3992,11.455,4572,13.142,6331,13.142,6333,12.585,6335,15.017,6336,15.017]],["keywords/1272",[]],["title/1273",[4,99.401,65,314.404,100,537.699,110,423.155,408,317.391]],["content/1273",[]],["keywords/1273",[]],["title/1274",[28,514.812,251,661.815,581,505.129,3992,907.934]],["content/1274",[4,1.343,8,6.864,19,3.885,22,5.462,23,4.258,24,6.239,25,1.202,28,5.606,32,2.743,33,1.676,34,2.968,35,3.717,37,2.176,44,3.609,50,7.145,65,5.924,100,9.082,109,8.38,142,7.625,265,4.663,308,4.196,481,7.145,504,8.013,549,6.812,572,4.63,700,9.648,785,3.953,920,6.864,1613,7.207,1633,7.405,1893,12.426,3813,7.875,3814,8.5,3923,9.648,3992,13.787,4029,6.762,4572,11.343,4574,11.986,6337,12.962]],["keywords/1274",[]],["title/1275",[251,752.413,581,574.278,6333,1134.114]],["content/1275",[4,1.626,22,6.023,23,4.135,24,7.102,25,1.368,32,3.322,34,3.594,35,4.501,37,2.635,50,8.652,100,7.619,271,5.568,389,8.071,504,9.122,827,9.646,1613,8.727,1893,14.144,2969,10.613,2985,13.736,3813,9.536,3814,10.293,4029,8.188,6331,13.736,6332,14.514,6333,13.154,6334,14.514,6338,15.696]],["keywords/1275",[]],["title/1276",[51,323.825,492,914.982,581,574.278]],["content/1276",[4,1.937,6,1.036,10,4.233,22,5.412,23,4.065,24,5.437,25,1.048,28,4.627,32,3.956,33,1.383,34,3.606,35,3.068,37,2.644,50,8.683,51,4.474,52,4.34,63,2.346,86,4.323,100,9.62,109,6.917,110,4.719,251,5.948,289,4.976,319,4.767,373,2.759,391,5.388,396,3.495,491,7.788,492,12.64,580,4.921,672,6.654,689,5.848,859,8.16,874,6.983,940,6.5,1339,4.792,1613,5.948,1631,6.055,1893,10.829,2254,6.055,2444,6.5,2502,5.318,3813,6.5,3814,7.016,3992,8.16,4029,5.581,6339,21.981,6340,10.698,6341,10.698,6342,15.752,6343,10.698,6344,10.698,6345,10.698,6346,10.698,6347,10.698]],["keywords/1276",[]],["title/1277",[58,495.646,99,476.718,581,574.278]],["content/1277",[4,1.991,22,5.88,23,4.096,24,5.629,25,1.403,28,4.851,29,4.653,32,3.451,33,1.45,34,2.568,35,3.217,37,2.738,45,3.182,46,3.631,58,8.563,99,8.236,100,9.332,108,8.507,110,4.948,171,2.929,179,5.575,198,4.356,311,4.805,381,3.62,600,6.033,843,5.077,1256,9.229,1257,7.46,1378,11.949,1613,6.237,1893,14.5,3813,6.815,3814,10.693,4029,8.507,4794,10.372,6348,11.217,6349,16.306,6350,11.217,6351,11.217]],["keywords/1277",[]],["title/1278",[100,501.136,294,1094.088,581,574.278]],["content/1278",[4,2.292,22,6.067,23,4.126,24,7.171,25,1.382,32,3.372,34,3.648,35,4.569,37,2.675,46,3.517,100,8.561,167,4.722,175,6.758,271,7.37,294,18.691,308,3.517,493,9.909,516,5.587,545,3.01,567,7.125,677,14.787,827,6.678,901,4.148,1177,6.678,1256,9.018,1257,7.289,1613,8.858,1724,10.301,1893,14.283,2502,5.401,3742,8.785,3813,9.68,3814,10.448,4029,8.311,6352,15.932,6353,10.866,6354,10.866,6355,10.866,6356,10.866]],["keywords/1278",[]],["title/1279",[100,501.136,142,796.106,581,574.278]],["content/1279",[4,1.109,8,5.665,19,3.207,22,5.769,23,4.276,24,5.437,25,1.048,28,4.627,29,4.438,32,3.333,33,1.383,34,2.449,35,3.068,37,1.796,44,2.979,45,3.035,65,5.163,100,9.033,142,14.35,151,3.301,162,3.782,175,6.654,265,3.849,308,3.463,370,6.737,481,5.897,504,4.743,549,5.623,572,3.822,700,7.963,785,3.262,920,5.665,1586,8.386,1613,5.948,1633,6.112,1893,10.829,3786,9.362,3790,7.486,3791,9.362,3792,9.362,3793,9.362,3794,9.362,3795,9.362,3796,9.362,3798,9.362,3805,9.362,3812,13.784,3813,6.5,3814,7.016,3815,9.362,3923,7.963,4029,5.581,6357,10.698]],["keywords/1279",[]],["title/1280",[100,501.136,581,574.278,4615,1184.242]],["content/1280",[22,5.709,23,3.924,24,6.612,25,0.938,32,2.984,33,1.824,34,3.229,35,4.044,37,2.368,45,5.434,53,5.957,100,8.642,111,8.209,151,4.351,202,4.338,370,8.88,373,3.637,417,9.795,777,6.284,1089,8.133,1329,7.151,1613,7.841,1893,13.169,3813,8.568,3814,9.248,3839,13.04,3992,10.757,4615,21.354,6358,14.102,6359,14.102,6360,14.102,6361,19.155,6362,14.102,6363,14.102]],["keywords/1280",[]],["title/1281",[33,202.738,314,556.163]],["content/1281",[4,1.898,22,4.808,23,3.76,25,1.218,33,2.369,44,5.101,79,9.7,87,6.366,100,6.784,314,6.498,773,7.219,879,7.132,1255,14.81,3814,12.013,4029,9.556,6364,24.674,6365,18.319,6366,18.319,6367,18.319]],["keywords/1281",[]],["title/1282",[7,331.64,72,505.648,100,393.423,134,601.311,264,307.993]],["content/1282",[4,1.897,5,3.313,6,1.486,7,3.224,8,5.469,14,3.882,23,3.301,32,3.247,33,1.335,37,2.576,46,5.927,54,4.488,100,8.406,110,4.555,124,3.867,125,4.086,142,9.028,151,5.649,154,3.796,171,4.007,172,8.85,186,3.052,192,3.472,198,2.759,217,3.689,271,6.496,297,2.93,304,5.201,308,3.343,381,3.333,382,5.31,385,5.62,408,3.417,417,4.65,467,3.651,551,4.699,580,4.751,598,6.983,673,5.387,773,4.07,785,3.149,827,6.347,901,3.942,958,4.777,1257,7.021,1300,4.751,1377,7.178,1651,8.85,1765,6.588,1821,6.874,1893,13.936,1902,11.254,2979,6.983,2982,9.55,2983,9.55,2984,9.037,2985,9.037,3007,8.655,3367,7.392,3375,6.874,3814,10.063,3815,13.429,4426,8.655,5291,8.655,6368,15.345,6369,10.327,6370,15.345,6371,10.327,6372,10.327,6373,10.327,6374,10.327,6375,15.345]],["keywords/1282",[]],["title/1283",[1021,1002.228]],["content/1283",[33,2.874,58,8.141,99,7.83]],["keywords/1283",[]],["title/1284",[45,383.895,1102,1007.258,1103,946.964]],["content/1284",[1,8.778,4,2.041,25,1.578,45,4.17,49,6.915,54,6.388,58,5.384,99,6.939,167,8.561,171,3.838,184,4.272,202,4.522,232,8.738,255,5.991,295,12.106,362,9.939,408,4.863,438,7.377,440,6.799,515,7.259,517,10.68,557,5.84,622,5.965,631,8.561,915,10.941,936,7.306,954,7.725,1102,10.941,1103,10.286,1196,9.639,1327,7.844,1889,9.256,4039,12.864,6376,14.699,6377,14.699,6378,14.699,6379,14.699,6380,14.699,6381,14.699,6382,14.699]],["keywords/1284",[]],["title/1285",[765,513.868,2023,764.557]],["content/1285",[]],["keywords/1285",[]],["title/1286",[2023,764.557,6285,1195.939]],["content/1286",[4,1.523,22,5.17,23,4.082,24,5.074,32,4.169,34,3.366,35,4.215,37,3.73,50,8.103,62,6.297,97,5.16,103,6.55,246,4.644,275,4.894,289,6.837,325,10.286,355,5.793,371,7.668,404,11.212,408,4.863,765,4.818,776,9.376,777,6.55,958,6.799,1628,8.647,2023,11.574,2116,12.319,2118,9.939,3333,11.884,6283,18.216,6284,11.522,6285,15.026,6383,12.864]],["keywords/1286",[]],["title/1287",[765,443.523,2023,659.894,2766,1032.224]],["content/1287",[4,2.238,14,5.23,22,4.981,23,4.036,24,4.803,32,4.017,34,3.186,35,3.99,37,3.627,63,3.051,217,4.97,246,4.396,275,4.633,289,6.472,298,6.828,355,5.483,371,7.258,396,4.546,408,4.604,559,8.875,765,6.221,776,9.034,777,6.2,932,6.332,1191,8.875,1628,8.185,1704,8.762,2023,11.844,2766,14.478,6284,10.907,6285,10.613,6383,12.176,6384,21.603,6385,13.914,6386,18.981]],["keywords/1287",[]],["title/1288",[217,483.395,2023,908.117]],["content/1288",[4,1.502,22,5.121,23,4.07,24,5.003,32,4.13,34,3.319,35,4.157,37,3.704,45,4.112,148,8.359,217,8.43,275,4.826,289,6.742,297,4.112,355,5.712,371,7.561,408,4.796,765,4.751,776,9.288,777,6.459,1090,11.056,1134,8.204,1628,8.527,1711,9.505,2023,12.854,3830,10.789,6284,11.362,6383,12.685,6387,19.514]],["keywords/1288",[]],["title/1289",[241,582.779,1224,913.126]],["content/1289",[33,2.572,111,9.009,198,5.314,241,7.394,293,5.568,458,9.253,765,6.52,901,7.594,1224,14.899,2023,9.701,2489,14.481]],["keywords/1289",[]],["title/1290",[241,503.001,1224,788.126,6285,1032.224]],["content/1290",[22,4.684,23,4.151,32,3.777,155,5.32,164,5.605,580,8.21,630,6.561,737,6,773,7.033,2023,8.703,2489,12.992,2819,15.619,3503,13.285,6284,13.99,6285,17.04,6388,22.339,6389,17.848,6390,16.504]],["keywords/1290",[]],["title/1291",[241,442.435,765,390.118,1224,693.228,2766,907.934]],["content/1291",[22,4.85,23,4.126,151,5.702,155,5.509,161,5.838,580,8.501,737,6.213,765,6.057,773,7.283,2489,13.453,2766,14.097,2819,16.173,3503,13.756,6284,14.487,6390,17.09,6391,18.481,6392,18.481]],["keywords/1291",[]],["title/1292",[63,296.762,689,739.744,2023,659.894]],["content/1292",[2,7.468,4,1.432,5,1.941,6,0.87,7,2.806,10,5.468,12,3.135,20,4.027,23,1.37,25,0.919,37,3.423,45,2.55,51,2.151,52,5.205,54,3.907,63,1.971,97,5.909,107,3.394,110,3.966,113,4.182,114,2.613,136,5.185,156,4.761,204,4.254,230,2.84,271,3.189,301,3.149,308,2.91,321,5.525,467,3.178,507,5.591,568,5.289,673,4.69,674,3.293,765,5.517,787,9.156,958,8.738,1030,4.412,1033,6.544,1077,5.088,1261,5.735,1412,8.313,1614,4.59,1694,6.291,1706,5.895,1826,6.857,2023,9.212,2094,6.692,2183,10.059,2281,5.984,2287,8.313,2427,6.857,2445,21.89,2692,15.064,2766,12.839,3595,12.778,4652,6.291,5317,8.313,6285,12.839,6393,8.99,6394,8.99,6395,8.99,6396,8.99,6397,8.99,6398,8.99,6399,8.99,6400,8.99,6401,8.99,6402,8.99,6403,13.819,6404,8.99,6405,8.99,6406,8.99,6407,8.99,6408,8.99,6409,8.99,6410,8.99,6411,8.99,6412,8.99,6413,8.99,6414,8.99,6415,8.99,6416,8.99,6417,8.99,6418,8.99,6419,8.99,6420,8.99,6421,8.99,6422,8.99]],["keywords/1292",[]],["title/1293",[4,123.338,52,327.97,381,384.109,391,599.526]],["content/1293",[]],["keywords/1293",[]],["title/1294",[513,932.002,6045,1229.009]],["content/1294",[4,1.094,5,2.906,6,0.621,14,2.412,20,2.874,22,1.684,23,4.228,25,0.427,32,4.151,34,1.469,40,2.449,44,4.344,52,3.709,60,6.435,63,2.952,70,1.565,103,2.859,107,1.576,124,3.955,134,3.631,148,3.7,152,2.68,154,3.882,161,2.027,162,3.733,164,4.227,166,3.478,171,1.675,179,3.189,198,2.821,229,5.924,273,2.316,319,2.859,334,1.85,373,1.654,398,2.402,402,3.7,408,2.123,457,4.338,474,3.7,496,2.592,512,5.51,513,11.66,519,3.45,531,3.507,543,6.388,557,2.549,580,2.951,648,4.04,663,3.536,674,2.35,706,5.393,737,3.551,758,2.775,771,5.393,891,3.536,894,2.458,901,4.031,926,3.276,936,3.189,958,4.885,975,9.979,1030,3.148,1066,3.423,1110,3.665,1207,3.7,1257,6.158,1354,3.898,1417,3.507,1444,6.369,1588,5.029,1595,3.99,1765,4.092,1804,5.932,2259,5.614,2303,3.45,2483,5.029,2583,5.029,2779,3.943,2959,5.932,2960,14.427,2995,5.029,3000,5.932,3001,5.932,3646,8.851,3684,6.346,5110,14.427,5113,5.932,5737,5.614,6045,12.23,6053,5.376,6168,9.242,6423,6.415,6424,6.415,6425,5.932,6426,10.561,6427,6.415,6428,6.415,6429,6.415,6430,6.415,6431,6.415,6432,5.932,6433,6.415,6434,6.415,6435,6.415,6436,6.415,6437,6.415,6438,6.415,6439,6.415,6440,6.415,6441,6.415,6442,6.415,6443,6.415,6444,6.415,6445,6.415,6446,6.415,6447,6.415]],["keywords/1294",[]],["title/1295",[52,432.005,1843,1000.13]],["content/1295",[4,1.721,5,4.608,6,0.852,20,3.942,25,0.585,33,2.148,45,2.496,51,2.106,52,3.745,60,3.283,61,4.733,63,2.981,65,2.884,69,4.243,103,6.057,149,6.889,152,3.719,154,3.235,192,2.959,205,2.287,206,4.839,215,4.625,219,5.053,223,4.525,228,3.843,230,2.78,240,4.171,246,4.294,249,4.981,272,7.965,273,3.642,301,2.006,334,2.537,357,6.276,373,4.283,381,2.84,385,3.223,393,4.733,401,3.942,405,6.99,420,8.258,428,4.733,452,4.071,512,3.602,513,8.08,543,6.15,577,5.473,638,5.075,673,8.664,674,3.223,703,3.283,716,3.177,736,5.091,771,3.526,785,2.684,786,5.823,894,3.372,901,3.359,921,4.558,940,5.347,1026,6.713,1074,7.431,1119,5.075,1444,7.859,1526,4.811,1548,5.614,1602,5.347,1843,15.877,2010,10.99,2043,9.895,2146,6.406,2250,6.898,2252,5.347,2483,6.898,2721,12.57,2886,6.05,3019,7.375,3094,7.701,4643,6.898,6045,6.898,6448,13.593,6449,8.8,6450,8.8,6451,8.8,6452,8.8,6453,8.8,6454,8.8,6455,8.8]],["keywords/1295",[]],["title/1296",[60,584.959,241,582.779]],["content/1296",[4,1.881,6,1.107,19,2.119,23,4.08,25,0.47,32,3.045,37,1.187,44,1.968,52,3.965,60,9.592,63,3.156,70,1.724,111,2.667,118,5.924,122,3.102,124,4.281,134,6.47,152,2.865,198,1.888,204,3.345,215,3.715,223,7.4,228,3.087,229,6.411,230,2.233,241,8.391,272,7.048,273,2.507,298,3.468,349,4.57,373,3.711,375,3.687,381,4.644,401,3.166,407,3.447,408,2.339,413,3.661,420,4.294,512,5.89,513,8.554,519,6.148,520,3.199,556,2.525,557,4.542,569,3.468,580,3.251,637,4.038,688,4.294,716,2.552,736,4.281,737,5.558,771,6.623,773,5.671,774,3.864,787,3.426,911,4.509,975,9.762,1219,3.405,1257,5.229,1327,3.772,1345,4.396,1417,3.864,1444,3.345,1526,3.864,1633,4.038,1931,4.451,2228,5.392,2583,5.541,2717,5.392,2783,4.294,2886,9.893,2992,13.307,3223,8.508,3646,12.06,3684,4.247,3923,5.261,5698,6.186,6045,11.28,6168,12.593,6425,10.57,6432,10.57,6456,7.068,6457,14.39,6458,7.068,6459,7.068,6460,7.068,6461,7.068,6462,7.068]],["keywords/1296",[]],["title/1297",[1609,1267.615,2524,1372.068]],["content/1297",[4,1.481,51,3.421,52,3.939,61,7.689,63,4.804,70,3.486,85,6.886,114,4.156,171,3.733,193,5.728,198,3.819,201,5.521,330,3.437,373,4.986,385,5.236,395,6.011,396,4.671,401,6.403,404,10.904,420,8.685,441,10.904,483,7.689,501,12.606,512,8.967,527,7.351,785,4.36,932,6.505,955,11.15,1000,7.689,1609,17.711,1718,10.406,1872,10.398,1926,10.004,1981,9.515,2524,16.919,3019,11.981,3110,11.981,3683,13.219,6040,13.219,6056,13.219,6463,14.296]],["keywords/1297",[]],["title/1298",[441,1032.224,501,695.85,1407,1032.224]],["content/1298",[20,7.363,23,3.577,51,5.074,63,3.605,107,4.038,147,10.486,154,6.043,183,5.178,311,7.042,381,5.305,402,9.481,413,8.514,419,9.988,441,18.913,501,10.902,512,8.679,539,7.646,901,6.275,921,8.514,993,7.918,1119,9.481,1169,7.521,1726,8.842,1983,15.434,2390,14.386,6464,21.202]],["keywords/1298",[]],["title/1299",[2,495.646,52,372.867,234,625.942]],["content/1299",[2,8.167,4,2.051,6,1.433,10,5.858,18,4.945,33,2.559,44,4.122,52,6.558,63,3.246,72,7.046,84,10.562,103,6.597,110,6.53,149,8.21,193,5.931,230,7.044,278,3.985,295,9.098,301,3.374,381,4.777,455,7.088,501,10.177,564,6.847,672,9.207,674,5.422,736,5.544,786,6.342,1035,8.994,1058,7.667,1204,7.612,1298,8.895,1711,9.708,2783,8.994,6465,14.804,6466,14.804,6467,14.804,6468,14.804,6469,14.804]],["keywords/1299",[]],["title/1300",[2,574.258,10,620.401]],["content/1300",[1,4.792,2,3.939,4,1.114,5,2.322,6,1.531,7,4.936,10,9.666,11,7.052,12,5.513,18,6.906,19,4.74,25,0.715,30,5.059,33,1.391,37,1.805,46,3.481,51,2.573,52,5.167,116,6.529,136,6.202,155,3.205,162,6.628,169,9.411,173,6.392,186,3.179,230,5.924,246,4.995,249,6.087,273,2.358,295,9.717,301,4.712,329,4.792,330,2.585,352,9.411,373,4.078,381,3.47,382,5.53,385,3.939,413,5.569,420,6.533,424,6.953,455,7.57,459,8.203,462,4.273,463,7.669,476,11.392,479,6.461,483,5.784,496,4.345,507,9.834,577,6.688,705,6.263,741,6.533,879,4.187,1030,5.277,1155,7.271,1169,7.234,1178,7.271,1298,6.461,1787,8.429,2051,9.012,2671,7.052,2720,6.771,3560,7.828,3715,6.953,3770,8.004,6008,9.944,6470,10.754,6471,15.811,6472,10.754]],["keywords/1300",[]],["title/1301",[2,435.966,281,461.561,297,337.67,379,544.573]],["content/1301",[2,3.279,4,1.739,6,1.625,7,4.299,11,5.87,12,6.572,16,4.603,18,2.99,33,2.171,46,4.458,51,4.869,65,2.934,69,5.24,70,2.183,72,6.555,88,3.069,112,5.87,149,3.713,155,2.668,181,2.385,182,1.786,184,2.987,198,2.391,200,3.34,201,3.457,205,3.579,210,5.958,215,4.704,219,7.006,220,3.164,223,4.603,228,3.91,230,2.828,240,1.999,246,4.351,264,3.993,281,8.96,297,2.539,301,3.826,308,4.458,311,3.835,361,5.021,373,2.309,375,4.67,381,4.444,382,4.603,432,4.704,455,4.286,460,6.828,499,4.704,507,5.567,562,5.163,567,5.87,569,4.393,582,5.021,664,4.479,711,3.799,716,3.232,786,3.835,888,4.67,894,5.278,996,4.052,1028,5.163,1058,4.636,1072,6.264,1134,5.067,1173,5.321,1187,5.788,1192,5.567,1204,4.603,1602,5.438,1694,6.264,1706,5.87,1708,9.469,1858,7.017,2058,5.71,2062,5.958,2089,5.87,2253,4.236,2492,13.056,2598,6.828,2988,7.237,3008,8.277,3561,6.828,3758,12.656,4040,13.545,6473,8.951,6474,8.951,6475,8.951,6476,8.951,6477,8.951]],["keywords/1301",[]],["title/1302",[674,574.258,688,952.558]],["content/1302",[33,2.524,52,5.378,107,4.795,181,5.201,191,5.868,200,7.283,495,17.082,674,7.15,1435,14.529,2141,12.452,6478,19.52,6479,19.52,6480,19.52,6481,19.52,6482,19.52,6483,19.52]],["keywords/1302",[]],["title/1303",[225,485.1,277,780.453,501,695.85]],["content/1303",[]],["keywords/1303",[]],["title/1304",[25,104.266,501,806.215]],["content/1304",[4,0.841,6,1.731,9,3.712,18,2.711,25,1.189,33,2.312,40,4.871,46,2.627,63,1.78,65,2.66,69,3.983,70,1.979,107,1.993,122,3.562,147,5.176,152,1.616,154,2.983,155,2.419,162,2.868,176,4.657,181,4.764,184,3.42,186,2.398,192,2.728,193,3.251,205,5.05,219,3.016,220,2.868,222,2.213,230,5.648,240,4.608,246,4.031,249,4.593,278,2.184,297,4.474,301,1.849,314,2.878,329,3.616,330,1.951,334,2.34,373,4.067,382,4.173,385,2.972,387,7.432,388,8.846,392,3.774,394,4.115,401,3.635,413,4.202,421,4.202,451,4.987,452,3.753,455,3.885,464,6.04,482,4.436,483,4.364,485,6.361,499,4.265,501,12.727,507,5.047,641,5.678,642,3.635,645,7.507,661,5.176,674,2.972,694,4.033,716,4.607,736,4.779,740,3.774,772,3.366,785,4.809,894,3.11,912,4.233,972,5.321,985,3.774,996,3.673,1032,5.579,1160,4.115,1169,3.712,1173,4.824,1268,4.202,1314,5.787,1332,4.364,1377,3.796,1609,6.561,1610,5.047,1633,4.636,1694,5.678,1843,5.176,1926,5.678,2030,15.646,2031,9.101,2043,5.907,2045,6.801,2117,8.368,2161,6.19,2507,6.561,2771,6.19,3043,7.101,6484,12.761,6485,8.115,6486,8.115,6487,7.504,6488,8.115,6489,8.115,6490,8.115]],["keywords/1304",[]],["title/1305",[277,1074.687]],["content/1305",[5,4.036,6,1.81,18,3.574,25,1.243,33,2.842,46,5.099,65,3.506,67,4.305,69,3.34,72,5.092,76,6.359,88,3.668,152,3.722,155,3.189,162,3.782,189,5.463,205,2.78,206,3.808,225,3.835,227,5.501,228,4.672,229,6.001,230,6.515,231,7.63,254,6.359,271,3.795,277,14.36,279,9.363,280,6.824,301,2.438,368,6.737,381,3.452,382,5.501,385,3.918,400,4.817,427,3.933,437,4.199,501,5.501,580,4.921,598,7.234,610,9.893,664,7.881,673,5.581,716,5.687,773,6.207,785,6.703,886,3.822,942,6.428,967,7.788,971,6.359,985,4.976,1219,5.153,1268,8.158,1300,7.246,1377,5.004,1633,6.112,1796,6.5,2444,6.5,2541,8.16,2771,8.16,2779,11.489,2847,8.966,3339,8.65,5348,8.966,5804,9.893,6491,10.698,6492,10.698,6493,10.698]],["keywords/1305",[]],["title/1306",[225,667.984]],["content/1306",[25,1.403,184,4.576,185,5.098,204,9.985,225,9.402,630,7.757]],["keywords/1306",[]],["title/1307",[185,378.748,225,562.039]],["content/1307",[4,1.257,5,2.619,18,5.763,25,0.807,33,2.231,51,2.903,65,3.976,67,4.881,69,5.385,88,4.16,122,5.325,125,4.8,151,3.743,152,4.353,154,4.46,155,3.616,166,6.577,182,3.442,184,3.741,185,4.85,225,8.606,230,7.298,240,2.709,278,5.404,281,6.69,381,3.915,451,7.455,455,10.469,490,4.82,552,6.376,614,5.247,652,5.808,668,6.283,736,4.543,785,6.122,894,4.649,1074,6.631,1115,8.831,1160,6.152,1192,7.545,1268,6.283,1377,8.07,1796,7.37,2671,7.955,2720,7.639,2779,7.455,3560,12.558,4917,9.808,5346,11.218,5348,10.167,5746,11.218,5749,11.218]],["keywords/1307",[]],["title/1308",[184,340.004,225,562.039]],["content/1308",[18,7.267,25,0.938,69,4.402,86,7.74,88,4.835,152,5.011,162,4.985,184,5.458,185,3.407,193,5.65,198,3.767,205,5.652,206,5.02,220,8.249,222,3.845,225,8.365,230,4.455,240,4.277,242,7.774,277,8.133,347,6.487,490,5.603,661,8.996,674,5.165,745,10.471,772,5.85,919,9.868,1116,9.521,1332,7.585,1339,6.317,2720,8.88,3560,10.265,4767,12.341]],["keywords/1308",[]],["title/1309",[225,485.1,241,503.001,1309,636.63]],["content/1309",[4,1.685,7,2.657,14,3.2,18,5.432,22,2.234,23,4.219,25,0.881,32,2.803,34,1.949,54,7.068,62,3.647,63,1.867,151,2.626,152,3.238,158,5.36,161,5.138,198,3.539,201,3.288,204,6.268,224,2.581,225,8.852,228,3.718,230,2.689,241,6.821,246,2.689,267,7.134,277,4.909,301,3.706,347,6.094,373,2.195,380,6.197,381,4.275,500,5.957,556,3.041,572,3.041,652,4.076,745,10.869,765,2.79,772,6.746,785,2.596,857,4.377,880,6.493,891,4.693,993,4.1,1024,4.005,1169,3.895,1309,10.341,1310,4.958,2058,5.43,2079,4.863,2106,4.909,2121,5.231,2131,5.115,2281,5.666,2444,5.172,2495,5.36,2598,6.493,2687,12.25,2688,7.872,2690,7.449,2691,7.872,2692,9.27,2693,6.071,2694,7.872,2695,7.872,2698,7.872,3174,5.756,3739,7.134,4421,10.71,5014,7.449,5021,7.872,5318,6.882,6494,8.513,6495,8.513,6496,8.513,6497,8.513]],["keywords/1309",[]],["title/1310",[4,140.222,25,89.993,300,745.978]],["content/1310",[]],["keywords/1310",[]],["title/1311",[4,162.462,630,576.359]],["content/1311",[4,1.696,6,0.673,23,4.327,32,4.295,33,1.458,34,4.12,35,1.993,36,5.882,37,1.167,87,2.415,111,2.623,124,2.603,151,2.144,152,2.245,161,3.562,167,4.9,191,2.089,198,1.857,224,4.963,271,2.465,334,2.004,407,3.389,517,3.768,572,2.483,630,7.084,645,4.089,694,3.455,723,4.699,758,3.006,765,3.696,766,9.116,767,3.971,768,6.441,769,5.059,770,3.432,772,4.677,773,6.45,776,3.308,787,3.368,806,3.348,845,4.558,901,5.431,975,6.064,1040,7.193,1143,4.494,1156,5.302,1219,3.348,1257,3.18,1278,3.432,1320,3.738,1903,5.173,2106,6.503,2381,5.059,2495,4.377,2719,5.825,2942,5.448,2980,5.448,4054,6.427,4515,8.848,4534,6.427,4599,9.45,4603,6.082,4620,8.601,4955,13.718,4956,10.356,5417,6.427,6498,6.95,6499,6.95,6500,14.226,6501,11.276,6502,14.226,6503,6.95,6504,6.95,6505,14.226,6506,6.95,6507,11.276,6508,6.95,6509,6.95,6510,6.95,6511,6.95,6512,6.95,6513,6.95,6514,6.95,6515,6.95,6516,6.95,6517,6.95,6518,6.95,6519,6.95,6520,6.95,6521,6.95,6522,6.95]],["keywords/1311",[]],["title/1312",[44,331.436,182,237.492,414,465.275,544,444.09]],["content/1312",[]],["keywords/1312",[]],["title/1313",[46,385.295,501,612.063,2106,686.479,2304,866.461]],["content/1313",[4,2.312,25,0.738,33,2.092,40,4.236,46,6.181,53,4.688,69,3.464,70,3.946,97,3.896,105,6.017,114,4.704,152,2.209,155,5.692,156,8.568,182,2.214,184,2.407,186,3.28,206,5.759,219,4.125,225,3.978,227,5.706,238,7.503,239,5.666,240,3.613,246,3.506,277,6.4,278,2.987,301,2.529,311,4.754,321,6.82,330,3.89,373,4.173,395,8.029,414,4.338,448,8.972,467,3.923,499,5.832,501,11.472,533,6.281,537,3.637,544,4.14,580,5.105,632,9.518,668,8.379,711,4.709,716,4.006,888,8.441,919,7.766,967,11.778,1109,9.889,1134,10.808,1157,6.597,1170,5.666,1648,7.766,1872,5.969,2098,6.988,2106,9.331,2252,6.742,2301,7.079,2304,8.078,3158,8.972,3159,9.711,3919,8.078,3963,8.465,6139,10.262,6523,11.097]],["keywords/1313",[]],["title/1314",[46,385.295,107,292.374,181,317.157,501,612.063]],["content/1314",[4,1.432,6,1.338,11,9.064,14,5.196,18,4.617,23,2.88,33,2.443,70,3.371,97,4.852,107,3.395,152,2.752,171,3.609,176,5.044,181,3.683,182,2.758,184,2.997,192,4.647,205,5.594,220,4.886,230,5.969,240,4.219,273,3.031,314,6.702,329,6.159,330,3.323,373,3.564,388,7.753,427,5.081,452,6.393,501,9.716,545,5.234,674,5.062,806,6.658,1258,16.535,1332,7.434,1403,9.857,1547,9.2,1564,8.817,1650,8.216,2117,9.064,2720,8.703,3245,12.781,3561,10.543,6524,21.529,6525,18.895,6526,18.895]],["keywords/1314",[]],["title/1315",[273,296.762,414,528.967,1021,727.832]],["content/1315",[4,1.466,6,0.898,7,2.894,14,5.318,15,5.399,23,3.151,32,2.994,33,2.673,34,3.239,40,3.539,53,3.916,63,2.033,65,4.637,69,2.894,88,4.851,103,4.131,152,1.846,155,2.763,156,4.909,161,2.929,166,5.026,171,2.421,183,2.92,185,3.417,204,8.118,219,3.446,230,4.469,240,2.07,241,8.099,246,2.929,271,3.288,272,3.952,273,4.97,289,4.312,330,4.615,373,5.619,401,4.152,405,4.767,414,6.706,417,9.811,455,8.214,501,4.767,543,6.353,652,4.438,716,5.107,736,3.472,771,3.714,858,4.669,886,3.311,897,6.079,902,5.296,926,4.733,1021,4.986,1074,5.067,1326,5.697,1560,6.373,1651,11.922,2114,6.079,2136,6.487,2242,7.267,2308,8.908,2542,6.748,2937,8.572,3448,7.495,3715,5.994,6527,9.27,6528,19.197,6529,9.27,6530,14.147,6531,9.27,6532,9.27,6533,9.27,6534,9.27,6535,9.27,6536,9.27,6537,9.27]],["keywords/1315",[]],["title/1316",[184,340.004,705,913.126]],["content/1316",[4,1.106,6,1.232,14,4.014,18,3.567,23,1.627,33,2.307,40,1.784,44,1.301,46,4.651,58,1.712,65,3.5,69,1.459,70,3.504,72,2.224,88,5.784,99,1.646,100,1.731,104,3.16,107,1.985,114,1.359,152,2.126,154,1.718,156,2.475,162,3.775,166,2.534,171,2.11,181,3.389,184,5.044,185,1.952,188,2.622,191,2.43,192,1.571,201,6.515,205,5.803,206,1.664,209,4.09,219,3.004,220,1.652,222,1.274,223,2.403,229,2.622,230,1.476,234,2.162,240,2.384,246,2.553,249,4.574,254,2.778,264,2.343,273,4.817,279,2.778,283,6.773,288,2.308,301,3.275,315,1.522,330,3.455,334,2.33,357,3.333,364,2.534,373,4.816,381,4.105,382,2.403,387,4.707,388,4.533,389,4.156,391,2.354,398,1.75,400,2.104,407,3.941,414,1.827,417,5.727,421,2.42,451,4.967,455,3.87,458,2.174,460,3.565,465,3.479,479,2.808,501,4.156,545,2.239,555,5.027,619,7.474,660,2.622,663,4.455,664,2.338,668,2.42,674,1.712,704,2.456,705,6.219,716,4.592,718,1.897,723,3.16,736,1.75,740,2.174,754,3.664,758,3.496,771,1.873,786,2.002,875,2.475,888,2.438,891,2.576,894,1.791,912,2.438,915,3.479,969,3.16,1021,2.514,1030,2.293,1049,2.872,1109,4.186,1114,2.386,1165,5.3,1173,6.347,1189,5.027,1219,2.251,1257,2.138,1268,2.42,1300,2.15,1315,2.943,1332,2.514,1356,2.981,1427,2.494,1526,2.555,1564,2.981,1631,4.574,1650,7.561,1711,3.065,1714,4.322,1889,8.01,1926,3.271,2018,3.664,2089,3.065,2114,3.065,2165,3.16,2321,6.724,2424,6.534,2444,2.84,2669,3.16,2677,5.656,2708,3.664,2714,7.341,2724,3.479,2760,4.322,2768,8.901,2769,6.165,2771,9.703,2779,2.872,2845,3.779,2913,6.016,3058,3.565,3560,3.402,3564,3.333,3627,4.322,3677,3.917,3919,3.402,5469,4.322,6487,7.474,6538,4.674,6539,4.674,6540,4.674,6541,4.674,6542,4.674,6543,4.674,6544,4.674,6545,8.082,6546,4.674,6547,4.674,6548,4.674,6549,4.674,6550,4.674,6551,4.674,6552,4.674,6553,4.674,6554,4.674,6555,4.674,6556,4.674,6557,4.674,6558,4.674,6559,4.674,6560,4.674,6561,4.674,6562,4.674,6563,4.674,6564,4.674]],["keywords/1316",[]],["title/1317",[206,481.704,240,302.163,2023,659.894]],["content/1317",[33,1.676,44,3.609,70,4.408,107,3.184,152,4.143,155,3.864,191,3.896,205,4.696,206,4.614,240,4.647,246,4.095,254,7.705,263,10.479,273,5.378,274,8.38,322,4.765,330,5.414,373,3.343,396,5.906,414,5.067,417,8.138,440,5.995,451,7.966,592,7.875,736,4.854,894,4.967,993,10.025,1039,9.887,1114,6.618,1170,6.618,1192,8.061,1313,7.705,1326,7.966,1339,5.806,1633,7.405,1650,12.371,2023,10.98,2049,8.38,2099,10.863,2114,8.5,2242,10.16,2747,11.986,3746,10.863,6565,12.962,6566,12.962,6567,12.962,6568,12.962]],["keywords/1317",[]],["title/1318",[116,647.46,514,562.039]],["content/1318",[6,0.99,12,3.566,14,3.844,15,5.955,19,3.065,25,0.68,33,1.322,46,4.931,49,4.811,69,3.192,70,2.494,88,3.506,111,3.859,114,2.973,116,8.908,152,3.033,156,5.415,162,7.625,166,5.544,171,2.67,177,7.833,183,3.221,186,3.022,189,5.221,192,3.438,205,2.657,228,6.653,229,5.736,230,3.23,241,7.498,246,4.812,249,5.788,273,5.396,278,2.753,321,6.284,330,3.662,373,4.695,381,4.916,388,5.736,389,5.258,407,7.428,414,5.954,421,5.296,455,4.896,514,7.231,543,8.676,545,4.219,569,5.018,630,3.759,703,3.815,716,3.692,785,3.118,981,5.842,982,5.457,1021,5.5,1332,8.193,1526,5.59,1651,11.634,2114,9.99,2130,6.706,2152,7.8,2288,10.3,2444,6.213,2779,6.284,3114,11.089,6569,10.226]],["keywords/1318",[]],["title/1319",[385,495.646,435,619.122,1021,727.832]],["content/1319",[5,3.024,6,2.253,22,3.676,53,5.917,107,3.441,151,4.322,152,3.796,162,4.952,182,3.804,192,4.709,205,4.954,206,4.986,215,7.362,238,12.892,271,6.764,301,3.192,330,4.584,414,5.475,435,11.138,545,3.88,568,8.24,580,8.771,706,7.152,736,5.246,765,6.249,931,8.326,954,7.362,1021,10.255,1183,7.722,1649,10.98,1650,8.326,1651,10.997,1726,7.534,1765,8.935,1931,8.82,2673,12.258,3960,12.258,3961,12.258,3963,10.685,5254,12.953,6570,14.007]],["keywords/1319",[]],["title/1320",[156,716.592,414,528.967,6571,1353.247]],["content/1320",[4,2.266,5,2.619,9,5.55,14,6.485,33,2.231,43,9.509,46,3.927,65,3.976,97,6.057,100,6.389,107,2.98,114,3.527,151,3.743,152,4.6,156,6.424,180,5.58,181,3.232,184,4.354,186,5.934,192,5.8,220,7.73,229,6.805,230,3.832,234,10.114,248,6.577,262,10.713,273,2.66,301,2.765,308,3.927,315,3.951,341,7.211,372,7.844,394,8.748,400,7.768,414,4.742,417,7.768,468,5.55,472,10.616,482,6.631,545,3.36,556,4.333,557,4.82,614,5.247,642,5.434,1112,7.211,1180,7.289,1228,8.652,1329,6.152,1779,8.34,2112,7.955,3052,10.616,6572,12.131,6573,12.131,6574,12.131]],["keywords/1320",[]],["title/1321",[273,296.762,543,501.136,561,636.63]],["content/1321",[2,8.051,5,3.401,14,4.022,15,6.231,23,1.631,33,1.383,61,5.754,65,3.506,69,3.34,88,6.41,114,3.11,122,4.696,124,4.006,152,4.106,161,3.38,171,2.794,176,3.904,177,8.1,180,4.921,182,2.135,186,4.656,188,6.001,189,5.463,201,4.132,205,2.78,206,3.808,222,4.295,224,5.668,227,5.501,228,4.672,246,3.38,273,5.552,361,6.001,373,4.062,403,8.65,414,4.182,417,4.817,476,6.5,484,6.001,490,6.259,543,8.514,544,3.991,561,10.341,572,3.822,607,5.8,703,3.991,716,5.687,736,4.006,740,4.976,765,3.506,773,4.216,943,5.623,958,4.948,1007,5.623,1030,5.25,1219,5.153,1479,6.001,1564,6.824,1607,9.893,1650,6.359,1712,7.486,2089,7.016,2098,6.737,2136,7.486,2239,7.788,2444,6.5,2459,8.65,3320,8.386]],["keywords/1321",[]],["title/1322",[297,444.782,300,864.293]],["content/1322",[14,5.605,97,6.982,114,4.334,151,4.6,152,4.455,161,4.71,177,7.667,200,5.563,224,6.03,228,6.512,230,4.71,256,7.014,264,4.322,273,4.907,300,8.219,301,3.398,395,6.269,417,6.713,421,7.722,543,7.364,580,6.859,630,9.141,716,7.18,765,4.887,858,7.51,897,9.777,942,8.958,1377,6.974,1560,10.25,1595,9.273,1631,8.439,2051,12.495,2114,9.777,2303,8.019,2560,9.777,3465,13.048,4067,13.787]],["keywords/1322",[]],["title/1323",[414,612.864,2065,1267.615]],["content/1323",[44,5.239,53,7.947,114,5.47,152,4.595,184,4.08,225,6.745,273,4.126,373,4.852,451,11.563,736,8.644,895,15.768,1021,10.119,1116,9.352,1651,10.851,1713,10.201,6575,23.082,6576,18.815]],["keywords/1323",[]],["title/1324",[33,202.738,6577,1567.878]],["content/1324",[4,1.69,5,3.52,6,1.579,7,3.502,10,4.438,23,2.485,25,0.746,33,2.484,37,1.883,40,4.282,51,3.902,63,2.46,65,3.676,75,10.543,98,4.805,100,7.115,109,7.252,114,3.261,152,2.233,156,5.94,184,5.07,186,4.82,205,4.992,206,3.993,222,3.059,225,4.021,240,2.505,260,5.809,276,6.815,277,6.469,283,9.4,298,5.504,301,2.556,372,7.252,373,4.955,385,4.108,398,4.201,407,5.47,417,8.65,454,7.252,465,8.349,476,6.815,488,13.666,501,8.385,674,4.108,688,6.815,735,5.05,736,4.201,1021,8.77,1356,7.155,1365,8.165,1614,5.727,1961,6.668,2031,8,2421,8.349,2422,9.069,2740,9.4,2771,8.556,2772,10.372,2938,10.372,2954,9.4,3831,9.4,4304,10.372,6578,11.217,6579,11.217,6580,11.217,6581,11.217,6582,11.217,6583,11.217,6584,11.217]],["keywords/1324",[]]],"invertedIndex":[["",{"_index":23,"title":{"307":{"position":[[56,1]]},"312":{"position":[[18,1]]},"472":{"position":[[5,1]]},"479":{"position":[[17,1]]},"550":{"position":[[0,2]]},"558":{"position":[[16,1]]},"629":{"position":[[40,1]]},"645":{"position":[[0,2]]},"651":{"position":[[0,2]]},"693":{"position":[[31,1]]},"695":{"position":[[25,1]]},"709":{"position":[[13,1],[25,1]]},"713":{"position":[[0,2]]},"761":{"position":[[38,3]]},"777":{"position":[[12,1]]},"822":{"position":[[8,1]]},"840":{"position":[[9,1]]},"898":{"position":[[16,1]]},"941":{"position":[[8,2]]},"956":{"position":[[8,1]]},"970":{"position":[[13,2]]},"1046":{"position":[[8,2]]},"1058":{"position":[[8,2]]},"1060":{"position":[[8,1]]},"1061":{"position":[[9,1]]},"1062":{"position":[[9,1]]},"1190":{"position":[[0,2]]},"1243":{"position":[[0,2]]},"1244":{"position":[[0,2]]},"1245":{"position":[[0,2]]}},"content":{"1":{"position":[[326,1],[345,1],[366,1],[386,1],[417,2],[528,1],[612,3]]},"2":{"position":[[98,2],[128,2],[226,2],[294,1],[331,1],[414,2],[443,3]]},"3":{"position":[[106,2],[211,1],[292,3]]},"4":{"position":[[272,2],[389,1],[476,3]]},"5":{"position":[[188,2],[299,1],[383,3]]},"6":{"position":[[255,2],[287,2],[385,2],[455,1],[494,1],[579,2],[608,3],[612,2],[673,1],[777,2],[806,3]]},"7":{"position":[[210,2],[331,1],[415,2],[443,3],[447,2],[508,1],[611,2],[639,3]]},"8":{"position":[[498,1],[515,1],[550,1],[564,1],[574,1],[594,1],[608,1],[618,1],[620,2],[674,1],[732,1],[751,1],[773,1],[809,1],[974,1],[1100,1],[1197,2],[1225,3]]},"9":{"position":[[122,2],[245,1],[340,2],[368,3]]},"10":{"position":[[51,2],[159,2],[236,1],[283,1],[375,2],[404,3],[417,1],[428,1]]},"11":{"position":[[89,2],[201,3],[205,1],[300,1],[319,1],[419,1],[508,2],[576,1],[607,1],[650,2],[659,1],[668,3],[672,3],[676,1],[708,2],[809,1],[902,2],[951,1],[953,2],[1069,1],[1071,1],[1073,3],[1077,1]]},"19":{"position":[[610,2],[651,1],[776,3],[780,2],[823,1],[869,1],[951,3]]},"50":{"position":[[201,3],[205,1],[274,1],[357,1],[475,2]]},"51":{"position":[[186,1],[205,1],[233,2],[272,1],[274,1],[401,1],[407,1],[440,2],[449,1],[466,2],[476,1],[493,1],[495,2],[523,2],[557,1],[584,1],[659,1],[661,2],[691,1],[736,2],[800,3],[804,2],[857,1],[878,1],[880,3],[895,1]]},"52":{"position":[[74,2],[159,3],[163,2],[207,1],[247,2],[250,1],[295,1],[297,3],[301,2],[334,1],[381,1],[419,1],[438,1],[451,2],[471,1],[509,1],[524,1],[562,1],[592,1],[594,3],[598,2],[618,1],[656,1],[671,1]]},"54":{"position":[[108,1],[123,1],[167,3],[177,2],[192,2],[195,5],[201,1],[255,1],[273,2],[286,2]]},"55":{"position":[[184,1],[206,1],[241,1],[271,1],[302,1],[313,1],[456,1],[465,1],[509,1],[559,1],[604,2],[607,2],[610,1],[612,2],[615,1],[675,1],[694,1],[729,1],[756,1],[807,1],[826,1],[865,1],[997,3],[1029,4],[1096,1],[1194,2],[1207,2]]},"61":{"position":[[237,1]]},"77":{"position":[[210,1],[242,1],[249,1],[259,1],[261,1],[263,3],[282,1],[316,1],[344,1],[346,1],[365,3]]},"103":{"position":[[250,1],[282,1],[289,1],[299,1],[301,1],[303,3],[322,1],[356,1],[384,1],[386,1],[405,3]]},"130":{"position":[[438,1],[440,1],[455,1],[481,2],[503,2],[522,3],[532,2],[547,2],[550,2],[553,3],[557,1],[600,1]]},"143":{"position":[[398,2],[462,3],[472,2],[487,2],[490,2],[517,1],[526,1],[559,1],[572,3],[576,2],[599,1],[643,3],[653,2],[668,2],[671,2],[698,1],[711,1],[744,1],[772,2],[775,2]]},"188":{"position":[[645,1],[664,1],[686,1],[705,1],[750,1],[807,1],[838,2],[926,1],[928,2],[962,1],[989,2],[1145,3],[1170,3],[1208,1],[1218,1],[1278,1],[1284,1],[1317,2],[1326,1],[1359,2],[1369,1],[1401,1],[1403,2],[1459,1],[1461,1],[1463,3],[1478,1],[1480,2],[1603,2],[2265,1],[2567,2],[2647,1],[2722,2],[2766,1],[2802,2],[2843,1],[3006,3],[3010,2],[3063,1],[3100,2],[3192,1],[3194,3],[3198,2],[3249,1],[3263,1],[3275,1],[3286,3],[3290,3]]},"209":{"position":[[8,1],[27,1],[62,1],[89,1],[140,1],[164,1],[223,1],[234,1],[354,3],[391,1],[401,1],[483,1],[489,1],[522,2],[532,1],[549,2],[562,1],[580,1],[582,1],[584,1],[586,1],[588,3],[592,2],[717,1],[747,1],[749,2],[797,1],[845,1],[900,2],[903,3],[933,2],[972,1],[974,2],[983,1],[1034,1],[1036,2],[1095,1],[1213,2],[1246,1],[1248,2],[1262,3],[1277,1]]},"210":{"position":[[153,1],[203,1],[262,1],[533,2],[536,3],[582,1],[620,3]]},"211":{"position":[[70,1],[89,1],[124,1],[151,1],[204,1],[286,3],[352,1],[362,1],[445,1],[451,1],[484,2],[496,1],[513,1],[515,1],[517,1],[519,1],[521,3]]},"234":{"position":[[310,1],[342,1],[349,1],[359,1],[361,1],[363,3],[382,1],[416,1],[444,1],[446,1],[465,3]]},"235":{"position":[[342,1],[344,1]]},"255":{"position":[[355,1],[374,1],[409,1],[436,1],[487,1],[511,1],[570,1],[581,1],[698,3],[735,1],[745,1],[827,1],[833,1],[866,2],[876,1],[893,2],[902,1],[920,1],[922,1],[924,1],[926,1],[928,3],[932,2],[1069,1],[1104,1],[1106,2],[1151,1],[1191,1],[1248,2],[1251,3],[1255,2],[1307,1],[1309,2],[1318,1],[1369,1],[1371,2],[1414,1],[1548,1],[1550,2],[1564,2],[1593,3],[1608,1]]},"258":{"position":[[8,1],[27,1],[62,1],[89,1],[142,1],[219,3]]},"259":{"position":[[34,1],[44,1],[127,1],[133,1],[166,2],[175,1],[192,1],[194,1],[196,1],[198,1],[200,3]]},"261":{"position":[[221,1],[271,1],[335,1],[405,2],[522,2],[626,2],[774,3],[784,3],[788,2],[818,2],[821,2],[845,3],[849,2],[943,1],[984,3]]},"266":{"position":[[547,1],[566,1],[588,1],[609,1],[656,1],[732,3]]},"269":{"position":[[20,1]]},"276":{"position":[[397,1],[439,1],[447,1],[460,1],[462,1]]},"300":{"position":[[229,1],[284,1],[315,1]]},"302":{"position":[[421,1],[683,1],[694,1],[751,1],[834,1],[850,1],[867,3],[893,1],[976,2],[1027,2],[1052,2],[1083,1],[1090,1],[1092,2],[1163,1],[1165,1]]},"303":{"position":[[444,2],[535,1],[537,1],[657,1],[659,1],[717,2],[720,1],[778,1],[780,1],[782,2],[802,1],[804,1],[896,1],[898,1],[941,2],[944,1],[987,1],[989,1],[991,2]]},"314":{"position":[[307,1],[326,1],[361,1],[388,1],[456,1],[467,1],[571,2],[610,2],[663,3],[700,1],[710,1],[793,1],[799,1],[816,2],[828,1],[845,2],[859,1],[876,1],[878,2],[898,1],[900,1],[902,3],[917,1]]},"315":{"position":[[169,1],[207,1],[258,1],[285,1],[336,1],[355,1],[416,1],[441,1],[517,3],[530,1],[636,3],[675,1],[685,1],[769,1],[775,1],[792,2],[801,1],[818,1],[820,2],[841,2],[915,1],[917,1],[919,3],[934,1]]},"316":{"position":[[142,1],[152,1],[210,2],[278,1],[284,1],[301,2],[313,1],[330,2],[344,1],[382,1],[384,1],[386,1],[388,1],[390,3]]},"334":{"position":[[172,1],[191,1],[213,1],[240,1],[314,1],[325,1],[431,2],[484,2],[523,2],[551,3],[587,1],[597,1],[679,1],[685,1],[702,2],[711,1],[728,2],[739,1],[756,1],[758,1],[760,1],[762,1],[764,3],[779,1]]},"335":{"position":[[104,2],[180,2],[183,1],[194,1],[218,2],[271,2],[274,2],[318,1],[320,2],[362,2],[421,1],[537,3],[541,3],[545,3],[549,2],[616,2],[625,1],[642,1],[683,1],[808,3],[812,3],[816,3]]},"356":{"position":[[337,1],[387,2],[657,1]]},"361":{"position":[[452,2],[532,1],[534,1],[654,1],[656,1],[714,2],[717,1],[775,1],[777,1],[779,2],[799,1],[801,1],[893,1],[895,1],[938,2],[941,1],[984,1],[986,1],[988,2]]},"367":{"position":[[671,2],[709,1],[711,1],[743,2],[822,1],[828,1],[861,2],[910,2],[919,1],[952,2],[961,1],[979,2],[993,1],[1031,1],[1033,2],[1082,1]]},"391":{"position":[[431,1],[442,1],[501,1],[604,1],[617,1],[651,1],[670,1],[716,3],[752,1]]},"392":{"position":[[214,1],[233,1],[255,1],[282,1],[335,1],[418,3],[559,1],[569,1],[629,1],[635,1],[667,2],[676,1],[693,1],[695,2],[723,1],[725,1],[727,3],[753,1],[931,1],[986,1],[1035,1],[1079,1],[1121,2],[1525,1],[1535,1],[1595,1],[1601,1],[1633,2],[1647,1],[1671,1],[1688,1],[1690,1],[1692,2],[1725,1],[1727,1],[1729,3],[1756,1],[2627,1],[2777,1],[2823,1],[2841,1],[2937,3],[2941,4],[2946,1],[2948,3],[3484,2],[3504,1],[3524,1],[3556,1],[3574,1],[3592,1],[3671,3],[3675,2],[3808,2],[3855,1],[4001,1],[4017,1],[4111,1],[4124,1],[4163,1],[4178,1],[4190,1],[4217,1],[4228,1],[4241,1],[4243,3],[4292,1],[4309,1],[4327,1],[4344,3],[4352,1],[4427,1],[4429,2],[4508,3],[4512,3],[4516,1],[4533,1],[4682,2],[4730,1],[4780,1],[4798,1],[4845,2],[4848,3],[4852,2],[4855,3],[4859,1],[4861,3]]},"393":{"position":[[923,1],[943,1],[988,1],[1056,2]]},"394":{"position":[[474,1],[494,1],[531,1],[560,1],[604,1],[643,1],[701,1],[760,1],[787,2],[851,4],[874,1]]},"397":{"position":[[484,1],[486,1],[518,2],[534,1],[536,1],[664,1],[682,1],[749,2],[775,1],[833,1],[872,1],[874,2],[877,2],[1047,2],[1072,1],[1202,2],[1226,1],[1317,1],[1319,1],[1626,1],[1646,1],[1708,1],[1710,3],[1732,4],[1752,1],[1818,1],[1864,1],[1882,1],[1928,1],[1930,1],[1959,2],[1962,2],[2078,1],[2097,1],[2163,1],[2170,1],[2201,3],[2245,4],[2250,1],[2252,3]]},"398":{"position":[[749,1],[774,1],[798,1],[892,1],[916,1],[1002,1],[1058,1],[1067,1],[1073,1],[1113,1],[1115,2],[1124,2],[1134,1],[1147,3],[1220,1],[1229,1],[1235,1],[1275,1],[1277,2],[1286,2],[1296,1],[1308,3],[1346,3],[1435,2],[1438,2],[1464,1],[1503,1],[1520,1],[1589,1],[1605,2],[1608,3],[1625,1],[1707,1],[1747,2],[1750,1],[1990,1],[2040,1],[2066,1],[2110,1],[2178,1],[2202,1],[2270,1],[2288,1],[2316,1],[2358,1],[2367,1],[2373,1],[2459,1],[2468,1],[2470,2],[2479,2],[2489,1],[2501,3],[2562,1],[2573,1],[2588,2],[2591,2],[2617,1],[2656,1],[2673,1],[2742,1],[2758,2],[2761,3],[2778,1],[2860,1],[2900,2],[2903,2],[3249,1],[3253,1]]},"400":{"position":[[288,2],[298,1],[311,3]]},"403":{"position":[[485,1],[487,1],[513,2],[615,1],[617,2],[620,3],[624,2],[627,2],[630,2],[633,3],[637,2],[640,2],[762,1],[803,1],[843,1],[919,1],[935,1],[942,1],[996,3],[1016,2],[1019,1],[1021,1],[1023,3]]},"405":{"position":[[187,1]]},"412":{"position":[[4440,1],[4452,1],[4512,1],[4514,1],[4516,3],[4520,1],[4571,1],[4625,2],[4642,1],[4644,3],[4648,1],[4706,1],[4749,1],[4784,1],[4807,1],[4845,1],[4894,1],[4963,1],[4989,2],[5016,2],[5019,3],[5023,1],[5068,1],[5121,1],[5154,2],[5174,1],[5176,3],[5180,1],[5248,1],[5321,1],[5323,1],[5392,1],[5464,1],[5543,2],[5572,1],[5574,2],[12048,2]]},"425":{"position":[[246,2],[322,2],[376,1],[412,2],[483,2]]},"426":{"position":[[304,1],[306,1],[359,2],[362,2],[439,2],[498,1]]},"432":{"position":[[778,2],[838,2],[930,4]]},"439":{"position":[[634,2],[718,3],[735,1],[807,2]]},"458":{"position":[[709,2],[769,2],[872,4]]},"459":{"position":[[521,2],[588,1],[635,1],[695,1],[746,1],[795,1],[834,1],[871,1],[891,1],[949,1],[977,3]]},"471":{"position":[[172,1]]},"480":{"position":[[165,1],[184,1],[219,1],[246,1],[314,1],[316,2],[360,1],[444,3],[448,2],[500,1],[510,1],[593,1],[599,1],[616,2],[626,1],[643,2],[652,1],[670,1],[672,1],[674,1],[676,1],[678,3],[682,2],[741,1],[755,1],[757,2],[760,2],[763,2],[860,1],[915,3],[930,1]]},"481":{"position":[[350,1],[583,1],[607,1],[731,1],[733,2],[762,2],[765,2],[774,1],[776,2],[807,2],[810,2],[824,2],[856,3]]},"482":{"position":[[166,1],[185,1],[220,1],[247,1],[298,1],[336,1],[410,1],[412,2],[481,1],[557,3],[561,2],[605,1],[716,3],[720,2],[793,1],[803,1],[893,1],[899,1],[916,2],[931,1],[948,1],[950,2],[997,2],[1027,1],[1029,1],[1031,3],[1046,1]]},"493":{"position":[[197,1],[270,2],[282,2]]},"494":{"position":[[200,2],[203,1],[205,2],[289,1],[322,1],[357,1],[404,3],[420,2],[423,1]]},"502":{"position":[[948,1],[964,1],[973,1],[975,1],[977,2],[980,2],[983,2],[990,1]]},"518":{"position":[[415,1],[431,1],[440,1],[442,1],[444,2],[447,2],[450,2],[457,1]]},"522":{"position":[[285,1],[304,1],[326,1],[353,1],[406,1],[451,2],[502,2],[545,2],[595,2],[663,2],[726,2],[729,2],[771,3]]},"523":{"position":[[344,1],[389,1],[452,1],[510,1],[512,1],[532,1],[571,3],[591,1],[614,1],[623,1],[688,1],[744,3],[856,2]]},"534":{"position":[[186,1]]},"538":{"position":[[266,1],[285,1],[320,1],[347,1],[391,2],[421,1],[466,2],[530,3],[534,2],[573,1],[575,1],[702,1],[708,1],[741,2],[750,1],[767,2],[777,1],[794,1],[796,2],[824,2],[827,2],[880,1],[901,1],[903,3]]},"539":{"position":[[74,2],[159,3],[163,2],[207,1],[247,2],[250,1],[295,1],[297,3],[301,2],[334,1],[381,1],[419,1],[438,1],[451,2],[471,1],[509,1],[524,1],[562,1],[592,1],[594,3],[598,2],[618,1],[656,1],[671,1]]},"541":{"position":[[179,1],[201,1],[248,2],[251,1],[279,1],[314,1],[316,2],[358,1],[398,1],[434,1],[458,3],[469,2],[506,2],[531,1],[610,1],[705,3],[734,2],[737,1]]},"542":{"position":[[295,1],[330,1],[386,1],[405,1],[440,1],[467,1],[526,1],[649,3],[738,5],[776,2],[779,1],[794,1],[825,1],[861,1],[910,3],[926,2],[929,1]]},"548":{"position":[[128,1]]},"554":{"position":[[482,1],[501,1],[523,1],[561,1],[605,2],[608,1],[661,1],[736,2],[746,1],[767,1],[844,1],[846,2],[929,1],[999,3],[1003,2],[1044,1],[1157,2],[1200,3],[1204,2],[1285,1],[1295,1],[1384,1],[1390,1],[1423,2],[1439,1],[1456,2],[1472,1],[1489,1],[1491,2],[1541,1],[1543,1],[1545,3],[1560,1]]},"555":{"position":[[179,2],[188,1],[199,1],[232,2],[267,1],[378,3],[382,2],[466,1],[508,1],[532,1],[586,2],[615,2],[690,3],[694,5]]},"556":{"position":[[206,2],[292,1],[373,1],[393,1],[449,1],[480,1],[533,1],[751,1],[764,1],[802,1],[850,1],[874,1],[908,1],[1034,3]]},"557":{"position":[[259,1]]},"559":{"position":[[199,1],[221,1],[268,1],[300,1],[320,1],[334,1],[383,1],[403,1],[405,3],[409,3],[432,1],[494,2],[517,1],[775,2],[778,1]]},"562":{"position":[[8,1],[27,1],[49,1],[76,1],[148,1],[159,1],[260,3],[281,1],[283,1],[365,1],[371,1],[388,2],[397,1],[414,2],[424,1],[441,1],[443,2],[471,2],[508,1],[529,1],[531,3],[535,2],[623,3],[627,2],[662,1],[716,2],[731,5],[818,1],[1050,1],[1072,1],[1119,2],[1122,1],[1150,1],[1185,1],[1199,1],[1220,2],[1296,1],[1332,1],[1356,3],[1367,2],[1395,2],[1420,2],[1445,1],[1481,1],[1554,3],[1570,2],[1573,1]]},"563":{"position":[[205,1],[224,1],[259,1],[286,1],[337,1],[372,1],[460,1],[471,1],[604,3],[608,2],[686,1],[718,1],[742,2],[761,2],[839,5]]},"564":{"position":[[193,1],[212,1],[234,1],[272,1],[323,1],[350,1],[424,1],[449,1],[525,3],[529,2],[575,1],[689,3],[728,1],[738,1],[822,1],[828,1],[845,2],[860,1],[877,1],[879,2],[926,2],[946,1],[948,1],[950,3],[954,5]]},"571":{"position":[[889,1],[905,1],[914,1],[916,1],[918,2],[921,2],[924,2],[931,1],[1036,1],[1038,2],[1119,1],[1160,1],[1171,1],[1234,1],[1248,3],[1252,2],[1377,1],[1379,1]]},"579":{"position":[[158,2],[174,1],[193,1],[215,1],[242,1],[323,1],[334,1],[440,2],[493,2],[532,2],[559,3],[595,1],[605,1],[687,1],[693,1],[710,2],[719,1],[736,2],[753,1],[770,1],[772,1],[774,1],[776,1],[778,3],[793,1]]},"580":{"position":[[38,5],[262,2],[306,1],[323,1],[344,1],[359,1],[387,1],[422,2],[431,1],[436,1],[460,2],[516,1],[532,1],[541,1],[543,2],[552,2],[567,2],[570,2],[573,2],[576,2],[587,1],[680,1],[695,1],[708,3],[712,3],[829,2],[842,2],[851,2],[872,2]]},"594":{"position":[[184,1]]},"598":{"position":[[258,2],[274,1],[293,1],[315,1],[342,1],[417,1],[428,1],[473,2],[537,3],[541,2],[580,1],[582,1],[709,1],[715,1],[748,2],[757,1],[774,2],[784,1],[801,1],[803,2],[831,2],[834,2],[887,1],[908,1],[910,3],[925,1]]},"599":{"position":[[74,2],[168,3],[172,2],[216,1],[265,2],[268,1],[322,1],[324,3],[328,2],[361,1],[408,1],[446,1],[465,1],[478,2],[498,1],[536,1],[551,1],[589,1],[619,1],[621,3],[625,2],[649,1],[687,1],[702,1]]},"601":{"position":[[264,2],[278,2],[384,1],[401,1],[422,1],[431,1],[459,1],[499,2],[508,1],[519,1],[537,2],[579,1],[599,2],[668,1],[683,1],[696,3],[700,3]]},"602":{"position":[[238,1],[261,2],[264,2],[651,2],[665,2]]},"608":{"position":[[128,1]]},"610":{"position":[[865,2],[924,1],[1014,1],[1075,2],[1127,2],[1149,1],[1151,3],[1155,1],[1203,1],[1268,1],[1326,2],[1358,3],[1362,1],[1376,2]]},"611":{"position":[[591,2],[640,1],[691,1],[709,1],[750,2],[815,2],[835,1],[853,1],[904,2]]},"612":{"position":[[1088,2],[1150,1],[1209,2],[1264,1],[1278,1],[1306,1],[1308,1],[1323,2],[1789,1],[1813,1],[1832,2],[1877,1],[1898,1],[1994,3],[2014,1],[2029,1],[2031,2],[2081,1],[2103,1],[2168,2],[2171,2],[2221,1],[2244,1],[2260,1],[2262,1],[2332,2],[2355,2],[2365,2],[2423,2],[2432,1],[2472,3],[2476,3],[2497,2]]},"617":{"position":[[55,2]]},"628":{"position":[[274,1]]},"632":{"position":[[1046,1],[1065,1],[1100,1],[1127,1],[1204,1],[1206,2],[1280,1],[1367,2],[1414,3],[1418,2],[1485,1],[1495,1],[1577,1],[1583,1],[1616,2],[1626,1],[1643,2],[1652,1],[1670,1],[1672,1],[1674,1],[1676,1],[1678,3],[1682,2],[1768,2],[1771,2],[1827,1],[1874,3],[1889,1],[2115,1],[2139,1],[2208,1],[2293,2],[2363,1],[2414,1],[2416,2],[2488,2],[2491,2],[2500,1],[2530,1],[2532,2],[2577,2],[2580,2],[2595,2],[2638,2],[2675,3],[2679,1]]},"638":{"position":[[228,1],[266,1],[333,1],[409,3],[422,1],[527,3],[566,1],[576,1],[661,1],[667,1],[700,2],[716,1],[733,1],[735,2],[783,2],[817,1],[819,1],[821,3]]},"639":{"position":[[326,1],[336,1],[439,1],[445,1],[478,2],[490,1],[507,2],[521,1],[538,1],[540,1],[542,1],[544,1],[546,3]]},"646":{"position":[[8,1],[22,1],[44,1],[63,1]]},"647":{"position":[[171,1],[173,1],[175,2],[235,2],[314,2],[375,1],[395,1],[471,2],[536,1]]},"648":{"position":[[113,1],[115,1],[117,2],[224,1],[244,1],[280,2]]},"649":{"position":[[112,1],[114,1],[180,1],[200,1],[255,1],[335,2],[343,1],[400,1],[443,2],[461,1],[463,2]]},"652":{"position":[[8,1],[22,1],[44,1],[64,1]]},"653":{"position":[[124,1],[143,1],[165,1],[192,1],[245,1],[342,1],[344,3],[348,1],[396,1],[440,1],[465,1],[487,2],[515,1],[520,1],[525,1],[530,1],[536,2],[550,3],[554,1],[624,1],[685,1],[751,1],[774,2],[804,1],[810,2],[824,3],[828,1],[865,1],[921,1],[943,2],[960,1],[965,1],[970,2],[983,3],[987,1],[1005,1],[1048,1],[1091,1],[1141,1],[1193,1],[1210,2],[1244,3],[1248,1],[1290,1],[1338,1],[1399,1],[1443,1],[1460,2],[1487,1],[1489,3]]},"654":{"position":[[84,3],[88,1],[124,1],[169,2],[204,3],[208,1],[243,1],[293,2],[332,3],[336,1],[369,1],[402,1],[443,2]]},"655":{"position":[[391,2],[453,2]]},"659":{"position":[[437,1],[451,1],[484,2],[544,3],[548,2],[562,1],[570,1],[572,1],[609,3],[613,2],[627,2],[675,3]]},"661":{"position":[[629,1],[652,1],[683,1],[756,1],[758,1],[760,1],[841,1],[853,1],[886,1],[1048,1],[1099,1],[1175,1],[1262,2],[1269,1],[1276,1],[1278,1]]},"662":{"position":[[1026,2],[1397,1],[1420,1],[1451,1],[1524,1],[1526,1],[1528,1],[1632,1],[1651,1],[1686,1],[1722,1],[1767,1],[1779,1],[1818,1],[1916,2],[1926,1],[1978,1],[2077,2],[2080,2],[2118,1],[2257,2],[2260,3],[2284,2],[2324,1],[2370,1],[2380,1],[2440,1],[2446,1],[2479,2],[2488,1],[2505,2],[2513,1],[2530,1],[2532,2],[2560,1],[2562,1],[2564,3],[2676,1],[2720,1],[2734,1],[2808,1],[2822,1],[2852,3],[2856,3],[2860,5]]},"672":{"position":[[27,1],[54,3],[82,1],[179,2],[182,1],[193,1],[213,2],[216,3],[220,2],[223,2],[226,1]]},"673":{"position":[[8,1],[20,1],[70,1],[185,2],[188,1],[199,1],[219,2],[222,3],[226,2],[229,2],[232,2],[235,3],[239,1]]},"674":{"position":[[43,1],[45,1],[72,2],[75,3],[79,2],[91,1],[93,2],[226,2],[229,1],[231,2],[234,3],[238,2],[241,2],[298,1],[341,1],[352,3],[371,1],[468,2],[471,1],[482,1],[502,2],[505,3],[509,2],[512,2],[515,2],[518,3],[522,1]]},"675":{"position":[[226,1],[244,1]]},"676":{"position":[[300,1],[317,1]]},"678":{"position":[[250,1],[252,1],[254,2],[296,1],[308,2],[311,2],[351,1],[368,1],[370,2]]},"680":{"position":[[292,2],[349,1],[385,1],[413,2],[451,1],[465,1],[509,2],[537,1],[556,1],[578,1],[605,1],[666,1],[747,3],[751,2],[807,1],[809,1],[869,1],[875,1],[908,2],[919,1],[962,2],[992,2],[1039,2],[1076,1],[1078,2],[1109,1],[1111,1],[1113,2],[1166,1],[1185,1],[1187,3],[1191,2],[1229,1],[1280,2],[1379,1],[1387,1],[1399,1],[1401,1],[1403,3]]},"681":{"position":[[644,2],[718,1],[725,1],[736,1],[738,2],[741,2],[800,1],[808,1],[820,1],[822,2],[825,2],[916,1],[918,2],[921,3],[925,1],[927,3]]},"682":{"position":[[346,1],[358,1],[360,3],[364,3],[368,3],[372,2],[384,1],[386,3],[390,3],[394,3],[398,1],[400,2],[403,1],[415,1],[417,3],[421,3],[425,3],[429,2],[441,1],[443,3],[447,3],[451,3],[455,1],[457,2],[460,1],[472,1],[474,3],[478,3],[482,3],[486,2],[498,1],[500,3],[504,3],[508,3],[512,1],[514,2],[517,1],[529,1],[531,3],[535,3],[539,3],[543,2],[555,1],[557,3],[561,3],[565,3],[569,1],[571,1],[573,3]]},"683":{"position":[[131,2],[214,3],[218,2],[305,1],[313,1],[335,1],[337,1],[339,3],[768,1],[770,2],[824,1],[841,1],[843,2],[855,1],[857,2],[907,1],[929,1],[931,2],[946,1],[948,2],[1013,1],[1025,1],[1027,1],[1029,3]]},"684":{"position":[[190,1],[198,1],[215,1],[217,1],[219,3],[223,2]]},"691":{"position":[[235,1],[237,1],[279,3],[325,1],[334,1],[396,2],[502,2],[505,1],[507,2]]},"693":{"position":[[702,2],[719,1],[744,1],[746,1],[788,1],[809,1],[811,1],[884,2],[887,1],[992,3],[996,3],[1001,2],[1022,1],[1048,1],[1050,1],[1092,1],[1113,1],[1115,1],[1166,1],[1289,2],[1292,3],[1296,2],[1299,3],[1303,2]]},"698":{"position":[[2722,2],[2825,2],[2893,2],[2960,2]]},"710":{"position":[[856,2],[1547,1],[1566,1],[1588,1],[1615,1],[1659,2],[1687,1],[1769,3],[1773,2],[1813,1],[1859,1],[1861,2],[1864,3],[1868,2],[1871,1],[1873,3],[1877,2],[1955,2],[1983,1],[2027,1],[2041,1],[2054,2],[2115,1],[2129,1],[2159,3],[2163,3],[2167,5]]},"711":{"position":[[1116,1],[1147,1],[1200,2],[1257,1],[1354,3],[1385,3],[1543,1],[1574,1],[1611,1],[1624,3],[1628,3],[1632,3],[1735,1],[1787,1]]},"717":{"position":[[149,2],[556,1],[594,1],[645,1],[672,1],[716,2],[793,1],[869,3],[1059,1],[1078,1],[1106,2],[1147,1],[1245,3],[1416,1],[1418,1],[1478,1],[1484,1],[1517,2],[1528,1],[1545,2],[1548,2],[1590,2],[1632,1],[1641,1],[1643,2]]},"718":{"position":[[101,1],[156,1],[216,1],[240,1],[289,2],[375,1],[449,3],[476,1],[478,1],[480,2],[517,1],[529,1],[606,2],[609,2],[650,1],[760,3],[764,2],[767,3],[771,2]]},"720":{"position":[[133,1],[135,1],[177,1],[179,2],[182,3],[186,2],[189,2],[205,1],[223,2],[294,1],[296,2]]},"724":{"position":[[49,2],[179,1],[202,1],[251,1],[265,1],[442,1],[462,1],[521,1],[549,2],[662,2],[757,3],[761,1],[822,1],[895,1],[961,1],[987,1],[989,1],[991,1],[993,1],[1008,2],[1049,3],[1053,1],[1066,1],[1106,1],[1147,2],[1169,3],[1173,1],[1186,1],[1261,1],[1347,1],[1368,2],[1398,3],[1402,1],[1415,1],[1479,2],[1496,3],[1500,3],[1538,2],[1628,1],[1663,3],[1667,1],[1721,1],[1786,2],[1810,1],[1844,1],[1856,3]]},"729":{"position":[[354,1],[388,1],[390,1],[397,1],[416,2],[419,2]]},"731":{"position":[[128,1],[214,1]]},"732":{"position":[[116,1],[136,2],[139,3],[143,2],[146,1]]},"734":{"position":[[132,1],[163,1],[209,1],[236,1],[312,1],[381,3],[416,1],[435,1],[472,1],[554,3],[609,1],[611,1],[635,2],[743,1],[749,1],[782,2],[831,1],[833,2],[836,3],[840,2],[843,1],[845,2],[880,1],[899,1],[901,3]]},"738":{"position":[[84,1],[98,1],[120,1],[147,1]]},"739":{"position":[[196,1],[223,1],[276,1],[403,3],[446,1],[465,1],[467,3],[509,1],[548,2],[603,2],[612,1],[625,1],[739,3],[743,2],[751,1],[758,3]]},"740":{"position":[[423,1],[460,1],[519,1],[601,1],[609,2],[618,1],[620,2],[691,1]]},"741":{"position":[[53,1]]},"745":{"position":[[203,1],[226,1],[271,1],[295,1],[344,2],[399,1],[459,3],[463,2],[521,1],[592,3],[596,2]]},"746":{"position":[[287,1],[358,1],[360,2],[431,3],[435,1],[472,2],[475,2],[562,2],[667,2],[859,1],[861,3]]},"747":{"position":[[104,1],[349,3]]},"749":{"position":[[382,3],[389,3],[4417,1],[4455,1],[4484,2]]},"751":{"position":[[503,1],[551,1],[553,2],[647,1],[682,2],[715,1],[717,1],[719,1],[721,3],[807,1],[855,1],[890,1],[925,2],[958,2],[961,3],[965,1],[1025,1],[1092,2],[1116,2],[1204,2],[1290,1],[1411,1],[1428,1],[1468,1],[1495,3],[1499,1],[1501,1],[1503,1],[1505,3],[1605,1],[1653,1],[1655,2],[1749,1],[1784,2],[1817,2],[1820,3],[1824,1],[1875,1],[1920,2],[2009,1],[2011,1],[2013,1],[2015,3]]},"752":{"position":[[362,1],[408,1],[455,2],[520,1],[549,3],[583,3],[602,1],[604,1],[606,1],[608,3],[612,2],[657,1],[705,3],[716,1],[726,1],[728,2],[782,2],[863,1],[897,2],[1041,2],[1070,3],[1074,2],[1112,1],[1132,2],[1151,1],[1160,1],[1177,1],[1190,2],[1248,2],[1285,2],[1307,1],[1309,1],[1421,1]]},"753":{"position":[[256,1],[334,1],[375,1],[410,1],[412,1],[445,2],[448,3],[452,3]]},"754":{"position":[[201,1],[214,1],[255,1],[257,1],[286,2],[402,2],[432,2],[541,1],[543,3],[562,1],[591,2],[691,1],[766,2],[784,1],[786,1]]},"759":{"position":[[94,1],[111,1],[159,1],[183,1],[239,1],[266,1],[314,2],[352,1],[452,3],[500,3],[504,1],[532,1],[580,1],[617,2],[698,2],[747,2],[778,2],[950,1],[1003,1],[1005,3]]},"760":{"position":[[104,1],[132,1],[186,1],[188,1],[253,2],[256,3],[260,2],[270,1],[287,1],[335,1],[362,1],[410,2],[496,3],[500,1],[528,1],[576,1],[613,2],[694,2],[743,2],[838,1],[891,1],[893,3],[897,2],[900,3],[904,2]]},"761":{"position":[[105,2],[422,2],[459,1],[481,1],[546,2],[567,2],[585,1],[607,1],[689,2],[707,1],[729,1]]},"767":{"position":[[316,2],[370,2],[415,1],[421,2],[432,2],[488,2],[498,2],[603,2],[614,2],[712,2],[737,2],[804,2],[815,2],[884,2],[894,2],[1012,2]]},"768":{"position":[[273,2],[337,2],[389,1],[403,2],[414,2],[480,2],[490,2],[605,2],[616,2],[722,2],[745,2],[810,2],[821,2],[888,2],[898,2],[1014,2]]},"769":{"position":[[290,2],[356,2],[367,2],[435,2],[445,2],[562,2],[573,2],[683,2],[708,2],[775,2],[786,2],[855,2],[865,2],[983,2]]},"770":{"position":[[411,1],[418,2],[437,3],[441,3],[455,1],[520,2]]},"772":{"position":[[641,1],[660,1],[682,1],[709,1],[762,1],[897,2],[900,3],[904,2],[957,1],[976,1],[978,3],[982,2],[1010,1],[1044,1],[1061,1],[1428,1],[1447,1],[1469,1],[1511,1],[1607,1],[1748,2],[1751,3],[2136,1],[2155,1],[2200,1],[2262,1],[2281,1],[2369,1],[2504,2],[2507,3]]},"773":{"position":[[443,1],[462,1],[484,1],[505,1],[552,1],[628,3],[821,1]]},"774":{"position":[[446,1],[465,1],[487,1],[514,1],[565,1],[592,1],[654,1],[825,2],[828,2],[831,3]]},"789":{"position":[[158,1],[202,1],[231,1],[270,1],[272,1],[274,1],[276,3],[310,2],[405,1],[449,1],[478,1],[518,1],[520,1],[522,1],[524,3],[558,2]]},"791":{"position":[[14,1],[58,1],[87,1],[126,1],[128,1],[130,1],[132,3],[146,1],[206,2],[273,1],[317,1],[346,1],[381,1],[383,1],[395,1],[397,5],[403,1],[405,1],[407,1],[409,3],[452,3],[466,1],[526,2]]},"792":{"position":[[141,1],[185,1],[218,1],[257,1],[259,1],[261,1],[263,3],[277,1],[327,1],[416,3],[454,2]]},"793":{"position":[[149,2],[213,2],[242,2],[278,2],[462,2],[499,2],[525,2],[552,2],[564,2],[595,2],[607,2],[622,2],[1175,2],[1210,2]]},"795":{"position":[[128,2],[137,1],[205,1],[207,2],[216,2]]},"796":{"position":[[297,3],[301,1],[350,1],[413,2],[430,1],[432,1],[444,1],[451,1],[453,1],[461,1],[473,2],[476,2],[479,1],[487,1],[499,2],[508,1],[524,1],[526,2],[529,1],[537,1],[550,1],[552,2],[586,1],[588,1],[590,3],[594,1],[646,1],[709,1],[771,1],[835,2],[855,1],[857,1],[869,1],[877,1],[903,2],[929,1],[960,2],[994,1],[996,1],[998,1],[1000,3],[1004,1],[1066,1],[1129,2],[1148,1],[1150,1],[1162,1],[1164,3],[1168,1],[1254,1],[1333,2],[1344,1],[1351,1],[1376,2],[1391,2],[1435,1],[1437,1],[1439,1]]},"797":{"position":[[249,1],[281,1],[283,2],[286,3],[290,2],[293,2],[296,2],[331,1],[352,1],[354,3]]},"798":{"position":[[540,1],[576,1],[583,1],[593,2],[604,1],[615,1],[617,2],[620,3],[624,1],[692,1],[725,1],[811,1],[908,2],[936,3]]},"799":{"position":[[509,2],[518,1],[554,1],[569,1],[599,3],[650,3],[654,2],[663,2],[678,1],[702,3],[706,5],[731,2],[786,1],[801,1],[857,3]]},"800":{"position":[[806,1],[838,3],[842,5],[865,1],[899,1],[960,3],[964,5],[1016,1],[1018,2]]},"806":{"position":[[575,1],[610,1],[639,1],[641,2],[702,1],[704,1],[706,2],[709,2],[791,2]]},"808":{"position":[[133,1],[135,1],[220,1],[228,1],[245,2],[260,1],[276,2],[321,2],[410,1],[412,1],[414,2],[528,1],[530,1],[592,1],[600,1],[617,2],[629,1],[667,1],[684,1],[686,1],[688,1],[690,2]]},"810":{"position":[[256,3],[325,3],[339,1],[404,1]]},"811":{"position":[[236,3],[305,3],[319,1],[384,1],[409,2]]},"812":{"position":[[20,1],[63,1],[73,1],[115,1],[123,1],[140,2],[151,1],[181,1],[191,1],[222,1],[224,1],[226,1],[228,1],[230,1],[232,1],[234,3],[251,1]]},"813":{"position":[[20,1],[63,1],[73,1],[115,1],[123,1],[140,2],[152,1],[190,1],[207,1],[209,1],[211,1],[213,1],[215,1],[217,3],[302,1],[327,1],[329,3],[343,1],[407,1]]},"818":{"position":[[485,1],[529,1],[585,2],[588,3],[592,2],[595,1],[597,1],[599,3]]},"820":{"position":[[8,1],[24,1],[78,1],[102,1],[161,1],[209,3],[213,1],[263,1],[312,2],[349,3],[353,1],[406,1],[445,2],[457,1],[459,3],[463,1],[502,1],[542,2],[559,1],[571,1],[578,1],[588,1],[590,2],[593,2],[611,1],[623,1],[630,1],[640,2],[653,1],[671,1],[673,2],[676,1],[678,2],[691,4],[720,4],[725,3]]},"824":{"position":[[552,2]]},"825":{"position":[[100,1],[126,1],[175,1],[196,1],[333,1],[465,3],[469,2],[549,1],[569,1],[600,1],[615,1],[648,1],[660,1],[778,1],[882,2],[885,2],[920,1],[940,1],[961,2],[1013,1],[1050,1]]},"826":{"position":[[65,1],[254,2],[359,2],[373,2],[444,1],[476,2],[506,1],[531,2],[599,1],[618,2],[695,1],[722,2],[733,2],[807,1],[831,2],[905,1],[933,2],[952,2],[1026,1],[1050,2],[1110,1]]},"829":{"position":[[466,1],[498,1],[520,1],[547,1],[620,1],[631,1],[717,3],[755,1],[776,1],[778,3],[782,3],[786,1],[808,1],[837,1],[864,2],[878,1],[1255,1],[1277,1],[1300,1],[1321,1],[1357,1],[1371,1],[1402,1],[1404,2],[1413,1],[1445,1],[1478,1],[1493,1],[1501,2],[1510,1],[1521,1],[1561,2],[1574,2],[1577,4],[1595,2],[1604,1],[1731,1],[1740,1],[1789,3],[1810,3],[1842,2],[1845,2],[1900,1],[1918,1],[1964,1],[2324,1],[2337,1],[2378,1],[2380,1],[2411,1],[2423,3],[2433,2],[2448,2],[2451,1],[2453,2],[2472,1],[2474,2],[2483,1],[2491,1],[2510,1],[2512,1],[2546,1],[2592,1],[2658,2],[3236,1],[3253,1],[3294,1],[3296,1],[3327,1],[3339,3],[3349,2],[3364,2],[3367,1],[3369,2],[3387,1],[3389,2],[3398,1],[3406,1],[3425,1],[3427,1],[3465,1],[3511,1],[3520,1],[3557,1],[3608,3],[3624,2],[3627,2]]},"835":{"position":[[368,3],[372,1],[403,1],[447,2],[497,1]]},"836":{"position":[[681,1],[939,1],[946,1],[948,1]]},"837":{"position":[[1855,1],[2103,1],[2128,1],[2161,3]]},"838":{"position":[[1514,2],[1949,1],[1968,1],[1990,1],[1997,1],[2056,2],[2066,1],[2118,1],[2196,1],[2223,2],[2252,2],[2357,2],[2493,2],[2496,3],[2538,1],[2584,1],[2594,1],[2654,1],[2660,1],[2693,2],[2702,1],[2719,2],[2727,1],[2744,1],[2746,2],[2774,1],[2776,1],[2778,3],[2890,1],[2934,1],[2948,1],[3022,1],[3036,1],[3066,3],[3070,3],[3074,5]]},"846":{"position":[[55,1],[74,1],[140,1],[160,1],[239,2],[318,3],[322,1],[351,1],[387,1],[404,2],[419,3],[423,1],[465,1],[505,1],[538,1],[575,1],[595,1],[608,2],[645,1],[647,3],[651,1],[707,1],[720,2],[738,3],[742,1],[787,1],[818,1],[831,2],[858,3],[862,3],[866,4],[871,3],[875,1],[908,1],[952,1],[1025,1],[1053,2],[1073,2],[1082,1],[1084,3],[1088,1],[1133,1],[1146,2],[1164,3],[1168,1],[1206,1],[1253,1],[1266,2],[1293,3],[1297,3],[1301,3],[1305,1],[1307,1],[1309,2]]},"848":{"position":[[198,1],[221,1],[223,2],[301,1],[331,2],[398,1],[424,1],[426,3],[430,1],[432,2],[532,2],[628,2],[631,2],[657,1],[677,1],[793,3],[797,1],[835,2],[866,3],[876,2],[879,1],[881,2],[1028,1],[1173,1],[1226,1],[1292,1],[1312,1],[1428,3],[1432,1],[1470,2],[1548,3],[1558,2],[1561,1],[1563,2]]},"849":{"position":[[870,1],[895,1],[1136,1],[1138,1]]},"851":{"position":[[233,2],[310,1],[360,1],[382,1],[398,1],[400,2]]},"852":{"position":[[175,1],[195,1],[336,3],[346,2],[349,1],[351,2]]},"854":{"position":[[99,1],[141,1],[168,1],[213,1],[242,1],[321,1],[334,2],[337,3],[341,2],[344,3],[372,1],[419,1],[598,1],[732,1],[806,2],[809,3],[813,1],[877,1],[920,1],[960,1],[981,2],[990,3],[1000,3],[1004,3],[1008,1],[1053,1],[1070,2],[1085,3],[1089,1],[1142,1],[1144,1],[1190,1],[1243,1],[1299,1],[1342,1],[1402,1],[1434,1],[1484,1],[1535,1],[1575,1],[1605,2],[1648,3]]},"857":{"position":[[212,1],[246,1],[295,1],[372,1],[439,2],[442,3]]},"858":{"position":[[180,1],[202,1],[243,1],[317,2],[326,1],[336,1],[355,5],[369,1],[371,2],[380,1],[420,3],[429,1],[431,1],[433,2],[506,3]]},"860":{"position":[[486,1]]},"861":{"position":[[566,1],[619,1],[684,1],[719,1],[866,1],[893,1],[2115,1],[2138,1]]},"862":{"position":[[225,1],[245,1],[296,1],[342,1],[377,1],[404,1],[455,1],[464,1],[531,1],[608,3],[627,1],[629,1],[709,1],[715,1],[748,2],[757,1],[774,1],[776,2],[804,2],[841,1],[860,1],[862,3],[883,1],[969,1],[1132,1],[1323,2],[1387,1],[1404,2],[1413,1],[1429,2],[1432,2],[1435,1],[1437,3],[1441,1],[1501,1],[1530,1],[1532,3],[1536,2],[1539,3]]},"866":{"position":[[351,1],[367,1],[430,1],[535,2],[611,3],[615,1],[685,1],[728,1],[767,2],[807,1],[835,2],[856,1],[872,2],[881,1],[897,1],[899,3]]},"872":{"position":[[852,1],[866,1],[902,1],[993,1],[1080,1],[1112,1],[1128,1],[1130,3],[1547,1],[1579,1],[1601,1],[1622,1],[1660,2],[1705,1],[1780,3],[1784,2],[1848,1],[1858,1],[1926,1],[1940,1],[1973,2],[1987,1],[2004,2],[2017,1],[2034,1],[2036,2],[2089,1],[2091,1],[2093,3],[2287,1],[2306,1],[2372,1],[2402,1],[2506,2],[2584,1],[2600,2],[2609,1],[2625,2],[2639,3],[3107,1],[3124,1],[3168,1],[3193,1],[3252,1],[3342,3],[3346,3],[3365,1],[3437,3],[3524,2],[3782,1],[3801,1],[3823,1],[3843,1],[3887,1],[3905,1],[3963,1],[4040,3],[4078,1],[4088,1],[4156,1],[4170,1],[4203,2],[4217,1],[4234,2],[4247,1],[4264,1],[4266,2],[4319,1],[4321,1],[4323,3],[4327,2],[4396,2],[4458,1],[4600,1],[4616,2],[4625,1],[4641,1],[4643,3]]},"873":{"position":[[108,1]]},"875":{"position":[[309,2],[334,1],[358,1],[416,1],[528,1],[530,2],[557,2],[560,2],[569,1],[571,2],[598,2],[601,1],[603,3],[780,2],[805,1],[819,1],[886,1],[957,1],[1008,1],[1066,1],[1120,1],[1158,2],[1161,3],[1187,2],[1205,2],[1214,1],[1264,3],[2003,2],[2028,1],[2042,1],[2104,1],[2115,1],[2147,1],[2198,1],[2234,1],[2236,3],[2240,1],[2304,1],[2370,1],[2444,2],[2447,1],[2459,1],[2476,1],[2478,2],[2481,1],[2493,1],[2510,1],[2516,1],[2526,1],[2528,1],[2530,1],[2532,2],[2636,1],[2655,3],[2661,1],[2663,1],[2679,1],[2681,1],[2683,1],[2760,2],[2876,4],[2881,3],[3051,2],[3092,1],[3124,2],[3127,3],[3131,2],[3140,1],[3202,1],[3221,1],[3250,1],[3264,1],[3283,1],[3305,1],[3307,3],[3326,1],[3425,2],[3439,1],[3471,1],[3528,2],[3531,1],[3533,1],[3535,2],[3538,3],[3542,2],[3545,3],[4249,2],[4274,1],[4288,1],[4323,1],[4333,1],[4348,2],[4398,1],[4421,1],[4472,1],[4491,1],[4519,1],[4521,3],[4537,1],[4539,1],[4571,3],[4592,2],[4653,1],[4778,2],[4781,1],[4850,2],[4853,1],[4940,1],[5026,2],[5055,3],[5098,1],[5100,1],[5102,1],[5104,2],[5159,1],[5166,1],[5168,2],[5299,2],[5369,1],[5371,1],[5456,2],[5459,1],[5461,1],[5525,1],[5614,3],[6095,2],[6136,1],[6168,2],[6171,3],[6175,2],[6184,1],[6231,1],[6271,1],[6298,1],[6365,2],[6401,3],[6426,1],[6477,1],[6479,1],[6481,2],[6484,3],[6488,2],[6491,3],[7203,2],[7261,1],[7282,1],[7377,3],[7400,1],[7436,1],[7455,1],[7457,1],[7481,1],[7492,3],[7512,2],[7550,3],[8021,2],[8046,1],[8056,1],[8091,1],[8126,1],[8176,1],[8200,1],[8202,2],[8227,1],[8241,1],[8259,1],[8371,3],[8375,2],[8401,1],[8433,2],[8436,3],[8440,2],[8449,1],[8451,2],[8454,3],[8458,2],[8499,1],[8501,2],[8504,3],[8508,2],[8511,3],[8941,2],[8979,1],[8981,2],[9440,2],[9465,1],[9475,1],[9510,1],[9545,1],[9595,1],[9619,1],[9621,2],[9646,1],[9648,2],[9710,1],[9748,1],[9788,1],[9790,3]]},"878":{"position":[[187,1],[205,1],[277,1],[416,2],[495,1],[534,2],[543,3],[553,3],[568,3]]},"879":{"position":[[664,1],[685,3]]},"880":{"position":[[377,1],[446,3],[450,3]]},"881":{"position":[[387,1],[430,3]]},"882":{"position":[[394,1],[420,2],[423,3],[427,2],[468,2],[471,3],[475,2],[478,3]]},"885":{"position":[[536,1],[618,1],[631,1],[713,1],[732,1],[765,1],[786,1],[831,1],[844,1],[909,1],[935,1],[1052,1],[1068,1],[1070,1],[1104,1],[1215,1],[1217,1],[1270,1],[1303,1],[1326,1],[1346,1],[1394,1],[1476,1],[1478,1],[1502,1],[1516,1],[1534,1],[1555,1],[1557,3],[1580,1],[1598,1],[1626,1],[1631,2],[1703,1],[1733,1],[1840,3],[1857,1],[1935,1],[1937,3],[1941,2],[2029,1],[2064,1],[2185,3],[2203,1],[2205,2],[2300,1],[2302,3],[2306,2],[2367,1],[2418,2],[2476,1],[2535,1],[2537,1],[2584,1],[2593,1],[2645,1],[2663,1],[2665,1]]},"886":{"position":[[386,1],[414,1],[416,3],[420,1],[464,1],[497,2],[517,1],[530,1],[532,1],[538,3],[555,2],[558,1],[572,1],[635,1],[687,1],[699,1],[731,1],[744,1],[759,1],[761,1],[763,3],[774,1],[822,1],[842,1],[844,2],[847,2],[923,1],[942,1],[1008,1],[1028,1],[1058,2],[1096,1],[1133,2],[1142,1],[1176,2],[1232,2],[1329,2],[1454,3],[1458,1],[1522,1],[1582,1],[1642,1],[1669,1],[1734,1],[1750,2],[1767,2],[1770,2],[1846,1],[1881,2],[1884,3],[1888,1],[1946,2],[1996,1],[2003,1],[2026,1],[2044,1],[2052,1],[2054,2],[2294,1],[2307,1],[2321,1],[2323,1],[2378,1],[2413,1],[2445,1],[2447,1],[2449,2],[2468,1],[2470,1],[2488,2],[2498,1],[2545,2],[2548,2],[2640,1],[2660,1],[2690,2],[2728,1],[2765,2],[2774,1],[2808,2],[2839,3],[2843,1],[2866,1],[2942,2],[2959,3],[2963,1],[2985,1],[3063,1],[3104,2],[3131,2],[3143,1],[3178,2],[3187,1],[3189,2],[3192,3],[3196,2],[3199,2],[3202,2],[3205,3],[3209,2],[3212,1],[3214,2],[3489,1],[3507,1],[3521,1],[3565,1],[3597,1],[3609,1],[3645,2],[3659,1],[3674,1],[3676,1],[3678,3],[3689,1],[3709,1],[3719,1],[3721,2],[3724,2],[3827,1],[3847,1],[3877,2],[3915,1],[3990,2],[4041,2],[4050,1],[4099,2],[4111,1],[4146,2],[4155,1],[4274,2],[4332,2],[4418,2],[4551,2],[4645,2],[4765,2],[4874,1],[4895,1],[4897,2],[4924,1],[4926,2]]},"887":{"position":[[293,1],[313,1],[348,3],[352,3],[356,4],[370,3],[374,3],[378,4],[389,3],[393,3],[397,4],[408,1],[463,1],[465,2],[521,2],[623,1],[631,3],[641,1],[658,1],[660,3],[676,2],[679,2],[682,2],[685,3],[689,2],[692,1],[694,2]]},"888":{"position":[[350,1],[352,1],[434,1],[454,1],[489,3],[493,3],[497,4],[511,3],[515,3],[519,4],[530,3],[534,3],[538,4],[549,1],[600,2],[664,2],[791,2],[892,1],[894,1],[896,3],[900,1],[971,1],[1018,2],[1032,1],[1056,1],[1099,3],[1105,1],[1125,1],[1127,1],[1198,1],[1200,2],[1203,1],[1205,2],[1208,2],[1211,3],[1215,2],[1218,1],[1220,2]]},"889":{"position":[[154,1],[222,1],[238,1],[240,1],[380,1],[390,2],[483,1],[503,1],[538,3],[542,3],[546,4],[560,3],[564,3],[568,4],[579,1],[630,1],[632,3],[636,1],[716,2],[751,2],[754,2],[763,3],[767,3],[771,4],[776,2],[779,3],[783,2],[786,1],[788,2]]},"890":{"position":[[356,5],[362,3],[803,1],[833,2],[836,3],[840,2],[867,2],[870,3],[874,2],[877,1],[879,2]]},"892":{"position":[[8,1],[27,1],[49,1],[72,1],[117,2],[169,1],[198,3],[202,5],[208,2],[254,1],[335,3],[339,2]]},"893":{"position":[[96,1],[127,1],[172,2],[220,1],[259,3],[263,1],[295,1],[338,1],[371,2],[436,3],[440,2]]},"898":{"position":[[943,1],[1207,2],[2155,2],[2172,1],[2191,1],[2226,1],[2253,1],[2313,1],[2390,3],[2428,1],[2438,1],[2506,1],[2520,1],[2553,2],[2567,1],[2584,2],[2597,1],[2614,2],[2622,1],[2639,1],[2641,2],[2694,1],[2696,1],[2698,3],[2981,1],[2996,1],[3050,1],[3116,2],[3238,1],[3258,1],[3320,1],[3464,1],[3481,2],[3536,1],[3538,2],[3606,1],[3608,2],[3676,2],[3685,2],[3694,1],[3696,2],[3754,2],[3865,2],[3868,2],[3877,1],[3893,2],[3896,2],[3947,2],[3978,2],[4006,3],[4010,2],[4397,1]]},"899":{"position":[[72,1],[148,1],[207,1],[274,1],[349,1],[439,1]]},"904":{"position":[[572,1],[591,1],[626,1],[653,1],[706,1],[787,3],[824,1],[834,1],[916,1],[922,1],[955,2],[965,1],[982,2],[991,1],[1025,2],[1037,1],[1075,1],[1077,2],[1114,1],[1116,1],[1118,3],[1122,2],[1261,3],[1312,1],[1362,1],[1803,1],[1828,1],[1830,2],[1901,2],[1969,2],[2034,2],[2110,2],[2191,2],[2274,3],[2278,1],[2351,1],[2431,1],[2507,1],[2530,2],[2592,2],[2625,2],[2681,2],[2792,2],[2837,2],[2933,2],[2983,2],[3084,3],[3094,3],[3104,2],[3107,1],[3109,2]]},"906":{"position":[[893,1],[926,1],[986,1],[1038,2],[1052,3]]},"907":{"position":[[279,1],[304,1],[306,2],[309,3],[313,2],[348,1],[363,1],[371,3],[381,2],[384,2],[387,3],[391,2],[394,1],[396,2]]},"910":{"position":[[225,1],[227,1],[229,2],[232,3],[236,2],[295,2],[298,2],[301,3],[305,2],[308,2],[393,1],[395,1],[461,2]]},"911":{"position":[[577,1],[589,1],[624,1],[649,1],[651,2],[654,3],[658,2],[829,3],[839,3],[849,2],[852,2],[855,3],[859,2],[862,1],[864,2]]},"915":{"position":[[76,1],[90,1],[112,1],[136,1]]},"916":{"position":[[140,1],[142,1],[184,1],[186,2],[189,1],[191,2],[194,1],[196,2],[199,1],[201,2],[217,1],[235,2],[306,1],[308,2],[330,1],[374,1],[393,1],[395,3]]},"917":{"position":[[88,1],[101,1],[133,1],[167,1],[184,2],[263,2],[322,2],[380,1],[382,2]]},"918":{"position":[[96,1],[193,3]]},"919":{"position":[[103,1]]},"920":{"position":[[75,1]]},"921":{"position":[[166,1],[168,3],[232,1],[246,2]]},"929":{"position":[[86,1]]},"930":{"position":[[91,1],[141,1],[171,2]]},"931":{"position":[[91,1],[151,1],[187,2]]},"932":{"position":[[85,1],[141,1],[177,2],[685,1],[724,1],[778,1],[802,1],[851,2],[948,1],[1022,3],[1035,1],[1125,3],[1129,2],[1192,1],[1194,1],[1236,1],[1238,2],[1241,1],[1243,2],[1246,1],[1248,2],[1251,1],[1253,2],[1269,1],[1294,2],[1364,1],[1366,2],[1369,2],[1372,3],[1440,2]]},"934":{"position":[[223,1],[259,2],[266,1],[291,1],[320,3],[324,2],[381,3],[385,2],[440,3],[444,2],[497,3],[501,2],[584,3],[588,2],[621,2],[688,2],[764,2],[816,2],[819,2],[875,1],[877,2],[880,3],[884,1],[886,3]]},"939":{"position":[[102,2],[148,1],[184,1],[203,1],[205,3],[227,1],[271,3]]},"941":{"position":[[171,2]]},"942":{"position":[[180,1],[239,3]]},"943":{"position":[[377,1],[447,3]]},"944":{"position":[[190,1],[256,2],[259,1],[292,4],[297,2],[305,1],[307,2],[345,2],[355,2],[358,2],[361,1]]},"945":{"position":[[131,1],[188,3],[192,2],[200,1],[202,2],[240,2],[250,2],[253,2],[256,1],[452,1],[516,2],[519,3],[523,2],[526,3]]},"946":{"position":[[152,1],[212,3]]},"947":{"position":[[164,1],[198,1],[230,2],[233,1],[265,1],[267,3],[271,3],[275,1],[277,1],[279,1],[315,1],[324,3],[328,1],[330,1],[332,2]]},"948":{"position":[[388,1],[390,1],[405,2],[434,2],[497,2],[684,2],[766,2]]},"949":{"position":[[77,2],[133,1],[193,2]]},"950":{"position":[[223,2],[289,1],[303,1],[349,2]]},"951":{"position":[[328,1],[330,1],[348,2],[351,3],[355,2],[358,2],[375,1],[434,2]]},"952":{"position":[[179,1],[193,1],[215,1],[236,1]]},"953":{"position":[[67,2]]},"954":{"position":[[166,2]]},"957":{"position":[[98,1]]},"958":{"position":[[755,1],[772,1]]},"960":{"position":[[140,1],[159,1],[194,1],[221,1],[274,1],[319,2],[370,2],[389,2],[413,2],[440,2],[490,2],[558,2],[621,2],[624,2],[666,3]]},"962":{"position":[[601,2],[665,1],[692,1],[745,1],[828,3],[832,2],[886,1],[908,1],[961,1],[1111,2],[1114,3]]},"966":{"position":[[529,1],[633,3],[647,1],[751,2],[818,3]]},"967":{"position":[[114,1],[218,3],[232,1],[336,2],[371,3],[375,2]]},"968":{"position":[[318,2],[380,1],[389,1],[447,1],[488,1],[499,1],[558,2],[561,3],[565,2],[568,3]]},"971":{"position":[[291,1],[305,1],[327,1],[348,1]]},"972":{"position":[[66,2]]},"975":{"position":[[317,1],[319,2],[424,3],[428,2],[479,2],[511,1],[513,2],[580,2],[647,3]]},"977":{"position":[[99,2],[546,1],[565,1]]},"978":{"position":[[94,1],[109,1],[133,1]]},"979":{"position":[[228,1],[276,1],[298,3],[344,1],[363,1],[365,3],[369,2]]},"982":{"position":[[240,1],[242,1]]},"983":{"position":[[836,1],[845,1],[847,1],[856,1],[858,1],[860,1],[876,1],[878,1],[880,1],[882,1],[909,1],[911,1],[913,1],[915,1],[917,1],[919,1],[921,1],[923,1],[925,1],[927,1],[929,1],[938,1],[954,1],[963,1],[965,1],[967,1],[994,1],[996,1],[998,1],[1000,1],[1002,1],[1004,1],[1006,1],[1008,1],[1022,1],[1024,1],[1026,1],[1028,1],[1059,1],[1061,1],[1063,1],[1072,1],[1074,1],[1083,1]]},"986":{"position":[[738,1],[740,1],[857,3],[861,1],[897,1],[951,1],[1001,2],[1039,3],[1043,1],[1087,1],[1125,2],[1156,1]]},"987":{"position":[[207,1],[209,1],[704,1],[706,1],[708,1],[710,1]]},"988":{"position":[[122,1],[146,1],[188,1],[202,1],[240,1],[300,3],[304,1],[347,1],[415,1],[485,1],[530,2],[611,3],[615,1],[672,1],[750,1],[814,1],[845,2],[860,3],[864,1],[923,1],[944,1],[1015,1],[1038,1],[1074,2],[1090,1],[1098,3],[1102,1],[1181,1],[1255,1],[1338,1],[1424,1],[1441,2],[1469,3],[1473,1],[1500,1],[1547,1],[1606,1],[1636,2],[1656,3],[1660,1],[1731,1],[1768,1],[1854,1],[1939,1],[1979,1],[1981,1],[2057,1],[2152,1],[2154,1],[2235,1],[2237,1],[2260,2],[2288,3],[2292,1],[2304,1],[2383,2],[2392,1],[2394,3],[2398,1],[2413,2],[2436,1],[2438,3],[2442,1],[2494,2],[2515,1],[2566,1],[2593,1],[2660,2],[2691,2],[2694,3],[2698,3],[2702,1],[2773,1],[2826,2],[2844,1],[2889,2],[2892,3],[2896,1],[2919,1],[2991,2],[3008,3],[3012,1],[3080,1],[3161,1],[3254,1],[3351,1],[3364,2],[3387,2],[3390,3],[3394,1],[3406,1],[3482,2],[3491,1],[3493,3],[3497,1],[3512,2],[3556,1],[3577,1],[3594,1],[3621,1],[3626,3],[3630,1],[3687,2],[3705,1],[3804,2],[3833,1],[3865,1],[3867,3],[3871,1],[3920,1],[3977,1],[4044,1],[4122,2],[4157,3],[4161,1],[4210,1],[4250,1],[4303,2],[4345,3],[4351,1],[4368,1],[4370,1],[4467,1],[4469,2],[4472,2],[4490,3],[4494,1],[4547,1],[4583,1],[4680,1],[4693,2],[4717,3],[4721,1],[4762,1],[4775,1],[4829,2],[4868,2],[4871,3],[4875,3],[4879,1],[4932,1],[5019,1],[5062,2],[5083,1],[5165,1],[5198,1],[5213,1],[5267,3],[5271,1],[5333,1],[5361,1],[5363,1],[5396,1],[5398,1],[5400,1],[5413,1],[5415,1],[5417,1],[5419,1],[5435,1],[5454,1],[5472,1],[5474,1],[5476,1],[5478,2],[5481,1],[5495,1],[5497,1],[5513,1],[5531,1],[5533,1],[5535,1],[5537,1],[5539,2],[5559,1],[5603,3],[5607,1],[5664,2],[5682,1],[5684,2],[5725,1],[5727,2],[5766,1],[5768,2],[5777,1],[5793,1],[5805,1],[5814,1],[5821,1],[5823,3],[5827,1],[5879,1],[5942,1],[6001,1],[6064,1],[6128,2],[6159,1],[6161,1],[6163,1]]},"990":{"position":[[1225,1],[1336,3],[1344,1],[1346,1],[1348,2],[1417,1],[1419,3]]},"993":{"position":[[85,2],[212,2],[329,2],[476,2],[613,2]]},"995":{"position":[[1442,2],[1550,1],[1572,2],[1650,1],[1739,1],[1758,2],[1761,2],[1764,2],[1767,2],[1855,1],[1862,1],[1867,1],[1872,1],[2002,1],[2004,2]]},"996":{"position":[[497,2],[587,1]]},"998":{"position":[[174,2]]},"1000":{"position":[[157,2]]},"1001":{"position":[[74,2]]},"1002":{"position":[[257,2],[406,1],[421,2],[537,1],[658,2],[661,3],[665,2],[674,1],[685,2],[688,3],[692,3],[735,1],[737,3],[931,2],[1006,1],[1074,2],[1191,1],[1312,2],[1315,3],[1319,2],[1328,1],[1339,2],[1342,3],[1346,3],[1390,1],[1392,3]]},"1003":{"position":[[383,1],[440,2],[443,3],[447,2],[450,3]]},"1007":{"position":[[1180,1],[1182,3],[1186,2],[1260,1],[1323,1],[1339,1],[1341,1],[1375,1],[1468,1],[1503,1],[1515,1],[1608,2],[1611,2],[1614,3],[1618,2],[1621,1],[1623,2],[1632,1],[1661,1],[1673,1],[1727,2],[1730,3],[1734,2],[1737,1],[1739,1],[1741,3],[1773,1],[1793,1],[1834,1],[1846,1],[1892,1],[1944,1],[1946,1],[1948,2],[1998,2],[2098,1],[2202,1],[2244,1],[2273,1],[2275,3],[2279,1]]},"1012":{"position":[[84,1],[98,1],[120,1],[147,1]]},"1013":{"position":[[229,2],[290,1],[395,2],[459,3],[501,1],[547,2],[613,1],[615,3]]},"1014":{"position":[[192,1],[236,2],[242,1],[244,2],[263,1],[265,2],[268,2],[333,1],[375,2],[381,1],[383,2],[402,1],[404,2]]},"1015":{"position":[[168,1],[212,2],[218,1],[220,2],[239,1],[241,2]]},"1016":{"position":[[127,1]]},"1017":{"position":[[110,1],[176,1],[207,2],[239,3]]},"1018":{"position":[[69,1],[110,2],[135,1],[158,2],[225,2],[284,1],[286,2],[289,2],[292,2],[295,3],[299,2],[473,1],[489,2],[512,1],[535,2],[558,1],[567,2],[613,2],[756,1],[758,1],[772,1],[789,1],[860,2],[866,1],[868,2],[887,1],[889,2],[892,2],[955,1]]},"1020":{"position":[[348,1],[482,1],[484,3],[488,1],[538,1],[568,2],[595,1],[676,3],[680,1],[682,1],[684,3]]},"1022":{"position":[[444,1],[585,1],[611,1],[613,2],[711,2],[747,1],[826,2],[870,3],[874,2],[877,1],[879,1],[881,1],[883,3],[1001,1]]},"1023":{"position":[[103,1],[241,1],[267,1],[269,2],[362,2],[398,1],[412,1],[431,3],[495,2],[531,3],[535,2],[538,1],[540,1],[542,1],[544,3],[665,1]]},"1024":{"position":[[197,1],[327,1],[353,1],[370,1],[411,1],[444,1],[539,3],[543,1],[545,1],[547,3]]},"1033":{"position":[[405,2],[430,2],[451,1],[491,1],[603,1],[619,1],[650,2],[663,2],[666,3],[670,2],[673,1],[675,3],[679,2],[700,1],[821,2],[830,1],[861,2],[864,1],[879,2],[882,3],[886,2],[889,1],[891,3]]},"1035":{"position":[[153,3]]},"1036":{"position":[[113,1],[149,2]]},"1038":{"position":[[139,1],[165,2],[185,2],[202,1]]},"1039":{"position":[[143,2],[245,1],[254,1],[265,3],[344,2],[371,2],[419,1],[428,1],[439,3]]},"1040":{"position":[[134,2],[183,1],[202,2],[249,1],[284,2],[385,1],[387,1],[400,2],[482,2]]},"1041":{"position":[[86,3],[90,1],[147,2],[157,1],[171,1],[193,1],[212,1],[305,1],[314,2],[336,2],[345,1],[367,2],[395,1],[397,3]]},"1042":{"position":[[126,1],[144,1],[158,1],[172,1],[190,1],[223,1],[296,2]]},"1043":{"position":[[114,2],[166,3],[200,2]]},"1044":{"position":[[267,2],[320,1],[329,2],[351,1],[353,3],[357,2],[416,1],[430,1],[444,1],[465,3],[469,2],[523,3],[527,2],[583,3]]},"1045":{"position":[[69,1],[135,1],[181,3],[201,1],[252,3],[268,2]]},"1046":{"position":[[96,2]]},"1048":{"position":[[408,2],[458,1],[508,1],[510,3],[514,2],[567,1],[578,1],[597,1],[618,3]]},"1049":{"position":[[94,1],[154,1],[188,2],[248,2]]},"1050":{"position":[[82,2],[151,2]]},"1051":{"position":[[169,1],[211,2],[214,1],[295,3],[299,2],[435,1],[481,2],[484,1],[588,1],[590,3],[594,2],[627,2]]},"1052":{"position":[[187,1],[232,1],[243,2]]},"1053":{"position":[[96,1]]},"1055":{"position":[[141,2],[188,1],[221,1],[228,1],[238,1],[240,1],[242,3]]},"1056":{"position":[[70,2],[96,1],[132,1],[148,1],[150,3],[155,2],[192,1],[228,3],[238,1],[253,1],[255,3],[260,2],[312,1]]},"1057":{"position":[[80,1],[117,1],[161,2],[327,2],[446,1],[485,2],[598,1]]},"1058":{"position":[[214,1],[252,1],[286,1],[314,1],[316,1],[335,3],[339,2],[364,2],[435,3],[439,5],[445,2],[459,2],[484,2],[539,2]]},"1059":{"position":[[59,2],[132,1],[151,1],[224,1],[256,1],[263,1],[273,1],[275,1],[277,3],[308,1],[317,2],[363,1],[365,3]]},"1060":{"position":[[92,1],[124,1],[131,1],[141,1],[143,1],[145,3],[177,2],[213,3]]},"1061":{"position":[[93,1],[125,1],[132,1],[142,1],[144,1],[146,3],[185,1],[199,1],[213,1],[218,2],[280,3]]},"1062":{"position":[[90,2],[149,1],[181,1],[188,1],[198,1],[200,1],[202,3],[206,2],[268,1]]},"1063":{"position":[[80,1],[82,1],[106,2],[139,1],[146,1],[156,1],[158,1],[200,2],[243,1],[250,1],[260,1],[262,1],[304,2]]},"1064":{"position":[[75,2],[114,1],[128,1],[150,1],[175,1],[249,2],[302,1],[358,1]]},"1065":{"position":[[178,2],[239,1],[247,1],[260,1],[262,1],[264,2],[321,2],[324,1],[371,1],[448,1],[560,1],[653,1],[748,1],[778,2],[811,1],[819,1],[839,1],[841,1],[843,2],[900,2],[944,2],[1065,1],[1072,1],[1074,1],[1082,1],[1095,1],[1097,2],[1100,1],[1108,1],[1125,1],[1127,2],[1130,1],[1132,2],[1189,2],[1221,2],[1309,1],[1317,1],[1350,1],[1352,1],[1354,2],[1411,2]]},"1066":{"position":[[346,1],[382,1],[389,1],[399,2],[410,1],[421,1],[423,2],[426,3],[430,1],[498,1],[531,1],[617,1],[714,2],[742,3]]},"1067":{"position":[[288,1],[321,1],[328,1],[338,1],[340,1],[342,2],[399,3],[403,2],[453,1],[475,2],[490,2],[543,1],[572,1],[574,1],[583,1],[585,1],[600,3],[1119,3],[1123,1],[1167,1],[1228,1],[1267,2],[1282,1],[1315,1],[1322,1],[1341,1],[1343,1],[1345,3],[1349,3],[1353,1],[1397,1],[1458,1],[1509,1],[1534,2],[1549,1],[1582,1],[1589,1],[1599,2],[1615,1],[1625,1],[1627,1],[1629,3],[1913,2],[1956,1],[1994,1],[2001,1],[2020,1],[2022,1],[2047,1],[2067,2],[2106,1],[2138,1],[2145,1],[2164,1],[2166,1],[2211,2],[2214,3],[2218,1],[2262,1],[2321,1],[2351,2],[2369,1],[2438,2],[2474,2],[2477,3],[2481,2],[2484,3]]},"1069":{"position":[[466,1],[509,2],[611,1],[661,2],[726,1],[768,1],[822,2]]},"1070":{"position":[[93,1]]},"1072":{"position":[[2348,1],[2350,1],[2396,2],[2410,2],[2462,1],[2494,1],[2511,1],[2529,1],[2531,1],[2533,3],[2640,1],[2672,1],[2680,1],[2718,1],[2720,2],[2746,1],[2748,3]]},"1074":{"position":[[676,1],[912,1],[932,1],[999,2],[1048,2],[1070,1],[1109,2],[1138,1],[1227,2],[1250,1],[1289,2],[1315,1],[1433,2],[1456,1],[1570,1],[1634,1],[1654,1],[1693,2],[1716,1],[1755,1],[1757,1],[1759,1],[1761,1],[1763,2],[1788,1],[1826,2],[1899,1],[1929,1],[1931,1]]},"1075":{"position":[[43,1],[66,1],[68,3],[109,2]]},"1078":{"position":[[123,1],[125,1],[149,2],[269,1],[271,2],[328,2],[391,1],[417,2],[420,2],[487,3],[491,2],[522,1],[528,1],[561,2],[610,2],[624,1],[641,2],[654,1],[671,1],[673,2],[686,1],[718,1],[720,2],[819,2],[885,2],[977,3],[981,2],[1019,1],[1104,3],[1127,1]]},"1080":{"position":[[25,1],[27,1],[145,1],[151,1],[184,2],[233,2],[247,1],[280,2],[355,2],[368,1],[385,2],[396,1],[414,2],[429,1],[446,2],[458,1],[476,2],[612,2],[628,1],[652,1],[682,1],[689,1],[706,1],[708,1],[710,1],[712,1],[714,2],[727,1],[744,2],[813,2],[825,1],[840,2],[932,2],[1005,1],[1007,2]]},"1082":{"position":[[168,1],[170,1],[230,1],[236,1],[269,2],[318,2],[332,1],[349,2],[362,1],[379,2],[387,1],[418,2],[448,1],[450,2],[470,2]]},"1083":{"position":[[368,1],[370,1],[430,1],[436,1],[469,2],[518,2],[532,1],[549,2],[562,1],[579,2],[587,1],[618,1],[620,2],[640,2]]},"1084":{"position":[[669,1],[1541,1]]},"1085":{"position":[[388,1],[470,1],[1213,1],[1341,1],[1359,1],[1426,2],[1456,1],[1495,2],[1531,2],[1563,1],[1565,2],[1607,1],[3792,1]]},"1090":{"position":[[452,1],[473,1],[518,1],[542,1],[584,1],[613,1],[675,1],[702,1],[774,1],[942,2],[945,2],[948,3],[988,3],[992,5],[1013,1],[1071,3]]},"1097":{"position":[[338,1],[355,1],[392,3],[396,1],[468,1],[531,1],[601,2],[611,1],[636,1],[697,1],[789,3],[793,2],[827,2]]},"1098":{"position":[[30,2],[178,1],[195,1],[239,1],[264,1],[333,1],[425,3]]},"1099":{"position":[[30,2],[160,1],[177,1],[221,1],[242,1],[307,1],[395,3]]},"1100":{"position":[[648,1],[734,3],[770,2]]},"1101":{"position":[[427,2],[460,1],[546,3],[609,2],[650,1],[801,3],[811,2],[814,3]]},"1102":{"position":[[334,1],[419,3],[424,2],[471,1],[508,1],[527,1],[539,1],[566,1],[633,2],[669,2],[672,2],[675,3],[694,1],[818,2],[856,1],[875,1],[930,1],[972,1],[992,3],[1004,5],[1025,1],[1058,2],[1061,3]]},"1103":{"position":[[148,1],[193,1],[278,3],[297,1],[417,3]]},"1104":{"position":[[355,1],[363,3]]},"1105":{"position":[[635,1],[659,1],[661,1],[689,2],[706,1],[723,1],[847,3]]},"1106":{"position":[[572,1],[604,1],[620,1],[627,1],[642,1],[644,1],[661,1],[789,3]]},"1107":{"position":[[538,1],[666,1],[684,1],[751,2],[772,1],[839,1],[841,2],[873,1],[910,1],[912,1]]},"1108":{"position":[[391,1],[469,2],[563,3]]},"1109":{"position":[[189,1],[262,3],[358,1],[360,1]]},"1114":{"position":[[439,1],[471,1],[493,1],[520,1],[564,2],[611,1],[629,1],[703,1],[785,3],[789,2],[830,1],[859,2],[931,1]]},"1115":{"position":[[282,2],[354,2],[418,1],[424,2]]},"1116":{"position":[[310,2],[343,1],[360,2],[393,1],[429,1],[448,2],[481,1],[528,1],[558,2],[597,1],[648,1]]},"1117":{"position":[[326,1],[370,1],[390,2],[471,1],[473,2],[490,3]]},"1118":{"position":[[347,1],[387,1],[422,1],[433,1],[537,1],[539,1],[575,1],[598,1],[613,3],[617,1],[619,2],[637,1],[745,3],[763,1],[807,1],[850,1]]},"1119":{"position":[[366,1],[380,1],[402,1],[422,1]]},"1121":{"position":[[336,1],[386,1],[443,1],[525,3],[543,1],[594,1],[619,1],[757,3],[767,2],[770,1],[772,2]]},"1125":{"position":[[160,1],[179,1],[201,1],[222,1],[279,1],[355,3],[359,1],[410,1],[440,2],[471,3],[475,1],[554,1],[578,2],[605,3],[609,1],[651,1],[712,1],[737,2],[758,2],[761,3]]},"1126":{"position":[[325,2],[359,1],[441,3],[445,1],[506,1],[548,1],[607,2],[630,3],[634,2],[672,1],[762,3],[766,1],[826,1],[890,1],[906,2],[930,3]]},"1129":{"position":[[32,2]]},"1130":{"position":[[8,1],[27,1],[49,1],[78,1],[152,1],[290,3],[294,1],[340,1],[378,2],[397,2],[400,3],[404,2],[407,3],[411,2]]},"1134":{"position":[[8,1],[27,1],[49,1],[76,1],[129,1],[211,3],[215,1],[266,1],[338,1],[380,1],[410,2],[430,3],[434,1],[475,1],[488,1],[549,2],[589,3],[593,1],[648,1],[706,1],[739,1],[752,1],[767,2],[784,2],[787,3]]},"1138":{"position":[[66,2],[150,1],[169,1],[191,1],[215,1],[273,1],[352,3],[356,1],[417,1],[475,1],[499,1],[585,1],[601,2],[619,2],[622,3]]},"1139":{"position":[[248,1],[267,1],[289,1],[313,1],[423,1],[474,1],[528,1],[662,2],[665,3]]},"1140":{"position":[[464,1],[483,1],[505,1],[529,1],[587,1],[697,1],[721,1],[766,1],[768,1],[826,2],[841,2],[844,3]]},"1141":{"position":[[32,2]]},"1143":{"position":[[124,2]]},"1144":{"position":[[36,1],[55,1],[90,1],[110,1],[177,1],[252,3]]},"1145":{"position":[[240,1],[259,1],[294,1],[314,1],[412,1],[463,1],[517,1],[647,2],[650,3]]},"1146":{"position":[[222,1],[305,1],[307,2],[332,2],[335,1],[337,2],[340,3]]},"1148":{"position":[[526,1],[545,1],[580,1],[600,1],[751,1],[795,2],[798,1],[851,1],[881,2],[933,1],[1058,2],[1070,3],[1074,1],[1076,3],[1116,1],[1165,3]]},"1149":{"position":[[670,1],[689,1],[739,1],[759,1],[803,1],[822,1],[909,1],[979,3],[1037,1],[1047,1],[1107,1],[1113,1],[1146,2],[1155,1],[1172,2],[1180,1],[1197,1],[1199,2],[1227,1],[1229,1],[1231,3],[1303,1],[1396,2],[1468,3]]},"1150":{"position":[[466,1],[468,5],[474,2],[477,3]]},"1151":{"position":[[240,2],[877,1],[894,1]]},"1154":{"position":[[205,1],[245,1],[319,1],[343,1],[392,3],[396,1],[452,2],[480,1],[522,3],[526,1],[565,1],[623,2],[659,3],[663,3],[667,1],[719,2],[737,1],[812,3]]},"1158":{"position":[[30,1],[49,1],[84,1],[111,1],[185,1],[267,3],[324,1],[334,1],[417,1],[423,1],[440,2],[450,1],[467,2],[476,1],[494,1],[496,2],[533,1],[535,1],[537,3],[632,3],[674,1],[708,1],[716,1],[729,1],[731,1]]},"1159":{"position":[[216,1],[235,1],[270,1],[318,1],[371,1],[489,2],[492,3]]},"1162":{"position":[[906,3]]},"1163":{"position":[[9,1],[33,1],[89,1],[116,1],[169,3],[173,1],[235,1],[275,2],[298,1],[325,2],[398,1],[450,3],[454,2],[531,1],[586,3],[590,3],[594,3],[598,3]]},"1164":{"position":[[82,1],[103,1],[132,1],[185,3],[189,1],[217,1],[253,1],[268,1],[270,1],[283,2],[301,3],[305,1],[394,1],[478,1],[550,1],[638,1],[729,1],[778,1],[780,1],[793,2],[823,3],[827,1],[896,1],[956,1],[1028,1],[1082,1],[1098,2],[1130,3],[1134,1],[1204,1],[1250,1],[1252,1],[1323,1],[1403,1],[1483,1],[1485,1],[1498,2],[1520,2],[1551,3]]},"1165":{"position":[[308,1],[361,1],[440,3],[463,1],[475,3],[479,1],[537,1],[581,1],[653,1],[697,2],[721,1],[791,3],[834,3],[838,4],[908,2],[911,3],[915,2],[918,3],[922,3],[926,1],[998,1],[1035,2],[1059,1],[1135,3],[1178,3],[1182,4]]},"1168":{"position":[[24,1],[43,1],[65,1],[86,1],[133,1],[209,3]]},"1172":{"position":[[8,1],[27,1],[49,1],[68,1],[106,2],[234,1],[298,1],[420,2],[423,1],[491,1],[551,2],[554,2],[557,3]]},"1176":{"position":[[310,2],[339,1],[341,2],[344,3],[348,2],[360,1],[372,1],[384,1],[386,1],[388,2],[391,3],[395,2],[398,1],[400,2],[471,2],[540,1],[542,2],[545,3],[549,2],[573,1],[597,1],[599,2],[602,3],[606,2],[609,1]]},"1177":{"position":[[250,1],[301,1],[435,3],[490,1],[518,1],[520,3],[524,2]]},"1178":{"position":[[239,2],[874,1],[891,1]]},"1181":{"position":[[858,3]]},"1182":{"position":[[9,1],[33,1],[89,1],[116,1],[169,3],[173,1],[235,1],[275,2],[298,1],[325,2],[402,1],[454,3],[458,2],[535,1],[590,3],[594,3],[598,3],[602,3]]},"1184":{"position":[[375,1],[399,1],[455,1],[482,1],[542,1],[581,1],[648,1],[758,2],[761,3],[774,1],[829,3],[833,3],[837,3],[841,3]]},"1185":{"position":[[308,1],[399,3]]},"1186":{"position":[[266,1],[350,3]]},"1189":{"position":[[275,1],[294,1],[316,1],[338,1],[396,1],[473,3],[477,1],[505,1],[578,2],[653,2],[656,3]]},"1201":{"position":[[8,1],[27,1],[49,1],[85,1],[173,1],[254,1],[256,3],[260,1],[293,1],[346,2],[349,1],[351,1],[353,3]]},"1202":{"position":[[393,1],[427,1],[429,1],[436,1],[455,2],[458,2]]},"1204":{"position":[[235,1],[262,1],[305,1]]},"1208":{"position":[[636,2],[713,1],[755,2],[802,1],[847,1],[863,3],[867,2],[926,1],[978,1],[994,3],[998,2],[1069,1],[1114,2],[1163,1],[1226,1],[1261,2],[1321,1],[1365,1],[1397,1],[1405,3],[1431,1],[1471,2],[1536,1],[1601,1],[1616,3],[1620,2],[1683,2],[1731,1],[1763,2],[1819,2]]},"1210":{"position":[[184,3],[248,2],[290,1],[309,1],[331,1],[352,1],[413,1],[489,1],[491,3],[495,1],[551,1],[606,1],[634,2],[706,1],[708,1],[710,3]]},"1211":{"position":[[539,1],[558,1],[580,1],[609,1],[668,1],[753,3]]},"1212":{"position":[[263,2],[302,1],[321,1],[372,1],[396,1],[456,1],[510,3]]},"1213":{"position":[[560,2],[599,1],[618,1],[676,1],[726,3]]},"1218":{"position":[[268,2],[292,1],[313,1],[365,1],[449,2],[512,1],[514,2],[540,1],[542,2],[545,3],[560,1],[595,3],[599,2],[623,1],[650,1],[701,1],[725,1],[861,2],[883,1],[885,3]]},"1219":{"position":[[250,2],[270,1],[291,1],[336,1],[374,1],[422,2],[508,1],[589,3],[593,2],[671,1],[759,3],[764,2],[784,1],[814,1],[873,1],[968,2],[971,3]]},"1220":{"position":[[187,1],[302,2],[363,1],[376,2],[379,1],[381,3],[470,1],[531,3],[548,1],[591,3],[616,2],[624,1],[637,1]]},"1222":{"position":[[8,1],[31,1],[86,1],[113,1],[157,3],[161,1],[226,2],[252,1],[277,3],[281,1],[323,1],[381,2],[420,3],[424,3],[428,1],[471,1],[527,2],[545,1],[547,1],[549,2],[552,3],[556,2],[569,1],[571,3],[575,1],[618,1],[705,1],[753,1],[796,1],[798,1],[894,1],[932,2],[947,3],[951,1],[968,1],[1021,1],[1108,1],[1211,1],[1274,2],[1296,1],[1298,2],[1301,3],[1305,2],[1308,1],[1310,3],[1314,1],[1366,2],[1384,1],[1457,3]]},"1225":{"position":[[108,2],[135,1],[159,1],[212,1],[236,1],[301,3],[305,1],[366,1],[383,1],[422,2],[458,3]]},"1226":{"position":[[8,1],[27,1],[49,1],[76,1],[129,1],[153,1],[209,1],[291,1],[293,3],[297,1],[348,1],[395,1],[472,1],[474,1],[561,2],[605,3],[609,1],[630,1],[648,2],[666,1],[704,1],[706,1],[708,1],[710,3]]},"1227":{"position":[[312,2],[558,1],[577,1],[599,1],[626,1],[687,1],[769,1],[771,3],[775,1],[851,1],[886,2],[932,1],[934,1],[936,3]]},"1231":{"position":[[421,2],[448,1],[472,1],[525,1],[549,1],[605,1],[637,1],[659,1],[690,1],[794,1],[821,2],[911,3],[915,3],[919,1],[971,1],[1000,2],[1018,1],[1086,3],[1124,3],[1128,3],[1132,3],[1136,3],[1163,1],[1191,3],[1195,5]]},"1235":{"position":[[184,2],[319,2],[430,2]]},"1237":{"position":[[504,1],[532,1],[575,1],[606,1],[652,1],[690,1],[741,1],[765,1],[831,1],[1015,2],[1018,2],[1021,2],[1024,3]]},"1238":{"position":[[450,1],[473,1],[528,1],[549,1],[602,1],[626,1],[682,1],[722,1],[806,1],[1011,2],[1014,2],[1017,2],[1020,3]]},"1239":{"position":[[483,1],[523,1],[597,1],[624,1],[684,1],[713,1],[776,1],[926,2],[929,2],[932,3]]},"1246":{"position":[[1,2],[339,2],[956,2],[1218,2],[1592,2]]},"1247":{"position":[[1,2]]},"1249":{"position":[[450,2],[479,1],[481,1],[493,1],[500,1],[510,2],[529,2],[538,2],[552,2],[555,2]]},"1252":{"position":[[309,1],[404,1],[406,1],[414,1],[449,1],[451,2]]},"1263":{"position":[[1,2],[21,1],[45,1],[98,1],[122,1],[195,3],[199,1],[260,1],[277,1],[316,2],[352,3]]},"1264":{"position":[[8,1],[27,1],[49,1],[70,1],[131,1],[207,1],[209,3],[213,1],[264,1],[305,1],[375,1],[377,1],[448,2],[485,3],[489,1],[510,1],[528,2],[546,1],[584,1],[586,1],[588,1],[590,3]]},"1265":{"position":[[305,2],[552,1],[571,1],[593,1],[614,1],[675,1],[751,1],[753,3],[757,1],[825,1],[860,2],[899,1],[901,1],[903,3]]},"1266":{"position":[[144,2],[176,1],[214,1],[272,1],[299,8],[308,2],[367,2],[388,1],[457,1],[478,2],[508,1],[510,1],[540,1],[570,1],[595,2],[606,1],[696,2],[699,2],[730,1],[739,1],[741,1],[792,1],[839,1],[841,1],[843,2],[846,2],[858,1],[911,2],[928,1],[1020,1],[1030,1],[1049,2],[1052,2],[1079,4],[1084,1],[1086,2]]},"1267":{"position":[[425,2],[487,1],[543,3],[547,2],[609,1],[681,3],[703,1],[775,3]]},"1268":{"position":[[158,2],[199,2],[432,1],[468,2],[537,3],[576,1],[600,1],[653,1],[677,1],[783,3]]},"1271":{"position":[[562,2],[793,2],[1079,2],[1082,2],[1124,1],[1177,1],[1215,2],[1287,2],[1368,1],[1383,1],[1419,1],[1501,3],[1505,2],[1562,1],[1625,3]]},"1274":{"position":[[8,1],[27,1],[49,1],[91,1],[137,3],[141,1],[182,1],[214,1],[260,2],[313,1],[389,3],[393,1],[451,1],[500,1],[546,1],[610,1],[631,2],[677,2],[680,3]]},"1275":{"position":[[126,1],[145,1],[167,1],[215,1],[268,1],[283,1],[324,1],[454,2],[457,3]]},"1276":{"position":[[398,1],[417,1],[439,1],[481,1],[527,3],[531,1],[576,1],[644,1],[670,1],[718,2],[839,1],[881,1],[926,1],[1045,2],[1048,3]]},"1277":{"position":[[149,1],[168,1],[190,1],[239,1],[292,1],[299,1],[335,2],[373,1],[441,2],[586,2],[589,3],[724,1],[768,1],[872,1],[952,3]]},"1278":{"position":[[252,1],[271,1],[293,1],[346,1],[399,1],[450,1],[619,2],[622,3],[704,1],[723,1],[745,1],[793,1],[846,1],[861,1],[902,1],[1054,2],[1057,3]]},"1279":{"position":[[96,1],[119,1],[150,1],[223,1],[225,1],[227,1],[317,1],[336,1],[358,1],[405,1],[451,3],[455,1],[498,2],[508,1],[544,1],[589,1],[601,1],[640,1],[700,1],[776,3],[780,1],[838,1],[887,1],[933,1],[997,1],[1018,2],[1079,2],[1082,3]]},"1280":{"position":[[248,1],[267,1],[289,1],[332,1],[435,1],[555,2],[558,3]]},"1281":{"position":[[114,1],[138,1],[300,2]]},"1282":{"position":[[765,1],[847,2],[899,3],[1136,1],[1238,3]]},"1286":{"position":[[198,1],[226,1],[269,1],[296,1],[340,2],[403,1],[469,3],[482,1],[546,3]]},"1287":{"position":[[235,1],[267,1],[315,1],[342,1],[386,2],[449,1],[519,3],[532,1],[596,3]]},"1288":{"position":[[181,1],[219,1],[275,1],[302,1],[346,2],[409,1],[485,3],[498,1],[562,3]]},"1290":{"position":[[8,1],[17,1],[63,1],[98,1],[150,2],[185,1],[194,3]]},"1291":{"position":[[8,1],[23,1],[122,1],[148,2],[183,1],[192,3]]},"1292":{"position":[[864,1]]},"1294":{"position":[[574,1],[588,1],[590,2],[778,1],[795,1],[797,3],[826,1],[903,1],[944,1],[994,1],[1003,3],[1007,1],[1064,1],[1102,2],[1117,3],[1128,1],[1165,1],[1179,1],[1200,3],[1204,1],[1252,1],[1303,2],[1306,1],[1316,1],[1330,1],[1351,1],[1364,1],[1377,2],[1380,1],[1389,1],[1430,2],[1445,2],[1472,1],[1532,1],[1582,1],[1592,1],[1626,1],[1653,1],[1700,3],[1707,1],[1714,1],[1722,1],[1729,1],[1738,1],[1766,1],[1775,2],[1778,3],[1782,1]]},"1296":{"position":[[742,2],[814,1],[820,2],[886,1],[900,1],[935,1],[937,3],[961,2],[964,3],[969,2],[1034,1],[1048,1],[1050,2],[1053,2],[1125,1],[1146,1],[1148,2],[1315,2],[1356,1],[1382,4],[1421,2],[1424,2],[1465,1],[1486,2],[1531,1],[1558,1],[1560,3],[1586,2]]},"1298":{"position":[[216,2],[316,1],[339,1]]},"1309":{"position":[[227,1],[443,1],[455,1],[550,1],[552,1],[568,1],[570,3],[574,1],[632,1],[675,1],[710,1],[733,1],[818,1],[880,1],[906,2],[933,2],[947,1],[949,3],[953,1],[996,1],[1052,1],[1054,1],[1124,1],[1183,2],[1212,1],[1214,2],[1386,1],[1422,2],[1429,1],[1454,1],[1515,1],[1517,3]]},"1311":{"position":[[60,3],[64,1],[98,2],[130,1],[236,3],[290,1],[292,1],[445,1],[459,1],[476,2],[490,1],[507,2],[520,1],[537,2],[545,1],[563,1],[565,2],[618,2],[658,1],[660,1],[713,1],[737,1],[739,1],[750,1],[752,1],[774,1],[776,2],[830,1],[832,1],[890,1],[906,1],[957,1],[959,2],[1004,1],[1082,1],[1084,3],[1088,2],[1192,2],[1254,2],[1290,2],[1304,1],[1306,1],[1331,1],[1333,1],[1345,1],[1347,1],[1361,1],[1363,1],[1381,2],[1390,2],[1403,2],[1406,3],[1410,1],[1429,2],[1432,2],[1478,1],[1580,3],[1584,2],[1634,2],[1675,2],[1743,1],[1811,3],[1815,1],[1826,2]]},"1314":{"position":[[664,1],[689,1]]},"1315":{"position":[[386,1],[414,1],[463,1],[567,1],[657,1]]},"1316":{"position":[[821,1],[903,1],[952,1]]},"1321":{"position":[[267,2]]},"1324":{"position":[[111,1],[659,1]]}},"keywords":{}}],["0",{"_index":758,"title":{},"content":{"50":{"position":[[467,1]]},"51":{"position":[[307,2]]},"143":{"position":[[528,2],[713,2]]},"188":{"position":[[1229,2]]},"209":{"position":[[434,2]]},"211":{"position":[[396,2]]},"255":{"position":[[778,2]]},"259":{"position":[[78,2]]},"314":{"position":[[744,2]]},"315":{"position":[[720,2]]},"316":{"position":[[185,2]]},"334":{"position":[[630,2]]},"367":{"position":[[722,2]]},"392":{"position":[[580,2],[1546,2],[4003,2],[4019,2],[4180,2]]},"397":{"position":[[559,2]]},"398":{"position":[[2112,2]]},"480":{"position":[[544,2]]},"482":{"position":[[844,2]]},"502":{"position":[[971,1]]},"518":{"position":[[438,1]]},"538":{"position":[[608,2]]},"554":{"position":[[1335,2]]},"562":{"position":[[316,2]]},"564":{"position":[[773,2]]},"571":{"position":[[912,1]]},"579":{"position":[[638,2]]},"580":{"position":[[539,1]]},"598":{"position":[[615,2]]},"632":{"position":[[1528,2]]},"638":{"position":[[612,2]]},"639":{"position":[[368,2]]},"662":{"position":[[2391,2]]},"680":{"position":[[820,2],[960,1],[1275,4]]},"717":{"position":[[1429,2]]},"720":{"position":[[146,2]]},"734":{"position":[[694,2]]},"751":{"position":[[122,2],[599,1],[1701,1]]},"752":{"position":[[1245,2],[1283,1],[1299,2]]},"808":{"position":[[185,2],[541,2]]},"812":{"position":[[84,2]]},"813":{"position":[[84,2]]},"838":{"position":[[2605,2]]},"862":{"position":[[660,2]]},"863":{"position":[[63,1]]},"872":{"position":[[1869,2],[4099,2]]},"875":{"position":[[2659,1],[3252,2],[4400,2],[5494,3]]},"885":{"position":[[1628,2],[1932,2]]},"886":{"position":[[553,1]]},"888":{"position":[[1103,1]]},"898":{"position":[[2449,2]]},"904":{"position":[[867,2]]},"916":{"position":[[153,2]]},"932":{"position":[[1205,2]]},"988":{"position":[[3623,2],[4349,1]]},"995":{"position":[[1558,1]]},"1074":{"position":[[355,1],[743,2],[1199,2]]},"1076":{"position":[[46,2],[82,2]]},"1078":{"position":[[208,2]]},"1080":{"position":[[38,2],[575,2]]},"1082":{"position":[[181,2]]},"1083":{"position":[[381,2]]},"1085":{"position":[[1236,2]]},"1107":{"position":[[561,2]]},"1115":{"position":[[350,3]]},"1149":{"position":[[1058,2]]},"1158":{"position":[[368,2]]},"1208":{"position":[[1403,1]]},"1294":{"position":[[1704,2]]},"1311":{"position":[[366,2]]},"1316":{"position":[[954,1],[1124,1]]}},"keywords":{}}],["0.00000001",{"_index":6434,"title":{},"content":{"1294":{"position":[[1391,11]]}},"keywords":{}}],["0.003",{"_index":2418,"title":{},"content":{"398":{"position":[[2042,6]]},"402":{"position":[[1191,6]]}},"keywords":{}}],["0.0052",{"_index":3060,"title":{},"content":{"465":{"position":[[169,6],[374,6]]}},"keywords":{}}],["0.01",{"_index":5839,"title":{},"content":{"1080":{"position":[[607,4]]}},"keywords":{}}],["0.017",{"_index":3047,"title":{},"content":{"464":{"position":[[308,5],[513,5]]}},"keywords":{}}],["0.058",{"_index":3046,"title":{},"content":{"464":{"position":[[289,5]]}},"keywords":{}}],["0.1",{"_index":3061,"title":{},"content":{"465":{"position":[[186,3]]}},"keywords":{}}],["0.12",{"_index":2188,"title":{},"content":{"390":{"position":[[565,5]]},"402":{"position":[[290,5],[331,6]]}},"keywords":{}}],["0.132",{"_index":3059,"title":{},"content":{"465":{"position":[[150,5]]}},"keywords":{}}],["0.17",{"_index":3048,"title":{},"content":{"464":{"position":[[324,4],[392,4]]}},"keywords":{}}],["0.2",{"_index":1414,"title":{},"content":{"228":{"position":[[451,3]]}},"keywords":{}}],["0.34",{"_index":2189,"title":{},"content":{"390":{"position":[[572,5]]},"402":{"position":[[297,5]]}},"keywords":{}}],["0.39",{"_index":3078,"title":{},"content":{"467":{"position":[[106,4]]}},"keywords":{}}],["0.45",{"_index":3064,"title":{},"content":{"465":{"position":[[253,4]]}},"keywords":{}}],["0.56",{"_index":2187,"title":{},"content":{"390":{"position":[[558,6]]},"402":{"position":[[283,6],[324,6]]}},"keywords":{}}],["0.78",{"_index":2481,"title":{},"content":{"402":{"position":[[303,5]]}},"keywords":{}}],["0.8",{"_index":1412,"title":{},"content":{"228":{"position":[[419,3]]},"1292":{"position":[[705,3]]}},"keywords":{}}],["0.9",{"_index":6413,"title":{},"content":{"1292":{"position":[[740,3]]}},"keywords":{}}],["0.90",{"_index":2190,"title":{},"content":{"390":{"position":[[579,6]]},"402":{"position":[[310,5]]}},"keywords":{}}],["0000",{"_index":6555,"title":{},"content":{"1316":{"position":[[2268,4]]}},"keywords":{}}],["01",{"_index":6101,"title":{},"content":{"1158":{"position":[[596,4]]}},"keywords":{}}],["02",{"_index":2984,"title":{},"content":{"457":{"position":[[330,2]]},"751":{"position":[[1869,2]]},"1282":{"position":[[405,2]]}},"keywords":{}}],["04t15:29.40.273z",{"_index":6554,"title":{},"content":{"1316":{"position":[[2251,16]]}},"keywords":{}}],["0:42",{"_index":1789,"title":{},"content":{"301":{"position":[[533,4]]}},"keywords":{}}],["0the",{"_index":5803,"title":{},"content":{"1074":{"position":[[118,4]]}},"keywords":{}}],["1",{"_index":1300,"title":{"201":{"position":[[0,2]]},"248":{"position":[[0,2]]},"309":{"position":[[0,2]]},"474":{"position":[[0,2]]},"553":{"position":[[0,2]]},"559":{"position":[[5,2]]}},"content":{"299":{"position":[[598,2],[898,1]]},"303":{"position":[[715,1],[939,1]]},"361":{"position":[[712,1],[936,1]]},"402":{"position":[[1958,1]]},"403":{"position":[[510,2],[549,1],[805,2]]},"439":{"position":[[715,2],[815,2]]},"464":{"position":[[1214,1]]},"562":{"position":[[580,4]]},"571":{"position":[[1604,1]]},"599":{"position":[[113,4]]},"662":{"position":[[1599,1]]},"678":{"position":[[287,2],[306,1]]},"680":{"position":[[1397,1]]},"681":{"position":[[818,1]]},"683":{"position":[[212,1],[333,1],[927,1],[1004,2],[1023,1]]},"717":{"position":[[506,1]]},"724":{"position":[[130,2]]},"734":{"position":[[70,1]]},"749":{"position":[[4436,3],[4450,4],[4472,2],[4482,1]]},"751":{"position":[[556,1],[612,1],[614,2],[857,2],[1010,1],[1658,1],[1714,1],[1716,2]]},"752":{"position":[[522,2]]},"754":{"position":[[259,2]]},"825":{"position":[[83,1]]},"829":{"position":[[1,1]]},"838":{"position":[[1916,1]]},"849":{"position":[[914,3]]},"854":{"position":[[1,1]]},"861":{"position":[[224,1],[294,1]]},"862":{"position":[[118,1]]},"866":{"position":[[1,1]]},"872":{"position":[[1,1]]},"875":{"position":[[1,1],[2552,2],[2559,3]]},"885":{"position":[[1776,2],[1821,2],[1886,2],[1917,2],[2511,3]]},"898":{"position":[[1,1]]},"904":{"position":[[338,1],[1186,3]]},"1041":{"position":[[312,1],[334,1]]},"1042":{"position":[[174,2]]},"1044":{"position":[[327,1],[349,1],[446,2]]},"1048":{"position":[[580,2]]},"1051":{"position":[[603,2]]},"1059":{"position":[[315,1],[361,1]]},"1061":{"position":[[215,2],[262,1]]},"1115":{"position":[[420,3]]},"1144":{"position":[[1,1]]},"1148":{"position":[[425,1]]},"1149":{"position":[[610,1]]},"1158":{"position":[[1,1]]},"1177":{"position":[[445,2]]},"1189":{"position":[[1,1]]},"1282":{"position":[[551,1]]},"1305":{"position":[[549,1],[628,1]]},"1316":{"position":[[1129,2]]}},"keywords":{}}],["1.15",{"_index":6410,"title":{},"content":{"1292":{"position":[[697,4]]}},"keywords":{}}],["1.28",{"_index":3062,"title":{},"content":{"465":{"position":[[207,4]]}},"keywords":{}}],["1.41",{"_index":3063,"title":{},"content":{"465":{"position":[[227,4]]}},"keywords":{}}],["1.46",{"_index":3049,"title":{},"content":{"464":{"position":[[346,4]]}},"keywords":{}}],["1.5",{"_index":3055,"title":{},"content":{"464":{"position":[[767,3]]}},"keywords":{}}],["1.54",{"_index":3050,"title":{},"content":{"464":{"position":[[366,4]]}},"keywords":{}}],["1.6",{"_index":2833,"title":{},"content":{"420":{"position":[[376,3]]}},"keywords":{}}],["10",{"_index":1526,"title":{},"content":{"244":{"position":[[1527,2]]},"335":{"position":[[718,4]]},"392":{"position":[[2526,2],[2745,3],[3060,2]]},"397":{"position":[[230,2],[515,2]]},"398":{"position":[[1733,4],[2886,4]]},"402":{"position":[[737,2]]},"408":{"position":[[1108,4]]},"427":{"position":[[857,2]]},"435":{"position":[[272,2]]},"454":{"position":[[454,3]]},"459":{"position":[[563,2]]},"461":{"position":[[721,2],[833,2]]},"464":{"position":[[569,2]]},"696":{"position":[[1975,3]]},"724":{"position":[[1853,2]]},"736":{"position":[[254,2]]},"739":{"position":[[753,4]]},"752":{"position":[[785,2]]},"820":{"position":[[585,2],[637,2]]},"862":{"position":[[1400,3],[1426,2]]},"886":{"position":[[4891,3]]},"988":{"position":[[4486,3]]},"996":{"position":[[520,2],[584,2]]},"1045":{"position":[[178,2]]},"1067":{"position":[[1622,2]]},"1208":{"position":[[1640,2]]},"1222":{"position":[[755,2],[943,3]]},"1249":{"position":[[507,2]]},"1295":{"position":[[920,2]]},"1296":{"position":[[1696,4]]},"1316":{"position":[[2248,2]]},"1318":{"position":[[420,2]]}},"keywords":{}}],["10)).toarray",{"_index":4998,"title":{},"content":{"875":{"position":[[2600,15]]}},"keywords":{}}],["10.0.0",{"_index":406,"title":{},"content":{"24":{"position":[[609,6]]},"793":{"position":[[1458,6]]},"1198":{"position":[[1156,6]]}},"keywords":{}}],["100",{"_index":775,"title":{},"content":{"51":{"position":[[436,3]]},"188":{"position":[[1313,3],[1355,3]]},"209":{"position":[[518,3]]},"211":{"position":[[480,3]]},"255":{"position":[[862,3]]},"259":{"position":[[162,3]]},"299":{"position":[[320,3]]},"367":{"position":[[857,3],[948,3]]},"397":{"position":[[745,3]]},"398":{"position":[[776,4]]},"402":{"position":[[1513,4]]},"408":{"position":[[3188,3]]},"412":{"position":[[8182,4]]},"434":{"position":[[180,3]]},"467":{"position":[[15,3],[677,3]]},"538":{"position":[[737,3]]},"554":{"position":[[1419,3]]},"598":{"position":[[744,3]]},"617":{"position":[[1525,3]]},"632":{"position":[[1612,3]]},"638":{"position":[[696,3]]},"639":{"position":[[474,3]]},"660":{"position":[[271,4]]},"662":{"position":[[2475,3]]},"680":{"position":[[904,3],[946,4]]},"681":{"position":[[292,4],[377,4],[732,3]]},"698":{"position":[[2820,4],[2849,4]]},"717":{"position":[[1513,3]]},"734":{"position":[[778,3]]},"740":{"position":[[107,4]]},"752":{"position":[[1302,4]]},"767":{"position":[[596,6],[1005,6]]},"768":{"position":[[598,6],[1007,6]]},"769":{"position":[[555,6],[976,6]]},"816":{"position":[[238,3]]},"838":{"position":[[2689,3]]},"862":{"position":[[744,3]]},"872":{"position":[[1969,3],[4199,3]]},"886":{"position":[[4063,4],[4168,4]]},"898":{"position":[[2549,3]]},"904":{"position":[[951,3]]},"1044":{"position":[[519,3],[579,3]]},"1074":{"position":[[995,3],[1223,3]]},"1078":{"position":[[557,3]]},"1080":{"position":[[180,3],[276,3]]},"1082":{"position":[[265,3]]},"1083":{"position":[[465,3]]},"1085":{"position":[[1422,3]]},"1107":{"position":[[747,3],[835,3]]},"1149":{"position":[[1142,3]]},"1194":{"position":[[453,4],[727,4],[952,4]]}},"keywords":{}}],["100,000",{"_index":2553,"title":{},"content":{"408":{"position":[[2940,7]]}},"keywords":{}}],["1000",{"_index":1511,"title":{},"content":{"244":{"position":[[1170,4],[1331,4]]},"401":{"position":[[305,4]]},"653":{"position":[[510,4],[799,4],[955,4]]},"739":{"position":[[746,4]]},"886":{"position":[[1998,4]]},"988":{"position":[[1092,5]]},"995":{"position":[[1857,4]]},"996":{"position":[[589,6]]},"1186":{"position":[[311,5]]}},"keywords":{}}],["10000",{"_index":2436,"title":{},"content":{"400":{"position":[[71,5]]},"610":{"position":[[1350,7]]},"1186":{"position":[[244,6]]}},"keywords":{}}],["100000",{"_index":5838,"title":{},"content":{"1080":{"position":[[587,7]]}},"keywords":{}}],["1000th",{"_index":3976,"title":{},"content":{"704":{"position":[[53,7]]}},"keywords":{}}],["100k",{"_index":2328,"title":{},"content":{"394":{"position":[[1670,4]]}},"keywords":{}}],["100the",{"_index":5806,"title":{},"content":{"1074":{"position":[[361,6]]}},"keywords":{}}],["100x",{"_index":6465,"title":{},"content":{"1299":{"position":[[244,4]]}},"keywords":{}}],["1024",{"_index":2470,"title":{},"content":{"401":{"position":[[501,4],[538,4],[581,4]]}},"keywords":{}}],["104",{"_index":3072,"title":{},"content":{"466":{"position":[[191,3]]}},"keywords":{}}],["106135",{"_index":6419,"title":{},"content":{"1292":{"position":[[976,6]]}},"keywords":{}}],["108",{"_index":6196,"title":{},"content":{"1208":{"position":[[536,4]]}},"keywords":{}}],["10k",{"_index":2250,"title":{},"content":{"392":{"position":[[3118,3],[5150,3]]},"394":{"position":[[1607,3]]},"412":{"position":[[10073,3]]},"1162":{"position":[[706,3]]},"1181":{"position":[[794,3]]},"1295":{"position":[[1231,3]]}},"keywords":{}}],["10mb",{"_index":2527,"title":{},"content":{"408":{"position":[[374,5]]},"432":{"position":[[329,4]]}},"keywords":{}}],["10x",{"_index":4023,"title":{},"content":{"717":{"position":[[304,3]]},"1090":{"position":[[183,4]]}},"keywords":{}}],["11.0.0",{"_index":4628,"title":{},"content":{"793":{"position":[[1451,6]]}},"keywords":{}}],["110",{"_index":1491,"title":{},"content":{"244":{"position":[[453,3]]}},"keywords":{}}],["12",{"_index":4455,"title":{},"content":{"751":{"position":[[1872,2]]},"963":{"position":[[160,2]]},"1060":{"position":[[174,2],[210,2]]}},"keywords":{}}],["12.0.0",{"_index":4627,"title":{},"content":{"793":{"position":[[1444,6]]}},"keywords":{}}],["120",{"_index":2569,"title":{},"content":{"408":{"position":[[4867,3]]}},"keywords":{}}],["123",{"_index":1366,"title":{},"content":{"210":{"position":[[328,5]]},"1007":{"position":[[416,5],[807,3]]},"1008":{"position":[[192,4]]}},"keywords":{}}],["1234",{"_index":4638,"title":{},"content":{"796":{"position":[[468,4],[494,4],[545,4]]},"988":{"position":[[5467,4],[5526,4]]}},"keywords":{}}],["124",{"_index":5562,"title":{},"content":{"1007":{"position":[[891,4],[934,4]]}},"keywords":{}}],["125186",{"_index":6421,"title":{},"content":{"1292":{"position":[[1002,6]]}},"keywords":{}}],["125m",{"_index":3029,"title":{},"content":{"462":{"position":[[668,7]]}},"keywords":{}}],["128.0.6613.137",{"_index":3022,"title":{},"content":{"462":{"position":[[354,16]]}},"keywords":{}}],["1291",{"_index":2460,"title":{},"content":{"401":{"position":[[352,4]]}},"keywords":{}}],["13.0.0",{"_index":4626,"title":{},"content":{"793":{"position":[[1437,6]]}},"keywords":{}}],["13.41",{"_index":3070,"title":{},"content":{"466":{"position":[[149,5]]}},"keywords":{}}],["1300",{"_index":1513,"title":{},"content":{"244":{"position":[[1211,4],[1488,4]]}},"keywords":{}}],["131.0.6778.85",{"_index":6396,"title":{},"content":{"1292":{"position":[[115,14]]}},"keywords":{}}],["1337",{"_index":5177,"title":{},"content":{"892":{"position":[[313,5]]}},"keywords":{}}],["135,900",{"_index":3025,"title":{},"content":{"462":{"position":[[620,7]]}},"keywords":{}}],["13900hx",{"_index":6402,"title":{},"content":{"1292":{"position":[[192,7]]}},"keywords":{}}],["13th",{"_index":6397,"title":{},"content":{"1292":{"position":[[162,4]]}},"keywords":{}}],["14.0.0",{"_index":4625,"title":{},"content":{"793":{"position":[[1430,6]]}},"keywords":{}}],["14.0.0)fork",{"_index":6175,"title":{},"content":{"1198":{"position":[[2198,11]]}},"keywords":{}}],["140",{"_index":1496,"title":{},"content":{"244":{"position":[[677,3]]}},"keywords":{}}],["142",{"_index":6475,"title":{},"content":{"1301":{"position":[[1115,3]]}},"keywords":{}}],["1437",{"_index":2463,"title":{},"content":{"401":{"position":[[399,4]]}},"keywords":{}}],["1486940585",{"_index":4457,"title":{},"content":{"751":{"position":[[1964,11]]}},"keywords":{}}],["15.0.0",{"_index":4624,"title":{},"content":{"793":{"position":[[1423,6]]}},"keywords":{}}],["150",{"_index":6477,"title":{},"content":{"1301":{"position":[[1444,3]]}},"keywords":{}}],["1564483474",{"_index":5448,"title":{},"content":{"986":{"position":[[1027,11]]}},"keywords":{}}],["16",{"_index":469,"title":{},"content":{"28":{"position":[[804,3]]},"571":{"position":[[1581,2]]},"703":{"position":[[1511,2]]},"749":{"position":[[9325,3]]},"958":{"position":[[497,2],[618,3]]},"1162":{"position":[[1010,2],[1059,3]]}},"keywords":{}}],["16.0.0",{"_index":4623,"title":{},"content":{"793":{"position":[[1416,6]]}},"keywords":{}}],["16.66m",{"_index":3470,"title":{},"content":{"571":{"position":[[1641,8]]}},"keywords":{}}],["162",{"_index":2461,"title":{},"content":{"401":{"position":[[361,3],[408,3],[457,3]]}},"keywords":{}}],["1647",{"_index":2437,"title":{},"content":{"400":{"position":[[94,4]]}},"keywords":{}}],["16m",{"_index":3471,"title":{},"content":{"571":{"position":[[1794,5]]}},"keywords":{}}],["17",{"_index":6452,"title":{},"content":{"1295":{"position":[[1053,2]]}},"keywords":{}}],["17.0.0",{"_index":4622,"title":{},"content":{"793":{"position":[[1409,6]]}},"keywords":{}}],["170",{"_index":1471,"title":{},"content":{"243":{"position":[[878,3]]},"244":{"position":[[281,3],[1025,3],[1559,3]]}},"keywords":{}}],["1706579817126",{"_index":5953,"title":{},"content":{"1104":{"position":[[379,15]]}},"keywords":{}}],["173",{"_index":2447,"title":{},"content":{"401":{"position":[[219,3]]}},"keywords":{}}],["1769",{"_index":2464,"title":{},"content":{"401":{"position":[[448,4]]}},"keywords":{}}],["18",{"_index":4652,"title":{},"content":{"798":{"position":[[590,2],[721,3]]},"949":{"position":[[109,2]]},"1055":{"position":[[173,2],[235,2]]},"1059":{"position":[[270,2]]},"1060":{"position":[[138,2]]},"1061":{"position":[[139,2]]},"1062":{"position":[[134,2],[195,2]]},"1063":{"position":[[153,2]]},"1066":{"position":[[396,2],[527,3]]},"1067":{"position":[[335,2]]},"1292":{"position":[[747,2]]}},"keywords":{}}],["19",{"_index":5757,"title":{},"content":{"1063":{"position":[[103,2]]}},"keywords":{}}],["19.1",{"_index":3073,"title":{},"content":{"466":{"position":[[216,4]]}},"keywords":{}}],["1900",{"_index":1518,"title":{},"content":{"244":{"position":[[1370,4]]},"1074":{"position":[[1401,5]]}},"keywords":{}}],["1994",{"_index":2952,"title":{},"content":{"450":{"position":[[46,5]]}},"keywords":{}}],["1add",{"_index":5903,"title":{},"content":{"1085":{"position":[[3324,4]]}},"keywords":{}}],["1gb",{"_index":2537,"title":{},"content":{"408":{"position":[[1181,3]]},"696":{"position":[[1429,3]]}},"keywords":{}}],["2",{"_index":108,"title":{"202":{"position":[[0,2]]},"249":{"position":[[0,2]]},"310":{"position":[[0,2]]},"475":{"position":[[0,2]]},"554":{"position":[[0,2]]},"560":{"position":[[5,2]]}},"content":{"8":{"position":[[225,2],[297,1],[374,1],[880,2]]},"269":{"position":[[18,1]]},"299":{"position":[[423,2]]},"392":{"position":[[3076,1]]},"398":{"position":[[3251,1]]},"412":{"position":[[6997,1]]},"599":{"position":[[222,4]]},"612":{"position":[[2194,1]]},"617":{"position":[[650,1]]},"662":{"position":[[1859,1]]},"717":{"position":[[873,1]]},"724":{"position":[[334,2]]},"734":{"position":[[385,1]]},"751":{"position":[[967,1],[1023,1],[1095,2],[1147,2],[1923,2]]},"754":{"position":[[405,2]]},"825":{"position":[[220,1]]},"829":{"position":[[83,1]]},"838":{"position":[[2156,1]]},"854":{"position":[[54,1]]},"861":{"position":[[401,1],[919,1]]},"862":{"position":[[182,1]]},"866":{"position":[[53,1]]},"872":{"position":[[167,1]]},"875":{"position":[[607,1]]},"898":{"position":[[64,1]]},"904":{"position":[[1265,1]]},"1144":{"position":[[147,1]]},"1148":{"position":[[488,1]]},"1149":{"position":[[850,1]]},"1158":{"position":[[155,1]]},"1189":{"position":[[59,1]]},"1277":{"position":[[697,1],[854,3]]}},"keywords":{}}],["2*n",{"_index":3636,"title":{},"content":{"617":{"position":[[715,3]]}},"keywords":{}}],["2.0",{"_index":2959,"title":{},"content":{"452":{"position":[[451,3]]},"1294":{"position":[[16,4]]}},"keywords":{}}],["2.7",{"_index":6412,"title":{},"content":{"1292":{"position":[[724,3]]}},"keywords":{}}],["2.93",{"_index":3065,"title":{},"content":{"465":{"position":[[282,4]]}},"keywords":{}}],["2.htm",{"_index":759,"title":{},"content":{"50":{"position":[[469,5]]}},"keywords":{}}],["20",{"_index":2228,"title":{},"content":{"392":{"position":[[664,2],[1630,2]]},"798":{"position":[[703,3]]},"1063":{"position":[[257,2]]},"1066":{"position":[[509,3]]},"1067":{"position":[[1596,2]]},"1082":{"position":[[415,2]]},"1296":{"position":[[816,3]]}},"keywords":{}}],["20.6",{"_index":3068,"title":{},"content":{"466":{"position":[[116,4]]}},"keywords":{}}],["200",{"_index":3067,"title":{},"content":{"466":{"position":[[53,3]]},"698":{"position":[[2955,4],[2984,4]]},"704":{"position":[[82,3]]}},"keywords":{}}],["2000",{"_index":3610,"title":{},"content":{"612":{"position":[[2358,6]]}},"keywords":{}}],["2009",{"_index":350,"title":{},"content":{"20":{"position":[[110,4]]},"451":{"position":[[84,5]]},"455":{"position":[[36,4]]}},"keywords":{}}],["200k",{"_index":601,"title":{},"content":{"38":{"position":[[991,5]]}},"keywords":{}}],["200m",{"_index":2558,"title":{},"content":{"408":{"position":[[3192,5]]}},"keywords":{}}],["200mb",{"_index":3936,"title":{},"content":{"696":{"position":[[1489,5]]}},"keywords":{}}],["2012",{"_index":245,"title":{},"content":{"15":{"position":[[17,5]]}},"keywords":{}}],["2014",{"_index":269,"title":{},"content":{"16":{"position":[[15,4]]},"26":{"position":[[332,4]]},"408":{"position":[[4495,5]]},"419":{"position":[[55,6]]}},"keywords":{}}],["2015",{"_index":1763,"title":{},"content":{"299":{"position":[[1421,5]]},"357":{"position":[[117,6]]},"452":{"position":[[71,5]]}},"keywords":{}}],["2016",{"_index":353,"title":{},"content":{"20":{"position":[[144,5]]},"32":{"position":[[296,5]]},"1198":{"position":[[35,5]]}},"keywords":{}}],["2017",{"_index":2967,"title":{},"content":{"454":{"position":[[149,4]]},"751":{"position":[[1864,4]]}},"keywords":{}}],["2018",{"_index":431,"title":{},"content":{"26":{"position":[[347,4]]},"452":{"position":[[427,5]]}},"keywords":{}}],["2019",{"_index":318,"title":{},"content":{"19":{"position":[[16,4]]},"36":{"position":[[242,4]]},"407":{"position":[[1194,4]]},"422":{"position":[[325,4]]}},"keywords":{}}],["2021",{"_index":6553,"title":{},"content":{"1316":{"position":[[2243,4]]}},"keywords":{}}],["2022",{"_index":2983,"title":{},"content":{"457":{"position":[[324,5]]},"1282":{"position":[[399,5]]}},"keywords":{}}],["2023",{"_index":3939,"title":{},"content":{"696":{"position":[[1882,7]]},"1207":{"position":[[23,5]]}},"keywords":{}}],["2024",{"_index":606,"title":{},"content":{"38":{"position":[[1038,6]]},"41":{"position":[[1,5]]},"412":{"position":[[272,4]]},"470":{"position":[[25,5]]},"613":{"position":[[650,6]]},"620":{"position":[[603,5]]}},"keywords":{}}],["2048",{"_index":4408,"title":{},"content":{"749":{"position":[[21557,5]]}},"keywords":{}}],["2050",{"_index":5824,"title":{},"content":{"1074":{"position":[[1428,4]]}},"keywords":{}}],["21",{"_index":976,"title":{},"content":{"77":{"position":[[256,2]]},"103":{"position":[[296,2]]},"234":{"position":[[356,2]]}},"keywords":{}}],["210",{"_index":1484,"title":{},"content":{"244":{"position":[[317,3],[757,3],[929,3]]}},"keywords":{}}],["213",{"_index":6405,"title":{},"content":{"1292":{"position":[[349,3]]}},"keywords":{}}],["216",{"_index":6407,"title":{},"content":{"1292":{"position":[[366,3]]}},"keywords":{}}],["2187",{"_index":2440,"title":{},"content":{"400":{"position":[[118,4]]}},"keywords":{}}],["22",{"_index":2985,"title":{},"content":{"457":{"position":[[333,3]]},"1275":{"position":[[22,2]]},"1282":{"position":[[408,3]]}},"keywords":{}}],["22k",{"_index":2831,"title":{},"content":{"420":{"position":[[187,3]]}},"keywords":{}}],["23",{"_index":2449,"title":{},"content":{"401":{"position":[[227,2]]},"463":{"position":[[698,2]]}},"keywords":{}}],["230",{"_index":6409,"title":{},"content":{"1292":{"position":[[388,3]]}},"keywords":{}}],["24",{"_index":3751,"title":{},"content":{"653":{"position":[[527,2]]},"995":{"position":[[1407,2],[1874,3]]}},"keywords":{}}],["24.04",{"_index":6395,"title":{},"content":{"1292":{"position":[[81,5]]}},"keywords":{}}],["24/7",{"_index":2597,"title":{},"content":{"410":{"position":[[1217,5]]}},"keywords":{}}],["24/7.onlin",{"_index":2793,"title":{},"content":{"418":{"position":[[246,11]]}},"keywords":{}}],["25",{"_index":6168,"title":{},"content":{"1194":{"position":[[907,3]]},"1294":{"position":[[328,2],[780,3]]},"1296":{"position":[[311,3],[1377,4],[1528,2]]}},"keywords":{}}],["25.20443",{"_index":2300,"title":{},"content":{"393":{"position":[[1059,8]]}},"keywords":{}}],["25.61",{"_index":3081,"title":{},"content":{"467":{"position":[[164,5]]}},"keywords":{}}],["2505310082",{"_index":4424,"title":{},"content":{"749":{"position":[[23135,10]]}},"keywords":{}}],["256",{"_index":5401,"title":{},"content":{"968":{"position":[[53,5]]}},"keywords":{}}],["26.8",{"_index":3033,"title":{},"content":{"463":{"position":[[716,4]]}},"keywords":{}}],["260",{"_index":1468,"title":{},"content":{"243":{"position":[[682,3]]},"244":{"position":[[161,3],[418,3],[600,3],[1056,3],[1632,3]]}},"keywords":{}}],["2616",{"_index":3634,"title":{},"content":{"617":{"position":[[441,4]]}},"keywords":{}}],["2624555824",{"_index":4182,"title":{},"content":{"749":{"position":[[3787,10]]}},"keywords":{}}],["279",{"_index":2457,"title":{},"content":{"401":{"position":[[314,3]]}},"keywords":{}}],["28",{"_index":6451,"title":{},"content":{"1295":{"position":[[957,3]]}},"keywords":{}}],["28,400",{"_index":3028,"title":{},"content":{"462":{"position":[[644,6]]}},"keywords":{}}],["280",{"_index":3071,"title":{},"content":{"466":{"position":[[172,3]]}},"keywords":{}}],["2900",{"_index":1529,"title":{},"content":{"244":{"position":[[1595,4]]}},"keywords":{}}],["29857",{"_index":1835,"title":{},"content":{"303":{"position":[[688,6],[916,6]]},"361":{"position":[[685,6],[913,6]]}},"keywords":{}}],["2k",{"_index":6161,"title":{},"content":{"1192":{"position":[[782,2]]}},"keywords":{}}],["2x",{"_index":6225,"title":{},"content":{"1209":{"position":[[201,2]]}},"keywords":{}}],["3",{"_index":1308,"title":{"203":{"position":[[0,2]]},"250":{"position":[[0,2]]},"311":{"position":[[0,2]]},"476":{"position":[[0,2]]},"555":{"position":[[0,2]]},"561":{"position":[[5,2]]},"601":{"position":[[32,1]]}},"content":{"464":{"position":[[709,1]]},"580":{"position":[[242,1]]},"599":{"position":[[274,4]]},"662":{"position":[[2016,1]]},"717":{"position":[[1249,1]]},"724":{"position":[[1510,2]]},"734":{"position":[[558,1]]},"754":{"position":[[564,2]]},"825":{"position":[[500,1]]},"829":{"position":[[880,1]]},"838":{"position":[[2500,1]]},"854":{"position":[[474,1]]},"861":{"position":[[745,1],[1199,1]]},"862":{"position":[[483,1]]},"872":{"position":[[711,1]]},"875":{"position":[[1268,1]]},"898":{"position":[[1537,1]]},"904":{"position":[[1404,1]]},"1148":{"position":[[681,1]]},"1149":{"position":[[983,1]]},"1158":{"position":[[271,1]]}},"keywords":{}}],["3.0",{"_index":2961,"title":{},"content":{"452":{"position":[[641,3]]}},"keywords":{}}],["3.05",{"_index":6411,"title":{},"content":{"1292":{"position":[[716,4]]}},"keywords":{}}],["3.17",{"_index":3051,"title":{},"content":{"464":{"position":[[421,4]]}},"keywords":{}}],["3.38.0",{"_index":2982,"title":{},"content":{"457":{"position":[[317,6]]},"1282":{"position":[[392,6]]}},"keywords":{}}],["3.59",{"_index":3082,"title":{},"content":{"467":{"position":[[191,4]]}},"keywords":{}}],["3.6.19",{"_index":2975,"title":{},"content":{"455":{"position":[[569,7]]}},"keywords":{}}],["3.9",{"_index":2047,"title":{},"content":{"357":{"position":[[113,3]]}},"keywords":{}}],["30",{"_index":1259,"title":{},"content":{"188":{"position":[[1398,2]]},"244":{"position":[[565,2]]},"426":{"position":[[328,3]]},"816":{"position":[[359,2]]},"866":{"position":[[869,2],[894,2]]}},"keywords":{}}],["300",{"_index":4428,"title":{},"content":{"749":{"position":[[23390,3]]},"1138":{"position":[[615,3]]},"1271":{"position":[[426,3]]}},"keywords":{}}],["3000",{"_index":3595,"title":{},"content":{"612":{"position":[[1835,5]]},"1292":{"position":[[316,4],[670,4]]}},"keywords":{}}],["31",{"_index":3039,"title":{},"content":{"463":{"position":[[1290,2]]},"653":{"position":[[532,3]]}},"keywords":{}}],["32",{"_index":2287,"title":{},"content":{"392":{"position":[[5212,2]]},"1292":{"position":[[154,2]]}},"keywords":{}}],["320",{"_index":1510,"title":{},"content":{"244":{"position":[[1090,3],[1121,3]]}},"keywords":{}}],["33",{"_index":5725,"title":{},"content":{"1051":{"position":[[292,2]]}},"keywords":{}}],["33%.it",{"_index":6066,"title":{},"content":{"1143":{"position":[[327,6]]}},"keywords":{}}],["3359",{"_index":2469,"title":{},"content":{"401":{"position":[[496,4]]}},"keywords":{}}],["337",{"_index":2471,"title":{},"content":{"401":{"position":[[506,3],[543,3]]}},"keywords":{}}],["34",{"_index":2452,"title":{},"content":{"401":{"position":[[257,2]]}},"keywords":{}}],["341",{"_index":2451,"title":{},"content":{"401":{"position":[[249,3]]}},"keywords":{}}],["3499",{"_index":2473,"title":{},"content":{"401":{"position":[[533,4]]}},"keywords":{}}],["35",{"_index":3086,"title":{},"content":{"467":{"position":[[703,2]]},"1123":{"position":[[101,2],[234,2]]}},"keywords":{}}],["35m",{"_index":3084,"title":{},"content":{"467":{"position":[[225,5]]}},"keywords":{}}],["36",{"_index":4911,"title":{},"content":{"863":{"position":[[173,2]]}},"keywords":{}}],["36%.it",{"_index":6064,"title":{},"content":{"1143":{"position":[[188,6]]}},"keywords":{}}],["3600",{"_index":1523,"title":{},"content":{"244":{"position":[[1451,4]]}},"keywords":{}}],["37.12",{"_index":3074,"title":{},"content":{"466":{"position":[[245,5]]}},"keywords":{}}],["384",{"_index":2448,"title":{},"content":{"401":{"position":[[223,3],[253,3]]}},"keywords":{}}],["390",{"_index":1459,"title":{},"content":{"243":{"position":[[489,3]]},"244":{"position":[[961,3],[1662,3]]}},"keywords":{}}],["39976",{"_index":6418,"title":{},"content":{"1292":{"position":[[964,5]]}},"keywords":{}}],["3:45",{"_index":1071,"title":{},"content":{"118":{"position":[[379,4]]},"323":{"position":[[637,4]]}},"keywords":{}}],["3x",{"_index":6189,"title":{},"content":{"1206":{"position":[[472,3]]}},"keywords":{}}],["4",{"_index":1313,"title":{"204":{"position":[[0,2]]},"251":{"position":[[0,2]]},"312":{"position":[[0,2]]},"477":{"position":[[0,2]]},"563":{"position":[[5,2]]}},"content":{"392":{"position":[[3078,1]]},"461":{"position":[[30,1],[255,1],[713,1],[857,1]]},"463":{"position":[[972,1]]},"662":{"position":[[2264,1]]},"829":{"position":[[1868,1]]},"838":{"position":[[2782,1]]},"861":{"position":[[1546,1]]},"862":{"position":[[896,1]]},"872":{"position":[[1339,1]]},"875":{"position":[[2885,1]]},"898":{"position":[[2702,1]]},"904":{"position":[[3356,1]]},"918":{"position":[[153,2]]},"1148":{"position":[[1080,1]]},"1149":{"position":[[1235,1]]},"1158":{"position":[[541,1]]},"1194":{"position":[[856,1],[1025,1]]},"1317":{"position":[[774,1]]}},"keywords":{}}],["4).status("eq"",{"_index":339,"title":{},"content":{"19":{"position":[[728,25]]}},"keywords":{}}],["4.99",{"_index":3079,"title":{},"content":{"467":{"position":[[121,4]]}},"keywords":{}}],["409",{"_index":5348,"title":{},"content":{"948":{"position":[[102,3]]},"1044":{"position":[[81,3]]},"1305":{"position":[[1099,3]]},"1307":{"position":[[465,3]]}},"keywords":{}}],["42",{"_index":5989,"title":{},"content":{"1115":{"position":[[446,2],[486,4]]}},"keywords":{}}],["420",{"_index":3040,"title":{},"content":{"463":{"position":[[1396,3]]}},"keywords":{}}],["4215",{"_index":2476,"title":{},"content":{"401":{"position":[[576,4]]}},"keywords":{}}],["4222:4222",{"_index":4924,"title":{},"content":{"865":{"position":[[247,9]]}},"keywords":{}}],["426",{"_index":5064,"title":{},"content":{"876":{"position":[[560,3]]},"990":{"position":[[1098,3],[1340,3]]}},"keywords":{}}],["43",{"_index":6454,"title":{},"content":{"1295":{"position":[[1147,3]]}},"keywords":{}}],["431",{"_index":3015,"title":{},"content":{"461":{"position":[[373,3]]}},"keywords":{}}],["443",{"_index":5913,"title":{},"content":{"1090":{"position":[[1067,3]]},"1097":{"position":[[785,3]]},"1098":{"position":[[421,3]]},"1099":{"position":[[391,3]]},"1103":{"position":[[274,3]]}},"keywords":{}}],["46",{"_index":3032,"title":{},"content":{"463":{"position":[[678,2]]}},"keywords":{}}],["480",{"_index":1515,"title":{},"content":{"244":{"position":[[1249,3]]}},"keywords":{}}],["4:18",{"_index":2801,"title":{},"content":{"419":{"position":[[556,4]]}},"keywords":{}}],["4gb",{"_index":4579,"title":{},"content":{"773":{"position":[[689,3]]}},"keywords":{}}],["4k",{"_index":2556,"title":{},"content":{"408":{"position":[[3046,2]]}},"keywords":{}}],["4x",{"_index":6190,"title":{},"content":{"1206":{"position":[[476,2]]},"1209":{"position":[[439,2]]}},"keywords":{}}],["5",{"_index":1320,"title":{"205":{"position":[[0,2]]},"252":{"position":[[0,2]]},"313":{"position":[[0,2]]},"478":{"position":[[0,2]]},"564":{"position":[[5,2]]}},"content":{"298":{"position":[[629,1]]},"299":{"position":[[442,2],[1319,1]]},"392":{"position":[[5174,1]]},"396":{"position":[[963,1],[1056,1],[1156,1]]},"397":{"position":[[1508,1]]},"402":{"position":[[974,1]]},"408":{"position":[[370,3],[1236,1]]},"427":{"position":[[1520,1]]},"432":{"position":[[327,1]]},"461":{"position":[[809,1],[859,1]]},"523":{"position":[[544,2]]},"653":{"position":[[967,2],[973,1]]},"662":{"position":[[2568,1]]},"736":{"position":[[334,1],[366,1]]},"829":{"position":[[2238,1]]},"838":{"position":[[2862,1]]},"861":{"position":[[2191,1]]},"862":{"position":[[1084,1]]},"872":{"position":[[2097,1]]},"875":{"position":[[3549,1]]},"886":{"position":[[2005,2],[2956,2]]},"898":{"position":[[3119,1]]},"904":{"position":[[3537,1]]},"988":{"position":[[1063,1],[1088,1],[3005,2]]},"1058":{"position":[[361,2]]},"1074":{"position":[[605,1],[1517,2]]},"1157":{"position":[[162,1]]},"1158":{"position":[[636,1]]},"1311":{"position":[[1578,1]]}},"keywords":{}}],["5.79",{"_index":3069,"title":{},"content":{"466":{"position":[[134,4]]}},"keywords":{}}],["5.84",{"_index":3083,"title":{},"content":{"467":{"position":[[220,4]]}},"keywords":{}}],["50",{"_index":1724,"title":{},"content":{"298":{"position":[[647,2]]},"299":{"position":[[502,2],[1290,2]]},"459":{"position":[[570,2],[612,4]]},"696":{"position":[[1385,4]]},"698":{"position":[[2889,3],[2917,3]]},"752":{"position":[[1186,3]]},"767":{"position":[[384,2],[417,3]]},"798":{"position":[[659,3]]},"872":{"position":[[2597,2],[2622,2],[4613,2],[4638,2]]},"886":{"position":[[1764,2]]},"898":{"position":[[3477,3],[3890,2]]},"1066":{"position":[[465,3]]},"1134":{"position":[[781,2]]},"1164":{"position":[[297,3]]},"1194":{"position":[[547,2],[626,2]]},"1278":{"position":[[101,2],[139,2]]}},"keywords":{}}],["500",{"_index":4430,"title":{},"content":{"749":{"position":[[23522,3]]},"759":{"position":[[742,4]]},"760":{"position":[[738,4]]},"1194":{"position":[[360,3]]}},"keywords":{}}],["5000",{"_index":3710,"title":{},"content":{"632":{"position":[[2632,5]]}},"keywords":{}}],["500k",{"_index":604,"title":{},"content":{"38":{"position":[[1020,5]]}},"keywords":{}}],["500m",{"_index":2743,"title":{},"content":{"412":{"position":[[10673,5]]}},"keywords":{}}],["504",{"_index":3034,"title":{},"content":{"463":{"position":[[742,3]]}},"keywords":{}}],["50m",{"_index":2742,"title":{},"content":{"412":{"position":[[10635,4]]}},"keywords":{}}],["50mb",{"_index":2529,"title":{},"content":{"408":{"position":[[606,4],[1238,4]]}},"keywords":{}}],["53409",{"_index":1837,"title":{},"content":{"303":{"position":[[749,6],[962,6]]},"361":{"position":[[746,6],[959,6]]}},"keywords":{}}],["535",{"_index":3035,"title":{},"content":{"463":{"position":[[770,3]]}},"keywords":{}}],["53k",{"_index":2829,"title":{},"content":{"420":{"position":[[123,3]]}},"keywords":{}}],["54.79",{"_index":3080,"title":{},"content":{"467":{"position":[[143,5]]}},"keywords":{}}],["5400",{"_index":1521,"title":{},"content":{"244":{"position":[[1413,4]]}},"keywords":{}}],["562",{"_index":2477,"title":{},"content":{"401":{"position":[[586,3]]}},"keywords":{}}],["590",{"_index":1464,"title":{},"content":{"243":{"position":[[581,3],[781,3]]},"244":{"position":[[832,3],[870,3]]}},"keywords":{}}],["5mb",{"_index":2530,"title":{},"content":{"408":{"position":[[671,3]]},"451":{"position":[[403,3]]}},"keywords":{}}],["6",{"_index":757,"title":{"206":{"position":[[0,2]]},"253":{"position":[[0,2]]},"617":{"position":[[0,1]]}},"content":{"50":{"position":[[465,1]]},"303":{"position":[[776,1],[985,1]]},"361":{"position":[[773,1],[982,1]]},"662":{"position":[[2648,1]]},"829":{"position":[[2958,1]]},"838":{"position":[[2961,1]]},"845":{"position":[[127,1]]},"849":{"position":[[106,1],[576,1]]},"862":{"position":[[1543,1]]},"872":{"position":[[2888,1]]},"875":{"position":[[5963,1]]},"898":{"position":[[4461,1]]},"1058":{"position":[[481,2]]}},"keywords":{}}],["6*5=30",{"_index":4087,"title":{},"content":{"736":{"position":[[395,6]]}},"keywords":{}}],["6.3.x",{"_index":6037,"title":{},"content":{"1133":{"position":[[396,7]]}},"keywords":{}}],["6.34",{"_index":3077,"title":{},"content":{"467":{"position":[[88,4]]}},"keywords":{}}],["60",{"_index":1743,"title":{},"content":{"299":{"position":[[309,2]]},"571":{"position":[[1624,2]]},"653":{"position":[[517,2],[522,2],[806,3],[813,2],[962,2]]},"656":{"position":[[261,2]]},"696":{"position":[[1324,3]]},"846":{"position":[[734,3],[1160,3]]},"995":{"position":[[1864,2],[1869,2]]}},"keywords":{}}],["60000",{"_index":4830,"title":{},"content":{"846":{"position":[[1067,5]]}},"keywords":{}}],["620",{"_index":4566,"title":{},"content":{"772":{"position":[[856,4]]},"774":{"position":[[784,4]]}},"keywords":{}}],["62080c42d471e3d2625e49dcca3b8e3",{"_index":6149,"title":{},"content":{"1177":{"position":[[448,34]]}},"keywords":{}}],["6265",{"_index":3013,"title":{},"content":{"461":{"position":[[50,5]]}},"keywords":{}}],["64",{"_index":115,"title":{},"content":{"8":{"position":[[480,2],[528,3]]}},"keywords":{}}],["67",{"_index":6406,"title":{},"content":{"1292":{"position":[[360,2]]}},"keywords":{}}],["68",{"_index":6404,"title":{},"content":{"1292":{"position":[[343,2]]}},"keywords":{}}],["7",{"_index":1333,"title":{"207":{"position":[[0,2]]},"254":{"position":[[0,2]]}},"content":{"394":{"position":[[1725,1]]},"412":{"position":[[7948,2]]},"662":{"position":[[2747,1]]},"697":{"position":[[193,1]]},"872":{"position":[[3584,1]]},"875":{"position":[[6495,1]]}},"keywords":{}}],["7.1.x",{"_index":6036,"title":{},"content":{"1133":{"position":[[387,5]]}},"keywords":{}}],["70",{"_index":1533,"title":{},"content":{"244":{"position":[[1702,2]]}},"keywords":{}}],["700",{"_index":2327,"title":{},"content":{"394":{"position":[[1634,3]]}},"keywords":{}}],["71",{"_index":6408,"title":{},"content":{"1292":{"position":[[382,2]]}},"keywords":{}}],["720",{"_index":1517,"title":{},"content":{"244":{"position":[[1288,3]]},"1133":{"position":[[582,3]]},"1134":{"position":[[405,4],[425,4]]}},"keywords":{}}],["72773",{"_index":6420,"title":{},"content":{"1292":{"position":[[985,5]]}},"keywords":{}}],["730",{"_index":6041,"title":{},"content":{"1133":{"position":[[612,4],[665,4]]}},"keywords":{}}],["73103",{"_index":6417,"title":{},"content":{"1292":{"position":[[956,5]]}},"keywords":{}}],["765",{"_index":2435,"title":{},"content":{"400":{"position":[[67,3]]}},"keywords":{}}],["768",{"_index":2456,"title":{},"content":{"401":{"position":[[310,3],[357,3],[404,3],[453,3]]}},"keywords":{}}],["8",{"_index":5047,"title":{},"content":{"875":{"position":[[7740,1]]}},"keywords":{}}],["8.0.0",{"_index":4279,"title":{},"content":{"749":{"position":[[10991,5],[11129,5]]},"793":{"position":[[1471,5]]}},"keywords":{}}],["8.1.4",{"_index":3635,"title":{},"content":{"617":{"position":[[456,6]]}},"keywords":{}}],["80",{"_index":1741,"title":{},"content":{"299":{"position":[[260,4],[767,3],[1124,3]]},"408":{"position":[[990,4]]},"461":{"position":[[1187,3]]},"875":{"position":[[1259,4]]}},"keywords":{}}],["8080",{"_index":4963,"title":{},"content":{"872":{"position":[[3330,5]]},"906":{"position":[[1033,4]]},"1219":{"position":[[560,5],[723,5]]},"1220":{"position":[[239,5]]}},"keywords":{}}],["8100",{"_index":1508,"title":{},"content":{"244":{"position":[[993,4]]}},"keywords":{}}],["88",{"_index":2439,"title":{},"content":{"400":{"position":[[115,2],[583,2]]}},"keywords":{}}],["8gb",{"_index":4580,"title":{},"content":{"773":{"position":[[860,3]]}},"keywords":{}}],["9",{"_index":4643,"title":{},"content":{"796":{"position":[[898,4]]},"863":{"position":[[65,2]]},"875":{"position":[[8515,1]]},"935":{"position":[[244,5]]},"1084":{"position":[[369,3]]},"1295":{"position":[[1048,1]]}},"keywords":{}}],["9.0.0",{"_index":4629,"title":{},"content":{"793":{"position":[[1465,5]]}},"keywords":{}}],["90",{"_index":1488,"title":{},"content":{"244":{"position":[[383,2],[639,2]]}},"keywords":{}}],["91882",{"_index":6422,"title":{},"content":{"1292":{"position":[[1011,5]]}},"keywords":{}}],["934",{"_index":2438,"title":{},"content":{"400":{"position":[[99,3]]}},"keywords":{}}],["938.9",{"_index":2971,"title":{},"content":{"454":{"position":[[687,5]]}},"keywords":{}}],["999",{"_index":3789,"title":{},"content":{"661":{"position":[[386,4]]}},"keywords":{}}],["9:47",{"_index":4900,"title":{},"content":{"861":{"position":[[1167,4]]}},"keywords":{}}],["9_]*]?[a",{"_index":5850,"title":{},"content":{"1084":{"position":[[354,8]]}},"keywords":{}}],["9dcca3b8e1a",{"_index":6492,"title":{},"content":{"1305":{"position":[[551,11]]}},"keywords":{}}],["_",{"_index":2396,"title":{},"content":{"398":{"position":[[879,3],[2165,3]]},"749":{"position":[[4933,1],[8287,1],[17589,1]]},"811":{"position":[[114,1]]},"863":{"position":[[83,1]]}},"keywords":{}}],["__dirnam",{"_index":6310,"title":{},"content":{"1266":{"position":[[288,10]]}},"keywords":{}}],["_attach",{"_index":4482,"title":{},"content":{"754":{"position":[[305,12],[439,12]]},"1004":{"position":[[294,12]]},"1051":{"position":[[574,13]]},"1177":{"position":[[421,13]]}},"keywords":{}}],["_delet",{"_index":3887,"title":{},"content":{"684":{"position":[[60,8],[200,9]]},"855":{"position":[[189,8]]},"857":{"position":[[129,8],[387,9]]},"861":{"position":[[1764,8]]},"867":{"position":[[184,8]]},"898":{"position":[[1872,8],[3995,10]]},"986":{"position":[[376,8],[1410,9]]},"988":{"position":[[1818,11],[1908,11],[3143,10],[5437,9]]},"1048":{"position":[[377,8],[493,9]]},"1051":{"position":[[557,9]]},"1107":{"position":[[36,8],[273,8],[454,9]]},"1177":{"position":[[404,9]]}},"keywords":{}}],["_deleted:tru",{"_index":5710,"title":{},"content":{"1047":{"position":[[116,13]]}},"keywords":{}}],["_deleted=fals",{"_index":5966,"title":{},"content":{"1107":{"position":[[128,15]]}},"keywords":{}}],["_id",{"_index":4223,"title":{},"content":{"749":{"position":[[6864,4],[7228,4],[23786,3],[23879,4]]}},"keywords":{}}],["_meta",{"_index":6150,"title":{},"content":{"1177":{"position":[[483,6]]}},"keywords":{}}],["_modifi",{"_index":5204,"title":{},"content":{"898":{"position":[[1229,9],[1921,9],[3965,12]]}},"keywords":{}}],["_modified)y",{"_index":5195,"title":{},"content":{"898":{"position":[[342,13]]}},"keywords":{}}],["_rev",{"_index":4365,"title":{},"content":{"749":{"position":[[17675,6]]},"1051":{"position":[[597,5]]},"1177":{"position":[[439,5]]}},"keywords":{}}],["a.id",{"_index":5101,"title":{},"content":{"885":{"position":[[1862,5],[1892,5]]}},"keywords":{}}],["a.updatedat",{"_index":5099,"title":{},"content":{"885":{"position":[[1738,12],[1782,12],[1827,12]]}},"keywords":{}}],["aaah",{"_index":4600,"title":{},"content":{"789":{"position":[[260,9],[313,8]]},"791":{"position":[[116,9],[209,8]]},"792":{"position":[[247,9],[457,8]]}},"keywords":{}}],["abcd",{"_index":5126,"title":{},"content":{"886":{"position":[[1871,9],[3168,9],[4136,9]]}},"keywords":{}}],["abil",{"_index":542,"title":{},"content":{"34":{"position":[[593,7]]},"173":{"position":[[1214,7]]},"174":{"position":[[2396,7]]},"190":{"position":[[41,7]]},"207":{"position":[[37,7]]},"265":{"position":[[79,7]]},"267":{"position":[[514,7],[1290,7]]},"280":{"position":[[65,7]]},"371":{"position":[[210,7]]},"385":{"position":[[35,7]]},"407":{"position":[[1018,7]]},"411":{"position":[[2781,7]]},"445":{"position":[[469,7]]},"446":{"position":[[1204,7]]},"506":{"position":[[29,7]]},"624":{"position":[[708,7]]},"837":{"position":[[137,7]]}},"keywords":{}}],["abov",{"_index":3564,"title":{},"content":{"610":{"position":[[1490,6]]},"703":{"position":[[897,5]]},"704":{"position":[[421,6]]},"826":{"position":[[487,5]]},"875":{"position":[[6963,5]]},"886":{"position":[[1201,5],[2833,5]]},"950":{"position":[[403,5]]},"987":{"position":[[251,6]]},"1091":{"position":[[26,5]]},"1316":{"position":[[2663,6]]}},"keywords":{}}],["absent",{"_index":2922,"title":{},"content":{"438":{"position":[[32,6]]}},"keywords":{}}],["absolut",{"_index":6099,"title":{},"content":{"1157":{"position":[[508,8]]}},"keywords":{}}],["abstract",{"_index":41,"title":{},"content":{"2":{"position":[[52,8]]},"24":{"position":[[583,10]]},"27":{"position":[[147,8]]},"35":{"position":[[111,9]]},"43":{"position":[[411,11]]},"331":{"position":[[276,11]]},"433":{"position":[[542,11]]},"521":{"position":[[426,9]]},"536":{"position":[[51,9]]},"596":{"position":[[49,9]]},"703":{"position":[[632,13],[817,11]]},"709":{"position":[[746,13],[1109,11]]},"962":{"position":[[89,11]]}},"keywords":{}}],["absurd",{"_index":495,"title":{"31":{"position":[[0,6]]}},"content":{"31":{"position":[[1,6]]},"1302":{"position":[[91,6]]}},"keywords":{}}],["accelar",{"_index":2571,"title":{},"content":{"408":{"position":[[5209,11]]}},"keywords":{}}],["accept",{"_index":1993,"title":{},"content":{"351":{"position":[[156,6]]},"382":{"position":[[197,10]]},"398":{"position":[[323,10]]},"412":{"position":[[2646,9],[6042,10]]},"432":{"position":[[719,11]]},"461":{"position":[[309,6]]},"829":{"position":[[3131,7]]},"875":{"position":[[6300,9]]},"880":{"position":[[89,6],[310,8]]},"918":{"position":[[29,7]]},"988":{"position":[[2595,9]]},"1048":{"position":[[358,6]]},"1102":{"position":[[568,9]]}},"keywords":{}}],["access",{"_index":87,"title":{"88":{"position":[[16,11]]},"97":{"position":[[28,10]]},"215":{"position":[[8,14]]},"365":{"position":[[12,6]]},"826":{"position":[[0,9]]},"1215":{"position":[[31,6]]}},"content":{"6":{"position":[[206,6]]},"11":{"position":[[309,9]]},"46":{"position":[[276,6]]},"65":{"position":[[268,6],[437,7],[532,10],[1168,6],[1907,7]]},"84":{"position":[[187,6]]},"87":{"position":[[92,8]]},"88":{"position":[[48,14],[118,6]]},"97":{"position":[[68,10],[185,14]]},"114":{"position":[[200,6]]},"131":{"position":[[430,6],[506,6]]},"149":{"position":[[200,6]]},"152":{"position":[[90,6]]},"159":{"position":[[337,6]]},"166":{"position":[[227,8]]},"173":{"position":[[697,8],[1379,11],[1431,10],[1536,6],[2730,10],[2939,10]]},"175":{"position":[[193,6]]},"183":{"position":[[293,6]]},"188":{"position":[[1840,6]]},"191":{"position":[[56,8]]},"195":{"position":[[193,7]]},"215":{"position":[[74,14]]},"216":{"position":[[86,8]]},"237":{"position":[[159,6]]},"241":{"position":[[499,14]]},"265":{"position":[[435,6],[811,6]]},"266":{"position":[[209,10]]},"274":{"position":[[212,6]]},"287":{"position":[[1025,6]]},"289":{"position":[[1363,6]]},"292":{"position":[[186,10]]},"303":{"position":[[1478,8]]},"310":{"position":[[175,6]]},"333":{"position":[[226,6]]},"336":{"position":[[275,6]]},"347":{"position":[[200,6]]},"362":{"position":[[1271,6]]},"365":{"position":[[87,6],[1194,13],[1365,13]]},"369":{"position":[[913,6],[1178,7],[1506,6]]},"373":{"position":[[514,14]]},"376":{"position":[[258,8]]},"377":{"position":[[124,7]]},"408":{"position":[[1591,6],[3796,6]]},"410":{"position":[[1417,6]]},"411":{"position":[[459,7]]},"412":{"position":[[12064,6],[12850,6]]},"417":{"position":[[98,7]]},"419":{"position":[[404,7]]},"429":{"position":[[291,9]]},"433":{"position":[[83,6],[199,6],[332,10]]},"444":{"position":[[556,7]]},"445":{"position":[[548,6]]},"450":{"position":[[505,6]]},"453":{"position":[[372,6]]},"454":{"position":[[790,6],[1032,6]]},"460":{"position":[[981,6]]},"470":{"position":[[197,6]]},"482":{"position":[[1210,6]]},"500":{"position":[[655,6]]},"502":{"position":[[475,6]]},"511":{"position":[[200,6]]},"526":{"position":[[191,7]]},"531":{"position":[[200,6]]},"550":{"position":[[73,6]]},"560":{"position":[[394,7]]},"581":{"position":[[281,6]]},"586":{"position":[[167,7]]},"591":{"position":[[200,6]]},"630":{"position":[[1003,10]]},"659":{"position":[[807,6]]},"674":{"position":[[130,8]]},"676":{"position":[[192,6]]},"709":{"position":[[84,6]]},"714":{"position":[[121,6]]},"715":{"position":[[350,6]]},"737":{"position":[[150,7]]},"740":{"position":[[370,6]]},"749":{"position":[[9366,7]]},"784":{"position":[[659,6]]},"829":{"position":[[1870,9],[2203,6]]},"832":{"position":[[187,6]]},"835":{"position":[[130,6],[912,6]]},"836":{"position":[[1634,6]]},"860":{"position":[[961,6]]},"861":{"position":[[2282,6]]},"872":{"position":[[218,6]]},"886":{"position":[[1372,6]]},"912":{"position":[[384,6]]},"968":{"position":[[783,6]]},"1018":{"position":[[113,6],[394,9],[667,6]]},"1040":{"position":[[81,6]]},"1084":{"position":[[658,9]]},"1088":{"position":[[687,10]]},"1102":{"position":[[46,6],[235,6]]},"1105":{"position":[[1242,6]]},"1116":{"position":[[256,9]]},"1117":{"position":[[224,9]]},"1118":{"position":[[42,6],[304,6]]},"1132":{"position":[[831,6]]},"1134":{"position":[[722,6]]},"1151":{"position":[[743,6]]},"1157":{"position":[[216,7]]},"1177":{"position":[[32,6]]},"1178":{"position":[[742,6]]},"1204":{"position":[[32,6]]},"1206":{"position":[[340,7]]},"1207":{"position":[[496,6]]},"1208":{"position":[[639,6]]},"1209":{"position":[[63,6]]},"1211":{"position":[[202,6]]},"1214":{"position":[[58,10],[628,6],[1032,6]]},"1215":{"position":[[76,6],[147,6],[167,6],[686,7]]},"1219":{"position":[[160,6]]},"1222":{"position":[[911,6]]},"1233":{"position":[[211,8]]},"1235":{"position":[[195,6],[330,6],[441,7]]},"1244":{"position":[[48,6]]},"1272":{"position":[[62,6]]},"1281":{"position":[[16,6]]},"1311":{"position":[[1587,6]]}},"keywords":{}}],["access.r",{"_index":3477,"title":{},"content":{"574":{"position":[[263,11]]}},"keywords":{}}],["accesshandl",{"_index":3011,"title":{},"content":{"460":{"position":[[1278,12]]},"1208":{"position":[[1056,12]]}},"keywords":{}}],["accesshandle.clos",{"_index":6224,"title":{},"content":{"1208":{"position":[[1912,21]]}},"keywords":{}}],["accesshandle.flush",{"_index":6223,"title":{},"content":{"1208":{"position":[[1797,21]]}},"keywords":{}}],["accesshandle.gets",{"_index":6222,"title":{},"content":{"1208":{"position":[[1739,23]]}},"keywords":{}}],["accesshandle.read(readbuff",{"_index":6214,"title":{},"content":{"1208":{"position":[[1367,29]]}},"keywords":{}}],["accesshandle.truncate(10",{"_index":6220,"title":{},"content":{"1208":{"position":[[1656,26]]}},"keywords":{}}],["accesshandle.write(writebuff",{"_index":6210,"title":{},"content":{"1208":{"position":[[1228,32],[1569,31]]}},"keywords":{}}],["accident",{"_index":3859,"title":{},"content":{"675":{"position":[[104,12]]},"761":{"position":[[64,12]]},"828":{"position":[[447,10]]},"881":{"position":[[303,12]]},"987":{"position":[[903,12]]},"1083":{"position":[[228,12]]},"1085":{"position":[[2061,10],[2285,12]]},"1107":{"position":[[1026,12]]}},"keywords":{}}],["accommod",{"_index":1668,"title":{},"content":{"287":{"position":[[106,11]]},"356":{"position":[[4,11]]},"362":{"position":[[62,11]]},"364":{"position":[[510,11]]},"369":{"position":[[816,11]]},"519":{"position":[[74,12]]}},"keywords":{}}],["accomplish",{"_index":1702,"title":{},"content":{"298":{"position":[[86,12]]}},"keywords":{}}],["accord",{"_index":1638,"title":{},"content":{"276":{"position":[[330,9]]},"612":{"position":[[1531,9]]},"641":{"position":[[77,9]]},"818":{"position":[[60,9]]},"861":{"position":[[2419,9]]},"1209":{"position":[[144,9]]}},"keywords":{}}],["accordingli",{"_index":1111,"title":{},"content":{"131":{"position":[[1005,12]]},"136":{"position":[[255,12]]},"390":{"position":[[1755,12]]},"397":{"position":[[1387,11]]},"403":{"position":[[376,12]]},"611":{"position":[[1064,12]]},"634":{"position":[[573,12]]},"685":{"position":[[426,12]]},"781":{"position":[[534,12]]},"880":{"position":[[263,11]]},"956":{"position":[[224,12]]},"1004":{"position":[[650,12]]}},"keywords":{}}],["account",{"_index":2708,"title":{},"content":{"412":{"position":[[6237,7]]},"416":{"position":[[282,7]]},"626":{"position":[[357,7],[1089,8]]},"698":{"position":[[2599,10]]},"1009":{"position":[[383,8]]},"1316":{"position":[[2200,8]]}},"keywords":{}}],["accur",{"_index":3108,"title":{},"content":{"476":{"position":[[331,9]]},"490":{"position":[[665,8]]}},"keywords":{}}],["accuraci",{"_index":2423,"title":{},"content":{"398":{"position":[[3168,9]]}},"keywords":{}}],["achiev",{"_index":419,"title":{},"content":{"25":{"position":[[222,7]]},"40":{"position":[[409,7]]},"81":{"position":[[27,8]]},"157":{"position":[[131,8]]},"166":{"position":[[42,7]]},"190":{"position":[[164,9]]},"265":{"position":[[403,7]]},"392":{"position":[[1306,7],[2348,7]]},"399":{"position":[[638,11]]},"527":{"position":[[36,9]]},"540":{"position":[[121,9]]},"613":{"position":[[603,8]]},"644":{"position":[[460,7]]},"698":{"position":[[2281,7]]},"709":{"position":[[221,8]]},"848":{"position":[[100,7]]},"858":{"position":[[100,7]]},"1147":{"position":[[107,7]]},"1177":{"position":[[189,7]]},"1204":{"position":[[190,7]]},"1298":{"position":[[87,9]]}},"keywords":{}}],["acid",{"_index":2030,"title":{},"content":{"354":{"position":[[1285,4]]},"412":{"position":[[13602,4]]},"1304":{"position":[[42,4],[151,4],[441,4],[1209,4]]}},"keywords":{}}],["acquisit",{"_index":4802,"title":{},"content":{"839":{"position":[[1033,12]]}},"keywords":{}}],["act",{"_index":2593,"title":{},"content":{"410":{"position":[[884,4]]}},"keywords":{}}],["action",{"_index":1127,"title":{},"content":{"140":{"position":[[199,8]]},"347":{"position":[[493,6]]},"362":{"position":[[1564,6]]},"411":{"position":[[2912,7]]},"412":{"position":[[8605,7]]},"486":{"position":[[62,7]]},"489":{"position":[[363,6]]},"497":{"position":[[593,6],[773,8]]},"514":{"position":[[202,7]]},"569":{"position":[[812,6]]},"571":{"position":[[377,7]]},"591":{"position":[[648,6]]},"618":{"position":[[721,6]]},"630":{"position":[[42,6],[532,7],[1033,8]]},"634":{"position":[[211,6]]},"765":{"position":[[220,6]]},"782":{"position":[[289,7]]},"783":{"position":[[80,6],[609,7]]}},"keywords":{}}],["action.compar",{"_index":2177,"title":{},"content":{"388":{"position":[[119,14]]}},"keywords":{}}],["action—lead",{"_index":3113,"title":{},"content":{"477":{"position":[[318,14]]}},"keywords":{}}],["activ",{"_index":447,"title":{"1013":{"position":[[0,8]]}},"content":{"27":{"position":[[419,6]]},"28":{"position":[[572,6]]},"88":{"position":[[80,6]]},"292":{"position":[[280,6]]},"386":{"position":[[255,6]]},"387":{"position":[[261,6]]},"408":{"position":[[3327,6]]},"617":{"position":[[799,6]]},"630":{"position":[[385,8]]},"684":{"position":[[146,10]]},"749":{"position":[[14395,10],[22782,10]]},"835":{"position":[[754,8]]},"849":{"position":[[108,6],[578,6]]},"1013":{"position":[[232,8],[404,8],[556,8]]},"1080":{"position":[[388,7],[735,8],[907,10],[996,8]]},"1215":{"position":[[324,8],[652,8]]}},"keywords":{}}],["activerepl",{"_index":5565,"title":{},"content":{"1007":{"position":[[1161,18]]}},"keywords":{}}],["activereplications[chunkid",{"_index":5567,"title":{},"content":{"1007":{"position":[[1265,29],[1745,27],[1854,28],[1915,28]]}},"keywords":{}}],["actual",{"_index":661,"title":{"420":{"position":[[10,8]]}},"content":{"42":{"position":[[263,8]]},"251":{"position":[[178,8]]},"261":{"position":[[1183,6]]},"412":{"position":[[2163,6]]},"486":{"position":[[86,6]]},"617":{"position":[[1481,8]]},"719":{"position":[[431,6],[488,6]]},"875":{"position":[[9265,6]]},"962":{"position":[[160,8]]},"987":{"position":[[374,6],[466,6]]},"1097":{"position":[[308,8]]},"1104":{"position":[[156,6]]},"1105":{"position":[[165,6]]},"1115":{"position":[[895,8]]},"1304":{"position":[[397,8]]},"1308":{"position":[[464,6]]}},"keywords":{}}],["ad",{"_index":569,"title":{"667":{"position":[[0,6]]},"796":{"position":[[26,6]]},"825":{"position":[[0,6]]}},"content":{"36":{"position":[[72,5]]},"144":{"position":[[15,6]]},"291":{"position":[[45,6]]},"335":{"position":[[563,6],[912,5]]},"375":{"position":[[226,6]]},"399":{"position":[[78,6]]},"411":{"position":[[3781,5],[5699,6]]},"415":{"position":[[312,6]]},"419":{"position":[[1099,6]]},"421":{"position":[[234,5]]},"432":{"position":[[998,5]]},"452":{"position":[[476,5]]},"454":{"position":[[106,5]]},"560":{"position":[[668,6]]},"621":{"position":[[777,5]]},"639":{"position":[[238,6]]},"685":{"position":[[518,6]]},"705":{"position":[[1323,6]]},"723":{"position":[[1495,5]]},"729":{"position":[[235,5]]},"749":{"position":[[1443,5],[6634,5],[14593,5]]},"754":{"position":[[85,5]]},"796":{"position":[[303,6],[596,6],[1006,6]]},"806":{"position":[[290,6]]},"921":{"position":[[117,5]]},"943":{"position":[[314,5]]},"955":{"position":[[250,5]]},"979":{"position":[[41,5]]},"1004":{"position":[[221,5],[627,5]]},"1008":{"position":[[4,5]]},"1072":{"position":[[1591,5]]},"1074":{"position":[[630,6]]},"1085":{"position":[[2955,5]]},"1092":{"position":[[564,6]]},"1095":{"position":[[223,6]]},"1097":{"position":[[220,6],[836,6]]},"1100":{"position":[[293,5],[330,5]]},"1101":{"position":[[241,5]]},"1103":{"position":[[27,6]]},"1112":{"position":[[412,5]]},"1202":{"position":[[274,5]]},"1296":{"position":[[615,5]]},"1301":{"position":[[1080,5]]},"1318":{"position":[[456,5]]}},"keywords":{}}],["adapt",{"_index":1,"title":{"0":{"position":[[8,8]]},"822":{"position":[[34,8]]},"1173":{"position":[[0,9]]},"1203":{"position":[[0,9]]}},"content":{"1":{"position":[[44,8],[198,7],[440,7],[494,7]]},"2":{"position":[[28,8],[88,8],[151,7],[206,7],[239,8]]},"3":{"position":[[15,7],[129,7],[180,7]]},"4":{"position":[[37,7],[219,8],[262,8],[295,7],[352,7]]},"5":{"position":[[6,7],[141,7],[211,7],[265,7]]},"6":{"position":[[6,7],[136,9],[151,7],[310,7],[365,7],[398,8]]},"7":{"position":[[6,7],[233,7],[292,7],[435,7],[631,7]]},"8":{"position":[[84,8],[173,7],[249,7],[925,7],[1068,7],[1217,7]]},"9":{"position":[[76,7],[145,7],[205,7],[360,7]]},"10":{"position":[[13,7],[74,7],[139,7],[172,8]]},"11":{"position":[[112,7],[174,7],[992,7]]},"16":{"position":[[298,8]]},"24":{"position":[[95,7],[185,8]]},"28":{"position":[[271,9]]},"32":{"position":[[194,8]]},"39":{"position":[[643,8]]},"40":{"position":[[661,8]]},"42":{"position":[[246,8]]},"47":{"position":[[1292,8]]},"72":{"position":[[118,9]]},"83":{"position":[[92,13]]},"174":{"position":[[2256,5]]},"188":{"position":[[333,7],[1110,8]]},"202":{"position":[[412,5]]},"207":{"position":[[245,6]]},"212":{"position":[[422,5]]},"254":{"position":[[429,8]]},"255":{"position":[[1746,5]]},"266":{"position":[[40,8],[86,8],[390,7]]},"383":{"position":[[315,9]]},"384":{"position":[[244,8]]},"390":{"position":[[1747,7]]},"454":{"position":[[1006,8]]},"500":{"position":[[742,8]]},"520":{"position":[[394,7]]},"554":{"position":[[432,8]]},"563":{"position":[[825,7]]},"567":{"position":[[247,9]]},"640":{"position":[[64,7],[468,5]]},"703":{"position":[[414,7]]},"749":{"position":[[603,7],[4770,7],[5619,7]]},"772":{"position":[[1936,8],[2465,8]]},"837":{"position":[[961,7],[1064,7],[1114,7],[1135,8],[1170,7],[1246,8],[1286,7],[1341,7],[1607,7],[1754,7],[2130,8]]},"872":{"position":[[3291,8]]},"961":{"position":[[249,7]]},"966":{"position":[[89,8]]},"1097":{"position":[[204,8],[417,7],[746,8]]},"1098":{"position":[[33,7],[300,7],[382,8]]},"1099":{"position":[[33,7],[278,7],[356,8]]},"1147":{"position":[[492,12]]},"1172":{"position":[[187,8],[278,10],[372,8],[543,7]]},"1173":{"position":[[20,8],[97,8],[197,8],[282,8]]},"1175":{"position":[[159,8]]},"1198":{"position":[[260,7]]},"1199":{"position":[[117,8]]},"1201":{"position":[[148,7]]},"1203":{"position":[[18,8]]},"1271":{"position":[[842,7],[1353,7]]},"1284":{"position":[[365,7],[386,7]]},"1300":{"position":[[396,7]]}},"keywords":{}}],["adapter.j",{"_index":4578,"title":{},"content":{"772":{"position":[[2241,13]]}},"keywords":{}}],["adapterabsurd",{"_index":6466,"title":{},"content":{"1299":{"position":[[520,13]]}},"keywords":{}}],["adapteror",{"_index":4779,"title":{},"content":{"837":{"position":[[1092,9]]}},"keywords":{}}],["adapterth",{"_index":3968,"title":{},"content":{"703":{"position":[[395,10]]}},"keywords":{}}],["add",{"_index":111,"title":{"738":{"position":[[0,3]]},"789":{"position":[[0,3]]},"791":{"position":[[0,3]]},"915":{"position":[[0,3]]},"1012":{"position":[[0,3]]}},"content":{"8":{"position":[[394,3]]},"33":{"position":[[192,4]]},"51":{"position":[[807,3]]},"155":{"position":[[214,4]]},"188":{"position":[[1873,3]]},"211":{"position":[[290,3]]},"313":{"position":[[168,3]]},"315":{"position":[[23,3]]},"346":{"position":[[807,3]]},"351":{"position":[[104,3],[259,3]]},"383":{"position":[[81,3]]},"392":{"position":[[431,3]]},"411":{"position":[[4338,4]]},"412":{"position":[[4130,4],[9883,3],[11078,3],[13098,4]]},"455":{"position":[[673,3]]},"463":{"position":[[1274,4]]},"476":{"position":[[85,3]]},"480":{"position":[[58,3],[451,3]]},"536":{"position":[[88,4]]},"538":{"position":[[830,3]]},"563":{"position":[[1069,3]]},"570":{"position":[[460,5]]},"576":{"position":[[81,4]]},"596":{"position":[[86,4]]},"598":{"position":[[837,3]]},"611":{"position":[[1175,3]]},"616":{"position":[[1055,4]]},"662":{"position":[[1344,3],[2266,3]]},"668":{"position":[[229,3]]},"676":{"position":[[68,3]]},"680":{"position":[[50,3],[416,3],[1116,3]]},"689":{"position":[[550,3]]},"696":{"position":[[1733,3]]},"702":{"position":[[92,3]]},"717":{"position":[[1352,3]]},"724":{"position":[[133,3]]},"729":{"position":[[291,3]]},"731":{"position":[[51,3]]},"732":{"position":[[17,3]]},"738":{"position":[[44,3]]},"751":{"position":[[149,3]]},"753":{"position":[[137,3]]},"770":{"position":[[142,4],[165,3],[228,3],[614,3]]},"772":{"position":[[306,4],[422,3],[907,3]]},"789":{"position":[[4,3]]},"796":{"position":[[126,3],[561,3],[969,3],[1400,3]]},"811":{"position":[[89,3]]},"818":{"position":[[413,3]]},"825":{"position":[[472,3]]},"838":{"position":[[2502,3]]},"846":{"position":[[470,3]]},"848":{"position":[[41,3],[154,3],[435,3],[799,3],[1434,3]]},"861":{"position":[[1201,3],[1548,3]]},"872":{"position":[[1787,3]]},"875":{"position":[[533,3],[574,3],[1165,3],[2932,3],[6033,3]]},"876":{"position":[[420,3]]},"898":{"position":[[1390,3],[1488,3],[1617,3],[3699,3]]},"910":{"position":[[350,3]]},"915":{"position":[[40,3]]},"917":{"position":[[1,4]]},"952":{"position":[[145,3]]},"956":{"position":[[20,3]]},"971":{"position":[[257,3]]},"990":{"position":[[546,3]]},"1010":{"position":[[230,3]]},"1012":{"position":[[44,3]]},"1022":{"position":[[714,3]]},"1023":{"position":[[365,3]]},"1041":{"position":[[124,3]]},"1059":{"position":[[102,3]]},"1064":{"position":[[78,3]]},"1079":{"position":[[617,3]]},"1081":{"position":[[51,3]]},"1085":{"position":[[2184,3]]},"1090":{"position":[[260,3]]},"1092":{"position":[[528,3]]},"1095":{"position":[[279,3]]},"1097":{"position":[[796,3]]},"1100":{"position":[[32,3],[365,3]]},"1107":{"position":[[392,3]]},"1112":{"position":[[483,3]]},"1114":{"position":[[219,3],[573,3]]},"1118":{"position":[[253,3]]},"1119":{"position":[[303,3]]},"1124":{"position":[[671,3]]},"1149":{"position":[[985,3]]},"1158":{"position":[[273,3]]},"1198":{"position":[[1879,3],[2312,3]]},"1202":{"position":[[330,3]]},"1222":{"position":[[430,3]]},"1252":{"position":[[139,3],[193,3]]},"1271":{"position":[[813,3]]},"1280":{"position":[[1,3],[61,3],[113,3]]},"1289":{"position":[[42,3],[94,3]]},"1296":{"position":[[764,3]]},"1311":{"position":[[1091,3]]},"1318":{"position":[[600,3]]}},"keywords":{}}],["addcollect",{"_index":5318,"title":{},"content":{"934":{"position":[[78,17]]},"958":{"position":[[212,16]]},"987":{"position":[[1070,16]]},"1085":{"position":[[2819,17]]},"1309":{"position":[[1347,17]]}},"keywords":{}}],["addeventlistener("storage"",{"_index":2907,"title":{},"content":{"432":{"position":[[878,37]]},"458":{"position":[[820,37]]}},"keywords":{}}],["addfulltextsearch",{"_index":4049,"title":{},"content":{"724":{"position":[[404,19],[444,17],[529,19]]}},"keywords":{}}],["addherobtn').on('click",{"_index":1952,"title":{},"content":{"335":{"position":[[581,28]]}},"keywords":{}}],["addit",{"_index":515,"title":{},"content":{"33":{"position":[[197,10]]},"43":{"position":[[529,8]]},"99":{"position":[[198,10]]},"131":{"position":[[727,8]]},"148":{"position":[[470,8]]},"173":{"position":[[3043,10]]},"210":{"position":[[4,8]]},"219":{"position":[[237,10]]},"228":{"position":[[440,10]]},"261":{"position":[[4,8]]},"290":{"position":[[244,10]]},"294":{"position":[[4,8]]},"295":{"position":[[4,8]]},"302":{"position":[[174,10]]},"312":{"position":[[4,8]]},"357":{"position":[[80,10]]},"375":{"position":[[835,9]]},"377":{"position":[[255,10]]},"412":{"position":[[4017,10]]},"441":{"position":[[441,10]]},"452":{"position":[[717,8]]},"463":{"position":[[137,10],[1279,10]]},"483":{"position":[[594,10]]},"585":{"position":[[245,10]]},"614":{"position":[[264,10]]},"616":{"position":[[338,10],[460,10],[581,10],[1060,10]]},"621":{"position":[[331,10]]},"679":{"position":[[81,10]]},"686":{"position":[[872,10]]},"690":{"position":[[359,9]]},"696":{"position":[[1478,10]]},"796":{"position":[[130,10]]},"802":{"position":[[123,10],[296,10]]},"806":{"position":[[469,10]]},"824":{"position":[[586,10]]},"831":{"position":[[4,8]]},"836":{"position":[[1512,10],[1977,10]]},"906":{"position":[[688,10]]},"1051":{"position":[[348,10]]},"1072":{"position":[[2229,10]]},"1092":{"position":[[571,10]]},"1094":{"position":[[409,10]]},"1107":{"position":[[399,10]]},"1212":{"position":[[22,10]]},"1251":{"position":[[44,10]]},"1284":{"position":[[260,10]]}},"keywords":{}}],["addition",{"_index":540,"title":{},"content":{"34":{"position":[[524,13]]},"265":{"position":[[506,13]]},"283":{"position":[[143,13]]},"401":{"position":[[690,13]]},"402":{"position":[[2344,12]]},"434":{"position":[[236,13]]},"520":{"position":[[320,13]]},"801":{"position":[[593,13]]}},"keywords":{}}],["additionalproperti",{"_index":5851,"title":{},"content":{"1084":{"position":[[377,20]]},"1085":{"position":[[1642,21],[1711,21]]}},"keywords":{}}],["addon",{"_index":6071,"title":{"1146":{"position":[[12,7]]}},"content":{"1146":{"position":[[297,7]]},"1148":{"position":[[451,6],[482,5],[673,7],[773,7]]}},"keywords":{}}],["addpouchplugin",{"_index":126,"title":{},"content":{"8":{"position":[[775,15]]},"1201":{"position":[[70,14]]}},"keywords":{}}],["addpouchplugin(require('pouchdb",{"_index":31,"title":{},"content":{"1":{"position":[[462,31]]},"2":{"position":[[174,31]]},"3":{"position":[[148,31]]},"4":{"position":[[320,31]]},"5":{"position":[[233,31]]},"6":{"position":[[333,31]]},"7":{"position":[[260,31]]},"8":{"position":[[1036,31]]},"9":{"position":[[173,31]]},"10":{"position":[[107,31]]},"11":{"position":[[142,31]]},"1201":{"position":[[116,31]]}},"keywords":{}}],["addpouchplugin(sqliteadapt",{"_index":130,"title":{},"content":{"8":{"position":[[1005,30]]}},"keywords":{}}],["addreplicationendpoint",{"_index":5933,"title":{},"content":{"1101":{"position":[[270,24]]}},"keywords":{}}],["address",{"_index":990,"title":{},"content":{"83":{"position":[[256,10]]},"229":{"position":[[54,9]]},"271":{"position":[[41,7]]},"395":{"position":[[4,7]]},"507":{"position":[[59,9]]},"574":{"position":[[818,9]]}},"keywords":{}}],["addrxplugin",{"_index":3726,"title":{},"content":{"646":{"position":[[10,11]]},"652":{"position":[[10,11]]},"680":{"position":[[453,11]]},"724":{"position":[[253,11]]},"738":{"position":[[86,11]]},"829":{"position":[[486,11]]},"862":{"position":[[316,12]]},"872":{"position":[[1567,11]]},"915":{"position":[[78,11]]},"952":{"position":[[181,11]]},"971":{"position":[[293,11]]},"1012":{"position":[[86,11]]},"1041":{"position":[[159,11]]},"1064":{"position":[[116,11]]},"1114":{"position":[[239,14],[459,11]]},"1119":{"position":[[368,11]]},"1231":{"position":[[625,11]]}},"keywords":{}}],["addrxplugin(module.rxdbdevmodeplugin",{"_index":3847,"title":{},"content":{"672":{"position":[[141,37]]},"673":{"position":[[147,37]]},"674":{"position":[[430,37]]}},"keywords":{}}],["addrxplugin(rxdbattachmentsplugin",{"_index":5286,"title":{},"content":{"915":{"position":[[171,35]]}},"keywords":{}}],["addrxplugin(rxdbbackupplugin",{"_index":3729,"title":{},"content":{"646":{"position":[[93,30]]}},"keywords":{}}],["addrxplugin(rxdbcleanupplugin",{"_index":3745,"title":{},"content":{"652":{"position":[[95,31]]},"1119":{"position":[[453,31]]}},"keywords":{}}],["addrxplugin(rxdbcrdtplugin",{"_index":3875,"title":{},"content":{"680":{"position":[[480,28]]}},"keywords":{}}],["addrxplugin(rxdbflexsearchplugin",{"_index":4047,"title":{},"content":{"724":{"position":[[293,34]]}},"keywords":{}}],["addrxplugin(rxdbjsondumpplugin",{"_index":5370,"title":{},"content":{"952":{"position":[[269,32]]},"971":{"position":[[381,32]]}},"keywords":{}}],["addrxplugin(rxdbleaderelectionplugin",{"_index":4092,"title":{},"content":{"738":{"position":[[186,38]]}},"keywords":{}}],["addrxplugin(rxdblocaldocumentsplugin",{"_index":5596,"title":{},"content":{"1012":{"position":[[186,38]]}},"keywords":{}}],["addrxplugin(rxdbquerybuilderplugin",{"_index":5761,"title":{},"content":{"1064":{"position":[[212,36]]}},"keywords":{}}],["addrxplugin(rxdbreplicationgraphqlplugin",{"_index":6276,"title":{},"content":{"1231":{"position":[[733,42]]}},"keywords":{}}],["addrxplugin(rxdbstateplugin",{"_index":5982,"title":{},"content":{"1114":{"position":[[658,29]]}},"keywords":{}}],["addrxplugin(rxdbupdateplugin",{"_index":5686,"title":{},"content":{"1041":{"position":[[242,30]]},"1059":{"position":[[181,30]]}},"keywords":{}}],["addrxplugin.add",{"_index":3869,"title":{},"content":{"680":{"position":[[74,15]]}},"keywords":{}}],["addstat",{"_index":5980,"title":{},"content":{"1114":{"position":[[281,10],[333,8]]}},"keywords":{}}],["adequ",{"_index":867,"title":{},"content":{"58":{"position":[[105,8]]}},"keywords":{}}],["adher",{"_index":5280,"title":{},"content":{"912":{"position":[[690,8]]}},"keywords":{}}],["adjust",{"_index":2770,"title":{},"content":{"412":{"position":[[14361,6]]},"454":{"position":[[329,12]]}},"keywords":{}}],["admin",{"_index":2754,"title":{},"content":{"412":{"position":[[12695,5]]}},"keywords":{}}],["adopt",{"_index":1187,"title":{"313":{"position":[[11,5]]}},"content":{"164":{"position":[[28,6]]},"231":{"position":[[6,6]]},"241":{"position":[[356,8]]},"263":{"position":[[257,5]]},"274":{"position":[[26,7]]},"320":{"position":[[103,7]]},"420":{"position":[[877,8]]},"478":{"position":[[128,5]]},"483":{"position":[[1143,8]]},"530":{"position":[[279,8]]},"563":{"position":[[951,6]]},"613":{"position":[[623,9]]},"624":{"position":[[894,8]]},"632":{"position":[[954,8]]},"1301":{"position":[[1025,7]]}},"keywords":{}}],["advanc",{"_index":563,"title":{"57":{"position":[[0,8]]},"137":{"position":[[0,8]]},"166":{"position":[[0,8]]},"193":{"position":[[0,8]]},"203":{"position":[[3,8]]},"250":{"position":[[3,8]]},"341":{"position":[[0,8]]},"361":{"position":[[0,8]]},"505":{"position":[[0,8]]},"526":{"position":[[0,8]]},"544":{"position":[[0,8]]},"558":{"position":[[45,8]]},"583":{"position":[[0,8]]},"604":{"position":[[0,8]]},"637":{"position":[[0,8]]}},"content":{"35":{"position":[[593,8]]},"39":{"position":[[656,8]]},"47":{"position":[[1039,8],[1137,8]]},"64":{"position":[[195,8]]},"137":{"position":[[21,8]]},"161":{"position":[[244,8]]},"170":{"position":[[371,8]]},"193":{"position":[[24,8]]},"198":{"position":[[339,8]]},"252":{"position":[[70,8]]},"260":{"position":[[198,8]]},"262":{"position":[[315,8]]},"283":{"position":[[45,8]]},"303":{"position":[[112,8]]},"312":{"position":[[57,8]]},"313":{"position":[[193,8]]},"317":{"position":[[100,8]]},"353":{"position":[[517,8]]},"354":{"position":[[542,8],[837,8],[1428,8]]},"362":{"position":[[910,8]]},"383":{"position":[[154,8]]},"392":{"position":[[154,8]]},"408":{"position":[[3456,11],[4631,8]]},"411":{"position":[[5259,8]]},"412":{"position":[[3648,8]]},"427":{"position":[[435,8]]},"441":{"position":[[318,8]]},"478":{"position":[[273,8]]},"480":{"position":[[1072,8]]},"483":{"position":[[634,8]]},"510":{"position":[[318,8]]},"520":{"position":[[301,8]]},"533":{"position":[[249,8]]},"535":{"position":[[522,8],[1046,8]]},"544":{"position":[[18,8]]},"548":{"position":[[404,8]]},"559":{"position":[[1163,8],[1499,8]]},"560":{"position":[[727,8]]},"563":{"position":[[181,8]]},"564":{"position":[[10,8]]},"567":{"position":[[576,8]]},"593":{"position":[[249,8]]},"595":{"position":[[542,8],[1123,8]]},"604":{"position":[[18,8]]},"608":{"position":[[402,8]]},"611":{"position":[[385,11]]},"643":{"position":[[41,8]]},"644":{"position":[[172,8]]},"723":{"position":[[2282,8]]},"793":{"position":[[978,8]]},"831":{"position":[[360,8]]},"836":{"position":[[2366,8]]},"839":{"position":[[500,8],[729,8]]},"841":{"position":[[98,8],[475,8]]},"913":{"position":[[85,8]]},"1085":{"position":[[1817,8]]},"1132":{"position":[[634,8]]}},"keywords":{}}],["advantag",{"_index":96,"title":{"521":{"position":[[27,9]]}},"content":{"7":{"position":[[77,10]]},"47":{"position":[[13,11]]},"65":{"position":[[461,9],[1855,11]]},"66":{"position":[[72,11]]},"71":{"position":[[88,11]]},"92":{"position":[[29,9]]},"174":{"position":[[67,10]]},"180":{"position":[[102,11]]},"186":{"position":[[190,10]]},"217":{"position":[[306,12]]},"232":{"position":[[243,12]]},"247":{"position":[[116,10]]},"265":{"position":[[16,10]]},"278":{"position":[[121,10]]},"282":{"position":[[463,9]]},"284":{"position":[[198,9]]},"366":{"position":[[343,10]]},"372":{"position":[[254,12]]},"411":{"position":[[2739,10],[5393,10]]},"445":{"position":[[443,10],[2094,10]]},"485":{"position":[[32,11]]},"500":{"position":[[385,10]]},"567":{"position":[[76,9]]},"624":{"position":[[85,10]]},"1072":{"position":[[889,9]]},"1083":{"position":[[170,11]]},"1206":{"position":[[555,10]]}},"keywords":{}}],["advis",{"_index":2097,"title":{},"content":{"362":{"position":[[619,9]]}},"keywords":{}}],["ae",{"_index":1691,"title":{},"content":{"291":{"position":[[452,3]]},"717":{"position":[[107,3]]},"718":{"position":[[507,4],[519,4],[531,4],[552,4]]}},"keywords":{}}],["aerospac",{"_index":3452,"title":{},"content":{"569":{"position":[[300,10]]}},"keywords":{}}],["aesinvalid",{"_index":1877,"title":{},"content":{"310":{"position":[[156,13]]}},"keywords":{}}],["affect",{"_index":2114,"title":{},"content":{"366":{"position":[[515,6]]},"401":{"position":[[733,7]]},"535":{"position":[[1007,6]]},"595":{"position":[[1084,6]]},"623":{"position":[[117,9]]},"699":{"position":[[501,6]]},"749":{"position":[[21613,6]]},"839":{"position":[[1383,6]]},"975":{"position":[[232,6]]},"1175":{"position":[[419,6]]},"1315":{"position":[[1328,6]]},"1316":{"position":[[3417,8]]},"1317":{"position":[[540,8]]},"1318":{"position":[[47,7],[1019,6]]},"1322":{"position":[[515,6]]}},"keywords":{}}],["afford",{"_index":1693,"title":{},"content":{"295":{"position":[[96,10]]}},"keywords":{}}],["afoul",{"_index":1867,"title":{},"content":{"305":{"position":[[121,5]]}},"keywords":{}}],["aftermigratebatch",{"_index":4493,"title":{},"content":{"759":{"position":[[886,18]]},"760":{"position":[[774,18]]}},"keywords":{}}],["aftermigratebatchhandlerinput",{"_index":4494,"title":{},"content":{"759":{"position":[[913,30]]},"760":{"position":[[801,30]]}},"keywords":{}}],["afterward",{"_index":1272,"title":{},"content":{"188":{"position":[[2373,10]]},"411":{"position":[[179,10]]},"698":{"position":[[2667,10]]},"773":{"position":[[423,11]]},"806":{"position":[[712,10]]},"1028":{"position":[[112,10]]},"1052":{"position":[[71,11]]},"1069":{"position":[[425,11]]},"1104":{"position":[[448,10]]}},"keywords":{}}],["afterwards.do",{"_index":4819,"title":{},"content":{"844":{"position":[[153,15]]}},"keywords":{}}],["ag",{"_index":975,"title":{},"content":{"77":{"position":[[244,4]]},"103":{"position":[[284,4]]},"234":{"position":[[344,4]]},"426":{"position":[[323,4]]},"662":{"position":[[2508,4]]},"681":{"position":[[720,4]]},"767":{"position":[[377,3]]},"798":{"position":[[386,3],[445,6],[474,7],[578,4],[717,3],[774,6],[881,7],[929,6]]},"820":{"position":[[573,4],[625,4]]},"821":{"position":[[733,3],[798,3],[828,3]]},"838":{"position":[[2722,4]]},"886":{"position":[[709,3],[2423,3],[3621,4]]},"898":{"position":[[2617,4],[3554,3]]},"1041":{"position":[[307,4],[327,3]]},"1043":{"position":[[99,4]]},"1044":{"position":[[322,4],[342,3],[514,4],[574,4]]},"1045":{"position":[[173,4]]},"1051":{"position":[[287,4]]},"1055":{"position":[[223,4]]},"1056":{"position":[[240,5]]},"1059":{"position":[[258,4],[310,4],[330,3]]},"1060":{"position":[[126,4],[169,4],[188,3]]},"1061":{"position":[[127,4],[231,3]]},"1062":{"position":[[117,3],[183,4]]},"1063":{"position":[[98,4],[141,4],[245,4]]},"1066":{"position":[[384,4],[523,3],[580,6],[687,7],[735,6]]},"1067":{"position":[[323,4],[1317,4],[1480,6],[1584,4],[1996,4],[2140,4]]},"1082":{"position":[[382,4]]},"1083":{"position":[[582,4]]},"1149":{"position":[[1175,4]]},"1249":{"position":[[495,4],[541,4]]},"1294":{"position":[[311,3],[470,3],[561,4],[576,6],[623,3],[1284,3]]},"1296":{"position":[[294,3],[713,4],[1021,4],[1036,6],[1105,4]]},"1311":{"position":[[540,4],[1573,4]]}},"keywords":{}}],["again",{"_index":1332,"title":{},"content":{"206":{"position":[[346,6]]},"309":{"position":[[275,6]]},"412":{"position":[[8329,7]]},"486":{"position":[[384,6]]},"614":{"position":[[914,5]]},"626":{"position":[[804,6],[1070,6]]},"647":{"position":[[143,6],[479,5]]},"697":{"position":[[446,6]]},"698":{"position":[[103,6]]},"700":{"position":[[923,5]]},"702":{"position":[[858,6]]},"783":{"position":[[105,6]]},"799":{"position":[[473,5]]},"817":{"position":[[275,5]]},"875":{"position":[[8934,6]]},"880":{"position":[[319,6]]},"955":{"position":[[202,5]]},"976":{"position":[[251,5]]},"984":{"position":[[63,6]]},"985":{"position":[[461,6]]},"987":{"position":[[968,6]]},"988":{"position":[[5872,6],[6121,6]]},"990":{"position":[[79,5],[452,6]]},"1003":{"position":[[284,5]]},"1030":{"position":[[197,5]]},"1058":{"position":[[512,5]]},"1115":{"position":[[720,5]]},"1198":{"position":[[2341,6]]},"1208":{"position":[[1899,6]]},"1304":{"position":[[1845,6]]},"1308":{"position":[[628,6]]},"1314":{"position":[[584,5]]},"1316":{"position":[[3241,6]]},"1318":{"position":[[246,6],[685,6]]}},"keywords":{}}],["against",{"_index":1554,"title":{},"content":{"251":{"position":[[81,7]]},"630":{"position":[[572,7]]},"699":{"position":[[702,7]]},"711":{"position":[[835,7]]},"778":{"position":[[344,7]]},"886":{"position":[[1817,7]]},"1124":{"position":[[1552,7],[1814,7]]},"1161":{"position":[[62,7]]},"1174":{"position":[[522,7]]},"1180":{"position":[[62,7]]},"1250":{"position":[[42,7]]}},"keywords":{}}],["age+id",{"_index":6456,"title":{},"content":{"1296":{"position":[[335,6]]}},"keywords":{}}],["ageidcustomindex",{"_index":6457,"title":{},"content":{"1296":{"position":[[589,16],[772,16],[1127,18]]}},"keywords":{}}],["agent",{"_index":6056,"title":{},"content":{"1140":{"position":[[154,5]]},"1297":{"position":[[206,5]]}},"keywords":{}}],["aggreg",{"_index":1560,"title":{},"content":{"252":{"position":[[240,10]]},"353":{"position":[[69,13]]},"354":{"position":[[756,13]]},"412":{"position":[[12709,9],[14148,14]]},"418":{"position":[[343,11]]},"698":{"position":[[2678,9]]},"888":{"position":[[288,9],[921,9]]},"889":{"position":[[657,9]]},"1021":{"position":[[96,9]]},"1072":{"position":[[634,12],[931,11],[1049,11]]},"1315":{"position":[[842,9]]},"1322":{"position":[[490,9]]}},"keywords":{}}],["aggress",{"_index":1756,"title":{},"content":{"299":{"position":[[968,10],[1522,12]]}},"keywords":{}}],["agil",{"_index":2087,"title":{},"content":{"362":{"position":[[224,5]]}},"keywords":{}}],["agnost",{"_index":1546,"title":{"351":{"position":[[17,9]]}},"content":{"249":{"position":[[297,8]]},"357":{"position":[[447,8]]},"500":{"position":[[721,9]]}},"keywords":{}}],["ago",{"_index":443,"title":{},"content":{"27":{"position":[[349,3]]},"408":{"position":[[489,4],[1482,4],[5605,4]]},"705":{"position":[[36,3]]}},"keywords":{}}],["ahead",{"_index":2563,"title":{},"content":{"408":{"position":[[4062,6]]}},"keywords":{}}],["ai",{"_index":2505,"title":{},"content":{"404":{"position":[[462,2],[503,2]]}},"keywords":{}}],["ai/mxbai",{"_index":2466,"title":{},"content":{"401":{"position":[[472,8]]}},"keywords":{}}],["aim",{"_index":2302,"title":{},"content":{"394":{"position":[[192,3]]},"410":{"position":[[166,3]]},"510":{"position":[[532,6]]}},"keywords":{}}],["airbag",{"_index":3458,"title":{},"content":{"569":{"position":[[668,8],[772,7]]}},"keywords":{}}],["ajax",{"_index":1915,"title":{},"content":{"320":{"position":[[72,4]]},"574":{"position":[[658,4]]}},"keywords":{}}],["ajv",{"_index":6285,"title":{"1286":{"position":[[9,4]]},"1290":{"position":[[0,3]]}},"content":{"1237":{"position":[[562,5]]},"1286":{"position":[[72,3],[256,5]]},"1287":{"position":[[36,3]]},"1290":{"position":[[47,5],[59,3]]},"1292":{"position":[[356,3],[712,3],[972,3]]}},"keywords":{}}],["ajv.addformat('email",{"_index":6389,"title":{},"content":{"1290":{"position":[[75,22]]}},"keywords":{}}],["aka",{"_index":1625,"title":{},"content":{"269":{"position":[[7,4]]},"367":{"position":[[655,4]]},"502":{"position":[[643,4]]},"619":{"position":[[79,4]]},"1087":{"position":[[18,3]]}},"keywords":{}}],["aklsdjfhaklsdjhf",{"_index":5728,"title":{},"content":{"1051":{"position":[[606,20]]}},"keywords":{}}],["alert",{"_index":3655,"title":{},"content":{"618":{"position":[[673,5]]}},"keywords":{}}],["algorithm",{"_index":982,"title":{"78":{"position":[[48,10]]},"82":{"position":[[12,9]]},"108":{"position":[[48,10]]},"113":{"position":[[12,9]]},"234":{"position":[[48,10]]},"238":{"position":[[12,9]]},"289":{"position":[[17,10]]}},"content":{"78":{"position":[[20,9]]},"82":{"position":[[20,9]]},"108":{"position":[[30,9],[75,9]]},"113":{"position":[[33,9]]},"174":{"position":[[1550,10],[1595,9],[1640,9],[2898,9],[2954,9]]},"218":{"position":[[186,11]]},"223":{"position":[[251,10]]},"234":{"position":[[54,10],[70,9]]},"238":{"position":[[29,9]]},"289":{"position":[[70,9],[154,9],[340,10]]},"369":{"position":[[1238,9]]},"393":{"position":[[526,9]]},"394":{"position":[[1091,11]]},"408":{"position":[[3648,11]]},"411":{"position":[[3424,10]]},"490":{"position":[[463,10],[517,9]]},"504":{"position":[[730,10],[777,10]]},"571":{"position":[[1748,9]]},"717":{"position":[[111,9]]},"718":{"position":[[483,9],[541,10]]},"737":{"position":[[67,9]]},"799":{"position":[[239,9]]},"965":{"position":[[234,9]]},"1065":{"position":[[1652,10]]},"1071":{"position":[[470,9]]},"1083":{"position":[[291,10]]},"1093":{"position":[[214,9]]},"1318":{"position":[[864,9]]}},"keywords":{}}],["alias",{"_index":1131,"title":{},"content":{"141":{"position":[[153,8]]}},"keywords":{}}],["alic",{"_index":2768,"title":{},"content":{"412":{"position":[[13954,5]]},"426":{"position":[[314,8]]},"680":{"position":[[1258,8]]},"810":{"position":[[227,8],[317,7]]},"811":{"position":[[207,8],[297,7]]},"813":{"position":[[284,8]]},"866":{"position":[[720,7]]},"951":{"position":[[332,8]]},"1052":{"position":[[234,8]]},"1056":{"position":[[78,5],[140,7]]},"1316":{"position":[[754,6],[1007,5],[1177,5],[1251,5]]}},"keywords":{}}],["alice@example.com",{"_index":2877,"title":{},"content":{"426":{"position":[[339,19]]}},"keywords":{}}],["align",{"_index":956,"title":{"352":{"position":[[0,7]]}},"content":{"68":{"position":[[112,5]]},"70":{"position":[[129,5]]},"104":{"position":[[43,5]]},"174":{"position":[[521,8]]},"222":{"position":[[213,5]]},"231":{"position":[[88,6]]},"293":{"position":[[371,7]]},"298":{"position":[[737,6]]},"299":{"position":[[845,7]]},"362":{"position":[[32,5]]},"364":{"position":[[147,6]]},"411":{"position":[[5284,6]]},"502":{"position":[[160,5]]},"521":{"position":[[109,5]]},"581":{"position":[[646,6]]},"636":{"position":[[402,6]]},"902":{"position":[[490,6]]}},"keywords":{}}],["aliv",{"_index":3599,"title":{},"content":{"612":{"position":[[1986,7]]},"875":{"position":[[7341,7]]}},"keywords":{}}],["aliveheroes.map(doc",{"_index":3467,"title":{},"content":{"571":{"position":[[1121,19]]}},"keywords":{}}],["allattach",{"_index":5299,"title":{"920":{"position":[[0,17]]},"921":{"position":[[0,16]]}},"content":{},"keywords":{}}],["alldoc",{"_index":6508,"title":{},"content":{"1311":{"position":[[898,7]]}},"keywords":{}}],["alldocs.length",{"_index":6510,"title":{},"content":{"1311":{"position":[[941,15]]}},"keywords":{}}],["alldocsresult",{"_index":4882,"title":{},"content":{"857":{"position":[[281,13]]}},"keywords":{}}],["alldocsresult.foreach(doc",{"_index":4884,"title":{},"content":{"857":{"position":[[340,25]]}},"keywords":{}}],["allhero",{"_index":3428,"title":{},"content":{"562":{"position":[[652,9],[719,11]]}},"keywords":{}}],["alli",{"_index":3219,"title":{},"content":{"501":{"position":[[86,5]]}},"keywords":{}}],["alloc",{"_index":1770,"title":{},"content":{"300":{"position":[[190,9],[356,9]]}},"keywords":{}}],["allot",{"_index":1795,"title":{},"content":{"302":{"position":[[60,8]]}},"keywords":{}}],["allow",{"_index":396,"title":{"1084":{"position":[[4,7]]},"1110":{"position":[[19,8]]}},"content":{"24":{"position":[[115,6],[626,6]]},"34":{"position":[[139,6],[427,8]]},"38":{"position":[[869,5]]},"39":{"position":[[89,8]]},"40":{"position":[[462,6]]},"45":{"position":[[105,6]]},"65":{"position":[[178,6],[890,6],[1628,6]]},"77":{"position":[[39,6]]},"88":{"position":[[29,6]]},"90":{"position":[[125,6]]},"91":{"position":[[68,8]]},"94":{"position":[[156,6]]},"99":{"position":[[332,8]]},"106":{"position":[[6,6]]},"109":{"position":[[48,8]]},"111":{"position":[[33,6]]},"113":{"position":[[139,6]]},"122":{"position":[[72,6]]},"124":{"position":[[85,6]]},"133":{"position":[[68,6]]},"135":{"position":[[51,8]]},"138":{"position":[[36,6]]},"140":{"position":[[36,5]]},"144":{"position":[[55,5]]},"147":{"position":[[199,5]]},"156":{"position":[[197,6]]},"158":{"position":[[178,5]]},"160":{"position":[[32,8]]},"162":{"position":[[457,6]]},"164":{"position":[[62,8]]},"166":{"position":[[115,6]]},"172":{"position":[[278,6]]},"173":{"position":[[507,6],[1818,6],[2356,6],[2798,8]]},"174":{"position":[[988,6],[1842,8],[3131,6]]},"177":{"position":[[78,6]]},"181":{"position":[[254,6]]},"183":{"position":[[153,6]]},"188":{"position":[[1823,5]]},"194":{"position":[[105,6]]},"202":{"position":[[73,6]]},"215":{"position":[[171,8]]},"230":{"position":[[167,8]]},"232":{"position":[[124,8]]},"237":{"position":[[41,8]]},"239":{"position":[[227,6]]},"267":{"position":[[728,8]]},"274":{"position":[[106,6]]},"275":{"position":[[91,6]]},"286":{"position":[[315,6]]},"289":{"position":[[1695,6]]},"292":{"position":[[77,8]]},"298":{"position":[[506,5],[613,5]]},"299":{"position":[[1644,5]]},"303":{"position":[[88,7]]},"323":{"position":[[82,8]]},"338":{"position":[[31,6]]},"351":{"position":[[193,8]]},"357":{"position":[[13,6]]},"360":{"position":[[828,8]]},"364":{"position":[[558,8]]},"369":{"position":[[245,6],[1332,6]]},"379":{"position":[[46,8]]},"383":{"position":[[65,8]]},"390":{"position":[[422,8]]},"391":{"position":[[177,8]]},"392":{"position":[[1213,6],[2401,6],[4877,6]]},"395":{"position":[[77,6],[214,8]]},"396":{"position":[[409,8],[1764,6]]},"398":{"position":[[2920,5]]},"408":{"position":[[977,6],[1658,6],[3497,6],[4106,5]]},"411":{"position":[[5212,5]]},"412":{"position":[[1847,5],[12527,6]]},"424":{"position":[[193,8]]},"433":{"position":[[554,6]]},"445":{"position":[[508,6],[1821,6]]},"452":{"position":[[299,6]]},"453":{"position":[[68,6]]},"454":{"position":[[46,6]]},"455":{"position":[[46,7]]},"459":{"position":[[125,6]]},"470":{"position":[[117,5]]},"481":{"position":[[514,8]]},"502":{"position":[[457,8]]},"514":{"position":[[319,8]]},"518":{"position":[[96,8]]},"541":{"position":[[51,8]]},"574":{"position":[[206,8]]},"602":{"position":[[143,6]]},"610":{"position":[[639,6]]},"611":{"position":[[422,8]]},"612":{"position":[[999,8]]},"613":{"position":[[302,8]]},"616":{"position":[[34,5],[1167,6]]},"617":{"position":[[22,5]]},"618":{"position":[[656,5]]},"636":{"position":[[84,6]]},"682":{"position":[[276,6]]},"687":{"position":[[47,6],[290,7]]},"696":{"position":[[1292,6],[1372,6]]},"701":{"position":[[172,7],[389,5],[823,7],[1035,7]]},"714":{"position":[[726,6]]},"723":{"position":[[2106,6]]},"749":{"position":[[2638,8],[2863,7],[5293,7],[6095,7],[8476,7],[8563,7],[16770,7],[18359,8],[18426,7],[19057,7],[21062,8]]},"759":{"position":[[1421,6]]},"801":{"position":[[618,5]]},"838":{"position":[[664,8]]},"849":{"position":[[20,6]]},"861":{"position":[[1417,5],[2449,5]]},"862":{"position":[[1663,6]]},"863":{"position":[[28,5],[329,5],[484,5]]},"872":{"position":[[2765,6]]},"881":{"position":[[60,7],[112,7]]},"898":{"position":[[4581,6]]},"903":{"position":[[155,6]]},"962":{"position":[[106,6]]},"966":{"position":[[487,7],[809,5]]},"968":{"position":[[777,5]]},"1009":{"position":[[304,7]]},"1065":{"position":[[593,7]]},"1067":{"position":[[950,7],[2223,5]]},"1068":{"position":[[4,5]]},"1079":{"position":[[105,7],[172,5]]},"1101":{"position":[[26,6]]},"1103":{"position":[[156,6]]},"1105":{"position":[[972,7]]},"1106":{"position":[[98,7],[401,5]]},"1110":{"position":[[24,7]]},"1112":{"position":[[560,5]]},"1124":{"position":[[171,6],[799,5],[1934,6]]},"1132":{"position":[[206,8],[621,8],[1408,8]]},"1140":{"position":[[138,6]]},"1150":{"position":[[103,8]]},"1198":{"position":[[1205,6],[1311,7],[1671,6],[1864,6]]},"1206":{"position":[[76,6]]},"1215":{"position":[[671,5]]},"1238":{"position":[[206,6]]},"1246":{"position":[[80,6],[424,6]]},"1271":{"position":[[165,6]]},"1276":{"position":[[106,6]]},"1287":{"position":[[125,7]]},"1297":{"position":[[25,5]]},"1317":{"position":[[236,7],[592,7]]}},"keywords":{}}],["allowslowcount",{"_index":5782,"title":{"1068":{"position":[[0,15]]}},"content":{"1067":{"position":[[2416,15]]},"1068":{"position":[[80,15]]}},"keywords":{}}],["allowslowcount=tru",{"_index":4170,"title":{},"content":{"749":{"position":[[2725,19]]},"1067":{"position":[[2301,19]]}},"keywords":{}}],["allstates.foreach(migrationst",{"_index":4477,"title":{},"content":{"753":{"position":[[336,32]]}},"keywords":{}}],["allstatesobserv",{"_index":4474,"title":{},"content":{"753":{"position":[[236,19]]}},"keywords":{}}],["allstatesobservable.subscribe(allst",{"_index":4476,"title":{},"content":{"753":{"position":[[288,39]]}},"keywords":{}}],["alltask",{"_index":3707,"title":{},"content":{"632":{"position":[[1863,10]]}},"keywords":{}}],["alon",{"_index":583,"title":{"44":{"position":[[67,5]]}},"content":{"37":{"position":[[352,5]]},"228":{"position":[[394,5]]}},"keywords":{}}],["along",{"_index":5164,"title":{},"content":{"889":{"position":[[298,5]]}},"keywords":{}}],["alongsid",{"_index":2236,"title":{},"content":{"392":{"position":[[1396,9]]},"397":{"position":[[39,9]]},"418":{"position":[[629,9]]},"1132":{"position":[[1484,9]]}},"keywords":{}}],["alphahero",{"_index":3427,"title":{},"content":{"562":{"position":[[591,12]]}},"keywords":{}}],["alreadi",{"_index":1204,"title":{"857":{"position":[[30,7]]}},"content":{"173":{"position":[[1667,7]]},"217":{"position":[[95,7]]},"350":{"position":[[312,7]]},"403":{"position":[[146,7]]},"411":{"position":[[2119,7],[2695,8]]},"463":{"position":[[1351,7]]},"626":{"position":[[533,8]]},"653":{"position":[[1168,7]]},"683":{"position":[[971,8]]},"686":{"position":[[11,7],[344,7],[466,7]]},"700":{"position":[[248,7]]},"702":{"position":[[272,7]]},"724":{"position":[[1313,7]]},"749":{"position":[[1435,7],[5030,7],[5627,7],[8778,8],[9336,7],[10731,7],[12216,7],[12420,7],[14306,7],[14585,7]]},"770":{"position":[[564,7]]},"778":{"position":[[583,7]]},"781":{"position":[[585,7]]},"785":{"position":[[475,7]]},"799":{"position":[[325,8]]},"856":{"position":[[218,8]]},"857":{"position":[[42,7]]},"943":{"position":[[140,7]]},"945":{"position":[[398,7]]},"990":{"position":[[170,7]]},"995":{"position":[[255,7],[900,7]]},"1008":{"position":[[230,7]]},"1014":{"position":[[102,7]]},"1088":{"position":[[162,7]]},"1124":{"position":[[2025,7]]},"1151":{"position":[[722,7]]},"1156":{"position":[[86,7]]},"1162":{"position":[[636,7]]},"1165":{"position":[[679,7]]},"1178":{"position":[[721,7]]},"1181":{"position":[[724,7]]},"1222":{"position":[[861,7]]},"1270":{"position":[[364,7]]},"1299":{"position":[[476,7]]},"1301":{"position":[[408,7]]}},"keywords":{}}],["alter",{"_index":3711,"title":{},"content":{"636":{"position":[[62,7]]},"898":{"position":[[1452,5]]}},"keywords":{}}],["altern",{"_index":179,"title":{"12":{"position":[[0,12]]},"13":{"position":[[0,12]]},"59":{"position":[[0,12]]},"199":{"position":[[38,11]]},"200":{"position":[[52,12]]},"246":{"position":[[21,11]]},"247":{"position":[[34,13]]},"256":{"position":[[41,12]]},"290":{"position":[[11,11]]},"546":{"position":[[0,12]]},"606":{"position":[[0,12]]},"688":{"position":[[5,12]]},"709":{"position":[[37,12]]}},"content":{"13":{"position":[[122,13],[320,12]]},"34":{"position":[[371,11],[691,11]]},"186":{"position":[[90,12]]},"219":{"position":[[31,11]]},"251":{"position":[[258,11]]},"255":{"position":[[1812,11]]},"263":{"position":[[42,11]]},"290":{"position":[[97,11]]},"412":{"position":[[1816,14],[12789,11]]},"429":{"position":[[114,11]]},"430":{"position":[[123,12]]},"432":{"position":[[108,12]]},"435":{"position":[[207,12]]},"437":{"position":[[231,11]]},"441":{"position":[[389,12]]},"546":{"position":[[57,11]]},"561":{"position":[[198,11]]},"606":{"position":[[57,11]]},"663":{"position":[[147,13]]},"688":{"position":[[132,11]]},"690":{"position":[[31,11]]},"712":{"position":[[166,12]]},"749":{"position":[[5845,11]]},"772":{"position":[[1084,11]]},"831":{"position":[[71,11]]},"834":{"position":[[172,13]]},"842":{"position":[[281,12]]},"1095":{"position":[[4,11]]},"1124":{"position":[[590,13]]},"1198":{"position":[[1326,12]]},"1277":{"position":[[649,11]]},"1294":{"position":[[130,11]]}},"keywords":{}}],["alternative"",{"_index":367,"title":{},"content":{"22":{"position":[[59,18]]},"243":{"position":[[247,17],[296,17]]},"244":{"position":[[16,17],[1311,17],[1468,17],[1682,17]]}},"keywords":{}}],["alternatives"",{"_index":1514,"title":{},"content":{"244":{"position":[[1228,18]]}},"keywords":{}}],["although",{"_index":633,"title":{},"content":{"40":{"position":[[143,8]]},"356":{"position":[[590,8]]},"624":{"position":[[1496,8]]},"839":{"position":[[1165,8]]},"1072":{"position":[[2019,8]]}},"keywords":{}}],["altogeth",{"_index":3115,"title":{},"content":{"478":{"position":[[298,11]]}},"keywords":{}}],["alway",{"_index":228,"title":{"97":{"position":[[21,6]]}},"content":{"14":{"position":[[842,6]]},"19":{"position":[[592,6]]},"97":{"position":[[61,6]]},"98":{"position":[[83,6]]},"143":{"position":[[367,6]]},"159":{"position":[[325,6]]},"173":{"position":[[2723,6],[2932,6]]},"182":{"position":[[298,6]]},"288":{"position":[[338,6]]},"289":{"position":[[1351,6]]},"300":{"position":[[752,6]]},"398":{"position":[[269,6]]},"408":{"position":[[2466,6]]},"412":{"position":[[4254,6]]},"481":{"position":[[128,6]]},"550":{"position":[[267,6]]},"602":{"position":[[498,6]]},"626":{"position":[[1149,6]]},"644":{"position":[[693,6]]},"688":{"position":[[1042,6]]},"698":{"position":[[745,6]]},"701":{"position":[[1085,6]]},"709":{"position":[[991,6]]},"710":{"position":[[1292,6]]},"723":{"position":[[1216,6]]},"736":{"position":[[134,6]]},"737":{"position":[[99,6],[294,6]]},"749":{"position":[[17903,6],[18024,6]]},"772":{"position":[[415,6]]},"779":{"position":[[279,6]]},"780":{"position":[[202,6]]},"781":{"position":[[851,6]]},"800":{"position":[[108,6],[344,6]]},"804":{"position":[[80,6]]},"808":{"position":[[340,6]]},"816":{"position":[[216,6]]},"898":{"position":[[223,6]]},"905":{"position":[[27,6],[91,6]]},"906":{"position":[[420,6]]},"965":{"position":[[323,6]]},"986":{"position":[[1177,6]]},"987":{"position":[[778,6]]},"988":{"position":[[1206,6]]},"1057":{"position":[[556,6]]},"1058":{"position":[[28,6],[138,6]]},"1065":{"position":[[1539,6],[1830,6]]},"1068":{"position":[[368,6]]},"1072":{"position":[[425,6]]},"1079":{"position":[[499,6]]},"1083":{"position":[[90,6]]},"1084":{"position":[[401,6]]},"1092":{"position":[[521,6]]},"1095":{"position":[[272,6]]},"1100":{"position":[[81,6]]},"1103":{"position":[[90,6]]},"1124":{"position":[[1131,6]]},"1175":{"position":[[485,6]]},"1192":{"position":[[37,6]]},"1208":{"position":[[1822,6]]},"1295":{"position":[[813,6]]},"1296":{"position":[[403,6]]},"1301":{"position":[[1310,6]]},"1305":{"position":[[365,6]]},"1309":{"position":[[989,6]]},"1318":{"position":[[40,6],[1134,6]]},"1321":{"position":[[623,6]]},"1322":{"position":[[347,6]]}},"keywords":{}}],["amazon",{"_index":2645,"title":{},"content":{"411":{"position":[[5646,7]]},"444":{"position":[[623,6]]},"779":{"position":[[30,7]]}},"keywords":{}}],["ambigu",{"_index":2810,"title":{},"content":{"419":{"position":[[1484,10]]}},"keywords":{}}],["amount",{"_index":694,"title":{"782":{"position":[[36,6]]}},"content":{"45":{"position":[[74,7]]},"58":{"position":[[267,6]]},"63":{"position":[[54,7]]},"66":{"position":[[448,6]]},"143":{"position":[[412,7],[519,6],[552,6],[704,6],[737,6],[764,7]]},"265":{"position":[[694,6]]},"298":{"position":[[434,6]]},"317":{"position":[[75,7]]},"398":{"position":[[3222,6],[3255,7],[3315,6]]},"402":{"position":[[1440,6]]},"408":{"position":[[2279,7]]},"424":{"position":[[103,7]]},"430":{"position":[[502,6]]},"451":{"position":[[327,7]]},"452":{"position":[[125,7]]},"477":{"position":[[280,6]]},"533":{"position":[[54,7]]},"559":{"position":[[1026,7]]},"560":{"position":[[246,7],[313,7]]},"566":{"position":[[694,7]]},"593":{"position":[[54,7]]},"617":{"position":[[1381,6],[1502,7],[1783,6]]},"653":{"position":[[568,6]]},"659":{"position":[[726,6]]},"696":{"position":[[289,6]]},"724":{"position":[[1068,6]]},"749":{"position":[[9262,6]]},"752":{"position":[[1193,6],[1251,6]]},"782":{"position":[[274,6],[332,6]]},"784":{"position":[[753,7]]},"821":{"position":[[648,6]]},"835":{"position":[[831,6]]},"838":{"position":[[1120,7]]},"846":{"position":[[653,6]]},"886":{"position":[[1460,6],[2868,6]]},"958":{"position":[[553,6]]},"1067":{"position":[[24,6],[576,6]]},"1134":{"position":[[595,6]]},"1157":{"position":[[302,7]]},"1192":{"position":[[507,7]]},"1222":{"position":[[577,6],[686,6]]},"1237":{"position":[[60,6]]},"1304":{"position":[[1477,6]]},"1311":{"position":[[1728,7]]}},"keywords":{}}],["amountinstock",{"_index":6548,"title":{},"content":{"1316":{"position":[[1105,13]]}},"keywords":{}}],["amp",{"_index":285,"title":{},"content":{"17":{"position":[[30,5]]},"261":{"position":[[668,5]]},"317":{"position":[[193,5]]},"410":{"position":[[13,5],[498,5]]},"412":{"position":[[8937,5]]},"710":{"position":[[1377,5]]},"860":{"position":[[888,5],[1066,5]]},"898":{"position":[[92,5],[1563,5]]},"902":{"position":[[362,5]]},"993":{"position":[[384,5]]},"1132":{"position":[[873,5]]},"1246":{"position":[[2011,5]]}},"keywords":{}}],["amp;&",{"_index":3280,"title":{},"content":{"523":{"position":[[762,10]]},"666":{"position":[[224,10]]},"670":{"position":[[529,10]]},"875":{"position":[[4737,10],[4799,10],[4839,10]]},"990":{"position":[[1255,10],[1293,10]]}},"keywords":{}}],["amp;limit=${batchs",{"_index":1358,"title":{},"content":{"209":{"position":[[1186,26]]}},"keywords":{}}],["ampl",{"_index":1696,"title":{},"content":{"295":{"position":[[303,5]]}},"keywords":{}}],["amplifi",{"_index":303,"title":{"18":{"position":[[4,8]]}},"content":{"18":{"position":[[7,7],[290,7],[406,7]]},"19":{"position":[[25,7],[265,7]]}},"keywords":{}}],["analyt",{"_index":306,"title":{},"content":{"18":{"position":[[176,10]]},"265":{"position":[[902,10]]},"267":{"position":[[851,9],[940,9],[1017,9],[1540,9]]},"353":{"position":[[526,9]]},"354":{"position":[[690,10]]},"375":{"position":[[494,9]]},"412":{"position":[[12719,11]]},"418":{"position":[[403,9]]},"446":{"position":[[993,9]]},"704":{"position":[[502,10]]}},"keywords":{}}],["analytics.legaci",{"_index":2026,"title":{},"content":{"354":{"position":[[904,16]]}},"keywords":{}}],["analyz",{"_index":6569,"title":{},"content":{"1318":{"position":[[543,7]]}},"keywords":{}}],["android",{"_index":567,"title":{},"content":{"36":{"position":[[44,7]]},"177":{"position":[[154,7]]},"269":{"position":[[291,8]]},"287":{"position":[[1163,7]]},"299":{"position":[[1018,7]]},"305":{"position":[[175,7]]},"371":{"position":[[136,7]]},"445":{"position":[[2260,7]]},"446":{"position":[[1371,8]]},"618":{"position":[[73,7]]},"640":{"position":[[356,8]]},"660":{"position":[[511,8]]},"1270":{"position":[[413,9]]},"1278":{"position":[[43,7]]},"1301":{"position":[[1003,7]]}},"keywords":{}}],["angular",{"_index":257,"title":{"44":{"position":[[28,7]]},"46":{"position":[[21,8]]},"48":{"position":[[15,8]]},"55":{"position":[[5,7]]},"56":{"position":[[0,7]]},"115":{"position":[[25,7]]},"116":{"position":[[0,7]]},"117":{"position":[[27,7]]},"126":{"position":[[15,7]]},"127":{"position":[[17,7]]},"128":{"position":[[22,7]]},"130":{"position":[[8,7]]},"142":{"position":[[33,7]]},"145":{"position":[[4,7]]},"286":{"position":[[33,8]]},"493":{"position":[[0,7]]},"673":{"position":[[11,8]]}},"content":{"15":{"position":[[319,8]]},"49":{"position":[[32,7]]},"50":{"position":[[66,7],[457,7]]},"51":{"position":[[960,7],[1045,7]]},"54":{"position":[[4,8]]},"55":{"position":[[1,7]]},"56":{"position":[[39,7],[151,7]]},"61":{"position":[[397,7]]},"94":{"position":[[100,8]]},"116":{"position":[[1,7],[188,7]]},"117":{"position":[[32,7]]},"118":{"position":[[272,7],[418,7]]},"125":{"position":[[87,7]]},"126":{"position":[[54,7]]},"127":{"position":[[107,7]]},"128":{"position":[[19,7],[238,7]]},"129":{"position":[[1,7],[255,8],[466,7],[563,8],[628,7]]},"130":{"position":[[1,7],[255,7]]},"132":{"position":[[29,7],[219,7]]},"133":{"position":[[75,7]]},"136":{"position":[[173,7]]},"137":{"position":[[84,7]]},"138":{"position":[[284,7]]},"140":{"position":[[316,7]]},"142":{"position":[[34,7]]},"143":{"position":[[189,7]]},"144":{"position":[[72,7]]},"145":{"position":[[103,7]]},"148":{"position":[[42,7],[190,7],[487,7]]},"149":{"position":[[445,7]]},"173":{"position":[[2298,8]]},"222":{"position":[[117,8]]},"286":{"position":[[190,8]]},"313":{"position":[[70,7]]},"323":{"position":[[676,7]]},"352":{"position":[[261,7]]},"511":{"position":[[468,7]]},"729":{"position":[[24,7]]},"742":{"position":[[9,7]]},"824":{"position":[[232,8]]},"825":{"position":[[1,7],[22,7],[37,7],[158,9],[523,7],[977,7],[1090,7],[1134,7]]},"910":{"position":[[315,7]]},"1118":{"position":[[213,7]]},"1176":{"position":[[462,8]]},"1202":{"position":[[24,7]]},"1268":{"position":[[309,7]]}},"keywords":{}}],["angular'",{"_index":748,"title":{},"content":{"50":{"position":[[42,9],[259,9]]},"55":{"position":[[156,9]]},"129":{"position":[[165,9]]},"143":{"position":[[1,9]]},"493":{"position":[[3,9]]}},"keywords":{}}],["angular/common",{"_index":4725,"title":{},"content":{"825":{"position":[[622,18]]}},"keywords":{}}],["angular/cor",{"_index":834,"title":{},"content":{"55":{"position":[[278,16],[833,16]]},"673":{"position":[[27,16]]},"825":{"position":[[203,16],[576,16]]}},"keywords":{}}],["angular/core/rxj",{"_index":835,"title":{},"content":{"55":{"position":[[320,19]]},"1118":{"position":[[440,19]]}},"keywords":{}}],["anim",{"_index":1916,"title":{},"content":{"320":{"position":[[266,11]]},"934":{"position":[[866,8]]}},"keywords":{}}],["announc",{"_index":2510,"title":{},"content":{"405":{"position":[[16,12]]},"471":{"position":[[10,12]]},"628":{"position":[[67,12]]}},"keywords":{}}],["anon",{"_index":5193,"title":{},"content":{"897":{"position":[[536,4]]},"898":{"position":[[2816,4]]}},"keywords":{}}],["anoth",{"_index":413,"title":{},"content":{"25":{"position":[[44,7]]},"262":{"position":[[556,7]]},"289":{"position":[[1060,7]]},"303":{"position":[[1050,7],[1205,7],[1362,7]]},"408":{"position":[[3448,7],[4213,7]]},"411":{"position":[[4541,7]]},"412":{"position":[[1624,7],[4038,7]]},"429":{"position":[[628,7]]},"433":{"position":[[1,7]]},"562":{"position":[[1700,7]]},"571":{"position":[[401,7],[448,7]]},"617":{"position":[[734,7]]},"636":{"position":[[187,8]]},"656":{"position":[[122,7]]},"696":{"position":[[734,7],[1737,7]]},"709":{"position":[[630,7]]},"749":{"position":[[4745,7],[5385,7],[8829,8],[15064,7]]},"772":{"position":[[1076,7]]},"775":{"position":[[95,7],[122,7]]},"785":{"position":[[604,7],[632,7]]},"839":{"position":[[12,7]]},"902":{"position":[[94,8]]},"956":{"position":[[158,7]]},"991":{"position":[[160,7]]},"995":{"position":[[240,7],[885,7]]},"1020":{"position":[[64,7]]},"1085":{"position":[[2837,7]]},"1089":{"position":[[1,7]]},"1090":{"position":[[1,7]]},"1195":{"position":[[223,7]]},"1198":{"position":[[664,7],[2108,7]]},"1219":{"position":[[170,7]]},"1230":{"position":[[272,7]]},"1231":{"position":[[171,7]]},"1246":{"position":[[811,7]]},"1296":{"position":[[1702,7]]},"1298":{"position":[[41,7]]},"1300":{"position":[[483,7]]},"1304":{"position":[[1009,7]]}},"keywords":{}}],["answer",{"_index":2175,"title":{},"content":{"387":{"position":[[312,9]]},"412":{"position":[[10298,6]]},"612":{"position":[[540,6]]},"703":{"position":[[1271,6]]},"705":{"position":[[402,6]]},"990":{"position":[[239,9]]},"1220":{"position":[[347,8],[541,6]]},"1249":{"position":[[75,6]]}},"keywords":{}}],["ant",{"_index":4657,"title":{},"content":{"799":{"position":[[219,3]]}},"keywords":{}}],["anticip",{"_index":1387,"title":{},"content":{"212":{"position":[[392,10]]}},"keywords":{}}],["any>>",{"_index":5475,"title":{},"content":{"988":{"position":[[5136,14]]}},"keywords":{}}],["any).embed",{"_index":2411,"title":{},"content":{"398":{"position":[[1548,15],[2701,15]]}},"keywords":{}}],["any).glob",{"_index":4072,"title":{},"content":{"729":{"position":[[342,11]]},"1202":{"position":[[381,11]]}},"keywords":{}}],["any).process",{"_index":4073,"title":{},"content":{"729":{"position":[[375,12]]},"1202":{"position":[[414,12]]}},"keywords":{}}],["anyfield",{"_index":4543,"title":{},"content":{"768":{"position":[[347,8]]}},"keywords":{}}],["anymor",{"_index":448,"title":{},"content":{"27":{"position":[[434,8]]},"28":{"position":[[579,8],[723,7]]},"837":{"position":[[657,8]]},"1026":{"position":[[184,8]]},"1313":{"position":[[428,7]]}},"keywords":{}}],["anyon",{"_index":6523,"title":{},"content":{"1313":{"position":[[631,6]]}},"keywords":{}}],["anyth",{"_index":2098,"title":{},"content":{"362":{"position":[[633,8]]},"454":{"position":[[1054,8]]},"625":{"position":[[90,8]]},"659":{"position":[[957,8]]},"668":{"position":[[189,9]]},"699":{"position":[[508,8],[587,8]]},"752":{"position":[[553,8]]},"772":{"position":[[1279,8]]},"806":{"position":[[644,8]]},"835":{"position":[[1021,8]]},"838":{"position":[[787,8]]},"886":{"position":[[4436,8]]},"981":{"position":[[756,8]]},"985":{"position":[[312,8]]},"1088":{"position":[[655,9]]},"1257":{"position":[[129,8]]},"1313":{"position":[[559,8]]},"1321":{"position":[[294,9]]}},"keywords":{}}],["anyvalu",{"_index":4545,"title":{},"content":{"768":{"position":[[391,11]]}},"keywords":{}}],["anyway",{"_index":345,"title":{},"content":{"19":{"position":[[1086,7]]},"614":{"position":[[890,6]]},"616":{"position":[[362,7]]},"626":{"position":[[243,7]]},"740":{"position":[[315,8]]},"1126":{"position":[[872,6]]},"1164":{"position":[[444,6]]}},"keywords":{}}],["apach",{"_index":376,"title":{},"content":{"23":{"position":[[3,6]]},"837":{"position":[[70,6]]}},"keywords":{}}],["apart",{"_index":1881,"title":{},"content":{"310":{"position":[[317,5]]}},"keywords":{}}],["api",{"_index":308,"title":{"424":{"position":[[25,5]]},"431":{"position":[[40,3]]},"433":{"position":[[12,3]]},"449":{"position":[[22,4]]},"601":{"position":[[46,4]]},"613":{"position":[[25,5]]},"659":{"position":[[12,4]]},"718":{"position":[[17,4]]},"911":{"position":[[34,3]]},"1145":{"position":[[40,3]]},"1159":{"position":[[25,3]]},"1208":{"position":[[13,3]]},"1215":{"position":[[38,3]]}},"content":{"18":{"position":[[194,4]]},"24":{"position":[[80,4],[807,4]]},"27":{"position":[[207,4]]},"33":{"position":[[76,3]]},"35":{"position":[[103,4]]},"45":{"position":[[37,3],[270,3]]},"47":{"position":[[155,4],[310,4],[445,4],[714,4]]},"100":{"position":[[254,4]]},"120":{"position":[[243,3]]},"126":{"position":[[280,3]]},"128":{"position":[[278,3]]},"131":{"position":[[154,3],[437,3],[499,3],[673,3]]},"139":{"position":[[79,4]]},"155":{"position":[[105,3]]},"181":{"position":[[103,4],[143,3]]},"209":{"position":[[705,5]]},"222":{"position":[[191,4]]},"227":{"position":[[228,4]]},"245":{"position":[[71,3]]},"249":{"position":[[266,3]]},"255":{"position":[[1057,5]]},"291":{"position":[[492,3]]},"300":{"position":[[102,4]]},"303":{"position":[[248,4]]},"320":{"position":[[26,3]]},"336":{"position":[[282,3]]},"366":{"position":[[526,3]]},"381":{"position":[[458,5]]},"387":{"position":[[47,5]]},"392":{"position":[[5069,4]]},"408":{"position":[[1499,4],[1528,3],[1598,4],[3822,4],[4096,4]]},"411":{"position":[[1104,3]]},"424":{"position":[[18,3],[372,3]]},"425":{"position":[[113,3]]},"427":{"position":[[131,4],[218,4]]},"429":{"position":[[58,3]]},"433":{"position":[[52,5],[63,3],[298,3],[532,4],[598,3]]},"434":{"position":[[231,4]]},"435":{"position":[[132,3]]},"437":{"position":[[47,3]]},"438":{"position":[[291,3]]},"439":{"position":[[74,4],[291,3],[375,3],[558,3],[655,3]]},"440":{"position":[[56,3],[245,4]]},"441":{"position":[[493,4]]},"449":{"position":[[51,5]]},"450":{"position":[[808,4]]},"451":{"position":[[18,3],[121,3],[530,3],[736,4]]},"452":{"position":[[103,3],[168,3]]},"453":{"position":[[59,3]]},"454":{"position":[[627,5],[820,3],[946,5]]},"455":{"position":[[18,3],[381,3]]},"456":{"position":[[45,5]]},"457":{"position":[[427,4],[588,3]]},"458":{"position":[[482,4],[636,3],[925,3],[1091,3],[1364,3]]},"460":{"position":[[312,3],[444,3],[1003,5]]},"463":{"position":[[37,4],[230,4]]},"466":{"position":[[353,3]]},"504":{"position":[[150,3]]},"514":{"position":[[174,3]]},"521":{"position":[[91,3]]},"524":{"position":[[924,4]]},"533":{"position":[[26,3]]},"535":{"position":[[48,3],[134,4],[388,4],[709,4],[754,3]]},"546":{"position":[[144,3]]},"551":{"position":[[476,3]]},"554":{"position":[[188,3]]},"556":{"position":[[1157,4]]},"559":{"position":[[36,3]]},"560":{"position":[[220,3]]},"566":{"position":[[304,3]]},"567":{"position":[[920,3]]},"580":{"position":[[256,4]]},"581":{"position":[[288,3],[580,4]]},"590":{"position":[[247,3],[477,3]]},"593":{"position":[[26,3]]},"595":{"position":[[48,3],[134,4],[416,4],[730,4],[775,3]]},"606":{"position":[[144,3]]},"611":{"position":[[942,3]]},"612":{"position":[[932,3]]},"613":{"position":[[32,3],[949,3]]},"614":{"position":[[68,3]]},"616":{"position":[[751,4],[1037,4]]},"617":{"position":[[1667,4]]},"656":{"position":[[427,3]]},"659":{"position":[[43,3],[360,3],[696,3],[936,3]]},"660":{"position":[[45,4]]},"697":{"position":[[66,5]]},"703":{"position":[[267,3]]},"709":{"position":[[114,4],[914,4],[1213,4]]},"717":{"position":[[227,3],[398,3]]},"736":{"position":[[201,3],[500,3]]},"830":{"position":[[143,5]]},"835":{"position":[[98,4]]},"837":{"position":[[59,3]]},"839":{"position":[[356,4]]},"860":{"position":[[150,5]]},"873":{"position":[[129,3]]},"882":{"position":[[99,4],[144,3]]},"899":{"position":[[13,3]]},"904":{"position":[[482,3],[2884,4],[3033,4]]},"911":{"position":[[60,5],[453,3]]},"917":{"position":[[438,3]]},"932":{"position":[[573,4],[630,3]]},"968":{"position":[[137,3]]},"1124":{"position":[[1248,3]]},"1132":{"position":[[100,4]]},"1134":{"position":[[232,3],[367,3]]},"1139":{"position":[[26,4]]},"1140":{"position":[[21,3]]},"1143":{"position":[[638,3]]},"1145":{"position":[[26,4]]},"1149":{"position":[[377,5]]},"1159":{"position":[[24,3]]},"1177":{"position":[[221,4]]},"1204":{"position":[[222,4]]},"1206":{"position":[[67,3]]},"1207":{"position":[[60,3],[320,3],[642,4]]},"1208":{"position":[[10,3],[380,3],[1975,3]]},"1209":{"position":[[40,3]]},"1211":{"position":[[55,3]]},"1214":{"position":[[41,3],[272,3],[361,3],[742,4],[1048,4]]},"1215":{"position":[[83,3],[154,3],[303,4]]},"1216":{"position":[[25,3]]},"1232":{"position":[[18,3]]},"1242":{"position":[[82,4]]},"1244":{"position":[[55,4]]},"1272":{"position":[[43,4]]},"1274":{"position":[[495,4]]},"1278":{"position":[[691,4]]},"1279":{"position":[[882,4]]},"1282":{"position":[[50,3]]},"1292":{"position":[[248,3]]},"1301":{"position":[[917,3],[1163,3]]},"1320":{"position":[[100,5]]}},"keywords":{}}],["api"",{"_index":2958,"title":{},"content":{"452":{"position":[[58,9]]}},"keywords":{}}],["api.avoid",{"_index":1386,"title":{},"content":{"212":{"position":[[359,9]]}},"keywords":{}}],["api.indexeddb",{"_index":1181,"title":{},"content":{"162":{"position":[[219,13]]},"524":{"position":[[277,13]]},"581":{"position":[[186,13]]}},"keywords":{}}],["api/voxels/pull?chunkid=${chunkid}&cp=${checkpoint}&limit=${limit",{"_index":5570,"title":{},"content":{"1007":{"position":[[1530,77]]}},"keywords":{}}],["api/voxels/pull?chunkid=123",{"_index":5560,"title":{},"content":{"1007":{"position":[[554,29]]}},"keywords":{}}],["api/voxels/push?chunkid=123",{"_index":5561,"title":{},"content":{"1007":{"position":[[624,30]]}},"keywords":{}}],["apiduckdb",{"_index":6469,"title":{},"content":{"1299":{"position":[[576,9]]}},"keywords":{}}],["apiin",{"_index":3970,"title":{},"content":{"703":{"position":[[493,5]]}},"keywords":{}}],["apivers",{"_index":4565,"title":{},"content":{"772":{"position":[[844,11]]},"774":{"position":[[772,11]]},"1133":{"position":[[568,10]]},"1134":{"position":[[413,11]]}},"keywords":{}}],["apollo",{"_index":578,"title":{"37":{"position":[[0,7]]}},"content":{"37":{"position":[[5,6]]}},"keywords":{}}],["apolog",{"_index":6090,"title":{},"content":{"1151":{"position":[[333,9]]},"1178":{"position":[[332,9]]}},"keywords":{}}],["app",{"_index":264,"title":{"44":{"position":[[36,5]]},"128":{"position":[[30,4]]},"204":{"position":[[36,5]]},"268":{"position":[[44,4]]},"269":{"position":[[22,6]]},"270":{"position":[[38,4]]},"271":{"position":[[53,5]]},"284":{"position":[[30,4]]},"348":{"position":[[50,3]]},"359":{"position":[[45,5]]},"409":{"position":[[39,4]]},"446":{"position":[[29,3]]},"488":{"position":[[23,4]]},"495":{"position":[[27,5]]},"499":{"position":[[39,4]]},"500":{"position":[[26,4]]},"503":{"position":[[32,4]]},"532":{"position":[[28,4]]},"558":{"position":[[62,4]]},"592":{"position":[[26,4]]},"618":{"position":[[40,5]]},"629":{"position":[[25,4]]},"631":{"position":[[43,5]]},"783":{"position":[[7,4]]},"980":{"position":[[44,4]]},"1282":{"position":[[39,5]]}},"content":{"15":{"position":[[506,3]]},"18":{"position":[[436,3]]},"38":{"position":[[98,5]]},"46":{"position":[[36,3]]},"51":{"position":[[349,5]]},"59":{"position":[[219,3]]},"112":{"position":[[131,4]]},"148":{"position":[[351,5]]},"151":{"position":[[373,4]]},"172":{"position":[[204,4]]},"174":{"position":[[2737,4]]},"178":{"position":[[170,3],[428,4]]},"201":{"position":[[228,3]]},"204":{"position":[[196,3]]},"207":{"position":[[113,3]]},"215":{"position":[[336,4]]},"239":{"position":[[168,4]]},"244":{"position":[[849,3]]},"251":{"position":[[226,5]]},"253":{"position":[[81,3],[168,3]]},"254":{"position":[[103,3],[178,4]]},"262":{"position":[[54,3]]},"269":{"position":[[29,4],[112,3],[319,4]]},"270":{"position":[[88,5],[100,4]]},"271":{"position":[[91,5],[322,5]]},"273":{"position":[[261,3]]},"274":{"position":[[118,3]]},"277":{"position":[[265,3]]},"278":{"position":[[258,3]]},"280":{"position":[[225,3],[468,4]]},"284":{"position":[[43,3]]},"285":{"position":[[363,4]]},"286":{"position":[[174,3]]},"287":{"position":[[1281,5]]},"289":{"position":[[1190,3]]},"292":{"position":[[376,3]]},"294":{"position":[[220,3],[272,3]]},"300":{"position":[[22,3],[808,3]]},"301":{"position":[[703,3]]},"302":{"position":[[44,3],[566,4]]},"303":{"position":[[29,3]]},"309":{"position":[[174,3]]},"312":{"position":[[98,3]]},"314":{"position":[[1111,3]]},"330":{"position":[[21,3]]},"346":{"position":[[579,3]]},"354":{"position":[[817,3]]},"359":{"position":[[106,5]]},"360":{"position":[[529,3]]},"365":{"position":[[125,3],[507,3]]},"371":{"position":[[12,3],[316,5]]},"375":{"position":[[88,4],[179,4],[906,4],[937,3]]},"380":{"position":[[336,5]]},"384":{"position":[[264,3],[321,4]]},"388":{"position":[[440,3]]},"392":{"position":[[2094,3],[2256,3]]},"393":{"position":[[670,4]]},"399":{"position":[[120,4],[385,3]]},"403":{"position":[[244,3]]},"407":{"position":[[402,3],[538,4]]},"408":{"position":[[231,4],[1282,4],[1438,4],[1669,4],[3423,3]]},"409":{"position":[[210,4],[285,3]]},"410":{"position":[[161,4],[662,3],[1031,3],[1186,3],[1319,3],[1352,3],[1472,5],[1602,4]]},"411":{"position":[[845,5],[2093,4],[3094,4],[4049,3],[4483,4],[4829,3],[4915,4],[5511,4]]},"412":{"position":[[1522,4],[4154,3],[4213,5],[6159,3],[6338,4],[7136,3],[8239,3],[8405,3],[8482,4],[8778,4],[8953,3],[8977,3],[9414,3],[9607,3],[10099,4],[10165,3],[11036,3],[11111,4],[11189,4],[11412,3],[11475,3],[11883,3],[12095,5],[14064,3],[14709,3],[15411,4]]},"414":{"position":[[14,4],[269,4]]},"416":{"position":[[428,3]]},"418":{"position":[[123,4],[526,4],[839,3]]},"419":{"position":[[42,4],[239,4]]},"420":{"position":[[106,4],[1376,5],[1434,5]]},"421":{"position":[[314,4],[538,5],[968,4]]},"445":{"position":[[385,3],[1679,3],[1742,3],[2115,3]]},"446":{"position":[[141,4],[955,4],[1121,3]]},"447":{"position":[[205,3],[318,5],[620,3]]},"454":{"position":[[378,4]]},"458":{"position":[[38,3],[121,3]]},"460":{"position":[[135,3]]},"463":{"position":[[170,3]]},"468":{"position":[[597,3],[667,4]]},"476":{"position":[[1,4]]},"477":{"position":[[18,4]]},"478":{"position":[[9,4]]},"479":{"position":[[346,4]]},"483":{"position":[[52,3]]},"486":{"position":[[236,5]]},"489":{"position":[[645,3]]},"496":{"position":[[399,4]]},"497":{"position":[[46,5]]},"500":{"position":[[17,4],[110,3],[239,5],[439,3]]},"503":{"position":[[41,4]]},"510":{"position":[[80,4]]},"511":{"position":[[461,3]]},"524":{"position":[[1027,4]]},"535":{"position":[[331,3]]},"538":{"position":[[253,4],[650,5]]},"556":{"position":[[1613,3]]},"559":{"position":[[1600,3]]},"562":{"position":[[1029,5],[1647,3]]},"567":{"position":[[1027,5]]},"582":{"position":[[81,3]]},"584":{"position":[[237,4]]},"590":{"position":[[846,5]]},"595":{"position":[[344,3],[843,3]]},"598":{"position":[[252,4],[657,5]]},"612":{"position":[[1742,4],[1785,3]]},"617":{"position":[[1816,4],[1907,3]]},"627":{"position":[[227,3]]},"630":{"position":[[661,4]]},"632":{"position":[[2759,3]]},"636":{"position":[[12,4],[342,3]]},"660":{"position":[[17,4]]},"661":{"position":[[622,5],[1488,4]]},"662":{"position":[[82,5],[494,4],[1167,4],[1328,4]]},"690":{"position":[[253,3]]},"699":{"position":[[670,4]]},"700":{"position":[[18,3],[214,4],[829,3]]},"701":{"position":[[21,3]]},"702":{"position":[[23,4]]},"703":{"position":[[43,4],[1300,4]]},"704":{"position":[[196,4],[482,3]]},"709":{"position":[[314,4]]},"710":{"position":[[161,4]]},"715":{"position":[[241,3],[329,3]]},"716":{"position":[[382,3]]},"723":{"position":[[1462,3],[1752,3],[1902,3]]},"778":{"position":[[311,5]]},"783":{"position":[[340,5],[377,5]]},"784":{"position":[[365,5],[849,4]]},"785":{"position":[[213,4],[448,5]]},"800":{"position":[[8,3]]},"825":{"position":[[707,4]]},"829":{"position":[[1398,3],[1863,4]]},"836":{"position":[[1166,5],[1911,3]]},"838":{"position":[[678,3]]},"854":{"position":[[238,3]]},"860":{"position":[[1220,4]]},"871":{"position":[[718,4]]},"873":{"position":[[93,4]]},"875":{"position":[[1116,3],[1237,3]]},"897":{"position":[[464,5]]},"898":{"position":[[2787,4]]},"901":{"position":[[104,4]]},"902":{"position":[[698,4]]},"904":{"position":[[98,3],[2142,4],[2205,4]]},"964":{"position":[[467,4],[482,3],[514,3]]},"981":{"position":[[1303,5]]},"988":{"position":[[403,3]]},"995":{"position":[[597,3],[1050,3],[1177,3],[1360,3]]},"1009":{"position":[[733,4],[923,3]]},"1102":{"position":[[153,4]]},"1126":{"position":[[70,4]]},"1174":{"position":[[48,3]]},"1183":{"position":[[216,3],[480,4]]},"1214":{"position":[[958,3]]},"1237":{"position":[[30,3]]},"1270":{"position":[[267,4],[449,4]]},"1301":{"position":[[61,4],[97,3]]},"1316":{"position":[[21,4],[387,4]]},"1322":{"position":[[12,4]]}},"keywords":{}}],["app"",{"_index":1489,"title":{},"content":{"244":{"position":[[406,9],[1044,9],[1078,9]]}},"keywords":{}}],["app'",{"_index":1632,"title":{},"content":{"273":{"position":[[103,5]]},"275":{"position":[[103,5]]},"276":{"position":[[76,5],[348,5]]},"277":{"position":[[117,5]]},"279":{"position":[[491,5]]},"282":{"position":[[374,5]]},"285":{"position":[[267,5]]},"287":{"position":[[262,5]]},"291":{"position":[[87,5]]},"292":{"position":[[249,5]]},"1072":{"position":[[1159,5]]}},"keywords":{}}],["app.component.t",{"_index":753,"title":{},"content":{"50":{"position":[[184,16]]},"129":{"position":[[681,16]]}},"keywords":{}}],["app.get('/ev",{"_index":3596,"title":{},"content":{"612":{"position":[[1841,18]]}},"keywords":{}}],["app.get('/list",{"_index":4659,"title":{},"content":{"799":{"position":[[520,16],[752,16]]}},"keywords":{}}],["app.get('/pul",{"_index":4990,"title":{},"content":{"875":{"position":[[2070,16]]}},"keywords":{}}],["app.get('/pullstream",{"_index":5042,"title":{},"content":{"875":{"position":[[7221,22]]}},"keywords":{}}],["app.get('/push",{"_index":5018,"title":{},"content":{"875":{"position":[[4438,16]]}},"keywords":{}}],["app.listen(80",{"_index":4986,"title":{},"content":{"875":{"position":[[1190,14]]}},"keywords":{}}],["app.listen(port",{"_index":3614,"title":{},"content":{"612":{"position":[[2480,16]]}},"keywords":{}}],["app.on('readi",{"_index":3930,"title":{},"content":{"693":{"position":[[853,15]]}},"keywords":{}}],["app.th",{"_index":2844,"title":{},"content":{"420":{"position":[[1305,7]]}},"keywords":{}}],["app.use(express.json",{"_index":4985,"title":{},"content":{"875":{"position":[[1133,24]]}},"keywords":{}}],["appa",{"_index":3211,"title":{},"content":{"498":{"position":[[247,4]]}},"keywords":{}}],["appeal",{"_index":1233,"title":{},"content":{"177":{"position":[[302,9]]},"362":{"position":[[135,9]]},"387":{"position":[[421,9]]},"407":{"position":[[801,9]]}},"keywords":{}}],["appear",{"_index":3560,"title":{},"content":{"610":{"position":[[1168,6]]},"624":{"position":[[361,6]]},"751":{"position":[[1891,6]]},"847":{"position":[[16,6]]},"988":{"position":[[2746,8]]},"1300":{"position":[[743,8]]},"1307":{"position":[[338,7],[438,8]]},"1308":{"position":[[24,7]]},"1316":{"position":[[2890,6]]}},"keywords":{}}],["append",{"_index":1946,"title":{},"content":{"335":{"position":[[365,6]]},"464":{"position":[[1052,6]]},"698":{"position":[[2644,6]]},"1065":{"position":[[1546,6],[1837,6]]},"1079":{"position":[[506,6]]}},"keywords":{}}],["appl",{"_index":3940,"title":{},"content":{"697":{"position":[[116,5]]}},"keywords":{}}],["appli",{"_index":1192,"title":{},"content":{"169":{"position":[[86,8]]},"299":{"position":[[1155,8]]},"347":{"position":[[533,5]]},"362":{"position":[[1604,5]]},"409":{"position":[[148,7]]},"591":{"position":[[762,5]]},"636":{"position":[[326,7]]},"681":{"position":[[505,7]]},"682":{"position":[[35,7]]},"698":{"position":[[993,7]]},"818":{"position":[[372,5]]},"832":{"position":[[343,7]]},"886":{"position":[[4428,7]]},"937":{"position":[[93,7]]},"1009":{"position":[[66,7]]},"1140":{"position":[[224,8]]},"1301":{"position":[[1204,5]]},"1307":{"position":[[854,8]]},"1317":{"position":[[283,7]]}},"keywords":{}}],["applic",{"_index":182,"title":{"12":{"position":[[51,12]]},"76":{"position":[[45,13]]},"90":{"position":[[19,12]]},"93":{"position":[[15,11]]},"107":{"position":[[45,13]]},"115":{"position":[[33,11]]},"116":{"position":[[12,13]]},"117":{"position":[[35,13]]},"127":{"position":[[25,12]]},"142":{"position":[[41,13]]},"150":{"position":[[36,12]]},"151":{"position":[[16,12]]},"152":{"position":[[35,13]]},"173":{"position":[[24,13]]},"174":{"position":[[47,13]]},"176":{"position":[[32,11]]},"177":{"position":[[27,13]]},"178":{"position":[[35,13]]},"187":{"position":[[24,12]]},"213":{"position":[[70,12]]},"217":{"position":[[18,11]]},"221":{"position":[[18,12]]},"225":{"position":[[61,12]]},"230":{"position":[[45,13]]},"264":{"position":[[55,12]]},"278":{"position":[[42,12]]},"319":{"position":[[31,11]]},"320":{"position":[[11,13]]},"321":{"position":[[34,13]]},"332":{"position":[[23,12]]},"346":{"position":[[40,13]]},"368":{"position":[[32,13]]},"374":{"position":[[80,12]]},"378":{"position":[[37,13]]},"423":{"position":[[29,13]]},"443":{"position":[[46,12]]},"512":{"position":[[29,12]]},"522":{"position":[[22,12]]},"571":{"position":[[24,13]]},"573":{"position":[[28,11]]},"574":{"position":[[8,12]]},"1009":{"position":[[39,12]]},"1312":{"position":[[7,12]]}},"content":{"14":{"position":[[74,13]]},"15":{"position":[[81,13]]},"17":{"position":[[229,11]]},"18":{"position":[[90,13]]},"25":{"position":[[94,13]]},"26":{"position":[[294,13]]},"34":{"position":[[741,13]]},"37":{"position":[[77,12],[377,11]]},"38":{"position":[[577,11]]},"46":{"position":[[180,11]]},"47":{"position":[[366,11]]},"49":{"position":[[40,11]]},"56":{"position":[[47,11]]},"61":{"position":[[405,13]]},"64":{"position":[[208,13]]},"65":{"position":[[252,11],[631,12],[759,13],[787,13],[902,11],[1218,12],[1281,11],[1405,12],[1445,11],[1568,12],[2066,12]]},"66":{"position":[[530,12]]},"67":{"position":[[112,12]]},"68":{"position":[[156,13]]},"69":{"position":[[114,13]]},"70":{"position":[[157,13]]},"72":{"position":[[139,11]]},"73":{"position":[[152,13]]},"76":{"position":[[56,13]]},"80":{"position":[[5,12]]},"83":{"position":[[182,12],[411,12]]},"87":{"position":[[172,11]]},"88":{"position":[[147,12]]},"89":{"position":[[106,12],[277,13]]},"90":{"position":[[51,12]]},"91":{"position":[[279,12]]},"92":{"position":[[232,12]]},"93":{"position":[[49,11],[136,11]]},"98":{"position":[[127,13]]},"99":{"position":[[345,11]]},"100":{"position":[[55,13],[136,13]]},"101":{"position":[[95,13]]},"102":{"position":[[131,13]]},"105":{"position":[[166,12]]},"107":{"position":[[64,13]]},"109":{"position":[[34,13],[141,12],[202,11]]},"110":{"position":[[206,11]]},"114":{"position":[[555,13],[676,12]]},"116":{"position":[[123,12],[287,13]]},"117":{"position":[[40,12],[205,11]]},"118":{"position":[[280,12]]},"122":{"position":[[92,12],[311,12]]},"123":{"position":[[163,11]]},"125":{"position":[[95,11]]},"126":{"position":[[62,13],[318,12]]},"127":{"position":[[115,12]]},"128":{"position":[[27,12],[246,11]]},"132":{"position":[[37,11],[227,11]]},"133":{"position":[[83,12],[305,12]]},"136":{"position":[[181,12]]},"137":{"position":[[92,12]]},"138":{"position":[[292,12]]},"140":{"position":[[324,12]]},"142":{"position":[[42,12]]},"145":{"position":[[301,12]]},"146":{"position":[[267,11]]},"148":{"position":[[50,13],[198,12],[253,12],[373,13],[406,13]]},"151":{"position":[[94,12],[151,11],[388,12],[461,13]]},"152":{"position":[[8,12],[227,13]]},"153":{"position":[[114,13],[297,12]]},"156":{"position":[[224,12]]},"157":{"position":[[51,12],[313,11]]},"158":{"position":[[184,12]]},"159":{"position":[[312,12]]},"160":{"position":[[41,12]]},"161":{"position":[[44,13],[383,13]]},"164":{"position":[[71,12],[162,12]]},"165":{"position":[[417,13]]},"166":{"position":[[327,13]]},"167":{"position":[[353,13]]},"168":{"position":[[139,12]]},"169":{"position":[[255,12]]},"170":{"position":[[68,13],[156,13],[305,12],[564,12]]},"172":{"position":[[100,12]]},"173":{"position":[[22,13],[109,12],[862,12],[946,12],[1456,11],[1520,11],[1625,11],[1850,11],[2887,11],[3235,12]]},"174":{"position":[[101,13],[1245,13],[1328,13],[1876,11],[2228,12]]},"175":{"position":[[481,13],[711,13]]},"177":{"position":[[129,12],[327,13]]},"178":{"position":[[40,12],[334,11]]},"179":{"position":[[250,13],[436,12]]},"180":{"position":[[53,12]]},"183":{"position":[[78,12]]},"184":{"position":[[63,13]]},"186":{"position":[[47,13],[411,13]]},"187":{"position":[[100,12]]},"188":{"position":[[82,12],[2027,12]]},"189":{"position":[[736,12]]},"192":{"position":[[398,13]]},"198":{"position":[[67,13],[256,13],[408,12],[529,11]]},"201":{"position":[[134,11]]},"203":{"position":[[293,11]]},"204":{"position":[[319,12]]},"206":{"position":[[221,11]]},"207":{"position":[[207,12]]},"215":{"position":[[124,12],[208,11],[316,12]]},"216":{"position":[[109,12],[269,12]]},"217":{"position":[[52,11],[188,12],[323,12]]},"219":{"position":[[168,11],[375,12]]},"220":{"position":[[257,12]]},"221":{"position":[[10,12],[167,12]]},"224":{"position":[[295,12]]},"225":{"position":[[175,13]]},"226":{"position":[[224,12]]},"227":{"position":[[149,13]]},"228":{"position":[[110,12]]},"229":{"position":[[213,13]]},"230":{"position":[[47,13]]},"231":{"position":[[274,13]]},"232":{"position":[[66,13]]},"234":{"position":[[283,13]]},"239":{"position":[[116,12]]},"241":{"position":[[72,13],[473,12]]},"248":{"position":[[35,11],[129,11]]},"254":{"position":[[143,12],[530,11]]},"265":{"position":[[332,12],[866,12]]},"266":{"position":[[196,12],[525,13],[1106,13]]},"267":{"position":[[63,13],[115,12],[271,12],[1219,12],[1481,13]]},"269":{"position":[[154,13]]},"270":{"position":[[58,12]]},"271":{"position":[[231,13]]},"274":{"position":[[71,13]]},"278":{"position":[[76,13]]},"280":{"position":[[45,12]]},"282":{"position":[[43,11]]},"287":{"position":[[830,12],[1131,13]]},"288":{"position":[[82,11]]},"289":{"position":[[356,11],[1318,12],[1483,12]]},"290":{"position":[[56,13]]},"291":{"position":[[358,12]]},"292":{"position":[[91,11]]},"293":{"position":[[52,11]]},"309":{"position":[[52,13]]},"320":{"position":[[287,12]]},"321":{"position":[[28,12]]},"323":{"position":[[187,11],[561,11]]},"325":{"position":[[230,13]]},"326":{"position":[[131,12]]},"327":{"position":[[101,11]]},"338":{"position":[[50,11]]},"343":{"position":[[88,11]]},"350":{"position":[[299,12]]},"353":{"position":[[20,12],[225,12],[602,11]]},"354":{"position":[[117,13]]},"358":{"position":[[257,11]]},"362":{"position":[[182,12]]},"365":{"position":[[45,12],[184,12],[349,11],[558,12],[674,12],[716,11],[808,13],[956,13],[1129,12],[1146,12]]},"366":{"position":[[299,11]]},"367":{"position":[[51,12]]},"368":{"position":[[59,13]]},"369":{"position":[[455,11],[539,11],[790,12]]},"370":{"position":[[101,13]]},"371":{"position":[[151,13]]},"373":{"position":[[72,13],[488,12]]},"375":{"position":[[435,12],[576,12]]},"376":{"position":[[77,12],[535,12]]},"378":{"position":[[110,13]]},"379":{"position":[[226,11]]},"382":{"position":[[230,11]]},"383":{"position":[[248,12],[463,11]]},"384":{"position":[[393,11]]},"385":{"position":[[237,12]]},"386":{"position":[[93,12]]},"388":{"position":[[373,13]]},"390":{"position":[[1191,13]]},"393":{"position":[[425,12]]},"396":{"position":[[1488,13]]},"408":{"position":[[747,11]]},"410":{"position":[[1894,11]]},"412":{"position":[[6021,12]]},"419":{"position":[[833,12]]},"422":{"position":[[433,11]]},"427":{"position":[[337,11],[1054,12]]},"430":{"position":[[196,11],[871,12],[953,11]]},"432":{"position":[[1194,12]]},"434":{"position":[[416,13]]},"435":{"position":[[338,12]]},"437":{"position":[[280,13]]},"441":{"position":[[208,11],[686,13]]},"444":{"position":[[109,13]]},"445":{"position":[[342,13],[522,12],[916,12],[2211,12]]},"446":{"position":[[15,13],[57,12],[174,12],[452,12],[776,13],[861,12],[1100,13],[1236,13]]},"447":{"position":[[83,13],[455,12],[708,13]]},"453":{"position":[[79,12],[172,12],[623,11]]},"457":{"position":[[30,12]]},"462":{"position":[[257,11]]},"473":{"position":[[159,11]]},"474":{"position":[[1,12]]},"486":{"position":[[282,11]]},"489":{"position":[[67,11]]},"491":{"position":[[54,12]]},"500":{"position":[[345,13]]},"501":{"position":[[161,13]]},"502":{"position":[[92,13],[1353,12]]},"506":{"position":[[158,12]]},"510":{"position":[[39,11]]},"513":{"position":[[112,13]]},"516":{"position":[[51,12],[185,11]]},"517":{"position":[[45,12]]},"519":{"position":[[5,12],[324,11]]},"520":{"position":[[46,13]]},"521":{"position":[[562,13]]},"522":{"position":[[46,11]]},"528":{"position":[[170,12]]},"530":{"position":[[23,11],[476,12],[681,13]]},"533":{"position":[[325,13]]},"534":{"position":[[21,13],[231,11]]},"535":{"position":[[94,11]]},"540":{"position":[[74,13]]},"542":{"position":[[86,13]]},"543":{"position":[[54,11],[142,13]]},"546":{"position":[[263,12]]},"548":{"position":[[250,12]]},"550":{"position":[[363,11]]},"557":{"position":[[473,12]]},"564":{"position":[[1141,11]]},"567":{"position":[[414,11]]},"569":{"position":[[238,12]]},"571":{"position":[[40,13],[194,11],[656,13],[1414,11]]},"574":{"position":[[155,12],[712,11]]},"576":{"position":[[437,13]]},"577":{"position":[[61,12]]},"579":{"position":[[859,11]]},"584":{"position":[[5,12]]},"586":{"position":[[5,12]]},"589":{"position":[[46,12]]},"593":{"position":[[325,13]]},"594":{"position":[[19,13],[229,11]]},"595":{"position":[[94,11]]},"600":{"position":[[74,13]]},"603":{"position":[[52,11],[140,13]]},"608":{"position":[[248,12]]},"611":{"position":[[281,12]]},"613":{"position":[[385,12]]},"614":{"position":[[177,12]]},"617":{"position":[[1846,12],[2390,12]]},"618":{"position":[[26,12],[261,12],[683,11]]},"621":{"position":[[134,12]]},"623":{"position":[[143,12]]},"624":{"position":[[491,12],[802,13],[1080,13],[1195,12]]},"660":{"position":[[328,11]]},"661":{"position":[[95,13],[1456,11],[1817,13]]},"662":{"position":[[57,12],[252,12],[313,12],[389,13]]},"696":{"position":[[1860,13]]},"702":{"position":[[250,13],[504,13]]},"708":{"position":[[250,11]]},"709":{"position":[[276,11]]},"710":{"position":[[43,13],[129,12]]},"711":{"position":[[123,12],[1950,13]]},"714":{"position":[[307,11]]},"723":{"position":[[638,13],[2480,12],[2637,12]]},"776":{"position":[[345,11]]},"778":{"position":[[17,13]]},"779":{"position":[[256,13]]},"780":{"position":[[96,12],[517,11]]},"781":{"position":[[567,13]]},"782":{"position":[[11,13],[160,12],[236,12]]},"783":{"position":[[201,12],[272,12],[531,12]]},"784":{"position":[[15,13],[267,11]]},"785":{"position":[[33,12]]},"801":{"position":[[87,12],[784,11]]},"802":{"position":[[898,12]]},"821":{"position":[[144,11]]},"829":{"position":[[215,13],[945,12],[1798,11],[2985,12]]},"832":{"position":[[36,11]]},"836":{"position":[[97,13],[1303,13]]},"837":{"position":[[325,12]]},"838":{"position":[[57,13],[281,12],[342,12]]},"840":{"position":[[319,11]]},"857":{"position":[[495,13]]},"860":{"position":[[375,11]]},"871":{"position":[[332,12]]},"879":{"position":[[216,11],[438,11],[521,12],[545,11]]},"956":{"position":[[201,11]]},"981":{"position":[[1573,11]]},"995":{"position":[[516,12],[617,11]]},"1032":{"position":[[88,11]]},"1072":{"position":[[521,11],[832,11]]},"1092":{"position":[[407,12]]},"1094":{"position":[[9,11]]},"1123":{"position":[[166,11],[753,11]]},"1124":{"position":[[338,11],[889,12]]},"1183":{"position":[[158,12]]},"1196":{"position":[[29,12],[142,12]]},"1198":{"position":[[396,13]]},"1206":{"position":[[87,12],[416,12],[533,12]]},"1207":{"position":[[796,12]]},"1246":{"position":[[315,12],[635,12]]},"1250":{"position":[[281,11],[319,11],[414,12],[521,11]]},"1301":{"position":[[34,11]]},"1307":{"position":[[188,11],[556,11]]},"1313":{"position":[[482,11]]},"1314":{"position":[[41,12]]},"1319":{"position":[[631,13],[698,11]]},"1321":{"position":[[63,12]]}},"keywords":{}}],["application'",{"_index":1019,"title":{},"content":{"96":{"position":[[169,13]]},"131":{"position":[[959,13]]},"134":{"position":[[234,13]]},"147":{"position":[[314,13]]},"173":{"position":[[1787,13]]},"178":{"position":[[272,13]]},"249":{"position":[[354,13]]},"295":{"position":[[332,13]]},"367":{"position":[[262,13]]},"419":{"position":[[416,13]]},"485":{"position":[[203,13]]},"524":{"position":[[150,13]]},"525":{"position":[[701,13]]},"546":{"position":[[19,13]]},"581":{"position":[[667,13]]},"606":{"position":[[19,13]]},"613":{"position":[[1090,13]]},"906":{"position":[[718,13]]}},"keywords":{}}],["application.data",{"_index":1210,"title":{},"content":{"173":{"position":[[2690,16]]}},"keywords":{}}],["application.rxdb",{"_index":3532,"title":{},"content":{"591":{"position":[[668,16]]}},"keywords":{}}],["application.stor",{"_index":1201,"title":{},"content":{"173":{"position":[[1127,17]]}},"keywords":{}}],["application.us",{"_index":1198,"title":{},"content":{"173":{"position":[[595,15]]}},"keywords":{}}],["application/json",{"_index":4667,"title":{},"content":{"800":{"position":[[970,20],[997,18]]},"875":{"position":[[2793,20],[5557,20],[6310,19],[6346,18]]},"988":{"position":[[2605,19],[2641,18]]},"1102":{"position":[[578,19],[614,18]]}},"keywords":{}}],["applications.bett",{"_index":1214,"title":{},"content":{"174":{"position":[[684,19]]}},"keywords":{}}],["applications.compress",{"_index":6030,"title":{},"content":{"1132":{"position":[[1039,25]]}},"keywords":{}}],["applications.memori",{"_index":3285,"title":{},"content":{"524":{"position":[[477,19]]}},"keywords":{}}],["applications.rxdb",{"_index":6376,"title":{},"content":{"1284":{"position":[[75,17]]}},"keywords":{}}],["applications—lead",{"_index":3151,"title":{},"content":{"483":{"position":[[1245,20]]}},"keywords":{}}],["approach",{"_index":732,"title":{"122":{"position":[[14,9]]},"133":{"position":[[14,9]]},"157":{"position":[[14,9]]},"164":{"position":[[14,9]]},"183":{"position":[[14,9]]},"191":{"position":[[14,9]]},"274":{"position":[[12,9]]},"327":{"position":[[14,9]]},"338":{"position":[[14,9]]},"413":{"position":[[41,11]]},"516":{"position":[[12,9]]},"584":{"position":[[14,9]]},"630":{"position":[[36,10]]}},"content":{"47":{"position":[[523,8]]},"51":{"position":[[61,8]]},"55":{"position":[[29,8]]},"64":{"position":[[67,8]]},"68":{"position":[[74,8]]},"91":{"position":[[166,8]]},"96":{"position":[[145,8]]},"99":{"position":[[149,8]]},"103":{"position":[[121,8]]},"116":{"position":[[178,9]]},"122":{"position":[[59,9]]},"126":{"position":[[143,9]]},"133":{"position":[[55,9]]},"156":{"position":[[188,8]]},"157":{"position":[[32,9]]},"161":{"position":[[350,8]]},"164":{"position":[[52,9]]},"170":{"position":[[217,9]]},"172":{"position":[[214,8]]},"173":{"position":[[1030,8]]},"174":{"position":[[358,8],[753,8]]},"183":{"position":[[31,9]]},"186":{"position":[[272,9]]},"191":{"position":[[22,8]]},"198":{"position":[[104,9]]},"203":{"position":[[78,9]]},"205":{"position":[[91,8]]},"219":{"position":[[264,8]]},"226":{"position":[[114,8]]},"231":{"position":[[21,9]]},"233":{"position":[[181,8]]},"241":{"position":[[606,8]]},"249":{"position":[[306,8]]},"260":{"position":[[107,9]]},"262":{"position":[[101,8]]},"266":{"position":[[251,8]]},"273":{"position":[[72,9]]},"274":{"position":[[17,8]]},"279":{"position":[[65,8]]},"280":{"position":[[163,9]]},"289":{"position":[[1637,8]]},"298":{"position":[[303,8]]},"299":{"position":[[346,9],[867,9],[1457,8]]},"302":{"position":[[343,8]]},"313":{"position":[[24,8]]},"322":{"position":[[114,8]]},"323":{"position":[[167,9]]},"331":{"position":[[372,9]]},"335":{"position":[[831,9]]},"338":{"position":[[22,8]]},"352":{"position":[[371,8]]},"353":{"position":[[765,8]]},"354":{"position":[[867,8],[1019,8]]},"356":{"position":[[604,8]]},"358":{"position":[[137,9]]},"362":{"position":[[447,8]]},"372":{"position":[[238,8]]},"380":{"position":[[301,8]]},"382":{"position":[[109,8]]},"407":{"position":[[341,8]]},"411":{"position":[[293,8],[3285,8]]},"412":{"position":[[15,8],[301,10],[831,10],[1953,8],[3458,10],[6594,8],[14940,10]]},"418":{"position":[[549,11]]},"420":{"position":[[636,11]]},"444":{"position":[[832,11]]},"445":{"position":[[416,9]]},"447":{"position":[[126,9]]},"476":{"position":[[42,8]]},"483":{"position":[[33,8],[1172,8]]},"485":{"position":[[171,8]]},"491":{"position":[[1157,9]]},"495":{"position":[[100,9]]},"496":{"position":[[681,8]]},"497":{"position":[[203,8],[727,9]]},"502":{"position":[[231,9],[298,9]]},"504":{"position":[[1431,8]]},"510":{"position":[[260,9]]},"515":{"position":[[351,8]]},"521":{"position":[[611,9]]},"525":{"position":[[19,8]]},"540":{"position":[[107,10]]},"542":{"position":[[937,8]]},"555":{"position":[[883,8]]},"561":{"position":[[123,8]]},"563":{"position":[[106,10]]},"567":{"position":[[881,11]]},"575":{"position":[[331,9]]},"576":{"position":[[25,10]]},"582":{"position":[[33,9]]},"585":{"position":[[132,8]]},"614":{"position":[[708,8]]},"632":{"position":[[608,11]]},"634":{"position":[[15,9]]},"635":{"position":[[238,9]]},"642":{"position":[[118,8]]},"686":{"position":[[847,9]]},"688":{"position":[[144,8],[495,8]]},"723":{"position":[[1679,8]]},"774":{"position":[[847,8]]},"801":{"position":[[712,8]]},"802":{"position":[[704,8]]},"831":{"position":[[308,10]]},"838":{"position":[[997,8]]},"839":{"position":[[255,8]]},"903":{"position":[[241,8]]},"912":{"position":[[506,8]]},"1072":{"position":[[1484,8]]},"1132":{"position":[[459,8]]},"1147":{"position":[[93,10],[382,8]]},"1257":{"position":[[31,9]]}},"keywords":{}}],["approach.custom",{"_index":1383,"title":{},"content":{"212":{"position":[[183,15]]}},"keywords":{}}],["appropri",{"_index":1148,"title":{},"content":{"146":{"position":[[294,11]]},"162":{"position":[[776,11]]},"189":{"position":[[666,11]]},"192":{"position":[[286,11]]},"274":{"position":[[350,13]]},"298":{"position":[[927,14]]},"376":{"position":[[469,11]]},"397":{"position":[[1592,11]]},"430":{"position":[[150,12]]},"525":{"position":[[667,11]]},"1085":{"position":[[3333,11]]}},"keywords":{}}],["approv",{"_index":1748,"title":{},"content":{"299":{"position":[[404,10]]},"497":{"position":[[376,9]]}},"keywords":{}}],["approx",{"_index":1739,"title":{},"content":{"299":{"position":[[219,7]]}},"keywords":{}}],["approxim",{"_index":1737,"title":{},"content":{"299":{"position":[[142,11]]},"394":{"position":[[1711,13]]},"396":{"position":[[220,11],[620,11]]}},"keywords":{}}],["apps"",{"_index":1483,"title":{},"content":{"244":{"position":[[268,10]]}},"keywords":{}}],["apps.offlin",{"_index":4789,"title":{},"content":{"838":{"position":[[564,12]]}},"keywords":{}}],["apps.resili",{"_index":5244,"title":{},"content":{"902":{"position":[[547,15]]}},"keywords":{}}],["apps/plugin",{"_index":6362,"title":{},"content":{"1280":{"position":[[398,11]]}},"keywords":{}}],["appstor",{"_index":3965,"title":{},"content":{"702":{"position":[[816,8]]}},"keywords":{}}],["appsync",{"_index":320,"title":{},"content":{"19":{"position":[[155,7],[480,7]]}},"keywords":{}}],["apps—no",{"_index":3144,"title":{},"content":{"483":{"position":[[396,7]]}},"keywords":{}}],["appwrit",{"_index":4618,"title":{"859":{"position":[[5,8]]},"860":{"position":[[29,10]]},"861":{"position":[[14,8]]},"862":{"position":[[22,8]]},"863":{"position":[[19,8]]}},"content":{"793":{"position":[[840,8]]},"860":{"position":[[1,8],[488,8],[902,8]]},"861":{"position":[[24,8],[56,8],[236,8],[279,8],[827,8],[931,8],[983,8],[1022,8],[1103,8],[1126,8],[1172,8],[1239,8],[1399,8],[1472,9],[1573,8],[1855,8],[2219,8],[2240,8]]},"862":{"position":[[29,8],[132,8],[168,8],[195,8],[278,10],[471,11],[912,8],[929,8],[1181,8],[1360,8]]},"863":{"position":[[1,8],[191,8],[256,8],[779,8]]}},"keywords":{}}],["appwrite/appwrite:1.6.1",{"_index":4898,"title":{},"content":{"861":{"position":[[721,23]]}},"keywords":{}}],["appwrite’",{"_index":4891,"title":{},"content":{"860":{"position":[[579,10],[1132,10]]}},"keywords":{}}],["app’",{"_index":1733,"title":{"301":{"position":[[13,5]]}},"content":{"298":{"position":[[907,5]]},"567":{"position":[[1120,5]]}},"keywords":{}}],["arbitrari",{"_index":1593,"title":{},"content":{"262":{"position":[[447,9]]},"901":{"position":[[138,9]]},"1085":{"position":[[1089,9]]}},"keywords":{}}],["architect",{"_index":2777,"title":{},"content":{"412":{"position":[[15381,12]]}},"keywords":{}}],["architectur",{"_index":638,"title":{"871":{"position":[[0,12]]},"897":{"position":[[0,12]]},"902":{"position":[[59,13]]}},"content":{"40":{"position":[[431,13]]},"96":{"position":[[183,12]]},"113":{"position":[[199,14]]},"153":{"position":[[231,12]]},"181":{"position":[[241,12]]},"326":{"position":[[51,12]]},"381":{"position":[[518,13]]},"383":{"position":[[51,13]]},"408":{"position":[[4333,13]]},"410":{"position":[[1811,13]]},"411":{"position":[[42,13],[1133,12]]},"412":{"position":[[2740,13]]},"483":{"position":[[809,13]]},"574":{"position":[[55,12]]},"582":{"position":[[619,13]]},"630":{"position":[[18,13]]},"644":{"position":[[625,12]]},"860":{"position":[[1104,13]]},"871":{"position":[[37,13]]},"903":{"position":[[743,13]]},"1094":{"position":[[50,12]]},"1124":{"position":[[1992,13]]},"1295":{"position":[[296,13]]}},"keywords":{}}],["archiv",{"_index":2987,"title":{},"content":{"458":{"position":[[978,9]]}},"keywords":{}}],["area",{"_index":1652,"title":{},"content":{"280":{"position":[[130,4]]},"292":{"position":[[69,4]]},"410":{"position":[[1167,6]]}},"keywords":{}}],["aren't",{"_index":951,"title":{"67":{"position":[[30,6]]}},"content":{"535":{"position":[[1105,6]]},"595":{"position":[[1182,6]]}},"keywords":{}}],["arg",{"_index":4128,"title":{},"content":{"747":{"position":[[207,5],[265,5],[325,5]]},"885":{"position":[[1491,4]]},"910":{"position":[[412,8]]}},"keywords":{}}],["args.checkpoint",{"_index":5093,"title":{},"content":{"885":{"position":[[1518,15],[1582,15]]}},"keywords":{}}],["args.checkpoint.id",{"_index":5094,"title":{},"content":{"885":{"position":[[1536,18]]}},"keywords":{}}],["args.checkpoint.updatedat",{"_index":5096,"title":{},"content":{"885":{"position":[[1600,25]]}},"keywords":{}}],["args.limit",{"_index":5109,"title":{},"content":{"885":{"position":[[2405,12]]}},"keywords":{}}],["arguabl",{"_index":2654,"title":{},"content":{"412":{"position":[[552,8]]}},"keywords":{}}],["argument",{"_index":3977,"title":{},"content":{"705":{"position":[[420,9]]},"749":{"position":[[3948,8],[4027,9],[4135,9],[4300,9]]},"1125":{"position":[[509,8]]}},"keywords":{}}],["aris",{"_index":1113,"title":{},"content":{"134":{"position":[[40,5]]},"279":{"position":[[311,5]]},"412":{"position":[[1550,5]]},"582":{"position":[[489,5]]},"634":{"position":[[449,6]]},"908":{"position":[[78,5]]},"987":{"position":[[139,6]]},"990":{"position":[[745,5]]},"1072":{"position":[[1848,6]]}},"keywords":{}}],["around",{"_index":371,"title":{},"content":{"22":{"position":[[198,6]]},"24":{"position":[[540,6]]},"47":{"position":[[131,6]]},"208":{"position":[[115,7]]},"266":{"position":[[790,6]]},"299":{"position":[[1414,6]]},"354":{"position":[[968,6]]},"392":{"position":[[3069,6]]},"394":{"position":[[1627,6]]},"408":{"position":[[1174,6],[2933,6],[4860,6]]},"419":{"position":[[47,7],[1671,6]]},"421":{"position":[[582,6]]},"427":{"position":[[1513,6]]},"432":{"position":[[320,6]]},"435":{"position":[[265,6]]},"490":{"position":[[22,6]]},"510":{"position":[[775,6]]},"514":{"position":[[299,6]]},"574":{"position":[[77,6]]},"595":{"position":[[173,6]]},"631":{"position":[[238,7]]},"632":{"position":[[35,6]]},"717":{"position":[[477,6]]},"734":{"position":[[41,6]]},"745":{"position":[[45,6]]},"746":{"position":[[104,6]]},"784":{"position":[[394,6]]},"785":{"position":[[114,7]]},"890":{"position":[[962,7]]},"1123":{"position":[[347,6]]},"1154":{"position":[[33,6]]},"1157":{"position":[[155,6]]},"1184":{"position":[[286,6],[321,6]]},"1198":{"position":[[170,6]]},"1246":{"position":[[47,6],[391,6],[1278,6],[1680,6]]},"1286":{"position":[[363,6]]},"1287":{"position":[[409,6]]},"1288":{"position":[[369,6]]}},"keywords":{}}],["arr",{"_index":603,"title":{},"content":{"38":{"position":[[1005,5]]}},"keywords":{}}],["array",{"_index":1479,"title":{"813":{"position":[[13,6]]}},"content":{"244":{"position":[[177,5],[225,5]]},"315":{"position":[[863,5]]},"350":{"position":[[75,6]]},"390":{"position":[[535,5]]},"391":{"position":[[873,5]]},"392":{"position":[[1476,5],[1655,8]]},"426":{"position":[[243,7]]},"493":{"position":[[450,5]]},"682":{"position":[[294,5]]},"690":{"position":[[381,5]]},"749":{"position":[[1594,5],[4066,5],[4401,5],[4652,5],[9556,5],[10914,5],[13902,5],[15923,5],[16963,5],[17064,5],[18533,5],[18640,6],[19166,6]]},"808":{"position":[[478,6],[637,8]]},"813":{"position":[[160,8]]},"875":{"position":[[1786,5],[1996,6],[3672,5],[4133,6]]},"888":{"position":[[245,6],[965,5]]},"920":{"position":[[12,5]]},"944":{"position":[[169,6]]},"945":{"position":[[110,6]]},"947":{"position":[[145,6]]},"983":{"position":[[493,5],[599,5]]},"984":{"position":[[578,5]]},"988":{"position":[[2716,5],[2819,6]]},"1022":{"position":[[214,6],[234,6]]},"1055":{"position":[[118,5]]},"1074":{"position":[[515,5]]},"1080":{"position":[[636,8]]},"1116":{"position":[[572,5]]},"1321":{"position":[[307,6]]}},"keywords":{}}],["array<string>",{"_index":4360,"title":{},"content":{"749":{"position":[[17228,19]]}},"keywords":{}}],["array(5).fill(0).map((_",{"_index":2382,"title":{},"content":{"397":{"position":[[2042,24]]},"403":{"position":[[883,24]]}},"keywords":{}}],["array(5).fill(0).map(async",{"_index":2395,"title":{},"content":{"398":{"position":[[852,26],[2138,26]]}},"keywords":{}}],["array(navigator.hardwareconcurr",{"_index":2262,"title":{},"content":{"392":{"position":[[3861,36]]}},"keywords":{}}],["array.<rxdocument>",{"_index":4696,"title":{},"content":{"813":{"position":[[465,24]]}},"keywords":{}}],["array.from(candidates).map(doc",{"_index":2409,"title":{},"content":{"398":{"position":[[1466,30],[2619,30]]}},"keywords":{}}],["array.from(output.data",{"_index":2225,"title":{},"content":{"391":{"position":[[727,24]]}},"keywords":{}}],["array.pullstream",{"_index":5443,"title":{},"content":{"983":{"position":[[715,16]]}},"keywords":{}}],["array.reduc",{"_index":6294,"title":{},"content":{"1250":{"position":[[547,14]]}},"keywords":{}}],["arraybuff",{"_index":6192,"title":{},"content":{"1208":{"position":[[207,11]]}},"keywords":{}}],["arriv",{"_index":752,"title":{},"content":{"50":{"position":[[133,8]]},"379":{"position":[[284,7]]},"632":{"position":[[342,6]]}},"keywords":{}}],["articl",{"_index":1435,"title":{"242":{"position":[[10,8]]}},"content":{"396":{"position":[[1878,8]]},"404":{"position":[[720,7]]},"405":{"position":[[76,7]]},"461":{"position":[[1412,7]]},"470":{"position":[[482,7]]},"501":{"position":[[251,7]]},"1302":{"position":[[158,7]]}},"keywords":{}}],["articleshared/lik",{"_index":3688,"title":{},"content":{"628":{"position":[[45,18]]}},"keywords":{}}],["artifici",{"_index":1791,"title":{},"content":{"301":{"position":[[620,12]]}},"keywords":{}}],["asc",{"_index":818,"title":{},"content":{"54":{"position":[[186,5]]},"130":{"position":[[541,5]]},"143":{"position":[[481,5],[662,5]]},"398":{"position":[[1302,5],[2495,5]]},"580":{"position":[[561,5]]},"829":{"position":[[2442,5],[3358,5]]},"1056":{"position":[[246,6]]},"1249":{"position":[[546,5]]}},"keywords":{}}],["ascend",{"_index":2320,"title":{},"content":{"394":{"position":[[1030,9]]}},"keywords":{}}],["ask",{"_index":1749,"title":{},"content":{"299":{"position":[[482,5]]},"390":{"position":[[611,6]]},"412":{"position":[[12881,4]]},"669":{"position":[[42,3]]},"715":{"position":[[225,3]]},"800":{"position":[[777,5]]},"1249":{"position":[[10,3]]}},"keywords":{}}],["aspect",{"_index":1016,"title":{},"content":{"95":{"position":[[23,6]]},"184":{"position":[[32,6]]},"218":{"position":[[23,6]]},"270":{"position":[[44,6]]},"282":{"position":[[170,7]]},"369":{"position":[[52,7]]},"620":{"position":[[131,7]]},"876":{"position":[[139,7]]}},"keywords":{}}],["assembl",{"_index":3810,"title":{},"content":{"662":{"position":[[1544,8]]},"710":{"position":[[1485,8]]},"838":{"position":[[1861,8]]}},"keywords":{}}],["assess",{"_index":1767,"title":{},"content":{"300":{"position":[[4,6]]},"430":{"position":[[562,6]]},"441":{"position":[[254,6]]},"497":{"position":[[540,9]]}},"keywords":{}}],["asset",{"_index":1266,"title":{},"content":{"188":{"position":[[1887,6],[1933,7]]}},"keywords":{}}],["assign",{"_index":2206,"title":{},"content":{"390":{"position":[[1548,7]]},"429":{"position":[[206,11]]},"441":{"position":[[183,12]]},"468":{"position":[[180,11]]},"751":{"position":[[244,9]]},"923":{"position":[[40,8]]},"1040":{"position":[[36,8]]},"1115":{"position":[[533,10]]}},"keywords":{}}],["associ",{"_index":922,"title":{},"content":{"65":{"position":[[1105,10]]},"223":{"position":[[380,10]]},"265":{"position":[[576,10]]},"369":{"position":[[1157,10]]},"412":{"position":[[409,10]]},"419":{"position":[[1328,9]]},"723":{"position":[[752,10]]}},"keywords":{}}],["assum",{"_index":2720,"title":{},"content":{"412":{"position":[[7342,6]]},"419":{"position":[[176,6]]},"617":{"position":[[1871,6]]},"696":{"position":[[1114,6]]},"697":{"position":[[538,6]]},"729":{"position":[[181,6]]},"756":{"position":[[264,7]]},"796":{"position":[[1180,6]]},"886":{"position":[[1594,6]]},"902":{"position":[[657,9]]},"961":{"position":[[157,7]]},"982":{"position":[[726,8]]},"988":{"position":[[3989,7]]},"1202":{"position":[[220,7]]},"1300":{"position":[[811,6]]},"1307":{"position":[[52,7]]},"1308":{"position":[[239,7]]},"1314":{"position":[[60,7]]}},"keywords":{}}],["assumedmasterst",{"_index":4485,"title":{},"content":{"756":{"position":[[137,18]]},"875":{"position":[[3857,19],[3946,18]]},"885":{"position":[[937,19]]},"983":{"position":[[508,18]]},"1106":{"position":[[460,18]]}},"keywords":{}}],["assumpt",{"_index":3937,"title":{},"content":{"696":{"position":[[1614,11]]},"700":{"position":[[451,11]]}},"keywords":{}}],["assur",{"_index":3161,"title":{},"content":{"489":{"position":[[769,7]]},"571":{"position":[[1822,6]]}},"keywords":{}}],["asymmetr",{"_index":4018,"title":{"716":{"position":[[0,10]]}},"content":{"716":{"position":[[154,10],[199,10],[307,10]]}},"keywords":{}}],["async",{"_index":167,"title":{"54":{"position":[[26,5]]},"130":{"position":[[16,5]]},"143":{"position":[[4,5]]}},"content":{"11":{"position":[[678,5]]},"51":{"position":[[635,5]]},"130":{"position":[[22,5],[181,5],[602,5]]},"143":{"position":[[11,5],[93,5],[385,5]]},"188":{"position":[[888,5]]},"209":{"position":[[199,5],[728,5],[994,5]]},"255":{"position":[[546,5],[1080,5],[1329,5]]},"314":{"position":[[432,5]]},"315":{"position":[[383,5]]},"334":{"position":[[284,5]]},"335":{"position":[[610,5]]},"391":{"position":[[562,5]]},"392":{"position":[[2758,5],[3558,5],[4029,5],[4711,5]]},"397":{"position":[[1799,5]]},"398":{"position":[[679,5],[1925,5]]},"412":{"position":[[5059,5],[5157,5]]},"427":{"position":[[116,5],[203,5]]},"439":{"position":[[385,5]]},"460":{"position":[[1299,5]]},"480":{"position":[[290,5]]},"482":{"position":[[380,5]]},"493":{"position":[[13,5],[199,6]]},"554":{"position":[[805,5]]},"555":{"position":[[172,6]]},"556":{"position":[[336,5]]},"562":{"position":[[120,6]]},"563":{"position":[[421,6]]},"564":{"position":[[394,6]]},"579":{"position":[[293,5]]},"598":{"position":[[393,5]]},"632":{"position":[[1171,5],[2174,5],[2374,5],[2511,5]]},"672":{"position":[[1,5]]},"673":{"position":[[44,5]]},"674":{"position":[[315,5]]},"693":{"position":[[869,5]]},"711":{"position":[[1513,5]]},"740":{"position":[[603,5]]},"749":{"position":[[7788,5]]},"752":{"position":[[525,5]]},"754":{"position":[[262,5],[408,5],[567,5]]},"765":{"position":[[79,5]]},"767":{"position":[[501,5],[897,5]]},"768":{"position":[[493,5],[901,5]]},"769":{"position":[[448,5],[868,5]]},"829":{"position":[[591,5],[1495,5]]},"875":{"position":[[3142,5],[6186,5]]},"888":{"position":[[569,5]]},"889":{"position":[[599,5]]},"907":{"position":[[329,5]]},"930":{"position":[[65,7]]},"988":{"position":[[2416,5],[3515,5]]},"1007":{"position":[[1470,5],[1634,5]]},"1020":{"position":[[463,5]]},"1022":{"position":[[566,5]]},"1023":{"position":[[222,5]]},"1024":{"position":[[308,5]]},"1033":{"position":[[584,5],[815,5]]},"1105":{"position":[[1090,5],[1130,5]]},"1115":{"position":[[794,6]]},"1148":{"position":[[884,5]]},"1164":{"position":[[642,7]]},"1173":{"position":[[266,5]]},"1220":{"position":[[269,5]]},"1278":{"position":[[685,5]]},"1284":{"position":[[349,5],[380,5]]},"1311":{"position":[[853,5],[1397,5]]}},"keywords":{}}],["async">",{"_index":822,"title":{},"content":{"54":{"position":[[257,15]]}},"keywords":{}}],["async(param",{"_index":6058,"title":{},"content":{"1140":{"position":[[677,13]]}},"keywords":{}}],["async.mj",{"_index":6344,"title":{},"content":{"1276":{"position":[[776,11]]}},"keywords":{}}],["async/await",{"_index":2962,"title":{},"content":{"452":{"position":[[784,11]]},"521":{"position":[[154,11]]}},"keywords":{}}],["asynchron",{"_index":286,"title":{},"content":{"17":{"position":[[36,12]]},"129":{"position":[[375,12]]},"437":{"position":[[122,12]]},"445":{"position":[[1360,12]]},"450":{"position":[[783,12]]},"451":{"position":[[541,12]]},"452":{"position":[[228,12]]},"453":{"position":[[293,12],[359,12]]},"533":{"position":[[223,12]]},"535":{"position":[[213,12]]},"560":{"position":[[207,12]]},"566":{"position":[[711,12]]},"593":{"position":[[223,12]]},"595":{"position":[[226,12]]},"659":{"position":[[368,12]]},"751":{"position":[[726,12]]},"770":{"position":[[294,13]]},"960":{"position":[[32,12]]},"1208":{"position":[[475,12]]},"1246":{"position":[[753,12]]}},"keywords":{}}],["asyncpip",{"_index":813,"title":{},"content":{"54":{"position":[[48,10]]}},"keywords":{}}],["asyncstorag",{"_index":104,"title":{"9":{"position":[[0,13]]},"10":{"position":[[0,12]]},"437":{"position":[[0,12]]},"835":{"position":[[0,13]]}},"content":{"8":{"position":[[71,12]]},"9":{"position":[[21,13],[153,12],[213,16],[325,14]]},"10":{"position":[[36,13],[82,12]]},"437":{"position":[[34,12],[200,12]]},"659":{"position":[[172,13]]},"835":{"position":[[1,12],[144,12],[537,12],[733,12],[792,12],[991,12]]},"837":{"position":[[1122,12],[1157,12]]},"841":{"position":[[16,12]]},"1316":{"position":[[3619,13]]}},"keywords":{}}],["asyncstorage.getitem('mykey",{"_index":4771,"title":{},"content":{"835":{"position":[[505,30]]}},"keywords":{}}],["asyncstoragedown",{"_index":137,"title":{},"content":{"10":{"position":[[219,16]]}},"keywords":{}}],["at1",{"_index":4299,"title":{},"content":{"749":{"position":[[12775,3]]}},"keywords":{}}],["atla",{"_index":574,"title":{},"content":{"36":{"position":[[383,5]]},"872":{"position":[[319,5],[456,5]]}},"keywords":{}}],["atom",{"_index":2031,"title":{"1048":{"position":[[30,6]]}},"content":{"354":{"position":[[1321,9]]},"412":{"position":[[14627,6]]},"682":{"position":[[211,6]]},"705":{"position":[[1000,6]]},"765":{"position":[[27,9]]},"1022":{"position":[[33,6]]},"1048":{"position":[[289,6]]},"1304":{"position":[[93,10],[1601,6]]},"1324":{"position":[[848,6]]}},"keywords":{}}],["attach",{"_index":3367,"title":{"720":{"position":[[10,12]]},"754":{"position":[[10,12]]},"792":{"position":[[0,10]]},"800":{"position":[[37,11]]},"914":{"position":[[0,11]]},"915":{"position":[[8,11]]},"916":{"position":[[7,11]]},"1004":{"position":[[0,10]]},"1081":{"position":[[0,12]]}},"content":{"556":{"position":[[544,12],[632,12],[659,11],[897,10],[1250,11],[1290,11]]},"612":{"position":[[865,9]]},"647":{"position":[[326,11],[357,12]]},"648":{"position":[[206,12]]},"649":{"position":[[162,12]]},"720":{"position":[[14,11],[81,11],[192,12],[239,10]]},"749":{"position":[[998,10],[12786,12],[13674,11],[23259,12]]},"754":{"position":[[330,11],[628,10]]},"792":{"position":[[1,10],[205,12],[316,10]]},"793":{"position":[[1031,11]]},"800":{"position":[[638,11],[688,10],[854,10]]},"838":{"position":[[3376,11]]},"915":{"position":[[15,12],[48,11]]},"916":{"position":[[20,12],[61,11],[204,12],[251,10]]},"917":{"position":[[9,10],[68,11],[122,10],[208,10],[292,10],[346,10]]},"918":{"position":[[85,10]]},"919":{"position":[[58,10],[92,10]]},"920":{"position":[[25,11],[63,11]]},"921":{"position":[[48,11],[101,10],[210,11],[234,11]]},"922":{"position":[[5,11]]},"923":{"position":[[26,10]]},"924":{"position":[[25,11]]},"925":{"position":[[27,11]]},"926":{"position":[[31,10]]},"927":{"position":[[17,11],[191,11]]},"928":{"position":[[28,10]]},"929":{"position":[[13,11],[75,10]]},"930":{"position":[[80,10]]},"931":{"position":[[80,10]]},"932":{"position":[[74,10],[188,10],[225,11],[345,11],[404,11],[456,11],[884,10],[1256,12],[1419,11]]},"934":{"position":[[427,12],[476,11]]},"937":{"position":[[42,12]]},"1004":{"position":[[1,10],[196,11],[335,10],[408,10],[431,11],[496,11],[598,11],[764,12]]},"1051":{"position":[[390,11]]},"1074":{"position":[[637,11]]},"1081":{"position":[[8,11],[59,11]]},"1132":{"position":[[1316,11],[1390,11]]},"1143":{"position":[[254,11]]},"1181":{"position":[[21,11],[53,11]]},"1271":{"position":[[386,10]]},"1282":{"position":[[94,11],[194,11]]}},"keywords":{}}],["attachment'",{"_index":5307,"title":{},"content":{"930":{"position":[[38,12]]},"931":{"position":[[38,12]]},"932":{"position":[[38,12]]}},"keywords":{}}],["attachment.getdata",{"_index":5308,"title":{},"content":{"930":{"position":[[149,21]]}},"keywords":{}}],["attachment.getdatabase64",{"_index":5311,"title":{},"content":{"931":{"position":[[159,27]]}},"keywords":{}}],["attachment.getstringdata",{"_index":5313,"title":{},"content":{"932":{"position":[[149,27]]}},"keywords":{}}],["attachment.remov",{"_index":5305,"title":{},"content":{"929":{"position":[[131,20]]}},"keywords":{}}],["attachments.compress",{"_index":4144,"title":{},"content":{"749":{"position":[[956,23]]}},"keywords":{}}],["attachments.data",{"_index":4791,"title":{},"content":{"838":{"position":[[932,16]]},"1171":{"position":[[21,16]]}},"keywords":{}}],["attachments.lik",{"_index":4821,"title":{},"content":{"845":{"position":[[37,16]]}},"keywords":{}}],["attachments.when",{"_index":6106,"title":{},"content":{"1162":{"position":[[21,16]]}},"keywords":{}}],["attachmentsbig",{"_index":6179,"title":{},"content":{"1199":{"position":[[89,14]]}},"keywords":{}}],["attachmentsth",{"_index":5548,"title":{},"content":{"1004":{"position":[[388,14]]}},"keywords":{}}],["attack",{"_index":3380,"title":{},"content":{"556":{"position":[[1888,8],[1975,9]]},"881":{"position":[[320,6]]},"1110":{"position":[[70,8]]}},"keywords":{}}],["attempt",{"_index":1859,"title":{},"content":{"304":{"position":[[133,7]]},"908":{"position":[[141,7]]},"943":{"position":[[32,8]]}},"keywords":{}}],["attent",{"_index":3251,"title":{},"content":{"513":{"position":[[52,9]]}},"keywords":{}}],["attract",{"_index":1070,"title":{},"content":{"118":{"position":[[344,10]]},"267":{"position":[[1404,10]]},"295":{"position":[[169,10]]}},"keywords":{}}],["attribut",{"_index":2953,"title":{},"content":{"450":{"position":[[250,9]]},"457":{"position":[[384,10]]},"749":{"position":[[20204,9],[20370,9],[20638,9],[20895,9]]},"766":{"position":[[179,10]]},"810":{"position":[[95,9]]},"818":{"position":[[433,9]]},"861":{"position":[[1220,11],[1271,10],[1434,11],[1514,10],[1562,10]]},"863":{"position":[[765,10],[848,11],[955,10]]},"934":{"position":[[177,10]]},"1043":{"position":[[22,10],[128,9]]},"1074":{"position":[[494,9],[572,10]]},"1079":{"position":[[268,10]]},"1081":{"position":[[71,9]]},"1085":{"position":[[377,10]]},"1140":{"position":[[445,10]]}},"keywords":{}}],["attributes/method",{"_index":5302,"title":{},"content":{"922":{"position":[[90,19]]}},"keywords":{}}],["audienc",{"_index":2807,"title":{},"content":{"419":{"position":[[1275,9]]}},"keywords":{}}],["audio",{"_index":2182,"title":{},"content":{"390":{"position":[[240,6],[952,5]]},"614":{"position":[[335,6]]},"901":{"position":[[121,6]]}},"keywords":{}}],["augment",{"_index":2713,"title":{},"content":{"412":{"position":[[6614,12]]},"432":{"position":[[1084,7]]}},"keywords":{}}],["auth",{"_index":1536,"title":{"848":{"position":[[0,4]]},"1104":{"position":[[0,4]]}},"content":{"245":{"position":[[114,4]]},"412":{"position":[[13069,4]]},"749":{"position":[[16578,4]]},"841":{"position":[[853,4]]},"880":{"position":[[18,4],[156,4]]},"882":{"position":[[243,4]]},"1104":{"position":[[163,4],[263,4],[331,4]]},"1105":{"position":[[147,4],[497,4],[1229,4]]},"1148":{"position":[[329,6]]}},"keywords":{}}],["auth_token",{"_index":5088,"title":{},"content":{"885":{"position":[[1305,11]]}},"keywords":{}}],["authdata.data.userid",{"_index":5956,"title":{},"content":{"1105":{"position":[[668,20]]}},"keywords":{}}],["authent",{"_index":305,"title":{"701":{"position":[[16,15]]}},"content":{"18":{"position":[[160,15]]},"21":{"position":[[87,15]]},"29":{"position":[[288,15]]},"117":{"position":[[161,15]]},"206":{"position":[[89,14]]},"253":{"position":[[104,15]]},"377":{"position":[[347,14]]},"701":{"position":[[243,14]]},"840":{"position":[[203,15],[368,14],[413,14]]},"846":{"position":[[474,14]]},"848":{"position":[[14,14]]},"860":{"position":[[90,15]]},"876":{"position":[[171,15],[190,12],[252,14]]},"885":{"position":[[1239,12]]},"886":{"position":[[3429,13]]},"906":{"position":[[669,14]]},"1104":{"position":[[4,12],[189,12],[579,14]]},"1148":{"position":[[288,15]]}},"keywords":{}}],["authhandl",{"_index":5949,"title":{},"content":{"1104":{"position":[[87,11],[669,11]]}},"keywords":{}}],["author",{"_index":726,"title":{},"content":{"47":{"position":[[346,7]]},"412":{"position":[[12202,10]]},"482":{"position":[[1187,10]]},"848":{"position":[[1149,14]]},"878":{"position":[[497,14]]},"880":{"position":[[409,14]]},"886":{"position":[[1848,14],[3145,14],[4113,14],[4750,14]]},"890":{"position":[[341,14]]},"1104":{"position":[[695,13]]}},"keywords":{}}],["authorit",{"_index":669,"title":{},"content":{"43":{"position":[[146,13]]},"411":{"position":[[1920,13]]},"412":{"position":[[5704,13]]}},"keywords":{}}],["auto",{"_index":2848,"title":{},"content":{"421":{"position":[[261,4]]},"566":{"position":[[552,4]]},"841":{"position":[[605,4]]},"898":{"position":[[1213,4]]}},"keywords":{}}],["autocomplet",{"_index":6295,"title":{},"content":{"1251":{"position":[[208,12]]}},"keywords":{}}],["autoencod",{"_index":2491,"title":{},"content":{"402":{"position":[[2477,12],[2493,11]]}},"keywords":{}}],["autoload",{"_index":6133,"title":{"1175":{"position":[[13,9]]}},"content":{"1172":{"position":[[468,8]]},"1175":{"position":[[181,8]]}},"keywords":{}}],["autom",{"_index":1868,"title":{},"content":{"305":{"position":[[130,9]]},"1148":{"position":[[377,9]]}},"keywords":{}}],["automat",{"_index":425,"title":{"77":{"position":[[29,13]]},"103":{"position":[[29,13]]},"233":{"position":[[23,9]]}},"content":{"26":{"position":[[156,13]]},"34":{"position":[[635,9]]},"50":{"position":[[80,13]]},"53":{"position":[[84,13]]},"57":{"position":[[198,9]]},"77":{"position":[[75,13]]},"103":{"position":[[61,9]]},"122":{"position":[[181,13]]},"124":{"position":[[127,13]]},"125":{"position":[[149,13]]},"130":{"position":[[126,14]]},"133":{"position":[[175,13]]},"136":{"position":[[109,13]]},"156":{"position":[[126,13]]},"157":{"position":[[345,13]]},"159":{"position":[[195,9]]},"174":{"position":[[287,13]]},"182":{"position":[[144,13]]},"185":{"position":[[75,13]]},"191":{"position":[[146,13]]},"201":{"position":[[373,13]]},"221":{"position":[[235,13]]},"226":{"position":[[302,9]]},"233":{"position":[[88,13]]},"261":{"position":[[1076,13]]},"300":{"position":[[576,13]]},"309":{"position":[[287,13]]},"315":{"position":[[971,13]]},"323":{"position":[[259,13]]},"326":{"position":[[85,13]]},"330":{"position":[[48,13]]},"335":{"position":[[967,14]]},"360":{"position":[[346,13]]},"361":{"position":[[346,13],[1039,13]]},"380":{"position":[[236,13]]},"392":{"position":[[1893,14]]},"411":{"position":[[1490,14],[2963,13],[4378,13]]},"417":{"position":[[337,14]]},"419":{"position":[[496,13]]},"439":{"position":[[445,9]]},"445":{"position":[[676,13]]},"446":{"position":[[358,13]]},"458":{"position":[[504,13],[583,13]]},"483":{"position":[[125,9]]},"486":{"position":[[340,13]]},"489":{"position":[[800,13]]},"490":{"position":[[143,9],[208,13]]},"491":{"position":[[1268,13],[1405,13]]},"515":{"position":[[220,13]]},"518":{"position":[[181,9]]},"523":{"position":[[145,13]]},"535":{"position":[[993,13]]},"541":{"position":[[811,13]]},"542":{"position":[[955,9]]},"544":{"position":[[233,9]]},"555":{"position":[[108,13]]},"556":{"position":[[693,14]]},"562":{"position":[[846,13],[965,13]]},"564":{"position":[[1004,13]]},"565":{"position":[[203,13]]},"575":{"position":[[251,13],[638,13]]},"580":{"position":[[52,13]]},"595":{"position":[[813,13],[1070,13]]},"600":{"position":[[111,13]]},"601":{"position":[[792,13]]},"604":{"position":[[205,9]]},"612":{"position":[[1376,13]]},"618":{"position":[[242,13]]},"630":{"position":[[420,13]]},"632":{"position":[[290,13],[1702,13],[2026,13]]},"636":{"position":[[312,13]]},"683":{"position":[[67,13]]},"688":{"position":[[27,13]]},"689":{"position":[[24,9]]},"690":{"position":[[214,9],[521,10]]},"714":{"position":[[215,13]]},"721":{"position":[[475,14]]},"745":{"position":[[172,13]]},"749":{"position":[[17700,13]]},"752":{"position":[[27,13]]},"773":{"position":[[388,13]]},"784":{"position":[[597,13]]},"798":{"position":[[1009,13]]},"829":{"position":[[2814,13],[3017,13],[3644,13],[3775,13]]},"838":{"position":[[460,9]]},"851":{"position":[[46,13]]},"860":{"position":[[509,13]]},"870":{"position":[[84,9]]},"875":{"position":[[8605,13]]},"881":{"position":[[239,13]]},"886":{"position":[[4849,13]]},"898":{"position":[[1902,14]]},"942":{"position":[[97,13]]},"958":{"position":[[137,13],[409,13]]},"984":{"position":[[643,13]]},"986":{"position":[[1561,13]]},"988":{"position":[[1533,13],[5609,13]]},"996":{"position":[[435,13]]},"1003":{"position":[[233,13]]},"1027":{"position":[[92,13]]},"1038":{"position":[[85,13]]},"1052":{"position":[[391,13]]},"1085":{"position":[[1624,13],[1692,13]]},"1088":{"position":[[437,13]]},"1107":{"position":[[83,13]]},"1114":{"position":[[70,13],[362,13]]},"1119":{"position":[[197,13]]},"1121":{"position":[[262,13]]},"1148":{"position":[[80,9],[191,9]]},"1150":{"position":[[50,13],[537,13]]},"1154":{"position":[[74,13]]},"1213":{"position":[[267,13]]}},"keywords":{}}],["automatically—perhap",{"_index":1855,"title":{},"content":{"303":{"position":[[1409,21]]}},"keywords":{}}],["automerg",{"_index":2683,"title":{},"content":{"412":{"position":[[3819,9]]},"686":{"position":[[113,9],[744,9]]},"698":{"position":[[3091,9]]}},"keywords":{}}],["automerge.j",{"_index":3890,"title":{"686":{"position":[[8,12]]}},"content":{},"keywords":{}}],["automigr",{"_index":4458,"title":{"752":{"position":[[0,12]]}},"content":{"752":{"position":[[435,12]]},"934":{"position":[[602,12]]},"938":{"position":[[45,11]]}},"keywords":{}}],["automot",{"_index":3451,"title":{},"content":{"569":{"position":[[276,10]]}},"keywords":{}}],["autonomi",{"_index":2154,"title":{},"content":{"380":{"position":[[410,8]]},"1147":{"position":[[509,8]]}},"keywords":{}}],["autosav",{"_index":6134,"title":{"1175":{"position":[[0,8]]}},"content":{"1172":{"position":[[481,9]]},"1175":{"position":[[44,8],[340,8]]}},"keywords":{}}],["autostart",{"_index":5128,"title":{},"content":{"886":{"position":[[2034,9]]},"988":{"position":[[1639,10]]}},"keywords":{}}],["avail",{"_index":539,"title":{"449":{"position":[[4,9]]}},"content":{"34":{"position":[[504,9]]},"51":{"position":[[1025,9]]},"56":{"position":[[62,9]]},"90":{"position":[[98,12]]},"122":{"position":[[257,10]]},"126":{"position":[[40,9]]},"131":{"position":[[72,9],[450,9]]},"133":{"position":[[251,10]]},"157":{"position":[[248,10]]},"173":{"position":[[2954,9]]},"183":{"position":[[254,10],[351,13]]},"206":{"position":[[336,9]]},"287":{"position":[[308,9]]},"301":{"position":[[640,9]]},"309":{"position":[[265,9]]},"322":{"position":[[305,10]]},"360":{"position":[[618,10]]},"365":{"position":[[873,10]]},"375":{"position":[[979,10]]},"378":{"position":[[238,13]]},"390":{"position":[[1102,9]]},"392":{"position":[[5018,9]]},"393":{"position":[[134,9]]},"408":{"position":[[2839,9],[3352,9]]},"410":{"position":[[1207,9]]},"421":{"position":[[479,10],[597,13]]},"424":{"position":[[286,9]]},"444":{"position":[[374,10]]},"461":{"position":[[1106,9],[1568,9]]},"486":{"position":[[374,9]]},"491":{"position":[[340,9]]},"524":{"position":[[183,9]]},"535":{"position":[[1147,9]]},"566":{"position":[[1345,10]]},"595":{"position":[[1224,9]]},"610":{"position":[[400,10]]},"644":{"position":[[700,9]]},"660":{"position":[[94,10]]},"662":{"position":[[415,9]]},"696":{"position":[[13,9],[1169,9]]},"749":{"position":[[1119,9]]},"805":{"position":[[242,9]]},"829":{"position":[[1187,9],[2041,10]]},"832":{"position":[[293,9]]},"890":{"position":[[929,9]]},"1007":{"position":[[1143,10]]},"1066":{"position":[[108,9]]},"1104":{"position":[[54,9]]},"1151":{"position":[[188,12]]},"1178":{"position":[[187,12]]},"1207":{"position":[[333,9]]},"1211":{"position":[[67,9]]},"1232":{"position":[[29,9]]},"1271":{"position":[[46,9]]},"1298":{"position":[[236,9]]}},"keywords":{}}],["avenu",{"_index":1680,"title":{},"content":{"289":{"position":[[1068,6]]}},"keywords":{}}],["averag",{"_index":3023,"title":{},"content":{"462":{"position":[[578,7]]},"981":{"position":[[242,7]]}},"keywords":{}}],["avoid",{"_index":121,"title":{},"content":{"8":{"position":[[623,5]]},"46":{"position":[[478,5]]},"143":{"position":[[113,5]]},"302":{"position":[[298,5]]},"346":{"position":[[128,5]]},"383":{"position":[[527,8]]},"385":{"position":[[300,5]]},"392":{"position":[[2135,5]]},"395":{"position":[[90,5]]},"408":{"position":[[1972,5],[2731,8]]},"412":{"position":[[2486,5],[4223,5]]},"419":{"position":[[1700,5]]},"435":{"position":[[119,8]]},"556":{"position":[[26,5]]},"617":{"position":[[878,5]]},"765":{"position":[[53,8]]},"828":{"position":[[440,6]]},"839":{"position":[[1295,5]]},"898":{"position":[[4367,5]]},"902":{"position":[[418,8]]},"1003":{"position":[[80,5]]},"1085":{"position":[[2055,5],[2119,6]]}},"keywords":{}}],["aw",{"_index":302,"title":{"18":{"position":[[0,3]]},"19":{"position":[[0,3]]}},"content":{"18":{"position":[[3,3],[243,3],[402,3],[432,3]]},"19":{"position":[[54,3],[151,3],[476,3],[616,3],[786,3],[1015,3],[1082,3]]},"1173":{"position":[[121,3]]}},"keywords":{}}],["await",{"_index":34,"title":{"1185":{"position":[[0,5]]}},"content":{"1":{"position":[[530,5]]},"2":{"position":[[333,5]]},"3":{"position":[[213,5]]},"4":{"position":[[391,5]]},"5":{"position":[[301,5]]},"6":{"position":[[496,5],[675,5]]},"7":{"position":[[333,5],[510,5]]},"8":{"position":[[1102,5]]},"9":{"position":[[247,5]]},"10":{"position":[[285,5]]},"11":{"position":[[759,5],[811,5]]},"19":{"position":[[653,5],[825,5]]},"51":{"position":[[693,5],[823,5]]},"52":{"position":[[84,5],[178,5],[336,5],[383,5],[473,5],[537,5],[620,5],[684,5]]},"55":{"position":[[867,5]]},"188":{"position":[[964,5],[1174,5],[2649,5],[2845,5]]},"209":{"position":[[236,5],[358,5],[799,5],[914,5],[1097,5],[1223,5]]},"210":{"position":[[264,5]]},"211":{"position":[[206,5],[319,5]]},"255":{"position":[[583,5],[702,5],[1153,5],[1289,5],[1416,5],[1530,5]]},"258":{"position":[[144,5]]},"259":{"position":[[1,5]]},"261":{"position":[[337,5]]},"266":{"position":[[658,5]]},"276":{"position":[[399,5]]},"300":{"position":[[231,5]]},"302":{"position":[[783,5],[819,5]]},"314":{"position":[[469,5],[667,5]]},"315":{"position":[[532,5],[640,5]]},"316":{"position":[[110,5]]},"334":{"position":[[327,5],[555,5]]},"335":{"position":[[196,5],[723,5]]},"391":{"position":[[619,5],[653,5]]},"392":{"position":[[337,5],[526,5],[933,5],[988,5],[1037,5],[1081,5],[1491,5],[2629,5],[2779,5],[2843,5],[2878,5],[3594,5],[4535,5],[4732,5],[4800,5]]},"394":{"position":[[645,5],[703,5]]},"397":{"position":[[1754,5],[1820,5],[1884,5],[2205,5]]},"398":{"position":[[829,5],[1004,5],[1992,5],[2115,5],[2318,5]]},"403":{"position":[[719,5],[845,5]]},"439":{"position":[[669,5],[737,5]]},"459":{"position":[[836,5]]},"461":{"position":[[1278,5]]},"480":{"position":[[362,5],[467,5]]},"482":{"position":[[607,5],[754,5]]},"502":{"position":[[915,5]]},"518":{"position":[[382,5]]},"522":{"position":[[408,5]]},"538":{"position":[[423,5],[846,5]]},"539":{"position":[[84,5],[178,5],[336,5],[383,5],[473,5],[537,5],[620,5],[684,5]]},"542":{"position":[[528,5]]},"554":{"position":[[1046,5],[1247,5]]},"555":{"position":[[201,5],[269,5],[468,5],[630,5]]},"556":{"position":[[395,5],[804,5],[810,5],[910,5]]},"562":{"position":[[161,5],[474,5],[551,5],[664,5]]},"563":{"position":[[473,5]]},"564":{"position":[[577,5],[693,5]]},"571":{"position":[[856,5]]},"579":{"position":[[336,5],[563,5]]},"580":{"position":[[438,5]]},"598":{"position":[[430,5],[853,5]]},"599":{"position":[[84,5],[187,5],[363,5],[410,5],[500,5],[564,5],[651,5],[715,5]]},"601":{"position":[[521,5]]},"632":{"position":[[1282,5],[1452,5]]},"638":{"position":[[424,5],[531,5]]},"639":{"position":[[294,5]]},"647":{"position":[[431,5],[572,5]]},"648":{"position":[[297,5],[374,5]]},"653":{"position":[[247,5],[1017,5]]},"654":{"position":[[172,5],[296,5],[446,5]]},"655":{"position":[[415,5],[484,5]]},"659":{"position":[[419,5],[493,5],[574,5],[637,5]]},"661":{"position":[[1177,5]]},"662":{"position":[[2120,5],[2326,5],[2589,5],[2678,5],[2766,5]]},"672":{"position":[[84,5]]},"673":{"position":[[90,5]]},"674":{"position":[[373,5]]},"680":{"position":[[668,5],[1133,5],[1231,5],[1340,5]]},"681":{"position":[[614,5]]},"682":{"position":[[316,5]]},"683":{"position":[[164,5],[262,5],[724,5]]},"684":{"position":[[158,5],[229,5]]},"693":{"position":[[1168,5]]},"710":{"position":[[1689,5],[1815,5],[1896,5],[1985,5],[2073,5]]},"711":{"position":[[1737,5]]},"717":{"position":[[1149,5],[1593,5]]},"718":{"position":[[652,5]]},"724":{"position":[[523,5],[1630,5],[1812,5]]},"734":{"position":[[474,5],[848,5]]},"739":{"position":[[278,5],[407,5],[627,5]]},"745":{"position":[[523,5]]},"749":{"position":[[14828,5],[14984,5]]},"752":{"position":[[364,5],[659,5],[1454,5]]},"754":{"position":[[693,5]]},"759":{"position":[[354,5],[456,5]]},"760":{"position":[[452,5]]},"770":{"position":[[457,5]]},"772":{"position":[[764,5],[924,5],[1012,5],[1609,5],[2371,5]]},"773":{"position":[[554,5]]},"774":{"position":[[656,5]]},"778":{"position":[[204,5]]},"789":{"position":[[160,5],[407,5]]},"791":{"position":[[16,5],[148,5],[275,5],[413,5],[468,5]]},"792":{"position":[[143,5],[279,5],[329,5]]},"795":{"position":[[169,5],[219,5]]},"799":{"position":[[571,5],[803,5]]},"800":{"position":[[808,5],[867,5]]},"810":{"position":[[189,5],[260,5],[341,5],[406,5]]},"811":{"position":[[169,5],[240,5],[321,5],[386,5]]},"812":{"position":[[22,5],[253,5]]},"813":{"position":[[22,5],[250,5],[345,5],[409,5]]},"818":{"position":[[487,5]]},"820":{"position":[[163,5]]},"825":{"position":[[335,5]]},"829":{"position":[[633,5],[721,5],[1523,5]]},"835":{"position":[[417,7],[450,5],[499,5]]},"838":{"position":[[2198,5],[2540,5],[2803,5],[2892,5],[2980,5]]},"851":{"position":[[322,5]]},"857":{"position":[[297,5]]},"862":{"position":[[533,5],[807,5]]},"872":{"position":[[1026,5],[1707,5],[1814,5],[3254,5],[3562,5],[3965,5],[4044,5]]},"875":{"position":[[418,5],[959,5],[1068,5],[2200,5],[3094,5],[3328,5],[3441,5],[6138,5],[6233,5],[6428,5],[8403,5],[9712,5]]},"878":{"position":[[279,5]]},"882":{"position":[[396,5]]},"892":{"position":[[171,5],[256,5],[358,5]]},"893":{"position":[[222,5],[464,5]]},"898":{"position":[[2315,5],[2394,5],[4152,5]]},"904":{"position":[[708,5],[791,5],[1152,5],[1805,5]]},"906":{"position":[[988,5]]},"907":{"position":[[281,5]]},"911":{"position":[[626,5]]},"916":{"position":[[332,5]]},"917":{"position":[[135,5]]},"918":{"position":[[98,5]]},"929":{"position":[[125,5]]},"930":{"position":[[143,5]]},"931":{"position":[[153,5]]},"932":{"position":[[87,5],[143,5],[1037,5]]},"934":{"position":[[225,5]]},"939":{"position":[[150,5]]},"942":{"position":[[182,5]]},"943":{"position":[[379,5]]},"944":{"position":[[192,5]]},"945":{"position":[[133,5],[454,5]]},"946":{"position":[[154,5]]},"947":{"position":[[166,5]]},"948":{"position":[[719,5]]},"949":{"position":[[135,5]]},"951":{"position":[[377,5]]},"954":{"position":[[137,5]]},"955":{"position":[[294,5]]},"956":{"position":[[238,5],[303,5]]},"960":{"position":[[276,5]]},"962":{"position":[[747,5],[963,5]]},"966":{"position":[[531,5],[649,5]]},"967":{"position":[[116,5],[234,5]]},"968":{"position":[[501,5]]},"976":{"position":[[313,5]]},"977":{"position":[[72,5]]},"979":{"position":[[302,5]]},"988":{"position":[[242,5],[2517,5],[2846,5],[3707,5],[3835,5]]},"994":{"position":[[40,5],[272,5]]},"995":{"position":[[389,5],[657,5],[1503,5],[1652,5],[1692,5],[1814,5],[1878,5],[2007,5]]},"997":{"position":[[96,5]]},"998":{"position":[[102,5],[138,5]]},"999":{"position":[[281,5]]},"1002":{"position":[[1008,5],[1014,6]]},"1007":{"position":[[1517,5],[1675,5],[1848,5]]},"1013":{"position":[[292,5]]},"1014":{"position":[[194,5],[335,5]]},"1015":{"position":[[170,5]]},"1016":{"position":[[129,5]]},"1018":{"position":[[71,5],[202,5],[312,5],[791,5]]},"1020":{"position":[[350,5],[597,5]]},"1022":{"position":[[446,5],[640,5],[749,5],[1003,5]]},"1023":{"position":[[105,5],[296,5],[435,5],[667,5]]},"1024":{"position":[[199,5],[372,5],[446,5],[469,5]]},"1026":{"position":[[9,5],[47,5],[89,5]]},"1027":{"position":[[1,5]]},"1028":{"position":[[1,5]]},"1033":{"position":[[493,5],[621,5],[724,5],[832,5]]},"1035":{"position":[[96,5]]},"1036":{"position":[[115,5]]},"1039":{"position":[[269,5]]},"1040":{"position":[[425,5]]},"1041":{"position":[[273,5]]},"1042":{"position":[[225,5]]},"1043":{"position":[[59,5]]},"1044":{"position":[[277,5],[367,5],[478,5],[537,5]]},"1045":{"position":[[71,5],[137,5]]},"1048":{"position":[[433,5],[539,5]]},"1049":{"position":[[197,5]]},"1050":{"position":[[91,5]]},"1057":{"position":[[119,5],[448,5],[600,5]]},"1058":{"position":[[405,5]]},"1059":{"position":[[281,5]]},"1060":{"position":[[149,5]]},"1061":{"position":[[150,5]]},"1062":{"position":[[270,5]]},"1064":{"position":[[360,5]]},"1067":{"position":[[455,5],[1958,5],[2371,5]]},"1069":{"position":[[613,5],[770,5]]},"1072":{"position":[[2413,5]]},"1075":{"position":[[1,5]]},"1078":{"position":[[855,5]]},"1090":{"position":[[776,5],[952,5],[1015,5]]},"1097":{"position":[[699,5],[875,5]]},"1098":{"position":[[335,5],[429,5]]},"1099":{"position":[[309,5],[399,5]]},"1101":{"position":[[652,5]]},"1102":{"position":[[336,5],[473,5],[696,5],[1027,5]]},"1103":{"position":[[195,5],[299,5]]},"1105":{"position":[[725,5]]},"1106":{"position":[[663,5]]},"1108":{"position":[[393,5]]},"1114":{"position":[[705,5],[832,5],[933,5]]},"1115":{"position":[[313,5],[379,5],[449,5],[813,5]]},"1118":{"position":[[639,5],[765,5]]},"1121":{"position":[[445,5],[545,5],[596,5]]},"1125":{"position":[[281,5]]},"1126":{"position":[[361,5],[674,5]]},"1130":{"position":[[154,5]]},"1134":{"position":[[131,5]]},"1138":{"position":[[275,5]]},"1139":{"position":[[530,5]]},"1140":{"position":[[589,5],[723,5]]},"1144":{"position":[[179,5]]},"1145":{"position":[[519,5]]},"1146":{"position":[[224,5]]},"1148":{"position":[[935,5],[1118,5]]},"1149":{"position":[[911,5],[1003,5]]},"1154":{"position":[[739,5]]},"1158":{"position":[[187,5],[291,5],[562,5],[676,5]]},"1159":{"position":[[373,5]]},"1161":{"position":[[259,5]]},"1162":{"position":[[512,5]]},"1163":{"position":[[533,5]]},"1164":{"position":[[1151,5]]},"1165":{"position":[[723,5],[795,5],[1061,5],[1139,5]]},"1168":{"position":[[135,5]]},"1171":{"position":[[280,5]]},"1172":{"position":[[300,5]]},"1177":{"position":[[303,5],[607,5]]},"1180":{"position":[[259,5]]},"1181":{"position":[[599,5]]},"1182":{"position":[[537,5]]},"1184":{"position":[[776,5]]},"1189":{"position":[[398,5]]},"1198":{"position":[[1888,7]]},"1201":{"position":[[175,5]]},"1208":{"position":[[580,5],[715,5],[804,5],[928,5],[1071,5],[1650,5],[1733,5],[1791,5],[1906,5]]},"1210":{"position":[[415,5]]},"1211":{"position":[[670,5]]},"1218":{"position":[[562,5]]},"1219":{"position":[[510,5],[673,5],[875,5]]},"1220":{"position":[[189,5],[550,5]]},"1222":{"position":[[1386,5]]},"1226":{"position":[[211,5]]},"1227":{"position":[[689,5]]},"1231":{"position":[[1020,5],[1090,5]]},"1237":{"position":[[833,5]]},"1238":{"position":[[808,5]]},"1239":{"position":[[778,5]]},"1264":{"position":[[133,5]]},"1265":{"position":[[677,5]]},"1267":{"position":[[611,5],[705,5]]},"1271":{"position":[[1564,5]]},"1274":{"position":[[315,5]]},"1275":{"position":[[326,5]]},"1276":{"position":[[841,5],[928,5]]},"1277":{"position":[[375,5]]},"1278":{"position":[[452,5],[904,5]]},"1279":{"position":[[702,5]]},"1280":{"position":[[437,5]]},"1286":{"position":[[484,5]]},"1287":{"position":[[534,5]]},"1288":{"position":[[500,5]]},"1294":{"position":[[1130,5]]},"1309":{"position":[[1388,5]]},"1311":{"position":[[132,5],[908,5],[962,5],[1480,5],[1745,5]]},"1315":{"position":[[569,5],[659,5]]}},"keywords":{}}],["awaitcapacitordevicereadi",{"_index":159,"title":{},"content":{"11":{"position":[[527,28],[765,28]]}},"keywords":{}}],["awaitidl",{"_index":5649,"title":{"1026":{"position":[[0,12]]}},"content":{"1033":{"position":[[360,11],[940,11]]}},"keywords":{}}],["awaitinitialrepl",{"_index":4878,"title":{"994":{"position":[[0,26]]}},"content":{"854":{"position":[[1773,26]]},"994":{"position":[[6,25]]},"995":{"position":[[40,25],[440,25],[678,25],[933,25],[1124,25]]}},"keywords":{}}],["awaitinsync",{"_index":5502,"title":{"995":{"position":[[0,14]]}},"content":{"995":{"position":[[288,13],[470,13],[707,13]]}},"keywords":{}}],["awaitreplicationsinsync",{"_index":3757,"title":{},"content":{"653":{"position":[[1213,24]]}},"keywords":{}}],["awaitwritepersist",{"_index":5914,"title":{},"content":{"1090":{"position":[[1319,22]]},"1162":{"position":[[264,21]]},"1164":{"position":[[1101,22]]},"1181":{"position":[[330,21]]},"1185":{"position":[[264,22],[337,22]]}},"keywords":{}}],["awar",{"_index":939,"title":{},"content":{"66":{"position":[[105,5]]},"129":{"position":[[477,5]]},"299":{"position":[[200,5]]},"427":{"position":[[101,5]]},"991":{"position":[[4,5]]}},"keywords":{}}],["away",{"_index":439,"title":{},"content":{"27":{"position":[[156,4]]},"331":{"position":[[288,4]]},"346":{"position":[[500,4]]},"402":{"position":[[240,4]]},"410":{"position":[[2182,5]]},"424":{"position":[[348,4]]},"460":{"position":[[75,4]]},"721":{"position":[[187,4]]},"801":{"position":[[961,4]]},"839":{"position":[[890,4]]},"1124":{"position":[[262,4]]}},"keywords":{}}],["away."",{"_index":2601,"title":{},"content":{"410":{"position":[[1450,11]]}},"keywords":{}}],["awesom",{"_index":450,"title":{},"content":{"28":{"position":[[112,7]]}},"keywords":{}}],["b",{"_index":2692,"title":{"1149":{"position":[[0,2]]}},"content":{"412":{"position":[[4639,2],[5012,3]]},"691":{"position":[[252,2]]},"860":{"position":[[1258,1]]},"871":{"position":[[519,1]]},"885":{"position":[[1724,2]]},"897":{"position":[[26,1]]},"982":{"position":[[206,1],[244,1],[308,1],[446,1],[541,1]]},"1033":{"position":[[691,2]]},"1292":{"position":[[962,1],[970,1],[983,1],[991,1],[1009,1],[1017,1]]},"1309":{"position":[[565,2],[929,3]]}},"keywords":{}}],["b.id",{"_index":5102,"title":{},"content":{"885":{"position":[[1873,5],[1903,5]]}},"keywords":{}}],["b.updatedat",{"_index":5100,"title":{},"content":{"885":{"position":[[1756,12],[1800,12],[1844,12]]}},"keywords":{}}],["b1",{"_index":5450,"title":{},"content":{"987":{"position":[[175,2],[211,2],[323,2],[408,3],[668,2],[712,2]]}},"keywords":{}}],["baar",{"_index":3779,"title":{},"content":{"659":{"position":[[536,7]]}},"keywords":{}}],["babel",{"_index":4069,"title":{},"content":{"728":{"position":[[143,5]]},"1266":{"position":[[802,6]]}},"keywords":{}}],["babel.config",{"_index":6313,"title":{},"content":{"1266":{"position":[[425,17]]}},"keywords":{}}],["babel/polyfil",{"_index":4070,"title":{},"content":{"728":{"position":[[172,15],[265,18]]}},"keywords":{}}],["babelconfig",{"_index":6311,"title":{},"content":{"1266":{"position":[[376,11],[827,11]]}},"keywords":{}}],["back",{"_index":1173,"title":{},"content":{"157":{"position":[[387,4]]},"255":{"position":[[173,4]]},"353":{"position":[[490,4]]},"358":{"position":[[557,5]]},"392":{"position":[[3458,4]]},"481":{"position":[[90,4]]},"489":{"position":[[827,4]]},"491":{"position":[[105,4]]},"495":{"position":[[174,5],[721,4]]},"524":{"position":[[43,6]]},"621":{"position":[[304,4]]},"698":{"position":[[1861,4]]},"701":{"position":[[615,5]]},"711":{"position":[[665,4]]},"871":{"position":[[205,4]]},"987":{"position":[[457,4]]},"988":{"position":[[6086,4]]},"1006":{"position":[[291,4]]},"1007":{"position":[[607,4]]},"1250":{"position":[[233,4]]},"1301":{"position":[[1100,4]]},"1304":{"position":[[969,4]]},"1316":{"position":[[1695,4],[2797,4],[2933,4]]}},"keywords":{}}],["backbon",{"_index":1676,"title":{"489":{"position":[[20,8]]}},"content":{"288":{"position":[[63,8]]}},"keywords":{}}],["backend",{"_index":220,"title":{"82":{"position":[[49,8]]},"113":{"position":[[49,8]]},"199":{"position":[[78,7]]},"238":{"position":[[54,8]]},"246":{"position":[[61,7]]},"249":{"position":[[22,8]]},"293":{"position":[[36,8]]},"1147":{"position":[[24,7]]}},"content":{"14":{"position":[[576,8],[1040,8]]},"15":{"position":[[374,7]]},"16":{"position":[[129,7]]},"18":{"position":[[350,7]]},"19":{"position":[[1025,9]]},"20":{"position":[[18,7],[217,7]]},"21":{"position":[[157,8]]},"27":{"position":[[13,7],[113,7],[235,7]]},"29":{"position":[[189,7]]},"38":{"position":[[132,7]]},"39":{"position":[[413,7]]},"41":{"position":[[362,7]]},"42":{"position":[[186,8],[340,7]]},"43":{"position":[[226,9],[298,9]]},"46":{"position":[[506,7]]},"82":{"position":[[69,7]]},"113":{"position":[[103,7],[191,7]]},"162":{"position":[[290,8]]},"174":{"position":[[2912,7],[3019,7],[3175,7]]},"201":{"position":[[429,8]]},"202":{"position":[[423,7]]},"204":{"position":[[227,7]]},"207":{"position":[[386,7]]},"208":{"position":[[227,7],[312,7]]},"210":{"position":[[36,8]]},"211":{"position":[[605,8]]},"212":{"position":[[433,7]]},"223":{"position":[[53,7],[324,8]]},"238":{"position":[[94,7],[199,8],[268,7]]},"249":{"position":[[289,7]]},"255":{"position":[[339,7],[1759,7]]},"260":{"position":[[51,7],[238,8],[330,8]]},"263":{"position":[[108,8]]},"293":{"position":[[68,7],[276,7]]},"309":{"position":[[332,7]]},"312":{"position":[[138,7]]},"313":{"position":[[158,9]]},"318":{"position":[[133,8]]},"328":{"position":[[57,9]]},"336":{"position":[[32,8]]},"368":{"position":[[130,9]]},"372":{"position":[[50,7]]},"380":{"position":[[273,8]]},"381":{"position":[[109,9],[351,9]]},"410":{"position":[[831,7]]},"411":{"position":[[371,8],[1163,7],[1551,7],[4940,7]]},"412":{"position":[[906,7],[1568,7],[2930,7],[12297,7],[12813,7]]},"477":{"position":[[238,8]]},"480":{"position":[[1023,8]]},"481":{"position":[[260,8]]},"489":{"position":[[180,8]]},"556":{"position":[[1625,7]]},"561":{"position":[[210,8]]},"581":{"position":[[32,8]]},"610":{"position":[[1512,7]]},"612":{"position":[[439,7]]},"626":{"position":[[302,7],[407,7],[445,7],[762,7]]},"630":{"position":[[748,7]]},"632":{"position":[[686,8],[892,8]]},"634":{"position":[[670,7]]},"685":{"position":[[466,7]]},"686":{"position":[[452,7],[611,8],[632,7]]},"696":{"position":[[1764,7]]},"697":{"position":[[424,7],[519,8]]},"698":{"position":[[1616,8],[1698,7]]},"699":{"position":[[53,8],[394,7]]},"700":{"position":[[87,8],[276,7]]},"701":{"position":[[372,7],[593,8],[999,7]]},"702":{"position":[[582,7]]},"704":{"position":[[552,7]]},"705":{"position":[[321,8]]},"710":{"position":[[397,8]]},"715":{"position":[[318,7]]},"740":{"position":[[307,7]]},"756":{"position":[[413,7]]},"778":{"position":[[125,7],[606,8]]},"780":{"position":[[722,7]]},"781":{"position":[[143,7],[301,7],[630,8],[890,7]]},"782":{"position":[[86,7],[182,7]]},"784":{"position":[[170,7]]},"785":{"position":[[621,7]]},"836":{"position":[[1894,8]]},"840":{"position":[[578,8]]},"841":{"position":[[567,7],[1548,8]]},"860":{"position":[[35,7],[66,7],[1026,8]]},"871":{"position":[[656,7]]},"875":{"position":[[7659,7],[9226,7]]},"886":{"position":[[1634,7],[3450,8],[4994,8],[5072,7]]},"888":{"position":[[884,7]]},"890":{"position":[[530,7]]},"896":{"position":[[12,8]]},"981":{"position":[[359,8],[529,7],[567,8],[619,7],[703,8],[1679,7]]},"984":{"position":[[245,7],[276,7],[553,7]]},"985":{"position":[[38,8],[67,7],[142,7],[671,7]]},"986":{"position":[[538,7]]},"988":{"position":[[907,7],[1778,7],[4053,8],[4737,7],[5282,7]]},"991":{"position":[[79,7],[104,7]]},"996":{"position":[[115,8],[310,7]]},"1002":{"position":[[880,7]]},"1004":{"position":[[568,7],[718,7]]},"1005":{"position":[[103,7]]},"1072":{"position":[[1706,8]]},"1123":{"position":[[780,8]]},"1124":{"position":[[1882,9],[1984,7]]},"1147":{"position":[[46,7],[245,7],[327,8]]},"1149":{"position":[[32,7],[481,8],[560,7]]},"1301":{"position":[[439,7]]},"1304":{"position":[[1895,7]]},"1308":{"position":[[137,7],[340,7],[356,7],[434,7]]},"1314":{"position":[[164,8]]},"1316":{"position":[[60,7]]},"1320":{"position":[[92,7],[271,8],[284,7],[496,7]]}},"keywords":{}}],["backend"",{"_index":1516,"title":{},"content":{"244":{"position":[[1272,13]]},"412":{"position":[[2784,13]]}},"keywords":{}}],["backend.learn",{"_index":3690,"title":{},"content":{"628":{"position":[[172,13]]}},"keywords":{}}],["backend.us",{"_index":6073,"title":{},"content":{"1148":{"position":[[275,12]]}},"keywords":{}}],["backend/protocol",{"_index":6015,"title":{},"content":{"1124":{"position":[[2228,17]]}},"keywords":{}}],["backendsencrypt",{"_index":3142,"title":{},"content":{"483":{"position":[[275,18]]},"631":{"position":[[419,18]]}},"keywords":{}}],["backendsfield",{"_index":3118,"title":{},"content":{"479":{"position":[[226,13]]}},"keywords":{}}],["background",{"_index":321,"title":{},"content":{"19":{"position":[[170,11]]},"196":{"position":[[200,10]]},"384":{"position":[[185,10]]},"407":{"position":[[259,11]]},"410":{"position":[[2061,10]]},"415":{"position":[[207,10]]},"420":{"position":[[1596,11]]},"421":{"position":[[832,10]]},"460":{"position":[[219,11]]},"487":{"position":[[415,11]]},"491":{"position":[[229,11],[1087,11]]},"618":{"position":[[283,10]]},"699":{"position":[[910,10]]},"704":{"position":[[339,10]]},"774":{"position":[[309,11],[1087,10]]},"1093":{"position":[[493,10]]},"1185":{"position":[[159,11]]},"1292":{"position":[[614,11]]},"1313":{"position":[[837,10]]},"1318":{"position":[[832,10]]}},"keywords":{}}],["background.on",{"_index":3980,"title":{},"content":{"707":{"position":[[150,14]]}},"keywords":{}}],["backpressur",{"_index":3666,"title":{},"content":{"622":{"position":[[105,12]]}},"keywords":{}}],["backup",{"_index":2111,"title":{"645":{"position":[[3,6]]},"647":{"position":[[9,7]]},"648":{"position":[[5,7]]},"973":{"position":[[0,9]]}},"content":{"365":{"position":[[1498,6]]},"412":{"position":[[8385,7],[8892,6]]},"417":{"position":[[203,7],[329,7]]},"647":{"position":[[199,6],[259,6],[297,6]]},"648":{"position":[[29,6],[74,6],[154,6],[189,6],[315,6]]},"649":{"position":[[77,6],[145,6],[407,6]]},"650":{"position":[[55,7]]},"702":{"position":[[374,7]]},"793":{"position":[[1105,6]]},"1094":{"position":[[443,8]]}},"keywords":{}}],["backup/repl",{"_index":2594,"title":{},"content":{"410":{"position":[[894,18]]}},"keywords":{}}],["backupopt",{"_index":3730,"title":{},"content":{"647":{"position":[[157,13]]},"648":{"position":[[99,13]]},"649":{"position":[[98,13]]}},"keywords":{}}],["backupst",{"_index":3731,"title":{},"content":{"647":{"position":[[383,11]]},"648":{"position":[[232,11]]},"649":{"position":[[188,11]]}},"keywords":{}}],["backupstate.awaitinitialbackup",{"_index":3733,"title":{},"content":{"647":{"position":[[437,33]]},"648":{"position":[[380,33]]}},"keywords":{}}],["backupstate.writeevents$.subscribe(writeev",{"_index":3737,"title":{},"content":{"649":{"position":[[257,45]]}},"keywords":{}}],["backupstate2",{"_index":3734,"title":{},"content":{"647":{"position":[[523,12]]}},"keywords":{}}],["backupstate2.awaitinitialbackup",{"_index":3735,"title":{},"content":{"647":{"position":[[578,34]]}},"keywords":{}}],["backward",{"_index":859,"title":{},"content":{"57":{"position":[[246,8]]},"459":{"position":[[1168,9]]},"466":{"position":[[510,9]]},"1134":{"position":[[284,9]]},"1239":{"position":[[437,9]]},"1270":{"position":[[210,9]]},"1276":{"position":[[316,9]]}},"keywords":{}}],["bad",{"_index":403,"title":{},"content":{"24":{"position":[[477,3]]},"616":{"position":[[840,3]]},"626":{"position":[[429,3]]},"709":{"position":[[388,3]]},"1321":{"position":[[489,3]]}},"keywords":{}}],["balanc",{"_index":1611,"title":{},"content":{"266":{"position":[[427,9]]},"365":{"position":[[741,8]]},"412":{"position":[[6245,7]]},"444":{"position":[[855,7]]},"698":{"position":[[2778,7],[2828,7],[2896,7],[2963,7]]},"1080":{"position":[[449,8]]},"1088":{"position":[[744,8]]},"1089":{"position":[[260,9]]}},"keywords":{}}],["bandwidth",{"_index":719,"title":{"780":{"position":[[31,10]]}},"content":{"46":{"position":[[635,9]]},"57":{"position":[[425,9]]},"204":{"position":[[284,9]]},"361":{"position":[[440,10]]},"408":{"position":[[2124,9],[3017,9],[3362,9]]},"534":{"position":[[667,9]]},"594":{"position":[[665,9]]},"632":{"position":[[227,9]]},"780":{"position":[[24,9],[119,9],[222,9],[629,10]]},"902":{"position":[[839,9],[876,9]]},"1009":{"position":[[843,9]]}},"keywords":{}}],["bank",{"_index":1695,"title":{},"content":{"295":{"position":[[247,5]]},"412":{"position":[[6151,7]]},"700":{"position":[[821,7]]}},"keywords":{}}],["bar",{"_index":3781,"title":{},"content":{"659":{"position":[[621,5]]},"662":{"position":[[2639,8],[2728,5],[2816,5]]},"710":{"position":[[1946,8],[2035,5],[2123,5]]},"711":{"position":[[1376,8]]},"752":{"position":[[339,4]]},"806":{"position":[[794,5]]},"838":{"position":[[2853,8],[2942,5],[3030,5]]},"942":{"position":[[233,5]]},"943":{"position":[[441,5]]},"947":{"position":[[241,6]]},"1014":{"position":[[257,5],[396,5]]},"1015":{"position":[[233,5]]},"1018":{"position":[[560,6],[605,7],[881,5]]},"1035":{"position":[[147,5]]},"1078":{"position":[[971,5],[1098,5]]},"1177":{"position":[[397,6]]},"1220":{"position":[[370,5],[580,4],[631,5]]}},"keywords":{}}],["bar1",{"_index":5333,"title":{},"content":{"944":{"position":[[249,6]]}},"keywords":{}}],["bar2",{"_index":5335,"title":{},"content":{"944":{"position":[[285,6]]},"946":{"position":[[205,6]]},"947":{"position":[[223,6]]},"1018":{"position":[[193,8]]}},"keywords":{}}],["barrier",{"_index":2835,"title":{},"content":{"420":{"position":[[866,7]]},"898":{"position":[[4067,7]]}},"keywords":{}}],["base",{"_index":114,"title":{"68":{"position":[[10,5]]},"99":{"position":[[10,5]]},"150":{"position":[[15,5]]},"152":{"position":[[19,5]]},"153":{"position":[[27,4]]},"161":{"position":[[20,4]]},"226":{"position":[[10,5]]},"279":{"position":[[16,5]]},"348":{"position":[[5,5]]},"349":{"position":[[9,5]]},"1024":{"position":[[23,5]]},"1195":{"position":[[8,5]]},"1196":{"position":[[12,5]]},"1247":{"position":[[12,5]]},"1253":{"position":[[13,5]]}},"content":{"8":{"position":[[475,4],[522,5]]},"19":{"position":[[88,6]]},"26":{"position":[[21,5],[43,5]]},"31":{"position":[[54,5]]},"34":{"position":[[348,5]]},"35":{"position":[[97,5],[445,5]]},"36":{"position":[[362,5]]},"38":{"position":[[471,5]]},"40":{"position":[[15,5]]},"45":{"position":[[152,5],[320,5]]},"47":{"position":[[90,6],[149,5],[217,5]]},"51":{"position":[[96,5]]},"60":{"position":[[55,5]]},"64":{"position":[[87,5]]},"66":{"position":[[189,5]]},"67":{"position":[[106,5]]},"71":{"position":[[41,5]]},"83":{"position":[[73,5]]},"98":{"position":[[121,5]]},"114":{"position":[[670,5]]},"116":{"position":[[172,5]]},"126":{"position":[[274,5]]},"129":{"position":[[116,5]]},"131":{"position":[[795,5]]},"134":{"position":[[220,5]]},"135":{"position":[[257,5]]},"152":{"position":[[150,5],[246,5]]},"153":{"position":[[31,5],[59,4]]},"155":{"position":[[40,4],[172,4]]},"161":{"position":[[23,4],[126,5]]},"167":{"position":[[120,4]]},"169":{"position":[[204,6]]},"170":{"position":[[35,4]]},"174":{"position":[[22,5]]},"179":{"position":[[96,5],[318,5]]},"181":{"position":[[88,5]]},"189":{"position":[[630,5],[694,5]]},"221":{"position":[[55,5]]},"223":{"position":[[409,5]]},"227":{"position":[[143,5]]},"243":{"position":[[957,5]]},"244":{"position":[[884,5]]},"249":{"position":[[260,5]]},"255":{"position":[[253,5],[955,5]]},"265":{"position":[[272,5]]},"266":{"position":[[1100,5]]},"279":{"position":[[59,5]]},"287":{"position":[[362,5]]},"298":{"position":[[480,5]]},"299":{"position":[[1738,5]]},"317":{"position":[[35,5]]},"336":{"position":[[486,5]]},"353":{"position":[[738,5]]},"354":{"position":[[35,5],[1646,5]]},"360":{"position":[[269,5],[722,5]]},"362":{"position":[[6,5]]},"365":{"position":[[1242,5]]},"368":{"position":[[53,5]]},"369":{"position":[[841,5]]},"390":{"position":[[449,5],[809,5],[1348,5],[1435,5],[1575,5]]},"394":{"position":[[439,5],[990,5],[1085,5]]},"401":{"position":[[297,4],[344,4],[391,4],[438,4]]},"408":{"position":[[2037,5],[2575,4]]},"412":{"position":[[4192,5],[5992,5],[12089,5]]},"414":{"position":[[263,5]]},"419":{"position":[[1865,5]]},"427":{"position":[[999,5]]},"430":{"position":[[240,5]]},"433":{"position":[[103,6]]},"435":{"position":[[32,5]]},"438":{"position":[[160,5]]},"444":{"position":[[570,5],[826,5]]},"450":{"position":[[604,4]]},"452":{"position":[[361,4],[737,5]]},"453":{"position":[[486,4],[792,5]]},"455":{"position":[[109,5],[385,5]]},"456":{"position":[[153,5]]},"461":{"position":[[1093,5]]},"468":{"position":[[262,5]]},"483":{"position":[[1083,5]]},"489":{"position":[[189,5]]},"496":{"position":[[201,5]]},"502":{"position":[[36,5]]},"504":{"position":[[489,5]]},"521":{"position":[[85,5]]},"524":{"position":[[1015,5]]},"525":{"position":[[686,5]]},"535":{"position":[[128,5]]},"538":{"position":[[64,5],[105,5],[228,5]]},"547":{"position":[[55,5]]},"554":{"position":[[459,5],[713,5]]},"560":{"position":[[54,5]]},"561":{"position":[[248,5]]},"563":{"position":[[627,5],[1038,5]]},"566":{"position":[[285,5],[366,5]]},"567":{"position":[[408,5],[827,5]]},"571":{"position":[[531,5]]},"574":{"position":[[876,5]]},"595":{"position":[[128,5]]},"598":{"position":[[64,5],[105,5],[229,5]]},"607":{"position":[[55,5]]},"620":{"position":[[537,5]]},"631":{"position":[[22,5],[312,5]]},"632":{"position":[[132,5],[886,5],[1257,5]]},"661":{"position":[[17,5],[1450,5]]},"662":{"position":[[237,5]]},"670":{"position":[[291,5]]},"688":{"position":[[912,5],[1011,5]]},"690":{"position":[[185,5],[387,5]]},"698":{"position":[[1963,5]]},"700":{"position":[[436,5]]},"703":{"position":[[23,5],[1062,5],[1312,5]]},"705":{"position":[[181,5],[477,5],[707,5]]},"710":{"position":[[123,5]]},"711":{"position":[[17,5],[1944,5]]},"714":{"position":[[749,5],[815,5]]},"717":{"position":[[94,5],[196,5]]},"723":{"position":[[2093,5],[2363,5]]},"724":{"position":[[720,5]]},"729":{"position":[[49,5]]},"730":{"position":[[124,4]]},"798":{"position":[[492,5]]},"831":{"position":[[302,5]]},"835":{"position":[[219,6],[396,6],[681,5]]},"836":{"position":[[19,5],[734,5],[1160,5],[1284,5]]},"837":{"position":[[949,5]]},"838":{"position":[[266,5],[991,5]]},"839":{"position":[[240,5]]},"840":{"position":[[24,5]]},"841":{"position":[[177,5],[193,5],[213,5],[245,6],[364,5],[1187,5]]},"860":{"position":[[1098,5]]},"875":{"position":[[1809,5]]},"904":{"position":[[424,5]]},"984":{"position":[[83,5]]},"1009":{"position":[[555,5],[570,5]]},"1041":{"position":[[22,5],[56,5]]},"1042":{"position":[[26,5]]},"1071":{"position":[[115,5]]},"1126":{"position":[[335,5],[648,5]]},"1132":{"position":[[348,5],[389,5]]},"1148":{"position":[[269,5],[698,5]]},"1151":{"position":[[112,5]]},"1154":{"position":[[181,5]]},"1159":{"position":[[79,5]]},"1172":{"position":[[524,5]]},"1173":{"position":[[11,5]]},"1178":{"position":[[111,5]]},"1195":{"position":[[41,5]]},"1202":{"position":[[49,5]]},"1219":{"position":[[458,5],[625,5]]},"1242":{"position":[[18,5]]},"1243":{"position":[[28,5]]},"1244":{"position":[[23,5]]},"1247":{"position":[[165,5],[182,5],[373,5],[546,5]]},"1249":{"position":[[106,5],[410,5]]},"1251":{"position":[[15,5]]},"1252":{"position":[[15,5]]},"1257":{"position":[[25,5]]},"1270":{"position":[[62,5]]},"1292":{"position":[[224,6]]},"1297":{"position":[[10,5]]},"1313":{"position":[[476,5],[1049,5]]},"1316":{"position":[[798,5]]},"1318":{"position":[[1104,5]]},"1320":{"position":[[628,5]]},"1321":{"position":[[693,5]]},"1322":{"position":[[209,5]]},"1323":{"position":[[107,5]]},"1324":{"position":[[582,5]]}},"keywords":{}}],["base64",{"_index":3007,"title":{},"content":{"460":{"position":[[603,6]]},"918":{"position":[[45,6]]},"1143":{"position":[[292,6]]},"1282":{"position":[[214,6]]}},"keywords":{}}],["base64databas",{"_index":5310,"title":{},"content":{"931":{"position":[[136,14]]}},"keywords":{}}],["base64str",{"_index":5309,"title":{},"content":{"931":{"position":[[59,13]]}},"keywords":{}}],["basedir",{"_index":6314,"title":{},"content":{"1266":{"position":[[449,7],[562,7]]}},"keywords":{}}],["basepath",{"_index":5909,"title":{},"content":{"1090":{"position":[[889,9]]},"1130":{"position":[[236,9]]}},"keywords":{}}],["basestorag",{"_index":6277,"title":{},"content":{"1231":{"position":[[782,11],[899,11],[1074,11]]}},"keywords":{}}],["basi",{"_index":895,"title":{},"content":{"63":{"position":[[131,5]]},"396":{"position":[[504,5]]},"424":{"position":[[186,6]]},"1323":{"position":[[216,6]]}},"keywords":{}}],["basic",{"_index":481,"title":{"558":{"position":[[23,5]]},"561":{"position":[[22,5]]}},"content":{"29":{"position":[[345,5]]},"41":{"position":[[141,9]]},"47":{"position":[[509,5]]},"63":{"position":[[213,5]]},"321":{"position":[[343,5]]},"388":{"position":[[90,5]]},"394":{"position":[[118,5]]},"412":{"position":[[5255,9]]},"456":{"position":[[23,5]]},"520":{"position":[[234,5]]},"522":{"position":[[264,5]]},"544":{"position":[[55,5]]},"554":{"position":[[100,5]]},"566":{"position":[[218,5]]},"567":{"position":[[948,7]]},"604":{"position":[[55,5]]},"611":{"position":[[918,6]]},"698":{"position":[[3230,9]]},"802":{"position":[[547,5]]},"839":{"position":[[690,5]]},"841":{"position":[[339,5],[827,5],[1398,5]]},"848":{"position":[[504,7]]},"876":{"position":[[38,6]]},"906":{"position":[[478,5]]},"950":{"position":[[11,9]]},"1055":{"position":[[13,5]]},"1123":{"position":[[515,5]]},"1274":{"position":[[604,5]]},"1279":{"position":[[991,5]]}},"keywords":{}}],["batch",{"_index":513,"title":{"1294":{"position":[[0,7]]}},"content":{"33":{"position":[[137,8]]},"146":{"position":[[71,8]]},"277":{"position":[[174,7]]},"392":{"position":[[2515,7],[3046,5],[3092,6],[4965,5]]},"411":{"position":[[780,8]]},"487":{"position":[[111,5],[208,8]]},"752":{"position":[[795,5]]},"759":{"position":[[750,5],[984,5]]},"760":{"position":[[746,5],[872,5]]},"875":{"position":[[5880,5]]},"885":{"position":[[2343,5]]},"981":{"position":[[865,8]]},"983":{"position":[[56,7],[757,7],[825,8]]},"988":{"position":[[2898,5],[5302,5]]},"1125":{"position":[[642,8],[676,5]]},"1134":{"position":[[632,5]]},"1138":{"position":[[401,7]]},"1143":{"position":[[349,7]]},"1164":{"position":[[246,6]]},"1294":{"position":[[369,7],[698,5],[1017,7],[1854,7],[1928,5],[2041,5],[2122,7]]},"1295":{"position":[[877,7],[1106,7]]},"1296":{"position":[[369,7],[1242,7],[1672,7]]}},"keywords":{}}],["batches.simplifi",{"_index":3696,"title":{},"content":{"630":{"position":[[866,18]]}},"keywords":{}}],["batchsiz",{"_index":1354,"title":{},"content":{"209":{"position":[[1017,10]]},"255":{"position":[[1352,10]]},"392":{"position":[[2734,10],[4640,10]]},"632":{"position":[[2397,10]]},"724":{"position":[[1150,10]]},"749":{"position":[[22514,9]]},"759":{"position":[[731,10]]},"760":{"position":[[727,10]]},"846":{"position":[[723,10],[1149,10]]},"862":{"position":[[1389,10],[1415,10]]},"866":{"position":[[858,10],[883,10]]},"872":{"position":[[2586,10],[2611,10],[4602,10],[4627,10]]},"875":{"position":[[1896,9],[3174,11]]},"886":{"position":[[1559,11],[1753,10],[2845,9],[2945,10],[4052,10],[4157,10]]},"898":{"position":[[3466,10],[3879,10]]},"988":{"position":[[2994,10],[3545,10],[3966,10],[4475,10]]},"1125":{"position":[[740,10]]},"1134":{"position":[[770,10]]},"1138":{"position":[[438,9],[604,10]]},"1164":{"position":[[286,10]]},"1294":{"position":[[1494,11]]}},"keywords":{}}],["batteri",{"_index":2744,"title":{},"content":{"412":{"position":[[10701,7]]},"618":{"position":[[465,7]]},"1003":{"position":[[180,8]]}},"keywords":{}}],["battl",{"_index":2170,"title":{},"content":{"386":{"position":[[9,6]]},"710":{"position":[[322,6]]},"1199":{"position":[[6,6]]}},"keywords":{}}],["be",{"_index":645,"title":{},"content":{"41":{"position":[[22,5]]},"76":{"position":[[1,5]]},"174":{"position":[[1259,5]]},"207":{"position":[[363,5]]},"404":{"position":[[491,5]]},"408":{"position":[[615,5]]},"410":{"position":[[955,5]]},"411":{"position":[[637,5]]},"418":{"position":[[233,5]]},"419":{"position":[[346,5]]},"450":{"position":[[719,5]]},"460":{"position":[[145,5]]},"614":{"position":[[682,5]]},"688":{"position":[[1069,5]]},"717":{"position":[[1323,5]]},"837":{"position":[[284,5],[782,5]]},"840":{"position":[[337,5],[428,5]]},"885":{"position":[[434,5]]},"886":{"position":[[4834,5]]},"988":{"position":[[1592,5],[1753,5]]},"1180":{"position":[[349,5]]},"1184":{"position":[[173,5]]},"1304":{"position":[[1512,5],[1777,5]]},"1311":{"position":[[349,7]]}},"keywords":{}}],["bearer",{"_index":4833,"title":{},"content":{"848":{"position":[[47,6],[439,6],[900,6]]},"878":{"position":[[512,7]]},"880":{"position":[[424,7]]},"886":{"position":[[1863,7],[3160,7],[4128,7]]}},"keywords":{}}],["beat",{"_index":691,"title":{"44":{"position":[[51,5]]}},"content":{},"keywords":{}}],["becam",{"_index":4591,"title":{},"content":{"780":{"position":[[166,6]]},"1198":{"position":[[345,6]]}},"keywords":{}}],["becom",{"_index":912,"title":{},"content":{"65":{"position":[[503,7]]},"89":{"position":[[169,7]]},"90":{"position":[[64,7]]},"97":{"position":[[40,7]]},"122":{"position":[[249,7]]},"133":{"position":[[243,7]]},"152":{"position":[[26,6]]},"173":{"position":[[341,7]]},"174":{"position":[[2154,7]]},"232":{"position":[[16,6]]},"255":{"position":[[1793,7]]},"265":{"position":[[667,6]]},"320":{"position":[[391,7]]},"321":{"position":[[397,6]]},"358":{"position":[[447,7]]},"399":{"position":[[443,7]]},"402":{"position":[[316,7]]},"404":{"position":[[228,6]]},"408":{"position":[[3221,7],[5436,6]]},"411":{"position":[[2027,7]]},"412":{"position":[[5829,6],[7311,6],[10215,6],[12769,7]]},"416":{"position":[[432,7]]},"421":{"position":[[732,6],[1212,6]]},"478":{"position":[[219,7]]},"548":{"position":[[428,7]]},"608":{"position":[[426,7]]},"613":{"position":[[920,6]]},"701":{"position":[[724,7]]},"709":{"position":[[458,7],[801,6]]},"739":{"position":[[168,7],[570,7]]},"784":{"position":[[279,8]]},"829":{"position":[[2033,7]]},"974":{"position":[[54,7]]},"985":{"position":[[647,6]]},"1003":{"position":[[126,7],[202,7],[268,7],[307,7]]},"1085":{"position":[[2472,6]]},"1304":{"position":[[699,7]]},"1316":{"position":[[3796,6]]}},"keywords":{}}],["befor",{"_index":458,"title":{},"content":{"28":{"position":[[350,6]]},"151":{"position":[[1,6]]},"188":{"position":[[1607,6]]},"304":{"position":[[323,6]]},"360":{"position":[[184,6]]},"398":{"position":[[643,6]]},"412":{"position":[[121,6],[15364,6]]},"427":{"position":[[720,6]]},"463":{"position":[[1,6]]},"469":{"position":[[1065,6]]},"551":{"position":[[496,6]]},"555":{"position":[[122,6]]},"566":{"position":[[1311,6]]},"653":{"position":[[427,6]]},"666":{"position":[[1,6]]},"667":{"position":[[1,6]]},"676":{"position":[[262,6]]},"683":{"position":[[812,7]]},"696":{"position":[[361,6]]},"703":{"position":[[1678,6]]},"719":{"position":[[468,6]]},"727":{"position":[[80,7]]},"749":{"position":[[13297,6]]},"759":{"position":[[1532,6]]},"767":{"position":[[387,6]]},"768":{"position":[[356,6]]},"770":{"position":[[635,6]]},"846":{"position":[[789,6],[1208,6]]},"849":{"position":[[143,6]]},"857":{"position":[[27,6]]},"884":{"position":[[1,6]]},"886":{"position":[[1276,6],[3017,6]]},"888":{"position":[[92,6]]},"898":{"position":[[1289,6],[3646,6],[3767,6]]},"904":{"position":[[1,6]]},"911":{"position":[[387,6]]},"912":{"position":[[306,6]]},"916":{"position":[[1,6]]},"932":{"position":[[357,6]]},"943":{"position":[[248,6]]},"952":{"position":[[83,6]]},"958":{"position":[[720,6]]},"971":{"position":[[195,6]]},"982":{"position":[[146,6]]},"988":{"position":[[3037,6],[4553,6]]},"994":{"position":[[227,6]]},"1038":{"position":[[109,6]]},"1041":{"position":[[104,7]]},"1084":{"position":[[49,6]]},"1085":{"position":[[2944,6],[3653,6]]},"1106":{"position":[[303,6]]},"1119":{"position":[[326,6]]},"1164":{"position":[[1206,6]]},"1165":{"position":[[619,6]]},"1289":{"position":[[112,6]]},"1316":{"position":[[1664,6]]}},"keywords":{}}],["before.when",{"_index":6470,"title":{},"content":{"1300":{"position":[[752,11]]}},"keywords":{}}],["beforeunload",{"_index":6471,"title":{},"content":{"1300":{"position":[[785,12],[907,12]]}},"keywords":{}}],["began",{"_index":2852,"title":{},"content":{"421":{"position":[[372,5]]}},"keywords":{}}],["begin",{"_index":1075,"title":{},"content":{"119":{"position":[[4,5]]},"206":{"position":[[198,5]]},"285":{"position":[[155,5]]},"411":{"position":[[3142,10]]},"522":{"position":[[78,5]]},"796":{"position":[[938,9]]},"1002":{"position":[[54,9]]},"1207":{"position":[[10,9]]}},"keywords":{}}],["beginn",{"_index":4892,"title":{},"content":{"861":{"position":[[132,9]]}},"keywords":{}}],["behav",{"_index":64,"title":{},"content":{"4":{"position":[[128,6]]},"14":{"position":[[702,7]]},"301":{"position":[[707,7]]},"346":{"position":[[583,7]]},"412":{"position":[[8219,7]]},"462":{"position":[[562,6]]},"679":{"position":[[300,8]]},"689":{"position":[[355,6]]},"749":{"position":[[16659,7]]},"830":{"position":[[332,7]]},"881":{"position":[[17,7],[412,8]]},"956":{"position":[[217,6]]},"1018":{"position":[[19,7]]}},"keywords":{}}],["behavior",{"_index":76,"title":{},"content":{"5":{"position":[[79,9]]},"16":{"position":[[463,8]]},"38":{"position":[[285,8],[462,8]]},"147":{"position":[[238,8]]},"168":{"position":[[370,10]]},"299":{"position":[[683,8]]},"396":{"position":[[1962,8]]},"427":{"position":[[1274,8]]},"437":{"position":[[88,8]]},"618":{"position":[[379,8]]},"660":{"position":[[129,8]]},"749":{"position":[[5779,8]]},"770":{"position":[[177,8]]},"802":{"position":[[458,10]]},"828":{"position":[[418,8]]},"948":{"position":[[320,8]]},"1065":{"position":[[712,8]]},"1085":{"position":[[2349,9]]},"1115":{"position":[[562,8],[762,9]]},"1126":{"position":[[314,9]]},"1164":{"position":[[63,9],[501,8]]},"1188":{"position":[[338,9]]},"1305":{"position":[[345,8]]}},"keywords":{}}],["behavior.multi",{"_index":5433,"title":{},"content":{"981":{"position":[[1484,14]]}},"keywords":{}}],["behaviorsubject",{"_index":5743,"title":{},"content":{"1058":{"position":[[367,16]]}},"keywords":{}}],["behaviorsubjectse",{"_index":5742,"title":{},"content":{"1058":{"position":[[4,18]]}},"keywords":{}}],["behind",{"_index":1161,"title":{},"content":{"152":{"position":[[126,6]]},"354":{"position":[[1234,6]]},"361":{"position":[[1119,6]]},"421":{"position":[[894,7]]},"486":{"position":[[149,6]]},"828":{"position":[[332,6]]}},"keywords":{}}],["belong",{"_index":2512,"title":{},"content":{"405":{"position":[[60,7]]},"412":{"position":[[10815,6]]},"808":{"position":[[77,7]]},"937":{"position":[[131,6]]}},"keywords":{}}],["below",{"_index":1540,"title":{},"content":{"247":{"position":[[90,5]]},"300":{"position":[[119,5]]},"315":{"position":[[108,5]]},"334":{"position":[[1,5]]},"391":{"position":[[253,5]]},"480":{"position":[[1,5]]},"485":{"position":[[126,5]]},"491":{"position":[[1478,7]]},"538":{"position":[[148,5]]},"554":{"position":[[230,5]]},"579":{"position":[[95,5]]},"598":{"position":[[149,5]]},"632":{"position":[[482,6]]},"798":{"position":[[711,5]]},"875":{"position":[[551,5],[592,5],[1181,5],[4376,5]]},"988":{"position":[[4768,6]]},"1066":{"position":[[517,5]]},"1097":{"position":[[820,6]]},"1149":{"position":[[491,5]]}},"keywords":{}}],["benchmark",{"_index":2427,"title":{"399":{"position":[[12,11]]},"1190":{"position":[[25,10]]}},"content":{"399":{"position":[[533,10]]},"401":{"position":[[602,11]]},"471":{"position":[[49,10]]},"703":{"position":[[952,9]]},"1292":{"position":[[31,10]]}},"keywords":{}}],["benchmarks.eas",{"_index":6095,"title":{},"content":{"1156":{"position":[[232,15]]}},"keywords":{}}],["benefici",{"_index":904,"title":{},"content":{"65":{"position":[[100,10]]},"74":{"position":[[49,10]]},"169":{"position":[[240,10]]},"216":{"position":[[254,10]]},"220":{"position":[[242,10]]},"375":{"position":[[34,10]]},"508":{"position":[[118,10]]},"584":{"position":[[206,10]]},"723":{"position":[[609,10]]}},"keywords":{}}],["benefit",{"_index":401,"title":{"85":{"position":[[10,8]]},"151":{"position":[[38,7]]},"265":{"position":[[22,9]]},"410":{"position":[[16,9]]},"411":{"position":[[21,9]]},"485":{"position":[[0,8]]},"723":{"position":[[0,8]]},"902":{"position":[[0,8]]},"1156":{"position":[[4,9]]}},"content":{"24":{"position":[[257,7]]},"53":{"position":[[7,7]]},"65":{"position":[[2042,8]]},"105":{"position":[[196,8]]},"114":{"position":[[634,9]]},"151":{"position":[[284,7]]},"173":{"position":[[231,8],[2429,10]]},"174":{"position":[[3204,10]]},"175":{"position":[[628,8]]},"232":{"position":[[174,7]]},"236":{"position":[[169,8]]},"266":{"position":[[273,8]]},"269":{"position":[[382,10]]},"286":{"position":[[389,10]]},"290":{"position":[[255,9]]},"295":{"position":[[66,9]]},"354":{"position":[[162,7]]},"362":{"position":[[1040,8]]},"366":{"position":[[311,8]]},"370":{"position":[[29,7]]},"372":{"position":[[153,8]]},"376":{"position":[[25,7]]},"387":{"position":[[245,7]]},"410":{"position":[[993,8]]},"411":{"position":[[5268,8]]},"412":{"position":[[9593,9],[15141,8]]},"418":{"position":[[695,8]]},"419":{"position":[[972,8]]},"433":{"position":[[257,9]]},"444":{"position":[[793,8]]},"445":{"position":[[357,8]]},"446":{"position":[[575,7]]},"621":{"position":[[783,8]]},"623":{"position":[[650,10]]},"775":{"position":[[409,7]]},"780":{"position":[[529,7]]},"783":{"position":[[544,7]]},"835":{"position":[[240,7]]},"838":{"position":[[396,8]]},"860":{"position":[[312,9]]},"965":{"position":[[27,7]]},"1008":{"position":[[10,7]]},"1067":{"position":[[1009,7]]},"1085":{"position":[[1860,9]]},"1124":{"position":[[69,8]]},"1132":{"position":[[51,8]]},"1148":{"position":[[176,8]]},"1211":{"position":[[436,8]]},"1213":{"position":[[119,7]]},"1295":{"position":[[530,7]]},"1296":{"position":[[1714,7]]},"1297":{"position":[[596,7]]},"1304":{"position":[[1639,8]]},"1315":{"position":[[1122,7]]}},"keywords":{}}],["besid",{"_index":2861,"title":{},"content":{"422":{"position":[[102,8]]},"659":{"position":[[791,7]]},"685":{"position":[[54,7]]},"696":{"position":[[698,7]]},"716":{"position":[[356,6]]},"835":{"position":[[896,7]]}},"keywords":{}}],["best",{"_index":85,"title":{"142":{"position":[[0,4]]},"346":{"position":[[0,4]]},"374":{"position":[[45,4]]},"556":{"position":[[0,4]]},"590":{"position":[[0,4]]}},"content":{"6":{"position":[[90,4]]},"56":{"position":[[177,4]]},"67":{"position":[[82,4]]},"98":{"position":[[196,4]]},"118":{"position":[[107,4]]},"131":{"position":[[943,4]]},"142":{"position":[[78,4]]},"266":{"position":[[343,4],[403,4]]},"287":{"position":[[1254,4]]},"301":{"position":[[5,4]]},"314":{"position":[[963,4]]},"347":{"position":[[510,4]]},"356":{"position":[[624,4]]},"362":{"position":[[1581,4]]},"369":{"position":[[1564,5]]},"388":{"position":[[192,4]]},"396":{"position":[[1949,4]]},"412":{"position":[[6938,4]]},"470":{"position":[[356,4]]},"489":{"position":[[318,5]]},"500":{"position":[[82,4]]},"524":{"position":[[133,4],[776,4]]},"543":{"position":[[167,4]]},"557":{"position":[[349,4]]},"567":{"position":[[966,4]]},"581":{"position":[[641,4]]},"591":{"position":[[739,4]]},"603":{"position":[[165,4]]},"661":{"position":[[479,4]]},"688":{"position":[[980,4]]},"710":{"position":[[783,4]]},"716":{"position":[[85,4]]},"797":{"position":[[80,4]]},"798":{"position":[[1032,4]]},"821":{"position":[[58,4],[168,4],[596,4]]},"838":{"position":[[1441,4]]},"1071":{"position":[[390,4]]},"1090":{"position":[[99,4]]},"1147":{"position":[[396,4]]},"1231":{"position":[[115,4]]},"1243":{"position":[[87,4]]},"1244":{"position":[[73,4]]},"1245":{"position":[[32,4]]},"1270":{"position":[[298,4]]},"1297":{"position":[[472,4]]}},"keywords":{}}],["best.if",{"_index":3208,"title":{},"content":{"497":{"position":[[653,7]]}},"keywords":{}}],["bestfriend",{"_index":4675,"title":{},"content":{"808":{"position":[[248,11]]},"810":{"position":[[236,11],[305,11],[393,10]]},"811":{"position":[[216,11],[285,11],[373,10]]}},"keywords":{}}],["bestindex",{"_index":4709,"title":{},"content":{"820":{"position":[[149,11]]}},"keywords":{}}],["better",{"_index":62,"title":{"73":{"position":[[27,6]]},"74":{"position":[[10,6]]},"91":{"position":[[28,7]]},"104":{"position":[[27,6]]},"105":{"position":[[10,6]]},"232":{"position":[[0,6]]},"278":{"position":[[15,6]]},"281":{"position":[[10,6]]},"353":{"position":[[9,8]]},"395":{"position":[[28,6]]},"486":{"position":[[0,6]]},"487":{"position":[[0,6]]},"778":{"position":[[6,6]]},"796":{"position":[[48,6]]}},"content":{"4":{"position":[[101,6]]},"31":{"position":[[228,6]]},"33":{"position":[[69,6]]},"59":{"position":[[130,6]]},"131":{"position":[[687,6]]},"314":{"position":[[136,6]]},"336":{"position":[[290,6]]},"400":{"position":[[502,6]]},"402":{"position":[[1598,6],[1982,7]]},"408":{"position":[[4963,6]]},"411":{"position":[[3718,6],[3936,6]]},"412":{"position":[[4969,6]]},"425":{"position":[[48,6]]},"430":{"position":[[832,6]]},"432":{"position":[[1410,6]]},"466":{"position":[[401,6]]},"469":{"position":[[1374,6]]},"470":{"position":[[134,6]]},"473":{"position":[[203,6]]},"546":{"position":[[163,6]]},"554":{"position":[[196,6]]},"566":{"position":[[677,6]]},"606":{"position":[[163,6]]},"640":{"position":[[241,6]]},"655":{"position":[[270,6]]},"681":{"position":[[143,6]]},"698":{"position":[[968,6]]},"703":{"position":[[1637,6]]},"704":{"position":[[523,6]]},"705":{"position":[[456,6],[508,6]]},"710":{"position":[[2178,6]]},"752":{"position":[[245,6]]},"772":{"position":[[2587,8]]},"775":{"position":[[428,6],[614,6]]},"796":{"position":[[225,6],[363,6],[659,6],[1079,6]]},"798":{"position":[[464,6]]},"800":{"position":[[173,6]]},"802":{"position":[[98,6]]},"821":{"position":[[1010,6]]},"945":{"position":[[355,6]]},"951":{"position":[[65,6]]},"965":{"position":[[292,6]]},"983":{"position":[[81,6]]},"989":{"position":[[5,6]]},"1013":{"position":[[5,6]]},"1022":{"position":[[114,6]]},"1067":{"position":[[140,6],[631,6]]},"1071":{"position":[[168,6]]},"1098":{"position":[[120,6]]},"1099":{"position":[[112,6]]},"1138":{"position":[[362,6]]},"1143":{"position":[[205,6]]},"1152":{"position":[[109,6]]},"1162":{"position":[[1100,6],[1141,6]]},"1175":{"position":[[259,6]]},"1186":{"position":[[105,6]]},"1286":{"position":[[112,6]]},"1309":{"position":[[886,6]]}},"keywords":{}}],["between",{"_index":219,"title":{"132":{"position":[[29,7]]},"163":{"position":[[29,7]]},"190":{"position":[[29,7]]},"288":{"position":[[30,7]]},"337":{"position":[[29,7]]},"525":{"position":[[29,7]]},"582":{"position":[[29,7]]},"775":{"position":[[15,7]]},"900":{"position":[[45,7]]},"1215":{"position":[[11,7]]}},"content":{"14":{"position":[[552,7]]},"26":{"position":[[185,7]]},"37":{"position":[[54,7]]},"82":{"position":[[125,7]]},"123":{"position":[[53,7]]},"132":{"position":[[18,7],[208,7]]},"147":{"position":[[40,7]]},"151":{"position":[[244,7]]},"153":{"position":[[391,7]]},"158":{"position":[[49,7]]},"165":{"position":[[94,7]]},"173":{"position":[[2838,7]]},"181":{"position":[[308,7]]},"184":{"position":[[159,7]]},"190":{"position":[[69,7]]},"192":{"position":[[96,7]]},"208":{"position":[[54,7]]},"223":{"position":[[28,7],[299,7]]},"275":{"position":[[235,7]]},"279":{"position":[[138,7]]},"288":{"position":[[28,7],[282,7]]},"289":{"position":[[120,7],[557,7],[775,7],[1164,7]]},"293":{"position":[[27,7],[234,7]]},"299":{"position":[[703,7]]},"321":{"position":[[148,7]]},"330":{"position":[[83,7]]},"365":{"position":[[708,7]]},"369":{"position":[[1069,7]]},"375":{"position":[[675,7]]},"393":{"position":[[184,7],[855,7]]},"394":{"position":[[367,7]]},"396":{"position":[[477,7]]},"397":{"position":[[1460,7]]},"398":{"position":[[3144,7]]},"401":{"position":[[831,7]]},"427":{"position":[[607,7]]},"439":{"position":[[478,7]]},"444":{"position":[[863,7]]},"450":{"position":[[281,7]]},"458":{"position":[[293,7],[537,7],[616,7]]},"459":{"position":[[20,7],[555,7]]},"461":{"position":[[892,7]]},"467":{"position":[[631,7]]},"469":{"position":[[191,7],[1156,7]]},"470":{"position":[[381,7]]},"502":{"position":[[1321,7]]},"504":{"position":[[559,7],[635,7],[841,7],[965,7],[1372,7]]},"517":{"position":[[87,7],[216,7]]},"525":{"position":[[472,7]]},"556":{"position":[[1601,7]]},"570":{"position":[[695,7],[791,7]]},"611":{"position":[[93,7]]},"612":{"position":[[950,7]]},"613":{"position":[[86,7]]},"614":{"position":[[367,7],[511,7]]},"617":{"position":[[2130,7],[2295,7]]},"632":{"position":[[187,7]]},"699":{"position":[[24,7],[381,7]]},"701":{"position":[[675,7]]},"703":{"position":[[134,7],[973,7]]},"709":{"position":[[497,7]]},"710":{"position":[[1133,7]]},"711":{"position":[[368,7]]},"737":{"position":[[373,7]]},"743":{"position":[[92,7],[257,7]]},"755":{"position":[[186,7]]},"774":{"position":[[1043,7]]},"779":{"position":[[424,7]]},"849":{"position":[[646,7]]},"870":{"position":[[21,7]]},"871":{"position":[[413,7]]},"872":{"position":[[2207,7]]},"876":{"position":[[73,7]]},"896":{"position":[[128,7]]},"901":{"position":[[162,7]]},"904":{"position":[[131,7]]},"938":{"position":[[87,7]]},"961":{"position":[[201,7]]},"964":{"position":[[181,7],[293,7]]},"1033":{"position":[[1006,7]]},"1068":{"position":[[406,7]]},"1072":{"position":[[913,7]]},"1074":{"position":[[347,7]]},"1094":{"position":[[250,7]]},"1121":{"position":[[122,7],[304,7]]},"1124":{"position":[[1047,7],[1268,7],[1614,7]]},"1126":{"position":[[892,7]]},"1164":{"position":[[1030,7]]},"1174":{"position":[[396,7]]},"1215":{"position":[[52,7]]},"1295":{"position":[[329,7],[474,7]]},"1301":{"position":[[20,7],[707,7],[1182,7],[1228,7]]},"1304":{"position":[[294,7]]},"1313":{"position":[[747,8]]},"1315":{"position":[[1641,8]]},"1316":{"position":[[2535,7],[2607,7]]}},"keywords":{}}],["beyond",{"_index":856,"title":{"561":{"position":[[15,6]]}},"content":{"57":{"position":[[1,6]]},"362":{"position":[[642,6]]},"365":{"position":[[330,6]]},"390":{"position":[[909,6]]},"412":{"position":[[7264,6]]},"414":{"position":[[301,7]]},"436":{"position":[[37,6]]},"491":{"position":[[569,6],[1507,7],[1624,6]]},"518":{"position":[[41,6]]},"544":{"position":[[48,6]]},"585":{"position":[[1,6]]},"604":{"position":[[48,6]]},"701":{"position":[[35,6]]},"709":{"position":[[293,6]]},"723":{"position":[[2236,6]]}},"keywords":{}}],["bi",{"_index":2155,"title":{},"content":{"381":{"position":[[35,2]]}},"keywords":{}}],["bidirect",{"_index":1117,"title":{"135":{"position":[[0,13]]},"340":{"position":[[0,13]]}},"content":{"135":{"position":[[15,13]]},"289":{"position":[[745,13]]},"622":{"position":[[631,13]]}},"keywords":{}}],["big",{"_index":215,"title":{"466":{"position":[[0,3]]},"467":{"position":[[0,3]]}},"content":{"14":{"position":[[506,3],[676,3]]},"36":{"position":[[459,3]]},"404":{"position":[[825,3]]},"411":{"position":[[2735,3],[3515,3]]},"412":{"position":[[6470,3],[10419,3]]},"458":{"position":[[3,3]]},"459":{"position":[[5,3]]},"466":{"position":[[28,3]]},"468":{"position":[[145,3]]},"556":{"position":[[1202,3]]},"617":{"position":[[1022,3]]},"644":{"position":[[226,3]]},"661":{"position":[[1796,3]]},"696":{"position":[[1842,3]]},"749":{"position":[[21584,3],[21652,3]]},"779":{"position":[[12,3]]},"800":{"position":[[482,3]]},"835":{"position":[[107,3],[236,3]]},"837":{"position":[[545,3]]},"951":{"position":[[135,3]]},"965":{"position":[[23,3],[73,3]]},"1116":{"position":[[64,3]]},"1137":{"position":[[220,3]]},"1171":{"position":[[420,3]]},"1181":{"position":[[49,3]]},"1186":{"position":[[90,3]]},"1191":{"position":[[3,3]]},"1192":{"position":[[503,3]]},"1200":{"position":[[1,3]]},"1237":{"position":[[56,3]]},"1239":{"position":[[274,3]]},"1295":{"position":[[645,3]]},"1296":{"position":[[1710,3]]},"1301":{"position":[[5,3]]},"1319":{"position":[[160,3]]}},"keywords":{}}],["big.becaus",{"_index":6110,"title":{},"content":{"1162":{"position":[[490,11]]},"1181":{"position":[[577,11]]}},"keywords":{}}],["bigger",{"_index":404,"title":{},"content":{"24":{"position":[[497,6]]},"408":{"position":[[2483,6]]},"412":{"position":[[11940,6]]},"773":{"position":[[733,6]]},"1235":{"position":[[89,6]]},"1286":{"position":[[171,6]]},"1297":{"position":[[570,6]]}},"keywords":{}}],["biggest",{"_index":233,"title":{},"content":{"14":{"position":[[926,7]]},"19":{"position":[[960,7]]},"686":{"position":[[96,7]]}},"keywords":{}}],["bill",{"_index":1319,"title":{},"content":{"204":{"position":[[139,5]]}},"keywords":{}}],["billabl",{"_index":1553,"title":{},"content":{"251":{"position":[[34,8]]}},"keywords":{}}],["binari",{"_index":1821,"title":{},"content":{"303":{"position":[[156,6]]},"411":{"position":[[3519,6]]},"453":{"position":[[213,6],[435,6]]},"454":{"position":[[27,6]]},"457":{"position":[[458,6]]},"468":{"position":[[499,6]]},"686":{"position":[[532,6]]},"708":{"position":[[222,8],[448,8]]},"838":{"position":[[3361,6]]},"1132":{"position":[[1309,6],[1447,6]]},"1143":{"position":[[274,6]]},"1167":{"position":[[19,6]]},"1209":{"position":[[73,6]]},"1282":{"position":[[87,6]]}},"keywords":{}}],["bind",{"_index":83,"title":{},"content":{"6":{"position":[[33,7]]},"50":{"position":[[400,7]]},"130":{"position":[[221,4]]},"286":{"position":[[222,8]]},"411":{"position":[[2274,4]]},"662":{"position":[[917,7]]},"766":{"position":[[248,4]]},"800":{"position":[[248,7]]},"1133":{"position":[[126,8]]}},"keywords":{}}],["bind_ip_al",{"_index":4944,"title":{},"content":{"872":{"position":[[568,11]]}},"keywords":{}}],["birthyear",{"_index":5808,"title":{},"content":{"1074":{"position":[[410,9]]}},"keywords":{}}],["bit",{"_index":325,"title":{},"content":{"19":{"position":[[285,3]]},"42":{"position":[[94,3]]},"356":{"position":[[916,3]]},"412":{"position":[[8529,3]]},"452":{"position":[[177,3]]},"463":{"position":[[609,3],[1380,3]]},"464":{"position":[[893,3]]},"698":{"position":[[1580,3]]},"1235":{"position":[[213,3]]},"1270":{"position":[[25,3],[135,3]]},"1286":{"position":[[100,3]]}},"keywords":{}}],["bite",{"_index":3959,"title":{},"content":{"701":{"position":[[610,4]]}},"keywords":{}}],["blend",{"_index":2796,"title":{},"content":{"418":{"position":[[537,5]]}},"keywords":{}}],["bloat",{"_index":2083,"title":{},"content":{"361":{"position":[[286,5]]},"841":{"position":[[964,5]]}},"keywords":{}}],["blob",{"_index":5291,"title":{},"content":{"917":{"position":[[433,4],[642,6]]},"918":{"position":[[72,5]]},"930":{"position":[[59,5],[136,4],[174,4]]},"1282":{"position":[[114,5]]}},"keywords":{}}],["blob.arraybuff",{"_index":5292,"title":{},"content":{"917":{"position":[[511,18]]}},"keywords":{}}],["block",{"_index":499,"title":{"1033":{"position":[[22,5]]},"1186":{"position":[[0,5]]}},"content":{"31":{"position":[[188,6]]},"302":{"position":[[398,6]]},"421":{"position":[[931,7]]},"427":{"position":[[122,8],[209,8],[296,5],[1107,9]]},"451":{"position":[[575,6],[672,5]]},"460":{"position":[[1319,5],[1398,5]]},"468":{"position":[[73,6]]},"491":{"position":[[995,7]]},"559":{"position":[[1121,5]]},"566":{"position":[[647,10]]},"619":{"position":[[213,5]]},"627":{"position":[[130,5]]},"634":{"position":[[618,8]]},"699":{"position":[[869,7]]},"705":{"position":[[1029,5]]},"710":{"position":[[2415,5]]},"740":{"position":[[168,7]]},"765":{"position":[[69,6]]},"801":{"position":[[220,5]]},"835":{"position":[[166,8],[295,5]]},"837":{"position":[[269,6]]},"995":{"position":[[506,5],[587,5],[1331,5]]},"1007":{"position":[[94,5]]},"1021":{"position":[[36,5]]},"1032":{"position":[[152,7],[256,7]]},"1033":{"position":[[85,8],[200,5],[657,5]]},"1093":{"position":[[438,8],[512,8]]},"1106":{"position":[[508,5]]},"1157":{"position":[[248,5]]},"1176":{"position":[[279,5]]},"1186":{"position":[[71,6],[94,6],[222,6]]},"1250":{"position":[[345,8]]},"1301":{"position":[[1533,7]]},"1304":{"position":[[1728,8]]},"1313":{"position":[[350,5]]}},"keywords":{}}],["blocksizelimit",{"_index":6157,"title":{},"content":{"1186":{"position":[[142,14],[295,15]]}},"keywords":{}}],["blue",{"_index":6525,"title":{},"content":{"1314":{"position":[[476,5],[691,7]]}},"keywords":{}}],["boast",{"_index":964,"title":{},"content":{"74":{"position":[[6,6]]}},"keywords":{}}],["bob",{"_index":2769,"title":{},"content":{"412":{"position":[[13971,3]]},"810":{"position":[[298,6]]},"811":{"position":[[278,6]]},"813":{"position":[[304,6]]},"948":{"position":[[398,6]]},"951":{"position":[[341,6]]},"1316":{"position":[[1059,4],[1198,3]]}},"keywords":{}}],["bob'",{"_index":6549,"title":{},"content":{"1316":{"position":[[1136,5]]}},"keywords":{}}],["bodi",{"_index":1350,"title":{},"content":{"209":{"position":[[863,5]]},"255":{"position":[[1209,5]]},"612":{"position":[[471,4]]},"616":{"position":[[707,4],[1182,4]]},"875":{"position":[[6368,5]]},"988":{"position":[[2663,5]]},"1102":{"position":[[636,5]]}},"keywords":{}}],["boilerpl",{"_index":1934,"title":{},"content":{"331":{"position":[[140,12]]},"411":{"position":[[1527,11]]}},"keywords":{}}],["bolster",{"_index":5278,"title":{},"content":{"912":{"position":[[112,10]]}},"keywords":{}}],["bombard",{"_index":2609,"title":{},"content":{"411":{"position":[[643,9]]}},"keywords":{}}],["book",{"_index":2332,"title":{},"content":{"395":{"position":[[361,5]]}},"keywords":{}}],["boolean",{"_index":1345,"title":{},"content":{"209":{"position":[[570,9]]},"255":{"position":[[910,9]]},"367":{"position":[[969,9]]},"459":{"position":[[1048,7],[1145,7]]},"480":{"position":[[660,9]]},"632":{"position":[[1660,9]]},"749":{"position":[[20733,7]]},"855":{"position":[[181,7]]},"861":{"position":[[2025,7]]},"867":{"position":[[176,7]]},"885":{"position":[[609,8],[704,8]]},"898":{"position":[[363,7],[588,7],[1105,7]]},"904":{"position":[[999,10]]},"988":{"position":[[1688,7],[2024,7],[2144,7]]},"1049":{"position":[[9,7]]},"1079":{"position":[[185,7]]},"1080":{"position":[[404,9],[753,7]]},"1158":{"position":[[484,9]]},"1296":{"position":[[1775,7]]}},"keywords":{}}],["boost",{"_index":1969,"title":{},"content":{"345":{"position":[[128,5]]},"398":{"position":[[159,6]]},"408":{"position":[[4227,5]]},"420":{"position":[[1538,5]]},"490":{"position":[[684,8]]},"643":{"position":[[162,5]]}},"keywords":{}}],["bot",{"_index":6172,"title":{},"content":{"1198":{"position":[[764,3]]}},"keywords":{}}],["both",{"_index":298,"title":{"616":{"position":[[16,4]]}},"content":{"17":{"position":[[513,4]]},"38":{"position":[[379,4]]},"43":{"position":[[236,4]]},"135":{"position":[[73,4]]},"266":{"position":[[351,4]]},"300":{"position":[[147,4]]},"316":{"position":[[509,4]]},"340":{"position":[[30,4]]},"356":{"position":[[632,4]]},"366":{"position":[[325,4]]},"372":{"position":[[165,4]]},"397":{"position":[[151,4]]},"398":{"position":[[495,4],[619,4],[2907,4]]},"407":{"position":[[943,4]]},"412":{"position":[[3141,4],[3183,4],[3474,4]]},"420":{"position":[[1475,4]]},"427":{"position":[[1440,4]]},"444":{"position":[[805,4]]},"445":{"position":[[2247,4]]},"446":{"position":[[1358,4]]},"464":{"position":[[979,4]]},"500":{"position":[[90,4]]},"534":{"position":[[82,4]]},"594":{"position":[[80,4]]},"611":{"position":[[431,4]]},"613":{"position":[[255,4]]},"616":{"position":[[56,4]]},"622":{"position":[[607,4]]},"624":{"position":[[1229,4]]},"690":{"position":[[459,4]]},"691":{"position":[[176,4],[612,4]]},"698":{"position":[[64,4],[466,4]]},"723":{"position":[[1859,4]]},"740":{"position":[[265,4]]},"749":{"position":[[501,5]]},"964":{"position":[[314,4]]},"1124":{"position":[[1414,4]]},"1208":{"position":[[623,4]]},"1218":{"position":[[195,4]]},"1227":{"position":[[506,5]]},"1231":{"position":[[383,4]]},"1265":{"position":[[500,5]]},"1267":{"position":[[575,4]]},"1287":{"position":[[1,4]]},"1296":{"position":[[1497,4]]},"1324":{"position":[[97,5]]}},"keywords":{}}],["bottleneck",{"_index":386,"title":{},"content":{"23":{"position":[[264,10]]},"265":{"position":[[545,11],[676,10]]},"267":{"position":[[1348,12]]},"412":{"position":[[10224,11]]},"430":{"position":[[783,12]]},"709":{"position":[[825,11]]},"836":{"position":[[1698,11]]},"837":{"position":[[706,10]]},"1157":{"position":[[344,11]]}},"keywords":{}}],["bought",{"_index":429,"title":{},"content":{"26":{"position":[[315,6]]},"36":{"position":[[255,6]]}},"keywords":{}}],["bound",{"_index":2719,"title":{},"content":{"412":{"position":[[7242,5]]},"1052":{"position":[[314,5],[405,5]]},"1191":{"position":[[120,5]]},"1311":{"position":[[1213,5]]}},"keywords":{}}],["boundari",{"_index":3245,"title":{},"content":{"510":{"position":[[551,10]]},"1314":{"position":[[279,8]]}},"keywords":{}}],["box",{"_index":634,"title":{},"content":{"40":{"position":[[283,4]]},"125":{"position":[[26,3]]},"331":{"position":[[262,3]]},"459":{"position":[[296,4]]},"491":{"position":[[919,4]]},"535":{"position":[[769,4]]},"566":{"position":[[1096,4]]},"595":{"position":[[790,4]]},"836":{"position":[[1352,4]]},"1148":{"position":[[159,4]]}},"keywords":{}}],["boxrxdb",{"_index":1909,"title":{},"content":{"317":{"position":[[226,7]]}},"keywords":{}}],["branch",{"_index":649,"title":{"1092":{"position":[[31,9]]},"1093":{"position":[[11,8]]}},"content":{"41":{"position":[[61,7]]},"1092":{"position":[[255,9],[269,8],[459,8],[537,8]]},"1093":{"position":[[138,8]]}},"keywords":{}}],["brand",{"_index":2815,"title":{},"content":{"419":{"position":[[1653,8]]},"498":{"position":[[118,5]]}},"keywords":{}}],["breach",{"_index":2592,"title":{},"content":{"410":{"position":[[743,9]]},"550":{"position":[[340,8]]}},"keywords":{}}],["break",{"_index":1694,"title":{},"content":{"295":{"position":[[234,8]]},"358":{"position":[[675,5]]},"455":{"position":[[709,8]]},"577":{"position":[[7,5]]},"627":{"position":[[163,5]]},"705":{"position":[[779,8]]},"761":{"position":[[145,5]]},"849":{"position":[[918,6]]},"1292":{"position":[[842,6]]},"1301":{"position":[[1492,5]]},"1304":{"position":[[876,6]]}},"keywords":{}}],["brick",{"_index":2750,"title":{},"content":{"412":{"position":[[11873,5]]}},"keywords":{}}],["bridg",{"_index":1636,"title":{},"content":{"275":{"position":[[228,6]]},"354":{"position":[[1052,8]]},"438":{"position":[[223,7]]},"502":{"position":[[522,7]]},"563":{"position":[[1073,8]]},"567":{"position":[[872,8]]},"576":{"position":[[328,7]]},"828":{"position":[[198,7]]},"836":{"position":[[1624,6]]},"841":{"position":[[920,8]]},"1211":{"position":[[484,6]]}},"keywords":{}}],["brief",{"_index":2949,"title":{},"content":{"449":{"position":[[19,5]]}},"keywords":{}}],["bring",{"_index":1069,"title":{},"content":{"118":{"position":[[297,6]]},"153":{"position":[[182,6]]},"500":{"position":[[365,5]]},"875":{"position":[[6711,6]]}},"keywords":{}}],["broad",{"_index":2105,"title":{},"content":{"364":{"position":[[354,5]]}},"keywords":{}}],["broadcast",{"_index":3169,"title":{},"content":{"491":{"position":[[712,9],[1726,9]]},"617":{"position":[[2226,9]]},"622":{"position":[[236,12]]},"710":{"position":[[1104,9]]},"743":{"position":[[44,9]]},"1126":{"position":[[488,9]]}},"keywords":{}}],["broadcastchannel",{"_index":2988,"title":{},"content":{"458":{"position":[[1074,16]]},"1088":{"position":[[525,17]]},"1124":{"position":[[1231,16]]},"1126":{"position":[[254,16]]},"1301":{"position":[[1146,16]]}},"keywords":{}}],["broader",{"_index":2802,"title":{},"content":{"419":{"position":[[645,7]]}},"keywords":{}}],["broken",{"_index":2635,"title":{},"content":{"411":{"position":[[4836,7]]}},"keywords":{}}],["brought",{"_index":6557,"title":{},"content":{"1316":{"position":[[2315,7]]}},"keywords":{}}],["brows",{"_index":1982,"title":{},"content":{"347":{"position":[[453,6]]},"362":{"position":[[1524,6]]},"439":{"position":[[242,8]]},"567":{"position":[[499,6]]},"591":{"position":[[695,6]]}},"keywords":{}}],["browser",{"_index":51,"title":{"60":{"position":[[34,7]]},"62":{"position":[[0,7],[41,8]]},"65":{"position":[[22,8]]},"66":{"position":[[0,7]]},"67":{"position":[[56,8]]},"71":{"position":[[26,7]]},"85":{"position":[[22,7]]},"86":{"position":[[40,8]]},"91":{"position":[[0,7]]},"98":{"position":[[57,8]]},"102":{"position":[[31,8]]},"299":{"position":[[0,7]]},"368":{"position":[[24,7]]},"391":{"position":[[35,8]]},"439":{"position":[[16,7]]},"449":{"position":[[39,8]]},"547":{"position":[[34,7]]},"607":{"position":[[34,7]]},"697":{"position":[[0,7]]},"755":{"position":[[26,9]]},"900":{"position":[[53,8]]},"1195":{"position":[[0,7]]},"1237":{"position":[[23,7]]},"1276":{"position":[[30,8]]}},"content":{"2":{"position":[[448,7]]},"3":{"position":[[71,8]]},"16":{"position":[[514,7]]},"17":{"position":[[377,8]]},"28":{"position":[[525,7]]},"30":{"position":[[302,8]]},"32":{"position":[[87,9]]},"35":{"position":[[278,9]]},"38":{"position":[[675,9]]},"45":{"position":[[191,8]]},"47":{"position":[[934,7],[1172,7],[1209,7]]},"53":{"position":[[139,7]]},"58":{"position":[[246,8]]},"59":{"position":[[89,7]]},"60":{"position":[[47,7]]},"63":{"position":[[88,8]]},"64":{"position":[[79,7]]},"65":{"position":[[60,8],[170,7],[474,7],[835,7],[1071,8],[1339,7],[1612,7],[1832,7]]},"66":{"position":[[7,7],[181,7],[412,8]]},"67":{"position":[[98,7]]},"71":{"position":[[33,7]]},"80":{"position":[[103,7]]},"82":{"position":[[137,7]]},"83":{"position":[[65,7],[319,8],[460,7]]},"84":{"position":[[62,7]]},"86":{"position":[[62,8]]},"87":{"position":[[17,7]]},"88":{"position":[[21,7]]},"89":{"position":[[1,7]]},"90":{"position":[[14,7]]},"91":{"position":[[1,7]]},"92":{"position":[[1,7]]},"93":{"position":[[21,7]]},"94":{"position":[[1,7]]},"95":{"position":[[95,7]]},"96":{"position":[[19,7]]},"97":{"position":[[28,8]]},"98":{"position":[[113,7],[213,8]]},"99":{"position":[[266,7]]},"100":{"position":[[128,7],[163,7],[212,7],[246,7]]},"101":{"position":[[87,7],[109,7],[228,7]]},"102":{"position":[[59,7],[123,7]]},"107":{"position":[[175,7]]},"112":{"position":[[166,9]]},"114":{"position":[[62,7],[490,7],[662,7]]},"120":{"position":[[129,7]]},"125":{"position":[[130,7]]},"131":{"position":[[289,7],[474,9],[638,7]]},"149":{"position":[[62,7]]},"160":{"position":[[93,7],[262,7]]},"162":{"position":[[197,8]]},"172":{"position":[[184,7]]},"174":{"position":[[2005,7],[2766,9]]},"181":{"position":[[80,7]]},"201":{"position":[[157,9]]},"207":{"position":[[144,8]]},"227":{"position":[[135,7],[220,7]]},"228":{"position":[[102,7],[266,7]]},"237":{"position":[[108,7]]},"239":{"position":[[212,9]]},"244":{"position":[[358,7]]},"248":{"position":[[47,9]]},"254":{"position":[[114,8],[298,8]]},"266":{"position":[[180,8],[1092,7]]},"287":{"position":[[375,8],[484,7]]},"298":{"position":[[1,8],[203,8],[486,9]]},"299":{"position":[[51,8],[211,7],[1635,8]]},"300":{"position":[[440,8],[563,7]]},"302":{"position":[[81,8]]},"304":{"position":[[202,7],[446,8]]},"321":{"position":[[349,7]]},"322":{"position":[[147,8]]},"325":{"position":[[62,7]]},"328":{"position":[[144,7]]},"336":{"position":[[117,8],[478,7]]},"343":{"position":[[55,8]]},"347":{"position":[[62,7]]},"357":{"position":[[589,7]]},"362":{"position":[[1133,7]]},"365":{"position":[[900,7]]},"368":{"position":[[45,7],[212,7],[336,7]]},"383":{"position":[[387,8]]},"384":{"position":[[94,8]]},"391":{"position":[[227,7]]},"392":{"position":[[122,8],[2108,8],[2170,7]]},"404":{"position":[[198,7]]},"408":{"position":[[173,7],[289,9],[525,9],[636,8],[799,8],[1520,7],[1646,8],[1889,8],[3582,7],[3834,8],[4610,8],[4935,8],[5032,7]]},"410":{"position":[[1527,7]]},"411":{"position":[[4138,9]]},"412":{"position":[[7667,8],[7710,7],[7784,8],[7963,8],[8063,7],[8554,9],[10201,7]]},"424":{"position":[[51,8],[327,7]]},"427":{"position":[[1316,7],[1468,8]]},"429":{"position":[[281,9]]},"435":{"position":[[166,9]]},"436":{"position":[[181,7]]},"439":{"position":[[7,7],[164,7],[314,7],[508,7]]},"451":{"position":[[166,8],[880,7]]},"453":{"position":[[129,8]]},"454":{"position":[[121,8],[224,8],[370,7],[550,7],[831,8],[938,7]]},"455":{"position":[[54,8],[281,8],[515,8],[732,8],[901,7]]},"456":{"position":[[145,7]]},"458":{"position":[[137,7],[1126,7],[1409,7],[1512,7]]},"460":{"position":[[236,7],[881,7]]},"461":{"position":[[180,8],[678,8],[1040,7],[1161,8]]},"467":{"position":[[607,7]]},"468":{"position":[[707,7]]},"470":{"position":[[93,7],[335,7]]},"475":{"position":[[46,7]]},"479":{"position":[[306,8]]},"490":{"position":[[379,7]]},"504":{"position":[[128,8]]},"511":{"position":[[62,7]]},"519":{"position":[[44,7]]},"524":{"position":[[255,8],[657,7],[916,7],[1007,7]]},"531":{"position":[[62,7]]},"533":{"position":[[88,8]]},"535":{"position":[[1221,8]]},"541":{"position":[[875,7]]},"545":{"position":[[167,8],[227,7]]},"547":{"position":[[47,7]]},"559":{"position":[[28,7],[82,8]]},"560":{"position":[[162,8]]},"562":{"position":[[1708,7]]},"569":{"position":[[1316,8]]},"571":{"position":[[409,7]]},"574":{"position":[[588,8],[868,7]]},"575":{"position":[[176,9]]},"581":{"position":[[164,8],[486,8],[572,7]]},"586":{"position":[[126,8]]},"591":{"position":[[62,7]]},"593":{"position":[[88,8]]},"595":{"position":[[1282,7]]},"600":{"position":[[196,7]]},"601":{"position":[[850,7]]},"605":{"position":[[167,8],[227,7]]},"607":{"position":[[47,7]]},"610":{"position":[[108,8]]},"611":{"position":[[148,8]]},"612":{"position":[[718,8]]},"613":{"position":[[764,7]]},"614":{"position":[[157,8],[375,9]]},"617":{"position":[[13,8],[191,7],[1214,7],[1636,8],[1808,7],[1838,7],[1942,7]]},"624":{"position":[[782,7]]},"630":{"position":[[276,9]]},"631":{"position":[[145,8]]},"634":{"position":[[411,7]]},"640":{"position":[[144,8],[200,8]]},"641":{"position":[[275,9],[331,9]]},"642":{"position":[[6,7]]},"659":{"position":[[134,8]]},"660":{"position":[[121,7],[442,9]]},"662":{"position":[[874,8]]},"676":{"position":[[35,8]]},"696":{"position":[[778,8],[1043,7],[1255,7],[1303,7],[1441,7],[1908,8]]},"697":{"position":[[211,8],[330,8],[593,7]]},"703":{"position":[[441,7],[504,8],[1033,7],[1121,8]]},"707":{"position":[[233,7]]},"709":{"position":[[43,7],[516,7],[725,7],[1194,8]]},"710":{"position":[[1141,7]]},"717":{"position":[[389,8]]},"723":{"position":[[820,7],[970,7]]},"728":{"position":[[105,9]]},"729":{"position":[[244,7]]},"736":{"position":[[336,7]]},"737":{"position":[[386,7]]},"740":{"position":[[270,7]]},"743":{"position":[[183,7]]},"749":{"position":[[8845,7]]},"755":{"position":[[56,8],[194,7]]},"793":{"position":[[193,9],[216,9],[245,9]]},"801":{"position":[[865,9]]},"821":{"position":[[516,8]]},"830":{"position":[[126,7]]},"835":{"position":[[76,8]]},"849":{"position":[[154,7],[235,7],[268,8],[374,7],[658,7]]},"863":{"position":[[226,9]]},"871":{"position":[[699,8]]},"879":{"position":[[537,7]]},"882":{"position":[[136,7]]},"896":{"position":[[321,8]]},"897":{"position":[[444,8]]},"898":{"position":[[2044,8],[2799,8]]},"901":{"position":[[84,8]]},"903":{"position":[[410,10]]},"904":{"position":[[491,8]]},"910":{"position":[[8,7]]},"911":{"position":[[18,8]]},"932":{"position":[[667,9]]},"956":{"position":[[122,7]]},"958":{"position":[[19,7]]},"962":{"position":[[515,7],[649,8]]},"964":{"position":[[254,7]]},"968":{"position":[[759,7]]},"979":{"position":[[203,7]]},"981":{"position":[[818,9],[942,8],[1535,7]]},"988":{"position":[[1167,7],[1241,7]]},"989":{"position":[[97,7],[434,7]]},"1003":{"position":[[164,7]]},"1030":{"position":[[80,7]]},"1088":{"position":[[261,7]]},"1115":{"position":[[648,7]]},"1117":{"position":[[553,7]]},"1120":{"position":[[308,7]]},"1141":{"position":[[111,7]]},"1157":{"position":[[118,8],[553,8]]},"1159":{"position":[[43,9]]},"1162":{"position":[[98,7],[414,7]]},"1164":{"position":[[1466,7]]},"1171":{"position":[[115,7]]},"1172":{"position":[[116,8]]},"1174":{"position":[[81,7]]},"1176":{"position":[[186,8],[506,7]]},"1181":{"position":[[164,7],[501,7]]},"1183":{"position":[[150,7],[240,7],[401,7]]},"1191":{"position":[[274,7]]},"1195":{"position":[[33,7]]},"1198":{"position":[[1392,8]]},"1202":{"position":[[283,7]]},"1206":{"position":[[51,7]]},"1207":{"position":[[91,8],[647,8]]},"1214":{"position":[[33,7],[72,9],[191,7],[283,7],[611,7]]},"1232":{"position":[[54,7]]},"1235":{"position":[[8,8]]},"1237":{"position":[[22,7]]},"1242":{"position":[[60,8]]},"1244":{"position":[[156,8]]},"1246":{"position":[[125,9],[477,10],[1969,9]]},"1249":{"position":[[56,9]]},"1276":{"position":[[8,7],[341,8],[540,8]]},"1292":{"position":[[259,9]]},"1295":{"position":[[421,8]]},"1297":{"position":[[16,8]]},"1298":{"position":[[124,7],[253,9]]},"1300":{"position":[[1089,7]]},"1301":{"position":[[113,7],[240,7],[797,7],[942,9],[1612,7]]},"1307":{"position":[[273,7]]},"1324":{"position":[[157,8],[212,8]]}},"keywords":{}}],["browser'",{"_index":1671,"title":{},"content":{"287":{"position":[[695,9]]},"346":{"position":[[653,9]]},"412":{"position":[[9987,9]]},"438":{"position":[[268,9]]},"504":{"position":[[204,9]]}},"keywords":{}}],["browser.fast",{"_index":6094,"title":{},"content":{"1156":{"position":[[109,12]]}},"keywords":{}}],["browser.observ",{"_index":3485,"title":{},"content":{"575":{"position":[[610,18]]}},"keywords":{}}],["browser/phon",{"_index":2734,"title":{},"content":{"412":{"position":[[9326,13]]}},"keywords":{}}],["browsers.memori",{"_index":1962,"title":{},"content":{"336":{"position":[[322,15]]},"581":{"position":[[326,15]]}},"keywords":{}}],["browsers.opf",{"_index":1670,"title":{},"content":{"287":{"position":[[649,13]]},"336":{"position":[[229,13]]},"524":{"position":[[377,13]]}},"keywords":{}}],["browser—no",{"_index":3404,"title":{},"content":{"559":{"position":[[909,10]]}},"keywords":{}}],["browser’",{"_index":1866,"title":{},"content":{"305":{"position":[[79,9]]}},"keywords":{}}],["bucket",{"_index":2336,"title":{"1140":{"position":[[8,8]]}},"content":{"396":{"position":[[201,7]]},"470":{"position":[[563,7]]},"1140":{"position":[[13,7],[190,7],[326,7]]},"1143":{"position":[[630,7]]}},"keywords":{}}],["buckets"",{"_index":6055,"title":{},"content":{"1140":{"position":[[118,14]]}},"keywords":{}}],["buffer",{"_index":6368,"title":{},"content":{"1282":{"position":[[43,6],[310,7]]}},"keywords":{}}],["bug",{"_index":3830,"title":{},"content":{"667":{"position":[[154,4]]},"670":{"position":[[18,4],[282,3],[346,3]]},"749":{"position":[[21956,4]]},"837":{"position":[[613,4]]},"1085":{"position":[[3138,4]]},"1120":{"position":[[368,5]]},"1133":{"position":[[514,3]]},"1288":{"position":[[76,3]]}},"keywords":{}}],["bugfix",{"_index":2976,"title":{},"content":{"455":{"position":[[627,6]]},"667":{"position":[[29,6]]},"668":{"position":[[69,6]]}},"keywords":{}}],["build",{"_index":97,"title":{"44":{"position":[[0,5]]},"69":{"position":[[0,5]]},"90":{"position":[[0,8]]},"100":{"position":[[0,5]]},"221":{"position":[[0,8]]},"228":{"position":[[0,5]]},"484":{"position":[[0,8]]},"488":{"position":[[0,8]]},"731":{"position":[[27,6]]},"1212":{"position":[[0,8]]},"1227":{"position":[[4,5]]},"1228":{"position":[[0,8]]},"1265":{"position":[[4,5]]},"1266":{"position":[[0,8]]}},"content":{"7":{"position":[[124,5]]},"24":{"position":[[534,5]]},"38":{"position":[[48,8]]},"59":{"position":[[191,8]]},"61":{"position":[[351,5]]},"69":{"position":[[54,5]]},"90":{"position":[[32,8]]},"100":{"position":[[92,5],[317,5]]},"105":{"position":[[150,5]]},"116":{"position":[[105,5]]},"122":{"position":[[86,5]]},"124":{"position":[[231,5]]},"148":{"position":[[219,5],[318,8]]},"151":{"position":[[437,8]]},"156":{"position":[[218,5]]},"168":{"position":[[294,8]]},"170":{"position":[[286,8]]},"174":{"position":[[82,8]]},"175":{"position":[[669,8]]},"177":{"position":[[99,5]]},"179":{"position":[[233,8],[402,5]]},"183":{"position":[[61,8]]},"184":{"position":[[42,8]]},"186":{"position":[[368,8]]},"198":{"position":[[375,5]]},"207":{"position":[[98,8]]},"221":{"position":[[152,5]]},"227":{"position":[[66,5],[290,6]]},"228":{"position":[[61,5],[340,5]]},"232":{"position":[[48,8]]},"239":{"position":[[107,8]]},"254":{"position":[[88,8]]},"267":{"position":[[257,8],[1203,5],[1595,8]]},"286":{"position":[[147,8]]},"287":{"position":[[1151,5],[1221,5]]},"289":{"position":[[1454,5]]},"313":{"position":[[187,5]]},"333":{"position":[[102,5]]},"362":{"position":[[975,8]]},"371":{"position":[[127,8]]},"381":{"position":[[384,5]]},"388":{"position":[[82,5],[333,5]]},"390":{"position":[[1643,5],[1897,5]]},"391":{"position":[[23,5]]},"396":{"position":[[583,6],[1467,8]]},"399":{"position":[[362,8]]},"408":{"position":[[2473,5]]},"411":{"position":[[1292,5],[3868,5]]},"412":{"position":[[10862,5]]},"422":{"position":[[413,5]]},"433":{"position":[[481,6]]},"445":{"position":[[2183,5],[2448,8]]},"446":{"position":[[1215,5]]},"447":{"position":[[401,5]]},"453":{"position":[[596,5],[779,5]]},"458":{"position":[[23,8]]},"459":{"position":[[319,5]]},"481":{"position":[[539,8]]},"483":{"position":[[380,5]]},"488":{"position":[[49,5]]},"498":{"position":[[16,8]]},"534":{"position":[[6,8]]},"541":{"position":[[67,5]]},"557":{"position":[[423,5]]},"569":{"position":[[1487,5]]},"571":{"position":[[641,5]]},"594":{"position":[[6,8]]},"613":{"position":[[1022,5]]},"617":{"position":[[1830,5]]},"625":{"position":[[84,5]]},"644":{"position":[[385,8]]},"668":{"position":[[177,5]]},"681":{"position":[[49,5]]},"703":{"position":[[659,5]]},"717":{"position":[[358,5]]},"731":{"position":[[264,5]]},"736":{"position":[[305,6]]},"749":{"position":[[21244,5],[23634,5]]},"781":{"position":[[217,5]]},"821":{"position":[[11,5],[95,5]]},"838":{"position":[[537,5]]},"860":{"position":[[651,5],[1193,5]]},"875":{"position":[[7567,5]]},"904":{"position":[[85,5],[172,5]]},"1006":{"position":[[16,8]]},"1021":{"position":[[27,8]]},"1085":{"position":[[2574,5]]},"1088":{"position":[[170,5]]},"1090":{"position":[[434,5]]},"1094":{"position":[[24,5],[95,5]]},"1123":{"position":[[724,5]]},"1124":{"position":[[874,5],[1955,5]]},"1137":{"position":[[148,5]]},"1143":{"position":[[168,5]]},"1149":{"position":[[417,8]]},"1167":{"position":[[57,5]]},"1174":{"position":[[39,5]]},"1212":{"position":[[112,5]]},"1228":{"position":[[4,5]]},"1235":{"position":[[73,5],[242,5]]},"1237":{"position":[[14,5]]},"1268":{"position":[[260,5],[384,5]]},"1286":{"position":[[178,5]]},"1292":{"position":[[874,5],[901,5],[924,5]]},"1313":{"position":[[465,5]]},"1314":{"position":[[18,5]]},"1320":{"position":[[611,5],[855,5]]},"1322":{"position":[[21,5],[129,5]]}},"keywords":{}}],["builder",{"_index":5116,"title":{"1064":{"position":[[6,7]]}},"content":{"886":{"position":[[297,7],[2143,7]]},"1064":{"position":[[58,7],[92,7],[202,9]]}},"keywords":{}}],["built",{"_index":614,"title":{"80":{"position":[[0,5]]},"109":{"position":[[0,5]]},"237":{"position":[[0,5]]},"311":{"position":[[3,5]]}},"content":{"39":{"position":[[63,5]]},"40":{"position":[[640,5]]},"47":{"position":[[983,5],[1082,5]]},"76":{"position":[[7,5]]},"79":{"position":[[15,5]]},"99":{"position":[[302,5]]},"107":{"position":[[9,5]]},"118":{"position":[[42,5]]},"120":{"position":[[91,5]]},"123":{"position":[[15,5]]},"126":{"position":[[157,5]]},"131":{"position":[[398,5]]},"132":{"position":[[129,5]]},"139":{"position":[[15,5]]},"153":{"position":[[128,5]]},"155":{"position":[[134,5]]},"161":{"position":[[155,5]]},"162":{"position":[[177,5]]},"174":{"position":[[1265,5],[1814,5]]},"181":{"position":[[32,5]]},"186":{"position":[[310,5]]},"206":{"position":[[145,5]]},"212":{"position":[[85,5]]},"230":{"position":[[61,5]]},"237":{"position":[[13,5]]},"269":{"position":[[177,5]]},"303":{"position":[[308,5]]},"310":{"position":[[287,5]]},"318":{"position":[[59,5]]},"322":{"position":[[39,5]]},"331":{"position":[[183,5]]},"354":{"position":[[962,5]]},"359":{"position":[[61,5]]},"360":{"position":[[446,5]]},"378":{"position":[[124,5]]},"382":{"position":[[268,5]]},"387":{"position":[[53,5]]},"421":{"position":[[576,5]]},"424":{"position":[[27,5]]},"445":{"position":[[106,5]]},"476":{"position":[[168,5]]},"490":{"position":[[16,5]]},"513":{"position":[[126,5]]},"519":{"position":[[113,5]]},"524":{"position":[[235,5]]},"535":{"position":[[1112,5]]},"544":{"position":[[313,5]]},"551":{"position":[[98,5]]},"559":{"position":[[19,5]]},"566":{"position":[[528,5],[1000,5],[1130,5]]},"569":{"position":[[1243,5]]},"575":{"position":[[41,5]]},"595":{"position":[[1189,5]]},"604":{"position":[[266,5]]},"631":{"position":[[232,5]]},"688":{"position":[[178,5]]},"836":{"position":[[1787,5]]},"838":{"position":[[593,5]]},"841":{"position":[[507,5],[575,5],[760,5]]},"860":{"position":[[914,5]]},"1072":{"position":[[1040,5],[1276,5],[1568,5],[2048,5]]},"1085":{"position":[[1944,5],[2101,5]]},"1148":{"position":[[304,5]]},"1156":{"position":[[94,5]]},"1307":{"position":[[815,5]]},"1320":{"position":[[698,5]]}},"keywords":{}}],["bulk",{"_index":792,"title":{"466":{"position":[[4,4]]},"467":{"position":[[4,4]]},"795":{"position":[[4,4]]}},"content":{"52":{"position":[[166,4]]},"301":{"position":[[217,4]]},"396":{"position":[[1652,4]]},"400":{"position":[[435,4]]},"408":{"position":[[2526,4]]},"411":{"position":[[270,4]]},"452":{"position":[[597,5]]},"459":{"position":[[478,4]]},"462":{"position":[[163,4]]},"466":{"position":[[32,4],[411,4]]},"467":{"position":[[34,4]]},"468":{"position":[[149,4]]},"539":{"position":[[166,4]]},"599":{"position":[[175,4]]},"795":{"position":[[72,4]]},"863":{"position":[[339,4],[429,4]]},"944":{"position":[[53,4]]},"945":{"position":[[53,4]]},"981":{"position":[[1167,5]]},"1161":{"position":[[157,4]]},"1174":{"position":[[135,4]]},"1180":{"position":[[157,4]]},"1194":{"position":[[345,7],[388,4],[431,7]]}},"keywords":{}}],["bulk.less",{"_index":3156,"title":{},"content":{"487":{"position":[[142,9]]}},"keywords":{}}],["bulki",{"_index":3259,"title":{},"content":{"521":{"position":[[206,5]]}},"keywords":{}}],["bulkinsert",{"_index":4252,"title":{"944":{"position":[[0,13]]}},"content":{"749":{"position":[[9064,13]]},"944":{"position":[[369,10],[507,12]]}},"keywords":{}}],["bulkremov",{"_index":5336,"title":{"945":{"position":[[0,13]]}},"content":{},"keywords":{}}],["bulkupsert",{"_index":4253,"title":{"947":{"position":[[0,13]]}},"content":{"749":{"position":[[9082,13]]}},"keywords":{}}],["bulkwrit",{"_index":4121,"title":{},"content":{"746":{"position":[[681,10]]},"749":{"position":[[1551,11]]}},"keywords":{}}],["bun",{"_index":2932,"title":{"440":{"position":[[25,4]]}},"content":{"440":{"position":[[196,3],[369,4],[464,3]]}},"keywords":{}}],["bun:sqlit",{"_index":2934,"title":{},"content":{"440":{"position":[[392,10]]}},"keywords":{}}],["bundl",{"_index":1261,"title":{},"content":{"188":{"position":[[1659,6],[1760,7]]},"333":{"position":[[191,7]]},"357":{"position":[[377,7]]},"412":{"position":[[862,7],[9192,6]]},"581":{"position":[[541,6]]},"708":{"position":[[560,7]]},"717":{"position":[[413,8]]},"732":{"position":[[72,6]]},"962":{"position":[[293,6]]},"1176":{"position":[[10,6]]},"1200":{"position":[[5,6]]},"1227":{"position":[[100,7],[155,7]]},"1242":{"position":[[131,6]]},"1265":{"position":[[93,7],[148,7]]},"1266":{"position":[[20,6]]},"1270":{"position":[[548,7]]},"1292":{"position":[[815,6]]}},"keywords":{}}],["bundler",{"_index":1937,"title":{},"content":{"333":{"position":[[135,8]]},"729":{"position":[[269,9]]},"1202":{"position":[[308,9]]},"1268":{"position":[[285,8]]}},"keywords":{}}],["burden",{"_index":1010,"title":{},"content":{"91":{"position":[[212,6]]},"224":{"position":[[154,6]]},"412":{"position":[[4335,6]]},"802":{"position":[[739,6]]},"1107":{"position":[[952,7]]}},"keywords":{}}],["busi",{"_index":667,"title":{"1009":{"position":[[30,8]]}},"content":{"43":{"position":[[93,8]]},"354":{"position":[[617,8],[1488,8]]},"411":{"position":[[1597,8]]},"419":{"position":[[1430,10]]},"681":{"position":[[170,8]]},"687":{"position":[[32,8]]}},"keywords":{}}],["button",{"_index":3159,"title":{},"content":{"489":{"position":[[387,6]]},"703":{"position":[[1426,6]]},"1313":{"position":[[600,6]]}},"keywords":{}}],["buy",{"_index":2808,"title":{},"content":{"419":{"position":[[1411,6]]}},"keywords":{}}],["bwvvdw",{"_index":5296,"title":{},"content":{"918":{"position":[[162,11]]},"931":{"position":[[190,10]]}},"keywords":{}}],["bypass",{"_index":1087,"title":{},"content":{"129":{"position":[[158,6]]},"289":{"position":[[1751,9]]},"901":{"position":[[177,9]]}},"keywords":{}}],["byte",{"_index":2970,"title":{},"content":{"454":{"position":[[647,4]]},"1206":{"position":[[327,4],[335,4]]},"1208":{"position":[[1643,6]]}},"keywords":{}}],["c",{"_index":82,"title":{},"content":{"6":{"position":[[29,3]]},"19":{"position":[[681,1],[695,1]]},"408":{"position":[[3546,3],[3550,4]]},"661":{"position":[[54,1]]},"711":{"position":[[58,1]]},"800":{"position":[[244,3]]},"836":{"position":[[56,1]]},"860":{"position":[[1267,1]]},"871":{"position":[[528,1]]},"897":{"position":[[35,1]]},"982":{"position":[[248,1]]}},"keywords":{}}],["c+d.the",{"_index":5437,"title":{},"content":{"982":{"position":[[355,7]]}},"keywords":{}}],["c.or",{"_index":337,"title":{},"content":{"19":{"position":[[689,5]]}},"keywords":{}}],["c.rating("gt"",{"_index":338,"title":{},"content":{"19":{"position":[[703,24]]}},"keywords":{}}],["c1",{"_index":5451,"title":{},"content":{"987":{"position":[[180,2],[397,2],[673,2]]}},"keywords":{}}],["c1.rxdb",{"_index":5453,"title":{},"content":{"987":{"position":[[486,7]]}},"keywords":{}}],["c2",{"_index":5452,"title":{},"content":{"987":{"position":[[216,2],[329,2],[717,2]]}},"keywords":{}}],["cabl",{"_index":4592,"title":{},"content":{"780":{"position":[[251,6]]}},"keywords":{}}],["cach",{"_index":561,"title":{"87":{"position":[[21,8]]},"216":{"position":[[0,8]]},"815":{"position":[[0,5]]},"1255":{"position":[[0,8]]},"1321":{"position":[[0,7]]}},"content":{"35":{"position":[[538,7]]},"37":{"position":[[253,7],[344,7]]},"39":{"position":[[336,6]]},"65":{"position":[[141,8],[192,5]]},"87":{"position":[[64,8],[197,7]]},"117":{"position":[[177,7]]},"157":{"position":[[148,7]]},"164":{"position":[[140,7]]},"173":{"position":[[628,8],[678,7],[717,7]]},"189":{"position":[[624,5]]},"206":{"position":[[36,8]]},"215":{"position":[[141,5]]},"216":{"position":[[44,7],[230,7]]},"241":{"position":[[514,8]]},"253":{"position":[[35,8]]},"265":{"position":[[950,8]]},"280":{"position":[[181,6]]},"287":{"position":[[944,5]]},"305":{"position":[[202,6]]},"373":{"position":[[529,8]]},"376":{"position":[[230,8]]},"408":{"position":[[735,5],[1291,5]]},"412":{"position":[[8664,5]]},"414":{"position":[[316,8]]},"416":{"position":[[124,6]]},"418":{"position":[[603,9],[867,6]]},"463":{"position":[[1339,7]]},"467":{"position":[[239,6],[507,6]]},"500":{"position":[[613,7]]},"612":{"position":[[1937,6],[1958,7]]},"616":{"position":[[927,7]]},"630":{"position":[[885,8],[930,8]]},"770":{"position":[[583,6]]},"793":{"position":[[948,5]]},"800":{"position":[[406,6]]},"815":{"position":[[43,5],[98,6]]},"816":{"position":[[88,5]]},"818":{"position":[[3,5],[208,6]]},"841":{"position":[[841,8]]},"856":{"position":[[62,6]]},"875":{"position":[[7349,6],[7370,6]]},"899":{"position":[[106,8]]},"934":{"position":[[709,5]]},"977":{"position":[[503,5]]},"1067":{"position":[[1109,8]]},"1068":{"position":[[267,6]]},"1071":{"position":[[519,6]]},"1072":{"position":[[185,6]]},"1321":{"position":[[208,5],[392,7],[975,5],[1001,6],[1086,5]]}},"keywords":{}}],["cache.it",{"_index":4700,"title":{},"content":{"816":{"position":[[279,8]]}},"keywords":{}}],["cachereplacementpolici",{"_index":4705,"title":{},"content":{"818":{"position":[[443,23],[549,23]]},"934":{"position":[[650,23]]}},"keywords":{}}],["calcul",{"_index":2288,"title":{"393":{"position":[[21,11]]}},"content":{"393":{"position":[[822,9]]},"394":{"position":[[271,11],[342,11]]},"396":{"position":[[1126,9]]},"397":{"position":[[1437,9],[1529,10],[1965,9]]},"398":{"position":[[535,9]]},"401":{"position":[[38,9]]},"402":{"position":[[428,11],[1812,11]]},"490":{"position":[[595,10]]},"927":{"position":[[69,10],[103,10]]},"1072":{"position":[[1129,12]]},"1250":{"position":[[198,9],[567,10]]},"1318":{"position":[[879,10],[1078,9]]}},"keywords":{}}],["call",{"_index":154,"title":{"654":{"position":[[0,7]]}},"content":{"11":{"position":[[371,6]]},"27":{"position":[[187,5]]},"38":{"position":[[258,6],[356,7]]},"212":{"position":[[339,4]]},"251":{"position":[[128,5]]},"277":{"position":[[27,6]]},"320":{"position":[[77,6]]},"334":{"position":[[86,4]]},"392":{"position":[[1971,7]]},"396":{"position":[[1629,6]]},"408":{"position":[[2764,5],[3314,5],[4047,6]]},"411":{"position":[[2838,6]]},"452":{"position":[[743,5]]},"454":{"position":[[973,6]]},"461":{"position":[[1270,7]]},"474":{"position":[[19,4]]},"494":{"position":[[463,4]]},"566":{"position":[[670,6]]},"574":{"position":[[663,6]]},"581":{"position":[[43,6]]},"647":{"position":[[55,6],[474,4]]},"654":{"position":[[50,7]]},"655":{"position":[[120,4]]},"659":{"position":[[335,5]]},"675":{"position":[[181,4]]},"676":{"position":[[240,4]]},"683":{"position":[[134,7],[241,7]]},"684":{"position":[[78,7]]},"698":{"position":[[342,6],[2499,6],[2567,4],[3010,6]]},"703":{"position":[[253,4],[306,5],[366,5],[422,5],[561,5]]},"711":{"position":[[1675,4]]},"721":{"position":[[369,7]]},"746":{"position":[[233,7]]},"749":{"position":[[1573,6],[2022,6],[2750,7],[4282,6],[11026,6],[11165,6],[22269,7]]},"752":{"position":[[81,7]]},"759":{"position":[[1079,4]]},"770":{"position":[[14,6]]},"772":{"position":[[607,7]]},"775":{"position":[[788,7]]},"788":{"position":[[48,6]]},"790":{"position":[[59,6]]},"792":{"position":[[61,6]]},"800":{"position":[[236,5]]},"806":{"position":[[317,6],[378,5]]},"825":{"position":[[292,7]]},"835":{"position":[[429,4]]},"846":{"position":[[1322,4]]},"848":{"position":[[535,4]]},"854":{"position":[[524,7]]},"863":{"position":[[532,5],[743,5]]},"866":{"position":[[163,4]]},"875":{"position":[[1750,7],[5875,4]]},"878":{"position":[[152,7]]},"879":{"position":[[316,4]]},"885":{"position":[[498,6]]},"890":{"position":[[10,4]]},"904":{"position":[[1470,4]]},"939":{"position":[[50,4]]},"941":{"position":[[1,7]]},"944":{"position":[[91,7],[499,4]]},"947":{"position":[[107,6]]},"958":{"position":[[203,4],[685,4]]},"966":{"position":[[766,4]]},"967":{"position":[[351,4]]},"970":{"position":[[1,7]]},"981":{"position":[[1053,7]]},"983":{"position":[[419,6]]},"987":{"position":[[335,7],[543,4],[1062,7]]},"988":{"position":[[59,7],[1598,7],[3288,6],[4224,4],[4617,6]]},"999":{"position":[[146,7]]},"1007":{"position":[[43,6],[1951,6]]},"1027":{"position":[[106,6]]},"1033":{"position":[[935,4]]},"1035":{"position":[[53,4]]},"1036":{"position":[[48,4]]},"1046":{"position":[[1,7]]},"1055":{"position":[[28,4]]},"1057":{"position":[[238,4]]},"1058":{"position":[[505,6]]},"1088":{"position":[[598,7]]},"1097":{"position":[[273,4]]},"1100":{"position":[[353,7]]},"1112":{"position":[[457,7]]},"1114":{"position":[[272,4],[325,7]]},"1115":{"position":[[42,6],[823,4]]},"1125":{"position":[[126,7]]},"1140":{"position":[[97,6]]},"1148":{"position":[[873,7]]},"1150":{"position":[[27,6]]},"1151":{"position":[[814,4]]},"1174":{"position":[[562,4]]},"1175":{"position":[[673,5],[755,6]]},"1178":{"position":[[811,4]]},"1194":{"position":[[670,4],[865,5],[1003,5]]},"1212":{"position":[[187,7]]},"1220":{"position":[[422,4]]},"1229":{"position":[[121,7]]},"1250":{"position":[[562,4]]},"1267":{"position":[[6,4],[428,4]]},"1268":{"position":[[115,7]]},"1272":{"position":[[188,6]]},"1282":{"position":[[1091,7]]},"1294":{"position":[[400,5],[746,4]]},"1295":{"position":[[204,6]]},"1298":{"position":[[166,4]]},"1304":{"position":[[1852,6]]},"1307":{"position":[[489,7]]},"1316":{"position":[[747,6]]}},"keywords":{}}],["call.find",{"_index":6167,"title":{},"content":{"1194":{"position":[[777,9]]}},"keywords":{}}],["call.insert",{"_index":6164,"title":{},"content":{"1194":{"position":[[508,11]]}},"keywords":{}}],["callback",{"_index":700,"title":{},"content":{"45":{"position":[[311,8]]},"47":{"position":[[81,8],[140,8]]},"302":{"position":[[437,10]]},"521":{"position":[[76,8]]},"535":{"position":[[119,8],[167,9]]},"595":{"position":[[119,8],[180,9]]},"1274":{"position":[[486,8]]},"1279":{"position":[[873,8]]}},"keywords":{}}],["calledpreinsert",{"_index":4522,"title":{},"content":{"767":{"position":[[98,15]]}},"keywords":{}}],["calledpreremov",{"_index":4548,"title":{},"content":{"769":{"position":[[90,15]]}},"keywords":{}}],["calledpresav",{"_index":4536,"title":{},"content":{"768":{"position":[[83,13]]}},"keywords":{}}],["came",{"_index":4595,"title":{},"content":{"785":{"position":[[586,4]]},"888":{"position":[[701,4],[747,4]]},"1009":{"position":[[1027,4]]},"1198":{"position":[[307,4]]}},"keywords":{}}],["can't",{"_index":941,"title":{},"content":{"66":{"position":[[213,5]]},"408":{"position":[[2544,5]]},"412":{"position":[[1458,5]]},"418":{"position":[[219,5]]},"440":{"position":[[309,5]]},"749":{"position":[[4365,5],[4616,5],[10613,5],[13664,5]]},"1085":{"position":[[2684,5]]},"1112":{"position":[[393,5]]}},"keywords":{}}],["cancel",{"_index":4349,"title":{"997":{"position":[[0,9]]}},"content":{"749":{"position":[[16430,8],[16696,9]]},"854":{"position":[[1667,6],[1760,8]]},"988":{"position":[[799,6]]},"993":{"position":[[515,9]]},"994":{"position":[[204,6]]},"997":{"position":[[1,7]]},"999":{"position":[[1,7]]},"1000":{"position":[[116,9]]},"1009":{"position":[[782,10]]}},"keywords":{}}],["candid",{"_index":2311,"title":{},"content":{"394":{"position":[[690,10]]},"398":{"position":[[787,10],[2055,10]]}},"keywords":{}}],["candidates.add(d",{"_index":2406,"title":{},"content":{"398":{"position":[[1373,19],[1415,19],[2533,19]]}},"keywords":{}}],["candidates.map(doc",{"_index":2314,"title":{},"content":{"394":{"position":[[762,18]]}},"keywords":{}}],["can’t",{"_index":2019,"title":{},"content":{"354":{"position":[[321,5]]},"559":{"position":[[1466,5]]}},"keywords":{}}],["cap",{"_index":870,"title":{},"content":{"58":{"position":[[259,3]]},"298":{"position":[[699,5]]},"299":{"position":[[290,3]]},"304":{"position":[[22,3]]},"408":{"position":[[651,6],[2160,7]]},"451":{"position":[[415,4]]}},"keywords":{}}],["capabilities.sqlit",{"_index":1292,"title":{},"content":{"189":{"position":[[266,19]]}},"keywords":{}}],["capabl",{"_index":265,"title":{"280":{"position":[[8,8]]}},"content":{"15":{"position":[[524,8]]},"27":{"position":[[295,13]]},"34":{"position":[[565,13]]},"39":{"position":[[221,13]]},"40":{"position":[[801,12]]},"61":{"position":[[389,7]]},"83":{"position":[[116,13]]},"84":{"position":[[45,12]]},"89":{"position":[[211,10]]},"95":{"position":[[135,10]]},"96":{"position":[[225,12]]},"114":{"position":[[45,12]]},"122":{"position":[[273,10]]},"126":{"position":[[182,13]]},"133":{"position":[[267,10]]},"136":{"position":[[283,10]]},"148":{"position":[[111,13],[398,7]]},"149":{"position":[[45,12]]},"151":{"position":[[129,13]]},"153":{"position":[[350,7]]},"161":{"position":[[227,12]]},"165":{"position":[[395,12]]},"166":{"position":[[92,13]]},"168":{"position":[[256,10]]},"173":{"position":[[2390,12]]},"174":{"position":[[1368,12],[2203,12],[3245,13]]},"175":{"position":[[42,12]]},"184":{"position":[[110,12]]},"189":{"position":[[378,13]]},"198":{"position":[[173,13]]},"224":{"position":[[118,12]]},"226":{"position":[[379,12]]},"254":{"position":[[276,13]]},"255":{"position":[[1865,13]]},"263":{"position":[[145,13]]},"267":{"position":[[8,12],[212,12]]},"280":{"position":[[397,10]]},"283":{"position":[[63,13]]},"285":{"position":[[141,13]]},"286":{"position":[[437,13]]},"289":{"position":[[36,12]]},"292":{"position":[[321,10]]},"293":{"position":[[309,10]]},"294":{"position":[[37,13]]},"317":{"position":[[269,12]]},"321":{"position":[[580,13]]},"331":{"position":[[364,7]]},"347":{"position":[[45,12]]},"362":{"position":[[1116,12]]},"365":{"position":[[1505,12]]},"370":{"position":[[49,13]]},"373":{"position":[[434,12]]},"383":{"position":[[231,12]]},"384":{"position":[[305,7]]},"407":{"position":[[472,11]]},"408":{"position":[[67,12],[1374,12]]},"411":{"position":[[5503,7]]},"412":{"position":[[1514,7]]},"418":{"position":[[590,12]]},"419":{"position":[[30,7]]},"427":{"position":[[912,13]]},"430":{"position":[[322,13]]},"432":{"position":[[1004,13]]},"433":{"position":[[400,13]]},"438":{"position":[[375,13]]},"444":{"position":[[527,12]]},"445":{"position":[[284,12]]},"446":{"position":[[300,12],[624,12]]},"486":{"position":[[175,11]]},"495":{"position":[[549,7]]},"498":{"position":[[499,12]]},"501":{"position":[[232,13]]},"502":{"position":[[700,13]]},"504":{"position":[[108,12]]},"509":{"position":[[91,10]]},"510":{"position":[[211,13],[394,8]]},"511":{"position":[[45,12]]},"513":{"position":[[309,13]]},"520":{"position":[[143,13]]},"530":{"position":[[262,13]]},"531":{"position":[[45,12]]},"535":{"position":[[415,12]]},"540":{"position":[[40,13]]},"544":{"position":[[333,13]]},"548":{"position":[[236,7]]},"551":{"position":[[118,13]]},"560":{"position":[[736,12]]},"566":{"position":[[205,12]]},"567":{"position":[[121,13]]},"569":{"position":[[1550,7]]},"574":{"position":[[192,13]]},"575":{"position":[[92,12]]},"584":{"position":[[179,10]]},"591":{"position":[[45,12]]},"595":{"position":[[443,12]]},"600":{"position":[[40,13]]},"604":{"position":[[286,13]]},"608":{"position":[[236,7]]},"613":{"position":[[194,13]]},"614":{"position":[[124,12]]},"622":{"position":[[13,7],[180,7]]},"644":{"position":[[507,13]]},"659":{"position":[[778,12]]},"801":{"position":[[842,12]]},"831":{"position":[[369,10]]},"835":{"position":[[883,12]]},"860":{"position":[[227,12]]},"875":{"position":[[9241,7]]},"888":{"position":[[160,7]]},"901":{"position":[[502,13]]},"996":{"position":[[325,7]]},"1184":{"position":[[22,7]]},"1274":{"position":[[583,7]]},"1279":{"position":[[970,7]]}},"keywords":{}}],["capac",{"_index":1193,"title":{},"content":{"169":{"position":[[315,11]]},"392":{"position":[[4916,8]]},"408":{"position":[[960,9]]},"469":{"position":[[1244,8]]},"772":{"position":[[483,9]]},"1089":{"position":[[37,8]]},"1157":{"position":[[108,9]]}},"keywords":{}}],["capacitor",{"_index":142,"title":{"657":{"position":[[0,9]]},"658":{"position":[[23,10]]},"1279":{"position":[[18,10]]}},"content":{"10":{"position":[[430,9]]},"11":{"position":[[77,10]]},"59":{"position":[[235,9]]},"317":{"position":[[25,9]]},"445":{"position":[[1791,10]]},"446":{"position":[[1158,9]]},"447":{"position":[[254,10]]},"535":{"position":[[1312,10]]},"546":{"position":[[279,9]]},"606":{"position":[[278,10]]},"659":{"position":[[1,9]]},"660":{"position":[[7,9],[493,9]]},"661":{"position":[[228,10],[269,10],[432,10],[552,10],[843,9],[1055,11],[1478,9]]},"662":{"position":[[348,10],[484,9],[944,10],[1157,9],[1204,9],[1290,10],[1376,9],[1729,11],[1769,9],[2246,10]]},"793":{"position":[[226,10],[298,11]]},"1196":{"position":[[67,11]]},"1235":{"position":[[382,10]]},"1247":{"position":[[119,10]]},"1274":{"position":[[511,9]]},"1279":{"position":[[20,9],[78,9],[283,9],[480,9],[551,11],[591,9],[898,9],[1068,10]]},"1282":{"position":[[835,11],[1206,11]]}},"keywords":{}}],["capacitor)n",{"_index":3120,"title":{},"content":{"479":{"position":[[359,16]]}},"keywords":{}}],["capacitor.j",{"_index":1052,"title":{"1214":{"position":[[34,13]]}},"content":{"112":{"position":[[143,14]]},"174":{"position":[[2747,14]]},"239":{"position":[[179,13]]},"1214":{"position":[[1008,12]]}},"keywords":{}}],["capacitor/cor",{"_index":3795,"title":{},"content":{"661":{"position":[[860,18]]},"662":{"position":[[1786,18]]},"1279":{"position":[[608,18]]}},"keywords":{}}],["capacitor/cordova",{"_index":146,"title":{},"content":{"11":{"position":[[210,17]]}},"keywords":{}}],["capacitor/prefer",{"_index":3774,"title":{},"content":{"659":{"position":[[248,22],[458,25]]}},"keywords":{}}],["capacitors.j",{"_index":2110,"title":{},"content":{"365":{"position":[[1070,13]]}},"keywords":{}}],["capacitorsqlit",{"_index":3796,"title":{},"content":{"661":{"position":[[888,16]]},"662":{"position":[[1688,16]]},"1279":{"position":[[510,16]]}},"keywords":{}}],["capechoresult",{"_index":3802,"title":{},"content":{"661":{"position":[[992,14]]}},"keywords":{}}],["capncdatabasepathresult",{"_index":3804,"title":{},"content":{"661":{"position":[[1024,23]]}},"keywords":{}}],["capsqlitechang",{"_index":3800,"title":{},"content":{"661":{"position":[[957,17]]}},"keywords":{}}],["capsqliteresult",{"_index":3803,"title":{},"content":{"661":{"position":[[1007,16]]}},"keywords":{}}],["capsqliteset",{"_index":3799,"title":{},"content":{"661":{"position":[[943,13]]}},"keywords":{}}],["capsqlitevalu",{"_index":3801,"title":{},"content":{"661":{"position":[[975,16]]}},"keywords":{}}],["captiv",{"_index":3225,"title":{},"content":{"502":{"position":[[875,9]]}},"keywords":{}}],["captur",{"_index":3287,"title":{},"content":{"525":{"position":[[165,8]]}},"keywords":{}}],["car",{"_index":3457,"title":{},"content":{"569":{"position":[[664,3]]}},"keywords":{}}],["card",{"_index":2576,"title":{},"content":{"408":{"position":[[5378,5]]}},"keywords":{}}],["care",{"_index":889,"title":{"1032":{"position":[[3,7]]}},"content":{"61":{"position":[[430,4]]},"143":{"position":[[203,4]]},"164":{"position":[[318,4]]},"412":{"position":[[11802,7]]},"703":{"position":[[1201,4]]},"780":{"position":[[692,4]]},"785":{"position":[[563,4]]},"1115":{"position":[[857,4]]},"1120":{"position":[[273,6]]},"1141":{"position":[[142,4]]},"1150":{"position":[[503,4]]},"1183":{"position":[[504,4]]}},"keywords":{}}],["carefulli",{"_index":1980,"title":{},"content":{"346":{"position":[[823,9]]},"441":{"position":[[281,10]]},"566":{"position":[[958,9]]},"839":{"position":[[1343,9]]}},"keywords":{}}],["cargo",{"_index":6359,"title":{},"content":{"1280":{"position":[[107,5]]}},"keywords":{}}],["carol",{"_index":4679,"title":{},"content":{"810":{"position":[[248,7]]},"811":{"position":[[228,7]]},"813":{"position":[[311,8]]}},"keywords":{}}],["carolina",{"_index":5723,"title":{},"content":{"1051":{"position":[[255,11],[525,11]]}},"keywords":{}}],["carri",{"_index":3513,"title":{},"content":{"581":{"position":[[524,7]]}},"keywords":{}}],["case",{"_index":67,"title":{"267":{"position":[[4,5]]},"375":{"position":[[4,5]]},"446":{"position":[[4,5]]},"624":{"position":[[24,4]]},"736":{"position":[[4,4]]},"765":{"position":[[4,6]]},"1021":{"position":[[4,5]]},"1124":{"position":[[4,6]]}},"content":{"4":{"position":[[158,6]]},"13":{"position":[[300,6]]},"14":{"position":[[915,5]]},"36":{"position":[[485,6]]},"58":{"position":[[41,6],[127,6]]},"162":{"position":[[818,5]]},"267":{"position":[[94,5],[1456,6]]},"287":{"position":[[130,6]]},"321":{"position":[[444,6]]},"325":{"position":[[281,6]]},"372":{"position":[[9,6]]},"386":{"position":[[64,5]]},"390":{"position":[[1723,6]]},"398":{"position":[[360,6]]},"400":{"position":[[522,4]]},"401":{"position":[[934,5]]},"412":{"position":[[6390,4],[11830,5],[15335,5]]},"418":{"position":[[202,4]]},"420":{"position":[[1228,5],[1458,5]]},"430":{"position":[[77,5]]},"432":{"position":[[770,6],[1355,4]]},"436":{"position":[[387,6]]},"444":{"position":[[421,6]]},"449":{"position":[[79,4]]},"460":{"position":[[461,4]]},"462":{"position":[[244,4]]},"543":{"position":[[238,6]]},"559":{"position":[[1554,6]]},"603":{"position":[[236,6]]},"611":{"position":[[1364,5]]},"614":{"position":[[748,5]]},"617":{"position":[[1130,6]]},"621":{"position":[[653,5]]},"624":{"position":[[104,4],[1330,6]]},"653":{"position":[[82,6]]},"670":{"position":[[57,4],[362,5]]},"681":{"position":[[95,6],[196,6]]},"682":{"position":[[245,6]]},"687":{"position":[[127,5]]},"689":{"position":[[471,6]]},"698":{"position":[[959,6],[2081,6]]},"703":{"position":[[690,5],[1260,6],[1623,6]]},"707":{"position":[[428,4]]},"714":{"position":[[977,6]]},"723":{"position":[[2295,5]]},"730":{"position":[[89,6]]},"740":{"position":[[202,5]]},"815":{"position":[[288,5]]},"829":{"position":[[2138,5],[2915,5]]},"834":{"position":[[124,6]]},"841":{"position":[[1326,5]]},"875":{"position":[[8545,4]]},"881":{"position":[[38,5]]},"902":{"position":[[942,6]]},"904":{"position":[[2012,5]]},"962":{"position":[[213,4]]},"966":{"position":[[239,5]]},"987":{"position":[[246,4]]},"990":{"position":[[389,5]]},"1022":{"position":[[343,4]]},"1065":{"position":[[1197,4]]},"1068":{"position":[[454,4]]},"1072":{"position":[[1635,4],[1766,4],[1999,4],[2069,4],[2187,4],[2588,4],[2723,4]]},"1090":{"position":[[1241,5]]},"1091":{"position":[[139,5]]},"1105":{"position":[[398,5]]},"1124":{"position":[[100,5]]},"1146":{"position":[[95,6]]},"1152":{"position":[[71,5]]},"1157":{"position":[[483,5]]},"1193":{"position":[[193,5]]},"1195":{"position":[[130,5]]},"1198":{"position":[[62,4],[1481,5]]},"1208":{"position":[[628,6]]},"1222":{"position":[[1032,5]]},"1243":{"position":[[67,6]]},"1305":{"position":[[244,6]]},"1307":{"position":[[621,5]]}},"keywords":{}}],["cases.discord",{"_index":2862,"title":{},"content":{"422":{"position":[[163,14]]}},"keywords":{}}],["cases.web",{"_index":3344,"title":{},"content":{"554":{"position":[[110,9]]}},"keywords":{}}],["cassandra",{"_index":6582,"title":{},"content":{"1324":{"position":[[921,10]]}},"keywords":{}}],["cat.txt",{"_index":4610,"title":{},"content":{"792":{"position":[[359,10]]},"917":{"position":[[173,10]]},"918":{"position":[[134,10]]}},"keywords":{}}],["catch",{"_index":1811,"title":{},"content":{"302":{"position":[[836,5]]},"361":{"position":[[150,8]]},"412":{"position":[[6068,5]]},"838":{"position":[[1017,5]]},"875":{"position":[[8854,5]]},"984":{"position":[[110,5]]},"995":{"position":[[1560,11]]},"1031":{"position":[[150,5]]},"1085":{"position":[[2662,5]]}},"keywords":{}}],["catch(error",{"_index":3559,"title":{},"content":{"610":{"position":[[1130,12]]}},"keywords":{}}],["categori",{"_index":2207,"title":{},"content":{"390":{"position":[[1556,10]]},"1020":{"position":[[653,9]]}},"keywords":{}}],["cater",{"_index":1653,"title":{},"content":{"280":{"position":[[473,8]]},"368":{"position":[[189,8]]},"504":{"position":[[6,6]]}},"keywords":{}}],["caught",{"_index":1574,"title":{},"content":{"255":{"position":[[220,6]]},"1085":{"position":[[2548,6]]}},"keywords":{}}],["caus",{"_index":1548,"title":{"627":{"position":[[22,5]]}},"content":{"250":{"position":[[79,5]]},"367":{"position":[[68,5]]},"457":{"position":[[681,5]]},"642":{"position":[[283,5]]},"749":{"position":[[21941,6]]},"835":{"position":[[337,5]]},"837":{"position":[[726,6]]},"858":{"position":[[566,5]]},"876":{"position":[[349,6]]},"885":{"position":[[1127,6]]},"1031":{"position":[[92,5]]},"1065":{"position":[[696,5]]},"1085":{"position":[[258,5],[3124,5]]},"1120":{"position":[[331,5]]},"1157":{"position":[[326,5]]},"1295":{"position":[[1478,5]]}},"keywords":{}}],["caveat",{"_index":1738,"title":{},"content":{"299":{"position":[[178,7]]},"495":{"position":[[50,8]]}},"keywords":{}}],["cbc",{"_index":4034,"title":{},"content":{"718":{"position":[[524,4]]}},"keywords":{}}],["cd",{"_index":3825,"title":{},"content":{"666":{"position":[[216,2]]}},"keywords":{}}],["ceil",{"_index":2538,"title":{},"content":{"408":{"position":[[1343,8],[4992,7]]}},"keywords":{}}],["center",{"_index":3475,"title":{},"content":{"574":{"position":[[68,8]]}},"keywords":{}}],["central",{"_index":478,"title":{},"content":{"29":{"position":[[177,11]]},"43":{"position":[[81,11],[137,8]]},"201":{"position":[[52,7]]},"210":{"position":[[24,11]]},"212":{"position":[[650,7]]},"261":{"position":[[31,7],[1160,7]]},"289":{"position":[[1776,7]]},"293":{"position":[[388,7]]},"321":{"position":[[174,7]]},"346":{"position":[[1,10]]},"365":{"position":[[1444,11]]},"411":{"position":[[4932,7],[5156,7]]},"412":{"position":[[11978,11]]},"416":{"position":[[343,7]]},"418":{"position":[[311,7],[648,7]]},"590":{"position":[[82,10]]},"901":{"position":[[189,7]]},"902":{"position":[[33,7],[215,7],[591,7]]},"903":{"position":[[58,11]]}},"keywords":{}}],["centric",{"_index":1418,"title":{},"content":{"231":{"position":[[266,7]]},"241":{"position":[[598,7]]},"279":{"position":[[403,7]]},"354":{"position":[[1590,8]]},"362":{"position":[[157,7]]},"388":{"position":[[365,7]]}},"keywords":{}}],["certain",{"_index":1558,"title":{},"content":{"252":{"position":[[40,7]]},"266":{"position":[[517,7]]},"303":{"position":[[1493,7]]},"354":{"position":[[140,7]]},"396":{"position":[[1578,7]]},"412":{"position":[[8594,7],[12899,7]]},"460":{"position":[[991,7]]},"480":{"position":[[1040,7]]},"496":{"position":[[470,7]]},"545":{"position":[[106,7]]},"559":{"position":[[1050,7]]},"569":{"position":[[907,7]]},"605":{"position":[[106,7]]},"618":{"position":[[302,7]]},"688":{"position":[[632,7]]},"714":{"position":[[651,7]]},"759":{"position":[[1460,7]]},"765":{"position":[[212,7]]},"839":{"position":[[749,7]]},"1072":{"position":[[473,7]]}},"keywords":{}}],["certainli",{"_index":2122,"title":{},"content":{"369":{"position":[[1,10]]}},"keywords":{}}],["certif",{"_index":3381,"title":{},"content":{"556":{"position":[[1951,12],[2009,12]]}},"keywords":{}}],["chain",{"_index":2508,"title":{},"content":{"404":{"position":[[842,8]]},"682":{"position":[[119,7]]},"749":{"position":[[3181,7]]},"1064":{"position":[[8,7],[268,7]]},"1065":{"position":[[161,7],[1414,7]]}},"keywords":{}}],["challeng",{"_index":1164,"title":{"412":{"position":[[0,10]]}},"content":{"152":{"position":[[357,11]]},"170":{"position":[[272,10]]},"223":{"position":[[68,12]]},"240":{"position":[[109,12],[140,9]]},"282":{"position":[[97,12]]},"289":{"position":[[2004,11]]},"392":{"position":[[3007,11]]},"394":{"position":[[1398,10]]},"396":{"position":[[1525,10]]},"399":{"position":[[141,9]]},"412":{"position":[[51,11],[334,11],[788,9],[8646,10],[14904,11],[15072,11]]},"417":{"position":[[121,10]]},"427":{"position":[[936,11]]},"432":{"position":[[664,9]]},"521":{"position":[[42,11]]},"535":{"position":[[617,12]]},"595":{"position":[[644,12]]},"618":{"position":[[190,10]]},"624":{"position":[[903,11]]}},"keywords":{}}],["champion",{"_index":3514,"title":{},"content":{"582":{"position":[[6,9]]}},"keywords":{}}],["chanc",{"_index":3097,"title":{},"content":{"470":{"position":[[81,6]]},"696":{"position":[[1540,6]]},"797":{"position":[[58,6]]}},"keywords":{}}],["chang",{"_index":330,"title":{"50":{"position":[[6,6]]},"77":{"position":[[60,8]]},"79":{"position":[[19,8]]},"103":{"position":[[60,8]]},"110":{"position":[[19,8]]},"129":{"position":[[6,6]]},"140":{"position":[[0,6]]},"168":{"position":[[0,6]]},"196":{"position":[[0,6]]},"240":{"position":[[16,7]]},"344":{"position":[[0,6]]},"367":{"position":[[47,8]]},"403":{"position":[[30,8]]},"490":{"position":[[13,7]]},"509":{"position":[[0,6]]},"529":{"position":[[0,6]]},"585":{"position":[[23,6]]},"634":{"position":[[28,8]]},"719":{"position":[[0,8]]},"750":{"position":[[32,7]]},"1106":{"position":[[0,6]]}},"content":{"19":{"position":[[416,6]]},"34":{"position":[[472,8]]},"36":{"position":[[272,7]]},"38":{"position":[[595,7]]},"39":{"position":[[98,7]]},"47":{"position":[[760,8],[801,7],[910,7]]},"50":{"position":[[102,6],[323,6]]},"53":{"position":[[59,7]]},"57":{"position":[[175,8]]},"65":{"position":[[683,8]]},"77":{"position":[[112,8]]},"79":{"position":[[52,8]]},"89":{"position":[[297,7]]},"90":{"position":[[207,7]]},"99":{"position":[[374,7]]},"103":{"position":[[92,7]]},"106":{"position":[[139,7]]},"110":{"position":[[32,8]]},"121":{"position":[[209,7]]},"122":{"position":[[208,7]]},"124":{"position":[[173,8],[281,7]]},"125":{"position":[[219,7]]},"129":{"position":[[14,6],[74,8],[175,6],[218,7],[285,6],[486,7],[636,6]]},"130":{"position":[[326,7]]},"133":{"position":[[202,7]]},"136":{"position":[[80,7]]},"140":{"position":[[14,6],[65,7],[126,6],[261,6]]},"156":{"position":[[159,6],[268,8]]},"159":{"position":[[242,8]]},"160":{"position":[[138,7]]},"168":{"position":[[13,6],[96,7],[123,6],[236,6]]},"170":{"position":[[416,6]]},"173":{"position":[[1016,8]]},"174":{"position":[[335,8],[1114,7],[2048,7],[2115,7]]},"182":{"position":[[192,8]]},"185":{"position":[[121,8]]},"188":{"position":[[1032,6]]},"191":{"position":[[121,7]]},"196":{"position":[[15,6],[63,7],[92,6],[251,8]]},"201":{"position":[[404,7]]},"204":{"position":[[252,8]]},"208":{"position":[[212,7],[288,7]]},"209":{"position":[[763,7],[886,8]]},"210":{"position":[[681,7]]},"221":{"position":[[69,8],[223,7]]},"226":{"position":[[278,7]]},"233":{"position":[[135,7]]},"235":{"position":[[72,7],[206,7]]},"240":{"position":[[94,7],[201,8]]},"248":{"position":[[278,7]]},"249":{"position":[[453,7]]},"254":{"position":[[514,7]]},"255":{"position":[[165,7],[1585,7]]},"262":{"position":[[578,6]]},"267":{"position":[[559,7],[692,7]]},"274":{"position":[[325,7]]},"275":{"position":[[171,7]]},"277":{"position":[[142,7],[188,7]]},"282":{"position":[[8,7],[289,7]]},"283":{"position":[[334,6],[469,7]]},"289":{"position":[[191,8]]},"299":{"position":[[1439,7]]},"309":{"position":[[314,7]]},"314":{"position":[[1164,6]]},"322":{"position":[[241,7]]},"323":{"position":[[73,8],[122,7]]},"325":{"position":[[100,7]]},"326":{"position":[[171,7],[219,7],[277,6]]},"328":{"position":[[291,7]]},"329":{"position":[[96,8]]},"330":{"position":[[75,7]]},"335":{"position":[[878,7]]},"339":{"position":[[171,7]]},"340":{"position":[[17,7]]},"344":{"position":[[5,6],[177,8]]},"351":{"position":[[202,7]]},"352":{"position":[[54,8]]},"354":{"position":[[1707,8]]},"360":{"position":[[378,7],[485,7]]},"367":{"position":[[112,8]]},"369":{"position":[[1293,8]]},"375":{"position":[[261,7]]},"379":{"position":[[75,7],[154,6]]},"380":{"position":[[224,7]]},"382":{"position":[[252,8]]},"391":{"position":[[1067,6]]},"403":{"position":[[10,6],[313,7]]},"404":{"position":[[162,8]]},"410":{"position":[[1087,7],[1761,7],[1963,8],[2226,7]]},"411":{"position":[[170,8],[532,7],[882,8],[958,6],[1466,7],[2353,7],[2810,7],[2879,7],[3188,7],[3256,8],[3466,7],[4405,6],[4530,7]]},"412":{"position":[[717,7],[1125,6],[2097,8],[2627,7],[3200,7],[3443,8],[3746,7],[11056,6]]},"420":{"position":[[698,7],[898,6]]},"432":{"position":[[806,7]]},"445":{"position":[[1005,6],[1096,7],[1492,7]]},"446":{"position":[[333,7]]},"458":{"position":[[285,7],[699,8],[737,7],[1253,8],[1601,8]]},"464":{"position":[[91,7],[1112,7]]},"470":{"position":[[268,7]]},"475":{"position":[[193,7]]},"476":{"position":[[261,8]]},"480":{"position":[[693,7],[823,7]]},"481":{"position":[[43,7]]},"486":{"position":[[317,7]]},"487":{"position":[[177,7]]},"489":{"position":[[421,7],[782,7]]},"490":{"position":[[65,7],[255,8],[393,7]]},"491":{"position":[[300,7],[416,7],[704,7],[1119,7],[1289,7],[1575,7]]},"493":{"position":[[542,8]]},"494":{"position":[[264,7]]},"495":{"position":[[305,7]]},"496":{"position":[[358,8]]},"502":{"position":[[780,7],[1063,7]]},"509":{"position":[[17,6],[64,7]]},"514":{"position":[[365,7]]},"515":{"position":[[269,7]]},"516":{"position":[[317,7]]},"517":{"position":[[279,7]]},"518":{"position":[[53,8],[239,7],[366,8],[530,7]]},"519":{"position":[[162,7]]},"523":{"position":[[187,7]]},"525":{"position":[[140,7]]},"529":{"position":[[41,6],[89,7]]},"535":{"position":[[974,7]]},"541":{"position":[[786,8],[854,8]]},"542":{"position":[[991,8]]},"544":{"position":[[209,7]]},"562":{"position":[[877,8],[1278,7],[1675,7]]},"565":{"position":[[180,7]]},"570":{"position":[[290,7],[783,7]]},"571":{"position":[[181,8],[313,6],[998,8],[1768,7]]},"574":{"position":[[318,7]]},"575":{"position":[[571,7],[717,7]]},"580":{"position":[[94,7],[644,6]]},"582":{"position":[[179,7],[321,6],[399,7]]},"585":{"position":[[81,6]]},"589":{"position":[[128,7]]},"590":{"position":[[883,7]]},"595":{"position":[[1051,7]]},"600":{"position":[[174,7]]},"601":{"position":[[767,8],[835,7]]},"604":{"position":[[181,7]]},"630":{"position":[[402,7],[855,7]]},"632":{"position":[[62,7],[324,7],[1743,7],[1999,7],[2555,7],[2745,8]]},"634":{"position":[[154,7],[530,7]]},"636":{"position":[[38,7]]},"648":{"position":[[59,7],[341,7]]},"662":{"position":[[143,7]]},"668":{"position":[[245,8]]},"687":{"position":[[76,7]]},"688":{"position":[[360,7]]},"689":{"position":[[257,7]]},"691":{"position":[[181,7],[548,6]]},"696":{"position":[[221,7]]},"698":{"position":[[864,7],[1763,6],[2655,7],[2758,6],[2812,7],[2880,7],[2947,7]]},"699":{"position":[[67,6],[95,7]]},"702":{"position":[[56,6],[128,6]]},"709":{"position":[[596,7]]},"719":{"position":[[65,6],[179,6]]},"723":{"position":[[1597,7]]},"749":{"position":[[8948,8],[11401,7]]},"754":{"position":[[76,8],[642,6]]},"764":{"position":[[96,6],[217,7]]},"766":{"position":[[172,6]]},"773":{"position":[[700,6]]},"778":{"position":[[591,7]]},"779":{"position":[[213,6]]},"781":{"position":[[898,8]]},"783":{"position":[[219,7]]},"784":{"position":[[573,7]]},"785":{"position":[[421,8]]},"828":{"position":[[39,7]]},"829":{"position":[[2774,7],[3056,8],[3695,8]]},"836":{"position":[[2065,7]]},"838":{"position":[[172,7],[502,8],[1701,8]]},"839":{"position":[[1108,7]]},"841":{"position":[[537,7]]},"846":{"position":[[1105,7]]},"848":{"position":[[913,7]]},"854":{"position":[[1323,8]]},"855":{"position":[[261,6]]},"860":{"position":[[549,8]]},"867":{"position":[[256,6]]},"870":{"position":[[145,6]]},"871":{"position":[[132,7]]},"875":{"position":[[3681,6],[3802,6],[5951,6],[6647,7],[6757,7],[8660,7]]},"876":{"position":[[360,7]]},"881":{"position":[[78,8]]},"886":{"position":[[1619,7],[2162,7]]},"890":{"position":[[244,7]]},"897":{"position":[[283,7]]},"898":{"position":[[1444,7]]},"903":{"position":[[545,7]]},"927":{"position":[[175,6],[208,8]]},"932":{"position":[[547,6]]},"941":{"position":[[65,6]]},"981":{"position":[[1335,7]]},"982":{"position":[[347,7],[383,7],[644,7],[677,6]]},"985":{"position":[[333,7]]},"986":{"position":[[1249,7]]},"987":{"position":[[940,7]]},"988":{"position":[[2351,7],[3454,7]]},"991":{"position":[[196,6]]},"996":{"position":[[247,7],[462,7]]},"1007":{"position":[[599,7],[1989,8]]},"1018":{"position":[[161,6]]},"1039":{"position":[[133,8]]},"1044":{"position":[[17,6],[170,6]]},"1048":{"position":[[23,6]]},"1069":{"position":[[102,6],[272,8],[346,7],[413,6]]},"1083":{"position":[[161,7]]},"1085":{"position":[[228,8],[2690,6],[2738,7],[3000,6],[3206,7],[3238,6],[3456,6]]},"1088":{"position":[[648,6]]},"1100":{"position":[[924,6]]},"1106":{"position":[[5,6],[177,6],[282,6],[441,6],[564,7]]},"1109":{"position":[[210,8]]},"1115":{"position":[[888,6]]},"1119":{"position":[[20,7]]},"1124":{"position":[[1012,7],[1179,7]]},"1134":{"position":[[658,6]]},"1138":{"position":[[427,6],[517,6]]},"1150":{"position":[[94,8],[134,7],[525,7]]},"1177":{"position":[[108,7]]},"1185":{"position":[[144,7]]},"1198":{"position":[[1639,8],[1919,6]]},"1204":{"position":[[109,7]]},"1208":{"position":[[1774,7]]},"1222":{"position":[[473,8],[811,8]]},"1230":{"position":[[148,6]]},"1297":{"position":[[300,7]]},"1300":{"position":[[989,8]]},"1304":{"position":[[978,7]]},"1313":{"position":[[643,6],[736,7]]},"1314":{"position":[[458,7]]},"1315":{"position":[[1212,6],[1452,7],[1605,7],[1622,6]]},"1316":{"position":[[1164,7],[2878,7],[3204,8],[3302,7],[3332,7]]},"1317":{"position":[[108,7],[158,7],[291,7],[603,6]]},"1318":{"position":[[920,8],[993,6]]},"1319":{"position":[[21,6],[493,8]]}},"keywords":{}}],["change.assumedmasterstate.myreadonlyfield",{"_index":5973,"title":{},"content":{"1109":{"position":[[266,43]]}},"keywords":{}}],["change.pass",{"_index":3178,"title":{},"content":{"493":{"position":[[424,13]]}},"keywords":{}}],["change.w",{"_index":6560,"title":{},"content":{"1316":{"position":[[2839,9]]}},"keywords":{}}],["changed"",{"_index":5061,"title":{},"content":{"875":{"position":[[9105,13]]}},"keywords":{}}],["changedth",{"_index":5809,"title":{},"content":{"1074":{"position":[[476,10]]}},"keywords":{}}],["changeev",{"_index":5707,"title":{},"content":{"1046":{"position":[[107,12]]}},"keywords":{}}],["changefunct",{"_index":5688,"title":{},"content":{"1042":{"position":[[111,14]]}},"keywords":{}}],["changepoint",{"_index":4988,"title":{},"content":{"875":{"position":[[1557,11]]}},"keywords":{}}],["changer",{"_index":1635,"title":{},"content":{"274":{"position":[[52,7]]},"445":{"position":[[64,7]]}},"keywords":{}}],["changerow",{"_index":5019,"title":{},"content":{"875":{"position":[[4480,10],[4605,9],[4618,12]]}},"keywords":{}}],["changerow.assumedmasterst",{"_index":5024,"title":{},"content":{"875":{"position":[[4748,29],[4810,28]]}},"keywords":{}}],["changerow.assumedmasterstate.updatedat",{"_index":5026,"title":{},"content":{"875":{"position":[[5059,38]]}},"keywords":{}}],["changerow.newdocumentst",{"_index":5029,"title":{},"content":{"875":{"position":[[5272,26]]}},"keywords":{}}],["changerow.newdocumentstate.id",{"_index":5023,"title":{},"content":{"875":{"position":[[4684,32],[5240,31],[5377,30]]}},"keywords":{}}],["changerow.newdocumentstate.updatedat",{"_index":5032,"title":{},"content":{"875":{"position":[[5419,36]]}},"keywords":{}}],["changes.handl",{"_index":1972,"title":{},"content":{"346":{"position":[[317,14]]}},"keywords":{}}],["changes.multi",{"_index":1925,"title":{},"content":{"323":{"position":[[506,13]]}},"keywords":{}}],["changes.multiinst",{"_index":5392,"title":{},"content":{"964":{"position":[[345,21]]}},"keywords":{}}],["changes.no",{"_index":2059,"title":{},"content":{"358":{"position":[[326,10]]}},"keywords":{}}],["changes.offlin",{"_index":3483,"title":{},"content":{"575":{"position":[[309,15]]}},"keywords":{}}],["changes.y",{"_index":6542,"title":{},"content":{"1316":{"position":[[560,11]]}},"keywords":{}}],["changesschema",{"_index":3697,"title":{},"content":{"631":{"position":[[298,13]]}},"keywords":{}}],["changestream",{"_index":282,"title":{},"content":{"16":{"position":[[567,13]]},"23":{"position":[[433,12]]},"698":{"position":[[1021,12],[1055,12]]},"781":{"position":[[692,12]]},"846":{"position":[[938,13]]},"872":{"position":[[409,12],[1176,13]]},"1135":{"position":[[39,13],[315,12]]}},"keywords":{}}],["changestreampreandpostimag",{"_index":4952,"title":{},"content":{"872":{"position":[[1082,29],[1190,28]]}},"keywords":{}}],["changes—perfect",{"_index":3430,"title":{},"content":{"562":{"position":[[987,15]]}},"keywords":{}}],["changevalid",{"_index":5951,"title":{},"content":{"1104":{"position":[[242,16],[484,16]]},"1106":{"position":[[754,16]]},"1109":{"position":[[146,16]]}},"keywords":{}}],["changevalidatormust",{"_index":5959,"title":{},"content":{"1105":{"position":[[1063,19]]}},"keywords":{}}],["channel",{"_index":2638,"title":{},"content":{"411":{"position":[[5107,8]]},"611":{"position":[[48,7]]},"617":{"position":[[2236,7]]},"743":{"position":[[54,7]]},"1126":{"position":[[498,7]]},"1218":{"position":[[48,7]]},"1246":{"position":[[774,8]]}},"keywords":{}}],["channels.th",{"_index":5252,"title":{},"content":{"903":{"position":[[468,12]]}},"keywords":{}}],["channelsconflict",{"_index":5184,"title":{},"content":{"896":{"position":[[253,16]]}},"keywords":{}}],["char",{"_index":4138,"title":{},"content":{"749":{"position":[[377,4]]}},"keywords":{}}],["charact",{"_index":2354,"title":{},"content":{"397":{"position":[[233,11]]},"523":{"position":[[462,11]]},"863":{"position":[[42,10]]},"963":{"position":[[163,11]]}},"keywords":{}}],["character={charact",{"_index":3278,"title":{},"content":{"523":{"position":[[704,21]]}},"keywords":{}}],["characterist",{"_index":960,"title":{"360":{"position":[[4,16]]}},"content":{"70":{"position":[[105,15]]},"566":{"position":[[1,14]]},"828":{"position":[[495,15]]},"841":{"position":[[1,14]]}},"keywords":{}}],["characteristics.anomali",{"_index":2202,"title":{},"content":{"390":{"position":[[1451,23]]}},"keywords":{}}],["characters.map((charact",{"_index":3276,"title":{},"content":{"523":{"position":[[647,27]]}},"keywords":{}}],["characters.th",{"_index":4912,"title":{},"content":{"863":{"position":[[176,14]]}},"keywords":{}}],["charg",{"_index":1555,"title":{},"content":{"251":{"position":[[143,8]]}},"keywords":{}}],["chart",{"_index":4085,"title":{},"content":{"736":{"position":[[102,7]]},"772":{"position":[[2545,5]]}},"keywords":{}}],["chat",{"_index":1158,"title":{},"content":{"151":{"position":[[383,4]]},"267":{"position":[[110,4],[266,4],[458,4],[1476,4]]},"296":{"position":[[80,4]]},"318":{"position":[[549,4]]},"353":{"position":[[703,4]]},"375":{"position":[[596,4]]},"379":{"position":[[221,4]]},"415":{"position":[[120,5]]},"418":{"position":[[118,4]]},"483":{"position":[[945,4]]},"491":{"position":[[1805,6]]},"497":{"position":[[41,4]]},"572":{"position":[[109,4]]},"611":{"position":[[304,5]]},"624":{"position":[[797,4]]},"696":{"position":[[416,4]]},"749":{"position":[[86,4],[433,4],[560,4],[651,4],[804,4],[941,4],[1076,4],[1300,4],[1388,4],[1537,4],[1640,4],[1737,4],[1854,4],[1980,4],[2083,4],[2189,4],[2283,4],[2376,4],[2461,4],[2578,4],[2819,4],[2932,4],[3165,4],[3285,4],[3641,4],[3838,4],[3925,4],[3997,4],[4112,4],[4228,4],[4350,4],[4527,4],[4601,4],[4708,4],[4843,4],[4975,4],[5127,4],[5229,4],[5341,4],[5548,4],[6056,4],[6192,4],[6328,4],[6447,4],[6589,4],[6701,4],[6816,4],[6940,4],[7048,4],[7167,4],[7291,4],[7474,4],[7554,4],[7631,4],[7730,4],[7834,4],[7929,4],[8029,4],[8123,4],[8221,4],[8329,4],[8424,4],[8524,4],[8646,4],[8723,4],[8897,4],[9047,4],[9205,4],[9496,4],[9641,4],[9725,4],[9813,4],[9920,4],[10034,4],[10152,4],[10261,4],[10366,4],[10454,4],[10577,4],[10681,4],[10787,4],[10878,4],[10960,4],[11098,4],[11239,4],[11350,4],[11449,4],[11525,4],[11670,4],[11767,4],[11876,4],[12177,4],[12268,4],[12395,4],[12476,4],[12549,4],[12764,4],[12873,4],[12950,4],[13059,4],[13176,4],[13250,4],[13370,4],[13499,4],[13622,4],[13745,4],[13843,4],[13987,4],[14070,4],[14164,4],[14276,4],[14361,4],[14557,4],[14639,4],[14754,4],[14910,4],[15121,4],[15280,4],[15455,4],[15587,4],[15721,4],[15853,4],[15988,4],[16090,4],[16238,4],[16357,4],[16479,4],[16628,4],[16821,4],[16910,4],[17016,4],[17139,4],[17288,4],[17397,4],[17513,4],[17631,4],[17754,4],[17863,4],[17984,4],[18106,4],[18203,4],[18303,4],[18485,4],[18579,4],[18698,4],[18802,4],[18908,4],[19011,4],[19105,4],[19307,4],[19435,4],[19561,4],[19676,4],[19777,4],[19869,4],[19993,4],[20111,4],[20268,4],[20434,4],[20535,4],[20702,4],[20839,4],[21012,4],[21296,4],[21450,4],[21713,4],[22015,4],[22135,4],[22219,4],[22337,4],[22444,4],[22564,4],[22704,4],[22833,4],[22993,4],[23186,4],[23312,4],[23444,4],[23577,4],[23768,4],[23950,4],[24070,4],[24231,4],[24361,4],[24441,4]]},"783":{"position":[[335,4]]},"824":{"position":[[394,5]]},"899":{"position":[[441,4]]}},"keywords":{}}],["cheaper",{"_index":2582,"title":{},"content":{"409":{"position":[[45,7]]}},"keywords":{}}],["check",{"_index":993,"title":{"300":{"position":[[0,8]]},"761":{"position":[[16,5]]}},"content":{"84":{"position":[[79,5]]},"114":{"position":[[92,5]]},"149":{"position":[[92,5]]},"188":{"position":[[2499,5]]},"253":{"position":[[72,5]]},"263":{"position":[[380,5]]},"306":{"position":[[15,8]]},"347":{"position":[[92,5]]},"362":{"position":[[1163,5]]},"404":{"position":[[251,5]]},"412":{"position":[[4896,5]]},"489":{"position":[[213,5]]},"491":{"position":[[1928,5]]},"495":{"position":[[650,5]]},"498":{"position":[[228,5]]},"511":{"position":[[92,5]]},"531":{"position":[[92,5]]},"557":{"position":[[138,5]]},"566":{"position":[[521,6]]},"567":{"position":[[845,5]]},"591":{"position":[[92,5]]},"628":{"position":[[1,5]]},"679":{"position":[[309,5]]},"683":{"position":[[607,5]]},"710":{"position":[[2510,5]]},"752":{"position":[[615,5]]},"761":{"position":[[20,5],[336,5]]},"776":{"position":[[1,5]]},"802":{"position":[[329,6]]},"824":{"position":[[266,5]]},"838":{"position":[[3238,5]]},"841":{"position":[[1221,7]]},"842":{"position":[[65,5]]},"875":{"position":[[4989,5]]},"890":{"position":[[970,5]]},"906":{"position":[[1119,5]]},"913":{"position":[[1,5]]},"943":{"position":[[221,5]]},"1044":{"position":[[127,6]]},"1065":{"position":[[960,6]]},"1090":{"position":[[1104,5]]},"1106":{"position":[[428,5]]},"1228":{"position":[[35,5]]},"1237":{"position":[[188,7]]},"1272":{"position":[[364,5]]},"1298":{"position":[[272,5]]},"1309":{"position":[[820,5]]},"1317":{"position":[[214,5],[514,5],[623,5]]}},"keywords":{}}],["check'",{"_index":5902,"title":{},"content":{"1085":{"position":[[3179,7]]}},"keywords":{}}],["check.j",{"_index":4509,"title":{},"content":{"761":{"position":[[655,10],[778,10]]}},"keywords":{}}],["checkout",{"_index":3194,"title":{},"content":{"496":{"position":[[522,10]]}},"keywords":{}}],["checkpoint",{"_index":3684,"title":{"984":{"position":[[0,10]]}},"content":{"626":{"position":[[684,10],[1016,10]]},"632":{"position":[[121,10]]},"647":{"position":[[109,10],[506,10]]},"756":{"position":[[375,10],[450,11]]},"875":{"position":[[1457,11],[1473,10],[1828,10],[1849,11],[2850,11],[3500,11],[4575,11],[8338,11],[9286,10]]},"885":{"position":[[89,10],[237,11],[721,10],[808,11],[820,10],[868,11],[2451,10],[2619,11]]},"886":{"position":[[131,10],[388,12],[453,10],[503,13],[519,10],[659,12],[733,10],[824,11],[3648,10]]},"888":{"position":[[189,11],[302,10],[852,10],[935,10],[1075,11]]},"897":{"position":[[159,10]]},"898":{"position":[[3774,10]]},"983":{"position":[[214,10],[306,11],[335,10],[801,10]]},"984":{"position":[[72,10],[144,10],[219,10],[366,11],[471,11],[493,10],[531,11]]},"985":{"position":[[240,11],[398,10],[687,10]]},"986":{"position":[[323,11],[1312,10]]},"988":{"position":[[4172,10],[4257,10],[4306,11],[5483,11],[6008,11]]},"996":{"position":[[57,10]]},"1002":{"position":[[244,11],[277,10],[408,12],[645,12],[860,10],[952,10],[1299,12]]},"1008":{"position":[[60,14]]},"1020":{"position":[[217,10]]},"1294":{"position":[[669,10],[1240,11]]},"1296":{"position":[[1257,11]]}},"keywords":{}}],["checkpoint')).json",{"_index":5542,"title":{},"content":{"1002":{"position":[[1052,21]]}},"keywords":{}}],["checkpointinput",{"_index":5118,"title":{},"content":{"886":{"position":[[604,16]]}},"keywords":{}}],["checkpointornul",{"_index":5007,"title":{},"content":{"875":{"position":[[3204,16],[3266,16]]}},"keywords":{}}],["checkpointornull.id",{"_index":5009,"title":{},"content":{"875":{"position":[[3285,19]]}},"keywords":{}}],["checkpointornull.updatedat",{"_index":5008,"title":{},"content":{"875":{"position":[[3223,26]]}},"keywords":{}}],["childpath",{"_index":4270,"title":{},"content":{"749":{"position":[[10500,9]]}},"keywords":{}}],["chip",{"_index":3464,"title":{},"content":{"569":{"position":[[885,4]]}},"keywords":{}}],["choic",{"_index":560,"title":{},"content":{"35":{"position":[[511,6]]},"64":{"position":[[179,6]]},"67":{"position":[[87,6]]},"71":{"position":[[22,6]]},"83":{"position":[[212,6]]},"98":{"position":[[102,6]]},"102":{"position":[[33,6]]},"118":{"position":[[355,6]]},"161":{"position":[[85,7]]},"174":{"position":[[154,7],[1469,6]]},"175":{"position":[[658,6]]},"179":{"position":[[222,6]]},"186":{"position":[[357,6]]},"207":{"position":[[271,7]]},"238":{"position":[[291,7]]},"241":{"position":[[654,6]]},"265":{"position":[[855,6]]},"267":{"position":[[246,6],[1415,6]]},"279":{"position":[[103,6]]},"287":{"position":[[745,6]]},"290":{"position":[[194,6]]},"353":{"position":[[463,6]]},"354":{"position":[[1573,7]]},"365":{"position":[[1274,7]]},"366":{"position":[[410,6]]},"371":{"position":[[264,6]]},"387":{"position":[[431,6]]},"435":{"position":[[327,6]]},"441":{"position":[[156,6]]},"445":{"position":[[905,6]]},"446":{"position":[[46,6]]},"500":{"position":[[327,6]]},"624":{"position":[[480,6],[771,6]]},"640":{"position":[[106,7]]},"1085":{"position":[[1838,6]]},"1198":{"position":[[1512,6]]}},"keywords":{}}],["choos",{"_index":1110,"title":{"364":{"position":[[4,6]]},"418":{"position":[[8,6]]},"441":{"position":[[12,8]]},"473":{"position":[[4,6]]},"690":{"position":[[8,6]]}},"content":{"131":{"position":[[913,6]]},"146":{"position":[[283,6]]},"162":{"position":[[760,6]]},"174":{"position":[[3152,6]]},"178":{"position":[[292,8]]},"189":{"position":[[653,8]]},"202":{"position":[[87,6]]},"247":{"position":[[139,8]]},"266":{"position":[[379,6]]},"278":{"position":[[18,8]]},"393":{"position":[[384,6]]},"401":{"position":[[896,8]]},"483":{"position":[[190,8]]},"489":{"position":[[151,6]]},"496":{"position":[[325,8],[594,6]]},"524":{"position":[[103,6]]},"581":{"position":[[610,6]]},"640":{"position":[[425,8]]},"707":{"position":[[380,8]]},"759":{"position":[[1495,8]]},"1147":{"position":[[371,6]]},"1294":{"position":[[1912,8]]}},"keywords":{}}],["chosen",{"_index":1667,"title":{},"content":{"286":{"position":[[366,6]]},"369":{"position":[[1425,6]]},"798":{"position":[[874,6]]},"1066":{"position":[[680,6]]}},"keywords":{}}],["chrome",{"_index":1706,"title":{},"content":{"298":{"position":[[155,7],[459,6]]},"299":{"position":[[1026,6],[1052,6]]},"301":{"position":[[448,6]]},"404":{"position":[[273,6]]},"408":{"position":[[970,6]]},"439":{"position":[[30,6],[662,6]]},"458":{"position":[[933,7]]},"462":{"position":[[338,6]]},"470":{"position":[[571,7]]},"696":{"position":[[1285,6]]},"707":{"position":[[226,6]]},"709":{"position":[[32,6]]},"1207":{"position":[[113,7]]},"1292":{"position":[[100,6]]},"1301":{"position":[[1011,7]]}},"keywords":{}}],["chrome.storage.local.get('foobar",{"_index":2929,"title":{},"content":{"439":{"position":[[743,35]]}},"keywords":{}}],["chrome.storage.local.set",{"_index":2926,"title":{},"content":{"439":{"position":[[675,26]]}},"keywords":{}}],["chrome/chromium/edg",{"_index":3016,"title":{},"content":{"461":{"position":[[787,21]]}},"keywords":{}}],["chrome://gpu",{"_index":2501,"title":{},"content":{"404":{"position":[[307,14]]}},"keywords":{}}],["chrome’",{"_index":1727,"title":{},"content":{"298":{"position":[[757,8]]},"299":{"position":[[758,8]]},"301":{"position":[[668,8]]}},"keywords":{}}],["chromium",{"_index":1718,"title":{},"content":{"298":{"position":[[471,8]]},"299":{"position":[[858,8]]},"450":{"position":[[767,8]]},"455":{"position":[[940,9]]},"461":{"position":[[1152,8]]},"617":{"position":[[1750,8]]},"1208":{"position":[[527,8]]},"1214":{"position":[[199,10]]},"1297":{"position":[[1,8]]}},"keywords":{}}],["chunk",{"_index":1850,"title":{"1008":{"position":[[29,6]]}},"content":{"303":{"position":[[1213,5]]},"411":{"position":[[81,6]]},"412":{"position":[[7177,5]]},"556":{"position":[[1206,6]]},"981":{"position":[[1024,5]]},"1007":{"position":[[313,5],[399,5],[410,5],[464,6],[801,5],[885,5],[928,5],[1333,5],[2047,7]]},"1008":{"position":[[186,5],[318,6]]},"1009":{"position":[[549,5]]},"1239":{"position":[[278,6]]}},"keywords":{}}],["chunk'",{"_index":5559,"title":{},"content":{"1007":{"position":[[528,7],[763,7]]}},"keywords":{}}],["chunkid",{"_index":5557,"title":{},"content":{"1007":{"position":[[143,8],[1189,7],[1343,8]]}},"keywords":{}}],["ci",{"_index":3837,"title":{},"content":{"670":{"position":[[79,2]]},"730":{"position":[[37,2]]}},"keywords":{}}],["ciphertext",{"_index":3360,"title":{},"content":{"555":{"position":[[846,10]]}},"keywords":{}}],["circular",{"_index":5667,"title":{},"content":{"1033":{"position":[[984,8]]}},"keywords":{}}],["circumst",{"_index":6538,"title":{},"content":{"1316":{"position":[[365,13]]}},"keywords":{}}],["circumv",{"_index":1853,"title":{},"content":{"303":{"position":[[1288,10]]},"624":{"position":[[277,13]]}},"keywords":{}}],["cite",{"_index":1742,"title":{},"content":{"299":{"position":[[300,5]]}},"keywords":{}}],["citi",{"_index":6528,"title":{},"content":{"1315":{"position":[[215,6],[233,4],[393,4],[1413,4]]}},"keywords":{}}],["citizen",{"_index":3910,"title":{},"content":{"690":{"position":[[488,8]]}},"keywords":{}}],["city.id",{"_index":6533,"title":{},"content":{"1315":{"position":[[465,8]]}},"keywords":{}}],["city.nam",{"_index":6531,"title":{},"content":{"1315":{"position":[[404,9]]}},"keywords":{}}],["city_id",{"_index":6529,"title":{},"content":{"1315":{"position":[[272,8]]}},"keywords":{}}],["citydocu",{"_index":6534,"title":{},"content":{"1315":{"position":[[554,12]]}},"keywords":{}}],["cj",{"_index":4510,"title":{},"content":{"761":{"position":[[696,3]]}},"keywords":{}}],["claim",{"_index":102,"title":{},"content":{"8":{"position":[[37,6]]},"38":{"position":[[107,6]]}},"keywords":{}}],["clariti",{"_index":2078,"title":{},"content":{"360":{"position":[[739,8]]},"690":{"position":[[589,8]]},"1132":{"position":[[528,7]]}},"keywords":{}}],["clash",{"_index":1886,"title":{},"content":{"312":{"position":[[301,8]]},"1084":{"position":[[620,5]]}},"keywords":{}}],["class",{"_index":3767,"title":{},"content":{"655":{"position":[[192,5]]},"690":{"position":[[482,5]]},"805":{"position":[[173,5]]},"806":{"position":[[46,5]]},"825":{"position":[[895,5]]},"837":{"position":[[1463,5]]},"979":{"position":[[165,6]]},"1084":{"position":[[535,5]]},"1085":{"position":[[1906,5],[1953,5]]}},"keywords":{}}],["claus",{"_index":6576,"title":{},"content":{"1323":{"position":[[124,7]]}},"keywords":{}}],["clean",{"_index":1143,"title":{},"content":{"145":{"position":[[56,5]]},"346":{"position":[[465,5]]},"461":{"position":[[503,5],[585,7]]},"562":{"position":[[1398,5]]},"590":{"position":[[506,5]]},"612":{"position":[[2368,5]]},"660":{"position":[[144,5]]},"662":{"position":[[733,7]]},"697":{"position":[[239,5]]},"773":{"position":[[402,6]]},"816":{"position":[[27,8]]},"829":{"position":[[3764,7]]},"997":{"position":[[83,7]]},"1009":{"position":[[1054,5]]},"1266":{"position":[[631,6]]},"1311":{"position":[[1817,5]]}},"keywords":{}}],["cleanup",{"_index":1814,"title":{"651":{"position":[[3,7]]},"653":{"position":[[23,7]]},"654":{"position":[[8,7]]},"655":{"position":[[10,7]]},"1119":{"position":[[0,7]]}},"content":{"302":{"position":[[935,7]]},"522":{"position":[[745,7]]},"653":{"position":[[24,7],[456,8],[723,7],[848,7],[873,7],[1282,7],[1434,8]]},"654":{"position":[[24,7],[107,7]]},"655":{"position":[[343,7]]},"656":{"position":[[15,7],[31,7],[227,7],[468,7]]},"746":{"position":[[818,8]]},"793":{"position":[[1097,7]]},"960":{"position":[[640,7]]},"975":{"position":[[206,8]]},"1047":{"position":[[215,7]]},"1119":{"position":[[311,7]]},"1186":{"position":[[8,8]]}},"keywords":{}}],["cleanuppolici",{"_index":3263,"title":{},"content":{"522":{"position":[[711,14]]},"653":{"position":[[327,14]]},"654":{"position":[[154,14]]},"960":{"position":[[606,14]]}},"keywords":{}}],["clear",{"_index":1656,"title":{},"content":{"281":{"position":[[257,5]]},"300":{"position":[[590,8]]},"302":{"position":[[504,5]]},"305":{"position":[[69,5]]},"335":{"position":[[323,5]]},"412":{"position":[[8051,5]]},"425":{"position":[[201,6],[486,8]]},"439":{"position":[[177,5],[230,5]]},"451":{"position":[[227,5],[825,8],[863,7]]},"495":{"position":[[441,5]]},"815":{"position":[[84,6]]},"977":{"position":[[146,5],[493,5]]},"1119":{"position":[[266,5]]},"1198":{"position":[[352,5]]}},"keywords":{}}],["clearer",{"_index":2811,"title":{},"content":{"419":{"position":[[1505,7]]}},"keywords":{}}],["clearinterval(intervalid",{"_index":3612,"title":{},"content":{"612":{"position":[[2434,26]]}},"keywords":{}}],["clearli",{"_index":6281,"title":{},"content":{"1237":{"position":[[327,7]]}},"keywords":{}}],["clever",{"_index":6563,"title":{},"content":{"1316":{"position":[[3481,6]]}},"keywords":{}}],["cli",{"_index":324,"title":{},"content":{"19":{"position":[[273,3]]},"899":{"position":[[345,3]]},"1133":{"position":[[33,3]]}},"keywords":{}}],["click",{"_index":3158,"title":{},"content":{"489":{"position":[[376,8]]},"703":{"position":[[1411,5]]},"778":{"position":[[530,7]]},"785":{"position":[[105,8]]},"1313":{"position":[[584,6]]}},"keywords":{}}],["client",{"_index":205,"title":{"132":{"position":[[37,7]]},"163":{"position":[[37,7]]},"190":{"position":[[37,7]]},"271":{"position":[[22,6]]},"278":{"position":[[30,6]]},"288":{"position":[[38,7]]},"294":{"position":[[15,6]]},"337":{"position":[[37,7]]},"501":{"position":[[22,6]]},"525":{"position":[[37,7]]},"582":{"position":[[37,7]]},"626":{"position":[[2,6]]},"702":{"position":[[24,6]]},"872":{"position":[[15,6]]},"874":{"position":[[46,7]]},"886":{"position":[[5,7]]},"902":{"position":[[45,6]]},"912":{"position":[[37,6]]}},"content":{"14":{"position":[[146,6],[560,7]]},"16":{"position":[[70,6]]},"19":{"position":[[95,6]]},"20":{"position":[[72,6],[170,6],[232,6]]},"21":{"position":[[16,6]]},"22":{"position":[[319,6]]},"37":{"position":[[153,7]]},"38":{"position":[[17,6],[301,6]]},"41":{"position":[[228,7],[322,6]]},"42":{"position":[[139,6]]},"43":{"position":[[469,6],[577,6]]},"45":{"position":[[45,6]]},"46":{"position":[[461,6],[678,6]]},"99":{"position":[[95,6],[109,6]]},"110":{"position":[[78,6]]},"120":{"position":[[11,6]]},"123":{"position":[[61,7],[284,8]]},"134":{"position":[[60,7]]},"135":{"position":[[82,6],[192,7]]},"136":{"position":[[151,7]]},"139":{"position":[[146,6]]},"147":{"position":[[48,7]]},"151":{"position":[[252,7]]},"153":{"position":[[42,6],[399,7]]},"157":{"position":[[176,6]]},"158":{"position":[[57,7],[237,8],[301,6]]},"164":{"position":[[398,8]]},"165":{"position":[[102,7]]},"172":{"position":[[34,6],[150,6],[320,6]]},"173":{"position":[[1349,6],[1981,6],[2581,6]]},"174":{"position":[[2072,6],[2139,6]]},"181":{"position":[[11,6],[325,7]]},"184":{"position":[[177,7]]},"190":{"position":[[86,7]]},"192":{"position":[[104,7]]},"201":{"position":[[127,6]]},"203":{"position":[[343,7]]},"208":{"position":[[67,6]]},"210":{"position":[[635,6],[741,6]]},"212":{"position":[[489,6]]},"224":{"position":[[134,6]]},"226":{"position":[[88,6]]},"240":{"position":[[62,6]]},"248":{"position":[[28,6]]},"249":{"position":[[368,6]]},"261":{"position":[[153,7],[408,7]]},"267":{"position":[[400,7]]},"271":{"position":[[110,6],[219,6]]},"278":{"position":[[64,6]]},"279":{"position":[[146,7]]},"280":{"position":[[33,6]]},"288":{"position":[[36,7],[290,7]]},"289":{"position":[[128,7],[565,7],[801,6]]},"293":{"position":[[40,6]]},"320":{"position":[[218,6]]},"321":{"position":[[156,7],[509,6]]},"325":{"position":[[11,6]]},"328":{"position":[[117,7]]},"339":{"position":[[17,7]]},"340":{"position":[[46,6],[82,7]]},"359":{"position":[[71,6]]},"367":{"position":[[193,6]]},"369":{"position":[[1077,7]]},"407":{"position":[[69,6]]},"408":{"position":[[107,6],[449,6],[775,7],[2750,6],[2816,7],[3733,7],[4371,6],[4451,6],[5171,8],[5300,6]]},"410":{"position":[[680,6],[1389,6],[1772,8]]},"411":{"position":[[484,6],[1229,6],[1408,6],[4021,7]]},"412":{"position":[[940,6],[1079,6],[2139,6],[2301,7],[4349,6],[4390,6],[6729,7],[6831,7],[8919,6],[9013,6],[9311,7],[10392,6],[10516,6],[10992,7],[11000,6],[11366,7],[11433,7],[11860,6],[12171,6],[12874,6],[13144,6],[13444,6],[13817,7],[13893,7],[14262,6],[14420,6],[14742,7],[14992,6]]},"416":{"position":[[92,7],[391,7]]},"419":{"position":[[826,6]]},"434":{"position":[[35,6]]},"435":{"position":[[52,6]]},"450":{"position":[[352,6]]},"454":{"position":[[306,6]]},"455":{"position":[[88,6],[205,6]]},"473":{"position":[[67,6]]},"477":{"position":[[170,6]]},"478":{"position":[[61,6],[198,7]]},"479":{"position":[[85,6]]},"491":{"position":[[451,7],[739,8],[1344,7],[1603,7]]},"495":{"position":[[767,6],[820,6]]},"496":{"position":[[846,6]]},"501":{"position":[[97,6]]},"502":{"position":[[80,6],[375,6]]},"504":{"position":[[571,7],[647,7],[849,7],[973,7],[1380,7]]},"514":{"position":[[240,7]]},"517":{"position":[[104,7],[299,6]]},"525":{"position":[[91,6],[311,6],[480,7]]},"534":{"position":[[473,6],[636,6]]},"570":{"position":[[346,7],[444,6],[509,7],[818,8]]},"571":{"position":[[28,6],[495,7]]},"575":{"position":[[152,6]]},"582":{"position":[[502,7]]},"594":{"position":[[471,6],[634,6]]},"610":{"position":[[64,6],[242,6],[477,7],[570,6],[897,6],[1247,6],[1439,6],[1569,6],[1635,6]]},"611":{"position":[[105,6],[620,6]]},"612":{"position":[[79,6],[187,7],[291,6],[613,7],[701,6]]},"613":{"position":[[98,7]]},"614":{"position":[[563,6],[570,6],[629,6],[695,7]]},"616":{"position":[[117,6],[431,6]]},"617":{"position":[[109,6],[613,6],[1090,6],[2314,8]]},"618":{"position":[[628,8]]},"621":{"position":[[249,6],[584,6]]},"622":{"position":[[128,6],[266,7],[380,6]]},"623":{"position":[[266,7]]},"624":{"position":[[28,6],[533,6]]},"626":{"position":[[8,6],[139,7],[485,6],[582,6],[786,6],[916,6],[943,6],[1052,6],[1137,7]]},"628":{"position":[[136,6]]},"632":{"position":[[199,6],[534,7],[2733,6]]},"634":{"position":[[120,7]]},"635":{"position":[[64,7]]},"661":{"position":[[1716,7],[1778,7]]},"663":{"position":[[126,6]]},"683":{"position":[[391,6]]},"696":{"position":[[94,7],[634,6],[1790,7]]},"697":{"position":[[439,6]]},"698":{"position":[[116,7],[720,7],[1555,7],[1659,7],[1751,6],[1873,8],[2713,7]]},"699":{"position":[[36,7],[411,7],[769,6]]},"700":{"position":[[111,7],[139,6],[298,8]]},"702":{"position":[[663,6],[752,7]]},"704":{"position":[[160,6],[593,7]]},"705":{"position":[[792,7],[1409,7]]},"711":{"position":[[2158,6]]},"712":{"position":[[145,6]]},"736":{"position":[[463,7]]},"749":{"position":[[16389,7],[16519,7],[16652,6],[16728,6]]},"756":{"position":[[333,8]]},"780":{"position":[[588,6]]},"781":{"position":[[316,7],[346,6],[431,6]]},"782":{"position":[[385,7]]},"783":{"position":[[352,8],[656,6]]},"784":{"position":[[194,6],[485,7],[643,7],[778,6]]},"836":{"position":[[2423,6]]},"837":{"position":[[300,6]]},"839":{"position":[[1276,7]]},"840":{"position":[[70,7],[294,7]]},"842":{"position":[[260,6]]},"844":{"position":[[217,7]]},"860":{"position":[[249,6],[703,7],[1042,6],[1242,6],[1251,6],[1260,6]]},"861":{"position":[[1746,8],[2460,7]]},"862":{"position":[[63,6],[457,6],[921,7],[962,6],[975,9],[1204,7]]},"863":{"position":[[631,7]]},"871":{"position":[[51,7],[166,7],[185,6],[231,6],[421,8],[486,6],[512,6],[521,6]]},"872":{"position":[[15,6],[3056,6],[3593,6],[3626,6],[4002,8]]},"875":{"position":[[37,7],[772,7],[2922,6],[3588,6],[6087,7],[6787,6],[7021,7],[7138,7],[7786,6],[7918,7],[7930,6],[8554,6],[9066,6],[9132,6]]},"876":{"position":[[86,7],[207,6],[337,6],[576,7],[615,6]]},"879":{"position":[[162,7],[300,6],[422,6],[500,6]]},"880":{"position":[[10,7],[118,6],[140,6]]},"881":{"position":[[10,6],[287,6]]},"885":{"position":[[402,6]]},"890":{"position":[[1045,6]]},"893":{"position":[[301,6]]},"896":{"position":[[53,6]]},"897":{"position":[[1,6],[19,6],[28,6],[40,7],[99,7],[548,7]]},"898":{"position":[[483,7],[634,7],[712,6],[2158,6],[2724,7],[2755,6],[2917,8],[2967,6],[3224,6],[3363,7]]},"901":{"position":[[677,6]]},"902":{"position":[[84,6]]},"903":{"position":[[190,8],[720,6]]},"904":{"position":[[139,8],[1941,7]]},"908":{"position":[[98,7]]},"912":{"position":[[38,6]]},"981":{"position":[[799,6],[923,6],[1096,6],[1248,6],[1667,6]]},"982":{"position":[[278,6],[330,6],[363,6],[460,6],[556,7],[572,6],[719,6],[785,7]]},"983":{"position":[[433,6],[448,6],[931,6]]},"984":{"position":[[43,6]]},"985":{"position":[[11,6],[125,7],[430,6],[605,6],[636,6]]},"987":{"position":[[15,7],[262,6],[524,6],[849,7]]},"988":{"position":[[4999,6],[5838,6],[6046,6]]},"990":{"position":[[1046,6],[1351,6]]},"991":{"position":[[15,6],[72,6],[212,7]]},"995":{"position":[[1337,7]]},"996":{"position":[[88,6],[205,6],[358,6],[423,6]]},"1005":{"position":[[135,7]]},"1032":{"position":[[204,6]]},"1072":{"position":[[140,6],[685,6],[1234,6]]},"1088":{"position":[[214,7]]},"1100":{"position":[[878,6],[1012,8]]},"1101":{"position":[[33,7],[184,6],[600,7]]},"1102":{"position":[[737,6],[831,6],[923,6]]},"1104":{"position":[[206,6],[621,6]]},"1105":{"position":[[88,6],[1003,7]]},"1106":{"position":[[122,7],[161,7],[365,7]]},"1107":{"position":[[1071,6]]},"1108":{"position":[[126,8],[135,7],[366,8]]},"1109":{"position":[[81,7]]},"1112":{"position":[[242,6]]},"1123":{"position":[[620,6]]},"1124":{"position":[[1293,6],[1360,6]]},"1133":{"position":[[26,6],[256,6]]},"1196":{"position":[[10,6],[130,6]]},"1198":{"position":[[98,6],[1691,7]]},"1206":{"position":[[521,6]]},"1218":{"position":[[278,6]]},"1220":{"position":[[393,6]]},"1249":{"position":[[299,6]]},"1250":{"position":[[369,6]]},"1260":{"position":[[22,7]]},"1295":{"position":[[486,6]]},"1301":{"position":[[353,6],[515,6]]},"1304":{"position":[[1058,7],[1293,8],[1312,6],[1384,7],[1688,7]]},"1305":{"position":[[125,6]]},"1308":{"position":[[46,7],[295,6],[498,6]]},"1314":{"position":[[316,7],[391,6],[565,6]]},"1316":{"position":[[193,6],[288,7],[1074,7],[1142,6],[1928,7],[1936,6],[2016,6],[2139,6],[2181,7],[2359,6],[2640,8],[2670,7],[2771,6],[2859,7],[3040,6],[3140,6]]},"1317":{"position":[[19,6],[141,6]]},"1318":{"position":[[140,7]]},"1319":{"position":[[619,6],[677,6]]},"1321":{"position":[[51,6]]},"1324":{"position":[[56,6],[545,7],[754,8]]}},"keywords":{}}],["client'",{"_index":1403,"title":{},"content":{"220":{"position":[[72,8]]},"270":{"position":[[275,8]]},"273":{"position":[[155,8]]},"280":{"position":[[195,8]]},"294":{"position":[[125,8]]},"392":{"position":[[4932,8]]},"412":{"position":[[11250,8]]},"630":{"position":[[255,8]]},"708":{"position":[[289,8]]},"1314":{"position":[[226,8]]}},"keywords":{}}],["client.delet",{"_index":5550,"title":{},"content":{"1004":{"position":[[481,14]]}},"keywords":{}}],["client.j",{"_index":6254,"title":{},"content":{"1219":{"position":[[767,9]]}},"keywords":{}}],["client.queri",{"_index":5942,"title":{},"content":{"1102":{"position":[[1033,14]]}},"keywords":{}}],["client.setendpoint('https://cloud.appwrite.io/v1",{"_index":4904,"title":{},"content":{"862":{"position":[[985,51]]}},"keywords":{}}],["client.setproject('your_appwrite_project_id",{"_index":4905,"title":{},"content":{"862":{"position":[[1037,46]]}},"keywords":{}}],["client.subscrib",{"_index":1328,"title":{},"content":{"205":{"position":[[249,16]]}},"keywords":{}}],["client.t",{"_index":4969,"title":{},"content":{"872":{"position":[[3765,9]]},"875":{"position":[[317,9],[3059,9],[6103,9],[8029,9],[8949,9],[9448,9]]},"1101":{"position":[[617,9]]}},"keywords":{}}],["clientopt",{"_index":5141,"title":{},"content":{"886":{"position":[[4465,13]]}},"keywords":{}}],["clients.improv",{"_index":3478,"title":{},"content":{"574":{"position":[[381,16]]}},"keywords":{}}],["clock",{"_index":2771,"title":{},"content":{"412":{"position":[[14634,5]]},"705":{"position":[[1007,5],[1439,6]]},"991":{"position":[[27,6]]},"1304":{"position":[[1151,5]]},"1305":{"position":[[465,7]]},"1316":{"position":[[1899,5],[1948,6],[2036,5],[2120,5]]},"1324":{"position":[[855,6]]}},"keywords":{}}],["clojur",{"_index":624,"title":{},"content":{"39":{"position":[[448,8]]}},"keywords":{}}],["clone",{"_index":3823,"title":{},"content":{"666":{"position":[[151,5]]},"749":{"position":[[11937,7]]},"824":{"position":[[154,5]]},"848":{"position":[[231,5]]},"1052":{"position":[[37,6],[102,7]]},"1108":{"position":[[693,5]]}},"keywords":{}}],["close",{"_index":1726,"title":{"955":{"position":[[0,8]]},"976":{"position":[[0,8]]},"1027":{"position":[[0,8]]}},"content":{"298":{"position":[[744,7]]},"301":{"position":[[383,5]]},"360":{"position":[[65,7]]},"392":{"position":[[2322,6]]},"408":{"position":[[5135,7]]},"424":{"position":[[316,6]]},"451":{"position":[[905,7]]},"458":{"position":[[111,5]]},"468":{"position":[[692,6]]},"610":{"position":[[507,7]]},"611":{"position":[[1247,7]]},"612":{"position":[[2400,6]]},"618":{"position":[[344,7]]},"622":{"position":[[495,7]]},"737":{"position":[[226,7],[272,7]]},"746":{"position":[[833,6]]},"749":{"position":[[8760,6]]},"783":{"position":[[96,5]]},"956":{"position":[[71,6],[292,10]]},"967":{"position":[[19,6],[361,5],[389,7]]},"976":{"position":[[1,6],[159,7],[167,7]]},"988":{"position":[[5647,5]]},"995":{"position":[[342,6],[999,6]]},"1027":{"position":[[168,7]]},"1030":{"position":[[71,6]]},"1174":{"position":[[634,7]]},"1198":{"position":[[744,6]]},"1208":{"position":[[1829,5]]},"1218":{"position":[[212,7],[234,6]]},"1298":{"position":[[205,5]]},"1319":{"position":[[688,5]]}},"keywords":{}}],["closedupl",{"_index":5397,"title":{"967":{"position":[[0,16]]}},"content":{"967":{"position":[[196,16],[314,16]]}},"keywords":{}}],["closest",{"_index":2199,"title":{},"content":{"390":{"position":[[1235,7]]}},"keywords":{}}],["cloud",{"_index":207,"title":{"202":{"position":[[32,6]]},"204":{"position":[[9,5]]},"251":{"position":[[11,5]]},"1148":{"position":[[13,5]]}},"content":{"14":{"position":[[199,5],[597,5],[1027,5]]},"18":{"position":[[247,6]]},"19":{"position":[[1019,5]]},"26":{"position":[[15,5],[125,5],[408,6]]},"36":{"position":[[389,5],[440,5]]},"260":{"position":[[222,5]]},"289":{"position":[[1024,5],[1210,5]]},"410":{"position":[[1596,5]]},"411":{"position":[[5370,5]]},"412":{"position":[[2875,5],[4186,5],[8767,5],[8812,5],[11099,5],[12083,5]]},"414":{"position":[[257,5]]},"417":{"position":[[276,5]]},"418":{"position":[[758,5]]},"444":{"position":[[564,5],[820,5]]},"504":{"position":[[1145,5]]},"839":{"position":[[389,5],[455,6],[910,5],[1301,5]]},"840":{"position":[[18,5],[122,5]]},"841":{"position":[[252,5],[650,7],[811,5]]},"860":{"position":[[1143,5]]},"861":{"position":[[33,5],[101,5],[288,5]]},"862":{"position":[[938,5]]},"872":{"position":[[325,6]]},"896":{"position":[[1,5]]},"1112":{"position":[[305,5]]},"1124":{"position":[[1774,5]]},"1147":{"position":[[162,5],[239,5],[471,5]]},"1148":{"position":[[7,5],[213,5],[263,5],[445,5],[476,5],[512,6],[667,5],[723,5]]}},"keywords":{}}],["cloud.integr",{"_index":1306,"title":{},"content":{"202":{"position":[[175,15]]}},"keywords":{}}],["cloudant",{"_index":422,"title":{"26":{"position":[[0,9]]}},"content":{"26":{"position":[[1,8],[356,8]]}},"keywords":{}}],["cluster",{"_index":4563,"title":{},"content":{"772":{"position":[[240,7],[459,7],[1268,7],[1845,8]]},"865":{"position":[[39,7]]},"870":{"position":[[269,8]]},"871":{"position":[[874,8]]},"1095":{"position":[[189,7],[336,7]]},"1134":{"position":[[256,9],[461,7]]},"1135":{"position":[[88,7],[239,8]]}},"keywords":{}}],["cluster.instal",{"_index":6033,"title":{},"content":{"1133":{"position":[[88,15]]}},"keywords":{}}],["cluster.privaci",{"_index":5242,"title":{},"content":{"902":{"position":[[346,15]]}},"keywords":{}}],["clusterfil",{"_index":4567,"title":{},"content":{"772":{"position":[[861,12]]},"774":{"position":[[789,12]]},"1134":{"position":[[552,12]]}},"keywords":{}}],["co",{"_index":4717,"title":{"822":{"position":[[10,3]]}},"content":{},"keywords":{}}],["coal",{"_index":2585,"title":{},"content":{"409":{"position":[[139,5]]}},"keywords":{}}],["cockroach",{"_index":6580,"title":{},"content":{"1324":{"position":[[817,9]]}},"keywords":{}}],["code",{"_index":125,"title":{"209":{"position":[[7,5]]},"239":{"position":[[27,4]]},"739":{"position":[[0,4]]}},"content":{"8":{"position":[[718,5]]},"27":{"position":[[121,5]]},"29":{"position":[[417,4]]},"35":{"position":[[225,4]]},"38":{"position":[[805,4]]},"47":{"position":[[1330,4]]},"74":{"position":[[102,4]]},"84":{"position":[[205,5]]},"112":{"position":[[48,4]]},"114":{"position":[[218,5]]},"149":{"position":[[218,5]]},"174":{"position":[[2845,4]]},"175":{"position":[[211,5]]},"188":{"position":[[1641,5],[2429,4]]},"198":{"position":[[496,4]]},"207":{"position":[[302,4]]},"228":{"position":[[129,4],[478,4]]},"232":{"position":[[196,4]]},"239":{"position":[[53,4]]},"241":{"position":[[313,5]]},"254":{"position":[[542,5]]},"255":{"position":[[301,4]]},"281":{"position":[[443,4]]},"309":{"position":[[351,4]]},"323":{"position":[[430,4]]},"329":{"position":[[193,4]]},"335":{"position":[[932,4]]},"347":{"position":[[218,5]]},"362":{"position":[[1289,5]]},"369":{"position":[[1483,5]]},"373":{"position":[[313,5]]},"401":{"position":[[443,4]]},"403":{"position":[[283,4]]},"405":{"position":[[50,4]]},"411":{"position":[[1539,4]]},"412":{"position":[[9252,5]]},"425":{"position":[[31,4],[231,4]]},"430":{"position":[[385,4]]},"445":{"position":[[1472,4],[1598,4]]},"453":{"position":[[582,4]]},"454":{"position":[[70,4],[347,4],[652,4]]},"455":{"position":[[456,4]]},"498":{"position":[[342,4]]},"511":{"position":[[218,5]]},"515":{"position":[[199,5],[371,4]]},"522":{"position":[[237,4]]},"524":{"position":[[848,4]]},"531":{"position":[[218,5]]},"535":{"position":[[226,4],[1290,4]]},"563":{"position":[[1082,4]]},"567":{"position":[[476,5],[863,4]]},"591":{"position":[[218,5]]},"595":{"position":[[239,4],[1364,4]]},"610":{"position":[[1485,4]]},"674":{"position":[[260,5]]},"688":{"position":[[484,5]]},"698":{"position":[[1467,4],[1933,5]]},"702":{"position":[[790,4]]},"703":{"position":[[158,4]]},"711":{"position":[[1044,4]]},"714":{"position":[[319,5]]},"728":{"position":[[9,5],[251,5]]},"749":{"position":[[3,5],[91,5],[438,5],[565,5],[656,5],[809,5],[946,5],[1081,5],[1305,5],[1393,5],[1542,5],[1645,5],[1742,5],[1859,5],[1985,5],[2088,5],[2194,5],[2288,5],[2381,5],[2466,5],[2583,5],[2824,5],[2937,5],[3170,5],[3290,5],[3646,5],[3843,5],[3930,5],[4002,5],[4117,5],[4233,5],[4355,5],[4532,5],[4606,5],[4713,5],[4848,5],[4980,5],[5132,5],[5234,5],[5346,5],[5553,5],[5980,4],[6061,5],[6197,5],[6333,5],[6452,5],[6594,5],[6706,5],[6821,5],[6945,5],[7053,5],[7172,5],[7296,5],[7479,5],[7559,5],[7636,5],[7735,5],[7839,5],[7934,5],[8034,5],[8128,5],[8226,5],[8334,5],[8429,5],[8529,5],[8651,5],[8728,5],[8902,5],[9052,5],[9210,5],[9501,5],[9646,5],[9730,5],[9818,5],[9925,5],[10039,5],[10157,5],[10266,5],[10371,5],[10459,5],[10582,5],[10686,5],[10792,5],[10883,5],[10965,5],[11103,5],[11244,5],[11355,5],[11454,5],[11530,5],[11675,5],[11772,5],[11881,5],[12182,5],[12273,5],[12400,5],[12481,5],[12554,5],[12769,5],[12878,5],[12955,5],[13064,5],[13181,5],[13255,5],[13375,5],[13504,5],[13627,5],[13750,5],[13848,5],[13992,5],[14075,5],[14169,5],[14281,5],[14366,5],[14562,5],[14644,5],[14759,5],[14915,5],[15126,5],[15285,5],[15460,5],[15592,5],[15726,5],[15858,5],[15993,5],[16095,5],[16243,5],[16362,5],[16484,5],[16633,5],[16826,5],[16915,5],[17021,5],[17144,5],[17293,5],[17402,5],[17518,5],[17636,5],[17759,5],[17868,5],[17989,5],[18111,5],[18208,5],[18308,5],[18490,5],[18584,5],[18703,5],[18807,5],[18913,5],[19016,5],[19110,5],[19312,5],[19440,5],[19566,5],[19681,5],[19782,5],[19874,5],[19998,5],[20116,5],[20273,5],[20439,5],[20540,5],[20707,5],[20844,5],[21017,5],[21301,5],[21455,5],[21718,5],[22020,5],[22140,5],[22224,5],[22342,5],[22449,5],[22569,5],[22709,5],[22838,5],[22998,5],[23191,5],[23317,5],[23449,5],[23582,5],[23773,5],[23955,5],[24075,5],[24236,5],[24366,5]]},"765":{"position":[[85,5]]},"784":{"position":[[201,4]]},"785":{"position":[[349,4]]},"802":{"position":[[307,4]]},"806":{"position":[[338,4]]},"817":{"position":[[155,4]]},"836":{"position":[[552,4]]},"861":{"position":[[1084,4]]},"862":{"position":[[75,4]]},"876":{"position":[[555,4]]},"904":{"position":[[2501,5]]},"906":{"position":[[1136,4]]},"945":{"position":[[382,4]]},"990":{"position":[[1125,4]]},"995":{"position":[[1436,5]]},"1031":{"position":[[134,4]]},"1071":{"position":[[269,4]]},"1072":{"position":[[533,4],[844,5],[976,4],[1165,5],[1388,4]]},"1124":{"position":[[1311,5],[1392,4]]},"1198":{"position":[[811,4]]},"1251":{"position":[[104,4],[221,4]]},"1272":{"position":[[381,4]]},"1282":{"position":[[545,5]]},"1307":{"position":[[497,4]]}},"keywords":{}}],["code"",{"_index":2620,"title":{},"content":{"411":{"position":[[2476,10]]}},"keywords":{}}],["code.for",{"_index":4719,"title":{},"content":{"824":{"position":[[194,8]]}},"keywords":{}}],["codebas",{"_index":1043,"title":{},"content":{"107":{"position":[[128,9]]},"145":{"position":[[62,9]]},"177":{"position":[[187,9]]},"219":{"position":[[288,9]]},"239":{"position":[[256,8]]},"384":{"position":[[341,9]]},"445":{"position":[[2467,8]]},"446":{"position":[[1325,8]]},"636":{"position":[[426,9]]}},"keywords":{}}],["codesearch",{"_index":4133,"title":{},"content":{"749":{"position":[[56,10],[403,10],[530,10],[621,10],[774,10],[911,10],[1046,10],[1270,10],[1358,10],[1507,10],[1610,10],[1707,10],[1824,10],[1950,10],[2053,10],[2159,10],[2253,10],[2346,10],[2431,10],[2548,10],[2789,10],[2902,10],[3135,10],[3255,10],[3611,10],[3808,10],[3895,10],[3967,10],[4082,10],[4198,10],[4320,10],[4497,10],[4571,10],[4678,10],[4813,10],[4945,10],[5097,10],[5199,10],[5311,10],[5518,10],[6026,10],[6162,10],[6298,10],[6417,10],[6559,10],[6671,10],[6786,10],[6910,10],[7018,10],[7137,10],[7261,10],[7444,10],[7524,10],[7601,10],[7700,10],[7804,10],[7899,10],[7999,10],[8093,10],[8191,10],[8299,10],[8394,10],[8494,10],[8616,10],[8693,10],[8867,10],[9017,10],[9175,10],[9466,10],[9611,10],[9695,10],[9783,10],[9890,10],[10004,10],[10122,10],[10231,10],[10336,10],[10424,10],[10547,10],[10651,10],[10757,10],[10848,10],[10930,10],[11068,10],[11209,10],[11320,10],[11419,10],[11495,10],[11640,10],[11737,10],[11846,10],[12147,10],[12238,10],[12365,10],[12446,10],[12519,10],[12734,10],[12843,10],[12920,10],[13029,10],[13146,10],[13220,10],[13340,10],[13469,10],[13592,10],[13715,10],[13813,10],[13957,10],[14040,10],[14134,10],[14246,10],[14331,10],[14527,10],[14609,10],[14724,10],[14880,10],[15091,10],[15250,10],[15425,10],[15557,10],[15691,10],[15823,10],[15958,10],[16060,10],[16208,10],[16327,10],[16449,10],[16598,10],[16791,10],[16880,10],[16986,10],[17109,10],[17258,10],[17367,10],[17483,10],[17601,10],[17724,10],[17833,10],[17954,10],[18076,10],[18173,10],[18273,10],[18455,10],[18549,10],[18668,10],[18772,10],[18878,10],[18981,10],[19075,10],[19277,10],[19405,10],[19531,10],[19646,10],[19747,10],[19839,10],[19963,10],[20081,10],[20238,10],[20404,10],[20505,10],[20672,10],[20809,10],[20982,10],[21266,10],[21420,10],[21683,10],[21985,10],[22105,10],[22189,10],[22307,10],[22414,10],[22534,10],[22674,10],[22803,10],[22963,10],[23156,10],[23282,10],[23414,10],[23547,10],[23738,10],[23920,10],[24040,10],[24201,10],[24331,10],[24411,10]]}},"keywords":{}}],["code—rxdb",{"_index":2084,"title":{},"content":{"361":{"position":[[1029,9]]}},"keywords":{}}],["cohes",{"_index":3256,"title":{},"content":{"517":{"position":[[359,8]]}},"keywords":{}}],["col",{"_index":5969,"title":{},"content":{"1108":{"position":[[464,4]]}},"keywords":{}}],["col1",{"_index":4219,"title":{},"content":{"749":{"position":[[6712,4]]}},"keywords":{}}],["col10",{"_index":4238,"title":{},"content":{"749":{"position":[[7741,5]]}},"keywords":{}}],["col11",{"_index":4240,"title":{},"content":{"749":{"position":[[7845,5]]}},"keywords":{}}],["col12",{"_index":4241,"title":{},"content":{"749":{"position":[[7940,5]]}},"keywords":{}}],["col13",{"_index":4242,"title":{},"content":{"749":{"position":[[8040,5]]}},"keywords":{}}],["col14",{"_index":4243,"title":{},"content":{"749":{"position":[[8134,5]]}},"keywords":{}}],["col15",{"_index":4244,"title":{},"content":{"749":{"position":[[8232,5]]}},"keywords":{}}],["col16",{"_index":4245,"title":{},"content":{"749":{"position":[[8340,5]]}},"keywords":{}}],["col17",{"_index":4246,"title":{},"content":{"749":{"position":[[8435,5]]}},"keywords":{}}],["col18",{"_index":4248,"title":{},"content":{"749":{"position":[[8535,5]]}},"keywords":{}}],["col2",{"_index":4221,"title":{},"content":{"749":{"position":[[6827,4]]}},"keywords":{}}],["col20",{"_index":4249,"title":{},"content":{"749":{"position":[[8657,5]]}},"keywords":{}}],["col21",{"_index":4250,"title":{},"content":{"749":{"position":[[8734,5]]}},"keywords":{}}],["col22",{"_index":4251,"title":{},"content":{"749":{"position":[[9058,5]]}},"keywords":{}}],["col23",{"_index":4254,"title":{},"content":{"749":{"position":[[9216,5]]}},"keywords":{}}],["col3",{"_index":4224,"title":{},"content":{"749":{"position":[[6951,4]]}},"keywords":{}}],["col4",{"_index":4226,"title":{},"content":{"749":{"position":[[7059,4]]}},"keywords":{}}],["col5",{"_index":4228,"title":{},"content":{"749":{"position":[[7178,4]]}},"keywords":{}}],["col6",{"_index":4231,"title":{},"content":{"749":{"position":[[7302,4]]}},"keywords":{}}],["col7",{"_index":4234,"title":{},"content":{"749":{"position":[[7485,4]]}},"keywords":{}}],["col8",{"_index":4235,"title":{},"content":{"749":{"position":[[7565,4]]}},"keywords":{}}],["col9",{"_index":4236,"title":{},"content":{"749":{"position":[[7642,4]]}},"keywords":{}}],["collabor",{"_index":565,"title":{},"content":{"35":{"position":[[647,13]]},"38":{"position":[[67,14]]},"39":{"position":[[511,14]]},"40":{"position":[[96,13]]},"89":{"position":[[263,13]]},"109":{"position":[[227,13]]},"136":{"position":[[302,13]]},"148":{"position":[[337,13]]},"151":{"position":[[318,13]]},"158":{"position":[[255,13]]},"168":{"position":[[313,13]]},"174":{"position":[[1951,13]]},"212":{"position":[[526,14]]},"267":{"position":[[475,13],[599,13],[751,13],[1495,13]]},"289":{"position":[[949,13],[1958,13]]},"375":{"position":[[612,13]]},"388":{"position":[[459,13]]},"407":{"position":[[948,13],[1046,11]]},"411":{"position":[[5120,14]]},"412":{"position":[[3774,14],[6494,13]]},"418":{"position":[[783,13]]},"445":{"position":[[942,13],[1178,13]]},"446":{"position":[[437,14],[488,14],[534,13]]},"491":{"position":[[1812,13]]},"496":{"position":[[385,13]]},"501":{"position":[[317,12]]},"613":{"position":[[483,13]]},"860":{"position":[[657,13]]}},"keywords":{}}],["collaboration.memori",{"_index":1184,"title":{},"content":{"162":{"position":[[512,20]]}},"keywords":{}}],["collect",{"_index":224,"title":{"51":{"position":[[22,12]]},"259":{"position":[[7,13]]},"538":{"position":[[22,12]]},"598":{"position":[[22,12]]},"655":{"position":[[36,11]]},"789":{"position":[[17,11]]},"791":{"position":[[26,11]]},"934":{"position":[[11,11]]},"939":{"position":[[6,10]]},"979":{"position":[[0,13]]},"1007":{"position":[[10,11]]},"1075":{"position":[[9,10]]}},"content":{"14":{"position":[[780,12]]},"16":{"position":[[218,11]]},"18":{"position":[[20,10]]},"22":{"position":[[86,10]]},"47":{"position":[[814,10]]},"51":{"position":[[811,11]]},"130":{"position":[[484,10]]},"140":{"position":[[90,10]]},"168":{"position":[[175,11]]},"188":{"position":[[2731,10],[2755,10]]},"209":{"position":[[646,11]]},"210":{"position":[[288,11]]},"211":{"position":[[296,10]]},"255":{"position":[[997,11]]},"261":{"position":[[361,11]]},"334":{"position":[[66,11]]},"335":{"position":[[867,10]]},"344":{"position":[[72,10]]},"379":{"position":[[96,11]]},"392":{"position":[[443,10],[888,10],[1147,10],[2071,11],[2599,11]]},"412":{"position":[[1096,12]]},"480":{"position":[[64,11],[455,11],[947,10]]},"481":{"position":[[666,11]]},"482":{"position":[[743,10]]},"493":{"position":[[413,10]]},"494":{"position":[[575,10]]},"523":{"position":[[314,11],[333,10]]},"538":{"position":[[834,11]]},"541":{"position":[[237,10],[509,14]]},"542":{"position":[[765,10]]},"554":{"position":[[1236,10]]},"562":{"position":[[1108,10],[1423,14]]},"563":{"position":[[675,10]]},"567":{"position":[[671,12]]},"575":{"position":[[706,10]]},"598":{"position":[[841,11]]},"632":{"position":[[1440,11],[2234,11]]},"639":{"position":[[274,10]]},"643":{"position":[[75,11]]},"654":{"position":[[36,10]]},"655":{"position":[[17,10],[205,10]]},"656":{"position":[[293,10]]},"662":{"position":[[2272,11],[2294,11],[2312,11]]},"680":{"position":[[1122,10]]},"698":{"position":[[1484,10]]},"710":{"position":[[1783,11],[1801,11]]},"723":{"position":[[465,12],[1519,11]]},"724":{"position":[[384,10],[676,10],[729,11]]},"739":{"position":[[102,11]]},"745":{"position":[[606,11]]},"749":{"position":[[101,10],[4887,10],[5019,10],[5273,10],[5415,10],[6502,10],[8541,10],[9272,11],[10194,10],[13285,11],[15197,11],[19497,10],[22251,11],[24272,10]]},"751":{"position":[[20,11],[1909,10]]},"752":{"position":[[58,10]]},"753":{"position":[[91,10],[141,11]]},"754":{"position":[[367,10]]},"755":{"position":[[129,11]]},"759":{"position":[[817,11],[1020,11],[1157,11],[1307,11],[1468,11],[1510,11]]},"770":{"position":[[125,11],[663,11]]},"772":{"position":[[913,10]]},"788":{"position":[[21,10],[62,11]]},"789":{"position":[[69,11],[379,11]]},"790":{"position":[[30,10],[92,11]]},"792":{"position":[[32,10],[115,11]]},"798":{"position":[[367,10]]},"806":{"position":[[564,10]]},"808":{"position":[[50,10],[289,10]]},"818":{"position":[[474,10]]},"829":{"position":[[1880,12],[1953,10],[2014,10],[2217,10],[2382,11],[3298,11]]},"838":{"position":[[2508,11],[2526,11]]},"845":{"position":[[129,11]]},"846":{"position":[[211,11]]},"848":{"position":[[728,11],[1363,11]]},"852":{"position":[[246,11]]},"854":{"position":[[157,10],[455,10],[693,11],[774,11],[1549,11]]},"858":{"position":[[51,11],[204,11],[285,11]]},"861":{"position":[[953,11],[1046,11],[1248,11],[1864,10],[1990,11],[2228,11],[2296,10],[2347,10]]},"862":{"position":[[510,11],[872,10],[1369,11]]},"863":{"position":[[788,11]]},"866":{"position":[[180,10],[448,11],[520,10]]},"872":{"position":[[743,11],[816,11],[1067,12],[1291,10],[1368,11],[1417,11],[1796,10],[2108,10],[2224,10],[2251,11],[2424,12],[2509,11],[2942,10],[3415,11],[3678,10],[4520,11]]},"875":{"position":[[448,11]]},"878":{"position":[[121,10],[303,11],[449,10]]},"886":{"position":[[1030,11],[2662,11],[3849,11]]},"887":{"position":[[315,11]]},"888":{"position":[[456,11]]},"889":{"position":[[505,11]]},"890":{"position":[[805,11]]},"893":{"position":[[49,10],[308,10],[354,10],[374,11]]},"898":{"position":[[1569,11],[1623,10],[3158,10],[3381,11]]},"904":{"position":[[364,11],[1498,11],[1868,10],[1879,11],[2291,10]]},"932":{"position":[[1388,11]]},"934":{"position":[[23,11],[110,10],[129,10],[361,10],[846,11]]},"935":{"position":[[34,10],[78,10],[120,11],[183,10]]},"936":{"position":[[45,10]]},"937":{"position":[[146,11]]},"939":{"position":[[20,10],[59,10],[119,10],[136,11]]},"941":{"position":[[88,11]]},"942":{"position":[[57,10]]},"943":{"position":[[75,10]]},"946":{"position":[[54,11]]},"949":{"position":[[27,11]]},"950":{"position":[[173,11]]},"952":{"position":[[70,11]]},"953":{"position":[[35,11]]},"954":{"position":[[31,10],[169,10]]},"955":{"position":[[153,11],[191,10],[256,10]]},"956":{"position":[[56,10],[182,10]]},"958":{"position":[[43,11],[116,11],[500,12]]},"963":{"position":[[54,11]]},"971":{"position":[[77,10]]},"988":{"position":[[272,11]]},"999":{"position":[[249,10]]},"1002":{"position":[[293,10],[563,11],[1217,11]]},"1004":{"position":[[153,10]]},"1007":{"position":[[32,10],[1401,11]]},"1013":{"position":[[99,10],[602,10]]},"1014":{"position":[[46,11]]},"1015":{"position":[[46,10]]},"1020":{"position":[[313,10],[556,11]]},"1022":{"position":[[416,11]]},"1024":{"position":[[52,10]]},"1032":{"position":[[133,10],[237,10]]},"1033":{"position":[[70,10],[319,12]]},"1035":{"position":[[29,11]]},"1036":{"position":[[24,11]]},"1047":{"position":[[36,11]]},"1055":{"position":[[46,10]]},"1062":{"position":[[239,10]]},"1072":{"position":[[596,11],[1204,10],[1291,10],[1544,10]]},"1074":{"position":[[41,10]]},"1076":{"position":[[141,10]]},"1077":{"position":[[108,11]]},"1079":{"position":[[78,11]]},"1081":{"position":[[27,11]]},"1085":{"position":[[755,10],[841,10],[2713,10],[2765,11],[2867,10],[2933,10],[3101,11]]},"1100":{"position":[[167,11],[597,11],[703,11]]},"1101":{"position":[[326,10],[414,11],[515,11],[676,11]]},"1102":{"position":[[388,11]]},"1103":{"position":[[358,11]]},"1105":{"position":[[784,11]]},"1106":{"position":[[722,11]]},"1108":{"position":[[452,11]]},"1121":{"position":[[247,10],[621,11]]},"1125":{"position":[[818,11]]},"1149":{"position":[[534,10],[991,11],[1246,10],[1373,11]]},"1150":{"position":[[323,11]]},"1158":{"position":[[279,11]]},"1165":{"position":[[867,11]]},"1175":{"position":[[616,10]]},"1194":{"position":[[174,12]]},"1222":{"position":[[994,10],[1053,12],[1090,10],[1283,12]]},"1246":{"position":[[1759,10],[1924,12]]},"1253":{"position":[[130,12]]},"1309":{"position":[[1331,10]]},"1311":{"position":[[86,11],[1199,10],[1349,11],[1711,10]]},"1321":{"position":[[607,11],[853,11],[1107,10]]},"1322":{"position":[[262,10],[331,10]]}},"keywords":{}}],["collection'",{"_index":3320,"title":{},"content":{"541":{"position":[[773,12]]},"601":{"position":[[754,12]]},"955":{"position":[[13,12]]},"1035":{"position":[[62,12]]},"1036":{"position":[[57,12]]},"1321":{"position":[[706,12]]}},"keywords":{}}],["collection(firestoredatabas",{"_index":4871,"title":{},"content":{"854":{"position":[[421,29]]}},"keywords":{}}],["collection.find",{"_index":3308,"title":{},"content":{"541":{"position":[[360,18]]},"542":{"position":[[796,21]]},"562":{"position":[[1201,18]]},"563":{"position":[[720,21]]},"826":{"position":[[809,21]]}},"keywords":{}}],["collection.find().$.subscribe(result",{"_index":6086,"title":{},"content":{"1150":{"position":[[422,37]]}},"keywords":{}}],["collection.find().where('affiliation').equals('jedi",{"_index":3267,"title":{},"content":{"523":{"position":[[391,54]]}},"keywords":{}}],["collection.findon",{"_index":4740,"title":{},"content":{"826":{"position":[[907,24]]}},"keywords":{}}],["collection.html?console=limit#faq",{"_index":4255,"title":{},"content":{"749":{"position":[[9422,33]]}},"keywords":{}}],["collection.insert",{"_index":1279,"title":{},"content":{"188":{"position":[[2851,19]]}},"keywords":{}}],["collection.options.foo",{"_index":4673,"title":{},"content":{"806":{"position":[[765,25]]}},"keywords":{}}],["collection2",{"_index":5322,"title":{},"content":{"939":{"position":[[215,11],[275,13]]}},"keywords":{}}],["collectionid",{"_index":4908,"title":{},"content":{"862":{"position":[[1253,13]]}},"keywords":{}}],["collectionnam",{"_index":3739,"title":{},"content":{"649":{"position":[[345,15]]},"872":{"position":[[2404,15]]},"934":{"position":[[268,14]]},"1309":{"position":[[1431,14]]}},"keywords":{}}],["collections.humans.find",{"_index":3818,"title":{},"content":{"662":{"position":[[2684,25],[2772,25]]},"710":{"position":[[1991,25],[2079,25]]},"838":{"position":[[2898,25],[2986,25]]}},"keywords":{}}],["collections.humans.insert({id",{"_index":3817,"title":{},"content":{"662":{"position":[[2595,30]]},"710":{"position":[[1902,30]]},"838":{"position":[[2809,30]]}},"keywords":{}}],["collections/sync",{"_index":4723,"title":{},"content":{"825":{"position":[[476,16]]}},"keywords":{}}],["collectionsofflin",{"_index":4932,"title":{},"content":{"870":{"position":[[46,18]]},"896":{"position":[[161,18]]}},"keywords":{}}],["collis",{"_index":3460,"title":{},"content":{"569":{"position":[[692,9]]},"635":{"position":[[159,10]]},"1085":{"position":[[1879,10],[2079,10]]}},"keywords":{}}],["color",{"_index":1258,"title":{},"content":{"188":{"position":[[1362,6],[1450,8]]},"1074":{"position":[[265,5]]},"1314":{"position":[[438,6],[469,6]]}},"keywords":{}}],["colorcontroller.text",{"_index":1286,"title":{},"content":{"188":{"position":[[2985,20]]}},"keywords":{}}],["column",{"_index":1990,"title":{"356":{"position":[[5,7]]}},"content":{"351":{"position":[[38,6]]},"356":{"position":[[125,8],[221,7],[777,8]]},"357":{"position":[[57,8]]},"362":{"position":[[363,8],[498,7]]},"457":{"position":[[296,6]]},"898":{"position":[[1709,6],[3926,6],[4263,8]]},"1253":{"position":[[105,8]]}},"keywords":{}}],["combin",{"_index":637,"title":{},"content":{"40":{"position":[[354,7]]},"61":{"position":[[276,9]]},"118":{"position":[[94,8]]},"179":{"position":[[269,8]]},"260":{"position":[[171,7]]},"266":{"position":[[260,8]]},"269":{"position":[[34,7]]},"444":{"position":[[781,7]]},"469":{"position":[[964,11]]},"491":{"position":[[782,9]]},"496":{"position":[[305,9]]},"498":{"position":[[459,9]]},"500":{"position":[[68,9]]},"513":{"position":[[171,8]]},"520":{"position":[[94,11]]},"567":{"position":[[800,7]]},"575":{"position":[[67,9]]},"630":{"position":[[830,7]]},"749":{"position":[[5665,11]]},"837":{"position":[[1474,8]]},"860":{"position":[[277,9],[1118,8]]},"967":{"position":[[90,12]]},"1072":{"position":[[1397,7]]},"1100":{"position":[[541,11]]},"1237":{"position":[[116,11]]},"1238":{"position":[[23,11]]},"1296":{"position":[[1489,7]]}},"keywords":{}}],["come",{"_index":389,"title":{"781":{"position":[[9,5]]},"1022":{"position":[[28,5]]}},"content":{"23":{"position":[[338,5]]},"46":{"position":[[283,5]]},"157":{"position":[[382,4]]},"186":{"position":[[78,4]]},"228":{"position":[[37,4]]},"278":{"position":[[9,5]]},"290":{"position":[[9,5]]},"369":{"position":[[76,5]]},"391":{"position":[[167,5]]},"398":{"position":[[182,5]]},"408":{"position":[[2016,5],[3153,5],[4081,4]]},"427":{"position":[[44,4]]},"464":{"position":[[910,5]]},"535":{"position":[[52,5]]},"571":{"position":[[343,4]]},"595":{"position":[[52,5]]},"659":{"position":[[11,5]]},"661":{"position":[[377,5]]},"689":{"position":[[71,4]]},"709":{"position":[[353,4]]},"710":{"position":[[83,4]]},"714":{"position":[[455,5]]},"836":{"position":[[1251,5]]},"904":{"position":[[1756,5]]},"911":{"position":[[348,4]]},"984":{"position":[[50,5]]},"1097":{"position":[[447,5]]},"1107":{"position":[[928,4]]},"1157":{"position":[[63,4]]},"1159":{"position":[[127,5]]},"1188":{"position":[[216,4]]},"1210":{"position":[[152,5]]},"1214":{"position":[[574,5]]},"1270":{"position":[[358,5]]},"1271":{"position":[[91,5]]},"1275":{"position":[[90,5]]},"1316":{"position":[[1641,5],[2791,5]]},"1318":{"position":[[233,5]]}},"keywords":{}}],["comfort",{"_index":1666,"title":{},"content":{"286":{"position":[[345,7]]},"352":{"position":[[284,11]]}},"keywords":{}}],["command",{"_index":1084,"title":{},"content":{"128":{"position":[[157,8]]},"254":{"position":[[188,7]]},"872":{"position":[[536,8]]}},"keywords":{}}],["comment",{"_index":4496,"title":{},"content":{"759":{"position":[[1188,11]]},"1266":{"position":[[1032,9]]}},"keywords":{}}],["commerc",{"_index":3193,"title":{},"content":{"496":{"position":[[513,8]]}},"keywords":{}}],["commerci",{"_index":599,"title":{},"content":{"38":{"position":[[943,10]]},"43":{"position":[[642,10]]}},"keywords":{}}],["commit",{"_index":441,"title":{"1298":{"position":[[21,8]]}},"content":{"27":{"position":[[318,6]]},"32":{"position":[[274,6]]},"668":{"position":[[84,9],[170,6]]},"731":{"position":[[270,7]]},"1297":{"position":[[263,9]]},"1298":{"position":[[15,10],[135,6],[175,8],[219,9]]}},"keywords":{}}],["commithash",{"_index":4080,"title":{},"content":{"731":{"position":[[225,10]]}},"keywords":{}}],["common",{"_index":1112,"title":{},"content":{"132":{"position":[[67,6]]},"282":{"position":[[22,6]]},"376":{"position":[[199,6]]},"411":{"position":[[4463,6]]},"412":{"position":[[991,6]]},"419":{"position":[[66,6]]},"420":{"position":[[472,6]]},"458":{"position":[[1279,6]]},"460":{"position":[[437,6]]},"555":{"position":[[876,6]]},"624":{"position":[[1359,6]]},"640":{"position":[[99,6]]},"697":{"position":[[361,6]]},"708":{"position":[[98,6]]},"709":{"position":[[25,6],[95,6]]},"785":{"position":[[250,6]]},"875":{"position":[[1704,6],[7084,6]]},"966":{"position":[[167,6]]},"995":{"position":[[531,6]]},"1072":{"position":[[2108,6]]},"1092":{"position":[[10,6]]},"1271":{"position":[[1027,6]]},"1320":{"position":[[180,6]]}},"keywords":{}}],["commonli",{"_index":6336,"title":{},"content":{"1272":{"position":[[304,8]]}},"keywords":{}}],["commonmodul",{"_index":4724,"title":{},"content":{"825":{"position":[[602,12],[752,15]]}},"keywords":{}}],["commonplac",{"_index":2854,"title":{},"content":{"421":{"position":[[739,11]]}},"keywords":{}}],["commun",{"_index":996,"title":{},"content":{"84":{"position":[[230,9]]},"114":{"position":[[243,9]]},"149":{"position":[[243,9]]},"175":{"position":[[236,9]]},"188":{"position":[[203,12],[554,11],[1523,11]]},"204":{"position":[[205,12]]},"210":{"position":[[668,12]]},"241":{"position":[[333,9]]},"263":{"position":[[434,10]]},"288":{"position":[[268,13]]},"289":{"position":[[1713,11]]},"303":{"position":[[1087,14]]},"306":{"position":[[269,9]]},"318":{"position":[[527,9]]},"320":{"position":[[145,9]]},"347":{"position":[[243,9]]},"362":{"position":[[1314,9]]},"373":{"position":[[333,9]]},"381":{"position":[[257,9]]},"386":{"position":[[274,9]]},"387":{"position":[[226,9]]},"419":{"position":[[1367,9]]},"460":{"position":[[622,12]]},"491":{"position":[[1536,13]]},"511":{"position":[[243,9]]},"531":{"position":[[243,9]]},"535":{"position":[[870,14]]},"548":{"position":[[376,14]]},"556":{"position":[[1544,14],[1587,13]]},"567":{"position":[[506,9]]},"591":{"position":[[243,9]]},"595":{"position":[[945,14]]},"608":{"position":[[374,14]]},"610":{"position":[[163,14],[777,13]]},"611":{"position":[[34,13]]},"612":{"position":[[158,13],[1028,14]]},"613":{"position":[[72,13]]},"614":{"position":[[23,14],[104,13],[636,13]]},"617":{"position":[[1097,13]]},"621":{"position":[[62,13],[256,13]]},"624":{"position":[[35,13],[687,14]]},"644":{"position":[[289,9]]},"693":{"position":[[575,12]]},"711":{"position":[[340,11]]},"749":{"position":[[23599,11]]},"824":{"position":[[369,9]]},"835":{"position":[[671,9],[715,9]]},"839":{"position":[[1144,9]]},"899":{"position":[[388,10]]},"901":{"position":[[33,14]]},"906":{"position":[[573,14]]},"913":{"position":[[249,9]]},"1088":{"position":[[451,11]]},"1133":{"position":[[54,11]]},"1149":{"position":[[451,12]]},"1151":{"position":[[36,10]]},"1178":{"position":[[36,10]]},"1218":{"position":[[20,12]]},"1246":{"position":[[725,11]]},"1301":{"position":[[1170,11]]},"1304":{"position":[[747,11]]}},"keywords":{}}],["communication.long",{"_index":3669,"title":{},"content":{"622":{"position":[[387,18]]}},"keywords":{}}],["community/sqlit",{"_index":3786,"title":{},"content":{"661":{"position":[[280,16],[443,16],[563,16],[1067,18]]},"662":{"position":[[955,16],[1301,17],[1741,18]]},"1279":{"position":[[563,18]]}},"keywords":{}}],["communityhav",{"_index":3147,"title":{},"content":{"483":{"position":[[880,13]]}},"keywords":{}}],["compani",{"_index":351,"title":{"627":{"position":[[0,7]]}},"content":{"20":{"position":[[123,7]]},"38":{"position":[[971,9]]},"411":{"position":[[5623,9]]},"412":{"position":[[1435,7]]},"627":{"position":[[36,7]]}},"keywords":{}}],["companion",{"_index":3290,"title":{},"content":{"530":{"position":[[633,9]]}},"keywords":{}}],["compar",{"_index":86,"title":{"74":{"position":[[36,8]]},"105":{"position":[[36,8]]},"232":{"position":[[26,8]]},"278":{"position":[[55,8]]},"393":{"position":[[0,9]]},"902":{"position":[[33,8]]}},"content":{"6":{"position":[[107,8]]},"13":{"position":[[244,8]]},"16":{"position":[[355,8]]},"25":{"position":[[163,8]]},"33":{"position":[[292,8]]},"37":{"position":[[289,8]]},"39":{"position":[[594,8]]},"40":{"position":[[603,8]]},"47":{"position":[[182,8]]},"66":{"position":[[151,8]]},"89":{"position":[[119,8]]},"131":{"position":[[586,8]]},"161":{"position":[[279,8]]},"173":{"position":[[270,8],[454,8]]},"174":{"position":[[723,8]]},"212":{"position":[[126,8]]},"224":{"position":[[47,8]]},"232":{"position":[[261,8]]},"265":{"position":[[243,8]]},"281":{"position":[[339,8]]},"282":{"position":[[478,8]]},"295":{"position":[[107,8]]},"299":{"position":[[1587,9]]},"364":{"position":[[636,8]]},"390":{"position":[[769,8]]},"393":{"position":[[77,7],[490,7],[719,7]]},"394":{"position":[[1506,7]]},"400":{"position":[[195,8],[729,8]]},"402":{"position":[[654,7],[1366,8],[2600,7]]},"404":{"position":[[387,8]]},"408":{"position":[[4006,8]]},"411":{"position":[[965,8]]},"413":{"position":[[73,7]]},"429":{"position":[[102,8]]},"432":{"position":[[1294,7]]},"434":{"position":[[202,8]]},"450":{"position":[[524,8]]},"454":{"position":[[414,8],[594,7]]},"456":{"position":[[56,7]]},"458":{"position":[[42,8]]},"462":{"position":[[308,7],[990,7]]},"464":{"position":[[585,8]]},"466":{"position":[[427,8]]},"467":{"position":[[345,8]]},"468":{"position":[[383,7]]},"524":{"position":[[1032,8]]},"576":{"position":[[1,8]]},"581":{"position":[[553,8]]},"620":{"position":[[1,9],[463,11],[744,7]]},"623":{"position":[[756,8]]},"662":{"position":[[806,8]]},"688":{"position":[[601,7]]},"698":{"position":[[595,9]]},"703":{"position":[[1041,8],[1107,7]]},"717":{"position":[[315,8]]},"800":{"position":[[284,8]]},"875":{"position":[[2265,7],[4912,7]]},"885":{"position":[[2231,7]]},"901":{"position":[[538,9]]},"947":{"position":[[73,8]]},"990":{"position":[[509,7]]},"1067":{"position":[[187,8],[842,7],[1017,8]]},"1071":{"position":[[191,8]]},"1089":{"position":[[201,8]]},"1099":{"position":[[131,8]]},"1109":{"position":[[112,9]]},"1118":{"position":[[124,8]]},"1120":{"position":[[60,8],[718,10]]},"1128":{"position":[[14,8]]},"1132":{"position":[[60,7]]},"1137":{"position":[[58,8]]},"1143":{"position":[[409,8]]},"1194":{"position":[[113,7],[1082,8]]},"1206":{"position":[[486,8]]},"1209":{"position":[[105,8],[449,8]]},"1213":{"position":[[203,8]]},"1270":{"position":[[36,8]]},"1276":{"position":[[212,8]]},"1308":{"position":[[388,9],[509,7]]}},"keywords":{}}],["comparison",{"_index":689,"title":{"60":{"position":[[12,10]]},"456":{"position":[[8,11]]},"462":{"position":[[12,11]]},"547":{"position":[[12,10]]},"607":{"position":[[12,10]]},"620":{"position":[[12,11]]},"1137":{"position":[[22,11]]},"1152":{"position":[[12,10]]},"1191":{"position":[[22,11]]},"1193":{"position":[[12,11]]},"1195":{"position":[[35,11]]},"1196":{"position":[[39,11]]},"1270":{"position":[[12,10]]},"1292":{"position":[[12,10]]}},"content":{"43":{"position":[[754,10]]},"394":{"position":[[78,10],[996,12]]},"420":{"position":[[269,11]]},"442":{"position":[[128,10]]},"462":{"position":[[90,12]]},"469":{"position":[[1309,10]]},"495":{"position":[[900,12]]},"620":{"position":[[279,10]]},"694":{"position":[[1,10]]},"698":{"position":[[687,10]]},"703":{"position":[[962,10]]},"772":{"position":[[2534,10]]},"838":{"position":[[3158,11]]},"875":{"position":[[5014,11]]},"1137":{"position":[[26,10],[250,10],[272,10]]},"1193":{"position":[[65,12]]},"1209":{"position":[[307,10]]},"1276":{"position":[[378,11]]}},"keywords":{}}],["comparisons.hierarch",{"_index":2337,"title":{},"content":{"396":{"position":[[311,24]]}},"keywords":{}}],["comparisonspeed",{"_index":6478,"title":{},"content":{"1302":{"position":[[24,18]]}},"keywords":{}}],["compat",{"_index":394,"title":{"82":{"position":[[26,13]]},"113":{"position":[[26,13]]},"238":{"position":[[34,10]]},"384":{"position":[[15,14]]},"830":{"position":[[13,14]]},"885":{"position":[[11,10]]}},"content":{"24":{"position":[[44,10],[314,10],[358,14],[779,10]]},"57":{"position":[[255,13]]},"76":{"position":[[137,13]]},"82":{"position":[[42,13]]},"110":{"position":[[185,13]]},"113":{"position":[[79,10],[125,13]]},"173":{"position":[[2342,13]]},"174":{"position":[[2594,14],[2796,13],[2920,14],[2995,10]]},"188":{"position":[[442,10]]},"238":{"position":[[70,10]]},"286":{"position":[[73,13],[301,13]]},"364":{"position":[[203,14],[333,13]]},"371":{"position":[[172,13]]},"381":{"position":[[212,10]]},"391":{"position":[[1030,10]]},"438":{"position":[[351,10]]},"445":{"position":[[1807,13]]},"495":{"position":[[515,14]]},"581":{"position":[[737,14]]},"624":{"position":[[991,13]]},"749":{"position":[[159,10]]},"756":{"position":[[429,10]]},"838":{"position":[[771,10]]},"841":{"position":[[744,10]]},"863":{"position":[[864,13]]},"865":{"position":[[150,10]]},"879":{"position":[[251,10]]},"911":{"position":[[226,10]]},"981":{"position":[[518,10],[676,10]]},"983":{"position":[[155,10]]},"1133":{"position":[[216,10]]},"1134":{"position":[[294,10]]},"1177":{"position":[[129,10]]},"1204":{"position":[[130,10]]},"1304":{"position":[[1884,10]]},"1320":{"position":[[71,10],[129,10]]}},"keywords":{}}],["compel",{"_index":999,"title":{},"content":{"86":{"position":[[11,10]]},"174":{"position":[[143,10]]},"175":{"position":[[647,10]]},"186":{"position":[[346,10]]},"215":{"position":[[5,10]]},"278":{"position":[[110,10]]},"366":{"position":[[399,10]]},"412":{"position":[[15195,10]]},"530":{"position":[[158,10]]}},"keywords":{}}],["compet",{"_index":686,"title":{},"content":{"43":{"position":[[662,8]]},"571":{"position":[[1395,9]]}},"keywords":{}}],["compil",{"_index":491,"title":{},"content":{"30":{"position":[[215,9]]},"188":{"position":[[35,8]]},"357":{"position":[[313,8]]},"408":{"position":[[3518,7]]},"454":{"position":[[241,7],[506,8],[638,8]]},"524":{"position":[[712,8],[797,8]]},"581":{"position":[[454,8]]},"1251":{"position":[[334,7]]},"1276":{"position":[[646,8]]}},"keywords":{}}],["complet",{"_index":641,"title":{"201":{"position":[[3,8]]}},"content":{"40":{"position":[[722,8]]},"201":{"position":[[238,10]]},"209":{"position":[[552,9]]},"263":{"position":[[324,8]]},"417":{"position":[[27,8]]},"475":{"position":[[167,10]]},"752":{"position":[[1031,9]]},"840":{"position":[[255,8]]},"1191":{"position":[[456,10]]},"1304":{"position":[[903,8]]}},"keywords":{}}],["complex",{"_index":322,"title":{"416":{"position":[[0,10]]},"426":{"position":[[8,7]]},"457":{"position":[[8,7]]}},"content":{"19":{"position":[[227,7],[339,7]]},"33":{"position":[[336,7]]},"34":{"position":[[721,7]]},"35":{"position":[[664,7]]},"45":{"position":[[285,7]]},"47":{"position":[[450,7]]},"61":{"position":[[454,13]]},"64":{"position":[[141,7]]},"66":{"position":[[365,7]]},"89":{"position":[[131,7]]},"126":{"position":[[335,7]]},"173":{"position":[[466,7]]},"178":{"position":[[187,7]]},"212":{"position":[[202,7],[296,7]]},"217":{"position":[[359,7]]},"219":{"position":[[306,11]]},"223":{"position":[[110,7],[346,10],[396,7]]},"250":{"position":[[145,7]]},"252":{"position":[[195,7]]},"262":{"position":[[376,7]]},"267":{"position":[[1009,7]]},"279":{"position":[[291,10]]},"282":{"position":[[426,7]]},"289":{"position":[[433,13]]},"303":{"position":[[1350,11]]},"317":{"position":[[125,7]]},"321":{"position":[[241,7],[432,7]]},"323":{"position":[[435,10]]},"331":{"position":[[312,12]]},"352":{"position":[[181,7]]},"353":{"position":[[61,7]]},"354":{"position":[[197,7],[609,7],[1480,7]]},"360":{"position":[[137,7],[241,7]]},"364":{"position":[[522,7]]},"369":{"position":[[378,7]]},"372":{"position":[[285,7]]},"395":{"position":[[513,7]]},"401":{"position":[[845,10]]},"408":{"position":[[404,7]]},"410":{"position":[[1790,8]]},"411":{"position":[[1964,7]]},"412":{"position":[[3931,7],[4135,10],[8911,7],[8998,7],[9640,11],[13103,11],[13422,7],[13578,7],[13911,7],[14120,7]]},"416":{"position":[[26,10]]},"427":{"position":[[557,7],[1080,7]]},"430":{"position":[[336,7]]},"432":{"position":[[159,7],[637,7],[1124,7]]},"433":{"position":[[309,8]]},"441":{"position":[[220,10],[337,7]]},"446":{"position":[[904,7]]},"451":{"position":[[428,7]]},"452":{"position":[[274,7]]},"453":{"position":[[653,8]]},"457":{"position":[[72,7],[608,7]]},"475":{"position":[[252,7]]},"497":{"position":[[283,7],[428,7],[682,7]]},"515":{"position":[[175,7]]},"521":{"position":[[216,7],[442,13]]},"533":{"position":[[173,7],[313,7]]},"535":{"position":[[466,7]]},"536":{"position":[[71,12]]},"548":{"position":[[298,12]]},"566":{"position":[[262,7]]},"574":{"position":[[559,7],[774,7]]},"593":{"position":[[173,7],[313,7]]},"595":{"position":[[494,7]]},"596":{"position":[[69,12]]},"608":{"position":[[296,12]]},"611":{"position":[[988,7],[1260,10]]},"613":{"position":[[961,7]]},"614":{"position":[[211,7]]},"642":{"position":[[231,7]]},"643":{"position":[[276,7]]},"644":{"position":[[243,7]]},"659":{"position":[[828,7]]},"661":{"position":[[1800,7]]},"682":{"position":[[105,7]]},"688":{"position":[[899,7]]},"689":{"position":[[112,11],[566,11]]},"698":{"position":[[1402,7],[2110,7],[3249,10]]},"701":{"position":[[742,7]]},"711":{"position":[[2245,7]]},"723":{"position":[[276,7],[2055,7],[2211,7]]},"765":{"position":[[119,7]]},"784":{"position":[[254,7]]},"785":{"position":[[233,10]]},"796":{"position":[[10,7],[908,7]]},"800":{"position":[[503,7],[582,7]]},"801":{"position":[[286,7]]},"802":{"position":[[514,10]]},"835":{"position":[[933,7]]},"836":{"position":[[1760,7],[2295,7]]},"875":{"position":[[4981,7]]},"898":{"position":[[694,10]]},"903":{"position":[[712,7]]},"906":{"position":[[1096,7]]},"981":{"position":[[372,7],[588,7]]},"1072":{"position":[[1597,11]]},"1123":{"position":[[562,7]]},"1132":{"position":[[598,7]]},"1209":{"position":[[482,7]]},"1213":{"position":[[215,7]]},"1236":{"position":[[95,7]]},"1238":{"position":[[93,7]]},"1252":{"position":[[268,7]]},"1257":{"position":[[176,7]]},"1317":{"position":[[414,7]]}},"keywords":{}}],["complex—larg",{"_index":3423,"title":{},"content":{"561":{"position":[[22,13]]}},"keywords":{}}],["complex—need",{"_index":3411,"title":{},"content":{"559":{"position":[[1610,15]]}},"keywords":{}}],["compli",{"_index":4304,"title":{},"content":{"749":{"position":[[13010,8]]},"1324":{"position":[[374,8]]}},"keywords":{}}],["complianc",{"_index":3444,"title":{},"content":{"567":{"position":[[717,10]]}},"keywords":{}}],["compliant",{"_index":3333,"title":{},"content":{"550":{"position":[[382,9]]},"686":{"position":[[681,9]]},"837":{"position":[[190,9],[788,9]]},"1198":{"position":[[451,9]]},"1286":{"position":[[119,9]]}},"keywords":{}}],["complic",{"_index":1847,"title":{},"content":{"303":{"position":[[1075,11]]},"326":{"position":[[265,11]]},"354":{"position":[[880,10]]},"412":{"position":[[11561,11],[14768,10]]},"483":{"position":[[455,11]]},"560":{"position":[[543,11]]},"708":{"position":[[485,11]]},"1156":{"position":[[16,11]]}},"keywords":{}}],["compon",{"_index":1061,"title":{},"content":{"116":{"position":[[162,9]]},"124":{"position":[[249,10]]},"494":{"position":[[651,9]]},"515":{"position":[[417,11]]},"522":{"position":[[211,11]]},"523":{"position":[[91,11],[166,10]]},"541":{"position":[[82,11],[123,9],[745,9]]},"562":{"position":[[767,10],[892,10]]},"574":{"position":[[123,11]]},"575":{"position":[[284,10]]},"580":{"position":[[73,10]]},"585":{"position":[[226,10]]},"590":{"position":[[534,10]]},"600":{"position":[[142,10]]},"601":{"position":[[28,9],[726,9]]},"749":{"position":[[24138,9]]},"825":{"position":[[531,10],[551,10],[684,12]]},"828":{"position":[[144,9],[408,9]]},"829":{"position":[[349,10],[1200,10],[2110,10],[2281,10],[2692,9],[2718,9],[3634,9],[3739,9],[3798,9]]}},"keywords":{}}],["components.rxdb",{"_index":3531,"title":{},"content":{"591":{"position":[[562,15]]}},"keywords":{}}],["compos",{"_index":2781,"title":{"1252":{"position":[[0,11]]}},"content":{"414":{"position":[[112,7]]},"705":{"position":[[571,11]]},"749":{"position":[[11278,8]]},"861":{"position":[[329,7],[390,7],[515,7],[857,8],[880,7],[908,7]]},"1071":{"position":[[233,10]]},"1078":{"position":[[51,8],[291,8],[370,8]]},"1252":{"position":[[50,7]]}},"keywords":{}}],["composit",{"_index":3490,"title":{"601":{"position":[[34,11]]},"1078":{"position":[[0,9]]}},"content":{"580":{"position":[[244,11]]},"590":{"position":[[235,11],[465,11]]},"1065":{"position":[[916,9]]},"1078":{"position":[[18,9],[237,9],[795,9],[837,9],[992,9]]}},"keywords":{}}],["compound",{"_index":4650,"title":{},"content":{"798":{"position":[[30,8]]},"1080":{"position":[[960,8]]},"1132":{"position":[[303,8]]}},"keywords":{}}],["compoundindex",{"_index":4387,"title":{},"content":{"749":{"position":[[19336,15]]}},"keywords":{}}],["comprehens",{"_index":621,"title":{"423":{"position":[[45,13]]}},"content":{"39":{"position":[[280,13]]},"56":{"position":[[3,13]]},"116":{"position":[[207,13]]},"412":{"position":[[355,13]]},"433":{"position":[[490,13]]},"514":{"position":[[160,13]]},"543":{"position":[[3,13]]},"603":{"position":[[3,13]]},"901":{"position":[[606,13]]}},"keywords":{}}],["compress",{"_index":742,"title":{"81":{"position":[[18,11]]},"111":{"position":[[18,11]]},"141":{"position":[[9,12]]},"169":{"position":[[9,12]]},"197":{"position":[[9,12]]},"236":{"position":[[18,11]]},"294":{"position":[[0,11]]},"307":{"position":[[44,11]]},"311":{"position":[[17,12]]},"316":{"position":[[0,11]]},"345":{"position":[[9,12]]},"366":{"position":[[0,11]]},"508":{"position":[[9,12]]},"528":{"position":[[9,12]]},"588":{"position":[[9,12]]},"629":{"position":[[63,11]]},"639":{"position":[[6,12]]},"733":{"position":[[4,11]]},"734":{"position":[[11,12]]}},"content":{"47":{"position":[[1115,12]]},"57":{"position":[[393,12],[451,12],[487,12]]},"81":{"position":[[53,12]]},"111":{"position":[[44,11],[78,10]]},"141":{"position":[[81,12],[103,12]]},"169":{"position":[[70,12],[95,11]]},"170":{"position":[[445,12]]},"174":{"position":[[2368,11],[2428,10]]},"197":{"position":[[81,12]]},"236":{"position":[[50,10],[143,10]]},"283":{"position":[[170,11]]},"294":{"position":[[73,12],[156,11],[242,11]]},"303":{"position":[[203,11],[228,11],[321,11],[464,11],[791,10]]},"306":{"position":[[181,11]]},"311":{"position":[[94,11]]},"316":{"position":[[54,11],[220,11]]},"317":{"position":[[203,11]]},"318":{"position":[[94,12],[639,10]]},"345":{"position":[[66,11]]},"361":{"position":[[242,12],[327,11],[472,11],[788,10]]},"362":{"position":[[945,12]]},"366":{"position":[[1,11],[75,11],[141,10],[242,10],[457,11]]},"483":{"position":[[619,11]]},"508":{"position":[[26,12]]},"528":{"position":[[23,11]]},"535":{"position":[[1093,11]]},"544":{"position":[[406,12],[428,11]]},"595":{"position":[[1170,11]]},"604":{"position":[[300,12],[340,12]]},"639":{"position":[[97,11]]},"710":{"position":[[273,11]]},"711":{"position":[[2302,11]]},"734":{"position":[[9,11],[105,11],[188,13],[569,10]]},"749":{"position":[[721,11],[1009,11]]},"793":{"position":[[443,11]]},"838":{"position":[[916,11],[3329,12]]},"841":{"position":[[1015,11],[1229,11]]},"932":{"position":[[199,11],[332,8],[416,11],[443,8],[582,11],[610,11],[757,13],[895,12],[1140,11],[1271,12],[1315,11]]},"981":{"position":[[913,9]]},"1123":{"position":[[605,11]]},"1132":{"position":[[1083,11],[1262,8]]},"1237":{"position":[[168,12],[427,11],[461,10],[631,13]]}},"keywords":{}}],["compromis",{"_index":1123,"title":{},"content":{"139":{"position":[[272,12]]},"167":{"position":[[233,12]]},"218":{"position":[[238,12]]},"292":{"position":[[23,10]]},"369":{"position":[[715,12]]},"412":{"position":[[13205,11]]},"446":{"position":[[258,12]]},"643":{"position":[[308,12]]}},"keywords":{}}],["comput",{"_index":424,"title":{"569":{"position":[[24,10]]}},"content":{"26":{"position":[[131,9]]},"224":{"position":[[104,13]]},"391":{"position":[[70,7]]},"401":{"position":[[796,7]]},"408":{"position":[[153,10],[1801,9]]},"527":{"position":[[178,13]]},"569":{"position":[[96,9],[123,9],[146,8],[651,9],[1109,10],[1504,9]]},"571":{"position":[[1870,9]]},"699":{"position":[[206,10],[1026,10]]},"708":{"position":[[36,9]]},"802":{"position":[[725,13]]},"1087":{"position":[[132,8]]},"1088":{"position":[[17,7]]},"1094":{"position":[[456,7]]},"1300":{"position":[[1163,8]]}},"keywords":{}}],["computation",{"_index":1396,"title":{},"content":{"216":{"position":[[326,15]]}},"keywords":{}}],["computing"",{"_index":214,"title":{},"content":{"14":{"position":[[441,16]]}},"keywords":{}}],["con",{"_index":2651,"title":{"845":{"position":[[0,5]]},"1129":{"position":[[0,5]]},"1162":{"position":[[0,5]]},"1168":{"position":[[0,5]]},"1171":{"position":[[0,5]]},"1181":{"position":[[0,5]]},"1200":{"position":[[0,5]]}},"content":{"412":{"position":[[377,5]]},"413":{"position":[[35,4]]}},"keywords":{}}],["concat",{"_index":5833,"title":{},"content":{"1078":{"position":[[450,6]]}},"keywords":{}}],["concaten",{"_index":4053,"title":{},"content":{"724":{"position":[[908,13]]}},"keywords":{}}],["concept",{"_index":276,"title":{"828":{"position":[[8,8]]}},"content":{"16":{"position":[[390,7]]},"119":{"position":[[58,8]]},"121":{"position":[[28,7]]},"159":{"position":[[21,7]]},"182":{"position":[[106,7]]},"185":{"position":[[21,7]]},"233":{"position":[[21,7]]},"275":{"position":[[83,7]]},"277":{"position":[[19,7]]},"314":{"position":[[23,7]]},"419":{"position":[[653,7],[1089,9]]},"445":{"position":[[994,7]]},"456":{"position":[[29,8]]},"518":{"position":[[18,7]]},"781":{"position":[[681,7]]},"832":{"position":[[334,8]]},"899":{"position":[[43,8]]},"903":{"position":[[357,7]]},"1253":{"position":[[77,7]]},"1324":{"position":[[309,7]]}},"keywords":{}}],["conceptu",{"_index":3896,"title":{},"content":{"689":{"position":[[101,10]]}},"keywords":{}}],["concern",{"_index":1142,"title":{},"content":{"145":{"position":[[32,8]]},"169":{"position":[[38,8]]},"293":{"position":[[85,7]]},"407":{"position":[[824,8]]},"411":{"position":[[1632,8]]},"429":{"position":[[13,8]]},"507":{"position":[[74,7]]},"839":{"position":[[1005,9]]},"1231":{"position":[[254,9]]}},"keywords":{}}],["concis",{"_index":2941,"title":{},"content":{"445":{"position":[[1451,8]]}},"keywords":{}}],["conclus",{"_index":988,"title":{"148":{"position":[[0,11]]},"170":{"position":[[0,11]]},"198":{"position":[[0,11]]},"441":{"position":[[0,11]]},"447":{"position":[[0,11]]},"468":{"position":[[12,12]]},"510":{"position":[[0,11]]},"530":{"position":[[0,11]]}},"content":{"83":{"position":[[4,11]]},"267":{"position":[[1112,11]]}},"keywords":{}}],["concret",{"_index":6191,"title":{},"content":{"1207":{"position":[[602,8]]}},"keywords":{}}],["concurr",{"_index":739,"title":{},"content":{"47":{"position":[[894,10]]},"203":{"position":[[232,10]]},"358":{"position":[[219,12],[897,12]]},"362":{"position":[[682,12]]},"386":{"position":[[204,10]]},"416":{"position":[[375,12]]},"496":{"position":[[259,10]]},"559":{"position":[[1297,11],[1415,11]]},"566":{"position":[[818,11],[940,11],[983,11]]},"590":{"position":[[872,10]]},"617":{"position":[[1529,10]]},"643":{"position":[[28,12]]},"688":{"position":[[47,10]]},"860":{"position":[[828,10]]},"897":{"position":[[252,11]]},"908":{"position":[[173,13]]}},"keywords":{}}],["condit",{"_index":1165,"title":{"681":{"position":[[0,11]]}},"content":{"152":{"position":[[377,11]]},"280":{"position":[[510,11]]},"289":{"position":[[2024,11]]},"301":{"position":[[68,10]]},"305":{"position":[[529,11]]},"498":{"position":[[661,11]]},"545":{"position":[[114,11]]},"605":{"position":[[114,11]]},"610":{"position":[[1185,10]]},"620":{"position":[[211,11]]},"681":{"position":[[203,11],[388,11]]},"683":{"position":[[558,11]]},"1252":{"position":[[147,9],[201,9]]},"1316":{"position":[[809,10],[1295,9]]}},"keywords":{}}],["confidenti",{"_index":933,"title":{},"content":{"65":{"position":[[1771,12]]},"95":{"position":[[196,15]]},"291":{"position":[[398,12]]},"310":{"position":[[238,13]]},"506":{"position":[[232,12]]},"912":{"position":[[582,12]]}},"keywords":{}}],["config",{"_index":1586,"title":{},"content":{"261":{"position":[[805,6],[838,6]]},"730":{"position":[[109,7]]},"1176":{"position":[[301,7]]},"1228":{"position":[[57,6]]},"1266":{"position":[[92,6],[329,6]]},"1279":{"position":[[88,6]]}},"keywords":{}}],["configur",{"_index":323,"title":{"334":{"position":[[13,11]]},"579":{"position":[[13,11]]},"730":{"position":[[18,14]]},"1236":{"position":[[0,13]]}},"content":{"19":{"position":[[243,13]]},"27":{"position":[[161,13]]},"131":{"position":[[990,9]]},"192":{"position":[[270,11]]},"285":{"position":[[221,9]]},"293":{"position":[[203,9]]},"314":{"position":[[1175,14]]},"346":{"position":[[42,9]]},"372":{"position":[[107,10]]},"503":{"position":[[114,11]]},"590":{"position":[[127,9]]},"617":{"position":[[1557,15]]},"632":{"position":[[2059,12]]},"730":{"position":[[129,13]]},"828":{"position":[[339,13]]},"829":{"position":[[404,11]]},"831":{"position":[[155,10],[531,11]]},"838":{"position":[[1723,14]]},"849":{"position":[[682,9]]},"862":{"position":[[898,9]]},"894":{"position":[[56,13]]},"904":{"position":[[310,9]]},"1156":{"position":[[28,14]]},"1162":{"position":[[1176,10]]},"1214":{"position":[[472,10]]},"1236":{"position":[[80,9]]},"1239":{"position":[[26,13]]}},"keywords":{}}],["confirm",{"_index":3168,"title":{},"content":{"491":{"position":[[694,9],[1565,9]]},"495":{"position":[[335,9]]},"497":{"position":[[838,13]]},"634":{"position":[[247,13]]}},"keywords":{}}],["conflict",{"_index":225,"title":{"134":{"position":[[0,8]]},"203":{"position":[[12,8]]},"250":{"position":[[12,8]]},"312":{"position":[[20,8]]},"339":{"position":[[0,8]]},"416":{"position":[[15,8]]},"496":{"position":[[0,8]]},"635":{"position":[[0,8]]},"690":{"position":[[15,8]]},"691":{"position":[[39,8]]},"698":{"position":[[13,10]]},"847":{"position":[[0,8]]},"908":{"position":[[0,8]]},"987":{"position":[[0,8]]},"1044":{"position":[[8,9]]},"1111":{"position":[[0,8]]},"1303":{"position":[[14,9]]},"1306":{"position":[[0,10]]},"1307":{"position":[[6,10]]},"1308":{"position":[[12,10]]},"1309":{"position":[[7,8]]}},"content":{"14":{"position":[[797,8]]},"16":{"position":[[414,8]]},"35":{"position":[[414,8]]},"39":{"position":[[574,8],[665,8]]},"40":{"position":[[21,9],[219,8],[744,8]]},"43":{"position":[[112,8]]},"123":{"position":[[202,8]]},"134":{"position":[[26,9],[117,8],[189,8],[303,9]]},"135":{"position":[[229,9],[278,8]]},"147":{"position":[[111,8]]},"162":{"position":[[478,8]]},"165":{"position":[[229,8]]},"192":{"position":[[235,8]]},"203":{"position":[[151,8],[198,8]]},"209":{"position":[[943,11]]},"237":{"position":[[251,9]]},"250":{"position":[[38,8],[193,8]]},"255":{"position":[[1265,9]]},"263":{"position":[[191,8],[621,8]]},"289":{"position":[[200,8]]},"306":{"position":[[197,8]]},"312":{"position":[[253,9]]},"328":{"position":[[200,8]]},"331":{"position":[[200,8]]},"339":{"position":[[63,8],[119,9]]},"386":{"position":[[185,10]]},"412":{"position":[[1143,8],[2118,10],[2170,8],[2228,8],[2971,8],[3070,10],[3240,8],[3601,9],[3681,9],[4120,9],[4614,10],[4678,9],[4797,9],[4862,8],[5037,9],[5135,8],[5340,8],[13538,8],[14045,10],[14857,8]]},"416":{"position":[[67,10]]},"419":{"position":[[1163,8]]},"420":{"position":[[830,10]]},"480":{"position":[[1095,8]]},"481":{"position":[[476,8]]},"483":{"position":[[643,8]]},"487":{"position":[[326,9],[398,9]]},"491":{"position":[[494,9],[1029,9],[1131,10],[1391,9],[1468,9]]},"495":{"position":[[60,8],[180,9],[264,10]]},"496":{"position":[[571,9],[808,8]]},"502":{"position":[[1388,10]]},"525":{"position":[[620,8]]},"566":{"position":[[1009,8]]},"567":{"position":[[289,10]]},"576":{"position":[[277,8]]},"582":{"position":[[224,9],[475,9]]},"590":{"position":[[810,8]]},"634":{"position":[[440,8],[489,8]]},"635":{"position":[[24,9],[293,8],[447,8]]},"644":{"position":[[181,8]]},"680":{"position":[[240,8]]},"683":{"position":[[431,8]]},"687":{"position":[[187,11]]},"688":{"position":[[110,9],[187,8],[222,8],[258,8],[329,10],[692,10],[704,8]]},"689":{"position":[[34,8],[498,9]]},"690":{"position":[[5,8],[561,8]]},"691":{"position":[[149,8]]},"698":{"position":[[188,11],[349,8],[436,8],[471,11],[894,9],[1214,11],[1257,9],[1410,8],[1532,8],[1798,9],[1919,8],[2159,8],[2221,9],[3017,8],[3134,8],[3276,8]]},"737":{"position":[[436,9]]},"749":{"position":[[8908,8],[8933,9],[15938,9],[22923,8]]},"793":{"position":[[922,9]]},"844":{"position":[[78,8],[104,9]]},"847":{"position":[[6,9],[148,8]]},"858":{"position":[[574,8]]},"860":{"position":[[728,8],[768,8]]},"863":{"position":[[607,9]]},"875":{"position":[[3729,11],[3881,8],[4124,8],[4509,9],[4880,9],[5117,8],[5174,8]]},"885":{"position":[[1094,9],[1136,9]]},"889":{"position":[[117,11],[156,10],[288,9],[671,11]]},"899":{"position":[[128,8]]},"908":{"position":[[8,8],[59,9],[196,8],[270,8],[345,8],[392,8]]},"913":{"position":[[115,8]]},"934":{"position":[[787,8]]},"943":{"position":[[277,10]]},"944":{"position":[[404,9]]},"948":{"position":[[106,8]]},"981":{"position":[[411,8],[1223,8]]},"982":{"position":[[745,8]]},"983":{"position":[[653,10],[680,10]]},"987":{"position":[[130,8],[507,9],[552,8],[756,8],[1000,8],[1117,8]]},"988":{"position":[[2731,9],[2792,10]]},"1044":{"position":[[85,8]]},"1085":{"position":[[2126,9],[2298,8]]},"1111":{"position":[[22,10],[37,8]]},"1115":{"position":[[679,10]]},"1120":{"position":[[155,9],[286,9]]},"1147":{"position":[[257,8],[351,8]]},"1148":{"position":[[128,8]]},"1149":{"position":[[43,8]]},"1258":{"position":[[68,8]]},"1305":{"position":[[1103,8]]},"1306":{"position":[[24,9],[53,8],[82,9]]},"1307":{"position":[[9,8],[429,8],[469,8],[602,10],[838,9],[893,11]]},"1308":{"position":[[15,8],[252,9],[375,8],[675,9]]},"1309":{"position":[[3,8],[119,9],[142,8],[176,8],[314,8],[373,8],[604,9],[723,9],[786,8],[967,8],[1071,8],[1243,8]]},"1313":{"position":[[1071,9]]},"1323":{"position":[[188,9]]},"1324":{"position":[[876,9]]}},"keywords":{}}],["conflicthandl",{"_index":4421,"title":{},"content":{"749":{"position":[[22882,15]]},"847":{"position":[[47,15]]},"934":{"position":[[734,16]]},"987":{"position":[[1041,15]]},"1309":{"position":[[1290,15],[1474,16]]}},"keywords":{}}],["conflictmessag",{"_index":5162,"title":{},"content":{"889":{"position":[[175,17]]}},"keywords":{}}],["conflicts"",{"_index":2685,"title":{},"content":{"412":{"position":[[3877,16]]}},"keywords":{}}],["conflicts.push(realmasterst",{"_index":5027,"title":{},"content":{"875":{"position":[[5126,32]]}},"keywords":{}}],["conflictsarray",{"_index":5040,"title":{},"content":{"875":{"position":[[6411,14],[6461,15]]}},"keywords":{}}],["confus",{"_index":326,"title":{},"content":{"19":{"position":[[289,9]]},"419":{"position":[[1248,9]]},"495":{"position":[[280,10],[497,10]]},"1188":{"position":[[293,7]]},"1208":{"position":[[557,10]]},"1215":{"position":[[22,8]]}},"keywords":{}}],["congest",{"_index":3665,"title":{},"content":{"621":{"position":[[862,10]]}},"keywords":{}}],["congestion."",{"_index":3639,"title":{},"content":{"617":{"position":[[884,17]]}},"keywords":{}}],["connect",{"_index":314,"title":{"414":{"position":[[0,12]]},"618":{"position":[[0,11]]},"893":{"position":[[0,7]]},"1281":{"position":[[9,11]]}},"content":{"18":{"position":[[418,7]]},"46":{"position":[[86,13],[228,10]]},"65":{"position":[[723,10]]},"69":{"position":[[221,12]]},"88":{"position":[[96,11]]},"122":{"position":[[353,12]]},"123":{"position":[[274,9]]},"133":{"position":[[346,12]]},"135":{"position":[[182,9]]},"136":{"position":[[141,9]]},"157":{"position":[[114,13],[234,10]]},"164":{"position":[[241,11],[262,10]]},"183":{"position":[[138,11],[240,10]]},"184":{"position":[[334,9]]},"188":{"position":[[2438,7],[2603,7]]},"191":{"position":[[109,11],[196,10]]},"201":{"position":[[322,12]]},"206":{"position":[[74,10],[260,13]]},"211":{"position":[[577,7]]},"212":{"position":[[66,11]]},"215":{"position":[[242,10],[370,13]]},"228":{"position":[[487,11]]},"260":{"position":[[29,7]]},"261":{"position":[[884,9]]},"273":{"position":[[216,13]]},"274":{"position":[[165,11],[239,12]]},"280":{"position":[[281,11],[296,12]]},"289":{"position":[[233,12],[1153,10],[1849,12]]},"292":{"position":[[296,11]]},"309":{"position":[[235,11]]},"322":{"position":[[291,10]]},"323":{"position":[[291,12]]},"327":{"position":[[190,11],[207,12]]},"338":{"position":[[146,12]]},"346":{"position":[[609,11]]},"360":{"position":[[604,10]]},"365":{"position":[[1112,9]]},"375":{"position":[[147,11],[750,12]]},"380":{"position":[[110,13],[188,10]]},"396":{"position":[[723,9]]},"407":{"position":[[657,12],[844,12]]},"410":{"position":[[1062,14],[1266,12]]},"411":{"position":[[5608,14]]},"414":{"position":[[154,11],[387,10]]},"416":{"position":[[452,12]]},"418":{"position":[[164,12]]},"419":{"position":[[223,12],[529,12]]},"444":{"position":[[275,13]]},"445":{"position":[[628,10],[730,10],[1111,9]]},"446":{"position":[[242,12]]},"483":{"position":[[917,7]]},"489":{"position":[[704,11]]},"491":{"position":[[729,9],[1227,12]]},"497":{"position":[[235,12]]},"500":{"position":[[505,13]]},"502":{"position":[[576,12]]},"516":{"position":[[237,13],[260,10]]},"525":{"position":[[208,12],[368,9]]},"565":{"position":[[258,12]]},"570":{"position":[[336,9],[526,9],[753,10]]},"574":{"position":[[371,9]]},"575":{"position":[[399,12]]},"582":{"position":[[129,12]]},"584":{"position":[[275,13]]},"610":{"position":[[339,10],[493,10],[1205,10]]},"611":{"position":[[82,10],[480,10],[1030,10],[1103,10],[1229,10]]},"612":{"position":[[507,10],[633,10],[1091,10],[1403,10],[1966,13],[2386,10]]},"614":{"position":[[309,11],[500,10]]},"616":{"position":[[143,11],[304,10],[522,11]]},"617":{"position":[[32,11],[157,11],[287,10],[411,13],[497,11],[549,11],[652,11],[719,11],[1048,11],[1246,10],[1327,11],[1400,12],[1490,11],[1588,10],[1793,11],[2018,10],[2105,10]]},"618":{"position":[[107,12],[361,12],[778,11]]},"619":{"position":[[228,12]]},"621":{"position":[[102,11],[430,11],[632,11]]},"622":{"position":[[62,11],[503,12],[669,11]]},"623":{"position":[[53,11],[290,10],[530,10],[698,11]]},"624":{"position":[[1483,12]]},"626":{"position":[[18,11]]},"630":{"position":[[365,8]]},"632":{"position":[[665,7],[1977,12]]},"661":{"position":[[793,10]]},"723":{"position":[[2721,13]]},"736":{"position":[[543,12]]},"772":{"position":[[38,10],[213,8]]},"775":{"position":[[653,7]]},"776":{"position":[[316,10]]},"782":{"position":[[458,10]]},"836":{"position":[[611,11],[834,11],[893,10]]},"849":{"position":[[131,11],[836,10],[1102,10]]},"860":{"position":[[455,12]]},"866":{"position":[[795,11]]},"871":{"position":[[59,7],[94,8],[156,9],[682,11],[835,10]]},"872":{"position":[[620,10],[2437,11],[3074,8]]},"875":{"position":[[725,10],[7321,13],[7937,8],[8572,11]]},"881":{"position":[[149,10]]},"886":{"position":[[4297,10]]},"897":{"position":[[48,7]]},"898":{"position":[[3140,7]]},"901":{"position":[[222,10],[308,12],[735,11]]},"902":{"position":[[295,11],[626,11]]},"903":{"position":[[430,7]]},"904":{"position":[[1555,10],[2183,7],[2338,12],[2465,10],[3320,9]]},"905":{"position":[[139,10]]},"906":{"position":[[169,12],[264,10],[827,10]]},"962":{"position":[[1039,11]]},"981":{"position":[[1404,10]]},"985":{"position":[[21,9]]},"1007":{"position":[[1129,10]]},"1095":{"position":[[316,7]]},"1100":{"position":[[88,9]]},"1101":{"position":[[46,7],[199,7]]},"1102":{"position":[[145,7]]},"1189":{"position":[[207,10],[249,10],[487,10],[581,11]]},"1281":{"position":[[36,10]]},"1304":{"position":[[858,11]]},"1314":{"position":[[146,10],[369,11]]}},"keywords":{}}],["connection.perform",{"_index":3291,"title":{},"content":{"534":{"position":[[287,23]]},"594":{"position":[[285,23]]}},"keywords":{}}],["connectionhandlercr",{"_index":1367,"title":{},"content":{"210":{"position":[[334,25]]},"261":{"position":[[463,25]]},"904":{"position":[[2533,25]]},"911":{"position":[[661,25]]},"1121":{"position":[[689,25]]}},"keywords":{}}],["connectionparam",{"_index":5146,"title":{},"content":{"886":{"position":[[4669,16],[4795,16]]}},"keywords":{}}],["connectivity.fast",{"_index":1203,"title":{},"content":{"173":{"position":[[1597,19]]}},"keywords":{}}],["connectivity.reduc",{"_index":3694,"title":{},"content":{"630":{"position":[[727,20]]}},"keywords":{}}],["connector",{"_index":1246,"title":{},"content":{"188":{"position":[[514,10],[1493,9]]}},"keywords":{}}],["connectsocket",{"_index":5477,"title":{},"content":{"988":{"position":[[5182,15],[5693,16]]}},"keywords":{}}],["consensu",{"_index":6486,"title":{},"content":{"1304":{"position":[[785,9]]}},"keywords":{}}],["consequ",{"_index":2148,"title":{},"content":{"377":{"position":[[132,13]]}},"keywords":{}}],["conserv",{"_index":3654,"title":{},"content":{"618":{"position":[[456,8]]}},"keywords":{}}],["consid",{"_index":1000,"title":{},"content":{"86":{"position":[[33,8]]},"142":{"position":[[55,8]]},"146":{"position":[[210,8]]},"147":{"position":[[87,8]]},"161":{"position":[[6,11]]},"186":{"position":[[6,11]]},"241":{"position":[[86,8]]},"303":{"position":[[194,8]]},"358":{"position":[[17,8]]},"365":{"position":[[105,9]]},"373":{"position":[[86,8]]},"401":{"position":[[880,10]]},"404":{"position":[[91,8]]},"408":{"position":[[4422,8]]},"412":{"position":[[9455,8],[11277,9]]},"425":{"position":[[208,8]]},"430":{"position":[[83,8],[614,8],[1019,8]]},"433":{"position":[[414,8]]},"447":{"position":[[597,11]]},"497":{"position":[[555,8],[709,8]]},"520":{"position":[[7,11]]},"534":{"position":[[145,8]]},"546":{"position":[[90,9]]},"556":{"position":[[612,8],[1088,8],[1826,8]]},"569":{"position":[[620,8]]},"594":{"position":[[143,8]]},"606":{"position":[[90,9]]},"616":{"position":[[827,10]]},"686":{"position":[[59,10]]},"839":{"position":[[1334,8]]},"1033":{"position":[[918,9]]},"1072":{"position":[[541,8]]},"1162":{"position":[[1071,8]]},"1297":{"position":[[216,8]]}},"keywords":{}}],["consider",{"_index":1410,"title":{"228":{"position":[[11,15]]},"641":{"position":[[12,15]]}},"content":{"377":{"position":[[57,15]]}},"keywords":{}}],["consist",{"_index":985,"title":{"475":{"position":[[13,12]]},"700":{"position":[[9,12]]}},"content":{"80":{"position":[[74,11]]},"109":{"position":[[175,10]]},"112":{"position":[[237,10]]},"123":{"position":[[252,10]]},"134":{"position":[[335,10]]},"135":{"position":[[160,10]]},"158":{"position":[[210,10]]},"160":{"position":[[218,10]]},"164":{"position":[[375,11]]},"173":{"position":[[3212,11]]},"174":{"position":[[2303,10]]},"184":{"position":[[311,11]]},"191":{"position":[[243,11]]},"203":{"position":[[313,10]]},"207":{"position":[[284,11]]},"237":{"position":[[143,10]]},"249":{"position":[[401,11]]},"250":{"position":[[338,11]]},"269":{"position":[[334,10]]},"279":{"position":[[510,10]]},"288":{"position":[[134,10]]},"289":{"position":[[386,11]]},"293":{"position":[[15,11]]},"327":{"position":[[300,11]]},"328":{"position":[[250,10]]},"340":{"position":[[156,11]]},"360":{"position":[[804,11]]},"367":{"position":[[371,11]]},"369":{"position":[[636,11]]},"375":{"position":[[127,10]]},"382":{"position":[[132,11]]},"384":{"position":[[457,10]]},"407":{"position":[[317,10]]},"411":{"position":[[3970,12]]},"412":{"position":[[5587,11],[5663,10],[5836,10],[6304,12],[6365,12],[6410,11],[14649,11]]},"418":{"position":[[469,11]]},"438":{"position":[[336,10]]},"445":{"position":[[777,12],[2493,10]]},"483":{"position":[[112,12]]},"500":{"position":[[258,10]]},"502":{"position":[[1215,11]]},"504":{"position":[[1016,11]]},"516":{"position":[[368,11]]},"519":{"position":[[245,11]]},"525":{"position":[[283,10]]},"556":{"position":[[1801,11]]},"635":{"position":[[488,10]]},"707":{"position":[[213,7]]},"723":{"position":[[2752,10]]},"1123":{"position":[[22,10]]},"1125":{"position":[[361,11]]},"1132":{"position":[[512,11]]},"1304":{"position":[[104,12]]},"1305":{"position":[[567,8]]}},"keywords":{}}],["consistency.conflict",{"_index":3516,"title":{},"content":{"582":{"position":[[417,20]]}},"keywords":{}}],["consistency.lack",{"_index":3298,"title":{},"content":{"535":{"position":[[678,16]]},"595":{"position":[[699,16]]}},"keywords":{}}],["consistency.perform",{"_index":4792,"title":{},"content":{"838":{"position":[[1054,24]]}},"keywords":{}}],["consistencylevel",{"_index":6018,"title":{},"content":{"1125":{"position":[[443,17]]}},"keywords":{}}],["consistent"",{"_index":3954,"title":{},"content":{"700":{"position":[[765,17]]}},"keywords":{}}],["consol",{"_index":3858,"title":{"1151":{"position":[[26,7]]},"1178":{"position":[[26,7]]}},"content":{"675":{"position":[[77,7]]},"841":{"position":[[1305,7]]},"861":{"position":[[1135,7],[2336,7]]},"1151":{"position":[[67,7]]},"1178":{"position":[[67,7]]}},"keywords":{}}],["console.dir(alivehero",{"_index":3229,"title":{},"content":{"502":{"position":[[1100,26]]},"518":{"position":[[567,26]]}},"keywords":{}}],["console.dir(answ",{"_index":6261,"title":{},"content":{"1220":{"position":[[595,20]]}},"keywords":{}}],["console.dir(bestfriend",{"_index":4682,"title":{},"content":{"810":{"position":[[440,24]]},"811":{"position":[[435,24]]}},"keywords":{}}],["console.dir(bool",{"_index":5499,"title":{},"content":{"993":{"position":[[593,19],[730,19]]}},"keywords":{}}],["console.dir(changeev",{"_index":5325,"title":{},"content":{"941":{"position":[[144,26],[292,26],[368,26],[444,26]]},"970":{"position":[[131,26]]}},"keywords":{}}],["console.dir(currentrxdocu",{"_index":5709,"title":{},"content":{"1046":{"position":[[168,32]]}},"keywords":{}}],["console.dir(doc",{"_index":5359,"title":{},"content":{"950":{"position":[[330,18],[466,18]]},"993":{"position":[[193,18],[310,18]]}},"keywords":{}}],["console.dir(docsmap",{"_index":5363,"title":{},"content":{"951":{"position":[[412,21]]}},"keywords":{}}],["console.dir(docu",{"_index":5765,"title":{},"content":{"1065":{"position":[[296,24],[875,24],[1164,24],[1386,24],[1503,24]]}},"keywords":{}}],["console.dir(documentornul",{"_index":5607,"title":{},"content":{"1017":{"position":[[178,28]]}},"keywords":{}}],["console.dir(error",{"_index":5497,"title":{},"content":{"993":{"position":[[455,20]]}},"keywords":{}}],["console.dir(ev",{"_index":5426,"title":{},"content":{"979":{"position":[[278,19]]}},"keywords":{}}],["console.dir(friend",{"_index":4695,"title":{},"content":{"813":{"position":[[436,21]]}},"keywords":{}}],["console.dir(isnam",{"_index":5677,"title":{},"content":{"1039":{"position":[[323,20]]}},"keywords":{}}],["console.dir(json",{"_index":5373,"title":{},"content":{"952":{"position":[[346,19]]},"971":{"position":[[456,19]]},"1051":{"position":[[192,18],[462,18]]}},"keywords":{}}],["console.dir(moth",{"_index":4691,"title":{},"content":{"812":{"position":[[286,20]]}},"keywords":{}}],["console.dir(mydatabase.heroes.nam",{"_index":5832,"title":{},"content":{"1075":{"position":[[72,36]]}},"keywords":{}}],["console.dir(queryresult",{"_index":2319,"title":{},"content":{"394":{"position":[[945,25]]}},"keywords":{}}],["console.dir(result",{"_index":5737,"title":{},"content":{"1057":{"position":[[139,21]]},"1069":{"position":[[639,21],[800,21]]},"1294":{"position":[[1784,20]]}},"keywords":{}}],["console.dir(st",{"_index":4466,"title":{},"content":{"752":{"position":[[970,19]]}},"keywords":{}}],["console.dir(writeev",{"_index":3738,"title":{},"content":{"649":{"position":[[309,25]]}},"keywords":{}}],["console.error('[repl",{"_index":5225,"title":{},"content":{"898":{"position":[[4114,30]]}},"keywords":{}}],["console.error('indexeddb",{"_index":1818,"title":{},"content":{"302":{"position":[[1115,24]]}},"keywords":{}}],["console.error('p2p",{"_index":1376,"title":{},"content":{"210":{"position":[[584,18]]},"261":{"position":[[945,18]]}},"keywords":{}}],["console.error('webrtc",{"_index":5262,"title":{},"content":{"904":{"position":[[3499,21]]}},"keywords":{}}],["console.error(error",{"_index":4467,"title":{},"content":{"752":{"position":[[1009,21]]}},"keywords":{}}],["console.log",{"_index":4478,"title":{},"content":{"753":{"position":[[377,12]]}},"keywords":{}}],["console.log("receiv",{"_index":3557,"title":{},"content":{"610":{"position":[[1016,26]]}},"keywords":{}}],["console.log('al",{"_index":3706,"title":{},"content":{"632":{"position":[[1829,16]]}},"keywords":{}}],["console.log('approx",{"_index":1776,"title":{},"content":{"300":{"position":[[330,19],[388,19]]}},"keywords":{}}],["console.log('cli",{"_index":5074,"title":{},"content":{"881":{"position":[[389,19]]}},"keywords":{}}],["console.log('connect",{"_index":3571,"title":{},"content":{"611":{"position":[[711,23]]}},"keywords":{}}],["console.log('curr",{"_index":3126,"title":{},"content":{"480":{"position":[[862,22]]},"1067":{"position":[[545,22]]}},"keywords":{}}],["console.log('don",{"_index":4468,"title":{},"content":{"752":{"position":[[1050,19]]},"953":{"position":[[147,21]]},"972":{"position":[[147,21]]}},"keywords":{}}],["console.log('error",{"_index":5593,"title":{},"content":{"1010":{"position":[[323,21]]}},"keywords":{}}],["console.log('got",{"_index":979,"title":{},"content":{"77":{"position":[[318,16]]},"103":{"position":[[358,16]]},"234":{"position":[[418,16]]},"612":{"position":[[1280,16]]},"1058":{"position":[[288,16]]}},"keywords":{}}],["console.log('hero",{"_index":3429,"title":{},"content":{"562":{"position":[[695,20]]}},"keywords":{}}],["console.log('i",{"_index":5382,"title":{},"content":{"956":{"position":[[274,14],[340,14]]}},"keywords":{}}],["console.log('insert",{"_index":6514,"title":{},"content":{"1311":{"position":[[1308,19]]}},"keywords":{}}],["console.log('long",{"_index":4095,"title":{},"content":{"739":{"position":[[511,17]]}},"keywords":{}}],["console.log('messag",{"_index":3574,"title":{},"content":{"611":{"position":[[855,20]]}},"keywords":{}}],["console.log('nam",{"_index":1424,"title":{},"content":{"235":{"position":[[320,17]]},"571":{"position":[[1355,17]]},"1040":{"position":[[363,17]]}},"keywords":{}}],["console.log('repl",{"_index":4966,"title":{},"content":{"872":{"position":[[3441,24]]}},"keywords":{}}],["console.log('storag",{"_index":4495,"title":{},"content":{"759":{"position":[[952,20]]},"760":{"position":[[840,20]]}},"keywords":{}}],["console.log(`exampl",{"_index":4987,"title":{},"content":{"875":{"position":[[1216,20]]}},"keywords":{}}],["console.log(`serv",{"_index":3615,"title":{},"content":{"612":{"position":[[2506,19]]}},"keywords":{}}],["console.log(amount",{"_index":6522,"title":{},"content":{"1311":{"position":[[1790,20]]}},"keywords":{}}],["console.log(attachment.scream",{"_index":4613,"title":{},"content":{"792":{"position":[[420,33]]}},"keywords":{}}],["console.log(collections.hero",{"_index":5323,"title":{},"content":{"939":{"position":[[240,30]]}},"keywords":{}}],["console.log(dist",{"_index":2299,"title":{},"content":{"393":{"position":[[1033,22]]}},"keywords":{}}],["console.log(doc.myfield",{"_index":4562,"title":{},"content":{"770":{"position":[[494,25]]}},"keywords":{}}],["console.log(doc.scream",{"_index":4606,"title":{},"content":{"791":{"position":[[179,26]]}},"keywords":{}}],["console.log(doc.whoami",{"_index":4609,"title":{},"content":{"791":{"position":[[499,26]]}},"keywords":{}}],["console.log(docafteredit",{"_index":5706,"title":{},"content":{"1045":{"position":[[227,24]]}},"keywords":{}}],["console.log(fetcheddoc.secretfield",{"_index":3358,"title":{},"content":{"555":{"position":[[549,36]]}},"keywords":{}}],["console.log(hero.firstnam",{"_index":6519,"title":{},"content":{"1311":{"position":[[1605,28]]}},"keywords":{}}],["console.log(heroes.scream",{"_index":4601,"title":{},"content":{"789":{"position":[[280,29]]}},"keywords":{}}],["console.log(heroes.whoami",{"_index":4604,"title":{},"content":{"789":{"position":[[528,29]]}},"keywords":{}}],["console.log(lastst",{"_index":5717,"title":{},"content":{"1049":{"position":[[164,23],[224,23]]}},"keywords":{}}],["console.log(mydocument.delet",{"_index":5718,"title":{},"content":{"1050":{"position":[[49,32],[118,32]]}},"keywords":{}}],["console.log(mydocument.nam",{"_index":5694,"title":{},"content":{"1042":{"position":[[266,29]]},"1043":{"position":[[170,29]]}},"keywords":{}}],["console.log(myendpoint.urlpath",{"_index":5932,"title":{},"content":{"1100":{"position":[[738,31]]}},"keywords":{}}],["console.log(result.foobar",{"_index":2930,"title":{},"content":{"439":{"position":[[779,27]]}},"keywords":{}}],["console.log.bind(consol",{"_index":6372,"title":{},"content":{"1282":{"position":[[873,25]]}},"keywords":{}}],["console.tim",{"_index":4118,"title":{},"content":{"746":{"position":[[512,14]]}},"keywords":{}}],["console.time()/console.timeend",{"_index":4116,"title":{},"content":{"746":{"position":[[71,32]]}},"keywords":{}}],["console.timeend",{"_index":4119,"title":{},"content":{"746":{"position":[[531,17]]}},"keywords":{}}],["console.warn",{"_index":3857,"title":{},"content":{"675":{"position":[[47,14]]}},"keywords":{}}],["console.warn('indexeddb",{"_index":1813,"title":{},"content":{"302":{"position":[[895,23]]}},"keywords":{}}],["consolid",{"_index":2666,"title":{},"content":{"412":{"position":[[1691,11]]}},"keywords":{}}],["const",{"_index":32,"title":{},"content":{"1":{"position":[[513,5]]},"2":{"position":[[280,5],[316,5]]},"3":{"position":[[196,5]]},"4":{"position":[[374,5]]},"5":{"position":[[284,5]]},"6":{"position":[[439,5],[479,5],[658,5]]},"7":{"position":[[316,5],[493,5]]},"8":{"position":[[954,5],[1085,5]]},"9":{"position":[[230,5]]},"10":{"position":[[213,5],[268,5]]},"11":{"position":[[794,5]]},"19":{"position":[[639,5],[811,5]]},"51":{"position":[[255,5],[682,5]]},"52":{"position":[[321,5],[367,5],[461,5],[608,5]]},"55":{"position":[[850,5],[1077,5]]},"77":{"position":[[198,5],[267,5]]},"103":{"position":[[238,5],[307,5]]},"188":{"position":[[953,5]]},"209":{"position":[[225,5],[786,5],[1080,5]]},"210":{"position":[[245,5]]},"211":{"position":[[195,5]]},"234":{"position":[[298,5],[367,5]]},"255":{"position":[[572,5],[1141,5],[1404,5]]},"258":{"position":[[133,5]]},"261":{"position":[[313,5]]},"266":{"position":[[647,5]]},"276":{"position":[[376,5]]},"300":{"position":[[217,5],[267,5],[299,5]]},"302":{"position":[[685,5],[739,5]]},"303":{"position":[[516,5],[785,5]]},"314":{"position":[[458,5]]},"315":{"position":[[418,5],[521,5]]},"334":{"position":[[316,5]]},"335":{"position":[[185,5],[627,5],[666,5]]},"361":{"position":[[513,5],[782,5]]},"367":{"position":[[694,5]]},"391":{"position":[[483,5],[606,5],[638,5]]},"392":{"position":[[326,5],[731,5],[916,5],[971,5],[1023,5],[1060,5],[1733,5],[2612,5],[2825,5],[3576,5],[3841,5],[4219,5],[4294,5],[4518,5],[4782,5]]},"393":{"position":[[973,5]]},"394":{"position":[[588,5],[625,5],[684,5],[741,5],[856,5]]},"397":{"position":[[466,5],[521,5],[1676,5],[1737,5],[1866,5],[1914,5],[2080,5]]},"398":{"position":[[751,5],[781,5],[894,5],[972,5],[1441,5],[1505,5],[1612,5],[2020,5],[2049,5],[2180,5],[2258,5],[2305,5],[2594,5],[2658,5],[2765,5]]},"403":{"position":[[470,5],[827,5]]},"412":{"position":[[4488,5]]},"425":{"position":[[355,5]]},"426":{"position":[[293,5],[481,5]]},"439":{"position":[[722,5]]},"459":{"position":[[573,5],[617,5],[677,5],[734,5],[781,5],[821,5]]},"480":{"position":[[351,5]]},"482":{"position":[[458,5],[596,5]]},"494":{"position":[[272,5]]},"522":{"position":[[397,5]]},"523":{"position":[[327,5],[377,5],[446,5]]},"538":{"position":[[412,5],[556,5]]},"539":{"position":[[321,5],[367,5],[461,5],[608,5]]},"541":{"position":[[253,5],[346,5],[379,5]]},"542":{"position":[[511,5],[781,5]]},"554":{"position":[[900,5],[1035,5]]},"555":{"position":[[190,5],[257,5],[449,5]]},"556":{"position":[[375,5],[792,5],[891,5]]},"559":{"position":[[270,5],[322,5]]},"562":{"position":[[150,5],[264,5],[646,5],[1124,5],[1187,5],[1286,5]]},"563":{"position":[[462,5],[669,5],[699,5]]},"564":{"position":[[426,5],[566,5]]},"571":{"position":[[1102,5]]},"579":{"position":[[325,5]]},"580":{"position":[[374,5]]},"598":{"position":[[419,5],[563,5]]},"599":{"position":[[348,5],[394,5],[488,5],[635,5]]},"601":{"position":[[446,5],[510,5],[567,5]]},"602":{"position":[[219,5]]},"611":{"position":[[627,5]]},"612":{"position":[[1134,5],[1779,5],[1802,5],[1998,5],[2083,5],[2204,5],[2246,5]]},"632":{"position":[[1271,5]]},"638":{"position":[[310,5],[413,5]]},"647":{"position":[[151,5],[377,5],[517,5]]},"648":{"position":[[93,5],[226,5]]},"649":{"position":[[92,5],[182,5],[236,5]]},"653":{"position":[[236,5]]},"659":{"position":[[556,5]]},"661":{"position":[[1086,5],[1140,5]]},"662":{"position":[[1805,5],[2099,5],[2306,5],[2663,5]]},"672":{"position":[[184,5]]},"673":{"position":[[190,5]]},"674":{"position":[[473,5]]},"678":{"position":[[228,5]]},"680":{"position":[[649,5],[792,5],[1212,5]]},"691":{"position":[[210,5]]},"693":{"position":[[713,5],[782,5],[1016,5],[1086,5],[1157,5]]},"710":{"position":[[1678,5],[1795,5],[1970,5]]},"711":{"position":[[1102,5],[1138,5],[1724,5]]},"717":{"position":[[770,5],[1138,5],[1403,5]]},"718":{"position":[[343,5],[453,5],[641,5]]},"720":{"position":[[118,5]]},"724":{"position":[[504,5],[1607,5],[1789,5]]},"734":{"position":[[280,5],[463,5],[594,5]]},"739":{"position":[[267,5],[614,5]]},"740":{"position":[[499,5]]},"745":{"position":[[378,5],[512,5]]},"746":{"position":[[266,5]]},"747":{"position":[[83,5]]},"751":{"position":[[1272,5],[1413,5]]},"752":{"position":[[345,5],[644,5],[842,5],[1398,5]]},"753":{"position":[[230,5]]},"754":{"position":[[229,5]]},"759":{"position":[[343,5]]},"770":{"position":[[445,5]]},"772":{"position":[[753,5],[997,5],[1588,5],[2170,5],[2350,5]]},"773":{"position":[[543,5]]},"774":{"position":[[645,5]]},"789":{"position":[[145,5],[392,5]]},"791":{"position":[[1,5],[136,5],[260,5],[456,5]]},"792":{"position":[[128,5],[267,5],[310,5]]},"796":{"position":[[416,5],[838,5],[1132,5]]},"797":{"position":[[235,5]]},"798":{"position":[[528,5]]},"799":{"position":[[556,5],[666,5],[788,5]]},"800":{"position":[[789,5],[848,5]]},"806":{"position":[[558,5]]},"808":{"position":[[118,5],[493,5]]},"810":{"position":[[329,5],[387,5]]},"811":{"position":[[309,5],[367,5]]},"812":{"position":[[1,5],[238,5]]},"813":{"position":[[1,5],[333,5],[393,5]]},"818":{"position":[[468,5]]},"820":{"position":[[143,5]]},"825":{"position":[[318,5]]},"826":{"position":[[431,5],[493,5],[586,5],[682,5],[794,5],[892,5],[1013,5],[1097,5]]},"829":{"position":[[622,5],[1392,5],[1415,5],[1480,5],[1512,5],[1947,5],[2366,5],[2456,5],[2485,5],[3282,5],[3372,5],[3400,5]]},"835":{"position":[[485,5]]},"836":{"position":[[672,5]]},"837":{"position":[[1835,5],[2094,5]]},"838":{"position":[[2177,5],[2520,5],[2877,5]]},"846":{"position":[[117,5]]},"848":{"position":[[178,5],[279,5],[634,5],[1269,5]]},"851":{"position":[[285,5]]},"852":{"position":[[152,5]]},"854":{"position":[[197,5],[232,5],[348,5],[393,5],[575,5]]},"857":{"position":[[275,5]]},"858":{"position":[[157,5]]},"862":{"position":[[522,5],[612,5],[866,5],[956,5],[1109,5]]},"866":{"position":[[407,5]]},"872":{"position":[[884,5],[973,5],[1696,5],[2349,5],[3239,5],[3350,5],[3954,5],[4435,5]]},"875":{"position":[[393,5],[868,5],[935,5],[988,5],[1044,5],[1110,5],[2106,5],[2131,5],[2182,5],[2616,5],[3069,5],[3186,5],[3255,5],[3311,5],[3428,5],[4403,5],[4474,5],[4503,5],[4525,5],[4631,5],[6113,5],[6213,5],[6405,5],[7381,5],[8071,5],[8108,5],[8243,5],[8378,5],[9490,5],[9527,5],[9687,5]]},"878":{"position":[[254,5]]},"882":{"position":[[371,5]]},"885":{"position":[[1460,5],[1504,5],[1561,5],[1681,5],[1996,5],[2349,5],[2462,5],[2515,5]]},"886":{"position":[[363,5],[560,5],[985,5],[2271,5],[2309,5],[2452,5],[2617,5],[3460,5],[3509,5],[3804,5]]},"887":{"position":[[226,5]]},"888":{"position":[[367,5],[1021,5]]},"889":{"position":[[416,5]]},"892":{"position":[[152,5],[236,5]]},"893":{"position":[[197,5]]},"898":{"position":[[2304,5],[3035,5],[3302,5]]},"904":{"position":[[697,5],[1781,5]]},"906":{"position":[[968,5]]},"907":{"position":[[257,5]]},"910":{"position":[[211,5]]},"911":{"position":[[602,5]]},"916":{"position":[[125,5],[311,5]]},"917":{"position":[[116,5]]},"918":{"position":[[79,5]]},"919":{"position":[[86,5]]},"920":{"position":[[57,5]]},"921":{"position":[[156,5]]},"929":{"position":[[69,5]]},"930":{"position":[[74,5],[130,5]]},"931":{"position":[[74,5],[130,5]]},"932":{"position":[[68,5],[130,5],[908,5],[1026,5],[1177,5]]},"934":{"position":[[203,5]]},"939":{"position":[[130,5],[209,5]]},"942":{"position":[[170,5]]},"943":{"position":[[367,5]]},"944":{"position":[[177,5]]},"945":{"position":[[118,5],[439,5]]},"946":{"position":[[142,5]]},"947":{"position":[[153,5]]},"948":{"position":[[374,5]]},"949":{"position":[[112,5]]},"951":{"position":[[318,5],[361,5]]},"957":{"position":[[89,5]]},"960":{"position":[[265,5]]},"962":{"position":[[736,5],[947,5]]},"966":{"position":[[519,5],[637,5]]},"967":{"position":[[104,5],[222,5]]},"968":{"position":[[490,5]]},"978":{"position":[[124,5]]},"979":{"position":[[218,5]]},"986":{"position":[[724,5]]},"988":{"position":[[217,5],[2497,5],[2829,5],[3558,5],[3690,5],[3807,5],[5065,5],[5200,5]]},"995":{"position":[[1842,5]]},"1002":{"position":[[514,5],[979,5],[1168,5]]},"1003":{"position":[[360,5]]},"1007":{"position":[[1155,5],[1303,5],[1352,5],[1505,5],[1663,5],[1836,5]]},"1013":{"position":[[273,5]]},"1014":{"position":[[177,5],[318,5]]},"1015":{"position":[[153,5]]},"1016":{"position":[[112,5]]},"1017":{"position":[[91,5]]},"1018":{"position":[[54,5],[125,5],[463,5],[502,5],[774,5],[937,5]]},"1020":{"position":[[333,5],[575,6]]},"1022":{"position":[[429,5],[591,6],[987,5]]},"1023":{"position":[[88,5],[247,6],[400,5],[651,5]]},"1024":{"position":[[182,5],[333,6],[355,5],[427,5]]},"1033":{"position":[[475,5],[605,5]]},"1036":{"position":[[102,5]]},"1038":{"position":[[128,5],[191,5]]},"1042":{"position":[[105,5]]},"1045":{"position":[[52,5],[116,5],[185,5]]},"1051":{"position":[[158,5],[424,5]]},"1052":{"position":[[176,5]]},"1053":{"position":[[87,5]]},"1055":{"position":[[176,5]]},"1056":{"position":[[84,5],[180,5],[300,5]]},"1057":{"position":[[68,5],[103,5],[425,5],[588,5]]},"1058":{"position":[[202,5],[237,5]]},"1059":{"position":[[212,5]]},"1060":{"position":[[80,5]]},"1061":{"position":[[81,5]]},"1062":{"position":[[137,5],[250,5]]},"1063":{"position":[[61,5]]},"1064":{"position":[[290,5],[345,5]]},"1066":{"position":[[334,5]]},"1067":{"position":[[276,5],[432,5],[1270,5],[1537,5],[1940,5],[2035,5],[2093,5],[2354,5]]},"1069":{"position":[[448,5],[597,5],[704,5],[754,5]]},"1070":{"position":[[84,5]]},"1072":{"position":[[2333,5],[2450,5],[2628,5]]},"1078":{"position":[[108,5],[1010,5],[1108,5]]},"1080":{"position":[[1,5]]},"1082":{"position":[[141,5]]},"1083":{"position":[[343,5]]},"1090":{"position":[[755,5],[998,5]]},"1097":{"position":[[682,5]]},"1098":{"position":[[318,5]]},"1099":{"position":[[292,5]]},"1100":{"position":[[631,5]]},"1101":{"position":[[445,5],[627,5]]},"1102":{"position":[[319,5],[457,5],[679,5],[917,5],[1010,5]]},"1103":{"position":[[178,5],[282,5]]},"1105":{"position":[[708,5]]},"1106":{"position":[[646,5]]},"1108":{"position":[[376,5]]},"1109":{"position":[[165,5]]},"1114":{"position":[[688,5],[816,5],[912,5]]},"1116":{"position":[[333,5],[383,5],[419,5],[471,5],[518,5],[587,5],[638,5]]},"1117":{"position":[[309,5],[353,5]]},"1118":{"position":[[470,5],[622,5],[749,5],[792,5],[835,5]]},"1121":{"position":[[428,5],[529,5],[572,5]]},"1125":{"position":[[260,5]]},"1126":{"position":[[350,5],[663,5]]},"1130":{"position":[[133,5]]},"1134":{"position":[[120,5]]},"1138":{"position":[[264,5]]},"1139":{"position":[[403,5],[452,5],[519,5]]},"1140":{"position":[[578,5],[699,5]]},"1144":{"position":[[168,5]]},"1145":{"position":[[392,5],[441,5],[508,5]]},"1146":{"position":[[213,5]]},"1148":{"position":[[737,5],[1107,5]]},"1149":{"position":[[900,5],[1280,5]]},"1154":{"position":[[455,5],[722,5]]},"1158":{"position":[[176,5],[655,5]]},"1159":{"position":[[362,5]]},"1163":{"position":[[278,5],[384,5],[522,5]]},"1164":{"position":[[118,5]]},"1165":{"position":[[288,5],[335,5],[444,5],[700,5],[1038,5]]},"1168":{"position":[[124,5]]},"1172":{"position":[[196,5],[289,5]]},"1177":{"position":[[228,5],[284,5]]},"1182":{"position":[[278,5],[388,5],[526,5]]},"1184":{"position":[[634,5],[765,5]]},"1185":{"position":[[294,5]]},"1186":{"position":[[252,5]]},"1189":{"position":[[377,5]]},"1201":{"position":[[164,5]]},"1204":{"position":[[293,5]]},"1208":{"position":[[702,5],[781,5],[909,5],[1050,5],[1210,5],[1304,5],[1350,5],[1409,5],[1716,5]]},"1210":{"position":[[398,5]]},"1211":{"position":[[653,5]]},"1212":{"position":[[442,5]]},"1213":{"position":[[662,5]]},"1218":{"position":[[351,5],[549,5]]},"1219":{"position":[[480,5],[651,5],[862,5]]},"1220":{"position":[[159,5],[456,5],[535,5]]},"1222":{"position":[[229,5],[530,5],[1369,5]]},"1226":{"position":[[194,5]]},"1227":{"position":[[672,5]]},"1231":{"position":[[776,5],[1003,5],[1140,5]]},"1237":{"position":[[814,5]]},"1238":{"position":[[789,5]]},"1239":{"position":[[759,5]]},"1249":{"position":[[467,5]]},"1264":{"position":[[116,5]]},"1265":{"position":[[660,5]]},"1266":{"position":[[165,5],[195,5],[250,5],[370,5],[443,5]]},"1267":{"position":[[467,5],[591,5],[685,5]]},"1268":{"position":[[418,5]]},"1271":{"position":[[1405,5],[1543,5]]},"1274":{"position":[[294,5]]},"1275":{"position":[[305,5]]},"1276":{"position":[[820,5],[867,5],[907,5]]},"1277":{"position":[[354,5],[858,5]]},"1278":{"position":[[431,5],[883,5]]},"1279":{"position":[[627,5],[681,5]]},"1280":{"position":[[416,5]]},"1282":{"position":[[751,5],[1122,5]]},"1286":{"position":[[389,5],[473,5]]},"1287":{"position":[[435,5],[523,5]]},"1288":{"position":[[395,5],[489,5]]},"1290":{"position":[[53,5]]},"1294":{"position":[[765,5],[801,5],[891,5],[932,5],[1167,5],[1448,5],[1594,5]]},"1296":{"position":[[796,5],[1344,5],[1453,5]]},"1309":{"position":[[491,5],[1366,5]]},"1311":{"position":[[101,5],[240,5],[621,5],[779,5],[892,5],[1453,5],[1722,5]]},"1315":{"position":[[548,5],[633,5]]}},"keywords":{}}],["constant",{"_index":710,"title":{},"content":{"46":{"position":[[335,8]]},"273":{"position":[[199,8]]},"410":{"position":[[1560,8]]},"414":{"position":[[378,8]]}},"keywords":{}}],["constantli",{"_index":1924,"title":{},"content":{"323":{"position":[[483,10]]},"481":{"position":[[845,10]]}},"keywords":{}}],["constel",{"_index":384,"title":{},"content":{"23":{"position":[[216,13]]}},"keywords":{}}],["constrain",{"_index":2545,"title":{},"content":{"408":{"position":[[2354,11]]}},"keywords":{}}],["constraint",{"_index":865,"title":{},"content":{"58":{"position":[[67,12]]},"228":{"position":[[251,11]]},"252":{"position":[[48,11]]},"262":{"position":[[351,11]]},"276":{"position":[[100,11]]},"304":{"position":[[217,11]]},"354":{"position":[[447,12],[484,11],[525,12],[1101,11],[1464,12]]},"362":{"position":[[294,12]]},"382":{"position":[[157,11]]},"412":{"position":[[9664,11]]},"460":{"position":[[810,12]]},"495":{"position":[[846,11]]},"699":{"position":[[1003,10]]},"796":{"position":[[809,10]]},"1157":{"position":[[78,12]]}},"keywords":{}}],["construct",{"_index":2842,"title":{},"content":{"420":{"position":[[1269,13]]},"770":{"position":[[46,12]]},"886":{"position":[[308,9]]},"1257":{"position":[[184,10]]}},"keywords":{}}],["constructor",{"_index":1094,"title":{},"content":{"130":{"position":[[363,12]]},"1226":{"position":[[370,11]]},"1264":{"position":[[280,11]]}},"keywords":{}}],["constructor(priv",{"_index":814,"title":{},"content":{"54":{"position":[[60,19]]}},"keywords":{}}],["consult",{"_index":3656,"title":{},"content":{"619":{"position":[[6,10]]},"730":{"position":[[209,7]]},"793":{"position":[[1485,10]]},"885":{"position":[[2706,7]]}},"keywords":{}}],["consum",{"_index":1716,"title":{},"content":{"298":{"position":[[408,9]]},"408":{"position":[[2994,7]]},"430":{"position":[[480,7]]},"622":{"position":[[522,8]]},"670":{"position":[[218,9]]},"693":{"position":[[199,7]]},"708":{"position":[[353,8]]},"829":{"position":[[447,7]]},"871":{"position":[[349,8]]},"1246":{"position":[[2225,7]]}},"keywords":{}}],["consumpt",{"_index":2584,"title":{},"content":{"409":{"position":[[109,12]]}},"keywords":{}}],["contact",{"_index":4630,"title":{},"content":{"793":{"position":[[1477,7]]}},"keywords":{}}],["contain",{"_index":580,"title":{},"content":{"37":{"position":[[117,8]]},"269":{"position":[[235,9]]},"390":{"position":[[1291,7]]},"397":{"position":[[411,8]]},"452":{"position":[[670,8]]},"543":{"position":[[126,8]]},"571":{"position":[[601,8]]},"603":{"position":[[124,8]]},"698":{"position":[[1136,8],[1339,8]]},"724":{"position":[[1579,8]]},"732":{"position":[[84,8]]},"749":{"position":[[359,7],[826,8],[3674,7],[6524,8],[11707,7],[11804,7],[13081,8],[18621,7],[18746,7],[23382,7]]},"789":{"position":[[92,8]]},"805":{"position":[[25,8]]},"816":{"position":[[126,8]]},"854":{"position":[[1409,8]]},"861":{"position":[[480,10]]},"875":{"position":[[3813,8],[7993,7]]},"886":{"position":[[1540,8]]},"887":{"position":[[125,8]]},"888":{"position":[[839,8]]},"889":{"position":[[275,8]]},"904":{"position":[[2865,7],[3011,7],[3281,8]]},"982":{"position":[[80,8]]},"983":{"position":[[610,8]]},"984":{"position":[[408,7]]},"985":{"position":[[212,8]]},"986":{"position":[[863,8]]},"988":{"position":[[2009,8],[2704,8],[3325,7],[3873,8],[4654,7]]},"990":{"position":[[796,7],[843,8],[882,7]]},"1004":{"position":[[283,7],[320,9],[688,7]]},"1023":{"position":[[611,7]]},"1074":{"position":[[540,7]]},"1077":{"position":[[22,8]]},"1092":{"position":[[176,8]]},"1104":{"position":[[414,7],[522,8]]},"1106":{"position":[[448,8]]},"1116":{"position":[[92,8]]},"1189":{"position":[[228,8]]},"1208":{"position":[[237,8]]},"1219":{"position":[[27,8]]},"1226":{"position":[[299,8]]},"1227":{"position":[[37,10],[69,8]]},"1237":{"position":[[355,7]]},"1264":{"position":[[215,8]]},"1265":{"position":[[30,10],[62,8]]},"1268":{"position":[[366,8]]},"1271":{"position":[[133,8],[579,8],[633,8]]},"1276":{"position":[[616,8]]},"1282":{"position":[[33,7]]},"1290":{"position":[[173,7]]},"1291":{"position":[[171,7]]},"1294":{"position":[[485,8]]},"1296":{"position":[[667,8]]},"1305":{"position":[[760,7]]},"1313":{"position":[[82,9]]},"1319":{"position":[[219,10],[389,10]]},"1322":{"position":[[472,7]]}},"keywords":{}}],["contemporari",{"_index":2914,"title":{},"content":{"434":{"position":[[399,12]]}},"keywords":{}}],["content",{"_index":1191,"title":{},"content":{"167":{"position":[[125,9]]},"211":{"position":[[487,8]]},"270":{"position":[[157,8]]},"314":{"position":[[819,8]]},"392":{"position":[[516,8]]},"421":{"position":[[88,8]]},"433":{"position":[[213,8]]},"500":{"position":[[662,7]]},"556":{"position":[[989,9]]},"612":{"position":[[1466,7],[1900,8]]},"626":{"position":[[225,7]]},"714":{"position":[[772,8],[828,8]]},"875":{"position":[[6330,8],[7284,8]]},"912":{"position":[[571,7]]},"988":{"position":[[2625,8]]},"1102":{"position":[[598,8]]},"1287":{"position":[[136,7]]}},"keywords":{}}],["contentasstr",{"_index":6215,"title":{},"content":{"1208":{"position":[[1415,15]]}},"keywords":{}}],["contention.effici",{"_index":2145,"title":{},"content":{"376":{"position":[[432,20]]}},"keywords":{}}],["context",{"_index":210,"title":{},"content":{"14":{"position":[[352,8]]},"173":{"position":[[8,7]]},"346":{"position":[[392,8]]},"439":{"position":[[119,7]]},"460":{"position":[[859,7]]},"570":{"position":[[210,7]]},"571":{"position":[[8,7]]},"618":{"position":[[8,7]]},"640":{"position":[[556,8]]},"749":{"position":[[24111,8]]},"829":{"position":[[1003,8]]},"901":{"position":[[691,9]]},"1214":{"position":[[177,9],[210,7],[234,8],[291,8],[619,8]]},"1301":{"position":[[724,9]]}},"keywords":{}}],["contextu",{"_index":3906,"title":{},"content":{"690":{"position":[[112,10]]},"723":{"position":[[2172,10]]}},"keywords":{}}],["continu",{"_index":706,"title":{},"content":{"46":{"position":[[161,8]]},"61":{"position":[[1,8]]},"65":{"position":[[610,8]]},"157":{"position":[[287,8]]},"164":{"position":[[179,8]]},"170":{"position":[[577,8]]},"173":{"position":[[1490,8]]},"208":{"position":[[265,12]]},"215":{"position":[[189,8]]},"255":{"position":[[280,10]]},"292":{"position":[[380,9]]},"309":{"position":[[215,10]]},"320":{"position":[[178,8]]},"327":{"position":[[113,9]]},"338":{"position":[[105,8]]},"375":{"position":[[217,8],[650,10]]},"380":{"position":[[144,8]]},"410":{"position":[[1012,8]]},"411":{"position":[[443,10]]},"419":{"position":[[249,8]]},"446":{"position":[[215,8]]},"464":{"position":[[1360,8]]},"483":{"position":[[528,8]]},"486":{"position":[[252,8]]},"489":{"position":[[649,9]]},"491":{"position":[[274,12]]},"510":{"position":[[85,8],[462,9]]},"530":{"position":[[587,9]]},"574":{"position":[[224,8]]},"582":{"position":[[657,10]]},"624":{"position":[[727,10]]},"630":{"position":[[670,8]]},"632":{"position":[[2598,12]]},"647":{"position":[[86,8]]},"724":{"position":[[598,8]]},"824":{"position":[[324,8],[503,9]]},"965":{"position":[[194,13]]},"981":{"position":[[1319,8]]},"1003":{"position":[[21,9]]},"1294":{"position":[[714,8],[1265,8]]},"1319":{"position":[[756,9]]}},"keywords":{}}],["contrari",{"_index":2897,"title":{},"content":{"429":{"position":[[1,8]]}},"keywords":{}}],["contrast",{"_index":587,"title":{},"content":{"38":{"position":[[151,8]]},"99":{"position":[[256,9]]},"100":{"position":[[153,9]]},"226":{"position":[[205,9]]},"265":{"position":[[719,9]]},"351":{"position":[[130,9]]},"412":{"position":[[8786,8]]},"439":{"position":[[337,8]]},"521":{"position":[[349,9]]},"535":{"position":[[1233,9]]},"571":{"position":[[509,8]]},"630":{"position":[[203,9]]},"851":{"position":[[4,8]]},"903":{"position":[[115,9]]},"981":{"position":[[4,8]]},"1065":{"position":[[1932,8]]},"1192":{"position":[[235,9]]}},"keywords":{}}],["contribut",{"_index":3255,"title":{"665":{"position":[[0,12]]}},"content":{"517":{"position":[[341,12]]},"669":{"position":[[28,13]]},"670":{"position":[[606,13]]}},"keywords":{}}],["contributor",{"_index":2174,"title":{},"content":{"387":{"position":[[281,12]]}},"keywords":{}}],["control",{"_index":971,"title":{},"content":{"75":{"position":[[86,7]]},"97":{"position":[[121,7]]},"263":{"position":[[333,7]]},"407":{"position":[[758,7],[1160,7]]},"410":{"position":[[490,7],[629,7]]},"411":{"position":[[5327,7]]},"412":{"position":[[12071,8],[12857,8],[15178,7]]},"417":{"position":[[80,7]]},"418":{"position":[[319,7]]},"551":{"position":[[406,8]]},"569":{"position":[[267,8],[873,11]]},"612":{"position":[[1944,9]]},"621":{"position":[[873,8]]},"635":{"position":[[338,7]]},"690":{"position":[[62,7],[615,8]]},"860":{"position":[[968,9]]},"861":{"position":[[2269,7]]},"875":{"position":[[7356,9]]},"912":{"position":[[656,7]]},"1009":{"position":[[830,7]]},"1147":{"position":[[309,7]]},"1206":{"position":[[289,7]]},"1305":{"position":[[422,8]]}},"keywords":{}}],["conveni",{"_index":643,"title":{},"content":{"40":{"position":[[833,11]]},"130":{"position":[[45,10]]},"247":{"position":[[14,10]]},"371":{"position":[[68,10]]},"402":{"position":[[2041,10]]},"424":{"position":[[387,10]]},"427":{"position":[[13,12]]},"430":{"position":[[27,12]]},"559":{"position":[[1005,10]]},"693":{"position":[[254,10]]}},"keywords":{}}],["converg",{"_index":2517,"title":{},"content":{"407":{"position":[[303,8]]},"411":{"position":[[4750,9]]},"700":{"position":[[362,9]]}},"keywords":{}}],["convers",{"_index":3474,"title":{},"content":{"572":{"position":[[88,12]]}},"keywords":{}}],["convert",{"_index":829,"title":{},"content":{"55":{"position":[[114,7]]},"397":{"position":[[181,7],[1554,9]]}},"keywords":{}}],["cooki",{"_index":1766,"title":{"434":{"position":[[16,8]]},"448":{"position":[[31,7]]},"450":{"position":[[9,8]]}},"content":{"299":{"position":[[1731,6]]},"408":{"position":[[330,7]]},"434":{"position":[[1,8],[250,7],[342,7]]},"450":{"position":[[1,7],[52,7],[173,7],[273,7],[310,7],[454,6],[498,6],[574,7]]},"460":{"position":[[1040,8]]},"461":{"position":[[1,7],[75,7],[189,6],[268,7],[516,7],[573,7]]},"462":{"position":[[893,9]]},"463":{"position":[[255,7]]},"696":{"position":[[822,8],[876,7]]},"793":{"position":[[1367,7]]},"890":{"position":[[375,8],[483,7],[625,7]]}},"keywords":{}}],["cookiescannot",{"_index":3009,"title":{},"content":{"460":{"position":[[724,13]]}},"keywords":{}}],["cookiestor",{"_index":2955,"title":{},"content":{"450":{"position":[[796,11]]}},"keywords":{}}],["coordin",{"_index":1392,"title":{},"content":{"212":{"position":[[658,12]]},"303":{"position":[[1267,11]]},"751":{"position":[[1278,11]]},"964":{"position":[[574,12]]},"1007":{"position":[[152,12]]}},"keywords":{}}],["copi",{"_index":2516,"title":{},"content":{"407":{"position":[[38,4]]},"411":{"position":[[4117,4]]},"412":{"position":[[4291,4],[5718,4]]},"417":{"position":[[36,4]]},"775":{"position":[[306,6],[497,4]]},"1210":{"position":[[577,4]]},"1227":{"position":[[342,4],[795,6]]},"1265":{"position":[[335,4],[777,6]]}},"keywords":{}}],["cor",{"_index":4964,"title":{"1103":{"position":[[0,5]]}},"content":{"872":{"position":[[3336,5]]},"1103":{"position":[[63,4],[85,4],[114,5],[241,5],[390,5]]}},"keywords":{}}],["cordova",{"_index":140,"title":{"11":{"position":[[0,7]]}},"content":{"10":{"position":[[409,7]]},"11":{"position":[[65,7],[120,7],[182,7],[884,8],[977,7]]},"661":{"position":[[308,7]]},"964":{"position":[[474,7]]},"1247":{"position":[[108,7]]}},"keywords":{}}],["cordova'",{"_index":143,"title":{},"content":{"11":{"position":[[6,9]]}},"keywords":{}}],["cordova.sqliteplugin",{"_index":145,"title":{},"content":{"11":{"position":[[23,21]]}},"keywords":{}}],["core",{"_index":1077,"title":{},"content":{"121":{"position":[[8,4]]},"180":{"position":[[84,4]]},"187":{"position":[[28,4]]},"207":{"position":[[15,4]]},"273":{"position":[[8,5]]},"362":{"position":[[1035,4]]},"379":{"position":[[8,4]]},"387":{"position":[[349,4]]},"392":{"position":[[3722,4],[3836,4],[4697,4],[5219,6]]},"419":{"position":[[430,4]]},"490":{"position":[[8,4]]},"513":{"position":[[249,4]]},"542":{"position":[[230,4]]},"574":{"position":[[37,4]]},"662":{"position":[[1898,4],[2059,4]]},"732":{"position":[[102,5]]},"761":{"position":[[96,4]]},"793":{"position":[[83,4]]},"831":{"position":[[125,4]]},"837":{"position":[[106,4],[1569,6]]},"838":{"position":[[2038,4]]},"899":{"position":[[38,4]]},"960":{"position":[[81,4]]},"1097":{"position":[[463,4]]},"1181":{"position":[[897,4]]},"1198":{"position":[[2336,4]]},"1271":{"position":[[124,5]]},"1292":{"position":[[157,4]]}},"keywords":{}}],["core(tm",{"_index":6400,"title":{},"content":{"1292":{"position":[[180,8]]}},"keywords":{}}],["corner",{"_index":4111,"title":{},"content":{"742":{"position":[[87,7]]}},"keywords":{}}],["cornerston",{"_index":3224,"title":{},"content":{"502":{"position":[[246,11]]},"517":{"position":[[23,11]]}},"keywords":{}}],["corpor",{"_index":1730,"title":{},"content":{"298":{"position":[[807,9]]},"624":{"position":[[291,9]]}},"keywords":{}}],["correct",{"_index":3715,"title":{"1120":{"position":[[0,11]]}},"content":{"638":{"position":[[923,7]]},"656":{"position":[[446,7]]},"698":{"position":[[271,7]]},"708":{"position":[[198,7],[440,7]]},"749":{"position":[[16570,7]]},"875":{"position":[[3005,7],[3968,7]]},"1030":{"position":[[254,7]]},"1097":{"position":[[514,7]]},"1115":{"position":[[554,7],[754,7]]},"1120":{"position":[[26,12]]},"1228":{"position":[[237,7]]},"1251":{"position":[[293,11]]},"1271":{"position":[[821,7]]},"1300":{"position":[[529,7]]},"1315":{"position":[[1483,7]]}},"keywords":{}}],["correctli",{"_index":754,"title":{"1029":{"position":[[17,10]]}},"content":{"50":{"position":[[346,10]]},"394":{"position":[[48,9]]},"687":{"position":[[171,9]]},"779":{"position":[[94,10]]},"1316":{"position":[[1861,10]]}},"keywords":{}}],["correctly.link",{"_index":1091,"title":{},"content":{"129":{"position":[[659,14]]}},"keywords":{}}],["correspond",{"_index":2356,"title":{},"content":{"397":{"position":[[437,13]]},"778":{"position":[[94,10]]},"805":{"position":[[159,13]]},"806":{"position":[[364,13]]},"832":{"position":[[250,13]]}},"keywords":{}}],["corrupt",{"_index":1799,"title":{},"content":{"302":{"position":[[320,11]]},"358":{"position":[[637,9]]},"382":{"position":[[385,10]]}},"keywords":{}}],["cosin",{"_index":2292,"title":{},"content":{"393":{"position":[[253,6]]}},"keywords":{}}],["cost",{"_index":1314,"title":{"204":{"position":[[15,5]]},"251":{"position":[[17,6]]},"295":{"position":[[0,4]]}},"content":{"251":{"position":[[295,6]]},"263":{"position":[[305,6]]},"295":{"position":[[51,4]]},"402":{"position":[[1064,4]]},"1124":{"position":[[1780,5]]},"1132":{"position":[[1189,4]]},"1304":{"position":[[1452,4]]}},"keywords":{}}],["costli",{"_index":4812,"title":{},"content":{"841":{"position":[[1107,6]]}},"keywords":{}}],["couch",{"_index":2156,"title":{},"content":{"381":{"position":[[206,5]]},"841":{"position":[[555,5]]}},"keywords":{}}],["couchbas",{"_index":411,"title":{"25":{"position":[[0,10]]}},"content":{"25":{"position":[[1,9],[247,9]]},"837":{"position":[[911,9]]}},"keywords":{}}],["couchdb",{"_index":239,"title":{"23":{"position":[[0,8]]},"843":{"position":[[17,7]]}},"content":{"14":{"position":[[1121,7]]},"23":{"position":[[10,7],[177,7],[419,7]]},"24":{"position":[[72,7],[306,7],[350,7],[799,7]]},"26":{"position":[[52,7]]},"27":{"position":[[220,7]]},"113":{"position":[[245,8]]},"174":{"position":[[3077,8]]},"238":{"position":[[160,8]]},"249":{"position":[[183,8]]},"255":{"position":[[1699,8]]},"289":{"position":[[448,7],[493,7],[586,8],[706,7],[814,7]]},"312":{"position":[[146,9]]},"350":{"position":[[160,8]]},"381":{"position":[[129,8],[146,7]]},"412":{"position":[[12519,7]]},"481":{"position":[[294,7]]},"504":{"position":[[870,7],[915,8],[985,7]]},"565":{"position":[[134,8]]},"566":{"position":[[1187,8]]},"632":{"position":[[757,8]]},"644":{"position":[[131,8]]},"685":{"position":[[157,7]]},"701":{"position":[[488,8]]},"749":{"position":[[175,7],[273,7]]},"793":{"position":[[717,7]]},"837":{"position":[[77,7],[182,7],[433,8],[801,8],[900,7]]},"838":{"position":[[627,8]]},"841":{"position":[[736,7],[790,8],[1428,7]]},"845":{"position":[[58,7]]},"846":{"position":[[107,9],[189,7],[253,7],[1235,7],[1562,7]]},"848":{"position":[[706,7],[1259,9],[1341,7]]},"849":{"position":[[7,7],[551,7],[670,7],[760,8]]},"851":{"position":[[75,7],[102,7],[254,7]]},"852":{"position":[[224,7]]},"1124":{"position":[[2271,8]]},"1149":{"position":[[130,7],[175,7],[552,7],[581,7],[647,7],[722,9],[1264,7],[1351,7],[1415,7]]},"1198":{"position":[[276,7],[464,8],[1573,7],[1708,7]]},"1199":{"position":[[57,7]]},"1313":{"position":[[1028,7]]}},"keywords":{}}],["couchdb.build",{"_index":1307,"title":{},"content":{"202":{"position":[[264,13]]}},"keywords":{}}],["couchdb/pouchdb",{"_index":2679,"title":{},"content":{"412":{"position":[[3385,18]]}},"keywords":{}}],["count",{"_index":1552,"title":{"1067":{"position":[[0,6]]}},"content":{"251":{"position":[[25,5]]},"265":{"position":[[369,7]]},"496":{"position":[[165,6]]},"746":{"position":[[736,6]]},"749":{"position":[[2604,7],[2660,7],[2839,5]]},"752":{"position":[[1170,6]]},"817":{"position":[[40,5]]},"1033":{"position":[[773,7]]},"1067":{"position":[[124,5],[384,5],[414,5],[610,5],[785,7],[1173,5],[1403,5],[1649,5],[1826,5],[1920,5],[2041,5],[2078,5],[2099,6],[2247,5]]},"1068":{"position":[[28,5],[187,8],[483,5]]},"1194":{"position":[[945,6],[995,7]]}},"keywords":{}}],["countalldocu",{"_index":6506,"title":{},"content":{"1311":{"position":[[834,18]]}},"keywords":{}}],["counter",{"_index":5776,"title":{},"content":{"1067":{"position":[[1756,8]]}},"keywords":{}}],["countri",{"_index":4450,"title":{},"content":{"751":{"position":[[1226,7]]}},"keywords":{}}],["coupl",{"_index":576,"title":{},"content":{"36":{"position":[[416,8]]},"412":{"position":[[925,7]]},"696":{"position":[[1137,6]]},"839":{"position":[[428,7]]}},"keywords":{}}],["cours",{"_index":357,"title":{},"content":{"20":{"position":[[248,6]]},"412":{"position":[[2805,6]]},"454":{"position":[[139,6]]},"457":{"position":[[474,6]]},"697":{"position":[[456,7]]},"703":{"position":[[1595,6]]},"773":{"position":[[229,6]]},"784":{"position":[[731,6]]},"1295":{"position":[[442,6]]},"1316":{"position":[[3356,7]]}},"keywords":{}}],["cover",{"_index":3020,"title":{},"content":{"461":{"position":[[1468,6]]},"839":{"position":[[678,6]]},"876":{"position":[[26,7],[119,5]]}},"keywords":{}}],["cpu",{"_index":2281,"title":{},"content":{"392":{"position":[[4693,3],[5215,3]]},"408":{"position":[[4749,4]]},"411":{"position":[[3611,3]]},"412":{"position":[[4830,3],[9294,3]]},"427":{"position":[[1236,3]]},"699":{"position":[[841,3]]},"704":{"position":[[364,5]]},"721":{"position":[[158,3],[192,3]]},"740":{"position":[[97,3]]},"975":{"position":[[162,4]]},"1164":{"position":[[1311,3]]},"1246":{"position":[[194,3],[514,3]]},"1292":{"position":[[200,4]]},"1309":{"position":[[756,3]]}},"keywords":{}}],["craft",{"_index":3223,"title":{},"content":{"502":{"position":[[57,7]]},"661":{"position":[[65,7]]},"711":{"position":[[90,7]]},"836":{"position":[[67,7]]},"837":{"position":[[1440,5]]},"848":{"position":[[116,8]]},"1079":{"position":[[424,5]]},"1296":{"position":[[840,5],[1202,7]]}},"keywords":{}}],["crash",{"_index":463,"title":{},"content":{"28":{"position":[[533,8]]},"302":{"position":[[304,7]]},"304":{"position":[[459,5]]},"990":{"position":[[328,5]]},"1010":{"position":[[204,9]]},"1090":{"position":[[1197,7]]},"1162":{"position":[[106,7]]},"1171":{"position":[[123,7]]},"1181":{"position":[[172,7]]},"1300":{"position":[[1130,7]]}},"keywords":{}}],["crdt",{"_index":628,"title":{"677":{"position":[[5,4]]},"678":{"position":[[5,4]]},"681":{"position":[[12,4]]},"683":{"position":[[0,5]]},"685":{"position":[[0,5]]},"687":{"position":[[16,6]]},"688":{"position":[[0,4]]},"689":{"position":[[13,6]]},"691":{"position":[[68,5]]}},"content":{"39":{"position":[[687,6]]},"40":{"position":[[10,4]]},"412":{"position":[[2406,5],[3675,5],[3846,5],[3917,5],[9239,4]]},"678":{"position":[[12,4],[204,4]]},"680":{"position":[[8,5],[58,4],[145,4],[192,4],[330,4],[424,4],[779,4],[965,6],[1023,4],[1070,5],[1081,4],[1101,7],[1289,4]]},"681":{"position":[[17,5],[215,5],[400,5],[497,4]]},"682":{"position":[[17,4],[163,5]]},"683":{"position":[[6,5],[91,4],[467,5]]},"684":{"position":[[34,4],[136,5]]},"685":{"position":[[1,4],[213,4],[410,4],[527,4],[660,4]]},"686":{"position":[[19,4],[224,4],[547,6],[703,4],[797,4],[842,4]]},"687":{"position":[[1,4],[231,5],[258,5],[308,4]]},"688":{"position":[[11,4],[156,4],[251,5],[371,4],[797,4],[963,6]]},"689":{"position":[[1,5],[124,5],[415,4],[540,5]]},"690":{"position":[[26,4],[237,5],[506,5]]},"691":{"position":[[703,4]]},"698":{"position":[[3059,5],[3073,4],[3220,5]]},"749":{"position":[[22581,4],[22624,4],[22772,5],[22857,5],[22918,4]]},"793":{"position":[[1139,4]]}},"keywords":{}}],["crdt1",{"_index":4417,"title":{},"content":{"749":{"position":[[22575,5]]}},"keywords":{}}],["crdt2",{"_index":4418,"title":{},"content":{"749":{"position":[[22715,5]]}},"keywords":{}}],["crdt3",{"_index":4420,"title":{},"content":{"749":{"position":[[22844,5]]}},"keywords":{}}],["creat",{"_index":198,"title":{"51":{"position":[[0,6]]},"258":{"position":[[0,6]]},"334":{"position":[[0,8]]},"538":{"position":[[0,6]]},"579":{"position":[[0,8]]},"598":{"position":[[0,6]]},"653":{"position":[[0,6]]},"803":{"position":[[0,8]]},"885":{"position":[[0,8]]},"934":{"position":[[0,8]]},"1020":{"position":[[0,8]]},"1075":{"position":[[0,6]]},"1114":{"position":[[0,8]]}},"content":{"14":{"position":[[50,8],[1055,7]]},"26":{"position":[[274,6]]},"30":{"position":[[204,7]]},"37":{"position":[[200,6]]},"45":{"position":[[119,6]]},"50":{"position":[[6,7],[223,7]]},"51":{"position":[[664,6]]},"55":{"position":[[641,8]]},"65":{"position":[[954,8],[2055,6]]},"83":{"position":[[359,6]]},"116":{"position":[[251,8]]},"124":{"position":[[99,6]]},"128":{"position":[[285,6]]},"129":{"position":[[527,7]]},"138":{"position":[[225,8]]},"145":{"position":[[93,6]]},"153":{"position":[[290,6]]},"170":{"position":[[107,6]]},"174":{"position":[[267,6]]},"177":{"position":[[55,7],[286,6]]},"181":{"position":[[178,8]]},"188":{"position":[[433,6],[474,7],[931,6],[3013,6],[3103,6]]},"194":{"position":[[63,8]]},"208":{"position":[[158,7]]},"211":{"position":[[38,6]]},"266":{"position":[[830,7]]},"275":{"position":[[219,6]]},"304":{"position":[[470,8]]},"334":{"position":[[38,6]]},"342":{"position":[[1,6]]},"346":{"position":[[137,8],[354,6],[444,6]]},"356":{"position":[[315,6],[694,6]]},"365":{"position":[[468,6]]},"368":{"position":[[273,6]]},"384":{"position":[[290,6]]},"387":{"position":[[294,8]]},"388":{"position":[[402,8]]},"390":{"position":[[247,7]]},"391":{"position":[[769,7]]},"392":{"position":[[43,6],[3811,6]]},"403":{"position":[[86,6]]},"404":{"position":[[171,8]]},"411":{"position":[[1246,8],[1667,8]]},"412":{"position":[[10910,6],[10971,8],[12534,8]]},"419":{"position":[[1644,8]]},"446":{"position":[[1308,6]]},"463":{"position":[[71,8],[1167,8]]},"464":{"position":[[1007,6]]},"480":{"position":[[33,6],[319,6]]},"482":{"position":[[564,6]]},"489":{"position":[[732,7]]},"510":{"position":[[367,6]]},"514":{"position":[[377,6]]},"530":{"position":[[647,8]]},"538":{"position":[[394,6]]},"541":{"position":[[319,6]]},"548":{"position":[[202,6]]},"554":{"position":[[1006,6],[1227,6]]},"563":{"position":[[611,6]]},"567":{"position":[[385,6]]},"579":{"position":[[802,8]]},"589":{"position":[[189,8]]},"601":{"position":[[540,6]]},"608":{"position":[[202,6]]},"611":{"position":[[1056,7]]},"612":{"position":[[622,8]]},"632":{"position":[[820,6],[1209,6]]},"653":{"position":[[60,8]]},"661":{"position":[[775,6],[1789,6]]},"662":{"position":[[1571,6],[2018,6],[2083,6],[2287,6]]},"667":{"position":[[18,8],[61,6]]},"668":{"position":[[254,6]]},"676":{"position":[[269,8]]},"680":{"position":[[512,6],[754,6]]},"693":{"position":[[169,6],[549,6]]},"698":{"position":[[1312,6],[2725,6]]},"700":{"position":[[783,6]]},"701":{"position":[[331,6],[418,8]]},"703":{"position":[[10,6]]},"705":{"position":[[11,8],[1241,8]]},"710":{"position":[[1512,6],[1662,6],[1776,6]]},"711":{"position":[[1082,6],[1203,6]]},"717":{"position":[[875,6],[958,8],[1109,6],[1251,6]]},"718":{"position":[[612,6]]},"719":{"position":[[316,7],[475,8]]},"724":{"position":[[337,6]]},"734":{"position":[[387,6],[560,6]]},"745":{"position":[[105,6],[466,6],[599,6]]},"749":{"position":[[3362,6],[5402,7],[13274,6],[22244,6]]},"752":{"position":[[72,8]]},"757":{"position":[[130,7]]},"759":{"position":[[317,6]]},"770":{"position":[[572,7]]},"776":{"position":[[128,7]]},"781":{"position":[[252,6]]},"784":{"position":[[182,6]]},"789":{"position":[[57,6]]},"793":{"position":[[954,8]]},"815":{"position":[[200,7]]},"817":{"position":[[251,8]]},"818":{"position":[[302,6]]},"829":{"position":[[175,7],[392,8],[1074,7],[3722,7]]},"830":{"position":[[301,8]]},"836":{"position":[[593,6],[825,6]]},"837":{"position":[[2021,6]]},"838":{"position":[[1888,6],[2158,6]]},"840":{"position":[[487,7]]},"848":{"position":[[1121,6]]},"851":{"position":[[60,6],[159,6],[236,6]]},"861":{"position":[[499,6],[921,6],[971,8],[1012,6],[1260,6],[2512,8]]},"862":{"position":[[485,6]]},"872":{"position":[[713,6],[792,6],[1341,6],[1387,6],[1663,6],[3641,6]]},"875":{"position":[[4156,7],[7826,6]]},"882":{"position":[[344,8]]},"885":{"position":[[143,6]]},"886":{"position":[[3235,6],[3278,6],[4960,6]]},"892":{"position":[[120,6]]},"898":{"position":[[66,6],[131,6],[830,6],[892,6],[1249,6],[1539,6],[1581,6],[2704,6]]},"904":{"position":[[273,6],[340,6],[384,6],[1028,8],[1227,8],[2324,6],[2449,6]]},"906":{"position":[[467,8],[626,6]]},"917":{"position":[[635,6]]},"932":{"position":[[854,6],[1376,6]]},"934":{"position":[[4,6],[830,6]]},"939":{"position":[[111,7]]},"952":{"position":[[22,6]]},"954":{"position":[[209,7]]},"955":{"position":[[180,6]]},"958":{"position":[[250,6],[282,6],[458,6],[727,8]]},"960":{"position":[[17,7]]},"964":{"position":[[25,6]]},"966":{"position":[[24,6],[759,6]]},"967":{"position":[[344,6]]},"971":{"position":[[22,6]]},"976":{"position":[[231,6]]},"977":{"position":[[386,8]]},"981":{"position":[[507,8]]},"987":{"position":[[593,6],[1101,6]]},"988":{"position":[[4881,8]]},"1007":{"position":[[269,6]]},"1009":{"position":[[768,8]]},"1013":{"position":[[60,6],[118,8]]},"1014":{"position":[[1,7]]},"1015":{"position":[[1,7]]},"1020":{"position":[[15,7]]},"1055":{"position":[[4,6]]},"1067":{"position":[[2328,8]]},"1068":{"position":[[106,8]]},"1069":{"position":[[392,6],[512,7]]},"1076":{"position":[[132,6]]},"1078":{"position":[[359,6],[784,6]]},"1080":{"position":[[859,6],[951,6]]},"1085":{"position":[[802,6],[2854,7],[2923,7],[3660,8],[3744,6]]},"1097":{"position":[[4,6],[162,6]]},"1102":{"position":[[278,8]]},"1103":{"position":[[6,8]]},"1108":{"position":[[22,7]]},"1114":{"position":[[23,7],[257,6],[399,6],[792,6],[875,6]]},"1117":{"position":[[175,7]]},"1119":{"position":[[333,8]]},"1125":{"position":[[806,6]]},"1126":{"position":[[119,8]]},"1135":{"position":[[278,6]]},"1138":{"position":[[117,8]]},"1144":{"position":[[149,6]]},"1148":{"position":[[683,6],[842,8],[1082,6]]},"1149":{"position":[[852,6]]},"1150":{"position":[[297,7]]},"1154":{"position":[[135,8],[669,6]]},"1158":{"position":[[157,6]]},"1163":{"position":[[457,6]]},"1164":{"position":[[346,7]]},"1165":{"position":[[254,8],[481,6],[611,7],[928,6]]},"1174":{"position":[[479,8],[773,8]]},"1182":{"position":[[461,6]]},"1189":{"position":[[178,8]]},"1194":{"position":[[151,6]]},"1198":{"position":[[144,7]]},"1208":{"position":[[96,6],[758,6],[849,7],[870,6],[980,7],[1001,6]]},"1209":{"position":[[253,7]]},"1213":{"position":[[767,6]]},"1219":{"position":[[56,6],[440,6],[607,6]]},"1222":{"position":[[1165,6],[1316,6]]},"1227":{"position":[[435,6]]},"1230":{"position":[[34,6],[245,6]]},"1231":{"position":[[926,6]]},"1238":{"position":[[50,6]]},"1239":{"position":[[9,6]]},"1246":{"position":[[1318,7],[1903,6],[2195,6]]},"1265":{"position":[[428,6]]},"1267":{"position":[[40,6]]},"1268":{"position":[[327,6]]},"1271":{"position":[[938,8],[1218,6],[1508,6]]},"1272":{"position":[[51,6],[324,8]]},"1277":{"position":[[120,6],[338,6]]},"1282":{"position":[[935,7]]},"1289":{"position":[[123,6]]},"1294":{"position":[[173,7],[460,6]]},"1296":{"position":[[325,6]]},"1297":{"position":[[65,8]]},"1301":{"position":[[744,6]]},"1308":{"position":[[556,6]]},"1309":{"position":[[414,6],[1320,8]]},"1311":{"position":[[66,6]]}},"keywords":{}}],["createblob",{"_index":3368,"title":{},"content":{"556":{"position":[[753,10]]},"754":{"position":[[203,10],[699,11]]},"917":{"position":[[90,10]]}},"keywords":{}}],["createblob('meowmeow",{"_index":5288,"title":{},"content":{"917":{"position":[[225,22]]}},"keywords":{}}],["createblob('sensit",{"_index":3371,"title":{},"content":{"556":{"position":[[967,21]]}},"keywords":{}}],["createblob(json.stringifi",{"_index":4666,"title":{},"content":{"800":{"position":[[930,29]]}},"keywords":{}}],["createcli",{"_index":5214,"title":{},"content":{"898":{"position":[[2983,12],[3052,13]]}},"keywords":{}}],["created.leverag",{"_index":3521,"title":{},"content":{"590":{"position":[[212,16]]}},"keywords":{}}],["createdat",{"_index":1904,"title":{},"content":{"316":{"position":[[333,10]]}},"keywords":{}}],["createdb",{"_index":1260,"title":{},"content":{"188":{"position":[[1594,8]]},"672":{"position":[[16,10]]},"673":{"position":[[59,10]]},"674":{"position":[[330,10]]}},"keywords":{}}],["createdb(databasenam",{"_index":1252,"title":{},"content":{"188":{"position":[[903,22]]}},"keywords":{}}],["createpassword",{"_index":4026,"title":{},"content":{"718":{"position":[[141,14]]}},"keywords":{}}],["createreactivityfactori",{"_index":4722,"title":{},"content":{"825":{"position":[[102,23]]}},"keywords":{}}],["createreactivityfactory(inject(injector",{"_index":846,"title":{},"content":{"55":{"position":[[955,41]]},"825":{"position":[[423,41]]}},"keywords":{}}],["createreactivityfactory(injector",{"_index":837,"title":{},"content":{"55":{"position":[[366,33]]}},"keywords":{}}],["createrestcli",{"_index":5939,"title":{},"content":{"1102":{"position":[[858,16]]}},"keywords":{}}],["createrestclient('http://localhost:80",{"_index":5941,"title":{},"content":{"1102":{"position":[[932,39]]}},"keywords":{}}],["createrxdatabas",{"_index":24,"title":{},"content":{"1":{"position":[[328,16],[536,18]]},"2":{"position":[[339,18]]},"3":{"position":[[219,18]]},"4":{"position":[[397,18]]},"5":{"position":[[307,18]]},"6":{"position":[[502,18],[681,18]]},"7":{"position":[[339,18],[516,18]]},"8":{"position":[[734,16],[1108,18]]},"9":{"position":[[253,18]]},"10":{"position":[[291,18]]},"11":{"position":[[817,18]]},"51":{"position":[[188,16],[699,18]]},"55":{"position":[[677,16],[873,18]]},"188":{"position":[[647,16],[970,18]]},"209":{"position":[[10,16],[242,18]]},"211":{"position":[[72,16],[212,18]]},"255":{"position":[[357,16],[589,18]]},"258":{"position":[[10,16],[150,18]]},"266":{"position":[[549,16],[664,18]]},"314":{"position":[[309,16],[475,18]]},"315":{"position":[[338,16],[538,18]]},"334":{"position":[[174,16],[333,18]]},"392":{"position":[[216,16],[343,18]]},"480":{"position":[[167,16],[368,18]]},"482":{"position":[[168,16],[613,18]]},"522":{"position":[[287,16],[414,18]]},"538":{"position":[[268,16],[429,18]]},"542":{"position":[[388,16],[534,18]]},"554":{"position":[[484,16],[1052,18]]},"562":{"position":[[10,16],[167,18]]},"563":{"position":[[207,16],[479,18]]},"564":{"position":[[195,16],[583,18]]},"579":{"position":[[176,16],[342,18]]},"598":{"position":[[276,16],[436,18]]},"632":{"position":[[1048,16],[1288,18]]},"638":{"position":[[430,18]]},"653":{"position":[[126,16],[253,18]]},"662":{"position":[[1634,16],[2126,18]]},"672":{"position":[[195,17]]},"673":{"position":[[201,17]]},"674":{"position":[[484,17]]},"680":{"position":[[539,16],[674,18]]},"693":{"position":[[1174,18]]},"710":{"position":[[1549,16],[1695,18]]},"717":{"position":[[1061,16],[1155,18]]},"718":{"position":[[658,18]]},"721":{"position":[[377,16]]},"732":{"position":[[118,17]]},"734":{"position":[[418,16],[480,18]]},"739":{"position":[[284,18]]},"745":{"position":[[529,18]]},"749":{"position":[[2762,16],[5563,19],[6208,19],[6463,19]]},"759":{"position":[[360,18]]},"772":{"position":[[615,17],[643,16],[770,18],[1430,16],[1615,18],[2138,16],[2377,18]]},"773":{"position":[[445,16],[560,18]]},"774":{"position":[[448,16],[662,18]]},"825":{"position":[[300,17],[341,18]]},"829":{"position":[[468,17],[639,18]]},"838":{"position":[[1951,16],[2204,18]]},"862":{"position":[[298,17],[539,18]]},"872":{"position":[[1549,17],[1713,18],[3784,16],[3971,18]]},"892":{"position":[[10,16],[177,20]]},"898":{"position":[[2174,16],[2321,18]]},"904":{"position":[[574,16],[714,18]]},"932":{"position":[[1043,18]]},"960":{"position":[[45,19],[142,16],[282,18]]},"962":{"position":[[753,18],[969,18]]},"966":{"position":[[537,18],[655,18]]},"967":{"position":[[122,18],[240,18]]},"968":{"position":[[507,18]]},"976":{"position":[[262,19]]},"1013":{"position":[[298,18]]},"1067":{"position":[[2377,18]]},"1088":{"position":[[606,19]]},"1090":{"position":[[782,18]]},"1114":{"position":[[441,17],[711,18]]},"1118":{"position":[[370,16],[645,18]]},"1121":{"position":[[451,18]]},"1125":{"position":[[134,16],[162,16],[287,18]]},"1126":{"position":[[367,18],[680,18]]},"1130":{"position":[[10,16],[160,18]]},"1134":{"position":[[10,16],[137,18]]},"1138":{"position":[[152,16],[281,18]]},"1139":{"position":[[250,16],[536,18]]},"1140":{"position":[[466,16],[595,18]]},"1144":{"position":[[38,16],[185,18]]},"1145":{"position":[[242,16],[525,18]]},"1146":{"position":[[230,18]]},"1148":{"position":[[528,16],[1124,18]]},"1149":{"position":[[805,16],[917,18]]},"1154":{"position":[[745,18]]},"1156":{"position":[[334,19]]},"1158":{"position":[[32,16],[193,18]]},"1159":{"position":[[218,16],[379,18]]},"1163":{"position":[[539,18]]},"1165":{"position":[[729,18],[1067,18]]},"1168":{"position":[[26,16],[141,18]]},"1172":{"position":[[10,16],[306,18]]},"1182":{"position":[[543,18]]},"1184":{"position":[[782,18]]},"1189":{"position":[[277,16],[404,18]]},"1201":{"position":[[10,16],[181,18]]},"1210":{"position":[[292,16],[421,18]]},"1211":{"position":[[541,16],[676,18]]},"1218":{"position":[[568,18]]},"1219":{"position":[[881,18]]},"1222":{"position":[[1392,18]]},"1226":{"position":[[10,16],[217,18]]},"1227":{"position":[[560,16],[695,18]]},"1231":{"position":[[607,17],[1026,18]]},"1237":{"position":[[839,18]]},"1238":{"position":[[814,18]]},"1239":{"position":[[784,18]]},"1264":{"position":[[10,16],[139,18]]},"1265":{"position":[[554,16],[683,18]]},"1267":{"position":[[617,18],[711,18]]},"1271":{"position":[[1570,18]]},"1274":{"position":[[10,16],[321,18]]},"1275":{"position":[[128,16],[332,18]]},"1276":{"position":[[400,16],[934,18]]},"1277":{"position":[[151,16],[381,18]]},"1278":{"position":[[254,16],[458,18],[706,16],[910,18]]},"1279":{"position":[[319,16],[708,18]]},"1280":{"position":[[250,16],[443,18]]},"1286":{"position":[[490,18]]},"1287":{"position":[[540,18]]},"1288":{"position":[[506,18]]}},"keywords":{}}],["createrxdatabase<mydatabasecollections>",{"_index":6498,"title":{},"content":{"1311":{"position":[[138,47]]}},"keywords":{}}],["createrxserv",{"_index":4959,"title":{},"content":{"872":{"position":[[3109,14],[3260,16]]},"1097":{"position":[[132,16],[340,14],[705,16]]},"1098":{"position":[[180,14],[341,16]]},"1099":{"position":[[162,14],[315,16]]}},"keywords":{}}],["createsyncaccesshandl",{"_index":2964,"title":{},"content":{"453":{"position":[[388,24]]},"460":{"position":[[1137,22]]},"464":{"position":[[1172,24]]},"468":{"position":[[351,24]]},"1207":{"position":[[449,24]]},"1211":{"position":[[5,22]]}},"keywords":{}}],["createwrit",{"_index":6236,"title":{},"content":{"1211":{"position":[[336,14]]}},"keywords":{}}],["creation",{"_index":782,"title":{"145":{"position":[[34,9]]},"960":{"position":[[0,9]]}},"content":{"51":{"position":[[939,8]]},"56":{"position":[[128,9]]},"145":{"position":[[205,9]]},"188":{"position":[[857,8]]},"590":{"position":[[102,9]]},"656":{"position":[[279,8]]},"715":{"position":[[137,8]]},"749":{"position":[[6652,8],[14433,9]]},"751":{"position":[[6,8]]},"752":{"position":[[490,8]]},"774":{"position":[[150,8]]},"829":{"position":[[94,9],[113,8]]},"830":{"position":[[218,9]]},"832":{"position":[[122,8]]},"989":{"position":[[288,8]]},"1013":{"position":[[815,9]]},"1085":{"position":[[897,8],[1004,9]]},"1119":{"position":[[184,9]]},"1161":{"position":[[269,8]]},"1175":{"position":[[234,9],[627,8]]},"1180":{"position":[[269,8]]},"1194":{"position":[[273,8]]}},"keywords":{}}],["creativ",{"_index":949,"title":{},"content":{"66":{"position":[[611,8]]}},"keywords":{}}],["credenti",{"_index":1401,"title":{},"content":{"218":{"position":[[132,11]]},"506":{"position":[[185,12]]},"550":{"position":[[204,12]]},"556":{"position":[[381,11],[435,13]]},"564":{"position":[[1071,12]]},"616":{"position":[[874,11]]},"846":{"position":[[492,12]]},"890":{"position":[[446,11],[593,10],[843,12]]},"1226":{"position":[[684,12]]},"1264":{"position":[[564,12]]}},"keywords":{}}],["credentials.password",{"_index":3365,"title":{},"content":{"556":{"position":[[458,21]]}},"keywords":{}}],["creditcard",{"_index":5840,"title":{},"content":{"1080":{"position":[[615,12]]}},"keywords":{}}],["criteria",{"_index":2887,"title":{},"content":{"427":{"position":[[1017,9]]},"430":{"position":[[258,9]]}},"keywords":{}}],["critic",{"_index":1238,"title":{},"content":{"184":{"position":[[23,8]]},"280":{"position":[[442,8]]},"302":{"position":[[617,8]]},"375":{"position":[[410,8]]},"399":{"position":[[453,8]]},"412":{"position":[[278,7],[383,11]]},"496":{"position":[[134,8]]},"497":{"position":[[793,8]]},"527":{"position":[[23,8]]},"556":{"position":[[1078,9]]},"802":{"position":[[863,8]]}},"keywords":{}}],["critical.serv",{"_index":3662,"title":{},"content":{"621":{"position":[[180,15]]}},"keywords":{}}],["crm",{"_index":2138,"title":{},"content":{"375":{"position":[[201,5]]},"411":{"position":[[901,3]]},"1009":{"position":[[328,4]]}},"keywords":{}}],["cross",{"_index":738,"title":{"254":{"position":[[3,5]]}},"content":{"47":{"position":[[858,5]]},"174":{"position":[[2579,5],[2781,5]]},"207":{"position":[[319,5]]},"269":{"position":[[139,5]]},"384":{"position":[[27,5]]},"445":{"position":[[2132,5],[2189,5]]},"446":{"position":[[1085,5],[1221,5]]},"447":{"position":[[440,5]]},"535":{"position":[[894,5]]},"548":{"position":[[366,5]]},"595":{"position":[[969,5]]},"608":{"position":[[364,5]]},"852":{"position":[[92,5],[137,6]]},"1072":{"position":[[1198,5],[1285,5],[1538,5]]},"1211":{"position":[[467,5]]}},"keywords":{}}],["crossfetch",{"_index":4861,"title":{},"content":{"852":{"position":[[121,10],[318,11]]}},"keywords":{}}],["crown",{"_index":4110,"title":{},"content":{"741":{"position":[[47,5]]},"742":{"position":[[64,5]]}},"keywords":{}}],["crucial",{"_index":924,"title":{},"content":{"65":{"position":[[1206,7]]},"68":{"position":[[220,8]]},"95":{"position":[[15,7]]},"218":{"position":[[15,7]]},"228":{"position":[[155,8]]},"270":{"position":[[294,8]]},"291":{"position":[[346,7]]},"301":{"position":[[516,7]]},"309":{"position":[[26,7]]},"343":{"position":[[72,7]]},"534":{"position":[[56,7]]},"564":{"position":[[1045,7]]},"569":{"position":[[227,7]]},"587":{"position":[[120,7]]},"594":{"position":[[54,7]]},"641":{"position":[[38,7]]},"723":{"position":[[2625,7]]}},"keywords":{}}],["crud",{"_index":784,"title":{"52":{"position":[[0,4]]},"539":{"position":[[0,4]]},"599":{"position":[[0,4]]}},"content":{"52":{"position":[[56,4]]},"57":{"position":[[15,4]]},"181":{"position":[[162,4]]},"539":{"position":[[56,4]]},"599":{"position":[[56,4]]},"1123":{"position":[[521,4]]}},"keywords":{}}],["crypto",{"_index":1121,"title":{"718":{"position":[[10,6]]}},"content":{"139":{"position":[[72,6]]},"291":{"position":[[459,6],[485,6]]},"315":{"position":[[31,6],[93,6],[143,6],[239,6]]},"482":{"position":[[368,6],[437,6]]},"483":{"position":[[1076,6]]},"551":{"position":[[448,6],[469,6]]},"553":{"position":[[108,6]]},"554":{"position":[[120,6],[181,6],[593,6]]},"556":{"position":[[1119,6]]},"564":{"position":[[304,6]]},"638":{"position":[[298,6]]},"717":{"position":[[69,6],[128,6],[174,6],[220,6],[327,6],[626,6]]},"718":{"position":[[36,8],[200,8]]},"1184":{"position":[[625,8]]},"1237":{"position":[[722,6]]}},"keywords":{}}],["crypto.subtl",{"_index":5402,"title":{},"content":{"968":{"position":[[123,13]]}},"keywords":{}}],["crypto.subtle.digest",{"_index":4146,"title":{},"content":{"749":{"position":[[1091,20]]},"968":{"position":[[793,21]]}},"keywords":{}}],["crypto.subtle.digest('sha",{"_index":5400,"title":{},"content":{"968":{"position":[[27,25]]}},"keywords":{}}],["cryptoj",{"_index":3343,"title":{},"content":{"553":{"position":[[61,8]]},"554":{"position":[[38,8],[287,8]]}},"keywords":{}}],["css",{"_index":1627,"title":{},"content":{"269":{"position":[[83,4]]}},"keywords":{}}],["ctr",{"_index":4033,"title":{},"content":{"718":{"position":[[512,4],[557,5]]}},"keywords":{}}],["cumbersom",{"_index":729,"title":{},"content":{"47":{"position":[[481,10]]},"784":{"position":[[410,10]]},"836":{"position":[[2192,11]]}},"keywords":{}}],["cumbersome.complex",{"_index":3295,"title":{},"content":{"535":{"position":[[236,22]]},"595":{"position":[[249,22]]}},"keywords":{}}],["cumul",{"_index":4669,"title":{},"content":{"802":{"position":[[221,12]]}},"keywords":{}}],["curb",{"_index":1700,"title":{},"content":{"298":{"position":[[24,4]]}},"keywords":{}}],["current",{"_index":1268,"title":{"300":{"position":[[14,7]]}},"content":{"188":{"position":[[2109,9]]},"365":{"position":[[341,7]]},"404":{"position":[[265,7]]},"411":{"position":[[4895,7]]},"455":{"position":[[297,7]]},"470":{"position":[[159,9]]},"610":{"position":[[1645,9]]},"613":{"position":[[561,9]]},"650":{"position":[[7,9]]},"653":{"position":[[1301,7]]},"681":{"position":[[59,7]]},"698":{"position":[[2396,7],[2474,7],[2692,7]]},"711":{"position":[[847,9]]},"717":{"position":[[6,9]]},"723":{"position":[[1255,7]]},"736":{"position":[[46,7],[228,7],[295,9]]},"781":{"position":[[392,9]]},"799":{"position":[[296,7]]},"829":{"position":[[3182,7]]},"838":{"position":[[130,7]]},"973":{"position":[[12,7]]},"988":{"position":[[1310,7]]},"1007":{"position":[[346,9]]},"1009":{"position":[[414,9]]},"1039":{"position":[[67,7]]},"1042":{"position":[[63,7]]},"1044":{"position":[[211,7]]},"1046":{"position":[[55,7]]},"1050":{"position":[[21,7]]},"1058":{"position":[[43,7]]},"1115":{"position":[[108,7],[266,7]]},"1133":{"position":[[297,9]]},"1188":{"position":[[61,9],[102,9]]},"1198":{"position":[[2033,9]]},"1304":{"position":[[205,7]]},"1305":{"position":[[907,9],[1038,9]]},"1307":{"position":[[110,9]]},"1316":{"position":[[3161,7]]}},"keywords":{}}],["cursor",{"_index":6045,"title":{"1294":{"position":[[8,7]]}},"content":{"1138":{"position":[[409,7]]},"1143":{"position":[[357,6]]},"1294":{"position":[[377,6],[1025,6],[1862,6],[2130,7]]},"1295":{"position":[[885,6]]},"1296":{"position":[[377,6],[1250,6],[1680,6]]}},"keywords":{}}],["custom",{"_index":241,"title":{"144":{"position":[[4,6]]},"209":{"position":[[30,6]]},"747":{"position":[[6,6]]},"818":{"position":[[8,6]]},"822":{"position":[[16,6]]},"826":{"position":[[10,6]]},"874":{"position":[[24,6]]},"882":{"position":[[0,6]]},"894":{"position":[[0,10]]},"1002":{"position":[[10,6]]},"1212":{"position":[[11,6]]},"1220":{"position":[[8,6]]},"1228":{"position":[[11,6]]},"1266":{"position":[[11,6]]},"1289":{"position":[[0,6]]},"1290":{"position":[[4,6]]},"1291":{"position":[[9,6]]},"1296":{"position":[[0,6]]},"1309":{"position":[[0,6]]}},"content":{"14":{"position":[[1139,6]]},"18":{"position":[[343,6]]},"39":{"position":[[537,13]]},"43":{"position":[[219,6]]},"55":{"position":[[79,6]]},"144":{"position":[[22,6]]},"147":{"position":[[212,9]]},"168":{"position":[[212,6]]},"188":{"position":[[318,6]]},"196":{"position":[[133,6]]},"202":{"position":[[278,6]]},"205":{"position":[[136,6]]},"209":{"position":[[603,6],[691,7]]},"249":{"position":[[208,6],[237,6]]},"250":{"position":[[186,6]]},"255":{"position":[[332,6],[943,6]]},"260":{"position":[[44,6]]},"287":{"position":[[180,14]]},"312":{"position":[[179,6]]},"344":{"position":[[146,6]]},"381":{"position":[[390,6]]},"383":{"position":[[425,6]]},"411":{"position":[[942,8],[1000,8],[1097,6]]},"412":{"position":[[1772,6],[2378,6],[2423,6],[4855,6],[5333,6],[12954,6]]},"419":{"position":[[1128,6]]},"469":{"position":[[241,6]]},"489":{"position":[[288,7]]},"522":{"position":[[738,6]]},"525":{"position":[[613,6]]},"551":{"position":[[359,6]]},"580":{"position":[[197,6]]},"602":{"position":[[78,6]]},"616":{"position":[[1098,6]]},"632":{"position":[[829,6]]},"635":{"position":[[286,6]]},"680":{"position":[[233,6]]},"685":{"position":[[189,6],[459,6]]},"686":{"position":[[445,6]]},"691":{"position":[[142,6]]},"701":{"position":[[1123,6]]},"747":{"position":[[41,6]]},"749":{"position":[[6608,6]]},"765":{"position":[[246,6]]},"770":{"position":[[232,6]]},"793":{"position":[[1055,6]]},"802":{"position":[[451,6]]},"815":{"position":[[307,6]]},"818":{"position":[[314,6],[380,6]]},"825":{"position":[[56,6]]},"826":{"position":[[173,6],[302,6]]},"831":{"position":[[506,6]]},"836":{"position":[[1999,6],[2090,6]]},"837":{"position":[[1448,6]]},"839":{"position":[[622,6]]},"840":{"position":[[559,6]]},"846":{"position":[[427,6],[744,6],[1170,6]]},"848":{"position":[[127,6],[577,6],[807,6],[950,6],[1442,6]]},"854":{"position":[[1376,6]]},"898":{"position":[[3621,9]]},"904":{"position":[[2458,6]]},"906":{"position":[[1061,6]]},"907":{"position":[[158,6]]},"908":{"position":[[189,6]]},"913":{"position":[[108,6]]},"934":{"position":[[515,6],[702,6],[780,6]]},"960":{"position":[[633,6]]},"987":{"position":[[993,6],[1110,6]]},"988":{"position":[[1662,6],[1988,6],[3108,6]]},"1002":{"position":[[134,6],[616,6],[1270,6]]},"1079":{"position":[[430,6]]},"1085":{"position":[[2188,6]]},"1117":{"position":[[100,6]]},"1118":{"position":[[49,6]]},"1143":{"position":[[367,6]]},"1149":{"position":[[277,6]]},"1177":{"position":[[5,6]]},"1204":{"position":[[5,6]]},"1220":{"position":[[45,6]]},"1228":{"position":[[12,6]]},"1229":{"position":[[165,6]]},"1266":{"position":[[29,6],[546,6],[576,6]]},"1268":{"position":[[377,6]]},"1289":{"position":[[46,6]]},"1296":{"position":[[499,6],[551,6],[848,6],[1056,6],[1116,8],[1195,6],[1440,6],[1610,6],[1731,6],[1862,6]]},"1309":{"position":[[423,6],[779,6],[1064,6],[1283,6]]},"1315":{"position":[[201,9],[257,8],[303,8],[434,8],[887,9],[1432,8]]},"1318":{"position":[[378,9],[423,10],[444,8],[612,8]]}},"keywords":{}}],["custom.work",{"_index":6330,"title":{},"content":{"1268":{"position":[[502,15]]}},"keywords":{}}],["custom.worker.t",{"_index":6328,"title":{},"content":{"1268":{"position":[[339,16],[552,16]]}},"keywords":{}}],["customer.city_id",{"_index":6532,"title":{},"content":{"1315":{"position":[[446,16]]}},"keywords":{}}],["customerdocu",{"_index":6536,"title":{},"content":{"1315":{"position":[[639,17]]}},"keywords":{}}],["customiz",{"_index":1596,"title":{},"content":{"263":{"position":[[178,12]]},"688":{"position":[[819,13]]}},"keywords":{}}],["customrequest",{"_index":6259,"title":{},"content":{"1220":{"position":[[431,15]]}},"keywords":{}}],["customrequesthandl",{"_index":6257,"title":{},"content":{"1220":{"position":[[131,20]]}},"keywords":{}}],["customrequesthandler(msg",{"_index":6258,"title":{},"content":{"1220":{"position":[[275,26]]}},"keywords":{}}],["cut",{"_index":1685,"title":{},"content":{"289":{"position":[[1624,7]]},"613":{"position":[[19,7]]},"902":{"position":[[860,3]]}},"keywords":{}}],["cvc",{"_index":5841,"title":{},"content":{"1080":{"position":[[684,4]]}},"keywords":{}}],["cycl",{"_index":2088,"title":{},"content":{"362":{"position":[[242,6]]},"611":{"position":[[232,7]]},"653":{"position":[[1076,5]]},"656":{"position":[[39,6],[476,6]]},"821":{"position":[[913,6]]},"989":{"position":[[223,7]]},"993":{"position":[[646,5]]},"994":{"position":[[107,5]]},"995":{"position":[[138,5]]},"996":{"position":[[19,5]]}},"keywords":{}}],["d",{"_index":3642,"title":{},"content":{"617":{"position":[[988,1]]},"982":{"position":[[218,1],[252,1],[473,1],[585,1]]},"987":{"position":[[621,1],[682,1],[722,1]]},"988":{"position":[[3377,1],[3385,1],[4706,1],[4714,2]]}},"keywords":{}}],["d.get('tim",{"_index":5520,"title":{},"content":{"995":{"position":[[1960,13]]}},"keywords":{}}],["d.point",{"_index":1137,"title":{},"content":{"143":{"position":[[561,10],[746,10]]}},"keywords":{}}],["damag",{"_index":5810,"title":{},"content":{"1074":{"position":[[565,6]]}},"keywords":{}}],["danger",{"_index":2707,"title":{},"content":{"412":{"position":[[6220,9]]},"670":{"position":[[232,10]]},"702":{"position":[[302,10]]},"749":{"position":[[3115,9]]},"995":{"position":[[776,9]]},"1177":{"position":[[77,9]]},"1204":{"position":[[78,9]]}},"keywords":{}}],["daniel",{"_index":2650,"title":{},"content":{"412":{"position":[[263,8]]}},"keywords":{}}],["dart",{"_index":1244,"title":{},"content":{"188":{"position":[[233,4],[2071,4],[2155,4],[2424,4]]}},"keywords":{}}],["dashboard",{"_index":1620,"title":{},"content":{"267":{"position":[[861,11],[950,11],[1550,11]]},"301":{"position":[[291,10]]},"375":{"position":[[479,11]]},"420":{"position":[[1424,9]]},"491":{"position":[[1846,11]]}},"keywords":{}}],["data",{"_index":6,"title":{"65":{"position":[[10,4]]},"86":{"position":[[28,4]]},"88":{"position":[[0,4]]},"90":{"position":[[53,5]]},"95":{"position":[[12,4]]},"97":{"position":[[0,4]]},"121":{"position":[[9,4]]},"123":{"position":[[0,4]]},"132":{"position":[[14,4]]},"139":{"position":[[20,5]]},"146":{"position":[[10,4]]},"147":{"position":[[0,4]]},"150":{"position":[[10,4],[63,4]]},"152":{"position":[[14,4]]},"153":{"position":[[22,4]]},"156":{"position":[[9,4]]},"158":{"position":[[0,4]]},"161":{"position":[[15,4]]},"163":{"position":[[14,4]]},"167":{"position":[[20,5]]},"182":{"position":[[9,4]]},"184":{"position":[[0,4]]},"190":{"position":[[14,4]]},"195":{"position":[[20,5]]},"213":{"position":[[45,4]]},"214":{"position":[[28,4]]},"218":{"position":[[30,5]]},"221":{"position":[[42,5]]},"270":{"position":[[21,4]]},"288":{"position":[[15,4]]},"294":{"position":[[34,5]]},"305":{"position":[[26,4]]},"311":{"position":[[12,4]]},"326":{"position":[[9,4]]},"328":{"position":[[0,4]]},"337":{"position":[[14,4]]},"343":{"position":[[20,5]]},"367":{"position":[[22,4]]},"381":{"position":[[9,4]]},"403":{"position":[[10,4]]},"417":{"position":[[0,4]]},"426":{"position":[[16,4]]},"476":{"position":[[13,4]]},"506":{"position":[[20,5]]},"515":{"position":[[9,4]]},"517":{"position":[[0,4]]},"525":{"position":[[14,4]]},"555":{"position":[[36,5]]},"559":{"position":[[16,4]]},"582":{"position":[[14,4]]},"586":{"position":[[20,5]]},"616":{"position":[[8,4]]},"634":{"position":[[23,4]]},"664":{"position":[[0,4]]},"705":{"position":[[23,5]]},"714":{"position":[[19,5]]},"750":{"position":[[17,4]]},"782":{"position":[[12,4]]},"787":{"position":[[7,4]]},"800":{"position":[[29,4]]},"900":{"position":[[40,4]]},"912":{"position":[[19,4]]},"986":{"position":[[0,4]]},"1022":{"position":[[18,4]]},"1024":{"position":[[18,4]]},"1115":{"position":[[8,4]]},"1116":{"position":[[10,5]]},"1184":{"position":[[29,5]]},"1237":{"position":[[13,4]]}},"content":{"1":{"position":[[67,4],[146,4]]},"3":{"position":[[34,4]]},"5":{"position":[[25,4]]},"6":{"position":[[55,4],[653,4]]},"7":{"position":[[49,4],[488,4]]},"11":{"position":[[1032,5]]},"14":{"position":[[496,4],[752,4]]},"16":{"position":[[190,4]]},"17":{"position":[[254,5],[453,5]]},"19":{"position":[[142,4],[1071,4]]},"20":{"position":[[60,4],[203,4]]},"24":{"position":[[292,4]]},"26":{"position":[[147,4]]},"28":{"position":[[158,5],[419,4]]},"29":{"position":[[147,4]]},"30":{"position":[[146,4]]},"31":{"position":[[112,4],[180,4]]},"34":{"position":[[199,4]]},"35":{"position":[[327,4]]},"37":{"position":[[49,4]]},"38":{"position":[[490,5],[507,4]]},"39":{"position":[[37,4],[318,4]]},"40":{"position":[[47,4],[172,4],[765,4]]},"41":{"position":[[186,4]]},"45":{"position":[[96,5],[158,4]]},"46":{"position":[[205,4],[271,4],[449,4],[570,4]]},"47":{"position":[[755,4],[905,4],[1146,4]]},"50":{"position":[[128,4]]},"54":{"position":[[34,4]]},"57":{"position":[[30,4],[89,4],[150,4],[285,4],[358,4]]},"58":{"position":[[277,4]]},"63":{"position":[[65,4],[219,4]]},"64":{"position":[[93,4]]},"65":{"position":[[48,4],[158,4],[285,4],[498,4],[808,4],[885,4],[1178,5],[1250,4],[1329,4],[1542,4],[1606,5],[1723,4],[1820,4]]},"66":{"position":[[301,4],[458,4],[558,4],[640,4]]},"68":{"position":[[47,4]]},"73":{"position":[[140,4]]},"75":{"position":[[99,4]]},"77":{"position":[[107,4]]},"78":{"position":[[48,4]]},"80":{"position":[[69,4],[130,4]]},"81":{"position":[[11,4]]},"82":{"position":[[104,4]]},"86":{"position":[[50,4]]},"87":{"position":[[101,4]]},"88":{"position":[[9,4]]},"89":{"position":[[164,4]]},"90":{"position":[[120,4],[145,4],[233,5]]},"92":{"position":[[195,4]]},"93":{"position":[[9,4],[96,4]]},"95":{"position":[[33,4],[161,4],[245,5]]},"97":{"position":[[6,4],[152,5],[168,4]]},"99":{"position":[[122,4],[239,4],[369,4]]},"103":{"position":[[87,4],[161,4]]},"106":{"position":[[134,4]]},"108":{"position":[[119,4]]},"109":{"position":[[57,4],[186,4]]},"110":{"position":[[51,4],[166,4]]},"111":{"position":[[197,4]]},"112":{"position":[[248,4]]},"113":{"position":[[155,4]]},"114":{"position":[[528,4]]},"117":{"position":[[128,5],[185,5]]},"120":{"position":[[191,4],[260,4],[290,4]]},"121":{"position":[[48,4],[143,4],[204,4]]},"122":{"position":[[164,4]]},"123":{"position":[[36,4],[113,4],[239,4]]},"124":{"position":[[168,4],[276,4]]},"125":{"position":[[173,4]]},"126":{"position":[[343,4]]},"129":{"position":[[69,4],[99,4]]},"130":{"position":[[321,4]]},"131":{"position":[[54,5],[580,5],[887,4]]},"132":{"position":[[1,4],[150,4],[203,4]]},"133":{"position":[[158,4]]},"134":{"position":[[84,4]]},"135":{"position":[[29,4],[147,4]]},"136":{"position":[[100,4]]},"138":{"position":[[127,4]]},"139":{"position":[[53,4],[127,4],[200,5]]},"140":{"position":[[60,4],[159,4]]},"141":{"position":[[294,5]]},"146":{"position":[[48,4],[232,4]]},"147":{"position":[[19,4]]},"148":{"position":[[82,4],[138,4]]},"151":{"position":[[187,4]]},"152":{"position":[[145,4],[204,4],[241,4],[269,4]]},"153":{"position":[[26,4],[54,4],[247,4],[370,4]]},"155":{"position":[[35,4],[122,5],[167,4],[268,4]]},"156":{"position":[[54,4],[116,4],[263,4]]},"157":{"position":[[156,4],[340,4]]},"158":{"position":[[32,4],[145,4],[205,4]]},"159":{"position":[[102,5],[170,4],[237,4],[358,5]]},"160":{"position":[[133,4]]},"161":{"position":[[18,4],[213,4],[371,4]]},"162":{"position":[[613,4]]},"164":{"position":[[148,4],[344,4]]},"165":{"position":[[89,4],[270,4]]},"166":{"position":[[136,4]]},"167":{"position":[[20,4],[91,5],[115,4]]},"168":{"position":[[91,4]]},"169":{"position":[[199,4]]},"170":{"position":[[30,4],[188,4],[323,4]]},"173":{"position":[[75,4],[144,5],[380,4],[706,5],[828,4],[896,5],[922,4],[1011,4],[1151,4],[1237,4],[1418,4],[1549,4],[1659,4],[1720,4],[2780,4],[2878,4],[2924,4],[3207,4]]},"174":{"position":[[330,4],[509,4],[1109,4],[1913,4],[2274,4]]},"175":{"position":[[541,4]]},"178":{"position":[[136,5],[195,4],[286,5]]},"181":{"position":[[287,4]]},"182":{"position":[[50,4],[187,4]]},"183":{"position":[[160,4],[324,4]]},"184":{"position":[[1,4],[154,4],[280,4]]},"185":{"position":[[116,4],[212,5]]},"186":{"position":[[291,4],[319,4]]},"188":{"position":[[256,4],[401,5]]},"189":{"position":[[75,4],[250,4],[443,4],[526,4],[636,4]]},"190":{"position":[[64,4]]},"191":{"position":[[44,4],[238,4]]},"192":{"position":[[75,4],[360,4]]},"194":{"position":[[201,4]]},"195":{"position":[[11,4],[72,5],[96,4]]},"196":{"position":[[58,4],[246,4]]},"198":{"position":[[124,4],[159,4],[396,4]]},"201":{"position":[[86,5],[279,4]]},"202":{"position":[[139,4]]},"203":{"position":[[46,4],[367,4]]},"204":{"position":[[353,5]]},"205":{"position":[[103,4],[279,4]]},"206":{"position":[[121,5]]},"208":{"position":[[44,4]]},"210":{"position":[[130,4]]},"212":{"position":[[674,4]]},"215":{"position":[[32,4],[157,4]]},"216":{"position":[[95,4],[310,4]]},"217":{"position":[[9,4],[87,4],[153,4],[367,4]]},"218":{"position":[[33,4],[113,5],[255,4]]},"219":{"position":[[354,4]]},"220":{"position":[[313,4]]},"221":{"position":[[64,4],[89,4],[218,4]]},"223":{"position":[[278,4]]},"226":{"position":[[76,4],[188,4],[260,4],[289,4]]},"229":{"position":[[143,4]]},"231":{"position":[[67,4],[248,4]]},"233":{"position":[[161,5]]},"236":{"position":[[219,4],[339,4]]},"237":{"position":[[50,4],[154,4],[264,4]]},"240":{"position":[[35,4],[288,4]]},"241":{"position":[[443,4],[558,4],[716,4]]},"248":{"position":[[97,4]]},"249":{"position":[[91,4],[380,4]]},"250":{"position":[[137,4],[316,4]]},"251":{"position":[[173,4]]},"252":{"position":[[123,4]]},"253":{"position":[[182,4]]},"254":{"position":[[313,4]]},"255":{"position":[[1770,4]]},"261":{"position":[[174,4],[1101,4],[1190,4]]},"262":{"position":[[384,5]]},"263":{"position":[[94,4],[349,4]]},"265":{"position":[[160,4],[430,4],[704,4],[929,4]]},"266":{"position":[[160,4],[312,4],[487,4]]},"267":{"position":[[532,4],[992,4]]},"270":{"position":[[22,4],[263,4]]},"271":{"position":[[53,4]]},"273":{"position":[[109,4]]},"274":{"position":[[93,4],[228,5],[301,5]]},"275":{"position":[[166,4]]},"276":{"position":[[82,5],[249,5],[325,4]]},"277":{"position":[[137,4]]},"279":{"position":[[77,4],[121,4],[213,5],[497,4]]},"280":{"position":[[173,4],[335,4]]},"281":{"position":[[237,4]]},"282":{"position":[[380,4]]},"283":{"position":[[94,4],[246,4],[464,4]]},"284":{"position":[[95,4]]},"285":{"position":[[326,4]]},"286":{"position":[[421,4]]},"287":{"position":[[223,4],[537,4],[775,4],[868,4],[955,4],[978,4],[1020,4]]},"288":{"position":[[11,4],[121,4],[330,4]]},"289":{"position":[[99,4],[186,4],[296,4],[381,4],[552,4],[670,4],[864,4],[967,4],[1079,4],[1279,4],[1649,4],[1934,4]]},"290":{"position":[[37,4],[223,4]]},"291":{"position":[[93,5],[115,4],[327,4]]},"292":{"position":[[173,4],[350,4]]},"293":{"position":[[10,4],[213,4],[343,4],[416,4]]},"294":{"position":[[68,4],[106,4],[318,4]]},"295":{"position":[[359,4]]},"299":{"position":[[990,4],[1512,4]]},"300":{"position":[[604,4]]},"301":{"position":[[89,4],[188,4]]},"302":{"position":[[185,5],[315,4],[555,5],[1003,4]]},"303":{"position":[[163,4],[273,5],[1004,4],[1138,5],[1172,4],[1397,4]]},"305":{"position":[[11,4],[89,4],[402,5],[510,4],[602,5]]},"306":{"position":[[171,4]]},"309":{"position":[[147,4]]},"310":{"position":[[20,4],[131,4],[170,4],[233,4]]},"311":{"position":[[21,4]]},"315":{"position":[[17,5],[1064,4]]},"316":{"position":[[521,4]]},"317":{"position":[[86,4]]},"318":{"position":[[89,4],[656,5]]},"320":{"position":[[364,4]]},"321":{"position":[[9,4],[76,4],[143,4],[249,4],[497,4]]},"322":{"position":[[135,4]]},"323":{"position":[[10,4],[68,4],[251,4],[602,4]]},"325":{"position":[[50,4]]},"326":{"position":[[70,4],[214,4]]},"327":{"position":[[156,4]]},"328":{"position":[[25,4],[245,4]]},"329":{"position":[[71,4]]},"331":{"position":[[85,5]]},"335":{"position":[[49,4],[850,4]]},"336":{"position":[[356,4]]},"338":{"position":[[81,4]]},"339":{"position":[[190,4]]},"340":{"position":[[12,4],[179,5]]},"342":{"position":[[80,4]]},"343":{"position":[[36,4]]},"344":{"position":[[34,4],[172,4]]},"345":{"position":[[9,4]]},"346":{"position":[[229,5],[312,4],[771,4],[793,4]]},"350":{"position":[[11,4],[327,5]]},"351":{"position":[[176,4]]},"352":{"position":[[63,5],[210,5]]},"353":{"position":[[284,4]]},"354":{"position":[[100,4],[228,4],[589,4],[1618,5]]},"356":{"position":[[40,5],[419,4],[762,4]]},"357":{"position":[[33,5]]},"358":{"position":[[601,4],[829,5]]},"360":{"position":[[373,4],[799,4]]},"361":{"position":[[115,4],[1066,4]]},"362":{"position":[[91,4],[483,4]]},"364":{"position":[[104,4],[190,4],[305,4],[472,5],[541,4],[587,4],[671,4],[820,4]]},"365":{"position":[[210,4],[242,4],[308,4],[403,4],[581,4],[613,4],[760,4],[1169,4],[1282,4],[1330,4],[1456,4]]},"366":{"position":[[161,5],[215,4],[435,4]]},"367":{"position":[[107,4],[165,4],[366,4],[525,4]]},"369":{"position":[[103,5],[190,5],[293,4],[702,4],[860,4],[908,4],[983,5],[1064,4],[1173,4],[1288,4]]},"370":{"position":[[187,4]]},"371":{"position":[[106,5],[275,4]]},"372":{"position":[[89,5],[293,4],[352,4]]},"373":{"position":[[455,4],[575,4],[744,4]]},"375":{"position":[[245,5],[474,4],[661,4]]},"376":{"position":[[267,4],[566,4]]},"377":{"position":[[9,4],[381,4]]},"378":{"position":[[171,4]]},"379":{"position":[[91,4]]},"380":{"position":[[173,5]]},"382":{"position":[[33,4],[127,4],[208,4],[380,4]]},"383":{"position":[[135,4]]},"384":{"position":[[468,4]]},"385":{"position":[[22,4]]},"386":{"position":[[235,4]]},"390":{"position":[[80,4],[209,5],[444,4],[904,4],[1570,4]]},"391":{"position":[[1131,5]]},"392":{"position":[[110,4],[909,5],[1248,4],[2973,4]]},"395":{"position":[[304,4]]},"396":{"position":[[141,4],[986,4]]},"398":{"position":[[3530,5]]},"402":{"position":[[1561,4],[2520,4]]},"403":{"position":[[133,4],[413,5]]},"407":{"position":[[51,4],[187,4],[500,4],[646,5],[775,5],[1171,5]]},"408":{"position":[[412,5],[934,5],[1909,4],[2117,5],[2290,4],[2531,5],[2801,4],[3133,4],[3405,4],[3856,4],[5527,4]]},"410":{"position":[[354,4],[521,4],[648,5],[738,4],[800,4],[863,4],[1369,4],[1499,4],[2116,4]]},"411":{"position":[[91,4],[454,4],[804,5],[863,4],[932,4],[1040,4],[1366,4],[1429,5],[2761,4],[2805,4],[2874,4],[3251,4],[3733,4],[4129,5],[4343,4],[4651,4],[5005,4],[5052,5]]},"412":{"position":[[506,4],[528,4],[676,4],[1712,4],[2726,4],[3039,5],[3707,4],[4028,4],[5730,4],[5924,4],[6007,5],[6058,4],[6651,4],[6665,4],[6712,4],[6952,4],[7044,4],[7073,4],[7186,4],[7382,4],[7466,4],[7515,4],[7604,4],[7698,4],[7803,4],[7907,4],[8017,5],[8167,4],[8280,4],[8430,4],[8630,5],[8670,4],[8800,4],[10180,4],[11063,4],[11573,4],[11724,4],[12111,4],[12192,4],[12276,4],[12355,4],[12364,4],[12738,4],[13125,4],[13379,4],[13413,4],[13796,4],[14089,4],[14373,4],[14973,4],[15173,4]]},"414":{"position":[[421,5]]},"415":{"position":[[22,4]]},"416":{"position":[[50,4],[366,4]]},"417":{"position":[[44,4],[137,4],[264,4],[432,5]]},"418":{"position":[[338,4]]},"419":{"position":[[478,4],[806,4],[1004,4],[1907,4]]},"421":{"position":[[449,4],[644,4]]},"424":{"position":[[114,4],[256,4],[273,4]]},"425":{"position":[[257,4],[336,4],[424,4],[499,4]]},"426":{"position":[[98,4],[221,4]]},"427":{"position":[[407,4],[565,4],[615,4],[668,4],[715,4],[994,4],[1088,4]]},"429":{"position":[[328,4],[403,4]]},"430":{"position":[[164,4],[235,4],[344,4],[585,4],[906,4],[997,4],[1044,4],[1144,5]]},"432":{"position":[[70,4],[1371,4]]},"434":{"position":[[47,4],[159,5],[374,4]]},"435":{"position":[[64,4],[373,4]]},"436":{"position":[[20,4],[142,4],[278,4]]},"437":{"position":[[247,4]]},"438":{"position":[[362,4]]},"439":{"position":[[154,5],[187,4],[473,4]]},"440":{"position":[[155,4],[353,4]]},"441":{"position":[[96,4],[345,4]]},"442":{"position":[[30,4]]},"444":{"position":[[70,4],[551,4],[685,5],[897,4]]},"445":{"position":[[311,4],[555,4],[700,4],[772,4],[800,4],[860,4],[1384,4],[1503,5]]},"446":{"position":[[679,4],[761,4],[846,4],[912,4],[962,4]]},"447":{"position":[[146,4],[303,4]]},"450":{"position":[[92,4],[444,4]]},"451":{"position":[[338,4],[436,4],[781,4],[855,4]]},"452":{"position":[[152,5]]},"453":{"position":[[157,4],[220,4],[442,4],[754,4]]},"454":{"position":[[860,4],[1027,4]]},"455":{"position":[[183,4]]},"457":{"position":[[16,4],[465,5]]},"458":{"position":[[333,4]]},"459":{"position":[[51,4],[103,4],[1195,5]]},"460":{"position":[[20,4],[667,4]]},"461":{"position":[[38,4],[1351,4]]},"463":{"position":[[26,5],[616,4],[917,4],[1014,4],[1109,4],[1256,4]]},"464":{"position":[[86,4],[161,4],[622,4],[802,4],[862,4],[971,4]]},"466":{"position":[[298,4],[493,4]]},"467":{"position":[[592,5]]},"468":{"position":[[290,5]]},"469":{"position":[[925,4],[1060,4]]},"470":{"position":[[141,4],[376,4]]},"473":{"position":[[46,4]]},"475":{"position":[[25,4],[145,4]]},"476":{"position":[[68,4]]},"477":{"position":[[158,4]]},"478":{"position":[[110,4]]},"479":{"position":[[278,4]]},"480":{"position":[[976,4]]},"481":{"position":[[120,4]]},"482":{"position":[[7,4],[828,6]]},"483":{"position":[[107,4],[441,5]]},"489":{"position":[[615,4],[751,4]]},"490":{"position":[[250,4]]},"491":{"position":[[182,4],[475,5],[804,4]]},"494":{"position":[[259,4],[620,5]]},"495":{"position":[[155,5],[755,4]]},"496":{"position":[[115,5],[143,4]]},"501":{"position":[[37,4],[194,4]]},"502":{"position":[[120,4],[338,4],[500,4],[542,4],[775,4],[1210,4],[1383,4]]},"503":{"position":[[221,4]]},"504":{"position":[[238,4],[372,4],[408,4],[476,4],[544,4],[614,4],[820,4],[948,4],[1011,4],[1105,4],[1213,4],[1351,4]]},"506":{"position":[[54,5],[70,4],[245,5]]},"507":{"position":[[125,4]]},"508":{"position":[[163,4]]},"509":{"position":[[59,4]]},"510":{"position":[[407,4]]},"513":{"position":[[98,4],[280,4],[334,4]]},"514":{"position":[[228,4],[360,4]]},"515":{"position":[[61,4],[136,4],[264,4],[318,4]]},"516":{"position":[[125,4],[363,4]]},"517":{"position":[[1,4],[146,4]]},"518":{"position":[[48,4],[234,4],[375,5]]},"519":{"position":[[157,4],[240,4]]},"520":{"position":[[240,4],[492,5]]},"521":{"position":[[537,4]]},"523":{"position":[[68,4],[182,4]]},"524":{"position":[[354,4],[515,4],[612,4]]},"525":{"position":[[270,4],[451,4]]},"526":{"position":[[21,4],[77,5],[97,4],[265,4]]},"527":{"position":[[204,4]]},"529":{"position":[[84,4]]},"530":{"position":[[58,4],[365,4],[535,4]]},"533":{"position":[[76,4],[258,4]]},"534":{"position":[[212,4],[323,4],[375,4],[461,4],[584,4]]},"535":{"position":[[1023,4]]},"540":{"position":[[35,4]]},"541":{"position":[[157,4],[849,4]]},"542":{"position":[[986,4]]},"544":{"position":[[61,4],[112,4],[243,4],[265,4],[303,4]]},"545":{"position":[[202,4]]},"550":{"position":[[109,5],[191,4],[335,4]]},"551":{"position":[[53,5],[244,4],[491,4]]},"554":{"position":[[1312,4]]},"555":{"position":[[50,4],[252,4],[372,5],[401,4],[609,5],[625,4],[684,5],[992,4]]},"556":{"position":[[961,5],[1216,4],[1666,4],[1695,4],[1796,4]]},"557":{"position":[[508,4]]},"559":{"position":[[178,5],[1037,5],[1146,4],[1381,5],[1637,5],[1649,4]]},"560":{"position":[[262,4],[324,4]]},"561":{"position":[[6,4]]},"562":{"position":[[872,4],[1273,4],[1670,4]]},"564":{"position":[[72,4],[965,4],[1120,4]]},"565":{"position":[[40,4]]},"566":{"position":[[454,4],[605,4],[642,4],[705,5],[764,5],[1297,4]]},"567":{"position":[[700,4],[1001,4],[1195,4]]},"569":{"position":[[729,5]]},"570":{"position":[[285,4],[477,4],[690,4]]},"571":{"position":[[158,4],[176,4],[246,4],[327,4],[1534,4]]},"574":{"position":[[300,4],[479,4],[504,4],[618,4]]},"575":{"position":[[304,4],[348,4],[461,4]]},"576":{"position":[[134,4],[371,4],[418,4]]},"580":{"position":[[89,4]]},"581":{"position":[[111,4],[360,4]]},"582":{"position":[[43,4]]},"584":{"position":[[144,4]]},"585":{"position":[[25,5]]},"586":{"position":[[84,5],[95,4]]},"589":{"position":[[72,4]]},"590":{"position":[[329,4],[625,4],[902,4]]},"593":{"position":[[76,4],[258,4]]},"594":{"position":[[210,4],[321,4],[373,4],[459,4],[582,4]]},"595":{"position":[[392,4],[1100,4],[1353,4]]},"600":{"position":[[35,4],[169,4]]},"601":{"position":[[62,4],[830,4]]},"602":{"position":[[166,4]]},"604":{"position":[[61,4],[112,4],[151,4],[215,4],[256,4]]},"605":{"position":[[202,4]]},"610":{"position":[[269,4],[392,4],[665,4],[1056,6]]},"611":{"position":[[181,4],[263,4],[452,4]]},"612":{"position":[[347,4],[1605,4],[2016,6],[2074,6],[2105,6]]},"613":{"position":[[180,4],[224,4],[311,4]]},"614":{"position":[[353,4]]},"616":{"position":[[48,4],[103,4],[124,4],[271,4],[408,4],[592,4],[690,4],[784,4],[1187,4]]},"617":{"position":[[1305,4]]},"618":{"position":[[607,4],[702,5]]},"621":{"position":[[163,4],[451,4]]},"622":{"position":[[150,4]]},"624":{"position":[[1258,4]]},"626":{"position":[[770,5]]},"630":{"position":[[243,4],[697,5],[967,4]]},"631":{"position":[[293,4],[358,4],[449,4]]},"632":{"position":[[276,5],[497,4]]},"635":{"position":[[483,4]]},"636":{"position":[[155,4],[252,4]]},"638":{"position":[[14,4],[884,4]]},"639":{"position":[[7,4]]},"640":{"position":[[415,5]]},"641":{"position":[[18,4]]},"642":{"position":[[147,4]]},"643":{"position":[[194,4]]},"644":{"position":[[230,4],[528,4]]},"659":{"position":[[113,5],[313,5],[736,4],[991,4]]},"660":{"position":[[314,4],[365,4],[404,4]]},"661":{"position":[[1704,4],[1750,4]]},"662":{"position":[[474,4],[575,4],[669,4]]},"664":{"position":[[0,4]]},"685":{"position":[[119,4],[275,4],[594,4]]},"686":{"position":[[380,4],[431,4],[539,4],[930,4]]},"688":{"position":[[324,4],[944,4]]},"689":{"position":[[486,4]]},"690":{"position":[[92,4],[332,4]]},"691":{"position":[[195,4]]},"693":{"position":[[644,5]]},"696":{"position":[[8,4],[299,5],[622,4],[769,5],[981,4],[1574,4],[1936,5]]},"697":{"position":[[6,4],[146,4],[259,5],[345,5],[577,4]]},"698":{"position":[[3042,4]]},"700":{"position":[[717,4]]},"701":{"position":[[581,4],[626,4]]},"702":{"position":[[67,4]]},"703":{"position":[[65,4],[587,4],[739,4],[925,5],[1484,4]]},"704":{"position":[[497,4]]},"705":{"position":[[483,5],[682,4],[958,5]]},"707":{"position":[[496,5]]},"709":{"position":[[209,4],[790,4]]},"710":{"position":[[547,4]]},"711":{"position":[[147,4],[352,4],[590,5],[678,5],[1705,4],[2064,4],[2146,4]]},"714":{"position":[[47,4],[204,5],[242,4],[707,4],[894,4]]},"716":{"position":[[127,5],[373,5]]},"720":{"position":[[26,4],[250,4]]},"723":{"position":[[356,4],[437,4],[1276,4],[1814,4]]},"724":{"position":[[787,4]]},"736":{"position":[[158,5],[390,4]]},"737":{"position":[[145,4]]},"749":{"position":[[3324,5],[11908,4],[11985,4],[12091,4],[13325,4],[16583,4],[16750,4],[21898,4]]},"751":{"position":[[316,4],[378,5],[581,4],[992,4],[1087,4],[1683,4]]},"752":{"position":[[183,4]]},"754":{"position":[[605,4],[653,5]]},"759":{"position":[[1117,4],[1281,4],[1377,4]]},"764":{"position":[[51,4]]},"766":{"position":[[26,4],[154,4]]},"767":{"position":[[29,4]]},"772":{"position":[[59,4],[1144,4],[1333,4],[1965,4]]},"773":{"position":[[114,4],[217,4],[240,4]]},"774":{"position":[[93,5],[176,4],[235,4]]},"775":{"position":[[85,4]]},"778":{"position":[[88,5]]},"779":{"position":[[311,4],[379,4]]},"780":{"position":[[653,4]]},"781":{"position":[[78,5],[113,4],[708,4],[878,4]]},"782":{"position":[[342,5],[358,4]]},"784":{"position":[[74,4],[223,4],[764,4]]},"785":{"position":[[1,4],[378,4],[581,4],[716,4]]},"786":{"position":[[30,4]]},"792":{"position":[[370,5]]},"798":{"position":[[253,4],[288,4],[521,5]]},"800":{"position":[[699,4],[924,5]]},"801":{"position":[[294,4],[387,4],[637,4]]},"802":{"position":[[829,4]]},"806":{"position":[[528,4]]},"816":{"position":[[116,4]]},"820":{"position":[[696,4]]},"821":{"position":[[626,4]]},"826":{"position":[[16,4]]},"829":{"position":[[2180,5],[2800,4]]},"832":{"position":[[182,4]]},"835":{"position":[[841,4],[1069,5]]},"836":{"position":[[759,4],[1479,4],[1576,4],[1768,4],[1855,4],[1937,4],[2124,4],[2276,4],[2430,4]]},"838":{"position":[[497,4],[830,4],[1031,4],[1131,4],[1251,4],[3368,4]]},"839":{"position":[[277,4],[960,4],[1264,4]]},"840":{"position":[[62,4]]},"841":{"position":[[949,4],[1375,5],[1480,4]]},"856":{"position":[[205,4]]},"860":{"position":[[261,4],[353,4]]},"861":{"position":[[2277,4]]},"865":{"position":[[97,4]]},"875":{"position":[[1804,4],[3434,4],[7110,4]]},"880":{"position":[[23,4]]},"882":{"position":[[248,5]]},"885":{"position":[[333,4]]},"886":{"position":[[1440,4],[2264,5]]},"887":{"position":[[188,4]]},"890":{"position":[[503,4]]},"897":{"position":[[483,4]]},"901":{"position":[[148,4],[777,4]]},"902":{"position":[[53,4],[380,4],[449,4],[723,4]]},"903":{"position":[[26,4],[162,4],[224,4],[463,4]]},"904":{"position":[[450,4]]},"908":{"position":[[168,4]]},"912":{"position":[[20,4],[123,4],[417,4],[595,4],[679,4]]},"916":{"position":[[262,4]]},"917":{"position":[[219,5],[280,4],[357,4]]},"918":{"position":[[156,5]]},"926":{"position":[[19,4]]},"927":{"position":[[29,4],[203,4]]},"930":{"position":[[51,4]]},"931":{"position":[[51,4]]},"932":{"position":[[51,4],[136,4],[468,4]]},"941":{"position":[[75,4]]},"954":{"position":[[19,4]]},"955":{"position":[[165,5],[287,5]]},"958":{"position":[[396,4]]},"961":{"position":[[145,4],[319,5]]},"962":{"position":[[637,4]]},"968":{"position":[[59,5]]},"971":{"position":[[63,4],[164,4]]},"976":{"position":[[216,5],[286,4]]},"977":{"position":[[260,4],[349,4],[460,4]]},"981":{"position":[[973,4],[1033,4],[1159,4],[1454,4]]},"986":{"position":[[622,4],[1169,4]]},"988":{"position":[[1721,4],[1955,4],[1967,4],[4987,4]]},"990":{"position":[[347,4],[447,4],[659,5]]},"995":{"position":[[88,4]]},"1004":{"position":[[208,4],[250,5],[351,4],[419,4],[558,5],[705,5]]},"1005":{"position":[[81,4]]},"1007":{"position":[[771,5],[986,4]]},"1009":{"position":[[104,4]]},"1014":{"position":[[247,4],[386,4]]},"1015":{"position":[[223,4]]},"1018":{"position":[[120,4],[168,4],[236,4],[418,4],[687,4],[871,4]]},"1020":{"position":[[294,4]]},"1021":{"position":[[106,4],[132,5]]},"1023":{"position":[[51,4]]},"1024":{"position":[[24,4],[138,4],[257,6],[522,5]]},"1033":{"position":[[157,5],[1047,4]]},"1042":{"position":[[21,4],[71,4]]},"1043":{"position":[[52,5]]},"1048":{"position":[[612,5]]},"1051":{"position":[[24,4]]},"1063":{"position":[[36,4]]},"1067":{"position":[[97,4],[722,4],[863,5],[1100,4],[1864,4]]},"1068":{"position":[[401,4]]},"1072":{"position":[[335,5],[577,4],[729,4],[1000,5],[2134,4],[2288,4]]},"1078":{"position":[[101,5]]},"1085":{"position":[[65,4],[489,4],[713,5],[1081,4],[1526,4],[2970,4],[3378,4]]},"1088":{"position":[[500,4]]},"1092":{"position":[[199,4],[302,4]]},"1100":{"position":[[145,4]]},"1101":{"position":[[73,4]]},"1102":{"position":[[57,4],[242,4]]},"1104":{"position":[[49,4],[168,4],[336,4],[357,5],[399,4],[426,4],[795,4]]},"1105":{"position":[[152,4],[502,4],[1136,4],[1177,4],[1234,4]]},"1106":{"position":[[298,4]]},"1108":{"position":[[712,4]]},"1115":{"position":[[9,4]]},"1116":{"position":[[105,5],[204,4],[328,4]]},"1120":{"position":[[121,4]]},"1121":{"position":[[19,4],[117,4]]},"1124":{"position":[[492,4],[2043,4],[2140,4]]},"1126":{"position":[[864,4]]},"1132":{"position":[[238,4],[354,4],[395,4],[497,5],[643,4],[717,4],[1018,4],[1078,4],[1248,5],[1290,5],[1454,4],[1505,4]]},"1140":{"position":[[77,4],[263,4]]},"1143":{"position":[[266,4]]},"1147":{"position":[[19,4],[336,4]]},"1149":{"position":[[222,4]]},"1150":{"position":[[89,4],[625,4]]},"1156":{"position":[[176,4]]},"1157":{"position":[[313,4],[541,4]]},"1161":{"position":[[140,4]]},"1162":{"position":[[320,4],[473,4],[628,4]]},"1170":{"position":[[36,4],[124,4],[215,4]]},"1171":{"position":[[172,4],[356,4]]},"1172":{"position":[[144,4]]},"1173":{"position":[[70,5]]},"1174":{"position":[[127,4],[299,4],[604,5]]},"1180":{"position":[[140,4],[324,4]]},"1181":{"position":[[65,4],[407,4],[560,4],[616,4],[716,4]]},"1184":{"position":[[143,4]]},"1191":{"position":[[249,5],[311,4]]},"1192":{"position":[[299,4],[443,4],[575,4]]},"1207":{"position":[[611,4],[682,4],[713,4]]},"1208":{"position":[[250,5],[1288,4]]},"1213":{"position":[[333,4]]},"1214":{"position":[[412,4],[806,5]]},"1215":{"position":[[681,4]]},"1222":{"position":[[511,4],[638,4],[926,5]]},"1237":{"position":[[70,4],[241,4],[384,5],[472,4]]},"1238":{"position":[[116,4]]},"1239":{"position":[[161,4],[288,4],[320,4],[396,4]]},"1241":{"position":[[27,4],[44,4]]},"1242":{"position":[[43,4]]},"1246":{"position":[[1424,4],[1560,4]]},"1253":{"position":[[43,4]]},"1260":{"position":[[14,4]]},"1270":{"position":[[163,4]]},"1276":{"position":[[278,4]]},"1282":{"position":[[106,4],[206,4]]},"1292":{"position":[[570,4]]},"1294":{"position":[[221,4]]},"1295":{"position":[[1486,4]]},"1296":{"position":[[89,4],[215,4]]},"1299":{"position":[[129,4]]},"1300":{"position":[[60,4],[175,4]]},"1301":{"position":[[300,5],[397,4],[839,4]]},"1304":{"position":[[183,4],[389,4],[1715,4],[1766,4]]},"1305":{"position":[[735,4],[785,5],[822,4]]},"1311":{"position":[[1267,4]]},"1314":{"position":[[106,5]]},"1315":{"position":[[856,4]]},"1316":{"position":[[31,4],[3297,4],[3340,4],[3830,4]]},"1318":{"position":[[985,5]]},"1319":{"position":[[47,5],[239,5],[367,5],[413,4]]},"1324":{"position":[[280,4],[1009,4]]}},"keywords":{}}],["data"",{"_index":2727,"title":{},"content":{"412":{"position":[[8133,12]]}},"keywords":{}}],["data'",{"_index":2294,"title":{},"content":{"393":{"position":[[563,6]]}},"keywords":{}}],["data._delet",{"_index":5714,"title":{},"content":{"1048":{"position":[[583,13]]}},"keywords":{}}],["data.ag",{"_index":5713,"title":{},"content":{"1048":{"position":[[569,8]]}},"keywords":{}}],["data.attach",{"_index":6031,"title":{},"content":{"1132":{"position":[[1328,17]]}},"keywords":{}}],["data.bas",{"_index":3296,"title":{},"content":{"535":{"position":[[371,10]]}},"keywords":{}}],["data.checkpoint",{"_index":5012,"title":{},"content":{"875":{"position":[[3512,15]]}},"keywords":{}}],["data.docu",{"_index":5011,"title":{},"content":{"875":{"position":[[3484,15]]}},"keywords":{}}],["data.high",{"_index":2066,"title":{},"content":{"358":{"position":[[714,9]]}},"keywords":{}}],["data.nosql",{"_index":1213,"title":{},"content":{"174":{"position":[[430,10]]}},"keywords":{}}],["data.optim",{"_index":3526,"title":{},"content":{"590":{"position":[[575,13]]}},"keywords":{}}],["data.p",{"_index":1390,"title":{},"content":{"212":{"position":[[508,9]]}},"keywords":{}}],["data.sqlit",{"_index":1964,"title":{},"content":{"336":{"position":[[401,11]]},"581":{"position":[[405,11]]}},"keywords":{}}],["data.when",{"_index":5845,"title":{},"content":{"1083":{"position":[[254,9]]}},"keywords":{}}],["data:"",{"_index":3558,"title":{},"content":{"610":{"position":[[1043,12]]}},"keywords":{}}],["dataar",{"_index":4633,"title":{},"content":{"795":{"position":[[160,8]]}},"keywords":{}}],["databas",{"_index":33,"title":{"51":{"position":[[9,8]]},"62":{"position":[[28,8]]},"67":{"position":[[8,9]]},"69":{"position":[[26,10]]},"85":{"position":[[30,9]]},"87":{"position":[[8,8]]},"89":{"position":[[37,8]]},"91":{"position":[[8,9]]},"96":{"position":[[14,8]]},"98":{"position":[[8,9]]},"100":{"position":[[26,10]]},"115":{"position":[[10,8]]},"117":{"position":[[14,9]]},"118":{"position":[[22,8]]},"126":{"position":[[23,8]]},"145":{"position":[[25,8]]},"171":{"position":[[26,8]]},"172":{"position":[[20,10]]},"173":{"position":[[9,8]]},"174":{"position":[[24,8]]},"176":{"position":[[10,8]]},"178":{"position":[[14,9]]},"179":{"position":[[22,8]]},"186":{"position":[[23,8]]},"199":{"position":[[29,8]]},"200":{"position":[[43,8]]},"213":{"position":[[25,9]]},"219":{"position":[[6,8]]},"223":{"position":[[26,8]]},"225":{"position":[[8,9]]},"258":{"position":[[9,10]]},"264":{"position":[[24,9]]},"268":{"position":[[24,8]]},"271":{"position":[[34,8]]},"278":{"position":[[78,9]]},"319":{"position":[[10,8]]},"321":{"position":[[14,9]]},"322":{"position":[[22,8]]},"331":{"position":[[22,8]]},"334":{"position":[[27,9]]},"348":{"position":[[11,10]]},"349":{"position":[[15,9]]},"355":{"position":[[32,10]]},"358":{"position":[[9,8]]},"359":{"position":[[21,8]]},"363":{"position":[[12,8]]},"364":{"position":[[18,10]]},"369":{"position":[[10,8]]},"372":{"position":[[23,9]]},"374":{"position":[[16,8],[56,8]]},"375":{"position":[[19,10]]},"389":{"position":[[13,8]]},"390":{"position":[[17,10]]},"394":{"position":[[21,8]]},"398":{"position":[[21,8]]},"404":{"position":[[51,10]]},"443":{"position":[[7,8],[26,8]]},"444":{"position":[[21,10]]},"445":{"position":[[45,8]]},"472":{"position":[[28,8]]},"473":{"position":[[22,10]]},"479":{"position":[[38,8]]},"482":{"position":[[22,8]]},"489":{"position":[[6,9]]},"499":{"position":[[10,8]]},"501":{"position":[[34,8]]},"512":{"position":[[10,8]]},"513":{"position":[[33,9]]},"520":{"position":[[21,8]]},"532":{"position":[[10,8]]},"538":{"position":[[9,8]]},"554":{"position":[[20,8]]},"568":{"position":[[19,9]]},"570":{"position":[[10,8]]},"573":{"position":[[10,8]]},"574":{"position":[[28,9]]},"575":{"position":[[22,8]]},"576":{"position":[[19,8]]},"579":{"position":[[30,9]]},"592":{"position":[[10,8]]},"598":{"position":[[9,8]]},"653":{"position":[[9,8]]},"657":{"position":[[10,8]]},"658":{"position":[[0,8]]},"702":{"position":[[31,9]]},"706":{"position":[[9,8]]},"707":{"position":[[0,9]]},"708":{"position":[[12,9]]},"750":{"position":[[8,8]]},"757":{"position":[[31,8]]},"771":{"position":[[8,8]]},"772":{"position":[[11,9]]},"773":{"position":[[26,9]]},"775":{"position":[[6,8]]},"794":{"position":[[42,9]]},"833":{"position":[[13,8]]},"834":{"position":[[0,8]]},"851":{"position":[[0,8]]},"857":{"position":[[57,8]]},"903":{"position":[[63,9]]},"939":{"position":[[26,9]]},"1094":{"position":[[10,9]]},"1122":{"position":[[5,8]]},"1131":{"position":[[5,8]]},"1177":{"position":[[26,9]]},"1204":{"position":[[27,9]]},"1205":{"position":[[34,8]]},"1250":{"position":[[16,8]]},"1267":{"position":[[15,9]]},"1281":{"position":[[0,8]]},"1324":{"position":[[13,8]]}},"content":{"1":{"position":[[519,8]]},"2":{"position":[[322,8]]},"3":{"position":[[202,8]]},"4":{"position":[[380,8]]},"5":{"position":[[290,8]]},"6":{"position":[[485,8],[664,8]]},"7":{"position":[[193,8],[322,8],[499,8]]},"8":{"position":[[1091,8]]},"9":{"position":[[236,8]]},"10":{"position":[[274,8]]},"11":{"position":[[800,8]]},"13":{"position":[[61,9],[149,8]]},"14":{"position":[[158,10],[182,8],[237,9],[270,8],[293,8],[480,8],[662,9],[731,8]]},"15":{"position":[[171,8],[417,8]]},"17":{"position":[[60,9],[315,9],[425,8]]},"19":{"position":[[107,8]]},"20":{"position":[[26,8],[182,9]]},"22":{"position":[[218,9]]},"23":{"position":[[54,8]]},"24":{"position":[[27,8]]},"25":{"position":[[67,8],[272,9]]},"28":{"position":[[46,9]]},"29":{"position":[[27,9]]},"30":{"position":[[76,8]]},"32":{"position":[[45,8],[237,8]]},"33":{"position":[[560,8]]},"34":{"position":[[30,8],[354,9],[463,8]]},"36":{"position":[[31,8],[229,9]]},"38":{"position":[[226,9]]},"39":{"position":[[354,8]]},"40":{"position":[[321,9]]},"41":{"position":[[173,9]]},"42":{"position":[[64,8]]},"43":{"position":[[351,8],[745,8]]},"51":{"position":[[673,8],[755,8],[930,8]]},"52":{"position":[[11,8]]},"55":{"position":[[856,8]]},"56":{"position":[[119,8]]},"57":{"position":[[108,9]]},"66":{"position":[[170,10],[263,10]]},"67":{"position":[[5,9]]},"68":{"position":[[5,9]]},"69":{"position":[[13,9]]},"70":{"position":[[5,9]]},"79":{"position":[[73,8]]},"83":{"position":[[302,9]]},"87":{"position":[[25,9]]},"89":{"position":[[9,9],[47,8]]},"90":{"position":[[22,9]]},"91":{"position":[[9,9]]},"92":{"position":[[9,9]]},"93":{"position":[[171,9]]},"94":{"position":[[9,10],[201,8]]},"95":{"position":[[103,10]]},"96":{"position":[[27,8]]},"98":{"position":[[11,10],[171,9]]},"99":{"position":[[5,9],[274,9]]},"100":{"position":[[13,10],[171,9]]},"101":{"position":[[56,9],[117,10]]},"102":{"position":[[67,8]]},"105":{"position":[[67,10]]},"114":{"position":[[70,8],[498,10]]},"117":{"position":[[1,9],[233,8]]},"118":{"position":[[26,8],[130,9],[215,8]]},"120":{"position":[[23,8],[137,9]]},"126":{"position":[[23,8],[219,10]]},"128":{"position":[[303,10]]},"131":{"position":[[297,8]]},"139":{"position":[[158,9]]},"140":{"position":[[78,8]]},"144":{"position":[[99,8]]},"145":{"position":[[153,8],[196,8],[276,8]]},"148":{"position":[[20,8]]},"149":{"position":[[70,8]]},"172":{"position":[[13,8],[46,8],[258,8],[289,8]]},"173":{"position":[[48,8],[261,8],[303,9],[326,8],[445,8],[547,8],[615,8],[649,8],[1182,10],[1408,9],[1925,10],[2210,10],[2454,8],[2535,9],[2763,9],[2990,8],[3113,8]]},"174":{"position":[[37,8],[3236,8]]},"175":{"position":[[70,9],[466,8]]},"178":{"position":[[1,9],[214,8],[311,8]]},"179":{"position":[[26,8],[154,8],[324,8]]},"181":{"position":[[23,8],[94,8]]},"182":{"position":[[322,9]]},"186":{"position":[[18,8],[141,9]]},"188":{"position":[[359,8],[591,8],[848,8],[2618,8],[2638,8]]},"189":{"position":[[154,8],[342,8]]},"197":{"position":[[144,9]]},"198":{"position":[[37,8]]},"201":{"position":[[26,9]]},"202":{"position":[[25,8],[207,9]]},"203":{"position":[[19,8]]},"204":{"position":[[36,9]]},"211":{"position":[[53,8]]},"215":{"position":[[114,9]]},"216":{"position":[[10,9]]},"218":{"position":[[64,9]]},"219":{"position":[[10,9],[126,9]]},"220":{"position":[[10,9],[150,8]]},"221":{"position":[[127,9],[197,8]]},"222":{"position":[[10,10],[162,9],[338,8]]},"223":{"position":[[13,8],[140,10],[202,8]]},"224":{"position":[[10,9],[75,10]]},"225":{"position":[[11,9],[132,9]]},"226":{"position":[[5,9],[340,10]]},"227":{"position":[[5,9],[172,10]]},"228":{"position":[[17,9],[173,10]]},"229":{"position":[[40,8],[87,9]]},"232":{"position":[[277,10]]},"233":{"position":[[292,8]]},"236":{"position":[[121,8]]},"239":{"position":[[302,8]]},"241":{"position":[[387,9]]},"243":{"position":[[238,8]]},"249":{"position":[[156,9]]},"260":{"position":[[71,9]]},"262":{"position":[[92,8]]},"263":{"position":[[511,8]]},"265":{"position":[[63,8],[128,8],[185,8],[278,10],[604,10],[630,10],[742,8]]},"267":{"position":[[1166,8]]},"271":{"position":[[122,8]]},"273":{"position":[[30,8]]},"275":{"position":[[190,9],[248,8]]},"276":{"position":[[146,10]]},"278":{"position":[[37,8]]},"279":{"position":[[7,10],[367,8]]},"281":{"position":[[122,9],[367,9]]},"282":{"position":[[116,10],[203,9],[271,10]]},"285":{"position":[[236,8]]},"287":{"position":[[1111,8]]},"289":{"position":[[620,9],[1043,9]]},"291":{"position":[[143,8]]},"293":{"position":[[396,9]]},"314":{"position":[[290,8]]},"320":{"position":[[330,8]]},"322":{"position":[[26,9]]},"325":{"position":[[29,8]]},"331":{"position":[[303,8]]},"344":{"position":[[60,8]]},"346":{"position":[[17,9]]},"347":{"position":[[70,8]]},"351":{"position":[[368,8]]},"353":{"position":[[437,9]]},"354":{"position":[[643,9],[721,9],[1510,8]]},"359":{"position":[[12,9]]},"360":{"position":[[675,9]]},"362":{"position":[[12,9],[1070,9],[1141,8]]},"364":{"position":[[138,8]]},"365":{"position":[[129,8],[488,9],[511,8],[1103,8],[1248,8],[1588,8]]},"367":{"position":[[36,8],[547,9]]},"369":{"position":[[1021,9],[1474,8]]},"372":{"position":[[183,8]]},"373":{"position":[[384,8]]},"375":{"position":[[7,9],[351,9],[716,9],[851,9]]},"376":{"position":[[44,8],[352,8],[633,9]]},"377":{"position":[[157,9]]},"378":{"position":[[16,9],[53,8]]},"382":{"position":[[336,8]]},"388":{"position":[[156,8],[269,8]]},"390":{"position":[[10,8],[36,8],[314,9],[382,9],[760,8],[869,9],[1140,9],[1658,8],[1832,8]]},"391":{"position":[[50,8]]},"392":{"position":[[59,8],[1203,9],[1800,9]]},"393":{"position":[[47,9]]},"395":{"position":[[161,10]]},"396":{"position":[[1113,9]]},"397":{"position":[[344,9]]},"398":{"position":[[3482,8]]},"399":{"position":[[16,10]]},"400":{"position":[[793,8]]},"402":{"position":[[85,9]]},"404":{"position":[[20,8]]},"407":{"position":[[203,8]]},"408":{"position":[[1856,8],[3623,8],[3667,10],[4648,9]]},"410":{"position":[[229,8],[1929,8]]},"411":{"position":[[1901,8],[2178,9],[2286,8],[2421,9],[2954,8],[3651,9],[3766,9],[4161,9]]},"412":{"position":[[7215,9],[9212,8],[9497,8],[9732,8],[10883,8],[11007,8],[11162,9],[11265,8],[12447,8],[12547,8],[12821,8],[13270,9],[13464,9],[13659,8],[14209,8]]},"420":{"position":[[672,8],[1555,9]]},"422":{"position":[[75,9]]},"427":{"position":[[444,10]]},"432":{"position":[[1227,8]]},"433":{"position":[[504,8]]},"440":{"position":[[450,8]]},"444":{"position":[[8,9],[129,9],[364,9],[434,10],[576,10],[610,8],[748,10]]},"445":{"position":[[32,9],[95,10],[667,8],[1056,8],[2052,8],[2327,8]]},"447":{"position":[[8,9],[573,8]]},"452":{"position":[[49,8],[413,9]]},"454":{"position":[[527,8]]},"455":{"position":[[74,9],[241,10]]},"457":{"position":[[191,9]]},"459":{"position":[[30,8],[83,8]]},"463":{"position":[[80,10],[348,8],[833,8]]},"469":{"position":[[208,8],[409,8]]},"470":{"position":[[320,9]]},"474":{"position":[[107,9]]},"475":{"position":[[74,9]]},"476":{"position":[[289,8]]},"478":{"position":[[145,9]]},"479":{"position":[[16,9],[48,8],[526,9]]},"480":{"position":[[48,9],[342,8]]},"482":{"position":[[571,8],[1079,8]]},"483":{"position":[[24,8],[686,9],[1163,8]]},"489":{"position":[[9,8],[468,9]]},"490":{"position":[[353,8]]},"491":{"position":[[1212,9]]},"501":{"position":[[115,9]]},"502":{"position":[[48,8]]},"504":{"position":[[1164,9]]},"511":{"position":[[70,8]]},"513":{"position":[[29,9],[224,8]]},"514":{"position":[[26,9],[65,8],[127,8],[193,8]]},"515":{"position":[[88,9]]},"516":{"position":[[341,9]]},"517":{"position":[[251,9]]},"518":{"position":[[142,8]]},"520":{"position":[[19,8],[134,8],[278,8],[406,8]]},"524":{"position":[[630,9],[694,8],[985,8]]},"527":{"position":[[54,8]]},"528":{"position":[[137,9]]},"530":{"position":[[253,8]]},"531":{"position":[[70,8]]},"533":{"position":[[125,8]]},"538":{"position":[[196,8],[403,8],[485,8]]},"539":{"position":[[11,8]]},"542":{"position":[[517,8]]},"544":{"position":[[129,9]]},"551":{"position":[[83,9],[519,8]]},"554":{"position":[[1026,8]]},"555":{"position":[[24,8],[864,9]]},"556":{"position":[[175,8]]},"557":{"position":[[105,8]]},"565":{"position":[[231,8]]},"569":{"position":[[1009,10],[1277,9],[1514,9]]},"570":{"position":[[29,10],[170,8],[243,9],[489,9],[548,8],[703,10]]},"571":{"position":[[537,9],[592,8]]},"574":{"position":[[762,8],[882,8]]},"575":{"position":[[27,8],[83,8]]},"576":{"position":[[235,9]]},"584":{"position":[[77,8]]},"590":{"position":[[93,8],[191,8]]},"591":{"position":[[70,8]]},"593":{"position":[[125,8]]},"598":{"position":[[197,8],[492,8]]},"599":{"position":[[11,8]]},"604":{"position":[[129,9]]},"628":{"position":[[153,8]]},"631":{"position":[[34,8]]},"632":{"position":[[1028,9]]},"642":{"position":[[40,8]]},"647":{"position":[[17,8]]},"656":{"position":[[81,8],[130,8]]},"661":{"position":[[34,8],[784,8],[823,9],[1146,9],[1421,8]]},"662":{"position":[[33,8],[1350,8],[1580,8],[2027,8],[2090,8]]},"663":{"position":[[138,8]]},"676":{"position":[[282,9]]},"680":{"position":[[521,8]]},"682":{"position":[[71,8]]},"686":{"position":[[761,9],[824,8]]},"694":{"position":[[24,9]]},"698":{"position":[[407,9],[1041,9],[1116,9],[2320,8]]},"699":{"position":[[720,9],[781,9]]},"701":{"position":[[342,8],[437,9],[708,10]]},"702":{"position":[[181,8],[365,8],[590,9],[670,9]]},"703":{"position":[[1068,9]]},"704":{"position":[[23,8]]},"705":{"position":[[122,9],[212,9],[279,8],[383,10],[1287,8]]},"707":{"position":[[399,8]]},"708":{"position":[[124,8],[206,8],[332,8],[539,8]]},"709":{"position":[[481,8],[545,8]]},"710":{"position":[[19,8],[1118,8],[1521,8],[1669,8],[2388,8]]},"711":{"position":[[34,8],[1091,9],[1918,8]]},"712":{"position":[[26,8],[157,8]]},"715":{"position":[[128,8]]},"717":{"position":[[971,9],[1129,8]]},"718":{"position":[[632,8]]},"719":{"position":[[21,8],[90,9],[120,8],[264,8],[495,9]]},"723":{"position":[[579,9],[775,8]]},"745":{"position":[[117,8],[478,8]]},"749":{"position":[[117,8],[183,10],[281,8],[311,8],[5737,8],[6643,8],[10212,8],[12576,8],[12641,8],[24099,8]]},"753":{"position":[[109,9]]},"757":{"position":[[22,8],[140,8],[223,8]]},"759":{"position":[[479,9],[522,9],[586,8],[722,8],[1054,8],[1144,8],[1213,8],[1340,8]]},"760":{"position":[[475,9],[518,9],[582,8],[718,8]]},"761":{"position":[[156,8]]},"764":{"position":[[340,9]]},"772":{"position":[[29,8],[114,8],[511,8],[1178,9]]},"774":{"position":[[53,8],[141,8],[868,8],[949,8]]},"775":{"position":[[25,8],[158,8],[328,8],[688,9],[750,8],[796,9]]},"776":{"position":[[166,9],[209,8],[307,8],[385,8]]},"779":{"position":[[347,9]]},"781":{"position":[[658,9]]},"784":{"position":[[701,8]]},"785":{"position":[[534,9],[697,8]]},"793":{"position":[[1185,8]]},"796":{"position":[[43,10]]},"797":{"position":[[35,8]]},"800":{"position":[[12,9]]},"801":{"position":[[8,8],[131,10],[147,8]]},"802":{"position":[[60,8],[244,8],[553,8]]},"815":{"position":[[216,8]]},"825":{"position":[[324,8]]},"829":{"position":[[85,8],[104,8],[420,9],[896,9],[962,8],[1055,8],[1178,8],[1378,13],[1421,10],[1585,9],[1704,11],[3047,8]]},"830":{"position":[[209,8],[289,8]]},"832":{"position":[[113,8]]},"834":{"position":[[20,8]]},"836":{"position":[[36,8],[602,8],[740,8]]},"837":{"position":[[33,8],[92,9],[2038,8]]},"838":{"position":[[33,8],[1897,8],[2167,9],[2298,8]]},"839":{"position":[[20,8],[246,8],[1231,9]]},"840":{"position":[[30,8]]},"842":{"position":[[32,8],[272,8]]},"849":{"position":[[436,8]]},"851":{"position":[[83,10],[133,8],[213,8],[262,8]]},"854":{"position":[[82,9],[745,9]]},"857":{"position":[[90,9]]},"858":{"position":[[256,9]]},"860":{"position":[[115,8],[175,8]]},"861":{"position":[[940,8],[1031,8],[1181,8]]},"862":{"position":[[494,8]]},"872":{"position":[[730,8],[801,8],[1014,11],[1355,8],[1402,8],[2496,9],[3277,9]]},"875":{"position":[[4045,9]]},"892":{"position":[[285,9]]},"898":{"position":[[1554,8],[1602,9]]},"903":{"position":[[592,8],[734,8]]},"904":{"position":[[284,8],[351,8],[393,8]]},"908":{"position":[[125,8]]},"935":{"position":[[96,9],[144,8]]},"939":{"position":[[40,9],[91,9]]},"942":{"position":[[43,9]]},"953":{"position":[[93,8]]},"958":{"position":[[71,9],[165,8],[262,9],[738,9]]},"960":{"position":[[5,8]]},"961":{"position":[[5,8],[61,9]]},"962":{"position":[[145,9]]},"963":{"position":[[71,9]]},"964":{"position":[[67,8]]},"965":{"position":[[56,8],[124,8]]},"966":{"position":[[453,9]]},"971":{"position":[[96,9]]},"972":{"position":[[36,9],[92,8]]},"973":{"position":[[33,8]]},"975":{"position":[[43,8],[138,8],[354,8],[548,8]]},"976":{"position":[[12,9],[147,8],[177,8],[206,9],[242,8]]},"977":{"position":[[102,8],[154,8],[306,9]]},"981":{"position":[[36,8]]},"986":{"position":[[477,8]]},"989":{"position":[[279,8]]},"1007":{"position":[[1104,8]]},"1008":{"position":[[207,8]]},"1013":{"position":[[87,8],[450,8],[806,8]]},"1014":{"position":[[34,8],[309,8]]},"1015":{"position":[[34,8]]},"1058":{"position":[[191,9]]},"1065":{"position":[[1955,9],[2074,9]]},"1067":{"position":[[1878,8],[2341,9],[2360,8]]},"1068":{"position":[[119,9]]},"1069":{"position":[[28,9]]},"1071":{"position":[[23,10]]},"1072":{"position":[[152,8],[1246,8]]},"1084":{"position":[[82,9]]},"1085":{"position":[[3727,8]]},"1090":{"position":[[350,8],[924,8],[1037,9]]},"1094":{"position":[[131,8],[167,8]]},"1097":{"position":[[722,9]]},"1098":{"position":[[358,9]]},"1099":{"position":[[332,9]]},"1103":{"position":[[217,9]]},"1114":{"position":[[306,8],[694,8]]},"1118":{"position":[[286,8],[628,8]]},"1121":{"position":[[434,8]]},"1124":{"position":[[225,9],[1027,8]]},"1126":{"position":[[132,9],[341,8],[654,8]]},"1130":{"position":[[271,8]]},"1132":{"position":[[539,8],[1521,9]]},"1134":{"position":[[713,8]]},"1135":{"position":[[207,9]]},"1144":{"position":[[158,9]]},"1148":{"position":[[821,8],[1097,9]]},"1149":{"position":[[867,8]]},"1150":{"position":[[310,8]]},"1154":{"position":[[728,8]]},"1158":{"position":[[166,9]]},"1161":{"position":[[194,8]]},"1165":{"position":[[497,8],[594,8],[644,8],[958,8]]},"1171":{"position":[[385,8]]},"1174":{"position":[[467,8],[540,9],[683,8]]},"1175":{"position":[[106,8],[225,8],[286,8],[507,8],[604,8]]},"1177":{"position":[[59,9]]},"1180":{"position":[[194,8]]},"1183":{"position":[[197,9]]},"1188":{"position":[[49,8],[162,8]]},"1191":{"position":[[102,9]]},"1194":{"position":[[160,8],[264,8]]},"1198":{"position":[[110,8],[612,8],[1116,8]]},"1204":{"position":[[60,9]]},"1210":{"position":[[404,8]]},"1211":{"position":[[659,8]]},"1214":{"position":[[840,8],[923,8],[986,8]]},"1219":{"position":[[187,8],[233,8],[566,9]]},"1220":{"position":[[245,9]]},"1222":{"position":[[878,8],[1011,9],[1202,8],[1240,10],[1375,8]]},"1226":{"position":[[200,8]]},"1227":{"position":[[678,8]]},"1231":{"position":[[1009,8]]},"1238":{"position":[[59,8]]},"1246":{"position":[[1105,8],[1910,9]]},"1247":{"position":[[408,8]]},"1249":{"position":[[27,8],[255,8],[311,11]]},"1250":{"position":[[52,8],[130,8],[381,8],[502,8]]},"1251":{"position":[[95,8]]},"1253":{"position":[[18,10]]},"1264":{"position":[[122,8]]},"1265":{"position":[[666,8]]},"1267":{"position":[[128,8],[403,8],[580,10],[642,9],[736,9]]},"1271":{"position":[[1517,8]]},"1272":{"position":[[80,9]]},"1274":{"position":[[173,8]]},"1276":{"position":[[567,8]]},"1277":{"position":[[345,8]]},"1279":{"position":[[52,8]]},"1280":{"position":[[80,8]]},"1281":{"position":[[27,8]]},"1282":{"position":[[256,8]]},"1283":{"position":[[14,9]]},"1289":{"position":[[135,9]]},"1295":{"position":[[55,10],[76,8],[857,9]]},"1299":{"position":[[107,9],[435,9]]},"1300":{"position":[[636,8]]},"1301":{"position":[[166,8],[755,8],[872,9]]},"1302":{"position":[[15,8]]},"1304":{"position":[[226,9],[264,8],[483,8],[648,8]]},"1305":{"position":[[82,8],[137,9],[684,8],[931,9],[1062,9]]},"1307":{"position":[[134,9],[696,8]]},"1311":{"position":[[73,8],[1420,8]]},"1313":{"position":[[110,8],[1005,9]]},"1314":{"position":[[187,8],[235,8]]},"1315":{"position":[[41,9],[809,8],[938,9],[1283,8],[1592,8]]},"1316":{"position":[[260,8],[631,8],[715,8],[995,8],[1231,8],[2905,8],[2974,8],[3725,8]]},"1317":{"position":[[85,9]]},"1318":{"position":[[12,10]]},"1320":{"position":[[25,8],[746,8]]},"1321":{"position":[[183,8]]},"1324":{"position":[[20,9],[518,9],[694,9]]}},"keywords":{}}],["database"",{"_index":1442,"title":{},"content":{"243":{"position":[[45,14],[124,14],[167,14],[382,14],[414,14],[963,14],[995,14]]},"244":{"position":[[300,14],[366,14],[548,14],[660,14],[815,14],[853,14],[890,14],[944,14],[1008,14],[1542,14]]},"570":{"position":[[861,15]]},"571":{"position":[[1880,14]]}},"keywords":{}}],["database'",{"_index":1020,"title":{},"content":{"96":{"position":[[214,10]]},"205":{"position":[[33,10]]},"212":{"position":[[156,10]]},"636":{"position":[[381,10]]}},"keywords":{}}],["database'?"",{"_index":2193,"title":{},"content":{"390":{"position":[[652,18]]}},"keywords":{}}],["database(",{"_index":2670,"title":{},"content":{"412":{"position":[[2555,12]]}},"keywords":{}}],["database.addcollect",{"_index":5377,"title":{},"content":{"955":{"position":[[213,26]]}},"keywords":{}}],["database.addst",{"_index":5984,"title":{},"content":{"1114":{"position":[[838,20]]},"1118":{"position":[[771,20]]},"1121":{"position":[[551,20]]}},"keywords":{}}],["database.addstate('mynamepsac",{"_index":5987,"title":{},"content":{"1114":{"position":[[939,33]]}},"keywords":{}}],["database.explor",{"_index":3722,"title":{},"content":{"644":{"position":[[62,16]]},"913":{"position":[[68,16]]}},"keywords":{}}],["database.getcollection('hero",{"_index":1277,"title":{},"content":{"188":{"position":[[2768,33]]}},"keywords":{}}],["database.heroes.find",{"_index":851,"title":{},"content":{"55":{"position":[[1098,26]]}},"keywords":{}}],["database.nam",{"_index":1253,"title":{},"content":{"188":{"position":[[996,13]]}},"keywords":{}}],["database.query('select",{"_index":3807,"title":{},"content":{"661":{"position":[[1280,22]]}},"keywords":{}}],["database.stor",{"_index":4037,"title":{},"content":{"719":{"position":[[290,14]]}},"keywords":{}}],["database/storag",{"_index":3332,"title":{"549":{"position":[[38,16]]}},"content":{},"keywords":{}}],["database={database}>",{"_index":4754,"title":{},"content":{"829":{"position":[[1765,23]]}},"keywords":{}}],["databaseid",{"_index":4906,"title":{},"content":{"862":{"position":[[1212,11]]}},"keywords":{}}],["databasenam",{"_index":1255,"title":{},"content":{"188":{"position":[[1068,13],[2707,14]]},"661":{"position":[[1213,13]]},"872":{"position":[[2478,13]]},"1165":{"position":[[450,12],[754,13],[1092,13]]},"1281":{"position":[[279,13]]}},"keywords":{}}],["databaseon",{"_index":6325,"title":{},"content":{"1267":{"position":[[597,11]]}},"keywords":{}}],["databasepostinsert",{"_index":4527,"title":{},"content":{"767":{"position":[[199,18]]}},"keywords":{}}],["databasepostremov",{"_index":4551,"title":{},"content":{"769":{"position":[[173,18]]}},"keywords":{}}],["databasepostsav",{"_index":4539,"title":{},"content":{"768":{"position":[[162,16]]}},"keywords":{}}],["databaseservic",{"_index":783,"title":{},"content":{"51":{"position":[[990,16]]},"54":{"position":[[91,16]]},"130":{"position":[[395,16]]}},"keywords":{}}],["databasesus",{"_index":3337,"title":{},"content":{"551":{"position":[[70,12]]}},"keywords":{}}],["databasesync",{"_index":6332,"title":{},"content":{"1271":{"position":[[1370,12]]},"1275":{"position":[[270,12]]}},"keywords":{}}],["databases—rel",{"_index":2068,"title":{},"content":{"358":{"position":[[836,20]]}},"keywords":{}}],["databasetwo",{"_index":6326,"title":{},"content":{"1267":{"position":[[691,11]]}},"keywords":{}}],["databaseurl",{"_index":4867,"title":{},"content":{"854":{"position":[[280,12]]},"1148":{"position":[[973,12]]}},"keywords":{}}],["databuilt",{"_index":3403,"title":{},"content":{"559":{"position":[[889,9]]}},"keywords":{}}],["datacent",{"_index":5919,"title":{},"content":{"1093":{"position":[[154,10]]}},"keywords":{}}],["datachannel",{"_index":5274,"title":{},"content":{"911":{"position":[[302,11],[415,11]]}},"keywords":{}}],["datachannel/polyfil",{"_index":1372,"title":{},"content":{"210":{"position":[[463,23]]},"261":{"position":[[704,23]]},"904":{"position":[[2909,23]]},"911":{"position":[[547,22]]}},"keywords":{}}],["datalearn",{"_index":1911,"title":{},"content":{"318":{"position":[[441,9]]}},"keywords":{}}],["datalog",{"_index":623,"title":{},"content":{"39":{"position":[[396,8]]}},"keywords":{}}],["datapath",{"_index":5123,"title":{},"content":{"886":{"position":[[1308,9]]}},"keywords":{}}],["datarxdb",{"_index":3966,"title":{},"content":{"703":{"position":[[297,8]]}},"keywords":{}}],["dataset",{"_index":405,"title":{"696":{"position":[[25,9]]}},"content":{"24":{"position":[[504,9]]},"58":{"position":[[183,9]]},"64":{"position":[[128,8]]},"66":{"position":[[353,8]]},"138":{"position":[[198,9]]},"141":{"position":[[262,8]]},"169":{"position":[[287,8]]},"173":{"position":[[2121,8]]},"217":{"position":[[347,8]]},"265":{"position":[[778,7]]},"369":{"position":[[508,9],[571,7]]},"392":{"position":[[814,7]]},"394":{"position":[[1596,7],[1785,9]]},"396":{"position":[[1986,8]]},"398":{"position":[[3370,7]]},"408":{"position":[[759,8],[1308,8]]},"411":{"position":[[256,8],[3927,8]]},"412":{"position":[[6745,7],[7251,7],[7592,8],[12459,7]]},"432":{"position":[[388,9],[1448,9]]},"446":{"position":[[892,8]]},"574":{"position":[[547,8]]},"587":{"position":[[139,8]]},"643":{"position":[[11,8]]},"696":{"position":[[136,7]]},"723":{"position":[[194,9],[1653,8]]},"773":{"position":[[740,8]]},"775":{"position":[[509,8],[573,7]]},"1006":{"position":[[173,7]]},"1072":{"position":[[2912,9]]},"1123":{"position":[[540,8]]},"1124":{"position":[[1663,7]]},"1132":{"position":[[267,9]]},"1137":{"position":[[224,9]]},"1156":{"position":[[132,9]]},"1170":{"position":[[197,9]]},"1192":{"position":[[747,7]]},"1235":{"position":[[96,9]]},"1295":{"position":[[907,7],[1095,7]]},"1315":{"position":[[1499,7]]}},"keywords":{}}],["datasets.flex",{"_index":1225,"title":{},"content":{"174":{"position":[[2543,17]]}},"keywords":{}}],["datasets.indexeddb",{"_index":1669,"title":{},"content":{"287":{"position":[[432,18]]}},"keywords":{}}],["datasets.mani",{"_index":2903,"title":{},"content":{"430":{"position":[[670,13]]}},"keywords":{}}],["datasets​.dist",{"_index":2343,"title":{},"content":{"396":{"position":[[777,18]]}},"keywords":{}}],["datastor",{"_index":316,"title":{"19":{"position":[[4,10]]},"1092":{"position":[[7,9]]}},"content":{"19":{"position":[[58,9],[620,9],[790,9]]},"475":{"position":[[114,10]]},"630":{"position":[[588,10]]},"701":{"position":[[982,9]]},"1092":{"position":[[166,9],[323,9],[499,9]]},"1093":{"position":[[94,10]]},"1124":{"position":[[724,10]]}},"keywords":{}}],["datastore.query(post",{"_index":336,"title":{},"content":{"19":{"position":[[659,21],[831,21]]}},"keywords":{}}],["data—rath",{"_index":3112,"title":{},"content":{"477":{"position":[[290,11]]}},"keywords":{}}],["date",{"_index":1174,"title":{},"content":{"158":{"position":[[327,4]]},"185":{"position":[[191,4]]},"267":{"position":[[811,4]]},"288":{"position":[[155,4]]},"293":{"position":[[362,4]]},"316":{"position":[[370,5]]},"340":{"position":[[174,4]]},"367":{"position":[[1019,5]]},"411":{"position":[[4286,4]]},"412":{"position":[[4286,4],[6264,4]]},"504":{"position":[[1208,4]]},"602":{"position":[[511,4]]},"696":{"position":[[384,4]]},"723":{"position":[[1229,5]]},"749":{"position":[[12006,6]]},"799":{"position":[[32,4],[206,4]]},"861":{"position":[[377,5]]},"897":{"position":[[347,5]]},"904":{"position":[[1063,5]]},"1085":{"position":[[19,5],[126,6],[196,6],[315,4],[527,4],[585,4]]},"1124":{"position":[[1144,5]]}},"keywords":{}}],["date().gettim",{"_index":4102,"title":{},"content":{"739":{"position":[[722,16]]},"1048":{"position":[[475,17]]},"1085":{"position":[[3798,16]]},"1177":{"position":[[501,16]]}},"keywords":{}}],["date().toisostr",{"_index":5258,"title":{},"content":{"904":{"position":[[1240,20]]}},"keywords":{}}],["date().tojson",{"_index":3945,"title":{},"content":{"698":{"position":[[2795,16],[2863,16],[2930,16]]}},"keywords":{}}],["date().totimestr",{"_index":3607,"title":{},"content":{"612":{"position":[[2274,22]]}},"keywords":{}}],["date(olddoc.time).gettim",{"_index":4446,"title":{},"content":{"751":{"position":[[653,28],[896,28],[1755,28]]}},"keywords":{}}],["date.now",{"_index":5512,"title":{},"content":{"995":{"position":[[1747,10],[1979,11]]}},"keywords":{}}],["date.now().tostr",{"_index":1958,"title":{},"content":{"335":{"position":[[750,22]]}},"keywords":{}}],["date.toisostr",{"_index":5890,"title":{},"content":{"1085":{"position":[[553,19]]}},"keywords":{}}],["datetime.now()}"",{"_index":1282,"title":{},"content":{"188":{"position":[[2902,24]]}},"keywords":{}}],["dave",{"_index":4692,"title":{},"content":{"813":{"position":[[320,6]]}},"keywords":{}}],["day",{"_index":2724,"title":{},"content":{"412":{"position":[[7951,5]]},"419":{"position":[[14,4],[1048,4]]},"450":{"position":[[690,4]]},"697":{"position":[[195,5]]},"783":{"position":[[330,4]]},"1162":{"position":[[444,4]]},"1181":{"position":[[531,4]]},"1316":{"position":[[540,4]]}},"keywords":{}}],["db",{"_index":355,"title":{},"content":{"20":{"position":[[158,2]]},"41":{"position":[[214,2]]},"51":{"position":[[688,2],[891,3]]},"188":{"position":[[959,2],[1474,3]]},"209":{"position":[[231,2],[1273,3]]},"211":{"position":[[201,2]]},"255":{"position":[[578,2],[1604,3]]},"258":{"position":[[139,2]]},"266":{"position":[[653,2]]},"314":{"position":[[464,2],[913,3]]},"315":{"position":[[527,2],[930,3]]},"334":{"position":[[139,2],[322,2],[775,3]]},"335":{"position":[[191,2]]},"370":{"position":[[157,2]]},"392":{"position":[[332,2]]},"411":{"position":[[2024,2],[2548,2],[2652,2],[4433,2]]},"412":{"position":[[9775,2],[9951,2],[10528,3],[11223,2],[11990,2],[12603,2],[12765,3]]},"478":{"position":[[216,2]]},"480":{"position":[[357,2],[926,3]]},"482":{"position":[[602,2],[1042,3]]},"522":{"position":[[403,2]]},"538":{"position":[[418,2]]},"554":{"position":[[1041,2],[1556,3]]},"555":{"position":[[196,2]]},"562":{"position":[[156,2]]},"563":{"position":[[468,2]]},"564":{"position":[[572,2]]},"566":{"position":[[920,3]]},"579":{"position":[[331,2],[789,3]]},"580":{"position":[[366,7],[402,3],[433,2]]},"598":{"position":[[425,2],[921,3]]},"601":{"position":[[438,7],[516,2]]},"632":{"position":[[1277,2],[1885,3]]},"638":{"position":[[419,2]]},"653":{"position":[[242,2]]},"672":{"position":[[190,2]]},"673":{"position":[[196,2]]},"674":{"position":[[479,2]]},"693":{"position":[[1163,2]]},"710":{"position":[[1684,2]]},"711":{"position":[[1144,2]]},"717":{"position":[[1144,2]]},"718":{"position":[[647,2]]},"720":{"position":[[282,2]]},"734":{"position":[[469,2]]},"739":{"position":[[273,2],[567,2]]},"745":{"position":[[518,2]]},"749":{"position":[[6236,2],[6491,2]]},"759":{"position":[[349,2],[489,2]]},"760":{"position":[[485,2]]},"772":{"position":[[759,2]]},"773":{"position":[[549,2]]},"774":{"position":[[651,2]]},"793":{"position":[[1261,2]]},"829":{"position":[[628,2],[874,3],[1518,2]]},"836":{"position":[[678,2]]},"837":{"position":[[2100,2]]},"841":{"position":[[1498,3]]},"849":{"position":[[891,3],[905,8]]},"862":{"position":[[528,2]]},"872":{"position":[[1702,2],[3287,3],[3960,2]]},"898":{"position":[[2310,2]]},"904":{"position":[[703,2]]},"916":{"position":[[294,2]]},"932":{"position":[[1032,2]]},"960":{"position":[[271,2]]},"962":{"position":[[742,2]]},"968":{"position":[[496,2]]},"1085":{"position":[[3540,2]]},"1126":{"position":[[356,2],[669,2]]},"1134":{"position":[[126,2]]},"1138":{"position":[[270,2]]},"1139":{"position":[[525,2]]},"1140":{"position":[[584,2]]},"1144":{"position":[[174,2]]},"1145":{"position":[[514,2]]},"1146":{"position":[[219,2]]},"1148":{"position":[[1113,2]]},"1149":{"position":[[906,2]]},"1158":{"position":[[182,2]]},"1159":{"position":[[368,2]]},"1163":{"position":[[528,2]]},"1168":{"position":[[130,2]]},"1172":{"position":[[295,2]]},"1177":{"position":[[603,3]]},"1182":{"position":[[532,2]]},"1184":{"position":[[771,2]]},"1201":{"position":[[170,2]]},"1286":{"position":[[479,2]]},"1287":{"position":[[529,2]]},"1288":{"position":[[495,2]]}},"keywords":{}}],["db.addcollect",{"_index":780,"title":{},"content":{"51":{"position":[[829,19]]},"188":{"position":[[1180,19]]},"209":{"position":[[364,19]]},"211":{"position":[[325,19]]},"255":{"position":[[708,19]]},"259":{"position":[[7,19]]},"314":{"position":[[673,19]]},"315":{"position":[[646,19]]},"316":{"position":[[116,19]]},"334":{"position":[[561,19]]},"392":{"position":[[532,19],[1497,19]]},"480":{"position":[[473,19]]},"482":{"position":[[760,19]]},"538":{"position":[[852,19]]},"554":{"position":[[1253,19]]},"562":{"position":[[480,19]]},"564":{"position":[[699,19]]},"579":{"position":[[569,19]]},"598":{"position":[[859,19]]},"632":{"position":[[1458,19]]},"638":{"position":[[537,19]]},"639":{"position":[[300,19]]},"680":{"position":[[1139,19]]},"717":{"position":[[1599,19]]},"734":{"position":[[854,19]]},"739":{"position":[[413,19]]},"772":{"position":[[930,19]]},"829":{"position":[[727,19]]},"862":{"position":[[813,19]]},"872":{"position":[[1820,19],[4050,19]]},"898":{"position":[[2400,19]]},"904":{"position":[[797,19]]},"939":{"position":[[156,19]]},"1149":{"position":[[1009,19]]},"1158":{"position":[[297,19]]},"1231":{"position":[[1096,19]]}},"keywords":{}}],["db.all(sqlqueri",{"_index":4007,"title":{},"content":{"711":{"position":[[1576,16]]}},"keywords":{}}],["db.cities.findone().where('name').equals('tokyo').exec",{"_index":6535,"title":{},"content":{"1315":{"position":[[575,57]]}},"keywords":{}}],["db.customers.find().where('city_id').equals(citydocument.id).exec",{"_index":6537,"title":{},"content":{"1315":{"position":[[665,68]]}},"keywords":{}}],["db.execute('select",{"_index":4774,"title":{},"content":{"836":{"position":[[950,18]]}},"keywords":{}}],["db.file",{"_index":5661,"title":{},"content":{"1033":{"position":[[565,9]]}},"keywords":{}}],["db.files.addpipelin",{"_index":5660,"title":{},"content":{"1033":{"position":[[499,22]]}},"keywords":{}}],["db.folder",{"_index":5664,"title":{},"content":{"1033":{"position":[[794,11]]}},"keywords":{}}],["db.folders.addpipelin",{"_index":5663,"title":{},"content":{"1033":{"position":[[730,24]]}},"keywords":{}}],["db.hero",{"_index":1098,"title":{},"content":{"130":{"position":[[472,8]]},"143":{"position":[[435,8],[616,8]]},"335":{"position":[[255,7]]},"563":{"position":[[688,10]]},"580":{"position":[[490,7]]},"939":{"position":[[229,10]]}},"keywords":{}}],["db.hero.insert",{"_index":1957,"title":{},"content":{"335":{"position":[[729,16]]}},"keywords":{}}],["db.heroes.bulkinsert",{"_index":793,"title":{},"content":{"52":{"position":[[184,22]]},"539":{"position":[[184,22]]},"599":{"position":[[193,22]]}},"keywords":{}}],["db.heroes.find",{"_index":3226,"title":{},"content":{"502":{"position":[[921,16]]},"518":{"position":[[388,16]]},"571":{"position":[[862,16]]},"601":{"position":[[581,17]]},"602":{"position":[[240,20]]}},"keywords":{}}],["db.heroes.find().exec",{"_index":801,"title":{},"content":{"52":{"position":[[342,24]]},"539":{"position":[[342,24]]},"562":{"position":[[670,24]]},"599":{"position":[[369,24]]}},"keywords":{}}],["db.heroes.findon",{"_index":803,"title":{},"content":{"52":{"position":[[389,19],[479,19],[626,19]]},"539":{"position":[[389,19],[479,19],[626,19]]},"599":{"position":[[416,19],[506,19],[657,19]]}},"keywords":{}}],["db.heroes.insert",{"_index":788,"title":{},"content":{"52":{"position":[[90,18]]},"539":{"position":[[90,18]]},"562":{"position":[[557,18]]},"599":{"position":[[90,18]]}},"keywords":{}}],["db.human",{"_index":4903,"title":{},"content":{"862":{"position":[[885,10]]},"872":{"position":[[2521,10],[3427,9],[4532,10]]},"898":{"position":[[3393,10]]},"1149":{"position":[[1385,10]]}},"keywords":{}}],["db.humans.syncgraphql",{"_index":6278,"title":{},"content":{"1231":{"position":[[1165,25]]}},"keywords":{}}],["db.item",{"_index":2230,"title":{},"content":{"392":{"position":[[755,9]]}},"keywords":{}}],["db.j",{"_index":3488,"title":{},"content":{"579":{"position":[[161,5]]}},"keywords":{}}],["db.run("cr",{"_index":4002,"title":{},"content":{"711":{"position":[[1259,19]]}},"keywords":{}}],["db.run("insert",{"_index":4004,"title":{},"content":{"711":{"position":[[1316,19]]}},"keywords":{}}],["db.securedata.findon",{"_index":3356,"title":{},"content":{"555":{"position":[[474,23]]},"556":{"position":[[816,23]]}},"keywords":{}}],["db.securedata.insert",{"_index":3353,"title":{},"content":{"555":{"position":[[275,22]]}},"keywords":{}}],["db.serial",{"_index":4001,"title":{},"content":{"711":{"position":[[1235,15]]}},"keywords":{}}],["db.servic",{"_index":4726,"title":{},"content":{"825":{"position":[[667,16]]}},"keywords":{}}],["db.t",{"_index":3536,"title":{},"content":{"598":{"position":[[261,5]]}},"keywords":{}}],["db.task",{"_index":1346,"title":{},"content":{"209":{"position":[[658,9]]},"210":{"position":[[300,9]]},"255":{"position":[[1009,9]]},"261":{"position":[[373,9]]},"480":{"position":[[714,8]]},"481":{"position":[[678,9]]},"632":{"position":[[1751,8],[1926,8],[2246,9]]}},"keywords":{}}],["db.tasks.find",{"_index":6103,"title":{},"content":{"1158":{"position":[[682,15]]}},"keywords":{}}],["db.tasks.insert",{"_index":6100,"title":{},"content":{"1158":{"position":[[568,17]]}},"keywords":{}}],["db.temperature.insert",{"_index":4100,"title":{},"content":{"739":{"position":[[673,23]]}},"keywords":{}}],["db.todo",{"_index":5260,"title":{},"content":{"904":{"position":[[1891,9]]}},"keywords":{}}],["db.todos.insert",{"_index":5257,"title":{},"content":{"904":{"position":[[1158,17]]}},"keywords":{}}],["db.transaction('largestor",{"_index":1805,"title":{},"content":{"302":{"position":[[696,28]]}},"keywords":{}}],["db.transaction('product",{"_index":2994,"title":{},"content":{"459":{"position":[[637,26]]}},"keywords":{}}],["db.transaction([storenam",{"_index":6428,"title":{},"content":{"1294":{"position":[[828,27]]}},"keywords":{}}],["db.users.find",{"_index":4569,"title":{},"content":{"772":{"position":[[1018,15]]}},"keywords":{}}],["db.users.insert({id",{"_index":3877,"title":{},"content":{"680":{"position":[[1237,20]]}},"keywords":{}}],["db.vector",{"_index":2238,"title":{},"content":{"392":{"position":[[1758,10]]}},"keywords":{}}],["db.voxel",{"_index":5555,"title":{},"content":{"1007":{"position":[[50,10],[1413,10]]}},"keywords":{}}],["db.waitforleadership",{"_index":4094,"title":{},"content":{"739":{"position":[[471,22]]}},"keywords":{}}],["db1",{"_index":4195,"title":{},"content":{"749":{"position":[[4719,3]]},"966":{"position":[[525,3]]},"967":{"position":[[110,3],[367,3],[378,3]]}},"keywords":{}}],["db11",{"_index":4215,"title":{},"content":{"749":{"position":[[6203,4]]}},"keywords":{}}],["db12",{"_index":4216,"title":{},"content":{"749":{"position":[[6339,4]]}},"keywords":{}}],["db13",{"_index":4217,"title":{},"content":{"749":{"position":[[6458,4]]}},"keywords":{}}],["db14",{"_index":4218,"title":{},"content":{"749":{"position":[[6600,4]]}},"keywords":{}}],["db2",{"_index":4197,"title":{},"content":{"749":{"position":[[4854,3]]},"966":{"position":[[643,3]]},"967":{"position":[[228,3]]}},"keywords":{}}],["db3",{"_index":4200,"title":{},"content":{"749":{"position":[[4986,3]]}},"keywords":{}}],["db4",{"_index":4202,"title":{},"content":{"749":{"position":[[5138,3]]}},"keywords":{}}],["db5",{"_index":4203,"title":{},"content":{"749":{"position":[[5240,3]]}},"keywords":{}}],["db6",{"_index":4204,"title":{},"content":{"749":{"position":[[5352,3]]}},"keywords":{}}],["db8",{"_index":4207,"title":{},"content":{"749":{"position":[[5559,3]]}},"keywords":{}}],["db9",{"_index":4213,"title":{},"content":{"749":{"position":[[6067,3]]}},"keywords":{}}],["dblocat",{"_index":4489,"title":{},"content":{"759":{"position":[[385,11]]}},"keywords":{}}],["dbmongo",{"_index":5388,"title":{},"content":{"962":{"position":[[953,7]]}},"keywords":{}}],["dbservic",{"_index":815,"title":{},"content":{"54":{"position":[[80,10]]},"130":{"position":[[384,10]]},"825":{"position":[[650,9],[930,9]]}},"keywords":{}}],["de",{"_index":2459,"title":{},"content":{"401":{"position":[[349,2]]},"800":{"position":[[386,2]]},"1072":{"position":[[196,2]]},"1114":{"position":[[376,2]]},"1321":{"position":[[872,2]]}},"keywords":{}}],["de/flexsearch#index",{"_index":4060,"title":{},"content":{"724":{"position":[[1451,19]]}},"keywords":{}}],["de/flexsearch#search",{"_index":4065,"title":{},"content":{"724":{"position":[[1757,20]]}},"keywords":{}}],["deadlin",{"_index":3454,"title":{},"content":{"569":{"position":[[442,10]]},"699":{"position":[[970,8]]}},"keywords":{}}],["deadlock",{"_index":5658,"title":{},"content":{"1033":{"position":[[421,8],[870,8],[907,10]]}},"keywords":{}}],["deal",{"_index":931,"title":{},"content":{"65":{"position":[[1586,4]]},"169":{"position":[[268,7]]},"173":{"position":[[2102,7]]},"174":{"position":[[2524,7]]},"223":{"position":[[97,7]]},"265":{"position":[[879,7]]},"276":{"position":[[204,7]]},"279":{"position":[[322,7]]},"282":{"position":[[72,7]]},"291":{"position":[[376,4]]},"369":{"position":[[489,7]]},"372":{"position":[[272,7]]},"395":{"position":[[410,7]]},"408":{"position":[[1780,4]]},"412":{"position":[[15047,4]]},"420":{"position":[[775,4]]},"432":{"position":[[141,7]]},"508":{"position":[[138,7]]},"525":{"position":[[78,7]]},"526":{"position":[[242,7]]},"548":{"position":[[271,7]]},"608":{"position":[[269,7]]},"1319":{"position":[[164,4]]}},"keywords":{}}],["debounc",{"_index":1145,"title":{},"content":{"146":{"position":[[89,11]]}},"keywords":{}}],["debug",{"_index":598,"title":{},"content":{"38":{"position":[[893,5]]},"281":{"position":[[414,9]]},"364":{"position":[[806,9]]},"689":{"position":[[326,10]]},"729":{"position":[[399,6]]},"846":{"position":[[1431,9]]},"890":{"position":[[127,9]]},"1010":{"position":[[49,6],[218,5],[265,5]]},"1085":{"position":[[297,6],[3164,6]]},"1198":{"position":[[1137,6]]},"1202":{"position":[[438,6]]},"1282":{"position":[[618,5]]},"1305":{"position":[[309,6]]}},"keywords":{}}],["decad",{"_index":2528,"title":{},"content":{"408":{"position":[[482,6]]}},"keywords":{}}],["decemb",{"_index":317,"title":{},"content":{"19":{"position":[[7,8]]}},"keywords":{}}],["decentr",{"_index":473,"title":{},"content":{"29":{"position":[[69,13]]},"91":{"position":[[152,13]]},"289":{"position":[[656,13]]},"411":{"position":[[4866,17],[5224,13]]},"504":{"position":[[1417,13]]},"901":{"position":[[763,13]]},"903":{"position":[[268,14]]},"908":{"position":[[111,13]]}},"keywords":{}}],["decid",{"_index":1966,"title":{},"content":{"339":{"position":[[97,6]]},"412":{"position":[[128,8],[2320,7]]},"569":{"position":[[751,6]]},"590":{"position":[[852,6]]},"688":{"position":[[415,6]]},"698":{"position":[[2026,6]]},"701":{"position":[[877,6]]},"861":{"position":[[192,6]]},"1004":{"position":[[580,6]]},"1087":{"position":[[192,6]]},"1124":{"position":[[247,6],[411,6],[658,6]]}},"keywords":{}}],["decim",{"_index":2355,"title":{},"content":{"397":{"position":[[301,8]]}},"keywords":{}}],["decis",{"_index":2628,"title":{"981":{"position":[[7,9]]},"1071":{"position":[[7,10]]}},"content":{"411":{"position":[[3526,8]]},"412":{"position":[[5982,9]]},"441":{"position":[[631,9]]},"686":{"position":[[136,8]]},"1091":{"position":[[105,8]]}},"keywords":{}}],["decisions.y",{"_index":3907,"title":{},"content":{"690":{"position":[[140,13]]}},"keywords":{}}],["declar",{"_index":2942,"title":{},"content":{"445":{"position":[[1460,11]]},"674":{"position":[[267,7]]},"749":{"position":[[17924,7],[18046,7]]},"841":{"position":[[1241,11]]},"1018":{"position":[[723,7]]},"1311":{"position":[[18,7]]}},"keywords":{}}],["decod",{"_index":117,"title":{},"content":{"8":{"position":[[500,7],[610,7]]},"1213":{"position":[[281,6]]}},"keywords":{}}],["decompress",{"_index":2085,"title":{},"content":{"361":{"position":[[1053,12]]},"932":{"position":[[486,10]]}},"keywords":{}}],["decreas",{"_index":1398,"title":{"217":{"position":[[0,9]]}},"content":{"217":{"position":[[30,9]]},"311":{"position":[[114,9]]},"402":{"position":[[1638,10]]},"411":{"position":[[314,9]]},"534":{"position":[[649,10]]},"594":{"position":[[647,10]]},"639":{"position":[[167,10]]},"656":{"position":[[171,9]]},"698":{"position":[[2904,9]]},"820":{"position":[[414,9]]},"964":{"position":[[528,8]]},"966":{"position":[[387,8]]},"1093":{"position":[[414,8]]},"1094":{"position":[[604,10]]},"1124":{"position":[[1431,9]]},"1198":{"position":[[918,9]]},"1267":{"position":[[346,8]]}},"keywords":{}}],["decrypt",{"_index":1690,"title":{},"content":{"291":{"position":[[297,10]]},"315":{"position":[[1120,8]]},"412":{"position":[[13343,10]]},"555":{"position":[[147,9]]},"556":{"position":[[1315,9]]},"714":{"position":[[33,10],[229,8],[882,7]]},"716":{"position":[[400,7],[454,9]]},"723":{"position":[[2033,9]]},"971":{"position":[[142,7]]},"1038":{"position":[[99,9]]}},"keywords":{}}],["decryption.if",{"_index":3373,"title":{},"content":{"556":{"position":[[1188,13]]}},"keywords":{}}],["dedic",{"_index":1589,"title":{},"content":{"261":{"position":[[1150,9]]},"321":{"position":[[465,9]]},"390":{"position":[[1815,9]]},"520":{"position":[[268,9]]},"574":{"position":[[847,10]]},"579":{"position":[[63,9]]},"590":{"position":[[147,9]]},"1007":{"position":[[446,9]]}},"keywords":{}}],["deep",{"_index":880,"title":{},"content":{"61":{"position":[[15,4]]},"412":{"position":[[4772,4]]},"457":{"position":[[350,4]]},"875":{"position":[[5003,4]]},"1052":{"position":[[32,4],[97,4]]},"1108":{"position":[[688,4]]},"1309":{"position":[[698,4]]}},"keywords":{}}],["deepequ",{"_index":2687,"title":{},"content":{"412":{"position":[[4442,9],[4817,9]]},"1309":{"position":[[445,9],[743,9]]}},"keywords":{}}],["deepequal(a",{"_index":2694,"title":{},"content":{"412":{"position":[[4999,12]]},"1309":{"position":[[916,12]]}},"keywords":{}}],["deeper",{"_index":2123,"title":{},"content":{"369":{"position":[[24,6]]},"483":{"position":[[769,6]]},"567":{"position":[[27,6]]},"824":{"position":[[27,6]]},"839":{"position":[[167,6]]},"901":{"position":[[523,6]]}},"keywords":{}}],["deepli",{"_index":1999,"title":{},"content":{"352":{"position":[[37,6]]}},"keywords":{}}],["default",{"_index":54,"title":{"816":{"position":[[4,7]]},"1082":{"position":[[0,8]]}},"content":{"3":{"position":[[96,8]]},"298":{"position":[[855,7]]},"396":{"position":[[1954,7]]},"410":{"position":[[475,8],[1866,7]]},"411":{"position":[[4596,7],[5819,8]]},"421":{"position":[[1050,7]]},"494":{"position":[[432,7]]},"496":{"position":[[656,9],[673,7]]},"522":{"position":[[629,8],[695,8]]},"524":{"position":[[306,7]]},"559":{"position":[[787,7]]},"562":{"position":[[1582,7]]},"616":{"position":[[715,7]]},"617":{"position":[[1514,7],[1971,7]]},"635":{"position":[[201,8]]},"653":{"position":[[93,8]]},"656":{"position":[[214,8]]},"660":{"position":[[113,7]]},"681":{"position":[[4,8]]},"682":{"position":[[4,8]]},"698":{"position":[[377,7]]},"724":{"position":[[1349,8]]},"732":{"position":[[64,7]]},"746":{"position":[[4,8],[399,10],[440,8]]},"749":{"position":[[17425,7],[22910,7]]},"752":{"position":[[4,8]]},"759":{"position":[[848,9]]},"773":{"position":[[654,7]]},"815":{"position":[[238,7]]},"816":{"position":[[5,7]]},"818":{"position":[[359,8]]},"829":{"position":[[1855,7]]},"837":{"position":[[1897,7]]},"841":{"position":[[728,7]]},"854":{"position":[[1133,8]]},"886":{"position":[[488,8]]},"890":{"position":[[462,8]]},"898":{"position":[[330,8],[1113,7],[1184,7]]},"904":{"position":[[1010,8],[1645,7]]},"906":{"position":[[201,7],[1148,7]]},"907":{"position":[[4,7]]},"960":{"position":[[524,8],[590,8]]},"965":{"position":[[375,7]]},"968":{"position":[[4,8]]},"986":{"position":[[1388,8]]},"987":{"position":[[748,7]]},"988":{"position":[[620,7],[828,7],[1052,7],[1620,7]]},"995":{"position":[[871,9]]},"1002":{"position":[[4,8]]},"1066":{"position":[[4,8]]},"1082":{"position":[[1,7],[124,7],[406,8],[427,7]]},"1088":{"position":[[546,7]]},"1103":{"position":[[124,7]]},"1125":{"position":[[567,10]]},"1126":{"position":[[568,8]]},"1134":{"position":[[531,7]]},"1157":{"position":[[431,7]]},"1162":{"position":[[932,7]]},"1164":{"position":[[310,8]]},"1172":{"position":[[515,8]]},"1181":{"position":[[884,7]]},"1185":{"position":[[52,7]]},"1186":{"position":[[233,7]]},"1282":{"position":[[907,8]]},"1284":{"position":[[314,7]]},"1292":{"position":[[500,8]]},"1309":{"position":[[365,7],[959,7],[1235,7]]}},"keywords":{}}],["default).opf",{"_index":3716,"title":{},"content":{"640":{"position":[[153,14]]}},"keywords":{}}],["default:tru",{"_index":5547,"title":{},"content":{"1003":{"position":[[346,12]]}},"keywords":{}}],["default='_delet",{"_index":5460,"title":{},"content":{"988":{"position":[[2239,20]]}},"keywords":{}}],["default='servertimestamp",{"_index":4877,"title":{},"content":{"854":{"position":[[1577,27]]}},"keywords":{}}],["default='strong",{"_index":6017,"title":{},"content":{"1125":{"position":[[423,16]]}},"keywords":{}}],["default=100",{"_index":5125,"title":{},"content":{"886":{"position":[[1736,13]]},"1125":{"position":[[725,11]]}},"keywords":{}}],["default=300",{"_index":6046,"title":{},"content":{"1138":{"position":[[587,13]]}},"keywords":{}}],["default=5",{"_index":3755,"title":{},"content":{"653":{"position":[[923,10]]}},"keywords":{}}],["default=50",{"_index":6043,"title":{},"content":{"1134":{"position":[[754,12]]},"1164":{"position":[[255,12]]}},"keywords":{}}],["default=60",{"_index":3752,"title":{},"content":{"653":{"position":[[753,11]]}},"keywords":{}}],["default=60000",{"_index":4829,"title":{},"content":{"846":{"position":[[1038,14]]}},"keywords":{}}],["default=dis",{"_index":4874,"title":{},"content":{"854":{"position":[[962,18]]}},"keywords":{}}],["default=fals",{"_index":5783,"title":{},"content":{"1067":{"position":[[2458,15]]},"1164":{"position":[[1084,13]]}},"keywords":{}}],["default=on",{"_index":3749,"title":{},"content":{"653":{"position":[[467,12]]}},"keywords":{}}],["default=tru",{"_index":3756,"title":{},"content":{"653":{"position":[[1195,14],[1445,14]]},"846":{"position":[[389,14]]},"854":{"position":[[1055,14]]},"934":{"position":[[635,14]]},"988":{"position":[[1426,14]]}},"keywords":{}}],["defaultconflicthandl",{"_index":6495,"title":{},"content":{"1309":{"position":[[497,23]]}},"keywords":{}}],["defaultsasynchron",{"_index":4518,"title":{},"content":{"765":{"position":[[178,20]]}},"keywords":{}}],["defeat",{"_index":3627,"title":{},"content":{"614":{"position":[[967,7]]},"1316":{"position":[[3664,7]]}},"keywords":{}}],["defin",{"_index":590,"title":{"259":{"position":[[0,6]]}},"content":{"38":{"position":[[438,6]]},"51":{"position":[[236,6]]},"134":{"position":[[182,6]]},"135":{"position":[[270,7]]},"138":{"position":[[50,6]]},"166":{"position":[[196,8]]},"182":{"position":[[227,6]]},"194":{"position":[[126,6]]},"205":{"position":[[129,6]]},"212":{"position":[[263,6]]},"222":{"position":[[183,7]]},"252":{"position":[[159,6]]},"262":{"position":[[409,6]]},"280":{"position":[[12,8]]},"281":{"position":[[229,7]]},"360":{"position":[[708,6]]},"361":{"position":[[51,6]]},"367":{"position":[[752,6]]},"382":{"position":[[76,6]]},"392":{"position":[[1331,6]]},"398":{"position":[[1785,7]]},"403":{"position":[[451,6]]},"438":{"position":[[133,7]]},"482":{"position":[[723,6]]},"496":{"position":[[726,6]]},"527":{"position":[[104,6]]},"538":{"position":[[537,6]]},"554":{"position":[[1207,6]]},"567":{"position":[[257,8]]},"587":{"position":[[4,8]]},"590":{"position":[[644,6]]},"598":{"position":[[544,6]]},"617":{"position":[[376,7]]},"632":{"position":[[1421,6],[2296,6]]},"636":{"position":[[275,6]]},"638":{"position":[[212,7],[786,6]]},"678":{"position":[[30,7]]},"680":{"position":[[118,7]]},"688":{"position":[[392,6],[841,6]]},"715":{"position":[[15,6]]},"717":{"position":[[1305,6]]},"729":{"position":[[130,8]]},"749":{"position":[[1918,7],[2971,7],[12806,6],[17336,7],[17452,7],[17667,7],[18850,7],[19614,7]]},"751":{"position":[[1153,7]]},"759":{"position":[[1227,7],[1525,6]]},"780":{"position":[[351,7]]},"784":{"position":[[113,6]]},"788":{"position":[[13,7]]},"790":{"position":[[22,7]]},"792":{"position":[[24,7]]},"815":{"position":[[71,7],[298,8]]},"854":{"position":[[1388,7]]},"861":{"position":[[1313,6],[1899,6]]},"898":{"position":[[2028,6]]},"936":{"position":[[12,7]]},"937":{"position":[[63,6]]},"961":{"position":[[282,6]]},"988":{"position":[[2921,7]]},"1007":{"position":[[11,6]]},"1067":{"position":[[1511,7]]},"1074":{"position":[[27,6]]},"1078":{"position":[[9,6]]},"1079":{"position":[[43,7]]},"1082":{"position":[[28,7]]},"1085":{"position":[[341,6],[1136,6],[2146,7]]},"1100":{"position":[[482,6]]},"1108":{"position":[[66,7],[504,7]]},"1132":{"position":[[285,6]]},"1164":{"position":[[191,7]]},"1186":{"position":[[157,7]]},"1207":{"position":[[627,7]]},"1220":{"position":[[122,6]]}},"keywords":{}}],["defined</span>",{"_index":6185,"title":{},"content":{"1202":{"position":[[174,20]]}},"keywords":{}}],["definit",{"_index":1991,"title":{},"content":{"351":{"position":[[45,11]]},"360":{"position":[[281,12]]},"679":{"position":[[268,10]]},"700":{"position":[[158,10]]},"829":{"position":[[298,12]]},"1074":{"position":[[227,10]]}},"keywords":{}}],["deflat",{"_index":5316,"title":{},"content":{"932":{"position":[[1284,9],[1344,11]]}},"keywords":{}}],["degrad",{"_index":868,"title":{},"content":{"58":{"position":[[160,7]]},"300":{"position":[[815,7]]},"430":{"position":[[523,7]]},"587":{"position":[[182,8]]}},"keywords":{}}],["degre",{"_index":4101,"title":{},"content":{"739":{"position":[[697,8]]}},"keywords":{}}],["delay",{"_index":2126,"title":{},"content":{"369":{"position":[[1144,6]]},"394":{"position":[[1691,5]]},"407":{"position":[[428,5]]},"408":{"position":[[2344,6]]},"410":{"position":[[122,5]]},"415":{"position":[[226,8],[452,6]]},"486":{"position":[[101,6]]},"569":{"position":[[506,7]]},"571":{"position":[[290,6]]},"610":{"position":[[767,6],[1319,6]]},"630":{"position":[[157,5],[340,7]]},"632":{"position":[[1965,6]]},"801":{"position":[[527,6]]},"1119":{"position":[[160,5]]}},"keywords":{}}],["delet",{"_index":809,"title":{"684":{"position":[[0,8]]},"855":{"position":[[9,8]]},"867":{"position":[[9,8]]},"1049":{"position":[[0,9]]},"1050":{"position":[[4,8]]}},"content":{"52":{"position":[[601,6]]},"181":{"position":[[201,7]]},"305":{"position":[[587,8]]},"411":{"position":[[1269,7]]},"539":{"position":[[601,6]]},"599":{"position":[[628,6]]},"649":{"position":[[446,8]]},"653":{"position":[[419,7],[1123,7]]},"654":{"position":[[348,7],[394,7]]},"655":{"position":[[305,6],[371,7],[394,6],[466,7]]},"659":{"position":[[630,6]]},"684":{"position":[[9,6]]},"697":{"position":[[134,7],[318,7]]},"749":{"position":[[10624,7],[10739,7]]},"754":{"position":[[474,6]]},"778":{"position":[[79,8]]},"802":{"position":[[389,10]]},"826":{"position":[[652,7]]},"855":{"position":[[34,6],[95,8],[237,8]]},"861":{"position":[[1554,7],[1598,7],[1658,7],[1702,8],[2045,7],[2143,7],[2538,8]]},"862":{"position":[[1312,10],[1348,8]]},"867":{"position":[[34,6],[95,8],[232,8]]},"872":{"position":[[1159,9],[1325,7]]},"885":{"position":[[600,8],[695,8]]},"886":{"position":[[723,7],[1963,10],[2437,7],[3637,7],[4914,9]]},"887":{"position":[[643,6]]},"898":{"position":[[450,6],[506,8],[550,8],[580,7],[612,8],[661,9],[3578,6],[4442,8]]},"951":{"position":[[268,8]]},"955":{"position":[[142,6]]},"986":{"position":[[355,8],[434,8],[577,7],[1067,8],[1091,7],[1475,7]]},"988":{"position":[[1669,7],[1759,8],[1995,7],[2043,7],[2156,7],[2277,10],[3115,7]]},"999":{"position":[[29,7],[174,6],[219,6]]},"1004":{"position":[[618,8]]},"1007":{"position":[[1908,6]]},"1048":{"position":[[247,8]]},"1049":{"position":[[63,7]]},"1050":{"position":[[38,9]]},"1051":{"position":[[409,7]]},"1062":{"position":[[1,7],[70,7]]},"1102":{"position":[[1351,6]]},"1140":{"position":[[183,6]]}},"keywords":{}}],["deletedat",{"_index":5459,"title":{},"content":{"988":{"position":[[2204,11]]},"1048":{"position":[[164,9],[460,10]]}},"keywords":{}}],["deletedfield",{"_index":4879,"title":{},"content":{"855":{"position":[[296,12]]},"861":{"position":[[1908,12],[2117,15]]},"862":{"position":[[1298,13]]},"867":{"position":[[291,12]]},"886":{"position":[[1949,13],[4900,13]]},"898":{"position":[[3981,13]]},"986":{"position":[[1510,12]]},"988":{"position":[[2263,13]]}},"keywords":{}}],["deliv",{"_index":892,"title":{},"content":{"61":{"position":[[489,10]]},"267":{"position":[[357,9]]},"269":{"position":[[131,7]]},"283":{"position":[[416,10]]},"292":{"position":[[393,7]]},"317":{"position":[[248,10]]},"385":{"position":[[86,8]]},"408":{"position":[[5292,7]]},"410":{"position":[[458,8]]},"411":{"position":[[1798,10]]},"445":{"position":[[2480,10]]},"447":{"position":[[473,7]]},"483":{"position":[[56,8]]},"491":{"position":[[855,8]]},"498":{"position":[[561,7]]},"530":{"position":[[88,10]]},"570":{"position":[[319,9]]},"582":{"position":[[717,7]]},"641":{"position":[[385,8]]},"644":{"position":[[673,10]]}},"keywords":{}}],["delta",{"_index":591,"title":{},"content":{"38":{"position":[[456,5]]},"411":{"position":[[163,6]]}},"keywords":{}}],["delta"",{"_index":3943,"title":{},"content":{"698":{"position":[[2532,11]]}},"keywords":{}}],["delv",{"_index":903,"title":{},"content":{"65":{"position":[[75,5]]},"271":{"position":[[251,5]]},"278":{"position":[[176,5]]},"290":{"position":[[156,5]]},"369":{"position":[[18,5]]}},"keywords":{}}],["demand",{"_index":1623,"title":{},"content":{"267":{"position":[[1655,7]]},"351":{"position":[[61,6]]},"354":{"position":[[233,7]]},"356":{"position":[[20,6]]},"412":{"position":[[6395,7]]},"418":{"position":[[294,6]]},"435":{"position":[[356,6]]},"441":{"position":[[311,6]]},"502":{"position":[[194,7]]},"510":{"position":[[432,6]]},"574":{"position":[[724,7]]},"624":{"position":[[660,9]]},"1092":{"position":[[669,7]]}},"keywords":{}}],["demo",{"_index":1391,"title":{},"content":{"212":{"position":[[564,5]]},"394":{"position":[[1311,4]]},"480":{"position":[[18,4]]},"498":{"position":[[242,4],[273,4]]},"904":{"position":[[1202,4]]}},"keywords":{}}],["demo</h2>",{"_index":3393,"title":{},"content":{"559":{"position":[[562,15]]}},"keywords":{}}],["demonstr",{"_index":854,"title":{},"content":{"56":{"position":[[106,12]]},"523":{"position":[[224,12]]},"543":{"position":[[186,13]]},"603":{"position":[[184,13]]},"832":{"position":[[53,12]]},"906":{"position":[[308,13]]}},"keywords":{}}],["deni",{"_index":1778,"title":{},"content":{"300":{"position":[[671,4]]}},"keywords":{}}],["deno",{"_index":2931,"title":{"440":{"position":[[16,4]]},"1122":{"position":[[24,4]]},"1126":{"position":[[29,5]]}},"content":{"440":{"position":[[5,4]]},"1123":{"position":[[126,4],[161,4],[181,4],[775,4]]},"1124":{"position":[[286,4],[1226,4],[1762,4]]},"1126":{"position":[[65,4],[183,4],[483,4]]},"1247":{"position":[[452,5],[559,4]]}},"keywords":{}}],["deno.openkv(settings.openkvpath",{"_index":6019,"title":{},"content":{"1125":{"position":[[521,32]]}},"keywords":{}}],["denodeploy",{"_index":6013,"title":{},"content":{"1124":{"position":[[272,10],[1055,10]]},"1126":{"position":[[527,10]]}},"keywords":{}}],["denokv",{"_index":4616,"title":{"1123":{"position":[[8,7]]},"1125":{"position":[[10,6]]},"1126":{"position":[[10,6]]}},"content":{"793":{"position":[[373,6]]},"1123":{"position":[[1,6],[365,6],[450,6],[681,6]]},"1124":{"position":[[12,6],[36,7],[504,6],[689,6],[1004,7],[1488,6],[1571,7],[1624,6],[1826,7],[2152,6]]},"1125":{"position":[[12,6],[251,8]]},"1126":{"position":[[38,6],[328,6],[641,6]]},"1247":{"position":[[428,7],[462,6]]}},"keywords":{}}],["denokvdatabas",{"_index":6021,"title":{},"content":{"1126":{"position":[[392,17],[705,17]]}},"keywords":{}}],["denomin",{"_index":6572,"title":{},"content":{"1320":{"position":[[187,12]]}},"keywords":{}}],["depend",{"_index":122,"title":{"640":{"position":[[24,9]]},"727":{"position":[[5,11]]}},"content":{"8":{"position":[[640,9]]},"59":{"position":[[1,9]]},"128":{"position":[[79,13]]},"188":{"position":[[2097,11],[2290,13]]},"273":{"position":[[185,10]]},"353":{"position":[[4,7]]},"369":{"position":[[1489,9]]},"393":{"position":[[545,9]]},"398":{"position":[[3337,9]]},"408":{"position":[[940,9]]},"411":{"position":[[5348,10]]},"417":{"position":[[375,6]]},"461":{"position":[[661,9],[1025,7],[1553,7]]},"462":{"position":[[773,9]]},"483":{"position":[[173,13]]},"489":{"position":[[546,10]]},"500":{"position":[[483,10]]},"546":{"position":[[1,9]]},"578":{"position":[[42,7]]},"606":{"position":[[1,9]]},"662":{"position":[[1238,12]]},"666":{"position":[[203,12]]},"696":{"position":[[1013,7]]},"707":{"position":[[408,7]]},"710":{"position":[[1432,12]]},"717":{"position":[[1008,7]]},"726":{"position":[[47,12]]},"727":{"position":[[35,10]]},"729":{"position":[[160,12]]},"731":{"position":[[65,10]]},"765":{"position":[[146,9]]},"798":{"position":[[413,7]]},"815":{"position":[[170,9]]},"816":{"position":[[47,9]]},"821":{"position":[[358,9],[615,7]]},"837":{"position":[[1304,12]]},"838":{"position":[[1769,12]]},"872":{"position":[[22,13]]},"875":{"position":[[7643,7]]},"898":{"position":[[11,13]]},"903":{"position":[[47,7]]},"961":{"position":[[221,9]]},"962":{"position":[[191,9],[387,9]]},"988":{"position":[[2076,7]]},"990":{"position":[[367,9]]},"1033":{"position":[[993,12]]},"1049":{"position":[[24,9]]},"1065":{"position":[[1739,6]]},"1067":{"position":[[222,9]]},"1079":{"position":[[211,9]]},"1091":{"position":[[114,7]]},"1112":{"position":[[169,12]]},"1118":{"position":[[142,9]]},"1124":{"position":[[78,9]]},"1134":{"position":[[693,9]]},"1156":{"position":[[55,12]]},"1191":{"position":[[170,9],[477,9]]},"1222":{"position":[[620,9]]},"1227":{"position":[[82,12]]},"1265":{"position":[[75,12]]},"1271":{"position":[[850,9]]},"1296":{"position":[[1220,9]]},"1304":{"position":[[188,9]]},"1307":{"position":[[539,9]]},"1321":{"position":[[351,7]]}},"keywords":{}}],["dependency:npm",{"_index":3260,"title":{},"content":{"522":{"position":[[108,14]]}},"keywords":{}}],["deploy",{"_index":1629,"title":{},"content":{"269":{"position":[[251,8]]},"569":{"position":[[761,6]]},"702":{"position":[[382,6]]},"1123":{"position":[[131,7],[186,7],[266,10]]},"1124":{"position":[[1767,6]]},"1126":{"position":[[188,6]]}},"keywords":{}}],["deprec",{"_index":77,"title":{"1198":{"position":[[29,12]]}},"content":{"5":{"position":[[99,11]]},"435":{"position":[[83,10]]},"696":{"position":[[923,11]]},"835":{"position":[[609,10]]}},"keywords":{}}],["desc",{"_index":2404,"title":{},"content":{"398":{"position":[[1140,6]]},"400":{"position":[[304,6]]}},"keywords":{}}],["descend",{"_index":2323,"title":{},"content":{"394":{"position":[[1128,10]]},"400":{"position":[[243,10],[335,10]]}},"keywords":{}}],["describ",{"_index":723,"title":{},"content":{"47":{"position":[[273,9]]},"51":{"position":[[323,10]]},"538":{"position":[[624,10]]},"598":{"position":[[631,10]]},"704":{"position":[[411,9]]},"808":{"position":[[31,9]]},"830":{"position":[[25,9]]},"831":{"position":[[424,9]]},"832":{"position":[[79,9]]},"1212":{"position":[[222,9]]},"1215":{"position":[[456,9]]},"1311":{"position":[[330,10]]},"1316":{"position":[[1482,8]]}},"keywords":{}}],["described.learn",{"_index":2866,"title":{},"content":{"422":{"position":[[390,15]]}},"keywords":{}}],["descript",{"_index":769,"title":{},"content":{"51":{"position":[[310,12]]},"538":{"position":[[611,12]]},"598":{"position":[[618,12]]},"670":{"position":[[311,12]]},"699":{"position":[[347,12]]},"829":{"position":[[3147,11]]},"1191":{"position":[[585,12]]},"1208":{"position":[[1951,11]]},"1311":{"position":[[317,12]]}},"keywords":{}}],["deseri",{"_index":3056,"title":{},"content":{"464":{"position":[[953,13]]}},"keywords":{}}],["deserv",{"_index":3214,"title":{},"content":{"498":{"position":[[731,8]]}},"keywords":{}}],["design",{"_index":310,"title":{"981":{"position":[[0,6]]},"1071":{"position":[[0,6]]}},"content":{"18":{"position":[[301,8]]},"26":{"position":[[112,8]]},"34":{"position":[[76,8]]},"39":{"position":[[14,8],[253,6]]},"47":{"position":[[122,8]]},"100":{"position":[[24,8]]},"101":{"position":[[151,8]]},"153":{"position":[[73,8]]},"172":{"position":[[119,8]]},"179":{"position":[[52,8]]},"201":{"position":[[210,6]]},"212":{"position":[[108,6]]},"222":{"position":[[41,8]]},"227":{"position":[[15,8]]},"228":{"position":[[220,8]]},"230":{"position":[[9,8]]},"238":{"position":[[42,8]]},"254":{"position":[[9,8]]},"279":{"position":[[96,6]]},"289":{"position":[[80,8]]},"298":{"position":[[343,8]]},"300":{"position":[[796,6]]},"306":{"position":[[72,7]]},"325":{"position":[[145,6]]},"327":{"position":[[70,7]]},"356":{"position":[[891,7]]},"369":{"position":[[433,8]]},"378":{"position":[[62,8]]},"380":{"position":[[16,6]]},"390":{"position":[[1667,8]]},"396":{"position":[[374,8]]},"411":{"position":[[1171,7],[5783,6]]},"432":{"position":[[194,8]]},"444":{"position":[[51,8]]},"453":{"position":[[144,8]]},"460":{"position":[[790,6]]},"520":{"position":[[470,8]]},"525":{"position":[[65,7]]},"535":{"position":[[153,8]]},"595":{"position":[[164,8]]},"612":{"position":[[125,8]]},"613":{"position":[[36,8]]},"614":{"position":[[395,8]]},"618":{"position":[[230,8]]},"623":{"position":[[618,8]]},"631":{"position":[[43,8]]},"640":{"position":[[504,6]]},"686":{"position":[[210,9]]},"691":{"position":[[682,9]]},"698":{"position":[[2297,9]]},"723":{"position":[[2452,8]]},"836":{"position":[[1834,8]]},"902":{"position":[[483,6]]},"981":{"position":[[93,8]]},"990":{"position":[[284,8]]},"1006":{"position":[[232,6]]},"1008":{"position":[[50,6]]},"1072":{"position":[[1864,6]]},"1085":{"position":[[722,7],[1831,6]]}},"keywords":{}}],["desir",{"_index":3880,"title":{},"content":{"681":{"position":[[162,7]]},"759":{"position":[[1483,8]]},"818":{"position":[[250,7]]},"854":{"position":[[951,8]]}},"keywords":{}}],["desk",{"_index":3957,"title":{},"content":{"700":{"position":[[901,4]]}},"keywords":{}}],["desktop",{"_index":524,"title":{},"content":{"33":{"position":[[518,8]]},"207":{"position":[[165,7]]},"254":{"position":[[135,7]]},"298":{"position":[[656,8]]},"299":{"position":[[429,9],[512,8],[1044,7],[1306,7]]},"384":{"position":[[313,7]]},"408":{"position":[[1042,9],[5163,7]]},"412":{"position":[[10654,7]]},"500":{"position":[[776,8]]},"595":{"position":[[1382,7]]},"630":{"position":[[294,9]]},"640":{"position":[[281,7]]},"641":{"position":[[426,8]]},"708":{"position":[[28,7]]},"1270":{"position":[[432,7]]}},"keywords":{}}],["despit",{"_index":720,"title":{},"content":{"47":{"position":[[1,7]]},"412":{"position":[[15058,7]]},"427":{"position":[[1,7]]},"435":{"position":[[9,7]]},"624":{"position":[[865,7]]},"630":{"position":[[100,7]]},"1157":{"position":[[375,7]]}},"keywords":{}}],["destin",{"_index":2245,"title":{},"content":{"392":{"position":[[2703,12],[4609,12]]},"1020":{"position":[[88,12],[416,12],[544,11]]},"1022":{"position":[[517,12]]},"1023":{"position":[[178,12]]},"1024":{"position":[[264,12]]},"1032":{"position":[[121,11]]},"1033":{"position":[[58,11],[552,12],[781,12]]}},"keywords":{}}],["destroy",{"_index":3766,"title":{},"content":{"655":{"position":[[169,7]]}},"keywords":{}}],["detail",{"_index":869,"title":{"821":{"position":[[10,8]]},"876":{"position":[[23,8]]}},"content":{"58":{"position":[[198,7]]},"306":{"position":[[59,6]]},"356":{"position":[[373,7],[452,8],[816,7]]},"387":{"position":[[154,8]]},"404":{"position":[[676,8]]},"495":{"position":[[688,7]]},"544":{"position":[[419,8]]},"550":{"position":[[252,7]]},"567":{"position":[[209,8]]},"638":{"position":[[128,8]]},"749":{"position":[[15539,7],[15673,7],[15805,7]]},"831":{"position":[[449,7]]},"1208":{"position":[[1942,8]]}},"keywords":{}}],["detect",{"_index":745,"title":{"50":{"position":[[13,9]]},"129":{"position":[[13,9]]},"908":{"position":[[9,9]]}},"content":{"50":{"position":[[109,9],[330,9]]},"129":{"position":[[21,9],[34,6],[182,9],[243,8],[292,9],[643,9]]},"134":{"position":[[296,6]]},"302":{"position":[[455,6]]},"326":{"position":[[284,9]]},"390":{"position":[[1475,10]]},"403":{"position":[[305,7]]},"412":{"position":[[1132,10],[2218,7],[4543,6],[4607,6],[4671,6],[4694,6]]},"445":{"position":[[1023,6]]},"481":{"position":[[485,9]]},"491":{"position":[[486,7],[1419,8]]},"495":{"position":[[240,6]]},"569":{"position":[[685,6]]},"611":{"position":[[1088,9]]},"635":{"position":[[152,6]]},"740":{"position":[[640,8]]},"761":{"position":[[305,9]]},"875":{"position":[[3890,10],[3932,6],[4873,6]]},"908":{"position":[[35,9]]},"956":{"position":[[146,6]]},"988":{"position":[[1006,8]]},"990":{"position":[[622,6]]},"1111":{"position":[[4,6]]},"1154":{"position":[[88,6]]},"1161":{"position":[[179,7]]},"1180":{"position":[[179,7]]},"1228":{"position":[[199,7]]},"1308":{"position":[[266,8],[364,8]]},"1309":{"position":[[65,6],[185,10],[290,6],[597,6],[620,6]]}},"keywords":{}}],["determin",{"_index":2178,"title":{},"content":{"388":{"position":[[178,9]]},"399":{"position":[[172,10]]},"634":{"position":[[513,10]]},"698":{"position":[[253,9],[581,10]]},"780":{"position":[[61,11]]},"838":{"position":[[2284,9]]},"866":{"position":[[636,10]]},"875":{"position":[[1498,10]]},"1066":{"position":[[81,9]]},"1105":{"position":[[921,9]]},"1173":{"position":[[34,9]]}},"keywords":{}}],["determinism.limit",{"_index":3897,"title":{},"content":{"689":{"position":[[203,19]]}},"keywords":{}}],["determinist",{"_index":2677,"title":{},"content":{"412":{"position":[[3318,13]]},"683":{"position":[[504,13]]},"690":{"position":[[532,13]]},"698":{"position":[[422,13],[701,14]]},"897":{"position":[[189,13]]},"986":{"position":[[70,13],[118,13]]},"1065":{"position":[[1700,13],[1796,13]]},"1079":{"position":[[555,13]]},"1115":{"position":[[736,13]]},"1266":{"position":[[941,16]]},"1316":{"position":[[1445,13],[2330,13]]}},"keywords":{}}],["deterministically.your",{"_index":3908,"title":{},"content":{"690":{"position":[[309,22]]}},"keywords":{}}],["dev",{"_index":1792,"title":{"671":{"position":[[0,3]]},"675":{"position":[[12,3]]}},"content":{"301":{"position":[[677,3]]},"346":{"position":[[663,3]]},"412":{"position":[[13236,3]]},"675":{"position":[[10,3],[125,3]]},"676":{"position":[[48,3]]},"685":{"position":[[546,3]]},"749":{"position":[[6106,3],[20929,3],[21734,3]]},"793":{"position":[[63,3]]},"899":{"position":[[323,3]]},"966":{"position":[[508,3]]}},"keywords":{}}],["develop",{"_index":196,"title":{"348":{"position":[[54,11]]},"387":{"position":[[0,9]]},"411":{"position":[[0,9]]},"446":{"position":[[33,12]]},"478":{"position":[[11,12]]}},"content":{"14":{"position":[[26,9]]},"18":{"position":[[57,7]]},"19":{"position":[[444,11]]},"27":{"position":[[77,11]]},"34":{"position":[[436,10]]},"40":{"position":[[692,10]]},"47":{"position":[[378,10]]},"65":{"position":[[128,11],[2001,10]]},"74":{"position":[[64,10]]},"75":{"position":[[14,10]]},"76":{"position":[[106,11]]},"77":{"position":[[184,12]]},"83":{"position":[[234,11],[328,10]]},"89":{"position":[[234,11]]},"94":{"position":[[163,10],[321,12]]},"104":{"position":[[67,11]]},"105":{"position":[[48,12]]},"112":{"position":[[205,11]]},"114":{"position":[[79,12],[456,10]]},"116":{"position":[[44,9],[91,10]]},"118":{"position":[[366,11]]},"148":{"position":[[495,11]]},"149":{"position":[[79,12]]},"153":{"position":[[275,10]]},"156":{"position":[[204,10]]},"159":{"position":[[133,10]]},"161":{"position":[[58,10]]},"162":{"position":[[575,12],[746,10]]},"165":{"position":[[327,10]]},"166":{"position":[[244,10]]},"167":{"position":[[135,10]]},"168":{"position":[[68,10]]},"169":{"position":[[132,10]]},"170":{"position":[[93,10],[458,10]]},"173":{"position":[[1054,11],[2363,10]]},"174":{"position":[[253,10],[576,12],[881,11],[995,10],[2821,11],[3138,10]]},"175":{"position":[[495,10]]},"177":{"position":[[39,11],[85,10],[272,10]]},"179":{"position":[[388,10]]},"182":{"position":[[212,10]]},"185":{"position":[[257,10]]},"186":{"position":[[61,10]]},"189":{"position":[[749,10]]},"192":{"position":[[318,10]]},"194":{"position":[[112,10]]},"195":{"position":[[123,10]]},"196":{"position":[[108,10]]},"198":{"position":[[207,11]]},"207":{"position":[[334,11]]},"218":{"position":[[74,10]]},"219":{"position":[[136,10]]},"221":{"position":[[137,10]]},"222":{"position":[[280,10],[370,11]]},"226":{"position":[[454,12]]},"230":{"position":[[176,10]]},"232":{"position":[[133,10]]},"235":{"position":[[52,10],[148,10]]},"241":{"position":[[674,10]]},"265":{"position":[[388,10]]},"266":{"position":[[138,10],[364,10]]},"267":{"position":[[317,10],[1189,10]]},"269":{"position":[[116,11],[436,12]]},"278":{"position":[[262,12]]},"281":{"position":[[94,9],[322,11]]},"282":{"position":[[55,12]]},"286":{"position":[[107,11]]},"288":{"position":[[94,12]]},"293":{"position":[[97,11]]},"295":{"position":[[191,10]]},"299":{"position":[[1346,10]]},"301":{"position":[[429,9]]},"318":{"position":[[219,11],[593,10]]},"331":{"position":[[22,10]]},"347":{"position":[[79,12]]},"350":{"position":[[374,9]]},"351":{"position":[[245,9]]},"352":{"position":[[69,10]]},"353":{"position":[[809,12]]},"356":{"position":[[187,10]]},"358":{"position":[[6,10]]},"362":{"position":[[230,11],[1150,12]]},"364":{"position":[[67,12],[567,10]]},"370":{"position":[[9,10],[304,12]]},"371":{"position":[[16,10]]},"373":{"position":[[696,10]]},"377":{"position":[[230,10]]},"381":{"position":[[276,10]]},"384":{"position":[[42,12]]},"387":{"position":[[5,11],[393,12]]},"392":{"position":[[5190,9]]},"404":{"position":[[580,12]]},"408":{"position":[[3504,10]]},"409":{"position":[[299,10]]},"411":{"position":[[1574,10],[1820,9],[3857,10],[5413,10]]},"412":{"position":[[437,11],[593,12],[1220,10],[2458,11],[9436,10],[9611,9],[10335,10],[15013,10]]},"419":{"position":[[158,10]]},"420":{"position":[[576,10],[733,10],[1120,10]]},"421":{"position":[[1099,10]]},"424":{"position":[[77,10],[202,10]]},"427":{"position":[[80,10]]},"434":{"position":[[100,11]]},"436":{"position":[[70,10]]},"437":{"position":[[18,11]]},"441":{"position":[[28,12],[238,10],[602,10]]},"445":{"position":[[389,11],[1328,11],[1430,10],[1746,11],[1828,10],[2007,10],[2119,12],[2169,10],[2384,11],[2424,10]]},"446":{"position":[[1293,10],[1403,11]]},"447":{"position":[[209,11],[387,10],[624,12]]},"453":{"position":[[514,11]]},"455":{"position":[[147,10]]},"500":{"position":[[44,12]]},"503":{"position":[[170,10]]},"504":{"position":[[453,10]]},"510":{"position":[[51,12],[353,10],[521,10],[642,10]]},"511":{"position":[[79,12]]},"514":{"position":[[328,10]]},"518":{"position":[[105,10]]},"521":{"position":[[244,11]]},"524":{"position":[[88,10],[566,11]]},"525":{"position":[[641,10]]},"529":{"position":[[14,10]]},"530":{"position":[[35,12],[300,10],[575,11]]},"531":{"position":[[79,12]]},"535":{"position":[[106,11],[304,10],[335,10]]},"548":{"position":[[469,12]]},"556":{"position":[[1381,12],[1474,12]]},"563":{"position":[[71,10],[906,10]]},"569":{"position":[[25,10],[1042,11]]},"591":{"position":[[79,12]]},"595":{"position":[[106,11],[317,10],[348,10]]},"608":{"position":[[467,12]]},"618":{"position":[[512,10]]},"632":{"position":[[809,10]]},"635":{"position":[[252,10]]},"644":{"position":[[374,10],[755,9]]},"662":{"position":[[296,7]]},"666":{"position":[[22,11]]},"674":{"position":[[300,14],[356,14]]},"699":{"position":[[579,7]]},"702":{"position":[[7,10]]},"711":{"position":[[2330,9]]},"731":{"position":[[24,11]]},"749":{"position":[[20950,10]]},"798":{"position":[[638,9]]},"824":{"position":[[513,12]]},"838":{"position":[[325,7]]},"839":{"position":[[708,10]]},"898":{"position":[[2948,11]]},"981":{"position":[[250,10]]},"995":{"position":[[568,10]]},"1066":{"position":[[444,9]]},"1085":{"position":[[2169,10],[3427,11]]},"1124":{"position":[[1441,11]]},"1198":{"position":[[16,10],[2003,11]]},"1215":{"position":[[7,10]]},"1249":{"position":[[177,10]]}},"keywords":{}}],["developers.optim",{"_index":1218,"title":{},"content":{"174":{"position":[[1491,20]]}},"keywords":{}}],["development"",{"_index":1499,"title":{},"content":{"244":{"position":[[737,17]]},"419":{"position":[[1574,17]]}},"keywords":{}}],["development.electron",{"_index":2168,"title":{},"content":{"384":{"position":[[268,21]]}},"keywords":{}}],["devic",{"_index":176,"title":{"291":{"position":[[8,6]]},"900":{"position":[[66,7]]},"912":{"position":[[44,7]]}},"content":{"11":{"position":[[964,8]]},"28":{"position":[[498,6]]},"65":{"position":[[1752,7]]},"89":{"position":[[78,7]]},"91":{"position":[[59,8]]},"110":{"position":[[85,8]]},"123":{"position":[[134,7]]},"172":{"position":[[327,7]]},"173":{"position":[[1988,6],[2588,7],[2846,7]]},"174":{"position":[[2079,8],[2146,7]]},"184":{"position":[[344,8]]},"191":{"position":[[266,8]]},"195":{"position":[[115,7]]},"210":{"position":[[113,7]]},"218":{"position":[[228,6]]},"220":{"position":[[81,7]]},"224":{"position":[[141,8]]},"240":{"position":[[69,8],[267,8]]},"248":{"position":[[194,6]]},"250":{"position":[[113,7]]},"253":{"position":[[199,6]]},"269":{"position":[[368,7]]},"270":{"position":[[284,6]]},"273":{"position":[[164,7]]},"279":{"position":[[528,8]]},"280":{"position":[[204,7]]},"287":{"position":[[1179,8]]},"288":{"position":[[175,7]]},"289":{"position":[[405,7],[1702,7],[1913,7]]},"291":{"position":[[19,6],[196,6]]},"294":{"position":[[134,6]]},"298":{"position":[[723,8]]},"299":{"position":[[653,7],[1106,8]]},"300":{"position":[[623,6]]},"302":{"position":[[17,6]]},"309":{"position":[[84,7]]},"310":{"position":[[13,6],[264,6]]},"311":{"position":[[54,7],[152,7]]},"314":{"position":[[990,8]]},"318":{"position":[[334,8]]},"323":{"position":[[347,6]]},"328":{"position":[[169,7]]},"365":{"position":[[642,6]]},"367":{"position":[[200,7]]},"375":{"position":[[701,8]]},"376":{"position":[[140,7],[689,8]]},"377":{"position":[[22,7],[289,6]]},"380":{"position":[[88,6]]},"391":{"position":[[112,7]]},"403":{"position":[[175,8]]},"407":{"position":[[226,7],[284,7],[1074,8]]},"408":{"position":[[114,7],[953,6]]},"410":{"position":[[394,7],[1544,7]]},"411":{"position":[[3963,6],[4092,8],[4702,8],[4732,6],[5032,6],[5058,7]]},"412":{"position":[[632,6],[3132,8],[5774,6],[7844,9],[9368,7],[9703,7],[10607,8],[10763,7],[13221,6]]},"414":{"position":[[64,7]]},"415":{"position":[[52,7]]},"416":{"position":[[250,8]]},"417":{"position":[[62,7]]},"419":{"position":[[183,7],[1023,7],[1900,6]]},"424":{"position":[[144,7]]},"444":{"position":[[233,6],[501,7],[732,8]]},"445":{"position":[[1121,8],[2268,8]]},"446":{"position":[[392,6]]},"461":{"position":[[1141,7]]},"469":{"position":[[1267,7]]},"473":{"position":[[74,7]]},"481":{"position":[[199,6]]},"482":{"position":[[1058,6]]},"495":{"position":[[127,7]]},"500":{"position":[[714,6],[762,8]]},"504":{"position":[[1055,8]]},"516":{"position":[[387,8]]},"550":{"position":[[88,6]]},"556":{"position":[[1921,6]]},"565":{"position":[[19,6]]},"569":{"position":[[1207,8]]},"570":{"position":[[357,7]]},"571":{"position":[[456,6]]},"575":{"position":[[205,8],[501,8]]},"635":{"position":[[53,7]]},"638":{"position":[[154,6]]},"660":{"position":[[226,6]]},"662":{"position":[[605,7]]},"696":{"position":[[102,7],[1098,7]]},"704":{"position":[[167,6],[270,8],[294,7]]},"708":{"position":[[298,6]]},"736":{"position":[[471,7]]},"785":{"position":[[640,6]]},"836":{"position":[[1876,7],[1930,6]]},"838":{"position":[[1146,8]]},"840":{"position":[[78,7]]},"860":{"position":[[870,8]]},"872":{"position":[[3063,7]]},"896":{"position":[[60,7]]},"902":{"position":[[409,8]]},"903":{"position":[[421,8]]},"912":{"position":[[45,7],[398,6],[621,8]]},"932":{"position":[[281,6]]},"981":{"position":[[806,7],[930,7]]},"995":{"position":[[1088,6]]},"1121":{"position":[[139,7]]},"1123":{"position":[[339,7]]},"1215":{"position":[[194,6]]},"1271":{"position":[[195,7]]},"1304":{"position":[[1135,7],[1166,7]]},"1314":{"position":[[126,6]]},"1321":{"position":[[119,6]]}},"keywords":{}}],["device.data",{"_index":1202,"title":{},"content":{"173":{"position":[[1356,11]]}},"keywords":{}}],["device.memori",{"_index":1293,"title":{},"content":{"189":{"position":[[455,13]]}},"keywords":{}}],["devicereadi",{"_index":153,"title":{},"content":{"11":{"position":[[356,11],[732,11]]}},"keywords":{}}],["devices.in",{"_index":1572,"title":{},"content":{"254":{"position":[[456,10]]}},"keywords":{}}],["devices.stor",{"_index":1223,"title":{},"content":{"174":{"position":[[2342,15]]}},"keywords":{}}],["devices.they",{"_index":6539,"title":{},"content":{"1316":{"position":[[417,12]]}},"keywords":{}}],["devmod",{"_index":3374,"title":{},"content":{"556":{"position":[[1370,7],[1401,7]]}},"keywords":{}}],["devtool",{"_index":1790,"title":{},"content":{"301":{"position":[[570,8]]}},"keywords":{}}],["dexi",{"_index":511,"title":{"1146":{"position":[[6,5]]},"1148":{"position":[[7,5]]}},"content":{"33":{"position":[[102,5],[606,5]]},"872":{"position":[[3872,7]]},"1144":{"position":[[14,5],[139,7]]},"1145":{"position":[[48,5],[343,7]]},"1147":{"position":[[156,5],[465,5]]},"1148":{"position":[[1,5],[58,5],[207,5],[439,5],[470,5],[506,5],[629,7],[660,6],[692,5],[815,5]]},"1149":{"position":[[633,5],[788,7],[885,5]]},"1150":{"position":[[276,6]]}},"keywords":{}}],["dexie.j",{"_index":508,"title":{"33":{"position":[[0,9]]},"1142":{"position":[[10,8]]},"1143":{"position":[[0,8]]},"1144":{"position":[[11,8]]},"1147":{"position":[[5,8]]}},"content":{"33":{"position":[[1,8],[310,8],[457,8],[548,8]]},"411":{"position":[[3818,8]]},"710":{"position":[[676,8]]},"749":{"position":[[23061,8]]},"793":{"position":[[356,8]]},"1143":{"position":[[7,8]]},"1146":{"position":[[1,8],[111,8],[315,8]]},"1147":{"position":[[135,8]]},"1150":{"position":[[1,8]]},"1151":{"position":[[103,8],[770,8]]},"1152":{"position":[[24,8]]},"1235":{"position":[[121,8]]},"1247":{"position":[[141,9],[156,8],[195,8]]}},"keywords":{}}],["dexie.js.it",{"_index":6068,"title":{},"content":{"1143":{"position":[[505,11]]}},"keywords":{}}],["dexie/sqlit",{"_index":4810,"title":{},"content":{"841":{"position":[[999,12]]}},"keywords":{}}],["dexiecloud",{"_index":6075,"title":{},"content":{"1148":{"position":[[644,10],[781,13]]}},"keywords":{}}],["dexiedatabase.cloud.configur",{"_index":6078,"title":{},"content":{"1148":{"position":[[941,31]]}},"keywords":{}}],["dexiedatabasenam",{"_index":6077,"title":{},"content":{"1148":{"position":[[914,18]]}},"keywords":{}}],["di",{"_index":4089,"title":{},"content":{"737":{"position":[[489,7]]}},"keywords":{}}],["diagram",{"_index":4938,"title":{},"content":{"871":{"position":[[373,7]]}},"keywords":{}}],["dialect",{"_index":6573,"title":{},"content":{"1320":{"position":[[378,7]]}},"keywords":{}}],["dialog",{"_index":1095,"title":{},"content":{"130":{"position":[[420,7]]}},"keywords":{}}],["diarydirectori",{"_index":6199,"title":{},"content":{"1208":{"position":[[787,14]]}},"keywords":{}}],["diarydirectory.getfilehandle('example.txt",{"_index":6203,"title":{},"content":{"1208":{"position":[[934,43]]}},"keywords":{}}],["dictat",{"_index":6574,"title":{},"content":{"1320":{"position":[[455,7]]}},"keywords":{}}],["didn't",{"_index":2626,"title":{},"content":{"411":{"position":[[3307,6]]},"412":{"position":[[15032,6]]},"1085":{"position":[[2396,6]]}},"keywords":{}}],["diff",{"_index":2608,"title":{},"content":{"411":{"position":[[157,5],[282,4]]},"412":{"position":[[3633,4]]}},"keywords":{}}],["differ",{"_index":65,"title":{"131":{"position":[[0,9]]},"162":{"position":[[0,9]]},"189":{"position":[[0,9]]},"287":{"position":[[0,9]]},"336":{"position":[[0,9]]},"504":{"position":[[10,9]]},"524":{"position":[[0,9]]},"581":{"position":[[0,9]]},"640":{"position":[[0,9]]},"691":{"position":[[17,9]]},"706":{"position":[[30,9]]},"798":{"position":[[4,9]]},"1215":{"position":[[0,10]]},"1273":{"position":[[32,9]]}},"content":{"4":{"position":[[135,9]]},"5":{"position":[[57,9]]},"14":{"position":[[680,10],[934,10]]},"16":{"position":[[280,9]]},"19":{"position":[[191,10],[968,10]]},"24":{"position":[[640,9]]},"35":{"position":[[126,9]]},"37":{"position":[[164,9],[243,9]]},"47":{"position":[[1338,9]]},"72":{"position":[[73,9]]},"80":{"position":[[93,9]]},"109":{"position":[[101,9]]},"112":{"position":[[66,9]]},"113":{"position":[[181,9]]},"160":{"position":[[252,9]]},"162":{"position":[[87,9],[716,9]]},"174":{"position":[[2332,9],[2863,9]]},"184":{"position":[[167,9]]},"237":{"position":[[228,9]]},"239":{"position":[[71,9],[318,9]]},"299":{"position":[[23,6],[696,6]]},"301":{"position":[[102,9]]},"328":{"position":[[47,9]]},"361":{"position":[[1009,10]]},"364":{"position":[[250,9]]},"390":{"position":[[1511,6]]},"391":{"position":[[976,9]]},"392":{"position":[[3252,9]]},"393":{"position":[[173,10]]},"396":{"position":[[822,9]]},"398":{"position":[[3056,6]]},"399":{"position":[[601,9]]},"402":{"position":[[946,9],[2638,9],[2671,9]]},"404":{"position":[[940,9],[961,9]]},"412":{"position":[[10576,9],[10597,9],[11510,9]]},"420":{"position":[[755,9]]},"445":{"position":[[2356,9]]},"449":{"position":[[41,9]]},"451":{"position":[[749,10]]},"458":{"position":[[7,10]]},"459":{"position":[[9,10]]},"462":{"position":[[287,7]]},"502":{"position":[[1234,9]]},"504":{"position":[[1225,9]]},"517":{"position":[[224,9]]},"519":{"position":[[343,9]]},"524":{"position":[[55,9]]},"525":{"position":[[301,9]]},"612":{"position":[[1330,10]]},"613":{"position":[[853,9]]},"632":{"position":[[676,9]]},"641":{"position":[[129,11]]},"666":{"position":[[444,9]]},"681":{"position":[[876,9]]},"691":{"position":[[37,9],[555,9]]},"701":{"position":[[136,9]]},"704":{"position":[[260,9],[307,9]]},"705":{"position":[[690,9]]},"719":{"position":[[136,9],[343,9]]},"730":{"position":[[60,9]]},"743":{"position":[[100,9],[265,9]]},"749":{"position":[[4784,9],[5433,9],[13442,9],[23645,9]]},"759":{"position":[[601,9]]},"760":{"position":[[597,9]]},"764":{"position":[[1,9]]},"772":{"position":[[2558,9]]},"775":{"position":[[213,9]]},"784":{"position":[[38,9]]},"796":{"position":[[273,9]]},"798":{"position":[[128,9]]},"821":{"position":[[248,9]]},"830":{"position":[[236,9]]},"831":{"position":[[198,9]]},"832":{"position":[[426,10]]},"835":{"position":[[111,10]]},"836":{"position":[[317,9]]},"849":{"position":[[313,9]]},"855":{"position":[[286,9]]},"867":{"position":[[281,9]]},"879":{"position":[[82,9]]},"886":{"position":[[4026,9]]},"890":{"position":[[661,9]]},"898":{"position":[[3939,7]]},"904":{"position":[[2039,9],[3127,10]]},"935":{"position":[[110,9]]},"938":{"position":[[95,9]]},"962":{"position":[[124,9],[234,9],[257,9]]},"968":{"position":[[92,9]]},"982":{"position":[[687,9]]},"983":{"position":[[1115,9]]},"986":{"position":[[553,9],[1451,9]]},"988":{"position":[[1793,9]]},"1008":{"position":[[263,11]]},"1009":{"position":[[462,9]]},"1020":{"position":[[169,9],[196,9]]},"1021":{"position":[[46,9]]},"1067":{"position":[[176,10],[214,7]]},"1072":{"position":[[902,10]]},"1085":{"position":[[2885,9]]},"1091":{"position":[[75,9]]},"1100":{"position":[[36,9],[440,9]]},"1102":{"position":[[181,9]]},"1105":{"position":[[297,9],[360,9],[384,9]]},"1108":{"position":[[299,9]]},"1112":{"position":[[33,9],[116,9],[263,9]]},"1120":{"position":[[576,9]]},"1125":{"position":[[666,9]]},"1140":{"position":[[308,9]]},"1165":{"position":[[265,9]]},"1191":{"position":[[7,10],[74,10],[206,9],[467,9],[609,9],[662,10]]},"1215":{"position":[[40,11]]},"1222":{"position":[[697,7]]},"1246":{"position":[[851,9]]},"1250":{"position":[[451,10]]},"1267":{"position":[[49,9]]},"1271":{"position":[[1330,9]]},"1272":{"position":[[1,9],[33,9]]},"1274":{"position":[[395,9],[419,9]]},"1279":{"position":[[782,9],[806,9]]},"1295":{"position":[[1365,9]]},"1301":{"position":[[9,10]]},"1304":{"position":[[1125,9]]},"1305":{"position":[[1002,9]]},"1307":{"position":[[62,9]]},"1315":{"position":[[751,12],[967,11]]},"1316":{"position":[[1221,9],[1980,9],[3123,10]]},"1320":{"position":[[364,9]]},"1321":{"position":[[823,9]]},"1324":{"position":[[780,9]]}},"keywords":{}}],["differenti",{"_index":2643,"title":{},"content":{"411":{"position":[[5528,13]]}},"keywords":{}}],["diffi",{"_index":5581,"title":{"1008":{"position":[[0,5]]}},"content":{},"keywords":{}}],["difficult",{"_index":485,"title":{},"content":{"29":{"position":[[445,9]]},"47":{"position":[[230,9],[950,9]]},"535":{"position":[[934,10]]},"595":{"position":[[1009,10]]},"839":{"position":[[923,9]]},"1304":{"position":[[716,10]]}},"keywords":{}}],["difficulti",{"_index":2775,"title":{},"content":{"412":{"position":[[15263,13]]},"610":{"position":[[1542,12]]}},"keywords":{}}],["digest",{"_index":5303,"title":{"927":{"position":[[0,7]]}},"content":{"927":{"position":[[55,6],[163,6]]},"968":{"position":[[658,9]]},"1004":{"position":[[369,7]]}},"keywords":{}}],["digit",{"_index":1683,"title":{},"content":{"289":{"position":[[1530,7]]},"510":{"position":[[702,7]]}},"keywords":{}}],["dimens",{"_index":2333,"title":{},"content":{"395":{"position":[[551,10]]}},"keywords":{}}],["dimension",{"_index":2181,"title":{},"content":{"390":{"position":[[105,11]]},"396":{"position":[[266,11]]},"402":{"position":[[2444,14]]}},"keywords":{}}],["direct",{"_index":1961,"title":{"616":{"position":[[21,11]]}},"content":{"336":{"position":[[185,6]]},"381":{"position":[[38,11]]},"398":{"position":[[500,11],[624,10]]},"407":{"position":[[493,6]]},"429":{"position":[[257,6]]},"433":{"position":[[76,6],[629,6]]},"460":{"position":[[974,6]]},"504":{"position":[[1344,6]]},"574":{"position":[[651,6]]},"581":{"position":[[211,6]]},"616":{"position":[[61,10]]},"714":{"position":[[733,6]]},"749":{"position":[[460,9]]},"811":{"position":[[52,6]]},"841":{"position":[[519,6]]},"871":{"position":[[675,6]]},"901":{"position":[[377,6],[715,6]]},"1002":{"position":[[777,9]]},"1006":{"position":[[89,10]]},"1033":{"position":[[1035,11]]},"1115":{"position":[[526,6]]},"1324":{"position":[[175,6]]}},"keywords":{}}],["directli",{"_index":496,"title":{},"content":{"31":{"position":[[95,8]]},"47":{"position":[[25,8],[736,8]]},"130":{"position":[[238,8]]},"131":{"position":[[216,8]]},"162":{"position":[[255,8]]},"172":{"position":[[81,8]]},"210":{"position":[[135,9]]},"212":{"position":[[633,8]]},"219":{"position":[[186,8]]},"227":{"position":[[202,8]]},"248":{"position":[[11,8]]},"261":{"position":[[179,8]]},"265":{"position":[[165,8]]},"289":{"position":[[1725,8],[1939,9]]},"315":{"position":[[1039,8]]},"352":{"position":[[118,9],[340,8]]},"358":{"position":[[95,8]]},"376":{"position":[[117,8]]},"391":{"position":[[89,8]]},"408":{"position":[[1873,8],[3375,8],[3787,8],[4154,9]]},"411":{"position":[[2265,8],[5077,8]]},"413":{"position":[[64,8]]},"416":{"position":[[498,8]]},"440":{"position":[[421,8]]},"444":{"position":[[478,8]]},"453":{"position":[[113,8],[544,8]]},"454":{"position":[[781,8]]},"463":{"position":[[304,8]]},"467":{"position":[[558,8]]},"468":{"position":[[403,8]]},"469":{"position":[[930,8]]},"470":{"position":[[188,8]]},"473":{"position":[[51,8]]},"489":{"position":[[441,8]]},"493":{"position":[[118,8]]},"521":{"position":[[17,8]]},"542":{"position":[[682,8]]},"548":{"position":[[324,9]]},"555":{"position":[[726,8]]},"560":{"position":[[562,8]]},"571":{"position":[[211,8],[780,8]]},"585":{"position":[[203,8]]},"591":{"position":[[497,8]]},"602":{"position":[[348,8]]},"608":{"position":[[322,9]]},"612":{"position":[[890,8]]},"613":{"position":[[1075,8]]},"614":{"position":[[137,8]]},"616":{"position":[[413,8]]},"620":{"position":[[98,8]]},"688":{"position":[[547,8]]},"699":{"position":[[86,8]]},"703":{"position":[[70,8]]},"724":{"position":[[1272,8]]},"772":{"position":[[1303,8]]},"773":{"position":[[119,8]]},"778":{"position":[[335,8]]},"781":{"position":[[754,8]]},"800":{"position":[[227,8]]},"829":{"position":[[3906,9]]},"836":{"position":[[774,8],[1269,8]]},"875":{"position":[[6799,8]]},"890":{"position":[[733,8]]},"896":{"position":[[68,8]]},"897":{"position":[[56,8]]},"901":{"position":[[153,8]]},"902":{"position":[[66,8]]},"903":{"position":[[175,8]]},"939":{"position":[[75,8]]},"1040":{"position":[[72,8]]},"1065":{"position":[[181,8]]},"1072":{"position":[[1142,8]]},"1085":{"position":[[142,9]]},"1090":{"position":[[202,8]]},"1092":{"position":[[439,8]]},"1116":{"position":[[276,8]]},"1120":{"position":[[103,8],[662,8]]},"1121":{"position":[[318,9]]},"1185":{"position":[[68,8]]},"1192":{"position":[[86,8]]},"1214":{"position":[[791,8]]},"1271":{"position":[[97,8]]},"1272":{"position":[[224,8]]},"1294":{"position":[[2068,8]]},"1300":{"position":[[21,8]]}},"keywords":{}}],["directori",{"_index":3030,"title":{},"content":{"463":{"position":[[527,10]]},"647":{"position":[[281,10]]},"648":{"position":[[81,10],[173,10]]},"649":{"position":[[129,10]]},"1208":{"position":[[113,11],[655,9]]}},"keywords":{}}],["disabl",{"_index":3375,"title":{"675":{"position":[[0,7]]},"676":{"position":[[0,7]]},"761":{"position":[[0,7]]},"1151":{"position":[[0,9]]},"1178":{"position":[[0,9]]}},"content":{"556":{"position":[[1487,7]]},"675":{"position":[[152,7]]},"676":{"position":[[211,7]]},"761":{"position":[[323,7]]},"1151":{"position":[[852,7]]},"1164":{"position":[[488,7]]},"1174":{"position":[[723,7]]},"1178":{"position":[[849,7]]},"1282":{"position":[[1044,7]]}},"keywords":{}}],["disableversioncheck",{"_index":4503,"title":{},"content":{"761":{"position":[[371,21],[461,19],[523,22],[587,19],[666,22],[709,19],[789,22]]}},"keywords":{}}],["disablewarn",{"_index":3860,"title":{},"content":{"675":{"position":[[190,17],[228,15],[276,18]]}},"keywords":{}}],["disadvantag",{"_index":6476,"title":{},"content":{"1301":{"position":[[1347,12]]}},"keywords":{}}],["disallow",{"_index":5900,"title":{},"content":{"1085":{"position":[[2589,11]]}},"keywords":{}}],["disc",{"_index":507,"title":{},"content":{"32":{"position":[[259,5]]},"461":{"position":[[1116,4],[1578,4]]},"696":{"position":[[1072,4],[1341,4]]},"800":{"position":[[742,5]]},"837":{"position":[[521,4]]},"932":{"position":[[263,4]]},"977":{"position":[[59,4]]},"1119":{"position":[[83,5]]},"1120":{"position":[[260,4]]},"1174":{"position":[[196,5]]},"1180":{"position":[[332,4]]},"1184":{"position":[[161,5]]},"1192":{"position":[[106,4],[138,4],[342,4]]},"1239":{"position":[[340,4]]},"1246":{"position":[[1575,5]]},"1292":{"position":[[606,4]]},"1300":{"position":[[291,5],[439,4]]},"1301":{"position":[[225,5]]},"1304":{"position":[[421,5]]}},"keywords":{}}],["disconnect",{"_index":1188,"title":{},"content":{"164":{"position":[[110,12]]},"590":{"position":[[772,14]]},"626":{"position":[[950,11]]},"632":{"position":[[2660,14]]},"1104":{"position":[[637,13]]}},"keywords":{}}],["discord",{"_index":1598,"title":{},"content":{"263":{"position":[[426,7]]},"422":{"position":[[187,7]]},"644":{"position":[[313,7]]},"669":{"position":[[49,8]]},"793":{"position":[[1496,7]]},"824":{"position":[[386,7]]},"873":{"position":[[173,7]]},"899":{"position":[[431,7]]},"913":{"position":[[272,7]]}},"keywords":{}}],["discourag",{"_index":3682,"title":{},"content":{"624":{"position":[[1608,11]]}},"keywords":{}}],["discov",{"_index":3529,"title":{"1190":{"position":[[3,8]]}},"content":{"591":{"position":[[463,8]]},"906":{"position":[[135,8]]}},"keywords":{}}],["discoveri",{"_index":5250,"title":{},"content":{"903":{"position":[[329,10]]}},"keywords":{}}],["discret",{"_index":1647,"title":{},"content":{"279":{"position":[[195,8]]}},"keywords":{}}],["discuss",{"_index":2194,"title":{},"content":{"390":{"position":[[707,7]]},"422":{"position":[[7,7]]},"628":{"position":[[26,10]]},"668":{"position":[[273,7]]},"705":{"position":[[1180,10]]}},"keywords":{}}],["disk",{"_index":498,"title":{},"content":{"31":{"position":[[164,4]]},"162":{"position":[[653,5]]},"236":{"position":[[194,4]]},"265":{"position":[[267,4],[536,4],[641,4],[806,4]]},"267":{"position":[[1339,4]]},"298":{"position":[[37,4],[243,4],[555,4]]},"299":{"position":[[273,5]]},"304":{"position":[[114,4]]},"311":{"position":[[204,4]]},"358":{"position":[[109,4]]},"361":{"position":[[425,4]]},"376":{"position":[[288,4]]},"385":{"position":[[157,4]]},"408":{"position":[[1003,4],[1116,4]]},"412":{"position":[[7778,5],[10021,5]]},"461":{"position":[[1200,4]]},"638":{"position":[[906,4]]},"696":{"position":[[1992,4]]},"1208":{"position":[[1785,5]]}},"keywords":{}}],["display",{"_index":812,"title":{},"content":{"54":{"position":[[21,7]]},"73":{"position":[[132,7]]},"327":{"position":[[136,8]]},"335":{"position":[[116,10]]},"379":{"position":[[242,7]]},"634":{"position":[[639,10]]},"696":{"position":[[408,7],[565,8]]},"700":{"position":[[1087,7]]},"736":{"position":[[33,8],[141,7]]},"781":{"position":[[64,7],[101,7]]}},"keywords":{}}],["displaystoragefulldialog",{"_index":1817,"title":{},"content":{"302":{"position":[[1055,27]]}},"keywords":{}}],["disrupt",{"_index":3692,"title":{},"content":{"630":{"position":[[177,7]]}},"keywords":{}}],["dist",{"_index":3833,"title":{},"content":{"668":{"position":[[206,4]]}},"keywords":{}}],["dist/work",{"_index":6315,"title":{},"content":{"1266":{"position":[[459,18],[681,14]]}},"keywords":{}}],["distanc",{"_index":2289,"title":{"393":{"position":[[37,9]]}},"content":{"393":{"position":[[223,9],[243,9],[478,8],[846,8],[979,8]]},"394":{"position":[[358,8],[795,9],[981,8]]},"396":{"position":[[880,8],[1140,8],[1273,9],[1376,8],[1849,8],[1897,8]]},"397":{"position":[[1406,8],[1451,8],[1540,9],[1979,8]]},"398":{"position":[[549,8],[1511,8],[1591,9],[1793,9],[2664,8],[2744,9]]},"402":{"position":[[440,9],[1147,8]]},"780":{"position":[[437,8]]}},"keywords":{}}],["distancetoindex",{"_index":2397,"title":{},"content":{"398":{"position":[[900,15],[2186,15],[2272,15]]}},"keywords":{}}],["distinct",{"_index":3675,"title":{},"content":{"624":{"position":[[76,8]]}},"keywords":{}}],["distingu",{"_index":4735,"title":{},"content":{"826":{"position":[[199,13]]}},"keywords":{}}],["distinguish",{"_index":1928,"title":{},"content":{"327":{"position":[[15,14]]},"612":{"position":[[936,13]]}},"keywords":{}}],["distribut",{"_index":426,"title":{"240":{"position":[[27,11]]}},"content":{"26":{"position":[[173,11]]},"91":{"position":[[19,10]]},"134":{"position":[[6,11]]},"184":{"position":[[51,11]]},"240":{"position":[[4,11]]},"250":{"position":[[357,11]]},"289":{"position":[[640,11]]},"339":{"position":[[212,11]]},"393":{"position":[[570,12]]},"412":{"position":[[801,11],[14961,11]]},"635":{"position":[[471,11]]},"644":{"position":[[576,11]]},"701":{"position":[[663,11]]},"772":{"position":[[271,11]]},"798":{"position":[[268,12],[505,12]]},"821":{"position":[[631,12],[861,12]]},"903":{"position":[[92,10]]},"1088":{"position":[[483,10]]}},"keywords":{}}],["dive",{"_index":881,"title":{},"content":{"61":{"position":[[20,4]]},"151":{"position":[[8,6]]},"263":{"position":[[371,4]]},"425":{"position":[[7,4]]},"462":{"position":[[68,4]]},"567":{"position":[[22,4]]},"572":{"position":[[1,4]]},"644":{"position":[[1,4]]},"824":{"position":[[22,4]]}},"keywords":{}}],["diverg",{"_index":2657,"title":{},"content":{"412":{"position":[[692,9]]}},"keywords":{}}],["divers",{"_index":1662,"title":{},"content":{"284":{"position":[[215,7]]},"287":{"position":[[118,7]]},"381":{"position":[[510,7]]},"504":{"position":[[16,7]]},"631":{"position":[[411,7]]},"1195":{"position":[[65,8]]}},"keywords":{}}],["divid",{"_index":3469,"title":{},"content":{"571":{"position":[[1613,7]]},"701":{"position":[[285,6]]},"707":{"position":[[28,7]]}},"keywords":{}}],["dm1",{"_index":4292,"title":{},"content":{"749":{"position":[[12188,3]]}},"keywords":{}}],["dm2",{"_index":4293,"title":{},"content":{"749":{"position":[[12279,3]]}},"keywords":{}}],["dm3",{"_index":4294,"title":{},"content":{"749":{"position":[[12406,3]]}},"keywords":{}}],["dm4",{"_index":4295,"title":{},"content":{"749":{"position":[[12487,3]]}},"keywords":{}}],["dm5",{"_index":4296,"title":{},"content":{"749":{"position":[[12560,3]]}},"keywords":{}}],["do",{"_index":1633,"title":{"1032":{"position":[[16,5]]}},"content":{"273":{"position":[[233,5]]},"412":{"position":[[9343,5],[10369,5]]},"451":{"position":[[612,5]]},"460":{"position":[[494,5]]},"616":{"position":[[384,5]]},"617":{"position":[[990,3]]},"723":{"position":[[903,5]]},"872":{"position":[[2859,5]]},"876":{"position":[[48,5]]},"881":{"position":[[316,3]]},"912":{"position":[[337,5]]},"1027":{"position":[[71,5]]},"1068":{"position":[[129,5]]},"1072":{"position":[[921,5],[955,5]]},"1106":{"position":[[378,5]]},"1138":{"position":[[553,5]]},"1164":{"position":[[1379,5]]},"1188":{"position":[[267,5]]},"1246":{"position":[[171,5],[491,5]]},"1251":{"position":[[279,5]]},"1274":{"position":[[594,5]]},"1279":{"position":[[981,5]]},"1296":{"position":[[473,5]]},"1304":{"position":[[1322,5]]},"1305":{"position":[[67,5]]},"1317":{"position":[[489,3]]}},"keywords":{}}],["doabl",{"_index":2747,"title":{},"content":{"412":{"position":[[11732,6]]},"1317":{"position":[[749,7]]}},"keywords":{}}],["doc",{"_index":806,"title":{"923":{"position":[[0,4]]}},"content":{"52":{"position":[[467,3],[614,3]]},"209":{"position":[[734,6],[895,4]]},"255":{"position":[[1114,4],[1232,5]]},"306":{"position":[[47,5]]},"392":{"position":[[2764,6],[4717,6],[4765,5]]},"394":{"position":[[790,4]]},"397":{"position":[[1805,6]]},"398":{"position":[[1601,3],[2311,4],[2754,3]]},"400":{"position":[[35,4]]},"493":{"position":[[248,3]]},"495":{"position":[[679,4]]},"539":{"position":[[467,3],[614,3]]},"555":{"position":[[263,3]]},"556":{"position":[[798,3]]},"562":{"position":[[547,3],[636,4]]},"599":{"position":[[494,3]]},"632":{"position":[[2517,6]]},"670":{"position":[[413,4],[461,4],[490,4]]},"724":{"position":[[963,3],[1024,3]]},"734":{"position":[[874,5]]},"752":{"position":[[816,4],[1269,4]]},"770":{"position":[[451,3]]},"791":{"position":[[142,3],[462,3]]},"792":{"position":[[273,3]]},"810":{"position":[[335,3]]},"811":{"position":[[315,3]]},"813":{"position":[[339,3]]},"841":{"position":[[157,3],[189,3],[241,3],[1183,3],[1404,3]]},"886":{"position":[[1217,3],[1227,4],[3117,3],[3127,3]]},"887":{"position":[[452,4],[671,4]]},"888":{"position":[[1027,4],[1069,5]]},"889":{"position":[[129,5]]},"898":{"position":[[3509,4],[3524,5],[3601,4]]},"942":{"position":[[176,3]]},"943":{"position":[[373,3]]},"946":{"position":[[148,3]]},"947":{"position":[[159,4]]},"988":{"position":[[2686,4]]},"1020":{"position":[[469,6],[582,3],[589,5]]},"1022":{"position":[[572,6],[598,3],[605,5]]},"1023":{"position":[[228,6],[254,3],[261,5]]},"1024":{"position":[[314,6],[340,3],[347,5]]},"1033":{"position":[[590,6]]},"1036":{"position":[[108,4]]},"1057":{"position":[[594,3]]},"1065":{"position":[[75,5],[93,4],[137,4]]},"1173":{"position":[[220,5]]},"1311":{"position":[[1272,4]]},"1314":{"position":[[644,4]]}},"keywords":{}}],["doc._delet",{"_index":5211,"title":{},"content":{"898":{"position":[[1889,12]]}},"keywords":{}}],["doc.ag",{"_index":5220,"title":{},"content":{"898":{"position":[[3567,10],[3585,8]]}},"keywords":{}}],["doc.bestfriend_",{"_index":4686,"title":{},"content":{"811":{"position":[[392,16]]}},"keywords":{}}],["doc.categori",{"_index":5621,"title":{},"content":{"1020":{"position":[[663,12]]}},"keywords":{}}],["doc.embed",{"_index":2316,"title":{},"content":{"394":{"position":[[836,14]]}},"keywords":{}}],["doc.firstnam",{"_index":4054,"title":{},"content":{"724":{"position":[[973,13],[1034,14]]},"1311":{"position":[[1365,15]]}},"keywords":{}}],["doc.id",{"_index":5106,"title":{},"content":{"885":{"position":[[2248,7]]}},"keywords":{}}],["doc.lastnam",{"_index":4055,"title":{},"content":{"724":{"position":[[995,12]]}},"keywords":{}}],["doc.modify(data",{"_index":5712,"title":{},"content":{"1048":{"position":[[545,15]]}},"keywords":{}}],["doc.nam",{"_index":3177,"title":{},"content":{"493":{"position":[[273,8]]},"571":{"position":[[1162,8]]}},"keywords":{}}],["doc.populate('bestfriend",{"_index":4681,"title":{},"content":{"810":{"position":[[412,27]]}},"keywords":{}}],["doc.primari",{"_index":2249,"title":{},"content":{"392":{"position":[[2914,12]]},"397":{"position":[[1936,12]]},"1020":{"position":[[640,12]]},"1022":{"position":[[838,12]]},"1023":{"position":[[507,12]]},"1024":{"position":[[413,13],[509,12]]}},"keywords":{}}],["doc.primary}).remov",{"_index":5627,"title":{},"content":{"1022":{"position":[[687,23]]},"1023":{"position":[[338,23]]}},"keywords":{}}],["doc.putattach",{"_index":3369,"title":{},"content":{"556":{"position":[[916,19]]},"792":{"position":[[335,19]]}},"keywords":{}}],["doc.putattachmentbase64",{"_index":5295,"title":{},"content":{"918":{"position":[[104,25]]}},"keywords":{}}],["doc.receivers.map(receiv",{"_index":5630,"title":{},"content":{"1022":{"position":[[793,26]]}},"keywords":{}}],["doc.remov",{"_index":810,"title":{},"content":{"52":{"position":[[690,13]]},"539":{"position":[[690,13]]},"684":{"position":[[235,13]]}},"keywords":{}}],["doc.text.split",{"_index":5639,"title":{},"content":{"1023":{"position":[[414,16]]}},"keywords":{}}],["doc.upd",{"_index":807,"title":{},"content":{"52":{"position":[[543,12]]},"539":{"position":[[543,12]]},"599":{"position":[[570,12]]},"857":{"position":[[374,12]]},"1048":{"position":[[439,12]]}},"keywords":{}}],["doc.updatecrdt",{"_index":3889,"title":{},"content":{"684":{"position":[[164,16]]}},"keywords":{}}],["doc.updatedat",{"_index":5105,"title":{},"content":{"885":{"position":[[2069,14],[2120,14],[2170,14]]}},"keywords":{}}],["doc1",{"_index":4256,"title":{},"content":{"749":{"position":[[9507,4]]}},"keywords":{}}],["doc10",{"_index":4269,"title":{},"content":{"749":{"position":[[10465,5]]}},"keywords":{}}],["doc11",{"_index":4272,"title":{},"content":{"749":{"position":[[10588,5]]}},"keywords":{}}],["doc13",{"_index":4274,"title":{},"content":{"749":{"position":[[10692,5]]}},"keywords":{}}],["doc14",{"_index":4275,"title":{},"content":{"749":{"position":[[10798,5]]}},"keywords":{}}],["doc15",{"_index":4277,"title":{},"content":{"749":{"position":[[10889,5]]}},"keywords":{}}],["doc16",{"_index":4278,"title":{},"content":{"749":{"position":[[10971,5]]}},"keywords":{}}],["doc17",{"_index":4280,"title":{},"content":{"749":{"position":[[11109,5]]}},"keywords":{}}],["doc18",{"_index":4281,"title":{},"content":{"749":{"position":[[11250,5]]}},"keywords":{}}],["doc19",{"_index":4282,"title":{},"content":{"749":{"position":[[11361,5]]}},"keywords":{}}],["doc2",{"_index":4259,"title":{},"content":{"749":{"position":[[9652,4]]}},"keywords":{}}],["doc20",{"_index":4284,"title":{},"content":{"749":{"position":[[11460,5]]}},"keywords":{}}],["doc21",{"_index":4285,"title":{},"content":{"749":{"position":[[11536,5]]}},"keywords":{}}],["doc22",{"_index":4288,"title":{},"content":{"749":{"position":[[11681,5]]}},"keywords":{}}],["doc23",{"_index":4290,"title":{},"content":{"749":{"position":[[11778,5]]}},"keywords":{}}],["doc24",{"_index":4291,"title":{},"content":{"749":{"position":[[11887,5]]}},"keywords":{}}],["doc3",{"_index":4260,"title":{},"content":{"749":{"position":[[9736,4]]}},"keywords":{}}],["doc4",{"_index":4261,"title":{},"content":{"749":{"position":[[9824,4]]}},"keywords":{}}],["doc5",{"_index":4262,"title":{},"content":{"749":{"position":[[9931,4]]}},"keywords":{}}],["doc6",{"_index":4264,"title":{},"content":{"749":{"position":[[10045,4]]}},"keywords":{}}],["doc7",{"_index":4265,"title":{},"content":{"749":{"position":[[10163,4]]}},"keywords":{}}],["doc8",{"_index":4266,"title":{},"content":{"749":{"position":[[10272,4]]}},"keywords":{}}],["doc9",{"_index":4268,"title":{},"content":{"749":{"position":[[10377,4]]}},"keywords":{}}],["doc[k",{"_index":5152,"title":{},"content":{"887":{"position":[[650,7]]}},"keywords":{}}],["docafteredit",{"_index":5703,"title":{},"content":{"1045":{"position":[[122,12]]}},"keywords":{}}],["docdata",{"_index":2381,"title":{},"content":{"397":{"position":[[1920,7]]},"403":{"position":[[1007,8]]},"795":{"position":[[149,7]]},"846":{"position":[[844,7],[1279,7]]},"948":{"position":[[380,7]]},"986":{"position":[[730,7]]},"1044":{"position":[[456,8]]},"1061":{"position":[[271,8]]},"1311":{"position":[[1232,8]]}},"keywords":{}}],["docdata.ag",{"_index":5698,"title":{},"content":{"1044":{"position":[[418,11],[432,11]]},"1061":{"position":[[187,11],[201,11]]},"1296":{"position":[[888,11]]}},"keywords":{}}],["docdata.ageidcustomindex",{"_index":6459,"title":{},"content":{"1296":{"position":[[861,24]]}},"keywords":{}}],["docdata.id.padstart(idmaxlength",{"_index":6460,"title":{},"content":{"1296":{"position":[[902,32]]}},"keywords":{}}],["docdata['idx",{"_index":2386,"title":{},"content":{"397":{"position":[[2149,13]]},"403":{"position":[[921,13]]}},"keywords":{}}],["docker",{"_index":4893,"title":{},"content":{"861":{"position":[[296,7],[311,6],[322,6],[383,6],[473,6],[508,6],[546,6],[850,6],[873,6],[901,6]]},"865":{"position":[[196,6],[211,6]]},"872":{"position":[[441,6]]}},"keywords":{}}],["docorundefin",{"_index":5739,"title":{},"content":{"1057":{"position":[[330,14],[431,14]]}},"keywords":{}}],["docread",{"_index":2414,"title":{},"content":{"398":{"position":[[1738,8],[2101,8],[2553,8],[2564,8],[2891,8]]}},"keywords":{}}],["docs">",{"_index":3176,"title":{},"content":{"493":{"position":[[209,14],[255,14]]}},"keywords":{}}],["docs.color",{"_index":6526,"title":{},"content":{"1314":{"position":[[653,10],[678,10]]}},"keywords":{}}],["docs.foreach(d",{"_index":1136,"title":{},"content":{"143":{"position":[[531,14],[716,14]]}},"keywords":{}}],["docs.length",{"_index":2420,"title":{},"content":{"398":{"position":[[2575,12]]},"888":{"position":[[1087,11]]}},"keywords":{}}],["docs.map((doc",{"_index":3182,"title":{},"content":{"494":{"position":[[335,15]]}},"keywords":{}}],["docs.map(d",{"_index":2419,"title":{},"content":{"398":{"position":[[2516,10]]}},"keywords":{}}],["docs.rend",{"_index":3179,"title":{},"content":{"493":{"position":[[474,12]]}},"keywords":{}}],["docs/api/database/changes.html",{"_index":4828,"title":{},"content":{"846":{"position":[[994,30]]}},"keywords":{}}],["docs:instal",{"_index":3840,"title":{},"content":{"670":{"position":[[516,12]]}},"keywords":{}}],["docs:serv",{"_index":3841,"title":{},"content":{"670":{"position":[[548,10]]}},"keywords":{}}],["docsaft",{"_index":2401,"title":{},"content":{"398":{"position":[[991,10]]}},"keywords":{}}],["docsafter.map(d",{"_index":2407,"title":{},"content":{"398":{"position":[[1393,15]]}},"keywords":{}}],["docsbefor",{"_index":2400,"title":{},"content":{"398":{"position":[[978,12]]}},"keywords":{}}],["docsbefore.map(d",{"_index":2405,"title":{},"content":{"398":{"position":[[1350,16]]}},"keywords":{}}],["docsmap",{"_index":5361,"title":{},"content":{"951":{"position":[[367,7]]}},"keywords":{}}],["docsperindexsid",{"_index":2392,"title":{},"content":{"398":{"position":[[757,16],[1158,16],[1319,16],[3232,16]]},"402":{"position":[[1493,16]]}},"keywords":{}}],["docssign",{"_index":3181,"title":{},"content":{"494":{"position":[[278,10]]}},"keywords":{}}],["docssignal.valu",{"_index":3184,"title":{},"content":{"494":{"position":[[468,16]]}},"keywords":{}}],["docswithdist",{"_index":2408,"title":{},"content":{"398":{"position":[[1447,16],[2600,16]]}},"keywords":{}}],["docswithdistance.sort(sortbyobjectnumberproperty('distance')).revers",{"_index":2412,"title":{},"content":{"398":{"position":[[1627,72],[2780,72]]}},"keywords":{}}],["doctostr",{"_index":4056,"title":{},"content":{"724":{"position":[[1011,12]]}},"keywords":{}}],["document",{"_index":152,"title":{"73":{"position":[[11,9]]},"75":{"position":[[11,8]]},"81":{"position":[[8,9]]},"104":{"position":[[11,9]]},"106":{"position":[[11,8]]},"111":{"position":[[8,9]]},"231":{"position":[[13,9]]},"235":{"position":[[11,8]]},"236":{"position":[[8,9]]},"279":{"position":[[7,8]]},"282":{"position":[[35,10]]},"350":{"position":[[0,8]]},"365":{"position":[[36,10]]},"366":{"position":[[29,10]]},"371":{"position":[[19,9]]},"457":{"position":[[21,10]]},"684":{"position":[[9,10]]},"793":{"position":[[5,13]]},"800":{"position":[[20,8]]},"982":{"position":[[23,8]]},"1011":{"position":[[6,9]]},"1012":{"position":[[14,9]]},"1024":{"position":[[39,10]]},"1253":{"position":[[4,8]]}},"content":{"11":{"position":[[347,8]]},"14":{"position":[[760,9]]},"16":{"position":[[198,9]]},"19":{"position":[[79,8]]},"23":{"position":[[36,8]]},"24":{"position":[[442,9],[748,8]]},"25":{"position":[[58,8]]},"32":{"position":[[103,8]]},"33":{"position":[[405,8]]},"41":{"position":[[164,8]]},"47":{"position":[[617,8],[842,8]]},"73":{"position":[[12,10]]},"75":{"position":[[47,8]]},"81":{"position":[[44,8]]},"84":{"position":[[211,14]]},"104":{"position":[[26,10],[164,9]]},"106":{"position":[[34,8]]},"111":{"position":[[59,10],[89,9]]},"114":{"position":[[224,14]]},"138":{"position":[[92,10]]},"149":{"position":[[224,14]]},"151":{"position":[[332,8]]},"168":{"position":[[190,9]]},"174":{"position":[[446,9],[492,9],[646,9],[966,8],[1042,10],[2358,9],[2413,9]]},"175":{"position":[[217,14]]},"179":{"position":[[309,8]]},"181":{"position":[[212,10]]},"188":{"position":[[2814,8],[2834,8],[3182,9],[3265,9]]},"194":{"position":[[144,8]]},"204":{"position":[[243,8]]},"208":{"position":[[166,9]]},"209":{"position":[[955,9]]},"231":{"position":[[42,9],[194,10]]},"235":{"position":[[26,8],[107,10]]},"236":{"position":[[35,9]]},"255":{"position":[[122,9],[1086,11],[1238,9]]},"267":{"position":[[489,8],[613,8],[672,9],[831,9],[1509,8]]},"279":{"position":[[50,8],[172,9],[394,8]]},"282":{"position":[[184,9]]},"301":{"position":[[229,9]]},"302":{"position":[[626,9]]},"303":{"position":[[366,10],[495,9]]},"311":{"position":[[124,8]]},"315":{"position":[[1095,8]]},"316":{"position":[[483,8]]},"317":{"position":[[151,8]]},"322":{"position":[[181,9]]},"335":{"position":[[245,9]]},"339":{"position":[[41,9]]},"345":{"position":[[98,8]]},"347":{"position":[[224,14]]},"350":{"position":[[50,8],[213,9]]},"352":{"position":[[360,10]]},"353":{"position":[[208,9],[414,10],[661,9],[747,8]]},"354":{"position":[[41,8],[358,10]]},"357":{"position":[[471,8]]},"359":{"position":[[147,9]]},"360":{"position":[[55,9],[666,8]]},"361":{"position":[[169,9],[394,9],[503,9]]},"362":{"position":[[210,9],[1061,8],[1295,14]]},"364":{"position":[[496,9],[698,8]]},"365":{"position":[[25,9]]},"366":{"position":[[30,9],[152,8],[253,9]]},"367":{"position":[[14,9],[784,9]]},"369":{"position":[[322,10]]},"371":{"position":[[236,9]]},"372":{"position":[[208,8]]},"381":{"position":[[306,9]]},"382":{"position":[[83,8]]},"386":{"position":[[310,13]]},"387":{"position":[[139,14]]},"390":{"position":[[630,8],[697,9]]},"392":{"position":[[470,9],[1292,10],[1411,9],[1783,9],[1858,9],[1955,8],[2281,9],[2529,10],[3122,9]]},"394":{"position":[[204,9],[331,10],[1210,9],[1277,8],[1457,9],[1611,9],[1675,10]]},"395":{"position":[[185,9],[274,10]]},"397":{"position":[[402,8]]},"399":{"position":[[420,10]]},"402":{"position":[[754,9],[1237,8],[1450,9]]},"408":{"position":[[2973,9],[4529,10],[4847,9]]},"410":{"position":[[1673,10]]},"411":{"position":[[3457,8]]},"412":{"position":[[2274,10],[3160,8],[4557,9],[4708,8],[4758,9],[10483,9],[14395,8]]},"419":{"position":[[1600,13]]},"426":{"position":[[282,9]]},"429":{"position":[[608,9]]},"430":{"position":[[420,10],[450,9]]},"432":{"position":[[251,10]]},"452":{"position":[[611,10]]},"457":{"position":[[85,9]]},"459":{"position":[[486,9]]},"462":{"position":[[844,9]]},"464":{"position":[[816,8],[1031,8],[1309,8],[1388,9]]},"465":{"position":[[30,10],[87,9]]},"466":{"position":[[57,9],[576,9]]},"467":{"position":[[19,9],[487,9],[681,9]]},"469":{"position":[[300,9],[719,9],[812,9]]},"482":{"position":[[105,8]]},"483":{"position":[[749,13]]},"487":{"position":[[311,8]]},"490":{"position":[[178,8]]},"491":{"position":[[1366,9]]},"493":{"position":[[99,10],[396,9],[459,9],[492,8]]},"496":{"position":[[349,8]]},"511":{"position":[[224,14]]},"531":{"position":[[224,14]]},"535":{"position":[[664,8],[844,8]]},"556":{"position":[[1273,8]]},"561":{"position":[[51,10],[162,9]]},"564":{"position":[[124,9]]},"566":{"position":[[163,9]]},"567":{"position":[[187,13]]},"575":{"position":[[680,9]]},"582":{"position":[[526,8]]},"585":{"position":[[106,10]]},"588":{"position":[[55,10]]},"591":{"position":[[224,14]]},"631":{"position":[[324,9]]},"632":{"position":[[172,9],[556,8],[2322,9],[2347,9]]},"634":{"position":[[301,8]]},"635":{"position":[[86,8],[122,8]]},"639":{"position":[[53,9]]},"653":{"position":[[400,8],[1131,9]]},"654":{"position":[[356,9]]},"655":{"position":[[33,9],[83,10],[316,9],[379,10],[405,9],[474,9]]},"661":{"position":[[1546,8]]},"662":{"position":[[206,9],[2579,9]]},"664":{"position":[[20,13]]},"670":{"position":[[437,13]]},"679":{"position":[[331,13]]},"680":{"position":[[1203,8]]},"681":{"position":[[67,8],[520,8]]},"682":{"position":[[50,8],[218,8]]},"683":{"position":[[358,8],[645,9],[713,9],[789,8],[867,8],[954,8]]},"684":{"position":[[18,8]]},"685":{"position":[[76,8],[110,8],[266,8],[311,8],[371,9],[484,9],[585,8],[609,8]]},"686":{"position":[[652,8]]},"687":{"position":[[67,8],[199,8],[327,8]]},"688":{"position":[[58,8],[428,8],[770,8]]},"691":{"position":[[66,8],[594,8]]},"698":{"position":[[48,9],[147,8],[221,9],[299,8],[499,8],[559,9],[623,8],[653,8],[855,8],[1175,8],[1299,8],[1325,8],[1498,10],[1840,8],[1969,9],[2344,9],[2422,9],[2740,8]]},"700":{"position":[[427,8],[1125,8]]},"701":{"position":[[153,9],[296,10],[801,9],[890,9],[1043,8]]},"702":{"position":[[115,9],[225,10],[473,10]]},"703":{"position":[[230,8]]},"705":{"position":[[203,8],[468,8]]},"710":{"position":[[240,10],[1887,8]]},"711":{"position":[[2005,8]]},"714":{"position":[[150,8],[606,9],[805,9],[1061,9]]},"717":{"position":[[277,8]]},"719":{"position":[[386,9]]},"723":{"position":[[1080,8],[1481,9],[2320,9]]},"724":{"position":[[696,9],[778,8],[886,8],[1078,9],[1550,9]]},"749":{"position":[[6767,8],[8917,8],[8959,8],[9124,9],[10632,8],[10719,8],[11189,9],[11256,8],[11899,8],[12082,8],[12296,8],[12318,8],[13695,9],[14226,9],[14297,8],[14472,9],[22499,9],[23394,9],[23817,9]]},"751":{"position":[[307,8],[369,8],[418,8],[1078,8],[1536,9],[1843,9]]},"752":{"position":[[1203,9]]},"754":{"position":[[49,9]]},"756":{"position":[[156,9]]},"764":{"position":[[42,8],[108,9],[246,9],[313,8]]},"767":{"position":[[52,9],[176,8]]},"768":{"position":[[26,8],[139,8]]},"769":{"position":[[29,8],[150,8]]},"770":{"position":[[195,9],[256,10],[590,10]]},"781":{"position":[[810,10]]},"793":{"position":[[5,13],[1087,9]]},"795":{"position":[[43,10],[106,8]]},"796":{"position":[[1300,9]]},"798":{"position":[[670,9]]},"800":{"position":[[89,9],[125,8],[367,9],[416,8],[486,9],[560,9],[718,8]]},"810":{"position":[[157,8]]},"816":{"position":[[107,8]]},"820":{"position":[[709,10]]},"821":{"position":[[673,10]]},"824":{"position":[[69,13],[345,14]]},"826":{"position":[[149,8],[407,8],[567,8],[673,8],[998,8]]},"829":{"position":[[3831,9],[3865,9]]},"831":{"position":[[562,14]]},"836":{"position":[[1423,8]]},"837":{"position":[[370,9],[488,9],[766,9],[2082,10]]},"838":{"position":[[235,9],[2793,9]]},"841":{"position":[[449,8]]},"844":{"position":[[191,8]]},"846":{"position":[[663,9],[777,9],[1196,9]]},"854":{"position":[[1233,9]]},"855":{"position":[[41,10],[115,8],[211,9]]},"856":{"position":[[69,8]]},"857":{"position":[[55,9],[193,10]]},"861":{"position":[[1210,9],[1290,10],[1345,8],[1606,10],[1666,9],[1790,8],[1943,9],[2101,8]]},"863":{"position":[[406,9],[568,9],[653,8]]},"866":{"position":[[655,9],[703,8]]},"867":{"position":[[41,10],[115,8],[206,9]]},"868":{"position":[[79,13]]},"872":{"position":[[1150,8],[1311,9]]},"875":{"position":[[1412,9],[1604,8],[1795,8],[1952,9],[2188,9],[2360,9],[2839,10],[3040,10],[3473,10],[3741,9],[4023,8],[4560,10],[5199,8],[5812,8],[8306,10],[9272,9]]},"881":{"position":[[87,9]]},"885":{"position":[[191,8],[341,9],[375,8],[409,8],[788,10],[1112,8],[1956,9],[1987,8],[2326,9],[2434,8],[2595,10]]},"886":{"position":[[689,9],[1266,9],[1470,9],[1571,10],[2170,8],[2878,8],[3007,9],[3094,9],[3599,9]]},"888":{"position":[[236,8],[331,10],[955,9],[1058,10]]},"889":{"position":[[683,9]]},"897":{"position":[[126,9]]},"903":{"position":[[536,8]]},"904":{"position":[[1143,8]]},"908":{"position":[[313,8]]},"921":{"position":[[69,9]]},"934":{"position":[[417,9]]},"936":{"position":[[28,9]]},"942":{"position":[[24,9]]},"943":{"position":[[57,8],[96,8],[356,9]]},"944":{"position":[[30,9],[462,9],[550,8]]},"945":{"position":[[30,9],[284,8]]},"946":{"position":[[13,8]]},"947":{"position":[[41,10]]},"948":{"position":[[174,9],[552,8]]},"949":{"position":[[9,9]]},"950":{"position":[[68,9],[124,8],[155,9],[230,8],[356,8]]},"951":{"position":[[11,9],[197,8],[223,9],[233,9]]},"952":{"position":[[54,8]]},"953":{"position":[[225,9]]},"954":{"position":[[86,10]]},"962":{"position":[[180,10]]},"971":{"position":[[184,9]]},"977":{"position":[[11,9]]},"983":{"position":[[6,8],[67,9],[257,9],[556,8],[630,8]]},"984":{"position":[[200,9],[317,9],[398,9],[611,10]]},"986":{"position":[[56,9],[155,9],[335,9],[454,8],[585,10],[697,9],[906,9],[1076,10],[1099,8],[1373,10],[1483,10]]},"987":{"position":[[55,8],[303,8],[606,8]]},"988":{"position":[[1712,8],[1741,8],[1882,9],[2066,9],[2459,9],[2938,9],[3027,9],[3201,8],[3893,9],[4034,9],[4125,10],[4199,10],[4509,9],[4745,8],[5402,10]]},"990":{"position":[[16,8],[144,8],[438,8],[581,9]]},"993":{"position":[[99,8],[226,8]]},"995":{"position":[[1255,8]]},"999":{"position":[[230,9]]},"1002":{"position":[[85,9],[460,9],[1113,9]]},"1003":{"position":[[48,8]]},"1004":{"position":[[268,9],[537,9],[674,8],[736,8]]},"1007":{"position":[[72,8]]},"1012":{"position":[[21,10],[58,9],[174,11]]},"1013":{"position":[[35,8],[201,9],[247,9],[433,9],[585,9],[652,9]]},"1014":{"position":[[17,8],[76,8],[294,9]]},"1015":{"position":[[17,8]]},"1017":{"position":[[58,8]]},"1018":{"position":[[361,8],[408,9],[699,8]]},"1020":{"position":[[515,9]]},"1022":{"position":[[40,9],[100,9],[163,9]]},"1024":{"position":[[38,8],[117,9],[161,8]]},"1026":{"position":[[155,9]]},"1028":{"position":[[156,9]]},"1035":{"position":[[13,8]]},"1036":{"position":[[9,9],[167,9]]},"1038":{"position":[[37,9]]},"1039":{"position":[[124,8]]},"1041":{"position":[[13,8]]},"1042":{"position":[[11,9]]},"1043":{"position":[[42,9]]},"1044":{"position":[[182,9]]},"1047":{"position":[[18,8],[84,8],[197,9]]},"1048":{"position":[[32,9],[260,8],[349,8]]},"1052":{"position":[[259,8],[418,9]]},"1055":{"position":[[129,10]]},"1056":{"position":[[272,8]]},"1057":{"position":[[270,8],[527,8]]},"1059":{"position":[[349,8]]},"1061":{"position":[[250,8]]},"1062":{"position":[[19,10],[78,10],[97,9],[220,9]]},"1063":{"position":[[27,8]]},"1065":{"position":[[1026,8],[1773,10],[2012,9]]},"1066":{"position":[[476,9]]},"1067":{"position":[[34,9],[88,8],[587,12],[713,8],[854,8],[1091,8],[1855,8]]},"1068":{"position":[[230,8],[258,8],[392,8]]},"1069":{"position":[[671,9],[832,9]]},"1072":{"position":[[21,8],[102,8],[217,9],[445,10],[1094,9],[2254,9],[2339,8]]},"1077":{"position":[[156,8]]},"1078":{"position":[[92,8],[744,8]]},"1082":{"position":[[82,8]]},"1085":{"position":[[82,9],[949,8],[1929,9],[2440,8],[2961,8],[3077,9]]},"1101":{"position":[[389,9]]},"1102":{"position":[[1260,9],[1318,9],[1367,9]]},"1105":{"position":[[76,9],[551,9],[960,8]]},"1106":{"position":[[78,8],[193,8],[226,8],[289,8]]},"1107":{"position":[[113,9],[244,9]]},"1108":{"position":[[703,8]]},"1124":{"position":[[1191,9]]},"1132":{"position":[[879,10],[920,9],[1281,8],[1474,9]]},"1134":{"position":[[605,9]]},"1158":{"position":[[552,9],[644,10]]},"1162":{"position":[[464,8]]},"1164":{"position":[[208,8]]},"1181":{"position":[[551,8]]},"1184":{"position":[[134,8]]},"1186":{"position":[[189,9]]},"1192":{"position":[[518,10],[785,11]]},"1194":{"position":[[305,8],[335,9],[364,9],[415,9],[472,9],[520,9],[550,10],[587,9],[629,9],[693,9],[746,9],[787,9],[839,9],[934,10],[971,9]]},"1198":{"position":[[516,9],[571,8],[1072,9],[1290,9]]},"1228":{"position":[[78,14]]},"1246":{"position":[[1081,9],[1770,10]]},"1249":{"position":[[381,8]]},"1253":{"position":[[51,8],[143,9]]},"1257":{"position":[[16,8]]},"1258":{"position":[[89,8]]},"1271":{"position":[[430,9]]},"1294":{"position":[[288,9],[1228,8],[2087,9]]},"1295":{"position":[[137,9],[176,9],[570,9],[1235,9]]},"1296":{"position":[[271,9],[629,8],[748,8]]},"1304":{"position":[[1580,8]]},"1305":{"position":[[479,8],[776,8],[813,8]]},"1307":{"position":[[81,8],[235,9],[356,8],[905,8]]},"1308":{"position":[[72,9],[100,9],[316,8],[471,8],[537,8],[579,8]]},"1309":{"position":[[79,8],[634,8],[684,9]]},"1311":{"position":[[1257,9],[1444,8]]},"1313":{"position":[[654,8]]},"1314":{"position":[[546,9]]},"1315":{"position":[[1418,9]]},"1316":{"position":[[3169,9],[3195,8],[3218,8]]},"1317":{"position":[[116,8],[166,8],[263,8]]},"1318":{"position":[[67,9],[209,9]]},"1319":{"position":[[189,9],[276,8]]},"1320":{"position":[[562,9],[592,10],[619,8],[832,8],[887,9]]},"1321":{"position":[[682,10],[809,9],[890,10],[942,9]]},"1322":{"position":[[200,8],[248,8],[371,8]]},"1323":{"position":[[97,9],[207,8]]},"1324":{"position":[[573,8]]}},"keywords":{}}],["document'",{"_index":2378,"title":{},"content":{"397":{"position":[[1472,10]]},"571":{"position":[[1290,10]]},"1051":{"position":[[13,10]]}},"keywords":{}}],["document(",{"_index":5124,"title":{},"content":{"886":{"position":[[1383,12]]}},"keywords":{}}],["document).ready(async",{"_index":1943,"title":{},"content":{"335":{"position":[[147,23]]}},"keywords":{}}],["document.addeventlistener('devicereadi",{"_index":165,"title":{},"content":{"11":{"position":[[609,40]]}},"keywords":{}}],["document.find",{"_index":6166,"title":{},"content":{"1194":{"position":[[679,13]]}},"keywords":{}}],["document.getelementbyid('#mylist').innerhtml",{"_index":3468,"title":{},"content":{"571":{"position":[[1189,44]]}},"keywords":{}}],["document.if",{"_index":5438,"title":{},"content":{"982":{"position":[[482,11]]}},"keywords":{}}],["document.pushhandl",{"_index":5441,"title":{},"content":{"983":{"position":[[377,20]]}},"keywords":{}}],["document.rxdb",{"_index":3891,"title":{},"content":{"686":{"position":[[390,13]]}},"keywords":{}}],["document.th",{"_index":5804,"title":{},"content":{"1074":{"position":[[252,12]]},"1305":{"position":[[671,12]]}},"keywords":{}}],["documentationjoin",{"_index":4977,"title":{},"content":{"873":{"position":[[151,17]]}},"keywords":{}}],["documentdata",{"_index":5756,"title":{},"content":{"1063":{"position":[[67,12]]}},"keywords":{}}],["documentid",{"_index":3740,"title":{},"content":{"649":{"position":[[371,11]]}},"keywords":{}}],["documents+checkpoint",{"_index":5479,"title":{},"content":{"988":{"position":[[5311,21]]}},"keywords":{}}],["documents.count",{"_index":6169,"title":{},"content":{"1194":{"position":[[918,15]]}},"keywords":{}}],["documents.cross",{"_index":3535,"title":{},"content":{"595":{"position":[[925,15]]}},"keywords":{}}],["documents.length",{"_index":5000,"title":{},"content":{"875":{"position":[[2638,16]]}},"keywords":{}}],["documents.sort((a",{"_index":5098,"title":{},"content":{"885":{"position":[[1705,18]]}},"keywords":{}}],["documents.th",{"_index":6111,"title":{},"content":{"1162":{"position":[[710,13]]},"1181":{"position":[[798,13]]}},"keywords":{}}],["documents/field",{"_index":2756,"title":{},"content":{"412":{"position":[[12907,17]]}},"keywords":{}}],["documentsasynchron",{"_index":4517,"title":{},"content":{"765":{"position":[[156,21]]}},"keywords":{}}],["documentscr",{"_index":4845,"title":{},"content":{"849":{"position":[[511,15]]}},"keywords":{}}],["documentsfromremot",{"_index":5467,"title":{},"content":{"988":{"position":[[3813,19],[4136,20]]}},"keywords":{}}],["documentsfromremote.length",{"_index":5468,"title":{},"content":{"988":{"position":[[3934,26],[4318,26]]}},"keywords":{}}],["documentsno",{"_index":6403,"title":{},"content":{"1292":{"position":[[321,11],[675,11]]}},"keywords":{}}],["documents—particularli",{"_index":2101,"title":{},"content":{"362":{"position":[[792,22]]}},"keywords":{}}],["documentth",{"_index":5805,"title":{},"content":{"1074":{"position":[[299,11]]}},"keywords":{}}],["doe",{"_index":5800,"title":{},"content":{"1072":{"position":[[2364,5],[2391,4],[2524,4],[2697,6]]}},"keywords":{}}],["doesdocumentdatamatch",{"_index":5755,"title":{"1063":{"position":[[0,24]]}},"content":{},"keywords":{}}],["doesdocumentdatamatch(documentdata",{"_index":5758,"title":{},"content":{"1063":{"position":[[160,39],[264,39]]}},"keywords":{}}],["doesn't",{"_index":559,"title":{},"content":{"35":{"position":[[366,7]]},"42":{"position":[[101,7]]},"65":{"position":[[314,7]]},"249":{"position":[[24,7]]},"287":{"position":[[6,7],[1036,7]]},"390":{"position":[[1283,7],[1797,7]]},"410":{"position":[[1323,7]]},"411":{"position":[[4502,7]]},"412":{"position":[[8732,7]]},"521":{"position":[[101,7]]},"534":{"position":[[380,7]]},"535":{"position":[[724,7]]},"594":{"position":[[378,7]]},"595":{"position":[[745,7]]},"632":{"position":[[938,7]]},"1072":{"position":[[613,7],[1024,7],[1614,7]]},"1287":{"position":[[209,7]]}},"keywords":{}}],["doesn’t",{"_index":3409,"title":{},"content":{"559":{"position":[[1400,7]]}},"keywords":{}}],["dollar",{"_index":848,"title":{},"content":{"55":{"position":[[1017,6]]},"542":{"position":[[726,6]]},"749":{"position":[[6537,6]]},"826":{"position":[[53,6],[241,6]]},"1117":{"position":[[273,6]]},"1118":{"position":[[17,6]]}},"keywords":{}}],["dom",{"_index":1914,"title":{"335":{"position":[[13,3]]}},"content":{"320":{"position":[[34,3]]},"323":{"position":[[137,3]]},"326":{"position":[[190,3]]},"335":{"position":[[98,4],[389,3]]},"346":{"position":[[517,3]]},"460":{"position":[[1018,4]]},"571":{"position":[[805,3]]},"676":{"position":[[97,4]]},"829":{"position":[[79,3]]}},"keywords":{}}],["dom.indexeddb.warningquota",{"_index":1759,"title":{},"content":{"299":{"position":[[1252,27]]}},"keywords":{}}],["domain",{"_index":2612,"title":{"617":{"position":[[15,6]]}},"content":{"411":{"position":[[1616,6]]},"432":{"position":[[338,7]]},"450":{"position":[[243,6]]},"461":{"position":[[868,6]]},"617":{"position":[[48,6],[1261,6]]},"688":{"position":[[566,6]]},"849":{"position":[[255,6]]},"890":{"position":[[567,6]]},"1157":{"position":[[171,7]]}},"keywords":{}}],["domainfirefox",{"_index":3017,"title":{},"content":{"461":{"position":[[818,14]]}},"keywords":{}}],["domainsafari",{"_index":3018,"title":{},"content":{"461":{"position":[[843,13]]}},"keywords":{}}],["don't",{"_index":1108,"title":{},"content":{"131":{"position":[[866,5]]},"282":{"position":[[213,5]]},"346":{"position":[[412,5]]},"411":{"position":[[2195,5]]},"412":{"position":[[10062,5]]},"496":{"position":[[414,5]]},"497":{"position":[[159,5]]},"571":{"position":[[1666,5]]},"668":{"position":[[312,5]]},"689":{"position":[[349,5]]},"752":{"position":[[1319,5]]},"806":{"position":[[207,5]]},"1084":{"position":[[426,5]]}},"keywords":{}}],["done",{"_index":1444,"title":{},"content":{"243":{"position":[[66,5],[145,5],[271,5],[320,5],[361,5]]},"255":{"position":[[896,5]]},"276":{"position":[[441,5]]},"367":{"position":[[955,5],[1061,7]]},"411":{"position":[[3169,4]]},"412":{"position":[[12147,4]]},"450":{"position":[[670,4]]},"454":{"position":[[960,4]]},"466":{"position":[[539,4]]},"469":{"position":[[479,4]]},"480":{"position":[[646,5],[743,5]]},"570":{"position":[[900,4]]},"632":{"position":[[1646,5]]},"634":{"position":[[313,5]]},"653":{"position":[[859,5]]},"660":{"position":[[434,4]]},"663":{"position":[[16,4]]},"696":{"position":[[509,4]]},"698":{"position":[[1637,4]]},"724":{"position":[[836,4]]},"749":{"position":[[17695,4]]},"752":{"position":[[1153,6]]},"756":{"position":[[197,5]]},"776":{"position":[[50,4]]},"780":{"position":[[602,4]]},"796":{"position":[[1246,7],[1315,6],[1384,6]]},"829":{"position":[[1020,4]]},"842":{"position":[[147,4]]},"861":{"position":[[785,5]]},"872":{"position":[[266,4]]},"904":{"position":[[985,5],[1106,7],[1214,5]]},"929":{"position":[[62,5]]},"938":{"position":[[131,5]]},"964":{"position":[[597,5]]},"965":{"position":[[110,4]]},"966":{"position":[[129,4]]},"994":{"position":[[78,4],[265,5]]},"995":{"position":[[804,4]]},"1002":{"position":[[758,4]]},"1041":{"position":[[99,4]]},"1052":{"position":[[154,4]]},"1083":{"position":[[336,5]]},"1094":{"position":[[505,4]]},"1106":{"position":[[112,4]]},"1158":{"position":[[470,5],[525,7],[710,5]]},"1175":{"position":[[596,4]]},"1192":{"position":[[214,4]]},"1208":{"position":[[1865,5]]},"1246":{"position":[[1060,4]]},"1272":{"position":[[175,4]]},"1294":{"position":[[989,4],[1111,5],[1709,4]]},"1295":{"position":[[276,4],[823,4],[1446,5]]},"1296":{"position":[[1815,4]]}},"keywords":{}}],["done.insert",{"_index":6162,"title":{},"content":{"1194":{"position":[[323,11]]}},"keywords":{}}],["done.when",{"_index":6155,"title":{},"content":{"1181":{"position":[[94,9]]}},"keywords":{}}],["don’t",{"_index":2071,"title":{},"content":{"358":{"position":[[1007,5]]},"898":{"position":[[1805,5]]}},"keywords":{}}],["door",{"_index":2636,"title":{},"content":{"411":{"position":[[4984,4]]}},"keywords":{}}],["dot",{"_index":3497,"title":{},"content":{"580":{"position":[[583,3]]}},"keywords":{}}],["doubl",{"_index":847,"title":{},"content":{"55":{"position":[[1010,6]]},"542":{"position":[[719,6]]},"749":{"position":[[11814,6]]},"826":{"position":[[234,6]]},"1118":{"position":[[10,6]]}},"keywords":{}}],["doubt",{"_index":6042,"title":{},"content":{"1134":{"position":[[388,6],[496,6]]}},"keywords":{}}],["down",{"_index":136,"title":{"10":{"position":[[13,5]]}},"content":{"10":{"position":[[95,4],[260,7]]},"20":{"position":[[136,4]]},"28":{"position":[[513,4]]},"311":{"position":[[49,4]]},"354":{"position":[[899,4]]},"402":{"position":[[2147,4],[2255,4]]},"407":{"position":[[600,5]]},"412":{"position":[[6717,4],[10013,4],[12340,4]]},"414":{"position":[[357,5]]},"427":{"position":[[832,4]]},"481":{"position":[[95,5]]},"577":{"position":[[13,4]]},"582":{"position":[[387,4]]},"632":{"position":[[50,4]]},"653":{"position":[[708,4]]},"656":{"position":[[366,5]]},"801":{"position":[[234,4]]},"802":{"position":[[239,4]]},"861":{"position":[[888,4]]},"1013":{"position":[[789,4]]},"1164":{"position":[[1440,4]]},"1198":{"position":[[538,4]]},"1238":{"position":[[338,4]]},"1292":{"position":[[849,4]]},"1300":{"position":[[279,4]]}},"keywords":{}}],["downgrad",{"_index":6571,"title":{"1320":{"position":[[18,10]]}},"content":{},"keywords":{}}],["download",{"_index":2714,"title":{"1024":{"position":[[9,8]]}},"content":{"412":{"position":[[6802,8],[7154,8]]},"420":{"position":[[19,8],[127,9],[198,10],[255,10],[359,10]]},"454":{"position":[[710,10]]},"462":{"position":[[609,10]]},"463":{"position":[[125,11],[404,8],[455,8]]},"468":{"position":[[481,8]]},"696":{"position":[[204,8],[268,8],[597,11]]},"1007":{"position":[[966,9]]},"1008":{"position":[[298,8]]},"1024":{"position":[[143,10],[247,9]]},"1316":{"position":[[3047,9],[3147,9],[3230,10]]}},"keywords":{}}],["downsid",{"_index":577,"title":{"495":{"position":[[0,9]]},"689":{"position":[[0,9]]},"695":{"position":[[0,9]]}},"content":{"36":{"position":[[463,8]]},"402":{"position":[[504,8]]},"412":{"position":[[1289,8]]},"417":{"position":[[359,9]]},"468":{"position":[[59,10]]},"559":{"position":[[958,9]]},"661":{"position":[[1336,8]]},"711":{"position":[[1813,8]]},"772":{"position":[[1368,8]]},"774":{"position":[[933,10]]},"800":{"position":[[455,8]]},"836":{"position":[[1128,9]]},"839":{"position":[[362,10],[587,8]]},"1072":{"position":[[2791,9]]},"1295":{"position":[[1213,9]]},"1300":{"position":[[5,8]]}},"keywords":{}}],["downtim",{"_index":2789,"title":{},"content":{"416":{"position":[[489,8]]}},"keywords":{}}],["dozen",{"_index":2614,"title":{},"content":{"411":{"position":[[1692,6]]}},"keywords":{}}],["draft",{"_index":3619,"title":{},"content":{"613":{"position":[[581,5],[686,5]]}},"keywords":{}}],["dramat",{"_index":2531,"title":{},"content":{"408":{"position":[[813,12],[4354,8]]},"452":{"position":[[570,12]]},"469":{"position":[[454,12]]}},"keywords":{}}],["drastic",{"_index":1967,"title":{},"content":{"342":{"position":[[104,11]]},"361":{"position":[[1099,11]]},"411":{"position":[[302,11]]},"585":{"position":[[145,11]]},"630":{"position":[[304,11]]},"901":{"position":[[416,11]]}},"keywords":{}}],["drawback",{"_index":390,"title":{},"content":{"23":{"position":[[353,8]]},"47":{"position":[[69,10]]},"412":{"position":[[96,9]]},"427":{"position":[[152,8]]},"535":{"position":[[71,9]]},"595":{"position":[[71,9]]},"837":{"position":[[254,9]]},"875":{"position":[[9430,9]]}},"keywords":{}}],["drift",{"_index":6552,"title":{},"content":{"1316":{"position":[[1955,6]]}},"keywords":{}}],["drive",{"_index":1745,"title":{},"content":{"299":{"position":[[327,6]]},"696":{"position":[[1750,5]]}},"keywords":{}}],["driven",{"_index":1167,"title":{},"content":{"153":{"position":[[224,6]]},"174":{"position":[[677,6]]},"198":{"position":[[401,6]]},"321":{"position":[[14,6]]},"326":{"position":[[44,6]]},"331":{"position":[[348,7]]},"408":{"position":[[29,6]]},"476":{"position":[[35,6]]},"503":{"position":[[46,6]]},"510":{"position":[[412,6]]},"567":{"position":[[516,6]]},"828":{"position":[[113,6]]}},"keywords":{}}],["driver",{"_index":4939,"title":{},"content":{"871":{"position":[[822,6]]},"872":{"position":[[115,7]]}},"keywords":{}}],["drizzl",{"_index":6374,"title":{},"content":{"1282":{"position":[[988,7]]}},"keywords":{}}],["drop",{"_index":2598,"title":{},"content":{"410":{"position":[[1289,5]]},"412":{"position":[[3427,4],[5201,4]]},"698":{"position":[[877,8]]},"881":{"position":[[140,4]]},"987":{"position":[[785,4]]},"1301":{"position":[[959,7]]},"1309":{"position":[[998,4]]}},"keywords":{}}],["due",{"_index":699,"title":{},"content":{"45":{"position":[[300,3]]},"67":{"position":[[125,3]]},"71":{"position":[[55,3]]},"161":{"position":[[193,3]]},"320":{"position":[[111,3]]},"400":{"position":[[223,3]]},"408":{"position":[[259,3]]},"429":{"position":[[231,3]]},"434":{"position":[[112,3]]},"446":{"position":[[1191,3]]},"520":{"position":[[76,3]]},"521":{"position":[[54,3]]},"621":{"position":[[39,3]]},"622":{"position":[[40,3],[449,3]]},"623":{"position":[[480,3]]},"624":{"position":[[1401,3],[1620,3]]}},"keywords":{}}],["dump",{"_index":5367,"title":{},"content":{"952":{"position":[[158,4],[262,6]]},"953":{"position":[[20,4],[81,4]]},"971":{"position":[[270,4],[374,6]]},"972":{"position":[[20,5],[80,4]]}},"keywords":{}}],["duplex",{"_index":3565,"title":{},"content":{"611":{"position":[[27,6]]},"621":{"position":[[55,6]]}},"keywords":{}}],["duplic",{"_index":2239,"title":{"740":{"position":[[7,9]]}},"content":{"392":{"position":[[2141,9]]},"740":{"position":[[246,9],[338,9],[623,9]]},"749":{"position":[[5727,9]]},"800":{"position":[[389,9]]},"990":{"position":[[337,9],[428,9],[629,10]]},"1072":{"position":[[199,10]]},"1114":{"position":[[379,10]]},"1321":{"position":[[875,10]]}},"keywords":{}}],["durabl",{"_index":1609,"title":{"1297":{"position":[[8,11]]}},"content":{"266":{"position":[[317,11]]},"412":{"position":[[7755,7]]},"1297":{"position":[[38,10],[144,10],[418,10]]},"1304":{"position":[[131,11]]}},"keywords":{}}],["durat",{"_index":2919,"title":{},"content":{"436":{"position":[[160,8]]}},"keywords":{}}],["dure",{"_index":1220,"title":{},"content":{"174":{"position":[[1687,6]]},"188":{"position":[[1857,6]]},"217":{"position":[[172,6]]},"316":{"position":[[548,6]]},"353":{"position":[[802,6]]},"392":{"position":[[1942,6]]},"395":{"position":[[130,6]]},"408":{"position":[[3320,6]]},"411":{"position":[[108,6]]},"412":{"position":[[2191,6]]},"556":{"position":[[1350,6],[1467,6]]},"634":{"position":[[462,6]]},"674":{"position":[[139,6]]},"690":{"position":[[438,6]]},"749":{"position":[[21237,6]]},"754":{"position":[[499,6]]},"761":{"position":[[194,6]]},"801":{"position":[[270,6]]},"821":{"position":[[88,6],[181,6]]},"829":{"position":[[2052,6]]},"844":{"position":[[126,6]]},"847":{"position":[[23,6]]},"987":{"position":[[146,6]]},"988":{"position":[[2755,6]]},"990":{"position":[[751,6],[959,6]]},"1093":{"position":[[535,6]]},"1186":{"position":[[1,6]]}},"keywords":{}}],["dvm1",{"_index":4409,"title":{},"content":{"749":{"position":[[21724,4]]}},"keywords":{}}],["dxe1",{"_index":4422,"title":{},"content":{"749":{"position":[[23004,4]]}},"keywords":{}}],["dynam",{"_index":348,"title":{},"content":{"20":{"position":[[47,7]]},"34":{"position":[[733,7]]},"47":{"position":[[461,7]]},"90":{"position":[[160,7]]},"116":{"position":[[260,7]]},"124":{"position":[[106,7]]},"226":{"position":[[427,7]]},"275":{"position":[[130,11]]},"289":{"position":[[1460,7]]},"298":{"position":[[295,7],[866,7]]},"351":{"position":[[168,7]]},"362":{"position":[[984,8]]},"491":{"position":[[1838,7]]},"502":{"position":[[186,7],[692,7]]},"509":{"position":[[111,7]]},"514":{"position":[[384,7]]},"530":{"position":[[667,7]]},"562":{"position":[[1007,7]]},"753":{"position":[[153,11]]},"841":{"position":[[1472,7]]},"846":{"position":[[526,11]]},"904":{"position":[[3574,11]]},"1007":{"position":[[2001,11]]},"1009":{"position":[[756,11]]},"1112":{"position":[[418,12],[566,7]]},"1132":{"position":[[995,7]]},"1229":{"position":[[188,11]]},"1268":{"position":[[266,11]]}},"keywords":{}}],["dynamodb",{"_index":2938,"title":{},"content":{"444":{"position":[[630,9]]},"1324":{"position":[[939,9]]}},"keywords":{}}],["e",{"_index":2259,"title":{},"content":{"392":{"position":[[3564,3]]},"496":{"position":[[511,1]]},"1294":{"position":[[1584,1]]}},"keywords":{}}],["e.data.id",{"_index":2261,"title":{},"content":{"392":{"position":[[3650,10]]}},"keywords":{}}],["e.g",{"_index":876,"title":{},"content":{"59":{"position":[[223,6]]},"112":{"position":[[136,6]]},"252":{"position":[[60,6]]},"255":{"position":[[1683,6]]},"305":{"position":[[158,6]]},"353":{"position":[[671,6]]},"354":{"position":[[282,6]]},"383":{"position":[[363,6]]},"411":{"position":[[101,6],[5597,5]]},"412":{"position":[[2237,6],[3585,6],[6422,6]]},"415":{"position":[[94,6]]},"496":{"position":[[488,6]]},"571":{"position":[[547,6]]},"871":{"position":[[609,6]]},"872":{"position":[[4399,4]]},"886":{"position":[[4744,5]]},"1007":{"position":[[543,6],[612,6]]},"1085":{"position":[[1967,6]]},"1133":{"position":[[381,5]]}},"keywords":{}}],["e.target.result",{"_index":6443,"title":{},"content":{"1294":{"position":[[1628,16]]}},"keywords":{}}],["e5",{"_index":2475,"title":{},"content":{"401":{"position":[[567,2]]}},"keywords":{}}],["each",{"_index":716,"title":{},"content":{"46":{"position":[[528,4]]},"158":{"position":[[296,4]]},"162":{"position":[[659,4]]},"204":{"position":[[46,4]]},"220":{"position":[[134,4]]},"261":{"position":[[451,4],[1111,4]]},"289":{"position":[[1739,4]]},"335":{"position":[[372,4]]},"350":{"position":[[35,4]]},"360":{"position":[[33,4]]},"369":{"position":[[1436,4]]},"390":{"position":[[849,4]]},"391":{"position":[[1046,4]]},"392":{"position":[[1406,4],[3409,4]]},"393":{"position":[[102,4],[343,4],[741,4]]},"396":{"position":[[1077,4]]},"397":{"position":[[397,4]]},"398":{"position":[[516,4]]},"407":{"position":[[125,4]]},"408":{"position":[[2600,4],[3163,4]]},"411":{"position":[[430,4],[1224,4],[1391,4],[3374,4],[4101,4],[4727,4],[5027,4]]},"412":{"position":[[11361,4],[12427,4]]},"420":{"position":[[137,4]]},"427":{"position":[[1530,4]]},"444":{"position":[[385,4]]},"458":{"position":[[301,4]]},"462":{"position":[[41,4]]},"464":{"position":[[128,4],[1304,4]]},"493":{"position":[[487,4]]},"502":{"position":[[1025,4]]},"518":{"position":[[492,4]]},"524":{"position":[[38,4]]},"534":{"position":[[543,4]]},"571":{"position":[[1063,4]]},"594":{"position":[[541,4]]},"612":{"position":[[572,4],[1518,4]]},"617":{"position":[[308,4]]},"621":{"position":[[446,4]]},"624":{"position":[[63,4]]},"626":{"position":[[233,4],[480,4]]},"630":{"position":[[32,4]]},"640":{"position":[[76,4]]},"679":{"position":[[286,4]]},"681":{"position":[[483,4]]},"683":{"position":[[488,4]]},"693":{"position":[[478,4]]},"696":{"position":[[1473,4]]},"698":{"position":[[1083,4],[1239,4],[1479,4],[1746,4],[2753,4]]},"699":{"position":[[62,4]]},"700":{"position":[[128,4],[1120,4]]},"701":{"position":[[120,4],[355,4],[1061,4]]},"707":{"position":[[277,4]]},"709":{"position":[[511,4]]},"746":{"position":[[111,4]]},"775":{"position":[[443,4],[584,4]]},"778":{"position":[[157,4]]},"782":{"position":[[25,4]]},"784":{"position":[[61,4]]},"800":{"position":[[704,4]]},"802":{"position":[[118,4],[341,4],[749,4]]},"805":{"position":[[49,4],[112,4]]},"806":{"position":[[324,4]]},"836":{"position":[[1562,4]]},"848":{"position":[[78,4]]},"849":{"position":[[499,4]]},"854":{"position":[[926,4]]},"866":{"position":[[330,4],[547,4]]},"875":{"position":[[3797,4],[3980,4],[5946,4]]},"893":{"position":[[44,4]]},"898":{"position":[[1324,4]]},"903":{"position":[[367,4],[441,4]]},"904":{"position":[[1992,4]]},"906":{"position":[[144,4]]},"908":{"position":[[297,4]]},"921":{"position":[[88,4]]},"937":{"position":[[104,4]]},"953":{"position":[[211,4]]},"958":{"position":[[236,4],[444,4]]},"961":{"position":[[209,4]]},"983":{"position":[[551,4]]},"985":{"position":[[591,4]]},"989":{"position":[[189,4]]},"993":{"position":[[94,4],[221,4]]},"995":{"position":[[1470,4]]},"996":{"position":[[515,4]]},"1007":{"position":[[67,4],[308,4],[721,4]]},"1008":{"position":[[75,4]]},"1009":{"position":[[128,4],[208,4]]},"1024":{"position":[[33,4]]},"1033":{"position":[[206,4],[343,4]]},"1039":{"position":[[110,4]]},"1085":{"position":[[3761,4]]},"1088":{"position":[[468,4]]},"1093":{"position":[[447,4]]},"1100":{"position":[[427,4]]},"1105":{"position":[[325,4]]},"1123":{"position":[[222,4]]},"1174":{"position":[[284,4]]},"1175":{"position":[[127,4],[721,4]]},"1192":{"position":[[67,4]]},"1194":{"position":[[571,4],[893,4]]},"1209":{"position":[[264,4]]},"1267":{"position":[[1,4],[123,4]]},"1295":{"position":[[222,4]]},"1296":{"position":[[624,4]]},"1301":{"position":[[269,4]]},"1304":{"position":[[764,4],[1737,4]]},"1305":{"position":[[474,4],[652,4]]},"1313":{"position":[[202,4]]},"1315":{"position":[[228,4],[252,4]]},"1316":{"position":[[2354,4],[2766,4],[3035,4],[3183,4]]},"1318":{"position":[[23,4]]},"1321":{"position":[[460,4],[990,4]]},"1322":{"position":[[243,4],[438,4]]}},"keywords":{}}],["eachus",{"_index":4846,"title":{},"content":{"849":{"position":[[616,7]]}},"keywords":{}}],["earli",{"_index":1755,"title":{},"content":{"299":{"position":[[929,5]]},"361":{"position":[[179,5]]},"408":{"position":[[299,5],[4571,5]]},"411":{"position":[[3279,5]]},"419":{"position":[[8,5]]},"421":{"position":[[1,5]]},"838":{"position":[[1036,5]]}},"keywords":{}}],["earlier",{"_index":1186,"title":{},"content":{"164":{"position":[[14,8]]}},"keywords":{}}],["eas",{"_index":1015,"title":{},"content":{"94":{"position":[[313,4]]},"179":{"position":[[454,5]]},"320":{"position":[[122,4]]},"357":{"position":[[456,4]]},"388":{"position":[[529,4]]},"447":{"position":[[538,4]]},"838":{"position":[[962,4]]}},"keywords":{}}],["easi",{"_index":421,"title":{"293":{"position":[[0,4]]},"313":{"position":[[3,4]]}},"content":{"25":{"position":[[316,5]]},"34":{"position":[[99,4]]},"63":{"position":[[155,4]]},"167":{"position":[[310,4]]},"287":{"position":[[398,4]]},"336":{"position":[[149,4]]},"353":{"position":[[372,4]]},"364":{"position":[[765,4]]},"381":{"position":[[180,4]]},"393":{"position":[[376,4]]},"412":{"position":[[12638,5],[13533,4],[14018,4],[14516,4],[14875,5]]},"445":{"position":[[1650,4]]},"559":{"position":[[851,4]]},"571":{"position":[[633,4]]},"611":{"position":[[950,4]]},"662":{"position":[[288,4]]},"686":{"position":[[563,4]]},"701":{"position":[[311,4],[530,5]]},"705":{"position":[[650,5]]},"709":{"position":[[168,4]]},"739":{"position":[[12,5]]},"780":{"position":[[339,5]]},"781":{"position":[[835,4]]},"828":{"position":[[511,4]]},"838":{"position":[[317,4],[737,4]]},"839":{"position":[[272,4]]},"981":{"position":[[129,4],[216,4]]},"1071":{"position":[[248,4]]},"1123":{"position":[[716,4]]},"1214":{"position":[[464,4]]},"1252":{"position":[[42,4]]},"1259":{"position":[[20,4]]},"1270":{"position":[[496,4]]},"1304":{"position":[[1926,4]]},"1316":{"position":[[2435,4]]},"1318":{"position":[[91,4]]},"1322":{"position":[[192,4]]}},"keywords":{}}],["easier",{"_index":552,"title":{"89":{"position":[[0,6]]},"90":{"position":[[35,6]]},"94":{"position":[[0,6]]},"222":{"position":[[0,6]]},"279":{"position":[[0,6]]},"282":{"position":[[0,6]]},"487":{"position":[[19,6]]},"1257":{"position":[[0,6]]}},"content":{"35":{"position":[[209,6]]},"46":{"position":[[399,6]]},"89":{"position":[[177,6]]},"105":{"position":[[140,6]]},"173":{"position":[[349,7],[878,6]]},"281":{"position":[[315,6]]},"282":{"position":[[352,6]]},"352":{"position":[[88,6]]},"353":{"position":[[185,6]]},"411":{"position":[[1768,6]]},"412":{"position":[[8882,6]]},"619":{"position":[[293,6]]},"688":{"position":[[507,6],[728,6]]},"691":{"position":[[654,6]]},"698":{"position":[[1584,6]]},"861":{"position":[[160,6]]},"903":{"position":[[684,6]]},"981":{"position":[[903,6]]},"1057":{"position":[[318,7]]},"1089":{"position":[[184,6]]},"1118":{"position":[[110,6]]},"1128":{"position":[[1,6]]},"1162":{"position":[[1166,6]]},"1194":{"position":[[1072,6]]},"1198":{"position":[[1938,6]]},"1214":{"position":[[865,6]]},"1227":{"position":[[119,6]]},"1265":{"position":[[112,6]]},"1307":{"position":[[633,6]]}},"keywords":{}}],["easiest",{"_index":3990,"title":{},"content":{"710":{"position":[[811,7]]},"773":{"position":[[12,7]]},"838":{"position":[[1469,7]]},"860":{"position":[[1178,7]]},"865":{"position":[[127,7]]},"1157":{"position":[[27,7]]},"1242":{"position":[[97,7]]},"1266":{"position":[[5,7]]}},"keywords":{}}],["easili",{"_index":862,"title":{},"content":{"57":{"position":[[333,6]]},"121":{"position":[[184,6]]},"165":{"position":[[342,6]]},"173":{"position":[[963,6]]},"192":{"position":[[333,6]]},"221":{"position":[[185,7]]},"262":{"position":[[501,6]]},"279":{"position":[[227,6]]},"354":{"position":[[327,6]]},"411":{"position":[[760,6]]},"417":{"position":[[294,7]]},"500":{"position":[[134,6]]},"624":{"position":[[399,6]]},"837":{"position":[[457,6]]},"860":{"position":[[989,6]]},"950":{"position":[[138,7]]},"1121":{"position":[[77,6]]},"1124":{"position":[[1948,6]]}},"keywords":{}}],["easily.bas",{"_index":3533,"title":{},"content":{"595":{"position":[[397,12]]}},"keywords":{}}],["easy.compat",{"_index":5429,"title":{},"content":{"981":{"position":[[542,15]]}},"keywords":{}}],["ecosystem",{"_index":1305,"title":{"383":{"position":[[12,10]]}},"content":{"202":{"position":[[57,10]]},"231":{"position":[[120,10]]},"247":{"position":[[79,10]]},"364":{"position":[[411,10]]},"387":{"position":[[268,9]]},"412":{"position":[[1041,10]]},"445":{"position":[[1864,9]]},"838":{"position":[[902,9]]},"839":{"position":[[561,10]]},"1199":{"position":[[104,9]]}},"keywords":{}}],["ecosystemd",{"_index":3145,"title":{},"content":{"483":{"position":[[575,13]]}},"keywords":{}}],["ed",{"_index":3776,"title":{},"content":{"659":{"position":[[425,3]]}},"keywords":{}}],["edg",{"_index":66,"title":{"1093":{"position":[[28,6]]}},"content":{"4":{"position":[[153,4]]},"289":{"position":[[1632,4]]},"298":{"position":[[180,5],[732,4]]},"299":{"position":[[742,4]]},"613":{"position":[[27,4]]},"873":{"position":[[88,4]]},"1123":{"position":[[261,4]]},"1207":{"position":[[121,4]]}},"keywords":{}}],["edit",{"_index":632,"title":{},"content":{"40":{"position":[[134,8]]},"151":{"position":[[341,7]]},"203":{"position":[[243,5]]},"267":{"position":[[622,8],[665,4]]},"312":{"position":[[315,6]]},"339":{"position":[[155,4]]},"375":{"position":[[237,7],[626,7]]},"410":{"position":[[1664,6],[1976,5]]},"411":{"position":[[1442,6]]},"412":{"position":[[2256,5],[3014,5],[3146,4],[4261,7],[6508,7]]},"446":{"position":[[548,7]]},"481":{"position":[[184,5]]},"491":{"position":[[1352,4]]},"495":{"position":[[141,4]]},"496":{"position":[[270,6]]},"632":{"position":[[542,4]]},"635":{"position":[[72,4]]},"691":{"position":[[32,4]]},"698":{"position":[[1953,4]]},"860":{"position":[[839,5]]},"863":{"position":[[639,4]]},"1006":{"position":[[254,4]]},"1007":{"position":[[1051,5]]},"1313":{"position":[[595,4],[684,4]]}},"keywords":{}}],["editor",{"_index":1618,"title":{},"content":{"267":{"position":[[498,8],[1518,8]]},"491":{"position":[[1826,8]]}},"keywords":{}}],["edits.fin",{"_index":1550,"title":{},"content":{"250":{"position":[[291,10]]}},"keywords":{}}],["eede1195b7d94dd5",{"_index":6556,"title":{},"content":{"1316":{"position":[[2273,17]]}},"keywords":{}}],["effect",{"_index":950,"title":{"295":{"position":[[5,9]]}},"content":{"66":{"position":[[645,12]]},"295":{"position":[[56,9]]},"303":{"position":[[1370,9]]},"385":{"position":[[189,12]]},"390":{"position":[[1161,9]]},"398":{"position":[[445,9]]},"618":{"position":[[332,11]]},"635":{"position":[[185,12]]},"676":{"position":[[128,13]]},"801":{"position":[[362,11]]},"988":{"position":[[3342,8],[4671,8]]},"1085":{"position":[[2460,11]]},"1132":{"position":[[1194,9]]}},"keywords":{}}],["effici",{"_index":963,"title":{"146":{"position":[[0,9]]},"213":{"position":[[35,9]]}},"content":{"73":{"position":[[101,9]]},"78":{"position":[[38,9]]},"81":{"position":[[1,9]]},"83":{"position":[[366,10]]},"91":{"position":[[254,9]]},"96":{"position":[[273,12]]},"101":{"position":[[195,9]]},"106":{"position":[[103,9]]},"108":{"position":[[152,9]]},"114":{"position":[[518,9]]},"117":{"position":[[83,9]]},"118":{"position":[[205,9]]},"120":{"position":[[331,9]]},"121":{"position":[[253,9]]},"146":{"position":[[38,9]]},"152":{"position":[[259,9]]},"159":{"position":[[81,11]]},"162":{"position":[[468,9]]},"166":{"position":[[126,9]]},"173":{"position":[[125,11],[518,9]]},"174":{"position":[[1078,9]]},"175":{"position":[[531,9]]},"178":{"position":[[232,11]]},"181":{"position":[[265,9]]},"189":{"position":[[230,9],[797,11]]},"194":{"position":[[175,10]]},"197":{"position":[[172,9]]},"216":{"position":[[34,9]]},"224":{"position":[[322,12]]},"227":{"position":[[121,9]]},"228":{"position":[[297,9]]},"234":{"position":[[161,12]]},"236":{"position":[[320,9]]},"241":{"position":[[693,9]]},"269":{"position":[[402,10]]},"270":{"position":[[239,9]]},"277":{"position":[[220,9]]},"283":{"position":[[236,9]]},"284":{"position":[[85,9]]},"287":{"position":[[788,12]]},"288":{"position":[[1,9]]},"289":{"position":[[286,9]]},"294":{"position":[[144,11],[299,10]]},"354":{"position":[[796,12]]},"366":{"position":[[120,9],[440,12]]},"369":{"position":[[110,9],[163,9]]},"370":{"position":[[163,11]]},"373":{"position":[[721,9]]},"385":{"position":[[54,9]]},"390":{"position":[[1001,9]]},"392":{"position":[[2203,9]]},"395":{"position":[[223,9]]},"396":{"position":[[67,10],[387,9],[757,10]]},"398":{"position":[[88,11]]},"400":{"position":[[400,11]]},"409":{"position":[[61,9]]},"411":{"position":[[555,12]]},"412":{"position":[[9523,11]]},"427":{"position":[[959,9]]},"429":{"position":[[218,12]]},"430":{"position":[[1119,10]]},"432":{"position":[[448,9]]},"435":{"position":[[363,9]]},"441":{"position":[[663,9]]},"445":{"position":[[1953,10]]},"453":{"position":[[759,12]]},"468":{"position":[[224,11]]},"477":{"position":[[341,9]]},"501":{"position":[[27,9]]},"504":{"position":[[228,9],[797,9]]},"508":{"position":[[195,10]]},"519":{"position":[[190,11]]},"524":{"position":[[344,9]]},"527":{"position":[[1,9]]},"530":{"position":[[48,9]]},"535":{"position":[[446,11]]},"595":{"position":[[474,11]]},"610":{"position":[[803,9]]},"613":{"position":[[49,10]]},"618":{"position":[[569,9]]},"621":{"position":[[485,9],[835,9]]},"622":{"position":[[222,9]]},"623":{"position":[[675,10]]},"634":{"position":[[603,9]]},"714":{"position":[[946,9]]},"723":{"position":[[1,9],[107,11],[1369,11]]},"802":{"position":[[674,12],[811,9]]},"1022":{"position":[[906,11]]},"1023":{"position":[[60,9],[567,11]]},"1071":{"position":[[335,9]]},"1072":{"position":[[1906,10],[2845,12]]},"1132":{"position":[[228,9],[1162,11]]},"1206":{"position":[[592,9]]},"1237":{"position":[[485,10]]}},"keywords":{}}],["efficiently.ther",{"_index":3093,"title":{},"content":{"469":{"position":[[852,17]]}},"keywords":{}}],["effort",{"_index":1026,"title":{},"content":{"99":{"position":[[209,6]]},"112":{"position":[[217,7]]},"412":{"position":[[2470,7]]},"445":{"position":[[2405,7]]},"446":{"position":[[1424,7]]},"676":{"position":[[155,7]]},"1295":{"position":[[1323,6]]}},"keywords":{}}],["effort.observ",{"_index":1923,"title":{},"content":{"323":{"position":[[396,17]]}},"keywords":{}}],["effortless",{"_index":2113,"title":{},"content":{"366":{"position":[[48,10]]},"373":{"position":[[564,10]]}},"keywords":{}}],["effortlessli",{"_index":1080,"title":{},"content":{"123":{"position":[[175,13]]},"275":{"position":[[298,13]]},"286":{"position":[[282,13]]},"293":{"position":[[190,12]]},"562":{"position":[[1766,13]]},"575":{"position":[[442,12]]}},"keywords":{}}],["eg",{"_index":4639,"title":{},"content":{"796":{"position":[[489,4]]},"1065":{"position":[[936,3]]}},"keywords":{}}],["eini",{"_index":6483,"title":{},"content":{"1302":{"position":[[174,4]]}},"keywords":{}}],["elect",{"_index":4040,"title":{"735":{"position":[[7,8]]},"738":{"position":[[15,8]]}},"content":{"723":{"position":[[868,9]]},"737":{"position":[[58,8],[182,7]]},"738":{"position":[[22,9],[59,8],[175,10]]},"740":{"position":[[63,8],[488,10]]},"743":{"position":[[12,8],[84,7]]},"793":{"position":[[1119,8]]},"974":{"position":[[62,7]]},"989":{"position":[[361,8]]},"1003":{"position":[[114,7]]},"1171":{"position":[[297,8]]},"1174":{"position":[[436,7],[658,7]]},"1301":{"position":[[1219,8],[1253,8],[1379,8],[1479,8],[1639,8]]}},"keywords":{}}],["elector",{"_index":4104,"title":{},"content":{"740":{"position":[[388,7]]}},"keywords":{}}],["electr",{"_index":647,"title":{},"content":{"41":{"position":[[47,8]]}},"keywords":{}}],["electricsql",{"_index":644,"title":{"41":{"position":[[0,12]]}},"content":{"41":{"position":[[7,11],[350,11]]}},"keywords":{}}],["electron",{"_index":506,"title":{"692":{"position":[[0,8]]},"693":{"position":[[10,8]]},"706":{"position":[[0,8]]},"707":{"position":[[14,9]]},"709":{"position":[[63,9]]},"1214":{"position":[[8,9]]}},"content":{"32":{"position":[[74,8]]},"47":{"position":[[1262,9]]},"201":{"position":[[176,9]]},"207":{"position":[[156,8]]},"248":{"position":[[66,9]]},"254":{"position":[[126,8],[467,9]]},"458":{"position":[[54,8]]},"524":{"position":[[468,8]]},"535":{"position":[[1326,9]]},"631":{"position":[[205,9]]},"693":{"position":[[16,9],[145,8],[279,8],[691,9]]},"694":{"position":[[15,8]]},"707":{"position":[[4,8]]},"708":{"position":[[9,8],[241,8],[365,9],[586,9]]},"709":{"position":[[9,8],[1251,8]]},"710":{"position":[[152,8],[499,9],[924,9],[1356,8],[2482,9]]},"711":{"position":[[261,8],[867,8]]},"712":{"position":[[38,8],[95,8],[208,9]]},"793":{"position":[[337,9],[598,8]]},"964":{"position":[[505,8]]},"1196":{"position":[[57,9]]},"1214":{"position":[[149,8],[589,8]]},"1235":{"position":[[256,8]]},"1246":{"position":[[931,8],[1990,8],[2042,9],[2171,8]]},"1247":{"position":[[84,9]]},"1270":{"position":[[440,8],[539,8]]},"1271":{"position":[[245,9]]}},"keywords":{}}],["electron"",{"_index":1493,"title":{},"content":{"244":{"position":[[470,14]]}},"keywords":{}}],["electron)node.jsserv",{"_index":3122,"title":{},"content":{"479":{"position":[[419,24]]}},"keywords":{}}],["electron.in",{"_index":3718,"title":{},"content":{"640":{"position":[[373,11]]}},"keywords":{}}],["electron.ipcmain",{"_index":3931,"title":{},"content":{"693":{"position":[[975,16]]}},"keywords":{}}],["electron.ipcrender",{"_index":3933,"title":{},"content":{"693":{"position":[[1268,20]]}},"keywords":{}}],["electron.j",{"_index":1051,"title":{"708":{"position":[[25,12]]},"711":{"position":[[10,11]]}},"content":{"112":{"position":[[97,12]]},"174":{"position":[[2703,12]]},"239":{"position":[[134,12]]},"1245":{"position":[[91,12]]}},"keywords":{}}],["electron/rebuild",{"_index":3993,"title":{},"content":{"711":{"position":[[780,17],[924,18]]}},"keywords":{}}],["electron/remot",{"_index":3991,"title":{},"content":{"711":{"position":[[438,16]]}},"keywords":{}}],["eleg",{"_index":2939,"title":{},"content":{"445":{"position":[[240,7]]}},"keywords":{}}],["element",{"_index":1085,"title":{},"content":{"129":{"position":[[55,8]]},"326":{"position":[[194,8]]},"412":{"position":[[5096,7]]},"951":{"position":[[508,8]]}},"keywords":{}}],["elements.offlin",{"_index":1976,"title":{},"content":{"346":{"position":[[521,16]]}},"keywords":{}}],["elements.stringif",{"_index":2883,"title":{},"content":{"427":{"position":[[620,24]]}},"keywords":{}}],["elev",{"_index":3222,"title":{},"content":{"501":{"position":[[390,9]]}},"keywords":{}}],["elimin",{"_index":712,"title":{},"content":{"46":{"position":[[364,11]]},"92":{"position":[[93,11]]},"96":{"position":[[57,10]]},"103":{"position":[[130,10]]},"159":{"position":[[256,10]]},"172":{"position":[[223,10]]},"217":{"position":[[123,11]]},"219":{"position":[[212,11]]},"233":{"position":[[190,10]]},"261":{"position":[[1123,11]]},"265":{"position":[[525,10],[794,11]]},"267":{"position":[[1329,9]]},"360":{"position":[[126,10]]},"376":{"position":[[148,11]]},"421":{"position":[[1113,9]]},"445":{"position":[[2294,10]]},"500":{"position":[[415,9]]},"515":{"position":[[284,11]]},"518":{"position":[[302,11]]},"521":{"position":[[621,11]]},"630":{"position":[[449,11]]}},"keywords":{}}],["elixir",{"_index":655,"title":{},"content":{"41":{"position":[[264,7],[384,7]]}},"keywords":{}}],["else.perform",{"_index":5431,"title":{},"content":{"981":{"position":[[765,16]]}},"keywords":{}}],["email",{"_index":2489,"title":{},"content":{"402":{"position":[[2321,5],[2403,6]]},"408":{"position":[[4445,5],[4841,5]]},"426":{"position":[[332,6]]},"783":{"position":[[346,5]]},"1022":{"position":[[157,5],[300,6],[499,5],[938,6]]},"1023":{"position":[[153,6],[599,6]]},"1289":{"position":[[68,5]]},"1290":{"position":[[160,5]]},"1291":{"position":[[158,5]]}},"keywords":{}}],["emailbyreceivercollect",{"_index":5625,"title":{},"content":{"1022":{"position":[[530,26]]}},"keywords":{}}],["emailbyreceivercollection.bulkinsert",{"_index":5629,"title":{},"content":{"1022":{"position":[[755,37]]}},"keywords":{}}],["emailbyreceivercollection.find",{"_index":5635,"title":{},"content":{"1022":{"position":[[1009,32]]}},"keywords":{}}],["emailbyreceivercollection.find({emailid",{"_index":5626,"title":{},"content":{"1022":{"position":[[646,40]]}},"keywords":{}}],["emailbyreceivercollection.find({word",{"_index":5643,"title":{},"content":{"1023":{"position":[[673,37]]}},"keywords":{}}],["emailcollection.addpipelin",{"_index":5624,"title":{},"content":{"1022":{"position":[[452,29]]},"1023":{"position":[[111,29]]},"1024":{"position":[[205,29]]}},"keywords":{}}],["emailid",{"_index":5631,"title":{},"content":{"1022":{"position":[[829,8]]},"1023":{"position":[[498,8]]}},"keywords":{}}],["emb",{"_index":2467,"title":{},"content":{"401":{"position":[[481,5]]},"408":{"position":[[1843,5]]},"661":{"position":[[79,5]]},"836":{"position":[[81,5]]}},"keywords":{}}],["embed",{"_index":503,"title":{"171":{"position":[[17,8]]},"172":{"position":[[11,8]]},"173":{"position":[[0,8]]},"174":{"position":[[15,8]]},"391":{"position":[[11,10]]},"392":{"position":[[12,10]]},"395":{"position":[[13,10]]},"397":{"position":[[16,10]]}},"content":{"32":{"position":[[12,8]]},"172":{"position":[[4,8]]},"173":{"position":[[39,8],[252,8],[436,8],[491,8],[640,8],[1173,8],[1399,8],[1916,8],[2201,8],[2445,8],[2526,8],[2754,8],[3104,8]]},"174":{"position":[[28,8],[3227,8]]},"175":{"position":[[61,8],[457,8]]},"189":{"position":[[333,8]]},"201":{"position":[[106,8]]},"353":{"position":[[714,8]]},"354":{"position":[[337,8]]},"357":{"position":[[532,8]]},"390":{"position":[[147,11],[165,10],[506,10],[778,10],[986,10]]},"391":{"position":[[78,10],[372,9],[780,9],[960,10],[1111,10]]},"392":{"position":[[14,11],[803,10],[1174,11],[1273,11],[1370,10],[1466,9],[1636,10],[1712,12],[1837,10],[2022,10],[2470,11],[2550,11],[2681,10],[2831,9],[2927,9],[3385,9],[3448,9],[3582,9],[3661,9],[4587,10],[4788,9],[5154,10]]},"393":{"position":[[29,10],[867,10],[1100,10]]},"394":{"position":[[20,10],[287,9],[381,10],[406,10],[1514,10],[1571,10]]},"395":{"position":[[52,10],[388,10]]},"396":{"position":[[937,11],[1003,10],[1082,9],[1771,10]]},"397":{"position":[[49,10],[423,9],[1483,9],[1872,9],[1949,9],[2137,11]]},"398":{"position":[[10,10],[572,9],[605,10],[1841,10],[1913,10],[2953,10],[3075,10],[3207,9],[3325,11]]},"401":{"position":[[57,9],[150,9],[330,10],[377,10],[424,10],[804,11]]},"402":{"position":[[104,11],[145,10],[202,10],[372,9],[590,10],[992,11],[1137,9],[1802,9],[2627,10]]},"403":{"position":[[97,11],[689,10],[833,9],[984,11]]},"404":{"position":[[180,10],[971,10]]},"412":{"position":[[10921,10]]},"711":{"position":[[104,8]]},"775":{"position":[[16,8]]},"776":{"position":[[146,8]]},"841":{"position":[[115,8]]}},"keywords":{}}],["embedd",{"_index":449,"title":{},"content":{"28":{"position":[[24,11]]}},"keywords":{}}],["embedding2",{"_index":2298,"title":{},"content":{"393":{"position":[[1020,12]]}},"keywords":{}}],["embrac",{"_index":1172,"title":{},"content":{"157":{"position":[[6,8]]},"170":{"position":[[361,9]]},"279":{"position":[[40,7]]},"325":{"position":[[152,8]]},"359":{"position":[[161,8]]},"373":{"position":[[356,9]]},"445":{"position":[[1258,8]]},"447":{"position":[[637,7]]},"510":{"position":[[626,9]]},"516":{"position":[[6,8]]}},"keywords":{}}],["emerg",{"_index":1686,"title":{},"content":{"290":{"position":[[75,7]]},"412":{"position":[[847,8],[15227,8]]},"445":{"position":[[46,7]]},"502":{"position":[[6,7]]},"510":{"position":[[129,7]]},"530":{"position":[[145,7]]},"624":{"position":[[147,6]]},"635":{"position":[[34,6]]},"683":{"position":[[445,6]]}},"keywords":{}}],["emiss",{"_index":3134,"title":{},"content":{"481":{"position":[[504,9]]}},"keywords":{}}],["emit",{"_index":734,"title":{},"content":{"47":{"position":[[745,4]]},"130":{"position":[[334,7]]},"174":{"position":[[1672,7]]},"196":{"position":[[37,4]]},"323":{"position":[[30,5]]},"329":{"position":[[113,5]]},"480":{"position":[[793,5]]},"493":{"position":[[368,5],[442,7]]},"494":{"position":[[606,5]]},"502":{"position":[[1019,5]]},"518":{"position":[[486,5]]},"529":{"position":[[63,4]]},"562":{"position":[[1258,5]]},"571":{"position":[[960,5]]},"580":{"position":[[611,5]]},"585":{"position":[[44,4]]},"602":{"position":[[161,4]]},"698":{"position":[[1068,5]]},"752":{"position":[[1081,7]]},"753":{"position":[[57,5]]},"755":{"position":[[178,7]]},"767":{"position":[[264,7]]},"768":{"position":[[223,7]]},"769":{"position":[[238,7]]},"828":{"position":[[33,5]]},"875":{"position":[[4181,7],[6907,4],[7864,5],[8782,8],[9252,8]]},"876":{"position":[[548,4]]},"879":{"position":[[403,5]]},"880":{"position":[[220,4]]},"881":{"position":[[191,4]]},"921":{"position":[[26,5],[82,5]]},"979":{"position":[[1,5],[115,5],[184,4],[378,5]]},"983":{"position":[[751,5]]},"985":{"position":[[273,4],[571,4]]},"988":{"position":[[5335,4],[5958,4]]},"990":{"position":[[714,5]]},"993":{"position":[[88,5],[215,5],[332,5],[479,5],[616,5]]},"1017":{"position":[[48,5]]},"1039":{"position":[[102,7]]},"1049":{"position":[[1,5]]},"1058":{"position":[[384,4]]},"1126":{"position":[[508,5]]},"1150":{"position":[[551,8]]}},"keywords":{}}],["emitted.al",{"_index":5503,"title":{},"content":{"995":{"position":[[70,11]]}},"keywords":{}}],["emphas",{"_index":2804,"title":{},"content":{"419":{"position":[[719,11]]},"690":{"position":[[579,9]]}},"keywords":{}}],["emphasi",{"_index":1930,"title":{},"content":{"327":{"position":[[44,8]]}},"keywords":{}}],["employ",{"_index":1045,"title":{},"content":{"108":{"position":[[6,7]]},"208":{"position":[[6,7]]},"283":{"position":[[182,8]]},"369":{"position":[[199,7]]},"528":{"position":[[6,7]]},"802":{"position":[[607,9]]},"1132":{"position":[[1070,7]]}},"keywords":{}}],["empow",{"_index":1056,"title":{"150":{"position":[[21,10]]},"264":{"position":[[34,10]]}},"content":{"114":{"position":[[447,8]]},"170":{"position":[[82,10]]},"241":{"position":[[460,7]]},"267":{"position":[[1180,8]]},"276":{"position":[[27,8]]},"289":{"position":[[1438,8]]},"373":{"position":[[474,8]]},"384":{"position":[[369,8]]},"388":{"position":[[317,8]]},"447":{"position":[[378,8]]},"502":{"position":[[308,10]]},"504":{"position":[[444,8]]},"506":{"position":[[6,8]]},"509":{"position":[[102,8]]},"510":{"position":[[344,8]]},"912":{"position":[[636,8]]}},"keywords":{}}],["empscripten",{"_index":6468,"title":{},"content":{"1299":{"position":[[553,11]]}},"keywords":{}}],["empti",{"_index":3764,"title":{"655":{"position":[[28,5]]}},"content":{"655":{"position":[[59,5]]},"749":{"position":[[40,5],[1588,5],[2212,5]]},"754":{"position":[[458,5]]},"885":{"position":[[1156,5]]},"983":{"position":[[709,5]]},"984":{"position":[[572,5]]},"988":{"position":[[2813,5]]},"1134":{"position":[[514,5]]}},"keywords":{}}],["emptydatabase.importjson(json",{"_index":5411,"title":{},"content":{"972":{"position":[[101,30]]}},"keywords":{}}],["emul",{"_index":3548,"title":{},"content":{"610":{"position":[[142,8]]}},"keywords":{}}],["en1",{"_index":4300,"title":{},"content":{"749":{"position":[[12884,3]]}},"keywords":{}}],["en2",{"_index":4301,"title":{},"content":{"749":{"position":[[12961,3]]}},"keywords":{}}],["en3",{"_index":4305,"title":{},"content":{"749":{"position":[[13070,3]]}},"keywords":{}}],["en4",{"_index":4306,"title":{},"content":{"749":{"position":[[13187,3]]}},"keywords":{}}],["enabl",{"_index":438,"title":{"734":{"position":[[0,6]]},"916":{"position":[[0,6]]}},"content":{"27":{"position":[[35,7],[274,6]]},"40":{"position":[[77,8]]},"75":{"position":[[6,7]]},"87":{"position":[[114,7]]},"89":{"position":[[222,7]]},"103":{"position":[[52,8]]},"106":{"position":[[95,7]]},"112":{"position":[[39,8]]},"114":{"position":[[509,8]]},"116":{"position":[[83,7]]},"121":{"position":[[114,6]]},"136":{"position":[[294,7]]},"138":{"position":[[112,7]]},"140":{"position":[[276,6]]},"152":{"position":[[252,6]]},"155":{"position":[[251,6]]},"157":{"position":[[42,8]]},"158":{"position":[[246,8]]},"160":{"position":[[207,8]]},"162":{"position":[[737,8]]},"165":{"position":[[137,6]]},"168":{"position":[[59,8]]},"173":{"position":[[101,7],[2773,6]]},"174":{"position":[[244,8],[846,7],[1070,7],[1943,7],[2837,7]]},"177":{"position":[[265,6]]},"179":{"position":[[379,8]]},"184":{"position":[[128,6]]},"210":{"position":[[104,8]]},"215":{"position":[[59,6]]},"220":{"position":[[20,6]]},"222":{"position":[[271,8]]},"224":{"position":[[286,8]]},"235":{"position":[[43,8]]},"237":{"position":[[187,8]]},"239":{"position":[[45,7]]},"240":{"position":[[307,8]]},"255":{"position":[[85,8]]},"265":{"position":[[460,8]]},"266":{"position":[[131,6]]},"280":{"position":[[212,8]]},"283":{"position":[[227,8]]},"286":{"position":[[246,6]]},"287":{"position":[[195,8]]},"289":{"position":[[1949,8]]},"292":{"position":[[213,8]]},"315":{"position":[[953,8]]},"316":{"position":[[83,6],[213,6]]},"323":{"position":[[334,6]]},"326":{"position":[[27,7]]},"328":{"position":[[70,8]]},"356":{"position":[[178,8]]},"358":{"position":[[910,8]]},"366":{"position":[[108,7]]},"369":{"position":[[648,8]]},"375":{"position":[[361,6]]},"380":{"position":[[129,7]]},"407":{"position":[[935,7]]},"408":{"position":[[1603,7],[5085,6]]},"424":{"position":[[65,7]]},"444":{"position":[[691,8]]},"445":{"position":[[1161,7],[2161,7]]},"446":{"position":[[637,6]]},"463":{"position":[[1331,7]]},"480":{"position":[[125,6]]},"501":{"position":[[354,8]]},"504":{"position":[[788,8]]},"509":{"position":[[33,8]]},"516":{"position":[[42,8]]},"518":{"position":[[173,7]]},"529":{"position":[[6,7]]},"535":{"position":[[794,8]]},"567":{"position":[[304,8]]},"595":{"position":[[881,8]]},"610":{"position":[[48,6]]},"611":{"position":[[140,7]]},"613":{"position":[[160,6]]},"614":{"position":[[86,7]]},"639":{"position":[[225,6]]},"675":{"position":[[22,8]]},"683":{"position":[[16,7]]},"693":{"position":[[680,7]]},"723":{"position":[[2268,8]]},"734":{"position":[[659,6]]},"738":{"position":[[4,6]]},"749":{"position":[[983,7],[21746,8]]},"849":{"position":[[799,6]]},"854":{"position":[[826,6]]},"861":{"position":[[2493,6]]},"865":{"position":[[57,7]]},"872":{"position":[[1114,8],[1227,8]]},"901":{"position":[[76,7]]},"915":{"position":[[4,6]]},"964":{"position":[[156,6]]},"1004":{"position":[[174,7]]},"1012":{"position":[[4,6]]},"1072":{"position":[[2180,6]]},"1078":{"position":[[173,6]]},"1083":{"position":[[268,6]]},"1150":{"position":[[248,6]]},"1206":{"position":[[318,8]]},"1213":{"position":[[498,6]]},"1284":{"position":[[162,7],[215,7]]}},"keywords":{}}],["enableindexeddbpersist",{"_index":4880,"title":{"856":{"position":[[11,29]]}},"content":{"856":{"position":[[19,28]]}},"keywords":{}}],["encapsul",{"_index":781,"title":{},"content":{"51":{"position":[[918,11]]}},"keywords":{}}],["encod",{"_index":118,"title":{},"content":{"8":{"position":[[508,6],[566,7]]},"402":{"position":[[2505,7]]},"688":{"position":[[351,8]]},"1296":{"position":[[1768,6]]}},"keywords":{}}],["encount",{"_index":1179,"title":{},"content":{"161":{"position":[[75,9]]},"304":{"position":[[278,9]]},"309":{"position":[[92,9]]}},"keywords":{}}],["encourag",{"_index":2077,"title":{},"content":{"360":{"position":[[690,10]]},"419":{"position":[[1401,9]]},"1151":{"position":[[544,9]]},"1178":{"position":[[543,9]]}},"keywords":{}}],["encrypt",{"_index":480,"title":{"95":{"position":[[22,11]]},"139":{"position":[[0,10]]},"167":{"position":[[0,10]]},"195":{"position":[[0,10]]},"218":{"position":[[9,10]]},"291":{"position":[[15,10]]},"307":{"position":[[32,11]]},"310":{"position":[[12,11]]},"315":{"position":[[0,10]]},"343":{"position":[[0,10]]},"377":{"position":[[13,11]]},"472":{"position":[[51,10]]},"482":{"position":[[36,11]]},"506":{"position":[[0,10]]},"549":{"position":[[13,10],[28,9]]},"550":{"position":[[7,10]]},"551":{"position":[[13,10]]},"552":{"position":[[11,10]]},"554":{"position":[[34,11]]},"555":{"position":[[26,9]]},"556":{"position":[[32,11]]},"564":{"position":[[8,10]]},"586":{"position":[[0,10]]},"629":{"position":[[48,10]]},"638":{"position":[[6,11]]},"713":{"position":[[3,9]]},"714":{"position":[[9,9]]},"716":{"position":[[11,11]]},"717":{"position":[[15,10]]},"720":{"position":[[0,9]]},"721":{"position":[[0,10]]},"912":{"position":[[24,9]]},"1184":{"position":[[0,10]]}},"content":{"29":{"position":[[273,10]]},"47":{"position":[[1103,11]]},"57":{"position":[[321,11],[340,7],[381,11]]},"65":{"position":[[1552,11],[1652,10]]},"95":{"position":[[171,11]]},"139":{"position":[[36,10],[89,11],[187,8]]},"167":{"position":[[74,10],[100,10],[278,10],[339,10]]},"170":{"position":[[404,11]]},"173":{"position":[[1161,11],[1247,11]]},"195":{"position":[[52,10],[81,10]]},"218":{"position":[[89,7],[175,10]]},"244":{"position":[[1144,9]]},"291":{"position":[[26,10],[159,10],[424,10]]},"292":{"position":[[163,9]]},"293":{"position":[[333,9]]},"310":{"position":[[89,10],[123,7],[296,10]]},"313":{"position":[[172,11]]},"314":{"position":[[631,11]]},"315":{"position":[[41,10],[884,10],[895,10],[942,10],[985,9],[1014,9],[1072,11]]},"318":{"position":[[68,11],[414,10]]},"334":{"position":[[443,10]]},"343":{"position":[[15,10]]},"366":{"position":[[565,9]]},"377":{"position":[[175,10],[302,11]]},"383":{"position":[[111,11],[163,10]]},"410":{"position":[[692,11],[790,9]]},"412":{"position":[[13256,7]]},"419":{"position":[[1186,11]]},"479":{"position":[[246,10]]},"480":{"position":[[132,10],[1032,7]]},"482":{"position":[[69,10],[138,10],[447,10],[733,9],[812,10],[971,10],[1009,9]]},"483":{"position":[[1089,10]]},"506":{"position":[[40,7]]},"510":{"position":[[327,11]]},"526":{"position":[[1,10],[102,11]]},"535":{"position":[[1079,10]]},"544":{"position":[[322,10]]},"550":{"position":[[1,10],[160,10],[277,10],[295,10]]},"551":{"position":[[60,9],[107,10],[152,10],[187,10],[340,9],[483,7]]},"553":{"position":[[22,10]]},"554":{"position":[[17,10],[882,10],[1016,9]]},"555":{"position":[[38,11],[98,9],[242,9],[391,9],[432,9],[742,9],[776,9],[1000,9]]},"556":{"position":[[56,10],[144,9],[536,7],[621,10],[683,9],[1173,10],[1225,10],[1450,10],[1708,9]]},"557":{"position":[[309,10],[395,10]]},"560":{"position":[[754,11]]},"564":{"position":[[109,7],[166,10],[555,10],[900,10],[938,7],[984,9],[1018,9]]},"566":{"position":[[1226,10],[1289,7],[1326,10],[1377,10]]},"567":{"position":[[599,11],[616,10],[648,7]]},"579":{"position":[[452,10]]},"586":{"position":[[64,10]]},"595":{"position":[[1156,10]]},"604":{"position":[[232,11],[275,10]]},"632":{"position":[[1393,10]]},"638":{"position":[[161,10],[756,10],[809,7],[846,9]]},"661":{"position":[[1227,10]]},"710":{"position":[[258,10]]},"711":{"position":[[2290,11]]},"714":{"position":[[18,10],[340,10],[473,9],[491,9],[626,9],[697,9],[762,9],[840,9],[1051,9],[1082,9]]},"715":{"position":[[59,10],[193,10]]},"716":{"position":[[5,10],[45,10],[165,10],[210,10],[268,9],[337,9],[485,10]]},"717":{"position":[[36,11],[58,10],[446,10],[537,11],[752,10],[1025,10],[1119,9],[1282,9],[1329,10],[1366,9],[1568,10]]},"718":{"position":[[325,10],[622,9]]},"719":{"position":[[396,7]]},"720":{"position":[[31,10],[58,10],[207,10],[263,9]]},"721":{"position":[[66,11],[102,10],[135,10]]},"723":{"position":[[1928,9],[2010,9]]},"749":{"position":[[835,9],[859,10],[13090,9],[18153,9],[19590,9]]},"793":{"position":[[428,10]]},"838":{"position":[[871,10],[3315,10]]},"901":{"position":[[491,10]]},"912":{"position":[[25,9],[68,10],[221,10],[273,10],[471,10],[752,10]]},"916":{"position":[[219,10],[275,9]]},"942":{"position":[[111,7],[123,9]]},"963":{"position":[[30,9],[192,10]]},"971":{"position":[[154,9]]},"1038":{"position":[[63,10]]},"1074":{"position":[[391,9],[664,9]]},"1123":{"position":[[593,11]]},"1146":{"position":[[58,11]]},"1180":{"position":[[314,9],[386,9]]},"1184":{"position":[[52,9],[148,9],[210,9],[259,10]]},"1237":{"position":[[144,12],[394,10],[447,10]]}},"keywords":{}}],["encrypted/compress",{"_index":6282,"title":{},"content":{"1237":{"position":[[363,20]]}},"keywords":{}}],["encryptedfile.txt",{"_index":3370,"title":{},"content":{"556":{"position":[[940,20]]}},"keywords":{}}],["encryptedindexeddbstorag",{"_index":4030,"title":{},"content":{"718":{"position":[[349,25],[706,26]]}},"keywords":{}}],["encryptedmemorystorag",{"_index":3346,"title":{},"content":{"554":{"position":[[906,22],[1109,23]]}},"keywords":{}}],["encryptedstorag",{"_index":1897,"title":{},"content":{"315":{"position":[[424,16],[589,17]]},"482":{"position":[[464,16],[666,17]]},"564":{"position":[[432,16],[639,17]]},"638":{"position":[[316,16],[476,17]]},"717":{"position":[[776,16],[1203,17]]}},"keywords":{}}],["encryption"",{"_index":1446,"title":{},"content":{"243":{"position":[[94,16]]},"244":{"position":[[620,16]]}},"keywords":{}}],["encryptioncompress",{"_index":3328,"title":{},"content":{"544":{"position":[[356,22]]}},"keywords":{}}],["encryptionif",{"_index":3341,"title":{},"content":{"551":{"position":[[366,12]]}},"keywords":{}}],["end",{"_index":663,"title":{"225":{"position":[[51,3]]}},"content":{"42":{"position":[[299,3]]},"43":{"position":[[347,3]]},"167":{"position":[[328,3],[335,3]]},"218":{"position":[[60,3]]},"289":{"position":[[892,3]]},"350":{"position":[[295,3]]},"351":{"position":[[241,3]]},"353":{"position":[[495,5]]},"354":{"position":[[686,3]]},"360":{"position":[[92,3]]},"385":{"position":[[344,3]]},"399":{"position":[[190,3],[259,3],[555,3]]},"410":{"position":[[606,3]]},"412":{"position":[[9364,3],[10650,3],[10688,3]]},"491":{"position":[[110,4]]},"495":{"position":[[726,4]]},"569":{"position":[[1197,3]]},"697":{"position":[[276,3]]},"749":{"position":[[6275,6],[11608,3],[16142,3]]},"878":{"position":[[482,3]]},"879":{"position":[[68,3],[152,4]]},"901":{"position":[[480,3],[487,3]]},"1030":{"position":[[240,3]]},"1090":{"position":[[44,3]]},"1092":{"position":[[360,3]]},"1093":{"position":[[174,3]]},"1123":{"position":[[329,3]]},"1208":{"position":[[1507,3]]},"1294":{"position":[[1073,3]]},"1316":{"position":[[233,3],[1207,3]]}},"keywords":{}}],["endlessli",{"_index":1973,"title":{},"content":{"346":{"position":[[431,9]]}},"keywords":{}}],["endpoint",{"_index":243,"title":{"209":{"position":[[37,9]]},"478":{"position":[[30,10]]},"1100":{"position":[[9,10]]},"1101":{"position":[[12,9]]},"1102":{"position":[[5,9]]}},"content":{"14":{"position":[[1154,10]]},"18":{"position":[[453,9]]},"24":{"position":[[325,9]]},"37":{"position":[[103,10],[215,10]]},"46":{"position":[[514,9]]},"202":{"position":[[285,9]]},"248":{"position":[[302,9]]},"255":{"position":[[1132,8],[1395,8]]},"321":{"position":[[330,9]]},"381":{"position":[[238,10]]},"410":{"position":[[913,9]]},"411":{"position":[[1108,10],[1319,8],[1346,9],[1718,10]]},"412":{"position":[[1805,10],[1891,9],[2430,9]]},"478":{"position":[[36,9]]},"487":{"position":[[14,10],[456,8]]},"534":{"position":[[529,9]]},"556":{"position":[[1778,9]]},"565":{"position":[[108,9]]},"566":{"position":[[1161,9]]},"582":{"position":[[364,8]]},"594":{"position":[[527,9]]},"612":{"position":[[1712,8]]},"701":{"position":[[1142,8]]},"837":{"position":[[200,9]]},"846":{"position":[[261,8],[1243,9]]},"861":{"position":[[245,8]]},"865":{"position":[[21,8]]},"871":{"position":[[275,8]]},"872":{"position":[[3356,8],[3466,11],[3732,8],[4364,8]]},"875":{"position":[[1289,9],[1313,9],[1738,8],[3570,9],[6007,8],[6523,9],[7813,8]]},"876":{"position":[[446,8],[500,9],[531,9]]},"878":{"position":[[136,8],[419,8]]},"879":{"position":[[271,9],[330,8]]},"885":{"position":[[41,8]]},"886":{"position":[[352,9],[1081,9],[2713,9],[3053,9],[3900,9]]},"888":{"position":[[83,8],[144,8],[1008,9]]},"981":{"position":[[306,9]]},"986":{"position":[[1337,8],[1435,8]]},"1007":{"position":[[500,9]]},"1088":{"position":[[715,9]]},"1092":{"position":[[238,8]]},"1097":{"position":[[231,9],[800,9],[847,10]]},"1100":{"position":[[55,10],[69,8],[207,9],[246,8],[268,9],[318,8],[369,8],[503,8],[522,8],[692,10]]},"1101":{"position":[[17,8],[214,9],[229,8],[345,8],[451,8],[504,10]]},"1102":{"position":[[10,8],[294,8],[325,8],[377,10],[807,9],[1075,8]]},"1103":{"position":[[34,10],[76,8],[288,8],[347,10]]},"1105":{"position":[[330,8],[370,9],[714,8],[773,10]]},"1106":{"position":[[652,8],[711,10]]},"1108":{"position":[[5,9],[382,8],[441,10]]},"1111":{"position":[[63,9]]},"1112":{"position":[[399,9],[487,10]]},"1149":{"position":[[244,9],[1423,8]]},"1228":{"position":[[255,10]]}},"keywords":{}}],["endpoint.urlpath",{"_index":5937,"title":{},"content":{"1102":{"position":[[510,16],[974,17]]}},"keywords":{}}],["endpoint/0",{"_index":5929,"title":{},"content":{"1100":{"position":[[618,11],[782,11]]},"1101":{"position":[[782,12]]}},"keywords":{}}],["endpoints.impl",{"_index":1545,"title":{},"content":{"249":{"position":[[215,19]]}},"keywords":{}}],["endpointsrest",{"_index":3132,"title":{},"content":{"481":{"position":[[336,13]]}},"keywords":{}}],["endpointsupport",{"_index":6178,"title":{},"content":{"1199":{"position":[[65,15]]}},"keywords":{}}],["enforc",{"_index":1547,"title":{},"content":{"250":{"position":[[11,8]]},"282":{"position":[[219,7]]},"351":{"position":[[24,7]]},"353":{"position":[[83,8],[548,8]]},"354":{"position":[[474,9]]},"382":{"position":[[147,9]]},"412":{"position":[[12101,9]]},"535":{"position":[[656,7]]},"798":{"position":[[745,7]]},"802":{"position":[[315,7]]},"989":{"position":[[176,7]]},"990":{"position":[[1376,7]]},"1066":{"position":[[551,7]]},"1314":{"position":[[255,9]]}},"keywords":{}}],["engag",{"_index":1005,"title":{},"content":{"88":{"position":[[205,11]]},"173":{"position":[[1834,6]]},"498":{"position":[[629,7]]},"502":{"position":[[819,8],[905,8]]},"509":{"position":[[178,11]]},"510":{"position":[[611,11]]},"530":{"position":[[114,8]]}},"keywords":{}}],["engin",{"_index":1329,"title":{"276":{"position":[[12,7]]},"980":{"position":[[21,6]]},"981":{"position":[[29,7]]},"982":{"position":[[9,6]]},"983":{"position":[[9,6]]}},"content":{"205":{"position":[[322,7]]},"208":{"position":[[27,6]]},"252":{"position":[[19,6]]},"255":{"position":[[45,7]]},"276":{"position":[[20,6],[276,7]]},"354":{"position":[[1391,7]]},"356":{"position":[[58,7]]},"369":{"position":[[138,10]]},"383":{"position":[[432,7]]},"385":{"position":[[72,8]]},"408":{"position":[[1865,7],[3632,8]]},"412":{"position":[[2001,7],[2962,7],[9109,7],[9975,7]]},"481":{"position":[[18,6]]},"489":{"position":[[257,7]]},"502":{"position":[[675,6]]},"533":{"position":[[213,6]]},"566":{"position":[[114,6]]},"571":{"position":[[1429,10]]},"579":{"position":[[149,7]]},"593":{"position":[[213,6]]},"626":{"position":[[616,6]]},"631":{"position":[[383,7]]},"705":{"position":[[936,6]]},"707":{"position":[[241,6]]},"710":{"position":[[341,6]]},"723":{"position":[[215,6]]},"772":{"position":[[293,7],[327,7]]},"793":{"position":[[630,6]]},"841":{"position":[[128,6]]},"981":{"position":[[82,6],[158,6],[398,7]]},"1004":{"position":[[54,6]]},"1072":{"position":[[1691,7],[1733,7],[1880,8]]},"1101":{"position":[[112,7]]},"1124":{"position":[[1906,6]]},"1198":{"position":[[248,7],[1253,6],[1746,7]]},"1280":{"position":[[89,6]]},"1320":{"position":[[868,6]]}},"keywords":{}}],["engine"",{"_index":1532,"title":{},"content":{"244":{"position":[[1647,12]]}},"keywords":{}}],["engineatla",{"_index":4935,"title":{},"content":{"870":{"position":[[204,11]]}},"keywords":{}}],["enginefirestor",{"_index":1599,"title":{},"content":{"263":{"position":[[580,15]]}},"keywords":{}}],["enginejoin",{"_index":3473,"title":{},"content":{"572":{"position":[[73,10]]}},"keywords":{}}],["enginework",{"_index":5185,"title":{},"content":{"896":{"position":[[306,11]]}},"keywords":{}}],["enhanc",{"_index":525,"title":{},"content":{"33":{"position":[[583,8]]},"65":{"position":[[857,8],[1919,8]]},"77":{"position":[[137,8]]},"81":{"position":[[106,9]]},"87":{"position":[[253,9]]},"94":{"position":[[286,9]]},"97":{"position":[[158,9]]},"109":{"position":[[218,8]]},"114":{"position":[[573,8]]},"136":{"position":[[329,8]]},"137":{"position":[[71,7]]},"166":{"position":[[273,7]]},"170":{"position":[[495,7]]},"173":{"position":[[184,7],[735,8],[1092,8],[2062,8]]},"174":{"position":[[872,8],[1159,9],[1724,8]]},"175":{"position":[[581,8]]},"193":{"position":[[62,7]]},"232":{"position":[[187,8]]},"277":{"position":[[256,8]]},"281":{"position":[[85,8]]},"283":{"position":[[387,8]]},"293":{"position":[[406,9]]},"365":{"position":[[1476,8]]},"373":{"position":[[538,8]]},"432":{"position":[[1159,9]]},"445":{"position":[[1196,8],[1589,8]]},"470":{"position":[[105,8]]},"506":{"position":[[60,9]]},"508":{"position":[[177,9]]},"510":{"position":[[195,9]]},"515":{"position":[[380,8]]},"527":{"position":[[139,9]]},"534":{"position":[[72,9]]},"594":{"position":[[70,9]]},"801":{"position":[[730,8]]},"1132":{"position":[[1141,7]]},"1206":{"position":[[624,8]]}},"keywords":{}}],["enough",{"_index":2443,"title":{},"content":{"400":{"position":[[610,6]]},"702":{"position":[[285,6]]},"703":{"position":[[1176,7]]},"815":{"position":[[268,6]]},"875":{"position":[[151,6]]},"1152":{"position":[[51,6]]}},"keywords":{}}],["enough"",{"_index":3975,"title":{},"content":{"703":{"position":[[1456,12]]}},"keywords":{}}],["enough?"",{"_index":2739,"title":{},"content":{"412":{"position":[[10273,14]]},"703":{"position":[[1232,14]]}},"keywords":{}}],["ensur",{"_index":155,"title":{},"content":{"11":{"position":[[384,7]]},"50":{"position":[[316,6]]},"65":{"position":[[587,7],[1702,7]]},"78":{"position":[[30,7]]},"82":{"position":[[86,8]]},"88":{"position":[[160,8]]},"92":{"position":[[179,8]]},"95":{"position":[[183,8]]},"97":{"position":[[97,7]]},"101":{"position":[[249,8]]},"103":{"position":[[186,7]]},"107":{"position":[[83,7]]},"109":{"position":[[167,7]]},"110":{"position":[[157,8]]},"112":{"position":[[229,7]]},"117":{"position":[[268,8]]},"123":{"position":[[226,7]]},"125":{"position":[[206,7]]},"129":{"position":[[206,6],[617,6]]},"130":{"position":[[278,7]]},"135":{"position":[[134,7]]},"139":{"position":[[206,8]]},"143":{"position":[[239,8]]},"145":{"position":[[4,6]]},"152":{"position":[[315,8]]},"156":{"position":[[277,8]]},"157":{"position":[[264,7]]},"158":{"position":[[282,8]]},"159":{"position":[[299,7]]},"160":{"position":[[120,7]]},"164":{"position":[[366,8]]},"165":{"position":[[263,6]]},"167":{"position":[[150,6]]},"173":{"position":[[1264,7],[2911,7],[3199,7]]},"174":{"position":[[393,7],[906,8],[2216,6]]},"182":{"position":[[274,8]]},"183":{"position":[[270,7]]},"184":{"position":[[302,8]]},"191":{"position":[[31,7],[230,7]]},"195":{"position":[[4,6]]},"202":{"position":[[357,7]]},"218":{"position":[[203,7]]},"228":{"position":[[288,8]]},"233":{"position":[[236,7]]},"234":{"position":[[123,7]]},"235":{"position":[[214,8]]},"237":{"position":[[135,7]]},"240":{"position":[[213,7]]},"250":{"position":[[331,6]]},"263":{"position":[[278,6]]},"267":{"position":[[332,6],[769,8]]},"273":{"position":[[248,7]]},"274":{"position":[[307,8]]},"279":{"position":[[473,7]]},"280":{"position":[[408,7]]},"283":{"position":[[113,6]]},"286":{"position":[[64,8]]},"288":{"position":[[107,8],[311,8]]},"289":{"position":[[851,7],[1331,8]]},"291":{"position":[[170,8]]},"292":{"position":[[332,7]]},"293":{"position":[[1,8],[320,7]]},"294":{"position":[[254,7]]},"327":{"position":[[291,8]]},"328":{"position":[[96,6]]},"339":{"position":[[181,8]]},"340":{"position":[[121,7]]},"346":{"position":[[401,6],[696,6]]},"357":{"position":[[299,6]]},"358":{"position":[[967,8]]},"364":{"position":[[325,7]]},"365":{"position":[[258,8]]},"366":{"position":[[280,8]]},"367":{"position":[[357,8]]},"376":{"position":[[615,6]]},"381":{"position":[[482,7]]},"385":{"position":[[207,7]]},"386":{"position":[[227,7]]},"392":{"position":[[1821,6],[2196,6]]},"394":{"position":[[133,6]]},"397":{"position":[[118,6],[314,7]]},"398":{"position":[[2997,8]]},"407":{"position":[[271,8]]},"410":{"position":[[1307,7],[2088,6]]},"412":{"position":[[702,8],[8699,8],[12317,6]]},"438":{"position":[[327,8]]},"445":{"position":[[569,8],[1509,8]]},"446":{"position":[[192,7],[321,6],[700,8]]},"460":{"position":[[118,7]]},"463":{"position":[[158,6]]},"481":{"position":[[106,7]]},"482":{"position":[[1174,7]]},"489":{"position":[[104,8]]},"500":{"position":[[638,6]]},"502":{"position":[[402,7]]},"504":{"position":[[1002,8]]},"510":{"position":[[653,6]]},"516":{"position":[[144,7]]},"517":{"position":[[266,7]]},"519":{"position":[[144,7]]},"525":{"position":[[127,7]]},"526":{"position":[[114,8]]},"535":{"position":[[566,8]]},"550":{"position":[[12,7]]},"556":{"position":[[708,8],[1684,6],[1909,7]]},"569":{"position":[[364,6]]},"571":{"position":[[1653,6]]},"582":{"position":[[160,7],[410,6]]},"589":{"position":[[64,7]]},"590":{"position":[[173,8]]},"595":{"position":[[593,8]]},"610":{"position":[[1558,6]]},"611":{"position":[[1208,6]]},"626":{"position":[[1124,7]]},"632":{"position":[[261,8],[489,7],[901,8]]},"636":{"position":[[362,8]]},"638":{"position":[[876,7]]},"642":{"position":[[184,8]]},"653":{"position":[[631,7],[1098,7],[1345,7]]},"656":{"position":[[307,6]]},"662":{"position":[[692,7]]},"668":{"position":[[29,6],[126,7],[393,6]]},"723":{"position":[[124,7],[671,7],[840,7],[1184,7],[1416,8],[1728,7],[2555,8]]},"749":{"position":[[20910,6],[24127,6]]},"755":{"position":[[73,6]]},"761":{"position":[[40,7]]},"796":{"position":[[166,6]]},"799":{"position":[[162,7]]},"838":{"position":[[1046,7]]},"848":{"position":[[334,6]]},"857":{"position":[[599,6]]},"861":{"position":[[304,6]]},"875":{"position":[[5768,6]]},"898":{"position":[[151,6]]},"904":{"position":[[2150,6],[3377,6]]},"912":{"position":[[350,7]]},"916":{"position":[[45,6]]},"943":{"position":[[174,8]]},"986":{"position":[[42,6],[251,7],[1212,7]]},"987":{"position":[[836,7]]},"995":{"position":[[1575,6]]},"1003":{"position":[[1,7]]},"1007":{"position":[[944,7]]},"1024":{"position":[[106,6]]},"1048":{"position":[[208,6]]},"1057":{"position":[[258,6]]},"1065":{"position":[[1787,6]]},"1079":{"position":[[546,6]]},"1083":{"position":[[209,6]]},"1085":{"position":[[1771,6]]},"1109":{"position":[[97,6]]},"1115":{"position":[[547,6],[729,6]]},"1120":{"position":[[141,7]]},"1126":{"position":[[210,7]]},"1132":{"position":[[503,8],[938,7]]},"1150":{"position":[[574,8]]},"1151":{"position":[[455,6]]},"1164":{"position":[[963,7],[1295,6]]},"1165":{"position":[[658,6]]},"1175":{"position":[[366,6],[646,7]]},"1178":{"position":[[454,6]]},"1185":{"position":[[199,6]]},"1237":{"position":[[302,6]]},"1250":{"position":[[302,7]]},"1251":{"position":[[70,6],[323,7]]},"1290":{"position":[[153,6]]},"1291":{"position":[[151,6]]},"1300":{"position":[[236,6]]},"1301":{"position":[[1262,7]]},"1304":{"position":[[242,7]]},"1305":{"position":[[329,6]]},"1307":{"position":[[643,6]]},"1313":{"position":[[126,7],[312,7],[718,6]]},"1315":{"position":[[1297,6]]},"1317":{"position":[[458,6]]}},"keywords":{}}],["enter",{"_index":1920,"title":{},"content":{"321":{"position":[[451,5]]},"1007":{"position":[[379,6]]}},"keywords":{}}],["enterpris",{"_index":1729,"title":{},"content":{"298":{"position":[[793,10]]},"299":{"position":[[814,10]]},"353":{"position":[[479,10]]},"354":{"position":[[939,10]]},"386":{"position":[[121,10]]},"619":{"position":[[55,10],[307,10]]},"1009":{"position":[[77,10]]}},"keywords":{}}],["entir",{"_index":1042,"title":{},"content":{"107":{"position":[[15,8]]},"174":{"position":[[1271,8]]},"220":{"position":[[56,8]]},"260":{"position":[[291,8]]},"265":{"position":[[771,6]]},"303":{"position":[[359,6]]},"358":{"position":[[509,6],[685,6],[742,6]]},"411":{"position":[[3338,6],[3920,6]]},"479":{"position":[[68,8]]},"496":{"position":[[438,6]]},"632":{"position":[[966,8]]},"635":{"position":[[511,6]]},"723":{"position":[[1646,6]]},"1006":{"position":[[112,6]]},"1008":{"position":[[311,6]]},"1072":{"position":[[210,6],[323,6],[669,8]]}},"keywords":{}}],["entiti",{"_index":2018,"title":{},"content":{"354":{"position":[[273,8]]},"411":{"position":[[1396,7]]},"793":{"position":[[88,8]]},"849":{"position":[[453,8]]},"1009":{"position":[[963,8]]},"1316":{"position":[[676,9]]}},"keywords":{}}],["entri",{"_index":3851,"title":{},"content":{"674":{"position":[[47,6]]},"904":{"position":[[123,7]]},"1266":{"position":[[533,6]]}},"keywords":{}}],["entrypoint="install"",{"_index":4897,"title":{},"content":{"861":{"position":[[688,30]]}},"keywords":{}}],["enum",{"_index":4644,"title":{},"content":{"796":{"position":[[1054,4],[1212,4]]}},"keywords":{}}],["enumqueri",{"_index":4645,"title":{},"content":{"796":{"position":[[1138,9]]}},"keywords":{}}],["env",{"_index":4074,"title":{},"content":{"729":{"position":[[392,4]]},"861":{"position":[[535,4]]},"1202":{"position":[[431,4]]}},"keywords":{}}],["environ",{"_index":3,"title":{"240":{"position":[[39,13]]}},"content":{"1":{"position":[[8,12]]},"3":{"position":[[80,12]]},"47":{"position":[[1228,12]]},"67":{"position":[[53,13]]},"70":{"position":[[40,13]]},"94":{"position":[[244,11]]},"100":{"position":[[220,12]]},"101":{"position":[[236,12]]},"107":{"position":[[183,12]]},"122":{"position":[[388,13]]},"133":{"position":[[381,13]]},"164":{"position":[[123,13]]},"172":{"position":[[157,12]]},"202":{"position":[[106,12]]},"207":{"position":[[70,12]]},"222":{"position":[[382,12]]},"228":{"position":[[274,13]]},"239":{"position":[[328,13]]},"240":{"position":[[16,12]]},"254":{"position":[[32,11]]},"286":{"position":[[119,12]]},"300":{"position":[[738,13]]},"301":{"position":[[112,13]]},"306":{"position":[[368,13]]},"314":{"position":[[42,11]]},"368":{"position":[[220,13]]},"380":{"position":[[61,13]]},"384":{"position":[[79,13]]},"386":{"position":[[37,13]]},"418":{"position":[[177,13]]},"427":{"position":[[1132,12]]},"438":{"position":[[314,12]]},"444":{"position":[[191,13]]},"479":{"position":[[92,12],[406,12]]},"489":{"position":[[306,11]]},"525":{"position":[[378,12]]},"575":{"position":[[164,11]]},"595":{"position":[[1390,13]]},"613":{"position":[[877,13]]},"619":{"position":[[66,12]]},"624":{"position":[[1535,12]]},"630":{"position":[[264,11]]},"631":{"position":[[130,12]]},"640":{"position":[[81,12],[289,12]]},"642":{"position":[[14,12]]},"723":{"position":[[2675,12]]},"755":{"position":[[36,12]]},"824":{"position":[[463,11]]},"832":{"position":[[363,12]]},"871":{"position":[[596,12]]},"911":{"position":[[172,12]]},"962":{"position":[[415,11]]},"1072":{"position":[[812,11],[1466,12]]},"1151":{"position":[[654,13]]},"1178":{"position":[[653,13]]},"1241":{"position":[[125,13]]},"1268":{"position":[[227,12]]}},"keywords":{}}],["environments.repl",{"_index":1226,"title":{},"content":{"174":{"position":[[2873,24]]}},"keywords":{}}],["ephemer",{"_index":1871,"title":{},"content":{"305":{"position":[[309,9]]},"336":{"position":[[391,9]]},"496":{"position":[[175,9]]},"581":{"position":[[395,9]]},"640":{"position":[[405,9]]}},"keywords":{}}],["ephemeral/incognito",{"_index":1750,"title":{},"content":{"299":{"position":[[521,19]]}},"keywords":{}}],["eq",{"_index":1641,"title":{},"content":{"276":{"position":[[449,4]]},"798":{"position":[[606,4]]},"820":{"position":[[655,4]]},"875":{"position":[[2495,4]]},"1065":{"position":[[249,4],[1084,4]]},"1066":{"position":[[412,4]]},"1072":{"position":[[2513,4]]},"1105":{"position":[[663,4]]},"1158":{"position":[[718,4]]}},"keywords":{}}],["equal",{"_index":2131,"title":{},"content":{"370":{"position":[[272,7]]},"412":{"position":[[4573,6],[4777,6]]},"462":{"position":[[411,5]]},"571":{"position":[[1634,6]]},"626":{"position":[[1174,5]]},"683":{"position":[[232,5]]},"704":{"position":[[288,5]]},"714":{"position":[[642,6]]},"749":{"position":[[11561,5]]},"821":{"position":[[853,7]]},"847":{"position":[[92,5]]},"875":{"position":[[5008,5]]},"885":{"position":[[2224,6]]},"893":{"position":[[332,5]]},"961":{"position":[[168,5]]},"982":{"position":[[514,5]]},"1100":{"position":[[865,5]]},"1164":{"position":[[702,5]]},"1165":{"position":[[938,5]]},"1193":{"position":[[264,5]]},"1229":{"position":[[222,5]]},"1309":{"position":[[703,6]]}},"keywords":{}}],["equalsolv",{"_index":6494,"title":{},"content":{"1309":{"position":[[99,10]]}},"keywords":{}}],["equip",{"_index":2840,"title":{},"content":{"420":{"position":[[1250,10]]}},"keywords":{}}],["equival",{"_index":3920,"title":{},"content":{"691":{"position":[[692,10]]},"1065":{"position":[[344,10]]}},"keywords":{}}],["eras",{"_index":3944,"title":{},"content":{"698":{"position":[[2632,7]]}},"keywords":{}}],["err",{"_index":1588,"title":{},"content":{"261":{"position":[[978,5]]},"711":{"position":[[1593,5]]},"898":{"position":[[4145,6]]},"904":{"position":[[3530,6]]},"1010":{"position":[[345,6]]},"1294":{"position":[[1534,3]]}},"keywords":{}}],["error",{"_index":1377,"title":{"302":{"position":[[9,6]]},"748":{"position":[[5,5]]},"749":{"position":[[9,5]]},"990":{"position":[[0,5]]}},"content":{"210":{"position":[[603,8],[612,7]]},"261":{"position":[[969,8]]},"301":{"position":[[248,5]]},"302":{"position":[[244,5],[470,6],[842,7],[1108,6],[1146,8],[1155,7]]},"306":{"position":[[80,5]]},"438":{"position":[[91,5]]},"440":{"position":[[282,5]]},"461":{"position":[[367,5]]},"487":{"position":[[271,5]]},"515":{"position":[[187,5]]},"610":{"position":[[1157,6],[1273,6]]},"626":{"position":[[973,6]]},"632":{"position":[[2650,6]]},"719":{"position":[[169,6]]},"729":{"position":[[85,5]]},"747":{"position":[[331,6]]},"749":{"position":[[8677,5],[12501,7],[15510,5],[15522,7],[15644,5],[15656,7],[15776,5],[15788,7],[16044,5]]},"752":{"position":[[990,6],[997,5],[1162,7]]},"761":{"position":[[282,5]]},"793":{"position":[[971,6]]},"854":{"position":[[1752,7]]},"872":{"position":[[2849,6]]},"898":{"position":[[4032,6],[4380,7]]},"904":{"position":[[3366,7],[3405,7],[3425,6],[3521,8]]},"911":{"position":[[114,5]]},"944":{"position":[[163,5],[348,6],[559,6],[588,7],[623,5],[636,6]]},"945":{"position":[[104,5],[243,6]]},"947":{"position":[[125,5],[317,6]]},"948":{"position":[[115,6],[265,7]]},"966":{"position":[[202,5]]},"968":{"position":[[588,5]]},"988":{"position":[[5657,6]]},"990":{"position":[[132,7],[484,5],[694,7],[789,6],[865,6],[942,5],[1017,7],[1119,5]]},"993":{"position":[[342,6]]},"1010":{"position":[[247,6]]},"1031":{"position":[[98,7]]},"1044":{"position":[[94,5]]},"1067":{"position":[[1153,5],[1383,5]]},"1084":{"position":[[468,5]]},"1085":{"position":[[2668,6],[2802,5],[3228,6]]},"1164":{"position":[[683,6]]},"1176":{"position":[[67,5]]},"1202":{"position":[[85,6]]},"1207":{"position":[[825,5]]},"1213":{"position":[[835,5]]},"1237":{"position":[[316,6]]},"1282":{"position":[[495,5],[506,7]]},"1304":{"position":[[1000,5]]},"1305":{"position":[[1112,6]]},"1307":{"position":[[478,6],[523,5]]},"1322":{"position":[[140,6]]}},"keywords":{}}],["error('myreadonlyfield",{"_index":5974,"title":{},"content":{"1109":{"position":[[320,22]]}},"keywords":{}}],["error('no",{"_index":3366,"title":{},"content":{"556":{"position":[[492,9]]}},"keywords":{}}],["error('stop",{"_index":4533,"title":{},"content":{"767":{"position":[[697,14]]},"768":{"position":[[707,14]]},"769":{"position":[[668,14]]}},"keywords":{}}],["error.nam",{"_index":1812,"title":{},"content":{"302":{"position":[[855,11]]}},"keywords":{}}],["error.parameters.error",{"_index":5491,"title":{},"content":{"990":{"position":[[1231,23]]}},"keywords":{}}],["error.parameters.errors[0",{"_index":5492,"title":{},"content":{"990":{"position":[[1266,26]]}},"keywords":{}}],["error.parameters.errors[0].cod",{"_index":5493,"title":{},"content":{"990":{"position":[[1304,31]]}},"keywords":{}}],["errors.observ",{"_index":1215,"title":{},"content":{"174":{"position":[[948,17]]}},"keywords":{}}],["es5",{"_index":4068,"title":{},"content":{"728":{"position":[[42,4]]}},"keywords":{}}],["es8",{"_index":4066,"title":{},"content":{"728":{"position":[[20,3]]}},"keywords":{}}],["esm",{"_index":4507,"title":{},"content":{"761":{"position":[[574,3]]}},"keywords":{}}],["especi",{"_index":943,"title":{},"content":{"66":{"position":[[332,10]]},"95":{"position":[[47,10]]},"111":{"position":[[162,10]]},"138":{"position":[[163,10]]},"174":{"position":[[2508,10]]},"217":{"position":[[295,10]]},"223":{"position":[[81,10]]},"265":{"position":[[297,10]]},"298":{"position":[[705,10]]},"299":{"position":[[1083,10]]},"305":{"position":[[541,10]]},"353":{"position":[[501,10]]},"376":{"position":[[510,10]]},"396":{"position":[[1536,10]]},"407":{"position":[[790,10]]},"408":{"position":[[4540,10]]},"412":{"position":[[7822,11]]},"416":{"position":[[259,10]]},"419":{"position":[[1305,11]]},"450":{"position":[[555,10]]},"535":{"position":[[630,10]]},"563":{"position":[[958,10]]},"569":{"position":[[1020,10]]},"595":{"position":[[657,10]]},"611":{"position":[[1077,10]]},"634":{"position":[[25,10]]},"639":{"position":[[32,10]]},"723":{"position":[[598,10]]},"785":{"position":[[15,10]]},"801":{"position":[[259,10]]},"802":{"position":[[852,10]]},"836":{"position":[[1736,10]]},"849":{"position":[[277,10]]},"894":{"position":[[94,10]]},"1072":{"position":[[2891,10]]},"1132":{"position":[[1216,10]]},"1321":{"position":[[31,10]]}},"keywords":{}}],["essenti",{"_index":907,"title":{},"content":{"65":{"position":[[275,9],[1319,9],[1480,9]]},"117":{"position":[[254,9]]},"215":{"position":[[147,9]]},"236":{"position":[[298,9]]},"302":{"position":[[285,9]]},"369":{"position":[[776,9]]},"370":{"position":[[249,9]]},"375":{"position":[[74,9]]},"378":{"position":[[272,10]]},"390":{"position":[[520,11]]},"392":{"position":[[2122,9]]},"396":{"position":[[1723,9]]},"412":{"position":[[6317,12],[8337,12],[9033,11]]},"430":{"position":[[549,9]]},"432":{"position":[[87,9]]},"476":{"position":[[189,11]]},"577":{"position":[[22,10]]},"802":{"position":[[617,9]]},"839":{"position":[[527,11]]},"899":{"position":[[170,11]]}},"keywords":{}}],["essential.hybrid",{"_index":2794,"title":{},"content":{"418":{"position":[[484,17]]}},"keywords":{}}],["establish",{"_index":1297,"title":{},"content":{"192":{"position":[[340,9]]},"289":{"position":[[602,11],[735,9],[1141,9]]},"354":{"position":[[1246,11]]},"358":{"position":[[941,12]]},"503":{"position":[[181,9]]},"610":{"position":[[325,11],[1090,9]]},"611":{"position":[[494,12],[735,14]]},"614":{"position":[[488,9]]},"621":{"position":[[408,12]]},"623":{"position":[[541,14]]},"624":{"position":[[1461,12]]},"901":{"position":[[236,12],[321,14],[367,9]]},"906":{"position":[[159,9]]}},"keywords":{}}],["estim",{"_index":1768,"title":{},"content":{"300":{"position":[[91,10],[138,8]]},"461":{"position":[[1227,10]]}},"keywords":{}}],["etc",{"_index":454,"title":{},"content":{"28":{"position":[[232,5]]},"32":{"position":[[217,4]]},"33":{"position":[[657,4]]},"248":{"position":[[90,6]]},"255":{"position":[[1731,6]]},"411":{"position":[[1277,6],[2013,6],[5654,5]]},"412":{"position":[[9258,6],[13785,5]]},"556":{"position":[[605,6]]},"565":{"position":[[154,6]]},"566":{"position":[[1196,5]]},"630":{"position":[[559,5]]},"745":{"position":[[618,6]]},"825":{"position":[[493,6]]},"841":{"position":[[799,5]]},"1065":{"position":[[1272,6]]},"1324":{"position":[[681,4]]}},"keywords":{}}],["etc.).us",{"_index":1544,"title":{},"content":{"249":{"position":[[137,9]]}},"keywords":{}}],["etho",{"_index":2640,"title":{},"content":{"411":{"position":[[5300,5]]}},"keywords":{}}],["euclidean",{"_index":2290,"title":{},"content":{"393":{"position":[[213,9],[468,9],[836,9]]}},"keywords":{}}],["euclideandist",{"_index":2295,"title":{},"content":{"393":{"position":[[925,17]]},"394":{"position":[[476,17]]},"397":{"position":[[1628,17]]}},"keywords":{}}],["euclideandistance((doc",{"_index":2410,"title":{},"content":{"398":{"position":[[1522,22],[2675,22]]}},"keywords":{}}],["euclideandistance(embedding1",{"_index":2297,"title":{},"content":{"393":{"position":[[990,29]]}},"keywords":{}}],["euclideandistance(mysamplevectors[idx",{"_index":2499,"title":{},"content":{"403":{"position":[[944,39]]}},"keywords":{}}],["euclideandistance(queryvector",{"_index":2315,"title":{},"content":{"394":{"position":[[805,30]]}},"keywords":{}}],["euclideandistance(samplevectors[i",{"_index":2398,"title":{},"content":{"398":{"position":[[918,35],[2204,35]]}},"keywords":{}}],["euclideandistance(samplevectors[idx",{"_index":2385,"title":{},"content":{"397":{"position":[[2099,37]]}},"keywords":{}}],["ev",{"_index":2274,"title":{},"content":{"392":{"position":[[4311,4]]}},"keywords":{}}],["ev.data.id",{"_index":2275,"title":{},"content":{"392":{"position":[[4332,11]]}},"keywords":{}}],["eval",{"_index":6384,"title":{},"content":{"1287":{"position":[[44,6],[112,5],[221,5]]}},"keywords":{}}],["evalu",{"_index":3659,"title":{},"content":{"620":{"position":[[116,10]]},"681":{"position":[[568,8]]},"783":{"position":[[168,10]]},"1271":{"position":[[513,10]]}},"keywords":{}}],["even",{"_index":192,"title":{},"content":{"13":{"position":[[259,4]]},"14":{"position":[[1173,4]]},"18":{"position":[[254,4]]},"23":{"position":[[292,4]]},"47":{"position":[[828,4]]},"53":{"position":[[127,4]]},"65":{"position":[[543,4],[1715,4]]},"110":{"position":[[41,4]]},"133":{"position":[[119,4]]},"139":{"position":[[238,4]]},"152":{"position":[[349,4]]},"157":{"position":[[83,4]]},"164":{"position":[[216,4]]},"167":{"position":[[199,4]]},"173":{"position":[[1317,4],[1442,4]]},"183":{"position":[[113,4]]},"191":{"position":[[78,4]]},"203":{"position":[[324,4]]},"212":{"position":[[291,4]]},"215":{"position":[[220,4]]},"218":{"position":[[216,4]]},"227":{"position":[[378,4]]},"248":{"position":[[166,4]]},"252":{"position":[[270,4]]},"253":{"position":[[187,4]]},"266":{"position":[[220,4]]},"273":{"position":[[300,4]]},"280":{"position":[[85,4],[256,4]]},"283":{"position":[[456,4]]},"289":{"position":[[1996,4]]},"291":{"position":[[184,4]]},"292":{"position":[[125,4],[264,4]]},"294":{"position":[[310,4]]},"303":{"position":[[1,4]]},"310":{"position":[[252,4]]},"323":{"position":[[206,4]]},"327":{"position":[[161,4]]},"328":{"position":[[261,4]]},"338":{"position":[[127,4]]},"347":{"position":[[561,4]]},"358":{"position":[[789,4]]},"362":{"position":[[753,4],[1632,4]]},"369":{"position":[[479,4]]},"375":{"position":[[990,4]]},"376":{"position":[[657,4]]},"380":{"position":[[75,4]]},"385":{"position":[[220,4]]},"390":{"position":[[1263,4]]},"400":{"position":[[674,4]]},"403":{"position":[[40,4]]},"404":{"position":[[375,4]]},"408":{"position":[[418,4],[1132,4],[5092,4],[5182,4]]},"410":{"position":[[757,4],[1223,4]]},"411":{"position":[[4078,4]]},"412":{"position":[[1556,4],[3984,4],[5080,4],[5972,4],[7108,4],[8568,4],[9691,4],[13832,4],[14611,4]]},"414":{"position":[[107,4]]},"420":{"position":[[244,4],[1286,4]]},"424":{"position":[[296,4]]},"439":{"position":[[565,4]]},"445":{"position":[[606,4]]},"446":{"position":[[232,4]]},"450":{"position":[[679,4]]},"455":{"position":[[833,4]]},"457":{"position":[[341,4]]},"461":{"position":[[457,4]]},"482":{"position":[[1235,4]]},"486":{"position":[[294,4]]},"489":{"position":[[679,4]]},"500":{"position":[[670,4]]},"502":{"position":[[438,4]]},"516":{"position":[[87,4]]},"525":{"position":[[329,4]]},"534":{"position":[[262,4]]},"541":{"position":[[863,4]]},"550":{"position":[[26,4]]},"569":{"position":[[1226,4]]},"571":{"position":[[425,4],[1263,4]]},"574":{"position":[[241,4]]},"581":{"position":[[296,4]]},"582":{"position":[[101,4]]},"591":{"position":[[702,4]]},"594":{"position":[[260,4]]},"600":{"position":[[184,4]]},"611":{"position":[[1374,4]]},"613":{"position":[[297,4],[892,4]]},"616":{"position":[[653,4]]},"617":{"position":[[172,4],[371,4]]},"630":{"position":[[703,4]]},"632":{"position":[[698,4]]},"634":{"position":[[384,4]]},"662":{"position":[[181,4]]},"685":{"position":[[180,4]]},"688":{"position":[[651,4]]},"699":{"position":[[676,4]]},"701":{"position":[[732,4]]},"702":{"position":[[524,4]]},"704":{"position":[[283,4],[439,4]]},"705":{"position":[[539,4],[1388,4]]},"709":{"position":[[865,4]]},"723":{"position":[[178,4],[2381,4]]},"724":{"position":[[900,4]]},"778":{"position":[[456,4]]},"779":{"position":[[7,4]]},"781":{"position":[[749,4]]},"838":{"position":[[210,4],[3350,4]]},"854":{"position":[[1245,4]]},"860":{"position":[[412,4]]},"912":{"position":[[363,4]]},"956":{"position":[[101,4]]},"986":{"position":[[143,4]]},"988":{"position":[[1398,4]]},"1072":{"position":[[252,4]]},"1085":{"position":[[663,4]]},"1092":{"position":[[559,4]]},"1093":{"position":[[254,4]]},"1124":{"position":[[1680,4]]},"1132":{"position":[[253,4]]},"1133":{"position":[[586,4]]},"1161":{"position":[[174,4]]},"1164":{"position":[[991,4]]},"1180":{"position":[[174,4]]},"1198":{"position":[[940,4],[1404,4]]},"1206":{"position":[[368,4]]},"1207":{"position":[[419,4]]},"1209":{"position":[[286,4],[472,4]]},"1246":{"position":[[841,4]]},"1252":{"position":[[322,4]]},"1282":{"position":[[288,4]]},"1295":{"position":[[1142,4]]},"1304":{"position":[[1351,4]]},"1314":{"position":[[112,4]]},"1316":{"position":[[1999,4]]},"1318":{"position":[[759,4]]},"1319":{"position":[[653,4]]},"1320":{"position":[[327,4],[758,4]]}},"keywords":{}}],["event",{"_index":116,"title":{"140":{"position":[[19,5]]},"168":{"position":[[19,5]]},"196":{"position":[[19,5]]},"344":{"position":[[19,5]]},"509":{"position":[[19,5]]},"529":{"position":[[19,5]]},"609":{"position":[[26,6]]},"612":{"position":[[21,8]]},"626":{"position":[[22,6]]},"985":{"position":[[0,5]]},"1318":{"position":[[0,5]]}},"content":{"8":{"position":[[483,6]]},"11":{"position":[[744,5]]},"134":{"position":[[286,6]]},"140":{"position":[[293,5]]},"153":{"position":[[218,5]]},"168":{"position":[[32,5]]},"174":{"position":[[1680,6]]},"196":{"position":[[42,6],[140,5]]},"234":{"position":[[112,6]]},"255":{"position":[[247,5]]},"302":{"position":[[250,6],[431,5]]},"320":{"position":[[52,5]]},"326":{"position":[[38,5]]},"331":{"position":[[342,5]]},"334":{"position":[[536,5]]},"411":{"position":[[4440,8]]},"432":{"position":[[624,6],[831,6],[916,7]]},"445":{"position":[[1373,6]]},"458":{"position":[[530,6],[609,6],[664,5],[762,6],[858,7]]},"459":{"position":[[893,7],[951,7]]},"464":{"position":[[220,6]]},"481":{"position":[[498,5]]},"490":{"position":[[450,5],[504,5]]},"491":{"position":[[641,6],[1680,6]]},"529":{"position":[[68,6],[145,5]]},"566":{"position":[[499,8]]},"569":{"position":[[219,7]]},"571":{"position":[[148,6]]},"579":{"position":[[544,5]]},"610":{"position":[[1589,6]]},"612":{"position":[[13,6],[397,6],[585,5],[658,6],[824,7],[875,5],[974,6],[991,7],[1121,5],[1237,6],[1266,5],[1592,5],[1645,5],[2182,5]]},"616":{"position":[[547,6]]},"619":{"position":[[273,6]]},"620":{"position":[[54,6]]},"621":{"position":[[201,7],[569,5]]},"622":{"position":[[214,7]]},"623":{"position":[[184,7]]},"624":{"position":[[134,6],[593,5]]},"626":{"position":[[71,6],[163,6],[380,7],[498,6],[833,5],[1113,6]]},"628":{"position":[[114,6]]},"698":{"position":[[1077,5],[1130,5],[1244,5],[2450,6],[2575,5]]},"711":{"position":[[1519,7]]},"740":{"position":[[355,6]]},"755":{"position":[[167,6]]},"826":{"position":[[91,6]]},"846":{"position":[[1419,7]]},"875":{"position":[[4167,5],[4531,5],[6682,5],[6916,7],[6990,6],[7053,6],[7726,5],[7874,6],[7981,6],[8229,5],[8772,6],[9340,6]]},"876":{"position":[[302,6]]},"879":{"position":[[477,5],[604,6]]},"882":{"position":[[21,7]]},"885":{"position":[[467,7]]},"886":{"position":[[5056,6]]},"890":{"position":[[115,7]]},"941":{"position":[[202,5]]},"953":{"position":[[200,6]]},"961":{"position":[[194,6]]},"964":{"position":[[167,5],[271,6]]},"970":{"position":[[69,6]]},"979":{"position":[[7,6],[189,6],[388,5]]},"984":{"position":[[671,5]]},"985":{"position":[[51,6],[225,6],[285,6],[525,7],[585,5]]},"988":{"position":[[4096,6],[5054,7],[5561,5],[5906,6],[6096,6]]},"996":{"position":[[344,6]]},"1088":{"position":[[509,6]]},"1124":{"position":[[830,7],[1261,6]]},"1126":{"position":[[223,6],[514,5],[819,6]]},"1230":{"position":[[155,6]]},"1300":{"position":[[798,5],[1055,5]]},"1318":{"position":[[34,5],[126,6],[292,6],[555,5],[1117,6]]}},"keywords":{}}],["event.checkpoint",{"_index":5031,"title":{},"content":{"875":{"position":[[5352,16]]}},"keywords":{}}],["event.data",{"_index":3575,"title":{},"content":{"611":{"position":[[891,12]]},"612":{"position":[[1310,12]]},"988":{"position":[[5365,10]]}},"keywords":{}}],["event.documents.push(changerow.newdocumentst",{"_index":5030,"title":{},"content":{"875":{"position":[[5302,49]]}},"keywords":{}}],["eventdata",{"_index":5052,"title":{},"content":{"875":{"position":[[8249,9]]}},"keywords":{}}],["eventdata.checkpoint",{"_index":5056,"title":{},"content":{"875":{"position":[[8350,20]]}},"keywords":{}}],["eventdata.docu",{"_index":5055,"title":{},"content":{"875":{"position":[[8317,20]]}},"keywords":{}}],["eventreduc",{"_index":981,"title":{"78":{"position":[[36,11]]},"108":{"position":[[36,11]]},"234":{"position":[[36,11]]},"277":{"position":[[31,12]]},"965":{"position":[[0,12]]},"1256":{"position":[[0,12]]}},"content":{"78":{"position":[[8,11]]},"108":{"position":[[18,11]]},"174":{"position":[[1538,11],[1583,11]]},"209":{"position":[[336,12]]},"234":{"position":[[42,11]]},"255":{"position":[[680,12]]},"277":{"position":[[34,12],[150,11]]},"283":{"position":[[357,11]]},"334":{"position":[[505,12]]},"369":{"position":[[1226,11]]},"411":{"position":[[3412,11]]},"522":{"position":[[644,12],[672,11]]},"571":{"position":[[1736,11]]},"579":{"position":[[514,12]]},"799":{"position":[[227,11]]},"960":{"position":[[539,12],[567,11]]},"965":{"position":[[222,11],[334,12]]},"1065":{"position":[[1640,11]]},"1071":{"position":[[458,11]]},"1083":{"position":[[279,11]]},"1318":{"position":[[852,11]]}},"keywords":{}}],["events.get",{"_index":5944,"title":{},"content":{"1102":{"position":[[1226,10]]}},"keywords":{}}],["eventsnotif",{"_index":4520,"title":{},"content":{"765":{"position":[[253,19]]}},"keywords":{}}],["eventsourc",{"_index":3585,"title":{"882":{"position":[[7,11]]}},"content":{"612":{"position":[[745,11],[906,11],[1359,11]]},"616":{"position":[[739,11],[982,11],[1025,11]]},"617":{"position":[[1677,12]]},"875":{"position":[[8114,11],[8132,12],[8588,11],[9533,11],[9551,12]]},"882":{"position":[[33,11],[87,11],[262,11],[430,12]]}},"keywords":{}}],["eventsource("https://example.com/events"",{"_index":3588,"title":{},"content":{"612":{"position":[[1156,52]]}},"keywords":{}}],["eventsource.onerror",{"_index":5058,"title":{},"content":{"875":{"position":[[8959,19]]}},"keywords":{}}],["eventsource.onmessag",{"_index":5051,"title":{},"content":{"875":{"position":[[8205,21],[9624,21]]}},"keywords":{}}],["eventu",{"_index":1860,"title":{"700":{"position":[[0,8]]}},"content":{"304":{"position":[[187,10]]},"407":{"position":[[292,10]]},"411":{"position":[[4739,10]]},"412":{"position":[[5578,8],[5652,10],[5847,11],[6356,8]]},"660":{"position":[[383,11]]},"1125":{"position":[[399,10]]}},"keywords":{}}],["everyday",{"_index":3294,"title":{},"content":{"535":{"position":[[85,8]]},"595":{"position":[[85,8]]}},"keywords":{}}],["everyon",{"_index":1619,"title":{},"content":{"267":{"position":[[783,8]]},"412":{"position":[[4242,8],[11658,8]]},"446":{"position":[[714,8]]}},"keywords":{}}],["everyth",{"_index":156,"title":{"1320":{"position":[[0,10]]}},"content":{"11":{"position":[[397,10]]},"18":{"position":[[137,10],[218,10]]},"28":{"position":[[68,10]]},"188":{"position":[[1768,10]]},"358":{"position":[[34,10],[410,11],[1018,10]]},"362":{"position":[[560,10]]},"394":{"position":[[140,10]]},"407":{"position":[[679,10]]},"412":{"position":[[6811,10],[8745,10]]},"421":{"position":[[185,10],[845,10]]},"460":{"position":[[1050,10],[1404,11]]},"464":{"position":[[1059,10]]},"469":{"position":[[367,10]]},"478":{"position":[[180,10]]},"481":{"position":[[460,10]]},"483":{"position":[[485,10]]},"668":{"position":[[134,10],[400,10]]},"697":{"position":[[404,10]]},"699":{"position":[[423,10]]},"702":{"position":[[719,10]]},"704":{"position":[[534,10]]},"705":{"position":[[601,10]]},"772":{"position":[[2003,10]]},"773":{"position":[[412,10]]},"835":{"position":[[197,10]]},"997":{"position":[[63,10]]},"1066":{"position":[[174,10]]},"1072":{"position":[[1438,10]]},"1292":{"position":[[419,10]]},"1313":{"position":[[284,10],[356,10]]},"1315":{"position":[[1669,11]]},"1316":{"position":[[1017,10]]},"1318":{"position":[[268,10]]},"1320":{"position":[[650,10]]},"1324":{"position":[[465,10]]}},"keywords":{}}],["everything.no",{"_index":3408,"title":{},"content":{"559":{"position":[[1283,13]]}},"keywords":{}}],["everywher",{"_index":1334,"title":{"207":{"position":[[9,10]]}},"content":{},"keywords":{}}],["evict",{"_index":1757,"title":{},"content":{"299":{"position":[[995,8]]},"305":{"position":[[140,8]]},"412":{"position":[[7797,5],[7987,8]]}},"keywords":{}}],["evid",{"_index":2478,"title":{},"content":{"401":{"position":[[619,7]]}},"keywords":{}}],["evolut",{"_index":1431,"title":{},"content":{"240":{"position":[[332,10]]}},"keywords":{}}],["evolv",{"_index":860,"title":{"352":{"position":[[13,8]]}},"content":{"57":{"position":[[273,6]]},"110":{"position":[[218,8]]},"170":{"position":[[589,7]]},"174":{"position":[[2265,8]]},"202":{"position":[[456,8]]},"282":{"position":[[362,6]]},"299":{"position":[[1197,8]]},"320":{"position":[[300,7]]},"353":{"position":[[275,8]]},"354":{"position":[[1604,8]]},"362":{"position":[[74,9]]},"367":{"position":[[283,8]]},"369":{"position":[[851,8]]},"382":{"position":[[324,6]]},"412":{"position":[[11040,8]]},"419":{"position":[[628,7]]},"510":{"position":[[13,8]]},"530":{"position":[[600,7]]},"636":{"position":[[17,6]]},"836":{"position":[[2139,7]]}},"keywords":{}}],["evtsourc",{"_index":3587,"title":{},"content":{"612":{"position":[[1140,9]]}},"keywords":{}}],["evtsource.onmessag",{"_index":3589,"title":{},"content":{"612":{"position":[[1244,19]]}},"keywords":{}}],["ex",{"_index":4847,"title":{},"content":{"849":{"position":[[632,4]]}},"keywords":{}}],["exact",{"_index":2165,"title":{},"content":{"383":{"position":[[514,5]]},"390":{"position":[[339,5],[478,5],[1303,5]]},"626":{"position":[[1168,5]]},"679":{"position":[[262,5]]},"686":{"position":[[585,5]]},"749":{"position":[[1468,5]]},"756":{"position":[[289,5]]},"872":{"position":[[3652,5]]},"888":{"position":[[607,5]]},"1091":{"position":[[129,5]]},"1157":{"position":[[186,5]]},"1257":{"position":[[65,5]]},"1316":{"position":[[249,5]]}},"keywords":{}}],["exactli",{"_index":2130,"title":{},"content":{"369":{"position":[[1536,7]]},"412":{"position":[[961,7]]},"562":{"position":[[1657,7]]},"683":{"position":[[224,7]]},"684":{"position":[[114,7]]},"703":{"position":[[669,7],[838,7]]},"723":{"position":[[883,7]]},"737":{"position":[[106,7],[301,7]]},"755":{"position":[[85,7]]},"779":{"position":[[286,7]]},"981":{"position":[[1602,7]]},"1100":{"position":[[101,7]]},"1183":{"position":[[361,7]]},"1267":{"position":[[454,7]]},"1318":{"position":[[55,7]]}},"keywords":{}}],["examin",{"_index":2647,"title":{},"content":{"412":{"position":[[172,7]]}},"keywords":{}}],["exampl",{"_index":19,"title":{"56":{"position":[[18,7]]},"261":{"position":[[0,8]]},"315":{"position":[[11,8]]},"316":{"position":[[12,8]]},"425":{"position":[[45,8]]},"480":{"position":[[12,8]]},"493":{"position":[[8,8]]},"494":{"position":[[6,8]]},"543":{"position":[[16,7]]},"562":{"position":[[11,7]]},"603":{"position":[[14,7]]},"691":{"position":[[0,8]]},"736":{"position":[[9,8]]},"739":{"position":[[5,8]]},"741":{"position":[[5,8]]},"812":{"position":[[0,7]]},"813":{"position":[[0,7]]},"848":{"position":[[5,8]]},"1065":{"position":[[6,9]]},"1074":{"position":[[0,8]]},"1080":{"position":[[6,8]]},"1236":{"position":[[14,9]]}},"content":{"1":{"position":[[291,7]]},"51":{"position":[[1014,7],[1053,8]]},"56":{"position":[[17,7]]},"149":{"position":[[453,7]]},"188":{"position":[[1701,7]]},"198":{"position":[[508,7]]},"228":{"position":[[358,7]]},"241":{"position":[[319,9]]},"255":{"position":[[306,8]]},"261":{"position":[[994,7]]},"296":{"position":[[24,7]]},"303":{"position":[[447,8]]},"315":{"position":[[120,7]]},"334":{"position":[[20,7]]},"335":{"position":[[107,8],[552,7]]},"347":{"position":[[443,9],[469,8]]},"361":{"position":[[455,8]]},"362":{"position":[[1514,9],[1540,8]]},"365":{"position":[[887,8]]},"367":{"position":[[686,7]]},"373":{"position":[[319,9]]},"390":{"position":[[591,8]]},"392":{"position":[[773,7],[2489,8]]},"394":{"position":[[1551,8]]},"396":{"position":[[1304,7]]},"397":{"position":[[376,7]]},"402":{"position":[[275,7],[838,8],[2307,7]]},"404":{"position":[[597,7]]},"408":{"position":[[539,8]]},"411":{"position":[[3809,8],[4308,8]]},"412":{"position":[[998,7],[3085,8],[4373,7],[5190,7],[6843,8],[9902,8],[10847,7],[12510,8],[13861,7]]},"425":{"position":[[36,8]]},"426":{"position":[[261,7]]},"429":{"position":[[471,7]]},"451":{"position":[[495,7]]},"459":{"position":[[454,8]]},"469":{"position":[[163,7],[593,7]]},"482":{"position":[[149,8]]},"497":{"position":[[391,8]]},"511":{"position":[[476,7]]},"523":{"position":[[216,7]]},"531":{"position":[[451,7]]},"538":{"position":[[160,7]]},"541":{"position":[[104,7]]},"543":{"position":[[17,7]]},"554":{"position":[[242,7],[309,7]]},"556":{"position":[[209,8]]},"557":{"position":[[170,7]]},"567":{"position":[[523,8],[775,9],[855,7]]},"571":{"position":[[674,7]]},"579":{"position":[[107,7],[876,8]]},"580":{"position":[[225,7]]},"591":{"position":[[582,7],[625,7],[685,9],[721,8]]},"598":{"position":[[161,7]]},"601":{"position":[[11,7]]},"603":{"position":[[17,7]]},"616":{"position":[[965,7]]},"626":{"position":[[627,7]]},"632":{"position":[[1003,7],[2073,7]]},"634":{"position":[[265,8]]},"638":{"position":[[195,8]]},"656":{"position":[[202,8]]},"661":{"position":[[1497,7]]},"678":{"position":[[218,8]]},"681":{"position":[[239,7]]},"685":{"position":[[443,7]]},"688":{"position":[[584,8]]},"691":{"position":[[5,8],[519,8]]},"696":{"position":[[1946,7]]},"697":{"position":[[126,7]]},"701":{"position":[[480,7]]},"703":{"position":[[342,7]]},"710":{"position":[[170,8],[2525,7]]},"728":{"position":[[119,7]]},"730":{"position":[[8,8]]},"739":{"position":[[29,7]]},"741":{"position":[[9,7]]},"742":{"position":[[17,7]]},"757":{"position":[[46,8]]},"774":{"position":[[338,7]]},"796":{"position":[[260,8]]},"798":{"position":[[327,7]]},"799":{"position":[[339,7]]},"820":{"position":[[223,7]]},"821":{"position":[[413,7],[688,7]]},"824":{"position":[[288,7]]},"825":{"position":[[1055,7],[1142,7]]},"826":{"position":[[280,7]]},"832":{"position":[[28,7],[277,7]]},"837":{"position":[[342,7]]},"838":{"position":[[3253,7]]},"842":{"position":[[97,7]]},"866":{"position":[[691,7]]},"872":{"position":[[1437,7]]},"873":{"position":[[34,7]]},"885":{"position":[[122,7],[2672,8],[2726,7]]},"888":{"position":[[128,7],[910,7]]},"889":{"position":[[67,7],[646,7],[1100,8]]},"890":{"position":[[989,7]]},"898":{"position":[[791,7]]},"904":{"position":[[178,7],[1135,7]]},"906":{"position":[[534,7],[756,7]]},"913":{"position":[[169,7]]},"962":{"position":[[461,7]]},"964":{"position":[[212,7]]},"968":{"position":[[321,7]]},"981":{"position":[[990,7]]},"984":{"position":[[382,7]]},"986":{"position":[[681,7]]},"988":{"position":[[3640,7]]},"990":{"position":[[1029,7]]},"995":{"position":[[1308,7]]},"1009":{"position":[[38,8]]},"1022":{"position":[[135,7]]},"1033":{"position":[[408,7]]},"1048":{"position":[[94,7],[397,8]]},"1065":{"position":[[11,8],[378,7],[952,7],[1229,7]]},"1069":{"position":[[438,8]]},"1072":{"position":[[2619,8]]},"1074":{"position":[[9,7]]},"1084":{"position":[[294,8]]},"1085":{"position":[[1204,8]]},"1095":{"position":[[124,7]]},"1104":{"position":[[656,7]]},"1105":{"position":[[429,7]]},"1106":{"position":[[134,7],[345,7]]},"1115":{"position":[[173,7]]},"1118":{"position":[[202,7]]},"1121":{"position":[[170,7]]},"1124":{"position":[[396,7],[2010,7]]},"1132":{"position":[[741,7]]},"1135":{"position":[[153,7]]},"1139":{"position":[[84,7]]},"1145":{"position":[[80,7]]},"1149":{"position":[[503,7]]},"1150":{"position":[[410,7]]},"1165":{"position":[[143,7]]},"1191":{"position":[[259,7]]},"1198":{"position":[[1020,7],[1357,7]]},"1213":{"position":[[434,7]]},"1222":{"position":[[1114,7]]},"1236":{"position":[[61,8]]},"1252":{"position":[[91,7]]},"1268":{"position":[[298,7]]},"1271":{"position":[[997,8],[1652,8]]},"1272":{"position":[[422,7]]},"1274":{"position":[[457,7]]},"1279":{"position":[[844,7]]},"1296":{"position":[[241,7]]},"1300":{"position":[[358,7],[556,7]]},"1318":{"position":[[152,7]]}},"keywords":{}}],["example.if",{"_index":4586,"title":{},"content":{"776":{"position":[[27,10]]}},"keywords":{}}],["example.txt",{"_index":6201,"title":{},"content":{"1208":{"position":[[894,14]]}},"keywords":{}}],["exampledb",{"_index":1613,"title":{},"content":{"266":{"position":[[689,12]]},"662":{"position":[[2151,12]]},"710":{"position":[[1720,12]]},"772":{"position":[[795,12]]},"773":{"position":[[585,12]]},"774":{"position":[[687,12]]},"838":{"position":[[2322,12]]},"1125":{"position":[[312,12]]},"1130":{"position":[[185,12]]},"1134":{"position":[[162,12]]},"1138":{"position":[[306,12]]},"1139":{"position":[[561,12]]},"1140":{"position":[[620,12]]},"1144":{"position":[[210,12]]},"1145":{"position":[[550,12]]},"1146":{"position":[[255,12]]},"1158":{"position":[[218,12]]},"1159":{"position":[[404,12]]},"1168":{"position":[[166,12]]},"1172":{"position":[[331,12]]},"1189":{"position":[[429,12]]},"1201":{"position":[[206,12]]},"1271":{"position":[[1595,12]]},"1274":{"position":[[346,12]]},"1275":{"position":[[357,12]]},"1276":{"position":[[959,12]]},"1277":{"position":[[406,12]]},"1278":{"position":[[483,12],[935,12]]},"1279":{"position":[[733,12]]},"1280":{"position":[[468,12]]}},"keywords":{}}],["examples"",{"_index":1500,"title":{},"content":{"244":{"position":[[781,14]]}},"keywords":{}}],["examplether",{"_index":4013,"title":{},"content":{"712":{"position":[[104,12]]}},"keywords":{}}],["exce",{"_index":1794,"title":{"303":{"position":[[10,6]]}},"content":{"302":{"position":[[48,7]]}},"keywords":{}}],["exceed",{"_index":1793,"title":{},"content":{"301":{"position":[[731,9]]},"302":{"position":[[925,9]]},"932":{"position":[[291,9]]}},"keywords":{}}],["excel",{"_index":961,"title":{"200":{"position":[[15,9]]}},"content":{"71":{"position":[[12,9]]},"98":{"position":[[38,5]]},"102":{"position":[[23,9]]},"105":{"position":[[100,9]]},"110":{"position":[[6,6]]},"174":{"position":[[771,9]]},"179":{"position":[[212,9]]},"225":{"position":[[21,5]]},"229":{"position":[[186,9]]},"232":{"position":[[94,9]]},"262":{"position":[[128,5]]},"265":{"position":[[845,9]]},"267":{"position":[[236,9]]},"280":{"position":[[115,6]]},"283":{"position":[[8,9]]},"289":{"position":[[630,6]]},"292":{"position":[[54,6]]},"354":{"position":[[464,6]]},"362":{"position":[[673,5]]},"378":{"position":[[191,6]]},"426":{"position":[[23,6]]},"429":{"position":[[171,6]]},"441":{"position":[[146,9]]},"445":{"position":[[895,9]]},"491":{"position":[[1780,6]]},"530":{"position":[[493,5]]},"540":{"position":[[6,6]]},"559":{"position":[[1577,10]]},"600":{"position":[[6,6]]},"624":{"position":[[641,5]]}},"keywords":{}}],["except",{"_index":1194,"title":{},"content":{"170":{"position":[[18,11]]},"198":{"position":[[437,11]]},"267":{"position":[[1237,11]]},"271":{"position":[[143,11]]},"290":{"position":[[182,11]]},"302":{"position":[[142,10]]},"353":{"position":[[45,11]]},"447":{"position":[[484,11]]},"886":{"position":[[4554,6]]}},"keywords":{}}],["excess",{"_index":2551,"title":{},"content":{"408":{"position":[[2740,9]]},"430":{"position":[[707,9]]}},"keywords":{}}],["exchang",{"_index":1590,"title":{},"content":{"261":{"position":[[1195,9]]},"289":{"position":[[1925,8]]},"375":{"position":[[666,8]]},"611":{"position":[[172,8]]},"614":{"position":[[358,8]]},"621":{"position":[[168,8]]},"901":{"position":[[112,8]]}},"keywords":{}}],["excit",{"_index":2641,"title":{},"content":{"411":{"position":[[5428,7]]}},"keywords":{}}],["exclam",{"_index":6217,"title":{},"content":{"1208":{"position":[[1483,11]]}},"keywords":{}}],["exclud",{"_index":4646,"title":{},"content":{"796":{"position":[[1288,7]]},"1266":{"position":[[760,8]]}},"keywords":{}}],["exclus",{"_index":3581,"title":{},"content":{"612":{"position":[[134,11]]}},"keywords":{}}],["exec",{"_index":805,"title":{"1057":{"position":[[0,7]]}},"content":{"52":{"position":[[440,10],[526,10],[673,10]]},"276":{"position":[[464,10]]},"398":{"position":[[1175,10],[1336,9],[2505,10]]},"539":{"position":[[440,10],[526,10],[673,10]]},"599":{"position":[[467,10],[553,10],[704,10]]},"662":{"position":[[2736,10]]},"710":{"position":[[2043,10]]},"772":{"position":[[1063,10]]},"799":{"position":[[603,12]]},"838":{"position":[[2950,10]]},"949":{"position":[[184,8]]},"1022":{"position":[[1073,10]]},"1067":{"position":[[2024,10]]},"1158":{"position":[[733,10]]}},"keywords":{}}],["exec().then(doc",{"_index":5358,"title":{},"content":{"950":{"position":[[305,18],[443,16]]}},"keywords":{}}],["exec().then(docu",{"_index":5764,"title":{},"content":{"1065":{"position":[[267,22],[846,22],[1135,22],[1357,22],[1474,22]]}},"keywords":{}}],["exec(tru",{"_index":3357,"title":{},"content":{"555":{"position":[[534,14]]},"556":{"position":[[876,14]]},"1057":{"position":[[243,11],[493,12]]}},"keywords":{}}],["execut",{"_index":1049,"title":{},"content":{"108":{"position":[[168,9]]},"138":{"position":[[152,10]]},"166":{"position":[[168,10]]},"173":{"position":[[2557,8]]},"174":{"position":[[1700,10]]},"220":{"position":[[159,8]]},"254":{"position":[[53,7]]},"283":{"position":[[132,10]]},"408":{"position":[[3565,9]]},"454":{"position":[[75,9]]},"479":{"position":[[481,9]]},"723":{"position":[[504,7],[703,8]]},"801":{"position":[[171,8]]},"802":{"position":[[288,7],[529,9]]},"816":{"position":[[331,8]]},"829":{"position":[[2674,8],[2760,9]]},"898":{"position":[[1333,7]]},"949":{"position":[[196,7]]},"1072":{"position":[[1344,7]]},"1316":{"position":[[1753,7]]}},"keywords":{}}],["exhibit",{"_index":1758,"title":{},"content":{"299":{"position":[[1063,7]]}},"keywords":{}}],["exist",{"_index":1169,"title":{"857":{"position":[[38,8]]}},"content":{"155":{"position":[[150,8]]},"230":{"position":[[205,8]]},"249":{"position":[[147,8]]},"260":{"position":[[62,8],[149,6]]},"266":{"position":[[770,6]]},"354":{"position":[[975,8]]},"361":{"position":[[71,6]]},"396":{"position":[[17,5]]},"402":{"position":[[1976,5]]},"411":{"position":[[3482,8]]},"412":{"position":[[1426,8],[1916,8],[2546,8]]},"445":{"position":[[1855,8]]},"458":{"position":[[249,5]]},"481":{"position":[[236,5]]},"535":{"position":[[1202,6]]},"616":{"position":[[282,8]]},"632":{"position":[[872,8]]},"653":{"position":[[615,8]]},"683":{"position":[[630,9],[663,7],[806,5],[826,8],[884,6],[963,7]]},"686":{"position":[[474,8]]},"698":{"position":[[2335,8]]},"719":{"position":[[111,8]]},"749":{"position":[[5038,7],[5635,7],[6758,8],[9293,5],[9866,7],[9980,7],[10832,5],[14314,6],[22072,6]]},"754":{"position":[[485,8]]},"759":{"position":[[1037,5]]},"774":{"position":[[1036,6]]},"806":{"position":[[234,8]]},"848":{"position":[[362,6]]},"857":{"position":[[184,8]]},"875":{"position":[[7164,5]]},"885":{"position":[[32,5]]},"887":{"position":[[22,8],[499,8]]},"898":{"position":[[854,6]]},"919":{"position":[[78,6]]},"939":{"position":[[11,8]]},"943":{"position":[[148,6],[231,8],[347,8]]},"946":{"position":[[37,5]]},"951":{"position":[[255,5]]},"958":{"position":[[586,5]]},"986":{"position":[[463,6]]},"989":{"position":[[418,5]]},"995":{"position":[[1587,6]]},"1014":{"position":[[110,7]]},"1015":{"position":[[64,7],[90,7]]},"1016":{"position":[[103,7]]},"1017":{"position":[[82,7]]},"1057":{"position":[[279,6]]},"1065":{"position":[[1010,8],[1110,8]]},"1108":{"position":[[94,5]]},"1159":{"position":[[33,6]]},"1164":{"position":[[711,8]]},"1222":{"position":[[869,8]]},"1251":{"position":[[252,5]]},"1272":{"position":[[393,8]]},"1298":{"position":[[284,7]]},"1300":{"position":[[129,6],[1097,6]]},"1304":{"position":[[1967,8]]},"1309":{"position":[[110,8]]}},"keywords":{}}],["exit",{"_index":459,"title":{},"content":{"28":{"position":[[380,6],[452,5]]},"30":{"position":[[187,6]]},"773":{"position":[[303,6]]},"1030":{"position":[[34,4]]},"1164":{"position":[[1022,5]]},"1192":{"position":[[367,6]]},"1300":{"position":[[849,6]]}},"keywords":{}}],["expand",{"_index":2125,"title":{},"content":{"369":{"position":[[579,8]]},"408":{"position":[[2204,8]]},"480":{"position":[[105,6]]},"639":{"position":[[16,6]]},"1006":{"position":[[73,6]]}},"keywords":{}}],["expect",{"_index":2301,"title":{"409":{"position":[[13,6]]}},"content":{"394":{"position":[[164,9]]},"409":{"position":[[319,6]]},"410":{"position":[[415,6],[1492,6]]},"421":{"position":[[40,8],[1031,6],[1243,12]]},"497":{"position":[[137,8]]},"590":{"position":[[741,8]]},"622":{"position":[[567,8]]},"660":{"position":[[349,6]]},"668":{"position":[[420,8]]},"689":{"position":[[365,9]]},"749":{"position":[[4145,8]]},"880":{"position":[[229,7]]},"944":{"position":[[429,6]]},"1065":{"position":[[1668,7]]},"1188":{"position":[[194,7]]},"1313":{"position":[[611,7]]}},"keywords":{}}],["expected.do",{"_index":3832,"title":{},"content":{"668":{"position":[[154,11]]}},"keywords":{}}],["expedit",{"_index":3240,"title":{},"content":{"507":{"position":[[116,8]]},"801":{"position":[[664,8]]}},"keywords":{}}],["expens",{"_index":500,"title":{},"content":{"31":{"position":[[282,9]]},"204":{"position":[[306,8]]},"262":{"position":[[217,10]]},"376":{"position":[[305,9]]},"412":{"position":[[4834,10]]},"490":{"position":[[571,9]]},"711":{"position":[[2176,9]]},"902":{"position":[[886,9]]},"1052":{"position":[[125,9]]},"1108":{"position":[[730,10]]},"1309":{"position":[[760,10]]}},"keywords":{}}],["experi",{"_index":893,"title":{"201":{"position":[[26,11]]},"410":{"position":[[5,10]]},"411":{"position":[[10,10]]},"486":{"position":[[12,10]]}},"content":{"61":{"position":[[513,10]]},"65":{"position":[[417,11],[1933,12]]},"66":{"position":[[283,10]]},"69":{"position":[[165,11]]},"77":{"position":[[155,10]]},"87":{"position":[[241,11]]},"90":{"position":[[327,11]]},"101":{"position":[[272,11]]},"109":{"position":[[255,12]]},"114":{"position":[[587,12]]},"117":{"position":[[306,11]]},"125":{"position":[[306,11]]},"136":{"position":[[355,11]]},"148":{"position":[[291,11]]},"152":{"position":[[338,10]]},"156":{"position":[[326,11]]},"160":{"position":[[234,10]]},"174":{"position":[[893,12],[2314,10]]},"175":{"position":[[595,12]]},"178":{"position":[[410,10]]},"191":{"position":[[301,11]]},"198":{"position":[[454,11]]},"205":{"position":[[423,11]]},"216":{"position":[[217,12]]},"217":{"position":[[275,11]]},"221":{"position":[[305,11]]},"263":{"position":[[449,10]]},"265":{"position":[[492,12]]},"267":{"position":[[463,11]]},"269":{"position":[[350,10]]},"277":{"position":[[230,11]]},"280":{"position":[[430,11]]},"281":{"position":[[104,11]]},"283":{"position":[[445,10]]},"292":{"position":[[432,11]]},"304":{"position":[[421,10]]},"312":{"position":[[222,11]]},"346":{"position":[[712,10]]},"375":{"position":[[951,10]]},"379":{"position":[[328,11]]},"385":{"position":[[353,11]]},"407":{"position":[[717,10]]},"408":{"position":[[2086,10],[5187,12]]},"411":{"position":[[1830,11]]},"412":{"position":[[15158,10]]},"415":{"position":[[441,10]]},"421":{"position":[[720,11],[1170,10]]},"445":{"position":[[1210,11],[1543,11],[2509,10]]},"446":{"position":[[1073,11]]},"447":{"position":[[501,11]]},"474":{"position":[[305,11]]},"483":{"position":[[836,10],[1291,11]]},"485":{"position":[[68,10]]},"491":{"position":[[954,10]]},"498":{"position":[[715,10]]},"500":{"position":[[274,10]]},"510":{"position":[[111,12],[754,11]]},"517":{"position":[[385,11]]},"519":{"position":[[282,10]]},"521":{"position":[[522,10]]},"530":{"position":[[128,11]]},"534":{"position":[[108,11]]},"582":{"position":[[748,11]]},"589":{"position":[[213,11]]},"594":{"position":[[106,11]]},"641":{"position":[[65,11]]},"643":{"position":[[346,11]]},"644":{"position":[[715,10]]},"723":{"position":[[2783,10]]},"801":{"position":[[581,11]]},"913":{"position":[[335,12]]},"1009":{"position":[[705,10]]}},"keywords":{}}],["experience.limit",{"_index":2882,"title":{},"content":{"427":{"position":[[388,18]]}},"keywords":{}}],["experiences.synchron",{"_index":1917,"title":{},"content":{"321":{"position":[[119,23]]}},"keywords":{}}],["experiment",{"_index":2572,"title":{},"content":{"408":{"position":[[5266,12]]},"411":{"position":[[5183,12]]},"458":{"position":[[892,12]]},"624":{"position":[[1139,12]]},"863":{"position":[[822,12],[929,12]]}},"keywords":{}}],["expir",{"_index":1854,"title":{},"content":{"303":{"position":[[1402,6]]}},"keywords":{}}],["explain",{"_index":6527,"title":{},"content":{"1315":{"position":[[156,8]]}},"keywords":{}}],["explicit",{"_index":1407,"title":{"1298":{"position":[[0,8]]}},"content":{"226":{"position":[[166,8]]},"304":{"position":[[13,8]]},"351":{"position":[[68,8]]},"515":{"position":[[309,8]]},"556":{"position":[[1328,8]]},"828":{"position":[[381,8]]}},"keywords":{}}],["explicitli",{"_index":1983,"title":{},"content":{"347":{"position":[[582,10]]},"362":{"position":[[1653,10]]},"451":{"position":[[814,10]]},"502":{"position":[[65,10]]},"654":{"position":[[259,10]]},"797":{"position":[[189,10],[299,10]]},"800":{"position":[[766,10]]},"966":{"position":[[798,10]]},"1298":{"position":[[4,10],[194,10]]}},"keywords":{}}],["explor",{"_index":872,"title":{"425":{"position":[[0,9]]},"504":{"position":[[0,9]]}},"content":{"59":{"position":[[36,8]]},"61":{"position":[[195,7]]},"65":{"position":[[16,8]]},"84":{"position":[[4,7]]},"114":{"position":[[4,7]]},"127":{"position":[[71,7]]},"132":{"position":[[178,7]]},"149":{"position":[[4,7]]},"173":{"position":[[211,7]]},"174":{"position":[[121,7]]},"175":{"position":[[12,7]]},"180":{"position":[[72,7]]},"187":{"position":[[57,7]]},"190":{"position":[[124,7]]},"193":{"position":[[111,7]]},"229":{"position":[[163,7]]},"241":{"position":[[12,7]]},"263":{"position":[[238,10]]},"284":{"position":[[118,7]]},"287":{"position":[[288,7]]},"306":{"position":[[218,7]]},"318":{"position":[[366,7]]},"347":{"position":[[4,7]]},"362":{"position":[[1084,7]]},"373":{"position":[[12,7]]},"432":{"position":[[100,7]]},"483":{"position":[[558,7]]},"498":{"position":[[330,7]]},"511":{"position":[[4,7]]},"531":{"position":[[4,7]]},"544":{"position":[[347,8]]},"546":{"position":[[328,8]]},"567":{"position":[[201,7]]},"591":{"position":[[4,7],[601,7]]},"602":{"position":[[11,9]]},"606":{"position":[[318,8]]},"1141":{"position":[[297,9]]},"1151":{"position":[[561,7]]},"1178":{"position":[[560,7]]},"1207":{"position":[[153,8]]},"1215":{"position":[[246,8]]}},"keywords":{}}],["expo",{"_index":294,"title":{"1278":{"position":[[11,4]]}},"content":{"17":{"position":[[342,4]]},"793":{"position":[[324,5]]},"1214":{"position":[[714,5]]},"1278":{"position":[[13,4],[84,4],[177,4],[416,5],[636,4],[868,5]]}},"keywords":{}}],["expo/react",{"_index":4147,"title":{},"content":{"749":{"position":[[1150,10]]},"917":{"position":[[394,10]]}},"keywords":{}}],["export",{"_index":158,"title":{},"content":{"11":{"position":[[511,6]]},"51":{"position":[[628,6]]},"55":{"position":[[350,6]]},"392":{"position":[[4022,6]]},"412":{"position":[[4481,6]]},"494":{"position":[[425,6]]},"559":{"position":[[780,6]]},"562":{"position":[[1575,6]]},"579":{"position":[[286,6]]},"598":{"position":[[386,6]]},"808":{"position":[[111,6],[486,6]]},"825":{"position":[[888,6]]},"829":{"position":[[1848,6]]},"837":{"position":[[1890,6]]},"898":{"position":[[2297,6],[3028,6]]},"952":{"position":[[36,6]]},"971":{"position":[[36,6]]},"1309":{"position":[[484,6]]}},"keywords":{}}],["exportjson",{"_index":5365,"title":{"952":{"position":[[0,13]]},"971":{"position":[[0,13]]}},"content":{"952":{"position":[[90,12]]},"971":{"position":[[202,12]]}},"keywords":{}}],["expos",{"_index":1124,"title":{},"content":{"140":{"position":[[6,7]]},"346":{"position":[[71,6]]},"494":{"position":[[118,7]]},"563":{"position":[[16,7]]},"708":{"position":[[310,7]]},"714":{"position":[[686,6]]},"730":{"position":[[199,8]]},"828":{"position":[[226,8]]},"831":{"position":[[169,6]]},"871":{"position":[[253,7]]},"897":{"position":[[376,7]]},"1102":{"position":[[19,7],[1084,7]]},"1207":{"position":[[537,7]]},"1214":{"position":[[500,6]]},"1228":{"position":[[225,7]]},"1231":{"position":[[830,6]]}},"keywords":{}}],["exposeipcmainrxstorag",{"_index":3924,"title":{},"content":{"693":{"position":[[325,22],[721,22],[889,24]]},"1214":{"position":[[544,24]]}},"keywords":{}}],["exposerxstorageremot",{"_index":6249,"title":{},"content":{"1218":{"position":[[703,21],[763,23]]}},"keywords":{}}],["exposeworkerrxstorag",{"_index":6237,"title":{},"content":{"1212":{"position":[[195,21],[374,21],[478,23]]},"1225":{"position":[[137,21],[277,23]]},"1228":{"position":[[177,21]]},"1231":{"position":[[450,21],[866,23]]},"1263":{"position":[[23,21],[171,23]]},"1268":{"position":[[578,21],[726,23]]}},"keywords":{}}],["express",{"_index":3592,"title":{},"content":{"612":{"position":[[1734,7],[1755,7],[1768,10],[1791,10]]},"689":{"position":[[249,7]]},"872":{"position":[[3229,9]]},"875":{"position":[[638,7],[691,7],[844,7],[857,10],[1122,10]]},"1072":{"position":[[2564,11]]},"1097":{"position":[[409,7],[489,7],[672,9]]},"1098":{"position":[[85,8]]},"1099":{"position":[[81,8],[143,8]]}},"keywords":{}}],["extend",{"_index":1747,"title":{"313":{"position":[[21,7]]}},"content":{"299":{"position":[[390,8]]},"313":{"position":[[132,6]]},"412":{"position":[[658,8]]},"419":{"position":[[1053,8]]},"433":{"position":[[389,6]]},"502":{"position":[[1153,7]]},"518":{"position":[[6,7]]},"544":{"position":[[41,6]]},"604":{"position":[[41,6]]},"806":{"position":[[260,6]]},"846":{"position":[[1464,7]]},"890":{"position":[[160,7]]}},"keywords":{}}],["extens",{"_index":947,"title":{"439":{"position":[[24,11]]}},"content":{"66":{"position":[[548,9]]},"357":{"position":[[144,10],[160,9]]},"362":{"position":[[411,10]]},"373":{"position":[[424,9]]},"411":{"position":[[1198,9]]},"439":{"position":[[15,10],[136,9],[273,9],[322,11]]},"445":{"position":[[195,10]]},"494":{"position":[[103,9]]},"802":{"position":[[271,10]]},"898":{"position":[[837,9],[880,11]]},"1266":{"position":[[860,11]]}},"keywords":{}}],["extensions.moddatetime('_modifi",{"_index":5207,"title":{},"content":{"898":{"position":[[1350,36]]}},"keywords":{}}],["extern",{"_index":1385,"title":{"1033":{"position":[[28,8]]}},"content":{"212":{"position":[[350,8]]},"723":{"position":[[560,8]]},"1156":{"position":[[46,8]]}},"keywords":{}}],["extra",{"_index":1384,"title":{"478":{"position":[[44,5]]}},"content":{"212":{"position":[[333,5]]},"251":{"position":[[137,5]]},"291":{"position":[[55,5]]},"303":{"position":[[1344,5]]},"309":{"position":[[345,5]]},"408":{"position":[[3978,5]]},"420":{"position":[[846,5]]},"421":{"position":[[1129,5]]},"559":{"position":[[920,5]]},"802":{"position":[[160,5],[323,5]]},"1150":{"position":[[648,5]]}},"keywords":{}}],["extract",{"_index":2220,"title":{},"content":{"391":{"position":[[521,12]]},"412":{"position":[[13182,10],[13291,10],[13384,10]]},"482":{"position":[[1096,10]]}},"keywords":{}}],["extractcom",{"_index":6323,"title":{},"content":{"1266":{"position":[[1055,16]]}},"keywords":{}}],["extrem",{"_index":1826,"title":{},"content":{"303":{"position":[[389,9]]},"304":{"position":[[154,9]]},"305":{"position":[[521,7]]},"411":{"position":[[5808,7]]},"412":{"position":[[14573,9]]},"1058":{"position":[[80,9]]},"1292":{"position":[[444,9]]}},"keywords":{}}],["ey",{"_index":2150,"title":{},"content":{"377":{"position":[[398,5]]}},"keywords":{}}],["eyjhbgcioi",{"_index":5216,"title":{},"content":{"898":{"position":[[3100,15]]}},"keywords":{}}],["f",{"_index":3996,"title":{},"content":{"711":{"position":[[1014,1]]}},"keywords":{}}],["f5",{"_index":2606,"title":{},"content":{"410":{"position":[[2203,2]]},"411":{"position":[[4807,2]]},"458":{"position":[[407,2]]}},"keywords":{}}],["face",{"_index":2102,"title":{"1090":{"position":[[37,6]]}},"content":{"362":{"position":[[998,6]]},"399":{"position":[[125,4]]},"481":{"position":[[558,6]]},"624":{"position":[[888,5]]}},"keywords":{}}],["facil",{"_index":2748,"title":{},"content":{"412":{"position":[[11773,12]]}},"keywords":{}}],["facilit",{"_index":987,"title":{},"content":{"82":{"position":[[30,11]]},"173":{"position":[[150,10]]},"174":{"position":[[1126,11]]},"223":{"position":[[267,10]]},"288":{"position":[[248,10]]},"289":{"position":[[936,12]]},"365":{"position":[[1317,12]]},"367":{"position":[[330,10]]},"381":{"position":[[167,12]]},"432":{"position":[[436,11]]},"459":{"position":[[167,10]]},"504":{"position":[[594,10],[929,11],[1331,12]]},"517":{"position":[[179,10]]},"525":{"position":[[440,10]]},"529":{"position":[[123,11]]},"611":{"position":[[240,12]]}},"keywords":{}}],["fact",{"_index":2610,"title":{},"content":{"411":{"position":[[823,4]]},"569":{"position":[[1149,5]]},"703":{"position":[[107,4]]}},"keywords":{}}],["factor",{"_index":2431,"title":{},"content":{"399":{"position":[[462,6]]},"407":{"position":[[865,8]]},"408":{"position":[[4294,6]]},"412":{"position":[[10568,7]]},"696":{"position":[[1028,8]]},"780":{"position":[[51,6],[186,7]]},"1090":{"position":[[173,6]]}},"keywords":{}}],["factori",{"_index":828,"title":{"825":{"position":[[20,8]]}},"content":{"55":{"position":[[97,8],[628,7]]},"144":{"position":[[40,9]]},"602":{"position":[[96,9]]},"749":{"position":[[6626,7]]},"825":{"position":[[241,8],[258,7]]},"1118":{"position":[[270,7]]}},"keywords":{}}],["fail",{"_index":1779,"title":{},"content":{"300":{"position":[[712,4]]},"302":{"position":[[230,5]]},"411":{"position":[[5592,4]]},"412":{"position":[[7425,4],[8859,5],[11838,6]]},"487":{"position":[[300,5]]},"495":{"position":[[394,6]]},"497":{"position":[[606,5]]},"749":{"position":[[12305,6]]},"944":{"position":[[389,4]]},"988":{"position":[[900,6]]},"990":{"position":[[39,5],[249,6]]},"1320":{"position":[[409,5]]}},"keywords":{}}],["fail).app",{"_index":3200,"title":{},"content":{"497":{"position":[[165,10]]}},"keywords":{}}],["failur",{"_index":1149,"title":{},"content":{"147":{"position":[[152,9]]},"497":{"position":[[314,7],[670,8]]},"944":{"position":[[444,7]]}},"keywords":{}}],["fairli",{"_index":3441,"title":{},"content":{"566":{"position":[[311,6]]}},"keywords":{}}],["fake",{"_index":6048,"title":{},"content":{"1139":{"position":[[165,4],[381,4]]},"1145":{"position":[[161,4],[370,4]]}},"keywords":{}}],["fakeidbkeyrang",{"_index":6051,"title":{},"content":{"1139":{"position":[[458,15],[646,15]]},"1145":{"position":[[447,15],[631,15]]}},"keywords":{}}],["fakeindexeddb",{"_index":6049,"title":{},"content":{"1139":{"position":[[409,13],[618,14]]},"1145":{"position":[[398,13],[603,14]]}},"keywords":{}}],["fall",{"_index":1688,"title":{},"content":{"291":{"position":[[203,5]]},"396":{"position":[[182,4]]}},"keywords":{}}],["fallback",{"_index":494,"title":{},"content":{"30":{"position":[[333,9]]},"302":{"position":[[583,8]]},"415":{"position":[[379,8]]},"611":{"position":[[1388,9]]},"623":{"position":[[585,8]]},"624":{"position":[[1523,8]]},"1176":{"position":[[362,9]]}},"keywords":{}}],["fallen",{"_index":2910,"title":{},"content":{"434":{"position":[[66,6]]}},"keywords":{}}],["fals",{"_index":1257,"title":{"1230":{"position":[[19,6]]}},"content":{"188":{"position":[[1164,5]]},"276":{"position":[[454,5]]},"314":{"position":[[565,5]]},"480":{"position":[[749,5]]},"522":{"position":[[704,6]]},"562":{"position":[[254,5]]},"647":{"position":[[181,6],[228,6]]},"649":{"position":[[122,6],[455,5]]},"683":{"position":[[835,5]]},"746":{"position":[[568,6]]},"752":{"position":[[448,6],[709,6]]},"759":{"position":[[446,5],[771,6],[842,5]]},"760":{"position":[[767,6]]},"767":{"position":[[424,7],[606,7],[715,7],[807,7],[1015,7]]},"768":{"position":[[406,7],[608,7],[725,7],[813,7],[1017,7]]},"769":{"position":[[359,7],[565,7],[686,7],[778,7],[986,7]]},"838":{"position":[[2350,6],[2378,5]]},"846":{"position":[[353,5]]},"857":{"position":[[147,5],[397,6]]},"885":{"position":[[2110,6],[2293,6]]},"886":{"position":[[4267,6]]},"898":{"position":[[1121,5]]},"904":{"position":[[1019,5],[1220,6]]},"905":{"position":[[191,5]]},"907":{"position":[[232,5]]},"957":{"position":[[74,5]]},"960":{"position":[[599,6]]},"964":{"position":[[384,5]]},"978":{"position":[[72,5]]},"986":{"position":[[1150,5]]},"988":{"position":[[692,5],[1364,6],[1493,6],[5447,6],[5807,6]]},"989":{"position":[[162,5],[312,5]]},"993":{"position":[[525,5],[664,5]]},"1049":{"position":[[191,5]]},"1050":{"position":[[85,5]]},"1051":{"position":[[567,6]]},"1053":{"position":[[72,5]]},"1063":{"position":[[312,5]]},"1065":{"position":[[1119,5]]},"1070":{"position":[[69,5]]},"1084":{"position":[[415,6]]},"1085":{"position":[[1664,5],[1733,5]]},"1106":{"position":[[499,5],[613,6]]},"1126":{"position":[[108,5],[787,5],[924,5]]},"1130":{"position":[[391,5]]},"1158":{"position":[[723,5]]},"1174":{"position":[[762,5]]},"1176":{"position":[[378,5],[591,5]]},"1177":{"position":[[414,6]]},"1230":{"position":[[123,5]]},"1266":{"position":[[1042,6],[1072,6]]},"1277":{"position":[[434,6],[471,5]]},"1278":{"position":[[511,6],[963,6]]},"1282":{"position":[[1080,5],[1232,5]]},"1294":{"position":[[996,6],[1121,6],[1439,5]]},"1296":{"position":[[1415,5],[1580,5]]},"1311":{"position":[[1384,5]]},"1316":{"position":[[905,5]]}},"keywords":{}}],["famili",{"_index":4688,"title":{},"content":{"812":{"position":[[143,7]]}},"keywords":{}}],["familiar",{"_index":1014,"title":{},"content":{"94":{"position":[[235,8]]},"269":{"position":[[417,11]]},"387":{"position":[[69,8]]}},"keywords":{}}],["familynam",{"_index":5837,"title":{},"content":{"1080":{"position":[[417,11]]}},"keywords":{}}],["faq",{"_index":3769,"title":{"656":{"position":[[0,4]]},"958":{"position":[[0,4]]},"1010":{"position":[[0,4]]},"1072":{"position":[[0,4]]},"1085":{"position":[[0,4]]},"1112":{"position":[[0,4]]},"1233":{"position":[[0,4]]}},"content":{},"keywords":{}}],["far",{"_index":1323,"title":{},"content":{"205":{"position":[[75,3]]},"207":{"position":[[346,3]]},"299":{"position":[[1650,3]]},"408":{"position":[[3125,3]]},"634":{"position":[[594,3]]},"903":{"position":[[680,3]]}},"keywords":{}}],["farm",{"_index":2839,"title":{},"content":{"420":{"position":[[1242,7],[1300,4]]}},"keywords":{}}],["fast",{"_index":1030,"title":{},"content":{"101":{"position":[[171,4]]},"189":{"position":[[221,4]]},"227":{"position":[[357,5]]},"254":{"position":[[485,4]]},"287":{"position":[[417,4]]},"289":{"position":[[1519,4]]},"305":{"position":[[579,4]]},"336":{"position":[[140,4]]},"354":{"position":[[1599,4]]},"365":{"position":[[267,4]]},"369":{"position":[[266,4]]},"375":{"position":[[970,4]]},"388":{"position":[[339,5]]},"396":{"position":[[615,4],[1701,5]]},"400":{"position":[[605,4],[653,4]]},"408":{"position":[[1718,5]]},"411":{"position":[[5489,5]]},"412":{"position":[[9715,5],[10268,4]]},"429":{"position":[[92,4]]},"459":{"position":[[178,4]]},"460":{"position":[[166,4],[1107,4]]},"463":{"position":[[181,5]]},"465":{"position":[[359,4]]},"467":{"position":[[340,4],[413,5]]},"468":{"position":[[24,4],[450,4]]},"500":{"position":[[534,4]]},"622":{"position":[[158,4]]},"703":{"position":[[1171,4],[1227,4]]},"723":{"position":[[1877,4]]},"773":{"position":[[194,4]]},"800":{"position":[[279,4]]},"838":{"position":[[3118,5]]},"839":{"position":[[227,5]]},"841":{"position":[[1034,4],[1049,4]]},"1065":{"position":[[23,4]]},"1071":{"position":[[326,4]]},"1132":{"position":[[219,4]]},"1156":{"position":[[209,4]]},"1167":{"position":[[8,5]]},"1192":{"position":[[398,4]]},"1238":{"position":[[128,5]]},"1241":{"position":[[97,4]]},"1292":{"position":[[454,4]]},"1294":{"position":[[364,4]]},"1300":{"position":[[329,4]]},"1316":{"position":[[3587,4]]},"1321":{"position":[[157,4]]}},"keywords":{}}],["fast.wasm",{"_index":3076,"title":{},"content":{"466":{"position":[[375,9]]}},"keywords":{}}],["faster",{"_index":103,"title":{"93":{"position":[[0,6]]}},"content":{"8":{"position":[[55,6]]},"65":{"position":[[742,6],[925,6],[1266,6]]},"87":{"position":[[216,6]]},"92":{"position":[[188,6]]},"93":{"position":[[194,6]]},"138":{"position":[[120,6]]},"166":{"position":[[155,6]]},"173":{"position":[[821,6]]},"205":{"position":[[155,6]]},"216":{"position":[[185,6]]},"220":{"position":[[198,6]]},"227":{"position":[[301,6]]},"236":{"position":[[212,6]]},"265":{"position":[[121,6],[236,6]]},"291":{"position":[[505,6]]},"398":{"position":[[416,6]]},"400":{"position":[[722,6]]},"402":{"position":[[390,6],[453,6],[1272,6],[1708,6],[1876,7]]},"404":{"position":[[235,7],[426,6]]},"408":{"position":[[5097,6]]},"420":{"position":[[1333,7]]},"444":{"position":[[544,6]]},"453":{"position":[[351,7]]},"454":{"position":[[407,6]]},"463":{"position":[[1384,6]]},"464":{"position":[[1144,6]]},"466":{"position":[[341,6],[523,6]]},"468":{"position":[[308,6]]},"470":{"position":[[123,6]]},"473":{"position":[[171,7]]},"538":{"position":[[129,6]]},"556":{"position":[[1166,6]]},"574":{"position":[[472,6]]},"581":{"position":[[301,6]]},"598":{"position":[[129,6]]},"662":{"position":[[799,6]]},"717":{"position":[[246,6],[308,6]]},"718":{"position":[[69,6]]},"772":{"position":[[1210,6]]},"780":{"position":[[612,6]]},"784":{"position":[[859,7]]},"798":{"position":[[188,7]]},"802":{"position":[[778,6]]},"844":{"position":[[1,6]]},"944":{"position":[[79,6]]},"981":{"position":[[880,6],[978,7],[1041,6]]},"1119":{"position":[[5,6]]},"1132":{"position":[[1208,7]]},"1137":{"position":[[197,6]]},"1143":{"position":[[149,6],[565,6]]},"1151":{"position":[[204,6]]},"1164":{"position":[[376,6]]},"1170":{"position":[[17,6],[78,6]]},"1178":{"position":[[203,6]]},"1206":{"position":[[479,6]]},"1209":{"position":[[98,6],[210,6],[291,7],[442,6]]},"1213":{"position":[[196,6]]},"1235":{"position":[[217,6]]},"1286":{"position":[[104,7]]},"1294":{"position":[[123,6]]},"1295":{"position":[[961,6],[1151,6]]},"1299":{"position":[[249,7]]},"1315":{"position":[[790,6]]}},"keywords":{}}],["faster.offlin",{"_index":5432,"title":{},"content":{"981":{"position":[[1176,14]]}},"keywords":{}}],["fastest",{"_index":6044,"title":{},"content":{"1137":{"position":[[163,7]]}},"keywords":{}}],["fastifi",{"_index":5923,"title":{"1098":{"position":[[20,8]]}},"content":{"1098":{"position":[[66,7],[94,7],[308,9]]}},"keywords":{}}],["fault",{"_index":6290,"title":{},"content":{"1247":{"position":[[701,5]]}},"keywords":{}}],["favor",{"_index":2911,"title":{},"content":{"434":{"position":[[80,5]]}},"keywords":{}}],["fe",{"_index":5766,"title":{},"content":{"1065":{"position":[[391,3]]}},"keywords":{}}],["feasibl",{"_index":2525,"title":{},"content":{"408":{"position":[[250,8],[1831,8]]},"412":{"position":[[6790,8]]},"1009":{"position":[[897,9]]}},"keywords":{}}],["featur",{"_index":202,"title":{"57":{"position":[[14,9]]},"137":{"position":[[14,8]]},"166":{"position":[[14,8]]},"193":{"position":[[14,8]]},"252":{"position":[[22,9]]},"323":{"position":[[4,9]]},"341":{"position":[[14,8]]},"361":{"position":[[14,8]]},"387":{"position":[[19,9]]},"456":{"position":[[0,7]]},"505":{"position":[[14,8]]},"526":{"position":[[14,8]]},"544":{"position":[[14,9]]},"583":{"position":[[14,8]]},"604":{"position":[[14,9]]},"637":{"position":[[9,9]]},"870":{"position":[[4,9]]},"896":{"position":[[4,8]]},"1132":{"position":[[0,8]]}},"content":{"14":{"position":[[106,8]]},"22":{"position":[[152,9],[354,7]]},"23":{"position":[[117,8]]},"26":{"position":[[84,9]]},"29":{"position":[[55,9],[227,8]]},"30":{"position":[[272,8]]},"33":{"position":[[222,8],[622,8]]},"34":{"position":[[483,7],[663,8]]},"37":{"position":[[261,8]]},"40":{"position":[[497,9]]},"47":{"position":[[1048,8],[1162,9]]},"61":{"position":[[333,9]]},"65":{"position":[[579,7]]},"71":{"position":[[75,8]]},"83":{"position":[[39,7]]},"90":{"position":[[249,8]]},"106":{"position":[[87,7]]},"109":{"position":[[159,7]]},"114":{"position":[[621,8]]},"116":{"position":[[238,8]]},"118":{"position":[[112,8],[319,8]]},"119":{"position":[[71,9]]},"120":{"position":[[276,8]]},"122":{"position":[[21,8]]},"127":{"position":[[55,9]]},"136":{"position":[[316,8]]},"137":{"position":[[30,8]]},"148":{"position":[[427,8]]},"155":{"position":[[239,8]]},"156":{"position":[[21,8]]},"158":{"position":[[269,8]]},"160":{"position":[[112,7]]},"161":{"position":[[269,9]]},"168":{"position":[[327,9]]},"169":{"position":[[216,7]]},"170":{"position":[[380,8]]},"173":{"position":[[1079,8]]},"174":{"position":[[1935,7]]},"175":{"position":[[615,8]]},"179":{"position":[[187,8]]},"180":{"position":[[89,8]]},"185":{"position":[[135,7]]},"186":{"position":[[377,7]]},"187":{"position":[[33,8]]},"193":{"position":[[33,8],[134,9]]},"197":{"position":[[99,7]]},"198":{"position":[[222,7],[348,8]]},"215":{"position":[[274,7]]},"236":{"position":[[308,7]]},"237":{"position":[[127,7]]},"241":{"position":[[628,8]]},"271":{"position":[[171,8],[270,8]]},"275":{"position":[[24,8]]},"280":{"position":[[21,8]]},"286":{"position":[[273,8]]},"292":{"position":[[255,8]]},"295":{"position":[[29,9],[309,8]]},"311":{"position":[[106,7]]},"313":{"position":[[216,8]]},"316":{"position":[[66,8]]},"317":{"position":[[109,8]]},"347":{"position":[[593,9]]},"357":{"position":[[91,8]]},"362":{"position":[[1005,8],[1664,9]]},"366":{"position":[[100,7]]},"370":{"position":[[259,8]]},"373":{"position":[[639,7]]},"375":{"position":[[399,7]]},"381":{"position":[[12,7]]},"383":{"position":[[576,9]]},"386":{"position":[[337,7]]},"408":{"position":[[5040,8]]},"409":{"position":[[228,9]]},"411":{"position":[[3795,9]]},"412":{"position":[[1244,8]]},"419":{"position":[[435,8]]},"420":{"position":[[1153,9]]},"421":{"position":[[250,8]]},"424":{"position":[[36,7]]},"432":{"position":[[573,7],[846,7],[1107,8]]},"441":{"position":[[452,8]]},"445":{"position":[[956,8]]},"450":{"position":[[609,7]]},"452":{"position":[[770,8]]},"456":{"position":[[78,8]]},"458":{"position":[[777,7]]},"462":{"position":[[29,8]]},"480":{"position":[[1081,8]]},"481":{"position":[[565,9]]},"483":{"position":[[605,8]]},"502":{"position":[[1282,7]]},"506":{"position":[[129,7]]},"508":{"position":[[41,7]]},"510":{"position":[[230,8]]},"513":{"position":[[254,8]]},"515":{"position":[[24,8]]},"518":{"position":[[165,7]]},"520":{"position":[[310,9]]},"526":{"position":[[204,7]]},"529":{"position":[[204,8]]},"530":{"position":[[336,9]]},"535":{"position":[[1055,9],[1065,8]]},"536":{"position":[[113,8]]},"544":{"position":[[27,8]]},"548":{"position":[[413,9]]},"567":{"position":[[585,8]]},"571":{"position":[[610,8]]},"574":{"position":[[739,8]]},"576":{"position":[[250,8]]},"595":{"position":[[1132,9],[1142,8]]},"596":{"position":[[111,8]]},"604":{"position":[[27,8]]},"608":{"position":[[411,9]]},"639":{"position":[[109,7]]},"659":{"position":[[853,8]]},"661":{"position":[[1382,8],[1601,8]]},"667":{"position":[[41,8]]},"668":{"position":[[58,7]]},"686":{"position":[[883,8]]},"710":{"position":[[69,8],[285,8]]},"711":{"position":[[1879,8]]},"723":{"position":[[1851,7]]},"772":{"position":[[353,8]]},"793":{"position":[[987,8]]},"835":{"position":[[952,8]]},"836":{"position":[[1967,9],[2313,8],[2474,7]]},"837":{"position":[[111,7]]},"838":{"position":[[3301,8]]},"839":{"position":[[509,9],[656,9],[771,8],[1123,8]]},"840":{"position":[[171,8],[228,7]]},"856":{"position":[[48,7]]},"860":{"position":[[671,8]]},"913":{"position":[[94,8]]},"1021":{"position":[[56,8]]},"1072":{"position":[[1985,8]]},"1123":{"position":[[570,8]]},"1132":{"position":[[930,7]]},"1135":{"position":[[377,8]]},"1147":{"position":[[63,7]]},"1150":{"position":[[19,7]]},"1198":{"position":[[224,8],[1896,8]]},"1206":{"position":[[654,9]]},"1214":{"position":[[831,8]]},"1280":{"position":[[136,8]]},"1284":{"position":[[271,8]]}},"keywords":{}}],["feature.rich",{"_index":2173,"title":{},"content":{"387":{"position":[[213,12]]}},"keywords":{}}],["features.custom",{"_index":6083,"title":{},"content":{"1149":{"position":[[339,15]]}},"keywords":{}}],["features.rxdb",{"_index":1432,"title":{},"content":{"241":{"position":[[223,13]]},"373":{"position":[[223,13]]}},"keywords":{}}],["features.typescript",{"_index":3297,"title":{},"content":{"535":{"position":[[537,19]]}},"keywords":{}}],["features—lik",{"_index":3149,"title":{},"content":{"483":{"position":[[1025,13]]}},"keywords":{}}],["features—y",{"_index":3412,"title":{},"content":{"559":{"position":[[1677,12]]}},"keywords":{}}],["feature—without",{"_index":1996,"title":{},"content":{"351":{"position":[[310,15]]}},"keywords":{}}],["feed",{"_index":2625,"title":{"476":{"position":[[18,6]]}},"content":{"411":{"position":[[3196,4]]},"421":{"position":[[275,6]]},"497":{"position":[[59,6]]},"612":{"position":[[242,6]]},"624":{"position":[[562,6]]},"841":{"position":[[545,4]]}},"keywords":{}}],["feedback",{"_index":2588,"title":{},"content":{"410":{"position":[[432,9]]},"474":{"position":[[181,9]]},"483":{"position":[[907,9]]},"495":{"position":[[454,8]]},"497":{"position":[[469,8]]},"571":{"position":[[1449,8]]},"873":{"position":[[205,8]]},"899":{"position":[[412,9]]},"1009":{"position":[[696,8]]}},"keywords":{}}],["feedback.data",{"_index":2140,"title":{},"content":{"375":{"position":[[533,13]]}},"keywords":{}}],["feel",{"_index":2624,"title":{},"content":{"411":{"position":[[3099,4]]},"415":{"position":[[126,5]]},"420":{"position":[[716,4]]},"421":{"position":[[381,4],[875,4]]},"489":{"position":[[518,4]]},"491":{"position":[[990,4]]},"495":{"position":[[22,4]]}},"keywords":{}}],["fetch",{"_index":520,"title":{},"content":{"33":{"position":[[448,8]]},"65":{"position":[[341,5]]},"93":{"position":[[107,7]]},"173":{"position":[[1725,8]]},"209":{"position":[[1039,5],[1103,6]]},"217":{"position":[[147,5]]},"255":{"position":[[101,5],[1374,5]]},"369":{"position":[[348,8]]},"394":{"position":[[318,8],[1496,5]]},"395":{"position":[[96,8]]},"398":{"position":[[586,5],[2964,7]]},"400":{"position":[[741,8]]},"402":{"position":[[694,5],[1117,8],[1423,8],[1550,5]]},"410":{"position":[[2209,5]]},"412":{"position":[[2618,8]]},"414":{"position":[[401,5]]},"421":{"position":[[652,8]]},"452":{"position":[[588,8]]},"459":{"position":[[470,5]]},"481":{"position":[[736,5]]},"491":{"position":[[354,7]]},"515":{"position":[[141,8]]},"534":{"position":[[399,7]]},"556":{"position":[[165,5],[1337,8]]},"566":{"position":[[448,5]]},"571":{"position":[[709,5]]},"594":{"position":[[397,7]]},"698":{"position":[[1271,5]]},"711":{"position":[[1699,5]]},"778":{"position":[[59,9]]},"784":{"position":[[217,5]]},"785":{"position":[[710,5]]},"800":{"position":[[678,5]]},"837":{"position":[[760,5]]},"846":{"position":[[434,7],[611,6],[679,7]]},"848":{"position":[[134,7],[553,5],[600,6],[814,5],[838,6],[957,5],[1130,5],[1449,5],[1473,6]]},"851":{"position":[[328,6]]},"852":{"position":[[37,5],[70,5],[98,5],[144,7],[311,6]]},"854":{"position":[[1317,5]]},"875":{"position":[[1402,5],[3028,7],[3334,6],[6972,5]]},"890":{"position":[[400,5],[891,5]]},"898":{"position":[[3653,8]]},"981":{"position":[[852,7]]},"986":{"position":[[967,7],[1235,7]]},"988":{"position":[[3713,6]]},"996":{"position":[[449,5]]},"1007":{"position":[[247,5],[1523,6]]},"1008":{"position":[[251,7]]},"1024":{"position":[[18,5]]},"1067":{"position":[[698,5],[832,5],[1083,7],[1845,5]]},"1072":{"position":[[313,5],[987,8]]},"1102":{"position":[[451,5],[1128,5],[1245,5]]},"1105":{"position":[[99,5]]},"1116":{"position":[[119,5],[195,8]]},"1117":{"position":[[12,8]]},"1134":{"position":[[621,7]]},"1191":{"position":[[243,5]]},"1194":{"position":[[447,5],[721,5],[815,5],[898,8]]},"1239":{"position":[[145,5],[265,8]]},"1271":{"position":[[444,7]]},"1296":{"position":[[76,8]]}},"keywords":{}}],["fetch('./files/items.json",{"_index":2233,"title":{},"content":{"392":{"position":[[994,28]]}},"keywords":{}}],["fetch('http://example.com/pol",{"_index":3554,"title":{},"content":{"610":{"position":[[926,32]]}},"keywords":{}}],["fetch('http://example.com/pul",{"_index":5541,"title":{},"content":{"1002":{"position":[[1021,30]]}},"keywords":{}}],["fetch('http://localhost:80",{"_index":5936,"title":{},"content":{"1102":{"position":[[479,28]]}},"keywords":{}}],["fetch('http://myserver.com/api/countrybycoordinates/'+coordin",{"_index":4453,"title":{},"content":{"751":{"position":[[1319,70]]}},"keywords":{}}],["fetch('https://example.com/api/sync/push",{"_index":5462,"title":{},"content":{"988":{"position":[[2523,42]]}},"keywords":{}}],["fetch('https://example.com/api/temp",{"_index":4099,"title":{},"content":{"739":{"position":[[633,39]]}},"keywords":{}}],["fetch('https://example.com/doc",{"_index":5646,"title":{},"content":{"1024":{"position":[[378,32]]}},"keywords":{}}],["fetch('https://localhost/push",{"_index":5038,"title":{},"content":{"875":{"position":[[6239,31]]}},"keywords":{}}],["fetch('https://myapi.com/push",{"_index":1576,"title":{},"content":{"255":{"position":[[1159,31]]}},"keywords":{}}],["fetch('https://yourapi.com/tasks/push",{"_index":1349,"title":{},"content":{"209":{"position":[[805,39]]}},"keywords":{}}],["fetch(`/api/voxels/push?chunkid=${chunkid",{"_index":5572,"title":{},"content":{"1007":{"position":[[1681,45]]}},"keywords":{}}],["fetch(`https://myapi.com/pull?checkpoint=${json.stringify(lastcheckpoint)}&limit=${batchs",{"_index":1578,"title":{},"content":{"255":{"position":[[1422,100]]}},"keywords":{}}],["fetcheddoc",{"_index":3355,"title":{},"content":{"555":{"position":[[455,10]]}},"keywords":{}}],["fetcheddoc.patch",{"_index":3359,"title":{},"content":{"555":{"position":[[636,18]]}},"keywords":{}}],["fetchmor",{"_index":3269,"title":{},"content":{"523":{"position":[[486,10]]}},"keywords":{}}],["few",{"_index":864,"title":{},"content":{"58":{"position":[[63,3]]},"193":{"position":[[121,3]]},"303":{"position":[[108,3]]},"399":{"position":[[416,3]]},"408":{"position":[[41,3],[1472,3],[5595,3]]},"412":{"position":[[10121,3]]},"454":{"position":[[325,3]]},"463":{"position":[[796,3]]},"464":{"position":[[448,3]]},"465":{"position":[[309,3]]},"466":{"position":[[273,3]]},"467":{"position":[[268,3]]},"696":{"position":[[521,3]]},"702":{"position":[[893,3]]},"1072":{"position":[[276,3]]}},"keywords":{}}],["fewer",{"_index":627,"title":{"478":{"position":[[24,5]]}},"content":{"39":{"position":[[531,5]]},"396":{"position":[[711,6]]},"420":{"position":[[249,5]]},"487":{"position":[[1,5]]},"802":{"position":[[11,5]]}},"keywords":{}}],["fiber",{"_index":2547,"title":{},"content":{"408":{"position":[[2422,6]]}},"keywords":{}}],["fiddl",{"_index":518,"title":{},"content":{"33":{"position":[[389,8]]}},"keywords":{}}],["field",{"_index":737,"title":{"75":{"position":[[20,7]]},"106":{"position":[[20,7]]},"235":{"position":[[20,7]]},"691":{"position":[[27,6]]},"798":{"position":[[32,7]]},"887":{"position":[[43,7]]},"1108":{"position":[[12,7]]},"1109":{"position":[[9,7]]}},"content":{"47":{"position":[[851,6]]},"75":{"position":[[56,7]]},"106":{"position":[[43,7]]},"138":{"position":[[77,6]]},"166":{"position":[[236,7]]},"174":{"position":[[975,7],[1028,6]]},"194":{"position":[[92,7],[153,7]]},"235":{"position":[[35,7],[140,7],[199,6]]},"303":{"position":[[344,5]]},"310":{"position":[[136,6]]},"315":{"position":[[848,6],[1024,6]]},"316":{"position":[[436,5]]},"342":{"position":[[38,6]]},"345":{"position":[[44,5]]},"351":{"position":[[120,6],[269,5]]},"356":{"position":[[306,7],[673,8],[844,6]]},"357":{"position":[[215,7]]},"360":{"position":[[870,7]]},"361":{"position":[[64,6],[270,5],[369,5]]},"362":{"position":[[385,7],[524,6]]},"366":{"position":[[575,6]]},"380":{"position":[[342,5]]},"382":{"position":[[186,6]]},"390":{"position":[[367,7]]},"392":{"position":[[494,5],[1441,6]]},"395":{"position":[[207,6]]},"397":{"position":[[457,7],[886,6],[1346,7],[1610,7],[2031,6]]},"412":{"position":[[11086,7]]},"418":{"position":[[145,5]]},"461":{"position":[[394,6]]},"480":{"position":[[1048,7]]},"482":{"position":[[114,6],[1000,5],[1227,7]]},"496":{"position":[[315,6]]},"527":{"position":[[131,7]]},"555":{"position":[[58,6],[442,6],[752,6],[786,6],[921,6],[1010,7]]},"556":{"position":[[1282,7]]},"564":{"position":[[929,5],[994,6]]},"566":{"position":[[1365,5]]},"567":{"position":[[656,6]]},"571":{"position":[[1301,7]]},"587":{"position":[[44,7]]},"588":{"position":[[28,5]]},"612":{"position":[[1633,6]]},"635":{"position":[[369,7]]},"636":{"position":[[30,7],[46,5]]},"638":{"position":[[183,7],[799,6],[836,6]]},"639":{"position":[[134,5]]},"661":{"position":[[1555,7]]},"662":{"position":[[195,5]]},"678":{"position":[[278,5],[331,5]]},"680":{"position":[[92,5],[1004,5],[1094,6]]},"681":{"position":[[261,5]]},"685":{"position":[[48,5],[85,7]]},"688":{"position":[[640,7]]},"691":{"position":[[47,6]]},"701":{"position":[[929,6]]},"702":{"position":[[105,6]]},"710":{"position":[[230,6]]},"711":{"position":[[2014,6]]},"714":{"position":[[483,7],[501,6],[636,5],[850,7]]},"717":{"position":[[1314,5],[1376,6]]},"723":{"position":[[239,5]]},"724":{"position":[[948,6]]},"749":{"position":[[845,6],[1808,5],[2489,5],[3682,6],[4465,6],[9562,6],[9747,6],[9874,5],[9988,5],[10388,6],[13908,6],[16969,6],[17553,6],[19143,6],[19389,5],[19600,6],[19906,5],[20127,6],[20284,6],[20452,5],[20551,6],[20718,6],[21033,6],[21211,6],[21495,6],[23028,6]]},"751":{"position":[[1189,5]]},"754":{"position":[[610,5]]},"764":{"position":[[74,5],[225,6]]},"781":{"position":[[800,6]]},"796":{"position":[[406,6],[702,6],[737,6],[1059,6],[1122,6],[1198,5]]},"798":{"position":[[18,6],[158,6],[403,6]]},"800":{"position":[[570,6]]},"808":{"position":[[65,5]]},"810":{"position":[[81,5]]},"821":{"position":[[737,6]]},"826":{"position":[[158,6],[416,5],[1091,5]]},"836":{"position":[[1432,7]]},"838":{"position":[[224,5],[859,5]]},"848":{"position":[[169,6]]},"849":{"position":[[489,5]]},"854":{"position":[[1396,5]]},"855":{"position":[[198,5]]},"857":{"position":[[138,5],[532,6]]},"861":{"position":[[1328,6],[1841,5],[2033,5]]},"862":{"position":[[1326,5]]},"867":{"position":[[193,5]]},"875":{"position":[[2298,5],[2327,5]]},"887":{"position":[[508,5]]},"898":{"position":[[270,5],[371,5],[1736,6],[3558,5],[4306,6]]},"942":{"position":[[133,7]]},"963":{"position":[[40,6]]},"971":{"position":[[169,6]]},"984":{"position":[[174,6],[439,6]]},"986":{"position":[[385,5],[563,5],[1401,5],[1461,5],[1583,5]]},"988":{"position":[[1677,6],[1933,5],[2003,5],[3154,6]]},"990":{"position":[[568,5],[596,5],[832,5],[914,5]]},"991":{"position":[[168,6]]},"1007":{"position":[[127,6]]},"1018":{"position":[[423,6]]},"1038":{"position":[[24,5],[54,5]]},"1048":{"position":[[386,6]]},"1051":{"position":[[364,6]]},"1069":{"position":[[360,6]]},"1072":{"position":[[30,6],[280,7],[357,6],[481,7],[2149,5],[2240,5],[2404,5]]},"1074":{"position":[[271,5],[324,5],[375,5],[420,5]]},"1076":{"position":[[13,5]]},"1077":{"position":[[16,5]]},"1078":{"position":[[331,6],[383,7],[461,6]]},"1079":{"position":[[116,5],[193,6],[228,5],[398,6]]},"1080":{"position":[[296,6],[486,6],[761,6],[901,5],[989,6]]},"1082":{"position":[[52,7],[97,6]]},"1083":{"position":[[14,5],[79,6],[113,6],[194,6]]},"1084":{"position":[[594,6]]},"1085":{"position":[[357,5],[653,5],[868,6],[937,6],[1116,7],[1797,6],[2428,7]]},"1104":{"position":[[404,5],[516,5],[800,5]]},"1106":{"position":[[202,6]]},"1107":{"position":[[45,5],[410,5],[496,5]]},"1108":{"position":[[79,6],[161,6],[481,5],[613,6]]},"1109":{"position":[[15,6],[126,6]]},"1116":{"position":[[270,5]]},"1176":{"position":[[514,5]]},"1184":{"position":[[62,7]]},"1251":{"position":[[242,6]]},"1253":{"position":[[157,7]]},"1290":{"position":[[166,6]]},"1291":{"position":[[164,6]]},"1294":{"position":[[517,6],[627,5]]},"1296":{"position":[[454,6],[583,5],[692,5],[789,6]]}},"keywords":{}}],["fielda",{"_index":4648,"title":{},"content":{"797":{"position":[[333,9]]}},"keywords":{}}],["fieldb",{"_index":4649,"title":{},"content":{"797":{"position":[[343,8]]}},"keywords":{}}],["fieldnam",{"_index":4222,"title":{},"content":{"749":{"position":[[6854,9],[8579,9],[16836,10],[17044,9],[17167,9],[18342,9],[19040,9]]},"811":{"position":[[123,10]]},"988":{"position":[[1803,9],[1838,9]]},"1077":{"position":[[35,9]]},"1084":{"position":[[152,11],[303,10]]}},"keywords":{}}],["fields.cross",{"_index":3299,"title":{},"content":{"535":{"position":[[853,12]]}},"keywords":{}}],["fieldsasynchron",{"_index":3419,"title":{},"content":{"560":{"position":[[494,18]]}},"keywords":{}}],["fieldsreact",{"_index":3143,"title":{},"content":{"483":{"position":[[307,14]]}},"keywords":{}}],["fifoo",{"_index":5767,"title":{},"content":{"1065":{"position":[[416,7]]}},"keywords":{}}],["fifoofa",{"_index":5769,"title":{},"content":{"1065":{"position":[[438,9]]}},"keywords":{}}],["file",{"_index":98,"title":{"358":{"position":[[42,4]]},"433":{"position":[[0,4]]},"1205":{"position":[[15,4]]},"1215":{"position":[[19,4],[61,4]]}},"content":{"7":{"position":[[202,6]]},"30":{"position":[[85,4]]},"34":{"position":[[219,5],[343,4]]},"59":{"position":[[61,4]]},"131":{"position":[[418,4],[533,4]]},"162":{"position":[[403,4],[421,4]]},"188":{"position":[[464,4],[1687,5],[1813,5],[1852,4],[2527,5]]},"228":{"position":[[389,4]]},"287":{"position":[[705,4]]},"336":{"position":[[263,4]]},"358":{"position":[[62,5],[299,5],[516,5],[697,5],[749,4]]},"362":{"position":[[604,4]]},"390":{"position":[[958,6]]},"408":{"position":[[1547,4],[1579,4],[1623,4],[1684,4],[1922,5],[2101,4]]},"427":{"position":[[1304,4]]},"433":{"position":[[39,5]]},"453":{"position":[[20,4],[107,5],[240,4],[707,5]]},"454":{"position":[[993,4]]},"459":{"position":[[67,5]]},"460":{"position":[[594,4]]},"463":{"position":[[420,4],[483,4],[515,4],[1036,4]]},"464":{"position":[[829,5],[1022,4],[1082,5],[1151,4],[1379,4]]},"467":{"position":[[294,5]]},"469":{"position":[[291,4],[390,4]]},"482":{"position":[[1088,4]]},"524":{"position":[[423,4],[818,4]]},"546":{"position":[[116,4]]},"551":{"position":[[531,5]]},"556":{"position":[[578,5],[598,6],[722,5]]},"579":{"position":[[73,4]]},"581":{"position":[[269,4]]},"590":{"position":[[157,4]]},"606":{"position":[[116,4]]},"640":{"position":[[184,4]]},"644":{"position":[[340,4]]},"649":{"position":[[84,6],[393,6]]},"661":{"position":[[1635,6]]},"667":{"position":[[191,5]]},"668":{"position":[[183,5]]},"730":{"position":[[143,5]]},"732":{"position":[[45,4]]},"772":{"position":[[82,4],[1989,4]]},"836":{"position":[[729,4]]},"841":{"position":[[146,4]]},"861":{"position":[[523,4],[540,5]]},"1033":{"position":[[445,5],[453,5],[534,5],[694,5],[767,5]]},"1134":{"position":[[469,5]]},"1206":{"position":[[20,4],[110,5],[301,4],[348,4],[456,4]]},"1207":{"position":[[48,4]]},"1208":{"position":[[103,5],[198,5],[332,5],[689,4],[883,4],[1044,5],[1141,5],[1269,4],[1518,5],[1632,4],[1710,5],[1894,4]]},"1209":{"position":[[28,4],[80,6],[245,4]]},"1210":{"position":[[142,4],[502,4]]},"1212":{"position":[[137,5],[290,4]]},"1213":{"position":[[587,4]]},"1214":{"position":[[16,4]]},"1215":{"position":[[64,4],[110,4],[135,4],[181,5],[201,4],[241,4],[291,4],[344,5],[383,4],[423,4]]},"1216":{"position":[[13,4],[49,4]]},"1225":{"position":[[34,5]]},"1226":{"position":[[458,4]]},"1227":{"position":[[59,4],[170,5],[489,4],[802,4]]},"1228":{"position":[[29,5],[104,4]]},"1229":{"position":[[179,4]]},"1244":{"position":[[36,4]]},"1264":{"position":[[361,4]]},"1265":{"position":[[52,4],[163,5],[483,4],[784,4]]},"1266":{"position":[[46,4]]},"1268":{"position":[[356,4]]},"1324":{"position":[[1037,4]]}},"keywords":{}}],["filebas",{"_index":4570,"title":{},"content":{"772":{"position":[[1168,9]]}},"keywords":{}}],["filehandl",{"_index":6202,"title":{},"content":{"1208":{"position":[[915,10]]}},"keywords":{}}],["filehandle.createsyncaccesshandl",{"_index":6205,"title":{},"content":{"1208":{"position":[[1077,36]]}},"keywords":{}}],["filenam",{"_index":4773,"title":{},"content":{"836":{"position":[[868,9]]},"1266":{"position":[[608,9]]}},"keywords":{}}],["filepicker.origin",{"_index":6240,"title":{},"content":{"1215":{"position":[[357,17]]}},"keywords":{}}],["files",{"_index":6221,"title":{},"content":{"1208":{"position":[[1722,8]]}},"keywords":{}}],["filesystem",{"_index":84,"title":{"706":{"position":[[60,10]]},"1127":{"position":[[0,10]]},"1245":{"position":[[3,10]]}},"content":{"6":{"position":[[67,11],[125,10],[222,10]]},"7":{"position":[[61,11]]},"24":{"position":[[226,10]]},"28":{"position":[[221,10]]},"188":{"position":[[2215,10]]},"365":{"position":[[982,10]]},"408":{"position":[[1941,11]]},"412":{"position":[[8503,10]]},"433":{"position":[[120,10]]},"453":{"position":[[491,10]]},"647":{"position":[[33,10]]},"662":{"position":[[587,10],[681,10]]},"703":{"position":[[92,11],[171,10],[599,10]]},"709":{"position":[[1372,10]]},"710":{"position":[[706,10],[2339,10]]},"772":{"position":[[1352,11],[1925,10]]},"793":{"position":[[262,10]]},"836":{"position":[[790,10]]},"961":{"position":[[293,10]]},"973":{"position":[[55,11]]},"1090":{"position":[[650,10]]},"1130":{"position":[[115,10]]},"1173":{"position":[[140,10]]},"1191":{"position":[[357,10]]},"1206":{"position":[[165,11]]},"1208":{"position":[[71,11]]},"1211":{"position":[[44,10],[221,10]]},"1214":{"position":[[350,10],[516,10],[777,10]]},"1215":{"position":[[497,10],[579,11]]},"1245":{"position":[[5,10]]},"1270":{"position":[[86,10]]},"1299":{"position":[[414,11],[565,10]]}},"keywords":{}}],["filesystemaccessapirespons",{"_index":6481,"title":{},"content":{"1302":{"position":[[122,27]]}},"keywords":{}}],["filesystemsyncaccesshandl",{"_index":6204,"title":{},"content":{"1208":{"position":[[1010,26],[1835,26]]}},"keywords":{}}],["filesystemsyncaccesshandlehav",{"_index":6195,"title":{},"content":{"1208":{"position":[[439,30]]}},"keywords":{}}],["fill",{"_index":1783,"title":{},"content":{"301":{"position":[[134,4]]},"331":{"position":[[226,5]]},"392":{"position":[[870,4]]},"461":{"position":[[238,4]]},"806":{"position":[[512,6]]},"815":{"position":[[17,4]]},"837":{"position":[[513,4]]},"886":{"position":[[472,4]]},"887":{"position":[[9,5]]},"1078":{"position":[[928,6]]},"1082":{"position":[[112,6]]},"1123":{"position":[[688,5]]}},"keywords":{}}],["fill(0",{"_index":2263,"title":{},"content":{"392":{"position":[[3898,8]]}},"keywords":{}}],["filter",{"_index":1325,"title":{"858":{"position":[[0,8]]}},"content":{"205":{"position":[[198,8]]},"276":{"position":[[302,7]]},"277":{"position":[[162,7]]},"358":{"position":[[357,9]]},"402":{"position":[[2208,6]]},"559":{"position":[[1246,9]]},"714":{"position":[[784,6]]},"751":{"position":[[1523,6]]},"854":{"position":[[913,6]]},"858":{"position":[[328,7],[382,7]]},"898":{"position":[[3703,8],[3785,9]]},"1007":{"position":[[741,8]]},"1009":{"position":[[358,8]]},"1072":{"position":[[497,6]]},"1198":{"position":[[1910,8]]}},"keywords":{}}],["filter(d",{"_index":5519,"title":{},"content":{"995":{"position":[[1945,8]]}},"keywords":{}}],["filterforminupdatedatandid",{"_index":5103,"title":{},"content":{"885":{"position":[[2002,26]]}},"keywords":{}}],["filterforminupdatedatandid.slice(0",{"_index":5108,"title":{},"content":{"885":{"position":[[2369,35]]}},"keywords":{}}],["final",{"_index":3170,"title":{"1083":{"position":[[0,6]]}},"content":{"491":{"position":[[1042,5]]},"691":{"position":[[581,5]]},"749":{"position":[[9741,5],[10382,5],[12312,5],[12342,5]]},"1074":{"position":[[429,5]]},"1077":{"position":[[191,5]]},"1083":{"position":[[23,6],[73,5],[107,5],[188,5],[606,6]]}},"keywords":{}}],["financi",{"_index":3202,"title":{},"content":{"497":{"position":[[400,9]]},"506":{"position":[[198,9]]},"550":{"position":[[242,9]]},"611":{"position":[[321,9]]},"638":{"position":[[118,9]]}},"keywords":{}}],["find",{"_index":642,"title":{"949":{"position":[[0,7]]},"1036":{"position":[[0,5]]},"1055":{"position":[[0,7]]}},"content":{"40":{"position":[[818,4]]},"52":{"position":[[304,4]]},"130":{"position":[[495,7]]},"143":{"position":[[444,7],[625,7]]},"198":{"position":[[480,4]]},"241":{"position":[[304,4]]},"335":{"position":[[263,7]]},"352":{"position":[[80,4]]},"356":{"position":[[906,4]]},"358":{"position":[[346,7]]},"373":{"position":[[304,4]]},"390":{"position":[[1225,5]]},"393":{"position":[[637,4]]},"394":{"position":[[4,4],[199,4]]},"412":{"position":[[14194,4]]},"440":{"position":[[315,4]]},"459":{"position":[[524,4]]},"467":{"position":[[665,7]]},"480":{"position":[[723,7]]},"494":{"position":[[208,10]]},"539":{"position":[[304,4]]},"548":{"position":[[137,4]]},"557":{"position":[[268,4]]},"562":{"position":[[933,7]]},"563":{"position":[[917,4]]},"580":{"position":[[498,7]]},"599":{"position":[[331,4]]},"608":{"position":[[137,4]]},"632":{"position":[[1760,7]]},"666":{"position":[[404,4]]},"703":{"position":[[945,4]]},"724":{"position":[[1541,4]]},"730":{"position":[[32,4]]},"749":{"position":[[22381,4],[24094,4]]},"798":{"position":[[1023,4]]},"806":{"position":[[392,4]]},"821":{"position":[[49,4],[584,7]]},"839":{"position":[[719,4]]},"904":{"position":[[159,4]]},"908":{"position":[[367,4]]},"949":{"position":[[4,4],[80,4],[154,7]]},"950":{"position":[[26,6],[110,4],[150,4]]},"951":{"position":[[1,4],[121,6]]},"1016":{"position":[[1,4]]},"1036":{"position":[[4,4],[70,7],[158,4]]},"1055":{"position":[[33,7],[144,4],[203,7]]},"1056":{"position":[[73,4],[158,4],[263,4]]},"1065":{"position":[[88,4],[326,4],[903,4]]},"1074":{"position":[[238,4]]},"1078":{"position":[[737,4],[984,4]]},"1151":{"position":[[489,4]]},"1173":{"position":[[168,4]]},"1176":{"position":[[80,4]]},"1178":{"position":[[488,4]]},"1193":{"position":[[26,4]]},"1194":{"position":[[621,4],[770,6],[858,6]]},"1227":{"position":[[207,4]]},"1265":{"position":[[200,4]]},"1304":{"position":[[778,4]]},"1320":{"position":[[164,4]]}},"keywords":{}}],["findbestindex",{"_index":4706,"title":{},"content":{"820":{"position":[[10,13],[169,15]]}},"keywords":{}}],["findbyid",{"_index":4176,"title":{"951":{"position":[[0,12]]}},"content":{"749":{"position":[[3215,11]]},"951":{"position":[[470,9]]},"1194":{"position":[[496,11],[658,11]]}},"keywords":{}}],["finddocumentsbyid",{"_index":4122,"title":{},"content":{"746":{"position":[[698,18]]}},"keywords":{}}],["findon",{"_index":800,"title":{"950":{"position":[[0,10]]},"1056":{"position":[[0,10]]}},"content":{"52":{"position":[[313,7]]},"539":{"position":[[313,7]]},"599":{"position":[[340,7]]},"749":{"position":[[2032,10],[2133,7]]},"798":{"position":[[555,10]]},"951":{"position":[[106,9]]},"1056":{"position":[[3,7],[111,10],[207,10]]},"1057":{"position":[[210,10]]},"1066":{"position":[[361,10]]}},"keywords":{}}],["findone(_id",{"_index":4230,"title":{},"content":{"749":{"position":[[7237,13]]}},"keywords":{}}],["fine",{"_index":969,"title":{},"content":{"75":{"position":[[73,4]]},"106":{"position":[[151,4]]},"383":{"position":[[491,4]]},"412":{"position":[[10052,4],[12837,4]]},"542":{"position":[[131,4]]},"551":{"position":[[393,4]]},"563":{"position":[[973,4]]},"635":{"position":[[325,4]]},"835":{"position":[[808,4]]},"841":{"position":[[877,4]]},"1157":{"position":[[287,4]]},"1164":{"position":[[33,4]]},"1316":{"position":[[1031,5]]}},"keywords":{}}],["finish",{"_index":464,"title":{},"content":{"28":{"position":[[599,8]]},"700":{"position":[[697,9]]},"752":{"position":[[153,9]]},"948":{"position":[[710,8]]},"994":{"position":[[128,8]]},"1000":{"position":[[86,8]]},"1032":{"position":[[184,9]]},"1304":{"position":[[349,9]]}},"keywords":{}}],["fire",{"_index":169,"title":{},"content":{"11":{"position":[[753,5]]},"953":{"position":[[195,4]]},"1300":{"position":[[775,5]]}},"keywords":{}}],["firebas",{"_index":194,"title":{"14":{"position":[[0,9]]},"199":{"position":[[11,8]]},"200":{"position":[[25,8]]},"840":{"position":[[0,8]]},"853":{"position":[[32,8]]}},"content":{"14":{"position":[[3,8],[88,8],[217,8],[252,8],[462,8],[586,8],[961,8],[1018,8]]},"18":{"position":[[115,9]]},"22":{"position":[[50,8],[143,8]]},"113":{"position":[[235,9]]},"174":{"position":[[3067,9]]},"201":{"position":[[8,8]]},"202":{"position":[[7,8]]},"203":{"position":[[1,8]]},"204":{"position":[[18,8]]},"205":{"position":[[15,8]]},"206":{"position":[[7,8]]},"212":{"position":[[138,8]]},"238":{"position":[[150,9]]},"350":{"position":[[169,9]]},"412":{"position":[[1032,8]]},"444":{"position":[[592,8]]},"570":{"position":[[152,8],[225,8]]},"699":{"position":[[281,8]]},"840":{"position":[[113,8],[677,8]]},"854":{"position":[[15,8],[45,8],[104,8]]}},"keywords":{}}],["firebase"",{"_index":1512,"title":{},"content":{"244":{"position":[[1194,14]]}},"keywords":{}}],["firebase.initializeapp",{"_index":4866,"title":{},"content":{"854":{"position":[[244,24]]}},"keywords":{}}],["firebase/app",{"_index":4862,"title":{},"content":{"854":{"position":[[118,15]]}},"keywords":{}}],["firebase/firestor",{"_index":4864,"title":{},"content":{"854":{"position":[[175,21]]},"857":{"position":[[253,21]]}},"keywords":{}}],["firefox",{"_index":1707,"title":{},"content":{"298":{"position":[[163,8],[575,7]]},"299":{"position":[[415,7],[1226,7],[1427,7]]},"301":{"position":[[458,7]]},"408":{"position":[[554,7],[1052,7]]},"439":{"position":[[41,7]]},"455":{"position":[[746,7]]},"462":{"position":[[371,7]]},"617":{"position":[[1763,8]]},"696":{"position":[[1364,7],[1954,7]]},"1207":{"position":[[130,8]]}},"keywords":{}}],["firestor",{"_index":208,"title":{"246":{"position":[[11,9]]},"247":{"position":[[24,9]]},"256":{"position":[[31,9]]},"840":{"position":[[11,10]]},"853":{"position":[[17,9]]},"857":{"position":[[47,9]]}},"content":{"14":{"position":[[205,10],[305,10],[603,10],[619,9],[829,9],[1188,9],[1215,9]]},"247":{"position":[[1,9]]},"249":{"position":[[8,10]]},"250":{"position":[[1,9]]},"251":{"position":[[1,9],[248,9]]},"253":{"position":[[7,9]]},"255":{"position":[[1708,9],[1827,9]]},"260":{"position":[[88,9],[122,9],[228,9],[281,9]]},"262":{"position":[[183,9],[524,9]]},"263":{"position":[[32,9]]},"289":{"position":[[981,9],[1004,10],[1110,9],[1416,9]]},"312":{"position":[[156,10]]},"412":{"position":[[1009,9],[3303,11]]},"504":{"position":[[1064,9],[1122,10]]},"565":{"position":[[143,10]]},"570":{"position":[[188,11]]},"632":{"position":[[766,10]]},"644":{"position":[[140,10]]},"793":{"position":[[760,9]]},"840":{"position":[[3,9],[477,9],[608,9]]},"854":{"position":[[72,9],[721,10],[864,9],[1149,9],[1452,9]]},"855":{"position":[[148,9]]},"856":{"position":[[1,9],[150,9]]},"857":{"position":[[80,9],[577,9]]},"858":{"position":[[81,10],[232,10]]},"1124":{"position":[[2288,9]]}},"keywords":{}}],["firestore'",{"_index":1557,"title":{},"content":{"252":{"position":[[1,11]]},"262":{"position":[[333,11]]},"289":{"position":[[1198,11]]}},"keywords":{}}],["firestorecollect",{"_index":4870,"title":{},"content":{"854":{"position":[[399,19],[786,19]]},"858":{"position":[[297,19]]}},"keywords":{}}],["firestoredatabas",{"_index":4804,"title":{},"content":{"841":{"position":[[55,17]]},"854":{"position":[[354,17],[755,18]]},"858":{"position":[[266,18]]}},"keywords":{}}],["firestoregraphql",{"_index":3131,"title":{},"content":{"481":{"position":[[319,16]]}},"keywords":{}}],["firewal",{"_index":3623,"title":{"619":{"position":[[12,10]]},"627":{"position":[[8,9]]}},"content":{"614":{"position":[[429,10]]},"619":{"position":[[203,9]]},"624":{"position":[[301,8]]},"627":{"position":[[117,8]]},"901":{"position":[[353,9]]}},"keywords":{}}],["first",{"_index":107,"title":{"12":{"position":[[34,5]]},"44":{"position":[[22,5]]},"122":{"position":[[8,5]]},"133":{"position":[[8,5]]},"157":{"position":[[8,5]]},"164":{"position":[[8,5]]},"183":{"position":[[8,5]]},"191":{"position":[[8,5]]},"201":{"position":[[20,5]]},"248":{"position":[[17,6]]},"274":{"position":[[6,5]]},"327":{"position":[[8,5]]},"338":{"position":[[8,5]]},"380":{"position":[[8,5]]},"404":{"position":[[38,5]]},"406":{"position":[[10,5]]},"407":{"position":[[18,5]]},"408":{"position":[[10,5]]},"409":{"position":[[33,5]]},"412":{"position":[[36,6]]},"413":{"position":[[6,5],[35,5]]},"419":{"position":[[8,5],[24,6]]},"420":{"position":[[29,5]]},"421":{"position":[[10,5]]},"516":{"position":[[6,5]]},"584":{"position":[[8,5]]},"629":{"position":[[19,5]]},"630":{"position":[[30,5]]},"631":{"position":[[37,5]]},"632":{"position":[[27,6]]},"695":{"position":[[19,5],[35,5]]},"777":{"position":[[6,5],[22,5]]},"869":{"position":[[57,5]]},"895":{"position":[[58,5]]},"980":{"position":[[38,5]]},"1009":{"position":[[24,5]]},"1314":{"position":[[38,6]]}},"content":{"8":{"position":[[151,5]]},"11":{"position":[[711,5]]},"13":{"position":[[43,6]]},"14":{"position":[[287,5]]},"15":{"position":[[518,5]]},"19":{"position":[[562,5]]},"22":{"position":[[391,6]]},"27":{"position":[[51,5],[289,5]]},"35":{"position":[[610,5]]},"37":{"position":[[330,5]]},"38":{"position":[[88,5],[175,5]]},"39":{"position":[[247,5]]},"40":{"position":[[425,5],[795,5]]},"43":{"position":[[61,5],[739,5]]},"46":{"position":[[21,6]]},"65":{"position":[[1512,5]]},"122":{"position":[[53,5]]},"126":{"position":[[137,5]]},"128":{"position":[[43,5]]},"133":{"position":[[49,5]]},"148":{"position":[[105,5]]},"157":{"position":[[26,5]]},"164":{"position":[[46,5]]},"170":{"position":[[211,5]]},"179":{"position":[[430,5]]},"183":{"position":[[25,5]]},"186":{"position":[[266,5]]},"188":{"position":[[2040,5]]},"191":{"position":[[16,5]]},"198":{"position":[[98,5]]},"212":{"position":[[102,5]]},"244":{"position":[[400,5],[731,5]]},"245":{"position":[[13,5]]},"253":{"position":[[142,6]]},"262":{"position":[[18,6],[48,5]]},"263":{"position":[[139,5],[494,6]]},"273":{"position":[[66,5]]},"274":{"position":[[11,5]]},"280":{"position":[[157,5]]},"313":{"position":[[210,5]]},"318":{"position":[[41,5],[620,6]]},"321":{"position":[[574,5]]},"323":{"position":[[161,5]]},"327":{"position":[[64,5]]},"338":{"position":[[16,5]]},"353":{"position":[[218,6]]},"359":{"position":[[181,5]]},"360":{"position":[[434,5]]},"362":{"position":[[176,5],[773,5]]},"375":{"position":[[195,5]]},"378":{"position":[[40,6]]},"380":{"position":[[295,5]]},"388":{"position":[[422,5]]},"391":{"position":[[9,5],[37,5]]},"392":{"position":[[26,5]]},"394":{"position":[[1056,7],[1154,7]]},"396":{"position":[[1482,5]]},"398":{"position":[[3182,5],[3469,5]]},"399":{"position":[[114,5],[379,5]]},"402":{"position":[[648,5]]},"407":{"position":[[10,5],[532,5],[881,5],[993,5]]},"408":{"position":[[20,5],[147,5],[221,5],[1428,5],[1795,5],[2671,5],[3268,5],[3417,5],[4189,5],[4271,5],[4327,5],[4439,5],[5426,5]]},"409":{"position":[[169,5]]},"410":{"position":[[155,5],[452,5],[1301,5],[1805,5]]},"411":{"position":[[36,5],[275,6],[1127,5],[2087,5],[2581,5],[4565,6],[4909,5],[5448,6],[5777,5]]},"412":{"position":[[159,6],[295,5],[431,5],[587,5],[3219,5],[4206,6],[4317,5],[5636,5],[6145,5],[6588,5],[6689,5],[6926,5],[7122,5],[7407,5],[7560,5],[8233,5],[8971,5],[11105,5],[11183,5],[12232,5],[14756,5],[14796,6],[14934,5],[15094,5],[15405,5]]},"413":{"position":[[52,6]]},"414":{"position":[[7,6],[243,6]]},"415":{"position":[[7,6],[251,6]]},"416":{"position":[[7,6],[327,6]]},"417":{"position":[[7,6],[245,6]]},"418":{"position":[[7,6],[258,6],[833,5]]},"419":{"position":[[577,6],[676,5],[860,5],[919,5],[1083,5],[1532,5],[1568,5],[1684,5]]},"420":{"position":[[100,5],[221,5],[432,5],[544,5],[1147,5]]},"421":{"position":[[532,5],[714,5]]},"422":{"position":[[45,5],[138,5],[153,5],[314,5],[356,5],[375,5],[427,5]]},"445":{"position":[[278,5],[410,5]]},"446":{"position":[[9,5]]},"447":{"position":[[120,5]]},"449":{"position":[[1,5]]},"450":{"position":[[14,5]]},"451":{"position":[[26,5]]},"452":{"position":[[15,5]]},"454":{"position":[[752,5]]},"458":{"position":[[1047,5]]},"463":{"position":[[603,5]]},"464":{"position":[[882,5]]},"473":{"position":[[9,5],[24,5]]},"476":{"position":[[147,5]]},"477":{"position":[[135,5]]},"479":{"position":[[134,5]]},"483":{"position":[[224,5],[743,5],[803,5]]},"486":{"position":[[230,5]]},"489":{"position":[[600,6]]},"491":{"position":[[798,5],[1151,5]]},"496":{"position":[[704,5]]},"497":{"position":[[197,5]]},"498":{"position":[[213,5],[493,5]]},"501":{"position":[[369,5]]},"502":{"position":[[225,5],[292,5]]},"504":{"position":[[296,5]]},"510":{"position":[[254,5]]},"513":{"position":[[303,5]]},"516":{"position":[[23,5]]},"525":{"position":[[13,5]]},"530":{"position":[[388,5]]},"534":{"position":[[180,5],[194,6]]},"537":{"position":[[1,6]]},"542":{"position":[[163,6]]},"559":{"position":[[1671,5]]},"562":{"position":[[1023,5]]},"566":{"position":[[1214,5]]},"567":{"position":[[104,6],[397,5]]},"574":{"position":[[756,5]]},"575":{"position":[[325,5]]},"582":{"position":[[27,5]]},"594":{"position":[[178,5],[192,6]]},"597":{"position":[[1,6]]},"610":{"position":[[22,5]]},"620":{"position":[[224,5]]},"627":{"position":[[272,5]]},"630":{"position":[[221,5],[945,5]]},"631":{"position":[[64,5]]},"634":{"position":[[9,5]]},"635":{"position":[[10,5]]},"640":{"position":[[498,5]]},"644":{"position":[[56,5],[619,5]]},"656":{"position":[[255,5]]},"659":{"position":[[202,5]]},"661":{"position":[[527,5]]},"662":{"position":[[20,6]]},"666":{"position":[[288,6]]},"681":{"position":[[536,5]]},"690":{"position":[[476,5]]},"696":{"position":[[151,5]]},"698":{"position":[[401,5],[2260,5]]},"699":{"position":[[232,5]]},"700":{"position":[[12,5],[1030,5]]},"701":{"position":[[15,5]]},"702":{"position":[[498,5]]},"703":{"position":[[37,5],[1294,5]]},"704":{"position":[[190,5]]},"705":{"position":[[116,5],[377,5],[1132,5],[1218,5],[1281,5]]},"710":{"position":[[1401,6]]},"714":{"position":[[876,5]]},"723":{"position":[[632,5],[2414,5],[2474,5]]},"724":{"position":[[1241,5],[1334,5]]},"749":{"position":[[12656,6],[17541,5]]},"766":{"position":[[34,5],[197,5]]},"774":{"position":[[219,5]]},"778":{"position":[[305,5]]},"779":{"position":[[250,5],[341,5]]},"780":{"position":[[511,5]]},"781":{"position":[[561,5],[652,5]]},"782":{"position":[[230,5]]},"783":{"position":[[126,5],[525,5]]},"784":{"position":[[359,5]]},"785":{"position":[[442,5]]},"786":{"position":[[144,5],[166,5]]},"818":{"position":[[136,5]]},"836":{"position":[[248,5],[432,5],[1961,5]]},"837":{"position":[[1256,5]]},"838":{"position":[[20,6],[577,5],[1637,6],[1739,5]]},"839":{"position":[[765,5]]},"840":{"position":[[272,5]]},"841":{"position":[[1453,5]]},"860":{"position":[[221,5],[331,6],[1205,5]]},"870":{"position":[[65,5]]},"872":{"position":[[197,5]]},"875":{"position":[[1302,5],[3918,5]]},"885":{"position":[[1654,5]]},"886":{"position":[[50,5],[426,5],[1411,5]]},"896":{"position":[[180,5]]},"898":{"position":[[4056,5]]},"899":{"position":[[93,5]]},"902":{"position":[[513,5]]},"913":{"position":[[57,5],[144,5]]},"977":{"position":[[408,6]]},"981":{"position":[[1191,5],[1297,5]]},"984":{"position":[[4,5]]},"986":{"position":[[28,5]]},"994":{"position":[[145,5]]},"1006":{"position":[[226,5]]},"1007":{"position":[[704,5]]},"1009":{"position":[[727,5]]},"1032":{"position":[[82,5]]},"1082":{"position":[[40,5]]},"1085":{"position":[[506,5]]},"1087":{"position":[[172,5]]},"1088":{"position":[[51,5]]},"1114":{"position":[[174,5],[567,5]]},"1118":{"position":[[247,5]]},"1123":{"position":[[747,5]]},"1125":{"position":[[503,5]]},"1154":{"position":[[398,5]]},"1161":{"position":[[219,5]]},"1180":{"position":[[219,5]]},"1192":{"position":[[467,5]]},"1194":{"position":[[51,5],[218,5],[292,5]]},"1208":{"position":[[48,5]]},"1210":{"position":[[571,5]]},"1222":{"position":[[163,5]]},"1231":{"position":[[824,5]]},"1292":{"position":[[296,5],[650,5]]},"1294":{"position":[[446,5]]},"1298":{"position":[[266,5]]},"1302":{"position":[[9,5]]},"1304":{"position":[[1542,6]]},"1314":{"position":[[35,5]]},"1316":{"position":[[15,5],[960,6]]},"1317":{"position":[[364,5]]},"1319":{"position":[[558,5]]},"1320":{"position":[[19,5]]}},"keywords":{}}],["first"",{"_index":1456,"title":{},"content":{"243":{"position":[[449,11]]},"244":{"position":[[1513,11]]},"413":{"position":[[114,11]]},"419":{"position":[[98,12],[1229,11],[1350,11]]},"420":{"position":[[624,11]]}},"keywords":{}}],["first.creat",{"_index":6489,"title":{},"content":{"1304":{"position":[[1867,14]]}},"keywords":{}}],["first/loc",{"_index":702,"title":{},"content":{"46":{"position":[[9,11]]}},"keywords":{}}],["firstdo",{"_index":6299,"title":{},"content":{"1258":{"position":[[28,9]]}},"keywords":{}}],["firsti",{"_index":4597,"title":{},"content":{"786":{"position":[[88,6]]}},"keywords":{}}],["firstnam",{"_index":4956,"title":{},"content":{"872":{"position":[[1976,10],[2064,12],[4206,10],[4294,12]]},"898":{"position":[[2556,10],[2669,12]]},"1041":{"position":[[347,10],[375,9]]},"1051":{"position":[[244,10],[514,10]]},"1078":{"position":[[393,12],[613,10],[694,12],[943,10],[1070,10]]},"1080":{"position":[[236,10],[827,12],[889,11],[918,13]]},"1082":{"position":[[321,10]]},"1083":{"position":[[521,10]]},"1311":{"position":[[479,10],[593,12],[1533,10]]}},"keywords":{}}],["firstopen",{"_index":5476,"title":{},"content":{"988":{"position":[[5155,9],[5795,9]]}},"keywords":{}}],["firstread",{"_index":3146,"title":{},"content":{"483":{"position":[[721,9]]}},"keywords":{}}],["firstsupabas",{"_index":5231,"title":{},"content":{"899":{"position":[[156,13]]}},"keywords":{}}],["firstsyncencrypt",{"_index":1908,"title":{},"content":{"317":{"position":[[173,19]]}},"keywords":{}}],["firstvaluefrom",{"_index":5516,"title":{},"content":{"995":{"position":[[1884,15]]}},"keywords":{}}],["fit",{"_index":952,"title":{"67":{"position":[[44,3]]},"71":{"position":[[19,3]]},"73":{"position":[[34,3]]},"98":{"position":[[45,3]]},"102":{"position":[[19,3]]},"104":{"position":[[34,3]]},"225":{"position":[[33,3]]},"229":{"position":[[19,3]]},"278":{"position":[[22,3]]}},"content":{"98":{"position":[[201,3]]},"102":{"position":[[115,3]]},"174":{"position":[[666,3]]},"229":{"position":[[196,3]]},"254":{"position":[[257,3]]},"271":{"position":[[308,3]]},"278":{"position":[[232,3]]},"354":{"position":[[75,3]]},"381":{"position":[[500,4]]},"384":{"position":[[19,3]]},"388":{"position":[[197,3]]},"412":{"position":[[6638,4]]},"481":{"position":[[426,4]]},"689":{"position":[[270,3]]},"1162":{"position":[[325,4]]},"1171":{"position":[[182,3]]},"1181":{"position":[[412,4]]},"1192":{"position":[[580,4]]},"1198":{"position":[[134,7]]}},"keywords":{}}],["fix",{"_index":1711,"title":{},"content":{"298":{"position":[[278,5]]},"397":{"position":[[214,5]]},"412":{"position":[[2924,5]]},"442":{"position":[[100,3]]},"461":{"position":[[945,5]]},"571":{"position":[[1829,5]]},"616":{"position":[[938,3]]},"626":{"position":[[388,6]]},"837":{"position":[[651,5]]},"1174":{"position":[[358,5]]},"1176":{"position":[[203,3],[484,3]]},"1198":{"position":[[728,6],[987,3]]},"1288":{"position":[[83,6]]},"1299":{"position":[[40,3]]},"1316":{"position":[[1390,3]]}},"keywords":{}}],["fix"",{"_index":3649,"title":{},"content":{"617":{"position":[[1737,9]]}},"keywords":{}}],["flag",{"_index":2979,"title":{},"content":{"455":{"position":[[909,5]]},"566":{"position":[[1418,5]]},"698":{"position":[[1195,4]]},"773":{"position":[[814,5]]},"828":{"position":[[353,6]]},"875":{"position":[[8536,5],[8800,4],[9046,4],[9361,5]]},"876":{"position":[[434,4]]},"898":{"position":[[1881,4]]},"988":{"position":[[3123,4]]},"995":{"position":[[1465,4],[1582,4],[1782,4]]},"1051":{"position":[[417,5]]},"1065":{"position":[[553,6]]},"1282":{"position":[[966,5]]}},"keywords":{}}],["flag.th",{"_index":6156,"title":{},"content":{"1181":{"position":[[352,8]]}},"keywords":{}}],["flag.thi",{"_index":6109,"title":{},"content":{"1162":{"position":[[286,9]]}},"keywords":{}}],["flags)str",{"_index":3416,"title":{},"content":{"560":{"position":[[352,12]]}},"keywords":{}}],["flaki",{"_index":2596,"title":{},"content":{"410":{"position":[[1056,5]]},"419":{"position":[[217,5]]}},"keywords":{}}],["flat",{"_index":530,"title":{},"content":{"34":{"position":[[209,4]]},"848":{"position":[[226,4]]}},"keywords":{}}],["fledg",{"_index":635,"title":{},"content":{"40":{"position":[[313,7]]},"452":{"position":[[405,7]]},"576":{"position":[[227,7]]}},"keywords":{}}],["flexibl",{"_index":639,"title":{"72":{"position":[[0,8]]},"112":{"position":[[0,8]]},"239":{"position":[[0,8]]},"351":{"position":[[0,9]]},"381":{"position":[[0,8]]}},"content":{"40":{"position":[[450,11]]},"42":{"position":[[161,11]]},"72":{"position":[[15,8]]},"112":{"position":[[15,8],[181,11]]},"174":{"position":[[805,11],[2625,8],[3119,11]]},"198":{"position":[[28,8]]},"202":{"position":[[345,11]]},"238":{"position":[[57,8]]},"239":{"position":[[17,8]]},"248":{"position":[[224,8]]},"255":{"position":[[1803,8]]},"267":{"position":[[1256,12]]},"276":{"position":[[162,11]]},"281":{"position":[[157,9]]},"282":{"position":[[331,11]]},"287":{"position":[[164,11]]},"299":{"position":[[1670,8]]},"353":{"position":[[255,8]]},"354":{"position":[[83,9]]},"356":{"position":[[31,8],[659,8]]},"360":{"position":[[850,11]]},"362":{"position":[[201,8],[515,8]]},"364":{"position":[[478,12]]},"370":{"position":[[219,12]]},"372":{"position":[[332,11]]},"381":{"position":[[470,11]]},"383":{"position":[[284,8]]},"388":{"position":[[538,12]]},"390":{"position":[[1773,11]]},"392":{"position":[[1239,8]]},"412":{"position":[[13506,11]]},"504":{"position":[[432,11]]},"574":{"position":[[46,8]]},"581":{"position":[[92,11]]},"631":{"position":[[338,8]]},"632":{"position":[[628,8]]},"688":{"position":[[301,8]]},"689":{"position":[[223,12]]},"690":{"position":[[598,12]]},"710":{"position":[[422,8]]},"715":{"position":[[163,11]]},"770":{"position":[[149,8]]},"839":{"position":[[801,8]]},"860":{"position":[[759,8]]},"1072":{"position":[[1921,11]]},"1149":{"position":[[10,11]]},"1236":{"position":[[37,9]]}},"keywords":{}}],["flexsearch",{"_index":4039,"title":{},"content":{"723":{"position":[[56,10],[2082,10]]},"724":{"position":[[5,10],[510,10]]},"1284":{"position":[[93,10]]}},"keywords":{}}],["flexsearch.find('foobar",{"_index":4064,"title":{},"content":{"724":{"position":[[1636,26],[1818,25]]}},"keywords":{}}],["flexsearch.rxdb",{"_index":6377,"title":{},"content":{"1284":{"position":[[140,15]]}},"keywords":{}}],["fli",{"_index":1994,"title":{},"content":{"351":{"position":[[217,4]]}},"keywords":{}}],["flight",{"_index":1978,"title":{},"content":{"346":{"position":[[681,6]]}},"keywords":{}}],["flip",{"_index":2648,"title":{},"content":{"412":{"position":[[184,4]]}},"keywords":{}}],["float",{"_index":5080,"title":{},"content":{"885":{"position":[[592,7],[687,7],[758,6]]}},"keywords":{}}],["flood",{"_index":3695,"title":{},"content":{"630":{"position":[[773,8]]}},"keywords":{}}],["flourish",{"_index":2046,"title":{},"content":{"356":{"position":[[865,8]]}},"keywords":{}}],["flow",{"_index":299,"title":{},"content":{"17":{"position":[[518,4]]},"47":{"position":[[223,6]]},"90":{"position":[[150,5]]},"208":{"position":[[49,4]]},"219":{"position":[[359,4]]},"226":{"position":[[265,6]]},"340":{"position":[[25,4]]},"410":{"position":[[2121,5]]},"454":{"position":[[868,4]]},"478":{"position":[[115,5]]},"576":{"position":[[139,5]]},"585":{"position":[[198,4]]},"630":{"position":[[194,5]]},"632":{"position":[[182,4]]},"871":{"position":[[397,4]]},"901":{"position":[[782,6]]},"903":{"position":[[170,4]]},"1033":{"position":[[1052,5]]},"1147":{"position":[[341,5]]}},"keywords":{}}],["fluctuat",{"_index":1679,"title":{},"content":{"289":{"position":[[246,13]]},"444":{"position":[[251,12]]}},"keywords":{}}],["fluid",{"_index":3105,"title":{},"content":{"474":{"position":[[299,5]]},"644":{"position":[[686,6]]}},"keywords":{}}],["flutter",{"_index":678,"title":{"176":{"position":[[24,7]]},"177":{"position":[[12,7]]},"178":{"position":[[27,7]]},"186":{"position":[[15,7]]},"187":{"position":[[16,7]]},"188":{"position":[[20,8]]}},"content":{"43":{"position":[[499,8]]},"177":{"position":[[1,7]]},"178":{"position":[[32,7],[326,7]]},"179":{"position":[[122,8],[242,7]]},"180":{"position":[[45,7]]},"183":{"position":[[70,7]]},"186":{"position":[[39,7],[245,8],[403,7]]},"187":{"position":[[92,7]]},"188":{"position":[[74,7],[225,7],[543,7],[1049,7],[1511,7],[1829,7],[1924,8],[2007,7],[2089,7]]},"192":{"position":[[390,7]]},"198":{"position":[[59,7],[248,7],[300,7],[521,7]]},"365":{"position":[[1061,8]]}},"keywords":{}}],["flutter'",{"_index":1230,"title":{},"content":{"177":{"position":[[197,9]]}},"keywords":{}}],["flutter_qj",{"_index":1241,"title":{},"content":{"188":{"position":[[99,11]]}},"keywords":{}}],["fn",{"_index":5270,"title":{},"content":{"910":{"position":[[407,4]]}},"keywords":{}}],["fn(...arg",{"_index":5272,"title":{},"content":{"910":{"position":[[447,13]]}},"keywords":{}}],["focu",{"_index":573,"title":{},"content":{"36":{"position":[[293,6]]},"61":{"position":[[480,5]]},"373":{"position":[[604,5]]},"378":{"position":[[137,5]]},"390":{"position":[[392,5]]},"411":{"position":[[1588,5]]},"412":{"position":[[1235,5]]},"419":{"position":[[603,5]]},"420":{"position":[[332,5],[1324,5]]},"445":{"position":[[2439,5]]},"481":{"position":[[530,5]]},"690":{"position":[[512,5]]}},"keywords":{}}],["focus",{"_index":625,"title":{"359":{"position":[[13,7]]}},"content":{"39":{"position":[[470,7]]},"40":{"position":[[66,7]]},"41":{"position":[[75,7]]},"411":{"position":[[705,7]]},"412":{"position":[[2057,8]]},"462":{"position":[[103,8]]}},"keywords":{}}],["folder",{"_index":89,"title":{},"content":{"6":{"position":[[233,7],[633,6]]},"7":{"position":[[468,6]]},"647":{"position":[[242,6],[304,9]]},"648":{"position":[[196,9]]},"649":{"position":[[152,9]]},"667":{"position":[[119,7]]},"670":{"position":[[470,7]]},"730":{"position":[[17,6],[117,6]]},"749":{"position":[[337,7],[6245,6]]},"838":{"position":[[2269,6]]},"961":{"position":[[304,6]]},"1033":{"position":[[466,8],[611,7],[702,7]]},"1090":{"position":[[933,8]]},"1130":{"position":[[280,9]]},"1210":{"position":[[626,7]]},"1227":{"position":[[224,6]]},"1265":{"position":[[217,6]]},"1266":{"position":[[348,6]]}},"keywords":{}}],["folder)befor",{"_index":3834,"title":{},"content":{"668":{"position":[[211,13]]}},"keywords":{}}],["folder/foobar/document.json",{"_index":3741,"title":{},"content":{"649":{"position":[[414,28]]}},"keywords":{}}],["folders.find().exec",{"_index":5662,"title":{},"content":{"1033":{"position":[[627,22]]}},"keywords":{}}],["follow",{"_index":879,"title":{"61":{"position":[[0,6]]},"84":{"position":[[0,6]]},"114":{"position":[[0,6]]},"149":{"position":[[0,6]]},"175":{"position":[[0,6]]},"241":{"position":[[0,6]]},"263":{"position":[[0,6]]},"296":{"position":[[0,6]]},"306":{"position":[[0,6]]},"318":{"position":[[0,6]]},"347":{"position":[[0,6]]},"362":{"position":[[0,6]]},"373":{"position":[[0,6]]},"388":{"position":[[0,6]]},"405":{"position":[[0,6]]},"442":{"position":[[0,6]]},"471":{"position":[[0,6]]},"483":{"position":[[0,6]]},"498":{"position":[[0,6]]},"511":{"position":[[0,6]]},"531":{"position":[[0,6]]},"548":{"position":[[0,6]]},"557":{"position":[[0,6]]},"567":{"position":[[0,6]]},"572":{"position":[[0,6]]},"591":{"position":[[0,6]]},"608":{"position":[[0,6]]},"628":{"position":[[0,6]]},"644":{"position":[[0,6]]},"663":{"position":[[0,6]]},"712":{"position":[[0,6]]},"776":{"position":[[0,6]]},"786":{"position":[[0,6]]},"832":{"position":[[0,6]]},"842":{"position":[[0,6]]},"873":{"position":[[0,6]]},"899":{"position":[[0,6]]},"913":{"position":[[0,6]]}},"content":{"84":{"position":[[93,9],[298,9]]},"114":{"position":[[106,9],[311,9]]},"120":{"position":[[37,7]]},"128":{"position":[[147,9]]},"142":{"position":[[68,9]]},"149":{"position":[[106,9],[311,9]]},"175":{"position":[[84,9],[304,9]]},"183":{"position":[[6,7]]},"241":{"position":[[99,9]]},"285":{"position":[[392,6]]},"299":{"position":[[115,9]]},"347":{"position":[[106,9],[311,9]]},"362":{"position":[[1177,9],[1382,9]]},"373":{"position":[[99,9]]},"425":{"position":[[221,9]]},"430":{"position":[[96,9]]},"455":{"position":[[796,9]]},"511":{"position":[[106,9],[311,9]]},"522":{"position":[[227,9]]},"523":{"position":[[206,9]]},"531":{"position":[[106,9],[311,9]]},"557":{"position":[[333,9]]},"567":{"position":[[1045,6]]},"591":{"position":[[106,9],[311,9]]},"614":{"position":[[774,9]]},"661":{"position":[[179,7]]},"666":{"position":[[41,10]]},"668":{"position":[[40,10]]},"679":{"position":[[141,9]]},"680":{"position":[[38,10]]},"763":{"position":[[19,9]]},"774":{"position":[[328,9]]},"786":{"position":[[103,6]]},"836":{"position":[[181,7]]},"837":{"position":[[47,7]]},"871":{"position":[[363,9]]},"876":{"position":[[129,9]]},"880":{"position":[[283,9]]},"922":{"position":[[80,9]]},"935":{"position":[[215,9]]},"960":{"position":[[110,9]]},"983":{"position":[[131,9]]},"988":{"position":[[103,10]]},"1067":{"position":[[1129,9],[1359,9]]},"1074":{"position":[[61,9]]},"1084":{"position":[[525,9]]},"1085":{"position":[[3283,9]]},"1102":{"position":[[1096,9]]},"1107":{"position":[[525,10]]},"1125":{"position":[[850,6]]},"1176":{"position":[[269,9]]},"1193":{"position":[[8,9]]},"1194":{"position":[[10,9]]},"1271":{"position":[[970,9],[1637,10]]},"1281":{"position":[[195,9]]},"1300":{"position":[[604,9]]}},"keywords":{}}],["followup",{"_index":3821,"title":{},"content":{"663":{"position":[[103,8]]},"712":{"position":[[122,8]]},"842":{"position":[[237,8]]}},"keywords":{}}],["foo",{"_index":3778,"title":{},"content":{"659":{"position":[[522,6],[603,5],[669,5]]},"662":{"position":[[2626,6]]},"683":{"position":[[198,5],[319,5],[913,5]]},"710":{"position":[[1933,6]]},"711":{"position":[[1368,7]]},"796":{"position":[[755,5],[954,5]]},"806":{"position":[[605,4],[684,4]]},"838":{"position":[[2840,6]]},"942":{"position":[[216,6]]},"943":{"position":[[424,6]]},"946":{"position":[[188,6]]},"947":{"position":[[206,6]]},"950":{"position":[[297,5]]},"1014":{"position":[[252,4],[391,4]]},"1015":{"position":[[228,4]]},"1018":{"position":[[131,3],[469,3],[508,3],[760,4],[876,4],[921,3],[943,4]]},"1035":{"position":[[130,6]]},"1065":{"position":[[254,5],[401,5],[829,9],[988,3],[1089,5],[1248,5],[1257,5],[1266,5],[1327,8]]},"1078":{"position":[[954,6],[1081,6]]},"1177":{"position":[[383,6]]},"1220":{"position":[[365,4],[585,5],[626,4]]},"1249":{"position":[[523,5]]}},"keywords":{}}],["foo(.*)0",{"_index":4642,"title":{},"content":{"796":{"position":[[887,10]]}},"keywords":{}}],["foo1",{"_index":5332,"title":{},"content":{"944":{"position":[[231,7]]}},"keywords":{}}],["foo2",{"_index":5334,"title":{},"content":{"944":{"position":[[267,7]]},"947":{"position":[[258,6]]}},"keywords":{}}],["foobar",{"_index":2927,"title":{},"content":{"439":{"position":[[702,7]]},"555":{"position":[[329,9],[523,8]]},"556":{"position":[[865,8]]},"649":{"position":[[383,9]]},"770":{"position":[[427,9],[523,8]]},"772":{"position":[[1052,8]]},"796":{"position":[[515,8]]},"826":{"position":[[422,8],[1084,6]]},"866":{"position":[[785,9]]},"988":{"position":[[5425,9],[5503,9]]},"1014":{"position":[[226,9],[365,9]]},"1015":{"position":[[202,9]]},"1018":{"position":[[850,9]]},"1041":{"position":[[358,8],[388,6]]},"1063":{"position":[[88,9]]},"1067":{"position":[[1332,8],[2011,8],[2155,8]]},"1125":{"position":[[593,11]]},"1252":{"position":[[170,9],[311,9]]}},"keywords":{}}],["foobar'}).exec",{"_index":5644,"title":{},"content":{"1023":{"position":[[711,18]]}},"keywords":{}}],["foobar.alic",{"_index":4929,"title":{},"content":{"866":{"position":[[752,14]]}},"keywords":{}}],["foobar2",{"_index":5676,"title":{},"content":{"1039":{"position":[[310,12],[361,9]]}},"keywords":{}}],["foobar@example.com",{"_index":5636,"title":{},"content":{"1022":{"position":[[1052,20]]}},"keywords":{}}],["foofa",{"_index":5768,"title":{},"content":{"1065":{"position":[[427,7]]}},"keywords":{}}],["foooobarnew",{"_index":5692,"title":{},"content":{"1042":{"position":[[192,14],[299,13]]}},"keywords":{}}],["footprint",{"_index":1129,"title":{},"content":{"141":{"position":[[23,9]]},"169":{"position":[[180,9]]},"174":{"position":[[2472,9]]},"316":{"position":[[25,10]]},"528":{"position":[[120,9]]}},"keywords":{}}],["for(const",{"_index":4632,"title":{},"content":{"795":{"position":[[139,9]]},"875":{"position":[[4595,9]]}},"keywords":{}}],["for="hero",{"_index":3504,"title":{},"content":{"580":{"position":[[769,14]]},"601":{"position":[[157,14]]},"602":{"position":[[532,14]]}},"keywords":{}}],["forbid",{"_index":5895,"title":{},"content":{"1085":{"position":[[2011,10]]}},"keywords":{}}],["forbidden",{"_index":5072,"title":{"881":{"position":[[0,11]]}},"content":{"881":{"position":[[203,10]]}},"keywords":{}}],["forc",{"_index":1988,"title":{},"content":{"350":{"position":[[106,6]]},"412":{"position":[[1677,6],[11904,5]]},"569":{"position":[[702,6]]},"839":{"position":[[374,6]]},"990":{"position":[[1155,5]]}},"keywords":{}}],["forefront",{"_index":3247,"title":{},"content":{"510":{"position":[[685,9]]}},"keywords":{}}],["foreign",{"_index":2021,"title":{},"content":{"354":{"position":[[504,7]]},"705":{"position":[[809,7]]},"808":{"position":[[390,7]]},"810":{"position":[[149,7]]}},"keywords":{}}],["forev",{"_index":2729,"title":{},"content":{"412":{"position":[[8203,8]]},"697":{"position":[[107,8]]}},"keywords":{}}],["forget",{"_index":4432,"title":{},"content":{"749":{"position":[[23677,6]]},"872":{"position":[[3534,6]]},"1097":{"position":[[263,6]]},"1213":{"position":[[738,6]]}},"keywords":{}}],["forgiv",{"_index":1658,"title":{},"content":{"282":{"position":[[152,9]]}},"keywords":{}}],["fork",{"_index":267,"title":{},"content":{"16":{"position":[[1,6]]},"835":{"position":[[725,4]]},"987":{"position":[[794,4]]},"1309":{"position":[[1007,4]]}},"keywords":{}}],["fork/client",{"_index":5434,"title":{},"content":{"982":{"position":[[68,11],[254,11]]},"987":{"position":[[219,11],[724,11]]}},"keywords":{}}],["form",{"_index":1989,"title":{},"content":{"350":{"position":[[243,5]]},"390":{"position":[[92,4]]},"391":{"position":[[862,4]]},"396":{"position":[[492,7]]},"455":{"position":[[430,4]]},"489":{"position":[[410,6]]},"496":{"position":[[504,6]]},"1228":{"position":[[109,4]]}},"keywords":{}}],["formal",{"_index":4813,"title":{},"content":{"841":{"position":[[1168,6]]}},"keywords":{}}],["format",{"_index":1224,"title":{"1289":{"position":[[7,8]]},"1290":{"position":[[11,7]]},"1291":{"position":[[16,7]]}},"content":{"174":{"position":[[2439,7]]},"236":{"position":[[61,7]]},"316":{"position":[[362,7]]},"364":{"position":[[195,7],[318,6]]},"367":{"position":[[93,6],[1011,7]]},"382":{"position":[[213,8]]},"398":{"position":[[46,7]]},"454":{"position":[[34,6]]},"459":{"position":[[113,6]]},"612":{"position":[[1511,6]]},"636":{"position":[[257,8]]},"686":{"position":[[229,6]]},"702":{"position":[[139,6]]},"717":{"position":[[985,6]]},"839":{"position":[[965,6]]},"875":{"position":[[1484,6],[1716,7]]},"904":{"position":[[1055,7]]},"936":{"position":[[91,7],[155,6]]},"1085":{"position":[[370,6]]},"1104":{"position":[[348,6]]},"1266":{"position":[[1022,7]]},"1289":{"position":[[53,7],[74,7],[104,7]]}},"keywords":{}}],["formatteddata",{"_index":3602,"title":{},"content":{"612":{"position":[[2089,13]]}},"keywords":{}}],["forum",{"_index":4978,"title":{},"content":{"873":{"position":[[181,5]]}},"keywords":{}}],["forward",{"_index":4856,"title":{},"content":{"849":{"position":[[1048,9]]}},"keywords":{}}],["found",{"_index":349,"title":{},"content":{"20":{"position":[[99,7]]},"396":{"position":[[855,5]]},"421":{"position":[[160,5]]},"543":{"position":[[73,5]]},"603":{"position":[[71,5]]},"620":{"position":[[297,5]]},"749":{"position":[[22045,6]]},"810":{"position":[[181,6]]},"825":{"position":[[1116,5]]},"1057":{"position":[[546,5]]},"1059":{"position":[[343,5]]},"1060":{"position":[[201,5]]},"1061":{"position":[[244,5]]},"1062":{"position":[[13,5]]},"1208":{"position":[[1986,5]]},"1296":{"position":[[229,6]]}},"keywords":{}}],["foundat",{"_index":1159,"title":{},"content":{"151":{"position":[[422,10]]},"267":{"position":[[1580,10]]},"503":{"position":[[199,10]]},"530":{"position":[[449,12]]}},"keywords":{}}],["foundationdb",{"_index":2112,"title":{"1131":{"position":[[24,12]]}},"content":{"365":{"position":[[1551,12]]},"772":{"position":[[192,12],[227,12],[446,12],[553,12],[738,14],[1222,12],[1832,12]]},"774":{"position":[[350,12],[543,14]]},"793":{"position":[[380,12]]},"1072":{"position":[[1818,13]]},"1095":{"position":[[136,12]]},"1124":{"position":[[454,12],[541,12]]},"1132":{"position":[[22,13],[87,12],[130,12]]},"1133":{"position":[[13,12],[75,12],[108,12],[162,13],[232,12],[325,12],[526,13]]},"1134":{"position":[[105,14],[243,12],[268,12],[448,12]]},"1135":{"position":[[9,12],[302,12]]},"1198":{"position":[[1413,12]]},"1247":{"position":[[592,13],[643,12]]},"1320":{"position":[[807,13]]}},"keywords":{}}],["foundationdb.observ",{"_index":6029,"title":{},"content":{"1132":{"position":[[841,23]]}},"keywords":{}}],["foundationdb@1.1.4",{"_index":6038,"title":{},"content":{"1133":{"position":[[431,18]]}},"keywords":{}}],["founddocu",{"_index":1639,"title":{},"content":{"276":{"position":[[382,14]]},"724":{"position":[[1613,14],[1795,14]]}},"keywords":{}}],["four",{"_index":5255,"title":{},"content":{"904":{"position":[[264,4]]}},"keywords":{}}],["fraction",{"_index":2067,"title":{},"content":{"358":{"position":[[813,8]]}},"keywords":{}}],["frame",{"_index":2555,"title":{},"content":{"408":{"position":[[3034,6]]},"571":{"position":[[1627,6]]},"703":{"position":[[1577,6]]}},"keywords":{}}],["framework",{"_index":250,"title":{"94":{"position":[[35,11]]},"222":{"position":[[35,11]]},"286":{"position":[[14,10]]},"492":{"position":[[25,11]]}},"content":{"15":{"position":[[131,9],[303,10]]},"17":{"position":[[162,11]]},"38":{"position":[[34,9]]},"94":{"position":[[81,10],[275,10]]},"116":{"position":[[34,9]]},"173":{"position":[[2189,11],[2282,10],[2412,10]]},"174":{"position":[[1423,10]]},"177":{"position":[[207,9]]},"179":{"position":[[102,11]]},"201":{"position":[[363,9]]},"222":{"position":[[98,10],[259,11]]},"230":{"position":[[141,10]]},"284":{"position":[[177,11]]},"286":{"position":[[52,11],[373,9]]},"313":{"position":[[87,10]]},"352":{"position":[[230,10]]},"360":{"position":[[96,10]]},"411":{"position":[[5196,10]]},"445":{"position":[[1683,11],[1758,10],[1893,11],[1995,11]]},"446":{"position":[[1125,10],[1281,11]]},"447":{"position":[[221,10]]},"606":{"position":[[264,10]]},"624":{"position":[[447,11],[952,10]]},"729":{"position":[[55,11]]},"730":{"position":[[70,10]]},"824":{"position":[[203,10]]},"828":{"position":[[120,10]]},"831":{"position":[[337,11]]},"890":{"position":[[406,9]]},"1118":{"position":[[172,9]]},"1202":{"position":[[55,11]]}},"keywords":{}}],["free",{"_index":607,"title":{"781":{"position":[[19,5]]}},"content":{"38":{"position":[[1064,4]]},"40":{"position":[[31,4]]},"51":{"position":[[45,4]]},"262":{"position":[[249,4]]},"295":{"position":[[273,4]]},"298":{"position":[[550,4]]},"299":{"position":[[268,4],[774,4],[1128,4]]},"302":{"position":[[639,4],[961,4]]},"315":{"position":[[59,5],[138,4]]},"408":{"position":[[998,4]]},"411":{"position":[[568,7],[1568,5]]},"412":{"position":[[3691,4]]},"476":{"position":[[228,6]]},"538":{"position":[[46,4]]},"554":{"position":[[57,4]]},"598":{"position":[[46,4]]},"661":{"position":[[346,4]]},"686":{"position":[[896,4]]},"689":{"position":[[43,4]]},"698":{"position":[[3026,4]]},"717":{"position":[[53,4]]},"772":{"position":[[1792,4]]},"801":{"position":[[467,4]]},"955":{"position":[[74,4]]},"976":{"position":[[50,4]]},"977":{"position":[[51,4]]},"1143":{"position":[[42,5]]},"1151":{"position":[[98,4]]},"1178":{"position":[[98,4]]},"1198":{"position":[[316,5],[1995,4]]},"1235":{"position":[[138,6]]},"1321":{"position":[[106,4]]}},"keywords":{}}],["freedom",{"_index":1302,"title":{"202":{"position":[[3,7]]},"249":{"position":[[3,7]]}},"content":{"263":{"position":[[73,7]]}},"keywords":{}}],["freeli",{"_index":1932,"title":{},"content":{"330":{"position":[[113,6]]}},"keywords":{}}],["frequenc",{"_index":3566,"title":{},"content":{"611":{"position":[[571,9]]}},"keywords":{}}],["frequent",{"_index":905,"title":{},"content":{"65":{"position":[[198,10]]},"87":{"position":[[81,10]]},"141":{"position":[[274,10]]},"166":{"position":[[216,10]]},"173":{"position":[[686,10]]},"204":{"position":[[337,10]]},"216":{"position":[[75,10]]},"220":{"position":[[304,8]]},"342":{"position":[[19,10]]},"346":{"position":[[784,8]]},"352":{"position":[[15,10]]},"354":{"position":[[821,10],[1691,8]]},"376":{"position":[[247,10],[579,8]]},"411":{"position":[[658,8]]},"430":{"position":[[897,8]]},"497":{"position":[[661,8]]},"570":{"position":[[638,8]]},"587":{"position":[[24,10]]},"622":{"position":[[472,10]]},"623":{"position":[[521,8]]},"624":{"position":[[514,8]]},"690":{"position":[[266,8]]},"836":{"position":[[2147,11]]}},"keywords":{}}],["fresh",{"_index":3129,"title":{},"content":{"481":{"position":[[135,5]]}},"keywords":{}}],["friction",{"_index":1997,"title":{},"content":{"351":{"position":[[330,8]]},"353":{"position":[[793,8]]},"354":{"position":[[1679,8]]}},"keywords":{}}],["friend",{"_index":2602,"title":{},"content":{"410":{"position":[[1657,6]]},"808":{"position":[[620,8]]},"813":{"position":[[143,8],[293,8],[399,7]]}},"keywords":{}}],["friendli",{"_index":938,"title":{"387":{"position":[[10,8]]}},"content":{"65":{"position":[[2113,9]]},"83":{"position":[[398,8]]},"364":{"position":[[12,13]]},"473":{"position":[[189,9]]},"839":{"position":[[347,8],[1154,9]]}},"keywords":{}}],["fromobservable(ob",{"_index":6003,"title":{},"content":{"1118":{"position":[[541,19]]}},"keywords":{}}],["fromobservable(observ",{"_index":839,"title":{},"content":{"55":{"position":[[467,27]]}},"keywords":{}}],["front",{"_index":662,"title":{"225":{"position":[[45,5]]}},"content":{"42":{"position":[[293,5]]},"43":{"position":[[341,5]]},"218":{"position":[[54,5]]},"350":{"position":[[289,5]]},"351":{"position":[[235,5]]},"360":{"position":[[86,5]]},"849":{"position":[[746,5]]},"1088":{"position":[[767,5]]},"1208":{"position":[[589,5]]}},"keywords":{}}],["frontend",{"_index":262,"title":{"213":{"position":[[16,8],[61,8]]},"214":{"position":[[40,9]]},"229":{"position":[[31,9]]}},"content":{"15":{"position":[[433,9]]},"18":{"position":[[81,8]]},"26":{"position":[[244,8]]},"27":{"position":[[68,8],[262,8]]},"38":{"position":[[568,8],[648,8]]},"215":{"position":[[44,8],[105,8]]},"216":{"position":[[1,8]]},"217":{"position":[[21,8]]},"219":{"position":[[1,8],[202,9]]},"220":{"position":[[1,8]]},"221":{"position":[[118,8]]},"222":{"position":[[1,8],[329,8]]},"223":{"position":[[40,8],[131,8],[311,8]]},"224":{"position":[[1,8]]},"225":{"position":[[92,9],[166,8]]},"226":{"position":[[215,8],[331,8],[445,8]]},"227":{"position":[[163,8]]},"228":{"position":[[164,8]]},"229":{"position":[[20,8],[134,8],[204,8]]},"232":{"position":[[57,8]]},"233":{"position":[[253,8]]},"234":{"position":[[274,8]]},"235":{"position":[[253,8]]},"236":{"position":[[330,8]]},"239":{"position":[[293,8]]},"241":{"position":[[63,8],[378,8],[434,8],[665,8]]},"373":{"position":[[63,8],[687,8]]},"411":{"position":[[1873,9]]},"412":{"position":[[9138,9],[9183,8]]},"860":{"position":[[192,8]]},"890":{"position":[[542,8]]},"1320":{"position":[[41,9],[228,8],[446,8]]}},"keywords":{}}],["frontend+backend",{"_index":2659,"title":{},"content":{"412":{"position":[[870,16]]}},"keywords":{}}],["frustratingli",{"_index":2855,"title":{},"content":{"421":{"position":[[880,13]]}},"keywords":{}}],["fs",{"_index":4577,"title":{},"content":{"772":{"position":[[2227,2]]},"1176":{"position":[[250,2],[374,3]]}},"keywords":{}}],["fuel",{"_index":2565,"title":{},"content":{"408":{"position":[[4301,7]]}},"keywords":{}}],["fulfil",{"_index":2622,"title":{},"content":{"411":{"position":[[2655,8]]}},"keywords":{}}],["full",{"_index":49,"title":{"394":{"position":[[37,4]]}},"content":{"2":{"position":[[421,4]]},"6":{"position":[[586,4],[784,4]]},"10":{"position":[[382,4]]},"36":{"position":[[220,4]]},"39":{"position":[[349,4]]},"40":{"position":[[308,4]]},"51":{"position":[[1009,4]]},"83":{"position":[[442,4]]},"205":{"position":[[217,4]]},"222":{"position":[[307,4]]},"241":{"position":[[416,4]]},"252":{"position":[[216,4]]},"285":{"position":[[374,4]]},"302":{"position":[[31,4]]},"357":{"position":[[466,4]]},"392":{"position":[[4902,4]]},"394":{"position":[[1358,4]]},"398":{"position":[[115,4]]},"402":{"position":[[1380,4]]},"411":{"position":[[4112,4],[5047,4]]},"412":{"position":[[10451,4],[11912,4],[13650,4],[13712,4],[14644,4]]},"432":{"position":[[969,4]]},"447":{"position":[[678,4]]},"461":{"position":[[250,4],[1407,4]]},"468":{"position":[[494,4]]},"480":{"position":[[146,4]]},"567":{"position":[[71,4]]},"574":{"position":[[734,4]]},"611":{"position":[[22,4]]},"621":{"position":[[50,4]]},"626":{"position":[[220,4]]},"644":{"position":[[494,4]]},"690":{"position":[[57,4]]},"696":{"position":[[131,4]]},"775":{"position":[[568,4]]},"800":{"position":[[362,4]]},"824":{"position":[[64,4],[99,4]]},"832":{"position":[[17,4]]},"839":{"position":[[487,4]]},"875":{"position":[[1991,4],[5714,4]]},"890":{"position":[[984,4]]},"985":{"position":[[190,4]]},"994":{"position":[[90,4]]},"1004":{"position":[[403,4]]},"1067":{"position":[[708,4]]},"1072":{"position":[[440,4]]},"1147":{"position":[[304,4]]},"1149":{"position":[[5,4]]},"1198":{"position":[[820,4]]},"1219":{"position":[[228,4]]},"1271":{"position":[[293,4],[592,4],[644,4],[687,4]]},"1284":{"position":[[108,4]]},"1318":{"position":[[1160,4]]}},"keywords":{}}],["fulli",{"_index":582,"title":{"248":{"position":[[3,5]]}},"content":{"37":{"position":[[316,5],[392,5]]},"201":{"position":[[100,5]]},"248":{"position":[[149,5]]},"280":{"position":[[239,5]]},"312":{"position":[[28,5]]},"404":{"position":[[131,5]]},"412":{"position":[[200,5]]},"451":{"position":[[569,5]]},"452":{"position":[[399,5]]},"576":{"position":[[221,5]]},"700":{"position":[[482,5]]},"723":{"position":[[2004,5]]},"740":{"position":[[162,5]]},"749":{"position":[[2695,5]]},"829":{"position":[[3845,5]]},"837":{"position":[[476,5]]},"855":{"position":[[28,5]]},"860":{"position":[[395,5]]},"867":{"position":[[28,5]]},"901":{"position":[[757,5]]},"903":{"position":[[262,5]]},"904":{"position":[[166,5]]},"981":{"position":[[1274,5]]},"1047":{"position":[[183,5]]},"1067":{"position":[[904,5],[1812,5],[2233,5]]},"1068":{"position":[[14,5]]},"1214":{"position":[[825,5]]},"1301":{"position":[[1527,5]]}},"keywords":{}}],["fulltext",{"_index":4038,"title":{"722":{"position":[[0,8]]},"723":{"position":[[26,8]]},"724":{"position":[[15,8]]},"1023":{"position":[[9,8]]}},"content":{"723":{"position":[[512,8],[1143,8],[1344,8],[2506,8]]},"724":{"position":[[1219,8]]},"793":{"position":[[1159,8]]},"1023":{"position":[[70,8],[160,8]]}},"keywords":{}}],["fun",{"_index":3964,"title":{},"content":{"702":{"position":[[534,4]]}},"keywords":{}}],["function",{"_index":151,"title":{"747":{"position":[[21,10]]},"937":{"position":[[4,10]]},"940":{"position":[[0,10]]},"1037":{"position":[[0,10]]}},"content":{"11":{"position":[[326,8],[518,8],[684,8]]},"19":{"position":[[328,10]]},"21":{"position":[[72,9]]},"46":{"position":[[49,8]]},"51":{"position":[[641,8]]},"55":{"position":[[357,8]]},"122":{"position":[[337,8]]},"133":{"position":[[99,8]]},"151":{"position":[[209,14]]},"160":{"position":[[57,8]]},"164":{"position":[[87,8]]},"183":{"position":[[104,8]]},"188":{"position":[[894,8]]},"193":{"position":[[74,13]]},"201":{"position":[[249,10]]},"209":{"position":[[205,8]]},"248":{"position":[[155,10]]},"255":{"position":[[552,8]]},"273":{"position":[[288,11]]},"274":{"position":[[125,8]]},"280":{"position":[[76,8],[245,10]]},"292":{"position":[[34,14],[201,11]]},"309":{"position":[[9,13]]},"312":{"position":[[16,11]]},"314":{"position":[[438,8]]},"315":{"position":[[389,8]]},"320":{"position":[[230,14]]},"327":{"position":[[126,9]]},"334":{"position":[[290,8]]},"335":{"position":[[171,8]]},"375":{"position":[[59,14]]},"383":{"position":[[85,13]]},"390":{"position":[[1875,9]]},"391":{"position":[[308,9],[568,8],[760,8]]},"392":{"position":[[4035,8]]},"393":{"position":[[329,9]]},"394":{"position":[[151,9]]},"398":{"position":[[685,8],[1931,8]]},"412":{"position":[[2391,9],[4408,9]]},"414":{"position":[[289,11]]},"419":{"position":[[450,9]]},"420":{"position":[[1210,13]]},"430":{"position":[[969,8]]},"444":{"position":[[314,14],[879,13]]},"445":{"position":[[592,13]]},"446":{"position":[[99,14]]},"447":{"position":[[59,13]]},"480":{"position":[[296,8]]},"482":{"position":[[386,8]]},"494":{"position":[[164,8]]},"500":{"position":[[178,8]]},"502":{"position":[[427,10]]},"516":{"position":[[67,8]]},"529":{"position":[[109,13]]},"534":{"position":[[251,10]]},"541":{"position":[[217,8]]},"542":{"position":[[745,8]]},"554":{"position":[[811,8]]},"556":{"position":[[342,8]]},"559":{"position":[[237,8]]},"562":{"position":[[127,8],[1088,8]]},"563":{"position":[[428,8]]},"564":{"position":[[401,8]]},"579":{"position":[[299,8]]},"584":{"position":[[33,8]]},"594":{"position":[[249,10]]},"598":{"position":[[399,8]]},"610":{"position":[[904,8]]},"616":{"position":[[1071,13]]},"632":{"position":[[1177,8],[2180,8]]},"650":{"position":[[80,14]]},"672":{"position":[[7,8]]},"673":{"position":[[50,8]]},"674":{"position":[[321,8]]},"675":{"position":[[208,9]]},"693":{"position":[[315,9],[875,8]]},"703":{"position":[[858,9]]},"723":{"position":[[2663,8]]},"724":{"position":[[424,9]]},"747":{"position":[[52,9]]},"749":{"position":[[7505,8],[8074,8],[8375,8],[12025,9],[14194,8]]},"751":{"position":[[207,8],[279,8]]},"761":{"position":[[393,8]]},"766":{"position":[[224,9]]},"789":{"position":[[15,10],[101,10],[128,8],[241,11],[488,11]]},"791":{"position":[[97,11],[356,11]]},"792":{"position":[[228,11]]},"802":{"position":[[432,15]]},"805":{"position":[[36,8],[117,8]]},"806":{"position":[[16,9]]},"815":{"position":[[139,8]]},"818":{"position":[[51,8],[421,8],[573,11]]},"829":{"position":[[597,8]]},"846":{"position":[[1450,10]]},"848":{"position":[[559,8],[820,8],[1455,8]]},"860":{"position":[[401,10]]},"862":{"position":[[1685,13]]},"872":{"position":[[2787,13]]},"875":{"position":[[236,8],[5724,8]]},"886":{"position":[[91,8]]},"888":{"position":[[575,9]]},"889":{"position":[[605,8],[799,10],[836,9]]},"890":{"position":[[146,10],[774,9]]},"898":{"position":[[1341,8],[4603,13]]},"902":{"position":[[669,11]]},"904":{"position":[[1574,8]]},"907":{"position":[[179,8]]},"908":{"position":[[256,9]]},"934":{"position":[[342,9],[403,9],[462,9],[674,13],[751,12]]},"937":{"position":[[74,9]]},"950":{"position":[[377,12]]},"952":{"position":[[10,8]]},"953":{"position":[[56,9]]},"956":{"position":[[26,8]]},"958":{"position":[[711,8]]},"960":{"position":[[65,8]]},"968":{"position":[[107,8],[214,8],[239,8],[334,8],[405,8]]},"971":{"position":[[10,8]]},"972":{"position":[[55,9]]},"988":{"position":[[5173,8]]},"992":{"position":[[5,8]]},"1007":{"position":[[1220,8],[1795,8],[2055,8]]},"1020":{"position":[[254,8]]},"1030":{"position":[[114,8]]},"1035":{"position":[[85,9]]},"1036":{"position":[[78,9]]},"1039":{"position":[[6,8]]},"1040":{"position":[[122,9]]},"1042":{"position":[[37,8]]},"1060":{"position":[[29,8]]},"1061":{"position":[[30,8]]},"1069":{"position":[[299,8]]},"1085":{"position":[[2158,10]]},"1097":{"position":[[149,8]]},"1105":{"position":[[36,8],[593,8]]},"1106":{"position":[[38,8],[527,8]]},"1115":{"position":[[85,8],[839,8]]},"1125":{"position":[[74,8]]},"1139":{"position":[[230,9]]},"1140":{"position":[[381,8]]},"1145":{"position":[[222,9]]},"1146":{"position":[[202,9]]},"1151":{"position":[[840,8]]},"1178":{"position":[[837,8]]},"1211":{"position":[[351,8]]},"1218":{"position":[[105,8],[183,8],[220,8]]},"1219":{"position":[[43,9]]},"1229":{"position":[[66,8]]},"1268":{"position":[[66,8]]},"1279":{"position":[[238,8]]},"1280":{"position":[[198,8]]},"1282":{"position":[[522,9],[663,8],[859,8]]},"1291":{"position":[[101,8]]},"1307":{"position":[[876,9]]},"1309":{"position":[[53,10]]},"1311":{"position":[[1143,8]]},"1319":{"position":[[300,8]]},"1320":{"position":[[673,14]]},"1322":{"position":[[500,9]]}},"keywords":{}}],["function"",{"_index":2681,"title":{},"content":{"412":{"position":[[3539,14]]}},"keywords":{}}],["function(authdata",{"_index":5971,"title":{},"content":{"1109":{"position":[[191,18]]}},"keywords":{}}],["function(docdata",{"_index":2497,"title":{},"content":{"403":{"position":[[808,18]]}},"keywords":{}}],["function(ev",{"_index":3570,"title":{},"content":{"611":{"position":[[693,15],[837,15]]}},"keywords":{}}],["function(olddoc",{"_index":4444,"title":{},"content":{"751":{"position":[[617,17],[860,17],[1098,17],[1719,17],[1926,17]]},"752":{"position":[[531,17]]},"754":{"position":[[268,17],[414,17],[573,17]]}},"keywords":{}}],["function(thi",{"_index":6501,"title":{},"content":{"1311":{"position":[[670,14],[859,14]]}},"keywords":{}}],["functionality.run",{"_index":1209,"title":{},"content":{"173":{"position":[[2463,21]]}},"keywords":{}}],["fund",{"_index":605,"title":{},"content":{"38":{"position":[[1029,8]]}},"keywords":{}}],["fundament",{"_index":1630,"title":{},"content":{"270":{"position":[[32,11]]},"408":{"position":[[2702,11]]},"525":{"position":[[33,11]]}},"keywords":{}}],["funnel",{"_index":2618,"title":{},"content":{"411":{"position":[[2402,6]]}},"keywords":{}}],["further",{"_index":688,"title":{"1302":{"position":[[0,7]]}},"content":{"43":{"position":[[722,7]]},"137":{"position":[[63,7]]},"175":{"position":[[4,7]]},"241":{"position":[[4,7]]},"283":{"position":[[379,7]]},"299":{"position":[[674,8]]},"373":{"position":[[4,7]]},"377":{"position":[[365,7]]},"391":{"position":[[920,7]]},"419":{"position":[[1818,7]]},"467":{"position":[[419,7]]},"490":{"position":[[676,7]]},"624":{"position":[[1051,7]]},"643":{"position":[[154,7]]},"648":{"position":[[333,7]]},"849":{"position":[[183,7]]},"1120":{"position":[[498,7]]},"1198":{"position":[[945,8]]},"1296":{"position":[[1627,7]]},"1324":{"position":[[803,7]]}},"keywords":{}}],["furthermor",{"_index":2240,"title":{},"content":{"392":{"position":[[2231,12]]},"500":{"position":[[692,12]]}},"keywords":{}}],["futur",{"_index":331,"title":{"404":{"position":[[9,6]]},"406":{"position":[[32,6]]},"421":{"position":[[23,7]]},"470":{"position":[[0,6]]}},"content":{"19":{"position":[[430,7]]},"404":{"position":[[108,7]]},"408":{"position":[[4089,6]]},"420":{"position":[[912,6]]},"470":{"position":[[283,7],[458,7]]},"500":{"position":[[30,6]]},"620":{"position":[[583,6]]},"624":{"position":[[1188,6]]},"644":{"position":[[645,6]]},"786":{"position":[[179,6]]},"839":{"position":[[1083,6]]},"1100":{"position":[[306,7]]}},"keywords":{}}],["gain",{"_index":1541,"title":{"408":{"position":[[19,7]]}},"content":{"247":{"position":[[131,4]]},"412":{"position":[[9587,5]]},"420":{"position":[[1096,5]]},"446":{"position":[[1173,6]]},"483":{"position":[[209,5]]}},"keywords":{}}],["game",{"_index":1634,"title":{},"content":{"274":{"position":[[47,4]]},"375":{"position":[[456,6]]},"399":{"position":[[263,6],[559,6]]},"445":{"position":[[59,4]]},"611":{"position":[[310,7]]},"613":{"position":[[455,7]]},"624":{"position":[[790,6]]},"699":{"position":[[646,4]]},"1006":{"position":[[48,4],[263,4]]},"1007":{"position":[[956,4]]}},"keywords":{}}],["gap",{"_index":1935,"title":{},"content":{"331":{"position":[[238,4]]},"408":{"position":[[5147,3]]},"438":{"position":[[235,4]]},"502":{"position":[[534,4]]},"576":{"position":[[340,3]]},"1123":{"position":[[699,3]]}},"keywords":{}}],["garner",{"_index":3250,"title":{},"content":{"513":{"position":[[43,8]]}},"keywords":{}}],["gather",{"_index":5960,"title":{},"content":{"1105":{"position":[[1165,6]]}},"keywords":{}}],["gb",{"_index":1744,"title":{},"content":{"299":{"position":[[312,2],[324,2],[426,2],[601,2],[900,3]]},"408":{"position":[[1034,2]]}},"keywords":{}}],["gcm",{"_index":4035,"title":{},"content":{"718":{"position":[[536,4]]}},"keywords":{}}],["gdpr",{"_index":3335,"title":{},"content":{"550":{"position":[[414,4]]}},"keywords":{}}],["gen",{"_index":6398,"title":{},"content":{"1292":{"position":[[167,3]]}},"keywords":{}}],["gender",{"_index":4651,"title":{},"content":{"798":{"position":[[396,6],[434,10],[482,9],[596,7],[763,10],[889,9],[918,10]]},"1066":{"position":[[402,7],[569,10],[695,9],[724,10]]}},"keywords":{}}],["gener",{"_index":1631,"title":{"391":{"position":[[0,10]]},"828":{"position":[[0,7]]}},"content":{"270":{"position":[[147,9]]},"299":{"position":[[835,9],[1145,9]]},"392":{"position":[[1872,9],[2009,8],[2540,9],[3395,10]]},"398":{"position":[[313,9]]},"412":{"position":[[9744,9]]},"454":{"position":[[387,9]]},"456":{"position":[[171,8]]},"461":{"position":[[691,9]]},"612":{"position":[[810,9],[958,7],[1221,7]]},"622":{"position":[[415,9]]},"623":{"position":[[508,9]]},"624":{"position":[[1598,9]]},"661":{"position":[[169,9]]},"709":{"position":[[922,9]]},"711":{"position":[[1843,8]]},"836":{"position":[[171,9]]},"837":{"position":[[698,7]]},"841":{"position":[[904,9]]},"889":{"position":[[994,8]]},"912":{"position":[[561,9]]},"1072":{"position":[[1741,9]]},"1098":{"position":[[146,7]]},"1192":{"position":[[619,7]]},"1276":{"position":[[171,7]]},"1316":{"position":[[2146,9],[3647,7]]},"1322":{"position":[[280,9]]}},"keywords":{}}],["geniu",{"_index":790,"title":{},"content":{"52":{"position":[[134,7]]},"539":{"position":[[134,7]]},"599":{"position":[[143,7]]}},"keywords":{}}],["genuin",{"_index":2518,"title":{},"content":{"407":{"position":[[456,7]]}},"keywords":{}}],["geoloc",{"_index":2822,"title":{},"content":{"419":{"position":[[1785,11]]}},"keywords":{}}],["german",{"_index":3024,"title":{},"content":{"462":{"position":[[586,6]]}},"keywords":{}}],["get",{"_index":1074,"title":{"119":{"position":[[0,7]]},"154":{"position":[[0,7]]},"180":{"position":[[0,7]]},"256":{"position":[[0,7]]},"272":{"position":[[0,7]]},"324":{"position":[[0,7]]},"502":{"position":[[0,7]]},"577":{"position":[[0,7]]},"669":{"position":[[0,7]]}},"content":{"285":{"position":[[1,7]]},"393":{"position":[[753,4]]},"412":{"position":[[12183,4]]},"698":{"position":[[872,4]]},"751":{"position":[[294,4]]},"793":{"position":[[19,7]]},"805":{"position":[[126,4]]},"818":{"position":[[111,4]]},"875":{"position":[[3664,4]]},"886":{"position":[[105,4],[3358,4]]},"921":{"position":[[1,4],[112,4]]},"968":{"position":[[248,4]]},"983":{"position":[[485,4]]},"986":{"position":[[1108,4]]},"1078":{"position":[[46,4]]},"1104":{"position":[[276,4]]},"1105":{"position":[[138,4]]},"1115":{"position":[[99,4]]},"1154":{"position":[[20,4]]},"1233":{"position":[[206,4]]},"1295":{"position":[[1070,7],[1223,7]]},"1307":{"position":[[365,4]]},"1315":{"position":[[1447,4]]}},"keywords":{}}],["get/put",{"_index":731,"title":{},"content":{"47":{"position":[[515,7]]}},"keywords":{}}],["get/set",{"_index":3440,"title":{},"content":{"566":{"position":[[224,7]]}},"keywords":{}}],["getajv",{"_index":6388,"title":{},"content":{"1290":{"position":[[10,6],[65,9]]}},"keywords":{}}],["getal",{"_index":2960,"title":{},"content":{"452":{"position":[[527,8]]},"1294":{"position":[[104,8],[409,8],[754,9],[2101,9]]}},"keywords":{}}],["getallkey",{"_index":6424,"title":{},"content":{"1294":{"position":[[429,13]]}},"keywords":{}}],["getattach",{"_index":5297,"title":{"919":{"position":[[0,16]]}},"content":{},"keywords":{}}],["getattachmentdata",{"_index":4123,"title":{},"content":{"746":{"position":[[761,18]]}},"keywords":{}}],["getchangeddocumentssinc",{"_index":4124,"title":{},"content":{"746":{"position":[[786,25]]}},"keywords":{}}],["getconnectionhandlersimplep",{"_index":1363,"title":{},"content":{"210":{"position":[[172,30],[360,32]]},"261":{"position":[[240,30],[489,32]]},"904":{"position":[[1331,30],[1679,30],[2559,32]]},"906":{"position":[[851,33]]},"911":{"position":[[687,32]]},"1121":{"position":[[355,30],[715,35]]}},"keywords":{}}],["getcrdtschemapart",{"_index":3872,"title":{},"content":{"680":{"position":[[351,18],[972,19]]}},"keywords":{}}],["getcrdtschemapart()set",{"_index":3870,"title":{},"content":{"680":{"position":[[165,22]]}},"keywords":{}}],["getdata",{"_index":5306,"title":{"930":{"position":[[0,10]]}},"content":{},"keywords":{}}],["getdatabas",{"_index":168,"title":{},"content":{"11":{"position":[[693,14]]},"829":{"position":[[606,13],[1359,11],[1529,14]]}},"keywords":{}}],["getdatabase64",{"_index":5294,"title":{"931":{"position":[[0,16]]}},"content":{"917":{"position":[[592,15]]}},"keywords":{}}],["getdatabaseconnect",{"_index":6364,"title":{},"content":{"1281":{"position":[[74,21],[116,21],[217,22]]}},"keywords":{}}],["getdatabasepassword",{"_index":3363,"title":{},"content":{"556":{"position":[[351,21]]}},"keywords":{}}],["getdoc",{"_index":4881,"title":{},"content":{"857":{"position":[[214,8]]}},"keywords":{}}],["getdocs(query(firestorecollect",{"_index":4883,"title":{},"content":{"857":{"position":[[303,36]]}},"keywords":{}}],["getembedding(doc.text",{"_index":2380,"title":{},"content":{"397":{"position":[[1890,23]]}},"keywords":{}}],["getembedding(docdata.bodi",{"_index":2498,"title":{},"content":{"403":{"position":[[851,27]]}},"keywords":{}}],["getembeddingfromtext",{"_index":2212,"title":{},"content":{"391":{"position":[[285,22]]}},"keywords":{}}],["getembeddingfromtext(text",{"_index":2221,"title":{},"content":{"391":{"position":[[577,26]]}},"keywords":{}}],["getembeddingfromtext(userinput",{"_index":2310,"title":{},"content":{"394":{"position":[[651,32]]}},"keywords":{}}],["getfetchwithcouchdbauthor",{"_index":4842,"title":{},"content":{"848":{"position":[[1083,34],[1193,32]]}},"keywords":{}}],["getfetchwithcouchdbauthorization('myusernam",{"_index":4843,"title":{},"content":{"848":{"position":[[1480,46]]}},"keywords":{}}],["getfirestor",{"_index":4863,"title":{},"content":{"854":{"position":[[143,13]]}},"keywords":{}}],["getfirestore(app",{"_index":4869,"title":{},"content":{"854":{"position":[[374,18]]}},"keywords":{}}],["getitem",{"_index":2868,"title":{},"content":{"425":{"position":[[176,8],[347,7]]},"451":{"position":[[203,8]]},"835":{"position":[[437,9]]}},"keywords":{}}],["getitem())rxdb",{"_index":3421,"title":{},"content":{"560":{"position":[[595,16]]}},"keywords":{}}],["getitem/setitem",{"_index":4805,"title":{},"content":{"841":{"position":[[280,15]]}},"keywords":{}}],["getlatest",{"_index":5701,"title":{"1045":{"position":[[0,12]]}},"content":{},"keywords":{}}],["getleaderelectorbybroadcastchannel",{"_index":4105,"title":{},"content":{"740":{"position":[[425,34]]}},"keywords":{}}],["getleaderelectorbybroadcastchannel(broadcastchannel",{"_index":4107,"title":{},"content":{"740":{"position":[[521,53]]}},"keywords":{}}],["getloc",{"_index":5604,"title":{"1016":{"position":[[0,11]]},"1017":{"position":[[0,12]]}},"content":{"1017":{"position":[[6,10]]}},"keywords":{}}],["getlocalstoragemetaoptimizerrxstorag",{"_index":6092,"title":{},"content":{"1154":{"position":[[207,37],[482,39]]},"1238":{"position":[[684,37],[842,39]]},"1239":{"position":[[485,37],[812,39]]}},"keywords":{}}],["getlocalstoragemock",{"_index":6104,"title":{},"content":{"1159":{"position":[[298,19],[467,21]]}},"keywords":{}}],["getlokijsadapterflutt",{"_index":1249,"title":{},"content":{"188":{"position":[[783,23],[1119,25]]}},"keywords":{}}],["getmemorymappedrxstorag",{"_index":4583,"title":{},"content":{"774":{"position":[[567,24],[709,26]]},"1090":{"position":[[677,24],[824,26]]},"1182":{"position":[[91,24],[404,26]]},"1184":{"position":[[457,24],[650,26]]},"1185":{"position":[[310,26]]},"1186":{"position":[[268,26]]},"1239":{"position":[[599,24],[861,26]]}},"keywords":{}}],["getmemorysyncedrxstorag",{"_index":6113,"title":{},"content":{"1163":{"position":[[91,24],[400,26]]},"1164":{"position":[[134,26]]},"1165":{"position":[[363,26]]}},"keywords":{}}],["getpouchdbofrxcollect",{"_index":6186,"title":{},"content":{"1204":{"position":[[237,24]]}},"keywords":{}}],["getpouchdbofrxcollection(myrxcollect",{"_index":6187,"title":{},"content":{"1204":{"position":[[307,41]]}},"keywords":{}}],["getrxdatabase("javascript/dist/index.js"",{"_index":1275,"title":{},"content":{"188":{"position":[[2655,51]]}},"keywords":{}}],["getrxstoragedenokv",{"_index":6016,"title":{},"content":{"1125":{"position":[[55,18],[203,18],[334,20]]},"1126":{"position":[[419,21]]}},"keywords":{}}],["getrxstoragedexi",{"_index":4970,"title":{},"content":{"872":{"position":[[3825,17],[4020,19]]},"1144":{"position":[[92,17],[232,19]]},"1145":{"position":[[202,19],[296,17],[572,19]]},"1146":{"position":[[182,19],[277,19]]},"1148":{"position":[[582,17],[753,19]]},"1149":{"position":[[741,17],[959,19]]}},"keywords":{}}],["getrxstoragefilesystemnod",{"_index":5908,"title":{},"content":{"1090":{"position":[[586,26],[860,28]]},"1126":{"position":[[732,29]]},"1130":{"position":[[51,26],[207,28]]}},"keywords":{}}],["getrxstoragefoundationdb",{"_index":4564,"title":{},"content":{"772":{"position":[[684,24],[817,26]]},"774":{"position":[[489,24],[745,26]]},"1134":{"position":[[51,24],[184,26]]}},"keywords":{}}],["getrxstorageindexeddb",{"_index":4028,"title":{},"content":{"718":{"position":[[218,21],[425,23]]},"745":{"position":[[273,21],[433,25]]},"746":{"position":[[321,26]]},"747":{"position":[[138,26]]},"759":{"position":[[161,21],[406,24]]},"820":{"position":[[80,21],[324,24]]},"932":{"position":[[780,21],[998,23]]},"1138":{"position":[[88,23],[193,21],[328,23]]},"1139":{"position":[[206,23],[291,21],[583,23]]},"1140":{"position":[[507,21],[642,23]]},"1154":{"position":[[321,21],[635,23]]},"1163":{"position":[[11,21],[300,24]]},"1165":{"position":[[310,24]]},"1182":{"position":[[11,21],[300,24]]},"1184":{"position":[[377,21],[734,23]]},"1185":{"position":[[375,23]]},"1186":{"position":[[326,23]]},"1225":{"position":[[82,24],[214,21],[434,23]]},"1226":{"position":[[131,21]]},"1231":{"position":[[527,21],[796,24]]},"1237":{"position":[[743,21],[991,23]]},"1238":{"position":[[604,21],[987,23]]},"1263":{"position":[[100,21],[328,23]]},"1268":{"position":[[655,21],[759,23]]}},"keywords":{}}],["getrxstorageipcrender",{"_index":3925,"title":{},"content":{"693":{"position":[[352,24],[1024,23],[1208,25]]},"1214":{"position":[[661,25]]}},"keywords":{}}],["getrxstoragelocalstorag",{"_index":776,"title":{},"content":{"51":{"position":[[559,24],[773,26]]},"55":{"position":[[731,24],[915,27]]},"209":{"position":[[64,24],[287,27]]},"211":{"position":[[126,24],[259,26]]},"255":{"position":[[411,24],[631,27]]},"258":{"position":[[64,24],[192,26]]},"314":{"position":[[363,24],[522,27],[1051,26]]},"315":{"position":[[260,24],[490,26]]},"334":{"position":[[215,24],[379,27]]},"392":{"position":[[257,24],[391,26]]},"480":{"position":[[221,24],[417,26]]},"482":{"position":[[222,24],[530,26]]},"522":{"position":[[328,24],[474,27]]},"538":{"position":[[322,24],[503,26]]},"542":{"position":[[442,24],[576,27]]},"562":{"position":[[51,24],[211,27]]},"563":{"position":[[261,24],[531,27]]},"564":{"position":[[325,24],[498,26]]},"579":{"position":[[217,24],[388,27]]},"598":{"position":[[317,24],[510,26]]},"632":{"position":[[1102,24],[1339,27]]},"638":{"position":[[382,26]]},"653":{"position":[[167,24],[299,27]]},"680":{"position":[[580,24],[720,26]]},"710":{"position":[[1590,24],[1742,26]]},"717":{"position":[[647,24],[842,26]]},"734":{"position":[[211,24],[354,26]]},"739":{"position":[[198,24],[331,27]]},"759":{"position":[[241,24],[670,27]]},"760":{"position":[[337,24],[666,27]]},"825":{"position":[[383,27]]},"829":{"position":[[522,24],[690,26]]},"862":{"position":[[379,24],[581,26]]},"898":{"position":[[2228,24],[2363,26]]},"904":{"position":[[628,24],[760,26]]},"960":{"position":[[196,24],[342,27]]},"962":{"position":[[667,24],[801,26]]},"966":{"position":[[583,27],[701,27]]},"967":{"position":[[168,27],[286,27]]},"1013":{"position":[[346,27]]},"1114":{"position":[[495,24],[757,27]]},"1118":{"position":[[687,27]]},"1121":{"position":[[497,27]]},"1156":{"position":[[302,26]]},"1158":{"position":[[86,24],[240,26]]},"1159":{"position":[[272,25],[426,26]]},"1218":{"position":[[625,24],[796,27]]},"1222":{"position":[[88,24],[393,26]]},"1286":{"position":[[271,24],[442,26]]},"1287":{"position":[[317,24],[492,26]]},"1288":{"position":[[277,24],[458,26]]},"1311":{"position":[[209,26]]}},"keywords":{}}],["getrxstorageloki",{"_index":1248,"title":{},"content":{"188":{"position":[[688,16],[1091,18]]},"772":{"position":[[2264,16],[2446,18]]},"1172":{"position":[[51,16],[353,18]]}},"keywords":{}}],["getrxstoragememori",{"_index":1612,"title":{},"content":{"266":{"position":[[590,18],[711,20]]},"554":{"position":[[748,18],[978,20]]},"693":{"position":[[790,18],[944,21],[1094,18]]},"773":{"position":[[486,18],[607,20]]},"872":{"position":[[1603,18],[1759,20]]},"1090":{"position":[[454,18]]},"1168":{"position":[[67,18],[188,20]]},"1219":{"position":[[272,18],[738,20]]}},"keywords":{}}],["getrxstoragemongodb",{"_index":5387,"title":{},"content":{"962":{"position":[[888,19],[1017,21]]},"1189":{"position":[[133,19],[318,19],[451,21]]}},"keywords":{}}],["getrxstorageopf",{"_index":6234,"title":{},"content":{"1211":{"position":[[125,18]]},"1212":{"position":[[304,16],[458,19]]},"1213":{"position":[[601,16],[678,18]]}},"keywords":{}}],["getrxstorageopfsmainthread",{"_index":6235,"title":{},"content":{"1211":{"position":[[271,28],[582,26],[724,28]]},"1239":{"position":[[686,26],[897,28]]}},"keywords":{}}],["getrxstoragepouch",{"_index":26,"title":{},"content":{"1":{"position":[[368,17]]},"8":{"position":[[791,17]]},"11":{"position":[[865,18]]},"1201":{"position":[[51,18],[228,18]]}},"keywords":{}}],["getrxstoragepouch('idb",{"_index":56,"title":{},"content":{"3":{"position":[[267,24]]}},"keywords":{}}],["getrxstoragepouch('indexeddb",{"_index":74,"title":{},"content":{"4":{"position":[[445,30]]}},"keywords":{}}],["getrxstoragepouch('memori",{"_index":38,"title":{},"content":{"1":{"position":[[584,27]]}},"keywords":{}}],["getrxstoragepouch('nod",{"_index":135,"title":{},"content":{"9":{"position":[[301,23]]}},"keywords":{}}],["getrxstoragepouch('react",{"_index":132,"title":{},"content":{"8":{"position":[[1156,24]]}},"keywords":{}}],["getrxstoragepouch('websql",{"_index":80,"title":{},"content":{"5":{"position":[[355,27]]},"7":{"position":[[387,27],[583,27]]}},"keywords":{}}],["getrxstoragepouch(asyncstoragedown",{"_index":139,"title":{},"content":{"10":{"position":[[339,35]]}},"keywords":{}}],["getrxstoragepouch(leveldown",{"_index":91,"title":{},"content":{"6":{"position":[[550,28],[748,28]]}},"keywords":{}}],["getrxstoragepouch(memdown",{"_index":48,"title":{},"content":{"2":{"position":[[387,26]]}},"keywords":{}}],["getrxstorageremot",{"_index":6246,"title":{},"content":{"1218":{"position":[[294,18],[367,20]]}},"keywords":{}}],["getrxstorageremotewebsocket",{"_index":6255,"title":{},"content":{"1219":{"position":[[786,27],[909,29]]},"1220":{"position":[[472,29]]}},"keywords":{}}],["getrxstorageshard",{"_index":6262,"title":{},"content":{"1222":{"position":[[10,20],[254,22]]},"1238":{"position":[[452,20],[891,22]]}},"keywords":{}}],["getrxstoragesharedwork",{"_index":6265,"title":{},"content":{"1226":{"position":[[51,24],[265,25]]},"1227":{"position":[[601,24],[743,25]]}},"keywords":{}}],["getrxstoragesqlit",{"_index":1893,"title":{},"content":{"314":{"position":[[1083,20]]},"772":{"position":[[1471,19],[1684,20]]},"838":{"position":[[2425,20]]},"1271":{"position":[[752,18]]},"1274":{"position":[[51,19],[368,20]]},"1275":{"position":[[169,19],[379,20]]},"1276":{"position":[[441,19],[981,20]]},"1277":{"position":[[192,19],[518,20],[726,19],[874,20]]},"1278":{"position":[[295,19],[527,20],[747,19],[979,20]]},"1279":{"position":[[360,19],[755,20]]},"1280":{"position":[[291,19],[490,20]]},"1282":{"position":[[675,20],[767,20],[1099,21],[1138,20]]}},"keywords":{}}],["getrxstoragesqlitetri",{"_index":3811,"title":{},"content":{"662":{"position":[[1928,24],[2173,25]]},"838":{"position":[[2068,24]]},"1271":{"position":[[1126,24],[1421,25]]}},"keywords":{}}],["getrxstoragework",{"_index":6228,"title":{},"content":{"1210":{"position":[[333,18],[469,19]]},"1213":{"position":[[241,20]]},"1238":{"position":[[530,18],[923,20]]},"1264":{"position":[[51,18],[187,19]]},"1265":{"position":[[595,18],[731,19]]},"1267":{"position":[[14,20],[269,20],[433,20],[489,20]]},"1268":{"position":[[124,20],[434,20]]}},"keywords":{}}],["getsqlitebasicscapacitor",{"_index":3812,"title":{},"content":{"662":{"position":[[1953,24]]},"838":{"position":[[2093,24]]},"1279":{"position":[[247,24],[380,24]]}},"keywords":{}}],["getsqlitebasicscapacitor(sqlit",{"_index":3815,"title":{},"content":{"662":{"position":[[2213,32]]},"1279":{"position":[[1035,32]]},"1282":{"position":[[802,32],[1173,32]]}},"keywords":{}}],["getsqlitebasicsexposqlit",{"_index":6354,"title":{},"content":{"1278":{"position":[[767,25]]}},"keywords":{}}],["getsqlitebasicsexposqlite(opendatabas",{"_index":6356,"title":{},"content":{"1278":{"position":[[1014,39]]}},"keywords":{}}],["getsqlitebasicsexposqliteasync",{"_index":6352,"title":{},"content":{"1278":{"position":[[203,32],[315,30]]}},"keywords":{}}],["getsqlitebasicsexposqliteasync(sqlite.opendatabaseasync",{"_index":6353,"title":{},"content":{"1278":{"position":[[562,56]]}},"keywords":{}}],["getsqlitebasicsnod",{"_index":4572,"title":{},"content":{"772":{"position":[[1491,19]]},"1272":{"position":[[470,21]]},"1274":{"position":[[71,19]]}},"keywords":{}}],["getsqlitebasicsnode(sqlite3",{"_index":4574,"title":{},"content":{"772":{"position":[[1719,28]]},"1274":{"position":[[648,28]]}},"keywords":{}}],["getsqlitebasicsnoden",{"_index":6331,"title":{},"content":{"1271":{"position":[[1151,25]]},"1272":{"position":[[536,27]]},"1275":{"position":[[189,25]]}},"keywords":{}}],["getsqlitebasicsnodenative(databasesync",{"_index":6334,"title":{},"content":{"1271":{"position":[[1461,39]]},"1275":{"position":[[414,39]]}},"keywords":{}}],["getsqlitebasicsquicksqlit",{"_index":6349,"title":{},"content":{"1277":{"position":[[56,26],[212,26]]}},"keywords":{}}],["getsqlitebasicsquicksqlite(open",{"_index":4794,"title":{},"content":{"838":{"position":[[2460,32]]},"1277":{"position":[[553,32]]}},"keywords":{}}],["getsqlitebasicstauri",{"_index":6361,"title":{},"content":{"1280":{"position":[[177,20],[311,20]]}},"keywords":{}}],["getsqlitebasicstauri(sqlite3",{"_index":6363,"title":{},"content":{"1280":{"position":[[525,29]]}},"keywords":{}}],["getsqlitebasicswasm",{"_index":6340,"title":{},"content":{"1276":{"position":[[461,19]]}},"keywords":{}}],["getsqlitebasicswasm(sqlite3",{"_index":6347,"title":{},"content":{"1276":{"position":[[1016,28]]}},"keywords":{}}],["getsqlitebasicswebsql",{"_index":6350,"title":{},"content":{"1277":{"position":[[746,21]]}},"keywords":{}}],["getsqlitebasicswebsql(sqlite.opendatabas",{"_index":6351,"title":{},"content":{"1277":{"position":[[909,42]]}},"keywords":{}}],["getstringdata",{"_index":5312,"title":{"932":{"position":[[0,16]]}},"content":{},"keywords":{}}],["getter",{"_index":4684,"title":{"811":{"position":[[4,7]]}},"content":{"811":{"position":[[59,7]]},"1040":{"position":[[48,7]]},"1050":{"position":[[3,6]]},"1084":{"position":[[113,7]]}},"keywords":{}}],["getter/sett",{"_index":4557,"title":{},"content":{"770":{"position":[[239,13]]}},"keywords":{}}],["getvectorfromtext",{"_index":2256,"title":{},"content":{"392":{"position":[[3506,17]]}},"keywords":{}}],["getvectorfromtext(doc.text",{"_index":2247,"title":{},"content":{"392":{"position":[[2849,28]]}},"keywords":{}}],["getvectorfromtext(e.data.text",{"_index":2260,"title":{},"content":{"392":{"position":[[3600,31]]}},"keywords":{}}],["getvectorfromtextwithworker(doc.bodi",{"_index":2283,"title":{},"content":{"392":{"position":[[4806,38]]}},"keywords":{}}],["getvectorfromtextwithworker(text",{"_index":2269,"title":{},"content":{"392":{"position":[[4044,33]]}},"keywords":{}}],["gibson",{"_index":5724,"title":{},"content":{"1051":{"position":[[277,9],[547,9]]}},"keywords":{}}],["gigabyt",{"_index":2534,"title":{},"content":{"408":{"position":[[921,9],[1089,9]]},"412":{"position":[[6761,12],[6999,11]]},"461":{"position":[[1338,9]]},"696":{"position":[[1228,9]]}},"keywords":{}}],["git",{"_index":2667,"title":{},"content":{"412":{"position":[[1987,3],[3597,3]]},"666":{"position":[[147,3]]},"731":{"position":[[61,3]]},"982":{"position":[[53,4]]}},"keywords":{}}],["github",{"_index":523,"title":{},"content":{"33":{"position":[[511,6]]},"38":{"position":[[848,6]]},"56":{"position":[[84,6]]},"61":{"position":[[94,6],[187,7],[259,6]]},"84":{"position":[[120,6],[158,6]]},"114":{"position":[[133,6],[171,6]]},"149":{"position":[[133,6],[171,6],[464,6]]},"175":{"position":[[126,6],[164,6]]},"198":{"position":[[548,6]]},"241":{"position":[[237,6]]},"263":{"position":[[645,6]]},"306":{"position":[[282,6]]},"347":{"position":[[133,6],[171,6]]},"362":{"position":[[1204,6],[1242,6]]},"373":{"position":[[237,6]]},"405":{"position":[[158,6]]},"462":{"position":[[502,6]]},"471":{"position":[[67,6],[143,6]]},"483":{"position":[[970,7]]},"498":{"position":[[377,6],[436,6]]},"511":{"position":[[133,6],[171,6]]},"531":{"position":[[133,6],[171,6],[462,6]]},"543":{"position":[[91,6]]},"548":{"position":[[93,6]]},"557":{"position":[[224,6]]},"567":{"position":[[443,6]]},"591":{"position":[[133,6],[171,6],[593,7]]},"603":{"position":[[89,6]]},"608":{"position":[[93,6]]},"628":{"position":[[245,6]]},"644":{"position":[[302,6]]},"824":{"position":[[413,6]]},"913":{"position":[[196,6],[262,6]]},"1112":{"position":[[43,6],[126,6]]}},"keywords":{}}],["githublearn",{"_index":2513,"title":{},"content":{"405":{"position":[[87,11]]}},"keywords":{}}],["give",{"_index":1595,"title":{},"content":{"263":{"position":[[59,5]]},"399":{"position":[[572,4]]},"407":{"position":[[747,5]]},"411":{"position":[[5309,6]]},"412":{"position":[[12422,4]]},"418":{"position":[[561,6]]},"455":{"position":[[142,4]]},"469":{"position":[[1366,5]]},"498":{"position":[[695,4]]},"581":{"position":[[81,6]]},"617":{"position":[[1350,5]]},"686":{"position":[[862,5]]},"774":{"position":[[856,5]]},"1009":{"position":[[663,5]]},"1132":{"position":[[36,5]]},"1207":{"position":[[486,5]]},"1219":{"position":[[138,4]]},"1294":{"position":[[1873,4]]},"1322":{"position":[[120,4]]}},"keywords":{}}],["given",{"_index":2303,"title":{},"content":{"394":{"position":[[227,5]]},"402":{"position":[[1434,5]]},"412":{"position":[[5877,5]]},"459":{"position":[[501,5]]},"617":{"position":[[585,5]]},"724":{"position":[[797,5]]},"749":{"position":[[13,5],[575,5],[1315,5],[2330,5],[2392,5],[8140,5],[8346,5],[11893,5],[13130,5],[18831,5],[18937,5]]},"797":{"position":[[107,5]]},"848":{"position":[[241,5]]},"875":{"position":[[1451,5],[1822,5]]},"878":{"position":[[115,5]]},"885":{"position":[[231,5]]},"957":{"position":[[21,5]]},"978":{"position":[[21,5]]},"981":{"position":[[1642,5]]},"983":{"position":[[300,5]]},"984":{"position":[[360,5]]},"988":{"position":[[2956,5],[3053,5]]},"1002":{"position":[[238,5]]},"1022":{"position":[[312,5]]},"1023":{"position":[[621,5]]},"1039":{"position":[[44,5]]},"1043":{"position":[[16,5]]},"1053":{"position":[[21,5]]},"1063":{"position":[[21,5]]},"1070":{"position":[[21,5]]},"1097":{"position":[[183,5]]},"1100":{"position":[[560,5]]},"1104":{"position":[[285,5]]},"1114":{"position":[[896,5]]},"1172":{"position":[[537,5]]},"1252":{"position":[[115,5]]},"1294":{"position":[[1990,5]]},"1322":{"position":[[365,5]]}},"keywords":{}}],["global",{"_index":144,"title":{"729":{"position":[[13,6]]},"1202":{"position":[[13,6]]}},"content":{"11":{"position":[[16,6]]},"304":{"position":[[236,6]]},"333":{"position":[[241,8]]},"346":{"position":[[116,8]]},"411":{"position":[[2103,6]]},"418":{"position":[[462,6],[801,6]]},"460":{"position":[[852,6]]},"579":{"position":[[918,6]]},"590":{"position":[[256,6]]},"674":{"position":[[102,6]]},"701":{"position":[[85,6]]},"729":{"position":[[116,6],[207,6]]},"785":{"position":[[193,6],[459,6]]},"852":{"position":[[30,6]]},"873":{"position":[[71,7]]},"1123":{"position":[[52,8]]},"1124":{"position":[[1564,6]]},"1202":{"position":[[160,6],[246,6]]}},"keywords":{}}],["global.atob",{"_index":120,"title":{},"content":{"8":{"position":[[579,14],[596,11]]}},"keywords":{}}],["global.btoa",{"_index":119,"title":{},"content":{"8":{"position":[[535,14],[552,11]]}},"keywords":{}}],["go",{"_index":387,"title":{"670":{"position":[[3,3]]}},"content":{"23":{"position":[[301,2]]},"29":{"position":[[477,5]]},"249":{"position":[[125,3]]},"404":{"position":[[54,3]]},"408":{"position":[[3928,2]]},"412":{"position":[[140,2],[9936,2],[13995,2]]},"437":{"position":[[58,2]]},"491":{"position":[[1621,2]]},"620":{"position":[[352,2]]},"662":{"position":[[861,2]]},"670":{"position":[[274,2]]},"686":{"position":[[183,2]]},"698":{"position":[[93,2]]},"708":{"position":[[416,2]]},"709":{"position":[[704,2],[1168,2]]},"723":{"position":[[2233,2]]},"778":{"position":[[332,2]]},"836":{"position":[[1596,2]]},"862":{"position":[[53,2]]},"987":{"position":[[958,2]]},"988":{"position":[[6083,2]]},"1198":{"position":[[1096,2]]},"1304":{"position":[[1075,2],[1178,2]]},"1316":{"position":[[470,2],[3495,2]]}},"keywords":{}}],["goal",{"_index":290,"title":{},"content":{"17":{"position":[[183,4]]},"27":{"position":[[136,4]]},"380":{"position":[[23,4]]},"981":{"position":[[113,5]]},"1087":{"position":[[53,4]]},"1177":{"position":[[202,5]]},"1204":{"position":[[203,5]]}},"keywords":{}}],["god",{"_index":795,"title":{},"content":{"52":{"position":[[230,4]]},"539":{"position":[[230,4]]},"599":{"position":[[248,4]]}},"keywords":{}}],["goe",{"_index":1564,"title":{},"content":{"253":{"position":[[212,4]]},"407":{"position":[[595,4]]},"410":{"position":[[1445,4]]},"414":{"position":[[352,4]]},"610":{"position":[[1254,4]]},"700":{"position":[[953,4]]},"701":{"position":[[30,4]]},"702":{"position":[[435,4]]},"709":{"position":[[288,4]]},"981":{"position":[[1083,4]]},"985":{"position":[[437,4]]},"988":{"position":[[5860,4],[5996,4]]},"996":{"position":[[47,4]]},"1175":{"position":[[173,4]]},"1314":{"position":[[572,4]]},"1316":{"position":[[3835,4]]},"1321":{"position":[[376,4]]}},"keywords":{}}],["gone",{"_index":5419,"title":{},"content":{"977":{"position":[[127,4]]}},"keywords":{}}],["good",{"_index":16,"title":{"67":{"position":[[39,4]]},"71":{"position":[[14,4]]},"98":{"position":[[40,4]]},"102":{"position":[[14,4]]},"225":{"position":[[28,4]]},"229":{"position":[[14,4]]}},"content":{"1":{"position":[[237,4]]},"5":{"position":[[174,4]]},"127":{"position":[[20,4]]},"131":{"position":[[318,4]]},"393":{"position":[[1118,4]]},"396":{"position":[[919,4],[1232,4]]},"402":{"position":[[1077,4]]},"404":{"position":[[46,4]]},"450":{"position":[[493,4]]},"455":{"position":[[324,4]]},"470":{"position":[[76,4],[477,4]]},"496":{"position":[[121,4]]},"535":{"position":[[575,4]]},"557":{"position":[[76,4]]},"560":{"position":[[298,4]]},"595":{"position":[[602,4]]},"620":{"position":[[262,4]]},"659":{"position":[[703,4]]},"661":{"position":[[1662,4]]},"696":{"position":[[587,4]]},"700":{"position":[[552,4]]},"711":{"position":[[2104,4]]},"815":{"position":[[263,4]]},"836":{"position":[[2230,4]]},"839":{"position":[[311,4],[1189,4]]},"841":{"position":[[914,5],[1064,4]]},"842":{"position":[[3,4]]},"1152":{"position":[[46,4]]},"1192":{"position":[[163,4]]},"1198":{"position":[[1507,4]]},"1209":{"position":[[302,4]]},"1222":{"position":[[770,4]]},"1249":{"position":[[342,4]]},"1301":{"position":[[1581,4]]}},"keywords":{}}],["googl",{"_index":197,"title":{},"content":{"14":{"position":[[39,6]]},"116":{"position":[[72,7]]},"177":{"position":[[66,6]]},"301":{"position":[[661,6]]},"411":{"position":[[5638,7]]},"412":{"position":[[14680,6]]},"462":{"position":[[331,6]]},"504":{"position":[[1115,6]]},"840":{"position":[[151,7]]},"841":{"position":[[261,6],[1541,6]]}},"keywords":{}}],["google'",{"_index":1304,"title":{},"content":{"202":{"position":[[48,8]]},"247":{"position":[[70,8]]},"289":{"position":[[1015,8]]},"412":{"position":[[1058,8]]}},"keywords":{}}],["goto",{"_index":1675,"title":{},"content":{"287":{"position":[[1106,4]]}},"keywords":{}}],["gpu",{"_index":2570,"title":{},"content":{"408":{"position":[[5205,3]]}},"keywords":{}}],["gql1",{"_index":4415,"title":{},"content":{"749":{"position":[[22348,4]]}},"keywords":{}}],["gql3",{"_index":4416,"title":{},"content":{"749":{"position":[[22455,4]]}},"keywords":{}}],["gracefulli",{"_index":1782,"title":{},"content":{"300":{"position":[[781,10]]},"302":{"position":[[271,10]]},"312":{"position":[[263,10]]},"369":{"position":[[600,11]]},"375":{"position":[[763,11]]},"491":{"position":[[1448,10]]},"497":{"position":[[248,11]]},"544":{"position":[[217,10]]},"604":{"position":[[189,10]]},"632":{"position":[[509,10]]}},"keywords":{}}],["gracefully.scal",{"_index":3517,"title":{},"content":{"582":{"position":[[599,19]]}},"keywords":{}}],["grain",{"_index":970,"title":{},"content":{"75":{"position":[[78,7]]},"106":{"position":[[156,7]]},"412":{"position":[[12842,7]]},"542":{"position":[[136,7]]},"551":{"position":[[398,7]]},"563":{"position":[[978,7]]},"635":{"position":[[330,7]]}},"keywords":{}}],["grant",{"_index":4016,"title":{},"content":{"715":{"position":[[152,6]]}},"keywords":{}}],["granular",{"_index":1041,"title":{},"content":{"106":{"position":[[61,8]]},"174":{"position":[[1058,11]]},"235":{"position":[[85,8]]},"681":{"position":[[107,8]]},"860":{"position":[[952,8]]},"1206":{"position":[[280,8]]}},"keywords":{}}],["graph",{"_index":472,"title":{},"content":{"29":{"position":[[21,5]]},"396":{"position":[[358,5],[441,5],[605,5]]},"1320":{"position":[[740,5]]}},"keywords":{}}],["graphic",{"_index":2575,"title":{},"content":{"408":{"position":[[5369,8]]}},"keywords":{}}],["graphql",{"_index":242,"title":{"883":{"position":[[17,7]]},"885":{"position":[[22,7]]}},"content":{"14":{"position":[[1146,7]]},"18":{"position":[[445,7]]},"37":{"position":[[12,7],[95,7],[145,7],[207,7]]},"202":{"position":[[307,8]]},"249":{"position":[[244,7]]},"255":{"position":[[1690,8]]},"312":{"position":[[167,8]]},"381":{"position":[[328,7]]},"412":{"position":[[12997,7]]},"565":{"position":[[125,8]]},"566":{"position":[[1178,8]]},"632":{"position":[[777,8]]},"698":{"position":[[1726,7]]},"701":{"position":[[1179,7]]},"749":{"position":[[22353,7],[22460,7]]},"793":{"position":[[675,7]]},"838":{"position":[[643,7]]},"841":{"position":[[781,8]]},"884":{"position":[[20,7]]},"885":{"position":[[1402,7],[2718,7]]},"886":{"position":[[192,7],[344,7],[975,9],[1073,7],[2242,7],[2705,7],[3045,7],[3892,7],[4454,7]]},"887":{"position":[[1,7],[548,7]]},"888":{"position":[[75,7],[1000,7]]},"889":{"position":[[1092,7]]},"890":{"position":[[201,7],[1009,7]]},"1124":{"position":[[2251,8]]},"1149":{"position":[[236,7]]},"1231":{"position":[[723,9]]},"1308":{"position":[[182,7]]}},"keywords":{}}],["graphql'",{"_index":6082,"title":{},"content":{"1149":{"position":[[314,9]]}},"keywords":{}}],["graphql.check",{"_index":3723,"title":{},"content":{"644":{"position":[[154,13]]}},"keywords":{}}],["graphqlschemafromrxschema",{"_index":5166,"title":{},"content":{"889":{"position":[[846,28]]}},"keywords":{}}],["great",{"_index":555,"title":{"247":{"position":[[18,5]]},"277":{"position":[[0,5]]},"283":{"position":[[0,5]]}},"content":{"35":{"position":[[309,5]]},"61":{"position":[[502,5]]},"271":{"position":[[302,5]]},"566":{"position":[[1402,5]]},"576":{"position":[[180,5]]},"662":{"position":[[224,5]]},"704":{"position":[[106,6]]},"772":{"position":[[2049,5]]},"774":{"position":[[882,5]]},"775":{"position":[[51,5]]},"838":{"position":[[253,5]]},"1120":{"position":[[420,5]]},"1157":{"position":[[425,5]]},"1198":{"position":[[198,5]]},"1247":{"position":[[36,5]]},"1316":{"position":[[2510,5],[2582,5]]}},"keywords":{}}],["greater",{"_index":2583,"title":{},"content":{"409":{"position":[[93,7]]},"410":{"position":[[621,7]]},"751":{"position":[[109,7]]},"1076":{"position":[[69,7]]},"1294":{"position":[[315,7]]},"1296":{"position":[[298,7]]}},"keywords":{}}],["greatest",{"_index":2162,"title":{},"content":{"383":{"position":[[15,8]]}},"keywords":{}}],["greatli",{"_index":1001,"title":{},"content":{"87":{"position":[[156,7]]},"151":{"position":[[276,7]]},"353":{"position":[[778,7]]},"446":{"position":[[567,7]]}},"keywords":{}}],["grind",{"_index":2599,"title":{},"content":{"410":{"position":[[1331,5]]}},"keywords":{}}],["group",{"_index":2025,"title":{},"content":{"354":{"position":[[770,10]]},"376":{"position":[[343,8]]},"390":{"position":[[1327,6]]},"981":{"position":[[831,8]]},"1140":{"position":[[87,9]]}},"keywords":{}}],["group"",{"_index":5587,"title":{},"content":{"1009":{"position":[[230,11]]}},"keywords":{}}],["grow",{"_index":1606,"title":{},"content":{"265":{"position":[[709,6]]},"294":{"position":[[331,5]]},"369":{"position":[[551,5],[828,7]]},"382":{"position":[[242,5]]},"394":{"position":[[1525,5]]},"411":{"position":[[3738,6]]},"412":{"position":[[15121,7]]},"421":{"position":[[1079,7]]},"441":{"position":[[231,6]]},"477":{"position":[[120,6],[265,5]]},"559":{"position":[[1604,5]]},"1092":{"position":[[643,4]]}},"keywords":{}}],["grown",{"_index":2543,"title":{},"content":{"408":{"position":[[2138,6]]}},"keywords":{}}],["gt",{"_index":164,"title":{},"content":{"11":{"position":[[601,5],[653,5]]},"19":{"position":[[683,5],[697,5],[879,5]]},"50":{"position":[[177,6]]},"55":{"position":[[531,5]]},"77":{"position":[[251,4],[310,5]]},"103":{"position":[[291,4],[350,5]]},"129":{"position":[[674,6]]},"143":{"position":[[511,5],[546,5],[692,5],[731,5]]},"209":{"position":[[741,5],[1028,5]]},"210":{"position":[[576,5]]},"234":{"position":[[351,4],[410,5]]},"235":{"position":[[314,5]]},"255":{"position":[[1098,5],[1363,5]]},"261":{"position":[[937,5]]},"335":{"position":[[312,5],[415,5],[619,5]]},"392":{"position":[[2771,5],[2817,5],[3568,5],[3915,5],[4286,5],[4321,5],[4724,5],[4774,5]]},"394":{"position":[[781,5]]},"397":{"position":[[1812,5],[1858,5],[2072,5]]},"398":{"position":[[886,5],[1237,4],[1367,5],[1409,5],[1497,5],[2172,5],[2375,4],[2527,5],[2650,5]]},"403":{"position":[[913,5]]},"412":{"position":[[9825,4],[9841,4]]},"432":{"position":[[924,5]]},"458":{"position":[[866,5]]},"459":{"position":[[865,5],[901,5],[959,5]]},"480":{"position":[[854,5]]},"494":{"position":[[351,5]]},"502":{"position":[[966,4],[1094,5]]},"518":{"position":[[433,4],[561,5]]},"523":{"position":[[682,5],[738,5]]},"541":{"position":[[308,5],[428,5],[472,5],[604,5]]},"542":{"position":[[855,5]]},"555":{"position":[[182,5]]},"559":{"position":[[314,5],[426,5],[639,5],[718,5]]},"562":{"position":[[1179,5],[1326,5],[1370,5],[1475,5]]},"571":{"position":[[907,4],[1030,5],[1141,5],[1349,5]]},"580":{"position":[[425,5],[534,4],[674,5]]},"601":{"position":[[502,5],[662,5]]},"602":{"position":[[518,4]]},"610":{"position":[[974,5],[1008,5],[1143,5]]},"612":{"position":[[1272,5],[1871,5],[2023,5],[2238,5],[2426,5],[2500,5]]},"632":{"position":[[1821,5],[2408,5],[2524,5]]},"649":{"position":[[303,5],[338,4]]},"659":{"position":[[616,4]]},"662":{"position":[[2846,5]]},"672":{"position":[[135,5]]},"673":{"position":[[141,5]]},"674":{"position":[[424,5]]},"691":{"position":[[255,5],[319,5]]},"710":{"position":[[2153,5]]},"711":{"position":[[1251,5],[1537,5],[1568,5],[1605,5]]},"724":{"position":[[967,5],[1028,5]]},"739":{"position":[[503,5],[606,5]]},"740":{"position":[[612,5],[650,4]]},"747":{"position":[[213,5],[271,5],[338,5]]},"751":{"position":[[1405,5]]},"752":{"position":[[964,5],[1003,5],[1044,5]]},"753":{"position":[[328,5],[369,5]]},"759":{"position":[[944,5]]},"760":{"position":[[832,5]]},"767":{"position":[[574,5],[983,5]]},"768":{"position":[[576,5],[985,5]]},"769":{"position":[[533,5],[954,5]]},"770":{"position":[[421,5]]},"796":{"position":[[463,4],[510,4],[1379,4]]},"798":{"position":[[585,4]]},"799":{"position":[[548,5],[780,5]]},"810":{"position":[[465,6]]},"811":{"position":[[460,6]]},"812":{"position":[[307,6]]},"813":{"position":[[458,6]]},"820":{"position":[[580,4],[632,4]]},"825":{"position":[[841,6]]},"829":{"position":[[1407,5],[1472,5],[1504,5],[2477,5],[3392,5],[3551,5]]},"838":{"position":[[3060,5]]},"846":{"position":[[852,5],[1287,5]]},"848":{"position":[[215,5]]},"857":{"position":[[366,5]]},"858":{"position":[[397,5],[518,5],[527,6]]},"861":{"position":[[2359,4],[2374,4]]},"872":{"position":[[828,6],[1523,6],[2263,6],[3083,6],[3758,6]]},"875":{"position":[[312,4],[783,4],[1208,5],[2006,4],[2098,5],[2461,4],[2518,4],[3054,4],[4252,4],[4466,5],[5184,4],[5489,4],[6098,4],[7206,4],[7255,5],[7430,5],[7515,5],[8024,4],[8235,5],[8944,4],[8984,5],[9443,4],[9651,5]]},"879":{"position":[[658,5]]},"880":{"position":[[371,5]]},"881":{"position":[[381,5]]},"885":{"position":[[1496,5],[1727,5],[1751,4],[1868,4],[2058,5],[2135,4],[2256,4]]},"886":{"position":[[408,5],[1221,5],[2301,5],[3121,5],[3501,5]]},"887":{"position":[[457,5],[617,5]]},"898":{"position":[[2960,6],[3217,6],[3530,5],[3688,5],[4108,5]]},"904":{"position":[[3493,5]]},"907":{"position":[[342,5]]},"910":{"position":[[421,5],[441,5]]},"921":{"position":[[222,5]]},"939":{"position":[[289,6]]},"941":{"position":[[138,5],[286,5],[362,5],[438,5]]},"944":{"position":[[300,4]]},"945":{"position":[[195,4]]},"948":{"position":[[501,4],[770,4]]},"950":{"position":[[324,5],[460,5]]},"952":{"position":[[340,5]]},"953":{"position":[[141,5]]},"956":{"position":[[268,5],[334,5]]},"970":{"position":[[125,5]]},"971":{"position":[[450,5]]},"972":{"position":[[141,5]]},"975":{"position":[[311,5],[505,5]]},"979":{"position":[[270,5],[373,4]]},"983":{"position":[[904,4],[989,4]]},"988":{"position":[[3379,5],[4708,5],[5567,5],[5687,5],[5730,5],[5771,5]]},"990":{"position":[[1219,5],[1371,4]]},"993":{"position":[[187,5],[304,5],[449,5],[587,5],[724,5]]},"995":{"position":[[1644,5],[1954,5],[1974,4]]},"996":{"position":[[547,5]]},"1002":{"position":[[380,5]]},"1007":{"position":[[1198,4],[2196,5]]},"1009":{"position":[[1100,4]]},"1010":{"position":[[317,5]]},"1017":{"position":[[170,5],[210,4]]},"1018":{"position":[[278,5]]},"1020":{"position":[[476,5]]},"1022":{"position":[[579,5],[820,5]]},"1023":{"position":[[235,5],[489,5]]},"1024":{"position":[[321,5]]},"1033":{"position":[[597,5],[824,5]]},"1039":{"position":[[239,5],[413,5]]},"1040":{"position":[[357,5],[403,4],[485,4]]},"1042":{"position":[[138,5]]},"1044":{"position":[[410,5]]},"1045":{"position":[[271,4]]},"1046":{"position":[[162,5]]},"1048":{"position":[[561,5]]},"1049":{"position":[[138,5]]},"1055":{"position":[[230,4]]},"1057":{"position":[[164,4]]},"1058":{"position":[[280,5],[342,4],[462,4]]},"1059":{"position":[[265,4]]},"1060":{"position":[[133,4]]},"1061":{"position":[[134,4],[179,5]]},"1063":{"position":[[148,4],[203,4],[252,4],[307,4]]},"1065":{"position":[[290,5],[869,5],[1158,5],[1380,5],[1497,5]]},"1066":{"position":[[391,4]]},"1067":{"position":[[330,4],[478,4],[537,5],[1591,4],[1617,4],[2190,5]]},"1100":{"position":[[773,4]]},"1101":{"position":[[430,4],[612,4]]},"1115":{"position":[[344,5],[410,5],[480,5]]},"1117":{"position":[[465,5]]},"1139":{"position":[[362,6]]},"1140":{"position":[[691,5]]},"1145":{"position":[[351,6]]},"1150":{"position":[[460,5]]},"1164":{"position":[[1523,5]]},"1198":{"position":[[1041,3]]},"1218":{"position":[[452,5]]},"1220":{"position":[[619,4]]},"1249":{"position":[[502,4]]},"1268":{"position":[[161,5],[471,5],[542,6]]},"1290":{"position":[[128,5]]},"1294":{"position":[[1159,5],[1538,5],[1586,5]]}},"keywords":{}}],["gt(18",{"_index":5355,"title":{},"content":{"949":{"position":[[176,7]]}},"keywords":{}}],["gt;'bar",{"_index":4672,"title":{},"content":{"806":{"position":[[689,12]]}},"keywords":{}}],["gt;=0",{"_index":4367,"title":{},"content":{"749":{"position":[[17805,6]]}},"keywords":{}}],["gt;onlin",{"_index":5455,"title":{},"content":{"988":{"position":[[985,10]]}},"keywords":{}}],["gt;reproduc",{"_index":3101,"title":{},"content":{"471":{"position":[[31,13]]}},"keywords":{}}],["gt;storag",{"_index":2562,"title":{},"content":{"408":{"position":[[4035,11]]}},"keywords":{}}],["gt;valu",{"_index":3773,"title":{},"content":{"659":{"position":[[81,9]]},"835":{"position":[[23,9]]}},"keywords":{}}],["gte",{"_index":4640,"title":{},"content":{"796":{"position":[[539,5],[948,5]]}},"keywords":{}}],["guarante",{"_index":2117,"title":{},"content":{"367":{"position":[[496,12]]},"418":{"position":[[441,10]]},"445":{"position":[[759,12]]},"502":{"position":[[1197,12]]},"504":{"position":[[1191,10]]},"525":{"position":[[254,10]]},"569":{"position":[[171,10],[895,9],[1449,9]]},"699":{"position":[[949,9]]},"716":{"position":[[75,9]]},"927":{"position":[[141,9]]},"951":{"position":[[487,10]]},"1033":{"position":[[99,10]]},"1123":{"position":[[277,10]]},"1304":{"position":[[65,9],[365,10]]},"1314":{"position":[[501,9]]}},"keywords":{}}],["guarantee.onlin",{"_index":2792,"title":{},"content":{"417":{"position":[[228,16]]}},"keywords":{}}],["guards.stream",{"_index":5190,"title":{},"content":{"897":{"position":[[264,14]]}},"keywords":{}}],["guess",{"_index":4258,"title":{},"content":{"749":{"position":[[9593,7],[13939,7]]}},"keywords":{}}],["guid",{"_index":884,"title":{"423":{"position":[[59,5]]}},"content":{"61":{"position":[[60,6]]},"84":{"position":[[332,6]]},"114":{"position":[[345,6]]},"149":{"position":[[345,6]]},"175":{"position":[[338,6]]},"241":{"position":[[153,5]]},"263":{"position":[[410,6]]},"347":{"position":[[345,6]]},"362":{"position":[[1416,6]]},"373":{"position":[[153,5]]},"387":{"position":[[163,7]]},"419":{"position":[[300,7]]},"491":{"position":[[757,5],[1943,6]]},"498":{"position":[[152,5]]},"511":{"position":[[345,6]]},"531":{"position":[[345,6]]},"548":{"position":[[54,6]]},"557":{"position":[[54,6]]},"567":{"position":[[218,6]]},"591":{"position":[[345,6]]},"608":{"position":[[54,6]]},"696":{"position":[[2059,5]]},"824":{"position":[[137,5]]},"899":{"position":[[99,6]]}},"keywords":{}}],["guidecheck",{"_index":1910,"title":{},"content":{"318":{"position":[[394,10]]}},"keywords":{}}],["guidelin",{"_index":3638,"title":{},"content":{"617":{"position":[[819,10]]}},"keywords":{}}],["guild.dev/graphql/ws/docs/interfaces/client.clientopt",{"_index":5143,"title":{},"content":{"886":{"position":[[4493,57]]}},"keywords":{}}],["gun",{"_index":471,"title":{},"content":{"29":{"position":[[1,3],[205,3],[367,3]]}},"keywords":{}}],["gundb",{"_index":470,"title":{"29":{"position":[[0,6]]}},"content":{},"keywords":{}}],["guy",{"_index":3978,"title":{},"content":{"705":{"position":[[1107,3]]}},"keywords":{}}],["gzip",{"_index":5317,"title":{},"content":{"932":{"position":[[1356,7]]},"1292":{"position":[[866,6]]}},"keywords":{}}],["h1rg9ugdd30o",{"_index":5722,"title":{},"content":{"1051":{"position":[[228,15],[498,15]]}},"keywords":{}}],["hack",{"_index":3089,"title":{},"content":{"469":{"position":[[64,5],[147,5]]},"784":{"position":[[389,4]]}},"keywords":{}}],["hackernew",{"_index":3687,"title":{},"content":{"628":{"position":[[15,10]]}},"keywords":{}}],["hackernewsloc",{"_index":2860,"title":{},"content":{"422":{"position":[[29,15]]}},"keywords":{}}],["half",{"_index":2837,"title":{},"content":{"420":{"position":[[1170,4],[1319,4]]},"463":{"position":[[1203,4]]},"468":{"position":[[540,4]]}},"keywords":{}}],["halt",{"_index":2600,"title":{},"content":{"410":{"position":[[1342,5]]},"569":{"position":[[1353,6]]}},"keywords":{}}],["hand",{"_index":897,"title":{},"content":{"64":{"position":[[25,5]]},"101":{"position":[[141,5]]},"203":{"position":[[107,5]]},"227":{"position":[[196,5]]},"228":{"position":[[197,5]]},"291":{"position":[[224,6]]},"425":{"position":[[22,5]]},"458":{"position":[[395,4]]},"624":{"position":[[624,5]]},"661":{"position":[[1400,7]]},"711":{"position":[[1897,7]]},"737":{"position":[[400,4]]},"752":{"position":[[279,5]]},"1315":{"position":[[1006,4]]},"1322":{"position":[[452,4]]}},"keywords":{}}],["handi",{"_index":1963,"title":{},"content":{"336":{"position":[[372,5]]},"436":{"position":[[249,5]]},"710":{"position":[[91,5]]},"1021":{"position":[[21,5]]}},"keywords":{}}],["handl",{"_index":278,"title":{"79":{"position":[[0,8]]},"110":{"position":[[0,8]]},"121":{"position":[[14,9]]},"140":{"position":[[25,9]]},"146":{"position":[[15,9]]},"150":{"position":[[68,8]]},"156":{"position":[[14,9]]},"168":{"position":[[25,9]]},"182":{"position":[[14,9]]},"196":{"position":[[25,9]]},"203":{"position":[[21,9]]},"240":{"position":[[0,8]]},"302":{"position":[[0,8]]},"312":{"position":[[29,9]]},"326":{"position":[[14,9]]},"344":{"position":[[25,9]]},"509":{"position":[[25,9]]},"515":{"position":[[14,9]]},"529":{"position":[[25,9]]},"635":{"position":[[9,9]]},"715":{"position":[[9,9]]},"740":{"position":[[0,6]]},"847":{"position":[[9,9]]},"855":{"position":[[0,8]]},"867":{"position":[[0,8]]},"987":{"position":[[9,9]]},"990":{"position":[[6,9]]},"1111":{"position":[[9,9]]}},"content":{"16":{"position":[[423,9]]},"24":{"position":[[412,8]]},"28":{"position":[[82,7]]},"35":{"position":[[423,9]]},"39":{"position":[[674,8]]},"40":{"position":[[159,6],[531,6]]},"46":{"position":[[654,8]]},"47":{"position":[[885,8]]},"64":{"position":[[114,6]]},"78":{"position":[[53,8]]},"79":{"position":[[36,8]]},"80":{"position":[[61,7]]},"95":{"position":[[63,8]]},"96":{"position":[[241,6]]},"100":{"position":[[36,6]]},"104":{"position":[[114,8]]},"110":{"position":[[16,8],[120,6]]},"117":{"position":[[147,8]]},"120":{"position":[[196,9],[347,9]]},"121":{"position":[[53,9]]},"123":{"position":[[194,7]]},"129":{"position":[[104,8]]},"130":{"position":[[92,6]]},"134":{"position":[[151,6]]},"135":{"position":[[221,7]]},"140":{"position":[[299,8]]},"143":{"position":[[45,8]]},"145":{"position":[[189,6]]},"146":{"position":[[53,9],[237,8]]},"147":{"position":[[135,8]]},"148":{"position":[[87,9]]},"155":{"position":[[113,8]]},"156":{"position":[[59,9]]},"158":{"position":[[115,6]]},"161":{"position":[[218,8]]},"165":{"position":[[222,6]]},"168":{"position":[[38,8]]},"170":{"position":[[193,9]]},"174":{"position":[[2099,8]]},"181":{"position":[[275,8]]},"182":{"position":[[55,9]]},"186":{"position":[[296,9]]},"196":{"position":[[146,8]]},"198":{"position":[[164,8]]},"206":{"position":[[154,6]]},"212":{"position":[[284,6]]},"240":{"position":[[78,8],[185,8]]},"267":{"position":[[525,6],[969,6]]},"274":{"position":[[270,7]]},"280":{"position":[[327,7]]},"287":{"position":[[761,6]]},"289":{"position":[[178,7]]},"300":{"position":[[759,6]]},"301":{"position":[[17,6]]},"302":{"position":[[257,8],[1095,6]]},"305":{"position":[[439,6]]},"306":{"position":[[86,9]]},"310":{"position":[[43,8]]},"312":{"position":[[245,7]]},"317":{"position":[[62,6]]},"320":{"position":[[58,9],[209,8]]},"322":{"position":[[126,8]]},"323":{"position":[[15,9]]},"334":{"position":[[542,8]]},"339":{"position":[[72,8]]},"343":{"position":[[100,7]]},"350":{"position":[[320,6]]},"353":{"position":[[137,9]]},"354":{"position":[[735,6],[1145,9]]},"358":{"position":[[888,8]]},"360":{"position":[[107,6]]},"369":{"position":[[664,6]]},"371":{"position":[[92,8]]},"375":{"position":[[730,6]]},"376":{"position":[[553,6]]},"378":{"position":[[176,9]]},"386":{"position":[[51,8]]},"388":{"position":[[492,6]]},"390":{"position":[[879,6]]},"400":{"position":[[412,6]]},"408":{"position":[[1689,7],[5512,6]]},"411":{"position":[[218,6],[592,6],[1359,6]]},"412":{"position":[[976,6],[4111,8],[7481,6],[11578,8],[11620,6],[12629,8],[13547,9],[14030,8],[14866,8]]},"416":{"position":[[58,8]]},"420":{"position":[[814,6]]},"426":{"position":[[33,8]]},"429":{"position":[[181,8]]},"430":{"position":[[649,8]]},"432":{"position":[[360,6],[1379,7]]},"444":{"position":[[63,6]]},"445":{"position":[[1351,8]]},"446":{"position":[[879,6],[1022,6]]},"454":{"position":[[1020,6]]},"464":{"position":[[1156,6]]},"473":{"position":[[213,8]]},"478":{"position":[[103,6]]},"481":{"position":[[245,6],[452,7]]},"483":{"position":[[475,9],[652,8]]},"486":{"position":[[141,7]]},"487":{"position":[[168,8],[277,9]]},"491":{"position":[[809,8],[1072,7],[1102,8]]},"495":{"position":[[251,6]]},"497":{"position":[[215,6]]},"506":{"position":[[171,8]]},"513":{"position":[[285,9]]},"515":{"position":[[66,9]]},"520":{"position":[[483,8]]},"526":{"position":[[53,8]]},"529":{"position":[[151,8]]},"530":{"position":[[370,9]]},"535":{"position":[[950,7]]},"544":{"position":[[195,6]]},"556":{"position":[[17,8]]},"559":{"position":[[1408,6]]},"566":{"position":[[933,6]]},"567":{"position":[[280,8]]},"574":{"position":[[509,9]]},"576":{"position":[[376,8]]},"579":{"position":[[550,8]]},"582":{"position":[[574,6]]},"586":{"position":[[18,8]]},"595":{"position":[[1025,7]]},"604":{"position":[[167,6]]},"611":{"position":[[1346,7]]},"612":{"position":[[1212,8]]},"617":{"position":[[1076,6]]},"623":{"position":[[689,8]]},"632":{"position":[[436,6],[468,8]]},"634":{"position":[[498,8]]},"635":{"position":[[456,8]]},"638":{"position":[[36,6]]},"643":{"position":[[269,6]]},"644":{"position":[[190,8]]},"688":{"position":[[196,8]]},"697":{"position":[[375,6]]},"698":{"position":[[2214,6]]},"700":{"position":[[564,6]]},"701":{"position":[[273,8],[521,8]]},"703":{"position":[[467,8]]},"711":{"position":[[1476,8]]},"714":{"position":[[6,7]]},"723":{"position":[[226,6]]},"740":{"position":[[327,6]]},"752":{"position":[[1236,8],[1261,7]]},"779":{"position":[[71,6]]},"800":{"position":[[153,8]]},"801":{"position":[[475,6]]},"802":{"position":[[834,8]]},"829":{"position":[[2126,6]]},"836":{"position":[[2049,8]]},"841":{"position":[[1121,8]]},"844":{"position":[[87,8],[118,7]]},"847":{"position":[[157,8]]},"860":{"position":[[266,9],[737,9],[821,6],[923,6]]},"861":{"position":[[1633,8]]},"863":{"position":[[598,8]]},"870":{"position":[[179,7]]},"886":{"position":[[1292,7]]},"896":{"position":[[281,7]]},"903":{"position":[[512,7]]},"908":{"position":[[17,8],[401,8]]},"913":{"position":[[124,8]]},"943":{"position":[[268,8]]},"962":{"position":[[169,6]]},"981":{"position":[[420,8],[1232,8]]},"990":{"position":[[296,6],[490,8],[1010,6]]},"1007":{"position":[[660,7]]},"1009":{"position":[[424,9]]},"1022":{"position":[[331,6]]},"1031":{"position":[[177,6]]},"1057":{"position":[[309,8],[401,7]]},"1089":{"position":[[148,6]]},"1094":{"position":[[366,6]]},"1111":{"position":[[15,6]]},"1120":{"position":[[169,7],[213,7]]},"1147":{"position":[[360,9]]},"1198":{"position":[[1972,9]]},"1200":{"position":[[53,8]]},"1207":{"position":[[781,7]]},"1258":{"position":[[77,8]]},"1299":{"position":[[24,8]]},"1304":{"position":[[690,8]]},"1307":{"position":[[512,6],[587,8],[831,6]]},"1313":{"position":[[1084,6]]},"1318":{"position":[[171,8]]}},"keywords":{}}],["handler",{"_index":1309,"title":{"690":{"position":[[24,9]]},"691":{"position":[[48,8]]},"1030":{"position":[[9,8]]},"1031":{"position":[[9,8]]},"1032":{"position":[[43,8]]},"1104":{"position":[[5,8]]},"1309":{"position":[[16,8]]}},"content":{"203":{"position":[[207,9]]},"209":{"position":[[719,8],[985,8]]},"255":{"position":[[1071,8],[1320,8],[1631,7]]},"392":{"position":[[1924,7],[2749,8],[3031,7],[4702,8]]},"397":{"position":[[1379,7],[1790,8]]},"403":{"position":[[460,8],[661,7]]},"412":{"position":[[4871,7],[5349,7]]},"463":{"position":[[1041,8]]},"612":{"position":[[881,8]]},"632":{"position":[[2365,8],[2502,8]]},"635":{"position":[[302,8]]},"680":{"position":[[249,8]]},"688":{"position":[[231,8],[267,8],[713,8]]},"690":{"position":[[14,8],[570,8]]},"691":{"position":[[158,7]]},"740":{"position":[[406,8]]},"749":{"position":[[733,7],[870,7],[15493,7],[15759,7],[15897,7],[22932,7]]},"784":{"position":[[155,7]]},"848":{"position":[[1136,7]]},"875":{"position":[[1353,8],[2906,8],[2985,7],[5984,8],[6555,7],[7768,8]]},"888":{"position":[[674,9]]},"889":{"position":[[1003,8]]},"904":{"position":[[1566,7],[2302,7],[2381,7],[2476,8]]},"906":{"position":[[275,8],[838,7]]},"908":{"position":[[205,7],[279,7]]},"934":{"position":[[796,7]]},"983":{"position":[[43,8]]},"986":{"position":[[644,8]]},"987":{"position":[[561,7],[765,7],[1009,7],[1126,8]]},"988":{"position":[[2405,7],[2974,7],[3071,8],[3504,7],[4241,8]]},"993":{"position":[[395,9]]},"1002":{"position":[[676,8],[1330,8]]},"1010":{"position":[[193,7],[254,7]]},"1020":{"position":[[263,7],[454,8]]},"1022":{"position":[[557,8]]},"1023":{"position":[[213,8]]},"1024":{"position":[[299,8]]},"1030":{"position":[[106,7]]},"1031":{"position":[[10,8],[73,7],[201,7]]},"1032":{"position":[[43,8],[170,8]]},"1033":{"position":[[395,8],[575,8],[806,8]]},"1104":{"position":[[268,7]]},"1111":{"position":[[46,7]]},"1117":{"position":[[118,8]]},"1149":{"position":[[438,7]]},"1175":{"position":[[402,7],[554,8]]},"1309":{"position":[[12,7],[151,7],[382,7],[795,7],[976,7],[1080,7],[1252,8]]}},"keywords":{}}],["handler'",{"_index":5654,"title":{},"content":{"1031":{"position":[[124,9]]}},"keywords":{}}],["handler(changeddoc",{"_index":5571,"title":{},"content":{"1007":{"position":[[1640,20]]}},"keywords":{}}],["handler(changerow",{"_index":5036,"title":{},"content":{"875":{"position":[[6192,20]]}},"keywords":{}}],["handler(checkpoint",{"_index":5569,"title":{},"content":{"1007":{"position":[[1476,19]]}},"keywords":{}}],["handler(checkpointornul",{"_index":5006,"title":{},"content":{"875":{"position":[[3148,25]]}},"keywords":{}}],["handler(doc",{"_index":5461,"title":{},"content":{"988":{"position":[[2422,13]]}},"keywords":{}}],["handler(lastcheckpoint",{"_index":5463,"title":{},"content":{"988":{"position":[[3521,23]]}},"keywords":{}}],["handler.avoid",{"_index":5666,"title":{},"content":{"1033":{"position":[[970,13]]}},"keywords":{}}],["happen",{"_index":455,"title":{},"content":{"28":{"position":[[297,7]]},"129":{"position":[[494,9]]},"201":{"position":[[301,6]]},"205":{"position":[[356,6]]},"366":{"position":[[469,7]]},"376":{"position":[[110,6]]},"407":{"position":[[244,7]]},"410":{"position":[[372,6]]},"412":{"position":[[3020,6],[7493,7]]},"415":{"position":[[38,6]]},"421":{"position":[[511,9]]},"464":{"position":[[104,6],[210,9]]},"474":{"position":[[143,6]]},"491":{"position":[[424,6]]},"626":{"position":[[83,8]]},"630":{"position":[[565,6]]},"632":{"position":[[1935,6]]},"698":{"position":[[1101,7],[2246,6]]},"740":{"position":[[27,6],[81,6]]},"745":{"position":[[186,7]]},"749":{"position":[[3342,7],[5916,7],[11950,7],[12050,7],[16713,7],[24394,6]]},"752":{"position":[[41,7]]},"778":{"position":[[376,7]]},"785":{"position":[[68,6]]},"817":{"position":[[90,6]]},"875":{"position":[[1434,8]]},"885":{"position":[[212,8]]},"932":{"position":[[515,7]]},"985":{"position":[[477,6]]},"987":{"position":[[116,6]]},"988":{"position":[[5918,8]]},"990":{"position":[[116,7]]},"993":{"position":[[354,6]]},"1031":{"position":[[289,7]]},"1048":{"position":[[269,7]]},"1072":{"position":[[782,6]]},"1090":{"position":[[1154,7]]},"1115":{"position":[[27,6],[904,9]]},"1116":{"position":[[220,6]]},"1120":{"position":[[655,6]]},"1162":{"position":[[161,6]]},"1174":{"position":[[241,6]]},"1181":{"position":[[227,6]]},"1299":{"position":[[212,6]]},"1300":{"position":[[214,10],[1070,6]]},"1301":{"position":[[1570,8]]},"1304":{"position":[[284,6]]},"1307":{"position":[[22,6],[153,6],[254,6],[667,7]]},"1315":{"position":[[1244,8],[1371,6],[1629,8]]},"1316":{"position":[[171,8],[1655,8]]},"1318":{"position":[[817,7]]}},"keywords":{}}],["happen.conflict",{"_index":3165,"title":{},"content":{"491":{"position":[[385,15]]}},"keywords":{}}],["happier",{"_index":1644,"title":{},"content":{"277":{"position":[[320,7]]},"411":{"position":[[5463,7]]}},"keywords":{}}],["haproxi",{"_index":4848,"title":{},"content":{"849":{"position":[[637,8]]}},"keywords":{}}],["har",{"_index":992,"title":{},"content":{"83":{"position":[[343,7]]},"87":{"position":[[43,7]]},"175":{"position":[[510,7]]},"285":{"position":[[126,10]]},"370":{"position":[[123,7]]},"432":{"position":[[957,7]]},"433":{"position":[[568,7]]},"445":{"position":[[2022,7]]},"500":{"position":[[557,10]]},"530":{"position":[[315,7]]}},"keywords":{}}],["hard",{"_index":254,"title":{},"content":{"15":{"position":[[253,4]]},"19":{"position":[[459,4]]},"29":{"position":[[333,4]]},"452":{"position":[[181,4]]},"455":{"position":[[464,4]]},"569":{"position":[[403,4]]},"595":{"position":[[805,4]]},"619":{"position":[[117,4]]},"689":{"position":[[385,4]]},"696":{"position":[[1745,4]]},"702":{"position":[[280,4]]},"709":{"position":[[466,4]]},"780":{"position":[[484,4]]},"785":{"position":[[9,5]]},"861":{"position":[[1593,4]]},"898":{"position":[[445,4]]},"1085":{"position":[[289,4],[3156,4]]},"1120":{"position":[[350,4]]},"1124":{"position":[[852,4]]},"1198":{"position":[[1129,4]]},"1305":{"position":[[301,4]]},"1316":{"position":[[345,4]]},"1317":{"position":[[794,5]]}},"keywords":{}}],["hardcod",{"_index":3349,"title":{},"content":{"554":{"position":[[1177,8]]},"556":{"position":[[32,10]]}},"keywords":{}}],["harder",{"_index":2673,"title":{},"content":{"412":{"position":[[2812,6],[13742,6]]},"417":{"position":[[218,6]]},"1319":{"position":[[658,6]]}},"keywords":{}}],["hardest",{"_index":2655,"title":{},"content":{"412":{"position":[[565,7]]}},"keywords":{}}],["hardi",{"_index":6028,"title":{},"content":{"1132":{"position":[[791,5]]}},"keywords":{}}],["hardwar",{"_index":2284,"title":{},"content":{"392":{"position":[[4907,8]]},"399":{"position":[[66,8],[160,8]]},"412":{"position":[[9788,9]]},"1091":{"position":[[50,8]]}},"keywords":{}}],["hardwhi",{"_index":6301,"title":{},"content":{"1260":{"position":[[33,7]]}},"keywords":{}}],["harmoni",{"_index":3221,"title":{},"content":{"501":{"position":[[330,12]]}},"keywords":{}}],["hash",{"_index":2334,"title":{},"content":{"396":{"position":[[115,7],[134,6],[1838,7]]},"412":{"position":[[3341,7]]},"698":{"position":[[609,6]]},"731":{"position":[[245,4]]},"927":{"position":[[5,4]]},"968":{"position":[[69,8],[102,4],[209,4],[234,4],[329,4]]}},"keywords":{}}],["hashfunct",{"_index":5399,"title":{"968":{"position":[[0,13]]}},"content":{"968":{"position":[[526,13]]}},"keywords":{}}],["hasn't",{"_index":2703,"title":{},"content":{"412":{"position":[[5936,6],[7924,6]]}},"keywords":{}}],["hassl",{"_index":3218,"title":{},"content":{"500":{"position":[[429,6]]}},"keywords":{}}],["have",{"_index":382,"title":{},"content":{"23":{"position":[[137,6],[238,6],[365,6]]},"27":{"position":[[97,6]]},"29":{"position":[[43,6]]},"65":{"position":[[801,6]]},"270":{"position":[[217,6]]},"364":{"position":[[718,6]]},"367":{"position":[[132,6]]},"402":{"position":[[2580,6]]},"404":{"position":[[749,6]]},"412":{"position":[[12731,6]]},"455":{"position":[[371,6]]},"457":{"position":[[557,6]]},"459":{"position":[[1030,6]]},"469":{"position":[[801,6]]},"696":{"position":[[368,6]]},"705":{"position":[[520,6]]},"710":{"position":[[1155,6]]},"723":{"position":[[938,6]]},"749":{"position":[[21575,6]]},"799":{"position":[[1,6]]},"800":{"position":[[351,6]]},"817":{"position":[[305,6]]},"875":{"position":[[9177,6]]},"943":{"position":[[202,6]]},"965":{"position":[[38,6]]},"966":{"position":[[415,6]]},"981":{"position":[[1467,6]]},"1068":{"position":[[219,6]]},"1147":{"position":[[1,6]]},"1211":{"position":[[457,6]]},"1219":{"position":[[204,6]]},"1246":{"position":[[1549,6]]},"1247":{"position":[[324,6],[497,6],[684,6]]},"1252":{"position":[[235,6]]},"1282":{"position":[[301,6]]},"1300":{"position":[[144,6]]},"1301":{"position":[[855,6]]},"1304":{"position":[[1655,6]]},"1305":{"position":[[39,6]]},"1316":{"position":[[3693,6]]}},"keywords":{}}],["haven't",{"_index":3186,"title":{},"content":{"495":{"position":[[318,7]]},"663":{"position":[[8,7]]},"776":{"position":[[42,7]]},"842":{"position":[[139,7]]},"898":{"position":[[523,7]]}},"keywords":{}}],["haven’t",{"_index":1857,"title":{},"content":{"303":{"position":[[1465,7]]}},"keywords":{}}],["hbase",{"_index":6583,"title":{},"content":{"1324":{"position":[[932,6]]}},"keywords":{}}],["headach",{"_index":2658,"title":{},"content":{"412":{"position":[[767,9],[11947,8]]}},"keywords":{}}],["header",{"_index":2912,"title":{},"content":{"434":{"position":[[283,7]]},"461":{"position":[[325,7],[387,6]]},"612":{"position":[[1479,6]]},"616":{"position":[[1110,8]]},"848":{"position":[[68,6],[162,6],[345,7],[455,7]]},"875":{"position":[[6289,8]]},"876":{"position":[[267,7]]},"878":{"position":[[486,8]]},"880":{"position":[[161,7],[255,7]]},"882":{"position":[[173,7]]},"885":{"position":[[1219,7],[1295,7],[1369,9]]},"886":{"position":[[1773,7],[1837,8],[3134,8],[3367,7],[3491,9],[3556,8],[3587,9],[3711,7],[4102,8],[4286,7],[4736,7],[4821,7]]},"887":{"position":[[361,8]]},"888":{"position":[[502,8]]},"889":{"position":[[551,8]]},"890":{"position":[[256,7]]},"988":{"position":[[2584,8]]},"1102":{"position":[[557,8],[996,7]]},"1104":{"position":[[132,7],[291,7],[709,6]]}},"keywords":{}}],["healthpoint",{"_index":3227,"title":{},"content":{"502":{"position":[[950,13]]},"518":{"position":[[417,13]]},"571":{"position":[[891,13]]},"579":{"position":[[739,13]]},"580":{"position":[[518,13]]},"1074":{"position":[[311,12]]}},"keywords":{}}],["hear",{"_index":3447,"title":{},"content":{"569":{"position":[[36,4]]},"1249":{"position":[[84,4]]}},"keywords":{}}],["heart",{"_index":1677,"title":{},"content":{"289":{"position":[[8,5]]},"489":{"position":[[25,5]]},"501":{"position":[[8,5]]}},"keywords":{}}],["heartbeat",{"_index":3579,"title":{},"content":{"611":{"position":[[1195,9]]},"846":{"position":[[877,9],[1056,10]]}},"keywords":{}}],["heatmap",{"_index":4086,"title":{},"content":{"736":{"position":[[121,9]]}},"keywords":{}}],["heavi",{"_index":1315,"title":{"204":{"position":[[30,5]]}},"content":{"251":{"position":[[220,5]]},"262":{"position":[[163,6]]},"354":{"position":[[111,5]]},"362":{"position":[[266,5]]},"408":{"position":[[135,5],[3700,5]]},"412":{"position":[[10174,5],[10791,5],[14072,5]]},"446":{"position":[[1033,5]]},"451":{"position":[[643,5]]},"460":{"position":[[14,5]]},"497":{"position":[[348,5]]},"642":{"position":[[141,5]]},"704":{"position":[[491,5]]},"801":{"position":[[277,5]]},"841":{"position":[[1074,5]]},"1069":{"position":[[48,5]]},"1092":{"position":[[401,5]]},"1316":{"position":[[2747,5]]}},"keywords":{}}],["heavier",{"_index":6098,"title":{},"content":{"1157":{"position":[[361,7]]}},"keywords":{}}],["heavili",{"_index":1395,"title":{},"content":{"216":{"position":[[287,7]]},"354":{"position":[[1078,7]]},"411":{"position":[[5667,7]]},"430":{"position":[[215,7]]},"446":{"position":[[75,7]]},"821":{"position":[[350,7],[607,7]]},"839":{"position":[[857,7]]},"875":{"position":[[7635,7]]}},"keywords":{}}],["height",{"_index":6493,"title":{},"content":{"1305":{"position":[[594,7]]}},"keywords":{}}],["heighten",{"_index":3242,"title":{},"content":{"507":{"position":[[184,10]]}},"keywords":{}}],["hello",{"_index":3608,"title":{},"content":{"612":{"position":[[2306,6]]}},"keywords":{}}],["help",{"_index":1147,"title":{"669":{"position":[[8,5]]},"796":{"position":[[0,4]]}},"content":{"146":{"position":[[149,4]]},"175":{"position":[[111,8]]},"178":{"position":[[223,5]]},"303":{"position":[[399,7]]},"304":{"position":[[379,7]]},"316":{"position":[[503,5]]},"328":{"position":[[231,4]]},"360":{"position":[[784,5]]},"369":{"position":[[1126,4]]},"382":{"position":[[315,4]]},"385":{"position":[[294,5]]},"390":{"position":[[1888,4]]},"397":{"position":[[266,5]]},"418":{"position":[[27,7]]},"420":{"position":[[1012,4]]},"495":{"position":[[485,4]]},"550":{"position":[[353,4]]},"556":{"position":[[1420,4]]},"669":{"position":[[13,4]]},"670":{"position":[[147,4],[402,4]]},"776":{"position":[[190,4]]},"834":{"position":[[143,7]]},"838":{"position":[[1011,5]]},"906":{"position":[[123,5]]},"1003":{"position":[[74,5]]},"1058":{"position":[[90,7]]},"1151":{"position":[[447,4]]},"1178":{"position":[[446,4]]},"1268":{"position":[[215,7]]}},"keywords":{}}],["helper",{"_index":3923,"title":{},"content":{"693":{"position":[[308,6]]},"711":{"position":[[2340,7]]},"848":{"position":[[1069,6]]},"889":{"position":[[792,6],[829,6]]},"1219":{"position":[[36,6]]},"1274":{"position":[[561,6]]},"1279":{"position":[[948,6]]},"1296":{"position":[[576,6]]}},"keywords":{}}],["henc",{"_index":3463,"title":{},"content":{"569":{"position":[[862,6]]}},"keywords":{}}],["here",{"_index":193,"title":{},"content":{"13":{"position":[[307,4]]},"60":{"position":[[1,4]]},"98":{"position":[[141,4]]},"188":{"position":[[1749,4]]},"210":{"position":[[625,5]]},"225":{"position":[[102,4]]},"314":{"position":[[658,4]]},"388":{"position":[[23,4]]},"394":{"position":[[1339,5]]},"398":{"position":[[432,4]]},"412":{"position":[[4362,4]]},"461":{"position":[[203,5],[781,5],[1379,5],[1614,5]]},"463":{"position":[[539,4],[775,4],[988,4]]},"464":{"position":[[427,4]]},"465":{"position":[[288,4]]},"466":{"position":[[252,4]]},"467":{"position":[[247,4]]},"469":{"position":[[153,5],[1276,4]]},"496":{"position":[[873,5]]},"498":{"position":[[59,4]]},"534":{"position":[[120,4]]},"547":{"position":[[1,4]]},"567":{"position":[[135,4]]},"590":{"position":[[1,4]]},"594":{"position":[[118,4]]},"607":{"position":[[1,4]]},"620":{"position":[[383,4]]},"664":{"position":[[57,4]]},"729":{"position":[[324,5]]},"739":{"position":[[18,4]]},"765":{"position":[[91,4]]},"772":{"position":[[2512,4]]},"791":{"position":[[219,4]]},"796":{"position":[[1170,4]]},"805":{"position":[[263,4]]},"806":{"position":[[179,5],[417,5]]},"813":{"position":[[244,5]]},"820":{"position":[[504,4]]},"826":{"position":[[266,4]]},"829":{"position":[[803,4]]},"831":{"position":[[434,5]]},"847":{"position":[[166,5]]},"848":{"position":[[829,5],[1464,5]]},"849":{"position":[[334,6]]},"868":{"position":[[116,4]]},"875":{"position":[[1621,4],[7029,4]]},"886":{"position":[[2133,5]]},"898":{"position":[[780,4]]},"904":{"position":[[77,4],[376,4],[2353,4]]},"906":{"position":[[740,4]]},"908":{"position":[[410,4]]},"912":{"position":[[771,5]]},"932":{"position":[[1332,5]]},"936":{"position":[[162,5]]},"963":{"position":[[203,5]]},"988":{"position":[[1848,5],[4934,4]]},"1002":{"position":[[836,4]]},"1020":{"position":[[490,4]]},"1065":{"position":[[1,4]]},"1085":{"position":[[1498,4]]},"1097":{"position":[[810,4]]},"1108":{"position":[[472,4]]},"1137":{"position":[[1,4]]},"1147":{"position":[[80,4]]},"1154":{"position":[[528,4]]},"1163":{"position":[[175,4]]},"1182":{"position":[[175,4]]},"1191":{"position":[[534,4]]},"1194":{"position":[[1,4],[439,4],[613,4],[713,4],[807,4],[1009,4]]},"1202":{"position":[[363,5]]},"1209":{"position":[[404,4]]},"1220":{"position":[[305,4]]},"1222":{"position":[[283,4]]},"1225":{"position":[[385,4]]},"1226":{"position":[[466,5]]},"1236":{"position":[[47,4]]},"1237":{"position":[[98,4]]},"1238":{"position":[[134,4]]},"1239":{"position":[[1,4]]},"1263":{"position":[[279,4]]},"1264":{"position":[[369,5]]},"1266":{"position":[[72,4]]},"1271":{"position":[[1243,4]]},"1297":{"position":[[394,5]]},"1299":{"position":[[186,4]]},"1304":{"position":[[1227,5]]},"1308":{"position":[[685,5]]}},"keywords":{}}],["here'",{"_index":1033,"title":{},"content":{"102":{"position":[[86,6]]},"393":{"position":[[808,6]]},"397":{"position":[[355,6]]},"412":{"position":[[346,6]]},"426":{"position":[[251,6]]},"541":{"position":[[94,6]]},"601":{"position":[[1,6]]},"612":{"position":[[1043,6],[1673,6]]},"1292":{"position":[[828,6]]}},"keywords":{}}],["here.ther",{"_index":4718,"title":{},"content":{"824":{"position":[[83,10]]}},"keywords":{}}],["hero",{"_index":768,"title":{},"content":{"51":{"position":[[283,5],[336,4],[849,7]]},"52":{"position":[[327,6]]},"54":{"position":[[239,4],[247,7]]},"55":{"position":[[1161,4]]},"130":{"position":[[584,4],[592,7]]},"188":{"position":[[1200,7]]},"334":{"position":[[581,5],[606,5]]},"335":{"position":[[127,6],[240,4],[377,4],[576,4],[862,4],[904,4],[960,6]]},"538":{"position":[[584,5],[637,4],[872,7]]},"539":{"position":[[327,6]]},"541":{"position":[[259,8]]},"542":{"position":[[787,6]]},"562":{"position":[[292,5],[500,7],[1130,8]]},"579":{"position":[[589,5],[614,5]]},"580":{"position":[[380,6]]},"598":{"position":[[591,5],[644,4],[879,7]]},"599":{"position":[[354,6]]},"601":{"position":[[452,6]]},"789":{"position":[[151,6],[194,7],[398,6],[441,7],[561,8]]},"791":{"position":[[7,6],[50,7],[266,6],[309,7]]},"792":{"position":[[134,6],[177,7]]},"829":{"position":[[747,7],[2394,9],[2619,7],[3310,9]]},"939":{"position":[[176,7]]},"979":{"position":[[336,7]]},"1074":{"position":[[36,4]]},"1075":{"position":[[35,7],[112,6]]},"1311":{"position":[[996,7],[1459,5]]}},"keywords":{}}],["hero"",{"_index":5817,"title":{},"content":{"1074":{"position":[[796,11]]}},"keywords":{}}],["hero.allow",{"_index":5811,"title":{},"content":{"1074":{"position":[[618,11]]}},"keywords":{}}],["hero.healthpoint",{"_index":3508,"title":{},"content":{"580":{"position":[[854,17]]}},"keywords":{}}],["hero.nam",{"_index":823,"title":{},"content":{"54":{"position":[[276,9]]},"55":{"position":[[1197,9]]},"562":{"position":[[1508,11]]},"580":{"position":[[832,9]]},"601":{"position":[[234,9]]},"602":{"position":[[621,9]]}},"keywords":{}}],["hero.point",{"_index":1951,"title":{},"content":{"335":{"position":[[510,14]]}},"keywords":{}}],["hero.pow",{"_index":3318,"title":{},"content":{"541":{"position":[[680,12]]},"562":{"position":[[1529,12]]},"601":{"position":[[267,10]]},"602":{"position":[[654,10]]}},"keywords":{}}],["hero.scream('aah",{"_index":6520,"title":{},"content":{"1311":{"position":[[1654,20]]}},"keywords":{}}],["herocollect",{"_index":6507,"title":{},"content":{"1311":{"position":[[874,15],[1176,15]]}},"keywords":{}}],["herocollectionmethod",{"_index":6505,"title":{},"content":{"1311":{"position":[[785,22],[808,21],[1060,21]]}},"keywords":{}}],["herocount",{"_index":4757,"title":{},"content":{"829":{"position":[[2462,9]]}},"keywords":{}}],["herodb",{"_index":3426,"title":{},"content":{"562":{"position":[[192,9]]}},"keywords":{}}],["herodb_sign",{"_index":3433,"title":{},"content":{"563":{"position":[[504,17]]}},"keywords":{}}],["herodocmethod",{"_index":6500,"title":{},"content":{"1311":{"position":[[627,15],[643,14],[1035,15]]}},"keywords":{}}],["herodoctyp",{"_index":6513,"title":{},"content":{"1311":{"position":[[1241,12]]}},"keywords":{}}],["herodocu",{"_index":6502,"title":{},"content":{"1311":{"position":[[685,13],[1277,12],[1465,12]]}},"keywords":{}}],["heroes"",{"_index":3505,"title":{},"content":{"580":{"position":[[787,12]]},"601":{"position":[[175,12]]}},"keywords":{}}],["heroes.findone().exec",{"_index":4605,"title":{},"content":{"791":{"position":[[154,24],[474,24]]},"792":{"position":[[285,24]]}},"keywords":{}}],["heroes.foreach((hero",{"_index":1947,"title":{},"content":{"335":{"position":[[393,21]]}},"keywords":{}}],["heroes.insert",{"_index":4607,"title":{},"content":{"791":{"position":[[419,15]]}},"keywords":{}}],["heroes.map(hero",{"_index":3315,"title":{},"content":{"541":{"position":[[587,16]]},"542":{"position":[[838,16]]},"562":{"position":[[1458,16]]}},"keywords":{}}],["heroes.valu",{"_index":3499,"title":{},"content":{"580":{"position":[[682,12]]},"601":{"position":[[670,12]]}},"keywords":{}}],["heroes;">",{"_index":1100,"title":{},"content":{"130":{"position":[[611,17]]}},"keywords":{}}],["heroesdb",{"_index":779,"title":{},"content":{"51":{"position":[[724,11]]},"334":{"position":[[358,11]]},"522":{"position":[[439,11]]},"538":{"position":[[454,11]]},"579":{"position":[[367,11]]},"598":{"position":[[461,11]]},"653":{"position":[[278,11]]},"680":{"position":[[699,11]]},"960":{"position":[[307,11]]},"966":{"position":[[562,11],[680,11]]},"967":{"position":[[147,11],[265,11]]},"1085":{"position":[[3781,10]]},"1114":{"position":[[736,11]]},"1121":{"position":[[476,11]]}},"keywords":{}}],["heroesreactdb",{"_index":4745,"title":{},"content":{"829":{"position":[[664,16]]}},"keywords":{}}],["heroessign",{"_index":850,"title":{},"content":{"55":{"position":[[1083,12]]},"563":{"position":[[705,12],[786,14]]},"602":{"position":[[225,12],[367,14]]}},"keywords":{}}],["heroessignal()">",{"_index":852,"title":{},"content":{"55":{"position":[[1169,24]]}},"keywords":{}}],["heroessignal.valu",{"_index":3544,"title":{},"content":{"602":{"position":[[470,18]]}},"keywords":{}}],["heroessignal.value"",{"_index":3545,"title":{},"content":{"602":{"position":[[550,24]]}},"keywords":{}}],["heroinputpushrowt0assumedmasterstatet0",{"_index":5085,"title":{},"content":{"885":{"position":[[957,38]]}},"keywords":{}}],["heroinputpushrowt0newdocumentstatet0",{"_index":5086,"title":{},"content":{"885":{"position":[[1014,37]]}},"keywords":{}}],["herolist",{"_index":3306,"title":{},"content":{"541":{"position":[[226,10]]},"542":{"position":[[754,10]]},"562":{"position":[[1097,10],[1590,9]]},"829":{"position":[[3378,8]]}},"keywords":{}}],["herolist').append",{"_index":1948,"title":{},"content":{"335":{"position":[[423,23]]}},"keywords":{}}],["herolist').empti",{"_index":1945,"title":{},"content":{"335":{"position":[[338,23]]}},"keywords":{}}],["herolist.vu",{"_index":3491,"title":{},"content":{"580":{"position":[[265,12]]}},"keywords":{}}],["heronam",{"_index":1953,"title":{},"content":{"335":{"position":[[633,8],[779,9]]}},"keywords":{}}],["heroname').v",{"_index":1954,"title":{},"content":{"335":{"position":[[644,21]]}},"keywords":{}}],["heropoint",{"_index":1955,"title":{},"content":{"335":{"position":[[672,10],[797,10]]}},"keywords":{}}],["heroschema",{"_index":766,"title":{},"content":{"51":{"position":[[261,10],[867,10]]},"538":{"position":[[562,10],[890,10]]},"562":{"position":[[270,10],[518,10]]},"598":{"position":[[569,10],[897,10]]},"1311":{"position":[[246,11],[1014,11]]}},"keywords":{}}],["hibern",{"_index":5545,"title":{},"content":{"1003":{"position":[[146,10]]}},"keywords":{}}],["hidden",{"_index":5546,"title":{},"content":{"1003":{"position":[[210,7]]}},"keywords":{}}],["hide",{"_index":4744,"title":{},"content":{"828":{"position":[[314,6]]},"898":{"position":[[685,4]]}},"keywords":{}}],["hideloadingspinn",{"_index":5521,"title":{},"content":{"995":{"position":[[2013,21]]}},"keywords":{}}],["hierarch",{"_index":2007,"title":{},"content":{"353":{"position":[[304,12]]},"364":{"position":[[616,12]]},"396":{"position":[[592,12]]}},"keywords":{}}],["high",{"_index":1207,"title":{"1238":{"position":[[0,4]]}},"content":{"173":{"position":[[2133,4]]},"177":{"position":[[105,4]]},"265":{"position":[[913,4]]},"267":{"position":[[976,4]]},"385":{"position":[[95,4]]},"390":{"position":[[100,4]]},"396":{"position":[[261,4]]},"399":{"position":[[254,4],[550,4]]},"412":{"position":[[10645,4]]},"441":{"position":[[365,4]]},"454":{"position":[[53,4]]},"483":{"position":[[1008,4]]},"497":{"position":[[100,4],[309,4]]},"566":{"position":[[335,4]]},"611":{"position":[[566,4]]},"613":{"position":[[408,4]]},"622":{"position":[[24,4],[587,4]]},"623":{"position":[[491,4]]},"624":{"position":[[1433,4]]},"643":{"position":[[23,4]]},"802":{"position":[[875,4]]},"901":{"position":[[462,4]]},"902":{"position":[[834,4],[912,4]]},"1206":{"position":[[439,4]]},"1294":{"position":[[1923,4]]}},"keywords":{}}],["higher",{"_index":761,"title":{},"content":{"51":{"position":[[115,6]]},"396":{"position":[[687,6]]},"408":{"position":[[2224,6]]},"621":{"position":[[377,6]]},"622":{"position":[[333,6]]},"689":{"position":[[94,6]]},"821":{"position":[[878,6]]},"1170":{"position":[[265,6]]},"1194":{"position":[[1050,6]]}},"keywords":{}}],["highli",{"_index":1171,"title":{},"content":{"156":{"position":[[288,6]]},"265":{"position":[[469,6]]},"358":{"position":[[572,6]]},"390":{"position":[[1154,6]]},"433":{"position":[[140,6]]},"445":{"position":[[1520,6]]},"447":{"position":[[407,6]]},"548":{"position":[[209,6]]},"608":{"position":[[209,6]]},"623":{"position":[[633,6]]},"723":{"position":[[324,6]]},"1132":{"position":[[427,6]]}},"keywords":{}}],["highlight",{"_index":2577,"title":{},"content":{"408":{"position":[[5406,9]]},"419":{"position":[[925,10]]},"420":{"position":[[1464,10]]}},"keywords":{}}],["hinder",{"_index":2888,"title":{},"content":{"427":{"position":[[1047,6]]}},"keywords":{}}],["hint",{"_index":1815,"title":{},"content":{"302":{"position":[[1021,5]]}},"keywords":{}}],["hipaa",{"_index":3336,"title":{},"content":{"550":{"position":[[422,6]]}},"keywords":{}}],["histor",{"_index":1721,"title":{},"content":{"298":{"position":[[583,12]]},"299":{"position":[[626,12],[1165,13]]},"331":{"position":[[1,13]]},"408":{"position":[[1144,13]]}},"keywords":{}}],["histori",{"_index":2845,"title":{},"content":{"421":{"position":[[14,7]]},"439":{"position":[[251,8]]},"449":{"position":[[88,8]]},"635":{"position":[[394,10]]},"1316":{"position":[[3083,8]]}},"keywords":{}}],["hit",{"_index":1322,"title":{},"content":{"205":{"position":[[11,3]]},"304":{"position":[[198,3]]},"321":{"position":[[284,7]]},"408":{"position":[[1333,7]]},"410":{"position":[[2199,3]]}},"keywords":{}}],["hnsw",{"_index":2342,"title":{},"content":{"396":{"position":[[570,7],[578,4]]}},"keywords":{}}],["hnsw'",{"_index":2340,"title":{},"content":{"396":{"position":[[514,6]]}},"keywords":{}}],["hold",{"_index":1985,"title":{},"content":{"350":{"position":[[63,4]]},"411":{"position":[[1910,5]]},"417":{"position":[[20,4]]}},"keywords":{}}],["home",{"_index":3215,"title":{},"content":{"500":{"position":[[165,4]]}},"keywords":{}}],["hood",{"_index":2736,"title":{},"content":{"412":{"position":[[9872,5]]},"490":{"position":[[484,5]]},"566":{"position":[[813,4]]}},"keywords":{}}],["hood.i",{"_index":445,"title":{},"content":{"27":{"position":[[369,9]]}},"keywords":{}}],["hoodi",{"_index":436,"title":{"27":{"position":[[0,7]]}},"content":{"27":{"position":[[1,6],[200,6],[329,6]]}},"keywords":{}}],["hook",{"_index":517,"title":{"523":{"position":[[17,6]]},"541":{"position":[[32,6]]},"764":{"position":[[25,6]]},"802":{"position":[[21,6]]},"1118":{"position":[[25,6]]}},"content":{"33":{"position":[[285,6]]},"134":{"position":[[276,5]]},"147":{"position":[[188,5]]},"381":{"position":[[375,5]]},"494":{"position":[[494,4]]},"523":{"position":[[10,5],[48,5],[109,5],[285,5]]},"540":{"position":[[189,5]]},"582":{"position":[[565,5]]},"590":{"position":[[451,5]]},"749":{"position":[[7490,4],[7570,5],[7670,4],[7772,5]]},"763":{"position":[[29,6]]},"764":{"position":[[300,5]]},"766":{"position":[[5,5],[166,5],[219,4]]},"767":{"position":[[11,4]]},"768":{"position":[[8,4]]},"769":{"position":[[11,4]]},"770":{"position":[[6,4],[278,5],[543,4],[629,5]]},"802":{"position":[[17,5],[134,4],[627,5]]},"806":{"position":[[186,5],[297,5],[358,5],[411,5]]},"828":{"position":[[164,6],[250,5],[390,6]]},"829":{"position":[[280,6],[1997,4],[2149,4],[2311,5],[2850,4],[3116,5],[3126,4]]},"830":{"position":[[5,5]]},"831":{"position":[[26,5]]},"899":{"position":[[66,5]]},"1117":{"position":[[143,6]]},"1118":{"position":[[93,6]]},"1284":{"position":[[25,5],[40,5]]},"1311":{"position":[[1108,4]]}},"keywords":{}}],["hooksdelet",{"_index":4550,"title":{},"content":{"769":{"position":[[137,12]]}},"keywords":{}}],["hooksev",{"_index":4529,"title":{},"content":{"767":{"position":[[250,10]]},"768":{"position":[[209,10]]},"769":{"position":[[224,10]]}},"keywords":{}}],["hookspostinsert",{"_index":4528,"title":{},"content":{"767":{"position":[[225,15]]}},"keywords":{}}],["hookspostremov",{"_index":4552,"title":{},"content":{"769":{"position":[[199,15]]}},"keywords":{}}],["hookspostsav",{"_index":4540,"title":{},"content":{"768":{"position":[[186,13]]}},"keywords":{}}],["hookspreinsert",{"_index":4524,"title":{},"content":{"767":{"position":[[121,14]]}},"keywords":{}}],["hookspreremov",{"_index":4549,"title":{},"content":{"769":{"position":[[113,14]]}},"keywords":{}}],["hookspresav",{"_index":4537,"title":{},"content":{"768":{"position":[[104,12]]}},"keywords":{}}],["hooksschema",{"_index":4525,"title":{},"content":{"767":{"position":[[145,11]]}},"keywords":{}}],["hooksupd",{"_index":4538,"title":{},"content":{"768":{"position":[[126,12]]}},"keywords":{}}],["hop",{"_index":2143,"title":{},"content":{"376":{"position":[[193,5]]},"902":{"position":[[48,4]]}},"keywords":{}}],["hope",{"_index":3962,"title":{},"content":{"702":{"position":[[417,4]]}},"keywords":{}}],["hopefulli",{"_index":3938,"title":{},"content":{"696":{"position":[[1635,9]]},"700":{"position":[[238,9]]}},"keywords":{}}],["horizon",{"_index":358,"title":{"21":{"position":[[0,8]]}},"content":{"21":{"position":[[1,7],[199,8]]}},"keywords":{}}],["horizont",{"_index":2010,"title":{"1091":{"position":[[0,10]]}},"content":{"353":{"position":[[377,10]]},"772":{"position":[[386,12]]},"1094":{"position":[[140,12]]},"1295":{"position":[[100,13],[580,12]]}},"keywords":{}}],["host",{"_index":235,"title":{},"content":{"14":{"position":[[1033,6],[1114,6]]},"18":{"position":[[229,6]]},"174":{"position":[[3051,6]]},"202":{"position":[[98,7],[129,4]]},"204":{"position":[[298,7]]},"249":{"position":[[54,7],[81,4]]},"289":{"position":[[1030,6]]},"485":{"position":[[24,4]]},"504":{"position":[[1151,6]]},"840":{"position":[[571,6]]},"849":{"position":[[1017,4],[1022,6]]},"861":{"position":[[47,4],[207,4],[272,6]]},"862":{"position":[[949,6]]},"870":{"position":[[225,6]]},"896":{"position":[[29,6]]},"902":{"position":[[864,7]]},"903":{"position":[[377,5]]},"1124":{"position":[[2065,6]]},"1246":{"position":[[861,4]]}},"keywords":{}}],["hosting.miss",{"_index":4799,"title":{},"content":{"839":{"position":[[629,15]]}},"keywords":{}}],["hot",{"_index":4212,"title":{"799":{"position":[[13,5]]}},"content":{"749":{"position":[[5952,3]]},"799":{"position":[[748,3]]}},"keywords":{}}],["hour",{"_index":2251,"title":{},"content":{"392":{"position":[[3152,5]]},"995":{"position":[[1410,6]]}},"keywords":{}}],["hp",{"_index":3507,"title":{},"content":{"580":{"position":[[847,3]]}},"keywords":{}}],["href="https://rxdb.info/react.html">rxdb</a>",{"_index":4751,"title":{},"content":{"829":{"position":[[1640,63]]}},"keywords":{}}],["hsw",{"_index":2338,"title":{},"content":{"396":{"position":[[349,3]]}},"keywords":{}}],["html",{"_index":1626,"title":{},"content":{"269":{"position":[[76,6]]},"571":{"position":[[800,4],[1053,4]]}},"keywords":{}}],["http",{"_index":131,"title":{"874":{"position":[[0,4]]},"1032":{"position":[[22,4]]}},"content":{"8":{"position":[[1076,8]]},"16":{"position":[[154,5]]},"165":{"position":[[212,5]]},"434":{"position":[[278,4]]},"450":{"position":[[384,4]]},"461":{"position":[[117,4],[362,4]]},"487":{"position":[[55,4]]},"491":{"position":[[583,4],[1638,4]]},"556":{"position":[[1563,5]]},"565":{"position":[[118,6]]},"566":{"position":[[1171,6]]},"570":{"position":[[647,4]]},"610":{"position":[[122,5]]},"611":{"position":[[210,4],[414,4]]},"612":{"position":[[91,5],[416,4]]},"616":{"position":[[349,4],[471,4],[702,4],[1105,4]]},"617":{"position":[[854,4]]},"619":{"position":[[223,4],[365,4]]},"621":{"position":[[342,4],[425,4]]},"623":{"position":[[361,4]]},"624":{"position":[[1478,4]]},"626":{"position":[[723,4]]},"632":{"position":[[836,4]]},"696":{"position":[[525,4]]},"749":{"position":[[21180,4]]},"793":{"position":[[637,4]]},"837":{"position":[[1615,6]]},"841":{"position":[[774,6]]},"846":{"position":[[694,4]]},"848":{"position":[[63,4]]},"863":{"position":[[376,4]]},"871":{"position":[[302,5],[781,4]]},"875":{"position":[[75,4],[169,4],[503,4],[751,4],[1308,4]]},"876":{"position":[[56,4],[284,4]]},"886":{"position":[[1098,5],[1803,4],[2730,5],[3917,5]]},"968":{"position":[[735,5]]},"1010":{"position":[[126,4]]},"1032":{"position":[[14,4]]},"1097":{"position":[[317,4]]},"1102":{"position":[[110,4],[433,4]]}},"keywords":{}}],["http.encrypt",{"_index":4790,"title":{},"content":{"838":{"position":[[810,15]]}},"keywords":{}}],["http/",{"_index":3676,"title":{},"content":{"624":{"position":[[223,6]]}},"keywords":{}}],["http/1.1",{"_index":3632,"title":{},"content":{"617":{"position":[[351,8]]}},"keywords":{}}],["http/2",{"_index":3644,"title":{},"content":{"617":{"position":[[1182,6]]}},"keywords":{}}],["http/3",{"_index":3617,"title":{},"content":{"613":{"position":[[136,6]]},"617":{"position":[[1192,6]]},"620":{"position":[[559,6]]},"621":{"position":[[810,6]]},"624":{"position":[[1044,6],[1152,6]]}},"keywords":{}}],["http/3'",{"_index":3674,"title":{},"content":{"623":{"position":[[666,8]]}},"keywords":{}}],["http/websocket",{"_index":5191,"title":{},"content":{"897":{"position":[[398,15]]}},"keywords":{}}],["http1.1",{"_index":4844,"title":{},"content":{"849":{"position":[[51,7]]}},"keywords":{}}],["http2",{"_index":4850,"title":{},"content":{"849":{"position":[[806,5],[872,5]]}},"keywords":{}}],["http2.0",{"_index":4849,"title":{},"content":{"849":{"position":[[702,8],[717,7]]}},"keywords":{}}],["http://172.0.0.1:5984",{"_index":4852,"title":{},"content":{"849":{"position":[[936,22]]}},"keywords":{}}],["http://example.com",{"_index":5948,"title":{},"content":{"1103":{"position":[[247,20],[396,20]]}},"keywords":{}}],["http://example.com/db",{"_index":4860,"title":{},"content":{"851":{"position":[[335,24]]}},"keywords":{}}],["http://example.com/db/human",{"_index":4823,"title":{},"content":{"846":{"position":[[286,31]]},"848":{"position":[[761,31],[1396,31]]},"852":{"position":[[279,31]]},"1149":{"position":[[1437,30]]}},"keywords":{}}],["http://example.com/graphql",{"_index":5122,"title":{},"content":{"886":{"position":[[1104,28],[2736,28],[3923,29]]}},"keywords":{}}],["http://localhost/pullstream",{"_index":5049,"title":{},"content":{"875":{"position":[[8145,30],[9564,30]]}},"keywords":{}}],["http://localhost:${port",{"_index":3616,"title":{},"content":{"612":{"position":[[2537,28]]}},"keywords":{}}],["http://localhost:3000/repl",{"_index":1460,"title":{},"content":{"243":{"position":[[493,33]]}},"keywords":{}}],["http://localhost:4000",{"_index":3842,"title":{},"content":{"670":{"position":[[568,22]]}},"keywords":{}}],["http://localhost:80/mi",{"_index":5934,"title":{},"content":{"1101":{"position":[[758,23]]}},"keywords":{}}],["http://localhost:80/users/0",{"_index":5066,"title":{},"content":{"878":{"position":[[385,30]]}},"keywords":{}}],["http://localhost:8080/${endpoint.urlpath",{"_index":4967,"title":{},"content":{"872":{"position":[[3478,45]]}},"keywords":{}}],["http://localhost:8080/humans/0",{"_index":4973,"title":{},"content":{"872":{"position":[[4404,30],[4548,33]]}},"keywords":{}}],["http://localhost:8080?n",{"_index":4868,"title":{},"content":{"854":{"position":[[293,27]]}},"keywords":{}}],["httppouch",{"_index":4780,"title":{},"content":{"837":{"position":[[1583,9]]}},"keywords":{}}],["https://cordova.apache.org/docs/de/latest/cordova/events/events.deviceready.html",{"_index":157,"title":{},"content":{"11":{"position":[[427,80]]}},"keywords":{}}],["https://developer.mozilla.org/en",{"_index":6267,"title":{},"content":{"1226":{"position":[[482,32]]},"1264":{"position":[[385,32]]}},"keywords":{}}],["https://discord.com/channels/969553741705539624/1341392686267109458/1343639513850843217",{"_index":4148,"title":{},"content":{"749":{"position":[[1172,87]]}},"keywords":{}}],["https://docs.couchdb.org/en/3.2.2",{"_index":4827,"title":{},"content":{"846":{"position":[[960,33]]}},"keywords":{}}],["https://example.com/api/sync",{"_index":5454,"title":{},"content":{"988":{"position":[[580,30]]}},"keywords":{}}],["https://example.com/api/sync/?minupdatedat=${mintimestamp}&limit=${batchs",{"_index":5466,"title":{},"content":{"988":{"position":[[3720,83]]}},"keywords":{}}],["https://example.com/mydatabas",{"_index":4346,"title":{},"content":{"749":{"position":[[16164,33]]}},"keywords":{}}],["https://firestore.googleapis.com/${projectid",{"_index":4873,"title":{},"content":{"854":{"position":[[644,48]]}},"keywords":{}}],["https://github.com/nextapp",{"_index":4059,"title":{},"content":{"724":{"position":[[1423,27],[1729,27]]}},"keywords":{}}],["https://github.com/pubkey/rxdb",{"_index":5921,"title":{},"content":{"1097":{"position":[[538,30]]}},"keywords":{}}],["https://github.com/pubkey/rxdb.gitinstal",{"_index":3824,"title":{},"content":{"666":{"position":[[157,41]]}},"keywords":{}}],["https://github.com/pubkey/rxdb/issues/6792#issuecom",{"_index":4181,"title":{},"content":{"749":{"position":[[3731,55]]}},"keywords":{}}],["https://github.com/pubkey/rxdb/pull/6643#issuecom",{"_index":4423,"title":{},"content":{"749":{"position":[[23081,53]]}},"keywords":{}}],["https://localhost/pull?updatedat=${updatedat}&id=${id}&limit=${batchs",{"_index":5010,"title":{},"content":{"875":{"position":[[3341,83]]}},"keywords":{}}],["https://neighbourhood.ie/blog/2020/10/13/everyth",{"_index":4136,"title":{},"content":{"749":{"position":[[198,51]]}},"keywords":{}}],["https://pouchdb.com/api.html#create_databas",{"_index":6181,"title":{},"content":{"1201":{"position":[[301,44]]}},"keywords":{}}],["https://rxdb.info/articles/indexeddb",{"_index":1465,"title":{},"content":{"243":{"position":[[585,36],[686,36],[785,36],[882,36]]}},"keywords":{}}],["https://rxdb.info/migr",{"_index":4297,"title":{},"content":{"749":{"position":[[12667,27]]}},"keywords":{}}],["https://rxdb.info/repl",{"_index":4336,"title":{},"content":{"749":{"position":[[15358,29]]}},"keywords":{}}],["https://rxdb.info/rx",{"_index":4057,"title":{},"content":{"724":{"position":[[1112,20]]},"749":{"position":[[3466,20],[9401,20],[18372,20]]}},"keywords":{}}],["https://spacetelescope.github.io/understand",{"_index":4384,"title":{},"content":{"749":{"position":[[19177,46]]}},"keywords":{}}],["https://supabase.com/docs/guides/auth/row",{"_index":5232,"title":{},"content":{"899":{"position":[[209,41]]}},"keywords":{}}],["https://supabase.com/docs/guides/cli",{"_index":5235,"title":{},"content":{"899":{"position":[[351,36]]}},"keywords":{}}],["https://supabase.com/docs/guides/realtimeloc",{"_index":5234,"title":{},"content":{"899":{"position":[[276,46]]}},"keywords":{}}],["https://the",{"_index":5142,"title":{},"content":{"886":{"position":[[4481,11]]}},"keywords":{}}],["https://www.bennadel.com/blog/3448",{"_index":755,"title":{},"content":{"50":{"position":[[365,34]]}},"keywords":{}}],["https://www.mongodb.com/docs/manual/reference/connect",{"_index":6160,"title":{},"content":{"1189":{"position":[[513,56]]}},"keywords":{}}],["https://www.npmjs.com/package/sqlite3",{"_index":6337,"title":{},"content":{"1274":{"position":[[222,37]]}},"keywords":{}}],["https://www.npmjs.com/package/wa",{"_index":6341,"title":{},"content":{"1276":{"position":[[678,32]]}},"keywords":{}}],["https://xyzcompany.supabase.co",{"_index":5215,"title":{},"content":{"898":{"position":[[3066,33]]}},"keywords":{}}],["https://yourapi.com/tasks/pull?checkpoint=${json.stringifi",{"_index":1357,"title":{},"content":{"209":{"position":[[1110,60]]}},"keywords":{}}],["httpwebsocket",{"_index":3133,"title":{},"content":{"481":{"position":[[352,13]]}},"keywords":{}}],["huge",{"_index":2483,"title":{},"content":{"402":{"position":[[905,4]]},"408":{"position":[[1775,4]]},"412":{"position":[[6756,4]]},"1246":{"position":[[1024,4]]},"1294":{"position":[[1880,4]]},"1295":{"position":[[1496,4]]}},"keywords":{}}],["huggingfac",{"_index":2211,"title":{},"content":{"391":{"position":[[155,11]]},"401":{"position":[[98,11]]},"402":{"position":[[2017,11]]}},"keywords":{}}],["hulk",{"_index":797,"title":{},"content":{"52":{"position":[[258,7],[517,6]]},"539":{"position":[[258,7],[517,6]]},"599":{"position":[[285,7],[544,6]]}},"keywords":{}}],["human",{"_index":2106,"title":{"1313":{"position":[[30,6]]}},"content":{"364":{"position":[[741,5]]},"649":{"position":[[361,9]]},"662":{"position":[[2362,7]]},"689":{"position":[[517,5]]},"710":{"position":[[1851,7]]},"808":{"position":[[144,6],[168,7],[267,8],[300,5],[651,8]]},"812":{"position":[[56,6],[214,7]]},"813":{"position":[[56,6],[174,8],[237,6]]},"818":{"position":[[521,7]]},"838":{"position":[[2576,7]]},"851":{"position":[[245,8],[312,9]]},"862":{"position":[[833,7]]},"872":{"position":[[1840,7],[2555,7],[3405,9],[4070,7],[4501,7]]},"885":{"position":[[625,5],[799,8],[1207,7]]},"889":{"position":[[167,7]]},"898":{"position":[[2420,7],[3353,9],[3427,7]]},"916":{"position":[[366,7]]},"934":{"position":[[283,7]]},"1078":{"position":[[218,6]]},"1080":{"position":[[48,6]]},"1149":{"position":[[1029,7]]},"1231":{"position":[[1116,7]]},"1309":{"position":[[1446,7]]},"1311":{"position":[[301,6],[343,5]]},"1313":{"position":[[517,6],[910,5]]}},"keywords":{}}],["humaninput",{"_index":5079,"title":{},"content":{"885":{"position":[[525,10]]}},"keywords":{}}],["humaninputpushrow",{"_index":5084,"title":{},"content":{"885":{"position":[[917,17],[1184,22]]},"886":{"position":[[2356,21]]},"889":{"position":[[343,22]]}},"keywords":{}}],["humanpullbulk",{"_index":5081,"title":{},"content":{"885":{"position":[[772,13],[894,14],[1379,14]]}},"keywords":{}}],["humanscollection.findone('alice').exec",{"_index":4693,"title":{},"content":{"813":{"position":[[351,41]]}},"keywords":{}}],["humanscollection.findone('bob').exec",{"_index":4680,"title":{},"content":{"810":{"position":[[347,39]]},"811":{"position":[[327,39]]}},"keywords":{}}],["humanscollection.insert",{"_index":4678,"title":{},"content":{"810":{"position":[[195,25],[266,25]]},"811":{"position":[[175,25],[246,25]]}},"keywords":{}}],["hundr",{"_index":2533,"title":{},"content":{"408":{"position":[[887,8]]},"411":{"position":[[399,8]]},"696":{"position":[[1147,7],[1216,8]]}},"keywords":{}}],["hunt",{"_index":3838,"title":{},"content":{"670":{"position":[[286,4]]}},"keywords":{}}],["hybrid",{"_index":875,"title":{"268":{"position":[[37,6]]},"269":{"position":[[15,6]]},"284":{"position":[[23,6]]},"446":{"position":[[22,6]]},"774":{"position":[[0,6]]}},"content":{"59":{"position":[[212,6]]},"112":{"position":[[124,6]]},"174":{"position":[[2730,6]]},"239":{"position":[[161,6]]},"266":{"position":[[244,6]]},"269":{"position":[[22,6]]},"270":{"position":[[81,6]]},"271":{"position":[[84,6]]},"274":{"position":[[64,6]]},"278":{"position":[[251,6]]},"280":{"position":[[461,6]]},"284":{"position":[[36,6]]},"285":{"position":[[356,6]]},"286":{"position":[[167,6]]},"287":{"position":[[1274,6]]},"356":{"position":[[884,6]]},"362":{"position":[[440,6]]},"372":{"position":[[231,6]]},"418":{"position":[[670,6]]},"444":{"position":[[741,6]]},"445":{"position":[[378,6],[1672,6],[1735,6],[2108,6]]},"446":{"position":[[1114,6]]},"447":{"position":[[198,6],[613,6]]},"479":{"position":[[339,6]]},"497":{"position":[[720,6]]},"500":{"position":[[232,6]]},"606":{"position":[[257,6]]},"662":{"position":[[75,6]]},"783":{"position":[[370,6]]},"1270":{"position":[[260,6]]},"1316":{"position":[[2105,6]]}},"keywords":{}}],["i'v",{"_index":1073,"title":{},"content":{"118":{"position":[[406,4]]},"323":{"position":[[664,4]]}},"keywords":{}}],["i.",{"_index":2544,"title":{},"content":{"408":{"position":[[2326,6]]},"560":{"position":[[571,6]]},"898":{"position":[[4325,6]]}},"keywords":{}}],["i.assumedmasterst",{"_index":2699,"title":{},"content":{"412":{"position":[[5420,20]]}},"keywords":{}}],["i.newdocumentst",{"_index":2700,"title":{},"content":{"412":{"position":[[5445,18],[5476,18]]}},"keywords":{}}],["i.realmasterst",{"_index":2698,"title":{},"content":{"412":{"position":[[5401,18],[5553,18]]},"1309":{"position":[[1193,18]]}},"keywords":{}}],["i/o",{"_index":1605,"title":{},"content":{"265":{"position":[[541,3]]},"267":{"position":[[1344,3]]},"385":{"position":[[162,3]]},"408":{"position":[[1628,3]]}},"keywords":{}}],["i9",{"_index":6401,"title":{},"content":{"1292":{"position":[[189,2]]}},"keywords":{}}],["ibm",{"_index":430,"title":{},"content":{"26":{"position":[[325,3],[404,3]]}},"keywords":{}}],["ic",{"_index":3624,"title":{},"content":{"614":{"position":[[465,4]]},"901":{"position":[[291,3]]}},"keywords":{}}],["icon",{"_index":2820,"title":{},"content":{"419":{"position":[[1762,4]]}},"keywords":{}}],["id",{"_index":771,"title":{"924":{"position":[[0,3]]}},"content":{"51":{"position":[[367,5],[403,3],[508,6]]},"188":{"position":[[1244,5],[1280,3],[1435,6]]},"209":{"position":[[465,5],[485,3]]},"211":{"position":[[411,5],[447,3]]},"255":{"position":[[809,5],[829,3]]},"259":{"position":[[93,5],[129,3]]},"314":{"position":[[775,5],[795,3],[891,6]]},"315":{"position":[[751,5],[771,3],[833,7]]},"316":{"position":[[260,5],[280,3]]},"334":{"position":[[645,5],[681,3]]},"335":{"position":[[746,3]]},"356":{"position":[[339,2]]},"367":{"position":[[737,5],[824,3],[1046,6]]},"392":{"position":[[595,5],[631,3],[708,6],[1455,2],[1561,5],[1597,3],[1705,6],[2910,3],[3646,3],[4225,2],[4348,3],[4499,3]]},"396":{"position":[[1626,2]]},"397":{"position":[[1932,3]]},"462":{"position":[[857,2]]},"465":{"position":[[106,3]]},"480":{"position":[[575,5],[595,3]]},"482":{"position":[[875,5],[895,3],[963,7]]},"538":{"position":[[668,5],[704,3],[809,6]]},"554":{"position":[[1366,5],[1386,3],[1504,6]]},"555":{"position":[[298,3]]},"556":{"position":[[936,3]]},"562":{"position":[[347,5],[367,3],[456,6],[576,3]]},"564":{"position":[[804,5],[824,3],[892,7]]},"579":{"position":[[653,5],[689,3]]},"598":{"position":[[675,5],[711,3],[816,6]]},"599":{"position":[[109,3],[218,3],[270,3]]},"612":{"position":[[1651,2]]},"632":{"position":[[1559,5],[1579,3]]},"638":{"position":[[643,5],[663,3],[748,7]]},"639":{"position":[[421,5],[441,3]]},"662":{"position":[[2422,5],[2442,3],[2545,6]]},"680":{"position":[[835,5],[871,3],[1052,6]]},"683":{"position":[[194,3],[315,3],[820,3],[909,3]]},"698":{"position":[[2786,4],[2854,4],[2921,4]]},"717":{"position":[[1444,5],[1480,3],[1561,6]]},"734":{"position":[[709,5],[745,3]]},"749":{"position":[[14102,2]]},"792":{"position":[[355,3]]},"800":{"position":[[901,3]]},"820":{"position":[[498,3],[538,3]]},"838":{"position":[[2636,5],[2656,3],[2759,6]]},"854":{"position":[[227,4]]},"862":{"position":[[675,5],[711,3],[789,6]]},"866":{"position":[[717,2]]},"875":{"position":[[1683,2],[2112,2],[2295,2],[2440,3],[2512,3],[2523,2],[2555,3],[2665,3],[2685,3],[3261,2],[4541,3],[5235,4],[5373,3]]},"885":{"position":[[538,3],[542,4],[633,3],[637,4],[734,3],[1668,2],[2242,2],[2539,3]]},"886":{"position":[[534,3],[701,2],[746,2],[2415,2],[3611,3],[3661,2]]},"897":{"position":[[181,3]]},"904":{"position":[[898,5],[918,3],[1090,6],[1176,3]]},"917":{"position":[[169,3]]},"918":{"position":[[130,3]]},"919":{"position":[[32,3]]},"924":{"position":[[5,2]]},"945":{"position":[[293,4]]},"951":{"position":[[30,2],[324,3],[550,3]]},"984":{"position":[[419,2]]},"988":{"position":[[309,2],[4372,3],[5421,3],[5499,3]]},"990":{"position":[[565,2]]},"1004":{"position":[[356,4]]},"1007":{"position":[[139,3]]},"1014":{"position":[[99,2],[239,2],[378,2]]},"1015":{"position":[[215,2]]},"1016":{"position":[[31,3]]},"1018":{"position":[[863,2]]},"1020":{"position":[[636,3]]},"1024":{"position":[[505,3]]},"1063":{"position":[[84,3]]},"1078":{"position":[[322,5],[524,3],[688,5],[888,3],[913,3],[1016,2]]},"1080":{"position":[[111,5],[147,3],[729,5]]},"1082":{"position":[[196,5],[232,3],[463,6]]},"1083":{"position":[[396,5],[432,3],[633,6]]},"1104":{"position":[[785,2]]},"1124":{"position":[[783,3]]},"1149":{"position":[[1089,5],[1109,3],[1212,6]]},"1158":{"position":[[383,5],[419,3],[509,6],[586,3]]},"1194":{"position":[[428,2],[600,2]]},"1218":{"position":[[404,4]]},"1251":{"position":[[55,3]]},"1294":{"position":[[506,2],[583,4],[1292,2]]},"1295":{"position":[[1254,2]]},"1296":{"position":[[431,4],[729,2],[1043,4],[1296,2]]},"1315":{"position":[[245,2]]},"1316":{"position":[[2156,2]]}},"keywords":{}}],["idb",{"_index":55,"title":{},"content":{"3":{"position":[[137,3],[188,7]]},"1201":{"position":[[156,7],[247,6]]}},"keywords":{}}],["idbkeyrang",{"_index":6053,"title":{},"content":{"1139":{"position":[[633,12]]},"1140":{"position":[[829,11]]},"1145":{"position":[[618,12]]},"1294":{"position":[[1996,11]]}},"keywords":{}}],["idbkeyrange.bound",{"_index":6432,"title":{},"content":{"1294":{"position":[[1181,18]]},"1296":{"position":[[1358,18],[1467,18]]}},"keywords":{}}],["idbkeyrange.bound(10",{"_index":2993,"title":{},"content":{"459":{"position":[[590,21]]}},"keywords":{}}],["idbobjectstor",{"_index":6450,"title":{},"content":{"1295":{"position":[[831,14]]}},"keywords":{}}],["idbtransact",{"_index":6427,"title":{},"content":{"1294":{"position":[[811,14]]}},"keywords":{}}],["idea",{"_index":1434,"title":{"242":{"position":[[0,5]]},"1007":{"position":[[0,5]]}},"content":{"420":{"position":[[565,5]]},"422":{"position":[[232,5]]},"455":{"position":[[130,4]]},"524":{"position":[[781,5]]},"765":{"position":[[111,6]]}},"keywords":{}}],["ideal",{"_index":562,"title":{},"content":{"35":{"position":[[583,5]]},"83":{"position":[[206,5]]},"183":{"position":[[51,5]]},"241":{"position":[[648,5]]},"267":{"position":[[589,5]]},"365":{"position":[[162,5]]},"380":{"position":[[313,5]]},"384":{"position":[[150,5]]},"393":{"position":[[520,5]]},"407":{"position":[[999,6]]},"446":{"position":[[40,5]]},"496":{"position":[[375,5]]},"504":{"position":[[388,5]]},"540":{"position":[[54,5]]},"546":{"position":[[247,5]]},"571":{"position":[[1478,7],[1523,8]]},"581":{"position":[[376,5]]},"600":{"position":[[54,5]]},"606":{"position":[[247,5]]},"611":{"position":[[517,5]]},"612":{"position":[[207,5]]},"621":{"position":[[114,5]]},"624":{"position":[[474,5]]},"901":{"position":[[747,5]]},"1206":{"position":[[406,5]]},"1301":{"position":[[539,5]]}},"keywords":{}}],["idempot",{"_index":5653,"title":{"1030":{"position":[[26,11]]}},"content":{"1030":{"position":[[131,11]]}},"keywords":{}}],["ident",{"_index":4766,"title":{},"content":{"830":{"position":[[340,12]]},"950":{"position":[[390,9]]},"1040":{"position":[[137,9]]}},"keywords":{}}],["identifi",{"_index":2203,"title":{},"content":{"390":{"position":[[1486,10]]},"392":{"position":[[2665,11],[4571,11]]},"638":{"position":[[89,12]]},"724":{"position":[[559,11],[637,11]]},"904":{"position":[[2122,10]]},"935":{"position":[[19,10]]},"961":{"position":[[46,10]]},"988":{"position":[[335,8]]},"1020":{"position":[[104,10],[126,8],[389,11]]},"1022":{"position":[[482,11]]},"1023":{"position":[[141,11]]},"1024":{"position":[[235,11]]},"1033":{"position":[[522,11],[755,11]]},"1104":{"position":[[748,8]]},"1218":{"position":[[388,11]]}},"keywords":{}}],["identifier,"",{"_index":5584,"title":{},"content":{"1008":{"position":[[129,17]]}},"keywords":{}}],["idl",{"_index":3770,"title":{},"content":{"656":{"position":[[93,4]]},"796":{"position":[[1222,8],[1353,7]]},"815":{"position":[[228,5]]},"975":{"position":[[58,5],[121,4]]},"1026":{"position":[[19,8]]},"1164":{"position":[[1318,4]]},"1175":{"position":[[519,4]]},"1300":{"position":[[648,4]]}},"keywords":{}}],["idmaxlength",{"_index":6458,"title":{},"content":{"1296":{"position":[[802,11]]}},"keywords":{}}],["idx",{"_index":2383,"title":{},"content":{"397":{"position":[[2067,4],[2165,4]]},"398":{"position":[[1060,6],[1127,6],[1222,6],[1289,6],[2360,6],[2482,6]]},"400":{"position":[[291,6]]},"403":{"position":[[908,4],[937,4]]}},"keywords":{}}],["if"",{"_index":4916,"title":{},"content":{"863":{"position":[[523,8]]}},"keywords":{}}],["if(!doc.delet",{"_index":5628,"title":{},"content":{"1022":{"position":[[730,16]]},"1023":{"position":[[381,16]]}},"keywords":{}}],["if(!optionswithauth.head",{"_index":4837,"title":{},"content":{"848":{"position":[[369,28]]}},"keywords":{}}],["if(!work",{"_index":2272,"title":{},"content":{"392":{"position":[[4151,11]]}},"keywords":{}}],["if(change.assumedmasterst",{"_index":5963,"title":{},"content":{"1106":{"position":[[574,29]]}},"keywords":{}}],["if(change.newdocumentstate.myreadonlyfield",{"_index":5972,"title":{},"content":{"1109":{"position":[[219,42]]}},"keywords":{}}],["if(event.documents.length",{"_index":5033,"title":{},"content":{"875":{"position":[[5463,25]]}},"keywords":{}}],["if(firstopen",{"_index":5484,"title":{},"content":{"988":{"position":[[5779,13]]}},"keywords":{}}],["if(need",{"_index":4461,"title":{},"content":{"752":{"position":[[695,9]]}},"keywords":{}}],["if(olddoc.tim",{"_index":4456,"title":{},"content":{"751":{"position":[[1944,14]]}},"keywords":{}}],["ifiabl",{"_index":2925,"title":{},"content":{"439":{"position":[[591,7]]}},"keywords":{}}],["ifmatch",{"_index":3879,"title":{},"content":{"680":{"position":[[1370,8]]},"681":{"position":[[456,7],[681,7],[791,8]]},"682":{"position":[[375,8],[432,8],[489,8],[546,8]]},"683":{"position":[[296,8],[846,8]]},"684":{"position":[[181,8]]}},"keywords":{}}],["ifnotmatch",{"_index":3881,"title":{},"content":{"681":{"position":[[468,11],[904,11]]},"683":{"position":[[934,11]]}},"keywords":{}}],["ifram",{"_index":1845,"title":{"676":{"position":[[21,7]]}},"content":{"303":{"position":[[1039,7]]},"676":{"position":[[83,6],[224,7]]},"1207":{"position":[[409,6]]}},"keywords":{}}],["ignor",{"_index":2978,"title":{},"content":{"455":{"position":[[819,6]]},"614":{"position":[[799,7]]},"990":{"position":[[644,6]]}},"keywords":{}}],["ignoredupl",{"_index":4214,"title":{"966":{"position":[[0,16]]}},"content":{"749":{"position":[[6071,15]]},"966":{"position":[[305,15],[346,16],[463,15],[611,16],[729,16]]}},"keywords":{}}],["illustr",{"_index":3262,"title":{},"content":{"522":{"position":[[250,11]]},"871":{"position":[[381,11]]}},"keywords":{}}],["imag",{"_index":1822,"title":{},"content":{"303":{"position":[[176,6]]},"390":{"position":[[229,7],[932,7]]},"404":{"position":[[628,5]]},"453":{"position":[[718,7]]},"556":{"position":[[584,8]]},"698":{"position":[[1982,7]]},"865":{"position":[[203,6]]},"1132":{"position":[[1464,6]]}},"keywords":{}}],["image/jpeg",{"_index":5290,"title":{},"content":{"917":{"position":[[367,12]]}},"keywords":{}}],["imagin",{"_index":2552,"title":{},"content":{"408":{"position":[[2911,8]]},"411":{"position":[[891,7]]},"691":{"position":[[14,7]]},"698":{"position":[[1,7]]},"736":{"position":[[1,7]]}},"keywords":{}}],["immedi",{"_index":957,"title":{},"content":{"68":{"position":[[176,9]]},"125":{"position":[[247,11]]},"160":{"position":[[161,11]]},"206":{"position":[[233,12]]},"217":{"position":[[253,9]]},"221":{"position":[[37,9]]},"379":{"position":[[120,9]]},"410":{"position":[[379,11],[2018,11]]},"412":{"position":[[6294,9],[11479,12]]},"418":{"position":[[77,9],[452,9]]},"421":{"position":[[1184,9]]},"489":{"position":[[483,9]]},"497":{"position":[[459,9],[821,9]]},"569":{"position":[[739,11]]},"571":{"position":[[89,9]]},"589":{"position":[[156,11]]},"610":{"position":[[515,11],[655,9],[1078,11]]},"621":{"position":[[153,9]]},"624":{"position":[[1070,9]]},"634":{"position":[[346,11]]},"1007":{"position":[[1016,9]]}},"keywords":{}}],["immers",{"_index":3249,"title":{},"content":{"510":{"position":[[744,9]]}},"keywords":{}}],["immut",{"_index":5719,"title":{"1069":{"position":[[14,10]]}},"content":{"1051":{"position":[[71,9]]},"1069":{"position":[[164,10]]}},"keywords":{}}],["impact",{"_index":1236,"title":{},"content":{"178":{"position":[[364,6]]},"416":{"position":[[507,7]]},"427":{"position":[[1183,6]]},"434":{"position":[[301,6]]},"460":{"position":[[937,6]]},"641":{"position":[[182,6]]}},"keywords":{}}],["impact.it",{"_index":4405,"title":{},"content":{"749":{"position":[[21152,9]]}},"keywords":{}}],["imper",{"_index":3461,"title":{},"content":{"569":{"position":[[822,10]]}},"keywords":{}}],["implement",{"_index":40,"title":{"89":{"position":[[7,14]]},"314":{"position":[[13,12]]},"487":{"position":[[29,10]]},"876":{"position":[[8,14]]},"882":{"position":[[19,15]]},"1240":{"position":[[14,15]]}},"content":{"2":{"position":[[42,9]]},"24":{"position":[[660,16]]},"31":{"position":[[30,10]]},"38":{"position":[[339,12],[414,9]]},"41":{"position":[[298,12]]},"43":{"position":[[42,12]]},"46":{"position":[[409,10],[484,12]]},"47":{"position":[[243,10]]},"60":{"position":[[69,14]]},"65":{"position":[[1642,9]]},"90":{"position":[[276,12]]},"99":{"position":[[219,9]]},"102":{"position":[[44,12]]},"147":{"position":[[251,9]]},"165":{"position":[[349,9]]},"167":{"position":[[318,9]]},"173":{"position":[[357,12]]},"196":{"position":[[123,9]]},"203":{"position":[[122,9]]},"227":{"position":[[396,9]]},"250":{"position":[[176,9]]},"255":{"position":[[1639,15]]},"275":{"position":[[40,14]]},"302":{"position":[[571,9]]},"377":{"position":[[245,9]]},"391":{"position":[[265,14]]},"398":{"position":[[3433,15]]},"410":{"position":[[670,9],[1698,9]]},"412":{"position":[[1860,9],[3517,9],[3836,9],[5265,10],[9997,15],[13056,12],[14525,12]]},"445":{"position":[[2336,15]]},"455":{"position":[[412,14]]},"461":{"position":[[1048,15]]},"469":{"position":[[1344,15]]},"521":{"position":[[224,15]]},"529":{"position":[[191,12]]},"534":{"position":[[429,15],[507,12]]},"547":{"position":[[69,14]]},"559":{"position":[[859,9]]},"566":{"position":[[489,9],[1109,11]]},"594":{"position":[[427,15],[505,12]]},"607":{"position":[[69,15]]},"610":{"position":[[1406,12]]},"619":{"position":[[125,9]]},"620":{"position":[[367,15]]},"624":{"position":[[192,10]]},"626":{"position":[[565,11]]},"627":{"position":[[206,9]]},"630":{"position":[[905,12]]},"679":{"position":[[47,11]]},"686":{"position":[[571,9]]},"696":{"position":[[1263,15]]},"698":{"position":[[1385,9],[2100,9],[3207,12],[3263,12]]},"701":{"position":[[1108,9]]},"703":{"position":[[526,11],[1703,15]]},"705":{"position":[[912,9],[1111,12],[1197,12]]},"737":{"position":[[341,12]]},"743":{"position":[[24,11]]},"772":{"position":[[149,15]]},"778":{"position":[[474,9]]},"784":{"position":[[137,9],[334,10],[814,12]]},"815":{"position":[[122,11]]},"824":{"position":[[104,14]]},"836":{"position":[[1456,12]]},"875":{"position":[[1270,9],[1334,9],[2887,9],[3551,9],[3633,9],[5965,9],[6497,9],[6872,9],[7742,9]]},"876":{"position":[[154,15]]},"882":{"position":[[324,14]]},"904":{"position":[[1588,10]]},"906":{"position":[[764,14]]},"962":{"position":[[25,14],[354,15],[583,15]]},"981":{"position":[[461,11]]},"983":{"position":[[117,9]]},"996":{"position":[[181,11]]},"1005":{"position":[[148,10]]},"1067":{"position":[[251,14]]},"1079":{"position":[[466,16]]},"1100":{"position":[[217,12]]},"1124":{"position":[[519,11]]},"1149":{"position":[[383,9]]},"1151":{"position":[[128,15]]},"1170":{"position":[[296,16]]},"1178":{"position":[[127,15]]},"1191":{"position":[[35,15]]},"1218":{"position":[[69,9]]},"1225":{"position":[[324,14]]},"1246":{"position":[[988,15]]},"1263":{"position":[[218,14]]},"1272":{"position":[[492,15],[564,14]]},"1294":{"position":[[352,9]]},"1304":{"position":[[431,9],[1404,12]]},"1313":{"position":[[958,11]]},"1315":{"position":[[1065,14]]},"1316":{"position":[[297,12]]},"1324":{"position":[[237,15]]}},"keywords":{}}],["implementations.also",{"_index":4720,"title":{},"content":{"824":{"position":[[296,20]]}},"keywords":{}}],["impli",{"_index":2821,"title":{},"content":{"419":{"position":[[1777,7]]},"773":{"position":[[91,8]]}},"keywords":{}}],["implicit",{"_index":2159,"title":{},"content":{"382":{"position":[[24,8]]}},"keywords":{}}],["import",{"_index":22,"title":{"117":{"position":[[0,10]]},"152":{"position":[[0,10]]},"178":{"position":[[0,10]]},"321":{"position":[[0,10]]},"732":{"position":[[0,7]]},"780":{"position":[[16,9]]},"821":{"position":[[0,9]]}},"content":{"1":{"position":[[319,6],[359,6]]},"8":{"position":[[491,6],[725,6],[766,6],[840,6],[883,6]]},"50":{"position":[[207,10],[291,6],[478,6]]},"51":{"position":[[179,6],[550,6]]},"55":{"position":[[177,6],[234,6],[295,6],[668,6],[722,6],[800,6]]},"66":{"position":[[89,9]]},"128":{"position":[[216,6]]},"129":{"position":[[592,6],[698,6]]},"147":{"position":[[74,9]]},"188":{"position":[[638,6],[679,6],[743,6],[2392,6],[2534,6]]},"209":{"position":[[1,6],[55,6],[133,6]]},"210":{"position":[[146,6]]},"211":{"position":[[63,6],[117,6]]},"255":{"position":[[348,6],[402,6],[480,6]]},"258":{"position":[[1,6],[55,6]]},"261":{"position":[[214,6]]},"265":{"position":[[308,9]]},"266":{"position":[[540,6],[581,6]]},"314":{"position":[[300,6],[354,6]]},"315":{"position":[[162,6],[251,6],[329,6]]},"320":{"position":[[412,10]]},"333":{"position":[[257,6]]},"334":{"position":[[165,6],[206,6]]},"376":{"position":[[521,9]]},"391":{"position":[[424,6]]},"392":{"position":[[207,6],[248,6],[922,8],[3497,6]]},"393":{"position":[[916,6]]},"394":{"position":[[467,6],[524,6]]},"397":{"position":[[1619,6]]},"410":{"position":[[1137,9]]},"412":{"position":[[68,9],[4433,6],[8756,10]]},"436":{"position":[[304,9]]},"450":{"position":[[594,9]]},"452":{"position":[[703,9]]},"456":{"position":[[109,9]]},"463":{"position":[[214,10]]},"464":{"position":[[53,9]]},"480":{"position":[[158,6],[212,6]]},"481":{"position":[[576,6]]},"482":{"position":[[159,6],[213,6],[291,6]]},"494":{"position":[[137,6]]},"522":{"position":[[168,8],[278,6],[319,6]]},"538":{"position":[[259,6],[313,6]]},"541":{"position":[[172,6]]},"542":{"position":[[288,6],[379,6],[433,6]]},"554":{"position":[[475,6],[516,6],[739,6]]},"556":{"position":[[285,6],[744,6]]},"559":{"position":[[185,6]]},"562":{"position":[[1,6],[42,6],[1036,6]]},"563":{"position":[[198,6],[252,6],[330,6]]},"564":{"position":[[186,6],[227,6],[316,6]]},"579":{"position":[[167,6],[208,6]]},"580":{"position":[[299,6],[337,6]]},"598":{"position":[[267,6],[308,6]]},"601":{"position":[[377,6],[415,6]]},"612":{"position":[[1748,6]]},"613":{"position":[[522,9]]},"632":{"position":[[1039,6],[1093,6],[2108,6]]},"638":{"position":[[221,6]]},"646":{"position":[[1,6],[37,6]]},"650":{"position":[[33,6]]},"652":{"position":[[1,6],[37,6]]},"653":{"position":[[117,6],[158,6],[675,9]]},"659":{"position":[[288,6],[430,6]]},"661":{"position":[[834,6],[879,6],[1623,6]]},"662":{"position":[[1601,6],[1625,6],[1679,6],[1760,6],[1861,6],[1919,6]]},"673":{"position":[[1,6]]},"675":{"position":[[219,6]]},"676":{"position":[[293,6]]},"680":{"position":[[295,6],[342,6],[444,6],[530,6],[571,6]]},"698":{"position":[[829,9]]},"699":{"position":[[616,10]]},"700":{"position":[[734,9]]},"707":{"position":[[348,9]]},"710":{"position":[[303,9],[1540,6],[1581,6]]},"717":{"position":[[549,6],[638,6],[1052,6]]},"718":{"position":[[94,6],[209,6]]},"724":{"position":[[80,8],[172,6],[244,6],[435,6]]},"728":{"position":[[231,6],[258,6]]},"732":{"position":[[4,6],[53,6],[109,6]]},"734":{"position":[[125,6],[202,6],[409,6]]},"738":{"position":[[77,6],[113,6]]},"739":{"position":[[189,6]]},"740":{"position":[[416,6]]},"745":{"position":[[196,6],[264,6]]},"749":{"position":[[13312,6],[13416,8]]},"754":{"position":[[194,6]]},"759":{"position":[[87,6],[152,6],[232,6]]},"760":{"position":[[263,6],[328,6],[419,6]]},"761":{"position":[[345,9],[452,6],[578,6],[700,6]]},"772":{"position":[[542,6],[634,6],[675,6],[1421,6],[1462,6],[1557,6],[2129,6],[2255,6],[2319,6]]},"773":{"position":[[436,6],[477,6]]},"774":{"position":[[439,6],[480,6],[558,6]]},"783":{"position":[[146,9],[476,9]]},"797":{"position":[[160,10]]},"798":{"position":[[53,9],[216,9]]},"820":{"position":[[1,6],[71,6]]},"821":{"position":[[536,9]]},"825":{"position":[[85,7],[93,6],[168,6],[542,6],[593,6],[641,6],[743,8]]},"829":{"position":[[459,6],[513,6],[1241,6],[1293,6],[1350,6],[1893,6],[2317,6],[3229,6]]},"836":{"position":[[570,6],[624,6]]},"837":{"position":[[1499,6],[1540,6],[1576,6],[1622,6],[1669,6],[1712,6],[1784,6]]},"838":{"position":[[1918,6],[1942,6],[1983,6],[2059,6]]},"846":{"position":[[48,6]]},"848":{"position":[[1166,6]]},"852":{"position":[[63,6],[114,6]]},"854":{"position":[[92,6],[134,6]]},"857":{"position":[[205,6]]},"862":{"position":[[184,6],[218,6],[289,6],[370,6],[448,6]]},"866":{"position":[[104,6],[344,6]]},"872":{"position":[[845,6],[1540,6],[1594,6],[2280,6],[3100,6],[3161,6],[3775,6],[3816,6],[3880,6]]},"875":{"position":[[203,6],[327,6],[798,6],[837,6],[2021,6],[4267,6],[4316,6],[8039,6],[9458,6]]},"878":{"position":[[34,8],[180,6]]},"886":{"position":[[916,6]]},"888":{"position":[[343,6]]},"889":{"position":[[383,6]]},"892":{"position":[[1,6],[42,6]]},"893":{"position":[[89,6]]},"894":{"position":[[105,9]]},"898":{"position":[[2165,6],[2219,6],[2974,6],[3231,6]]},"904":{"position":[[565,6],[619,6],[1267,6],[1305,6]]},"906":{"position":[[886,6]]},"911":{"position":[[505,6],[570,6]]},"915":{"position":[[69,6],[105,6]]},"917":{"position":[[81,6]]},"932":{"position":[[678,6],[771,6]]},"952":{"position":[[172,6],[208,6]]},"953":{"position":[[4,6],[70,6],[180,9]]},"958":{"position":[[748,6]]},"960":{"position":[[133,6],[187,6]]},"962":{"position":[[658,6],[879,6]]},"968":{"position":[[373,6]]},"971":{"position":[[284,6],[320,6]]},"972":{"position":[[4,6],[69,6]]},"975":{"position":[[185,9],[252,9]]},"977":{"position":[[539,6]]},"978":{"position":[[87,6]]},"988":{"position":[[115,6],[181,6]]},"989":{"position":[[343,6]]},"1012":{"position":[[77,6],[113,6]]},"1041":{"position":[[150,6],[186,6]]},"1059":{"position":[[125,6]]},"1064":{"position":[[107,6],[143,6]]},"1090":{"position":[[445,6],[511,6],[577,6],[668,6]]},"1093":{"position":[[370,9]]},"1097":{"position":[[121,6],[331,6],[604,6]]},"1098":{"position":[[171,6],[232,6]]},"1099":{"position":[[153,6],[214,6]]},"1102":{"position":[[849,6]]},"1114":{"position":[[188,6],[432,6],[486,6],[604,6]]},"1118":{"position":[[340,6],[415,6]]},"1119":{"position":[[359,6],[395,6]]},"1121":{"position":[[329,6]]},"1125":{"position":[[44,6],[153,6],[194,6]]},"1130":{"position":[[1,6],[42,6]]},"1134":{"position":[[1,6],[42,6]]},"1138":{"position":[[34,6],[143,6],[184,6]]},"1139":{"position":[[241,6],[282,6]]},"1140":{"position":[[457,6],[498,6]]},"1144":{"position":[[3,6],[29,6],[83,6]]},"1145":{"position":[[233,6],[287,6]]},"1148":{"position":[[490,6],[519,6],[573,6],[637,6]]},"1149":{"position":[[612,6],[663,6],[732,6],[796,6]]},"1151":{"position":[[870,6]]},"1154":{"position":[[198,6],[312,6]]},"1156":{"position":[[263,6],[282,6]]},"1158":{"position":[[3,6],[23,6],[77,6]]},"1159":{"position":[[209,6],[263,6]]},"1163":{"position":[[2,6],[82,6]]},"1164":{"position":[[75,6],[1344,9]]},"1168":{"position":[[17,6],[58,6]]},"1172":{"position":[[1,6],[42,6]]},"1175":{"position":[[450,9]]},"1178":{"position":[[867,6]]},"1182":{"position":[[2,6],[82,6]]},"1184":{"position":[[368,6],[448,6],[535,6]]},"1189":{"position":[[122,6],[268,6],[309,6]]},"1201":{"position":[[1,6],[42,6]]},"1204":{"position":[[228,6]]},"1207":{"position":[[221,9]]},"1210":{"position":[[283,6],[324,6]]},"1211":{"position":[[532,6],[573,6]]},"1212":{"position":[[295,6],[365,6]]},"1213":{"position":[[592,6]]},"1218":{"position":[[285,6],[616,6],[694,6]]},"1219":{"position":[[263,6],[329,6],[777,6]]},"1222":{"position":[[1,6],[79,6],[800,10]]},"1225":{"position":[[128,6],[205,6]]},"1226":{"position":[[1,6],[42,6],[122,6]]},"1227":{"position":[[551,6],[592,6]]},"1229":{"position":[[200,6]]},"1231":{"position":[[441,6],[518,6],[598,6],[652,6]]},"1237":{"position":[[497,6],[568,6],[645,6],[734,6]]},"1238":{"position":[[443,6],[521,6],[595,6],[675,6]]},"1239":{"position":[[476,6],[590,6],[677,6]]},"1263":{"position":[[14,6],[91,6]]},"1264":{"position":[[1,6],[42,6]]},"1265":{"position":[[545,6],[586,6]]},"1268":{"position":[[406,6],[569,6],[646,6]]},"1271":{"position":[[745,6],[1085,6],[1117,6],[1361,6]]},"1274":{"position":[[1,6],[42,6],[263,6]]},"1275":{"position":[[119,6],[160,6],[261,6]]},"1276":{"position":[[391,6],[432,6],[721,6],[788,6]]},"1277":{"position":[[142,6],[183,6],[285,6],[717,6],[814,6]]},"1278":{"position":[[245,6],[286,6],[392,6],[697,6],[738,6],[839,6]]},"1279":{"position":[[310,6],[351,6],[457,6],[501,6],[582,6]]},"1280":{"position":[[241,6],[282,6],[370,6]]},"1281":{"position":[[107,6]]},"1286":{"position":[[191,6],[262,6]]},"1287":{"position":[[228,6],[308,6]]},"1288":{"position":[[174,6],[268,6]]},"1290":{"position":[[1,6]]},"1291":{"position":[[1,6]]},"1294":{"position":[[1942,10]]},"1309":{"position":[[436,6]]},"1319":{"position":[[525,9]]}},"keywords":{}}],["import('rxdb/plugins/dev",{"_index":3845,"title":{},"content":{"672":{"position":[[90,24]]},"673":{"position":[[96,24]]},"674":{"position":[[379,24]]}},"keywords":{}}],["import.meta.url",{"_index":2266,"title":{},"content":{"392":{"position":[[3963,19]]},"1268":{"position":[[518,18]]}},"keywords":{}}],["importjson",{"_index":5366,"title":{"953":{"position":[[0,13]]},"972":{"position":[[0,13]]}},"content":{"952":{"position":[[107,12]]},"971":{"position":[[219,12]]}},"keywords":{}}],["impos",{"_index":945,"title":{},"content":{"66":{"position":[[421,6]]},"276":{"position":[[112,7]]},"361":{"position":[[189,8]]},"427":{"position":[[1487,6]]},"545":{"position":[[176,6]]},"605":{"position":[[176,6]]}},"keywords":{}}],["imposs",{"_index":263,"title":{},"content":{"15":{"position":[[478,10]]},"412":{"position":[[6908,11]]},"1006":{"position":[[150,10]]},"1124":{"position":[[860,10]]},"1317":{"position":[[347,11]]}},"keywords":{}}],["impract",{"_index":1411,"title":{},"content":{"228":{"position":[[86,11]]},"408":{"position":[[720,11]]},"412":{"position":[[7318,12]]}},"keywords":{}}],["impress",{"_index":930,"title":{},"content":{"65":{"position":[[1518,11]]},"433":{"position":[[234,10]]}},"keywords":{}}],["improv",{"_index":512,"title":{"224":{"position":[[0,8]]},"404":{"position":[[16,12]]},"469":{"position":[[9,13]]},"470":{"position":[[7,13]]}},"content":{"33":{"position":[[113,8]]},"65":{"position":[[1877,8]]},"78":{"position":[[77,9]]},"87":{"position":[[164,7]]},"91":{"position":[[175,8]]},"92":{"position":[[151,8]]},"93":{"position":[[220,8]]},"108":{"position":[[182,8]]},"111":{"position":[[132,8]]},"138":{"position":[[4,7]]},"141":{"position":[[37,7]]},"173":{"position":[[2631,8]]},"174":{"position":[[2486,8]]},"194":{"position":[[161,9]]},"197":{"position":[[194,8]]},"224":{"position":[[26,8]]},"234":{"position":[[231,8]]},"236":{"position":[[103,9],[251,8]]},"241":{"position":[[523,8]]},"266":{"position":[[1018,7]]},"281":{"position":[[290,8]]},"294":{"position":[[202,9]]},"311":{"position":[[160,9]]},"342":{"position":[[116,7]]},"350":{"position":[[364,9]]},"354":{"position":[[1187,8]]},"385":{"position":[[330,9]]},"386":{"position":[[345,13]]},"392":{"position":[[3161,7]]},"396":{"position":[[53,7],[740,9]]},"399":{"position":[[46,8]]},"402":{"position":[[40,7],[163,8],[767,7],[922,12],[1023,8],[1656,7],[1746,7],[2553,7],[2711,7]]},"407":{"position":[[1094,9]]},"408":{"position":[[4249,12]]},"410":{"position":[[1256,9]]},"411":{"position":[[5737,8]]},"420":{"position":[[930,9]]},"452":{"position":[[493,13],[549,8],[684,13]]},"467":{"position":[[520,8]]},"469":{"position":[[35,12],[433,8],[755,8],[1001,7],[1089,7],[1201,7]]},"470":{"position":[[442,8],[597,7]]},"483":{"position":[[823,7]]},"485":{"position":[[49,9]]},"528":{"position":[[63,7]]},"588":{"position":[[113,9]]},"617":{"position":[[846,7]]},"641":{"position":[[297,8]]},"656":{"position":[[434,7]]},"780":{"position":[[133,8]]},"798":{"position":[[790,7]]},"801":{"position":[[60,7]]},"876":{"position":[[371,7]]},"894":{"position":[[118,7]]},"902":{"position":[[135,9]]},"947":{"position":[[52,8]]},"1066":{"position":[[240,7],[596,7]]},"1071":{"position":[[483,7]]},"1072":{"position":[[388,7]]},"1083":{"position":[[319,12]]},"1085":{"position":[[2359,8]]},"1120":{"position":[[506,7]]},"1124":{"position":[[1715,8]]},"1125":{"position":[[691,7]]},"1134":{"position":[[673,7]]},"1143":{"position":[[583,8]]},"1151":{"position":[[378,9]]},"1161":{"position":[[1,8]]},"1178":{"position":[[377,9]]},"1180":{"position":[[1,8]]},"1206":{"position":[[571,8]]},"1230":{"position":[[194,7]]},"1238":{"position":[[413,7]]},"1246":{"position":[[273,7],[593,7],[1041,11],[1505,7]]},"1294":{"position":[[74,7],[187,8],[1885,12]]},"1295":{"position":[[661,11]]},"1296":{"position":[[9,7],[522,7],[1635,7]]},"1297":{"position":[[171,7],[438,7],[489,11]]},"1298":{"position":[[68,11],[346,11]]}},"keywords":{}}],["inaccess",{"_index":1689,"title":{},"content":{"291":{"position":[[265,12]]}},"keywords":{}}],["inact",{"_index":3652,"title":{},"content":{"618":{"position":[[320,11]]}},"keywords":{}}],["inadvert",{"_index":4671,"title":{},"content":{"802":{"position":[[487,13]]}},"keywords":{}}],["inc",{"_index":3867,"title":{},"content":{"678":{"position":[[290,5]]},"680":{"position":[[1381,5]]},"681":{"position":[[328,4],[802,5]]},"683":{"position":[[1007,5]]},"1041":{"position":[[299,5]]},"1044":{"position":[[314,5]]},"1059":{"position":[[302,5]]}},"keywords":{}}],["includ",{"_index":113,"title":{},"content":{"8":{"position":[[436,8]]},"19":{"position":[[41,8]]},"34":{"position":[[579,9]]},"65":{"position":[[1867,9]]},"94":{"position":[[20,9]]},"105":{"position":[[78,9]]},"112":{"position":[[87,9]]},"129":{"position":[[400,9]]},"131":{"position":[[98,8]]},"162":{"position":[[143,8]]},"173":{"position":[[2221,9]]},"174":{"position":[[2693,9]]},"189":{"position":[[103,8]]},"201":{"position":[[146,10]]},"222":{"position":[[21,9]]},"267":{"position":[[100,8]]},"270":{"position":[[71,9]]},"282":{"position":[[127,9]]},"285":{"position":[[60,9]]},"298":{"position":[[785,7]]},"299":{"position":[[1243,8]]},"310":{"position":[[80,8]]},"333":{"position":[[204,9]]},"357":{"position":[[124,9]]},"358":{"position":[[206,8]]},"368":{"position":[[140,9]]},"376":{"position":[[220,8]]},"390":{"position":[[922,9]]},"392":{"position":[[1432,8]]},"407":{"position":[[1006,7]]},"412":{"position":[[9199,10]]},"425":{"position":[[157,9]]},"434":{"position":[[262,8]]},"444":{"position":[[217,7]]},"513":{"position":[[263,7]]},"524":{"position":[[201,8]]},"530":{"position":[[346,9]]},"567":{"position":[[956,9]]},"612":{"position":[[1572,8]]},"624":{"position":[[963,9]]},"640":{"position":[[114,8]]},"690":{"position":[[103,8]]},"691":{"position":[[603,8]]},"723":{"position":[[2147,9]]},"749":{"position":[[2515,8]]},"824":{"position":[[577,8]]},"829":{"position":[[229,9]]},"832":{"position":[[6,8],[103,9]]},"835":{"position":[[565,8]]},"836":{"position":[[262,7]]},"838":{"position":[[413,8]]},"886":{"position":[[4277,8],[4840,8]]},"890":{"position":[[617,7],[856,10]]},"898":{"position":[[1997,7]]},"911":{"position":[[484,8]]},"1292":{"position":[[754,9]]}},"keywords":{}}],["includewshead",{"_index":5140,"title":{},"content":{"886":{"position":[[4249,17]]}},"keywords":{}}],["inclus",{"_index":6032,"title":{},"content":{"1132":{"position":[[1434,9]]}},"keywords":{}}],["incognito",{"_index":1873,"title":{},"content":{"305":{"position":[[328,9]]}},"keywords":{}}],["incom",{"_index":2152,"title":{},"content":{"379":{"position":[[250,8]]},"410":{"position":[[1992,8]]},"411":{"position":[[3448,8]]},"490":{"position":[[104,8]]},"496":{"position":[[757,8]]},"898":{"position":[[3500,8]]},"1318":{"position":[[911,8]]}},"keywords":{}}],["inconsist",{"_index":1428,"title":{},"content":{"237":{"position":[[269,16]]},"590":{"position":[[907,16]]}},"keywords":{}}],["inconveni",{"_index":6088,"title":{},"content":{"1151":{"position":[[301,14]]},"1178":{"position":[[300,14]]}},"keywords":{}}],["incorpor",{"_index":1053,"title":{},"content":{"113":{"position":[[6,12]]},"174":{"position":[[1566,12]]},"283":{"position":[[291,13]]},"365":{"position":[[6,13]]},"491":{"position":[[605,11]]},"981":{"position":[[1209,13]]}},"keywords":{}}],["incorrectli",{"_index":5656,"title":{},"content":{"1033":{"position":[[234,12]]}},"keywords":{}}],["increas",{"_index":673,"title":{},"content":{"43":{"position":[[423,9]]},"69":{"position":[[76,8]]},"281":{"position":[[433,9]]},"394":{"position":[[1467,10]]},"402":{"position":[[1518,10]]},"403":{"position":[[419,8],[522,8]]},"408":{"position":[[826,9]]},"412":{"position":[[8943,9],[9157,8],[9273,9]]},"463":{"position":[[1089,9]]},"617":{"position":[[1619,9]]},"623":{"position":[[83,8]]},"696":{"position":[[1698,8]]},"698":{"position":[[2836,9],[2971,9]]},"772":{"position":[[470,8]]},"773":{"position":[[767,8],[823,8]]},"780":{"position":[[209,8]]},"782":{"position":[[107,8]]},"800":{"position":[[525,8]]},"802":{"position":[[501,8]]},"902":{"position":[[257,9]]},"1041":{"position":[[317,9]]},"1044":{"position":[[332,9]]},"1059":{"position":[[320,9]]},"1061":{"position":[[221,9]]},"1085":{"position":[[3300,8]]},"1089":{"position":[[16,9]]},"1095":{"position":[[206,8]]},"1115":{"position":[[184,8],[252,9],[357,8]]},"1162":{"position":[[609,8]]},"1181":{"position":[[697,8]]},"1198":{"position":[[644,8]]},"1237":{"position":[[201,8]]},"1239":{"position":[[453,8]]},"1270":{"position":[[220,9]]},"1282":{"position":[[242,9]]},"1292":{"position":[[789,9]]},"1295":{"position":[[369,9],[714,10],[1025,9]]},"1305":{"position":[[637,9]]}},"keywords":{}}],["increasingli",{"_index":1419,"title":{},"content":{"232":{"position":[[23,12]]},"320":{"position":[[399,12]]},"369":{"position":[[671,12]]},"375":{"position":[[865,12]]},"407":{"position":[[353,12]]},"410":{"position":[[1124,12]]},"574":{"position":[[528,12]]}},"keywords":{}}],["increment",{"_index":2671,"title":{"1044":{"position":[[27,11]]}},"content":{"412":{"position":[[2604,13]]},"491":{"position":[[242,11]]},"636":{"position":[[91,11]]},"678":{"position":[[257,9]]},"680":{"position":[[1309,10]]},"683":{"position":[[980,9]]},"696":{"position":[[1495,10]]},"723":{"position":[[1544,13],[1667,11],[1967,11]]},"870":{"position":[[94,11]]},"896":{"position":[[202,11]]},"948":{"position":[[285,11]]},"1044":{"position":[[245,11]]},"1300":{"position":[[374,11]]},"1307":{"position":[[684,11]]}},"keywords":{}}],["incrementalmodifi",{"_index":5749,"title":{"1061":{"position":[[11,20]]}},"content":{"1307":{"position":[[721,20]]}},"keywords":{}}],["incrementalpatch",{"_index":5746,"title":{"1060":{"position":[[10,19]]}},"content":{"1307":{"position":[[742,18]]}},"keywords":{}}],["incrementalremov",{"_index":5752,"title":{"1062":{"position":[[11,20]]}},"content":{},"keywords":{}}],["incrementalupsert",{"_index":5346,"title":{"948":{"position":[[0,20]]}},"content":{"1307":{"position":[[764,20]]}},"keywords":{}}],["incur",{"_index":2899,"title":{},"content":{"429":{"position":[[333,5]]},"621":{"position":[[370,6]]}},"keywords":{}}],["indefinit",{"_index":1865,"title":{},"content":{"305":{"position":[[27,12]]},"451":{"position":[[795,12]]}},"keywords":{}}],["independ",{"_index":3041,"title":{},"content":{"464":{"position":[[111,11]]},"611":{"position":[[457,13]]},"831":{"position":[[387,11]]},"839":{"position":[[102,11]]},"1140":{"position":[[198,13]]}},"keywords":{}}],["index",{"_index":60,"title":{"138":{"position":[[0,8]]},"194":{"position":[[0,8]]},"342":{"position":[[0,8]]},"395":{"position":[[0,8]]},"396":{"position":[[7,8]]},"397":{"position":[[8,7]]},"398":{"position":[[54,8]]},"459":{"position":[[0,8]]},"507":{"position":[[0,8]]},"527":{"position":[[0,8]]},"587":{"position":[[0,8]]},"796":{"position":[[68,5]]},"797":{"position":[[15,6]]},"798":{"position":[[26,5]]},"1022":{"position":[[12,5]]},"1066":{"position":[[19,6]]},"1079":{"position":[[0,8]]},"1080":{"position":[[0,5]]},"1107":{"position":[[12,8]]},"1296":{"position":[[7,8]]}},"content":{"4":{"position":[[73,8]]},"33":{"position":[[434,5]]},"40":{"position":[[538,9]]},"45":{"position":[[236,8]]},"47":{"position":[[544,8]]},"138":{"position":[[57,7],[103,8],[234,8]]},"166":{"position":[[1,8],[83,8],[106,8],[205,7]]},"170":{"position":[[394,9]]},"188":{"position":[[1406,8]]},"194":{"position":[[1,8],[72,7],[133,7]]},"205":{"position":[[143,7]]},"212":{"position":[[270,9]]},"252":{"position":[[94,10],[170,7]]},"260":{"position":[[185,8]]},"262":{"position":[[425,8]]},"283":{"position":[[54,8]]},"342":{"position":[[8,7],[91,8]]},"346":{"position":[[811,7]]},"356":{"position":[[242,5]]},"358":{"position":[[337,8],[954,8]]},"360":{"position":[[748,9]]},"362":{"position":[[695,9]]},"369":{"position":[[224,8]]},"376":{"position":[[453,9],[481,7]]},"385":{"position":[[181,7]]},"395":{"position":[[201,5],[288,5],[499,8]]},"396":{"position":[[27,8],[832,8],[931,5],[1058,5],[1158,5],[1200,5],[1448,5],[1684,5],[1743,8]]},"397":{"position":[[26,5],[134,5],[451,5],[880,5],[1340,5],[1510,5],[1604,5],[1718,5],[2025,5]]},"398":{"position":[[38,7],[143,8],[404,7],[475,5],[521,5],[1766,5],[1886,5],[3266,9]]},"400":{"position":[[77,5],[103,5],[138,5],[427,7],[469,5]]},"402":{"position":[[976,7],[1015,7],[1464,5]]},"403":{"position":[[21,5],[704,5]]},"408":{"position":[[5104,8]]},"412":{"position":[[9506,10],[10461,8]]},"427":{"position":[[874,9],[903,8]]},"432":{"position":[[427,8]]},"452":{"position":[[216,7],[326,7]]},"453":{"position":[[827,8]]},"457":{"position":[[398,8]]},"459":{"position":[[156,7],[276,8],[325,7],[507,5],[740,5],[1037,7],[1077,5]]},"462":{"position":[[941,7]]},"468":{"position":[[256,5]]},"469":{"position":[[248,5]]},"507":{"position":[[94,8]]},"523":{"position":[[675,6]]},"527":{"position":[[11,8],[111,7]]},"559":{"position":[[1452,9]]},"560":{"position":[[272,9],[476,5]]},"566":{"position":[[144,7],[279,5],[390,8]]},"587":{"position":[[13,7]]},"590":{"position":[[601,8],[651,7]]},"636":{"position":[[70,8]]},"659":{"position":[[867,7]]},"723":{"position":[[22,8],[361,8],[662,8],[921,8],[995,8],[1123,7],[1159,5],[1330,8],[1360,5],[1434,5],[1535,5],[1950,5]]},"724":{"position":[[607,8],[1091,5],[1228,5],[1304,5]]},"749":{"position":[[2398,5],[2712,5],[17910,6],[17938,5],[18060,5],[18514,7],[18608,7],[18837,5],[19381,7],[19464,7],[20169,6],[20334,6],[20489,5],[20593,6],[20761,6],[21354,7],[21487,7],[23022,5]]},"772":{"position":[[335,7]]},"796":{"position":[[78,5],[203,5],[381,5],[677,5],[828,6],[1097,5]]},"797":{"position":[[85,5],[113,8],[214,5],[318,5],[324,6]]},"798":{"position":[[39,5],[96,5],[152,5],[428,5],[781,5],[911,6],[1037,8]]},"801":{"position":[[697,9]]},"821":{"position":[[63,7],[173,7],[501,7],[601,5],[1017,5]]},"841":{"position":[[395,7]]},"854":{"position":[[1285,7]]},"1022":{"position":[[121,9],[251,8]]},"1023":{"position":[[40,5]]},"1065":{"position":[[1909,8]]},"1066":{"position":[[118,7],[230,6],[289,5],[587,5],[717,6]]},"1067":{"position":[[919,5],[1216,5],[1446,5],[1503,5],[1818,7],[2239,7]]},"1068":{"position":[[20,7]]},"1071":{"position":[[395,7]]},"1072":{"position":[[2837,7]]},"1074":{"position":[[181,8]]},"1079":{"position":[[25,7],[91,5],[203,6],[437,7],[535,7],[643,6]]},"1080":{"position":[[67,9],[323,6],[513,6],[788,6],[816,8],[875,5],[969,5]]},"1085":{"position":[[681,6],[998,5]]},"1107":{"position":[[20,7],[438,7],[920,7],[984,7]]},"1123":{"position":[[553,8]]},"1132":{"position":[[106,8],[158,7],[312,7]]},"1143":{"position":[[374,7],[470,7]]},"1164":{"position":[[362,7],[396,7]]},"1271":{"position":[[370,8]]},"1294":{"position":[[474,5],[566,7],[938,5],[963,8],[1084,5]]},"1295":{"position":[[1132,6]]},"1296":{"position":[[1,7],[172,5],[342,6],[393,6],[448,5],[506,5],[558,5],[652,5],[855,5],[979,5],[1026,7],[1063,5],[1110,5],[1173,6],[1338,5],[1447,5],[1617,5],[1738,8],[1842,8],[1869,7]]}},"keywords":{}}],["index.getall(keyrang",{"_index":2999,"title":{},"content":{"459":{"position":[[797,23]]}},"keywords":{}}],["index.getall(rang",{"_index":6437,"title":{},"content":{"1294":{"position":[[1474,19]]}},"keywords":{}}],["index.j",{"_index":4582,"title":{},"content":{"773":{"position":[[895,8]]}},"keywords":{}}],["indexdb",{"_index":2906,"title":{},"content":{"432":{"position":[[398,7]]}},"keywords":{}}],["indexdist",{"_index":2415,"title":{},"content":{"398":{"position":[[1810,13],[2026,13],[2290,14],[3395,14]]},"402":{"position":[[1168,13]]}},"keywords":{}}],["indexeddb",{"_index":52,"title":{"3":{"position":[[0,10]]},"4":{"position":[[0,10]]},"44":{"position":[[57,9]]},"45":{"position":[[8,11]]},"46":{"position":[[8,9]]},"47":{"position":[[16,9]]},"56":{"position":[[8,9]]},"58":{"position":[[15,10]]},"59":{"position":[[16,10]]},"64":{"position":[[0,10]]},"297":{"position":[[0,9]]},"298":{"position":[[4,9]]},"299":{"position":[[17,9]]},"300":{"position":[[22,9]]},"301":{"position":[[19,9]]},"304":{"position":[[0,9]]},"305":{"position":[[41,11]]},"432":{"position":[[16,10]]},"448":{"position":[[17,9]]},"452":{"position":[[8,10]]},"521":{"position":[[0,9]]},"532":{"position":[[0,9]]},"533":{"position":[[8,11]]},"534":{"position":[[8,9]]},"535":{"position":[[21,10]]},"543":{"position":[[6,9]]},"545":{"position":[[15,10]]},"546":{"position":[[16,10]]},"560":{"position":[[25,10]]},"566":{"position":[[26,9]]},"592":{"position":[[0,9]]},"593":{"position":[[8,11]]},"594":{"position":[[8,9]]},"595":{"position":[[21,10]]},"603":{"position":[[4,9]]},"605":{"position":[[15,10]]},"606":{"position":[[16,10]]},"709":{"position":[[15,9]]},"1136":{"position":[[0,9]]},"1137":{"position":[[0,9]]},"1138":{"position":[[10,9]]},"1139":{"position":[[30,10]]},"1141":{"position":[[19,9]]},"1143":{"position":[[12,9]]},"1145":{"position":[[30,9]]},"1243":{"position":[[3,10]]},"1293":{"position":[[4,9]]},"1295":{"position":[[0,9]]},"1299":{"position":[[20,10]]}},"content":{"3":{"position":[[5,9],[49,9]]},"4":{"position":[[27,9],[303,9],[360,13]]},"16":{"position":[[311,10]]},"24":{"position":[[203,10]]},"28":{"position":[[209,11]]},"31":{"position":[[44,9],[126,10],[147,9],[292,9]]},"32":{"position":[[207,9]]},"33":{"position":[[40,10],[91,10],[212,9],[592,9]]},"35":{"position":[[163,10]]},"45":{"position":[[1,9],[200,9]]},"46":{"position":[[100,9]]},"47":{"position":[[47,9],[97,9],[254,9],[719,9],[963,10],[1066,9],[1186,9]]},"51":{"position":[[159,9],[540,9]]},"58":{"position":[[7,9],[134,9],[219,10],[299,10],[353,10]]},"64":{"position":[[1,10]]},"65":{"position":[[1963,9]]},"66":{"position":[[49,10]]},"100":{"position":[[264,10]]},"120":{"position":[[107,10]]},"131":{"position":[[234,9],[264,9],[652,11]]},"155":{"position":[[199,10]]},"161":{"position":[[98,10],[171,10]]},"162":{"position":[[273,9]]},"181":{"position":[[48,10]]},"207":{"position":[[127,9]]},"227":{"position":[[238,10]]},"245":{"position":[[61,9]]},"254":{"position":[[321,9]]},"266":{"position":[[103,10]]},"287":{"position":[[501,9]]},"299":{"position":[[1,9],[1597,9],[1692,9]]},"302":{"position":[[213,9]]},"304":{"position":[[73,9],[330,9]]},"305":{"position":[[1,9]]},"306":{"position":[[28,9],[321,9]]},"322":{"position":[[55,9]]},"331":{"position":[[63,9]]},"336":{"position":[[192,9],[519,9]]},"365":{"position":[[921,9]]},"368":{"position":[[150,10]]},"383":{"position":[[370,9]]},"384":{"position":[[103,12]]},"396":{"position":[[1567,10]]},"400":{"position":[[381,9]]},"402":{"position":[[2744,9]]},"408":{"position":[[423,10],[658,9],[857,9],[2027,9],[3954,9]]},"411":{"position":[[4190,9]]},"412":{"position":[[7723,9],[7897,9],[9830,9]]},"429":{"position":[[149,9],[649,10]]},"432":{"position":[[126,9],[181,9],[346,9],[531,9],[679,10],[731,9],[868,9],[983,9],[1092,9],[1302,9],[1329,9]]},"435":{"position":[[225,10],[293,10]]},"441":{"position":[[407,10]]},"442":{"position":[[71,9]]},"452":{"position":[[1,9],[78,9],[194,9],[433,9],[623,9]]},"457":{"position":[[207,9]]},"458":{"position":[[799,9],[905,9]]},"459":{"position":[[238,9],[440,9],[994,9]]},"461":{"position":[[910,9],[1015,9],[1453,9],[1532,10]]},"463":{"position":[[319,9],[758,11],[823,9],[1233,9]]},"464":{"position":[[314,9],[409,11],[681,9]]},"465":{"position":[[176,9],[270,11]]},"466":{"position":[[139,9],[233,11]]},"467":{"position":[[111,9],[208,11]]},"469":{"position":[[103,9],[739,10]]},"479":{"position":[[315,11]]},"489":{"position":[[265,11]]},"495":{"position":[[801,9]]},"504":{"position":[[214,9]]},"513":{"position":[[146,9]]},"520":{"position":[[194,9]]},"521":{"position":[[7,9],[279,9],[374,9],[675,10]]},"524":{"position":[[934,9]]},"533":{"position":[[1,9]]},"534":{"position":[[35,9],[160,10]]},"535":{"position":[[7,9],[139,9],[259,9],[604,9],[714,9],[921,9],[1123,10],[1192,9]]},"536":{"position":[[61,9]]},"538":{"position":[[95,9]]},"545":{"position":[[7,9],[78,9]]},"548":{"position":[[183,10],[314,9]]},"560":{"position":[[429,10],[638,9]]},"561":{"position":[[185,9]]},"566":{"position":[[29,9],[775,9]]},"576":{"position":[[47,9]]},"581":{"position":[[590,9]]},"593":{"position":[[1,9]]},"594":{"position":[[33,9],[158,10]]},"595":{"position":[[7,9],[139,9],[272,9],[631,9],[735,9],[996,9],[1200,10],[1269,9]]},"596":{"position":[[59,9]]},"598":{"position":[[95,9]]},"605":{"position":[[7,9],[78,9]]},"608":{"position":[[183,10],[312,9]]},"631":{"position":[[154,10]]},"640":{"position":[[124,9]]},"641":{"position":[[227,9]]},"660":{"position":[[55,10]]},"662":{"position":[[649,11],[818,10]]},"696":{"position":[[856,10],[948,10],[1003,9]]},"697":{"position":[[28,9]]},"703":{"position":[[483,9],[513,9]]},"709":{"position":[[138,9],[660,9],[1203,9],[1238,9]]},"710":{"position":[[627,9],[1243,9],[2246,9]]},"714":{"position":[[389,10]]},"718":{"position":[[277,11]]},"745":{"position":[[332,11]]},"759":{"position":[[65,9],[220,11]]},"779":{"position":[[394,9]]},"793":{"position":[[203,9],[1326,9],[1353,9]]},"820":{"position":[[242,9]]},"856":{"position":[[96,10]]},"898":{"position":[[2099,10]]},"932":{"position":[[839,11]]},"981":{"position":[[1121,9]]},"1072":{"position":[[1805,9]]},"1137":{"position":[[121,9]]},"1138":{"position":[[12,9],[252,11]]},"1139":{"position":[[16,9],[48,9],[170,9],[350,11],[386,9],[439,12],[607,10]]},"1140":{"position":[[348,9],[435,9],[566,11],[666,10]]},"1141":{"position":[[215,9],[254,9]]},"1143":{"position":[[104,9],[425,9]]},"1145":{"position":[[16,9],[166,9],[375,9],[428,12],[592,10]]},"1148":{"position":[[236,9]]},"1154":{"position":[[380,11],[544,9]]},"1163":{"position":[[70,11],[191,9]]},"1165":{"position":[[180,9]]},"1170":{"position":[[134,9]]},"1172":{"position":[[152,10],[177,9],[268,9]]},"1173":{"position":[[110,10]]},"1182":{"position":[[70,11],[191,9]]},"1184":{"position":[[436,11]]},"1191":{"position":[[326,9]]},"1195":{"position":[[78,9]]},"1198":{"position":[[1369,9]]},"1206":{"position":[[184,9],[498,10]]},"1209":{"position":[[117,9],[461,10]]},"1222":{"position":[[1131,9],[1192,9],[1230,9]]},"1225":{"position":[[401,9]]},"1226":{"position":[[182,11]]},"1231":{"position":[[586,11]]},"1235":{"position":[[152,9]]},"1237":{"position":[[157,10],[802,11]]},"1238":{"position":[[663,11]]},"1243":{"position":[[5,9],[43,10]]},"1246":{"position":[[1010,11]]},"1247":{"position":[[204,9]]},"1263":{"position":[[159,11],[295,9]]},"1268":{"position":[[714,11]]},"1276":{"position":[[137,9],[244,9]]},"1292":{"position":[[206,9],[238,9],[270,9],[912,11]]},"1294":{"position":[[6,9],[235,9],[2145,9]]},"1295":{"position":[[406,9],[607,9]]},"1296":{"position":[[42,9],[1832,9],[1884,9]]},"1297":{"position":[[77,9]]},"1299":{"position":[[92,9],[331,9],[391,9],[510,9]]},"1300":{"position":[[36,10],[164,10],[386,9]]},"1302":{"position":[[46,9]]}},"keywords":{}}],["indexeddb"",{"_index":1449,"title":{},"content":{"243":{"position":[[195,15]]},"244":{"position":[[507,15]]}},"keywords":{}}],["indexeddb'",{"_index":730,"title":{},"content":{"47":{"position":[[497,11],[665,11]]},"61":{"position":[[286,11]]}},"keywords":{}}],["indexeddb.opf",{"_index":3512,"title":{},"content":{"581":{"position":[[234,14]]}},"keywords":{}}],["indexeddb.shar",{"_index":6274,"title":{},"content":{"1227":{"position":[[902,18]]}},"keywords":{}}],["indexeddb.worker.j",{"_index":6304,"title":{},"content":{"1265":{"position":[[876,22]]}},"keywords":{}}],["indexeddb/lib/fdbkeyrang",{"_index":6052,"title":{},"content":{"1139":{"position":[[490,28]]},"1145":{"position":[[479,28]]}},"keywords":{}}],["indexeddbstorag",{"_index":3329,"title":{},"content":{"545":{"position":[[142,16]]},"605":{"position":[[142,16]]}},"keywords":{}}],["indexeddbth",{"_index":3969,"title":{},"content":{"703":{"position":[[428,12]]}},"keywords":{}}],["indexeddb—a",{"_index":3415,"title":{},"content":{"560":{"position":[[184,11]]}},"keywords":{}}],["indexes.array",{"_index":4377,"title":{},"content":{"749":{"position":[[18727,13]]}},"keywords":{}}],["indexing.typescript",{"_index":3534,"title":{},"content":{"595":{"position":[[564,19]]}},"keywords":{}}],["indexkey",{"_index":4380,"title":{},"content":{"749":{"position":[[18943,8]]}},"keywords":{}}],["indexnrtostring(distancetoindex",{"_index":2403,"title":{},"content":{"398":{"position":[[1080,32],[1242,32],[2380,31],[2427,31]]}},"keywords":{}}],["indexnrtostring(indexvalu",{"_index":2387,"title":{},"content":{"397":{"position":[[2172,28]]}},"keywords":{}}],["indexopt",{"_index":4061,"title":{},"content":{"724":{"position":[[1482,13]]}},"keywords":{}}],["indexschema",{"_index":2357,"title":{},"content":{"397":{"position":[[472,11],[911,12],[942,12],[973,12],[1004,12],[1035,11]]}},"keywords":{}}],["indexvalu",{"_index":2384,"title":{},"content":{"397":{"position":[[2086,10]]}},"keywords":{}}],["indic",{"_index":446,"title":{},"content":{"27":{"position":[[396,9]]},"427":{"position":[[1407,10]]},"474":{"position":[[225,10]]},"602":{"position":[[267,9]]},"855":{"position":[[224,8]]},"861":{"position":[[1773,9]]},"867":{"position":[[219,8]]},"990":{"position":[[925,9]]}},"keywords":{}}],["indirect",{"_index":2561,"title":{},"content":{"408":{"position":[[3984,11]]}},"keywords":{}}],["indispens",{"_index":3238,"title":{},"content":{"506":{"position":[[140,13]]},"510":{"position":[[498,13]]}},"keywords":{}}],["individu",{"_index":968,"title":{},"content":{"75":{"position":[[36,10]]},"106":{"position":[[23,10]]},"174":{"position":[[1017,10]]},"279":{"position":[[246,10]]},"304":{"position":[[42,10]]},"369":{"position":[[357,10]]}},"keywords":{}}],["industri",{"_index":3450,"title":{},"content":{"569":{"position":[[256,10]]}},"keywords":{}}],["ineffici",{"_index":2063,"title":{},"content":{"358":{"position":[[579,11]]},"394":{"position":[[1762,11]]},"430":{"position":[[373,11]]},"624":{"position":[[1412,12]]}},"keywords":{}}],["inequ",{"_index":4890,"title":{},"content":{"858":{"position":[[471,10]]}},"keywords":{}}],["inevit",{"_index":2656,"title":{},"content":{"412":{"position":[[681,10],[3049,10]]},"474":{"position":[[57,10]]}},"keywords":{}}],["infin",{"_index":3646,"title":{},"content":{"617":{"position":[[1372,8]]},"749":{"position":[[21388,8],[21401,8]]},"1294":{"position":[[1333,9],[1367,9]]},"1296":{"position":[[1387,10],[1398,10],[1564,9]]}},"keywords":{}}],["infinit",{"_index":3274,"title":{},"content":{"523":{"position":[[559,11]]},"696":{"position":[[280,8]]},"1009":{"position":[[872,8]]},"1010":{"position":[[8,8],[70,8]]}},"keywords":{}}],["influenc",{"_index":1754,"title":{},"content":{"299":{"position":[[792,10]]}},"keywords":{}}],["info",{"_index":871,"title":{},"content":{"58":{"position":[[319,5]]},"546":{"position":[[216,5]]},"606":{"position":[[216,5]]},"746":{"position":[[749,5]]},"749":{"position":[[297,5]]}},"keywords":{}}],["inform",{"_index":906,"title":{},"content":{"65":{"position":[[214,12],[661,12],[1684,12]]},"95":{"position":[[82,12]]},"152":{"position":[[100,11]]},"158":{"position":[[332,12]]},"167":{"position":[[172,11]]},"173":{"position":[[1287,11]]},"195":{"position":[[156,11]]},"218":{"position":[[156,12]]},"279":{"position":[[267,11]]},"289":{"position":[[1384,12],[1976,11]]},"291":{"position":[[245,11],[411,12]]},"310":{"position":[[62,12]]},"343":{"position":[[123,12]]},"346":{"position":[[296,6]]},"377":{"position":[[217,12]]},"410":{"position":[[563,11]]},"441":{"position":[[622,8]]},"458":{"position":[[1229,6]]},"506":{"position":[[111,12]]},"526":{"position":[[143,11]]},"550":{"position":[[136,11],[226,12]]},"586":{"position":[[37,12]]},"610":{"position":[[435,12]]},"638":{"position":[[58,11],[102,12]]},"698":{"position":[[1145,11]]},"701":{"position":[[771,11]]},"875":{"position":[[8737,8],[9157,11]]},"880":{"position":[[129,6]]},"889":{"position":[[315,11]]},"890":{"position":[[911,11]]},"912":{"position":[[294,11]]},"1151":{"position":[[167,6]]},"1178":{"position":[[166,6]]}},"keywords":{}}],["infrastructur",{"_index":1227,"title":{},"content":{"174":{"position":[[3183,14]]},"201":{"position":[[60,14]]},"289":{"position":[[1216,15]]},"408":{"position":[[2177,14]]},"412":{"position":[[1443,14],[1925,15],[4167,15]]},"418":{"position":[[764,14]]},"485":{"position":[[110,15]]},"504":{"position":[[1480,14]]},"614":{"position":[[226,14]]},"619":{"position":[[163,14]]},"627":{"position":[[44,14],[242,15]]},"632":{"position":[[986,15]]},"686":{"position":[[483,15]]},"875":{"position":[[7671,15]]},"902":{"position":[[223,15]]}},"keywords":{}}],["infrastructure.optim",{"_index":6490,"title":{},"content":{"1304":{"position":[[1976,28]]}},"keywords":{}}],["inher",{"_index":1025,"title":{},"content":{"99":{"position":[[165,10]]},"226":{"position":[[130,10]]},"279":{"position":[[29,10]]},"281":{"position":[[146,10]]},"352":{"position":[[273,10]]},"545":{"position":[[42,8]]},"605":{"position":[[42,8]]}},"keywords":{}}],["inherit",{"_index":5127,"title":{},"content":{"886":{"position":[[1913,9]]}},"keywords":{}}],["init",{"_index":3037,"title":{},"content":{"463":{"position":[[1022,4]]},"1002":{"position":[[640,4],[1294,4]]}},"keywords":{}}],["initdatabas",{"_index":1941,"title":{},"content":{"334":{"position":[[299,14]]},"335":{"position":[[202,15]]},"579":{"position":[[308,14]]},"580":{"position":[[346,12],[444,15]]}},"keywords":{}}],["initdb",{"_index":778,"title":{},"content":{"51":{"position":[[650,8]]},"209":{"position":[[214,8]]},"255":{"position":[[561,8]]},"314":{"position":[[447,8]]},"480":{"position":[[305,8]]},"598":{"position":[[408,8]]},"601":{"position":[[424,6],[527,9]]},"829":{"position":[[1486,6],[1564,9]]}},"keywords":{}}],["initencrypteddatabas",{"_index":3345,"title":{},"content":{"554":{"position":[[820,23]]},"555":{"position":[[207,24]]}},"keywords":{}}],["initencrypteddb",{"_index":1896,"title":{},"content":{"315":{"position":[[398,17]]}},"keywords":{}}],["initi",{"_index":786,"title":{"70":{"position":[[0,14]]},"93":{"position":[[7,7]]},"101":{"position":[[0,14]]},"206":{"position":[[16,15]]},"217":{"position":[[10,7]]},"227":{"position":[[0,14]]},"463":{"position":[[0,14]]}},"content":{"52":{"position":[[23,12]]},"65":{"position":[[1273,7],[1375,7]]},"69":{"position":[[89,7]]},"70":{"position":[[64,14]]},"93":{"position":[[41,7],[201,14]]},"101":{"position":[[5,14],[176,14]]},"145":{"position":[[215,15]]},"173":{"position":[[1617,7],[1712,7]]},"206":{"position":[[66,7]]},"217":{"position":[[44,7]]},"227":{"position":[[82,14],[308,14]]},"253":{"position":[[85,14],[224,10]]},"266":{"position":[[1026,7]]},"299":{"position":[[448,7]]},"314":{"position":[[275,10]]},"334":{"position":[[111,12]]},"346":{"position":[[27,10]]},"411":{"position":[[118,7]]},"412":{"position":[[6177,8],[6643,7],[7194,10],[7281,7]]},"419":{"position":[[1461,12]]},"462":{"position":[[115,14]]},"463":{"position":[[191,14],[492,10]]},"468":{"position":[[471,9]]},"469":{"position":[[663,7],[768,7]]},"491":{"position":[[1182,9]]},"522":{"position":[[181,11]]},"539":{"position":[[23,12]]},"590":{"position":[[112,10]]},"599":{"position":[[23,12]]},"610":{"position":[[577,9],[1379,8]]},"612":{"position":[[731,10]]},"616":{"position":[[632,7]]},"636":{"position":[[346,15]]},"648":{"position":[[307,7]]},"653":{"position":[[651,7],[840,7]]},"656":{"position":[[318,7]]},"724":{"position":[[1194,10],[1281,10],[1371,15]]},"749":{"position":[[14834,7],[14990,7]]},"780":{"position":[[567,7]]},"783":{"position":[[495,7],[635,7]]},"829":{"position":[[1228,12],[2063,7]]},"844":{"position":[[8,7]]},"854":{"position":[[56,10]]},"886":{"position":[[4390,10]]},"901":{"position":[[214,7]]},"903":{"position":[[321,7]]},"984":{"position":[[10,7]]},"994":{"position":[[50,7],[238,7]]},"1013":{"position":[[798,7]]},"1115":{"position":[[285,9]]},"1119":{"position":[[170,7]]},"1161":{"position":[[102,7]]},"1162":{"position":[[521,7],[582,7]]},"1170":{"position":[[85,7],[240,7]]},"1180":{"position":[[102,7]]},"1181":{"position":[[608,7],[670,7]]},"1186":{"position":[[112,7]]},"1238":{"position":[[314,14],[347,7],[421,14]]},"1239":{"position":[[301,14]]},"1246":{"position":[[1801,7]]},"1267":{"position":[[359,7]]},"1295":{"position":[[725,7],[1005,14]]},"1299":{"position":[[167,7]]},"1301":{"position":[[1419,7]]},"1316":{"position":[[3531,9]]}},"keywords":{}}],["initialcheckpoint",{"_index":5535,"title":{"1002":{"position":[[17,18]]}},"content":{"1002":{"position":[[696,18],[1350,18]]}},"keywords":{}}],["initialis",{"_index":6129,"title":{},"content":{"1171":{"position":[[207,14],[319,14]]}},"keywords":{}}],["initialvalu",{"_index":840,"title":{},"content":{"55":{"position":[[495,13],[561,13]]},"1118":{"position":[[561,13],[600,12]]}},"keywords":{}}],["initsecuredb",{"_index":3135,"title":{},"content":{"482":{"position":[[395,14]]}},"keywords":{}}],["initzerolocaldb",{"_index":3703,"title":{},"content":{"632":{"position":[[1186,17]]}},"keywords":{}}],["inject",{"_index":844,"title":{},"content":{"55":{"position":[[809,7]]},"825":{"position":[[177,11],[189,6],[562,6]]}},"keywords":{}}],["inject(dbservic",{"_index":4731,"title":{},"content":{"825":{"position":[[942,18]]}},"keywords":{}}],["injector",{"_index":833,"title":{},"content":{"55":{"position":[[262,8],[400,10],[575,9],[817,8]]}},"keywords":{}}],["ink&switch",{"_index":2521,"title":{},"content":{"407":{"position":[[1177,16]]},"419":{"position":[[703,15]]}},"keywords":{}}],["inner",{"_index":2767,"title":{},"content":{"412":{"position":[[13943,5],[13960,5]]},"990":{"position":[[807,5]]}},"keywords":{}}],["innov",{"_index":3246,"title":{},"content":{"510":{"position":[[565,10]]}},"keywords":{}}],["input",{"_index":592,"title":{},"content":{"38":{"position":[[484,5]]},"393":{"position":[[773,5]]},"394":{"position":[[238,5],[306,5]]},"404":{"position":[[774,5],[922,5]]},"411":{"position":[[2367,6]]},"571":{"position":[[163,7],[1694,5]]},"691":{"position":[[311,7]]},"759":{"position":[[905,7]]},"760":{"position":[[793,7]]},"848":{"position":[[273,5]]},"875":{"position":[[3696,5]]},"885":{"position":[[111,6],[519,5],[715,5],[911,5],[1289,5],[1981,5]]},"886":{"position":[[157,5],[2182,5],[3404,6]]},"968":{"position":[[265,5]]},"983":{"position":[[238,6],[574,6]]},"1030":{"position":[[217,6]]},"1100":{"position":[[465,5]]},"1104":{"position":[[309,5]]},"1105":{"position":[[187,5]]},"1115":{"position":[[125,5]]},"1317":{"position":[[31,6]]}},"keywords":{}}],["input.newdocumentstate.nam",{"_index":3915,"title":{},"content":{"691":{"position":[[368,27]]}},"keywords":{}}],["input.realmasterst",{"_index":3914,"title":{},"content":{"691":{"position":[[336,25]]}},"keywords":{}}],["input.realmasterstate.nam",{"_index":3916,"title":{},"content":{"691":{"position":[[399,27]]}},"keywords":{}}],["input.realmasterstate.scor",{"_index":3918,"title":{},"content":{"691":{"position":[[473,28]]}},"keywords":{}}],["insensit",{"_index":5770,"title":{},"content":{"1065":{"position":[[1202,11]]},"1072":{"position":[[1640,11],[1771,11],[2004,14],[2074,11],[2192,11],[2593,11],[2728,11]]}},"keywords":{}}],["insert",{"_index":787,"title":{"555":{"position":[[3,9]]},"683":{"position":[[9,8]]},"767":{"position":[[0,7]]},"942":{"position":[[0,9]]},"1035":{"position":[[0,7]]}},"content":{"52":{"position":[[77,6],[171,6]]},"188":{"position":[[2805,6]]},"301":{"position":[[222,6]]},"356":{"position":[[393,6],[424,6]]},"412":{"position":[[9911,9]]},"427":{"position":[[1357,7]]},"539":{"position":[[77,6],[171,6]]},"555":{"position":[[235,6]]},"562":{"position":[[538,6]]},"599":{"position":[[77,6],[180,6]]},"662":{"position":[[2570,6]]},"680":{"position":[[1194,6]]},"683":{"position":[[45,6],[370,8],[460,6],[570,6],[891,6]]},"703":{"position":[[221,6]]},"710":{"position":[[1880,6]]},"711":{"position":[[1222,6]]},"715":{"position":[[254,6]]},"717":{"position":[[286,7]]},"749":{"position":[[6748,6]]},"767":{"position":[[4,6],[626,6]]},"802":{"position":[[365,11]]},"813":{"position":[[221,9]]},"838":{"position":[[2784,6]]},"863":{"position":[[701,7]]},"904":{"position":[[1125,6]]},"941":{"position":[[219,7]]},"942":{"position":[[13,6]]},"943":{"position":[[44,6],[255,9]]},"944":{"position":[[18,6],[58,7],[99,9],[480,9]]},"946":{"position":[[1,7]]},"953":{"position":[[216,8]]},"1035":{"position":[[4,6],[75,9]]},"1055":{"position":[[61,6]]},"1058":{"position":[[448,6]]},"1065":{"position":[[1753,6],[2058,8]]},"1078":{"position":[[822,9]]},"1082":{"position":[[73,6]]},"1106":{"position":[[384,7]]},"1158":{"position":[[543,6]]},"1194":{"position":[[57,7],[224,6],[353,6],[393,6],[540,6]]},"1209":{"position":[[226,7]]},"1292":{"position":[[302,6],[309,6],[656,6],[663,6]]},"1296":{"position":[[757,6]]},"1311":{"position":[[1435,6]]}},"keywords":{}}],["insert/upd",{"_index":4953,"title":{},"content":{"872":{"position":[[1272,13]]}},"keywords":{}}],["insert/update/delet",{"_index":6568,"title":{},"content":{"1317":{"position":[[697,20]]}},"keywords":{}}],["insertcrdt",{"_index":3885,"title":{},"content":{"683":{"position":[[249,12],[537,12]]}},"keywords":{}}],["insertifnotexist",{"_index":5329,"title":{"943":{"position":[[0,20]]}},"content":{"943":{"position":[[5,19]]}},"keywords":{}}],["insertloc",{"_index":5598,"title":{"1014":{"position":[[0,14]]}},"content":{},"keywords":{}}],["insertresult",{"_index":2234,"title":{},"content":{"392":{"position":[[1066,12]]}},"keywords":{}}],["inserts/upd",{"_index":5189,"title":{},"content":{"897":{"position":[[219,15]]}},"keywords":{}}],["insid",{"_index":53,"title":{"1213":{"position":[[62,6]]}},"content":{"3":{"position":[[39,6]]},"5":{"position":[[30,6]]},"8":{"position":[[703,6]]},"14":{"position":[[770,6]]},"16":{"position":[[208,6]]},"188":{"position":[[368,6],[1894,6],[2226,6],[2267,6]]},"356":{"position":[[829,6]]},"365":{"position":[[652,6]]},"366":{"position":[[477,6],[606,6]]},"367":{"position":[[24,6]]},"408":{"position":[[4913,6]]},"411":{"position":[[2158,6]]},"429":{"position":[[618,6]]},"451":{"position":[[150,6]]},"454":{"position":[[212,6],[536,6]]},"458":{"position":[[1486,6]]},"460":{"position":[[407,6],[1083,6]]},"463":{"position":[[369,6]]},"469":{"position":[[729,6]]},"470":{"position":[[230,6]]},"575":{"position":[[140,6]]},"616":{"position":[[789,6]]},"661":{"position":[[85,6]]},"682":{"position":[[192,6]]},"685":{"position":[[28,6]]},"697":{"position":[[21,6],[582,6]]},"708":{"position":[[576,6]]},"710":{"position":[[552,6]]},"711":{"position":[[113,6]]},"721":{"position":[[113,6],[317,6]]},"749":{"position":[[3395,6],[3580,6]]},"757":{"position":[[86,6],[158,6]]},"772":{"position":[[1149,6],[1338,6]]},"779":{"position":[[384,6]]},"785":{"position":[[514,6]]},"806":{"position":[[34,6]]},"836":{"position":[[87,6]]},"838":{"position":[[1256,6]]},"857":{"position":[[65,6]]},"861":{"position":[[461,6]]},"875":{"position":[[5733,6]]},"904":{"position":[[455,6]]},"951":{"position":[[289,6]]},"981":{"position":[[473,6]]},"1031":{"position":[[59,6]]},"1032":{"position":[[28,6]]},"1033":{"position":[[377,6],[952,6]]},"1085":{"position":[[70,6],[3087,6]]},"1101":{"position":[[399,6]]},"1116":{"position":[[18,6]]},"1121":{"position":[[34,6]]},"1126":{"position":[[53,6]]},"1171":{"position":[[371,6]]},"1183":{"position":[[336,6]]},"1206":{"position":[[509,6]]},"1207":{"position":[[343,6]]},"1210":{"position":[[36,6]]},"1211":{"position":[[77,6]]},"1212":{"position":[[78,6],[266,6]]},"1213":{"position":[[23,6],[393,6],[563,6],[795,6]]},"1214":{"position":[[932,6]]},"1230":{"position":[[57,6],[331,6]]},"1231":{"position":[[81,6],[190,6]]},"1233":{"position":[[126,6]]},"1237":{"position":[[413,6]]},"1242":{"position":[[48,6]]},"1244":{"position":[[144,6]]},"1250":{"position":[[400,6],[488,6]]},"1270":{"position":[[525,6]]},"1280":{"position":[[152,6]]},"1313":{"position":[[65,6]]},"1315":{"position":[[1173,6]]},"1319":{"position":[[461,6]]},"1323":{"position":[[50,6]]}},"keywords":{}}],["insight",{"_index":1621,"title":{},"content":{"267":{"position":[[1070,8]]},"420":{"position":[[1102,8]]},"644":{"position":[[330,9]]}},"keywords":{}}],["inspect",{"_index":597,"title":{},"content":{"38":{"position":[[882,7]]},"364":{"position":[[825,10]]},"394":{"position":[[1169,7]]},"467":{"position":[[427,10]]},"698":{"position":[[2147,7]]},"889":{"position":[[1080,7]]}},"keywords":{}}],["instal",{"_index":29,"title":{"49":{"position":[[0,10]]},"128":{"position":[[0,10]]},"257":{"position":[[0,7]]},"333":{"position":[[0,10]]},"537":{"position":[[0,10]]},"553":{"position":[[3,7]]},"578":{"position":[[0,13]]},"597":{"position":[[0,10]]},"646":{"position":[[0,13]]},"652":{"position":[[0,13]]},"680":{"position":[[0,13]]},"725":{"position":[[0,7]]},"731":{"position":[[0,10]]},"1133":{"position":[[0,13]]}},"content":{"1":{"position":[[424,7]]},"2":{"position":[[105,7],[135,7]]},"3":{"position":[[113,7]]},"4":{"position":[[279,7]]},"5":{"position":[[195,7]]},"6":{"position":[[262,7],[294,7]]},"7":{"position":[[217,7]]},"8":{"position":[[157,7],[233,7],[467,7]]},"9":{"position":[[129,7]]},"10":{"position":[[58,7]]},"11":{"position":[[96,7]]},"38":{"position":[[754,9]]},"49":{"position":[[9,7],[66,7]]},"128":{"position":[[57,7],[101,7],[171,7],[197,10]]},"188":{"position":[[1986,7],[2189,7],[2250,13]]},"211":{"position":[[1,7],[19,7]]},"257":{"position":[[5,7]]},"285":{"position":[[164,10]]},"314":{"position":[[238,7],[256,7]]},"333":{"position":[[1,7],[47,7]]},"498":{"position":[[180,12]]},"500":{"position":[[141,9],[449,13]]},"503":{"position":[[135,10]]},"522":{"position":[[87,10],[123,7],[145,10]]},"537":{"position":[[8,7],[45,7]]},"542":{"position":[[170,7],[206,7]]},"553":{"position":[[1,7],[83,7],[100,7]]},"578":{"position":[[9,7],[76,7]]},"597":{"position":[[8,7],[47,7]]},"614":{"position":[[248,12]]},"659":{"position":[[216,7],[240,7]]},"661":{"position":[[516,7],[537,7]]},"662":{"position":[[1226,7],[1259,7]]},"666":{"position":[[72,9]]},"670":{"position":[[175,10]]},"710":{"position":[[1420,7],[1453,7]]},"711":{"position":[[688,7],[857,9],[886,7],[908,7]]},"726":{"position":[[4,7]]},"727":{"position":[[18,7],[67,9]]},"728":{"position":[[70,7]]},"760":{"position":[[60,7]]},"793":{"position":[[55,7]]},"829":{"position":[[3,13],[17,7],[54,7]]},"836":{"position":[[450,7],[509,7]]},"837":{"position":[[1274,7],[1325,7]]},"838":{"position":[[1757,7],[1790,7]]},"854":{"position":[[3,7],[37,7]]},"861":{"position":[[340,9],[411,12],[436,12],[769,12]]},"862":{"position":[[120,7],[160,7]]},"866":{"position":[[3,7],[33,7]]},"872":{"position":[[3,7],[64,7],[127,7],[474,9]]},"898":{"position":[[3,7],[29,7]]},"911":{"position":[[377,9],[402,7]]},"1097":{"position":[[36,7],[77,7],[497,9]]},"1112":{"position":[[206,7]]},"1133":{"position":[[1,7],[154,7],[186,7],[423,7]]},"1139":{"position":[[373,7]]},"1145":{"position":[[362,7]]},"1148":{"position":[[427,7],[462,7]]},"1189":{"position":[[3,7],[36,7]]},"1227":{"position":[[285,9]]},"1265":{"position":[[278,9]]},"1270":{"position":[[372,9]]},"1277":{"position":[[1,7]]},"1279":{"position":[[1,7]]}},"keywords":{}}],["installmak",{"_index":3826,"title":{},"content":{"666":{"position":[[239,11]]}},"keywords":{}}],["instanc",{"_index":427,"title":{"757":{"position":[[40,10]]},"790":{"position":[[0,8]]},"791":{"position":[[4,8]]},"1135":{"position":[[6,9]]},"1229":{"position":[[26,9]]},"1268":{"position":[[20,9]]}},"content":{"26":{"position":[[261,9]]},"89":{"position":[[89,9]]},"109":{"position":[[119,9]]},"123":{"position":[[145,9]]},"145":{"position":[[162,9]]},"173":{"position":[[578,9]]},"174":{"position":[[1860,9]]},"266":{"position":[[916,8]]},"285":{"position":[[245,8]]},"289":{"position":[[1300,9]]},"293":{"position":[[258,8]]},"299":{"position":[[1210,9]]},"325":{"position":[[119,9]]},"327":{"position":[[323,10]]},"334":{"position":[[53,8]]},"335":{"position":[[25,9]]},"346":{"position":[[82,8]]},"352":{"position":[[220,9]]},"379":{"position":[[209,9]]},"408":{"position":[[4412,9]]},"412":{"position":[[3793,10],[4046,8],[6124,9],[7858,9],[10441,9]]},"416":{"position":[[114,9]]},"439":{"position":[[490,9]]},"494":{"position":[[74,9]]},"495":{"position":[[605,9]]},"504":{"position":[[1235,9]]},"517":{"position":[[234,9]]},"525":{"position":[[318,10]]},"566":{"position":[[974,8]]},"570":{"position":[[557,8]]},"579":{"position":[[49,8],[820,9]]},"589":{"position":[[104,9]]},"590":{"position":[[200,8]]},"612":{"position":[[757,8],[918,9]]},"632":{"position":[[1229,8]]},"636":{"position":[[211,9]]},"641":{"position":[[217,9]]},"653":{"position":[[1309,8],[1410,8]]},"683":{"position":[[398,9]]},"685":{"position":[[340,9]]},"724":{"position":[[363,8]]},"743":{"position":[[286,10]]},"746":{"position":[[604,9]]},"749":{"position":[[3006,9],[3235,9],[4753,8],[5393,8],[15072,8],[23842,8]]},"757":{"position":[[31,9],[149,8],[232,10],[247,9]]},"766":{"position":[[98,8],[273,9]]},"770":{"position":[[109,8]]},"775":{"position":[[184,10],[350,9]]},"790":{"position":[[1,8]]},"817":{"position":[[324,9]]},"818":{"position":[[223,9]]},"826":{"position":[[347,10]]},"829":{"position":[[971,8],[2228,9]]},"837":{"position":[[2047,8]]},"855":{"position":[[133,10]]},"861":{"position":[[836,8]]},"867":{"position":[[133,10]]},"872":{"position":[[1687,8]]},"875":{"position":[[6836,10]]},"945":{"position":[[330,10]]},"955":{"position":[[33,8]]},"957":{"position":[[40,8]]},"958":{"position":[[100,8],[311,8]]},"964":{"position":[[46,8],[197,10],[411,9],[565,8]]},"966":{"position":[[51,9],[431,9]]},"967":{"position":[[48,9]]},"976":{"position":[[29,9]]},"977":{"position":[[111,8],[184,8],[527,10]]},"978":{"position":[[40,8]]},"979":{"position":[[65,8],[136,8]]},"986":{"position":[[519,10],[991,9]]},"988":{"position":[[1318,8],[2373,9]]},"989":{"position":[[58,8],[250,8],[408,9]]},"990":{"position":[[197,8],[267,8]]},"995":{"position":[[1293,10]]},"1003":{"position":[[298,8]]},"1013":{"position":[[218,9]]},"1052":{"position":[[327,8],[428,9]]},"1053":{"position":[[40,8]]},"1065":{"position":[[577,8],[662,9]]},"1070":{"position":[[40,8]]},"1085":{"position":[[133,8],[2845,8]]},"1088":{"position":[[422,9]]},"1114":{"position":[[11,8],[315,9],[807,8]]},"1116":{"position":[[38,8]]},"1118":{"position":[[67,9]]},"1120":{"position":[[557,9],[637,10]]},"1123":{"position":[[210,8],[426,10]]},"1124":{"position":[[1066,9],[1166,8],[1276,10],[2170,9]]},"1126":{"position":[[195,9],[278,9],[538,9],[835,9]]},"1148":{"position":[[830,8]]},"1154":{"position":[[123,8],[187,9]]},"1164":{"position":[[611,9]]},"1174":{"position":[[264,9]]},"1220":{"position":[[84,9],[400,8]]},"1222":{"position":[[608,9]]},"1229":{"position":[[107,8]]},"1233":{"position":[[245,9]]},"1246":{"position":[[1114,10],[1404,8]]},"1267":{"position":[[66,8],[203,8]]},"1268":{"position":[[101,8]]},"1305":{"position":[[693,8]]},"1314":{"position":[[301,9]]}},"keywords":{}}],["instanceadd",{"_index":5905,"title":{},"content":{"1085":{"position":[[3686,11]]}},"keywords":{}}],["instanceof",{"_index":4188,"title":{},"content":{"749":{"position":[[4154,10]]}},"keywords":{}}],["instances.multi",{"_index":3484,"title":{},"content":{"575":{"position":[[520,15]]}},"keywords":{}}],["instand",{"_index":2128,"title":{},"content":{"369":{"position":[[1266,7]]}},"keywords":{}}],["instant",{"_index":923,"title":{},"content":{"65":{"position":[[1160,7]]},"152":{"position":[[82,7]]},"267":{"position":[[1062,7]]},"375":{"position":[[525,7]]},"407":{"position":[[394,7]]},"415":{"position":[[73,7]]},"474":{"position":[[173,7]]},"483":{"position":[[70,7]]},"486":{"position":[[73,8]]},"489":{"position":[[126,7],[325,7]]},"491":{"position":[[678,8]]},"498":{"position":[[582,7]]},"630":{"position":[[495,7]]},"724":{"position":[[1263,8],[1358,9],[1387,10]]},"1009":{"position":[[688,7]]}},"keywords":{}}],["instantan",{"_index":1603,"title":{},"content":{"265":{"position":[[416,13]]},"410":{"position":[[72,13]]},"411":{"position":[[3693,13]]},"489":{"position":[[560,13]]},"502":{"position":[[848,13]]},"571":{"position":[[107,13]]},"860":{"position":[[711,16]]}},"keywords":{}}],["instantdb",{"_index":612,"title":{"39":{"position":[[0,10]]}},"content":{"39":{"position":[[1,9],[457,9]]}},"keywords":{}}],["instantli",{"_index":1006,"title":{},"content":{"90":{"position":[[189,9]]},"156":{"position":[[250,9]]},"205":{"position":[[388,10]]},"267":{"position":[[704,9]]},"312":{"position":[[106,9]]},"323":{"position":[[98,9]]},"329":{"position":[[202,9]]},"408":{"position":[[2829,9]]},"412":{"position":[[6561,11]]},"421":{"position":[[986,9]]},"445":{"position":[[1069,9]]},"475":{"position":[[201,9]]},"490":{"position":[[412,9]]},"491":{"position":[[1583,9]]},"493":{"position":[[517,9]]},"494":{"position":[[661,10]]},"570":{"position":[[588,10]]},"582":{"position":[[335,9]]},"634":{"position":[[136,9]]},"778":{"position":[[391,10]]},"1084":{"position":[[449,9]]}},"keywords":{}}],["instead",{"_index":381,"title":{"144":{"position":[[38,7]]},"354":{"position":[[19,7]]},"431":{"position":[[12,7]]},"563":{"position":[[29,7]]},"691":{"position":[[57,7]]},"822":{"position":[[43,7]]},"1211":{"position":[[30,7]]},"1293":{"position":[[38,7]]}},"content":{"23":{"position":[[126,7]]},"31":{"position":[[84,7]]},"38":{"position":[[236,7],[328,7]]},"40":{"position":[[331,8]]},"55":{"position":[[1050,7]]},"91":{"position":[[100,7]]},"93":{"position":[[73,7]]},"143":{"position":[[308,7]]},"144":{"position":[[108,7]]},"173":{"position":[[1995,7],[3021,7]]},"188":{"position":[[2169,7]]},"220":{"position":[[89,7]]},"255":{"position":[[269,7]]},"277":{"position":[[88,7]]},"287":{"position":[[54,8]]},"323":{"position":[[472,7]]},"329":{"position":[[1,7]]},"346":{"position":[[187,7]]},"360":{"position":[[230,7]]},"364":{"position":[[707,7]]},"367":{"position":[[121,7]]},"390":{"position":[[600,7],[1072,7]]},"392":{"position":[[3760,7]]},"395":{"position":[[446,8]]},"400":{"position":[[546,8]]},"408":{"position":[[3843,8]]},"410":{"position":[[238,7]]},"411":{"position":[[626,7],[1179,7],[3615,7]]},"412":{"position":[[2938,7],[5749,7],[10960,7]]},"432":{"position":[[1236,7]]},"439":{"position":[[261,7],[607,7]]},"440":{"position":[[410,7]]},"454":{"position":[[840,7]]},"464":{"position":[[1044,7]]},"466":{"position":[[556,7]]},"467":{"position":[[719,8]]},"469":{"position":[[345,7]]},"487":{"position":[[25,7]]},"490":{"position":[[549,7]]},"554":{"position":[[727,8]]},"556":{"position":[[1262,7]]},"563":{"position":[[639,7],[877,7]]},"570":{"position":[[714,7]]},"571":{"position":[[739,7]]},"602":{"position":[[182,7]]},"612":{"position":[[489,7]]},"616":{"position":[[373,7],[756,7],[1003,7],[1214,7]]},"617":{"position":[[2074,7]]},"626":{"position":[[542,7]]},"630":{"position":[[762,7],[894,7]]},"681":{"position":[[896,7]]},"686":{"position":[[175,7],[290,7],[521,7],[720,7]]},"688":{"position":[[240,7],[340,7],[786,7]]},"698":{"position":[[1509,7],[2373,7]]},"708":{"position":[[514,7]]},"709":{"position":[[1221,7]]},"717":{"position":[[402,7]]},"751":{"position":[[443,7]]},"782":{"position":[[301,7]]},"795":{"position":[[88,7]]},"798":{"position":[[899,8]]},"799":{"position":[[439,7]]},"800":{"position":[[99,8],[748,7]]},"817":{"position":[[334,7]]},"826":{"position":[[257,8]]},"828":{"position":[[303,7]]},"831":{"position":[[219,7]]},"835":{"position":[[189,7],[695,8]]},"836":{"position":[[1091,7]]},"838":{"position":[[2226,7]]},"854":{"position":[[1347,7]]},"863":{"position":[[578,7]]},"872":{"position":[[1514,8]]},"875":{"position":[[1518,7],[5908,7]]},"882":{"position":[[65,7]]},"888":{"position":[[205,7]]},"898":{"position":[[565,8]]},"904":{"position":[[2733,8],[3221,7]]},"906":{"position":[[457,8]]},"918":{"position":[[59,7]]},"927":{"position":[[89,7]]},"944":{"position":[[596,7]]},"945":{"position":[[259,7]]},"968":{"position":[[223,8]]},"975":{"position":[[147,7]]},"985":{"position":[[260,7]]},"986":{"position":[[364,7],[1045,7]]},"988":{"position":[[2121,7],[2226,8],[3128,7]]},"995":{"position":[[1197,7]]},"1002":{"position":[[888,7]]},"1007":{"position":[[195,7]]},"1013":{"position":[[127,7]]},"1040":{"position":[[95,7]]},"1044":{"position":[[134,7]]},"1051":{"position":[[148,8]]},"1066":{"position":[[705,8]]},"1067":{"position":[[1708,7]]},"1068":{"position":[[496,7]]},"1069":{"position":[[281,7]]},"1072":{"position":[[1070,8],[1327,8]]},"1090":{"position":[[191,7]]},"1093":{"position":[[1,7]]},"1098":{"position":[[74,7]]},"1099":{"position":[[70,7]]},"1115":{"position":[[513,7]]},"1117":{"position":[[1,7]]},"1124":{"position":[[19,7],[354,7],[1518,7],[1852,8]]},"1140":{"position":[[390,7]]},"1143":{"position":[[281,7]]},"1154":{"position":[[614,8]]},"1162":{"position":[[797,7],[1063,7]]},"1165":{"position":[[78,7],[243,7]]},"1174":{"position":[[554,7]]},"1175":{"position":[[467,7]]},"1191":{"position":[[344,7]]},"1194":{"position":[[187,7]]},"1196":{"position":[[194,8]]},"1214":{"position":[[323,7]]},"1222":{"position":[[372,8]]},"1229":{"position":[[1,7]]},"1231":{"position":[[334,8]]},"1238":{"position":[[255,7]]},"1249":{"position":[[358,7]]},"1251":{"position":[[148,8],[347,7]]},"1253":{"position":[[114,7]]},"1258":{"position":[[108,7]]},"1268":{"position":[[1,7]]},"1277":{"position":[[707,8]]},"1282":{"position":[[228,8]]},"1295":{"position":[[114,7]]},"1296":{"position":[[65,7],[462,7],[698,7]]},"1298":{"position":[[97,7]]},"1299":{"position":[[117,7]]},"1300":{"position":[[444,7]]},"1301":{"position":[[844,7],[1120,8]]},"1305":{"position":[[317,8]]},"1307":{"position":[[576,7]]},"1309":{"position":[[1043,8],[1174,8]]},"1316":{"position":[[1536,7],[2057,7],[3248,7],[3599,7]]},"1318":{"position":[[160,7],[650,7]]}},"keywords":{}}],["instead.th",{"_index":6063,"title":{},"content":{"1141":{"position":[[203,11]]}},"keywords":{}}],["instock=fals",{"_index":6544,"title":{},"content":{"1316":{"position":[[854,13]]}},"keywords":{}}],["instruct",{"_index":998,"title":{},"content":{"84":{"position":[[367,12]]},"114":{"position":[[380,12]]},"149":{"position":[[380,12]]},"175":{"position":[[371,12]]},"285":{"position":[[379,12]]},"347":{"position":[[378,12]]},"362":{"position":[[1449,12]]},"511":{"position":[[380,12]]},"531":{"position":[[380,12]]},"591":{"position":[[378,12]]}},"keywords":{}}],["insuffici",{"_index":2791,"title":{},"content":{"417":{"position":[[186,13]]}},"keywords":{}}],["int",{"_index":5083,"title":{},"content":{"885":{"position":[[887,6]]},"886":{"position":[[629,5]]}},"keywords":{}}],["intact",{"_index":4042,"title":{},"content":{"723":{"position":[[1448,6]]}},"keywords":{}}],["integ",{"_index":2980,"title":{},"content":{"457":{"position":[[143,8]]},"898":{"position":[[1075,8]]},"1079":{"position":[[136,7]]},"1082":{"position":[[395,10]]},"1083":{"position":[[595,10]]},"1311":{"position":[[553,9]]}},"keywords":{}}],["integr",{"_index":255,"title":{"94":{"position":[[7,11]]},"222":{"position":[[7,11]]}},"content":{"15":{"position":[[261,9]]},"56":{"position":[[159,11]]},"72":{"position":[[58,9]]},"76":{"position":[[86,10]]},"94":{"position":[[47,9],[144,11]]},"107":{"position":[[100,11]]},"110":{"position":[[171,9]]},"118":{"position":[[255,11]]},"127":{"position":[[86,9]]},"148":{"position":[[163,11]]},"152":{"position":[[36,8]]},"165":{"position":[[275,10]]},"167":{"position":[[251,10]]},"172":{"position":[[70,10]]},"173":{"position":[[2161,11],[2237,9]]},"174":{"position":[[1385,10]]},"186":{"position":[[228,11]]},"187":{"position":[[72,9]]},"198":{"position":[[273,11]]},"222":{"position":[[53,9]]},"226":{"position":[[408,9]]},"230":{"position":[[113,11]]},"238":{"position":[[231,10]]},"240":{"position":[[293,9]]},"281":{"position":[[206,12]]},"284":{"position":[[8,11]]},"286":{"position":[[17,10]]},"289":{"position":[[476,11],[1237,11]]},"293":{"position":[[421,9]]},"310":{"position":[[371,10]]},"313":{"position":[[37,10]]},"339":{"position":[[195,9]]},"350":{"position":[[260,10]]},"353":{"position":[[569,9]]},"354":{"position":[[433,9],[921,12]]},"358":{"position":[[990,9]]},"366":{"position":[[220,10]]},"370":{"position":[[66,11]]},"375":{"position":[[878,8]]},"381":{"position":[[185,11]]},"383":{"position":[[200,9]]},"386":{"position":[[240,10]]},"404":{"position":[[537,9]]},"412":{"position":[[2515,9],[13774,10]]},"429":{"position":[[264,11]]},"445":{"position":[[1655,11],[1711,10]]},"447":{"position":[[181,11]]},"483":{"position":[[1,11]]},"491":{"position":[[1905,11]]},"501":{"position":[[141,10]]},"503":{"position":[[1,11]]},"504":{"position":[[1179,11]]},"510":{"position":[[169,11]]},"514":{"position":[[90,10]]},"520":{"position":[[437,10]]},"521":{"position":[[456,11]]},"522":{"position":[[16,11]]},"530":{"position":[[190,11],[540,10]]},"541":{"position":[[6,10]]},"542":{"position":[[64,10]]},"543":{"position":[[207,9]]},"551":{"position":[[423,9]]},"567":{"position":[[537,9],[763,11]]},"576":{"position":[[360,10]]},"591":{"position":[[536,11]]},"603":{"position":[[205,9]]},"619":{"position":[[318,12]]},"624":{"position":[[406,10]]},"632":{"position":[[921,11]]},"644":{"position":[[422,11]]},"668":{"position":[[354,11]]},"723":{"position":[[1016,10]]},"793":{"position":[[1233,12]]},"828":{"position":[[186,11],[364,11]]},"829":{"position":[[147,11]]},"830":{"position":[[93,11],[320,11]]},"831":{"position":[[275,9],[412,11]]},"832":{"position":[[322,11]]},"839":{"position":[[174,11]]},"912":{"position":[[196,10]]},"1284":{"position":[[49,9]]}},"keywords":{}}],["integrated.commun",{"_index":4801,"title":{},"content":{"839":{"position":[[984,20]]}},"keywords":{}}],["intel(r",{"_index":6399,"title":{},"content":{"1292":{"position":[[171,8]]}},"keywords":{}}],["intellect",{"_index":791,"title":{},"content":{"52":{"position":[[148,10]]},"539":{"position":[[148,10]]},"599":{"position":[[157,10]]}},"keywords":{}}],["intellig",{"_index":1046,"title":{},"content":{"108":{"position":[[85,13]]},"234":{"position":[[80,13]]},"289":{"position":[[164,13]]},"496":{"position":[[288,13]]},"500":{"position":[[601,11]]}},"keywords":{}}],["intend",{"_index":2731,"title":{},"content":{"412":{"position":[[8440,8]]},"430":{"position":[[594,6]]},"524":{"position":[[541,8]]},"535":{"position":[[283,8]]},"595":{"position":[[296,8]]},"617":{"position":[[834,8]]},"1159":{"position":[[152,8]]}},"keywords":{}}],["intens",{"_index":1397,"title":{},"content":{"216":{"position":[[342,9]]},"446":{"position":[[766,9],[851,9]]},"453":{"position":[[162,9]]},"576":{"position":[[423,9]]},"721":{"position":[[162,9]]}},"keywords":{}}],["intent",{"_index":2950,"title":{},"content":{"449":{"position":[[63,11]]},"829":{"position":[[330,12]]},"966":{"position":[[282,11]]}},"keywords":{}}],["intention",{"_index":2725,"title":{},"content":{"412":{"position":[[8079,14]]}},"keywords":{}}],["interact",{"_index":717,"title":{"782":{"position":[[51,12]]}},"content":{"46":{"position":[[538,12]]},"65":{"position":[[940,13]]},"70":{"position":[[241,13]]},"88":{"position":[[129,8]]},"90":{"position":[[310,11]]},"145":{"position":[[255,11]]},"156":{"position":[[295,11]]},"173":{"position":[[1502,8]]},"183":{"position":[[304,8]]},"217":{"position":[[263,11]]},"267":{"position":[[1619,11]]},"292":{"position":[[231,8]]},"320":{"position":[[248,13]]},"338":{"position":[[114,12]]},"375":{"position":[[423,11]]},"408":{"position":[[2773,11],[3248,13]]},"410":{"position":[[86,13]]},"415":{"position":[[81,12],[263,12]]},"421":{"position":[[939,12]]},"425":{"position":[[144,12]]},"477":{"position":[[29,11]]},"483":{"position":[[78,13]]},"486":{"position":[[264,8]]},"487":{"position":[[90,12]]},"491":{"position":[[971,12]]},"497":{"position":[[23,12]]},"498":{"position":[[595,12]]},"501":{"position":[[405,12]]},"502":{"position":[[486,8]]},"509":{"position":[[160,13]]},"516":{"position":[[167,8]]},"519":{"position":[[303,11]]},"571":{"position":[[275,11]]},"614":{"position":[[577,13]]},"624":{"position":[[738,11]]},"644":{"position":[[480,13]]},"656":{"position":[[139,11]]},"687":{"position":[[144,11]]},"688":{"position":[[669,11]]},"770":{"position":[[642,11]]},"778":{"position":[[41,12],[171,12]]},"782":{"position":[[35,11],[141,8],[417,12]]},"783":{"position":[[458,12]]},"784":{"position":[[79,12]]},"785":{"position":[[175,8]]},"801":{"position":[[487,12]]},"901":{"position":[[295,12]]},"1033":{"position":[[225,8]]},"1102":{"position":[[780,12]]},"1132":{"position":[[1023,12]]}},"keywords":{}}],["interaction.scal",{"_index":3293,"title":{},"content":{"534":{"position":[[553,24]]},"594":{"position":[[551,24]]}},"keywords":{}}],["interactions.complex",{"_index":6027,"title":{},"content":{"1132":{"position":[[548,20]]}},"keywords":{}}],["interactions.join",{"_index":3724,"title":{},"content":{"644":{"position":[[262,17]]}},"keywords":{}}],["intercept",{"_index":1088,"title":{},"content":{"129":{"position":[[353,10]]},"550":{"position":[[98,10]]}},"keywords":{}}],["interest",{"_index":2954,"title":{},"content":{"450":{"position":[[477,11]]},"463":{"position":[[1061,11]]},"781":{"position":[[441,10]]},"1324":{"position":[[1059,11]]}},"keywords":{}}],["interestingli",{"_index":6447,"title":{},"content":{"1294":{"position":[[1898,13]]}},"keywords":{}}],["interfac",{"_index":920,"title":{"352":{"position":[[27,11]]}},"content":{"65":{"position":[[999,10]]},"68":{"position":[[206,9]]},"73":{"position":[[62,11]]},"77":{"position":[[55,9]]},"90":{"position":[[173,10]]},"103":{"position":[[226,10]]},"136":{"position":[[245,9]]},"162":{"position":[[73,10]]},"173":{"position":[[986,9]]},"174":{"position":[[317,9]]},"185":{"position":[[327,9]]},"235":{"position":[[262,10]]},"270":{"position":[[194,11]]},"275":{"position":[[114,9],[266,10]]},"408":{"position":[[4120,9]]},"410":{"position":[[2166,9]]},"435":{"position":[[38,9]]},"502":{"position":[[833,9]]},"504":{"position":[[267,11]]},"507":{"position":[[170,9]]},"509":{"position":[[139,10]]},"514":{"position":[[397,11]]},"561":{"position":[[254,10]]},"634":{"position":[[169,9]]},"642":{"position":[[312,10]]},"707":{"position":[[266,10]]},"801":{"position":[[248,10]]},"835":{"position":[[356,10]]},"904":{"position":[[1631,10]]},"962":{"position":[[57,10],[73,9]]},"1225":{"position":[[356,9]]},"1263":{"position":[[250,9]]},"1272":{"position":[[208,10]]},"1274":{"position":[[429,10]]},"1279":{"position":[[816,10]]}},"keywords":{}}],["interfer",{"_index":6139,"title":{},"content":{"1175":{"position":[[706,9]]},"1313":{"position":[[187,9]]}},"keywords":{}}],["intermediari",{"_index":3237,"title":{},"content":{"504":{"position":[[1396,15]]}},"keywords":{}}],["intermitt",{"_index":1394,"title":{},"content":{"215":{"position":[[357,12]]},"375":{"position":[[737,12]]},"497":{"position":[[222,12]]},"723":{"position":[[2693,12]]}},"keywords":{}}],["intern",{"_index":1827,"title":{"1177":{"position":[[10,8]]},"1204":{"position":[[10,8]]}},"content":{"303":{"position":[[505,10]]},"316":{"position":[[448,11]]},"361":{"position":[[404,11]]},"412":{"position":[[4593,10]]},"703":{"position":[[458,8]]},"714":{"position":[[52,11]]},"721":{"position":[[435,10]]},"749":{"position":[[6392,8]]},"756":{"position":[[81,8]]},"805":{"position":[[64,8]]},"828":{"position":[[9,10]]},"854":{"position":[[1196,10]]},"886":{"position":[[4630,8]]},"898":{"position":[[1832,10]]},"932":{"position":[[523,10]]},"988":{"position":[[1892,10]]},"1080":{"position":[[1116,8]]},"1085":{"position":[[1024,8]]},"1095":{"position":[[108,11]]},"1105":{"position":[[256,10],[907,10]]},"1121":{"position":[[47,8]]},"1124":{"position":[[1201,10]]},"1154":{"position":[[106,8]]},"1177":{"position":[[43,8],[589,8]]},"1204":{"position":[[43,8]]},"1213":{"position":[[51,10]]},"1246":{"position":[[887,10]]}},"keywords":{}}],["internalindex",{"_index":5842,"title":{},"content":{"1080":{"position":[[1011,15],[1088,15]]},"1107":{"position":[[480,15],[1047,15]]}},"keywords":{}}],["internet",{"_index":704,"title":{},"content":{"46":{"position":[[77,8]]},"65":{"position":[[714,8]]},"69":{"position":[[212,8]]},"88":{"position":[[87,8]]},"157":{"position":[[105,8]]},"164":{"position":[[232,8]]},"173":{"position":[[1588,8]]},"183":{"position":[[129,8]]},"191":{"position":[[100,8]]},"212":{"position":[[57,8]]},"215":{"position":[[233,8]]},"274":{"position":[[156,8]]},"280":{"position":[[272,8]]},"292":{"position":[[287,8]]},"309":{"position":[[226,8]]},"322":{"position":[[282,8]]},"375":{"position":[[138,8]]},"380":{"position":[[101,8]]},"400":{"position":[[811,9]]},"407":{"position":[[586,8]]},"408":{"position":[[2168,8]]},"410":{"position":[[1043,8],[1436,8]]},"419":{"position":[[395,8]]},"446":{"position":[[417,9]]},"462":{"position":[[593,8]]},"489":{"position":[[695,8]]},"516":{"position":[[228,8]]},"534":{"position":[[278,8]]},"565":{"position":[[249,8]]},"574":{"position":[[254,8]]},"582":{"position":[[114,9]]},"594":{"position":[[276,8]]},"699":{"position":[[372,8]]},"723":{"position":[[2712,8]]},"1141":{"position":[[288,8]]},"1207":{"position":[[144,8]]},"1316":{"position":[[446,8]]}},"keywords":{}}],["internetexplor",{"_index":6473,"title":{},"content":{"1301":{"position":[[983,16]]}},"keywords":{}}],["interop",{"_index":836,"title":{},"content":{"55":{"position":[[340,9]]},"1118":{"position":[[460,9]]}},"keywords":{}}],["interrupt",{"_index":2072,"title":{},"content":{"358":{"position":[[1047,11]]},"392":{"position":[[2332,12]]},"616":{"position":[[492,12]]}},"keywords":{}}],["interv",{"_index":3551,"title":{},"content":{"610":{"position":[[301,10]]},"632":{"position":[[426,9]]},"875":{"position":[[9208,9]]},"996":{"position":[[402,8]]},"1164":{"position":[[1072,9]]}},"keywords":{}}],["intervalid",{"_index":3605,"title":{},"content":{"612":{"position":[[2210,10]]}},"keywords":{}}],["intervent",{"_index":1239,"title":{},"content":{"185":{"position":[[352,13]]},"487":{"position":[[480,13]]},"515":{"position":[[119,12]]},"690":{"position":[[425,12]]}},"keywords":{}}],["intric",{"_index":2017,"title":{},"content":{"354":{"position":[[241,9]]},"426":{"position":[[88,9]]},"1132":{"position":[[707,9]]}},"keywords":{}}],["intricaci",{"_index":2909,"title":{},"content":{"433":{"position":[[614,11]]},"521":{"position":[[181,9]]}},"keywords":{}}],["intrigu",{"_index":2908,"title":{},"content":{"433":{"position":[[9,10]]}},"keywords":{}}],["intrins",{"_index":6085,"title":{},"content":{"1150":{"position":[[178,13]]}},"keywords":{}}],["introduc",{"_index":1066,"title":{"118":{"position":[[0,11]]},"153":{"position":[[0,11]]},"179":{"position":[[0,11]]},"271":{"position":[[0,11]]},"322":{"position":[[0,11]]},"445":{"position":[[0,11]]},"479":{"position":[[0,11]]},"501":{"position":[[0,11]]},"513":{"position":[[0,11]]},"575":{"position":[[0,11]]}},"content":{"159":{"position":[[6,10]]},"185":{"position":[[6,10]]},"233":{"position":[[6,10]]},"277":{"position":[[6,10]]},"289":{"position":[[1611,10]]},"303":{"position":[[1333,10]]},"356":{"position":[[97,10]]},"377":{"position":[[30,10]]},"408":{"position":[[464,10]]},"411":{"position":[[3397,10],[3827,10]]},"412":{"position":[[14951,9]]},"427":{"position":[[779,10]]},"450":{"position":[[20,10]]},"452":{"position":[[21,10],[459,11]]},"455":{"position":[[22,10]]},"504":{"position":[[746,10]]},"508":{"position":[[6,10]]},"509":{"position":[[6,10]]},"518":{"position":[[65,10]]},"610":{"position":[[757,9]]},"699":{"position":[[267,10]]},"802":{"position":[[149,10]]},"836":{"position":[[1676,9]]},"1198":{"position":[[1168,10]]},"1294":{"position":[[38,10]]}},"keywords":{}}],["introduction.a",{"_index":3382,"title":{},"content":{"557":{"position":[[61,14]]}},"keywords":{}}],["introduction.check",{"_index":3331,"title":{},"content":{"548":{"position":[[61,18]]},"608":{"position":[[61,18]]}},"keywords":{}}],["intuit",{"_index":1037,"title":{},"content":{"104":{"position":[[179,10]]},"120":{"position":[[233,9]]},"181":{"position":[[133,9]]},"223":{"position":[[229,9]]},"231":{"position":[[238,9]]},"353":{"position":[[171,9]]},"364":{"position":[[602,9]]},"521":{"position":[[601,9]]},"560":{"position":[[682,9]]},"1009":{"position":[[28,9]]}},"keywords":{}}],["invalid",{"_index":4185,"title":{},"content":{"749":{"position":[[3940,7],[4012,7],[4127,7],[4542,7],[6228,7],[6483,7]]},"838":{"position":[[1023,7]]},"907":{"position":[[114,7],[241,7]]},"1084":{"position":[[491,7]]}},"keywords":{}}],["invalu",{"_index":1583,"title":{},"content":{"261":{"position":[[122,10]]},"289":{"position":[[1811,10]]},"361":{"position":[[135,10]]},"504":{"position":[[1443,10]]},"548":{"position":[[439,10]]},"608":{"position":[[437,10]]}},"keywords":{}}],["inventori",{"_index":2710,"title":{},"content":{"412":{"position":[[6429,9]]}},"keywords":{}}],["invest",{"_index":2646,"title":{},"content":{"411":{"position":[[5660,6]]}},"keywords":{}}],["invok",{"_index":4498,"title":{},"content":{"759":{"position":[[1539,8]]}},"keywords":{}}],["involv",{"_index":2304,"title":{"1313":{"position":[[37,9]]}},"content":{"394":{"position":[[262,8]]},"412":{"position":[[3667,7]]},"415":{"position":[[276,7]]},"564":{"position":[[80,8]]},"612":{"position":[[856,8]]},"620":{"position":[[107,8]]},"688":{"position":[[656,7]]},"1313":{"position":[[919,9]]}},"keywords":{}}],["inwork",{"_index":6024,"title":{},"content":{"1130":{"position":[[381,9]]}},"keywords":{}}],["inworker=tru",{"_index":6023,"title":{},"content":{"1130":{"position":[[300,13]]}},"keywords":{}}],["io",{"_index":175,"title":{},"content":{"11":{"position":[[960,3]]},"36":{"position":[[56,4]]},"177":{"position":[[146,3]]},"269":{"position":[[286,4]]},"287":{"position":[[1175,3]]},"298":{"position":[[719,3]]},"299":{"position":[[592,5],[649,3],[711,3],[877,3],[925,3],[935,3],[1544,3]]},"371":{"position":[[147,3]]},"408":{"position":[[1199,4]]},"445":{"position":[[2252,3]]},"446":{"position":[[1363,3]]},"618":{"position":[[85,4]]},"640":{"position":[[365,4]]},"660":{"position":[[503,3]]},"661":{"position":[[618,3]]},"662":{"position":[[1324,3]]},"1270":{"position":[[404,4]]},"1278":{"position":[[68,4]]},"1279":{"position":[[48,3]]}},"keywords":{}}],["ionic",{"_index":877,"title":{"268":{"position":[[0,5]]},"269":{"position":[[9,5]]},"270":{"position":[[32,5]]},"271":{"position":[[47,5]]},"284":{"position":[[17,5]]},"290":{"position":[[27,5]]},"307":{"position":[[13,5]]},"308":{"position":[[13,5]]},"317":{"position":[[15,5]]}},"content":{"59":{"position":[[248,7]]},"269":{"position":[[1,5],[12,5]]},"271":{"position":[[78,5]]},"278":{"position":[[245,5]]},"280":{"position":[[455,5]]},"284":{"position":[[30,5]]},"285":{"position":[[350,5]]},"286":{"position":[[161,5]]},"287":{"position":[[1292,6]]},"290":{"position":[[50,5]]},"296":{"position":[[18,5]]},"309":{"position":[[168,5]]},"310":{"position":[[339,5]]},"312":{"position":[[92,5]]},"313":{"position":[[64,5],[117,6]]},"314":{"position":[[57,6]]},"317":{"position":[[1,5]]},"318":{"position":[[5,5],[587,5]]},"479":{"position":[[351,7]]},"546":{"position":[[292,6]]},"631":{"position":[[182,7]]}},"keywords":{}}],["ionicsecur",{"_index":3788,"title":{},"content":{"661":{"position":[[351,11]]}},"keywords":{}}],["iosdatabaseloc",{"_index":178,"title":{},"content":{"11":{"position":[[1038,20]]}},"keywords":{}}],["iot",{"_index":5248,"title":{},"content":{"902":{"position":[[928,3]]}},"keywords":{}}],["ipado",{"_index":1753,"title":{},"content":{"299":{"position":[[734,7]]}},"keywords":{}}],["ipc",{"_index":6289,"title":{},"content":{"1246":{"position":[[940,4]]}},"keywords":{}}],["ipchandl",{"_index":4009,"title":{},"content":{"711":{"position":[[1684,10]]}},"keywords":{}}],["ipcmain",{"_index":3922,"title":{"693":{"position":[[33,8]]}},"content":{"693":{"position":[[966,8]]},"710":{"position":[[1383,7]]},"1246":{"position":[[2017,8]]}},"keywords":{}}],["ipcmain.handle('db",{"_index":4005,"title":{},"content":{"711":{"position":[[1486,18]]}},"keywords":{}}],["ipcrender",{"_index":3921,"title":{"693":{"position":[[19,11]]}},"content":{"693":{"position":[[1255,12]]},"710":{"position":[[1365,11]]},"711":{"position":[[480,11],[1418,11]]},"1214":{"position":[[426,12]]},"1246":{"position":[[1999,11]]}},"keywords":{}}],["ipcrenderer.invoke('db",{"_index":4010,"title":{},"content":{"711":{"position":[[1743,22]]}},"keywords":{}}],["iron",{"_index":789,"title":{},"content":{"52":{"position":[[115,5],[427,5]]},"412":{"position":[[10423,4]]},"539":{"position":[[115,5],[427,5]]},"599":{"position":[[124,5],[454,5]]}},"keywords":{}}],["ironman",{"_index":802,"title":{},"content":{"52":{"position":[[373,7]]},"539":{"position":[[373,7]]},"599":{"position":[[400,7]]}},"keywords":{}}],["irrespect",{"_index":916,"title":{},"content":{"65":{"position":[[692,12]]},"173":{"position":[[1566,12]]}},"keywords":{}}],["isdevmod",{"_index":3848,"title":{},"content":{"673":{"position":[[10,9],[75,14]]}},"keywords":{}}],["isequ",{"_index":2690,"title":{},"content":{"412":{"position":[[4522,9],[4650,9]]},"691":{"position":[[239,8]]},"1309":{"position":[[576,9]]}},"keywords":{}}],["isequal(a",{"_index":2691,"title":{},"content":{"412":{"position":[[4628,10]]},"1309":{"position":[[554,10]]}},"keywords":{}}],["isexhaust",{"_index":3270,"title":{},"content":{"523":{"position":[[497,12],[748,13]]}},"keywords":{}}],["isfetch",{"_index":3268,"title":{},"content":{"523":{"position":[[474,11],[578,12]]}},"keywords":{}}],["isn't",{"_index":1936,"title":{},"content":{"333":{"position":[[82,5]]},"347":{"position":[[576,5]]},"362":{"position":[[1647,5]]},"412":{"position":[[7520,5]]}},"keywords":{}}],["isnam",{"_index":5672,"title":{},"content":{"1039":{"position":[[188,7],[247,6],[347,6],[421,6]]}},"keywords":{}}],["isn’t",{"_index":1734,"title":{},"content":{"299":{"position":[[87,5]]},"473":{"position":[[96,5]]}},"keywords":{}}],["isol",{"_index":6484,"title":{},"content":{"1304":{"position":[[117,9],[602,10]]}},"keywords":{}}],["ispaus",{"_index":5533,"title":{"1001":{"position":[[0,11]]}},"content":{},"keywords":{}}],["ispeervalid",{"_index":5265,"title":{},"content":{"907":{"position":[[165,13],[316,12]]}},"keywords":{}}],["isrxcollect",{"_index":5384,"title":{"957":{"position":[[0,15]]}},"content":{},"keywords":{}}],["isrxcollection(myobj",{"_index":5385,"title":{},"content":{"957":{"position":[[100,22]]}},"keywords":{}}],["isrxdatabas",{"_index":5423,"title":{"978":{"position":[[0,13]]}},"content":{"978":{"position":[[96,12]]}},"keywords":{}}],["isrxdatabase(myobj",{"_index":5424,"title":{},"content":{"978":{"position":[[135,20]]}},"keywords":{}}],["isrxdocu",{"_index":5733,"title":{"1053":{"position":[[0,13]]}},"content":{},"keywords":{}}],["isrxdocument(myobj",{"_index":5734,"title":{},"content":{"1053":{"position":[[98,20]]}},"keywords":{}}],["isrxqueri",{"_index":5790,"title":{"1070":{"position":[[0,10]]}},"content":{},"keywords":{}}],["isrxquery(myobj",{"_index":5791,"title":{},"content":{"1070":{"position":[[95,17]]}},"keywords":{}}],["isstop",{"_index":5530,"title":{"1000":{"position":[[0,12]]}},"content":{},"keywords":{}}],["issu",{"_index":409,"title":{},"content":{"24":{"position":[[706,6]]},"28":{"position":[[748,7]]},"61":{"position":[[220,7]]},"76":{"position":[[151,7]]},"250":{"position":[[85,6]]},"304":{"position":[[302,6]]},"358":{"position":[[199,6],[878,6]]},"395":{"position":[[28,6]]},"411":{"position":[[4470,5]]},"412":{"position":[[1540,5],[6474,6],[14978,6]]},"483":{"position":[[961,5]]},"567":{"position":[[487,7]]},"617":{"position":[[1698,6]]},"644":{"position":[[345,7]]},"668":{"position":[[264,5]]},"836":{"position":[[1728,7]]},"1198":{"position":[[694,6],[758,5],[876,6]]}},"keywords":{}}],["issuessearch",{"_index":4134,"title":{},"content":{"749":{"position":[[70,12],[417,12],[544,12],[635,12],[788,12],[925,12],[1060,12],[1284,12],[1372,12],[1521,12],[1624,12],[1721,12],[1838,12],[1964,12],[2067,12],[2173,12],[2267,12],[2360,12],[2445,12],[2562,12],[2803,12],[2916,12],[3149,12],[3269,12],[3625,12],[3822,12],[3909,12],[3981,12],[4096,12],[4212,12],[4334,12],[4511,12],[4585,12],[4692,12],[4827,12],[4959,12],[5111,12],[5213,12],[5325,12],[5532,12],[6040,12],[6176,12],[6312,12],[6431,12],[6573,12],[6685,12],[6800,12],[6924,12],[7032,12],[7151,12],[7275,12],[7458,12],[7538,12],[7615,12],[7714,12],[7818,12],[7913,12],[8013,12],[8107,12],[8205,12],[8313,12],[8408,12],[8508,12],[8630,12],[8707,12],[8881,12],[9031,12],[9189,12],[9480,12],[9625,12],[9709,12],[9797,12],[9904,12],[10018,12],[10136,12],[10245,12],[10350,12],[10438,12],[10561,12],[10665,12],[10771,12],[10862,12],[10944,12],[11082,12],[11223,12],[11334,12],[11433,12],[11509,12],[11654,12],[11751,12],[11860,12],[12161,12],[12252,12],[12379,12],[12460,12],[12533,12],[12748,12],[12857,12],[12934,12],[13043,12],[13160,12],[13234,12],[13354,12],[13483,12],[13606,12],[13729,12],[13827,12],[13971,12],[14054,12],[14148,12],[14260,12],[14345,12],[14541,12],[14623,12],[14738,12],[14894,12],[15105,12],[15264,12],[15439,12],[15571,12],[15705,12],[15837,12],[15972,12],[16074,12],[16222,12],[16341,12],[16463,12],[16612,12],[16805,12],[16894,12],[17000,12],[17123,12],[17272,12],[17381,12],[17497,12],[17615,12],[17738,12],[17847,12],[17968,12],[18090,12],[18187,12],[18287,12],[18469,12],[18563,12],[18682,12],[18786,12],[18892,12],[18995,12],[19089,12],[19291,12],[19419,12],[19545,12],[19660,12],[19761,12],[19853,12],[19977,12],[20095,12],[20252,12],[20418,12],[20519,12],[20686,12],[20823,12],[20996,12],[21280,12],[21434,12],[21697,12],[21999,12],[22119,12],[22203,12],[22321,12],[22428,12],[22548,12],[22688,12],[22817,12],[22977,12],[23170,12],[23296,12],[23428,12],[23561,12],[23752,12],[23934,12],[24054,12],[24215,12],[24345,12],[24425,12]]}},"keywords":{}}],["it'",{"_index":531,"title":{},"content":{"34":{"position":[[248,4]]},"47":{"position":[[315,4]]},"51":{"position":[[898,4]]},"66":{"position":[[84,4]]},"117":{"position":[[142,4]]},"147":{"position":[[69,4]]},"151":{"position":[[311,4]]},"178":{"position":[[150,4]]},"253":{"position":[[235,4]]},"267":{"position":[[1471,4]]},"271":{"position":[[97,4]]},"287":{"position":[[801,4]]},"365":{"position":[[1406,4]]},"388":{"position":[[280,4]]},"392":{"position":[[2117,4],[2317,4]]},"396":{"position":[[1718,4]]},"401":{"position":[[614,4]]},"408":{"position":[[2824,4]]},"412":{"position":[[63,4],[6102,4],[6774,4],[8711,4],[8821,4],[12197,4]]},"430":{"position":[[544,4]]},"432":{"position":[[82,4],[508,4]]},"433":{"position":[[322,4]]},"436":{"position":[[299,4]]},"446":{"position":[[122,4],[937,4]]},"497":{"position":[[615,4]]},"613":{"position":[[517,4]]},"721":{"position":[[78,4]]},"889":{"position":[[1,4]]},"912":{"position":[[313,4]]},"966":{"position":[[98,4]]},"1085":{"position":[[1542,4]]},"1294":{"position":[[1279,4]]}},"keywords":{}}],["it.serv",{"_index":3667,"title":{},"content":{"622":{"position":[[199,9]]}},"keywords":{}}],["item",{"_index":1356,"title":{},"content":{"209":{"position":[[1057,5]]},"259":{"position":[[27,6],[53,6]]},"302":{"position":[[518,5]]},"353":{"position":[[723,7]]},"358":{"position":[[367,5]]},"390":{"position":[[1342,5],[1429,5]]},"392":{"position":[[437,5],[552,6],[882,5],[1029,5],[1115,5],[1664,6],[2447,5]]},"396":{"position":[[162,5],[908,5],[972,5]]},"475":{"position":[[186,6]]},"493":{"position":[[511,5]]},"749":{"position":[[16943,6],[17074,5]]},"808":{"position":[[660,6]]},"813":{"position":[[183,6]]},"858":{"position":[[390,6]]},"1080":{"position":[[645,6]]},"1316":{"position":[[832,5]]},"1324":{"position":[[1014,4]]}},"keywords":{}}],["item.syncen",{"_index":4889,"title":{},"content":{"858":{"position":[[403,16]]}},"keywords":{}}],["itemscollect",{"_index":2229,"title":{},"content":{"392":{"position":[[737,15]]}},"keywords":{}}],["itemscollection.addpipelin",{"_index":2244,"title":{},"content":{"392":{"position":[[2635,29],[4541,29]]},"397":{"position":[[1760,29]]}},"keywords":{}}],["itemscollection.bulkinsert",{"_index":2235,"title":{},"content":{"392":{"position":[[1087,27]]}},"keywords":{}}],["itemscollection.count().exec",{"_index":2232,"title":{},"content":{"392":{"position":[[939,31]]}},"keywords":{}}],["items—id",{"_index":3386,"title":{},"content":{"559":{"position":[[127,11]]}},"keywords":{}}],["iter",{"_index":2886,"title":{"984":{"position":[[11,10]]}},"content":{"427":{"position":[[981,7]]},"452":{"position":[[309,7]]},"626":{"position":[[695,9],[749,7],[1027,9]]},"818":{"position":[[190,8]]},"875":{"position":[[1589,7],[6598,9],[8883,9]]},"984":{"position":[[89,9],[504,9]]},"985":{"position":[[409,10],[698,9]]},"988":{"position":[[6020,10]]},"996":{"position":[[68,9]]},"1295":{"position":[[1114,9]]},"1296":{"position":[[155,7],[187,9],[1156,7]]}},"keywords":{}}],["itrxstorag",{"_index":2936,"title":{},"content":{"442":{"position":[[104,11]]}},"keywords":{}}],["itself",{"_index":364,"title":{},"content":{"22":{"position":[[19,6]]},"40":{"position":[[292,6]]},"188":{"position":[[171,6]]},"230":{"position":[[84,7]]},"304":{"position":[[340,6]]},"392":{"position":[[1482,7]]},"411":{"position":[[868,6]]},"458":{"position":[[640,6]]},"535":{"position":[[17,6]]},"595":{"position":[[17,6]]},"627":{"position":[[305,6]]},"697":{"position":[[289,6]]},"703":{"position":[[762,7]]},"716":{"position":[[23,6],[179,7],[291,6]]},"723":{"position":[[1956,6]]},"772":{"position":[[254,6]]},"797":{"position":[[44,6]]},"800":{"position":[[328,7]]},"829":{"position":[[159,7],[1064,6]]},"835":{"position":[[590,7]]},"836":{"position":[[289,6]]},"856":{"position":[[183,6]]},"981":{"position":[[488,7]]},"988":{"position":[[806,7]]},"1004":{"position":[[61,7]]},"1067":{"position":[[102,7]]},"1088":{"position":[[152,6]]},"1095":{"position":[[246,7]]},"1162":{"position":[[746,6]]},"1165":{"position":[[27,6]]},"1210":{"position":[[20,6]]},"1250":{"position":[[331,6]]},"1316":{"position":[[3345,7]]}},"keywords":{}}],["it’",{"_index":2052,"title":{},"content":{"357":{"position":[[491,4]]},"360":{"position":[[659,4]]},"479":{"position":[[105,4]]},"482":{"position":[[29,4]]},"559":{"position":[[91,4]]},"560":{"position":[[31,4]]},"567":{"position":[[1148,4]]}},"keywords":{}}],["jaccard",{"_index":2293,"title":{},"content":{"393":{"position":[[276,7]]}},"keywords":{}}],["jan",{"_index":268,"title":{},"content":{"16":{"position":[[11,3]]}},"keywords":{}}],["javascript",{"_index":7,"title":{"12":{"position":[[40,10]]},"76":{"position":[[8,11],[34,10]]},"94":{"position":[[24,10]]},"107":{"position":[[8,11],[34,10]]},"207":{"position":[[20,10]]},"213":{"position":[[5,10]]},"222":{"position":[[24,10]]},"230":{"position":[[8,11],[34,10]]},"254":{"position":[[23,10]]},"359":{"position":[[34,10]]},"363":{"position":[[25,10]]},"374":{"position":[[69,10]]},"378":{"position":[[26,10]]},"389":{"position":[[55,10]]},"426":{"position":[[24,10]]},"431":{"position":[[47,11]]},"513":{"position":[[22,10]]},"900":{"position":[[77,10]]},"903":{"position":[[52,10]]},"1088":{"position":[[13,10]]},"1254":{"position":[[0,10]]},"1282":{"position":[[28,10]]}},"content":{"1":{"position":[[79,10]]},"13":{"position":[[50,10],[161,10]]},"15":{"position":[[61,10],[292,10]]},"16":{"position":[[94,10]]},"17":{"position":[[49,10],[151,10]]},"24":{"position":[[16,10]]},"27":{"position":[[57,10]]},"28":{"position":[[13,10],[361,10],[433,10]]},"29":{"position":[[10,10]]},"30":{"position":[[13,10],[168,10],[322,10]]},"34":{"position":[[168,10]]},"35":{"position":[[26,10]]},"36":{"position":[[129,11]]},"42":{"position":[[53,10]]},"45":{"position":[[26,10]]},"76":{"position":[[16,10],[45,10]]},"83":{"position":[[171,10]]},"94":{"position":[[70,10]]},"104":{"position":[[82,11]]},"105":{"position":[[37,10]]},"107":{"position":[[27,11],[53,10],[117,10]]},"116":{"position":[[23,10]]},"155":{"position":[[24,10]]},"173":{"position":[[2178,10],[2271,10]]},"174":{"position":[[11,10],[1208,11],[1234,10],[1283,11],[1317,10],[1412,10],[1480,10]]},"179":{"position":[[85,10]]},"188":{"position":[[47,11],[146,10],[453,10],[575,10],[1544,10],[1630,10],[2453,10],[2580,10]]},"207":{"position":[[59,10]]},"222":{"position":[[87,10]]},"228":{"position":[[467,10]]},"229":{"position":[[29,10]]},"230":{"position":[[36,10],[73,10],[130,10],[214,10]]},"231":{"position":[[109,10],[134,10]]},"241":{"position":[[587,10]]},"254":{"position":[[61,11]]},"269":{"position":[[88,11]]},"281":{"position":[[35,11]]},"284":{"position":[[166,10]]},"286":{"position":[[41,10]]},"304":{"position":[[312,10]]},"362":{"position":[[819,10]]},"364":{"position":[[1,10],[26,11]]},"371":{"position":[[191,10]]},"373":{"position":[[613,10]]},"378":{"position":[[99,10]]},"387":{"position":[[78,10]]},"392":{"position":[[3262,10]]},"396":{"position":[[1550,11]]},"408":{"position":[[3887,10],[4024,10],[4893,11]]},"412":{"position":[[9679,11]]},"429":{"position":[[65,10]]},"437":{"position":[[158,10]]},"438":{"position":[[54,10]]},"440":{"position":[[10,10],[234,10],[439,10]]},"445":{"position":[[152,11],[210,12]]},"451":{"position":[[587,10]]},"454":{"position":[[426,11]]},"458":{"position":[[200,10]]},"460":{"position":[[89,10],[525,10],[583,10],[1329,10]]},"461":{"position":[[476,10]]},"468":{"position":[[89,10]]},"479":{"position":[[37,10],[470,10]]},"513":{"position":[[18,10]]},"514":{"position":[[54,10]]},"569":{"position":[[1305,10]]},"610":{"position":[[886,10]]},"611":{"position":[[609,10]]},"612":{"position":[[1075,11]]},"631":{"position":[[11,10]]},"655":{"position":[[181,10]]},"662":{"position":[[46,10],[624,10]]},"688":{"position":[[473,10]]},"699":{"position":[[798,10],[813,10]]},"703":{"position":[[147,10],[1142,10]]},"705":{"position":[[439,10]]},"707":{"position":[[101,10],[455,10]]},"710":{"position":[[32,10],[566,10]]},"711":{"position":[[1033,10]]},"732":{"position":[[34,10]]},"740":{"position":[[140,10]]},"743":{"position":[[132,10]]},"749":{"position":[[1479,10],[8804,10]]},"773":{"position":[[153,10]]},"776":{"position":[[155,10]]},"800":{"position":[[216,10],[317,10]]},"801":{"position":[[192,10]]},"817":{"position":[[6,11]]},"818":{"position":[[40,10]]},"821":{"position":[[389,10]]},"835":{"position":[[306,10]]},"837":{"position":[[16,10]]},"838":{"position":[[46,10],[1270,10]]},"872":{"position":[[44,10]]},"904":{"position":[[544,10]]},"908":{"position":[[245,10]]},"958":{"position":[[89,10],[293,10]]},"962":{"position":[[404,10]]},"964":{"position":[[88,10]]},"968":{"position":[[166,10],[362,10]]},"979":{"position":[[125,10]]},"1020":{"position":[[243,10]]},"1030":{"position":[[11,10]]},"1072":{"position":[[801,10],[1377,10]]},"1085":{"position":[[111,10]]},"1088":{"position":[[364,10]]},"1089":{"position":[[228,10]]},"1102":{"position":[[218,10]]},"1105":{"position":[[25,10]]},"1106":{"position":[[27,10]]},"1115":{"position":[[74,10],[582,10]]},"1117":{"position":[[530,10]]},"1118":{"position":[[161,10]]},"1162":{"position":[[42,10],[353,10]]},"1164":{"position":[[1003,10]]},"1171":{"position":[[59,10]]},"1181":{"position":[[108,10],[440,10]]},"1183":{"position":[[102,10],[437,10]]},"1191":{"position":[[147,10]]},"1203":{"position":[[35,10]]},"1214":{"position":[[88,10],[166,10]]},"1225":{"position":[[23,10]]},"1227":{"position":[[48,10],[478,10]]},"1230":{"position":[[169,10]]},"1238":{"position":[[275,10]]},"1241":{"position":[[70,10]]},"1246":{"position":[[819,10]]},"1252":{"position":[[75,11]]},"1265":{"position":[[41,10],[472,10]]},"1267":{"position":[[155,10]]},"1270":{"position":[[177,10]]},"1282":{"position":[[6,10]]},"1292":{"position":[[804,10]]},"1300":{"position":[[110,10],[827,10]]},"1301":{"position":[[651,10],[1505,10]]},"1309":{"position":[[42,10]]},"1315":{"position":[[1054,10]]},"1324":{"position":[[386,11]]}},"keywords":{}}],["javascript"",{"_index":1528,"title":{},"content":{"244":{"position":[[1576,16]]}},"keywords":{}}],["javascript'",{"_index":1036,"title":{},"content":{"104":{"position":[[94,12]]},"174":{"position":[[589,12],[1355,12]]},"179":{"position":[[296,12]]},"364":{"position":[[170,12]]}},"keywords":{}}],["javascript/dist/index.j",{"_index":1265,"title":{},"content":{"188":{"position":[[1788,24],[1943,24]]}},"keywords":{}}],["jd1",{"_index":4307,"title":{},"content":{"749":{"position":[[13261,3]]}},"keywords":{}}],["jd2",{"_index":4308,"title":{},"content":{"749":{"position":[[13381,3]]}},"keywords":{}}],["jd3",{"_index":4310,"title":{},"content":{"749":{"position":[[13510,3]]}},"keywords":{}}],["jetstream",{"_index":4922,"title":{},"content":{"865":{"position":[[65,9]]}},"keywords":{}}],["jevon",{"_index":2580,"title":{},"content":{"409":{"position":[[1,7]]}},"keywords":{}}],["jinaai/jina",{"_index":2458,"title":{},"content":{"401":{"position":[[318,11],[365,11],[412,11]]}},"keywords":{}}],["john",{"_index":5799,"title":{},"content":{"1072":{"position":[[2358,5],[2385,5],[2518,5],[2690,6]]}},"keywords":{}}],["john_do",{"_index":2871,"title":{},"content":{"425":{"position":[[309,12]]}},"keywords":{}}],["join",{"_index":1326,"title":{},"content":{"205":{"position":[[207,6]]},"210":{"position":[[647,5]]},"252":{"position":[[79,6]]},"261":{"position":[[1053,7]]},"263":{"position":[[417,4]]},"306":{"position":[[260,4]]},"352":{"position":[[189,5]]},"354":{"position":[[251,5],[785,5]]},"412":{"position":[[13586,4],[13949,4],[13966,4],[14169,4],[14449,5]]},"422":{"position":[[178,4]]},"483":{"position":[[871,4]]},"705":{"position":[[530,5],[733,6]]},"824":{"position":[[360,4]]},"898":{"position":[[3712,6]]},"899":{"position":[[422,4]]},"902":{"position":[[188,4]]},"905":{"position":[[130,4]]},"1071":{"position":[[282,7]]},"1315":{"position":[[429,4]]},"1317":{"position":[[781,4]]}},"keywords":{}}],["joins.requir",{"_index":2009,"title":{},"content":{"353":{"position":[[358,13]]}},"keywords":{}}],["journey",{"_index":1076,"title":{},"content":{"119":{"position":[[14,7]]}},"keywords":{}}],["journeyapp",{"_index":687,"title":{},"content":{"43":{"position":[[694,11]]}},"keywords":{}}],["jqueri",{"_index":1913,"title":{"319":{"position":[[24,6]]},"320":{"position":[[0,6]]},"321":{"position":[[27,6]]},"331":{"position":[[15,6]]},"332":{"position":[[16,6]]},"335":{"position":[[22,7]]},"346":{"position":[[33,6]]}},"content":{"320":{"position":[[1,6],[198,6]]},"321":{"position":[[21,6]]},"323":{"position":[[554,6]]},"326":{"position":[[124,6]]},"327":{"position":[[94,6]]},"329":{"position":[[186,6]]},"330":{"position":[[14,6]]},"331":{"position":[[15,6]]},"335":{"position":[[73,6],[140,6],[925,6]]},"338":{"position":[[43,6]]},"342":{"position":[[150,6]]},"346":{"position":[[572,6]]},"347":{"position":[[569,6]]},"362":{"position":[[1640,6]]}},"keywords":{}}],["jquery.offlin",{"_index":1921,"title":{},"content":{"323":{"position":[[146,14]]}},"keywords":{}}],["js",{"_index":1262,"title":{},"content":{"188":{"position":[[1683,3]]},"291":{"position":[[466,2]]},"315":{"position":[[38,2],[150,2],[246,4]]},"412":{"position":[[9729,2],[9820,3]]},"426":{"position":[[7,2]]},"427":{"position":[[169,2]]},"452":{"position":[[767,2]]},"482":{"position":[[375,4],[444,2]]},"551":{"position":[[455,2]]},"553":{"position":[[115,2]]},"554":{"position":[[600,4]]},"564":{"position":[[311,4]]},"638":{"position":[[305,4]]},"717":{"position":[[76,2],[135,2],[334,2],[633,4]]},"865":{"position":[[270,2]]},"896":{"position":[[366,2]]},"897":{"position":[[96,2]]},"898":{"position":[[61,2],[3023,4]]},"1237":{"position":[[729,4]]},"1266":{"position":[[888,6]]}},"keywords":{}}],["js/typescript",{"_index":681,"title":{},"content":{"43":{"position":[[541,14]]}},"keywords":{}}],["jsfiddl",{"_index":1864,"title":{},"content":{"304":{"position":[[412,8]]}},"keywords":{}}],["json",{"_index":217,"title":{"73":{"position":[[6,4]]},"104":{"position":[[6,4]]},"141":{"position":[[0,4]]},"169":{"position":[[0,4]]},"197":{"position":[[0,4]]},"231":{"position":[[6,6]]},"345":{"position":[[0,4]]},"348":{"position":[[0,4]]},"349":{"position":[[4,4]]},"355":{"position":[[8,4]]},"356":{"position":[[0,4]]},"357":{"position":[[8,4]]},"358":{"position":[[0,4],[32,4]]},"359":{"position":[[8,4]]},"361":{"position":[[9,4]]},"363":{"position":[[7,4]]},"364":{"position":[[13,4]]},"365":{"position":[[31,4]]},"366":{"position":[[24,4]]},"368":{"position":[[6,4]]},"369":{"position":[[5,4]]},"371":{"position":[[14,4]]},"372":{"position":[[18,4]]},"426":{"position":[[40,4]]},"457":{"position":[[16,4]]},"508":{"position":[[0,4]]},"528":{"position":[[0,4]]},"588":{"position":[[0,4]]},"1288":{"position":[[15,4]]}},"content":{"14":{"position":[[523,4]]},"20":{"position":[[55,4]]},"34":{"position":[[25,4],[214,4]]},"73":{"position":[[7,4]]},"104":{"position":[[21,4],[126,4]]},"141":{"position":[[72,4]]},"169":{"position":[[61,4],[121,4]]},"170":{"position":[[436,4]]},"174":{"position":[[441,4],[485,6],[621,4],[833,4]]},"197":{"position":[[72,4]]},"231":{"position":[[37,4],[165,4]]},"283":{"position":[[161,4]]},"303":{"position":[[268,4]]},"345":{"position":[[57,4]]},"350":{"position":[[29,5],[238,4]]},"351":{"position":[[280,4]]},"352":{"position":[[308,4]]},"353":{"position":[[327,4],[656,4],[733,4]]},"354":{"position":[[30,4],[1613,4],[1641,4]]},"356":{"position":[[120,4],[156,4],[211,4],[274,4],[414,4],[668,4]]},"357":{"position":[[28,4],[180,4],[210,4],[264,4]]},"358":{"position":[[57,4],[294,4],[382,4],[692,4]]},"359":{"position":[[142,4]]},"360":{"position":[[7,4],[50,4],[171,4],[264,4],[639,4],[717,4]]},"361":{"position":[[1,4],[30,4],[233,4],[389,4]]},"362":{"position":[[1,4],[380,4],[493,4],[594,4],[787,4],[893,4]]},"364":{"position":[[95,4],[133,4],[218,4],[313,4],[467,4],[491,4],[757,4]]},"365":{"position":[[20,4]]},"366":{"position":[[25,4],[430,4]]},"367":{"position":[[9,4]]},"369":{"position":[[98,4],[185,4],[317,4],[566,4],[978,4]]},"370":{"position":[[152,4]]},"371":{"position":[[101,4],[231,4]]},"372":{"position":[[84,4],[203,4],[347,4]]},"373":{"position":[[379,4],[450,4]]},"381":{"position":[[301,4]]},"382":{"position":[[61,4]]},"408":{"position":[[2968,4]]},"426":{"position":[[119,4]]},"427":{"position":[[663,4]]},"430":{"position":[[415,4],[445,4]]},"432":{"position":[[246,4]]},"439":{"position":[[586,4]]},"452":{"position":[[147,4],[606,4]]},"453":{"position":[[749,4]]},"457":{"position":[[80,4],[228,4],[281,4],[503,4],[568,4]]},"462":{"position":[[720,4]]},"464":{"position":[[797,4]]},"508":{"position":[[17,4]]},"528":{"position":[[14,4]]},"560":{"position":[[257,4],[454,4]]},"566":{"position":[[96,4],[158,4],[187,4],[361,4]]},"567":{"position":[[266,4]]},"588":{"position":[[50,4]]},"661":{"position":[[1630,4]]},"686":{"position":[[375,4]]},"687":{"position":[[95,4]]},"689":{"position":[[288,4]]},"698":{"position":[[43,4]]},"711":{"position":[[673,4]]},"749":{"position":[[3057,4],[11980,4],[13425,4],[19224,4]]},"772":{"position":[[1979,4]]},"800":{"position":[[79,4],[134,4]]},"841":{"position":[[199,6],[359,4],[1202,4]]},"865":{"position":[[116,5]]},"936":{"position":[[110,4]]},"952":{"position":[[31,4],[153,4]]},"953":{"position":[[15,4]]},"971":{"position":[[31,4],[265,4]]},"972":{"position":[[15,4]]},"1051":{"position":[[38,4],[164,4],[430,4]]},"1052":{"position":[[182,4]]},"1071":{"position":[[110,4]]},"1072":{"position":[[330,4]]},"1084":{"position":[[273,4]]},"1085":{"position":[[60,4],[1521,4]]},"1104":{"position":[[730,4]]},"1116":{"position":[[75,4]]},"1162":{"position":[[459,4]]},"1171":{"position":[[424,4]]},"1181":{"position":[[546,4]]},"1213":{"position":[[223,4]]},"1220":{"position":[[329,4]]},"1249":{"position":[[405,4]]},"1252":{"position":[[10,4]]},"1282":{"position":[[449,4]]},"1287":{"position":[[12,4]]},"1288":{"position":[[20,4],[110,4],[139,4],[255,4]]}},"keywords":{}}],["json.firstnam",{"_index":5730,"title":{},"content":{"1052":{"position":[[217,14]]}},"keywords":{}}],["json.pars",{"_index":2876,"title":{},"content":{"426":{"position":[[171,11]]},"800":{"position":[[200,12]]},"981":{"position":[[1006,12]]}},"keywords":{}}],["json.parse(event.data",{"_index":5053,"title":{},"content":{"875":{"position":[[8261,23]]}},"keywords":{}}],["json.parse(localstorage.getitem('us",{"_index":2881,"title":{},"content":{"426":{"position":[[500,41]]}},"keywords":{}}],["json.parse(sav",{"_index":3390,"title":{},"content":{"559":{"position":[[385,17]]}},"keywords":{}}],["json.passwordhash",{"_index":4311,"title":{},"content":{"749":{"position":[[13541,17]]}},"keywords":{}}],["json.stringifi",{"_index":1351,"title":{},"content":{"209":{"position":[[869,16]]},"255":{"position":[[1215,16]]},"426":{"position":[[152,14]]},"451":{"position":[[508,17]]},"457":{"position":[[532,16],[649,16]]},"988":{"position":[[2669,16]]},"1065":{"position":[[622,16]]},"1102":{"position":[[642,16]]}},"keywords":{}}],["json.stringify("production"",{"_index":3854,"title":{},"content":{"674":{"position":[[187,38]]}},"keywords":{}}],["json.stringify(a",{"_index":3912,"title":{},"content":{"691":{"position":[[261,17]]}},"keywords":{}}],["json.stringify(b",{"_index":3913,"title":{},"content":{"691":{"position":[[283,18]]}},"keywords":{}}],["json.stringify(changerow",{"_index":5039,"title":{},"content":{"875":{"position":[[6374,26]]}},"keywords":{}}],["json.stringify(data)}\\n\\n",{"_index":3603,"title":{},"content":{"612":{"position":[[2112,29]]}},"keywords":{}}],["json.stringify(ev",{"_index":5045,"title":{},"content":{"875":{"position":[[7459,21]]}},"keywords":{}}],["json.stringify(us",{"_index":2879,"title":{},"content":{"426":{"position":[[416,22]]}},"keywords":{}}],["json.stringify(usernam",{"_index":3391,"title":{},"content":{"559":{"position":[[467,26]]}},"keywords":{}}],["json/nosql",{"_index":2014,"title":{"354":{"position":[[30,11]]}},"content":{},"keywords":{}}],["json1",{"_index":2048,"title":{},"content":{"357":{"position":[[138,5],[334,5]]},"362":{"position":[[405,5]]}},"keywords":{}}],["json_extract",{"_index":6370,"title":{},"content":{"1282":{"position":[[467,13],[532,12]]}},"keywords":{}}],["jsonb",{"_index":2034,"title":{},"content":{"356":{"position":[[165,5],[381,5],[838,5]]},"362":{"position":[[357,5]]}},"keywords":{}}],["jsonschema",{"_index":2116,"title":{},"content":{"367":{"position":[[411,10],[465,10],[571,10]]},"1132":{"position":[[378,10]]},"1260":{"position":[[41,10]]},"1286":{"position":[[136,10]]}},"keywords":{}}],["json—wheth",{"_index":2090,"title":{},"content":{"362":{"position":[[328,12]]}},"keywords":{}}],["jsx",{"_index":5732,"title":{},"content":{"1052":{"position":[[531,4]]}},"keywords":{}}],["jump",{"_index":2339,"title":{},"content":{"396":{"position":[[424,5]]},"806":{"position":[[343,5]]}},"keywords":{}}],["jwt",{"_index":1538,"title":{},"content":{"245":{"position":[[160,3]]}},"keywords":{}}],["karma",{"_index":4076,"title":{},"content":{"730":{"position":[[177,6]]}},"keywords":{}}],["kb",{"_index":2972,"title":{},"content":{"454":{"position":[[693,2]]},"461":{"position":[[32,2],[257,2]]}},"keywords":{}}],["kbit/",{"_index":3026,"title":{},"content":{"462":{"position":[[628,7],[651,7]]}},"keywords":{}}],["keep",{"_index":740,"title":{},"content":{"47":{"position":[[1015,5]]},"125":{"position":[[163,5]]},"158":{"position":[[200,4]]},"162":{"position":[[607,5]]},"185":{"position":[[170,7]]},"255":{"position":[[1567,4]]},"265":{"position":[[761,5]]},"275":{"position":[[277,7]]},"287":{"position":[[972,5]]},"301":{"position":[[306,4]]},"323":{"position":[[177,4],[596,5]]},"328":{"position":[[236,4]]},"339":{"position":[[136,7]]},"342":{"position":[[137,7]]},"365":{"position":[[236,5]]},"369":{"position":[[445,4]]},"407":{"position":[[616,4]]},"408":{"position":[[5013,4]]},"411":{"position":[[2490,4]]},"412":{"position":[[3469,4],[8795,4],[15346,4]]},"419":{"position":[[984,7]]},"421":{"position":[[786,4]]},"460":{"position":[[139,5]]},"467":{"position":[[477,5]]},"481":{"position":[[827,4]]},"482":{"position":[[91,4]]},"490":{"position":[[646,4]]},"498":{"position":[[613,4]]},"502":{"position":[[895,4]]},"556":{"position":[[1791,4]]},"557":{"position":[[491,4]]},"562":{"position":[[1742,7]]},"574":{"position":[[289,7]]},"575":{"position":[[455,5]]},"612":{"position":[[497,5],[1980,5]]},"625":{"position":[[115,4]]},"626":{"position":[[907,4]]},"634":{"position":[[541,5]]},"635":{"position":[[465,5]]},"642":{"position":[[136,4]]},"699":{"position":[[552,4]]},"700":{"position":[[860,4]]},"707":{"position":[[487,4]]},"709":{"position":[[608,4]]},"754":{"position":[[321,4]]},"828":{"position":[[477,5]]},"857":{"position":[[521,4]]},"858":{"position":[[437,4]]},"860":{"position":[[343,5]]},"875":{"position":[[7335,5]]},"1009":{"position":[[596,5]]},"1069":{"position":[[367,4]]},"1148":{"position":[[219,5]]},"1304":{"position":[[499,4]]},"1316":{"position":[[3061,5]]},"1321":{"position":[[424,4]]}},"keywords":{}}],["keep.first",{"_index":3195,"title":{},"content":{"496":{"position":[[618,10]]}},"keywords":{}}],["keepindexesonpar",{"_index":6115,"title":{},"content":{"1164":{"position":[[521,19],[749,19],[796,20]]},"1165":{"position":[[414,20]]}},"keywords":{}}],["kelso",{"_index":5349,"title":{},"content":{"948":{"position":[[426,7]]}},"keywords":{}}],["kept",{"_index":3515,"title":{"618":{"position":[[20,4]]}},"content":{"582":{"position":[[51,4]]},"698":{"position":[[512,4]]},"799":{"position":[[195,4]]}},"keywords":{}}],["key",{"_index":556,"title":{"141":{"position":[[5,3]]},"169":{"position":[[5,3]]},"197":{"position":[[5,3]]},"323":{"position":[[0,3]]},"345":{"position":[[5,3]]},"360":{"position":[[0,3]]},"508":{"position":[[5,3]]},"528":{"position":[[5,3]]},"588":{"position":[[5,3]]},"631":{"position":[[11,3]]},"733":{"position":[[0,3]]},"734":{"position":[[7,3]]},"870":{"position":[[0,3]]},"896":{"position":[[0,3]]},"1078":{"position":[[18,4]]},"1122":{"position":[[29,3]]},"1156":{"position":[[0,3]]}},"content":{"35":{"position":[[345,3]]},"45":{"position":[[126,3]]},"53":{"position":[[3,3]]},"57":{"position":[[447,3],[483,3]]},"63":{"position":[[121,3]]},"119":{"position":[[54,3]]},"133":{"position":[[12,3]]},"141":{"position":[[77,3],[99,3],[135,4]]},"169":{"position":[[66,3],[126,5]]},"170":{"position":[[441,3]]},"182":{"position":[[12,3]]},"190":{"position":[[12,3]]},"197":{"position":[[77,3],[127,4]]},"247":{"position":[[112,3]]},"265":{"position":[[12,3]]},"271":{"position":[[266,3]]},"278":{"position":[[191,3]]},"283":{"position":[[166,3]]},"291":{"position":[[308,4]]},"293":{"position":[[81,3]]},"303":{"position":[[317,3],[460,3]]},"311":{"position":[[90,3]]},"316":{"position":[[50,3]]},"317":{"position":[[41,3],[199,3]]},"345":{"position":[[62,3]]},"354":{"position":[[512,5]]},"356":{"position":[[357,4]]},"358":{"position":[[195,3]]},"361":{"position":[[238,3],[323,3],[468,3]]},"362":{"position":[[941,3]]},"366":{"position":[[71,3]]},"367":{"position":[[771,3],[882,3]]},"407":{"position":[[861,3]]},"408":{"position":[[45,3],[3752,3]]},"412":{"position":[[10240,3]]},"424":{"position":[[176,3]]},"426":{"position":[[49,3]]},"427":{"position":[[491,3]]},"429":{"position":[[196,3],[554,3]]},"432":{"position":[[221,3],[1254,3],[1438,3]]},"441":{"position":[[173,3]]},"450":{"position":[[82,3]]},"451":{"position":[[134,3],[262,3],[745,3]]},"458":{"position":[[410,3]]},"468":{"position":[[170,3]]},"485":{"position":[[141,3]]},"491":{"position":[[24,3]]},"508":{"position":[[22,3]]},"528":{"position":[[19,3]]},"533":{"position":[[156,3]]},"544":{"position":[[402,3]]},"550":{"position":[[171,4]]},"551":{"position":[[234,3]]},"555":{"position":[[421,3],[770,5]]},"559":{"position":[[52,3],[1228,4]]},"560":{"position":[[60,3],[384,3]]},"566":{"position":[[54,3],[235,4]]},"567":{"position":[[991,3]]},"593":{"position":[[156,3]]},"604":{"position":[[336,3]]},"620":{"position":[[127,3]]},"639":{"position":[[75,3],[93,3]]},"659":{"position":[[77,3],[517,4],[598,4],[664,4],[803,3]]},"683":{"position":[[702,3]]},"693":{"position":[[914,4],[1234,4]]},"705":{"position":[[817,4]]},"716":{"position":[[318,4],[438,3]]},"734":{"position":[[5,3],[101,3],[803,3]]},"749":{"position":[[717,3],[1907,3],[7390,4],[9161,3],[10303,3],[11295,3],[19720,3],[20035,3],[20867,3],[21474,3],[22400,3]]},"772":{"position":[[283,3]]},"793":{"position":[[439,3]]},"835":{"position":[[19,3],[908,3]]},"838":{"position":[[392,3]]},"841":{"position":[[78,3]]},"863":{"position":[[18,4],[149,3]]},"897":{"position":[[541,3],[577,3]]},"898":{"position":[[176,3],[213,4],[981,4],[1688,3],[2821,3],[4455,5]]},"912":{"position":[[482,3]]},"934":{"position":[[262,3]]},"943":{"position":[[127,3]]},"951":{"position":[[186,3]]},"1056":{"position":[[296,3]]},"1065":{"position":[[1565,3],[1856,3]]},"1074":{"position":[[1020,3]]},"1077":{"position":[[90,3],[145,3]]},"1078":{"position":[[36,3],[317,4],[379,3],[582,3]]},"1080":{"position":[[205,3]]},"1082":{"position":[[290,3]]},"1083":{"position":[[490,3]]},"1102":{"position":[[1394,4]]},"1123":{"position":[[33,3],[479,3]]},"1124":{"position":[[967,3]]},"1132":{"position":[[821,3]]},"1147":{"position":[[59,3]]},"1177":{"position":[[378,4]]},"1246":{"position":[[1865,3]]},"1247":{"position":[[564,3]]},"1296":{"position":[[427,3]]},"1309":{"position":[[1425,3]]},"1320":{"position":[[775,3]]}},"keywords":{}}],["key(",{"_index":4283,"title":{},"content":{"749":{"position":[[11384,6]]}},"keywords":{}}],["key.set",{"_index":5945,"title":{},"content":{"1102":{"position":[[1287,7]]}},"keywords":{}}],["key="hero.id">",{"_index":3506,"title":{},"content":{"580":{"position":[[800,28]]},"601":{"position":[[188,28]]},"602":{"position":[[575,28]]}},"keywords":{}}],["key={doc.id}>{doc.name}</li>",{"_index":3183,"title":{},"content":{"494":{"position":[[366,37]]}},"keywords":{}}],["key={hero.id}>",{"_index":3316,"title":{},"content":{"541":{"position":[[619,17]]},"562":{"position":[[1490,17]]}},"keywords":{}}],["key={hero.id}>{hero.name}</li>",{"_index":3325,"title":{},"content":{"542":{"position":[[870,39]]}},"keywords":{}}],["key={hero.name}>{hero.name}</li>",{"_index":4764,"title":{},"content":{"829":{"position":[[3566,41]]}},"keywords":{}}],["key={index",{"_index":3279,"title":{},"content":{"523":{"position":[[726,11]]}},"keywords":{}}],["keychain",{"_index":3340,"title":{},"content":{"551":{"position":[[315,8]]},"556":{"position":[[119,8],[237,8],[297,8],[325,10],[521,11]]}},"keywords":{}}],["keychain.getgenericpassword",{"_index":3364,"title":{},"content":{"556":{"position":[[401,30]]}},"keywords":{}}],["keycompress",{"_index":1903,"title":{},"content":{"316":{"position":[[188,15],[400,15]]},"639":{"position":[[245,15],[371,15]]},"734":{"position":[[613,15],[670,14]]},"749":{"position":[[666,14]]},"1078":{"position":[[127,15],[184,14]]},"1080":{"position":[[77,15]]},"1084":{"position":[[164,14]]},"1311":{"position":[[369,15]]}},"keywords":{}}],["keyrang",{"_index":2992,"title":{},"content":{"459":{"position":[[579,8]]},"1296":{"position":[[1210,9],[1318,8],[1427,8]]}},"keywords":{}}],["keys.us",{"_index":3362,"title":{},"content":{"556":{"position":[[67,8]]}},"keywords":{}}],["keys/valu",{"_index":4809,"title":{},"content":{"841":{"position":[[892,11]]}},"keywords":{}}],["keystrok",{"_index":2712,"title":{},"content":{"412":{"position":[[6528,9]]}},"keywords":{}}],["keyword",{"_index":1437,"title":{"243":{"position":[[4,10]]}},"content":{"723":{"position":[[2250,7]]},"789":{"position":[[349,7]]},"791":{"position":[[250,8]]},"808":{"position":[[9,7]]}},"keywords":{}}],["keywords.y",{"_index":6565,"title":{},"content":{"1317":{"position":[[437,12]]}},"keywords":{}}],["key—but",{"_index":5212,"title":{},"content":{"898":{"position":[[2890,7]]}},"keywords":{}}],["kill",{"_index":6107,"title":{},"content":{"1162":{"position":[[64,6]]},"1171":{"position":[[81,6]]},"1181":{"position":[[130,6]]}},"keywords":{}}],["kind",{"_index":3919,"title":{},"content":{"691":{"position":[[631,4]]},"698":{"position":[[779,4]]},"700":{"position":[[1046,5]]},"701":{"position":[[235,4]]},"705":{"position":[[195,4]]},"784":{"position":[[66,4]]},"1067":{"position":[[1661,5]]},"1313":{"position":[[934,4]]},"1316":{"position":[[2484,4]]}},"keywords":{}}],["king",{"_index":4096,"title":{},"content":{"739":{"position":[[539,8]]}},"keywords":{}}],["kit",{"_index":1229,"title":{},"content":{"177":{"position":[[51,3]]}},"keywords":{}}],["kitti",{"_index":4612,"title":{},"content":{"792":{"position":[[389,7]]}},"keywords":{}}],["know",{"_index":177,"title":{"633":{"position":[[23,4]]}},"content":{"11":{"position":[[1009,4]]},"367":{"position":[[613,4]]},"410":{"position":[[848,4]]},"411":{"position":[[4510,4]]},"412":{"position":[[239,4],[955,5]]},"413":{"position":[[17,4]]},"456":{"position":[[14,4]]},"458":{"position":[[1590,4]]},"488":{"position":[[13,4]]},"562":{"position":[[1651,5]]},"678":{"position":[[82,4]]},"686":{"position":[[352,4]]},"688":{"position":[[1049,4]]},"704":{"position":[[235,4]]},"709":{"position":[[584,4],[958,4]]},"749":{"position":[[262,4]]},"757":{"position":[[262,4]]},"796":{"position":[[714,4]]},"798":{"position":[[648,5]]},"861":{"position":[[1374,5]]},"875":{"position":[[1919,5]]},"945":{"position":[[387,5]]},"965":{"position":[[133,5]]},"989":{"position":[[394,4]]},"996":{"position":[[217,5]]},"1008":{"position":[[216,5]]},"1018":{"position":[[911,4]]},"1066":{"position":[[169,4],[454,5]]},"1079":{"position":[[347,4]]},"1085":{"position":[[922,4],[2403,4]]},"1175":{"position":[[253,5]]},"1192":{"position":[[724,4]]},"1207":{"position":[[234,4]]},"1230":{"position":[[10,4]]},"1251":{"position":[[230,5]]},"1257":{"position":[[56,4]]},"1318":{"position":[[491,4],[573,4]]},"1321":{"position":[[92,4],[630,4]]},"1322":{"position":[[74,4]]}},"keywords":{}}],["knowledg",{"_index":1415,"title":{},"content":{"230":{"position":[[225,9]]}},"keywords":{}}],["known",{"_index":134,"title":{"625":{"position":[[0,5]]},"850":{"position":[[0,5]]},"909":{"position":[[0,5]]},"1176":{"position":[[0,5]]},"1282":{"position":[[0,5]]}},"content":{"9":{"position":[[51,5]]},"23":{"position":[[78,5]]},"25":{"position":[[23,5]]},"162":{"position":[[39,5]]},"189":{"position":[[39,5]]},"299":{"position":[[953,5]]},"305":{"position":[[562,5]]},"398":{"position":[[3201,5]]},"445":{"position":[[14,5]]},"625":{"position":[[59,5]]},"627":{"position":[[16,5]]},"723":{"position":[[76,5]]},"749":{"position":[[1691,5],[7585,5],[7684,5]]},"798":{"position":[[831,5]]},"839":{"position":[[301,5]]},"954":{"position":[[13,5]]},"982":{"position":[[427,5]]},"1009":{"position":[[742,5]]},"1045":{"position":[[20,5]]},"1066":{"position":[[637,5]]},"1085":{"position":[[1808,5]]},"1294":{"position":[[1962,5]]},"1296":{"position":[[831,5],[1307,6]]}},"keywords":{}}],["koa",{"_index":5926,"title":{"1099":{"position":[[20,4]]}},"content":{"1099":{"position":[[66,3],[90,3],[286,5]]}},"keywords":{}}],["kopieren",{"_index":1381,"title":{},"content":{"211":{"position":[[310,8]]}},"keywords":{}}],["kotlin",{"_index":679,"title":{},"content":{"43":{"position":[[508,7]]}},"keywords":{}}],["l6",{"_index":2214,"title":{},"content":{"391":{"position":[[410,2],[553,2]]},"401":{"position":[[213,2]]},"402":{"position":[[1912,2]]}},"keywords":{}}],["lab",{"_index":6581,"title":{},"content":{"1324":{"position":[[827,5]]}},"keywords":{}}],["label",{"_index":363,"title":{},"content":{"22":{"position":[[12,6]]},"570":{"position":[[835,7]]}},"keywords":{}}],["lack",{"_index":698,"title":{},"content":{"45":{"position":[[249,5]]},"47":{"position":[[1076,5]]},"310":{"position":[[366,4]]},"317":{"position":[[95,4]]},"331":{"position":[[153,4]]},"412":{"position":[[14279,4]]},"427":{"position":[[897,5]]},"432":{"position":[[541,5]]},"435":{"position":[[183,5]]},"452":{"position":[[256,5]]},"566":{"position":[[327,5]]},"624":{"position":[[985,5],[1548,7]]},"661":{"position":[[1369,7]]},"711":{"position":[[1866,7]]},"836":{"position":[[1318,4]]},"840":{"position":[[236,7]]}},"keywords":{}}],["lag",{"_index":2029,"title":{},"content":{"354":{"position":[[1230,3]]},"571":{"position":[[1685,3]]}},"keywords":{}}],["laggi",{"_index":4768,"title":{},"content":{"835":{"position":[[345,5]]}},"keywords":{}}],["lamport",{"_index":6491,"title":{},"content":{"1305":{"position":[[457,7]]}},"keywords":{}}],["lan",{"_index":2637,"title":{},"content":{"411":{"position":[[5090,3]]}},"keywords":{}}],["lan.cost",{"_index":5247,"title":{},"content":{"902":{"position":[[788,8]]}},"keywords":{}}],["land",{"_index":2564,"title":{},"content":{"408":{"position":[[4177,5]]}},"keywords":{}}],["landscap",{"_index":1684,"title":{},"content":{"289":{"position":[[1538,10]]},"510":{"position":[[22,9]]},"530":{"position":[[558,9]]},"624":{"position":[[8,9]]}},"keywords":{}}],["lang",{"_index":3660,"title":{},"content":{"620":{"position":[[355,4]]}},"keywords":{}}],["lang="ts">",{"_index":3541,"title":{},"content":{"601":{"position":[[353,23]]}},"keywords":{}}],["languag",{"_index":416,"title":{},"content":{"25":{"position":[[131,8],[193,10]]},"36":{"position":[[96,9]]},"37":{"position":[[174,9]]},"39":{"position":[[379,8]]},"364":{"position":[[50,8],[272,9]]},"408":{"position":[[3536,9]]},"566":{"position":[[352,8]]},"569":{"position":[[1176,8]]},"661":{"position":[[149,8]]},"711":{"position":[[72,8],[201,8]]},"836":{"position":[[151,8]]},"841":{"position":[[376,9]]},"1102":{"position":[[203,9]]},"1249":{"position":[[158,8]]}},"keywords":{}}],["laptop",{"_index":2037,"title":{},"content":{"356":{"position":[[468,10]]},"392":{"position":[[5200,6]]}},"keywords":{}}],["laravel",{"_index":6379,"title":{},"content":{"1284":{"position":[[187,7]]}},"keywords":{}}],["larg",{"_index":693,"title":{},"content":{"45":{"position":[[68,5]]},"58":{"position":[[177,5]]},"66":{"position":[[347,5]]},"100":{"position":[[43,5]]},"111":{"position":[[191,5]]},"138":{"position":[[192,5]]},"141":{"position":[[256,5]]},"169":{"position":[[281,5]]},"173":{"position":[[2115,5]]},"174":{"position":[[2537,5]]},"217":{"position":[[341,5]]},"301":{"position":[[83,5]]},"303":{"position":[[420,5]]},"304":{"position":[[33,5],[164,5],[364,5]]},"305":{"position":[[196,5]]},"306":{"position":[[157,5]]},"311":{"position":[[1,5]]},"314":{"position":[[1129,7]]},"321":{"position":[[232,5]]},"342":{"position":[[74,5]]},"345":{"position":[[24,5]]},"346":{"position":[[765,5]]},"353":{"position":[[400,5]]},"358":{"position":[[376,5],[595,5]]},"361":{"position":[[255,6]]},"369":{"position":[[502,5]]},"376":{"position":[[560,5]]},"385":{"position":[[225,5]]},"386":{"position":[[109,5]]},"395":{"position":[[463,5]]},"396":{"position":[[771,5]]},"401":{"position":[[487,5],[524,5],[570,5]]},"408":{"position":[[741,5],[1302,5],[2273,5]]},"411":{"position":[[75,5]]},"412":{"position":[[7394,6]]},"417":{"position":[[156,6]]},"418":{"position":[[391,5]]},"430":{"position":[[439,5]]},"446":{"position":[[886,5]]},"452":{"position":[[119,5]]},"453":{"position":[[101,5]]},"461":{"position":[[405,6]]},"495":{"position":[[880,7]]},"497":{"position":[[276,6]]},"559":{"position":[[1643,5]]},"560":{"position":[[448,5]]},"566":{"position":[[599,5],[636,5],[688,5],[758,5]]},"574":{"position":[[541,5]]},"623":{"position":[[27,5]]},"624":{"position":[[1384,7]]},"639":{"position":[[47,5]]},"642":{"position":[[250,5]]},"643":{"position":[[5,5]]},"644":{"position":[[567,5]]},"723":{"position":[[188,5]]},"836":{"position":[[1751,5]]},"838":{"position":[[1114,5]]},"839":{"position":[[1102,5]]},"841":{"position":[[1463,5]]},"1009":{"position":[[118,5],[890,6]]},"1072":{"position":[[2906,5]]},"1112":{"position":[[299,5]]},"1132":{"position":[[261,5],[1231,5]]}},"keywords":{}}],["large.no",{"_index":3407,"title":{},"content":{"559":{"position":[[1154,8]]}},"keywords":{}}],["larger",{"_index":898,"title":{},"content":{"64":{"position":[[121,6]]},"227":{"position":[[59,6]]},"287":{"position":[[768,6]]},"299":{"position":[[1654,6]]},"321":{"position":[[417,6]]},"369":{"position":[[684,6]]},"394":{"position":[[1778,6]]},"401":{"position":[[644,6],[759,6]]},"432":{"position":[[381,6]]},"560":{"position":[[239,6]]},"581":{"position":[[534,6]]},"587":{"position":[[132,6]]}},"keywords":{}}],["larger.webtransport",{"_index":3664,"title":{},"content":{"621":{"position":[[694,20]]}},"keywords":{}}],["largest",{"_index":2324,"title":{},"content":{"394":{"position":[[1145,8]]}},"keywords":{}}],["lasagna",{"_index":4594,"title":{},"content":{"785":{"position":[[341,7]]}},"keywords":{}}],["last",{"_index":229,"title":{},"content":{"14":{"position":[[849,4]]},"27":{"position":[[313,4]]},"32":{"position":[[269,4]]},"203":{"position":[[65,4]]},"250":{"position":[[22,4]]},"412":{"position":[[2359,4],[3287,4]]},"496":{"position":[[1,4],[91,4]]},"635":{"position":[[222,4]]},"647":{"position":[[104,4],[501,4]]},"688":{"position":[[880,4]]},"697":{"position":[[188,4]]},"885":{"position":[[84,4],[2429,4]]},"886":{"position":[[114,4]]},"898":{"position":[[293,4]]},"948":{"position":[[698,4]]},"983":{"position":[[209,4]]},"984":{"position":[[188,4],[526,4]]},"986":{"position":[[102,4],[179,4],[876,4]]},"988":{"position":[[4167,4]]},"990":{"position":[[521,4]]},"995":{"position":[[1226,4],[1402,4],[1452,4]]},"1002":{"position":[[942,4]]},"1065":{"position":[[1863,4]]},"1294":{"position":[[512,4],[684,4]]},"1296":{"position":[[443,4],[1237,4]]},"1305":{"position":[[157,4]]},"1316":{"position":[[1675,4]]},"1318":{"position":[[287,4]]},"1320":{"position":[[911,4]]}},"keywords":{}}],["lastcheckpoint",{"_index":1353,"title":{},"content":{"209":{"position":[[1000,16],[1171,14]]},"255":{"position":[[1335,16]]},"632":{"position":[[2380,16],[2473,14]]},"988":{"position":[[3579,14],[4286,16],[4353,14]]}},"keywords":{}}],["lastcheckpoint.updatedat",{"_index":5465,"title":{},"content":{"988":{"position":[[3596,24]]}},"keywords":{}}],["lastdoc",{"_index":5110,"title":{},"content":{"885":{"position":[[2468,7]]},"1294":{"position":[[976,8],[1308,7],[1343,7],[1645,7]]}},"keywords":{}}],["lastdoc.ag",{"_index":6433,"title":{},"content":{"1294":{"position":[[1318,11]]}},"keywords":{}}],["lastdoc.id",{"_index":5113,"title":{},"content":{"885":{"position":[[2543,11]]},"1294":{"position":[[1353,10]]}},"keywords":{}}],["lastdoc.updatedat",{"_index":5114,"title":{},"content":{"885":{"position":[[2566,17]]}},"keywords":{}}],["lasteventid",{"_index":5017,"title":{},"content":{"875":{"position":[[4386,11],[4545,14]]}},"keywords":{}}],["lastid",{"_index":2268,"title":{},"content":{"392":{"position":[[4010,6],[4230,10]]}},"keywords":{}}],["lastlocalcheckpoint",{"_index":5537,"title":{},"content":{"1002":{"position":[[308,20],[386,19],[494,19],[715,19]]}},"keywords":{}}],["lastnam",{"_index":4515,"title":{},"content":{"764":{"position":[[150,8]]},"820":{"position":[[643,9]]},"872":{"position":[[2007,9],[2077,11],[4237,9],[4307,11]]},"885":{"position":[[562,9],[657,9]]},"898":{"position":[[2587,9],[2682,11]]},"942":{"position":[[223,9]]},"943":{"position":[[431,9]]},"944":{"position":[[239,9],[275,9]]},"946":{"position":[[195,9]]},"947":{"position":[[213,9],[248,9]]},"948":{"position":[[416,9]]},"1035":{"position":[[137,9]]},"1051":{"position":[[267,9],[537,9]]},"1078":{"position":[[406,10],[644,9],[707,10],[961,9],[1088,9]]},"1080":{"position":[[358,9]]},"1082":{"position":[[352,9]]},"1083":{"position":[[552,9]]},"1249":{"position":[[513,9]]},"1311":{"position":[[510,9],[606,11],[1553,9]]}},"keywords":{}}],["lastname)"",{"_index":4003,"title":{},"content":{"711":{"position":[[1298,17]]}},"keywords":{}}],["lastofarray",{"_index":4989,"title":{},"content":{"875":{"position":[[2030,11],[4276,11]]},"988":{"position":[[190,11]]}},"keywords":{}}],["lastofarray(docs).nam",{"_index":5158,"title":{},"content":{"888":{"position":[[1135,23]]}},"keywords":{}}],["lastofarray(docs).updatedat",{"_index":5159,"title":{},"content":{"888":{"position":[[1170,27]]}},"keywords":{}}],["lastofarray(documents).id",{"_index":5001,"title":{},"content":{"875":{"position":[[2689,26]]}},"keywords":{}}],["lastofarray(documents).updatedat",{"_index":5002,"title":{},"content":{"875":{"position":[[2727,32]]}},"keywords":{}}],["lastofarray(documentsfromremote).id",{"_index":5470,"title":{},"content":{"988":{"position":[[4376,36]]}},"keywords":{}}],["lastofarray(documentsfromremote).updatedat",{"_index":5471,"title":{},"content":{"988":{"position":[[4424,42]]}},"keywords":{}}],["lastofarray(subresult",{"_index":6444,"title":{},"content":{"1294":{"position":[[1655,23]]}},"keywords":{}}],["lastremotecheckpoint",{"_index":5540,"title":{},"content":{"1002":{"position":[[985,20],[1147,20],[1369,20]]}},"keywords":{}}],["laststat",{"_index":5715,"title":{},"content":{"1049":{"position":[[84,9],[144,9]]}},"keywords":{}}],["lastworkerid",{"_index":2267,"title":{},"content":{"392":{"position":[[3988,12],[4165,12]]}},"keywords":{}}],["late",{"_index":3100,"title":{},"content":{"470":{"position":[[532,6]]}},"keywords":{}}],["latenc",{"_index":675,"title":{"92":{"position":[[32,8]]},"220":{"position":[[4,7]]},"415":{"position":[[0,7]]},"464":{"position":[[0,7]]},"465":{"position":[[0,7]]},"621":{"position":[[0,8]]},"629":{"position":[[5,7]]},"630":{"position":[[9,7]]},"631":{"position":[[23,7]]},"780":{"position":[[0,7]]},"1239":{"position":[[4,7]]}},"content":{"43":{"position":[[448,8]]},"46":{"position":[[304,8]]},"65":{"position":[[1014,7],[1097,7]]},"92":{"position":[[84,8]]},"173":{"position":[[2050,7],[2509,8],[2617,8]]},"216":{"position":[[163,8]]},"220":{"position":[[31,7]]},"369":{"position":[[880,8],[952,7]]},"375":{"position":[[293,8]]},"378":{"position":[[221,8]]},"408":{"position":[[2149,7],[2318,7],[2714,7],[3198,7]]},"410":{"position":[[60,7],[191,7]]},"411":{"position":[[5687,7]]},"415":{"position":[[327,7]]},"462":{"position":[[148,10],[659,8]]},"463":{"position":[[889,7],[1081,7]]},"464":{"position":[[20,7],[495,7]]},"465":{"position":[[474,8]]},"466":{"position":[[456,8]]},"467":{"position":[[533,7]]},"486":{"position":[[32,8]]},"534":{"position":[[339,7]]},"569":{"position":[[394,8]]},"594":{"position":[[337,7]]},"611":{"position":[[554,7]]},"613":{"position":[[64,7]]},"620":{"position":[[147,8],[756,8]]},"621":{"position":[[31,7],[227,7],[384,7],[663,7],[737,7]]},"630":{"position":[[143,9]]},"632":{"position":[[247,8]]},"640":{"position":[[484,7]]},"641":{"position":[[57,7],[204,8]]},"643":{"position":[[333,7]]},"644":{"position":[[399,7],[605,7]]},"699":{"position":[[480,7]]},"723":{"position":[[734,7],[2804,8]]},"778":{"position":[[222,7]]},"780":{"position":[[158,7],[321,7],[707,7],[767,7]]},"901":{"position":[[436,7]]},"902":{"position":[[9,7]]},"1093":{"position":[[350,7]]},"1123":{"position":[[80,7],[296,7]]},"1211":{"position":[[502,7]]},"1239":{"position":[[72,7],[253,7],[466,8]]},"1270":{"position":[[234,8]]}},"keywords":{}}],["latency"",{"_index":5243,"title":{},"content":{"902":{"position":[[533,13]]}},"keywords":{}}],["later",{"_index":568,"title":{},"content":{"36":{"position":[[61,5]]},"212":{"position":[[441,6]]},"314":{"position":[[117,6],[937,6]]},"334":{"position":[[153,5]]},"402":{"position":[[688,5]]},"411":{"position":[[287,5],[3385,6]]},"420":{"position":[[706,5]]},"634":{"position":[[456,5]]},"702":{"position":[[38,5]]},"710":{"position":[[2226,5]]},"774":{"position":[[256,5]]},"838":{"position":[[1644,5]]},"861":{"position":[[186,5]]},"875":{"position":[[4217,5]]},"886":{"position":[[326,5]]},"990":{"position":[[90,5]]},"998":{"position":[[51,5]]},"1006":{"position":[[310,6]]},"1083":{"position":[[66,6]]},"1104":{"position":[[810,5]]},"1105":{"position":[[1252,6]]},"1195":{"position":[[171,5]]},"1292":{"position":[[588,5]]},"1319":{"position":[[11,5]]}},"keywords":{}}],["latest",{"_index":1177,"title":{"731":{"position":[[15,6]]}},"content":{"159":{"position":[[351,6]]},"185":{"position":[[205,6]]},"289":{"position":[[1377,6]]},"339":{"position":[[148,6]]},"410":{"position":[[2219,6]]},"446":{"position":[[732,6]]},"481":{"position":[[169,6]]},"494":{"position":[[528,6]]},"496":{"position":[[338,6],[737,6]]},"636":{"position":[[419,6]]},"726":{"position":[[16,6]]},"731":{"position":[[17,6],[257,6]]},"982":{"position":[[295,6],[420,6],[527,6],[601,6],[663,6]]},"983":{"position":[[353,6],[794,6]]},"986":{"position":[[1292,6]]},"1002":{"position":[[270,6]]},"1044":{"position":[[35,6]]},"1045":{"position":[[13,6]]},"1278":{"position":[[170,6]]}},"keywords":{}}],["latestdoc",{"_index":5704,"title":{},"content":{"1045":{"position":[[191,9],[256,11]]}},"keywords":{}}],["launch",{"_index":1563,"title":{},"content":{"253":{"position":[[157,6]]},"412":{"position":[[11401,6]]},"420":{"position":[[1390,6]]},"723":{"position":[[1756,8]]}},"keywords":{}}],["lay",{"_index":3955,"title":{},"content":{"700":{"position":[[880,6]]}},"keywords":{}}],["layer",{"_index":400,"title":{"72":{"position":[[17,5]]},"112":{"position":[[17,5]]},"131":{"position":[[20,6]]},"162":{"position":[[20,6]]},"189":{"position":[[20,6]]},"239":{"position":[[17,5]]},"287":{"position":[[20,6]]},"336":{"position":[[20,6]]},"504":{"position":[[30,7]]},"524":{"position":[[20,6]]},"581":{"position":[[20,6]]}},"content":{"24":{"position":[[163,6],[573,5]]},"40":{"position":[[399,6]]},"46":{"position":[[144,6]]},"72":{"position":[[32,5]]},"112":{"position":[[32,6]]},"131":{"position":[[32,6],[257,6],[809,6],[932,5]]},"155":{"position":[[221,5]]},"162":{"position":[[31,7],[136,6],[249,5],[446,5],[601,5],[674,5]]},"174":{"position":[[2569,5],[2642,5]]},"189":{"position":[[58,7],[193,5],[426,5],[688,5]]},"239":{"position":[[34,5]]},"254":{"position":[[235,5]]},"262":{"position":[[601,6]]},"263":{"position":[[354,6]]},"287":{"position":[[96,6],[151,6],[1212,5]]},"291":{"position":[[61,5]]},"336":{"position":[[52,8]]},"369":{"position":[[1312,6],[1367,6]]},"383":{"position":[[357,5]]},"396":{"position":[[674,6],[694,6]]},"411":{"position":[[2230,6]]},"412":{"position":[[2697,7],[9813,6]]},"452":{"position":[[366,5]]},"490":{"position":[[239,5]]},"504":{"position":[[60,7]]},"524":{"position":[[30,7],[122,5],[327,6]]},"536":{"position":[[95,5]]},"551":{"position":[[163,6]]},"560":{"position":[[692,5]]},"576":{"position":[[107,5]]},"595":{"position":[[1358,5]]},"596":{"position":[[93,5]]},"630":{"position":[[924,5],[972,5]]},"640":{"position":[[16,5],[453,6]]},"662":{"position":[[894,7]]},"703":{"position":[[127,6],[621,6],[756,5],[891,5]]},"709":{"position":[[715,6],[1121,6]]},"710":{"position":[[439,5]]},"774":{"position":[[431,6]]},"802":{"position":[[166,6]]},"836":{"position":[[1523,6]]},"988":{"position":[[1972,6]]},"1090":{"position":[[249,6],[277,5],[1176,5]]},"1092":{"position":[[582,6]]},"1124":{"position":[[159,5]]},"1132":{"position":[[151,6]]},"1198":{"position":[[1193,5]]},"1236":{"position":[[15,5]]},"1305":{"position":[[740,5]]},"1316":{"position":[[3864,6]]},"1320":{"position":[[634,5],[841,5]]}},"keywords":{}}],["layers"",{"_index":3511,"title":{},"content":{"581":{"position":[[66,12]]}},"keywords":{}}],["layout",{"_index":3961,"title":{"986":{"position":[[5,6]]}},"content":{"702":{"position":[[72,7]]},"1319":{"position":[[32,6]]}},"keywords":{}}],["lazi",{"_index":2169,"title":{},"content":{"385":{"position":[[6,4]]},"724":{"position":[[1188,5]]},"1194":{"position":[[83,5]]}},"keywords":{}}],["lazili",{"_index":6007,"title":{},"content":{"1120":{"position":[[242,6]]}},"keywords":{}}],["ld1",{"_index":4312,"title":{},"content":{"749":{"position":[[13633,3]]}},"keywords":{}}],["ld2",{"_index":4314,"title":{},"content":{"749":{"position":[[13756,3]]}},"keywords":{}}],["ld3",{"_index":4316,"title":{},"content":{"749":{"position":[[13854,3]]}},"keywords":{}}],["ld4",{"_index":4317,"title":{},"content":{"749":{"position":[[13998,3]]}},"keywords":{}}],["ld5",{"_index":4318,"title":{},"content":{"749":{"position":[[14081,3]]}},"keywords":{}}],["ld6",{"_index":4319,"title":{},"content":{"749":{"position":[[14175,3]]}},"keywords":{}}],["ld7",{"_index":4321,"title":{},"content":{"749":{"position":[[14287,3]]}},"keywords":{}}],["ld8",{"_index":4322,"title":{},"content":{"749":{"position":[[14372,3]]}},"keywords":{}}],["lead",{"_index":279,"title":{},"content":{"16":{"position":[[445,4]]},"277":{"position":[[247,5]]},"407":{"position":[[385,5]]},"409":{"position":[[84,5]]},"427":{"position":[[319,7]]},"430":{"position":[[365,4],[763,4]]},"515":{"position":[[164,7]]},"521":{"position":[[197,5]]},"622":{"position":[[310,7]]},"698":{"position":[[2462,4]]},"742":{"position":[[35,7]]},"800":{"position":[[661,4]]},"801":{"position":[[534,7]]},"802":{"position":[[81,4],[767,7]]},"821":{"position":[[999,5]]},"863":{"position":[[111,7],[548,4]]},"1044":{"position":[[71,4]]},"1085":{"position":[[2327,7]]},"1126":{"position":[[300,4]]},"1174":{"position":[[421,7],[571,7],[619,7]]},"1188":{"position":[[320,4]]},"1305":{"position":[[30,5],[266,5]]},"1316":{"position":[[3286,5]]}},"keywords":{}}],["leader",{"_index":3758,"title":{"735":{"position":[[0,6]]},"738":{"position":[[8,6]]},"740":{"position":[[17,8]]}},"content":{"653":{"position":[[1330,7]]},"723":{"position":[[861,6]]},"737":{"position":[[51,6],[190,6],[207,6],[313,7],[422,7],[465,6]]},"738":{"position":[[15,6],[52,6]]},"739":{"position":[[180,7],[578,6]]},"740":{"position":[[53,6],[256,8],[348,6],[381,6],[633,6]]},"741":{"position":[[21,6]]},"743":{"position":[[5,6],[74,6]]},"793":{"position":[[1112,6]]},"974":{"position":[[70,7]]},"988":{"position":[[1330,7],[1416,7]]},"989":{"position":[[354,6]]},"1003":{"position":[[107,6],[315,8]]},"1171":{"position":[[290,6]]},"1174":{"position":[[648,6]]},"1301":{"position":[[1212,6],[1246,6],[1332,7],[1372,6],[1472,6]]}},"keywords":{}}],["leaderelect",{"_index":3650,"title":{},"content":{"617":{"position":[[2202,14]]},"1174":{"position":[[373,14]]}},"keywords":{}}],["leaderelector",{"_index":4106,"title":{},"content":{"740":{"position":[[505,13]]}},"keywords":{}}],["leaderelector.ondupl",{"_index":4108,"title":{},"content":{"740":{"position":[[575,25]]}},"keywords":{}}],["leak",{"_index":1974,"title":{},"content":{"346":{"position":[[458,6]]},"616":{"position":[[892,4]]}},"keywords":{}}],["lean",{"_index":5589,"title":{},"content":{"1009":{"position":[[621,5]]}},"keywords":{}}],["leaner",{"_index":1409,"title":{},"content":{"227":{"position":[[283,6]]}},"keywords":{}}],["leap",{"_index":2566,"title":{},"content":{"408":{"position":[[4363,4]]}},"keywords":{}}],["learn",{"_index":857,"title":{"1216":{"position":[[0,5]]}},"content":{"57":{"position":[[118,5],[464,5]]},"306":{"position":[[1,5]]},"318":{"position":[[353,5]]},"347":{"position":[[504,5]]},"362":{"position":[[1575,5]]},"390":{"position":[[266,8]]},"391":{"position":[[204,8],[994,8]]},"392":{"position":[[1991,8]]},"402":{"position":[[1777,8]]},"420":{"position":[[749,5]]},"442":{"position":[[1,5]]},"483":{"position":[[542,8],[696,5]]},"491":{"position":[[766,5],[1862,5]]},"496":{"position":[[859,5]]},"544":{"position":[[151,5]]},"548":{"position":[[1,5]]},"557":{"position":[[1,5],[88,5]]},"567":{"position":[[635,5]]},"591":{"position":[[733,5]]},"608":{"position":[[1,5]]},"644":{"position":[[357,5]]},"663":{"position":[[43,8]]},"686":{"position":[[267,5]]},"710":{"position":[[2449,5]]},"712":{"position":[[1,5]]},"776":{"position":[[77,8]]},"786":{"position":[[1,5]]},"834":{"position":[[154,5]]},"838":{"position":[[3173,5]]},"842":{"position":[[15,5],[177,8]]},"884":{"position":[[58,7]]},"889":{"position":[[1050,5]]},"899":{"position":[[28,5]]},"904":{"position":[[2436,5]]},"987":{"position":[[1088,5]]},"1065":{"position":[[28,5],[100,5],[144,5]]},"1125":{"position":[[875,5]]},"1249":{"position":[[192,7]]},"1309":{"position":[[401,5]]}},"keywords":{}}],["leav",{"_index":2515,"title":{},"content":{"405":{"position":[[174,5]]},"471":{"position":[[159,5]]},"548":{"position":[[115,5]]},"557":{"position":[[246,5]]},"608":{"position":[[115,5]]},"628":{"position":[[261,5]]},"1007":{"position":[[794,6]]},"1134":{"position":[[503,5]]}},"keywords":{}}],["led",{"_index":3902,"title":{},"content":{"689":{"position":[[436,3]]}},"keywords":{}}],["left",{"_index":2242,"title":{},"content":{"392":{"position":[[2305,4]]},"458":{"position":[[390,4]]},"696":{"position":[[1086,4]]},"1198":{"position":[[1487,4]]},"1315":{"position":[[424,4]]},"1317":{"position":[[776,4]]}},"keywords":{}}],["legitim",{"_index":3643,"title":{},"content":{"617":{"position":[[1115,10]]}},"keywords":{}}],["lend",{"_index":2604,"title":{},"content":{"410":{"position":[[1835,4]]}},"keywords":{}}],["length",{"_index":2353,"title":{"926":{"position":[[0,7]]}},"content":{"397":{"position":[[220,6]]},"749":{"position":[[12987,6]]},"863":{"position":[[163,6]]},"918":{"position":[[145,7]]},"926":{"position":[[5,6]]},"1004":{"position":[[361,7]]},"1067":{"position":[[1728,6]]},"1079":{"position":[[386,6]]},"1213":{"position":[[928,11]]}},"keywords":{}}],["less",{"_index":955,"title":{"802":{"position":[[4,4]]}},"content":{"68":{"position":[[86,4]]},"227":{"position":[[116,4]]},"299":{"position":[[911,4]]},"302":{"position":[[612,4]]},"312":{"position":[[284,4]]},"402":{"position":[[486,4],[1010,4],[1072,4],[1232,4],[1346,4],[2608,4]]},"411":{"position":[[1083,4],[1956,4]]},"427":{"position":[[367,4]]},"610":{"position":[[798,4]]},"620":{"position":[[694,4]]},"621":{"position":[[480,4]]},"622":{"position":[[279,4]]},"623":{"position":[[285,4]]},"681":{"position":[[367,4]]},"746":{"position":[[177,4]]},"816":{"position":[[228,4]]},"849":{"position":[[606,5]]},"886":{"position":[[1549,4]]},"1062":{"position":[[124,4]]},"1124":{"position":[[1794,4]]},"1162":{"position":[[696,4]]},"1181":{"position":[[784,4]]},"1192":{"position":[[771,5]]},"1208":{"position":[[552,4]]},"1297":{"position":[[132,4],[564,5]]}},"keywords":{}}],["less"",{"_index":5893,"title":{},"content":{"1085":{"position":[[830,10]]}},"keywords":{}}],["let",{"_index":891,"title":{},"content":{"61":{"position":[[468,7]]},"203":{"position":[[113,4]]},"212":{"position":[[224,4]]},"250":{"position":[[165,4]]},"301":{"position":[[363,7]]},"360":{"position":[[330,7]]},"411":{"position":[[3849,7]]},"412":{"position":[[6168,4]]},"413":{"position":[[59,4]]},"414":{"position":[[72,7]]},"421":{"position":[[772,7]]},"449":{"position":[[7,4]]},"456":{"position":[[51,4]]},"464":{"position":[[6,4],[658,7]]},"465":{"position":[[41,4]]},"466":{"position":[[15,4]]},"467":{"position":[[5,4]]},"488":{"position":[[44,4]]},"562":{"position":[[830,7],[950,7]]},"620":{"position":[[230,4],[734,4]]},"632":{"position":[[656,4]]},"642":{"position":[[127,4]]},"759":{"position":[[1,4]]},"796":{"position":[[246,4],[1175,4]]},"848":{"position":[[1,4]]},"885":{"position":[[130,4],[316,4]]},"1147":{"position":[[215,7]]},"1237":{"position":[[1,4]]},"1294":{"position":[[253,4]]},"1309":{"position":[[341,4]]},"1316":{"position":[[691,4]]}},"keywords":{}}],["let'",{"_index":902,"title":{},"content":{"65":{"position":[[69,5]]},"119":{"position":[[33,5]]},"127":{"position":[[65,5]]},"132":{"position":[[172,5]]},"151":{"position":[[43,5]]},"173":{"position":[[205,5]]},"174":{"position":[[115,5]]},"180":{"position":[[66,5]]},"187":{"position":[[51,5]]},"190":{"position":[[118,5]]},"193":{"position":[[105,5]]},"229":{"position":[[157,5]]},"271":{"position":[[245,5]]},"278":{"position":[[170,5]]},"284":{"position":[[112,5]]},"287":{"position":[[282,5]]},"290":{"position":[[150,5]]},"369":{"position":[[12,5]]},"394":{"position":[[106,5]]},"399":{"position":[[511,5]]},"401":{"position":[[1,5]]},"412":{"position":[[166,5]]},"425":{"position":[[1,5]]},"462":{"position":[[62,5]]},"577":{"position":[[1,5]]},"703":{"position":[[207,5]]},"1315":{"position":[[166,5]]}},"keywords":{}}],["level",{"_index":659,"title":{"982":{"position":[[32,6]]},"983":{"position":[[32,6]]},"1090":{"position":[[44,6]]}},"content":{"42":{"position":[[124,5]]},"45":{"position":[[20,5]]},"52":{"position":[[142,5]]},"61":{"position":[[448,5]]},"114":{"position":[[701,5]]},"131":{"position":[[283,5]]},"140":{"position":[[101,6]]},"181":{"position":[[74,5]]},"235":{"position":[[94,5]]},"291":{"position":[[318,5]]},"331":{"position":[[297,5]]},"344":{"position":[[83,6]]},"354":{"position":[[1519,6]]},"377":{"position":[[296,5]]},"408":{"position":[[3530,5]]},"452":{"position":[[97,5]]},"479":{"position":[[240,5]]},"501":{"position":[[433,6]]},"521":{"position":[[69,6]]},"533":{"position":[[20,5]]},"535":{"position":[[276,6]]},"539":{"position":[[142,5]]},"548":{"position":[[292,5]]},"560":{"position":[[200,6]]},"566":{"position":[[89,6],[340,5],[1371,5]]},"593":{"position":[[20,5]]},"595":{"position":[[289,6]]},"599":{"position":[[151,5]]},"608":{"position":[[290,5]]},"749":{"position":[[2483,5],[17351,5],[17467,5],[17547,5],[18336,5],[19515,5],[21817,6]]},"764":{"position":[[80,5]]},"838":{"position":[[865,5]]},"841":{"position":[[410,5]]},"849":{"position":[[226,5],[382,5]]},"861":{"position":[[2307,6]]},"871":{"position":[[829,5]]},"897":{"position":[[497,5]]},"898":{"position":[[1757,5]]},"899":{"position":[[186,5],[251,5]]},"932":{"position":[[1171,5]]},"982":{"position":[[19,6]]},"1079":{"position":[[65,5]]},"1082":{"position":[[46,5]]},"1084":{"position":[[588,5]]},"1085":{"position":[[862,5],[969,5],[1681,5],[1750,5],[1791,5],[2001,6],[2034,5],[2230,5],[2422,5]]},"1108":{"position":[[607,5]]},"1117":{"position":[[242,5]]},"1125":{"position":[[373,6]]},"1206":{"position":[[377,5]]},"1209":{"position":[[57,5]]},"1222":{"position":[[1101,6]]},"1237":{"position":[[293,5]]},"1250":{"position":[[533,5]]},"1253":{"position":[[60,6]]},"1258":{"position":[[98,5]]}},"keywords":{}}],["level"",{"_index":725,"title":{},"content":{"47":{"position":[[298,11]]}},"keywords":{}}],["leveldb",{"_index":43,"title":{},"content":{"2":{"position":[[159,7],[214,11],[257,7]]},"6":{"position":[[21,7],[318,7],[373,11],[416,7]]},"7":{"position":[[116,7]]},"10":{"position":[[147,11],[190,7]]},"254":{"position":[[355,7]]},"1320":{"position":[[796,7]]}},"keywords":{}}],["leveldown",{"_index":42,"title":{"6":{"position":[[0,10]]}},"content":{"2":{"position":[[61,9],[229,9],[426,9]]},"6":{"position":[[270,9],[388,9],[445,9],[591,9],[789,9]]},"10":{"position":[[3,9],[162,9],[387,9]]},"749":{"position":[[581,9]]}},"keywords":{}}],["leverag",{"_index":937,"title":{},"content":{"65":{"position":[[2027,8]]},"83":{"position":[[429,8]]},"84":{"position":[[32,8]]},"87":{"position":[[4,10]]},"93":{"position":[[152,8]]},"94":{"position":[[177,8]]},"96":{"position":[[199,10]]},"100":{"position":[[237,8]]},"105":{"position":[[183,8]]},"114":{"position":[[32,8],[603,10]]},"120":{"position":[[151,9]]},"121":{"position":[[68,9]]},"124":{"position":[[185,10]]},"136":{"position":[[36,10]]},"146":{"position":[[117,10]]},"149":{"position":[[32,8]]},"151":{"position":[[116,8]]},"155":{"position":[[50,9]]},"165":{"position":[[289,10]]},"173":{"position":[[905,10],[2377,8]]},"174":{"position":[[195,9],[1345,9]]},"175":{"position":[[29,8]]},"182":{"position":[[68,9]]},"196":{"position":[[81,10]]},"198":{"position":[[326,8]]},"215":{"position":[[92,10]]},"222":{"position":[[294,8]]},"224":{"position":[[89,10]]},"227":{"position":[[211,8]]},"230":{"position":[[190,8]]},"232":{"position":[[147,8]]},"239":{"position":[[269,8]]},"241":{"position":[[208,10]]},"265":{"position":[[90,8]]},"267":{"position":[[1301,8]]},"286":{"position":[[260,8]]},"287":{"position":[[462,10]]},"322":{"position":[[69,9]]},"347":{"position":[[32,8]]},"373":{"position":[[208,10]]},"382":{"position":[[51,9]]},"384":{"position":[[219,8]]},"385":{"position":[[170,10]]},"398":{"position":[[395,8]]},"418":{"position":[[747,10]]},"425":{"position":[[73,8]]},"445":{"position":[[827,9],[1401,10],[1842,8]]},"447":{"position":[[327,10]]},"502":{"position":[[717,10]]},"504":{"position":[[93,10],[891,10]]},"511":{"position":[[32,8]]},"523":{"position":[[115,8]]},"531":{"position":[[32,8]]},"548":{"position":[[157,10]]},"556":{"position":[[1140,9]]},"557":{"position":[[368,10]]},"574":{"position":[[443,10]]},"584":{"position":[[53,10]]},"591":{"position":[[32,8]]},"608":{"position":[[157,10]]},"613":{"position":[[122,9]]},"614":{"position":[[608,9]]},"621":{"position":[[795,10]]},"624":{"position":[[203,10]]},"643":{"position":[[115,10]]},"801":{"position":[[811,10]]},"1072":{"position":[[2828,8]]},"1270":{"position":[[325,8]]}},"keywords":{}}],["li",{"_index":1678,"title":{},"content":{"289":{"position":[[49,4]]},"501":{"position":[[22,4]]}},"keywords":{}}],["lib/main.dart",{"_index":1273,"title":{},"content":{"188":{"position":[[2513,13]]}},"keywords":{}}],["librari",{"_index":110,"title":{"478":{"position":[[56,8]]},"1273":{"position":[[49,10]]}},"content":{"8":{"position":[[326,8]]},"11":{"position":[[1059,9]]},"13":{"position":[[178,8]]},"15":{"position":[[111,7]]},"18":{"position":[[44,9]]},"19":{"position":[[33,7]]},"21":{"position":[[28,7]]},"30":{"position":[[24,7]]},"34":{"position":[[61,8]]},"35":{"position":[[37,7]]},"37":{"position":[[187,9]]},"40":{"position":[[58,7]]},"47":{"position":[[338,7]]},"96":{"position":[[110,9]]},"120":{"position":[[170,7]]},"129":{"position":[[340,7]]},"167":{"position":[[289,10]]},"173":{"position":[[3071,9]]},"174":{"position":[[1438,10]]},"188":{"position":[[111,7],[2408,7]]},"219":{"position":[[75,9],[248,10]]},"230":{"position":[[156,10]]},"285":{"position":[[79,7]]},"303":{"position":[[281,7]]},"317":{"position":[[295,8]]},"357":{"position":[[364,7]]},"387":{"position":[[354,10]]},"411":{"position":[[1989,9]]},"412":{"position":[[1086,9],[2146,7],[3804,9],[9221,8],[9954,8],[11745,9],[14432,9]]},"420":{"position":[[80,9],[167,7],[291,7],[438,10]]},"432":{"position":[[1032,9],[1074,9]]},"433":{"position":[[439,7]]},"441":{"position":[[426,9]]},"452":{"position":[[382,9]]},"453":{"position":[[506,7]]},"454":{"position":[[256,9]]},"478":{"position":[[288,9]]},"520":{"position":[[357,9]]},"535":{"position":[[296,7],[491,9]]},"551":{"position":[[287,9],[433,9]]},"595":{"position":[[309,7],[511,9]]},"611":{"position":[[1296,7]]},"613":{"position":[[1028,9]]},"616":{"position":[[1047,7],[1138,7]]},"678":{"position":[[192,8]]},"686":{"position":[[24,9]]},"698":{"position":[[3078,7]]},"723":{"position":[[67,8]]},"785":{"position":[[281,9]]},"836":{"position":[[281,7],[462,7],[581,7]]},"872":{"position":[[81,9]]},"894":{"position":[[19,8]]},"904":{"position":[[1744,7],[2422,8],[2829,7],[2975,7]]},"910":{"position":[[332,9]]},"1041":{"position":[[75,8]]},"1112":{"position":[[543,9]]},"1120":{"position":[[84,10],[199,9],[744,10]]},"1247":{"position":[[222,8]]},"1272":{"position":[[18,9],[104,7],[285,9],[450,7]]},"1276":{"position":[[636,7]]},"1277":{"position":[[699,7]]},"1282":{"position":[[355,9]]},"1292":{"position":[[776,7]]},"1299":{"position":[[461,9]]}},"keywords":{}}],["libraries.bridg",{"_index":4776,"title":{},"content":{"836":{"position":[[1533,18]]}},"keywords":{}}],["librariesfor",{"_index":3338,"title":{},"content":{"551":{"position":[[221,12]]}},"keywords":{}}],["library"",{"_index":1494,"title":{},"content":{"244":{"position":[[584,13]]}},"keywords":{}}],["libraryth",{"_index":4021,"title":{},"content":{"717":{"position":[[138,10]]}},"keywords":{}}],["libspersist",{"_index":3405,"title":{},"content":{"559":{"position":[[926,14]]}},"keywords":{}}],["licens",{"_index":684,"title":{},"content":{"43":{"position":[[619,7]]},"1112":{"position":[[273,7],[379,8]]}},"keywords":{}}],["lie",{"_index":3947,"title":{"699":{"position":[[14,4]]}},"content":{"781":{"position":[[15,3],[47,3]]}},"keywords":{}}],["lifecycl",{"_index":1092,"title":{},"content":{"130":{"position":[[116,9]]},"143":{"position":[[228,10]]},"590":{"position":[[441,9]]},"767":{"position":[[63,10]]},"768":{"position":[[52,10]]},"769":{"position":[[57,10]]},"899":{"position":[[56,9]]}},"keywords":{}}],["lift",{"_index":2947,"title":{},"content":{"446":{"position":[[1039,7]]}},"keywords":{}}],["light",{"_index":2546,"title":{},"content":{"408":{"position":[[2382,5]]},"501":{"position":[[265,5]]},"780":{"position":[[423,5]]}},"keywords":{}}],["lighten",{"_index":3518,"title":{},"content":{"582":{"position":[[693,7]]}},"keywords":{}}],["lightn",{"_index":2124,"title":{},"content":{"369":{"position":[[256,9]]},"500":{"position":[[208,9]]},"562":{"position":[[611,11]]}},"keywords":{}}],["lightweight",{"_index":535,"title":{},"content":{"34":{"position":[[330,12]]},"365":{"position":[[172,11]]},"412":{"position":[[1974,12]]},"441":{"position":[[84,11]]},"574":{"position":[[25,11]]},"659":{"position":[[101,11]]}},"keywords":{}}],["like"",{"_index":3190,"title":{},"content":{"496":{"position":[[153,11]]},"981":{"position":[[193,10]]}},"keywords":{}}],["likeerror",{"_index":5901,"title":{},"content":{"1085":{"position":[[2808,10]]}},"keywords":{}}],["likelihood",{"_index":3207,"title":{},"content":{"497":{"position":[[568,10]]}},"keywords":{}}],["likes."",{"_index":3198,"title":{},"content":{"497":{"position":[[69,13]]}},"keywords":{}}],["liketestdata",{"_index":4715,"title":{},"content":{"821":{"position":[[570,13]]}},"keywords":{}}],["likewis",{"_index":1764,"title":{},"content":{"299":{"position":[[1481,9]]}},"keywords":{}}],["limit",{"_index":703,"title":{"58":{"position":[[0,11]]},"66":{"position":[[16,12]]},"252":{"position":[[6,6]]},"297":{"position":[[27,5]]},"298":{"position":[[28,6]]},"299":{"position":[[27,7]]},"302":{"position":[[21,6]]},"303":{"position":[[34,11]]},"305":{"position":[[16,5]]},"406":{"position":[[56,11]]},"412":{"position":[[15,11]]},"417":{"position":[[27,7]]},"427":{"position":[[18,11]]},"461":{"position":[[13,7]]},"545":{"position":[[0,11]]},"605":{"position":[[0,11]]},"615":{"position":[[0,11]]},"617":{"position":[[22,6]]},"650":{"position":[[0,12]]},"849":{"position":[[0,12]]},"863":{"position":[[0,11]]},"1141":{"position":[[0,11]]},"1157":{"position":[[0,12]]},"1186":{"position":[[11,6]]},"1188":{"position":[[0,11]]},"1207":{"position":[[5,12]]},"1232":{"position":[[0,12]]}},"content":{"46":{"position":[[63,7]]},"47":{"position":[[536,7]]},"58":{"position":[[238,7],[343,6]]},"63":{"position":[[181,12]]},"66":{"position":[[118,12],[399,12],[496,10]]},"83":{"position":[[271,11]]},"169":{"position":[[299,7]]},"205":{"position":[[53,7]]},"215":{"position":[[346,7]]},"225":{"position":[[63,11]]},"229":{"position":[[68,11]]},"232":{"position":[[305,7]]},"252":{"position":[[29,7],[86,7]]},"287":{"position":[[14,5]]},"289":{"position":[[1865,7]]},"298":{"position":[[874,6]]},"299":{"position":[[154,6],[227,5],[661,5],[1185,6],[1506,5]]},"300":{"position":[[59,7]]},"301":{"position":[[408,5],[479,7]]},"303":{"position":[[1313,12]]},"305":{"position":[[297,7]]},"306":{"position":[[348,5]]},"366":{"position":[[546,10]]},"398":{"position":[[1151,6],[1312,6],[2933,5]]},"402":{"position":[[2377,6]]},"407":{"position":[[836,7]]},"408":{"position":[[189,7],[274,11],[363,6],[705,6],[842,7],[2407,11],[2633,6],[2722,5],[3756,10]]},"410":{"position":[[538,5]]},"412":{"position":[[6675,7],[7034,5],[7676,13]]},"427":{"position":[[63,11],[471,7],[1032,10],[1461,6],[1504,5]]},"432":{"position":[[311,5]]},"434":{"position":[[125,12]]},"436":{"position":[[345,7]]},"441":{"position":[[562,11]]},"444":{"position":[[225,7]]},"451":{"position":[[390,7]]},"459":{"position":[[1012,10]]},"461":{"position":[[13,7],[136,10],[196,6],[638,10],[775,5],[956,10],[1074,5],[1261,5],[1443,6],[1518,10],[1547,5]]},"495":{"position":[[739,7],[793,7]]},"504":{"position":[[1498,8]]},"528":{"position":[[188,7]]},"535":{"position":[[428,5]]},"545":{"position":[[51,12],[159,7],[183,6],[243,6]]},"559":{"position":[[1058,12]]},"560":{"position":[[36,7]]},"595":{"position":[[456,5]]},"605":{"position":[[51,12],[159,7],[183,6],[243,7]]},"613":{"position":[[825,6]]},"617":{"position":[[64,6],[139,10],[325,10],[516,5],[1155,10],[1470,6],[1599,5]]},"624":{"position":[[1059,6],[1651,12]]},"696":{"position":[[328,5],[742,5],[963,5],[1808,6]]},"703":{"position":[[1672,5]]},"704":{"position":[[464,6]]},"714":{"position":[[436,10]]},"724":{"position":[[1846,6]]},"749":{"position":[[2886,5],[9314,7],[9394,6],[23371,7],[23503,7]]},"773":{"position":[[669,5],[780,5],[851,5]]},"774":{"position":[[966,7]]},"780":{"position":[[42,8],[177,8]]},"786":{"position":[[203,11]]},"796":{"position":[[370,6],[666,6],[1086,6]]},"839":{"position":[[648,7]]},"841":{"position":[[467,7],[1098,8]]},"845":{"position":[[104,7]]},"849":{"position":[[92,10],[205,10],[323,6],[353,10],[847,5]]},"885":{"position":[[880,6],[2654,8]]},"886":{"position":[[148,5],[401,6],[621,7],[672,6],[679,7],[836,5],[1701,5]]},"958":{"position":[[488,5],[607,7],[637,6]]},"1007":{"position":[[1496,6]]},"1067":{"position":[[345,7]]},"1072":{"position":[[166,7],[1837,10]]},"1157":{"position":[[92,7],[133,5],[192,6],[389,12]]},"1191":{"position":[[133,6]]},"1207":{"position":[[621,5]]},"1271":{"position":[[409,7]]},"1295":{"position":[[1437,5]]},"1318":{"position":[[774,5]]},"1321":{"position":[[11,7]]}},"keywords":{}}],["limit"",{"_index":1463,"title":{},"content":{"243":{"position":[[567,11],[668,11]]}},"keywords":{}}],["limit(parseint(req.query.batchs",{"_index":4997,"title":{},"content":{"875":{"position":[[2563,36]]}},"keywords":{}}],["limit.html",{"_index":1472,"title":{},"content":{"243":{"position":[[931,10]]}},"keywords":{}}],["limit.htmlx",{"_index":1467,"title":{},"content":{"243":{"position":[[634,11],[735,11],[834,11]]}},"keywords":{}}],["limiteddoc",{"_index":5107,"title":{},"content":{"885":{"position":[[2355,11],[2606,12]]}},"keywords":{}}],["limiteddocs[limiteddocs.length",{"_index":5111,"title":{},"content":{"885":{"position":[[2478,30]]}},"keywords":{}}],["limits"",{"_index":1470,"title":{},"content":{"243":{"position":[[863,12]]}},"keywords":{}}],["line",{"_index":1566,"title":{},"content":{"254":{"position":[[196,4]]},"612":{"position":[[567,4],[2046,5]]},"838":{"position":[[1714,5]]}},"keywords":{}}],["linearli",{"_index":5241,"title":{},"content":{"902":{"position":[[267,8]]}},"keywords":{}}],["linebreak",{"_index":4289,"title":{},"content":{"749":{"position":[[11717,9]]}},"keywords":{}}],["link",{"_index":109,"title":{},"content":{"8":{"position":[[317,4],[349,4]]},"11":{"position":[[421,5]]},"50":{"position":[[359,5]]},"212":{"position":[[617,4]]},"408":{"position":[[2439,6]]},"670":{"position":[[121,4]]},"724":{"position":[[1417,5],[1723,5]]},"846":{"position":[[954,5]]},"901":{"position":[[384,6]]},"1189":{"position":[[507,5]]},"1201":{"position":[[295,5]]},"1226":{"position":[[476,5]]},"1264":{"position":[[379,5]]},"1274":{"position":[[216,5]]},"1276":{"position":[[672,5]]},"1324":{"position":[[1071,5]]}},"keywords":{}}],["linkedin",{"_index":4631,"title":{},"content":{"793":{"position":[[1504,8]]}},"keywords":{}}],["lirst",{"_index":658,"title":{},"content":{"42":{"position":[[47,5]]}},"keywords":{}}],["list",{"_index":188,"title":{"763":{"position":[[0,5]]},"1240":{"position":[[30,5]]}},"content":{"13":{"position":[[97,4],[203,4]]},"188":{"position":[[3110,4]]},"335":{"position":[[333,4],[952,4]]},"395":{"position":[[469,5]]},"401":{"position":[[123,5]]},"404":{"position":[[795,4]]},"412":{"position":[[369,4],[14896,4]]},"422":{"position":[[67,4]]},"459":{"position":[[212,4]]},"469":{"position":[[127,4]]},"493":{"position":[[506,4]]},"571":{"position":[[1058,4]]},"663":{"position":[[112,4]]},"712":{"position":[[131,4]]},"717":{"position":[[1383,4]]},"776":{"position":[[138,4]]},"805":{"position":[[230,4]]},"806":{"position":[[153,4],[399,4]]},"824":{"position":[[280,4]]},"825":{"position":[[718,6]]},"842":{"position":[[246,4]]},"885":{"position":[[183,4],[1082,4],[1162,5]]},"951":{"position":[[542,4]]},"962":{"position":[[565,4]]},"1119":{"position":[[61,4]]},"1316":{"position":[[1598,4]]},"1321":{"position":[[674,4]]}},"keywords":{}}],["list</h2>",{"_index":3314,"title":{},"content":{"541":{"position":[[560,15]]},"601":{"position":[[121,15]]},"602":{"position":[[427,15]]}},"keywords":{}}],["list<rxdocument<rxherodoctype>>",{"_index":1289,"title":{},"content":{"188":{"position":[[3138,43]]}},"keywords":{}}],["listen",{"_index":1125,"title":{},"content":{"140":{"position":[[49,6]]},"168":{"position":[[156,6]]},"204":{"position":[[60,8]]},"344":{"position":[[23,6]]},"392":{"position":[[3344,7],[4300,8],[4416,10],[4467,10]]},"612":{"position":[[833,9]]},"649":{"position":[[9,6]]},"655":{"position":[[229,9]]},"698":{"position":[[1004,9]]},"875":{"position":[[1241,9]]},"1150":{"position":[[511,9]]}},"keywords":{}}],["live",{"_index":735,"title":{"53":{"position":[[21,4]]},"540":{"position":[[21,4]]},"600":{"position":[[21,4]]},"648":{"position":[[0,4]]},"741":{"position":[[0,4]]},"905":{"position":[[0,4]]}},"content":{"47":{"position":[[750,4]]},"152":{"position":[[57,6]]},"209":{"position":[[1251,5]]},"255":{"position":[[1553,5]]},"261":{"position":[[1012,4]]},"318":{"position":[[111,4]]},"356":{"position":[[824,4]]},"407":{"position":[[56,5]]},"410":{"position":[[1912,5]]},"411":{"position":[[3114,4]]},"421":{"position":[[282,4]]},"445":{"position":[[968,4]]},"450":{"position":[[231,4]]},"476":{"position":[[322,4]]},"479":{"position":[[62,5]]},"481":{"position":[[813,5]]},"493":{"position":[[374,4]]},"498":{"position":[[252,4]]},"502":{"position":[[648,4]]},"529":{"position":[[239,4]]},"540":{"position":[[131,4]]},"541":{"position":[[152,4]]},"570":{"position":[[767,4]]},"601":{"position":[[57,4]]},"611":{"position":[[76,5],[299,4]]},"612":{"position":[[232,4]]},"613":{"position":[[463,4]]},"624":{"position":[[588,4],[820,4]]},"626":{"position":[[261,4]]},"632":{"position":[[271,4],[2583,5]]},"647":{"position":[[222,5]]},"648":{"position":[[6,5],[124,5],[161,5]]},"649":{"position":[[116,5]]},"736":{"position":[[153,4]]},"739":{"position":[[529,5]]},"749":{"position":[[14859,5]]},"775":{"position":[[360,4]]},"829":{"position":[[2927,4],[2960,4]]},"846":{"position":[[333,4],[407,5]]},"854":{"position":[[1022,4],[1073,5]]},"860":{"position":[[625,4]]},"862":{"position":[[1508,6]]},"866":{"position":[[838,5]]},"871":{"position":[[457,4]]},"872":{"position":[[2628,5],[4582,5]]},"878":{"position":[[557,5]]},"886":{"position":[[1974,5]]},"897":{"position":[[318,4]]},"898":{"position":[[3446,5]]},"903":{"position":[[253,4]]},"905":{"position":[[34,4],[185,5]]},"988":{"position":[[686,5],[848,5]]},"1000":{"position":[[66,4]]},"1039":{"position":[[154,4]]},"1150":{"position":[[255,4]]},"1324":{"position":[[833,6]]}},"keywords":{}}],["live=tru",{"_index":5472,"title":{},"content":{"988":{"position":[[4819,9]]}},"keywords":{}}],["livequeri",{"_index":2631,"title":{"1150":{"position":[[0,9]]}},"content":{"411":{"position":[[3838,10]]},"1150":{"position":[[34,9]]}},"keywords":{}}],["load",{"_index":149,"title":{"474":{"position":[[8,7]]},"477":{"position":[[18,5]]},"623":{"position":[[23,5]]},"778":{"position":[[21,7]]},"799":{"position":[[29,5]]},"1089":{"position":[[30,5]]},"1238":{"position":[[11,5]]}},"content":{"11":{"position":[[267,6],[411,7]]},"46":{"position":[[381,7],[601,4]]},"65":{"position":[[1383,4]]},"69":{"position":[[97,4]]},"227":{"position":[[408,7]]},"266":{"position":[[1039,4]]},"283":{"position":[[272,7]]},"315":{"position":[[1107,7]]},"385":{"position":[[11,7]]},"400":{"position":[[694,7]]},"408":{"position":[[5532,5]]},"410":{"position":[[328,7]]},"411":{"position":[[16,5],[814,5],[1035,4]]},"412":{"position":[[6656,4]]},"415":{"position":[[361,7]]},"421":{"position":[[618,7],[1135,7]]},"454":{"position":[[763,5]]},"474":{"position":[[73,7]]},"483":{"position":[[409,7],[865,5]]},"486":{"position":[[4,7]]},"487":{"position":[[159,5]]},"500":{"position":[[200,4],[539,7]]},"523":{"position":[[600,13]]},"524":{"position":[[868,6]]},"534":{"position":[[354,7],[604,4]]},"582":{"position":[[708,4]]},"594":{"position":[[352,7],[602,4]]},"610":{"position":[[729,5]]},"620":{"position":[[175,5]]},"623":{"position":[[99,5],[503,4],[751,4]]},"630":{"position":[[756,5]]},"653":{"position":[[664,5]]},"656":{"position":[[331,4]]},"696":{"position":[[48,6],[122,4],[187,4]]},"752":{"position":[[331,7]]},"753":{"position":[[184,7]]},"772":{"position":[[1998,4]]},"774":{"position":[[167,4]]},"778":{"position":[[277,7],[426,7],[486,7]]},"780":{"position":[[77,7]]},"781":{"position":[[127,6]]},"782":{"position":[[120,5]]},"783":{"position":[[132,4],[503,7],[588,7],[623,7]]},"784":{"position":[[789,4]]},"785":{"position":[[131,6]]},"800":{"position":[[730,6]]},"802":{"position":[[880,4]]},"829":{"position":[[1626,7],[2502,7],[2536,9],[3214,7],[3417,7],[3455,9]]},"860":{"position":[[941,5]]},"958":{"position":[[151,4]]},"995":{"position":[[732,7],[1798,7]]},"1088":{"position":[[739,4]]},"1089":{"position":[[255,4]]},"1095":{"position":[[215,4]]},"1161":{"position":[[115,4],[131,4]]},"1162":{"position":[[595,4]]},"1164":{"position":[[388,5]]},"1170":{"position":[[93,4],[114,5],[248,4]]},"1174":{"position":[[121,5]]},"1175":{"position":[[196,5],[313,4],[565,4],[668,4]]},"1180":{"position":[[115,4],[131,4]]},"1181":{"position":[[621,7],[683,4]]},"1186":{"position":[[120,4]]},"1192":{"position":[[431,7],[478,4]]},"1238":{"position":[[360,5]]},"1239":{"position":[[328,6]]},"1246":{"position":[[198,4],[518,4],[1814,4]]},"1267":{"position":[[372,5]]},"1271":{"position":[[649,4]]},"1295":{"position":[[324,4],[469,4],[1491,4]]},"1299":{"position":[[137,6],[180,5]]},"1301":{"position":[[1432,4]]}},"keywords":{}}],["loader",{"_index":6318,"title":{},"content":{"1266":{"position":[[794,7],[809,8]]}},"keywords":{}}],["local",{"_index":185,"title":{"90":{"position":[[47,5]]},"92":{"position":[[16,7]]},"95":{"position":[[6,5]]},"96":{"position":[[8,5]]},"139":{"position":[[14,5]]},"167":{"position":[[14,5]]},"195":{"position":[[14,5]]},"205":{"position":[[12,5]]},"218":{"position":[[24,5]]},"219":{"position":[[0,5]]},"220":{"position":[[12,5]]},"221":{"position":[[36,5]]},"274":{"position":[[0,5]]},"307":{"position":[[7,5]]},"343":{"position":[[14,5]]},"374":{"position":[[10,5],[50,5]]},"375":{"position":[[13,5]]},"389":{"position":[[0,5]]},"391":{"position":[[22,7]]},"404":{"position":[[32,5]]},"406":{"position":[[4,5]]},"407":{"position":[[12,5]]},"408":{"position":[[4,5]]},"409":{"position":[[27,5]]},"412":{"position":[[30,5]]},"413":{"position":[[0,5]]},"419":{"position":[[18,5]]},"420":{"position":[[23,5]]},"421":{"position":[[4,5]]},"425":{"position":[[10,5]]},"427":{"position":[[33,5]]},"489":{"position":[[0,5]]},"506":{"position":[[14,5]]},"516":{"position":[[0,5]]},"586":{"position":[[14,5]]},"629":{"position":[[13,5]]},"630":{"position":[[24,5]]},"631":{"position":[[31,5]]},"634":{"position":[[17,5]]},"695":{"position":[[13,5]]},"713":{"position":[[13,5]]},"723":{"position":[[20,5]]},"777":{"position":[[0,5]]},"980":{"position":[[32,5]]},"1009":{"position":[[18,5]]},"1011":{"position":[[0,5]]},"1012":{"position":[[8,5]]},"1307":{"position":[[0,5]]}},"content":{"13":{"position":[[37,5]]},"19":{"position":[[438,5]]},"34":{"position":[[19,5]]},"35":{"position":[[332,7]]},"38":{"position":[[82,5],[169,5],[220,5]]},"39":{"position":[[119,7]]},"40":{"position":[[419,5]]},"41":{"position":[[222,5]]},"42":{"position":[[41,5]]},"43":{"position":[[55,5]]},"46":{"position":[[130,5],[265,5],[564,5]]},"47":{"position":[[414,5]]},"57":{"position":[[24,5],[83,5]]},"58":{"position":[[329,5]]},"59":{"position":[[275,8]]},"61":{"position":[[298,5]]},"65":{"position":[[820,7],[879,5],[1052,7],[1536,5]]},"66":{"position":[[482,8]]},"87":{"position":[[106,7]]},"90":{"position":[[8,5],[114,5]]},"91":{"position":[[92,7]]},"92":{"position":[[58,8]]},"93":{"position":[[165,5]]},"95":{"position":[[155,5]]},"96":{"position":[[13,5]]},"122":{"position":[[169,7]]},"133":{"position":[[163,7]]},"139":{"position":[[47,5]]},"157":{"position":[[161,7]]},"164":{"position":[[153,8]]},"167":{"position":[[85,5]]},"172":{"position":[[305,7]]},"173":{"position":[[69,5],[890,5],[916,5],[1145,5],[1231,5],[1334,7],[1682,8],[1901,5],[1966,7],[2493,7],[2566,7],[2984,5],[3138,5]]},"183":{"position":[[178,7]]},"188":{"position":[[2209,5]]},"189":{"position":[[80,8]]},"195":{"position":[[66,5]]},"201":{"position":[[308,8],[398,5]]},"204":{"position":[[182,8]]},"205":{"position":[[162,5],[363,8]]},"206":{"position":[[115,5]]},"208":{"position":[[206,5]]},"209":{"position":[[757,5]]},"211":{"position":[[47,5]]},"212":{"position":[[254,8],[320,7]]},"215":{"position":[[162,8]]},"216":{"position":[[100,8]]},"217":{"position":[[111,8]]},"218":{"position":[[107,5]]},"219":{"position":[[120,5]]},"220":{"position":[[176,8]]},"221":{"position":[[94,7]]},"224":{"position":[[230,8]]},"243":{"position":[[443,5]]},"244":{"position":[[46,5],[1507,5]]},"248":{"position":[[112,8],[272,5]]},"251":{"position":[[73,7],[94,5]]},"252":{"position":[[138,8]]},"254":{"position":[[490,5]]},"255":{"position":[[159,5]]},"260":{"position":[[179,5]]},"261":{"position":[[1095,5]]},"262":{"position":[[86,5],[258,6]]},"263":{"position":[[285,5],[488,5]]},"266":{"position":[[165,7]]},"273":{"position":[[60,5]]},"274":{"position":[[5,5],[98,7]]},"280":{"position":[[151,5]]},"292":{"position":[[148,7]]},"293":{"position":[[247,5]]},"305":{"position":[[596,5]]},"309":{"position":[[152,7]]},"315":{"position":[[11,5]]},"318":{"position":[[213,5],[650,5]]},"320":{"position":[[369,7]]},"321":{"position":[[81,7]]},"322":{"position":[[191,8]]},"338":{"position":[[86,8]]},"358":{"position":[[117,5]]},"360":{"position":[[1,5],[386,7],[564,8]]},"362":{"position":[[767,5]]},"365":{"position":[[116,5],[498,5]]},"375":{"position":[[1,5],[345,5],[710,5],[791,7],[845,5]]},"376":{"position":[[38,5],[627,5]]},"377":{"position":[[151,5]]},"388":{"position":[[150,5],[504,5]]},"391":{"position":[[31,5],[938,8]]},"392":{"position":[[2978,7]]},"396":{"position":[[96,8],[1476,5],[1819,8]]},"398":{"position":[[3463,5]]},"399":{"position":[[108,5],[373,5]]},"402":{"position":[[72,5]]},"407":{"position":[[4,5],[197,5],[526,5],[640,5],[875,5],[987,5]]},"408":{"position":[[14,5],[141,5],[215,5],[1317,7],[1422,5],[1789,5],[2665,5],[3262,5],[4183,5],[4265,5],[4321,5],[4433,5],[5420,5]]},"409":{"position":[[163,5]]},"410":{"position":[[36,5],[149,5],[223,5],[446,5],[526,7],[1295,5],[1374,7],[1799,5],[1923,5],[1982,6],[2136,5]]},"411":{"position":[[30,5],[1121,5],[1423,5],[1895,5],[2172,5],[2542,5],[2575,5],[2766,7],[2948,5],[3760,5],[4291,5],[4427,5],[4559,5],[4903,5],[5442,5],[5771,5]]},"412":{"position":[[153,5],[289,5],[425,5],[581,5],[2656,5],[3213,5],[4311,5],[5210,5],[5630,5],[6582,5],[6683,5],[6920,5],[7209,5],[7359,5],[7401,5],[7534,9],[7554,5],[8161,5],[8227,5],[8274,5],[8424,5],[8624,5],[8965,5],[9491,5],[9723,5],[10870,5],[11177,5],[11259,5],[11718,5],[12226,5],[13264,5],[14203,5],[14750,5],[14790,5],[14928,5],[15088,5],[15399,5]]},"413":{"position":[[46,5]]},"414":{"position":[[1,5],[48,7]]},"415":{"position":[[1,5]]},"416":{"position":[[1,5],[144,7]]},"417":{"position":[[1,5]]},"418":{"position":[[1,5],[707,5],[827,5]]},"419":{"position":[[483,8],[811,7],[913,5],[1455,5],[1678,5],[1809,8]]},"420":{"position":[[94,5],[215,5],[341,5],[426,5],[538,5],[666,5],[1141,5],[1549,5]]},"421":{"position":[[526,5],[708,5],[1194,5]]},"422":{"position":[[147,5],[308,5],[350,5],[421,5]]},"440":{"position":[[140,7],[358,7]]},"444":{"position":[[428,5],[810,5]]},"445":{"position":[[560,8]]},"473":{"position":[[18,5]]},"475":{"position":[[108,5]]},"476":{"position":[[141,5],[275,5]]},"477":{"position":[[198,5]]},"478":{"position":[[210,5]]},"480":{"position":[[328,5]]},"481":{"position":[[37,5],[114,5],[784,5]]},"482":{"position":[[1,5]]},"483":{"position":[[230,5],[499,6],[797,5]]},"487":{"position":[[185,7]]},"489":{"position":[[3,5],[95,8],[457,5],[493,5],[631,8]]},"490":{"position":[[88,5]]},"491":{"position":[[7,5],[176,5],[294,5],[792,5],[1206,5]]},"501":{"position":[[363,5]]},"502":{"position":[[219,5],[286,5]]},"506":{"position":[[48,5]]},"510":{"position":[[248,5]]},"516":{"position":[[17,5],[130,8],[311,5]]},"526":{"position":[[15,5],[128,7]]},"534":{"position":[[188,5],[217,8],[317,5],[578,5]]},"544":{"position":[[106,5]]},"551":{"position":[[47,5]]},"562":{"position":[[1683,7]]},"565":{"position":[[166,5]]},"566":{"position":[[1073,6]]},"574":{"position":[[349,7],[454,5]]},"575":{"position":[[353,7]]},"576":{"position":[[60,5]]},"582":{"position":[[56,7],[173,5],[315,5]]},"584":{"position":[[71,5]]},"586":{"position":[[78,5]]},"594":{"position":[[186,5],[215,8],[315,5],[576,5]]},"604":{"position":[[106,5]]},"630":{"position":[[215,5],[582,5],[939,5]]},"631":{"position":[[483,5]]},"632":{"position":[[85,5],[1022,5],[1218,5],[1727,5],[1942,7],[2341,5],[2549,5]]},"634":{"position":[[3,5]]},"635":{"position":[[4,5]]},"636":{"position":[[149,5],[375,5]]},"638":{"position":[[19,8]]},"639":{"position":[[1,5]]},"640":{"position":[[492,5]]},"641":{"position":[[12,5]]},"644":{"position":[[50,5],[613,5]]},"662":{"position":[[14,5]]},"670":{"position":[[495,8]]},"697":{"position":[[339,5]]},"699":{"position":[[714,5]]},"700":{"position":[[223,5]]},"702":{"position":[[576,5]]},"711":{"position":[[152,8]]},"719":{"position":[[380,5]]},"723":{"position":[[350,5],[431,5],[656,5]]},"749":{"position":[[13689,5],[14220,5],[14291,5],[14466,5]]},"775":{"position":[[9,6]]},"778":{"position":[[356,5]]},"780":{"position":[[783,8]]},"785":{"position":[[528,5]]},"786":{"position":[[138,5],[160,5]]},"793":{"position":[[1081,5]]},"826":{"position":[[992,5]]},"836":{"position":[[2265,5]]},"838":{"position":[[14,5]]},"839":{"position":[[1225,5]]},"841":{"position":[[140,5],[618,5],[1358,5],[1485,5]]},"846":{"position":[[1099,5]]},"856":{"position":[[85,7],[210,7]]},"860":{"position":[[358,8],[1199,5]]},"861":{"position":[[1810,7],[2179,5]]},"872":{"position":[[298,7],[492,8]]},"873":{"position":[[62,5]]},"898":{"position":[[2942,5]]},"899":{"position":[[150,5]]},"902":{"position":[[507,5],[734,5]]},"903":{"position":[[391,5]]},"912":{"position":[[325,8]]},"988":{"position":[[738,5],[2345,5],[2453,5],[3469,5]]},"995":{"position":[[82,5],[1249,5]]},"1006":{"position":[[123,7],[220,5]]},"1007":{"position":[[593,5],[1098,5]]},"1008":{"position":[[201,5]]},"1009":{"position":[[607,5],[721,5]]},"1012":{"position":[[15,5],[52,5]]},"1013":{"position":[[29,5],[195,5],[241,5],[427,5],[579,5],[646,5]]},"1014":{"position":[[11,5],[70,5],[288,5]]},"1015":{"position":[[11,5]]},"1018":{"position":[[355,5]]},"1021":{"position":[[126,5]]},"1022":{"position":[[68,7],[260,7]]},"1124":{"position":[[1500,5],[1648,7],[1844,7]]},"1140":{"position":[[62,7]]},"1147":{"position":[[13,5]]},"1148":{"position":[[230,5]]},"1306":{"position":[[47,5]]},"1307":{"position":[[3,5],[423,5],[596,5]]},"1308":{"position":[[531,5]]},"1315":{"position":[[932,5],[1103,8]]},"1316":{"position":[[989,5],[3764,8]]}},"keywords":{}}],["localdb",{"_index":1344,"title":{},"content":{"209":{"position":[[267,10]]}},"keywords":{}}],["localdoc",{"_index":5599,"title":{},"content":{"1014":{"position":[[183,8],[324,8]]},"1015":{"position":[[159,8]]},"1016":{"position":[[118,8]]},"1018":{"position":[[60,8],[780,8]]}},"keywords":{}}],["localdoc.foo",{"_index":5613,"title":{},"content":{"1018":{"position":[[475,13],[545,12]]}},"keywords":{}}],["localdoc.get$('foo').subscribe(valu",{"_index":5611,"title":{},"content":{"1018":{"position":[[241,36]]}},"keywords":{}}],["localdoc.get('foo",{"_index":5608,"title":{},"content":{"1018":{"position":[[137,20],[514,20]]}},"keywords":{}}],["localdoc.remov",{"_index":5612,"title":{},"content":{"1018":{"position":[[318,18]]}},"keywords":{}}],["localdoc.sav",{"_index":5610,"title":{},"content":{"1018":{"position":[[208,16]]}},"keywords":{}}],["localdoc.set('foo",{"_index":5609,"title":{},"content":{"1018":{"position":[[173,19],[585,19]]}},"keywords":{}}],["localdoc.tojson().foo",{"_index":5617,"title":{},"content":{"1018":{"position":[[957,22]]}},"keywords":{}}],["localdocu",{"_index":4320,"title":{},"content":{"749":{"position":[[14179,14],[14376,14]]},"1013":{"position":[[151,15],[374,15],[526,15],[724,15]]}},"keywords":{}}],["localdocuments=tru",{"_index":4323,"title":{},"content":{"749":{"position":[[14410,19]]}},"keywords":{}}],["localforag",{"_index":547,"title":{"35":{"position":[[0,12]]}},"content":{"35":{"position":[[1,11],[294,11],[490,11]]}},"keywords":{}}],["localhost",{"_index":3862,"title":{},"content":{"676":{"position":[[14,9]]},"968":{"position":[[718,9]]}},"keywords":{}}],["localhost:4222",{"_index":4931,"title":{},"content":{"866":{"position":[[818,16]]}},"keywords":{}}],["locally.background",{"_index":3700,"title":{},"content":{"632":{"position":[[349,18]]}},"keywords":{}}],["locally.y",{"_index":1594,"title":{},"content":{"262":{"position":[[465,11]]}},"keywords":{}}],["locally—provid",{"_index":3103,"title":{},"content":{"474":{"position":[[150,17]]}},"keywords":{}}],["localst",{"_index":6146,"title":{},"content":{"1177":{"position":[[290,10]]}},"keywords":{}}],["localstate.collection.insert",{"_index":6148,"title":{},"content":{"1177":{"position":[[347,30]]}},"keywords":{}}],["localstate.databasestate.savequeue.addwrit",{"_index":6152,"title":{},"content":{"1177":{"position":[[613,46]]}},"keywords":{}}],["localstorag",{"_index":275,"title":{"63":{"position":[[0,13]]},"314":{"position":[[36,12]]},"423":{"position":[[6,12]]},"424":{"position":[[12,12]]},"428":{"position":[[21,13]]},"429":{"position":[[3,12]]},"430":{"position":[[16,13]]},"431":{"position":[[27,12]]},"432":{"position":[[0,12]]},"434":{"position":[[0,12]]},"435":{"position":[[0,12]]},"436":{"position":[[0,12]]},"438":{"position":[[5,12]]},"439":{"position":[[0,12]]},"440":{"position":[[0,12]]},"448":{"position":[[0,12]]},"451":{"position":[[8,13]]},"558":{"position":[[29,12]]},"559":{"position":[[37,13]]},"560":{"position":[[8,12]]},"566":{"position":[[10,12]]},"709":{"position":[[0,12]]},"1153":{"position":[[10,12]]},"1155":{"position":[[10,12]]},"1158":{"position":[[15,12]]},"1159":{"position":[[12,12]]},"1242":{"position":[[0,13]]}},"content":{"16":{"position":[[330,12]]},"35":{"position":[[185,13]]},"51":{"position":[[83,12],[527,12],[613,14]]},"55":{"position":[[785,14]]},"63":{"position":[[1,12]]},"65":{"position":[[1946,12]]},"66":{"position":[[32,12]]},"131":{"position":[[108,12],[141,12]]},"162":{"position":[[153,12],[206,12]]},"209":{"position":[[118,14]]},"211":{"position":[[180,14]]},"255":{"position":[[465,14]]},"258":{"position":[[118,14]]},"287":{"position":[[338,12],[384,13]]},"299":{"position":[[1610,13],[1715,12]]},"314":{"position":[[76,12],[417,14]]},"315":{"position":[[314,14]]},"318":{"position":[[196,12]]},"321":{"position":[[371,13]]},"331":{"position":[[43,12]]},"334":{"position":[[269,14]]},"336":{"position":[[126,13],[503,12]]},"368":{"position":[[161,12]]},"392":{"position":[[77,12],[131,13],[311,14]]},"408":{"position":[[341,12]]},"424":{"position":[[5,12]]},"425":{"position":[[95,13]]},"426":{"position":[[10,12]]},"427":{"position":[[26,12],[172,12],[267,12],[455,12],[676,12],[884,12],[1155,12],[1344,12],[1544,13]]},"429":{"position":[[45,12],[315,12],[429,12],[489,12],[509,12]]},"430":{"position":[[7,12],[268,12],[463,12],[746,12]]},"432":{"position":[[7,12],[269,13],[591,12],[781,12],[1315,13],[1393,12]]},"434":{"position":[[218,12]]},"437":{"position":[[100,12],[186,13]]},"438":{"position":[[16,12],[113,12],[198,12],[278,12]]},"439":{"position":[[61,12],[349,13]]},"440":{"position":[[43,12],[221,12],[264,12],[330,13]]},"441":{"position":[[41,12]]},"451":{"position":[[5,12],[90,12],[279,12],[768,12]]},"458":{"position":[[557,12],[712,12]]},"459":{"position":[[360,12]]},"460":{"position":[[707,12],[1023,13]]},"461":{"position":[[606,12],[757,12],[972,13]]},"462":{"position":[[912,13]]},"463":{"position":[[238,12]]},"464":{"position":[[295,12],[461,12]]},"465":{"position":[[156,12],[322,12]]},"466":{"position":[[121,12]]},"467":{"position":[[93,12]]},"468":{"position":[[1,12]]},"469":{"position":[[622,12],[683,12]]},"480":{"position":[[275,14]]},"482":{"position":[[276,14]]},"504":{"position":[[69,12],[137,12]]},"521":{"position":[[402,12]]},"522":{"position":[[382,14]]},"524":{"position":[[211,12],[264,12]]},"538":{"position":[[51,12],[215,12],[376,14]]},"542":{"position":[[496,14]]},"559":{"position":[[1,12],[549,12],[825,12],[989,12],[1104,12],[1387,12],[1561,12]]},"560":{"position":[[7,12],[283,13]]},"562":{"position":[[105,14]]},"563":{"position":[[315,14]]},"564":{"position":[[379,14]]},"566":{"position":[[16,12]]},"567":{"position":[[935,12]]},"579":{"position":[[121,12],[271,14]]},"581":{"position":[[131,12],[173,12]]},"598":{"position":[[51,12],[216,12],[371,14]]},"632":{"position":[[1156,14],[1244,12]]},"653":{"position":[[221,14]]},"659":{"position":[[143,12]]},"660":{"position":[[66,12]]},"662":{"position":[[1099,12]]},"680":{"position":[[634,14]]},"696":{"position":[[831,13],[888,12]]},"709":{"position":[[124,13],[837,12]]},"710":{"position":[[650,12],[1030,12],[1644,14]]},"717":{"position":[[701,14]]},"734":{"position":[[265,14]]},"739":{"position":[[252,14]]},"759":{"position":[[35,12],[299,14]]},"760":{"position":[[395,14]]},"793":{"position":[[180,12],[567,12],[1336,12]]},"829":{"position":[[576,14]]},"835":{"position":[[85,12]]},"862":{"position":[[433,14]]},"898":{"position":[[2083,12],[2282,14]]},"904":{"position":[[411,12],[469,12],[682,14]]},"960":{"position":[[250,14]]},"962":{"position":[[485,12],[721,14]]},"977":{"position":[[615,16]]},"1114":{"position":[[549,14]]},"1141":{"position":[[182,12]]},"1154":{"position":[[168,12],[282,12]]},"1156":{"position":[[70,12],[186,12]]},"1157":{"position":[[7,12],[139,12],[224,12],[402,12]]},"1158":{"position":[[140,14]]},"1159":{"position":[[11,12],[66,12],[347,14],[453,13]]},"1206":{"position":[[198,13]]},"1209":{"position":[[130,13]]},"1218":{"position":[[679,14]]},"1222":{"position":[[142,14],[299,12]]},"1235":{"position":[[25,12],[467,12]]},"1238":{"position":[[382,12],[759,12]]},"1239":{"position":[[560,12]]},"1242":{"position":[[69,12],[194,12]]},"1246":{"position":[[1595,12],[1639,12],[1833,12]]},"1286":{"position":[[325,14]]},"1287":{"position":[[371,14]]},"1288":{"position":[[331,14]]}},"keywords":{}}],["localstorage"",{"_index":1477,"title":{},"content":{"244":{"position":[[78,18],[186,19]]}},"keywords":{}}],["localstorage.clear",{"_index":2875,"title":{},"content":{"425":{"position":[[504,21]]}},"keywords":{}}],["localstorage.getitem('usernam",{"_index":2873,"title":{},"content":{"425":{"position":[[378,33]]},"559":{"position":[[336,33]]}},"keywords":{}}],["localstorage.j",{"_index":1959,"title":{},"content":{"336":{"position":[[81,15]]}},"keywords":{}}],["localstorage.removeitem('usernam",{"_index":2874,"title":{},"content":{"425":{"position":[[446,36]]}},"keywords":{}}],["localstorage.send",{"_index":3054,"title":{},"content":{"464":{"position":[[597,20]]}},"keywords":{}}],["localstorage.setitem",{"_index":2933,"title":{},"content":{"440":{"position":[[71,22]]}},"keywords":{}}],["localstorage.setitem('us",{"_index":2878,"title":{},"content":{"426":{"position":[[387,28]]}},"keywords":{}}],["localstorage.setitem('usernam",{"_index":2870,"title":{},"content":{"425":{"position":[[276,32]]},"559":{"position":[[434,32]]}},"keywords":{}}],["localstorage/indexeddb/websql",{"_index":3783,"title":{"660":{"position":[[0,30]]}},"content":{},"keywords":{}}],["localstorageexampl",{"_index":3387,"title":{},"content":{"559":{"position":[[246,21],[795,20]]}},"keywords":{}}],["localstoragewhil",{"_index":3406,"title":{},"content":{"559":{"position":[[971,17]]}},"keywords":{}}],["localstorage’",{"_index":3414,"title":{},"content":{"559":{"position":[[1712,14]]}},"keywords":{}}],["localstroag",{"_index":5386,"title":{},"content":{"962":{"position":[[612,12]]},"1242":{"position":[[5,12]]}},"keywords":{}}],["locat",{"_index":3790,"title":{},"content":{"661":{"position":[[605,8]]},"662":{"position":[[1359,8]]},"736":{"position":[[82,8]]},"838":{"position":[[2307,8]]},"849":{"position":[[882,8]]},"1007":{"position":[[1026,9],[1980,8]]},"1093":{"position":[[78,8]]},"1134":{"position":[[539,9]]},"1227":{"position":[[357,8]]},"1265":{"position":[[350,8]]},"1279":{"position":[[61,8]]}},"keywords":{}}],["location.reload",{"_index":4109,"title":{},"content":{"740":{"position":[[672,18]]},"879":{"position":[[666,18]]},"990":{"position":[[1398,18]]}},"keywords":{}}],["lock",{"_index":237,"title":{},"content":{"14":{"position":[[1072,4]]},"202":{"position":[[376,6]]},"212":{"position":[[376,4]]},"247":{"position":[[56,4]]},"249":{"position":[[340,4]]},"262":{"position":[[492,4]]},"376":{"position":[[427,4]]},"381":{"position":[[540,7]]},"412":{"position":[[1301,4],[1532,4],[2499,4]]},"461":{"position":[[542,6]]},"839":{"position":[[539,6],[836,4],[1314,4]]},"840":{"position":[[504,4]]},"841":{"position":[[1502,6],[1581,4]]},"886":{"position":[[4619,6]]},"1124":{"position":[[121,4]]}},"keywords":{}}],["lodash",{"_index":528,"title":{},"content":{"34":{"position":[[54,6]]}},"keywords":{}}],["log",{"_index":1902,"title":{"746":{"position":[[19,7]]},"747":{"position":[[13,7]]},"1151":{"position":[[34,4]]},"1178":{"position":[[34,4]]}},"content":{"316":{"position":[[136,5],[161,5]]},"353":{"position":[[708,5]]},"411":{"position":[[4327,4]]},"439":{"position":[[533,6]]},"616":{"position":[[909,5]]},"639":{"position":[[320,5],[345,4]]},"696":{"position":[[581,5]]},"745":{"position":[[159,7]]},"746":{"position":[[29,3],[151,3],[168,4],[386,3],[495,3],[587,3]]},"747":{"position":[[48,3]]},"904":{"position":[[3387,3]]},"1010":{"position":[[236,3]]},"1094":{"position":[[432,7]]},"1151":{"position":[[801,4],[864,4]]},"1178":{"position":[[798,4],[861,4]]},"1282":{"position":[[659,3],[855,3],[868,4]]}},"keywords":{}}],["logger",{"_index":4112,"title":{"744":{"position":[[5,6]]},"745":{"position":[[10,6]]}},"content":{"745":{"position":[[5,6],[371,6]]},"747":{"position":[[10,6]]},"793":{"position":[[455,6]]}},"keywords":{}}],["loggingstorag",{"_index":4115,"title":{},"content":{"745":{"position":[[384,14],[577,14]]},"746":{"position":[[272,14]]},"747":{"position":[[89,14]]}},"keywords":{}}],["logic",{"_index":668,"title":{},"content":{"43":{"position":[[102,5]]},"51":{"position":[[948,5]]},"168":{"position":[[219,5]]},"196":{"position":[[155,6]]},"203":{"position":[[171,6]]},"249":{"position":[[435,5]]},"262":{"position":[[434,5]]},"299":{"position":[[1139,5]]},"314":{"position":[[1115,5]]},"326":{"position":[[294,6]]},"344":{"position":[[153,5]]},"354":{"position":[[626,5]]},"383":{"position":[[475,6]]},"384":{"position":[[405,5]]},"392":{"position":[[4999,7]]},"411":{"position":[[1606,5]]},"412":{"position":[[1278,6],[4158,5],[8931,5],[9122,6],[11342,5],[13837,9]]},"559":{"position":[[1320,6]]},"566":{"position":[[952,5]]},"590":{"position":[[726,5]]},"626":{"position":[[594,6]]},"632":{"position":[[20,5],[2419,5],[2535,5]]},"634":{"position":[[507,5]]},"681":{"position":[[179,6]]},"682":{"position":[[113,5]]},"683":{"position":[[597,6]]},"686":{"position":[[596,5]]},"687":{"position":[[41,5]]},"688":{"position":[[573,6]]},"691":{"position":[[639,5]]},"697":{"position":[[230,5]]},"765":{"position":[[43,5]]},"839":{"position":[[950,5]]},"906":{"position":[[699,5],[1104,6]]},"1148":{"position":[[398,5]]},"1175":{"position":[[349,6]]},"1307":{"position":[[568,6]]},"1313":{"position":[[59,5],[942,5]]},"1316":{"position":[[2112,7]]}},"keywords":{}}],["logic.async",{"_index":3524,"title":{},"content":{"590":{"position":[[395,11]]}},"keywords":{}}],["logic.compat",{"_index":3894,"title":{},"content":{"688":{"position":[[918,16]]}},"keywords":{}}],["logic.your",{"_index":3905,"title":{},"content":{"690":{"position":[[81,10]]}},"keywords":{}}],["logid",{"_index":4127,"title":{},"content":{"747":{"position":[[200,6],[258,6],[318,6]]}},"keywords":{}}],["login",{"_index":333,"title":{},"content":{"19":{"position":[[583,5]]},"779":{"position":[[166,5]]}},"keywords":{}}],["logo",{"_index":2816,"title":{},"content":{"419":{"position":[[1665,5]]}},"keywords":{}}],["loki",{"_index":6137,"title":{},"content":{"1173":{"position":[[261,4]]},"1177":{"position":[[598,4]]}},"keywords":{}}],["loki.j",{"_index":6153,"title":{},"content":{"1178":{"position":[[103,7]]}},"keywords":{}}],["lokifsstructuredadapt",{"_index":4575,"title":{},"content":{"772":{"position":[[2176,23],[2478,25]]}},"keywords":{}}],["lokiincrementalindexeddbadapt",{"_index":6131,"title":{},"content":{"1172":{"position":[[202,31],[385,34]]}},"keywords":{}}],["lokij",{"_index":295,"title":{"28":{"position":[[0,7]]},"1169":{"position":[[10,6]]},"1177":{"position":[[19,6]]}},"content":{"17":{"position":[[408,6]]},"28":{"position":[[1,6],[101,6],[662,6],[698,6]]},"32":{"position":[[168,6]]},"186":{"position":[[121,7]]},"188":{"position":[[277,6],[734,8]]},"189":{"position":[[113,6],[131,6]]},"772":{"position":[[1890,6],[2310,8]]},"1172":{"position":[[97,8],[436,6]]},"1173":{"position":[[1,6],[80,6],[213,6]]},"1174":{"position":[[20,7],[114,6],[257,6],[327,6]]},"1175":{"position":[[18,7],[86,6]]},"1176":{"position":[[21,6],[124,6]]},"1177":{"position":[[52,6]]},"1178":{"position":[[769,6]]},"1284":{"position":[[398,7],[429,6]]},"1299":{"position":[[494,6]]},"1300":{"position":[[347,6],[573,6]]}},"keywords":{}}],["long",{"_index":1109,"title":{"609":{"position":[[36,4]]},"610":{"position":[[8,4]]}},"content":{"131":{"position":[[877,4]]},"141":{"position":[[130,4]]},"212":{"position":[[1,4]]},"266":{"position":[[477,4]]},"287":{"position":[[1052,4]]},"305":{"position":[[43,4],[233,4]]},"399":{"position":[[596,4]]},"404":{"position":[[440,4]]},"407":{"position":[[1127,4]]},"412":{"position":[[14891,4]]},"420":{"position":[[1035,4]]},"461":{"position":[[320,4]]},"463":{"position":[[579,4]]},"465":{"position":[[58,4]]},"468":{"position":[[644,4]]},"610":{"position":[[1,4],[312,4],[868,4],[1106,4],[1392,4],[1419,4]]},"611":{"position":[[71,4],[1401,4]]},"616":{"position":[[193,4],[291,4],[509,4]]},"619":{"position":[[336,4]]},"620":{"position":[[68,4]]},"624":{"position":[[1338,4]]},"653":{"position":[[391,4]]},"660":{"position":[[209,4]]},"696":{"position":[[338,4]]},"704":{"position":[[205,4]]},"740":{"position":[[182,4]]},"752":{"position":[[222,4],[578,4]]},"783":{"position":[[414,4]]},"835":{"position":[[256,4]]},"839":{"position":[[1395,4]]},"846":{"position":[[918,4]]},"849":{"position":[[59,4]]},"875":{"position":[[7189,4]]},"987":{"position":[[885,4]]},"988":{"position":[[5026,4]]},"1313":{"position":[[380,4],[554,4],[817,4]]},"1316":{"position":[[2699,4],[2810,4]]}},"keywords":{}}],["longer",{"_index":1134,"title":{"783":{"position":[[17,6]]}},"content":{"143":{"position":[[293,6]]},"400":{"position":[[188,6]]},"401":{"position":[[671,6]]},"474":{"position":[[200,6]]},"590":{"position":[[559,6]]},"642":{"position":[[276,6]]},"687":{"position":[[283,6]]},"715":{"position":[[363,6]]},"780":{"position":[[677,6]]},"816":{"position":[[427,6]]},"837":{"position":[[1184,6]]},"840":{"position":[[448,6]]},"879":{"position":[[241,6]]},"880":{"position":[[48,6],[82,6]]},"995":{"position":[[1061,6]]},"1007":{"position":[[818,6]]},"1009":{"position":[[1085,6]]},"1027":{"position":[[64,6]]},"1031":{"position":[[252,6]]},"1032":{"position":[[59,6]]},"1047":{"position":[[152,6]]},"1104":{"position":[[600,6]]},"1112":{"position":[[476,6]]},"1192":{"position":[[492,6]]},"1288":{"position":[[48,6]]},"1301":{"position":[[1547,6]]},"1313":{"position":[[277,6],[535,6],[882,6]]}},"keywords":{}}],["longpol",{"_index":3553,"title":{},"content":{"610":{"position":[[913,10],[1063,11],[1364,11]]}},"keywords":{}}],["longth",{"_index":3036,"title":{},"content":{"463":{"position":[[881,7]]}},"keywords":{}}],["look",{"_index":2444,"title":{},"content":{"401":{"position":[[12,4]]},"408":{"position":[[4054,7]]},"420":{"position":[[7,4]]},"432":{"position":[[946,7]]},"567":{"position":[[11,7]]},"620":{"position":[[235,4]]},"698":{"position":[[315,4],[2065,5]]},"752":{"position":[[1096,4]]},"778":{"position":[[264,7]]},"818":{"position":[[347,4]]},"824":{"position":[[540,4]]},"885":{"position":[[1448,4]]},"901":{"position":[[530,4]]},"986":{"position":[[707,4]]},"988":{"position":[[5381,4]]},"1276":{"position":[[357,4]]},"1305":{"position":[[538,5]]},"1309":{"position":[[353,4]]},"1316":{"position":[[2233,4]]},"1318":{"position":[[522,4]]},"1321":{"position":[[655,4]]}},"keywords":{}}],["lookup",{"_index":2035,"title":{},"content":{"356":{"position":[[288,7]]},"376":{"position":[[588,8]]},"559":{"position":[[1488,7]]},"560":{"position":[[70,7]]}},"keywords":{}}],["lookups.perform",{"_index":1324,"title":{},"content":{"205":{"position":[[168,15]]}},"keywords":{}}],["lookups.test",{"_index":3527,"title":{},"content":{"590":{"position":[[671,12]]}},"keywords":{}}],["loop",{"_index":5591,"title":{},"content":{"1010":{"position":[[17,5],[79,5]]}},"keywords":{}}],["loos",{"_index":460,"title":{},"content":{"28":{"position":[[413,5]]},"402":{"position":[[525,5]]},"611":{"position":[[1024,5]]},"875":{"position":[[8561,6]]},"1222":{"position":[[905,5]]},"1301":{"position":[[294,5]]},"1316":{"position":[[1474,7]]}},"keywords":{}}],["lose",{"_index":2065,"title":{"1323":{"position":[[9,4]]}},"content":{"358":{"position":[[703,6],[1013,4]]},"380":{"position":[[95,5]]},"412":{"position":[[8740,4]]},"703":{"position":[[703,4],[783,4]]}},"keywords":{}}],["loss",{"_index":2161,"title":{},"content":{"382":{"position":[[399,5]]},"398":{"position":[[214,4]]},"402":{"position":[[2538,4]]},"419":{"position":[[907,5]]},"612":{"position":[[1414,5]]},"981":{"position":[[1459,4]]},"1304":{"position":[[1499,4]]}},"keywords":{}}],["lost",{"_index":11,"title":{},"content":{"1":{"position":[[154,4]]},"30":{"position":[[154,4]]},"412":{"position":[[8288,5]]},"416":{"position":[[468,5]]},"660":{"position":[[378,4]]},"691":{"position":[[203,5]]},"773":{"position":[[274,4]]},"774":{"position":[[1006,4]]},"1090":{"position":[[1277,5]]},"1164":{"position":[[986,4]]},"1171":{"position":[[45,4]]},"1174":{"position":[[307,5]]},"1300":{"position":[[187,5]]},"1301":{"position":[[392,4]]},"1314":{"position":[[137,4]]}},"keywords":{}}],["lot",{"_index":292,"title":{},"content":{"17":{"position":[[246,4]]},"24":{"position":[[393,3]]},"33":{"position":[[382,3]]},"412":{"position":[[15250,3]]},"709":{"position":[[783,3]]},"752":{"position":[[175,4]]}},"keywords":{}}],["low",{"_index":692,"title":{"92":{"position":[[28,3]]},"220":{"position":[[0,3]]},"1239":{"position":[[0,3]]}},"content":{"45":{"position":[[16,3]]},"65":{"position":[[1010,3]]},"92":{"position":[[80,3]]},"122":{"position":[[349,3]]},"131":{"position":[[279,3]]},"133":{"position":[[342,3]]},"173":{"position":[[2505,3]]},"181":{"position":[[70,3]]},"220":{"position":[[27,3]]},"299":{"position":[[1007,3],[1094,3]]},"300":{"position":[[635,3]]},"301":{"position":[[56,3],[547,3]]},"331":{"position":[[293,3]]},"378":{"position":[[217,3]]},"408":{"position":[[3526,3]]},"410":{"position":[[56,3]]},"412":{"position":[[9360,3],[10684,3]]},"418":{"position":[[160,3]]},"452":{"position":[[93,3]]},"497":{"position":[[625,4]]},"521":{"position":[[65,3]]},"533":{"position":[[16,3]]},"535":{"position":[[272,3]]},"548":{"position":[[288,3]]},"560":{"position":[[196,3]]},"566":{"position":[[85,3]]},"569":{"position":[[390,3]]},"593":{"position":[[16,3]]},"595":{"position":[[285,3]]},"608":{"position":[[286,3]]},"611":{"position":[[550,3]]},"613":{"position":[[60,3]]},"621":{"position":[[223,3],[733,3]]},"660":{"position":[[236,3]]},"1123":{"position":[[76,3]]},"1206":{"position":[[373,3]]},"1209":{"position":[[53,3]]},"1239":{"position":[[68,3]]}},"keywords":{}}],["lowdb",{"_index":526,"title":{"34":{"position":[[0,6]]}},"content":{"34":{"position":[[1,5],[133,5],[386,6],[517,6],[706,5]]}},"keywords":{}}],["lower",{"_index":890,"title":{"204":{"position":[[3,5]]}},"content":{"61":{"position":[[442,5]]},"277":{"position":[[282,5]]},"376":{"position":[[665,5]]},"402":{"position":[[1206,5]]},"617":{"position":[[386,5],[1773,5]]},"622":{"position":[[432,5]]},"772":{"position":[[2577,6]]},"796":{"position":[[803,5]]},"1239":{"position":[[247,5]]}},"keywords":{}}],["lowercas",{"_index":5797,"title":{},"content":{"1072":{"position":[[2159,9],[2322,10]]}},"keywords":{}}],["lowest",{"_index":3052,"title":{},"content":{"464":{"position":[[482,6]]},"621":{"position":[[24,6]]},"1320":{"position":[[173,6]]}},"keywords":{}}],["lsh",{"_index":2335,"title":{},"content":{"396":{"position":[[123,6],[130,3]]}},"keywords":{}}],["lt",{"_index":600,"title":{},"content":{"38":{"position":[[986,4],[1015,4]]},"367":{"position":[[746,4],[864,4]]},"398":{"position":[[1075,4],[2422,4]]},"403":{"position":[[516,4]]},"522":{"position":[[454,4],[505,4],[548,4],[598,4],[666,4],[732,4]]},"602":{"position":[[454,5]]},"681":{"position":[[727,4]]},"734":{"position":[[785,4]]},"739":{"position":[[551,4]]},"749":{"position":[[21551,5]]},"751":{"position":[[1959,4]]},"752":{"position":[[458,4]]},"759":{"position":[[781,4]]},"760":{"position":[[413,4]]},"796":{"position":[[555,4],[963,4],[1394,4]]},"799":{"position":[[734,4]]},"838":{"position":[[2360,4]]},"858":{"position":[[492,6],[499,6]]},"885":{"position":[[1795,4],[1898,4],[2084,4]]},"886":{"position":[[3993,4]]},"906":{"position":[[1041,4]]},"932":{"position":[[1297,4]]},"960":{"position":[[322,4],[373,4],[443,4],[493,4],[561,4],[627,4]]},"983":{"position":[[1030,4]]},"988":{"position":[[3961,4]]},"1013":{"position":[[398,4],[550,4]]},"1036":{"position":[[152,4]]},"1062":{"position":[[190,4]]},"1074":{"position":[[1002,4]]},"1078":{"position":[[564,4],[892,4]]},"1080":{"position":[[187,4],[283,4],[747,4],[843,4],[935,4]]},"1082":{"position":[[272,4],[421,4]]},"1083":{"position":[[472,4]]},"1277":{"position":[[444,4]]}},"keywords":{}}],["lt;/characterlist>",{"_index":3284,"title":{},"content":{"523":{"position":[[833,22]]}},"keywords":{}}],["lt;/div>",{"_index":3319,"title":{},"content":{"541":{"position":[[721,12]]},"559":{"position":[[762,12]]},"601":{"position":[[305,12]]},"602":{"position":[[692,12]]}},"keywords":{}}],["lt;/li>",{"_index":824,"title":{},"content":{"54":{"position":[[289,11]]},"55":{"position":[[1210,11]]},"335":{"position":[[525,11]]},"493":{"position":[[285,11]]},"541":{"position":[[693,11]]},"562":{"position":[[1542,11]]},"571":{"position":[[1173,15]]},"580":{"position":[[875,11]]},"601":{"position":[[281,11]]},"602":{"position":[[668,11]]},"825":{"position":[[856,13]]}},"keywords":{}}],["lt;/rxdatabaseprovider>",{"_index":4755,"title":{},"content":{"829":{"position":[[1814,27]]}},"keywords":{}}],["lt;/script>",{"_index":3501,"title":{},"content":{"580":{"position":[[716,15]]},"601":{"position":[[704,15]]}},"keywords":{}}],["lt;/span>",{"_index":4752,"title":{},"content":{"829":{"position":[[1716,14]]}},"keywords":{}}],["lt;/strong>",{"_index":3540,"title":{},"content":{"601":{"position":[[244,17]]},"602":{"position":[[631,17]]}},"keywords":{}}],["lt;/template>",{"_index":3509,"title":{},"content":{"580":{"position":[[899,17]]},"601":{"position":[[318,17]]},"602":{"position":[[705,17]]}},"keywords":{}}],["lt;/ul>",{"_index":825,"title":{},"content":{"54":{"position":[[301,11]]},"55":{"position":[[1222,11]]},"130":{"position":[[664,11]]},"493":{"position":[[297,11]]},"494":{"position":[[408,11]]},"541":{"position":[[709,11]]},"542":{"position":[[914,11]]},"562":{"position":[[1558,11]]},"580":{"position":[[887,11]]},"601":{"position":[[293,11]]},"602":{"position":[[680,11]]},"825":{"position":[[870,11]]},"829":{"position":[[3612,11]]}},"keywords":{}}],["lt;a",{"_index":4750,"title":{},"content":{"829":{"position":[[1634,5]]}},"keywords":{}}],["lt;button",{"_index":3281,"title":{},"content":{"523":{"position":[[773,10]]}},"keywords":{}}],["lt;charact",{"_index":3277,"title":{},"content":{"523":{"position":[[690,13]]}},"keywords":{}}],["lt;characterlist>",{"_index":3275,"title":{},"content":{"523":{"position":[[625,21]]}},"keywords":{}}],["lt;div>",{"_index":3312,"title":{},"content":{"541":{"position":[[533,11]]},"559":{"position":[[519,11]]},"601":{"position":[[94,11]]},"602":{"position":[[400,11]]}},"keywords":{}}],["lt;h2>hero",{"_index":3313,"title":{},"content":{"541":{"position":[[545,14]]},"601":{"position":[[106,14]]},"602":{"position":[[412,14]]}},"keywords":{}}],["lt;h2>reactj",{"_index":3392,"title":{},"content":{"559":{"position":[[531,17]]}},"keywords":{}}],["lt;input",{"_index":3394,"title":{},"content":{"559":{"position":[[578,9]]}},"keywords":{}}],["lt;li",{"_index":820,"title":{},"content":{"54":{"position":[[215,6]]},"55":{"position":[[1137,6]]},"493":{"position":[[224,6]]},"494":{"position":[[359,6]]},"541":{"position":[[612,6]]},"542":{"position":[[863,6]]},"562":{"position":[[1483,6]]},"580":{"position":[[760,6]]},"601":{"position":[[148,6]]},"602":{"position":[[523,6]]},"825":{"position":[[791,6]]},"829":{"position":[[3559,6]]}},"keywords":{}}],["lt;li>",{"_index":1949,"title":{},"content":{"335":{"position":[[447,10]]},"571":{"position":[[1147,12]]}},"keywords":{}}],["lt;li>{{hero.name}}</li>",{"_index":1101,"title":{},"content":{"130":{"position":[[629,34]]}},"keywords":{}}],["lt;p>store",{"_index":3401,"title":{},"content":{"559":{"position":[[724,16]]}},"keywords":{}}],["lt;rxdatabaseprovid",{"_index":4753,"title":{},"content":{"829":{"position":[[1742,22]]}},"keywords":{}}],["lt;rxdatabaseprovider>",{"_index":4438,"title":{},"content":{"749":{"position":[[24164,26]]}},"keywords":{}}],["lt;script",{"_index":3492,"title":{},"content":{"580":{"position":[[278,10]]},"601":{"position":[[336,10]]}},"keywords":{}}],["lt;span",{"_index":6182,"title":{},"content":{"1202":{"position":[[93,8]]}},"keywords":{}}],["lt;span>",{"_index":4749,"title":{},"content":{"829":{"position":[[1613,12]]}},"keywords":{}}],["lt;span>loading...</span>",{"_index":4758,"title":{},"content":{"829":{"position":[[2555,36],[3474,36]]}},"keywords":{}}],["lt;span>tot",{"_index":4759,"title":{},"content":{"829":{"position":[[2601,17]]}},"keywords":{}}],["lt;strong>",{"_index":3539,"title":{},"content":{"601":{"position":[[217,16]]},"602":{"position":[[604,16]]}},"keywords":{}}],["lt;strong>${hero.name}</strong>",{"_index":1950,"title":{},"content":{"335":{"position":[[458,41]]}},"keywords":{}}],["lt;strong>{hero.name}</strong>",{"_index":3317,"title":{},"content":{"541":{"position":[[637,40]]}},"keywords":{}}],["lt;template>",{"_index":3502,"title":{},"content":{"580":{"position":[[732,16]]},"601":{"position":[[77,16]]},"602":{"position":[[383,16]]}},"keywords":{}}],["lt;ul",{"_index":1099,"title":{},"content":{"130":{"position":[[560,6]]},"493":{"position":[[155,6]]}},"keywords":{}}],["lt;ul>",{"_index":819,"title":{},"content":{"54":{"position":[[204,10]]},"55":{"position":[[1126,10]]},"494":{"position":[[324,10]]},"541":{"position":[[576,10]]},"542":{"position":[[827,10]]},"562":{"position":[[1447,10]]},"580":{"position":[[749,10]]},"601":{"position":[[137,10]]},"602":{"position":[[443,10]]},"825":{"position":[[780,10]]},"829":{"position":[[3522,10]]}},"keywords":{}}],["luck",{"_index":3934,"title":{},"content":{"696":{"position":[[592,4]]}},"keywords":{}}],["lwt",{"_index":6151,"title":{},"content":{"1177":{"position":[[492,4]]}},"keywords":{}}],["m",{"_index":4653,"title":{},"content":{"798":{"position":[[611,3]]},"1066":{"position":[[417,3]]}},"keywords":{}}],["machin",{"_index":2183,"title":{},"content":{"390":{"position":[[258,7]]},"391":{"position":[[196,7],[986,7]]},"392":{"position":[[1983,7],[4941,8]]},"402":{"position":[[1769,7]]},"462":{"position":[[484,7]]},"699":{"position":[[448,7],[530,9]]},"743":{"position":[[232,8]]},"1246":{"position":[[866,8]]},"1292":{"position":[[87,7],[142,7]]}},"keywords":{}}],["made",{"_index":288,"title":{"76":{"position":[[0,4]]},"107":{"position":[[0,4]]},"230":{"position":[[0,4]]},"238":{"position":[[29,4]]},"1250":{"position":[[7,4]]},"1254":{"position":[[14,4]]}},"content":{"17":{"position":[[87,4]]},"21":{"position":[[188,4]]},"25":{"position":[[76,4]]},"36":{"position":[[313,4]]},"37":{"position":[[32,4]]},"113":{"position":[[74,4]]},"125":{"position":[[227,4]]},"129":{"position":[[226,4]]},"136":{"position":[[88,4]]},"174":{"position":[[2990,4]]},"191":{"position":[[129,4]]},"274":{"position":[[333,4]]},"289":{"position":[[877,4]]},"366":{"position":[[43,4]]},"404":{"position":[[497,5]]},"408":{"position":[[712,4]]},"445":{"position":[[1044,4]]},"446":{"position":[[341,4]]},"450":{"position":[[725,4]]},"453":{"position":[[473,4]]},"469":{"position":[[120,4]]},"517":{"position":[[287,4]]},"519":{"position":[[170,4]]},"525":{"position":[[148,4]]},"576":{"position":[[401,4]]},"589":{"position":[[136,4]]},"614":{"position":[[543,4]]},"626":{"position":[[313,4]]},"662":{"position":[[376,4]]},"686":{"position":[[149,4]]},"698":{"position":[[1573,4]]},"783":{"position":[[117,4],[401,4]]},"863":{"position":[[397,4]]},"906":{"position":[[299,4]]},"1007":{"position":[[1057,4]]},"1093":{"position":[[227,4]]},"1246":{"position":[[692,4]]},"1250":{"position":[[8,4]]},"1271":{"position":[[333,4]]},"1316":{"position":[[3541,4]]}},"keywords":{}}],["made.nest",{"_index":4920,"title":{},"content":{"863":{"position":[[753,11]]}},"keywords":{}}],["magic",{"_index":3946,"title":{},"content":{"698":{"position":[[3106,9]]}},"keywords":{}}],["mailbywordcollect",{"_index":5637,"title":{},"content":{"1023":{"position":[[191,21]]}},"keywords":{}}],["mailbywordcollection.bulkinsert",{"_index":5640,"title":{},"content":{"1023":{"position":[[441,32]]}},"keywords":{}}],["mailbywordcollection.find({emailid",{"_index":5638,"title":{},"content":{"1023":{"position":[[302,35]]}},"keywords":{}}],["mailid",{"_index":5634,"title":{},"content":{"1022":{"position":[[993,7]]},"1023":{"position":[[657,7]]}},"keywords":{}}],["main",{"_index":289,"title":{"642":{"position":[[25,4]]},"1211":{"position":[[18,4]]},"1226":{"position":[[7,4]]},"1264":{"position":[[7,4]]}},"content":{"17":{"position":[[178,4]]},"19":{"position":[[186,4]]},"24":{"position":[[252,4]]},"27":{"position":[[131,4]]},"29":{"position":[[102,4]]},"266":{"position":[[988,4]]},"392":{"position":[[3470,4],[3686,4],[3794,4]]},"408":{"position":[[3906,4]]},"412":{"position":[[826,4]]},"427":{"position":[[306,4]]},"453":{"position":[[313,4]]},"454":{"position":[[890,4]]},"460":{"position":[[100,4],[644,4],[876,4],[948,4],[1214,4],[1382,4]]},"463":{"position":[[686,4],[931,4]]},"464":{"position":[[334,4]]},"465":{"position":[[195,4]]},"466":{"position":[[160,4]]},"467":{"position":[[131,4],[368,4]]},"468":{"position":[[84,4],[419,4]]},"470":{"position":[[393,4]]},"538":{"position":[[19,4]]},"540":{"position":[[102,4]]},"559":{"position":[[1131,4]]},"598":{"position":[[19,4]]},"642":{"position":[[171,4]]},"693":{"position":[[72,4],[453,4],[612,4],[919,5],[1239,5]]},"708":{"position":[[610,4]]},"709":{"position":[[1067,4]]},"710":{"position":[[1324,4],[2367,4]]},"711":{"position":[[323,4],[381,4],[538,4],[628,4],[1057,4]]},"721":{"position":[[211,4],[236,4],[403,4]]},"775":{"position":[[745,4]]},"801":{"position":[[187,4],[447,4],[975,4]]},"840":{"position":[[223,4]]},"1068":{"position":[[433,4]]},"1092":{"position":[[494,4]]},"1094":{"position":[[282,4]]},"1157":{"position":[[258,4]]},"1183":{"position":[[570,4]]},"1207":{"position":[[393,4],[552,4]]},"1211":{"position":[[151,4],[241,4],[415,4]]},"1213":{"position":[[176,4],[309,4]]},"1214":{"position":[[639,4]]},"1230":{"position":[[372,4]]},"1231":{"position":[[322,4],[392,4]]},"1239":{"position":[[225,4],[410,4]]},"1246":{"position":[[212,4],[532,4],[1475,4],[2098,4]]},"1276":{"position":[[292,4]]},"1286":{"position":[[374,4]]},"1287":{"position":[[420,4]]},"1288":{"position":[[380,4]]},"1315":{"position":[[1117,4]]}},"keywords":{}}],["main.j",{"_index":3927,"title":{},"content":{"693":{"position":[[705,7]]},"1214":{"position":[[491,8]]}},"keywords":{}}],["mainli",{"_index":2838,"title":{},"content":{"420":{"position":[[1190,6]]},"450":{"position":[[106,6]]},"1094":{"position":[[495,6]]},"1120":{"position":[[221,6]]}},"keywords":{}}],["maintain",{"_index":466,"title":{},"content":{"28":{"position":[[712,10]]},"47":{"position":[[573,11]]},"116":{"position":[[58,10]]},"145":{"position":[[45,8]]},"173":{"position":[[2860,11]]},"240":{"position":[[276,11]]},"255":{"position":[[1843,11]]},"289":{"position":[[372,8]]},"312":{"position":[[193,11]]},"353":{"position":[[195,8]]},"360":{"position":[[790,8]]},"366":{"position":[[203,11]]},"379":{"position":[[292,11]]},"384":{"position":[[443,11]]},"387":{"position":[[337,11]]},"396":{"position":[[453,11]]},"411":{"position":[[1680,11],[1788,9]]},"412":{"position":[[13749,12]]},"424":{"position":[[405,8]]},"445":{"position":[[1603,16]]},"516":{"position":[[351,11]]},"519":{"position":[[228,11]]},"595":{"position":[[683,8]]},"617":{"position":[[571,8],[631,8]]},"618":{"position":[[90,11]]},"623":{"position":[[13,11]]},"630":{"position":[[233,9]]},"632":{"position":[[109,9]]},"670":{"position":[[156,10],[252,10],[375,10]]},"705":{"position":[[56,11]]},"784":{"position":[[321,8]]},"835":{"position":[[763,10]]},"837":{"position":[[592,10],[1191,11]]},"901":{"position":[[450,11]]},"1133":{"position":[[307,10]]},"1151":{"position":[[362,11]]},"1178":{"position":[[361,11]]},"1198":{"position":[[2236,8]]}},"keywords":{}}],["mainten",{"_index":2753,"title":{},"content":{"412":{"position":[[12030,11]]},"661":{"position":[[484,11]]}},"keywords":{}}],["major",{"_index":2172,"title":{"760":{"position":[[29,5]]}},"content":{"387":{"position":[[207,5]]},"408":{"position":[[4221,5],[4288,5]]},"410":{"position":[[987,5]]},"412":{"position":[[782,5]]},"445":{"position":[[437,5]]},"452":{"position":[[487,5]]},"454":{"position":[[115,5]]},"760":{"position":[[33,5]]},"774":{"position":[[927,5]]},"837":{"position":[[607,5]]},"965":{"position":[[395,5]]},"1198":{"position":[[2169,5]]}},"keywords":{}}],["make",{"_index":186,"title":{"247":{"position":[[5,5]]},"668":{"position":[[0,6]]},"799":{"position":[[0,4]]}},"content":{"13":{"position":[[77,5],[275,5]]},"15":{"position":[[492,4]]},"34":{"position":[[672,4]]},"35":{"position":[[199,6],[484,5]]},"41":{"position":[[132,5]]},"64":{"position":[[158,6]]},"65":{"position":[[678,4],[1494,6]]},"72":{"position":[[94,6]]},"83":{"position":[[195,4]]},"104":{"position":[[139,5]]},"105":{"position":[[130,6]]},"118":{"position":[[333,4]]},"126":{"position":[[284,4]]},"129":{"position":[[451,4]]},"142":{"position":[[4,4]]},"148":{"position":[[451,4]]},"164":{"position":[[203,4]]},"167":{"position":[[300,6]]},"174":{"position":[[634,5],[1449,6]]},"175":{"position":[[637,4]]},"179":{"position":[[201,4]]},"183":{"position":[[41,6]]},"186":{"position":[[336,4]]},"206":{"position":[[301,4]]},"207":{"position":[[296,5]]},"227":{"position":[[104,6]]},"236":{"position":[[285,6]]},"241":{"position":[[637,4]]},"265":{"position":[[833,5]]},"266":{"position":[[189,6]]},"267":{"position":[[21,4],[225,4],[580,5],[902,4],[1393,4]]},"271":{"position":[[292,4]]},"281":{"position":[[167,6]]},"282":{"position":[[343,5]]},"295":{"position":[[156,6]]},"325":{"position":[[194,6]]},"328":{"position":[[286,4]]},"362":{"position":[[124,5]]},"365":{"position":[[370,6],[776,6]]},"366":{"position":[[385,6]]},"369":{"position":[[1031,6]]},"371":{"position":[[246,4]]},"387":{"position":[[406,6]]},"393":{"position":[[366,6]]},"394":{"position":[[1736,6]]},"395":{"position":[[493,5]]},"399":{"position":[[200,6]]},"402":{"position":[[601,5],[2029,5]]},"407":{"position":[[702,5]]},"408":{"position":[[1822,5],[2242,6]]},"409":{"position":[[27,6]]},"411":{"position":[[3089,4],[3666,5]]},"412":{"position":[[5977,4],[12612,5],[14498,5],[14835,5]]},"427":{"position":[[525,5],[926,6]]},"432":{"position":[[468,6]]},"435":{"position":[[304,6]]},"441":{"position":[[135,4],[617,4]]},"445":{"position":[[882,6],[1905,6]]},"446":{"position":[[825,4]]},"452":{"position":[[340,5],[754,5]]},"453":{"position":[[678,4]]},"454":{"position":[[574,5]]},"455":{"position":[[477,4]]},"457":{"position":[[596,4]]},"462":{"position":[[972,5]]},"473":{"position":[[148,5]]},"489":{"position":[[505,5]]},"491":{"position":[[508,5]]},"500":{"position":[[303,6]]},"516":{"position":[[201,4]]},"528":{"position":[[147,6]]},"533":{"position":[[270,6]]},"535":{"position":[[206,6]]},"554":{"position":[[1160,4]]},"571":{"position":[[625,4]]},"590":{"position":[[703,4]]},"593":{"position":[[270,6]]},"595":{"position":[[219,6],[795,6]]},"611":{"position":[[507,6]]},"612":{"position":[[195,6]]},"613":{"position":[[346,5]]},"614":{"position":[[722,5]]},"617":{"position":[[921,5]]},"621":{"position":[[470,6]]},"623":{"position":[[556,6]]},"624":{"position":[[459,6],[750,5]]},"627":{"position":[[258,4]]},"650":{"position":[[102,4]]},"659":{"position":[[914,5]]},"661":{"position":[[1647,5]]},"662":{"position":[[279,5]]},"666":{"position":[[53,4]]},"668":{"position":[[8,4]]},"670":{"position":[[35,4]]},"679":{"position":[[109,4]]},"682":{"position":[[136,4]]},"683":{"position":[[553,4]]},"685":{"position":[[350,5]]},"686":{"position":[[554,5]]},"696":{"position":[[1,6],[548,4],[1609,4]]},"701":{"position":[[504,5]]},"702":{"position":[[358,4]]},"703":{"position":[[1089,5]]},"705":{"position":[[632,5]]},"711":{"position":[[2089,5]]},"714":{"position":[[277,6]]},"717":{"position":[[237,5]]},"723":{"position":[[1833,6]]},"737":{"position":[[83,5]]},"739":{"position":[[4,4]]},"749":{"position":[[5643,4]]},"770":{"position":[[601,4]]},"773":{"position":[[178,5]]},"781":{"position":[[826,5]]},"783":{"position":[[434,5]]},"784":{"position":[[33,4],[808,5]]},"785":{"position":[[390,4],[678,4]]},"795":{"position":[[54,4]]},"798":{"position":[[730,5]]},"799":{"position":[[92,4],[740,4]]},"800":{"position":[[45,4]]},"815":{"position":[[328,4]]},"821":{"position":[[201,5],[424,5],[747,5]]},"826":{"position":[[168,4]]},"828":{"position":[[402,5]]},"829":{"position":[[1167,6]]},"831":{"position":[[254,5]]},"835":{"position":[[985,5]]},"838":{"position":[[308,5],[511,6],[745,4]]},"860":{"position":[[800,6],[1158,5]]},"861":{"position":[[2314,4]]},"872":{"position":[[779,4]]},"875":{"position":[[9378,4]]},"884":{"position":[[41,4]]},"886":{"position":[[4701,4]]},"893":{"position":[[268,4]]},"898":{"position":[[2732,4]]},"904":{"position":[[29,4]]},"917":{"position":[[452,4]]},"932":{"position":[[318,4]]},"981":{"position":[[501,5],[657,5],[1328,6]]},"1009":{"position":[[863,4]]},"1044":{"position":[[1,6],[163,4]]},"1057":{"position":[[293,4]]},"1066":{"position":[[536,5]]},"1083":{"position":[[34,4]]},"1085":{"position":[[2733,4]]},"1088":{"position":[[668,4]]},"1093":{"position":[[114,5]]},"1097":{"position":[[470,4]]},"1104":{"position":[[30,4]]},"1107":{"position":[[1005,4]]},"1120":{"position":[[687,5]]},"1123":{"position":[[707,5]]},"1124":{"position":[[843,5]]},"1126":{"position":[[75,4]]},"1132":{"position":[[1174,6]]},"1135":{"position":[[340,4]]},"1143":{"position":[[388,5]]},"1175":{"position":[[71,4]]},"1184":{"position":[[237,4]]},"1194":{"position":[[95,5]]},"1208":{"position":[[544,4]]},"1213":{"position":[[419,4]]},"1227":{"position":[[111,4]]},"1249":{"position":[[130,5]]},"1265":{"position":[[104,4]]},"1282":{"position":[[274,5]]},"1300":{"position":[[310,4]]},"1304":{"position":[[1252,4]]},"1313":{"position":[[397,4]]},"1318":{"position":[[82,5]]},"1320":{"position":[[63,4],[106,6],[512,4]]},"1321":{"position":[[583,4],[1075,5]]},"1324":{"position":[[775,4],[1019,4]]}},"keywords":{}}],["male",{"_index":4654,"title":{},"content":{"798":{"position":[[684,7]]},"1066":{"position":[[490,7]]}},"keywords":{}}],["malform",{"_index":2080,"title":{},"content":{"361":{"position":[[159,9]]},"749":{"position":[[3301,9]]}},"keywords":{}}],["malici",{"_index":1714,"title":{},"content":{"298":{"position":[[363,9]]},"1316":{"position":[[2006,9]]}},"keywords":{}}],["man",{"_index":682,"title":{},"content":{"43":{"position":[[573,3]]},"52":{"position":[[121,5],[433,4]]},"539":{"position":[[121,5],[433,4]]},"556":{"position":[[1870,3]]},"599":{"position":[[130,5],[460,4]]}},"keywords":{}}],["manag",{"_index":252,"title":{"96":{"position":[[33,11]]},"219":{"position":[[25,11]]}},"content":{"15":{"position":[[162,8],[180,10]]},"21":{"position":[[114,10]]},"47":{"position":[[1151,10]]},"57":{"position":[[239,6]]},"66":{"position":[[633,6]]},"79":{"position":[[82,10]]},"96":{"position":[[46,10],[99,10]]},"112":{"position":[[253,10]]},"114":{"position":[[533,11]]},"117":{"position":[[121,6]]},"120":{"position":[[251,8]]},"128":{"position":[[296,6]]},"145":{"position":[[135,8]]},"151":{"position":[[362,10]]},"152":{"position":[[191,8]]},"153":{"position":[[252,11]]},"161":{"position":[[362,8]]},"173":{"position":[[137,6],[3009,11],[3060,10],[3150,11],[3184,10]]},"175":{"position":[[546,11]]},"178":{"position":[[244,8]]},"189":{"position":[[255,10]]},"208":{"position":[[37,6]]},"212":{"position":[[496,7]]},"219":{"position":[[64,10],[161,6]]},"237":{"position":[[81,10]]},"261":{"position":[[872,7]]},"270":{"position":[[256,6]]},"271":{"position":[[58,10]]},"282":{"position":[[318,7]]},"284":{"position":[[100,11]]},"285":{"position":[[331,10]]},"286":{"position":[[426,10]]},"287":{"position":[[228,10]]},"289":{"position":[[92,6]]},"295":{"position":[[364,10]]},"298":{"position":[[113,10]]},"306":{"position":[[150,6]]},"320":{"position":[[357,6]]},"321":{"position":[[489,7]]},"365":{"position":[[1461,10]]},"366":{"position":[[421,8]]},"370":{"position":[[175,6]]},"371":{"position":[[280,10]]},"386":{"position":[[196,7]]},"397":{"position":[[275,8]]},"408":{"position":[[1677,6]]},"411":{"position":[[1415,7],[1859,10],[1978,10],[2684,10]]},"412":{"position":[[1109,6],[9628,6]]},"416":{"position":[[358,7]]},"417":{"position":[[322,6]]},"427":{"position":[[584,8]]},"429":{"position":[[540,6]]},"444":{"position":[[87,10]]},"446":{"position":[[153,8]]},"447":{"position":[[294,8]]},"450":{"position":[[130,11]]},"478":{"position":[[79,7]]},"489":{"position":[[623,7]]},"494":{"position":[[52,10]]},"501":{"position":[[42,11]]},"503":{"position":[[226,10]]},"513":{"position":[[89,8],[233,11]]},"514":{"position":[[353,6]]},"518":{"position":[[288,10]]},"520":{"position":[[346,10]]},"521":{"position":[[542,10]]},"523":{"position":[[73,10]]},"530":{"position":[[63,10]]},"535":{"position":[[885,8]]},"542":{"position":[[1019,6]]},"569":{"position":[[1390,7]]},"571":{"position":[[1761,6]]},"574":{"position":[[99,10],[519,8]]},"576":{"position":[[196,11]]},"585":{"position":[[172,11]]},"590":{"position":[[322,6],[484,6]]},"595":{"position":[[960,8]]},"618":{"position":[[433,10]]},"688":{"position":[[317,6]]},"698":{"position":[[2172,6]]},"709":{"position":[[474,6]]},"715":{"position":[[186,6]]},"737":{"position":[[125,8],[162,8]]},"785":{"position":[[221,6],[270,10]]},"836":{"position":[[2037,11],[2159,8]]},"860":{"position":[[124,11]]},"903":{"position":[[81,6]]},"992":{"position":[[87,6]]},"1132":{"position":[[1376,10]]},"1140":{"position":[[172,6]]},"1147":{"position":[[179,7]]},"1148":{"position":[[112,11],[318,10]]},"1206":{"position":[[103,6]]}},"keywords":{}}],["mango",{"_index":4807,"title":{},"content":{"841":{"position":[[345,5]]},"1065":{"position":[[117,5]]},"1071":{"position":[[48,5],[121,5],[149,5]]},"1249":{"position":[[416,5],[455,5]]},"1251":{"position":[[129,5]]},"1252":{"position":[[21,5]]}},"keywords":{}}],["manhattan",{"_index":2291,"title":{},"content":{"393":{"position":[[233,9]]}},"keywords":{}}],["mani",{"_index":201,"title":{},"content":{"14":{"position":[[101,4]]},"22":{"position":[[138,4]]},"24":{"position":[[180,4]]},"28":{"position":[[743,4]]},"29":{"position":[[50,4]]},"58":{"position":[[32,4]]},"66":{"position":[[67,4]]},"247":{"position":[[29,4]]},"295":{"position":[[257,4]]},"310":{"position":[[328,4]]},"320":{"position":[[164,4]]},"353":{"position":[[474,4]]},"354":{"position":[[289,4],[297,4],[934,4],[1161,4]]},"359":{"position":[[1,4]]},"362":{"position":[[149,4]]},"365":{"position":[[1024,4]]},"367":{"position":[[188,4]]},"375":{"position":[[564,4]]},"377":{"position":[[146,4]]},"392":{"position":[[3306,4]]},"396":{"position":[[1603,4]]},"397":{"position":[[296,4]]},"398":{"position":[[3070,4]]},"402":{"position":[[1733,4]]},"408":{"position":[[520,4],[4524,4]]},"411":{"position":[[2209,4],[3755,4],[4148,4]]},"412":{"position":[[1383,4],[6016,4],[9808,4],[11739,5],[12754,4]]},"419":{"position":[[1293,4]]},"420":{"position":[[571,4]]},"421":{"position":[[1154,4]]},"439":{"position":[[195,4]]},"450":{"position":[[629,4]]},"452":{"position":[[679,4]]},"454":{"position":[[479,4]]},"457":{"position":[[666,4]]},"458":{"position":[[232,4]]},"463":{"position":[[32,4]]},"464":{"position":[[75,4]]},"467":{"position":[[289,4]]},"468":{"position":[[702,4],[720,4]]},"475":{"position":[[1,4]]},"544":{"position":[[13,4]]},"604":{"position":[[13,4]]},"617":{"position":[[2158,4]]},"619":{"position":[[17,4],[186,4]]},"622":{"position":[[261,4]]},"623":{"position":[[161,4]]},"624":{"position":[[1102,4]]},"627":{"position":[[11,4]]},"632":{"position":[[804,4]]},"661":{"position":[[1377,4]]},"681":{"position":[[90,4]]},"698":{"position":[[388,4]]},"701":{"position":[[432,4]]},"702":{"position":[[468,4]]},"703":{"position":[[122,4],[985,4]]},"705":{"position":[[25,4]]},"710":{"position":[[64,4],[464,4]]},"711":{"position":[[1874,4]]},"737":{"position":[[248,4]]},"752":{"position":[[811,4]]},"779":{"position":[[1,5]]},"782":{"position":[[412,4]]},"785":{"position":[[52,4]]},"808":{"position":[[445,4]]},"838":{"position":[[3290,4]]},"839":{"position":[[685,4]]},"840":{"position":[[166,4]]},"846":{"position":[[1094,4]]},"872":{"position":[[2654,4]]},"932":{"position":[[220,4]]},"944":{"position":[[25,4]]},"945":{"position":[[25,4]]},"947":{"position":[[93,4]]},"948":{"position":[[14,4]]},"951":{"position":[[6,4]]},"962":{"position":[[339,4]]},"988":{"position":[[2933,4]]},"989":{"position":[[403,4]]},"1105":{"position":[[895,4]]},"1112":{"position":[[164,4],[514,4]]},"1119":{"position":[[124,4]]},"1124":{"position":[[1373,4],[2194,4]]},"1132":{"position":[[46,4]]},"1146":{"position":[[41,4]]},"1149":{"position":[[99,4]]},"1164":{"position":[[203,4]]},"1186":{"position":[[54,4],[184,4]]},"1194":{"position":[[65,4]]},"1198":{"position":[[391,4],[689,4],[899,4],[1472,4],[1883,4]]},"1203":{"position":[[13,4]]},"1297":{"position":[[524,4]]},"1301":{"position":[[1290,4]]},"1309":{"position":[[208,4]]},"1316":{"position":[[581,4],[626,4],[2635,4],[2738,4],[2854,4],[2873,4],[2938,4]]},"1321":{"position":[[1058,4]]}},"keywords":{}}],["manipul",{"_index":1604,"title":{},"content":{"265":{"position":[[446,13]]},"276":{"position":[[314,10]]},"320":{"position":[[38,13]]},"335":{"position":[[83,10]]},"352":{"position":[[26,10]]},"353":{"position":[[643,12]]},"407":{"position":[[176,10]]},"435":{"position":[[378,12]]},"501":{"position":[[219,12]]},"502":{"position":[[355,12]]},"515":{"position":[[323,13]]},"559":{"position":[[1361,10]]},"686":{"position":[[360,10]]},"805":{"position":[[100,11]]},"1132":{"position":[[648,12]]},"1206":{"position":[[383,14]]}},"keywords":{}}],["manipulation.lack",{"_index":2904,"title":{},"content":{"430":{"position":[[911,17]]}},"keywords":{}}],["manner",{"_index":558,"title":{},"content":{"35":{"position":[[355,7]]},"121":{"position":[[263,7]]},"134":{"position":[[346,7]]},"364":{"position":[[629,6]]},"395":{"position":[[335,7]]},"613":{"position":[[284,8]]}},"keywords":{}}],["manual",{"_index":858,"title":{"654":{"position":[[16,9]]}},"content":{"57":{"position":[[211,6]]},"103":{"position":[[154,6]]},"143":{"position":[[131,8],[319,8]]},"159":{"position":[[280,6]]},"185":{"position":[[345,6]]},"233":{"position":[[214,6]]},"301":{"position":[[152,8]]},"326":{"position":[[247,6]]},"346":{"position":[[209,8]]},"360":{"position":[[164,6]]},"379":{"position":[[166,6]]},"411":{"position":[[3047,6]]},"412":{"position":[[3567,6],[5144,9]]},"421":{"position":[[419,6]]},"461":{"position":[[596,9]]},"487":{"position":[[468,6]]},"490":{"position":[[283,8]]},"515":{"position":[[112,6]]},"518":{"position":[[326,8]]},"521":{"position":[[645,6]]},"542":{"position":[[1040,9]]},"559":{"position":[[1265,8]]},"566":{"position":[[240,6],[511,6],[1121,8],[1302,8]]},"570":{"position":[[620,6]]},"580":{"position":[[109,8]]},"585":{"position":[[256,6]]},"630":{"position":[[461,6]]},"632":{"position":[[380,6]]},"654":{"position":[[9,8],[90,8]]},"655":{"position":[[296,8]]},"690":{"position":[[418,6]]},"698":{"position":[[1458,8]]},"723":{"position":[[1299,6]]},"857":{"position":[[112,8]]},"861":{"position":[[799,8]]},"910":{"position":[[367,9]]},"943":{"position":[[212,8]]},"1067":{"position":[[1926,8],[2084,8]]},"1150":{"position":[[665,6]]},"1177":{"position":[[527,8]]},"1315":{"position":[[537,9]]},"1322":{"position":[[407,8]]}},"keywords":{}}],["map",{"_index":1614,"title":{"643":{"position":[[19,6]]},"787":{"position":[[23,7]]},"1179":{"position":[[7,6]]},"1182":{"position":[[17,6]]}},"content":{"266":{"position":[[753,6]]},"352":{"position":[[331,3]]},"392":{"position":[[3907,7]]},"408":{"position":[[4769,6]]},"419":{"position":[[1729,4]]},"430":{"position":[[1069,5]]},"469":{"position":[[884,6],[920,4]]},"643":{"position":[[135,6]]},"683":{"position":[[81,6]]},"714":{"position":[[1017,6]]},"774":{"position":[[122,6],[636,8]]},"789":{"position":[[112,6]]},"793":{"position":[[535,6]]},"820":{"position":[[480,6]]},"875":{"position":[[9332,3]]},"898":{"position":[[1854,4],[3541,3],[4221,6],[4388,3]]},"951":{"position":[[164,3],[209,6],[312,4],[454,3]]},"986":{"position":[[1575,3]]},"988":{"position":[[1946,4]]},"1006":{"position":[[119,3]]},"1022":{"position":[[392,7],[494,4],[632,7],[722,7]]},"1023":{"position":[[288,7],[373,7]]},"1084":{"position":[[109,3]]},"1090":{"position":[[404,6],[746,8],[1361,6]]},"1162":{"position":[[1114,6]]},"1181":{"position":[[368,6],[819,6]]},"1182":{"position":[[160,8],[372,6]]},"1183":{"position":[[19,6],[316,6],[548,6]]},"1184":{"position":[[98,6],[339,6],[526,8]]},"1185":{"position":[[34,6]]},"1186":{"position":[[28,6]]},"1192":{"position":[[282,6]]},"1195":{"position":[[259,7]]},"1239":{"position":[[127,6],[668,8]]},"1246":{"position":[[1228,7],[1248,6]]},"1292":{"position":[[541,6]]},"1324":{"position":[[182,7]]}},"keywords":{}}],["map(2",{"_index":5364,"title":{},"content":{"951":{"position":[[437,6]]}},"keywords":{}}],["map(doc",{"_index":1139,"title":{},"content":{"143":{"position":[[683,8]]}},"keywords":{}}],["map(result",{"_index":5780,"title":{},"content":{"1067":{"position":[[2179,10]]}},"keywords":{}}],["map/reduc",{"_index":4806,"title":{},"content":{"841":{"position":[[325,10]]}},"keywords":{}}],["mapreduc",{"_index":4781,"title":{},"content":{"837":{"position":[[1676,9],[1700,11]]}},"keywords":{}}],["march",{"_index":3621,"title":{},"content":{"613":{"position":[[643,6]]},"620":{"position":[[597,5]]}},"keywords":{}}],["mark",{"_index":2669,"title":{},"content":{"412":{"position":[[2110,7]]},"564":{"position":[[977,6]]},"617":{"position":[[1715,6]]},"638":{"position":[[831,4]]},"741":{"position":[[31,6]]},"742":{"position":[[50,6]]},"826":{"position":[[32,6],[222,6]]},"861":{"position":[[1938,4]]},"898":{"position":[[599,4]]},"986":{"position":[[572,4],[1470,4]]},"988":{"position":[[1733,5]]},"1208":{"position":[[1495,4]]},"1316":{"position":[[823,4]]}},"keywords":{}}],["markedli",{"_index":4668,"title":{},"content":{"802":{"position":[[89,8]]}},"keywords":{}}],["market",{"_index":2813,"title":{},"content":{"419":{"position":[[1618,9]]},"676":{"position":[[145,9]]},"699":{"position":[[313,9]]}},"keywords":{}}],["mass",{"_index":2591,"title":{},"content":{"410":{"position":[[733,4]]}},"keywords":{}}],["massag",{"_index":6335,"title":{},"content":{"1272":{"position":[[120,8]]}},"keywords":{}}],["massiv",{"_index":1848,"title":{},"content":{"303":{"position":[[1122,7]]},"304":{"position":[[479,7]]},"412":{"position":[[7584,7]]},"418":{"position":[[330,7]]},"902":{"position":[[331,7]]},"1006":{"position":[[190,8]]}},"keywords":{}}],["master",{"_index":380,"title":{},"content":{"23":{"position":[[98,6],[146,6],[247,6]]},"261":{"position":[[198,6]]},"875":{"position":[[4104,6]]},"903":{"position":[[344,6]]},"982":{"position":[[398,6],[433,6],[498,6],[534,6],[608,6],[628,6],[670,6]]},"983":{"position":[[474,7],[623,6],[772,6]]},"987":{"position":[[284,6],[381,6],[416,6],[473,6],[655,7],[817,6]]},"1164":{"position":[[1234,6]]},"1309":{"position":[[1030,6]]}},"keywords":{}}],["master.th",{"_index":5436,"title":{},"content":{"982":{"position":[[319,10]]}},"keywords":{}}],["master/serv",{"_index":5435,"title":{},"content":{"982":{"position":[[132,13],[186,14],[220,13]]},"987":{"position":[[187,13],[684,13]]}},"keywords":{}}],["match",{"_index":942,"title":{},"content":{"66":{"position":[[219,5]]},"287":{"position":[[251,5]]},"360":{"position":[[73,8]]},"390":{"position":[[345,7],[1243,7]]},"392":{"position":[[4979,5]]},"393":{"position":[[1128,5]]},"402":{"position":[[745,8]]},"559":{"position":[[1508,9]]},"681":{"position":[[668,8],[783,7],[853,6]]},"685":{"position":[[636,5]]},"723":{"position":[[262,9],[2258,9],[2395,9]]},"749":{"position":[[137,5],[2701,7],[12336,5],[13568,5],[16854,5],[22166,5]]},"796":{"position":[[728,8]]},"898":{"position":[[1697,5]]},"935":{"position":[[205,5]]},"1063":{"position":[[41,7]]},"1065":{"position":[[395,5],[1242,5]]},"1067":{"position":[[49,5],[910,5]]},"1084":{"position":[[319,5]]},"1085":{"position":[[3061,5],[3403,5]]},"1305":{"position":[[878,7]]},"1322":{"position":[[171,6]]}},"keywords":{}}],["matcher",{"_index":5777,"title":{},"content":{"1067":{"position":[[1903,8]]}},"keywords":{}}],["matchingamount",{"_index":5773,"title":{},"content":{"1067":{"position":[[438,14]]}},"keywords":{}}],["matdialog",{"_index":1096,"title":{},"content":{"130":{"position":[[428,9]]}},"keywords":{}}],["materi",{"_index":2814,"title":{},"content":{"419":{"position":[[1628,10]]}},"keywords":{}}],["math.max(input.newdocumentstate.scor",{"_index":3917,"title":{},"content":{"691":{"position":[[434,38]]}},"keywords":{}}],["mathemat",{"_index":2682,"title":{},"content":{"412":{"position":[[3725,14]]}},"keywords":{}}],["matter",{"_index":2089,"title":{"550":{"position":[[18,8]]}},"content":{"362":{"position":[[249,6]]},"412":{"position":[[4091,6]]},"418":{"position":[[102,7]]},"498":{"position":[[642,6]]},"617":{"position":[[2147,6]]},"654":{"position":[[371,6]]},"737":{"position":[[237,6]]},"981":{"position":[[715,6]]},"1044":{"position":[[195,6]]},"1107":{"position":[[291,7]]},"1124":{"position":[[1153,6]]},"1301":{"position":[[1279,6]]},"1316":{"position":[[159,6]]},"1321":{"position":[[1047,6]]}},"keywords":{}}],["matur",{"_index":620,"title":{},"content":{"39":{"position":[[270,6]]},"837":{"position":[[234,7]]}},"keywords":{}}],["max",{"_index":1466,"title":{"297":{"position":[[10,3]]},"304":{"position":[[10,3]]}},"content":{"243":{"position":[[622,3],[723,3],[764,3],[822,3],[919,3]]},"301":{"position":[[404,3]]},"306":{"position":[[331,3]]},"461":{"position":[[1434,3]]},"773":{"position":[[795,3],[871,3]]},"849":{"position":[[569,3]]},"863":{"position":[[159,3]]}},"keywords":{}}],["maxag",{"_index":6426,"title":{},"content":{"1294":{"position":[[771,6],[1382,6]]}},"keywords":{}}],["maxim",{"_index":1044,"title":{},"content":{"107":{"position":[[142,9]]}},"keywords":{}}],["maximum",{"_index":1712,"title":{},"content":{"298":{"position":[[284,7],[691,7]]},"461":{"position":[[990,7]]},"680":{"position":[[937,8]]},"681":{"position":[[281,7]]},"696":{"position":[[1193,7]]},"749":{"position":[[20630,7],[21321,7]]},"1074":{"position":[[594,7]]},"1079":{"position":[[356,7]]},"1080":{"position":[[543,7],[578,8]]},"1186":{"position":[[169,7]]},"1321":{"position":[[1092,7]]}},"keywords":{}}],["maxlenght",{"_index":1382,"title":{},"content":{"211":{"position":[[469,10]]}},"keywords":{}}],["maxlength",{"_index":774,"title":{},"content":{"51":{"position":[[425,10]]},"188":{"position":[[1302,10],[1344,10],[1387,10]]},"209":{"position":[[507,10]]},"255":{"position":[[851,10]]},"259":{"position":[[151,10]]},"367":{"position":[[846,10],[900,9],[937,10]]},"392":{"position":[[653,10],[1619,10]]},"397":{"position":[[504,10]]},"538":{"position":[[726,10]]},"554":{"position":[[1408,10]]},"598":{"position":[[733,10]]},"632":{"position":[[1601,10]]},"638":{"position":[[685,10]]},"639":{"position":[[463,10]]},"662":{"position":[[2464,10]]},"680":{"position":[[893,10]]},"717":{"position":[[1502,10]]},"734":{"position":[[767,10],[821,9]]},"749":{"position":[[20194,9],[20885,9],[21333,9],[21533,9],[21588,9]]},"838":{"position":[[2678,10]]},"862":{"position":[[733,10]]},"872":{"position":[[1958,10],[4188,10]]},"898":{"position":[[2538,10]]},"904":{"position":[[940,10]]},"1074":{"position":[[1038,9]]},"1078":{"position":[[546,10],[600,9]]},"1079":{"position":[[284,9]]},"1080":{"position":[[169,10],[223,9],[265,10],[344,10]]},"1082":{"position":[[254,10],[308,9]]},"1083":{"position":[[454,10],[508,9]]},"1149":{"position":[[1131,10]]},"1296":{"position":[[1283,9]]}},"keywords":{}}],["mayb",{"_index":2702,"title":{},"content":{"412":{"position":[[5786,5],[10113,5]]},"1124":{"position":[[1674,5]]}},"keywords":{}}],["mb",{"_index":1723,"title":{},"content":{"298":{"position":[[631,2],[650,2]]},"299":{"position":[[445,2],[505,2],[1293,2],[1321,2]]},"461":{"position":[[715,2],[724,2],[811,2],[836,2],[861,2]]},"1157":{"position":[[164,2]]}},"keywords":{}}],["mb)xenova/al",{"_index":2446,"title":{},"content":{"401":{"position":[[191,14]]}},"keywords":{}}],["mdn",{"_index":3445,"title":{},"content":{"567":{"position":[[893,4]]},"1208":{"position":[[1995,4]]}},"keywords":{}}],["mean",{"_index":9,"title":{},"content":{"1":{"position":[[111,5]]},"14":{"position":[[382,5]]},"28":{"position":[[397,5]]},"37":{"position":[[367,4]]},"40":{"position":[[516,5]]},"50":{"position":[[58,7]]},"65":{"position":[[232,5]]},"123":{"position":[[87,5]]},"125":{"position":[[68,5]]},"201":{"position":[[217,5]]},"273":{"position":[[87,5]]},"291":{"position":[[104,5]]},"294":{"position":[[91,5]]},"312":{"position":[[276,7]]},"327":{"position":[[83,5]]},"351":{"position":[[227,5]]},"354":{"position":[[1034,4]]},"390":{"position":[[458,7]]},"392":{"position":[[3099,7]]},"398":{"position":[[233,7]]},"402":{"position":[[1218,5],[1326,5],[1540,5],[1870,5]]},"408":{"position":[[3617,5]]},"410":{"position":[[50,5]]},"411":{"position":[[4252,5]]},"412":{"position":[[5864,5],[8151,5],[11308,5],[12938,5]]},"427":{"position":[[228,5]]},"450":{"position":[[417,5]]},"451":{"position":[[560,5]]},"455":{"position":[[583,5]]},"534":{"position":[[328,5]]},"569":{"position":[[1079,4],[1125,4]]},"570":{"position":[[110,4],[274,5],[424,5]]},"594":{"position":[[326,5]]},"696":{"position":[[31,5]]},"703":{"position":[[1469,5]]},"714":{"position":[[69,5],[330,5],[553,5]]},"723":{"position":[[483,5],[1580,7]]},"728":{"position":[[52,5]]},"751":{"position":[[558,6],[969,6],[1660,6]]},"764":{"position":[[123,5]]},"778":{"position":[[146,5]]},"781":{"position":[[329,5]]},"801":{"position":[[437,5]]},"836":{"position":[[1445,5]]},"838":{"position":[[92,5]]},"890":{"position":[[476,6]]},"948":{"position":[[127,5]]},"968":{"position":[[680,5]]},"986":{"position":[[132,5]]},"1030":{"position":[[148,5]]},"1033":{"position":[[175,5]]},"1052":{"position":[[443,5]]},"1069":{"position":[[180,6]]},"1074":{"position":[[161,5],[441,5]]},"1085":{"position":[[785,5],[2489,5],[2908,5]]},"1150":{"position":[[486,5]]},"1192":{"position":[[61,5],[155,5]]},"1304":{"position":[[37,4]]},"1320":{"position":[[146,5]]}},"keywords":{}}],["meaningless",{"_index":6564,"title":{},"content":{"1316":{"position":[[3803,11]]}},"keywords":{}}],["meant",{"_index":570,"title":{},"content":{"36":{"position":[[148,5]]},"699":{"position":[[302,5]]}},"keywords":{}}],["meantim",{"_index":3771,"title":{},"content":{"656":{"position":[[188,9]]},"875":{"position":[[8701,9]]}},"keywords":{}}],["meanwhil",{"_index":5564,"title":{},"content":{"1007":{"position":[[1036,10]]}},"keywords":{}}],["measur",{"_index":1981,"title":{"1194":{"position":[[0,13]]}},"content":{"346":{"position":[[833,7]]},"360":{"position":[[839,7]]},"377":{"position":[[275,8]]},"393":{"position":[[147,7]]},"463":{"position":[[557,12]]},"465":{"position":[[46,7]]},"798":{"position":[[169,7]]},"821":{"position":[[980,12]]},"1138":{"position":[[571,13]]},"1191":{"position":[[568,12]]},"1193":{"position":[[48,12],[222,12]]},"1194":{"position":[[32,9],[198,7],[1017,7]]},"1297":{"position":[[510,8]]}},"keywords":{}}],["mechan",{"_index":550,"title":{"208":{"position":[[19,9]]}},"content":{"35":{"position":[[144,10]]},"59":{"position":[[105,9]]},"99":{"position":[[45,10],[320,11]]},"110":{"position":[[106,10]]},"124":{"position":[[33,9]]},"129":{"position":[[192,10],[302,9]]},"134":{"position":[[137,10]]},"146":{"position":[[23,10]]},"168":{"position":[[47,11]]},"173":{"position":[[725,9]]},"192":{"position":[[255,11]]},"216":{"position":[[52,11]]},"223":{"position":[[175,10]]},"240":{"position":[[170,10]]},"283":{"position":[[369,9]]},"369":{"position":[[920,10]]},"386":{"position":[[166,9]]},"410":{"position":[[2077,10]]},"436":{"position":[[124,9]]},"487":{"position":[[355,9]]},"500":{"position":[[621,11]]},"510":{"position":[[302,11]]},"517":{"position":[[163,10]]},"525":{"position":[[244,9]]},"527":{"position":[[90,10]]},"632":{"position":[[138,10]]},"656":{"position":[[385,10]]}},"keywords":{}}],["mechanism.webtransport",{"_index":3673,"title":{},"content":{"623":{"position":[[594,23]]}},"keywords":{}}],["media",{"_index":2946,"title":{},"content":{"446":{"position":[[944,5]]}},"keywords":{}}],["medium",{"_index":3443,"title":{},"content":{"566":{"position":[[748,6]]},"780":{"position":[[402,7]]}},"keywords":{}}],["meet",{"_index":1622,"title":{},"content":{"267":{"position":[[1645,5]]},"295":{"position":[[321,4]]},"378":{"position":[[74,4]]},"567":{"position":[[709,7],[1110,4]]}},"keywords":{}}],["megabyt",{"_index":1413,"title":{},"content":{"228":{"position":[[423,8],[455,8]]},"408":{"position":[[899,9]]},"524":{"position":[[836,8]]},"696":{"position":[[1155,9]]}},"keywords":{}}],["membas",{"_index":412,"title":{},"content":{"25":{"position":[[32,8]]}},"keywords":{}}],["memdown",{"_index":39,"title":{"2":{"position":[[0,8]]}},"content":{"2":{"position":[[80,7],[113,7],[286,7]]}},"keywords":{}}],["memori",{"_index":2,"title":{"1":{"position":[[0,7]]},"264":{"position":[[11,6]]},"643":{"position":[[12,6]]},"706":{"position":[[78,6]]},"773":{"position":[[19,6]]},"774":{"position":[[10,6]]},"1090":{"position":[[10,6]]},"1145":{"position":[[55,6]]},"1160":{"position":[[0,6]]},"1165":{"position":[[35,6]]},"1166":{"position":[[0,6]]},"1179":{"position":[[0,6]]},"1182":{"position":[[10,6]]},"1241":{"position":[[0,7]]},"1299":{"position":[[3,6]]},"1300":{"position":[[3,7]]},"1301":{"position":[[3,7]]}},"content":{"1":{"position":[[37,6],[98,7],[448,6],[502,10]]},"16":{"position":[[86,7]]},"17":{"position":[[418,6]]},"28":{"position":[[39,6],[93,7]]},"30":{"position":[[100,6]]},"32":{"position":[[38,6]]},"42":{"position":[[34,6]]},"131":{"position":[[788,6]]},"161":{"position":[[119,6]]},"162":{"position":[[621,6]]},"189":{"position":[[147,6],[243,6],[502,6],[534,7]]},"265":{"position":[[50,6],[102,6],[177,7],[735,6]]},"266":{"position":[[25,6],[288,6],[453,6],[638,8],[746,6],[844,6],[909,6]]},"267":{"position":[[163,6],[1153,6],[1313,6]]},"287":{"position":[[899,6],[986,7]]},"304":{"position":[[210,6],[295,6],[490,6]]},"311":{"position":[[75,7]]},"336":{"position":[[364,7]]},"346":{"position":[[451,6]]},"358":{"position":[[535,7],[724,6],[781,7]]},"365":{"position":[[146,6],[250,7],[432,6],[481,6]]},"368":{"position":[[181,7]]},"376":{"position":[[275,6]]},"408":{"position":[[4762,6]]},"411":{"position":[[2217,6]]},"412":{"position":[[9283,6],[14458,7]]},"430":{"position":[[512,6],[1037,6]]},"450":{"position":[[746,6]]},"458":{"position":[[374,6]]},"463":{"position":[[733,8],[1413,9]]},"464":{"position":[[383,8]]},"465":{"position":[[244,8]]},"466":{"position":[[207,8]]},"467":{"position":[[182,8],[500,6]]},"469":{"position":[[877,6],[942,7]]},"504":{"position":[[380,7]]},"524":{"position":[[523,7]]},"528":{"position":[[113,6]]},"554":{"position":[[329,6],[637,6],[796,8]]},"581":{"position":[[368,7]]},"640":{"position":[[385,6]]},"643":{"position":[[128,6]]},"666":{"position":[[352,6]]},"693":{"position":[[843,9],[1147,9]]},"709":{"position":[[1403,6]]},"710":{"position":[[514,6],[577,6]]},"714":{"position":[[1010,6],[1095,6]]},"723":{"position":[[100,6],[2046,7]]},"724":{"position":[[1212,6]]},"772":{"position":[[2019,6]]},"773":{"position":[[61,6],[131,6],[323,6],[534,8],[662,6],[844,6]]},"774":{"position":[[46,6],[115,6],[190,6],[245,6],[629,6],[981,6],[1066,6]]},"793":{"position":[[255,6],[528,6]]},"800":{"position":[[399,6]]},"815":{"position":[[33,7]]},"838":{"position":[[1218,6],[1281,6],[1622,6]]},"872":{"position":[[1449,6],[1651,8]]},"898":{"position":[[2139,6]]},"955":{"position":[[82,6]]},"976":{"position":[[58,6]]},"1072":{"position":[[174,7]]},"1085":{"position":[[3517,6]]},"1090":{"position":[[71,6],[270,6],[343,6],[397,6],[502,8],[739,6],[1169,6],[1354,6]]},"1120":{"position":[[231,6],[674,6]]},"1124":{"position":[[1691,6]]},"1137":{"position":[[78,6]]},"1161":{"position":[[77,6]]},"1162":{"position":[[178,6],[339,6],[431,6],[574,7],[724,6],[861,6],[958,6],[1017,6],[1107,6]]},"1163":{"position":[[153,6],[365,6]]},"1164":{"position":[[462,6],[650,6],[927,6],[1038,6]]},"1165":{"position":[[5,6],[630,6],[944,6]]},"1168":{"position":[[115,8]]},"1174":{"position":[[180,6]]},"1180":{"position":[[77,6],[399,6]]},"1181":{"position":[[73,6],[244,6],[361,6],[426,6],[518,6],[662,7],[812,6]]},"1182":{"position":[[153,6],[365,6]]},"1183":{"position":[[12,6],[309,6],[541,6]]},"1184":{"position":[[91,6],[223,6],[332,6],[519,6]]},"1185":{"position":[[27,6],[114,6]]},"1186":{"position":[[21,6]]},"1192":{"position":[[275,6],[307,6],[453,6],[594,6]]},"1195":{"position":[[252,6]]},"1219":{"position":[[320,8]]},"1239":{"position":[[120,6],[169,7],[350,7],[661,6]]},"1241":{"position":[[56,6]]},"1244":{"position":[[110,6]]},"1246":{"position":[[1221,6],[1241,6],[1332,6],[1397,6]]},"1271":{"position":[[494,7]]},"1292":{"position":[[396,6],[433,6],[534,6],[578,6],[627,6]]},"1299":{"position":[[153,6],[222,6],[300,6]]},"1300":{"position":[[255,6]]},"1301":{"position":[[184,6]]},"1321":{"position":[[1,6],[443,7],[565,7],[773,7],[1026,6]]}},"keywords":{}}],["memory)no",{"_index":6416,"title":{},"content":{"1292":{"position":[[935,10]]}},"keywords":{}}],["memory.it",{"_index":6126,"title":{},"content":{"1170":{"position":[[57,9]]}},"keywords":{}}],["memory.slow",{"_index":6128,"title":{},"content":{"1171":{"position":[[195,11]]}},"keywords":{}}],["memory.watermelondb",{"_index":6578,"title":{},"content":{"1324":{"position":[[489,19]]}},"keywords":{}}],["memorydatabas",{"_index":6123,"title":{},"content":{"1165":{"position":[[1044,14]]}},"keywords":{}}],["memorydatabase.addcollect",{"_index":6124,"title":{},"content":{"1165":{"position":[[1145,32]]}},"keywords":{}}],["memorysyncedstorag",{"_index":6117,"title":{},"content":{"1165":{"position":[[341,19],[1115,19]]}},"keywords":{}}],["mention",{"_index":209,"title":{},"content":{"14":{"position":[[329,9]]},"164":{"position":[[4,9]]},"1316":{"position":[[2653,9]]}},"keywords":{}}],["meow",{"_index":4611,"title":{},"content":{"792":{"position":[[376,5]]},"932":{"position":[[180,6]]}},"keywords":{}}],["merg",{"_index":1310,"title":{"691":{"position":[[9,7]]}},"content":{"203":{"position":[[226,5]]},"250":{"position":[[241,7],[321,6]]},"339":{"position":[[163,7]]},"356":{"position":[[613,6]]},"411":{"position":[[1435,6],[3441,6]]},"412":{"position":[[2335,5],[2385,5],[3064,5],[3492,5],[3574,5],[3740,5],[4081,6],[4402,5],[5375,5]]},"495":{"position":[[209,7]]},"496":{"position":[[207,7],[277,5]]},"565":{"position":[[197,5]]},"590":{"position":[[866,5]]},"632":{"position":[[502,6],[2710,6]]},"635":{"position":[[174,5],[353,7]]},"668":{"position":[[297,6]]},"687":{"position":[[181,5]]},"688":{"position":[[41,5],[852,5]]},"689":{"position":[[48,8],[197,5],[342,6]]},"690":{"position":[[75,5],[224,7],[302,6],[546,8]]},"691":{"position":[[170,5],[587,6]]},"982":{"position":[[116,6]]},"1119":{"position":[[211,5]]},"1133":{"position":[[633,7]]},"1186":{"position":[[48,5]]},"1252":{"position":[[327,7]]},"1309":{"position":[[1107,5]]}},"keywords":{}}],["mergefieldshandl",{"_index":3911,"title":{},"content":{"691":{"position":[[216,18]]}},"keywords":{}}],["mergemap(async",{"_index":5509,"title":{},"content":{"995":{"position":[[1627,16]]}},"keywords":{}}],["merit",{"_index":1240,"title":{},"content":{"186":{"position":[[162,7]]}},"keywords":{}}],["messag",{"_index":1617,"title":{"748":{"position":[[11,8]]},"749":{"position":[[15,9]]},"1220":{"position":[[15,9]]}},"content":{"267":{"position":[[142,10],[298,9],[344,8]]},"316":{"position":[[304,8]]},"379":{"position":[[259,8]]},"392":{"position":[[3356,8]]},"408":{"position":[[4482,9]]},"414":{"position":[[39,8],[94,8],[183,8]]},"415":{"position":[[156,8]]},"416":{"position":[[135,8],[170,8]]},"446":{"position":[[511,9]]},"458":{"position":[[1110,8],[1547,8]]},"564":{"position":[[1092,9]]},"610":{"position":[[71,9]]},"611":{"position":[[763,7]]},"612":{"position":[[847,8],[966,7],[1229,7],[1297,8],[1523,7],[2038,7],[2252,7],[2297,8]]},"617":{"position":[[116,9]]},"620":{"position":[[332,8]]},"621":{"position":[[295,8]]},"622":{"position":[[249,8]]},"639":{"position":[[481,8]]},"675":{"position":[[62,7]]},"696":{"position":[[421,8],[473,8]]},"711":{"position":[[1438,7]]},"737":{"position":[[356,9]]},"751":{"position":[[493,9],[797,9],[1241,7],[1595,9]]},"752":{"position":[[398,9]]},"865":{"position":[[89,7]]},"968":{"position":[[594,7]]},"1013":{"position":[[491,9]]},"1151":{"position":[[75,7],[149,7],[532,8]]},"1178":{"position":[[75,7],[148,7],[531,8]]},"1207":{"position":[[831,7]]},"1218":{"position":[[40,7],[149,9],[476,10],[824,10]]},"1220":{"position":[[52,8]]},"1228":{"position":[[245,9]]},"1246":{"position":[[766,7]]}},"keywords":{}}],["messagechannelcr",{"_index":6244,"title":{},"content":{"1218":{"position":[[83,21],[426,22]]}},"keywords":{}}],["messagecol",{"_index":4459,"title":{},"content":{"752":{"position":[[351,10]]}},"keywords":{}}],["messagecol.getmigrationst",{"_index":4464,"title":{},"content":{"752":{"position":[[865,31]]}},"keywords":{}}],["messagecol.migratepromise(10",{"_index":4472,"title":{},"content":{"752":{"position":[[1423,30]]}},"keywords":{}}],["messagecol.migrationneed",{"_index":4460,"title":{},"content":{"752":{"position":[[665,29]]}},"keywords":{}}],["messagecol.startmigration(10",{"_index":4462,"title":{},"content":{"752":{"position":[[751,30]]}},"keywords":{}}],["messageoruncaught",{"_index":6238,"title":{},"content":{"1213":{"position":[[841,17]]}},"keywords":{}}],["messageschema",{"_index":5597,"title":{},"content":{"1013":{"position":[[511,14]]}},"keywords":{}}],["messageschemav1",{"_index":4443,"title":{},"content":{"751":{"position":[[513,16],[817,16],[1615,16]]},"752":{"position":[[418,16]]}},"keywords":{}}],["met",{"_index":6550,"title":{},"content":{"1316":{"position":[[1313,4]]}},"keywords":{}}],["meta",{"_index":2900,"title":{"1153":{"position":[[23,4]]}},"content":{"429":{"position":[[522,4]]},"469":{"position":[[635,4]]},"719":{"position":[[324,4],[408,4]]},"746":{"position":[[591,4]]},"793":{"position":[[580,4]]},"1004":{"position":[[346,4]]},"1051":{"position":[[359,4]]},"1072":{"position":[[2144,4],[2399,4]]},"1079":{"position":[[263,4]]},"1154":{"position":[[5,4],[295,4]]},"1238":{"position":[[395,4],[772,4]]},"1239":{"position":[[573,4]]},"1246":{"position":[[1608,4],[1652,4]]}},"keywords":{}}],["metadata",{"_index":3092,"title":{},"content":{"469":{"position":[[671,8]]},"495":{"position":[[591,8]]},"724":{"position":[[585,8]]},"999":{"position":[[41,8],[197,9]]},"1005":{"position":[[224,8]]},"1028":{"position":[[58,8]]},"1188":{"position":[[257,9]]},"1246":{"position":[[1875,8]]}},"keywords":{}}],["metastorageinst",{"_index":4120,"title":{},"content":{"746":{"position":[[639,21]]}},"keywords":{}}],["meteor",{"_index":244,"title":{"15":{"position":[[0,7]]}},"content":{"15":{"position":[[3,6],[95,6],[347,6],[499,6]]}},"keywords":{}}],["meteorjss",{"_index":270,"title":{},"content":{"16":{"position":[[25,10]]}},"keywords":{}}],["method",{"_index":901,"title":{"396":{"position":[[16,8]]},"400":{"position":[[25,8]]},"425":{"position":[[24,8]]},"790":{"position":[[9,8]]},"791":{"position":[[13,7]]},"792":{"position":[[11,8]]},"810":{"position":[[4,7]]},"969":{"position":[[0,8]]},"1025":{"position":[[11,8]]},"1044":{"position":[[39,8]]}},"content":{"65":{"position":[[29,7]]},"145":{"position":[[243,7]]},"188":{"position":[[880,7]]},"209":{"position":[[847,7]]},"255":{"position":[[1193,7]]},"288":{"position":[[235,7]]},"289":{"position":[[1797,6]]},"300":{"position":[[510,6]]},"303":{"position":[[1380,6]]},"393":{"position":[[122,7],[357,8],[409,6],[654,6],[746,6]]},"394":{"position":[[1368,6]]},"396":{"position":[[9,7],[1752,6]]},"397":{"position":[[1426,7]]},"398":{"position":[[152,6],[455,8],[2912,7],[3188,6],[3287,6]]},"400":{"position":[[7,6],[161,6],[481,6]]},"418":{"position":[[677,6]]},"425":{"position":[[132,7]]},"434":{"position":[[25,6]]},"440":{"position":[[108,8]]},"450":{"position":[[546,8]]},"451":{"position":[[186,7]]},"452":{"position":[[536,6]]},"453":{"position":[[413,7]]},"460":{"position":[[1160,6]]},"462":{"position":[[54,7]]},"468":{"position":[[376,6]]},"481":{"position":[[284,8]]},"496":{"position":[[48,7]]},"610":{"position":[[81,6],[632,6]]},"617":{"position":[[126,8]]},"618":{"position":[[592,6]]},"626":{"position":[[1082,6]]},"682":{"position":[[269,6]]},"690":{"position":[[464,7]]},"711":{"position":[[2049,6]]},"749":{"position":[[4243,6],[8153,6],[8245,6],[8359,6],[8552,6]]},"775":{"position":[[223,8]]},"790":{"position":[[10,7]]},"791":{"position":[[78,8],[337,8]]},"792":{"position":[[12,7]]},"806":{"position":[[248,7]]},"810":{"position":[[60,7]]},"846":{"position":[[442,6],[1508,6]]},"848":{"position":[[142,6],[963,6],[1076,6]]},"851":{"position":[[384,7]]},"852":{"position":[[43,7],[76,6]]},"854":{"position":[[1713,7]]},"866":{"position":[[131,6]]},"875":{"position":[[6273,7],[7152,6]]},"886":{"position":[[5025,6]]},"890":{"position":[[218,8]]},"904":{"position":[[1710,6]]},"910":{"position":[[76,7]]},"934":{"position":[[96,7],[372,8]]},"937":{"position":[[30,7]]},"943":{"position":[[25,6]]},"949":{"position":[[48,7]]},"950":{"position":[[194,7]]},"958":{"position":[[229,6]]},"983":{"position":[[141,7],[400,6]]},"988":{"position":[[2568,7]]},"1044":{"position":[[257,8]]},"1052":{"position":[[288,7],[351,6],[381,6]]},"1059":{"position":[[82,7]]},"1064":{"position":[[22,8],[282,7]]},"1072":{"position":[[1061,8],[2766,6]]},"1085":{"position":[[1959,7],[2110,8],[2199,7],[2314,6]]},"1088":{"position":[[292,6]]},"1100":{"position":[[378,6]]},"1101":{"position":[[295,7]]},"1102":{"position":[[35,7],[541,7]]},"1114":{"position":[[292,6]]},"1116":{"position":[[243,6]]},"1117":{"position":[[211,6]]},"1148":{"position":[[858,6]]},"1164":{"position":[[1188,6]]},"1189":{"position":[[153,6]]},"1207":{"position":[[276,7],[474,6],[522,7]]},"1208":{"position":[[428,7]]},"1211":{"position":[[28,6]]},"1214":{"position":[[687,7]]},"1220":{"position":[[447,7]]},"1278":{"position":[[236,7]]},"1282":{"position":[[454,7]]},"1289":{"position":[[31,7]]},"1294":{"position":[[25,7],[113,7]]},"1295":{"position":[[1465,6]]},"1298":{"position":[[184,6]]},"1311":{"position":[[1026,8],[1647,6],[1695,6]]}},"keywords":{}}],["methodolog",{"_index":3253,"title":{},"content":{"516":{"position":[[29,12]]}},"keywords":{}}],["metric",{"_index":3661,"title":{},"content":{"620":{"position":[[711,6]]},"783":{"position":[[156,6]]},"1152":{"position":[[128,8]]},"1194":{"position":[[20,7]]}},"keywords":{}}],["mg1",{"_index":4433,"title":{},"content":{"749":{"position":[[23779,3]]}},"keywords":{}}],["mib",{"_index":2895,"title":{},"content":{"427":{"position":[[1522,3]]}},"keywords":{}}],["microsecond",{"_index":3456,"title":{},"content":{"569":{"position":[[605,13]]},"571":{"position":[[1509,13]]}},"keywords":{}}],["microservic",{"_index":4585,"title":{"775":{"position":[[23,13]]},"1094":{"position":[[24,14]]}},"content":{"775":{"position":[[456,12],[589,13]]},"1094":{"position":[[37,12],[72,13],[185,13],[262,13],[517,13],[582,13]]},"1219":{"position":[[147,12]]}},"keywords":{}}],["microsoft",{"_index":522,"title":{},"content":{"33":{"position":[[491,9]]},"616":{"position":[[1151,9]]}},"keywords":{}}],["mid",{"_index":2073,"title":{},"content":{"358":{"position":[[1059,3]]},"841":{"position":[[945,3]]}},"keywords":{}}],["middl",{"_index":3379,"title":{},"content":{"556":{"position":[[1881,6]]}},"keywords":{}}],["middlewar",{"_index":4512,"title":{"762":{"position":[[0,10]]}},"content":{"765":{"position":[[1,10]]},"793":{"position":[[1128,10]]},"829":{"position":[[826,10]]}},"keywords":{}}],["midnight",{"_index":2752,"title":{},"content":{"412":{"position":[[11996,8]]},"702":{"position":[[328,9]]}},"keywords":{}}],["migrat",{"_index":435,"title":{"282":{"position":[[14,9]]},"367":{"position":[[27,9]]},"403":{"position":[[0,9]]},"636":{"position":[[7,11]]},"664":{"position":[[5,9]]},"702":{"position":[[12,7]]},"750":{"position":[[0,7]]},"754":{"position":[[0,9]]},"755":{"position":[[0,9]]},"756":{"position":[[0,9]]},"757":{"position":[[0,9]]},"758":{"position":[[8,9]]},"760":{"position":[[0,7]]},"938":{"position":[[0,10]]},"1165":{"position":[[16,9]]},"1319":{"position":[[0,9]]}},"content":{"26":{"position":[[392,8]]},"57":{"position":[[155,9],[225,10],[310,10]]},"110":{"position":[[134,10]]},"174":{"position":[[2193,9]]},"282":{"position":[[434,9]]},"351":{"position":[[84,10],[356,9]]},"367":{"position":[[178,9],[241,10],[306,9]]},"382":{"position":[[299,9]]},"403":{"position":[[121,7],[207,9],[357,9],[651,9]]},"412":{"position":[[11016,11],[11138,9],[11332,9],[11699,9],[11763,9],[11845,9],[11966,9]]},"544":{"position":[[184,10],[248,11]]},"604":{"position":[[156,10],[220,11]]},"636":{"position":[[110,10],[287,9]]},"664":{"position":[[5,9]]},"686":{"position":[[935,10]]},"702":{"position":[[206,7],[563,7],[627,9],[711,7],[769,7]]},"719":{"position":[[232,9],[252,7]]},"749":{"position":[[12192,9],[12202,9],[12283,9],[12410,9],[12491,9],[12628,7]]},"751":{"position":[[454,9],[1556,9]]},"752":{"position":[[17,9],[139,9],[265,9],[298,9],[464,9],[624,9],[741,9],[1227,8]]},"753":{"position":[[67,9],[205,10],[390,10]]},"754":{"position":[[120,10],[510,10]]},"755":{"position":[[114,9]]},"756":{"position":[[50,9],[125,7],[184,9],[300,9],[398,9]]},"757":{"position":[[188,9],[277,9]]},"759":{"position":[[22,7],[552,9],[805,7],[868,7],[973,10],[1122,9],[1447,7]]},"760":{"position":[[4,7],[212,9],[548,9],[861,10]]},"761":{"position":[[201,10]]},"793":{"position":[[1003,9],[1021,9]]},"836":{"position":[[2097,9],[2174,10]]},"839":{"position":[[880,9]]},"841":{"position":[[1147,10],[1261,9]]},"879":{"position":[[53,10]]},"938":{"position":[[77,9],[141,10]]},"977":{"position":[[252,7]]},"1100":{"position":[[976,9]]},"1124":{"position":[[418,7]]},"1162":{"position":[[786,10]]},"1165":{"position":[[67,10],[570,10],[665,9]]},"1198":{"position":[[2097,7]]},"1222":{"position":[[516,10]]},"1260":{"position":[[1,9]]},"1319":{"position":[[96,7],[426,9],[550,7],[591,9],[730,9]]}},"keywords":{}}],["migrated.ani",{"_index":4497,"title":{},"content":{"759":{"position":[[1294,12]]}},"keywords":{}}],["migratepromis",{"_index":4470,"title":{},"content":{"752":{"position":[[1378,18],[1460,15]]}},"keywords":{}}],["migratestorag",{"_index":4486,"title":{},"content":{"759":{"position":[[96,14],[462,16],[1084,16],[1548,17]]},"760":{"position":[[272,14],[458,16]]}},"keywords":{}}],["migrationencrypt",{"_index":3327,"title":{},"content":{"544":{"position":[[270,20]]}},"keywords":{}}],["migrationpromis",{"_index":4471,"title":{},"content":{"752":{"position":[[1404,16]]}},"keywords":{}}],["migrationst",{"_index":4463,"title":{"753":{"position":[[0,18]]}},"content":{"752":{"position":[[848,14]]},"755":{"position":[[150,16]]}},"keywords":{}}],["migrationstate.$.subscrib",{"_index":4465,"title":{},"content":{"752":{"position":[[923,28]]}},"keywords":{}}],["migrationstate.collection.nam",{"_index":4479,"title":{},"content":{"753":{"position":[[414,30]]}},"keywords":{}}],["migrationstrategi",{"_index":2496,"title":{},"content":{"403":{"position":[[782,20]]},"749":{"position":[[7851,19],[7948,17],[8046,17]]},"751":{"position":[[52,19],[170,19],[256,17],[530,20],[834,20],[1632,20]]},"752":{"position":[[195,19],[499,20]]},"754":{"position":[[235,19]]},"934":{"position":[[563,20]]},"938":{"position":[[21,19]]},"1076":{"position":[[109,19]]},"1085":{"position":[[3345,19]]}},"keywords":{}}],["mild",{"_index":2081,"title":{},"content":{"361":{"position":[[198,4]]}},"keywords":{}}],["million",{"_index":2567,"title":{},"content":{"408":{"position":[[4474,7],[4824,7]]},"412":{"position":[[10475,7]]},"420":{"position":[[380,7]]},"703":{"position":[[1351,7]]}},"keywords":{}}],["millisecond",{"_index":1602,"title":{},"content":{"265":{"position":[[357,11]]},"394":{"position":[[1638,13]]},"400":{"position":[[22,12],[586,12]]},"408":{"position":[[3091,13],[4871,12]]},"463":{"position":[[974,13],[1293,13],[1400,12]]},"464":{"position":[[519,12],[711,12],[771,12],[1216,11]]},"465":{"position":[[381,12]]},"467":{"position":[[706,12]]},"569":{"position":[[577,13],[787,13]]},"570":{"position":[[405,13]]},"571":{"position":[[1493,12],[1584,12]]},"644":{"position":[[468,11]]},"653":{"position":[[370,12],[908,12]]},"654":{"position":[[279,13]]},"703":{"position":[[1514,12]]},"704":{"position":[[86,13]]},"846":{"position":[[895,12]]},"988":{"position":[[874,12]]},"1104":{"position":[[553,12]]},"1295":{"position":[[1056,13]]},"1301":{"position":[[1448,14]]}},"keywords":{}}],["millisecondscooki",{"_index":3045,"title":{},"content":{"464":{"position":[[269,19]]},"465":{"position":[[130,19]]},"466":{"position":[[96,19]]},"467":{"position":[[68,19]]}},"keywords":{}}],["millisecondsindexeddb",{"_index":3031,"title":{},"content":{"463":{"position":[[656,21]]}},"keywords":{}}],["mimic",{"_index":369,"title":{},"content":{"22":{"position":[[132,5]]}},"keywords":{}}],["min",{"_index":4303,"title":{},"content":{"749":{"position":[[12983,3]]}},"keywords":{}}],["min$max$inc$set$unset$push$addtoset$pop$pullall$renam",{"_index":3868,"title":{},"content":{"679":{"position":[[197,55]]}},"keywords":{}}],["mind",{"_index":2741,"title":{},"content":{"412":{"position":[[10354,7],[15359,4]]},"625":{"position":[[129,5]]},"699":{"position":[[565,4]]},"723":{"position":[[2496,5]]},"858":{"position":[[445,4]]},"981":{"position":[[122,5]]},"1069":{"position":[[380,4]]}},"keywords":{}}],["mine",{"_index":2841,"title":{},"content":{"420":{"position":[[1261,7]]}},"keywords":{}}],["minecraft",{"_index":5553,"title":{},"content":{"1006":{"position":[[27,9]]}},"keywords":{}}],["mingo",{"_index":3865,"title":{},"content":{"678":{"position":[[186,5]]},"679":{"position":[[62,6]]},"1041":{"position":[[69,5]]}},"keywords":{}}],["minid",{"_index":5092,"title":{},"content":{"885":{"position":[[1510,5],[2261,6]]}},"keywords":{}}],["minifi",{"_index":6414,"title":{},"content":{"1292":{"position":[[854,9]]}},"keywords":{}}],["minified+gzip",{"_index":6415,"title":{},"content":{"1292":{"position":[[885,15]]}},"keywords":{}}],["minilm",{"_index":2184,"title":{},"content":{"390":{"position":[[287,7]]},"391":{"position":[[403,6],[546,6]]},"401":{"position":[[206,6]]},"402":{"position":[[1905,6]]}},"keywords":{}}],["minim",{"_index":921,"title":{},"content":{"65":{"position":[[1084,8]]},"76":{"position":[[126,10]]},"173":{"position":[[2609,7]]},"197":{"position":[[4,8]]},"216":{"position":[[126,8]]},"224":{"position":[[239,10]]},"234":{"position":[[177,10]]},"283":{"position":[[199,9]]},"311":{"position":[[67,7]]},"313":{"position":[[230,7]]},"316":{"position":[[4,8]]},"323":{"position":[[388,7]]},"334":{"position":[[12,7]]},"345":{"position":[[82,8]]},"350":{"position":[[333,10]]},"369":{"position":[[1131,8]]},"376":{"position":[[296,8]]},"382":{"position":[[360,10]]},"385":{"position":[[146,10]]},"402":{"position":[[2530,7]]},"408":{"position":[[3292,10]]},"412":{"position":[[754,7]]},"418":{"position":[[360,7]]},"429":{"position":[[339,7]]},"463":{"position":[[1006,7]]},"490":{"position":[[530,8]]},"502":{"position":[[1372,10]]},"528":{"position":[[99,9]]},"559":{"position":[[881,7]]},"566":{"position":[[830,8]]},"644":{"position":[[546,7]]},"690":{"position":[[410,7]]},"802":{"position":[[577,10]]},"902":{"position":[[103,10]]},"1071":{"position":[[357,7]]},"1123":{"position":[[288,7]]},"1266":{"position":[[958,9],[974,10]]},"1295":{"position":[[1035,7]]},"1298":{"position":[[379,8]]}},"keywords":{}}],["minimalist",{"_index":509,"title":{},"content":{"33":{"position":[[15,12]]}},"keywords":{}}],["minimongo",{"_index":261,"title":{"16":{"position":[[0,10]]}},"content":{"15":{"position":[[407,9]]},"16":{"position":[[36,9],[55,9],[266,9],[373,9],[528,9]]}},"keywords":{}}],["minimum",{"_index":3747,"title":{},"content":{"653":{"position":[[354,7],[560,7]]},"680":{"position":[[951,8]]},"749":{"position":[[20618,7],[21312,8]]},"1079":{"position":[[297,8]]},"1080":{"position":[[534,8],[566,8]]}},"keywords":{}}],["minimumcollectionag",{"_index":3753,"title":{},"content":{"653":{"position":[[777,21]]}},"keywords":{}}],["minimumdeletedtim",{"_index":3750,"title":{},"content":{"653":{"position":[[490,19]]},"654":{"position":[[126,18],[224,18],[415,18]]}},"keywords":{}}],["minor",{"_index":6087,"title":{},"content":{"1151":{"position":[[295,5]]},"1178":{"position":[[294,5]]}},"keywords":{}}],["mintimestamp",{"_index":5464,"title":{},"content":{"988":{"position":[[3564,12]]}},"keywords":{}}],["minupdatedat",{"_index":5095,"title":{},"content":{"885":{"position":[[1567,12],[2089,13],[2140,13],[2189,13]]}},"keywords":{}}],["minut",{"_index":2286,"title":{},"content":{"392":{"position":[[5176,7]]},"408":{"position":[[4597,7]]},"567":{"position":[[429,8]]},"653":{"position":[[934,8],[975,7]]},"736":{"position":[[412,7]]}},"keywords":{}}],["mirror",{"_index":2921,"title":{},"content":{"437":{"position":[[74,9]]},"898":{"position":[[1647,7]]}},"keywords":{}}],["mishandl",{"_index":3106,"title":{},"content":{"475":{"position":[[15,9]]}},"keywords":{}}],["mislead",{"_index":3204,"title":{},"content":{"497":{"position":[[484,7]]}},"keywords":{}}],["mismatch",{"_index":4502,"title":{},"content":{"761":{"position":[[296,8]]}},"keywords":{}}],["miss",{"_index":741,"title":{"626":{"position":[[13,4]]},"851":{"position":[[9,8]]},"876":{"position":[[0,7]]}},"content":{"47":{"position":[[1057,8]]},"330":{"position":[[143,7]]},"432":{"position":[[857,7]]},"458":{"position":[[788,7]]},"569":{"position":[[437,4]]},"610":{"position":[[1609,4]]},"626":{"position":[[62,4],[152,6],[369,6],[1102,6]]},"749":{"position":[[5181,7],[7969,7],[11302,7],[11477,7],[19705,7]]},"759":{"position":[[1319,7]]},"851":{"position":[[67,7]]},"875":{"position":[[8683,6],[8765,6]]},"898":{"position":[[497,4]]},"911":{"position":[[74,7]]},"985":{"position":[[509,6]]},"988":{"position":[[5895,6]]},"1024":{"position":[[173,7]]},"1123":{"position":[[651,8]]},"1300":{"position":[[1047,7]]}},"keywords":{}}],["mistak",{"_index":5396,"title":{},"content":{"966":{"position":[[174,8]]},"995":{"position":[[538,7]]}},"keywords":{}}],["mitig",{"_index":2550,"title":{},"content":{"408":{"position":[[2688,8],[3274,9]]},"412":{"position":[[13366,8],[15239,8]]}},"keywords":{}}],["mix",{"_index":2823,"title":{},"content":{"419":{"position":[[1826,6]]},"469":{"position":[[521,3]]},"749":{"position":[[4371,3],[4622,3]]},"875":{"position":[[5801,3]]},"1126":{"position":[[238,5]]}},"keywords":{}}],["mixedbread",{"_index":2465,"title":{},"content":{"401":{"position":[[461,10]]}},"keywords":{}}],["mj",{"_index":6319,"title":{},"content":{"1266":{"position":[[895,7]]}},"keywords":{}}],["mobil",{"_index":199,"title":{"152":{"position":[[28,6]]},"177":{"position":[[20,6]]},"443":{"position":[[0,6],[39,6]]},"444":{"position":[[14,6]]},"445":{"position":[[38,6]]},"618":{"position":[[33,6]]}},"content":{"14":{"position":[[59,6]]},"18":{"position":[[74,6]]},"36":{"position":[[24,6]]},"59":{"position":[[202,6]]},"152":{"position":[[1,6]]},"153":{"position":[[107,6]]},"170":{"position":[[61,6],[557,6]]},"172":{"position":[[197,6]]},"177":{"position":[[122,6]]},"207":{"position":[[200,6]]},"215":{"position":[[309,6]]},"254":{"position":[[171,6],[449,6]]},"287":{"position":[[1124,6]]},"298":{"position":[[637,6]]},"299":{"position":[[460,6]]},"309":{"position":[[45,6]]},"314":{"position":[[983,6]]},"318":{"position":[[327,6]]},"359":{"position":[[99,6]]},"371":{"position":[[5,6]]},"376":{"position":[[682,6]]},"384":{"position":[[257,6]]},"408":{"position":[[629,6],[4949,6]]},"410":{"position":[[1235,6]]},"412":{"position":[[7837,6],[8475,6]]},"444":{"position":[[1,6],[102,6],[184,6],[357,6]]},"445":{"position":[[88,6],[335,6],[515,6],[2204,6]]},"447":{"position":[[1,6],[76,6],[311,6],[701,6]]},"483":{"position":[[1058,6]]},"500":{"position":[[103,6]]},"575":{"position":[[198,6]]},"595":{"position":[[1372,6]]},"614":{"position":[[170,6]]},"618":{"position":[[19,6],[201,6],[537,6]]},"630":{"position":[[286,7]]},"631":{"position":[[175,6]]},"640":{"position":[[271,6],[533,7]]},"641":{"position":[[416,6]]},"832":{"position":[[356,6]]},"838":{"position":[[1139,6]]},"839":{"position":[[74,6]]},"841":{"position":[[1057,6]]},"871":{"position":[[711,6]]},"897":{"position":[[457,6]]},"1232":{"position":[[47,6]]}},"keywords":{}}],["mobile.join",{"_index":1912,"title":{},"content":{"318":{"position":[[511,11]]}},"keywords":{}}],["mobile—mani",{"_index":1760,"title":{},"content":{"299":{"position":[[1334,11]]}},"keywords":{}}],["mobx",{"_index":2616,"title":{},"content":{"411":{"position":[[2007,5]]},"520":{"position":[[382,4]]},"785":{"position":[[305,5]]}},"keywords":{}}],["mocha",{"_index":4075,"title":{},"content":{"730":{"position":[[170,6]]}},"keywords":{}}],["mock",{"_index":332,"title":{"1159":{"position":[[0,7]]}},"content":{"19":{"position":[[488,4]]},"1159":{"position":[[117,4]]}},"keywords":{}}],["modal",{"_index":2504,"title":{},"content":{"404":{"position":[[456,5],[556,10]]}},"keywords":{}}],["moddatetim",{"_index":5198,"title":{},"content":{"898":{"position":[[861,11]]}},"keywords":{}}],["mode",{"_index":1872,"title":{"671":{"position":[[4,4]]},"675":{"position":[[16,4]]}},"content":{"305":{"position":[[319,5]]},"346":{"position":[[688,4]]},"399":{"position":[[340,5]]},"411":{"position":[[5714,5]]},"412":{"position":[[10716,5],[12042,5]]},"420":{"position":[[1503,4]]},"445":{"position":[[499,5]]},"453":{"position":[[278,6]]},"500":{"position":[[686,5]]},"626":{"position":[[644,5],[705,4],[851,4],[1037,4]]},"653":{"position":[[1393,5]]},"661":{"position":[[1238,5]]},"674":{"position":[[181,5],[279,5],[346,5]]},"675":{"position":[[14,4],[129,4],[269,6]]},"676":{"position":[[52,4]]},"685":{"position":[[550,4]]},"749":{"position":[[2626,4],[6110,4],[20933,4],[21738,4]]},"793":{"position":[[67,4]]},"875":{"position":[[6608,5],[6700,5],[8893,4]]},"932":{"position":[[1152,4],[1327,4]]},"966":{"position":[[512,5]]},"983":{"position":[[1125,6]]},"984":{"position":[[689,5]]},"985":{"position":[[708,5]]},"988":{"position":[[4116,5],[6031,4],[6116,4]]},"1085":{"position":[[3270,5],[3439,5]]},"1143":{"position":[[536,4]]},"1218":{"position":[[409,5]]},"1222":{"position":[[962,5],[1277,5]]},"1266":{"position":[[702,5]]},"1297":{"position":[[155,5],[429,4]]},"1313":{"position":[[689,5]]}},"keywords":{}}],["mode').then",{"_index":3846,"title":{},"content":{"672":{"position":[[115,12]]},"673":{"position":[[121,12]]},"674":{"position":[[404,12]]}},"keywords":{}}],["mode.wasm",{"_index":3085,"title":{},"content":{"467":{"position":[[380,9]]}},"keywords":{}}],["model",{"_index":954,"title":{"401":{"position":[[19,7]]}},"content":{"68":{"position":[[37,5]]},"126":{"position":[[122,6]]},"174":{"position":[[514,6]]},"179":{"position":[[333,5]]},"210":{"position":[[755,6]]},"226":{"position":[[45,6]]},"231":{"position":[[253,5]]},"279":{"position":[[423,5]]},"345":{"position":[[14,5]]},"350":{"position":[[254,5]]},"354":{"position":[[1274,7]]},"382":{"position":[[38,7]]},"384":{"position":[[473,6]]},"390":{"position":[[275,6],[1050,5],[1124,7]]},"391":{"position":[[213,6],[416,6],[832,5],[1003,6],[1079,6]]},"392":{"position":[[2000,5]]},"396":{"position":[[1034,6]]},"401":{"position":[[82,6],[130,5],[180,5],[632,6],[708,5],[766,6],[839,5],[915,5]]},"402":{"position":[[1715,7],[1786,7],[1847,7],[1888,5],[2002,6],[2092,5],[2118,5]]},"403":{"position":[[62,5]]},"404":{"position":[[465,7],[506,6],[851,6],[950,5]]},"412":{"position":[[11068,6],[13728,5],[14378,5]]},"542":{"position":[[155,6]]},"566":{"position":[[48,5]]},"630":{"position":[[227,5]]},"635":{"position":[[16,7]]},"690":{"position":[[97,5]]},"765":{"position":[[37,5]]},"828":{"position":[[216,6]]},"831":{"position":[[94,6]]},"838":{"position":[[949,8]]},"841":{"position":[[274,5]]},"898":{"position":[[1819,5],[4294,5]]},"1132":{"position":[[359,6],[400,6]]},"1284":{"position":[[294,7]]},"1319":{"position":[[203,7]]}},"keywords":{}}],["model.histor",{"_index":4796,"title":{},"content":{"839":{"position":[[282,18]]}},"keywords":{}}],["model/index",{"_index":2493,"title":{"403":{"position":[[18,11]]}},"content":{},"keywords":{}}],["modelofflin",{"_index":1907,"title":{},"content":{"317":{"position":[[160,12]]}},"keywords":{}}],["models.r",{"_index":2006,"title":{},"content":{"353":{"position":[[289,11]]}},"keywords":{}}],["modelsadvanc",{"_index":3698,"title":{},"content":{"631":{"position":[[363,14]]}},"keywords":{}}],["moder",{"_index":4814,"title":{},"content":{"841":{"position":[[1381,8]]}},"keywords":{}}],["modern",{"_index":256,"title":{"423":{"position":[[22,6]]},"449":{"position":[[32,6]]},"783":{"position":[[0,6]]}},"content":{"15":{"position":[[285,6]]},"47":{"position":[[194,6]]},"83":{"position":[[223,6]]},"105":{"position":[[30,6]]},"131":{"position":[[467,6]]},"174":{"position":[[566,6]]},"175":{"position":[[678,7]]},"287":{"position":[[642,6]]},"288":{"position":[[75,6]]},"299":{"position":[[1628,6]]},"300":{"position":[[454,6]]},"309":{"position":[[38,6]]},"321":{"position":[[1,7]]},"322":{"position":[[97,7]]},"336":{"position":[[222,6]]},"352":{"position":[[4,6]]},"364":{"position":[[392,6]]},"375":{"position":[[569,6]]},"378":{"position":[[92,6]]},"402":{"position":[[1995,6]]},"408":{"position":[[792,6],[1271,6]]},"410":{"position":[[402,6]]},"412":{"position":[[15210,6]]},"418":{"position":[[519,6]]},"432":{"position":[[1187,6]]},"434":{"position":[[89,6]]},"435":{"position":[[159,6]]},"441":{"position":[[17,6]]},"452":{"position":[[760,6]]},"500":{"position":[[338,6]]},"502":{"position":[[205,6]]},"517":{"position":[[38,6]]},"521":{"position":[[127,6]]},"524":{"position":[[370,6]]},"535":{"position":[[189,6]]},"542":{"position":[[123,7]]},"548":{"position":[[458,6]]},"574":{"position":[[144,6]]},"576":{"position":[[410,7]]},"581":{"position":[[319,6]]},"595":{"position":[[202,6]]},"608":{"position":[[456,6]]},"617":{"position":[[6,6]]},"640":{"position":[[137,6]]},"641":{"position":[[268,6]]},"644":{"position":[[655,6]]},"801":{"position":[[858,6]]},"911":{"position":[[11,6]]},"1098":{"position":[[162,7]]},"1207":{"position":[[84,6]]},"1322":{"position":[[1,6]]}},"keywords":{}}],["modif",{"_index":1126,"title":{},"content":{"140":{"position":[[164,13]]},"206":{"position":[[282,13]]},"344":{"position":[[39,13]]},"412":{"position":[[2662,13]]},"445":{"position":[[1030,13]]},"571":{"position":[[1539,12]]},"632":{"position":[[91,14]]},"898":{"position":[[298,12]]}},"keywords":{}}],["modifi",{"_index":1114,"title":{"1042":{"position":[[0,9]]},"1061":{"position":[[0,8]]},"1105":{"position":[[6,9]]}},"content":{"134":{"position":[[68,6]]},"191":{"position":[[69,8]]},"203":{"position":[[351,6]]},"358":{"position":[[522,6]]},"397":{"position":[[1357,6]]},"429":{"position":[[305,9]]},"667":{"position":[[167,6]]},"678":{"position":[[322,8],[353,9]]},"698":{"position":[[27,6],[138,8]]},"709":{"position":[[534,6]]},"749":{"position":[[10317,8],[10405,8],[14115,8]]},"766":{"position":[[143,6]]},"768":{"position":[[340,6]]},"770":{"position":[[85,6]]},"805":{"position":[[205,6]]},"829":{"position":[[3886,8]]},"846":{"position":[[751,8],[834,9],[1177,8],[1269,9]]},"886":{"position":[[1207,9],[1246,8],[2965,8],[2987,8],[3107,9]]},"887":{"position":[[442,9]]},"888":{"position":[[40,6]]},"889":{"position":[[23,6]]},"897":{"position":[[170,10]]},"898":{"position":[[261,8],[3514,9],[3744,9]]},"908":{"position":[[152,6]]},"986":{"position":[[665,10]]},"987":{"position":[[39,6]]},"988":{"position":[[3014,8],[3175,8],[3272,8],[3367,9],[4496,8],[4601,8],[4696,9]]},"1044":{"position":[[360,6]]},"1048":{"position":[[323,9],[517,8]]},"1051":{"position":[[118,9]]},"1069":{"position":[[551,6]]},"1083":{"position":[[57,8],[241,8]]},"1085":{"position":[[3391,8]]},"1105":{"position":[[11,8],[217,8],[313,8],[459,8]]},"1109":{"position":[[42,8]]},"1115":{"position":[[49,9],[152,8],[238,8],[496,8],[694,8]]},"1316":{"position":[[2023,8]]},"1317":{"position":[[247,6]]}},"keywords":{}}],["modifiedfield",{"_index":5223,"title":{},"content":{"898":{"position":[[3950,14]]}},"keywords":{}}],["modul",{"_index":50,"title":{},"content":{"2":{"position":[[436,6]]},"6":{"position":[[601,6],[799,6]]},"8":{"position":[[650,7]]},"10":{"position":[[397,6]]},"440":{"position":[[403,6]]},"479":{"position":[[376,7]]},"672":{"position":[[128,6]]},"673":{"position":[[134,6]]},"674":{"position":[[417,6]]},"711":{"position":[[754,7],[828,6]]},"717":{"position":[[429,7]]},"743":{"position":[[62,7]]},"829":{"position":[[1122,7]]},"836":{"position":[[1659,7]]},"960":{"position":[[91,7]]},"1133":{"position":[[139,6]]},"1138":{"position":[[73,6]]},"1139":{"position":[[180,6]]},"1145":{"position":[[176,6]]},"1162":{"position":[[945,7]]},"1174":{"position":[[388,7]]},"1176":{"position":[[85,6],[253,6]]},"1181":{"position":[[902,7]]},"1226":{"position":[[674,9]]},"1264":{"position":[[554,9]]},"1266":{"position":[[722,7]]},"1271":{"position":[[876,6],[1280,6],[1303,7]]},"1274":{"position":[[206,7]]},"1275":{"position":[[78,6]]},"1276":{"position":[[94,6],[603,7]]},"1286":{"position":[[14,6]]}},"keywords":{}}],["modular",{"_index":1060,"title":{},"content":{"116":{"position":[[150,7]]},"860":{"position":[[1072,11]]}},"keywords":{}}],["module.export",{"_index":3850,"title":{},"content":{"674":{"position":[[28,14]]},"1266":{"position":[[493,14]]}},"keywords":{}}],["moduleadd",{"_index":6357,"title":{},"content":{"1279":{"position":[[34,9]]}},"keywords":{}}],["moduleid",{"_index":6321,"title":{},"content":{"1266":{"position":[[930,10]]}},"keywords":{}}],["moduleimport",{"_index":6348,"title":{},"content":{"1277":{"position":[[43,12]]}},"keywords":{}}],["moment",{"_index":1155,"title":{},"content":{"151":{"position":[[56,6]]},"412":{"position":[[5883,7]]},"491":{"position":[[1748,6]]},"584":{"position":[[99,6]]},"679":{"position":[[8,7]]},"700":{"position":[[186,6]]},"723":{"position":[[1891,6]]},"739":{"position":[[140,6]]},"799":{"position":[[276,6]]},"945":{"position":[[413,6]]},"975":{"position":[[343,6],[537,6]]},"1115":{"position":[[872,6]]},"1300":{"position":[[860,6]]}},"keywords":{}}],["monet",{"_index":2674,"title":{},"content":{"412":{"position":[[2822,8]]}},"keywords":{}}],["money",{"_index":2706,"title":{},"content":{"412":{"position":[[6188,5]]}},"keywords":{}}],["mongo",{"_index":5683,"title":{},"content":{"1041":{"position":[[35,5]]}},"keywords":{}}],["mongocli",{"_index":4947,"title":{},"content":{"872":{"position":[[854,11],[890,11]]},"875":{"position":[[807,11],[874,11]]}},"keywords":{}}],["mongoclient('mongodb://localhost:27017",{"_index":4979,"title":{},"content":{"875":{"position":[[892,42]]}},"keywords":{}}],["mongoclient('mongodb://localhost:27017/?directconnection=tru",{"_index":4948,"title":{},"content":{"872":{"position":[[908,64]]}},"keywords":{}}],["mongoclient.connect",{"_index":4981,"title":{},"content":{"875":{"position":[[965,22]]}},"keywords":{}}],["mongoclient.db('mi",{"_index":4950,"title":{},"content":{"872":{"position":[[995,18]]}},"keywords":{}}],["mongocollect",{"_index":4983,"title":{},"content":{"875":{"position":[[1050,15]]}},"keywords":{}}],["mongocollection.find",{"_index":4993,"title":{},"content":{"875":{"position":[[2206,22]]}},"keywords":{}}],["mongocollection.findone({id",{"_index":5022,"title":{},"content":{"875":{"position":[[4655,28]]}},"keywords":{}}],["mongocollection.updateon",{"_index":5028,"title":{},"content":{"875":{"position":[[5208,26]]}},"keywords":{}}],["mongoconnect",{"_index":4980,"title":{},"content":{"875":{"position":[[941,15]]}},"keywords":{}}],["mongoconnection.db('mydatabas",{"_index":4982,"title":{},"content":{"875":{"position":[[1010,33]]}},"keywords":{}}],["mongod",{"_index":4941,"title":{},"content":{"872":{"position":[[545,6]]}},"keywords":{}}],["mongodatabas",{"_index":4949,"title":{},"content":{"872":{"position":[[979,13]]},"875":{"position":[[994,13]]}},"keywords":{}}],["mongodatabase.collection('mydoc",{"_index":4984,"title":{},"content":{"875":{"position":[[1074,35]]}},"keywords":{}}],["mongodatabase.createcollection('mi",{"_index":4951,"title":{},"content":{"872":{"position":[[1032,34]]}},"keywords":{}}],["mongodb",{"_index":260,"title":{"36":{"position":[[0,7]]},"869":{"position":[[0,7]]},"872":{"position":[[31,7]]},"1187":{"position":[[0,7]]},"1188":{"position":[[19,7]]},"1189":{"position":[[10,7]]}},"content":{"15":{"position":[[359,7]]},"16":{"position":[[116,7],[171,8]]},"23":{"position":[[476,8]]},"32":{"position":[[154,8]]},"33":{"position":[[344,8],[636,7]]},"36":{"position":[[247,7],[343,7],[375,7],[432,7]]},"43":{"position":[[182,9]]},"249":{"position":[[195,7]]},"350":{"position":[[151,8]]},"365":{"position":[[1568,7]]},"571":{"position":[[563,7]]},"678":{"position":[[97,7]]},"679":{"position":[[323,7]]},"708":{"position":[[159,8]]},"749":{"position":[[23834,7]]},"776":{"position":[[263,7],[291,7]]},"793":{"position":[[365,7],[782,7]]},"839":{"position":[[145,8],[191,7],[381,7],[441,7],[1025,7]]},"841":{"position":[[219,8],[435,7],[1512,7]]},"870":{"position":[[29,7],[137,7]]},"871":{"position":[[106,8],[145,7],[213,8],[444,7],[504,7],[544,7],[726,7],[760,7]]},"872":{"position":[[99,7],[152,7],[178,7],[238,7],[401,7],[448,7],[484,7],[663,7],[722,7],[763,7],[873,10],[2128,7],[2243,7],[2339,9],[2393,8],[2563,7],[2977,8]]},"873":{"position":[[26,7]]},"875":{"position":[[650,8],[717,7],[826,10],[5745,7],[5900,7],[7718,7]]},"962":{"position":[[534,7],[849,7],[937,9]]},"981":{"position":[[745,7]]},"1071":{"position":[[78,7]]},"1095":{"position":[[160,7]]},"1188":{"position":[[41,7],[154,7],[388,7]]},"1189":{"position":[[15,7],[44,7],[72,7],[241,7],[367,9],[479,7]]},"1196":{"position":[[178,7]]},"1247":{"position":[[242,8],[288,7],[394,7]]},"1324":{"position":[[912,8]]}},"keywords":{}}],["mongodb'",{"_index":4797,"title":{},"content":{"839":{"position":[[551,9],[900,9],[1357,9]]},"1112":{"position":[[369,9]]}},"keywords":{}}],["mongodb://localhost:27017",{"_index":4945,"title":{},"content":{"872":{"position":[[683,27],[2449,28]]}},"keywords":{}}],["mongodb://localhost:27017,localhost:27018,localhost:27019",{"_index":5389,"title":{},"content":{"962":{"position":[[1051,59]]},"1189":{"position":[[593,59]]}},"keywords":{}}],["mongodbrepl",{"_index":4975,"title":{},"content":{"873":{"position":[[110,18]]}},"keywords":{}}],["mongoos",{"_index":4514,"title":{},"content":{"764":{"position":[[14,9]]}},"keywords":{}}],["monitor",{"_index":1785,"title":{},"content":{"301":{"position":[[279,8]]},"502":{"position":[[752,7]]}},"keywords":{}}],["monkey",{"_index":6173,"title":{},"content":{"1198":{"position":[[844,6]]}},"keywords":{}}],["monolith",{"_index":2096,"title":{},"content":{"362":{"position":[[583,10]]}},"keywords":{}}],["monopol",{"_index":2891,"title":{},"content":{"427":{"position":[[1223,12]]}},"keywords":{}}],["month",{"_index":2966,"title":{},"content":{"453":{"position":[[872,7]]},"653":{"position":[[480,6],[543,6]]},"661":{"position":[[395,6]]}},"keywords":{}}],["monthli",{"_index":1318,"title":{},"content":{"204":{"position":[[131,7]]}},"keywords":{}}],["more",{"_index":222,"title":{"780":{"position":[[11,4]]},"1216":{"position":[[6,4]]}},"content":{"14":{"position":[[710,4]]},"25":{"position":[[149,4]]},"28":{"position":[[594,4]]},"34":{"position":[[716,4]]},"36":{"position":[[187,4]]},"39":{"position":[[326,4],[478,4]]},"40":{"position":[[717,4],[828,4]]},"47":{"position":[[320,4]]},"57":{"position":[[124,4],[470,4]]},"58":{"position":[[193,4],[314,4]]},"64":{"position":[[40,4],[190,4]]},"65":{"position":[[290,4],[396,4],[965,4],[1457,4],[2088,4]]},"84":{"position":[[12,4]]},"89":{"position":[[188,4]]},"90":{"position":[[72,4]]},"91":{"position":[[249,4]]},"92":{"position":[[216,4]]},"104":{"position":[[174,4]]},"114":{"position":[[12,4]]},"144":{"position":[[142,5]]},"149":{"position":[[12,4]]},"161":{"position":[[320,4]]},"173":{"position":[[1862,4]]},"174":{"position":[[3108,5]]},"197":{"position":[[167,4]]},"203":{"position":[[132,4]]},"205":{"position":[[79,4]]},"216":{"position":[[196,4]]},"219":{"position":[[333,4]]},"221":{"position":[[180,4]]},"224":{"position":[[317,4]]},"231":{"position":[[221,4]]},"263":{"position":[[553,4]]},"282":{"position":[[147,4]]},"291":{"position":[[516,4]]},"295":{"position":[[91,4]]},"298":{"position":[[619,4]]},"299":{"position":[[963,4],[1517,4],[1665,4]]},"303":{"position":[[44,4]]},"306":{"position":[[7,4]]},"318":{"position":[[359,5]]},"321":{"position":[[427,4]]},"336":{"position":[[548,4]]},"347":{"position":[[12,4]]},"351":{"position":[[163,4]]},"352":{"position":[[335,4]]},"353":{"position":[[166,4]]},"354":{"position":[[170,4],[669,4],[791,4]]},"362":{"position":[[256,4],[510,4],[1092,4]]},"364":{"position":[[597,4]]},"365":{"position":[[1029,4]]},"370":{"position":[[322,4]]},"371":{"position":[[327,4]]},"388":{"position":[[252,4]]},"392":{"position":[[149,4]]},"393":{"position":[[300,6]]},"395":{"position":[[508,4],[537,4]]},"396":{"position":[[718,4]]},"398":{"position":[[83,4]]},"399":{"position":[[85,4],[404,4]]},"401":{"position":[[783,4]]},"402":{"position":[[607,4],[1556,4],[1990,4]]},"404":{"position":[[671,4]]},"407":{"position":[[488,4],[728,4]]},"408":{"position":[[596,4],[2295,4],[3209,5]]},"409":{"position":[[56,4],[223,4]]},"411":{"position":[[550,4],[599,4],[755,4],[3109,4],[5254,4],[5322,4]]},"412":{"position":[[2453,4],[3643,4],[8533,4],[8993,4],[9349,4],[14390,4]]},"417":{"position":[[289,4]]},"418":{"position":[[850,4]]},"419":{"position":[[1145,4]]},"420":{"position":[[494,4]]},"421":{"position":[[223,4]]},"426":{"position":[[83,4]]},"427":{"position":[[430,4]]},"430":{"position":[[145,4],[623,4]]},"432":{"position":[[154,4]]},"441":{"position":[[504,4]]},"445":{"position":[[1948,4]]},"452":{"position":[[349,4],[796,4]]},"463":{"position":[[1104,4]]},"473":{"position":[[179,4]]},"474":{"position":[[294,4]]},"477":{"position":[[336,4]]},"480":{"position":[[1067,4]]},"483":{"position":[[404,4],[430,4],[450,4],[702,4]]},"491":{"position":[[772,5],[1459,5],[1868,4]]},"496":{"position":[[865,4]]},"497":{"position":[[788,4]]},"511":{"position":[[12,4]]},"521":{"position":[[505,4],[596,4]]},"524":{"position":[[972,4]]},"531":{"position":[[12,4]]},"533":{"position":[[194,5]]},"535":{"position":[[231,4],[517,4]]},"544":{"position":[[157,5]]},"545":{"position":[[131,5]]},"546":{"position":[[211,4]]},"551":{"position":[[388,4]]},"557":{"position":[[289,4]]},"560":{"position":[[127,4],[525,4],[677,4]]},"563":{"position":[[927,4]]},"564":{"position":[[5,4]]},"566":{"position":[[257,4]]},"571":{"position":[[1776,4]]},"572":{"position":[[39,4]]},"582":{"position":[[727,4]]},"591":{"position":[[12,4],[707,4]]},"593":{"position":[[194,5]]},"595":{"position":[[244,4],[537,4]]},"605":{"position":[[131,5]]},"606":{"position":[[211,4]]},"610":{"position":[[650,4]]},"612":{"position":[[1012,4]]},"617":{"position":[[640,4]]},"620":{"position":[[624,4]]},"621":{"position":[[830,4]]},"622":{"position":[[531,4]]},"623":{"position":[[192,4]]},"632":{"position":[[798,5],[1435,4]]},"634":{"position":[[598,4]]},"653":{"position":[[670,4]]},"659":{"position":[[966,4]]},"666":{"position":[[409,4]]},"681":{"position":[[102,4]]},"682":{"position":[[100,4]]},"686":{"position":[[192,4],[819,4]]},"688":{"position":[[296,4]]},"696":{"position":[[1241,5],[1931,4]]},"699":{"position":[[297,4]]},"701":{"position":[[737,4]]},"702":{"position":[[529,4]]},"705":{"position":[[566,4],[1303,4]]},"709":{"position":[[423,4]]},"710":{"position":[[2455,4]]},"711":{"position":[[2240,4]]},"717":{"position":[[257,4]]},"718":{"position":[[80,4]]},"723":{"position":[[2277,4]]},"740":{"position":[[39,4]]},"749":{"position":[[15534,4],[15668,4],[15800,4],[22494,4]]},"772":{"position":[[426,4]]},"780":{"position":[[246,4],[269,4],[624,4]]},"782":{"position":[[130,4],[177,4]]},"783":{"position":[[471,4]]},"784":{"position":[[249,4],[292,4]]},"799":{"position":[[58,4]]},"801":{"position":[[560,4]]},"802":{"position":[[669,4],[806,4]]},"821":{"position":[[903,4],[946,4]]},"831":{"position":[[444,4]]},"835":{"position":[[1030,4]]},"836":{"position":[[2361,4],[2469,4]]},"838":{"position":[[3179,4]]},"847":{"position":[[137,4]]},"875":{"position":[[1943,4],[4976,4]]},"886":{"position":[[1614,4]]},"889":{"position":[[98,4]]},"890":{"position":[[906,4]]},"906":{"position":[[635,4],[1091,4]]},"908":{"position":[[376,4]]},"912":{"position":[[737,4]]},"934":{"position":[[18,4]]},"936":{"position":[[128,4]]},"950":{"position":[[133,4]]},"963":{"position":[[181,4]]},"964":{"position":[[32,4]]},"973":{"position":[[72,4]]},"988":{"position":[[4015,4]]},"990":{"position":[[469,4]]},"1080":{"position":[[1139,4]]},"1087":{"position":[[65,4],[112,4]]},"1088":{"position":[[12,4]]},"1089":{"position":[[155,4]]},"1090":{"position":[[22,4]]},"1092":{"position":[[532,4]]},"1094":{"position":[[568,4],[577,4]]},"1095":{"position":[[230,4],[283,4]]},"1098":{"position":[[157,4]]},"1100":{"position":[[946,4]]},"1120":{"position":[[468,4],[544,4]]},"1125":{"position":[[881,4]]},"1132":{"position":[[1184,4]]},"1135":{"position":[[101,4]]},"1140":{"position":[[295,4]]},"1164":{"position":[[1339,4]]},"1173":{"position":[[173,4]]},"1175":{"position":[[445,4]]},"1206":{"position":[[275,4],[587,4]]},"1207":{"position":[[677,4],[708,4]]},"1208":{"position":[[1937,4]]},"1236":{"position":[[90,4]]},"1237":{"position":[[480,4]]},"1241":{"position":[[144,4]]},"1242":{"position":[[223,4]]},"1243":{"position":[[141,4]]},"1244":{"position":[[170,4]]},"1245":{"position":[[109,4]]},"1246":{"position":[[333,4],[653,4],[950,4],[1212,4],[1586,4],[1984,4],[2268,4]]},"1247":{"position":[[135,4],[236,4],[422,4],[586,4],[745,4]]},"1267":{"position":[[97,4],[215,4]]},"1304":{"position":[[711,4]]},"1308":{"position":[[648,4]]},"1316":{"position":[[3642,4]]},"1321":{"position":[[505,4],[531,4]]},"1324":{"position":[[1054,4]]}},"keywords":{}}],["more</button>",{"_index":3283,"title":{},"content":{"523":{"position":[[812,20]]}},"keywords":{}}],["more.loki",{"_index":6382,"title":{},"content":{"1284":{"position":[[339,9]]}},"keywords":{}}],["moreov",{"_index":2916,"title":{},"content":{"435":{"position":[[236,9]]},"624":{"position":[[1018,9]]}},"keywords":{}}],["morn",{"_index":3958,"title":{},"content":{"700":{"position":[[941,8]]}},"keywords":{}}],["mostli",{"_index":378,"title":{},"content":{"23":{"position":[[71,6]]},"26":{"position":[[68,6]]},"31":{"position":[[248,6]]},"266":{"position":[[1075,6]]},"390":{"position":[[1021,6]]},"402":{"position":[[1863,6]]},"411":{"position":[[3162,6]]},"554":{"position":[[441,6]]},"611":{"position":[[1158,6]]},"709":{"position":[[679,6]]},"749":{"position":[[16706,6]]},"800":{"position":[[599,6]]},"841":{"position":[[1313,6]]},"861":{"position":[[2002,6]]},"863":{"position":[[445,6]]},"1068":{"position":[[143,6]]},"1092":{"position":[[379,6]]},"1107":{"position":[[299,6]]},"1195":{"position":[[115,6]]},"1198":{"position":[[410,6]]},"1229":{"position":[[137,6]]},"1246":{"position":[[875,6]]}},"keywords":{}}],["mother",{"_index":4689,"title":{},"content":{"812":{"position":[[183,7],[244,6]]}},"keywords":{}}],["mount",{"_index":4765,"title":{},"content":{"829":{"position":[[3749,6]]}},"keywords":{}}],["mous",{"_index":3044,"title":{},"content":{"464":{"position":[[232,5]]}},"keywords":{}}],["move",{"_index":1388,"title":{"561":{"position":[[8,6]]},"1093":{"position":[[0,6]]}},"content":{"212":{"position":[[414,4]]},"460":{"position":[[55,4],[389,4]]},"618":{"position":[[256,4]]},"642":{"position":[[35,4]]},"664":{"position":[[48,5]]},"800":{"position":[[625,4]]},"801":{"position":[[1,6],[935,4]]},"868":{"position":[[107,5]]},"987":{"position":[[294,4]]},"1007":{"position":[[876,5]]},"1093":{"position":[[129,4]]},"1094":{"position":[[156,6]]},"1124":{"position":[[257,4]]},"1213":{"position":[[459,4]]},"1246":{"position":[[229,4],[549,4]]}},"keywords":{}}],["movement",{"_index":2773,"title":{},"content":{"412":{"position":[[15100,8]]},"419":{"position":[[1386,9]]},"464":{"position":[[238,10]]}},"keywords":{}}],["mpnet",{"_index":2455,"title":{},"content":{"401":{"position":[[291,5]]}},"keywords":{}}],["mq1",{"_index":4183,"title":{},"content":{"749":{"position":[[3849,3]]}},"keywords":{}}],["mq2",{"_index":4184,"title":{},"content":{"749":{"position":[[3936,3]]}},"keywords":{}}],["mq3",{"_index":4186,"title":{},"content":{"749":{"position":[[4008,3]]}},"keywords":{}}],["mq4",{"_index":4187,"title":{},"content":{"749":{"position":[[4123,3]]}},"keywords":{}}],["mq5",{"_index":4190,"title":{},"content":{"749":{"position":[[4239,3]]}},"keywords":{}}],["mq6",{"_index":4191,"title":{},"content":{"749":{"position":[[4361,3]]}},"keywords":{}}],["mq7",{"_index":4193,"title":{},"content":{"749":{"position":[[4538,3]]}},"keywords":{}}],["mq8",{"_index":4194,"title":{},"content":{"749":{"position":[[4612,3]]}},"keywords":{}}],["mqueri",{"_index":4189,"title":{},"content":{"749":{"position":[[4165,6]]}},"keywords":{}}],["ms",{"_index":2445,"title":{},"content":{"401":{"position":[[163,4]]},"975":{"position":[[490,2]]},"1292":{"position":[[346,2],[353,2],[363,2],[370,2],[385,2],[392,2],[702,2],[709,2],[721,2],[728,2],[744,2],[750,2]]}},"keywords":{}}],["mt",{"_index":6320,"title":{},"content":{"1266":{"position":[[903,7]]}},"keywords":{}}],["much",{"_index":61,"title":{"1237":{"position":[[8,4]]}},"content":{"4":{"position":[[96,4]]},"8":{"position":[[50,4]]},"23":{"position":[[396,4]]},"31":{"position":[[223,4]]},"395":{"position":[[343,4]]},"398":{"position":[[78,4]]},"400":{"position":[[497,4]]},"410":{"position":[[548,4]]},"411":{"position":[[3104,4]]},"412":{"position":[[11935,4],[13737,4]]},"416":{"position":[[14,4]]},"432":{"position":[[1366,4]]},"450":{"position":[[439,4]]},"454":{"position":[[402,4]]},"521":{"position":[[633,4]]},"545":{"position":[[197,4]]},"605":{"position":[[197,4]]},"662":{"position":[[794,4]]},"696":{"position":[[976,4],[1067,4],[1569,4],[2029,4]]},"749":{"position":[[7984,4]]},"780":{"position":[[607,4]]},"784":{"position":[[854,4]]},"816":{"position":[[64,4],[102,4]]},"838":{"position":[[521,4]]},"944":{"position":[[74,4]]},"1162":{"position":[[426,4],[623,4]]},"1170":{"position":[[73,4],[210,4]]},"1171":{"position":[[351,4]]},"1181":{"position":[[513,4],[711,4]]},"1209":{"position":[[93,4]]},"1295":{"position":[[1318,4]]},"1297":{"position":[[609,5]]},"1321":{"position":[[101,4]]}},"keywords":{}}],["multi",{"_index":379,"title":{"80":{"position":[[9,5]]},"109":{"position":[[9,5]]},"125":{"position":[[0,5]]},"160":{"position":[[0,5]]},"237":{"position":[[9,5]]},"330":{"position":[[0,5]]},"384":{"position":[[0,5]]},"458":{"position":[[0,5]]},"475":{"position":[[3,5]]},"519":{"position":[[0,5]]},"589":{"position":[[0,5]]},"755":{"position":[[13,5]]},"779":{"position":[[0,5]]},"989":{"position":[[0,5]]},"1135":{"position":[[0,5]]},"1174":{"position":[[0,5]]},"1183":{"position":[[0,5]]},"1301":{"position":[[11,5]]}},"content":{"23":{"position":[[92,5]]},"33":{"position":[[258,5]]},"35":{"position":[[636,5]]},"42":{"position":[[133,5]]},"47":{"position":[[992,5]]},"80":{"position":[[28,5]]},"109":{"position":[[24,5]]},"120":{"position":[[308,5]]},"125":{"position":[[42,5]]},"160":{"position":[[13,5]]},"174":{"position":[[1781,5],[1823,5]]},"237":{"position":[[22,5]]},"314":{"position":[[594,5]]},"323":{"position":[[341,5],[357,5]]},"325":{"position":[[267,5]]},"334":{"position":[[487,5]]},"353":{"position":[[346,5]]},"354":{"position":[[1305,5]]},"411":{"position":[[3943,5],[3957,5],[4572,5]]},"412":{"position":[[14163,5]]},"427":{"position":[[1122,5]]},"475":{"position":[[260,5]]},"483":{"position":[[97,5]]},"502":{"position":[[1128,5],[1176,5]]},"519":{"position":[[122,5]]},"565":{"position":[[13,5],[29,5]]},"566":{"position":[[968,5]]},"579":{"position":[[496,5]]},"582":{"position":[[453,5]]},"590":{"position":[[835,5]]},"630":{"position":[[918,5]]},"644":{"position":[[251,5]]},"709":{"position":[[392,5]]},"723":{"position":[[233,5],[2157,5]]},"749":{"position":[[5769,5]]},"779":{"position":[[78,5]]},"801":{"position":[[826,5]]},"836":{"position":[[1924,5],[2417,5]]},"989":{"position":[[244,5]]},"1008":{"position":[[26,5]]},"1258":{"position":[[52,5]]}},"keywords":{}}],["multiinst",{"_index":1256,"title":{"964":{"position":[[0,14]]},"1230":{"position":[[4,14]]}},"content":{"188":{"position":[[1149,14]]},"209":{"position":[[315,14]]},"255":{"position":[[659,14]]},"314":{"position":[[550,14]]},"334":{"position":[[463,14]]},"522":{"position":[[574,14],[604,13]]},"562":{"position":[[239,14]]},"579":{"position":[[472,14]]},"653":{"position":[[1379,13]]},"739":{"position":[[383,14]]},"749":{"position":[[15013,13]]},"755":{"position":[[22,13]]},"759":{"position":[[431,14]]},"838":{"position":[[2335,14]]},"960":{"position":[[469,14],[499,13]]},"964":{"position":[[123,13]]},"988":{"position":[[1109,13]]},"989":{"position":[[297,14]]},"995":{"position":[[188,14],[823,14]]},"1088":{"position":[[187,13],[558,13]]},"1126":{"position":[[93,14],[451,14],[610,14],[772,14],[909,14]]},"1171":{"position":[[242,14]]},"1174":{"position":[[747,14]]},"1230":{"position":[[108,14]]},"1277":{"position":[[419,14],[454,13]]},"1278":{"position":[[496,14],[948,14]]}},"keywords":{}}],["multilingu",{"_index":2454,"title":{},"content":{"401":{"position":[[278,12]]}},"keywords":{}}],["multipl",{"_index":69,"title":{"682":{"position":[[8,9]]},"1007":{"position":[[22,8]]},"1088":{"position":[[4,8]]},"1092":{"position":[[22,8]]}},"content":{"4":{"position":[[171,8]]},"6":{"position":[[180,8]]},"7":{"position":[[154,8]]},"16":{"position":[[505,8]]},"19":{"position":[[360,8]]},"47":{"position":[[925,8]]},"51":{"position":[[15,8]]},"89":{"position":[[69,8]]},"110":{"position":[[69,8]]},"112":{"position":[[271,8]]},"123":{"position":[[125,8]]},"125":{"position":[[121,8]]},"131":{"position":[[15,8]]},"134":{"position":[[51,8]]},"158":{"position":[[228,8]]},"160":{"position":[[84,8]]},"173":{"position":[[569,8]]},"174":{"position":[[1851,8],[1996,8],[2063,8],[2130,8]]},"181":{"position":[[316,8]]},"189":{"position":[[13,8]]},"190":{"position":[[77,8]]},"203":{"position":[[261,8],[334,8]]},"237":{"position":[[99,8]]},"240":{"position":[[53,8]]},"250":{"position":[[95,8],[277,8]]},"267":{"position":[[391,8],[631,8]]},"289":{"position":[[1291,8]]},"303":{"position":[[1016,8]]},"323":{"position":[[576,8]]},"328":{"position":[[108,8],[135,8],[271,8]]},"330":{"position":[[28,8]]},"336":{"position":[[15,8]]},"339":{"position":[[8,8]]},"354":{"position":[[264,8]]},"358":{"position":[[235,8]]},"365":{"position":[[1213,8],[1386,8]]},"367":{"position":[[456,8]]},"368":{"position":[[74,8],[327,8]]},"375":{"position":[[683,8]]},"376":{"position":[[176,8]]},"384":{"position":[[418,8]]},"390":{"position":[[886,8]]},"392":{"position":[[2161,8]]},"393":{"position":[[1091,8]]},"396":{"position":[[665,8]]},"398":{"position":[[378,8]]},"402":{"position":[[11,8]]},"404":{"position":[[547,8]]},"407":{"position":[[1065,8]]},"408":{"position":[[912,8],[4719,8]]},"411":{"position":[[4061,8],[4083,8],[4693,8]]},"412":{"position":[[2997,8],[11627,8],[13627,8]]},"416":{"position":[[301,8]]},"440":{"position":[[180,8]]},"444":{"position":[[723,8]]},"446":{"position":[[644,8]]},"455":{"position":[[315,8]]},"458":{"position":[[128,8]]},"469":{"position":[[199,8],[561,8],[1164,8]]},"473":{"position":[[222,8]]},"475":{"position":[[37,8]]},"481":{"position":[[219,8]]},"489":{"position":[[163,8]]},"490":{"position":[[370,8]]},"491":{"position":[[442,8],[1335,8]]},"495":{"position":[[110,8]]},"517":{"position":[[95,8]]},"519":{"position":[[35,8]]},"524":{"position":[[13,8]]},"534":{"position":[[520,8]]},"551":{"position":[[23,8]]},"559":{"position":[[1330,8]]},"560":{"position":[[485,8]]},"566":{"position":[[853,8],[888,8]]},"575":{"position":[[486,8]]},"581":{"position":[[15,8]]},"589":{"position":[[20,8]]},"594":{"position":[[518,8]]},"610":{"position":[[1533,8]]},"613":{"position":[[234,8]]},"617":{"position":[[238,8],[1039,8],[1933,8]]},"622":{"position":[[729,8]]},"632":{"position":[[525,8],[575,8]]},"634":{"position":[[402,8]]},"635":{"position":[[44,8]]},"643":{"position":[[94,8]]},"647":{"position":[[62,8]]},"682":{"position":[[154,8]]},"683":{"position":[[382,8]]},"705":{"position":[[1048,8]]},"707":{"position":[[168,8]]},"709":{"position":[[329,8]]},"710":{"position":[[1162,8]]},"723":{"position":[[811,8]]},"724":{"position":[[939,8]]},"743":{"position":[[157,8],[194,8]]},"749":{"position":[[9115,8]]},"757":{"position":[[13,8]]},"761":{"position":[[227,8]]},"772":{"position":[[132,8]]},"779":{"position":[[121,8]]},"782":{"position":[[61,8]]},"795":{"position":[[34,8]]},"800":{"position":[[432,8]]},"820":{"position":[[355,8]]},"834":{"position":[[11,8]]},"836":{"position":[[1867,8]]},"838":{"position":[[1166,8]]},"849":{"position":[[527,8]]},"860":{"position":[[852,8]]},"863":{"position":[[622,8]]},"866":{"position":[[273,8]]},"908":{"position":[[89,8]]},"934":{"position":[[837,8]]},"944":{"position":[[109,8]]},"947":{"position":[[32,8]]},"951":{"position":[[97,8]]},"956":{"position":[[113,8]]},"964":{"position":[[245,8]]},"966":{"position":[[31,8],[422,8]]},"981":{"position":[[1547,8]]},"987":{"position":[[6,8]]},"988":{"position":[[1158,8],[3295,8],[4624,8]]},"989":{"position":[[88,8]]},"1022":{"position":[[183,8]]},"1033":{"position":[[268,8]]},"1072":{"position":[[234,8],[1352,8]]},"1078":{"position":[[65,8]]},"1088":{"position":[[115,8],[252,8],[355,8]]},"1089":{"position":[[219,8]]},"1092":{"position":[[28,8],[131,8]]},"1102":{"position":[[1251,8],[1309,8],[1358,8]]},"1114":{"position":[[342,8]]},"1117":{"position":[[521,8]]},"1120":{"position":[[299,8],[620,8]]},"1135":{"position":[[180,8]]},"1164":{"position":[[591,8]]},"1174":{"position":[[72,8],[217,8]]},"1175":{"position":[[659,8]]},"1183":{"position":[[93,8],[188,8],[231,8]]},"1188":{"position":[[1,8]]},"1222":{"position":[[1172,8],[1221,8]]},"1246":{"position":[[1096,8]]},"1252":{"position":[[352,8]]},"1295":{"position":[[337,8],[598,8]]},"1301":{"position":[[104,8],[231,8],[715,8]]},"1304":{"position":[[660,8],[1049,8]]},"1305":{"position":[[73,8]]},"1307":{"position":[[165,8],[294,8]]},"1308":{"position":[[37,8]]},"1313":{"position":[[139,8]]},"1315":{"position":[[74,8]]},"1316":{"position":[[2543,8]]},"1318":{"position":[[180,8]]},"1321":{"position":[[909,8]]}},"keywords":{}}],["multiplay",{"_index":3949,"title":{},"content":{"699":{"position":[[634,11]]}},"keywords":{}}],["multipleof",{"_index":4398,"title":{},"content":{"749":{"position":[[20359,10]]},"1080":{"position":[[555,10],[595,11]]}},"keywords":{}}],["multiplex",{"_index":3645,"title":{},"content":{"617":{"position":[[1281,12]]},"621":{"position":[[845,12]]}},"keywords":{}}],["multithread",{"_index":6286,"title":{},"content":{"1238":{"position":[[240,14]]}},"keywords":{}}],["muscl",{"_index":2986,"title":{},"content":{"458":{"position":[[367,6]]}},"keywords":{}}],["mutabl",{"_index":4174,"title":{},"content":{"749":{"position":[[3092,7]]},"1065":{"position":[[676,7]]},"1085":{"position":[[208,7]]}},"keywords":{}}],["mutat",{"_index":451,"title":{},"content":{"28":{"position":[[137,8]]},"38":{"position":[[265,8],[424,8]]},"326":{"position":[[75,9]]},"705":{"position":[[674,7]]},"754":{"position":[[150,8]]},"785":{"position":[[366,8]]},"846":{"position":[[763,6],[1189,6]]},"848":{"position":[[262,6]]},"885":{"position":[[1059,8]]},"886":{"position":[[2325,8]]},"889":{"position":[[53,9],[229,8]]},"1042":{"position":[[51,7]]},"1052":{"position":[[63,7],[275,7]]},"1065":{"position":[[740,7]]},"1115":{"position":[[782,8]]},"1304":{"position":[[176,6]]},"1307":{"position":[[867,8]]},"1316":{"position":[[779,7],[1428,9]]},"1317":{"position":[[636,8]]},"1323":{"position":[[90,6]]}},"keywords":{}}],["mutationpushhuman",{"_index":5077,"title":{},"content":{"885":{"position":[[292,17]]}},"keywords":{}}],["mutex",{"_index":2990,"title":{},"content":{"458":{"position":[[1394,7]]}},"keywords":{}}],["mychangevalid",{"_index":5964,"title":{},"content":{"1106":{"position":[[771,17]]},"1109":{"position":[[171,17]]}},"keywords":{}}],["mychangevalidator(authdata",{"_index":5962,"title":{},"content":{"1106":{"position":[[536,27]]}},"keywords":{}}],["mychildst",{"_index":5986,"title":{},"content":{"1114":{"position":[[918,12]]}},"keywords":{}}],["mycollect",{"_index":3174,"title":{},"content":{"493":{"position":[[83,12]]},"494":{"position":[[187,12]]},"798":{"position":[[542,12]]},"812":{"position":[[7,12]]},"813":{"position":[[7,12]]},"916":{"position":[[317,12]]},"934":{"position":[[209,13]]},"949":{"position":[[141,12]]},"1002":{"position":[[575,13],[1229,13]]},"1055":{"position":[[190,12]]},"1056":{"position":[[98,12],[194,12]]},"1066":{"position":[[348,12]]},"1309":{"position":[[1372,13]]}},"keywords":{}}],["mycollection.$.subscribe(changeev",{"_index":5324,"title":{},"content":{"941":{"position":[[101,36]]}},"keywords":{}}],["mycollection.bulkinsert",{"_index":5331,"title":{},"content":{"944":{"position":[[198,26]]}},"keywords":{}}],["mycollection.bulkinsert(dataar",{"_index":4635,"title":{},"content":{"795":{"position":[[225,32]]}},"keywords":{}}],["mycollection.bulkremov",{"_index":5337,"title":{},"content":{"945":{"position":[[139,25],[460,25]]}},"keywords":{}}],["mycollection.bulkupsert",{"_index":5345,"title":{},"content":{"947":{"position":[[172,25]]}},"keywords":{}}],["mycollection.checkpoint$.subscribe(checkpoint",{"_index":5538,"title":{},"content":{"1002":{"position":[[334,45]]}},"keywords":{}}],["mycollection.clos",{"_index":5378,"title":{},"content":{"955":{"position":[[300,21]]}},"keywords":{}}],["mycollection.count",{"_index":5772,"title":{},"content":{"1067":{"position":[[290,20],[1284,20],[1551,20]]}},"keywords":{}}],["mycollection.customcleanupfunct",{"_index":5415,"title":{},"content":{"975":{"position":[[386,37],[609,37]]}},"keywords":{}}],["mycollection.exportjson",{"_index":5371,"title":{},"content":{"952":{"position":[[303,25]]}},"keywords":{}}],["mycollection.find",{"_index":974,"title":{},"content":{"77":{"position":[[212,19]]},"103":{"position":[[252,19]]},"234":{"position":[[312,19]]},"493":{"position":[[339,22]]},"494":{"position":[[291,23]]},"797":{"position":[[251,19]]},"799":{"position":[[577,21],[680,21]]},"1057":{"position":[[82,20]]},"1058":{"position":[[216,20]]},"1059":{"position":[[226,19]]},"1060":{"position":[[94,19]]},"1061":{"position":[[95,19]]},"1062":{"position":[[151,19]]},"1063":{"position":[[109,19],[213,19]]},"1065":{"position":[[209,19],[781,19],[1035,19],[1279,19]]},"1067":{"position":[[1964,19],[2108,19]]},"1072":{"position":[[2464,19],[2642,19]]}},"keywords":{}}],["mycollection.find().exec",{"_index":5669,"title":{},"content":{"1036":{"position":[[121,27]]}},"keywords":{}}],["mycollection.find().where('age').gt(18",{"_index":5762,"title":{},"content":{"1064":{"position":[[304,40]]},"1069":{"position":[[468,40]]}},"keywords":{}}],["mycollection.find().where('name').eq('foo",{"_index":5771,"title":{},"content":{"1065":{"position":[[1430,43]]}},"keywords":{}}],["mycollection.findbyids(id",{"_index":5362,"title":{},"content":{"951":{"position":[[383,28]]}},"keywords":{}}],["mycollection.findon",{"_index":5357,"title":{},"content":{"950":{"position":[[256,22]]}},"keywords":{}}],["mycollection.findone('foo",{"_index":5360,"title":{},"content":{"950":{"position":[[415,27]]}},"keywords":{}}],["mycollection.findone('foobar",{"_index":5736,"title":{},"content":{"1056":{"position":[[314,31]]}},"keywords":{}}],["mycollection.findone('foobar').exec",{"_index":5702,"title":{},"content":{"1045":{"position":[[77,38]]}},"keywords":{}}],["mycollection.findone().exec",{"_index":4561,"title":{},"content":{"770":{"position":[[463,30]]},"1057":{"position":[[454,30]]}},"keywords":{}}],["mycollection.findone().exec(tru",{"_index":5741,"title":{},"content":{"1057":{"position":[[606,34]]}},"keywords":{}}],["mycollection.getlocal$('foobar').subscribe(documentornul",{"_index":5606,"title":{},"content":{"1017":{"position":[[112,57]]}},"keywords":{}}],["mycollection.getlocal$('last",{"_index":5517,"title":{},"content":{"995":{"position":[[1900,28]]}},"keywords":{}}],["mycollection.getlocal('foobar",{"_index":5605,"title":{},"content":{"1016":{"position":[[135,32]]},"1018":{"position":[[77,32]]}},"keywords":{}}],["mycollection.importjson(json",{"_index":5374,"title":{},"content":{"953":{"position":[[102,29]]}},"keywords":{}}],["mycollection.incrementalupsert(docdata",{"_index":5351,"title":{},"content":{"948":{"position":[[561,40],[602,40],[643,40],[725,40]]}},"keywords":{}}],["mycollection.insert",{"_index":4663,"title":{},"content":{"800":{"position":[[814,23]]},"813":{"position":[[256,21]]},"942":{"position":[[188,21]]},"1035":{"position":[[102,21]]},"1058":{"position":[[411,23]]}},"keywords":{}}],["mycollection.insert$.subscribe(changeev",{"_index":5326,"title":{},"content":{"941":{"position":[[243,42]]}},"keywords":{}}],["mycollection.insert(docdata",{"_index":4634,"title":{},"content":{"795":{"position":[[175,29]]}},"keywords":{}}],["mycollection.insert(docu",{"_index":5802,"title":{},"content":{"1072":{"position":[[2419,30]]}},"keywords":{}}],["mycollection.insertifnotexist",{"_index":5330,"title":{},"content":{"943":{"position":[[385,32]]}},"keywords":{}}],["mycollection.insertloc",{"_index":5600,"title":{},"content":{"1014":{"position":[[200,25]]}},"keywords":{}}],["mycollection.insertlocal('last",{"_index":5507,"title":{},"content":{"995":{"position":[[1509,30]]}},"keywords":{}}],["mycollection.onclos",{"_index":5381,"title":{},"content":{"956":{"position":[[244,23]]}},"keywords":{}}],["mycollection.onremov",{"_index":5383,"title":{},"content":{"956":{"position":[[309,24]]}},"keywords":{}}],["mycollection.postcreate(function(plaindata",{"_index":4558,"title":{},"content":{"770":{"position":[[309,43]]}},"keywords":{}}],["mycollection.postinsert(function(plaindata",{"_index":4535,"title":{},"content":{"767":{"position":[[747,43],[827,43],[903,43]]}},"keywords":{}}],["mycollection.postremove(function(plaindata",{"_index":4556,"title":{},"content":{"769":{"position":[[718,43],[798,43],[874,43]]}},"keywords":{}}],["mycollection.postsave(function(plaindata",{"_index":4547,"title":{},"content":{"768":{"position":[[755,41],[833,41],[907,41]]}},"keywords":{}}],["mycollection.preinsert(function(plaindata",{"_index":4530,"title":{},"content":{"767":{"position":[[326,43],[444,43],[507,43],[643,43]]}},"keywords":{}}],["mycollection.preremove(function(plaindata",{"_index":4554,"title":{},"content":{"769":{"position":[[300,42],[379,42],[454,42],[602,42]]}},"keywords":{}}],["mycollection.presave(function(plaindata",{"_index":4542,"title":{},"content":{"768":{"position":[[283,40],[426,40],[499,40],[643,40]]}},"keywords":{}}],["mycollection.remov",{"_index":5376,"title":{},"content":{"954":{"position":[[143,22]]}},"keywords":{}}],["mycollection.remove$.subscribe(changeev",{"_index":5328,"title":{},"content":{"941":{"position":[[395,42]]}},"keywords":{}}],["mycollection.syncgraphql",{"_index":5171,"title":{},"content":{"890":{"position":[[15,26]]}},"keywords":{}}],["mycollection.update$.subscribe(changeev",{"_index":5327,"title":{},"content":{"941":{"position":[[319,42]]}},"keywords":{}}],["mycollection.upsert",{"_index":5344,"title":{},"content":{"946":{"position":[[160,21]]}},"keywords":{}}],["mycollection.upsert(docdata",{"_index":5350,"title":{},"content":{"948":{"position":[[437,29],[467,29]]}},"keywords":{}}],["mycollection.upsertloc",{"_index":5603,"title":{},"content":{"1015":{"position":[[176,25]]}},"keywords":{}}],["mycollection.upsertlocal<mylocaldocumenttype>",{"_index":5616,"title":{},"content":{"1018":{"position":[[797,52]]}},"keywords":{}}],["mycollection.upsertlocal('last",{"_index":5511,"title":{},"content":{"995":{"position":[[1698,30]]}},"keywords":{}}],["mycompon",{"_index":3180,"title":{},"content":{"494":{"position":[[173,13],[440,12]]}},"keywords":{}}],["myconflicthandl",{"_index":2689,"title":{},"content":{"412":{"position":[[4494,17]]}},"keywords":{}}],["mycrdtoper",{"_index":3866,"title":{},"content":{"678":{"position":[[234,15]]}},"keywords":{}}],["mycustomconflicthandl",{"_index":6497,"title":{},"content":{"1309":{"position":[[1491,23]]}},"keywords":{}}],["mycustomfetch",{"_index":4834,"title":{},"content":{"848":{"position":[[184,13],[845,14]]}},"keywords":{}}],["mycustomfetchmethod",{"_index":4826,"title":{},"content":{"846":{"position":[[618,20]]}},"keywords":{}}],["mydata",{"_index":6118,"title":{},"content":{"1165":{"position":[[465,9]]}},"keywords":{}}],["mydatabas",{"_index":36,"title":{},"content":{"1":{"position":[[561,13]]},"2":{"position":[[364,13]]},"3":{"position":[[244,13]]},"4":{"position":[[422,13]]},"5":{"position":[[332,13]]},"6":{"position":[[527,13]]},"7":{"position":[[364,13]]},"8":{"position":[[1133,13]]},"9":{"position":[[278,13]]},"10":{"position":[[316,13]]},"11":{"position":[[842,13]]},"392":{"position":[[368,13]]},"680":{"position":[[655,10]]},"717":{"position":[[1180,13]]},"718":{"position":[[683,13]]},"734":{"position":[[505,13]]},"745":{"position":[[554,13]]},"892":{"position":[[158,10],[295,11]]},"932":{"position":[[1068,13]]},"962":{"position":[[778,13],[994,13]]},"1013":{"position":[[279,10],[323,13]]},"1067":{"position":[[2402,13]]},"1154":{"position":[[770,13]]},"1163":{"position":[[564,12]]},"1182":{"position":[[568,12]]},"1184":{"position":[[807,12]]},"1210":{"position":[[446,13]]},"1211":{"position":[[701,13]]},"1222":{"position":[[1417,13]]},"1226":{"position":[[242,13]]},"1227":{"position":[[720,13]]},"1231":{"position":[[1051,13]]},"1237":{"position":[[820,10]]},"1238":{"position":[[795,10]]},"1239":{"position":[[765,10]]},"1264":{"position":[[164,13]]},"1265":{"position":[[708,13]]},"1311":{"position":[[107,11],[119,10]]}},"keywords":{}}],["mydatabase.addcollect",{"_index":2495,"title":{},"content":{"403":{"position":[[725,27]]},"751":{"position":[[465,27],[769,27],[1567,27]]},"752":{"position":[[370,27]]},"789":{"position":[[166,27],[413,27]]},"791":{"position":[[22,27],[281,27]]},"792":{"position":[[149,27]]},"806":{"position":[[577,27]]},"812":{"position":[[28,27]]},"813":{"position":[[28,27]]},"818":{"position":[[493,27]]},"916":{"position":[[338,27]]},"934":{"position":[[231,27]]},"979":{"position":[[308,27]]},"1013":{"position":[[463,27]]},"1075":{"position":[[7,27]]},"1090":{"position":[[958,29]]},"1309":{"position":[[1394,27]]},"1311":{"position":[[968,27]]}},"keywords":{}}],["mydatabase.backup(backupopt",{"_index":3732,"title":{},"content":{"647":{"position":[[397,33],[538,33]]},"648":{"position":[[246,33]]},"649":{"position":[[202,33]]}},"keywords":{}}],["mydatabase.clos",{"_index":5417,"title":{},"content":{"976":{"position":[[319,19]]},"1311":{"position":[[1829,19]]}},"keywords":{}}],["mydatabase.collections$.subscribe(ev",{"_index":5425,"title":{},"content":{"979":{"position":[[230,39]]}},"keywords":{}}],["mydatabase.exportjson",{"_index":5410,"title":{},"content":{"971":{"position":[[415,23]]}},"keywords":{}}],["mydatabase.heroes.countalldocu",{"_index":6521,"title":{},"content":{"1311":{"position":[[1751,38]]}},"keywords":{}}],["mydatabase.heroes.insert",{"_index":6515,"title":{},"content":{"1311":{"position":[[1486,26]]}},"keywords":{}}],["mydatabase.heroes.postinsert",{"_index":6511,"title":{},"content":{"1311":{"position":[[1113,29]]}},"keywords":{}}],["mydatabase.insertloc",{"_index":5601,"title":{},"content":{"1014":{"position":[[341,23]]}},"keywords":{}}],["mydatabase.migrationst",{"_index":4475,"title":{},"content":{"753":{"position":[[258,29]]}},"keywords":{}}],["mydatabase.remov",{"_index":5418,"title":{},"content":{"977":{"position":[[78,20]]}},"keywords":{}}],["mydatabase.requestidlepromise().then",{"_index":5414,"title":{},"content":{"975":{"position":[[271,39]]}},"keywords":{}}],["mydatabase.requestidlepromise(1000",{"_index":5416,"title":{},"content":{"975":{"position":[[444,34]]}},"keywords":{}}],["mydatabase.todos.find",{"_index":1640,"title":{},"content":{"276":{"position":[[405,23]]}},"keywords":{}}],["mydatabase[collectionnam",{"_index":4201,"title":{},"content":{"749":{"position":[[5050,26]]}},"keywords":{}}],["mydb",{"_index":845,"title":{},"content":{"55":{"position":[[898,7]]},"255":{"position":[[614,7]]},"258":{"position":[[175,7]]},"542":{"position":[[559,7]]},"825":{"position":[[366,7]]},"862":{"position":[[564,7]]},"872":{"position":[[3996,5]]},"898":{"position":[[2346,7]]},"1090":{"position":[[807,7]]},"1118":{"position":[[670,7]]},"1148":{"position":[[1149,7]]},"1149":{"position":[[942,7]]},"1218":{"position":[[555,4]]},"1219":{"position":[[868,4]]},"1311":{"position":[[192,7]]}},"keywords":{}}],["mydb.$.subscribe(changeev",{"_index":5409,"title":{},"content":{"970":{"position":[[96,28]]}},"keywords":{}}],["mydestinationcollect",{"_index":5619,"title":{},"content":{"1020":{"position":[[429,24]]}},"keywords":{}}],["mydestinationcollection.insert",{"_index":5620,"title":{},"content":{"1020":{"position":[[603,32]]}},"keywords":{}}],["mydocu",{"_index":3876,"title":{},"content":{"680":{"position":[[1218,10]]},"717":{"position":[[1619,12]]},"800":{"position":[[795,10]]},"1045":{"position":[[58,10]]},"1046":{"position":[[120,12]]}},"keywords":{}}],["mydocument.allattach",{"_index":5300,"title":{},"content":{"920":{"position":[[77,28]]}},"keywords":{}}],["mydocument.allattachments$.subscrib",{"_index":5301,"title":{},"content":{"921":{"position":[[172,37]]}},"keywords":{}}],["mydocument.deleted$.subscribe(st",{"_index":5716,"title":{},"content":{"1049":{"position":[[102,35]]}},"keywords":{}}],["mydocument.family.mother_",{"_index":4690,"title":{},"content":{"812":{"position":[[259,26]]}},"keywords":{}}],["mydocument.firstname$.subscribe(newnam",{"_index":1423,"title":{},"content":{"235":{"position":[[274,39]]},"571":{"position":[[1309,39]]},"1040":{"position":[[317,39]]}},"keywords":{}}],["mydocument.friends_",{"_index":4694,"title":{},"content":{"813":{"position":[[415,20]]}},"keywords":{}}],["mydocument.get$('nam",{"_index":5673,"title":{},"content":{"1039":{"position":[[196,23]]}},"keywords":{}}],["mydocument.get('nam",{"_index":5670,"title":{},"content":{"1038":{"position":[[141,23]]},"1040":{"position":[[150,23]]}},"keywords":{}}],["mydocument.getattachment('cat.jpg",{"_index":5298,"title":{},"content":{"919":{"position":[[105,36]]},"929":{"position":[[88,36]]},"930":{"position":[[93,36]]},"931":{"position":[[93,36]]},"932":{"position":[[93,36]]}},"keywords":{}}],["mydocument.getlatest",{"_index":5705,"title":{},"content":{"1045":{"position":[[203,23]]}},"keywords":{}}],["mydocument.incrementalmodify(docdata",{"_index":5697,"title":{},"content":{"1044":{"position":[[373,36]]}},"keywords":{}}],["mydocument.incrementalpatch",{"_index":5699,"title":{},"content":{"1044":{"position":[[484,29]]},"1045":{"position":[[143,29]]}},"keywords":{}}],["mydocument.incrementalpatch({firstnam",{"_index":5681,"title":{},"content":{"1040":{"position":[[431,39]]}},"keywords":{}}],["mydocument.incrementalpatch({nam",{"_index":5675,"title":{},"content":{"1039":{"position":[[275,34]]}},"keywords":{}}],["mydocument.incrementalremov",{"_index":5700,"title":{},"content":{"1044":{"position":[[543,30]]}},"keywords":{}}],["mydocument.incrementalupd",{"_index":5696,"title":{},"content":{"1044":{"position":[[283,30]]}},"keywords":{}}],["mydocument.modify(changefunct",{"_index":5693,"title":{},"content":{"1042":{"position":[[231,34]]}},"keywords":{}}],["mydocument.nam",{"_index":5671,"title":{},"content":{"1038":{"position":[[204,16]]},"1039":{"position":[[377,16]]},"1040":{"position":[[185,16]]}},"keywords":{}}],["mydocument.patch",{"_index":5695,"title":{},"content":{"1043":{"position":[[65,18]]}},"keywords":{}}],["mydocument.putattach",{"_index":4664,"title":{},"content":{"800":{"position":[[873,25]]},"917":{"position":[[141,25]]}},"keywords":{}}],["mydocument.remov",{"_index":5711,"title":{},"content":{"1047":{"position":[[232,20]]},"1049":{"position":[[203,20]]},"1050":{"position":[[97,20]]}},"keywords":{}}],["mydocument.tojosn",{"_index":5899,"title":{},"content":{"1085":{"position":[[2514,19]]}},"keywords":{}}],["mydocument.tojson",{"_index":5721,"title":{},"content":{"1051":{"position":[[171,20]]}},"keywords":{}}],["mydocument.tojson(tru",{"_index":5727,"title":{},"content":{"1051":{"position":[[437,24]]}},"keywords":{}}],["mydocument.tomutablejson",{"_index":5729,"title":{},"content":{"1052":{"position":[[189,27]]}},"keywords":{}}],["mydocument.upd",{"_index":5687,"title":{},"content":{"1041":{"position":[[279,19]]}},"keywords":{}}],["mydocument.updatecrdt",{"_index":3878,"title":{},"content":{"680":{"position":[[1346,23]]},"681":{"position":[[620,23]]},"682":{"position":[[322,23]]}},"keywords":{}}],["mydocument.whatever.nestedfield",{"_index":5679,"title":{},"content":{"1040":{"position":[[251,32]]}},"keywords":{}}],["myencrypteddatabas",{"_index":3347,"title":{},"content":{"554":{"position":[[1077,22]]}},"keywords":{}}],["myencryptionpassword",{"_index":3714,"title":{},"content":{"638":{"position":[[504,22]]}},"keywords":{}}],["myendpoint",{"_index":5930,"title":{},"content":{"1100":{"position":[[637,10]]}},"keywords":{}}],["myeventsourceconstructor",{"_index":5075,"title":{},"content":{"882":{"position":[[443,24]]}},"keywords":{}}],["myfield",{"_index":4560,"title":{},"content":{"770":{"position":[[400,10]]},"1115":{"position":[[206,7]]}},"keywords":{}}],["myfirstqueri",{"_index":4711,"title":{},"content":{"820":{"position":[[516,12],[545,13]]}},"keywords":{}}],["myheroschema",{"_index":5831,"title":{},"content":{"1075":{"position":[[53,12]]}},"keywords":{}}],["myid",{"_index":6516,"title":{},"content":{"1311":{"position":[[1525,7]]}},"keywords":{}}],["myindexeddbobjectstore.createindex",{"_index":6425,"title":{},"content":{"1294":{"position":[[525,35]]},"1296":{"position":[[985,35],[1069,35]]}},"keywords":{}}],["myionicdb",{"_index":1888,"title":{},"content":{"314":{"position":[[500,12]]}},"keywords":{}}],["mylocaldb",{"_index":1379,"title":{},"content":{"211":{"position":[[237,12]]}},"keywords":{}}],["mylocaldocumenttyp",{"_index":5615,"title":{},"content":{"1018":{"position":[[736,19]]}},"keywords":{}}],["mymethod.bind(mydocu",{"_index":5731,"title":{},"content":{"1052":{"position":[[484,25]]}},"keywords":{}}],["myofflinedb",{"_index":3124,"title":{},"content":{"480":{"position":[[393,14]]}},"keywords":{}}],["myolddatabasenam",{"_index":4491,"title":{},"content":{"759":{"position":[[637,20]]},"760":{"position":[[633,20]]}},"keywords":{}}],["myownhashfunct",{"_index":5407,"title":{},"content":{"968":{"position":[[540,17]]}},"keywords":{}}],["myownhashfunction(input",{"_index":5405,"title":{},"content":{"968":{"position":[[414,24]]}},"keywords":{}}],["mypassword",{"_index":1942,"title":{},"content":{"334":{"position":[[417,13]]},"522":{"position":[[531,13]]},"579":{"position":[[426,13]]},"739":{"position":[[369,13]]},"848":{"position":[[1527,14]]},"960":{"position":[[426,13]]}},"keywords":{}}],["mypasswordobject",{"_index":4031,"title":{},"content":{"718":{"position":[[459,16],[743,16]]}},"keywords":{}}],["mypostinserthook",{"_index":6512,"title":{},"content":{"1311":{"position":[[1152,17]]}},"keywords":{}}],["mypullstream",{"_index":5048,"title":{},"content":{"875":{"position":[[8077,13],[9496,13]]}},"keywords":{}}],["mypullstream$.asobserv",{"_index":5057,"title":{},"content":{"875":{"position":[[8470,28],[9759,28]]}},"keywords":{}}],["mypullstream$.next",{"_index":5054,"title":{},"content":{"875":{"position":[[8285,20]]}},"keywords":{}}],["mypullstream$.next('resync",{"_index":5059,"title":{},"content":{"875":{"position":[[8990,29],[9657,29]]}},"keywords":{}}],["mypullstream$.next(ev",{"_index":5034,"title":{},"content":{"875":{"position":[[5498,26]]}},"keywords":{}}],["myqueri",{"_index":4647,"title":{},"content":{"797":{"position":[[241,7]]}},"keywords":{}}],["myquerymodifi",{"_index":5957,"title":{},"content":{"1105":{"position":[[831,15]]}},"keywords":{}}],["myquerymodifier(authdata",{"_index":5954,"title":{},"content":{"1105":{"position":[[602,25]]}},"keywords":{}}],["myrandompasswordwithmin8length",{"_index":4036,"title":{},"content":{"718":{"position":[[573,32]]}},"keywords":{}}],["myreplicationstate.active$.pip",{"_index":5508,"title":{},"content":{"995":{"position":[[1594,32]]}},"keywords":{}}],["myreplicationstate.awaitinsync",{"_index":5510,"title":{},"content":{"995":{"position":[[1658,33]]}},"keywords":{}}],["myrxcollect",{"_index":4051,"title":{},"content":{"724":{"position":[[741,15]]},"846":{"position":[[223,15]]},"848":{"position":[[740,15],[1375,15]]},"852":{"position":[[258,15]]},"854":{"position":[[705,15]]},"858":{"position":[[216,15]]},"866":{"position":[[460,15]]},"875":{"position":[[460,15]]},"886":{"position":[[1042,15],[2674,15],[3861,15]]},"887":{"position":[[327,15]]},"888":{"position":[[468,15]]},"889":{"position":[[517,15]]},"890":{"position":[[817,15]]},"893":{"position":[[386,15]]},"988":{"position":[[284,15]]}},"keywords":{}}],["myrxcollection.cleanup",{"_index":3761,"title":{},"content":{"654":{"position":[[178,25]]}},"keywords":{}}],["myrxcollection.cleanup(0",{"_index":3763,"title":{},"content":{"654":{"position":[[452,26]]},"655":{"position":[[490,26]]}},"keywords":{}}],["myrxcollection.cleanup(1000",{"_index":3762,"title":{},"content":{"654":{"position":[[302,29]]}},"keywords":{}}],["myrxcollection.find().remov",{"_index":3768,"title":{},"content":{"655":{"position":[[421,31]]}},"keywords":{}}],["myrxcollection.findone(id).exec",{"_index":5835,"title":{},"content":{"1078":{"position":[[1129,34]]}},"keywords":{}}],["myrxcollection.insert",{"_index":3884,"title":{},"content":{"683":{"position":[[170,23]]},"1078":{"position":[[861,23]]}},"keywords":{}}],["myrxcollection.insertcrdt",{"_index":3886,"title":{},"content":{"683":{"position":[[268,27],[730,27]]}},"keywords":{}}],["myrxcollection.remov",{"_index":3765,"title":{},"content":{"655":{"position":[[125,24]]}},"keywords":{}}],["myrxcollection.schema.getprimaryofdocumentdata",{"_index":5834,"title":{},"content":{"1078":{"position":[[1021,48]]}},"keywords":{}}],["myrxcollection.storageinst",{"_index":6145,"title":{},"content":{"1177":{"position":[[252,31]]}},"keywords":{}}],["myrxdatabas",{"_index":3813,"title":{},"content":{"662":{"position":[[2105,12]]},"772":{"position":[[1594,12],[2356,12]]},"838":{"position":[[2183,12]]},"1090":{"position":[[761,12],[1047,13]]},"1097":{"position":[[732,13]]},"1098":{"position":[[368,13]]},"1099":{"position":[[342,13]]},"1103":{"position":[[227,13]]},"1125":{"position":[[266,12]]},"1130":{"position":[[139,12]]},"1189":{"position":[[383,12]]},"1219":{"position":[[576,12]]},"1220":{"position":[[255,13]]},"1271":{"position":[[1549,12]]},"1274":{"position":[[300,12]]},"1275":{"position":[[311,12]]},"1276":{"position":[[913,12]]},"1277":{"position":[[360,12]]},"1278":{"position":[[437,12],[889,12]]},"1279":{"position":[[687,12]]},"1280":{"position":[[422,12]]}},"keywords":{}}],["myrxdatabase.addcollect",{"_index":3816,"title":{},"content":{"662":{"position":[[2332,29]]},"710":{"position":[[1821,29]]},"838":{"position":[[2546,29]]}},"keywords":{}}],["myrxdocu",{"_index":4738,"title":{},"content":{"826":{"position":[[601,16]]},"1078":{"position":[[1114,12]]}},"keywords":{}}],["myrxdocument.delet",{"_index":4739,"title":{},"content":{"826":{"position":[[697,23]]}},"keywords":{}}],["myrxdocument.foobar",{"_index":4737,"title":{},"content":{"826":{"position":[[508,22]]}},"keywords":{}}],["myrxdocument.get$$('foobar",{"_index":4736,"title":{},"content":{"826":{"position":[[446,29]]}},"keywords":{}}],["myrxdocument1",{"_index":5340,"title":{},"content":{"945":{"position":[[486,14]]}},"keywords":{}}],["myrxdocument2",{"_index":5341,"title":{},"content":{"945":{"position":[[501,14]]}},"keywords":{}}],["myrxjsonschema",{"_index":4710,"title":{},"content":{"820":{"position":[[193,15]]}},"keywords":{}}],["myrxlocaldocu",{"_index":4742,"title":{},"content":{"826":{"position":[[1028,21]]}},"keywords":{}}],["myrxlocaldocument.get$$('foobar",{"_index":4743,"title":{},"content":{"826":{"position":[[1112,34]]}},"keywords":{}}],["myrxpipeline.awaitidl",{"_index":5650,"title":{},"content":{"1026":{"position":[[53,25]]}},"keywords":{}}],["myrxpipeline.clos",{"_index":5651,"title":{},"content":{"1027":{"position":[[7,20]]}},"keywords":{}}],["myrxpipeline.remov",{"_index":5652,"title":{},"content":{"1028":{"position":[[7,21]]}},"keywords":{}}],["myrxreplicationstate.active$.subscribe(bool",{"_index":5500,"title":{},"content":{"993":{"position":[[680,43]]}},"keywords":{}}],["myrxreplicationstate.awaitinitialrepl",{"_index":5501,"title":{},"content":{"994":{"position":[[278,47]]}},"keywords":{}}],["myrxreplicationstate.awaitinsync",{"_index":5505,"title":{},"content":{"995":{"position":[[395,35]]}},"keywords":{}}],["myrxreplicationstate.cancel",{"_index":5523,"title":{},"content":{"997":{"position":[[102,30]]}},"keywords":{}}],["myrxreplicationstate.canceled$.subscribe(bool",{"_index":5498,"title":{},"content":{"993":{"position":[[541,45]]}},"keywords":{}}],["myrxreplicationstate.error$.subscribe(err",{"_index":5592,"title":{},"content":{"1010":{"position":[[275,41]]}},"keywords":{}}],["myrxreplicationstate.error$.subscribe(error",{"_index":5496,"title":{},"content":{"993":{"position":[[405,43]]}},"keywords":{}}],["myrxreplicationstate.paus",{"_index":5525,"title":{},"content":{"998":{"position":[[108,29]]}},"keywords":{}}],["myrxreplicationstate.received$.subscribe(doc",{"_index":5494,"title":{},"content":{"993":{"position":[[142,44]]}},"keywords":{}}],["myrxreplicationstate.remov",{"_index":5529,"title":{},"content":{"999":{"position":[[287,30]]}},"keywords":{}}],["myrxreplicationstate.resync",{"_index":5522,"title":{},"content":{"996":{"position":[[270,30],[553,30]]}},"keywords":{}}],["myrxreplicationstate.sent$.subscribe(doc",{"_index":5495,"title":{},"content":{"993":{"position":[[263,40]]}},"keywords":{}}],["myrxreplicationstate.start",{"_index":5526,"title":{},"content":{"998":{"position":[[144,29]]}},"keywords":{}}],["myrxschema",{"_index":4746,"title":{},"content":{"829":{"position":[[765,10]]}},"keywords":{}}],["myrxserver.addreplicationendpoint",{"_index":5928,"title":{},"content":{"1100":{"position":[[390,36]]}},"keywords":{}}],["myrxstate.myfield",{"_index":5990,"title":{},"content":{"1116":{"position":[[290,18]]}},"keywords":{}}],["mys3cretp4ssw0rd",{"_index":1899,"title":{},"content":{"315":{"position":[[617,18]]}},"keywords":{}}],["myschema",{"_index":2121,"title":{},"content":{"367":{"position":[[700,8]]},"680":{"position":[[798,8],[1176,8]]},"720":{"position":[[124,8]]},"734":{"position":[[600,8],[890,8]]},"739":{"position":[[456,8]]},"772":{"position":[[967,8]]},"789":{"position":[[212,9],[459,9]]},"791":{"position":[[68,9],[327,9]]},"792":{"position":[[195,9]]},"806":{"position":[[620,9]]},"818":{"position":[[539,9]]},"862":{"position":[[618,8],[851,8]]},"916":{"position":[[131,8],[384,8]]},"932":{"position":[[1183,8]]},"934":{"position":[[301,9]]},"939":{"position":[[194,8]]},"979":{"position":[[354,8]]},"1078":{"position":[[114,8]]},"1222":{"position":[[536,8]]},"1309":{"position":[[1464,9]]}},"keywords":{}}],["mysecondqueri",{"_index":4712,"title":{},"content":{"820":{"position":[[596,14]]}},"keywords":{}}],["mysecretid",{"_index":3354,"title":{},"content":{"555":{"position":[[302,13]]}},"keywords":{}}],["myserv",{"_index":5911,"title":{},"content":{"1090":{"position":[[1004,8]]},"1097":{"position":[[688,8]]},"1098":{"position":[[324,8]]},"1099":{"position":[[298,8]]},"1103":{"position":[[184,8]]}},"keywords":{}}],["myserver.start",{"_index":5920,"title":{},"content":{"1097":{"position":[[278,16],[881,17]]},"1098":{"position":[[435,17]]},"1099":{"position":[[405,17]]}},"keywords":{}}],["myservercollect",{"_index":5931,"title":{},"content":{"1100":{"position":[[715,18]]},"1101":{"position":[[527,18]]},"1102":{"position":[[400,18]]},"1103":{"position":[[370,19]]},"1105":{"position":[[796,19]]},"1106":{"position":[[734,19]]}},"keywords":{}}],["mysign",{"_index":6005,"title":{},"content":{"1118":{"position":[[798,8],[841,8]]}},"keywords":{}}],["mysourcecollection.addpipelin",{"_index":5618,"title":{},"content":{"1020":{"position":[[356,32]]}},"keywords":{}}],["mysql",{"_index":2033,"title":{"356":{"position":[[30,6]]}},"content":{"356":{"position":[[90,6]]},"571":{"position":[[554,5]]},"708":{"position":[[138,6]]},"1124":{"position":[[2072,5]]}},"keywords":{}}],["mysql’",{"_index":2092,"title":{},"content":{"362":{"position":[[372,7]]}},"keywords":{}}],["mystat",{"_index":5983,"title":{},"content":{"1114":{"position":[[822,7]]},"1118":{"position":[[755,7]]},"1121":{"position":[[535,7]]}},"keywords":{}}],["mystate.collect",{"_index":6009,"title":{},"content":{"1121":{"position":[[633,19]]}},"keywords":{}}],["mystate.get",{"_index":5992,"title":{},"content":{"1116":{"position":[[345,14]]}},"keywords":{}}],["mystate.get$$('myfield",{"_index":6006,"title":{},"content":{"1118":{"position":[[809,25]]}},"keywords":{}}],["mystate.get$('myfield",{"_index":5999,"title":{},"content":{"1117":{"position":[[328,24]]}},"keywords":{}}],["mystate.get('myarrayfield[0].foobar",{"_index":5997,"title":{},"content":{"1116":{"position":[[599,38]]}},"keywords":{}}],["mystate.get('myfield",{"_index":5993,"title":{},"content":{"1116":{"position":[[395,23]]}},"keywords":{}}],["mystate.get('myfield.childfield",{"_index":5995,"title":{},"content":{"1116":{"position":[[483,34]]}},"keywords":{}}],["mystate.myarrayfield[0].foobar",{"_index":5998,"title":{},"content":{"1116":{"position":[[650,31]]}},"keywords":{}}],["mystate.myfield",{"_index":5994,"title":{},"content":{"1116":{"position":[[431,16]]},"1117":{"position":[[290,17],[372,17]]},"1118":{"position":[[852,18]]}},"keywords":{}}],["mystate.myfield.childfield",{"_index":5996,"title":{},"content":{"1116":{"position":[[530,27]]}},"keywords":{}}],["mystate.set('myfield",{"_index":5988,"title":{},"content":{"1115":{"position":[[319,22],[385,22],[455,22]]}},"keywords":{}}],["mystoragebucket",{"_index":6059,"title":{},"content":{"1140":{"position":[[705,15]]}},"keywords":{}}],["mystoragebucket.indexeddb",{"_index":6062,"title":{},"content":{"1140":{"position":[[799,26]]}},"keywords":{}}],["mystrongpassword123",{"_index":3437,"title":{},"content":{"564":{"position":[[667,21]]}},"keywords":{}}],["mytododb",{"_index":5256,"title":{},"content":{"904":{"position":[[739,11]]}},"keywords":{}}],["mytopsecretpassword",{"_index":3137,"title":{},"content":{"482":{"position":[[694,21]]}},"keywords":{}}],["myvalu",{"_index":4770,"title":{},"content":{"835":{"position":[[473,11]]}},"keywords":{}}],["myzerolocaldb",{"_index":3704,"title":{},"content":{"632":{"position":[[1313,16]]}},"keywords":{}}],["n",{"_index":3637,"title":{},"content":{"617":{"position":[[765,1]]}},"keywords":{}}],["n1ql",{"_index":415,"title":{},"content":{"25":{"position":[[120,4]]}},"keywords":{}}],["n\\n",{"_index":5046,"title":{},"content":{"875":{"position":[[7483,8]]}},"keywords":{}}],["nakamoto",{"_index":4713,"title":{},"content":{"820":{"position":[[660,10]]}},"keywords":{}}],["name",{"_index":35,"title":{"935":{"position":[[0,5]]},"961":{"position":[[0,5]]}},"content":{"1":{"position":[[555,5]]},"2":{"position":[[358,5]]},"3":{"position":[[238,5]]},"4":{"position":[[416,5]]},"5":{"position":[[326,5]]},"6":{"position":[[521,5],[700,5]]},"7":{"position":[[358,5],[422,4],[535,5],[618,4]]},"8":{"position":[[1127,5],[1204,4]]},"9":{"position":[[272,5],[347,4]]},"10":{"position":[[310,5]]},"11":{"position":[[836,5]]},"51":{"position":[[443,5],[515,7],[718,5],[743,4]]},"52":{"position":[[109,5],[209,5],[252,5],[421,5],[511,5],[658,5]]},"54":{"position":[[180,5]]},"55":{"position":[[892,5]]},"130":{"position":[[535,5]]},"143":{"position":[[475,5],[656,5]]},"188":{"position":[[1062,5],[1320,5],[1415,9],[1442,7]]},"189":{"position":[[487,4]]},"209":{"position":[[261,5]]},"211":{"position":[[231,5]]},"255":{"position":[[608,5]]},"258":{"position":[[169,5]]},"266":{"position":[[683,5]]},"302":{"position":[[136,5]]},"303":{"position":[[350,5]]},"314":{"position":[[494,5]]},"315":{"position":[[557,5]]},"316":{"position":[[442,5]]},"334":{"position":[[352,5],[705,5]]},"335":{"position":[[773,5]]},"345":{"position":[[50,6]]},"356":{"position":[[362,4],[445,6]]},"361":{"position":[[276,5],[375,5]]},"367":{"position":[[913,5],[1053,7]]},"392":{"position":[[362,5]]},"401":{"position":[[136,4]]},"402":{"position":[[2098,4]]},"422":{"position":[[340,6]]},"426":{"position":[[308,5]]},"444":{"position":[[766,4]]},"480":{"position":[[387,5]]},"482":{"position":[[632,5]]},"522":{"position":[[433,5],[460,4]]},"538":{"position":[[448,5],[473,4],[744,5],[816,7]]},"539":{"position":[[109,5],[209,5],[252,5],[421,5],[511,5],[658,5]]},"542":{"position":[[553,5]]},"554":{"position":[[1071,5]]},"562":{"position":[[186,5],[391,5],[463,7],[585,5]]},"563":{"position":[[498,5]]},"564":{"position":[[602,5]]},"579":{"position":[[361,5],[713,5]]},"580":{"position":[[555,5]]},"588":{"position":[[34,5]]},"598":{"position":[[455,5],[480,4],[751,5],[823,7]]},"599":{"position":[[118,5],[227,5],[279,5],[448,5],[538,5],[689,5]]},"612":{"position":[[985,5]]},"632":{"position":[[1307,5]]},"638":{"position":[[449,5]]},"639":{"position":[[79,6],[140,5]]},"653":{"position":[[272,5]]},"662":{"position":[[2145,5],[2482,5],[2552,7],[2633,5],[2722,5],[2810,5]]},"680":{"position":[[693,5]]},"691":{"position":[[107,5],[362,5]]},"693":{"position":[[1193,5]]},"710":{"position":[[1714,5],[1940,5],[2029,5],[2117,5]]},"711":{"position":[[1291,6]]},"717":{"position":[[1174,5]]},"718":{"position":[[677,5]]},"734":{"position":[[499,5]]},"739":{"position":[[303,5]]},"745":{"position":[[548,5]]},"749":{"position":[[19,4],[126,5],[290,6],[320,4],[349,4],[1426,4],[4898,5],[5284,4],[5610,4],[6239,5],[6494,4],[6513,5],[6519,4],[7675,4],[8160,4],[8252,5],[8467,4],[16938,4]]},"759":{"position":[[379,5],[506,4],[611,5]]},"760":{"position":[[502,4],[607,5]]},"772":{"position":[[789,5],[1046,5],[1634,5],[2396,5]]},"773":{"position":[[86,4],[579,5]]},"774":{"position":[[681,5]]},"789":{"position":[[137,6]]},"791":{"position":[[435,5]]},"808":{"position":[[200,7],[222,5],[556,7],[594,5]]},"810":{"position":[[221,5],[292,5]]},"811":{"position":[[201,5],[272,5]]},"812":{"position":[[117,5]]},"813":{"position":[[117,5],[278,5]]},"825":{"position":[[360,5]]},"829":{"position":[[658,5],[2436,5],[3352,5]]},"838":{"position":[[2246,5],[2316,5],[2696,5],[2766,7],[2847,5],[2936,5],[3024,5]]},"851":{"position":[[222,4]]},"854":{"position":[[466,7]]},"861":{"position":[[1930,4],[2039,5]]},"862":{"position":[[558,5],[751,5],[796,7]]},"865":{"position":[[229,4]]},"866":{"position":[[566,4]]},"872":{"position":[[1732,5],[3399,5],[3990,5]]},"885":{"position":[[547,5],[642,5]]},"886":{"position":[[704,4],[2418,4],[3615,5]]},"888":{"position":[[1129,5]]},"893":{"position":[[319,4],[365,5]]},"898":{"position":[[1716,4],[2340,5],[3933,5]]},"904":{"position":[[733,5],[1930,6]]},"917":{"position":[[196,4]]},"932":{"position":[[1062,5]]},"934":{"position":[[140,4]]},"935":{"position":[[5,4],[177,5],[194,5]]},"939":{"position":[[70,4]]},"942":{"position":[[210,5]]},"943":{"position":[[418,5]]},"944":{"position":[[225,5],[261,5]]},"946":{"position":[[182,5]]},"947":{"position":[[200,5],[235,5]]},"948":{"position":[[392,5]]},"950":{"position":[[291,5]]},"960":{"position":[[301,5],[328,4]]},"961":{"position":[[14,4],[106,4]]},"962":{"position":[[772,5],[988,5]]},"966":{"position":[[75,4],[556,5],[674,5]]},"967":{"position":[[141,5],[259,5]]},"1013":{"position":[[317,5]]},"1035":{"position":[[124,5]]},"1038":{"position":[[134,4],[180,4],[197,4]]},"1039":{"position":[[177,6]]},"1040":{"position":[[178,4],[408,5],[490,5]]},"1043":{"position":[[84,5]]},"1056":{"position":[[134,5]]},"1065":{"position":[[241,5],[813,5],[973,4],[998,4],[1076,5],[1102,5],[1311,5]]},"1067":{"position":[[2396,5]]},"1069":{"position":[[699,4]]},"1072":{"position":[[2352,5],[2674,5]]},"1074":{"position":[[123,4],[552,4]]},"1085":{"position":[[2072,6],[2274,4],[2321,5],[3736,4],[3775,5]]},"1090":{"position":[[801,5]]},"1100":{"position":[[450,4],[566,4],[682,5]]},"1101":{"position":[[494,5]]},"1102":{"position":[[367,5]]},"1103":{"position":[[337,5]]},"1105":{"position":[[763,5]]},"1106":{"position":[[701,5]]},"1108":{"position":[[431,5]]},"1114":{"position":[[730,5]]},"1118":{"position":[[664,5]]},"1121":{"position":[[470,5]]},"1125":{"position":[[306,5]]},"1126":{"position":[[386,5],[699,5]]},"1130":{"position":[[179,5]]},"1134":{"position":[[156,5]]},"1138":{"position":[[300,5]]},"1139":{"position":[[555,5]]},"1140":{"position":[[614,5]]},"1144":{"position":[[204,5]]},"1145":{"position":[[544,5]]},"1146":{"position":[[249,5]]},"1148":{"position":[[1143,5]]},"1149":{"position":[[936,5],[1149,5],[1219,7]]},"1154":{"position":[[764,5]]},"1158":{"position":[[212,5]]},"1159":{"position":[[398,5]]},"1163":{"position":[[558,5]]},"1165":{"position":[[748,5],[1086,5]]},"1168":{"position":[[160,5]]},"1172":{"position":[[325,5]]},"1182":{"position":[[562,5]]},"1184":{"position":[[801,5]]},"1189":{"position":[[423,5]]},"1201":{"position":[[200,5]]},"1208":{"position":[[888,5]]},"1210":{"position":[[440,5]]},"1211":{"position":[[695,5]]},"1222":{"position":[[1411,5]]},"1226":{"position":[[236,5]]},"1227":{"position":[[714,5]]},"1231":{"position":[[1045,5]]},"1264":{"position":[[158,5]]},"1265":{"position":[[702,5]]},"1267":{"position":[[636,5],[730,5]]},"1271":{"position":[[1589,5]]},"1274":{"position":[[340,5]]},"1275":{"position":[[351,5]]},"1276":{"position":[[953,5]]},"1277":{"position":[[400,5]]},"1278":{"position":[[477,5],[929,5]]},"1279":{"position":[[727,5]]},"1280":{"position":[[462,5]]},"1286":{"position":[[509,5]]},"1287":{"position":[[559,5]]},"1288":{"position":[[525,5]]},"1311":{"position":[[186,5]]}},"keywords":{}}],["name+collect",{"_index":6119,"title":{},"content":{"1165":{"position":[[520,16],[981,16]]}},"keywords":{}}],["name:foobar",{"_index":5356,"title":{},"content":{"950":{"position":[[244,11]]}},"keywords":{}}],["name].j",{"_index":6316,"title":{},"content":{"1266":{"position":[[618,12]]}},"keywords":{}}],["namecontroller.text",{"_index":1284,"title":{},"content":{"188":{"position":[[2945,20]]}},"keywords":{}}],["namelowercas",{"_index":5801,"title":{},"content":{"1072":{"position":[[2370,14],[2496,14]]}},"keywords":{}}],["namespac",{"_index":5985,"title":{},"content":{"1114":{"position":[[902,9]]},"1120":{"position":[[586,10]]}},"keywords":{}}],["narrow",{"_index":2487,"title":{},"content":{"402":{"position":[[2140,6],[2248,6]]}},"keywords":{}}],["narrowli",{"_index":2615,"title":{},"content":{"411":{"position":[[1702,8]]}},"keywords":{}}],["nat",{"_index":1054,"title":{"864":{"position":[[17,4]]}},"content":{"113":{"position":[[254,4]]},"174":{"position":[[3086,5]]},"238":{"position":[[169,5]]},"614":{"position":[[420,4]]},"793":{"position":[[823,4]]},"865":{"position":[[34,4],[161,4],[239,4]]},"866":{"position":[[15,4],[41,4],[400,6],[503,4],[541,5],[679,5]]},"867":{"position":[[148,4]]},"901":{"position":[[261,3]]},"1124":{"position":[[2302,5]]}},"keywords":{}}],["nativ",{"_index":58,"title":{"8":{"position":[[6,6]]},"371":{"position":[[38,7]]},"437":{"position":[[23,7]]},"549":{"position":[[6,6]]},"551":{"position":[[6,6]]},"552":{"position":[[40,7]]},"556":{"position":[[25,6]]},"703":{"position":[[19,7]]},"830":{"position":[[6,6]]},"833":{"position":[[6,6]]},"834":{"position":[[29,7]]},"852":{"position":[[6,7]]},"1139":{"position":[[23,6]]},"1145":{"position":[[23,6]]},"1214":{"position":[[24,6]]},"1277":{"position":[[17,7]]}},"content":{"4":{"position":[[56,6]]},"7":{"position":[[650,6]]},"8":{"position":[[187,6],[211,6],[263,6],[283,6],[342,6],[360,6],[454,7],[866,6],[939,6],[1181,6]]},"17":{"position":[[112,7],[269,7]]},"34":{"position":[[161,6],[495,8]]},"38":{"position":[[722,7]]},"47":{"position":[[1252,6]]},"66":{"position":[[163,6],[244,6]]},"80":{"position":[[52,8]]},"104":{"position":[[107,6]]},"109":{"position":[[6,8]]},"112":{"position":[[116,7]]},"120":{"position":[[122,6]]},"174":{"position":[[602,6],[2722,7]]},"201":{"position":[[196,8]]},"207":{"position":[[193,6]]},"231":{"position":[[145,8]]},"239":{"position":[[153,7]]},"243":{"position":[[87,6]]},"244":{"position":[[109,6],[434,6],[535,6],[1137,6],[1265,6],[1304,6],[1348,6],[1430,6]]},"248":{"position":[[82,7]]},"254":{"position":[[164,6],[400,7]]},"269":{"position":[[105,6],[228,6]]},"287":{"position":[[477,6]]},"314":{"position":[[143,6]]},"317":{"position":[[7,6]]},"364":{"position":[[183,6]]},"365":{"position":[[1053,7]]},"371":{"position":[[46,7],[309,6],[349,7]]},"375":{"position":[[930,6]]},"383":{"position":[[412,7]]},"384":{"position":[[211,7]]},"408":{"position":[[1616,6],[2073,6],[3598,6],[5156,6]]},"437":{"position":[[11,6],[273,6]]},"438":{"position":[[9,6]]},"445":{"position":[[1780,6]]},"446":{"position":[[1147,6]]},"447":{"position":[[243,6]]},"454":{"position":[[249,6],[470,7],[620,6]]},"458":{"position":[[72,7]]},"524":{"position":[[909,6]]},"535":{"position":[[41,6],[1304,7]]},"546":{"position":[[308,6]]},"551":{"position":[[7,6],[308,6],[333,6]]},"554":{"position":[[170,6]]},"556":{"position":[[112,6],[137,6],[230,6],[318,6],[1150,6]]},"557":{"position":[[125,6],[163,6],[466,6]]},"566":{"position":[[474,9],[1251,8],[1274,9]]},"581":{"position":[[227,6],[565,6]]},"595":{"position":[[41,6]]},"606":{"position":[[298,6]]},"613":{"position":[[793,6]]},"616":{"position":[[732,6],[1018,6]]},"621":{"position":[[281,8]]},"631":{"position":[[196,8]]},"640":{"position":[[335,6]]},"641":{"position":[[399,6]]},"659":{"position":[[24,6],[165,6]]},"711":{"position":[[739,6]]},"717":{"position":[[209,6]]},"749":{"position":[[1161,6]]},"793":{"position":[[316,7]]},"824":{"position":[[247,6]]},"828":{"position":[[85,7]]},"829":{"position":[[938,6]]},"830":{"position":[[75,7],[193,6]]},"832":{"position":[[270,6]]},"834":{"position":[[67,7]]},"835":{"position":[[583,6],[633,6]]},"836":{"position":[[236,7],[402,6],[486,6],[523,6],[650,6],[1061,6],[1296,6],[1617,6],[1645,6]]},"837":{"position":[[318,6],[855,7],[1032,7],[1078,6],[1232,6],[1355,6],[1375,6],[1401,6],[1513,6],[1768,6],[1813,6],[2146,6]]},"838":{"position":[[383,7],[1201,7],[1347,6],[1588,7],[1827,6],[2011,6],[2409,6],[3212,7],[3419,7]]},"840":{"position":[[627,7],[670,6]]},"842":{"position":[[52,6],[90,6],[321,7]]},"852":{"position":[[7,6]]},"861":{"position":[[1582,10]]},"882":{"position":[[80,6],[129,6]]},"901":{"position":[[97,6]]},"917":{"position":[[405,6],[442,9]]},"964":{"position":[[460,6]]},"1072":{"position":[[1790,9]]},"1147":{"position":[[528,6]]},"1173":{"position":[[236,6]]},"1183":{"position":[[473,6]]},"1191":{"position":[[383,6]]},"1196":{"position":[[22,6],[49,7]]},"1206":{"position":[[44,6]]},"1214":{"position":[[110,6],[702,6]]},"1247":{"position":[[100,7]]},"1271":{"position":[[235,6],[1266,6]]},"1277":{"position":[[19,6],[313,6],[502,6],[603,6],[683,6],[840,6]]},"1283":{"position":[[7,6]]},"1284":{"position":[[457,7]]},"1316":{"position":[[3556,6]]}},"keywords":{}}],["native"",{"_index":1520,"title":{},"content":{"244":{"position":[[1398,12]]}},"keywords":{}}],["native'",{"_index":133,"title":{},"content":{"9":{"position":[[12,8]]}},"keywords":{}}],["native)desktop",{"_index":3121,"title":{},"content":{"479":{"position":[[391,14]]}},"keywords":{}}],["natively.with",{"_index":2981,"title":{},"content":{"457":{"position":[[241,13]]}},"keywords":{}}],["nativescript",{"_index":6136,"title":{},"content":{"1173":{"position":[[154,13]]}},"keywords":{}}],["nats:2.9.17",{"_index":4925,"title":{},"content":{"865":{"position":[[257,11]]}},"keywords":{}}],["natur",{"_index":701,"title":{"350":{"position":[[21,7]]}},"content":{"45":{"position":[[326,7]]},"68":{"position":[[142,6]]},"73":{"position":[[89,7]]},"104":{"position":[[49,9]]},"173":{"position":[[500,6]]},"174":{"position":[[658,7],[1461,7]]},"226":{"position":[[435,6]]},"231":{"position":[[226,7]]},"354":{"position":[[67,7]]},"362":{"position":[[22,9]]},"364":{"position":[[80,9]]},"371":{"position":[[256,7]]},"385":{"position":[[282,6]]},"410":{"position":[[1825,9]]},"412":{"position":[[5677,7]]},"634":{"position":[[47,9]]},"723":{"position":[[1059,7]]},"901":{"position":[[409,6]]}},"keywords":{}}],["navig",{"_index":1975,"title":{},"content":{"346":{"position":[[489,10]]},"396":{"position":[[397,11],[547,9]]},"424":{"position":[[338,9]]}},"keywords":{}}],["navigator.hardwareconcurr",{"_index":2280,"title":{},"content":{"392":{"position":[[4651,30],[5039,29]]}},"keywords":{}}],["navigator.onlin",{"_index":5456,"title":{},"content":{"988":{"position":[[1021,16]]}},"keywords":{}}],["navigator.storage.estim",{"_index":1771,"title":{},"content":{"300":{"position":[[237,29]]},"301":{"position":[[325,28]]},"461":{"position":[[1284,29]]}},"keywords":{}}],["navigator.storage.getdirectori",{"_index":6197,"title":{},"content":{"1208":{"position":[[721,33]]},"1215":{"position":[[518,33]]}},"keywords":{}}],["navigator.storage.persist",{"_index":1777,"title":{},"content":{"300":{"position":[[482,27]]}},"keywords":{}}],["navigator.storagebuckets.open('myapp",{"_index":6060,"title":{},"content":{"1140":{"position":[[729,36]]}},"keywords":{}}],["near",{"_index":708,"title":{},"content":{"46":{"position":[[294,4]]},"65":{"position":[[1155,4]]},"265":{"position":[[411,4]]},"301":{"position":[[720,7]]},"375":{"position":[[520,4]]},"408":{"position":[[1611,4],[2068,4],[3593,4]]},"410":{"position":[[181,4]]},"415":{"position":[[68,4]]},"474":{"position":[[168,4]]},"483":{"position":[[65,4]]},"486":{"position":[[22,4]]},"498":{"position":[[577,4]]},"571":{"position":[[102,4]]},"632":{"position":[[1955,4]]},"641":{"position":[[394,4]]},"780":{"position":[[757,4]]},"1007":{"position":[[356,5]]},"1093":{"position":[[165,4]]}},"keywords":{}}],["nearbi",{"_index":2809,"title":{},"content":{"419":{"position":[[1423,6]]},"1007":{"position":[[2040,6]]}},"keywords":{}}],["nearest",{"_index":2209,"title":{},"content":{"390":{"position":[[1597,7]]},"396":{"position":[[232,7],[632,7]]}},"keywords":{}}],["nearli",{"_index":2127,"title":{},"content":{"369":{"position":[[1259,6]]},"412":{"position":[[2715,6]]},"478":{"position":[[173,6]]}},"keywords":{}}],["neatli",{"_index":3257,"title":{},"content":{"521":{"position":[[115,6]]},"590":{"position":[[315,6]]}},"keywords":{}}],["necessari",{"_index":714,"title":{},"content":{"46":{"position":[[439,9]]},"128":{"position":[[69,9]]},"227":{"position":[[383,9]]},"395":{"position":[[264,9]]},"430":{"position":[[303,9]]},"503":{"position":[[150,9]]},"542":{"position":[[182,9]]},"582":{"position":[[237,10]]},"617":{"position":[[2056,9]]},"778":{"position":[[461,9]]},"886":{"position":[[4726,9]]},"1052":{"position":[[164,10]]},"1072":{"position":[[567,9]]},"1198":{"position":[[1809,9]]}},"keywords":{}}],["necessary.vers",{"_index":4778,"title":{},"content":{"836":{"position":[[2019,17]]}},"keywords":{}}],["necessit",{"_index":948,"title":{},"content":{"66":{"position":[[597,13]]}},"keywords":{}}],["nedb",{"_index":502,"title":{"32":{"position":[[0,5]]}},"content":{"32":{"position":[[1,4],[284,4]]}},"keywords":{}}],["need",{"_index":44,"title":{"574":{"position":[[21,4]]},"784":{"position":[[14,4]]},"785":{"position":[[14,4]]},"1312":{"position":[[20,4]]}},"content":{"2":{"position":[[248,4]]},"6":{"position":[[407,4]]},"7":{"position":[[109,4]]},"8":{"position":[[423,4]]},"10":{"position":[[181,4]]},"11":{"position":[[1000,5]]},"18":{"position":[[148,6]]},"34":{"position":[[323,4]]},"35":{"position":[[568,6]]},"40":{"position":[[592,4]]},"46":{"position":[[40,5],[326,4]]},"47":{"position":[[400,4]]},"59":{"position":[[19,6]]},"65":{"position":[[322,4]]},"70":{"position":[[144,5]]},"72":{"position":[[151,6]]},"92":{"position":[[109,4]]},"96":{"position":[[72,4]]},"103":{"position":[[145,4]]},"122":{"position":[[329,4]]},"128":{"position":[[49,4]]},"129":{"position":[[267,4]]},"131":{"position":[[872,4]]},"133":{"position":[[323,4]]},"143":{"position":[[123,4],[300,7]]},"147":{"position":[[328,6]]},"159":{"position":[[271,4]]},"172":{"position":[[238,4]]},"173":{"position":[[772,4],[1703,4]]},"183":{"position":[[96,4]]},"188":{"position":[[1978,4]]},"212":{"position":[[33,4],[403,7],[553,4]]},"217":{"position":[[139,4]]},"219":{"position":[[228,4]]},"224":{"position":[[254,4]]},"233":{"position":[[205,4]]},"261":{"position":[[161,4],[1139,4]]},"262":{"position":[[32,4],[310,4]]},"266":{"position":[[420,6]]},"270":{"position":[[111,4]]},"271":{"position":[[69,5]]},"282":{"position":[[417,4]]},"285":{"position":[[273,6]]},"289":{"position":[[1765,4]]},"295":{"position":[[375,6]]},"298":{"position":[[10,4],[921,5]]},"303":{"position":[[39,4],[1111,4]]},"305":{"position":[[259,8]]},"306":{"position":[[120,4]]},"309":{"position":[[205,7]]},"314":{"position":[[131,4],[626,4],[954,4]]},"320":{"position":[[312,4]]},"321":{"position":[[47,4]]},"326":{"position":[[238,4]]},"346":{"position":[[97,6],[880,7]]},"353":{"position":[[582,7]]},"354":{"position":[[576,5]]},"357":{"position":[[541,5]]},"358":{"position":[[758,4],[806,4]]},"369":{"position":[[808,4],[865,6]]},"375":{"position":[[515,4]]},"378":{"position":[[83,5]]},"383":{"position":[[102,7],[520,6]]},"388":{"position":[[518,5]]},"391":{"position":[[62,4]]},"392":{"position":[[1133,4],[1323,4],[1813,4]]},"395":{"position":[[38,4]]},"400":{"position":[[234,4],[679,4]]},"410":{"position":[[319,4],[1195,5],[1690,4],[2191,4]]},"411":{"position":[[1088,4],[2201,4],[2614,4]]},"412":{"position":[[2587,5],[3233,4],[4012,4],[6288,5],[6609,4],[7146,4],[7305,5],[7440,4],[7508,6],[8243,5],[9447,4],[10068,4],[10108,4],[10774,7],[11318,4],[11612,4],[12258,4],[12660,4],[14353,4],[14616,7],[14719,5]]},"418":{"position":[[376,6]]},"432":{"position":[[75,6]]},"436":{"position":[[283,6]]},"441":{"position":[[275,5]]},"444":{"position":[[297,4]]},"445":{"position":[[2309,4]]},"451":{"position":[[250,4],[348,4]]},"463":{"position":[[395,5],[446,5]]},"468":{"position":[[245,4]]},"483":{"position":[[1003,4]]},"490":{"position":[[275,4],[636,6]]},"491":{"position":[[78,4],[894,5]]},"496":{"position":[[541,4]]},"497":{"position":[[181,4]]},"504":{"position":[[24,5],[509,5]]},"515":{"position":[[300,4]]},"518":{"position":[[318,4]]},"534":{"position":[[388,4]]},"542":{"position":[[1008,7]]},"551":{"position":[[383,4]]},"553":{"position":[[47,5]]},"555":{"position":[[933,4]]},"556":{"position":[[564,4]]},"559":{"position":[[1353,4]]},"560":{"position":[[155,6]]},"565":{"position":[[8,4]]},"566":{"position":[[1040,6]]},"567":{"position":[[1133,6]]},"569":{"position":[[1534,4]]},"570":{"position":[[611,4]]},"574":{"position":[[834,5]]},"590":{"position":[[566,4],[634,5]]},"594":{"position":[[386,4]]},"612":{"position":[[298,5]]},"614":{"position":[[202,4],[866,4]]},"618":{"position":[[751,4]]},"632":{"position":[[395,7],[1407,6]]},"634":{"position":[[223,4]]},"643":{"position":[[244,7]]},"650":{"position":[[70,4]]},"659":{"position":[[741,5]]},"660":{"position":[[340,5]]},"662":{"position":[[340,4]]},"669":{"position":[[8,4]]},"670":{"position":[[27,4]]},"679":{"position":[[76,4]]},"680":{"position":[[29,4]]},"689":{"position":[[511,5]]},"696":{"position":[[114,4],[196,4]]},"698":{"position":[[239,4],[2624,4]]},"701":{"position":[[225,4]]},"703":{"position":[[877,6],[1333,4]]},"705":{"position":[[968,4]]},"711":{"position":[[771,4]]},"714":{"position":[[868,4]]},"716":{"position":[[194,4]]},"721":{"position":[[276,4]]},"723":{"position":[[548,4],[1790,4],[2655,4]]},"727":{"position":[[10,4]]},"728":{"position":[[203,4]]},"731":{"position":[[8,4]]},"749":{"position":[[254,4],[7330,5],[17790,5],[19352,5],[19472,5]]},"752":{"position":[[637,6],[650,6]]},"781":{"position":[[353,5]]},"799":{"position":[[51,6],[287,4]]},"835":{"position":[[846,5]]},"836":{"position":[[2349,7]]},"838":{"position":[[369,4]]},"839":{"position":[[603,4],[696,6]]},"841":{"position":[[858,6],[1158,6],[1271,6]]},"848":{"position":[[33,4]]},"855":{"position":[[60,6]]},"856":{"position":[[119,6]]},"858":{"position":[[11,4]]},"861":{"position":[[215,7],[1647,5],[1826,4]]},"866":{"position":[[559,4]]},"867":{"position":[[60,6]]},"872":{"position":[[213,4],[347,4]]},"875":{"position":[[1326,4],[6622,4]]},"882":{"position":[[107,4]]},"885":{"position":[[285,4],[478,4]]},"886":{"position":[[56,4],[2112,4],[3270,4]]},"898":{"position":[[1811,4]]},"904":{"position":[[2284,4],[2815,4],[2956,4]]},"906":{"position":[[732,6]]},"934":{"position":[[39,4],[121,5]]},"965":{"position":[[187,6]]},"968":{"position":[[85,4]]},"986":{"position":[[415,6]]},"988":{"position":[[2311,6],[3413,6],[4786,4]]},"989":{"position":[[335,4]]},"1002":{"position":[[844,4]]},"1007":{"position":[[825,5]]},"1008":{"position":[[287,4]]},"1009":{"position":[[143,5],[1092,5]]},"1022":{"position":[[272,4]]},"1059":{"position":[[94,4]]},"1067":{"position":[[15,4],[79,4]]},"1068":{"position":[[474,4]]},"1072":{"position":[[269,4],[468,4],[1108,4],[1422,7]]},"1079":{"position":[[414,6]]},"1100":{"position":[[432,5]]},"1105":{"position":[[1125,4]]},"1107":{"position":[[226,4],[996,4]]},"1108":{"position":[[284,4]]},"1132":{"position":[[697,5]]},"1133":{"position":[[352,4],[549,4]]},"1135":{"position":[[367,4]]},"1141":{"position":[[78,4]]},"1147":{"position":[[412,5]]},"1150":{"position":[[240,4]]},"1157":{"position":[[499,4]]},"1164":{"position":[[412,6]]},"1237":{"position":[[39,5]]},"1246":{"position":[[1894,5]]},"1251":{"position":[[39,4]]},"1274":{"position":[[554,4]]},"1279":{"position":[[941,4]]},"1281":{"position":[[8,4]]},"1294":{"position":[[394,5],[452,4],[655,4],[2012,7]]},"1296":{"position":[[410,4]]},"1299":{"position":[[73,4]]},"1316":{"position":[[1823,4]]},"1317":{"position":[[370,4]]},"1323":{"position":[[160,4]]}},"keywords":{}}],["need.perform",{"_index":1559,"title":{},"content":{"252":{"position":[[182,12]]}},"keywords":{}}],["needs—especi",{"_index":3434,"title":{},"content":{"564":{"position":[[35,16]]}},"keywords":{}}],["neg",{"_index":4404,"title":{},"content":{"749":{"position":[[21131,8],[21602,10]]}},"keywords":{}}],["neighbor",{"_index":2210,"title":{},"content":{"390":{"position":[[1605,10]]},"396":{"position":[[240,8],[640,8]]}},"keywords":{}}],["neighboringchunkids.foreach(startchunkrepl",{"_index":5577,"title":{},"content":{"1007":{"position":[[2100,51]]}},"keywords":{}}],["neighboringchunkids.includes(cid",{"_index":5579,"title":{},"content":{"1007":{"position":[[2207,36]]}},"keywords":{}}],["ness",{"_index":5413,"title":{},"content":{"975":{"position":[[126,4]]}},"keywords":{}}],["nest",{"_index":1986,"title":{"812":{"position":[[13,6]]}},"content":{"350":{"position":[[68,6]]},"352":{"position":[[44,6],[301,6]]},"353":{"position":[[320,6]]},"354":{"position":[[93,6]]},"356":{"position":[[299,6],[809,6]]},"362":{"position":[[84,6]]},"364":{"position":[[534,6],[664,6]]},"369":{"position":[[386,6]]},"561":{"position":[[44,6]]},"749":{"position":[[15232,7]]},"765":{"position":[[62,6]]},"811":{"position":[[153,6]]},"861":{"position":[[1427,6],[1507,6]]},"1040":{"position":[[218,6]]},"1116":{"position":[[182,6],[455,6],[565,6]]}},"keywords":{}}],["nestedvalu",{"_index":5678,"title":{},"content":{"1040":{"position":[[237,11]]}},"keywords":{}}],["netscap",{"_index":2951,"title":{},"content":{"450":{"position":[[34,8]]}},"keywords":{}}],["network",{"_index":392,"title":{},"content":{"23":{"position":[[401,7]]},"40":{"position":[[388,10]]},"65":{"position":[[1121,7]]},"122":{"position":[[241,7],[380,7]]},"133":{"position":[[235,7],[373,7]]},"147":{"position":[[144,7]]},"152":{"position":[[369,7]]},"173":{"position":[[790,7]]},"183":{"position":[[343,7]]},"206":{"position":[[325,7]]},"216":{"position":[[135,7]]},"236":{"position":[[260,7]]},"251":{"position":[[120,7]]},"273":{"position":[[208,7]]},"280":{"position":[[502,7]]},"289":{"position":[[225,7],[1841,7],[2016,7]]},"309":{"position":[[121,9],[254,7]]},"311":{"position":[[245,7]]},"316":{"position":[[530,7]]},"323":{"position":[[227,7]]},"327":{"position":[[182,7]]},"346":{"position":[[601,7]]},"376":{"position":[[185,7]]},"407":{"position":[[153,8],[420,7]]},"408":{"position":[[2891,7]]},"410":{"position":[[1242,8]]},"414":{"position":[[146,7],[334,7]]},"415":{"position":[[319,7],[400,7]]},"419":{"position":[[287,8],[899,7]]},"421":{"position":[[589,7]]},"434":{"position":[[308,7]]},"444":{"position":[[267,7]]},"445":{"position":[[620,7]]},"462":{"position":[[551,7]]},"473":{"position":[[123,7]]},"486":{"position":[[93,7],[363,7]]},"491":{"position":[[329,7],[1011,9]]},"498":{"position":[[653,7]]},"500":{"position":[[497,7]]},"502":{"position":[[568,7]]},"556":{"position":[[1579,7]]},"584":{"position":[[110,7]]},"590":{"position":[[764,7]]},"610":{"position":[[702,7]]},"613":{"position":[[425,11]]},"630":{"position":[[108,7]]},"631":{"position":[[493,7]]},"632":{"position":[[716,9],[2812,7]]},"696":{"position":[[710,7]]},"705":{"position":[[1335,7]]},"860":{"position":[[426,7]]},"902":{"position":[[740,8]]},"904":{"position":[[3347,8]]},"1007":{"position":[[1121,7]]},"1009":{"position":[[635,7]]},"1304":{"position":[[850,7]]}},"keywords":{}}],["network.easi",{"_index":3292,"title":{},"content":{"534":{"position":[[414,14]]},"594":{"position":[[412,14]]}},"keywords":{}}],["never",{"_index":361,"title":{},"content":{"21":{"position":[[182,5]]},"253":{"position":[[206,5]]},"292":{"position":[[17,5]]},"455":{"position":[[754,5]]},"461":{"position":[[232,5]]},"491":{"position":[[984,5]]},"569":{"position":[[431,5],[1073,5],[1432,5]]},"571":{"position":[[1816,5]]},"670":{"position":[[268,5]]},"699":{"position":[[943,5]]},"749":{"position":[[6124,5],[24388,5]]},"816":{"position":[[144,5],[325,5]]},"817":{"position":[[197,5]]},"829":{"position":[[367,5]]},"855":{"position":[[22,5]]},"867":{"position":[[22,5]]},"898":{"position":[[2898,5]]},"935":{"position":[[157,5]]},"986":{"position":[[349,5]]},"991":{"position":[[38,5]]},"994":{"position":[[183,5]]},"995":{"position":[[1155,5]]},"1031":{"position":[[24,5],[283,5]]},"1033":{"position":[[123,5],[929,5]]},"1198":{"position":[[717,5]]},"1207":{"position":[[195,5]]},"1231":{"position":[[358,5]]},"1301":{"position":[[1019,5]]},"1321":{"position":[[86,5]]}},"keywords":{}}],["new",{"_index":162,"title":{},"content":{"11":{"position":[[585,3]]},"38":{"position":[[1099,3]]},"41":{"position":[[43,3]]},"50":{"position":[[124,3]]},"255":{"position":[[107,3]]},"260":{"position":[[326,3]]},"261":{"position":[[1043,3]]},"329":{"position":[[123,3]]},"335":{"position":[[572,3],[900,3]]},"351":{"position":[[265,3],[306,3]]},"360":{"position":[[866,3]]},"392":{"position":[[3857,3],[3921,3],[4254,3]]},"394":{"position":[[606,4]]},"397":{"position":[[2038,3]]},"398":{"position":[[800,3],[848,3],[2068,3],[2134,3]]},"403":{"position":[[685,3],[879,3]]},"408":{"position":[[49,3],[1400,3],[1487,3],[1516,3]]},"410":{"position":[[2100,3]]},"412":{"position":[[11082,3]]},"414":{"position":[[120,3]]},"420":{"position":[[561,3]]},"421":{"position":[[84,3]]},"430":{"position":[[1065,3],[1078,3]]},"453":{"position":[[55,3]]},"459":{"position":[[842,3]]},"463":{"position":[[819,3]]},"494":{"position":[[616,3]]},"498":{"position":[[124,3]]},"501":{"position":[[429,3]]},"556":{"position":[[488,3]]},"571":{"position":[[242,3],[839,3],[1083,3]]},"610":{"position":[[388,3],[431,3],[589,3],[1102,3]]},"611":{"position":[[642,3]]},"612":{"position":[[237,4],[1152,3],[2270,3]]},"618":{"position":[[698,3]]},"620":{"position":[[522,3],[555,3]]},"621":{"position":[[421,3],[628,3]]},"624":{"position":[[557,4],[1474,3]]},"632":{"position":[[157,3],[975,3]]},"634":{"position":[[368,3]]},"636":{"position":[[26,3]]},"653":{"position":[[869,3]]},"661":{"position":[[1101,3]]},"662":{"position":[[1820,3]]},"674":{"position":[[154,3]]},"686":{"position":[[275,3]]},"696":{"position":[[217,3]]},"698":{"position":[[279,3],[1321,3],[2736,3],[2791,3],[2859,3],[2926,3]]},"702":{"position":[[101,3],[393,3],[786,3]]},"711":{"position":[[1149,3],[1552,3]]},"719":{"position":[[286,3]]},"737":{"position":[[461,3]]},"739":{"position":[[718,3]]},"751":{"position":[[352,4],[649,3],[892,3],[1074,3],[1126,3],[1751,3],[1905,3]]},"754":{"position":[[363,3],[715,3]]},"759":{"position":[[328,3],[582,3],[1050,3],[1209,3],[1336,3]]},"760":{"position":[[578,3]]},"767":{"position":[[48,3],[558,3],[693,3],[967,3]]},"768":{"position":[[560,3],[703,3],[969,3]]},"769":{"position":[[517,3],[664,3],[938,3]]},"772":{"position":[[2474,3]]},"778":{"position":[[560,3]]},"837":{"position":[[2105,3]]},"839":{"position":[[1119,3]]},"848":{"position":[[946,3]]},"862":{"position":[[971,3]]},"866":{"position":[[310,3]]},"868":{"position":[[75,3]]},"872":{"position":[[904,3]]},"875":{"position":[[888,3],[1845,3],[1948,3],[4019,3],[4423,3],[8093,3],[8128,3],[9512,3],[9547,3]]},"879":{"position":[[119,3]]},"885":{"position":[[398,3]]},"897":{"position":[[279,3]]},"898":{"position":[[140,3]]},"902":{"position":[[174,3]]},"904":{"position":[[1236,3]]},"905":{"position":[[115,3]]},"910":{"position":[[239,3]]},"917":{"position":[[64,3]]},"942":{"position":[[20,3],[153,3]]},"943":{"position":[[53,3]]},"946":{"position":[[110,3]]},"982":{"position":[[93,3],[169,3],[456,3],[568,3]]},"986":{"position":[[1243,5]]},"987":{"position":[[602,3]]},"988":{"position":[[5085,3],[5215,3],[5298,3]]},"1004":{"position":[[732,3]]},"1007":{"position":[[908,3]]},"1009":{"position":[[188,3],[532,3]]},"1014":{"position":[[155,3]]},"1022":{"position":[[718,3]]},"1023":{"position":[[369,3]]},"1042":{"position":[[92,3]]},"1048":{"position":[[471,3]]},"1058":{"position":[[527,3]]},"1069":{"position":[[318,3],[522,3]]},"1085":{"position":[[122,3],[3041,3],[3413,3],[3671,3],[3753,3],[3794,3]]},"1109":{"position":[[316,3]]},"1115":{"position":[[147,4]]},"1148":{"position":[[811,3]]},"1150":{"position":[[560,3]]},"1172":{"position":[[381,3]]},"1174":{"position":[[644,3]]},"1177":{"position":[[497,3]]},"1208":{"position":[[879,3],[1165,3],[1323,3],[1433,3],[1538,3],[1694,3]]},"1209":{"position":[[241,3]]},"1218":{"position":[[487,3],[835,3]]},"1229":{"position":[[90,3]]},"1242":{"position":[[155,3]]},"1266":{"position":[[985,4]]},"1268":{"position":[[90,3],[167,3],[477,3]]},"1279":{"position":[[642,3]]},"1294":{"position":[[21,3],[1136,3]]},"1300":{"position":[[421,3],[732,3],[985,3]]},"1304":{"position":[[385,3]]},"1305":{"position":[[772,3]]},"1308":{"position":[[565,4]]},"1316":{"position":[[1631,3],[1730,3],[3136,3]]},"1318":{"position":[[440,3],[504,3],[608,3],[890,3],[1092,3]]},"1319":{"position":[[337,3]]}},"keywords":{}}],["new/upd",{"_index":1355,"title":{},"content":{"209":{"position":[[1045,11]]}},"keywords":{}}],["newcheckpoint",{"_index":4999,"title":{},"content":{"875":{"position":[[2622,13],[2862,13]]}},"keywords":{}}],["newcont",{"_index":3466,"title":{},"content":{"571":{"position":[[1108,10],[1236,11]]}},"keywords":{}}],["newcustomfetchmethod",{"_index":4841,"title":{},"content":{"848":{"position":[[1030,21]]}},"keywords":{}}],["newdocumentst",{"_index":5014,"title":{},"content":{"875":{"position":[[3824,16]]},"885":{"position":[[996,17]]},"1309":{"position":[[1157,16]]}},"keywords":{}}],["newer",{"_index":827,"title":{},"content":{"55":{"position":[[23,5]]},"59":{"position":[[83,5]]},"408":{"position":[[5026,5]]},"420":{"position":[[161,5]]},"546":{"position":[[138,5]]},"563":{"position":[[89,5]]},"606":{"position":[[138,5]]},"696":{"position":[[1890,5]]},"749":{"position":[[12596,5]]},"761":{"position":[[445,6]]},"773":{"position":[[710,5]]},"885":{"position":[[64,5],[1966,5]]},"932":{"position":[[661,5]]},"984":{"position":[[605,5]]},"986":{"position":[[1367,5]]},"1002":{"position":[[223,5],[479,5],[1132,5]]},"1162":{"position":[[1090,5]]},"1275":{"position":[[29,6]]},"1278":{"position":[[145,5]]},"1282":{"position":[[415,6]]}},"keywords":{}}],["newest",{"_index":4820,"title":{},"content":{"844":{"position":[[241,6]]},"1046":{"position":[[63,6]]}},"keywords":{}}],["newfetchmethod",{"_index":4825,"title":{},"content":{"846":{"position":[[577,17]]}},"keywords":{}}],["newforkst",{"_index":5442,"title":{},"content":{"983":{"position":[[535,12]]}},"keywords":{}}],["newhero",{"_index":3500,"title":{},"content":{"580":{"position":[[697,10]]},"601":{"position":[[685,10]]}},"keywords":{}}],["newli",{"_index":1337,"title":{},"content":{"208":{"position":[[152,5]]},"939":{"position":[[105,5]]},"943":{"position":[[308,5]]},"955":{"position":[[244,5]]}},"keywords":{}}],["newnam",{"_index":1425,"title":{},"content":{"235":{"position":[[346,10]]},"571":{"position":[[1381,10]]},"1039":{"position":[[256,8],[430,8]]},"1040":{"position":[[389,10]]}},"keywords":{}}],["next",{"_index":648,"title":{"824":{"position":[[0,4]]}},"content":{"41":{"position":[[56,4]]},"114":{"position":[[696,4]]},"263":{"position":[[538,4]]},"388":{"position":[[37,4]]},"393":{"position":[[61,4]]},"412":{"position":[[11386,4]]},"464":{"position":[[1,4]]},"466":{"position":[[4,4]]},"498":{"position":[[73,4]]},"700":{"position":[[936,4]]},"703":{"position":[[1572,4]]},"752":{"position":[[952,5]]},"965":{"position":[[390,4]]},"988":{"position":[[4219,4]]},"1008":{"position":[[154,4]]},"1198":{"position":[[2164,4]]},"1294":{"position":[[741,4]]}},"keywords":{}}],["next.j",{"_index":2924,"title":{},"content":{"438":{"position":[[180,8]]}},"keywords":{}}],["nextjs/vercel",{"_index":595,"title":{},"content":{"38":{"position":[[698,13]]}},"keywords":{}}],["nexttick",{"_index":5269,"title":{},"content":{"910":{"position":[[397,9]]}},"keywords":{}}],["ngfor="let",{"_index":821,"title":{},"content":{"54":{"position":[[222,16]]},"55":{"position":[[1144,16]]},"130":{"position":[[567,16]]},"493":{"position":[[231,16]]},"825":{"position":[[798,16]]}},"keywords":{}}],["ngif="(mycollection.find",{"_index":3175,"title":{},"content":{"493":{"position":[[162,34]]}},"keywords":{}}],["nginx",{"_index":3681,"title":{},"content":{"624":{"position":[[1123,5]]},"849":{"position":[[737,5]]},"1088":{"position":[[758,5]]}},"keywords":{}}],["ngrx",{"_index":1018,"title":{},"content":{"96":{"position":[[134,5]]},"173":{"position":[[3095,5]]},"219":{"position":[[99,5]]}},"keywords":{}}],["ngzone",{"_index":756,"title":{},"content":{"50":{"position":[[447,6]]}},"keywords":{}}],["nich",{"_index":3626,"title":{},"content":{"614":{"position":[[738,5]]}},"keywords":{}}],["night",{"_index":3956,"title":{},"content":{"700":{"position":[[895,5]]}},"keywords":{}}],["nobodi",{"_index":2846,"title":{},"content":{"421":{"position":[[153,6]]}},"keywords":{}}],["node",{"_index":94,"title":{"7":{"position":[[0,4]]},"438":{"position":[[0,4]]},"1127":{"position":[[11,4]]},"1245":{"position":[[14,5]]}},"content":{"7":{"position":[[23,4],[241,4],[300,4]]},"8":{"position":[[635,4]]},"396":{"position":[[485,6],[733,6]]},"412":{"position":[[14668,5]]},"438":{"position":[[155,4],[193,4]]},"666":{"position":[[370,5]]},"773":{"position":[[864,4]]},"793":{"position":[[273,4]]},"861":{"position":[[1098,4]]},"911":{"position":[[297,4],[410,4],[541,5]]},"1090":{"position":[[661,6]]},"1130":{"position":[[126,6]]},"1133":{"position":[[121,4],[521,4]]},"1214":{"position":[[511,4]]},"1245":{"position":[[16,4]]}},"keywords":{}}],["node.j",{"_index":504,"title":{"370":{"position":[[8,8]]},"438":{"position":[[22,8]]},"672":{"position":[[11,8]]},"771":{"position":[[0,7]]},"773":{"position":[[8,7]]},"911":{"position":[[41,8]]},"1159":{"position":[[44,8]]}},"content":{"32":{"position":[[58,8]]},"201":{"position":[[167,8]]},"248":{"position":[[57,8]]},"249":{"position":[[115,9]]},"254":{"position":[[211,8],[342,8]]},"261":{"position":[[629,7]]},"325":{"position":[[74,8]]},"359":{"position":[[115,8]]},"365":{"position":[[666,7],[974,7]]},"370":{"position":[[1,7],[93,7]]},"438":{"position":[[46,7],[144,7],[306,7]]},"569":{"position":[[1328,8]]},"575":{"position":[[186,8]]},"612":{"position":[[1726,7]]},"613":{"position":[[811,8]]},"624":{"position":[[422,7],[973,7]]},"631":{"position":[[215,7]]},"640":{"position":[[568,8]]},"707":{"position":[[93,7]]},"709":{"position":[[1355,7]]},"710":{"position":[[698,7]]},"711":{"position":[[746,7]]},"729":{"position":[[190,7]]},"772":{"position":[[178,8]]},"773":{"position":[[39,7],[145,7],[678,7],[836,7]]},"774":{"position":[[1020,7]]},"775":{"position":[[37,7],[103,7]]},"776":{"position":[[337,7]]},"793":{"position":[[281,9],[347,8]]},"799":{"position":[[368,7]]},"821":{"position":[[466,7]]},"871":{"position":[[588,7]]},"872":{"position":[[107,7]]},"875":{"position":[[617,7]]},"896":{"position":[[334,7]]},"904":{"position":[[2803,8],[2848,7],[2944,8],[2994,7]]},"911":{"position":[[85,7]]},"962":{"position":[[555,8],[870,8]]},"964":{"position":[[435,7]]},"989":{"position":[[113,7]]},"1088":{"position":[[332,8]]},"1094":{"position":[[104,8]]},"1095":{"position":[[288,7]]},"1124":{"position":[[429,8]]},"1135":{"position":[[115,7]]},"1139":{"position":[[1,7],[71,8]]},"1145":{"position":[[1,7],[67,8]]},"1159":{"position":[[96,7]]},"1188":{"position":[[10,7]]},"1214":{"position":[[120,8],[226,7],[368,7]]},"1219":{"position":[[127,7]]},"1245":{"position":[[67,7]]},"1246":{"position":[[158,9]]},"1247":{"position":[[75,8]]},"1270":{"position":[[54,7]]},"1274":{"position":[[146,8],[468,7]]},"1275":{"position":[[6,7],[109,8]]},"1279":{"position":[[855,7]]}},"keywords":{}}],["node.js.appwrit",{"_index":4913,"title":{},"content":{"863":{"position":[[303,16]]}},"keywords":{}}],["node/n",{"_index":6170,"title":{"1196":{"position":[[0,11]]}},"content":{},"keywords":{}}],["node:sqlit",{"_index":6333,"title":{"1275":{"position":[[15,11]]}},"content":{"1271":{"position":[[1390,14]]},"1272":{"position":[[512,11]]},"1275":{"position":[[290,14]]}},"keywords":{}}],["node_modul",{"_index":6230,"title":{},"content":{"1210":{"position":[[613,12]]},"1266":{"position":[[769,17]]}},"keywords":{}}],["node_modules/.bin/electron",{"_index":3995,"title":{},"content":{"711":{"position":[[976,28]]}},"keywords":{}}],["node_modules/rxdb",{"_index":6232,"title":{},"content":{"1210":{"position":[[650,18]]},"1227":{"position":[[231,17],[812,17]]},"1265":{"position":[[224,17]]}},"keywords":{}}],["node_modules/rxdb/dist/work",{"_index":6303,"title":{},"content":{"1265":{"position":[[794,30]]}},"keywords":{}}],["nodedatachannelpolyfil",{"_index":5275,"title":{},"content":{"911":{"position":[[512,23],[772,24]]}},"keywords":{}}],["nodeintegr",{"_index":3926,"title":{},"content":{"693":{"position":[[656,15]]}},"keywords":{}}],["nodej",{"_index":81,"title":{},"content":{"5":{"position":[[388,6]]},"6":{"position":[[189,6]]},"7":{"position":[[163,6]]},"666":{"position":[[82,6]]},"743":{"position":[[203,6]]},"773":{"position":[[288,6]]},"776":{"position":[[20,6]]},"1173":{"position":[[133,6]]},"1202":{"position":[[230,6]]},"1271":{"position":[[1259,6]]}},"keywords":{}}],["noisi",{"_index":4117,"title":{},"content":{"746":{"position":[[182,6]]}},"keywords":{}}],["non",{"_index":516,"title":{"245":{"position":[[0,3]]},"1084":{"position":[[0,3]]},"1126":{"position":[[6,3]]},"1151":{"position":[[14,3]]},"1178":{"position":[[14,3]]}},"content":{"33":{"position":[[208,3]]},"38":{"position":[[939,3]]},"402":{"position":[[876,3]]},"412":{"position":[[1413,3]]},"419":{"position":[[1261,3]]},"427":{"position":[[112,3],[199,3]]},"496":{"position":[[130,3]]},"555":{"position":[[428,3],[738,3]]},"619":{"position":[[219,3]]},"661":{"position":[[342,3]]},"668":{"position":[[233,3]]},"687":{"position":[[304,3]]},"714":{"position":[[1078,3]]},"749":{"position":[[9862,3],[9976,3],[11175,3],[11970,3],[23009,3]]},"829":{"position":[[205,3]]},"840":{"position":[[251,3]]},"857":{"position":[[486,3]]},"875":{"position":[[1987,3]]},"881":{"position":[[56,3]]},"887":{"position":[[18,3],[495,3]]},"988":{"position":[[2020,3]]},"1000":{"position":[[62,3]]},"1004":{"position":[[384,3]]},"1044":{"position":[[31,3]]},"1067":{"position":[[1808,3],[2229,3]]},"1068":{"position":[[10,3]]},"1102":{"position":[[85,3]]},"1126":{"position":[[637,3]]},"1137":{"position":[[74,3]]},"1143":{"position":[[457,3]]},"1180":{"position":[[382,3]]},"1188":{"position":[[131,3],[273,3]]},"1196":{"position":[[126,3]]},"1244":{"position":[[103,3]]},"1278":{"position":[[681,3]]}},"keywords":{}}],["nondonetask",{"_index":6102,"title":{},"content":{"1158":{"position":[[661,12]]}},"keywords":{}}],["none",{"_index":3442,"title":{},"content":{"566":{"position":[[434,5],[469,4],[1060,5],[1080,4]]},"749":{"position":[[515,4]]},"841":{"position":[[502,4],[715,4],[720,4],[1130,4]]}},"keywords":{}}],["norm.classif",{"_index":2205,"title":{},"content":{"390":{"position":[[1527,20]]}},"keywords":{}}],["normal",{"_index":223,"title":{},"content":{"14":{"position":[[722,8]]},"315":{"position":[[1136,6]]},"352":{"position":[[198,11]]},"356":{"position":[[770,6]]},"391":{"position":[[699,10]]},"421":{"position":[[129,6]]},"469":{"position":[[402,6]]},"554":{"position":[[858,6]]},"610":{"position":[[183,6],[1178,6]]},"626":{"position":[[716,6]]},"685":{"position":[[67,8],[300,8]]},"702":{"position":[[241,8]]},"714":{"position":[[184,7],[1135,7]]},"717":{"position":[[728,6]]},"718":{"position":[[301,6]]},"778":{"position":[[4,8]]},"782":{"position":[[4,6]]},"784":{"position":[[4,6]]},"818":{"position":[[33,6]]},"862":{"position":[[1706,6]]},"872":{"position":[[2808,6]]},"875":{"position":[[6543,6]]},"892":{"position":[[145,6]]},"898":{"position":[[1590,6],[4624,6]]},"1018":{"position":[[34,6]]},"1044":{"position":[[10,6]]},"1055":{"position":[[97,6]]},"1067":{"position":[[201,6],[655,6],[1029,6],[1695,6]]},"1107":{"position":[[1,6]]},"1162":{"position":[[381,8]]},"1181":{"position":[[468,8]]},"1184":{"position":[[1,8]]},"1227":{"position":[[516,6]]},"1231":{"position":[[935,6]]},"1246":{"position":[[1752,6]]},"1265":{"position":[[510,6]]},"1295":{"position":[[26,8]]},"1296":{"position":[[972,6],[1331,6],[1825,6]]},"1301":{"position":[[52,8]]},"1316":{"position":[[2070,6]]}},"keywords":{}}],["normalfield",{"_index":3351,"title":{},"content":{"554":{"position":[[1426,12],[1511,14]]},"555":{"position":[[316,12],[510,12]]},"556":{"position":[[852,12]]}},"keywords":{}}],["nosql",{"_index":414,"title":{"73":{"position":[[0,5]]},"74":{"position":[[0,5]]},"104":{"position":[[0,5]]},"105":{"position":[[0,5]]},"231":{"position":[[0,5]]},"264":{"position":[[18,5]]},"276":{"position":[[0,5]]},"278":{"position":[[4,5]]},"281":{"position":[[0,5]]},"282":{"position":[[29,5]]},"309":{"position":[[17,5]]},"348":{"position":[[26,5]]},"349":{"position":[[39,6]]},"353":{"position":[[3,5]]},"794":{"position":[[36,5]]},"1253":{"position":[[19,8]]},"1312":{"position":[[25,5]]},"1315":{"position":[[22,6]]},"1320":{"position":[[32,6]]},"1323":{"position":[[19,6]]}},"content":{"25":{"position":[[52,5],[181,5]]},"41":{"position":[[153,5]]},"73":{"position":[[1,5]]},"104":{"position":[[15,5],[158,5]]},"105":{"position":[[61,5]]},"118":{"position":[[124,5]]},"126":{"position":[[237,5]]},"174":{"position":[[479,5],[640,5],[747,5]]},"179":{"position":[[20,5]]},"202":{"position":[[242,5]]},"231":{"position":[[15,5],[188,5]]},"244":{"position":[[542,5]]},"252":{"position":[[117,5]]},"265":{"position":[[57,5]]},"267":{"position":[[1160,5]]},"271":{"position":[[104,5]]},"273":{"position":[[24,5]]},"276":{"position":[[8,5],[264,5]]},"278":{"position":[[90,5],[207,5]]},"279":{"position":[[1,5]]},"280":{"position":[[104,5]]},"281":{"position":[[116,5],[272,5]]},"282":{"position":[[110,5],[197,5]]},"289":{"position":[[614,5],[1037,5]]},"313":{"position":[[18,5]]},"317":{"position":[[145,5]]},"325":{"position":[[23,5]]},"350":{"position":[[127,5]]},"351":{"position":[[140,5]]},"353":{"position":[[151,5]]},"354":{"position":[[1,5],[861,5],[1013,5],[1166,5],[1632,5]]},"359":{"position":[[6,5]]},"361":{"position":[[218,5]]},"362":{"position":[[43,5]]},"370":{"position":[[146,5]]},"378":{"position":[[47,5]]},"392":{"position":[[1197,5]]},"412":{"position":[[14481,5],[14818,5]]},"479":{"position":[[31,5]]},"501":{"position":[[109,5]]},"502":{"position":[[42,5]]},"504":{"position":[[1158,5]]},"561":{"position":[[242,5]]},"566":{"position":[[152,5]]},"575":{"position":[[77,5]]},"631":{"position":[[28,5],[318,5]]},"662":{"position":[[27,5]]},"678":{"position":[[43,5]]},"686":{"position":[[197,5],[310,5],[505,5]]},"705":{"position":[[233,6],[548,5],[615,5]]},"710":{"position":[[13,5]]},"772":{"position":[[315,5]]},"793":{"position":[[1298,5]]},"801":{"position":[[125,5]]},"802":{"position":[[54,5]]},"837":{"position":[[27,5]]},"838":{"position":[[27,5]]},"841":{"position":[[151,5],[183,5],[235,5]]},"903":{"position":[[586,5]]},"1071":{"position":[[17,5]]},"1102":{"position":[[1151,5]]},"1105":{"position":[[172,5],[226,5]]},"1132":{"position":[[606,5],[1275,5]]},"1247":{"position":[[402,5]]},"1253":{"position":[[12,5]]},"1313":{"position":[[999,5]]},"1315":{"position":[[139,6],[480,5],[1383,6]]},"1316":{"position":[[3098,6]]},"1317":{"position":[[79,5]]},"1318":{"position":[[6,5],[741,5]]},"1319":{"position":[[134,5]]},"1320":{"position":[[541,6]]},"1321":{"position":[[601,5]]}},"keywords":{}}],["nosql/docu",{"_index":2763,"title":{},"content":{"412":{"position":[[13478,14]]}},"keywords":{}}],["nosql—solv",{"_index":2069,"title":{},"content":{"358":{"position":[[860,11]]}},"keywords":{}}],["nosql’",{"_index":2003,"title":{},"content":{"352":{"position":[[352,7]]}},"keywords":{}}],["not"",{"_index":4919,"title":{},"content":{"863":{"position":[[733,9]]}},"keywords":{}}],["notabl",{"_index":1616,"title":{},"content":{"267":{"position":[[82,7]]},"282":{"position":[[455,7]]},"356":{"position":[[66,8]]}},"keywords":{}}],["note",{"_index":68,"title":{},"content":{"4":{"position":[[166,4]]},"9":{"position":[[36,4]]},"198":{"position":[[467,4]]},"211":{"position":[[345,6],[371,6]]},"299":{"position":[[169,5]]},"300":{"position":[[649,4]]},"314":{"position":[[613,5],[693,6],[719,6]]},"375":{"position":[[167,4]]},"388":{"position":[[428,4]]},"391":{"position":[[948,4]]},"394":{"position":[[972,4],[1301,4]]},"432":{"position":[[519,6]]},"436":{"position":[[317,4]]},"446":{"position":[[129,4]]},"555":{"position":[[701,5]]},"613":{"position":[[535,4]]},"620":{"position":[[478,4]]},"693":{"position":[[651,4]]},"759":{"position":[[1010,4]]},"770":{"position":[[533,4]]},"871":{"position":[[535,4]]},"872":{"position":[[1134,4]]},"875":{"position":[[5618,4],[7554,4]]},"886":{"position":[[4648,5],[4930,4]]},"890":{"position":[[949,4]]},"897":{"position":[[354,4]]},"927":{"position":[[46,4]]},"944":{"position":[[364,4]]},"951":{"position":[[445,4]]},"953":{"position":[[170,4]]},"1013":{"position":[[620,4]]},"1018":{"position":[[338,4]]},"1067":{"position":[[605,4]]},"1079":{"position":[[484,4]]},"1105":{"position":[[1012,4]]},"1107":{"position":[[915,4]]},"1108":{"position":[[568,4]]}},"keywords":{}}],["noteschrome/chromium",{"_index":1740,"title":{},"content":{"299":{"position":[[233,20]]}},"keywords":{}}],["noth",{"_index":3963,"title":{"704":{"position":[[0,7]]}},"content":{"702":{"position":[[427,7]]},"754":{"position":[[292,7]]},"975":{"position":[[367,7],[561,7]]},"1192":{"position":[[196,7]]},"1313":{"position":[[725,7]]},"1319":{"position":[[373,7]]}},"keywords":{}}],["notic",{"_index":2502,"title":{"743":{"position":[[0,7]]}},"content":{"404":{"position":[[322,6]]},"408":{"position":[[3229,10]]},"452":{"position":[[512,10]]},"458":{"position":[[1325,6]]},"459":{"position":[[982,6]]},"461":{"position":[[209,6],[1385,6]]},"462":{"position":[[181,6]]},"463":{"position":[[787,6]]},"464":{"position":[[439,6]]},"465":{"position":[[300,6]]},"466":{"position":[[264,6]]},"467":{"position":[[259,6]]},"571":{"position":[[297,6]]},"659":{"position":[[319,6]]},"749":{"position":[[7361,6],[21563,6]]},"756":{"position":[[342,6]]},"773":{"position":[[638,6]]},"798":{"position":[[941,6]]},"811":{"position":[[412,6]]},"836":{"position":[[705,6]]},"854":{"position":[[1486,6]]},"857":{"position":[[452,6]]},"861":{"position":[[1387,6]]},"872":{"position":[[332,6]]},"875":{"position":[[2242,6]]},"904":{"position":[[3112,6]]},"977":{"position":[[415,6]]},"979":{"position":[[93,6]]},"988":{"position":[[3256,6],[4585,6]]},"990":{"position":[[771,6]]},"1002":{"position":[[824,6]]},"1047":{"position":[[48,6]]},"1065":{"position":[[450,6]]},"1090":{"position":[[1080,6]]},"1100":{"position":[[795,6]]},"1108":{"position":[[231,6]]},"1151":{"position":[[58,6]]},"1178":{"position":[[58,6]]},"1193":{"position":[[78,6]]},"1208":{"position":[[134,6],[404,6]]},"1210":{"position":[[189,6]]},"1211":{"position":[[310,6]]},"1276":{"position":[[156,6]]},"1278":{"position":[[1,6]]}},"keywords":{}}],["notif",{"_index":1128,"title":{},"content":{"140":{"position":[[246,14]]},"168":{"position":[[337,14]]},"299":{"position":[[1375,13]]},"344":{"position":[[128,14]]},"421":{"position":[[287,14]]},"458":{"position":[[1199,12]]},"495":{"position":[[471,13]]},"529":{"position":[[221,13]]},"618":{"position":[[549,13],[642,13]]}},"keywords":{}}],["notifi",{"_index":593,"title":{},"content":{"38":{"position":[[556,6]]},"412":{"position":[[2288,8]]},"490":{"position":[[222,8]]},"496":{"position":[[549,6]]},"515":{"position":[[234,8]]},"649":{"position":[[54,8]]}},"keywords":{}}],["notion",{"_index":2798,"title":{},"content":{"419":{"position":[[146,6],[1840,6]]}},"keywords":{}}],["notori",{"_index":2722,"title":{},"content":{"412":{"position":[[7875,11]]}},"keywords":{}}],["now",{"_index":407,"title":{},"content":{"24":{"position":[[622,3]]},"36":{"position":[[300,3]]},"65":{"position":[[1,3]]},"127":{"position":[[1,3]]},"187":{"position":[[1,3]]},"393":{"position":[[1,3]]},"398":{"position":[[3452,3]]},"402":{"position":[[353,3]]},"404":{"position":[[5,3]]},"408":{"position":[[1060,3]]},"413":{"position":[[4,3]]},"421":{"position":[[550,4]]},"456":{"position":[[1,3]]},"462":{"position":[[1,3]]},"465":{"position":[[1,3]]},"467":{"position":[[1,3]]},"480":{"position":[[933,3]]},"488":{"position":[[1,3]]},"542":{"position":[[654,4]]},"563":{"position":[[764,3]]},"613":{"position":[[639,3]]},"624":{"position":[[1380,3]]},"661":{"position":[[763,3]]},"698":{"position":[[171,3]]},"704":{"position":[[120,3]]},"711":{"position":[[1078,3],[1671,3]]},"736":{"position":[[319,3]]},"737":{"position":[[331,3]]},"749":{"position":[[2634,3]]},"824":{"position":[[9,3]]},"839":{"position":[[132,3],[416,3]]},"862":{"position":[[1,3]]},"872":{"position":[[1380,3],[2144,3],[2908,3]]},"898":{"position":[[1192,5]]},"932":{"position":[[543,3]]},"954":{"position":[[183,3]]},"967":{"position":[[385,3]]},"977":{"position":[[123,3]]},"1039":{"position":[[357,3]]},"1064":{"position":[[252,3]]},"1069":{"position":[[846,3]]},"1085":{"position":[[2991,3]]},"1100":{"position":[[184,3]]},"1296":{"position":[[658,3]]},"1311":{"position":[[1,3]]},"1316":{"position":[[687,3],[1132,3]]},"1318":{"position":[[434,3],[565,3]]},"1324":{"position":[[437,4]]}},"keywords":{}}],["nowaday",{"_index":2630,"title":{},"content":{"411":{"position":[[3745,9]]}},"keywords":{}}],["npm",{"_index":28,"title":{"726":{"position":[[0,4]]},"1274":{"position":[[23,3]]}},"content":{"1":{"position":[[420,3]]},"2":{"position":[[101,3],[131,3]]},"3":{"position":[[109,3]]},"4":{"position":[[275,3]]},"5":{"position":[[191,3]]},"6":{"position":[[258,3],[290,3]]},"7":{"position":[[213,3]]},"8":{"position":[[229,3],[463,3]]},"9":{"position":[[125,3]]},"10":{"position":[[54,3]]},"11":{"position":[[92,3]]},"38":{"position":[[778,4]]},"49":{"position":[[56,4],[62,3]]},"128":{"position":[[120,3],[167,3]]},"188":{"position":[[1738,3],[2246,3]]},"211":{"position":[[15,3]]},"257":{"position":[[1,3]]},"285":{"position":[[201,3]]},"314":{"position":[[252,3]]},"333":{"position":[[29,3],[43,3]]},"420":{"position":[[15,3]]},"438":{"position":[[211,3]]},"537":{"position":[[35,4],[41,3]]},"542":{"position":[[202,3]]},"553":{"position":[[79,3],[96,3]]},"578":{"position":[[58,3],[72,3]]},"597":{"position":[[37,4],[43,3]]},"617":{"position":[[2244,3]]},"659":{"position":[[232,3],[236,3]]},"661":{"position":[[533,3]]},"662":{"position":[[1255,3]]},"666":{"position":[[235,3],[311,3]]},"668":{"position":[[376,3]]},"670":{"position":[[508,3],[540,3]]},"710":{"position":[[1449,3]]},"711":{"position":[[904,3]]},"717":{"position":[[425,3]]},"724":{"position":[[111,3]]},"726":{"position":[[100,3]]},"727":{"position":[[89,3]]},"728":{"position":[[166,3]]},"829":{"position":[[50,3]]},"836":{"position":[[505,3]]},"837":{"position":[[1321,3]]},"838":{"position":[[1786,3]]},"854":{"position":[[33,3]]},"862":{"position":[[156,3]]},"866":{"position":[[29,3]]},"872":{"position":[[123,3]]},"878":{"position":[[64,3]]},"882":{"position":[[45,3]]},"894":{"position":[[15,3]]},"898":{"position":[[25,3]]},"904":{"position":[[2418,3]]},"911":{"position":[[398,3]]},"1097":{"position":[[73,3]]},"1112":{"position":[[59,3]]},"1133":{"position":[[135,3],[150,3],[419,3]]},"1138":{"position":[[69,3]]},"1139":{"position":[[369,3]]},"1145":{"position":[[358,3]]},"1148":{"position":[[458,3]]},"1189":{"position":[[32,3]]},"1272":{"position":[[446,3]]},"1274":{"position":[[202,3]]},"1276":{"position":[[599,3]]},"1277":{"position":[[39,3]]},"1279":{"position":[[30,3]]}},"keywords":{}}],["nr",{"_index":2928,"title":{},"content":{"439":{"position":[[710,4],[810,4]]}},"keywords":{}}],["nuanc",{"_index":2806,"title":{},"content":{"419":{"position":[[1150,7]]}},"keywords":{}}],["null",{"_index":4442,"title":{"887":{"position":[[13,4]]}},"content":{"751":{"position":[[408,5],[1983,5]]},"810":{"position":[[169,4]]},"829":{"position":[[1598,5]]},"875":{"position":[[4587,4]]},"886":{"position":[[3075,4]]},"887":{"position":[[52,4],[207,4],[540,4],[635,5]]},"898":{"position":[[1017,5],[1053,5],[1131,5],[1202,4],[4245,4],[4392,4]]},"919":{"position":[[44,4]]},"983":{"position":[[229,5]]},"988":{"position":[[3191,5]]},"1016":{"position":[[91,4]]},"1017":{"position":[[70,4],[234,4]]},"1049":{"position":[[96,5]]},"1056":{"position":[[49,4]]},"1057":{"position":[[375,4]]}},"keywords":{}}],["nullabl",{"_index":5219,"title":{},"content":{"898":{"position":[[3545,8],[4197,8],[4254,8]]}},"keywords":{}}],["number",{"_index":1219,"title":{},"content":{"174":{"position":[[1662,6]]},"314":{"position":[[867,8]]},"334":{"position":[[747,8]]},"390":{"position":[[544,8]]},"391":{"position":[[882,8]]},"392":{"position":[[4989,6]]},"393":{"position":[[800,7]]},"394":{"position":[[1440,6]]},"395":{"position":[[478,8]]},"396":{"position":[[301,6],[1187,6]]},"397":{"position":[[1697,10]]},"398":{"position":[[739,9],[1980,9],[2943,6]]},"402":{"position":[[245,7],[491,8],[2613,7]]},"411":{"position":[[334,6]]},"420":{"position":[[408,7]]},"424":{"position":[[230,8]]},"459":{"position":[[1095,8],[1156,7]]},"496":{"position":[[228,7]]},"579":{"position":[[761,8]]},"617":{"position":[[392,6],[526,6],[774,6]]},"620":{"position":[[251,8]]},"623":{"position":[[33,6]]},"639":{"position":[[529,8]]},"662":{"position":[[2521,8]]},"680":{"position":[[927,9]]},"724":{"position":[[1161,7]]},"736":{"position":[[110,7]]},"749":{"position":[[7425,8],[17798,6],[20566,6],[21375,8],[23903,6]]},"751":{"position":[[99,6]]},"821":{"position":[[783,6]]},"838":{"position":[[2735,8]]},"879":{"position":[[138,6]]},"898":{"position":[[2630,8]]},"902":{"position":[[285,6]]},"926":{"position":[[45,7]]},"928":{"position":[[14,6],[42,7]]},"1067":{"position":[[483,6]]},"1074":{"position":[[94,6],[340,6]]},"1076":{"position":[[24,7]]},"1079":{"position":[[148,7]]},"1080":{"position":[[466,9],[479,6],[697,8]]},"1125":{"position":[[751,6]]},"1149":{"position":[[1188,8]]},"1194":{"position":[[1057,6]]},"1257":{"position":[[145,6]]},"1296":{"position":[[718,6]]},"1305":{"position":[[604,6]]},"1311":{"position":[[1736,6]]},"1316":{"position":[[2167,6]]},"1321":{"position":[[316,7]]}},"keywords":{}}],["number/integ",{"_index":4397,"title":{},"content":{"749":{"position":[[20299,14]]}},"keywords":{}}],["numer",{"_index":715,"title":{},"content":{"46":{"position":[[497,8]]},"71":{"position":[[66,8]]},"174":{"position":[[58,8]]},"384":{"position":[[70,8]]},"390":{"position":[[180,9]]},"478":{"position":[[22,8]]},"688":{"position":[[996,7]]},"690":{"position":[[369,8]]}},"keywords":{}}],["nvmrcclone",{"_index":3822,"title":{},"content":{"666":{"position":[[120,11]]}},"keywords":{}}],["nw.j",{"_index":505,"title":{},"content":{"32":{"position":[[67,6]]}},"keywords":{}}],["object",{"_index":572,"title":{"304":{"position":[[31,7]]},"787":{"position":[[0,6]]},"826":{"position":[[28,8]]},"1254":{"position":[[32,8]]}},"content":{"36":{"position":[[200,6]]},"45":{"position":[[139,6]]},"47":{"position":[[685,6]]},"51":{"position":[[379,9]]},"104":{"position":[[131,7]]},"174":{"position":[[626,7],[838,7]]},"188":{"position":[[1256,9]]},"209":{"position":[[443,9]]},"211":{"position":[[423,9]]},"231":{"position":[[170,8]]},"255":{"position":[[787,9]]},"259":{"position":[[105,9]]},"303":{"position":[[434,8]]},"304":{"position":[[53,6],[170,7],[497,8]]},"314":{"position":[[753,9]]},"315":{"position":[[729,9]]},"316":{"position":[[238,9]]},"334":{"position":[[142,6],[657,9]]},"350":{"position":[[90,7]]},"352":{"position":[[110,7]]},"367":{"position":[[800,9]]},"392":{"position":[[607,9],[1573,9]]},"426":{"position":[[231,7],[380,6],[474,6]]},"439":{"position":[[599,7]]},"457":{"position":[[233,7],[508,6]]},"462":{"position":[[725,6]]},"480":{"position":[[553,9]]},"482":{"position":[[853,9]]},"533":{"position":[[181,8]]},"538":{"position":[[680,9]]},"554":{"position":[[1344,9]]},"559":{"position":[[1208,7]]},"560":{"position":[[459,8]]},"562":{"position":[[325,9]]},"564":{"position":[[782,9]]},"566":{"position":[[126,6]]},"579":{"position":[[665,9]]},"580":{"position":[[167,8]]},"593":{"position":[[181,8]]},"598":{"position":[[687,9]]},"632":{"position":[[1537,9]]},"638":{"position":[[621,9]]},"639":{"position":[[399,9]]},"662":{"position":[[2400,9]]},"680":{"position":[[847,9]]},"717":{"position":[[1456,9]]},"720":{"position":[[155,9]]},"734":{"position":[[721,9]]},"746":{"position":[[221,6]]},"749":{"position":[[1490,6],[3039,7],[3878,6],[4055,7],[4181,6],[4410,6],[4661,6],[7882,6],[12013,6],[12129,7],[19713,6],[22150,6]]},"751":{"position":[[156,6]]},"754":{"position":[[464,6]]},"767":{"position":[[34,6]]},"789":{"position":[[41,6],[85,6]]},"805":{"position":[[145,6]]},"806":{"position":[[131,7]]},"808":{"position":[[570,9]]},"812":{"position":[[93,9],[159,9]]},"813":{"position":[[93,9]]},"825":{"position":[[74,8]]},"826":{"position":[[191,7],[320,7]]},"829":{"position":[[3159,6]]},"838":{"position":[[2614,9]]},"839":{"position":[[233,6]]},"841":{"position":[[206,6],[403,6],[1491,6]]},"854":{"position":[[892,6]]},"862":{"position":[[687,9]]},"872":{"position":[[1904,9],[4134,9]]},"886":{"position":[[178,6],[264,8],[1357,6]]},"889":{"position":[[709,6]]},"898":{"position":[[2484,9]]},"904":{"position":[[876,9]]},"916":{"position":[[73,6],[162,9]]},"932":{"position":[[1214,9]]},"934":{"position":[[57,6]]},"937":{"position":[[118,7]]},"944":{"position":[[136,6],[668,7]]},"945":{"position":[[77,6]]},"955":{"position":[[26,6]]},"957":{"position":[[27,6]]},"958":{"position":[[304,6]]},"976":{"position":[[22,6]]},"978":{"position":[[27,6]]},"990":{"position":[[732,7]]},"1004":{"position":[[307,6]]},"1051":{"position":[[43,7],[81,7]]},"1052":{"position":[[44,6]]},"1053":{"position":[[27,6]]},"1065":{"position":[[202,6]]},"1069":{"position":[[258,6],[330,6],[534,7]]},"1070":{"position":[[27,6]]},"1074":{"position":[[526,7]]},"1078":{"position":[[500,9]]},"1080":{"position":[[123,9],[660,9]]},"1082":{"position":[[208,9]]},"1083":{"position":[[408,9]]},"1084":{"position":[[41,7]]},"1085":{"position":[[532,6],[1555,7]]},"1104":{"position":[[299,6]]},"1114":{"position":[[423,7]]},"1116":{"position":[[80,6],[135,6]]},"1140":{"position":[[409,6]]},"1149":{"position":[[1067,9]]},"1158":{"position":[[395,9]]},"1208":{"position":[[315,7]]},"1213":{"position":[[228,8]]},"1218":{"position":[[131,6]]},"1220":{"position":[[334,6]]},"1274":{"position":[[568,6]]},"1279":{"position":[[955,6]]},"1309":{"position":[[26,6]]},"1311":{"position":[[423,9]]},"1321":{"position":[[1033,7]]}},"keywords":{}}],["object.assign",{"_index":4836,"title":{},"content":{"848":{"position":[[303,17]]}},"keywords":{}}],["object.defineproperty(rxdocu",{"_index":4559,"title":{},"content":{"770":{"position":[[366,33]]}},"keywords":{}}],["object.entries(doc).foreach(([k",{"_index":5151,"title":{},"content":{"887":{"position":[[580,32]]}},"keywords":{}}],["object.keys(activereplications).foreach(cid",{"_index":5578,"title":{},"content":{"1007":{"position":[[2152,43]]}},"keywords":{}}],["object/key",{"_index":6188,"title":{},"content":{"1206":{"position":[[235,10]]}},"keywords":{}}],["objectid",{"_index":4434,"title":{},"content":{"749":{"position":[[23891,8]]}},"keywords":{}}],["objects"",{"_index":1481,"title":{},"content":{"244":{"position":[[234,13]]}},"keywords":{}}],["objects.avoid",{"_index":2008,"title":{},"content":{"353":{"position":[[332,13]]}},"keywords":{}}],["objectstor",{"_index":2996,"title":{},"content":{"459":{"position":[[683,11]]}},"keywords":{}}],["objectstore.index('priceindex",{"_index":2998,"title":{},"content":{"459":{"position":[[748,32]]}},"keywords":{}}],["object—perhap",{"_index":1995,"title":{},"content":{"351":{"position":[[285,14]]}},"keywords":{}}],["objpath",{"_index":4315,"title":{},"content":{"749":{"position":[[13778,7]]}},"keywords":{}}],["observ",{"_index":183,"title":{"54":{"position":[[10,11]]},"75":{"position":[[0,10]]},"77":{"position":[[0,10]]},"78":{"position":[[10,8]]},"103":{"position":[[0,10]]},"106":{"position":[[0,10]]},"108":{"position":[[10,8]]},"124":{"position":[[0,10]]},"130":{"position":[[30,7]]},"144":{"position":[[54,12]]},"159":{"position":[[0,10]]},"185":{"position":[[0,10]]},"233":{"position":[[0,10]]},"234":{"position":[[10,8]]},"235":{"position":[[0,10]]},"275":{"position":[[0,10]]},"277":{"position":[[6,7]]},"329":{"position":[[0,10]]},"518":{"position":[[0,10]]},"541":{"position":[[10,11]]},"562":{"position":[[19,14]]},"563":{"position":[[40,12]]},"580":{"position":[[24,12]]},"585":{"position":[[0,10]]},"601":{"position":[[11,11]]},"822":{"position":[[59,11]]},"941":{"position":[[0,7]]},"970":{"position":[[0,7]]},"985":{"position":[[6,12]]},"993":{"position":[[0,11]]},"1046":{"position":[[0,7]]},"1058":{"position":[[0,7]]},"1117":{"position":[[0,14]]}},"content":{"13":{"position":[[12,11]]},"16":{"position":[[545,10]]},"33":{"position":[[236,10]]},"38":{"position":[[499,7]]},"47":{"position":[[703,10]]},"50":{"position":[[19,11],[236,11],[413,10]]},"55":{"position":[[127,11],[1064,11]]},"75":{"position":[[28,7]]},"77":{"position":[[20,10]]},"103":{"position":[[15,10]]},"106":{"position":[[13,9]]},"108":{"position":[[52,8]]},"121":{"position":[[78,11]]},"124":{"position":[[60,10],[203,10]]},"126":{"position":[[262,11]]},"129":{"position":[[125,12],[410,12],[540,11]]},"130":{"position":[[76,11],[195,7]]},"143":{"position":[[54,11],[176,12],[343,12]]},"144":{"position":[[124,12]]},"153":{"position":[[202,11]]},"156":{"position":[[81,11]]},"159":{"position":[[32,10],[113,10]]},"174":{"position":[[163,10],[218,11],[1009,7],[1512,8],[1617,8]]},"182":{"position":[[91,12]]},"185":{"position":[[32,10],[239,10]]},"221":{"position":[[210,7]]},"233":{"position":[[32,10],[69,10]]},"234":{"position":[[16,8]]},"235":{"position":[[15,10],[121,9]]},"275":{"position":[[58,10],[207,11]]},"277":{"position":[[67,11]]},"326":{"position":[[15,11]]},"329":{"position":[[42,10]]},"335":{"position":[[281,10]]},"346":{"position":[[174,12]]},"368":{"position":[[234,10],[280,10]]},"369":{"position":[[1186,8]]},"410":{"position":[[1950,8]]},"411":{"position":[[2704,10],[2845,10]]},"427":{"position":[[1390,7]]},"432":{"position":[[547,14],[798,7],[1144,14]]},"445":{"position":[[1417,12]]},"458":{"position":[[691,7],[729,7],[915,9]]},"480":{"position":[[80,7],[685,7],[777,10]]},"490":{"position":[[29,11]]},"493":{"position":[[51,12]]},"502":{"position":[[603,10],[624,10],[1003,10]]},"510":{"position":[[270,10]]},"514":{"position":[[306,12]]},"518":{"position":[[29,11],[76,10],[119,7],[254,10],[470,10]]},"523":{"position":[[304,7]]},"535":{"position":[[698,10],[743,10],[810,7],[1014,8]]},"540":{"position":[[166,11]]},"541":{"position":[[38,12],[329,10]]},"562":{"position":[[1242,10]]},"563":{"position":[[44,12],[656,12],[888,12]]},"566":{"position":[[420,13],[569,11]]},"571":{"position":[[944,10]]},"580":{"position":[[26,11],[595,10]]},"585":{"position":[[49,11]]},"591":{"position":[[481,11]]},"595":{"position":[[719,10],[764,10],[897,7],[1091,8]]},"601":{"position":[[550,10]]},"602":{"position":[[205,12]]},"626":{"position":[[839,11]]},"632":{"position":[[1790,10]]},"649":{"position":[[36,10]]},"655":{"position":[[243,12]]},"661":{"position":[[1527,7]]},"662":{"position":[[2749,7]]},"698":{"position":[[3194,7]]},"710":{"position":[[2057,7]]},"711":{"position":[[1986,7]]},"749":{"position":[[9539,10],[9664,7],[9764,8],[9852,7],[13885,10],[14009,7]]},"752":{"position":[[912,10]]},"753":{"position":[[41,10]]},"826":{"position":[[5,10],[132,10]]},"828":{"position":[[56,12]]},"831":{"position":[[235,12]]},"836":{"position":[[1326,14],[1404,7]]},"838":{"position":[[423,13],[2963,7]]},"840":{"position":[[185,13]]},"841":{"position":[[488,13]]},"854":{"position":[[1655,7]]},"872":{"position":[[1142,7],[2839,9]]},"875":{"position":[[6688,11],[6947,10],[7589,10],[7706,7],[7800,7],[7848,10]]},"879":{"position":[[392,10]]},"880":{"position":[[204,10]]},"881":{"position":[[214,11]]},"898":{"position":[[744,11],[4024,7]]},"904":{"position":[[3358,7],[3413,7],[3432,10]]},"921":{"position":[[9,10]]},"941":{"position":[[34,10],[187,7]]},"955":{"position":[[102,9]]},"965":{"position":[[150,8],[256,8]]},"970":{"position":[[34,10]]},"976":{"position":[[78,9]]},"983":{"position":[[735,10]]},"984":{"position":[[677,11]]},"985":{"position":[[79,8]]},"988":{"position":[[4103,12],[6103,12]]},"992":{"position":[[98,7]]},"993":{"position":[[4,7],[61,10]]},"995":{"position":[[1268,7],[1770,7]]},"1017":{"position":[[32,10]]},"1018":{"position":[[228,7]]},"1033":{"position":[[129,7]]},"1039":{"position":[[26,10]]},"1040":{"position":[[304,12]]},"1046":{"position":[[34,10]]},"1067":{"position":[[493,7],[2070,7]]},"1071":{"position":[[506,8]]},"1083":{"position":[[130,8]]},"1084":{"position":[[124,7]]},"1102":{"position":[[1184,7]]},"1117":{"position":[[50,7],[85,11],[156,11],[315,10],[359,10],[424,10]]},"1124":{"position":[[753,11],[808,7],[1088,7]]},"1132":{"position":[[897,10]]},"1150":{"position":[[375,8]]},"1218":{"position":[[159,10]]},"1298":{"position":[[392,10]]},"1315":{"position":[[1580,7]]},"1318":{"position":[[333,10]]}},"keywords":{}}],["observable.subscribe(newvalu",{"_index":6000,"title":{},"content":{"1117":{"position":[[435,29]]}},"keywords":{}}],["observables.excel",{"_index":2171,"title":{},"content":{"387":{"position":[[117,21]]}},"keywords":{}}],["obstacl",{"_index":2652,"title":{},"content":{"412":{"position":[[399,9],[494,10]]},"709":{"position":[[338,9]]}},"keywords":{}}],["obtain",{"_index":3324,"title":{},"content":{"542":{"position":[[667,6]]},"550":{"position":[[56,7]]}},"keywords":{}}],["obvious",{"_index":2595,"title":{},"content":{"410":{"position":[[944,10]]}},"keywords":{}}],["occas",{"_index":4103,"title":{},"content":{"740":{"position":[[9,10]]}},"keywords":{}}],["occasion",{"_index":2055,"title":{},"content":{"357":{"position":[[569,12]]},"525":{"position":[[355,12]]},"569":{"position":[[495,10]]},"1192":{"position":[[347,12]]}},"keywords":{}}],["occur",{"_index":1035,"title":{},"content":{"103":{"position":[[100,6]]},"156":{"position":[[166,7]]},"168":{"position":[[243,7]]},"196":{"position":[[71,6]]},"301":{"position":[[254,7]]},"326":{"position":[[227,5]]},"415":{"position":[[193,6]]},"491":{"position":[[1760,6]]},"495":{"position":[[190,5]]},"497":{"position":[[702,6]]},"515":{"position":[[277,6]]},"518":{"position":[[247,6]]},"523":{"position":[[195,6]]},"529":{"position":[[97,6]]},"570":{"position":[[381,6]]},"574":{"position":[[334,6]]},"621":{"position":[[530,5]]},"634":{"position":[[107,5]]},"912":{"position":[[405,7]]},"1033":{"position":[[257,5]]},"1299":{"position":[[286,9]]}},"keywords":{}}],["occurr",{"_index":1657,"title":{},"content":{"282":{"position":[[29,10]]}},"keywords":{}}],["off",{"_index":2422,"title":{},"content":{"398":{"position":[[3139,4]]},"412":{"position":[[116,4],[3961,4]]},"689":{"position":[[87,5]]},"1162":{"position":[[1154,4]]},"1324":{"position":[[796,5]]}},"keywords":{}}],["offer",{"_index":536,"title":{},"content":{"34":{"position":[[398,6]]},"39":{"position":[[173,6]]},"40":{"position":[[634,5]]},"42":{"position":[[109,5]]},"43":{"position":[[492,6],[566,6]]},"47":{"position":[[1277,6]]},"59":{"position":[[124,5]]},"64":{"position":[[31,6]]},"65":{"position":[[1840,6]]},"66":{"position":[[60,6]]},"70":{"position":[[186,5]]},"72":{"position":[[6,6]]},"75":{"position":[[64,8]]},"92":{"position":[[19,5]]},"95":{"position":[[125,5]]},"105":{"position":[[94,5]]},"112":{"position":[[6,6]]},"118":{"position":[[239,6]]},"120":{"position":[[269,6]]},"124":{"position":[[6,6]]},"131":{"position":[[311,6]]},"134":{"position":[[110,6]]},"137":{"position":[[6,6]]},"148":{"position":[[64,8]]},"151":{"position":[[406,6]]},"160":{"position":[[6,6]]},"161":{"position":[[311,6]]},"166":{"position":[[76,6]]},"168":{"position":[[6,6]]},"173":{"position":[[1204,5]]},"174":{"position":[[51,6],[2385,6]]},"175":{"position":[[351,6]]},"179":{"position":[[167,6]]},"186":{"position":[[175,6]]},"189":{"position":[[6,6],[356,6]]},"192":{"position":[[139,5]]},"193":{"position":[[6,6]]},"197":{"position":[[65,6]]},"198":{"position":[[6,6]]},"205":{"position":[[66,6]]},"206":{"position":[[16,6]]},"222":{"position":[[172,5]]},"223":{"position":[[223,5]]},"224":{"position":[[20,5]]},"230":{"position":[[97,6]]},"236":{"position":[[162,6]]},"237":{"position":[[6,6]]},"263":{"position":[[117,6]]},"266":{"position":[[12,6],[57,6]]},"271":{"position":[[136,6]]},"281":{"position":[[283,6]]},"286":{"position":[[215,6]]},"287":{"position":[[158,5],[521,6],[1243,6]]},"289":{"position":[[1053,6]]},"291":{"position":[[6,6]]},"294":{"position":[[61,6]]},"295":{"position":[[44,6]]},"314":{"position":[[200,7]]},"316":{"position":[[41,6]]},"321":{"position":[[527,8]]},"331":{"position":[[174,5]]},"339":{"position":[[56,6]]},"347":{"position":[[358,6]]},"356":{"position":[[145,6]]},"362":{"position":[[1429,6]]},"365":{"position":[[687,8]]},"368":{"position":[[6,6]]},"371":{"position":[[59,6]]},"375":{"position":[[919,8]]},"387":{"position":[[22,7]]},"390":{"position":[[1860,6]]},"403":{"position":[[189,6]]},"418":{"position":[[684,6]]},"420":{"position":[[1512,5]]},"425":{"position":[[117,6]]},"430":{"position":[[20,6],[826,5],[1103,5]]},"433":{"position":[[177,6],[227,6]]},"435":{"position":[[17,8]]},"437":{"position":[[213,6]]},"441":{"position":[[498,5]]},"444":{"position":[[844,8]]},"447":{"position":[[265,6]]},"482":{"position":[[62,6]]},"483":{"position":[[1128,10]]},"485":{"position":[[16,5]]},"491":{"position":[[120,6]]},"500":{"position":[[250,5]]},"501":{"position":[[175,8]]},"504":{"position":[[673,6]]},"507":{"position":[[85,8]]},"510":{"position":[[722,8]]},"514":{"position":[[151,6]]},"519":{"position":[[104,8]]},"520":{"position":[[259,6]]},"521":{"position":[[587,6]]},"524":{"position":[[6,6]]},"525":{"position":[[397,6]]},"535":{"position":[[511,5],[1248,6]]},"538":{"position":[[120,8]]},"542":{"position":[[115,5]]},"544":{"position":[[6,6]]},"546":{"position":[[157,5],[299,8]]},"554":{"position":[[6,6]]},"561":{"position":[[223,6]]},"571":{"position":[[1443,5]]},"591":{"position":[[358,6]]},"595":{"position":[[531,5],[1301,6]]},"598":{"position":[[120,8]]},"602":{"position":[[71,6]]},"604":{"position":[[6,6]]},"606":{"position":[[157,5],[289,8]]},"621":{"position":[[13,6],[727,5]]},"622":{"position":[[425,6]]},"640":{"position":[[326,8]]},"641":{"position":[[290,6]]},"688":{"position":[[276,5]]},"723":{"position":[[2735,8]]},"836":{"position":[[1373,5]]},"838":{"position":[[975,6]]},"860":{"position":[[206,6],[752,6],[1149,8]]},"901":{"position":[[708,6]]},"1072":{"position":[[1493,6],[2042,5]]},"1085":{"position":[[1845,6]]},"1132":{"position":[[418,6]]},"1135":{"position":[[31,5]]},"1147":{"position":[[297,6]]},"1148":{"position":[[73,6]]},"1150":{"position":[[10,6]]},"1206":{"position":[[546,8]]}},"keywords":{}}],["offici",{"_index":882,"title":{},"content":{"61":{"position":[[40,8]]},"84":{"position":[[149,8]]},"114":{"position":[[162,8]]},"149":{"position":[[162,8]]},"175":{"position":[[155,8]]},"241":{"position":[[260,8]]},"255":{"position":[[1667,8]]},"261":{"position":[[545,8]]},"306":{"position":[[38,8]]},"347":{"position":[[162,8],[460,8]]},"362":{"position":[[1233,8],[1531,8]]},"373":{"position":[[260,8]]},"511":{"position":[[162,8]]},"531":{"position":[[162,8]]},"567":{"position":[[178,8]]},"591":{"position":[[162,8],[612,8],[712,8]]},"632":{"position":[[736,8]]},"865":{"position":[[187,8]]},"897":{"position":[[87,8]]},"1148":{"position":[[19,8]]}},"keywords":{}}],["offlin",{"_index":181,"title":{"12":{"position":[[26,7]]},"44":{"position":[[14,7]]},"88":{"position":[[8,7]]},"122":{"position":[[0,7]]},"133":{"position":[[0,7]]},"157":{"position":[[0,7]]},"164":{"position":[[0,7]]},"183":{"position":[[0,7]]},"191":{"position":[[0,7]]},"201":{"position":[[12,7]]},"206":{"position":[[8,7]]},"215":{"position":[[0,7]]},"248":{"position":[[9,7]]},"253":{"position":[[8,7]]},"280":{"position":[[0,7]]},"292":{"position":[[6,8]]},"309":{"position":[[3,7]]},"327":{"position":[[0,7]]},"338":{"position":[[0,7]]},"380":{"position":[[0,7]]},"414":{"position":[[17,7]]},"419":{"position":[[0,7]]},"472":{"position":[[20,7]]},"473":{"position":[[14,7]]},"479":{"position":[[30,7]]},"481":{"position":[[4,7]]},"482":{"position":[[14,7]]},"558":{"position":[[54,7]]},"565":{"position":[[0,7]]},"584":{"position":[[0,7]]},"632":{"position":[[19,7]]},"695":{"position":[[27,7]]},"777":{"position":[[14,7]]},"869":{"position":[[49,7]]},"895":{"position":[[50,7]]},"1314":{"position":[[30,7]]}},"content":{"15":{"position":[[510,7]]},"19":{"position":[[554,7]]},"20":{"position":[[275,8]]},"21":{"position":[[166,7]]},"22":{"position":[[383,7]]},"27":{"position":[[43,7],[281,7],[382,7]]},"35":{"position":[[49,7],[602,7]]},"37":{"position":[[274,7],[322,7],[422,8]]},"39":{"position":[[72,7],[239,7],[310,7]]},"40":{"position":[[787,7]]},"43":{"position":[[731,7]]},"46":{"position":[[1,7],[192,8]]},"61":{"position":[[381,7]]},"65":{"position":[[429,7],[565,8],[1899,7]]},"88":{"position":[[40,7]]},"122":{"position":[[45,7],[133,7]]},"126":{"position":[[129,7]]},"133":{"position":[[41,7],[127,7]]},"148":{"position":[[97,7],[390,7]]},"151":{"position":[[201,7]]},"153":{"position":[[331,7]]},"157":{"position":[[18,7]]},"164":{"position":[[38,7]]},"170":{"position":[[124,7],[203,7]]},"173":{"position":[[1371,7],[1471,8]]},"179":{"position":[[422,7]]},"183":{"position":[[17,7]]},"186":{"position":[[258,7]]},"191":{"position":[[8,7],[134,7]]},"198":{"position":[[90,7]]},"201":{"position":[[260,8]]},"206":{"position":[[28,7],[164,7]]},"212":{"position":[[6,7],[94,7],[175,7]]},"215":{"position":[[66,7]]},"241":{"position":[[491,7]]},"248":{"position":[[176,8]]},"253":{"position":[[27,7],[134,7]]},"262":{"position":[[10,7],[40,7],[70,8]]},"263":{"position":[[131,7]]},"266":{"position":[[230,8]]},"270":{"position":[[127,8]]},"273":{"position":[[310,8]]},"274":{"position":[[338,7]]},"280":{"position":[[95,8],[389,7]]},"292":{"position":[[135,8],[313,7]]},"294":{"position":[[29,7]]},"302":{"position":[[547,7]]},"303":{"position":[[1130,7]]},"305":{"position":[[394,7]]},"306":{"position":[[163,7]]},"309":{"position":[[1,7]]},"312":{"position":[[34,8]]},"313":{"position":[[202,7]]},"318":{"position":[[33,7],[612,7]]},"320":{"position":[[382,8]]},"321":{"position":[[196,7],[566,7]]},"325":{"position":[[244,7]]},"327":{"position":[[56,7]]},"331":{"position":[[356,7]]},"338":{"position":[[8,7],[132,8]]},"346":{"position":[[630,7]]},"359":{"position":[[173,7]]},"360":{"position":[[426,7],[536,8]]},"362":{"position":[[168,7],[845,7]]},"373":{"position":[[506,7]]},"375":{"position":[[51,7],[187,7],[1000,8]]},"378":{"position":[[32,7],[230,7]]},"380":{"position":[[53,7],[287,7]]},"384":{"position":[[297,7]]},"388":{"position":[[414,7]]},"407":{"position":[[464,7],[1034,7]]},"408":{"position":[[4640,7],[5491,8]]},"410":{"position":[[924,7],[974,7]]},"411":{"position":[[470,7],[2079,7],[4153,7],[5495,7],[5706,7]]},"412":{"position":[[646,7],[1506,7],[2248,7],[3006,7],[3169,8],[6137,7],[6203,7],[8009,7],[8675,7],[11448,7],[13885,7]]},"416":{"position":[[179,8]]},"418":{"position":[[55,7],[368,7],[582,7]]},"419":{"position":[[22,7],[201,7],[569,7],[612,7],[740,7],[852,7],[1075,7]]},"420":{"position":[[785,7],[1202,7],[1495,7]]},"421":{"position":[[804,8],[1014,8]]},"422":{"position":[[130,7]]},"444":{"position":[[306,7],[519,7],[871,7]]},"445":{"position":[[270,7],[402,7],[491,7]]},"446":{"position":[[1,7],[91,7],[346,7]]},"447":{"position":[[112,7]]},"473":{"position":[[1,7]]},"474":{"position":[[99,7]]},"475":{"position":[[66,7]]},"476":{"position":[[281,7]]},"477":{"position":[[127,7]]},"478":{"position":[[137,7]]},"479":{"position":[[126,7],[518,7]]},"480":{"position":[[334,7],[981,8]]},"481":{"position":[[176,7]]},"482":{"position":[[1243,7]]},"483":{"position":[[16,7],[216,7],[467,7],[678,7],[713,7],[735,7],[1155,7]]},"486":{"position":[[222,7],[304,8]]},"489":{"position":[[592,7]]},"491":{"position":[[431,7],[1111,7],[1143,7],[1382,8]]},"495":{"position":[[119,7]]},"497":{"position":[[189,7]]},"498":{"position":[[485,7]]},"500":{"position":[[187,8],[678,7]]},"502":{"position":[[448,8]]},"504":{"position":[[288,7]]},"510":{"position":[[386,7]]},"513":{"position":[[295,7]]},"516":{"position":[[95,7]]},"525":{"position":[[5,7],[153,7]]},"526":{"position":[[273,7]]},"530":{"position":[[380,7]]},"533":{"position":[[293,7]]},"534":{"position":[[172,7]]},"548":{"position":[[228,7]]},"559":{"position":[[1312,7],[1663,7]]},"561":{"position":[[74,7]]},"562":{"position":[[1015,7]]},"565":{"position":[[172,7]]},"566":{"position":[[1047,7],[1206,7]]},"567":{"position":[[96,7],[313,7],[1187,7]]},"574":{"position":[[184,7],[748,7]]},"576":{"position":[[302,7]]},"582":{"position":[[19,7]]},"584":{"position":[[42,7]]},"590":{"position":[[684,7],[718,7]]},"593":{"position":[[293,7]]},"594":{"position":[[170,7]]},"608":{"position":[[228,7]]},"610":{"position":[[1259,8]]},"626":{"position":[[46,8]]},"631":{"position":[[56,7]]},"632":{"position":[[565,8],[1897,8]]},"635":{"position":[[101,8]]},"644":{"position":[[499,7]]},"690":{"position":[[275,7]]},"696":{"position":[[23,7]]},"698":{"position":[[73,8],[393,7]]},"699":{"position":[[224,7]]},"700":{"position":[[4,7],[541,8],[847,8],[1022,7]]},"701":{"position":[[7,7]]},"702":{"position":[[490,7]]},"703":{"position":[[29,7],[1286,7]]},"704":{"position":[[182,7]]},"705":{"position":[[108,7],[369,7],[1124,7],[1210,7],[1273,7]]},"723":{"position":[[624,7],[2406,7],[2466,7],[2608,8]]},"778":{"position":[[297,7]]},"779":{"position":[[242,7],[333,7]]},"780":{"position":[[503,7]]},"781":{"position":[[553,7],[644,7]]},"782":{"position":[[222,7]]},"783":{"position":[[517,7]]},"784":{"position":[[351,7]]},"785":{"position":[[434,7]]},"786":{"position":[[80,7]]},"836":{"position":[[1953,7]]},"838":{"position":[[690,7]]},"839":{"position":[[757,7]]},"840":{"position":[[264,7],[343,7],[434,7]]},"841":{"position":[[687,7],[695,7],[833,7],[1445,7],[1565,8]]},"860":{"position":[[213,7],[323,7]]},"861":{"position":[[1625,7]]},"906":{"position":[[376,7]]},"913":{"position":[[136,7]]},"981":{"position":[[432,7],[1289,7],[1349,8]]},"985":{"position":[[442,7]]},"987":{"position":[[99,9],[866,7]]},"988":{"position":[[977,7],[5848,7]]},"995":{"position":[[1098,7]]},"1006":{"position":[[135,7],[274,7]]},"1007":{"position":[[696,7],[1062,7]]},"1009":{"position":[[679,8]]},"1032":{"position":[[74,7],[214,8]]},"1093":{"position":[[269,7]]},"1123":{"position":[[739,7]]},"1258":{"position":[[20,7]]},"1301":{"position":[[525,8]]},"1302":{"position":[[1,7]]},"1304":{"position":[[1097,8],[1534,7],[1783,7],[1859,7]]},"1314":{"position":[[27,7]]},"1316":{"position":[[7,7],[473,7],[518,7],[2685,7]]},"1320":{"position":[[11,7]]}},"keywords":{}}],["offline"",{"_index":1478,"title":{},"content":{"244":{"position":[[145,13]]}},"keywords":{}}],["offline/first",{"_index":4598,"title":{},"content":{"786":{"position":[[124,13]]}},"keywords":{}}],["offload",{"_index":3719,"title":{"642":{"position":[[0,10]]}},"content":{"801":{"position":[[314,10]]}},"keywords":{}}],["ohash",{"_index":5404,"title":{},"content":{"968":{"position":[[396,8]]}},"keywords":{}}],["ok",{"_index":3746,"title":{},"content":{"653":{"position":[[112,3]]},"841":{"position":[[938,2]]},"990":{"position":[[407,2]]},"1317":{"position":[[303,3]]}},"keywords":{}}],["old",{"_index":1765,"title":{},"content":{"299":{"position":[[1711,3]]},"302":{"position":[[514,3]]},"402":{"position":[[1965,4]]},"455":{"position":[[924,3]]},"737":{"position":[[481,3]]},"751":{"position":[[303,3]]},"759":{"position":[[518,3],[718,3],[1140,3]]},"760":{"position":[[72,5],[239,3],[435,3],[514,3],[714,3]]},"773":{"position":[[799,3],[875,3]]},"781":{"position":[[109,3]]},"876":{"position":[[527,3]]},"879":{"position":[[196,3]]},"1009":{"position":[[494,3]]},"1119":{"position":[[276,3]]},"1282":{"position":[[592,3]]},"1294":{"position":[[149,3]]},"1319":{"position":[[257,3]]}},"keywords":{}}],["old"",{"_index":4500,"title":{},"content":{"760":{"position":[[145,10]]}},"keywords":{}}],["old/dist/es/shared/vers",{"_index":4508,"title":{},"content":{"761":{"position":[[628,26]]}},"keywords":{}}],["old/dist/lib/shared/vers",{"_index":4511,"title":{},"content":{"761":{"position":[[750,27]]}},"keywords":{}}],["old/plugins/shar",{"_index":4505,"title":{},"content":{"761":{"position":[[502,20]]}},"keywords":{}}],["old/plugins/storag",{"_index":4488,"title":{},"content":{"759":{"position":[[279,19]]},"760":{"position":[[375,19]]}},"keywords":{}}],["olddata",{"_index":5689,"title":{},"content":{"1042":{"position":[[128,9],[214,8]]}},"keywords":{}}],["olddata.ag",{"_index":5690,"title":{},"content":{"1042":{"position":[[146,11],[160,11]]}},"keywords":{}}],["olddata.nam",{"_index":5691,"title":{},"content":{"1042":{"position":[[177,12]]}},"keywords":{}}],["olddatabasenam",{"_index":4490,"title":{},"content":{"759":{"position":[[620,16]]},"760":{"position":[[616,16]]}},"keywords":{}}],["olddoc",{"_index":4448,"title":{},"content":{"751":{"position":[[707,7],[950,7],[1487,7],[1809,7],[2001,7]]},"752":{"position":[[594,7]]},"754":{"position":[[394,7],[554,7],[776,7]]}},"keywords":{}}],["olddoc._attach",{"_index":4481,"title":{},"content":{"754":{"position":[[163,19],[521,19]]}},"keywords":{}}],["olddoc._attachments.myfile.content_typ",{"_index":4484,"title":{},"content":{"754":{"position":[[726,39]]}},"keywords":{}}],["olddoc._attachments.myfile.data",{"_index":4483,"title":{},"content":{"754":{"position":[[659,31]]}},"keywords":{}}],["olddoc.coordin",{"_index":4452,"title":{},"content":{"751":{"position":[[1292,19]]}},"keywords":{}}],["olddoc.sendercountri",{"_index":4454,"title":{},"content":{"751":{"position":[[1447,20]]}},"keywords":{}}],["olddoc.tim",{"_index":4445,"title":{},"content":{"751":{"position":[[635,11],[878,11],[1737,11]]}},"keywords":{}}],["older",{"_index":493,"title":{},"content":{"30":{"position":[[296,5]]},"299":{"position":[[467,5],[919,5],[1220,5],[1538,5],[1563,5]]},"302":{"position":[[997,5]]},"303":{"position":[[1431,5]]},"402":{"position":[[2423,5]]},"408":{"position":[[548,5]]},"412":{"position":[[9379,5]]},"421":{"position":[[336,5]]},"728":{"position":[[99,5]]},"751":{"position":[[1853,5]]},"756":{"position":[[465,5]]},"816":{"position":[[348,5]]},"849":{"position":[[288,5]]},"949":{"position":[[98,5]]},"954":{"position":[[114,5]]},"1055":{"position":[[162,5]]},"1133":{"position":[[367,5]]},"1198":{"position":[[2192,5]]},"1278":{"position":[[107,6],[630,5]]}},"keywords":{}}],["olderdocu",{"_index":5353,"title":{},"content":{"949":{"position":[[118,14]]}},"keywords":{}}],["oldest",{"_index":247,"title":{},"content":{"15":{"position":[[37,6]]},"420":{"position":[[73,6]]}},"keywords":{}}],["oldstorag",{"_index":4492,"title":{},"content":{"759":{"position":[[658,11]]},"760":{"position":[[654,11]]}},"keywords":{}}],["omit",{"_index":6271,"title":{},"content":{"1226":{"position":[[697,6]]},"1264":{"position":[[577,6]]}},"keywords":{}}],["on",{"_index":246,"title":{"647":{"position":[[0,3]]},"1007":{"position":[[6,3]]},"1267":{"position":[[0,3]]}},"content":{"15":{"position":[[26,3]]},"17":{"position":[[475,3]]},"27":{"position":[[340,3]]},"28":{"position":[[243,3]]},"65":{"position":[[445,3]]},"122":{"position":[[1,3]]},"125":{"position":[[235,3]]},"133":{"position":[[1,3]]},"156":{"position":[[1,3]]},"160":{"position":[[149,3]]},"182":{"position":[[1,3]]},"190":{"position":[[1,3]]},"192":{"position":[[189,3]]},"207":{"position":[[1,3]]},"211":{"position":[[543,3]]},"215":{"position":[[1,3]]},"265":{"position":[[1,3]]},"275":{"position":[[1,3]]},"280":{"position":[[1,3]]},"300":{"position":[[461,5]]},"304":{"position":[[150,3]]},"327":{"position":[[1,3]]},"336":{"position":[[74,5]]},"346":{"position":[[60,3]]},"383":{"position":[[1,3]]},"390":{"position":[[1084,3]]},"392":{"position":[[3707,3],[3818,3],[4685,3],[5086,3]]},"395":{"position":[[547,3]]},"398":{"position":[[291,4]]},"402":{"position":[[2434,3]]},"404":{"position":[[908,3]]},"408":{"position":[[2660,4],[4470,3],[4740,4],[4820,3]]},"411":{"position":[[2724,3],[4351,3],[4494,3],[4634,3],[5366,3]]},"412":{"position":[[3432,3],[5766,3],[5792,3],[5932,3],[12396,3],[12543,3]]},"414":{"position":[[124,4]]},"420":{"position":[[62,3],[519,3]]},"427":{"position":[[136,3],[1145,3],[1368,3]]},"445":{"position":[[426,3]]},"454":{"position":[[927,3]]},"458":{"position":[[196,3]]},"464":{"position":[[812,3],[1375,3]]},"469":{"position":[[287,3]]},"475":{"position":[[153,3]]},"488":{"position":[[55,3]]},"490":{"position":[[404,3]]},"515":{"position":[[1,3]]},"517":{"position":[[295,3]]},"519":{"position":[[178,3]]},"524":{"position":[[832,3]]},"525":{"position":[[567,3]]},"535":{"position":[[985,3]]},"589":{"position":[[144,3]]},"590":{"position":[[187,3]]},"595":{"position":[[1062,3]]},"612":{"position":[[150,3]]},"617":{"position":[[2000,3],[2269,3]]},"626":{"position":[[673,3]]},"632":{"position":[[1428,3]]},"636":{"position":[[165,3]]},"647":{"position":[[190,3]]},"653":{"position":[[539,3],[1406,3]]},"679":{"position":[[92,5]]},"680":{"position":[[286,4],[1336,3]]},"682":{"position":[[13,3]]},"686":{"position":[[104,4]]},"691":{"position":[[93,3]]},"697":{"position":[[41,3],[309,3]]},"698":{"position":[[844,3],[2732,3]]},"699":{"position":[[77,3],[444,3]]},"700":{"position":[[96,3]]},"701":{"position":[[338,3],[413,4]]},"703":{"position":[[682,3]]},"705":{"position":[[171,5],[301,3]]},"707":{"position":[[310,3]]},"709":{"position":[[371,3],[433,3],[1003,3]]},"710":{"position":[[956,3]]},"723":{"position":[[891,3]]},"737":{"position":[[114,3],[309,3],[415,3],[485,3]]},"740":{"position":[[49,3]]},"749":{"position":[[21777,3]]},"754":{"position":[[494,4]]},"755":{"position":[[93,3]]},"773":{"position":[[1,3]]},"775":{"position":[[232,3]]},"779":{"position":[[175,3],[294,3]]},"784":{"position":[[584,3]]},"808":{"position":[[438,3]]},"815":{"position":[[314,4]]},"817":{"position":[[345,4]]},"818":{"position":[[258,4]]},"845":{"position":[[92,3]]},"846":{"position":[[365,3],[690,3]]},"849":{"position":[[294,5]]},"854":{"position":[[1032,3]]},"860":{"position":[[1167,3]]},"863":{"position":[[372,3]]},"885":{"position":[[2339,3]]},"886":{"position":[[1509,3]]},"902":{"position":[[80,3]]},"905":{"position":[[66,3]]},"906":{"position":[[1156,4]]},"934":{"position":[[11,3]]},"964":{"position":[[42,3]]},"965":{"position":[[19,3]]},"981":{"position":[[1610,3]]},"982":{"position":[[706,3]]},"988":{"position":[[1225,3]]},"989":{"position":[[54,3]]},"1002":{"position":[[903,3]]},"1007":{"position":[[217,3]]},"1009":{"position":[[520,3]]},"1033":{"position":[[1031,3]]},"1056":{"position":[[176,3],[268,3]]},"1058":{"position":[[455,3]]},"1066":{"position":[[97,3]]},"1069":{"position":[[567,3]]},"1083":{"position":[[224,3]]},"1085":{"position":[[3484,3],[3757,3]]},"1090":{"position":[[377,4]]},"1097":{"position":[[438,3]]},"1100":{"position":[[109,3]]},"1108":{"position":[[195,3]]},"1115":{"position":[[217,4],[375,3]]},"1116":{"position":[[189,5]]},"1124":{"position":[[1705,4]]},"1126":{"position":[[167,3]]},"1135":{"position":[[111,3]]},"1149":{"position":[[85,3]]},"1163":{"position":[[379,4]]},"1164":{"position":[[627,3]]},"1192":{"position":[[709,5]]},"1194":{"position":[[561,3],[654,3]]},"1195":{"position":[[166,4]]},"1198":{"position":[[778,4]]},"1215":{"position":[[223,4]]},"1219":{"position":[[143,3]]},"1220":{"position":[[95,3]]},"1267":{"position":[[107,3],[225,3],[318,4],[652,5]]},"1272":{"position":[[342,3],[402,4]]},"1286":{"position":[[59,3]]},"1287":{"position":[[168,3]]},"1295":{"position":[[150,3],[246,3]]},"1300":{"position":[[1,3],[297,3]]},"1301":{"position":[[1,3],[1317,3]]},"1304":{"position":[[886,3],[1308,3]]},"1309":{"position":[[430,4]]},"1313":{"position":[[325,3]]},"1315":{"position":[[1222,3]]},"1316":{"position":[[728,3],[1268,3]]},"1317":{"position":[[259,3]]},"1318":{"position":[[63,3],[1003,3]]},"1321":{"position":[[739,5]]}},"keywords":{}}],["onc",{"_index":490,"title":{"682":{"position":[[32,5]]}},"content":{"30":{"position":[[159,4]]},"35":{"position":[[230,4]]},"46":{"position":[[468,5]]},"52":{"position":[[1,4]]},"128":{"position":[[192,4]]},"164":{"position":[[253,4]]},"191":{"position":[[189,4]]},"206":{"position":[[316,4]]},"255":{"position":[[208,4]]},"315":{"position":[[1088,4]]},"323":{"position":[[286,4]]},"333":{"position":[[199,4]]},"335":{"position":[[1,4]]},"360":{"position":[[597,4]]},"375":{"position":[[269,4]]},"380":{"position":[[179,4]]},"398":{"position":[[1,4]]},"408":{"position":[[2796,4]]},"410":{"position":[[1103,4]]},"411":{"position":[[96,4],[4711,4]]},"414":{"position":[[166,4]]},"416":{"position":[[188,4]]},"419":{"position":[[524,4]]},"434":{"position":[[10,4]]},"445":{"position":[[721,4]]},"446":{"position":[[383,4]]},"461":{"position":[[412,4]]},"466":{"position":[[70,5],[551,4],[567,4]]},"468":{"position":[[615,4]]},"469":{"position":[[583,5]]},"476":{"position":[[235,4]]},"477":{"position":[[177,5]]},"481":{"position":[[190,4]]},"486":{"position":[[354,4]]},"489":{"position":[[814,4]]},"502":{"position":[[563,4]]},"516":{"position":[[251,4]]},"525":{"position":[[203,4]]},"534":{"position":[[480,4]]},"539":{"position":[[1,4]]},"555":{"position":[[1,4]]},"562":{"position":[[641,4]]},"571":{"position":[[729,5]]},"594":{"position":[[478,4]]},"599":{"position":[[1,4]]},"610":{"position":[[411,4]]},"611":{"position":[[471,4]]},"612":{"position":[[479,5]]},"617":{"position":[[1920,5]]},"624":{"position":[[1352,4]]},"630":{"position":[[348,4]]},"632":{"position":[[332,4],[1972,4]]},"636":{"position":[[266,4]]},"647":{"position":[[44,5]]},"682":{"position":[[187,4]]},"693":{"position":[[441,4],[470,4]]},"696":{"position":[[1780,4]]},"698":{"position":[[1541,4]]},"699":{"position":[[471,4]]},"724":{"position":[[1100,5]]},"745":{"position":[[67,4]]},"749":{"position":[[5706,4]]},"780":{"position":[[644,4]]},"782":{"position":[[348,4]]},"783":{"position":[[296,4]]},"784":{"position":[[527,5]]},"799":{"position":[[68,5]]},"829":{"position":[[1211,4],[2025,4]]},"830":{"position":[[280,4]]},"846":{"position":[[1127,5]]},"893":{"position":[[35,4]]},"934":{"position":[[861,4]]},"944":{"position":[[43,5]]},"945":{"position":[[43,5]]},"981":{"position":[[1064,4],[1397,4]]},"988":{"position":[[723,4],[2985,5]]},"1067":{"position":[[427,4],[1935,4]]},"1088":{"position":[[277,5]]},"1117":{"position":[[31,5]]},"1150":{"position":[[283,4]]},"1183":{"position":[[369,4]]},"1192":{"position":[[610,5]]},"1194":{"position":[[1035,4]]},"1230":{"position":[[326,4],[360,4]]},"1267":{"position":[[462,4]]},"1307":{"position":[[317,4]]},"1308":{"position":[[85,4]]},"1321":{"position":[[451,4],[981,4]]}},"keywords":{}}],["once.delet",{"_index":5946,"title":{},"content":{"1102":{"position":[[1331,11]]}},"keywords":{}}],["onchange={",{"_index":3397,"title":{},"content":{"559":{"position":[[627,11]]}},"keywords":{}}],["onclick={fetchmore}>load",{"_index":3282,"title":{},"content":{"523":{"position":[[784,27]]}},"keywords":{}}],["onclos",{"_index":5379,"title":{"956":{"position":[[0,7]]}},"content":{},"keywords":{}}],["oncreate(dexiedatabas",{"_index":6076,"title":{},"content":{"1148":{"position":[[890,23]]}},"keywords":{}}],["one?"",{"_index":2195,"title":{},"content":{"390":{"position":[[738,10]]}},"keywords":{}}],["oneday",{"_index":5515,"title":{},"content":{"995":{"position":[[1848,6],[1993,8]]}},"keywords":{}}],["oneof",{"_index":4032,"title":{},"content":{"718":{"position":[[500,6]]},"752":{"position":[[1135,5]]},"932":{"position":[[1338,5]]}},"keywords":{}}],["onerror",{"_index":1802,"title":{},"content":{"302":{"position":[[423,7]]}},"keywords":{}}],["ongo",{"_index":1317,"title":{},"content":{"204":{"position":[[88,7]]},"386":{"position":[[293,7]]},"624":{"position":[[670,8]]},"648":{"position":[[51,7],[146,7]]},"696":{"position":[[179,7]]},"775":{"position":[[380,7]]},"875":{"position":[[6639,7],[6982,7],[8005,7]]},"885":{"position":[[459,7]]},"886":{"position":[[3310,7],[5048,7]]},"973":{"position":[[24,8]]},"988":{"position":[[642,7]]}},"keywords":{}}],["onlin",{"_index":388,"title":{"413":{"position":[[28,6]]}},"content":{"23":{"position":[[313,6]]},"61":{"position":[[524,6]]},"157":{"position":[[392,7]]},"248":{"position":[[209,7]]},"253":{"position":[[65,6],[217,6]]},"394":{"position":[[1332,6]]},"410":{"position":[[1108,7]]},"412":{"position":[[4198,7],[13998,7]]},"414":{"position":[[171,7]]},"418":{"position":[[239,6]]},"419":{"position":[[352,6]]},"489":{"position":[[832,7]]},"575":{"position":[[392,6]]},"630":{"position":[[394,7]]},"698":{"position":[[96,6]]},"700":{"position":[[814,6],[958,6]]},"838":{"position":[[723,7]]},"898":{"position":[[536,6]]},"904":{"position":[[255,7]]},"981":{"position":[[440,6]]},"984":{"position":[[56,6]]},"985":{"position":[[454,6]]},"987":{"position":[[961,6]]},"988":{"position":[[5865,6]]},"1304":{"position":[[1087,6],[1396,7],[1838,6]]},"1314":{"position":[[577,6]]},"1316":{"position":[[186,6],[484,6]]},"1318":{"position":[[239,6]]}},"keywords":{}}],["only"",{"_index":2851,"title":{},"content":{"421":{"position":[[355,10]]}},"keywords":{}}],["onlyb",{"_index":3010,"title":{},"content":{"460":{"position":[[1171,6]]}},"keywords":{}}],["onmessag",{"_index":2258,"title":{},"content":{"392":{"position":[[3546,9]]}},"keywords":{}}],["onmount",{"_index":3495,"title":{},"content":{"580":{"position":[[313,9]]},"601":{"position":[[391,9]]}},"keywords":{}}],["onmounted(async",{"_index":3496,"title":{},"content":{"580":{"position":[[406,15]]},"601":{"position":[[483,15]]}},"keywords":{}}],["onoperationend",{"_index":4130,"title":{},"content":{"747":{"position":[[225,15]]}},"keywords":{}}],["onoperationerror",{"_index":4131,"title":{},"content":{"747":{"position":[[283,17]]}},"keywords":{}}],["onoperationstart",{"_index":4125,"title":{},"content":{"747":{"position":[[165,17]]}},"keywords":{}}],["onplayermove(neighboringchunkid",{"_index":5576,"title":{},"content":{"1007":{"position":[[2064,33]]}},"keywords":{}}],["onremov",{"_index":5380,"title":{"956":{"position":[[10,11]]}},"content":{},"keywords":{}}],["onstream($head",{"_index":5135,"title":{},"content":{"886":{"position":[[3537,18]]}},"keywords":{}}],["onsuccess",{"_index":1801,"title":{},"content":{"302":{"position":[[411,9]]}},"keywords":{}}],["onto",{"_index":5552,"title":{},"content":{"1004":{"position":[[587,4]]}},"keywords":{}}],["op",{"_index":4154,"title":{},"content":{"749":{"position":[[1684,2]]},"841":{"position":[[484,3]]}},"keywords":{}}],["open",{"_index":311,"title":{"618":{"position":[[25,4]]}},"content":{"18":{"position":[[316,4]]},"22":{"position":[[38,4],[100,4]]},"29":{"position":[[374,4]]},"38":{"position":[[817,4]]},"61":{"position":[[215,4]]},"113":{"position":[[51,4]]},"155":{"position":[[12,4]]},"160":{"position":[[196,4]]},"168":{"position":[[267,5]]},"174":{"position":[[2967,4]]},"177":{"position":[[15,4]]},"284":{"position":[[47,5]]},"323":{"position":[[543,5]]},"386":{"position":[[262,4]]},"392":{"position":[[2187,4]]},"404":{"position":[[299,7]]},"411":{"position":[[991,4],[4053,4],[4974,5]]},"412":{"position":[[2952,4]]},"420":{"position":[[963,4]]},"427":{"position":[[1286,7]]},"454":{"position":[[160,6]]},"458":{"position":[[102,4]]},"463":{"position":[[341,4],[809,7]]},"468":{"position":[[681,6]]},"483":{"position":[[953,4]]},"490":{"position":[[362,4]]},"514":{"position":[[42,4]]},"566":{"position":[[906,4]]},"567":{"position":[[482,4]]},"575":{"position":[[586,4]]},"589":{"position":[[15,4]]},"610":{"position":[[377,4]]},"611":{"position":[[1224,4]]},"612":{"position":[[518,4]]},"614":{"position":[[44,4]]},"617":{"position":[[216,4],[1232,4],[1995,4],[2086,4],[2172,5]]},"618":{"position":[[102,4],[356,4],[773,4]]},"621":{"position":[[618,7]]},"622":{"position":[[483,7]]},"661":{"position":[[503,4]]},"670":{"position":[[563,4]]},"708":{"position":[[461,7]]},"719":{"position":[[100,7]]},"736":{"position":[[176,5],[323,4],[361,4],[525,7]]},"737":{"position":[[262,6]]},"739":{"position":[[157,6]]},"749":{"position":[[9229,4],[12571,4]]},"779":{"position":[[150,4]]},"781":{"position":[[172,6],[402,6]]},"783":{"position":[[58,4],[289,6]]},"835":{"position":[[778,4]]},"836":{"position":[[631,6],[888,4]]},"838":{"position":[[1992,4]]},"839":{"position":[[1071,4]]},"840":{"position":[[686,4]]},"860":{"position":[[23,4]]},"901":{"position":[[57,4]]},"958":{"position":[[520,4]]},"964":{"position":[[238,6]]},"981":{"position":[[1589,7]]},"988":{"position":[[1236,4]]},"1085":{"position":[[1550,4]]},"1088":{"position":[[245,6]]},"1174":{"position":[[207,6],[408,4]]},"1183":{"position":[[85,4],[183,4]]},"1208":{"position":[[1885,4]]},"1231":{"position":[[163,7]]},"1277":{"position":[[294,4]]},"1298":{"position":[[145,4]]},"1301":{"position":[[1304,5]]},"1313":{"position":[[806,4]]}},"keywords":{}}],["open('mydb.sqlit",{"_index":4772,"title":{},"content":{"836":{"position":[[683,20]]}},"keywords":{}}],["openapi",{"_index":2119,"title":{},"content":{"367":{"position":[[647,7]]}},"keywords":{}}],["opencursor",{"_index":6423,"title":{},"content":{"1294":{"position":[[153,12]]}},"keywords":{}}],["opencursorrequest",{"_index":6436,"title":{},"content":{"1294":{"position":[[1454,17]]}},"keywords":{}}],["opencursorrequest.onerror",{"_index":6438,"title":{},"content":{"1294":{"position":[[1506,25]]}},"keywords":{}}],["opencursorrequest.onsuccess",{"_index":6440,"title":{},"content":{"1294":{"position":[[1554,27]]}},"keywords":{}}],["opendatabas",{"_index":6355,"title":{},"content":{"1278":{"position":[[848,12]]}},"keywords":{}}],["openkvpath",{"_index":6020,"title":{},"content":{"1125":{"position":[[581,11]]}},"keywords":{}}],["oper",{"_index":785,"title":{"52":{"position":[[5,11]]},"208":{"position":[[29,9]]},"539":{"position":[[5,11]]},"599":{"position":[[5,11]]},"678":{"position":[[10,11]]},"679":{"position":[[0,10]]},"681":{"position":[[17,11]]},"682":{"position":[[18,10]]},"795":{"position":[[9,11]]},"796":{"position":[[33,9]]},"1048":{"position":[[37,10]]},"1119":{"position":[[16,11]]}},"content":{"52":{"position":[[61,11]]},"63":{"position":[[100,8]]},"66":{"position":[[373,11]]},"96":{"position":[[262,10]]},"104":{"position":[[213,11]]},"129":{"position":[[388,11]]},"133":{"position":[[331,7]]},"162":{"position":[[375,12]]},"164":{"position":[[191,7]]},"172":{"position":[[131,7]]},"181":{"position":[[167,10]]},"205":{"position":[[345,10]]},"216":{"position":[[352,11]]},"224":{"position":[[205,10]]},"228":{"position":[[232,7]]},"236":{"position":[[235,11]]},"265":{"position":[[137,11],[194,10]]},"266":{"position":[[892,11]]},"267":{"position":[[1027,10]]},"270":{"position":[[119,7]]},"273":{"position":[[44,8]]},"287":{"position":[[674,9]]},"292":{"position":[[106,7]]},"302":{"position":[[374,10]]},"318":{"position":[[47,11]]},"354":{"position":[[1311,9]]},"359":{"position":[[22,7]]},"365":{"position":[[287,11]]},"369":{"position":[[1115,10]]},"376":{"position":[[361,10]]},"385":{"position":[[106,10]]},"396":{"position":[[1586,11],[1657,11]]},"399":{"position":[[611,10]]},"400":{"position":[[440,11]]},"402":{"position":[[2215,9],[2363,8]]},"407":{"position":[[443,12]]},"408":{"position":[[5123,11]]},"410":{"position":[[137,11]]},"411":{"position":[[730,11],[1236,9]]},"415":{"position":[[27,10]]},"418":{"position":[[63,9]]},"419":{"position":[[748,9]]},"424":{"position":[[155,8]]},"427":{"position":[[185,8],[243,10],[837,10],[1168,10]]},"430":{"position":[[695,11],[732,10]]},"439":{"position":[[399,10]]},"441":{"position":[[377,11]]},"451":{"position":[[649,10]]},"452":{"position":[[241,11]]},"459":{"position":[[140,10]]},"460":{"position":[[25,11],[1251,10]]},"462":{"position":[[168,11],[955,10]]},"464":{"position":[[745,10]]},"466":{"position":[[37,10],[416,10]]},"469":{"position":[[86,11]]},"470":{"position":[[146,11]]},"474":{"position":[[132,10]]},"486":{"position":[[123,10]]},"489":{"position":[[662,7]]},"497":{"position":[[122,10],[802,10]]},"514":{"position":[[136,11]]},"519":{"position":[[24,7]]},"524":{"position":[[411,11]]},"525":{"position":[[339,9]]},"539":{"position":[[61,11]]},"569":{"position":[[336,9],[939,7],[1367,9],[1558,9]]},"571":{"position":[[388,9],[433,9]]},"588":{"position":[[150,11]]},"599":{"position":[[61,11]]},"618":{"position":[[50,9],[208,9],[405,9]]},"626":{"position":[[653,9]]},"630":{"position":[[650,10]]},"641":{"position":[[23,10]]},"642":{"position":[[49,10],[262,10]]},"661":{"position":[[109,10]]},"678":{"position":[[17,9],[56,10],[112,10],[161,10],[209,8]]},"679":{"position":[[33,9],[151,9],[291,8],[355,10]]},"680":{"position":[[150,10],[1028,10],[1294,9]]},"681":{"position":[[23,10],[116,10],[333,10],[441,9],[583,10],[689,9],[747,9],[886,9]]},"682":{"position":[[22,9],[303,11]]},"683":{"position":[[52,10],[96,9],[120,9],[577,10],[677,9]]},"684":{"position":[[39,9]]},"685":{"position":[[6,10],[218,10],[415,10],[532,10],[665,11]]},"686":{"position":[[322,10],[511,9]]},"687":{"position":[[100,10]]},"688":{"position":[[376,11]]},"689":{"position":[[155,9],[420,10]]},"691":{"position":[[708,11]]},"703":{"position":[[189,9]]},"709":{"position":[[1149,10]]},"710":{"position":[[2397,10]]},"711":{"position":[[161,10],[357,10],[2253,10]]},"714":{"position":[[526,9]]},"723":{"position":[[144,10],[291,11],[399,10],[2580,10]]},"724":{"position":[[1526,10]]},"746":{"position":[[37,10],[116,10],[670,10]]},"747":{"position":[[70,11]]},"749":{"position":[[22586,10],[23526,10]]},"767":{"position":[[633,9]]},"768":{"position":[[633,9]]},"769":{"position":[[592,9]]},"775":{"position":[[730,10]]},"778":{"position":[[321,10]]},"795":{"position":[[20,10],[77,10],[115,11]]},"796":{"position":[[153,9],[324,8],[577,8],[617,8],[985,8],[1027,8],[1275,8],[1416,8]]},"801":{"position":[[156,10],[299,11],[331,10]]},"802":{"position":[[253,11],[346,10],[562,11],[661,7]]},"835":{"position":[[175,9]]},"836":{"position":[[111,10],[1581,9]]},"858":{"position":[[482,9]]},"863":{"position":[[350,10]]},"871":{"position":[[12,8]]},"872":{"position":[[2876,11]]},"875":{"position":[[5886,10],[5931,10],[9191,10]]},"902":{"position":[[645,11]]},"948":{"position":[[26,10],[210,9],[304,11]]},"1031":{"position":[[48,10]]},"1048":{"position":[[79,10],[296,10],[333,10]]},"1067":{"position":[[1179,9],[1249,8],[1409,9]]},"1085":{"position":[[634,10]]},"1090":{"position":[[1257,9]]},"1102":{"position":[[115,11]]},"1119":{"position":[[69,10],[129,10],[227,10],[252,9],[280,11]]},"1121":{"position":[[293,10]]},"1123":{"position":[[526,10]]},"1124":{"position":[[1541,10],[1799,10]]},"1125":{"position":[[616,10],[838,11]]},"1157":{"position":[[237,10]]},"1161":{"position":[[47,10]]},"1164":{"position":[[855,10],[1354,9]]},"1177":{"position":[[12,11]]},"1180":{"position":[[47,10]]},"1185":{"position":[[9,10],[86,9],[212,10]]},"1193":{"position":[[134,11]]},"1198":{"position":[[1045,9]]},"1204":{"position":[[12,11]]},"1206":{"position":[[306,11],[461,10]]},"1213":{"position":[[87,9]]},"1214":{"position":[[995,11]]},"1215":{"position":[[262,9]]},"1246":{"position":[[1380,11]]},"1249":{"position":[[369,8]]},"1250":{"position":[[31,10],[175,10]]},"1253":{"position":[[34,8]]},"1267":{"position":[[412,11]]},"1274":{"position":[[619,11]]},"1279":{"position":[[1006,11]]},"1282":{"position":[[632,11]]},"1295":{"position":[[692,10]]},"1297":{"position":[[333,9]]},"1304":{"position":[[273,10],[1336,10],[1565,9]]},"1305":{"position":[[91,10],[191,11],[713,9],[951,9],[1076,9]]},"1307":{"position":[[42,9],[705,10],[797,10]]},"1309":{"position":[[245,10]]},"1318":{"position":[[789,10]]}},"keywords":{}}],["operation'",{"_index":3205,"title":{},"content":{"497":{"position":[[507,11]]}},"keywords":{}}],["operation.find",{"_index":6163,"title":{},"content":{"1194":{"position":[[400,14]]}},"keywords":{}}],["operationnam",{"_index":5119,"title":{},"content":{"886":{"position":[[783,14],[2507,14]]}},"keywords":{}}],["operations.batch",{"_index":2144,"title":{},"content":{"376":{"position":[[315,19]]}},"keywords":{}}],["operations.fulli",{"_index":3893,"title":{},"content":{"688":{"position":[[802,16]]}},"keywords":{}}],["operations.no",{"_index":4777,"title":{},"content":{"836":{"position":[[1773,13]]}},"keywords":{}}],["operations.nosql",{"_index":5794,"title":{},"content":{"1071":{"position":[[407,16]]}},"keywords":{}}],["operations.onli",{"_index":3087,"title":{},"content":{"468":{"position":[[154,15]]}},"keywords":{}}],["operations.scal",{"_index":3479,"title":{},"content":{"574":{"position":[[484,19]]}},"keywords":{}}],["operations.smal",{"_index":6125,"title":{},"content":{"1167":{"position":[[40,16]]}},"keywords":{}}],["operationsnam",{"_index":4126,"title":{},"content":{"747":{"position":[[183,16],[241,16],[301,16]]}},"keywords":{}}],["operators.difficult",{"_index":3899,"title":{},"content":{"689":{"position":[[306,19]]}},"keywords":{}}],["opf",{"_index":874,"title":{"433":{"position":[[16,7]]},"448":{"position":[[43,4]]},"453":{"position":[[8,5]]},"1205":{"position":[[27,6],[57,4]]},"1206":{"position":[[8,5]]},"1207":{"position":[[0,4]]},"1208":{"position":[[8,4]]},"1209":{"position":[[0,4]]},"1210":{"position":[[6,4]]},"1211":{"position":[[6,4]]},"1214":{"position":[[0,4]]},"1215":{"position":[[73,7]]},"1216":{"position":[[17,6]]},"1244":{"position":[[3,5]]}},"content":{"59":{"position":[[73,7],[164,4]]},"100":{"position":[[275,5]]},"131":{"position":[[371,4],[668,4]]},"161":{"position":[[109,5]]},"162":{"position":[[370,4]]},"227":{"position":[[249,5]]},"266":{"position":[[126,4]]},"287":{"position":[[718,4]]},"402":{"position":[[2769,4]]},"408":{"position":[[1504,7],[1559,7],[1958,5],[3967,5],[4685,4]]},"429":{"position":[[162,5]]},"433":{"position":[[34,4],[222,4],[293,4],[459,4],[527,4],[593,4]]},"453":{"position":[[32,6],[254,4],[465,4],[569,4],[787,4]]},"459":{"position":[[376,4]]},"460":{"position":[[1123,4]]},"461":{"position":[[1487,4]]},"462":{"position":[[903,4]]},"463":{"position":[[441,4],[681,4],[701,4],[958,4],[1031,4]]},"464":{"position":[[329,4],[351,4],[740,4],[1017,4]]},"465":{"position":[[190,4],[212,4]]},"466":{"position":[[155,4],[176,4],[348,4]]},"467":{"position":[[126,4],[149,4],[307,4]]},"468":{"position":[[296,4]]},"469":{"position":[[498,4]]},"524":{"position":[[435,6],[948,4]]},"546":{"position":[[128,7],[197,4],[227,4]]},"581":{"position":[[603,5]]},"606":{"position":[[128,7],[197,4],[227,4]]},"631":{"position":[[168,6]]},"641":{"position":[[285,4]]},"714":{"position":[[400,4]]},"749":{"position":[[3371,4]]},"793":{"position":[[237,4],[1379,4]]},"981":{"position":[[1134,4]]},"1137":{"position":[[99,4],[189,4]]},"1191":{"position":[[339,4]]},"1195":{"position":[[244,4]]},"1206":{"position":[[32,6],[261,4],[398,4]]},"1207":{"position":[[315,4],[444,4]]},"1208":{"position":[[5,4],[1970,4]]},"1209":{"position":[[187,4]]},"1210":{"position":[[5,4],[205,4]]},"1211":{"position":[[401,4],[646,6]]},"1212":{"position":[[358,6]]},"1213":{"position":[[18,4],[655,6]]},"1214":{"position":[[267,4],[737,4],[1043,4]]},"1215":{"position":[[122,7],[395,6],[552,4]]},"1239":{"position":[[197,4]]},"1243":{"position":[[122,4]]},"1244":{"position":[[5,4]]},"1276":{"position":[[150,5],[257,4]]}},"keywords":{}}],["opfs)mobil",{"_index":3119,"title":{},"content":{"479":{"position":[[327,11]]}},"keywords":{}}],["opfs.html?console=opfs#set",{"_index":4179,"title":{},"content":{"749":{"position":[[3495,30]]}},"keywords":{}}],["opfs.in",{"_index":1569,"title":{},"content":{"254":{"position":[[334,7]]}},"keywords":{}}],["opfs.worker.j",{"_index":6227,"title":{},"content":{"1210":{"position":[[127,14]]}},"keywords":{}}],["opportun",{"_index":2968,"title":{},"content":{"454":{"position":[[183,13]]},"529":{"position":[[173,13]]}},"keywords":{}}],["opt",{"_index":1575,"title":{},"content":{"255":{"position":[[239,3]]},"863":{"position":[[909,6]]},"894":{"position":[[141,6]]}},"keywords":{}}],["optim",{"_index":514,"title":{"76":{"position":[[20,9]]},"78":{"position":[[0,9]]},"107":{"position":[[20,9]]},"108":{"position":[[0,9]]},"138":{"position":[[25,13]]},"194":{"position":[[25,13]]},"230":{"position":[[20,9]]},"234":{"position":[[0,9]]},"342":{"position":[[25,13]]},"376":{"position":[[12,13]]},"378":{"position":[[12,9]]},"385":{"position":[[12,13]]},"402":{"position":[[22,14]]},"507":{"position":[[25,13]]},"527":{"position":[[25,13]]},"587":{"position":[[25,13]]},"819":{"position":[[6,9]]},"1153":{"position":[[28,9]]},"1318":{"position":[[6,13]]}},"content":{"33":{"position":[[169,14]]},"70":{"position":[[19,9]]},"76":{"position":[[31,9]]},"83":{"position":[[154,12]]},"98":{"position":[[94,7]]},"100":{"position":[[198,9]]},"106":{"position":[[176,10]]},"107":{"position":[[39,9]]},"108":{"position":[[43,8]]},"111":{"position":[[4,8]]},"117":{"position":[[277,7]]},"138":{"position":[[251,8]]},"141":{"position":[[202,12]]},"146":{"position":[[154,8]]},"166":{"position":[[26,12],[50,7]]},"170":{"position":[[473,8]]},"174":{"position":[[1220,9],[1303,9],[1608,8]]},"189":{"position":[[764,8]]},"194":{"position":[[33,8]]},"197":{"position":[[38,8]]},"228":{"position":[[139,12]]},"229":{"position":[[113,7]]},"230":{"position":[[22,9]]},"234":{"position":[[6,9]]},"277":{"position":[[53,9]]},"298":{"position":[[383,9]]},"318":{"position":[[293,7]]},"334":{"position":[[526,9]]},"346":{"position":[[860,8]]},"362":{"position":[[919,13]]},"366":{"position":[[358,7]]},"369":{"position":[[214,9],[1105,9],[1207,9],[1398,7]]},"376":{"position":[[206,13]]},"390":{"position":[[45,9]]},"393":{"position":[[646,7]]},"396":{"position":[[209,10]]},"397":{"position":[[5,7]]},"398":{"position":[[283,7]]},"402":{"position":[[793,8],[880,7],[1351,7],[2281,8]]},"408":{"position":[[5065,13]]},"411":{"position":[[767,9]]},"412":{"position":[[9425,10]]},"429":{"position":[[527,9]]},"433":{"position":[[147,9]]},"444":{"position":[[143,9]]},"450":{"position":[[646,13]]},"469":{"position":[[548,8],[640,9]]},"479":{"position":[[110,9]]},"483":{"position":[[664,8]]},"504":{"position":[[467,8]]},"507":{"position":[[13,12]]},"508":{"position":[[89,12]]},"513":{"position":[[68,7]]},"524":{"position":[[977,7]]},"527":{"position":[[46,7]]},"544":{"position":[[379,8]]},"556":{"position":[[1039,8]]},"579":{"position":[[535,8]]},"588":{"position":[[6,12]]},"604":{"position":[[313,8]]},"618":{"position":[[477,8]]},"620":{"position":[[641,14],[677,9]]},"630":{"position":[[116,14]]},"640":{"position":[[56,7]]},"656":{"position":[[50,9]]},"723":{"position":[[1697,9]]},"780":{"position":[[492,9]]},"793":{"position":[[585,9],[1200,9]]},"796":{"position":[[70,7]]},"798":{"position":[[85,10],[972,9]]},"801":{"position":[[766,9]]},"820":{"position":[[59,11],[379,9]]},"821":{"position":[[228,12],[337,9],[450,12],[491,9]]},"838":{"position":[[1079,9]]},"871":{"position":[[574,9]]},"965":{"position":[[89,13],[247,8]]},"981":{"position":[[785,9]]},"1005":{"position":[[176,13]]},"1065":{"position":[[1616,14]]},"1066":{"position":[[222,7]]},"1071":{"position":[[439,9]]},"1085":{"position":[[1033,14]]},"1107":{"position":[[193,7]]},"1120":{"position":[[12,9]]},"1132":{"position":[[178,8]]},"1138":{"position":[[451,8]]},"1151":{"position":[[608,9]]},"1154":{"position":[[10,9],[300,11],[441,10]]},"1178":{"position":[[607,9]]},"1206":{"position":[[222,9]]},"1222":{"position":[[672,7],[732,8]]},"1238":{"position":[[76,9],[400,9],[777,11]]},"1239":{"position":[[48,9],[578,11]]},"1246":{"position":[[1613,10],[1657,9],[1788,8]]},"1266":{"position":[[914,13]]},"1271":{"position":[[669,13]]},"1318":{"position":[[99,8],[324,8],[707,13],[936,13]]}},"keywords":{}}],["optimis",{"_index":5785,"title":{},"content":{"1069":{"position":[[66,12]]}},"keywords":{}}],["optimist",{"_index":618,"title":{"484":{"position":[[12,10]]},"485":{"position":[[15,10]]},"486":{"position":[[28,10]]},"488":{"position":[[9,10]]},"489":{"position":[[35,10]]},"492":{"position":[[0,10]]},"495":{"position":[[13,10]]},"497":{"position":[[27,10]]},"634":{"position":[[0,10]]}},"content":{"39":{"position":[[189,10]]},"485":{"position":[[1,10],[160,10]]},"486":{"position":[[187,10]]},"488":{"position":[[26,10]]},"489":{"position":[[37,10]]},"491":{"position":[[34,10],[880,10]]},"495":{"position":[[7,10],[89,10]]},"497":{"position":[[630,10],[745,10]]},"498":{"position":[[34,10],[288,10],[538,10]]},"634":{"position":[[69,10]]},"897":{"position":[[241,10]]}},"keywords":{}}],["optimization.hierarch",{"_index":2341,"title":{},"content":{"396":{"position":[[521,25]]}},"keywords":{}}],["optimizedrxstorag",{"_index":6093,"title":{},"content":{"1154":{"position":[[461,18],[793,18]]}},"keywords":{}}],["option",{"_index":467,"title":{"126":{"position":[[32,8]]},"161":{"position":[[25,8]]},"186":{"position":[[32,8]]},"266":{"position":[[12,8]]},"317":{"position":[[29,8]]},"331":{"position":[[31,8]]},"365":{"position":[[19,7]]},"520":{"position":[[30,8]]},"576":{"position":[[28,8]]},"653":{"position":[[31,8]]},"887":{"position":[[34,8]]},"1164":{"position":[[0,8]]}},"content":{"28":{"position":[[769,6]]},"39":{"position":[[551,7]]},"51":{"position":[[32,8]]},"126":{"position":[[32,7]]},"131":{"position":[[90,7],[623,7],[758,8]]},"161":{"position":[[28,7],[297,8]]},"162":{"position":[[788,6]]},"167":{"position":[[62,7]]},"186":{"position":[[27,7]]},"189":{"position":[[30,8],[95,7],[553,6]]},"202":{"position":[[248,7]]},"236":{"position":[[19,6]]},"261":{"position":[[791,8],[824,8]]},"267":{"position":[[1385,7]]},"278":{"position":[[149,7]]},"284":{"position":[[231,8]]},"287":{"position":[[328,8],[568,6]]},"295":{"position":[[180,6]]},"302":{"position":[[979,10]]},"310":{"position":[[353,7]]},"312":{"position":[[78,8]]},"318":{"position":[[80,8]]},"334":{"position":[[434,8]]},"360":{"position":[[630,8]]},"361":{"position":[[314,8]]},"362":{"position":[[884,8]]},"365":{"position":[[94,7],[229,6]]},"377":{"position":[[186,7]]},"408":{"position":[[317,7]]},"429":{"position":[[459,7]]},"430":{"position":[[1095,7]]},"433":{"position":[[20,6]]},"441":{"position":[[593,8]]},"458":{"position":[[1053,6]]},"489":{"position":[[236,7]]},"504":{"position":[[703,8]]},"507":{"position":[[103,7]]},"520":{"position":[[28,7]]},"522":{"position":[[563,10],[618,10],[684,10],[760,10]]},"524":{"position":[[193,7]]},"538":{"position":[[32,8]]},"566":{"position":[[178,8],[381,8]]},"579":{"position":[[443,8]]},"581":{"position":[[629,6]]},"598":{"position":[[32,8]]},"612":{"position":[[1624,8]]},"614":{"position":[[813,7]]},"619":{"position":[[395,7]]},"624":{"position":[[182,6],[1310,6]]},"632":{"position":[[1370,9]]},"655":{"position":[[277,6]]},"660":{"position":[[478,7]]},"661":{"position":[[255,8]]},"680":{"position":[[197,7],[784,7],[1086,7]]},"696":{"position":[[801,7]]},"710":{"position":[[469,7],[973,8]]},"724":{"position":[[1055,10],[1175,10],[1404,10],[1471,7],[1693,7],[1778,7]]},"749":{"position":[[22629,7]]},"772":{"position":[[1872,6]]},"773":{"position":[[330,6]]},"806":{"position":[[424,7],[480,7],[630,8],[676,7],[741,7]]},"825":{"position":[[280,6]]},"837":{"position":[[1003,7]]},"841":{"position":[[386,8],[1193,8]]},"846":{"position":[[597,10],[709,10],[820,10],[1027,10],[1135,10],[1255,10]]},"848":{"position":[[206,8],[247,7],[321,9],[584,8]]},"854":{"position":[[904,8],[1091,10]]},"855":{"position":[[321,8]]},"858":{"position":[[147,8]]},"862":{"position":[[1465,7]]},"867":{"position":[[316,8]]},"875":{"position":[[3848,8]]},"886":{"position":[[1235,10],[1332,10],[1890,7],[2855,10],[2974,10],[4345,7]]},"887":{"position":[[31,8],[134,8],[486,8]]},"890":{"position":[[939,8]]},"894":{"position":[[47,8],[159,8]]},"898":{"position":[[1934,8],[3484,9],[3611,9],[3899,8],[4013,10],[4316,8]]},"904":{"position":[[1513,7]]},"905":{"position":[[197,6]]},"911":{"position":[[157,6]]},"934":{"position":[[192,9],[327,10],[388,10],[447,10],[488,8],[504,10],[591,10],[624,10],[691,10],[767,10]]},"960":{"position":[[392,8],[458,10],[513,10],[579,10],[655,10]]},"986":{"position":[[1542,7]]},"988":{"position":[[816,11],[1040,11],[1608,11],[2294,9],[2910,8],[3353,10],[3396,9],[4682,10]]},"1065":{"position":[[530,8],[1336,9]]},"1072":{"position":[[2704,9]]},"1102":{"position":[[838,10]]},"1125":{"position":[[412,10],[556,10],[714,10]]},"1134":{"position":[[477,10],[741,10]]},"1148":{"position":[[1061,8]]},"1151":{"position":[[589,8]]},"1157":{"position":[[439,6]]},"1164":{"position":[[6,7],[272,10],[782,10],[1487,10]]},"1172":{"position":[[455,7]]},"1175":{"position":[[53,6]]},"1178":{"position":[[588,8]]},"1198":{"position":[[2087,8]]},"1201":{"position":[[285,7]]},"1222":{"position":[[447,7],[488,7]]},"1226":{"position":[[611,10],[622,7]]},"1231":{"position":[[120,6]]},"1249":{"position":[[347,6]]},"1264":{"position":[[491,10],[502,7]]},"1266":{"position":[[818,8]]},"1270":{"position":[[303,6]]},"1282":{"position":[[1028,7]]},"1292":{"position":[[60,7]]},"1313":{"position":[[766,6]]}},"keywords":{}}],["option.opf",{"_index":1182,"title":{},"content":{"162":{"position":[[347,11]]}},"keywords":{}}],["option.send",{"_index":3098,"title":{},"content":{"470":{"position":[[361,14]]}},"keywords":{}}],["optional)if",{"_index":5390,"title":{},"content":{"963":{"position":[[1,12]]}},"keywords":{}}],["optional."",{"_index":2800,"title":{},"content":{"419":{"position":[[362,15]]}},"keywords":{}}],["optional=fals",{"_index":5393,"title":{},"content":{"965":{"position":[[1,16]]},"967":{"position":[[1,16]]}},"keywords":{}}],["optional=false)if",{"_index":5395,"title":{},"content":{"966":{"position":[[1,18]]}},"keywords":{}}],["optional=true)when",{"_index":5391,"title":{},"content":{"964":{"position":[[1,19]]}},"keywords":{}}],["options.storag",{"_index":2164,"title":{},"content":{"383":{"position":[[299,15]]}},"keywords":{}}],["optionswithauth",{"_index":4835,"title":{},"content":{"848":{"position":[[285,15],[612,15]]}},"keywords":{}}],["optionswithauth.head",{"_index":4838,"title":{},"content":{"848":{"position":[[400,23]]}},"keywords":{}}],["optionswithauth.headers['author",{"_index":4839,"title":{},"content":{"848":{"position":[[463,40]]}},"keywords":{}}],["opts.wrtc",{"_index":5273,"title":{},"content":{"911":{"position":[[147,9]]}},"keywords":{}}],["or/and",{"_index":327,"title":{},"content":{"19":{"position":[[369,6]]}},"keywords":{}}],["orchestr",{"_index":5254,"title":{},"content":{"903":{"position":[[696,13]]},"1319":{"position":[[575,11]]}},"keywords":{}}],["order",{"_index":2321,"title":{"798":{"position":[[14,8]]}},"content":{"394":{"position":[[1040,5],[1139,5],[1233,7]]},"400":{"position":[[259,6]]},"402":{"position":[[786,6]]},"404":{"position":[[787,7]]},"408":{"position":[[1080,5]]},"569":{"position":[[568,5]]},"613":{"position":[[334,6]]},"683":{"position":[[518,6]]},"749":{"position":[[9577,5],[13923,5]]},"798":{"position":[[5,5],[138,6]]},"858":{"position":[[588,8]]},"898":{"position":[[3799,8]]},"951":{"position":[[529,5]]},"986":{"position":[[225,6]]},"1065":{"position":[[1719,5],[1760,5],[1810,9],[2029,5]]},"1079":{"position":[[574,5]]},"1316":{"position":[[1850,5],[2344,5],[2409,6]]}},"keywords":{}}],["ordering.push",{"_index":5188,"title":{},"content":{"897":{"position":[[203,15]]}},"keywords":{}}],["oren",{"_index":6482,"title":{},"content":{"1302":{"position":[[169,4]]}},"keywords":{}}],["organ",{"_index":1235,"title":{},"content":{"178":{"position":[[257,10]]},"395":{"position":[[294,9]]},"412":{"position":[[1388,14]]},"1132":{"position":[[471,10]]},"1140":{"position":[[53,8]]}},"keywords":{}}],["orient",{"_index":377,"title":{"350":{"position":[[9,8]]}},"content":{"23":{"position":[[45,8]]},"32":{"position":[[112,8]]},"353":{"position":[[756,8]]},"412":{"position":[[13493,8],[14404,8]]},"419":{"position":[[1377,8]]}},"keywords":{}}],["origin",{"_index":287,"title":{"1205":{"position":[[0,6]]},"1215":{"position":[[46,6]]}},"content":{"17":{"position":[[76,10]]},"24":{"position":[[523,10]]},"25":{"position":[[11,11]]},"26":{"position":[[101,10]]},"36":{"position":[[1,10]]},"47":{"position":[[111,10]]},"59":{"position":[[46,6]]},"298":{"position":[[316,7]]},"299":{"position":[[283,6],[608,6]]},"300":{"position":[[208,7]]},"303":{"position":[[71,6],[1306,6]]},"305":{"position":[[101,6]]},"408":{"position":[[1018,6],[1189,6],[1532,6]]},"409":{"position":[[122,10]]},"411":{"position":[[4239,7]]},"419":{"position":[[1066,8]]},"433":{"position":[[96,6]]},"453":{"position":[[5,6]]},"461":{"position":[[731,7]]},"546":{"position":[[101,6]]},"595":{"position":[[153,10]]},"606":{"position":[[101,6]]},"640":{"position":[[168,7]]},"696":{"position":[[1356,7]]},"779":{"position":[[453,7]]},"835":{"position":[[554,10]]},"839":{"position":[[88,10]]},"848":{"position":[[544,8]]},"888":{"position":[[656,7]]},"890":{"position":[[428,6],[671,7]]},"990":{"position":[[856,8]]},"1069":{"position":[[241,8]]},"1140":{"position":[[282,7]]},"1154":{"position":[[413,8]]},"1206":{"position":[[5,6],[141,6]]},"1207":{"position":[[33,6]]},"1209":{"position":[[13,6]]},"1214":{"position":[[1,6]]},"1215":{"position":[[95,6]]},"1216":{"position":[[34,6]]},"1222":{"position":[[178,8]]},"1225":{"position":[[58,8]]},"1246":{"position":[[1729,8]]}},"keywords":{}}],["origin'",{"_index":2896,"title":{},"content":{"427":{"position":[[1535,8]]},"1208":{"position":[[672,8]]}},"keywords":{}}],["origin==='handl",{"_index":5157,"title":{},"content":{"888":{"position":[[797,19]]}},"keywords":{}}],["orion",{"_index":6378,"title":{},"content":{"1284":{"position":[[156,5]]}},"keywords":{}}],["orion.rxdb",{"_index":6380,"title":{},"content":{"1284":{"position":[[195,10]]}},"keywords":{}}],["orm",{"_index":4620,"title":{"937":{"position":[[0,3]]}},"content":{"793":{"position":[[1155,3]]},"838":{"position":[[3406,3]]},"934":{"position":[[338,3],[399,3],[458,3]]},"937":{"position":[[70,3]]},"1085":{"position":[[2154,3],[2195,3]]},"1311":{"position":[[1643,3],[1691,3]]}},"keywords":{}}],["orm/drm",{"_index":5321,"title":{},"content":{"937":{"position":[[162,8]]}},"keywords":{}}],["orqueri",{"_index":4637,"title":{},"content":{"796":{"position":[[422,7]]}},"keywords":{}}],["orwait",{"_index":5657,"title":{},"content":{"1033":{"position":[[332,6]]}},"keywords":{}}],["os",{"_index":1874,"title":{},"content":{"305":{"position":[[483,2]]},"412":{"position":[[8602,2]]},"703":{"position":[[571,2]]},"836":{"position":[[808,3]]},"1270":{"position":[[401,2]]}},"keywords":{}}],["other",{"_index":1081,"title":{"657":{"position":[[38,6]]}},"content":{"125":{"position":[[272,7]]},"298":{"position":[[190,7],[261,6]]},"356":{"position":[[899,6]]},"365":{"position":[[1088,7]]},"399":{"position":[[281,6]]},"400":{"position":[[207,7]]},"411":{"position":[[5585,6]]},"412":{"position":[[6554,6]]},"458":{"position":[[813,6]]},"490":{"position":[[439,7]]},"517":{"position":[[333,7]]},"589":{"position":[[181,7]]},"618":{"position":[[162,7]]},"698":{"position":[[2554,6]]},"709":{"position":[[570,6]]},"824":{"position":[[258,7]]},"1071":{"position":[[90,7]]},"1100":{"position":[[278,6]]},"1208":{"position":[[1874,6]]}},"keywords":{}}],["other.cli",{"_index":6488,"title":{},"content":{"1304":{"position":[[1742,13]]}},"keywords":{}}],["other.find",{"_index":6165,"title":{},"content":{"1194":{"position":[[576,10]]}},"keywords":{}}],["othernumb",{"_index":5775,"title":{},"content":{"1067":{"position":[[1487,15],[1602,12]]}},"keywords":{}}],["others.miss",{"_index":3300,"title":{},"content":{"535":{"position":[[1031,14]]},"595":{"position":[[1108,14]]}},"keywords":{}}],["otherstuff.json",{"_index":4665,"title":{},"content":{"800":{"position":[[905,18]]}},"keywords":{}}],["otherwis",{"_index":2000,"title":{},"content":{"352":{"position":[[151,9]]},"412":{"position":[[1761,10]]},"587":{"position":[[172,9]]},"875":{"position":[[4055,9]]},"886":{"position":[[1396,10]]},"946":{"position":[[66,9]]},"1108":{"position":[[653,9]]},"1235":{"position":[[449,9]]}},"keywords":{}}],["out",{"_index":398,"title":{"626":{"position":[[18,3]]},"742":{"position":[[7,4]]}},"content":{"24":{"position":[[136,3],[594,3]]},"40":{"position":[[272,3]]},"84":{"position":[[85,3]]},"102":{"position":[[13,3]]},"114":{"position":[[98,3]]},"125":{"position":[[15,3]]},"126":{"position":[[88,3]]},"144":{"position":[[88,3]]},"149":{"position":[[98,3]]},"161":{"position":[[189,3]]},"188":{"position":[[2505,3]]},"212":{"position":[[122,3]]},"255":{"position":[[1623,3]]},"263":{"position":[[386,3]]},"296":{"position":[[5,3],[43,3]]},"302":{"position":[[510,3]]},"304":{"position":[[288,3]]},"317":{"position":[[215,3],[241,3]]},"318":{"position":[[405,3]]},"331":{"position":[[251,3]]},"347":{"position":[[98,3]]},"362":{"position":[[1169,3]]},"367":{"position":[[212,3]]},"369":{"position":[[1351,3]]},"383":{"position":[[330,3]]},"393":{"position":[[698,3]]},"394":{"position":[[9,3]]},"396":{"position":[[861,3],[1023,3]]},"398":{"position":[[3300,3]]},"402":{"position":[[405,3],[2084,3]]},"405":{"position":[[145,3]]},"408":{"position":[[2479,3]]},"412":{"position":[[324,3],[6257,3],[7893,3]]},"434":{"position":[[73,3]]},"435":{"position":[[152,3]]},"459":{"position":[[285,3]]},"461":{"position":[[549,3],[1375,3]]},"471":{"position":[[130,3]]},"489":{"position":[[219,3]]},"491":{"position":[[908,3],[1934,3]]},"495":{"position":[[656,3]]},"498":{"position":[[234,3]]},"511":{"position":[[98,3]]},"520":{"position":[[72,3]]},"531":{"position":[[98,3]]},"535":{"position":[[758,3]]},"548":{"position":[[80,3]]},"556":{"position":[[1999,3]]},"557":{"position":[[144,3],[211,3]]},"566":{"position":[[1085,3]]},"567":{"position":[[851,3]]},"590":{"position":[[47,3]]},"591":{"position":[[98,3]]},"595":{"position":[[779,3]]},"608":{"position":[[80,3]]},"610":{"position":[[1614,3]]},"613":{"position":[[327,3]]},"626":{"position":[[67,3],[159,3],[376,3],[1109,3]]},"627":{"position":[[283,3]]},"628":{"position":[[7,3],[232,3]]},"644":{"position":[[168,3]]},"666":{"position":[[302,3]]},"679":{"position":[[315,3]]},"686":{"position":[[34,3]]},"702":{"position":[[680,3]]},"705":{"position":[[132,3]]},"710":{"position":[[910,3],[2516,3]]},"711":{"position":[[2388,3]]},"712":{"position":[[82,3]]},"719":{"position":[[464,3]]},"737":{"position":[[405,3]]},"776":{"position":[[7,3],[255,3]]},"785":{"position":[[721,3]]},"798":{"position":[[124,3]]},"824":{"position":[[272,3]]},"836":{"position":[[335,3],[1341,3]]},"838":{"position":[[1568,3],[3244,3]]},"842":{"position":[[71,3]]},"846":{"position":[[522,3]]},"854":{"position":[[1186,3],[1270,4]]},"873":{"position":[[8,3]]},"875":{"position":[[8690,3]]},"886":{"position":[[5040,3]]},"887":{"position":[[203,3]]},"890":{"position":[[976,3]]},"904":{"position":[[251,3],[3391,3]]},"908":{"position":[[372,3]]},"913":{"position":[[7,3]]},"985":{"position":[[516,3]]},"988":{"position":[[3102,3],[5902,3]]},"1004":{"position":[[519,3]]},"1067":{"position":[[727,3]]},"1072":{"position":[[509,3]]},"1087":{"position":[[76,3]]},"1124":{"position":[[190,3]]},"1148":{"position":[[148,3]]},"1198":{"position":[[119,3],[1226,3]]},"1228":{"position":[[41,3]]},"1271":{"position":[[183,3]]},"1294":{"position":[[331,3]]},"1316":{"position":[[838,3]]},"1324":{"position":[[30,3]]}},"keywords":{}}],["outag",{"_index":2520,"title":{},"content":{"407":{"position":[[557,7]]},"473":{"position":[[131,8]]}},"keywords":{}}],["outcom",{"_index":1781,"title":{},"content":{"300":{"position":[[772,8]]}},"keywords":{}}],["outdat",{"_index":2429,"title":{},"content":{"399":{"position":[[303,8]]},"421":{"position":[[394,9]]},"458":{"position":[[324,8]]},"496":{"position":[[779,8]]},"624":{"position":[[1392,8]]},"709":{"position":[[616,8]]},"749":{"position":[[16380,8]]},"876":{"position":[[567,8]]},"879":{"position":[[347,8]]},"990":{"position":[[1056,9],[1361,8]]}},"keywords":{}}],["outdatedcli",{"_index":5068,"title":{"879":{"position":[[0,16]]}},"content":{"879":{"position":[[376,15]]}},"keywords":{}}],["outer",{"_index":4658,"title":{},"content":{"799":{"position":[[411,5]]}},"keywords":{}}],["outlier",{"_index":2204,"title":{},"content":{"390":{"position":[[1497,8]]}},"keywords":{}}],["outperform",{"_index":2574,"title":{},"content":{"408":{"position":[[5329,11]]},"622":{"position":[[681,13]]},"1090":{"position":[[136,11]]}},"keywords":{}}],["output",{"_index":2222,"title":{},"content":{"391":{"position":[[644,6]]},"401":{"position":[[658,7]]},"404":{"position":[[803,8],[985,8]]},"1266":{"position":[[481,6],[598,7]]},"1267":{"position":[[259,6]]}},"keywords":{}}],["output.multi",{"_index":2506,"title":{},"content":{"404":{"position":[[685,12]]}},"keywords":{}}],["outsid",{"_index":747,"title":{},"content":{"50":{"position":[[31,7],[248,7],[432,7]]},"129":{"position":[[552,7]]},"701":{"position":[[845,10]]},"829":{"position":[[1082,7]]},"832":{"position":[[131,7]]},"1188":{"position":[[413,7]]},"1198":{"position":[[1007,8]]},"1210":{"position":[[595,7]]},"1231":{"position":[[858,7]]},"1233":{"position":[[226,7]]}},"keywords":{}}],["outstand",{"_index":6040,"title":{},"content":{"1133":{"position":[[502,11]]},"1297":{"position":[[288,11]]}},"keywords":{}}],["over",{"_index":272,"title":{"210":{"position":[[27,4]]},"1120":{"position":[[12,4]]}},"content":{"16":{"position":[[149,4]]},"19":{"position":[[323,4]]},"22":{"position":[[267,4]]},"35":{"position":[[121,4]]},"37":{"position":[[90,4]]},"75":{"position":[[94,4]]},"186":{"position":[[201,4]]},"228":{"position":[[414,4]]},"278":{"position":[[132,4]]},"282":{"position":[[395,4]]},"305":{"position":[[226,4]]},"400":{"position":[[802,4]]},"407":{"position":[[144,4]]},"408":{"position":[[475,4]]},"410":{"position":[[637,4]]},"411":{"position":[[3642,4]]},"419":{"position":[[587,4]]},"427":{"position":[[989,4]]},"452":{"position":[[317,4]]},"454":{"position":[[130,4]]},"459":{"position":[[151,4]]},"464":{"position":[[704,4]]},"534":{"position":[[407,4]]},"536":{"position":[[122,4]]},"594":{"position":[[405,4]]},"596":{"position":[[120,4]]},"610":{"position":[[117,4]]},"611":{"position":[[56,4],[397,4]]},"612":{"position":[[86,4]]},"613":{"position":[[229,4]]},"614":{"position":[[924,4]]},"616":{"position":[[129,4]]},"621":{"position":[[76,4]]},"626":{"position":[[757,4]]},"636":{"position":[[1,4]]},"647":{"position":[[138,4]]},"690":{"position":[[70,4],[209,4]]},"704":{"position":[[48,4]]},"705":{"position":[[1043,4]]},"775":{"position":[[313,4]]},"780":{"position":[[142,4]]},"781":{"position":[[489,4]]},"783":{"position":[[315,4]]},"796":{"position":[[188,4]]},"818":{"position":[[199,4]]},"826":{"position":[[576,4],[784,4],[882,4]]},"837":{"position":[[387,4],[532,4]]},"839":{"position":[[208,4]]},"841":{"position":[[970,4]]},"848":{"position":[[921,4]]},"871":{"position":[[284,4]]},"885":{"position":[[1272,4]]},"897":{"position":[[136,4],[393,4]]},"912":{"position":[[664,4]]},"947":{"position":[[27,4]]},"1009":{"position":[[838,4]]},"1018":{"position":[[708,4]]},"1022":{"position":[[50,4]]},"1043":{"position":[[33,4]]},"1069":{"position":[[109,4]]},"1137":{"position":[[215,4]]},"1147":{"position":[[317,4]]},"1149":{"position":[[22,4]]},"1198":{"position":[[326,4],[653,4]]},"1218":{"position":[[33,4]]},"1219":{"position":[[80,4]]},"1246":{"position":[[745,4]]},"1257":{"position":[[152,4]]},"1295":{"position":[[892,4],[984,4],[1124,4],[1286,4]]},"1296":{"position":[[163,4],[384,4],[569,4],[1164,4]]},"1315":{"position":[[69,4]]}},"keywords":{}}],["overal",{"_index":984,"title":{},"content":{"78":{"position":[[87,7]]},"81":{"position":[[116,7]]},"87":{"position":[[263,7]]},"111":{"position":[[141,7]]},"136":{"position":[[342,7]]},"141":{"position":[[175,7]]},"166":{"position":[[285,7]]},"173":{"position":[[2644,7]]},"236":{"position":[[113,7]]},"294":{"position":[[212,7]]},"304":{"position":[[106,7]]},"311":{"position":[[170,7]]},"409":{"position":[[101,7]]},"411":{"position":[[1746,7]]},"508":{"position":[[187,7]]},"587":{"position":[[88,7]]},"801":{"position":[[776,7]]},"802":{"position":[[821,7]]},"820":{"position":[[428,7]]},"836":{"position":[[2205,8]]}},"keywords":{}}],["overcom",{"_index":1876,"title":{},"content":{"306":{"position":[[306,10]]},"781":{"position":[[192,8]]}},"keywords":{}}],["overcompl",{"_index":3725,"title":{},"content":{"644":{"position":[[734,16]]}},"keywords":{}}],["overfetch",{"_index":3973,"title":{},"content":{"703":{"position":[[915,9]]}},"keywords":{}}],["overflow",{"_index":1762,"title":{},"content":{"299":{"position":[[1398,9]]},"779":{"position":[[55,8]]}},"keywords":{}}],["overhead",{"_index":393,"title":{},"content":{"23":{"position":[[409,9]]},"24":{"position":[[400,8]]},"265":{"position":[[818,9]]},"283":{"position":[[217,9]]},"311":{"position":[[253,8]]},"313":{"position":[[238,9]]},"361":{"position":[[1087,8]]},"376":{"position":[[164,8],[414,8]]},"383":{"position":[[552,8]]},"408":{"position":[[2002,8]]},"412":{"position":[[9887,10]]},"427":{"position":[[645,9],[802,9]]},"429":{"position":[[347,9]]},"463":{"position":[[897,8]]},"464":{"position":[[925,8]]},"490":{"position":[[539,9]]},"521":{"position":[[652,8]]},"527":{"position":[[192,8]]},"611":{"position":[[198,8]]},"622":{"position":[[284,8],[460,8]]},"623":{"position":[[301,8]]},"624":{"position":[[1438,8]]},"630":{"position":[[484,9]]},"631":{"position":[[501,8]]},"644":{"position":[[554,8]]},"723":{"position":[[948,8]]},"802":{"position":[[201,9]]},"836":{"position":[[1552,9]]},"841":{"position":[[929,8]]},"902":{"position":[[248,8]]},"1009":{"position":[[643,9]]},"1200":{"position":[[62,8]]},"1270":{"position":[[142,8]]},"1295":{"position":[[1501,9]]}},"keywords":{}}],["overhead.built",{"_index":1221,"title":{},"content":{"174":{"position":[[1763,14]]}},"keywords":{}}],["overhead.y",{"_index":1592,"title":{},"content":{"262":{"position":[[297,12]]}},"keywords":{}}],["overload",{"_index":5240,"title":{},"content":{"902":{"position":[[201,11]]}},"keywords":{}}],["overrid",{"_index":1731,"title":{},"content":{"298":{"position":[[824,10]]},"496":{"position":[[96,9]]},"635":{"position":[[267,8]]},"898":{"position":[[3908,9]]}},"keywords":{}}],["oversel",{"_index":2711,"title":{},"content":{"412":{"position":[[6453,11]]}},"keywords":{}}],["oversight",{"_index":3904,"title":{},"content":{"689":{"position":[[523,10]]}},"keywords":{}}],["overus",{"_index":4670,"title":{},"content":{"802":{"position":[[475,7]]}},"keywords":{}}],["overview",{"_index":878,"title":{"151":{"position":[[0,8]]},"177":{"position":[[0,8]]},"551":{"position":[[24,9]]},"566":{"position":[[0,9]]},"871":{"position":[[13,9]]},"897":{"position":[[13,9]]}},"content":{"60":{"position":[[23,8]]},"411":{"position":[[1009,8]]},"449":{"position":[[25,8]]},"547":{"position":[[23,8]]},"607":{"position":[[23,8]]},"641":{"position":[[119,9]]},"696":{"position":[[2010,8]]},"793":{"position":[[35,8],[171,8]]},"901":{"position":[[620,9]]}},"keywords":{}}],["overwhelm",{"_index":1642,"title":{},"content":{"277":{"position":[[99,12]]}},"keywords":{}}],["overwrit",{"_index":2058,"title":{"806":{"position":[[0,13]]}},"content":{"358":{"position":[[314,11]]},"496":{"position":[[428,9]]},"566":{"position":[[839,10]]},"654":{"position":[[210,9]]},"683":{"position":[[478,9]]},"806":{"position":[[94,9],[118,12],[165,13],[221,9]]},"863":{"position":[[556,11]]},"946":{"position":[[84,9]]},"987":{"position":[[916,9]]},"991":{"position":[[119,9]]},"1015":{"position":[[72,10]]},"1043":{"position":[[1,10]]},"1103":{"position":[[97,9]]},"1174":{"position":[[274,9]]},"1301":{"position":[[259,9]]},"1309":{"position":[[1221,9]]}},"keywords":{}}],["overwrite/polyfil",{"_index":6047,"title":{"1139":{"position":[[0,18]]},"1145":{"position":[[0,18]]}},"content":{},"keywords":{}}],["overwritten",{"_index":5343,"title":{},"content":{"946":{"position":[[117,11]]},"1004":{"position":[[636,12]]}},"keywords":{}}],["own",{"_index":4795,"title":{},"content":{"839":{"position":[[136,5]]},"841":{"position":[[228,6]]}},"keywords":{}}],["owner",{"_index":3640,"title":{},"content":{"617":{"position":[[952,6]]}},"keywords":{}}],["ownership",{"_index":1022,"title":{"417":{"position":[[5,9]]}},"content":{"97":{"position":[[133,9]]},"407":{"position":[[505,9],[966,9]]},"419":{"position":[[936,10]]},"839":{"position":[[1367,9]]},"902":{"position":[[368,9]]}},"keywords":{}}],["p",{"_index":4923,"title":{},"content":{"865":{"position":[[245,1]]}},"keywords":{}}],["p2",{"_index":4151,"title":{},"content":{"749":{"position":[[1548,2]]}},"keywords":{}}],["p2p",{"_index":1360,"title":{"210":{"position":[[11,3]]},"261":{"position":[[24,3]]},"868":{"position":[[28,3]]},"900":{"position":[[0,3]]},"902":{"position":[[12,3]]},"903":{"position":[[13,5]]}},"content":{"210":{"position":[[317,4]]},"261":{"position":[[394,3],[1017,3]]},"289":{"position":[[1582,5],[1679,3]]},"411":{"position":[[4858,3],[5103,3]]},"504":{"position":[[1270,5],[1314,3]]},"793":{"position":[[744,3]]},"868":{"position":[[28,3]]},"902":{"position":[[622,3]]},"903":{"position":[[139,3],[668,3]]},"904":{"position":[[1197,4],[1416,3],[2233,3],[3343,3]]},"906":{"position":[[5,3]]},"913":{"position":[[220,3],[324,3]]},"1121":{"position":[[187,3]]}},"keywords":{}}],["p2p"",{"_index":1458,"title":{},"content":{"243":{"position":[[477,9]]}},"keywords":{}}],["p2pconnectionhandlercr",{"_index":5259,"title":{},"content":{"904":{"position":[[1603,27]]}},"keywords":{}}],["pace",{"_index":1682,"title":{},"content":{"289":{"position":[[1524,5]]}},"keywords":{}}],["packag",{"_index":251,"title":{"1274":{"position":[[27,8]]},"1275":{"position":[[27,8]]}},"content":{"15":{"position":[[154,7]]},"16":{"position":[[46,8]]},"188":{"position":[[2076,7],[2123,7]]},"285":{"position":[[184,7]]},"364":{"position":[[427,8]]},"438":{"position":[[215,7],[245,7]]},"503":{"position":[[160,9]]},"523":{"position":[[16,7]]},"542":{"position":[[192,8]]},"617":{"position":[[2248,7],[2340,7]]},"662":{"position":[[972,8]]},"711":{"position":[[720,7],[798,7]]},"724":{"position":[[41,7],[115,8]]},"730":{"position":[[254,8]]},"824":{"position":[[563,7]]},"835":{"position":[[687,7]]},"852":{"position":[[104,8]]},"854":{"position":[[24,8]]},"866":{"position":[[20,8]]},"878":{"position":[[68,8]]},"882":{"position":[[49,7],[274,7]]},"910":{"position":[[186,7]]},"911":{"position":[[314,7],[468,7]]},"1097":{"position":[[60,7]]},"1112":{"position":[[63,8]]},"1189":{"position":[[23,8]]},"1271":{"position":[[796,7],[1041,9]]},"1276":{"position":[[42,7]]}},"keywords":{}}],["package.json",{"_index":3828,"title":{},"content":{"666":{"position":[[383,12]]},"726":{"position":[[80,13]]},"730":{"position":[[217,12]]},"731":{"position":[[86,13]]},"760":{"position":[[90,12]]},"1176":{"position":[[527,12]]}},"keywords":{}}],["package:rxdb/rxdb.dart",{"_index":1274,"title":{},"content":{"188":{"position":[[2541,25]]}},"keywords":{}}],["packageth",{"_index":3787,"title":{},"content":{"661":{"position":[[297,10],[331,10]]}},"keywords":{}}],["padstart(idmaxlength",{"_index":6462,"title":{},"content":{"1296":{"position":[[1533,24]]}},"keywords":{}}],["page",{"_index":1058,"title":{},"content":{"116":{"position":[[118,4]]},"266":{"position":[[1034,4]]},"298":{"position":[[397,5]]},"334":{"position":[[106,4]]},"346":{"position":[[387,4]]},"394":{"position":[[1316,4]]},"410":{"position":[[1569,4]]},"411":{"position":[[1018,4]]},"421":{"position":[[56,6],[114,5],[309,4]]},"424":{"position":[[362,5]]},"436":{"position":[[210,4]]},"454":{"position":[[758,4]]},"463":{"position":[[1321,4]]},"617":{"position":[[230,4]]},"653":{"position":[[659,4]]},"656":{"position":[[326,4]]},"664":{"position":[[34,4]]},"740":{"position":[[666,5]]},"781":{"position":[[384,4]]},"783":{"position":[[179,4],[267,4]]},"830":{"position":[[43,4]]},"831":{"position":[[46,5]]},"832":{"position":[[97,5]]},"868":{"position":[[93,4]]},"879":{"position":[[591,4]]},"958":{"position":[[177,4]]},"990":{"position":[[1163,4],[1386,4]]},"1137":{"position":[[261,4]]},"1161":{"position":[[110,4]]},"1162":{"position":[[590,4]]},"1164":{"position":[[383,4]]},"1180":{"position":[[110,4]]},"1181":{"position":[[678,4]]},"1192":{"position":[[473,4]]},"1238":{"position":[[355,4]]},"1246":{"position":[[1809,4]]},"1267":{"position":[[367,4]]},"1299":{"position":[[175,4]]},"1301":{"position":[[1427,4]]}},"keywords":{}}],["pageload",{"_index":3094,"title":{},"content":{"469":{"position":[[1009,9]]},"696":{"position":[[157,8]]},"1295":{"position":[[733,8]]}},"keywords":{}}],["pages",{"_index":3272,"title":{},"content":{"523":{"position":[[534,9]]}},"keywords":{}}],["pagin",{"_index":3273,"title":{},"content":{"523":{"position":[[547,11]]}},"keywords":{}}],["pain",{"_index":2755,"title":{},"content":{"412":{"position":[[12779,5]]}},"keywords":{}}],["painless",{"_index":3702,"title":{},"content":{"632":{"position":[[912,8]]}},"keywords":{}}],["pair",{"_index":2095,"title":{},"content":{"362":{"position":[[456,7]]},"426":{"position":[[59,6]]},"429":{"position":[[565,5]]},"432":{"position":[[231,5]]},"451":{"position":[[144,5]]},"486":{"position":[[201,5]]},"533":{"position":[[166,6]]},"559":{"position":[[62,5]]},"574":{"position":[[896,5]]},"593":{"position":[[166,6]]},"1124":{"position":[[977,6]]}},"keywords":{}}],["paper",{"_index":2865,"title":{},"content":{"422":{"position":[[296,5]]}},"keywords":{}}],["paradigm",{"_index":1237,"title":{"407":{"position":[[24,9]]},"445":{"position":[[20,8]]}},"content":{"179":{"position":[[369,9]]},"387":{"position":[[89,9]]},"409":{"position":[[175,8]]},"411":{"position":[[4965,8]]},"445":{"position":[[1243,9],[1580,8]]},"502":{"position":[[393,8]]},"723":{"position":[[2543,8]]}},"keywords":{}}],["paradox",{"_index":2581,"title":{},"content":{"409":{"position":[[9,7]]}},"keywords":{}}],["parallel",{"_index":2252,"title":{},"content":{"392":{"position":[[3192,8],[3322,9]]},"460":{"position":[[203,8]]},"617":{"position":[[1391,8],[1958,9]]},"749":{"position":[[9302,8]]},"752":{"position":[[833,8]]},"759":{"position":[[761,9],[832,9]]},"760":{"position":[[757,9]]},"767":{"position":[[136,8],[241,8],[435,8],[818,8]]},"768":{"position":[[117,8],[200,8],[417,8],[824,8]]},"769":{"position":[[128,8],[215,8],[370,8],[789,8]]},"801":{"position":[[628,8]]},"845":{"position":[[144,9]]},"863":{"position":[[665,9]]},"948":{"position":[[524,8]]},"958":{"position":[[595,8]]},"1088":{"position":[[137,9]]},"1175":{"position":[[693,8]]},"1194":{"position":[[883,9]]},"1238":{"position":[[231,8]]},"1295":{"position":[[939,8]]},"1313":{"position":[[175,8]]}},"keywords":{}}],["param",{"_index":4166,"title":{},"content":{"749":{"position":[[2323,6]]},"1088":{"position":[[572,5]]}},"keywords":{}}],["paramet",{"_index":174,"title":{},"content":{"11":{"position":[[941,9]]},"403":{"position":[[27,9]]},"616":{"position":[[807,10]]},"724":{"position":[[1711,9]]},"749":{"position":[[24283,9]]},"751":{"position":[[326,9]]},"766":{"position":[[40,10],[117,10],[203,10]]},"805":{"position":[[182,9]]},"806":{"position":[[488,10]]},"818":{"position":[[142,9]]},"886":{"position":[[4308,9],[4377,9],[4567,11]]},"890":{"position":[[604,9]]},"934":{"position":[[522,10]]},"937":{"position":[[10,10]]},"938":{"position":[[10,10]]},"960":{"position":[[120,11],[401,11]]},"971":{"position":[[129,9]]},"986":{"position":[[298,9]]},"1065":{"position":[[539,9],[1581,10],[1873,9]]},"1105":{"position":[[193,9]]},"1189":{"position":[[218,9]]},"1226":{"position":[[338,9]]},"1264":{"position":[[254,9]]}},"keywords":{}}],["parameters.direct",{"_index":5488,"title":{},"content":{"990":{"position":[[892,21]]}},"keywords":{}}],["parameters.error",{"_index":5487,"title":{},"content":{"990":{"position":[[813,18]]}},"keywords":{}}],["paramount",{"_index":1190,"title":{},"content":{"167":{"position":[[37,10]]},"310":{"position":[[28,9]]},"354":{"position":[[1335,10]]},"380":{"position":[[423,10]]},"526":{"position":[[38,9]]},"802":{"position":[[932,10]]}},"keywords":{}}],["params.databasenam",{"_index":6061,"title":{},"content":{"1140":{"position":[[770,21]]}},"keywords":{}}],["parent",{"_index":6108,"title":{},"content":{"1162":{"position":[[217,6],[550,6],[842,6]]},"1164":{"position":[[323,6],[572,6]]},"1165":{"position":[[123,6],[490,6],[587,6]]},"1181":{"position":[[283,6],[638,6]]}},"keywords":{}}],["parentdatabas",{"_index":6120,"title":{},"content":{"1165":{"position":[[706,14]]}},"keywords":{}}],["parentdatabase.addcollect",{"_index":6121,"title":{},"content":{"1165":{"position":[[801,32]]}},"keywords":{}}],["parentdatabase.mycollect",{"_index":6122,"title":{},"content":{"1165":{"position":[[879,28]]}},"keywords":{}}],["parentstorag",{"_index":6114,"title":{},"content":{"1163":{"position":[[284,13],[436,13]]},"1164":{"position":[[170,14],[941,14]]},"1165":{"position":[[294,13],[399,14],[777,13]]},"1182":{"position":[[284,13],[440,13]]}},"keywords":{}}],["pars",{"_index":2049,"title":{},"content":{"357":{"position":[[174,5]]},"358":{"position":[[769,6]]},"360":{"position":[[176,7]]},"364":{"position":[[439,6]]},"426":{"position":[[457,7]]},"427":{"position":[[739,7]]},"454":{"position":[[725,6]]},"463":{"position":[[1143,7]]},"566":{"position":[[247,5]]},"800":{"position":[[69,5],[142,6],[266,5],[306,7]]},"882":{"position":[[233,5]]},"1065":{"position":[[770,7]]},"1104":{"position":[[121,6],[720,5]]},"1171":{"position":[[412,5]]},"1252":{"position":[[245,5]]},"1317":{"position":[[384,5]]}},"keywords":{}}],["parsefloat(req.query.updatedat",{"_index":4992,"title":{},"content":{"875":{"position":[[2149,32]]}},"keywords":{}}],["parseint($('#heropoints').v",{"_index":1956,"title":{},"content":{"335":{"position":[[685,32]]}},"keywords":{}}],["part",{"_index":1160,"title":{"559":{"position":[[0,4]]},"560":{"position":[[0,4]]},"561":{"position":[[0,4]]},"563":{"position":[[0,4]]},"564":{"position":[[0,4]]},"800":{"position":[[6,5]]}},"content":{"152":{"position":[[45,4]]},"188":{"position":[[2015,4]]},"303":{"position":[[1160,4]]},"358":{"position":[[244,5]]},"408":{"position":[[1567,4]]},"412":{"position":[[573,4],[1019,5]]},"451":{"position":[[44,4]]},"617":{"position":[[339,4]]},"618":{"position":[[393,4]]},"662":{"position":[[1014,4]]},"680":{"position":[[315,5]]},"696":{"position":[[1846,5]]},"698":{"position":[[2121,5]]},"701":{"position":[[1052,5]]},"707":{"position":[[45,6]]},"710":{"position":[[844,4]]},"749":{"position":[[15185,4]]},"829":{"position":[[129,4]]},"830":{"position":[[177,4]]},"838":{"position":[[1502,4]]},"854":{"position":[[1537,4]]},"875":{"position":[[7607,4]]},"981":{"position":[[329,5],[380,5],[596,5]]},"986":{"position":[[311,4]]},"1009":{"position":[[1067,5]]},"1078":{"position":[[775,5]]},"1124":{"position":[[1378,5]]},"1129":{"position":[[7,4]]},"1141":{"position":[[7,4]]},"1162":{"position":[[885,4],[920,4]]},"1181":{"position":[[837,4],[872,4]]},"1210":{"position":[[223,4]]},"1215":{"position":[[411,4]]},"1246":{"position":[[794,4]]},"1304":{"position":[[916,4]]},"1307":{"position":[[174,5]]}},"keywords":{}}],["parti",{"_index":1103,"title":{"1247":{"position":[[6,5]]},"1284":{"position":[[6,5]]}},"content":{"131":{"position":[[176,5]]},"412":{"position":[[1600,5]]},"482":{"position":[[1198,7]]},"550":{"position":[[50,5]]},"611":{"position":[[436,7]]},"793":{"position":[[1219,5]]},"902":{"position":[[463,5]]},"1102":{"position":[[264,5]]},"1284":{"position":[[6,5]]}},"keywords":{}}],["partial",{"_index":650,"title":{"1006":{"position":[[0,7]]},"1009":{"position":[[0,7]]}},"content":{"41":{"position":[[86,7]]},"212":{"position":[[167,7]]},"245":{"position":[[19,7]]},"250":{"position":[[233,7]]},"299":{"position":[[379,7]]},"357":{"position":[[230,7]]},"358":{"position":[[471,7],[656,7],[919,7]]},"362":{"position":[[709,7]]},"412":{"position":[[7458,7],[13804,7]]},"418":{"position":[[574,7]]},"497":{"position":[[737,7]]},"559":{"position":[[1480,7]]},"626":{"position":[[328,7]]},"635":{"position":[[361,7]]},"699":{"position":[[859,9]]},"705":{"position":[[750,9]]},"723":{"position":[[254,7]]},"800":{"position":[[59,9],[298,7]]},"841":{"position":[[679,7],[1557,7]]},"1030":{"position":[[172,9]]},"1033":{"position":[[137,9]]},"1072":{"position":[[94,7]]},"1093":{"position":[[259,9]]},"1116":{"position":[[145,9]]}},"keywords":{}}],["participants.onlin",{"_index":2782,"title":{},"content":{"414":{"position":[[223,19]]}},"keywords":{}}],["particular",{"_index":5558,"title":{},"content":{"1007":{"position":[[388,10]]}},"keywords":{}}],["particularli",{"_index":532,"title":{},"content":{"34":{"position":[[253,12]]},"40":{"position":[[112,12]]},"65":{"position":[[1193,12]]},"69":{"position":[[177,12]]},"122":{"position":[[287,12]]},"133":{"position":[[281,12]]},"141":{"position":[[218,12]]},"169":{"position":[[227,12]]},"173":{"position":[[2084,12]]},"185":{"position":[[146,12]]},"215":{"position":[[285,12]]},"216":{"position":[[241,12]]},"220":{"position":[[229,12]]},"232":{"position":[[230,12]]},"276":{"position":[[177,12]]},"287":{"position":[[806,12]]},"309":{"position":[[66,12]]},"375":{"position":[[21,12]]},"418":{"position":[[14,12]]},"508":{"position":[[105,12]]},"526":{"position":[[215,12]]},"584":{"position":[[193,12]]},"839":{"position":[[46,12]]},"902":{"position":[[896,12]]},"912":{"position":[[518,12]]}},"keywords":{}}],["partit",{"_index":2721,"title":{},"content":{"412":{"position":[[7624,11],[12266,9]]},"1295":{"position":[[88,11],[553,12]]}},"keywords":{}}],["partli",{"_index":2764,"title":{},"content":{"412":{"position":[[13683,6]]}},"keywords":{}}],["pass",{"_index":172,"title":{"1229":{"position":[[0,7]]},"1268":{"position":[[0,7]]}},"content":{"11":{"position":[[924,6]]},"55":{"position":[[618,4]]},"682":{"position":[[286,4]]},"721":{"position":[[428,6]]},"749":{"position":[[11965,4]]},"789":{"position":[[26,4]]},"806":{"position":[[660,6]]},"886":{"position":[[4365,6]]},"890":{"position":[[584,4],[742,4]]},"907":{"position":[[148,7]]},"950":{"position":[[86,4]]},"951":{"position":[[554,6]]},"971":{"position":[[114,4]]},"975":{"position":[[602,6]]},"988":{"position":[[4276,6]]},"1065":{"position":[[190,4]]},"1084":{"position":[[483,4]]},"1105":{"position":[[290,4]]},"1139":{"position":[[191,4]]},"1145":{"position":[[187,4]]},"1146":{"position":[[162,7]]},"1156":{"position":[[297,4]]},"1271":{"position":[[284,4]]},"1282":{"position":[[652,4],[850,4]]}},"keywords":{}}],["passeng",{"_index":3462,"title":{},"content":{"569":{"position":[[850,11]]}},"keywords":{}}],["passportid",{"_index":4955,"title":{},"content":{"872":{"position":[[1884,13],[1928,11],[2049,14],[4114,13],[4158,11],[4279,14]]},"898":{"position":[[2464,13],[2508,11],[2654,14]]},"1051":{"position":[[216,11],[486,11]]},"1311":{"position":[[403,13],[447,11],[578,14],[1513,11]]}},"keywords":{}}],["password",{"_index":1400,"title":{"218":{"position":[[0,8]]},"715":{"position":[[0,8]]},"719":{"position":[[13,9]]},"963":{"position":[[0,9]]}},"content":{"314":{"position":[[647,10]]},"315":{"position":[[607,9]]},"334":{"position":[[407,9],[454,8]]},"412":{"position":[[13354,8]]},"482":{"position":[[587,8],[684,9],[1159,9]]},"522":{"position":[[521,9],[554,8]]},"554":{"position":[[1133,9]]},"556":{"position":[[8,8],[43,9],[184,8],[276,8],[502,8]]},"564":{"position":[[542,8],[657,9]]},"579":{"position":[[416,9],[463,8]]},"632":{"position":[[1380,8]]},"638":{"position":[[494,9],[931,9]]},"715":{"position":[[70,9],[116,8],[204,10],[265,9],[299,8],[384,10]]},"716":{"position":[[63,8],[282,8],[347,8],[412,8],[464,8]]},"717":{"position":[[944,8],[999,8],[1221,9]]},"718":{"position":[[563,9],[733,9]]},"719":{"position":[[5,8],[76,8],[146,8],[190,8],[329,8],[413,8],[443,8]]},"720":{"position":[[285,8]]},"721":{"position":[[308,8],[343,8]]},"739":{"position":[[359,9]]},"749":{"position":[[4794,8],[12888,8],[12997,8],[13118,8],[13191,8]]},"912":{"position":[[490,10]]},"916":{"position":[[297,8]]},"960":{"position":[[416,9],[449,8]]},"963":{"position":[[99,8],[120,8]]}},"keywords":{}}],["passwordkeep",{"_index":1879,"title":{},"content":{"310":{"position":[[208,12]]}},"keywords":{}}],["past",{"_index":465,"title":{},"content":{"28":{"position":[[635,5]]},"408":{"position":[[204,5],[1262,4]]},"414":{"position":[[89,4]]},"780":{"position":[[8,5]]},"783":{"position":[[8,4]]},"1208":{"position":[[495,5]]},"1316":{"position":[[1610,4]]},"1324":{"position":[[128,4]]}},"keywords":{}}],["patch",{"_index":744,"title":{"50":{"position":[[0,5]]},"129":{"position":[[0,5]]},"1043":{"position":[[0,8]]},"1060":{"position":[[0,7]]}},"content":{"50":{"position":[[151,5],[307,5],[507,5]]},"129":{"position":[[275,5],[426,8],[608,5],[727,5]]},"1044":{"position":[[472,5]]},"1198":{"position":[[851,7],[910,7]]}},"keywords":{}}],["path",{"_index":656,"title":{},"content":{"41":{"position":[[282,4]]},"188":{"position":[[2310,5]]},"356":{"position":[[257,5]]},"396":{"position":[[471,5]]},"412":{"position":[[11709,4]]},"483":{"position":[[551,5]]},"681":{"position":[[594,4]]},"749":{"position":[[3853,4],[6252,5],[9680,4],[10096,4],[14025,4]]},"810":{"position":[[87,4]]},"838":{"position":[[2276,4]]},"886":{"position":[[1364,4]]},"892":{"position":[[319,5]]},"902":{"position":[[691,6]]},"1033":{"position":[[540,4]]},"1039":{"position":[[50,5],[89,4]]},"1102":{"position":[[1106,6]]},"1125":{"position":[[477,4]]},"1134":{"position":[[436,4]]},"1226":{"position":[[429,4]]},"1227":{"position":[[427,4],[777,4]]},"1264":{"position":[[339,4]]},"1265":{"position":[[420,4],[759,4]]},"1266":{"position":[[171,4],[311,4],[488,4],[644,5]]}},"keywords":{}}],["path.join(__dirnam",{"_index":5910,"title":{},"content":{"1090":{"position":[[899,20]]},"1130":{"position":[[246,20]]}},"keywords":{}}],["path.resolv",{"_index":6309,"title":{},"content":{"1266":{"position":[[274,13],[650,13]]}},"keywords":{}}],["path/to/database/file/foobar.db",{"_index":4573,"title":{},"content":{"772":{"position":[[1640,34],[2402,34]]}},"keywords":{}}],["path/to/fdb.clust",{"_index":4568,"title":{},"content":{"772":{"position":[[874,22]]},"774":{"position":[[802,22]]},"1134":{"position":[[565,23]]}},"keywords":{}}],["path/to/shar",{"_index":6269,"title":{},"content":{"1226":{"position":[[577,15]]}},"keywords":{}}],["path/to/worker.j",{"_index":6287,"title":{},"content":{"1238":{"position":[[957,20]]},"1264":{"position":[[464,20]]},"1267":{"position":[[523,19]]}},"keywords":{}}],["path/to/your/node_modules/rxdb/src/plugins/flutter/dart",{"_index":1271,"title":{},"content":{"188":{"position":[[2316,55]]}},"keywords":{}}],["pattern",{"_index":1984,"title":{},"content":{"347":{"position":[[607,8]]},"362":{"position":[[1678,8]]},"369":{"position":[[1513,9]]},"411":{"position":[[3077,7]]},"420":{"position":[[765,9]]},"421":{"position":[[500,7]]},"462":{"position":[[429,9]]},"464":{"position":[[1104,7]]},"491":{"position":[[1772,7]]},"521":{"position":[[166,9]]},"634":{"position":[[83,8]]},"832":{"position":[[70,8]]},"1009":{"position":[[588,7]]},"1134":{"position":[[729,9]]},"1193":{"position":[[246,8]]},"1195":{"position":[[17,8]]},"1222":{"position":[[658,9]]}},"keywords":{}}],["paus",{"_index":3952,"title":{"998":{"position":[[0,8]]}},"content":{"700":{"position":[[687,6]]},"998":{"position":[[1,6]]},"1001":{"position":[[36,7]]},"1003":{"position":[[247,7]]}},"keywords":{}}],["pave",{"_index":1665,"title":{},"content":{"285":{"position":[[299,5]]},"441":{"position":[[646,4]]}},"keywords":{}}],["pay",{"_index":1556,"title":{},"content":{"251":{"position":[[156,3]]},"262":{"position":[[274,3]]}},"keywords":{}}],["payload",{"_index":3591,"title":{},"content":{"612":{"position":[[1610,9]]}},"keywords":{}}],["pc",{"_index":2428,"title":{},"content":{"399":{"position":[[270,4],[566,2]]},"1162":{"position":[[134,2]]},"1171":{"position":[[151,2]]},"1181":{"position":[[200,2]]}},"keywords":{}}],["peer",{"_index":477,"title":{"727":{"position":[[0,4]]},"903":{"position":[[0,4],[8,4]]},"907":{"position":[[0,4]]}},"content":{"29":{"position":[[152,4],[160,4]]},"40":{"position":[[243,4],[251,4]]},"210":{"position":[[59,4],[67,4],[698,6]]},"212":{"position":[[521,4]]},"261":{"position":[[71,4],[79,4],[894,5],[1047,5]]},"289":{"position":[[1569,4],[1577,4]]},"327":{"position":[[284,6]]},"411":{"position":[[4992,4],[5000,4]]},"481":{"position":[[381,4],[389,4]]},"504":{"position":[[1257,4],[1265,4]]},"614":{"position":[[296,4],[304,4],[519,6]]},"632":{"position":[[703,4],[711,4]]},"727":{"position":[[30,4]]},"749":{"position":[[16035,4]]},"901":{"position":[[170,6],[396,4],[404,4],[722,4],[730,4]]},"902":{"position":[[178,5]]},"903":{"position":[[372,4],[560,6]]},"904":{"position":[[1739,4],[2376,4],[2412,5],[3330,5]]},"905":{"position":[[119,5]]},"906":{"position":[[129,5],[259,4]]},"907":{"position":[[54,4],[122,5],[222,5],[249,6],[335,6]]},"910":{"position":[[99,4]]}},"keywords":{}}],["pend",{"_index":2153,"title":{},"content":{"380":{"position":[[216,7]]}},"keywords":{}}],["peopl",{"_index":2308,"title":{"420":{"position":[[3,6]]}},"content":{"394":{"position":[[616,8]]},"419":{"position":[[1298,6]]},"420":{"position":[[1062,6]]},"422":{"position":[[215,6]]},"454":{"position":[[484,6]]},"456":{"position":[[123,6]]},"569":{"position":[[982,6]]},"570":{"position":[[45,6]]},"611":{"position":[[1283,6]]},"613":{"position":[[1015,6]]},"670":{"position":[[193,7]]},"704":{"position":[[248,6]]},"705":{"position":[[246,6]]},"749":{"position":[[21854,6]]},"987":{"position":[[932,7]]},"1249":{"position":[[14,6]]},"1315":{"position":[[11,6],[96,6]]}},"keywords":{}}],["per",{"_index":1713,"title":{"617":{"position":[[11,3]]},"1267":{"position":[[11,3]]}},"content":{"298":{"position":[[312,3]]},"299":{"position":[[279,3],[604,3]]},"392":{"position":[[3088,3],[3718,3],[3832,3],[4689,3],[5097,3]]},"401":{"position":[[146,3]]},"402":{"position":[[1460,3]]},"408":{"position":[[1014,3],[1099,3],[1185,3],[4745,3]]},"412":{"position":[[5770,3],[6961,3],[7636,3],[10132,3],[12281,3],[12556,3]]},"432":{"position":[[334,3]]},"461":{"position":[[727,3],[814,3],[839,3],[864,3]]},"464":{"position":[[532,3],[724,3],[825,3],[1027,3],[1228,3],[1384,3]]},"465":{"position":[[394,3]]},"466":{"position":[[572,3]]},"469":{"position":[[296,3]]},"617":{"position":[[44,3],[1257,3],[2029,3]]},"654":{"position":[[32,3]]},"661":{"position":[[391,3]]},"696":{"position":[[1352,3]]},"703":{"position":[[1003,3],[1372,3]]},"736":{"position":[[408,3]]},"849":{"position":[[243,3],[251,3]]},"863":{"position":[[402,3]]},"866":{"position":[[237,3]]},"890":{"position":[[458,3]]},"904":{"position":[[2062,3]]},"981":{"position":[[1069,3]]},"1074":{"position":[[614,3]]},"1126":{"position":[[179,3]]},"1157":{"position":[[167,3]]},"1194":{"position":[[675,3]]},"1222":{"position":[[594,3],[1188,3]]},"1323":{"position":[[203,3]]}},"keywords":{}}],["perceiv",{"_index":3153,"title":{},"content":{"486":{"position":[[47,8]]},"571":{"position":[[1672,8]]},"630":{"position":[[330,9]]},"1246":{"position":[[285,9],[605,9]]}},"keywords":{}}],["percent",{"_index":4469,"title":{},"content":{"752":{"position":[[1274,8]]}},"keywords":{}}],["percentag",{"_index":1709,"title":{},"content":{"298":{"position":[[218,10],[525,10]]},"752":{"position":[[1288,10]]}},"keywords":{}}],["percept",{"_index":4589,"title":{},"content":{"778":{"position":[[414,11]]}},"keywords":{}}],["perf",{"_index":4811,"title":{},"content":{"841":{"position":[[1080,5]]}},"keywords":{}}],["perfect",{"_index":1034,"title":{},"content":{"102":{"position":[[107,7]]},"263":{"position":[[480,7]]},"287":{"position":[[919,7]]},"373":{"position":[[665,7]]},"384":{"position":[[11,7]]}},"keywords":{}}],["perfectli",{"_index":3155,"title":{},"content":{"486":{"position":[[207,9]]}},"keywords":{}}],["perfekt""how",{"_index":1535,"title":{},"content":{"245":{"position":[[85,22]]}},"keywords":{}}],["perform",{"_index":63,"title":{"60":{"position":[[0,11]]},"70":{"position":[[24,12]]},"101":{"position":[[24,12]]},"138":{"position":[[13,11]]},"194":{"position":[[13,11]]},"227":{"position":[[24,12]]},"265":{"position":[[10,11]]},"277":{"position":[[14,11]]},"283":{"position":[[6,12]]},"342":{"position":[[13,11]]},"369":{"position":[[19,12]]},"376":{"position":[[0,11]]},"385":{"position":[[0,11]]},"395":{"position":[[35,12]]},"399":{"position":[[0,11]]},"400":{"position":[[0,11]]},"401":{"position":[[0,11]]},"402":{"position":[[10,11]]},"415":{"position":[[12,12]]},"462":{"position":[[0,11]]},"468":{"position":[[0,11]]},"507":{"position":[[13,11]]},"527":{"position":[[13,11]]},"547":{"position":[[0,11]]},"587":{"position":[[13,11]]},"607":{"position":[[0,11]]},"620":{"position":[[0,11]]},"641":{"position":[[0,11]]},"703":{"position":[[0,11]]},"794":{"position":[[0,11]]},"1120":{"position":[[17,12]]},"1137":{"position":[[10,11]]},"1152":{"position":[[0,11]]},"1191":{"position":[[10,11]]},"1193":{"position":[[0,11]]},"1195":{"position":[[23,11]]},"1196":{"position":[[27,11]]},"1209":{"position":[[5,12]]},"1270":{"position":[[0,11]]},"1292":{"position":[[0,11]]}},"content":{"4":{"position":[[108,11]]},"5":{"position":[[67,11]]},"6":{"position":[[95,11]]},"17":{"position":[[207,11]]},"24":{"position":[[481,11],[694,11]]},"28":{"position":[[120,11]]},"31":{"position":[[235,12],[270,11]]},"33":{"position":[[122,11]]},"34":{"position":[[153,7]]},"46":{"position":[[252,12]]},"51":{"position":[[122,12]]},"52":{"position":[[44,7]]},"58":{"position":[[144,11]]},"59":{"position":[[137,12]]},"60":{"position":[[11,11]]},"61":{"position":[[357,11]]},"65":{"position":[[866,12],[1886,12]]},"66":{"position":[[139,11],[229,11]]},"70":{"position":[[93,11],[202,11]]},"78":{"position":[[95,11]]},"81":{"position":[[124,12]]},"87":{"position":[[184,12]]},"92":{"position":[[166,12]]},"101":{"position":[[29,11],[205,11]]},"106":{"position":[[187,11]]},"107":{"position":[[152,11]]},"108":{"position":[[191,12]]},"111":{"position":[[149,12]]},"114":{"position":[[710,12]]},"117":{"position":[[285,11]]},"131":{"position":[[323,11]]},"138":{"position":[[18,12],[264,11]]},"140":{"position":[[182,7]]},"141":{"position":[[45,12]]},"146":{"position":[[163,11]]},"166":{"position":[[14,11],[58,12],[293,11]]},"170":{"position":[[482,12]]},"173":{"position":[[192,12],[744,11],[1950,7],[2652,11]]},"174":{"position":[[1169,11],[1739,11],[2495,12]]},"177":{"position":[[110,11]]},"178":{"position":[[375,12]]},"181":{"position":[[151,10]]},"189":{"position":[[773,11]]},"193":{"position":[[92,12]]},"194":{"position":[[48,11]]},"197":{"position":[[47,12],[209,12]]},"204":{"position":[[172,9]]},"212":{"position":[[233,7]]},"216":{"position":[[318,7]]},"224":{"position":[[220,9]]},"234":{"position":[[151,9],[240,11]]},"236":{"position":[[130,12]]},"241":{"position":[[532,12]]},"265":{"position":[[212,9]]},"266":{"position":[[295,11]]},"267":{"position":[[170,11],[1001,7]]},"271":{"position":[[155,11]]},"276":{"position":[[43,7]]},"277":{"position":[[269,12]]},"283":{"position":[[18,11],[403,12]]},"287":{"position":[[1259,11]]},"294":{"position":[[224,12]]},"311":{"position":[[178,11]]},"314":{"position":[[150,12],[968,11]]},"318":{"position":[[301,11],[496,11]]},"336":{"position":[[297,11]]},"342":{"position":[[57,12]]},"345":{"position":[[134,12]]},"346":{"position":[[847,12]]},"352":{"position":[[170,10]]},"357":{"position":[[191,7]]},"366":{"position":[[372,12]]},"369":{"position":[[40,11],[418,11],[616,11],[1406,11]]},"370":{"position":[[232,12]]},"373":{"position":[[547,12]]},"376":{"position":[[13,11]]},"383":{"position":[[540,11]]},"385":{"position":[[257,11]]},"392":{"position":[[2995,11],[3169,12],[3369,11]]},"393":{"position":[[622,11]]},"396":{"position":[[82,12],[1502,11]]},"398":{"position":[[61,7],[166,12],[3152,11]]},"399":{"position":[[27,11],[207,11],[431,11],[521,11]]},"400":{"position":[[353,11],[488,8]]},"401":{"position":[[741,12],[860,11]]},"402":{"position":[[52,11],[910,11],[1043,11],[1670,11],[1754,11],[2290,12],[2565,11],[2723,11]]},"408":{"position":[[1710,7],[1990,11],[3688,11],[4236,12],[4395,12],[4980,11],[5312,11],[5543,11]]},"410":{"position":[[1,11]]},"412":{"position":[[4976,12],[9464,11],[9652,11],[10546,11],[10725,11]]},"419":{"position":[[960,11]]},"420":{"position":[[1526,11]]},"427":{"position":[[254,9],[349,11],[790,11],[951,7],[1194,11]]},"429":{"position":[[28,12]]},"430":{"position":[[531,12],[771,11],[839,11]]},"432":{"position":[[704,11],[1417,11]]},"433":{"position":[[161,11],[245,11]]},"434":{"position":[[316,12]]},"442":{"position":[[116,11]]},"446":{"position":[[797,11]]},"447":{"position":[[43,11]]},"450":{"position":[[512,11],[634,11]]},"452":{"position":[[558,11]]},"454":{"position":[[58,11]]},"457":{"position":[[687,11]]},"459":{"position":[[183,10]]},"462":{"position":[[78,11],[316,11],[417,11],[821,11],[1002,11]]},"464":{"position":[[1092,11]]},"465":{"position":[[426,7]]},"466":{"position":[[392,8]]},"469":{"position":[[52,11],[135,11],[442,11],[1101,11],[1209,11],[1297,11],[1400,12]]},"470":{"position":[[605,12]]},"483":{"position":[[1013,11]]},"485":{"position":[[217,11]]},"489":{"position":[[352,7]]},"490":{"position":[[703,12]]},"507":{"position":[[1,11]]},"514":{"position":[[182,10]]},"521":{"position":[[306,11]]},"527":{"position":[[63,12]]},"528":{"position":[[71,12]]},"534":{"position":[[87,11]]},"535":{"position":[[458,7]]},"538":{"position":[[136,11]]},"539":{"position":[[44,7]]},"545":{"position":[[65,12]]},"546":{"position":[[170,12],[315,12]]},"547":{"position":[[11,11]]},"554":{"position":[[203,11]]},"556":{"position":[[1048,11],[1063,11],[1516,11]]},"557":{"position":[[437,11]]},"559":{"position":[[1472,7]]},"574":{"position":[[398,12]]},"581":{"position":[[698,12]]},"587":{"position":[[154,11]]},"588":{"position":[[123,11]]},"594":{"position":[[85,11]]},"595":{"position":[[486,7]]},"598":{"position":[[136,11]]},"599":{"position":[[44,7]]},"605":{"position":[[65,12]]},"606":{"position":[[170,12],[305,12]]},"607":{"position":[[11,11]]},"613":{"position":[[413,11]]},"618":{"position":[[486,12]]},"620":{"position":[[15,11],[267,11],[408,11],[629,11]]},"624":{"position":[[1639,11]]},"634":{"position":[[199,8]]},"641":{"position":[[1,10],[107,11],[247,8]]},"643":{"position":[[168,12]]},"644":{"position":[[203,11]]},"656":{"position":[[151,11]]},"662":{"position":[[769,11]]},"690":{"position":[[257,8]]},"703":{"position":[[713,11],[793,11],[1660,11]]},"704":{"position":[[392,11]]},"705":{"position":[[493,11]]},"709":{"position":[[647,12],[813,11],[1029,11]]},"710":{"position":[[788,11],[2185,11]]},"714":{"position":[[570,7],[908,7]]},"716":{"position":[[90,11]]},"723":{"position":[[159,9],[414,9],[1707,11],[2203,7],[2598,9]]},"749":{"position":[[21140,11],[21624,12]]},"772":{"position":[[2522,11]]},"774":{"position":[[25,11],[888,11]]},"783":{"position":[[67,7]]},"793":{"position":[[1264,11],[1286,11],[1304,11]]},"796":{"position":[[232,12]]},"797":{"position":[[140,11]]},"798":{"position":[[67,12],[452,11],[798,12]]},"800":{"position":[[180,11]]},"801":{"position":[[68,11],[796,11]]},"802":{"position":[[105,12],[917,11]]},"821":{"position":[[928,9]]},"828":{"position":[[483,11]]},"836":{"position":[[1686,11]]},"837":{"position":[[670,11]]},"838":{"position":[[1446,11],[3146,11]]},"839":{"position":[[316,11]]},"841":{"position":[[865,11]]},"875":{"position":[[9418,11]]},"894":{"position":[[126,11]]},"945":{"position":[[362,11]]},"947":{"position":[[61,11]]},"951":{"position":[[72,11]]},"962":{"position":[[280,12],[431,11]]},"965":{"position":[[77,11],[299,12]]},"966":{"position":[[400,11]]},"983":{"position":[[88,12]]},"989":{"position":[[12,12]]},"1005":{"position":[[164,11]]},"1013":{"position":[[12,12]]},"1052":{"position":[[113,11]]},"1065":{"position":[[1604,11]]},"1066":{"position":[[254,12],[604,12]]},"1067":{"position":[[147,12],[164,11],[638,11],[997,11],[1783,11]]},"1068":{"position":[[512,12]]},"1069":{"position":[[54,11]]},"1071":{"position":[[491,11]]},"1072":{"position":[[396,12],[877,11],[1117,7],[1509,11],[2580,7]]},"1083":{"position":[[307,11]]},"1085":{"position":[[164,11],[978,7]]},"1090":{"position":[[120,12]]},"1093":{"position":[[423,11]]},"1094":{"position":[[619,11]]},"1098":{"position":[[127,11]]},"1099":{"position":[[119,11]]},"1105":{"position":[[1021,11]]},"1107":{"position":[[940,11]]},"1108":{"position":[[577,11]]},"1112":{"position":[[586,11]]},"1120":{"position":[[47,12],[426,10],[520,11],[706,11]]},"1124":{"position":[[577,12],[1730,11]]},"1125":{"position":[[699,12]]},"1132":{"position":[[193,12]]},"1134":{"position":[[681,11]]},"1137":{"position":[[14,11],[238,11]]},"1138":{"position":[[369,12],[559,11]]},"1141":{"position":[[153,12]]},"1143":{"position":[[212,11]]},"1150":{"position":[[360,7]]},"1152":{"position":[[5,11],[116,11]]},"1157":{"position":[[332,11]]},"1161":{"position":[[21,11]]},"1164":{"position":[[47,11]]},"1175":{"position":[[430,11]]},"1180":{"position":[[21,11]]},"1186":{"position":[[125,12]]},"1188":{"position":[[360,7]]},"1191":{"position":[[58,12],[437,11],[556,11],[647,11]]},"1192":{"position":[[176,11],[414,12]]},"1193":{"position":[[36,11],[149,11]]},"1195":{"position":[[5,11],[188,11]]},"1198":{"position":[[432,12],[928,11]]},"1200":{"position":[[21,11]]},"1206":{"position":[[444,11]]},"1207":{"position":[[253,10]]},"1209":{"position":[[169,11],[354,11]]},"1222":{"position":[[712,11]]},"1230":{"position":[[202,12]]},"1231":{"position":[[131,12],[270,12]]},"1243":{"position":[[92,11]]},"1244":{"position":[[78,11]]},"1246":{"position":[[295,11],[615,11],[1029,11],[1525,11]]},"1247":{"position":[[42,11],[354,10],[527,10],[720,10]]},"1250":{"position":[[262,11],[439,11]]},"1271":{"position":[[657,11]]},"1276":{"position":[[366,11]]},"1287":{"position":[[54,7]]},"1292":{"position":[[19,11]]},"1294":{"position":[[82,12],[196,11],[1815,11]]},"1295":{"position":[[649,11],[771,11]]},"1296":{"position":[[27,11],[534,12],[1647,11]]},"1297":{"position":[[183,12],[446,11],[477,11]]},"1298":{"position":[[56,11]]},"1299":{"position":[[48,11]]},"1304":{"position":[[1487,11]]},"1309":{"position":[[893,12]]},"1315":{"position":[[1037,11]]},"1324":{"position":[[976,7]]}},"keywords":{}}],["performance.big",{"_index":2902,"title":{},"content":{"430":{"position":[[399,15]]}},"keywords":{}}],["performance.memori",{"_index":1107,"title":{},"content":{"131":{"position":[[694,18]]}},"keywords":{}}],["performance.sqlit",{"_index":3717,"title":{},"content":{"640":{"position":[[248,18]]}},"keywords":{}}],["performance.tri",{"_index":5282,"title":{},"content":{"913":{"position":[[150,15]]}},"keywords":{}}],["performance.vers",{"_index":5063,"title":{},"content":{"876":{"position":[[379,19]]}},"keywords":{}}],["performancey",{"_index":17,"title":{},"content":{"1":{"position":[[242,14]]}},"keywords":{}}],["perhap",{"_index":2745,"title":{},"content":{"412":{"position":[[11374,7]]}},"keywords":{}}],["period",{"_index":1858,"title":{},"content":{"303":{"position":[[1501,7]]},"305":{"position":[[238,6]]},"411":{"position":[[501,12],[716,8]]},"412":{"position":[[667,8]]},"618":{"position":[[310,6]]},"1301":{"position":[[200,12]]}},"keywords":{}}],["perk",{"_index":2859,"title":{},"content":{"421":{"position":[[1230,5]]}},"keywords":{}}],["perman",{"_index":453,"title":{},"content":{"28":{"position":[[191,9]]},"305":{"position":[[384,9]]},"799":{"position":[[126,11]]}},"keywords":{}}],["permanentlycal",{"_index":5904,"title":{},"content":{"1085":{"position":[[3590,15]]}},"keywords":{}}],["permiss",{"_index":359,"title":{"701":{"position":[[0,11]]}},"content":{"21":{"position":[[103,10]]},"299":{"position":[[488,10]]},"408":{"position":[[688,11]]},"412":{"position":[[12379,10],[12618,10],[13033,12],[13078,11]]},"662":{"position":[[883,10]]},"701":{"position":[[262,10],[510,10]]},"861":{"position":[[2201,10],[2254,11],[2379,11],[2408,10]]},"1198":{"position":[[1961,10]]}},"keywords":{}}],["permissions).conflict",{"_index":6074,"title":{},"content":{"1148":{"position":[[343,21]]}},"keywords":{}}],["permit",{"_index":2536,"title":{},"content":{"408":{"position":[[1166,7]]}},"keywords":{}}],["persist",{"_index":10,"title":{"266":{"position":[[0,11]]},"697":{"position":[[30,11]]},"772":{"position":[[0,10]]},"774":{"position":[[17,11]]},"1113":{"position":[[19,10]]},"1115":{"position":[[17,12]]},"1184":{"position":[[18,10]]},"1185":{"position":[[12,12]]},"1192":{"position":[[0,10],[19,10]]},"1300":{"position":[[11,12]]}},"content":{"1":{"position":[[127,10],[269,10]]},"28":{"position":[[178,7],[285,11]]},"30":{"position":[[129,12]]},"31":{"position":[[60,11]]},"32":{"position":[[21,10],[182,11],[225,7]]},"34":{"position":[[191,7]]},"35":{"position":[[549,10]]},"40":{"position":[[561,11],[770,12]]},"42":{"position":[[234,11],[357,12]]},"117":{"position":[[194,10]]},"131":{"position":[[43,10],[548,12],[604,10],[739,10],[892,12]]},"162":{"position":[[636,10]]},"178":{"position":[[68,10]]},"188":{"position":[[261,11],[346,8]]},"189":{"position":[[435,7],[577,12]]},"266":{"position":[[64,11],[152,7],[492,11],[971,12]]},"267":{"position":[[1373,11]]},"287":{"position":[[542,12]]},"300":{"position":[[528,10],[826,10]]},"305":{"position":[[416,10]]},"365":{"position":[[525,10],[696,11],[850,10]]},"408":{"position":[[1898,10],[3803,10],[4135,10]]},"412":{"position":[[7655,11]]},"424":{"position":[[119,12]]},"430":{"position":[[932,12],[986,10]]},"436":{"position":[[25,11]]},"437":{"position":[[252,11]]},"440":{"position":[[163,9]]},"451":{"position":[[356,7],[786,8]]},"454":{"position":[[801,10]]},"463":{"position":[[1261,12]]},"464":{"position":[[186,7],[669,7]]},"470":{"position":[[206,10]]},"504":{"position":[[302,11]]},"554":{"position":[[413,10],[695,10]]},"576":{"position":[[310,12]]},"581":{"position":[[119,10],[711,12]]},"617":{"position":[[486,10]]},"618":{"position":[[762,10]]},"621":{"position":[[91,10]]},"622":{"position":[[51,10]]},"659":{"position":[[66,10]]},"660":{"position":[[288,11]]},"662":{"position":[[706,10]]},"723":{"position":[[1319,10],[1381,9]]},"772":{"position":[[67,9]]},"773":{"position":[[252,9]]},"774":{"position":[[74,11],[283,10],[419,11],[904,11],[1098,11]]},"872":{"position":[[1495,10]]},"898":{"position":[[2059,10]]},"958":{"position":[[386,9]]},"985":{"position":[[108,9]]},"1090":{"position":[[148,10],[237,11],[366,10],[1115,11],[1222,10]]},"1092":{"position":[[189,9]]},"1114":{"position":[[87,9]]},"1120":{"position":[[112,8],[249,7]]},"1157":{"position":[[533,7]]},"1161":{"position":[[285,10]]},"1162":{"position":[[200,9]]},"1163":{"position":[[214,11],[337,10]]},"1164":{"position":[[908,9],[1060,11]]},"1168":{"position":[[4,11]]},"1172":{"position":[[136,7],[443,11]]},"1173":{"position":[[59,10]]},"1174":{"position":[[164,8]]},"1175":{"position":[[93,8],[147,11],[206,9],[274,7],[390,11],[542,11],[577,9]]},"1180":{"position":[[285,10]]},"1181":{"position":[[266,9]]},"1182":{"position":[[214,11],[337,10]]},"1184":{"position":[[297,10]]},"1185":{"position":[[136,7],[226,10]]},"1192":{"position":[[44,11],[250,10],[660,10],[698,10]]},"1208":{"position":[[1766,7]]},"1239":{"position":[[181,11]]},"1246":{"position":[[1458,12]]},"1276":{"position":[[120,11]]},"1292":{"position":[[485,11],[594,8]]},"1299":{"position":[[316,9]]},"1300":{"position":[[72,10],[151,9],[315,10],[455,10],[511,10],[588,8],[707,7],[882,7]]},"1324":{"position":[[445,10]]}},"keywords":{}}],["persistence.l",{"_index":1340,"title":{},"content":{"208":{"position":[[239,16]]}},"keywords":{}}],["persistence.memori",{"_index":3235,"title":{},"content":{"504":{"position":[[334,18]]}},"keywords":{}}],["persistence.sqlit",{"_index":1674,"title":{},"content":{"287":{"position":[[1062,18]]}},"keywords":{}}],["persistenceth",{"_index":3988,"title":{},"content":{"710":{"position":[[592,14]]}},"keywords":{}}],["persistenceus",{"_index":4793,"title":{},"content":{"838":{"position":[[1296,14]]}},"keywords":{}}],["persistet",{"_index":2108,"title":{},"content":{"365":{"position":[[320,9]]}},"keywords":{}}],["person",{"_index":1402,"title":{},"content":{"218":{"position":[[147,8]]},"291":{"position":[[386,8]]},"356":{"position":[[710,12]]},"450":{"position":[[142,16]]},"482":{"position":[[47,9]]},"550":{"position":[[217,8]]},"564":{"position":[[1111,8]]},"638":{"position":[[79,9]]},"1022":{"position":[[952,6]]}},"keywords":{}}],["phase",{"_index":2915,"title":{},"content":{"435":{"position":[[145,6]]}},"keywords":{}}],["philosophi",{"_index":2076,"title":{},"content":{"359":{"position":[[187,11]]},"502":{"position":[[268,10]]},"514":{"position":[[279,10]]}},"keywords":{}}],["phone",{"_index":2331,"title":{},"content":{"395":{"position":[[355,5]]},"408":{"position":[[4956,6]]},"412":{"position":[[6899,5],[9385,6],[10692,5]]},"415":{"position":[[177,7]]},"417":{"position":[[163,5]]}},"keywords":{}}],["phonegap",{"_index":141,"title":{},"content":{"10":{"position":[[419,8]]}},"keywords":{}}],["phonet",{"_index":4044,"title":{},"content":{"723":{"position":[[2386,8]]}},"keywords":{}}],["phrase",{"_index":2797,"title":{},"content":{"419":{"position":[[73,6]]},"723":{"position":[[2344,8]]}},"keywords":{}}],["physic",{"_index":2146,"title":{},"content":{"377":{"position":[[93,8]]},"408":{"position":[[2398,8],[2624,8]]},"419":{"position":[[1800,8]]},"550":{"position":[[64,8]]},"780":{"position":[[366,8]]},"986":{"position":[[1056,10]]},"1091":{"position":[[41,8]]},"1093":{"position":[[69,8],[297,10]]},"1295":{"position":[[346,8]]}},"keywords":{}}],["pick",{"_index":1571,"title":{},"content":{"254":{"position":[[408,4]]},"369":{"position":[[1531,4]]},"396":{"position":[[953,4]]},"402":{"position":[[850,6],[967,6]]},"412":{"position":[[3352,4]]},"481":{"position":[[405,4]]},"640":{"position":[[47,4]]},"698":{"position":[[752,4]]},"776":{"position":[[202,4]]},"796":{"position":[[61,4]]},"797":{"position":[[68,7]]},"1066":{"position":[[208,4]]},"1172":{"position":[[503,4]]}},"keywords":{}}],["piec",{"_index":1649,"title":{},"content":{"279":{"position":[[257,6]]},"391":{"position":[[332,5]]},"450":{"position":[[72,6]]},"784":{"position":[[672,5]]},"971":{"position":[[54,5]]},"1319":{"position":[[230,5]]}},"keywords":{}}],["pii",{"_index":3712,"title":{},"content":{"638":{"position":[[75,3]]}},"keywords":{}}],["pillar",{"_index":3288,"title":{},"content":{"530":{"position":[[462,7]]}},"keywords":{}}],["pin",{"_index":3378,"title":{},"content":{"556":{"position":[[1817,8],[1839,7],[1901,7],[1944,6]]}},"keywords":{}}],["pin"",{"_index":2818,"title":{},"content":{"419":{"position":[[1734,9]]}},"keywords":{}}],["ping",{"_index":3577,"title":{},"content":{"611":{"position":[[1181,4]]}},"keywords":{}}],["pinia",{"_index":3487,"title":{},"content":{"576":{"position":[[170,5]]},"590":{"position":[[306,5]]}},"keywords":{}}],["piotr",{"_index":6517,"title":{},"content":{"1311":{"position":[[1544,8]]}},"keywords":{}}],["pipe",{"_index":811,"title":{"54":{"position":[[32,6]]},"130":{"position":[[22,4]]},"143":{"position":[[10,4]]}},"content":{"130":{"position":[[28,5],[187,4]]},"143":{"position":[[17,4],[99,5],[391,5],[674,8]]},"391":{"position":[[612,4]]},"493":{"position":[[19,4]]},"1067":{"position":[[2168,10]]}},"keywords":{}}],["pipe(text",{"_index":2223,"title":{},"content":{"391":{"position":[[659,10]]}},"keywords":{}}],["pipelin",{"_index":2216,"title":{"1030":{"position":[[0,8]]},"1031":{"position":[[0,8]]},"1033":{"position":[[0,9]]}},"content":{"391":{"position":[[433,8]]},"392":{"position":[[2378,8],[2500,8],[2618,8],[2692,10],[4524,8],[4598,10]]},"397":{"position":[[1743,8]]},"1020":{"position":[[1,9],[152,8],[179,9],[339,8],[405,10]]},"1022":{"position":[[435,8]]},"1023":{"position":[[21,8],[94,8]]},"1024":{"position":[[94,8],[188,8]]},"1026":{"position":[[33,8],[128,8]]},"1027":{"position":[[38,8],[156,8]]},"1028":{"position":[[41,8],[103,8]]},"1030":{"position":[[97,8]]},"1031":{"position":[[1,8],[222,8]]},"1033":{"position":[[9,8],[186,9],[277,10],[386,8],[433,8],[682,8],[961,8]]}},"keywords":{}}],["pipeline('featur",{"_index":2219,"title":{},"content":{"391":{"position":[[503,17]]}},"keywords":{}}],["pipeline.awaitidl",{"_index":2417,"title":{},"content":{"398":{"position":[[1998,21]]}},"keywords":{}}],["pipeline.html",{"_index":4058,"title":{},"content":{"724":{"position":[[1133,13]]}},"keywords":{}}],["pipelinea",{"_index":5659,"title":{},"content":{"1033":{"position":[[481,9]]}},"keywords":{}}],["pipelinea.awaitidl",{"_index":5665,"title":{},"content":{"1033":{"position":[[838,22]]}},"keywords":{}}],["pipelines.pref",{"_index":5668,"title":{},"content":{"1033":{"position":[[1014,16]]}},"keywords":{}}],["pipepromis",{"_index":2218,"title":{},"content":{"391":{"position":[[489,11],[625,12]]}},"keywords":{}}],["pitfal",{"_index":1404,"title":{},"content":{"223":{"position":[[371,8]]}},"keywords":{}}],["pivot",{"_index":1163,"title":{},"content":{"152":{"position":[[163,7]]},"510":{"position":[[142,7]]},"530":{"position":[[77,7]]},"912":{"position":[[91,7]]}},"keywords":{}}],["pl1",{"_index":4149,"title":{},"content":{"749":{"position":[[1311,3]]}},"keywords":{}}],["pl3",{"_index":4150,"title":{},"content":{"749":{"position":[[1399,3]]}},"keywords":{}}],["place",{"_index":1970,"title":{},"content":{"346":{"position":[[64,6]]},"397":{"position":[[74,5]]},"411":{"position":[[2145,5]]},"433":{"position":[[187,5]]},"698":{"position":[[2266,6]]},"701":{"position":[[650,6]]},"761":{"position":[[29,5]]},"785":{"position":[[501,5]]},"875":{"position":[[6019,6]]},"1105":{"position":[[900,6]]}},"keywords":{}}],["placeholder="ent",{"_index":3399,"title":{},"content":{"559":{"position":[[674,23]]}},"keywords":{}}],["plain",{"_index":510,"title":{"47":{"position":[[10,5]]},"358":{"position":[[26,5]]},"535":{"position":[[15,5]]},"595":{"position":[[15,5]]}},"content":{"33":{"position":[[85,5]]},"51":{"position":[[153,5]]},"408":{"position":[[4018,5]]},"439":{"position":[[618,5]]},"453":{"position":[[701,5]]},"459":{"position":[[61,5]]},"535":{"position":[[915,5]]},"538":{"position":[[89,5]]},"595":{"position":[[990,5]]},"598":{"position":[[89,5]]},"619":{"position":[[359,5]]},"670":{"position":[[305,5]]},"688":{"position":[[467,5],[764,5]]},"710":{"position":[[1237,5]]},"749":{"position":[[4175,5],[11974,5]]},"766":{"position":[[20,5]]},"772":{"position":[[1973,5]]},"888":{"position":[[230,5]]},"908":{"position":[[239,5]]},"918":{"position":[[39,5]]},"968":{"position":[[356,5]]},"1020":{"position":[[237,5]]},"1051":{"position":[[32,5]]},"1085":{"position":[[54,5]]},"1102":{"position":[[104,5],[427,5]]},"1124":{"position":[[30,5],[701,5]]},"1132":{"position":[[81,5],[815,5]]},"1140":{"position":[[403,5]]},"1162":{"position":[[453,5]]},"1174":{"position":[[14,5]]},"1175":{"position":[[12,5]]},"1181":{"position":[[540,5]]},"1208":{"position":[[298,5]]},"1209":{"position":[[220,5]]},"1241":{"position":[[38,5]]},"1243":{"position":[[37,5]]},"1246":{"position":[[1859,5]]},"1252":{"position":[[69,5]]}},"keywords":{}}],["plaindata.ag",{"_index":4531,"title":{},"content":{"767":{"position":[[401,13]]}},"keywords":{}}],["plaindata.anyfield",{"_index":4544,"title":{},"content":{"768":{"position":[[370,18]]}},"keywords":{}}],["plainrespons",{"_index":5155,"title":{},"content":{"888":{"position":[[585,14],[687,13],[1034,14]]},"889":{"position":[[614,15]]}},"keywords":{}}],["plainresponse.conflict",{"_index":5165,"title":{},"content":{"889":{"position":[[726,24]]}},"keywords":{}}],["plan",{"_index":433,"title":{},"content":{"26":{"position":[[372,4]]},"298":{"position":[[897,4]]},"303":{"position":[[13,4]]},"314":{"position":[[589,4]]},"412":{"position":[[14330,4]]},"420":{"position":[[1397,8]]},"700":{"position":[[388,4]]},"839":{"position":[[1248,4],[1405,6]]},"1071":{"position":[[381,4]]}},"keywords":{}}],["planer",{"_index":4655,"title":{},"content":{"798":{"position":[[850,6]]},"1066":{"position":[[656,6]]},"1071":{"position":[[371,6]]}},"keywords":{}}],["planner",{"_index":4636,"title":{"796":{"position":[[15,7]]}},"content":{"797":{"position":[[20,7]]},"1066":{"position":[[68,7],[154,7]]}},"keywords":{}}],["platform",{"_index":195,"title":{"72":{"position":[[35,10]]},"112":{"position":[[35,10]]},"254":{"position":[[9,9]]},"384":{"position":[[6,8]]}},"content":{"14":{"position":[[17,8]]},"36":{"position":[[395,9]]},"37":{"position":[[20,8]]},"43":{"position":[[706,9]]},"47":{"position":[[1348,10]]},"72":{"position":[[83,10]]},"112":{"position":[[76,10],[280,10]]},"174":{"position":[[2585,8],[2682,10],[2787,8]]},"177":{"position":[[162,9]]},"207":{"position":[[325,8]]},"239":{"position":[[81,10]]},"269":{"position":[[145,8],[271,9]]},"288":{"position":[[187,10]]},"299":{"position":[[64,10]]},"364":{"position":[[286,10]]},"375":{"position":[[463,10]]},"384":{"position":[[33,8],[427,9]]},"388":{"position":[[473,9]]},"418":{"position":[[413,9]]},"441":{"position":[[475,8]]},"445":{"position":[[2138,8],[2195,8],[2366,10],[2527,10]]},"446":{"position":[[521,9],[1003,9],[1091,8],[1227,8]]},"447":{"position":[[446,8]]},"500":{"position":[[292,10]]},"535":{"position":[[1174,8]]},"581":{"position":[[728,8]]},"595":{"position":[[1251,8]]},"611":{"position":[[339,10]]},"613":{"position":[[497,10],[863,9]]},"644":{"position":[[116,9]]},"830":{"position":[[159,8]]},"832":{"position":[[390,8]]}},"keywords":{}}],["platforms.onlin",{"_index":2787,"title":{},"content":{"416":{"position":[[310,16]]}},"keywords":{}}],["play",{"_index":1062,"title":{},"content":{"117":{"position":[[11,4]]},"152":{"position":[[156,4]]},"178":{"position":[[11,4]]},"447":{"position":[[18,4]]},"534":{"position":[[49,4]]},"594":{"position":[[47,4]]},"824":{"position":[[180,4]]},"890":{"position":[[957,4]]}},"keywords":{}}],["player",{"_index":3243,"title":{},"content":{"510":{"position":[[150,7]]},"1006":{"position":[[242,7]]},"1007":{"position":[[336,6],[372,6],[787,6],[869,6]]},"1008":{"position":[[168,6]]}},"keywords":{}}],["player'",{"_index":5563,"title":{},"content":{"1007":{"position":[[1007,8],[1971,8]]}},"keywords":{}}],["pleas",{"_index":3742,"title":{},"content":{"650":{"position":[[95,6]]},"749":{"position":[[12799,6],[24120,6]]},"824":{"position":[[317,6],[526,6]]},"889":{"position":[[1073,6]]},"1278":{"position":[[114,6]]}},"keywords":{}}],["plethora",{"_index":3217,"title":{},"content":{"500":{"position":[[373,8]]}},"keywords":{}}],["plu",{"_index":1884,"title":{},"content":{"312":{"position":[[234,5]]}},"keywords":{}}],["pluggabl",{"_index":312,"title":{},"content":{"18":{"position":[[325,9]]},"383":{"position":[[41,9]]}},"keywords":{}}],["plugin",{"_index":45,"title":{"165":{"position":[[17,8]]},"192":{"position":[[17,8]]},"291":{"position":[[26,7]]},"383":{"position":[[5,6]]},"553":{"position":[[29,8]]},"645":{"position":[[10,6]]},"655":{"position":[[18,6]]},"677":{"position":[[10,6]]},"692":{"position":[[9,6]]},"717":{"position":[[26,8]]},"738":{"position":[[24,7]]},"744":{"position":[[12,6]]},"745":{"position":[[17,7]]},"802":{"position":[[9,7]]},"803":{"position":[[9,7]]},"863":{"position":[[40,7]]},"868":{"position":[[9,6]]},"869":{"position":[[20,6]]},"895":{"position":[[21,6]]},"896":{"position":[[34,7]]},"904":{"position":[[39,7]]},"915":{"position":[[20,7]]},"1012":{"position":[[24,7]]},"1013":{"position":[[13,6]]},"1064":{"position":[[14,7]]},"1152":{"position":[[44,8]]},"1222":{"position":[[19,7]]},"1246":{"position":[[16,8]]},"1284":{"position":[[12,7]]}},"content":{"2":{"position":[[265,6]]},"6":{"position":[[424,6]]},"10":{"position":[[198,6]]},"11":{"position":[[255,7]]},"14":{"position":[[1237,7]]},"17":{"position":[[347,6]]},"147":{"position":[[176,7]]},"158":{"position":[[102,7],[170,7]]},"164":{"position":[[305,7]]},"165":{"position":[[38,7],[129,7],[318,8]]},"170":{"position":[[243,8]]},"184":{"position":[[219,8]]},"192":{"position":[[27,7],[131,7],[310,7]]},"211":{"position":[[566,7]]},"249":{"position":[[445,7]]},"255":{"position":[[1676,6]]},"260":{"position":[[19,6]]},"291":{"position":[[37,7]]},"310":{"position":[[100,7]]},"314":{"position":[[228,8]]},"315":{"position":[[52,6],[100,7],[153,7]]},"360":{"position":[[467,7]]},"361":{"position":[[339,6]]},"366":{"position":[[87,7]]},"367":{"position":[[433,8],[487,8]]},"368":{"position":[[91,8]]},"377":{"position":[[329,8]]},"381":{"position":[[267,8]]},"387":{"position":[[303,8]]},"390":{"position":[[1841,7]]},"392":{"position":[[2387,7]]},"402":{"position":[[2653,8],[2694,7],[2798,6]]},"403":{"position":[[217,6]]},"420":{"position":[[999,7],[1084,8]]},"460":{"position":[[378,7]]},"469":{"position":[[899,6]]},"481":{"position":[[228,7],[414,6]]},"482":{"position":[[80,7]]},"525":{"position":[[427,7],[507,7],[679,6]]},"551":{"position":[[198,7]]},"553":{"position":[[70,7]]},"554":{"position":[[28,8],[47,7],[127,7],[145,6],[296,7],[893,6]]},"556":{"position":[[1126,7],[1409,6],[1749,7]]},"557":{"position":[[320,8],[406,8]]},"563":{"position":[[171,6]]},"564":{"position":[[177,7]]},"565":{"position":[[88,7]]},"566":{"position":[[1029,7],[1337,7]]},"567":{"position":[[627,7]]},"570":{"position":[[940,8]]},"579":{"position":[[87,7],[906,6]]},"582":{"position":[[302,8]]},"590":{"position":[[165,7]]},"602":{"position":[[115,7]]},"614":{"position":[[275,8]]},"632":{"position":[[596,7],[745,7]]},"640":{"position":[[318,7]]},"641":{"position":[[371,7]]},"642":{"position":[[105,7]]},"644":{"position":[[91,7]]},"655":{"position":[[351,6]]},"662":{"position":[[435,7],[1037,7]]},"674":{"position":[[82,8]]},"676":{"position":[[57,6]]},"678":{"position":[[142,7]]},"680":{"position":[[63,6],[262,6],[335,6],[429,6]]},"683":{"position":[[33,7]]},"686":{"position":[[708,7],[802,6]]},"688":{"position":[[16,6]]},"693":{"position":[[154,6],[288,6]]},"710":{"position":[[867,7],[1391,8]]},"716":{"position":[[16,6],[496,6]]},"717":{"position":[[24,7],[79,6],[181,6],[457,6],[763,6],[1036,6]]},"718":{"position":[[53,6],[336,6]]},"719":{"position":[[242,6]]},"723":{"position":[[36,6],[380,7],[1009,6],[2099,6],[2522,6]]},"734":{"position":[[21,6],[117,7]]},"738":{"position":[[68,7]]},"746":{"position":[[17,6]]},"747":{"position":[[17,6]]},"749":{"position":[[1021,6],[1321,6],[1340,7],[1405,6],[20938,6]]},"756":{"position":[[37,8]]},"793":{"position":[[963,7],[1225,7]]},"798":{"position":[[982,6]]},"801":{"position":[[925,6]]},"802":{"position":[[27,7],[142,6],[637,8]]},"804":{"position":[[37,6],[55,7]]},"806":{"position":[[549,7],[757,7]]},"824":{"position":[[597,7]]},"829":{"position":[[258,8]]},"830":{"position":[[254,6]]},"836":{"position":[[301,7]]},"837":{"position":[[1489,8]]},"838":{"position":[[895,6],[1367,7],[1525,7]]},"845":{"position":[[78,8]]},"847":{"position":[[123,8]]},"851":{"position":[[30,6]]},"860":{"position":[[1091,6]]},"861":{"position":[[2079,6]]},"866":{"position":[[152,6]]},"868":{"position":[[9,6]]},"871":{"position":[[5,6],[564,6]]},"875":{"position":[[92,6],[134,6]]},"878":{"position":[[24,6]]},"897":{"position":[[111,7]]},"898":{"position":[[1847,6],[1963,6]]},"904":{"position":[[21,7],[1297,7],[3163,8]]},"905":{"position":[[234,8]]},"906":{"position":[[62,7]]},"910":{"position":[[217,7]]},"912":{"position":[[79,6],[178,6],[232,8],[763,7]]},"915":{"position":[[60,7]]},"932":{"position":[[428,6]]},"934":{"position":[[555,7]]},"952":{"position":[[163,7]]},"958":{"position":[[673,7]]},"971":{"position":[[275,7]]},"989":{"position":[[370,6]]},"1004":{"position":[[97,7]]},"1012":{"position":[[68,7]]},"1013":{"position":[[44,6]]},"1021":{"position":[[69,8]]},"1023":{"position":[[30,6]]},"1041":{"position":[[139,7]]},"1047":{"position":[[223,7]]},"1059":{"position":[[117,7]]},"1064":{"position":[[66,7],[100,6]]},"1101":{"position":[[157,6]]},"1102":{"position":[[749,6]]},"1112":{"position":[[20,7],[99,7]]},"1114":{"position":[[589,6]]},"1119":{"position":[[319,6]]},"1124":{"position":[[384,7],[642,7],[2199,7]]},"1125":{"position":[[92,6]]},"1129":{"position":[[35,6]]},"1130":{"position":[[370,7]]},"1141":{"position":[[35,6]]},"1146":{"position":[[22,6],[46,7],[151,7],[324,7]]},"1148":{"position":[[729,7]]},"1149":{"position":[[116,7],[150,7],[209,7],[601,7],[655,7]]},"1150":{"position":[[654,7]]},"1151":{"position":[[251,8]]},"1156":{"position":[[274,7]]},"1162":{"position":[[875,6]]},"1174":{"position":[[334,7]]},"1176":{"position":[[28,6]]},"1178":{"position":[[250,8]]},"1183":{"position":[[290,6]]},"1198":{"position":[[1659,6],[1759,7],[2249,6]]},"1210":{"position":[[251,6]]},"1212":{"position":[[33,7],[254,7]]},"1219":{"position":[[20,6]]},"1227":{"position":[[315,7]]},"1233":{"position":[[16,6]]},"1246":{"position":[[1143,6],[1942,6],[2180,6]]},"1265":{"position":[[308,7]]},"1266":{"position":[[240,9]]},"1277":{"position":[[99,6]]},"1279":{"position":[[490,7]]},"1280":{"position":[[19,6],[123,6]]},"1284":{"position":[[12,7]]},"1288":{"position":[[121,6]]},"1292":{"position":[[548,6]]},"1295":{"position":[[1561,7]]}},"keywords":{}}],["plugin(",{"_index":3342,"title":{},"content":{"553":{"position":[[33,9]]}},"keywords":{}}],["plugin(mapreduc",{"_index":4786,"title":{},"content":{"837":{"position":[[1952,18]]}},"keywords":{}}],["plugin(repl",{"_index":4785,"title":{},"content":{"837":{"position":[[1931,20]]}},"keywords":{}}],["plugin(sqliteadapt",{"_index":4787,"title":{},"content":{"837":{"position":[[1971,23]]}},"keywords":{}}],["plugincustom",{"_index":1600,"title":{},"content":{"263":{"position":[[608,12]]}},"keywords":{}}],["pluginin",{"_index":6239,"title":{},"content":{"1214":{"position":[[598,8]]}},"keywords":{}}],["plugins.ful",{"_index":2163,"title":{},"content":{"383":{"position":[[174,12]]}},"keywords":{}}],["plugins.indexeddb",{"_index":1104,"title":{},"content":{"131":{"position":[[182,17]]}},"keywords":{}}],["plugin—consid",{"_index":3150,"title":{},"content":{"483":{"position":[[1100,15]]}},"keywords":{}}],["point",{"_index":476,"title":{},"content":{"29":{"position":[[122,6]]},"260":{"position":[[307,5]]},"334":{"position":[[731,7]]},"335":{"position":[[502,7],[789,7]]},"369":{"position":[[298,6]]},"412":{"position":[[318,5]]},"461":{"position":[[439,5]]},"678":{"position":[[271,6],[298,7]]},"679":{"position":[[181,5]]},"680":{"position":[[911,7],[1059,10],[1267,7],[1324,8],[1389,7]]},"681":{"position":[[267,6],[351,6],[810,7]]},"683":{"position":[[204,7],[325,7],[919,7],[994,6],[1015,7]]},"700":{"position":[[507,5]]},"705":{"position":[[827,5]]},"872":{"position":[[643,6]]},"990":{"position":[[96,5]]},"1207":{"position":[[695,6]]},"1210":{"position":[[105,5]]},"1300":{"position":[[301,5],[491,5],[537,5]]},"1321":{"position":[[1008,5]]},"1324":{"position":[[339,5]]}},"keywords":{}}],["polici",{"_index":1704,"title":{"815":{"position":[[18,7]]},"816":{"position":[[12,7]]},"818":{"position":[[15,7]]}},"content":{"298":{"position":[[124,9],[330,8],[817,6]]},"299":{"position":[[825,9]]},"305":{"position":[[149,8]]},"412":{"position":[[7996,8]]},"522":{"position":[[753,6]]},"617":{"position":[[914,6]]},"653":{"position":[[32,6]]},"815":{"position":[[61,6],[246,6]]},"816":{"position":[[13,6]]},"818":{"position":[[21,6],[321,7],[387,6]]},"890":{"position":[[435,6]]},"897":{"position":[[518,9]]},"934":{"position":[[727,6]]},"960":{"position":[[648,6]]},"1287":{"position":[[153,9]]}},"keywords":{}}],["poll",{"_index":1176,"title":{"609":{"position":[[41,7]]},"610":{"position":[[13,9]]}},"content":{"159":{"position":[[287,7]]},"255":{"position":[[291,8]]},"323":{"position":[[494,7]]},"346":{"position":[[198,7]]},"379":{"position":[[173,7]]},"410":{"position":[[1723,7]]},"490":{"position":[[292,4]]},"491":{"position":[[588,8],[1643,8]]},"570":{"position":[[627,7],[725,8]]},"610":{"position":[[6,7],[223,8],[317,7],[873,7],[1111,7],[1300,7],[1397,7],[1424,7]]},"611":{"position":[[1406,7]]},"616":{"position":[[198,7],[296,7],[514,7]]},"619":{"position":[[341,7]]},"620":{"position":[[73,7]]},"621":{"position":[[361,8]]},"622":{"position":[[406,8]]},"623":{"position":[[452,8]]},"624":{"position":[[1343,8]]},"632":{"position":[[387,7]]},"846":{"position":[[923,7]]},"849":{"position":[[64,7]]},"875":{"position":[[7194,8]]},"988":{"position":[[5031,7]]},"1124":{"position":[[918,7]]},"1150":{"position":[[672,8]]}},"keywords":{}}],["polyfil",{"_index":112,"title":{"728":{"position":[[0,10]]},"729":{"position":[[0,8]]},"911":{"position":[[0,8]]},"1202":{"position":[[0,8]]}},"content":{"8":{"position":[[403,9]]},"261":{"position":[[648,8]]},"616":{"position":[[994,8]]},"728":{"position":[[78,9],[149,9],[208,10]]},"749":{"position":[[15342,11]]},"910":{"position":[[129,8],[197,8],[358,8]]},"911":{"position":[[207,8],[258,9]]},"917":{"position":[[479,8]]},"1139":{"position":[[123,8]]},"1145":{"position":[[119,8]]},"1301":{"position":[[1055,11]]}},"keywords":{}}],["pong",{"_index":3578,"title":{},"content":{"611":{"position":[[1190,4]]}},"keywords":{}}],["pool",{"_index":1746,"title":{},"content":{"299":{"position":[[341,4]]},"391":{"position":[[672,8]]},"617":{"position":[[298,4]]},"904":{"position":[[2267,6],[3450,5]]},"905":{"position":[[150,5]]},"1121":{"position":[[682,6]]}},"keywords":{}}],["poor",{"_index":2644,"title":{},"content":{"411":{"position":[[5603,4]]}},"keywords":{}}],["poorli",{"_index":1715,"title":{},"content":{"298":{"position":[[376,6]]}},"keywords":{}}],["popul",{"_index":2376,"title":{"807":{"position":[[0,10]]},"809":{"position":[[0,11]]}},"content":{"397":{"position":[[1325,8]]},"749":{"position":[[9965,8],[10079,8]]},"793":{"position":[[1144,10]]},"810":{"position":[[49,10]]},"811":{"position":[[22,9]]},"1084":{"position":[[136,8]]}},"keywords":{}}],["popular",{"_index":548,"title":{},"content":{"35":{"position":[[18,7]]},"94":{"position":[[62,7]]},"155":{"position":[[159,7]]},"173":{"position":[[2263,7]]},"189":{"position":[[309,7]]},"222":{"position":[[79,7]]},"232":{"position":[[36,7]]},"281":{"position":[[15,7]]},"284":{"position":[[158,7]]},"336":{"position":[[66,7]]},"407":{"position":[[366,7]]},"419":{"position":[[130,11]]},"420":{"position":[[283,7]]},"445":{"position":[[122,7],[1727,7]]},"446":{"position":[[1180,10]]},"836":{"position":[[1118,8]]},"839":{"position":[[59,7]]},"1247":{"position":[[386,7]]}},"keywords":{}}],["port",{"_index":3593,"title":{},"content":{"612":{"position":[[1808,4]]},"708":{"position":[[320,4],[469,5]]},"872":{"position":[[3324,5]]},"875":{"position":[[1254,4]]},"890":{"position":[[578,5]]},"892":{"position":[[307,5]]},"906":{"position":[[1027,5],[1047,4]]},"1090":{"position":[[1061,5]]},"1097":{"position":[[779,5]]},"1098":{"position":[[415,5]]},"1099":{"position":[[385,5]]},"1103":{"position":[[268,5]]},"1219":{"position":[[554,5],[717,5]]},"1220":{"position":[[233,5]]}},"keywords":{}}],["portabl",{"_index":913,"title":{"97":{"position":[[8,8]]}},"content":{"65":{"position":[[511,8]]},"97":{"position":[[48,8]]},"173":{"position":[[2710,8],[2785,12]]}},"keywords":{}}],["pose",{"_index":1405,"title":{},"content":{"225":{"position":[[58,4]]},"432":{"position":[[657,4]]},"618":{"position":[[170,5]]}},"keywords":{}}],["posit",{"_index":929,"title":{},"content":{"65":{"position":[[1503,8]]},"464":{"position":[[1291,8]]}},"keywords":{}}],["possibl",{"_index":329,"title":{"404":{"position":[[0,8]]},"469":{"position":[[0,8]]}},"content":{"19":{"position":[[395,8]]},"168":{"position":[[276,13]]},"284":{"position":[[67,13]]},"305":{"position":[[450,11]]},"315":{"position":[[1048,8]]},"351":{"position":[[399,9]]},"354":{"position":[[1554,8]]},"357":{"position":[[395,9]]},"375":{"position":[[821,9]]},"408":{"position":[[1404,13],[2252,8]]},"409":{"position":[[271,9]]},"410":{"position":[[762,8]]},"412":{"position":[[3989,8],[9230,8],[9846,8],[13847,9]]},"420":{"position":[[821,8]]},"421":{"position":[[458,8]]},"432":{"position":[[489,9]]},"451":{"position":[[449,8]]},"455":{"position":[[661,8],[700,8],[853,8]]},"468":{"position":[[196,9]]},"469":{"position":[[26,8]]},"478":{"position":[[50,8]]},"490":{"position":[[619,8]]},"496":{"position":[[39,8]]},"569":{"position":[[1231,8]]},"581":{"position":[[501,9]]},"616":{"position":[[179,8]]},"650":{"position":[[21,8]]},"661":{"position":[[1515,8]]},"679":{"position":[[24,8]]},"705":{"position":[[1396,8]]},"708":{"position":[[80,8]]},"711":{"position":[[277,8],[1974,8]]},"719":{"position":[[53,8]]},"749":{"position":[[23043,8]]},"797":{"position":[[98,8]]},"817":{"position":[[28,8]]},"831":{"position":[[263,8]]},"837":{"position":[[464,8]]},"840":{"position":[[530,8]]},"854":{"position":[[1169,8]]},"863":{"position":[[809,8]]},"886":{"position":[[4948,8]]},"889":{"position":[[11,8]]},"905":{"position":[[98,8]]},"1005":{"position":[[37,8]]},"1067":{"position":[[767,8]]},"1092":{"position":[[618,8]]},"1132":{"position":[[797,8]]},"1135":{"position":[[63,8]]},"1143":{"position":[[491,8]]},"1154":{"position":[[578,8]]},"1173":{"position":[[188,8]]},"1183":{"position":[[51,8]]},"1191":{"position":[[216,13],[293,8]]},"1193":{"position":[[120,8]]},"1198":{"position":[[975,8],[1598,8]]},"1208":{"position":[[266,8]]},"1222":{"position":[[336,8],[847,8]]},"1237":{"position":[[88,9]]},"1300":{"position":[[337,9]]},"1304":{"position":[[1431,9]]},"1314":{"position":[[343,8]]}},"keywords":{}}],["possibleso",{"_index":6171,"title":{},"content":{"1198":{"position":[[597,10]]}},"keywords":{}}],["post",{"_index":335,"title":{},"content":{"19":{"position":[[645,5],[817,5]]},"209":{"position":[[752,4],[855,7]]},"255":{"position":[[1201,7]]},"616":{"position":[[680,4],[1200,4]]},"632":{"position":[[2544,4]]},"759":{"position":[[1179,8],[1245,9],[1275,5]]},"875":{"position":[[6281,7]]},"988":{"position":[[2576,7]]},"1007":{"position":[[619,4]]},"1102":{"position":[[549,7],[1120,7],[1237,7],[1295,7],[1343,7]]}},"keywords":{}}],["postcreat",{"_index":4239,"title":{"770":{"position":[[0,11]]}},"content":{"749":{"position":[[7760,11]]},"770":{"position":[[71,10],[267,10],[618,10]]}},"keywords":{}}],["postgr",{"_index":653,"title":{},"content":{"41":{"position":[[205,8]]},"897":{"position":[[384,8]]}},"keywords":{}}],["postgresql",{"_index":372,"title":{"356":{"position":[[16,10]]}},"content":{"22":{"position":[[207,10]]},"43":{"position":[[167,11]]},"202":{"position":[[222,10]]},"249":{"position":[[171,11]]},"356":{"position":[[75,10],[134,10]]},"412":{"position":[[1648,11]]},"661":{"position":[[191,10]]},"704":{"position":[[12,10]]},"705":{"position":[[1363,11]]},"708":{"position":[[145,10]]},"711":{"position":[[225,10]]},"836":{"position":[[193,10]]},"981":{"position":[[733,11]]},"1320":{"position":[[336,10]]},"1324":{"position":[[670,10]]}},"keywords":{}}],["postgresql’",{"_index":2091,"title":{},"content":{"362":{"position":[[344,12]]}},"keywords":{}}],["postgrest",{"_index":5187,"title":{},"content":{"897":{"position":[[141,9]]},"898":{"position":[[3728,9]]}},"keywords":{}}],["postinsert",{"_index":4534,"title":{},"content":{"767":{"position":[[724,11]]},"1311":{"position":[[1097,10]]}},"keywords":{}}],["postmessag",{"_index":1852,"title":{},"content":{"303":{"position":[[1250,13]]},"392":{"position":[[3632,13]]},"460":{"position":[[677,14]]},"470":{"position":[[500,13]]}},"keywords":{}}],["postremov",{"_index":4555,"title":{},"content":{"769":{"position":[[695,11]]}},"keywords":{}}],["postsav",{"_index":4546,"title":{},"content":{"768":{"position":[[734,9]]}},"keywords":{}}],["poststatus.publish",{"_index":340,"title":{},"content":{"19":{"position":[[754,21]]}},"keywords":{}}],["potenti",{"_index":866,"title":{"402":{"position":[[0,9]]}},"content":{"58":{"position":[[81,11]]},"66":{"position":[[585,11]]},"83":{"position":[[447,9]]},"204":{"position":[[103,11]]},"222":{"position":[[312,9]]},"223":{"position":[[361,9]]},"241":{"position":[[421,9]]},"336":{"position":[[436,12]]},"345":{"position":[[116,11]]},"404":{"position":[[215,9],[829,9]]},"411":{"position":[[4844,9]]},"415":{"position":[[339,11]]},"427":{"position":[[284,11],[812,11]]},"447":{"position":[[683,9]]},"501":{"position":[[293,9]]},"588":{"position":[[101,11]]},"622":{"position":[[321,11]]},"623":{"position":[[105,11],[723,11]]},"624":{"position":[[877,10]]},"640":{"position":[[229,11]]},"696":{"position":[[1204,11]]},"802":{"position":[[191,9]]},"904":{"position":[[3395,9]]}},"keywords":{}}],["potter",{"_index":6518,"title":{},"content":{"1311":{"position":[[1563,9]]}},"keywords":{}}],["pouch",{"_index":170,"title":{},"content":{"11":{"position":[[905,5]]},"1065":{"position":[[82,5]]},"1204":{"position":[[299,5]]}},"keywords":{}}],["pouchdb",{"_index":0,"title":{"0":{"position":[[0,7]]},"24":{"position":[[0,8]]},"837":{"position":[[0,8]]},"1197":{"position":[[10,7]]},"1198":{"position":[[11,7]]},"1204":{"position":[[19,7]]}},"content":{"1":{"position":[[432,7]]},"2":{"position":[[143,7]]},"3":{"position":[[121,7]]},"4":{"position":[[287,7]]},"5":{"position":[[203,7]]},"6":{"position":[[302,7]]},"7":{"position":[[225,7]]},"8":{"position":[[165,7],[241,7],[916,8]]},"9":{"position":[[137,7]]},"10":{"position":[[66,7]]},"11":{"position":[[104,7]]},"24":{"position":[[3,7],[373,7],[547,7],[677,7]]},"25":{"position":[[264,7]]},"26":{"position":[[253,7]]},"27":{"position":[[247,7]]},"408":{"position":[[4577,8]]},"411":{"position":[[3210,8]]},"419":{"position":[[122,7]]},"420":{"position":[[52,7]]},"837":{"position":[[3,7],[122,7],[216,7],[570,7],[685,7],[838,7],[938,7],[1056,7],[1106,7],[1333,7],[1455,7],[1547,7],[1560,8],[1598,8],[1646,8],[1691,8],[1745,8],[2030,7]]},"841":{"position":[[36,7]]},"851":{"position":[[16,8]]},"1198":{"position":[[177,8],[216,7],[363,7],[473,7],[704,7],[793,7],[1344,8],[1530,7],[1612,8],[1830,7],[1856,7],[2053,7],[2214,7],[2280,7],[2316,7]]},"1201":{"position":[[268,7]]},"1202":{"position":[[212,7]]},"1203":{"position":[[1,7]]},"1204":{"position":[[52,7]]}},"keywords":{}}],["pouchdb('mydb.db",{"_index":4788,"title":{},"content":{"837":{"position":[[2109,18]]}},"keywords":{}}],["pouchdb.easi",{"_index":4818,"title":{},"content":{"844":{"position":[[63,14]]}},"keywords":{}}],["pouchdb.plugin(httppouch",{"_index":4784,"title":{},"content":{"837":{"position":[[1905,25]]}},"keywords":{}}],["pouchdb.pouchdb",{"_index":3967,"title":{},"content":{"703":{"position":[[350,15]]}},"keywords":{}}],["pouchdbgoogl",{"_index":3130,"title":{},"content":{"481":{"position":[[305,13]]}},"keywords":{}}],["power",{"_index":462,"title":{"205":{"position":[[3,8]]},"310":{"position":[[3,8]]},"479":{"position":[[21,8]]},"532":{"position":[[39,5]]},"592":{"position":[[37,5]]}},"content":{"28":{"position":[[485,5]]},"34":{"position":[[39,7]]},"40":{"position":[[210,8]]},"51":{"position":[[469,6]]},"52":{"position":[[127,6],[223,6],[266,6],[564,6]]},"61":{"position":[[324,8]]},"67":{"position":[[34,8]]},"83":{"position":[[26,8]]},"87":{"position":[[55,5]]},"94":{"position":[[190,5]]},"103":{"position":[[35,7]]},"114":{"position":[[481,5]]},"116":{"position":[[14,8]]},"118":{"position":[[149,5]]},"124":{"position":[[15,8]]},"143":{"position":[[27,8]]},"148":{"position":[[11,8]]},"152":{"position":[[214,6]]},"153":{"position":[[193,5]]},"159":{"position":[[62,8]]},"161":{"position":[[341,8]]},"166":{"position":[[319,7]]},"170":{"position":[[630,8]]},"174":{"position":[[209,5]]},"175":{"position":[[522,5]]},"179":{"position":[[11,8]]},"182":{"position":[[82,5]]},"198":{"position":[[15,8]]},"229":{"position":[[11,8]]},"233":{"position":[[52,7]]},"239":{"position":[[282,5]]},"241":{"position":[[619,8]]},"255":{"position":[[21,7]]},"267":{"position":[[1141,8]]},"271":{"position":[[20,8]]},"276":{"position":[[51,8]]},"286":{"position":[[412,8]]},"289":{"position":[[524,8],[793,7],[1182,7]]},"290":{"position":[[88,8]]},"318":{"position":[[158,8]]},"354":{"position":[[1540,9]]},"370":{"position":[[135,5]]},"376":{"position":[[671,7]]},"383":{"position":[[210,8]]},"399":{"position":[[327,5]]},"412":{"position":[[14729,5]]},"425":{"position":[[86,5]]},"432":{"position":[[974,5]]},"433":{"position":[[580,5]]},"445":{"position":[[841,5],[2034,5]]},"447":{"position":[[342,5],[649,5]]},"491":{"position":[[129,8]]},"498":{"position":[[476,8]]},"500":{"position":[[572,5]]},"513":{"position":[[9,8]]},"530":{"position":[[327,8]]},"535":{"position":[[27,9]]},"536":{"position":[[104,8]]},"538":{"position":[[770,6]]},"539":{"position":[[127,6],[223,6],[266,6],[564,6]]},"545":{"position":[[20,9]]},"548":{"position":[[395,8]]},"557":{"position":[[386,8]]},"562":{"position":[[417,6],[604,6],[1522,6]]},"576":{"position":[[88,9]]},"595":{"position":[[27,9]]},"596":{"position":[[102,8]]},"598":{"position":[[777,6]]},"599":{"position":[[136,6],[241,6],[293,6],[591,6]]},"605":{"position":[[20,9]]},"608":{"position":[[393,8]]},"613":{"position":[[367,8]]},"620":{"position":[[699,5]]},"689":{"position":[[11,8]]},"721":{"position":[[196,5]]},"736":{"position":[[449,5]]},"871":{"position":[[324,7]]},"1087":{"position":[[70,5]]},"1088":{"position":[[25,5]]},"1149":{"position":[[324,8]]},"1162":{"position":[[121,5]]},"1171":{"position":[[138,5]]},"1181":{"position":[[187,5]]},"1300":{"position":[[1150,5]]}},"keywords":{}}],["powersync",{"_index":665,"title":{"43":{"position":[[0,10]]}},"content":{"43":{"position":[[1,9],[250,9],[312,9],[482,9],[556,9],[598,9],[676,9]]}},"keywords":{}}],["pr",{"_index":3831,"title":{"668":{"position":[[9,3]]}},"content":{"670":{"position":[[42,2]]},"1133":{"position":[[627,2]]},"1324":{"position":[[1026,2]]}},"keywords":{}}],["practic",{"_index":855,"title":{"142":{"position":[[5,9]]},"346":{"position":[[5,9]]},"425":{"position":[[35,9]]},"556":{"position":[[5,9]]},"590":{"position":[[5,9]]}},"content":{"56":{"position":[[182,10]]},"142":{"position":[[83,10]]},"304":{"position":[[261,9]]},"347":{"position":[[515,9]]},"362":{"position":[[1586,9]]},"408":{"position":[[5449,10]]},"412":{"position":[[3901,9],[7014,9]]},"495":{"position":[[778,9]]},"543":{"position":[[172,9]]},"550":{"position":[[306,9]]},"557":{"position":[[354,9]]},"567":{"position":[[971,9]]},"591":{"position":[[744,9]]},"603":{"position":[[170,9]]},"616":{"position":[[844,8]]},"696":{"position":[[308,8]]},"708":{"position":[[378,9]]},"714":{"position":[[959,9]]}},"keywords":{}}],["pragmat",{"_index":2053,"title":{},"content":{"357":{"position":[[498,9]]}},"keywords":{}}],["pre",{"_index":2226,"title":{"1227":{"position":[[0,3]]},"1265":{"position":[[0,3]]}},"content":{"391":{"position":[[820,3]]},"402":{"position":[[623,3]]},"1227":{"position":[[151,3]]},"1265":{"position":[[144,3]]}},"keywords":{}}],["preact",{"_index":3303,"title":{"542":{"position":[[5,6]]},"563":{"position":[[14,6]]}},"content":{"540":{"position":[[208,6]]},"542":{"position":[[20,6],[100,6],[260,6],[362,6]]},"563":{"position":[[122,6],[404,6],[804,6],[846,6]]},"566":{"position":[[584,6]]},"567":{"position":[[556,6],[742,6]]}},"keywords":{}}],["preact/sign",{"_index":3321,"title":{},"content":{"542":{"position":[[214,15]]}},"keywords":{}}],["preactsignalsrxreactivityfactori",{"_index":3322,"title":{},"content":{"542":{"position":[[297,32],[616,32]]},"563":{"position":[[339,32],[571,32]]}},"keywords":{}}],["prebuild",{"_index":6226,"title":{},"content":{"1210":{"position":[[118,8]]},"1266":{"position":[[125,8]]}},"keywords":{}}],["precis",{"_index":2352,"title":{},"content":{"397":{"position":[[169,8]]},"398":{"position":[[222,10],[3019,7],[3103,7]]},"402":{"position":[[531,9],[1295,9],[1605,9],[1693,10]]}},"keywords":{}}],["precondit",{"_index":4921,"title":{"865":{"position":[[0,13]]}},"content":{},"keywords":{}}],["predefin",{"_index":2185,"title":{},"content":{"390":{"position":[[356,10]]}},"keywords":{}}],["predicates.al",{"_index":342,"title":{},"content":{"19":{"position":[[853,15]]}},"keywords":{}}],["predict",{"_index":967,"title":{"704":{"position":[[11,12]]}},"content":{"74":{"position":[[107,14]]},"569":{"position":[[371,14]]},"696":{"position":[[1557,7]]},"704":{"position":[[384,7],[444,7]]},"828":{"position":[[427,12]]},"986":{"position":[[208,11]]},"1305":{"position":[[372,12]]},"1313":{"position":[[265,7],[542,7]]}},"keywords":{}}],["predominantli",{"_index":2013,"title":{},"content":{"353":{"position":[[617,13]]}},"keywords":{}}],["prefer",{"_index":965,"title":{"354":{"position":[[8,6]]},"659":{"position":[[0,11]]}},"content":{"74":{"position":[[79,6]]},"94":{"position":[[265,9]]},"143":{"position":[[374,6]]},"174":{"position":[[3165,9]]},"211":{"position":[[595,9]]},"222":{"position":[[360,9]]},"286":{"position":[[97,9]]},"354":{"position":[[1356,6]]},"365":{"position":[[1264,9]]},"424":{"position":[[435,11]]},"559":{"position":[[151,11],[1538,11]]},"563":{"position":[[82,6],[1026,6]]},"567":{"position":[[1165,11]]},"590":{"position":[[422,6]]},"659":{"position":[[31,11],[348,11],[439,11],[684,11],[924,11]]},"690":{"position":[[154,6]]},"816":{"position":[[288,7],[372,7]]}},"keywords":{}}],["preferences.get",{"_index":3780,"title":{},"content":{"659":{"position":[[580,17]]}},"keywords":{}}],["preferences.remov",{"_index":3782,"title":{},"content":{"659":{"position":[[643,20]]}},"keywords":{}}],["preferences.set",{"_index":3777,"title":{},"content":{"659":{"position":[[499,17]]}},"keywords":{}}],["prefix",{"_index":3601,"title":{},"content":{"612":{"position":[[2060,8]]},"746":{"position":[[375,6],[410,7],[422,8]]},"866":{"position":[[629,6]]},"904":{"position":[[2088,6]]}},"keywords":{}}],["preinsert",{"_index":4521,"title":{},"content":{"766":{"position":[[63,9]]},"767":{"position":[[304,10]]}},"keywords":{}}],["preinsertpostinsertpresavepostsavepreremovepostremovepostcr",{"_index":4513,"title":{},"content":{"763":{"position":[[37,63]]}},"keywords":{}}],["preload",{"_index":927,"title":{},"content":{"65":{"position":[[1308,10]]}},"keywords":{}}],["premis",{"_index":4798,"title":{},"content":{"839":{"position":[[611,7]]}},"keywords":{}}],["premium",{"_index":763,"title":{"761":{"position":[[30,7]]},"1151":{"position":[[18,7]]},"1178":{"position":[[18,7]]}},"content":{"51":{"position":[[145,7]]},"314":{"position":[[220,7]]},"315":{"position":[[81,7]]},"318":{"position":[[266,7],[480,7]]},"420":{"position":[[991,7]]},"483":{"position":[[1120,7]]},"538":{"position":[[81,7]]},"554":{"position":[[137,7]]},"556":{"position":[[1107,7]]},"598":{"position":[[81,7]]},"602":{"position":[[106,8]]},"640":{"position":[[310,7]]},"641":{"position":[[363,7]]},"662":{"position":[[1029,7],[1282,7],[1908,7],[2069,7]]},"676":{"position":[[184,7]]},"710":{"position":[[859,7]]},"718":{"position":[[45,7]]},"724":{"position":[[33,7],[103,7]]},"749":{"position":[[9358,7]]},"761":{"position":[[6,7],[108,7],[412,8],[430,7],[494,7],[554,7],[620,7],[742,7]]},"824":{"position":[[555,7]]},"838":{"position":[[1517,7],[1813,7],[2048,7]]},"958":{"position":[[665,7]]},"1098":{"position":[[22,7]]},"1099":{"position":[[22,7]]},"1129":{"position":[[24,7]]},"1138":{"position":[[58,7]]},"1141":{"position":[[24,7]]},"1143":{"position":[[96,7]]},"1151":{"position":[[243,7],[433,7],[573,7],[735,7]]},"1162":{"position":[[898,7]]},"1178":{"position":[[242,7],[432,7],[572,7],[734,7]]},"1181":{"position":[[850,7]]},"1210":{"position":[[176,7],[240,7]]},"1227":{"position":[[304,7]]},"1235":{"position":[[187,7],[322,7],[433,7]]},"1265":{"position":[[297,7]]},"1271":{"position":[[554,7],[785,7],[1071,7],[1680,7]]}},"keywords":{}}],["premium/dist/work",{"_index":6272,"title":{},"content":{"1227":{"position":[[249,20],[830,20]]},"1265":{"position":[[242,20]]}},"keywords":{}}],["premium/dist/workers/opfs.worker.j",{"_index":6233,"title":{},"content":{"1210":{"position":[[669,36]]}},"keywords":{}}],["premium/plugins/encrypt",{"_index":4027,"title":{},"content":{"718":{"position":[[169,26]]},"1184":{"position":[[594,26]]}},"keywords":{}}],["premium/plugins/flexsearch",{"_index":4046,"title":{},"content":{"724":{"position":[[215,28],[475,28]]}},"keywords":{}}],["premium/plugins/indexeddb",{"_index":4708,"title":{},"content":{"820":{"position":[[115,27]]},"1225":{"position":[[249,27]]}},"keywords":{}}],["premium/plugins/logg",{"_index":4114,"title":{},"content":{"745":{"position":[[239,24]]}},"keywords":{}}],["premium/plugins/queri",{"_index":4707,"title":{},"content":{"820":{"position":[[37,21]]}},"keywords":{}}],["premium/plugins/serv",{"_index":5925,"title":{},"content":{"1098":{"position":[[277,22]]},"1099":{"position":[[255,22]]}},"keywords":{}}],["premium/plugins/shar",{"_index":3864,"title":{},"content":{"676":{"position":[[330,24]]},"958":{"position":[[785,24]]},"1151":{"position":[[907,24]]},"1178":{"position":[[904,24]]}},"keywords":{}}],["premium/plugins/storag",{"_index":4029,"title":{},"content":{"718":{"position":[[253,23]]},"745":{"position":[[308,23]]},"759":{"position":[[196,23]]},"772":{"position":[[1524,23]]},"774":{"position":[[605,23]]},"932":{"position":[[815,23]]},"1090":{"position":[[626,23],[715,23]]},"1130":{"position":[[91,23]]},"1138":{"position":[[228,23]]},"1139":{"position":[[326,23]]},"1140":{"position":[[542,23]]},"1154":{"position":[[258,23],[356,23]]},"1163":{"position":[[46,23],[129,23]]},"1182":{"position":[[46,23],[129,23]]},"1184":{"position":[[412,23],[495,23]]},"1210":{"position":[[365,23]]},"1211":{"position":[[622,23]]},"1212":{"position":[[334,23],[409,23]]},"1213":{"position":[[631,23]]},"1222":{"position":[[44,23]]},"1225":{"position":[[172,23]]},"1226":{"position":[[89,23]]},"1227":{"position":[[639,23]]},"1231":{"position":[[485,23],[562,23]]},"1237":{"position":[[778,23]]},"1238":{"position":[[486,23],[562,23],[639,23],[735,23]]},"1239":{"position":[[536,23],[637,23],[726,23]]},"1263":{"position":[[58,23],[135,23]]},"1264":{"position":[[83,23]]},"1265":{"position":[[627,23]]},"1268":{"position":[[613,23],[690,23]]},"1274":{"position":[[104,23]]},"1275":{"position":[[228,23]]},"1276":{"position":[[494,23]]},"1277":{"position":[[252,23],[781,23]]},"1278":{"position":[[359,23],[806,23]]},"1279":{"position":[[418,23]]},"1281":{"position":[[151,23]]}},"keywords":{}}],["premiumencrypt",{"_index":4022,"title":{},"content":{"717":{"position":[[152,17]]}},"keywords":{}}],["premiumif",{"_index":3148,"title":{},"content":{"483":{"position":[[989,9]]}},"keywords":{}}],["premiumsqlit",{"_index":1892,"title":{},"content":{"314":{"position":[[1017,13]]}},"keywords":{}}],["prepar",{"_index":1732,"title":{"861":{"position":[[0,9]]}},"content":{"298":{"position":[[881,8]]},"463":{"position":[[1359,8]]}},"keywords":{}}],["prepend",{"_index":5965,"title":{},"content":{"1107":{"position":[[51,9]]}},"keywords":{}}],["preprocess",{"_index":5798,"title":{},"content":{"1072":{"position":[[2296,12]]}},"keywords":{}}],["preremov",{"_index":4553,"title":{},"content":{"769":{"position":[[278,10]]}},"keywords":{}}],["presav",{"_index":4541,"title":{},"content":{"768":{"position":[[263,8]]}},"keywords":{}}],["present",{"_index":1399,"title":{},"content":{"217":{"position":[[103,7]]},"278":{"position":[[101,8]]},"289":{"position":[[513,8]]},"392":{"position":[[2986,8]]},"394":{"position":[[1375,8]]},"412":{"position":[[7526,7]]}},"keywords":{}}],["preserv",{"_index":1311,"title":{},"content":{"203":{"position":[[252,8]]},"250":{"position":[[268,8]]},"362":{"position":[[1020,10]]},"407":{"position":[[1137,13]]}},"keywords":{}}],["press",{"_index":2634,"title":{},"content":{"411":{"position":[[4801,5]]}},"keywords":{}}],["pressur",{"_index":2858,"title":{},"content":{"421":{"position":[[1087,8]]}},"keywords":{}}],["pretti",{"_index":3563,"title":{},"content":{"610":{"position":[[1454,6]]},"620":{"position":[[515,6]]},"626":{"position":[[422,6]]},"698":{"position":[[1395,6]]},"772":{"position":[[523,6]]},"837":{"position":[[227,6]]},"838":{"position":[[3111,6]]},"904":{"position":[[2515,6]]},"1124":{"position":[[1916,6]]},"1208":{"position":[[17,6]]},"1214":{"position":[[457,6]]},"1272":{"position":[[349,6]]}},"keywords":{}}],["preval",{"_index":2103,"title":{},"content":{"364":{"position":[[40,9]]}},"keywords":{}}],["prevent",{"_index":1298,"title":{"1044":{"position":[[0,7]]}},"content":{"195":{"position":[[172,7]]},"298":{"position":[[355,7]]},"300":{"position":[[548,10]]},"412":{"position":[[13283,7]]},"556":{"position":[[1862,7],[1964,10]]},"590":{"position":[[361,10],[894,7]]},"617":{"position":[[936,7]]},"849":{"position":[[162,8],[824,7]]},"886":{"position":[[4812,8]]},"907":{"position":[[106,7]]},"948":{"position":[[242,7]]},"966":{"position":[[154,7]]},"1033":{"position":[[899,7]]},"1085":{"position":[[1870,8]]},"1110":{"position":[[56,7]]},"1112":{"position":[[291,7]]},"1162":{"position":[[245,9]]},"1181":{"position":[[311,9]]},"1230":{"position":[[132,7]]},"1299":{"position":[[4,7]]},"1300":{"position":[[196,7]]}},"keywords":{}}],["previou",{"_index":2779,"title":{"760":{"position":[[15,8]]}},"content":{"413":{"position":[[92,8]]},"495":{"position":[[425,8]]},"496":{"position":[[106,8]]},"683":{"position":[[621,8]]},"749":{"position":[[8989,8]]},"760":{"position":[[19,8]]},"885":{"position":[[366,8]]},"943":{"position":[[338,8]]},"948":{"position":[[194,8]]},"954":{"position":[[50,8]]},"977":{"position":[[340,8]]},"1022":{"position":[[623,8]]},"1023":{"position":[[279,8]]},"1069":{"position":[[558,8]]},"1294":{"position":[[1219,8]]},"1305":{"position":[[804,8],[860,8],[981,8]]},"1307":{"position":[[72,8]]},"1316":{"position":[[1704,8]]},"1318":{"position":[[628,8]]}},"keywords":{}}],["previous",{"_index":2523,"title":{},"content":{"408":{"position":[[85,10]]}},"keywords":{}}],["pri",{"_index":2149,"title":{},"content":{"377":{"position":[[391,6]]}},"keywords":{}}],["price",{"_index":1692,"title":{},"content":{"295":{"position":[[84,6]]},"459":{"position":[[549,5]]}},"keywords":{}}],["primari",{"_index":1417,"title":{"1078":{"position":[[10,7]]}},"content":{"231":{"position":[[59,7]]},"356":{"position":[[349,7]]},"367":{"position":[[763,7],[874,7]]},"376":{"position":[[5,7]]},"380":{"position":[[8,7]]},"407":{"position":[[30,7]]},"419":{"position":[[996,7]]},"434":{"position":[[17,7]]},"555":{"position":[[413,7],[762,7]]},"683":{"position":[[694,7]]},"734":{"position":[[795,7]]},"749":{"position":[[1800,7],[7000,7],[7119,7],[7382,7],[9153,7],[9672,7],[10295,7],[11287,7],[11376,7],[14017,7],[17316,7],[17892,7],[18013,7],[18135,7],[18232,7],[19898,7],[20027,7],[20859,7],[21466,7]]},"808":{"position":[[378,8]]},"863":{"position":[[10,7],[141,7]]},"898":{"position":[[168,7],[204,8],[973,7],[1680,7]]},"943":{"position":[[119,7]]},"948":{"position":[[408,7]]},"950":{"position":[[93,7],[368,8]]},"951":{"position":[[33,8],[178,7]]},"1056":{"position":[[288,7]]},"1065":{"position":[[1557,7],[1848,7]]},"1074":{"position":[[1012,7]]},"1077":{"position":[[82,7],[137,7]]},"1078":{"position":[[28,7],[247,9],[574,7],[847,7],[1002,7]]},"1080":{"position":[[197,7]]},"1082":{"position":[[282,7]]},"1083":{"position":[[482,7]]},"1102":{"position":[[1279,7],[1386,7]]},"1148":{"position":[[168,7]]},"1294":{"position":[[498,7]]},"1296":{"position":[[419,7]]}},"keywords":{}}],["primarili",{"_index":1185,"title":{},"content":{"162":{"position":[[544,9]]},"273":{"position":[[138,9]]},"419":{"position":[[869,9]]},"524":{"position":[[531,9]]},"623":{"position":[[225,9]]}},"keywords":{}}],["primary1",{"_index":5338,"title":{},"content":{"945":{"position":[[165,11]]}},"keywords":{}}],["primary2",{"_index":5339,"title":{},"content":{"945":{"position":[[177,10]]}},"keywords":{}}],["primarykey",{"_index":770,"title":{"1077":{"position":[[0,11]]}},"content":{"51":{"position":[[355,11]]},"188":{"position":[[1232,11]]},"209":{"position":[[453,11]]},"211":{"position":[[399,11]]},"255":{"position":[[797,11]]},"259":{"position":[[81,11]]},"314":{"position":[[763,11]]},"315":{"position":[[739,11]]},"316":{"position":[[248,11]]},"334":{"position":[[633,11]]},"367":{"position":[[725,11]]},"392":{"position":[[583,11],[1549,11]]},"480":{"position":[[563,11]]},"482":{"position":[[863,11]]},"538":{"position":[[656,11]]},"554":{"position":[[1354,11]]},"562":{"position":[[335,11]]},"564":{"position":[[792,11]]},"579":{"position":[[641,11]]},"598":{"position":[[663,11]]},"632":{"position":[[1547,11]]},"638":{"position":[[631,11]]},"639":{"position":[[409,11]]},"662":{"position":[[2410,11]]},"680":{"position":[[823,11]]},"717":{"position":[[1432,11]]},"734":{"position":[[697,11]]},"749":{"position":[[6889,10],[11466,10],[11542,10],[11687,10],[11784,10],[19806,10],[23801,11]]},"808":{"position":[[188,11],[544,11]]},"838":{"position":[[2624,11]]},"862":{"position":[[663,11]]},"872":{"position":[[1872,11],[4102,11]]},"898":{"position":[[2452,11]]},"904":{"position":[[886,11]]},"986":{"position":[[272,10]]},"1074":{"position":[[144,11]]},"1077":{"position":[[5,10]]},"1078":{"position":[[257,11],[805,11]]},"1079":{"position":[[517,10],[625,10]]},"1080":{"position":[[99,11]]},"1082":{"position":[[184,11]]},"1083":{"position":[[384,11]]},"1149":{"position":[[1077,11]]},"1158":{"position":[[371,11]]},"1311":{"position":[[391,11]]}},"keywords":{}}],["primarykey.trim",{"_index":4286,"title":{},"content":{"749":{"position":[[11570,18]]}},"keywords":{}}],["prime",{"_index":3679,"title":{},"content":{"624":{"position":[[765,5]]}},"keywords":{}}],["primit",{"_index":4767,"title":{},"content":{"831":{"position":[[208,10]]},"875":{"position":[[123,10]]},"1308":{"position":[[222,11]]}},"keywords":{}}],["principl",{"_index":1067,"title":{},"content":{"118":{"position":[[55,10]]},"120":{"position":[[49,10]]},"136":{"position":[[68,11]]},"153":{"position":[[141,10]]},"325":{"position":[[182,11]]},"407":{"position":[[906,10]]},"419":{"position":[[308,9]]},"445":{"position":[[1271,10]]},"498":{"position":[[521,10]]},"513":{"position":[[184,10]]},"525":{"position":[[45,9]]},"530":{"position":[[223,10]]},"575":{"position":[[54,9]]}},"keywords":{}}],["print",{"_index":3856,"title":{},"content":{"675":{"position":[[39,5]]},"872":{"position":[[4373,7]]}},"keywords":{}}],["priorit",{"_index":2032,"title":{},"content":{"354":{"position":[[1417,10]]},"500":{"position":[[523,10]]},"502":{"position":[[327,10]]},"688":{"position":[[621,10]]},"1072":{"position":[[1895,10]]}},"keywords":{}}],["prioriti",{"_index":3239,"title":{},"content":{"507":{"position":[[35,8]]}},"keywords":{}}],["privaci",{"_index":1023,"title":{},"content":{"97":{"position":[[173,7]]},"195":{"position":[[16,7]]},"407":{"position":[[816,7],[1118,8]]},"410":{"position":[[504,8]]},"419":{"position":[[947,8]]},"723":{"position":[[2432,7]]},"912":{"position":[[146,8]]},"1206":{"position":[[646,7]]}},"keywords":{}}],["privat",{"_index":873,"title":{"1205":{"position":[[7,7]]},"1215":{"position":[[53,7]]}},"content":{"59":{"position":[[53,7]]},"130":{"position":[[376,7],[412,7]]},"131":{"position":[[525,7]]},"202":{"position":[[167,7]]},"408":{"position":[[1539,7]]},"453":{"position":[[12,7]]},"546":{"position":[[108,7]]},"564":{"position":[[1084,7]]},"606":{"position":[[108,7]]},"640":{"position":[[176,7]]},"697":{"position":[[569,7]]},"716":{"position":[[430,7]]},"825":{"position":[[922,7]]},"1206":{"position":[[12,7],[121,8]]},"1207":{"position":[[40,7]]},"1208":{"position":[[681,7]]},"1209":{"position":[[20,7]]},"1214":{"position":[[8,7]]},"1215":{"position":[[102,7],[375,7]]},"1216":{"position":[[41,7]]}},"keywords":{}}],["private/publickey",{"_index":4020,"title":{},"content":{"716":{"position":[[228,18]]}},"keywords":{}}],["pro",{"_index":2778,"title":{"844":{"position":[[0,5]]},"1128":{"position":[[0,5]]},"1161":{"position":[[0,5]]},"1167":{"position":[[0,5]]},"1170":{"position":[[0,5]]},"1180":{"position":[[0,5]]},"1199":{"position":[[0,5]]}},"content":{"413":{"position":[[26,4]]},"559":{"position":[[817,4]]},"839":{"position":[[220,5]]}},"keywords":{}}],["probabl",{"_index":3206,"title":{},"content":{"497":{"position":[[527,12]]}},"keywords":{}}],["problem",{"_index":72,"title":{"47":{"position":[[31,8]]},"358":{"position":[[52,8]]},"625":{"position":[[6,9]]},"627":{"position":[[28,9]]},"850":{"position":[[6,9]]},"909":{"position":[[6,9]]},"1176":{"position":[[6,9]]},"1282":{"position":[[6,8]]}},"content":{"4":{"position":[[200,8]]},"9":{"position":[[57,8]]},"19":{"position":[[1055,7]]},"118":{"position":[[398,7]]},"323":{"position":[[656,7]]},"367":{"position":[[76,7]]},"457":{"position":[[699,9]]},"458":{"position":[[1008,8]]},"468":{"position":[[748,8]]},"475":{"position":[[289,9]]},"614":{"position":[[826,7]]},"616":{"position":[[947,8]]},"617":{"position":[[1026,7]]},"624":{"position":[[343,8]]},"625":{"position":[[65,9]]},"627":{"position":[[22,8]]},"670":{"position":[[102,8]]},"696":{"position":[[448,8],[1511,7]]},"698":{"position":[[3143,9]]},"700":{"position":[[576,7]]},"701":{"position":[[463,7]]},"705":{"position":[[900,8]]},"710":{"position":[[1199,7]]},"740":{"position":[[227,7]]},"749":{"position":[[21845,8],[21965,9]]},"761":{"position":[[186,7]]},"817":{"position":[[208,8]]},"837":{"position":[[549,7]]},"840":{"position":[[457,8]]},"849":{"position":[[853,8]]},"863":{"position":[[689,7]]},"932":{"position":[[246,7]]},"1033":{"position":[[248,8]]},"1085":{"position":[[272,7]]},"1120":{"position":[[337,8]]},"1162":{"position":[[396,7],[673,7]]},"1174":{"position":[[347,7]]},"1181":{"position":[[483,7],[761,7]]},"1198":{"position":[[672,7],[2288,8]]},"1252":{"position":[[378,8]]},"1299":{"position":[[60,9]]},"1301":{"position":[[326,7],[563,8]]},"1305":{"position":[[283,8]]},"1316":{"position":[[2469,9]]}},"keywords":{}}],["problem.appwrit",{"_index":4914,"title":{},"content":{"863":{"position":[[458,16]]}},"keywords":{}}],["problemat",{"_index":946,"title":{},"content":{"66":{"position":[[514,11]]},"412":{"position":[[6107,12]]}},"keywords":{}}],["process",{"_index":12,"title":{"801":{"position":[[0,7],[28,8]]},"1088":{"position":[[24,10]]},"1225":{"position":[[20,8]]},"1226":{"position":[[12,8]]},"1263":{"position":[[14,8]]},"1264":{"position":[[12,8]]}},"content":{"1":{"position":[[168,7]]},"6":{"position":[[196,9]]},"7":{"position":[[170,9]]},"28":{"position":[[372,7],[444,7]]},"30":{"position":[[179,7]]},"46":{"position":[[590,10]]},"66":{"position":[[320,11]]},"70":{"position":[[79,9]]},"132":{"position":[[108,7]]},"158":{"position":[[21,7]]},"165":{"position":[[64,7]]},"184":{"position":[[248,7]]},"188":{"position":[[1555,7],[2464,7],[2591,7]]},"192":{"position":[[53,7]]},"196":{"position":[[211,10]]},"201":{"position":[[78,7]]},"217":{"position":[[382,10]]},"265":{"position":[[934,11]]},"273":{"position":[[128,9]]},"277":{"position":[[79,8]]},"279":{"position":[[461,7]]},"285":{"position":[[48,8],[291,7]]},"293":{"position":[[130,7]]},"333":{"position":[[108,8]]},"358":{"position":[[1036,7]]},"364":{"position":[[459,7]]},"365":{"position":[[1222,10],[1395,10]]},"391":{"position":[[928,9]]},"392":{"position":[[2270,10],[2437,9],[2962,10],[3107,10],[3201,10],[3273,7],[3771,10],[5130,10]]},"394":{"position":[[254,7],[1754,7]]},"399":{"position":[[394,9]]},"401":{"position":[[681,8]]},"402":{"position":[[478,7]]},"412":{"position":[[10185,11]]},"427":{"position":[[771,7]]},"445":{"position":[[1340,7]]},"451":{"position":[[598,7]]},"453":{"position":[[454,10]]},"458":{"position":[[211,7]]},"460":{"position":[[64,10],[181,10],[536,8],[1340,8]]},"463":{"position":[[58,7],[112,9],[285,7],[429,7]]},"464":{"position":[[646,7]]},"467":{"position":[[469,7]]},"468":{"position":[[100,7]]},"470":{"position":[[251,8]]},"503":{"position":[[102,8]]},"522":{"position":[[5,7]]},"534":{"position":[[681,10]]},"569":{"position":[[155,10],[717,7],[1337,8]]},"571":{"position":[[121,10],[1562,9]]},"594":{"position":[[679,10]]},"610":{"position":[[610,7]]},"621":{"position":[[607,7]]},"622":{"position":[[142,7]]},"634":{"position":[[678,9]]},"642":{"position":[[152,10]]},"648":{"position":[[363,10]]},"653":{"position":[[731,7]]},"662":{"position":[[751,8]]},"693":{"position":[[77,7],[120,10],[228,8],[458,7],[492,8],[617,7]]},"698":{"position":[[331,7]]},"699":{"position":[[921,10]]},"703":{"position":[[1341,7],[1492,9]]},"707":{"position":[[74,7],[112,7],[198,9],[291,7]]},"708":{"position":[[274,7],[634,8]]},"709":{"position":[[67,8],[446,8],[1017,7],[1276,8],[1344,7]]},"710":{"position":[[1069,10],[1180,9],[1329,7],[2372,7]]},"711":{"position":[[302,8],[328,8],[404,10],[543,7],[633,7],[1062,7],[1464,7],[1654,8],[2168,7]]},"723":{"position":[[1609,9]]},"740":{"position":[[151,7]]},"743":{"position":[[110,9],[210,9]]},"749":{"position":[[6007,8]]},"759":{"position":[[990,12]]},"760":{"position":[[878,12]]},"773":{"position":[[164,8],[295,7]]},"774":{"position":[[1028,7]]},"775":{"position":[[111,7]]},"801":{"position":[[392,10],[642,11],[950,10]]},"802":{"position":[[176,10],[843,8]]},"835":{"position":[[317,7]]},"836":{"position":[[2107,8]]},"846":{"position":[[1116,7]]},"875":{"position":[[625,7],[5789,7],[5848,10]]},"888":{"position":[[105,9]]},"910":{"position":[[37,7],[267,8]]},"964":{"position":[[443,8]]},"981":{"position":[[960,7]]},"989":{"position":[[121,10]]},"990":{"position":[[213,10]]},"1020":{"position":[[206,10],[282,7],[503,7]]},"1026":{"position":[[141,9]]},"1028":{"position":[[134,10]]},"1030":{"position":[[22,7]]},"1033":{"position":[[147,9]]},"1072":{"position":[[734,10]]},"1088":{"position":[[124,9],[375,9],[677,9]]},"1089":{"position":[[239,9]]},"1095":{"position":[[301,9]]},"1126":{"position":[[171,7]]},"1135":{"position":[[123,7]]},"1162":{"position":[[53,7],[364,8]]},"1164":{"position":[[1014,7],[1474,8]]},"1170":{"position":[[44,9]]},"1171":{"position":[[70,7]]},"1174":{"position":[[696,9]]},"1181":{"position":[[119,7],[451,8]]},"1183":{"position":[[113,10],[448,8],[575,8]]},"1225":{"position":[[15,7]]},"1238":{"position":[[286,8]]},"1241":{"position":[[81,8]]},"1245":{"position":[[75,7]]},"1246":{"position":[[217,7],[255,7],[537,7],[575,7],[830,7],[2103,7],[2146,10],[2254,8]]},"1267":{"position":[[173,8]]},"1270":{"position":[[188,7]]},"1292":{"position":[[560,9]]},"1300":{"position":[[121,7],[838,7]]},"1301":{"position":[[662,7],[1388,7],[1516,7],[1648,8]]},"1318":{"position":[[112,10]]}},"keywords":{}}],["process.brows",{"_index":123,"title":{},"content":{"8":{"position":[[658,15]]}},"keywords":{}}],["process.env.node_env",{"_index":3843,"title":{},"content":{"672":{"position":[[32,21]]}},"keywords":{}}],["process.env.port",{"_index":3594,"title":{},"content":{"612":{"position":[[1815,16]]}},"keywords":{}}],["process.nexttick",{"_index":4335,"title":{"910":{"position":[[28,19]]}},"content":{"749":{"position":[[15323,18]]},"910":{"position":[[57,18]]}},"keywords":{}}],["process.slow",{"_index":6130,"title":{},"content":{"1171":{"position":[[306,12]]}},"keywords":{}}],["process/brows",{"_index":5266,"title":{},"content":{"910":{"position":[[170,15],[276,18]]}},"keywords":{}}],["processed.download",{"_index":3038,"title":{},"content":{"463":{"position":[[1117,21]]}},"keywords":{}}],["processor",{"_index":2285,"title":{},"content":{"392":{"position":[[5007,10],[5101,10]]}},"keywords":{}}],["produc",{"_index":3530,"title":{},"content":{"591":{"position":[[506,7]]}},"keywords":{}}],["product",{"_index":203,"title":{},"content":{"14":{"position":[[119,9],[970,8]]},"38":{"position":[[1112,7]]},"88":{"position":[[183,12]]},"94":{"position":[[296,12]]},"212":{"position":[[578,10]]},"301":{"position":[[417,11]]},"306":{"position":[[357,10]]},"318":{"position":[[316,10]]},"350":{"position":[[384,13]]},"356":{"position":[[328,8],[436,8]]},"380":{"position":[[323,12]]},"386":{"position":[[26,10]]},"411":{"position":[[5547,7]]},"459":{"position":[[533,8]]},"554":{"position":[[376,10],[666,10],[1189,10]]},"556":{"position":[[1501,10]]},"570":{"position":[[131,7]]},"611":{"position":[[999,11]]},"674":{"position":[[285,12]]},"675":{"position":[[137,11]]},"698":{"position":[[3173,10]]},"710":{"position":[[1270,11],[2274,11]]},"749":{"position":[[6141,10]]},"772":{"position":[[2116,11]]},"798":{"position":[[311,11]]},"821":{"position":[[301,11],[559,10],[813,10]]},"824":{"position":[[452,10]]},"860":{"position":[[930,10]]},"872":{"position":[[1468,10]]},"898":{"position":[[2926,10]]},"904":{"position":[[2691,10]]},"906":{"position":[[400,10],[600,11]]},"966":{"position":[[371,10]]},"1009":{"position":[[912,10]]},"1085":{"position":[[3259,10]]},"1143":{"position":[[130,11]]},"1151":{"position":[[643,10]]},"1178":{"position":[[642,10]]},"1193":{"position":[[293,11]]},"1198":{"position":[[1105,10]]},"1266":{"position":[[708,13]]},"1271":{"position":[[342,11],[597,10]]}},"keywords":{}}],["profession",{"_index":4024,"title":{},"content":{"718":{"position":[[5,14]]},"1143":{"position":[[53,12]]},"1151":{"position":[[622,12]]},"1178":{"position":[[621,12]]}},"keywords":{}}],["profil",{"_index":1234,"title":{},"content":{"178":{"position":[[160,9]]},"346":{"position":[[750,10]]},"353":{"position":[[683,9]]},"521":{"position":[[318,7]]}},"keywords":{}}],["program",{"_index":1068,"title":{},"content":{"118":{"position":[[78,12],[167,11]]},"120":{"position":[[72,12]]},"126":{"position":[[110,11]]},"136":{"position":[[56,11]]},"153":{"position":[[164,12]]},"155":{"position":[[69,11]]},"179":{"position":[[357,11]]},"182":{"position":[[128,12]]},"207":{"position":[[173,8]]},"325":{"position":[[170,11]]},"364":{"position":[[260,11],[399,11]]},"379":{"position":[[33,12]]},"445":{"position":[[1231,11],[1294,12],[1568,11]]},"447":{"position":[[360,12]]},"513":{"position":[[207,11]]},"514":{"position":[[110,11]]},"520":{"position":[[118,11]]},"521":{"position":[[477,11]]},"530":{"position":[[211,11]]},"569":{"position":[[1164,11],[1289,8]]},"575":{"position":[[119,12]]},"711":{"position":[[60,11]]},"1102":{"position":[[167,10],[191,11]]}},"keywords":{}}],["progress",{"_index":1152,"title":{"499":{"position":[[23,11]]},"500":{"position":[[10,11]]},"503":{"position":[[16,11]]}},"content":{"148":{"position":[[357,11]]},"375":{"position":[[890,11]]},"404":{"position":[[479,8]]},"450":{"position":[[710,8]]},"474":{"position":[[216,8]]},"500":{"position":[[1,11]]},"503":{"position":[[25,11]]},"510":{"position":[[64,11]]},"511":{"position":[[445,11]]},"584":{"position":[[221,11]]},"796":{"position":[[1235,10],[1365,10]]}},"keywords":{}}],["project",{"_index":190,"title":{"262":{"position":[[23,9]]},"730":{"position":[[0,7]]}},"content":{"13":{"position":[[110,8],[216,8]]},"15":{"position":[[548,8]]},"17":{"position":[[491,8]]},"19":{"position":[[211,8],[235,7]]},"27":{"position":[[426,7]]},"28":{"position":[[552,7]]},"31":{"position":[[17,7]]},"34":{"position":[[288,9]]},"36":{"position":[[284,8]]},"38":{"position":[[954,9]]},"61":{"position":[[243,7]]},"74":{"position":[[131,9]]},"83":{"position":[[246,9]]},"84":{"position":[[418,9]]},"114":{"position":[[431,9]]},"175":{"position":[[422,9]]},"198":{"position":[[308,9]]},"202":{"position":[[448,7]]},"241":{"position":[[190,7]]},"247":{"position":[[34,9]]},"262":{"position":[[147,7]]},"263":{"position":[[543,8]]},"285":{"position":[[95,8]]},"320":{"position":[[169,8]]},"333":{"position":[[74,7]]},"347":{"position":[[551,7]]},"356":{"position":[[856,8]]},"362":{"position":[[830,9],[1622,7]]},"373":{"position":[[190,7]]},"388":{"position":[[96,7]]},"392":{"position":[[163,9]]},"420":{"position":[[1045,8]]},"498":{"position":[[219,8]]},"579":{"position":[[17,8]]},"590":{"position":[[71,9]]},"591":{"position":[[780,9]]},"614":{"position":[[56,7]]},"670":{"position":[[201,8]]},"710":{"position":[[2533,8]]},"730":{"position":[[47,8]]},"749":{"position":[[5938,8]]},"836":{"position":[[327,7],[422,8],[493,7],[1083,7]]},"838":{"position":[[3261,8]]},"839":{"position":[[114,8]]},"840":{"position":[[698,8]]},"854":{"position":[[219,7]]},"861":{"position":[[258,8],[992,7]]},"872":{"position":[[55,8]]},"885":{"position":[[2734,8]]},"898":{"position":[[84,7],[122,8]]},"1009":{"position":[[395,8],[472,8]]},"1143":{"position":[[66,8]]},"1157":{"position":[[458,9]]}},"keywords":{}}],["project.mak",{"_index":6358,"title":{},"content":{"1280":{"position":[[40,12]]}},"keywords":{}}],["projectid",{"_index":4865,"title":{},"content":{"854":{"position":[[203,9],[269,10],[323,10],[734,10]]},"858":{"position":[[245,10]]}},"keywords":{}}],["projectrootpath",{"_index":6308,"title":{},"content":{"1266":{"position":[[256,15],[664,16]]}},"keywords":{}}],["projects.node.j",{"_index":2166,"title":{},"content":{"384":{"position":[[132,17]]}},"keywords":{}}],["projects.rxdb",{"_index":1154,"title":{},"content":{"149":{"position":[[431,13]]},"347":{"position":[[429,13]]},"362":{"position":[[1500,13]]},"511":{"position":[[431,13]]},"531":{"position":[[431,13]]},"591":{"position":[[429,13]]}},"keywords":{}}],["projecttri",{"_index":1698,"title":{},"content":{"296":{"position":[[32,10]]}},"keywords":{}}],["promis",{"_index":549,"title":{},"content":{"35":{"position":[[89,7]]},"47":{"position":[[201,7]]},"387":{"position":[[104,8]]},"439":{"position":[[419,8]]},"452":{"position":[[729,7]]},"521":{"position":[[142,7]]},"535":{"position":[[196,9]]},"595":{"position":[[209,9]]},"621":{"position":[[715,8]]},"624":{"position":[[1174,9]]},"659":{"position":[[398,7]]},"751":{"position":[[1042,7]]},"810":{"position":[[119,7]]},"835":{"position":[[211,7],[388,7]]},"886":{"position":[[230,7]]},"917":{"position":[[47,7]]},"929":{"position":[[35,7]]},"930":{"position":[[11,7]]},"931":{"position":[[11,7]]},"932":{"position":[[11,7]]},"968":{"position":[[285,7]]},"974":{"position":[[11,7]]},"975":{"position":[[11,7]]},"976":{"position":[[116,7]]},"994":{"position":[[170,7]]},"995":{"position":[[11,7],[667,7]]},"997":{"position":[[36,7]]},"1014":{"position":[[128,7]]},"1015":{"position":[[108,7]]},"1016":{"position":[[45,7]]},"1026":{"position":[[97,7]]},"1057":{"position":[[11,7]]},"1062":{"position":[[40,7]]},"1105":{"position":[[1109,8]]},"1213":{"position":[[863,8]]},"1274":{"position":[[536,9]]},"1279":{"position":[[923,9]]}},"keywords":{}}],["promise<number[]>",{"_index":2270,"title":{},"content":{"392":{"position":[[4087,23]]}},"keywords":{}}],["promise<number[]>(r",{"_index":2273,"title":{},"content":{"392":{"position":[[4258,27]]}},"keywords":{}}],["promise<sqlitedatabaseclass>",{"_index":6367,"title":{},"content":{"1281":{"position":[[303,35]]}},"keywords":{}}],["promise<void>",{"_index":160,"title":{},"content":{"11":{"position":[[556,19]]}},"keywords":{}}],["promise((r",{"_index":3000,"title":{},"content":{"459":{"position":[[846,13]]},"1294":{"position":[[1140,13]]}},"keywords":{}}],["promise(r",{"_index":163,"title":{},"content":{"11":{"position":[[589,11]]},"711":{"position":[[1556,11]]},"767":{"position":[[562,11],[971,11]]},"768":{"position":[[564,11],[973,11]]},"769":{"position":[[521,11],[942,11]]}},"keywords":{}}],["promise.al",{"_index":2394,"title":{},"content":{"398":{"position":[[835,12],[1010,13],[2121,12]]}},"keywords":{}}],["promise.all(docs.map(async",{"_index":2282,"title":{},"content":{"392":{"position":[[4738,26]]}},"keywords":{}}],["promise.all(docs.map(async(doc",{"_index":2246,"title":{},"content":{"392":{"position":[[2785,31]]},"397":{"position":[[1826,31]]}},"keywords":{}}],["promise.resolv",{"_index":6247,"title":{},"content":{"1218":{"position":[[458,17]]}},"keywords":{}}],["promise.resolve(sha256(input",{"_index":5406,"title":{},"content":{"968":{"position":[[456,31]]}},"keywords":{}}],["promot",{"_index":2160,"title":{},"content":{"382":{"position":[[118,8]]},"502":{"position":[[1290,8]]},"509":{"position":[[150,9]]}},"keywords":{}}],["prompt",{"_index":1722,"title":{},"content":{"298":{"position":[[596,7]]},"299":{"position":[[372,6],[576,8],[1296,6],[1324,6]]},"302":{"position":[[485,6],[946,6]]},"404":{"position":[[655,6]]},"408":{"position":[[577,6]]},"496":{"position":[[458,8]]},"618":{"position":[[708,9]]},"635":{"position":[[408,9]]},"696":{"position":[[1454,6]]}},"keywords":{}}],["promptli",{"_index":3254,"title":{},"content":{"517":{"position":[[310,8]]}},"keywords":{}}],["prone",{"_index":3252,"title":{},"content":{"515":{"position":[[193,5]]}},"keywords":{}}],["proof",{"_index":1887,"title":{},"content":{"314":{"position":[[14,5]]}},"keywords":{}}],["propag",{"_index":1118,"title":{},"content":{"136":{"position":[[123,10]]},"240":{"position":[[241,9]]},"267":{"position":[[549,9]]},"274":{"position":[[364,11]]},"283":{"position":[[481,10]]},"289":{"position":[[911,10]]},"412":{"position":[[725,9]]},"445":{"position":[[1079,10]]},"446":{"position":[[372,10]]},"490":{"position":[[422,9]]},"517":{"position":[[319,10]]},"519":{"position":[[202,10]]},"525":{"position":[[178,10]]},"575":{"position":[[560,10]]},"630":{"position":[[410,9]]},"875":{"position":[[6812,10]]}},"keywords":{}}],["proper",{"_index":1140,"title":{},"content":{"145":{"position":[[11,6]]},"291":{"position":[[290,6]]},"397":{"position":[[322,6]]},"453":{"position":[[820,6]]},"550":{"position":[[288,6]]},"635":{"position":[[440,6]]},"996":{"position":[[154,6]]},"1172":{"position":[[508,6]]}},"keywords":{}}],["properli",{"_index":4917,"title":{},"content":{"863":{"position":[[589,8]]},"917":{"position":[[493,8]]},"990":{"position":[[308,8],[1001,8]]},"1120":{"position":[[177,9]]},"1307":{"position":[[529,9]]}},"keywords":{}}],["properti",{"_index":772,"title":{"1084":{"position":[[12,11]]}},"content":{"51":{"position":[[389,11]]},"188":{"position":[[1266,11]]},"209":{"position":[[471,11]]},"211":{"position":[[433,11]]},"255":{"position":[[815,11]]},"259":{"position":[[115,11]]},"314":{"position":[[781,11]]},"315":{"position":[[757,11]]},"316":{"position":[[266,11]]},"334":{"position":[[667,11]]},"354":{"position":[[1290,10]]},"367":{"position":[[810,11]]},"392":{"position":[[617,11],[1583,11]]},"412":{"position":[[4907,11],[5381,10]]},"480":{"position":[[581,11]]},"482":{"position":[[881,11]]},"538":{"position":[[690,11]]},"554":{"position":[[1372,11]]},"562":{"position":[[353,11],[820,9]]},"564":{"position":[[810,11]]},"579":{"position":[[675,11],[925,8]]},"598":{"position":[[697,11]]},"632":{"position":[[1565,11]]},"636":{"position":[[230,8]]},"638":{"position":[[649,11]]},"639":{"position":[[427,11]]},"662":{"position":[[2428,11]]},"680":{"position":[[857,11]]},"685":{"position":[[320,9],[618,10]]},"687":{"position":[[336,11]]},"691":{"position":[[565,11]]},"714":{"position":[[132,10]]},"717":{"position":[[1292,9],[1466,11]]},"720":{"position":[[93,8],[165,11]]},"724":{"position":[[870,8]]},"734":{"position":[[731,11]]},"749":{"position":[[3692,10],[11265,8],[13100,10],[18434,10],[19724,12],[20048,8]]},"751":{"position":[[190,8]]},"754":{"position":[[183,9]]},"780":{"position":[[375,10]]},"804":{"position":[[10,8]]},"805":{"position":[[16,8]]},"808":{"position":[[20,10],[208,11],[580,11]]},"812":{"position":[[103,11],[169,11]]},"813":{"position":[[103,11]]},"838":{"position":[[2642,11]]},"848":{"position":[[353,8]]},"862":{"position":[[697,11]]},"872":{"position":[[1914,11],[4144,11]]},"887":{"position":[[143,11]]},"898":{"position":[[2494,11]]},"904":{"position":[[904,11]]},"916":{"position":[[172,11]]},"932":{"position":[[1224,11]]},"944":{"position":[[643,8]]},"968":{"position":[[625,10]]},"987":{"position":[[1032,8]]},"988":{"position":[[1696,8]]},"993":{"position":[[72,11]]},"1040":{"position":[[5,10]]},"1074":{"position":[[128,8]]},"1077":{"position":[[52,8]]},"1078":{"position":[[74,10],[510,11]]},"1080":{"position":[[133,11],[670,11]]},"1082":{"position":[[218,11]]},"1083":{"position":[[418,11]]},"1084":{"position":[[541,10],[646,8]]},"1085":{"position":[[1145,8],[1912,11],[2040,11],[2236,10],[2265,8],[2609,11]]},"1106":{"position":[[479,8]]},"1116":{"position":[[168,10],[374,8],[462,8],[578,8]]},"1117":{"position":[[248,8]]},"1149":{"position":[[1095,11]]},"1158":{"position":[[405,11]]},"1213":{"position":[[895,10]]},"1304":{"position":[[79,10]]},"1308":{"position":[[417,12]]},"1309":{"position":[[831,11],[1113,10],[1306,8]]},"1311":{"position":[[433,11],[1596,8]]}},"keywords":{}}],["proportion",{"_index":2326,"title":{},"content":{"394":{"position":[[1531,15]]}},"keywords":{}}],["propos",{"_index":2653,"title":{},"content":{"412":{"position":[[453,8]]},"451":{"position":[[32,8]]},"458":{"position":[[949,8]]}},"keywords":{}}],["proprietari",{"_index":1542,"title":{},"content":{"249":{"position":[[42,11]]},"381":{"position":[[424,11]]},"412":{"position":[[1339,11]]}},"keywords":{}}],["protect",{"_index":934,"title":{},"content":{"65":{"position":[[1788,10]]},"95":{"position":[[216,10]]},"139":{"position":[[109,7]]},"173":{"position":[[1307,9]]},"195":{"position":[[138,7]]},"218":{"position":[[288,10]]},"249":{"position":[[315,8]]},"291":{"position":[[332,10]]},"318":{"position":[[428,7]]},"377":{"position":[[373,7]]},"417":{"position":[[418,7]]},"479":{"position":[[260,7]]},"526":{"position":[[163,9]]},"556":{"position":[[732,10]]},"567":{"position":[[684,10]]},"586":{"position":[[135,10]]},"638":{"position":[[175,7]]},"897":{"position":[[470,7]]},"898":{"position":[[2830,11]]},"912":{"position":[[430,9]]}},"keywords":{}}],["protocol",{"_index":1189,"title":{},"content":{"165":{"position":[[180,10]]},"202":{"position":[[329,9]]},"248":{"position":[[245,8]]},"255":{"position":[[76,8]]},"262":{"position":[[119,8]]},"412":{"position":[[1327,8],[11597,8]]},"491":{"position":[[664,9],[1713,9],[1885,9]]},"613":{"position":[[148,8]]},"614":{"position":[[450,9]]},"620":{"position":[[566,9]]},"621":{"position":[[817,8]]},"623":{"position":[[394,8]]},"624":{"position":[[230,9],[379,10]]},"705":{"position":[[1343,9]]},"871":{"position":[[798,8]]},"903":{"position":[[498,8],[621,8]]},"981":{"position":[[57,10],[667,8],[1265,8]]},"1005":{"position":[[22,8]]},"1316":{"position":[[333,8],[1363,8]]}},"keywords":{}}],["prototyp",{"_index":534,"title":{"805":{"position":[[0,11]]}},"content":{"34":{"position":[[298,12]]},"662":{"position":[[1140,11]]},"701":{"position":[[44,10]]},"772":{"position":[[2065,10]]},"784":{"position":[[827,10]]},"805":{"position":[[5,10],[73,9],[135,9],[252,10]]},"806":{"position":[[52,9]]},"1157":{"position":[[468,11]]},"1271":{"position":[[528,10]]}},"keywords":{}}],["prove",{"_index":1195,"title":{},"content":{"170":{"position":[[602,6]]},"289":{"position":[[1804,6]]},"354":{"position":[[663,5]]}},"keywords":{}}],["proven",{"_index":253,"title":{"386":{"position":[[0,6]]}},"content":{"15":{"position":[[240,6],[465,6]]},"1199":{"position":[[13,6]]}},"keywords":{}}],["provid",{"_index":293,"title":{"751":{"position":[[0,9]]}},"content":{"17":{"position":[[299,8]]},"18":{"position":[[128,8]]},"21":{"position":[[56,8]]},"22":{"position":[[178,9]]},"28":{"position":[[254,8]]},"33":{"position":[[57,9]]},"34":{"position":[[543,8]]},"35":{"position":[[70,8],[374,7]]},"40":{"position":[[201,8]]},"42":{"position":[[10,8],[205,9]]},"46":{"position":[[110,8]]},"73":{"position":[[79,7]]},"79":{"position":[[6,8]]},"84":{"position":[[312,8],[345,8]]},"87":{"position":[[205,8]]},"90":{"position":[[289,9]]},"99":{"position":[[294,7]]},"101":{"position":[[163,7]]},"103":{"position":[[6,8]]},"106":{"position":[[51,9]]},"110":{"position":[[97,8]]},"114":{"position":[[325,8],[358,8]]},"116":{"position":[[196,8]]},"117":{"position":[[56,9]]},"118":{"position":[[182,7]]},"120":{"position":[[211,8]]},"123":{"position":[[6,8]]},"125":{"position":[[6,8],[280,9]]},"130":{"position":[[9,8]]},"131":{"position":[[487,8],[777,8]]},"132":{"position":[[120,8]]},"134":{"position":[[267,8]]},"136":{"position":[[6,8]]},"139":{"position":[[6,8]]},"145":{"position":[[235,7]]},"146":{"position":[[6,8],[317,8]]},"147":{"position":[[167,8]]},"148":{"position":[[271,7]]},"149":{"position":[[325,8],[358,8]]},"152":{"position":[[64,9]]},"155":{"position":[[85,8]]},"156":{"position":[[96,7]]},"158":{"position":[[81,8]]},"162":{"position":[[6,8],[299,9]]},"165":{"position":[[6,8]]},"167":{"position":[[53,8]]},"169":{"position":[[52,8]]},"170":{"position":[[6,8]]},"174":{"position":[[762,8],[1805,8],[2291,9],[2614,8]]},"175":{"position":[[318,8]]},"177":{"position":[[217,8]]},"178":{"position":[[56,9]]},"181":{"position":[[111,8]]},"184":{"position":[[82,8]]},"189":{"position":[[212,8],[569,7]]},"191":{"position":[[275,9]]},"192":{"position":[[6,8]]},"196":{"position":[[6,8]]},"198":{"position":[[426,7]]},"205":{"position":[[399,9]]},"217":{"position":[[231,7]]},"219":{"position":[[20,7],[322,8]]},"221":{"position":[[264,9]]},"223":{"position":[[160,7]]},"226":{"position":[[362,7]]},"229":{"position":[[101,8]]},"231":{"position":[[210,8]]},"232":{"position":[[85,8]]},"236":{"position":[[6,8]]},"239":{"position":[[6,8]]},"240":{"position":[[153,9]]},"266":{"position":[[329,9]]},"267":{"position":[[422,9],[1052,9],[1365,7],[1567,8]]},"269":{"position":[[324,7]]},"270":{"position":[[170,7]]},"274":{"position":[[177,9]]},"277":{"position":[[199,7]]},"287":{"position":[[66,8],[1044,7]]},"288":{"position":[[203,8]]},"289":{"position":[[1249,8]]},"290":{"position":[[234,9]]},"295":{"position":[[294,8]]},"300":{"position":[[472,7]]},"318":{"position":[[147,8]]},"320":{"position":[[8,8]]},"322":{"position":[[87,7]]},"329":{"position":[[33,8]]},"331":{"position":[[329,9]]},"347":{"position":[[325,8]]},"362":{"position":[[742,7],[1396,8]]},"367":{"position":[[297,8]]},"368":{"position":[[350,9]]},"369":{"position":[[1251,7]]},"372":{"position":[[139,9]]},"381":{"position":[[366,8]]},"386":{"position":[[284,8]]},"390":{"position":[[1805,7]]},"392":{"position":[[2367,8]]},"393":{"position":[[312,8]]},"396":{"position":[[1936,8]]},"408":{"position":[[2056,9],[2216,7]]},"410":{"position":[[173,7]]},"411":{"position":[[5376,9]]},"412":{"position":[[11680,9],[11755,7]]},"417":{"position":[[306,9]]},"420":{"position":[[1569,7]]},"424":{"position":[[376,8]]},"430":{"position":[[291,7]]},"432":{"position":[[1210,9]]},"433":{"position":[[67,8]]},"436":{"position":[[237,9]]},"439":{"position":[[436,8]]},"444":{"position":[[509,9]]},"445":{"position":[[228,8]]},"446":{"position":[[1051,7]]},"451":{"position":[[103,8]]},"494":{"position":[[219,8]]},"511":{"position":[[325,8],[358,8]]},"517":{"position":[[130,8]]},"519":{"position":[[261,9]]},"520":{"position":[[226,7],[425,8]]},"521":{"position":[[493,9]]},"523":{"position":[[24,8]]},"524":{"position":[[334,9]]},"527":{"position":[[81,8]]},"529":{"position":[[164,8]]},"531":{"position":[[325,8],[358,8]]},"533":{"position":[[100,8]]},"535":{"position":[[732,7]]},"538":{"position":[[6,8]]},"540":{"position":[[16,9]]},"542":{"position":[[946,8]]},"560":{"position":[[176,7]]},"564":{"position":[[148,8],[532,7]]},"565":{"position":[[67,8]]},"575":{"position":[[218,9]]},"576":{"position":[[347,9]]},"579":{"position":[[888,9]]},"582":{"position":[[556,8]]},"591":{"position":[[325,8]]},"593":{"position":[[100,8]]},"595":{"position":[[753,7]]},"598":{"position":[[6,8]]},"600":{"position":[[16,9]]},"611":{"position":[[12,7],[1379,8]]},"612":{"position":[[26,7]]},"619":{"position":[[280,8]]},"621":{"position":[[214,8]]},"635":{"position":[[316,8]]},"693":{"position":[[295,8]]},"702":{"position":[[617,7]]},"703":{"position":[[846,7]]},"715":{"position":[[104,7],[370,9]]},"723":{"position":[[303,9]]},"746":{"position":[[202,7]]},"749":{"position":[[23973,7],[24249,8]]},"751":{"position":[[44,7]]},"760":{"position":[[225,9]]},"772":{"position":[[123,8]]},"775":{"position":[[200,8]]},"781":{"position":[[668,7]]},"782":{"position":[[212,8]]},"802":{"position":[[415,7]]},"829":{"position":[[882,9],[988,8],[1134,8],[2194,8],[3088,8]]},"830":{"position":[[15,9]]},"836":{"position":[[858,7]]},"838":{"position":[[3281,8]]},"846":{"position":[[456,8]]},"854":{"position":[[879,9]]},"860":{"position":[[295,8]]},"886":{"position":[[4661,7],[4776,9]]},"889":{"position":[[816,8]]},"894":{"position":[[70,8]]},"904":{"position":[[1533,7],[2651,8]]},"906":{"position":[[525,8]]},"912":{"position":[[241,9]]},"945":{"position":[[270,9]]},"968":{"position":[[194,7]]},"985":{"position":[[180,7]]},"988":{"position":[[2132,9]]},"1072":{"position":[[1032,7],[1268,7]]},"1076":{"position":[[97,7]]},"1085":{"position":[[2636,7]]},"1101":{"position":[[364,8]]},"1102":{"position":[[761,8]]},"1104":{"position":[[107,8]]},"1132":{"position":[[985,9]]},"1140":{"position":[[25,8],[421,9]]},"1147":{"position":[[168,8]]},"1148":{"position":[[42,8]]},"1150":{"position":[[192,8]]},"1164":{"position":[[21,8]]},"1206":{"position":[[266,8]]},"1209":{"position":[[44,8]]},"1215":{"position":[[158,8]]},"1247":{"position":[[306,8],[479,8],[666,8]]},"1289":{"position":[[23,7]]}},"keywords":{}}],["prowess",{"_index":3230,"title":{},"content":{"502":{"position":[[1165,7]]}},"keywords":{}}],["proxi",{"_index":3629,"title":{"619":{"position":[[0,7]]},"1040":{"position":[[0,5]]}},"content":{"616":{"position":[[915,7]]},"617":{"position":[[683,6],[692,5],[752,6]]},"619":{"position":[[191,7]]},"627":{"position":[[105,7]]},"749":{"position":[[12123,5]]},"849":{"position":[[626,5],[812,8]]},"1018":{"position":[[441,5]]}},"keywords":{}}],["proxim",{"_index":2142,"title":{},"content":{"376":{"position":[[60,9]]},"390":{"position":[[1361,9]]}},"keywords":{}}],["proxy_add_x_forward",{"_index":4857,"title":{},"content":{"849":{"position":[[1062,22]]}},"keywords":{}}],["proxy_buff",{"_index":4854,"title":{},"content":{"849":{"position":[[979,15]]}},"keywords":{}}],["proxy_pass",{"_index":4851,"title":{},"content":{"849":{"position":[[925,10]]}},"keywords":{}}],["proxy_redirect",{"_index":4853,"title":{},"content":{"849":{"position":[[959,14]]}},"keywords":{}}],["proxy_set_head",{"_index":4855,"title":{},"content":{"849":{"position":[[1000,16],[1029,16],[1085,16]]}},"keywords":{}}],["pseudo",{"_index":3042,"title":{},"content":{"464":{"position":[[194,6]]},"1018":{"position":[[434,6]]}},"keywords":{}}],["pub.dev",{"_index":1270,"title":{},"content":{"188":{"position":[[2160,8]]}},"keywords":{}}],["public",{"_index":2198,"title":{},"content":{"390":{"position":[[1095,6]]},"898":{"position":[[1409,11],[1458,11]]}},"keywords":{}}],["public.human",{"_index":5206,"title":{},"content":{"898":{"position":[[1306,13]]}},"keywords":{}}],["publish",{"_index":1269,"title":{},"content":{"188":{"position":[[2138,9]]}},"keywords":{}}],["pubspec.yaml",{"_index":1267,"title":{},"content":{"188":{"position":[[1909,13],[2277,12]]}},"keywords":{}}],["pull",{"_index":1024,"title":{"1005":{"position":[[0,4]]}},"content":{"99":{"position":[[116,5]]},"208":{"position":[[124,5]]},"209":{"position":[[977,5]]},"255":{"position":[[95,5],[1312,5]]},"261":{"position":[[778,5],[800,4]]},"412":{"position":[[2635,6],[6704,7],[8305,7]]},"481":{"position":[[69,5],[725,5]]},"494":{"position":[[518,5]]},"571":{"position":[[526,4]]},"582":{"position":[[379,7]]},"630":{"position":[[850,4]]},"632":{"position":[[42,7],[2310,4],[2357,5]]},"650":{"position":[[109,4]]},"668":{"position":[[15,4]]},"679":{"position":[[116,4]]},"739":{"position":[[62,6],[118,7]]},"749":{"position":[[493,4],[15488,4],[15622,4],[22481,4]]},"756":{"position":[[370,4],[445,4]]},"846":{"position":[[639,5],[770,6]]},"848":{"position":[[860,5],[1542,5]]},"852":{"position":[[330,5]]},"854":{"position":[[842,4],[984,5]]},"858":{"position":[[320,5]]},"862":{"position":[[1381,5]]},"866":{"position":[[850,5]]},"872":{"position":[[2578,5],[4594,5]]},"875":{"position":[[563,5],[1284,4],[1348,4],[1733,4],[2901,4],[3134,5],[6550,4],[8443,5],[9304,4],[9742,5]]},"878":{"position":[[547,5]]},"886":{"position":[[1,4],[28,4],[432,4],[897,4],[1136,5],[1259,6],[3181,5],[3218,4],[3287,4],[3304,5],[3346,4],[4149,5],[5035,4]]},"887":{"position":[[181,6],[402,5]]},"888":{"position":[[543,5]]},"889":{"position":[[757,5]]},"897":{"position":[[120,5]]},"898":{"position":[[652,4],[2011,4],[3458,5],[3635,4]]},"904":{"position":[[3088,5]]},"907":{"position":[[365,5]]},"911":{"position":[[833,5]]},"982":{"position":[[285,5]]},"984":{"position":[[193,6]]},"985":{"position":[[377,4]]},"986":{"position":[[1596,4]]},"988":{"position":[[3485,5],[3499,4],[3886,6],[4236,4],[4540,6],[4894,4]]},"990":{"position":[[966,4]]},"993":{"position":[[390,4]]},"1002":{"position":[[947,4],[1108,4],[1322,5]]},"1004":{"position":[[667,6]]},"1005":{"position":[[52,4],[89,6],[236,4]]},"1007":{"position":[[513,4],[1462,5]]},"1010":{"position":[[188,4]]},"1101":{"position":[[805,5]]},"1121":{"position":[[751,5]]},"1135":{"position":[[347,4]]},"1309":{"position":[[222,4]]}},"keywords":{}}],["pull.filt",{"_index":4886,"title":{},"content":{"858":{"position":[[135,11],[537,11]]}},"keywords":{}}],["pull.handl",{"_index":5005,"title":{},"content":{"875":{"position":[[2940,12]]},"888":{"position":[[715,13]]}},"keywords":{}}],["pull.initialcheckpoint",{"_index":5539,"title":{},"content":{"1002":{"position":[[800,23]]}},"keywords":{}}],["pull.modifi",{"_index":5228,"title":{},"content":{"898":{"position":[[4416,13]]},"1009":{"position":[[980,14]]}},"keywords":{}}],["pull.responsemodifi",{"_index":5153,"title":{"888":{"position":[[0,22]]}},"content":{"888":{"position":[[10,21]]}},"keywords":{}}],["pull.stream",{"_index":5016,"title":{},"content":{"875":{"position":[[4235,13],[4363,12],[7835,12],[8814,13]]},"876":{"position":[[316,12]]},"888":{"position":[[761,11]]},"996":{"position":[[161,12]]},"1107":{"position":[[330,12]]}},"keywords":{}}],["pull/push",{"_index":6084,"title":{},"content":{"1149":{"position":[[428,9]]}},"keywords":{}}],["pullhandl",{"_index":5440,"title":{},"content":{"983":{"position":[[189,11],[862,13]]},"984":{"position":[[257,14]]},"986":{"position":[[1261,14]]}},"keywords":{}}],["pullhuman",{"_index":5090,"title":{},"content":{"885":{"position":[[1427,9],[1480,10]]},"886":{"position":[[798,12],[1714,11]]}},"keywords":{}}],["pullhuman($checkpoint",{"_index":5117,"title":{},"content":{"886":{"position":[[581,22]]}},"keywords":{}}],["pullhuman(checkpoint",{"_index":5082,"title":{},"content":{"885":{"position":[[846,21]]},"886":{"position":[[637,21]]}},"keywords":{}}],["pullquerybuild",{"_index":5115,"title":{},"content":{"886":{"position":[[63,17],[369,16],[1158,17],[4187,17]]},"887":{"position":[[424,17]]}},"keywords":{}}],["pullquerybuilderfromrxschema",{"_index":5167,"title":{},"content":{"889":{"position":[[875,31]]}},"keywords":{}}],["pullstream",{"_index":5015,"title":{},"content":{"875":{"position":[[4196,11],[4409,11],[6511,11],[6886,10],[6935,11],[7577,11],[7756,11],[8517,11]]},"983":{"position":[[1010,11]]},"985":{"position":[[92,11],[195,11],[493,11],[547,11]]},"988":{"position":[[5071,11]]}},"keywords":{}}],["pullstream$.asobserv",{"_index":5473,"title":{},"content":{"988":{"position":[[4841,26]]}},"keywords":{}}],["pullstream$.next('resync",{"_index":5485,"title":{},"content":{"988":{"position":[[6131,27]]}},"keywords":{}}],["pullstream$.next(event.data",{"_index":5480,"title":{},"content":{"988":{"position":[[5573,29]]}},"keywords":{}}],["pullstream$.subscribe(ev",{"_index":5043,"title":{},"content":{"875":{"position":[[7402,27]]}},"keywords":{}}],["pullstreambuilderfromrxschema",{"_index":5168,"title":{},"content":{"889":{"position":[[907,31]]}},"keywords":{}}],["pullstreamquerybuild",{"_index":5134,"title":{},"content":{"886":{"position":[[3466,22],[3737,22],[4225,23]]}},"keywords":{}}],["punch",{"_index":5237,"title":{},"content":{"901":{"position":[[339,5]]}},"keywords":{}}],["purchas",{"_index":1891,"title":{},"content":{"314":{"position":[[999,8]]},"420":{"position":[[1069,8]]},"662":{"position":[[1059,10]]},"710":{"position":[[889,10]]},"724":{"position":[[66,9]]},"749":{"position":[[9344,9]]},"838":{"position":[[1547,10]]},"958":{"position":[[652,8]]},"1129":{"position":[[55,10]]},"1141":{"position":[[55,10]]},"1210":{"position":[[271,10]]}},"keywords":{}}],["pure",{"_index":1582,"title":{},"content":{"261":{"position":[[66,4]]},"354":{"position":[[1006,6]]},"412":{"position":[[6575,6],[8417,6]]},"414":{"position":[[250,6]]},"476":{"position":[[21,6]]},"566":{"position":[[1066,6]]},"839":{"position":[[1213,6]]},"1219":{"position":[[636,4]]}},"keywords":{}}],["purg",{"_index":3748,"title":{},"content":{"653":{"position":[[442,6]]},"654":{"position":[[338,5]]},"655":{"position":[[71,7],[361,5],[456,5]]},"837":{"position":[[482,5]]},"1047":{"position":[[74,5],[189,5]]},"1198":{"position":[[557,7]]}},"keywords":{}}],["purpos",{"_index":2913,"title":{},"content":{"434":{"position":[[387,8]]},"554":{"position":[[356,9]]},"614":{"position":[[979,7]]},"749":{"position":[[5749,7]]},"829":{"position":[[3074,8]]},"875":{"position":[[9024,7]]},"906":{"position":[[322,8]]},"1316":{"position":[[2045,8],[3682,7]]}},"keywords":{}}],["purposes.sqlit",{"_index":3286,"title":{},"content":{"524":{"position":[[578,15]]}},"keywords":{}}],["pursuit",{"_index":2137,"title":{},"content":{"373":{"position":[[710,7]]}},"keywords":{}}],["push",{"_index":347,"title":{},"content":{"20":{"position":[[40,6]]},"99":{"position":[[73,6]]},"209":{"position":[[711,5]]},"226":{"position":[[69,6]]},"255":{"position":[[1063,5]]},"261":{"position":[[812,5],[833,4]]},"408":{"position":[[5,4]]},"410":{"position":[[1756,4]]},"412":{"position":[[2676,7],[4727,6]]},"476":{"position":[[110,4]]},"481":{"position":[[30,6],[768,5]]},"491":{"position":[[287,6],[1282,6]]},"496":{"position":[[721,4],[766,4]]},"510":{"position":[[542,4]]},"571":{"position":[[521,4]]},"582":{"position":[[345,6]]},"584":{"position":[[152,6]]},"610":{"position":[[158,4]]},"612":{"position":[[52,4]]},"618":{"position":[[544,4],[637,4]]},"630":{"position":[[842,4]]},"632":{"position":[[74,7],[2336,4],[2494,5]]},"749":{"position":[[485,4],[15754,4],[15892,4]]},"781":{"position":[[476,4]]},"846":{"position":[[1076,5]]},"848":{"position":[[870,5],[1552,5]]},"852":{"position":[[340,5]]},"854":{"position":[[833,4],[994,5]]},"858":{"position":[[374,5]]},"862":{"position":[[1407,5]]},"863":{"position":[[367,4]]},"866":{"position":[[875,5]]},"871":{"position":[[178,6]]},"872":{"position":[[2603,5],[4619,5]]},"875":{"position":[[522,5],[3565,4],[5719,4],[5979,4],[6002,4],[6178,5]]},"878":{"position":[[537,5]]},"885":{"position":[[258,4]]},"886":{"position":[[2058,4],[2085,4],[2598,4],[2768,5],[2900,6],[3000,6],[4044,5]]},"887":{"position":[[383,5]]},"888":{"position":[[524,5]]},"889":{"position":[[48,4],[573,5]]},"898":{"position":[[1983,4],[3871,5]]},"904":{"position":[[3098,5]]},"907":{"position":[[375,5]]},"911":{"position":[[843,5]]},"982":{"position":[[160,4],[370,6]]},"986":{"position":[[1605,4]]},"988":{"position":[[2386,5],[2400,4],[2444,4],[2767,5],[2969,4],[3066,4],[3170,4]]},"990":{"position":[[974,5]]},"993":{"position":[[378,4]]},"1002":{"position":[[17,4],[76,4],[202,4],[455,4],[668,5]]},"1004":{"position":[[234,4],[261,6],[530,6]]},"1005":{"position":[[119,6]]},"1007":{"position":[[588,4],[1626,5]]},"1101":{"position":[[795,5]]},"1121":{"position":[[761,5]]},"1308":{"position":[[607,6]]},"1309":{"position":[[229,4],[653,6]]}},"keywords":{}}],["push.filt",{"_index":4885,"title":{},"content":{"858":{"position":[[119,11]]}},"keywords":{}}],["push.handl",{"_index":5013,"title":{},"content":{"875":{"position":[[3647,13],[6039,12]]}},"keywords":{}}],["push.initialcheckpoint",{"_index":5536,"title":{},"content":{"1002":{"position":[[141,23]]}},"keywords":{}}],["push.responsemodifi",{"_index":5160,"title":{"889":{"position":[[0,22]]}},"content":{},"keywords":{}}],["push/pul",{"_index":953,"title":{"68":{"position":[[0,9]]},"99":{"position":[[0,9]]},"226":{"position":[[0,9]]}},"content":{"68":{"position":[[27,9]]},"99":{"position":[[35,9]]},"226":{"position":[[35,9]]},"360":{"position":[[475,9]]},"986":{"position":[[634,9]]}},"keywords":{}}],["pushes/pul",{"_index":2611,"title":{},"content":{"411":{"position":[[1453,12]]}},"keywords":{}}],["pushhandl",{"_index":5444,"title":{},"content":{"983":{"position":[[940,13]]},"987":{"position":[[343,14]]}},"keywords":{}}],["pushhuman",{"_index":5133,"title":{},"content":{"886":{"position":[[2522,12]]}},"keywords":{}}],["pushhuman($writerow",{"_index":5130,"title":{},"content":{"886":{"position":[[2334,21]]}},"keywords":{}}],["pushhuman(row",{"_index":5087,"title":{},"content":{"885":{"position":[[1168,15]]},"889":{"position":[[327,15]]}},"keywords":{}}],["pushhuman(writerow",{"_index":5131,"title":{},"content":{"886":{"position":[[2380,20]]}},"keywords":{}}],["pushing/pul",{"_index":5253,"title":{},"content":{"903":{"position":[[520,15]]}},"keywords":{}}],["pushquerybuild",{"_index":5129,"title":{},"content":{"886":{"position":[[2277,16],[2790,17],[4082,16]]}},"keywords":{}}],["pushquerybuilderfromrxschema",{"_index":5169,"title":{},"content":{"889":{"position":[[943,30]]}},"keywords":{}}],["pushrespons",{"_index":5161,"title":{},"content":{"889":{"position":[[141,12],[252,12],[366,13]]}},"keywords":{}}],["put",{"_index":2733,"title":{},"content":{"412":{"position":[[9045,7]]},"454":{"position":[[918,3]]},"458":{"position":[[381,4]]},"616":{"position":[[776,3]]},"851":{"position":[[194,3],[392,5]]},"988":{"position":[[477,3]]},"1088":{"position":[[733,3]]},"1089":{"position":[[52,3]]},"1226":{"position":[[421,3]]},"1264":{"position":[[331,3]]}},"keywords":{}}],["putattach",{"_index":5287,"title":{"917":{"position":[[0,16]]}},"content":{"918":{"position":[[9,15]]}},"keywords":{}}],["putattachmentbase64",{"_index":5293,"title":{"918":{"position":[[0,22]]}},"content":{"917":{"position":[[566,21]]}},"keywords":{}}],["pwa",{"_index":2141,"title":{"499":{"position":[[44,5]]},"501":{"position":[[47,5]]}},"content":{"375":{"position":[[911,7]]},"384":{"position":[[128,3]]},"500":{"position":[[245,4],[360,4],[633,4],[705,4]]},"501":{"position":[[17,4],[348,5]]},"502":{"position":[[212,5],[319,4],[415,4],[743,4],[1272,4]]},"503":{"position":[[250,4]]},"504":{"position":[[524,4],[567,3],[643,3],[1252,4]]},"506":{"position":[[15,4]]},"507":{"position":[[48,5]]},"508":{"position":[[133,4]]},"509":{"position":[[42,4]]},"510":{"position":[[186,4],[419,5],[457,4],[666,4]]},"584":{"position":[[242,6]]},"783":{"position":[[361,4]]},"1302":{"position":[[113,3]]}},"keywords":{}}],["python",{"_index":1543,"title":{},"content":{"249":{"position":[[129,7]]}},"keywords":{}}],["qa",{"_index":1788,"title":{},"content":{"301":{"position":[[528,3]]}},"keywords":{}}],["qu1",{"_index":4152,"title":{},"content":{"749":{"position":[[1651,3]]}},"keywords":{}}],["qu10",{"_index":4163,"title":{},"content":{"749":{"position":[[2200,4]]}},"keywords":{}}],["qu11",{"_index":4164,"title":{},"content":{"749":{"position":[[2294,4]]}},"keywords":{}}],["qu12",{"_index":4167,"title":{},"content":{"749":{"position":[[2387,4]]}},"keywords":{}}],["qu13",{"_index":4168,"title":{},"content":{"749":{"position":[[2472,4]]}},"keywords":{}}],["qu14",{"_index":4169,"title":{},"content":{"749":{"position":[[2589,4]]}},"keywords":{}}],["qu15",{"_index":4171,"title":{},"content":{"749":{"position":[[2830,4]]}},"keywords":{}}],["qu16",{"_index":4172,"title":{},"content":{"749":{"position":[[2943,4]]}},"keywords":{}}],["qu17",{"_index":4175,"title":{},"content":{"749":{"position":[[3176,4]]}},"keywords":{}}],["qu18",{"_index":4177,"title":{},"content":{"749":{"position":[[3296,4]]}},"keywords":{}}],["qu19",{"_index":4180,"title":{},"content":{"749":{"position":[[3652,4]]}},"keywords":{}}],["qu4",{"_index":4155,"title":{},"content":{"749":{"position":[[1748,3]]}},"keywords":{}}],["qu5",{"_index":4157,"title":{},"content":{"749":{"position":[[1865,3]]}},"keywords":{}}],["qu6",{"_index":4159,"title":{},"content":{"749":{"position":[[1991,3]]}},"keywords":{}}],["qu9",{"_index":4161,"title":{},"content":{"749":{"position":[[2094,3]]}},"keywords":{}}],["qualiti",{"_index":1420,"title":{},"content":{"232":{"position":[[201,7]]},"387":{"position":[[372,9]]}},"keywords":{}}],["quarter",{"_index":6453,"title":{},"content":{"1295":{"position":[[1080,7]]}},"keywords":{}}],["queri",{"_index":273,"title":{"53":{"position":[[9,7]]},"77":{"position":[[11,7]]},"78":{"position":[[19,7]]},"92":{"position":[[8,7]]},"103":{"position":[[11,7]]},"108":{"position":[[19,7]]},"124":{"position":[[11,8]]},"130":{"position":[[46,6]]},"159":{"position":[[11,8]]},"185":{"position":[[11,8]]},"205":{"position":[[18,8]]},"220":{"position":[[18,8]]},"233":{"position":[[11,7]]},"234":{"position":[[19,7]]},"252":{"position":[[16,5]]},"270":{"position":[[12,8]]},"275":{"position":[[11,8]]},"276":{"position":[[6,5]]},"329":{"position":[[11,8]]},"400":{"position":[[19,5]]},"518":{"position":[[11,8]]},"540":{"position":[[9,7]]},"555":{"position":[[17,8]]},"585":{"position":[[11,7]]},"600":{"position":[[9,7]]},"714":{"position":[[0,8]]},"796":{"position":[[9,5]]},"799":{"position":[[7,5]]},"801":{"position":[[8,7]]},"817":{"position":[[20,8]]},"819":{"position":[[0,5]]},"1064":{"position":[[0,5]]},"1065":{"position":[[0,5]]},"1105":{"position":[[0,5]]},"1110":{"position":[[7,7]]},"1150":{"position":[[21,8]]},"1238":{"position":[[5,5]]},"1252":{"position":[[12,8]]},"1315":{"position":[[11,7]]},"1321":{"position":[[8,5]]}},"content":{"16":{"position":[[252,5],[556,7]]},"17":{"position":[[447,5]]},"19":{"position":[[299,5],[347,7],[633,5],[805,5]]},"22":{"position":[[250,7]]},"23":{"position":[[452,5]]},"25":{"position":[[125,5],[187,5]]},"28":{"position":[[149,8]]},"32":{"position":[[138,5]]},"33":{"position":[[247,7],[359,7],[649,7]]},"34":{"position":[[179,7],[559,5],[617,5]]},"35":{"position":[[405,8],[672,9]]},"39":{"position":[[373,5]]},"40":{"position":[[548,8],[675,5]]},"45":{"position":[[264,5]]},"46":{"position":[[575,7],[663,7]]},"47":{"position":[[439,5],[469,7]]},"56":{"position":[[138,8]]},"64":{"position":[[149,8]]},"65":{"position":[[1022,8],[1044,7]]},"77":{"position":[[31,7],[204,5]]},"91":{"position":[[34,5],[77,7]]},"92":{"position":[[50,7],[160,5]]},"103":{"position":[[26,8],[244,5]]},"108":{"position":[[61,8],[162,5]]},"120":{"position":[[341,5]]},"124":{"position":[[24,8],[71,8],[114,7],[214,8]]},"130":{"position":[[211,5],[354,6],[506,5]]},"138":{"position":[[12,5],[146,5]]},"159":{"position":[[43,8],[93,8],[124,8],[175,7]]},"166":{"position":[[162,5]]},"173":{"position":[[1907,8],[1958,7],[2138,5],[2485,7],[2545,7]]},"174":{"position":[[174,7],[274,7],[1521,7],[1626,8],[1694,5],[1733,5]]},"182":{"position":[[234,7]]},"185":{"position":[[43,8],[62,7],[250,6]]},"188":{"position":[[3022,5],[3057,5],[3124,5],[3216,5]]},"194":{"position":[[42,5],[189,7]]},"197":{"position":[[203,5]]},"204":{"position":[[51,5],[160,7]]},"205":{"position":[[44,8],[316,5]]},"212":{"position":[[210,8],[246,7]]},"220":{"position":[[39,7],[139,6],[168,7]]},"224":{"position":[[193,7]]},"227":{"position":[[340,7]]},"233":{"position":[[43,8],[80,7]]},"234":{"position":[[25,7],[304,5]]},"251":{"position":[[11,7],[61,7]]},"252":{"position":[[13,5],[203,8],[327,5]]},"260":{"position":[[207,7]]},"262":{"position":[[203,5],[324,8],[345,5],[457,7]]},"263":{"position":[[215,8]]},"266":{"position":[[876,5]]},"270":{"position":[[13,8]]},"275":{"position":[[69,8]]},"276":{"position":[[14,5],[60,7],[270,5]]},"283":{"position":[[126,5]]},"322":{"position":[[200,5]]},"323":{"position":[[414,8],[464,7]]},"329":{"position":[[19,8],[53,8],[90,5]]},"335":{"position":[[43,5]]},"338":{"position":[[75,5]]},"342":{"position":[[30,7],[124,5]]},"346":{"position":[[275,7],[841,5]]},"354":{"position":[[701,8],[850,8],[1448,8]]},"356":{"position":[[649,7]]},"357":{"position":[[199,7]]},"360":{"position":[[221,7],[275,5],[315,5]]},"362":{"position":[[283,7],[875,8]]},"366":{"position":[[231,7],[366,5],[615,6]]},"368":{"position":[[245,8],[291,7]]},"369":{"position":[[120,9],[173,8],[412,5],[1195,7]]},"376":{"position":[[90,7],[501,8]]},"383":{"position":[[293,5]]},"390":{"position":[[71,8],[438,5],[679,5],[1011,9],[1256,6],[1277,5]]},"393":{"position":[[608,5],[1145,5]]},"394":{"position":[[124,5],[182,6],[400,5]]},"395":{"position":[[139,6],[233,7]]},"396":{"position":[[61,5]]},"398":{"position":[[423,8],[465,5],[1753,5],[3517,5]]},"400":{"position":[[1,5],[155,5],[274,7],[564,5],[754,5]]},"402":{"position":[[627,5],[1037,5],[1094,7],[1400,7],[1664,5],[2233,6]]},"404":{"position":[[615,5],[703,8],[765,5],[861,7],[912,5]]},"408":{"position":[[5117,5],[5221,7]]},"410":{"position":[[212,8]]},"411":{"position":[[673,7],[2302,7],[2715,8],[2856,8],[3000,5],[3234,7],[3345,5],[3491,5],[3560,5],[3672,5]]},"412":{"position":[[9103,5],[9517,5],[10618,5],[12668,5],[13430,8],[13591,7],[13975,5],[14140,7],[14305,8]]},"420":{"position":[[310,6]]},"430":{"position":[[226,8],[313,8]]},"432":{"position":[[458,9],[481,7],[645,7],[1132,7]]},"441":{"position":[[327,9]]},"442":{"position":[[24,5]]},"452":{"position":[[282,7]]},"453":{"position":[[743,5],[840,8]]},"455":{"position":[[177,5]]},"457":{"position":[[355,7],[629,7]]},"459":{"position":[[194,8]]},"468":{"position":[[274,7]]},"469":{"position":[[841,5],[1023,5]]},"479":{"position":[[154,7]]},"480":{"position":[[90,6]]},"483":{"position":[[322,7]]},"490":{"position":[[169,5],[581,8],[651,5]]},"494":{"position":[[555,6]]},"502":{"position":[[614,8],[635,7],[653,8],[734,8],[1057,5]]},"510":{"position":[[281,8]]},"518":{"position":[[87,8],[151,8],[202,5],[265,7],[524,5]]},"523":{"position":[[294,5],[383,5]]},"527":{"position":[[149,5]]},"534":{"position":[[617,7]]},"535":{"position":[[382,5],[409,5],[474,8],[531,5],[818,5]]},"540":{"position":[[136,7]]},"541":{"position":[[340,5],[352,5]]},"542":{"position":[[701,7]]},"548":{"position":[[348,8]]},"555":{"position":[[162,8],[385,5],[720,5],[811,7],[944,7]]},"556":{"position":[[1357,8]]},"559":{"position":[[1172,8]]},"560":{"position":[[702,8]]},"562":{"position":[[630,5],[747,8],[801,5],[941,8],[1193,5],[1223,7],[1627,8]]},"563":{"position":[[633,5]]},"566":{"position":[[199,5],[291,8],[346,5],[372,8]]},"571":{"position":[[715,5],[770,5],[827,5],[1087,5]]},"574":{"position":[[567,7]]},"575":{"position":[[629,8],[698,7]]},"580":{"position":[[6,7],[484,5],[630,5]]},"585":{"position":[[36,7]]},"587":{"position":[[69,7]]},"590":{"position":[[589,7],[615,5]]},"594":{"position":[[615,7]]},"595":{"position":[[386,5],[410,5],[437,5],[502,8],[551,8],[905,7]]},"600":{"position":[[103,7]]},"601":{"position":[[561,5],[573,5],[619,5]]},"602":{"position":[[150,7]]},"608":{"position":[[346,8]]},"630":{"position":[[540,9]]},"631":{"position":[[256,7]]},"632":{"position":[[282,7],[1694,5]]},"642":{"position":[[239,7]]},"659":{"position":[[772,5],[836,7]]},"661":{"position":[[143,5],[1535,7]]},"662":{"position":[[172,5],[468,5],[2656,6],[2759,6]]},"683":{"position":[[671,5]]},"686":{"position":[[316,5]]},"693":{"position":[[638,5]]},"698":{"position":[[545,5]]},"699":{"position":[[696,5]]},"701":{"position":[[563,5]]},"704":{"position":[[42,5]]},"705":{"position":[[554,7],[663,5],[1035,7]]},"709":{"position":[[772,8]]},"710":{"position":[[206,5],[1964,5],[2067,5]]},"711":{"position":[[195,5],[613,7],[1505,7],[1766,7],[1994,7],[2190,7]]},"714":{"position":[[464,8],[539,8],[578,7],[740,8],[920,6],[1119,5]]},"723":{"position":[[245,8],[528,7],[691,7],[784,8],[2063,5],[2138,8]]},"724":{"position":[[1254,6],[1340,6]]},"746":{"position":[[723,6]]},"749":{"position":[[2141,7],[2317,5],[2502,5],[2612,5],[2668,5],[2845,7],[2955,7],[3189,7],[3311,5],[3657,7],[10895,5],[14673,5]]},"772":{"position":[[321,5],[991,5]]},"775":{"position":[[478,7]]},"780":{"position":[[775,7]]},"781":{"position":[[776,5]]},"784":{"position":[[710,6]]},"786":{"position":[[24,5]]},"793":{"position":[[942,5],[1194,5]]},"796":{"position":[[18,8],[95,8],[177,5],[283,5],[344,5],[640,5],[782,5],[1042,5]]},"797":{"position":[[14,5],[126,7]]},"798":{"position":[[351,5],[534,5],[844,5],[966,5]]},"799":{"position":[[10,5],[101,5],[179,5],[433,5],[467,5],[672,5]]},"800":{"position":[[441,8],[534,5]]},"801":{"position":[[684,8],[944,5]]},"815":{"position":[[105,8],[188,7]]},"816":{"position":[[39,7],[69,7],[158,7],[242,7],[307,7],[391,7]]},"817":{"position":[[226,7],[269,5]]},"820":{"position":[[364,7],[448,8],[465,7],[492,5],[532,5]]},"821":{"position":[[80,7],[331,5],[713,5]]},"825":{"position":[[969,5]]},"826":{"position":[[767,5],[865,5]]},"829":{"position":[[2240,8],[2259,5],[2372,5],[2404,6],[2665,5],[2744,5],[2965,8],[3141,5],[3288,5],[3320,6],[3682,5]]},"835":{"position":[[877,5],[941,7]]},"836":{"position":[[145,5],[925,8],[1412,7],[1567,5]]},"837":{"position":[[629,5],[2076,5]]},"838":{"position":[[120,5],[201,5],[451,8],[1105,8],[2870,6],[2973,6]]},"839":{"position":[[738,7]]},"841":{"position":[[107,7],[268,5],[351,7],[370,5],[416,8],[458,8],[593,8],[1390,7]]},"857":{"position":[[223,6]]},"885":{"position":[[838,5]]},"886":{"position":[[200,5],[291,5],[566,5],[574,6],[776,6],[2250,5],[2315,5],[2500,6],[3515,5],[3691,6]]},"898":{"position":[[3640,5],[3679,5],[3738,5]]},"950":{"position":[[409,5]]},"965":{"position":[[141,5],[278,8]]},"1022":{"position":[[286,5],[918,5]]},"1023":{"position":[[579,5]]},"1033":{"position":[[115,7]]},"1047":{"position":[[171,8]]},"1055":{"position":[[104,7],[182,5]]},"1056":{"position":[[11,5],[90,5],[186,5],[306,5]]},"1057":{"position":[[60,6],[74,5],[221,8]]},"1058":{"position":[[208,5],[561,5]]},"1059":{"position":[[43,5],[218,5]]},"1060":{"position":[[65,5],[86,5]]},"1061":{"position":[[66,5],[87,5]]},"1062":{"position":[[143,5]]},"1063":{"position":[[53,6]]},"1064":{"position":[[16,5],[52,5],[86,5],[276,5],[296,5]]},"1065":{"position":[[47,7],[169,7],[470,8],[760,5],[1422,7],[1680,7],[1890,7],[1973,5]]},"1066":{"position":[[17,5],[62,5],[148,5],[248,5],[326,6],[340,5],[650,5]]},"1067":{"position":[[57,6],[130,5],[208,5],[282,5],[390,8],[616,7],[662,7],[793,5],[880,5],[975,7],[1036,7],[1276,5],[1543,5],[1670,8],[1702,5],[1897,5],[2253,8]]},"1068":{"position":[[34,8]]},"1069":{"position":[[82,5]]},"1071":{"position":[[54,5],[127,5],[155,7],[221,7],[365,5],[424,7],[526,8]]},"1072":{"position":[[61,6],[243,8],[650,8],[1084,5],[1215,8],[1302,7],[1361,7],[1555,7],[1955,7],[2456,5],[2549,6],[2634,5],[2807,7]]},"1079":{"position":[[583,5]]},"1080":{"position":[[1125,8]]},"1085":{"position":[[628,5]]},"1102":{"position":[[529,9],[1114,5]]},"1105":{"position":[[5,5],[178,5],[232,5],[307,5],[453,5],[530,5],[628,6],[699,6],[937,7]]},"1107":{"position":[[234,5],[423,6]]},"1110":{"position":[[8,7]]},"1123":{"position":[[584,8]]},"1124":{"position":[[1098,5],[1724,5]]},"1132":{"position":[[187,5],[569,8],[612,8],[774,7],[865,7],[908,7]]},"1137":{"position":[[207,7]]},"1138":{"position":[[382,7],[464,5],[490,8]]},"1143":{"position":[[394,7]]},"1149":{"position":[[333,5]]},"1150":{"position":[[72,5],[210,8],[260,7],[350,5]]},"1158":{"position":[[638,5]]},"1164":{"position":[[431,7]]},"1165":{"position":[[1026,8]]},"1170":{"position":[[1,7]]},"1174":{"position":[[514,7],[706,8]]},"1180":{"position":[[367,7]]},"1184":{"position":[[41,7],[191,7]]},"1188":{"position":[[373,7]]},"1192":{"position":[[119,7]]},"1194":{"position":[[706,6],[800,6]]},"1198":{"position":[[242,5],[543,8],[1028,7],[1282,7]]},"1209":{"position":[[490,8]]},"1222":{"position":[[652,5]]},"1238":{"position":[[101,7],[220,7]]},"1246":{"position":[[1364,5]]},"1249":{"position":[[152,5],[422,5],[439,9],[461,5],[473,5]]},"1250":{"position":[[475,5]]},"1251":{"position":[[135,5],[193,7],[308,7]]},"1252":{"position":[[27,8],[58,7],[121,5],[361,7]]},"1257":{"position":[[83,5],[110,5]]},"1271":{"position":[[483,7],[692,5]]},"1294":{"position":[[273,5],[2077,5]]},"1295":{"position":[[1200,8],[1400,5],[1421,5]]},"1296":{"position":[[21,5],[252,5]]},"1300":{"position":[[669,5]]},"1314":{"position":[[422,5]]},"1315":{"position":[[61,7],[361,5],[979,8],[1162,5],[1263,5],[1353,6],[1543,9]]},"1316":{"position":[[768,5],[971,5],[1575,8],[1615,8],[1635,5],[1680,6],[1713,8],[1734,6],[1769,7],[1815,7],[2189,5],[2389,7],[3077,5],[3275,5],[3436,6]]},"1317":{"position":[[332,5],[394,5],[474,5],[566,5],[681,7],[763,5]]},"1318":{"position":[[344,5],[368,5],[404,5],[508,5],[679,5],[747,7],[894,5],[1028,5],[1165,5]]},"1320":{"position":[[395,7]]},"1321":{"position":[[214,5],[249,5],[370,5],[465,6],[510,7],[590,5],[833,7],[918,7],[995,5],[1063,7]]},"1322":{"position":[[97,5],[315,7],[443,5]]},"1323":{"position":[[28,7]]}},"keywords":{}}],["queries.cockroach",{"_index":6579,"title":{},"content":{"1324":{"position":[[641,17]]}},"keywords":{}}],["queries.it",{"_index":6562,"title":{},"content":{"1316":{"position":[[3007,10]]}},"keywords":{}}],["queries.strong",{"_index":2020,"title":{},"content":{"354":{"position":[[418,14]]}},"keywords":{}}],["queriesful",{"_index":1906,"title":{},"content":{"317":{"position":[[133,11]]}},"keywords":{}}],["queriesminim",{"_index":1883,"title":{},"content":{"311":{"position":[[227,17]]}},"keywords":{}}],["queriesmqueri",{"_index":5763,"title":{},"content":{"1065":{"position":[[123,13]]}},"keywords":{}}],["query'",{"_index":3465,"title":{},"content":{"571":{"position":[[979,7]]},"1102":{"position":[[1194,7]]},"1322":{"position":[[538,7]]}},"keywords":{}}],["query.$().listen((result",{"_index":1290,"title":{},"content":{"188":{"position":[[3222,26]]}},"keywords":{}}],["query.$.subscribe((newhero",{"_index":3543,"title":{},"content":{"601":{"position":[[625,29]]}},"keywords":{}}],["query.$.subscribe(amount",{"_index":5774,"title":{},"content":{"1067":{"position":[[512,24]]}},"keywords":{}}],["query.$.subscribe(newhero",{"_index":3309,"title":{},"content":{"541":{"position":[[400,27]]},"562":{"position":[[1298,27]]}},"keywords":{}}],["query.$.subscribe(result",{"_index":978,"title":{},"content":{"77":{"position":[[284,25]]},"103":{"position":[[324,25]]},"234":{"position":[[384,25]]},"1058":{"position":[[254,25]]}},"keywords":{}}],["query.eq("status"",{"_index":5221,"title":{},"content":{"898":{"position":[[3815,28]]}},"keywords":{}}],["query.exec",{"_index":4662,"title":{},"content":{"799":{"position":[[809,13]]},"1057":{"position":[[125,13]]},"1064":{"position":[[366,13]]},"1067":{"position":[[461,13]]}},"keywords":{}}],["query.modify((docdata",{"_index":5751,"title":{},"content":{"1061":{"position":[[156,22]]}},"keywords":{}}],["query.patch",{"_index":5748,"title":{},"content":{"1060":{"position":[[155,13]]}},"keywords":{}}],["query.query/observ",{"_index":5943,"title":{},"content":{"1102":{"position":[[1157,19]]}},"keywords":{}}],["query.remov",{"_index":5754,"title":{},"content":{"1062":{"position":[[276,15]]}},"keywords":{}}],["query.selector.us",{"_index":6296,"title":{},"content":{"1252":{"position":[[289,19]]}},"keywords":{}}],["query.selector.userid",{"_index":5955,"title":{},"content":{"1105":{"position":[[637,21]]}},"keywords":{}}],["query.subscrib",{"_index":4661,"title":{},"content":{"799":{"position":[[712,18]]}},"keywords":{}}],["query.upd",{"_index":5745,"title":{},"content":{"1059":{"position":[[287,14]]}},"keywords":{}}],["query/writ",{"_index":1615,"title":{},"content":{"266":{"position":[[1048,11]]},"1246":{"position":[[1513,11]]}},"keywords":{}}],["querya.selector",{"_index":6297,"title":{},"content":{"1252":{"position":[[388,15],[416,16]]}},"keywords":{}}],["queryabl",{"_index":2901,"title":{},"content":{"430":{"position":[[177,10]]}},"keywords":{}}],["queryb.selector",{"_index":6298,"title":{},"content":{"1252":{"position":[[433,15]]}},"keywords":{}}],["querybuild",{"_index":5120,"title":{},"content":{"886":{"position":[[860,13],[1144,13],[1183,12],[2119,13],[2561,13],[2776,13],[2815,12],[4068,13],[4173,13]]},"887":{"position":[[410,13]]},"898":{"position":[[3662,13]]}},"keywords":{}}],["querycach",{"_index":4697,"title":{"814":{"position":[[0,10]]}},"content":{"818":{"position":[[160,10]]}},"keywords":{}}],["querymodifi",{"_index":5950,"title":{},"content":{"1104":{"position":[[224,13],[466,13]]},"1105":{"position":[[816,14],[878,13],[1045,13]]},"1107":{"position":[[367,13]]}},"keywords":{}}],["queryobject",{"_index":4233,"title":{},"content":{"749":{"position":[[7338,11]]},"1069":{"position":[[454,11]]}},"keywords":{}}],["queryobject.exec",{"_index":5787,"title":{},"content":{"1069":{"position":[[619,19]]}},"keywords":{}}],["queryobject.sort('nam",{"_index":5786,"title":{},"content":{"1069":{"position":[[571,25],[728,25]]}},"keywords":{}}],["queryobjectsort",{"_index":5788,"title":{},"content":{"1069":{"position":[[710,15]]}},"keywords":{}}],["queryobjectsort.exec",{"_index":5789,"title":{},"content":{"1069":{"position":[[776,23]]}},"keywords":{}}],["querypullhuman",{"_index":5076,"title":{},"content":{"885":{"position":[[152,14]]}},"keywords":{}}],["queryresult",{"_index":2317,"title":{},"content":{"394":{"position":[[862,11]]}},"keywords":{}}],["querysub",{"_index":977,"title":{},"content":{"77":{"position":[[273,8]]},"103":{"position":[[313,8]]},"234":{"position":[[373,8]]},"1058":{"position":[[243,8]]}},"keywords":{}}],["querysub.unsubscrib",{"_index":5744,"title":{},"content":{"1058":{"position":[[567,22]]}},"keywords":{}}],["queryvector",{"_index":2309,"title":{},"content":{"394":{"position":[[631,11]]}},"keywords":{}}],["question",{"_index":2176,"title":{},"content":{"387":{"position":[[322,10]]},"412":{"position":[[10244,8]]},"483":{"position":[[894,9]]},"873":{"position":[[191,9]]},"899":{"position":[[399,9]]},"913":{"position":[[292,9]]}},"keywords":{}}],["queu",{"_index":615,"title":{},"content":{"39":{"position":[[112,6]]},"375":{"position":[[775,7]]},"418":{"position":[[613,6]]},"419":{"position":[[470,7]]}},"keywords":{}}],["queue",{"_index":2785,"title":{},"content":{"416":{"position":[[156,6]]},"1177":{"position":[[553,5]]}},"keywords":{}}],["quic",{"_index":3618,"title":{},"content":{"613":{"position":[[143,4]]}},"keywords":{}}],["quick",{"_index":1378,"title":{"211":{"position":[[0,5]]},"314":{"position":[[0,5]]},"480":{"position":[[0,5]]},"562":{"position":[[5,5]]},"1235":{"position":[[0,5]]}},"content":{"212":{"position":[[558,5]]},"321":{"position":[[93,5]]},"383":{"position":[[274,5]]},"385":{"position":[[121,5]]},"396":{"position":[[418,5]]},"417":{"position":[[92,5]]},"429":{"position":[[377,5]]},"723":{"position":[[1769,6]]},"836":{"position":[[409,5],[530,5],[657,5]]},"837":{"position":[[1382,5],[1408,5],[1820,5]]},"838":{"position":[[1354,5],[1834,5],[2018,5]]},"906":{"position":[[750,5]]},"1147":{"position":[[201,5]]},"1277":{"position":[[26,5],[320,5],[610,5]]}},"keywords":{}}],["quicker",{"_index":1661,"title":{},"content":{"283":{"position":[[264,7]]}},"keywords":{}}],["quickj",{"_index":1243,"title":{},"content":{"188":{"position":[[138,7]]}},"keywords":{}}],["quickli",{"_index":887,"title":{},"content":{"61":{"position":[[148,7]]},"65":{"position":[[295,7]]},"84":{"position":[[277,7]]},"114":{"position":[[290,7]]},"149":{"position":[[290,7]]},"175":{"position":[[283,7]]},"217":{"position":[[205,7]]},"241":{"position":[[162,7]]},"285":{"position":[[112,7]]},"318":{"position":[[183,7]]},"321":{"position":[[389,7]]},"347":{"position":[[290,7]]},"358":{"position":[[439,7]]},"362":{"position":[[1361,7]]},"373":{"position":[[162,7]]},"408":{"position":[[2300,8]]},"477":{"position":[[101,7]]},"511":{"position":[[290,7]]},"531":{"position":[[290,7]]},"559":{"position":[[869,7],[1696,7]]},"591":{"position":[[290,7]]},"630":{"position":[[995,7]]},"639":{"position":[[23,8]]},"723":{"position":[[169,8],[712,8]]},"1147":{"position":[[452,7]]}},"keywords":{}}],["quickly.improv",{"_index":1206,"title":{},"content":{"173":{"position":[[1867,16]]}},"keywords":{}}],["quickstart",{"_index":883,"title":{"823":{"position":[[5,10]]}},"content":{"61":{"position":[[49,10],[124,11],[170,11]]},"84":{"position":[[253,11],[321,10]]},"114":{"position":[[266,11],[334,10]]},"149":{"position":[[266,11],[334,10]]},"175":{"position":[[259,11],[327,10]]},"241":{"position":[[126,11]]},"263":{"position":[[399,10]]},"285":{"position":[[408,11]]},"306":{"position":[[235,11]]},"318":{"position":[[383,10]]},"347":{"position":[[266,11],[334,10]]},"362":{"position":[[1337,11],[1405,10]]},"373":{"position":[[126,11]]},"388":{"position":[[58,10]]},"498":{"position":[[141,10],[262,10]]},"511":{"position":[[266,11],[334,10]]},"531":{"position":[[266,11],[334,10]]},"548":{"position":[[37,10]]},"557":{"position":[[37,10]]},"567":{"position":[[343,10]]},"591":{"position":[[266,11],[334,10]]},"608":{"position":[[37,10]]},"644":{"position":[[20,10]]},"663":{"position":[[72,10]]},"712":{"position":[[56,10]]},"776":{"position":[[106,10]]},"793":{"position":[[44,10]]},"824":{"position":[[126,10]]},"842":{"position":[[206,10]]},"904":{"position":[[206,10]]},"913":{"position":[[20,10],[185,10]]},"1125":{"position":[[861,10]]}},"keywords":{}}],["quickstartcheck",{"_index":2514,"title":{},"content":{"405":{"position":[[129,15]]},"471":{"position":[[114,15]]},"628":{"position":[[216,15]]}},"keywords":{}}],["quickstartdiscov",{"_index":3472,"title":{},"content":{"572":{"position":[[20,18]]}},"keywords":{}}],["quickstartdownsid",{"_index":4596,"title":{},"content":{"786":{"position":[[57,19]]}},"keywords":{}}],["quickstartif",{"_index":3209,"title":{},"content":{"498":{"position":[[98,12]]}},"keywords":{}}],["quickstartjoin",{"_index":1699,"title":{},"content":{"296":{"position":[[56,14]]}},"keywords":{}}],["quickstartwhi",{"_index":2935,"title":{},"content":{"442":{"position":[[57,13]]}},"keywords":{}}],["quietli",{"_index":3171,"title":{},"content":{"491":{"position":[[1064,7]]}},"keywords":{}}],["quit",{"_index":2051,"title":{},"content":{"357":{"position":[[425,5]]},"495":{"position":[[874,5]]},"1300":{"position":[[1021,5]]},"1322":{"position":[[186,5]]}},"keywords":{}}],["quot",{"_index":3633,"title":{},"content":{"617":{"position":[[426,5]]},"711":{"position":[[1358,9]]},"749":{"position":[[11821,5],[11827,8]]}},"keywords":{}}],["quot;$$"",{"_index":5863,"title":{},"content":{"1084":{"position":[[950,15]]}},"keywords":{}}],["quot;$"",{"_index":5862,"title":{},"content":{"1084":{"position":[[935,14]]}},"keywords":{}}],["quot;$(pwd)"/appwrite:/usr/src/code/appwrite:rw",{"_index":4896,"title":{},"content":{"861":{"position":[[630,53]]}},"keywords":{}}],["quot;@xenova/transformers"",{"_index":2217,"title":{},"content":{"391":{"position":[[449,33]]}},"keywords":{}}],["quot;_data"",{"_index":5853,"title":{},"content":{"1084":{"position":[[695,18]]}},"keywords":{}}],["quot;_deleted"",{"_index":5202,"title":{},"content":{"898":{"position":[[1084,20]]},"986":{"position":[[1128,21]]}},"keywords":{}}],["quot;_modified"",{"_index":5203,"title":{},"content":{"898":{"position":[[1137,21]]}},"keywords":{}}],["quot;_propertycache"",{"_index":5854,"title":{},"content":{"1084":{"position":[[714,27]]}},"keywords":{}}],["quot;_savedata"",{"_index":5882,"title":{},"content":{"1084":{"position":[[1408,22]]}},"keywords":{}}],["quot;active"",{"_index":5222,"title":{},"content":{"898":{"position":[[3844,20]]}},"keywords":{}}],["quot;age"",{"_index":5201,"title":{},"content":{"898":{"position":[[1059,15]]}},"keywords":{}}],["quot;aggregation"",{"_index":5796,"title":{},"content":{"1072":{"position":[[702,23]]}},"keywords":{}}],["quot;al",{"_index":5632,"title":{},"content":{"1022":{"position":[[928,9]]},"1023":{"position":[[589,9]]}},"keywords":{}}],["quot;alice"",{"_index":5445,"title":{},"content":{"986":{"position":[[796,18]]}},"keywords":{}}],["quot;allattachments$"",{"_index":5877,"title":{},"content":{"1084":{"position":[[1279,28]]}},"keywords":{}}],["quot;allattachments"",{"_index":5876,"title":{},"content":{"1084":{"position":[[1251,27]]}},"keywords":{}}],["quot;amount"",{"_index":1836,"title":{},"content":{"303":{"position":[[695,19],[756,19]]},"361":{"position":[[692,19],[753,19]]}},"keywords":{}}],["quot;an",{"_index":365,"title":{},"content":{"22":{"position":[[29,8]]}},"keywords":{}}],["quot;ani",{"_index":2672,"title":{},"content":{"412":{"position":[[2774,9]]}},"keywords":{}}],["quot;app",{"_index":2799,"title":{},"content":{"419":{"position":[[322,10]]}},"keywords":{}}],["quot;array"",{"_index":2366,"title":{},"content":{"397":{"position":[[795,18]]},"1074":{"position":[[1476,18]]}},"keywords":{}}],["quot;at",{"_index":3657,"title":{},"content":{"619":{"position":[[84,8]]}},"keywords":{}}],["quot;attachments"",{"_index":5830,"title":{},"content":{"1074":{"position":[[1874,24]]}},"keywords":{}}],["quot;average"",{"_index":2554,"title":{},"content":{"408":{"position":[[2948,19]]},"462":{"position":[[700,19]]}},"keywords":{}}],["quot;aw",{"_index":309,"title":{},"content":{"18":{"position":[[280,9]]}},"keywords":{}}],["quot;awesom",{"_index":1525,"title":{},"content":{"244":{"position":[[1493,13]]}},"keywords":{}}],["quot;birthyear"",{"_index":5822,"title":{},"content":{"1074":{"position":[[1292,22]]}},"keywords":{}}],["quot;boat"",{"_index":2348,"title":{},"content":{"396":{"position":[[1388,16]]}},"keywords":{}}],["quot;branches"",{"_index":5916,"title":{},"content":{"1092":{"position":[[140,21]]},"1093":{"position":[[24,20]]}},"keywords":{}}],["quot;brand"",{"_index":2038,"title":{},"content":{"356":{"position":[[479,20]]}},"keywords":{}}],["quot;brandx"",{"_index":2039,"title":{},"content":{"356":{"position":[[500,19]]}},"keywords":{}}],["quot;brows",{"_index":3982,"title":{},"content":{"707":{"position":[[314,13]]}},"keywords":{}}],["quot;browser"",{"_index":6143,"title":{},"content":{"1176":{"position":[[552,20]]}},"keywords":{}}],["quot;calculated"",{"_index":2629,"title":{},"content":{"411":{"position":[[3581,22]]}},"keywords":{}}],["quot;capacitorsqlite"",{"_index":3792,"title":{},"content":{"661":{"position":[[654,28]]},"662":{"position":[[1422,28]]},"1279":{"position":[[121,28]]}},"keywords":{}}],["quot;clear",{"_index":2726,"title":{},"content":{"412":{"position":[[8116,11]]}},"keywords":{}}],["quot;client",{"_index":1495,"title":{},"content":{"244":{"position":[[642,12]]},"617":{"position":[[463,13]]}},"keywords":{}}],["quot;close"",{"_index":5885,"title":{},"content":{"1084":{"position":[[1482,18]]}},"keywords":{}}],["quot;closedupl",{"_index":4211,"title":{},"content":{"749":{"position":[[5869,22]]}},"keywords":{}}],["quot;collection"",{"_index":5852,"title":{},"content":{"1084":{"position":[[671,23]]}},"keywords":{}}],["quot;color"",{"_index":1285,"title":{},"content":{"188":{"position":[[2966,18]]},"1074":{"position":[[1051,18],[1808,17]]}},"keywords":{}}],["quot;correct"",{"_index":2686,"title":{},"content":{"412":{"position":[[4061,19]]}},"keywords":{}}],["quot;corrine"",{"_index":1830,"title":{},"content":{"303":{"position":[[562,20],[822,20]]},"361":{"position":[[559,20],[819,20]]}},"keywords":{}}],["quot;damage"",{"_index":5828,"title":{},"content":{"1074":{"position":[[1696,19]]}},"keywords":{}}],["quot;dat",{"_index":5888,"title":{},"content":{"1085":{"position":[[448,10]]}},"keywords":{}}],["quot;databas",{"_index":1506,"title":{},"content":{"244":{"position":[[965,14]]}},"keywords":{}}],["quot;datastore"",{"_index":5915,"title":{},"content":{"1092":{"position":[[105,21]]},"1094":{"position":[[287,21],[321,21]]}},"keywords":{}}],["quot;datastores"",{"_index":5917,"title":{},"content":{"1092":{"position":[[592,22]]}},"keywords":{}}],["quot;deleted$$"",{"_index":5860,"title":{},"content":{"1084":{"position":[[868,22]]}},"keywords":{}}],["quot;deleted$"",{"_index":5859,"title":{},"content":{"1084":{"position":[[846,21]]}},"keywords":{}}],["quot;deleted"",{"_index":4901,"title":{},"content":{"861":{"position":[[1956,19]]},"898":{"position":[[409,20]]},"1084":{"position":[[891,20],[1501,20]]}},"keywords":{}}],["quot;dependencies"",{"_index":4077,"title":{},"content":{"731":{"position":[[102,25]]},"760":{"position":[[106,25]]}},"keywords":{}}],["quot;describ",{"_index":5816,"title":{},"content":{"1074":{"position":[[771,15]]}},"keywords":{}}],["quot;description"",{"_index":5815,"title":{},"content":{"1074":{"position":[[746,24]]}},"keywords":{}}],["quot;dumb,"",{"_index":2668,"title":{},"content":{"412":{"position":[[2039,17]]}},"keywords":{}}],["quot;dump"",{"_index":5430,"title":{},"content":{"981":{"position":[[634,16]]}},"keywords":{}}],["quot;electron",{"_index":1485,"title":{},"content":{"244":{"position":[[321,14]]}},"keywords":{}}],["quot;embedding"",{"_index":2365,"title":{},"content":{"397":{"position":[[752,22],[1090,22]]}},"keywords":{}}],["quot;encrypted"",{"_index":5829,"title":{},"content":{"1074":{"position":[[1829,22],[1901,22]]}},"keywords":{}}],["quot;eventu",{"_index":3953,"title":{},"content":{"700":{"position":[[750,14]]}},"keywords":{}}],["quot;everyth",{"_index":3942,"title":{},"content":{"698":{"position":[[2510,16]]}},"keywords":{}}],["quot;exactli",{"_index":2632,"title":{},"content":{"411":{"position":[[4620,13]]}},"keywords":{}}],["quot;expo",{"_index":1505,"title":{},"content":{"244":{"position":[[933,10]]}},"keywords":{}}],["quot;fast",{"_index":3974,"title":{},"content":{"703":{"position":[[1445,10]]}},"keywords":{}}],["quot;features"",{"_index":2040,"title":{},"content":{"356":{"position":[[520,21]]}},"keywords":{}}],["quot;final"",{"_index":5823,"title":{},"content":{"1074":{"position":[[1355,18]]}},"keywords":{}}],["quot;find",{"_index":4014,"title":{},"content":{"714":{"position":[[591,10]]}},"keywords":{}}],["quot;firebas",{"_index":1450,"title":{},"content":{"243":{"position":[[214,14]]}},"keywords":{}}],["quot;firestor",{"_index":1451,"title":{},"content":{"243":{"position":[[280,15]]},"244":{"position":[[1175,15]]}},"keywords":{}}],["quot;first",{"_index":2696,"title":{},"content":{"412":{"position":[[5278,11]]}},"keywords":{}}],["quot;firstname"",{"_index":1829,"title":{},"content":{"303":{"position":[[539,22]]},"361":{"position":[[536,22]]},"898":{"position":[[986,21]]}},"keywords":{}}],["quot;flag"",{"_index":5590,"title":{},"content":{"1009":{"position":[[942,16]]}},"keywords":{}}],["quot;flutt",{"_index":1519,"title":{},"content":{"244":{"position":[[1375,13]]}},"keywords":{}}],["quot;foobar"",{"_index":4063,"title":{},"content":{"724":{"position":[[1588,18]]},"986":{"position":[[758,19]]}},"keywords":{}}],["quot;format"",{"_index":5887,"title":{},"content":{"1085":{"position":[[428,19]]}},"keywords":{}}],["quot;framework"",{"_index":666,"title":{},"content":{"43":{"position":[[16,21]]}},"keywords":{}}],["quot;from",{"_index":5527,"title":{},"content":{"999":{"position":[[120,10]]}},"keywords":{}}],["quot;fs"",{"_index":6141,"title":{},"content":{"1176":{"position":[[92,15],[575,15]]}},"keywords":{}}],["quot;get$$"",{"_index":5865,"title":{},"content":{"1084":{"position":[[984,18]]}},"keywords":{}}],["quot;get$"",{"_index":5864,"title":{},"content":{"1084":{"position":[[966,17]]}},"keywords":{}}],["quot;get"",{"_index":5867,"title":{},"content":{"1084":{"position":[[1025,16]]}},"keywords":{}}],["quot;getattachment"",{"_index":5875,"title":{},"content":{"1084":{"position":[[1224,26]]}},"keywords":{}}],["quot;getlatest"",{"_index":5861,"title":{},"content":{"1084":{"position":[[912,22]]}},"keywords":{}}],["quot;git",{"_index":5427,"title":{},"content":{"981":{"position":[[183,9]]}},"keywords":{}}],["quot;git+https://git@github.com/pubkey/rxdb.git#commithash"",{"_index":4079,"title":{},"content":{"731":{"position":[[148,65]]}},"keywords":{}}],["quot;glu",{"_index":2619,"title":{},"content":{"411":{"position":[[2465,10]]}},"keywords":{}}],["quot;googl",{"_index":2817,"title":{},"content":{"419":{"position":[[1716,12]]}},"keywords":{}}],["quot;hack"",{"_index":3547,"title":{},"content":{"610":{"position":[[28,16]]}},"keywords":{}}],["quot;healthpoints"",{"_index":5818,"title":{},"content":{"1074":{"position":[[1112,25]]}},"keywords":{}}],["quot;hero",{"_index":5813,"title":{},"content":{"1074":{"position":[[697,10]]}},"keywords":{}}],["quot;hot"",{"_index":4656,"title":{},"content":{"799":{"position":[[107,15],[417,15]]}},"keywords":{}}],["quot;https://<yourdatabase>.dexie.cloud"",{"_index":6079,"title":{},"content":{"1148":{"position":[[986,53]]}},"keywords":{}}],["quot;human"",{"_index":5197,"title":{},"content":{"898":{"position":[[805,17]]}},"keywords":{}}],["quot;i",{"_index":2738,"title":{},"content":{"412":{"position":[[10256,8]]},"703":{"position":[[1215,8]]}},"keywords":{}}],["quot;id"",{"_index":1280,"title":{},"content":{"188":{"position":[[2871,15]]},"397":{"position":[[586,15],[666,15],[1074,15]]},"403":{"position":[[575,15]]},"986":{"position":[[742,15]]},"1085":{"position":[[1263,15],[1343,15],[1590,16]]},"1107":{"position":[[588,15],[668,15],[894,15]]}},"keywords":{}}],["quot;idx0"",{"_index":2369,"title":{},"content":{"397":{"position":[[893,17],[1113,17],[1228,17]]}},"keywords":{}}],["quot;idx1"",{"_index":2370,"title":{},"content":{"397":{"position":[[924,17],[1131,17],[1246,17]]}},"keywords":{}}],["quot;idx2"",{"_index":2371,"title":{},"content":{"397":{"position":[[955,17],[1149,17],[1264,17]]}},"keywords":{}}],["quot;idx3"",{"_index":2372,"title":{},"content":{"397":{"position":[[986,17],[1167,17],[1282,17]]}},"keywords":{}}],["quot;idx4"",{"_index":2373,"title":{},"content":{"397":{"position":[[1017,17],[1185,16],[1300,16]]}},"keywords":{}}],["quot;ignoredupl",{"_index":4209,"title":{},"content":{"749":{"position":[[5807,22]]}},"keywords":{}}],["quot;in",{"_index":1487,"title":{},"content":{"244":{"position":[[349,8]]}},"keywords":{}}],["quot;incrementalmodify"",{"_index":5879,"title":{},"content":{"1084":{"position":[[1328,30]]}},"keywords":{}}],["quot;incrementalpatch"",{"_index":5881,"title":{},"content":{"1084":{"position":[[1378,29]]}},"keywords":{}}],["quot;incrementalremove"",{"_index":5884,"title":{},"content":{"1084":{"position":[[1451,30]]}},"keywords":{}}],["quot;incrementalupdate"",{"_index":5871,"title":{},"content":{"1084":{"position":[[1109,30]]}},"keywords":{}}],["quot;index",{"_index":2957,"title":{},"content":{"452":{"position":[[35,13]]}},"keywords":{}}],["quot;indexeddb",{"_index":1462,"title":{},"content":{"243":{"position":[[543,15],[647,15],[748,15],[847,15]]},"244":{"position":[[568,15],[604,15],[1666,15]]}},"keywords":{}}],["quot;indexes"",{"_index":2375,"title":{},"content":{"397":{"position":[[1205,20]]}},"keywords":{}}],["quot;insert",{"_index":4918,"title":{},"content":{"863":{"position":[[717,12]]}},"keywords":{}}],["quot;internalindexes"",{"_index":5967,"title":{},"content":{"1107":{"position":[[844,28]]}},"keywords":{}}],["quot;ion",{"_index":1452,"title":{},"content":{"243":{"position":[[329,11]]},"244":{"position":[[1216,11]]}},"keywords":{}}],["quot;iosdatabaselocation"",{"_index":3793,"title":{},"content":{"661":{"position":[[685,32]]},"662":{"position":[[1453,32]]},"1279":{"position":[[152,32]]}},"keywords":{}}],["quot;isinstanceofrxdocument"",{"_index":5855,"title":{},"content":{"1084":{"position":[[742,35]]}},"keywords":{}}],["quot;items"",{"_index":2367,"title":{},"content":{"397":{"position":[[814,18]]},"1074":{"position":[[1551,18]]}},"keywords":{}}],["quot;jqueri",{"_index":1448,"title":{},"content":{"243":{"position":[[154,12]]}},"keywords":{}}],["quot;json",{"_index":1473,"title":{},"content":{"243":{"position":[[946,10],[981,10]]}},"keywords":{}}],["quot;keep_alive"",{"_index":4858,"title":{},"content":{"849":{"position":[[1113,22]]}},"keywords":{}}],["quot;last",{"_index":2701,"title":{},"content":{"412":{"position":[[5505,10]]}},"keywords":{}}],["quot;lastname"",{"_index":1831,"title":{},"content":{"303":{"position":[[583,21]]},"361":{"position":[[580,21]]},"898":{"position":[[1023,20]]},"986":{"position":[[815,21]]}},"keywords":{}}],["quot;library/capacitordatabase"",{"_index":3794,"title":{},"content":{"661":{"position":[[718,37]]},"662":{"position":[[1486,37]]},"1279":{"position":[[185,37]]}},"keywords":{}}],["quot;livequery"",{"_index":1504,"title":{},"content":{"244":{"position":[[905,21]]}},"keywords":{}}],["quot;loc",{"_index":1441,"title":{},"content":{"243":{"position":[[33,11],[370,11]]},"244":{"position":[[719,11],[761,11],[796,11]]},"245":{"position":[[1,11]]},"419":{"position":[[664,11],[1217,11],[1338,11],[1520,11],[1556,11],[1850,14]]}},"keywords":{}}],["quot;localstorag",{"_index":1480,"title":{},"content":{"244":{"position":[[206,18],[485,18]]}},"keywords":{}}],["quot;low",{"_index":724,"title":{},"content":{"47":{"position":[[288,9]]}},"keywords":{}}],["quot;mag",{"_index":2684,"title":{},"content":{"412":{"position":[[3855,15]]}},"keywords":{}}],["quot;main"",{"_index":3979,"title":{},"content":{"707":{"position":[[57,16]]},"709":{"position":[[1327,16]]},"775":{"position":[[671,16]]},"1089":{"position":[[101,16]]}},"keywords":{}}],["quot;many"",{"_index":6551,"title":{},"content":{"1316":{"position":[[1495,16]]}},"keywords":{}}],["quot;maximum"",{"_index":5820,"title":{},"content":{"1074":{"position":[[1202,20],[1407,20]]}},"keywords":{}}],["quot;maxitems"",{"_index":5826,"title":{},"content":{"1074":{"position":[[1495,21]]}},"keywords":{}}],["quot;maxlength"",{"_index":2364,"title":{},"content":{"397":{"position":[[722,22]]},"1074":{"position":[[972,22]]},"1085":{"position":[[1399,22]]},"1107":{"position":[[724,22],[812,22]]}},"keywords":{}}],["quot;mean"",{"_index":2224,"title":{},"content":{"391":{"position":[[681,17]]}},"keywords":{}}],["quot;merg",{"_index":2680,"title":{},"content":{"412":{"position":[[3527,11]]}},"keywords":{}}],["quot;minimum"",{"_index":5819,"title":{},"content":{"1074":{"position":[[1178,20],[1380,20]]}},"keywords":{}}],["quot;mobil",{"_index":1502,"title":{},"content":{"244":{"position":[[836,12]]}},"keywords":{}}],["quot;modify"",{"_index":5878,"title":{},"content":{"1084":{"position":[[1308,19]]}},"keywords":{}}],["quot;mydynamicdata"",{"_index":5894,"title":{},"content":{"1085":{"position":[[1429,26]]}},"keywords":{}}],["quot;name"",{"_index":1283,"title":{},"content":{"188":{"position":[[2927,17]]},"986":{"position":[[778,17]]},"1074":{"position":[[832,17],[914,17],[1636,17],[1790,17]]},"1107":{"position":[[754,17],[875,18]]}},"keywords":{}}],["quot;native"",{"_index":6338,"title":{},"content":{"1275":{"position":[[52,18]]}},"keywords":{}}],["quot;new"",{"_index":3628,"title":{},"content":{"616":{"position":[[255,15]]}},"keywords":{}}],["quot;normal"",{"_index":2488,"title":{},"content":{"402":{"position":[[2189,18]]},"429":{"position":[[589,18]]},"453":{"position":[[604,18]]},"457":{"position":[[108,18]]},"469":{"position":[[700,18]]},"569":{"position":[[6,18]]},"623":{"position":[[342,18]]},"772":{"position":[[10,18]]},"1192":{"position":[[5,18]]}},"keywords":{}}],["quot;npm:rxdb@14.17.1"",{"_index":4501,"title":{},"content":{"760":{"position":[[156,29]]}},"keywords":{}}],["quot;number"",{"_index":2368,"title":{},"content":{"397":{"position":[[853,18]]},"1074":{"position":[[1158,19],[1335,19],[1736,18]]}},"keywords":{}}],["quot;object"",{"_index":2361,"title":{},"content":{"397":{"position":[[620,19]]},"1074":{"position":[[868,19],[1590,19]]},"1085":{"position":[[1165,18],[1297,19],[1476,18]]},"1107":{"position":[[622,19]]}},"keywords":{}}],["quot;offlin",{"_index":1454,"title":{},"content":{"243":{"position":[[400,13]]},"244":{"position":[[386,13],[1060,13],[1094,13]]},"419":{"position":[[84,13]]}},"keywords":{}}],["quot;on",{"_index":2825,"title":{},"content":{"419":{"position":[[1891,8]]}},"keywords":{}}],["quot;onlin",{"_index":2780,"title":{},"content":{"413":{"position":[[101,12]]},"420":{"position":[[611,12]]}},"keywords":{}}],["quot;only"",{"_index":6012,"title":{},"content":{"1123":{"position":[[460,16]]}},"keywords":{}}],["quot;optimist",{"_index":1439,"title":{},"content":{"243":{"position":[[4,16]]}},"keywords":{}}],["quot;original"",{"_index":2864,"title":{},"content":{"422":{"position":[[275,20]]}},"keywords":{}}],["quot;p2p",{"_index":1509,"title":{},"content":{"244":{"position":[[998,9]]}},"keywords":{}}],["quot;passportid"",{"_index":5200,"title":{},"content":{"898":{"position":[[945,22]]}},"keywords":{}}],["quot;patch"",{"_index":5880,"title":{},"content":{"1084":{"position":[[1359,18]]}},"keywords":{}}],["quot;permiss",{"_index":5586,"title":{},"content":{"1009":{"position":[[213,16]]}},"keywords":{}}],["quot;pipes"",{"_index":2549,"title":{},"content":{"408":{"position":[[2490,17]]}},"keywords":{}}],["quot;plugins"",{"_index":3791,"title":{},"content":{"661":{"position":[[631,20]]},"662":{"position":[[1399,20]]},"1279":{"position":[[98,20]]}},"keywords":{}}],["quot;populate"",{"_index":5866,"title":{},"content":{"1084":{"position":[[1003,21]]}},"keywords":{}}],["quot;primary"",{"_index":5857,"title":{},"content":{"1084":{"position":[[803,20]]}},"keywords":{}}],["quot;primarykey"",{"_index":2359,"title":{},"content":{"397":{"position":[[562,23]]},"403":{"position":[[551,23]]},"1074":{"position":[[808,23]]},"1085":{"position":[[1239,23]]},"1107":{"position":[[564,23]]}},"keywords":{}}],["quot;primarypath"",{"_index":5856,"title":{},"content":{"1084":{"position":[[778,24]]}},"keywords":{}}],["quot;production"",{"_index":3844,"title":{},"content":{"672":{"position":[[58,23]]}},"keywords":{}}],["quot;productnumber"",{"_index":1834,"title":{},"content":{"303":{"position":[[661,26],[722,26]]},"361":{"position":[[658,26],[719,26]]}},"keywords":{}}],["quot;properties"",{"_index":2362,"title":{},"content":{"397":{"position":[[640,23]]},"403":{"position":[[591,23]]},"1074":{"position":[[888,23],[1610,23]]},"1085":{"position":[[1317,23]]},"1107":{"position":[[642,23]]}},"keywords":{}}],["quot;public"."humans"",{"_index":5199,"title":{},"content":{"898":{"position":[[905,37],[1498,38]]}},"keywords":{}}],["quot;putattachment"",{"_index":5873,"title":{},"content":{"1084":{"position":[[1164,26]]}},"keywords":{}}],["quot;putattachmentbase64"",{"_index":5874,"title":{},"content":{"1084":{"position":[[1191,32]]}},"keywords":{}}],["quot;react",{"_index":1445,"title":{},"content":{"243":{"position":[[75,11]]},"244":{"position":[[66,11],[97,11],[285,14],[422,11],[523,11],[1029,14],[1125,11],[1253,11],[1292,11],[1336,11],[1418,11]]}},"keywords":{}}],["quot;reactj",{"_index":1474,"title":{},"content":{"243":{"position":[[1013,13]]}},"keywords":{}}],["quot;real",{"_index":1482,"title":{},"content":{"244":{"position":[[248,10]]}},"keywords":{}}],["quot;real"",{"_index":2482,"title":{},"content":{"402":{"position":[[704,16]]},"569":{"position":[[1251,16]]},"699":{"position":[[742,16]]},"875":{"position":[[4087,16]]}},"keywords":{}}],["quot;realtim",{"_index":212,"title":{},"content":{"14":{"position":[[388,14],[426,14]]},"570":{"position":[[846,14]]},"571":{"position":[[1855,14]]}},"keywords":{}}],["quot;realtime"",{"_index":211,"title":{},"content":{"14":{"position":[[361,20]]},"569":{"position":[[50,21],[950,21]]},"570":{"position":[[253,20]]},"571":{"position":[[54,20]]},"699":{"position":[[154,20]]}},"keywords":{}}],["quot;redux",{"_index":1524,"title":{},"content":{"244":{"position":[[1456,11]]}},"keywords":{}}],["quot;region,"",{"_index":5588,"title":{},"content":{"1009":{"position":[[245,19]]}},"keywords":{}}],["quot;reload",{"_index":2850,"title":{},"content":{"421":{"position":[[342,12]]}},"keywords":{}}],["quot;remove"",{"_index":5883,"title":{},"content":{"1084":{"position":[[1431,19]]}},"keywords":{}}],["quot;renderer"",{"_index":3981,"title":{},"content":{"707":{"position":[[177,20]]}},"keywords":{}}],["quot;repl",{"_index":5583,"title":{},"content":{"1008":{"position":[[111,17]]}},"keywords":{}}],["quot;required"",{"_index":2374,"title":{},"content":{"397":{"position":[[1050,21]]},"1074":{"position":[[1766,21]]},"1085":{"position":[[1568,21]]}},"keywords":{}}],["quot;revision"",{"_index":5858,"title":{},"content":{"1084":{"position":[[824,21]]}},"keywords":{}}],["quot;revokes"",{"_index":2761,"title":{},"content":{"412":{"position":[[13319,19]]}},"keywords":{}}],["quot;rxdb",{"_index":4499,"title":{},"content":{"760":{"position":[[134,10]]}},"keywords":{}}],["quot;rxdb"",{"_index":4078,"title":{},"content":{"731":{"position":[[130,17]]},"889":{"position":[[398,17]]}},"keywords":{}}],["quot;rxstorag",{"_index":3510,"title":{},"content":{"581":{"position":[[50,15]]}},"keywords":{}}],["quot;scal",{"_index":5906,"title":{},"content":{"1087":{"position":[[22,13]]}},"keywords":{}}],["quot;schema",{"_index":5892,"title":{},"content":{"1085":{"position":[[817,12]]}},"keywords":{}}],["quot;secret"",{"_index":5821,"title":{},"content":{"1074":{"position":[[1230,19],[1852,21]]}},"keywords":{}}],["quot;select",{"_index":4011,"title":{},"content":{"711":{"position":[[1774,12]]}},"keywords":{}}],["quot;server"",{"_index":3984,"title":{},"content":{"708":{"position":[[105,18]]}},"keywords":{}}],["quot;shapes"",{"_index":651,"title":{},"content":{"41":{"position":[[105,20]]}},"keywords":{}}],["quot;shoe"",{"_index":2346,"title":{},"content":{"396":{"position":[[1322,16]]}},"keywords":{}}],["quot;shoppingcartitems"",{"_index":1833,"title":{},"content":{"303":{"position":[[626,30]]},"361":{"position":[[623,30]]}},"keywords":{}}],["quot;shortening"",{"_index":2479,"title":{},"content":{"402":{"position":[[175,22]]}},"keywords":{}}],["quot;skills"",{"_index":5825,"title":{},"content":{"1074":{"position":[[1436,19]]}},"keywords":{}}],["quot;socks"",{"_index":2347,"title":{},"content":{"396":{"position":[[1343,17]]}},"keywords":{}}],["quot;someth",{"_index":5060,"title":{},"content":{"875":{"position":[[9078,15]]}},"keywords":{}}],["quot;sort"",{"_index":4995,"title":{},"content":{"875":{"position":[[2409,16]]}},"keywords":{}}],["quot;sqlit",{"_index":1492,"title":{},"content":{"244":{"position":[[457,12],[1563,12],[1600,12]]}},"keywords":{}}],["quot;ssd"",{"_index":2042,"title":{},"content":{"356":{"position":[[568,20]]}},"keywords":{}}],["quot;stealing"",{"_index":5977,"title":{},"content":{"1112":{"position":[[324,20]]}},"keywords":{}}],["quot;stor",{"_index":1476,"title":{},"content":{"244":{"position":[[34,11],[165,11]]},"410":{"position":[[1356,12]]}},"keywords":{}}],["quot;storag",{"_index":6054,"title":{},"content":{"1140":{"position":[[104,13]]}},"keywords":{}}],["quot;string"",{"_index":2363,"title":{},"content":{"397":{"position":[[702,19]]},"1074":{"position":[[952,19],[1090,18],[1270,18],[1674,18]]},"1085":{"position":[[408,19],[1379,19]]},"1107":{"position":[[704,19],[792,19]]}},"keywords":{}}],["quot;supabas",{"_index":1475,"title":{},"content":{"244":{"position":[[1,14],[130,14]]}},"keywords":{}}],["quot;sync",{"_index":1531,"title":{},"content":{"244":{"position":[[1636,10]]}},"keywords":{}}],["quot;synced"",{"_index":5886,"title":{},"content":{"1084":{"position":[[1522,18]]}},"keywords":{}}],["quot;tauri",{"_index":1527,"title":{},"content":{"244":{"position":[[1530,11]]}},"keywords":{}}],["quot;title"",{"_index":5812,"title":{},"content":{"1074":{"position":[[678,18]]}},"keywords":{}}],["quot;tojson"",{"_index":5868,"title":{},"content":{"1084":{"position":[[1042,19]]}},"keywords":{}}],["quot;tomutablejson"",{"_index":5869,"title":{},"content":{"1084":{"position":[[1062,26]]}},"keywords":{}}],["quot;touchscreen"",{"_index":2041,"title":{},"content":{"356":{"position":[[542,25]]}},"keywords":{}}],["quot;type"",{"_index":2360,"title":{},"content":{"397":{"position":[[602,17],[684,17],[777,17],[835,17]]},"849":{"position":[[472,16]]},"1074":{"position":[[850,17],[934,17],[1072,17],[1140,17],[1252,17],[1317,17],[1458,17],[1572,17],[1656,17],[1718,17]]},"1085":{"position":[[390,17],[1279,17],[1361,17],[1458,17]]},"1107":{"position":[[604,17],[686,17],[774,17]]}},"keywords":{}}],["quot;uniqueitems"",{"_index":5827,"title":{},"content":{"1074":{"position":[[1520,24]]}},"keywords":{}}],["quot;upd",{"_index":4915,"title":{},"content":{"863":{"position":[[510,12]]}},"keywords":{}}],["quot;update"",{"_index":5870,"title":{},"content":{"1084":{"position":[[1089,19]]}},"keywords":{}}],["quot;updatecrdt"",{"_index":5872,"title":{},"content":{"1084":{"position":[[1140,23]]}},"keywords":{}}],["quot;updatedat"",{"_index":5447,"title":{},"content":{"986":{"position":[[1004,22]]}},"keywords":{}}],["quot;version"",{"_index":2358,"title":{},"content":{"397":{"position":[[538,20]]},"403":{"position":[[489,20]]},"1074":{"position":[[722,20]]},"1085":{"position":[[1215,20]]},"1107":{"position":[[540,20]]}},"keywords":{}}],["quot;voxel"",{"_index":5556,"title":{},"content":{"1007":{"position":[[103,17]]}},"keywords":{}}],["quot;vu",{"_index":1447,"title":{},"content":{"243":{"position":[[114,9],[185,9]]}},"keywords":{}}],["quot;web",{"_index":1503,"title":{},"content":{"244":{"position":[[874,9]]}},"keywords":{}}],["quot;webrtc",{"_index":1457,"title":{},"content":{"243":{"position":[[464,12]]}},"keywords":{}}],["quot;webtransport",{"_index":1497,"title":{},"content":{"244":{"position":[[681,18]]}},"keywords":{}}],["quot;which",{"_index":2191,"title":{},"content":{"390":{"position":[[618,11],[685,11]]}},"keywords":{}}],["quot;wilson"",{"_index":5446,"title":{},"content":{"986":{"position":[[837,19]]}},"keywords":{}}],["quot;winner"",{"_index":2678,"title":{},"content":{"412":{"position":[[3359,18]]}},"keywords":{}}],["quot;wins"",{"_index":3892,"title":{},"content":{"688":{"position":[[445,16]]}},"keywords":{}}],["quot;won't",{"_index":3648,"title":{},"content":{"617":{"position":[[1725,11]]}},"keywords":{}}],["quot;you",{"_index":2621,"title":{},"content":{"411":{"position":[[2594,9]]}},"keywords":{}}],["quot;zero",{"_index":1455,"title":{},"content":{"243":{"position":[[432,10]]},"902":{"position":[[522,10]]}},"keywords":{}}],["quot;zflutt",{"_index":1281,"title":{},"content":{"188":{"position":[[2887,14]]}},"keywords":{}}],["quot;ziemann"",{"_index":1832,"title":{},"content":{"303":{"position":[[605,20],[859,20]]},"361":{"position":[[602,20],[856,20]]}},"keywords":{}}],["quot;|b"",{"_index":1842,"title":{},"content":{"303":{"position":[[923,15],[969,15]]},"361":{"position":[[920,15],[966,15]]}},"keywords":{}}],["quot;|e"",{"_index":1838,"title":{},"content":{"303":{"position":[[806,15]]},"361":{"position":[[803,15]]}},"keywords":{}}],["quot;|g"",{"_index":1839,"title":{},"content":{"303":{"position":[[843,15]]},"361":{"position":[[840,15]]}},"keywords":{}}],["quot;|h"",{"_index":1841,"title":{},"content":{"303":{"position":[[900,15],[946,15]]},"361":{"position":[[897,15],[943,15]]}},"keywords":{}}],["quot;|i"",{"_index":1840,"title":{},"content":{"303":{"position":[[880,15]]},"361":{"position":[[877,15]]}},"keywords":{}}],["quota",{"_index":1703,"title":{"301":{"position":[[29,7]]}},"content":{"298":{"position":[[107,5]]},"299":{"position":[[16,6],[356,5],[667,6],[979,6],[1451,5]]},"300":{"position":[[223,5]]},"301":{"position":[[559,5],[745,6]]},"302":{"position":[[69,6],[464,5],[919,5]]},"304":{"position":[[119,6],[251,6]]},"306":{"position":[[100,5]]},"408":{"position":[[510,6],[1226,6]]}},"keywords":{}}],["quota.quota",{"_index":1773,"title":{},"content":{"300":{"position":[[286,12]]}},"keywords":{}}],["quota.usag",{"_index":1775,"title":{},"content":{"300":{"position":[[317,12]]}},"keywords":{}}],["quotaexceedederror",{"_index":1797,"title":{},"content":{"302":{"position":[[103,18],[871,21]]},"1207":{"position":[[736,18]]}},"keywords":{}}],["r1",{"_index":4435,"title":{},"content":{"749":{"position":[[23961,2]]}},"keywords":{}}],["r2",{"_index":4437,"title":{},"content":{"749":{"position":[[24081,2]]}},"keywords":{}}],["r3",{"_index":4439,"title":{},"content":{"749":{"position":[[24242,2]]}},"keywords":{}}],["rais",{"_index":2790,"title":{},"content":{"417":{"position":[[115,5]]}},"keywords":{}}],["ram",{"_index":1607,"title":{},"content":{"265":{"position":[[789,4]]},"1321":{"position":[[111,3]]}},"keywords":{}}],["ran",{"_index":6393,"title":{},"content":{"1292":{"position":[[15,3]]}},"keywords":{}}],["random",{"_index":2344,"title":{},"content":{"396":{"position":[[965,6]]},"670":{"position":[[186,6]]},"821":{"position":[[776,6]]},"837":{"position":[[1524,6]]},"1010":{"position":[[108,6]]}},"keywords":{}}],["randomcouchstring(10",{"_index":6383,"title":{},"content":{"1286":{"position":[[515,22]]},"1287":{"position":[[565,22]]},"1288":{"position":[[531,22]]}},"keywords":{}}],["randomli",{"_index":3043,"title":{},"content":{"464":{"position":[[201,8]]},"719":{"position":[[307,8]]},"1304":{"position":[[1078,8]]}},"keywords":{}}],["rang",{"_index":519,"title":{"796":{"position":[[74,6]]}},"content":{"33":{"position":[[414,5]]},"165":{"position":[[17,5]]},"177":{"position":[[233,5]]},"193":{"position":[[15,5]]},"254":{"position":[[420,5]]},"267":{"position":[[1433,5]]},"287":{"position":[[77,5],[598,5]]},"364":{"position":[[360,5]]},"365":{"position":[[841,5]]},"368":{"position":[[203,5]]},"396":{"position":[[1690,6]]},"398":{"position":[[1772,5],[1871,5],[2264,5],[2414,7],[2461,6]]},"400":{"position":[[109,5],[475,5]]},"420":{"position":[[1445,5]]},"432":{"position":[[475,5]]},"454":{"position":[[174,5]]},"459":{"position":[[513,6]]},"461":{"position":[[701,6]]},"462":{"position":[[949,5]]},"468":{"position":[[268,5]]},"469":{"position":[[17,5]]},"504":{"position":[[682,5]]},"525":{"position":[[406,5]]},"631":{"position":[[121,5]]},"796":{"position":[[84,5]]},"904":{"position":[[516,5]]},"1067":{"position":[[1222,5],[1452,5]]},"1120":{"position":[[411,5]]},"1124":{"position":[[60,5],[625,5],[820,6],[957,6]]},"1134":{"position":[[319,5]]},"1272":{"position":[[251,5]]},"1294":{"position":[[1173,5]]},"1296":{"position":[[1350,5],[1459,5]]}},"keywords":{}}],["rapid",{"_index":925,"title":{},"content":{"65":{"position":[[1244,5]]},"287":{"position":[[1014,5]]},"369":{"position":[[153,5]]},"569":{"position":[[806,5]]}},"keywords":{}}],["rapidli",{"_index":2005,"title":{},"content":{"353":{"position":[[267,7]]},"408":{"position":[[2196,7]]}},"keywords":{}}],["rare",{"_index":296,"title":{},"content":{"17":{"position":[[486,4]]},"362":{"position":[[612,6]]},"411":{"position":[[875,6]]},"689":{"position":[[491,6]]},"698":{"position":[[908,5]]},"740":{"position":[[4,4]]},"966":{"position":[[234,4]]},"1090":{"position":[[1236,4]]}},"keywords":{}}],["rate",{"_index":3199,"title":{},"content":{"497":{"position":[[113,5]]},"841":{"position":[[1093,4]]}},"keywords":{}}],["rates.scenario",{"_index":3201,"title":{},"content":{"497":{"position":[[322,15]]}},"keywords":{}}],["raw",{"_index":1933,"title":{},"content":{"331":{"position":[[59,3]]},"350":{"position":[[232,5]]},"356":{"position":[[207,3]]},"408":{"position":[[3129,3]]},"576":{"position":[[43,3]]},"620":{"position":[[247,3]]}},"keywords":{}}],["rawrespons",{"_index":5037,"title":{},"content":{"875":{"position":[[6219,11]]},"988":{"position":[[2503,11]]}},"keywords":{}}],["rawresponse.json",{"_index":5041,"title":{},"content":{"875":{"position":[[6434,19]]},"988":{"position":[[2852,19]]}},"keywords":{}}],["rc1",{"_index":4324,"title":{},"content":{"749":{"position":[[14568,3]]}},"keywords":{}}],["rc2",{"_index":4325,"title":{},"content":{"749":{"position":[[14650,3]]}},"keywords":{}}],["rc4",{"_index":4327,"title":{},"content":{"749":{"position":[[14765,3]]}},"keywords":{}}],["rc5",{"_index":4329,"title":{},"content":{"749":{"position":[[14921,3]]}},"keywords":{}}],["rc6",{"_index":4330,"title":{},"content":{"749":{"position":[[15132,3]]}},"keywords":{}}],["rc7",{"_index":4333,"title":{},"content":{"749":{"position":[[15291,3]]}},"keywords":{}}],["rc_couchdb_1",{"_index":4345,"title":{},"content":{"749":{"position":[[16101,12]]}},"keywords":{}}],["rc_couchdb_2",{"_index":4347,"title":{},"content":{"749":{"position":[[16249,12]]}},"keywords":{}}],["rc_forbidden",{"_index":4352,"title":{},"content":{"749":{"position":[[16639,12]]}},"keywords":{}}],["rc_outdat",{"_index":4348,"title":{},"content":{"749":{"position":[[16368,11]]}},"keywords":{}}],["rc_pull",{"_index":4338,"title":{},"content":{"749":{"position":[[15466,7]]}},"keywords":{}}],["rc_push",{"_index":4342,"title":{},"content":{"749":{"position":[[15732,7]]}},"keywords":{}}],["rc_push_no_ar",{"_index":4343,"title":{},"content":{"749":{"position":[[15864,13]]}},"keywords":{}}],["rc_stream",{"_index":4341,"title":{},"content":{"749":{"position":[[15598,9]]}},"keywords":{}}],["rc_unauthor",{"_index":4350,"title":{},"content":{"749":{"position":[[16490,15]]}},"keywords":{}}],["rc_webrtc_peer",{"_index":4344,"title":{},"content":{"749":{"position":[[15999,14]]}},"keywords":{}}],["rddt",{"_index":1443,"title":{},"content":{"243":{"position":[[60,5],[139,5],[265,5],[314,5],[355,5]]}},"keywords":{}}],["re",{"_index":166,"title":{"1022":{"position":[[9,2]]}},"content":{"11":{"position":[[661,6]]},"234":{"position":[[200,2]]},"255":{"position":[[1147,3],[1410,3]]},"329":{"position":[[110,2]]},"335":{"position":[[937,2]]},"346":{"position":[[134,2],[418,2]]},"385":{"position":[[318,2]]},"411":{"position":[[3223,2],[3626,2]]},"490":{"position":[[560,2]]},"494":{"position":[[636,2]]},"566":{"position":[[445,2],[518,2]]},"611":{"position":[[1053,2]]},"612":{"position":[[1866,4]]},"630":{"position":[[362,2]]},"634":{"position":[[336,2]]},"756":{"position":[[222,2]]},"799":{"position":[[543,4],[775,4]]},"829":{"position":[[2728,2],[2757,2],[3658,2]]},"841":{"position":[[850,2]]},"870":{"position":[[106,2]]},"875":{"position":[[2093,4],[4461,4],[7250,4]]},"921":{"position":[[79,2]]},"954":{"position":[[206,2]]},"990":{"position":[[651,2]]},"1007":{"position":[[1511,3],[1669,3]]},"1008":{"position":[[295,2]]},"1010":{"position":[[115,2]]},"1294":{"position":[[1768,6]]},"1307":{"position":[[851,2]]},"1315":{"position":[[1662,2]]},"1316":{"position":[[1750,2]]},"1318":{"position":[[1149,2]]}},"keywords":{}}],["reach",{"_index":457,"title":{"302":{"position":[[32,8]]}},"content":{"28":{"position":[[324,7]]},"418":{"position":[[808,6]]},"461":{"position":[[426,7]]},"491":{"position":[[1593,5]]},"496":{"position":[[72,7]]},"610":{"position":[[1227,7]]},"696":{"position":[[1798,5]]},"711":{"position":[[2395,6]]},"984":{"position":[[514,7]]},"990":{"position":[[178,7]]},"1092":{"position":[[481,8]]},"1294":{"position":[[1093,8]]}},"keywords":{}}],["reachabl",{"_index":6273,"title":{},"content":{"1227":{"position":[[856,9]]},"1265":{"position":[[830,9]]}},"keywords":{}}],["react",{"_index":99,"title":{"8":{"position":[[0,5]]},"286":{"position":[[25,7]]},"371":{"position":[[32,5]]},"437":{"position":[[17,5]]},"494":{"position":[[0,5]]},"512":{"position":[[23,5]]},"520":{"position":[[15,5]]},"521":{"position":[[13,5]]},"522":{"position":[[16,5]]},"523":{"position":[[11,5]]},"532":{"position":[[22,5]]},"534":{"position":[[21,6]]},"536":{"position":[[15,6]]},"541":{"position":[[26,5]]},"543":{"position":[[0,5]]},"549":{"position":[[0,5]]},"551":{"position":[[0,5]]},"552":{"position":[[34,5]]},"556":{"position":[[19,5]]},"827":{"position":[[0,5]]},"830":{"position":[[0,5]]},"833":{"position":[[0,5]]},"834":{"position":[[23,5]]},"852":{"position":[[0,5]]},"1214":{"position":[[18,5]]},"1277":{"position":[[11,5]]}},"content":{"7":{"position":[[644,5]]},"8":{"position":[[181,5],[205,5],[257,5],[277,5],[336,5],[354,5],[448,5],[859,6],[933,5]]},"9":{"position":[[6,5]]},"17":{"position":[[96,5],[106,5],[263,5]]},"33":{"position":[[279,5]]},"38":{"position":[[716,5]]},"47":{"position":[[1246,5]]},"99":{"position":[[360,5]]},"112":{"position":[[110,5]]},"121":{"position":[[221,5]]},"140":{"position":[[150,5]]},"168":{"position":[[82,5]]},"174":{"position":[[2716,5]]},"201":{"position":[[190,5]]},"207":{"position":[[187,5]]},"239":{"position":[[147,5]]},"244":{"position":[[1392,5]]},"248":{"position":[[76,5]]},"254":{"position":[[158,5],[394,5]]},"286":{"position":[[183,6]]},"352":{"position":[[246,6]]},"365":{"position":[[1047,5]]},"371":{"position":[[40,5],[303,5]]},"383":{"position":[[406,5]]},"420":{"position":[[304,5]]},"437":{"position":[[5,5],[267,5]]},"445":{"position":[[1482,6],[1774,5]]},"446":{"position":[[1141,5]]},"447":{"position":[[237,5]]},"458":{"position":[[66,5]]},"479":{"position":[[384,6]]},"490":{"position":[[46,5]]},"494":{"position":[[6,6],[144,5],[155,8],[630,5]]},"503":{"position":[[74,6]]},"509":{"position":[[50,5]]},"513":{"position":[[106,5]]},"515":{"position":[[411,5]]},"520":{"position":[[40,5]]},"521":{"position":[[29,5],[556,5]]},"522":{"position":[[40,5],[205,5]]},"523":{"position":[[42,5]]},"524":{"position":[[670,5],[753,5],[1021,5]]},"530":{"position":[[17,5],[294,5],[470,5],[675,5]]},"531":{"position":[[445,5]]},"534":{"position":[[15,5]]},"535":{"position":[[1298,5]]},"536":{"position":[[22,5]]},"538":{"position":[[247,5]]},"540":{"position":[[183,5]]},"541":{"position":[[117,5],[208,8]]},"542":{"position":[[80,5]]},"543":{"position":[[48,5]]},"546":{"position":[[257,5]]},"548":{"position":[[244,5]]},"551":{"position":[[1,5],[302,5],[327,5]]},"556":{"position":[[106,5],[131,5],[224,5],[311,6]]},"557":{"position":[[119,5],[157,5],[460,5]]},"559":{"position":[[192,6],[228,8]]},"562":{"position":[[761,5],[886,5],[1043,6],[1079,8],[1641,5]]},"563":{"position":[[814,5]]},"567":{"position":[[757,5],[808,5],[1021,5]]},"631":{"position":[[190,5]]},"659":{"position":[[159,5]]},"749":{"position":[[5932,5]]},"785":{"position":[[402,5]]},"793":{"position":[[310,5],[1246,5]]},"824":{"position":[[241,5]]},"825":{"position":[[9,5]]},"828":{"position":[[69,5],[79,5],[180,5],[287,5]]},"829":{"position":[[34,5],[67,5],[73,5],[141,5],[209,5],[343,5],[923,5],[932,5],[1093,6],[1248,6],[1284,8],[2979,5]]},"830":{"position":[[69,5],[87,5],[187,5],[314,5]]},"831":{"position":[[20,5],[322,5],[406,5]]},"832":{"position":[[22,5],[142,6],[264,5]]},"834":{"position":[[61,5]]},"835":{"position":[[577,5],[627,5]]},"836":{"position":[[230,5],[396,5],[480,5],[517,5],[643,6],[1055,5],[1290,5],[1611,5]]},"837":{"position":[[312,5],[849,5],[1026,5],[1072,5],[1349,5],[1369,5],[1395,5],[1506,6],[1762,5],[1806,6],[2139,6]]},"838":{"position":[[377,5],[1195,5],[1341,5],[1582,5],[1821,5],[2004,6],[2403,5],[3206,5],[3413,5]]},"840":{"position":[[621,5],[664,5]]},"842":{"position":[[46,5],[84,5],[315,5]]},"852":{"position":[[1,5]]},"875":{"position":[[9143,5]]},"964":{"position":[[327,5],[454,5]]},"1150":{"position":[[119,5]]},"1173":{"position":[[230,5]]},"1183":{"position":[[467,5]]},"1191":{"position":[[377,5]]},"1196":{"position":[[42,6]]},"1214":{"position":[[104,5],[696,5]]},"1247":{"position":[[94,5]]},"1271":{"position":[[229,5]]},"1277":{"position":[[13,5],[306,6],[496,5],[597,5],[677,5],[833,6]]},"1283":{"position":[[1,5]]},"1284":{"position":[[69,5],[451,5]]},"1316":{"position":[[3550,5]]}},"keywords":{}}],["react'",{"_index":3258,"title":{},"content":{"521":{"position":[[134,7]]}},"keywords":{}}],["react.j",{"_index":1013,"title":{},"content":{"94":{"position":[[109,9]]},"173":{"position":[[2307,9]]},"222":{"position":[[126,9]]}},"keywords":{}}],["react/remix",{"_index":594,"title":{},"content":{"38":{"position":[[685,12]]}},"keywords":{}}],["reactiv",{"_index":284,"title":{"53":{"position":[[0,8]]},"68":{"position":[[20,9]]},"99":{"position":[[20,9]]},"121":{"position":[[0,8]]},"144":{"position":[[11,10]]},"150":{"position":[[54,8]]},"156":{"position":[[0,8]]},"182":{"position":[[0,8]]},"226":{"position":[[20,9]]},"326":{"position":[[0,8]]},"379":{"position":[[10,11]]},"515":{"position":[[0,8]]},"540":{"position":[[0,8]]},"580":{"position":[[4,10]]},"600":{"position":[[0,8]]},"822":{"position":[[23,10]]},"825":{"position":[[9,10]]},"826":{"position":[[17,10]]},"1113":{"position":[[10,8]]}},"content":{"17":{"position":[[21,8]]},"34":{"position":[[415,11]]},"35":{"position":[[396,8]]},"41":{"position":[[334,11]]},"42":{"position":[[21,9],[303,10]]},"53":{"position":[[26,11]]},"55":{"position":[[42,11],[86,10],[943,11]]},"68":{"position":[[91,8]]},"77":{"position":[[126,10]]},"90":{"position":[[136,8]]},"99":{"position":[[176,8],[311,8]]},"103":{"position":[[112,8]]},"106":{"position":[[70,11]]},"118":{"position":[[17,8],[69,8],[158,8]]},"120":{"position":[[63,8],[182,8]]},"121":{"position":[[39,8],[94,8],[240,8]]},"124":{"position":[[237,8]]},"126":{"position":[[101,8]]},"136":{"position":[[47,8]]},"144":{"position":[[29,10]]},"148":{"position":[[73,8]]},"153":{"position":[[17,8],[155,8]]},"155":{"position":[[60,8],[230,8]]},"156":{"position":[[45,8],[179,8]]},"161":{"position":[[204,8]]},"168":{"position":[[361,8]]},"170":{"position":[[114,9],[179,8]]},"174":{"position":[[349,8]]},"179":{"position":[[145,8],[348,8]]},"182":{"position":[[41,8],[119,8]]},"186":{"position":[[282,8]]},"198":{"position":[[150,8]]},"205":{"position":[[307,8]]},"226":{"position":[[141,9],[251,8],[370,8]]},"233":{"position":[[172,8]]},"235":{"position":[[163,10]]},"252":{"position":[[300,10]]},"322":{"position":[[17,8],[105,8]]},"323":{"position":[[1,8]]},"325":{"position":[[161,8]]},"331":{"position":[[158,11]]},"335":{"position":[[54,10]]},"346":{"position":[[250,11]]},"360":{"position":[[212,8]]},"362":{"position":[[866,8]]},"378":{"position":[[6,9],[146,10]]},"379":{"position":[[24,8]]},"385":{"position":[[273,8]]},"388":{"position":[[295,8]]},"411":{"position":[[2313,8],[2643,8],[3068,8]]},"419":{"position":[[1116,11]]},"445":{"position":[[23,8],[185,9],[1222,8],[1285,8],[1559,8]]},"447":{"position":[[351,8]]},"479":{"position":[[6,9]]},"502":{"position":[[19,9]]},"513":{"position":[[198,8],[271,8]]},"514":{"position":[[17,8],[101,8],[342,10]]},"515":{"position":[[52,8],[342,8]]},"520":{"position":[[109,8]]},"521":{"position":[[468,8]]},"523":{"position":[[131,10]]},"530":{"position":[[202,8],[356,8]]},"540":{"position":[[26,8]]},"541":{"position":[[73,8]]},"542":{"position":[[39,11],[144,10],[275,11],[604,11]]},"548":{"position":[[339,8]]},"560":{"position":[[711,11]]},"561":{"position":[[232,9]]},"562":{"position":[[738,8],[1618,8]]},"563":{"position":[[24,10],[95,10],[559,11],[986,11]]},"566":{"position":[[409,10],[537,11]]},"567":{"position":[[833,11]]},"574":{"position":[[84,8],[858,9],[924,10]]},"575":{"position":[[18,8],[110,8],[239,11]]},"576":{"position":[[98,8]]},"580":{"position":[[204,10]]},"591":{"position":[[443,10]]},"600":{"position":[[26,8]]},"602":{"position":[[27,10],[85,10],[279,8]]},"608":{"position":[[337,8]]},"631":{"position":[[247,8]]},"632":{"position":[[1685,8]]},"662":{"position":[[102,9]]},"723":{"position":[[1050,8]]},"749":{"position":[[6615,10]]},"793":{"position":[[1062,10]]},"825":{"position":[[63,10],[230,10],[269,10],[411,11]]},"826":{"position":[[180,10],[309,10]]},"828":{"position":[[20,8],[321,10]]},"829":{"position":[[3851,8]]},"831":{"position":[[83,10],[130,10],[176,8],[474,10],[513,10],[551,10]]},"836":{"position":[[2394,8]]},"838":{"position":[[77,8],[555,8]]},"841":{"position":[[526,10],[584,8],[624,11],[1436,8]]},"860":{"position":[[166,8]]},"1069":{"position":[[19,8]]},"1117":{"position":[[107,10]]},"1118":{"position":[[56,10],[259,10],[715,11]]},"1124":{"position":[[675,13]]},"1150":{"position":[[201,8]]}},"keywords":{}}],["reactivityfactori",{"_index":6001,"title":{},"content":{"1118":{"position":[[476,18],[727,17]]}},"keywords":{}}],["reactj",{"_index":3385,"title":{"558":{"position":[[0,7]]},"559":{"position":[[24,7]]},"561":{"position":[[46,8]]}},"content":{"559":{"position":[[841,8]]},"560":{"position":[[139,7],[657,7]]},"561":{"position":[[135,7]]},"563":{"position":[[1001,8]]},"564":{"position":[[19,7],[1133,7]]},"567":{"position":[[39,7],[547,8],[1082,7]]}},"keywords":{}}],["reactn",{"_index":101,"title":{},"content":{"8":{"position":[[6,11]]},"1214":{"position":[[765,11],[946,11]]},"1235":{"position":[[269,12]]}},"keywords":{}}],["read",{"_index":674,"title":{"204":{"position":[[25,4]]},"465":{"position":[[17,6]]},"467":{"position":[[9,6]]},"1033":{"position":[[37,5]]},"1239":{"position":[[33,6]]},"1302":{"position":[[8,5]]}},"content":{"43":{"position":[[433,4],[717,4]]},"144":{"position":[[137,4]]},"181":{"position":[[187,5]]},"201":{"position":[[284,5]]},"204":{"position":[[96,6],[348,4]]},"251":{"position":[[43,6],[205,5],[215,4]]},"262":{"position":[[158,4],[170,7],[239,5]]},"263":{"position":[[291,6]]},"265":{"position":[[646,5]]},"358":{"position":[[78,4]]},"364":{"position":[[773,4]]},"365":{"position":[[272,4]]},"369":{"position":[[1004,7]]},"370":{"position":[[317,4]]},"371":{"position":[[322,4]]},"380":{"position":[[153,7]]},"398":{"position":[[3090,4],[3217,4],[3294,5]]},"400":{"position":[[40,4]]},"402":{"position":[[400,4],[1227,4]]},"407":{"position":[[130,4]]},"408":{"position":[[2853,5]]},"411":{"position":[[1255,5]]},"414":{"position":[[84,4]]},"415":{"position":[[112,7]]},"420":{"position":[[1368,7]]},"430":{"position":[[717,4]]},"453":{"position":[[208,4]]},"465":{"position":[[75,4],[335,5],[434,5]]},"467":{"position":[[10,4],[281,7],[552,5],[658,6]]},"470":{"position":[[9,7]]},"474":{"position":[[117,4]]},"477":{"position":[[204,5]]},"545":{"position":[[126,4]]},"550":{"position":[[127,4]]},"559":{"position":[[1085,7]]},"602":{"position":[[357,4],[465,4]]},"605":{"position":[[126,4]]},"630":{"position":[[83,5],[682,4]]},"632":{"position":[[1906,5]]},"659":{"position":[[551,4]]},"670":{"position":[[481,4]]},"696":{"position":[[2049,4]]},"705":{"position":[[1170,4]]},"709":{"position":[[1144,4]]},"711":{"position":[[576,4]]},"716":{"position":[[107,7]]},"719":{"position":[[456,4]]},"749":{"position":[[5451,4]]},"759":{"position":[[1399,4]]},"772":{"position":[[1323,5]]},"773":{"position":[[202,4]]},"824":{"position":[[52,7],[333,7]]},"835":{"position":[[280,5]]},"841":{"position":[[1069,4]]},"845":{"position":[[154,4]]},"847":{"position":[[132,4]]},"854":{"position":[[1181,4],[1262,4]]},"861":{"position":[[2521,5]]},"863":{"position":[[416,5]]},"901":{"position":[[597,4]]},"904":{"position":[[2485,4]]},"912":{"position":[[732,4]]},"932":{"position":[[503,6]]},"936":{"position":[[123,4]]},"963":{"position":[[176,4]]},"968":{"position":[[620,4],[649,8]]},"973":{"position":[[67,4]]},"1032":{"position":[[108,5],[268,5]]},"1033":{"position":[[34,5],[289,4],[459,6]]},"1065":{"position":[[63,7]]},"1080":{"position":[[1134,4]]},"1090":{"position":[[104,4]]},"1092":{"position":[[396,4],[428,5]]},"1093":{"position":[[399,5]]},"1094":{"position":[[468,5]]},"1120":{"position":[[649,5],[701,4]]},"1123":{"position":[[88,5]]},"1140":{"position":[[290,4]]},"1143":{"position":[[227,5]]},"1156":{"position":[[154,7]]},"1188":{"position":[[368,4]]},"1207":{"position":[[289,6]]},"1208":{"position":[[186,4],[1264,4]]},"1209":{"position":[[276,5],[423,5]]},"1211":{"position":[[513,5]]},"1213":{"position":[[890,4],[919,8]]},"1239":{"position":[[90,5]]},"1241":{"position":[[139,4]]},"1242":{"position":[[218,4]]},"1243":{"position":[[136,4]]},"1244":{"position":[[165,4]]},"1245":{"position":[[104,4]]},"1246":{"position":[[328,4],[648,4],[945,4],[1207,4],[1581,4],[1979,4],[2263,4]]},"1247":{"position":[[130,4],[231,4],[417,4],[581,4],[740,4]]},"1292":{"position":[[459,5]]},"1294":{"position":[[213,7]]},"1295":{"position":[[687,4]]},"1299":{"position":[[195,5]]},"1302":{"position":[[56,5]]},"1304":{"position":[[1700,4]]},"1308":{"position":[[643,4]]},"1314":{"position":[[91,4]]},"1316":{"position":[[3002,4]]},"1324":{"position":[[811,4]]}},"keywords":{}}],["read.th",{"_index":3066,"title":{},"content":{"465":{"position":[[398,8]]}},"keywords":{}}],["read/writ",{"_index":1426,"title":{},"content":{"236":{"position":[[224,10]]},"430":{"position":[[684,10]]},"462":{"position":[[137,10]]},"588":{"position":[[139,10]]},"1161":{"position":[[10,10]]},"1180":{"position":[[10,10]]},"1192":{"position":[[403,10]]}},"keywords":{}}],["readabl",{"_index":2107,"title":{},"content":{"364":{"position":[[747,9]]},"1237":{"position":[[335,8]]}},"keywords":{}}],["readbuff",{"_index":6211,"title":{},"content":{"1208":{"position":[[1310,10]]}},"keywords":{}}],["readi",{"_index":1168,"title":{"309":{"position":[[11,5]]}},"content":{"153":{"position":[[339,6]]},"170":{"position":[[132,6]]},"253":{"position":[[240,5]]},"263":{"position":[[362,5]]},"314":{"position":[[920,5]]},"318":{"position":[[344,5]]},"388":{"position":[[1,5]]},"411":{"position":[[478,5]]},"480":{"position":[[961,5]]},"498":{"position":[[1,5]]},"824":{"position":[[13,5]]},"1227":{"position":[[185,5]]},"1265":{"position":[[178,5]]},"1271":{"position":[[608,5]]}},"keywords":{}}],["readili",{"_index":2853,"title":{},"content":{"421":{"position":[[471,7]]}},"keywords":{}}],["readonli",{"_index":2995,"title":{"1109":{"position":[[0,8]]}},"content":{"459":{"position":[[664,12]]},"661":{"position":[[1253,8]]},"825":{"position":[[992,8]]},"1109":{"position":[[346,11]]},"1294":{"position":[[856,11]]}},"keywords":{}}],["reads/writ",{"_index":2070,"title":{},"content":{"358":{"position":[[927,13]]},"408":{"position":[[1736,12]]},"410":{"position":[[359,12]]},"560":{"position":[[109,13]]},"566":{"position":[[724,12]]}},"keywords":{}}],["readsiz",{"_index":6213,"title":{},"content":{"1208":{"position":[[1356,8],[1607,8]]}},"keywords":{}}],["readwrit",{"_index":1806,"title":{},"content":{"302":{"position":[[725,13]]}},"keywords":{}}],["read—but",{"_index":2086,"title":{},"content":{"361":{"position":[[1074,8]]}},"keywords":{}}],["real",{"_index":537,"title":{"90":{"position":[[9,4]]},"136":{"position":[[0,4]]},"174":{"position":[[37,4]]},"264":{"position":[[45,4]]},"312":{"position":[[3,4]]},"379":{"position":[[0,4]]},"476":{"position":[[3,4]]},"490":{"position":[[0,4]]},"570":{"position":[[0,4]]},"632":{"position":[[0,4]]},"869":{"position":[[38,4]]},"895":{"position":[[39,4]]}},"content":{"34":{"position":[[405,4]]},"35":{"position":[[386,4]]},"39":{"position":[[27,4],[501,4]]},"40":{"position":[[86,4],[487,4]]},"42":{"position":[[78,4]]},"53":{"position":[[117,4]]},"65":{"position":[[749,4],[777,4]]},"68":{"position":[[132,4]]},"77":{"position":[[92,4]]},"83":{"position":[[106,4]]},"89":{"position":[[249,4]]},"90":{"position":[[41,4],[239,4]]},"99":{"position":[[229,4]]},"103":{"position":[[196,4]]},"109":{"position":[[245,4]]},"114":{"position":[[545,4]]},"121":{"position":[[121,4]]},"124":{"position":[[292,4]]},"126":{"position":[[308,4]]},"136":{"position":[[15,4],[162,4],[273,4]]},"140":{"position":[[283,4]]},"148":{"position":[[327,4]]},"151":{"position":[[177,4]]},"155":{"position":[[258,4]]},"156":{"position":[[311,4]]},"158":{"position":[[153,4]]},"162":{"position":[[502,4]]},"165":{"position":[[144,4]]},"168":{"position":[[107,4],[303,4]]},"170":{"position":[[295,4]]},"173":{"position":[[161,4],[370,4],[852,4],[936,4],[1069,4]]},"174":{"position":[[91,4],[401,4],[1969,4]]},"175":{"position":[[558,4]]},"179":{"position":[[408,4]]},"184":{"position":[[270,4]]},"185":{"position":[[280,4]]},"192":{"position":[[350,4]]},"198":{"position":[[114,4]]},"205":{"position":[[269,4]]},"208":{"position":[[324,4]]},"212":{"position":[[573,4]]},"220":{"position":[[283,4]]},"252":{"position":[[344,4]]},"255":{"position":[[197,4],[1855,4]]},"263":{"position":[[501,4]]},"265":{"position":[[322,4],[892,4]]},"267":{"position":[[53,4],[132,4],[186,4],[288,4],[411,4],[570,4],[741,4],[841,4],[930,4],[1041,4],[1209,4],[1442,4],[1530,4]]},"275":{"position":[[153,4]]},"283":{"position":[[308,4]]},"289":{"position":[[1258,4]]},"301":{"position":[[24,4],[263,4]]},"312":{"position":[[207,4]]},"318":{"position":[[667,4]]},"321":{"position":[[536,4]]},"322":{"position":[[214,4]]},"323":{"position":[[36,4]]},"325":{"position":[[220,4]]},"328":{"position":[[15,4]]},"330":{"position":[[151,4]]},"340":{"position":[[95,4]]},"344":{"position":[[107,4]]},"353":{"position":[[693,4]]},"368":{"position":[[360,4]]},"375":{"position":[[368,4]]},"378":{"position":[[161,4]]},"388":{"position":[[449,4]]},"408":{"position":[[1917,4]]},"410":{"position":[[422,4],[1619,4]]},"411":{"position":[[2821,4],[3874,4]]},"412":{"position":[[6484,4]]},"418":{"position":[[301,4]]},"419":{"position":[[1106,4]]},"420":{"position":[[1341,4]]},"421":{"position":[[240,4],[439,4]]},"432":{"position":[[1222,4]]},"445":{"position":[[301,4],[790,4],[850,4],[1135,4]]},"446":{"position":[[427,4],[478,4],[598,4],[750,4]]},"447":{"position":[[136,4]]},"469":{"position":[[1389,4]]},"476":{"position":[[100,4],[205,4]]},"479":{"position":[[182,4]]},"480":{"position":[[704,4]]},"483":{"position":[[135,4],[334,4]]},"490":{"position":[[693,4]]},"491":{"position":[[258,4],[823,4],[1526,4]]},"497":{"position":[[13,4]]},"498":{"position":[[311,4]]},"501":{"position":[[184,4]]},"502":{"position":[[110,4],[791,4]]},"504":{"position":[[1135,4]]},"509":{"position":[[75,4]]},"517":{"position":[[190,4]]},"529":{"position":[[135,4]]},"530":{"position":[[407,4]]},"540":{"position":[[64,4]]},"554":{"position":[[371,4]]},"566":{"position":[[399,4]]},"567":{"position":[[111,4]]},"569":{"position":[[86,4],[113,4],[408,4],[464,4],[514,4],[641,4]]},"575":{"position":[[229,4]]},"582":{"position":[[251,4]]},"585":{"position":[[122,4]]},"589":{"position":[[117,4]]},"595":{"position":[[850,4]]},"600":{"position":[[64,4]]},"610":{"position":[[824,4]]},"611":{"position":[[253,4]]},"612":{"position":[[321,4]]},"613":{"position":[[445,4]]},"614":{"position":[[13,4],[94,4]]},"621":{"position":[[124,4],[499,4]]},"631":{"position":[[74,4]]},"705":{"position":[[351,4]]},"723":{"position":[[985,4],[1168,4],[1569,4]]},"749":{"position":[[21370,4]]},"772":{"position":[[104,4]]},"776":{"position":[[375,4]]},"798":{"position":[[242,4]]},"802":{"position":[[888,4]]},"836":{"position":[[1469,4],[2303,4]]},"837":{"position":[[819,4]]},"838":{"position":[[441,4]]},"841":{"position":[[658,4],[1531,4]]},"860":{"position":[[140,4],[558,4],[590,4]]},"901":{"position":[[23,4]]},"903":{"position":[[16,4]]},"1072":{"position":[[872,4]]},"1132":{"position":[[946,4]]},"1150":{"position":[[145,4]]},"1209":{"position":[[324,4]]},"1313":{"position":[[512,4]]}},"keywords":{}}],["realiti",{"_index":2795,"title":{},"content":{"418":{"position":[[505,8]]},"875":{"position":[[4945,7],[5687,7]]}},"keywords":{}}],["realiz",{"_index":6559,"title":{},"content":{"1316":{"position":[[2444,11]]}},"keywords":{}}],["realli",{"_index":15,"title":{"697":{"position":[[23,6]]}},"content":{"1":{"position":[[230,6]]},"5":{"position":[[167,6]]},"19":{"position":[[547,6]]},"29":{"position":[[326,6]]},"260":{"position":[[258,6]]},"411":{"position":[[951,6]]},"465":{"position":[[345,6],[352,6]]},"468":{"position":[[17,6]]},"696":{"position":[[1550,6]]},"701":{"position":[[454,6],[958,6]]},"703":{"position":[[1194,6]]},"740":{"position":[[220,6]]},"773":{"position":[[187,6]]},"800":{"position":[[272,6]]},"837":{"position":[[585,6]]},"1156":{"position":[[202,6]]},"1167":{"position":[[1,6]]},"1171":{"position":[[344,6]]},"1193":{"position":[[164,6]]},"1238":{"position":[[121,6]]},"1241":{"position":[[90,6]]},"1315":{"position":[[958,6]]},"1318":{"position":[[957,6]]},"1321":{"position":[[126,6]]}},"keywords":{}}],["realm",{"_index":566,"title":{"36":{"position":[[8,6]]},"839":{"position":[[0,6]]}},"content":{"36":{"position":[[12,5],[262,5],[304,5],[351,5]]},"444":{"position":[[464,6]]},"445":{"position":[[79,5]]},"530":{"position":[[8,5]]},"749":{"position":[[8815,5]]},"839":{"position":[[3,5],[123,5],[402,5],[449,5],[672,5],[868,5],[1174,5]]},"841":{"position":[[49,5],[443,5],[639,5],[805,5],[1520,5]]},"1115":{"position":[[593,6]]},"1117":{"position":[[541,6]]},"1230":{"position":[[180,6],[280,6]]}},"keywords":{}}],["realm'",{"_index":4803,"title":{},"content":{"839":{"position":[[1063,7]]}},"keywords":{}}],["realmasterst",{"_index":5021,"title":{},"content":{"875":{"position":[[4637,15],[4721,15],[4783,15]]},"1309":{"position":[[1133,15]]}},"keywords":{}}],["realmasterstate.updatedat",{"_index":5025,"title":{},"content":{"875":{"position":[[5029,25]]}},"keywords":{}}],["realtim",{"_index":180,"title":{"12":{"position":[[17,8]]},"199":{"position":[[20,8]]},"200":{"position":[[34,8]]},"221":{"position":[[9,8]]},"568":{"position":[[10,8]]},"569":{"position":[[0,8],[15,8]]},"570":{"position":[[25,8]]},"571":{"position":[[0,8],[15,8]]},"699":{"position":[[0,8]]},"781":{"position":[[0,8]]},"980":{"position":[[7,8]]},"1150":{"position":[[12,8]]}},"content":{"14":{"position":[[173,8],[228,8],[261,8],[471,8],[653,8]]},"15":{"position":[[72,8]]},"18":{"position":[[380,8]]},"19":{"position":[[510,8]]},"20":{"position":[[82,9]]},"22":{"position":[[241,8]]},"25":{"position":[[85,8]]},"38":{"position":[[57,9]]},"201":{"position":[[17,8]]},"202":{"position":[[16,8]]},"203":{"position":[[10,8]]},"204":{"position":[[27,8]]},"205":{"position":[[24,8]]},"212":{"position":[[147,8]]},"221":{"position":[[1,8],[158,8]]},"238":{"position":[[8,8]]},"243":{"position":[[229,8]]},"410":{"position":[[1463,8],[1854,8]]},"444":{"position":[[601,8]]},"569":{"position":[[1000,8],[1084,9],[1100,8],[1268,8],[1495,8],[1541,8]]},"570":{"position":[[20,8],[61,9],[77,8],[161,8],[234,8]]},"571":{"position":[[19,8],[583,8],[647,8],[1405,8]]},"572":{"position":[[59,8]]},"625":{"position":[[16,8]]},"626":{"position":[[879,8]]},"627":{"position":[[218,8]]},"661":{"position":[[1580,8],[1808,8]]},"662":{"position":[[243,8],[304,8]]},"699":{"position":[[135,9],[197,8],[254,8],[759,9],[1017,8]]},"710":{"position":[[373,8]]},"781":{"position":[[225,8],[600,8]]},"784":{"position":[[544,8]]},"838":{"position":[[272,8],[333,8]]},"860":{"position":[[1211,8]]},"875":{"position":[[6722,8]]},"886":{"position":[[3244,8],[3781,8]]},"896":{"position":[[244,8]]},"897":{"position":[[306,8]]},"898":{"position":[[735,8]]},"965":{"position":[[47,8]]},"988":{"position":[[650,8],[4910,8]]},"1094":{"position":[[236,8]]},"1123":{"position":[[730,8]]},"1124":{"position":[[880,8],[1593,8],[2111,8]]},"1320":{"position":[[949,8]]},"1321":{"position":[[162,8]]}},"keywords":{}}],["reason",{"_index":79,"title":{"428":{"position":[[0,7]]}},"content":{"5":{"position":[[179,7]]},"67":{"position":[[140,8]]},"86":{"position":[[22,7]]},"98":{"position":[[155,7]]},"215":{"position":[[16,6]]},"225":{"position":[[116,7]]},"266":{"position":[[993,6]]},"278":{"position":[[195,7]]},"398":{"position":[[3008,10]]},"411":{"position":[[5726,7]]},"412":{"position":[[6973,10]]},"420":{"position":[[523,6]]},"455":{"position":[[329,8]]},"461":{"position":[[150,11]]},"485":{"position":[[145,7]]},"534":{"position":[[134,7]]},"556":{"position":[[1528,8]]},"594":{"position":[[132,7]]},"688":{"position":[[517,6]]},"691":{"position":[[664,6]]},"709":{"position":[[1072,6]]},"721":{"position":[[241,6]]},"740":{"position":[[129,6]]},"828":{"position":[[519,6]]},"837":{"position":[[824,6]]},"985":{"position":[[158,6]]},"990":{"position":[[53,7]]},"1010":{"position":[[161,6]]},"1085":{"position":[[176,7]]},"1105":{"position":[[1033,7]]},"1108":{"position":[[589,8]]},"1112":{"position":[[611,8]]},"1174":{"position":[[99,6]]},"1246":{"position":[[1480,6]]},"1281":{"position":[[55,6]]}},"keywords":{}}],["reassign",{"_index":4088,"title":{},"content":{"737":{"position":[[450,8]]}},"keywords":{}}],["rebuild",{"_index":3994,"title":{},"content":{"711":{"position":[[809,7],[956,7],[1005,7]]},"749":{"position":[[23687,7]]}},"keywords":{}}],["recalcul",{"_index":2627,"title":{},"content":{"411":{"position":[[3361,12]]}},"keywords":{}}],["receiv",{"_index":1175,"title":{},"content":{"159":{"position":[[187,7]]},"185":{"position":[[272,7]]},"379":{"position":[[112,7]]},"411":{"position":[[523,8]]},"415":{"position":[[475,9]]},"570":{"position":[[566,7]]},"610":{"position":[[533,9],[1576,8]]},"612":{"position":[[648,9]]},"616":{"position":[[88,7]]},"767":{"position":[[16,8]]},"768":{"position":[[13,8]]},"769":{"position":[[16,8]]},"875":{"position":[[7960,8]]},"886":{"position":[[2151,8]]},"986":{"position":[[1355,7]]},"991":{"position":[[183,8]]},"993":{"position":[[117,8]]},"1022":{"position":[[192,9],[318,9],[505,11],[851,9],[861,8],[1042,9]]}},"keywords":{}}],["received"",{"_index":5633,"title":{},"content":{"1022":{"position":[[959,14]]}},"keywords":{}}],["recent",{"_index":2704,"title":{},"content":{"412":{"position":[[5950,9]]}},"keywords":{}}],["recombin",{"_index":6455,"title":{},"content":{"1295":{"position":[[1333,10]]}},"keywords":{}}],["recommend",{"_index":73,"title":{"624":{"position":[[0,15]]},"1235":{"position":[[6,16]]}},"content":{"4":{"position":[[238,11]]},"9":{"position":[[98,11]]},"51":{"position":[[903,11]]},"145":{"position":[[78,11]]},"351":{"position":[[425,12]]},"432":{"position":[[1055,12]]},"434":{"position":[[358,11]]},"439":{"position":[[89,11]]},"566":{"position":[[620,11]]},"567":{"position":[[149,11]]},"590":{"position":[[15,15]]},"616":{"position":[[227,11]]},"655":{"position":[[98,11]]},"661":{"position":[[409,11]]},"662":{"position":[[513,11],[1076,11]]},"693":{"position":[[32,11]]},"709":{"position":[[937,11]]},"710":{"position":[[724,11],[1010,9],[2292,11]]},"711":{"position":[[460,12],[492,14]]},"716":{"position":[[253,11]]},"721":{"position":[[83,11]]},"772":{"position":[[2090,11]]},"834":{"position":[[89,9]]},"835":{"position":[[651,10]]},"836":{"position":[[375,9]]},"837":{"position":[[1209,11]]},"838":{"position":[[1382,11]]},"840":{"position":[[641,11]]},"857":{"position":[[554,11]]},"861":{"position":[[116,11]]},"911":{"position":[[274,11]]},"988":{"position":[[462,11]]},"1068":{"position":[[287,11]]},"1192":{"position":[[633,11]]},"1195":{"position":[[99,11]]},"1196":{"position":[[109,12]]},"1214":{"position":[[310,12]]},"1231":{"position":[[46,11]]},"1246":{"position":[[2058,11]]}},"keywords":{}}],["recommended)nev",{"_index":6174,"title":{},"content":{"1198":{"position":[[2126,18]]}},"keywords":{}}],["reconcil",{"_index":1301,"title":{},"content":{"201":{"position":[[387,10]]},"412":{"position":[[739,9]]},"416":{"position":[[214,9]]}},"keywords":{}}],["reconnect",{"_index":616,"title":{"626":{"position":[[34,13]]}},"content":{"39":{"position":[[152,11]]},"416":{"position":[[193,12]]},"446":{"position":[[399,10]]},"481":{"position":[[206,11]]},"610":{"position":[[1655,13]]},"612":{"position":[[1390,9]]},"626":{"position":[[30,12]]},"875":{"position":[[8619,9]]},"985":{"position":[[612,11]]},"988":{"position":[[5623,9]]}},"keywords":{}}],["reconnect.low",{"_index":2139,"title":{},"content":{"375":{"position":[[279,13]]}},"keywords":{}}],["reconnections.plan",{"_index":3528,"title":{},"content":{"590":{"position":[[791,18]]}},"keywords":{}}],["record",{"_index":1856,"title":{},"content":{"303":{"position":[[1437,7]]},"304":{"position":[[63,6]]},"350":{"position":[[40,6]]},"356":{"position":[[402,6]]},"360":{"position":[[38,6]]},"379":{"position":[[146,7]]},"412":{"position":[[9923,6]]},"943":{"position":[[240,7]]},"1009":{"position":[[288,7]]}},"keywords":{}}],["records.us",{"_index":3192,"title":{},"content":{"496":{"position":[[445,12]]}},"keywords":{}}],["recov",{"_index":2730,"title":{},"content":{"412":{"position":[[8263,7]]}},"keywords":{}}],["recreat",{"_index":2227,"title":{},"content":{"391":{"position":[[1098,8]]},"403":{"position":[[672,8]]},"1028":{"position":[[88,10]]}},"keywords":{}}],["recur",{"_index":5394,"title":{},"content":{"965":{"position":[[268,9]]}},"keywords":{}}],["red",{"_index":6524,"title":{},"content":{"1314":{"position":[[445,3],[542,3],[666,5]]}},"keywords":{}}],["red;">uncaught",{"_index":6184,"title":{},"content":{"1202":{"position":[[121,22]]}},"keywords":{}}],["reddit",{"_index":4590,"title":{},"content":{"779":{"position":[[38,6]]}},"keywords":{}}],["redefin",{"_index":1998,"title":{},"content":{"351":{"position":[[342,10]]},"510":{"position":[[97,8],[580,8]]}},"keywords":{}}],["redo",{"_index":5975,"title":{},"content":{"1110":{"position":[[64,5]]}},"keywords":{}}],["redraw",{"_index":2623,"title":{},"content":{"411":{"position":[[3030,6]]}},"keywords":{}}],["reduc",{"_index":718,"title":{"251":{"position":[[3,7]]},"477":{"position":[[3,7]]},"799":{"position":[[22,6]]}},"content":{"46":{"position":[[628,6]]},"57":{"position":[[406,6]]},"65":{"position":[[1364,6]]},"81":{"position":[[66,8]]},"87":{"position":[[129,6]]},"91":{"position":[[199,8]]},"93":{"position":[[29,7]]},"108":{"position":[[99,7]]},"111":{"position":[[99,7]]},"141":{"position":[[4,6],[162,8]]},"146":{"position":[[179,6]]},"169":{"position":[[161,6]]},"170":{"position":[[517,6]]},"173":{"position":[[760,7],[1775,7],[2042,7]]},"174":{"position":[[931,8],[1650,7],[1755,7],[2452,7]]},"197":{"position":[[107,7]]},"204":{"position":[[275,8]]},"216":{"position":[[156,6]]},"219":{"position":[[298,7]]},"223":{"position":[[333,8]]},"224":{"position":[[184,8]]},"234":{"position":[[94,7]]},"236":{"position":[[69,8],[186,7]]},"251":{"position":[[288,6]]},"263":{"position":[[298,6]]},"273":{"position":[[172,8]]},"281":{"position":[[406,7]]},"294":{"position":[[168,8]]},"301":{"position":[[633,6]]},"302":{"position":[[527,6]]},"311":{"position":[[195,8]]},"316":{"position":[[474,8]]},"323":{"position":[[423,6]]},"353":{"position":[[786,6]]},"354":{"position":[[1668,6]]},"361":{"position":[[416,8],[1111,7]]},"366":{"position":[[167,8]]},"369":{"position":[[872,7],[945,6]]},"375":{"position":[[305,8]]},"376":{"position":[[407,6]]},"392":{"position":[[5119,6]]},"396":{"position":[[288,8]]},"402":{"position":[[1283,7]]},"408":{"position":[[2564,6]]},"410":{"position":[[712,8]]},"411":{"position":[[1,7],[1519,7],[2454,6],[5135,8],[5339,8],[5678,8]]},"419":{"position":[[1477,6]]},"446":{"position":[[1394,8]]},"483":{"position":[[158,7],[851,6]]},"487":{"position":[[221,6]]},"490":{"position":[[456,6],[510,6]]},"495":{"position":[[490,6]]},"500":{"position":[[476,6]]},"508":{"position":[[54,7]]},"527":{"position":[[165,8]]},"528":{"position":[[38,6]]},"534":{"position":[[589,7]]},"550":{"position":[[316,6]]},"574":{"position":[[411,8]]},"582":{"position":[[636,8]]},"587":{"position":[[81,6]]},"588":{"position":[[74,8]]},"594":{"position":[[587,7]]},"610":{"position":[[682,7]]},"623":{"position":[[735,8]]},"630":{"position":[[316,8]]},"631":{"position":[[476,6]]},"632":{"position":[[218,8]]},"723":{"position":[[721,8]]},"780":{"position":[[308,8]]},"802":{"position":[[713,7]]},"901":{"position":[[428,7]]},"902":{"position":[[1,7],[807,8]]},"981":{"position":[[1659,7]]},"1009":{"position":[[627,7]]},"1124":{"position":[[107,6],[1750,6]]},"1132":{"position":[[1109,6]]},"1143":{"position":[[160,7],[305,7]]},"1211":{"position":[[495,6]]},"1237":{"position":[[223,6]]},"1316":{"position":[[1417,6]]}},"keywords":{}}],["reduct",{"_index":2490,"title":{},"content":{"402":{"position":[[2459,9]]}},"keywords":{}}],["redund",{"_index":1421,"title":{},"content":{"234":{"position":[[102,9]]},"736":{"position":[[533,9]]},"737":{"position":[[22,10]]}},"keywords":{}}],["redux",{"_index":1017,"title":{"785":{"position":[[19,6]]}},"content":{"96":{"position":[[125,5]]},"173":{"position":[[3086,5]]},"219":{"position":[[90,5]]},"411":{"position":[[1999,7]]},"478":{"position":[[93,6]]},"520":{"position":[[372,5]]},"785":{"position":[[296,5]]}},"keywords":{}}],["redux"",{"_index":1522,"title":{},"content":{"244":{"position":[[1437,11]]},"411":{"position":[[2619,11]]}},"keywords":{}}],["reestablish",{"_index":1296,"title":{},"content":{"191":{"position":[[210,14]]},"445":{"position":[[744,14]]},"516":{"position":[[274,14]]},"525":{"position":[[224,14]]},"981":{"position":[[1418,13]]}},"keywords":{}}],["ref",{"_index":3494,"title":{"808":{"position":[[12,4]]}},"content":{"580":{"position":[[308,4],[389,8]]},"590":{"position":[[284,5]]},"591":{"position":[[518,5]]},"601":{"position":[[386,4]]},"749":{"position":[[10108,3],[10190,3],[12069,5],[17060,3],[17183,3],[21028,4],[21206,4]]},"808":{"position":[[5,3],[262,4],[324,3],[646,4]]},"812":{"position":[[209,4]]},"813":{"position":[[169,4]]}},"keywords":{}}],["ref<any[]>",{"_index":3542,"title":{},"content":{"601":{"position":[[461,21]]}},"keywords":{}}],["refactor",{"_index":6014,"title":{},"content":{"1124":{"position":[[318,8]]}},"keywords":{}}],["refer",{"_index":1196,"title":{"812":{"position":[[20,10]]},"817":{"position":[[6,10]]}},"content":{"172":{"position":[[22,6]]},"188":{"position":[[2488,10]]},"387":{"position":[[186,10]]},"390":{"position":[[132,8]]},"563":{"position":[[776,9]]},"570":{"position":[[52,5]]},"571":{"position":[[75,6]]},"808":{"position":[[279,6],[450,9]]},"810":{"position":[[12,8]]},"817":{"position":[[46,10]]},"899":{"position":[[17,10]]},"1173":{"position":[[272,9]]},"1284":{"position":[[355,9]]}},"keywords":{}}],["referenc",{"_index":4702,"title":{},"content":{"817":{"position":[[131,10]]}},"keywords":{}}],["referenceerror",{"_index":2923,"title":{},"content":{"438":{"position":[[97,15]]},"440":{"position":[[293,15]]},"729":{"position":[[100,15]]},"1202":{"position":[[144,15]]}},"keywords":{}}],["referencerxserv",{"_index":4976,"title":{},"content":{"873":{"position":[[133,17]]}},"keywords":{}}],["referenti",{"_index":2012,"title":{},"content":{"353":{"position":[[557,11]]},"412":{"position":[[13762,11]]}},"keywords":{}}],["refetch",{"_index":2151,"title":{},"content":{"379":{"position":[[184,10]]}},"keywords":{}}],["refetch.cross",{"_index":3163,"title":{},"content":{"490":{"position":[[300,13]]}},"keywords":{}}],["refhuman",{"_index":4674,"title":{},"content":{"808":{"position":[[124,8]]}},"keywords":{}}],["refin",{"_index":3446,"title":{},"content":{"567":{"position":[[1070,6]]},"935":{"position":[[67,6]]}},"keywords":{}}],["reflect",{"_index":611,"title":{},"content":{"38":{"position":[[1146,9]]},"53":{"position":[[98,7]]},"90":{"position":[[199,7]]},"125":{"position":[[259,9]]},"160":{"position":[[173,9]]},"185":{"position":[[302,7]]},"323":{"position":[[108,7]]},"329":{"position":[[212,7]]},"411":{"position":[[4392,7]]},"475":{"position":[[211,7]]},"493":{"position":[[527,10]]},"562":{"position":[[979,7]]},"571":{"position":[[230,7]]},"589":{"position":[[168,9]]},"632":{"position":[[304,7]]},"634":{"position":[[146,7]]},"681":{"position":[[150,7]]},"723":{"position":[[1235,10]]}},"keywords":{}}],["refresh",{"_index":1927,"title":{},"content":{"326":{"position":[[254,7]]},"346":{"position":[[218,10]]},"360":{"position":[[360,7]]},"411":{"position":[[3054,8]]},"421":{"position":[[426,7]]},"490":{"position":[[156,8]]},"567":{"position":[[924,7]]},"571":{"position":[[1041,7]]},"575":{"position":[[652,7]]}},"keywords":{}}],["refs/react",{"_index":3489,"title":{},"content":{"580":{"position":[[153,13]]}},"keywords":{}}],["refus",{"_index":1862,"title":{},"content":{"304":{"position":[[347,7]]},"685":{"position":[[565,6]]},"1207":{"position":[[661,6]]}},"keywords":{}}],["regardless",{"_index":1003,"title":{},"content":{"88":{"position":[[63,10]]},"183":{"position":[[329,10]]},"206":{"position":[[246,10]]},"516":{"position":[[214,10]]},"632":{"position":[[2794,10]]}},"keywords":{}}],["regex",{"_index":2568,"title":{"1110":{"position":[[0,6]]}},"content":{"408":{"position":[[4804,5]]},"749":{"position":[[147,5],[1784,8],[2948,6],[16864,5]]},"796":{"position":[[633,6],[879,7],[916,5]]},"935":{"position":[[225,6]]},"1065":{"position":[[481,5],[507,6],[821,7],[1319,7]]},"1067":{"position":[[1242,6],[1324,7],[2003,7],[2147,7]]},"1072":{"position":[[2543,5],[2682,7],[2740,5],[2801,5]]},"1084":{"position":[[329,5]]},"1110":{"position":[[1,6]]},"1132":{"position":[[760,6]]}},"keywords":{}}],["regexp",{"_index":4173,"title":{},"content":{"749":{"position":[[2999,6],[3032,6]]},"1065":{"position":[[570,6],[655,6],[730,6]]}},"keywords":{}}],["regexqueri",{"_index":4641,"title":{},"content":{"796":{"position":[[844,10]]}},"keywords":{}}],["region",{"_index":6011,"title":{},"content":{"1123":{"position":[[114,7],[247,8]]}},"keywords":{}}],["registri",{"_index":1664,"title":{},"content":{"285":{"position":[[205,9]]}},"keywords":{}}],["regul",{"_index":3334,"title":{},"content":{"550":{"position":[[397,11]]}},"keywords":{}}],["regular",{"_index":3550,"title":{},"content":{"610":{"position":[[293,7]]},"1072":{"position":[[2556,7]]}},"keywords":{}}],["regularli",{"_index":3784,"title":{},"content":{"660":{"position":[[168,9]]},"815":{"position":[[159,10]]},"1174":{"position":[[154,9]]}},"keywords":{}}],["reimplement",{"_index":57,"title":{},"content":{"4":{"position":[[3,16]]}},"keywords":{}}],["reindex",{"_index":4041,"title":{},"content":{"723":{"position":[[1306,11],[1631,10],[1798,7]]}},"keywords":{}}],["rej",{"_index":3001,"title":{},"content":{"459":{"position":[[860,4]]},"1294":{"position":[[1154,4]]}},"keywords":{}}],["rej(err",{"_index":6439,"title":{},"content":{"1294":{"position":[[1544,9]]}},"keywords":{}}],["rej(ev",{"_index":3005,"title":{},"content":{"459":{"position":[[965,11]]}},"keywords":{}}],["reject",{"_index":3014,"title":{},"content":{"461":{"position":[[337,6]]},"987":{"position":[[429,6]]}},"keywords":{}}],["rejecterror",{"_index":842,"title":{},"content":{"55":{"position":[[585,13]]}},"keywords":{}}],["rel",{"_index":896,"title":{},"content":{"63":{"position":[[144,10]]},"300":{"position":[[33,8]]},"412":{"position":[[2028,10]]},"453":{"position":[[44,10]]}},"keywords":{}}],["relat",{"_index":1021,"title":{"278":{"position":[[67,10]]},"694":{"position":[[0,8]]},"705":{"position":[[12,10]]},"787":{"position":[[12,10]]},"1259":{"position":[[7,10]]},"1283":{"position":[[0,8]]},"1315":{"position":[[0,10]]},"1319":{"position":[[18,10]]}},"content":{"96":{"position":[[254,7]]},"104":{"position":[[205,7]]},"202":{"position":[[196,10]]},"276":{"position":[[135,10]]},"279":{"position":[[356,10]]},"282":{"position":[[260,10]]},"352":{"position":[[388,10]]},"353":{"position":[[426,10]]},"354":{"position":[[387,10],[710,10],[984,10],[1380,10],[1437,10]]},"362":{"position":[[272,10],[472,10]]},"364":{"position":[[725,7]]},"372":{"position":[[172,10]]},"412":{"position":[[13402,10],[13717,10],[14078,10],[14294,10],[14543,10]]},"439":{"position":[[146,7]]},"661":{"position":[[23,10]]},"705":{"position":[[268,10],[356,9],[947,10]]},"711":{"position":[[23,10]]},"749":{"position":[[21091,7]]},"808":{"position":[[151,7]]},"836":{"position":[[25,10]]},"1315":{"position":[[30,10]]},"1316":{"position":[[3714,10]]},"1318":{"position":[[974,10]]},"1319":{"position":[[356,10],[604,10]]},"1323":{"position":[[17,10]]},"1324":{"position":[[269,10],[630,10]]}},"keywords":{}}],["relationship",{"_index":2004,"title":{},"content":{"353":{"position":[[92,14]]},"354":{"position":[[205,14],[302,13]]},"372":{"position":[[298,13]]},"427":{"position":[[593,13]]},"808":{"position":[[95,14]]},"863":{"position":[[835,12],[942,12]]},"1132":{"position":[[722,14]]}},"keywords":{}}],["relax",{"_index":2524,"title":{"1297":{"position":[[0,7]]}},"content":{"408":{"position":[[165,7]]},"1297":{"position":[[52,7],[410,7]]}},"keywords":{}}],["releas",{"_index":1133,"title":{},"content":{"143":{"position":[[267,8]]},"726":{"position":[[23,7]]},"793":{"position":[[1400,8]]},"1123":{"position":[[148,7]]}},"keywords":{}}],["relev",{"_index":1931,"title":{},"content":{"329":{"position":[[76,8]]},"394":{"position":[[1244,10]]},"398":{"position":[[596,8]]},"412":{"position":[[7090,8]]},"468":{"position":[[573,8]]},"518":{"position":[[225,8]]},"626":{"position":[[178,8]]},"680":{"position":[[306,8]]},"709":{"position":[[1053,9]]},"723":{"position":[[331,8],[2353,9]]},"783":{"position":[[675,9]]},"1007":{"position":[[991,8]]},"1072":{"position":[[2274,8]]},"1078":{"position":[[766,8]]},"1193":{"position":[[171,8]]},"1214":{"position":[[403,8]]},"1296":{"position":[[206,8]]},"1319":{"position":[[404,8]]}},"keywords":{}}],["reli",{"_index":664,"title":{},"content":{"42":{"position":[[320,7]]},"91":{"position":[[111,7]]},"99":{"position":[[25,4]]},"173":{"position":[[2006,7],[3032,7]]},"201":{"position":[[42,6]]},"204":{"position":[[10,4]]},"216":{"position":[[295,4]]},"220":{"position":[[100,7]]},"226":{"position":[[25,4]]},"254":{"position":[[477,4]]},"298":{"position":[[268,4]]},"305":{"position":[[376,4]]},"320":{"position":[[190,4]]},"321":{"position":[[305,7]]},"346":{"position":[[235,4]]},"357":{"position":[[354,4]]},"382":{"position":[[13,7]]},"411":{"position":[[1951,4]]},"412":{"position":[[1962,6],[14110,6]]},"414":{"position":[[368,4]]},"418":{"position":[[225,4]]},"424":{"position":[[455,7]]},"427":{"position":[[1072,4]]},"430":{"position":[[208,6]]},"444":{"position":[[640,4]]},"446":{"position":[[83,4]]},"476":{"position":[[11,4]]},"497":{"position":[[813,4]]},"563":{"position":[[861,4]]},"569":{"position":[[314,6]]},"618":{"position":[[529,4]]},"621":{"position":[[398,6]]},"660":{"position":[[276,4],[535,4]]},"698":{"position":[[1601,7]]},"749":{"position":[[13430,6]]},"828":{"position":[[136,4]]},"830":{"position":[[114,4]]},"839":{"position":[[852,4]]},"854":{"position":[[1366,4]]},"1072":{"position":[[1665,6]]},"1147":{"position":[[227,4]]},"1301":{"position":[[343,4]]},"1305":{"position":[[147,4],[390,6]]},"1316":{"position":[[1887,4]]}},"keywords":{}}],["reliability.opf",{"_index":1105,"title":{},"content":{"131":{"position":[[339,16]]}},"keywords":{}}],["reliabl",{"_index":705,"title":{"386":{"position":[[7,12]]},"1316":{"position":[[0,8]]}},"content":{"46":{"position":[[121,8]]},"170":{"position":[[617,8]]},"178":{"position":[[83,8]]},"270":{"position":[[226,8]]},"281":{"position":[[448,12]]},"287":{"position":[[528,8]]},"289":{"position":[[273,8]]},"380":{"position":[[389,11]]},"412":{"position":[[8899,10]]},"432":{"position":[[32,8]]},"483":{"position":[[1210,12]]},"501":{"position":[[77,8]]},"504":{"position":[[811,8]]},"613":{"position":[[260,8]]},"618":{"position":[[583,8]]},"624":{"position":[[1234,8]]},"630":{"position":[[985,9]]},"705":{"position":[[991,8],[1430,8]]},"723":{"position":[[1864,8],[2767,8]]},"836":{"position":[[1189,8]]},"906":{"position":[[354,8]]},"1300":{"position":[[1027,9]]},"1316":{"position":[[112,9],[141,8],[312,8]]}},"keywords":{}}],["relianc",{"_index":2639,"title":{},"content":{"411":{"position":[[5144,8]]},"582":{"position":[[645,8]]},"624":{"position":[[1032,8]]},"902":{"position":[[820,8]]}},"keywords":{}}],["reliant",{"_index":2027,"title":{},"content":{"354":{"position":[[1086,7]]}},"keywords":{}}],["reload",{"_index":2062,"title":{},"content":{"358":{"position":[[498,6]]},"403":{"position":[[251,8]]},"410":{"position":[[1574,8]]},"421":{"position":[[101,8]]},"436":{"position":[[215,7]]},"463":{"position":[[1307,9]]},"467":{"position":[[622,8]]},"740":{"position":[[655,6]]},"749":{"position":[[5956,6],[5968,7],[5993,9]]},"879":{"position":[[580,6]]},"958":{"position":[[8,6],[182,8]]},"988":{"position":[[407,7]]},"990":{"position":[[1168,7],[1391,6]]},"1301":{"position":[[1601,6]]}},"keywords":{}}],["remain",{"_index":914,"title":{},"content":{"65":{"position":[[524,7],[1763,7]]},"123":{"position":[[244,7]]},"135":{"position":[[152,7]]},"139":{"position":[[223,7]]},"167":{"position":[[184,7]]},"173":{"position":[[1299,7],[1423,7]]},"203":{"position":[[305,7]]},"218":{"position":[[260,7]]},"233":{"position":[[262,7]]},"248":{"position":[[141,7]]},"249":{"position":[[393,7]]},"273":{"position":[[265,7]]},"279":{"position":[[502,7]]},"280":{"position":[[232,6]]},"288":{"position":[[126,7]]},"291":{"position":[[257,7]]},"292":{"position":[[178,7]]},"293":{"position":[[348,7]]},"294":{"position":[[276,7]]},"305":{"position":[[20,6]]},"314":{"position":[[1121,7]]},"346":{"position":[[723,7]]},"353":{"position":[[37,7]]},"354":{"position":[[1530,7]]},"366":{"position":[[263,6]]},"369":{"position":[[628,7]]},"375":{"position":[[103,6]]},"385":{"position":[[250,6]]},"412":{"position":[[2020,7]]},"416":{"position":[[399,6]]},"421":{"position":[[1000,6]]},"424":{"position":[[278,7]]},"429":{"position":[[442,7]]},"482":{"position":[[1118,7]]},"502":{"position":[[420,6]]},"510":{"position":[[487,7],[671,6]]},"525":{"position":[[275,7]]},"526":{"position":[[155,7]]},"530":{"position":[[613,7]]},"534":{"position":[[243,7]]},"550":{"position":[[375,6]]},"582":{"position":[[85,7]]},"594":{"position":[[241,7]]},"610":{"position":[[369,7]]},"632":{"position":[[2763,7]]},"642":{"position":[[200,7]]},"723":{"position":[[1440,7]]},"801":{"position":[[459,7]]},"839":{"position":[[1137,6]]},"860":{"position":[[387,7]]},"902":{"position":[[638,6]]},"912":{"position":[[422,7]]},"1007":{"position":[[1070,6]]},"1157":{"position":[[415,7]]}},"keywords":{}}],["rememb",{"_index":3058,"title":{},"content":{"464":{"position":[[1273,8]]},"468":{"position":[[33,8]]},"559":{"position":[[1523,9]]},"620":{"position":[[483,8]]},"626":{"position":[[467,8]]},"1052":{"position":[[83,8]]},"1316":{"position":[[1587,8]]}},"keywords":{}}],["remot",{"_index":652,"title":{"1217":{"position":[[0,6]]}},"content":{"41":{"position":[[198,6]]},"57":{"position":[[101,6]]},"173":{"position":[[1741,6]]},"201":{"position":[[422,6]]},"208":{"position":[[78,6]]},"216":{"position":[[303,6]]},"248":{"position":[[295,6]]},"322":{"position":[[256,6]]},"360":{"position":[[402,6],[506,6]]},"365":{"position":[[1302,6],[1581,6]]},"375":{"position":[[329,6]]},"407":{"position":[[90,6]]},"410":{"position":[[590,6],[1160,6]]},"411":{"position":[[2374,6],[2930,6]]},"412":{"position":[[4741,7]]},"444":{"position":[[648,6]]},"474":{"position":[[24,6]]},"481":{"position":[[75,6]]},"491":{"position":[[98,6]]},"516":{"position":[[334,6]]},"544":{"position":[[122,6]]},"562":{"position":[[1729,6]]},"565":{"position":[[224,6]]},"566":{"position":[[1154,6]]},"582":{"position":[[357,6],[392,6]]},"604":{"position":[[122,6]]},"632":{"position":[[55,6],[1736,6]]},"693":{"position":[[178,6]]},"723":{"position":[[768,6]]},"737":{"position":[[138,6]]},"749":{"position":[[23618,6]]},"775":{"position":[[272,6],[632,6],[702,6]]},"778":{"position":[[244,6]]},"793":{"position":[[465,6]]},"861":{"position":[[1983,6]]},"886":{"position":[[1489,6]]},"986":{"position":[[984,6],[1330,6],[1428,6]]},"988":{"position":[[441,6],[772,6],[2366,6],[2474,6],[3246,7],[3447,6],[3668,6],[3912,7]]},"990":{"position":[[32,6],[190,6],[260,6]]},"993":{"position":[[135,6],[256,6]]},"1002":{"position":[[113,7],[853,6]]},"1068":{"position":[[327,8]]},"1147":{"position":[[39,6]]},"1218":{"position":[[5,6],[342,8],[525,6],[609,6],[754,8]]},"1219":{"position":[[5,6],[65,6],[403,6],[843,6]]},"1220":{"position":[[5,6],[77,6],[103,6]]},"1246":{"position":[[659,7],[672,6],[706,6],[787,6],[2204,6]]},"1307":{"position":[[388,6]]},"1309":{"position":[[667,7]]},"1315":{"position":[[802,6]]}},"keywords":{}}],["remote.no",{"_index":5504,"title":{},"content":{"995":{"position":[[116,9]]}},"keywords":{}}],["remotedatabasenam",{"_index":4859,"title":{},"content":{"851":{"position":[[291,18],[362,19]]}},"keywords":{}}],["remotemessagechannel",{"_index":6245,"title":{},"content":{"1218":{"position":[[245,21]]}},"keywords":{}}],["remov",{"_index":468,"title":{"769":{"position":[[0,7]]},"929":{"position":[[0,9]]},"954":{"position":[[0,9]]},"977":{"position":[[0,9]]},"999":{"position":[[0,9]]},"1028":{"position":[[0,9]]},"1047":{"position":[[0,9]]},"1048":{"position":[[0,6]]},"1062":{"position":[[0,8]]}},"content":{"28":{"position":[[780,7]]},"46":{"position":[[313,8],[583,6]]},"302":{"position":[[604,7],[990,6]]},"303":{"position":[[1449,7]]},"305":{"position":[[189,6],[498,6]]},"346":{"position":[[508,8]]},"412":{"position":[[8617,6]]},"421":{"position":[[753,8]]},"425":{"position":[[415,8]]},"455":{"position":[[268,7]]},"475":{"position":[[244,7]]},"489":{"position":[[534,7]]},"570":{"position":[[469,7]]},"653":{"position":[[1116,6]]},"746":{"position":[[846,7]]},"749":{"position":[[8770,7],[9382,6]]},"751":{"position":[[435,7],[1831,7]]},"754":{"position":[[94,7]]},"769":{"position":[[4,6],[47,8],[585,6]]},"829":{"position":[[3898,7]]},"861":{"position":[[1802,7]]},"887":{"position":[[479,6]]},"903":{"position":[[199,8]]},"921":{"position":[[126,7]]},"929":{"position":[[1,7]]},"941":{"position":[[235,7]]},"945":{"position":[[18,6],[58,7],[423,8]]},"954":{"position":[[1,7],[74,7],[187,7]]},"955":{"position":[[1,7]]},"956":{"position":[[81,8],[170,7],[358,11]]},"958":{"position":[[477,6],[625,6]]},"976":{"position":[[195,6]]},"977":{"position":[[171,8],[329,6],[442,6]]},"979":{"position":[[50,7]]},"999":{"position":[[154,9]]},"1018":{"position":[[302,6]]},"1022":{"position":[[616,6]]},"1023":{"position":[[272,6]]},"1028":{"position":[[29,7]]},"1043":{"position":[[156,6]]},"1044":{"position":[[530,6]]},"1047":{"position":[[6,7]]},"1048":{"position":[[57,6],[424,8],[530,8]]},"1062":{"position":[[209,6]]},"1090":{"position":[[1291,6]]},"1151":{"position":[[520,6]]},"1162":{"position":[[986,7],[1035,7]]},"1178":{"position":[[519,6]]},"1198":{"position":[[1847,8]]},"1320":{"position":[[664,8]]}},"keywords":{}}],["removeddoc",{"_index":5753,"title":{},"content":{"1062":{"position":[[256,11]]}},"keywords":{}}],["removeitem",{"_index":2869,"title":{},"content":{"425":{"position":[[185,11],[435,10]]},"451":{"position":[[212,10]]}},"keywords":{}}],["removeolddocu",{"_index":1816,"title":{},"content":{"302":{"position":[[1030,21]]}},"keywords":{}}],["removerxdatabas",{"_index":5420,"title":{},"content":{"977":{"position":[[202,19],[359,18],[548,16]]}},"keywords":{}}],["removerxdatabase('mydatabasenam",{"_index":5422,"title":{},"content":{"977":{"position":[[580,34]]},"1085":{"position":[[3606,34]]}},"keywords":{}}],["renam",{"_index":1992,"title":{"868":{"position":[[41,7]]}},"content":{"351":{"position":[[111,6]]},"636":{"position":[[221,6]]},"868":{"position":[[41,7]]},"977":{"position":[[293,8]]}},"keywords":{}}],["render",{"_index":983,"title":{},"content":{"78":{"position":[[66,10]]},"217":{"position":[[213,6]]},"234":{"position":[[203,8]]},"335":{"position":[[940,7]]},"373":{"position":[[651,6]]},"384":{"position":[[172,9]]},"385":{"position":[[321,8]]},"451":{"position":[[691,10]]},"494":{"position":[[639,7]]},"524":{"position":[[879,8]]},"634":{"position":[[339,6]]},"693":{"position":[[111,8],[219,8],[483,8],[508,8]]},"703":{"position":[[1543,6]]},"707":{"position":[[282,8]]},"708":{"position":[[625,8]]},"709":{"position":[[58,8],[437,8],[1007,9],[1267,8]]},"710":{"position":[[1060,8],[1171,8],[2204,8],[2425,9]]},"711":{"position":[[293,8],[395,8],[1455,8],[1645,8]]},"801":{"position":[[504,6]]},"828":{"position":[[106,6],[293,8]]},"829":{"position":[[2071,7],[2252,6],[2702,8],[2731,8],[2900,10],[3661,7]]},"1164":{"position":[[1449,9]]},"1246":{"position":[[2137,8],[2245,8]]}},"keywords":{}}],["renderer.j",{"_index":3932,"title":{},"content":{"693":{"position":[[1004,11]]}},"keywords":{}}],["renown",{"_index":1655,"title":{},"content":{"281":{"position":[[50,8]]},"574":{"position":[[8,8]]}},"keywords":{}}],["reopen",{"_index":6138,"title":{},"content":{"1174":{"position":[[671,7]]}},"keywords":{}}],["rep",{"_index":5574,"title":{},"content":{"1007":{"position":[[1842,3],[1886,5]]}},"keywords":{}}],["rep.cancel",{"_index":5575,"title":{},"content":{"1007":{"position":[[1894,13]]}},"keywords":{}}],["repeat",{"_index":1199,"title":{},"content":{"173":{"position":[[781,8]]},"251":{"position":[[111,8]]},"299":{"position":[[562,8]]},"411":{"position":[[225,8]]},"610":{"position":[[618,8]]},"639":{"position":[[66,8]]}},"keywords":{}}],["repeatedli",{"_index":908,"title":{},"content":{"65":{"position":[[330,10]]},"321":{"position":[[273,10]]},"411":{"position":[[3896,10]]},"610":{"position":[[249,10]]},"624":{"position":[[1450,10]]}},"keywords":{}}],["repetit",{"_index":1784,"title":{},"content":{"301":{"position":[[172,10]]},"311":{"position":[[10,10]]},"345":{"position":[[33,10]]}},"keywords":{}}],["replac",{"_index":571,"title":{"815":{"position":[[6,11]]}},"content":{"36":{"position":[[157,11]]},"141":{"position":[[121,8]]},"260":{"position":[[273,7]]},"313":{"position":[[142,7]]},"314":{"position":[[1043,7]]},"412":{"position":[[1479,8]]},"614":{"position":[[1008,11]]},"639":{"position":[[117,8]]},"731":{"position":[[217,7]]},"815":{"position":[[49,11]]},"818":{"position":[[9,11]]},"838":{"position":[[1658,7]]},"934":{"position":[[715,11]]},"1154":{"position":[[148,7]]}},"keywords":{}}],["replic",{"_index":184,"title":{"82":{"position":[[0,11]]},"89":{"position":[[25,11]]},"113":{"position":[[0,11]]},"123":{"position":[[5,12]]},"158":{"position":[[5,12]]},"165":{"position":[[5,11]]},"184":{"position":[[5,12]]},"192":{"position":[[5,11]]},"210":{"position":[[15,11]]},"223":{"position":[[11,11]]},"238":{"position":[[0,11]]},"261":{"position":[[28,12]]},"279":{"position":[[22,12]]},"288":{"position":[[0,11]]},"289":{"position":[[5,11]]},"293":{"position":[[14,11]]},"328":{"position":[[5,12]]},"381":{"position":[[14,12]]},"491":{"position":[[0,11]]},"517":{"position":[[5,12]]},"570":{"position":[[34,12]]},"685":{"position":[[11,12]]},"756":{"position":[[14,12]]},"843":{"position":[[0,11]]},"853":{"position":[[0,11]]},"857":{"position":[[10,11]]},"858":{"position":[[9,12]]},"859":{"position":[[14,11]]},"862":{"position":[[31,12]]},"863":{"position":[[28,11]]},"864":{"position":[[0,11]]},"868":{"position":[[16,11],[52,11]]},"869":{"position":[[8,11]]},"874":{"position":[[5,11]]},"877":{"position":[[12,11]]},"883":{"position":[[0,11]]},"891":{"position":[[10,11]]},"895":{"position":[[9,11]]},"900":{"position":[[11,11]]},"903":{"position":[[26,11]]},"904":{"position":[[27,11]]},"905":{"position":[[5,13]]},"908":{"position":[[29,12]]},"912":{"position":[[8,10]]},"1004":{"position":[[11,12]]},"1005":{"position":[[10,12]]},"1007":{"position":[[31,13]]},"1022":{"position":[[39,12]]},"1094":{"position":[[0,9]]},"1101":{"position":[[0,11]]},"1121":{"position":[[8,12]]},"1149":{"position":[[16,12]]},"1165":{"position":[[0,11]]},"1231":{"position":[[0,11]]},"1308":{"position":[[0,11]]},"1316":{"position":[[9,12]]}},"content":{"13":{"position":[[24,12]]},"14":{"position":[[541,10],[1090,9],[1178,9],[1225,11]]},"15":{"position":[[195,12],[390,9]]},"16":{"position":[[137,11],[487,11]]},"18":{"position":[[389,12]]},"19":{"position":[[132,9],[519,12]]},"22":{"position":[[342,11]]},"23":{"position":[[105,11],[159,12],[197,11],[379,11]]},"24":{"position":[[282,9]]},"25":{"position":[[230,11]]},"26":{"position":[[229,9]]},"29":{"position":[[83,11],[137,9]]},"35":{"position":[[451,11]]},"36":{"position":[[322,11]]},"40":{"position":[[36,10],[649,11]]},"42":{"position":[[146,11]]},"46":{"position":[[423,11]]},"57":{"position":[[60,12],[137,12]]},"82":{"position":[[8,11]]},"89":{"position":[[32,11],[152,11]]},"109":{"position":[[82,11]]},"113":{"position":[[21,11]]},"120":{"position":[[295,12]]},"123":{"position":[[41,11]]},"132":{"position":[[6,11],[193,9]]},"135":{"position":[[106,10]]},"147":{"position":[[226,11]]},"158":{"position":[[37,11],[90,11]]},"164":{"position":[[293,11]]},"165":{"position":[[26,11],[154,11],[306,11]]},"170":{"position":[[231,11]]},"173":{"position":[[314,11],[405,11],[528,11]]},"174":{"position":[[2942,11]]},"184":{"position":[[6,11],[98,11],[207,11]]},"186":{"position":[[324,11]]},"192":{"position":[[15,11],[197,12],[218,12],[298,11]]},"208":{"position":[[94,11]]},"209":{"position":[[610,11]]},"211":{"position":[[554,11]]},"212":{"position":[[601,11]]},"223":{"position":[[1,11],[190,11],[239,11],[415,12]]},"238":{"position":[[17,11]]},"248":{"position":[[233,11]]},"249":{"position":[[423,11]]},"255":{"position":[[6,11],[961,11],[1718,12]]},"260":{"position":[[7,11],[132,11]]},"261":{"position":[[84,11],[1021,11]]},"262":{"position":[[589,11]]},"263":{"position":[[596,11]]},"266":{"position":[[928,10]]},"279":{"position":[[126,11],[411,11]]},"288":{"position":[[16,11],[223,11]]},"289":{"position":[[24,11],[301,12],[328,11],[456,12],[501,11],[714,12],[991,12],[1084,11],[1120,12],[1426,11],[1556,12],[1588,11],[1683,11],[1900,12]]},"293":{"position":[[163,11],[297,11]]},"312":{"position":[[66,11]]},"316":{"position":[[555,12]]},"323":{"position":[[321,12]]},"328":{"position":[[30,11],[79,12]]},"360":{"position":[[455,11]]},"362":{"position":[[853,12]]},"381":{"position":[[50,12],[154,12],[291,9],[397,11]]},"386":{"position":[[154,11]]},"410":{"position":[[779,10]]},"411":{"position":[[1307,11]]},"412":{"position":[[1779,11],[1879,11],[3696,10],[12490,9],[12569,11],[13698,11],[14504,11],[14841,11]]},"438":{"position":[[253,10]]},"439":{"position":[[463,9]]},"476":{"position":[[177,11]]},"477":{"position":[[148,9]]},"478":{"position":[[163,9]]},"479":{"position":[[201,11]]},"480":{"position":[[1005,9]]},"481":{"position":[[272,11]]},"483":{"position":[[252,11]]},"487":{"position":[[343,11]]},"490":{"position":[[113,11]]},"491":{"position":[[138,11],[1256,11]]},"495":{"position":[[667,11]]},"504":{"position":[[691,11],[718,11],[765,11],[878,12],[953,11],[1074,12],[1287,12],[1318,12]]},"510":{"position":[[290,11]]},"513":{"position":[[339,12]]},"517":{"position":[[6,11],[151,11]]},"525":{"position":[[415,11],[575,12],[596,12]]},"534":{"position":[[445,11]]},"544":{"position":[[81,12]]},"556":{"position":[[1737,11]]},"565":{"position":[[76,11]]},"566":{"position":[[1139,11]]},"570":{"position":[[86,12],[678,11],[928,11]]},"571":{"position":[[477,10]]},"575":{"position":[[429,12]]},"576":{"position":[[264,12]]},"582":{"position":[[290,11]]},"594":{"position":[[443,11]]},"604":{"position":[[81,12]]},"617":{"position":[[2283,11]]},"626":{"position":[[984,11]]},"628":{"position":[[124,9]]},"630":{"position":[[814,11]]},"631":{"position":[[84,11]]},"632":{"position":[[8,11],[403,11],[584,11],[637,11],[841,11],[2044,11],[2094,12],[2611,9],[2687,11]]},"634":{"position":[[469,12]]},"639":{"position":[[208,12]]},"644":{"position":[[79,11]]},"653":{"position":[[1035,12],[1064,11],[1181,11]]},"659":{"position":[[878,11]]},"661":{"position":[[1589,11]]},"683":{"position":[[417,11]]},"685":{"position":[[98,11],[138,11],[165,11],[196,12],[237,10]]},"686":{"position":[[421,9]]},"690":{"position":[[445,12]]},"697":{"position":[[394,9]]},"698":{"position":[[124,9],[1667,9],[1734,11],[3031,10]]},"699":{"position":[[8,9]]},"700":{"position":[[256,10],[488,10],[599,11],[654,11],[969,10],[1099,11]]},"701":{"position":[[186,10],[398,9],[903,10],[1016,9],[1130,11],[1187,12]]},"705":{"position":[[638,11],[760,10],[873,10],[1084,11],[1138,11],[1250,11]]},"711":{"position":[[2037,11],[2277,12]]},"714":{"position":[[1037,9]]},"740":{"position":[[283,9]]},"743":{"position":[[275,10]]},"746":{"position":[[627,11]]},"749":{"position":[[448,11],[14572,12],[14842,11],[14998,11],[15039,11],[16414,11],[16680,11],[22361,12],[22468,12]]},"756":{"position":[[90,11],[233,11],[358,11]]},"757":{"position":[[74,11]]},"775":{"position":[[239,11],[294,11],[365,10]]},"781":{"position":[[609,11]]},"784":{"position":[[436,9],[497,11],[553,11]]},"793":{"position":[[610,11],[642,11],[663,11],[683,11],[705,11],[725,11],[748,11],[770,11],[790,11],[811,11],[828,11],[849,11]]},"829":{"position":[[267,12],[851,12]]},"836":{"position":[[1796,12],[2435,12]]},"837":{"position":[[161,11],[418,9],[883,9],[1629,11],[1655,13]]},"838":{"position":[[651,12],[759,11]]},"840":{"position":[[90,10],[542,9]]},"841":{"position":[[703,11]]},"844":{"position":[[133,11]]},"845":{"position":[[22,11],[66,11],[115,11]]},"846":{"position":[[11,11],[197,13],[338,12],[374,12],[1570,11]]},"847":{"position":[[30,12],[111,11]]},"848":{"position":[[714,13],[980,11],[1349,13]]},"852":{"position":[[232,13]]},"854":{"position":[[486,12],[509,11],[847,11],[939,11],[1041,11],[1678,12]]},"855":{"position":[[81,9],[158,11]]},"856":{"position":[[135,9]]},"858":{"position":[[19,9]]},"860":{"position":[[497,11],[630,12]]},"861":{"position":[[1724,10],[2155,9]]},"862":{"position":[[104,12],[1096,12],[1190,13],[1482,11],[1570,11]]},"863":{"position":[[200,11]]},"865":{"position":[[9,11]]},"866":{"position":[[65,12],[91,12],[204,11],[220,11],[263,9],[314,11],[508,11],[595,11]]},"867":{"position":[[81,9],[153,11]]},"868":{"position":[[16,11],[52,11]]},"870":{"position":[[9,11]]},"871":{"position":[[263,11],[552,11]]},"872":{"position":[[2163,11],[2195,11],[2675,11],[2961,10],[3698,9],[3720,11],[4336,11]]},"875":{"position":[[13,11],[80,11],[111,11],[174,11],[259,11],[508,13],[1387,11],[2960,11],[6059,11],[6580,11],[6664,11],[6731,11],[8715,11],[8832,11],[9387,11]]},"876":{"position":[[61,11]]},"878":{"position":[[5,11],[96,11],[366,13]]},"879":{"position":[[92,11]]},"881":{"position":[[168,11],[262,11]]},"882":{"position":[[357,12]]},"884":{"position":[[28,12],[79,11]]},"885":{"position":[[263,12]]},"886":{"position":[[6,12],[33,12],[119,11],[902,12],[1657,11],[2063,12],[2090,12],[2603,12],[3253,12],[3790,12]]},"890":{"position":[[272,11],[1017,11]]},"893":{"position":[[5,11],[77,10],[185,11],[277,11],[452,11]]},"896":{"position":[[116,11]]},"897":{"position":[[323,11],[429,9]]},"898":{"position":[[3127,12],[3204,12],[3308,11],[4488,11]]},"899":{"position":[[1,11]]},"902":{"position":[[713,9]]},"903":{"position":[[143,11],[486,11],[609,11]]},"904":{"position":[[107,10],[324,12],[1285,11],[1420,12],[1446,11],[1843,11],[1977,9],[2237,12],[3151,11],[3183,11],[3294,11],[3548,12],[3595,12]]},"905":{"position":[[12,11],[222,11]]},"906":{"position":[[9,11],[50,11]]},"907":{"position":[[16,11],[33,9],[133,11]]},"908":{"position":[[302,10]]},"912":{"position":[[9,10],[166,11],[603,10]]},"955":{"position":[[116,13]]},"976":{"position":[[92,13]]},"981":{"position":[[45,11],[1623,11]]},"982":{"position":[[30,11]]},"983":{"position":[[175,12],[1091,11]]},"984":{"position":[[18,12],[626,11]]},"985":{"position":[[382,11]]},"986":{"position":[[12,11],[497,10],[1113,11],[1530,11]]},"987":{"position":[[157,12]]},"988":{"position":[[19,11],[320,11],[388,11],[424,9],[565,11],[659,12],[702,11],[1187,11],[1385,12],[1506,11],[2335,9],[3437,9],[3651,9],[4023,10],[4069,11],[4919,12],[5984,11]]},"989":{"position":[[29,11],[211,11],[461,12]]},"990":{"position":[[675,11],[758,12]]},"991":{"position":[[87,12]]},"992":{"position":[[110,12]]},"993":{"position":[[16,12],[499,11],[634,11]]},"994":{"position":[[58,11],[95,11],[215,11],[246,11]]},"995":{"position":[[96,10],[126,11],[275,12],[357,11],[920,12],[1014,11],[1480,11]]},"996":{"position":[[35,11]]},"997":{"position":[[13,12]]},"998":{"position":[[18,12],[35,11]]},"999":{"position":[[13,11],[57,11],[108,11],[185,11],[267,12]]},"1000":{"position":[[21,11],[71,11],[100,11]]},"1001":{"position":[[21,11]]},"1002":{"position":[[22,11],[182,11],[434,11],[623,11],[1087,11],[1277,11]]},"1003":{"position":[[9,11],[218,11],[324,11]]},"1004":{"position":[[12,11],[85,11],[134,11]]},"1005":{"position":[[10,11],[62,12]]},"1007":{"position":[[221,11],[285,11],[434,11],[726,11],[849,12],[912,11],[2024,11]]},"1008":{"position":[[32,11],[80,11]]},"1009":{"position":[[192,11],[337,11],[498,11],[576,11],[793,11],[1004,11]]},"1010":{"position":[[29,12],[93,11]]},"1022":{"position":[[23,9],[147,9]]},"1048":{"position":[[134,11]]},"1090":{"position":[[321,11]]},"1092":{"position":[[226,11],[292,9]]},"1093":{"position":[[202,11],[466,11]]},"1094":{"position":[[216,11],[377,11]]},"1100":{"position":[[234,11]]},"1101":{"position":[[5,11],[63,9],[138,11],[373,11],[581,11],[739,13]]},"1105":{"position":[[108,9]]},"1107":{"position":[[348,11]]},"1121":{"position":[[97,11],[198,11],[228,11],[670,11]]},"1123":{"position":[[61,10],[634,12]]},"1124":{"position":[[1473,9],[1602,11],[1861,9],[1963,11],[2120,11],[2211,11]]},"1146":{"position":[[70,11]]},"1147":{"position":[[284,12],[535,12]]},"1149":{"position":[[104,11],[138,11],[158,9],[197,11],[355,11],[402,11],[514,11],[589,11],[1359,13]]},"1162":{"position":[[529,11],[770,11],[817,9]]},"1164":{"position":[[223,10],[1213,11],[1414,11]]},"1165":{"position":[[51,11],[98,9],[215,11],[554,11]]},"1198":{"position":[[284,11],[1554,11],[1681,9],[1945,11]]},"1199":{"position":[[38,11]]},"1212":{"position":[[66,11]]},"1213":{"position":[[468,11]]},"1219":{"position":[[214,9]]},"1231":{"position":[[69,11],[220,11],[303,11],[368,11],[987,12]]},"1259":{"position":[[25,11]]},"1284":{"position":[[170,11],[223,11]]},"1301":{"position":[[367,12],[419,10]]},"1304":{"position":[[1800,9],[1911,11],[1948,9]]},"1306":{"position":[[70,11]]},"1307":{"position":[[370,10],[402,12]]},"1308":{"position":[[3,11],[119,10],[163,9],[190,11],[210,11],[663,11]]},"1313":{"position":[[860,12]]},"1314":{"position":[[607,11]]},"1316":{"position":[[39,10],[126,11],[217,11],[321,11],[1149,10],[1351,11],[1516,12],[1564,10],[2378,10],[2492,11],[2525,9],[2597,9],[2824,10],[3105,11],[3259,11],[3318,9],[3403,9],[3702,11],[3852,11]]},"1320":{"position":[[249,9],[517,11],[958,12]]},"1323":{"position":[[176,11]]},"1324":{"position":[[76,12],[320,11],[409,11],[588,11],[620,9],[709,12]]}},"keywords":{}}],["replica",{"_index":4936,"title":{},"content":{"870":{"position":[[244,7]]},"871":{"position":[[851,7]]},"872":{"position":[[362,7]]}},"keywords":{}}],["replicach",{"_index":585,"title":{"38":{"position":[[0,11]]}},"content":{"38":{"position":[[1,10],[188,10],[515,11],[617,10],[736,10],[787,10],[837,10],[921,10],[1045,10],[1131,10]]}},"keywords":{}}],["replicateappwrit",{"_index":4902,"title":{},"content":{"862":{"position":[[227,17],[1134,19],[1643,19]]}},"keywords":{}}],["replicatecouchdb",{"_index":4326,"title":{},"content":{"749":{"position":[[14654,18],[16114,18],[16262,18]]},"846":{"position":[[27,19],[57,16],[142,17],[1327,18]]},"848":{"position":[[659,17],[1175,17],[1294,17]]},"852":{"position":[[177,17]]},"1149":{"position":[[672,16],[1305,18]]}},"keywords":{}}],["replicatefirestor",{"_index":4872,"title":{},"content":{"854":{"position":[[532,20],[600,20]]},"858":{"position":[[182,19]]}},"keywords":{}}],["replicategraphql",{"_index":5121,"title":{},"content":{"886":{"position":[[925,16],[1010,17],[2642,17],[3829,17]]},"887":{"position":[[295,17]]},"888":{"position":[[436,17]]},"889":{"position":[[485,17]]},"890":{"position":[[757,16],[785,17]]}},"keywords":{}}],["replicatemongodb",{"_index":4957,"title":{},"content":{"872":{"position":[[2289,16],[2374,18],[2746,18]]}},"keywords":{}}],["replicatenat",{"_index":4926,"title":{},"content":{"866":{"position":[[115,15],[353,13],[432,15]]}},"keywords":{}}],["replicaterxcollect",{"_index":1342,"title":{"988":{"position":[[0,24]]}},"content":{"209":{"position":[[142,21],[622,23]]},"255":{"position":[[489,21],[973,23]]},"481":{"position":[[585,21],[642,23]]},"632":{"position":[[2117,21],[2210,23]]},"875":{"position":[[214,21],[336,21],[424,23],[3100,23],[6144,23],[8409,23],[9718,23]]},"988":{"position":[[67,23],[124,21],[248,23]]},"992":{"position":[[14,23]]},"1002":{"position":[[539,23],[1193,23]]},"1003":{"position":[[385,23]]},"1007":{"position":[[1377,23]]},"1090":{"position":[[520,21]]},"1165":{"position":[[843,23]]}},"keywords":{}}],["replicateserv",{"_index":4971,"title":{},"content":{"872":{"position":[[3889,15],[4460,17]]},"878":{"position":[[160,18],[189,15],[285,17]]},"882":{"position":[[402,17]]},"1101":{"position":[[658,17]]}},"keywords":{}}],["replicatesupabas",{"_index":5217,"title":{},"content":{"898":{"position":[[3240,17],[3322,19],[4561,19]]}},"keywords":{}}],["replicatewebrtc",{"_index":1362,"title":{},"content":{"210":{"position":[[155,16],[270,17]]},"261":{"position":[[223,16],[343,17]]},"904":{"position":[[1314,16],[1475,15],[1811,16]]},"907":{"position":[[287,16]]},"911":{"position":[[632,16]]},"1121":{"position":[[338,16],[602,16]]}},"keywords":{}}],["replicatewithwebsocketserv",{"_index":5179,"title":{},"content":{"893":{"position":[[98,28],[228,30]]}},"keywords":{}}],["replication"",{"_index":213,"title":{},"content":{"14":{"position":[[403,18]]}},"keywords":{}}],["replication.awaitinitialrepl",{"_index":5226,"title":{},"content":{"898":{"position":[[4158,38]]}},"keywords":{}}],["replication.error$.subscribe(err",{"_index":5224,"title":{},"content":{"898":{"position":[[4075,32]]}},"keywords":{}}],["replication.work",{"_index":4817,"title":{},"content":{"844":{"position":[[16,17]]}},"keywords":{}}],["replicationconflictmessag",{"_index":5163,"title":{},"content":{"889":{"position":[[193,28]]}},"keywords":{}}],["replicationdata",{"_index":3326,"title":{},"content":{"544":{"position":[[168,15]]}},"keywords":{}}],["replicationid",{"_index":5568,"title":{},"content":{"1007":{"position":[[1309,13],[1447,14]]}},"keywords":{}}],["replicationidentifi",{"_index":1347,"title":{},"content":{"209":{"position":[[668,22]]},"255":{"position":[[1019,22]]},"481":{"position":[[688,22]]},"632":{"position":[[2256,22]]},"846":{"position":[[162,22]]},"848":{"position":[[679,22],[1314,22]]},"852":{"position":[[197,22]]},"854":{"position":[[621,22]]},"862":{"position":[[1154,22]]},"866":{"position":[[476,22]]},"872":{"position":[[2532,22],[4478,22]]},"875":{"position":[[476,22]]},"878":{"position":[[332,22]]},"898":{"position":[[3404,22]]},"988":{"position":[[507,22],[533,22]]},"1002":{"position":[[589,22],[1243,22]]},"1007":{"position":[[1424,22]]},"1101":{"position":[[705,22]]},"1149":{"position":[[1324,22]]}},"keywords":{}}],["replicationofflin",{"_index":5230,"title":{},"content":{"899":{"position":[[74,18]]}},"keywords":{}}],["replicationpool",{"_index":1584,"title":{},"content":{"261":{"position":[[319,15],[856,15]]},"904":{"position":[[1787,15],[3205,15],[3265,15]]},"907":{"position":[[263,15]]},"911":{"position":[[608,15]]},"1121":{"position":[[578,15]]}},"keywords":{}}],["replicationpool.cancel",{"_index":5263,"title":{},"content":{"904":{"position":[[3608,25]]}},"keywords":{}}],["replicationpool.error$.subscribe(err",{"_index":1587,"title":{},"content":{"261":{"position":[[900,36]]},"904":{"position":[[3456,36]]}},"keywords":{}}],["replicationst",{"_index":4822,"title":{},"content":{"846":{"position":[[123,16]]},"848":{"position":[[640,16],[1275,16]]},"852":{"position":[[158,16]]},"854":{"position":[[581,16],[1730,16]]},"858":{"position":[[163,16]]},"862":{"position":[[1115,16]]},"866":{"position":[[413,16]]},"872":{"position":[[2355,16],[4441,16]]},"875":{"position":[[399,16],[3075,16],[6119,16],[8384,16],[9693,16]]},"878":{"position":[[260,16]]},"882":{"position":[[377,16]]},"886":{"position":[[991,16],[2623,16],[3810,16]]},"887":{"position":[[232,17]]},"888":{"position":[[373,17]]},"889":{"position":[[422,17]]},"893":{"position":[[203,16]]},"988":{"position":[[223,16]]},"1002":{"position":[[520,16],[1174,16]]},"1003":{"position":[[366,16]]},"1007":{"position":[[1203,16],[1358,16],[1775,17]]},"1101":{"position":[[633,16]]},"1149":{"position":[[1286,16]]},"1231":{"position":[[1146,16]]}},"keywords":{}}],["replicationstate.cancel",{"_index":5181,"title":{},"content":{"893":{"position":[[470,26]]}},"keywords":{}}],["replicationstate.error$.subscribe((error",{"_index":5490,"title":{},"content":{"990":{"position":[[1177,41]]}},"keywords":{}}],["replicationstate.fetch",{"_index":4824,"title":{},"content":{"846":{"position":[[551,23]]},"848":{"position":[[1005,22]]}},"keywords":{}}],["replicationstate.forbidden$.subscrib",{"_index":5073,"title":{},"content":{"881":{"position":[[340,40]]}},"keywords":{}}],["replicationstate.head",{"_index":4351,"title":{},"content":{"749":{"position":[[16538,24]]}},"keywords":{}}],["replicationstate.ispaus",{"_index":5534,"title":{},"content":{"1001":{"position":[[45,28]]}},"keywords":{}}],["replicationstate.isstop",{"_index":5531,"title":{},"content":{"1000":{"position":[[127,29]]}},"keywords":{}}],["replicationstate.outdatedclient$.subscrib",{"_index":5069,"title":{},"content":{"879":{"position":[[612,45]]}},"keywords":{}}],["replicationstate.setcredentials('includ",{"_index":5173,"title":{},"content":{"890":{"position":[[685,43]]}},"keywords":{}}],["replicationstate.sethead",{"_index":5071,"title":{},"content":{"880":{"position":[[379,29]]},"890":{"position":[[311,29]]}},"keywords":{}}],["replicationstate.start",{"_index":5457,"title":{},"content":{"988":{"position":[[1567,24]]}},"keywords":{}}],["replicationstate.unauthorized$.subscrib",{"_index":5070,"title":{},"content":{"880":{"position":[[327,43]]}},"keywords":{}}],["replset",{"_index":4942,"title":{},"content":{"872":{"position":[[554,7]]}},"keywords":{}}],["repo",{"_index":596,"title":{},"content":{"38":{"position":[[855,4]]},"61":{"position":[[266,5]]},"198":{"position":[[555,4]]},"392":{"position":[[781,5]]},"405":{"position":[[165,4]]},"471":{"position":[[150,4]]},"620":{"position":[[311,4]]},"628":{"position":[[252,4]]},"670":{"position":[[133,4]]},"1112":{"position":[[50,4]]},"1266":{"position":[[362,4]]}},"keywords":{}}],["repo.if",{"_index":4721,"title":{},"content":{"824":{"position":[[420,7]]}},"keywords":{}}],["repolearn",{"_index":3102,"title":{},"content":{"471":{"position":[[74,9]]}},"keywords":{}}],["report",{"_index":71,"title":{},"content":{"4":{"position":[[191,8]]},"404":{"position":[[350,8]]},"412":{"position":[[14174,9]]},"670":{"position":[[6,9],[335,6]]}},"keywords":{}}],["reposhow",{"_index":3213,"title":{},"content":{"498":{"position":[[384,8]]}},"keywords":{}}],["repositori",{"_index":853,"title":{},"content":{"56":{"position":[[91,11]]},"61":{"position":[[80,10]]},"84":{"position":[[127,11],[165,10]]},"114":{"position":[[140,11],[178,10]]},"149":{"position":[[140,11],[178,10]]},"175":{"position":[[133,11],[171,10]]},"241":{"position":[[244,11],[269,10]]},"263":{"position":[[652,10]]},"347":{"position":[[140,11],[178,10]]},"362":{"position":[[1211,11],[1249,10]]},"373":{"position":[[244,11],[269,10]]},"458":{"position":[[958,10]]},"462":{"position":[[509,11]]},"498":{"position":[[443,11]]},"511":{"position":[[140,11],[178,10]]},"531":{"position":[[140,11],[178,10]]},"543":{"position":[[98,11],[115,10]]},"548":{"position":[[100,10]]},"557":{"position":[[231,10]]},"567":{"position":[[450,10]]},"591":{"position":[[140,11],[178,10]]},"603":{"position":[[96,11],[113,10]]},"608":{"position":[[100,10]]},"666":{"position":[[136,10]]},"824":{"position":[[165,10]]},"904":{"position":[[217,10]]},"1112":{"position":[[133,10]]}},"keywords":{}}],["repositoryread",{"_index":4974,"title":{},"content":{"873":{"position":[[42,14]]}},"keywords":{}}],["repres",{"_index":1646,"title":{},"content":{"279":{"position":[[182,12]]},"396":{"position":[[701,9]]},"611":{"position":[[361,9]]},"682":{"position":[[90,9]]},"687":{"position":[[57,9]]},"690":{"position":[[344,11]]},"707":{"position":[[299,10]]},"778":{"position":[[545,10]]},"826":{"position":[[392,10],[550,10],[637,10],[752,10],[850,10],[971,10],[1069,10]]},"862":{"position":[[1337,10]]},"922":{"position":[[29,11]]},"1007":{"position":[[81,10]]},"1065":{"position":[[490,11]]},"1213":{"position":[[77,9]]}},"keywords":{}}],["represent",{"_index":2104,"title":{},"content":{"364":{"position":[[109,15]]},"372":{"position":[[357,15]]},"390":{"position":[[190,15]]},"1079":{"position":[[371,14]]}},"keywords":{}}],["representations.recommend",{"_index":2201,"title":{},"content":{"390":{"position":[[1387,32]]}},"keywords":{}}],["reproduc",{"_index":2892,"title":{},"content":{"427":{"position":[[1259,9]]},"667":{"position":[[78,9],[142,9]]},"670":{"position":[[86,10]]},"1120":{"position":[[358,9]]}},"keywords":{}}],["req",{"_index":3597,"title":{},"content":{"612":{"position":[[1860,5]]},"799":{"position":[[537,5],[769,5]]},"875":{"position":[[2087,5],[4455,5],[7244,5]]}},"keywords":{}}],["req.bodi",{"_index":5020,"title":{},"content":{"875":{"position":[[4493,9]]}},"keywords":{}}],["req.on('clos",{"_index":3611,"title":{},"content":{"612":{"position":[[2407,15]]},"875":{"position":[[7496,15]]}},"keywords":{}}],["req.query.id",{"_index":4991,"title":{},"content":{"875":{"position":[[2117,13]]}},"keywords":{}}],["request",{"_index":711,"title":{"617":{"position":[[2,8]]},"1032":{"position":[[27,8]]}},"content":{"46":{"position":[[351,8]]},"65":{"position":[[1129,9]]},"87":{"position":[[143,8]]},"173":{"position":[[798,9]]},"216":{"position":[[143,8]]},"226":{"position":[[100,8],[175,8]]},"300":{"position":[[520,7],[681,9],[698,7]]},"302":{"position":[[202,7]]},"305":{"position":[[408,7]]},"392":{"position":[[3414,8]]},"408":{"position":[[2605,8],[3168,7]]},"411":{"position":[[234,8],[355,8]]},"450":{"position":[[389,7]]},"459":{"position":[[787,7]]},"461":{"position":[[122,8],[348,8],[379,7]]},"467":{"position":[[39,8]]},"474":{"position":[[49,7]]},"477":{"position":[[52,7]]},"487":{"position":[[60,7],[292,7]]},"570":{"position":[[652,9]]},"582":{"position":[[675,9]]},"610":{"position":[[194,9],[260,8],[593,8],[1119,7]]},"611":{"position":[[215,7]]},"612":{"position":[[421,7]]},"616":{"position":[[354,7],[476,7],[640,8],[1205,8]]},"619":{"position":[[370,8]]},"623":{"position":[[366,7]]},"624":{"position":[[259,9]]},"626":{"position":[[728,8]]},"627":{"position":[[169,8]]},"630":{"position":[[58,8],[804,9]]},"634":{"position":[[692,8]]},"650":{"position":[[114,8]]},"668":{"position":[[20,8]]},"679":{"position":[[121,7]]},"696":{"position":[[530,9]]},"749":{"position":[[21185,8]]},"778":{"position":[[110,7]]},"782":{"position":[[70,8]]},"784":{"position":[[48,8]]},"799":{"position":[[488,7]]},"846":{"position":[[699,7]]},"848":{"position":[[83,8]]},"849":{"position":[[72,8],[191,8]]},"851":{"position":[[198,7]]},"863":{"position":[[381,7]]},"875":{"position":[[756,8],[2993,7]]},"880":{"position":[[100,8],[293,8]]},"882":{"position":[[190,7]]},"886":{"position":[[1513,8],[1808,8],[2933,8]]},"890":{"position":[[636,8]]},"986":{"position":[[1610,9]]},"988":{"position":[[915,7]]},"1010":{"position":[[131,8]]},"1032":{"position":[[19,8]]},"1089":{"position":[[160,9]]},"1090":{"position":[[27,8],[219,8]]},"1092":{"position":[[344,8]]},"1094":{"position":[[389,8]]},"1095":{"position":[[355,8]]},"1102":{"position":[[438,7],[463,7]]},"1103":{"position":[[167,9]]},"1104":{"position":[[74,9]]},"1123":{"position":[[317,8]]},"1124":{"position":[[707,7]]},"1134":{"position":[[638,9]]},"1135":{"position":[[352,7]]},"1161":{"position":[[162,8]]},"1170":{"position":[[156,8]]},"1180":{"position":[[162,8]]},"1301":{"position":[[816,7]]},"1313":{"position":[[445,9]]}},"keywords":{}}],["request.json",{"_index":5938,"title":{},"content":{"1102":{"position":[[702,15]]}},"keywords":{}}],["request.onerror",{"_index":3004,"title":{},"content":{"459":{"position":[[933,15]]}},"keywords":{}}],["request.onsuccess",{"_index":3002,"title":{},"content":{"459":{"position":[[873,17]]}},"keywords":{}}],["requestcheckpoint",{"_index":5156,"title":{},"content":{"888":{"position":[[773,17],[821,17],[1107,17]]}},"keywords":{}}],["requestidlecallback",{"_index":3772,"title":{},"content":{"656":{"position":[[405,21]]},"975":{"position":[[86,19]]}},"keywords":{}}],["requestidlepromis",{"_index":5412,"title":{"975":{"position":[[0,21]]}},"content":{"1164":{"position":[[84,18],[1267,20],[1529,21]]}},"keywords":{}}],["requests.long",{"_index":3663,"title":{},"content":{"621":{"position":[[347,13]]}},"keywords":{}}],["requestsskip",{"_index":5062,"title":{},"content":{"876":{"position":[[289,12]]}},"keywords":{}}],["requir",{"_index":334,"title":{"553":{"position":[[20,8]]},"666":{"position":[[0,13]]},"910":{"position":[[11,8]]},"1260":{"position":[[16,9]]}},"content":{"19":{"position":[[599,9]]},"33":{"position":[[371,8]]},"35":{"position":[[626,9]]},"40":{"position":[[707,7]]},"51":{"position":[[498,9]]},"63":{"position":[[232,13]]},"65":{"position":[[1236,7]]},"66":{"position":[[571,13]]},"70":{"position":[[214,8]]},"79":{"position":[[110,9]]},"80":{"position":[[18,9]]},"81":{"position":[[89,12]]},"99":{"position":[[189,8]]},"111":{"position":[[115,12]]},"131":{"position":[[973,12]]},"132":{"position":[[74,12]]},"134":{"position":[[248,13]]},"146":{"position":[[246,12]]},"151":{"position":[[168,8]]},"170":{"position":[[344,13],[532,13]]},"174":{"position":[[550,12]]},"188":{"position":[[1425,9]]},"189":{"position":[[716,12]]},"197":{"position":[[21,12]]},"206":{"position":[[54,8]]},"210":{"position":[[717,9]]},"220":{"position":[[275,7]]},"221":{"position":[[29,7]]},"222":{"position":[[237,12]]},"226":{"position":[[157,8],[243,7]]},"236":{"position":[[86,12]]},"249":{"position":[[32,7]]},"253":{"position":[[53,8]]},"261":{"position":[[637,8]]},"266":{"position":[[504,8]]},"271":{"position":[[203,12]]},"276":{"position":[[361,13]]},"287":{"position":[[268,13],[848,7]]},"294":{"position":[[185,12]]},"299":{"position":[[554,7]]},"309":{"position":[[356,9]]},"314":{"position":[[881,9]]},"315":{"position":[[823,9]]},"331":{"position":[[120,7]]},"357":{"position":[[284,7]]},"358":{"position":[[392,8]]},"361":{"position":[[95,9]]},"365":{"position":[[571,9],[1159,9],[1434,9]]},"366":{"position":[[184,12]]},"367":{"position":[[1036,9]]},"375":{"position":[[642,7]]},"379":{"position":[[195,9]]},"382":{"position":[[177,8]]},"383":{"position":[[266,7]]},"388":{"position":[[217,13]]},"392":{"position":[[698,9],[1695,9],[1913,8]]},"401":{"position":[[773,9]]},"409":{"position":[[202,7]]},"411":{"position":[[435,7]]},"412":{"position":[[2445,7],[3557,7],[6695,8],[10410,8],[11793,8],[14094,12],[14565,7]]},"415":{"position":[[351,9]]},"427":{"position":[[689,8]]},"429":{"position":[[419,9]]},"430":{"position":[[889,7]]},"432":{"position":[[167,13]]},"444":{"position":[[168,12]]},"445":{"position":[[934,7]]},"446":{"position":[[470,7]]},"454":{"position":[[851,8]]},"455":{"position":[[506,8]]},"462":{"position":[[746,8]]},"463":{"position":[[42,7],[329,8]]},"464":{"position":[[1254,7]]},"478":{"position":[[14,7]]},"482":{"position":[[953,9]]},"487":{"position":[[435,9]]},"497":{"position":[[338,9]]},"504":{"position":[[413,13]]},"508":{"position":[[70,13]]},"515":{"position":[[104,7]]},"517":{"position":[[63,7]]},"521":{"position":[[661,8]]},"524":{"position":[[164,13]]},"525":{"position":[[731,13]]},"534":{"position":[[692,13]]},"538":{"position":[[799,9]]},"546":{"position":[[33,13]]},"554":{"position":[[1494,9]]},"559":{"position":[[1256,8]]},"562":{"position":[[446,9]]},"564":{"position":[[882,9]]},"567":{"position":[[728,13]]},"574":{"position":[[174,8]]},"581":{"position":[[681,12]]},"594":{"position":[[690,13]]},"598":{"position":[[806,9]]},"602":{"position":[[127,10]]},"606":{"position":[[33,13]]},"611":{"position":[[542,7],[1417,9]]},"613":{"position":[[398,9]]},"616":{"position":[[321,7]]},"617":{"position":[[1064,8]]},"622":{"position":[[719,9]]},"623":{"position":[[235,7]]},"624":{"position":[[504,9]]},"632":{"position":[[946,7]]},"638":{"position":[[738,9]]},"659":{"position":[[818,9]]},"662":{"position":[[2535,9]]},"680":{"position":[[1042,9]]},"681":{"position":[[131,8]]},"685":{"position":[[387,8]]},"687":{"position":[[159,8]]},"689":{"position":[[130,7]]},"701":{"position":[[1092,8]]},"715":{"position":[[88,8]]},"717":{"position":[[1551,9]]},"723":{"position":[[1289,9]]},"749":{"position":[[15306,8],[16404,9],[19134,8],[19820,8],[20776,8],[23013,8]]},"751":{"position":[[1180,8]]},"759":{"position":[[562,8]]},"760":{"position":[[558,8]]},"772":{"position":[[1248,7]]},"774":{"position":[[66,7]]},"778":{"position":[[184,7]]},"782":{"position":[[441,8]]},"806":{"position":[[533,8]]},"829":{"position":[[2948,9],[2998,7]]},"835":{"position":[[923,9]]},"836":{"position":[[1503,8],[1915,8],[2079,8],[2375,13]]},"837":{"position":[[406,8]]},"838":{"position":[[2749,9]]},"846":{"position":[[270,10]]},"854":{"position":[[815,10],[1304,8]]},"855":{"position":[[6,8]]},"861":{"position":[[2064,10]]},"862":{"position":[[779,9]]},"867":{"position":[[6,8]]},"871":{"position":[[811,8]]},"872":{"position":[[1248,8],[2039,9],[4269,9]]},"882":{"position":[[207,8]]},"887":{"position":[[68,8]]},"896":{"position":[[43,9]]},"898":{"position":[[2644,9]]},"902":{"position":[[319,9]]},"903":{"position":[[283,9]]},"904":{"position":[[1080,9]]},"906":{"position":[[92,9]]},"908":{"position":[[357,9]]},"962":{"position":[[443,13]]},"990":{"position":[[1110,8]]},"1067":{"position":[[820,8]]},"1074":{"position":[[190,8],[280,8],[453,8]]},"1077":{"position":[[204,9]]},"1078":{"position":[[676,9]]},"1079":{"position":[[314,8]]},"1080":{"position":[[717,9],[803,9]]},"1082":{"position":[[453,9]]},"1083":{"position":[[97,9],[623,9]]},"1085":{"position":[[735,8]]},"1090":{"position":[[1127,13]]},"1100":{"position":[[817,8]]},"1101":{"position":[[306,8]]},"1107":{"position":[[314,8]]},"1132":{"position":[[1124,12]]},"1141":{"position":[[233,8]]},"1143":{"position":[[461,8]]},"1147":{"position":[[480,7]]},"1149":{"position":[[1202,9]]},"1150":{"position":[[638,9]]},"1151":{"position":[[393,8]]},"1158":{"position":[[499,9]]},"1178":{"position":[[392,8]]},"1188":{"position":[[248,8]]},"1194":{"position":[[139,8]]},"1206":{"position":[[429,9]]},"1222":{"position":[[501,7]]},"1250":{"position":[[186,8]]},"1294":{"position":[[602,8]]},"1295":{"position":[[1391,8]]},"1304":{"position":[[952,8]]},"1311":{"position":[[568,9]]},"1316":{"position":[[2721,7],[3021,8]]}},"keywords":{}}],["require('asyncstorag",{"_index":138,"title":{},"content":{"10":{"position":[[238,21]]}},"keywords":{}}],["require('f",{"_index":6142,"title":{},"content":{"1176":{"position":[[138,13]]}},"keywords":{}}],["require('fak",{"_index":6050,"title":{},"content":{"1139":{"position":[[425,13],[476,13]]},"1145":{"position":[[414,13],[465,13]]}},"keywords":{}}],["require('leveldown",{"_index":90,"title":{},"content":{"6":{"position":[[457,21]]}},"keywords":{}}],["require('lokijs/src/increment",{"_index":6132,"title":{},"content":{"1172":{"position":[[236,31]]}},"keywords":{}}],["require('lokijs/src/loki",{"_index":4576,"title":{},"content":{"772":{"position":[[2202,24]]}},"keywords":{}}],["require('memdown",{"_index":47,"title":{},"content":{"2":{"position":[[296,19]]}},"keywords":{}}],["require('nod",{"_index":1371,"title":{},"content":{"210":{"position":[[449,13]]},"261":{"position":[[690,13]]},"904":{"position":[[2895,13]]}},"keywords":{}}],["require('path",{"_index":6305,"title":{},"content":{"1266":{"position":[[178,16]]}},"keywords":{}}],["require('rxdb/plugins/electron",{"_index":3928,"title":{},"content":{"693":{"position":[[748,33],[1052,33]]}},"keywords":{}}],["require('rxdb/plugins/storag",{"_index":3929,"title":{},"content":{"693":{"position":[[813,29],[1117,29]]}},"keywords":{}}],["require('sqlite3",{"_index":3999,"title":{},"content":{"711":{"position":[[1118,19]]}},"keywords":{}}],["require('ters",{"_index":6307,"title":{},"content":{"1266":{"position":[[216,15]]}},"keywords":{}}],["require('ws').websocket",{"_index":1374,"title":{},"content":{"210":{"position":[[509,23]]},"261":{"position":[[750,23]]},"904":{"position":[[3060,23]]}},"keywords":{}}],["require(path.join(projectrootpath",{"_index":6312,"title":{},"content":{"1266":{"position":[[390,34]]}},"keywords":{}}],["requireauth",{"_index":6080,"title":{},"content":{"1148":{"position":[[1040,12]]}},"keywords":{}}],["res(ev.data.embed",{"_index":2276,"title":{},"content":{"392":{"position":[[4354,23]]}},"keywords":{}}],["res(event.target.result",{"_index":3003,"title":{},"content":{"459":{"position":[[907,25]]}},"keywords":{}}],["res(row",{"_index":4008,"title":{},"content":{"711":{"position":[[1613,10]]}},"keywords":{}}],["res.end",{"_index":3613,"title":{},"content":{"612":{"position":[[2461,10]]}},"keywords":{}}],["res.end(json.stringifi",{"_index":5004,"title":{},"content":{"875":{"position":[[2814,24]]}},"keywords":{}}],["res.end(json.stringify(conflict",{"_index":5035,"title":{},"content":{"875":{"position":[[5578,35]]}},"keywords":{}}],["res.json",{"_index":1577,"title":{},"content":{"255":{"position":[[1295,11],[1536,11]]}},"keywords":{}}],["res.send(json.stringify(result",{"_index":4660,"title":{},"content":{"799":{"position":[[616,33],[823,33]]}},"keywords":{}}],["res.setheader('cont",{"_index":5003,"title":{},"content":{"875":{"position":[[2763,22],[5527,22]]}},"keywords":{}}],["res.write('data",{"_index":5044,"title":{},"content":{"875":{"position":[[7438,16]]}},"keywords":{}}],["res.write(formatteddata",{"_index":3604,"title":{},"content":{"612":{"position":[[2142,25]]}},"keywords":{}}],["res.writehead(200",{"_index":3598,"title":{},"content":{"612":{"position":[[1879,18]]},"875":{"position":[[7263,18]]}},"keywords":{}}],["reserv",{"_index":4356,"title":{},"content":{"749":{"position":[[16950,8]]}},"keywords":{}}],["reset",{"_index":5421,"title":{},"content":{"977":{"position":[[268,5]]},"1085":{"position":[[3543,6]]}},"keywords":{}}],["resid",{"_index":2937,"title":{},"content":{"444":{"position":[[471,6]]},"1315":{"position":[[317,7]]}},"keywords":{}}],["resili",{"_index":2179,"title":{},"content":{"388":{"position":[[345,10]]},"407":{"position":[[733,9]]},"410":{"position":[[932,11]]},"418":{"position":[[723,11]]},"419":{"position":[[885,10]]},"420":{"position":[[1484,10]]},"990":{"position":[[474,9]]}},"keywords":{}}],["resolut",{"_index":226,"title":{"134":{"position":[[9,11]]},"250":{"position":[[21,11]]},"339":{"position":[[9,11]]},"416":{"position":[[24,11]]},"496":{"position":[[9,10]]}},"content":{"14":{"position":[[806,10]]},"39":{"position":[[583,10]]},"40":{"position":[[228,10],[753,11]]},"43":{"position":[[121,10]]},"123":{"position":[[211,10]]},"134":{"position":[[126,10],[198,10]]},"135":{"position":[[287,10]]},"147":{"position":[[120,10]]},"162":{"position":[[487,10]]},"165":{"position":[[238,10]]},"192":{"position":[[244,10]]},"203":{"position":[[160,10]]},"250":{"position":[[47,10],[202,10]]},"263":{"position":[[200,10]]},"289":{"position":[[209,11]]},"306":{"position":[[206,11]]},"328":{"position":[[209,10]]},"331":{"position":[[209,11]]},"412":{"position":[[1152,11],[2179,11],[2980,11],[3249,10]]},"419":{"position":[[1172,10]]},"480":{"position":[[1104,11]]},"491":{"position":[[401,11],[1320,11]]},"495":{"position":[[69,11]]},"525":{"position":[[629,11]]},"566":{"position":[[1018,10]]},"576":{"position":[[286,11]]},"582":{"position":[[438,11]]},"590":{"position":[[819,11]]},"635":{"position":[[428,11]]},"690":{"position":[[191,10]]},"698":{"position":[[358,11],[445,10],[787,10],[975,10],[1419,10],[2183,11],[3285,10]]},"860":{"position":[[777,10]]},"870":{"position":[[168,10]]},"896":{"position":[[270,10]]},"1148":{"position":[[137,10],[365,11],[387,10]]},"1149":{"position":[[52,10]]}},"keywords":{}}],["resolution.rxdb'",{"_index":6072,"title":{},"content":{"1147":{"position":[[266,17]]}},"keywords":{}}],["resolutionrxdb",{"_index":1601,"title":{},"content":{"263":{"position":[[630,14]]}},"keywords":{}}],["resolv",{"_index":1116,"title":{},"content":{"134":{"position":[[317,7]]},"135":{"position":[[243,8]]},"339":{"position":[[111,7]]},"386":{"position":[[176,8]]},"412":{"position":[[5025,9],[5123,7],[13010,9]]},"487":{"position":[[390,7]]},"491":{"position":[[536,7],[1439,8]]},"496":{"position":[[830,8]]},"582":{"position":[[214,9],[585,7]]},"688":{"position":[[102,7],[684,7]]},"691":{"position":[[302,8]]},"698":{"position":[[1815,8]]},"749":{"position":[[21083,7],[21228,8]]},"751":{"position":[[1056,8]]},"789":{"position":[[363,8]]},"810":{"position":[[133,8]]},"860":{"position":[[523,8]]},"885":{"position":[[1410,8],[2695,10]]},"886":{"position":[[243,8]]},"908":{"position":[[49,9],[332,8]]},"929":{"position":[[48,8]]},"930":{"position":[[25,8]]},"931":{"position":[[25,8]]},"932":{"position":[[25,8]]},"968":{"position":[[298,8]]},"974":{"position":[[25,8]]},"975":{"position":[[25,8]]},"976":{"position":[[129,8]]},"982":{"position":[[769,8]]},"987":{"position":[[494,8]]},"994":{"position":[[189,7]]},"995":{"position":[[24,8],[311,7],[759,8],[968,7],[1161,7]]},"997":{"position":[[49,8]]},"1014":{"position":[[142,8]]},"1015":{"position":[[122,8]]},"1016":{"position":[[59,8]]},"1026":{"position":[[110,8]]},"1057":{"position":[[24,8]]},"1062":{"position":[[54,8]]},"1164":{"position":[[871,7],[1195,8]]},"1176":{"position":[[238,7],[351,8]]},"1198":{"position":[[862,7]]},"1266":{"position":[[849,8]]},"1308":{"position":[[279,8],[570,8]]},"1323":{"position":[[168,7]]}},"keywords":{}}],["resolve(i",{"_index":2695,"title":{},"content":{"412":{"position":[[5163,10]]},"1309":{"position":[[936,10]]}},"keywords":{}}],["resourc",{"_index":994,"title":{},"content":{"84":{"position":[[103,10]]},"91":{"position":[[136,10]]},"114":{"position":[[116,10]]},"143":{"position":[[253,9]]},"149":{"position":[[116,10]]},"175":{"position":[[94,9]]},"224":{"position":[[171,9]]},"228":{"position":[[307,8]]},"241":{"position":[[109,10]]},"263":{"position":[[558,10]]},"277":{"position":[[288,8]]},"298":{"position":[[67,10]]},"347":{"position":[[116,10]]},"362":{"position":[[1187,10]]},"373":{"position":[[109,10]]},"392":{"position":[[2220,10]]},"409":{"position":[[36,8]]},"427":{"position":[[1240,10]]},"444":{"position":[[240,10]]},"477":{"position":[[86,8]]},"508":{"position":[[210,8]]},"511":{"position":[[116,10]]},"528":{"position":[[196,10]]},"531":{"position":[[116,10]]},"567":{"position":[[161,10]]},"587":{"position":[[96,8]]},"591":{"position":[[116,10]]},"618":{"position":[[424,8]]},"736":{"position":[[512,9]]},"782":{"position":[[190,9]]},"981":{"position":[[1687,10]]},"1151":{"position":[[414,10]]},"1178":{"position":[[413,10]]},"1206":{"position":[[609,10]]}},"keywords":{}}],["resources.webtransport",{"_index":3670,"title":{},"content":{"622":{"position":[[543,23]]}},"keywords":{}}],["resp",{"_index":1348,"title":{},"content":{"209":{"position":[[792,4]]}},"keywords":{}}],["resp.json",{"_index":1352,"title":{},"content":{"209":{"position":[[920,12]]}},"keywords":{}}],["respect",{"_index":2757,"title":{},"content":{"412":{"position":[[13025,7]]},"875":{"position":[[1884,7]]}},"keywords":{}}],["respond",{"_index":919,"title":{},"content":{"65":{"position":[[917,7]]},"124":{"position":[[265,7]]},"156":{"position":[[242,7]]},"421":{"position":[[978,7]]},"502":{"position":[[764,7]]},"585":{"position":[[66,7]]},"875":{"position":[[1769,8],[7001,7]]},"984":{"position":[[300,7]]},"990":{"position":[[1083,7]]},"1308":{"position":[[447,7]]},"1313":{"position":[[417,10]]}},"keywords":{}}],["respons",{"_index":910,"title":{},"content":{"65":{"position":[[401,10],[983,10],[2093,10]]},"78":{"position":[[111,15]]},"83":{"position":[[377,11]]},"91":{"position":[[268,10]]},"92":{"position":[[221,10]]},"103":{"position":[[210,10]]},"106":{"position":[[203,15]]},"114":{"position":[[740,15]]},"116":{"position":[[272,10]]},"145":{"position":[[119,11]]},"148":{"position":[[225,10]]},"153":{"position":[[319,11]]},"173":{"position":[[999,8],[1105,14],[2668,14]]},"175":{"position":[[686,11]]},"177":{"position":[[316,10]]},"182":{"position":[[175,8]]},"196":{"position":[[225,8]]},"198":{"position":[[381,10]]},"209":{"position":[[1086,8]]},"216":{"position":[[201,10]]},"220":{"position":[[205,8]]},"221":{"position":[[289,10]]},"234":{"position":[[256,14]]},"235":{"position":[[225,10]]},"265":{"position":[[476,10]]},"267":{"position":[[447,10],[1604,10]]},"270":{"position":[[178,10]]},"273":{"position":[[273,10]]},"283":{"position":[[429,10]]},"289":{"position":[[1472,10]]},"292":{"position":[[403,10]]},"294":{"position":[[284,10]]},"321":{"position":[[103,10]]},"369":{"position":[[467,11],[740,15]]},"375":{"position":[[378,15]]},"379":{"position":[[317,10]]},"385":{"position":[[127,8]]},"392":{"position":[[977,8]]},"407":{"position":[[406,9]]},"410":{"position":[[199,9],[270,10]]},"411":{"position":[[3123,11]]},"412":{"position":[[9076,16]]},"415":{"position":[[137,11]]},"418":{"position":[[87,14]]},"421":{"position":[[695,9]]},"427":{"position":[[372,10]]},"445":{"position":[[1527,10]]},"447":{"position":[[414,11]]},"460":{"position":[[151,10]]},"474":{"position":[[255,10]]},"489":{"position":[[581,10]]},"502":{"position":[[145,14]]},"507":{"position":[[195,15]]},"510":{"position":[[374,11]]},"515":{"position":[[393,14]]},"518":{"position":[[354,8]]},"530":{"position":[[502,15]]},"548":{"position":[[216,11]]},"569":{"position":[[191,8],[524,9],[915,8],[1468,8]]},"571":{"position":[[136,8],[1835,8]]},"582":{"position":[[732,10]]},"608":{"position":[[216,11]]},"610":{"position":[[461,8],[556,9]]},"611":{"position":[[223,8]]},"617":{"position":[[859,8]]},"627":{"position":[[182,10]]},"630":{"position":[[163,9],[503,15]]},"632":{"position":[[2771,10]]},"642":{"position":[[219,11]]},"699":{"position":[[961,8]]},"751":{"position":[[1419,8],[1470,9]]},"801":{"position":[[565,10],[742,14]]},"802":{"position":[[785,8]]},"829":{"position":[[376,11],[1151,11]]},"836":{"position":[[1713,14]]},"838":{"position":[[543,11]]},"875":{"position":[[3317,8]]},"886":{"position":[[1431,8],[1531,8]]},"888":{"position":[[57,8],[613,8]]},"889":{"position":[[34,8],[700,8]]},"988":{"position":[[2835,8],[2879,9],[3696,8]]},"1024":{"position":[[361,8]]},"1102":{"position":[[685,8],[1016,8]]},"1124":{"position":[[715,8]]},"1132":{"position":[[1007,10]]},"1257":{"position":[[89,8]]}},"keywords":{}}],["response.json",{"_index":1359,"title":{},"content":{"209":{"position":[[1229,16]]},"392":{"position":[[1043,16]]},"610":{"position":[[980,16]]},"751":{"position":[[1430,16]]},"875":{"position":[[3447,16]]},"988":{"position":[[3841,16]]},"1024":{"position":[[452,16]]}},"keywords":{}}],["responsemodifi",{"_index":5154,"title":{},"content":{"888":{"position":[[268,16],[551,17]]},"889":{"position":[[581,17]]}},"keywords":{}}],["responsiveness.it",{"_index":6070,"title":{},"content":{"1143":{"position":[[592,17]]}},"keywords":{}}],["responsiveness.mad",{"_index":1217,"title":{},"content":{"174":{"position":[[1185,19]]}},"keywords":{}}],["responsiveness.scal",{"_index":5239,"title":{},"content":{"902":{"position":[[145,26]]}},"keywords":{}}],["rest",{"_index":307,"title":{"784":{"position":[[19,5]]},"1102":{"position":[[0,4]]}},"content":{"18":{"position":[[189,4]]},"38":{"position":[[364,4]]},"57":{"position":[[366,5]]},"89":{"position":[[139,4]]},"173":{"position":[[474,4]]},"202":{"position":[[301,5]]},"223":{"position":[[118,4],[404,4]]},"249":{"position":[[255,4]]},"255":{"position":[[950,4],[1052,4],[1127,4],[1390,4]]},"310":{"position":[[146,4]]},"312":{"position":[[186,6]]},"383":{"position":[[143,4]]},"411":{"position":[[1208,4]]},"478":{"position":[[31,4]]},"482":{"position":[[131,5],[1022,4]]},"564":{"position":[[137,5],[1031,5]]},"566":{"position":[[1391,4]]},"632":{"position":[[881,4]]},"644":{"position":[[536,5]]},"784":{"position":[[297,4]]},"988":{"position":[[560,4],[2481,4],[3675,4]]},"1100":{"position":[[263,4]]},"1102":{"position":[[5,4],[289,4],[744,4],[802,4],[910,6],[1070,4]]},"1149":{"position":[[372,4],[473,7]]}},"keywords":{}}],["rest.queri",{"_index":1901,"title":{},"content":{"315":{"position":[[998,12]]}},"keywords":{}}],["restart",{"_index":3561,"title":{},"content":{"610":{"position":[[1288,7]]},"723":{"position":[[1466,9]]},"998":{"position":[[177,7]]},"999":{"position":[[96,7]]},"1085":{"position":[[3553,7]]},"1301":{"position":[[1627,7]]},"1314":{"position":[[594,8]]}},"keywords":{}}],["restarts/reload",{"_index":4050,"title":{},"content":{"724":{"position":[[619,17]]}},"keywords":{}}],["restcompress",{"_index":3699,"title":{},"content":{"631":{"position":[[457,15]]}},"keywords":{}}],["restor",{"_index":707,"title":{},"content":{"46":{"position":[[242,9]]},"164":{"position":[[276,9]]},"201":{"position":[[338,9]]},"274":{"position":[[255,9]]},"280":{"position":[[312,9]]},"327":{"position":[[223,9]]},"380":{"position":[[202,9]]},"419":{"position":[[545,9]]},"436":{"position":[[227,9]]},"502":{"position":[[592,9]]},"565":{"position":[[274,9]]},"582":{"position":[[145,9]]},"584":{"position":[[121,9]]}},"keywords":{}}],["restored.data",{"_index":1922,"title":{},"content":{"323":{"position":[[307,13]]},"575":{"position":[[415,13]]}},"keywords":{}}],["restrict",{"_index":685,"title":{"796":{"position":[[55,8]]}},"content":{"43":{"position":[[632,9]]},"66":{"position":[[428,12]]},"408":{"position":[[96,10],[498,11]]},"427":{"position":[[513,11]]},"624":{"position":[[310,12]]},"796":{"position":[[141,11],[312,11],[565,11],[605,11],[973,11],[1015,11],[1263,11],[1404,11]]},"1105":{"position":[[61,8],[516,9]]},"1106":{"position":[[63,8],[152,8],[356,8]]}},"keywords":{}}],["restructur",{"_index":5622,"title":{},"content":{"1021":{"position":[[114,11]]}},"keywords":{}}],["result",{"_index":543,"title":{"1321":{"position":[[14,8]]}},"content":{"34":{"position":[[623,7]]},"65":{"position":[[370,7],[1144,7]]},"69":{"position":[[137,6]]},"77":{"position":[[335,8]]},"91":{"position":[[234,9]]},"92":{"position":[[67,9]]},"93":{"position":[[181,9]]},"100":{"position":[[296,9]]},"103":{"position":[[375,8]]},"108":{"position":[[139,9]]},"130":{"position":[[230,7]]},"173":{"position":[[808,9],[2596,9]]},"174":{"position":[[1711,9]]},"182":{"position":[[265,8]]},"188":{"position":[[3130,7],[3277,8]]},"197":{"position":[[154,9]]},"216":{"position":[[172,9]]},"220":{"position":[[185,9]]},"227":{"position":[[270,9]]},"234":{"position":[[435,8]]},"252":{"position":[[333,7]]},"281":{"position":[[395,7]]},"287":{"position":[[1004,6]]},"289":{"position":[[260,9]]},"301":{"position":[[354,8]]},"329":{"position":[[127,6]]},"360":{"position":[[321,8]]},"390":{"position":[[801,7]]},"392":{"position":[[3441,6]]},"393":{"position":[[731,8]]},"394":{"position":[[1181,8]]},"398":{"position":[[250,6],[1709,7],[2862,7],[3034,7],[3115,7]]},"400":{"position":[[457,7],[760,6]]},"402":{"position":[[556,8],[1312,7],[1359,6],[1629,8],[2388,7]]},"404":{"position":[[897,7]]},"408":{"position":[[4792,6]]},"410":{"position":[[286,7]]},"411":{"position":[[1734,7],[3006,8],[3497,6],[3566,7]]},"434":{"position":[[334,7]]},"439":{"position":[[728,6]]},"459":{"position":[[827,6]]},"462":{"position":[[273,7]]},"474":{"position":[[266,9]]},"480":{"position":[[812,6]]},"490":{"position":[[657,7]]},"491":{"position":[[928,6]]},"502":{"position":[[806,6],[1039,6]]},"507":{"position":[[141,9]]},"518":{"position":[[131,7],[208,7],[506,6]]},"523":{"position":[[454,7]]},"535":{"position":[[824,7]]},"571":{"position":[[721,7],[843,6],[987,6],[1093,8],[1461,7]]},"575":{"position":[[664,6]]},"580":{"position":[[138,7],[636,7]]},"602":{"position":[[288,6]]},"618":{"position":[[504,7]]},"626":{"position":[[336,8]]},"662":{"position":[[160,6],[2669,6]]},"685":{"position":[[646,6]]},"704":{"position":[[578,7]]},"710":{"position":[[212,7],[1976,6]]},"711":{"position":[[658,6]]},"723":{"position":[[340,8],[1204,7]]},"749":{"position":[[2205,6],[3317,6],[16299,6]]},"772":{"position":[[1003,6]]},"775":{"position":[[774,6]]},"781":{"position":[[782,7]]},"782":{"position":[[51,6]]},"796":{"position":[[106,6]]},"799":{"position":[[37,6],[185,6],[304,8],[562,6],[794,6]]},"817":{"position":[[176,8],[295,6]]},"821":{"position":[[128,7],[317,6]]},"826":{"position":[[773,6],[871,6]]},"829":{"position":[[2265,7],[2493,8],[3190,7],[3408,8],[3688,6]]},"837":{"position":[[635,7]]},"838":{"position":[[189,6],[2883,6]]},"886":{"position":[[1417,6]]},"944":{"position":[[183,6]]},"945":{"position":[[124,6],[445,6]]},"965":{"position":[[175,7]]},"1030":{"position":[[262,7]]},"1055":{"position":[[83,6]]},"1056":{"position":[[57,6]]},"1057":{"position":[[42,6],[109,7]]},"1058":{"position":[[51,6],[305,8],[352,8],[472,8],[531,7]]},"1059":{"position":[[49,7]]},"1060":{"position":[[71,7]]},"1061":{"position":[[72,7]]},"1064":{"position":[[351,6]]},"1067":{"position":[[420,6],[505,6],[1742,6]]},"1068":{"position":[[489,6]]},"1069":{"position":[[88,7],[603,7],[664,6],[760,7],[825,6]]},"1072":{"position":[[1011,7],[1411,7],[2863,7]]},"1079":{"position":[[589,8]]},"1100":{"position":[[493,9]]},"1102":{"position":[[1138,7],[1202,7]]},"1150":{"position":[[78,7],[564,7]]},"1209":{"position":[[366,7]]},"1213":{"position":[[97,8]]},"1250":{"position":[[212,6],[243,7],[582,7]]},"1294":{"position":[[788,6],[1042,7],[1731,6],[1832,7],[1977,7]]},"1295":{"position":[[788,8],[1348,7],[1406,7]]},"1315":{"position":[[900,6],[1339,6],[1469,6]]},"1318":{"position":[[350,8],[410,6],[514,7],[637,7],[900,7],[1096,7],[1190,8]]},"1321":{"position":[[220,8],[274,6],[433,6],[536,7],[643,6],[749,6]]},"1322":{"position":[[103,6],[546,7]]}},"keywords":{}}],["result.concat(subresult",{"_index":6446,"title":{},"content":{"1294":{"position":[[1740,25]]}},"keywords":{}}],["result.length",{"_index":5781,"title":{},"content":{"1067":{"position":[[2196,14]]}},"keywords":{}}],["results.for",{"_index":2484,"title":{},"content":{"402":{"position":[[1082,11]]}},"keywords":{}}],["results.length",{"_index":980,"title":{},"content":{"77":{"position":[[348,16]]},"103":{"position":[[388,16]]},"234":{"position":[[448,16]]},"1058":{"position":[[318,16]]}},"keywords":{}}],["results.length}</span>",{"_index":4760,"title":{},"content":{"829":{"position":[[2627,30]]}},"keywords":{}}],["results.map(hero",{"_index":4763,"title":{},"content":{"829":{"position":[[3533,17]]}},"keywords":{}}],["resultset",{"_index":5778,"title":{},"content":{"1067":{"position":[[1946,9]]}},"keywords":{}}],["resultset.length",{"_index":5779,"title":{},"content":{"1067":{"position":[[2049,17]]}},"keywords":{}}],["resultsit",{"_index":4699,"title":{},"content":{"816":{"position":[[197,9]]}},"keywords":{}}],["resum",{"_index":2241,"title":{},"content":{"392":{"position":[[2263,6]]},"630":{"position":[[377,7]]},"632":{"position":[[1990,8]]},"896":{"position":[[191,10]]},"988":{"position":[[377,6]]},"998":{"position":[[60,7]]},"1003":{"position":[[336,8]]}},"keywords":{}}],["resync",{"_index":2751,"title":{"996":{"position":[[0,9]]}},"content":{"412":{"position":[[11917,7]]},"875":{"position":[[8529,6],[8793,6],[9039,6],[9354,6]]},"985":{"position":[[278,6],[578,6]]},"988":{"position":[[5965,6]]},"996":{"position":[[12,6],[387,8],[508,6]]}},"keywords":{}}],["retain",{"_index":2134,"title":{},"content":{"372":{"position":[[318,9]]},"417":{"position":[[70,9]]},"436":{"position":[[134,7]]},"1009":{"position":[[817,6]]}},"keywords":{}}],["retcheckpoint",{"_index":5112,"title":{},"content":{"885":{"position":[[2521,13],[2631,13]]}},"keywords":{}}],["retent",{"_index":2109,"title":{},"content":{"365":{"position":[[586,9],[765,10]]},"411":{"position":[[5746,9]]}},"keywords":{}}],["rethink",{"_index":354,"title":{},"content":{"20":{"position":[[150,7]]}},"keywords":{}}],["rethinkdb",{"_index":346,"title":{"20":{"position":[[0,10]]}},"content":{"20":{"position":[[3,9]]},"21":{"position":[[40,9],[147,9]]},"22":{"position":[[292,10]]}},"keywords":{}}],["retir",{"_index":434,"title":{},"content":{"26":{"position":[[380,7]]}},"keywords":{}}],["retri",{"_index":1803,"title":{},"content":{"302":{"position":[[659,7]]},"487":{"position":[[380,5]]},"612":{"position":[[1658,5]]},"632":{"position":[[2641,5]]},"899":{"position":[[115,8]]},"988":{"position":[[935,8]]},"995":{"position":[[161,5]]},"1031":{"position":[[184,8]]}},"keywords":{}}],["retriev",{"_index":926,"title":{},"content":{"65":{"position":[[1255,10]]},"66":{"position":[[306,9]]},"92":{"position":[[200,9]]},"117":{"position":[[107,9]]},"131":{"position":[[571,8]]},"138":{"position":[[132,9]]},"152":{"position":[[274,10]]},"166":{"position":[[141,9]]},"178":{"position":[[125,10]]},"194":{"position":[[206,10]]},"205":{"position":[[108,10]]},"208":{"position":[[130,10]]},"217":{"position":[[372,9]]},"220":{"position":[[318,10]]},"276":{"position":[[292,9]]},"283":{"position":[[99,9]]},"321":{"position":[[67,8]]},"350":{"position":[[198,8]]},"369":{"position":[[271,9]]},"394":{"position":[[1560,10]]},"395":{"position":[[246,8]]},"398":{"position":[[1828,8]]},"402":{"position":[[132,9]]},"425":{"position":[[325,10]]},"426":{"position":[[201,8],[442,10]]},"427":{"position":[[755,10]]},"430":{"position":[[349,9]]},"435":{"position":[[395,10]]},"444":{"position":[[676,8]]},"507":{"position":[[130,10]]},"527":{"position":[[209,10]]},"556":{"position":[[258,8]]},"632":{"position":[[2428,8]]},"711":{"position":[[645,8]]},"714":{"position":[[264,8]]},"715":{"position":[[46,8],[286,8]]},"1072":{"position":[[111,10]]},"1132":{"position":[[243,9],[665,10]]},"1174":{"position":[[595,8]]},"1294":{"position":[[1054,9]]},"1315":{"position":[[1400,8]]}},"keywords":{}}],["retrieval.build",{"_index":1200,"title":{},"content":{"173":{"position":[[833,18]]}},"keywords":{}}],["retrieval.tab",{"_index":2889,"title":{},"content":{"427":{"position":[[1093,13]]}},"keywords":{}}],["retryattempt",{"_index":5148,"title":{},"content":{"886":{"position":[[4876,14]]}},"keywords":{}}],["retrytim",{"_index":3709,"title":{},"content":{"632":{"position":[[2621,10]]},"862":{"position":[[1518,11]]},"886":{"position":[[1986,9]]},"988":{"position":[[1077,10]]}},"keywords":{}}],["return",{"_index":161,"title":{},"content":{"11":{"position":[[578,6]]},"51":{"position":[[884,6]]},"55":{"position":[[458,6],[511,6]]},"143":{"position":[[757,6]]},"188":{"position":[[1467,6]]},"209":{"position":[[907,6],[936,6],[1216,6],[1266,6]]},"248":{"position":[[201,7]]},"255":{"position":[[1258,6],[1282,6],[1523,6],[1597,6]]},"314":{"position":[[906,6]]},"315":{"position":[[923,6]]},"334":{"position":[[768,6]]},"338":{"position":[[159,8]]},"390":{"position":[[793,7]]},"391":{"position":[[720,6],[842,9]]},"392":{"position":[[4247,6]]},"393":{"position":[[783,7]]},"394":{"position":[[1220,8]]},"398":{"position":[[1582,6],[1700,6],[2735,6],[2853,6]]},"403":{"position":[[1000,6]]},"407":{"position":[[670,8]]},"412":{"position":[[4992,6],[5469,6],[5546,6]]},"439":{"position":[[410,6]]},"460":{"position":[[1269,8]]},"480":{"position":[[766,7],[919,6]]},"482":{"position":[[1035,6]]},"491":{"position":[[1240,8]]},"494":{"position":[[315,6]]},"495":{"position":[[572,9]]},"502":{"position":[[992,7]]},"518":{"position":[[459,7]]},"523":{"position":[[593,6],[616,6]]},"541":{"position":[[462,6],[524,6]]},"542":{"position":[[818,6]]},"554":{"position":[[1549,6]]},"556":{"position":[[451,6]]},"559":{"position":[[370,6],[510,6]]},"562":{"position":[[1360,6],[1438,6]]},"571":{"position":[[933,7]]},"579":{"position":[[782,6]]},"580":{"position":[[14,6]]},"585":{"position":[[15,9]]},"598":{"position":[[914,6]]},"632":{"position":[[1774,7],[1878,6]]},"659":{"position":[[389,6]]},"691":{"position":[[327,6]]},"698":{"position":[[665,9]]},"711":{"position":[[1545,6]]},"724":{"position":[[844,9]]},"749":{"position":[[15913,6],[22486,7]]},"751":{"position":[[340,7],[400,7],[700,6],[943,6],[1032,7],[1312,6],[1480,6],[1802,6],[1976,6],[1994,6]]},"752":{"position":[[117,7],[587,6],[718,7]]},"753":{"position":[[30,7]]},"754":{"position":[[387,6],[547,6],[769,6]]},"767":{"position":[[551,6],[960,6]]},"768":{"position":[[553,6],[962,6]]},"769":{"position":[[510,6],[931,6]]},"775":{"position":[[763,6]]},"789":{"position":[[253,6],[500,6]]},"791":{"position":[[109,6],[368,6]]},"792":{"position":[[240,6]]},"810":{"position":[[109,7]]},"829":{"position":[[867,6],[1606,6],[1733,6],[2002,7],[2548,6],[2594,6],[3170,7],[3467,6],[3513,6],[3822,8]]},"846":{"position":[[1349,7]]},"848":{"position":[[593,6]]},"860":{"position":[[468,8]]},"862":{"position":[[1629,8]]},"872":{"position":[[2732,8]]},"875":{"position":[[1977,7],[3464,6],[3713,6],[4076,6],[6454,6]]},"885":{"position":[[56,7],[173,7],[1072,7],[1146,6],[1769,6],[1813,6],[1879,6],[1909,6],[1925,6],[1949,6],[2103,6],[2154,6],[2268,6],[2286,6],[2314,6],[2586,6],[2647,6]]},"886":{"position":[[167,7],[767,6],[2232,7],[2491,6],[3065,9],[3682,6],[4714,7]]},"887":{"position":[[664,6]]},"888":{"position":[[171,9],[218,7],[322,8],[631,8],[982,8],[1049,6]]},"889":{"position":[[90,7],[242,7],[719,6]]},"890":{"position":[[45,7]]},"898":{"position":[[3594,6],[3808,6],[4237,7],[4547,8]]},"904":{"position":[[3195,7]]},"907":{"position":[[200,7],[350,6]]},"917":{"position":[[37,7]]},"919":{"position":[[1,7],[36,7]]},"920":{"position":[[1,7]]},"929":{"position":[[25,7]]},"930":{"position":[[1,7]]},"931":{"position":[[1,7]]},"932":{"position":[[1,7]]},"941":{"position":[[19,6]]},"942":{"position":[[141,7]]},"943":{"position":[[289,7]]},"944":{"position":[[125,7],[612,6],[659,8]]},"945":{"position":[[66,7]]},"946":{"position":[[98,7]]},"947":{"position":[[114,7]]},"950":{"position":[[46,7]]},"951":{"position":[[154,7],[303,8],[458,8],[501,6]]},"957":{"position":[[1,7],[66,7]]},"968":{"position":[[275,7],[449,6]]},"970":{"position":[[19,6]]},"974":{"position":[[1,7]]},"975":{"position":[[1,7]]},"976":{"position":[[106,7]]},"978":{"position":[[1,7],[64,7]]},"983":{"position":[[245,7],[323,7],[368,8],[589,6],[699,6]]},"984":{"position":[[561,7]]},"988":{"position":[[2803,6],[2872,6],[3184,6],[3858,6],[4190,8]]},"992":{"position":[[38,7]]},"994":{"position":[[161,8]]},"995":{"position":[[1,7]]},"997":{"position":[[26,7]]},"1000":{"position":[[1,7]]},"1001":{"position":[[1,7]]},"1007":{"position":[[1295,7]]},"1008":{"position":[[175,7]]},"1014":{"position":[[118,7]]},"1015":{"position":[[98,7]]},"1016":{"position":[[35,7]]},"1017":{"position":[[21,7]]},"1038":{"position":[[116,10],[168,7]]},"1039":{"position":[[15,7]]},"1042":{"position":[[80,7],[207,6]]},"1044":{"position":[[449,6]]},"1045":{"position":[[1,7]]},"1046":{"position":[[19,6]]},"1047":{"position":[[159,8]]},"1048":{"position":[[605,6]]},"1051":{"position":[[1,7],[61,6]]},"1052":{"position":[[22,7],[250,8]]},"1053":{"position":[[1,7],[64,7]]},"1057":{"position":[[1,7]]},"1061":{"position":[[264,6]]},"1062":{"position":[[30,7]]},"1063":{"position":[[1,7]]},"1065":{"position":[[1691,6],[2001,6]]},"1069":{"position":[[308,7]]},"1070":{"position":[[1,7],[61,7]]},"1072":{"position":[[41,8],[432,7]]},"1104":{"position":[[144,7],[319,7]]},"1105":{"position":[[207,7],[544,6],[692,6],[1100,6]]},"1106":{"position":[[492,6],[606,6],[629,6]]},"1115":{"position":[[135,7]]},"1118":{"position":[[577,6]]},"1140":{"position":[[792,6]]},"1164":{"position":[[1167,6],[1257,9]]},"1185":{"position":[[60,7]]},"1198":{"position":[[1055,6]]},"1218":{"position":[[120,7]]},"1220":{"position":[[318,6],[356,6]]},"1229":{"position":[[80,7]]},"1257":{"position":[[122,6]]},"1268":{"position":[[80,7]]},"1291":{"position":[[124,6]]},"1294":{"position":[[689,8]]},"1309":{"position":[[332,7],[909,6],[1186,6]]},"1311":{"position":[[715,6],[934,6]]},"1315":{"position":[[871,6]]},"1321":{"position":[[926,6]]},"1322":{"position":[[354,6]]}},"keywords":{}}],["reus",{"_index":743,"title":{"239":{"position":[[32,6]]}},"content":{"47":{"position":[[1315,5]]},"112":{"position":[[53,5]]},"174":{"position":[[2660,6],[2850,5]]},"239":{"position":[[58,5],[241,5]]},"384":{"position":[[387,5]]},"595":{"position":[[1338,5]]},"898":{"position":[[2766,5]]},"1124":{"position":[[1287,5],[1404,6]]},"1183":{"position":[[386,6]]},"1267":{"position":[[186,5],[323,7]]}},"keywords":{}}],["reusabl",{"_index":3476,"title":{},"content":{"574":{"position":[[114,8]]},"1249":{"position":[[231,8]]}},"keywords":{}}],["rev",{"_index":5304,"title":{"928":{"position":[[0,4]]}},"content":{},"keywords":{}}],["revenu",{"_index":602,"title":{},"content":{"38":{"position":[[997,7]]},"1112":{"position":[[349,8]]}},"keywords":{}}],["revers",{"_index":2442,"title":{},"content":{"400":{"position":[[419,7]]}},"keywords":{}}],["revert",{"_index":3187,"title":{},"content":{"495":{"position":[[413,6]]}},"keywords":{}}],["review",{"_index":3021,"title":{},"content":{"462":{"position":[[16,8]]}},"keywords":{}}],["revis",{"_index":277,"title":{"1303":{"position":[[28,9]]},"1305":{"position":[[0,10]]}},"content":{"16":{"position":[[401,9]]},"24":{"position":[[425,8],[757,8]]},"35":{"position":[[436,8]]},"203":{"position":[[184,9]]},"412":{"position":[[2077,10],[3332,8],[4946,8]]},"495":{"position":[[227,9],[582,8]]},"496":{"position":[[219,8],[788,8]]},"635":{"position":[[131,9],[385,8]]},"698":{"position":[[2049,8]]},"749":{"position":[[8998,8]]},"793":{"position":[[932,9]]},"841":{"position":[[168,8]]},"844":{"position":[[200,9]]},"928":{"position":[[5,8]]},"1044":{"position":[[118,8]]},"1051":{"position":[[380,9]]},"1198":{"position":[[498,8],[580,9]]},"1200":{"position":[[44,8]]},"1258":{"position":[[149,9]]},"1305":{"position":[[400,9],[431,9],[516,8],[585,8],[836,8],[869,8],[890,8],[990,8],[1021,8]]},"1308":{"position":[[398,9]]},"1309":{"position":[[870,9]]},"1313":{"position":[[1058,8]]},"1324":{"position":[[890,9]]}},"keywords":{}}],["revisions.stor",{"_index":1549,"title":{},"content":{"250":{"position":[[217,15]]}},"keywords":{}}],["revisit",{"_index":5582,"title":{"1008":{"position":[[16,10]]}},"content":{},"keywords":{}}],["revok",{"_index":4017,"title":{},"content":{"715":{"position":[[343,6]]}},"keywords":{}}],["revolut",{"_index":3248,"title":{},"content":{"510":{"position":[[710,11]]}},"keywords":{}}],["revolution",{"_index":3152,"title":{},"content":{"485":{"position":[[184,13]]}},"keywords":{}}],["revolv",{"_index":1336,"title":{},"content":{"208":{"position":[[106,8]]},"514":{"position":[[290,8]]},"632":{"position":[[26,8]]}},"keywords":{}}],["rewrit",{"_index":1389,"title":{},"content":{"212":{"position":[[470,9]]},"354":{"position":[[1039,9]]},"383":{"position":[[448,9]]},"696":{"position":[[1834,7]]},"849":{"position":[[897,7]]}},"keywords":{}}],["rewritten",{"_index":646,"title":{},"content":{"41":{"position":[[28,9]]}},"keywords":{}}],["rfc",{"_index":3012,"title":{},"content":{"461":{"position":[[46,3]]},"617":{"position":[[360,3],[437,3]]}},"keywords":{}}],["riak",{"_index":6584,"title":{},"content":{"1324":{"position":[[953,4]]}},"keywords":{}}],["rich",{"_index":989,"title":{"383":{"position":[[0,4]]}},"content":{"83":{"position":[[47,4]]},"90":{"position":[[301,4]]},"148":{"position":[[281,4]]},"186":{"position":[[385,4]]},"198":{"position":[[230,4]]},"412":{"position":[[3764,4]]},"446":{"position":[[950,4]]},"836":{"position":[[2482,4]]},"860":{"position":[[244,4]]}},"keywords":{}}],["right",{"_index":696,"title":{"212":{"position":[[12,5]]},"262":{"position":[[8,5]]},"441":{"position":[[25,5]]}},"content":{"45":{"position":[[171,5]]},"93":{"position":[[247,5]]},"143":{"position":[[579,6]]},"178":{"position":[[305,5]]},"205":{"position":[[236,5]]},"278":{"position":[[31,5]]},"401":{"position":[[909,5]]},"408":{"position":[[3720,5]]},"410":{"position":[[2176,5]]},"421":{"position":[[544,5]]},"491":{"position":[[902,5]]},"574":{"position":[[575,5]]},"707":{"position":[[393,5]]},"742":{"position":[[81,5]]},"795":{"position":[[210,5]]},"799":{"position":[[657,5]]}},"keywords":{}}],["rigid",{"_index":1659,"title":{},"content":{"282":{"position":[[229,5]]},"351":{"position":[[32,5]]},"362":{"position":[[104,5]]}},"keywords":{}}],["rise",{"_index":2329,"title":{},"content":{"394":{"position":[[1703,4]]},"408":{"position":[[4313,4],[5018,7]]}},"keywords":{}}],["risk",{"_index":2057,"title":{},"content":{"358":{"position":[[309,4],[622,5]]},"377":{"position":[[85,4]]},"382":{"position":[[371,5]]},"410":{"position":[[725,4]]},"412":{"position":[[8469,5],[13395,5]]},"482":{"position":[[21,4]]},"497":{"position":[[550,4]]},"550":{"position":[[327,4]]},"863":{"position":[[995,5]]},"902":{"position":[[427,5]]},"981":{"position":[[1446,7]]},"1090":{"position":[[1303,4]]}},"keywords":{}}],["rl",{"_index":5192,"title":{},"content":{"897":{"position":[[512,5]]},"898":{"position":[[2825,4]]},"899":{"position":[[201,5]]}},"keywords":{}}],["rm",{"_index":4894,"title":{},"content":{"861":{"position":[[563,2]]},"865":{"position":[[224,2]]}},"keywords":{}}],["rm1",{"_index":4431,"title":{},"content":{"749":{"position":[[23588,3]]}},"keywords":{}}],["robust",{"_index":541,"title":{},"content":{"34":{"position":[[552,6]]},"45":{"position":[[257,6]]},"47":{"position":[[407,6]]},"61":{"position":[[369,7]]},"64":{"position":[[45,6]]},"74":{"position":[[13,6]]},"117":{"position":[[226,6]]},"151":{"position":[[415,6]]},"162":{"position":[[311,6]]},"165":{"position":[[359,6]]},"174":{"position":[[854,6]]},"184":{"position":[[91,6]]},"189":{"position":[[363,6]]},"205":{"position":[[84,6]]},"240":{"position":[[163,6]]},"255":{"position":[[69,6]]},"263":{"position":[[124,6]]},"295":{"position":[[210,6]]},"320":{"position":[[323,6]]},"354":{"position":[[1457,6]]},"362":{"position":[[1054,6]]},"373":{"position":[[632,6]]},"386":{"position":[[147,6]]},"388":{"position":[[287,7]]},"408":{"position":[[1849,6]]},"412":{"position":[[9781,6],[14287,6]]},"418":{"position":[[641,6]]},"430":{"position":[[628,6]]},"435":{"position":[[193,10]]},"441":{"position":[[509,6]]},"445":{"position":[[2045,6]]},"447":{"position":[[274,6]]},"479":{"position":[[511,6]]},"503":{"position":[[214,6]]},"513":{"position":[[327,6]]},"517":{"position":[[139,6]]},"530":{"position":[[656,6]]},"557":{"position":[[453,6]]},"560":{"position":[[132,6]]},"564":{"position":[[159,6]]},"567":{"position":[[1180,6]]},"631":{"position":[[351,6]]},"705":{"position":[[924,6]]},"838":{"position":[[888,6]]},"839":{"position":[[791,6]]},"903":{"position":[[661,6]]},"906":{"position":[[640,6]]},"912":{"position":[[253,6]]}},"keywords":{}}],["robust.high",{"_index":2024,"title":{},"content":{"354":{"position":[[674,11]]}},"keywords":{}}],["rocicorp",{"_index":608,"title":{},"content":{"38":{"position":[[1073,8]]}},"keywords":{}}],["role",{"_index":1064,"title":{},"content":{"117":{"position":[[24,4]]},"152":{"position":[[171,4]]},"178":{"position":[[24,4]]},"411":{"position":[[2669,5]]},"447":{"position":[[31,4]]},"534":{"position":[[64,4]]},"569":{"position":[[633,4]]},"594":{"position":[[62,4]]},"897":{"position":[[572,4]]},"898":{"position":[[2885,4]]},"1148":{"position":[[336,6]]}},"keywords":{}}],["roll",{"_index":6487,"title":{},"content":{"1304":{"position":[[964,4]]},"1316":{"position":[[1690,4],[2928,4]]}},"keywords":{}}],["rollback",{"_index":619,"title":{},"content":{"39":{"position":[[212,8]]},"1316":{"position":[[2753,9],[2960,9]]}},"keywords":{}}],["rollup",{"_index":1938,"title":{},"content":{"333":{"position":[[160,7]]},"730":{"position":[[162,7]]}},"keywords":{}}],["room",{"_index":1585,"title":{},"content":{"261":{"position":[[398,6]]},"904":{"position":[[1924,5]]}},"keywords":{}}],["root",{"_index":3236,"title":{},"content":{"504":{"position":[[906,5]]},"1092":{"position":[[100,4]]},"1116":{"position":[[317,4]]},"1208":{"position":[[66,4],[650,4],[708,4]]},"1215":{"position":[[508,4]]},"1266":{"position":[[343,4]]}},"keywords":{}}],["root.getdirectoryhandle('subfold",{"_index":6200,"title":{},"content":{"1208":{"position":[[810,36]]}},"keywords":{}}],["root/user/project/mydatabas",{"_index":93,"title":{},"content":{"6":{"position":[[706,32]]},"7":{"position":[[541,32]]}},"keywords":{}}],["rootpath",{"_index":4271,"title":{},"content":{"749":{"position":[[10515,8]]}},"keywords":{}}],["rootvalu",{"_index":5091,"title":{},"content":{"885":{"position":[[1466,9]]}},"keywords":{}}],["roughli",{"_index":2349,"title":{},"content":{"396":{"position":[[1431,7]]}},"keywords":{}}],["round",{"_index":1011,"title":{},"content":{"92":{"position":[[125,5]]},"173":{"position":[[2024,5]]},"220":{"position":[[118,5]]},"224":{"position":[[270,5]]},"375":{"position":[[314,5]]},"408":{"position":[[2333,5],[2580,5],[2899,5],[3303,5]]},"410":{"position":[[111,5]]},"411":{"position":[[344,5]]},"415":{"position":[[286,5]]},"487":{"position":[[249,5]]},"574":{"position":[[427,5]]},"630":{"position":[[625,5]]},"902":{"position":[[114,5]]}},"keywords":{}}],["rout",{"_index":589,"title":{},"content":{"38":{"position":[[369,6]]},"89":{"position":[[144,7]]},"173":{"position":[[479,7]]},"223":{"position":[[123,7]]},"408":{"position":[[2450,8]]},"411":{"position":[[1213,6]]},"412":{"position":[[4104,6]]},"784":{"position":[[130,6],[149,5],[238,6],[302,6]]},"799":{"position":[[501,6]]},"875":{"position":[[1169,6],[6897,5]]},"1112":{"position":[[574,7]]}},"keywords":{}}],["row",{"_index":1650,"title":{},"content":{"279":{"position":[[335,4]]},"364":{"position":[[658,5]]},"661":{"position":[[1271,4]]},"704":{"position":[[64,5]]},"705":{"position":[[842,4],[860,4]]},"711":{"position":[[1231,3],[1599,5],[1730,4]]},"749":{"position":[[16311,5]]},"836":{"position":[[941,4]]},"875":{"position":[[3688,4],[3809,3],[3985,4],[5958,4]]},"885":{"position":[[70,4]]},"886":{"position":[[2296,4],[2483,4]]},"897":{"position":[[493,3]]},"898":{"position":[[326,3],[395,3],[457,4],[604,4],[1329,3]]},"899":{"position":[[182,3]]},"981":{"position":[[1073,4]]},"1124":{"position":[[775,4],[816,3]]},"1253":{"position":[[96,4]]},"1257":{"position":[[166,4]]},"1314":{"position":[[449,4]]},"1316":{"position":[[792,5],[1092,3],[1279,5],[3426,4]]},"1317":{"position":[[526,4],[653,4],[730,4]]},"1319":{"position":[[448,3]]},"1321":{"position":[[343,4]]}},"keywords":{}}],["rowid",{"_index":6373,"title":{},"content":{"1282":{"position":[[960,5]]}},"keywords":{}}],["rows/docu",{"_index":6570,"title":{},"content":{"1319":{"position":[[115,15]]}},"keywords":{}}],["rs0",{"_index":4943,"title":{},"content":{"872":{"position":[[562,3]]}},"keywords":{}}],["rtc",{"_index":3449,"title":{},"content":{"569":{"position":[[106,6]]},"614":{"position":[[118,5]]}},"keywords":{}}],["rto",{"_index":3453,"title":{},"content":{"569":{"position":[[354,6]]}},"keywords":{}}],["rudimentari",{"_index":728,"title":{},"content":{"47":{"position":[[427,11]]},"535":{"position":[[397,11]]},"595":{"position":[[425,11]]}},"keywords":{}}],["rule",{"_index":1728,"title":{},"content":{"298":{"position":[[766,5]]},"299":{"position":[[105,5]]},"305":{"position":[[362,6]]},"354":{"position":[[1497,5]]},"688":{"position":[[907,4]]},"690":{"position":[[180,4]]},"841":{"position":[[1296,5]]},"1266":{"position":[[732,6]]}},"keywords":{}}],["rules).workflow",{"_index":3203,"title":{},"content":{"497":{"position":[[436,16]]}},"keywords":{}}],["run",{"_index":373,"title":{"92":{"position":[[0,7]]},"188":{"position":[[13,3]]},"207":{"position":[[31,5]]},"682":{"position":[[0,7]]},"757":{"position":[[20,3]]},"1088":{"position":[[0,3]]}},"content":{"22":{"position":[[263,3]]},"23":{"position":[[193,3]]},"29":{"position":[[358,8]]},"30":{"position":[[35,3]]},"38":{"position":[[247,4]]},"65":{"position":[[1040,3]]},"91":{"position":[[88,3]]},"92":{"position":[[42,7]]},"125":{"position":[[110,7]]},"128":{"position":[[135,7]]},"172":{"position":[[301,3]]},"188":{"position":[[62,3],[178,4]]},"204":{"position":[[115,7]]},"207":{"position":[[48,3]]},"220":{"position":[[52,3]]},"248":{"position":[[6,4]]},"251":{"position":[[69,3]]},"252":{"position":[[212,3]]},"254":{"position":[[21,3]]},"262":{"position":[[443,3]]},"291":{"position":[[435,4]]},"300":{"position":[[630,4]]},"301":{"position":[[196,7]]},"305":{"position":[[117,3]]},"309":{"position":[[182,3]]},"313":{"position":[[6,4]]},"330":{"position":[[1,7]]},"354":{"position":[[832,4]]},"357":{"position":[[604,3]]},"367":{"position":[[235,3]]},"376":{"position":[[643,3]]},"391":{"position":[[192,3],[793,7]]},"392":{"position":[[1937,4],[2098,4],[3019,7],[3242,4],[3302,3],[5078,7]]},"394":{"position":[[112,3],[1328,3]]},"399":{"position":[[517,3]]},"403":{"position":[[348,4]]},"408":{"position":[[127,7],[3716,3],[4905,7]]},"410":{"position":[[23,7]]},"411":{"position":[[3226,7],[3629,7],[4721,5]]},"412":{"position":[[11132,3],[11353,4],[13901,7],[14445,3]]},"440":{"position":[[63,7],[189,5]]},"445":{"position":[[2229,3]]},"446":{"position":[[1339,4]]},"451":{"position":[[635,7]]},"454":{"position":[[208,3],[290,3],[397,4]]},"455":{"position":[[865,3]]},"457":{"position":[[346,3],[621,7],[641,7]]},"458":{"position":[[219,8]]},"459":{"position":[[132,7]]},"460":{"position":[[6,7],[196,3],[834,3]]},"462":{"position":[[201,3],[447,3]]},"466":{"position":[[322,7]]},"470":{"position":[[291,7]]},"479":{"position":[[292,3]]},"490":{"position":[[563,7]]},"534":{"position":[[625,3]]},"569":{"position":[[1190,3]]},"575":{"position":[[135,4]]},"581":{"position":[[428,4]]},"594":{"position":[[623,3]]},"612":{"position":[[2526,7]]},"614":{"position":[[920,3]]},"617":{"position":[[1297,3]]},"618":{"position":[[39,7]]},"623":{"position":[[427,3]]},"647":{"position":[[488,3]]},"653":{"position":[[742,8],[1027,7],[1082,8]]},"654":{"position":[[18,3],[99,3]]},"656":{"position":[[23,3],[63,3],[244,3]]},"660":{"position":[[22,3]]},"662":{"position":[[2650,3]]},"666":{"position":[[315,3],[425,3]]},"668":{"position":[[337,3],[380,3]]},"670":{"position":[[67,4],[504,3],[512,3],[544,3]]},"678":{"position":[[153,3]]},"680":{"position":[[1283,3]]},"681":{"position":[[42,3],[320,3],[560,3],[704,3],[762,4],[870,3]]},"683":{"position":[[778,3]]},"693":{"position":[[47,3]]},"699":{"position":[[690,3],[791,3],[824,4],[897,7]]},"700":{"position":[[669,8]]},"703":{"position":[[449,4],[1022,3]]},"704":{"position":[[36,3],[324,7],[530,3]]},"707":{"position":[[125,4],[252,4]]},"708":{"position":[[18,4],[572,3]]},"709":{"position":[[1315,4]]},"710":{"position":[[1299,3],[1958,3]]},"721":{"position":[[98,3]]},"724":{"position":[[1513,3]]},"726":{"position":[[94,4]]},"739":{"position":[[557,4]]},"742":{"position":[[1,3]]},"743":{"position":[[253,3]]},"746":{"position":[[65,3]]},"747":{"position":[[37,3]]},"749":{"position":[[2594,7],[2654,3],[9106,3],[12224,3],[12428,7],[15057,3],[21176,3],[23514,7]]},"752":{"position":[[483,3],[826,3],[1122,9],[1141,9]]},"754":{"position":[[108,7]]},"755":{"position":[[104,7]]},"756":{"position":[[70,3],[225,3],[281,3]]},"757":{"position":[[66,7]]},"760":{"position":[[204,3]]},"761":{"position":[[359,7]]},"764":{"position":[[59,7],[206,3]]},"770":{"position":[[557,3]]},"772":{"position":[[985,3]]},"775":{"position":[[474,3],[722,3]]},"776":{"position":[[361,4]]},"780":{"position":[[753,3]]},"784":{"position":[[523,3]]},"795":{"position":[[10,3]]},"796":{"position":[[183,4]]},"798":{"position":[[183,4],[229,3]]},"799":{"position":[[450,7]]},"815":{"position":[[154,4]]},"821":{"position":[[188,3],[219,3],[442,3],[893,5]]},"835":{"position":[[261,7]]},"836":{"position":[[917,3]]},"838":{"position":[[2864,3]]},"840":{"position":[[144,3]]},"846":{"position":[[543,7]]},"848":{"position":[[995,8]]},"851":{"position":[[184,7]]},"861":{"position":[[403,3],[456,4],[553,3]]},"862":{"position":[[1677,3]]},"863":{"position":[[422,3]]},"865":{"position":[[218,3]]},"866":{"position":[[232,4]]},"871":{"position":[[626,4]]},"872":{"position":[[230,7],[281,7],[655,7],[2779,3]]},"875":{"position":[[5706,3],[5919,7],[9187,3]]},"879":{"position":[[47,3],[185,7]]},"890":{"position":[[551,3]]},"898":{"position":[[3762,4],[4595,3]]},"908":{"position":[[290,3]]},"932":{"position":[[597,3]]},"947":{"position":[[22,4],[85,7]]},"948":{"position":[[10,3],[151,3],[230,8],[281,3]]},"951":{"position":[[89,7]]},"956":{"position":[[43,3]]},"968":{"position":[[348,4],[707,7]]},"975":{"position":[[332,3],[526,3]]},"981":{"position":[[998,7],[1614,4]]},"983":{"position":[[1103,4]]},"985":{"position":[[369,3]]},"988":{"position":[[719,3],[1213,3]]},"989":{"position":[[41,4],[198,4],[453,3]]},"993":{"position":[[366,7],[655,8]]},"995":{"position":[[147,7],[263,7],[908,7]]},"996":{"position":[[383,3]]},"998":{"position":[[10,7]]},"1003":{"position":[[31,7]]},"1010":{"position":[[118,4]]},"1022":{"position":[[977,8]]},"1023":{"position":[[641,8]]},"1026":{"position":[[176,7]]},"1030":{"position":[[167,4]]},"1031":{"position":[[44,3]]},"1032":{"position":[[10,3]]},"1033":{"position":[[21,8]]},"1059":{"position":[[1,4]]},"1060":{"position":[[1,4]]},"1061":{"position":[[1,4]]},"1066":{"position":[[314,7]]},"1067":{"position":[[779,3],[961,3],[1196,3],[1426,3],[1798,7],[1891,3]]},"1068":{"position":[[179,3],[319,7]]},"1069":{"position":[[215,3]]},"1071":{"position":[[317,3]]},"1072":{"position":[[664,4],[1449,4]]},"1085":{"position":[[3766,3]]},"1088":{"position":[[88,7]]},"1092":{"position":[[448,3]]},"1093":{"position":[[12,7],[482,3]]},"1105":{"position":[[948,3],[1144,3]]},"1110":{"position":[[35,3]]},"1115":{"position":[[716,3]]},"1124":{"position":[[1529,7],[1587,3],[1810,3]]},"1125":{"position":[[635,3],[834,3]]},"1126":{"position":[[163,3]]},"1133":{"position":[[415,3]]},"1138":{"position":[[390,3]]},"1139":{"position":[[40,3],[95,3]]},"1143":{"position":[[517,4]]},"1145":{"position":[[40,3],[91,3]]},"1161":{"position":[[58,3]]},"1164":{"position":[[451,3],[1367,8]]},"1165":{"position":[[211,3],[692,4]]},"1170":{"position":[[13,3]]},"1174":{"position":[[510,3]]},"1175":{"position":[[378,7],[533,4],[686,3]]},"1180":{"position":[[58,3],[363,3]]},"1183":{"position":[[331,4]]},"1184":{"position":[[33,7],[187,3]]},"1185":{"position":[[1,7],[100,3]]},"1192":{"position":[[127,3]]},"1194":{"position":[[79,3],[876,3],[1027,4]]},"1210":{"position":[[32,3]]},"1212":{"position":[[18,3]]},"1228":{"position":[[216,4]]},"1231":{"position":[[61,3],[364,3]]},"1238":{"position":[[89,3],[216,3]]},"1246":{"position":[[90,3],[434,3],[2073,3]]},"1250":{"position":[[27,3],[166,4],[395,4],[484,3]]},"1251":{"position":[[358,3]]},"1271":{"position":[[479,3]]},"1276":{"position":[[53,3]]},"1280":{"position":[[99,7]]},"1294":{"position":[[1009,3]]},"1295":{"position":[[867,7],[973,7],[1282,3]]},"1296":{"position":[[363,3],[564,4],[1662,7]]},"1297":{"position":[[106,4],[559,4]]},"1300":{"position":[[503,3],[678,8]]},"1301":{"position":[[638,4]]},"1304":{"position":[[520,7],[595,3],[823,3]]},"1309":{"position":[[204,3]]},"1313":{"position":[[46,3],[168,3]]},"1314":{"position":[[408,3]]},"1315":{"position":[[57,3],[786,3],[1095,7],[1168,4],[1269,5],[1665,3]]},"1316":{"position":[[211,3],[761,4],[977,4],[1187,4],[1552,7],[1722,3],[1913,7],[1971,3],[2370,3]]},"1317":{"position":[[554,7]]},"1318":{"position":[[661,7],[728,3],[1152,3]]},"1321":{"position":[[239,3],[522,4]]},"1323":{"position":[[13,3]]},"1324":{"position":[[45,3],[533,4],[731,3]]}},"keywords":{}}],["runaway",{"_index":1701,"title":{},"content":{"298":{"position":[[29,7]]}},"keywords":{}}],["runeach",{"_index":3754,"title":{},"content":{"653":{"position":[[898,9],[946,8]]}},"keywords":{}}],["runsnew",{"_index":4526,"title":{},"content":{"767":{"position":[[168,7]]}},"keywords":{}}],["runtim",{"_index":8,"title":{"254":{"position":[[34,8]]},"640":{"position":[[41,8]]},"783":{"position":[[24,9]]}},"content":{"1":{"position":[[90,7]]},"36":{"position":[[110,9]]},"174":{"position":[[940,7]]},"188":{"position":[[157,8],[191,7],[238,8],[1864,8]]},"207":{"position":[[260,7]]},"369":{"position":[[1441,7]]},"437":{"position":[[169,8]]},"438":{"position":[[65,8],[166,8]]},"440":{"position":[[21,7]]},"489":{"position":[[203,7]]},"556":{"position":[[196,8]]},"640":{"position":[[518,7]]},"662":{"position":[[635,7]]},"674":{"position":[[146,7]]},"707":{"position":[[13,7],[466,8]]},"729":{"position":[[252,8]]},"743":{"position":[[143,8]]},"749":{"position":[[1137,8],[21197,8]]},"783":{"position":[[419,9]]},"820":{"position":[[436,8]]},"821":{"position":[[400,8]]},"824":{"position":[[218,8]]},"904":{"position":[[555,9]]},"962":{"position":[[318,9]]},"964":{"position":[[99,8]]},"968":{"position":[[177,8]]},"1085":{"position":[[2558,8]]},"1191":{"position":[[158,7],[187,8]]},"1202":{"position":[[291,8]]},"1203":{"position":[[46,9]]},"1274":{"position":[[405,8]]},"1279":{"position":[[792,8]]},"1282":{"position":[[17,8]]}},"keywords":{}}],["runtime’",{"_index":1568,"title":{},"content":{"254":{"position":[[266,9]]}},"keywords":{}}],["rust",{"_index":2559,"title":{},"content":{"408":{"position":[[3555,5]]}},"keywords":{}}],["rxappwritereplicationst",{"_index":4910,"title":{},"content":{"862":{"position":[[1593,26]]}},"keywords":{}}],["rxattach",{"_index":4480,"title":{"922":{"position":[[0,13]]}},"content":{"754":{"position":[[16,13]]},"792":{"position":[[75,13]]},"917":{"position":[[541,13]]},"919":{"position":[[12,12]]},"922":{"position":[[53,12]]},"1004":{"position":[[182,13]]},"1081":{"position":[[100,13]]}},"keywords":{}}],["rxcachereplacementpolici",{"_index":4703,"title":{},"content":{"818":{"position":[[82,25]]}},"keywords":{}}],["rxcollect",{"_index":1276,"title":{"933":{"position":[[0,12]]},"1013":{"position":[[40,13]]}},"content":{"188":{"position":[[2742,12]]},"397":{"position":[[101,13]]},"653":{"position":[[592,12]]},"717":{"position":[[1261,12]]},"723":{"position":[[1106,13],[1402,13]]},"734":{"position":[[580,13]]},"749":{"position":[[7747,12],[8744,12],[14503,13],[14701,12],[24308,12]]},"766":{"position":[[260,12]]},"767":{"position":[[290,12]]},"768":{"position":[[249,12]]},"769":{"position":[[264,12]]},"793":{"position":[[117,12]]},"806":{"position":[[448,12]]},"818":{"position":[[120,12],[399,13]]},"826":{"position":[[72,14]]},"847":{"position":[[70,12]]},"854":{"position":[[561,13]]},"862":{"position":[[329,12]]},"866":{"position":[[241,13],[282,13]]},"875":{"position":[[295,13]]},"916":{"position":[[109,13]]},"957":{"position":[[52,13]]},"958":{"position":[[327,12],[431,12],[563,13]]},"979":{"position":[[25,12],[152,12]]},"987":{"position":[[576,12]]},"988":{"position":[[43,12]]},"1013":{"position":[[667,12]]},"1020":{"position":[[42,12],[72,12]]},"1027":{"position":[[122,12]]},"1100":{"position":[[113,12]]},"1107":{"position":[[1083,14]]},"1111":{"position":[[73,12]]},"1121":{"position":[[56,12]]},"1231":{"position":[[957,13]]}},"keywords":{}}],["rxcollection.addhook",{"_index":4237,"title":{},"content":{"749":{"position":[[7647,22]]}},"keywords":{}}],["rxcollection.cleanup",{"_index":3760,"title":{},"content":{"654":{"position":[[58,23]]}},"keywords":{}}],["rxcollection.find",{"_index":4229,"title":{},"content":{"749":{"position":[[7183,19]]}},"keywords":{}}],["rxcollection.findon",{"_index":4232,"title":{},"content":{"749":{"position":[[7307,22]]}},"keywords":{}}],["rxcollection.importjson",{"_index":4309,"title":{},"content":{"749":{"position":[[13385,26],[13514,26]]}},"keywords":{}}],["rxcollection.incrementalupsert",{"_index":4227,"title":{},"content":{"749":{"position":[[7064,32]]}},"keywords":{}}],["rxcollection.insert",{"_index":3883,"title":{},"content":{"683":{"position":[[142,21]]},"749":{"position":[[6832,21]]},"767":{"position":[[75,19]]}},"keywords":{}}],["rxcollection.orm",{"_index":4247,"title":{},"content":{"749":{"position":[[8441,17]]}},"keywords":{}}],["rxcollection.upsert",{"_index":4225,"title":{},"content":{"749":{"position":[[6956,21]]}},"keywords":{}}],["rxconflicthandler<any>",{"_index":6496,"title":{},"content":{"1309":{"position":[[521,28]]}},"keywords":{}}],["rxcouchdbreplicationst",{"_index":4831,"title":{},"content":{"846":{"position":[[1359,25]]}},"keywords":{}}],["rxcouchdbreplicationstate.awaitinitialrepl",{"_index":4328,"title":{},"content":{"749":{"position":[[14769,51],[14925,51]]}},"keywords":{}}],["rxdatabas",{"_index":843,"title":{"959":{"position":[[0,10]]},"1013":{"position":[[26,10]]},"1213":{"position":[[38,10]]}},"content":{"55":{"position":[[655,11]]},"188":{"position":[[487,10],[942,10],[2627,10]]},"366":{"position":[[491,10]]},"653":{"position":[[46,10]]},"693":{"position":[[93,10],[558,10]]},"717":{"position":[[884,10]]},"719":{"position":[[353,10]]},"734":{"position":[[397,11]]},"749":{"position":[[3384,10],[3556,10],[5585,10],[14489,10],[23989,10]]},"759":{"position":[[332,10]]},"767":{"position":[[275,10]]},"768":{"position":[[234,10]]},"769":{"position":[[249,10]]},"793":{"position":[[97,10]]},"806":{"position":[[433,10]]},"872":{"position":[[2927,10],[3663,10]]},"892":{"position":[[129,10]]},"934":{"position":[[46,10]]},"955":{"position":[[51,11]]},"958":{"position":[[370,11]]},"961":{"position":[[80,11]]},"966":{"position":[[40,10]]},"967":{"position":[[36,11]]},"970":{"position":[[83,11]]},"974":{"position":[[43,10]]},"977":{"position":[[397,10],[516,10]]},"978":{"position":[[52,11]]},"979":{"position":[[81,11]]},"1013":{"position":[[262,10],[695,11],[752,10]]},"1027":{"position":[[138,10]]},"1085":{"position":[[3675,10]]},"1088":{"position":[[403,10]]},"1097":{"position":[[189,10]]},"1114":{"position":[[43,11],[148,11]]},"1119":{"position":[[346,11]]},"1124":{"position":[[1631,10],[2159,10]]},"1125":{"position":[[782,10]]},"1138":{"position":[[130,11]]},"1154":{"position":[[680,10]]},"1163":{"position":[[468,10]]},"1164":{"position":[[600,10]]},"1165":{"position":[[275,11]]},"1174":{"position":[[786,11]]},"1182":{"position":[[472,10]]},"1188":{"position":[[305,10]]},"1189":{"position":[[191,11]]},"1213":{"position":[[357,11],[382,10],[784,10]]},"1219":{"position":[[469,10]]},"1222":{"position":[[1327,10]]},"1227":{"position":[[446,10]]},"1230":{"position":[[46,10],[315,10]]},"1231":{"position":[[179,10],[942,10]]},"1233":{"position":[[234,10]]},"1246":{"position":[[2119,10]]},"1265":{"position":[[439,11]]},"1267":{"position":[[111,11],[229,11]]},"1271":{"position":[[951,11]]},"1277":{"position":[[129,11]]}},"keywords":{}}],["rxdatabase.addcollect",{"_index":4198,"title":{},"content":{"749":{"position":[[4858,28],[4990,28],[5142,28],[5244,28],[5356,28],[6344,28]]},"752":{"position":[[89,27]]}},"keywords":{}}],["rxdatabase.migrationst",{"_index":4473,"title":{},"content":{"753":{"position":[[1,28]]}},"keywords":{}}],["rxdatabase.serv",{"_index":4414,"title":{},"content":{"749":{"position":[[22277,19]]}},"keywords":{}}],["rxdatabaseprovid",{"_index":4436,"title":{},"content":{"749":{"position":[[24011,18]]},"829":{"position":[[1031,19],[1302,18]]},"832":{"position":[[158,19]]}},"keywords":{}}],["rxdatabasestate.collection.find",{"_index":1288,"title":{},"content":{"188":{"position":[[3065,34]]}},"keywords":{}}],["rxdb",{"_index":25,"title":{"13":{"position":[[16,5]]},"44":{"position":[[46,4]]},"48":{"position":[[7,4]]},"49":{"position":[[11,5]]},"56":{"position":[[31,5]]},"57":{"position":[[9,4]]},"62":{"position":[[18,4]]},"71":{"position":[[4,4]]},"85":{"position":[[0,5]]},"102":{"position":[[4,4]]},"115":{"position":[[0,4]]},"118":{"position":[[12,4]]},"119":{"position":[[21,5]]},"120":{"position":[[8,6]]},"126":{"position":[[0,4]]},"127":{"position":[[6,4]]},"128":{"position":[[11,4]]},"130":{"position":[[41,4]]},"131":{"position":[[31,5]]},"132":{"position":[[24,4]]},"137":{"position":[[9,4]]},"142":{"position":[[25,4]]},"150":{"position":[[0,4]]},"151":{"position":[[51,5]]},"153":{"position":[[12,4]]},"154":{"position":[[21,5]]},"155":{"position":[[8,6]]},"161":{"position":[[0,4]]},"162":{"position":[[31,5]]},"163":{"position":[[24,4]]},"165":{"position":[[0,4]]},"166":{"position":[[9,4]]},"171":{"position":[[6,4]]},"174":{"position":[[4,4]]},"176":{"position":[[0,4]]},"179":{"position":[[12,4]]},"180":{"position":[[21,5]]},"181":{"position":[[8,6]]},"186":{"position":[[0,4]]},"187":{"position":[[6,4]]},"188":{"position":[[4,4]]},"189":{"position":[[31,5]]},"190":{"position":[[24,4]]},"192":{"position":[[0,4]]},"193":{"position":[[9,4]]},"199":{"position":[[0,4]]},"200":{"position":[[4,4]]},"209":{"position":[[18,4]]},"212":{"position":[[3,4]]},"213":{"position":[[0,4]]},"229":{"position":[[4,4]]},"246":{"position":[[0,4]]},"247":{"position":[[11,4]]},"256":{"position":[[21,4]]},"257":{"position":[[8,6]]},"262":{"position":[[3,4]]},"264":{"position":[[0,4]]},"267":{"position":[[14,5]]},"268":{"position":[[16,4]]},"271":{"position":[[12,4]]},"272":{"position":[[21,5]]},"273":{"position":[[8,6]]},"284":{"position":[[6,4]]},"285":{"position":[[6,5]]},"286":{"position":[[6,4]]},"287":{"position":[[31,5]]},"288":{"position":[[25,4]]},"289":{"position":[[0,4]]},"290":{"position":[[0,4]]},"291":{"position":[[0,4]]},"307":{"position":[[0,4]]},"308":{"position":[[4,4]]},"314":{"position":[[26,4]]},"317":{"position":[[0,4]]},"319":{"position":[[0,4]]},"322":{"position":[[12,4]]},"324":{"position":[[21,5]]},"325":{"position":[[8,6]]},"331":{"position":[[0,4]]},"332":{"position":[[6,4]]},"333":{"position":[[11,5]]},"336":{"position":[[31,5]]},"337":{"position":[[24,4]]},"341":{"position":[[9,4]]},"346":{"position":[[25,4]]},"348":{"position":[[36,4]]},"359":{"position":[[0,5]]},"361":{"position":[[26,5]]},"363":{"position":[[0,4]]},"368":{"position":[[16,4]]},"369":{"position":[[0,4]]},"370":{"position":[[0,4]]},"371":{"position":[[0,4]]},"374":{"position":[[33,4]]},"378":{"position":[[4,4]]},"389":{"position":[[27,4]]},"392":{"position":[[26,5]]},"397":{"position":[[30,5]]},"443":{"position":[[18,4]]},"445":{"position":[[12,5]]},"446":{"position":[[14,4]]},"472":{"position":[[0,4]]},"479":{"position":[[12,4]]},"481":{"position":[[26,5]]},"484":{"position":[[31,4]]},"488":{"position":[[33,5]]},"499":{"position":[[0,4]]},"501":{"position":[[12,4]]},"502":{"position":[[21,5]]},"503":{"position":[[6,4]]},"505":{"position":[[9,4]]},"512":{"position":[[0,4]]},"513":{"position":[[12,4]]},"514":{"position":[[8,6]]},"520":{"position":[[0,4]]},"521":{"position":[[40,5]]},"522":{"position":[[6,4]]},"523":{"position":[[6,4]]},"524":{"position":[[31,5]]},"525":{"position":[[24,4]]},"526":{"position":[[9,4]]},"532":{"position":[[48,4]]},"536":{"position":[[7,4]]},"537":{"position":[[11,5]]},"543":{"position":[[29,5]]},"544":{"position":[[9,4]]},"552":{"position":[[25,4]]},"553":{"position":[[11,4]]},"554":{"position":[[15,4]]},"558":{"position":[[72,4]]},"561":{"position":[[37,4]]},"562":{"position":[[0,4]]},"564":{"position":[[36,5]]},"566":{"position":[[39,5]]},"573":{"position":[[0,4]]},"575":{"position":[[12,4]]},"576":{"position":[[0,4]]},"577":{"position":[[21,5]]},"580":{"position":[[19,4]]},"581":{"position":[[31,5]]},"582":{"position":[[24,4]]},"583":{"position":[[9,4]]},"590":{"position":[[25,4]]},"592":{"position":[[46,4]]},"596":{"position":[[7,4]]},"597":{"position":[[11,5]]},"603":{"position":[[27,5]]},"604":{"position":[[9,4]]},"629":{"position":[[35,4]]},"631":{"position":[[0,5]]},"640":{"position":[[10,4]]},"657":{"position":[[29,4]]},"662":{"position":[[0,5]]},"677":{"position":[[0,4]]},"678":{"position":[[0,4]]},"706":{"position":[[20,4]]},"710":{"position":[[0,5]]},"711":{"position":[[30,5]]},"713":{"position":[[32,4]]},"717":{"position":[[10,4]]},"724":{"position":[[10,4]]},"725":{"position":[[8,4]]},"731":{"position":[[22,4]]},"744":{"position":[[0,4]]},"748":{"position":[[0,4]]},"749":{"position":[[4,4]]},"760":{"position":[[24,4]]},"761":{"position":[[25,4]]},"773":{"position":[[0,4]]},"775":{"position":[[42,5]]},"793":{"position":[[0,4]]},"794":{"position":[[21,4]]},"804":{"position":[[0,5]]},"823":{"position":[[0,4]]},"838":{"position":[[0,5]]},"859":{"position":[[0,4]]},"860":{"position":[[19,4]]},"862":{"position":[[15,4]]},"868":{"position":[[4,4]]},"869":{"position":[[31,4]]},"874":{"position":[[41,4]]},"877":{"position":[[0,4]]},"886":{"position":[[0,4]]},"895":{"position":[[32,4]]},"896":{"position":[[20,4]]},"898":{"position":[[11,4]]},"900":{"position":[[28,4]]},"903":{"position":[[47,4]]},"904":{"position":[[6,4]]},"1006":{"position":[[18,5]]},"1096":{"position":[[0,4]]},"1113":{"position":[[41,4]]},"1122":{"position":[[0,4]]},"1131":{"position":[[0,4]]},"1144":{"position":[[37,5]]},"1147":{"position":[[35,5]]},"1149":{"position":[[11,4]]},"1158":{"position":[[43,5]]},"1190":{"position":[[12,4]]},"1205":{"position":[[52,4]]},"1210":{"position":[[27,5]]},"1248":{"position":[[0,4]]},"1304":{"position":[[4,4]]},"1310":{"position":[[6,4]]}},"content":{"1":{"position":[[352,6]]},"2":{"position":[[6,4]]},"8":{"position":[[758,7]]},"13":{"position":[[1,4],[230,4],[336,5]]},"14":{"position":[[948,4],[1081,4],[1201,4]]},"16":{"position":[[367,5]]},"19":{"position":[[982,4]]},"24":{"position":[[514,4]]},"28":{"position":[[641,4],[791,4]]},"33":{"position":[[304,5],[528,4],[617,4]]},"34":{"position":[[393,4],[538,4],[677,4]]},"35":{"position":[[468,4]]},"37":{"position":[[301,4]]},"39":{"position":[[606,5]]},"40":{"position":[[615,5],[823,4]]},"42":{"position":[[200,4],[229,4],[331,4]]},"43":{"position":[[195,4],[241,4]]},"47":{"position":[[774,5],[974,4],[1272,4]]},"49":{"position":[[17,4],[74,4]]},"50":{"position":[[1,4],[218,4]]},"51":{"position":[[1,4]]},"53":{"position":[[18,4]]},"55":{"position":[[54,4]]},"56":{"position":[[28,4],[79,4]]},"57":{"position":[[44,4],[132,4],[184,4],[305,4],[376,4],[478,4]]},"58":{"position":[[209,4]]},"59":{"position":[[150,4],[288,4]]},"60":{"position":[[87,5]]},"61":{"position":[[30,4],[119,4],[165,4],[182,4],[254,4],[419,4]]},"71":{"position":[[1,4]]},"72":{"position":[[1,4]]},"73":{"position":[[31,5]]},"74":{"position":[[1,4]]},"75":{"position":[[1,4]]},"76":{"position":[[70,4]]},"79":{"position":[[1,4]]},"80":{"position":[[47,4]]},"83":{"position":[[16,4],[351,4]]},"84":{"position":[[23,4],[115,4],[179,4],[290,4],[405,4]]},"94":{"position":[[30,5]]},"95":{"position":[[119,5]]},"99":{"position":[[289,4]]},"102":{"position":[[1,4],[97,4]]},"103":{"position":[[1,4]]},"104":{"position":[[1,4]]},"105":{"position":[[88,5]]},"106":{"position":[[1,4]]},"107":{"position":[[1,4]]},"108":{"position":[[1,4]]},"109":{"position":[[1,4]]},"110":{"position":[[1,4]]},"111":{"position":[[28,4]]},"112":{"position":[[1,4]]},"113":{"position":[[1,4]]},"114":{"position":[[23,4],[128,4],[192,4],[303,4],[418,4],[442,4]]},"118":{"position":[[1,4],[234,4]]},"119":{"position":[[27,5]]},"120":{"position":[[1,4],[206,4]]},"121":{"position":[[16,4],[63,4],[170,5]]},"122":{"position":[[33,4],[152,4]]},"123":{"position":[[1,4],[189,4]]},"124":{"position":[[1,4]]},"125":{"position":[[1,4],[144,4]]},"126":{"position":[[76,4]]},"127":{"position":[[42,4]]},"128":{"position":[[8,4],[109,4],[179,4],[223,4]]},"129":{"position":[[234,4],[507,5],[522,4]]},"130":{"position":[[159,5],[206,4],[349,4]]},"131":{"position":[[1,4],[211,4],[390,4],[767,4],[1000,4]]},"132":{"position":[[87,4],[258,5]]},"133":{"position":[[29,4],[146,4]]},"134":{"position":[[105,4],[262,4]]},"135":{"position":[[1,4],[216,4]]},"136":{"position":[[1,4]]},"137":{"position":[[1,4]]},"138":{"position":[[31,4]]},"139":{"position":[[1,4],[168,4]]},"140":{"position":[[1,4]]},"141":{"position":[[58,4],[116,4]]},"142":{"position":[[21,4]]},"143":{"position":[[171,4]]},"144":{"position":[[1,4]]},"145":{"position":[[148,4]]},"146":{"position":[[1,4],[329,5]]},"147":{"position":[[162,4]]},"148":{"position":[[1,4],[175,4]]},"149":{"position":[[23,4],[128,4],[192,4],[303,4],[418,4]]},"151":{"position":[[37,5],[297,5],[401,4]]},"153":{"position":[[1,5],[177,4],[269,5]]},"155":{"position":[[1,4]]},"156":{"position":[[33,4]]},"157":{"position":[[1,4]]},"158":{"position":[[1,4]]},"159":{"position":[[1,4]]},"160":{"position":[[1,4]]},"161":{"position":[[143,5],[306,4]]},"162":{"position":[[1,4]]},"164":{"position":[[23,4]]},"165":{"position":[[1,4]]},"166":{"position":[[71,4],[314,4]]},"167":{"position":[[48,4],[246,4]]},"168":{"position":[[1,4]]},"169":{"position":[[47,4]]},"170":{"position":[[1,4],[252,4],[597,4]]},"173":{"position":[[1198,5],[1944,5],[2231,5]]},"174":{"position":[[1,4],[133,4],[190,4],[465,4],[983,4],[1295,4],[1561,4],[1800,4],[2093,5],[2380,4],[2609,4]]},"175":{"position":[[20,4],[121,4],[185,4],[296,4],[409,4],[446,4]]},"179":{"position":[[1,4],[264,4]]},"180":{"position":[[19,4]]},"181":{"position":[[1,4]]},"182":{"position":[[29,4],[206,5]]},"183":{"position":[[1,4]]},"184":{"position":[[77,4],[228,4]]},"185":{"position":[[1,4]]},"186":{"position":[[170,4]]},"187":{"position":[[45,5]]},"188":{"position":[[1,4],[166,4],[415,5],[586,4],[671,7],[1994,4],[2066,4],[2241,4],[2304,5],[2403,4]]},"189":{"position":[[1,4],[203,5],[392,4]]},"190":{"position":[[29,4]]},"192":{"position":[[1,4]]},"193":{"position":[[1,4]]},"194":{"position":[[100,4]]},"195":{"position":[[38,4]]},"196":{"position":[[1,4]]},"197":{"position":[[60,4]]},"198":{"position":[[1,4],[187,4],[285,4],[516,4]]},"201":{"position":[[92,4]]},"202":{"position":[[68,4]]},"203":{"position":[[88,5],[217,4]]},"204":{"position":[[150,5]]},"205":{"position":[[61,4]]},"206":{"position":[[127,5]]},"208":{"position":[[1,4]]},"210":{"position":[[45,4]]},"211":{"position":[[9,4],[27,4]]},"212":{"position":[[219,4]]},"222":{"position":[[31,5]]},"226":{"position":[[356,5]]},"229":{"position":[[1,4],[175,4]]},"230":{"position":[[1,4],[92,4]]},"231":{"position":[[1,4],[205,4]]},"232":{"position":[[80,4]]},"233":{"position":[[1,4]]},"234":{"position":[[1,4],[212,4]]},"235":{"position":[[1,4]]},"236":{"position":[[1,4]]},"237":{"position":[[1,4]]},"238":{"position":[[208,4]]},"239":{"position":[[1,4],[222,4]]},"240":{"position":[[122,4]]},"241":{"position":[[20,4],[121,4],[177,4],[284,5],[365,4]]},"247":{"position":[[148,5]]},"248":{"position":[[1,4]]},"249":{"position":[[19,4]]},"250":{"position":[[160,4]]},"251":{"position":[[55,5],[238,4]]},"252":{"position":[[110,5]]},"253":{"position":[[120,4]]},"254":{"position":[[1,4]]},"255":{"position":[[1,4],[320,4],[1783,4]]},"257":{"position":[[13,4]]},"260":{"position":[[117,4],[313,4]]},"261":{"position":[[47,4],[554,4]]},"262":{"position":[[233,5],[395,5]]},"263":{"position":[[224,4],[394,4],[464,4],[570,4]]},"265":{"position":[[36,4],[382,5],[520,4],[756,4]]},"266":{"position":[[7,4],[573,7]]},"267":{"position":[[1124,4],[1562,4]]},"271":{"position":[[1,4],[282,4]]},"273":{"position":[[14,4],[243,4]]},"274":{"position":[[37,4],[265,4]]},"277":{"position":[[1,4]]},"278":{"position":[[96,4],[213,4]]},"279":{"position":[[23,5]]},"280":{"position":[[110,4],[322,4]]},"281":{"position":[[137,4],[278,4]]},"282":{"position":[[137,5]]},"283":{"position":[[194,4]]},"284":{"position":[[140,5]]},"285":{"position":[[22,4],[74,4],[179,4],[403,4]]},"286":{"position":[[1,4],[210,4]]},"287":{"position":[[1,4],[1199,4]]},"288":{"position":[[198,4]]},"289":{"position":[[323,4],[788,4],[1099,5],[1177,4],[1673,5]]},"290":{"position":[[70,4],[171,4]]},"291":{"position":[[1,4],[138,4]]},"292":{"position":[[49,4]]},"293":{"position":[[109,4],[253,4]]},"294":{"position":[[51,4]]},"295":{"position":[[39,4],[76,4],[289,4]]},"296":{"position":[[13,4],[51,4],[75,4]]},"303":{"position":[[294,4]]},"306":{"position":[[230,4]]},"309":{"position":[[131,4],[282,4]]},"310":{"position":[[75,4],[312,4]]},"312":{"position":[[43,4],[240,4]]},"313":{"position":[[1,4]]},"314":{"position":[[215,4],[246,4],[264,4],[1012,4]]},"315":{"position":[[1115,4]]},"316":{"position":[[36,4],[422,4]]},"318":{"position":[[142,4],[378,4],[409,4],[475,4],[544,4],[555,4]]},"321":{"position":[[457,5]]},"322":{"position":[[1,4],[161,5]]},"323":{"position":[[25,4],[591,4]]},"325":{"position":[[1,4]]},"327":{"position":[[233,4]]},"328":{"position":[[1,4]]},"329":{"position":[[28,4],[105,4]]},"330":{"position":[[43,4]]},"331":{"position":[[221,4]]},"333":{"position":[[9,4],[55,4],[177,4],[236,4]]},"334":{"position":[[48,4],[198,7]]},"335":{"position":[[20,4]]},"336":{"position":[[1,4]]},"338":{"position":[[168,4]]},"339":{"position":[[51,4]]},"340":{"position":[[6,5]]},"343":{"position":[[1,4]]},"346":{"position":[[52,4],[291,4]]},"347":{"position":[[23,4],[128,4],[192,4],[303,4],[416,4],[485,4]]},"350":{"position":[[183,4]]},"357":{"position":[[632,4]]},"359":{"position":[[53,4]]},"360":{"position":[[21,4],[254,4],[685,4]]},"362":{"position":[[737,4],[958,4],[1103,4],[1199,4],[1263,4],[1374,4],[1487,4],[1556,4]]},"365":{"position":[[422,5],[827,5],[1533,4]]},"366":{"position":[[392,4]]},"367":{"position":[[292,4],[442,4],[557,4],[674,4]]},"368":{"position":[[1,4],[100,4],[259,5]]},"369":{"position":[[63,4],[130,4],[588,4],[1327,4]]},"370":{"position":[[78,4]]},"371":{"position":[[54,4]]},"372":{"position":[[95,4]]},"373":{"position":[[20,4],[121,4],[177,4],[284,5],[366,4]]},"378":{"position":[[1,4],[186,4]]},"379":{"position":[[16,4]]},"380":{"position":[[124,4]]},"381":{"position":[[23,4],[361,4],[495,4]]},"382":{"position":[[46,4]]},"383":{"position":[[501,4]]},"384":{"position":[[1,4]]},"385":{"position":[[81,4],[202,4]]},"386":{"position":[[1,4]]},"387":{"position":[[17,4],[413,4]]},"388":{"position":[[111,4],[134,4],[244,4],[483,4]]},"390":{"position":[[1792,4]]},"392":{"position":[[54,4],[240,7],[1186,5],[2362,4]]},"393":{"position":[[307,4],[909,5]]},"397":{"position":[[63,4]]},"400":{"position":[[321,4]]},"402":{"position":[[2648,4],[2662,4]]},"403":{"position":[[184,4],[300,4]]},"405":{"position":[[110,4],[124,4],[153,4]]},"408":{"position":[[4663,5]]},"411":{"position":[[3392,4]]},"412":{"position":[[1842,4],[4427,5]]},"420":{"position":[[152,4],[955,4],[1025,4]]},"422":{"position":[[111,5],[450,5]]},"429":{"position":[[479,4]]},"432":{"position":[[1047,4]]},"440":{"position":[[481,5]]},"441":{"position":[[466,5]]},"442":{"position":[[40,4],[52,4]]},"445":{"position":[[3,5],[223,4],[369,4],[457,4],[822,4],[1253,4],[1695,4],[1930,4],[1977,4],[2156,4],[2418,5]]},"446":{"position":[[29,4],[187,4],[316,4],[588,5],[1013,4],[1263,4]]},"447":{"position":[[97,5],[373,4],[551,4],[658,4]]},"453":{"position":[[810,4]]},"456":{"position":[[136,4]]},"458":{"position":[[1319,5]]},"460":{"position":[[331,4]]},"469":{"position":[[493,4],[604,4],[909,4],[1331,4]]},"471":{"position":[[95,4],[109,4],[138,4]]},"479":{"position":[[1,4],[296,4],[491,4]]},"480":{"position":[[43,4]]},"481":{"position":[[1,4],[447,4]]},"482":{"position":[[57,4]]},"483":{"position":[[199,5],[356,4],[570,4],[940,4],[1186,5]]},"488":{"position":[[64,5]]},"489":{"position":[[57,5],[223,4],[463,4]]},"490":{"position":[[203,4],[348,4],[490,4],[590,4]]},"491":{"position":[[115,4],[269,4],[481,4],[850,4],[1922,5]]},"494":{"position":[[98,4],[550,4]]},"495":{"position":[[217,4]]},"496":{"position":[[650,5]]},"498":{"position":[[53,5],[93,4],[131,5],[257,4],[410,4],[431,4]]},"501":{"position":[[58,4],[125,4],[306,4]]},"502":{"position":[[1,4],[517,4],[1148,4]]},"503":{"position":[[13,4],[126,4]]},"504":{"position":[[1,4],[554,4],[668,4],[713,4],[741,4],[924,4],[1087,4],[1300,4]]},"506":{"position":[[1,4]]},"507":{"position":[[54,4]]},"508":{"position":[[1,4]]},"509":{"position":[[1,4]]},"510":{"position":[[124,4],[339,4],[482,4],[636,5]]},"511":{"position":[[23,4],[128,4],[192,4],[303,4],[418,4]]},"513":{"position":[[1,5],[166,4]]},"514":{"position":[[1,5]]},"515":{"position":[[205,5]]},"516":{"position":[[1,4],[139,4],[289,4]]},"517":{"position":[[125,4]]},"518":{"position":[[1,4]]},"519":{"position":[[69,4]]},"520":{"position":[[60,4],[254,4],[420,4]]},"521":{"position":[[359,5],[582,4]]},"522":{"position":[[28,4],[98,4],[131,4],[156,4],[311,7]]},"523":{"position":[[5,4]]},"524":{"position":[[1,4],[314,4]]},"525":{"position":[[122,4],[392,4]]},"526":{"position":[[83,4]]},"527":{"position":[[76,4]]},"528":{"position":[[1,4]]},"529":{"position":[[1,4]]},"530":{"position":[[140,4],[288,5],[439,4],[608,4]]},"531":{"position":[[23,4],[128,4],[192,4],[303,4],[418,4]]},"535":{"position":[[506,4],[774,4],[945,4],[1243,4]]},"536":{"position":[[12,4]]},"537":{"position":[[16,4],[53,4]]},"538":{"position":[[1,4],[191,4]]},"540":{"position":[[1,4],[149,5]]},"541":{"position":[[1,4]]},"542":{"position":[[1,4],[250,4],[696,4]]},"543":{"position":[[34,4],[86,4],[217,4]]},"544":{"position":[[1,4],[76,4],[163,4]]},"546":{"position":[[183,4],[222,4],[337,4]]},"547":{"position":[[87,5]]},"548":{"position":[[18,4],[32,4],[88,4],[168,4],[423,4]]},"551":{"position":[[173,4]]},"553":{"position":[[9,4],[91,4]]},"554":{"position":[[1,4],[272,4],[508,7],[655,5]]},"556":{"position":[[645,4]]},"557":{"position":[[18,4],[32,4],[100,4],[152,4],[219,4],[304,4]]},"562":{"position":[[34,7]]},"563":{"position":[[1,4],[138,4]]},"564":{"position":[[143,4],[219,7]]},"565":{"position":[[62,4]]},"567":{"position":[[173,4],[338,4],[403,4],[438,4],[611,4]]},"570":{"position":[[910,4],[923,4]]},"571":{"position":[[687,4],[1285,4],[1718,4]]},"572":{"position":[[15,4],[54,4],[104,4]]},"574":{"position":[[813,4]]},"575":{"position":[[1,4]]},"576":{"position":[[76,4],[323,4]]},"577":{"position":[[43,4]]},"578":{"position":[[17,4],[84,4]]},"579":{"position":[[44,4],[200,7],[815,4]]},"580":{"position":[[1,4],[479,4]]},"581":{"position":[[1,4]]},"582":{"position":[[1,4],[155,4],[551,4]]},"585":{"position":[[31,4]]},"586":{"position":[[50,4]]},"589":{"position":[[59,4]]},"590":{"position":[[54,4],[137,4]]},"591":{"position":[[23,4],[128,4],[192,4],[303,4],[416,4],[476,4],[640,4]]},"595":{"position":[[526,4],[861,4],[1020,4],[1296,4]]},"596":{"position":[[12,4]]},"597":{"position":[[16,4],[55,4]]},"598":{"position":[[1,4],[192,4],[300,7]]},"600":{"position":[[1,4]]},"602":{"position":[[61,4]]},"603":{"position":[[34,4],[84,4],[215,4]]},"604":{"position":[[1,4],[76,4]]},"606":{"position":[[183,4],[222,4],[327,4]]},"607":{"position":[[88,5]]},"608":{"position":[[18,4],[32,4],[88,4],[168,4],[421,4]]},"616":{"position":[[956,4]]},"617":{"position":[[2178,4],[2368,5]]},"619":{"position":[[22,4]]},"626":{"position":[[606,4]]},"628":{"position":[[148,4],[197,4],[211,4],[240,4]]},"631":{"position":[[1,4]]},"632":{"position":[[1224,4]]},"634":{"position":[[41,5]]},"635":{"position":[[110,4],[210,4]]},"636":{"position":[[79,4],[307,4]]},"638":{"position":[[137,4]]},"641":{"position":[[94,4]]},"644":{"position":[[15,4],[284,4],[434,4]]},"646":{"position":[[29,7]]},"652":{"position":[[29,7]]},"653":{"position":[[150,7],[1007,4],[1363,4]]},"662":{"position":[[3,4],[368,4],[1267,4],[1277,4],[1608,4],[1872,4],[1893,4],[1903,4],[2054,4],[2064,4]]},"663":{"position":[[58,4]]},"666":{"position":[[219,4]]},"676":{"position":[[166,5],[324,5]]},"678":{"position":[[4,5],[130,4],[172,4]]},"680":{"position":[[19,5],[439,4],[472,7],[563,7]]},"685":{"position":[[133,4],[555,4]]},"686":{"position":[[86,5],[698,4],[783,4]]},"688":{"position":[[123,5],[403,4]]},"690":{"position":[[500,5]]},"693":{"position":[[8,4],[140,4],[274,4]]},"701":{"position":[[1173,5]]},"703":{"position":[[242,5],[262,4]]},"705":{"position":[[20,4],[143,4]]},"710":{"position":[[3,4],[102,4],[448,5],[914,4],[996,5],[1088,4],[1261,5],[1461,4],[1573,7],[2472,4]]},"712":{"position":[[18,4],[90,4]]},"714":{"position":[[1,4],[210,4],[672,4]]},"715":{"position":[[1,4]]},"716":{"position":[[480,4]]},"717":{"position":[[1,4],[441,4]]},"718":{"position":[[163,5],[247,5]]},"723":{"position":[[460,4],[2444,4]]},"724":{"position":[[28,4],[98,4],[165,5],[209,5],[469,5]]},"726":{"position":[[34,4],[106,4]]},"728":{"position":[[1,4]]},"729":{"position":[[14,4],[176,4]]},"731":{"position":[[45,5]]},"732":{"position":[[11,5],[97,4],[153,7]]},"737":{"position":[[509,4]]},"738":{"position":[[105,7]]},"745":{"position":[[233,5],[302,5]]},"749":{"position":[[1335,4],[7376,5],[9252,5],[12602,4],[20966,5],[21071,4],[21871,4],[23655,4],[23722,5]]},"754":{"position":[[221,7]]},"755":{"position":[[12,4]]},"756":{"position":[[259,4]]},"759":{"position":[[190,5],[273,5]]},"760":{"position":[[28,4],[78,4],[369,5],[439,4]]},"761":{"position":[[1,4],[91,4],[248,4],[407,4],[425,4],[488,5],[549,4],[614,5],[736,5]]},"763":{"position":[[1,4]]},"772":{"position":[[99,4],[301,4],[506,4],[585,4],[667,7],[1454,7],[1518,5],[2162,7]]},"773":{"position":[[31,4],[350,4],[469,7]]},"774":{"position":[[472,7],[599,5]]},"775":{"position":[[195,4]]},"776":{"position":[[15,4],[92,4],[370,4]]},"779":{"position":[[363,5]]},"781":{"position":[[736,4]]},"786":{"position":[[40,4],[52,4]]},"793":{"position":[[0,4],[898,4]]},"796":{"position":[[27,4]]},"798":{"position":[[953,4]]},"799":{"position":[[214,4],[360,4]]},"800":{"position":[[27,5],[377,4],[666,4]]},"801":{"position":[[109,4],[880,4]]},"802":{"position":[[38,4]]},"804":{"position":[[5,4],[50,4]]},"806":{"position":[[243,4]]},"815":{"position":[[12,4]]},"820":{"position":[[31,5],[109,5]]},"824":{"position":[[39,5],[442,4]]},"825":{"position":[[964,4],[1103,5],[1129,4]]},"826":{"position":[[24,4],[333,4]]},"828":{"position":[[1,4],[175,4],[271,4]]},"829":{"position":[[25,4],[62,4],[167,4],[505,7],[913,4],[3083,4],[3860,4]]},"831":{"position":[[52,4],[285,4]]},"832":{"position":[[1,4]]},"834":{"position":[[106,4]]},"838":{"position":[[3,4],[408,4],[754,4],[845,4],[1187,4],[1572,4],[1798,4],[1808,4],[1925,4],[1975,7],[2033,4],[2043,4],[2395,4],[3196,4],[3276,4],[3395,4]]},"841":{"position":[[44,4]]},"842":{"position":[[27,4],[79,4],[192,4]]},"846":{"position":[[812,5]]},"855":{"position":[[1,4]]},"856":{"position":[[165,4],[178,4]]},"857":{"position":[[22,4],[490,4]]},"860":{"position":[[156,4],[338,4],[481,4],[747,4],[984,4]]},"861":{"position":[[1362,4],[1462,4],[1533,4],[1642,4],[1758,5],[2185,5]]},"862":{"position":[[91,4],[149,6],[177,4],[212,5],[1477,4]]},"863":{"position":[[883,4],[971,4]]},"865":{"position":[[234,4]]},"866":{"position":[[147,4]]},"867":{"position":[[1,4]]},"868":{"position":[[4,4]]},"870":{"position":[[41,4],[194,4]]},"871":{"position":[[319,4],[621,4]]},"872":{"position":[[76,4],[135,4],[140,4],[1350,4],[1397,4],[1586,7],[1682,4],[2219,4],[3131,5],[3200,5],[3808,7],[3912,5]]},"873":{"position":[[21,4],[103,4]]},"875":{"position":[[32,4],[45,4],[1382,4],[1512,5],[1914,4],[6746,4]]},"876":{"position":[[81,4]]},"878":{"position":[[52,4],[212,5]]},"884":{"position":[[74,4]]},"885":{"position":[[321,4]]},"886":{"position":[[273,4],[1303,4],[1584,4]]},"887":{"position":[[63,4]]},"888":{"position":[[118,5],[359,7]]},"889":{"position":[[811,4]]},"890":{"position":[[1004,4]]},"892":{"position":[[34,7]]},"896":{"position":[[156,4],[296,4]]},"898":{"position":[[37,4],[675,4],[1549,4],[1597,4],[3153,4],[4279,4]]},"903":{"position":[[481,4],[576,4]]},"904":{"position":[[201,4],[500,4],[1775,5],[2228,4],[2663,4]]},"906":{"position":[[38,4],[183,4]]},"908":{"position":[[387,4]]},"911":{"position":[[358,4],[498,5]]},"912":{"position":[[63,4],[216,4]]},"913":{"position":[[15,4],[63,4],[180,4],[244,4]]},"915":{"position":[[97,7]]},"917":{"position":[[108,7]]},"922":{"position":[[20,4]]},"927":{"position":[[83,5]]},"932":{"position":[[809,5]]},"936":{"position":[[72,4],[143,4]]},"952":{"position":[[200,7]]},"958":{"position":[[543,5],[779,5]]},"960":{"position":[[86,4]]},"962":{"position":[[1,4]]},"965":{"position":[[208,4],[401,4]]},"966":{"position":[[183,4]]},"968":{"position":[[13,4]]},"971":{"position":[[312,7]]},"977":{"position":[[572,7]]},"978":{"position":[[116,7]]},"981":{"position":[[72,4],[342,5],[483,4],[609,5],[1517,4]]},"985":{"position":[[302,4]]},"986":{"position":[[1230,4]]},"988":{"position":[[209,7],[361,4],[1150,4],[1856,4],[3984,4],[4577,5]]},"989":{"position":[[72,4],[385,4]]},"990":{"position":[[61,4]]},"995":{"position":[[549,4]]},"1002":{"position":[[916,4]]},"1004":{"position":[[44,4]]},"1005":{"position":[[143,4]]},"1007":{"position":[[27,4],[181,4],[655,4]]},"1012":{"position":[[105,7]]},"1041":{"position":[[178,7]]},"1044":{"position":[[108,4]]},"1064":{"position":[[135,7]]},"1065":{"position":[[465,4],[1529,4],[1663,4],[1820,4]]},"1068":{"position":[[253,4]]},"1069":{"position":[[9,4]]},"1071":{"position":[[34,4]]},"1072":{"position":[[56,4],[72,4],[130,4],[420,4],[621,4],[659,4],[765,4],[946,4],[1019,4],[1181,4],[1224,4],[1622,4],[1660,4],[2028,4]]},"1078":{"position":[[938,4]]},"1079":{"position":[[1,4],[331,4],[489,4]]},"1080":{"position":[[1041,4]]},"1084":{"position":[[439,4]]},"1085":{"position":[[30,4],[323,5],[730,4],[912,4],[1619,4],[1687,4],[1924,4],[2391,4],[3174,4]]},"1088":{"position":[[100,4],[147,4]]},"1090":{"position":[[620,5],[709,5]]},"1091":{"position":[[14,4]]},"1092":{"position":[[50,4]]},"1093":{"position":[[197,4]]},"1094":{"position":[[211,4]]},"1095":{"position":[[34,4],[296,4]]},"1097":{"position":[[48,4],[85,4],[362,5],[458,4],[643,5]]},"1098":{"position":[[17,4],[202,5],[271,5]]},"1099":{"position":[[17,4],[184,5],[249,5]]},"1101":{"position":[[102,4]]},"1102":{"position":[[89,4],[882,5]]},"1107":{"position":[[8,4],[157,4]]},"1112":{"position":[[230,4]]},"1114":{"position":[[229,4],[478,7],[599,4]]},"1119":{"position":[[387,7]]},"1120":{"position":[[394,4]]},"1121":{"position":[[92,4]]},"1123":{"position":[[666,4]]},"1124":{"position":[[7,4],[130,4],[604,4],[989,4],[1212,4],[1330,4],[1506,4],[1896,4],[2098,4],[2180,4]]},"1125":{"position":[[34,5],[186,7],[903,5]]},"1129":{"position":[[19,4]]},"1130":{"position":[[34,7],[85,5]]},"1132":{"position":[[7,4],[118,4],[329,4],[1065,4],[1346,4]]},"1134":{"position":[[34,7]]},"1135":{"position":[[202,4]]},"1138":{"position":[[53,4],[176,7],[222,5]]},"1139":{"position":[[274,7],[320,5]]},"1140":{"position":[[343,4],[490,7],[536,5]]},"1141":{"position":[[19,4]]},"1147":{"position":[[74,5]]},"1148":{"position":[[497,4],[1092,4]]},"1149":{"position":[[529,4],[623,4],[862,4]]},"1150":{"position":[[173,4],[340,5],[492,4]]},"1151":{"position":[[388,4],[503,4],[901,5]]},"1154":{"position":[[101,4],[252,5],[350,5]]},"1158":{"position":[[626,5]]},"1159":{"position":[[138,5]]},"1162":{"position":[[893,4],[940,4],[997,4],[1046,4]]},"1163":{"position":[[40,5],[123,5]]},"1164":{"position":[[110,7]]},"1168":{"position":[[50,7]]},"1172":{"position":[[34,7],[493,4]]},"1174":{"position":[[322,4]]},"1175":{"position":[[248,4],[475,4]]},"1177":{"position":[[145,5],[216,4]]},"1178":{"position":[[387,4],[502,4],[898,5]]},"1181":{"position":[[845,4],[892,4]]},"1182":{"position":[[40,5],[123,5]]},"1184":{"position":[[10,4],[406,5],[489,5],[588,5]]},"1188":{"position":[[135,4],[189,4],[226,4],[277,4]]},"1189":{"position":[[301,7]]},"1191":{"position":[[112,4],[504,4]]},"1192":{"position":[[72,4]]},"1193":{"position":[[129,4],[285,4]]},"1198":{"position":[[27,4],[152,4],[887,4],[1163,4],[1266,4],[1648,4],[1736,4],[1871,4],[2152,4],[2331,4]]},"1201":{"position":[[34,7]]},"1202":{"position":[[14,4]]},"1204":{"position":[[146,5],[217,4]]},"1208":{"position":[[1202,7]]},"1209":{"position":[[389,4]]},"1210":{"position":[[171,4],[235,4],[316,7],[359,5]]},"1211":{"position":[[254,4],[565,7],[616,5]]},"1212":{"position":[[328,5],[403,5]]},"1213":{"position":[[625,5]]},"1214":{"position":[[444,4],[854,4]]},"1222":{"position":[[38,5]]},"1225":{"position":[[166,5],[243,5]]},"1226":{"position":[[34,7],[83,5]]},"1227":{"position":[[135,4],[299,4],[584,7],[633,5]]},"1231":{"position":[[479,5],[556,5],[644,7]]},"1233":{"position":[[121,4]]},"1236":{"position":[[24,4]]},"1237":{"position":[[772,5]]},"1238":{"position":[[480,5],[556,5],[633,5],[729,5]]},"1239":{"position":[[530,5],[631,5],[720,5]]},"1242":{"position":[[162,5]]},"1244":{"position":[[131,4]]},"1245":{"position":[[57,4]]},"1246":{"position":[[1889,4],[2034,4],[2166,4]]},"1247":{"position":[[59,4],[259,4],[444,4],[614,4]]},"1249":{"position":[[283,4]]},"1250":{"position":[[359,4]]},"1253":{"position":[[29,4]]},"1258":{"position":[[133,4]]},"1263":{"position":[[52,5],[129,5]]},"1264":{"position":[[34,7],[77,5]]},"1265":{"position":[[128,4],[292,4],[578,7],[621,5]]},"1268":{"position":[[607,5],[684,5]]},"1271":{"position":[[60,5],[119,4],[187,4],[298,4],[549,4],[780,4],[1066,4]]},"1272":{"position":[[146,4],[219,4]]},"1274":{"position":[[34,7],[98,5]]},"1275":{"position":[[152,7],[222,5]]},"1276":{"position":[[424,7],[488,5]]},"1277":{"position":[[175,7],[246,5],[488,4],[775,5]]},"1278":{"position":[[278,7],[353,5],[730,7],[800,5]]},"1279":{"position":[[343,7],[412,5]]},"1280":{"position":[[274,7]]},"1281":{"position":[[145,5]]},"1284":{"position":[[20,4],[59,4],[129,4],[284,4]]},"1292":{"position":[[5,4],[529,4]]},"1294":{"position":[[2112,4]]},"1295":{"position":[[1538,4]]},"1296":{"position":[[1852,4]]},"1300":{"position":[[568,4]]},"1304":{"position":[[1035,4],[1233,4],[1628,5],[1939,4]]},"1305":{"position":[[357,4],[385,4],[730,4]]},"1306":{"position":[[37,5]]},"1307":{"position":[[447,4]]},"1308":{"position":[[234,4]]},"1309":{"position":[[259,5],[393,4]]},"1313":{"position":[[1020,4]]},"1318":{"position":[[803,4]]},"1324":{"position":[[903,4]]}},"keywords":{}}],["rxdb""wher",{"_index":1537,"title":{},"content":{"245":{"position":[[124,21]]}},"keywords":{}}],["rxdb""whi",{"_index":1534,"title":{},"content":{"245":{"position":[[37,19]]}},"keywords":{}}],["rxdb'",{"_index":622,"title":{"208":{"position":[[4,6]]},"255":{"position":[[9,6]]},"980":{"position":[[0,6]]}},"content":{"39":{"position":[[297,6]]},"51":{"position":[[1038,6]]},"61":{"position":[[317,6]]},"77":{"position":[[1,6]]},"78":{"position":[[1,6]]},"82":{"position":[[1,6]]},"114":{"position":[[614,6]]},"124":{"position":[[196,6]]},"126":{"position":[[230,6]]},"129":{"position":[[92,6]]},"148":{"position":[[420,6]]},"164":{"position":[[286,6]]},"174":{"position":[[740,6],[2179,6],[2935,6],[3220,6]]},"175":{"position":[[608,6]]},"181":{"position":[[223,6]]},"186":{"position":[[212,6]]},"191":{"position":[[1,6]]},"201":{"position":[[348,6]]},"205":{"position":[[300,6]]},"207":{"position":[[8,6],[220,6]]},"212":{"position":[[78,6]]},"238":{"position":[[1,6]]},"241":{"position":[[580,6]]},"248":{"position":[[217,6]]},"252":{"position":[[293,6]]},"262":{"position":[[79,6]]},"267":{"position":[[1,6],[153,6],[507,6],[873,6]]},"275":{"position":[[8,6],[200,6]]},"276":{"position":[[1,6]]},"283":{"position":[[1,6],[396,6]]},"284":{"position":[[1,6]]},"286":{"position":[[405,6]]},"289":{"position":[[17,6],[469,6],[699,6],[1397,6]]},"311":{"position":[[83,6]]},"326":{"position":[[1,6]]},"327":{"position":[[8,6]]},"328":{"position":[[193,6]]},"338":{"position":[[1,6]]},"346":{"position":[[243,6]]},"366":{"position":[[64,6]]},"369":{"position":[[405,6],[889,6],[1098,6]]},"370":{"position":[[42,6],[212,6]]},"371":{"position":[[165,6]]},"373":{"position":[[597,6]]},"380":{"position":[[1,6]]},"382":{"position":[[261,6]]},"383":{"position":[[8,6]]},"433":{"position":[[452,6]]},"446":{"position":[[790,6]]},"487":{"position":[[336,6]]},"490":{"position":[[1,6]]},"491":{"position":[[1249,6]]},"493":{"position":[[44,6]]},"495":{"position":[[660,6]]},"496":{"position":[[666,6]]},"498":{"position":[[469,6]]},"502":{"position":[[261,6],[685,6]]},"514":{"position":[[261,6]]},"515":{"position":[[8,6]]},"523":{"position":[[124,6]]},"525":{"position":[[58,6]]},"556":{"position":[[1394,6],[1730,6]]},"557":{"position":[[379,6]]},"580":{"position":[[190,6]]},"582":{"position":[[283,6]]},"584":{"position":[[64,6]]},"632":{"position":[[1,6],[621,6]]},"634":{"position":[[482,6]]},"639":{"position":[[86,6]]},"640":{"position":[[1,6]]},"688":{"position":[[171,6]]},"698":{"position":[[1719,6]]},"723":{"position":[[1043,6]]},"805":{"position":[[57,6]]},"806":{"position":[[9,6]]},"831":{"position":[[118,6],[467,6]]},"908":{"position":[[1,6]]},"1132":{"position":[[890,6]]},"1147":{"position":[[521,6]]},"1149":{"position":[[92,6],[574,6]]},"1284":{"position":[[422,6]]}},"keywords":{}}],["rxdb)you",{"_index":5194,"title":{},"content":{"898":{"position":[[244,8]]}},"keywords":{}}],["rxdb+foundationdb",{"_index":6025,"title":{"1132":{"position":[[12,18]]}},"content":{},"keywords":{}}],["rxdb+node.j",{"_index":2132,"title":{"776":{"position":[[13,13]]}},"content":{"370":{"position":[[333,13]]}},"keywords":{}}],["rxdb+react",{"_index":2133,"title":{},"content":{"371":{"position":[[338,10]]}},"keywords":{}}],["rxdb.check",{"_index":4588,"title":{},"content":{"776":{"position":[[244,10]]}},"keywords":{}}],["rxdb.client",{"_index":5251,"title":{},"content":{"903":{"position":[[397,12]]}},"keywords":{}}],["rxdb.limit",{"_index":3301,"title":{},"content":{"535":{"position":[[1161,12]]},"595":{"position":[[1238,12]]}},"keywords":{}}],["rxdb/plugins/attach",{"_index":5285,"title":{},"content":{"915":{"position":[[143,27]]},"932":{"position":[[731,25]]}},"keywords":{}}],["rxdb/plugins/backup",{"_index":3728,"title":{},"content":{"646":{"position":[[70,22]]}},"keywords":{}}],["rxdb/plugins/cleanup",{"_index":3744,"title":{},"content":{"652":{"position":[[71,23]]},"1119":{"position":[[429,23]]}},"keywords":{}}],["rxdb/plugins/cor",{"_index":764,"title":{},"content":{"51":{"position":[[212,20]]},"55":{"position":[[213,20],[701,20]]},"209":{"position":[[34,20]]},"211":{"position":[[96,20]]},"255":{"position":[[381,20]]},"258":{"position":[[34,20]]},"314":{"position":[[333,20]]},"315":{"position":[[362,20]]},"394":{"position":[[567,20]]},"480":{"position":[[191,20]]},"482":{"position":[[192,20]]},"538":{"position":[[292,20]]},"542":{"position":[[412,20]]},"556":{"position":[[771,20]]},"563":{"position":[[231,20]]},"632":{"position":[[1072,20]]},"662":{"position":[[1658,20]]},"717":{"position":[[1085,20]]},"724":{"position":[[272,20]]},"734":{"position":[[442,20]]},"862":{"position":[[349,20]]},"875":{"position":[[2049,20],[4295,20]]},"898":{"position":[[2198,20]]},"904":{"position":[[598,20]]},"960":{"position":[[166,20]]},"1118":{"position":[[394,20]]},"1144":{"position":[[62,20]]},"1145":{"position":[[266,20]]},"1148":{"position":[[552,20]]},"1149":{"position":[[829,20]]},"1158":{"position":[[56,20]]},"1159":{"position":[[242,20]]}},"keywords":{}}],["rxdb/plugins/crdt",{"_index":3874,"title":{},"content":{"680":{"position":[[392,20]]}},"keywords":{}}],["rxdb/plugins/dev",{"_index":3861,"title":{},"content":{"675":{"position":[[251,17]]}},"keywords":{}}],["rxdb/plugins/encrypt",{"_index":1895,"title":{},"content":{"315":{"position":[[214,24]]},"482":{"position":[[343,24]]},"554":{"position":[[568,24]]},"564":{"position":[[279,24]]},"638":{"position":[[273,24]]},"717":{"position":[[601,24]]},"1237":{"position":[[697,24]]}},"keywords":{}}],["rxdb/plugins/flutt",{"_index":1250,"title":{},"content":{"188":{"position":[[814,23]]}},"keywords":{}}],["rxdb/plugins/json",{"_index":5369,"title":{},"content":{"952":{"position":[[243,18]]},"971":{"position":[[355,18]]}},"keywords":{}}],["rxdb/plugins/key",{"_index":4082,"title":{},"content":{"734":{"position":[[170,17]]},"1237":{"position":[[613,17]]}},"keywords":{}}],["rxdb/plugins/lead",{"_index":4091,"title":{},"content":{"738":{"position":[[154,20]]},"740":{"position":[[467,20]]}},"keywords":{}}],["rxdb/plugins/loc",{"_index":5595,"title":{},"content":{"1012":{"position":[[154,19]]}},"keywords":{}}],["rxdb/plugins/migr",{"_index":4487,"title":{},"content":{"759":{"position":[[118,23]]},"760":{"position":[[294,23]]}},"keywords":{}}],["rxdb/plugins/pouchdb",{"_index":27,"title":{},"content":{"1":{"position":[[393,23]]},"8":{"position":[[816,23]]},"1201":{"position":[[92,23]]},"1204":{"position":[[269,23]]}},"keywords":{}}],["rxdb/plugins/queri",{"_index":5760,"title":{},"content":{"1064":{"position":[[182,19]]}},"keywords":{}}],["rxdb/plugins/react",{"_index":3323,"title":{},"content":{"542":{"position":[[337,24]]},"563":{"position":[[379,24]]},"825":{"position":[[133,24]]},"829":{"position":[[1328,21],[1925,21],[2344,21],[3260,21]]}},"keywords":{}}],["rxdb/plugins/repl",{"_index":1343,"title":{},"content":{"209":{"position":[[171,27]]},"210":{"position":[[210,25]]},"255":{"position":[[518,27]]},"261":{"position":[[278,25]]},"481":{"position":[[614,27]]},"632":{"position":[[2146,27]]},"846":{"position":[[81,25]]},"848":{"position":[[1233,25]]},"862":{"position":[[252,25]]},"866":{"position":[[374,25]]},"872":{"position":[[2313,25]]},"875":{"position":[[365,27]]},"886":{"position":[[949,25]]},"892":{"position":[[79,25]]},"893":{"position":[[134,25]]},"898":{"position":[[3265,25]]},"904":{"position":[[1369,25]]},"906":{"position":[[933,25]]},"988":{"position":[[153,27]]},"1090":{"position":[[549,27]]},"1121":{"position":[[393,25]]},"1149":{"position":[[696,25]]},"1231":{"position":[[697,25]]}},"keywords":{}}],["rxdb/plugins/st",{"_index":5981,"title":{},"content":{"1114":{"position":[[636,21]]}},"keywords":{}}],["rxdb/plugins/storag",{"_index":777,"title":{},"content":{"51":{"position":[[591,21]]},"55":{"position":[[763,21]]},"188":{"position":[[712,21]]},"209":{"position":[[96,21]]},"211":{"position":[[158,21]]},"255":{"position":[[443,21]]},"258":{"position":[[96,21]]},"266":{"position":[[616,21]]},"314":{"position":[[395,21]]},"315":{"position":[[292,21]]},"334":{"position":[[247,21]]},"392":{"position":[[289,21]]},"480":{"position":[[253,21]]},"482":{"position":[[254,21]]},"522":{"position":[[360,21]]},"538":{"position":[[354,21]]},"542":{"position":[[474,21]]},"554":{"position":[[774,21]]},"562":{"position":[[83,21]]},"563":{"position":[[293,21]]},"564":{"position":[[357,21]]},"579":{"position":[[249,21]]},"598":{"position":[[349,21]]},"632":{"position":[[1134,21]]},"653":{"position":[[199,21]]},"662":{"position":[[1985,21]]},"680":{"position":[[612,21]]},"710":{"position":[[1622,21]]},"717":{"position":[[679,21]]},"734":{"position":[[243,21]]},"739":{"position":[[230,21]]},"772":{"position":[[716,21],[2288,21]]},"773":{"position":[[512,21]]},"774":{"position":[[521,21]]},"829":{"position":[[554,21]]},"838":{"position":[[2125,21]]},"862":{"position":[[411,21]]},"872":{"position":[[1629,21],[3850,21]]},"898":{"position":[[2260,21]]},"904":{"position":[[660,21]]},"960":{"position":[[228,21]]},"962":{"position":[[699,21],[915,21]]},"1090":{"position":[[480,21]]},"1114":{"position":[[527,21]]},"1125":{"position":[[229,21]]},"1134":{"position":[[83,21]]},"1144":{"position":[[117,21]]},"1145":{"position":[[321,21]]},"1148":{"position":[[607,21]]},"1149":{"position":[[766,21]]},"1158":{"position":[[118,21]]},"1159":{"position":[[325,21]]},"1168":{"position":[[93,21]]},"1172":{"position":[[75,21]]},"1189":{"position":[[345,21]]},"1218":{"position":[[320,21],[657,21],[732,21]]},"1219":{"position":[[298,21],[381,21],[821,21]]},"1222":{"position":[[120,21]]},"1226":{"position":[[160,21]]},"1271":{"position":[[1184,21]]},"1280":{"position":[[339,21]]},"1286":{"position":[[303,21]]},"1287":{"position":[[349,21]]},"1288":{"position":[[309,21]]}},"keywords":{}}],["rxdb/plugins/upd",{"_index":5685,"title":{},"content":{"1041":{"position":[[219,22]]},"1059":{"position":[[158,22]]}},"keywords":{}}],["rxdb/plugins/util",{"_index":2688,"title":{},"content":{"412":{"position":[[4459,21]]},"1309":{"position":[[462,21]]}},"keywords":{}}],["rxdb/plugins/valid",{"_index":6284,"title":{},"content":{"1237":{"position":[[539,22]]},"1286":{"position":[[233,22]]},"1287":{"position":[[274,22]]},"1288":{"position":[[226,22]]},"1290":{"position":[[24,22]]},"1291":{"position":[[30,22]]}},"keywords":{}}],["rxdb/plugins/vector",{"_index":2296,"title":{},"content":{"393":{"position":[[950,22]]},"394":{"position":[[501,22]]},"397":{"position":[[1653,22]]}},"keywords":{}}],["rxdbattachmentsplugin",{"_index":5284,"title":{},"content":{"915":{"position":[[114,21]]}},"keywords":{}}],["rxdbbackupplugin",{"_index":3727,"title":{},"content":{"646":{"position":[[46,16]]}},"keywords":{}}],["rxdbcleanupplugin",{"_index":3743,"title":{},"content":{"652":{"position":[[46,17]]},"1119":{"position":[[404,17]]}},"keywords":{}}],["rxdbcrdtplugin",{"_index":3873,"title":{},"content":{"680":{"position":[[370,14]]}},"keywords":{}}],["rxdbdata",{"_index":3439,"title":{},"content":{"566":{"position":[[39,8]]}},"keywords":{}}],["rxdbflexsearchplugin",{"_index":4045,"title":{},"content":{"724":{"position":[[141,20],[181,20]]}},"keywords":{}}],["rxdbjsondumpplugin",{"_index":5368,"title":{},"content":{"952":{"position":[[217,18]]},"971":{"position":[[329,18]]}},"keywords":{}}],["rxdbleaderelectionplugin",{"_index":4090,"title":{},"content":{"738":{"position":[[122,24]]}},"keywords":{}}],["rxdblocaldocumentsplugin",{"_index":5594,"title":{},"content":{"1012":{"position":[[122,24]]}},"keywords":{}}],["rxdbquerybuilderplugin",{"_index":5759,"title":{},"content":{"1064":{"position":[[152,22]]}},"keywords":{}}],["rxdbreplicationgraphqlplugin",{"_index":6275,"title":{},"content":{"1231":{"position":[[661,28]]}},"keywords":{}}],["rxdbstateplugin",{"_index":5979,"title":{},"content":{"1114":{"position":[[199,15],[613,15]]}},"keywords":{}}],["rxdbupdateplugin",{"_index":5684,"title":{},"content":{"1041":{"position":[[195,16]]},"1059":{"position":[[134,16]]}},"keywords":{}}],["rxdb’",{"_index":1567,"title":{},"content":{"254":{"position":[[220,6]]},"361":{"position":[[307,6]]},"562":{"position":[[811,6]]},"567":{"position":[[89,6]]},"860":{"position":[[618,6],[1084,6]]},"903":{"position":[[125,6]]}},"keywords":{}}],["rxdocument",{"_index":1278,"title":{"1034":{"position":[[0,10]]}},"content":{"188":{"position":[[2823,10]]},"714":{"position":[[101,11]]},"749":{"position":[[11046,11]]},"764":{"position":[[164,11]]},"766":{"position":[[87,10]]},"767":{"position":[[791,12],[871,12],[947,12]]},"768":{"position":[[324,12],[467,12],[540,12],[684,12],[797,12],[875,12],[949,12]]},"769":{"position":[[343,12],[422,12],[497,12],[645,12],[762,12],[842,12],[918,12]]},"770":{"position":[[32,10],[98,10],[353,12]]},"790":{"position":[[73,11]]},"792":{"position":[[96,11]]},"793":{"position":[[130,10]]},"808":{"position":[[398,11]]},"810":{"position":[[21,11]]},"811":{"position":[[32,10]]},"812":{"position":[[314,10]]},"826":{"position":[[362,10]]},"917":{"position":[[25,11]]},"920":{"position":[[44,11]]},"921":{"position":[[143,11]]},"923":{"position":[[5,10]]},"942":{"position":[[157,11]]},"943":{"position":[[320,10]]},"944":{"position":[[319,12],[332,12]]},"945":{"position":[[214,12],[227,12],[319,10]]},"946":{"position":[[129,11]]},"947":{"position":[[290,12],[303,11]]},"948":{"position":[[49,10]]},"982":{"position":[[8,10]]},"1018":{"position":[[41,11]]},"1040":{"position":[[21,10]]},"1044":{"position":[[55,10]]},"1045":{"position":[[39,11]]},"1046":{"position":[[83,11]]},"1049":{"position":[[49,10]]},"1052":{"position":[[299,10],[365,11]]},"1053":{"position":[[52,11]]},"1056":{"position":[[35,10]]},"1057":{"position":[[361,10],[577,10]]},"1059":{"position":[[25,10]]},"1060":{"position":[[47,10]]},"1061":{"position":[[48,10]]},"1084":{"position":[[555,10],[635,10]]},"1085":{"position":[[1895,10],[2210,12]]},"1311":{"position":[[1293,10]]}},"keywords":{}}],["rxdocument,rxdocument,rxdocu",{"_index":5738,"title":{},"content":{"1057":{"position":[[169,36]]}},"keywords":{}}],["rxdocument.allattach",{"_index":4313,"title":{},"content":{"749":{"position":[[13637,26]]}},"keywords":{}}],["rxdocument.clos",{"_index":4276,"title":{},"content":{"749":{"position":[[10804,18]]}},"keywords":{}}],["rxdocument.get",{"_index":4257,"title":{},"content":{"749":{"position":[[9512,15],[9829,15],[13760,17],[13858,15]]}},"keywords":{}}],["rxdocument.incrementalmodifi",{"_index":4419,"title":{},"content":{"749":{"position":[[22721,30]]},"948":{"position":[[343,29]]}},"keywords":{}}],["rxdocument.insert",{"_index":4220,"title":{},"content":{"749":{"position":[[6717,19]]}},"keywords":{}}],["rxdocument.modifi",{"_index":5750,"title":{},"content":{"1061":{"position":[[10,19]]}},"keywords":{}}],["rxdocument.myfield",{"_index":4734,"title":{},"content":{"826":{"position":[[101,19]]}},"keywords":{}}],["rxdocument.patch",{"_index":5747,"title":{},"content":{"1060":{"position":[[10,18]]}},"keywords":{}}],["rxdocument.popul",{"_index":4263,"title":{},"content":{"749":{"position":[[9936,21],[10050,21],[10168,21]]}},"keywords":{}}],["rxdocument.prepar",{"_index":4196,"title":{},"content":{"749":{"position":[[4723,21]]}},"keywords":{}}],["rxdocument.remov",{"_index":3888,"title":{},"content":{"684":{"position":[[86,19]]},"749":{"position":[[10698,20]]},"769":{"position":[[69,17]]}},"keywords":{}}],["rxdocument.sav",{"_index":4273,"title":{},"content":{"749":{"position":[[10594,18],[11135,17]]},"768":{"position":[[64,15]]}},"keywords":{}}],["rxdocument.set",{"_index":4267,"title":{},"content":{"749":{"position":[[10277,17],[10471,17],[10997,16],[14085,16]]}},"keywords":{}}],["rxdocument[alic",{"_index":4683,"title":{},"content":{"810":{"position":[[472,17]]},"811":{"position":[[467,17]]}},"keywords":{}}],["rxerror",{"_index":5486,"title":{},"content":{"990":{"position":[[724,7]]}},"keywords":{}}],["rxfulltextsearch",{"_index":4048,"title":{},"content":{"724":{"position":[[346,16]]}},"keywords":{}}],["rxgraphqlreplicationst",{"_index":5170,"title":{"890":{"position":[[0,26]]}},"content":{"890":{"position":[[55,25]]}},"keywords":{}}],["rxgraphqlreplicationstate<rxdoctype>",{"_index":5150,"title":{},"content":{"887":{"position":[[250,42]]},"888":{"position":[[391,42]]},"889":{"position":[[440,42]]}},"keywords":{}}],["rxj",{"_index":722,"title":{"54":{"position":[[5,4]]},"77":{"position":[[19,6]]},"103":{"position":[[19,6]]},"144":{"position":[[49,4]]},"541":{"position":[[5,4]]},"601":{"position":[[6,4]]},"822":{"position":[[54,4]]}},"content":{"47":{"position":[[212,4]]},"50":{"position":[[14,4],[157,4],[231,4],[302,4],[408,4],[513,6]]},"55":{"position":[[122,4]]},"103":{"position":[[46,5]]},"120":{"position":[[165,4]]},"129":{"position":[[535,4],[603,4],[733,6]]},"144":{"position":[[119,4]]},"174":{"position":[[182,7],[238,5]]},"211":{"position":[[32,4]]},"233":{"position":[[63,5]]},"257":{"position":[[18,4]]},"314":{"position":[[269,4]]},"322":{"position":[[79,4]]},"333":{"position":[[19,5],[60,4]]},"445":{"position":[[180,4],[1412,4]]},"537":{"position":[[25,4],[58,4]]},"540":{"position":[[161,4]]},"541":{"position":[[33,4]]},"562":{"position":[[1237,4]]},"563":{"position":[[39,4],[1033,4]]},"578":{"position":[[27,5],[89,4]]},"580":{"position":[[21,4]]},"597":{"position":[[26,5],[60,4]]},"632":{"position":[[1785,4]]},"662":{"position":[[1272,4]]},"710":{"position":[[1466,5]]},"727":{"position":[[46,4],[95,4]]},"828":{"position":[[51,4]]},"831":{"position":[[230,4]]},"838":{"position":[[1803,4]]},"875":{"position":[[4340,7],[8063,7],[9482,7]]},"941":{"position":[[29,4]]},"970":{"position":[[29,4]]},"1046":{"position":[[29,4]]},"1117":{"position":[[80,4],[151,4]]},"1118":{"position":[[136,5]]}},"keywords":{}}],["rxjsonc",{"_index":3261,"title":{},"content":{"522":{"position":[[136,8]]}},"keywords":{}}],["rxjsonschema",{"_index":4876,"title":{},"content":{"854":{"position":[[1561,13]]},"889":{"position":[[1033,13]]},"934":{"position":[[157,13]]}},"keywords":{}}],["rxjsonschema<herodoctype>",{"_index":6499,"title":{},"content":{"1311":{"position":[[258,31]]}},"keywords":{}}],["rxlocaldocu",{"_index":4741,"title":{"1018":{"position":[[0,16]]}},"content":{"826":{"position":[[936,15]]},"1014":{"position":[[159,16]]},"1015":{"position":[[135,16]]},"1016":{"position":[[8,15],[72,15]]},"1017":{"position":[[215,15]]},"1018":{"position":[[3,15]]}},"keywords":{}}],["rxmongodbreplicationst",{"_index":4958,"title":{},"content":{"872":{"position":[[2697,25]]}},"keywords":{}}],["rxpipelin",{"_index":2377,"title":{"1019":{"position":[[0,10]]},"1020":{"position":[[11,11]]},"1021":{"position":[[14,11]]},"1025":{"position":[[0,10]]},"1029":{"position":[[6,10]]}},"content":{"397":{"position":[[1368,10]]},"793":{"position":[[1043,11]]},"1021":{"position":[[5,10]]},"1022":{"position":[[365,10]]}},"keywords":{}}],["rxqueri",{"_index":4165,"title":{"1054":{"position":[[0,7]]}},"content":{"749":{"position":[[2299,8],[3227,7]]},"793":{"position":[[141,7]]},"817":{"position":[[114,7],[316,7]]},"818":{"position":[[215,7]]},"826":{"position":[[725,7]]},"1036":{"position":[[92,8]]},"1055":{"position":[[19,8]]},"1069":{"position":[[203,7],[250,7],[322,7],[526,7]]},"1070":{"position":[[52,8]]},"1107":{"position":[[73,9]]}},"keywords":{}}],["rxquery<rxherodoctype>",{"_index":1287,"title":{},"content":{"188":{"position":[[3028,28]]}},"keywords":{}}],["rxquery'",{"_index":5784,"title":{"1069":{"position":[[0,9]]}},"content":{"1069":{"position":[[143,9],[399,9]]}},"keywords":{}}],["rxquery._execoverdatabas",{"_index":4153,"title":{},"content":{"749":{"position":[[1655,28]]}},"keywords":{}}],["rxquery.find",{"_index":5352,"title":{},"content":{"949":{"position":[[60,15]]},"950":{"position":[[206,15]]}},"keywords":{}}],["rxquery.limit",{"_index":4160,"title":{},"content":{"749":{"position":[[1995,16]]}},"keywords":{}}],["rxquery.regex",{"_index":4156,"title":{},"content":{"749":{"position":[[1752,16]]}},"keywords":{}}],["rxquery.sort",{"_index":4158,"title":{},"content":{"749":{"position":[[1869,15]]}},"keywords":{}}],["rxreactivityfactori",{"_index":831,"title":{},"content":{"55":{"position":[[186,19]]},"1118":{"position":[[349,20]]}},"keywords":{}}],["rxreactivityfactory<reactivitytype>",{"_index":6002,"title":{},"content":{"1118":{"position":[[495,41]]}},"keywords":{}}],["rxreactivityfactory<signal<any>>",{"_index":838,"title":{},"content":{"55":{"position":[[411,44]]}},"keywords":{}}],["rxreplic",{"_index":4339,"title":{},"content":{"749":{"position":[[15474,13],[15608,13],[15740,13],[15878,13],[16014,13]]},"756":{"position":[[23,13]]},"886":{"position":[[1932,13]]}},"keywords":{}}],["rxreplicationst",{"_index":4832,"title":{"992":{"position":[[0,19]]}},"content":{"846":{"position":[[1476,18]]},"862":{"position":[[1713,19]]},"872":{"position":[[2815,18]]},"886":{"position":[[3382,18]]},"890":{"position":[[172,18]]},"898":{"position":[[4631,19]]},"904":{"position":[[3241,19]]},"992":{"position":[[48,18]]},"993":{"position":[[33,18]]}},"keywords":{}}],["rxreplicationstate.emitev",{"_index":5149,"title":{},"content":{"886":{"position":[[5112,31]]}},"keywords":{}}],["rxreplicationstate.start",{"_index":5524,"title":{},"content":{"998":{"position":[[73,27]]}},"keywords":{}}],["rxschema",{"_index":4614,"title":{"1073":{"position":[[0,8]]}},"content":{"793":{"position":[[108,8]]}},"keywords":{}}],["rxserver",{"_index":4617,"title":{"872":{"position":[[22,8]]},"1086":{"position":[[12,8]]},"1097":{"position":[[11,9]]},"1098":{"position":[[6,8]]},"1099":{"position":[[6,8]]},"1100":{"position":[[0,8]]}},"content":{"793":{"position":[[654,8],[868,8],[877,8]]},"871":{"position":[[70,9],[115,8],[244,8],[430,9],[495,8],[638,8]]},"872":{"position":[[2898,9],[3001,8],[3609,9],[3748,9],[4355,8],[4509,10]]},"1097":{"position":[[14,9]]},"1098":{"position":[[52,8]]},"1099":{"position":[[52,8]]},"1100":{"position":[[15,8]]},"1102":{"position":[[71,8],[308,9]]},"1105":{"position":[[856,8]]},"1112":{"position":[[76,8]]}},"keywords":{}}],["rxserver.start",{"_index":5978,"title":{},"content":{"1112":{"position":[[437,16]]}},"keywords":{}}],["rxserveradapterexpress",{"_index":4961,"title":{},"content":{"872":{"position":[[3170,22],[3300,23]]},"1097":{"position":[[613,22],[755,23]]}},"keywords":{}}],["rxserveradapterfastifi",{"_index":5924,"title":{},"content":{"1098":{"position":[[241,22],[391,23]]}},"keywords":{}}],["rxserveradapterkoa",{"_index":5927,"title":{},"content":{"1099":{"position":[[223,18],[365,19]]}},"keywords":{}}],["rxserverauthhandl",{"_index":5961,"title":{},"content":{"1105":{"position":[[1189,19]]}},"keywords":{}}],["rxstate",{"_index":4619,"title":{"1113":{"position":[[0,7]]},"1114":{"position":[[11,8]]},"1118":{"position":[[0,7]]},"1119":{"position":[[8,7]]},"1121":{"position":[[0,7]]}},"content":{"793":{"position":[[1073,7]]},"1114":{"position":[[3,7],[415,7],[581,7]]},"1116":{"position":[[30,7]]},"1118":{"position":[[330,8]]},"1120":{"position":[[1,7],[95,7],[375,7],[549,7],[693,7]]},"1121":{"position":[[285,7]]}},"keywords":{}}],["rxstorag",{"_index":408,"title":{"131":{"position":[[10,9]]},"162":{"position":[[10,9]]},"189":{"position":[[10,9]]},"287":{"position":[[10,9]]},"336":{"position":[[10,9]]},"504":{"position":[[20,9]]},"524":{"position":[[10,9]]},"581":{"position":[[10,9]]},"693":{"position":[[0,9]]},"1095":{"position":[[19,10]]},"1125":{"position":[[17,10]]},"1127":{"position":[[16,9]]},"1136":{"position":[[10,9]]},"1138":{"position":[[20,10]]},"1141":{"position":[[29,10]]},"1142":{"position":[[0,9]]},"1152":{"position":[[34,9]]},"1153":{"position":[[0,9]]},"1155":{"position":[[0,9]]},"1158":{"position":[[28,9]]},"1160":{"position":[[14,9]]},"1166":{"position":[[7,9]]},"1169":{"position":[[0,9]]},"1179":{"position":[[14,9]]},"1182":{"position":[[24,10]]},"1187":{"position":[[8,9]]},"1188":{"position":[[27,10]]},"1189":{"position":[[18,10]]},"1191":{"position":[[0,9]]},"1197":{"position":[[0,9]]},"1198":{"position":[[19,9]]},"1205":{"position":[[62,9]]},"1210":{"position":[[14,9]]},"1217":{"position":[[7,9]]},"1221":{"position":[[9,9]]},"1223":{"position":[[13,9]]},"1234":{"position":[[0,9]]},"1240":{"position":[[4,9]]},"1262":{"position":[[7,9]]},"1269":{"position":[[7,9]]},"1271":{"position":[[17,10]]},"1273":{"position":[[17,9]]}},"content":{"24":{"position":[[650,9]]},"28":{"position":[[672,9]]},"131":{"position":[[121,10],[200,10],[356,10],[376,9],[713,10]]},"162":{"position":[[48,10],[166,10],[233,10],[359,10],[533,10],[664,9]]},"188":{"position":[[284,9]]},"189":{"position":[[48,9],[120,10],[286,10],[469,10],[509,9],[678,9]]},"266":{"position":[[760,9],[807,10]]},"287":{"position":[[86,9],[318,9],[351,10],[451,10],[511,9],[663,10],[723,9],[888,10],[906,9],[1081,10]]},"336":{"position":[[41,10],[97,10],[174,10],[243,10],[338,10],[413,10]]},"365":{"position":[[439,9]]},"369":{"position":[[1302,9]]},"392":{"position":[[195,10]]},"402":{"position":[[2754,10],[2774,10]]},"433":{"position":[[464,10]]},"504":{"position":[[50,9],[82,10],[176,10],[256,10],[353,10]]},"521":{"position":[[384,9],[415,10]]},"522":{"position":[[511,9]]},"524":{"position":[[224,10],[291,10],[391,10],[497,10],[594,10]]},"581":{"position":[[144,10],[200,10],[249,10],[342,10],[417,10]]},"642":{"position":[[95,9]]},"662":{"position":[[425,9],[543,9],[1001,9],[1112,9],[1191,9],[1557,9]]},"693":{"position":[[55,9],[185,9],[399,10],[431,9]]},"703":{"position":[[327,10]]},"709":{"position":[[1383,9],[1410,10]]},"710":{"position":[[521,9],[754,9],[1043,9],[1307,9],[1346,9],[1498,9],[2256,10],[2322,9],[2350,9]]},"714":{"position":[[366,9],[1024,9]]},"717":{"position":[[494,10],[518,9]]},"721":{"position":[[25,9],[51,9]]},"734":{"position":[[58,10],[82,9]]},"745":{"position":[[56,10]]},"749":{"position":[[23070,10]]},"759":{"position":[[48,9],[75,10],[701,9]]},"760":{"position":[[697,9]]},"772":{"position":[[566,9],[1118,9],[1775,9],[1897,9]]},"773":{"position":[[68,10]]},"774":{"position":[[394,9]]},"775":{"position":[[279,10],[639,9]]},"776":{"position":[[271,9]]},"793":{"position":[[161,9],[472,9],[489,9],[515,9],[542,9],[1276,9]]},"820":{"position":[[252,10]]},"821":{"position":[[258,9],[375,9]]},"838":{"position":[[1225,9],[1322,9],[1412,9],[1874,9],[3098,9]]},"844":{"position":[[43,10]]},"927":{"position":[[121,10]]},"932":{"position":[[384,10]]},"960":{"position":[[379,9]]},"961":{"position":[[128,10]]},"962":{"position":[[47,9],[344,9],[498,9],[542,9],[573,9],[857,9]]},"1066":{"position":[[43,10]]},"1067":{"position":[[241,9]]},"1068":{"position":[[306,9]]},"1079":{"position":[[161,10],[456,9]]},"1085":{"position":[[3641,11]]},"1095":{"position":[[82,9]]},"1124":{"position":[[467,9]]},"1125":{"position":[[19,9]]},"1130":{"position":[[330,9]]},"1139":{"position":[[58,9]]},"1143":{"position":[[16,9],[114,9]]},"1145":{"position":[[54,9]]},"1146":{"position":[[120,9]]},"1147":{"position":[[144,10]]},"1148":{"position":[[704,9]]},"1151":{"position":[[118,9],[779,9]]},"1152":{"position":[[33,9]]},"1154":{"position":[[50,10],[422,9],[554,10],[604,9],[708,10]]},"1162":{"position":[[972,9],[1121,9]]},"1163":{"position":[[201,9],[247,9],[512,9]]},"1170":{"position":[[286,9]]},"1178":{"position":[[117,9],[776,9]]},"1182":{"position":[[201,9],[247,9],[516,9]]},"1184":{"position":[[105,10]]},"1189":{"position":[[80,10]]},"1191":{"position":[[25,9]]},"1196":{"position":[[96,9]]},"1198":{"position":[[801,9],[1183,9],[1379,9],[1426,9],[1538,10],[1781,9],[2061,10],[2116,9],[2222,9]]},"1210":{"position":[[10,9],[84,9],[210,9]]},"1214":{"position":[[890,9]]},"1219":{"position":[[641,9]]},"1222":{"position":[[187,9],[215,10],[312,10],[362,9],[598,9],[1141,10],[1355,10]]},"1225":{"position":[[67,9],[346,9],[411,10]]},"1231":{"position":[[21,9],[841,9]]},"1233":{"position":[[191,9]]},"1235":{"position":[[162,9],[297,9],[357,9],[408,9]]},"1236":{"position":[[5,9]]},"1242":{"position":[[207,10]]},"1243":{"position":[[15,9]]},"1244":{"position":[[10,9]]},"1246":{"position":[[24,9],[64,9],[368,9],[408,9],[679,9],[978,9],[1173,9],[1255,9],[1295,10],[1629,9],[1697,10],[1738,9],[2081,9],[2211,9]]},"1247":{"position":[[296,9],[469,9],[656,9]]},"1263":{"position":[[240,9],[305,10]]},"1282":{"position":[[329,9]]},"1284":{"position":[[436,9]]},"1286":{"position":[[379,9]]},"1287":{"position":[[425,9]]},"1288":{"position":[[385,9]]},"1294":{"position":[[2155,10]]},"1296":{"position":[[1894,10]]}},"keywords":{}}],["rxstorage.it",{"_index":6067,"title":{},"content":{"1143":{"position":[[435,12]]}},"keywords":{}}],["rxstorage.y",{"_index":3091,"title":{},"content":{"469":{"position":[[503,13]]}},"keywords":{}}],["rxstoragesupport",{"_index":6177,"title":{},"content":{"1199":{"position":[[20,17]]}},"keywords":{}}],["rxstorageth",{"_index":3989,"title":{},"content":{"710":{"position":[[614,12],[637,12],[663,12],[685,12]]}},"keywords":{}}],["rxsupabasereplicationst",{"_index":5229,"title":{},"content":{"898":{"position":[[4511,26]]}},"keywords":{}}],["s",{"_index":343,"title":{},"content":{"19":{"position":[[877,1]]}},"keywords":{}}],["s.rating(sortdirection.ascending).title(sortdirection.descend",{"_index":344,"title":{},"content":{"19":{"position":[[885,65]]}},"keywords":{}}],["s0vlu0uhi",{"_index":5067,"title":{},"content":{"878":{"position":[[520,13]]},"880":{"position":[[432,13]]}},"keywords":{}}],["s0vlu0uhiexfq0",{"_index":4840,"title":{},"content":{"848":{"position":[[512,19]]}},"keywords":{}}],["s1",{"_index":4413,"title":{},"content":{"749":{"position":[[22230,2]]}},"keywords":{}}],["s3",{"_index":6135,"title":{},"content":{"1173":{"position":[[125,3]]}},"keywords":{}}],["saa",{"_index":2675,"title":{},"content":{"412":{"position":[[2856,4]]},"1148":{"position":[[28,4]]}},"keywords":{}}],["sacrif",{"_index":2944,"title":{},"content":{"445":{"position":[[2078,11]]}},"keywords":{}}],["safari",{"_index":1708,"title":{},"content":{"298":{"position":[[172,7],[665,6]]},"299":{"position":[[585,6],[715,6],[881,6],[1491,6]]},"305":{"position":[[165,6],[552,6]]},"408":{"position":[[1137,6]]},"412":{"position":[[7868,6]]},"462":{"position":[[383,6]]},"613":{"position":[[757,6]]},"624":{"position":[[1010,7]]},"696":{"position":[[1397,6]]},"1207":{"position":[[105,7]]},"1211":{"position":[[386,7]]},"1301":{"position":[[952,6],[1108,6]]}},"keywords":{}}],["safe",{"_index":1039,"title":{},"content":{"105":{"position":[[161,4]]},"382":{"position":[[352,7]]},"412":{"position":[[8836,4]]},"557":{"position":[[513,5]]},"897":{"position":[[422,6]]},"1007":{"position":[[1077,6]]},"1317":{"position":[[308,6]]}},"keywords":{}}],["safeguard",{"_index":1687,"title":{},"content":{"290":{"position":[[205,12]]},"298":{"position":[[52,9]]},"377":{"position":[[197,9]]},"506":{"position":[[88,12]]},"569":{"position":[[837,12]]}},"keywords":{}}],["safeti",{"_index":966,"title":{},"content":{"74":{"position":[[91,6]]},"174":{"position":[[920,6]]},"281":{"position":[[304,6]]},"711":{"position":[[2369,6]]}},"keywords":{}}],["same",{"_index":88,"title":{},"content":{"6":{"position":[[217,4]]},"7":{"position":[[188,4]]},"16":{"position":[[247,4]]},"17":{"position":[[545,4]]},"26":{"position":[[79,4]]},"30":{"position":[[267,4]]},"32":{"position":[[133,4]]},"42":{"position":[[119,4]]},"47":{"position":[[1325,4]]},"109":{"position":[[136,4]]},"134":{"position":[[79,4]]},"203":{"position":[[362,4],[379,4]]},"210":{"position":[[657,4]]},"239":{"position":[[251,4]]},"250":{"position":[[132,4]]},"261":{"position":[[425,4],[1065,4]]},"299":{"position":[[1119,4]]},"314":{"position":[[1141,5]]},"339":{"position":[[36,4]]},"357":{"position":[[435,4]]},"358":{"position":[[289,4]]},"396":{"position":[[196,4],[1443,4]]},"397":{"position":[[96,4]]},"408":{"position":[[3012,4]]},"411":{"position":[[251,4],[4234,4],[4275,4],[4767,4]]},"412":{"position":[[2269,4],[3034,4],[3115,4],[3155,4],[5919,4]]},"416":{"position":[[277,4]]},"421":{"position":[[495,4]]},"446":{"position":[[674,4]]},"458":{"position":[[157,4]]},"461":{"position":[[1500,4]]},"467":{"position":[[587,4]]},"475":{"position":[[103,4]]},"490":{"position":[[343,4]]},"491":{"position":[[470,4],[1361,4]]},"495":{"position":[[150,4]]},"502":{"position":[[1267,4]]},"535":{"position":[[1285,4]]},"559":{"position":[[1376,4]]},"566":{"position":[[915,4]]},"570":{"position":[[543,4]]},"582":{"position":[[521,4]]},"595":{"position":[[1348,4]]},"616":{"position":[[138,4]]},"617":{"position":[[225,4]]},"624":{"position":[[218,4]]},"632":{"position":[[551,4]]},"635":{"position":[[81,4]]},"683":{"position":[[353,4]]},"684":{"position":[[126,4]]},"686":{"position":[[591,4]]},"691":{"position":[[61,4],[82,4]]},"698":{"position":[[38,4],[216,4],[761,4],[1686,4],[3244,4]]},"699":{"position":[[186,4]]},"701":{"position":[[80,4]]},"702":{"position":[[737,4]]},"740":{"position":[[302,4]]},"743":{"position":[[127,4],[178,4],[227,4]]},"749":{"position":[[1421,4],[1474,4],[5605,4],[9148,4],[14696,4]]},"756":{"position":[[295,4]]},"779":{"position":[[448,4]]},"785":{"position":[[82,4],[654,4]]},"798":{"position":[[300,4]]},"799":{"position":[[462,4]]},"817":{"position":[[264,4]]},"820":{"position":[[396,4]]},"826":{"position":[[479,4]]},"829":{"position":[[190,4]]},"830":{"position":[[57,4]]},"832":{"position":[[317,4]]},"863":{"position":[[648,4]]},"872":{"position":[[3658,4]]},"875":{"position":[[2381,4]]},"886":{"position":[[259,4],[1689,4]]},"890":{"position":[[423,4],[562,4]]},"898":{"position":[[1703,5]]},"902":{"position":[[775,4]]},"904":{"position":[[1958,4]]},"908":{"position":[[163,4]]},"918":{"position":[[1,4]]},"935":{"position":[[139,4],[172,4]]},"943":{"position":[[114,4]]},"947":{"position":[[1,4]]},"948":{"position":[[44,4],[547,4]]},"951":{"position":[[524,4]]},"961":{"position":[[101,4],[123,4]]},"964":{"position":[[62,4],[340,4]]},"966":{"position":[[70,4],[84,4],[448,4]]},"967":{"position":[[72,4]]},"981":{"position":[[1078,4],[1568,4]]},"986":{"position":[[174,4]]},"987":{"position":[[50,4],[71,4]]},"1002":{"position":[[746,4]]},"1004":{"position":[[700,4]]},"1009":{"position":[[51,4]]},"1014":{"position":[[94,4]]},"1030":{"position":[[212,4]]},"1033":{"position":[[314,4]]},"1048":{"position":[[74,4],[284,4]]},"1052":{"position":[[1,4]]},"1058":{"position":[[154,4]]},"1067":{"position":[[1778,4]]},"1072":{"position":[[796,4],[1461,4],[1504,4]]},"1088":{"position":[[287,4],[398,4],[710,4]]},"1093":{"position":[[64,4],[340,4]]},"1095":{"position":[[331,4]]},"1105":{"position":[[411,4],[575,4]]},"1115":{"position":[[626,4]]},"1121":{"position":[[154,4]]},"1135":{"position":[[83,4],[138,4],[234,4]]},"1140":{"position":[[237,4]]},"1146":{"position":[[146,4]]},"1164":{"position":[[567,4]]},"1165":{"position":[[515,4],[976,4]]},"1175":{"position":[[168,4]]},"1183":{"position":[[72,4]]},"1188":{"position":[[36,4]]},"1230":{"position":[[256,4],[310,4]]},"1233":{"position":[[78,4]]},"1267":{"position":[[558,4]]},"1271":{"position":[[1724,4]]},"1301":{"position":[[133,4]]},"1305":{"position":[[109,4]]},"1307":{"position":[[230,4]]},"1308":{"position":[[67,4]]},"1315":{"position":[[506,5],[1032,4]]},"1316":{"position":[[255,4],[599,4],[654,4],[671,4],[1049,4],[2404,4],[3380,4]]},"1318":{"position":[[204,4]]},"1321":{"position":[[848,4],[937,4],[1021,4]]}},"keywords":{}}],["sampl",{"_index":1341,"title":{"209":{"position":[[0,6]]}},"content":{"396":{"position":[[799,8],[894,6],[1861,8],[1909,8],[1979,6]]},"397":{"position":[[1418,7],[1995,7]]},"543":{"position":[[135,6]]},"603":{"position":[[133,6]]}},"keywords":{}}],["samplevector",{"_index":2379,"title":{},"content":{"397":{"position":[[1682,14]]}},"keywords":{}}],["sandbox",{"_index":1106,"title":{},"content":{"131":{"position":[[515,9]]},"433":{"position":[[110,9]]},"1206":{"position":[[130,10]]},"1215":{"position":[[569,9]]}},"keywords":{}}],["satellit",{"_index":2548,"title":{},"content":{"408":{"position":[[2429,9]]},"780":{"position":[[283,10]]}},"keywords":{}}],["satisfact",{"_index":1002,"title":{},"content":{"87":{"position":[[276,13]]},"93":{"position":[[234,12]]}},"keywords":{}}],["save",{"_index":30,"title":{"768":{"position":[[0,5]]}},"content":{"1":{"position":[[457,4]]},"2":{"position":[[123,4],[169,4]]},"3":{"position":[[143,4]]},"4":{"position":[[315,4]]},"5":{"position":[[228,4]]},"6":{"position":[[282,4],[328,4]]},"7":{"position":[[255,4]]},"9":{"position":[[168,4]]},"10":{"position":[[102,4]]},"11":{"position":[[137,4],[1023,4]]},"49":{"position":[[81,4]]},"65":{"position":[[655,5]]},"128":{"position":[[186,4]]},"352":{"position":[[128,6]]},"358":{"position":[[664,4]]},"366":{"position":[[336,6]]},"399":{"position":[[333,6]]},"412":{"position":[[7811,4],[10709,6]]},"419":{"position":[[460,6]]},"424":{"position":[[216,4]]},"445":{"position":[[2377,6]]},"537":{"position":[[65,7]]},"542":{"position":[[237,4]]},"559":{"position":[[328,5],[377,5]]},"597":{"position":[[67,4]]},"647":{"position":[[351,5]]},"661":{"position":[[547,4]]},"703":{"position":[[1421,4]]},"726":{"position":[[64,4],[113,4]]},"727":{"position":[[102,4]]},"728":{"position":[[190,4]]},"739":{"position":[[91,5]]},"749":{"position":[[10619,4]]},"767":{"position":[[394,6]]},"768":{"position":[[3,4],[44,6],[363,6],[628,4]]},"778":{"position":[[69,6]]},"866":{"position":[[48,4]]},"872":{"position":[[162,4]]},"902":{"position":[[797,7]]},"911":{"position":[[429,5]]},"1003":{"position":[[175,4]]},"1068":{"position":[[507,4]]},"1072":{"position":[[2313,5]]},"1085":{"position":[[1983,6],[3071,5],[3372,5],[3584,5]]},"1097":{"position":[[99,4]]},"1102":{"position":[[775,4]]},"1139":{"position":[[398,4]]},"1145":{"position":[[387,4]]},"1177":{"position":[[548,4]]},"1189":{"position":[[54,4]]},"1192":{"position":[[334,4]]},"1250":{"position":[[256,5]]},"1300":{"position":[[415,5]]}},"keywords":{}}],["savedatabas",{"_index":6140,"title":{},"content":{"1175":{"position":[[740,14]]}},"keywords":{}}],["sc1",{"_index":4353,"title":{},"content":{"749":{"position":[[16832,3]]}},"keywords":{}}],["sc10",{"_index":4364,"title":{},"content":{"749":{"position":[[17642,4]]}},"keywords":{}}],["sc11",{"_index":4366,"title":{},"content":{"749":{"position":[[17765,4]]}},"keywords":{}}],["sc13",{"_index":4368,"title":{},"content":{"749":{"position":[[17874,4]]}},"keywords":{}}],["sc14",{"_index":4369,"title":{},"content":{"749":{"position":[[17995,4]]}},"keywords":{}}],["sc15",{"_index":4370,"title":{},"content":{"749":{"position":[[18117,4]]}},"keywords":{}}],["sc16",{"_index":4371,"title":{},"content":{"749":{"position":[[18214,4]]}},"keywords":{}}],["sc17",{"_index":4372,"title":{},"content":{"749":{"position":[[18314,4]]}},"keywords":{}}],["sc18",{"_index":4374,"title":{},"content":{"749":{"position":[[18496,4]]}},"keywords":{}}],["sc19",{"_index":4375,"title":{},"content":{"749":{"position":[[18590,4]]}},"keywords":{}}],["sc2",{"_index":4354,"title":{},"content":{"749":{"position":[[16921,3]]}},"keywords":{}}],["sc20",{"_index":4376,"title":{},"content":{"749":{"position":[[18709,4]]}},"keywords":{}}],["sc21",{"_index":4378,"title":{},"content":{"749":{"position":[[18813,4]]}},"keywords":{}}],["sc22",{"_index":4379,"title":{},"content":{"749":{"position":[[18919,4]]}},"keywords":{}}],["sc23",{"_index":4382,"title":{},"content":{"749":{"position":[[19022,4]]}},"keywords":{}}],["sc24",{"_index":4383,"title":{},"content":{"749":{"position":[[19116,4]]}},"keywords":{}}],["sc25",{"_index":4386,"title":{},"content":{"749":{"position":[[19318,4]]}},"keywords":{}}],["sc26",{"_index":4388,"title":{},"content":{"749":{"position":[[19446,4]]}},"keywords":{}}],["sc28",{"_index":4389,"title":{},"content":{"749":{"position":[[19572,4]]}},"keywords":{}}],["sc29",{"_index":4390,"title":{},"content":{"749":{"position":[[19687,4]]}},"keywords":{}}],["sc3",{"_index":4357,"title":{},"content":{"749":{"position":[[17027,3]]}},"keywords":{}}],["sc30",{"_index":4391,"title":{},"content":{"749":{"position":[[19788,4]]}},"keywords":{}}],["sc32",{"_index":4392,"title":{},"content":{"749":{"position":[[19880,4]]}},"keywords":{}}],["sc33",{"_index":4394,"title":{},"content":{"749":{"position":[[20004,4]]}},"keywords":{}}],["sc34",{"_index":4395,"title":{},"content":{"749":{"position":[[20122,4]]}},"keywords":{}}],["sc35",{"_index":4396,"title":{},"content":{"749":{"position":[[20279,4]]}},"keywords":{}}],["sc36",{"_index":4399,"title":{},"content":{"749":{"position":[[20445,4]]}},"keywords":{}}],["sc37",{"_index":4400,"title":{},"content":{"749":{"position":[[20546,4]]}},"keywords":{}}],["sc38",{"_index":4401,"title":{},"content":{"749":{"position":[[20713,4]]}},"keywords":{}}],["sc39",{"_index":4402,"title":{},"content":{"749":{"position":[[20850,4]]}},"keywords":{}}],["sc4",{"_index":4358,"title":{},"content":{"749":{"position":[[17150,3]]}},"keywords":{}}],["sc40",{"_index":4403,"title":{},"content":{"749":{"position":[[21023,4]]}},"keywords":{}}],["sc41",{"_index":4406,"title":{},"content":{"749":{"position":[[21307,4]]}},"keywords":{}}],["sc42",{"_index":4407,"title":{},"content":{"749":{"position":[[21461,4]]}},"keywords":{}}],["sc6",{"_index":4361,"title":{},"content":{"749":{"position":[[17299,3]]}},"keywords":{}}],["sc7",{"_index":4362,"title":{},"content":{"749":{"position":[[17408,3]]}},"keywords":{}}],["sc8",{"_index":4363,"title":{},"content":{"749":{"position":[[17524,3]]}},"keywords":{}}],["scalabl",{"_index":428,"title":{"224":{"position":[[9,12]]},"623":{"position":[[0,11]]}},"content":{"26":{"position":[[281,8]]},"46":{"position":[[551,12]]},"91":{"position":[[184,11]]},"114":{"position":[[723,12]]},"118":{"position":[[192,8]]},"148":{"position":[[240,8]]},"165":{"position":[[370,8]]},"173":{"position":[[1884,11],[2071,12]]},"175":{"position":[[702,8]]},"178":{"position":[[388,12]]},"186":{"position":[[394,8]]},"198":{"position":[[239,8]]},"224":{"position":[[35,11]]},"241":{"position":[[707,8]]},"267":{"position":[[890,11],[1273,12]]},"369":{"position":[[518,12],[761,11]]},"373":{"position":[[735,8]]},"378":{"position":[[256,11]]},"395":{"position":[[16,11]]},"430":{"position":[[855,11]]},"441":{"position":[[677,8]]},"445":{"position":[[1620,12]]},"446":{"position":[[813,11]]},"447":{"position":[[426,9]]},"485":{"position":[[233,12]]},"530":{"position":[[518,12]]},"620":{"position":[[185,11],[788,12]]},"623":{"position":[[127,11],[197,8],[471,8],[640,9]]},"860":{"position":[[879,8]]},"873":{"position":[[79,8]]},"1247":{"position":[[341,8],[514,8]]},"1295":{"position":[[379,12]]}},"keywords":{}}],["scalablemor",{"_index":3420,"title":{},"content":{"560":{"position":[[530,12]]}},"keywords":{}}],["scale",{"_index":1007,"title":{"91":{"position":[[22,5]]},"487":{"position":[[7,7]]},"782":{"position":[[0,6]]},"1086":{"position":[[0,7]]},"1087":{"position":[[9,8]]},"1091":{"position":[[11,8]]},"1095":{"position":[[11,7]]}},"content":{"100":{"position":[[49,5]]},"224":{"position":[[311,5]]},"318":{"position":[[250,5]]},"353":{"position":[[388,7]]},"358":{"position":[[188,6]]},"369":{"position":[[593,6]]},"385":{"position":[[231,5]]},"386":{"position":[[115,5]]},"394":{"position":[[1421,5],[1658,5]]},"399":{"position":[[58,7]]},"411":{"position":[[544,5],[792,6],[1778,5],[3314,5],[3711,6]]},"417":{"position":[[282,6]]},"418":{"position":[[397,5]]},"477":{"position":[[75,7],[351,8]]},"483":{"position":[[390,5]]},"566":{"position":[[737,6]]},"626":{"position":[[415,6]]},"643":{"position":[[260,5]]},"772":{"position":[[379,6],[1401,6]]},"775":{"position":[[420,7]]},"782":{"position":[[256,5],[314,5]]},"793":{"position":[[886,7]]},"860":{"position":[[996,6],[1230,6]]},"1087":{"position":[[10,7],[150,7],[213,6]]},"1088":{"position":[[68,5]]},"1091":{"position":[[4,5]]},"1092":{"position":[[549,5]]},"1094":{"position":[[121,5]]},"1095":{"position":[[19,7],[98,6]]},"1321":{"position":[[477,6]]}},"keywords":{}}],["scan",{"_index":2060,"title":{"394":{"position":[[48,5]]}},"content":{"358":{"position":[[401,8]]},"394":{"position":[[1363,4]]},"398":{"position":[[126,5]]},"400":{"position":[[62,4]]},"411":{"position":[[3907,8]]},"559":{"position":[[1274,8]]}},"keywords":{}}],["scan.for",{"_index":2485,"title":{},"content":{"402":{"position":[[1391,8]]}},"keywords":{}}],["scatter",{"_index":3523,"title":{},"content":{"590":{"position":[[372,9]]}},"keywords":{}}],["scenario",{"_index":564,"title":{},"content":{"35":{"position":[[616,9]]},"98":{"position":[[59,10]]},"111":{"position":[[176,9]]},"122":{"position":[[141,10]]},"125":{"position":[[52,10]]},"126":{"position":[[348,10]]},"131":{"position":[[846,9]]},"133":{"position":[[135,10]]},"134":{"position":[[163,10]]},"162":{"position":[[726,10]]},"167":{"position":[[4,9]]},"169":{"position":[[4,9]]},"174":{"position":[[1979,9]]},"206":{"position":[[178,9]]},"225":{"position":[[42,10]]},"261":{"position":[[137,9]]},"287":{"position":[[607,9]]},"289":{"position":[[675,10],[1825,9]]},"321":{"position":[[204,9]]},"325":{"position":[[252,10]]},"336":{"position":[[492,10]]},"354":{"position":[[148,9]]},"365":{"position":[[1424,9]]},"378":{"position":[[201,9]]},"380":{"position":[[373,9]]},"411":{"position":[[383,9],[5569,9]]},"412":{"position":[[6092,9],[12238,9]]},"418":{"position":[[39,9]]},"429":{"position":[[361,9]]},"436":{"position":[[4,9]]},"439":{"position":[[200,9]]},"441":{"position":[[296,9]]},"469":{"position":[[570,9]]},"473":{"position":[[237,10]]},"482":{"position":[[1251,10]]},"491":{"position":[[1790,9]]},"502":{"position":[[1186,10]]},"504":{"position":[[1457,9]]},"516":{"position":[[103,10]]},"519":{"position":[[92,8]]},"526":{"position":[[281,10]]},"554":{"position":[[387,9]]},"582":{"position":[[464,10]]},"584":{"position":[[253,9]]},"590":{"position":[[692,10]]},"611":{"position":[[527,9]]},"612":{"position":[[217,9]]},"622":{"position":[[709,9]]},"623":{"position":[[210,9]]},"624":{"position":[[650,9]]},"631":{"position":[[96,10]]},"643":{"position":[[290,9]]},"902":{"position":[[573,10]]},"912":{"position":[[540,9]]},"1009":{"position":[[88,9]]},"1209":{"position":[[335,10]]},"1299":{"position":[[382,8]]}},"keywords":{}}],["scene",{"_index":1162,"title":{},"content":{"152":{"position":[[137,7]]},"361":{"position":[[1130,7]]}},"keywords":{}}],["scenes.offlin",{"_index":3154,"title":{},"content":{"486":{"position":[[160,14]]}},"keywords":{}}],["schedul",{"_index":6485,"title":{},"content":{"1304":{"position":[[550,8]]}},"keywords":{}}],["schema",{"_index":765,"title":{"79":{"position":[[12,6]]},"110":{"position":[[12,6]]},"240":{"position":[[9,6]]},"282":{"position":[[7,6]]},"351":{"position":[[10,6]]},"367":{"position":[[0,6],[40,6]]},"382":{"position":[[0,6]]},"636":{"position":[[0,6]]},"750":{"position":[[25,6]]},"808":{"position":[[0,6]]},"916":{"position":[[26,7]]},"936":{"position":[[0,7]]},"1075":{"position":[[29,7]]},"1260":{"position":[[9,6]]},"1285":{"position":[[0,6]]},"1287":{"position":[[11,7]]},"1291":{"position":[[2,6]]}},"content":{"51":{"position":[[248,6],[289,8],[859,7]]},"57":{"position":[[168,6],[218,6]]},"79":{"position":[[45,6]]},"110":{"position":[[25,6],[127,6]]},"174":{"position":[[2041,6],[2108,6],[2186,6]]},"188":{"position":[[1210,7]]},"209":{"position":[[393,7],[416,8]]},"211":{"position":[[354,7],[378,8]]},"240":{"position":[[87,6],[194,6],[226,6],[325,6]]},"255":{"position":[[737,7],[760,8]]},"259":{"position":[[36,7],[60,8]]},"282":{"position":[[1,6],[282,6]]},"314":{"position":[[702,7],[726,8]]},"315":{"position":[[677,7],[702,8]]},"316":{"position":[[101,7],[144,7],[167,8]]},"334":{"position":[[589,7],[612,8]]},"350":{"position":[[119,7]]},"351":{"position":[[77,6],[377,7]]},"354":{"position":[[398,6],[995,8],[1700,6]]},"356":{"position":[[731,7]]},"357":{"position":[[440,6]]},"360":{"position":[[644,6],[728,6]]},"361":{"position":[[6,7],[35,7]]},"362":{"position":[[110,8],[898,7]]},"367":{"position":[[276,6],[394,6],[679,6]]},"382":{"position":[[66,6],[277,6],[345,6]]},"392":{"position":[[561,7],[1340,6],[1425,6],[1527,7]]},"397":{"position":[[369,6],[384,6],[527,6]]},"403":{"position":[[200,6],[329,6],[432,6],[531,6],[764,7]]},"412":{"position":[[11301,6],[11536,6],[11636,6]]},"480":{"position":[[502,7],[526,8]]},"482":{"position":[[795,7]]},"502":{"position":[[29,6]]},"538":{"position":[[549,6],[590,8],[882,7]]},"544":{"position":[[202,6]]},"554":{"position":[[1216,6],[1287,7],[1317,8]]},"555":{"position":[[83,6]]},"556":{"position":[[1439,6]]},"562":{"position":[[298,8],[510,7]]},"564":{"position":[[730,7],[755,8]]},"566":{"position":[[192,6]]},"567":{"position":[[271,8]]},"579":{"position":[[597,7],[620,8]]},"595":{"position":[[692,6]]},"598":{"position":[[556,6],[597,8],[889,7]]},"604":{"position":[[174,6]]},"632":{"position":[[1487,7],[1510,8]]},"636":{"position":[[103,6],[169,6]]},"638":{"position":[[568,7],[594,8],[863,7]]},"639":{"position":[[285,7],[328,7],[350,8]]},"662":{"position":[[2372,7]]},"680":{"position":[[106,6],[763,6],[1168,7]]},"686":{"position":[[909,6]]},"702":{"position":[[190,6],[397,6]]},"717":{"position":[[1395,7],[1409,6],[1634,6]]},"720":{"position":[[109,7]]},"734":{"position":[[882,7]]},"739":{"position":[[448,7]]},"749":{"position":[[703,6],[819,6],[1933,6],[2414,6],[2531,6],[5171,6],[5443,7],[8599,6],[12348,6],[12826,6],[13074,6],[13452,6],[15209,6],[17660,6],[17783,6],[18861,6],[19508,6],[19629,6],[20064,6],[20221,6],[20387,6],[20655,6],[20792,6],[21047,6],[21099,7],[21788,6],[21928,6],[22034,6],[22087,7],[22172,6],[22390,6],[22656,7]]},"751":{"position":[[226,6],[505,7],[809,7],[1130,6],[1607,7]]},"752":{"position":[[410,7]]},"757":{"position":[[181,6],[314,6]]},"772":{"position":[[959,7]]},"789":{"position":[[204,7],[451,7]]},"791":{"position":[[60,7],[319,7]]},"792":{"position":[[187,7]]},"793":{"position":[[410,6],[996,6]]},"806":{"position":[[612,7]]},"812":{"position":[[65,7]]},"813":{"position":[[65,7]]},"818":{"position":[[531,7]]},"820":{"position":[[185,7]]},"829":{"position":[[291,6],[757,7]]},"836":{"position":[[2058,6]]},"838":{"position":[[984,6],[2586,7]]},"841":{"position":[[1114,6],[1139,7],[1175,7],[1207,7],[1253,7],[1288,7]]},"861":{"position":[[1367,6],[1538,7]]},"862":{"position":[[642,8],[843,7]]},"872":{"position":[[1807,6],[1850,7],[4080,7]]},"878":{"position":[[460,6]]},"879":{"position":[[22,6],[123,6],[356,6]]},"886":{"position":[[1726,7]]},"887":{"position":[[118,6]]},"889":{"position":[[1016,7]]},"898":{"position":[[873,6],[1640,6],[1951,6],[2430,7],[4373,6]]},"904":{"position":[[826,7],[849,8]]},"916":{"position":[[94,6],[376,7]]},"932":{"position":[[1164,6]]},"934":{"position":[[293,7]]},"936":{"position":[[5,6],[84,6],[115,7],[148,6]]},"938":{"position":[[105,6]]},"939":{"position":[[186,7]]},"942":{"position":[[86,6]]},"954":{"position":[[101,8]]},"979":{"position":[[346,7]]},"1013":{"position":[[503,7]]},"1018":{"position":[[386,7]]},"1067":{"position":[[932,7],[1526,7]]},"1074":{"position":[[17,6],[108,6]]},"1075":{"position":[[45,7]]},"1076":{"position":[[162,7]]},"1078":{"position":[[225,6]]},"1079":{"position":[[58,6]]},"1080":{"position":[[55,6]]},"1081":{"position":[[88,7]]},"1084":{"position":[[5,6],[229,6],[499,6]]},"1085":{"position":[[772,7],[890,6],[1192,7],[1761,6],[2701,6],[2753,6],[2895,7],[3011,7],[3045,6],[3195,6],[3249,6],[3417,6],[3449,6],[3570,6]]},"1100":{"position":[[575,6],[847,6],[890,6],[938,7]]},"1107":{"position":[[13,6],[509,6]]},"1108":{"position":[[309,6],[339,6]]},"1149":{"position":[[284,6],[1039,7]]},"1158":{"position":[[326,7],[350,8]]},"1164":{"position":[[690,7]]},"1222":{"position":[[463,7]]},"1237":{"position":[[181,6],[264,6],[309,6]]},"1286":{"position":[[35,6]]},"1287":{"position":[[183,6],[299,8]]},"1288":{"position":[[154,6]]},"1289":{"position":[[5,6]]},"1291":{"position":[[55,8]]},"1292":{"position":[[375,6],[733,6],[995,6]]},"1309":{"position":[[1456,7]]},"1311":{"position":[[308,8],[1006,7]]},"1319":{"position":[[68,6],[506,7]]},"1321":{"position":[[719,6]]},"1322":{"position":[[299,7]]}},"keywords":{}}],["schema"",{"_index":5814,"title":{},"content":{"1074":{"position":[[708,13]]}},"keywords":{}}],["schema'",{"_index":4441,"title":{},"content":{"751":{"position":[[82,8]]}},"keywords":{}}],["schema.do",{"_index":3871,"title":{},"content":{"680":{"position":[[213,9]]}},"keywords":{}}],["schema.html?console=qa#faq",{"_index":4206,"title":{},"content":{"749":{"position":[[5481,26]]}},"keywords":{}}],["schema.html?console=toplevel#non",{"_index":4373,"title":{},"content":{"749":{"position":[[18393,32]]}},"keywords":{}}],["schema.org",{"_index":5847,"title":{},"content":{"1084":{"position":[[278,11]]}},"keywords":{}}],["schema.schema",{"_index":6026,"title":{},"content":{"1132":{"position":[[334,13]]}},"keywords":{}}],["schema/reference/object.html#requir",{"_index":4385,"title":{},"content":{"749":{"position":[[19229,37]]}},"keywords":{}}],["schemacheck",{"_index":4355,"title":{},"content":{"749":{"position":[[16925,12],[17031,12],[17154,12],[17303,12],[17412,12],[17528,12],[17647,12],[17770,12],[17879,12],[18000,12],[18122,12],[18219,12],[18319,12],[18501,12],[18595,12],[18714,12],[18818,12],[18924,12],[19027,12],[19121,12],[19323,12],[19451,12],[19577,12],[19692,12],[19793,12],[19885,12],[20009,12]]}},"keywords":{}}],["schemaless",{"_index":5891,"title":{},"content":{"1085":{"position":[[702,10]]}},"keywords":{}}],["schemapath",{"_index":4411,"title":{},"content":{"749":{"position":[[22061,10]]}},"keywords":{}}],["schemav1",{"_index":2494,"title":{},"content":{"403":{"position":[[476,8],[772,9]]}},"keywords":{}}],["schemavers",{"_index":5375,"title":{},"content":{"954":{"position":[[120,15]]}},"keywords":{}}],["schemawithdefaultag",{"_index":5844,"title":{},"content":{"1082":{"position":[[147,20]]}},"keywords":{}}],["schemawithfinalag",{"_index":5846,"title":{},"content":{"1083":{"position":[[349,18]]}},"keywords":{}}],["schemawithindex",{"_index":5836,"title":{},"content":{"1080":{"position":[[7,17]]}},"keywords":{}}],["schemawithonetomanyrefer",{"_index":4677,"title":{},"content":{"808":{"position":[[499,28]]}},"keywords":{}}],["school/univers",{"_index":6291,"title":{},"content":{"1249":{"position":[[203,17]]}},"keywords":{}}],["scope",{"_index":1156,"title":{},"content":{"151":{"position":[[81,5]]},"302":{"position":[[538,5]]},"411":{"position":[[1711,6]]},"412":{"position":[[12588,6]]},"436":{"position":[[356,5]]},"1009":{"position":[[536,6],[564,5]]},"1311":{"position":[[1226,5]]}},"keywords":{}}],["score",{"_index":3583,"title":{},"content":{"612":{"position":[[256,7]]},"691":{"position":[[133,6],[427,6]]}},"keywords":{}}],["scratch",{"_index":4043,"title":{},"content":{"723":{"position":[[1824,8]]},"756":{"position":[[250,8]]},"1028":{"position":[[171,8]]}},"keywords":{}}],["scratch"",{"_index":5528,"title":{},"content":{"999":{"position":[[131,14]]}},"keywords":{}}],["scream",{"_index":4599,"title":{},"content":{"789":{"position":[[233,7]]},"791":{"position":[[89,7]]},"792":{"position":[[220,7]]},"1311":{"position":[[662,7],[741,8]]}},"keywords":{}}],["screen",{"_index":3216,"title":{},"content":{"500":{"position":[[170,7]]}},"keywords":{}}],["script",{"_index":1264,"title":{},"content":{"188":{"position":[[1742,6]]},"282":{"position":[[444,8]]},"301":{"position":[[204,7]]},"479":{"position":[[447,7]]},"602":{"position":[[332,7]]},"612":{"position":[[798,6],[1446,6]]},"666":{"position":[[414,7]]},"861":{"position":[[424,7],[449,6]]}},"keywords":{}}],["script.leverag",{"_index":1971,"title":{},"content":{"346":{"position":[[158,15]]}},"keywords":{}}],["sdk",{"_index":677,"title":{},"content":{"43":{"position":[[476,5]]},"412":{"position":[[947,3]]},"861":{"position":[[1112,3]]},"862":{"position":[[141,3],[204,3]]},"863":{"position":[[265,3]]},"1278":{"position":[[89,3],[182,3],[641,3]]}},"keywords":{}}],["seamless",{"_index":617,"title":{},"content":{"39":{"position":[[180,8]]},"65":{"position":[[970,8]]},"70":{"position":[[227,8]]},"82":{"position":[[95,8]]},"107":{"position":[[91,8]]},"113":{"position":[[146,8]]},"118":{"position":[[246,8]]},"125":{"position":[[292,8]]},"148":{"position":[[129,8]]},"153":{"position":[[361,8]]},"155":{"position":[[96,8]]},"186":{"position":[[219,8]]},"191":{"position":[[287,8]]},"221":{"position":[[276,8]]},"230":{"position":[[104,8]]},"240":{"position":[[316,8]]},"241":{"position":[[549,8]]},"267":{"position":[[434,8]]},"285":{"position":[[317,8]]},"288":{"position":[[259,8]]},"366":{"position":[[270,9]]},"437":{"position":[[222,8]]},"445":{"position":[[261,8],[1169,8]]},"446":{"position":[[275,8]]},"447":{"position":[[172,8]]},"483":{"position":[[1277,8]]},"489":{"position":[[113,8]]},"491":{"position":[[940,8]]},"502":{"position":[[1301,8]]},"504":{"position":[[325,8],[605,8]]},"510":{"position":[[731,8]]},"519":{"position":[[273,8]]},"530":{"position":[[101,8]]},"548":{"position":[[357,8]]},"608":{"position":[[355,8]]},"1132":{"position":[[1425,8]]}},"keywords":{}}],["seamlessli",{"_index":553,"title":{},"content":{"35":{"position":[[252,10]]},"47":{"position":[[1304,10]]},"72":{"position":[[47,10]]},"76":{"position":[[75,10]]},"89":{"position":[[309,10]]},"90":{"position":[[265,10]]},"94":{"position":[[36,10]]},"99":{"position":[[382,11]]},"110":{"position":[[145,11]]},"122":{"position":[[119,10]]},"133":{"position":[[108,10]]},"135":{"position":[[117,11]]},"157":{"position":[[72,10]]},"160":{"position":[[66,10]]},"164":{"position":[[96,10]]},"167":{"position":[[262,10]]},"173":{"position":[[1554,11],[2247,10],[2816,10]]},"174":{"position":[[530,10],[1396,10],[1918,11],[2245,10]]},"179":{"position":[[69,10]]},"183":{"position":[[190,10]]},"190":{"position":[[106,11]]},"222":{"position":[[63,10]]},"226":{"position":[[397,10]]},"237":{"position":[[210,10]]},"238":{"position":[[220,10]]},"263":{"position":[[266,11]]},"274":{"position":[[134,10]]},"280":{"position":[[372,11]]},"283":{"position":[[492,11]]},"286":{"position":[[6,10]]},"289":{"position":[[900,10]]},"292":{"position":[[114,10]]},"309":{"position":[[186,10]]},"313":{"position":[[48,10]]},"360":{"position":[[586,10]]},"364":{"position":[[154,10]]},"368":{"position":[[309,10]]},"380":{"position":[[39,10]]},"412":{"position":[[2525,10]]},"419":{"position":[[266,10]]},"445":{"position":[[1700,10],[2233,10]]},"446":{"position":[[1344,10]]},"487":{"position":[[369,10]]},"500":{"position":[[57,10],[731,10]]},"501":{"position":[[130,10]]},"502":{"position":[[166,10],[505,11]]},"510":{"position":[[158,10]]},"514":{"position":[[79,10]]},"516":{"position":[[76,10]]},"530":{"position":[[179,10]]},"535":{"position":[[963,10]]},"541":{"position":[[17,10]]},"544":{"position":[[139,11]]},"574":{"position":[[902,10]]},"575":{"position":[[549,10]]},"584":{"position":[[22,10]]},"595":{"position":[[1038,10]]},"604":{"position":[[139,11]]},"632":{"position":[[2699,10]]},"723":{"position":[[1027,10]]},"838":{"position":[[702,10]]},"912":{"position":[[185,10]]},"981":{"position":[[1386,10]]}},"keywords":{}}],["seamlessly.handl",{"_index":1919,"title":{},"content":{"321":{"position":[[214,17]]}},"keywords":{}}],["search",{"_index":1327,"title":{"394":{"position":[[0,9]]},"398":{"position":[[0,9]]},"722":{"position":[[9,6]]},"723":{"position":[[35,7]]},"724":{"position":[[24,7]]},"1023":{"position":[[18,7]]}},"content":{"205":{"position":[[227,8]]},"252":{"position":[[226,7]]},"263":{"position":[[16,9]]},"383":{"position":[[192,7],[224,6]]},"390":{"position":[[1217,7],[1692,6],[1919,6]]},"393":{"position":[[1138,6]]},"394":{"position":[[1747,6]]},"396":{"position":[[249,8],[649,7],[750,6]]},"398":{"position":[[69,8],[349,6],[565,6],[1906,6],[3027,6]]},"402":{"position":[[549,6],[1107,6],[1413,6],[1622,6],[2156,6],[2264,6],[2327,6]]},"408":{"position":[[3641,6],[4501,9],[4810,6]]},"427":{"position":[[969,8]]},"559":{"position":[[1233,9]]},"560":{"position":[[405,9]]},"566":{"position":[[270,8]]},"587":{"position":[[35,8]]},"696":{"position":[[649,6]]},"714":{"position":[[794,6]]},"723":{"position":[[11,6],[137,6],[208,6],[284,6],[392,6],[521,6],[684,6],[1152,6],[1197,6],[1353,6],[1844,6],[2131,6],[2183,9],[2219,8],[2306,9],[2515,6],[2573,6],[2776,6]]},"724":{"position":[[16,6],[653,8],[710,6],[1247,6],[1519,6],[1686,6]]},"749":{"position":[[46,6],[393,6],[520,6],[611,6],[764,6],[901,6],[1036,6],[1260,6],[1348,6],[1497,6],[1600,6],[1697,6],[1814,6],[1940,6],[2043,6],[2149,6],[2243,6],[2336,6],[2421,6],[2538,6],[2779,6],[2892,6],[3125,6],[3245,6],[3601,6],[3798,6],[3885,6],[3957,6],[4072,6],[4188,6],[4310,6],[4487,6],[4561,6],[4668,6],[4803,6],[4935,6],[5087,6],[5189,6],[5301,6],[5508,6],[6016,6],[6152,6],[6288,6],[6407,6],[6549,6],[6661,6],[6776,6],[6900,6],[7008,6],[7127,6],[7218,6],[7251,6],[7434,6],[7514,6],[7591,6],[7690,6],[7794,6],[7889,6],[7989,6],[8083,6],[8181,6],[8289,6],[8384,6],[8484,6],[8606,6],[8683,6],[8857,6],[9007,6],[9165,6],[9456,6],[9601,6],[9685,6],[9773,6],[9880,6],[9994,6],[10112,6],[10221,6],[10326,6],[10414,6],[10537,6],[10641,6],[10747,6],[10838,6],[10920,6],[11058,6],[11199,6],[11310,6],[11409,6],[11485,6],[11630,6],[11727,6],[11836,6],[12137,6],[12228,6],[12355,6],[12436,6],[12509,6],[12724,6],[12833,6],[12910,6],[13019,6],[13136,6],[13210,6],[13330,6],[13459,6],[13582,6],[13705,6],[13803,6],[13947,6],[14030,6],[14124,6],[14236,6],[14321,6],[14517,6],[14599,6],[14714,6],[14870,6],[15081,6],[15240,6],[15415,6],[15547,6],[15681,6],[15813,6],[15948,6],[16050,6],[16198,6],[16317,6],[16439,6],[16588,6],[16781,6],[16870,6],[16976,6],[17099,6],[17248,6],[17357,6],[17473,6],[17591,6],[17714,6],[17823,6],[17944,6],[18066,6],[18163,6],[18263,6],[18445,6],[18539,6],[18658,6],[18762,6],[18868,6],[18971,6],[19065,6],[19267,6],[19395,6],[19521,6],[19636,6],[19737,6],[19829,6],[19953,6],[20071,6],[20228,6],[20394,6],[20495,6],[20662,6],[20799,6],[20972,6],[21256,6],[21410,6],[21673,6],[21975,6],[22095,6],[22179,6],[22297,6],[22404,6],[22524,6],[22664,6],[22793,6],[22953,6],[23146,6],[23272,6],[23404,6],[23537,6],[23728,6],[23910,6],[24030,6],[24191,6],[24321,6],[24401,6]]},"793":{"position":[[1168,6]]},"1023":{"position":[[79,7],[169,8]]},"1065":{"position":[[195,6],[1214,6]]},"1072":{"position":[[1652,7],[1783,6],[2086,7],[2169,7],[2204,7],[2605,9]]},"1107":{"position":[[102,6]]},"1167":{"position":[[26,6]]},"1284":{"position":[[118,6]]},"1296":{"position":[[120,6]]}},"keywords":{}}],["search.us",{"_index":1561,"title":{},"content":{"252":{"position":[[282,10]]}},"keywords":{}}],["searchabl",{"_index":4052,"title":{},"content":{"724":{"position":[[803,10]]}},"keywords":{}}],["searchembed",{"_index":2399,"title":{},"content":{"398":{"position":[[954,17],[1564,17],[2240,17],[2717,17]]}},"keywords":{}}],["searchstr",{"_index":4062,"title":{},"content":{"724":{"position":[[1566,12]]}},"keywords":{}}],["second",{"_index":173,"title":{},"content":{"11":{"position":[[934,6]]},"392":{"position":[[3080,7]]},"394":{"position":[[1727,8]]},"398":{"position":[[3280,6]]},"412":{"position":[[10136,6]]},"460":{"position":[[518,6]]},"463":{"position":[[1210,7]]},"468":{"position":[[547,7]]},"571":{"position":[[1606,6]]},"612":{"position":[[2196,7]]},"653":{"position":[[765,8],[816,7]]},"656":{"position":[[264,7]]},"703":{"position":[[1007,6],[1376,7]]},"724":{"position":[[1704,6]]},"736":{"position":[[257,8]]},"739":{"position":[[79,7]]},"766":{"position":[[110,6]]},"818":{"position":[[174,7]]},"885":{"position":[[1674,6]]},"986":{"position":[[286,6]]},"988":{"position":[[1065,8]]},"996":{"position":[[523,8]]},"1300":{"position":[[938,7]]}},"keywords":{}}],["secondari",{"_index":59,"title":{},"content":{"4":{"position":[[63,9]]},"1079":{"position":[[15,9]]}},"keywords":{}}],["secondsit",{"_index":4701,"title":{},"content":{"816":{"position":[[362,9]]}},"keywords":{}}],["secret",{"_index":1900,"title":{},"content":{"315":{"position":[[666,8],[694,7]]},"551":{"position":[[265,9]]},"555":{"position":[[365,6],[602,6],[677,6]]},"564":{"position":[[719,8],[747,7]]},"638":{"position":[[557,8],[585,8]]},"717":{"position":[[1520,7],[1579,10]]},"1074":{"position":[[368,6]]},"1108":{"position":[[553,9]]}},"keywords":{}}],["secretdata",{"_index":3139,"title":{},"content":{"482":{"position":[[919,11],[982,14],[1107,10]]}},"keywords":{}}],["secretfield",{"_index":3352,"title":{},"content":{"554":{"position":[[1459,12],[1526,14]]},"555":{"position":[[339,12],[655,12]]},"638":{"position":[[703,12],[767,15]]}},"keywords":{}}],["secretinfo",{"_index":3438,"title":{},"content":{"564":{"position":[[848,11],[911,14]]}},"keywords":{}}],["secretss",{"_index":5970,"title":{},"content":{"1108":{"position":[[491,9]]}},"keywords":{}}],["section",{"_index":3231,"title":{},"content":{"502":{"position":[[1337,8]]},"617":{"position":[[448,7]]}},"keywords":{}}],["secur",{"_index":932,"title":{"290":{"position":[[33,6]]},"377":{"position":[[0,8]]},"482":{"position":[[0,8]]},"991":{"position":[[0,9]]},"1237":{"position":[[31,9]]}},"content":{"65":{"position":[[1666,6]]},"95":{"position":[[1,8]]},"139":{"position":[[231,6]]},"167":{"position":[[25,8],[192,6]]},"170":{"position":[[503,9]]},"195":{"position":[[28,9]]},"218":{"position":[[1,8],[268,8]]},"290":{"position":[[18,8],[124,6]]},"291":{"position":[[70,8],[521,7]]},"292":{"position":[[1,8],[358,7]]},"293":{"position":[[435,9]]},"294":{"position":[[16,8]]},"295":{"position":[[20,8],[130,6],[217,8],[346,8]]},"310":{"position":[[1,8],[382,9]]},"315":{"position":[[4,6]]},"318":{"position":[[627,7]]},"343":{"position":[[29,6]]},"365":{"position":[[1485,8]]},"377":{"position":[[48,8],[266,8],[314,6]]},"383":{"position":[[123,6]]},"407":{"position":[[1108,9]]},"408":{"position":[[1697,8]]},"412":{"position":[[12051,8],[12116,8]]},"450":{"position":[[198,8]]},"460":{"position":[[801,8]]},"482":{"position":[[121,6]]},"483":{"position":[[518,8],[1227,8]]},"506":{"position":[[75,8]]},"526":{"position":[[26,8]]},"544":{"position":[[291,6]]},"551":{"position":[[40,6],[206,6]]},"554":{"position":[[219,9],[1304,7]]},"556":{"position":[[1,6],[76,6],[249,8],[1537,6],[1572,6],[1771,6]]},"557":{"position":[[429,7]]},"586":{"position":[[110,8]]},"604":{"position":[[244,6]]},"616":{"position":[[857,8]]},"631":{"position":[[442,6]]},"644":{"position":[[521,6]]},"697":{"position":[[606,6]]},"709":{"position":[[733,8],[1095,8]]},"717":{"position":[[262,6]]},"718":{"position":[[85,7]]},"838":{"position":[[835,9]]},"860":{"position":[[15,7],[894,7]]},"897":{"position":[[503,8]]},"899":{"position":[[192,8]]},"901":{"position":[[467,8]]},"912":{"position":[[128,8],[712,8]]},"1112":{"position":[[602,8]]},"1206":{"position":[[633,8]]},"1237":{"position":[[78,6],[210,8]]},"1247":{"position":[[333,7],[506,7],[693,7]]},"1287":{"position":[[144,8]]},"1297":{"position":[[137,6]]}},"keywords":{}}],["securedata",{"_index":3350,"title":{},"content":{"554":{"position":[[1273,11]]}},"keywords":{}}],["securedb",{"_index":3713,"title":{},"content":{"638":{"position":[[455,11]]}},"keywords":{}}],["secureionicdb",{"_index":1898,"title":{},"content":{"315":{"position":[[563,16]]}},"keywords":{}}],["secureofflinedb",{"_index":3136,"title":{},"content":{"482":{"position":[[638,18]]}},"keywords":{}}],["securereactstorag",{"_index":3436,"title":{},"content":{"564":{"position":[[608,21]]}},"keywords":{}}],["securesetup",{"_index":3435,"title":{},"content":{"564":{"position":[[410,13]]}},"keywords":{}}],["securityrealtim",{"_index":5233,"title":{},"content":{"899":{"position":[[257,16]]}},"keywords":{}}],["see",{"_index":861,"title":{"422":{"position":[[0,3]]}},"content":{"57":{"position":[[301,3],[372,3]]},"58":{"position":[[325,3]]},"59":{"position":[[284,3]]},"301":{"position":[[375,3],[690,3]]},"304":{"position":[[442,3]]},"340":{"position":[[152,3]]},"347":{"position":[[481,3]]},"361":{"position":[[1001,4]]},"362":{"position":[[1552,3]]},"388":{"position":[[107,3]]},"394":{"position":[[1197,3]]},"408":{"position":[[4209,3]]},"411":{"position":[[4267,3]]},"412":{"position":[[5911,3],[12134,3]]},"415":{"position":[[64,3]]},"419":{"position":[[698,4]]},"420":{"position":[[43,3]]},"421":{"position":[[80,3],[614,3],[1075,3]]},"446":{"position":[[723,4]]},"464":{"position":[[842,3]]},"469":{"position":[[1289,3]]},"489":{"position":[[247,3]]},"491":{"position":[[748,3]]},"495":{"position":[[301,3],[888,3]]},"498":{"position":[[350,3]]},"544":{"position":[[260,4]]},"545":{"position":[[222,4]]},"560":{"position":[[622,4]]},"567":{"position":[[461,3]]},"591":{"position":[[636,3]]},"605":{"position":[[222,4]]},"620":{"position":[[395,3]]},"632":{"position":[[477,4]]},"724":{"position":[[1108,3]]},"749":{"position":[[194,3],[1168,3],[12663,3],[15354,3],[15518,3],[15652,3],[15784,3],[18368,3],[19173,3]]},"796":{"position":[[251,3]]},"805":{"position":[[224,3]]},"806":{"position":[[147,3]]},"831":{"position":[[543,3]]},"849":{"position":[[330,3]]},"890":{"position":[[883,3]]},"913":{"position":[[34,3],[206,3]]},"937":{"position":[[158,3]]},"938":{"position":[[137,3]]},"949":{"position":[[56,3]]},"950":{"position":[[202,3]]},"988":{"position":[[4764,3]]},"1009":{"position":[[315,4]]},"1036":{"position":[[88,3]]},"1081":{"position":[[96,3]]},"1097":{"position":[[533,4],[815,4]]},"1108":{"position":[[152,3]]},"1137":{"position":[[234,3]]},"1191":{"position":[[547,3]]},"1271":{"position":[[988,3]]}},"keywords":{}}],["seed",{"_index":1331,"title":{},"content":{"206":{"position":[[110,4]]}},"keywords":{}}],["seek",{"_index":1433,"title":{},"content":{"241":{"position":[[685,7]]},"295":{"position":[[202,7]]},"318":{"position":[[604,7]]}},"keywords":{}}],["seem",{"_index":2345,"title":{},"content":{"396":{"position":[[1218,5]]}},"keywords":{}}],["seemingli",{"_index":2056,"title":{},"content":{"358":{"position":[[153,9]]}},"keywords":{}}],["seen",{"_index":1863,"title":{},"content":{"304":{"position":[[399,4]]},"412":{"position":[[6546,4]]},"421":{"position":[[963,4]]},"701":{"position":[[200,4],[837,4]]},"839":{"position":[[162,4]]},"1116":{"position":[[54,4]]}},"keywords":{}}],["seen/edit",{"_index":5958,"title":{},"content":{"1105":{"position":[[986,11]]}},"keywords":{}}],["select",{"_index":2136,"title":{},"content":{"373":{"position":[[673,9]]},"525":{"position":[[656,6]]},"705":{"position":[[721,7]]},"749":{"position":[[10528,8]]},"759":{"position":[[1435,11]]},"821":{"position":[[1023,10]]},"829":{"position":[[247,10]]},"1215":{"position":[[333,6],[661,6]]},"1250":{"position":[[96,6]]},"1315":{"position":[[379,6]]},"1321":{"position":[[260,6]]}},"keywords":{}}],["selector",{"_index":804,"title":{},"content":{"52":{"position":[[409,9],[499,9],[646,9]]},"54":{"position":[[157,9]]},"77":{"position":[[232,9]]},"103":{"position":[[272,9]]},"130":{"position":[[512,9]]},"143":{"position":[[452,9],[633,9]]},"234":{"position":[[332,9]]},"276":{"position":[[429,9]]},"398":{"position":[[1048,9],[1210,9],[2348,9]]},"480":{"position":[[731,9]]},"502":{"position":[[938,9]]},"518":{"position":[[405,9]]},"539":{"position":[[409,9],[499,9],[646,9]]},"555":{"position":[[498,9]]},"556":{"position":[[840,9]]},"571":{"position":[[879,9]]},"580":{"position":[[506,9]]},"599":{"position":[[436,9],[526,9],[677,9]]},"662":{"position":[[2710,9],[2798,9]]},"681":{"position":[[424,8],[546,8],[659,8],[708,9],[774,8],[835,8]]},"682":{"position":[[348,9],[405,9],[462,9],[519,9]]},"683":{"position":[[758,9]]},"710":{"position":[[2017,9],[2105,9]]},"749":{"position":[[2681,8]]},"772":{"position":[[1034,9]]},"796":{"position":[[434,9],[859,9],[1152,9]]},"797":{"position":[[271,9]]},"798":{"position":[[566,9]]},"820":{"position":[[561,9],[613,9]]},"825":{"position":[[697,9]]},"829":{"position":[[2413,9],[3329,9]]},"838":{"position":[[2924,9],[3012,9]]},"950":{"position":[[279,9]]},"951":{"position":[[143,9]]},"1055":{"position":[[68,10],[211,9]]},"1056":{"position":[[122,9],[218,9]]},"1059":{"position":[[246,9]]},"1060":{"position":[[114,9]]},"1061":{"position":[[115,9]]},"1062":{"position":[[171,9]]},"1063":{"position":[[129,9],[233,9]]},"1065":{"position":[[229,9],[801,9],[1055,9],[1299,9]]},"1066":{"position":[[372,9]]},"1067":{"position":[[311,9],[806,8],[886,8],[1305,9],[1572,9],[1984,9],[2128,9]]},"1072":{"position":[[2484,9],[2662,9]]},"1102":{"position":[[659,9],[1048,9]]},"1158":{"position":[[698,9]]},"1249":{"position":[[483,9]]},"1252":{"position":[[218,8],[339,9]]}},"keywords":{}}],["self",{"_index":238,"title":{"1095":{"position":[[6,4]]}},"content":{"14":{"position":[[1109,4]]},"174":{"position":[[3046,4]]},"840":{"position":[[566,4]]},"861":{"position":[[42,4],[202,4],[267,4]]},"862":{"position":[[944,4]]},"870":{"position":[[220,4]]},"896":{"position":[[24,4]]},"1124":{"position":[[2060,4]]},"1227":{"position":[[32,4]]},"1265":{"position":[[25,4]]},"1313":{"position":[[77,4]]},"1319":{"position":[[214,4],[384,4]]}},"keywords":{}}],["sell",{"_index":475,"title":{},"content":{"29":{"position":[[114,7]]},"412":{"position":[[2851,4]]}},"keywords":{}}],["semant",{"_index":2186,"title":{},"content":{"390":{"position":[[401,8]]},"689":{"position":[[165,10]]}},"keywords":{}}],["semi",{"_index":1637,"title":{"1192":{"position":[[14,4]]}},"content":{"276":{"position":[[233,4]]},"975":{"position":[[180,4]]},"1192":{"position":[[245,4],[693,4]]}},"keywords":{}}],["send",{"_index":1339,"title":{"616":{"position":[[0,7]]},"1220":{"position":[[0,7]]}},"content":{"208":{"position":[[198,7]]},"255":{"position":[[154,4],[1109,4]]},"392":{"position":[[3431,5],[3731,4]]},"407":{"position":[[117,7]]},"408":{"position":[[2521,4],[3869,4]]},"411":{"position":[[514,5]]},"415":{"position":[[464,7]]},"458":{"position":[[1105,4],[1192,4]]},"460":{"position":[[659,7]]},"461":{"position":[[87,4]]},"463":{"position":[[909,7],[1001,4]]},"464":{"position":[[850,7]]},"466":{"position":[[286,7],[481,7]]},"476":{"position":[[251,5]]},"481":{"position":[[779,4]]},"487":{"position":[[36,7]]},"610":{"position":[[451,5]]},"611":{"position":[[447,4],[753,7]]},"612":{"position":[[339,7],[456,4],[550,7],[601,4],[2174,4]]},"613":{"position":[[216,7]]},"616":{"position":[[43,4],[112,4],[247,7],[403,4],[569,7],[675,4],[1090,7],[1177,4]]},"618":{"position":[[602,4]]},"621":{"position":[[290,4],[561,4]]},"622":{"position":[[191,7]]},"626":{"position":[[528,4]]},"670":{"position":[[111,7]]},"704":{"position":[[569,4]]},"711":{"position":[[600,4]]},"736":{"position":[[218,5],[385,4]]},"780":{"position":[[261,7],[555,7]]},"784":{"position":[[209,4]]},"846":{"position":[[1215,7]]},"849":{"position":[[171,7]]},"875":{"position":[[3583,4],[7890,4]]},"876":{"position":[[247,4]]},"882":{"position":[[16,4],[165,7]]},"885":{"position":[[354,7]]},"886":{"position":[[1501,4],[2204,4],[3033,4],[5097,4]]},"888":{"position":[[872,4]]},"890":{"position":[[367,7]]},"982":{"position":[[408,7]]},"983":{"position":[[443,4]]},"984":{"position":[[233,4]]},"986":{"position":[[1283,4]]},"987":{"position":[[449,7]]},"988":{"position":[[3234,4],[4979,7],[5290,5]]},"990":{"position":[[6,7],[71,4],[654,4]]},"993":{"position":[[244,4]]},"996":{"position":[[336,7]]},"1068":{"position":[[383,4]]},"1102":{"position":[[1221,4]]},"1174":{"position":[[586,4]]},"1218":{"position":[[176,6],[517,4],[864,4]]},"1220":{"position":[[40,4]]},"1230":{"position":[[140,7]]},"1239":{"position":[[388,7]]},"1250":{"position":[[73,4],[228,4]]},"1270":{"position":[[155,7]]},"1276":{"position":[[270,7]]},"1308":{"position":[[328,4]]},"1317":{"position":[[148,5]]}},"keywords":{}}],["send(msg",{"_index":6248,"title":{},"content":{"1218":{"position":[[502,9],[850,10]]}},"keywords":{}}],["sender",{"_index":4451,"title":{},"content":{"751":{"position":[[1249,6]]}},"keywords":{}}],["sendercountri",{"_index":4449,"title":{},"content":{"751":{"position":[[1161,15]]}},"keywords":{}}],["sendev",{"_index":3600,"title":{},"content":{"612":{"position":[[2004,9]]}},"keywords":{}}],["sendevent(messag",{"_index":3609,"title":{},"content":{"612":{"position":[[2335,19]]}},"keywords":{}}],["sens",{"_index":187,"title":{},"content":{"13":{"position":[[88,5],[281,5]]},"399":{"position":[[583,5]]},"402":{"position":[[612,5]]},"453":{"position":[[683,5]]},"454":{"position":[[580,5]]},"462":{"position":[[981,5]]},"614":{"position":[[728,5]]},"617":{"position":[[927,5]]},"682":{"position":[[141,5]]},"703":{"position":[[1098,5]]},"798":{"position":[[736,5]]},"800":{"position":[[50,5]]},"815":{"position":[[333,6]]},"821":{"position":[[210,5],[433,5],[756,5]]},"932":{"position":[[323,5]]},"1066":{"position":[[542,5]]},"1093":{"position":[[120,5]]},"1194":{"position":[[104,5]]},"1213":{"position":[[424,5]]},"1249":{"position":[[136,6]]}},"keywords":{}}],["sensit",{"_index":863,"title":{},"content":{"57":{"position":[[348,9]]},"65":{"position":[[1596,9]]},"95":{"position":[[72,9],[230,9]]},"139":{"position":[[117,9]]},"167":{"position":[[162,9]]},"173":{"position":[[1277,9]]},"195":{"position":[[146,9]]},"218":{"position":[[97,9]]},"290":{"position":[[27,9]]},"291":{"position":[[235,9]]},"310":{"position":[[52,9]]},"343":{"position":[[108,9]]},"377":{"position":[[207,9]]},"396":{"position":[[105,9],[1828,9]]},"410":{"position":[[553,9]]},"479":{"position":[[268,9]]},"482":{"position":[[34,9],[1217,9]]},"483":{"position":[[297,9]]},"506":{"position":[[101,9]]},"526":{"position":[[62,9],[255,9]]},"550":{"position":[[176,9]]},"555":{"position":[[982,9]]},"564":{"position":[[57,9]]},"586":{"position":[[27,9]]},"638":{"position":[[48,9]]},"912":{"position":[[284,9]]}},"keywords":{}}],["sensor",{"_index":3459,"title":{},"content":{"569":{"position":[[677,7]]}},"keywords":{}}],["sent",{"_index":2589,"title":{"609":{"position":[[21,4]]},"612":{"position":[[16,4]]}},"content":{"410":{"position":[[578,4]]},"450":{"position":[[368,4]]},"491":{"position":[[636,4],[1675,4]]},"612":{"position":[[8,4],[392,4]]},"613":{"position":[[322,4]]},"616":{"position":[[542,4]]},"619":{"position":[[268,4]]},"620":{"position":[[49,4]]},"621":{"position":[[196,4]]},"622":{"position":[[209,4]]},"623":{"position":[[179,4]]},"624":{"position":[[129,4]]},"628":{"position":[[109,4]]},"698":{"position":[[1773,4],[1856,4]]},"875":{"position":[[7048,4],[7976,4]]},"886":{"position":[[332,4]]},"988":{"position":[[5049,4]]},"1066":{"position":[[31,4]]}},"keywords":{}}],["sentenc",{"_index":6206,"title":{},"content":{"1208":{"position":[[1125,8]]}},"keywords":{}}],["seo",{"_index":1436,"title":{"243":{"position":[[0,3]]},"244":{"position":[[0,4]]},"245":{"position":[[4,4]]}},"content":{},"keywords":{}}],["separ",{"_index":1141,"title":{},"content":{"145":{"position":[[18,10]]},"172":{"position":[[249,8]]},"328":{"position":[[160,8]]},"392":{"position":[[2055,8],[2583,8]]},"445":{"position":[[2318,8]]},"460":{"position":[[574,8],[843,8]]},"476":{"position":[[91,8]]},"487":{"position":[[46,8],[447,8]]},"801":{"position":[[374,8]]},"829":{"position":[[316,10],[1113,8]]},"1007":{"position":[[276,8]]},"1022":{"position":[[407,8]]},"1072":{"position":[[587,8]]},"1078":{"position":[[423,9],[476,10]]},"1093":{"position":[[308,9]]}},"keywords":{}}],["sequenc",{"_index":3901,"title":{},"content":{"689":{"position":[[403,8]]}},"keywords":{}}],["sequenti",{"_index":2350,"title":{},"content":{"396":{"position":[[1608,10]]}},"keywords":{}}],["seri",{"_index":4523,"title":{},"content":{"767":{"position":[[114,6],[218,6],[319,6],[740,6]]},"768":{"position":[[97,6],[179,6],[276,6],[748,6]]},"769":{"position":[[106,6],[192,6],[293,6],[711,6]]}},"keywords":{}}],["serial",{"_index":2036,"title":{"426":{"position":[[45,14]]}},"content":{"356":{"position":[[342,6]]},"426":{"position":[[124,14]]},"464":{"position":[[937,11]]},"759":{"position":[[879,6]]},"1194":{"position":[[530,9],[603,9],[642,6]]}},"keywords":{}}],["seriou",{"_index":2578,"title":{},"content":{"408":{"position":[[5519,7]]}},"keywords":{}}],["serv",{"_index":1180,"title":{},"content":{"162":{"position":[[64,5]]},"173":{"position":[[57,6]]},"216":{"position":[[25,5]]},"267":{"position":[[1129,6]]},"333":{"position":[[171,5]]},"412":{"position":[[8373,6]]},"432":{"position":[[20,6]]},"441":{"position":[[54,6]]},"461":{"position":[[462,5]]},"479":{"position":[[500,5]]},"502":{"position":[[662,5]]},"624":{"position":[[1512,5]]},"875":{"position":[[740,6]]},"1090":{"position":[[16,5],[211,7]]},"1100":{"position":[[138,6]]},"1123":{"position":[[309,7]]},"1151":{"position":[[157,6]]},"1178":{"position":[[156,6]]},"1210":{"position":[[526,6]]},"1227":{"position":[[382,6]]},"1265":{"position":[[375,6]]},"1320":{"position":[[880,6]]}},"keywords":{}}],["server",{"_index":240,"title":{"69":{"position":[[14,6]]},"100":{"position":[[14,6]]},"132":{"position":[[49,8]]},"163":{"position":[[49,8]]},"190":{"position":[[49,8]]},"202":{"position":[[22,6]]},"288":{"position":[[50,8]]},"337":{"position":[[49,8]]},"477":{"position":[[11,6]]},"491":{"position":[[19,7]]},"525":{"position":[[49,8]]},"582":{"position":[[49,8]]},"609":{"position":[[14,6]]},"612":{"position":[[9,6]]},"623":{"position":[[16,6]]},"708":{"position":[[0,6]]},"861":{"position":[[23,7]]},"874":{"position":[[31,6]]},"877":{"position":[[5,6]]},"885":{"position":[[30,7]]},"892":{"position":[[23,7]]},"893":{"position":[[25,7]]},"902":{"position":[[52,6]]},"906":{"position":[[10,7]]},"986":{"position":[[19,7]]},"1096":{"position":[[5,6]]},"1107":{"position":[[0,6]]},"1108":{"position":[[0,6]]},"1219":{"position":[[23,7]]},"1250":{"position":[[25,8]]},"1317":{"position":[[0,6]]}},"content":{"14":{"position":[[1129,6]]},"23":{"position":[[23,6],[254,6],[285,6]]},"26":{"position":[[193,8]]},"29":{"position":[[197,7]]},"37":{"position":[[64,6]]},"38":{"position":[[312,6]]},"43":{"position":[[160,6]]},"46":{"position":[[344,6],[616,7]]},"65":{"position":[[357,7]]},"66":{"position":[[251,6]]},"67":{"position":[[46,6]]},"69":{"position":[[1,6]]},"70":{"position":[[33,6]]},"82":{"position":[[149,7]]},"87":{"position":[[136,6]]},"91":{"position":[[129,6],[226,7]]},"92":{"position":[[118,6]]},"93":{"position":[[124,7]]},"98":{"position":[[47,6]]},"99":{"position":[[66,6],[136,7]]},"100":{"position":[[1,6]]},"101":{"position":[[44,6]]},"113":{"position":[[226,8]]},"122":{"position":[[225,6]]},"123":{"position":[[73,8]]},"132":{"position":[[55,6],[245,6]]},"133":{"position":[[219,6]]},"135":{"position":[[93,6],[208,7]]},"147":{"position":[[60,8]]},"151":{"position":[[264,7]]},"153":{"position":[[411,8]]},"157":{"position":[[218,6]]},"158":{"position":[[69,8]]},"164":{"position":[[358,7]]},"165":{"position":[[114,8]]},"172":{"position":[[267,6]]},"173":{"position":[[296,6],[1748,7],[2017,6]]},"174":{"position":[[3058,8]]},"181":{"position":[[337,8]]},"183":{"position":[[226,6]]},"184":{"position":[[189,8]]},"190":{"position":[[98,7]]},"191":{"position":[[182,6]]},"192":{"position":[[116,8]]},"202":{"position":[[156,7]]},"208":{"position":[[85,8]]},"209":{"position":[[779,6],[1073,6]]},"210":{"position":[[748,6]]},"217":{"position":[[165,6]]},"220":{"position":[[111,6]]},"224":{"position":[[164,6],[263,6]]},"225":{"position":[[30,6]]},"226":{"position":[[62,6]]},"227":{"position":[[28,6]]},"228":{"position":[[1,6]]},"238":{"position":[[141,8]]},"249":{"position":[[108,6],[475,8]]},"261":{"position":[[39,7],[205,7],[569,6],[1168,6]]},"262":{"position":[[546,6]]},"279":{"position":[[158,8]]},"280":{"position":[[365,6]]},"288":{"position":[[48,7],[302,8]]},"289":{"position":[[140,8],[577,8],[822,7],[1784,7]]},"293":{"position":[[284,7]]},"318":{"position":[[689,7]]},"321":{"position":[[296,7],[323,6]]},"322":{"position":[[263,6]]},"325":{"position":[[132,8]]},"327":{"position":[[268,6]]},"338":{"position":[[186,7]]},"340":{"position":[[56,6],[72,6]]},"357":{"position":[[554,6]]},"359":{"position":[[37,7]]},"360":{"position":[[513,7]]},"365":{"position":[[944,6],[1096,6],[1235,6],[1309,7],[1525,7],[1597,7]]},"367":{"position":[[148,6]]},"369":{"position":[[1089,8]]},"370":{"position":[[199,6],[292,6]]},"375":{"position":[[336,8]]},"381":{"position":[[451,6]]},"384":{"position":[[160,6]]},"399":{"position":[[4,6],[90,8]]},"400":{"position":[[774,6]]},"407":{"position":[[97,7],[576,6]]},"408":{"position":[[2757,6],[5341,7]]},"410":{"position":[[263,6],[597,8],[812,6],[1746,6],[2010,7],[2104,6]]},"411":{"position":[[9,6],[194,6],[581,7],[698,6],[1052,6],[1483,6],[2517,6],[5164,8]]},"412":{"position":[[1067,7],[2013,6],[2211,6],[4303,7],[5234,6],[5293,6],[5803,8],[7771,6],[8322,6],[8354,6],[8852,6],[8870,7],[9069,6],[9561,7],[9768,6],[10428,8],[10829,6],[10939,6],[11155,6],[11216,6],[12159,7],[12474,6],[12966,6],[13312,6],[14128,6]]},"414":{"position":[[206,6],[345,6]]},"415":{"position":[[304,7]]},"416":{"position":[[233,6],[351,6],[482,6]]},"421":{"position":[[688,6]]},"422":{"position":[[195,6]]},"424":{"position":[[466,6]]},"444":{"position":[[655,7]]},"445":{"position":[[714,6]]},"450":{"position":[[404,7]]},"455":{"position":[[229,6]]},"457":{"position":[[179,6]]},"461":{"position":[[99,6],[293,6]]},"474":{"position":[[31,7],[248,6]]},"476":{"position":[[28,6],[244,6]]},"477":{"position":[[67,7],[252,6]]},"481":{"position":[[58,6],[154,6],[755,6],[800,6]]},"483":{"position":[[166,6],[858,6]]},"486":{"position":[[116,6]]},"487":{"position":[[7,6],[152,6],[242,6]]},"489":{"position":[[574,6]]},"490":{"position":[[134,7]]},"491":{"position":[[315,6],[362,6],[629,6],[687,6],[1558,6],[1668,6]]},"495":{"position":[[352,7],[376,6],[508,6],[534,6]]},"496":{"position":[[15,6],[84,6],[638,6]]},"497":{"position":[[354,6],[831,6]]},"504":{"position":[[583,7],[659,8],[861,8],[993,8],[1473,6]]},"514":{"position":[[252,8]]},"517":{"position":[[116,8]]},"525":{"position":[[98,6],[196,6],[492,8]]},"534":{"position":[[597,6],[660,6]]},"556":{"position":[[1676,7]]},"570":{"position":[[803,6]]},"571":{"position":[[571,9]]},"574":{"position":[[420,6],[805,7]]},"575":{"position":[[380,6],[513,6]]},"582":{"position":[[206,7],[668,6],[701,6]]},"584":{"position":[[166,7]]},"594":{"position":[[595,6],[658,6]]},"610":{"position":[[57,6],[151,6],[283,6],[357,6],[420,6],[722,6]]},"611":{"position":[[116,7],[161,7],[778,6],[804,10],[881,9]]},"612":{"position":[[1,6],[57,6],[177,6],[359,7],[385,6],[786,6],[1109,6],[1428,6],[2322,9]]},"613":{"position":[[110,8]]},"614":{"position":[[219,6],[622,6],[660,6],[883,6]]},"616":{"position":[[96,6],[445,6],[535,6],[604,7],[902,6]]},"617":{"position":[[99,6],[591,7],[673,6],[742,6],[1083,6],[2004,6],[2303,6]]},"618":{"position":[[617,7],[662,7]]},"619":{"position":[[147,6],[261,6]]},"620":{"position":[[42,6],[168,6],[360,6]]},"621":{"position":[[239,6],[316,6],[545,6]]},"622":{"position":[[170,6],[370,6],[536,6]]},"623":{"position":[[92,6],[256,6],[496,6],[744,6]]},"624":{"position":[[21,6],[122,6],[440,6],[523,6],[945,6]]},"626":{"position":[[99,6],[196,6],[1193,7]]},"628":{"position":[[102,6]]},"630":{"position":[[72,6],[441,7],[786,6]]},"632":{"position":[[210,7],[312,6],[979,6],[2019,6],[2315,6],[2460,6],[2570,6],[2717,6]]},"634":{"position":[[240,6],[433,6]]},"640":{"position":[[544,6]]},"661":{"position":[[1762,6]]},"696":{"position":[[64,6],[574,6],[1772,7]]},"698":{"position":[[163,7],[732,7],[1706,7],[1785,6]]},"703":{"position":[[1055,6]]},"708":{"position":[[215,6]]},"711":{"position":[[2076,7],[2205,7]]},"723":{"position":[[569,6]]},"736":{"position":[[205,6],[504,7]]},"751":{"position":[[1265,6]]},"756":{"position":[[317,7]]},"772":{"position":[[431,7]]},"775":{"position":[[130,6]]},"778":{"position":[[133,7],[251,6]]},"780":{"position":[[453,7],[730,6]]},"781":{"position":[[371,6],[465,6]]},"782":{"position":[[94,6],[476,7]]},"784":{"position":[[471,6]]},"785":{"position":[[147,7]]},"793":{"position":[[861,6]]},"829":{"position":[[2888,6]]},"837":{"position":[[85,6],[921,7]]},"849":{"position":[[863,6]]},"851":{"position":[[110,6],[278,6]]},"854":{"position":[[1422,6]]},"860":{"position":[[43,6]]},"861":{"position":[[65,7],[1683,6],[1882,7]]},"862":{"position":[[38,7]]},"865":{"position":[[166,6]]},"866":{"position":[[809,8]]},"872":{"position":[[145,6],[186,7],[246,7],[291,6],[519,6],[671,6],[771,7],[1670,6],[2136,7],[3029,6],[3245,6],[3554,7],[3945,8],[4388,7]]},"875":{"position":[[666,6],[699,6],[1530,6],[1762,6],[1870,6],[1970,6],[3013,6],[3614,7],[3789,7],[3908,6],[4144,6],[4897,6],[6772,6],[6854,6],[7041,6],[7124,6],[7904,6],[7969,6],[8927,6]]},"876":{"position":[[100,7],[221,7]]},"878":{"position":[[17,6],[57,6],[245,8],[359,6],[441,7]]},"879":{"position":[[36,6],[323,6]]},"880":{"position":[[67,6]]},"881":{"position":[[128,6],[331,7]]},"882":{"position":[[9,6],[223,6]]},"885":{"position":[[8,6]]},"886":{"position":[[1829,7],[2216,7],[2914,6],[3334,7],[4979,6]]},"888":{"position":[[649,6]]},"889":{"position":[[83,6]]},"890":{"position":[[648,7],[1034,6]]},"892":{"position":[[229,6],[351,6]]},"893":{"position":[[347,6]]},"896":{"position":[[36,6]]},"897":{"position":[[597,8]]},"898":{"position":[[1825,6],[2853,7]]},"901":{"position":[[197,6],[684,6]]},"902":{"position":[[41,6],[339,6],[469,8],[599,6],[849,6]]},"903":{"position":[[70,7],[212,6],[310,6],[727,6]]},"904":{"position":[[2613,6],[2644,6],[2726,6]]},"906":{"position":[[82,6],[116,6],[219,6],[289,6],[450,6],[494,6],[657,6],[794,6],[1078,7]]},"907":{"position":[[73,6]]},"981":{"position":[[22,7]]},"983":{"position":[[105,6],[956,6]]},"984":{"position":[[128,6]]},"985":{"position":[[348,6]]},"987":{"position":[[31,7]]},"988":{"position":[[448,7],[487,6],[2486,7],[3680,6],[5042,6],[5934,7]]},"990":{"position":[[1070,6]]},"996":{"position":[[455,6]]},"1002":{"position":[[972,6]]},"1005":{"position":[[217,6]]},"1006":{"position":[[303,6]]},"1007":{"position":[[478,6]]},"1024":{"position":[[70,7]]},"1080":{"position":[[1053,6]]},"1087":{"position":[[92,6],[124,7]]},"1088":{"position":[[39,7],[105,6],[317,6]]},"1089":{"position":[[30,6]]},"1090":{"position":[[1190,6]]},"1091":{"position":[[19,6]]},"1092":{"position":[[37,7],[74,6],[213,7],[337,6]]},"1093":{"position":[[318,7],[527,7]]},"1094":{"position":[[309,7],[343,6]]},"1095":{"position":[[39,7],[235,7],[348,6]]},"1097":{"position":[[53,6],[90,6],[171,6],[248,7],[322,7],[868,6]]},"1100":{"position":[[343,6],[835,6],[931,6],[993,7]]},"1101":{"position":[[87,6],[150,6],[254,6],[574,6],[732,6]]},"1102":{"position":[[1214,6]]},"1103":{"position":[[17,6],[107,6]]},"1104":{"position":[[67,6]]},"1105":{"position":[[127,7],[274,7],[416,7]]},"1106":{"position":[[328,7]]},"1107":{"position":[[167,7]]},"1108":{"position":[[107,7],[323,6],[518,6],[667,6]]},"1109":{"position":[[58,7]]},"1110":{"position":[[46,6]]},"1112":{"position":[[13,6],[536,6]]},"1123":{"position":[[627,6]]},"1124":{"position":[[1304,6],[1342,6],[2078,7]]},"1133":{"position":[[245,6]]},"1135":{"position":[[189,7]]},"1148":{"position":[[411,6]]},"1149":{"position":[[1272,7]]},"1188":{"position":[[18,7]]},"1191":{"position":[[90,6]]},"1196":{"position":[[162,7]]},"1198":{"position":[[1443,6],[1581,7],[1716,6]]},"1213":{"position":[[487,7]]},"1219":{"position":[[97,7],[451,6],[618,6]]},"1247":{"position":[[271,6],[626,6]]},"1250":{"position":[[61,7],[139,6],[154,6]]},"1295":{"position":[[43,6],[284,6],[355,7],[503,8]]},"1301":{"position":[[360,6]]},"1304":{"position":[[471,7],[669,8],[731,7],[890,6],[1017,7],[1817,6]]},"1307":{"position":[[395,6]]},"1308":{"position":[[145,7],[621,6]]},"1313":{"position":[[8,6],[245,6]]},"1314":{"position":[[327,8],[628,7]]},"1315":{"position":[[818,6]]},"1316":{"position":[[68,7],[2556,8],[2624,6]]},"1317":{"position":[[66,7],[182,7],[198,6]]},"1324":{"position":[[738,8]]}},"keywords":{}}],["server'",{"_index":3552,"title":{},"content":{"610":{"position":[[547,8]]}},"keywords":{}}],["server.addreplicationendpoint",{"_index":4965,"title":{},"content":{"872":{"position":[[3367,31]]},"1100":{"position":[[650,31]]},"1101":{"position":[[462,31]]},"1103":{"position":[[305,31]]},"1105":{"position":[[731,31]]},"1106":{"position":[[669,31]]},"1108":{"position":[[399,31]]}},"keywords":{}}],["server.addrestendpoint",{"_index":5935,"title":{},"content":{"1102":{"position":[[342,24]]}},"keywords":{}}],["server.conflict",{"_index":3172,"title":{},"content":{"491":{"position":[[1304,15]]}},"keywords":{}}],["server.graphql",{"_index":2157,"title":{},"content":{"381":{"position":[[223,14]]}},"keywords":{}}],["server.handl",{"_index":1918,"title":{},"content":{"321":{"position":[[182,13]]}},"keywords":{}}],["server.j",{"_index":6250,"title":{},"content":{"1219":{"position":[[253,9]]}},"keywords":{}}],["server.l",{"_index":1573,"title":{},"content":{"255":{"position":[[185,11]]}},"keywords":{}}],["server.no",{"_index":3410,"title":{},"content":{"559":{"position":[[1442,9]]}},"keywords":{}}],["server.push",{"_index":1338,"title":{},"content":{"208":{"position":[[185,12]]},"255":{"position":[[141,12]]}},"keywords":{}}],["server.start",{"_index":4968,"title":{},"content":{"872":{"position":[[3568,15]]}},"keywords":{}}],["server.t",{"_index":4946,"title":{},"content":{"872":{"position":[[835,9],[1530,9],[2270,9],[3090,9]]},"875":{"position":[[788,9],[2011,9],[4257,9],[7211,9]]},"1101":{"position":[[435,9]]}},"keywords":{}}],["server/blob/master/package.json",{"_index":5922,"title":{},"content":{"1097":{"position":[[569,31]]}},"keywords":{}}],["server/databas",{"_index":3164,"title":{},"content":{"491":{"position":[[206,15]]}},"keywords":{}}],["server/plugins/adapt",{"_index":4962,"title":{},"content":{"872":{"position":[[3206,22]]},"1097":{"position":[[649,22]]}},"keywords":{}}],["server/plugins/cli",{"_index":5940,"title":{},"content":{"1102":{"position":[[888,21]]}},"keywords":{}}],["server/plugins/repl",{"_index":4972,"title":{},"content":{"872":{"position":[[3918,26]]},"878":{"position":[[218,26]]}},"keywords":{}}],["server/plugins/serv",{"_index":4960,"title":{},"content":{"872":{"position":[[3137,23]]},"1097":{"position":[[368,23]]},"1098":{"position":[[208,23]]},"1099":{"position":[[190,23]]}},"keywords":{}}],["serverbasedon",{"_index":6253,"title":{},"content":{"1219":{"position":[[657,13]]}},"keywords":{}}],["serverbasedondatabas",{"_index":6252,"title":{},"content":{"1219":{"position":[[486,21]]},"1220":{"position":[[165,21]]}},"keywords":{}}],["serverdata",{"_index":5647,"title":{},"content":{"1024":{"position":[[433,10],[528,10]]}},"keywords":{}}],["serverdatacollect",{"_index":5645,"title":{},"content":{"1024":{"position":[[277,21]]}},"keywords":{}}],["serverdatacollection.upsert",{"_index":5648,"title":{},"content":{"1024":{"position":[[475,29]]}},"keywords":{}}],["serverdb",{"_index":4954,"title":{},"content":{"872":{"position":[[1738,11]]}},"keywords":{}}],["servergraphql",{"_index":6081,"title":{},"content":{"1149":{"position":[[183,13]]}},"keywords":{}}],["serveronlyfield",{"_index":5968,"title":{},"content":{"1108":{"position":[[39,16],[206,16],[256,16],[530,17],[635,17]]}},"keywords":{}}],["servers.custom",{"_index":2158,"title":{},"content":{"381":{"position":[[336,14]]}},"keywords":{}}],["servers.two",{"_index":5182,"title":{},"content":{"896":{"position":[[100,11]]}},"keywords":{}}],["serverst",{"_index":5176,"title":{},"content":{"892":{"position":[[242,11]]},"906":{"position":[[974,11]]}},"keywords":{}}],["serverstate.clos",{"_index":5178,"title":{},"content":{"892":{"position":[[364,20]]}},"keywords":{}}],["servertimestamp",{"_index":4875,"title":{},"content":{"854":{"position":[[1466,17],[1630,17]]},"857":{"position":[[161,15],[230,15],[404,16],[421,17]]},"858":{"position":[[600,16]]}},"keywords":{}}],["servertimestampfield",{"_index":4332,"title":{},"content":{"749":{"position":[[15152,20]]},"854":{"position":[[1502,20],[1608,21]]}},"keywords":{}}],["server—rxdb",{"_index":3424,"title":{},"content":{"561":{"position":[[92,11]]}},"keywords":{}}],["server’",{"_index":5210,"title":{},"content":{"898":{"position":[[1863,8]]}},"keywords":{}}],["servic",{"_index":423,"title":{"145":{"position":[[12,8]]}},"content":{"26":{"position":[[27,7]]},"36":{"position":[[446,7]]},"39":{"position":[[426,7]]},"51":{"position":[[968,8]]},"145":{"position":[[111,7],[177,7]]},"152":{"position":[[116,9]]},"249":{"position":[[62,8]]},"380":{"position":[[348,7]]},"412":{"position":[[2861,8],[12016,7]]},"417":{"position":[[389,7]]},"418":{"position":[[426,8],[656,8]]},"500":{"position":[[581,7]]},"839":{"position":[[199,8]]},"840":{"position":[[128,7]]},"871":{"position":[[664,10]]},"897":{"position":[[564,7]]},"898":{"position":[[2877,7]]},"1219":{"position":[[178,8]]},"1233":{"position":[[30,7],[52,7]]}},"keywords":{}}],["service"",{"_index":313,"title":{},"content":{"18":{"position":[[361,14]]}},"keywords":{}}],["services"",{"_index":2824,"title":{},"content":{"419":{"position":[[1871,14]]}},"keywords":{}}],["services.if",{"_index":3376,"title":{},"content":{"556":{"position":[[1633,11]]}},"keywords":{}}],["services.react",{"_index":2167,"title":{},"content":{"384":{"position":[[196,14]]}},"keywords":{}}],["servicework",{"_index":3006,"title":{},"content":{"460":{"position":[[298,13]]},"1233":{"position":[[138,14],[172,13]]}},"keywords":{}}],["session",{"_index":1751,"title":{},"content":{"299":{"position":[[541,8]]},"305":{"position":[[338,8]]},"323":{"position":[[626,9]]},"365":{"position":[[361,8],[603,9],[728,9]]},"430":{"position":[[1009,9]]},"436":{"position":[[46,7],[189,8]]},"450":{"position":[[122,7]]},"451":{"position":[[371,8]]},"559":{"position":[[948,8]]},"890":{"position":[[495,7]]}},"keywords":{}}],["sessionstorag",{"_index":2917,"title":{"436":{"position":[[16,15]]}},"content":{"436":{"position":[[95,15],[327,14]]},"451":{"position":[[721,14],[840,14]]}},"keywords":{}}],["set",{"_index":171,"title":{"48":{"position":[[0,3]]},"210":{"position":[[0,7]]},"536":{"position":[[0,3]]},"552":{"position":[[0,7]]},"554":{"position":[[3,3]]},"596":{"position":[[0,3]]},"797":{"position":[[0,3]]},"856":{"position":[[7,3]]},"862":{"position":[[0,7]]},"872":{"position":[[0,7]]},"898":{"position":[[0,7]]},"1002":{"position":[[0,7]]},"1066":{"position":[[0,7]]},"1213":{"position":[[0,7]]},"1230":{"position":[[0,3]]}},"content":{"11":{"position":[[911,8]]},"52":{"position":[[556,5]]},"84":{"position":[[384,7]]},"114":{"position":[[397,7]]},"116":{"position":[[221,3]]},"149":{"position":[[397,7]]},"175":{"position":[[388,7]]},"178":{"position":[[174,9]]},"184":{"position":[[259,7]]},"192":{"position":[[64,7]]},"241":{"position":[[170,3]]},"261":{"position":[[1002,4]]},"284":{"position":[[133,3]]},"287":{"position":[[406,3]]},"298":{"position":[[678,4]]},"301":{"position":[[94,4]]},"303":{"position":[[426,4]]},"310":{"position":[[307,4]]},"314":{"position":[[643,3]]},"329":{"position":[[134,4]]},"333":{"position":[[88,3]]},"336":{"position":[[157,3]]},"342":{"position":[[85,5]]},"346":{"position":[[776,4]]},"347":{"position":[[395,7]]},"353":{"position":[[406,4]]},"361":{"position":[[224,8]]},"362":{"position":[[1466,7]]},"367":{"position":[[896,3]]},"373":{"position":[[170,3],[647,3]]},"376":{"position":[[571,4]]},"392":{"position":[[2414,3],[4953,7]]},"396":{"position":[[901,3]]},"397":{"position":[[1501,3]]},"398":{"position":[[257,3],[1803,3]]},"402":{"position":[[938,7],[1479,3]]},"407":{"position":[[899,3]]},"411":{"position":[[1339,3]]},"412":{"position":[[2412,7],[6957,3]]},"417":{"position":[[142,4]]},"427":{"position":[[56,3]]},"430":{"position":[[1082,6]]},"450":{"position":[[207,8]]},"455":{"position":[[884,7]]},"480":{"position":[[819,3]]},"498":{"position":[[197,7]]},"502":{"position":[[1046,3]]},"511":{"position":[[397,7]]},"518":{"position":[[513,3]]},"523":{"position":[[35,3]]},"531":{"position":[[397,7]]},"536":{"position":[[1,7]]},"538":{"position":[[171,7]]},"539":{"position":[[556,5]]},"542":{"position":[[243,3]]},"554":{"position":[[265,3]]},"555":{"position":[[13,3]]},"559":{"position":[[115,3],[1654,5]]},"560":{"position":[[340,8]]},"561":{"position":[[36,4]]},"566":{"position":[[1427,8]]},"567":{"position":[[228,7]]},"571":{"position":[[850,4],[994,3]]},"575":{"position":[[671,3]]},"579":{"position":[[34,3]]},"591":{"position":[[395,7]]},"596":{"position":[[1,7]]},"598":{"position":[[172,7]]},"599":{"position":[[583,5]]},"612":{"position":[[1062,3],[1458,3],[1692,3]]},"617":{"position":[[1456,7]]},"644":{"position":[[34,3],[235,4]]},"648":{"position":[[20,4],[120,3]]},"653":{"position":[[9,3],[992,3]]},"654":{"position":[[248,7],[407,7]]},"659":{"position":[[1006,9]]},"661":{"position":[[589,3]]},"662":{"position":[[1386,9]]},"674":{"position":[[96,3]]},"678":{"position":[[314,3],[345,5]]},"680":{"position":[[227,3]]},"681":{"position":[[451,4]]},"683":{"position":[[115,4],[307,5],[901,5]]},"684":{"position":[[52,7],[192,5]]},"688":{"position":[[1007,3]]},"696":{"position":[[237,4]]},"701":{"position":[[146,3]]},"709":{"position":[[176,3],[201,4]]},"710":{"position":[[822,3]]},"711":{"position":[[1407,3]]},"717":{"position":[[938,3]]},"719":{"position":[[17,3]]},"720":{"position":[[54,3]]},"721":{"position":[[296,7],[360,3]]},"734":{"position":[[638,3],[817,3]]},"740":{"position":[[400,3]]},"746":{"position":[[212,8],[348,9],[453,8]]},"749":{"position":[[684,3],[2721,3],[3426,3],[3457,8],[5803,3],[5865,3],[10496,3],[14406,3],[16566,3],[19158,3],[20186,3],[20351,3],[20610,3],[20905,4],[21642,3],[22645,3],[22876,3]]},"754":{"position":[[435,3]]},"764":{"position":[[136,3]]},"767":{"position":[[373,3]]},"772":{"position":[[493,7],[1259,3],[1823,3]]},"775":{"position":[[337,3]]},"780":{"position":[[235,7]]},"796":{"position":[[113,4]]},"799":{"position":[[44,3]]},"806":{"position":[[86,3]]},"821":{"position":[[268,11],[889,3]]},"825":{"position":[[222,3],[250,3]]},"826":{"position":[[780,3],[878,3]]},"828":{"position":[[243,3]]},"829":{"position":[[815,7]]},"835":{"position":[[1060,8]]},"838":{"position":[[1480,3],[2366,3]]},"841":{"position":[[954,5],[1349,8]]},"848":{"position":[[940,3]]},"849":{"position":[[466,3],[787,8]]},"854":{"position":[[1445,3]]},"855":{"position":[[175,3],[276,7]]},"857":{"position":[[121,3]]},"861":{"position":[[170,3],[226,3],[2053,4],[2193,3],[2364,8],[2400,3]]},"862":{"position":[[18,3],[84,3],[1451,3]]},"867":{"position":[[170,3],[271,7]]},"870":{"position":[[252,4]]},"871":{"position":[[859,3]]},"872":{"position":[[169,3],[370,3]]},"875":{"position":[[537,8],[578,8],[2972,8],[6071,8]]},"882":{"position":[[313,3]]},"887":{"position":[[533,3]]},"890":{"position":[[302,3]]},"894":{"position":[[168,9]]},"903":{"position":[[650,7]]},"904":{"position":[[2595,3]]},"905":{"position":[[177,3]]},"908":{"position":[[220,3]]},"913":{"position":[[45,3]]},"916":{"position":[[83,3]]},"932":{"position":[[1132,3]]},"963":{"position":[[93,3]]},"964":{"position":[[119,3],[377,3]]},"965":{"position":[[330,3]]},"966":{"position":[[297,7],[338,7],[501,3]]},"982":{"position":[[590,3]]},"986":{"position":[[394,3],[1502,3]]},"987":{"position":[[1020,7]]},"988":{"position":[[677,8],[1486,3],[1830,3],[1920,7],[4815,3]]},"989":{"position":[[135,7],[259,8],[326,4]]},"1002":{"position":[[124,7],[790,7]]},"1007":{"position":[[206,7]]},"1009":{"position":[[109,4]]},"1013":{"position":[[147,3],[720,3]]},"1022":{"position":[[356,3]]},"1041":{"position":[[339,5],[370,4]]},"1043":{"position":[[117,7]]},"1047":{"position":[[112,3]]},"1048":{"position":[[158,3],[220,7],[365,7],[452,5]]},"1051":{"position":[[316,3]]},"1055":{"position":[[90,3]]},"1056":{"position":[[64,4]]},"1057":{"position":[[49,3]]},"1058":{"position":[[58,3]]},"1060":{"position":[[180,3]]},"1067":{"position":[[376,3],[1749,3],[2293,7],[2441,3]]},"1068":{"position":[[72,7]]},"1074":{"position":[[71,9],[1034,3]]},"1078":{"position":[[152,3],[596,3],[905,3]]},"1079":{"position":[[254,3]]},"1080":{"position":[[219,3],[340,3],[530,3]]},"1082":{"position":[[304,3]]},"1083":{"position":[[4,7],[504,3]]},"1084":{"position":[[408,3]]},"1085":{"position":[[1638,3],[1706,4]]},"1088":{"position":[[581,3]]},"1089":{"position":[[194,3]]},"1090":{"position":[[1311,7],[1376,9]]},"1094":{"position":[[557,7]]},"1105":{"position":[[587,4]]},"1107":{"position":[[434,3],[1039,3]]},"1108":{"position":[[56,3],[226,4]]},"1114":{"position":[[133,7]]},"1115":{"position":[[295,3],[835,3]]},"1125":{"position":[[103,3]]},"1126":{"position":[[89,3],[598,8]]},"1130":{"position":[[296,3]]},"1134":{"position":[[395,3]]},"1156":{"position":[[168,4]]},"1164":{"position":[[513,7],[745,3],[832,3]]},"1172":{"position":[[432,3]]},"1174":{"position":[[739,7]]},"1175":{"position":[[36,3]]},"1176":{"position":[[494,7]]},"1185":{"position":[[256,7]]},"1193":{"position":[[113,3]]},"1213":{"position":[[523,3],[748,3]]},"1229":{"position":[[12,7]]},"1230":{"position":[[104,3],[222,3]]},"1236":{"position":[[103,9]]},"1242":{"position":[[108,3]]},"1257":{"position":[[159,3]]},"1268":{"position":[[12,7]]},"1277":{"position":[[450,3]]},"1282":{"position":[[128,3],[1058,7]]},"1284":{"position":[[33,3]]},"1294":{"position":[[2035,3]]},"1297":{"position":[[34,3]]},"1314":{"position":[[649,3]]},"1315":{"position":[[907,4]]},"1316":{"position":[[883,3],[1100,4]]},"1318":{"position":[[645,4]]},"1321":{"position":[[756,3]]}},"keywords":{}}],["set<rxdocument>",{"_index":2393,"title":{},"content":{"398":{"position":[[804,24],[2072,24]]}},"keywords":{}}],["setdatabas",{"_index":4747,"title":{},"content":{"829":{"position":[[1432,12]]}},"keywords":{}}],["setdatabase(db",{"_index":4748,"title":{},"content":{"829":{"position":[[1544,16]]}},"keywords":{}}],["setflutterrxdatabaseconnector",{"_index":1247,"title":{},"content":{"188":{"position":[[604,32],[752,30],[1563,30]]}},"keywords":{}}],["sethead",{"_index":5172,"title":{},"content":{"890":{"position":[[228,14]]}},"keywords":{}}],["sethero",{"_index":3307,"title":{},"content":{"541":{"position":[[268,10]]},"562":{"position":[[1139,10]]}},"keywords":{}}],["setheroes(newhero",{"_index":3310,"title":{},"content":{"541":{"position":[[436,21]]},"562":{"position":[[1334,21]]}},"keywords":{}}],["setinterv",{"_index":3606,"title":{},"content":{"612":{"position":[[2223,14]]},"996":{"position":[[532,14]]}},"keywords":{}}],["setinterval(async",{"_index":4097,"title":{},"content":{"739":{"position":[[585,17]]}},"keywords":{}}],["setitem",{"_index":2867,"title":{},"content":{"425":{"position":[[167,8],[268,7]]},"451":{"position":[[194,8]]}},"keywords":{}}],["setitem('mykey",{"_index":4769,"title":{},"content":{"835":{"position":[[456,16]]}},"keywords":{}}],["setpremiumflag",{"_index":3863,"title":{},"content":{"676":{"position":[[245,16],[302,14],[355,17]]},"958":{"position":[[694,16],[757,14],[810,17]]},"1151":{"position":[[823,16],[879,14],[932,17]]},"1178":{"position":[[820,16],[876,14],[929,17]]}},"keywords":{}}],["sets.corrupt",{"_index":2064,"title":{},"content":{"358":{"position":[[606,15]]}},"keywords":{}}],["setstat",{"_index":1291,"title":{},"content":{"188":{"position":[[3251,11]]}},"keywords":{}}],["settimeout",{"_index":5271,"title":{},"content":{"910":{"position":[[427,13]]}},"keywords":{}}],["settimeout(longpol",{"_index":3562,"title":{},"content":{"610":{"position":[[1329,20]]}},"keywords":{}}],["settimeout(r",{"_index":4532,"title":{},"content":{"767":{"position":[[580,15],[989,15]]},"768":{"position":[[582,15],[991,15]]},"769":{"position":[[539,15],[960,15]]}},"keywords":{}}],["settings_max_concurrent_stream",{"_index":3647,"title":{},"content":{"617":{"position":[[1424,31]]}},"keywords":{}}],["setup",{"_index":1663,"title":{"285":{"position":[[0,5]]},"293":{"position":[[8,5]]},"480":{"position":[[6,5]]},"638":{"position":[[0,5]]},"639":{"position":[[0,5]]},"730":{"position":[[8,5]]},"875":{"position":[[0,6]]}},"content":{"285":{"position":[[285,5]]},"293":{"position":[[175,6]]},"299":{"position":[[1744,7]]},"390":{"position":[[1734,5]]},"392":{"position":[[4871,5]]},"402":{"position":[[823,6]]},"454":{"position":[[607,5]]},"463":{"position":[[52,5],[279,5]]},"477":{"position":[[141,6]]},"522":{"position":[[270,6]]},"556":{"position":[[1461,5]]},"601":{"position":[[347,5]]},"632":{"position":[[1011,5],[2081,5]]},"830":{"position":[[200,5]]},"832":{"position":[[420,5]]},"871":{"position":[[478,6]]},"886":{"position":[[887,5],[2588,5]]},"1007":{"position":[[710,6]]},"1128":{"position":[[8,5]]},"1147":{"position":[[207,7]]},"1156":{"position":[[251,6]]},"1189":{"position":[[61,6]]},"1235":{"position":[[57,5]]}},"keywords":{}}],["setup>",{"_index":3493,"title":{},"content":{"580":{"position":[[289,9]]}},"keywords":{}}],["setup.join",{"_index":5283,"title":{},"content":{"913":{"position":[[229,10]]}},"keywords":{}}],["setuprxdb",{"_index":3425,"title":{},"content":{"562":{"position":[[136,11]]}},"keywords":{}}],["setuprxdbwithsign",{"_index":3432,"title":{},"content":{"563":{"position":[[437,22]]}},"keywords":{}}],["setusernam",{"_index":3389,"title":{},"content":{"559":{"position":[[287,12]]}},"keywords":{}}],["setusername(e.target.valu",{"_index":3398,"title":{},"content":{"559":{"position":[[645,28]]}},"keywords":{}}],["sever",{"_index":479,"title":{},"content":{"29":{"position":[[213,7]]},"37":{"position":[[126,7]]},"47":{"position":[[61,7]]},"65":{"position":[[1847,7]]},"118":{"position":[[304,7]]},"137":{"position":[[13,7]]},"186":{"position":[[182,7]]},"356":{"position":[[46,7]]},"365":{"position":[[67,7]]},"425":{"position":[[124,7]]},"450":{"position":[[190,7],[289,7]]},"453":{"position":[[864,7]]},"535":{"position":[[63,7]]},"595":{"position":[[63,7]]},"836":{"position":[[1222,7]]},"849":{"position":[[398,7]]},"860":{"position":[[304,7]]},"1065":{"position":[[1596,7]]},"1079":{"position":[[448,7]]},"1085":{"position":[[1852,7]]},"1300":{"position":[[930,7]]},"1316":{"position":[[532,7]]}},"keywords":{}}],["sha256",{"_index":5403,"title":{},"content":{"968":{"position":[[382,6]]}},"keywords":{}}],["shape",{"_index":3422,"title":{},"content":{"561":{"position":[[11,6]]},"898":{"position":[[3494,5]]}},"keywords":{}}],["shard",{"_index":1843,"title":{"643":{"position":[[0,8]]},"1221":{"position":[[0,8]]},"1222":{"position":[[10,8]]},"1295":{"position":[[10,9]]}},"content":{"303":{"position":[[995,8]]},"402":{"position":[[2789,8]]},"408":{"position":[[4703,8]]},"469":{"position":[[182,8],[1188,8]]},"643":{"position":[[66,8]]},"793":{"position":[[555,8]]},"870":{"position":[[261,7]]},"871":{"position":[[866,7]]},"1222":{"position":[[68,10],[206,8],[438,8],[559,9],[587,6],[680,5],[758,6],[833,6],[935,7],[953,8],[985,5],[1077,5]]},"1238":{"position":[[150,8],[510,10]]},"1246":{"position":[[959,9],[1068,8],[1134,8],[1190,7]]},"1295":{"position":[[1,8],[211,6],[227,5],[543,9],[797,8],[929,6],[1163,8],[1295,7],[1375,6],[1456,8],[1512,8],[1552,8]]},"1304":{"position":[[2010,8]]}},"keywords":{}}],["shardedrxstorag",{"_index":6263,"title":{},"content":{"1222":{"position":[[235,16],[1440,16]]}},"keywords":{}}],["share",{"_index":432,"title":{"775":{"position":[[0,5]]}},"content":{"26":{"position":[[365,6]]},"174":{"position":[[1891,5]]},"207":{"position":[[307,7]]},"210":{"position":[[124,5]]},"289":{"position":[[972,8],[1988,7]]},"299":{"position":[[334,6]]},"306":{"position":[[292,5]]},"365":{"position":[[1335,8]]},"390":{"position":[[1444,6]]},"411":{"position":[[4208,6],[4420,6]]},"422":{"position":[[226,5]]},"450":{"position":[[263,5],[739,6]]},"458":{"position":[[273,5],[518,5],[597,5]]},"469":{"position":[[983,6]]},"471":{"position":[[1,5]]},"475":{"position":[[93,5]]},"579":{"position":[[838,5]]},"617":{"position":[[177,6],[272,6],[2120,6]]},"644":{"position":[[324,5]]},"775":{"position":[[75,5],[148,5]]},"779":{"position":[[408,5]]},"890":{"position":[[516,6]]},"913":{"position":[[313,5]]},"961":{"position":[[188,5]]},"964":{"position":[[173,7],[286,6]]},"1123":{"position":[[377,6],[398,6]]},"1124":{"position":[[1040,6],[1255,5]]},"1126":{"position":[[813,5],[883,6]]},"1225":{"position":[[111,6]]},"1226":{"position":[[441,6]]},"1227":{"position":[[5,6]]},"1228":{"position":[[155,6]]},"1230":{"position":[[71,6],[342,6]]},"1231":{"position":[[424,6]]},"1233":{"position":[[88,6]]},"1301":{"position":[[700,6]]}},"keywords":{}}],["shared/lik",{"_index":2509,"title":{},"content":{"405":{"position":[[1,11]]}},"keywords":{}}],["shared_prefer",{"_index":1245,"title":{},"content":{"188":{"position":[[382,18]]}},"keywords":{}}],["sharedwork",{"_index":2492,"title":{"1223":{"position":[[0,12]]},"1225":{"position":[[7,12]]},"1229":{"position":[[13,12]]},"1231":{"position":[[17,13]]}},"content":{"402":{"position":[[2824,12]]},"458":{"position":[[1455,12],[1573,12]]},"460":{"position":[[278,12],[365,12],[762,12]]},"721":{"position":[[38,12]]},"757":{"position":[[108,12]]},"793":{"position":[[502,12]]},"801":{"position":[[912,12]]},"1183":{"position":[[277,12],[348,12]]},"1207":{"position":[[426,13]]},"1226":{"position":[[357,12]]},"1227":{"position":[[535,14]]},"1229":{"position":[[94,12]]},"1231":{"position":[[8,12]]},"1232":{"position":[[5,12]]},"1246":{"position":[[342,13],[455,12]]},"1265":{"position":[[529,14]]},"1301":{"position":[[584,13],[600,12],[684,12],[771,12],[904,12],[1086,13]]}},"keywords":{}}],["shed",{"_index":3220,"title":{},"content":{"501":{"position":[[259,5]]}},"keywords":{}}],["shell",{"_index":4940,"title":{},"content":{"872":{"position":[[435,5]]}},"keywords":{}}],["shift",{"_index":2539,"title":{"445":{"position":[[29,5]]}},"content":{"408":{"position":[[1357,5]]},"412":{"position":[[4323,6]]},"416":{"position":[[78,6]]}},"keywords":{}}],["shim",{"_index":95,"title":{},"content":{"7":{"position":[[35,4]]}},"keywords":{}}],["ship",{"_index":2969,"title":{},"content":{"454":{"position":[[359,7]]},"496":{"position":[[495,8]]},"708":{"position":[[189,4],[427,8]]},"898":{"position":[[2904,4]]},"904":{"position":[[1762,7]]},"906":{"position":[[188,5]]},"1210":{"position":[[158,7]]},"1227":{"position":[[140,5]]},"1265":{"position":[[133,5]]},"1270":{"position":[[504,4]]},"1271":{"position":[[106,7]]},"1272":{"position":[[233,5]]},"1275":{"position":[[96,7]]}},"keywords":{}}],["short",{"_index":1166,"title":{},"content":{"153":{"position":[[7,5]]},"301":{"position":[[587,5]]},"322":{"position":[[6,6]]},"354":{"position":[[1403,6]]},"396":{"position":[[465,5]]},"408":{"position":[[1207,6]]},"412":{"position":[[7547,6],[13049,6]]},"480":{"position":[[12,5]]},"514":{"position":[[7,5]]},"570":{"position":[[666,6]]},"575":{"position":[[8,5]]},"698":{"position":[[3053,5]]},"709":{"position":[[235,5]]},"783":{"position":[[42,5]]},"948":{"position":[[70,5]]}},"keywords":{}}],["shortcom",{"_index":4775,"title":{},"content":{"836":{"position":[[1230,12]]}},"keywords":{}}],["shorten",{"_index":1825,"title":{},"content":{"303":{"position":[[336,7]]},"316":{"position":[[427,8]]},"361":{"position":[[360,8]]},"402":{"position":[[96,7],[575,10],[666,9]]},"588":{"position":[[19,8]]}},"keywords":{}}],["shorter",{"_index":1130,"title":{},"content":{"141":{"position":[[145,7]]},"639":{"position":[[151,7]]}},"keywords":{}}],["shortli",{"_index":3685,"title":{},"content":{"626":{"position":[[996,7]]}},"keywords":{}}],["shouldretri",{"_index":5144,"title":{},"content":{"886":{"position":[[4586,14]]}},"keywords":{}}],["show",{"_index":402,"title":{},"content":{"24":{"position":[[472,4]]},"31":{"position":[[207,5]]},"299":{"position":[[1280,7]]},"300":{"position":[[125,5]]},"301":{"position":[[602,5]]},"302":{"position":[[1011,4]]},"400":{"position":[[687,4]]},"408":{"position":[[3110,5]]},"410":{"position":[[1645,4]]},"411":{"position":[[5404,4]]},"412":{"position":[[3614,7],[5085,4]]},"420":{"position":[[416,4]]},"458":{"position":[[319,4]]},"474":{"position":[[68,4]]},"476":{"position":[[57,4]]},"554":{"position":[[250,7]]},"700":{"position":[[590,4]]},"752":{"position":[[289,4],[1333,4]]},"753":{"position":[[177,4]]},"832":{"position":[[307,5]]},"995":{"position":[[725,4]]},"1058":{"position":[[145,4]]},"1207":{"position":[[814,7]]},"1209":{"position":[[412,5]]},"1294":{"position":[[1840,5]]},"1298":{"position":[[418,5]]}},"keywords":{}}],["showcas",{"_index":3212,"title":{},"content":{"498":{"position":[[278,9]]},"543":{"position":[[156,10]]},"603":{"position":[[154,10]]}},"keywords":{}}],["showloadingspinn",{"_index":5514,"title":{},"content":{"995":{"position":[[1820,21]]}},"keywords":{}}],["shown",{"_index":420,"title":{},"content":{"25":{"position":[[295,5]]},"43":{"position":[[370,5]]},"400":{"position":[[127,6]]},"456":{"position":[[97,5]]},"467":{"position":[[442,5]]},"524":{"position":[[958,5]]},"610":{"position":[[1472,5]]},"611":{"position":[[969,5]]},"619":{"position":[[41,5]]},"831":{"position":[[32,5]]},"838":{"position":[[3133,5]]},"861":{"position":[[1146,5]]},"1098":{"position":[[106,5]]},"1099":{"position":[[98,5]]},"1156":{"position":[[217,5]]},"1215":{"position":[[228,5]]},"1271":{"position":[[1665,5]]},"1295":{"position":[[629,5],[758,5]]},"1296":{"position":[[1595,6]]},"1297":{"position":[[388,5]]},"1300":{"position":[[1007,5]]}},"keywords":{}}],["shrimp",{"_index":2843,"title":{},"content":{"420":{"position":[[1293,6]]}},"keywords":{}}],["shrink",{"_index":5918,"title":{},"content":{"1092":{"position":[[652,7]]}},"keywords":{}}],["shut",{"_index":352,"title":{},"content":{"20":{"position":[[131,4]]},"28":{"position":[[508,4]]},"1300":{"position":[[1175,4]]}},"keywords":{}}],["side",{"_index":206,"title":{"69":{"position":[[21,4]]},"100":{"position":[[21,4]]},"271":{"position":[[29,4]]},"278":{"position":[[37,4]]},"294":{"position":[[22,4]]},"501":{"position":[[29,4]]},"708":{"position":[[7,4]]},"1317":{"position":[[7,4]]}},"content":{"14":{"position":[[153,4]]},"16":{"position":[[77,5]]},"19":{"position":[[102,4]]},"20":{"position":[[177,4]]},"21":{"position":[[23,4]]},"22":{"position":[[326,4]]},"23":{"position":[[30,5]]},"38":{"position":[[24,4],[319,5],[384,5]]},"41":{"position":[[329,4]]},"45":{"position":[[52,4]]},"46":{"position":[[685,5]]},"66":{"position":[[258,4]]},"69":{"position":[[8,4]]},"98":{"position":[[54,4]]},"100":{"position":[[8,4]]},"101":{"position":[[51,4]]},"120":{"position":[[18,4]]},"139":{"position":[[153,4]]},"153":{"position":[[49,4]]},"157":{"position":[[183,4]]},"172":{"position":[[41,4]]},"181":{"position":[[18,4]]},"188":{"position":[[1057,4]]},"225":{"position":[[37,4]]},"227":{"position":[[35,4]]},"228":{"position":[[8,4]]},"244":{"position":[[655,4]]},"249":{"position":[[375,4]]},"271":{"position":[[117,4],[226,4]]},"278":{"position":[[71,4]]},"280":{"position":[[40,4]]},"293":{"position":[[47,4]]},"320":{"position":[[225,4]]},"321":{"position":[[516,4]]},"325":{"position":[[18,4]]},"359":{"position":[[78,4]]},"365":{"position":[[951,4]]},"370":{"position":[[206,5],[299,4]]},"384":{"position":[[167,4]]},"399":{"position":[[11,4]]},"400":{"position":[[781,4]]},"402":{"position":[[1470,5]]},"408":{"position":[[4378,4],[5307,4]]},"410":{"position":[[687,4],[2111,4]]},"412":{"position":[[189,5],[4356,5],[4397,4],[8926,4],[9020,5],[10523,4],[10836,6],[14135,4],[14269,5],[14427,4],[14999,4]]},"424":{"position":[[473,4]]},"434":{"position":[[42,4]]},"435":{"position":[[59,4]]},"455":{"position":[[95,4],[212,5],[236,4]]},"457":{"position":[[186,4]]},"464":{"position":[[984,6]]},"478":{"position":[[68,4]]},"495":{"position":[[827,4]]},"496":{"position":[[853,5]]},"501":{"position":[[104,4]]},"502":{"position":[[87,4],[382,5]]},"534":{"position":[[643,5]]},"571":{"position":[[35,4]]},"575":{"position":[[159,4]]},"594":{"position":[[641,5]]},"610":{"position":[[1446,4]]},"612":{"position":[[708,4],[793,4],[1116,4],[1435,5]]},"626":{"position":[[589,4]]},"628":{"position":[[143,4]]},"632":{"position":[[319,4],[2724,4],[2740,4]]},"663":{"position":[[133,4]]},"698":{"position":[[1758,4]]},"699":{"position":[[81,4],[126,5],[776,4]]},"712":{"position":[[152,4]]},"784":{"position":[[588,4],[630,5]]},"829":{"position":[[2895,4]]},"837":{"position":[[307,4]]},"842":{"position":[[267,4]]},"860":{"position":[[256,4],[1049,5]]},"862":{"position":[[70,4]]},"871":{"position":[[192,4],[238,5]]},"872":{"position":[[1677,4],[3633,4]]},"875":{"position":[[673,5],[3595,4]]},"885":{"position":[[15,5]]},"981":{"position":[[30,5],[1103,4],[1255,5]]},"983":{"position":[[455,4]]},"988":{"position":[[3337,4],[4666,4]]},"991":{"position":[[22,4]]},"1007":{"position":[[485,5]]},"1072":{"position":[[147,4],[692,5],[1241,4]]},"1080":{"position":[[1060,5]]},"1088":{"position":[[324,4]]},"1100":{"position":[[842,4],[885,4]]},"1101":{"position":[[191,4]]},"1107":{"position":[[1078,4]]},"1112":{"position":[[249,4]]},"1124":{"position":[[1367,5],[1419,5]]},"1148":{"position":[[418,5]]},"1191":{"position":[[97,4]]},"1196":{"position":[[17,4],[137,4]]},"1198":{"position":[[105,4],[1450,5]]},"1206":{"position":[[528,4]]},"1218":{"position":[[200,5],[878,4]]},"1247":{"position":[[278,5],[633,5]]},"1249":{"position":[[306,4]]},"1250":{"position":[[293,4],[376,4]]},"1295":{"position":[[50,4],[291,4]]},"1305":{"position":[[132,4]]},"1308":{"position":[[302,5]]},"1313":{"position":[[15,5],[252,4]]},"1316":{"position":[[1943,4]]},"1317":{"position":[[26,4]]},"1319":{"position":[[626,4]]},"1321":{"position":[[58,4]]},"1324":{"position":[[63,4]]}},"keywords":{}}],["side.en",{"_index":5196,"title":{},"content":{"898":{"position":[[719,11]]}},"keywords":{}}],["side/offlin",{"_index":2762,"title":{},"content":{"412":{"position":[[13451,12]]}},"keywords":{}}],["sidestep",{"_index":2519,"title":{},"content":{"407":{"position":[[548,8]]}},"keywords":{}}],["side—or",{"_index":2054,"title":{},"content":{"357":{"position":[[561,7]]}},"keywords":{}}],["sign",{"_index":849,"title":{},"content":{"55":{"position":[[1024,4]]},"542":{"position":[[733,4]]},"749":{"position":[[6544,4]]},"826":{"position":[[60,4],[248,5]]},"1117":{"position":[[280,4]]},"1118":{"position":[[24,4]]}},"keywords":{}}],["signal",{"_index":826,"title":{"55":{"position":[[13,8]]},"144":{"position":[[30,7]]},"542":{"position":[[12,8]]},"563":{"position":[[21,7]]},"602":{"position":[[10,8]]},"822":{"position":[[0,7]]},"831":{"position":[[0,8]]},"906":{"position":[[0,9]]},"1118":{"position":[[13,7]]}},"content":{"55":{"position":[[9,7],[142,7],[243,7],[1043,6]]},"144":{"position":[[80,7]]},"261":{"position":[[559,9]]},"494":{"position":[[29,7],[128,7],[230,6],[599,6]]},"540":{"position":[[215,8]]},"542":{"position":[[27,7],[107,7],[267,7],[369,9],[674,7]]},"563":{"position":[[129,8],[411,9],[620,6],[745,7],[853,7],[869,7],[1091,8]]},"566":{"position":[[591,7]]},"567":{"position":[[563,8],[749,7],[819,7]]},"602":{"position":[[52,8],[174,7]]},"614":{"position":[[873,9]]},"804":{"position":[[19,7]]},"825":{"position":[[45,7],[510,6],[985,6],[1070,7]]},"826":{"position":[[380,6],[437,6],[499,6],[538,6],[592,6],[625,6],[688,6],[740,6],[800,6],[838,6],[898,6],[959,6],[1019,6],[1057,6],[1103,6]]},"831":{"position":[[109,8],[295,6]]},"902":{"position":[[681,9]]},"903":{"position":[[300,9]]},"904":{"position":[[2603,9]]},"906":{"position":[[72,9],[106,9],[209,9],[440,9],[484,9],[647,9],[784,9],[1068,9]]},"907":{"position":[[63,9]]},"1117":{"position":[[132,7]]},"1118":{"position":[[82,7],[228,8],[315,7]]}},"keywords":{}}],["signaldb",{"_index":657,"title":{"42":{"position":[[0,9]]}},"content":{"42":{"position":[[1,8],[276,8]]}},"keywords":{}}],["signalingserverurl",{"_index":1368,"title":{},"content":{"210":{"position":[[393,19]]},"261":{"position":[[576,19]]},"904":{"position":[[2742,19]]},"911":{"position":[[720,19]]}},"keywords":{}}],["signatur",{"_index":6365,"title":{},"content":{"1281":{"position":[[205,10]]}},"keywords":{}}],["signific",{"_index":911,"title":{},"content":{"65":{"position":[[449,11]]},"69":{"position":[[42,11]]},"100":{"position":[[80,11]]},"228":{"position":[[49,11]]},"331":{"position":[[128,11]]},"394":{"position":[[1386,11]]},"412":{"position":[[39,11],[7165,11]]},"427":{"position":[[140,11]]},"430":{"position":[[490,11]]},"533":{"position":[[42,11]]},"593":{"position":[[42,11]]},"611":{"position":[[373,11]]},"618":{"position":[[178,11]]},"624":{"position":[[1627,11]]},"821":{"position":[[951,11]]},"1072":{"position":[[2779,11]]},"1296":{"position":[[52,12]]}},"keywords":{}}],["significantli",{"_index":918,"title":{},"content":{"65":{"position":[[843,13]]},"92":{"position":[[137,13]]},"166":{"position":[[259,13]]},"169":{"position":[[147,13]]},"173":{"position":[[1761,13]]},"178":{"position":[[350,13]]},"204":{"position":[[261,13]]},"234":{"position":[[217,13]]},"251":{"position":[[274,13]]},"265":{"position":[[222,13]]},"299":{"position":[[30,13],[1466,14]]},"311":{"position":[[30,13]]},"316":{"position":[[460,13]]},"369":{"position":[[931,13]]},"400":{"position":[[174,13]]},"401":{"position":[[719,13]]},"408":{"position":[[2550,13]]},"411":{"position":[[2440,13]]},"432":{"position":[[367,13]]},"446":{"position":[[1380,13]]},"464":{"position":[[1120,14]]},"621":{"position":[[680,13]]},"623":{"position":[[69,13]]},"641":{"position":[[168,13]]},"800":{"position":[[545,14]]},"801":{"position":[[46,13]]},"1072":{"position":[[374,13]]},"1124":{"position":[[1458,14]]}},"keywords":{}}],["significantly.compress",{"_index":3095,"title":{},"content":{"469":{"position":[[1034,25]]}},"keywords":{}}],["silent",{"_index":1780,"title":{},"content":{"300":{"position":[[717,8]]}},"keywords":{}}],["similar",{"_index":189,"title":{},"content":{"13":{"position":[[102,7]]},"16":{"position":[[160,7]]},"18":{"position":[[104,7]]},"23":{"position":[[465,7]]},"299":{"position":[[747,7],[1033,7]]},"347":{"position":[[620,8]]},"362":{"position":[[1691,8]]},"390":{"position":[[410,11],[715,7],[822,7],[1206,10],[1334,7],[1681,10]]},"393":{"position":[[159,10],[260,11],[284,10]]},"394":{"position":[[214,7],[454,11],[1074,10],[1269,7]]},"396":{"position":[[154,7],[1245,7],[1265,7],[1368,7]]},"398":{"position":[[338,10],[481,10]]},"400":{"position":[[83,10],[144,10]]},"411":{"position":[[3787,7]]},"412":{"position":[[7736,8]]},"455":{"position":[[218,7]]},"462":{"position":[[395,7]]},"465":{"position":[[445,7]]},"470":{"position":[[312,7]]},"570":{"position":[[879,7]]},"621":{"position":[[745,7]]},"659":{"position":[[119,7]]},"693":{"position":[[377,7]]},"704":{"position":[[145,7]]},"705":{"position":[[222,7]]},"711":{"position":[[210,7]]},"801":{"position":[[117,7]]},"802":{"position":[[46,7]]},"835":{"position":[[61,7]]},"861":{"position":[[1833,7]]},"936":{"position":[[99,7]]},"948":{"position":[[332,7]]},"975":{"position":[[75,7]]},"1071":{"position":[[67,7]]},"1112":{"position":[[358,7]]},"1124":{"position":[[569,7]]},"1143":{"position":[[541,8]]},"1212":{"position":[[159,7]]},"1305":{"position":[[446,7]]},"1318":{"position":[[300,7]]},"1321":{"position":[[801,7]]}},"keywords":{}}],["similarli",{"_index":1798,"title":{},"content":{"302":{"position":[[126,9]]},"410":{"position":[[2050,10]]},"411":{"position":[[4679,10]]},"1007":{"position":[[673,9]]}},"keywords":{}}],["simpl",{"_index":440,"title":{"1239":{"position":[[26,6]]}},"content":{"27":{"position":[[180,6]]},"34":{"position":[[91,7]]},"35":{"position":[[81,7]]},"51":{"position":[[54,6]]},"57":{"position":[[8,6]]},"63":{"position":[[114,6]]},"120":{"position":[[222,6]]},"181":{"position":[[122,6]]},"203":{"position":[[58,6]]},"223":{"position":[[168,6]]},"255":{"position":[[58,6]]},"314":{"position":[[7,6]]},"320":{"position":[[19,6]]},"358":{"position":[[163,7]]},"395":{"position":[[423,7]]},"412":{"position":[[3412,6],[12400,6]]},"414":{"position":[[309,6]]},"424":{"position":[[169,6],[249,6]]},"426":{"position":[[42,6]]},"427":{"position":[[484,6]]},"429":{"position":[[547,6]]},"451":{"position":[[114,6]]},"462":{"position":[[205,6]]},"491":{"position":[[576,6],[1631,6]]},"538":{"position":[[184,6]]},"560":{"position":[[23,7],[585,6]]},"567":{"position":[[1153,6]]},"598":{"position":[[185,6]]},"610":{"position":[[1461,7]]},"612":{"position":[[1701,6]]},"659":{"position":[[58,7],[984,6]]},"688":{"position":[[873,6]]},"689":{"position":[[464,6]]},"709":{"position":[[302,6]]},"723":{"position":[[2243,6]]},"772":{"position":[[530,7]]},"784":{"position":[[694,6],[842,6]]},"835":{"position":[[1048,6]]},"838":{"position":[[2239,6]]},"839":{"position":[[334,7]]},"875":{"position":[[144,6]]},"898":{"position":[[1763,6]]},"904":{"position":[[1732,6],[2369,6],[2404,7],[2522,7]]},"906":{"position":[[252,6]]},"910":{"position":[[92,6]]},"981":{"position":[[176,6],[299,6]]},"1074":{"position":[[789,6]]},"1080":{"position":[[868,6]]},"1085":{"position":[[2497,6]]},"1115":{"position":[[67,6]]},"1124":{"position":[[1923,6]]},"1235":{"position":[[50,6]]},"1239":{"position":[[83,6]]},"1272":{"position":[[356,7]]},"1284":{"position":[[373,6]]},"1317":{"position":[[674,6]]}},"keywords":{}}],["simplep",{"_index":4334,"title":{"910":{"position":[[0,10]]}},"content":{"749":{"position":[[15295,10]]}},"keywords":{}}],["simpler",{"_index":1197,"title":{"478":{"position":[[3,7]]}},"content":{"173":{"position":[[420,7]]},"207":{"position":[[350,7]]},"282":{"position":[[307,7]]},"362":{"position":[[758,8]]},"432":{"position":[[62,7]]},"534":{"position":[[494,7]]},"594":{"position":[[492,7]]},"688":{"position":[[284,7]]},"838":{"position":[[526,7]]},"860":{"position":[[810,7]]}},"keywords":{}}],["simplest",{"_index":3188,"title":{},"content":{"496":{"position":[[30,8]]},"1157":{"position":[[517,8]]}},"keywords":{}}],["simpli",{"_index":727,"title":{},"content":{"47":{"position":[[393,6]]},"302":{"position":[[223,6]]},"310":{"position":[[185,6]]},"408":{"position":[[1448,6]]},"409":{"position":[[238,6]]},"412":{"position":[[1617,6],[2580,6],[6779,6]]},"421":{"position":[[668,6]]},"535":{"position":[[350,6]]},"585":{"position":[[8,6]]},"759":{"position":[[1354,6]]},"1189":{"position":[[115,6]]}},"keywords":{}}],["simplic",{"_index":626,"title":{},"content":{"39":{"position":[[486,10]]},"179":{"position":[[282,10]]},"429":{"position":[[242,10]]},"441":{"position":[[114,10]]},"860":{"position":[[1055,10]]},"875":{"position":[[4859,10],[5627,10]]},"1156":{"position":[[1,11]]}},"keywords":{}}],["simplifi",{"_index":973,"title":{"223":{"position":[[0,10]]},"348":{"position":[[41,8]]}},"content":{"77":{"position":[[170,10]]},"79":{"position":[[61,11]]},"89":{"position":[[19,8]]},"96":{"position":[[154,10]]},"104":{"position":[[190,11]]},"132":{"position":[[92,10]]},"158":{"position":[[6,10]]},"165":{"position":[[51,8]]},"170":{"position":[[257,10]]},"173":{"position":[[1039,10],[3167,10]]},"174":{"position":[[367,10],[2810,10]]},"184":{"position":[[233,10]]},"192":{"position":[[40,8]]},"198":{"position":[[192,10]]},"219":{"position":[[273,10]]},"279":{"position":[[110,10]]},"293":{"position":[[114,10]]},"354":{"position":[[409,8]]},"364":{"position":[[794,11]]},"411":{"position":[[1152,10],[1842,10]]},"433":{"position":[[366,8]]},"445":{"position":[[1313,10]]},"515":{"position":[[360,10]]},"518":{"position":[[273,8]]},"523":{"position":[[59,8]]},"560":{"position":[[627,10]]},"576":{"position":[[118,10]]},"585":{"position":[[157,8]]},"591":{"position":[[524,11]]},"860":{"position":[[55,10]]},"1085":{"position":[[3470,10]]},"1094":{"position":[[546,10]]}},"keywords":{}}],["simul",{"_index":1786,"title":{},"content":{"301":{"position":[[470,8],[538,8]]},"346":{"position":[[621,8]]},"453":{"position":[[230,9]]},"590":{"position":[[753,10]]},"614":{"position":[[672,9]]},"749":{"position":[[5760,8]]}},"keywords":{}}],["simultan",{"_index":1115,"title":{},"content":{"134":{"position":[[89,15]]},"267":{"position":[[650,14]]},"328":{"position":[[299,15]]},"411":{"position":[[411,12]]},"446":{"position":[[684,15]]},"566":{"position":[[873,14]]},"582":{"position":[[535,15]]},"617":{"position":[[536,12],[784,14]]},"1307":{"position":[[203,12]]}},"keywords":{}}],["sincer",{"_index":6089,"title":{},"content":{"1151":{"position":[[323,9]]},"1178":{"position":[[322,9]]}},"keywords":{}}],["singl",{"_index":736,"title":{"304":{"position":[[24,6]]},"1048":{"position":[[23,6]]},"1092":{"position":[[0,6]]}},"content":{"47":{"position":[[835,6]]},"116":{"position":[[111,6]]},"177":{"position":[[180,6]]},"188":{"position":[[1676,6]]},"202":{"position":[[390,6]]},"207":{"position":[[379,6]]},"287":{"position":[[29,6]]},"303":{"position":[[64,6],[1299,6]]},"304":{"position":[[357,6]]},"346":{"position":[[380,6]]},"354":{"position":[[351,6]]},"358":{"position":[[50,6],[630,6]]},"362":{"position":[[576,6]]},"367":{"position":[[141,6]]},"376":{"position":[[379,6]]},"381":{"position":[[559,6]]},"386":{"position":[[81,6]]},"393":{"position":[[793,6]]},"395":{"position":[[431,6]]},"401":{"position":[[50,6]]},"404":{"position":[[758,6]]},"411":{"position":[[1300,6],[2037,6],[2138,6]]},"412":{"position":[[1499,6],[1724,6],[4273,6],[5603,6],[5697,6],[12806,6]]},"416":{"position":[[336,6]]},"421":{"position":[[302,6]]},"455":{"position":[[396,6]]},"457":{"position":[[377,6]]},"458":{"position":[[1566,6]]},"463":{"position":[[849,6],[1178,6]]},"464":{"position":[[1075,6]]},"465":{"position":[[80,6]]},"466":{"position":[[443,6]]},"469":{"position":[[383,6]]},"478":{"position":[[232,6]]},"487":{"position":[[78,6]]},"559":{"position":[[1221,6]]},"611":{"position":[[63,7]]},"612":{"position":[[409,6],[560,6]]},"617":{"position":[[601,6],[1239,6],[1320,6],[2098,6]]},"621":{"position":[[83,7]]},"622":{"position":[[662,6]]},"662":{"position":[[188,6]]},"682":{"position":[[64,6],[204,6]]},"696":{"position":[[662,6]]},"698":{"position":[[1691,6],[2415,6]]},"699":{"position":[[834,6]]},"700":{"position":[[38,6]]},"701":{"position":[[643,6],[975,6]]},"710":{"position":[[223,6]]},"724":{"position":[[856,6]]},"754":{"position":[[621,6]]},"781":{"position":[[793,6]]},"783":{"position":[[260,6]]},"785":{"position":[[494,6]]},"795":{"position":[[99,6]]},"826":{"position":[[46,6]]},"838":{"position":[[217,6]]},"849":{"position":[[429,6]]},"875":{"position":[[288,6]]},"886":{"position":[[2926,6]]},"898":{"position":[[2739,6]]},"904":{"position":[[1861,6],[3234,6]]},"941":{"position":[[195,6]]},"944":{"position":[[543,6]]},"950":{"position":[[61,6],[117,6]]},"964":{"position":[[81,6],[404,6],[428,6],[491,6]]},"988":{"position":[[36,6]]},"1007":{"position":[[20,6]]},"1038":{"position":[[17,6]]},"1056":{"position":[[28,6]]},"1074":{"position":[[245,6]]},"1084":{"position":[[145,6]]},"1087":{"position":[[85,6]]},"1091":{"position":[[34,6]]},"1100":{"position":[[160,6]]},"1114":{"position":[[408,6]]},"1116":{"position":[[68,6],[161,6],[367,6]]},"1119":{"position":[[245,6]]},"1124":{"position":[[768,6]]},"1132":{"position":[[292,6]]},"1140":{"position":[[275,6]]},"1161":{"position":[[150,6]]},"1164":{"position":[[239,6]]},"1170":{"position":[[149,6]]},"1180":{"position":[[150,6]]},"1183":{"position":[[430,6]]},"1186":{"position":[[83,6],[215,6]]},"1194":{"position":[[298,6],[381,6],[489,6],[763,6],[988,6]]},"1238":{"position":[[268,6]]},"1295":{"position":[[991,6],[1184,6]]},"1296":{"position":[[678,6],[1514,6]]},"1299":{"position":[[348,6]]},"1304":{"position":[[464,6],[1552,6]]},"1307":{"position":[[266,6]]},"1315":{"position":[[1185,6]]},"1316":{"position":[[2617,6]]},"1317":{"position":[[723,6]]},"1319":{"position":[[441,6]]},"1321":{"position":[[336,6]]},"1323":{"position":[[59,6],[137,6]]},"1324":{"position":[[1002,6]]}},"keywords":{}}],["site",{"_index":1869,"title":{},"content":{"305":{"position":[[213,5]]},"402":{"position":[[2134,5]]},"408":{"position":[[1103,4]]},"412":{"position":[[7940,4],[8128,4]]},"421":{"position":[[228,5],[366,5],[560,5]]},"736":{"position":[[285,5]]},"781":{"position":[[183,5]]},"1140":{"position":[[44,5],[163,5]]}},"keywords":{}}],["situat",{"_index":1787,"title":{},"content":{"301":{"position":[[495,11]]},"430":{"position":[[106,10]]},"497":{"position":[[83,10]]},"612":{"position":[[271,9]]},"1003":{"position":[[86,10]]},"1300":{"position":[[614,11]]}},"keywords":{}}],["six",{"_index":3630,"title":{},"content":{"617":{"position":[[28,3],[153,3],[283,3]]}},"keywords":{}}],["size",{"_index":958,"title":{"69":{"position":[[6,4]]},"100":{"position":[[6,4]]},"228":{"position":[[6,4]]},"297":{"position":[[22,4]]},"303":{"position":[[29,4]]},"304":{"position":[[14,4]]},"461":{"position":[[8,4]]},"782":{"position":[[17,5]]},"1186":{"position":[[6,4]]}},"content":{"69":{"position":[[60,5]]},"100":{"position":[[98,5],[323,6]]},"141":{"position":[[191,5]]},"169":{"position":[[28,4]]},"197":{"position":[[119,4]]},"227":{"position":[[72,5]]},"228":{"position":[[67,5],[134,4],[346,6],[406,4]]},"243":{"position":[[663,4]]},"299":{"position":[[11,4]]},"306":{"position":[[343,4]]},"311":{"position":[[133,4]]},"316":{"position":[[492,5]]},"345":{"position":[[107,4]]},"387":{"position":[[455,6]]},"392":{"position":[[3052,4],[4971,4]]},"401":{"position":[[175,4],[186,4],[714,4]]},"408":{"position":[[1121,6]]},"412":{"position":[[6670,4],[6984,5],[7259,4],[8957,5],[9170,4]]},"430":{"position":[[573,4]]},"454":{"position":[[673,4]]},"461":{"position":[[633,4],[770,4],[951,4],[1006,4],[1256,4],[1438,4],[1513,4]]},"495":{"position":[[788,4]]},"581":{"position":[[548,4]]},"696":{"position":[[756,4],[1997,5]]},"717":{"position":[[364,4]]},"752":{"position":[[801,5]]},"759":{"position":[[756,4]]},"760":{"position":[[752,4]]},"773":{"position":[[809,4]]},"774":{"position":[[958,4]]},"962":{"position":[[300,4]]},"988":{"position":[[2904,5]]},"1125":{"position":[[682,5]]},"1137":{"position":[[154,4]]},"1143":{"position":[[174,4]]},"1167":{"position":[[63,4]]},"1198":{"position":[[629,4]]},"1207":{"position":[[616,4]]},"1208":{"position":[[1698,4]]},"1222":{"position":[[643,4]]},"1235":{"position":[[79,5]]},"1237":{"position":[[246,5]]},"1242":{"position":[[138,5]]},"1282":{"position":[[265,4]]},"1286":{"position":[[184,5]]},"1292":{"position":[[822,5],[880,4],[907,4],[930,4]]},"1294":{"position":[[1934,4],[2047,4]]},"1321":{"position":[[1118,5]]}},"keywords":{}}],["size"",{"_index":1469,"title":{},"content":{"243":{"position":[[768,10]]}},"keywords":{}}],["size.in",{"_index":6279,"title":{},"content":{"1235":{"position":[[248,7]]}},"keywords":{}}],["size=8192",{"_index":4581,"title":{},"content":{"773":{"position":[[885,9]]}},"keywords":{}}],["sizeslow",{"_index":6180,"title":{},"content":{"1200":{"position":[[12,8]]}},"keywords":{}}],["sizewrit",{"_index":4584,"title":{},"content":{"774":{"position":[[988,10]]}},"keywords":{}}],["skeletor",{"_index":4608,"title":{},"content":{"791":{"position":[[441,10],[535,11]]}},"keywords":{}}],["skill",{"_index":1416,"title":{},"content":{"230":{"position":[[239,7]]},"1074":{"position":[[487,6],[607,6]]}},"keywords":{}}],["skip",{"_index":3114,"title":{},"content":{"478":{"position":[[268,4]]},"749":{"position":[[2878,4]]},"759":{"position":[[1364,7]]},"886":{"position":[[3085,4]]},"902":{"position":[[22,8]]},"988":{"position":[[964,7],[3218,7]]},"1067":{"position":[[357,6]]},"1126":{"position":[[588,4]]},"1318":{"position":[[263,4],[784,4]]}},"keywords":{}}],["slash",{"_index":4137,"title":{},"content":{"749":{"position":[[371,5],[6282,5],[16153,5]]}},"keywords":{}}],["slave",{"_index":383,"title":{},"content":{"23":{"position":[[153,5]]},"903":{"position":[[351,5]]}},"keywords":{}}],["slight",{"_index":2390,"title":{},"content":{"398":{"position":[[207,6]]},"875":{"position":[[9411,6]]},"1298":{"position":[[49,6]]}},"keywords":{}}],["slightli",{"_index":3019,"title":{},"content":{"461":{"position":[[883,8]]},"1211":{"position":[[179,8]]},"1295":{"position":[[742,9]]},"1297":{"position":[[458,9]]}},"keywords":{}}],["slogan",{"_index":3948,"title":{},"content":{"699":{"position":[[323,6]]}},"keywords":{}}],["slow",{"_index":391,"title":{"429":{"position":[[16,6]]},"1293":{"position":[[17,4]]}},"content":{"23":{"position":[[374,4]]},"43":{"position":[[382,4]]},"58":{"position":[[93,5],[214,4]]},"309":{"position":[[116,4]]},"311":{"position":[[44,4]]},"354":{"position":[[894,4]]},"358":{"position":[[430,4]]},"396":{"position":[[1640,5]]},"402":{"position":[[1831,5]]},"411":{"position":[[3298,4]]},"412":{"position":[[10506,4],[14248,4]]},"415":{"position":[[411,4]]},"421":{"position":[[386,4],[923,4]]},"427":{"position":[[824,7]]},"430":{"position":[[394,4]]},"432":{"position":[[752,4]]},"442":{"position":[[84,4]]},"464":{"position":[[694,4]]},"469":{"position":[[271,4]]},"470":{"position":[[424,4]]},"486":{"position":[[111,4]]},"491":{"position":[[1006,4]]},"545":{"position":[[95,4],[137,4]]},"605":{"position":[[95,4],[137,4]]},"653":{"position":[[701,6]]},"656":{"position":[[361,4]]},"696":{"position":[[904,4]]},"704":{"position":[[355,4]]},"709":{"position":[[673,5]]},"749":{"position":[[2621,4]]},"793":{"position":[[1321,4]]},"801":{"position":[[229,4]]},"802":{"position":[[234,4]]},"1013":{"position":[[784,4]]},"1093":{"position":[[245,4]]},"1164":{"position":[[1435,4]]},"1191":{"position":[[321,4]]},"1198":{"position":[[532,5]]},"1238":{"position":[[333,4]]},"1276":{"position":[[329,4]]},"1316":{"position":[[3614,4]]}},"keywords":{}}],["slow.indexeddb",{"_index":3099,"title":{},"content":{"470":{"position":[[517,14]]}},"keywords":{}}],["slower",{"_index":940,"title":{},"content":{"66":{"position":[[132,6],[294,6]]},"69":{"position":[[205,6]]},"404":{"position":[[380,6]]},"408":{"position":[[3999,6]]},"412":{"position":[[9754,6]]},"427":{"position":[[330,6]]},"434":{"position":[[190,6]]},"435":{"position":[[281,6]]},"454":{"position":[[458,6]]},"464":{"position":[[578,6],[897,6]]},"467":{"position":[[361,6]]},"703":{"position":[[1134,7],[1156,7]]},"709":{"position":[[870,7]]},"1072":{"position":[[2883,7]]},"1143":{"position":[[402,6]]},"1211":{"position":[[188,6]]},"1222":{"position":[[1266,7]]},"1267":{"position":[[396,6]]},"1270":{"position":[[29,6]]},"1276":{"position":[[205,6]]},"1295":{"position":[[1260,6]]}},"keywords":{}}],["small",{"_index":527,"title":{"464":{"position":[[11,5]]},"465":{"position":[[11,5]]},"696":{"position":[[19,5]]}},"content":{"34":{"position":[[12,6],[282,5]]},"63":{"position":[[48,5]]},"287":{"position":[[426,5]]},"317":{"position":[[69,5]]},"386":{"position":[[75,5]]},"396":{"position":[[336,5],[557,5]]},"401":{"position":[[243,5]]},"411":{"position":[[151,5],[667,5],[1333,5]]},"412":{"position":[[12759,5]]},"424":{"position":[[97,5]]},"429":{"position":[[190,5]]},"432":{"position":[[1432,5]]},"441":{"position":[[167,5]]},"450":{"position":[[66,5]]},"451":{"position":[[321,5]]},"464":{"position":[[31,5],[80,5]]},"555":{"position":[[905,5]]},"559":{"position":[[166,5],[1020,5]]},"560":{"position":[[307,5]]},"566":{"position":[[1412,5]]},"567":{"position":[[985,5]]},"630":{"position":[[798,5]]},"659":{"position":[[720,5]]},"709":{"position":[[195,5]]},"772":{"position":[[2059,5]]},"828":{"position":[[237,5]]},"835":{"position":[[825,5]]},"841":{"position":[[886,5],[1338,5]]},"1156":{"position":[[126,5],[162,5]]},"1157":{"position":[[296,5]]},"1170":{"position":[[191,5]]},"1186":{"position":[[59,5]]},"1192":{"position":[[765,5]]},"1193":{"position":[[107,5]]},"1235":{"position":[[67,5]]},"1242":{"position":[[125,5]]},"1297":{"position":[[529,5]]}},"keywords":{}}],["smaller",{"_index":1029,"title":{},"content":{"100":{"position":[[309,7]]},"228":{"position":[[332,7]]},"357":{"position":[[521,7]]},"402":{"position":[[364,7],[1855,7]]},"643":{"position":[[204,7]]},"717":{"position":[[350,7]]},"796":{"position":[[195,7]]},"1157":{"position":[[450,7]]},"1235":{"position":[[234,7]]}},"keywords":{}}],["smallest",{"_index":2322,"title":{},"content":{"394":{"position":[[1046,9]]},"490":{"position":[[610,8]]},"1137":{"position":[[139,8]]}},"keywords":{}}],["smarter",{"_index":690,"title":{"44":{"position":[[6,7]]}},"content":{},"keywords":{}}],["smartphon",{"_index":2430,"title":{},"content":{"399":{"position":[[312,11]]},"500":{"position":[[788,12]]},"700":{"position":[[869,10]]},"1270":{"position":[[389,11]]}},"keywords":{}}],["smooth",{"_index":1031,"title":{},"content":{"101":{"position":[[260,6]]},"152":{"position":[[326,6]]},"277":{"position":[[209,6]]},"280":{"position":[[418,6]]},"379":{"position":[[306,6]]},"412":{"position":[[11692,6]]},"446":{"position":[[1061,6]]},"504":{"position":[[941,6]]},"642":{"position":[[208,6]]}},"keywords":{}}],["smooth.perform",{"_index":1979,"title":{},"content":{"346":{"position":[[731,18]]}},"keywords":{}}],["smoother",{"_index":909,"title":{},"content":{"65":{"position":[[383,8]]},"87":{"position":[[227,8]]},"411":{"position":[[1811,8]]},"445":{"position":[[1935,8]]},"474":{"position":[[281,8]]},"801":{"position":[[547,8]]}},"keywords":{}}],["smoothli",{"_index":1430,"title":{},"content":{"240":{"position":[[251,8]]},"350":{"position":[[271,8]]},"376":{"position":[[647,9]]},"489":{"position":[[670,8]]},"493":{"position":[[30,8]]}},"keywords":{}}],["snappi",{"_index":1330,"title":{},"content":{"205":{"position":[[411,6]]},"342":{"position":[[160,7]]},"410":{"position":[[299,6]]},"489":{"position":[[523,6]]},"495":{"position":[[27,7]]},"498":{"position":[[569,7]]}},"keywords":{}}],["snappier",{"_index":3241,"title":{},"content":{"507":{"position":[[156,8]]}},"keywords":{}}],["snapshot",{"_index":4808,"title":{},"content":{"841":{"position":[[668,10]]}},"keywords":{}}],["snh",{"_index":4440,"title":{},"content":{"749":{"position":[[24372,3]]}},"keywords":{}}],["snippet",{"_index":1769,"title":{},"content":{"300":{"position":[[111,7]]},"425":{"position":[[236,8]]},"493":{"position":[[315,8]]},"522":{"position":[[242,7]]}},"keywords":{}}],["social",{"_index":3197,"title":{},"content":{"497":{"position":[[52,6]]}},"keywords":{}}],["socket",{"_index":3567,"title":{},"content":{"611":{"position":[[633,6],[1013,6]]},"892":{"position":[[325,9]]},"988":{"position":[[5206,6],[5637,6]]}},"keywords":{}}],["socket.clos",{"_index":5483,"title":{},"content":{"988":{"position":[[5736,15]]}},"keywords":{}}],["socket.io",{"_index":3580,"title":{},"content":{"611":{"position":[[1330,9]]},"906":{"position":[[547,11]]}},"keywords":{}}],["socket.onclos",{"_index":5481,"title":{},"content":{"988":{"position":[[5667,14]]}},"keywords":{}}],["socket.onerror",{"_index":5482,"title":{},"content":{"988":{"position":[[5710,14]]}},"keywords":{}}],["socket.onmessag",{"_index":3573,"title":{},"content":{"611":{"position":[[818,16]]},"988":{"position":[[5542,16]]}},"keywords":{}}],["socket.onopen",{"_index":3569,"title":{},"content":{"611":{"position":[[677,13]]},"988":{"position":[[5752,13]]}},"keywords":{}}],["socket.send('hello",{"_index":3572,"title":{},"content":{"611":{"position":[[785,18]]}},"keywords":{}}],["soft",{"_index":3455,"title":{},"content":{"569":{"position":[[459,4]]},"861":{"position":[[1653,4]]}},"keywords":{}}],["softwar",{"_index":1228,"title":{"406":{"position":[[16,8]]}},"content":{"177":{"position":[[30,8]]},"267":{"position":[[1631,8]]},"407":{"position":[[16,9],[887,9],[921,8]]},"419":{"position":[[1690,9]]},"422":{"position":[[362,8]]},"444":{"position":[[34,8]]},"473":{"position":[[30,8]]},"644":{"position":[[662,8]]},"1320":{"position":[[113,8]]}},"keywords":{}}],["software"",{"_index":2812,"title":{},"content":{"419":{"position":[[1538,14]]}},"keywords":{}}],["software,"",{"_index":2803,"title":{},"content":{"419":{"position":[[682,15]]}},"keywords":{}}],["sole",{"_index":1009,"title":{},"content":{"91":{"position":[[119,6]]},"321":{"position":[[313,6]]},"698":{"position":[[1594,6]]}},"keywords":{}}],["solid",{"_index":3232,"title":{},"content":{"503":{"position":[[193,5]]}},"keywords":{}}],["solut",{"_index":437,"title":{"118":{"position":[[31,9]]},"153":{"position":[[32,9]]},"179":{"position":[[31,9]]},"212":{"position":[[18,8]]},"295":{"position":[[15,9]]},"322":{"position":[[31,9]]},"441":{"position":[[39,9]]},"445":{"position":[[54,10]]},"479":{"position":[[47,9]]},"575":{"position":[[31,9]]},"658":{"position":[[9,9]]},"737":{"position":[[0,9]]},"834":{"position":[[9,9]]}},"content":{"27":{"position":[[21,8]]},"40":{"position":[[731,8]]},"43":{"position":[[67,10]]},"66":{"position":[[203,9],[620,9]]},"83":{"position":[[52,8]]},"102":{"position":[[76,9]]},"117":{"position":[[242,8]]},"118":{"position":[[224,9]]},"148":{"position":[[29,8]]},"153":{"position":[[64,8]]},"161":{"position":[[132,10]]},"170":{"position":[[40,8]]},"173":{"position":[[88,9]]},"174":{"position":[[3027,10]]},"178":{"position":[[100,8]]},"179":{"position":[[35,8]]},"198":{"position":[[46,8]]},"229":{"position":[[121,8]]},"241":{"position":[[729,10]]},"263":{"position":[[520,8]]},"271":{"position":[[29,8]]},"278":{"position":[[46,8]]},"287":{"position":[[44,9]]},"290":{"position":[[139,10]]},"295":{"position":[[145,10]]},"318":{"position":[[167,9]]},"320":{"position":[[339,8]]},"321":{"position":[[475,8]]},"331":{"position":[[106,9],[266,9]]},"350":{"position":[[133,9]]},"351":{"position":[[146,9]]},"354":{"position":[[186,9],[1172,9],[1652,9]]},"357":{"position":[[508,8]]},"368":{"position":[[31,9]]},"371":{"position":[[79,8]]},"372":{"position":[[66,8]]},"373":{"position":[[393,9],[757,10]]},"386":{"position":[[132,10]]},"388":{"position":[[165,9]]},"412":{"position":[[462,9],[887,8],[1210,9],[3657,9],[14597,9]]},"429":{"position":[[134,9]]},"430":{"position":[[635,9],[810,9]]},"432":{"position":[[49,8]]},"436":{"position":[[255,8]]},"437":{"position":[[64,9]]},"441":{"position":[[516,10]]},"445":{"position":[[248,8],[2061,8]]},"447":{"position":[[281,8],[582,8]]},"458":{"position":[[1031,10],[1432,8]]},"476":{"position":[[153,9]]},"513":{"position":[[76,8]]},"520":{"position":[[176,9],[287,8],[448,8]]},"524":{"position":[[994,8]]},"530":{"position":[[169,9]]},"546":{"position":[[77,9]]},"554":{"position":[[82,8]]},"556":{"position":[[91,9]]},"574":{"position":[[676,9]]},"576":{"position":[[385,8]]},"606":{"position":[[77,9]]},"644":{"position":[[407,10]]},"661":{"position":[[1667,8]]},"698":{"position":[[937,8]]},"711":{"position":[[2109,8]]},"737":{"position":[[5,8]]},"834":{"position":[[29,9]]},"835":{"position":[[41,8]]},"836":{"position":[[2006,8],[2235,8],[2487,9]]},"839":{"position":[[29,8],[1194,8]]},"849":{"position":[[406,10]]},"912":{"position":[[260,8]]},"1091":{"position":[[85,9]]},"1147":{"position":[[187,9]]},"1148":{"position":[[33,8]]},"1151":{"position":[[219,9]]},"1178":{"position":[[218,9]]},"1249":{"position":[[264,10]]},"1270":{"position":[[473,8]]},"1305":{"position":[[226,8]]}},"keywords":{}}],["solutions.vendor",{"_index":4800,"title":{},"content":{"839":{"position":[[819,16]]}},"keywords":{}}],["solutions—particularli",{"_index":2015,"title":{},"content":{"354":{"position":[[7,22]]}},"keywords":{}}],["solv",{"_index":1072,"title":{},"content":{"118":{"position":[[389,6]]},"323":{"position":[[647,6]]},"411":{"position":[[4454,6]]},"412":{"position":[[482,5],[3871,5],[15294,6]]},"535":{"position":[[779,6]]},"595":{"position":[[866,6]]},"698":{"position":[[1524,7],[1911,5],[3116,5]]},"737":{"position":[[430,5]]},"1183":{"position":[[257,5]]},"1198":{"position":[[70,6]]},"1301":{"position":[[552,5]]}},"keywords":{}}],["solvabl",{"_index":2776,"title":{},"content":{"412":{"position":[[15304,8]]}},"keywords":{}}],["somehow",{"_index":3057,"title":{},"content":{"464":{"position":[[1265,7]]}},"keywords":{}}],["somekey",{"_index":1809,"title":{},"content":{"302":{"position":[[809,9]]}},"keywords":{}}],["someon",{"_index":2760,"title":{},"content":{"412":{"position":[[13197,7]]},"1316":{"position":[[2783,7]]}},"keywords":{}}],["somet",{"_index":3809,"title":{},"content":{"661":{"position":[[1318,12]]},"836":{"position":[[984,12]]}},"keywords":{}}],["someth",{"_index":2560,"title":{},"content":{"408":{"position":[[3939,9],[4556,9]]},"411":{"position":[[4520,9]]},"412":{"position":[[8101,9],[10375,9],[12982,9],[14317,9]]},"458":{"position":[[448,9]]},"569":{"position":[[1130,9]]},"613":{"position":[[999,9]]},"661":{"position":[[1847,9]]},"704":{"position":[[135,9]]},"709":{"position":[[1300,9]]},"966":{"position":[[134,9]]},"996":{"position":[[228,9]]},"1051":{"position":[[96,9]]},"1135":{"position":[[285,9]]},"1249":{"position":[[92,9]]},"1322":{"position":[[152,9]]}},"keywords":{}}],["sometim",{"_index":1086,"title":{},"content":{"129":{"position":[[148,9]]},"402":{"position":[[565,9]]},"404":{"position":[[362,9]]},"412":{"position":[[3970,9]]},"569":{"position":[[595,9]]},"655":{"position":[[256,9]]},"698":{"position":[[1882,9],[2489,9]]},"775":{"position":[[518,9]]},"797":{"position":[[1,8]]},"806":{"position":[[193,9]]},"1022":{"position":[[1,9]]},"1048":{"position":[[1,9]]},"1066":{"position":[[189,9]]},"1085":{"position":[[2781,9]]},"1185":{"position":[[171,9]]},"1198":{"position":[[954,9]]}},"keywords":{}}],["somevalu",{"_index":3808,"title":{},"content":{"661":{"position":[[1303,9]]},"836":{"position":[[969,9]]}},"keywords":{}}],["somewher",{"_index":6229,"title":{},"content":{"1210":{"position":[[585,9]]}},"keywords":{}}],["soon",{"_index":1926,"title":{},"content":{"326":{"position":[[206,4]]},"379":{"position":[[271,4]]},"570":{"position":[[368,4]]},"634":{"position":[[182,4]]},"701":{"position":[[543,4],[753,4]]},"709":{"position":[[263,4]]},"778":{"position":[[513,4]]},"1009":{"position":[[437,4]]},"1297":{"position":[[276,4]]},"1304":{"position":[[617,4]]},"1316":{"position":[[3818,4]]}},"keywords":{}}],["sooner",{"_index":3960,"title":{},"content":{"702":{"position":[[28,6]]},"1085":{"position":[[2675,7]]},"1319":{"position":[[1,6]]}},"keywords":{}}],["sophist",{"_index":640,"title":{},"content":{"40":{"position":[[473,13]]},"203":{"position":[[137,13]]},"205":{"position":[[184,13]]},"289":{"position":[[56,13]]},"353":{"position":[[111,13]]},"354":{"position":[[742,13]]},"412":{"position":[[14583,13]]},"510":{"position":[[443,13]]},"530":{"position":[[239,13]]},"723":{"position":[[2117,13]]}},"keywords":{}}],["sort",{"_index":341,"title":{},"content":{"19":{"position":[[800,4],[871,5]]},"54":{"position":[[171,5]]},"130":{"position":[[526,5]]},"143":{"position":[[466,5],[647,5]]},"393":{"position":[[1086,4]]},"394":{"position":[[426,7],[1009,7],[1107,7]]},"395":{"position":[[180,4]]},"397":{"position":[[329,7]]},"398":{"position":[[635,7],[1118,5],[1280,5],[1618,6],[2473,5],[2771,6]]},"400":{"position":[[254,4],[282,5],[346,6]]},"402":{"position":[[781,4]]},"580":{"position":[[546,5]]},"723":{"position":[[2369,8]]},"749":{"position":[[4020,6],[4375,4],[4457,7],[4550,4],[4626,4]]},"829":{"position":[[2427,5],[3343,5]]},"885":{"position":[[1634,6]]},"986":{"position":[[220,4],[293,4],[930,6]]},"1056":{"position":[[232,5]]},"1065":{"position":[[1576,4],[1714,4],[1868,4],[1987,7]]},"1069":{"position":[[689,6],[850,6]]},"1079":{"position":[[569,4]]},"1249":{"position":[[532,5]]},"1320":{"position":[[897,6]]}},"keywords":{}}],["sort([['field",{"_index":4192,"title":{},"content":{"749":{"position":[[4419,16]]}},"keywords":{}}],["sort({updateat",{"_index":4996,"title":{},"content":{"875":{"position":[[2535,16]]}},"keywords":{}}],["sortabl",{"_index":2330,"title":{},"content":{"395":{"position":[[326,8]]},"396":{"position":[[1800,8]]},"397":{"position":[[156,8]]},"986":{"position":[[84,8],[1184,8]]},"1085":{"position":[[598,9]]}},"keywords":{}}],["sortbyobjectnumberproperti",{"_index":2305,"title":{},"content":{"394":{"position":[[533,26]]}},"keywords":{}}],["sorted.slice(0",{"_index":2413,"title":{},"content":{"398":{"position":[[1717,15],[2870,15]]}},"keywords":{}}],["sorteddocu",{"_index":5097,"title":{},"content":{"885":{"position":[[1687,15]]}},"keywords":{}}],["sorteddocuments.filter(doc",{"_index":5104,"title":{},"content":{"885":{"position":[[2031,26]]}},"keywords":{}}],["sound",{"_index":6558,"title":{},"content":{"1316":{"position":[[2428,6]]}},"keywords":{}}],["sourc",{"_index":366,"title":{"1024":{"position":[[32,6]]}},"content":{"22":{"position":[[43,6],[105,6]]},"29":{"position":[[379,7],[410,6]]},"38":{"position":[[798,6],[822,6]]},"50":{"position":[[424,7]]},"61":{"position":[[207,7]]},"84":{"position":[[198,6]]},"113":{"position":[[56,6]]},"114":{"position":[[211,6]]},"149":{"position":[[211,6]]},"155":{"position":[[17,6]]},"174":{"position":[[2972,6]]},"175":{"position":[[204,6]]},"177":{"position":[[20,6]]},"198":{"position":[[489,6]]},"255":{"position":[[1775,7]]},"347":{"position":[[211,6]]},"362":{"position":[[1282,6]]},"386":{"position":[[267,6]]},"403":{"position":[[276,6]]},"405":{"position":[[43,6]]},"411":{"position":[[2044,6],[2342,7],[3995,6]]},"412":{"position":[[5610,6]]},"420":{"position":[[968,7]]},"455":{"position":[[449,6]]},"478":{"position":[[239,6]]},"511":{"position":[[211,6]]},"514":{"position":[[47,6]]},"531":{"position":[[211,6]]},"567":{"position":[[469,6]]},"571":{"position":[[357,7]]},"591":{"position":[[211,6]]},"614":{"position":[[49,6]]},"661":{"position":[[508,7]]},"670":{"position":[[423,6]]},"674":{"position":[[253,6]]},"698":{"position":[[2581,9]]},"700":{"position":[[45,6],[73,6]]},"724":{"position":[[669,6]]},"749":{"position":[[9234,6]]},"835":{"position":[[783,7]]},"839":{"position":[[1076,6]]},"840":{"position":[[691,6]]},"860":{"position":[[28,6]]},"904":{"position":[[2494,6]]},"906":{"position":[[1129,6]]},"958":{"position":[[525,6]]},"1020":{"position":[[35,6],[306,6]]},"1028":{"position":[[149,6]]},"1272":{"position":[[374,6]]}},"keywords":{}}],["sourcecod",{"_index":3622,"title":{},"content":{"613":{"position":[[1104,11]]}},"keywords":{}}],["spa",{"_index":1059,"title":{},"content":{"116":{"position":[[136,6]]}},"keywords":{}}],["space",{"_index":944,"title":{},"content":{"66":{"position":[[393,5]]},"81":{"position":[[83,5]]},"111":{"position":[[21,6]]},"236":{"position":[[199,5]]},"298":{"position":[[248,6],[560,6]]},"299":{"position":[[779,5],[1011,6],[1133,5]]},"300":{"position":[[184,5],[366,8],[413,8],[642,6]]},"301":{"position":[[146,5]]},"302":{"position":[[644,5],[966,9]]},"305":{"position":[[250,5]]},"361":{"position":[[430,5]]},"366":{"position":[[330,5]]},"396":{"position":[[278,6]]},"402":{"position":[[2163,6],[2271,5]]},"408":{"position":[[1008,5]]},"412":{"position":[[7816,5]]},"420":{"position":[[1384,5]]},"461":{"position":[[1121,5],[1205,6],[1583,6]]},"528":{"position":[[53,5]]},"588":{"position":[[91,5]]},"660":{"position":[[243,6]]},"696":{"position":[[1077,5],[1346,5],[1712,5]]},"773":{"position":[[803,5],[879,5]]},"780":{"position":[[297,6]]},"796":{"position":[[209,5],[387,5],[683,5],[1103,5]]},"837":{"position":[[526,5]]},"932":{"position":[[268,5]]},"977":{"position":[[64,6]]},"1143":{"position":[[318,5]]}},"keywords":{}}],["span",{"_index":3986,"title":{},"content":{"709":{"position":[[241,4]]}},"keywords":{}}],["spanner",{"_index":2772,"title":{},"content":{"412":{"position":[[14687,9]]},"1324":{"position":[[661,8]]}},"keywords":{}}],["spare",{"_index":5551,"title":{},"content":{"1004":{"position":[[512,6]]}},"keywords":{}}],["sparsiti",{"_index":2425,"title":{},"content":{"398":{"position":[[3354,8]]}},"keywords":{}}],["spawn",{"_index":1242,"title":{},"content":{"188":{"position":[[130,5]]},"392":{"position":[[3701,5]]},"460":{"position":[[469,8],[559,7]]},"463":{"position":[[91,8]]},"872":{"position":[[2993,5]]},"1088":{"position":[[349,5]]}},"keywords":{}}],["spec",{"_index":5174,"title":{},"content":{"890":{"position":[[897,4]]},"1084":{"position":[[265,4]]}},"keywords":{}}],["special",{"_index":2075,"title":{},"content":{"359":{"position":[[127,11]]},"381":{"position":[[439,11]]},"390":{"position":[[24,11]]},"444":{"position":[[22,11]]},"563":{"position":[[163,7]]},"569":{"position":[[324,11]]},"685":{"position":[[40,7]]}},"keywords":{}}],["specif",{"_index":92,"title":{"299":{"position":[[8,8]]},"797":{"position":[[6,8]]},"1066":{"position":[[10,8]]}},"content":{"6":{"position":[[624,8]]},"7":{"position":[[459,8]]},"33":{"position":[[425,8]]},"38":{"position":[[447,8]]},"100":{"position":[[185,12]]},"106":{"position":[[125,8]]},"138":{"position":[[68,8]]},"140":{"position":[[190,8]]},"146":{"position":[[223,8]]},"147":{"position":[[261,8]]},"151":{"position":[[24,9]]},"153":{"position":[[82,12]]},"159":{"position":[[161,8]]},"162":{"position":[[805,8]]},"168":{"position":[[166,8]]},"174":{"position":[[1100,8]]},"189":{"position":[[707,8]]},"194":{"position":[[83,8]]},"196":{"position":[[237,8]]},"222":{"position":[[228,8]]},"228":{"position":[[207,12]]},"235":{"position":[[131,8]]},"260":{"position":[[98,8]]},"356":{"position":[[248,8]]},"369":{"position":[[284,8]]},"393":{"position":[[591,8]]},"402":{"position":[[1128,8]]},"411":{"position":[[1623,8]]},"412":{"position":[[15322,8]]},"427":{"position":[[1008,8]]},"430":{"position":[[249,8]]},"441":{"position":[[484,8]]},"451":{"position":[[67,13]]},"455":{"position":[[403,8],[533,8],[892,8]]},"456":{"position":[[69,8]]},"461":{"position":[[936,8]]},"462":{"position":[[231,8]]},"482":{"position":[[96,8]]},"520":{"position":[[457,12]]},"527":{"position":[[122,8]]},"535":{"position":[[835,8]]},"569":{"position":[[182,8],[1459,8]]},"570":{"position":[[122,8]]},"595":{"position":[[916,8]]},"612":{"position":[[1552,14]]},"617":{"position":[[1658,8]]},"653":{"position":[[15,8]]},"686":{"position":[[833,8]]},"690":{"position":[[131,8]]},"701":{"position":[[699,8]]},"719":{"position":[[30,8]]},"723":{"position":[[2335,8]]},"729":{"position":[[198,8]]},"826":{"position":[[338,8]]},"830":{"position":[[134,8],[168,8]]},"832":{"position":[[399,8]]},"875":{"position":[[66,8]]},"890":{"position":[[209,8]]},"1009":{"position":[[151,8],[374,8]]},"1067":{"position":[[1207,8],[1437,8]]},"1072":{"position":[[1937,8]]},"1101":{"position":[[317,8]]},"1104":{"position":[[40,8]]},"1106":{"position":[[184,8]]},"1132":{"position":[[688,8]]},"1138":{"position":[[481,8]]},"1198":{"position":[[49,8]]},"1201":{"position":[[276,8]]},"1202":{"position":[[237,8]]},"1206":{"position":[[148,8]]}},"keywords":{}}],["specifi",{"_index":2079,"title":{"746":{"position":[[0,7]]}},"content":{"361":{"position":[[17,10]]},"392":{"position":[[1352,9]]},"398":{"position":[[1861,9]]},"482":{"position":[[1149,9]]},"555":{"position":[[65,9]]},"612":{"position":[[1581,10]]},"681":{"position":[[414,7]]},"746":{"position":[[135,7]]},"749":{"position":[[325,9],[19364,9],[19484,9]]},"770":{"position":[[169,7]]},"797":{"position":[[200,7],[310,7]]},"886":{"position":[[1343,9]]},"911":{"position":[[139,7]]},"932":{"position":[[1303,7]]},"938":{"position":[[65,7]]},"987":{"position":[[983,7]]},"1066":{"position":[[275,7]]},"1067":{"position":[[2277,7]]},"1068":{"position":[[56,7]]},"1072":{"position":[[7,7]]},"1103":{"position":[[53,7]]},"1133":{"position":[[557,7]]},"1134":{"position":[[355,7]]},"1229":{"position":[[56,7]]},"1268":{"position":[[56,7]]},"1309":{"position":[[1273,7]]}},"keywords":{}}],["speed",{"_index":1427,"title":{"265":{"position":[[0,5]]}},"content":{"236":{"position":[[277,7]]},"266":{"position":[[441,5]]},"267":{"position":[[880,5],[1249,6]]},"342":{"position":[[48,5]]},"356":{"position":[[282,5]]},"365":{"position":[[750,5]]},"369":{"position":[[731,5]]},"376":{"position":[[492,5]]},"385":{"position":[[100,5]]},"408":{"position":[[2080,5],[2373,5],[3605,6]]},"412":{"position":[[8687,5]]},"418":{"position":[[713,5]]},"430":{"position":[[1109,5]]},"441":{"position":[[129,5]]},"462":{"position":[[602,6]]},"465":{"position":[[453,5]]},"469":{"position":[[73,5]]},"483":{"position":[[1203,6]]},"500":{"position":[[218,6]]},"527":{"position":[[155,5]]},"587":{"position":[[60,5]]},"590":{"position":[[662,5]]},"639":{"position":[[196,8]]},"640":{"position":[[347,5]]},"641":{"position":[[406,5]]},"723":{"position":[[90,5]]},"780":{"position":[[414,5]]},"783":{"position":[[184,6]]},"975":{"position":[[243,5]]},"1080":{"position":[[1107,5]]},"1120":{"position":[[459,5]]},"1137":{"position":[[177,6]]},"1206":{"position":[[580,6]]},"1316":{"position":[[1990,5]]}},"keywords":{}}],["speed.they",{"_index":6540,"title":{},"content":{"1316":{"position":[[455,10]]}},"keywords":{}}],["spend",{"_index":2613,"title":{},"content":{"411":{"position":[[1653,8]]}},"keywords":{}}],["spent",{"_index":2001,"title":{},"content":{"352":{"position":[[164,5]]}},"keywords":{}}],["spin",{"_index":5585,"title":{},"content":{"1009":{"position":[[178,4]]},"1135":{"position":[[172,4]]}},"keywords":{}}],["spinner",{"_index":713,"title":{"474":{"position":[[16,9]]},"778":{"position":[[29,9]]}},"content":{"46":{"position":[[389,9]]},"227":{"position":[[416,8]]},"400":{"position":[[702,8]]},"410":{"position":[[336,9]]},"421":{"position":[[626,8],[762,9]]},"427":{"position":[[1418,7]]},"474":{"position":[[81,9]]},"483":{"position":[[417,9]]},"486":{"position":[[12,9]]},"534":{"position":[[362,9]]},"594":{"position":[[360,9]]},"634":{"position":[[652,7]]},"778":{"position":[[285,8],[494,7]]},"995":{"position":[[740,7],[1806,7]]}},"keywords":{}}],["split",{"_index":2043,"title":{"1089":{"position":[[17,5]]}},"content":{"356":{"position":[[703,6]]},"412":{"position":[[12743,5]]},"643":{"position":[[184,9]]},"1022":{"position":[[88,5]]},"1092":{"position":[[61,5]]},"1120":{"position":[[600,5]]},"1295":{"position":[[190,5],[459,5]]},"1304":{"position":[[637,5]]}},"keywords":{}}],["sport",{"_index":3582,"title":{},"content":{"612":{"position":[[249,6]]},"624":{"position":[[825,6]]}},"keywords":{}}],["spotti",{"_index":3520,"title":{},"content":{"584":{"position":[[268,6]]}},"keywords":{}}],["spread",{"_index":6449,"title":{},"content":{"1295":{"position":[[313,6]]}},"keywords":{}}],["sql",{"_index":417,"title":{"31":{"position":[[7,4]]},"67":{"position":[[4,3]]},"74":{"position":[[48,4]]},"98":{"position":[[4,3]]},"105":{"position":[[48,4]]},"225":{"position":[[4,3]]},"232":{"position":[[38,4]]},"353":{"position":[[23,5]]},"354":{"position":[[15,3]]},"355":{"position":[[28,3]]},"1249":{"position":[[8,3]]},"1250":{"position":[[0,3]]}},"content":{"25":{"position":[[154,3]]},"31":{"position":[[8,3]]},"36":{"position":[[225,3]]},"67":{"position":[[1,3]]},"68":{"position":[[1,3]]},"70":{"position":[[1,3]]},"83":{"position":[[298,3]]},"98":{"position":[[7,3],[167,3]]},"99":{"position":[[1,3]]},"126":{"position":[[215,3]]},"174":{"position":[[735,4]]},"224":{"position":[[71,3]]},"225":{"position":[[7,3],[128,3]]},"226":{"position":[[1,3]]},"227":{"position":[[1,3]]},"228":{"position":[[13,3]]},"229":{"position":[[83,3]]},"232":{"position":[[273,3]]},"281":{"position":[[363,3]]},"351":{"position":[[13,3]]},"353":{"position":[[33,3]]},"354":{"position":[[182,3],[460,3],[653,3],[846,3],[1097,3],[1258,3],[1526,3]]},"356":{"position":[[54,3],[644,4]]},"360":{"position":[[249,4]]},"362":{"position":[[308,3],[464,3]]},"364":{"position":[[648,3]]},"412":{"position":[[13655,3],[14725,3]]},"435":{"position":[[28,3]]},"455":{"position":[[70,3],[194,3]]},"661":{"position":[[13,3],[139,3]]},"705":{"position":[[297,3],[659,3],[1269,3]]},"711":{"position":[[13,3],[191,3],[609,3],[1836,3],[2186,3]]},"836":{"position":[[15,3],[141,3],[921,3]]},"841":{"position":[[124,3],[310,3],[1135,3]]},"1065":{"position":[[340,3]]},"1071":{"position":[[203,3],[290,3]]},"1249":{"position":[[102,3],[143,3],[329,3]]},"1250":{"position":[[1,3],[80,3]]},"1251":{"position":[[1,3]]},"1252":{"position":[[276,3]]},"1257":{"position":[[106,3]]},"1280":{"position":[[15,3],[130,3],[410,5]]},"1282":{"position":[[628,3]]},"1315":{"position":[[340,4],[768,3],[1083,3],[1141,3],[1158,3],[1279,3]]},"1316":{"position":[[711,3],[1512,3],[2552,3],[3390,3]]},"1317":{"position":[[328,3],[422,3]]},"1320":{"position":[[374,3],[714,4]]},"1321":{"position":[[245,3]]},"1322":{"position":[[391,3]]},"1324":{"position":[[16,3],[514,3],[690,3]]}},"keywords":{}}],["sql"",{"_index":1490,"title":{},"content":{"244":{"position":[[441,9]]}},"keywords":{}}],["sql.j",{"_index":488,"title":{"30":{"position":[[0,7]]}},"content":{"30":{"position":[[1,6],[194,6]]},"31":{"position":[[76,7]]},"1324":{"position":[[113,7],[354,6]]}},"keywords":{}}],["sql1",{"_index":4425,"title":{},"content":{"749":{"position":[[23197,4]]}},"keywords":{}}],["sql2",{"_index":4427,"title":{},"content":{"749":{"position":[[23323,4]]}},"keywords":{}}],["sql3",{"_index":4429,"title":{},"content":{"749":{"position":[[23455,4]]}},"keywords":{}}],["sqlite",{"_index":100,"title":{"8":{"position":[[13,7]]},"11":{"position":[[8,7]]},"67":{"position":[[23,6]]},"98":{"position":[[23,6]]},"278":{"position":[[93,7]]},"357":{"position":[[16,7]]},"372":{"position":[[6,6]]},"448":{"position":[[57,6]]},"454":{"position":[[13,7]]},"657":{"position":[[21,7]]},"661":{"position":[[0,7]]},"706":{"position":[[52,7]]},"709":{"position":[[53,6]]},"711":{"position":[[0,6]]},"836":{"position":[[0,7]]},"1269":{"position":[[0,6]]},"1271":{"position":[[10,6]]},"1273":{"position":[[10,6],[42,6]]},"1278":{"position":[[16,7]]},"1279":{"position":[[11,6]]},"1280":{"position":[[17,7]]},"1282":{"position":[[18,6]]}},"content":{"8":{"position":[[18,6],[194,6],[218,6],[270,6],[290,6],[367,6],[847,6],[873,6],[946,7],[1188,8]]},"11":{"position":[[128,6],[190,10],[893,8],[985,6]]},"16":{"position":[[347,7]]},"17":{"position":[[308,6]]},"24":{"position":[[214,7]]},"30":{"position":[[39,6],[225,6],[284,7]]},"36":{"position":[[173,6]]},"43":{"position":[[327,6],[404,6]]},"59":{"position":[[178,7],[268,6],[298,7]]},"67":{"position":[[20,7]]},"69":{"position":[[28,6]]},"98":{"position":[[30,7]]},"186":{"position":[[111,6]]},"189":{"position":[[297,6],[406,6]]},"228":{"position":[[370,6]]},"266":{"position":[[114,7]]},"278":{"position":[[162,7]]},"279":{"position":[[381,7]]},"281":{"position":[[382,7]]},"282":{"position":[[490,7]]},"287":{"position":[[1092,6],[1192,6],[1232,6]]},"314":{"position":[[185,6]]},"318":{"position":[[274,6],[457,6]]},"336":{"position":[[429,6]]},"357":{"position":[[1,6],[106,6],[272,6],[322,6],[608,6],[654,6]]},"372":{"position":[[38,6],[131,7]]},"383":{"position":[[396,6]]},"384":{"position":[[228,6]]},"412":{"position":[[8493,6],[9855,6]]},"444":{"position":[[453,6]]},"454":{"position":[[515,6],[660,6],[1044,6]]},"455":{"position":[[118,7],[442,6],[553,6],[637,7]]},"457":{"position":[[255,6]]},"459":{"position":[[257,6]]},"463":{"position":[[388,6],[726,6],[751,6],[1156,6]]},"464":{"position":[[376,6],[402,6],[639,6]]},"465":{"position":[[237,6],[263,6]]},"466":{"position":[[200,6],[226,6],[385,6]]},"467":{"position":[[175,6],[201,6],[390,6],[462,6]]},"470":{"position":[[299,6]]},"483":{"position":[[1039,6]]},"489":{"position":[[277,7]]},"524":{"position":[[623,6],[687,6],[743,6],[806,6],[1044,7]]},"546":{"position":[[342,6]]},"551":{"position":[[140,6]]},"554":{"position":[[452,6],[706,6]]},"581":{"position":[[433,7]]},"606":{"position":[[332,6]]},"641":{"position":[[345,6]]},"661":{"position":[[1,6],[162,6],[218,6],[316,6],[816,6],[1092,6],[1348,6],[1653,6]]},"662":{"position":[[536,6],[784,6],[837,6],[910,6],[994,6],[1184,6],[1617,7],[1811,6],[1877,6],[2007,8]]},"705":{"position":[[1160,6]]},"710":{"position":[[607,6],[747,6],[2315,6]]},"711":{"position":[[1,6],[251,6],[523,6],[696,7],[821,6],[964,6],[1715,7],[1825,6],[2095,6]]},"714":{"position":[[381,7]]},"749":{"position":[[23227,6],[23353,6],[23485,6]]},"772":{"position":[[1111,6],[1161,6],[1192,6],[1296,6],[1548,8],[1768,6]]},"793":{"position":[[291,6],[1393,6]]},"836":{"position":[[3,6],[164,6],[220,6],[274,6],[415,6],[536,7],[663,8],[717,6],[1068,6],[1147,6],[1179,6],[1357,6],[1652,6],[1809,6],[2214,6]]},"837":{"position":[[1085,6],[1239,6],[1362,6],[1388,6],[1775,8],[2153,7]]},"838":{"position":[[1315,6],[1360,6],[1405,6],[1678,6],[1840,7],[1934,7],[2024,8],[2147,8],[3091,6]]},"841":{"position":[[29,6]]},"1137":{"position":[[113,7]]},"1143":{"position":[[553,7]]},"1191":{"position":[[406,6]]},"1196":{"position":[[89,6]]},"1214":{"position":[[883,6],[916,6]]},"1235":{"position":[[290,6],[350,6],[401,6]]},"1247":{"position":[[4,7],[17,6]]},"1249":{"position":[[117,7]]},"1270":{"position":[[5,6],[122,6],[199,6],[276,6],[338,6],[509,6]]},"1271":{"position":[[31,6],[145,6],[216,7],[614,6],[718,6],[869,6],[1034,6],[1102,6],[1206,8],[1273,6],[1296,6],[1688,6]]},"1272":{"position":[[11,6],[73,6],[151,6],[278,6]]},"1274":{"position":[[128,8],[166,6],[193,8],[443,7],[521,6],[612,6]]},"1275":{"position":[[71,6],[252,8]]},"1276":{"position":[[35,6],[57,6],[87,6],[179,6],[518,8],[560,6],[591,7],[629,6],[711,6],[769,6],[795,6],[811,8]]},"1277":{"position":[[32,6],[92,6],[276,8],[326,8],[616,6],[690,6],[805,8],[821,6],[847,6]]},"1278":{"position":[[18,6],[383,8],[404,6],[422,8],[830,8],[874,8]]},"1279":{"position":[[13,6],[293,6],[442,8],[464,6],[633,6],[830,7],[908,6],[999,6]]},"1280":{"position":[[65,6],[145,6],[224,6],[361,8]]},"1281":{"position":[[175,7]]},"1282":{"position":[[71,6],[322,6],[348,6],[374,6],[442,6],[607,7]]},"1316":{"position":[[3592,6]]},"1320":{"position":[[214,6],[308,7]]},"1324":{"position":[[193,6],[230,6],[367,6]]}},"keywords":{}}],["sqlite"",{"_index":1486,"title":{},"content":{"244":{"position":[[336,12],[1355,12]]}},"keywords":{}}],["sqlite.factory(modul",{"_index":6346,"title":{},"content":{"1276":{"position":[[883,23]]}},"keywords":{}}],["sqlite/dist/wa",{"_index":6343,"title":{},"content":{"1276":{"position":[[754,14]]}},"keywords":{}}],["sqlite3",{"_index":3992,"title":{"1274":{"position":[[15,7]]}},"content":{"711":{"position":[[712,7],[916,7],[1108,7]]},"772":{"position":[[1564,7],[1577,10],[2326,7],[2339,10]]},"1272":{"position":[[438,7]]},"1274":{"position":[[270,7],[283,10]]},"1276":{"position":[[873,7]]},"1280":{"position":[[377,7]]}},"keywords":{}}],["sqlite3.database('/path/to/database/file.db",{"_index":4000,"title":{},"content":{"711":{"position":[[1153,46]]}},"keywords":{}}],["sqlite3in",{"_index":3998,"title":{},"content":{"711":{"position":[[1019,9]]}},"keywords":{}}],["sqlite_error[1",{"_index":6371,"title":{},"content":{"1282":{"position":[[553,17]]}},"keywords":{}}],["sqliteadapt",{"_index":128,"title":{},"content":{"8":{"position":[[960,13]]},"837":{"position":[[1841,13]]}},"keywords":{}}],["sqliteadapterfactori",{"_index":127,"title":{},"content":{"8":{"position":[[890,20]]},"837":{"position":[[1719,20]]}},"keywords":{}}],["sqliteadapterfactory(sqlit",{"_index":129,"title":{},"content":{"8":{"position":[[976,28]]}},"keywords":{}}],["sqliteadapterfactory(websqlit",{"_index":4783,"title":{},"content":{"837":{"position":[[1857,32]]}},"keywords":{}}],["sqlitebas",{"_index":3814,"title":{"1272":{"position":[[0,13]]}},"content":{"662":{"position":[[2199,13]]},"772":{"position":[[1705,13]]},"838":{"position":[[2446,13]]},"1271":{"position":[[829,12],[1340,12],[1447,13]]},"1272":{"position":[[195,12]]},"1274":{"position":[[634,13]]},"1275":{"position":[[400,13]]},"1276":{"position":[[1002,13]]},"1277":{"position":[[539,13],[895,13]]},"1278":{"position":[[548,13],[1000,13]]},"1279":{"position":[[1021,13]]},"1280":{"position":[[511,13]]},"1281":{"position":[[240,13]]},"1282":{"position":[[788,13],[1159,13]]}},"keywords":{}}],["sqlitebasics<any>",{"_index":6366,"title":{},"content":{"1281":{"position":[[254,24]]}},"keywords":{}}],["sqliteconnect",{"_index":3798,"title":{},"content":{"661":{"position":[[925,17]]},"662":{"position":[[1705,16]]},"1279":{"position":[[527,16]]}},"keywords":{}}],["sqliteconnection(capacitorsqlit",{"_index":3805,"title":{},"content":{"661":{"position":[[1105,34]]},"662":{"position":[[1824,34]]},"1279":{"position":[[646,34]]}},"keywords":{}}],["sqlitedbconnect",{"_index":3797,"title":{},"content":{"661":{"position":[[905,19],[1156,18]]}},"keywords":{}}],["sqliteesmfactori",{"_index":6342,"title":{},"content":{"1276":{"position":[[728,16],[847,19]]}},"keywords":{}}],["sqlitefast",{"_index":6022,"title":{},"content":{"1128":{"position":[[26,10]]}},"keywords":{}}],["sqlitemodul",{"_index":6345,"title":{},"content":{"1276":{"position":[[826,12]]}},"keywords":{}}],["sqlitesqlit",{"_index":3971,"title":{},"content":{"703":{"position":[[548,12]]}},"keywords":{}}],["sqlite’",{"_index":2093,"title":{},"content":{"362":{"position":[[396,8]]}},"keywords":{}}],["sqlqueri",{"_index":4006,"title":{},"content":{"711":{"position":[[1527,9]]}},"keywords":{}}],["sqlsql.j",{"_index":6467,"title":{},"content":{"1299":{"position":[[534,9]]}},"keywords":{}}],["sqlsqlite",{"_index":6480,"title":{},"content":{"1302":{"position":[[98,9]]}},"keywords":{}}],["src",{"_index":3839,"title":{},"content":{"670":{"position":[[466,3]]},"1280":{"position":[[159,3]]}},"keywords":{}}],["src/index.t",{"_index":3852,"title":{},"content":{"674":{"position":[[54,17]]}},"keywords":{}}],["sse",{"_index":3167,"title":{},"content":{"491":{"position":[[648,6],[1499,4],[1687,6]]},"612":{"position":[[20,5],[116,4],[670,3],[1548,3],[1708,3]]},"614":{"position":[[941,3]]},"620":{"position":[[61,6]]},"623":{"position":[[783,4]]},"624":{"position":[[141,5],[1582,4]]},"875":{"position":[[7060,5]]}},"keywords":{}}],["ssl",{"_index":3377,"title":{},"content":{"556":{"position":[[1813,3],[1835,3],[1897,3]]}},"keywords":{}}],["sspl",{"_index":5976,"title":{},"content":{"1112":{"position":[[281,6]]}},"keywords":{}}],["stabl",{"_index":2044,"title":{},"content":{"356":{"position":[[755,6]]},"412":{"position":[[8538,6]]},"414":{"position":[[139,6]]}},"keywords":{}}],["stack",{"_index":586,"title":{},"content":{"38":{"position":[[140,7],[398,6]]},"76":{"position":[[118,7]]},"299":{"position":[[1392,5]]},"381":{"position":[[587,6]]},"413":{"position":[[126,6]]},"481":{"position":[[436,6]]},"644":{"position":[[449,6]]},"779":{"position":[[49,5]]}},"keywords":{}}],["stage",{"_index":2573,"title":{},"content":{"408":{"position":[[5279,6]]}},"keywords":{}}],["stale",{"_index":2705,"title":{},"content":{"412":{"position":[[6001,5]]},"476":{"position":[[62,5]]},"483":{"position":[[435,5]]},"1003":{"position":[[134,5]]}},"keywords":{}}],["stand",{"_index":1032,"title":{},"content":{"102":{"position":[[6,6]]},"118":{"position":[[6,6]]},"126":{"position":[[81,6]]},"161":{"position":[[182,6]]},"179":{"position":[[134,6]]},"212":{"position":[[115,6]]},"300":{"position":[[26,6]]},"317":{"position":[[234,6]]},"470":{"position":[[52,5]]},"520":{"position":[[65,6]]},"901":{"position":[[8,6]]},"1304":{"position":[[1273,5]]}},"keywords":{}}],["standalon",{"_index":3651,"title":{},"content":{"617":{"position":[[2348,10]]},"825":{"position":[[725,11]]}},"keywords":{}}],["standard",{"_index":2118,"title":{},"content":{"367":{"position":[[582,15]]},"397":{"position":[[250,15]]},"408":{"position":[[4922,8]]},"455":{"position":[[354,12]]},"510":{"position":[[593,9]]},"513":{"position":[[156,9]]},"612":{"position":[[36,8]]},"614":{"position":[[72,8]]},"841":{"position":[[301,8]]},"901":{"position":[[62,8]]},"912":{"position":[[721,10]]},"1215":{"position":[[435,8]]},"1286":{"position":[[147,8]]}},"keywords":{}}],["standard.websql",{"_index":2974,"title":{},"content":{"455":{"position":[[490,15]]}},"keywords":{}}],["standout",{"_index":1078,"title":{},"content":{"122":{"position":[[12,8]]},"156":{"position":[[12,8]]},"275":{"position":[[15,8]]},"381":{"position":[[3,8]]},"515":{"position":[[15,8]]}},"keywords":{}}],["star",{"_index":885,"title":{},"content":{"61":{"position":[[71,4],[232,4]]},"405":{"position":[[182,4]]},"471":{"position":[[167,4]]},"498":{"position":[[368,4],[418,8]]},"548":{"position":[[123,4]]},"557":{"position":[[254,4]]},"608":{"position":[[123,4]]},"628":{"position":[[269,4]]},"824":{"position":[[404,4]]}},"keywords":{}}],["stare",{"_index":3104,"title":{},"content":{"474":{"position":[[207,5]]}},"keywords":{}}],["starlink",{"_index":4593,"title":{},"content":{"780":{"position":[[274,8]]}},"keywords":{}}],["start",{"_index":886,"title":{"93":{"position":[[27,5]]},"119":{"position":[[8,7]]},"154":{"position":[[8,7]]},"180":{"position":[[8,7]]},"211":{"position":[[19,8]]},"217":{"position":[[30,5]]},"253":{"position":[[16,5]]},"256":{"position":[[8,7]]},"261":{"position":[[9,5]]},"272":{"position":[[8,7]]},"314":{"position":[[6,6]]},"324":{"position":[[8,7]]},"502":{"position":[[8,7]]},"577":{"position":[[8,7]]},"892":{"position":[[0,8]]},"1097":{"position":[[0,8]]}},"content":{"61":{"position":[[140,7]]},"65":{"position":[[1293,5],[1428,5]]},"84":{"position":[[269,7]]},"93":{"position":[[61,5],[262,6]]},"114":{"position":[[282,7]]},"128":{"position":[[262,5]]},"149":{"position":[[282,7]]},"173":{"position":[[1637,5]]},"175":{"position":[[275,7]]},"188":{"position":[[502,6],[1483,5],[2570,5]]},"206":{"position":[[172,5]]},"209":{"position":[[595,5]]},"217":{"position":[[64,5]]},"241":{"position":[[33,7],[202,5]]},"255":{"position":[[935,5]]},"262":{"position":[[63,6]]},"285":{"position":[[9,7],[120,5]]},"318":{"position":[[177,5]]},"347":{"position":[[282,7]]},"362":{"position":[[1353,7]]},"373":{"position":[[33,7],[202,5]]},"388":{"position":[[14,8]]},"392":{"position":[[3292,5]]},"403":{"position":[[291,8]]},"408":{"position":[[3427,6]]},"409":{"position":[[310,5]]},"412":{"position":[[15375,5]]},"421":{"position":[[866,5]]},"454":{"position":[[491,7]]},"463":{"position":[[174,6],[468,5]]},"468":{"position":[[510,5],[604,7]]},"498":{"position":[[10,5],[677,7]]},"511":{"position":[[282,7]]},"531":{"position":[[282,7]]},"591":{"position":[[282,7]]},"647":{"position":[[128,5]]},"653":{"position":[[884,7],[1272,5],[1424,5]]},"663":{"position":[[37,5]]},"666":{"position":[[16,5]]},"667":{"position":[[12,5]]},"700":{"position":[[203,6]]},"703":{"position":[[1685,8]]},"705":{"position":[[3,7]]},"708":{"position":[[266,5]]},"710":{"position":[[985,5]]},"711":{"position":[[514,5]]},"715":{"position":[[245,5],[333,5]]},"716":{"position":[[386,5]]},"723":{"position":[[1906,7]]},"737":{"position":[[335,5]]},"739":{"position":[[126,6]]},"749":{"position":[[4911,5],[8265,5],[11599,5],[17567,5]]},"752":{"position":[[255,5],[731,5],[900,7]]},"757":{"position":[[208,7]]},"776":{"position":[[71,5]]},"793":{"position":[[27,7]]},"796":{"position":[[744,5]]},"816":{"position":[[20,6]]},"824":{"position":[[46,5]]},"829":{"position":[[842,8]]},"840":{"position":[[309,5],[595,7]]},"842":{"position":[[171,5]]},"846":{"position":[[1,5]]},"854":{"position":[[476,5],[499,5]]},"861":{"position":[[817,5],[895,5]]},"862":{"position":[[1086,5]]},"863":{"position":[[98,5]]},"865":{"position":[[142,5]]},"866":{"position":[[55,5],[81,5],[299,8]]},"872":{"position":[[509,5],[2155,5],[2890,5],[3544,5],[4330,5]]},"875":{"position":[[3,5],[161,5],[249,5],[609,5],[682,5]]},"878":{"position":[[86,5]]},"886":{"position":[[3773,5]]},"892":{"position":[[211,5]]},"893":{"position":[[27,7],[175,5]]},"898":{"position":[[3121,5],[3194,5]]},"904":{"position":[[1406,5],[1436,5],[1664,5],[1833,5]]},"988":{"position":[[9,5],[1379,5],[1527,5]]},"995":{"position":[[369,6],[1026,6],[1071,7]]},"1002":{"position":[[39,5],[424,5],[1077,5]]},"1004":{"position":[[124,5]]},"1007":{"position":[[426,5],[900,5]]},"1009":{"position":[[514,5]]},"1028":{"position":[[128,5]]},"1030":{"position":[[189,7]]},"1076":{"position":[[32,8]]},"1097":{"position":[[298,5],[858,5]]},"1101":{"position":[[564,5]]},"1121":{"position":[[218,5]]},"1123":{"position":[[202,5]]},"1147":{"position":[[444,7]]},"1157":{"position":[[46,8]]},"1158":{"position":[[613,7]]},"1195":{"position":[[150,5]]},"1198":{"position":[[8,7]]},"1214":{"position":[[906,6]]},"1222":{"position":[[784,5]]},"1231":{"position":[[207,8],[297,5],[977,5]]},"1242":{"position":[[179,5]]},"1305":{"position":[[616,6]]},"1315":{"position":[[1531,7]]}},"keywords":{}}],["start/stop",{"_index":4899,"title":{},"content":{"861":{"position":[[747,11]]},"872":{"position":[[2865,10]]},"1007":{"position":[[2013,10]]}},"keywords":{}}],["startchunkreplication(chunkid",{"_index":5566,"title":{},"content":{"1007":{"position":[[1229,30]]}},"keywords":{}}],["starter",{"_index":2663,"title":{},"content":{"412":{"position":[[1417,8]]}},"keywords":{}}],["startrxserv",{"_index":5912,"title":{},"content":{"1090":{"position":[[1021,15]]},"1103":{"position":[[201,15]]}},"keywords":{}}],["startrxstorageremotewebsocketserv",{"_index":6251,"title":{},"content":{"1219":{"position":[[338,35],[516,37],[679,37]]},"1220":{"position":[[195,37]]}},"keywords":{}}],["startsignalingserversimplep",{"_index":5264,"title":{},"content":{"906":{"position":[[895,30],[994,32]]}},"keywords":{}}],["startup",{"_index":1205,"title":{},"content":{"173":{"position":[[1801,7]]},"217":{"position":[[179,8]]},"469":{"position":[[776,7]]},"772":{"position":[[2029,8]]},"964":{"position":[[541,7]]},"1192":{"position":[[168,7],[222,8],[317,7]]}},"keywords":{}}],["startwebsocketserv",{"_index":5175,"title":{},"content":{"892":{"position":[[51,20],[262,22]]}},"keywords":{}}],["state",{"_index":18,"title":{"89":{"position":[[46,6]]},"96":{"position":[[27,5]]},"219":{"position":[[19,5]]},"223":{"position":[[35,6]]},"478":{"position":[[50,5]]},"857":{"position":[[66,6]]},"1113":{"position":[[30,5]]},"1116":{"position":[[4,5]]}},"content":{"1":{"position":[[280,6]]},"18":{"position":[[269,5]]},"32":{"position":[[246,5]]},"38":{"position":[[610,6]]},"89":{"position":[[56,5]]},"96":{"position":[[40,5],[93,5],[248,5]]},"117":{"position":[[217,6]]},"173":{"position":[[335,5],[556,5],[2899,6],[3003,5],[3054,5],[3144,5],[3178,5]]},"219":{"position":[[58,5],[180,5]]},"223":{"position":[[22,5],[211,6]]},"233":{"position":[[301,6]]},"237":{"position":[[75,5]]},"251":{"position":[[100,5]]},"346":{"position":[[638,6]]},"360":{"position":[[114,6]]},"407":{"position":[[328,6]]},"410":{"position":[[1906,5]]},"411":{"position":[[1853,5],[1934,6],[1972,5],[2110,5],[2224,5],[2498,5],[2524,5],[2678,5],[4297,6],[4638,5],[4772,6]]},"412":{"position":[[5216,5],[5241,6]]},"415":{"position":[[369,6]]},"424":{"position":[[414,5]]},"458":{"position":[[279,5]]},"478":{"position":[[73,5],[282,5]]},"489":{"position":[[79,5]]},"490":{"position":[[59,5]]},"494":{"position":[[46,5]]},"495":{"position":[[434,6]]},"518":{"position":[[282,5]]},"520":{"position":[[340,5]]},"571":{"position":[[251,6]]},"574":{"position":[[93,5]]},"576":{"position":[[190,5]]},"585":{"position":[[166,5]]},"626":{"position":[[1180,5]]},"634":{"position":[[372,6]]},"662":{"position":[[137,5]]},"666":{"position":[[106,6]]},"681":{"position":[[76,6],[529,6]]},"687":{"position":[[208,7]]},"688":{"position":[[779,6],[1060,5]]},"696":{"position":[[389,6]]},"697":{"position":[[487,5]]},"698":{"position":[[1360,6],[2404,5],[2482,6],[2700,5]]},"699":{"position":[[107,5]]},"700":{"position":[[229,5],[346,6],[611,5],[1111,5]]},"701":{"position":[[92,5]]},"709":{"position":[[554,5]]},"710":{"position":[[1127,5]]},"719":{"position":[[273,5]]},"723":{"position":[[1263,5]]},"731":{"position":[[36,5]]},"749":{"position":[[12585,5],[12650,5]]},"752":{"position":[[308,5],[958,5],[1089,6],[1342,5]]},"753":{"position":[[77,6],[192,5],[401,5]]},"756":{"position":[[102,5]]},"761":{"position":[[165,6]]},"774":{"position":[[1073,5]]},"775":{"position":[[167,5]]},"778":{"position":[[564,5]]},"779":{"position":[[198,5],[298,5],[418,5]]},"780":{"position":[[575,5]]},"783":{"position":[[643,5]]},"784":{"position":[[456,5],[681,5]]},"785":{"position":[[200,5],[264,5],[466,5]]},"826":{"position":[[660,5],[1007,5]]},"828":{"position":[[154,5],[276,5]]},"829":{"position":[[3222,6]]},"837":{"position":[[380,6]]},"838":{"position":[[138,6],[166,5]]},"846":{"position":[[1582,6]]},"855":{"position":[[104,5],[246,6]]},"856":{"position":[[78,6]]},"861":{"position":[[1711,5],[2170,5]]},"862":{"position":[[1494,6],[1582,6]]},"867":{"position":[[104,5],[241,6]]},"872":{"position":[[2687,5]]},"875":{"position":[[4032,5],[4111,5],[5821,5]]},"881":{"position":[[180,5]]},"885":{"position":[[384,5],[418,6]]},"898":{"position":[[4500,6]]},"904":{"position":[[3306,6]]},"973":{"position":[[42,5]]},"977":{"position":[[284,5]]},"982":{"position":[[173,5],[234,5],[266,5],[302,5],[440,5],[467,5],[505,5],[543,5],[579,5]]},"983":{"position":[[15,6],[639,6]]},"984":{"position":[[135,6]]},"986":{"position":[[443,5]]},"987":{"position":[[201,5],[231,5],[312,5],[388,5],[480,5],[615,5],[698,5],[736,5],[799,5],[824,6]]},"988":{"position":[[744,5],[779,6],[2051,5],[3475,6]]},"995":{"position":[[167,6]]},"999":{"position":[[69,6]]},"1004":{"position":[[745,5]]},"1007":{"position":[[297,6]]},"1008":{"position":[[44,5],[92,5]]},"1009":{"position":[[805,7],[1016,5]]},"1020":{"position":[[139,5],[228,6]]},"1044":{"position":[[219,5]]},"1045":{"position":[[26,5]]},"1046":{"position":[[70,5]]},"1049":{"position":[[156,7]]},"1058":{"position":[[159,5]]},"1114":{"position":[[59,5],[266,5],[801,5],[882,6]]},"1115":{"position":[[21,5],[613,5]]},"1116":{"position":[[5,5],[322,5]]},"1117":{"position":[[25,5],[62,5]]},"1119":{"position":[[35,5],[178,5],[221,5]]},"1120":{"position":[[78,5],[193,5],[738,5]]},"1121":{"position":[[13,5],[664,5]]},"1123":{"position":[[409,5]]},"1124":{"position":[[1511,6]]},"1174":{"position":[[187,5]]},"1175":{"position":[[115,5],[216,5],[295,5],[587,5]]},"1180":{"position":[[406,6]]},"1184":{"position":[[230,6]]},"1185":{"position":[[121,5]]},"1192":{"position":[[143,6]]},"1219":{"position":[[242,6]]},"1222":{"position":[[887,6]]},"1271":{"position":[[470,5]]},"1299":{"position":[[307,5]]},"1300":{"position":[[262,5],[476,6],[719,5],[894,6]]},"1301":{"position":[[175,5]]},"1304":{"position":[[213,5]]},"1305":{"position":[[56,5]]},"1307":{"position":[[90,6],[914,6]]},"1308":{"position":[[480,5],[546,5],[588,5]]},"1309":{"position":[[88,6],[1012,5],[1037,5]]},"1314":{"position":[[244,6]]},"1316":{"position":[[269,5],[1240,5],[1459,6]]}},"keywords":{}}],["state.if",{"_index":5439,"title":{},"content":{"982":{"position":[[615,8]]}},"keywords":{}}],["state.overhead",{"_index":3903,"title":{},"content":{"689":{"position":[[445,14]]}},"keywords":{}}],["statement",{"_index":328,"title":{},"content":{"19":{"position":[[376,10]]},"333":{"position":[[264,11]]},"841":{"position":[[314,10]]},"1065":{"position":[[926,9]]},"1176":{"position":[[152,9]]}},"keywords":{}}],["states.revis",{"_index":3191,"title":{},"content":{"496":{"position":[[185,15]]}},"keywords":{}}],["static",{"_index":1040,"title":{"788":{"position":[[0,8]]},"789":{"position":[[4,7]]}},"content":{"105":{"position":[[208,6]]},"232":{"position":[[156,6]]},"281":{"position":[[67,6]]},"329":{"position":[[12,6]]},"421":{"position":[[49,6]]},"687":{"position":[[88,6]]},"749":{"position":[[8146,6],[8238,6],[8352,6],[8459,7]]},"788":{"position":[[1,7]]},"789":{"position":[[8,6],[33,7],[222,8],[469,8]]},"806":{"position":[[70,7]]},"829":{"position":[[2874,6]]},"934":{"position":[[311,8]]},"937":{"position":[[21,8]]},"1210":{"position":[[515,10]]},"1311":{"position":[[1051,8],[1684,6]]}},"keywords":{}}],["statist",{"_index":2828,"title":{},"content":{"420":{"position":[[28,11]]}},"keywords":{}}],["statu",{"_index":917,"title":{},"content":{"65":{"position":[[734,7]]},"632":{"position":[[2820,7]]},"752":{"position":[[1114,7]]},"796":{"position":[[1191,6],[1325,7],[1336,7],[1428,6]]}},"keywords":{}}],["stay",{"_index":410,"title":{},"content":{"24":{"position":[[774,4]]},"61":{"position":[[104,4]]},"130":{"position":[[298,5]]},"201":{"position":[[232,5]]},"263":{"position":[[316,4]]},"286":{"position":[[329,4]]},"328":{"position":[[179,4]]},"410":{"position":[[1507,4]]},"412":{"position":[[8198,4]]},"697":{"position":[[96,4]]},"737":{"position":[[201,5]]},"897":{"position":[[335,5]]},"902":{"position":[[385,5]]},"1150":{"position":[[591,5]]},"1192":{"position":[[648,4],[760,4]]},"1198":{"position":[[2183,5]]}},"keywords":{}}],["steadfast",{"_index":3289,"title":{},"content":{"530":{"position":[[623,9]]}},"keywords":{}}],["steadi",{"_index":3631,"title":{},"content":{"617":{"position":[[92,6]]}},"keywords":{}}],["steadili",{"_index":2774,"title":{},"content":{"412":{"position":[[15112,8]]}},"keywords":{}}],["stefe",{"_index":5680,"title":{},"content":{"1040":{"position":[[418,6]]}},"keywords":{}}],["stem",{"_index":1660,"title":{},"content":{"283":{"position":[[30,5]]}},"keywords":{}}],["step",{"_index":105,"title":{"211":{"position":[[6,5]]},"824":{"position":[[5,6]]}},"content":{"8":{"position":[[124,5]]},"84":{"position":[[354,4],[362,4]]},"114":{"position":[[367,4],[375,4]]},"149":{"position":[[367,4],[375,4]]},"175":{"position":[[358,4],[366,4]]},"241":{"position":[[140,4],[148,4]]},"271":{"position":[[6,5]]},"347":{"position":[[365,4],[373,4]]},"362":{"position":[[1436,4],[1444,4]]},"373":{"position":[[140,4],[148,4]]},"388":{"position":[[42,6]]},"391":{"position":[[15,4]]},"393":{"position":[[66,4]]},"402":{"position":[[633,4]]},"404":{"position":[[698,4]]},"412":{"position":[[3580,4]]},"421":{"position":[[1143,6]]},"466":{"position":[[9,5]]},"498":{"position":[[78,6]]},"501":{"position":[[63,5]]},"511":{"position":[[367,4],[375,4]]},"531":{"position":[[367,4],[375,4]]},"567":{"position":[[360,4],[368,4],[1055,6]]},"591":{"position":[[365,4],[373,4]]},"724":{"position":[[125,4],[329,4],[1505,4]]},"872":{"position":[[203,5],[591,4]]},"912":{"position":[[99,4]]},"1085":{"position":[[3293,6]]},"1087":{"position":[[178,4]]},"1088":{"position":[[57,4]]},"1313":{"position":[[50,5]]}},"keywords":{}}],["steve",{"_index":5682,"title":{},"content":{"1040":{"position":[[471,10],[500,6]]},"1043":{"position":[[90,8],[203,7]]}},"keywords":{}}],["still",{"_index":452,"title":{"428":{"position":[[11,5]]}},"content":{"28":{"position":[[172,5]]},"38":{"position":[[903,5]]},"305":{"position":[[492,5]]},"333":{"position":[[125,5]]},"353":{"position":[[451,5]]},"354":{"position":[[1224,5]]},"357":{"position":[[409,5]]},"360":{"position":[[822,5]]},"362":{"position":[[316,5]]},"398":{"position":[[2991,5]]},"404":{"position":[[571,5]]},"408":{"position":[[3176,5],[5257,5]]},"410":{"position":[[1283,5],[1411,5]]},"411":{"position":[[4920,5]]},"412":{"position":[[1671,5],[8361,5],[10809,5]]},"418":{"position":[[741,5]]},"419":{"position":[[444,5]]},"420":{"position":[[553,5]]},"421":{"position":[[570,5]]},"450":{"position":[[471,5],[704,5]]},"454":{"position":[[442,5]]},"469":{"position":[[795,5]]},"470":{"position":[[58,6]]},"563":{"position":[[1020,5]]},"610":{"position":[[751,5]]},"611":{"position":[[1117,5]]},"621":{"position":[[594,5]]},"648":{"position":[[291,5],[354,5]]},"686":{"position":[[672,5]]},"705":{"position":[[50,5]]},"817":{"position":[[125,5],[239,5]]},"834":{"position":[[137,5]]},"875":{"position":[[2403,5]]},"879":{"position":[[176,5]]},"898":{"position":[[646,5]]},"902":{"position":[[707,5]]},"948":{"position":[[224,5]]},"955":{"position":[[272,5]]},"958":{"position":[[55,5]]},"976":{"position":[[296,5]]},"988":{"position":[[1866,5]]},"1006":{"position":[[207,5]]},"1009":{"position":[[657,5]]},"1030":{"position":[[234,5]]},"1072":{"position":[[307,5],[776,5]]},"1120":{"position":[[383,5]]},"1139":{"position":[[34,5]]},"1145":{"position":[[34,5]]},"1180":{"position":[[343,5]]},"1213":{"position":[[761,5]]},"1231":{"position":[[291,5]]},"1246":{"position":[[1543,5]]},"1271":{"position":[[1704,5]]},"1295":{"position":[[524,5]]},"1304":{"position":[[1279,5]]},"1314":{"position":[[527,5]]}},"keywords":{}}],["stock",{"_index":3677,"title":{},"content":{"624":{"position":[[569,5]]},"626":{"position":[[275,5]]},"699":{"position":[[656,5]]},"1316":{"position":[[845,5]]}},"keywords":{}}],["stolen",{"_index":1880,"title":{},"content":{"310":{"position":[[274,6]]}},"keywords":{}}],["stop",{"_index":2783,"title":{},"content":{"414":{"position":[[284,4]]},"655":{"position":[[220,4]]},"700":{"position":[[678,8]]},"702":{"position":[[338,4]]},"767":{"position":[[617,4]]},"768":{"position":[[619,4]]},"769":{"position":[[576,4]]},"861":{"position":[[808,4],[868,4]]},"881":{"position":[[253,4]]},"892":{"position":[[342,4]]},"893":{"position":[[443,4]]},"904":{"position":[[3539,4],[3586,4]]},"955":{"position":[[93,4]]},"976":{"position":[[69,4]]},"1000":{"position":[[36,8]]},"1007":{"position":[[839,4]]},"1009":{"position":[[485,4]]},"1027":{"position":[[28,5]]},"1058":{"position":[[542,4]]},"1296":{"position":[[182,4]]},"1299":{"position":[[81,4]]}},"keywords":{}}],["stopchunkreplication(chunkid",{"_index":5573,"title":{},"content":{"1007":{"position":[[1804,29]]}},"keywords":{}}],["stopchunkreplication(cid",{"_index":5580,"title":{},"content":{"1007":{"position":[[2246,26]]}},"keywords":{}}],["storag",{"_index":37,"title":{"60":{"position":[[42,9]]},"62":{"position":[[8,7]]},"66":{"position":[[8,7]]},"71":{"position":[[34,8]]},"72":{"position":[[9,7]]},"112":{"position":[[9,7]]},"213":{"position":[[50,7]]},"239":{"position":[[9,7]]},"268":{"position":[[6,7]]},"290":{"position":[[40,8]]},"297":{"position":[[14,7]]},"298":{"position":[[20,7]]},"303":{"position":[[21,7]]},"307":{"position":[[19,7]]},"308":{"position":[[19,9]]},"309":{"position":[[23,8]]},"314":{"position":[[49,8]]},"317":{"position":[[21,7]]},"365":{"position":[[0,7]]},"366":{"position":[[12,7]]},"417":{"position":[[19,7]]},"425":{"position":[[16,7]]},"427":{"position":[[39,8]]},"441":{"position":[[31,7]]},"449":{"position":[[14,7]]},"461":{"position":[[0,7]]},"547":{"position":[[42,9]]},"558":{"position":[[8,7]]},"561":{"position":[[28,8]]},"564":{"position":[[23,7]]},"607":{"position":[[42,9]]},"640":{"position":[[15,8]]},"643":{"position":[[26,9]]},"697":{"position":[[8,7]]},"706":{"position":[[40,7]]},"713":{"position":[[19,7]]},"758":{"position":[[0,7]]},"774":{"position":[[36,8]]},"962":{"position":[[0,8]]},"1090":{"position":[[17,7]]},"1126":{"position":[[17,8]]},"1140":{"position":[[0,7]]},"1143":{"position":[[22,8]]},"1144":{"position":[[25,7]]},"1165":{"position":[[49,8]]},"1190":{"position":[[17,7]]},"1192":{"position":[[30,9]]},"1195":{"position":[[14,8]]},"1196":{"position":[[18,8]]},"1246":{"position":[[0,7]]},"1247":{"position":[[18,9]]},"1270":{"position":[[34,9]]}},"content":{"1":{"position":[[575,8]]},"2":{"position":[[378,8]]},"3":{"position":[[258,8]]},"4":{"position":[[436,8]]},"5":{"position":[[346,8]]},"6":{"position":[[245,8],[541,8],[739,8]]},"7":{"position":[[378,8],[574,8]]},"8":{"position":[[28,8],[1147,8]]},"9":{"position":[[292,8]]},"10":{"position":[[330,8]]},"11":{"position":[[856,8]]},"16":{"position":[[290,7]]},"18":{"position":[[199,7]]},"22":{"position":[[331,7]]},"24":{"position":[[155,7],[565,7]]},"28":{"position":[[201,7],[263,7],[761,7]]},"33":{"position":[[569,7]]},"35":{"position":[[57,7],[136,7],[560,7]]},"39":{"position":[[563,7],[635,7]]},"40":{"position":[[377,7]]},"42":{"position":[[178,7]]},"43":{"position":[[290,7]]},"45":{"position":[[57,7],[163,7]]},"46":{"position":[[136,7]]},"47":{"position":[[1284,7]]},"51":{"position":[[24,7],[102,8],[169,8],[764,8]]},"55":{"position":[[906,8]]},"57":{"position":[[35,8],[413,7]]},"58":{"position":[[230,7],[335,7]]},"59":{"position":[[97,7],[169,8]]},"60":{"position":[[61,7]]},"61":{"position":[[304,7]]},"63":{"position":[[224,7]]},"64":{"position":[[98,8]]},"65":{"position":[[482,7],[1347,8],[1620,7]]},"66":{"position":[[15,8],[195,7],[385,7],[563,7]]},"71":{"position":[[47,7]]},"72":{"position":[[24,7]]},"81":{"position":[[16,7],[75,7]]},"83":{"position":[[79,8],[468,8]]},"84":{"position":[[70,8]]},"95":{"position":[[38,8]]},"111":{"position":[[13,7],[107,7]]},"112":{"position":[[24,7]]},"131":{"position":[[24,7],[82,7],[249,7],[615,7],[750,7],[801,7],[924,7]]},"139":{"position":[[261,7]]},"141":{"position":[[15,7],[183,7]]},"162":{"position":[[23,7],[108,7],[339,7],[438,7],[593,7]]},"167":{"position":[[222,7]]},"169":{"position":[[20,7],[172,7],[307,7]]},"170":{"position":[[524,7]]},"173":{"position":[[80,7],[927,8]]},"174":{"position":[[2464,7],[2561,7],[2634,7]]},"178":{"position":[[92,7]]},"188":{"position":[[325,7],[1082,8]]},"189":{"position":[[22,7],[185,7],[370,7],[418,7],[641,8],[789,7]]},"197":{"position":[[13,7],[182,7]]},"207":{"position":[[237,7]]},"209":{"position":[[278,8]]},"211":{"position":[[250,8]]},"212":{"position":[[679,8]]},"218":{"position":[[38,8]]},"229":{"position":[[148,8]]},"236":{"position":[[78,7],[154,7],[344,8]]},"239":{"position":[[26,7]]},"241":{"position":[[448,7],[721,7]]},"243":{"position":[[559,7],[626,7],[727,7],[826,7],[923,7]]},"244":{"position":[[773,7]]},"249":{"position":[[385,7]]},"254":{"position":[[227,7],[496,7]]},"255":{"position":[[622,8]]},"258":{"position":[[183,8]]},"265":{"position":[[109,7]]},"266":{"position":[[32,7],[76,9],[460,7],[702,8],[851,7],[959,7]]},"267":{"position":[[1320,8]]},"279":{"position":[[82,8]]},"283":{"position":[[209,7]]},"284":{"position":[[223,7]]},"287":{"position":[[36,7],[143,7],[492,8],[560,7],[960,8],[1204,7]]},"290":{"position":[[131,7]]},"294":{"position":[[177,7]]},"295":{"position":[[137,7]]},"298":{"position":[[449,8],[913,7]]},"299":{"position":[[1098,7],[1679,7]]},"300":{"position":[[51,7],[83,7],[162,7],[539,8],[837,7]]},"301":{"position":[[60,7],[487,7],[551,7],[650,7]]},"303":{"position":[[49,7]]},"304":{"position":[[243,7]]},"305":{"position":[[427,7]]},"306":{"position":[[335,7]]},"310":{"position":[[345,7]]},"313":{"position":[[150,7]]},"314":{"position":[[108,8],[192,7],[513,8],[1031,7]]},"315":{"position":[[481,8],[580,8]]},"316":{"position":[[17,7]]},"317":{"position":[[14,7]]},"318":{"position":[[11,7],[281,7],[464,7]]},"321":{"position":[[357,7]]},"334":{"position":[[370,8]]},"336":{"position":[[24,7],[529,7]]},"357":{"position":[[661,8]]},"358":{"position":[[123,8]]},"360":{"position":[[12,7]]},"361":{"position":[[292,7]]},"365":{"position":[[75,7],[153,8],[215,8],[408,8],[536,8],[861,8],[931,8],[993,7],[1034,8]]},"366":{"position":[[13,7],[130,7],[176,7]]},"368":{"position":[[23,7],[83,7],[122,7]]},"369":{"position":[[1359,7],[1376,7],[1548,7]]},"372":{"position":[[58,7],[217,8]]},"373":{"position":[[460,8],[749,7]]},"377":{"position":[[321,7]]},"383":{"position":[[349,7]]},"385":{"position":[[64,7]]},"388":{"position":[[510,7]]},"392":{"position":[[90,7],[382,8],[1228,7]]},"395":{"position":[[122,7]]},"398":{"position":[[2977,7]]},"402":{"position":[[416,7],[1255,8],[1575,7],[2681,8],[2837,9]]},"408":{"position":[[181,7],[266,7],[309,7],[456,7],[1218,7],[1366,7],[1491,7],[3814,7],[4146,7],[4690,7]]},"410":{"position":[[42,7]]},"411":{"position":[[4177,7]]},"412":{"position":[[1116,8],[7297,7],[7365,8],[7647,7],[8071,7],[8514,8],[9093,9],[9967,7]]},"417":{"position":[[169,7]]},"420":{"position":[[347,8]]},"424":{"position":[[478,8]]},"426":{"position":[[103,7]]},"427":{"position":[[727,7],[1496,7]]},"429":{"position":[[126,7],[408,7],[636,7]]},"430":{"position":[[802,7]]},"432":{"position":[[41,7],[303,7],[616,7],[823,7]]},"434":{"position":[[52,8],[379,7]]},"435":{"position":[[69,8]]},"436":{"position":[[116,7]]},"438":{"position":[[367,7]]},"439":{"position":[[283,7],[367,7],[550,7],[578,7],[647,7]]},"441":{"position":[[101,8],[267,7],[585,7]]},"444":{"position":[[75,7]]},"451":{"position":[[407,7]]},"453":{"position":[[798,7]]},"454":{"position":[[812,7]]},"455":{"position":[[100,8]]},"456":{"position":[[159,8]]},"458":{"position":[[474,7],[656,7],[754,7],[1174,8]]},"459":{"position":[[347,7]]},"460":{"position":[[399,7]]},"461":{"position":[[625,7],[998,7],[1248,7],[1426,7],[1505,7]]},"462":{"position":[[46,7],[790,8]]},"469":{"position":[[891,7],[1336,7]]},"470":{"position":[[217,7],[555,7]]},"480":{"position":[[408,8]]},"482":{"position":[[424,7],[521,8],[657,8]]},"483":{"position":[[1046,7]]},"489":{"position":[[172,7],[228,7]]},"491":{"position":[[13,7]]},"495":{"position":[[731,7],[832,8],[892,7]]},"502":{"position":[[343,7]]},"504":{"position":[[481,7]]},"508":{"position":[[62,7]]},"520":{"position":[[211,8],[245,8]]},"522":{"position":[[465,8]]},"524":{"position":[[22,7],[114,7],[319,7],[359,7],[446,8]]},"528":{"position":[[45,7]]},"533":{"position":[[205,7],[301,7]]},"535":{"position":[[1265,8]]},"538":{"position":[[24,7],[111,8],[234,7],[494,8]]},"542":{"position":[[567,8]]},"544":{"position":[[66,8],[388,7]]},"545":{"position":[[235,7]]},"546":{"position":[[69,7],[349,7]]},"547":{"position":[[61,7]]},"551":{"position":[[213,7],[350,8]]},"554":{"position":[[336,7],[424,7],[465,8],[644,7],[719,7],[865,7],[969,8],[1100,8]]},"556":{"position":[[83,7],[154,7]]},"560":{"position":[[147,7]]},"561":{"position":[[143,8]]},"562":{"position":[[202,8]]},"563":{"position":[[522,8]]},"564":{"position":[[27,7],[489,8],[630,8],[1153,8]]},"566":{"position":[[106,7],[794,8]]},"567":{"position":[[47,7],[239,7],[912,7],[1090,7]]},"574":{"position":[[460,7]]},"576":{"position":[[66,7]]},"579":{"position":[[141,7],[379,8]]},"581":{"position":[[24,7],[308,7],[621,7]]},"584":{"position":[[86,8]]},"588":{"position":[[83,7]]},"593":{"position":[[205,7],[301,7]]},"595":{"position":[[1318,8]]},"598":{"position":[[24,7],[111,8],[235,7],[501,8]]},"604":{"position":[[66,8],[322,7]]},"605":{"position":[[235,7]]},"606":{"position":[[69,7],[339,7]]},"607":{"position":[[61,7]]},"632":{"position":[[1263,7],[1330,8]]},"638":{"position":[[373,8],[467,8]]},"639":{"position":[[178,7]]},"640":{"position":[[8,7],[445,7]]},"641":{"position":[[99,7],[155,8],[352,7]]},"643":{"position":[[103,8]]},"653":{"position":[[290,8]]},"660":{"position":[[159,8],[418,8]]},"661":{"position":[[323,7],[363,7],[597,7]]},"662":{"position":[[1884,8],[2045,8],[2164,8]]},"666":{"position":[[359,7],[454,9]]},"680":{"position":[[711,8]]},"693":{"position":[[538,7],[597,7],[925,9],[935,8],[1199,8],[1245,9]]},"696":{"position":[[813,8]]},"697":{"position":[[58,7]]},"698":{"position":[[524,7]]},"703":{"position":[[387,7],[406,7]]},"704":{"position":[[456,7]]},"709":{"position":[[106,7],[906,7]]},"710":{"position":[[431,7],[1733,8]]},"714":{"position":[[1102,7]]},"717":{"position":[[735,7],[833,8],[912,8],[1194,8]]},"718":{"position":[[308,7],[416,8],[697,8]]},"719":{"position":[[224,7]]},"721":{"position":[[453,7]]},"723":{"position":[[1938,7]]},"734":{"position":[[345,8],[519,8]]},"739":{"position":[[322,8]]},"745":{"position":[[77,7],[143,7],[354,7],[424,8],[504,7],[568,8]]},"746":{"position":[[312,8],[596,7]]},"747":{"position":[[129,8]]},"749":{"position":[[756,7],[893,7],[3376,7],[3487,7],[8663,7],[21760,7],[23234,7],[23360,7],[23492,7]]},"756":{"position":[[108,8]]},"759":{"position":[[142,9],[397,8],[544,7]]},"760":{"position":[[243,8],[318,9],[540,7]]},"772":{"position":[[141,7],[205,7],[808,8],[1096,7],[1199,7],[1675,8],[2437,8],[2568,8]]},"773":{"position":[[598,8]]},"774":{"position":[[129,8],[294,7],[363,7],[700,8],[736,8]]},"775":{"position":[[709,7]]},"778":{"position":[[362,7]]},"793":{"position":[[152,8],[393,7],[1013,7]]},"801":{"position":[[17,7]]},"820":{"position":[[279,7],[315,8]]},"825":{"position":[[374,8]]},"829":{"position":[[239,7],[681,8]]},"830":{"position":[[246,7]]},"832":{"position":[[408,7]]},"835":{"position":[[33,7]]},"836":{"position":[[1075,7],[2281,7]]},"837":{"position":[[980,8]]},"838":{"position":[[1629,7],[1685,7],[2416,8]]},"841":{"position":[[990,8]]},"860":{"position":[[106,8],[1018,7]]},"862":{"position":[[572,8]]},"872":{"position":[[1456,8],[1506,7],[1750,8],[4011,8]]},"898":{"position":[[2070,7],[2146,8],[2354,8]]},"904":{"position":[[430,7],[525,8],[751,8]]},"932":{"position":[[871,7],[989,8],[1082,8]]},"960":{"position":[[333,8]]},"961":{"position":[[238,7]]},"962":{"position":[[244,7],[792,8],[1008,8]]},"966":{"position":[[574,8],[692,8]]},"967":{"position":[[159,8],[277,8]]},"977":{"position":[[30,8],[472,8]]},"981":{"position":[[1108,7]]},"1002":{"position":[[921,8]]},"1009":{"position":[[613,7]]},"1013":{"position":[[69,7],[337,8]]},"1067":{"position":[[738,8]]},"1068":{"position":[[203,7]]},"1072":{"position":[[293,8],[1683,7],[1725,7]]},"1085":{"position":[[3524,7]]},"1089":{"position":[[60,7]]},"1090":{"position":[[78,7],[159,8],[411,7],[815,8],[851,8],[1368,7]]},"1095":{"position":[[149,7]]},"1114":{"position":[[106,7],[748,8]]},"1118":{"position":[[678,8]]},"1120":{"position":[[129,7],[437,8],[629,7]]},"1121":{"position":[[488,8]]},"1123":{"position":[[43,8],[384,7],[489,8]]},"1124":{"position":[[151,7],[209,7],[376,7],[634,7]]},"1125":{"position":[[113,7],[325,8]]},"1126":{"position":[[20,8],[45,7],[410,8],[723,8]]},"1130":{"position":[[198,8]]},"1132":{"position":[[143,7],[1116,7],[1364,7]]},"1134":{"position":[[175,8]]},"1137":{"position":[[48,9],[85,8],[292,9]]},"1138":{"position":[[22,7],[319,8]]},"1139":{"position":[[574,8]]},"1140":{"position":[[5,7],[318,7],[358,8],[633,8]]},"1141":{"position":[[85,7],[195,7],[225,7]]},"1143":{"position":[[622,7]]},"1144":{"position":[[20,8],[223,8]]},"1145":{"position":[[563,8]]},"1146":{"position":[[268,8]]},"1148":{"position":[[743,7],[1157,7]]},"1149":{"position":[[891,8],[950,8]]},"1151":{"position":[[211,7],[581,7]]},"1152":{"position":[[87,8]]},"1154":{"position":[[115,7],[626,8],[784,8]]},"1157":{"position":[[100,7]]},"1158":{"position":[[14,8],[231,8]]},"1159":{"position":[[85,7],[417,8]]},"1161":{"position":[[296,8]]},"1162":{"position":[[224,8],[557,7],[738,7]]},"1163":{"position":[[226,8],[348,7],[390,7],[427,8],[577,8]]},"1164":{"position":[[124,7],[161,8],[330,7],[469,8],[579,7],[657,8],[720,8],[1241,8]]},"1165":{"position":[[19,7],[130,8],[190,8],[235,7],[390,8],[768,8],[1106,8]]},"1168":{"position":[[179,8]]},"1172":{"position":[[344,8]]},"1178":{"position":[[210,7],[580,7]]},"1181":{"position":[[290,8],[375,7],[645,7],[826,7]]},"1182":{"position":[[226,8],[348,7],[379,8],[394,7],[431,8],[581,8]]},"1183":{"position":[[26,7],[77,7],[323,7],[555,7]]},"1184":{"position":[[270,7],[308,8],[346,7],[640,7],[677,8],[725,8],[820,8]]},"1185":{"position":[[41,7],[300,7],[366,8]]},"1186":{"position":[[35,7],[258,7],[317,8]]},"1188":{"position":[[396,7]]},"1189":{"position":[[102,8],[442,8]]},"1191":{"position":[[413,8],[619,8]]},"1192":{"position":[[24,8],[261,8],[540,8],[671,8]]},"1194":{"position":[[70,8]]},"1195":{"position":[[47,8],[88,7],[231,7]]},"1196":{"position":[[186,7]]},"1198":{"position":[[621,7],[1245,7],[1838,8]]},"1201":{"position":[[219,8]]},"1206":{"position":[[59,7],[252,8]]},"1209":{"position":[[161,7],[394,9]]},"1210":{"position":[[460,8]]},"1211":{"position":[[715,8]]},"1212":{"position":[[46,7],[246,7],[448,7],[502,7]]},"1213":{"position":[[668,7]]},"1214":{"position":[[527,7],[644,7]]},"1218":{"position":[[12,7],[357,7],[415,10],[532,7],[587,7],[787,8]]},"1219":{"position":[[12,7],[72,7],[729,8],[900,8]]},"1220":{"position":[[12,7],[462,7]]},"1222":{"position":[[384,8],[1431,8]]},"1225":{"position":[[425,8]]},"1226":{"position":[[256,8]]},"1227":{"position":[[734,8]]},"1228":{"position":[[125,7]]},"1229":{"position":[[261,7]]},"1230":{"position":[[261,7]]},"1231":{"position":[[890,8],[1065,8]]},"1235":{"position":[[38,7],[130,7],[480,8]]},"1237":{"position":[[135,8],[858,8],[895,8],[935,8],[982,8]]},"1238":{"position":[[38,8],[159,7],[192,8],[833,8],[882,8],[914,8],[978,8]]},"1239":{"position":[[18,7],[134,7],[202,7],[803,8],[852,8],[888,8]]},"1241":{"position":[[3,7]]},"1242":{"position":[[24,7]]},"1243":{"position":[[127,8]]},"1244":{"position":[[117,8]]},"1245":{"position":[[21,7]]},"1246":{"position":[[98,7],[442,7],[713,7],[907,8],[1198,8],[1339,7],[1446,7]]},"1247":{"position":[[24,7],[171,7],[365,7],[538,7],[731,8]]},"1263":{"position":[[319,8]]},"1264":{"position":[[178,8]]},"1265":{"position":[[722,8]]},"1267":{"position":[[563,7],[658,8],[752,8]]},"1268":{"position":[[424,7],[750,8]]},"1270":{"position":[[12,7],[68,8],[97,7],[283,7]]},"1271":{"position":[[38,7],[152,7],[303,7],[462,7],[621,8],[725,7],[925,7],[1109,7],[1227,7],[1411,7],[1535,7],[1608,8],[1617,7],[1695,8]]},"1272":{"position":[[158,8]]},"1274":{"position":[[359,8]]},"1275":{"position":[[370,8]]},"1276":{"position":[[230,8],[972,8]]},"1277":{"position":[[509,8],[864,7]]},"1278":{"position":[[518,8],[970,8]]},"1279":{"position":[[746,8]]},"1280":{"position":[[481,8]]},"1282":{"position":[[757,7],[1128,7]]},"1286":{"position":[[395,7],[433,8],[538,7]]},"1287":{"position":[[441,7],[483,8],[588,7]]},"1288":{"position":[[401,7],[449,8],[554,7]]},"1292":{"position":[[52,7],[216,7],[280,7],[403,8],[634,7]]},"1296":{"position":[[103,7]]},"1300":{"position":[[580,7]]},"1311":{"position":[[200,8]]},"1324":{"position":[[456,8]]}},"keywords":{}}],["storage"",{"_index":1453,"title":{},"content":{"243":{"position":[[341,13],[1027,13]]},"244":{"position":[[52,13],[116,13],[1154,13]]}},"keywords":{}}],["storage+databasenam",{"_index":4208,"title":{},"content":{"749":{"position":[[5680,20]]}},"keywords":{}}],["storage+nam",{"_index":5398,"title":{},"content":{"967":{"position":[[77,12]]}},"keywords":{}}],["storage."",{"_index":2826,"title":{},"content":{"419":{"position":[[1912,14]]}},"keywords":{}}],["storage.can",{"_index":6154,"title":{},"content":{"1180":{"position":[[296,11]]}},"keywords":{}}],["storage.customrequest",{"_index":6260,"title":{},"content":{"1220":{"position":[[556,23]]}},"keywords":{}}],["storage.decreas",{"_index":6105,"title":{},"content":{"1161":{"position":[[84,17]]},"1180":{"position":[[84,17]]}},"keywords":{}}],["storage.html?console=storag",{"_index":4298,"title":{},"content":{"749":{"position":[[12695,28]]}},"keywords":{}}],["storage.indexeddb",{"_index":3233,"title":{},"content":{"504":{"position":[[158,17]]}},"keywords":{}}],["storage.memori",{"_index":1673,"title":{},"content":{"287":{"position":[[873,14]]}},"keywords":{}}],["storage.opf",{"_index":3234,"title":{},"content":{"504":{"position":[[243,12]]}},"keywords":{}}],["storage.th",{"_index":6112,"title":{},"content":{"1162":{"position":[[849,11]]}},"keywords":{}}],["storageflex",{"_index":3141,"title":{},"content":{"483":{"position":[[236,15]]}},"keywords":{}}],["storageful",{"_index":2434,"title":{},"content":{"400":{"position":[[50,11]]}},"keywords":{}}],["storageinst",{"_index":6144,"title":{},"content":{"1177":{"position":[[234,15]]}},"keywords":{}}],["storageinstance.internals.localst",{"_index":6147,"title":{},"content":{"1177":{"position":[[309,37]]}},"keywords":{}}],["storages.in",{"_index":1570,"title":{},"content":{"254":{"position":[[382,11]]}},"keywords":{}}],["storages.split",{"_index":3096,"title":{},"content":{"469":{"position":[[1129,18]]}},"keywords":{}}],["storagesingl",{"_index":3417,"title":{},"content":{"560":{"position":[[370,13]]}},"keywords":{}}],["storagesqlit",{"_index":3330,"title":{},"content":{"546":{"position":[[232,14]]},"606":{"position":[[232,14]]}},"keywords":{}}],["storageth",{"_index":3302,"title":{},"content":{"538":{"position":[[70,10]]},"598":{"position":[[70,10]]}},"keywords":{}}],["storagewithattachmentscompress",{"_index":5315,"title":{},"content":{"932":{"position":[[914,33],[1091,33]]}},"keywords":{}}],["storagewithkeycompress",{"_index":4083,"title":{},"content":{"734":{"position":[[286,25],[528,25]]}},"keywords":{}}],["store",{"_index":5,"title":{"65":{"position":[[4,5]]},"81":{"position":[[0,7]]},"86":{"position":[[22,5]]},"95":{"position":[[0,5]]},"111":{"position":[[0,7]]},"214":{"position":[[22,5]]},"236":{"position":[[0,7]]},"270":{"position":[[0,7]]},"294":{"position":[[27,6]]},"305":{"position":[[31,6]]},"355":{"position":[[0,7]]},"357":{"position":[[0,7]]},"368":{"position":[[0,5]]},"371":{"position":[[8,5]]},"392":{"position":[[0,7]]},"397":{"position":[[0,7]]},"426":{"position":[[0,7]]},"457":{"position":[[0,7]]},"559":{"position":[[8,7]]},"800":{"position":[[0,5]]},"912":{"position":[[0,7]]},"1122":{"position":[[39,5]]},"1237":{"position":[[0,7]]}},"content":{"1":{"position":[[56,6]]},"3":{"position":[[23,6]]},"5":{"position":[[14,6]]},"6":{"position":[[44,5],[643,5]]},"7":{"position":[[43,5],[478,5]]},"10":{"position":[[26,6]]},"13":{"position":[[172,5]]},"14":{"position":[[489,6],[745,6]]},"16":{"position":[[183,6]]},"17":{"position":[[437,5]]},"24":{"position":[[738,5]]},"30":{"position":[[90,6]]},"31":{"position":[[173,6]]},"35":{"position":[[319,7]]},"36":{"position":[[207,5]]},"45":{"position":[[146,5]]},"47":{"position":[[420,6],[692,7]]},"58":{"position":[[290,5]]},"63":{"position":[[42,5]]},"65":{"position":[[40,7],[150,7],[813,6],[1530,5],[1677,6],[1731,6],[1812,7]]},"66":{"position":[[475,6]]},"86":{"position":[[42,7]]},"87":{"position":[[73,7]]},"88":{"position":[[1,7]]},"93":{"position":[[1,7]]},"95":{"position":[[149,5]]},"97":{"position":[[14,6]]},"110":{"position":[[59,6]]},"111":{"position":[[70,7]]},"117":{"position":[[100,6]]},"122":{"position":[[157,6]]},"131":{"position":[[561,5]]},"133":{"position":[[151,6]]},"139":{"position":[[132,6]]},"152":{"position":[[179,7]]},"173":{"position":[[1225,5],[1327,6],[1675,6]]},"174":{"position":[[2407,5]]},"178":{"position":[[113,7]]},"183":{"position":[[171,6]]},"188":{"position":[[250,5],[3118,5]]},"189":{"position":[[69,5],[519,6]]},"195":{"position":[[101,6]]},"215":{"position":[[26,5]]},"216":{"position":[[67,7]]},"217":{"position":[[1,7]]},"218":{"position":[[277,6]]},"219":{"position":[[151,5]]},"221":{"position":[[81,7]]},"236":{"position":[[29,5]]},"240":{"position":[[43,6]]},"245":{"position":[[149,5]]},"248":{"position":[[105,6]]},"252":{"position":[[131,6]]},"254":{"position":[[307,5]]},"265":{"position":[[152,7]]},"270":{"position":[[1,7],[136,5]]},"273":{"position":[[117,6]]},"274":{"position":[[85,7]]},"291":{"position":[[120,6]]},"292":{"position":[[156,6]]},"294":{"position":[[111,6]]},"302":{"position":[[168,5],[745,5]]},"303":{"position":[[150,5],[412,7],[1154,5]]},"304":{"position":[[144,5]]},"306":{"position":[[66,5]]},"309":{"position":[[136,6]]},"311":{"position":[[138,6]]},"315":{"position":[[877,6]]},"316":{"position":[[514,6]]},"317":{"position":[[51,6]]},"321":{"position":[[57,5]]},"322":{"position":[[175,5]]},"325":{"position":[[43,6]]},"331":{"position":[[77,7]]},"334":{"position":[[129,5]]},"336":{"position":[[349,6]]},"338":{"position":[[65,5]]},"343":{"position":[[41,6]]},"345":{"position":[[91,6]]},"346":{"position":[[107,5]]},"350":{"position":[[19,6],[188,5]]},"352":{"position":[[98,5]]},"353":{"position":[[631,7]]},"356":{"position":[[201,5],[749,5]]},"357":{"position":[[20,7],[256,7],[480,6]]},"358":{"position":[[26,7]]},"360":{"position":[[26,6],[557,6]]},"362":{"position":[[322,5],[552,7]]},"364":{"position":[[297,7],[581,5],[688,6]]},"365":{"position":[[621,6],[1290,6]]},"367":{"position":[[1,7],[533,6]]},"376":{"position":[[239,7]]},"377":{"position":[[1,7]]},"390":{"position":[[59,7]]},"391":{"position":[[909,6]]},"392":{"position":[[4,5],[103,6],[459,6],[505,6],[1163,6],[1389,6],[1775,7],[1886,6],[2037,7],[2457,6],[2566,6]]},"393":{"position":[[18,6]]},"394":{"position":[[41,6],[1450,6]]},"395":{"position":[[46,5]]},"396":{"position":[[1092,6],[1176,5],[1788,6]]},"397":{"position":[[20,5],[1578,6],[2007,5]]},"398":{"position":[[25,6],[3507,5]]},"402":{"position":[[120,7],[2590,5]]},"403":{"position":[[154,6],[406,6]]},"407":{"position":[[166,5]]},"408":{"position":[[621,7],[881,5],[4463,6]]},"410":{"position":[[513,7],[2142,5]]},"411":{"position":[[2151,6],[2753,7]]},"412":{"position":[[2069,7],[2731,5],[7690,7],[13130,6]]},"414":{"position":[[33,5],[410,5]]},"416":{"position":[[42,7]]},"417":{"position":[[252,7]]},"419":{"position":[[798,7]]},"424":{"position":[[91,5],[424,5]]},"425":{"position":[[249,7]]},"426":{"position":[[191,5],[272,7],[365,7]]},"427":{"position":[[501,6],[549,7],[655,7]]},"429":{"position":[[577,7]]},"430":{"position":[[431,7],[604,5]]},"432":{"position":[[206,5],[1264,6]]},"434":{"position":[[153,5]]},"439":{"position":[[130,5]]},"440":{"position":[[148,6],[347,5]]},"442":{"position":[[14,5]]},"444":{"position":[[666,5]]},"445":{"position":[[538,5]]},"450":{"position":[[60,5],[338,6],[433,5]]},"451":{"position":[[128,5],[272,6],[313,7],[420,7]]},"452":{"position":[[111,7]]},"453":{"position":[[95,5],[693,7],[733,5]]},"455":{"position":[[167,5]]},"457":{"position":[[10,5],[66,5],[168,5],[275,5],[441,5]]},"459":{"position":[[43,7],[1183,7]]},"461":{"position":[[68,6],[1332,5]]},"462":{"position":[[691,5],[836,7]]},"463":{"position":[[16,5],[363,5],[628,7],[856,5],[1250,5]]},"464":{"position":[[1321,7]]},"465":{"position":[[18,6]]},"469":{"position":[[361,5],[656,6],[822,6],[1072,7]]},"473":{"position":[[39,6]]},"480":{"position":[[970,5]]},"489":{"position":[[88,6]]},"491":{"position":[[1192,6]]},"495":{"position":[[560,7],[747,7]]},"500":{"position":[[443,5]]},"504":{"position":[[364,7]]},"516":{"position":[[117,7]]},"524":{"position":[[508,6],[605,6]]},"526":{"position":[[136,6]]},"533":{"position":[[34,7],[150,5]]},"534":{"position":[[204,7]]},"535":{"position":[[365,5]]},"545":{"position":[[214,7]]},"551":{"position":[[503,7]]},"555":{"position":[[135,7],[836,6],[970,7]]},"556":{"position":[[269,6],[511,6],[572,5],[1236,5]]},"559":{"position":[[44,7],[1190,5]]},"560":{"position":[[233,5],[441,6]]},"561":{"position":[[155,6]]},"564":{"position":[[117,6],[1060,5]]},"566":{"position":[[64,5],[133,6],[1318,7]]},"574":{"position":[[612,5],[637,6]]},"575":{"position":[[341,6]]},"580":{"position":[[132,5]]},"581":{"position":[[353,6]]},"586":{"position":[[103,6]]},"588":{"position":[[43,6]]},"590":{"position":[[263,6],[295,5]]},"593":{"position":[[34,7],[150,5]]},"594":{"position":[[202,7]]},"595":{"position":[[376,5]]},"605":{"position":[[214,7]]},"630":{"position":[[1014,5]]},"635":{"position":[[377,7]]},"638":{"position":[[6,7]]},"647":{"position":[[274,6]]},"659":{"position":[[91,5],[753,6],[976,7]]},"660":{"position":[[307,6],[396,7]]},"661":{"position":[[1698,5]]},"662":{"position":[[458,5],[564,6],[661,7]]},"680":{"position":[[135,5],[1013,5]]},"685":{"position":[[21,6],[575,5]]},"693":{"position":[[628,5]]},"696":{"position":[[80,6],[994,5],[1417,5],[1586,7],[1921,5],[1962,6],[2041,7]]},"697":{"position":[[14,6],[252,6],[505,6],[553,5]]},"698":{"position":[[2384,7],[2436,5]]},"701":{"position":[[765,5]]},"702":{"position":[[218,6]]},"703":{"position":[[59,5],[287,5],[577,5]]},"709":{"position":[[187,7],[760,7]]},"710":{"position":[[536,6]]},"711":{"position":[[140,6],[2140,5]]},"715":{"position":[[37,5]]},"716":{"position":[[119,7],[327,5]]},"720":{"position":[[4,5]]},"723":{"position":[[442,6],[1997,6]]},"724":{"position":[[579,5]]},"749":{"position":[[6401,5],[14460,5],[21892,5]]},"754":{"position":[[10,5]]},"772":{"position":[[1133,6],[1312,6],[1955,5]]},"773":{"position":[[103,6]]},"775":{"position":[[558,5]]},"779":{"position":[[369,5]]},"784":{"position":[[798,6]]},"785":{"position":[[507,6]]},"786":{"position":[[14,5]]},"821":{"position":[[116,5],[703,5]]},"835":{"position":[[858,6],[1040,7]]},"836":{"position":[[767,6]]},"837":{"position":[[360,5],[750,5],[2066,5]]},"838":{"position":[[1093,7],[1240,6],[3355,5]]},"840":{"position":[[55,6]]},"841":{"position":[[88,6],[161,6],[1332,5],[1408,6]]},"844":{"position":[[181,5],[230,6]]},"846":{"position":[[796,7]]},"856":{"position":[[195,5]]},"865":{"position":[[79,5]]},"866":{"position":[[669,6]]},"898":{"position":[[282,6],[383,6]]},"902":{"position":[[441,7]]},"903":{"position":[[229,6]]},"904":{"position":[[443,6]]},"912":{"position":[[1,7],[318,6]]},"932":{"position":[[212,7],[364,7],[1413,5]]},"962":{"position":[[630,6]]},"977":{"position":[[453,6]]},"988":{"position":[[1872,5]]},"995":{"position":[[1216,5]]},"1002":{"position":[[260,5]]},"1005":{"position":[[209,7]]},"1006":{"position":[[100,7]]},"1007":{"position":[[1084,6]]},"1013":{"position":[[189,5],[421,5],[573,5],[640,5]]},"1028":{"position":[[80,7]]},"1047":{"position":[[102,5]]},"1068":{"position":[[239,6]]},"1072":{"position":[[550,7],[2128,5],[2220,5]]},"1074":{"position":[[381,6],[653,5]]},"1078":{"position":[[310,6]]},"1085":{"position":[[11,5],[48,5],[103,5],[307,5],[477,7],[696,5],[1075,5],[1511,5]]},"1104":{"position":[[770,5]]},"1105":{"position":[[1213,5]]},"1106":{"position":[[310,7]]},"1116":{"position":[[11,6]]},"1121":{"position":[[27,6]]},"1124":{"position":[[481,5],[1656,6],[1698,6],[2048,6]]},"1126":{"position":[[857,6]]},"1140":{"position":[[70,6]]},"1143":{"position":[[247,6]]},"1162":{"position":[[644,7],[690,5]]},"1170":{"position":[[228,7]]},"1171":{"position":[[364,6]]},"1173":{"position":[[53,5]]},"1180":{"position":[[308,5]]},"1181":{"position":[[41,7],[732,7],[778,5]]},"1184":{"position":[[124,5]]},"1186":{"position":[[203,6]]},"1191":{"position":[[233,5],[305,5]]},"1192":{"position":[[289,5]]},"1194":{"position":[[465,6],[739,6],[832,6],[964,6]]},"1198":{"position":[[488,5],[1271,6]]},"1199":{"position":[[81,7]]},"1207":{"position":[[671,5]]},"1222":{"position":[[1181,6]]},"1237":{"position":[[48,5],[234,6]]},"1239":{"position":[[155,5]]},"1241":{"position":[[16,6]]},"1242":{"position":[[32,6]]},"1246":{"position":[[1413,6],[1565,6],[1849,5]]},"1247":{"position":[[574,6]]},"1267":{"position":[[249,5]]},"1271":{"position":[[420,5]]},"1282":{"position":[[81,5],[184,5]]},"1292":{"position":[[412,6]]},"1294":{"position":[[245,6],[342,6],[897,5]]},"1295":{"position":[[125,7],[236,6],[617,7],[923,5],[998,6],[1191,5]]},"1300":{"position":[[975,5]]},"1305":{"position":[[491,6],[917,6],[1048,6]]},"1307":{"position":[[120,6]]},"1319":{"position":[[108,6]]},"1320":{"position":[[785,5]]},"1321":{"position":[[556,5],[763,6]]},"1324":{"position":[[263,5],[479,6]]}},"keywords":{}}],["store.add(hugedata",{"_index":1808,"title":{},"content":{"302":{"position":[[789,19]]}},"keywords":{}}],["store.index('ag",{"_index":6431,"title":{},"content":{"1294":{"position":[[946,16]]}},"keywords":{}}],["store.put(docdata",{"_index":6461,"title":{},"content":{"1296":{"position":[[941,19]]}},"keywords":{}}],["storeattachmentsasbase64str",{"_index":6369,"title":{},"content":{"1282":{"position":[[132,31]]}},"keywords":{}}],["stored/queri",{"_index":4716,"title":{},"content":{"821":{"position":[[658,14]]}},"keywords":{}}],["storedus",{"_index":2880,"title":{},"content":{"426":{"position":[[487,10]]}},"keywords":{}}],["storedusernam",{"_index":2872,"title":{},"content":{"425":{"position":[[361,14]]}},"keywords":{}}],["stores—provid",{"_index":2016,"title":{},"content":{"354":{"position":[[50,14]]}},"keywords":{}}],["straightforward",{"_index":529,"title":{},"content":{"34":{"position":[[116,16]]},"35":{"position":[[522,15]]},"47":{"position":[[644,15]]},"63":{"position":[[19,15]]},"90":{"position":[[77,16]]},"174":{"position":[[2162,16]]},"219":{"position":[[338,15]]},"285":{"position":[[32,15]]},"293":{"position":[[147,15]]},"306":{"position":[[127,15]]},"336":{"position":[[553,16]]},"387":{"position":[[31,15]]},"429":{"position":[[387,15]]},"491":{"position":[[517,15]]},"503":{"position":[[86,15]]},"522":{"position":[[61,16]]},"536":{"position":[[31,16]]},"554":{"position":[[66,15]]},"559":{"position":[[96,15]]},"563":{"position":[[932,15]]},"596":{"position":[[29,16]]},"612":{"position":[[677,16]]},"624":{"position":[[166,15]]},"690":{"position":[[163,16]]},"836":{"position":[[1381,15],[2248,16]]},"903":{"position":[[633,16]]},"906":{"position":[[504,16]]},"1208":{"position":[[24,15]]}},"keywords":{}}],["strang",{"_index":2847,"title":{},"content":{"421":{"position":[[169,7]]},"749":{"position":[[21948,7]]},"1085":{"position":[[264,7],[3130,7]]},"1305":{"position":[[275,7]]}},"keywords":{}}],["strateg",{"_index":1120,"title":{},"content":{"138":{"position":[[211,13]]},"166":{"position":[[182,13]]}},"keywords":{}}],["strategi",{"_index":227,"title":{"147":{"position":[[21,11]]},"496":{"position":[[20,11]]},"751":{"position":[[10,11]]}},"content":{"14":{"position":[[817,8]]},"65":{"position":[[111,8]]},"134":{"position":[[209,10]]},"135":{"position":[[298,11]]},"146":{"position":[[306,10]]},"147":{"position":[[96,10],[286,10]]},"165":{"position":[[249,10]]},"192":{"position":[[169,11]]},"202":{"position":[[431,8]]},"250":{"position":[[58,9]]},"287":{"position":[[239,8]]},"328":{"position":[[220,10]]},"339":{"position":[[81,11]]},"367":{"position":[[316,10]]},"381":{"position":[[409,10]]},"396":{"position":[[841,11]]},"403":{"position":[[367,8]]},"408":{"position":[[2677,10]]},"412":{"position":[[3260,9],[5311,9],[5533,9],[12407,8]]},"473":{"position":[[87,8]]},"501":{"position":[[375,10]]},"525":{"position":[[547,11]]},"567":{"position":[[1098,8]]},"618":{"position":[[444,8]]},"636":{"position":[[297,9]]},"688":{"position":[[858,9]]},"698":{"position":[[456,9],[1430,11],[2544,9],[3296,11]]},"702":{"position":[[637,8]]},"751":{"position":[[391,8],[739,10]]},"757":{"position":[[287,10]]},"860":{"position":[[788,11]]},"899":{"position":[[137,10]]},"1085":{"position":[[3497,11]]},"1149":{"position":[[63,9]]},"1305":{"position":[[173,8]]},"1313":{"position":[[982,11]]},"1321":{"position":[[400,8]]}},"keywords":{}}],["strategy.opf",{"_index":3090,"title":{},"content":{"469":{"position":[[254,13]]}},"keywords":{}}],["stream",{"_index":356,"title":{"140":{"position":[[7,7]]},"168":{"position":[[7,7]]},"196":{"position":[[7,7]]},"344":{"position":[[7,7]]},"509":{"position":[[7,7]]},"529":{"position":[[7,7]]},"585":{"position":[[30,8]]}},"content":{"20":{"position":[[195,7]]},"121":{"position":[[103,7]]},"140":{"position":[[21,8],[133,8],[268,7]]},"156":{"position":[[106,6]]},"168":{"position":[[20,7],[130,8]]},"170":{"position":[[423,8]]},"196":{"position":[[22,8],[99,8]]},"208":{"position":[[278,9]]},"255":{"position":[[259,9]]},"267":{"position":[[537,7]]},"283":{"position":[[341,7]]},"303":{"position":[[240,7]]},"344":{"position":[[12,7]]},"408":{"position":[[2511,6]]},"445":{"position":[[1012,7],[1389,8]]},"464":{"position":[[154,6]]},"491":{"position":[[1703,9]]},"509":{"position":[[24,8]]},"529":{"position":[[48,8]]},"570":{"position":[[772,6]]},"612":{"position":[[1127,6],[1500,6],[1928,8]]},"613":{"position":[[243,8],[468,10]]},"614":{"position":[[325,9]]},"617":{"position":[[1540,7],[2011,6],[2273,6]]},"622":{"position":[[645,7],[738,8]]},"623":{"position":[[714,8]]},"624":{"position":[[599,10]]},"625":{"position":[[25,9]]},"626":{"position":[[123,8],[206,9],[321,6],[888,6]]},"627":{"position":[[81,9]]},"632":{"position":[[415,7]]},"643":{"position":[[223,9]]},"749":{"position":[[15627,7]]},"781":{"position":[[276,7]]},"866":{"position":[[552,6],[583,7]]},"871":{"position":[[124,7]]},"875":{"position":[[6629,6],[7103,6],[7312,8],[7732,7],[8461,8],[9309,7],[9750,8]]},"885":{"position":[[448,6]]},"886":{"position":[[3223,7],[3292,6],[3351,6]]},"888":{"position":[[732,8]]},"921":{"position":[[34,6]]},"932":{"position":[[622,7]]},"941":{"position":[[51,7]]},"970":{"position":[[51,7]]},"988":{"position":[[4723,6],[4793,7],[4832,8],[4899,6],[5352,8]]},"990":{"position":[[702,6]]},"1005":{"position":[[246,8]]},"1198":{"position":[[1926,7]]},"1206":{"position":[[353,10]]}},"keywords":{}}],["streamhero(head",{"_index":5136,"title":{},"content":{"886":{"position":[[3567,19]]}},"keywords":{}}],["streamhuman",{"_index":5078,"title":{},"content":{"885":{"position":[[505,12]]}},"keywords":{}}],["streamhuman(head",{"_index":5089,"title":{},"content":{"885":{"position":[[1348,20]]}},"keywords":{}}],["streamlin",{"_index":986,"title":{},"content":{"80":{"position":[[117,12]]},"89":{"position":[[193,12]]},"112":{"position":[[193,11]]},"161":{"position":[[325,11]]},"279":{"position":[[429,11]]},"283":{"position":[[83,10]]},"362":{"position":[[963,11]]},"369":{"position":[[896,11]]},"387":{"position":[[382,10]]},"485":{"position":[[82,12]]},"521":{"position":[[510,11]]},"802":{"position":[[692,11]]}},"keywords":{}}],["streamnam",{"_index":4927,"title":{},"content":{"866":{"position":[[571,11]]}},"keywords":{}}],["streamquerybuild",{"_index":5139,"title":{},"content":{"886":{"position":[[4205,19]]}},"keywords":{}}],["streamsconflict",{"_index":4934,"title":{},"content":{"870":{"position":[[152,15]]}},"keywords":{}}],["strength",{"_index":799,"title":{},"content":{"52":{"position":[[285,9],[582,9]]},"133":{"position":[[16,9]]},"162":{"position":[[688,9]]},"182":{"position":[[16,9]]},"190":{"position":[[16,9]]},"207":{"position":[[20,9]]},"269":{"position":[[46,9]]},"383":{"position":[[24,9]]},"441":{"position":[[548,9]]},"444":{"position":[[403,9]]},"539":{"position":[[285,9],[582,9]]},"599":{"position":[[312,9],[609,9]]}},"keywords":{}}],["stress",{"_index":3111,"title":{},"content":{"477":{"position":[[227,6]]}},"keywords":{}}],["strict",{"_index":2022,"title":{},"content":{"354":{"position":[[582,6]]},"408":{"position":[[1158,7]]},"841":{"position":[[1281,6]]},"1085":{"position":[[2644,6]]}},"keywords":{}}],["stricter",{"_index":1752,"title":{},"content":{"299":{"position":[[639,9]]},"300":{"position":[[729,8]]}},"keywords":{}}],["strictli",{"_index":2665,"title":{},"content":{"412":{"position":[[1583,8]]}},"keywords":{}}],["string",{"_index":773,"title":{},"content":{"51":{"position":[[415,9],[457,8],[484,8]]},"188":{"position":[[1292,9],[1334,9],[1377,9]]},"209":{"position":[[497,9],[540,8]]},"211":{"position":[[459,9],[504,8]]},"255":{"position":[[841,9],[884,8]]},"259":{"position":[[141,9],[183,8]]},"314":{"position":[[807,8],[836,8]]},"315":{"position":[[783,8],[809,8]]},"316":{"position":[[292,8],[321,8],[352,9]]},"334":{"position":[[693,8],[719,8]]},"367":{"position":[[836,9],[927,9],[1001,9]]},"392":{"position":[[643,9],[684,8],[1609,9],[1679,8],[4078,8]]},"397":{"position":[[199,7],[494,9],[1567,6]]},"412":{"position":[[4955,7]]},"424":{"position":[[221,8]]},"439":{"position":[[624,8]]},"451":{"position":[[484,6]]},"457":{"position":[[156,7],[447,7],[520,6]]},"459":{"position":[[1083,7]]},"460":{"position":[[610,7]]},"480":{"position":[[607,8],[634,8]]},"482":{"position":[[907,8],[939,8]]},"538":{"position":[[716,9],[758,8],[785,8]]},"554":{"position":[[1398,9],[1447,8],[1480,8]]},"560":{"position":[[47,6]]},"562":{"position":[[379,8],[405,8],[432,8]]},"564":{"position":[[836,8],[868,8]]},"566":{"position":[[76,8]]},"579":{"position":[[701,8],[727,8]]},"598":{"position":[[723,9],[765,8],[792,8]]},"632":{"position":[[1591,9],[1634,8]]},"638":{"position":[[675,9],[724,8]]},"639":{"position":[[453,9],[498,8]]},"662":{"position":[[2454,9],[2496,8]]},"680":{"position":[[883,9]]},"696":{"position":[[669,7]]},"717":{"position":[[1492,9],[1536,8]]},"724":{"position":[[814,7],[863,6]]},"734":{"position":[[757,9]]},"746":{"position":[[390,8]]},"749":{"position":[[30,6],[2984,7],[3868,6],[4047,7],[7353,7],[7403,7],[8174,6],[13796,6],[17092,6],[17203,7],[18256,6],[18629,7],[18650,7],[18754,7],[20142,6],[21512,8],[23863,6]]},"751":{"position":[[685,6],[928,6],[1195,8],[1787,6]]},"808":{"position":[[236,8],[312,8],[350,6],[471,6],[608,8],[675,8]]},"812":{"position":[[131,8],[199,9]]},"813":{"position":[[131,8],[198,8]]},"838":{"position":[[2668,9],[2710,8]]},"862":{"position":[[723,9],[765,8]]},"872":{"position":[[631,6],[1948,9],[1995,8],[2025,8],[4178,9],[4225,8],[4255,8]]},"875":{"position":[[1676,6]]},"885":{"position":[[553,8],[572,8],[648,8],[667,8],[738,8],[1317,8]]},"898":{"position":[[233,7],[2528,9],[2575,8],[2605,8]]},"904":{"position":[[930,9],[973,8],[1045,9],[2055,6]]},"917":{"position":[[187,8],[325,8]]},"918":{"position":[[52,6]]},"924":{"position":[[11,6]]},"925":{"position":[[13,6]]},"927":{"position":[[37,7]]},"932":{"position":[[59,7]]},"961":{"position":[[24,6]]},"963":{"position":[[139,6]]},"968":{"position":[[255,6],[309,7],[439,7]]},"1018":{"position":[[765,6],[930,6],[948,6]]},"1022":{"position":[[207,6],[227,6]]},"1065":{"position":[[514,6]]},"1074":{"position":[[199,6]]},"1077":{"position":[[175,7]]},"1078":{"position":[[300,6],[536,9],[632,8],[662,8]]},"1079":{"position":[[128,7],[364,6]]},"1080":{"position":[[159,9],[255,9],[289,6],[376,8],[437,8]]},"1082":{"position":[[244,9],[340,8],[370,8]]},"1083":{"position":[[444,9],[540,8],[570,8]]},"1085":{"position":[[350,6],[546,6]]},"1100":{"position":[[455,6]]},"1103":{"position":[[68,7]]},"1149":{"position":[[1121,9],[1163,8]]},"1158":{"position":[[431,8],[458,8]]},"1171":{"position":[[429,7]]},"1189":{"position":[[260,7],[498,6],[570,7]]},"1208":{"position":[[304,7],[1296,7]]},"1213":{"position":[[66,7],[145,7],[294,7]]},"1250":{"position":[[84,6]]},"1251":{"position":[[8,6]]},"1252":{"position":[[280,7]]},"1281":{"position":[[293,6]]},"1282":{"position":[[221,6]]},"1290":{"position":[[106,9]]},"1291":{"position":[[114,7]]},"1296":{"position":[[685,6],[732,8],[1521,6]]},"1305":{"position":[[525,7],[845,7]]},"1311":{"position":[[467,8],[498,8],[528,8],[705,7]]},"1321":{"position":[[326,7]]}},"keywords":{}}],["string','nul",{"_index":4676,"title":{},"content":{"808":{"position":[[360,17]]}},"keywords":{}}],["string,nul",{"_index":4359,"title":{},"content":{"749":{"position":[[17211,13]]}},"keywords":{}}],["string.fromcharcode(65535",{"_index":6435,"title":{},"content":{"1294":{"position":[[1403,26]]}},"keywords":{}}],["string/number/boolean",{"_index":5209,"title":{},"content":{"898":{"position":[[1776,24]]}},"keywords":{}}],["string/number/integ",{"_index":4393,"title":{},"content":{"749":{"position":[[19931,21]]}},"keywords":{}}],["stringent",{"_index":5281,"title":{},"content":{"912":{"position":[[702,9]]}},"keywords":{}}],["stringifi",{"_index":2884,"title":{},"content":{"427":{"position":[[698,12]]},"462":{"position":[[761,11]]},"559":{"position":[[1196,11]]},"749":{"position":[[3062,11]]}},"keywords":{}}],["strings.mango",{"_index":5792,"title":{},"content":{"1071":{"position":[[207,13]]}},"keywords":{}}],["strings.queri",{"_index":5793,"title":{},"content":{"1071":{"position":[[294,15]]}},"keywords":{}}],["string|blob",{"_index":5289,"title":{},"content":{"917":{"position":[[266,13]]}},"keywords":{}}],["strip",{"_index":2480,"title":{},"content":{"402":{"position":[[234,5]]},"898":{"position":[[1970,6]]}},"keywords":{}}],["strong",{"_index":546,"title":{},"content":{"34":{"position":[[684,6]]},"47":{"position":[[585,6]]},"320":{"position":[[138,6]]},"412":{"position":[[6403,6]]},"1125":{"position":[[387,8],[461,9]]}},"keywords":{}}],["strongli",{"_index":2011,"title":{},"content":{"353":{"position":[[539,8]]},"1123":{"position":[[13,8]]}},"keywords":{}}],["structur",{"_index":695,"title":{},"content":{"45":{"position":[[85,10]]},"47":{"position":[[626,10]]},"57":{"position":[[290,10]]},"64":{"position":[[56,10]]},"73":{"position":[[118,9]]},"117":{"position":[[68,10]]},"126":{"position":[[248,9]]},"174":{"position":[[2279,11]]},"178":{"position":[[200,11]]},"231":{"position":[[72,10]]},"276":{"position":[[238,10]]},"281":{"position":[[242,10]]},"282":{"position":[[235,9],[385,9]]},"321":{"position":[[254,10]]},"351":{"position":[[181,11]]},"352":{"position":[[313,11]]},"354":{"position":[[376,10]]},"361":{"position":[[203,9]]},"364":{"position":[[546,11]]},"369":{"position":[[393,11]]},"382":{"position":[[92,11]]},"392":{"position":[[1253,11]]},"395":{"position":[[314,11]]},"396":{"position":[[364,9]]},"408":{"position":[[438,10],[2106,10]]},"426":{"position":[[210,10]]},"427":{"position":[[412,10],[570,10]]},"430":{"position":[[1049,10]]},"441":{"position":[[350,11]]},"446":{"position":[[917,11]]},"452":{"position":[[136,10]]},"495":{"position":[[706,9]]},"533":{"position":[[65,10]]},"559":{"position":[[1626,10]]},"593":{"position":[[65,10]]},"612":{"position":[[1017,10]]},"636":{"position":[[392,9]]},"749":{"position":[[11926,10]]},"772":{"position":[[2230,10]]},"800":{"position":[[511,9]]},"836":{"position":[[2129,9]]},"841":{"position":[[1364,10]]},"865":{"position":[[105,10]]},"936":{"position":[[60,11]]},"1085":{"position":[[1099,9]]},"1132":{"position":[[434,10],[1494,10]]}},"keywords":{}}],["struggl",{"_index":2735,"title":{},"content":{"412":{"position":[[9398,8]]}},"keywords":{}}],["stuck",{"_index":2893,"title":{},"content":{"427":{"position":[[1431,5]]},"1031":{"position":[[239,5]]}},"keywords":{}}],["stuff",{"_index":1251,"title":{},"content":{"188":{"position":[[866,5]]},"451":{"position":[[618,6]]},"460":{"position":[[920,5]]},"463":{"position":[[148,6]]},"699":{"position":[[18,5]]},"705":{"position":[[978,5]]},"785":{"position":[[122,5]]},"829":{"position":[[797,5]]},"1027":{"position":[[77,6]]}},"keywords":{}}],["stun",{"_index":3625,"title":{},"content":{"614":{"position":[[470,5]]}},"keywords":{}}],["stutter",{"_index":3720,"title":{},"content":{"642":{"position":[[289,10]]}},"keywords":{}}],["style",{"_index":3898,"title":{},"content":{"689":{"position":[[293,5]]},"841":{"position":[[561,5]]},"902":{"position":[[932,5]]}},"keywords":{}}],["style="color",{"_index":6183,"title":{},"content":{"1202":{"position":[[102,18]]}},"keywords":{}}],["sub",{"_index":1987,"title":{},"content":{"350":{"position":[[86,3]]},"496":{"position":[[345,3]]},"562":{"position":[[1292,3]]},"749":{"position":[[22030,3],[22386,3]]},"979":{"position":[[224,3]]},"1085":{"position":[[1112,3]]},"1215":{"position":[[407,3]]}},"keywords":{}}],["sub.unsubscrib",{"_index":3431,"title":{},"content":{"562":{"position":[[1376,18]]},"979":{"position":[[394,18]]}},"keywords":{}}],["sub1.yoursite.com",{"_index":1849,"title":{},"content":{"303":{"position":[[1183,17]]}},"keywords":{}}],["sub2.yoursite.com",{"_index":1851,"title":{},"content":{"303":{"position":[[1225,18]]}},"keywords":{}}],["subdirectori",{"_index":6198,"title":{},"content":{"1208":{"position":[[767,13]]}},"keywords":{}}],["subdomain",{"_index":1844,"title":{},"content":{"303":{"position":[[1025,10]]},"450":{"position":[[297,11]]},"849":{"position":[[536,10]]}},"keywords":{}}],["subfield",{"_index":3418,"title":{},"content":{"560":{"position":[[418,9]]}},"keywords":{}}],["subject",{"_index":4928,"title":{},"content":{"866":{"position":[[621,7],[744,7]]},"875":{"position":[[4325,7],[4427,10],[8048,7],[8097,10],[9467,7],[9516,10]]},"1218":{"position":[[491,10],[839,10]]}},"keywords":{}}],["subject<rxreplicationpullstreamitem<ani",{"_index":5474,"title":{},"content":{"988":{"position":[[5089,46]]}},"keywords":{}}],["subjectprefix",{"_index":4930,"title":{},"content":{"866":{"position":[[770,14]]}},"keywords":{}}],["submit",{"_index":3160,"title":{},"content":{"489":{"position":[[397,10]]}},"keywords":{}}],["suboptim",{"_index":959,"title":{},"content":{"69":{"position":[[149,10]]},"101":{"position":[[73,10]]},"435":{"position":[[316,10]]}},"keywords":{}}],["subresult",{"_index":6441,"title":{},"content":{"1294":{"position":[[1600,10]]}},"keywords":{}}],["subresult.length",{"_index":6445,"title":{},"content":{"1294":{"position":[[1682,17]]}},"keywords":{}}],["subscrib",{"_index":538,"title":{},"content":{"34":{"position":[[450,9],[604,9]]},"47":{"position":[[788,9]]},"53":{"position":[[46,9]]},"121":{"position":[[191,9]]},"130":{"position":[[63,9]]},"136":{"position":[[198,9]]},"140":{"position":[[111,11]]},"143":{"position":[[140,9],[328,11]]},"159":{"position":[[148,9]]},"182":{"position":[[246,9]]},"185":{"position":[[221,11]]},"188":{"position":[[3201,9]]},"252":{"position":[[314,9]]},"323":{"position":[[449,11]]},"326":{"position":[[152,9]]},"329":{"position":[[147,9]]},"335":{"position":[[221,11]]},"346":{"position":[[262,9],[421,9]]},"360":{"position":[[302,9]]},"379":{"position":[[62,9]]},"411":{"position":[[2792,9],[2989,10]]},"458":{"position":[[1534,9]]},"493":{"position":[[127,9],[325,10]]},"515":{"position":[[243,11]]},"529":{"position":[[28,9]]},"541":{"position":[[138,10],[755,10]]},"562":{"position":[[786,9],[907,9]]},"571":{"position":[[755,9],[1268,9]]},"575":{"position":[[273,10]]},"580":{"position":[[118,9],[463,9]]},"600":{"position":[[88,11]]},"601":{"position":[[43,10],[602,9],[736,10]]},"662":{"position":[[120,9]]},"710":{"position":[[193,9]]},"781":{"position":[[763,9]]},"799":{"position":[[138,11]]},"816":{"position":[[176,11]]},"829":{"position":[[2163,9]]},"838":{"position":[[149,9]]},"846":{"position":[[1406,9]]},"890":{"position":[[102,9]]},"898":{"position":[[1431,9]]},"1058":{"position":[[487,13]]},"1117":{"position":[[406,9]]},"1150":{"position":[[387,11]]}},"keywords":{}}],["subscribe((hero",{"_index":1944,"title":{},"content":{"335":{"position":[[292,19]]}},"keywords":{}}],["subscribe((newhero",{"_index":3498,"title":{},"content":{"580":{"position":[[651,22]]}},"keywords":{}}],["subscribe(alivehero",{"_index":3228,"title":{},"content":{"502":{"position":[[1071,22]]},"518":{"position":[[538,22]]},"571":{"position":[[1007,22]]}},"keywords":{}}],["subscribe(alltask",{"_index":3705,"title":{},"content":{"632":{"position":[[1801,19]]}},"keywords":{}}],["subscribe(currentrxdocu",{"_index":5708,"title":{},"content":{"1046":{"position":[[133,28]]}},"keywords":{}}],["subscribe(doc",{"_index":1135,"title":{},"content":{"143":{"position":[[493,17]]}},"keywords":{}}],["subscribe(newnam",{"_index":5674,"title":{},"content":{"1039":{"position":[[220,18],[394,18]]}},"keywords":{}}],["subscribe(result",{"_index":3819,"title":{},"content":{"662":{"position":[[2824,21]]},"710":{"position":[[2131,21]]},"838":{"position":[[3038,21]]}},"keywords":{}}],["subscribe(undonetask",{"_index":3125,"title":{},"content":{"480":{"position":[[831,22]]}},"keywords":{}}],["subscript",{"_index":360,"title":{"143":{"position":[[19,13]]}},"content":{"21":{"position":[[129,12]]},"38":{"position":[[537,13]]},"130":{"position":[[103,12]]},"143":{"position":[[215,12]]},"346":{"position":[[332,14],[361,13]]},"411":{"position":[[2322,15]]},"412":{"position":[[2881,12]]},"490":{"position":[[187,12]]},"541":{"position":[[385,12]]},"542":{"position":[[1026,13]]},"562":{"position":[[1407,12]]},"563":{"position":[[1044,13]]},"590":{"position":[[334,13],[382,12],[407,14],[491,14],[515,13]]},"649":{"position":[[242,12]]},"781":{"position":[[713,13]]},"816":{"position":[[258,13]]},"828":{"position":[[458,14]]},"829":{"position":[[3704,13]]},"860":{"position":[[600,13]]},"863":{"position":[[286,13]]},"875":{"position":[[7387,12]]},"885":{"position":[[485,12],[1256,13],[1333,12]]},"886":{"position":[[3523,13],[4405,12]]},"1017":{"position":[[97,12]]},"1058":{"position":[[392,12]]},"1117":{"position":[[495,12]]}},"keywords":{}}],["subscription.unsubscrib",{"_index":3311,"title":{},"content":{"541":{"position":[[478,27]]},"875":{"position":[[7521,28]]}},"keywords":{}}],["subselect",{"_index":5795,"title":{},"content":{"1072":{"position":[[344,12]]}},"keywords":{}}],["subsequ",{"_index":3110,"title":{},"content":{"477":{"position":[[187,10]]},"495":{"position":[[365,10]]},"723":{"position":[[1741,10]]},"1297":{"position":[[359,10]]}},"keywords":{}}],["subset",{"_index":2717,"title":{},"content":{"412":{"position":[[7083,6]]},"555":{"position":[[911,6]]},"643":{"position":[[212,7]]},"858":{"position":[[36,6]]},"984":{"position":[[160,6]]},"1009":{"position":[[160,7]]},"1296":{"position":[[133,6]]}},"keywords":{}}],["substanti",{"_index":1672,"title":{},"content":{"287":{"position":[[856,11]]},"430":{"position":[[658,11]]},"508":{"position":[[151,11]]},"1151":{"position":[[402,11]]},"1178":{"position":[[401,11]]}},"keywords":{}}],["succe",{"_index":610,"title":{},"content":{"38":{"position":[[1123,7]]},"1305":{"position":[[965,8]]}},"keywords":{}}],["success",{"_index":3196,"title":{},"content":{"496":{"position":[[710,10]]},"497":{"position":[[105,7],[519,7]]},"944":{"position":[[150,7],[310,8]]},"945":{"position":[[91,7],[205,8]]},"947":{"position":[[137,7],[281,8]]},"994":{"position":[[117,10]]}},"keywords":{}}],["successfulli",{"_index":3683,"title":{},"content":{"626":{"position":[[515,12]]},"1297":{"position":[[250,12]]}},"keywords":{}}],["successor",{"_index":221,"title":{},"content":{"14":{"position":[[636,9]]}},"keywords":{}}],["such",{"_index":551,"title":{},"content":{"35":{"position":[[155,4]]},"51":{"position":[[977,4]]},"66":{"position":[[24,4]]},"94":{"position":[[92,4]]},"98":{"position":[[22,4]]},"113":{"position":[[214,4]]},"134":{"position":[[158,4]]},"140":{"position":[[208,4]]},"146":{"position":[[63,4]]},"155":{"position":[[191,4]]},"165":{"position":[[191,4]]},"172":{"position":[[170,4]]},"173":{"position":[[1936,4]]},"174":{"position":[[3038,4]]},"179":{"position":[[114,4]]},"186":{"position":[[103,4]]},"192":{"position":[[181,4]]},"196":{"position":[[162,4]]},"202":{"position":[[256,4]]},"218":{"position":[[119,4]]},"222":{"position":[[109,4]]},"227":{"position":[[352,4]]},"236":{"position":[[178,4]]},"266":{"position":[[95,4]]},"300":{"position":[[676,4]]},"303":{"position":[[168,4]]},"350":{"position":[[143,4]]},"354":{"position":[[496,4]]},"362":{"position":[[933,4]]},"375":{"position":[[159,4],[448,4]]},"377":{"position":[[73,4]]},"381":{"position":[[119,4]]},"382":{"position":[[169,4]]},"390":{"position":[[215,4]]},"392":{"position":[[1265,4]]},"393":{"position":[[205,4]]},"396":{"position":[[1669,4]]},"400":{"position":[[648,4]]},"408":{"position":[[700,4]]},"418":{"position":[[110,4],[383,4]]},"420":{"position":[[1234,4]]},"432":{"position":[[1116,4]]},"444":{"position":[[445,4]]},"446":{"position":[[503,4]]},"450":{"position":[[586,4]]},"520":{"position":[[186,4]]},"525":{"position":[[559,4]]},"529":{"position":[[213,4]]},"550":{"position":[[196,4]]},"551":{"position":[[132,4]]},"569":{"position":[[801,4]]},"613":{"position":[[208,4],[437,4]]},"618":{"position":[[120,4]]},"620":{"position":[[139,4]]},"624":{"position":[[549,4]]},"627":{"position":[[234,4]]},"686":{"position":[[901,4]]},"802":{"position":[[357,4]]},"831":{"position":[[101,4]]},"1282":{"position":[[517,4]]}},"keywords":{}}],["suddenli",{"_index":2849,"title":{},"content":{"421":{"position":[[321,8]]}},"keywords":{}}],["sudoletmein",{"_index":3348,"title":{},"content":{"554":{"position":[[1143,13]]},"717":{"position":[[1231,13]]}},"keywords":{}}],["suffer",{"_index":2441,"title":{},"content":{"400":{"position":[[365,7]]},"622":{"position":[[93,6]]}},"keywords":{}}],["suffic",{"_index":3481,"title":{},"content":{"574":{"position":[[694,7]]}},"keywords":{}}],["suffici",{"_index":6008,"title":{},"content":{"1120":{"position":[[478,11]]},"1300":{"position":[[961,10]]}},"keywords":{}}],["suffix",{"_index":4685,"title":{},"content":{"811":{"position":[[107,6]]},"1085":{"position":[[3713,6]]},"1117":{"position":[[257,8]]}},"keywords":{}}],["suggest",{"_index":1294,"title":{},"content":{"189":{"position":[[492,9]]},"299":{"position":[[1579,7]]},"390":{"position":[[1420,8]]},"444":{"position":[[771,9]]}},"keywords":{}}],["suit",{"_index":21,"title":{},"content":{"1":{"position":[[312,5]]},"34":{"position":[[271,6]]},"73":{"position":[[46,6]]},"126":{"position":[[297,6]]},"131":{"position":[[948,5]]},"162":{"position":[[705,6]]},"225":{"position":[[155,6]]},"254":{"position":[[438,6]]},"262":{"position":[[371,4]]},"266":{"position":[[408,5]]},"267":{"position":[[34,6]]},"281":{"position":[[184,6]]},"285":{"position":[[257,4]]},"288":{"position":[[214,5]]},"325":{"position":[[209,6]]},"418":{"position":[[270,6]]},"436":{"position":[[374,4]]},"489":{"position":[[296,4]]},"524":{"position":[[138,5]]},"688":{"position":[[985,6]]},"829":{"position":[[2863,6]]},"906":{"position":[[708,4]]},"1147":{"position":[[401,5]]},"1159":{"position":[[200,7]]},"1245":{"position":[[37,6]]},"1271":{"position":[[316,6]]}},"keywords":{}}],["suitabl",{"_index":232,"title":{"624":{"position":[[29,12]]}},"content":{"14":{"position":[[893,8]]},"47":{"position":[[325,8]]},"63":{"position":[[200,8]]},"287":{"position":[[578,8]]},"336":{"position":[[209,8]]},"365":{"position":[[380,8],[545,8],[1411,8]]},"393":{"position":[[400,8]]},"430":{"position":[[54,8]]},"446":{"position":[[833,8]]},"451":{"position":[[300,8]]},"524":{"position":[[455,8]]},"528":{"position":[[157,8]]},"533":{"position":[[280,8]]},"593":{"position":[[280,8]]},"623":{"position":[[566,8]]},"624":{"position":[[109,12]]},"640":{"position":[[436,8]]},"659":{"position":[[944,8]]},"711":{"position":[[2227,8]]},"835":{"position":[[1008,8]]},"1198":{"position":[[378,8]]},"1284":{"position":[[406,8]]}},"keywords":{}}],["sum",{"_index":6293,"title":{},"content":{"1250":{"position":[[469,5]]}},"keywords":{}}],["sum(column_nam",{"_index":6292,"title":{},"content":{"1250":{"position":[[103,19]]}},"keywords":{}}],["summar",{"_index":1736,"title":{},"content":{"299":{"position":[[131,10]]}},"keywords":{}}],["summari",{"_index":935,"title":{"83":{"position":[[0,8]]},"841":{"position":[[0,8]]}},"content":{"65":{"position":[[1803,8]]},"412":{"position":[[14919,8]]},"432":{"position":[[1277,7]]}},"keywords":{}}],["supabas",{"_index":362,"title":{"22":{"position":[[0,9]]},"895":{"position":[[0,8]]},"896":{"position":[[25,8]]},"898":{"position":[[18,8]]}},"content":{"22":{"position":[[3,8],[303,8]]},"392":{"position":[[827,8]]},"705":{"position":[[1227,9]]},"793":{"position":[[802,8]]},"896":{"position":[[91,8],[136,8],[235,8]]},"897":{"position":[[10,8],[68,8],[297,8],[367,8]]},"898":{"position":[[75,8],[113,8],[465,9],[1660,8],[2715,8],[2746,8],[3041,8],[3176,8],[3291,10],[3371,9],[3435,10],[4228,8]]},"899":{"position":[[336,8]]},"1284":{"position":[[206,8]]}},"keywords":{}}],["supabase.rxdb",{"_index":6381,"title":{},"content":{"1284":{"position":[[240,13]]}},"keywords":{}}],["supabase/gt",{"_index":2450,"title":{},"content":{"401":{"position":[[230,12]]}},"keywords":{}}],["supabase/supabas",{"_index":5186,"title":{},"content":{"896":{"position":[[347,18]]},"898":{"position":[[42,18],[3003,19]]}},"keywords":{}}],["supabase_realtim",{"_index":5208,"title":{},"content":{"898":{"position":[[1470,17]]}},"keywords":{}}],["superhuman",{"_index":798,"title":{},"content":{"52":{"position":[[273,11]]},"539":{"position":[[273,11]]},"599":{"position":[[300,11]]}},"keywords":{}}],["superior",{"_index":1645,"title":{},"content":{"278":{"position":[[223,8]]},"354":{"position":[[1563,9]]}},"keywords":{}}],["superset",{"_index":1654,"title":{},"content":{"281":{"position":[[23,8]]}},"keywords":{}}],["support",{"_index":297,"title":{"74":{"position":[[28,7]]},"80":{"position":[[19,8]]},"105":{"position":[[28,7]]},"109":{"position":[[19,8]]},"125":{"position":[[10,8]]},"160":{"position":[[10,8]]},"232":{"position":[[18,7]]},"237":{"position":[[19,8]]},"253":{"position":[[22,8]]},"281":{"position":[[28,8]]},"330":{"position":[[10,8]]},"380":{"position":[[14,8]]},"458":{"position":[[10,8]]},"459":{"position":[[9,8]]},"460":{"position":[[10,8]]},"519":{"position":[[10,8]]},"589":{"position":[[10,8]]},"989":{"position":[[10,8]]},"1174":{"position":[[10,8]]},"1183":{"position":[[10,8]]},"1251":{"position":[[11,8]]},"1301":{"position":[[21,8]]},"1322":{"position":[[11,8]]}},"content":{"17":{"position":[[505,7]]},"19":{"position":[[502,7]]},"21":{"position":[[174,7]]},"28":{"position":[[646,9]]},"33":{"position":[[268,7],[328,7],[533,8]]},"36":{"position":[[78,7]]},"39":{"position":[[80,8],[618,8]]},"43":{"position":[[210,8]]},"45":{"position":[[210,8]]},"47":{"position":[[564,8],[1002,7],[1091,7]]},"51":{"position":[[6,8]]},"55":{"position":[[59,8]]},"57":{"position":[[49,9],[189,8]]},"59":{"position":[[155,8]]},"74":{"position":[[31,8]]},"77":{"position":[[8,7]]},"79":{"position":[[24,7]]},"80":{"position":[[38,8]]},"83":{"position":[[141,8]]},"105":{"position":[[121,8]]},"109":{"position":[[15,8]]},"120":{"position":[[318,8]]},"123":{"position":[[24,7]]},"124":{"position":[[48,7]]},"125":{"position":[[30,7]]},"131":{"position":[[6,8],[225,8]]},"132":{"position":[[138,7]]},"135":{"position":[[6,8]]},"139":{"position":[[24,7]]},"141":{"position":[[63,8]]},"144":{"position":[[6,8]]},"160":{"position":[[23,8]]},"162":{"position":[[329,9]]},"174":{"position":[[609,7],[715,7],[792,8],[1791,8],[1833,8]]},"195":{"position":[[43,8]]},"210":{"position":[[50,8]]},"222":{"position":[[200,7]]},"232":{"position":[[115,8],[324,8]]},"235":{"position":[[6,8]]},"237":{"position":[[32,8]]},"241":{"position":[[343,8]]},"254":{"position":[[372,9]]},"261":{"position":[[57,8]]},"263":{"position":[[163,8]]},"280":{"position":[[138,10]]},"287":{"position":[[624,9]]},"289":{"position":[[1404,7]]},"303":{"position":[[299,8]]},"312":{"position":[[48,8]]},"318":{"position":[[24,8]]},"320":{"position":[[155,8]]},"323":{"position":[[524,8]]},"328":{"position":[[6,8]]},"334":{"position":[[497,7]]},"336":{"position":[[6,8],[312,9]]},"343":{"position":[[6,8]]},"354":{"position":[[1208,8]]},"356":{"position":[[108,7]]},"357":{"position":[[340,7]]},"364":{"position":[[233,9]]},"365":{"position":[[1538,8]]},"367":{"position":[[447,8]]},"368":{"position":[[105,8]]},"373":{"position":[[343,8]]},"377":{"position":[[167,7]]},"381":{"position":[[66,8]]},"384":{"position":[[61,8]]},"386":{"position":[[301,8]]},"387":{"position":[[236,8]]},"400":{"position":[[326,8]]},"404":{"position":[[137,9],[280,8]]},"408":{"position":[[1064,8]]},"412":{"position":[[2596,7],[2766,7],[13570,7]]},"419":{"position":[[620,7],[1444,10]]},"422":{"position":[[122,7]]},"426":{"position":[[74,8]]},"432":{"position":[[415,7]]},"437":{"position":[[135,8],[178,7]]},"439":{"position":[[49,7]]},"440":{"position":[[209,7],[468,7]]},"445":{"position":[[2147,8]]},"452":{"position":[[262,7]]},"455":{"position":[[760,9]]},"457":{"position":[[573,7]]},"458":{"position":[[487,7]]},"459":{"position":[[264,7]]},"462":{"position":[[933,7]]},"470":{"position":[[543,7]]},"498":{"position":[[398,7]]},"502":{"position":[[1138,8]]},"504":{"position":[[1305,8]]},"515":{"position":[[40,7]]},"519":{"position":[[132,8]]},"525":{"position":[[515,7]]},"526":{"position":[[88,8]]},"530":{"position":[[394,8]]},"533":{"position":[[240,8]]},"535":{"position":[[557,8],[591,7],[1183,8]]},"542":{"position":[[11,8]]},"546":{"position":[[188,8]]},"551":{"position":[[14,8]]},"556":{"position":[[650,8]]},"563":{"position":[[143,8]]},"566":{"position":[[1241,9],[1264,9],[1356,8]]},"575":{"position":[[540,8]]},"579":{"position":[[506,7]]},"581":{"position":[[6,8]]},"586":{"position":[[55,8]]},"593":{"position":[[240,8]]},"595":{"position":[[584,8],[618,7],[1260,8]]},"606":{"position":[[188,8]]},"613":{"position":[[707,10],[800,7],[934,10]]},"614":{"position":[[287,8]]},"616":{"position":[[561,7]]},"622":{"position":[[579,7]]},"624":{"position":[[719,7],[932,9],[1159,8],[1217,7],[1556,7]]},"631":{"position":[[110,8]]},"634":{"position":[[57,8]]},"638":{"position":[[142,8]]},"640":{"position":[[214,7]]},"641":{"position":[[320,10]]},"659":{"position":[[898,9]]},"689":{"position":[[278,9]]},"709":{"position":[[402,8]]},"723":{"position":[[2069,7],[2420,7],[2529,8]]},"728":{"position":[[91,7]]},"730":{"position":[[263,10]]},"749":{"position":[[23251,7]]},"763":{"position":[[6,8]]},"824":{"position":[[491,7]]},"831":{"position":[[62,8]]},"835":{"position":[[969,9]]},"838":{"position":[[602,7],[801,8],[850,8]]},"840":{"position":[[278,7]]},"845":{"position":[[10,7]]},"863":{"position":[[278,7]]},"870":{"position":[[71,7],[232,7]]},"871":{"position":[[742,9]]},"882":{"position":[[157,7]]},"911":{"position":[[27,7],[130,8]]},"917":{"position":[[421,7],[502,8]]},"932":{"position":[[648,9]]},"962":{"position":[[308,9]]},"968":{"position":[[148,9]]},"981":{"position":[[1197,8],[1280,8],[1503,8]]},"1004":{"position":[[27,9],[105,7]]},"1072":{"position":[[86,7],[626,7],[1190,7],[1627,7],[1758,7],[2057,7]]},"1079":{"position":[[6,8]]},"1088":{"position":[[179,7]]},"1112":{"position":[[526,9]]},"1123":{"position":[[506,8]]},"1124":{"position":[[609,8],[744,8]]},"1132":{"position":[[589,8],[1351,8]]},"1141":{"position":[[242,7]]},"1143":{"position":[[448,8],[610,7]]},"1151":{"position":[[705,8]]},"1162":{"position":[[13,7],[762,7]]},"1165":{"position":[[43,7]]},"1171":{"position":[[13,7]]},"1178":{"position":[[704,8]]},"1181":{"position":[[13,7]]},"1188":{"position":[[178,10]]},"1207":{"position":[[67,9],[169,9],[205,8]]},"1211":{"position":[[259,7],[373,9]]},"1214":{"position":[[136,7]]},"1271":{"position":[[208,7],[397,8],[698,8]]},"1282":{"position":[[1003,7]]},"1288":{"position":[[55,9]]},"1301":{"position":[[971,7]]},"1304":{"position":[[1201,7],[1526,7],[1665,7]]}},"keywords":{}}],["support.rxdb",{"_index":997,"title":{},"content":{"84":{"position":[[240,12]]},"114":{"position":[[253,12]]},"149":{"position":[[253,12]]},"175":{"position":[[246,12]]},"347":{"position":[[253,12]]},"362":{"position":[[1324,12]]},"511":{"position":[[253,12]]},"531":{"position":[[253,12]]},"591":{"position":[[253,12]]}},"keywords":{}}],["supporteddo",{"_index":6159,"title":{},"content":{"1188":{"position":[[116,14]]}},"keywords":{}}],["supportedrxattach",{"_index":6158,"title":{},"content":{"1188":{"position":[[75,22]]}},"keywords":{}}],["supportperform",{"_index":6243,"title":{},"content":{"1216":{"position":[[68,18]]}},"keywords":{}}],["suppos",{"_index":3173,"title":{},"content":{"493":{"position":[[64,7]]},"1006":{"position":[[1,7]]}},"keywords":{}}],["sure",{"_index":1089,"title":{},"content":{"129":{"position":[[456,4]]},"554":{"position":[[1165,4]]},"590":{"position":[[708,4]]},"627":{"position":[[263,4]]},"666":{"position":[[58,4],[251,4]]},"709":{"position":[[967,4]]},"737":{"position":[[89,4]]},"749":{"position":[[5648,4]]},"770":{"position":[[606,4]]},"795":{"position":[[59,4]]},"861":{"position":[[2319,4]]},"872":{"position":[[784,4]]},"884":{"position":[[46,4]]},"886":{"position":[[4706,4]]},"904":{"position":[[34,4]]},"917":{"position":[[457,4]]},"1083":{"position":[[39,4]]},"1097":{"position":[[475,4]]},"1107":{"position":[[1010,4]]},"1124":{"position":[[1115,4]]},"1126":{"position":[[80,4]]},"1164":{"position":[[1398,4]]},"1175":{"position":[[76,4]]},"1184":{"position":[[242,4]]},"1192":{"position":[[733,4]]},"1280":{"position":[[53,4]]}},"keywords":{}}],["surg",{"_index":3244,"title":{},"content":{"510":{"position":[[475,6]]}},"keywords":{}}],["surpass",{"_index":3413,"title":{},"content":{"559":{"position":[[1704,7]]}},"keywords":{}}],["surprisingli",{"_index":2898,"title":{},"content":{"429":{"position":[[79,12]]},"463":{"position":[[868,12]]},"467":{"position":[[400,12]]}},"keywords":{}}],["survey",{"_index":2945,"title":{},"content":{"446":{"position":[[167,6]]}},"keywords":{}}],["surviv",{"_index":2920,"title":{},"content":{"436":{"position":[[201,8]]},"473":{"position":[[113,9]]}},"keywords":{}}],["sustain",{"_index":2836,"title":{},"content":{"420":{"position":[[1017,7]]},"1151":{"position":[[466,15]]},"1178":{"position":[[465,15]]}},"keywords":{}}],["svelt",{"_index":259,"title":{},"content":{"15":{"position":[[338,7]]},"94":{"position":[[131,7]]},"173":{"position":[[2329,7]]},"222":{"position":[[148,7]]}},"keywords":{}}],["swagger",{"_index":2120,"title":{},"content":{"367":{"position":[[660,9]]},"784":{"position":[[122,7]]}},"keywords":{}}],["swap",{"_index":1580,"title":{},"content":{"255":{"position":[[1614,8]]},"369":{"position":[[1346,4]]},"383":{"position":[[325,4]]},"556":{"position":[[1990,8]]},"846":{"position":[[514,7]]},"988":{"position":[[3097,4]]},"1124":{"position":[[185,4],[367,4]]},"1198":{"position":[[1221,4]]}},"keywords":{}}],["swappabl",{"_index":1335,"title":{},"content":{"207":{"position":[[227,9]]},"254":{"position":[[244,9]]},"535":{"position":[[1255,9]]},"595":{"position":[[1308,9]]},"640":{"position":[[25,10]]},"1124":{"position":[[141,9]]}},"keywords":{}}],["swift",{"_index":680,"title":{},"content":{"43":{"position":[[520,5]]},"70":{"position":[[196,5]]},"283":{"position":[[120,5]]}},"keywords":{}}],["swiftli",{"_index":928,"title":{},"content":{"65":{"position":[[1462,8]]},"569":{"position":[[709,7]]},"571":{"position":[[1469,8],[1781,7]]}},"keywords":{}}],["switch",{"_index":397,"title":{},"content":{"24":{"position":[[129,6]]},"249":{"position":[[468,6]]},"314":{"position":[[171,6]]},"330":{"position":[[120,6]]},"402":{"position":[[2077,6]]},"420":{"position":[[651,9]]},"626":{"position":[[823,6],[1004,8]]},"710":{"position":[[2232,6]]},"875":{"position":[[8866,9]]},"887":{"position":[[196,6]]},"981":{"position":[[447,9]]},"984":{"position":[[657,6]]},"988":{"position":[[996,6],[4086,6]]},"1009":{"position":[[450,6]]},"1095":{"position":[[70,6]]},"1143":{"position":[[82,6]]},"1195":{"position":[[213,6]]}},"keywords":{}}],["symbol",{"_index":2819,"title":{},"content":{"419":{"position":[[1749,7]]},"1290":{"position":[[187,6]]},"1291":{"position":[[185,6]]}},"keywords":{}}],["symmetr",{"_index":4019,"title":{},"content":{"716":{"position":[[35,9]]}},"keywords":{}}],["sync",{"_index":315,"title":{"199":{"position":[[59,4]]},"208":{"position":[[11,7]]},"209":{"position":[[13,4]]},"246":{"position":[[42,4]]},"255":{"position":[[16,4]]},"260":{"position":[[0,5]]},"307":{"position":[[58,4]]},"312":{"position":[[13,4]]},"472":{"position":[[42,4]]},"481":{"position":[[12,4]]},"565":{"position":[[8,5]]},"629":{"position":[[42,5]]},"632":{"position":[[10,4]]},"774":{"position":[[29,6]]},"869":{"position":[[63,4]]},"872":{"position":[[39,5]]},"895":{"position":[[64,4]]},"898":{"position":[[27,5]]},"900":{"position":[[35,4]]},"902":{"position":[[16,4]]},"980":{"position":[[16,4]]},"981":{"position":[[24,4]]},"982":{"position":[[4,4]]},"983":{"position":[[4,4]]},"1006":{"position":[[8,4]]},"1008":{"position":[[6,4]]},"1009":{"position":[[8,4]]},"1147":{"position":[[0,4]]},"1148":{"position":[[19,5]]},"1160":{"position":[[7,6]]},"1165":{"position":[[42,6]]}},"content":{"18":{"position":[[440,4]]},"36":{"position":[[357,4]]},"38":{"position":[[29,4]]},"39":{"position":[[131,6],[363,5],[421,4]]},"41":{"position":[[94,7]]},"42":{"position":[[88,5],[348,4]]},"46":{"position":[[214,4]]},"47":{"position":[[1033,5]]},"57":{"position":[[73,4]]},"125":{"position":[[181,4]]},"130":{"position":[[307,4]]},"182":{"position":[[308,4]]},"201":{"position":[[355,7]]},"204":{"position":[[238,4]]},"206":{"position":[[311,4]]},"208":{"position":[[22,4]]},"245":{"position":[[27,4]]},"249":{"position":[[274,8]]},"251":{"position":[[187,7]]},"255":{"position":[[40,4],[315,4]]},"261":{"position":[[16,7],[169,4],[441,4],[964,4],[1090,4]]},"262":{"position":[[114,4],[292,4]]},"263":{"position":[[84,4],[575,4]]},"275":{"position":[[293,4]]},"288":{"position":[[348,5]]},"311":{"position":[[267,7]]},"312":{"position":[[116,4]]},"318":{"position":[[116,7],[677,4]]},"323":{"position":[[610,4]]},"328":{"position":[[187,5]]},"331":{"position":[[192,4]]},"338":{"position":[[173,5]]},"360":{"position":[[409,4],[440,4],[578,4]]},"375":{"position":[[256,4],[803,7]]},"407":{"position":[[234,4],[690,6]]},"408":{"position":[[5477,4]]},"410":{"position":[[1095,4],[1515,4],[2072,4]]},"411":{"position":[[126,5],[141,4],[725,4],[2507,4],[2937,4],[4716,4],[4952,8],[5010,8],[5072,4],[5238,5]]},"412":{"position":[[983,5],[1168,8],[1273,4],[1322,4],[1996,4],[2198,5],[2957,4],[3188,5],[5821,4],[5943,6],[6852,7],[7289,4],[7453,4],[8452,6],[9117,4],[9247,4],[10950,4],[11592,4],[12335,4],[12889,4],[12961,4],[13093,4],[13521,7],[14554,4]]},"414":{"position":[[192,4]]},"415":{"position":[[185,7]]},"419":{"position":[[1135,5]]},"420":{"position":[[690,7],[1582,6]]},"421":{"position":[[817,7]]},"439":{"position":[[455,4]]},"445":{"position":[[690,5]]},"480":{"position":[[151,5]]},"481":{"position":[[13,4],[394,5],[718,6],[840,4]]},"483":{"position":[[506,7]]},"486":{"position":[[333,6]]},"487":{"position":[[129,4],[197,7]]},"489":{"position":[[795,4]]},"491":{"position":[[86,4],[166,4]]},"495":{"position":[[166,7]]},"498":{"position":[[321,8]]},"559":{"position":[[1430,4]]},"561":{"position":[[82,4]]},"562":{"position":[[1736,5],[1761,4]]},"566":{"position":[[1055,4]]},"567":{"position":[[1200,8]]},"572":{"position":[[68,4]]},"574":{"position":[[308,4]]},"575":{"position":[[365,5]]},"626":{"position":[[611,4],[799,4],[926,5],[1065,4],[1156,4]]},"631":{"position":[[378,4]]},"632":{"position":[[2007,4],[2279,5]]},"644":{"position":[[103,7]]},"661":{"position":[[1745,4]]},"696":{"position":[[457,7]]},"705":{"position":[[931,4]]},"710":{"position":[[336,4],[382,4]]},"711":{"position":[[2059,4]]},"793":{"position":[[625,4]]},"836":{"position":[[1847,7],[1942,7]]},"838":{"position":[[587,5],[614,7],[713,4]]},"839":{"position":[[408,4],[492,4],[874,5],[945,4],[1256,7]]},"841":{"position":[[425,4],[645,4],[755,4],[769,4],[817,4],[1526,4]]},"855":{"position":[[316,4]]},"857":{"position":[[542,5]]},"860":{"position":[[568,5]]},"867":{"position":[[311,4]]},"870":{"position":[[199,4]]},"872":{"position":[[2099,4],[2571,6],[3586,4]]},"875":{"position":[[8913,4]]},"896":{"position":[[77,4],[301,4]]},"898":{"position":[[4062,4]]},"902":{"position":[[243,4]]},"903":{"position":[[672,4]]},"905":{"position":[[75,4]]},"913":{"position":[[224,4]]},"981":{"position":[[77,4],[153,4],[393,4],[1381,4]]},"985":{"position":[[657,4]]},"988":{"position":[[758,4],[6059,4]]},"995":{"position":[[635,5],[1234,4],[1389,4],[1460,4],[1498,4],[1543,6],[1732,6]]},"996":{"position":[[101,4]]},"1004":{"position":[[49,4]]},"1006":{"position":[[286,4]]},"1007":{"position":[[980,5]]},"1009":{"position":[[279,4]]},"1033":{"position":[[545,6]]},"1094":{"position":[[245,4]]},"1101":{"position":[[107,4]]},"1121":{"position":[[112,4],[276,4]]},"1124":{"position":[[1901,4]]},"1147":{"position":[[27,4]]},"1148":{"position":[[201,5],[249,4]]},"1149":{"position":[[217,4],[1237,4]]},"1150":{"position":[[600,4]]},"1162":{"position":[[731,6],[868,6],[965,6],[1024,6]]},"1163":{"position":[[160,8],[372,6]]},"1165":{"position":[[12,6],[637,6],[951,6]]},"1198":{"position":[[1741,4]]},"1316":{"position":[[553,6]]},"1320":{"position":[[863,4]]}},"keywords":{}}],["sync"",{"_index":1507,"title":{},"content":{"244":{"position":[[980,10],[1108,10]]}},"keywords":{}}],["sync').pip",{"_index":5518,"title":{},"content":{"995":{"position":[[1932,12]]}},"keywords":{}}],["syncfirestor",{"_index":4331,"title":{},"content":{"749":{"position":[[15136,15]]}},"keywords":{}}],["synchron",{"_index":613,"title":{"132":{"position":[[0,13]]},"135":{"position":[[14,16]]},"147":{"position":[[5,15]]},"163":{"position":[[0,13]]},"190":{"position":[[0,13]]},"337":{"position":[[0,13]]},"340":{"position":[[14,16]]},"525":{"position":[[0,13]]},"582":{"position":[[0,13]]}},"content":{"39":{"position":[[42,15]]},"40":{"position":[[256,15]]},"47":{"position":[[868,16]]},"68":{"position":[[52,16]]},"80":{"position":[[135,16]]},"82":{"position":[[109,15]]},"89":{"position":[[320,12]]},"103":{"position":[[166,15]]},"109":{"position":[[62,15]]},"113":{"position":[[160,15]]},"121":{"position":[[148,16]]},"122":{"position":[[195,12]]},"123":{"position":[[101,11]]},"126":{"position":[[166,15]]},"132":{"position":[[155,16]]},"133":{"position":[[189,12]]},"135":{"position":[[34,16]]},"147":{"position":[[24,15],[270,15]]},"148":{"position":[[143,16]]},"151":{"position":[[228,15]]},"152":{"position":[[298,16]]},"153":{"position":[[375,15]]},"155":{"position":[[285,16]]},"157":{"position":[[192,13],[359,12]]},"158":{"position":[[126,15]]},"161":{"position":[[253,15]]},"164":{"position":[[326,13]]},"165":{"position":[[75,13],[379,15]]},"170":{"position":[[143,12],[328,15]]},"173":{"position":[[385,15]]},"174":{"position":[[411,15],[1901,11]]},"181":{"position":[[292,15]]},"183":{"position":[[201,12]]},"184":{"position":[[135,15],[285,16]]},"190":{"position":[[52,11],[141,15]]},"191":{"position":[[160,12]]},"192":{"position":[[80,15],[153,15],[365,15]]},"198":{"position":[[129,16]]},"208":{"position":[[334,16]]},"210":{"position":[[72,15]]},"211":{"position":[[526,11]]},"223":{"position":[[283,15]]},"233":{"position":[[270,12]]},"235":{"position":[[240,12]]},"237":{"position":[[55,15],[170,16]]},"238":{"position":[[246,12]]},"241":{"position":[[563,16]]},"248":{"position":[[254,12]]},"267":{"position":[[196,15],[371,12],[714,13]]},"274":{"position":[[282,15]]},"279":{"position":[[234,11],[445,15]]},"280":{"position":[[340,15]]},"289":{"position":[[104,15],[540,11],[759,15],[835,15],[1654,15]]},"293":{"position":[[218,15]]},"309":{"position":[[301,12]]},"321":{"position":[[546,15]]},"322":{"position":[[229,11]]},"323":{"position":[[273,12],[367,15]]},"325":{"position":[[87,12]]},"327":{"position":[[238,12]]},"330":{"position":[[62,12]]},"340":{"position":[[105,15]]},"365":{"position":[[1174,15],[1344,16]]},"368":{"position":[[382,16]]},"369":{"position":[[1050,13]]},"373":{"position":[[580,16]]},"375":{"position":[[547,16]]},"380":{"position":[[250,12]]},"381":{"position":[[75,15]]},"408":{"position":[[1724,11]]},"411":{"position":[[1371,15],[2240,13]]},"412":{"position":[[511,16],[533,15]]},"419":{"position":[[510,13]]},"420":{"position":[[793,16]]},"444":{"position":[[700,15],[902,16]]},"445":{"position":[[316,15],[805,16],[865,16],[1145,15]]},"446":{"position":[[284,15],[608,15]]},"447":{"position":[[151,16]]},"475":{"position":[[273,15]]},"491":{"position":[[833,16]]},"501":{"position":[[199,15]]},"502":{"position":[[125,15],[547,15]]},"504":{"position":[[530,13],[619,15],[825,15],[1032,15],[1092,12],[1356,15]]},"514":{"position":[[214,13]]},"516":{"position":[[294,12]]},"517":{"position":[[71,15],[200,15]]},"525":{"position":[[105,16],[456,15],[531,15],[715,15]]},"530":{"position":[[417,16]]},"544":{"position":[[94,11]]},"556":{"position":[[1652,13]]},"559":{"position":[[1072,12]]},"560":{"position":[[89,11]]},"565":{"position":[[45,16]]},"566":{"position":[[658,11]]},"567":{"position":[[321,16]]},"570":{"position":[[302,12]]},"574":{"position":[[782,15]]},"575":{"position":[[466,12]]},"582":{"position":[[187,11],[261,16]]},"589":{"position":[[80,12]]},"604":{"position":[[94,11]]},"630":{"position":[[468,15]]},"631":{"position":[[394,11]]},"836":{"position":[[2325,15]]},"849":{"position":[[27,15],[115,15],[585,16]]},"860":{"position":[[536,12]]},"871":{"position":[[462,15]]},"903":{"position":[[31,15]]},"1132":{"position":[[968,16]]},"1148":{"position":[[90,16]]},"1207":{"position":[[264,11],[510,11]]},"1208":{"position":[[159,13],[278,13],[509,11]]}},"keywords":{}}],["synchronization.conflict",{"_index":3701,"title":{},"content":{"632":{"position":[[443,24]]}},"keywords":{}}],["syncincrement",{"_index":4933,"title":{},"content":{"870":{"position":[[109,15]]}},"keywords":{}}],["syncliv",{"_index":5183,"title":{},"content":{"896":{"position":[[214,8]]}},"keywords":{}}],["synclocaltasks(db",{"_index":3708,"title":{},"content":{"632":{"position":[[2189,18]]}},"keywords":{}}],["synergi",{"_index":4815,"title":{},"content":{"841":{"position":[[1415,7]]}},"keywords":{}}],["syntax",{"_index":274,"title":{"1249":{"position":[[12,7]]}},"content":{"16":{"position":[[258,7]]},"19":{"position":[[305,6]]},"23":{"position":[[458,6]]},"32":{"position":[[144,6]]},"661":{"position":[[202,7]]},"686":{"position":[[279,6]]},"711":{"position":[[236,7]]},"749":{"position":[[4380,9],[4631,9]]},"836":{"position":[[204,7]]},"1041":{"position":[[48,7]]},"1065":{"position":[[364,6]]},"1071":{"position":[[60,6],[133,6]]},"1249":{"position":[[428,6]]},"1251":{"position":[[141,6]]},"1317":{"position":[[426,6]]}},"keywords":{}}],["system",{"_index":395,"title":{"433":{"position":[[5,6]]},"1205":{"position":[[20,6]]},"1215":{"position":[[24,6],[66,6]]}},"content":{"24":{"position":[[103,6]]},"40":{"position":[[681,7]]},"59":{"position":[[66,6]]},"82":{"position":[[77,8]]},"113":{"position":[[111,8]]},"131":{"position":[[423,6],[538,6]]},"134":{"position":[[18,7]]},"162":{"position":[[408,7],[426,6]]},"172":{"position":[[55,6]]},"207":{"position":[[394,7]]},"238":{"position":[[102,8],[276,6]]},"250":{"position":[[369,8]]},"267":{"position":[[308,8]]},"287":{"position":[[710,7]]},"302":{"position":[[592,6]]},"336":{"position":[[268,6]]},"339":{"position":[[224,8]]},"354":{"position":[[569,6],[950,7],[1061,7]]},"364":{"position":[[379,8]]},"369":{"position":[[233,6]]},"372":{"position":[[192,6]]},"375":{"position":[[601,7]]},"390":{"position":[[1926,7]]},"408":{"position":[[1552,6],[1584,6],[4195,7]]},"410":{"position":[[1731,6]]},"411":{"position":[[905,7],[1074,8],[1754,6]]},"412":{"position":[[813,8],[1731,6],[2573,6],[3225,7],[3275,7],[5642,6],[6439,7]]},"418":{"position":[[281,7]]},"433":{"position":[[45,6]]},"444":{"position":[[43,7]]},"453":{"position":[[25,6],[245,7]]},"454":{"position":[[998,7]]},"463":{"position":[[520,6]]},"476":{"position":[[115,6]]},"491":{"position":[[150,6]]},"495":{"position":[[641,8]]},"504":{"position":[[314,6]]},"524":{"position":[[428,6]]},"533":{"position":[[134,6]]},"546":{"position":[[121,6]]},"569":{"position":[[287,8],[346,7],[418,7],[474,7],[1377,7],[1568,7]]},"574":{"position":[[935,7]]},"581":{"position":[[274,6]]},"593":{"position":[[134,6]]},"606":{"position":[[121,6]]},"618":{"position":[[60,7],[218,7]]},"632":{"position":[[649,6]]},"635":{"position":[[518,7]]},"640":{"position":[[189,7]]},"688":{"position":[[205,7]]},"690":{"position":[[202,6]]},"703":{"position":[[199,7]]},"737":{"position":[[366,6]]},"772":{"position":[[87,7]]},"802":{"position":[[69,7],[650,6]]},"831":{"position":[[141,6],[485,6]]},"837":{"position":[[969,6]]},"908":{"position":[[134,6]]},"1094":{"position":[[644,7]]},"1132":{"position":[[411,6],[582,6]]},"1146":{"position":[[29,6]]},"1198":{"position":[[268,7]]},"1206":{"position":[[25,6]]},"1207":{"position":[[53,6]]},"1208":{"position":[[694,7]]},"1209":{"position":[[33,6]]},"1214":{"position":[[21,6]]},"1215":{"position":[[69,6],[115,6],[140,6],[206,7],[272,7],[296,6],[388,6],[428,6]]},"1216":{"position":[[18,6]]},"1244":{"position":[[41,6]]},"1297":{"position":[[343,7]]},"1313":{"position":[[119,6],[406,6],[1042,6]]},"1322":{"position":[[215,8]]}},"keywords":{}}],["system'",{"_index":3653,"title":{},"content":{"618":{"position":[[415,8]]}},"keywords":{}}],["system.then",{"_index":6566,"title":{},"content":{"1317":{"position":[[498,11]]}},"keywords":{}}],["systembrows",{"_index":6242,"title":{},"content":{"1216":{"position":[[54,13]]}},"keywords":{}}],["t",{"_index":4727,"title":{},"content":{"825":{"position":[[815,1]]}},"keywords":{}}],["t.titl",{"_index":4729,"title":{},"content":{"825":{"position":[[848,7]]}},"keywords":{}}],["tab",{"_index":281,"title":{"80":{"position":[[15,3]]},"109":{"position":[[15,3]]},"125":{"position":[[6,3]]},"160":{"position":[[6,3]]},"237":{"position":[[15,3]]},"330":{"position":[[6,3]]},"458":{"position":[[6,3]]},"475":{"position":[[9,3]]},"519":{"position":[[6,3]]},"589":{"position":[[6,3]]},"755":{"position":[[19,3]]},"779":{"position":[[6,3]]},"989":{"position":[[6,3]]},"1174":{"position":[[6,3]]},"1183":{"position":[[6,3]]},"1301":{"position":[[17,3]]}},"content":{"16":{"position":[[522,5]]},"33":{"position":[[264,3]]},"47":{"position":[[864,3],[942,4],[998,3],[1025,4]]},"53":{"position":[[147,5]]},"80":{"position":[[34,3],[111,5]]},"109":{"position":[[30,3],[111,4]]},"120":{"position":[[314,3]]},"125":{"position":[[48,3],[138,5],[197,5],[239,3]]},"160":{"position":[[19,3],[101,5],[153,3],[201,5]]},"174":{"position":[[1787,3],[1829,3],[2013,4]]},"237":{"position":[[28,3],[116,5],[238,4]]},"314":{"position":[[600,3]]},"323":{"position":[[363,3],[520,3],[585,5]]},"325":{"position":[[273,3]]},"328":{"position":[[152,4]]},"330":{"position":[[37,5],[97,5]]},"334":{"position":[[493,3]]},"340":{"position":[[147,4]]},"368":{"position":[[344,5]]},"392":{"position":[[2178,4]]},"410":{"position":[[1535,4]]},"411":{"position":[[2396,5],[3949,3],[4070,4],[4222,4],[4262,4],[4355,4],[4370,3],[4498,3],[4549,4],[4578,3]]},"427":{"position":[[1128,3],[1215,4]]},"436":{"position":[[174,3]]},"451":{"position":[[888,3]]},"458":{"position":[[145,4],[545,5],[624,4],[1134,5],[1221,4],[1520,4]]},"467":{"position":[[615,3]]},"468":{"position":[[715,4]]},"475":{"position":[[54,5],[88,4],[157,3],[234,4]]},"483":{"position":[[103,3]]},"490":{"position":[[314,3],[387,5],[408,3]]},"502":{"position":[[1134,3],[1182,3],[1244,4]]},"519":{"position":[[52,4],[128,3],[182,3],[222,5],[353,5]]},"535":{"position":[[866,3],[900,3],[989,3]]},"541":{"position":[[883,5]]},"548":{"position":[[372,3]]},"559":{"position":[[1339,4]]},"562":{"position":[[1716,4]]},"566":{"position":[[862,4],[897,4]]},"571":{"position":[[417,4]]},"575":{"position":[[495,5],[536,3],[591,4]]},"579":{"position":[[502,3]]},"589":{"position":[[29,4],[148,3]]},"595":{"position":[[941,3],[975,3],[1066,3]]},"600":{"position":[[204,5]]},"601":{"position":[[858,4]]},"608":{"position":[[370,3]]},"617":{"position":[[199,4],[247,5],[1950,4],[2033,3],[2138,5],[2163,4]]},"634":{"position":[[419,5]]},"709":{"position":[[398,3],[524,3]]},"710":{"position":[[1149,5],[2213,4]]},"723":{"position":[[828,5],[895,4],[978,5]]},"736":{"position":[[344,4]]},"737":{"position":[[118,3],[171,3],[253,4],[394,5]]},"739":{"position":[[164,3]]},"740":{"position":[[278,4]]},"742":{"position":[[43,3]]},"743":{"position":[[166,4]]},"749":{"position":[[5775,3],[8853,3]]},"755":{"position":[[97,3],[202,5]]},"779":{"position":[[84,3],[130,4],[188,5],[233,5],[327,5],[436,4]]},"785":{"position":[[612,4]]},"849":{"position":[[247,3]]},"956":{"position":[[130,4],[166,3]]},"979":{"position":[[211,5]]},"981":{"position":[[1499,3],[1556,4]]},"988":{"position":[[1175,5],[1249,5]]},"989":{"position":[[105,4],[194,3],[442,3]]},"995":{"position":[[248,3],[335,3],[384,4],[893,3],[992,3]]},"1003":{"position":[[122,3],[198,3],[264,3]]},"1030":{"position":[[88,4]]},"1088":{"position":[[269,4]]},"1115":{"position":[[656,4]]},"1117":{"position":[[561,4]]},"1120":{"position":[[316,4]]},"1174":{"position":[[89,5],[226,5],[413,5],[429,3],[461,3],[498,4],[579,3],[627,3]]},"1183":{"position":[[248,5],[409,5]]},"1301":{"position":[[121,4],[248,4],[476,5],[805,4],[1190,4],[1295,4],[1321,3],[1620,3]]},"1307":{"position":[[281,4],[303,4]]}},"keywords":{}}],["tab"",{"_index":3983,"title":{},"content":{"707":{"position":[[328,10]]}},"keywords":{}}],["tab'",{"_index":2890,"title":{},"content":{"427":{"position":[[1149,5]]}},"keywords":{}}],["tab.your",{"_index":5506,"title":{},"content":{"995":{"position":[[1041,8]]}},"keywords":{}}],["tabeasi",{"_index":6300,"title":{},"content":{"1258":{"position":[[58,9]]}},"keywords":{}}],["tabl",{"_index":1651,"title":{"394":{"position":[[42,5]]}},"content":{"279":{"position":[[344,6]]},"282":{"position":[[250,6]]},"299":{"position":[[125,5]]},"350":{"position":[[113,5]]},"351":{"position":[[17,6]]},"352":{"position":[[399,7]]},"353":{"position":[[352,5]]},"356":{"position":[[322,5]]},"360":{"position":[[204,6]]},"364":{"position":[[652,5],[733,7]]},"398":{"position":[[120,5]]},"402":{"position":[[1385,5]]},"412":{"position":[[13636,6]]},"463":{"position":[[1185,5],[1368,6]]},"500":{"position":[[403,6]]},"705":{"position":[[700,6],[1057,6]]},"711":{"position":[[1212,5],[1279,5]]},"896":{"position":[[145,6]]},"898":{"position":[[98,6],[144,6],[773,6],[823,6],[899,5],[1396,5],[1492,5],[1669,6],[3185,5]]},"1253":{"position":[[88,7]]},"1282":{"position":[[920,6],[1011,6]]},"1315":{"position":[[83,7],[189,6],[996,6],[1237,6],[1441,5]]},"1318":{"position":[[388,5],[469,5],[1007,5],[1047,7]]},"1319":{"position":[[478,6],[541,5]]},"1323":{"position":[[43,6]]}},"keywords":{}}],["table/collect",{"_index":6448,"title":{},"content":{"1295":{"position":[[154,17],[250,17]]}},"keywords":{}}],["table_a",{"_index":6545,"title":{},"content":{"1316":{"position":[[875,7],[916,7]]}},"keywords":{}}],["table_a.amountinstock",{"_index":6547,"title":{},"content":{"1316":{"position":[[930,21]]}},"keywords":{}}],["table_a.instock",{"_index":6546,"title":{},"content":{"1316":{"position":[[887,15]]}},"keywords":{}}],["tablenam",{"_index":5218,"title":{},"content":{"898":{"position":[[3342,10]]}},"keywords":{}}],["tabs"",{"_index":2633,"title":{},"content":{"411":{"position":[[4667,11]]}},"keywords":{}}],["tabs.th",{"_index":2991,"title":{},"content":{"458":{"position":[[1417,8]]}},"keywords":{}}],["tackl",{"_index":1429,"title":{},"content":{"240":{"position":[[127,7]]}},"keywords":{}}],["tactic",{"_index":1820,"title":{},"content":{"303":{"position":[[121,7]]}},"keywords":{}}],["tailor",{"_index":1150,"title":{},"content":{"147":{"position":[[297,8]]},"271":{"position":[[180,8]]},"287":{"position":[[211,6]]},"412":{"position":[[1355,8]]},"576":{"position":[[394,6]]},"1132":{"position":[[676,8]]}},"keywords":{}}],["take",{"_index":888,"title":{},"content":{"61":{"position":[[424,5]]},"114":{"position":[[652,4]]},"143":{"position":[[197,5]]},"151":{"position":[[49,4]]},"164":{"position":[[313,4]]},"284":{"position":[[193,4]]},"362":{"position":[[779,4]]},"375":{"position":[[172,6]]},"388":{"position":[[433,6]]},"391":{"position":[[324,5]]},"392":{"position":[[2509,5],[3063,5],[3138,4]]},"394":{"position":[[1621,5]]},"399":{"position":[[622,4]]},"400":{"position":[[168,5]]},"401":{"position":[[666,4]]},"404":{"position":[[888,4]]},"408":{"position":[[4592,4]]},"411":{"position":[[5790,5]]},"412":{"position":[[10629,5],[10668,4]]},"446":{"position":[[134,6]]},"463":{"position":[[587,5],[862,5],[1191,5]]},"464":{"position":[[756,4],[1202,5]]},"465":{"position":[[66,5]]},"467":{"position":[[691,5]]},"468":{"position":[[528,5]]},"567":{"position":[[66,4]]},"699":{"position":[[456,5]]},"704":{"position":[[76,5],[218,5]]},"721":{"position":[[182,4]]},"752":{"position":[[215,4],[567,5]]},"810":{"position":[[71,5]]},"824":{"position":[[533,4]]},"1150":{"position":[[497,5]]},"1192":{"position":[[487,4]]},"1246":{"position":[[189,4],[509,4]]},"1301":{"position":[[1396,5]]},"1313":{"position":[[295,6],[568,6]]},"1316":{"position":[[2131,5]]}},"keywords":{}}],["taken",{"_index":2325,"title":{},"content":{"394":{"position":[[1487,5]]},"401":{"position":[[29,5]]}},"keywords":{}}],["talk",{"_index":2507,"title":{},"content":{"404":{"position":[[736,6]]},"422":{"position":[[205,4]]},"569":{"position":[[989,4]]},"570":{"position":[[6,7]]},"1304":{"position":[[6,7]]}},"keywords":{}}],["tanstack",{"_index":4621,"title":{},"content":{"793":{"position":[[1252,8]]}},"keywords":{}}],["tap",{"_index":2135,"title":{},"content":{"373":{"position":[[411,3]]},"504":{"position":[[187,7]]}},"keywords":{}}],["target",{"_index":1216,"title":{},"content":{"174":{"position":[[1138,8]]},"1266":{"position":[[512,7]]}},"keywords":{}}],["task",{"_index":1157,"title":{},"content":{"151":{"position":[[357,4]]},"209":{"position":[[384,6],[410,5],[699,5]]},"255":{"position":[[728,6],[754,5],[1046,5]]},"364":{"position":[[836,6]]},"392":{"position":[[3740,5]]},"408":{"position":[[3706,5]]},"411":{"position":[[619,6]]},"412":{"position":[[10797,5]]},"446":{"position":[[148,4]]},"480":{"position":[[493,6],[519,6],[892,8],[941,5]]},"481":{"position":[[711,6]]},"569":{"position":[[210,5],[1385,4]]},"632":{"position":[[1478,6],[1504,5],[1846,5],[2285,7],[2445,5]]},"634":{"position":[[296,4]]},"653":{"position":[[687,5]]},"765":{"position":[[199,5]]},"801":{"position":[[673,5]]},"860":{"position":[[74,5]]},"904":{"position":[[1207,6]]},"975":{"position":[[195,5],[262,6]]},"1158":{"position":[[317,6],[343,6],[590,5]]},"1175":{"position":[[460,6]]},"1313":{"position":[[848,6]]}},"keywords":{}}],["tasks—databas",{"_index":2100,"title":{},"content":{"362":{"position":[[657,15]]}},"keywords":{}}],["tauri",{"_index":4615,"title":{"1280":{"position":[[11,5]]}},"content":{"793":{"position":[[330,6]]},"1280":{"position":[[9,5],[34,5],[117,5],[218,5],[390,7]]}},"keywords":{}}],["tauri.us",{"_index":6360,"title":{},"content":{"1280":{"position":[[163,9]]}},"keywords":{}}],["team",{"_index":2094,"title":{},"content":{"362":{"position":[[431,6]]},"384":{"position":[[378,5]]},"387":{"position":[[442,5]]},"644":{"position":[[588,6]]},"835":{"position":[[640,4]]},"1133":{"position":[[338,6]]},"1148":{"position":[[64,5]]},"1292":{"position":[[10,4]]}},"keywords":{}}],["technic",{"_index":2586,"title":{},"content":{"409":{"position":[[259,11]]},"419":{"position":[[771,9],[1265,9]]},"624":{"position":[[333,9]]},"699":{"position":[[337,9]]}},"keywords":{}}],["techniqu",{"_index":1119,"title":{"137":{"position":[[27,11]]},"166":{"position":[[27,11]]},"193":{"position":[[27,11]]},"341":{"position":[[27,11]]},"505":{"position":[[27,11]]},"526":{"position":[[27,11]]},"583":{"position":[[27,11]]}},"content":{"137":{"position":[[43,10]]},"146":{"position":[[134,10]]},"148":{"position":[[440,10]]},"169":{"position":[[107,10]]},"193":{"position":[[46,10]]},"194":{"position":[[15,9]]},"198":{"position":[[361,10]]},"376":{"position":[[604,10]]},"402":{"position":[[26,10]]},"408":{"position":[[4776,11]]},"528":{"position":[[89,9]]},"610":{"position":[[132,9]]},"624":{"position":[[1366,10]]},"643":{"position":[[50,10]]},"901":{"position":[[275,10]]},"1009":{"position":[[56,9]]},"1132":{"position":[[1095,10]]},"1295":{"position":[[15,10]]},"1298":{"position":[[366,9]]}},"keywords":{}}],["technolog",{"_index":248,"title":{"615":{"position":[[19,13]]}},"content":{"15":{"position":[[44,12]]},"38":{"position":[[657,12]]},"43":{"position":[[584,13]]},"155":{"position":[[177,13]]},"162":{"position":[[116,13]]},"269":{"position":[[63,12],[193,12]]},"367":{"position":[[629,12]]},"381":{"position":[[576,10]]},"408":{"position":[[53,13],[2646,13]]},"412":{"position":[[219,10],[1632,10]]},"422":{"position":[[51,13],[89,12]]},"435":{"position":[[94,10]]},"445":{"position":[[134,12]]},"459":{"position":[[220,12]]},"462":{"position":[[880,12]]},"463":{"position":[[637,10]]},"464":{"position":[[250,10]]},"465":{"position":[[111,10],[413,12]]},"466":{"position":[[77,10]]},"467":{"position":[[49,10]]},"469":{"position":[[532,12]]},"503":{"position":[[56,12]]},"524":{"position":[[76,11]]},"610":{"position":[[834,12]]},"611":{"position":[[129,10]]},"614":{"position":[[1030,13]]},"620":{"position":[[526,10]]},"624":{"position":[[49,13]]},"625":{"position":[[35,13]]},"627":{"position":[[91,13],[294,10]]},"840":{"position":[[39,10]]},"1320":{"position":[[469,12]]}},"keywords":{}}],["tell",{"_index":3951,"title":{},"content":{"700":{"position":[[631,4]]},"772":{"position":[[580,4]]},"781":{"position":[[362,4]]},"796":{"position":[[773,4]]},"875":{"position":[[9057,4]]},"879":{"position":[[412,4],[491,4]]},"907":{"position":[[80,5]]},"985":{"position":[[297,4]]},"987":{"position":[[275,4]]},"1002":{"position":[[173,4]]},"1176":{"position":[[215,7]]}},"keywords":{}}],["temp",{"_index":4098,"title":{},"content":{"739":{"position":[[620,4],[706,5]]}},"keywords":{}}],["temperatur",{"_index":4084,"title":{},"content":{"736":{"position":[[54,11],[236,11]]},"739":{"position":[[47,11],[433,12]]}},"keywords":{}}],["templat",{"_index":1093,"title":{},"content":{"130":{"position":[[263,9]]},"143":{"position":[[69,10]]},"493":{"position":[[144,9]]},"602":{"position":[[320,8]]},"825":{"position":[[768,9]]}},"keywords":{}}],["temporari",{"_index":1295,"title":{},"content":{"189":{"position":[[611,9]]},"287":{"position":[[931,9]]},"365":{"position":[[200,9],[393,9]]},"436":{"position":[[268,9]]},"504":{"position":[[398,9]]},"749":{"position":[[11036,9],[11179,9]]}},"keywords":{}}],["temporarili",{"_index":5655,"title":{"1033":{"position":[[10,11]]}},"content":{},"keywords":{}}],["ten",{"_index":2535,"title":{},"content":{"408":{"position":[[1025,5]]},"739":{"position":[[75,3]]}},"keywords":{}}],["tend",{"_index":1408,"title":{},"content":{"227":{"position":[[46,4]]},"412":{"position":[[8981,5]]},"435":{"position":[[253,5]]}},"keywords":{}}],["terabyt",{"_index":3935,"title":{},"content":{"696":{"position":[[609,9]]}},"keywords":{}}],["term",{"_index":676,"title":{},"content":{"43":{"position":[[460,5]]},"131":{"position":[[882,4]]},"266":{"position":[[482,4]]},"287":{"position":[[1057,4]]},"407":{"position":[[1132,4]]},"419":{"position":[[1212,4]]},"420":{"position":[[1040,4]]},"723":{"position":[[2163,4]]},"839":{"position":[[1400,4]]}},"keywords":{}}],["term.cross",{"_index":2503,"title":{},"content":{"404":{"position":[[445,10]]}},"keywords":{}}],["termin",{"_index":13,"title":{},"content":{"1":{"position":[[176,11]]},"1162":{"position":[[140,11]]},"1181":{"position":[[206,11]]}},"keywords":{}}],["terminated.al",{"_index":6127,"title":{},"content":{"1171":{"position":[[157,14]]}},"keywords":{}}],["terms.clust",{"_index":2200,"title":{},"content":{"390":{"position":[[1309,17]]}},"keywords":{}}],["terseropt",{"_index":6322,"title":{},"content":{"1266":{"position":[[1005,14]]}},"keywords":{}}],["terserplugin",{"_index":6306,"title":{},"content":{"1266":{"position":[[201,12],[990,14]]}},"keywords":{}}],["test",{"_index":20,"title":{"301":{"position":[[0,7]]},"667":{"position":[[7,6]]},"1159":{"position":[[33,7]]}},"content":{"1":{"position":[[307,4]]},"15":{"position":[[449,8]]},"29":{"position":[[311,7]]},"131":{"position":[[835,7]]},"162":{"position":[[563,7]]},"301":{"position":[[47,4],[183,4]]},"304":{"position":[[387,4]]},"314":{"position":[[34,7]]},"318":{"position":[[235,7]]},"336":{"position":[[382,5]]},"346":{"position":[[538,8],[558,4]]},"386":{"position":[[16,6]]},"392":{"position":[[904,4]]},"394":{"position":[[1591,4]]},"396":{"position":[[814,7]]},"399":{"position":[[494,6]]},"412":{"position":[[10748,7],[11810,8]]},"427":{"position":[[1299,4]]},"455":{"position":[[869,5]]},"461":{"position":[[170,4],[747,4],[1607,6]]},"462":{"position":[[212,5],[455,4],[529,5],[685,5],[812,4]]},"464":{"position":[[11,4],[1346,5]]},"524":{"position":[[554,7]]},"554":{"position":[[348,7],[614,8]]},"581":{"position":[[386,5]]},"620":{"position":[[322,5],[725,7]]},"627":{"position":[[278,4]]},"640":{"position":[[396,5]]},"662":{"position":[[1128,7]]},"666":{"position":[[265,5],[342,5],[433,5]]},"667":{"position":[[70,4],[92,5],[178,4]]},"668":{"position":[[115,4],[366,6],[384,4]]},"670":{"position":[[52,4],[357,4]]},"710":{"position":[[329,6]]},"730":{"position":[[40,6]]},"749":{"position":[[4440,8],[4475,5],[5796,6]]},"773":{"position":[[371,5]]},"798":{"position":[[233,5]]},"820":{"position":[[303,8]]},"821":{"position":[[908,4]]},"836":{"position":[[1207,7]]},"861":{"position":[[2479,8]]},"863":{"position":[[895,7]]},"898":{"position":[[2114,5]]},"966":{"position":[[255,6]]},"996":{"position":[[137,5]]},"1125":{"position":[[661,4]]},"1139":{"position":[[104,6]]},"1145":{"position":[[100,6]]},"1159":{"position":[[180,5],[195,4]]},"1195":{"position":[[200,8]]},"1209":{"position":[[181,5]]},"1216":{"position":[[87,4]]},"1222":{"position":[[724,4]]},"1266":{"position":[[743,5]]},"1271":{"position":[[311,4]]},"1292":{"position":[[134,7]]},"1294":{"position":[[1827,4]]},"1295":{"position":[[783,4]]},"1298":{"position":[[412,5]]}},"keywords":{}}],["test/unit",{"_index":3829,"title":{},"content":{"667":{"position":[[109,9]]}},"keywords":{}}],["test:node:memori",{"_index":3827,"title":{},"content":{"666":{"position":[[319,16]]}},"keywords":{}}],["testabl",{"_index":2943,"title":{},"content":{"445":{"position":[[1637,12]]}},"keywords":{}}],["testdata",{"_index":4714,"title":{},"content":{"820":{"position":[[681,9]]}},"keywords":{}}],["testdocu",{"_index":6442,"title":{},"content":{"1294":{"position":[[1611,14]]}},"keywords":{}}],["text",{"_index":631,"title":{"358":{"position":[[37,4]]}},"content":{"40":{"position":[[129,4]]},"205":{"position":[[222,4]]},"252":{"position":[[221,4]]},"259":{"position":[[169,5]]},"315":{"position":[[795,5],[906,8],[963,4]]},"356":{"position":[[367,5]]},"357":{"position":[[52,4],[185,5]]},"358":{"position":[[387,4]]},"362":{"position":[[599,4]]},"383":{"position":[[187,4],[219,4]]},"390":{"position":[[223,5],[916,5],[1703,5]]},"391":{"position":[[341,4],[805,4]]},"392":{"position":[[489,4],[670,5],[715,7],[4503,4]]},"394":{"position":[[244,5],[312,5]]},"404":{"position":[[650,4]]},"412":{"position":[[3769,4],[10456,4]]},"457":{"position":[[291,4]]},"556":{"position":[[593,4]]},"698":{"position":[[1958,4]]},"754":{"position":[[719,6]]},"898":{"position":[[199,4],[968,4],[1008,4],[1044,4]]},"1023":{"position":[[46,4]]},"1072":{"position":[[2283,4]]},"1284":{"position":[[113,4]]}},"keywords":{}}],["text/ev",{"_index":3590,"title":{},"content":{"612":{"position":[[1489,10],[1916,11]]},"875":{"position":[[7300,11]]}},"keywords":{}}],["text/plain",{"_index":3372,"title":{},"content":{"556":{"position":[[999,14],[1020,13]]},"792":{"position":[[403,12]]},"917":{"position":[[248,14],[309,12]]},"918":{"position":[[180,12]]}},"keywords":{}}],["textdecod",{"_index":6194,"title":{},"content":{"1208":{"position":[[368,11]]}},"keywords":{}}],["textdecoder().decode(readbuff",{"_index":6216,"title":{},"content":{"1208":{"position":[[1437,33]]}},"keywords":{}}],["textencod",{"_index":6193,"title":{},"content":{"1208":{"position":[[352,11]]}},"keywords":{}}],["textencoder().encod",{"_index":6218,"title":{},"content":{"1208":{"position":[[1542,26]]}},"keywords":{}}],["textencoder().encode('hello",{"_index":6208,"title":{},"content":{"1208":{"position":[[1169,27]]}},"keywords":{}}],["textual",{"_index":1824,"title":{},"content":{"303":{"position":[[257,7]]}},"keywords":{}}],["thank",{"_index":2642,"title":{},"content":{"411":{"position":[[5477,6]]},"670":{"position":[[592,5]]},"700":{"position":[[1000,5]]},"1151":{"position":[[668,5]]},"1178":{"position":[[667,5]]}},"keywords":{}}],["that'",{"_index":2426,"title":{},"content":{"398":{"position":[[3415,6]]},"402":{"position":[[338,6]]},"412":{"position":[[8459,6],[14882,6]]}},"keywords":{}}],["that’",{"_index":6096,"title":{},"content":{"1156":{"position":[[354,6]]}},"keywords":{}}],["theft",{"_index":2147,"title":{},"content":{"377":{"position":[[102,5]]}},"keywords":{}}],["them.flex",{"_index":3166,"title":{},"content":{"491":{"position":[[544,13]]}},"keywords":{}}],["themself",{"_index":2115,"title":{},"content":{"366":{"position":[[582,8]]},"1092":{"position":[[278,8]]},"1094":{"position":[[531,9]]},"1095":{"position":[[47,9]]}},"keywords":{}}],["themselv",{"_index":2605,"title":{},"content":{"410":{"position":[[1840,10]]},"698":{"position":[[2011,10]]}},"keywords":{}}],["themthen",{"_index":6567,"title":{},"content":{"1317":{"position":[[610,8]]}},"keywords":{}}],["then(data",{"_index":3556,"title":{},"content":{"610":{"position":[[997,10]]}},"keywords":{}}],["then(json",{"_index":5372,"title":{},"content":{"952":{"position":[[329,10]]},"971":{"position":[[439,10]]}},"keywords":{}}],["then(respons",{"_index":3555,"title":{},"content":{"610":{"position":[[959,14]]},"751":{"position":[[1390,14]]}},"keywords":{}}],["theoret",{"_index":2758,"title":{},"content":{"412":{"position":[[13154,13]]}},"keywords":{}}],["theori",{"_index":418,"title":{},"content":{"25":{"position":[[207,6]]},"459":{"position":[[304,6]]},"616":{"position":[[209,7]]},"617":{"position":[[1577,6]]},"696":{"position":[[251,6]]},"708":{"position":[[171,7]]}},"keywords":{}}],["there'",{"_index":762,"title":{},"content":{"51":{"position":[[135,7]]},"327":{"position":[[171,7]]},"410":{"position":[[100,7]]},"411":{"position":[[4612,7]]},"490":{"position":[[264,7]]},"714":{"position":[[426,7]]},"723":{"position":[[1779,7]]},"1072":{"position":[[861,7]]}},"keywords":{}}],["therebi",{"_index":2590,"title":{},"content":{"410":{"position":[[704,7]]},"588":{"position":[[66,7]]},"624":{"position":[[269,7]]}},"keywords":{}}],["therefor",{"_index":375,"title":{},"content":{"22":{"position":[[366,9]]},"270":{"position":[[206,10]]},"396":{"position":[[1409,9],[1707,10]]},"399":{"position":[[346,10]]},"451":{"position":[[625,9]]},"455":{"position":[[779,9]]},"458":{"position":[[168,9]]},"460":{"position":[[900,9],[1309,9]]},"464":{"position":[[1329,9]]},"468":{"position":[[112,9]]},"569":{"position":[[1414,9]]},"619":{"position":[[241,9]]},"660":{"position":[[250,9]]},"764":{"position":[[256,9]]},"811":{"position":[[67,9]]},"817":{"position":[[71,9]]},"836":{"position":[[812,9]]},"879":{"position":[[281,9]]},"887":{"position":[[99,10]]},"905":{"position":[[156,9]]},"911":{"position":[[185,9]]},"932":{"position":[[301,9]]},"985":{"position":[[533,9]]},"1032":{"position":[[223,9]]},"1067":{"position":[[747,9]]},"1072":{"position":[[409,10],[850,10]]},"1084":{"position":[[197,9]]},"1115":{"position":[[772,9]]},"1191":{"position":[[423,9]]},"1192":{"position":[[374,9]]},"1208":{"position":[[338,9]]},"1210":{"position":[[56,9]]},"1211":{"position":[[100,9]]},"1215":{"position":[[616,9]]},"1251":{"position":[[25,9]]},"1272":{"position":[[90,9]]},"1296":{"position":[[1269,9]]},"1301":{"position":[[451,9]]}},"keywords":{}}],["they'll",{"_index":2857,"title":{},"content":{"421":{"position":[[1023,7]]}},"keywords":{}}],["they'r",{"_index":3162,"title":{},"content":{"489":{"position":[[819,7]]},"1009":{"position":[[296,7]]}},"keywords":{}}],["they'v",{"_index":2856,"title":{},"content":{"421":{"position":[[955,7]]}},"keywords":{}}],["thing",{"_index":482,"title":{"633":{"position":[[0,6]]}},"content":{"29":{"position":[[351,6]]},"396":{"position":[[1253,6],[1292,7]]},"400":{"position":[[630,6]]},"404":{"position":[[81,6]]},"408":{"position":[[1249,5]]},"412":{"position":[[14779,7]]},"457":{"position":[[601,6]]},"463":{"position":[[800,7]]},"464":{"position":[[452,7]]},"465":{"position":[[313,7]]},"466":{"position":[[277,7]]},"467":{"position":[[272,7]]},"570":{"position":[[887,5]]},"623":{"position":[[382,6]]},"698":{"position":[[3004,5]]},"700":{"position":[[1055,7]]},"704":{"position":[[317,6]]},"709":{"position":[[375,5],[638,5]]},"737":{"position":[[535,6]]},"785":{"position":[[57,6],[168,6]]},"862":{"position":[[1554,6]]},"872":{"position":[[2659,6]]},"898":{"position":[[4472,6]]},"1052":{"position":[[472,6]]},"1084":{"position":[[189,7]]},"1085":{"position":[[216,5]]},"1094":{"position":[[420,6]]},"1198":{"position":[[991,6]]},"1215":{"position":[[470,6]]},"1304":{"position":[[1608,5]]},"1320":{"position":[[122,6]]}},"keywords":{}}],["think",{"_index":3448,"title":{},"content":{"569":{"position":[[77,5]]},"612":{"position":[[376,5]]},"703":{"position":[[1644,5]]},"708":{"position":[[56,5]]},"1315":{"position":[[103,5]]}},"keywords":{}}],["thinner",{"_index":2788,"title":{},"content":{"416":{"position":[[406,8]]}},"keywords":{}}],["third",{"_index":1102,"title":{"1247":{"position":[[0,5]]},"1284":{"position":[[0,5]]}},"content":{"131":{"position":[[170,5]]},"412":{"position":[[1594,5]]},"793":{"position":[[1213,5]]},"902":{"position":[[457,5]]},"1102":{"position":[[258,5]]},"1284":{"position":[[0,5]]}},"keywords":{}}],["this.amount",{"_index":1138,"title":{},"content":{"143":{"position":[[586,12]]}},"keywords":{}}],["this.dbservic",{"_index":1097,"title":{},"content":{"130":{"position":[[457,14]]},"143":{"position":[[420,14],[601,14]]}},"keywords":{}}],["this.dbservice.db.heroes.find",{"_index":817,"title":{},"content":{"54":{"position":[[125,31]]}},"keywords":{}}],["this.dbservice.db.todos.find",{"_index":4733,"title":{},"content":{"825":{"position":[[1015,34]]}},"keywords":{}}],["this.find().exec",{"_index":6509,"title":{},"content":{"1311":{"position":[[914,19]]}},"keywords":{}}],["this.firstnam",{"_index":6503,"title":{},"content":{"1311":{"position":[[722,14]]}},"keywords":{}}],["this.hero",{"_index":816,"title":{},"content":{"54":{"position":[[110,12]]},"130":{"position":[[442,12]]}},"keywords":{}}],["this.nam",{"_index":4603,"title":{},"content":{"789":{"position":[[507,10]]},"791":{"position":[[385,9]]},"1311":{"position":[[1335,9]]}},"keywords":{}}],["this.sqlite.createconnect",{"_index":3806,"title":{},"content":{"661":{"position":[[1183,29]]}},"keywords":{}}],["this.your",{"_index":1591,"title":{},"content":{"262":{"position":[[137,9]]}},"keywords":{}}],["thishttps://rxdb.info/rx",{"_index":4205,"title":{},"content":{"749":{"position":[[5456,24]]}},"keywords":{}}],["thor",{"_index":794,"title":{},"content":{"52":{"position":[[215,7],[664,6]]},"539":{"position":[[215,7],[664,6]]},"599":{"position":[[233,7],[695,6]]}},"keywords":{}}],["thordoc",{"_index":3537,"title":{},"content":{"599":{"position":[[641,7]]}},"keywords":{}}],["thordoc.remov",{"_index":3538,"title":{},"content":{"599":{"position":[[721,17]]}},"keywords":{}}],["thoroughli",{"_index":1977,"title":{},"content":{"346":{"position":[[547,10]]},"399":{"position":[[483,10]]}},"keywords":{}}],["those",{"_index":1422,"title":{},"content":{"235":{"position":[[193,5]]},"330":{"position":[[91,5]]},"408":{"position":[[4171,5]]},"412":{"position":[[711,5]]},"421":{"position":[[330,5],[1123,5]]},"432":{"position":[[940,5]]},"445":{"position":[[1090,5]]},"570":{"position":[[574,5]]},"618":{"position":[[128,5]]},"898":{"position":[[4300,5]]},"981":{"position":[[1362,5]]}},"keywords":{}}],["though",{"_index":1846,"title":{},"content":{"303":{"position":[[1065,6]]},"354":{"position":[[1624,7]]},"360":{"position":[[652,6]]},"410":{"position":[[1228,6]]},"412":{"position":[[9696,6]]},"495":{"position":[[858,7]]},"1009":{"position":[[1,6]]},"1133":{"position":[[450,7],[591,6]]},"1157":{"position":[[179,6]]}},"keywords":{}}],["thread",{"_index":2254,"title":{"642":{"position":[[30,7]]},"1211":{"position":[[23,6]]}},"content":{"392":{"position":[[3475,7],[3691,6],[3799,7]]},"408":{"position":[[3911,7]]},"427":{"position":[[311,7]]},"454":{"position":[[895,6]]},"460":{"position":[[105,7],[649,6],[889,6],[953,7],[1219,7],[1387,6]]},"463":{"position":[[691,6],[936,6]]},"464":{"position":[[339,6]]},"465":{"position":[[200,6]]},"466":{"position":[[165,6]]},"467":{"position":[[136,6],[373,6]]},"470":{"position":[[398,6]]},"559":{"position":[[1136,6]]},"642":{"position":[[176,7]]},"721":{"position":[[216,6],[408,7]]},"801":{"position":[[203,7],[424,7],[452,6],[832,9],[980,7]]},"1068":{"position":[[438,7]]},"1089":{"position":[[82,6],[118,6]]},"1157":{"position":[[263,7]]},"1207":{"position":[[398,7],[557,7]]},"1211":{"position":[[156,7],[246,7],[420,6]]},"1213":{"position":[[181,7],[314,6]]},"1230":{"position":[[377,7]]},"1231":{"position":[[327,6],[397,6]]},"1239":{"position":[[230,6],[415,6]]},"1246":{"position":[[147,6]]},"1276":{"position":[[297,6]]}},"keywords":{}}],["thread.j",{"_index":6266,"title":{},"content":{"1226":{"position":[[385,9]]},"1264":{"position":[[295,9]]}},"keywords":{}}],["thread.sqlit",{"_index":3088,"title":{},"content":{"468":{"position":[[424,13]]}},"keywords":{}}],["threador",{"_index":2963,"title":{},"content":{"453":{"position":[[318,8]]}},"keywords":{}}],["three",{"_index":3785,"title":{},"content":{"661":{"position":[[249,5]]},"780":{"position":[[474,5]]},"871":{"position":[[26,5]]},"981":{"position":[[293,5]]}},"keywords":{}}],["threw",{"_index":4340,"title":{},"content":{"749":{"position":[[15501,5],[15635,5],[15767,5]]}},"keywords":{}}],["thrive",{"_index":1681,"title":{},"content":{"289":{"position":[[1501,6]]},"353":{"position":[[245,6]]}},"keywords":{}}],["throttl",{"_index":1146,"title":{},"content":{"146":{"position":[[105,11]]},"462":{"position":[[538,8]]}},"keywords":{}}],["through",{"_index":660,"title":{},"content":{"42":{"position":[[219,7]]},"81":{"position":[[36,7]]},"174":{"position":[[230,7]]},"205":{"position":[[292,7]]},"210":{"position":[[88,7]]},"283":{"position":[[326,7]]},"298":{"position":[[99,7]]},"381":{"position":[[249,7]]},"391":{"position":[[810,7]]},"398":{"position":[[105,7]]},"408":{"position":[[3931,7],[4511,7]]},"411":{"position":[[2409,7]]},"412":{"position":[[9939,7]]},"426":{"position":[[111,7]]},"432":{"position":[[604,7]]},"498":{"position":[[172,7]]},"504":{"position":[[30,7]]},"614":{"position":[[412,7]]},"617":{"position":[[1310,7]]},"662":{"position":[[864,7]]},"703":{"position":[[744,7]]},"709":{"position":[[707,7],[1171,7]]},"723":{"position":[[853,7]]},"836":{"position":[[1599,7]]},"849":{"position":[[43,7]]},"901":{"position":[[345,7]]},"1088":{"position":[[698,7]]},"1150":{"position":[[268,7]]},"1316":{"position":[[3840,7]]}},"keywords":{}}],["throughout",{"_index":1144,"title":{},"content":{"145":{"position":[[285,10]]},"367":{"position":[[383,10]]},"632":{"position":[[2782,11]]}},"keywords":{}}],["throughput",{"_index":1608,"title":{"622":{"position":[[0,11]]}},"content":{"265":{"position":[[918,10]]},"408":{"position":[[2231,10],[3138,10]]},"620":{"position":[[156,11],[769,10]]},"622":{"position":[[29,10],[78,10],[340,10],[438,10],[592,10]]},"641":{"position":[[189,10],[306,10]]}},"keywords":{}}],["throw",{"_index":1796,"title":{"1031":{"position":[[27,6]]}},"content":{"302":{"position":[[95,5]]},"556":{"position":[[482,5]]},"719":{"position":[[160,5]]},"761":{"position":[[272,5]]},"767":{"position":[[687,5]]},"768":{"position":[[697,5]]},"769":{"position":[[658,5]]},"911":{"position":[[104,5]]},"944":{"position":[[532,5]]},"948":{"position":[[506,6]]},"966":{"position":[[193,5],[780,5]]},"1014":{"position":[[58,6]]},"1031":{"position":[[30,6],[209,7]]},"1057":{"position":[[514,5]]},"1067":{"position":[[1144,5],[1374,5]]},"1084":{"position":[[459,5]]},"1085":{"position":[[3218,6]]},"1109":{"position":[[310,5]]},"1305":{"position":[[1091,5]]},"1307":{"position":[[457,5]]}},"keywords":{}}],["throwifmiss",{"_index":4162,"title":{},"content":{"749":{"position":[[2098,14],[2222,15]]}},"keywords":{}}],["thrown",{"_index":5489,"title":{},"content":{"990":{"position":[[952,6]]},"1207":{"position":[[758,6]]}},"keywords":{}}],["thu",{"_index":1581,"title":{},"content":{"255":{"position":[[1788,4]]},"521":{"position":[[576,5]]}},"keywords":{}}],["thunder",{"_index":796,"title":{},"content":{"52":{"position":[[238,8]]},"539":{"position":[[238,8]]},"599":{"position":[[256,8]]}},"keywords":{}}],["ti",{"_index":1303,"title":{},"content":{"202":{"position":[[34,4]]},"207":{"position":[[369,4]]},"902":{"position":[[433,4]]}},"keywords":{}}],["ticker",{"_index":3678,"title":{},"content":{"624":{"position":[[575,8]]},"626":{"position":[[281,7]]}},"keywords":{}}],["tier",{"_index":4937,"title":{},"content":{"871":{"position":[[32,4]]}},"keywords":{}}],["tight",{"_index":575,"title":{},"content":{"36":{"position":[[410,5]]},"1009":{"position":[[824,5]]}},"keywords":{}}],["tighter",{"_index":1725,"title":{},"content":{"298":{"position":[[683,7]]}},"keywords":{}}],["tightli",{"_index":2660,"title":{},"content":{"412":{"position":[[917,7]]},"839":{"position":[[420,7],[976,7]]}},"keywords":{}}],["time",{"_index":301,"title":{"70":{"position":[[15,4]]},"90":{"position":[[14,4]]},"93":{"position":[[33,5]]},"101":{"position":[[15,4]]},"136":{"position":[[5,4]]},"174":{"position":[[42,4]]},"217":{"position":[[36,5]]},"227":{"position":[[15,4]]},"264":{"position":[[50,4]]},"305":{"position":[[11,4]]},"312":{"position":[[8,4]]},"379":{"position":[[5,4]]},"463":{"position":[[15,5]]},"476":{"position":[[8,4]]},"490":{"position":[[5,4]]},"570":{"position":[[5,4]]},"632":{"position":[[5,4]]},"647":{"position":[[4,4]]},"869":{"position":[[43,5]]},"895":{"position":[[44,5]]}},"content":{"17":{"position":[[550,5]]},"23":{"position":[[327,5]]},"34":{"position":[[410,4]]},"35":{"position":[[391,4]]},"39":{"position":[[32,4],[506,4]]},"40":{"position":[[91,4],[492,4]]},"42":{"position":[[83,4]]},"53":{"position":[[122,4]]},"65":{"position":[[754,4],[782,4],[1299,5],[1388,4]]},"68":{"position":[[137,4]]},"69":{"position":[[102,4]]},"77":{"position":[[97,4]]},"83":{"position":[[111,4]]},"89":{"position":[[254,4]]},"90":{"position":[[46,4],[244,4]]},"93":{"position":[[67,5]]},"99":{"position":[[234,4]]},"101":{"position":[[20,4]]},"103":{"position":[[201,4]]},"109":{"position":[[250,4]]},"114":{"position":[[550,4]]},"121":{"position":[[126,4]]},"124":{"position":[[297,5]]},"126":{"position":[[313,4]]},"136":{"position":[[20,4],[167,5],[278,4]]},"140":{"position":[[288,4]]},"148":{"position":[[332,4]]},"151":{"position":[[182,4]]},"155":{"position":[[263,4]]},"156":{"position":[[316,4]]},"158":{"position":[[158,5]]},"162":{"position":[[507,4]]},"165":{"position":[[149,4]]},"168":{"position":[[112,5],[308,4]]},"170":{"position":[[300,4]]},"173":{"position":[[166,4],[375,4],[857,4],[941,4],[1074,4],[1643,5],[1809,4]]},"174":{"position":[[96,4],[406,4],[1974,4]]},"175":{"position":[[563,4]]},"179":{"position":[[413,4]]},"184":{"position":[[275,4]]},"185":{"position":[[285,4]]},"192":{"position":[[355,4]]},"198":{"position":[[119,4]]},"203":{"position":[[384,5]]},"205":{"position":[[274,4]]},"208":{"position":[[329,4]]},"217":{"position":[[70,4]]},"220":{"position":[[214,6],[288,4]]},"227":{"position":[[97,6],[323,6]]},"244":{"position":[[259,4]]},"252":{"position":[[349,5]]},"255":{"position":[[202,5],[1860,4]]},"263":{"position":[[506,4]]},"265":{"position":[[327,4],[897,4]]},"266":{"position":[[1060,6]]},"267":{"position":[[58,4],[137,4],[191,4],[293,4],[416,5],[575,4],[746,4],[846,4],[935,4],[1046,5],[1214,4],[1447,4],[1535,4]]},"275":{"position":[[158,4]]},"281":{"position":[[424,4]]},"282":{"position":[[400,4]]},"283":{"position":[[280,6],[313,4]]},"289":{"position":[[1263,4]]},"301":{"position":[[268,4]]},"305":{"position":[[291,5]]},"312":{"position":[[212,4]]},"316":{"position":[[376,5]]},"318":{"position":[[672,4]]},"321":{"position":[[541,4]]},"322":{"position":[[219,5]]},"323":{"position":[[41,4]]},"325":{"position":[[225,4]]},"328":{"position":[[20,4]]},"330":{"position":[[156,4]]},"335":{"position":[[845,4]]},"340":{"position":[[100,4]]},"342":{"position":[[130,6]]},"352":{"position":[[135,4]]},"353":{"position":[[698,4]]},"367":{"position":[[1025,5]]},"368":{"position":[[365,4]]},"375":{"position":[[373,4]]},"378":{"position":[[166,4]]},"385":{"position":[[136,6]]},"388":{"position":[[454,4]]},"392":{"position":[[5141,4]]},"394":{"position":[[1482,4]]},"400":{"position":[[14,4],[570,4]]},"401":{"position":[[24,4],[141,4],[788,4]]},"408":{"position":[[2591,4]]},"410":{"position":[[427,4],[1624,4]]},"411":{"position":[[1662,4],[2826,5],[3379,5],[3879,4],[4818,5]]},"412":{"position":[[4938,4],[5742,6],[6489,4],[8046,4],[11391,4]]},"418":{"position":[[306,4]]},"419":{"position":[[592,5],[1111,4]]},"420":{"position":[[388,5],[1346,4]]},"421":{"position":[[143,5],[245,4],[444,4]]},"434":{"position":[[184,5]]},"435":{"position":[[275,5]]},"445":{"position":[[306,4],[795,4],[855,4],[1140,4],[2396,4]]},"446":{"position":[[432,4],[483,4],[603,4],[755,5],[1415,4]]},"447":{"position":[[141,4]]},"450":{"position":[[223,4]]},"457":{"position":[[671,5]]},"458":{"position":[[162,5]]},"462":{"position":[[130,6]]},"463":{"position":[[206,4],[552,4],[648,4]]},"464":{"position":[[261,4],[572,5]]},"465":{"position":[[122,4]]},"466":{"position":[[88,4]]},"467":{"position":[[60,4]]},"468":{"position":[[649,5],[725,6]]},"469":{"position":[[784,4],[1029,4]]},"476":{"position":[[105,4],[210,4]]},"480":{"position":[[709,4]]},"483":{"position":[[140,4],[339,4]]},"489":{"position":[[763,5]]},"490":{"position":[[698,4]]},"491":{"position":[[263,5],[828,4],[1531,4]]},"497":{"position":[[18,4]]},"498":{"position":[[316,4]]},"500":{"position":[[547,6]]},"501":{"position":[[189,4]]},"502":{"position":[[115,4],[796,5],[1030,4]]},"504":{"position":[[1140,4]]},"509":{"position":[[80,5]]},"517":{"position":[[195,4]]},"518":{"position":[[497,4]]},"529":{"position":[[140,4]]},"530":{"position":[[412,4]]},"540":{"position":[[69,4]]},"566":{"position":[[404,4]]},"567":{"position":[[116,4]]},"569":{"position":[[91,4],[118,4],[200,5],[413,4],[469,4],[519,4],[646,4],[924,4],[1405,4],[1477,6]]},"571":{"position":[[1068,4],[1844,5]]},"574":{"position":[[275,4]]},"575":{"position":[[234,4]]},"582":{"position":[[256,4]]},"585":{"position":[[127,4]]},"589":{"position":[[122,5]]},"595":{"position":[[855,5]]},"600":{"position":[[69,4]]},"610":{"position":[[829,4]]},"611":{"position":[[258,4]]},"612":{"position":[[326,4],[577,4],[1664,7],[2264,5]]},"613":{"position":[[450,4]]},"614":{"position":[[18,4],[99,4]]},"617":{"position":[[868,5]]},"620":{"position":[[341,5]]},"621":{"position":[[129,4],[504,4]]},"626":{"position":[[238,4]]},"631":{"position":[[79,4]]},"636":{"position":[[6,5]]},"647":{"position":[[71,6],[194,4]]},"653":{"position":[[362,4]]},"654":{"position":[[270,5]]},"656":{"position":[[454,6]]},"660":{"position":[[214,4]]},"670":{"position":[[213,4]]},"679":{"position":[[190,5]]},"681":{"position":[[488,4]]},"691":{"position":[[87,5]]},"698":{"position":[[1088,4]]},"699":{"position":[[606,6],[998,4]]},"700":{"position":[[516,4]]},"702":{"position":[[742,5]]},"709":{"position":[[249,5]]},"723":{"position":[[990,4],[1073,4],[1173,5],[1574,5]]},"736":{"position":[[402,5]]},"739":{"position":[[712,5]]},"740":{"position":[[187,5]]},"746":{"position":[[499,7],[549,6]]},"749":{"position":[[21250,5]]},"752":{"position":[[227,5]]},"759":{"position":[[1070,4]]},"772":{"position":[[109,4]]},"776":{"position":[[380,4]]},"778":{"position":[[434,4]]},"780":{"position":[[85,4]]},"781":{"position":[[158,4]]},"783":{"position":[[48,5],[137,4],[444,4],[511,5],[596,4]]},"785":{"position":[[87,5]]},"796":{"position":[[401,4],[455,5],[481,5],[531,5],[1117,4]]},"799":{"position":[[256,4]]},"800":{"position":[[540,4],[709,4]]},"802":{"position":[[539,4],[794,5],[893,4]]},"806":{"position":[[329,4]]},"816":{"position":[[434,4]]},"820":{"position":[[401,4]]},"821":{"position":[[17,4],[101,5],[192,5],[223,4],[975,4]]},"826":{"position":[[581,4],[789,4],[887,4]]},"836":{"position":[[1474,4],[2308,4]]},"837":{"position":[[392,4],[537,5]]},"838":{"position":[[446,4]]},"839":{"position":[[213,5]]},"841":{"position":[[663,4],[975,4],[1536,4]]},"846":{"position":[[369,4],[887,4]]},"848":{"position":[[926,5]]},"854":{"position":[[1036,4],[1429,4]]},"860":{"position":[[145,4],[563,4],[595,4]]},"898":{"position":[[559,5],[1174,4]]},"901":{"position":[[28,4]]},"902":{"position":[[125,5]]},"903":{"position":[[21,4]]},"904":{"position":[[1069,5]]},"905":{"position":[[70,4]]},"906":{"position":[[391,5]]},"921":{"position":[[93,4]]},"944":{"position":[[118,6]]},"958":{"position":[[241,4],[449,4]]},"964":{"position":[[549,4]]},"975":{"position":[[482,4]]},"981":{"position":[[1648,5]]},"985":{"position":[[596,4]]},"986":{"position":[[113,4],[190,5]]},"987":{"position":[[76,4],[890,5]]},"988":{"position":[[866,4],[951,4],[3304,5],[4633,5]]},"990":{"position":[[105,5]]},"994":{"position":[[151,5]]},"995":{"position":[[1239,4],[1475,4],[1552,5],[1741,5]]},"996":{"position":[[481,4]]},"1002":{"position":[[67,4]]},"1008":{"position":[[159,4]]},"1010":{"position":[[151,5]]},"1030":{"position":[[46,5]]},"1039":{"position":[[115,4]]},"1069":{"position":[[114,5]]},"1085":{"position":[[247,4],[590,4],[906,5],[2580,5]]},"1087":{"position":[[205,4]]},"1114":{"position":[[351,5]]},"1115":{"position":[[631,5]]},"1119":{"position":[[100,4]]},"1124":{"position":[[1453,4]]},"1132":{"position":[[951,4]]},"1135":{"position":[[143,5]]},"1138":{"position":[[470,4]]},"1150":{"position":[[150,5]]},"1161":{"position":[[225,4]]},"1162":{"position":[[600,4]]},"1170":{"position":[[98,4],[253,4]]},"1171":{"position":[[222,4],[334,4]]},"1180":{"position":[[225,4]]},"1181":{"position":[[688,4]]},"1188":{"position":[[428,5]]},"1194":{"position":[[43,4],[125,4],[210,4]]},"1198":{"position":[[658,5],[2015,5]]},"1209":{"position":[[204,5]]},"1238":{"position":[[436,5]]},"1246":{"position":[[1819,5]]},"1251":{"position":[[342,4],[362,5]]},"1292":{"position":[[288,4],[642,4]]},"1295":{"position":[[1020,4]]},"1299":{"position":[[267,4]]},"1300":{"position":[[91,5],[546,5],[695,4],[946,4]]},"1301":{"position":[[138,5],[1407,4],[1554,5]]},"1304":{"position":[[1192,5]]},"1305":{"position":[[114,5]]},"1309":{"position":[[213,5],[277,4],[862,4]]},"1313":{"position":[[822,4]]},"1316":{"position":[[659,4],[1054,4],[2704,4],[2815,4],[3188,4]]},"1319":{"position":[[717,4]]},"1320":{"position":[[923,4]]},"1322":{"position":[[135,4]]},"1324":{"position":[[348,5]]}},"keywords":{}}],["time"",{"_index":5889,"title":{},"content":{"1085":{"position":[[459,10]]}},"keywords":{}}],["time)flex",{"_index":3117,"title":{},"content":{"479":{"position":[[187,13]]}},"keywords":{}}],["time.cli",{"_index":6541,"title":{},"content":{"1316":{"position":[[498,12]]}},"keywords":{}}],["time.th",{"_index":6543,"title":{},"content":{"1316":{"position":[[604,8]]}},"keywords":{}}],["time.to",{"_index":3836,"title":{},"content":{"668":{"position":[[329,7]]}},"keywords":{}}],["timeout",{"_index":456,"title":{},"content":{"28":{"position":[[313,7]]},"610":{"position":[[1216,7]]},"975":{"position":[[436,7],[590,7]]}},"keywords":{}}],["times.dur",{"_index":6561,"title":{},"content":{"1316":{"position":[[2943,12]]}},"keywords":{}}],["times.lack",{"_index":2885,"title":{},"content":{"427":{"position":[[860,10]]}},"keywords":{}}],["times.offlin",{"_index":3693,"title":{},"content":{"630":{"position":[[636,13]]}},"keywords":{}}],["timespan",{"_index":5347,"title":{},"content":{"948":{"position":[[76,9]]},"1194":{"position":[[250,8]]}},"keywords":{}}],["timestamp",{"_index":1889,"title":{},"content":{"314":{"position":[[848,10]]},"367":{"position":[[982,10],[1069,12]]},"495":{"position":[[617,9]]},"496":{"position":[[239,10]]},"639":{"position":[[510,10]]},"688":{"position":[[609,11]]},"854":{"position":[[1218,9]]},"875":{"position":[[1650,9]]},"898":{"position":[[311,9],[1159,9],[1239,9]]},"986":{"position":[[887,9]]},"988":{"position":[[2216,9]]},"990":{"position":[[532,10]]},"991":{"position":[[143,9]]},"1048":{"position":[[174,10],[233,9]]},"1085":{"position":[[3700,9]]},"1104":{"position":[[540,9]]},"1284":{"position":[[302,11]]},"1316":{"position":[[1830,9],[2077,10],[2213,9],[2297,10]]}},"keywords":{}}],["timeui",{"_index":1968,"title":{},"content":{"344":{"position":[[112,6]]}},"keywords":{}}],["tini",{"_index":2526,"title":{},"content":{"408":{"position":[[358,4]]}},"keywords":{}}],["tip",{"_index":1875,"title":{"794":{"position":[[12,4]]}},"content":{"306":{"position":[[298,4]]},"793":{"position":[[1316,4]]}},"keywords":{}}],["titl",{"_index":767,"title":{},"content":{"51":{"position":[[276,6]]},"209":{"position":[[403,6],[525,6]]},"211":{"position":[[364,6]]},"255":{"position":[[747,6],[869,6]]},"259":{"position":[[46,6]]},"314":{"position":[[712,6]]},"315":{"position":[[687,6]]},"316":{"position":[[154,6]]},"334":{"position":[[599,6]]},"480":{"position":[[512,6],[619,6]]},"482":{"position":[[805,6]]},"538":{"position":[[577,6]]},"554":{"position":[[1297,6]]},"562":{"position":[[285,6]]},"564":{"position":[[740,6]]},"579":{"position":[[607,6]]},"598":{"position":[[584,6]]},"632":{"position":[[1497,6],[1619,6]]},"638":{"position":[[578,6]]},"639":{"position":[[338,6]]},"808":{"position":[[137,6]]},"862":{"position":[[631,6]]},"904":{"position":[[836,6],[958,6],[1097,8],[1190,6]]},"1078":{"position":[[211,6]]},"1080":{"position":[[41,6]]},"1158":{"position":[[336,6],[443,6],[516,8],[601,6]]},"1311":{"position":[[294,6]]}},"keywords":{}}],["today",{"_index":2532,"title":{},"content":{"408":{"position":[[850,6],[4619,6]]},"498":{"position":[[685,5]]},"702":{"position":[[879,5]]},"783":{"position":[[191,5]]}},"keywords":{}}],["today'",{"_index":1624,"title":{},"content":{"267":{"position":[[1666,7]]},"289":{"position":[[1511,7]]},"410":{"position":[[1478,7]]}},"keywords":{}}],["todo",{"_index":3987,"title":{},"content":{"709":{"position":[[309,4]]},"825":{"position":[[712,5]]},"904":{"position":[[93,4],[118,4],[817,6],[843,5],[1180,5]]}},"keywords":{}}],["todoslistcompon",{"_index":4730,"title":{},"content":{"825":{"position":[[901,18]]}},"keywords":{}}],["todossign",{"_index":4732,"title":{},"content":{"825":{"position":[[1001,11]]}},"keywords":{}}],["todossignal();"",{"_index":4728,"title":{},"content":{"825":{"position":[[820,20]]}},"keywords":{}}],["togeth",{"_index":368,"title":{},"content":{"22":{"position":[[123,8]]},"188":{"position":[[302,8]]},"404":{"position":[[634,8],[869,8]]},"661":{"position":[[1430,8]]},"668":{"position":[[94,8]]},"685":{"position":[[248,8]]},"701":{"position":[[783,8]]},"711":{"position":[[1927,8]]},"754":{"position":[[30,8]]},"761":{"position":[[124,8]]},"772":{"position":[[1907,8]]},"829":{"position":[[3198,8]]},"1058":{"position":[[108,8]]},"1130":{"position":[[342,8]]},"1238":{"position":[[167,8]]},"1243":{"position":[[104,8]]},"1270":{"position":[[516,8]]},"1305":{"position":[[498,8]]}},"keywords":{}}],["toggl",{"_index":5513,"title":{},"content":{"995":{"position":[[1791,6]]}},"keywords":{}}],["toggleondocumentvis",{"_index":5543,"title":{"1003":{"position":[[0,24]]}},"content":{"1003":{"position":[[409,24]]}},"keywords":{}}],["tojson",{"_index":5614,"title":{"1051":{"position":[[0,9]]}},"content":{"1018":{"position":[[713,8]]},"1052":{"position":[[9,8]]},"1085":{"position":[[1974,8]]}},"keywords":{}}],["token",{"_index":3339,"title":{},"content":{"551":{"position":[[255,6]]},"639":{"position":[[159,7]]},"848":{"position":[[54,5],[446,5],[907,5]]},"1104":{"position":[[739,5]]},"1305":{"position":[[702,6]]}},"keywords":{}}],["token?"",{"_index":1539,"title":{},"content":{"245":{"position":[[164,12]]}},"keywords":{}}],["tokyo",{"_index":6530,"title":{},"content":{"1315":{"position":[[328,6],[416,7]]}},"keywords":{}}],["toler",{"_index":2709,"title":{},"content":{"412":{"position":[[6347,8]]},"421":{"position":[[914,8]]},"569":{"position":[[486,8]]},"1247":{"position":[[707,8]]}},"keywords":{}}],["tomutablejson",{"_index":5720,"title":{"1052":{"position":[[0,16]]}},"content":{"1051":{"position":[[132,15]]}},"keywords":{}}],["took",{"_index":2965,"title":{},"content":{"453":{"position":[[856,4]]}},"keywords":{}}],["tool",{"_index":304,"title":{},"content":{"18":{"position":[[34,5]]},"22":{"position":[[112,5]]},"37":{"position":[[134,5]]},"38":{"position":[[181,6]]},"65":{"position":[[1990,5]]},"116":{"position":[[228,5]]},"143":{"position":[[36,4]]},"151":{"position":[[349,5]]},"159":{"position":[[71,5]]},"177":{"position":[[254,5]]},"232":{"position":[[213,8]]},"254":{"position":[[201,4]]},"267":{"position":[[921,4]]},"286":{"position":[[235,5]]},"301":{"position":[[439,5],[681,5]]},"346":{"position":[[667,5]]},"362":{"position":[[726,5]]},"364":{"position":[[369,5]]},"375":{"position":[[504,5],[634,5]]},"380":{"position":[[356,6]]},"382":{"position":[[309,5]]},"408":{"position":[[4277,8],[4383,7]]},"411":{"position":[[2587,6]]},"412":{"position":[[1831,5],[2754,5],[2912,5],[13240,7],[14471,5],[14808,5],[15217,5]]},"418":{"position":[[151,5]]},"419":{"position":[[111,5],[1036,5]]},"420":{"position":[[227,5],[511,6],[922,7],[1406,5]]},"441":{"position":[[75,4]]},"445":{"position":[[1878,5]]},"446":{"position":[[556,6],[981,5]]},"494":{"position":[[63,6]]},"510":{"position":[[512,4]]},"548":{"position":[[450,4]]},"576":{"position":[[151,5]]},"608":{"position":[[448,4]]},"613":{"position":[[376,4]]},"696":{"position":[[555,4]]},"821":{"position":[[22,5]]},"836":{"position":[[1988,5]]},"1102":{"position":[[94,5],[270,6]]},"1216":{"position":[[92,4]]},"1251":{"position":[[59,7]]},"1282":{"position":[[977,5]]}},"keywords":{}}],["toolkit",{"_index":1153,"title":{},"content":{"148":{"position":[[507,8]]},"318":{"position":[[575,7]]},"388":{"position":[[304,7]]}},"keywords":{}}],["top",{"_index":234,"title":{"1122":{"position":[[17,3]]},"1131":{"position":[[17,3]]},"1299":{"position":[[13,3]]}},"content":{"14":{"position":[[1007,3]]},"29":{"position":[[255,3]]},"120":{"position":[[100,3]]},"131":{"position":[[407,3]]},"155":{"position":[[143,3]]},"161":{"position":[[164,3]]},"162":{"position":[[186,3]]},"181":{"position":[[41,3]]},"318":{"position":[[492,3]]},"322":{"position":[[48,3]]},"353":{"position":[[459,3]]},"387":{"position":[[62,3]]},"394":{"position":[[1293,4]]},"412":{"position":[[1904,3],[2708,3]]},"433":{"position":[[516,3]]},"445":{"position":[[115,3]]},"459":{"position":[[336,3]]},"507":{"position":[[31,3]]},"513":{"position":[[135,3]]},"524":{"position":[[244,3]]},"548":{"position":[[176,3]]},"555":{"position":[[361,3],[598,3]]},"608":{"position":[[176,3]]},"611":{"position":[[1307,3]]},"613":{"position":[[1041,3]]},"625":{"position":[[102,3]]},"703":{"position":[[541,3]]},"705":{"position":[[1153,3],[1356,3]]},"724":{"position":[[375,3]]},"742":{"position":[[77,3]]},"749":{"position":[[2479,3],[17347,3],[17463,3],[18332,3],[21813,3]]},"772":{"position":[[365,3]]},"776":{"position":[[397,3]]},"872":{"position":[[3013,3]]},"875":{"position":[[189,3]]},"898":{"position":[[1753,3]]},"962":{"position":[[15,3]]},"1020":{"position":[[26,3]]},"1084":{"position":[[584,3]]},"1085":{"position":[[858,3],[965,3],[1677,3],[1746,3],[1787,3],[1997,3],[2030,3],[2226,3],[2418,3]]},"1090":{"position":[[286,3]]},"1095":{"position":[[180,3]]},"1100":{"position":[[4,3]]},"1108":{"position":[[603,3]]},"1114":{"position":[[34,3]]},"1117":{"position":[[238,3]]},"1123":{"position":[[674,3],[768,3]]},"1124":{"position":[[534,3],[997,3]]},"1125":{"position":[[770,3]]},"1132":{"position":[[15,3]]},"1165":{"position":[[170,3]]},"1237":{"position":[[289,3]]},"1316":{"position":[[1780,3]]},"1320":{"position":[[643,3],[707,3],[731,3],[766,3]]}},"keywords":{}}],["topic",{"_index":1365,"title":{},"content":{"210":{"position":[[310,6],[322,5],[662,5]]},"261":{"position":[[383,6],[430,5],[1070,5]]},"390":{"position":[[723,6]]},"422":{"position":[[20,5]]},"461":{"position":[[1480,6]]},"567":{"position":[[55,6]]},"904":{"position":[[1543,5],[1908,5],[1963,5],[2049,5],[2099,5],[2250,6]]},"1121":{"position":[[653,6]]},"1324":{"position":[[1085,5]]}},"keywords":{}}],["topic.inc&switch",{"_index":2863,"title":{},"content":{"422":{"position":[[249,21]]}},"keywords":{}}],["tosign",{"_index":830,"title":{},"content":{"55":{"position":[[166,9],[304,8]]},"1118":{"position":[[424,8]]}},"keywords":{}}],["tosignal(ob",{"_index":6004,"title":{},"content":{"1118":{"position":[[584,13]]}},"keywords":{}}],["tosignal(observ",{"_index":841,"title":{},"content":{"55":{"position":[[537,21]]}},"keywords":{}}],["total",{"_index":1710,"title":{},"content":{"298":{"position":[[237,5]]},"300":{"position":[[178,5],[350,5]]},"411":{"position":[[328,5]]},"461":{"position":[[1194,5]]},"696":{"position":[[1335,5],[1986,5]]},"711":{"position":[[2380,7]]},"752":{"position":[[1179,6]]}},"keywords":{}}],["totalspac",{"_index":1772,"title":{},"content":{"300":{"position":[[273,10],[375,12]]}},"keywords":{}}],["touch",{"_index":2129,"title":{},"content":{"369":{"position":[[1459,8]]},"698":{"position":[[2364,8]]}},"keywords":{}}],["toward",{"_index":5277,"title":{},"content":{"912":{"position":[[104,7]]}},"keywords":{}}],["trace",{"_index":3900,"title":{},"content":{"689":{"position":[[393,5]]}},"keywords":{}}],["track",{"_index":972,"title":{"676":{"position":[[12,8]]}},"content":{"75":{"position":[[104,8]]},"106":{"position":[[113,8]]},"129":{"position":[[368,6]]},"174":{"position":[[1088,8]]},"235":{"position":[[66,5]]},"250":{"position":[[249,5]]},"301":{"position":[[311,5]]},"412":{"position":[[2088,8]]},"450":{"position":[[163,9]]},"496":{"position":[[253,5]]},"635":{"position":[[115,6]]},"676":{"position":[[74,8],[118,5]]},"975":{"position":[[110,6]]},"1304":{"position":[[504,5]]}},"keywords":{}}],["traction",{"_index":2522,"title":{"408":{"position":[[27,9]]}},"content":{},"keywords":{}}],["trade",{"_index":2421,"title":{},"content":{"398":{"position":[[3133,5]]},"401":{"position":[[821,5]]},"412":{"position":[[110,5],[3955,5]]},"611":{"position":[[331,7]]},"689":{"position":[[81,5]]},"699":{"position":[[662,7]]},"1162":{"position":[[1148,5]]},"1324":{"position":[[790,5]]}},"keywords":{}}],["tradeoff",{"_index":2389,"title":{"1248":{"position":[[5,9]]}},"content":{"398":{"position":[[195,9]]},"962":{"position":[[267,9]]},"1067":{"position":[[1057,8]]}},"keywords":{}}],["tradit",{"_index":991,"title":{"355":{"position":[[16,11]]},"413":{"position":[[16,11]]}},"content":{"83":{"position":[[286,11]]},"96":{"position":[[81,11]]},"126":{"position":[[203,11]]},"173":{"position":[[284,11]]},"210":{"position":[[729,11]]},"219":{"position":[[46,11]]},"224":{"position":[[59,11]]},"239":{"position":[[196,11]]},"265":{"position":[[255,11],[592,11],[618,11]]},"276":{"position":[[123,11]]},"278":{"position":[[137,11]]},"281":{"position":[[351,11]]},"290":{"position":[[112,11]]},"351":{"position":[[1,11]]},"390":{"position":[[302,11]]},"395":{"position":[[149,11]]},"410":{"position":[[2244,11]]},"411":{"position":[[1062,11]]},"420":{"position":[[499,11],[599,11]]},"477":{"position":[[6,11]]},"515":{"position":[[76,11]]},"520":{"position":[[164,11]]},"567":{"position":[[1009,11]]},"576":{"position":[[13,11]]},"602":{"position":[[193,11]]},"610":{"position":[[211,11]]},"611":{"position":[[402,11]]},"624":{"position":[[243,11]]},"630":{"position":[[6,11]]}},"keywords":{}}],["tradition",{"_index":5249,"title":{},"content":{"903":{"position":[[1,14]]}},"keywords":{}}],["traffic",{"_index":3109,"title":{},"content":{"477":{"position":[[112,7]]},"610":{"position":[[710,7]]},"627":{"position":[[136,7]]},"902":{"position":[[917,7]]}},"keywords":{}}],["train",{"_index":2196,"title":{},"content":{"390":{"position":[[1042,5]]},"391":{"position":[[824,7]]}},"keywords":{}}],["trait",{"_index":1929,"title":{},"content":{"327":{"position":[[30,6]]}},"keywords":{}}],["transact",{"_index":501,"title":{"1258":{"position":[[7,13]]},"1298":{"position":[[9,11]]},"1303":{"position":[[0,13]]},"1304":{"position":[[23,13]]},"1313":{"position":[[0,12]]},"1314":{"position":[[0,12]]}},"content":{"31":{"position":[[302,12]]},"33":{"position":[[146,12]]},"45":{"position":[[219,12]]},"353":{"position":[[125,11]]},"354":{"position":[[1196,11],[1262,11]]},"358":{"position":[[976,13]]},"376":{"position":[[392,11]]},"412":{"position":[[13607,12]]},"459":{"position":[[623,11]]},"497":{"position":[[291,12],[410,12]]},"506":{"position":[[208,13]]},"533":{"position":[[111,13]]},"593":{"position":[[111,13]]},"700":{"position":[[984,12]]},"703":{"position":[[990,12],[1359,12]]},"705":{"position":[[1072,11]]},"793":{"position":[[909,12]]},"802":{"position":[[754,12]]},"863":{"position":[[494,12]]},"875":{"position":[[5670,13],[5753,11]]},"1044":{"position":[[145,13]]},"1072":{"position":[[1313,13]]},"1093":{"position":[[542,12]]},"1258":{"position":[[119,13]]},"1297":{"position":[[87,12],[115,11],[234,11],[535,12],[577,11]]},"1298":{"position":[[28,12],[150,12]]},"1299":{"position":[[12,11],[361,12]]},"1304":{"position":[[20,13],[47,12],[156,11],[307,11],[333,11],[446,12],[528,12],[565,12],[678,11],[807,11],[928,11],[1214,12],[1673,13]]},"1305":{"position":[[17,12]]},"1313":{"position":[[21,12],[148,12],[329,11],[703,11],[785,11]]},"1314":{"position":[[196,12],[267,11]]},"1315":{"position":[[1192,12]]},"1316":{"position":[[3751,12],[3783,12]]},"1324":{"position":[[862,13],[984,12]]}},"keywords":{}}],["transaction.commit",{"_index":6464,"title":{},"content":{"1298":{"position":[[295,20],[318,20]]}},"keywords":{}}],["transaction.objectstore('product",{"_index":2997,"title":{},"content":{"459":{"position":[[697,36]]}},"keywords":{}}],["transaction.y",{"_index":6575,"title":{},"content":{"1323":{"position":[[66,15],[144,15]]}},"keywords":{}}],["transaction_set",{"_index":6429,"title":{},"content":{"1294":{"position":[[868,22]]}},"keywords":{}}],["transfer",{"_index":579,"title":{"983":{"position":[[23,8]]}},"content":{"37":{"position":[[40,8]]},"236":{"position":[[268,8]]},"283":{"position":[[251,8]]},"408":{"position":[[2264,8],[2920,12],[3076,11],[3384,8]]},"411":{"position":[[66,8]]},"412":{"position":[[6194,8],[6279,8]]},"611":{"position":[[268,8]]},"613":{"position":[[185,8]]},"700":{"position":[[797,8]]},"780":{"position":[[393,8]]},"782":{"position":[[366,11]]},"981":{"position":[[890,8]]},"983":{"position":[[26,12]]},"1213":{"position":[[132,12]]},"1214":{"position":[[390,8]]}},"keywords":{}}],["transform",{"_index":1183,"title":{"887":{"position":[[0,12]]}},"content":{"162":{"position":[[388,14]]},"212":{"position":[[304,15]]},"252":{"position":[[251,15]]},"303":{"position":[[480,9]]},"350":{"position":[[344,15]]},"360":{"position":[[145,15]]},"361":{"position":[[488,9]]},"390":{"position":[[969,11],[1112,11]]},"391":{"position":[[350,10]]},"392":{"position":[[846,11]]},"401":{"position":[[110,12]]},"408":{"position":[[5390,15]]},"451":{"position":[[461,12]]},"457":{"position":[[489,9]]},"459":{"position":[[1135,9]]},"483":{"position":[[361,10]]},"501":{"position":[[278,14]]},"561":{"position":[[108,9]]},"602":{"position":[[38,10]]},"630":{"position":[[951,10]]},"636":{"position":[[242,9]]},"724":{"position":[[763,10],[926,12]]},"749":{"position":[[12102,10]]},"751":{"position":[[357,11],[570,10],[981,10],[1672,10]]},"887":{"position":[[167,9]]},"986":{"position":[[608,9]]},"1071":{"position":[[256,9]]},"1085":{"position":[[512,9]]},"1208":{"position":[[1278,9]]},"1319":{"position":[[314,10]]}},"keywords":{}}],["transformations.transact",{"_index":2028,"title":{},"content":{"354":{"position":[[1117,27]]}},"keywords":{}}],["transformers.j",{"_index":2180,"title":{"389":{"position":[[36,15]]}},"content":{"391":{"position":[[134,15]]}},"keywords":{}}],["transient",{"_index":2905,"title":{},"content":{"430":{"position":[[1134,9]]}},"keywords":{}}],["transit",{"_index":1211,"title":{},"content":{"173":{"position":[[2827,10]]},"262":{"position":[[508,10]]},"367":{"position":[[345,11]]},"445":{"position":[[1916,10]]},"502":{"position":[[1310,10]]},"556":{"position":[[1721,8]]}},"keywords":{}}],["translat",{"_index":1316,"title":{},"content":{"204":{"position":[[73,9]]},"828":{"position":[[261,9]]}},"keywords":{}}],["transmiss",{"_index":1048,"title":{},"content":{"108":{"position":[[124,14]]},"621":{"position":[[456,13]]},"624":{"position":[[1263,13]]},"990":{"position":[[352,14]]},"1132":{"position":[[1149,12]]}},"keywords":{}}],["transpar",{"_index":1122,"title":{},"content":{"139":{"position":[[173,13]]},"714":{"position":[[287,11]]},"1151":{"position":[[15,11]]},"1178":{"position":[[15,11]]}},"keywords":{}}],["transpil",{"_index":4067,"title":{},"content":{"728":{"position":[[28,10]]},"1322":{"position":[[60,10]]}},"keywords":{}}],["transport",{"_index":1905,"title":{},"content":{"316":{"position":[[538,9]]},"491":{"position":[[558,10]]}},"keywords":{}}],["travel",{"_index":5238,"title":{},"content":{"902":{"position":[[58,7]]}},"keywords":{}}],["travers",{"_index":5236,"title":{},"content":{"901":{"position":[[265,9]]}},"keywords":{}}],["treat",{"_index":497,"title":{},"content":{"31":{"position":[[140,6]]},"419":{"position":[[340,5]]},"861":{"position":[[2091,5]]}},"keywords":{}}],["treatment",{"_index":6057,"title":{},"content":{"1140":{"position":[[242,9]]}},"keywords":{}}],["tree",{"_index":218,"title":{},"content":{"14":{"position":[[528,4]]},"24":{"position":[[434,4],[766,4]]},"411":{"position":[[3535,5]]},"571":{"position":[[809,4]]},"1092":{"position":[[88,4],[634,4]]},"1093":{"position":[[52,4]]},"1198":{"position":[[507,5]]}},"keywords":{}}],["trend",{"_index":2827,"title":{"420":{"position":[[51,7]]}},"content":{},"keywords":{}}],["tri",{"_index":1697,"title":{"742":{"position":[[0,3]]},"798":{"position":[[0,3]]}},"content":{"296":{"position":[[1,3]]},"302":{"position":[[158,6],[679,3]]},"354":{"position":[[1365,5]]},"358":{"position":[[269,3]]},"388":{"position":[[50,3]]},"393":{"position":[[694,3]]},"402":{"position":[[1837,3]]},"440":{"position":[[250,6]]},"461":{"position":[[1369,5]]},"535":{"position":[[646,6]]},"595":{"position":[[673,6]]},"666":{"position":[[295,3]]},"710":{"position":[[906,3]]},"712":{"position":[[192,3]]},"749":{"position":[[16735,5]]},"798":{"position":[[120,3]]},"816":{"position":[[207,5]]},"836":{"position":[[1047,3]]},"838":{"position":[[1564,3]]},"873":{"position":[[1,3]]},"879":{"position":[[307,5]]},"904":{"position":[[247,3]]},"948":{"position":[[142,5]]},"1007":{"position":[[238,5]]},"1031":{"position":[[146,3]]},"1271":{"position":[[179,3]]}},"keywords":{}}],["trial",{"_index":4426,"title":{},"content":{"749":{"position":[[23206,5],[23332,5],[23464,5]]},"1235":{"position":[[344,5]]},"1271":{"position":[[71,5],[265,5],[1052,5],[1096,5],[1738,5]]},"1282":{"position":[[735,5]]}},"keywords":{}}],["trick",{"_index":1819,"title":{"303":{"position":[[0,6]]}},"content":{"303":{"position":[[1058,6]]}},"keywords":{}}],["tricki",{"_index":3576,"title":{},"content":{"611":{"position":[[1150,7]]}},"keywords":{}}],["trickl",{"_index":3584,"title":{},"content":{"612":{"position":[[527,8]]}},"keywords":{}}],["trigger",{"_index":751,"title":{},"content":{"50":{"position":[[94,7]]},"140":{"position":[[235,10]]},"168":{"position":[[204,7]]},"196":{"position":[[189,10]]},"226":{"position":[[294,7]]},"326":{"position":[[99,7]]},"344":{"position":[[99,7]]},"354":{"position":[[551,9]]},"410":{"position":[[2030,7]]},"427":{"position":[[1336,7]]},"477":{"position":[[41,8]]},"496":{"position":[[797,8]]},"518":{"position":[[335,7]]},"630":{"position":[[49,8]]},"631":{"position":[[269,7]]},"829":{"position":[[2828,7]]},"857":{"position":[[587,8]]},"898":{"position":[[1256,7]]},"996":{"position":[[1,8],[500,7]]},"1177":{"position":[[536,7]]}},"keywords":{}}],["triggerstrigg",{"_index":4519,"title":{},"content":{"765":{"position":[[227,18]]}},"keywords":{}}],["trip",{"_index":1012,"title":{},"content":{"92":{"position":[[131,5]]},"173":{"position":[[2030,6]]},"220":{"position":[[124,5]]},"224":{"position":[[276,5]]},"375":{"position":[[320,5]]},"408":{"position":[[2339,4],[2586,4],[2905,5],[3309,4]]},"410":{"position":[[117,4]]},"411":{"position":[[350,4]]},"415":{"position":[[292,4]]},"574":{"position":[[433,5]]},"630":{"position":[[631,4]]},"902":{"position":[[120,4]]}},"keywords":{}}],["trips.autom",{"_index":3157,"title":{},"content":{"487":{"position":[[255,15]]}},"keywords":{}}],["trivial",{"_index":2099,"title":{},"content":{"362":{"position":[[649,7]]},"559":{"position":[[143,7]]},"668":{"position":[[237,7]]},"1317":{"position":[[128,8]]}},"keywords":{}}],["troublesom",{"_index":3985,"title":{},"content":{"708":{"position":[[501,12]]}},"keywords":{}}],["true",{"_index":124,"title":{"206":{"position":[[3,4]]},"253":{"position":[[3,4]]}},"content":{"8":{"position":[[676,5]]},"55":{"position":[[599,4]]},"209":{"position":[[330,5],[349,4],[1257,4]]},"255":{"position":[[674,5],[693,4],[1559,4]]},"314":{"position":[[577,4]]},"316":{"position":[[204,5],[416,5]]},"334":{"position":[[478,5],[518,4]]},"354":{"position":[[1375,4]]},"391":{"position":[[710,5]]},"408":{"position":[[210,4]]},"412":{"position":[[14538,4]]},"481":{"position":[[819,4]]},"483":{"position":[[92,4]]},"522":{"position":[[589,5],[638,5],[657,5]]},"579":{"position":[[487,5],[527,4]]},"632":{"position":[[2589,5]]},"634":{"position":[[319,5]]},"639":{"position":[[261,4],[387,5]]},"647":{"position":[[320,5],[370,4]]},"648":{"position":[[12,4],[130,4],[167,5],[219,4]]},"649":{"position":[[175,4]]},"653":{"position":[[999,5],[1238,5],[1253,5],[1482,4]]},"678":{"position":[[340,4],[363,4]]},"684":{"position":[[72,5],[210,4]]},"696":{"position":[[1645,4]]},"700":{"position":[[336,5]]},"703":{"position":[[1606,4]]},"720":{"position":[[69,4],[218,4],[229,5]]},"734":{"position":[[629,5],[650,5]]},"739":{"position":[[398,4]]},"746":{"position":[[466,5],[481,5],[556,5],[661,5],[692,5],[717,5],[730,5],[743,5],[755,5],[780,5],[812,5],[827,5],[840,5],[854,4]]},"749":{"position":[[691,4],[2238,4],[14865,4]]},"759":{"position":[[787,4]]},"767":{"position":[[491,6],[887,6]]},"768":{"position":[[483,6],[891,6]]},"769":{"position":[[438,6],[858,6]]},"804":{"position":[[90,5]]},"825":{"position":[[737,5]]},"846":{"position":[[324,4],[413,5]]},"854":{"position":[[1079,5]]},"858":{"position":[[424,4]]},"861":{"position":[[2133,4]]},"866":{"position":[[844,5]]},"872":{"position":[[1123,4],[2634,4],[4588,5]]},"875":{"position":[[8195,4],[9614,4]]},"878":{"position":[[563,4]]},"885":{"position":[[2161,5],[2275,5]]},"886":{"position":[[1980,5],[2028,5],[2046,5]]},"898":{"position":[[3452,5]]},"907":{"position":[[208,4],[357,5]]},"916":{"position":[[230,4],[241,5]]},"934":{"position":[[615,5]]},"939":{"position":[[296,4]]},"957":{"position":[[9,4]]},"960":{"position":[[484,5],[533,5],[552,5]]},"964":{"position":[[140,5]]},"965":{"position":[[347,5]]},"966":{"position":[[324,5],[363,4],[628,4],[746,4]]},"967":{"position":[[213,4],[331,4]]},"971":{"position":[[119,4]]},"978":{"position":[[9,4]]},"986":{"position":[[401,5]]},"988":{"position":[[839,5],[854,5],[1126,5],[1281,5],[1463,5],[1631,4],[1650,5],[5167,5]]},"993":{"position":[[485,4],[622,4]]},"995":{"position":[[203,4],[231,4],[838,4],[866,4]]},"1000":{"position":[[9,4]]},"1001":{"position":[[9,4]]},"1003":{"position":[[434,5]]},"1013":{"position":[[167,4],[390,4],[542,4],[740,4]]},"1045":{"position":[[276,4]]},"1048":{"position":[[503,4],[599,5]]},"1049":{"position":[[251,4]]},"1050":{"position":[[154,4]]},"1051":{"position":[[336,4]]},"1053":{"position":[[9,4]]},"1063":{"position":[[9,4],[208,4]]},"1067":{"position":[[2432,5],[2453,4]]},"1068":{"position":[[96,4]]},"1070":{"position":[[9,4]]},"1074":{"position":[[1374,5],[1545,5],[1924,4]]},"1078":{"position":[[143,5],[164,5]]},"1080":{"position":[[93,5]]},"1083":{"position":[[613,4]]},"1088":{"position":[[588,4]]},"1090":{"position":[[1342,4]]},"1106":{"position":[[636,5]]},"1126":{"position":[[466,4],[550,5],[625,4]]},"1148":{"position":[[1053,4]]},"1164":{"position":[[544,5],[772,5],[817,5],[839,5],[1124,5]]},"1165":{"position":[[435,4]]},"1170":{"position":[[182,4]]},"1171":{"position":[[257,4]]},"1175":{"position":[[63,4]]},"1185":{"position":[[287,5],[360,5]]},"1208":{"position":[[857,5],[988,5]]},"1213":{"position":[[553,5],[721,4]]},"1266":{"position":[[638,5],[968,5]]},"1282":{"position":[[164,4]]},"1294":{"position":[[1433,5],[1716,5]]},"1296":{"position":[[1409,5],[1574,5]]},"1311":{"position":[[385,5]]},"1321":{"position":[[42,4]]}},"keywords":{}}],["true"",{"_index":4210,"title":{},"content":{"749":{"position":[[5830,11],[5892,10]]}},"keywords":{}}],["true/fals",{"_index":5532,"title":{},"content":{"1000":{"position":[[160,10]]},"1001":{"position":[[77,10]]}},"keywords":{}}],["truli",{"_index":1562,"title":{},"content":{"253":{"position":[[128,5]]},"263":{"position":[[172,5]]},"303":{"position":[[1116,5]]},"408":{"position":[[5443,5]]},"411":{"position":[[5218,5]]},"412":{"position":[[10404,5],[14713,5]]},"483":{"position":[[1271,5]]},"491":{"position":[[1520,5]]},"1085":{"position":[[811,5]]}},"keywords":{}}],["truncat",{"_index":6219,"title":{},"content":{"1208":{"position":[[1623,8]]}},"keywords":{}}],["trust",{"_index":2728,"title":{},"content":{"412":{"position":[[8187,7]]},"417":{"position":[[406,5]]},"556":{"position":[[1928,6]]},"697":{"position":[[85,7]]},"897":{"position":[[589,7]]},"898":{"position":[[2845,7]]},"991":{"position":[[47,8]]}},"keywords":{}}],["truth",{"_index":2617,"title":{},"content":{"411":{"position":[[2054,5],[4005,5]]},"412":{"position":[[5620,7]]},"418":{"position":[[821,5]]},"478":{"position":[[249,6]]},"700":{"position":[[55,6],[172,6]]},"705":{"position":[[591,5]]}},"keywords":{}}],["truthi",{"_index":5458,"title":{},"content":{"988":{"position":[[2103,6]]}},"keywords":{}}],["try/catch",{"_index":1800,"title":{},"content":{"302":{"position":[[388,9]]}},"keywords":{}}],["tryout",{"_index":5261,"title":{},"content":{"904":{"position":[[2672,8]]},"906":{"position":[[335,8]]}},"keywords":{}}],["tryouts.in",{"_index":6280,"title":{},"content":{"1235":{"position":[[371,10]]}},"keywords":{}}],["ts",{"_index":1380,"title":{},"content":{"211":{"position":[[307,2]]},"1266":{"position":[[881,6]]}},"keywords":{}}],["tsx",{"_index":6317,"title":{},"content":{"1266":{"position":[[749,10],[872,8]]}},"keywords":{}}],["tune",{"_index":1551,"title":{},"content":{"250":{"position":[[302,4]]},"383":{"position":[[496,4]]},"412":{"position":[[9476,6],[10737,6]]},"644":{"position":[[215,6]]},"1164":{"position":[[38,4]]}},"keywords":{}}],["tunnel",{"_index":3972,"title":{},"content":{"703":{"position":[[728,6]]}},"keywords":{}}],["turn",{"_index":2918,"title":{},"content":{"436":{"position":[[87,4]]},"614":{"position":[[480,4]]},"871":{"position":[[89,4]]}},"keywords":{}}],["turnkey",{"_index":2662,"title":{},"content":{"412":{"position":[[1202,7]]}},"keywords":{}}],["tutori",{"_index":106,"title":{},"content":{"8":{"position":[[140,9]]},"299":{"position":[[1569,9]]},"301":{"position":[[593,8]]},"387":{"position":[[171,10]]},"388":{"position":[[69,8]]},"390":{"position":[[1625,9]]},"393":{"position":[[446,9]]},"402":{"position":[[1940,8]]},"567":{"position":[[373,8]]},"861":{"position":[[81,8],[1190,8]]},"875":{"position":[[5646,9],[7620,9]]},"876":{"position":[[9,8]]}},"keywords":{}}],["tutorial.check",{"_index":3383,"title":{},"content":{"557":{"position":[[196,14]]},"712":{"position":[[67,14]]}},"keywords":{}}],["tutorial.i",{"_index":4587,"title":{},"content":{"776":{"position":[[117,10]]}},"keywords":{}}],["tutorial.if",{"_index":4816,"title":{},"content":{"842":{"position":[[123,11]]}},"keywords":{}}],["tutorial.ther",{"_index":3820,"title":{},"content":{"663":{"position":[[83,14]]},"842":{"position":[[217,14]]}},"keywords":{}}],["tweet",{"_index":2715,"title":{},"content":{"412":{"position":[[6866,5]]},"471":{"position":[[23,5]]}},"keywords":{}}],["tweetlearn",{"_index":3689,"title":{},"content":{"628":{"position":[[80,10]]}},"keywords":{}}],["tweetread",{"_index":2511,"title":{},"content":{"405":{"position":[[29,9]]}},"keywords":{}}],["twice",{"_index":3075,"title":{},"content":{"466":{"position":[[366,5]]},"467":{"position":[[331,5]]}},"keywords":{}}],["twitter",{"_index":2716,"title":{},"content":{"412":{"position":[[6875,7]]}},"keywords":{}}],["two",{"_index":204,"title":{},"content":{"14":{"position":[[129,3]]},"65":{"position":[[1977,3]]},"192":{"position":[[210,3]]},"393":{"position":[[192,3],[758,3],[863,3]]},"398":{"position":[[441,3]]},"408":{"position":[[3030,3]]},"412":{"position":[[822,3],[2244,3],[3097,3],[3128,3],[4553,3],[5891,3],[13881,3]]},"427":{"position":[[1312,3]]},"453":{"position":[[274,3]]},"458":{"position":[[1027,3]]},"525":{"position":[[588,3]]},"538":{"position":[[15,3]]},"540":{"position":[[98,3]]},"554":{"position":[[13,3]]},"582":{"position":[[498,3]]},"598":{"position":[[15,3]]},"617":{"position":[[407,3]]},"624":{"position":[[679,3]]},"626":{"position":[[640,3]]},"691":{"position":[[22,3],[535,3]]},"696":{"position":[[1024,3]]},"698":{"position":[[9,3],[184,3]]},"707":{"position":[[41,3]]},"711":{"position":[[2269,3]]},"717":{"position":[[20,3]]},"774":{"position":[[923,3]]},"775":{"position":[[209,3]]},"817":{"position":[[312,3]]},"828":{"position":[[212,3]]},"837":{"position":[[153,3],[999,3]]},"838":{"position":[[1710,3]]},"860":{"position":[[291,3]]},"870":{"position":[[1,3]]},"872":{"position":[[2187,3]]},"875":{"position":[[2356,3]]},"935":{"position":[[106,3]]},"961":{"position":[[76,3]]},"964":{"position":[[193,3]]},"983":{"position":[[1111,3]]},"984":{"position":[[452,3]]},"986":{"position":[[151,3]]},"1072":{"position":[[2104,3]]},"1080":{"position":[[985,3]]},"1100":{"position":[[203,3]]},"1147":{"position":[[89,3]]},"1214":{"position":[[162,3]]},"1267":{"position":[[746,5]]},"1271":{"position":[[11,3]]},"1292":{"position":[[48,3]]},"1296":{"position":[[709,3]]},"1306":{"position":[[11,3]]},"1309":{"position":[[38,3],[75,3]]},"1315":{"position":[[185,3],[992,3],[1233,3]]}},"keywords":{}}],["tx",{"_index":1804,"title":{},"content":{"302":{"position":[[691,2]]},"1294":{"position":[[807,3]]}},"keywords":{}}],["tx.done",{"_index":1810,"title":{},"content":{"302":{"position":[[825,8]]}},"keywords":{}}],["tx.objectstore('largestor",{"_index":1807,"title":{},"content":{"302":{"position":[[753,29]]}},"keywords":{}}],["tx.objectstore(storenam",{"_index":6430,"title":{},"content":{"1294":{"position":[[905,26]]}},"keywords":{}}],["type",{"_index":630,"title":{"925":{"position":[[0,5]]},"1311":{"position":[[10,6]]}},"content":{"40":{"position":[[52,5],[177,5]]},"47":{"position":[[603,5]]},"51":{"position":[[373,5],[409,5],[451,5],[478,5]]},"74":{"position":[[86,4]]},"105":{"position":[[156,4],[215,7]]},"151":{"position":[[452,5]]},"174":{"position":[[861,6],[915,4]]},"188":{"position":[[1250,5],[1286,5],[1328,5],[1371,5]]},"209":{"position":[[437,5],[491,5],[534,5],[564,5]]},"211":{"position":[[417,5],[453,5],[498,5]]},"232":{"position":[[163,6]]},"255":{"position":[[781,5],[835,5],[878,5],[904,5]]},"259":{"position":[[99,5],[135,5],[177,5]]},"281":{"position":[[74,6],[263,8],[299,4]]},"314":{"position":[[747,5],[801,5],[830,5],[861,5]]},"315":{"position":[[723,5],[777,5],[803,5]]},"316":{"position":[[232,5],[286,5],[315,5],[346,5]]},"334":{"position":[[651,5],[687,5],[713,5],[741,5]]},"356":{"position":[[171,6]]},"360":{"position":[[762,4]]},"361":{"position":[[120,6]]},"367":{"position":[[794,5],[830,5],[921,5],[963,5],[995,5]]},"390":{"position":[[895,5],[1182,5]]},"392":{"position":[[601,5],[637,5],[678,5],[1567,5],[1603,5],[1649,5],[1673,5]]},"393":{"position":[[600,4]]},"397":{"position":[[488,5]]},"411":{"position":[[837,4]]},"412":{"position":[[3712,6]]},"415":{"position":[[101,6]]},"424":{"position":[[261,6]]},"444":{"position":[[348,5]]},"480":{"position":[[547,5],[601,5],[628,5],[654,5]]},"482":{"position":[[847,5],[901,5],[933,5]]},"533":{"position":[[263,6]]},"535":{"position":[[673,4]]},"538":{"position":[[674,5],[710,5],[752,5],[779,5]]},"554":{"position":[[1338,5],[1392,5],[1441,5],[1474,5]]},"556":{"position":[[1014,5]]},"562":{"position":[[319,5],[373,5],[399,5],[426,5]]},"564":{"position":[[776,5],[830,5],[862,5]]},"569":{"position":[[138,4]]},"579":{"position":[[659,5],[695,5],[721,5],[755,5]]},"593":{"position":[[263,6]]},"598":{"position":[[681,5],[717,5],[759,5],[786,5]]},"612":{"position":[[1474,4],[1598,6],[1909,6]]},"617":{"position":[[2382,4]]},"632":{"position":[[1531,5],[1585,5],[1628,5],[1654,5]]},"636":{"position":[[52,6]]},"638":{"position":[[615,5],[669,5],[718,5]]},"639":{"position":[[393,5],[447,5],[492,5],[523,5]]},"662":{"position":[[2394,5],[2448,5],[2490,5],[2515,5]]},"680":{"position":[[841,5],[877,5],[921,5]]},"688":{"position":[[949,6]]},"698":{"position":[[3047,5]]},"711":{"position":[[2364,4]]},"717":{"position":[[1450,5],[1486,5],[1530,5]]},"720":{"position":[[149,5]]},"734":{"position":[[715,5],[751,5]]},"749":{"position":[[17080,4],[17198,4],[18250,5],[19926,4],[20137,4],[20294,4],[20466,4],[20561,4],[20728,4]]},"792":{"position":[[397,5]]},"796":{"position":[[289,6],[1217,4]]},"800":{"position":[[991,5]]},"808":{"position":[[230,5],[306,5],[564,5],[602,5],[631,5],[669,5]]},"812":{"position":[[87,5],[125,5],[153,5],[193,5]]},"813":{"position":[[87,5],[125,5],[154,5],[192,5]]},"818":{"position":[[77,4]]},"838":{"position":[[2608,5],[2662,5],[2704,5],[2729,5]]},"841":{"position":[[73,4],[1215,5]]},"854":{"position":[[931,4]]},"862":{"position":[[681,5],[717,5],[759,5]]},"872":{"position":[[1898,5],[1942,5],[1989,5],[2019,5],[4128,5],[4172,5],[4219,5],[4249,5]]},"875":{"position":[[1549,4],[2786,6],[5550,6],[6339,6],[7293,6]]},"885":{"position":[[620,4],[767,4],[833,4],[1054,4],[1328,4]]},"889":{"position":[[136,4],[224,4],[265,4]]},"898":{"position":[[194,4],[1725,6],[1770,5],[2478,5],[2522,5],[2569,5],[2599,5],[2624,5]]},"904":{"position":[[870,5],[924,5],[967,5],[993,5],[1039,5]]},"916":{"position":[[156,5]]},"917":{"position":[[303,5],[334,4]]},"918":{"position":[[174,5]]},"922":{"position":[[48,4]]},"925":{"position":[[5,4]]},"932":{"position":[[1208,5]]},"941":{"position":[[208,5]]},"948":{"position":[[256,5]]},"988":{"position":[[2634,6]]},"1007":{"position":[[169,6]]},"1018":{"position":[[681,5],[731,4]]},"1057":{"position":[[356,4],[572,4]]},"1072":{"position":[[1946,5]]},"1078":{"position":[[494,5],[530,5],[626,5],[656,5]]},"1079":{"position":[[122,5],[234,5]]},"1080":{"position":[[117,5],[153,5],[249,5],[370,5],[398,5],[431,5],[460,5],[630,5],[654,5],[691,5]]},"1082":{"position":[[202,5],[238,5],[334,5],[364,5],[389,5]]},"1083":{"position":[[402,5],[438,5],[534,5],[564,5],[589,5]]},"1085":{"position":[[1159,5],[2379,8],[2449,4],[2651,6]]},"1100":{"position":[[46,5]]},"1102":{"position":[[607,6],[770,4]]},"1149":{"position":[[1061,5],[1115,5],[1157,5],[1182,5]]},"1158":{"position":[[389,5],[425,5],[452,5],[478,5]]},"1226":{"position":[[668,5]]},"1257":{"position":[[71,4]]},"1264":{"position":[[548,5]]},"1290":{"position":[[100,5]]},"1306":{"position":[[15,5]]},"1311":{"position":[[34,6],[417,5],[461,5],[492,5],[522,5],[547,5]]},"1318":{"position":[[698,5]]},"1322":{"position":[[83,5],[228,7],[380,5],[426,7],[526,4]]}},"keywords":{}}],["type:str",{"_index":4381,"title":{},"content":{"749":{"position":[[18959,11]]}},"keywords":{}}],["type="text"",{"_index":3395,"title":{},"content":{"559":{"position":[[588,21]]}},"keywords":{}}],["typeerror",{"_index":5408,"title":{},"content":{"968":{"position":[[602,10]]},"1213":{"position":[[872,10]]}},"keywords":{}}],["typesaf",{"_index":5740,"title":{},"content":{"1057":{"position":[[415,9]]}},"keywords":{}}],["typescript",{"_index":300,"title":{"74":{"position":[[17,10]]},"105":{"position":[[17,10]]},"232":{"position":[[7,10]]},"281":{"position":[[17,10]]},"1251":{"position":[[0,10]]},"1257":{"position":[[19,11]]},"1310":{"position":[[16,10]]},"1322":{"position":[[0,10]]}},"content":{"17":{"position":[[527,10]]},"34":{"position":[[236,11]]},"47":{"position":[[553,10],[592,10]]},"74":{"position":[[20,10]]},"83":{"position":[[130,10]]},"105":{"position":[[1,10],[110,10]]},"174":{"position":[[704,10],[781,10]]},"188":{"position":[[20,10]]},"232":{"position":[[1,10],[104,10],[313,10]]},"281":{"position":[[1,11],[195,10]]},"445":{"position":[[164,11]]},"535":{"position":[[580,10]]},"595":{"position":[[607,10]]},"711":{"position":[[2353,10]]},"730":{"position":[[184,10]]},"793":{"position":[[72,10]]},"1018":{"position":[[642,11],[895,10]]},"1057":{"position":[[298,10]]},"1071":{"position":[[180,10]]},"1085":{"position":[[2368,10],[2621,10]]},"1251":{"position":[[157,10]]},"1257":{"position":[[41,10]]},"1322":{"position":[[32,10]]}},"keywords":{}}],["typescript"",{"_index":1530,"title":{},"content":{"244":{"position":[[1613,16]]}},"keywords":{}}],["typescript/j",{"_index":654,"title":{},"content":{"41":{"position":[[247,13]]}},"keywords":{}}],["typic",{"_index":636,"title":{"349":{"position":[[29,9]]}},"content":{"40":{"position":[[344,9]]},"99":{"position":[[15,9]]},"203":{"position":[[28,9]]},"226":{"position":[[15,9]]},"228":{"position":[[27,9]]},"265":{"position":[[566,9]]},"298":{"position":[[496,9]]},"299":{"position":[[888,9]]},"302":{"position":[[335,7]]},"303":{"position":[[78,9]]},"305":{"position":[[268,10]]},"336":{"position":[[470,7]]},"357":{"position":[[39,9]]},"358":{"position":[[68,9]]},"408":{"position":[[871,9]]},"410":{"position":[[1588,7]]},"411":{"position":[[56,9]]},"412":{"position":[[8826,9],[10316,7],[11122,9]]},"414":{"position":[[274,9]]},"419":{"position":[[1767,9]]},"427":{"position":[[1477,9]]},"461":{"position":[[1083,9],[1314,9]]},"478":{"position":[[1,7]]},"563":{"position":[[6,9]]},"570":{"position":[[388,9]]},"581":{"position":[[514,9]]},"641":{"position":[[237,9]]},"723":{"position":[[742,9]]},"830":{"position":[[264,9]]},"841":{"position":[[1039,9]]},"1150":{"position":[[223,9]]}},"keywords":{}}],["typo",{"_index":5898,"title":{},"content":{"1085":{"position":[[2504,4]]}},"keywords":{}}],["ubuntu",{"_index":6394,"title":{},"content":{"1292":{"position":[[74,6]]}},"keywords":{}}],["ui",{"_index":544,"title":{"73":{"position":[[42,4]]},"77":{"position":[[54,2]]},"103":{"position":[[54,2]]},"104":{"position":[[42,4]]},"173":{"position":[[21,2]]},"231":{"position":[[27,4]]},"233":{"position":[[33,2]]},"484":{"position":[[23,2]]},"485":{"position":[[26,3]]},"486":{"position":[[39,3]]},"488":{"position":[[20,2]]},"489":{"position":[[46,3]]},"490":{"position":[[10,2]]},"492":{"position":[[11,2]]},"495":{"position":[[24,2]]},"497":{"position":[[38,3]]},"634":{"position":[[11,2]]},"1312":{"position":[[4,2]]}},"content":{"34":{"position":[[645,2]]},"37":{"position":[[74,2]]},"53":{"position":[[81,2]]},"77":{"position":[[181,2]]},"103":{"position":[[71,2]]},"104":{"position":[[64,2],[202,2]]},"106":{"position":[[164,2]]},"124":{"position":[[246,2]]},"129":{"position":[[52,2]]},"130":{"position":[[295,2]]},"140":{"position":[[229,2]]},"146":{"position":[[198,2]]},"173":{"position":[[19,2]]},"174":{"position":[[378,2],[460,4],[573,2],[674,2],[1147,2]]},"175":{"position":[[478,2]]},"177":{"position":[[27,2]]},"182":{"position":[[169,2],[292,2]]},"185":{"position":[[182,2]]},"196":{"position":[[183,2]]},"205":{"position":[[377,2]]},"217":{"position":[[224,2]]},"221":{"position":[[260,3]]},"226":{"position":[[327,3]]},"231":{"position":[[263,2]]},"233":{"position":[[113,2],[221,2]]},"234":{"position":[[136,2]]},"235":{"position":[[185,2]]},"277":{"position":[[123,2]]},"302":{"position":[[1018,2]]},"320":{"position":[[245,2]]},"326":{"position":[[107,2]]},"329":{"position":[[232,3]]},"342":{"position":[[157,2]]},"352":{"position":[[11,3]]},"354":{"position":[[108,2]]},"360":{"position":[[343,2]]},"362":{"position":[[154,2]]},"369":{"position":[[1274,2]]},"379":{"position":[[130,2]]},"410":{"position":[[2038,2]]},"411":{"position":[[2069,3],[2258,2],[2495,2],[3023,2],[3884,3]]},"412":{"position":[[3638,4],[5093,2],[10036,2]]},"415":{"position":[[388,4]]},"420":{"position":[[1351,3]]},"451":{"position":[[683,2]]},"476":{"position":[[319,2]]},"479":{"position":[[168,2]]},"483":{"position":[[344,2]]},"485":{"position":[[12,3]]},"486":{"position":[[198,2]]},"488":{"position":[[37,2]]},"489":{"position":[[48,3],[515,2]]},"490":{"position":[[153,2],[236,2]]},"491":{"position":[[45,3],[891,2]]},"495":{"position":[[18,3],[405,2]]},"497":{"position":[[641,2]]},"498":{"position":[[45,2],[549,3]]},"541":{"position":[[808,2]]},"562":{"position":[[843,2],[962,2],[1755,2]]},"566":{"position":[[549,2]]},"574":{"position":[[297,2]]},"601":{"position":[[789,2]]},"630":{"position":[[599,2]]},"631":{"position":[[277,2]]},"634":{"position":[[80,2],[329,2],[555,2]]},"642":{"position":[[197,2]]},"661":{"position":[[1447,2]]},"662":{"position":[[234,2]]},"698":{"position":[[2118,2]]},"700":{"position":[[624,2],[1141,3]]},"703":{"position":[[1309,2],[1562,2]]},"707":{"position":[[140,2]]},"709":{"position":[[625,3]]},"710":{"position":[[120,2],[2442,3]]},"711":{"position":[[1941,2]]},"778":{"position":[[542,2]]},"781":{"position":[[531,2],[866,2]]},"785":{"position":[[30,2],[399,2],[600,3]]},"801":{"position":[[421,2],[739,2]]},"836":{"position":[[1157,2],[1281,2],[1500,2],[2403,2]]},"838":{"position":[[263,2],[470,2]]},"841":{"position":[[602,2]]},"1058":{"position":[[122,3]]},"1117":{"position":[[487,2]]},"1150":{"position":[[588,2]]},"1313":{"position":[[473,2]]},"1321":{"position":[[171,3]]}},"keywords":{}}],["ui"",{"_index":1440,"title":{},"content":{"243":{"position":[[21,8]]}},"keywords":{}}],["uint8array(writes",{"_index":6212,"title":{},"content":{"1208":{"position":[[1327,22]]}},"keywords":{}}],["ultim",{"_index":1643,"title":{"472":{"position":[[11,8]]}},"content":{"277":{"position":[[308,11]]},"318":{"position":[[566,8]]},"388":{"position":[[232,11]]},"491":{"position":[[67,10]]}},"keywords":{}}],["umd",{"_index":1939,"title":{},"content":{"333":{"position":[[187,3]]}},"keywords":{}}],["un",{"_index":5469,"title":{},"content":{"988":{"position":[[4020,2]]},"1316":{"position":[[550,2]]}},"keywords":{}}],["unauthor",{"_index":1299,"title":{"880":{"position":[[0,14]]}},"content":{"195":{"position":[[180,12]]},"377":{"position":[[111,12]]},"526":{"position":[[178,12]]},"550":{"position":[[37,12]]},"586":{"position":[[154,12]]},"749":{"position":[[16506,12]]},"880":{"position":[[190,13]]},"912":{"position":[[371,12]]}},"keywords":{}}],["unavail",{"_index":1393,"title":{},"content":{"215":{"position":[[256,12]]},"300":{"position":[[848,12]]},"323":{"position":[[238,12]]},"445":{"position":[[650,12]]},"860":{"position":[[437,12]]}},"keywords":{}}],["unavoid",{"_index":3691,"title":{},"content":{"630":{"position":[[131,11]]}},"keywords":{}}],["unbound",{"_index":5896,"title":{},"content":{"1085":{"position":[[2252,10]]}},"keywords":{}}],["uncach",{"_index":4698,"title":{},"content":{"816":{"position":[[150,7],[299,7],[383,7]]},"817":{"position":[[105,8],[217,8]]},"818":{"position":[[237,8]]}},"keywords":{}}],["uncacherxquery(rxqueri",{"_index":4704,"title":{},"content":{"818":{"position":[[268,24]]}},"keywords":{}}],["uncaught",{"_index":4071,"title":{},"content":{"729":{"position":[[91,8]]}},"keywords":{}}],["uncompress",{"_index":1828,"title":{},"content":{"303":{"position":[[522,12]]},"361":{"position":[[519,12]]}},"keywords":{}}],["undefin",{"_index":280,"title":{"887":{"position":[[21,9]]}},"content":{"16":{"position":[[453,9]]},"729":{"position":[[406,9]]},"749":{"position":[[3718,12]]},"829":{"position":[[2096,10]]},"886":{"position":[[1318,10]]},"887":{"position":[[88,10],[215,9],[570,9]]},"898":{"position":[[4399,9]]},"968":{"position":[[639,9]]},"981":{"position":[[1474,9]]},"1018":{"position":[[492,9]]},"1043":{"position":[[104,9],[141,9]]},"1065":{"position":[[702,9]]},"1188":{"position":[[328,9]]},"1202":{"position":[[445,9]]},"1213":{"position":[[909,9]]},"1305":{"position":[[46,9]]}},"keywords":{}}],["undefined/miss",{"_index":5227,"title":{},"content":{"898":{"position":[[4344,19]]}},"keywords":{}}],["under",{"_index":683,"title":{},"content":{"43":{"position":[[611,5]]},"303":{"position":[[1177,5],[1219,5]]},"305":{"position":[[515,5]]},"412":{"position":[[9862,5]]},"490":{"position":[[474,5]]},"545":{"position":[[100,5]]},"566":{"position":[[803,5]]},"571":{"position":[[1575,5]]},"605":{"position":[[100,5]]},"620":{"position":[[197,5]]},"703":{"position":[[1505,5]]}},"keywords":{}}],["underli",{"_index":399,"title":{},"content":{"24":{"position":[[144,10]]},"90":{"position":[[222,10]]},"124":{"position":[[157,10]]},"139":{"position":[[250,10]]},"159":{"position":[[226,10]]},"162":{"position":[[97,10]]},"167":{"position":[[211,10]]},"181":{"position":[[230,10]]},"185":{"position":[[105,10]]},"233":{"position":[[150,10]]},"266":{"position":[[948,10]]},"314":{"position":[[97,10]]},"383":{"position":[[338,10]]},"485":{"position":[[99,10]]},"514":{"position":[[268,10]]},"524":{"position":[[65,10]]},"541":{"position":[[838,10]]},"585":{"position":[[95,10]]},"600":{"position":[[158,10]]},"601":{"position":[[819,10]]},"641":{"position":[[144,10]]},"703":{"position":[[316,10],[376,10]]},"829":{"position":[[2789,10]]},"838":{"position":[[486,10]]},"890":{"position":[[389,10]]},"962":{"position":[[134,10]]},"1124":{"position":[[198,10]]},"1150":{"position":[[614,10]]},"1162":{"position":[[831,10]]},"1165":{"position":[[112,10]]},"1198":{"position":[[1234,10]]},"1246":{"position":[[1435,10]]}},"keywords":{}}],["underpin",{"_index":2805,"title":{},"content":{"419":{"position":[[781,13]]}},"keywords":{}}],["underscor",{"_index":4199,"title":{},"content":{"749":{"position":[[4922,10],[8276,10],[17578,10]]},"811":{"position":[[96,10]]},"863":{"position":[[72,10],[119,12]]}},"keywords":{}}],["underscore_",{"_index":4687,"title":{},"content":{"811":{"position":[[423,11]]}},"keywords":{}}],["understand",{"_index":486,"title":{"427":{"position":[[0,13]]},"444":{"position":[[0,13]]}},"content":{"29":{"position":[[458,10]]},"119":{"position":[[39,10]]},"127":{"position":[[25,13]]},"151":{"position":[[66,10]]},"180":{"position":[[4,10]]},"187":{"position":[[13,10]]},"298":{"position":[[835,13]]},"364":{"position":[[782,11]]},"404":{"position":[[522,10]]},"412":{"position":[[81,10]]},"425":{"position":[[55,10]]},"441":{"position":[[530,13]]},"483":{"position":[[776,13]]},"688":{"position":[[738,11]]},"689":{"position":[[138,13]]},"707":{"position":[[361,10]]},"904":{"position":[[48,10]]},"981":{"position":[[137,11],[224,10],[278,10]]},"1151":{"position":[[263,10],[687,13]]},"1178":{"position":[[262,10],[686,13]]},"1252":{"position":[[255,10]]}},"keywords":{}}],["understood",{"_index":2649,"title":{},"content":{"412":{"position":[[206,10]]},"569":{"position":[[544,10]]}},"keywords":{}}],["undon",{"_index":3127,"title":{},"content":{"480":{"position":[[885,6]]}},"keywords":{}}],["undonetask",{"_index":3128,"title":{},"content":{"480":{"position":[[901,13]]}},"keywords":{}}],["undoubtedli",{"_index":2948,"title":{},"content":{"447":{"position":[[559,11]]}},"keywords":{}}],["unencrypt",{"_index":3361,"title":{},"content":{"555":{"position":[[952,11]]},"714":{"position":[[192,11]]}},"keywords":{}}],["unexpect",{"_index":5897,"title":{},"content":{"1085":{"position":[[2338,10]]}},"keywords":{}}],["unexpectedli",{"_index":6472,"title":{},"content":{"1300":{"position":[[1104,12]]}},"keywords":{}}],["unfamiliar",{"_index":2834,"title":{},"content":{"420":{"position":[[721,11]]}},"keywords":{}}],["unfortun",{"_index":3008,"title":{},"content":{"460":{"position":[[693,13]]},"1301":{"position":[[886,13]]}},"keywords":{}}],["ungracefulli",{"_index":461,"title":{},"content":{"28":{"position":[[458,12]]},"1162":{"position":[[71,12]]},"1171":{"position":[[88,12]]},"1181":{"position":[[137,12]]}},"keywords":{}}],["unidirect",{"_index":3668,"title":{},"content":{"622":{"position":[[355,14],[612,14]]}},"keywords":{}}],["unifi",{"_index":588,"title":{},"content":{"38":{"position":[[279,5]]},"317":{"position":[[287,7]]},"384":{"position":[[333,7]]},"445":{"position":[[2459,7]]},"446":{"position":[[1317,7]]},"517":{"position":[[372,7]]},"589":{"position":[[200,7]]}},"keywords":{}}],["uninstal",{"_index":2732,"title":{},"content":{"412":{"position":[[8580,10]]}},"keywords":{}}],["unintellig",{"_index":5279,"title":{},"content":{"912":{"position":[[444,14]]}},"keywords":{}}],["unintention",{"_index":3686,"title":{},"content":{"627":{"position":[[147,15]]}},"keywords":{}}],["uninterrupt",{"_index":1004,"title":{},"content":{"88":{"position":[[169,13]]},"274":{"position":[[198,13]]},"292":{"position":[[418,13]]},"445":{"position":[[578,13]]}},"keywords":{}}],["uniqu",{"_index":474,"title":{},"content":{"29":{"position":[[107,6]]},"118":{"position":[[312,6]]},"271":{"position":[[196,6]]},"276":{"position":[[354,6]]},"287":{"position":[[738,6]]},"354":{"position":[[518,6]]},"377":{"position":[[41,6]]},"388":{"position":[[210,6]]},"399":{"position":[[134,6]]},"432":{"position":[[581,6]]},"444":{"position":[[161,6]]},"504":{"position":[[502,6]]},"520":{"position":[[87,6]]},"567":{"position":[[1126,6]]},"724":{"position":[[552,6]]},"749":{"position":[[18031,7]]},"875":{"position":[[2340,6]]},"904":{"position":[[2115,6]]},"935":{"position":[[10,8]]},"943":{"position":[[183,10]]},"961":{"position":[[37,8]]},"990":{"position":[[552,6]]},"1008":{"position":[[104,6]]},"1074":{"position":[[173,7]]},"1077":{"position":[[183,7]]},"1294":{"position":[[640,7]]}},"keywords":{}}],["unit",{"_index":1648,"title":{},"content":{"279":{"position":[[204,5]]},"668":{"position":[[110,4],[345,4]]},"749":{"position":[[5791,4]]},"773":{"position":[[366,4]]},"966":{"position":[[250,4]]},"996":{"position":[[132,4]]},"1091":{"position":[[59,5]]},"1139":{"position":[[99,4]]},"1145":{"position":[[95,4]]},"1159":{"position":[[175,4]]},"1313":{"position":[[92,4]]}},"keywords":{}}],["univers",{"_index":1735,"title":{},"content":{"299":{"position":[[95,9]]},"1072":{"position":[[1975,9]]}},"keywords":{}}],["unix",{"_index":4447,"title":{},"content":{"751":{"position":[[695,4],[938,4],[1797,4]]},"875":{"position":[[1645,4]]},"1104":{"position":[[535,4]]}},"keywords":{}}],["unknown",{"_index":2424,"title":{},"content":{"398":{"position":[[3307,7]]},"778":{"position":[[214,7]]},"985":{"position":[[321,7]]},"1085":{"position":[[879,7],[2022,7],[2601,7]]},"1316":{"position":[[409,7],[438,7]]}},"keywords":{}}],["unless",{"_index":78,"title":{},"content":{"5":{"position":[[149,6]]},"412":{"position":[[8841,6]]},"476":{"position":[[73,6]]},"563":{"position":[[1058,6]]}},"keywords":{}}],["unlik",{"_index":1082,"title":{},"content":{"126":{"position":[[196,6]]},"201":{"position":[[1,6]]},"249":{"position":[[1,6]]},"390":{"position":[[295,6]]},"427":{"position":[[423,6]]},"432":{"position":[[262,6]]},"453":{"position":[[535,8]]},"500":{"position":[[225,6]]},"520":{"position":[[157,6]]},"610":{"position":[[204,6]]},"612":{"position":[[97,6]]},"656":{"position":[[108,8]]},"688":{"position":[[956,6]]},"1206":{"position":[[177,6]]}},"keywords":{}}],["unlimit",{"_index":808,"title":{},"content":{"52":{"position":[[571,10]]},"412":{"position":[[7349,9]]},"539":{"position":[[571,10]]},"599":{"position":[[598,10]]}},"keywords":{}}],["unlock",{"_index":1057,"title":{},"content":{"114":{"position":[[470,6]]},"241":{"position":[[405,6]]},"408":{"position":[[1391,8]]},"447":{"position":[[667,6]]},"483":{"position":[[1196,6]]}},"keywords":{}}],["unmaintain",{"_index":266,"title":{},"content":{"15":{"position":[[589,13]]},"28":{"position":[[613,13]]}},"keywords":{}}],["unmanageable.no",{"_index":2061,"title":{},"content":{"358":{"position":[[455,15]]}},"keywords":{}}],["unmount",{"_index":3525,"title":{},"content":{"590":{"position":[[545,7]]},"829":{"position":[[3808,9]]}},"keywords":{}}],["unnecessari",{"_index":1047,"title":{},"content":{"108":{"position":[[107,11]]},"146":{"position":[[186,11]]},"234":{"position":[[188,11]]},"289":{"position":[[421,11]]},"383":{"position":[[564,11]]},"385":{"position":[[306,11]]},"436":{"position":[[57,12]]},"610":{"position":[[690,11]]},"689":{"position":[[554,11]]}},"keywords":{}}],["unpredict",{"_index":2045,"title":{},"content":{"356":{"position":[[792,13]]},"399":{"position":[[219,14]]},"412":{"position":[[10532,13]]},"1304":{"position":[[1463,13]]}},"keywords":{}}],["unreach",{"_index":5245,"title":{},"content":{"902":{"position":[[609,12]]}},"keywords":{}}],["unread",{"_index":3140,"title":{},"content":{"482":{"position":[[1126,10]]},"638":{"position":[[892,10]]}},"keywords":{}}],["unreason",{"_index":1717,"title":{},"content":{"298":{"position":[[421,12]]}},"keywords":{}}],["unreli",{"_index":1079,"title":{},"content":{"122":{"position":[[369,10]]},"133":{"position":[[362,10]]},"289":{"position":[[1876,11]]},"309":{"position":[[102,10]]},"415":{"position":[[419,11]]},"613":{"position":[[273,10]]},"624":{"position":[[1247,10]]}},"keywords":{}}],["unsaf",{"_index":6385,"title":{},"content":{"1287":{"position":[[104,7]]}},"keywords":{}}],["unsent",{"_index":2786,"title":{},"content":{"416":{"position":[[163,6]]}},"keywords":{}}],["unset",{"_index":5843,"title":{},"content":{"1082":{"position":[[91,5]]}},"keywords":{}}],["unstructur",{"_index":216,"title":{},"content":{"14":{"position":[[510,12]]},"276":{"position":[[217,12]]}},"keywords":{}}],["unsubscrib",{"_index":1132,"title":{"143":{"position":[[55,12]]}},"content":{"143":{"position":[[154,11]]}},"keywords":{}}],["unsuit",{"_index":1027,"title":{},"content":{"100":{"position":[[113,10]]},"408":{"position":[[389,10]]},"412":{"position":[[7569,10]]},"427":{"position":[[534,10]]}},"keywords":{}}],["unsync",{"_index":3519,"title":{},"content":{"584":{"position":[[135,8]]}},"keywords":{}}],["unthink",{"_index":2579,"title":{},"content":{"408":{"position":[[5576,11]]}},"keywords":{}}],["until",{"_index":148,"title":{},"content":{"11":{"position":[[245,5],[341,5],[722,5]]},"24":{"position":[[555,5]]},"301":{"position":[[239,5]]},"412":{"position":[[11652,5]]},"451":{"position":[[808,5]]},"461":{"position":[[563,5]]},"463":{"position":[[593,5]]},"610":{"position":[[382,5]]},"626":{"position":[[776,5],[1042,5]]},"698":{"position":[[3153,5]]},"699":{"position":[[488,5]]},"702":{"position":[[322,5]]},"737":{"position":[[214,5]]},"775":{"position":[[57,5]]},"875":{"position":[[8898,5]]},"948":{"position":[[692,5]]},"988":{"position":[[728,5],[1300,5],[6036,5]]},"995":{"position":[[319,5],[607,5],[748,5],[976,5]]},"996":{"position":[[78,5]]},"1007":{"position":[[1113,5]]},"1032":{"position":[[160,5]]},"1164":{"position":[[1157,5]]},"1175":{"position":[[497,5]]},"1194":{"position":[[282,5]]},"1288":{"position":[[65,5]]},"1294":{"position":[[1032,5]]}},"keywords":{}}],["untrack",{"_index":832,"title":{},"content":{"55":{"position":[[251,10],[518,12]]}},"keywords":{}}],["untyp",{"_index":733,"title":{},"content":{"47":{"position":[[677,7]]}},"keywords":{}}],["unus",{"_index":1870,"title":{},"content":{"305":{"position":[[219,6]]},"416":{"position":[[440,8]]}},"keywords":{}}],["unwieldi",{"_index":721,"title":{},"content":{"47":{"position":[[173,8]]},"321":{"position":[[404,8]]},"356":{"position":[[920,9]]}},"keywords":{}}],["up",{"_index":191,"title":{"48":{"position":[[4,2]]},"61":{"position":[[7,3]]},"84":{"position":[[7,3]]},"114":{"position":[[7,3]]},"149":{"position":[[7,3]]},"175":{"position":[[7,3]]},"210":{"position":[[8,2]]},"241":{"position":[[7,3]]},"263":{"position":[[7,3]]},"296":{"position":[[7,3]]},"306":{"position":[[7,3]]},"318":{"position":[[7,3]]},"347":{"position":[[7,3]]},"362":{"position":[[7,3]]},"373":{"position":[[7,3]]},"388":{"position":[[7,3]]},"405":{"position":[[7,3]]},"442":{"position":[[7,3]]},"471":{"position":[[7,3]]},"483":{"position":[[7,3]]},"498":{"position":[[7,3]]},"511":{"position":[[7,3]]},"531":{"position":[[7,3]]},"536":{"position":[[4,2]]},"548":{"position":[[7,3]]},"552":{"position":[[8,2]]},"554":{"position":[[7,2]]},"557":{"position":[[7,3]]},"567":{"position":[[7,3]]},"572":{"position":[[7,3]]},"591":{"position":[[7,3]]},"596":{"position":[[4,2]]},"608":{"position":[[7,3]]},"628":{"position":[[7,3]]},"644":{"position":[[7,3]]},"663":{"position":[[7,3]]},"712":{"position":[[7,3]]},"776":{"position":[[7,2]]},"786":{"position":[[7,3]]},"832":{"position":[[7,3]]},"842":{"position":[[7,3]]},"862":{"position":[[8,2]]},"872":{"position":[[8,2]]},"873":{"position":[[7,3]]},"898":{"position":[[8,2]]},"899":{"position":[[7,3]]},"913":{"position":[[7,3]]},"1089":{"position":[[23,2]]}},"content":{"13":{"position":[[208,2]]},"84":{"position":[[392,2]]},"114":{"position":[[405,2]]},"149":{"position":[[405,2]]},"158":{"position":[[321,2]]},"168":{"position":[[273,2]]},"175":{"position":[[396,2]]},"184":{"position":[[267,2]]},"185":{"position":[[185,2]]},"192":{"position":[[72,2]]},"204":{"position":[[123,2]]},"241":{"position":[[174,2]]},"255":{"position":[[227,3]]},"261":{"position":[[1007,2]]},"267":{"position":[[805,2]]},"284":{"position":[[53,2],[137,2]]},"287":{"position":[[410,2]]},"288":{"position":[[149,2]]},"293":{"position":[[356,2]]},"299":{"position":[[254,2]]},"301":{"position":[[139,2]]},"318":{"position":[[256,2]]},"333":{"position":[[92,2]]},"340":{"position":[[168,2]]},"342":{"position":[[54,2]]},"346":{"position":[[476,2]]},"347":{"position":[[403,2]]},"360":{"position":[[583,2]]},"362":{"position":[[1474,2]]},"373":{"position":[[174,2]]},"376":{"position":[[498,2]]},"392":{"position":[[875,2],[2418,2],[3143,2]]},"393":{"position":[[681,2]]},"394":{"position":[[1664,2]]},"408":{"position":[[984,2],[4086,2]]},"410":{"position":[[1100,2]]},"411":{"position":[[4280,2]]},"412":{"position":[[2420,2],[4280,2],[6074,4],[6990,3]]},"419":{"position":[[1833,2]]},"427":{"position":[[851,2]]},"461":{"position":[[243,2],[509,2],[593,2],[1181,2]]},"468":{"position":[[519,2],[612,2]]},"469":{"position":[[79,2],[525,2],[1153,2]]},"477":{"position":[[83,2]]},"498":{"position":[[205,2]]},"504":{"position":[[1202,2]]},"511":{"position":[[405,2]]},"531":{"position":[[405,2]]},"536":{"position":[[9,2]]},"538":{"position":[[179,2]]},"542":{"position":[[247,2]]},"554":{"position":[[269,2]]},"555":{"position":[[17,2]]},"562":{"position":[[1404,2]]},"567":{"position":[[236,2],[1052,2]]},"579":{"position":[[38,2]]},"587":{"position":[[66,2]]},"590":{"position":[[512,2],[668,2]]},"591":{"position":[[403,2]]},"596":{"position":[[9,2]]},"598":{"position":[[180,2]]},"602":{"position":[[505,2]]},"612":{"position":[[1069,2],[1696,2],[2374,2]]},"617":{"position":[[709,2]]},"632":{"position":[[82,2]]},"639":{"position":[[205,2]]},"644":{"position":[[38,2]]},"660":{"position":[[150,2]]},"662":{"position":[[741,2]]},"696":{"position":[[378,2],[1318,2],[1379,2],[1423,2],[1969,2]]},"697":{"position":[[245,2]]},"709":{"position":[[180,2]]},"710":{"position":[[826,3]]},"711":{"position":[[520,2],[1411,2]]},"723":{"position":[[1223,2]]},"772":{"position":[[501,2],[1263,2],[1827,2]]},"773":{"position":[[409,2]]},"780":{"position":[[243,2]]},"782":{"position":[[262,2],[320,2]]},"786":{"position":[[110,2]]},"799":{"position":[[26,2],[200,2]]},"815":{"position":[[22,2],[91,2]]},"816":{"position":[[36,2]]},"829":{"position":[[823,2],[3772,2]]},"837":{"position":[[518,2]]},"838":{"position":[[1484,3]]},"861":{"position":[[174,3],[230,2],[371,2],[916,2]]},"862":{"position":[[22,2],[88,2]]},"872":{"position":[[173,2]]},"875":{"position":[[5805,2],[8860,2]]},"879":{"position":[[72,2]]},"886":{"position":[[480,2]]},"887":{"position":[[15,2]]},"890":{"position":[[306,3]]},"897":{"position":[[341,2]]},"903":{"position":[[658,2]]},"908":{"position":[[224,3]]},"913":{"position":[[49,2]]},"955":{"position":[[79,2]]},"976":{"position":[[55,2]]},"977":{"position":[[56,2]]},"984":{"position":[[116,2]]},"997":{"position":[[91,3]]},"1007":{"position":[[214,2]]},"1009":{"position":[[183,2],[1060,2]]},"1022":{"position":[[360,2]]},"1030":{"position":[[244,2]]},"1080":{"position":[[1113,2]]},"1089":{"position":[[198,2]]},"1092":{"position":[[67,2],[555,3]]},"1094":{"position":[[565,2]]},"1095":{"position":[[27,2],[105,2]]},"1114":{"position":[[141,2]]},"1124":{"position":[[1138,2]]},"1126":{"position":[[244,2]]},"1135":{"position":[[177,2]]},"1143":{"position":[[182,2]]},"1198":{"position":[[2000,2]]},"1209":{"position":[[195,2],[433,2]]},"1242":{"position":[[112,2]]},"1302":{"position":[[43,2]]},"1311":{"position":[[1823,2]]},"1316":{"position":[[237,2],[1211,2]]},"1317":{"position":[[341,2]]}},"keywords":{}}],["up"",{"_index":5907,"title":{},"content":{"1087":{"position":[[36,8]]}},"keywords":{}}],["up.indexeddb",{"_index":1960,"title":{},"content":{"336":{"position":[[161,12]]}},"keywords":{}}],["updat",{"_index":545,"title":{"53":{"position":[[26,8]]},"77":{"position":[[43,6]]},"103":{"position":[[43,6]]},"136":{"position":[[10,8]]},"233":{"position":[[36,8]]},"335":{"position":[[0,8]]},"490":{"position":[[24,8]]},"540":{"position":[[26,8]]},"600":{"position":[[26,8]]},"1041":{"position":[[0,9]]},"1048":{"position":[[11,6]]},"1059":{"position":[[0,9]]}},"content":{"34":{"position":[[648,8]]},"39":{"position":[[200,7]]},"52":{"position":[[454,6]]},"53":{"position":[[106,7]]},"61":{"position":[[109,8]]},"68":{"position":[[186,7]]},"75":{"position":[[117,8]]},"77":{"position":[[68,6]]},"79":{"position":[[98,7]]},"99":{"position":[[80,7],[244,8]]},"103":{"position":[[74,7]]},"106":{"position":[[167,8]]},"121":{"position":[[131,7]]},"124":{"position":[[141,6]]},"129":{"position":[[45,6]]},"135":{"position":[[60,7]]},"136":{"position":[[25,7],[217,7],[229,6]]},"140":{"position":[[216,8]]},"141":{"position":[[285,8]]},"146":{"position":[[80,8],[201,8]]},"151":{"position":[[192,8]]},"152":{"position":[[285,8]]},"155":{"position":[[273,7]]},"156":{"position":[[140,7]]},"159":{"position":[[205,7]]},"164":{"position":[[208,7]]},"173":{"position":[[171,8],[970,6]]},"174":{"position":[[301,6],[381,7],[1150,8]]},"175":{"position":[[568,8]]},"181":{"position":[[193,7]]},"182":{"position":[[158,6]]},"185":{"position":[[89,6],[290,7]]},"196":{"position":[[170,8]]},"203":{"position":[[38,7]]},"205":{"position":[[284,7],[380,7]]},"208":{"position":[[141,7],[256,8]]},"220":{"position":[[293,7]]},"221":{"position":[[47,7],[249,6]]},"226":{"position":[[193,8],[312,7]]},"233":{"position":[[102,6],[224,7]]},"234":{"position":[[139,7]]},"235":{"position":[[174,6]]},"240":{"position":[[233,7]]},"250":{"position":[[121,6]]},"255":{"position":[[114,7]]},"275":{"position":[[142,7]]},"283":{"position":[[318,7]]},"289":{"position":[[869,7],[1268,7]]},"312":{"position":[[121,7]]},"323":{"position":[[46,7]]},"326":{"position":[[110,8],[183,6]]},"327":{"position":[[149,6],[251,7]]},"329":{"position":[[166,7]]},"330":{"position":[[161,8]]},"339":{"position":[[25,6]]},"344":{"position":[[119,8]]},"346":{"position":[[798,8]]},"357":{"position":[[238,8]]},"358":{"position":[[479,8]]},"360":{"position":[[414,8],[545,7]]},"367":{"position":[[401,8]]},"368":{"position":[[370,7]]},"369":{"position":[[1038,8],[1277,7]]},"375":{"position":[[783,7]]},"376":{"position":[[102,7]]},"379":{"position":[[133,7]]},"386":{"position":[[324,8]]},"403":{"position":[[45,6],[268,7],[395,6]]},"410":{"position":[[1629,7],[1874,7],[2041,8]]},"411":{"position":[[685,8],[1261,7],[2381,8],[2977,7],[3552,7],[3678,7]]},"412":{"position":[[11425,7],[11670,9],[13919,6]]},"415":{"position":[[485,8]]},"418":{"position":[[620,8]]},"421":{"position":[[266,8]]},"445":{"position":[[973,8]]},"446":{"position":[[739,7]]},"455":{"position":[[617,6]]},"461":{"position":[[468,7]]},"475":{"position":[[137,7]]},"476":{"position":[[215,7]]},"479":{"position":[[171,7]]},"481":{"position":[[82,7],[742,7]]},"483":{"position":[[145,8],[347,7]]},"487":{"position":[[117,7]]},"489":{"position":[[134,8],[744,6]]},"490":{"position":[[318,8],[628,7]]},"491":{"position":[[369,7],[459,6],[1736,7]]},"493":{"position":[[379,7]]},"494":{"position":[[242,7],[586,8]]},"496":{"position":[[65,6]]},"497":{"position":[[756,7]]},"498":{"position":[[299,7]]},"500":{"position":[[467,8]]},"502":{"position":[[862,7]]},"509":{"position":[[119,7]]},"515":{"position":[[154,9]]},"516":{"position":[[206,7]]},"518":{"position":[[191,7],[343,7]]},"523":{"position":[[159,6]]},"529":{"position":[[244,8]]},"535":{"position":[[904,7]]},"539":{"position":[[454,6]]},"541":{"position":[[162,8],[795,8]]},"542":{"position":[[965,7]]},"555":{"position":[[618,6],[668,8]]},"562":{"position":[[860,6],[920,7]]},"566":{"position":[[557,7]]},"570":{"position":[[451,8],[580,7]]},"571":{"position":[[220,6],[789,6]]},"574":{"position":[[280,8]]},"575":{"position":[[265,7]]},"580":{"position":[[66,6]]},"582":{"position":[[510,6]]},"585":{"position":[[190,7]]},"590":{"position":[[352,8]]},"595":{"position":[[827,6],[979,7]]},"599":{"position":[[481,6]]},"600":{"position":[[125,7]]},"601":{"position":[[67,8],[776,8]]},"610":{"position":[[670,7],[1618,7]]},"611":{"position":[[581,8]]},"612":{"position":[[64,7],[310,7]]},"618":{"position":[[731,7]]},"621":{"position":[[509,8]]},"623":{"position":[[243,7],[403,7]]},"624":{"position":[[540,8],[832,8]]},"626":{"position":[[266,8],[862,7]]},"630":{"position":[[550,8],[602,7]]},"631":{"position":[[280,7]]},"632":{"position":[[164,7],[368,8],[1716,7],[1852,10],[2437,7]]},"634":{"position":[[286,7],[565,7]]},"678":{"position":[[49,6],[105,6],[135,6]]},"679":{"position":[[348,6]]},"685":{"position":[[399,6],[474,7]]},"688":{"position":[[67,8]]},"689":{"position":[[299,6]]},"691":{"position":[[97,7],[123,7],[617,8]]},"696":{"position":[[1875,6]]},"700":{"position":[[418,6]]},"702":{"position":[[170,6],[455,7],[799,7]]},"703":{"position":[[1554,7]]},"723":{"position":[[1131,7],[1504,7],[1558,7],[1979,7]]},"749":{"position":[[8926,6],[16397,6],[16527,6],[23713,8]]},"754":{"position":[[594,6]]},"757":{"position":[[306,7]]},"781":{"position":[[284,7],[419,7],[481,7],[520,6],[858,7]]},"801":{"position":[[511,7]]},"802":{"position":[[377,8]]},"829":{"position":[[2836,8],[2932,7],[3031,6]]},"836":{"position":[[1484,7],[2406,7]]},"838":{"position":[[473,7]]},"841":{"position":[[610,7]]},"860":{"position":[[685,6]]},"861":{"position":[[2527,6]]},"870":{"position":[[125,7]]},"871":{"position":[[197,7],[405,7]]},"876":{"position":[[473,6],[601,7]]},"879":{"position":[[10,6],[458,8],[510,6]]},"880":{"position":[[177,8],[244,6]]},"881":{"position":[[49,6]]},"885":{"position":[[326,6]]},"896":{"position":[[223,7]]},"898":{"position":[[1218,6],[1296,6]]},"903":{"position":[[103,8]]},"941":{"position":[[227,7]]},"944":{"position":[[397,6]]},"948":{"position":[[533,6]]},"965":{"position":[[167,7]]},"981":{"position":[[840,7],[1368,7]]},"995":{"position":[[1445,6]]},"1004":{"position":[[756,7]]},"1039":{"position":[[159,8]]},"1041":{"position":[[1,7],[41,6],[132,6]]},"1042":{"position":[[1,7]]},"1044":{"position":[[270,6]]},"1048":{"position":[[411,8]]},"1059":{"position":[[9,6],[73,8],[110,6]]},"1106":{"position":[[407,8]]},"1115":{"position":[[427,6]]},"1117":{"position":[[476,6]]},"1132":{"position":[[956,7]]},"1150":{"position":[[64,7]]},"1188":{"position":[[237,6]]},"1198":{"position":[[2145,6]]},"1278":{"position":[[121,6]]},"1314":{"position":[[415,6],[637,6]]},"1316":{"position":[[868,6],[1082,7]]},"1318":{"position":[[189,7],[1182,7]]},"1319":{"position":[[57,6]]},"1320":{"position":[[916,6]]}},"keywords":{}}],["update:appl",{"_index":6474,"title":{},"content":{"1301":{"position":[[1067,12]]}},"keywords":{}}],["update_modified_datetim",{"_index":5205,"title":{},"content":{"898":{"position":[[1264,24]]}},"keywords":{}}],["updateat",{"_index":4994,"title":{},"content":{"875":{"position":[[2318,8],[2386,9],[2449,9],[2483,9],[4924,8]]}},"keywords":{}}],["updatecrdt",{"_index":3882,"title":{},"content":{"682":{"position":[[256,12]]}},"keywords":{}}],["updated/ad",{"_index":5549,"title":{},"content":{"1004":{"position":[[458,13]]}},"keywords":{}}],["updatedat",{"_index":2693,"title":{},"content":{"412":{"position":[[4928,9]]},"875":{"position":[[1660,9],[2137,9],[2277,9],[2466,9],[2500,9],[2669,9],[2716,10],[3192,9],[5408,10]]},"885":{"position":[[581,10],[676,10],[747,10],[1644,9],[2211,9],[2555,10]]},"886":{"position":[[542,10],[713,9],[749,9],[2427,9],[3626,10],[3664,9]]},"888":{"position":[[1159,10]]},"984":{"position":[[429,9]]},"986":{"position":[[1196,10]]},"988":{"position":[[4413,10],[5456,10],[5515,10]]},"991":{"position":[[133,9]]},"1309":{"position":[[852,9]]}},"keywords":{}}],["updatedat+id",{"_index":5449,"title":{},"content":{"986":{"position":[[1299,12]]}},"keywords":{}}],["updates.transpar",{"_index":3895,"title":{},"content":{"688":{"position":[[1017,20]]}},"keywords":{}}],["updates.y",{"_index":3909,"title":{},"content":{"690":{"position":[[393,11]]}},"keywords":{}}],["updates—keep",{"_index":3107,"title":{},"content":{"476":{"position":[[298,15]]}},"keywords":{}}],["upfront",{"_index":2432,"title":{},"content":{"399":{"position":[[501,8]]}},"keywords":{}}],["upgrad",{"_index":1890,"title":{},"content":{"314":{"position":[[929,7]]},"412":{"position":[[11287,9],[11463,7]]},"483":{"position":[[978,7]]},"636":{"position":[[132,7]]},"876":{"position":[[399,9]]},"990":{"position":[[1102,7]]}},"keywords":{}}],["upload",{"_index":3027,"title":{},"content":{"462":{"position":[[636,7]]}},"keywords":{}}],["upon",{"_index":1406,"title":{},"content":{"226":{"position":[[95,4]]},"287":{"position":[[1227,4]]},"480":{"position":[[112,4]]},"631":{"position":[[288,4]]},"636":{"position":[[337,4]]},"751":{"position":[[1,4]]}},"keywords":{}}],["upper",{"_index":2718,"title":{},"content":{"412":{"position":[[7236,5]]},"461":{"position":[[1068,5]]}},"keywords":{}}],["uproot",{"_index":2664,"title":{},"content":{"412":{"position":[[1467,8]]}},"keywords":{}}],["upsert",{"_index":5342,"title":{"946":{"position":[[0,9]]}},"content":{"947":{"position":[[9,8],[98,8]]},"948":{"position":[[19,6],[157,9],[203,6],[297,6],[703,6]]}},"keywords":{}}],["upsertloc",{"_index":5602,"title":{"1015":{"position":[[0,14]]}},"content":{},"keywords":{}}],["upsid",{"_index":2661,"title":{},"content":{"412":{"position":[[1181,6]]}},"keywords":{}}],["url",{"_index":3586,"title":{},"content":{"612":{"position":[[775,3]]},"616":{"position":[[803,3]]},"749":{"position":[[16133,3]]},"846":{"position":[[242,3],[281,4]]},"848":{"position":[[200,5],[607,4],[756,4],[1391,4]]},"851":{"position":[[227,4]]},"852":{"position":[[274,4]]},"872":{"position":[[4543,4]]},"875":{"position":[[3020,3],[7952,3]]},"876":{"position":[[455,5]]},"878":{"position":[[145,3],[380,4],[428,3]]},"879":{"position":[[104,3]]},"886":{"position":[[1061,4],[1091,4],[2693,4],[2723,4],[3880,4],[3910,4],[4036,4],[4579,6]]},"887":{"position":[[343,4]]},"888":{"position":[[484,4]]},"889":{"position":[[533,4]]},"893":{"position":[[402,4]]},"904":{"position":[[2620,4]]},"988":{"position":[[494,3]]},"1100":{"position":[[512,4],[531,4]]},"1101":{"position":[[753,4]]},"1149":{"position":[[1403,3],[1432,4]]},"1219":{"position":[[939,4]]},"1220":{"position":[[502,4]]},"1229":{"position":[[23,3]]},"1268":{"position":[[23,3]]}},"keywords":{}}],["url("worker.js"",{"_index":2265,"title":{},"content":{"392":{"position":[[3936,26]]}},"keywords":{}}],["url('./mi",{"_index":6329,"title":{},"content":{"1268":{"position":[[492,9]]}},"keywords":{}}],["us",{"_index":4,"title":{"46":{"position":[[4,3]]},"47":{"position":[[4,5]]},"87":{"position":[[0,3]]},"96":{"position":[[0,5]]},"127":{"position":[[0,5]]},"130":{"position":[[0,3]]},"142":{"position":[[19,5]]},"143":{"position":[[0,3]]},"144":{"position":[[0,3]]},"145":{"position":[[0,3]]},"171":{"position":[[0,5]]},"187":{"position":[[0,5]]},"202":{"position":[[14,3]]},"249":{"position":[[14,3]]},"267":{"position":[[0,3]]},"284":{"position":[[0,5]]},"286":{"position":[[0,5]]},"332":{"position":[[0,5]]},"346":{"position":[[19,5]]},"372":{"position":[[0,5]]},"375":{"position":[[0,3]]},"420":{"position":[[19,3]]},"423":{"position":[[0,5]]},"428":{"position":[[17,3]]},"430":{"position":[[12,3]]},"431":{"position":[[8,3]]},"446":{"position":[[0,3]]},"497":{"position":[[23,3]]},"503":{"position":[[0,5]]},"522":{"position":[[0,5]]},"523":{"position":[[0,5]]},"534":{"position":[[4,3]]},"535":{"position":[[11,3]]},"563":{"position":[[8,5]]},"590":{"position":[[19,5]]},"594":{"position":[[4,3]]},"595":{"position":[[11,3]]},"601":{"position":[[0,5]]},"602":{"position":[[0,5]]},"624":{"position":[[20,3]]},"655":{"position":[[0,5]]},"687":{"position":[[12,3]]},"717":{"position":[[0,5]]},"718":{"position":[[0,5]]},"723":{"position":[[12,5]]},"724":{"position":[[0,5]]},"736":{"position":[[0,3]]},"745":{"position":[[0,5]]},"747":{"position":[[0,5]]},"765":{"position":[[0,3]]},"795":{"position":[[0,3]]},"802":{"position":[[0,3]]},"818":{"position":[[0,5]]},"857":{"position":[[0,5]]},"860":{"position":[[15,3]]},"904":{"position":[[0,5]]},"1021":{"position":[[0,3]]},"1029":{"position":[[0,5]]},"1089":{"position":[[0,5]]},"1090":{"position":[[0,3]]},"1095":{"position":[[0,3]]},"1098":{"position":[[0,5]]},"1099":{"position":[[0,5]]},"1124":{"position":[[0,3]]},"1125":{"position":[[0,5]]},"1126":{"position":[[0,5]]},"1138":{"position":[[0,5]]},"1144":{"position":[[7,3]]},"1146":{"position":[[0,5]]},"1148":{"position":[[3,3]]},"1149":{"position":[[3,3]]},"1158":{"position":[[7,3]]},"1177":{"position":[[0,5]]},"1182":{"position":[[0,5]]},"1189":{"position":[[0,5]]},"1204":{"position":[[0,5]]},"1210":{"position":[[0,5]]},"1211":{"position":[[0,5]]},"1213":{"position":[[57,4]]},"1222":{"position":[[0,5]]},"1257":{"position":[[10,3]]},"1271":{"position":[[0,5]]},"1273":{"position":[[0,5]]},"1293":{"position":[[34,3]]},"1310":{"position":[[0,5]]},"1311":{"position":[[0,5]]}},"content":{"1":{"position":[[29,3],[189,3]]},"2":{"position":[[24,3]]},"3":{"position":[[59,3]]},"4":{"position":[[51,4],[253,3]]},"5":{"position":[[126,3]]},"6":{"position":[[14,4],[170,4],[618,3]]},"7":{"position":[[14,4],[144,4],[180,3],[453,3]]},"8":{"position":[[1,4],[96,3],[629,5],[696,3]]},"9":{"position":[[1,4],[113,3]]},"11":{"position":[[1,4],[55,4]]},"13":{"position":[[296,3]]},"14":{"position":[[911,3],[999,4]]},"15":{"position":[[354,4]]},"16":{"position":[[477,4]]},"17":{"position":[[135,4],[290,4],[399,4]]},"19":{"position":[[1007,3]]},"21":{"position":[[65,6]]},"24":{"position":[[636,3]]},"25":{"position":[[111,4]]},"26":{"position":[[221,4]]},"27":{"position":[[215,4]]},"28":{"position":[[656,5]]},"29":{"position":[[245,6]]},"30":{"position":[[61,4]]},"33":{"position":[[469,4],[542,5]]},"34":{"position":[[107,4]]},"35":{"position":[[504,6]]},"36":{"position":[[481,3]]},"38":{"position":[[635,4],[768,4],[917,3]]},"39":{"position":[[388,4]]},"42":{"position":[[272,3]]},"43":{"position":[[267,4],[322,4],[653,3]]},"45":{"position":[[296,3]]},"46":{"position":[[170,5]]},"51":{"position":[[73,5]]},"55":{"position":[[150,5],[1002,3]]},"56":{"position":[[171,5]]},"57":{"position":[[441,5]]},"58":{"position":[[37,3],[123,3]]},"59":{"position":[[264,3]]},"63":{"position":[[163,4]]},"65":{"position":[[209,4],[622,3],[1434,5]]},"68":{"position":[[21,3]]},"73":{"position":[[23,4]]},"84":{"position":[[399,5]]},"105":{"position":[[22,4]]},"114":{"position":[[412,5]]},"122":{"position":[[300,6]]},"128":{"position":[[4,3],[114,5],[268,5]]},"129":{"position":[[9,4],[312,5]]},"130":{"position":[[173,3]]},"131":{"position":[[132,4],[824,6]]},"132":{"position":[[252,5]]},"133":{"position":[[294,6]]},"139":{"position":[[58,5]]},"141":{"position":[[231,6]]},"143":{"position":[[83,5]]},"149":{"position":[[412,5]]},"162":{"position":[[554,4],[814,3]]},"165":{"position":[[166,5]]},"173":{"position":[[243,5],[3129,4]]},"175":{"position":[[403,5]]},"177":{"position":[[172,5]]},"185":{"position":[[159,6]]},"188":{"position":[[122,4],[297,4],[411,3],[535,4],[1622,3],[2058,3]]},"189":{"position":[[175,4],[328,4],[600,6]]},"194":{"position":[[25,4]]},"197":{"position":[[132,4]]},"202":{"position":[[295,5]]},"203":{"position":[[178,5]]},"207":{"position":[[122,4]]},"210":{"position":[[16,5]]},"211":{"position":[[539,3]]},"212":{"position":[[14,4],[589,4]]},"215":{"position":[[198,5],[298,6]]},"218":{"position":[[169,5]]},"225":{"position":[[80,4]]},"230":{"position":[[67,5]]},"231":{"position":[[31,5],[182,5]]},"238":{"position":[[126,5]]},"239":{"position":[[173,5]]},"241":{"position":[[46,5]]},"251":{"position":[[232,5]]},"254":{"position":[[351,3]]},"255":{"position":[[1658,5]]},"260":{"position":[[1,3]]},"261":{"position":[[96,5],[525,3]]},"265":{"position":[[30,5]]},"266":{"position":[[867,4],[1003,3],[1082,6]]},"267":{"position":[[90,3],[1452,3]]},"269":{"position":[[183,5]]},"284":{"position":[[146,3]]},"287":{"position":[[126,3],[819,6]]},"298":{"position":[[212,3],[519,3]]},"299":{"position":[[1498,4]]},"300":{"position":[[75,3],[157,4],[408,4]]},"303":{"position":[[137,4],[1244,5]]},"313":{"position":[[108,3]]},"314":{"position":[[72,3]]},"315":{"position":[[128,5]]},"320":{"position":[[130,3]]},"321":{"position":[[440,3]]},"325":{"position":[[277,3]]},"326":{"position":[[8,3]]},"331":{"position":[[39,3]]},"333":{"position":[[131,3]]},"334":{"position":[[159,4]]},"335":{"position":[[69,3],[134,5]]},"336":{"position":[[108,4],[254,4],[424,4]]},"344":{"position":[[1,3]]},"347":{"position":[[410,5]]},"357":{"position":[[637,4]]},"360":{"position":[[259,4]]},"362":{"position":[[1481,5]]},"364":{"position":[[90,4],[125,5]]},"365":{"position":[[1008,5]]},"366":{"position":[[601,4]]},"367":{"position":[[562,4]]},"372":{"position":[[34,3]]},"373":{"position":[[46,5]]},"376":{"position":[[463,5]]},"383":{"position":[[148,5]]},"386":{"position":[[60,3]]},"390":{"position":[[1080,3],[1719,3]]},"391":{"position":[[382,5]]},"392":{"position":[[181,3],[790,3],[862,4],[2213,3],[3212,5],[5028,6]]},"393":{"position":[[464,3]]},"396":{"position":[[660,4],[870,5],[1736,3],[1893,3]]},"398":{"position":[[356,3]]},"399":{"position":[[297,5]]},"400":{"position":[[518,3],[541,4]]},"401":{"position":[[930,3]]},"402":{"position":[[1004,5],[1159,4],[1198,5],[1704,3],[1927,4],[2012,4],[2055,4],[2357,3]]},"403":{"position":[[78,4]]},"405":{"position":[[106,3]]},"408":{"position":[[3334,3],[3342,5],[4677,3],[4758,3],[5229,6]]},"409":{"position":[[74,3]]},"410":{"position":[[1021,5]]},"411":{"position":[[2295,6],[3507,5],[4171,3],[4926,3]]},"412":{"position":[[256,3],[856,3],[1757,3],[2918,3],[3283,3],[3754,5],[3911,5],[4535,4],[4588,4],[4663,4],[5226,3],[6386,3],[7128,3],[7931,4],[9058,4],[10039,4],[12976,5],[13231,4],[14416,3],[14477,3],[14814,3],[15331,3]]},"416":{"position":[[293,4]]},"418":{"position":[[198,3]]},"419":{"position":[[1516,3],[1706,5]]},"420":{"position":[[455,5],[591,4],[1135,5],[1454,3]]},"422":{"position":[[159,3],[381,4]]},"425":{"position":[[262,5],[341,5],[429,5]]},"429":{"position":[[484,4]]},"430":{"position":[[73,3],[1028,5]]},"432":{"position":[[766,3],[1018,5]]},"433":{"position":[[423,5]]},"436":{"position":[[383,3]]},"439":{"position":[[104,3],[305,4],[637,5]]},"440":{"position":[[260,3],[384,3],[430,3]]},"444":{"position":[[417,3]]},"445":{"position":[[985,4]]},"447":{"position":[[546,4]]},"449":{"position":[[75,3]]},"450":{"position":[[113,4]]},"452":{"position":[[189,4],[801,7]]},"453":{"position":[[266,4],[561,3]]},"454":{"position":[[502,3]]},"455":{"position":[[66,3],[188,5],[527,3],[918,5]]},"456":{"position":[[130,5]]},"457":{"position":[[373,3]]},"458":{"position":[[420,5],[683,4],[1066,3],[1311,4],[1381,4],[1447,3]]},"460":{"position":[[259,3],[344,3],[457,3],[741,4],[1073,4],[1178,4]]},"461":{"position":[[1177,3]]},"462":{"position":[[240,3]]},"463":{"position":[[313,5],[1218,5]]},"464":{"position":[[1369,5]]},"468":{"position":[[136,4],[217,3],[320,4],[394,5],[628,4]]},"469":{"position":[[235,3],[950,5]]},"471":{"position":[[91,3]]},"481":{"position":[[6,4]]},"490":{"position":[[495,4]]},"491":{"position":[[1652,3]]},"494":{"position":[[488,3]]},"495":{"position":[[222,4]]},"496":{"position":[[215,3]]},"497":{"position":[[9,3],[272,3]]},"511":{"position":[[412,5]]},"520":{"position":[[415,4]]},"521":{"position":[[1,5],[267,4]]},"524":{"position":[[402,4],[647,4],[679,5],[737,5],[903,5]]},"531":{"position":[[412,5]]},"534":{"position":[[154,5],[311,5]]},"535":{"position":[[1277,3]]},"538":{"position":[[205,5]]},"540":{"position":[[155,5]]},"542":{"position":[[709,5]]},"543":{"position":[[28,5],[234,3]]},"544":{"position":[[396,5]]},"548":{"position":[[14,3],[145,7]]},"551":{"position":[[283,3]]},"554":{"position":[[106,3],[277,5],[317,4],[407,3],[626,3],[687,3]]},"555":{"position":[[803,4]]},"556":{"position":[[218,5],[1097,5],[1366,3],[1559,3]]},"557":{"position":[[14,3],[94,5],[182,3]]},"559":{"position":[[1550,3]]},"560":{"position":[[558,3]]},"562":{"position":[[1606,5]]},"563":{"position":[[650,5]]},"566":{"position":[[770,4]]},"567":{"position":[[898,5]]},"570":{"position":[[737,3]]},"577":{"position":[[37,5]]},"579":{"position":[[115,5]]},"580":{"position":[[186,3]]},"581":{"position":[[155,4],[260,4]]},"590":{"position":[[270,3],[429,5]]},"591":{"position":[[410,5]]},"594":{"position":[[152,5],[309,5]]},"598":{"position":[[206,5]]},"603":{"position":[[28,5],[232,3]]},"604":{"position":[[330,5]]},"608":{"position":[[14,3],[145,7]]},"610":{"position":[[100,4]]},"611":{"position":[[958,3],[1290,3]]},"613":{"position":[[733,3],[972,3],[1066,5]]},"614":{"position":[[554,4],[744,3],[990,5]]},"616":{"position":[[973,4],[1196,3]]},"617":{"position":[[482,3],[705,3],[964,5],[1126,3],[1178,3],[1277,3],[1899,3],[2331,3]]},"618":{"position":[[134,4]]},"619":{"position":[[251,5],[349,4]]},"620":{"position":[[690,3]]},"623":{"position":[[280,4],[337,4]]},"624":{"position":[[100,3],[1326,3],[1591,3]]},"626":{"position":[[635,4],[741,4],[899,4]]},"627":{"position":[[64,5]]},"628":{"position":[[98,3],[193,3]]},"632":{"position":[[1238,5]]},"635":{"position":[[215,4]]},"642":{"position":[[78,5]]},"653":{"position":[[78,3],[1371,4]]},"655":{"position":[[335,3]]},"656":{"position":[[381,3]]},"659":{"position":[[190,3]]},"660":{"position":[[199,3]]},"661":{"position":[[214,3],[424,3],[808,3],[1413,5],[1843,3]]},"662":{"position":[[450,4],[528,3],[936,3],[1091,3],[1176,3]]},"675":{"position":[[117,3]]},"676":{"position":[[6,4],[110,4]]},"678":{"position":[[177,4]]},"679":{"position":[[168,4]]},"680":{"position":[[4,3],[274,3],[995,3]]},"681":{"position":[[228,5],[607,5]]},"682":{"position":[[150,3]]},"683":{"position":[[533,3],[655,3]]},"686":{"position":[[76,4],[161,3],[302,3],[413,4],[499,5],[731,5],[779,3]]},"687":{"position":[[18,3],[227,3],[268,5]]},"688":{"position":[[167,3],[218,3]]},"689":{"position":[[534,5]]},"690":{"position":[[1,3],[233,3]]},"693":{"position":[[4,3],[530,3]]},"696":{"position":[[944,3],[1054,4],[1314,3]]},"697":{"position":[[176,4]]},"698":{"position":[[955,3],[3065,5],[3163,3]]},"700":{"position":[[919,3],[1018,3]]},"703":{"position":[[686,3],[1256,3],[1619,3]]},"705":{"position":[[310,3]]},"707":{"position":[[424,3]]},"708":{"position":[[92,3],[533,3]]},"709":{"position":[[18,4],[890,5],[1184,5],[1232,5],[1296,3]]},"710":{"position":[[110,4],[360,4],[487,3],[739,3],[952,3],[1020,5],[1233,3],[2307,3],[2466,5]]},"711":{"position":[[245,5],[427,3],[704,3],[1910,5]]},"712":{"position":[[14,3],[199,3]]},"714":{"position":[[518,4],[1002,3]]},"716":{"position":[[30,4],[446,3]]},"717":{"position":[[272,4],[380,4],[1046,5]]},"719":{"position":[[216,3]]},"721":{"position":[[12,5],[251,3]]},"723":{"position":[[803,4],[1919,5],[2291,3]]},"724":{"position":[[571,4],[1682,3]]},"728":{"position":[[135,3]]},"729":{"position":[[10,3]]},"730":{"position":[[85,3]]},"736":{"position":[[266,5]]},"737":{"position":[[505,3]]},"746":{"position":[[367,4],[619,4]]},"749":{"position":[[744,4],[881,4],[1031,4],[1780,3],[2125,4],[2874,3],[3207,4],[3575,4],[4258,4],[4390,3],[4641,3],[5046,3],[5656,3],[6133,4],[6881,4],[7233,3],[12065,3],[12782,3],[13670,3],[20022,4],[20158,4],[20323,4],[20481,4],[20582,4],[20750,4],[20921,3],[21773,3],[22607,4],[22762,4],[22853,3],[22948,4],[23793,4]]},"751":{"position":[[762,5]]},"752":{"position":[[1374,3]]},"753":{"position":[[119,3]]},"755":{"position":[[8,3]]},"756":{"position":[[8,3]]},"759":{"position":[[534,5]]},"760":{"position":[[530,5]]},"761":{"position":[[77,3],[256,3]]},"764":{"position":[[276,6]]},"765":{"position":[[16,6]]},"770":{"position":[[67,3],[218,3]]},"772":{"position":[[593,3],[1882,3],[2108,4]]},"773":{"position":[[27,3],[53,3],[340,4],[358,4]]},"774":{"position":[[107,3],[374,5],[411,4]]},"775":{"position":[[1,5],[624,3]]},"776":{"position":[[240,3],[286,4]]},"783":{"position":[[17,4],[250,3],[310,4]]},"785":{"position":[[260,3]]},"789":{"position":[[336,3]]},"791":{"position":[[237,3]]},"795":{"position":[[68,3]]},"796":{"position":[[791,3]]},"797":{"position":[[228,5]]},"798":{"position":[[753,5],[1001,4]]},"799":{"position":[[356,3],[404,3]]},"800":{"position":[[613,4]]},"801":{"position":[[105,3],[893,3]]},"802":{"position":[[594,3]]},"806":{"position":[[731,3]]},"808":{"position":[[463,5]]},"810":{"position":[[41,3]]},"815":{"position":[[284,3]]},"816":{"position":[[418,4]]},"817":{"position":[[164,4]]},"820":{"position":[[234,3],[294,4],[512,3]]},"821":{"position":[[39,3],[160,3],[294,3],[483,3],[555,3],[770,3]]},"824":{"position":[[436,5]]},"825":{"position":[[33,3],[502,3],[1082,4]]},"828":{"position":[[376,4]]},"829":{"position":[[909,3],[1025,5],[2292,3]]},"830":{"position":[[274,5]]},"831":{"position":[[192,5]]},"834":{"position":[[51,4],[102,3],[120,3]]},"835":{"position":[[665,3]]},"836":{"position":[[216,3],[357,5],[388,3],[1141,5],[1260,5]]},"837":{"position":[[290,4],[834,3],[1014,3],[1048,3],[1224,3],[2013,4]]},"838":{"position":[[970,4],[1183,3],[1210,3],[1397,3],[1614,3],[2263,3],[2389,5],[3081,5],[3190,5],[3391,3]]},"839":{"position":[[477,3],[1208,4]]},"840":{"position":[[471,5],[656,3]]},"842":{"position":[[21,5],[109,3]]},"846":{"position":[[1398,4],[1527,4],[1550,4]]},"847":{"position":[[86,5]]},"849":{"position":[[418,3],[563,3],[698,3],[733,3],[777,3]]},"854":{"position":[[1125,3],[1207,4],[1699,3]]},"857":{"position":[[17,4],[569,3]]},"858":{"position":[[113,5],[467,3]]},"861":{"position":[[16,3],[93,3],[1458,3],[2019,3],[2249,4]]},"863":{"position":[[919,3]]},"865":{"position":[[179,3]]},"871":{"position":[[777,3]]},"872":{"position":[[309,5],[429,5],[1489,3],[3048,4]]},"875":{"position":[[1370,4],[1541,3],[1581,4],[1639,3],[1711,4],[4223,4],[4351,4],[5666,3],[6566,4],[6927,3],[7037,3],[7091,4]]},"882":{"position":[[60,4]]},"884":{"position":[[12,3]]},"885":{"position":[[103,4],[1231,4],[2421,3]]},"886":{"position":[[283,3],[1448,5],[1795,4],[4020,3],[5011,3]]},"888":{"position":[[260,3]]},"889":{"position":[[986,4],[1063,3]]},"890":{"position":[[94,4],[416,4]]},"894":{"position":[[4,3],[39,3]]},"897":{"position":[[77,5],[151,5],[235,5],[291,5],[528,3]]},"898":{"position":[[574,3],[2053,3],[2128,3],[2808,3],[2869,3]]},"901":{"position":[[256,4]]},"902":{"position":[[938,3]]},"904":{"position":[[12,3],[1723,4],[2030,3],[2220,3],[2361,3],[2395,4],[2636,3],[2713,3]]},"906":{"position":[[238,4],[427,3],[542,4],[813,4]]},"910":{"position":[[104,4],[162,3]]},"911":{"position":[[289,3],[457,3]]},"912":{"position":[[53,5]]},"916":{"position":[[16,3]]},"917":{"position":[[466,3],[535,5],[558,3]]},"932":{"position":[[565,3]]},"934":{"position":[[547,4],[811,4]]},"935":{"position":[[59,4]]},"936":{"position":[[77,4]]},"942":{"position":[[1,3]]},"943":{"position":[[163,6]]},"944":{"position":[[49,3]]},"945":{"position":[[49,3],[311,3]]},"949":{"position":[[39,3]]},"950":{"position":[[185,3]]},"952":{"position":[[1,3],[127,5]]},"953":{"position":[[47,3]]},"958":{"position":[[356,3]]},"961":{"position":[[115,3],[274,4]]},"962":{"position":[[120,3],[209,3],[228,3],[382,4],[477,3],[526,3],[604,3],[841,3]]},"963":{"position":[[26,3]]},"965":{"position":[[213,4]]},"968":{"position":[[23,3]]},"971":{"position":[[1,3],[239,5]]},"972":{"position":[[46,3]]},"975":{"position":[[167,3]]},"977":{"position":[[39,3],[196,5],[230,6]]},"981":{"position":[[729,3],[1525,4]]},"983":{"position":[[52,3]]},"984":{"position":[[102,4],[463,4]]},"986":{"position":[[4,3],[262,5],[546,4],[1444,4]]},"987":{"position":[[809,3]]},"988":{"position":[[1146,3],[1786,4],[2196,5],[3089,4],[4569,4],[4942,3],[5013,5]]},"989":{"position":[[80,4],[234,4]]},"990":{"position":[[385,3],[614,4],[988,3],[1147,4]]},"991":{"position":[[156,3]]},"992":{"position":[[79,4]]},"995":{"position":[[498,4],[1191,5],[1350,5],[1427,3]]},"996":{"position":[[124,4]]},"999":{"position":[[88,4]]},"1006":{"position":[[143,3]]},"1014":{"position":[[284,3]]},"1020":{"position":[[118,4],[274,4]]},"1021":{"position":[[86,3]]},"1024":{"position":[[86,3]]},"1033":{"position":[[354,5]]},"1040":{"position":[[106,5]]},"1044":{"position":[[113,4],[237,3]]},"1047":{"position":[[207,3]]},"1048":{"position":[[114,6],[130,3]]},"1051":{"position":[[128,3]]},"1052":{"position":[[468,3]]},"1058":{"position":[[103,4]]},"1059":{"position":[[65,3]]},"1064":{"position":[[4,3],[44,3],[264,3]]},"1065":{"position":[[113,3],[157,3],[334,5],[562,5],[908,5]]},"1066":{"position":[[134,5],[303,5],[559,5]]},"1067":{"position":[[118,3],[269,5],[1073,5],[1261,5],[1720,3]]},"1071":{"position":[[39,4],[102,3]]},"1072":{"position":[[2537,3]]},"1074":{"position":[[219,4]]},"1077":{"position":[[74,4]]},"1078":{"position":[[351,4],[442,4],[756,5]]},"1079":{"position":[[181,3]]},"1080":{"position":[[312,4],[502,4],[777,4],[1037,3],[1084,3]]},"1081":{"position":[[4,3]]},"1082":{"position":[[443,4]]},"1084":{"position":[[24,4],[101,4],[219,3],[576,4]]},"1085":{"position":[[668,3],[3509,3]]},"1088":{"position":[[390,3]]},"1089":{"position":[[213,5]]},"1090":{"position":[[61,3],[389,3]]},"1091":{"position":[[135,3]]},"1092":{"position":[[24,3],[386,6]]},"1093":{"position":[[284,5]]},"1094":{"position":[[203,3]]},"1097":{"position":[[401,3]]},"1098":{"position":[[44,3]]},"1099":{"position":[[44,3]]},"1101":{"position":[[172,4]]},"1102":{"position":[[135,3],[821,5]]},"1104":{"position":[[181,4],[443,4],[816,4]]},"1105":{"position":[[53,4],[251,4],[394,3],[447,3],[870,3]]},"1106":{"position":[[55,4],[265,4]]},"1107":{"position":[[153,3],[384,4],[472,3],[976,3]]},"1108":{"position":[[252,3],[354,4],[627,4]]},"1111":{"position":[[89,5]]},"1112":{"position":[[226,3]]},"1114":{"position":[[123,4],[163,3]]},"1115":{"position":[[232,3],[508,4]]},"1117":{"position":[[193,5]]},"1118":{"position":[[120,3],[190,6],[224,3]]},"1120":{"position":[[389,4],[540,3]]},"1121":{"position":[[84,3]]},"1123":{"position":[[660,5]]},"1124":{"position":[[1,5],[96,3],[446,3],[1217,4],[1326,3],[2094,3]]},"1125":{"position":[[4,3],[491,4],[899,3]]},"1126":{"position":[[10,3],[447,3],[768,3]]},"1130":{"position":[[321,3]]},"1132":{"position":[[1,5],[71,5],[170,4]]},"1133":{"position":[[46,4],[360,3],[606,5],[661,3]]},"1134":{"position":[[523,3]]},"1135":{"position":[[75,3],[226,3]]},"1138":{"position":[[4,3],[84,3]]},"1139":{"position":[[155,5]]},"1140":{"position":[[304,3],[375,3]]},"1141":{"position":[[174,3]]},"1143":{"position":[[33,4],[313,4],[343,3]]},"1145":{"position":[[151,5]]},"1146":{"position":[[91,3],[138,3]]},"1147":{"position":[[125,5]]},"1149":{"position":[[81,3],[254,6],[568,5]]},"1151":{"position":[[88,5],[635,3],[762,3]]},"1152":{"position":[[67,3]]},"1154":{"position":[[536,3],[590,3]]},"1157":{"position":[[369,4]]},"1159":{"position":[[107,5],[167,4]]},"1161":{"position":[[206,4]]},"1162":{"position":[[308,4],[1080,5]]},"1163":{"position":[[183,3],[269,5]]},"1164":{"position":[[559,3]]},"1165":{"position":[[160,3],[543,3],[1004,3]]},"1167":{"position":[[14,4]]},"1171":{"position":[[232,4]]},"1172":{"position":[[169,3]]},"1174":{"position":[[10,3],[64,4]]},"1175":{"position":[[6,5]]},"1176":{"position":[[131,4]]},"1177":{"position":[[156,3]]},"1178":{"position":[[88,5],[634,3],[761,3]]},"1180":{"position":[[206,4]]},"1181":{"position":[[395,4]]},"1182":{"position":[[183,3],[269,5]]},"1183":{"position":[[136,3],[223,4],[269,3],[533,3]]},"1184":{"position":[[83,3],[251,3]]},"1188":{"position":[[26,5]]},"1189":{"position":[[94,3],[164,3]]},"1191":{"position":[[398,3],[500,3]]},"1192":{"position":[[561,4],[689,3]]},"1193":{"position":[[189,3],[281,3]]},"1195":{"position":[[126,3]]},"1196":{"position":[[79,5],[170,3]]},"1198":{"position":[[58,3],[1322,3],[1477,3],[1522,3],[1726,5],[1822,3],[2043,5]]},"1202":{"position":[[10,3]]},"1204":{"position":[[157,3]]},"1206":{"position":[[602,3]]},"1207":{"position":[[381,4]]},"1208":{"position":[[43,4],[227,4],[392,5],[576,3]]},"1210":{"position":[[69,3]]},"1211":{"position":[[121,3],[327,4],[395,5]]},"1213":{"position":[[10,3],[62,3],[345,4],[374,5],[778,3]]},"1214":{"position":[[259,3],[342,3],[757,3],[875,3],[966,4]]},"1215":{"position":[[283,3]]},"1219":{"position":[[119,4]]},"1220":{"position":[[32,4]]},"1222":{"position":[[291,3],[348,3],[1049,3]]},"1225":{"position":[[393,3]]},"1226":{"position":[[330,4]]},"1227":{"position":[[194,4],[417,3],[501,4]]},"1228":{"position":[[145,4]]},"1229":{"position":[[144,4]]},"1231":{"position":[[34,5]]},"1233":{"position":[[7,3],[117,3],[164,3]]},"1235":{"position":[[17,3],[106,3],[282,3],[393,3],[459,3]]},"1237":{"position":[[110,3],[256,3],[408,4]]},"1238":{"position":[[142,3],[374,3]]},"1239":{"position":[[111,4],[213,4],[368,3]]},"1241":{"position":[[113,4]]},"1243":{"position":[[63,3]]},"1244":{"position":[[139,4]]},"1245":{"position":[[53,3]]},"1246":{"position":[[700,3],[882,4],[1355,4],[1490,3],[1720,4],[1828,4],[1961,4],[2030,3]]},"1247":{"position":[[67,4],[255,3],[440,3],[610,3]]},"1249":{"position":[[323,5]]},"1250":{"position":[[19,4]]},"1251":{"position":[[119,5],[175,4]]},"1252":{"position":[[4,5]]},"1263":{"position":[[287,3]]},"1264":{"position":[[246,4]]},"1265":{"position":[[187,4],[410,3],[495,4]]},"1266":{"position":[[57,5],[112,4],[787,4]]},"1267":{"position":[[309,3],[550,3]]},"1271":{"position":[[364,5],[502,3],[710,3],[895,4],[917,4],[1251,3],[1318,4]]},"1272":{"position":[[313,5]]},"1274":{"position":[[158,3]]},"1275":{"position":[[44,3]]},"1276":{"position":[[24,3],[116,3],[552,3]]},"1277":{"position":[[110,3],[482,5],[669,3]]},"1278":{"position":[[35,4],[80,3],[154,3],[195,3],[673,3]]},"1279":{"position":[[230,3]]},"1281":{"position":[[70,3]]},"1282":{"position":[[63,4],[370,3],[433,4]]},"1284":{"position":[[134,5],[418,3]]},"1286":{"position":[[66,5]]},"1287":{"position":[[40,3],[175,5],[217,3]]},"1288":{"position":[[128,4]]},"1292":{"position":[[42,5],[515,4]]},"1294":{"position":[[1846,5],[2117,4]]},"1295":{"position":[[35,4],[402,3],[1528,4]]},"1296":{"position":[[493,3],[1189,3],[1602,5],[1725,5],[1857,4]]},"1297":{"position":[[400,5]]},"1299":{"position":[[86,5],[404,4]]},"1300":{"position":[[30,5]]},"1301":{"position":[[89,3],[578,3],[1138,3]]},"1304":{"position":[[2026,5]]},"1307":{"position":[[678,5]]},"1309":{"position":[[167,4],[589,4],[1022,3]]},"1311":{"position":[[48,3],[1412,3],[1637,3],[1678,3]]},"1313":{"position":[[38,4],[502,4],[695,5],[970,5],[1036,3]]},"1314":{"position":[[183,3]]},"1315":{"position":[[355,3],[1135,5]]},"1316":{"position":[[2099,3],[2993,4],[3579,3]]},"1320":{"position":[[4,3],[304,3],[332,3],[485,3]]},"1324":{"position":[[221,4],[566,4]]}},"keywords":{}}],["us/docs/web/api/sharedworker?retiredlocale=d",{"_index":6268,"title":{},"content":{"1226":{"position":[[515,45]]}},"keywords":{}}],["us/docs/web/api/worker/work",{"_index":6302,"title":{},"content":{"1264":{"position":[[418,29]]}},"keywords":{}}],["usabl",{"_index":584,"title":{},"content":{"37":{"position":[[398,6]]},"323":{"position":[[199,6]]},"375":{"position":[[110,6]]},"411":{"position":[[5760,10]]},"421":{"position":[[1007,6]]},"432":{"position":[[1173,9]]},"582":{"position":[[93,7]]},"611":{"position":[[1123,6]]},"613":{"position":[[836,9]]},"617":{"position":[[75,9]]},"749":{"position":[[14210,6]]},"1031":{"position":[[262,7]]},"1040":{"position":[[292,6]]}},"keywords":{}}],["usag",{"_index":581,"title":{"300":{"position":[[32,6]]},"414":{"position":[[25,6]]},"672":{"position":[[0,5]]},"673":{"position":[[0,5]]},"674":{"position":[[0,5]]},"759":{"position":[[0,6]]},"766":{"position":[[0,6]]},"779":{"position":[[10,5]]},"820":{"position":[[0,6]]},"829":{"position":[[0,6]]},"846":{"position":[[0,6]]},"854":{"position":[[0,6]]},"866":{"position":[[0,6]]},"878":{"position":[[0,6]]},"884":{"position":[[0,6]]},"1130":{"position":[[0,6]]},"1134":{"position":[[0,6]]},"1154":{"position":[[0,6]]},"1163":{"position":[[0,6]]},"1172":{"position":[[0,6]]},"1201":{"position":[[0,6]]},"1218":{"position":[[0,6]]},"1219":{"position":[[0,5]]},"1224":{"position":[[0,6]]},"1274":{"position":[[0,5]]},"1275":{"position":[[0,5]]},"1276":{"position":[[0,5]]},"1277":{"position":[[0,5]]},"1278":{"position":[[0,5]]},"1279":{"position":[[0,5]]},"1280":{"position":[[0,5]]}},"content":{"37":{"position":[[282,6]]},"46":{"position":[[645,5]]},"57":{"position":[[435,5]]},"227":{"position":[[40,5]]},"236":{"position":[[205,6]]},"277":{"position":[[297,6]]},"298":{"position":[[42,5]]},"299":{"position":[[362,5]]},"301":{"position":[[35,5],[273,5]]},"306":{"position":[[106,6]]},"314":{"position":[[604,5]]},"315":{"position":[[1143,6]]},"336":{"position":[[202,6]]},"358":{"position":[[731,6]]},"361":{"position":[[300,6]]},"366":{"position":[[530,6]]},"412":{"position":[[9298,5],[10324,6]]},"433":{"position":[[379,5],[636,6]]},"473":{"position":[[231,5]]},"477":{"position":[[95,5],[259,5]]},"523":{"position":[[241,5]]},"559":{"position":[[172,5]]},"560":{"position":[[648,5]]},"563":{"position":[[190,6],[833,5]]},"566":{"position":[[610,5],[1220,5],[1396,5]]},"581":{"position":[[218,5]]},"587":{"position":[[105,6]]},"632":{"position":[[237,5]]},"639":{"position":[[186,5]]},"643":{"position":[[284,5]]},"696":{"position":[[718,6]]},"737":{"position":[[40,5]]},"779":{"position":[[88,5]]},"798":{"position":[[102,6]]},"832":{"position":[[149,5]]},"839":{"position":[[395,6]]},"841":{"position":[[1320,5]]},"886":{"position":[[4639,5]]},"995":{"position":[[554,5],[601,5]]},"1009":{"position":[[853,5]]},"1018":{"position":[[631,5]]},"1088":{"position":[[201,5]]},"1193":{"position":[[240,5]]}},"keywords":{}}],["usageacceler",{"_index":1882,"title":{},"content":{"311":{"position":[[209,17]]}},"keywords":{}}],["usagereact",{"_index":3116,"title":{},"content":{"479":{"position":[[140,13]]}},"keywords":{}}],["usage—brows",{"_index":2074,"title":{},"content":{"359":{"position":[[83,15]]}},"keywords":{}}],["usecas",{"_index":5623,"title":{"1022":{"position":[[0,8]]},"1023":{"position":[[0,8]]},"1024":{"position":[[0,8]]}},"content":{},"keywords":{}}],["usedspac",{"_index":1774,"title":{},"content":{"300":{"position":[[305,9],[422,11]]}},"keywords":{}}],["useeffect",{"_index":3305,"title":{},"content":{"541":{"position":[[191,9],[295,12]]},"559":{"position":[[211,9],[413,12]]},"562":{"position":[[1052,10],[1166,12]]},"829":{"position":[[1257,10],[1459,12]]}},"keywords":{}}],["useful.learn",{"_index":3384,"title":{},"content":{"557":{"position":[[276,12]]}},"keywords":{}}],["useliverxqueri",{"_index":4761,"title":{},"content":{"829":{"position":[[3101,14],[3238,14]]},"832":{"position":[[210,15]]}},"keywords":{}}],["useliverxquery(queri",{"_index":4762,"title":{},"content":{"829":{"position":[[3429,22]]}},"keywords":{}}],["user",{"_index":70,"title":{"97":{"position":[[46,5]]},"352":{"position":[[22,4]]},"410":{"position":[[0,4]]},"486":{"position":[[7,4]]},"782":{"position":[[46,4]]},"1090":{"position":[[32,4]]}},"content":{"4":{"position":[[180,5]]},"19":{"position":[[578,4]]},"35":{"position":[[642,4]]},"37":{"position":[[414,4]]},"39":{"position":[[147,4]]},"46":{"position":[[151,5],[533,4]]},"61":{"position":[[508,4]]},"65":{"position":[[412,4],[557,4],[600,5],[935,4],[994,4],[1418,5],[1928,4],[2108,4]]},"68":{"position":[[201,4]]},"69":{"position":[[160,4],[194,5]]},"70":{"position":[[236,4]]},"73":{"position":[[57,4]]},"77":{"position":[[50,4],[150,4]]},"83":{"position":[[393,4]]},"87":{"position":[[236,4],[271,4]]},"88":{"position":[[108,5],[200,4]]},"89":{"position":[[339,6]]},"90":{"position":[[168,4],[322,4]]},"91":{"position":[[52,6]]},"93":{"position":[[229,4]]},"95":{"position":[[240,4]]},"97":{"position":[[86,5],[110,5]]},"101":{"position":[[267,4]]},"103":{"position":[[221,4]]},"114":{"position":[[582,4]]},"117":{"position":[[156,4],[301,4]]},"125":{"position":[[301,4]]},"136":{"position":[[240,4],[350,4]]},"148":{"position":[[286,4]]},"152":{"position":[[333,4]]},"156":{"position":[[321,4]]},"157":{"position":[[277,5]]},"160":{"position":[[229,4]]},"173":{"position":[[981,4],[1480,5],[1825,5],[2748,5],[2807,5]]},"174":{"position":[[312,4]]},"175":{"position":[[590,4]]},"178":{"position":[[155,4],[405,4]]},"183":{"position":[[283,5]]},"185":{"position":[[322,4]]},"191":{"position":[[296,4]]},"198":{"position":[[449,4]]},"205":{"position":[[418,4]]},"206":{"position":[[188,5]]},"212":{"position":[[27,5],[627,5]]},"215":{"position":[[180,5]]},"216":{"position":[[212,4]]},"217":{"position":[[239,5]]},"218":{"position":[[127,4]]},"221":{"position":[[300,4]]},"237":{"position":[[196,5]]},"250":{"position":[[104,5],[286,4]]},"253":{"position":[[259,4]]},"265":{"position":[[487,4]]},"267":{"position":[[640,5],[1101,6],[1674,6]]},"269":{"position":[[345,4]]},"270":{"position":[[142,4],[189,4]]},"274":{"position":[[187,5]]},"275":{"position":[[109,4],[261,4]]},"277":{"position":[[328,6]]},"280":{"position":[[425,4],[485,5]]},"283":{"position":[[440,4]]},"289":{"position":[[1345,5]]},"292":{"position":[[222,5],[345,4]]},"295":{"position":[[262,6]]},"298":{"position":[[62,4],[444,4],[604,5]]},"299":{"position":[[399,4],[571,4]]},"300":{"position":[[659,5]]},"302":{"position":[[496,4],[953,4]]},"305":{"position":[[55,4],[471,4]]},"310":{"position":[[226,6]]},"312":{"position":[[217,4],[310,4]]},"318":{"position":[[436,4]]},"321":{"position":[[114,4]]},"323":{"position":[[538,4]]},"328":{"position":[[280,5]]},"330":{"position":[[103,5]]},"338":{"position":[[95,5]]},"340":{"position":[[138,5]]},"343":{"position":[[118,4]]},"346":{"position":[[707,4]]},"353":{"position":[[678,4]]},"354":{"position":[[1585,4]]},"361":{"position":[[996,4]]},"362":{"position":[[993,4]]},"369":{"position":[[836,4]]},"375":{"position":[[207,5],[692,5],[946,4]]},"377":{"position":[[17,4],[342,4]]},"380":{"position":[[405,4]]},"385":{"position":[[348,4]]},"386":{"position":[[88,4]]},"388":{"position":[[360,4]]},"394":{"position":[[233,4]]},"399":{"position":[[194,5],[239,5]]},"403":{"position":[[169,5]]},"407":{"position":[[519,6],[606,5],[712,4],[980,6],[1155,4]]},"408":{"position":[[588,4],[683,4],[3243,4]]},"409":{"position":[[289,5]]},"410":{"position":[[409,5],[485,4],[610,5],[1002,5],[1486,5],[2161,4]]},"411":{"position":[[424,5],[604,5],[986,4],[2361,5],[4036,4],[4322,4],[4787,5],[5316,5],[5471,5]]},"412":{"position":[[762,4],[3101,5],[3120,4],[3626,4],[5116,4],[5895,5],[5960,5],[6965,4],[7640,5],[7919,4],[8029,5],[8727,4],[9582,4],[10586,5],[11896,4],[12285,4],[12324,5],[12432,4],[12560,4],[12681,5],[15153,4]]},"414":{"position":[[416,4]]},"415":{"position":[[431,5]]},"416":{"position":[[519,6]]},"417":{"position":[[14,5],[369,5]]},"418":{"position":[[213,5],[568,5]]},"419":{"position":[[383,4]]},"420":{"position":[[1184,5]]},"421":{"position":[[34,5],[780,5],[902,5],[1159,6]]},"424":{"position":[[311,4],[430,4]]},"426":{"position":[[299,4],[375,4],[469,4]]},"427":{"position":[[383,4]]},"439":{"position":[[224,5],[525,4]]},"445":{"position":[[1205,4],[1538,4],[2504,4]]},"446":{"position":[[205,5],[653,5],[1068,4]]},"447":{"position":[[496,4]]},"454":{"position":[[739,5]]},"458":{"position":[[92,4],[345,5],[360,6]]},"461":{"position":[[495,4],[558,4]]},"469":{"position":[[1261,5]]},"473":{"position":[[184,4]]},"474":{"position":[[191,5]]},"475":{"position":[[132,4]]},"477":{"position":[[313,4]]},"481":{"position":[[553,4]]},"482":{"position":[[823,4]]},"483":{"position":[[831,4],[1286,4]]},"485":{"position":[[63,4]]},"486":{"position":[[41,5],[242,5]]},"487":{"position":[[85,4],[475,4]]},"489":{"position":[[346,5],[716,5]]},"491":{"position":[[949,4]]},"495":{"position":[[275,4],[291,5],[466,4]]},"496":{"position":[[560,4]]},"497":{"position":[[492,5]]},"498":{"position":[[590,4],[623,5],[705,5]]},"500":{"position":[[269,4],[645,5]]},"501":{"position":[[400,4]]},"502":{"position":[[466,5],[828,4],[885,5]]},"506":{"position":[[180,4]]},"507":{"position":[[165,4]]},"509":{"position":[[134,4]]},"510":{"position":[[106,4],[606,4],[769,5]]},"514":{"position":[[392,4]]},"516":{"position":[[157,5]]},"517":{"position":[[380,4]]},"519":{"position":[[297,5]]},"524":{"position":[[896,6]]},"526":{"position":[[72,4]]},"530":{"position":[[123,4]]},"534":{"position":[[103,4],[548,4]]},"550":{"position":[[186,4]]},"557":{"position":[[501,6]]},"559":{"position":[[1347,5],[1533,4]]},"560":{"position":[[335,4]]},"564":{"position":[[67,4],[1066,4]]},"565":{"position":[[35,4]]},"567":{"position":[[695,4],[1160,4]]},"569":{"position":[[1201,5]]},"571":{"position":[[270,4],[372,4],[1660,5]]},"574":{"position":[[215,5]]},"582":{"position":[[459,4],[743,4]]},"589":{"position":[[9,5],[208,4]]},"590":{"position":[[841,4]]},"594":{"position":[[101,4],[546,4]]},"617":{"position":[[608,4],[806,6],[1888,5]]},"619":{"position":[[27,6]]},"630":{"position":[[37,4],[189,4],[325,4],[357,4],[527,4],[1028,4]]},"634":{"position":[[194,4],[281,4],[631,4]]},"635":{"position":[[418,5]]},"638":{"position":[[43,4]]},"642":{"position":[[307,4]]},"643":{"position":[[341,4]]},"644":{"position":[[257,4],[710,4]]},"659":{"position":[[1001,4]]},"680":{"position":[[1159,6]]},"686":{"position":[[246,5]]},"687":{"position":[[139,4]]},"688":{"position":[[664,4]]},"690":{"position":[[126,4]]},"691":{"position":[[26,5]]},"696":{"position":[[347,4],[484,4],[1465,4],[1666,6]]},"697":{"position":[[284,4],[563,5]]},"698":{"position":[[21,5],[1947,5],[2005,5],[2137,5],[2772,5]]},"699":{"position":[[889,4]]},"700":{"position":[[198,4],[407,4],[533,4],[640,4]]},"701":{"position":[[113,6],[125,4],[212,5],[360,4],[694,4],[1073,6]]},"702":{"position":[[832,4]]},"703":{"position":[[86,5],[1397,4]]},"707":{"position":[[261,4]]},"711":{"position":[[1285,5],[1341,5]]},"715":{"position":[[233,4]]},"719":{"position":[[438,4]]},"723":{"position":[[313,5],[494,5],[2193,5],[2744,5]]},"752":{"position":[[321,4],[1355,5]]},"753":{"position":[[223,5]]},"759":{"position":[[1169,9],[1235,9],[1265,5]]},"772":{"position":[[950,6]]},"778":{"position":[[36,4],[196,4],[525,4]]},"779":{"position":[[112,4]]},"781":{"position":[[28,6],[167,4]]},"782":{"position":[[30,4],[135,5],[284,4],[397,4]]},"783":{"position":[[453,4],[604,4]]},"785":{"position":[[97,4],[659,5]]},"796":{"position":[[502,5],[697,4],[871,5]]},"798":{"position":[[362,4]]},"801":{"position":[[243,4],[482,4],[576,4]]},"817":{"position":[[149,5]]},"821":{"position":[[719,5],[840,5]]},"835":{"position":[[351,4],[1055,4]]},"839":{"position":[[342,4]]},"841":{"position":[[1344,4]]},"854":{"position":[[1383,4]]},"860":{"position":[[85,4],[861,5]]},"863":{"position":[[903,5]]},"904":{"position":[[2066,5],[2177,5],[2261,5]]},"912":{"position":[[141,4],[556,4],[645,5]]},"964":{"position":[[229,4]]},"977":{"position":[[278,5]]},"981":{"position":[[1309,5]]},"1009":{"position":[[133,4],[268,5],[406,4],[669,5]]},"1030":{"position":[[66,4]]},"1085":{"position":[[2141,4]]},"1088":{"position":[[236,4]]},"1090":{"position":[[48,6]]},"1092":{"position":[[364,6]]},"1093":{"position":[[178,6],[277,6]]},"1104":{"position":[[17,5],[35,4],[761,4],[780,4]]},"1121":{"position":[[130,5],[159,5],[312,5]]},"1123":{"position":[[333,5]]},"1140":{"position":[[149,4]]},"1148":{"position":[[107,4],[313,4]]},"1151":{"position":[[441,5]]},"1178":{"position":[[440,5]]},"1198":{"position":[[892,6],[1212,5]]},"1207":{"position":[[846,5]]},"1215":{"position":[[312,4],[610,5],[630,4]]},"1252":{"position":[[157,4]]},"1294":{"position":[[283,4]]},"1296":{"position":[[266,4]]},"1297":{"position":[[201,4]]},"1301":{"position":[[79,5]]},"1304":{"position":[[1110,5]]},"1313":{"position":[[579,4],[673,4]]},"1314":{"position":[[77,4]]},"1316":{"position":[[84,5],[398,5],[586,5],[613,5],[740,6]]},"1317":{"position":[[227,4],[583,4]]},"1318":{"position":[[228,4]]}},"keywords":{}}],["user'",{"_index":697,"title":{},"content":{"45":{"position":[[184,6]]},"63":{"position":[[77,6]]},"65":{"position":[[1745,6]]},"323":{"position":[[220,6]]},"365":{"position":[[635,6]]},"376":{"position":[[133,6]]},"391":{"position":[[105,6]]},"411":{"position":[[2905,6]]},"412":{"position":[[625,6],[3436,6],[6892,6],[7062,6]]},"419":{"position":[[1016,6]]},"424":{"position":[[137,6]]},"444":{"position":[[494,6]]},"461":{"position":[[1134,6]]},"497":{"position":[[586,6]]},"500":{"position":[[158,6]]},"575":{"position":[[603,6]]},"636":{"position":[[142,6]]}},"keywords":{}}],["user.onlin",{"_index":2784,"title":{},"content":{"415":{"position":[[239,11]]}},"keywords":{}}],["user.us",{"_index":1212,"title":{},"content":{"173":{"position":[[2971,10]]}},"keywords":{}}],["userid",{"_index":4888,"title":{},"content":{"858":{"position":[[361,7]]},"1105":{"position":[[481,6],[580,6]]}},"keywords":{}}],["userinput",{"_index":2306,"title":{},"content":{"394":{"position":[[594,9]]}},"keywords":{}}],["usernam",{"_index":3388,"title":{},"content":{"559":{"position":[[276,10],[497,12]]}},"keywords":{}}],["username"",{"_index":3400,"title":{},"content":{"559":{"position":[[703,14]]}},"keywords":{}}],["username}</p>",{"_index":3402,"title":{},"content":{"559":{"position":[[741,20]]}},"keywords":{}}],["users"",{"_index":4012,"title":{},"content":{"711":{"position":[[1794,13]]}},"keywords":{}}],["users.serv",{"_index":3671,"title":{},"content":{"623":{"position":[[166,12]]}},"keywords":{}}],["userscollect",{"_index":5065,"title":{},"content":{"878":{"position":[[315,16]]},"1101":{"position":[[688,16]]}},"keywords":{}}],["usersecret",{"_index":3138,"title":{},"content":{"482":{"position":[[780,12]]}},"keywords":{}}],["userxcollect",{"_index":3264,"title":{},"content":{"523":{"position":[[254,15]]},"829":{"position":[[1902,15]]},"832":{"position":[[230,17]]}},"keywords":{}}],["userxcollection('charact",{"_index":3266,"title":{},"content":{"523":{"position":[[346,30]]}},"keywords":{}}],["userxcollection('hero",{"_index":4756,"title":{},"content":{"829":{"position":[[1966,26]]}},"keywords":{}}],["userxqueri",{"_index":3265,"title":{},"content":{"523":{"position":[[274,10]]},"829":{"position":[[2300,10],[2326,10]]},"832":{"position":[[198,11]]}},"keywords":{}}],["userxquery(queri",{"_index":3271,"title":{},"content":{"523":{"position":[[514,17]]},"829":{"position":[[2514,18]]}},"keywords":{}}],["user’",{"_index":1719,"title":{},"content":{"298":{"position":[[543,6]]},"300":{"position":[[616,6]]},"302":{"position":[[10,6]]},"407":{"position":[[219,6]]},"559":{"position":[[75,6]]},"902":{"position":[[402,6]]}},"keywords":{}}],["usesign",{"_index":3185,"title":{},"content":{"494":{"position":[[504,10]]}},"keywords":{}}],["usesrxdatabaseinwork",{"_index":4178,"title":{"1213":{"position":[[8,22]]}},"content":{"749":{"position":[[3434,22],[3526,22]]},"1213":{"position":[[527,22],[697,23]]}},"keywords":{}}],["usest",{"_index":3304,"title":{},"content":{"541":{"position":[[181,9],[281,13]]},"559":{"position":[[201,9],[302,11]]},"562":{"position":[[1063,8],[1152,13]]},"829":{"position":[[1268,8],[1447,11]]}},"keywords":{}}],["usual",{"_index":1965,"title":{},"content":{"336":{"position":[[540,7]]},"358":{"position":[[171,7]]},"412":{"position":[[8294,7],[12930,7],[15024,7]]},"432":{"position":[[289,7]]},"495":{"position":[[866,7]]},"560":{"position":[[517,7]]},"561":{"position":[[175,9]]},"829":{"position":[[43,6],[1100,7]]},"898":{"position":[[4430,8]]},"932":{"position":[[1403,5]]},"1157":{"position":[[279,7]]}},"keywords":{}}],["ut1",{"_index":4132,"title":{},"content":{"749":{"position":[[9,3]]}},"keywords":{}}],["ut2",{"_index":4135,"title":{},"content":{"749":{"position":[[97,3]]}},"keywords":{}}],["ut3",{"_index":4139,"title":{},"content":{"749":{"position":[[444,3]]}},"keywords":{}}],["ut4",{"_index":4140,"title":{},"content":{"749":{"position":[[571,3]]}},"keywords":{}}],["ut5",{"_index":4141,"title":{},"content":{"749":{"position":[[662,3]]}},"keywords":{}}],["ut6",{"_index":4142,"title":{},"content":{"749":{"position":[[815,3]]}},"keywords":{}}],["ut7",{"_index":4143,"title":{},"content":{"749":{"position":[[952,3]]}},"keywords":{}}],["ut8",{"_index":4145,"title":{},"content":{"749":{"position":[[1087,3]]}},"keywords":{}}],["util",{"_index":936,"title":{"398":{"position":[[35,11]]}},"content":{"65":{"position":[[2016,7]]},"96":{"position":[[1,9]]},"104":{"position":[[6,8]]},"156":{"position":[[72,8]]},"162":{"position":[[264,8]]},"173":{"position":[[665,8]]},"174":{"position":[[470,8]]},"175":{"position":[[436,9]]},"180":{"position":[[31,8]]},"189":{"position":[[397,8]]},"219":{"position":[[108,9]]},"221":{"position":[[106,9]]},"228":{"position":[[316,11]]},"289":{"position":[[689,9]]},"365":{"position":[[456,8]]},"385":{"position":[[46,7]]},"390":{"position":[[1867,7]]},"392":{"position":[[4890,7]]},"393":{"position":[[321,7],[894,9]]},"402":{"position":[[2173,9]]},"426":{"position":[[142,9]]},"445":{"position":[[1967,9]]},"446":{"position":[[1253,9]]},"452":{"position":[[208,7]]},"469":{"position":[[1224,9]]},"480":{"position":[[1059,7]]},"494":{"position":[[21,7]]},"508":{"position":[[219,12]]},"540":{"position":[[198,9]]},"554":{"position":[[157,8]]},"559":{"position":[[1727,8]]},"571":{"position":[[1723,8]]},"614":{"position":[[440,9]]},"723":{"position":[[43,8]]},"802":{"position":[[1,9]]},"824":{"position":[[609,10]]},"1023":{"position":[[9,7]]},"1087":{"position":[[102,9]]},"1088":{"position":[[4,7]]},"1132":{"position":[[366,9]]},"1149":{"position":[[306,7]]},"1238":{"position":[[13,7]]},"1284":{"position":[[254,5]]},"1294":{"position":[[62,8]]}},"keywords":{}}],["ux",{"_index":2587,"title":{"778":{"position":[[0,2]]}},"content":{"410":{"position":[[19,3],[306,2]]}},"keywords":{}}],["v",{"_index":3503,"title":{},"content":{"580":{"position":[[767,1]]},"601":{"position":[[155,1]]},"602":{"position":[[530,1]]},"861":{"position":[[399,1]]},"887":{"position":[[613,3],[628,2]]},"1115":{"position":[[342,1],[408,1],[416,1],[478,1]]},"1290":{"position":[[126,1]]},"1291":{"position":[[110,3]]}},"keywords":{}}],["v.includ",{"_index":6390,"title":{},"content":{"1290":{"position":[[134,15]]},"1291":{"position":[[131,16]]}},"keywords":{}}],["v1",{"_index":2468,"title":{},"content":{"401":{"position":[[493,2],[530,2]]}},"keywords":{}}],["v14",{"_index":4506,"title":{},"content":{"761":{"position":[[562,4]]}},"keywords":{}}],["v15",{"_index":4504,"title":{},"content":{"761":{"position":[[438,3]]}},"keywords":{}}],["v2",{"_index":2215,"title":{},"content":{"391":{"position":[[413,2],[556,5]]},"401":{"position":[[216,2],[302,2],[341,2],[388,2],[435,2]]},"402":{"position":[[1915,2]]},"1141":{"position":[[264,3]]}},"keywords":{}}],["v2.x.x",{"_index":6034,"title":{},"content":{"1133":{"position":[[194,7]]}},"keywords":{}}],["v6.3.x).due",{"_index":6039,"title":{},"content":{"1133":{"position":[[484,11]]}},"keywords":{}}],["v7.3.x",{"_index":6035,"title":{},"content":{"1133":{"position":[[263,6]]}},"keywords":{}}],["val",{"_index":5991,"title":{},"content":{"1116":{"position":[[339,3],[389,3],[425,3],[477,3],[524,3],[593,3],[644,3]]}},"keywords":{}}],["valid",{"_index":2023,"title":{"367":{"position":[[7,10]]},"382":{"position":[[7,10]]},"764":{"position":[[16,8]]},"907":{"position":[[5,11]]},"1106":{"position":[[7,10]]},"1285":{"position":[[7,10]]},"1286":{"position":[[0,8]]},"1287":{"position":[[0,8]]},"1288":{"position":[[0,8],[20,6]]},"1292":{"position":[[30,11]]},"1317":{"position":[[12,11]]}},"content":{"354":{"position":[[594,10]]},"360":{"position":[[767,11]]},"364":{"position":[[446,8]]},"367":{"position":[[422,10],[476,10],[519,5]]},"491":{"position":[[1048,11]]},"495":{"position":[[383,10]]},"497":{"position":[[361,11],[690,11]]},"556":{"position":[[1425,8],[2003,5]]},"686":{"position":[[916,10]]},"703":{"position":[[274,8]]},"749":{"position":[[597,5],[2311,5],[12904,5],[13204,5],[16293,5],[21795,10],[21915,5],[23983,5],[24302,5]]},"764":{"position":[[28,10],[185,10],[291,8]]},"767":{"position":[[157,10]]},"793":{"position":[[417,10]]},"872":{"position":[[614,5]]},"880":{"position":[[35,5],[55,7]]},"888":{"position":[[183,5]]},"907":{"position":[[216,5]]},"934":{"position":[[151,5]]},"942":{"position":[[73,8]]},"944":{"position":[[577,10]]},"1084":{"position":[[32,8],[251,5]]},"1085":{"position":[[986,11]]},"1104":{"position":[[607,5]]},"1106":{"position":[[12,9],[273,8]]},"1132":{"position":[[486,10]]},"1227":{"position":[[462,5]]},"1237":{"position":[[271,10]]},"1251":{"position":[[112,6],[180,8]]},"1265":{"position":[[456,5]]},"1286":{"position":[[3,10],[42,11],[79,9],[352,10]]},"1287":{"position":[[17,5],[27,8],[62,10],[193,9],[398,10]]},"1288":{"position":[[25,5],[31,10],[95,8],[115,5],[144,5],[161,11],[260,7],[358,10]]},"1289":{"position":[[12,10]]},"1290":{"position":[[116,9]]},"1292":{"position":[[333,9],[687,9],[766,9],[946,9]]},"1317":{"position":[[49,9],[95,10],[315,10],[662,6]]}},"keywords":{}}],["validatepassword",{"_index":4302,"title":{},"content":{"749":{"position":[[12965,17]]}},"keywords":{}}],["validationremov",{"_index":4516,"title":{},"content":{"765":{"position":[[127,18]]}},"keywords":{}}],["validuntil",{"_index":5952,"title":{},"content":{"1104":{"position":[[367,11],[505,10]]}},"keywords":{}}],["valu",{"_index":557,"title":{"1122":{"position":[[33,5]]}},"content":{"35":{"position":[[349,5]]},"45":{"position":[[130,5]]},"63":{"position":[[125,5]]},"317":{"position":[[45,5]]},"356":{"position":[[461,6]]},"369":{"position":[[368,6]]},"390":{"position":[[484,7]]},"395":{"position":[[438,7]]},"396":{"position":[[1206,6],[1454,6]]},"397":{"position":[[32,6],[140,6],[284,6]]},"398":{"position":[[671,6],[3386,5]]},"402":{"position":[[956,7],[1182,5],[1212,5],[1487,5],[1534,5]]},"403":{"position":[[710,7]]},"424":{"position":[[180,5]]},"426":{"position":[[53,5]]},"427":{"position":[[495,5]]},"429":{"position":[[200,5],[558,6]]},"432":{"position":[[225,5],[1258,5],[1442,5]]},"441":{"position":[[177,5]]},"450":{"position":[[86,5],[318,6]]},"451":{"position":[[138,5],[266,5]]},"457":{"position":[[127,6]]},"459":{"position":[[1056,7]]},"468":{"position":[[174,5]]},"494":{"position":[[535,5]]},"533":{"position":[[160,5]]},"551":{"position":[[238,5]]},"559":{"position":[[56,5]]},"560":{"position":[[64,5],[388,5]]},"566":{"position":[[58,5]]},"567":{"position":[[995,5]]},"593":{"position":[[160,5]]},"659":{"position":[[529,6],[564,5]]},"681":{"position":[[358,5]]},"711":{"position":[[1347,6]]},"719":{"position":[[369,5]]},"749":{"position":[[3712,5],[4555,5],[11367,5],[17433,6],[21343,6],[23870,5],[24258,5]]},"764":{"position":[[144,5]]},"772":{"position":[[287,5]]},"804":{"position":[[67,5]]},"808":{"position":[[71,5],[328,6]]},"811":{"position":[[160,7]]},"829":{"position":[[2083,5]]},"831":{"position":[[185,6]]},"835":{"position":[[491,5]]},"837":{"position":[[1531,8]]},"841":{"position":[[82,5]]},"875":{"position":[[4933,6]]},"881":{"position":[[68,6]]},"886":{"position":[[1676,5]]},"887":{"position":[[40,6],[514,6]]},"898":{"position":[[4206,6]]},"950":{"position":[[101,5]]},"951":{"position":[[42,7]]},"986":{"position":[[945,5]]},"988":{"position":[[2032,6],[2094,5],[2164,6]]},"995":{"position":[[1280,5]]},"1039":{"position":[[56,6],[75,5],[168,5]]},"1040":{"position":[[88,6],[225,7]]},"1042":{"position":[[96,6]]},"1048":{"position":[[42,5]]},"1049":{"position":[[17,6]]},"1050":{"position":[[29,5]]},"1058":{"position":[[65,6]]},"1077":{"position":[[124,5]]},"1078":{"position":[[468,7]]},"1082":{"position":[[9,6],[132,7]]},"1107":{"position":[[264,5]]},"1109":{"position":[[133,5]]},"1115":{"position":[[116,5],[161,6],[197,5],[274,6],[299,5],[366,5],[434,5]]},"1123":{"position":[[37,5],[483,5]]},"1124":{"position":[[971,5]]},"1132":{"position":[[825,5]]},"1138":{"position":[[529,5]]},"1151":{"position":[[494,5]]},"1164":{"position":[[1174,5]]},"1177":{"position":[[390,6]]},"1178":{"position":[[493,5]]},"1206":{"position":[[246,5]]},"1222":{"position":[[746,6],[775,5],[824,5]]},"1226":{"position":[[312,5]]},"1246":{"position":[[1869,5]]},"1247":{"position":[[568,5]]},"1264":{"position":[[228,5]]},"1284":{"position":[[322,7]]},"1294":{"position":[[1295,7]]},"1296":{"position":[[1502,6],[1783,6]]},"1320":{"position":[[779,5]]}},"keywords":{}}],["valuabl",{"_index":899,"title":{},"content":{"64":{"position":[[170,8]]},"65":{"position":[[1981,8]]},"148":{"position":[[461,8]]},"267":{"position":[[912,8]]},"276":{"position":[[190,8]]},"370":{"position":[[280,8]]},"441":{"position":[[66,8]]},"526":{"position":[[228,8]]},"802":{"position":[[423,8]]}},"keywords":{}}],["value."",{"_index":4015,"title":{},"content":{"714":{"position":[[659,12]]}},"keywords":{}}],["value={usernam",{"_index":3396,"title":{},"content":{"559":{"position":[[610,16]]}},"keywords":{}}],["valueth",{"_index":5807,"title":{},"content":{"1074":{"position":[[401,8]]}},"keywords":{}}],["var",{"_index":3855,"title":{},"content":{"674":{"position":[[275,3]]},"1039":{"position":[[184,3]]},"1040":{"position":[[174,3],[233,3]]}},"keywords":{}}],["var/run/docker.sock:/var/run/docker.sock",{"_index":4895,"title":{},"content":{"861":{"position":[[577,41]]}},"keywords":{}}],["vari",{"_index":1705,"title":{},"content":{"298":{"position":[[144,4]]},"393":{"position":[[540,4]]},"461":{"position":[[654,6],[875,7]]},"696":{"position":[[1279,5]]},"841":{"position":[[980,6]]}},"keywords":{}}],["variabl",{"_index":1254,"title":{"729":{"position":[[20,9]]},"1202":{"position":[[20,9]]}},"content":{"188":{"position":[[1013,8]]},"299":{"position":[[615,10]]},"402":{"position":[[806,9],[861,9]]},"440":{"position":[[320,9]]},"674":{"position":[[109,8]]},"729":{"position":[[214,8]]},"817":{"position":[[60,10]]},"886":{"position":[[214,9],[811,10],[2458,9],[2535,9],[3698,10]]},"910":{"position":[[45,8]]},"1202":{"position":[[253,8]]},"1267":{"position":[[297,8]]}},"keywords":{}}],["variant",{"_index":3721,"title":{},"content":{"643":{"position":[[142,7]]}},"keywords":{}}],["varieti",{"_index":671,"title":{},"content":{"43":{"position":[[279,7]]},"179":{"position":[[176,7]]},"381":{"position":[[98,7]]},"613":{"position":[[169,7]]}},"keywords":{}}],["variou",{"_index":554,"title":{"72":{"position":[[27,7]]},"112":{"position":[[27,7]]},"492":{"position":[[17,7]]}},"content":{"35":{"position":[[270,7]]},"39":{"position":[[627,7]]},"60":{"position":[[39,7]]},"67":{"position":[[132,7]]},"72":{"position":[[131,7]]},"82":{"position":[[61,7]]},"113":{"position":[[95,7]]},"146":{"position":[[15,7]]},"162":{"position":[[15,7]]},"165":{"position":[[172,7]]},"174":{"position":[[2674,7],[3011,7]]},"192":{"position":[[145,7]]},"238":{"position":[[86,7]]},"267":{"position":[[45,7]]},"269":{"position":[[263,7]]},"280":{"position":[[494,7]]},"286":{"position":[[33,7]]},"288":{"position":[[167,7]]},"365":{"position":[[800,7]]},"368":{"position":[[114,7]]},"390":{"position":[[1174,7]]},"393":{"position":[[114,7]]},"396":{"position":[[1,7]]},"401":{"position":[[74,7]]},"420":{"position":[[1416,7]]},"441":{"position":[[577,7]]},"444":{"position":[[340,7]]},"469":{"position":[[1323,7]]},"479":{"position":[[218,7]]},"481":{"position":[[252,7]]},"483":{"position":[[267,7]]},"500":{"position":[[754,7]]},"502":{"position":[[1329,7]]},"504":{"position":[[42,7]]},"525":{"position":[[523,7]]},"543":{"position":[[226,7]]},"547":{"position":[[39,7]]},"565":{"position":[[100,7]]},"603":{"position":[[224,7]]},"607":{"position":[[39,7]]},"620":{"position":[[203,7]]},"736":{"position":[[94,7]]},"860":{"position":[[1010,7]]},"1072":{"position":[[1675,7]]},"1102":{"position":[[27,7]]},"1209":{"position":[[381,7]]},"1249":{"position":[[247,7]]},"1272":{"position":[[270,7]]}},"keywords":{}}],["vary.synchron",{"_index":6097,"title":{},"content":{"1157":{"position":[[199,16]]}},"keywords":{}}],["vd1",{"_index":4410,"title":{},"content":{"749":{"position":[[22026,3]]}},"keywords":{}}],["vd2",{"_index":4412,"title":{},"content":{"749":{"position":[[22146,3]]}},"keywords":{}}],["vector",{"_index":1501,"title":{"389":{"position":[[6,6]]},"390":{"position":[[10,6]]},"393":{"position":[[10,7]]},"394":{"position":[[14,6]]},"396":{"position":[[0,6]]},"398":{"position":[[14,6]]},"404":{"position":[[44,6]]}},"content":{"244":{"position":[[808,6]]},"252":{"position":[[275,6]]},"390":{"position":[[3,6],[117,8],[375,6],[495,7],[753,6],[834,7],[862,6],[1133,6],[1380,6],[1651,6],[1825,6],[1912,6]]},"391":{"position":[[43,6],[953,6]]},"392":{"position":[[1140,6],[1517,7],[2064,6],[2592,6]]},"393":{"position":[[91,7],[196,8],[498,8],[762,7],[887,6],[1151,7]]},"394":{"position":[[71,6]]},"395":{"position":[[381,6]]},"396":{"position":[[42,7],[1064,8],[1106,6],[1164,7]]},"397":{"position":[[1516,8],[1724,7]]},"398":{"position":[[527,7],[1892,6],[3475,6],[3523,6]]},"400":{"position":[[786,6]]},"401":{"position":[[168,6],[651,6]]},"402":{"position":[[78,6],[263,7],[676,7],[721,7],[2513,6]]},"403":{"position":[[753,8]]},"404":{"position":[[13,6]]},"408":{"position":[[3660,6]]},"412":{"position":[[10876,6]]},"689":{"position":[[184,8]]},"793":{"position":[[1178,6]]}},"keywords":{}}],["vector'",{"_index":2208,"title":{},"content":{"390":{"position":[[1588,8]]}},"keywords":{}}],["vector.j",{"_index":2257,"title":{},"content":{"392":{"position":[[3531,14]]}},"keywords":{}}],["vectorcollect",{"_index":2237,"title":{},"content":{"392":{"position":[[1739,16],[2716,17],[4622,17]]}},"keywords":{}}],["vectorcollection.find",{"_index":2402,"title":{},"content":{"398":{"position":[[1024,23],[1186,23],[2324,23]]}},"keywords":{}}],["vectorcollection.find().exec",{"_index":2312,"title":{},"content":{"394":{"position":[[709,31]]}},"keywords":{}}],["vectorcollection.upsert",{"_index":2248,"title":{},"content":{"392":{"position":[[2884,25]]}},"keywords":{}}],["vectorcollection.upsert(docdata",{"_index":2388,"title":{},"content":{"397":{"position":[[2211,33]]}},"keywords":{}}],["vectorsearchindexrange(searchembed",{"_index":2416,"title":{},"content":{"398":{"position":[[1940,39]]}},"keywords":{}}],["vectorsearchindexsimilarity(searchembed",{"_index":2391,"title":{},"content":{"398":{"position":[[694,44]]}},"keywords":{}}],["vendor",{"_index":236,"title":{},"content":{"14":{"position":[[1065,6]]},"202":{"position":[[397,6]]},"212":{"position":[[369,6]]},"249":{"position":[[333,6]]},"262":{"position":[[485,6],[564,6]]},"381":{"position":[[566,6]]},"412":{"position":[[1372,7],[1606,6],[2492,6]]},"839":{"position":[[1307,6]]},"840":{"position":[[497,6]]},"841":{"position":[[1574,6]]},"1112":{"position":[[311,7]]},"1124":{"position":[[114,6]]}},"keywords":{}}],["verbos",{"_index":2082,"title":{},"content":{"361":{"position":[[262,7]]},"566":{"position":[[318,8]]},"639":{"position":[[126,7]]}},"keywords":{}}],["veri",{"_index":484,"title":{},"content":{"29":{"position":[[440,4]]},"58":{"position":[[172,4]]},"305":{"position":[[574,4]]},"408":{"position":[[245,4],[1297,4]]},"412":{"position":[[15190,4]]},"415":{"position":[[132,4]]},"417":{"position":[[151,4]]},"468":{"position":[[639,4]]},"497":{"position":[[620,4]]},"570":{"position":[[117,4]]},"611":{"position":[[1145,4]]},"613":{"position":[[956,4]]},"721":{"position":[[153,4]]},"752":{"position":[[573,4]]},"797":{"position":[[155,4]]},"798":{"position":[[48,4],[211,4]]},"800":{"position":[[472,4],[477,4]]},"821":{"position":[[531,4]]},"836":{"position":[[1113,4]]},"948":{"position":[[65,4]]},"966":{"position":[[103,4]]},"981":{"position":[[537,4]]},"987":{"position":[[880,4]]},"1009":{"position":[[885,4]]},"1071":{"position":[[321,4]]},"1192":{"position":[[393,4]]},"1195":{"position":[[60,4]]},"1236":{"position":[[32,4]]},"1321":{"position":[[484,4]]}},"keywords":{}}],["verif",{"_index":6463,"title":{},"content":{"1297":{"position":[[370,13]]}},"keywords":{}}],["versatil",{"_index":962,"title":{},"content":{"72":{"position":[[104,9]]},"365":{"position":[[786,9]]},"368":{"position":[[13,9]]},"384":{"position":[[357,11]]},"445":{"position":[[2282,11]]},"447":{"position":[[522,11]]},"500":{"position":[[317,9]]},"1132":{"position":[[449,9]]}},"keywords":{}}],["version",{"_index":271,"title":{"382":{"position":[[22,11]]},"760":{"position":[[35,8]]},"761":{"position":[[8,7]]},"1076":{"position":[[0,8]]},"1145":{"position":[[62,8]]}},"content":{"16":{"position":[[105,7]]},"24":{"position":[[601,7]]},"28":{"position":[[796,7]]},"51":{"position":[[298,8]]},"188":{"position":[[1220,8]]},"209":{"position":[[425,8]]},"211":{"position":[[387,8]]},"250":{"position":[[255,9]]},"255":{"position":[[769,8]]},"259":{"position":[[69,8]]},"267":{"position":[[816,7]]},"295":{"position":[[278,7]]},"299":{"position":[[473,8],[722,8],[939,8],[1234,8],[1548,9]]},"314":{"position":[[735,8]]},"315":{"position":[[65,8],[711,8]]},"316":{"position":[[176,8]]},"334":{"position":[[621,8]]},"367":{"position":[[713,8]]},"382":{"position":[[284,10]]},"391":{"position":[[1013,8]]},"392":{"position":[[571,8],[1537,8]]},"403":{"position":[[336,7],[439,7],[538,7]]},"408":{"position":[[562,8]]},"412":{"position":[[3479,8],[11520,8],[11643,8]]},"450":{"position":[[753,10]]},"452":{"position":[[443,7],[633,7]]},"455":{"position":[[542,7],[560,8],[928,8]]},"457":{"position":[[309,7]]},"460":{"position":[[1112,7]]},"461":{"position":[[900,9]]},"462":{"position":[[345,8]]},"480":{"position":[[535,8]]},"482":{"position":[[835,8]]},"495":{"position":[[630,10]]},"496":{"position":[[607,7],[744,8]]},"538":{"position":[[599,8]]},"554":{"position":[[1326,8]]},"562":{"position":[[307,8]]},"563":{"position":[[753,7]]},"564":{"position":[[764,8]]},"579":{"position":[[629,8]]},"598":{"position":[[606,8]]},"632":{"position":[[1519,8]]},"636":{"position":[[176,7]]},"638":{"position":[[603,8]]},"639":{"position":[[359,8]]},"661":{"position":[[1244,8]]},"662":{"position":[[2382,8]]},"666":{"position":[[98,7]]},"680":{"position":[[811,8]]},"688":{"position":[[437,7]]},"689":{"position":[[176,7]]},"691":{"position":[[539,8]]},"696":{"position":[[1896,8]]},"698":{"position":[[200,8],[283,7],[483,8],[1226,8],[1281,8]]},"711":{"position":[[876,8]]},"717":{"position":[[1420,8]]},"720":{"position":[[137,8]]},"730":{"position":[[238,8]]},"734":{"position":[[685,8]]},"749":{"position":[[9241,7],[10983,7],[11121,7],[12607,8],[17815,7],[23212,7],[23338,7],[23470,7],[23660,8]]},"751":{"position":[[91,7],[233,7],[591,7],[604,7],[1002,7],[1015,7],[1137,9],[1693,7],[1706,7]]},"754":{"position":[[378,8]]},"756":{"position":[[471,9]]},"757":{"position":[[321,9]]},"760":{"position":[[39,8],[444,7]]},"761":{"position":[[116,7],[236,8],[288,7]]},"773":{"position":[[716,9]]},"786":{"position":[[113,7]]},"808":{"position":[[176,8],[532,8]]},"812":{"position":[[75,8]]},"813":{"position":[[75,8]]},"838":{"position":[[2596,8]]},"844":{"position":[[248,8]]},"861":{"position":[[359,7]]},"862":{"position":[[651,8]]},"872":{"position":[[1860,8],[4090,8]]},"876":{"position":[[426,7],[484,7],[622,8]]},"878":{"position":[[467,7]]},"879":{"position":[[130,7],[200,7],[363,8]]},"898":{"position":[[2440,8]]},"904":{"position":[[858,8]]},"916":{"position":[[144,8]]},"932":{"position":[[1196,8]]},"938":{"position":[[112,8]]},"954":{"position":[[59,9]]},"958":{"position":[[532,7]]},"965":{"position":[[406,8]]},"1044":{"position":[[42,7]]},"1074":{"position":[[86,7]]},"1076":{"position":[[5,7],[58,7]]},"1078":{"position":[[199,8]]},"1080":{"position":[[29,8]]},"1082":{"position":[[172,8]]},"1083":{"position":[[372,8]]},"1085":{"position":[[3313,7]]},"1097":{"position":[[522,8]]},"1100":{"position":[[582,7],[854,7],[897,8]]},"1133":{"position":[[289,7],[373,7]]},"1134":{"position":[[217,7],[328,9],[371,8]]},"1149":{"position":[[1049,8]]},"1158":{"position":[[359,8]]},"1162":{"position":[[1002,7],[1051,7]]},"1198":{"position":[[1148,7],[2175,7]]},"1270":{"position":[[345,7]]},"1271":{"position":[[15,8],[77,7],[271,7],[565,7],[1058,7],[1744,8]]},"1275":{"position":[[14,7]]},"1278":{"position":[[93,7],[131,7],[186,8],[645,9]]},"1282":{"position":[[384,7],[596,7],[741,8]]},"1292":{"position":[[107,7]]},"1305":{"position":[[414,7]]},"1311":{"position":[[357,8]]},"1315":{"position":[[772,7]]},"1319":{"position":[[261,7],[341,8]]}},"keywords":{}}],["versions—ensur",{"_index":1312,"title":{},"content":{"203":{"position":[[270,17]]}},"keywords":{}}],["vertic",{"_index":4571,"title":{"1087":{"position":[[0,8]]}},"content":{"772":{"position":[[1408,11]]},"1087":{"position":[[1,8],[141,8]]},"1088":{"position":[[74,10]]}},"keywords":{}}],["vf",{"_index":2973,"title":{},"content":{"454":{"position":[[980,3]]},"463":{"position":[[1243,3]]}},"keywords":{}}],["via",{"_index":319,"title":{"810":{"position":[[0,3]]},"811":{"position":[[0,3]]}},"content":{"19":{"position":[[147,3],[257,3]]},"33":{"position":[[602,3]]},"39":{"position":[[683,3]]},"49":{"position":[[52,3]]},"55":{"position":[[73,3]]},"174":{"position":[[2742,4]]},"188":{"position":[[600,3]]},"250":{"position":[[213,3]]},"289":{"position":[[1600,3]]},"303":{"position":[[220,3]]},"333":{"position":[[25,3],[253,3]]},"336":{"position":[[449,3]]},"357":{"position":[[615,3]]},"381":{"position":[[138,3]]},"411":{"position":[[4412,3],[5086,3]]},"412":{"position":[[2355,3],[3510,3],[7718,4],[8097,3]]},"464":{"position":[[677,3]]},"466":{"position":[[333,3]]},"469":{"position":[[1184,3]]},"504":{"position":[[1276,3]]},"535":{"position":[[1157,3]]},"562":{"position":[[807,3]]},"563":{"position":[[35,3],[157,3]]},"566":{"position":[[565,3]]},"574":{"position":[[647,3]]},"578":{"position":[[54,3]]},"595":{"position":[[1234,3]]},"640":{"position":[[302,3]]},"662":{"position":[[1251,3]]},"680":{"position":[[70,3],[161,3]]},"687":{"position":[[84,3]]},"710":{"position":[[1445,3]]},"743":{"position":[[36,3]]},"749":{"position":[[19162,3]]},"828":{"position":[[47,3]]},"829":{"position":[[997,3]]},"832":{"position":[[194,3]]},"836":{"position":[[501,3]]},"837":{"position":[[1317,3]]},"838":{"position":[[639,3],[1782,3]]},"846":{"position":[[23,3]]},"854":{"position":[[1462,3]]},"863":{"position":[[818,3]]},"870":{"position":[[133,3]]},"890":{"position":[[679,4]]},"896":{"position":[[231,3]]},"903":{"position":[[452,3]]},"911":{"position":[[394,3]]},"984":{"position":[[253,3]]},"985":{"position":[[88,3],[394,3],[679,3]]},"986":{"position":[[1257,3]]},"988":{"position":[[1017,3]]},"1018":{"position":[[430,3]]},"1101":{"position":[[94,3]]},"1102":{"position":[[100,3],[1210,3]]},"1123":{"position":[[122,3]]},"1133":{"position":[[146,3]]},"1150":{"position":[[418,3]]},"1177":{"position":[[208,3]]},"1204":{"position":[[209,3]]},"1276":{"position":[[186,3]]},"1294":{"position":[[2097,3]]}},"keywords":{}}],["viabl",{"_index":2541,"title":{},"content":{"408":{"position":[[1463,6]]},"429":{"position":[[452,6]]},"624":{"position":[[1303,6]]},"698":{"position":[[930,6]]},"708":{"position":[[402,6]]},"1270":{"position":[[466,6]]},"1305":{"position":[[219,6]]}},"keywords":{}}],["video",{"_index":1823,"title":{},"content":{"303":{"position":[[186,7]]},"390":{"position":[[940,7]]},"408":{"position":[[3057,5]]},"614":{"position":[[342,6]]},"861":{"position":[[1160,6]]},"901":{"position":[[128,6]]}},"keywords":{}}],["view",{"_index":915,"title":{},"content":{"65":{"position":[[644,4]]},"412":{"position":[[12701,4]]},"469":{"position":[[1381,4]]},"489":{"position":[[726,5]]},"660":{"position":[[35,5]]},"829":{"position":[[2881,6],[3006,5]]},"1284":{"position":[[330,4]]},"1316":{"position":[[3655,5]]}},"keywords":{}}],["violat",{"_index":3950,"title":{},"content":{"699":{"position":[[985,8]]}},"keywords":{}}],["virtual",{"_index":489,"title":{},"content":{"30":{"position":[[68,7]]},"408":{"position":[[1933,7]]},"454":{"position":[[984,8]]},"463":{"position":[[507,7]]},"491":{"position":[[192,9]]},"617":{"position":[[1362,9]]},"1206":{"position":[[157,7]]},"1211":{"position":[[213,7]]}},"keywords":{}}],["visibl",{"_index":5544,"title":{},"content":{"1003":{"position":[[60,8],[276,7]]},"1215":{"position":[[595,7]]}},"keywords":{}}],["visit",{"_index":995,"title":{},"content":{"84":{"position":[[139,5]]},"114":{"position":[[152,5]]},"149":{"position":[[152,5]]},"175":{"position":[[145,5]]},"347":{"position":[[152,5]]},"362":{"position":[[1223,5]]},"511":{"position":[[152,5]]},"531":{"position":[[152,5]]},"591":{"position":[[152,5]]},"702":{"position":[[837,7]]}},"keywords":{}}],["visitor",{"_index":3641,"title":{},"content":{"617":{"position":[[976,8]]},"736":{"position":[[73,8]]}},"keywords":{}}],["visual",{"_index":1232,"title":{},"content":{"177":{"position":[[293,8]]},"267":{"position":[[1083,14]]},"446":{"position":[[967,13]]},"495":{"position":[[447,6]]},"571":{"position":[[1703,14]]}},"keywords":{}}],["vital",{"_index":1063,"title":{},"content":{"117":{"position":[[18,5]]},"178":{"position":[[18,5]]},"447":{"position":[[25,5]]},"912":{"position":[[531,5]]}},"keywords":{}}],["vite",{"_index":5213,"title":{},"content":{"898":{"position":[[2937,4]]}},"keywords":{}}],["void",{"_index":4129,"title":{},"content":{"747":{"position":[[219,5],[277,5],[344,4]]}},"keywords":{}}],["volum",{"_index":1050,"title":{},"content":{"111":{"position":[[202,8]]},"267":{"position":[[981,7]]},"287":{"position":[[780,7]]},"294":{"position":[[323,7]]},"369":{"position":[[691,7]]},"441":{"position":[[370,6]]},"487":{"position":[[232,6]]},"508":{"position":[[168,8]]},"861":{"position":[[570,6],[623,6]]},"1132":{"position":[[1237,7]]}},"keywords":{}}],["volumes.seamless",{"_index":1208,"title":{},"content":{"173":{"position":[[2144,16]]}},"keywords":{}}],["voxel",{"_index":5554,"title":{},"content":{"1006":{"position":[[42,5]]},"1007":{"position":[[257,7],[536,6],[1325,7]]},"1009":{"position":[[10,5]]}},"keywords":{}}],["vs",{"_index":670,"title":{"68":{"position":[[16,3]]},"99":{"position":[[16,3]]},"126":{"position":[[5,3]]},"161":{"position":[[5,3]]},"186":{"position":[[5,3]]},"226":{"position":[[16,3]]},"317":{"position":[[5,3]]},"331":{"position":[[5,3]]},"358":{"position":[[5,3]]},"413":{"position":[[12,3]]},"419":{"position":[[14,3]]},"432":{"position":[[13,2]]},"434":{"position":[[13,2]]},"435":{"position":[[13,2]]},"436":{"position":[[13,2]]},"448":{"position":[[13,3],[27,3],[39,3],[48,3]]},"520":{"position":[[5,3]]},"560":{"position":[[21,3]]},"566":{"position":[[23,2],[36,2]]},"576":{"position":[[5,3]]},"609":{"position":[[11,2],[33,2],[49,2],[59,2]]},"1143":{"position":[[9,2]]},"1192":{"position":[[11,2]]}},"content":{"43":{"position":[[192,2]]},"243":{"position":[[992,2]]},"244":{"position":[[504,2],[700,2],[1191,2],[1389,2]]},"432":{"position":[[1312,2]]},"793":{"position":[[1349,3],[1363,3],[1375,3],[1384,3]]},"1072":{"position":[[951,3]]}},"keywords":{}}],["vue",{"_index":2002,"title":{"573":{"position":[[24,3]]},"574":{"position":[[4,3]]},"576":{"position":[[15,3]]},"580":{"position":[[0,3]]},"590":{"position":[[33,4]]},"592":{"position":[[22,3]]},"594":{"position":[[21,4]]},"596":{"position":[[15,4]]},"601":{"position":[[28,3]]},"602":{"position":[[6,3]]},"603":{"position":[[0,3]]}},"content":{"352":{"position":[[253,4]]},"574":{"position":[[1,3],[151,3]]},"576":{"position":[[433,3]]},"577":{"position":[[57,3]]},"579":{"position":[[13,3],[83,3],[937,5]]},"580":{"position":[[44,3],[149,3],[219,4],[238,3],[330,6]]},"581":{"position":[[663,3]]},"582":{"position":[[77,3]]},"584":{"position":[[1,3]]},"585":{"position":[[222,3]]},"589":{"position":[[42,3]]},"590":{"position":[[67,3]]},"591":{"position":[[458,4],[514,3],[558,3],[578,3],[621,3],[664,3]]},"594":{"position":[[15,3]]},"595":{"position":[[839,3]]},"596":{"position":[[22,3]]},"598":{"position":[[248,3]]},"600":{"position":[[138,3]]},"601":{"position":[[24,3],[408,6]]},"602":{"position":[[316,3]]},"603":{"position":[[48,3]]},"608":{"position":[[244,3]]},"825":{"position":[[15,3]]}},"keywords":{}}],["vue'",{"_index":3482,"title":{},"content":{"574":{"position":[[918,5]]},"590":{"position":[[229,5],[435,5]]},"602":{"position":[[21,5]]}},"keywords":{}}],["vue.j",{"_index":258,"title":{"286":{"position":[[42,8]]}},"content":{"15":{"position":[[328,6]]},"94":{"position":[[119,7]]},"173":{"position":[[2317,7]]},"222":{"position":[[136,7]]},"286":{"position":[[202,7]]},"749":{"position":[[12038,6]]}},"keywords":{}}],["vuex",{"_index":3486,"title":{},"content":{"576":{"position":[[162,4]]}},"keywords":{}}],["vuex/pinia",{"_index":3480,"title":{},"content":{"574":{"position":[[626,10]]}},"keywords":{}}],["vulner",{"_index":2759,"title":{},"content":{"412":{"position":[[13168,10]]}},"keywords":{}}],["w",{"_index":3997,"title":{},"content":{"711":{"position":[[1017,1]]},"841":{"position":[[1012,2]]}},"keywords":{}}],["wa",{"_index":6339,"title":{},"content":{"1276":{"position":[[32,2],[84,2],[587,3],[750,3],[807,3]]}},"keywords":{}}],["wait",{"_index":147,"title":{},"content":{"11":{"position":[[240,4],[335,5],[717,4]]},"93":{"position":[[84,7]]},"408":{"position":[[2878,7]]},"410":{"position":[[249,7]]},"421":{"position":[[408,4],[675,4]]},"474":{"position":[[239,4]]},"630":{"position":[[617,4]]},"634":{"position":[[231,4]]},"696":{"position":[[356,4]]},"702":{"position":[[317,4]]},"898":{"position":[[4043,4]]},"948":{"position":[[687,4]]},"988":{"position":[[1295,4],[1558,4]]},"1033":{"position":[[710,6]]},"1175":{"position":[[492,4]]},"1298":{"position":[[108,7]]},"1304":{"position":[[844,5]]}},"keywords":{}}],["waitbeforepersist",{"_index":6116,"title":{},"content":{"1164":{"position":[[1501,18]]}},"keywords":{}}],["waitforleadership",{"_index":3759,"title":{"974":{"position":[[0,20]]}},"content":{"653":{"position":[[1463,18]]},"886":{"position":[[2008,17]]},"988":{"position":[[1260,17],[1343,17],[1444,18]]},"989":{"position":[[143,18]]},"995":{"position":[[212,18],[847,18]]}},"keywords":{}}],["wal",{"_index":6069,"title":{},"content":{"1143":{"position":[[527,3]]}},"keywords":{}}],["walk",{"_index":3210,"title":{},"content":{"498":{"position":[[163,4]]}},"keywords":{}}],["want",{"_index":14,"title":{"86":{"position":[[14,4]]},"214":{"position":[[14,4]]}},"content":{"1":{"position":[[217,4],[264,4]]},"260":{"position":[[163,4],[265,4]]},"262":{"position":[[5,4],[477,4]]},"372":{"position":[[26,4]]},"392":{"position":[[2247,4]]},"410":{"position":[[1614,4]]},"412":{"position":[[5367,4],[10902,4]]},"420":{"position":[[1197,4]]},"421":{"position":[[70,6]]},"453":{"position":[[190,4],[553,4]]},"457":{"position":[[58,4]]},"459":{"position":[[407,4]]},"460":{"position":[[47,4],[1359,4]]},"496":{"position":[[420,4]]},"535":{"position":[[357,4]]},"556":{"position":[[1854,4]]},"561":{"position":[[69,4]]},"564":{"position":[[101,4]]},"567":{"position":[[792,4]]},"595":{"position":[[368,4]]},"655":{"position":[[51,4]]},"661":{"position":[[1690,4],[1737,4]]},"667":{"position":[[134,4]]},"676":{"position":[[203,4]]},"681":{"position":[[307,4]]},"690":{"position":[[52,4],[405,4]]},"696":{"position":[[400,4],[540,4]]},"701":{"position":[[555,4],[965,4]]},"702":{"position":[[48,4],[84,4]]},"704":{"position":[[124,4]]},"705":{"position":[[253,4]]},"707":{"position":[[479,4]]},"710":{"position":[[944,4],[2502,4]]},"711":{"position":[[568,4],[2132,4]]},"749":{"position":[[7210,4],[14452,4]]},"752":{"position":[[1325,4]]},"753":{"position":[[169,4]]},"759":{"position":[[14,4]]},"766":{"position":[[135,4]]},"772":{"position":[[1815,4]]},"773":{"position":[[759,4]]},"774":{"position":[[8,4]]},"775":{"position":[[550,4]]},"776":{"position":[[232,4]]},"797":{"position":[[181,4]]},"799":{"position":[[84,4]]},"805":{"position":[[92,4]]},"806":{"position":[[213,4]]},"836":{"position":[[1039,4],[2462,4]]},"837":{"position":[[875,4]]},"838":{"position":[[1606,4],[3230,4]]},"839":{"position":[[469,4],[1287,4]]},"861":{"position":[[2441,4]]},"875":{"position":[[4963,4]]},"876":{"position":[[239,4]]},"879":{"position":[[567,4]]},"893":{"position":[[69,4]]},"904":{"position":[[2022,4]]},"906":{"position":[[618,4]]},"913":{"position":[[305,4]]},"945":{"position":[[10,4]]},"963":{"position":[[18,4]]},"966":{"position":[[266,4]]},"977":{"position":[[244,4]]},"988":{"position":[[2327,4],[3429,4]]},"995":{"position":[[579,4],[1323,4]]},"1006":{"position":[[213,4]]},"1013":{"position":[[181,4],[632,4]]},"1022":{"position":[[15,4],[80,4]]},"1048":{"position":[[15,4],[150,4]]},"1067":{"position":[[1641,4]]},"1068":{"position":[[154,7],[375,4]]},"1080":{"position":[[1076,4]]},"1100":{"position":[[916,4]]},"1112":{"position":[[198,4]]},"1147":{"position":[[432,4]]},"1149":{"position":[[298,4]]},"1151":{"position":[[4,4],[754,4]]},"1172":{"position":[[128,4]]},"1178":{"position":[[4,4],[753,4]]},"1185":{"position":[[191,4]]},"1210":{"position":[[563,4]]},"1212":{"position":[[10,4]]},"1213":{"position":[[451,4]]},"1226":{"position":[[413,4]]},"1230":{"position":[[96,4]]},"1249":{"position":[[47,4]]},"1252":{"position":[[131,4]]},"1264":{"position":[[323,4]]},"1271":{"position":[[887,4]]},"1282":{"position":[[176,4]]},"1287":{"position":[[92,6]]},"1294":{"position":[[265,4]]},"1309":{"position":[[1099,4]]},"1314":{"position":[[10,4]]},"1315":{"position":[[18,4],[285,4]]},"1316":{"position":[[98,4],[1338,5],[3571,4]]},"1318":{"position":[[483,4]]},"1320":{"position":[[241,4],[430,4]]},"1321":{"position":[[142,4]]},"1322":{"position":[[51,4]]}},"keywords":{}}],["warn",{"_index":1090,"title":{"675":{"position":[[21,8]]}},"content":{"129":{"position":[[514,7]]},"299":{"position":[[1071,8]]},"675":{"position":[[165,7]]},"917":{"position":[[386,7]]},"995":{"position":[[175,7],[432,7]]},"1288":{"position":[[1,8]]}},"keywords":{}}],["wasm",{"_index":672,"title":{"448":{"position":[[52,4]]},"454":{"position":[[8,4]]}},"content":{"43":{"position":[[399,4]]},"404":{"position":[[399,4]]},"408":{"position":[[3483,7],[3775,4],[3879,4],[4112,4]]},"454":{"position":[[15,6],[97,4],[342,4],[769,4],[878,4]]},"457":{"position":[[262,4]]},"459":{"position":[[252,4]]},"463":{"position":[[383,4],[415,4],[721,4],[746,4],[1151,4]]},"464":{"position":[[371,4],[397,4],[634,4]]},"465":{"position":[[232,4],[258,4]]},"466":{"position":[[195,4],[221,4],[501,4]]},"467":{"position":[[170,4],[196,4],[457,4]]},"468":{"position":[[438,4]]},"524":{"position":[[813,4]]},"793":{"position":[[1388,4]]},"1137":{"position":[[108,4]]},"1276":{"position":[[307,4]]},"1299":{"position":[[586,4]]}},"keywords":{}}],["wast",{"_index":3835,"title":{},"content":{"668":{"position":[[318,5]]},"736":{"position":[[439,5],[488,6]]}},"keywords":{}}],["watch",{"_index":1579,"title":{},"content":{"255":{"position":[[1572,8]]},"411":{"position":[[3177,8]]},"705":{"position":[[1096,5]]},"1058":{"position":[[547,8]]},"1124":{"position":[[951,5]]}},"keywords":{}}],["watcher",{"_index":3522,"title":{},"content":{"590":{"position":[[274,9]]}},"keywords":{}}],["watermelondb",{"_index":283,"title":{"17":{"position":[[0,13]]}},"content":{"17":{"position":[[3,12],[191,12],[277,12],[358,13],[386,12],[459,12]]},"1316":{"position":[[3448,12],[3502,13]]},"1324":{"position":[[553,12]]}},"keywords":{}}],["way",{"_index":894,"title":{},"content":{"63":{"position":[[35,3]]},"73":{"position":[[111,3]]},"117":{"position":[[93,3]]},"130":{"position":[[56,3]]},"131":{"position":[[683,3]]},"192":{"position":[[193,3],[214,3]]},"250":{"position":[[153,5]]},"270":{"position":[[249,3]]},"285":{"position":[[309,3]]},"289":{"position":[[533,3]]},"298":{"position":[[17,3]]},"301":{"position":[[10,3]]},"306":{"position":[[143,3]]},"340":{"position":[[35,5]]},"395":{"position":[[68,3]]},"396":{"position":[[924,3],[1809,4]]},"397":{"position":[[13,3]]},"398":{"position":[[387,4]]},"402":{"position":[[888,4],[1738,4]]},"409":{"position":[[189,3]]},"412":{"position":[[14023,3]]},"418":{"position":[[846,3]]},"421":{"position":[[208,4]]},"424":{"position":[[398,3]]},"441":{"position":[[655,3]]},"455":{"position":[[160,3]]},"458":{"position":[[497,3],[576,3]]},"468":{"position":[[304,3]]},"469":{"position":[[834,3]]},"470":{"position":[[181,3]]},"525":{"position":[[571,3],[592,3]]},"551":{"position":[[32,4]]},"557":{"position":[[81,3]]},"612":{"position":[[45,3],[154,3]]},"619":{"position":[[300,3]]},"624":{"position":[[683,3]]},"655":{"position":[[110,3]]},"662":{"position":[[270,3]]},"686":{"position":[[203,3]]},"688":{"position":[[95,3],[310,3]]},"693":{"position":[[265,4]]},"696":{"position":[[1691,3],[1927,3]]},"697":{"position":[[368,3],[613,4]]},"698":{"position":[[246,3],[1904,3]]},"700":{"position":[[557,3]]},"701":{"position":[[316,3]]},"705":{"position":[[1299,3]]},"708":{"position":[[409,3],[478,3]]},"709":{"position":[[366,4],[885,4]]},"711":{"position":[[2273,3]]},"714":{"position":[[717,3]]},"736":{"position":[[276,3]]},"770":{"position":[[158,3]]},"773":{"position":[[20,3]]},"783":{"position":[[243,3]]},"784":{"position":[[382,3]]},"829":{"position":[[195,3]]},"830":{"position":[[62,3]]},"836":{"position":[[1397,3]]},"837":{"position":[[157,3]]},"838":{"position":[[299,3],[1175,4]]},"842":{"position":[[8,3]]},"860":{"position":[[1186,3]]},"861":{"position":[[156,3]]},"865":{"position":[[135,3]]},"870":{"position":[[5,3]]},"872":{"position":[[2191,3]]},"875":{"position":[[7096,3]]},"876":{"position":[[517,4]]},"896":{"position":[[112,3]]},"898":{"position":[[626,3]]},"951":{"position":[[61,3]]},"981":{"position":[[204,3]]},"988":{"position":[[4972,3]]},"1022":{"position":[[279,3]]},"1085":{"position":[[1068,3]]},"1089":{"position":[[9,3]]},"1090":{"position":[[9,3]]},"1092":{"position":[[17,3]]},"1093":{"position":[[345,4]]},"1124":{"position":[[944,3]]},"1140":{"position":[[36,3]]},"1143":{"position":[[201,3]]},"1152":{"position":[[105,3]]},"1157":{"position":[[35,3],[526,3]]},"1177":{"position":[[182,3]]},"1204":{"position":[[183,3]]},"1211":{"position":[[195,3]]},"1213":{"position":[[192,3]]},"1247":{"position":[[317,3],[490,3],[677,3]]},"1266":{"position":[[13,3]]},"1294":{"position":[[662,3]]},"1295":{"position":[[452,3]]},"1301":{"position":[[545,3],[1586,3]]},"1304":{"position":[[707,3]]},"1307":{"position":[[824,3]]},"1316":{"position":[[3488,3]]},"1317":{"position":[[377,3]]}},"keywords":{}}],["we'll",{"_index":2351,"title":{},"content":{"396":{"position":[[1887,5]]},"421":{"position":[[1062,5]]}},"keywords":{}}],["we'v",{"_index":900,"title":{},"content":{"65":{"position":[[10,5]]},"462":{"position":[[10,5]]}},"keywords":{}}],["weak",{"_index":2940,"title":{},"content":{"445":{"position":[[642,4]]}},"keywords":{}}],["weatherdb",{"_index":4093,"title":{},"content":{"739":{"position":[[309,12]]}},"keywords":{}}],["web",{"_index":200,"title":{"116":{"position":[[8,3]]},"150":{"position":[[32,3]]},"151":{"position":[[12,3]]},"320":{"position":[[7,3]]},"499":{"position":[[35,3]]},"500":{"position":[[22,3]]},"503":{"position":[[28,3]]},"718":{"position":[[6,3]]}},"content":{"14":{"position":[[70,3]]},"18":{"position":[[65,3]]},"26":{"position":[[290,3]]},"30":{"position":[[53,4]]},"33":{"position":[[486,4]]},"38":{"position":[[94,3]]},"63":{"position":[[84,3]]},"64":{"position":[[204,3]]},"65":{"position":[[124,3],[248,3],[1401,3],[2062,3]]},"68":{"position":[[152,3]]},"69":{"position":[[110,3]]},"70":{"position":[[153,3]]},"73":{"position":[[148,3]]},"76":{"position":[[102,3]]},"83":{"position":[[230,3],[407,3]]},"112":{"position":[[162,3]]},"116":{"position":[[283,3]]},"139":{"position":[[68,3]]},"148":{"position":[[249,3],[369,3]]},"151":{"position":[[90,3],[147,3]]},"153":{"position":[[99,3]]},"161":{"position":[[40,3],[379,3]]},"170":{"position":[[53,3],[549,3]]},"172":{"position":[[180,3]]},"207":{"position":[[109,3]]},"215":{"position":[[332,3]]},"239":{"position":[[208,3]]},"244":{"position":[[264,3],[1074,3]]},"254":{"position":[[99,3]]},"269":{"position":[[59,3],[189,3],[308,4],[432,3]]},"291":{"position":[[481,3]]},"298":{"position":[[393,3]]},"315":{"position":[[89,3]]},"364":{"position":[[63,3]]},"375":{"position":[[902,3]]},"384":{"position":[[120,3]]},"408":{"position":[[227,3],[305,3],[1278,3],[1434,3],[1665,3],[1752,3],[4728,3],[4931,3]]},"411":{"position":[[4479,3]]},"412":{"position":[[8550,3],[15009,3]]},"419":{"position":[[38,3]]},"421":{"position":[[29,4]]},"424":{"position":[[47,3],[73,3]]},"434":{"position":[[96,3],[412,3]]},"441":{"position":[[24,3]]},"445":{"position":[[130,3]]},"450":{"position":[[624,4]]},"451":{"position":[[162,3]]},"453":{"position":[[75,3]]},"454":{"position":[[92,4]]},"455":{"position":[[14,3]]},"457":{"position":[[26,3]]},"458":{"position":[[34,3]]},"460":{"position":[[999,3]]},"461":{"position":[[289,3]]},"468":{"position":[[663,3]]},"470":{"position":[[39,3]]},"483":{"position":[[1072,3]]},"500":{"position":[[13,3],[40,3],[95,3]]},"501":{"position":[[157,3]]},"503":{"position":[[37,3]]},"510":{"position":[[35,3],[76,3]]},"511":{"position":[[457,3]]},"519":{"position":[[1,3]]},"520":{"position":[[207,3]]},"530":{"position":[[571,3]]},"533":{"position":[[321,3]]},"548":{"position":[[465,3]]},"551":{"position":[[465,3]]},"554":{"position":[[177,3]]},"556":{"position":[[1115,3]]},"567":{"position":[[908,3]]},"569":{"position":[[1038,3]]},"584":{"position":[[233,3]]},"593":{"position":[[321,3]]},"608":{"position":[[463,3]]},"613":{"position":[[94,3]]},"614":{"position":[[8,4],[153,3]]},"624":{"position":[[255,3]]},"640":{"position":[[528,4]]},"642":{"position":[[67,3]]},"660":{"position":[[31,3],[41,3]]},"662":{"position":[[385,3]]},"703":{"position":[[19,3]]},"709":{"position":[[39,3],[102,3],[902,3]]},"717":{"position":[[170,3],[216,3]]},"718":{"position":[[32,3],[196,3]]},"778":{"position":[[13,3]]},"783":{"position":[[197,3]]},"784":{"position":[[11,3]]},"801":{"position":[[83,3]]},"901":{"position":[[19,3]]},"1104":{"position":[[735,3]]},"1184":{"position":[[621,3]]},"1206":{"position":[[83,3]]},"1301":{"position":[[30,3]]},"1302":{"position":[[86,4]]},"1322":{"position":[[8,3]]}},"keywords":{}}],["web.major",{"_index":2977,"title":{},"content":{"455":{"position":[[722,9]]}},"keywords":{}}],["webassembl",{"_index":492,"title":{"1276":{"position":[[11,11]]}},"content":{"30":{"position":[[235,11]]},"228":{"position":[[377,11]]},"336":{"position":[[453,13]]},"357":{"position":[[619,12]]},"391":{"position":[[240,12]]},"408":{"position":[[3435,12],[3471,11],[5053,11]]},"454":{"position":[[3,11],[269,11]]},"463":{"position":[[100,11]]},"470":{"position":[[239,11]]},"524":{"position":[[724,12]]},"581":{"position":[[466,11]]},"1276":{"position":[[67,12],[190,11],[658,11]]}},"keywords":{}}],["webgpu",{"_index":2500,"title":{},"content":{"404":{"position":[[117,6],[289,6],[334,6]]},"408":{"position":[[5236,7]]}},"keywords":{}}],["webkit",{"_index":6241,"title":{},"content":{"1216":{"position":[[1,7]]}},"keywords":{}}],["weblock",{"_index":2989,"title":{},"content":{"458":{"position":[[1355,8]]}},"keywords":{}}],["webpack",{"_index":1263,"title":{"674":{"position":[[11,8]]}},"content":{"188":{"position":[[1725,7]]},"333":{"position":[[149,7]]},"729":{"position":[[41,7]]},"730":{"position":[[153,8]]},"910":{"position":[[146,7]]},"1176":{"position":[[40,8],[223,7],[293,7]]},"1202":{"position":[[41,7]]},"1228":{"position":[[49,7]]},"1266":{"position":[[63,8],[84,7],[232,7],[321,7]]}},"keywords":{}}],["webpack.config.j",{"_index":3849,"title":{},"content":{"674":{"position":[[8,18]]},"1176":{"position":[[321,17],[427,17]]},"1266":{"position":[[147,17]]}},"keywords":{}}],["webpack.defineplugin",{"_index":3853,"title":{},"content":{"674":{"position":[[158,22]]}},"keywords":{}}],["webpack.provideplugin",{"_index":5267,"title":{},"content":{"910":{"position":[[243,23]]}},"keywords":{}}],["webpag",{"_index":2607,"title":{},"content":{"410":{"position":[[2256,8]]}},"keywords":{}}],["webrtc",{"_index":1361,"title":{"210":{"position":[[32,7]]},"261":{"position":[[17,6]]},"609":{"position":[[52,6]]},"614":{"position":[[8,8]]},"868":{"position":[[64,6]]},"900":{"position":[[4,6]]},"901":{"position":[[8,8]]},"902":{"position":[[26,6]]},"903":{"position":[[19,6]]},"904":{"position":[[20,6]]},"908":{"position":[[22,6]]},"911":{"position":[[27,6]]}},"content":{"210":{"position":[[96,7],[236,8]]},"212":{"position":[[594,6]]},"261":{"position":[[102,7],[304,8],[661,6]]},"289":{"position":[[1549,6],[1604,6],[1893,6]]},"481":{"position":[[369,6]]},"504":{"position":[[1280,6]]},"614":{"position":[[1,6],[385,6],[533,6],[784,6],[846,6],[996,6]]},"620":{"position":[[435,6]]},"632":{"position":[[786,7]]},"749":{"position":[[16028,6]]},"793":{"position":[[737,6]]},"868":{"position":[[64,6]]},"901":{"position":[[1,6],[249,6],[548,6],[701,6]]},"903":{"position":[[132,6],[456,6]]},"904":{"position":[[63,6],[1278,6],[1395,8],[2331,6],[2877,6],[3176,6]]},"905":{"position":[[5,6]]},"906":{"position":[[43,6],[959,8]]},"911":{"position":[[39,6],[123,6],[237,6],[326,6]]},"912":{"position":[[159,6]]},"913":{"position":[[328,6]]},"1121":{"position":[[191,6],[419,8]]},"1124":{"position":[[2280,7]]}},"keywords":{}}],["webrtc.html",{"_index":1461,"title":{},"content":{"243":{"position":[[527,11]]}},"keywords":{}}],["webrtc.html?console=webrtc",{"_index":4337,"title":{},"content":{"749":{"position":[[15388,26]]}},"keywords":{}}],["webrtcpool",{"_index":1364,"title":{},"content":{"210":{"position":[[251,10]]}},"keywords":{}}],["webrtcpool.error$.subscribe((error",{"_index":1375,"title":{},"content":{"210":{"position":[[540,35]]}},"keywords":{}}],["webserv",{"_index":3680,"title":{},"content":{"624":{"position":[[1107,10]]},"702":{"position":[[347,10]]},"799":{"position":[[382,10]]},"1089":{"position":[[134,9]]},"1210":{"position":[[540,10]]},"1227":{"position":[[398,9],[875,10]]},"1265":{"position":[[391,9],[849,10]]}},"keywords":{}}],["websit",{"_index":444,"title":{},"content":{"27":{"position":[[361,7]]},"458":{"position":[[431,8]]},"475":{"position":[[6,8]]},"617":{"position":[[944,7],[1000,9]]},"656":{"position":[[344,7]]},"697":{"position":[[160,7]]},"702":{"position":[[850,7]]},"736":{"position":[[19,7],[168,7]]},"779":{"position":[[16,8],[142,7]]},"781":{"position":[[6,8],[234,7]]},"783":{"position":[[22,8]]}},"keywords":{}}],["websocket",{"_index":1055,"title":{"609":{"position":[[0,10]]},"611":{"position":[[9,12]]},"891":{"position":[[0,9]]},"892":{"position":[[13,9]]},"893":{"position":[[15,9]]},"911":{"position":[[13,9]]},"1219":{"position":[[13,9]]}},"content":{"113":{"position":[[262,10]]},"165":{"position":[[199,9]]},"174":{"position":[[3092,11]]},"238":{"position":[[175,10]]},"261":{"position":[[674,9]]},"410":{"position":[[1710,9]]},"464":{"position":[[173,9]]},"476":{"position":[[128,12]]},"491":{"position":[[617,11],[1487,11],[1656,11]]},"570":{"position":[[743,9]]},"610":{"position":[[852,11]]},"611":{"position":[[1,10],[350,10],[594,9],[932,9],[1314,10]]},"612":{"position":[[104,11],[1344,11]]},"614":{"position":[[929,11]]},"616":{"position":[[6,10]]},"618":{"position":[[143,10]]},"619":{"position":[[137,9]]},"620":{"position":[[30,11],[423,11]]},"621":{"position":[[1,11],[756,11]]},"622":{"position":[[1,11],[298,11],[695,10]]},"623":{"position":[[1,11],[43,9],[315,10],[768,10]]},"624":{"position":[[630,10],[1568,10]]},"736":{"position":[[184,9],[368,10]]},"781":{"position":[[261,9],[498,9]]},"793":{"position":[[695,9]]},"871":{"position":[[289,9]]},"875":{"position":[[7175,10]]},"885":{"position":[[1277,11]]},"886":{"position":[[4003,9],[4321,10],[4335,9],[4969,9]]},"892":{"position":[[105,11],[219,9]]},"893":{"position":[[160,11]]},"901":{"position":[[560,10],[636,10]]},"904":{"position":[[2965,9],[3023,9]]},"906":{"position":[[563,9]]},"911":{"position":[[50,9],[248,9],[443,9],[579,9],[819,9]]},"988":{"position":[[4948,9]]},"1124":{"position":[[2260,10]]},"1219":{"position":[[87,9],[410,11],[850,11]]}},"keywords":{}}],["websocket"",{"_index":1498,"title":{},"content":{"244":{"position":[[703,15]]}},"keywords":{}}],["websocket('ws://example.com",{"_index":3568,"title":{},"content":{"611":{"position":[[646,30]]}},"keywords":{}}],["websocket('wss://example.com/api/sync/stream",{"_index":5478,"title":{},"content":{"988":{"position":[[5219,47]]}},"keywords":{}}],["websocketconstructor",{"_index":1373,"title":{},"content":{"210":{"position":[[487,21]]},"261":{"position":[[728,21]]},"904":{"position":[[3038,21]]},"911":{"position":[[797,21]]}},"keywords":{}}],["websocketimpl",{"_index":5145,"title":{},"content":{"886":{"position":[[4601,15]]}},"keywords":{}}],["websockets.long",{"_index":3672,"title":{},"content":{"623":{"position":[[436,15]]}},"keywords":{}}],["websql",{"_index":75,"title":{"5":{"position":[[0,7]]},"7":{"position":[[5,7]]},"435":{"position":[[16,7]]},"455":{"position":[[9,7]]},"709":{"position":[[27,6]]}},"content":{"5":{"position":[[40,7],[89,6],[134,6],[219,6],[273,10]]},"7":{"position":[[28,6],[246,6],[305,10]]},"16":{"position":[[322,7]]},"35":{"position":[[174,7]]},"435":{"position":[[1,7],[246,6]]},"455":{"position":[[1,6],[252,6],[339,6],[685,6],[770,7],[826,6]]},"660":{"position":[[83,6]]},"696":{"position":[[845,6],[913,6]]},"709":{"position":[[152,7],[854,6]]},"837":{"position":[[1414,7],[1826,8]]},"1324":{"position":[[104,6],[143,6]]}},"keywords":{}}],["websqlit",{"_index":4782,"title":{},"content":{"837":{"position":[[1791,9]]}},"keywords":{}}],["webstorag",{"_index":2956,"title":{},"content":{"451":{"position":[[56,10]]}},"keywords":{}}],["webtransport",{"_index":3546,"title":{"609":{"position":[[62,12]]},"613":{"position":[[12,12]]}},"content":{"613":{"position":[[1,12],[352,12],[545,12],[657,12],[737,12],[902,12],[1048,13]]},"614":{"position":[[948,13]]},"616":{"position":[[21,12]]},"620":{"position":[[85,12],[446,12],[497,12],[661,12]]},"624":{"position":[[851,13],[1277,12]]},"901":{"position":[[575,13],[650,12]]}},"keywords":{}}],["webwork",{"_index":1028,"title":{"460":{"position":[[0,9]]}},"content":{"100":{"position":[[285,10]]},"227":{"position":[[259,10]]},"392":{"position":[[3218,11],[3232,9],[3822,9]]},"433":{"position":[[352,10]]},"453":{"position":[[332,9]]},"460":{"position":[[267,10],[352,9],[480,9],[749,9],[823,10],[1092,10],[1188,10]]},"463":{"position":[[706,9],[948,9]]},"464":{"position":[[356,9],[872,9]]},"465":{"position":[[217,9]]},"466":{"position":[[181,9],[308,9]]},"467":{"position":[[154,9],[312,9]]},"468":{"position":[[332,9]]},"469":{"position":[[221,10],[1173,10]]},"470":{"position":[[411,9]]},"801":{"position":[[32,9],[347,10],[607,10]]},"1068":{"position":[[346,9]]},"1115":{"position":[[664,11]]},"1117":{"position":[[569,11]]},"1130":{"position":[[360,9]]},"1207":{"position":[[355,10]]},"1210":{"position":[[45,10]]},"1211":{"position":[[89,10]]},"1246":{"position":[[111,9]]},"1266":{"position":[[520,12]]},"1301":{"position":[[623,9]]}},"keywords":{}}],["week",{"_index":2830,"title":{},"content":{"420":{"position":[[142,5],[396,5]]},"702":{"position":[[897,6]]}},"keywords":{}}],["weekli",{"_index":2832,"title":{},"content":{"420":{"position":[[191,6]]}},"keywords":{}}],["well",{"_index":533,"title":{},"content":{"34":{"position":[[266,4]]},"40":{"position":[[186,5]]},"58":{"position":[[23,4]]},"68":{"position":[[118,4]]},"73":{"position":[[41,4]]},"126":{"position":[[292,4]]},"222":{"position":[[178,4]]},"225":{"position":[[150,4]]},"231":{"position":[[95,4]]},"267":{"position":[[29,4]]},"281":{"position":[[179,4],[224,4]]},"289":{"position":[[597,4]]},"303":{"position":[[18,5]]},"325":{"position":[[204,4]]},"354":{"position":[[371,4],[1241,4]]},"362":{"position":[[537,5]]},"369":{"position":[[209,4]]},"394":{"position":[[1427,5]]},"411":{"position":[[3320,5]]},"412":{"position":[[8214,4],[12308,5]]},"418":{"position":[[265,4]]},"546":{"position":[[205,5]]},"606":{"position":[[205,5]]},"641":{"position":[[256,4]]},"829":{"position":[[2858,4]]},"836":{"position":[[1202,4]]},"902":{"position":[[497,4]]},"1313":{"position":[[225,4]]}},"keywords":{}}],["weren't",{"_index":2540,"title":{},"content":{"408":{"position":[[1455,7]]}},"keywords":{}}],["what'",{"_index":2433,"title":{},"content":{"399":{"position":[[631,6]]}},"keywords":{}}],["what.touppercas",{"_index":6504,"title":{},"content":{"1311":{"position":[[754,19]]}},"keywords":{}}],["whatev",{"_index":3189,"title":{},"content":{"496":{"position":[[56,8]]},"1085":{"position":[[619,8]]}},"keywords":{}}],["whatsapp",{"_index":521,"title":{},"content":{"33":{"position":[[477,8]]},"414":{"position":[[24,8]]},"416":{"position":[[100,9]]},"418":{"position":[[134,10]]},"696":{"position":[[435,9]]}},"keywords":{}}],["whenev",{"_index":1170,"title":{},"content":{"156":{"position":[[148,8]]},"159":{"position":[[213,8]]},"168":{"position":[[225,8]]},"196":{"position":[[49,8]]},"233":{"position":[[116,8]]},"253":{"position":[[246,8]]},"322":{"position":[[270,8]]},"323":{"position":[[54,8]]},"329":{"position":[[62,8]]},"344":{"position":[[159,8]]},"411":{"position":[[3242,8]]},"421":{"position":[[635,8]]},"455":{"position":[[589,8]]},"458":{"position":[[1143,8]]},"480":{"position":[[799,8]]},"493":{"position":[[387,8]]},"494":{"position":[[250,8],[562,8]]},"515":{"position":[[255,8]]},"518":{"position":[[216,8]]},"529":{"position":[[75,8]]},"541":{"position":[[825,8]]},"542":{"position":[[973,8]]},"562":{"position":[[1264,8]]},"565":{"position":[[240,8]]},"571":{"position":[[814,8],[966,8]]},"575":{"position":[[295,8]]},"580":{"position":[[617,8]]},"601":{"position":[[806,8]]},"626":{"position":[[932,8]]},"627":{"position":[[193,8]]},"711":{"position":[[555,8]]},"770":{"position":[[21,8]]},"781":{"position":[[869,8]]},"829":{"position":[[3669,8]]},"979":{"position":[[14,8]]},"1007":{"position":[[1958,8]]},"1082":{"position":[[60,8]]},"1148":{"position":[[800,8]]},"1208":{"position":[[146,8]]},"1313":{"position":[[899,8]]},"1317":{"position":[[1,8]]}},"keywords":{}}],["where('ag",{"_index":5354,"title":{},"content":{"949":{"position":[[162,13]]}},"keywords":{}}],["where('ownerid",{"_index":4887,"title":{},"content":{"858":{"position":[[338,16]]}},"keywords":{}}],["wherea",{"_index":1720,"title":{},"content":{"298":{"position":[[567,7]]},"359":{"position":[[45,7]]},"535":{"position":[[483,7]]}},"keywords":{}}],["whereisai/ua",{"_index":2472,"title":{},"content":{"401":{"position":[[510,13]]}},"keywords":{}}],["wherev",{"_index":3123,"title":{},"content":{"479":{"position":[[456,8]]}},"keywords":{}}],["whether",{"_index":1065,"title":{},"content":{"117":{"position":[[134,7]]},"148":{"position":[[303,7]]},"151":{"position":[[303,7]]},"178":{"position":[[142,7]]},"207":{"position":[[83,7]]},"212":{"position":[[541,7]]},"238":{"position":[[111,7]]},"239":{"position":[[92,7]]},"254":{"position":[[73,7]]},"267":{"position":[[1463,7]]},"286":{"position":[[132,7]]},"361":{"position":[[78,7]]},"369":{"position":[[333,7],[989,7]]},"371":{"position":[[112,7]]},"388":{"position":[[387,7]]},"412":{"position":[[2347,7]]},"446":{"position":[[114,7],[929,7]]},"490":{"position":[[75,7]]},"567":{"position":[[1140,7]]},"574":{"position":[[341,7]]},"785":{"position":[[568,7]]},"839":{"position":[[1094,7]]},"1049":{"position":[[37,7]]},"1147":{"position":[[420,7]]}},"keywords":{}}],["whitespac",{"_index":4287,"title":{},"content":{"749":{"position":[[11619,10]]}},"keywords":{}}],["whoami",{"_index":4602,"title":{},"content":{"789":{"position":[[480,7]]},"791":{"position":[[348,7]]}},"keywords":{}}],["whole",{"_index":249,"title":{},"content":{"15":{"position":[[125,5]]},"352":{"position":[[104,5]]},"365":{"position":[[835,5]]},"403":{"position":[[56,5]]},"469":{"position":[[1238,5]]},"501":{"position":[[423,5]]},"612":{"position":[[465,5]]},"647":{"position":[[11,5]]},"764":{"position":[[240,5]]},"775":{"position":[[322,5]]},"783":{"position":[[324,5]]},"784":{"position":[[450,5]]},"800":{"position":[[119,5]]},"826":{"position":[[561,5],[986,5]]},"888":{"position":[[51,5]]},"1077":{"position":[[102,5]]},"1094":{"position":[[638,5]]},"1116":{"position":[[129,5]]},"1124":{"position":[[332,5]]},"1184":{"position":[[359,6]]},"1194":{"position":[[244,5]]},"1198":{"position":[[787,5]]},"1271":{"position":[[456,5]]},"1295":{"position":[[901,5]]},"1300":{"position":[[470,5]]},"1304":{"position":[[1261,5]]},"1316":{"position":[[3071,5],[3676,5]]},"1318":{"position":[[673,5]]}},"keywords":{}}],["whose",{"_index":2676,"title":{},"content":{"412":{"position":[[3194,5]]},"724":{"position":[[690,5],[1560,5]]},"898":{"position":[[1634,5]]}},"keywords":{}}],["wide",{"_index":1038,"title":{},"content":{"105":{"position":[[15,6]]},"162":{"position":[[322,6]]},"177":{"position":[[228,4]]},"189":{"position":[[321,6]]},"267":{"position":[[1428,4]]},"287":{"position":[[593,4]]},"320":{"position":[[96,6]]},"364":{"position":[[226,6]]},"454":{"position":[[169,4]]},"469":{"position":[[12,4]]},"613":{"position":[[700,6],[927,6]]},"624":{"position":[[925,6]]},"788":{"position":[[32,4]]},"790":{"position":[[41,5]]},"792":{"position":[[43,5]]},"904":{"position":[[511,4]]},"1124":{"position":[[55,4],[620,4]]},"1134":{"position":[[314,4]]},"1272":{"position":[[246,4]]}},"keywords":{}}],["widespread",{"_index":3620,"title":{},"content":{"613":{"position":[[612,10]]}},"keywords":{}}],["widget",{"_index":1231,"title":{},"content":{"177":{"position":[[242,7]]}},"keywords":{}}],["wifi",{"_index":5246,"title":{},"content":{"902":{"position":[[780,4]]}},"keywords":{}}],["wiki",{"_index":2231,"title":{},"content":{"392":{"position":[[798,4]]}},"keywords":{}}],["wild",{"_index":2746,"title":{},"content":{"412":{"position":[[11550,5]]}},"keywords":{}}],["wildcard",{"_index":5947,"title":{},"content":{"1103":{"position":[[139,8]]}},"keywords":{}}],["win",{"_index":231,"title":{},"content":{"14":{"position":[[860,4]]},"203":{"position":[[73,4]]},"250":{"position":[[33,4]]},"412":{"position":[[2370,5],[3208,4],[3298,4]]},"432":{"position":[[1344,3]]},"496":{"position":[[22,5],[645,4]]},"635":{"position":[[233,4]]},"688":{"position":[[891,4]]},"698":{"position":[[645,7],[1352,7],[1832,7],[2041,7]]},"1305":{"position":[[168,4]]}},"keywords":{}}],["window",{"_index":1178,"title":{},"content":{"160":{"position":[[270,8]]},"299":{"position":[[806,7]]},"330":{"position":[[127,7]]},"427":{"position":[[1324,7]]},"451":{"position":[[895,6]]},"475":{"position":[[266,6]]},"502":{"position":[[1252,7]]},"519":{"position":[[60,8]]},"729":{"position":[[331,7],[356,7],[364,7]]},"958":{"position":[[27,7]]},"964":{"position":[[262,8],[319,7],[498,6]]},"1202":{"position":[[370,7],[395,7],[403,7]]},"1300":{"position":[[768,6]]}},"keywords":{}}],["window.process",{"_index":5268,"title":{},"content":{"910":{"position":[[378,14]]}},"keywords":{}}],["window.sqliteplugin",{"_index":150,"title":{},"content":{"11":{"position":[[278,21]]}},"keywords":{}}],["windows.handl",{"_index":1222,"title":{},"content":{"174":{"position":[[2021,16]]}},"keywords":{}}],["windows.storag",{"_index":2894,"title":{},"content":{"427":{"position":[[1445,15]]}},"keywords":{}}],["winner",{"_index":3941,"title":{},"content":{"698":{"position":[[571,6],[766,7]]}},"keywords":{}}],["wins"",{"_index":2697,"title":{},"content":{"412":{"position":[[5300,10],[5522,10]]}},"keywords":{}}],["wipe",{"_index":2723,"title":{},"content":{"412":{"position":[[7887,5],[8716,6]]},"977":{"position":[[1,5]]}},"keywords":{}}],["wire",{"_index":374,"title":{},"content":{"22":{"position":[[276,5]]},"585":{"position":[[263,7]]},"700":{"position":[[792,4]]},"871":{"position":[[793,4]]},"1022":{"position":[[59,4]]}},"keywords":{}}],["wish",{"_index":6091,"title":{},"content":{"1151":{"position":[[512,4]]},"1178":{"position":[[511,4]]}},"keywords":{}}],["withcredenti",{"_index":5050,"title":{},"content":{"875":{"position":[[8178,16],[9597,16]]}},"keywords":{}}],["withdist",{"_index":2313,"title":{},"content":{"394":{"position":[[747,12]]}},"keywords":{}}],["withdistance.sort(sortbyobjectnumberproperty('distance')).revers",{"_index":2318,"title":{},"content":{"394":{"position":[[876,68]]}},"keywords":{}}],["withhold",{"_index":1878,"title":{},"content":{"310":{"position":[[192,11]]}},"keywords":{}}],["within",{"_index":291,"title":{},"content":{"17":{"position":[[219,6]]},"65":{"position":[[1060,6]]},"94":{"position":[[224,6]]},"101":{"position":[[217,6]]},"107":{"position":[[164,6]]},"172":{"position":[[90,6],[139,6]]},"173":{"position":[[3224,6]]},"174":{"position":[[1035,6]]},"201":{"position":[[115,6]]},"219":{"position":[[364,6]]},"222":{"position":[[347,6]]},"228":{"position":[[240,6]]},"235":{"position":[[100,6]]},"275":{"position":[[179,6]]},"286":{"position":[[334,6]]},"287":{"position":[[684,6]]},"291":{"position":[[127,6]]},"329":{"position":[[174,6]]},"354":{"position":[[632,6]]},"356":{"position":[[263,6]]},"369":{"position":[[305,6]]},"371":{"position":[[291,6]]},"392":{"position":[[1285,6]]},"397":{"position":[[85,6]]},"398":{"position":[[1852,6]]},"408":{"position":[[1637,6]]},"433":{"position":[[343,6]]},"438":{"position":[[295,6]]},"445":{"position":[[1982,6]]},"446":{"position":[[1268,6]]},"503":{"position":[[237,6]]},"522":{"position":[[193,6]]},"523":{"position":[[84,6]]},"543":{"position":[[39,6]]},"569":{"position":[[780,6]]},"570":{"position":[[398,6]]},"571":{"position":[[1486,6]]},"577":{"position":[[48,6]]},"579":{"position":[[1,6]]},"591":{"position":[[655,6]]},"603":{"position":[[39,6]]},"614":{"position":[[146,6]]},"622":{"position":[[653,6]]},"723":{"position":[[449,6],[1391,6]]},"871":{"position":[[631,6]]},"902":{"position":[[391,6]]},"946":{"position":[[43,6]]},"1072":{"position":[[758,6]]},"1132":{"position":[[1510,6]]},"1151":{"position":[[229,6]]},"1178":{"position":[[228,6]]}},"keywords":{}}],["withmetafield",{"_index":5726,"title":{},"content":{"1051":{"position":[[320,15]]}},"keywords":{}}],["without",{"_index":385,"title":{"711":{"position":[[22,7]]},"778":{"position":[[13,7]]},"1319":{"position":[[10,7]]}},"content":{"23":{"position":[[230,7]]},"27":{"position":[[89,7]]},"29":{"position":[[165,7]]},"131":{"position":[[158,7]]},"162":{"position":[[628,7]]},"164":{"position":[[221,7]]},"183":{"position":[[118,7]]},"185":{"position":[[337,7]]},"210":{"position":[[709,7]]},"212":{"position":[[46,7],[462,7],[642,7]]},"237":{"position":[[243,7]]},"261":{"position":[[188,7]]},"274":{"position":[[145,7]]},"276":{"position":[[88,7]]},"279":{"position":[[279,7]]},"280":{"position":[[261,7]]},"282":{"position":[[405,7]]},"289":{"position":[[413,7]]},"291":{"position":[[278,7]]},"292":{"position":[[269,7]]},"295":{"position":[[226,7]]},"309":{"position":[[197,7]]},"321":{"position":[[265,7]]},"330":{"position":[[135,7]]},"346":{"position":[[591,7]]},"362":{"position":[[96,7]]},"369":{"position":[[707,7]]},"375":{"position":[[117,7]]},"381":{"position":[[532,7]]},"383":{"position":[[440,7]]},"408":{"position":[[675,7],[1325,7],[2870,7]]},"410":{"position":[[1552,7]]},"411":{"position":[[3037,7],[3888,7]]},"412":{"position":[[31,7]]},"414":{"position":[[129,7]]},"415":{"position":[[218,7]]},"419":{"position":[[277,7]]},"424":{"position":[[447,7]]},"430":{"position":[[978,7]]},"433":{"position":[[602,7]]},"445":{"position":[[2070,7]]},"455":{"position":[[692,7]]},"467":{"position":[[231,7]]},"482":{"position":[[1137,7]]},"487":{"position":[[427,7]]},"489":{"position":[[684,7]]},"504":{"position":[[1388,7]]},"534":{"position":[[267,7]]},"542":{"position":[[1000,7]]},"548":{"position":[[263,7]]},"550":{"position":[[148,7]]},"570":{"position":[[599,7]]},"571":{"position":[[258,7]]},"574":{"position":[[246,7]]},"582":{"position":[[106,7]]},"585":{"position":[[237,7]]},"594":{"position":[[265,7]]},"608":{"position":[[261,7]]},"611":{"position":[[186,7]]},"612":{"position":[[331,7]]},"614":{"position":[[190,7]]},"616":{"position":[[484,7]]},"617":{"position":[[2359,8]]},"618":{"position":[[739,7]]},"621":{"position":[[323,7]]},"623":{"position":[[374,7]]},"638":{"position":[[911,7]]},"643":{"position":[[300,7]]},"644":{"position":[[726,7]]},"705":{"position":[[771,7]]},"707":{"position":[[130,7]]},"710":{"position":[[584,7],[1253,7]]},"723":{"position":[[536,7],[930,7],[1281,7]]},"749":{"position":[[5985,7],[6992,7],[7111,7]]},"782":{"position":[[450,7]]},"801":{"position":[[519,7]]},"816":{"position":[[250,7]]},"838":{"position":[[1288,7]]},"875":{"position":[[9169,7]]},"902":{"position":[[193,7]]},"912":{"position":[[459,7]]},"943":{"position":[[194,7]]},"977":{"position":[[163,7],[378,7]]},"981":{"position":[[1438,7]]},"1008":{"position":[[275,7]]},"1065":{"position":[[55,7],[1979,7]]},"1068":{"position":[[211,7]]},"1071":{"position":[[274,7]]},"1072":{"position":[[1579,7]]},"1092":{"position":[[468,7]]},"1093":{"position":[[504,7]]},"1094":{"position":[[596,7]]},"1107":{"position":[[446,7]]},"1120":{"position":[[265,7]]},"1150":{"position":[[630,7]]},"1151":{"position":[[789,7]]},"1164":{"position":[[354,7]]},"1178":{"position":[[786,7]]},"1219":{"position":[[196,7]]},"1252":{"position":[[227,7]]},"1282":{"position":[[293,7],[952,7]]},"1295":{"position":[[1427,7]]},"1297":{"position":[[351,7]]},"1300":{"position":[[136,7]]},"1304":{"position":[[1720,7]]},"1305":{"position":[[9,7]]},"1324":{"position":[[840,7]]}},"keywords":{}}],["withoutrowid",{"_index":6375,"title":{},"content":{"1282":{"position":[[1066,13],[1218,13]]}},"keywords":{}}],["won't",{"_index":750,"title":{},"content":{"50":{"position":[[74,5]]},"357":{"position":[[415,5]]},"421":{"position":[[908,5]]}},"keywords":{}}],["word",{"_index":2192,"title":{},"content":{"390":{"position":[[647,4]]},"396":{"position":[[1316,5]]},"569":{"position":[[45,4]]},"699":{"position":[[249,4]]},"1023":{"position":[[406,5],[520,5],[526,4]]}},"keywords":{}}],["word"",{"_index":5642,"title":{},"content":{"1023":{"position":[[627,10]]}},"keywords":{}}],["words.map(word",{"_index":5641,"title":{},"content":{"1023":{"position":[[474,14]]}},"keywords":{}}],["work",{"_index":46,"title":{"207":{"position":[[3,5]]},"255":{"position":[[21,6]]},"292":{"position":[[0,5]]},"481":{"position":[[17,5]]},"642":{"position":[[11,4]]},"696":{"position":[[8,5]]},"779":{"position":[[21,6]]},"1208":{"position":[[17,6]]},"1254":{"position":[[22,4]]},"1313":{"position":[[20,4]]},"1314":{"position":[[20,4]]}},"content":{"2":{"position":[[275,4]]},"6":{"position":[[434,4]]},"10":{"position":[[208,4]]},"15":{"position":[[226,6]]},"19":{"position":[[317,5]]},"20":{"position":[[264,4]]},"35":{"position":[[247,4]]},"38":{"position":[[117,4],[208,4],[1086,7]]},"47":{"position":[[34,7],[1196,5]]},"50":{"position":[[340,5]]},"58":{"position":[[17,5]]},"94":{"position":[[216,7]]},"104":{"position":[[145,7]]},"122":{"position":[[114,4]]},"129":{"position":[[653,5]]},"130":{"position":[[146,7]]},"138":{"position":[[179,7]]},"141":{"position":[[243,7]]},"147":{"position":[[6,7]]},"157":{"position":[[67,4],[296,7]]},"174":{"position":[[820,7]]},"179":{"position":[[64,4]]},"206":{"position":[[204,7]]},"212":{"position":[[41,4]]},"231":{"position":[[154,5]]},"237":{"position":[[205,4]]},"362":{"position":[[531,5]]},"368":{"position":[[304,4]]},"369":{"position":[[85,7],[965,7]]},"371":{"position":[[27,7],[221,4]]},"372":{"position":[[121,4]]},"380":{"position":[[34,4]]},"390":{"position":[[329,4]]},"392":{"position":[[2151,4]]},"394":{"position":[[89,5]]},"396":{"position":[[1227,4]]},"404":{"position":[[29,5]]},"407":{"position":[[621,7],[1029,4]]},"408":{"position":[[5486,4]]},"410":{"position":[[969,4]]},"411":{"position":[[4587,5],[5558,7]]},"412":{"position":[[4418,5],[6932,5],[9354,5]]},"419":{"position":[[261,4]]},"420":{"position":[[852,4]]},"421":{"position":[[196,6],[791,7]]},"433":{"position":[[276,7]]},"439":{"position":[[379,5]]},"440":{"position":[[35,7],[127,4]]},"445":{"position":[[480,4]]},"446":{"position":[[224,7],[662,4]]},"452":{"position":[[655,8]]},"457":{"position":[[217,5]]},"460":{"position":[[505,4]]},"469":{"position":[[1148,4]]},"493":{"position":[[24,5]]},"498":{"position":[[361,6]]},"556":{"position":[[1761,4]]},"574":{"position":[[233,7]]},"590":{"position":[[732,5]]},"613":{"position":[[573,7],[678,7]]},"614":{"position":[[407,4],[856,5]]},"627":{"position":[[312,5]]},"632":{"position":[[856,4]]},"634":{"position":[[389,5]]},"666":{"position":[[271,4]]},"668":{"position":[[145,5],[411,5]]},"688":{"position":[[541,5],[754,4]]},"696":{"position":[[691,5]]},"697":{"position":[[478,4]]},"698":{"position":[[803,5]]},"704":{"position":[[100,5]]},"705":{"position":[[80,6],[450,5],[1308,4]]},"714":{"position":[[89,4],[351,5]]},"723":{"position":[[913,4]]},"749":{"position":[[1894,4],[6987,4],[7106,4],[8977,4]]},"772":{"position":[[170,4],[2043,5]]},"775":{"position":[[45,5]]},"781":{"position":[[335,5]]},"784":{"position":[[421,5],[743,5]]},"793":{"position":[[903,5]]},"811":{"position":[[139,5]]},"817":{"position":[[245,5]]},"830":{"position":[[48,4]]},"831":{"position":[[492,5]]},"835":{"position":[[55,5]]},"836":{"position":[[1015,4]]},"838":{"position":[[685,4]]},"840":{"position":[[392,5]]},"842":{"position":[[305,4]]},"863":{"position":[[217,5]]},"875":{"position":[[9399,4]]},"882":{"position":[[291,4]]},"884":{"position":[[91,6]]},"893":{"position":[[289,5]]},"901":{"position":[[669,4]]},"904":{"position":[[70,6]]},"906":{"position":[[24,4]]},"908":{"position":[[26,5]]},"913":{"position":[[212,7]]},"948":{"position":[[775,5]]},"956":{"position":[[95,5]]},"962":{"position":[[6,5]]},"975":{"position":[[69,5]]},"981":{"position":[[165,5],[1139,5]]},"982":{"position":[[42,5]]},"988":{"position":[[2186,4]]},"1018":{"position":[[456,5],[538,6],[579,5],[616,5]]},"1065":{"position":[[1923,5]]},"1071":{"position":[[163,4]]},"1088":{"position":[[299,5]]},"1093":{"position":[[235,4],[331,4]]},"1095":{"position":[[172,4]]},"1117":{"position":[[508,5]]},"1133":{"position":[[474,4]]},"1141":{"position":[[98,5],[280,4]]},"1176":{"position":[[174,4]]},"1183":{"position":[[34,6]]},"1191":{"position":[[628,4]]},"1198":{"position":[[191,6],[1767,4]]},"1208":{"position":[[615,4]]},"1229":{"position":[[216,5]]},"1258":{"position":[[10,4],[42,4],[138,5]]},"1259":{"position":[[10,4]]},"1271":{"position":[[1715,4]]},"1272":{"position":[[132,4]]},"1277":{"position":[[632,4]]},"1278":{"position":[[59,5]]},"1282":{"position":[[283,4],[339,5],[721,4]]},"1300":{"position":[[1016,4]]},"1301":{"position":[[501,4],[930,4]]},"1304":{"position":[[1370,4]]},"1305":{"position":[[1,7],[441,4]]},"1313":{"position":[[100,5],[219,5],[889,5]]},"1316":{"position":[[1529,5],[1805,5],[2504,5],[2577,4],[3117,5]]},"1318":{"position":[[764,4],[964,4]]},"1320":{"position":[[529,5]]}},"keywords":{}}],["work"",{"_index":3658,"title":{},"content":{"619":{"position":[[93,11]]}},"keywords":{}}],["work.complex",{"_index":5428,"title":{},"content":{"981":{"position":[[316,12]]}},"keywords":{}}],["workaround",{"_index":2542,"title":{},"content":{"408":{"position":[[2043,12]]},"458":{"position":[[992,10],[1286,10]]},"459":{"position":[[1107,10]]},"617":{"position":[[1140,10]]},"845":{"position":[[168,11]]},"1072":{"position":[[2115,12]]},"1135":{"position":[[263,11]]},"1198":{"position":[[828,11]]},"1315":{"position":[[1558,11]]}},"keywords":{}}],["worker",{"_index":2253,"title":{"721":{"position":[[15,8]]},"801":{"position":[[21,6]]},"1089":{"position":[[6,7]]},"1211":{"position":[[43,7]]},"1213":{"position":[[76,7]]},"1227":{"position":[[10,8]]},"1228":{"position":[[18,7]]},"1262":{"position":[[0,6]]},"1263":{"position":[[7,6]]},"1265":{"position":[[10,8]]},"1266":{"position":[[18,7]]},"1267":{"position":[[4,6]]},"1268":{"position":[[13,6]]}},"content":{"392":{"position":[[3337,6],[3711,6],[3753,6],[3847,7],[4117,6],[4183,6],[5090,6]]},"402":{"position":[[2813,6]]},"408":{"position":[[1756,8],[4732,7]]},"458":{"position":[[1500,7]]},"460":{"position":[[419,7],[549,6]]},"463":{"position":[[476,6]]},"469":{"position":[[990,6]]},"500":{"position":[[589,7]]},"642":{"position":[[71,6],[88,6]]},"693":{"position":[[392,6]]},"721":{"position":[[18,6],[127,7],[255,8],[331,7],[468,6]]},"749":{"position":[[3407,6],[3594,6],[23700,7]]},"757":{"position":[[98,6],[172,8]]},"793":{"position":[[482,6]]},"801":{"position":[[901,6]]},"1068":{"position":[[418,6]]},"1089":{"position":[[75,6]]},"1207":{"position":[[575,7]]},"1210":{"position":[[77,6],[389,8]]},"1211":{"position":[[477,6]]},"1212":{"position":[[92,7],[176,7],[239,6],[433,8]]},"1213":{"position":[[35,7],[162,6],[408,6],[809,7]]},"1225":{"position":[[8,6],[196,8],[375,7]]},"1226":{"position":[[113,8],[640,7]]},"1227":{"position":[[163,6],[523,7],[663,8]]},"1228":{"position":[[71,6],[97,6],[118,6],[162,6]]},"1229":{"position":[[172,6],[254,6]]},"1230":{"position":[[78,7],[349,6]]},"1231":{"position":[[95,7],[412,7],[509,8]]},"1233":{"position":[[38,7],[60,6],[95,7]]},"1238":{"position":[[185,6],[307,6],[586,8]]},"1239":{"position":[[372,7],[425,7],[750,8]]},"1246":{"position":[[4,7],[17,6],[140,6],[361,6],[921,6]]},"1263":{"position":[[82,8],[269,7]]},"1264":{"position":[[107,8],[273,6],[520,7]]},"1265":{"position":[[156,6],[517,7],[651,8]]},"1266":{"position":[[134,8],[553,8]]},"1267":{"position":[[59,6],[166,6],[196,6],[335,6]]},"1268":{"position":[[94,6],[250,6],[390,6],[637,8]]},"1301":{"position":[[828,6]]}},"keywords":{}}],["worker'",{"_index":6288,"title":{},"content":{"1246":{"position":[[246,8],[566,8]]}},"keywords":{}}],["worker('path/to/worker.j",{"_index":6327,"title":{},"content":{"1268":{"position":[[171,27]]}},"keywords":{}}],["worker(new",{"_index":2264,"title":{},"content":{"392":{"position":[[3925,10]]},"1268":{"position":[[481,10]]}},"keywords":{}}],["worker.addeventlistener('messag",{"_index":2278,"title":{},"content":{"392":{"position":[[4432,34]]}},"keywords":{}}],["worker.j",{"_index":2255,"title":{"1212":{"position":[[18,10]]}},"content":{"392":{"position":[[3487,9]]},"1212":{"position":[[127,9],[280,9]]},"1213":{"position":[[577,9]]},"1226":{"position":[[448,9],[593,11]]},"1227":{"position":[[12,9],[468,9],[921,10]]},"1228":{"position":[[19,9]]},"1264":{"position":[[351,9]]},"1265":{"position":[[5,9],[462,9]]},"1266":{"position":[[36,9],[583,11]]}},"keywords":{}}],["worker.postmessag",{"_index":2279,"title":{},"content":{"392":{"position":[[4478,20]]}},"keywords":{}}],["worker.removeeventlistener('messag",{"_index":2277,"title":{},"content":{"392":{"position":[[4378,37]]}},"keywords":{}}],["worker.t",{"_index":6264,"title":{},"content":{"1225":{"position":[[118,9]]},"1231":{"position":[[431,9]]},"1263":{"position":[[4,9]]}},"keywords":{}}],["workerinput",{"_index":6231,"title":{},"content":{"1210":{"position":[[637,12]]},"1226":{"position":[[564,12]]},"1227":{"position":[[889,12]]},"1229":{"position":[[30,12],[235,11]]},"1238":{"position":[[944,12]]},"1264":{"position":[[451,12]]},"1265":{"position":[[863,12]]},"1267":{"position":[[510,12]]},"1268":{"position":[[30,12],[145,12],[455,12]]}},"keywords":{}}],["workeropt",{"_index":6270,"title":{},"content":{"1226":{"position":[[651,14]]},"1264":{"position":[[531,14]]}},"keywords":{}}],["workers[lastworkerid",{"_index":2271,"title":{},"content":{"392":{"position":[[4126,24],[4192,24]]}},"keywords":{}}],["workerstorag",{"_index":6324,"title":{},"content":{"1267":{"position":[[473,13],[667,13],[761,13]]}},"keywords":{}}],["workflow",{"_index":2243,"title":{},"content":{"392":{"position":[[2423,8]]},"408":{"position":[[2785,10]]},"496":{"position":[[478,9]]},"644":{"position":[[765,9]]}},"keywords":{}}],["workload",{"_index":1008,"title":{},"content":{"91":{"position":[[40,8]]},"801":{"position":[[403,8]]}},"keywords":{}}],["world",{"_index":1610,"title":{},"content":{"266":{"position":[[356,7]]},"284":{"position":[[58,5]]},"301":{"position":[[29,5]]},"356":{"position":[[637,6]]},"396":{"position":[[342,6],[563,6]]},"441":{"position":[[8,5]]},"469":{"position":[[1394,5]]},"500":{"position":[[114,7]]},"510":{"position":[[786,6]]},"569":{"position":[[1054,6]]},"699":{"position":[[238,6]]},"798":{"position":[[247,5]]},"839":{"position":[[81,6]]},"1006":{"position":[[63,5],[268,5]]},"1007":{"position":[[326,5]]},"1009":{"position":[[16,5]]},"1123":{"position":[[358,6]]},"1209":{"position":[[329,5]]},"1304":{"position":[[1267,5]]}},"keywords":{}}],["worldwid",{"_index":6010,"title":{},"content":{"1123":{"position":[[104,9],[237,9]]}},"keywords":{}}],["worri",{"_index":1885,"title":{},"content":{"312":{"position":[[289,5]]},"721":{"position":[[284,5]]},"839":{"position":[[1051,5]]},"1084":{"position":[[432,6]]}},"keywords":{}}],["wors",{"_index":2486,"title":{},"content":{"402":{"position":[[1687,5]]},"521":{"position":[[300,5]]}},"keywords":{}}],["worst",{"_index":2749,"title":{},"content":{"412":{"position":[[11824,5]]}},"keywords":{}}],["worth",{"_index":1597,"title":{},"content":{"263":{"position":[[232,5]]},"432":{"position":[[513,5]]},"447":{"position":[[591,5]]}},"keywords":{}}],["wrap",{"_index":1628,"title":{},"content":{"269":{"position":[[215,7]]},"302":{"position":[[358,4]]},"482":{"position":[[415,4]]},"554":{"position":[[849,4]]},"693":{"position":[[416,4]]},"717":{"position":[[508,4],[719,4],[904,7]]},"718":{"position":[[292,4]]},"734":{"position":[[72,4]]},"745":{"position":[[37,7],[88,8],[135,7],[347,4],[496,7]]},"749":{"position":[[24151,7]]},"785":{"position":[[357,4]]},"932":{"position":[[863,7]]},"1031":{"position":[[115,4]]},"1154":{"position":[[25,7],[404,4],[700,7]]},"1163":{"position":[[328,4]]},"1182":{"position":[[328,4]]},"1222":{"position":[[169,4],[1347,7]]},"1225":{"position":[[49,4],[315,4]]},"1246":{"position":[[1158,4]]},"1263":{"position":[[209,4]]},"1270":{"position":[[113,8]]},"1286":{"position":[[343,4]]},"1287":{"position":[[389,4]]},"1288":{"position":[[349,4]]}},"keywords":{}}],["wrappedattachmentscompressionstorag",{"_index":5314,"title":{},"content":{"932":{"position":[[687,36],[950,38]]}},"keywords":{}}],["wrappedkeycompressionstorag",{"_index":4081,"title":{},"content":{"734":{"position":[[134,28],[314,30]]},"1237":{"position":[[577,28],[904,30]]}},"keywords":{}}],["wrappedkeyencryptioncryptojsstorag",{"_index":1894,"title":{},"content":{"315":{"position":[[171,35],[443,37]]},"482":{"position":[[300,35],[483,37]]},"554":{"position":[[525,35],[931,37]]},"564":{"position":[[236,35],[451,37]]},"638":{"position":[[230,35],[335,37]]},"717":{"position":[[558,35],[795,37]]},"1237":{"position":[[654,35],[944,37]]}},"keywords":{}}],["wrappedkeyencryptionwebcryptostorag",{"_index":4025,"title":{},"content":{"718":{"position":[[103,37],[377,38]]},"1184":{"position":[[544,36],[686,38]]}},"keywords":{}}],["wrappedloggerstorag",{"_index":4113,"title":{},"content":{"745":{"position":[[205,20],[401,22]]},"746":{"position":[[241,23],[289,22]]},"747":{"position":[[106,22]]}},"keywords":{}}],["wrappedvalidateajvstorag",{"_index":6283,"title":{},"content":{"1237":{"position":[[506,25],[867,27]]},"1286":{"position":[[200,25],[405,27]]}},"keywords":{}}],["wrappedvalidateismyjsonvalidstorag",{"_index":6387,"title":{},"content":{"1288":{"position":[[183,35],[411,37]]}},"keywords":{}}],["wrappedvalidatezschemastorag",{"_index":6386,"title":{},"content":{"1287":{"position":[[237,29],[451,31]]}},"keywords":{}}],["wrapper",{"_index":370,"title":{"1246":{"position":[[8,7]]}},"content":{"22":{"position":[[190,7]]},"33":{"position":[[28,7]]},"266":{"position":[[782,7],[822,7]]},"432":{"position":[[1024,7]]},"433":{"position":[[431,7]]},"441":{"position":[[418,7]]},"717":{"position":[[469,7]]},"734":{"position":[[33,7]]},"745":{"position":[[17,7]]},"793":{"position":[[401,8]]},"1184":{"position":[[278,7]]},"1198":{"position":[[162,7]]},"1212":{"position":[[54,8]]},"1246":{"position":[[39,7],[383,7],[1270,7],[1310,7],[1672,7],[1712,7]]},"1247":{"position":[[214,7]]},"1279":{"position":[[300,8]]},"1280":{"position":[[231,8]]}},"keywords":{}}],["write",{"_index":230,"title":{"464":{"position":[[17,7]]},"466":{"position":[[9,7]]},"1033":{"position":[[47,7]]},"1115":{"position":[[0,7]]},"1185":{"position":[[6,5]]},"1239":{"position":[[15,6]]}},"content":{"14":{"position":[[854,5]]},"27":{"position":[[107,5]]},"28":{"position":[[340,6]]},"31":{"position":[[104,7]]},"35":{"position":[[219,5]]},"41":{"position":[[276,5]]},"43":{"position":[[442,5]]},"201":{"position":[[294,6]]},"250":{"position":[[27,5]]},"253":{"position":[[176,5]]},"262":{"position":[[282,6]]},"265":{"position":[[656,6]]},"266":{"position":[[886,5]]},"301":{"position":[[164,7]]},"302":{"position":[[368,5],[671,6],[1140,5]]},"304":{"position":[[370,6]]},"358":{"position":[[276,5],[548,5],[647,5],[1063,6]]},"360":{"position":[[191,7]]},"362":{"position":[[717,7]]},"365":{"position":[[281,5]]},"376":{"position":[[335,7],[386,5]]},"380":{"position":[[165,7]]},"386":{"position":[[215,7]]},"392":{"position":[[1964,6]]},"407":{"position":[[138,5]]},"408":{"position":[[2863,6]]},"411":{"position":[[1190,7]]},"412":{"position":[[1265,7],[2364,5],[3292,5],[5516,5],[10125,6],[11326,5],[12944,7]]},"421":{"position":[[1200,6]]},"430":{"position":[[726,5]]},"433":{"position":[[193,5]]},"445":{"position":[[1445,5]]},"453":{"position":[[198,5]]},"458":{"position":[[524,5],[603,5],[1161,5],[1479,6]]},"459":{"position":[[95,7]]},"464":{"position":[[37,7],[489,5],[552,6],[728,6],[787,5],[1232,6]]},"465":{"position":[[468,5]]},"466":{"position":[[450,5]]},"467":{"position":[[573,6],[643,6]]},"469":{"position":[[279,7]]},"474":{"position":[[126,5]]},"477":{"position":[[213,6]]},"481":{"position":[[790,6]]},"489":{"position":[[333,7],[499,5]]},"490":{"position":[[94,6]]},"491":{"position":[[1171,6]]},"496":{"position":[[6,5],[629,5]]},"497":{"position":[[152,6]]},"559":{"position":[[1096,7]]},"566":{"position":[[867,5]]},"630":{"position":[[92,7],[691,5]]},"632":{"position":[[1916,6]]},"634":{"position":[[100,6]]},"635":{"position":[[227,5]]},"642":{"position":[[256,5]]},"647":{"position":[[1,5]]},"648":{"position":[[41,5],[322,6]]},"659":{"position":[[487,5]]},"682":{"position":[[80,6],[173,5],[227,6]]},"685":{"position":[[358,5]]},"686":{"position":[[661,6]]},"687":{"position":[[313,6]]},"688":{"position":[[885,5]]},"690":{"position":[[283,6]]},"696":{"position":[[495,6]]},"698":{"position":[[1095,5],[2309,5]]},"709":{"position":[[490,6],[1133,5]]},"711":{"position":[[584,5]]},"749":{"position":[[6383,5],[8671,5],[16744,5]]},"773":{"position":[[211,5]]},"774":{"position":[[204,6],[225,5],[267,5],[1053,5]]},"775":{"position":[[388,7]]},"785":{"position":[[326,5],[683,6]]},"795":{"position":[[14,5]]},"835":{"position":[[269,6]]},"854":{"position":[[1212,5]]},"857":{"position":[[474,6]]},"863":{"position":[[344,5]]},"875":{"position":[[1422,6],[1613,7],[3600,6],[4009,5],[5189,5],[5837,6],[8013,7]]},"885":{"position":[[200,6],[1121,5]]},"886":{"position":[[3318,6]]},"898":{"position":[[759,6]]},"908":{"position":[[322,5]]},"932":{"position":[[476,5]]},"970":{"position":[[63,5]]},"973":{"position":[[1,6]]},"981":{"position":[[1151,7]]},"982":{"position":[[97,6]]},"983":{"position":[[460,6],[565,5],[779,6],[819,5]]},"986":{"position":[[107,5],[184,5],[881,5],[916,6]]},"987":{"position":[[440,5]]},"988":{"position":[[4754,7]]},"990":{"position":[[153,5],[418,5],[526,5],[559,5]]},"1002":{"position":[[207,6]]},"1004":{"position":[[244,5]]},"1020":{"position":[[324,7],[529,5]]},"1022":{"position":[[381,6]]},"1032":{"position":[[278,7]]},"1033":{"position":[[44,6],[297,5]]},"1065":{"position":[[41,5]]},"1090":{"position":[[114,5],[1148,5],[1251,5]]},"1093":{"position":[[388,6]]},"1094":{"position":[[478,6]]},"1102":{"position":[[1303,5]]},"1106":{"position":[[87,6],[235,6],[518,6]]},"1108":{"position":[[182,6]]},"1115":{"position":[[1,7],[600,5]]},"1119":{"position":[[12,7]]},"1120":{"position":[[149,5],[453,5],[514,5],[606,6]]},"1137":{"position":[[171,5]]},"1143":{"position":[[572,6]]},"1156":{"position":[[142,7]]},"1162":{"position":[[185,6]]},"1164":{"position":[[849,5],[889,6],[971,6],[1045,6],[1144,6]]},"1165":{"position":[[1015,6]]},"1175":{"position":[[132,5]]},"1177":{"position":[[576,5]]},"1181":{"position":[[251,6]]},"1185":{"position":[[206,5]]},"1186":{"position":[[65,5]]},"1188":{"position":[[140,6],[206,6],[282,6]]},"1192":{"position":[[77,5]]},"1194":{"position":[[314,5]]},"1207":{"position":[[300,7]]},"1208":{"position":[[173,5],[292,5],[1117,5],[1474,5]]},"1209":{"position":[[269,6]]},"1211":{"position":[[523,7]]},"1214":{"position":[[800,5]]},"1215":{"position":[[557,6]]},"1239":{"position":[[100,7]]},"1246":{"position":[[1374,5]]},"1249":{"position":[[390,6]]},"1292":{"position":[[469,7]]},"1295":{"position":[[676,5]]},"1296":{"position":[[641,6]]},"1299":{"position":[[205,6],[280,5],[355,5]]},"1300":{"position":[[425,6],[660,5],[736,6]]},"1301":{"position":[[213,5]]},"1304":{"position":[[1330,5],[1559,5],[1709,5],[1760,5]]},"1305":{"position":[[162,5],[185,5],[657,5],[945,5]]},"1307":{"position":[[36,5],[216,6],[308,5],[332,5],[791,5]]},"1308":{"position":[[54,5]]},"1309":{"position":[[239,5]]},"1314":{"position":[[100,5],[212,6]]},"1315":{"position":[[528,5],[1313,5]]},"1316":{"position":[[640,6]]},"1318":{"position":[[28,5]]},"1320":{"position":[[576,6]]},"1322":{"position":[[416,5]]}},"keywords":{}}],["write.indexeddb",{"_index":3053,"title":{},"content":{"464":{"position":[[536,15]]}},"keywords":{}}],["write/read",{"_index":3775,"title":{},"content":{"659":{"position":[[302,10]]}},"keywords":{}}],["writebuff",{"_index":6207,"title":{},"content":{"1208":{"position":[[1151,11],[1524,11]]}},"keywords":{}}],["writeev",{"_index":3736,"title":{"649":{"position":[[0,13]]}},"content":{"649":{"position":[[23,12]]}},"keywords":{}}],["writerow",{"_index":5132,"title":{},"content":{"886":{"position":[[2401,11],[2472,10]]}},"keywords":{}}],["writes",{"_index":6209,"title":{},"content":{"1208":{"position":[[1216,9]]}},"keywords":{}}],["writes.it",{"_index":6065,"title":{},"content":{"1143":{"position":[[237,9]]}},"keywords":{}}],["writes/sec",{"_index":2737,"title":{},"content":{"412":{"position":[[10077,10]]}},"keywords":{}}],["writessqlit",{"_index":6479,"title":{},"content":{"1302":{"position":[[66,12]]}},"keywords":{}}],["written",{"_index":483,"title":{},"content":{"29":{"position":[[425,8]]},"34":{"position":[[225,7]]},"39":{"position":[[437,7]]},"41":{"position":[[236,7],[373,7]]},"188":{"position":[[9,7]]},"358":{"position":[[87,7]]},"489":{"position":[[433,7]]},"647":{"position":[[214,7]]},"649":{"position":[[69,7]]},"650":{"position":[[47,7]]},"661":{"position":[[43,7],[124,7]]},"688":{"position":[[1075,7]]},"698":{"position":[[1167,7]]},"711":{"position":[[43,7],[176,7]]},"723":{"position":[[1092,7]]},"759":{"position":[[1407,8]]},"764":{"position":[[325,7]]},"767":{"position":[[188,7]]},"768":{"position":[[151,7]]},"769":{"position":[[162,7]]},"836":{"position":[[45,7],[126,7]]},"875":{"position":[[3774,7]]},"983":{"position":[[282,7],[360,7]]},"984":{"position":[[342,7]]},"987":{"position":[[640,7]]},"1058":{"position":[[176,7]]},"1084":{"position":[[65,7]]},"1119":{"position":[[50,7],[140,7]]},"1192":{"position":[[95,7]]},"1207":{"position":[[725,8]]},"1251":{"position":[[87,7]]},"1297":{"position":[[318,7]]},"1300":{"position":[[271,7]]},"1304":{"position":[[406,7]]}},"keywords":{}}],["wrong",{"_index":487,"title":{},"content":{"29":{"position":[[483,6]]},"143":{"position":[[401,6]]},"291":{"position":[[218,5]]},"458":{"position":[[458,6]]},"521":{"position":[[272,6]]},"697":{"position":[[626,6]]},"700":{"position":[[445,5]]},"702":{"position":[[440,5]]},"749":{"position":[[16667,5]]},"761":{"position":[[85,5]]},"781":{"position":[[72,5]]},"795":{"position":[[131,5]]},"799":{"position":[[512,5]]},"837":{"position":[[623,5]]},"881":{"position":[[25,5],[421,8]]},"966":{"position":[[144,6]]},"1126":{"position":[[308,5]]},"1198":{"position":[[1066,5]]}},"keywords":{}}],["wrote",{"_index":1761,"title":{},"content":{"299":{"position":[[1357,5]]},"786":{"position":[[95,5]]}},"keywords":{}}],["wrtc",{"_index":1370,"title":{},"content":{"210":{"position":[[443,5]]},"261":{"position":[[684,5]]},"904":{"position":[[2824,4],[2889,5]]},"911":{"position":[[766,5]]}},"keywords":{}}],["ws",{"_index":5137,"title":{},"content":{"886":{"position":[[3953,3],[4462,2]]},"894":{"position":[[12,2]]},"911":{"position":[[465,2],[596,5]]}},"keywords":{}}],["ws://example.com/subscript",{"_index":5138,"title":{},"content":{"886":{"position":[[3957,32]]}},"keywords":{}}],["ws://example.com:8080",{"_index":6256,"title":{},"content":{"1219":{"position":[[944,23]]},"1220":{"position":[[507,23]]}},"keywords":{}}],["ws://localhost:1337/socket",{"_index":5180,"title":{},"content":{"893":{"position":[[407,28]]}},"keywords":{}}],["wsoption",{"_index":5147,"title":{},"content":{"886":{"position":[[4691,9],[4863,10]]}},"keywords":{}}],["wss://example.com:8080",{"_index":5276,"title":{},"content":{"911":{"position":[[740,25]]}},"keywords":{}}],["wss://signaling.rxdb.info",{"_index":1369,"title":{},"content":{"210":{"position":[[413,29]]},"261":{"position":[[596,29]]},"904":{"position":[[2762,29]]}},"keywords":{}}],["x",{"_index":1438,"title":{},"content":{"243":{"position":[[1,1],[30,1],[72,1],[111,1],[151,1],[182,1],[211,1],[277,1],[326,1],[367,1],[397,1],[429,1],[461,1],[540,1],[943,1],[978,1],[1010,1]]},"412":{"position":[[13926,1]]},"849":{"position":[[1046,1]]},"854":{"position":[[1338,3]]},"987":{"position":[[185,1],[678,1]]}},"keywords":{}}],["xenova/al",{"_index":2213,"title":{},"content":{"391":{"position":[[392,10],[534,11]]},"402":{"position":[[1894,10]]}},"keywords":{}}],["xenova/multilingu",{"_index":2474,"title":{},"content":{"401":{"position":[[547,19]]}},"keywords":{}}],["xenova/paraphras",{"_index":2453,"title":{},"content":{"401":{"position":[[260,17]]}},"keywords":{}}],["xhr",{"_index":3549,"title":{},"content":{"610":{"position":[[190,3]]}},"keywords":{}}],["xy",{"_index":6577,"title":{"1324":{"position":[[22,3]]}},"content":{},"keywords":{}}],["y",{"_index":2765,"title":{},"content":{"412":{"position":[[13934,1]]}},"keywords":{}}],["yarn",{"_index":1083,"title":{},"content":{"128":{"position":[[127,4]]},"333":{"position":[[36,5]]},"578":{"position":[[65,5]]}},"keywords":{}}],["ye",{"_index":2740,"title":{},"content":{"412":{"position":[[10308,3]]},"703":{"position":[[1281,4]]},"875":{"position":[[3993,4]]},"1324":{"position":[[1,4]]}},"keywords":{}}],["year",{"_index":442,"title":{},"content":{"27":{"position":[[344,4]]},"118":{"position":[[430,5]]},"323":{"position":[[688,5]]},"402":{"position":[[1960,4],[2438,5]]},"408":{"position":[[1476,5],[5599,5]]},"455":{"position":[[305,5]]},"705":{"position":[[30,5]]},"780":{"position":[[151,6]]},"1198":{"position":[[335,6]]}},"keywords":{}}],["yj",{"_index":629,"title":{"40":{"position":[[0,4]]},"686":{"position":[[24,5]]}},"content":{"40":{"position":[[1,3],[288,3],[362,3],[621,3]]},"412":{"position":[[3832,3]]},"686":{"position":[[127,4],[737,3]]}},"keywords":{}}],["york",{"_index":2307,"title":{},"content":{"394":{"position":[[611,4]]}},"keywords":{}}],["you'd",{"_index":2603,"title":{},"content":{"410":{"position":[[1684,5]]},"412":{"position":[[11116,5]]},"906":{"position":[[612,5]]}},"keywords":{}}],["you'll",{"_index":1940,"title":{},"content":{"333":{"position":[[214,6]]},"412":{"position":[[7433,6],[11049,6]]},"836":{"position":[[2448,6]]},"1151":{"position":[[51,6]]},"1178":{"position":[[51,6]]}},"keywords":{}}],["you'r",{"_index":1151,"title":{},"content":{"148":{"position":[[311,6]]},"202":{"position":[[365,6]]},"207":{"position":[[91,6]]},"238":{"position":[[119,6]]},"239":{"position":[[100,6]]},"255":{"position":[[213,6]]},"286":{"position":[[140,6]]},"346":{"position":[[482,6]]},"369":{"position":[[341,6],[997,6]]},"371":{"position":[[120,6]]},"388":{"position":[[395,6]]},"412":{"position":[[9026,6]]},"498":{"position":[[111,6]]},"556":{"position":[[1645,6]]},"602":{"position":[[4,6]]},"1006":{"position":[[9,6]]}},"keywords":{}}],["you'v",{"_index":1321,"title":{},"content":{"205":{"position":[[4,6]]},"263":{"position":[[4,6]]},"555":{"position":[[6,6]]},"884":{"position":[[51,6]]}},"keywords":{}}],["youngest",{"_index":5735,"title":{},"content":{"1056":{"position":[[167,8]]}},"keywords":{}}],["your_appwrite_collection_id",{"_index":4909,"title":{},"content":{"862":{"position":[[1267,30]]}},"keywords":{}}],["your_appwrite_database_id",{"_index":4907,"title":{},"content":{"862":{"position":[[1224,28]]}},"keywords":{}}],["yourself",{"_index":2197,"title":{},"content":{"390":{"position":[[1059,8]]},"459":{"position":[[426,9]]},"462":{"position":[[463,8]]},"566":{"position":[[459,9]]},"851":{"position":[[172,8]]},"1031":{"position":[[159,8]]}},"keywords":{}}],["yourself.fix",{"_index":6176,"title":{},"content":{"1198":{"position":[[2259,12]]}},"keywords":{}}],["youtub",{"_index":2557,"title":{},"content":{"408":{"position":[[3049,7]]}},"keywords":{}}],["you’ll",{"_index":1861,"title":{},"content":{"304":{"position":[[271,6]]},"560":{"position":[[615,6]]}},"keywords":{}}],["you’r",{"_index":1565,"title":{},"content":{"254":{"position":[[81,6]]},"567":{"position":[[4,6]]}},"keywords":{}}],["you’v",{"_index":2050,"title":{},"content":{"357":{"position":[[306,6]]}},"keywords":{}}],["z",{"_index":2766,"title":{"1287":{"position":[[9,1]]},"1291":{"position":[[0,1]]}},"content":{"412":{"position":[[13941,1]]},"863":{"position":[[55,2],[60,2]]},"1287":{"position":[[181,1],[297,1]]},"1291":{"position":[[53,1]]},"1292":{"position":[[373,1],[731,1],[993,1]]}},"keywords":{}}],["z0",{"_index":5320,"title":{},"content":{"935":{"position":[[241,2]]},"1084":{"position":[[351,2],[366,2]]}},"keywords":{}}],["z][[a",{"_index":5849,"title":{},"content":{"1084":{"position":[[342,5]]}},"keywords":{}}],["z][a",{"_index":5319,"title":{},"content":{"935":{"position":[[236,4]]}},"keywords":{}}],["za",{"_index":5848,"title":{},"content":{"1084":{"position":[[339,2],[348,2],[363,2]]}},"keywords":{}}],["zero",{"_index":709,"title":{"474":{"position":[[3,4]]},"629":{"position":[[0,4]]},"630":{"position":[[4,4]]},"631":{"position":[[18,4]]}},"content":{"46":{"position":[[299,4]]},"254":{"position":[[509,4]]},"410":{"position":[[186,4]]},"486":{"position":[[27,4]]},"534":{"position":[[334,4]]},"594":{"position":[[332,4]]},"630":{"position":[[722,4]]},"632":{"position":[[1960,4]]},"640":{"position":[[479,4]]},"641":{"position":[[52,4]]},"643":{"position":[[328,4]]},"644":{"position":[[394,4],[600,4]]},"654":{"position":[[437,5]]},"723":{"position":[[2799,4]]},"780":{"position":[[762,4]]},"1115":{"position":[[308,4]]}},"keywords":{}}],["zerosync",{"_index":609,"title":{},"content":{"38":{"position":[[1103,8]]}},"keywords":{}}],["zh",{"_index":2462,"title":{},"content":{"401":{"position":[[396,2]]}},"keywords":{}}],["zone",{"_index":749,"title":{},"content":{"50":{"position":[[52,5],[269,4]]},"129":{"position":[[572,4]]},"286":{"position":[[353,4]]},"898":{"position":[[1179,4]]}},"keywords":{}}],["zone.j",{"_index":746,"title":{"50":{"position":[[28,8]]},"129":{"position":[[28,8]]}},"content":{"50":{"position":[[167,8]]},"129":{"position":[[318,8],[327,7],[435,8]]}},"keywords":{}}],["zone.js/plugins/zon",{"_index":760,"title":{},"content":{"50":{"position":[[485,21]]},"129":{"position":[[705,21]]}},"keywords":{}}],["zschemaclass",{"_index":6391,"title":{},"content":{"1291":{"position":[[10,12]]}},"keywords":{}}],["zschemaclass.registerformat('email",{"_index":6392,"title":{},"content":{"1291":{"position":[[64,36]]}},"keywords":{}}]],"pipeline":["stemmer"]} \ No newline at end of file diff --git a/docs/lunr-index.json b/docs/lunr-index.json deleted file mode 100644 index c33de6cbd1a..00000000000 --- a/docs/lunr-index.json +++ /dev/null @@ -1 +0,0 @@ -{"version":"2.3.9","fields":["title","content","keywords"],"fieldVectors":[["title/0",[0,850.067,1,698.67]],["content/0",[]],["keywords/0",[]],["title/1",[2,682.507]],["content/1",[0,7.646,1,10.399,2,8.547,3,6.487,4,1.985,5,3.045,6,1.855,7,4.402,8,7.468,9,6.452,10,7.58,11,9.248,12,4.917,13,12.341,14,7.201,15,8.213,16,7.251,17,14.102,18,4.711,19,4.227,20,6.317,21,8.133,22,5.027,23,3.924,24,6.612,25,0.938,26,11.819,27,11.819,28,6.099,29,5.85,30,6.634,31,9.695,32,2.984,33,1.824,34,3.229,35,4.044,36,7.357,37,2.368,38,14.102]],["keywords/1",[]],["title/2",[39,1723.121]],["content/2",[0,8.084,1,11.081,4,1.545,23,3.98,24,5.146,25,0.992,28,8.601,29,8.249,30,9.356,31,10.25,32,4.209,33,1.928,34,3.414,35,4.276,36,7.778,37,2.503,39,20.692,40,5.691,41,10.081,42,18.091,43,17.54,44,4.152,45,4.23,46,4.826,47,14.91,48,14.91,49,7.014,50,8.219,51,3.568]],["keywords/2",[]],["title/3",[52,513.439]],["content/3",[0,9.356,1,10.699,3,7.938,4,1.788,5,3.725,6,1.671,23,3.659,24,5.956,28,7.463,29,7.158,30,8.118,31,11.863,32,3.652,33,2.231,34,3.951,35,4.948,36,9.002,37,2.897,51,4.129,52,6.026,53,7.289,54,7.5,55,20.223,56,17.256]],["keywords/3",[]],["title/4",[52,513.439]],["content/4",[0,8.446,1,11.242,4,2.121,23,3.485,24,5.377,28,6.738,29,6.462,30,7.329,31,10.71,32,3.297,33,2.014,34,3.567,35,4.467,36,8.127,37,2.615,52,6.301,57,15.579,58,5.706,59,14.406,60,5.812,61,8.379,62,6.674,63,3.416,64,10.533,65,5.106,66,11.34,67,6.268,68,8.187,69,4.863,70,3.799,71,13.056,72,7.415,73,7.955,74,15.579]],["keywords/4",[]],["title/5",[75,1204.817]],["content/5",[0,8.774,1,10.983,4,1.677,5,3.494,6,1.567,15,9.425,16,8.322,23,3.55,24,5.586,28,7,29,6.713,30,7.614,31,11.126,32,3.425,33,2.093,34,3.705,35,4.641,36,8.443,37,2.717,53,6.836,63,3.549,65,5.304,75,16.512,76,9.62,77,13.084,78,13.563,79,8.57,80,14.965,81,11.542]],["keywords/5",[]],["title/6",[42,1506.563]],["content/6",[0,6.502,1,10.657,4,2.067,5,3.694,6,1.657,12,4.181,23,4.007,24,5.906,28,7.4,29,7.097,30,8.049,31,8.244,32,4.222,33,2.212,34,3.917,35,4.907,36,6.256,37,3.349,42,18.596,43,17.051,44,3.339,45,3.402,46,3.882,49,8.049,50,9.432,63,2.63,69,3.743,81,8.552,82,8.391,83,8.729,84,10.645,85,5.776,86,4.845,87,4.167,88,4.112,89,10.774,90,11.992,91,17.11,92,5.113,93,11.089]],["keywords/6",[]],["title/7",[75,1013.728,94,975.122]],["content/7",[0,7.207,1,10.649,4,2.359,5,3.971,6,1.781,12,4.635,23,3.937,24,6.349,28,5.749,29,5.514,30,6.253,31,9.138,32,3.893,33,2.727,34,4.211,35,6.527,36,6.934,37,3.088,43,10.419,44,3.701,58,4.869,69,4.149,75,13.638,80,17.009,81,9.48,84,7.093,88,4.558,89,8.37,92,5.667,93,12.292,94,13.118,95,13.292,96,7.524,97,4.667,98,5.694,99,4.683]],["keywords/7",[]],["title/8",[58,495.646,99,476.718,100,501.136]],["content/8",[0,9.353,1,9.743,4,1.998,22,5.447,23,4.056,24,4.917,25,0.622,26,7.839,27,7.839,28,6.16,29,7.155,31,6.43,32,3.014,33,1.209,34,2.142,35,4.085,36,4.879,37,2.391,44,2.604,50,5.156,53,3.951,58,8.968,61,5.031,94,5.817,99,8.457,100,9.068,101,8.185,102,8.649,103,4.168,104,6.324,105,5.071,106,6.43,107,2.297,108,10.061,109,9.209,110,4.126,111,3.529,112,6.134,113,4.351,114,4.141,115,14.244,116,3.863,117,13.171,118,11.937,119,14.244,120,14.244,121,5.62,122,4.105,123,9.353,124,3.503,125,3.701,126,8.649,127,8.649,128,8.649,129,9.353,130,9.353,131,4.743,132,9.353]],["keywords/8",[]],["title/9",[104,1259.934]],["content/9",[0,9.056,1,11.115,4,2.22,23,3.801,24,5.765,28,7.224,29,6.928,30,7.858,31,11.483,32,3.535,33,2.16,34,3.824,35,6.143,36,8.713,37,2.804,68,8.778,72,7.95,73,8.529,99,5.884,104,16.865,133,16.703,134,9.454,135,16.703]],["keywords/9",[]],["title/10",[104,1060.102,136,904.237]],["content/10",[0,8.261,1,10.729,5,3.29,23,4.063,24,5.259,28,6.59,29,6.32,30,7.168,31,10.475,32,4.27,33,1.97,34,3.489,35,4.369,36,7.949,37,2.558,42,18.288,43,15.815,44,4.243,45,4.322,46,4.932,49,7.168,50,8.399,104,13.642,136,11.636,137,15.237,138,15.237,139,15.237,140,11.944,141,15.237,142,8.964]],["keywords/10",[]],["title/11",[100,580.619,140,1229.009]],["content/11",[0,5.712,1,8.257,4,1.614,6,1.02,23,4.214,24,3.637,26,8.83,28,4.557,29,4.37,30,7.327,31,7.243,32,2.23,33,1.362,34,3.566,35,3.021,36,5.496,37,1.769,44,2.934,45,2.989,87,3.661,100,7.58,107,2.588,109,6.812,110,4.648,116,4.351,140,17.122,142,6.198,143,10.536,144,6.475,145,10.536,146,10.536,147,11.819,148,10.686,149,6.46,150,10.536,151,5.716,152,2.098,153,15.575,154,3.873,155,3.141,156,5.579,157,10.536,158,6.634,159,15.575,160,10.536,161,3.328,162,3.724,163,8.518,164,4.891,165,10.536,166,5.712,167,4.579,168,9.743,169,9.22,170,9.22,171,2.751,172,6.076,173,6.263,174,6.263,175,6.553,176,3.845,177,5.418,178,10.536]],["keywords/11",[]],["title/12",[7,299.457,107,235.629,179,476.813,180,441.279,181,255.603,182,191.399]],["content/12",[]],["keywords/12",[]],["title/13",[25,104.266,179,779.313]],["content/13",[4,1.788,5,3.725,7,6.827,25,1.597,33,2.828,67,6.943,86,6.973,107,4.239,110,7.612,179,10.871,183,5.435,184,3.742,185,4.169,186,6.464,187,13.441,188,12.267,189,8.811,190,10.23,191,5.188,192,5.802,193,6.914]],["keywords/13",[]],["title/14",[194,1085.252]],["content/14",[4,1.602,5,3.338,6,1.497,9,4.772,25,1.225,33,3.131,45,2.959,53,4.406,64,7.052,65,5.067,67,4.197,107,2.562,152,2.077,180,10.006,182,2.081,184,4.417,192,3.507,194,14.103,195,5.523,196,3.246,197,7.439,198,4.13,199,4.994,200,3.892,201,4.029,202,3.209,203,7.839,204,4.935,205,4.017,206,3.713,207,10.154,208,12.89,209,9.128,210,6.943,211,8.433,212,13.529,213,10.431,214,10.431,215,8.125,216,9.645,217,3.726,218,7.956,219,3.877,220,5.465,221,10.431,222,2.844,223,5.363,224,3.163,225,3.739,226,5.326,227,5.363,228,4.555,229,5.851,230,3.295,231,7.439,232,6.2,233,9.128,234,4.825,235,9.615,236,7.171,237,6.84,238,7.052,239,5.326,240,2.329,241,3.877,242,5.75,243,4.798]],["keywords/14",[]],["title/15",[244,1723.121]],["content/15",[4,1.579,7,6.298,20,6.825,33,2.609,46,4.932,107,3.743,110,6.721,180,7.009,181,4.06,182,3.04,184,4.375,186,4.504,190,7.127,220,5.386,244,22.265,245,15.237,246,4.813,247,14.09,248,8.261,249,8.624,250,10.766,251,8.472,252,7.823,253,17.656,254,9.057,255,6.21,256,7.168,257,6.825,258,11.622,259,12.77,260,7.891,261,13.334,262,8.131,263,12.319,264,4.417,265,5.481,266,14.09]],["keywords/15",[]],["title/16",[261,1630.706]],["content/16",[1,6.414,2,5.272,4,1.492,5,3.108,6,1.394,7,4.493,25,0.957,37,2.417,51,3.445,52,3.966,53,6.08,65,4.718,69,4.493,75,9.307,76,8.557,86,5.816,88,4.936,100,5.331,131,7.3,152,2.866,183,4.534,184,4.212,189,7.35,205,3.74,206,5.124,220,5.088,224,4.364,225,5.16,251,8.003,260,10.059,261,21.505,267,12.064,268,14.395,269,12.064,270,14.395,271,5.106,272,6.137,273,4.259,274,9.307,275,4.793,276,8.745,277,8.302,278,3.875,279,8.557,280,9.182,281,5.582,282,10.98]],["keywords/16",[]],["title/17",[283,1561.679]],["content/17",[2,5.384,4,2.302,5,3.173,6,1.907,7,6.149,33,2.873,45,4.17,51,3.517,58,7.215,63,3.224,88,5.04,99,7.827,100,5.443,182,2.933,190,6.876,246,4.644,250,7.844,273,3.224,283,21.35,284,5.214,285,10.105,286,9.034,287,7.306,288,7.259,289,6.837,290,11.212,291,7.038,292,11.522,293,4.115,294,11.884,295,9.034,296,10.941,297,4.17,298,7.213,299,9.142,300,8.103,301,3.35]],["keywords/17",[]],["title/18",[302,1267.615,303,1372.068]],["content/18",[18,5.165,37,2.596,44,4.306,110,6.821,156,10.788,180,7.113,182,3.085,184,3.353,189,7.896,192,5.199,194,9.006,196,4.813,199,7.404,200,5.769,207,8.524,220,5.466,224,4.688,235,9.617,241,5.748,242,8.524,243,7.113,262,8.252,264,4.483,293,4.328,302,19.58,303,19.939,304,7.788,305,9.617,306,11.028,307,8.918,308,5.005,309,15.463,310,6.999,311,6.624,312,14.299,313,15.463,314,5.485,315,5.036]],["keywords/18",[]],["title/19",[302,1267.615,316,1141.31]],["content/19",[4,1.109,6,1.525,15,6.231,23,3.623,25,0.711,32,3.333,33,1.383,34,3.606,46,3.463,65,5.163,69,3.34,70,2.609,72,5.092,82,11.023,107,2.628,110,4.719,113,4.976,114,3.11,151,3.301,152,2.13,164,5.871,180,4.921,181,2.851,184,3.416,185,2.584,190,7.368,196,3.33,205,2.78,206,3.808,207,5.897,220,3.782,228,4.672,233,9.362,254,6.359,272,4.561,273,4.522,274,6.917,289,4.976,297,3.035,302,19.219,303,13.784,316,13.609,317,10.698,318,8.966,319,7.019,320,15.752,321,6.575,322,5.79,323,5.897,324,9.362,325,7.486,326,8.386,327,10.698,328,8.65,329,4.767,330,2.572,331,6.917,332,9.362,333,9.893,334,3.085,335,11.234,336,15.752,337,10.698,338,10.698,339,10.698,340,10.698,341,9.363,342,10.698,343,10.698,344,10.698,345,8.16]],["keywords/19",[]],["title/20",[346,1561.679]],["content/20",[6,2.151,33,2.873,46,5.728,136,10.206,180,8.14,181,4.715,205,6.311,206,6.299,217,6.321,220,7.855,346,14.831,347,8.14,348,10.016,349,11.442,350,15.486,351,13.871,352,15.486,353,15.486,354,17.696,355,6.974,356,8.231,357,12.621]],["keywords/20",[]],["title/21",[358,1723.121]],["content/21",[4,1.967,110,8.375,151,5.858,181,5.059,205,4.933,206,6.758,220,6.712,252,7.362,288,9.376,293,5.315,297,5.386,305,11.808,346,19.452,358,21.463,359,13.821,360,10.846,361,10.65]],["keywords/21",[]],["title/22",[362,1259.934]],["content/22",[33,2.109,37,2.738,107,4.006,180,7.503,181,4.346,184,3.537,194,12.286,201,6.3,202,6.489,205,4.238,206,5.806,224,4.945,272,6.954,273,3.577,293,4.566,304,8.215,311,9.037,346,13.669,362,14.263,363,15.082,364,8.843,365,16.311,366,10.161,367,14.274,368,10.271,369,16.311,370,10.271,371,8.509,372,10.546,373,4.206,374,13.187,375,8.509]],["keywords/22",[]],["title/23",[239,951.488]],["content/23",[33,1.97,61,8.195,134,8.624,152,3.034,184,5.221,189,7.78,192,5.123,202,4.687,206,5.424,239,11.55,240,5.051,260,7.891,273,3.341,274,9.852,282,11.622,301,3.473,373,3.929,376,14.09,377,11.944,378,9.155,379,6.971,380,16.466,381,4.917,382,11.631,383,14.09,384,15.237,385,5.581,386,11.091,387,8.874,388,8.547,389,7.835,390,11.341,391,7.674,392,7.087,393,8.195]],["keywords/23",[]],["title/24",[0,1010.306]],["content/24",[0,12.241,1,8.09,4,1.351,5,2.816,6,1.263,7,4.071,25,0.867,33,1.687,37,3.048,40,4.979,41,8.819,52,3.594,63,3.981,65,4.275,84,6.96,97,4.579,100,4.83,148,7.522,152,3.614,184,2.828,201,5.038,218,13.847,239,11.528,243,6,271,4.627,277,10.47,278,3.511,287,6.483,289,6.067,292,10.224,308,5.876,371,6.804,393,7.015,394,11.449,395,5.484,396,5.931,397,8.32,398,6.798,399,7.13,400,8.174,401,5.842,402,7.522,403,10.545,404,9.949,405,6.707,406,11.414,407,6.36,408,4.315,409,8.32,410,8.433]],["keywords/24",[]],["title/25",[411,1630.706]],["content/25",[0,9.434,4,1.803,33,2.843,86,7.031,134,9.849,152,3.464,180,8.004,182,3.472,184,3.773,222,4.745,273,4.821,287,8.649,288,8.593,411,19.24,412,17.4,413,9.012,414,8.594,415,17.4,416,14.634,417,7.835,418,13.64,419,10.572,420,10.572,421,9.012]],["keywords/25",[]],["title/26",[422,1723.121]],["content/26",[0,8.774,4,1.677,6,1.567,88,5.549,114,6.102,182,3.229,184,3.51,198,4.323,200,6.038,202,4.978,207,12.841,219,6.016,239,8.264,240,3.614,262,8.636,269,13.563,287,8.044,310,7.325,378,9.724,422,19.408,423,9.946,424,10.464,425,5.822,426,10.065,427,5.949,428,8.704,429,14.965,430,20.989,431,14.965,432,8.505,433,11.781,434,16.184,435,7.404]],["keywords/26",[]],["title/27",[436,1723.121]],["content/27",[0,8.322,4,1.59,7,4.791,41,10.378,107,4.98,125,6.074,154,5.642,181,6.049,190,7.18,196,4.777,220,8.025,229,8.61,230,4.849,239,7.837,246,4.849,262,10.819,265,5.522,289,7.139,290,11.708,308,4.968,323,8.461,382,7.893,385,5.622,436,20.992,437,6.024,438,7.592,439,10.741,440,7.1,441,11.708,442,11.173,443,13.432,444,10.741,445,15.349,446,11.425,447,9.791,448,12.41]],["keywords/27",[]],["title/28",[295,1145.198]],["content/28",[1,5.776,2,6.62,4,1.343,6,1.75,7,6.497,9,5.93,10,7.152,12,6.302,25,1.202,33,1.676,37,3.494,51,3.102,52,3.571,63,2.842,84,6.917,136,7.475,156,6.864,176,4.73,190,6.063,201,5.006,222,3.534,230,4.095,246,4.095,266,11.986,271,4.598,273,2.842,278,3.489,293,3.628,295,13.838,297,3.677,352,11.343,408,4.288,409,8.268,447,8.268,448,14.613,449,12.962,450,12.962,451,7.966,452,5.995,453,11.343,454,8.38,455,6.206,456,11.343,457,8.764,458,6.029,459,13.787,460,9.887,461,10.863,462,5.15,463,9.244,464,9.648,465,9.648,466,6.762,467,4.582,468,5.93,469,10.16]],["keywords/28",[]],["title/29",[470,1863.425]],["content/29",[4,1.59,6,1.486,7,4.791,15,8.939,20,6.875,33,1.985,125,6.074,184,4.397,201,5.928,202,6.237,220,5.426,234,7.1,240,3.427,254,9.124,289,7.139,305,9.546,311,6.575,366,9.766,373,3.958,382,7.893,385,5.622,387,8.939,471,22.702,472,13.432,473,11.425,474,8.852,475,14.193,476,9.325,477,11.807,478,9.546,479,9.222,480,5.522,481,8.461,482,8.391,483,8.255,484,8.61,485,12.032,486,9.124,487,9.665]],["keywords/29",[]],["title/30",[488,1561.679]],["content/30",[2,6.268,4,1.773,5,3.695,6,1.657,7,7.466,10,6.772,11,11.223,12,5.968,33,2.213,51,4.095,88,5.868,98,7.332,100,8.857,110,7.549,198,4.572,200,6.385,202,5.265,373,4.414,459,13.055,488,18.233,489,12.739,490,6.8,491,12.458,492,11.572,493,10.644,494,13.055]],["keywords/30",[]],["title/31",[417,705.949,495,1372.068]],["content/31",[5,3.788,6,2.14,10,6.943,40,6.698,52,6.998,61,9.438,62,7.517,63,4.847,114,5.101,190,8.208,230,5.543,378,10.543,381,5.662,402,10.12,417,7.901,488,14.706,495,15.356,496,7.09,497,15.356,498,10.913,499,9.222,500,12.279,501,9.023]],["keywords/31",[]],["title/32",[502,1723.121]],["content/32",[1,7.819,2,6.427,10,9.574,18,5.861,33,2.858,51,4.199,52,4.835,88,6.016,152,3.493,229,9.842,260,9.087,273,3.848,274,11.345,295,10.784,353,15.356,377,13.755,441,13.384,454,11.345,502,20.438,503,9.292,504,7.779,505,17.547,506,9.514,507,10.913]],["keywords/32",[]],["title/33",[508,1173.393]],["content/33",[4,1.923,25,1.412,33,1.741,37,2.26,52,6.306,60,5.023,62,5.768,63,2.953,86,5.441,92,5.741,99,4.743,111,5.081,152,2.681,183,4.241,200,5.023,202,5.709,260,9.611,273,4.657,281,5.221,292,10.554,293,3.769,297,6.024,308,4.358,319,6,322,4.95,334,3.882,370,8.478,379,6.16,454,8.705,501,6.923,508,14.412,509,13.464,510,6.828,511,13.235,512,5.511,513,8.004,514,4.827,515,6.649,516,6.923,517,7.3,518,13.464,519,7.242,520,6.094,521,10.886,522,12.45,523,7.242,524,8.829,525,7.076]],["keywords/33",[]],["title/34",[526,1723.121]],["content/34",[4,1.279,6,1.195,7,3.854,10,4.886,21,7.121,25,1.348,33,2.621,44,3.438,58,6.398,63,2.708,98,7.483,110,5.446,113,5.743,114,3.589,179,8.683,182,2.463,185,2.983,186,3.649,190,5.775,196,3.843,202,5.374,217,6.24,222,3.367,265,4.442,273,4.446,284,4.38,293,3.456,300,6.806,301,2.814,310,5.589,322,4.539,330,2.969,348,6.988,396,5.707,421,6.394,425,4.442,440,5.711,462,4.906,483,6.641,526,21.506,527,8.983,528,12.347,529,6.988,530,11.417,531,6.749,532,7.191,533,6.988,534,8.806,535,9.678,536,4.234,537,4.047,538,8.683,539,5.743,540,9.19,541,6.021,542,7.876,543,4.572,544,4.607,545,3.42,546,9.982]],["keywords/34",[]],["title/35",[547,1723.121]],["content/35",[4,1.351,5,2.816,6,1.263,7,4.071,10,5.161,25,0.867,37,3.506,41,8.819,44,3.632,46,4.222,51,3.121,52,3.594,65,4.275,70,3.181,75,8.433,107,3.204,110,5.753,114,5.277,125,5.161,181,4.837,184,2.828,185,3.151,186,5.366,225,4.675,230,4.12,272,5.561,273,3.981,275,4.343,277,7.522,278,3.511,284,4.627,293,5.082,301,2.973,308,4.222,322,4.795,334,3.761,379,5.967,440,6.033,490,5.182,529,7.382,537,4.275,547,19.309,548,8.213,549,6.855,550,7.382,551,5.935,552,6.855,553,5.842,554,6.245,555,8.112,556,4.659,557,5.182,558,10.224,559,8.32,560,6.907,561,6.136,562,7.522,563,5.587,564,6.033,565,7.382]],["keywords/35",[]],["title/36",[260,811.993,566,1077.888]],["content/36",[4,1.545,5,3.219,7,4.654,8,7.895,33,2.572,49,7.014,67,5.999,100,5.521,114,4.334,175,9.273,184,3.233,190,6.974,195,7.895,199,7.139,207,10.963,215,7.836,222,4.066,260,12.363,287,7.411,288,7.363,297,4.23,315,4.856,318,12.495,330,3.585,407,7.271,416,9.924,417,6.713,423,9.163,429,13.787,566,16.411,567,9.777,568,8.771,569,7.316,570,13.787,571,9.777,572,5.326,573,10.25,574,13.787,575,13.787,576,12.495,577,9.273]],["keywords/36",[]],["title/37",[578,1723.121]],["content/37",[6,1.52,9,7.181,25,1.044,65,6.743,70,3.828,86,6.342,107,3.855,110,6.924,181,6.116,182,4.105,195,8.312,198,4.193,202,4.828,205,4.078,219,5.834,240,3.505,242,13.428,243,9.464,272,6.692,288,7.751,304,7.906,416,10.447,479,9.431,544,5.856,561,9.679,578,14.514,579,10.148,580,7.22,581,6.661,582,11.54,583,13.736,584,10.613]],["keywords/37",[]],["title/38",[585,1723.121]],["content/38",[4,1.914,6,1.502,18,3.502,28,4.534,29,4.348,33,1.356,40,5.923,46,5.98,51,2.509,58,3.84,76,9.224,92,4.47,97,3.68,99,3.693,102,9.694,107,3.811,114,3.047,125,4.148,154,5.704,162,3.706,180,4.822,182,2.092,183,3.302,185,4.463,190,4.904,200,3.911,203,5.316,205,4.032,206,6.576,220,3.706,240,2.341,248,5.684,250,5.594,262,8.28,264,3.039,298,5.144,304,5.28,307,6.046,311,4.491,315,3.414,330,2.52,351,8.217,360,5.989,366,7.474,373,2.704,381,5.007,396,3.425,451,9.536,452,4.849,516,5.39,523,5.638,565,5.933,585,23.299,586,11.55,587,6.687,588,7.996,589,7.336,590,4.47,591,9.694,592,6.369,593,8.217,594,10.483,595,10.483,596,7.336,597,8.217,598,7.088,599,9.694,600,8.346,601,10.483,602,9.694,603,10.483,604,10.483,605,10.483,606,8.217,607,5.684,608,10.483,609,10.483,610,9.694,611,6.601]],["keywords/38",[]],["title/39",[612,1723.121]],["content/39",[1,5.849,4,1.36,6,1.765,25,0.873,33,1.697,37,3.061,49,6.175,70,3.201,86,5.303,107,3.224,181,5.582,185,3.171,220,4.64,222,4.972,225,6.536,226,6.702,241,4.879,265,4.722,273,2.878,278,3.533,297,5.172,301,4.156,310,8.253,315,6.824,319,5.849,330,3.156,396,4.288,416,8.736,423,8.066,467,4.64,483,7.059,536,4.5,537,5.976,545,3.635,554,6.284,561,6.175,563,5.622,565,7.429,612,16.86,613,4.624,614,5.677,615,11,616,9.184,617,6.95,618,8.066,619,12.137,620,12.137,621,9.36,622,5.326,623,13.125,624,13.125,625,10.011,626,10.011,627,10.288,628,7.429]],["keywords/39",[]],["title/40",[629,1506.563]],["content/40",[1,5.313,6,1.925,9,5.455,10,6.743,25,1.133,33,1.542,37,2.002,44,3.32,49,5.609,60,4.448,86,4.818,107,4.186,110,5.259,114,3.466,181,3.177,184,3.695,185,2.88,196,3.711,202,3.668,222,4.646,225,7.128,226,8.701,265,4.289,273,3.737,278,4.587,293,3.338,301,3.884,334,3.438,364,6.464,381,3.848,392,5.546,395,5.013,396,3.896,398,4.465,400,5.368,419,7.244,437,4.679,438,4.465,462,4.737,477,9.924,532,6.944,533,6.748,536,4.088,537,5.585,565,6.748,607,6.464,613,4.2,614,5.157,625,9.095,628,6.748,629,17.541,630,6.264,631,6.944,632,7.014,633,9.64,634,8.503,635,10.434,636,6.518,637,6.811,638,6.876,639,5.675,640,8.503,641,8.343,642,5.341,643,8.503]],["keywords/40",[]],["title/41",[644,1723.121]],["content/41",[6,1.592,33,2.126,40,6.275,152,3.273,162,5.811,185,3.971,186,4.859,205,5.509,206,5.852,220,5.811,230,5.193,284,5.831,315,5.354,355,6.478,414,6.426,481,9.062,483,11.404,606,12.886,625,12.539,644,19.606,645,9.671,646,16.439,647,16.439,648,10.352,649,13.291,650,9.481,651,16.439,652,7.871,653,15.201,654,16.439,655,21.202,656,9.772]],["keywords/41",[]],["title/42",[657,1723.121]],["content/42",[1,7.156,2,5.882,4,1.664,7,5.013,10,8.264,25,1.543,33,2.077,37,2.696,88,5.506,184,3.483,185,3.879,205,4.173,220,7.382,284,7.408,293,5.846,301,3.66,315,6.802,325,11.238,379,7.347,536,5.506,537,5.263,559,10.244,639,7.643,657,19.311,658,16.059,659,7.387,660,9.008,661,10.244,662,11.453,663,8.853,664,8.035]],["keywords/42",[]],["title/43",[665,1723.121]],["content/43",[4,2.128,25,1.182,33,2.297,37,2.123,40,4.828,41,8.551,100,6.579,107,4.364,181,3.37,185,3.055,195,6.697,205,4.616,220,6.28,225,4.534,226,6.458,230,3.995,240,2.824,241,4.701,248,6.857,260,6.55,297,3.588,298,6.206,372,8.177,391,6.37,420,7.684,437,4.964,478,11.05,515,6.246,536,6.092,599,11.695,662,9.019,663,6.972,665,23.112,666,12.647,667,9.647,668,6.55,669,11.067,670,7.094,671,10.599,672,7.866,673,6.597,674,6.507,675,5.882,676,9.206,677,9.913,678,7.964,679,12.647,680,11.067,681,12.647,682,10.225,683,8.85,684,11.695,685,9.206,686,11.695,687,12.647,688,7.684,689,6.913]],["keywords/43",[]],["title/44",[25,45.956,52,190.408,97,242.606,107,169.742,181,184.131,257,309.534,264,200.341,583,604.745,690,691.049,691,691.049]],["content/44",[]],["keywords/44",[]],["title/45",[52,513.439]],["content/45",[4,1.677,5,3.494,6,2.032,7,5.052,37,3.524,51,3.873,52,5.783,60,6.038,114,6.102,198,4.323,205,4.205,206,5.761,273,3.549,297,4.591,308,6.794,322,5.949,396,5.288,501,8.322,541,7.892,556,5.781,557,6.43,572,5.781,659,7.445,692,8.264,693,7.249,694,8.044,695,7.992,696,10.065,697,10.323,698,10.464,699,10.464,700,12.046,701,10.065]],["keywords/45",[]],["title/46",[4,140.222,52,372.867,257,606.144]],["content/46",[4,1.343,6,2.18,12,4.519,37,2.176,40,6.9,44,5.033,52,3.571,63,2.842,70,4.408,87,4.504,107,3.184,121,7.788,149,7.497,151,3.999,181,4.816,182,2.586,184,2.811,185,5.027,205,4.696,206,4.614,220,4.582,240,4.036,243,5.962,264,3.758,273,3.964,278,3.489,293,3.628,314,6.412,315,4.222,389,6.665,400,5.836,428,6.971,468,8.269,490,5.15,552,6.812,581,5.501,675,6.029,702,12.962,703,4.836,704,6.812,705,7.549,706,6.618,707,8.764,708,8.162,709,7.966,710,10.863,711,5.501,712,7.875,713,8.38,714,8.627,715,9.648,716,4.679,717,6.206,718,5.26,719,8.911]],["keywords/46",[]],["title/47",[4,123.338,52,327.97,72,566.533,510,603.606]],["content/47",[1,4.113,3,4.245,5,3.044,6,1.656,25,1.138,37,1.549,40,3.523,44,2.57,46,4.564,51,4.094,52,6.235,58,3.38,60,3.443,65,3.025,69,2.881,86,3.729,88,3.164,96,5.224,99,3.251,110,4.071,114,4.974,125,3.652,152,2.807,182,1.841,183,2.907,185,2.229,192,3.103,195,4.887,196,2.872,202,4.337,222,2.517,224,2.798,232,5.486,252,3.579,256,4.342,273,3.092,278,2.484,281,7.427,287,4.587,297,4.853,299,5.74,300,7.772,308,6.2,310,4.177,315,3.006,322,3.393,330,4.113,348,5.224,371,4.815,379,4.222,390,6.869,466,4.815,479,5.545,480,3.32,481,5.088,485,11.052,496,5.697,506,5.004,529,5.224,531,5.045,536,3.164,538,4.587,541,4.5,546,7.462,549,4.85,553,4.134,563,6.04,572,3.297,613,3.251,614,6.098,630,3.393,695,4.558,698,5.967,700,10.494,703,3.443,720,7.04,721,8.076,722,4.648,723,6.24,724,9.229,725,9.229,726,6.718,727,6.458,728,8.076,729,8.076,730,13.038,731,9.229,732,3.229,733,9.229,734,4.648,735,4.155,736,3.456,737,3.103,738,5.967,739,5.967,740,4.293,741,5.607,742,4.177,743,6.458]],["keywords/47",[]],["title/48",[25,79.157,171,310.82,191,357.826,257,533.158]],["content/48",[]],["keywords/48",[]],["title/49",[25,104.266,29,650.349]],["content/49",[25,1.625,28,10.568,29,10.136,30,9.73,182,4.127,257,9.264,319,9.217]],["keywords/49",[]],["title/50",[330,286.181,744,885.975,745,650.672,746,997.556]],["content/50",[6,1.347,9,6.366,22,5.67,23,3.702,25,1.262,46,4.504,83,10.128,109,8.996,155,4.147,162,4.918,164,4.369,183,6.804,198,5.07,257,8.502,330,4.563,366,6.702,425,5.005,722,12.625,744,16.08,745,10.376,746,11.661,747,15.407,748,15.346,749,15.907,750,12.176,751,8.551,752,12.176,753,12.866,754,10.907,755,13.914,756,13.914,757,8.996,758,6.018,759,13.914,760,12.866]],["keywords/50",[]],["title/51",[33,174.985,198,361.493,224,410.309]],["content/51",[4,0.991,19,4.344,22,3.803,23,4.207,24,5.002,25,0.636,32,3.067,33,2.262,34,3.318,35,5.595,37,3.276,49,4.501,52,3.993,63,2.098,69,2.987,73,4.886,111,3.61,114,2.782,151,2.952,158,6.025,161,3.023,167,4.158,198,2.556,224,2.901,257,6.491,264,2.774,271,3.394,275,5.824,297,2.714,334,2.759,355,5.711,423,5.88,440,4.426,462,3.802,467,3.382,510,4.852,531,5.23,539,4.45,551,4.354,572,3.418,590,4.08,607,5.188,622,3.883,630,7.172,668,4.955,723,6.469,732,3.348,758,4.138,761,6.965,762,7.122,763,4.886,764,5.23,765,5.733,766,11.716,767,5.466,768,9.992,769,6.965,770,4.725,771,7.008,772,3.969,773,6.893,774,5.23,775,4.581,776,6.897,777,4.264,778,7.122,779,6.369,780,5.067,781,9.568,782,5.629,783,8.373]],["keywords/51",[]],["title/52",[784,1141.31,785,478.129]],["content/52",[23,4.255,32,4.464,33,1.45,34,5.659,35,6.704,63,2.46,171,2.929,462,8.38,490,4.457,545,3.107,642,5.024,659,5.16,682,13.184,768,6.408,784,8.165,785,3.421,786,4.805,787,7.903,788,9.4,789,13.666,790,9.816,791,9.816,792,6.469,793,9.816,794,14.27,795,9.816,796,9.816,797,14.27,798,9.816,799,11.21,800,7.849,801,9.4,802,9.816,803,16.813,804,9.311,805,12.599,806,7.855,807,9.069,808,9.4,809,5.539,810,9.816]],["keywords/52",[]],["title/53",[273,261.029,284,422.228,545,329.694,735,535.943]],["content/53",[25,1.31,51,4.715,192,6.625,281,7.641,284,6.99,301,4.491,330,4.738,401,8.826,425,7.089,537,6.458,538,9.794,544,7.352,545,5.458,556,7.039,611,12.408]],["keywords/53",[]],["title/54",[167,517.318,183,374.904,722,599.526,811,885.975]],["content/54",[6,1.644,23,4.229,35,4.868,257,7.603,341,10.091,768,12.364,783,14.855,804,8.227,812,12.106,813,16.975,814,16.975,815,14.855,816,15.697,817,16.975,818,12.635,819,11.879,820,11.67,821,13.724,822,16.975,823,13.306,824,11.879,825,11.478]],["keywords/54",[]],["title/55",[257,702.281,826,864.293]],["content/55",[4,1.561,22,5.904,23,4.241,24,5.201,25,0.67,32,3.189,33,1.303,34,2.307,35,2.89,37,1.692,124,3.774,151,3.109,158,6.346,161,4.76,164,3.165,172,5.812,183,4.746,198,2.692,241,3.746,257,4.514,275,3.355,284,6.402,297,2.859,319,4.491,381,3.252,722,5.076,732,3.526,748,8.147,764,8.237,768,5.757,776,7.172,777,4.491,819,7.052,820,6.928,821,8.147,823,7.899,824,7.052,825,6.814,826,11.04,827,6.193,828,11.493,829,9.319,830,13.933,831,9.319,832,15.068,833,20.027,834,13.186,835,9.319,836,9.319,837,10.077,838,10.077,839,10.077,840,13.933,841,10.077,842,10.077,843,4.561,844,9.319,845,6.608,846,9.319,847,8.147,848,7.899,849,7.899,850,8.819,851,10.077,852,10.077]],["keywords/55",[]],["title/56",[19,356.811,25,79.157,52,327.97,257,533.158]],["content/56",[4,1.985,19,5.744,25,1.552,33,2.478,85,9.229,182,3.823,255,7.809,257,10.455,273,4.202,523,10.306,539,8.912,621,13.665,782,11.272,853,10.946,854,15.02,855,11.39]],["keywords/56",[]],["title/57",[25,89.993,202,416.281,563,579.706]],["content/57",[4,1.442,6,2.351,25,1.667,33,1.799,37,3.187,184,4.116,185,4.585,222,5.176,252,5.395,297,5.385,307,8.024,315,4.532,330,3.345,394,7.056,425,5.005,435,9.884,440,6.436,480,7.772,556,6.78,581,5.905,652,6.662,695,6.871,718,5.646,719,9.566,742,9.778,765,6.221,784,10.128,856,8.996,857,9.76,858,7.008,859,10.613,860,8.453,861,8.829,862,8.762,863,8.024]],["keywords/57",[]],["title/58",[52,432.005,703,584.959]],["content/58",[4,2.164,5,3.467,6,1.555,25,1.068,37,3.506,46,5.198,51,3.843,52,7.019,63,3.522,67,8.403,185,3.879,201,6.203,222,5.695,391,10.519,405,8.258,484,9.008,533,9.089,693,7.193,694,7.982,703,7.791,861,7.47,864,10.531,865,10.531,866,9.447,867,16.059,868,13.459,869,10.531,870,12.588,871,12.984]],["keywords/58",[]],["title/59",[52,432.005,179,779.313]],["content/59",[4,1.745,25,1.432,37,3.615,44,4.688,51,4.029,62,7.213,63,3.692,97,5.911,98,7.213,100,8.79,122,7.39,142,9.906,185,4.067,199,8.062,264,4.881,287,8.369,297,4.777,395,7.08,536,5.773,550,9.53,827,10.348,861,7.832,872,8.481,873,10.117,874,9.546,875,8.916,876,10.472,877,9.362]],["keywords/59",[]],["title/60",[37,199.834,51,284.834,63,261.029,689,650.672]],["content/60",[25,1.389,37,3.507,40,7.974,51,4.999,63,4.581,114,6.073,193,8.37,554,10.002,878,13.699]],["keywords/60",[]],["title/61",[191,471.331,879,610.406]],["content/61",[23,2.149,25,1.674,37,2.368,63,3.093,70,3.439,97,4.951,181,3.758,182,2.814,185,3.407,190,6.597,202,4.338,257,6.317,265,5.073,311,6.041,322,5.184,366,6.793,388,7.91,409,8.996,410,9.118,462,5.603,523,11.7,541,6.877,545,3.906,555,8.771,573,9.695,596,9.868,622,5.723,637,8.056,659,6.487,706,7.201,730,13.04,853,8.056,872,7.103,880,10.757,881,10.265,882,8.667,883,11.794,884,8.213,885,13.944,886,5.037,887,8.213,888,7.357,889,9.535,890,10.057,891,7.774,892,8.667,893,5.93]],["keywords/61",[]],["title/62",[25,70.65,33,137.374,37,178.358,51,374.991]],["content/62",[]],["keywords/62",[]],["title/63",[275,620.473]],["content/63",[4,1.882,5,3.92,6,2.186,37,3.049,51,4.345,200,6.775,232,10.794,275,6.046,334,5.236,421,9.404,440,8.399,481,10.01,527,9.337,529,10.278,556,6.487,557,7.215,694,9.026,697,11.583,703,6.775,785,5.538,894,6.959,895,15.218,896,15.218]],["keywords/63",[]],["title/64",[52,513.439]],["content/64",[6,1.774,37,3.075,51,4.384,52,5.047,114,5.325,182,3.655,186,5.415,200,6.834,222,6.191,273,4.017,278,4.931,322,6.734,405,9.42,536,6.281,541,8.933,560,9.7,563,7.847,695,9.047,732,6.409,897,12.013,898,12.594,899,13.335]],["keywords/64",[]],["title/65",[5,292.154,6,131.019,51,323.825]],["content/65",[4,1.477,5,4.388,6,2.308,9,3.191,30,3.281,37,2.394,40,2.662,44,1.942,51,5.066,52,1.921,63,2.479,70,5.163,87,6.264,96,6.399,103,6.354,107,1.713,113,3.244,149,2.893,155,3.37,176,2.545,181,3.799,182,4.588,185,3.962,186,3.342,192,3.801,196,3.519,198,3.02,200,6.119,202,2.145,204,3.3,222,4.915,227,3.586,240,1.557,246,2.203,273,2.479,275,2.322,291,3.339,301,3.738,304,3.512,314,2.474,330,1.677,334,2.011,373,1.798,382,3.586,392,3.244,396,4.659,401,3.124,407,3.401,479,4.19,480,4.067,512,2.855,520,3.157,525,5.942,532,4.061,536,2.391,537,3.706,543,4.187,559,4.448,561,5.319,617,3.693,675,5.259,692,3.561,697,4.448,704,3.665,706,3.561,708,4.391,711,2.959,717,3.339,718,2.83,786,4.843,863,4.022,872,3.512,886,4.039,887,4.061,893,4.754,899,5.076,900,6.449,901,2.662,902,3.984,903,5.638,904,5.076,905,4.145,906,7.731,907,8.763,908,5.638,909,5.466,910,5.737,911,4.448,912,3.638,913,5.844,914,5.319,915,5.191,916,6.449,917,5.844,918,3.947,919,4.88,920,3.693,921,3.612,922,5.319,923,4.573,924,4.448,925,5.844,926,3.561,927,6.974,928,6.103,929,6.449,930,6.449,931,4.145,932,3.173,933,5.466,934,4.286,935,5.638,936,3.466,937,3.046,938,5.466]],["keywords/65",[]],["title/66",[37,227.19,51,323.825,703,504.882]],["content/66",[5,2.945,6,2.228,12,4.756,22,3.58,33,2.421,37,3.864,51,5.116,52,3.758,58,6.858,63,4.106,86,5.512,96,7.721,114,3.965,182,2.722,185,3.295,201,5.268,206,4.856,240,3.046,252,5.289,275,4.542,322,5.014,334,3.933,405,7.014,437,7.349,531,7.457,536,4.677,551,6.207,685,9.929,693,6.11,694,6.78,703,7.977,785,4.16,866,8.025,893,5.735,926,6.965,939,11.028,940,11.376,941,10.153,942,8.196,943,7.169,944,7.651,945,10.692,946,12.613,947,9.378,948,13.641,949,13.641,950,9.079]],["keywords/66",[]],["title/67",[16,449.64,33,113.071,51,209.248,100,323.821,417,393.72,951,765.226,952,494.931]],["content/67",[3,9.151,33,2.572,51,4.76,79,10.534,85,9.582,100,7.367,114,5.783,182,3.969,240,4.442,417,8.957,462,7.904,554,9.525,560,10.534,699,12.862]],["keywords/67",[]],["title/68",[114,346.026,284,422.228,670,667.664,953,885.975]],["content/68",[4,1.915,6,1.789,33,2.39,70,4.507,182,3.687,200,6.895,284,6.556,301,4.212,417,8.321,533,10.46,537,6.057,545,5.119,613,6.51,701,11.494,732,6.466,920,9.786,924,11.789,953,13.756,954,9.713,955,10.659,956,11.637,957,11.228]],["keywords/68",[]],["title/69",[33,137.374,97,372.969,206,378.168,240,237.216,958,491.403]],["content/69",[33,2.39,70,5.567,97,6.488,100,6.844,149,7.666,182,3.687,200,6.895,206,6.579,240,4.127,301,4.212,314,6.556,532,10.763,543,6.844,673,9.641,704,9.713,786,7.917,893,7.771,911,11.789,940,11.228,958,8.548,959,16.173]],["keywords/69",[]],["title/70",[63,296.762,301,308.418,786,579.706]],["content/70",[3,8.655,12,6.56,33,2.433,44,5.239,63,5.062,70,4.588,182,3.754,200,7.02,240,4.201,334,5.425,417,8.472,514,6.745,536,6.451,617,9.963,680,16.465,717,9.008,786,8.06,956,11.848,960,15.212]],["keywords/70",[]],["title/71",[16,546.285,25,70.65,37,178.358,51,254.223,952,601.311]],["content/71",[25,1.375,37,3.472,51,4.949,96,11.707,114,6.013,202,6.362,560,10.952,699,13.373,715,15.395,961,11.401]],["keywords/71",[]],["title/72",[37,178.358,195,562.569,400,478.346,554,508.659,639,505.648]],["content/72",[1,8.781,25,1.31,37,3.308,44,5.487,65,6.458,182,3.932,186,5.824,195,10.434,255,8.031,400,8.872,536,6.756,553,8.826,554,9.434,639,9.379,962,14.667]],["keywords/72",[]],["title/73",[62,410.941,152,190.987,217,342.668,414,374.974,544,357.9,952,542.959]],["content/73",[4,1.985,6,1.855,21,11.051,25,1.274,70,4.673,152,3.815,182,3.823,200,7.149,217,6.845,293,5.364,414,7.49,533,10.845,695,9.463,701,11.917,812,13.665,894,7.343,920,10.146,963,7.401]],["keywords/73",[]],["title/74",[62,410.941,86,387.621,297,272.135,300,528.808,414,374.974,417,431.927]],["content/74",[25,1.336,125,7.947,190,9.395,196,6.251,297,5.698,300,11.072,541,9.794,630,7.383,904,14.62,964,20.085,965,12.491,966,16.832,967,14.62]],["keywords/74",[]],["title/75",[152,269.421,183,426.225,737,454.965]],["content/75",[6,1.908,25,1.31,152,3.923,183,6.206,196,6.133,272,8.401,438,7.379,536,6.756,545,5.458,737,6.625,968,15.446,969,13.323,970,15.03,971,11.713,972,12.922]],["keywords/75",[]],["title/76",[7,489.185,182,211.969,288,524.652,514,380.833]],["content/76",[7,7.411,25,1.31,182,3.932,196,6.133,200,7.352,255,8.031,394,9.992,409,12.569,514,7.064,553,8.826,586,14.667,614,8.522,645,11.592,921,10.205]],["keywords/76",[]],["title/77",[183,275.416,273,191.76,330,210.237,425,314.57,544,326.242,545,242.203,722,440.43]],["content/77",[6,1.486,23,4.19,32,4.29,70,4.944,164,6.367,183,4.834,196,4.777,273,4.446,284,5.445,297,4.354,301,3.498,330,3.69,396,5.015,425,5.522,525,8.067,537,5.031,543,5.684,544,5.727,545,4.251,622,6.229,804,7.439,893,6.454,920,8.128,973,8.255,974,9.791,975,8.255,976,13.432,977,12.864,978,12.864,979,12.41,980,12.864]],["keywords/77",[]],["title/78",[183,334.613,273,232.977,514,380.833,981,606.904,982,566.919]],["content/78",[6,1.963,63,4.447,155,6.045,278,5.459,512,8.301,622,8.23,910,8.16,963,7.833,981,11.585,982,10.822,983,12.055,984,12.464]],["keywords/78",[]],["title/79",[278,364.276,330,325.357,765,443.523]],["content/79",[25,1.349,33,2.622,252,7.864,278,5.459,293,5.677,297,5.753,330,4.876,334,5.847,545,5.617,614,8.771,765,6.647,973,10.908]],["keywords/79",[]],["title/80",[281,461.561,297,337.67,379,544.573,614,514.812]],["content/80",[6,2.285,25,1.298,51,4.671,58,7.15,65,6.398,182,3.895,278,5.255,281,9.153,297,5.538,334,5.628,379,8.931,613,6.876,985,9.079,986,13.42]],["keywords/80",[]],["title/81",[5,292.154,152,269.421,742,612.527]],["content/81",[6,1.926,37,4.008,63,4.362,152,3.961,334,5.736,419,12.086,525,10.455,660,11.158,718,8.073,742,9.004,944,11.158,963,7.683,984,12.225]],["keywords/81",[]],["title/82",[184,258.124,220,420.766,394,603.606,982,635.181]],["content/82",[6,1.908,51,4.715,155,5.874,184,4.273,219,7.324,220,6.966,240,4.4,394,9.992,395,8.285,554,9.434,613,6.942,617,10.434,622,7.996,982,10.515,987,12.74]],["keywords/82",[]],["title/83",[935,1506.563]],["content/83",[1,6.79,7,4.756,25,1.342,33,1.97,37,3.387,49,7.168,51,5.413,70,3.716,114,4.429,182,4.025,186,4.504,190,7.127,196,6.28,198,4.07,200,7.527,202,4.687,256,7.168,265,5.481,297,4.322,300,8.399,301,3.473,417,6.861,437,5.98,462,6.054,514,5.462,537,4.994,560,8.068,562,8.787,703,5.685,866,8.964,910,6.131,937,6.655,938,11.944,963,5.885,988,10.867,989,10.867,990,11.944,991,8.399,992,10.867]],["keywords/83",[]],["title/84",[191,471.331,879,610.406]],["content/84",[4,1.626,25,1.682,37,2.635,51,3.756,87,5.454,105,11.155,125,6.211,152,3.125,171,4.099,190,7.342,191,4.719,222,4.28,265,5.647,293,5.759,366,7.561,398,5.878,523,11.066,853,11.753,872,7.906,879,8.01,882,9.646,883,11.155,884,9.141,886,5.607,887,9.141,937,6.855,993,7.561,994,8.442,995,11.194,996,7.105,997,11.426,998,11.194]],["keywords/84",[]],["title/85",[25,79.157,33,153.915,51,284.834,401,533.158]],["content/85",[]],["keywords/85",[]],["title/86",[5,256.976,6,115.243,14,447.448,51,284.834]],["content/86",[5,4.65,6,2.085,51,5.154,79,11.405,999,15.678,1000,11.584]],["keywords/86",[]],["title/87",[4,140.222,33,174.985,561,636.63]],["content/87",[5,3.757,6,1.685,33,2.25,51,4.164,63,3.816,70,5.362,87,6.047,103,7.754,182,3.472,185,4.203,240,3.885,293,4.871,438,6.516,462,6.914,512,7.123,525,9.145,561,10.343,711,7.384,718,7.061,893,7.316,905,10.343,909,13.64,937,7.6,984,10.694,992,12.41,1001,14.583,1002,16.09]],["keywords/87",[]],["title/88",[6,131.019,87,470.257,181,360.573]],["content/88",[5,4.099,6,1.838,51,4.543,70,5.66,87,8.066,155,5.659,181,5.059,182,3.788,203,9.628,314,6.735,396,6.203,447,12.111,704,9.978,717,9.091,1003,15.35,1004,15.912,1005,14.482]],["keywords/88",[]],["title/89",[18,354.881,33,137.374,40,405.533,184,230.384,552,558.336]],["content/89",[6,1.657,18,5.717,33,2.813,51,4.095,69,5.343,70,4.174,86,6.915,176,6.246,182,4.341,184,4.718,196,5.327,222,4.667,265,6.157,301,3.901,307,9.87,322,6.291,330,4.115,427,6.291,438,6.409,537,5.609,552,8.995,553,7.666,565,9.687,589,11.976,613,6.029,912,8.928,973,9.205,986,11.766]],["keywords/89",[]],["title/90",[6,84.661,97,306.986,182,174.469,185,211.234,301,199.292,537,286.593,552,459.559]],["content/90",[6,2.281,33,2.143,40,6.325,51,3.965,70,5.197,97,5.817,182,3.306,185,5.148,202,5.097,222,4.518,284,5.878,293,4.638,299,10.306,301,4.857,330,3.984,348,9.379,396,5.414,399,9.058,529,9.379,537,6.985,539,7.707,553,7.422,611,10.434,717,7.934,893,6.967,912,8.644,920,8.774,989,11.817,1006,10.067]],["keywords/90",[]],["title/91",[33,153.915,51,284.834,62,509.904,1007,625.565]],["content/91",[33,2.269,51,4.199,70,4.279,176,6.404,182,3.501,185,4.239,222,4.785,240,4.935,273,4.847,373,4.525,381,5.662,396,5.733,426,10.913,428,9.438,473,13.061,512,7.183,543,6.498,664,8.779,718,7.121,732,6.139,910,7.06,963,6.777,994,9.438,1008,16.226,1009,15.356,1010,14.187]],["keywords/91",[]],["title/92",[185,256.637,273,232.977,373,273.982,675,494.15,692,542.465]],["content/92",[6,1.728,33,2.308,44,4.97,51,4.271,63,3.914,96,10.102,103,7.953,155,5.32,182,3.561,185,4.311,222,4.867,240,3.985,273,4.899,373,4.603,512,7.306,536,6.12,543,6.609,675,8.302,692,9.113,712,10.843,910,7.181,918,10.102,926,9.113,1011,12.068,1012,12.27]],["keywords/92",[]],["title/93",[103,473.413,182,211.969,301,242.127,786,455.105,886,379.495]],["content/93",[5,3.886,6,2.175,33,2.328,51,4.308,70,4.39,103,8.022,147,11.483,182,4.481,185,4.349,240,4.02,301,4.103,381,5.809,512,7.369,520,8.148,543,6.667,696,11.196,718,7.305,786,9.621,886,8.023,937,7.862,1002,16.646]],["keywords/93",[]],["title/94",[7,371.572,250,635.181,255,485.12,552,625.565]],["content/94",[3,7.938,7,5.387,25,1.148,33,2.828,46,5.586,51,4.129,113,8.026,196,6.807,203,8.751,250,11.671,255,8.913,257,7.729,258,13.163,259,14.462,291,8.262,396,5.638,462,6.856,525,9.069,548,10.866,551,7.853,553,7.729,937,7.537,965,10.732,1013,15.101,1014,15.101,1015,13.163]],["keywords/94",[]],["title/95",[5,256.976,6,115.243,185,287.538,480,428.201]],["content/95",[5,3.92,6,2.379,25,1.208,33,2.348,37,3.049,51,4.345,70,4.428,155,5.413,185,4.387,265,6.532,278,4.888,480,6.532,536,6.226,863,13.023,906,9.845,924,11.583,932,8.263,933,14.234,934,11.16,943,9.543,1016,13.516]],["keywords/95",[]],["title/96",[4,110.083,18,354.881,33,137.374,185,256.637,252,411.958]],["content/96",[18,8.146,33,2.308,44,4.97,51,4.271,110,7.873,185,4.311,252,8.662,265,6.421,278,4.804,638,10.293,712,10.843,732,6.244,785,5.443,936,8.871,937,7.795,963,6.893,973,9.599,991,9.839,1017,13.285,1018,15.619,1019,11.239,1020,14.958,1021,9.599]],["keywords/96",[]],["title/97",[6,102.858,70,259.088,87,369.18,228,463.992,913,890.35]],["content/97",[5,4.175,6,2.447,51,4.628,70,5.724,87,8.157,155,5.764,228,8.446,525,10.164,912,10.089,913,16.207,971,11.496,1022,15.159,1023,14.394]],["keywords/97",[]],["title/98",[16,493.273,33,124.043,51,229.553,100,355.245,417,431.927,952,542.959]],["content/98",[33,2.968,51,5.493,79,9.874,85,8.982,100,6.905,114,5.421,182,3.72,193,7.471,206,6.637,228,8.144,240,4.164,417,10.335,514,6.684,551,8.485,560,9.874,564,8.625,952,10.554,961,10.279]],["keywords/98",[]],["title/99",[114,346.026,284,422.228,670,667.664,953,885.975]],["content/99",[6,2.247,25,1.068,33,2.7,40,6.13,51,3.843,99,5.657,182,3.204,205,5.426,240,4.663,284,7.408,293,4.495,301,3.66,330,3.861,334,4.63,347,7.387,396,5.247,417,7.231,515,7.931,537,5.263,545,5.784,550,11.82,553,7.193,587,10.244,614,6.946,636,8.779,664,8.035,732,5.619,953,11.953,1024,7.555,1025,12.249,1026,12.249]],["keywords/99",[]],["title/100",[33,137.374,97,372.969,206,378.168,240,237.216,958,491.403]],["content/100",[3,7.873,33,2.813,51,6.023,52,4.716,92,7.297,97,7.638,182,4.341,206,6.092,240,3.821,278,4.607,308,5.54,310,7.747,514,6.135,543,6.338,587,10.917,693,7.666,874,7.588,911,10.917,937,7.475,958,10.063,1007,8.995,1027,14.343,1028,9.87,1029,12.458]],["keywords/100",[]],["title/101",[63,296.762,301,308.418,786,579.706]],["content/101",[3,8.281,33,2.904,51,5.858,63,4.925,70,4.39,155,5.366,182,3.592,206,6.408,240,4.02,291,8.619,293,5.039,301,4.103,310,8.148,786,9.621,893,7.569,897,11.805,959,15.754,963,6.953,1030,8.834,1031,13.104]],["keywords/101",[]],["title/102",[16,612.063,25,79.157,51,284.834,952,673.714]],["content/102",[25,1.579,33,2.548,40,7.522,51,5.681,182,3.932,398,7.379,437,7.734,560,10.434,952,11.153,961,10.862,1032,13.547,1033,14.344,1034,15.931]],["keywords/102",[]],["title/103",[183,275.416,273,191.76,330,210.237,425,314.57,544,326.242,545,242.203,722,440.43]],["content/103",[6,1.907,23,4.16,25,0.978,32,4.169,44,4.093,70,3.585,155,4.382,164,6.186,183,4.63,273,4.32,284,5.214,293,4.115,301,3.35,330,3.534,425,5.288,438,5.505,462,5.84,537,4.818,543,5.443,544,5.484,545,4.071,613,5.178,712,8.93,722,7.404,732,5.143,804,7.124,858,7.404,910,5.914,920,7.784,974,9.376,975,7.906,976,12.864,977,12.319,978,12.319,979,11.884,980,12.319,1035,8.93]],["keywords/103",[]],["title/104",[62,410.941,152,190.987,217,342.668,414,374.974,544,357.9,952,542.959]],["content/104",[7,5.62,25,1.197,46,5.827,58,6.593,152,4.472,186,5.321,196,5.603,217,8.023,222,4.909,278,4.846,414,8.779,544,8.379,572,6.43,701,11.196,785,5.49,936,8.948,956,11.336,973,9.682,1021,9.682,1036,15.087,1037,12.839]],["keywords/104",[]],["title/105",[62,410.941,86,387.621,297,272.135,300,528.808,414,374.974,417,431.927]],["content/105",[4,1.882,7,5.669,25,1.208,33,2.348,97,6.375,113,8.446,182,3.623,186,5.367,196,5.652,256,8.543,297,5.151,300,12.448,401,8.134,414,7.098,536,6.226,552,9.543,630,8.301,937,7.931,961,10.01,1038,11.294,1039,13.851,1040,11.583]],["keywords/105",[]],["title/106",[152,269.421,183,426.225,737,454.965]],["content/106",[6,1.774,25,1.218,63,4.017,92,7.81,152,3.647,183,5.77,202,5.635,284,6.498,293,5.128,330,4.404,396,5.985,438,6.86,514,6.567,544,6.834,545,5.074,737,6.159,910,7.371,963,7.075,968,14.359,969,12.386,970,13.973,972,12.013,1041,14.359]],["keywords/106",[]],["title/107",[7,489.185,182,211.969,288,524.652,514,380.833]],["content/107",[3,8.896,7,7.889,25,1.286,51,4.628,63,4.241,155,5.764,182,3.859,255,7.882,291,9.259,514,6.932,614,8.364,617,10.241,1042,12.504,1043,14.077,1044,19.339]],["keywords/107",[]],["title/108",[183,334.613,273,232.977,514,380.833,981,606.904,982,566.919]],["content/108",[6,1.838,25,1.263,63,4.164,183,5.98,273,5.09,512,7.772,514,6.806,543,7.031,718,7.705,963,7.333,981,10.846,982,12.386,1045,14.482,1046,15.35,1047,13.821,1048,15.35,1049,11.668]],["keywords/108",[]],["title/109",[281,461.561,297,337.67,379,544.573,614,514.812]],["content/109",[6,2.175,25,1.197,58,6.593,65,5.9,88,6.172,155,5.366,182,4.884,184,3.904,202,5.538,281,8.709,297,5.107,301,4.103,379,8.236,396,5.882,427,6.618,525,9.461,537,5.9,565,10.189,613,6.342,893,7.569,985,8.373]],["keywords/109",[]],["title/110",[278,364.276,330,325.357,765,443.523]],["content/110",[5,3.955,6,2.198,25,1.218,69,5.718,155,5.46,176,6.685,182,3.655,192,6.159,205,4.76,255,7.466,278,6.112,293,5.128,330,4.404,394,9.289,435,8.381,550,10.368,553,8.205,765,7.441,860,11.129,961,10.098]],["keywords/110",[]],["title/111",[5,292.154,152,269.421,742,612.527]],["content/111",[5,4.026,6,1.805,25,1.24,37,3.854,63,4.089,152,4.57,334,5.376,396,6.092,512,7.633,514,6.684,564,8.625,693,8.352,718,7.567,742,10.39,943,9.8,944,10.459,984,11.459,1050,13.298]],["keywords/111",[]],["title/112",[37,178.358,195,562.569,400,478.346,554,508.659,639,505.648]],["content/112",[6,1.671,25,1.148,37,2.897,51,4.129,58,6.32,65,5.656,69,5.387,99,6.079,113,8.026,125,6.828,155,5.144,195,11.581,196,5.371,200,6.438,252,6.691,264,5.003,400,7.77,438,6.462,536,5.917,639,10.409,743,12.075,875,9.138,876,10.732,985,8.026,986,11.863,1026,13.163,1051,13.527,1052,13.952]],["keywords/112",[]],["title/113",[184,258.124,220,420.766,394,603.606,982,635.181]],["content/113",[6,1.743,25,1.197,65,5.9,184,3.904,194,10.484,220,7.939,239,9.192,240,4.02,288,8.89,311,7.712,366,8.671,394,11.389,395,7.569,396,5.882,551,8.192,554,8.619,613,6.342,617,9.533,638,10.382,982,9.606,1053,14.111,1054,12.597,1055,8.948]],["keywords/113",[]],["title/114",[191,471.331,879,610.406]],["content/114",[4,1.318,6,1.232,25,1.621,33,2.307,51,4.931,63,2.79,70,3.103,87,4.422,105,9.674,114,3.699,125,5.035,152,2.533,171,3.323,182,3.56,190,5.952,191,3.825,196,5.553,202,3.914,222,3.47,252,4.934,265,4.577,293,4.995,301,2.9,366,6.129,398,4.765,401,5.699,428,6.844,438,4.765,462,5.056,523,9.597,525,6.687,537,4.17,622,5.163,648,8.012,659,5.853,853,10.193,872,6.409,879,6.947,882,7.82,883,9.674,884,7.41,886,4.545,887,7.41,888,6.638,893,5.35,910,5.12,937,7.793,963,4.914,993,6.129,994,6.844,995,9.075,996,5.759,997,9.262,998,9.075,1056,8.012,1057,10.287]],["keywords/114",[]],["title/115",[25,79.157,33,153.915,182,237.492,257,533.158]],["content/115",[]],["keywords/115",[]],["title/116",[182,270.003,200,504.882,257,606.144]],["content/116",[7,5.432,97,6.109,114,5.058,171,4.544,182,4.387,196,6.843,197,12.41,198,4.648,200,6.492,202,5.353,250,9.285,257,9.848,293,4.871,304,8.764,348,9.849,438,6.516,462,6.914,466,9.077,621,12.41,732,6.088,736,6.516,910,7.001,1058,9.012,1059,17.4,1060,16.09,1061,10.822]],["keywords/116",[]],["title/117",[22,312.383,33,153.915,182,237.492,257,533.158]],["content/117",[5,3.635,6,2.085,10,6.663,18,5.625,33,2.784,63,3.692,70,5.251,155,5.019,182,4.296,252,6.529,257,7.542,278,4.533,293,4.713,305,10.472,437,6.608,514,6.036,531,9.204,541,8.211,561,7.921,695,8.315,893,7.08,894,6.452,907,10.348,926,8.598,963,6.503,1062,12.533,1063,14.111,1064,11.783,1065,9.906]],["keywords/117",[]],["title/118",[25,79.157,33,153.915,437,467.161,1066,635.181]],["content/118",[25,1.375,33,2.979,72,7.527,85,7.618,182,3.155,186,4.675,196,4.922,202,6.36,255,6.446,257,9.261,284,8.172,293,4.427,414,6.182,428,8.506,437,6.207,442,11.512,462,6.284,474,9.121,479,9.503,536,5.423,560,8.375,614,6.84,617,8.375,637,9.035,963,6.108,1032,10.873,1067,10.693,1068,12.291,1069,13.254,1070,13.84,1071,14.624,1072,11.067,1073,14.624]],["keywords/118",[]],["title/119",[25,89.993,886,483.395,1074,739.744]],["content/119",[25,1.403,202,6.491,276,12.82,486,12.544,556,7.538,902,12.055,1075,15.707,1076,21.102]],["keywords/119",[]],["title/120",[25,123.921]],["content/120",[6,2.264,25,1.403,33,2.728,51,3.903,52,4.494,58,5.974,110,7.195,184,3.537,202,5.017,205,4.238,206,5.806,234,7.544,252,6.325,273,3.577,278,5.678,281,6.325,284,7.483,293,4.566,297,4.627,308,5.28,379,7.462,440,7.544,536,5.593,614,7.054,722,8.215,879,6.35,937,7.124,963,6.3,1037,11.632,1067,11.028,1068,9.696]],["keywords/120",[]],["title/121",[6,131.019,278,364.276,284,480.028]],["content/121",[6,2.361,25,1.622,99,6.287,183,5.621,276,10.843,278,4.804,284,8.65,301,4.068,330,4.291,356,8.302,438,6.684,537,5.85,538,8.871,545,4.944,558,13.99,613,6.287,862,11.239,937,7.795,963,6.893,1077,10.102]],["keywords/121",[]],["title/122",[107,332.397,181,360.573,732,473.461]],["content/122",[3,7.562,4,1.703,5,3.549,6,1.592,25,1.41,44,4.577,46,5.321,97,5.771,107,4.038,151,5.072,181,5.649,182,4.23,185,3.971,202,5.057,240,3.671,246,5.193,265,5.914,314,5.831,330,3.952,392,9.862,396,5.371,425,5.914,532,9.574,539,7.646,553,7.363,564,7.604,613,5.791,692,8.394,732,5.752,912,8.576,1078,13.291,1079,12.539]],["keywords/122",[]],["title/123",[6,151.799,184,340.004]],["content/123",[6,2.352,9,8.096,25,1.478,69,5.524,155,5.275,176,6.458,182,3.531,184,3.838,205,5.773,219,6.578,225,6.344,226,9.036,240,3.951,278,4.764,293,4.954,297,5.02,314,6.277,427,6.505,613,6.234,614,7.654,914,8.325,985,8.231,1080,13.871]],["keywords/123",[]],["title/124",[183,493.826,273,343.83]],["content/124",[6,2.117,25,1.148,97,6.058,183,6.888,198,4.61,273,5.536,284,6.121,297,4.895,301,3.933,330,5.258,348,9.767,396,5.638,399,9.433,425,6.208,462,6.856,536,5.917,537,5.656,544,6.438,545,4.78,550,9.767,622,7.003,919,12.075,937,7.537,1061,10.732]],["keywords/124",[]],["title/125",[281,524.746,297,383.895,379,619.122]],["content/125",[6,1.63,9,7.703,25,1.432,51,4.029,69,5.256,70,4.106,155,5.019,182,3.36,246,5.319,257,7.542,281,9.701,288,8.315,293,6.027,297,4.777,315,5.484,330,4.048,373,4.342,379,7.703,398,6.306,425,6.057,564,7.788,611,10.603,617,8.916,634,12.008,740,7.832,893,7.08,957,10.23,1081,10.348]],["keywords/125",[]],["title/126",[25,70.65,33,137.374,257,475.86,467,375.547,670,595.91]],["content/126",[6,1.592,21,9.481,25,1.093,33,2.742,107,4.038,114,4.779,181,4.38,182,4.23,183,5.178,186,4.859,257,7.363,265,5.914,284,5.831,301,3.747,308,5.321,322,6.043,398,6.156,414,6.426,417,7.402,467,5.811,533,9.305,537,5.388,539,7.646,564,7.604,613,5.791,614,7.11,622,6.671,695,8.118,732,5.752,954,8.64,991,9.062,1032,11.302,1068,9.772,1082,10.942]],["keywords/126",[]],["title/127",[4,123.338,25,79.157,182,237.492,257,533.158]],["content/127",[16,10.635,25,1.375,182,4.127,202,6.362,255,8.43,257,9.264,407,10.086,486,12.295,872,10.417,902,11.815]],["keywords/127",[]],["title/128",[25,79.157,29,493.733,257,533.158,264,345.078]],["content/128",[4,2.46,22,4.419,25,1.664,28,9.312,29,10.377,30,7.921,33,2.177,44,4.688,107,4.136,122,7.39,182,4.296,198,4.498,252,6.529,257,9.644,308,5.45,373,4.342,490,6.69,714,11.207,879,6.555,886,6.015,1083,14.735,1084,14.735]],["keywords/128",[]],["title/129",[330,286.181,744,885.975,745,650.672,746,997.556]],["content/129",[4,1.841,6,1.72,22,4.663,25,1.366,44,3.521,46,4.094,110,5.579,113,5.882,114,3.676,155,5.296,164,3.971,183,6.469,186,3.738,198,3.378,257,10.511,278,3.404,286,7.772,288,6.246,330,6.009,455,6.055,544,4.718,545,3.503,550,10.056,622,5.132,722,10.345,744,16.58,745,13.302,746,17.212,747,9.019,748,10.225,749,10.599,753,11.695,760,11.695,785,3.857,939,10.225,972,8.293,1085,10.599,1086,8.177,1087,11.067,1088,11.695,1089,7.294,1090,9.647,1091,12.647]],["keywords/129",[]],["title/130",[4,90.608,25,58.151,167,380.037,183,275.416,257,391.674,273,191.76,811,650.864]],["content/130",[4,1.335,6,1.247,23,4.1,25,1.379,35,3.694,46,4.17,83,9.377,155,3.84,167,9.015,183,5.668,224,3.906,257,8.061,273,4.549,278,3.468,293,3.606,315,4.196,330,3.097,341,7.657,360,7.359,410,8.329,425,4.634,496,5.205,538,6.403,543,4.77,544,4.806,642,5.77,643,9.187,734,6.488,768,10.281,783,11.273,804,6.243,811,13.396,815,11.273,816,11.912,818,9.588,821,10.415,825,8.71,873,10.813,894,4.936,1092,9.826,1093,10.415,1094,11.273,1095,12.881,1096,12.881,1097,11.912,1098,10.097,1099,11.912,1100,12.881,1101,12.881]],["keywords/130",[]],["title/131",[25,79.157,65,390.118,400,535.943,408,393.825]],["content/131",[2,3.98,4,1.651,5,2.346,6,1.826,10,8.753,16,5.587,20,4.867,21,6.267,25,1.471,33,1.405,37,4.011,44,3.026,51,4.514,52,5.198,62,4.655,63,2.383,69,3.392,85,5.234,86,4.391,87,5.537,98,6.825,113,5.054,114,3.159,234,5.026,256,5.112,275,5.305,293,4.46,297,4.52,308,6.725,323,5.99,334,3.133,385,3.98,395,6.699,400,9.355,408,7.319,467,6.668,496,4.391,515,5.366,536,3.726,539,7.411,564,5.026,614,4.699,659,4.998,676,7.91,692,5.548,873,6.529,874,7.064,894,4.164,926,5.548,1019,6.842,1102,8.088,1103,7.604,1104,10.866,1105,10.866,1106,9.106,1107,10.866,1108,7.347,1109,5.627,1110,6.207,1111,7.47]],["keywords/131",[]],["title/132",[6,92.877,25,63.794,205,249.247,219,356.567,240,214.197,613,337.935]],["content/132",[4,1.849,6,2.361,12,6.223,25,1.486,182,4.457,184,4.844,219,8.303,240,4.988,257,10.006,293,4.996,297,5.063,334,5.146,613,6.287,614,7.719,872,8.989,902,10.196,973,9.599,1112,10.609]],["keywords/132",[]],["title/133",[107,332.397,181,360.573,732,473.461]],["content/133",[3,7.503,4,1.69,5,3.521,6,1.579,25,1.403,44,4.542,107,4.006,151,5.032,181,5.621,182,4.209,185,3.94,192,5.484,240,3.642,246,5.153,257,7.306,265,5.868,314,5.786,330,3.921,392,9.812,396,5.329,425,5.868,532,9.499,539,7.587,553,7.306,556,5.826,564,7.544,613,5.746,692,8.328,732,5.707,785,4.974,799,11.213,912,8.509,1079,12.441]],["keywords/133",[]],["title/134",[225,562.039,226,800.578]],["content/134",[6,1.617,25,1.424,69,5.214,88,5.727,114,4.856,116,6.898,205,4.34,225,8.941,226,10.938,227,8.589,278,4.496,293,4.676,334,4.816,395,7.023,426,10.388,517,9.056,536,5.727,550,9.454,551,7.601,558,13.093,564,7.726,590,7.121,745,9.131,985,7.769,1019,10.518,1113,12.159,1114,8.529,1115,12.159,1116,8.302]],["keywords/134",[]],["title/135",[613,552.327,1117,1267.615]],["content/135",[6,2.14,25,1.47,114,5.101,155,5.23,184,3.805,205,5.743,225,7.923,226,8.96,227,9.023,240,4.935,278,4.723,297,4.978,298,8.61,314,6.224,396,5.733,545,4.86,553,7.86,590,7.481,613,6.181,914,8.255,985,8.162,1116,8.722,1117,14.187]],["keywords/135",[]],["title/136",[301,308.418,537,443.523,545,374.827]],["content/136",[6,1.592,25,1.093,70,5.171,182,3.28,202,5.057,205,4.271,257,7.363,265,5.914,284,5.831,288,8.118,293,4.602,301,5.349,314,5.831,330,3.952,425,5.914,438,6.156,525,8.64,537,7.692,538,8.171,545,6.501,565,9.305,893,6.912,920,8.705,937,7.18,984,10.103,1067,11.115,1068,9.772,1111,11.302,1118,10.629]],["keywords/136",[]],["title/137",[25,79.157,202,366.157,563,509.904,1119,686.479]],["content/137",[25,1.375,182,4.127,202,6.362,257,9.264,479,12.427,525,10.87,536,7.092,563,8.86,688,12.566,1119,11.928]],["keywords/137",[]],["title/138",[60,504.882,63,296.762,514,485.1]],["content/138",[6,1.699,25,1.167,46,5.68,60,9.027,63,4.847,92,7.481,103,7.819,152,3.493,182,3.501,198,4.687,257,7.86,273,4.847,396,5.733,405,9.023,438,6.571,512,7.183,514,6.29,590,7.481,693,7.86,737,5.899,926,8.96,943,9.222,1049,10.784,1120,16.226]],["keywords/138",[]],["title/139",[6,131.019,185,326.9,480,486.819]],["content/139",[4,1.788,5,3.725,6,2.325,25,1.454,33,2.231,37,2.897,155,5.144,185,4.169,192,5.802,200,6.438,205,4.484,206,6.143,293,4.83,297,4.895,308,5.586,399,9.433,480,8.637,614,7.463,863,9.952,914,8.118,932,7.853,934,10.605,1121,11.157,1122,14.462,1123,12.844]],["keywords/139",[]],["title/140",[116,491.54,278,320.414,330,286.181,356,553.65]],["content/140",[6,2.074,25,1.111,33,2.16,63,3.663,92,7.121,99,5.884,116,6.898,182,3.333,224,5.064,257,7.482,278,4.496,301,3.807,330,5.997,356,10.999,396,5.457,438,6.255,537,5.474,538,8.302,544,6.232,545,4.626,551,7.601,659,7.683,751,10.265,1124,10.799,1125,11.688,1126,12.432,1127,10.518,1128,12.159]],["keywords/140",[]],["title/141",[217,483.395,556,483.395,742,612.527]],["content/141",[4,1.773,6,1.657,25,1.447,37,3.653,46,5.54,63,3.753,217,6.114,297,4.855,405,8.8,512,7.006,514,6.135,532,9.967,545,4.74,556,8.544,571,11.223,693,7.666,718,8.829,742,9.848,905,10.173,958,7.916,984,10.518,1109,8.863,1129,13.837,1130,15.826,1131,17.115]],["keywords/141",[]],["title/142",[4,99.401,25,63.794,85,462.071,182,191.399,257,429.683,855,570.235]],["content/142",[25,1.403,85,10.164,182,4.21,186,6.237,257,9.452,855,12.544,879,8.215,1000,11.349]],["keywords/142",[]],["title/143",[4,110.083,167,461.722,360,606.904,811,790.76,1132,982.391]],["content/143",[4,1.175,23,4.206,25,0.754,35,4.713,44,4.576,121,6.813,155,3.38,161,3.582,164,6.657,167,8.402,183,6.089,228,4.952,257,5.079,278,3.052,304,5.711,341,9.77,360,6.478,381,3.659,462,4.505,487,7.14,538,8.169,642,7.362,694,11.664,696,7.052,748,9.167,758,7.108,804,7.965,811,15.779,818,12.233,858,8.278,888,5.915,889,7.667,965,7.052,994,6.099,1092,8.649,1093,9.167,1097,15.198,1098,12.883,1132,10.485,1133,9.503,1134,6.418,1135,11.339,1136,16.435,1137,16.435,1138,11.339,1139,11.339]],["keywords/143",[]],["title/144",[4,90.608,183,275.416,241,325.026,284,310.182,381,282.178,722,440.43,826,482.031]],["content/144",[25,1.298,33,2.524,183,6.148,222,5.323,241,7.256,257,8.743,284,6.924,297,5.538,381,6.299,396,6.378,398,7.31,569,9.579,674,7.15,722,9.832,826,10.76,828,14.889]],["keywords/144",[]],["title/145",[4,110.083,33,137.374,257,475.86,423,652.904,782,624.992]],["content/145",[25,1.177,33,3.141,73,9.036,155,5.275,182,3.531,198,4.727,252,6.862,257,7.926,278,4.764,293,4.954,423,13.656,427,6.505,466,9.232,717,8.473,782,10.41,786,7.581,901,6.755,910,7.12,1043,12.882,1140,13.172,1141,11.605,1142,12.882,1143,11.442,1144,15.486]],["keywords/145",[]],["title/146",[6,131.019,278,364.276,963,522.668]],["content/146",[6,2.095,25,1.439,63,3.723,92,7.238,182,3.387,227,8.729,278,5.826,293,6.058,334,4.894,513,10.091,514,6.085,544,6.333,545,5.995,550,9.608,551,7.725,554,8.128,718,6.889,937,7.414,963,6.556,1000,9.13,1047,12.357,1110,9.697,1119,9.79,1145,16.975,1146,15.697,1147,9.358,1148,11.879]],["keywords/146",[]],["title/147",[6,131.019,227,695.85,613,476.718]],["content/147",[6,1.671,22,4.529,25,1.148,40,6.587,44,4.805,45,4.895,46,5.586,76,10.258,92,7.357,184,3.742,205,4.484,219,6.414,225,6.186,226,8.811,227,11.246,240,3.853,241,6.414,278,4.645,293,4.83,392,8.026,396,5.638,517,9.356,531,9.433,613,7.704,1000,9.281,1019,10.866,1149,15.101,1150,13.527]],["keywords/147",[]],["title/148",[988,1328.96]],["content/148",[6,1.907,25,1.31,33,1.901,70,3.585,97,6.916,107,3.611,181,5.249,182,4.938,186,4.345,196,4.575,200,7.349,202,4.522,255,5.991,257,9.952,264,4.261,265,7.086,278,3.957,284,5.214,293,4.115,301,3.35,428,7.906,437,5.769,462,5.84,515,7.259,536,5.04,537,4.818,565,8.32,613,5.178,617,7.784,622,5.965,893,6.181,899,10.7,910,5.914,989,10.483,1065,8.647,1119,8.477,1151,9.504,1152,9.784,1153,12.864]],["keywords/148",[]],["title/149",[191,471.331,879,610.406]],["content/149",[4,1.579,19,4.567,25,1.666,33,1.97,51,3.646,87,5.295,105,10.939,125,6.029,152,3.034,171,3.979,191,4.58,196,4.742,222,4.155,257,6.825,265,5.481,293,5.648,366,7.339,398,5.706,523,12.166,853,11.526,872,7.674,879,7.855,882,9.364,883,10.939,884,8.874,886,5.443,887,8.874,937,6.655,993,7.339,994,8.195,995,10.867,996,6.897,997,11.091,998,10.867,1154,11.944]],["keywords/149",[]],["title/150",[6,115.198,25,49.41,114,215.99,182,148.243,200,277.201,278,200.003,284,263.555,1056,467.857]],["content/150",[]],["keywords/150",[]],["title/151",[25,70.65,182,211.969,200,396.364,401,475.86,878,696.684]],["content/151",[6,1.464,25,1.499,92,6.449,97,5.31,151,4.667,152,3.012,181,4.03,182,4.79,200,7.491,205,3.93,219,5.622,240,3.377,252,5.865,264,4.385,265,5.442,301,3.447,304,7.619,334,4.361,401,6.775,458,7.036,486,8.992,531,8.269,536,5.186,537,4.958,541,7.376,545,4.19,565,8.561,613,5.329,630,5.56,632,8.899,881,11.011,888,7.891,902,8.641,937,6.606,1001,12.677,1065,8.899,1155,10.227,1156,11.538,1157,8.992,1158,9.296,1159,12.677]],["keywords/151",[]],["title/152",[6,102.858,22,278.811,114,308.839,182,211.969,199,508.659]],["content/152",[5,3.467,6,2.379,70,3.916,87,5.581,114,6.071,155,4.787,182,4.167,192,5.399,199,7.689,252,6.227,255,6.545,293,4.495,392,7.47,423,9.869,438,6.014,462,6.381,545,4.448,613,5.657,735,7.231,893,6.752,906,8.707,912,8.378,923,10.531,926,8.2,963,6.203,1031,11.69,1062,11.953,1064,11.238,1160,8.144,1161,12.588,1162,14.85,1163,13.459,1164,9.869,1165,10.531]],["keywords/152",[]],["title/153",[6,102.858,25,70.65,114,308.839,437,416.956,1066,566.919]],["content/153",[6,2.358,25,1.526,92,6.692,114,5.981,116,6.482,181,4.182,182,4.105,183,4.944,196,4.885,198,4.193,199,7.515,200,5.856,205,5.346,206,5.587,219,5.834,240,3.505,252,6.086,265,5.647,284,7.298,310,7.105,437,6.16,462,6.237,613,5.529,614,6.789,617,8.312,638,9.052,910,6.315,1067,10.613,1068,9.33,1069,13.154,1166,10.293,1167,10.791,1168,10.293]],["keywords/153",[]],["title/154",[25,89.993,886,483.395,1074,739.744]],["content/154",[]],["keywords/154",[]],["title/155",[25,123.921]],["content/155",[6,2.422,7,5.256,25,1.12,52,4.639,111,6.354,114,6.259,202,5.18,234,7.788,248,9.129,278,4.533,284,7.638,293,4.713,301,3.838,308,5.45,311,7.213,366,8.11,400,7.581,438,6.306,537,5.519,545,4.664,548,10.603,551,7.662,613,5.932,614,7.282,617,8.916,937,7.354,1068,10.009,1169,7.703]],["keywords/155",[]],["title/156",[6,131.019,278,364.276,284,480.028]],["content/156",[6,2.289,25,1.111,70,4.073,97,5.864,155,4.979,182,3.333,183,5.261,196,5.199,202,5.138,246,5.277,278,4.496,284,7.598,293,4.676,301,3.807,330,5.15,356,7.769,396,5.457,425,6.009,537,5.474,545,4.626,717,7.997,732,5.844,893,7.023,919,11.688,936,8.302,1006,10.148,1035,10.148,1078,13.504,1170,8.529,1171,11.483]],["keywords/156",[]],["title/157",[107,332.397,181,360.573,732,473.461]],["content/157",[6,2.085,25,1.12,46,6.97,70,4.106,107,4.136,155,5.019,181,4.486,182,4.296,185,4.067,192,5.661,205,4.375,206,5.994,240,3.76,314,7.638,388,9.445,389,8.658,419,10.23,425,6.057,438,6.306,539,7.832,553,7.542,561,7.921,613,7.585,704,8.849,706,8.598,732,5.891,1172,12.008,1173,10.009]],["keywords/157",[]],["title/158",[6,151.799,184,340.004]],["content/158",[6,2.298,12,5.871,25,1.12,45,6.108,69,5.256,155,5.019,182,3.36,184,4.669,191,5.062,202,5.18,205,6.167,219,6.259,240,3.76,278,4.533,293,4.713,301,3.838,396,5.501,438,6.306,537,5.519,565,9.53,613,5.932,716,6.079,740,7.832,906,9.129,973,9.056,985,7.832,1174,10.23]],["keywords/158",[]],["title/159",[183,493.826,273,343.83]],["content/159",[6,2.415,25,1.111,44,4.651,87,5.804,92,7.121,155,4.979,182,3.333,183,6.747,196,5.199,228,7.295,273,5.47,276,10.148,304,8.413,330,4.016,399,9.131,425,6.009,462,6.637,538,8.302,545,4.626,712,10.148,858,8.413,963,6.451,1066,8.913,1170,8.529,1175,10.518,1176,9.542,1177,10.265]],["keywords/159",[]],["title/160",[281,524.746,297,383.895,379,619.122]],["content/160",[6,1.685,25,1.157,51,5.261,65,5.703,69,5.432,70,4.244,151,5.368,155,5.187,182,3.472,202,5.353,246,5.497,281,9.819,297,4.936,311,7.454,330,4.184,379,7.961,396,5.685,438,6.516,536,5.966,553,7.794,611,10.957,893,7.316,957,10.572,985,8.094,1178,11.765]],["keywords/160",[]],["title/161",[6,102.858,25,70.65,114,308.839,467,375.547,670,595.91]],["content/161",[2,5.837,6,2.239,25,1.382,52,5.725,86,6.439,114,6.041,182,4.146,196,4.96,200,7.753,202,4.902,222,4.345,234,7.371,252,6.18,265,5.733,278,4.29,284,5.653,398,5.968,437,6.255,462,6.332,467,7.345,536,5.464,560,8.439,563,6.827,613,5.614,614,6.892,699,10.304,732,5.576,874,7.065,986,10.956,1000,8.571,1032,10.956,1179,13.946]],["keywords/161",[]],["title/162",[25,79.157,65,390.118,400,535.943,408,393.825]],["content/162",[2,4.496,4,1.803,6,1.188,10,4.857,20,5.498,21,7.079,25,0.816,37,3.896,51,2.937,52,3.382,65,5.701,67,4.939,92,5.233,98,7.452,113,5.709,134,6.947,196,5.414,220,4.339,225,4.4,226,6.267,234,5.677,248,6.655,275,5.792,293,4.869,297,3.482,301,2.797,385,4.496,395,7.314,396,4.01,399,6.71,400,10.851,408,7.974,438,4.597,467,4.339,496,4.96,498,7.634,537,4.023,541,5.985,554,5.877,564,5.677,614,5.309,716,4.431,740,5.709,785,3.743,799,8.438,874,5.442,920,6.5,936,6.101,963,4.741,1038,7.634,1110,7.012,1148,8.589,1180,7.375,1181,10.741,1182,12.274,1183,6.766,1184,12.274,1185,9.924]],["keywords/162",[]],["title/163",[6,92.877,25,63.794,205,249.247,219,356.567,240,214.197,613,337.935]],["content/163",[]],["keywords/163",[]],["title/164",[107,332.397,181,360.573,732,473.461]],["content/164",[3,7.387,6,2.022,25,1.068,45,4.556,107,3.945,151,4.954,155,4.787,181,4.279,182,4.167,184,3.483,185,3.879,186,4.747,192,5.399,205,4.173,209,14.053,240,3.586,314,7.408,385,5.882,396,5.247,490,6.381,545,4.448,553,7.193,561,7.555,613,5.657,622,6.517,704,8.44,706,8.2,707,10.858,732,5.619,785,4.897,888,8.378,889,10.858,985,7.47,1186,16.059,1187,10.383,1188,12.984]],["keywords/164",[]],["title/165",[25,89.993,45,383.895,184,293.46]],["content/165",[4,1.639,6,2.002,12,5.514,25,1.052,40,6.037,45,6.535,131,8.02,155,4.714,182,3.155,184,4.996,196,4.922,205,4.109,219,5.879,225,5.669,226,8.075,227,8.132,240,3.531,255,6.446,265,5.689,278,4.257,293,4.427,301,3.604,428,8.506,438,5.923,519,8.506,537,5.183,541,7.712,551,7.197,554,7.572,613,7.284,862,9.959,937,6.907,973,8.506,1055,7.861,1189,9.836]],["keywords/165",[]],["title/166",[25,79.157,202,366.157,563,509.904,1119,686.479]],["content/166",[6,1.644,25,1.439,60,9.362,63,5.225,87,5.899,103,7.564,182,3.387,196,5.283,265,6.107,273,3.723,396,5.546,419,10.313,462,6.745,514,7.758,525,8.921,536,5.82,590,7.238,737,5.707,905,10.091,918,9.608,926,8.668,963,6.556,984,10.432,1049,10.432,1120,15.697]],["keywords/166",[]],["title/167",[6,131.019,185,326.9,480,486.819]],["content/167",[6,2.272,25,1.41,37,2.76,40,6.275,110,7.252,114,4.779,155,4.9,182,3.28,185,3.971,186,4.859,192,5.527,196,5.117,255,6.7,293,4.602,399,8.986,421,8.514,467,5.811,480,8.92,553,7.363,564,7.604,663,11.688,863,9.481,906,8.913,914,7.734,932,9.648,1123,12.236,1190,12.886,1191,10.486]],["keywords/167",[]],["title/168",[116,491.54,278,320.414,330,286.181,356,553.65]],["content/168",[6,1.555,25,1.068,76,9.546,92,6.847,97,5.638,99,5.657,116,6.632,152,3.197,182,3.204,191,4.828,196,4.998,202,4.94,224,4.869,241,5.969,265,5.777,278,4.323,284,5.697,301,4.76,311,6.879,329,7.156,330,5.908,356,9.714,438,6.014,536,5.506,537,6.845,550,9.089,565,9.089,668,8.317,751,9.869,1035,9.757,1125,11.238,1128,11.69,1170,8.2]],["keywords/168",[]],["title/169",[217,483.395,556,483.395,742,612.527]],["content/169",[6,1.657,25,1.138,37,4.015,114,4.975,182,3.415,196,5.327,202,5.265,217,7.771,293,4.791,405,8.8,532,9.967,556,7.771,564,7.916,693,7.666,703,6.385,718,6.945,742,9.848,904,12.458,918,9.687,931,10.173,958,7.916,1119,9.87,1129,13.837,1142,12.458,1192,10.644,1193,13.055]],["keywords/169",[]],["title/170",[988,1328.96]],["content/170",[6,2.07,25,1.422,37,2.29,45,3.87,60,5.089,63,2.991,97,4.789,107,3.351,114,3.965,181,4.989,182,4.592,184,2.958,196,5.828,198,3.644,199,8.965,200,6.986,202,4.196,217,4.873,278,3.672,284,6.642,293,3.818,301,3.109,330,3.28,334,5.399,356,6.345,437,5.354,462,5.42,480,4.907,514,4.89,525,7.169,537,4.471,556,4.873,563,5.843,613,6.596,705,7.944,706,6.965,718,5.535,732,4.772,742,6.174,860,8.287,932,6.207,973,7.336,1056,8.589,1164,8.383,1168,8.945,1172,9.728,1194,9.929,1195,11.937]],["keywords/170",[]],["title/171",[4,123.338,25,79.157,33,153.915,503,630.307]],["content/171",[]],["keywords/171",[]],["title/172",[33,202.738,503,830.247]],["content/172",[3,7.746,33,3.235,44,4.688,51,4.029,176,6.145,182,3.36,185,4.067,199,8.062,200,6.282,205,6.167,206,5.994,240,3.76,255,6.862,264,4.881,291,10.309,310,7.621,373,4.342,395,7.08,396,5.501,496,6.804,503,8.916,551,7.662,712,10.23,732,5.891,785,5.135,1141,11.042,1196,11.042]],["keywords/172",[]],["title/173",[33,153.915,182,237.492,503,630.307,544,444.09]],["content/173",[4,0.935,5,2.54,6,2.301,7,2.818,18,6.011,25,0.782,33,3.036,37,1.516,40,2.03,44,2.514,63,3.04,69,1.66,70,3.786,86,3.648,87,5.864,103,2.37,110,2.346,113,2.474,155,3.506,176,4.293,181,2.405,182,4.076,184,2.551,185,5.322,192,3.035,196,2.81,202,1.636,205,3.056,210,3.54,219,1.977,222,1.45,228,3.943,240,2.627,250,6.277,252,6.021,255,3.679,257,2.382,258,4.056,259,4.457,265,1.913,273,3.405,291,2.546,301,4.101,307,3.067,322,1.955,330,1.279,381,2.913,392,2.474,394,2.697,396,4.529,401,4.044,405,2.735,427,1.955,428,4.856,437,2.087,438,3.381,466,2.774,480,3.248,503,11.667,512,2.177,515,2.626,520,2.407,525,7.286,532,3.097,536,1.823,537,5.089,539,2.474,542,3.392,543,3.343,544,1.984,545,2.501,548,3.349,550,3.01,551,2.42,552,4.745,553,5.269,561,5.534,589,3.721,613,1.873,652,2.546,664,4.517,675,5.471,692,2.715,693,2.382,701,3.307,704,2.795,706,2.715,711,2.257,717,2.546,718,4.773,732,1.861,786,3.867,862,3.349,863,3.067,872,2.679,886,1.9,902,3.038,905,3.161,906,2.883,910,4.733,912,2.774,913,7.566,914,4.247,916,4.918,918,3.01,920,2.816,921,2.754,931,3.161,934,3.268,936,2.643,937,3.943,963,3.487,973,4.856,984,3.268,985,2.474,987,3.438,991,2.932,1005,4.056,1011,3.596,1012,3.656,1013,4.654,1017,3.958,1018,4.654,1019,3.349,1049,3.268,1180,3.195,1197,3.721,1198,5.318,1199,4.169,1200,5.318,1201,5.318,1202,5.318,1203,5.318,1204,2.735,1205,4.169,1206,5.318,1207,3.067,1208,5.318,1209,5.318,1210,5.318,1211,4.169,1212,5.318]],["keywords/173",[]],["title/174",[25,63.794,33,124.043,182,191.399,301,218.631,503,507.977,537,314.404]],["content/174",[1,2.277,5,1.103,6,1.468,7,5.508,8,2.706,25,1.378,33,1.128,37,1.917,46,1.654,51,2.088,58,3.196,63,2.504,65,2.86,69,4.215,70,1.246,86,2.065,92,2.178,96,2.892,97,1.794,99,1.8,110,2.254,113,2.377,114,1.485,116,2.11,125,2.022,152,3.513,155,3.404,176,3.184,182,3.026,183,4.776,184,1.108,186,2.579,194,2.976,195,6.047,196,5.141,198,1.365,202,1.572,205,2.267,217,4.824,220,4.037,222,1.393,235,3.178,238,3.455,239,2.609,240,1.141,250,2.726,255,2.082,256,2.404,264,1.481,265,4.108,273,3.623,278,1.375,281,4.428,284,1.812,288,2.523,291,2.446,293,3.78,297,4.302,300,4.81,301,2.603,311,2.189,319,2.277,330,3.247,334,1.473,366,2.461,379,3.992,394,6.848,396,3.731,400,3.929,401,2.289,414,4.464,417,2.301,425,1.838,427,1.878,432,2.685,435,2.338,437,2.005,438,5.679,462,2.03,503,4.62,512,2.091,514,4.093,525,6.001,529,2.892,536,2.992,537,3.743,541,2.492,542,3.259,543,1.892,544,5.658,545,3.163,551,2.325,553,6.049,554,4.178,560,4.62,564,2.363,565,2.892,572,3.117,613,3.074,614,3.774,622,5.48,630,3.207,639,5.435,645,3.006,660,2.866,693,2.289,695,2.523,701,5.427,715,3.803,718,5.48,722,4.395,732,3.053,734,2.573,737,2.933,738,5.641,742,3.949,743,6.106,765,3.743,860,3.104,872,2.573,875,2.706,893,3.669,902,2.919,912,2.665,920,2.706,931,3.037,936,2.54,937,3.811,943,2.685,952,2.892,954,2.685,956,3.217,961,2.817,963,1.973,965,3.178,966,4.282,968,4.005,972,3.351,973,4.693,981,4.984,982,8.092,985,2.377,987,3.303,999,3.719,1036,7.312,1041,4.005,1042,3.303,1049,3.14,1051,4.005,1052,4.131,1053,4.005,1054,3.575,1055,2.54,1110,2.919,1129,4.131,1167,3.513,1213,5.109,1214,5.109,1215,5.109,1216,4.725,1217,5.109,1218,5.109,1219,2.461,1220,2.919,1221,5.109,1222,5.109,1223,5.109,1224,2.976,1225,5.109,1226,5.109,1227,3.351]],["keywords/174",[]],["title/175",[191,471.331,879,610.406]],["content/175",[4,1.343,6,1.255,25,1.631,33,2.337,70,3.161,87,4.504,97,4.55,105,9.8,125,5.129,152,2.581,171,3.385,182,3.606,186,3.831,190,6.063,191,3.896,196,4.034,202,3.987,252,5.026,256,6.098,265,4.663,293,3.628,301,2.954,366,6.243,401,5.806,428,6.971,462,5.15,503,9.571,523,9.721,525,6.812,536,4.444,537,4.248,544,4.836,545,3.59,560,6.864,622,5.26,688,7.875,853,10.326,872,6.528,879,7.037,882,7.966,883,9.8,884,7.549,886,4.63,887,7.549,893,5.45,910,5.215,936,6.443,937,5.661,963,5.006,992,9.244,994,6.971,995,9.244,996,5.867,997,9.435,998,9.244,999,9.435,1147,7.145]],["keywords/175",[]],["title/176",[25,79.157,33,153.915,182,237.492,678,749.53]],["content/176",[]],["keywords/176",[]],["title/177",[182,237.492,199,569.907,678,749.53,878,780.572]],["content/177",[4,1.703,63,3.605,97,5.771,175,10.224,182,4.23,195,8.705,196,7.305,197,11.724,198,5.664,199,7.871,250,8.772,293,4.602,304,8.28,311,7.042,366,7.918,396,5.371,438,6.156,519,8.842,544,6.133,567,10.78,678,10.352,736,6.156,910,6.614,1038,10.224,1043,11.967,1207,9.481,1228,11.724,1229,16.439,1230,16.439,1231,16.439,1232,13.291,1233,13.777]],["keywords/177",[]],["title/178",[22,312.383,33,153.915,182,237.492,678,749.53]],["content/178",[5,3.389,6,2.222,10,6.211,33,2.968,37,2.635,63,3.442,70,5.018,171,4.099,182,4.105,252,6.086,264,5.965,293,4.394,322,5.77,428,8.442,437,6.16,531,8.58,678,12.955,695,7.751,696,9.762,705,9.141,893,6.6,918,8.884,926,8.015,963,6.062,1019,9.884,1062,11.683,1063,13.154,1064,10.984,1065,9.234,1110,8.967,1147,8.652,1234,13.154,1235,12.69,1236,12.304]],["keywords/178",[]],["title/179",[25,79.157,33,153.915,437,467.161,1066,635.181]],["content/179",[7,4.791,25,1.348,33,2.936,46,4.968,97,7.118,107,3.77,114,5.894,152,3.056,181,4.09,182,4.045,186,4.537,196,4.777,202,4.722,250,8.191,284,7.192,301,3.498,310,6.948,414,6,437,6.024,438,5.748,462,6.099,536,5.263,537,5.031,551,6.985,553,6.875,560,8.128,626,11.708,637,8.768,671,12.864,678,12.766,954,8.067,961,8.461,1015,11.708,1032,10.552,1036,12.864,1068,9.124,1237,11.173]],["keywords/179",[]],["title/180",[25,89.993,886,483.395,1074,739.744]],["content/180",[25,1.375,96,11.707,182,4.127,202,6.362,486,12.295,678,13.024,872,10.417,902,11.815,936,10.28,1077,11.707]],["keywords/180",[]],["title/181",[25,123.921]],["content/181",[6,1.579,25,1.085,33,2.728,51,3.903,52,4.494,63,3.577,69,5.092,114,4.742,152,3.247,198,4.357,205,5.481,206,5.806,219,6.063,234,7.544,240,3.642,278,4.391,293,4.566,308,6.828,396,5.329,399,8.916,440,7.544,545,4.518,613,5.746,614,7.054,622,6.619,638,9.407,659,7.503,674,5.974,692,8.328,784,11.873,785,4.974,809,8.055,963,6.3,1037,11.632]],["keywords/181",[]],["title/182",[6,131.019,278,364.276,284,480.028]],["content/182",[6,2.117,25,1.454,33,2.231,155,5.144,183,5.435,196,5.371,228,7.537,246,5.451,273,3.784,276,10.484,278,4.645,284,7.758,315,5.621,330,4.149,425,6.208,462,6.856,538,8.577,543,6.39,544,8.16,545,4.78,556,6.164,590,7.357,799,11.863,910,6.943,937,7.537,1068,10.258]],["keywords/182",[]],["title/183",[107,332.397,181,360.573,732,473.461]],["content/183",[5,3.635,6,2.085,25,1.12,44,4.688,70,4.106,87,5.851,97,5.911,107,4.136,151,5.195,155,5.019,181,4.486,182,3.36,185,4.067,186,4.977,192,5.661,240,3.76,314,7.638,385,6.167,392,7.832,396,5.501,539,10.015,553,7.542,562,9.711,613,5.932,678,10.603,704,8.849,717,8.062,732,5.891,879,6.555,1003,13.613]],["keywords/183",[]],["title/184",[6,151.799,184,340.004]],["content/184",[6,2.289,12,5.824,25,1.424,45,4.738,65,5.474,97,5.864,155,4.979,171,4.362,176,6.095,182,3.333,184,5.128,191,5.021,205,4.34,219,6.208,240,3.73,265,6.009,293,4.676,301,3.807,314,5.925,426,10.388,438,6.255,537,5.474,541,8.145,613,7.546,973,8.983,985,7.769,1016,12.432,1238,11.688]],["keywords/184",[]],["title/185",[183,493.826,273,343.83]],["content/185",[4,1.731,6,2.074,25,1.111,70,4.073,183,6.747,191,5.021,196,5.199,202,5.138,273,5.186,276,10.148,301,3.807,330,4.016,385,6.118,399,9.131,425,6.009,532,9.728,537,5.474,538,8.302,544,6.232,545,5.933,611,10.518,740,7.769,858,8.413,920,8.845,1066,8.913,1174,10.148,1175,10.518,1177,10.265,1239,13.998]],["keywords/185",[]],["title/186",[25,70.65,33,137.374,467,375.547,670,595.91,678,668.979]],["content/186",[6,2.012,25,1.06,33,2.687,96,9.02,97,5.595,100,5.902,107,3.914,179,7.921,181,4.246,182,4.146,184,3.456,186,4.71,196,4.96,202,4.902,255,6.495,272,6.795,278,4.29,284,5.653,295,9.794,389,8.195,428,8.571,467,5.633,479,9.575,536,5.464,551,7.252,560,8.439,614,6.892,617,8.439,622,6.467,678,14.56,732,5.576,989,11.365,999,11.6,1000,8.571,1240,15.936]],["keywords/186",[]],["title/187",[4,123.338,25,79.157,182,237.492,678,749.53]],["content/187",[25,1.375,182,4.127,202,6.362,255,8.43,407,10.086,486,12.295,678,13.024,872,10.417,902,11.815,1077,11.707]],["keywords/187",[]],["title/188",[25,89.993,373,348.994,678,852.135]],["content/188",[1,3.98,4,1.737,5,1.928,6,0.865,7,5.877,8,7.28,10,3.534,12,4.063,19,1.574,22,4.045,23,4.145,24,3.083,25,1.352,28,3.863,29,4.834,32,1.111,33,1.993,34,3.148,35,3.943,37,1.499,44,1.462,53,5.808,60,1.959,84,2.802,87,1.825,98,6.602,107,1.29,110,3.94,111,1.981,122,3.92,125,3.534,151,1.62,152,2.737,156,2.781,161,1.659,167,2.282,182,1.782,185,1.268,188,2.945,193,2.104,198,4.117,206,1.869,224,2.708,241,1.952,251,4.966,271,1.863,273,3.015,295,5.489,300,2.895,314,3.168,319,2.34,330,1.262,334,1.514,355,3.519,364,2.847,368,3.307,373,2.303,381,1.694,394,2.663,396,1.716,398,1.966,408,1.737,458,2.442,483,2.824,491,3.822,538,2.61,543,3.307,572,1.876,630,5.054,656,3.121,678,12.362,736,1.966,758,2.271,765,1.721,768,3,770,2.593,771,4.669,772,2.178,773,4.592,774,6.37,775,4.276,777,2.34,780,2.781,782,3.089,787,2.545,843,5.275,886,4.163,901,2.004,993,2.529,996,5.275,1160,2.663,1196,3.443,1220,3,1241,5.251,1242,4.116,1243,5.251,1244,13.749,1245,5.251,1246,8.931,1247,11.653,1248,7.816,1249,8.931,1250,5.251,1251,3.822,1252,5.251,1253,5.251,1254,3.55,1255,7.221,1256,2.972,1257,2.402,1258,7.816,1259,4.245,1260,4.401,1261,5.697,1262,3.227,1263,3.745,1264,3.908,1265,8.931,1266,8.931,1267,8.931,1268,2.719,1269,5.251,1270,5.251,1271,5.251,1272,3.822,1273,5.251,1274,5.251,1275,5.251,1276,2.781,1277,5.251,1278,2.593,1279,5.251,1280,4.116,1281,5.251,1282,5.251,1283,4.401,1284,5.251,1285,4.856,1286,5.251,1287,5.251,1288,5.251,1289,5.251,1290,5.251,1291,5.251]],["keywords/188",[]],["title/189",[25,79.157,65,390.118,400,535.943,408,393.825]],["content/189",[2,8.072,4,2.101,5,3.771,6,2.252,10,6.912,25,1.348,33,2.259,35,3.541,37,4.054,63,2.708,69,3.854,92,5.264,100,6.469,113,5.743,114,5.078,134,6.988,182,2.463,185,2.983,196,3.843,252,4.788,265,4.442,293,4.89,295,10.736,334,3.56,400,9.924,408,7.989,467,7.166,503,6.538,514,4.426,536,5.99,541,6.021,548,7.775,561,5.809,936,6.137,963,6.747,1030,6.059,1038,7.679,1110,7.053,1148,8.64,1292,12.347,1293,12.347,1294,10.348,1295,9.678]],["keywords/189",[]],["title/190",[6,92.877,25,63.794,205,249.247,219,356.567,240,214.197,613,337.935]],["content/190",[6,1.89,25,1.298,69,6.094,205,5.072,219,7.256,240,4.359,246,6.167,419,11.859,542,12.452,553,8.743,556,6.973,613,8.315,799,13.42,872,9.832,902,11.151]],["keywords/190",[]],["title/191",[107,332.397,181,360.573,732,473.461]],["content/191",[6,2.14,70,4.279,87,6.098,107,4.31,155,6.588,176,6.404,181,5.889,192,5.899,240,3.918,288,8.666,293,4.912,314,7.84,330,4.219,425,6.312,490,6.972,613,6.181,617,9.292,622,7.121,704,9.222,732,6.139,893,7.378,985,8.162,1114,8.96,1296,14.187]],["keywords/191",[]],["title/192",[25,89.993,45,383.895,184,293.46]],["content/192",[6,2.002,12,5.514,25,1.052,45,6.535,171,4.13,182,3.155,184,5.298,191,4.754,196,4.922,204,7.483,205,4.109,219,5.879,225,5.669,226,8.075,227,8.132,240,3.531,246,4.996,293,4.427,301,3.604,323,8.718,536,5.423,537,5.183,550,8.951,551,7.197,554,7.572,613,8.115,678,9.959,862,9.959,894,7.923,973,8.506,1148,11.067,1297,10.693]],["keywords/192",[]],["title/193",[25,79.157,202,366.157,563,509.904,1119,686.479]],["content/193",[25,1.336,63,4.404,151,6.196,202,7.387,519,10.802,525,10.556,536,6.887,563,8.604,864,13.171,872,10.116,902,11.474,1119,11.583]],["keywords/193",[]],["title/194",[60,504.882,63,296.762,514,485.1]],["content/194",[4,1.915,6,1.789,25,1.229,60,9.242,63,4.053,92,7.88,152,3.679,196,5.752,198,4.937,273,5.006,396,6.038,512,7.565,514,6.625,590,7.88,737,7.675,926,9.437,963,7.138,1119,10.659]],["keywords/194",[]],["title/195",[6,131.019,185,326.9,480,486.819]],["content/195",[5,4.062,6,2.417,25,1.251,87,6.538,155,5.608,176,6.866,185,4.545,196,5.856,297,5.337,480,8.303,863,10.851,906,10.201,932,8.562,934,11.563,1023,14.004,1298,11.305,1299,13.696]],["keywords/195",[]],["title/196",[116,491.54,278,320.414,330,286.181,356,553.65]],["content/196",[6,2.129,12,6.067,25,1.157,40,6.642,92,7.419,116,9.079,196,5.416,241,6.468,278,4.684,293,4.871,321,10.694,330,6.088,356,10.226,544,6.492,545,4.82,551,7.918,668,9.012,734,8.764,751,10.694,910,7.001,937,7.6,1035,10.572,1170,8.885]],["keywords/196",[]],["title/197",[217,483.395,556,483.395,742,612.527]],["content/197",[4,1.898,25,1.218,33,2.369,37,3.812,63,4.979,202,5.635,217,6.544,222,4.995,273,4.017,334,5.282,512,7.498,514,6.567,536,6.281,543,6.784,556,8.11,718,7.434,742,8.292,921,9.487,958,8.473,963,7.075]],["keywords/197",[]],["title/198",[988,1328.96]],["content/198",[6,2.128,19,4.315,25,1.565,33,1.861,68,7.565,70,3.51,97,5.053,107,3.536,125,5.696,181,3.835,182,4.696,190,6.733,196,4.48,202,5.975,255,5.867,265,5.178,278,3.875,284,5.106,293,4.029,301,3.281,366,6.934,428,7.742,437,5.649,462,5.719,523,7.742,536,4.936,537,4.718,563,6.166,596,10.073,613,5.071,639,6.851,642,6.448,678,14.819,732,5.036,893,6.052,910,5.792,937,6.287,973,7.742,989,10.266,1119,8.302,1167,9.896,1194,10.478]],["keywords/198",[]],["title/199",[25,58.151,33,113.071,179,434.636,180,402.245,194,509.266,220,309.108,315,284.809]],["content/199",[]],["keywords/199",[]],["title/200",[25,63.794,33,124.043,179,476.813,180,441.279,194,558.686,961,528.808]],["content/200",[]],["keywords/200",[]],["title/201",[107,260.952,181,283.072,641,743.425,893,446.695,1300,488.703]],["content/201",[6,1.972,9,7.074,12,5.392,25,1.028,33,1.999,51,3.7,58,5.664,99,5.447,113,7.192,151,4.771,180,7.113,181,4.12,182,3.085,185,4.921,194,9.006,205,4.018,220,5.466,230,4.885,250,8.252,264,4.483,291,7.404,310,6.999,314,5.485,315,5.036,330,3.718,410,9.998,425,5.563,455,7.404,478,9.617,503,8.188,504,6.856,506,8.384,582,8.674,622,6.275,641,10.821,652,7.404,664,7.737,674,5.664,707,10.455,1082,10.292,1227,10.14,1301,13.532]],["keywords/201",[]],["title/202",[4,110.083,108,554.215,207,585.638,240,237.216,1302,929.703]],["content/202",[1,7.101,3,7.331,4,1.651,6,1.543,25,1.06,33,2.687,155,4.75,180,7.331,190,7.454,194,9.281,220,5.633,227,8.195,235,12.923,236,10.956,237,10.451,240,3.558,241,5.923,242,8.785,243,7.331,307,9.191,372,10.304,396,5.207,414,6.229,467,5.633,551,7.252,639,7.585,736,5.968,860,9.682,873,9.575,1021,8.571,1110,9.104,1151,10.304,1189,9.911,1303,13.946,1304,13.356,1305,11.152,1306,15.936,1307,15.936]],["keywords/202",[]],["title/203",[225,426.689,278,320.414,563,509.904,1308,673.714]],["content/203",[4,1.639,6,2.002,25,1.375,33,2.045,40,6.037,69,6.454,88,7.089,180,7.275,182,3.155,192,5.317,194,9.211,205,4.109,222,4.312,225,7.412,226,8.075,229,8.871,231,11.279,277,9.121,301,3.604,440,7.315,545,4.381,632,9.304,636,8.645,640,11.279,668,8.191,732,5.533,739,10.226,891,8.718,897,10.371,914,7.44,985,7.356,1114,8.075,1309,7.44,1310,9.211,1311,13.254,1312,15.815]],["keywords/203",[]],["title/204",[207,482.031,264,253.505,674,320.274,890,623.629,1313,519.794,1314,623.629,1315,550.628]],["content/204",[6,1.617,25,1.111,33,2.16,63,3.663,152,3.325,180,7.683,182,3.333,185,4.035,191,5.021,194,9.728,220,5.904,235,10.388,264,4.842,273,4.697,315,5.44,330,4.016,373,4.308,500,11.688,664,8.357,674,7.846,716,6.03,718,6.778,719,11.483,866,9.826,905,9.929,918,9.454,996,7.56,1125,11.688,1316,15.445,1317,11.688,1318,16.703,1319,16.703]],["keywords/204",[]],["title/205",[185,287.538,273,261.029,462,472.946,1320,640.194]],["content/205",[6,1.935,25,0.999,49,7.065,60,5.603,70,3.662,103,6.692,180,6.908,185,4.827,194,8.746,222,4.095,241,5.582,273,4.382,284,5.327,293,4.204,301,3.423,455,7.19,536,5.149,537,4.922,541,7.323,544,5.603,545,5.535,590,6.403,622,6.094,631,8.746,640,10.71,660,8.423,696,9.34,703,5.603,732,5.254,785,4.58,893,6.314,926,7.668,1006,9.124,1020,12.585,1321,12.585,1322,12.141,1323,11.771,1324,15.017,1325,9.71,1326,9.229,1327,8.014,1328,15.017,1329,7.615,1330,11.771]],["keywords/205",[]],["title/206",[124,445.761,181,317.157,757,769.603,786,509.904]],["content/206",[6,1.657,25,1.138,46,5.54,70,4.174,181,5.797,182,3.415,185,4.134,186,5.059,194,9.967,278,4.607,305,10.644,314,7.717,315,5.574,334,4.935,392,7.961,490,6.8,536,5.868,539,7.961,561,8.051,564,7.916,614,7.402,786,7.332,886,6.114,957,10.398,1003,13.837,1075,12.739,1126,12.739,1331,17.115,1332,9.205]],["keywords/206",[]],["title/207",[7,331.64,46,343.888,373,273.982,1333,790.76,1334,1062.382]],["content/207",[1,6.942,3,7.166,4,1.614,7,4.863,8,8.249,37,2.615,51,3.728,52,4.292,58,5.706,97,5.469,99,5.488,125,6.164,182,3.108,186,4.605,195,8.249,196,4.849,199,7.459,200,5.812,220,5.507,246,4.921,264,4.516,373,4.018,395,6.55,432,8.187,506,8.446,524,10.216,542,9.937,560,8.249,622,8.308,645,9.165,736,5.834,738,10.073,799,10.71,985,7.246,1065,9.165,1068,9.261,1077,8.818,1151,10.073,1197,10.902,1303,13.633,1323,12.212,1335,12.212]],["keywords/207",[]],["title/208",[315,387.69,550,673.714,622,483.032,785,362.986]],["content/208",[6,1.617,25,1.111,152,3.325,184,3.622,185,4.035,198,4.462,205,4.34,219,6.208,220,7.572,240,3.73,252,6.477,299,10.388,301,3.807,315,5.44,330,5.15,356,7.769,371,8.713,537,5.474,545,5.933,613,5.884,652,7.997,706,8.529,926,8.529,1024,7.858,1045,12.741,1329,8.47,1336,14.617,1337,13.998,1338,15.445,1339,7.482,1340,16.703]],["keywords/208",[]],["title/209",[25,63.794,125,379.585,241,356.567,243,441.279,315,312.447,1341,775.576]],["content/209",[22,4.302,23,4.298,24,4.617,32,3.469,34,4.845,35,2.471,37,1.447,124,6.138,151,2.659,152,1.716,161,5.836,164,4.2,167,7.124,184,1.869,185,2.082,224,2.613,225,3.089,240,2.986,241,4.971,271,3.057,275,2.87,308,2.79,330,3.216,335,9.539,347,3.964,355,5.271,520,6.054,572,3.079,630,6.791,641,6.031,735,3.88,758,3.727,764,4.711,765,4.384,767,7.641,770,4.256,771,5.359,772,3.575,773,5.271,774,4.711,775,4.126,776,6.366,777,3.84,778,6.415,780,4.564,806,6.442,886,3.079,901,3.29,910,3.468,981,4.923,1024,4.054,1157,9.743,1256,4.878,1309,6.292,1342,9.043,1343,5.123,1344,8.618,1345,5.36,1346,6.574,1347,5.36,1348,8.618,1349,8.618,1350,6.574,1351,6.415,1352,8.618,1353,11.209,1354,5.236,1355,8.618,1356,5.497,1357,8.618,1358,8.618,1359,6.574]],["keywords/209",[]],["title/210",[171,250.496,184,208.027,191,288.379,272,409.004,1360,596.617,1361,515.945]],["content/210",[4,1.377,6,1.287,22,3.488,23,3.862,25,0.884,32,2.813,34,3.043,88,4.558,164,4.174,176,4.851,193,5.326,205,4.779,220,4.699,224,4.03,240,2.968,297,3.771,330,3.196,334,3.833,385,4.869,432,6.986,438,4.978,477,12.284,478,8.267,496,5.371,515,6.564,613,4.683,660,7.456,954,6.986,991,7.327,996,6.017,1326,8.169,1343,7.901,1346,10.139,1360,8.267,1361,9.893,1362,14.419,1363,14.419,1364,13.292,1365,15.354,1366,11.632,1367,10.747,1368,11.14,1369,11.632,1370,11.14,1371,11.632,1372,11.14,1373,11.14,1374,11.632,1375,13.292,1376,12.292,1377,8.604]],["keywords/210",[]],["title/211",[105,733.699,886,483.395,1378,841.635]],["content/211",[4,1.303,22,4.643,23,4.209,24,6.107,25,1.176,28,5.437,29,7.338,32,2.66,33,1.625,34,4.051,35,3.605,37,2.11,45,3.566,68,9.298,111,4.743,184,2.726,185,3.037,198,3.358,220,4.444,224,3.811,246,3.971,271,4.459,275,4.186,314,4.459,355,4.954,572,4.49,613,4.428,630,7.525,722,6.331,758,5.437,764,6.872,765,5.798,767,7.181,770,6.208,771,7.088,772,5.214,773,6.972,775,6.019,776,8.42,777,5.602,780,6.657,965,7.818,1191,8.019,1379,12.57,1380,11.624,1381,12.57,1382,12.57]],["keywords/211",[]],["title/212",[25,89.993,437,531.112,696,841.635]],["content/212",[1,5.67,4,1.849,6,1.232,25,0.846,37,2.136,44,5.738,46,4.119,60,4.747,63,2.79,70,4.351,86,5.141,107,3.125,109,8.227,154,4.677,180,5.853,181,5.49,184,2.759,185,4.31,192,4.278,194,7.41,203,6.452,205,3.306,220,4.498,236,8.748,237,8.344,252,4.934,273,3.913,278,3.425,310,5.759,314,4.514,322,6.559,385,7.547,398,4.765,477,7.41,478,7.914,496,5.141,537,4.17,565,7.202,568,7.485,590,5.425,614,5.503,622,5.163,650,7.338,704,6.687,891,7.014,1020,10.664,1032,8.748,1065,7.485,1109,6.59,1183,7.014,1361,6.844,1378,7.914,1383,12.724,1384,8.748,1385,10.664,1386,12.724,1387,12.724,1388,8.117,1389,10.287,1390,12.724,1391,10.287,1392,10.287]],["keywords/212",[]],["title/213",[6,71.935,7,231.936,25,49.41,33,96.074,37,124.737,182,148.243,262,634.931,963,286.966]],["content/213",[]],["keywords/213",[]],["title/214",[5,256.976,6,115.243,14,447.448,262,635.181]],["content/214",[]],["keywords/214",[]],["title/215",[87,544.842,181,417.762]],["content/215",[4,2.197,5,3.549,6,2.053,33,2.126,70,4.009,79,8.705,87,5.713,181,4.38,182,4.683,185,3.971,192,5.527,199,7.871,200,6.133,202,5.057,246,5.193,262,11.314,264,4.766,314,7.521,396,5.371,438,6.156,532,9.574,561,7.734,703,6.133,704,8.64,706,8.394,907,10.103,937,7.18,999,11.967,1393,13.291,1394,13.777]],["keywords/215",[]],["title/216",[561,876.641]],["content/216",[5,3.577,6,2.063,33,2.143,63,3.634,70,4.041,87,5.758,103,7.384,182,4.252,185,4.003,222,4.518,262,8.842,392,7.707,532,9.65,543,6.136,550,9.379,561,10.026,652,7.934,664,8.29,675,7.707,711,7.032,718,6.724,785,5.053,893,6.967,904,12.062,905,9.85,910,6.667,921,8.581,963,6.4,1180,9.956,1395,12.334,1396,16.57,1397,13.397]],["keywords/216",[]],["title/217",[182,211.969,301,242.127,786,455.105,886,379.495,1398,668.979]],["content/217",[5,3.521,6,2.393,12,5.687,44,4.542,70,3.978,96,9.232,182,4.665,185,3.94,240,3.642,262,8.704,293,4.566,301,3.717,322,5.996,405,8.387,520,7.383,544,6.085,693,7.306,712,9.909,717,7.809,786,6.987,886,5.826,887,9.499,893,6.858,926,8.328,943,8.572,957,9.909,983,9.696,1204,8.387,1205,12.785,1220,9.318,1398,10.271,1399,12.785]],["keywords/217",[]],["title/218",[6,115.243,185,287.538,480,428.201,1400,667.664]],["content/218",[4,1.788,5,3.725,6,2.325,33,2.231,37,2.897,70,4.208,155,5.144,176,6.297,185,4.169,192,5.802,196,5.371,480,7.868,551,7.853,662,12.307,663,9.513,863,9.952,906,9.356,914,8.118,924,11.008,932,9.952,934,10.605,982,9.208,1016,12.844,1123,12.844,1401,12.307,1402,12.561]],["keywords/218",[]],["title/219",[18,397.612,33,153.915,185,287.538,252,461.561]],["content/219",[5,3.549,6,1.592,18,7.082,33,2.742,44,4.577,110,9.353,179,8.171,182,4.23,185,3.971,196,5.117,222,4.483,252,8.222,262,11.314,291,7.871,293,5.935,299,10.224,322,6.043,496,6.643,515,8.118,529,9.305,712,9.988,718,6.671,732,5.752,936,8.171,973,8.842,991,9.062,1017,12.236,1018,14.386,1043,11.967]],["keywords/219",[]],["title/220",[185,287.538,273,261.029,675,553.65,692,607.783]],["content/220",[6,1.604,33,2.756,103,7.384,176,6.047,182,3.306,185,4.003,240,3.7,262,8.842,273,5.166,301,4.857,334,4.778,373,4.273,381,5.347,438,6.205,532,9.65,537,5.431,543,6.136,545,4.59,664,8.29,675,7.707,692,8.461,716,5.982,904,12.062,905,9.85,910,6.667,926,8.461,1011,11.204,1012,11.392,1042,10.714,1049,10.183,1403,11.817]],["keywords/220",[]],["title/221",[6,102.858,97,372.969,180,488.703,182,211.969,185,256.637]],["content/221",[5,3.665,6,2.307,33,2.799,70,4.14,97,5.959,114,4.935,180,9.956,182,4.318,183,5.347,185,4.101,196,5.283,222,4.629,262,9.058,293,4.752,330,5.204,334,4.894,425,6.107,544,6.333,545,5.995,617,8.989,862,10.689,893,7.137,910,6.83,936,8.437,957,10.313]],["keywords/221",[]],["title/222",[7,371.572,250,635.181,255,485.12,552,625.565]],["content/222",[3,7.562,7,5.132,25,1.093,33,3.035,49,7.734,92,7.009,113,7.646,196,6.599,250,11.314,255,6.7,257,7.363,258,12.539,259,13.777,262,11.314,291,7.871,297,4.664,308,5.321,310,7.441,334,4.74,438,6.156,533,9.305,536,5.637,548,10.352,551,7.481,553,7.363,590,7.009,866,9.671,937,7.18,956,10.352,965,10.224,1013,14.386]],["keywords/222",[]],["title/223",[18,397.612,33,153.915,184,258.124,973,640.194]],["content/223",[6,1.555,18,6.976,33,3.001,114,4.668,184,5.329,219,7.762,220,7.382,262,12.384,293,4.495,307,12.044,322,8.531,440,7.428,536,5.506,550,9.089,589,11.238,613,5.657,718,6.517,866,9.447,922,12.249,931,9.546,943,8.44,982,8.57,987,10.383,1037,11.453,1164,9.869,1404,16.059]],["keywords/223",[]],["title/224",[428,843.27,512,641.789]],["content/224",[33,2.799,44,4.727,63,3.723,86,6.859,176,6.195,182,3.387,185,4.101,205,4.411,222,4.629,240,4.833,262,9.058,265,6.107,273,3.723,417,7.643,424,10.975,428,9.13,438,6.357,512,6.949,536,5.82,718,6.889,785,5.177,921,8.791,937,7.414,963,6.556,991,9.358,994,9.13,1007,8.921,1010,13.724,1011,11.478,1012,11.67]],["keywords/224",[]],["title/225",[16,449.64,33,113.071,182,174.469,417,393.72,662,623.629,663,482.031,952,494.931]],["content/225",[4,1.985,21,11.051,33,3.018,79,10.146,182,3.823,193,7.677,206,6.821,240,4.278,262,12.455,417,10.509,533,10.845,564,8.863,703,7.149,961,10.563,1405,16.768]],["keywords/225",[]],["title/226",[114,346.026,284,422.228,670,667.664,953,885.975]],["content/226",[6,2.338,25,1.021,33,2.622,182,3.062,196,4.777,205,3.988,240,3.427,255,6.256,262,12.114,265,5.522,284,8.053,293,4.297,299,9.546,330,3.69,334,5.845,347,7.061,348,8.688,417,6.911,425,5.522,544,5.727,545,5.616,553,6.875,587,9.791,636,8.391,664,7.68,701,9.546,711,8.604,732,5.37,751,9.433,953,11.425,954,8.067,1025,11.708,1406,12.032,1407,11.708]],["keywords/226",[]],["title/227",[63,296.762,301,308.418,786,579.706]],["content/227",[33,2.66,40,5.992,51,4.923,52,4.325,97,7.223,103,6.994,114,4.563,149,6.511,182,3.132,186,4.639,192,5.277,206,5.587,240,3.505,262,8.376,273,3.442,301,4.689,308,5.081,310,7.105,417,7.067,496,6.342,543,5.813,551,7.143,581,6.661,713,10.148,714,10.447,786,8.814,874,6.959,897,10.293,898,10.791,937,6.855,955,9.052,958,7.26,963,6.062,1028,9.052,1030,7.702,1408,13.736,1409,15.696]],["keywords/227",[]],["title/228",[97,475.083,958,625.942,1410,1184.242]],["content/228",[3,6.908,7,4.688,19,4.502,33,2.584,51,4.782,92,6.403,97,7.015,98,6.433,100,5.561,125,7.907,155,4.476,182,2.996,206,5.346,240,3.353,262,8.014,272,6.403,291,7.19,310,6.797,314,5.327,389,7.722,417,6.762,492,10.154,514,5.383,515,7.416,583,13.142,636,8.209,785,4.58,865,9.848,897,9.848,911,9.579,924,9.579,936,7.464,958,11.073,963,5.8,994,8.077,1029,10.931,1411,13.142,1412,13.886,1413,16.746,1414,15.017]],["keywords/228",[]],["title/229",[16,612.063,25,79.157,262,635.181,952,673.714]],["content/229",[6,1.789,7,5.769,25,1.518,33,2.952,37,3.103,182,3.687,262,13.219,293,5.173,417,8.321,437,7.253,462,7.343,514,6.625,703,6.895,872,9.308,902,10.558,952,10.46,961,10.188,990,14.487]],["keywords/229",[]],["title/230",[7,489.185,182,211.969,288,524.652,514,380.833]],["content/230",[4,1.898,7,8.051,25,1.51,110,8.081,182,3.655,196,5.702,250,9.775,255,7.466,310,8.292,364,9.932,396,5.985,514,6.567,536,6.281,614,7.923,617,9.7,937,8.001,1169,8.381,1415,18.319,1416,16.939]],["keywords/230",[]],["title/231",[152,236.98,217,425.189,414,465.275,544,444.09]],["content/231",[4,2.243,6,2.095,7,6.756,25,1.439,46,5.495,58,6.217,152,4.309,182,3.387,217,7.731,222,4.629,293,4.752,414,8.46,533,9.608,544,6.333,572,6.064,695,8.383,701,10.557,732,5.939,954,8.921,956,10.689,1037,12.106,1187,10.975,1305,11.879,1417,9.279,1418,13.306]],["keywords/231",[]],["title/232",[62,455.105,86,429.278,297,301.381,300,585.638,417,478.346]],["content/232",[25,1.148,33,2.231,86,6.973,96,9.767,97,6.058,125,6.828,182,3.443,196,5.371,262,9.208,293,4.83,297,6.204,300,13.236,304,8.692,396,5.638,401,7.729,417,7.77,525,9.069,532,10.05,548,10.866,630,6.344,703,6.438,912,9.002,937,7.537,961,9.513,1040,11.008,1419,13.163,1420,15.957]],["keywords/232",[]],["title/233",[183,334.613,273,232.977,425,382.183,544,396.364,545,294.262]],["content/233",[6,1.685,18,5.812,25,1.157,33,2.25,44,4.845,155,5.187,183,6.925,262,9.285,273,4.821,276,10.572,284,6.172,330,4.184,399,9.512,425,6.26,462,6.914,544,8.203,545,6.09,613,6.13,712,10.572,722,8.764,732,6.088,858,8.764,914,8.186,1066,9.285,1170,8.885]],["keywords/233",[]],["title/234",[183,334.613,273,232.977,514,380.833,981,606.904,982,566.919]],["content/234",[23,4.155,25,1.304,32,4.149,63,4.3,116,6.028,155,4.351,164,6.157,166,7.914,182,2.912,183,4.597,262,7.789,273,4.3,512,5.975,514,5.232,543,5.405,544,5.446,545,4.043,718,5.923,804,7.074,910,5.873,918,8.262,921,7.559,963,5.638,974,9.311,975,7.85,976,12.773,977,12.233,978,12.233,979,11.801,980,12.233,981,8.338,982,10.462,983,8.677,1046,11.801,1047,10.625,1421,12.773]],["keywords/234",[]],["title/235",[152,269.421,183,426.225,737,454.965]],["content/235",[23,3.265,25,1.111,92,7.121,152,4.265,155,4.979,164,5.245,183,6.747,196,6.667,262,8.913,284,5.925,291,7.997,297,4.738,330,5.15,438,6.255,544,6.232,545,4.626,613,5.884,659,7.683,737,7.95,910,6.721,920,8.845,972,10.953,1041,13.093,1422,11.688,1423,14.617,1424,14.617,1425,13.998]],["keywords/235",[]],["title/236",[5,292.154,152,269.421,742,612.527]],["content/236",[5,3.494,6,2.032,25,1.076,33,2.093,37,3.911,63,3.549,103,7.212,152,3.222,186,4.784,202,4.978,262,8.636,293,4.53,334,4.666,392,7.528,401,7.249,467,5.721,498,10.065,512,8.591,536,5.549,551,7.364,579,10.464,581,6.868,718,8.517,742,9.5,785,4.935,907,9.946,944,9.078,963,6.251,984,9.946,1224,9.425,1426,12.345,1427,8.636]],["keywords/236",[]],["title/237",[281,461.561,297,337.67,379,544.573,614,514.812]],["content/237",[6,2.325,18,5.764,25,1.148,46,5.586,51,4.129,65,5.656,69,5.387,70,4.208,87,5.997,155,5.144,202,5.308,225,6.186,252,6.691,281,9.31,297,4.895,379,7.895,385,6.32,396,5.638,438,6.462,536,5.917,553,7.729,613,7.704,614,7.463,985,8.026,1428,15.957]],["keywords/237",[]],["title/238",[184,230.384,220,375.547,288,524.652,394,538.737,982,566.919]],["content/238",[4,1.849,25,1.187,180,8.21,184,3.87,194,10.394,220,8.62,239,9.113,240,3.985,255,7.274,310,8.078,394,9.051,395,9.393,553,7.994,554,8.545,560,9.451,613,6.287,622,7.243,639,8.495,982,9.524,1054,12.489,1055,8.871,1065,10.5,1151,11.54]],["keywords/238",[]],["title/239",[37,178.358,125,420.379,400,478.346,639,505.648,743,743.425]],["content/239",[3,7.622,4,1.717,25,1.417,33,2.143,37,2.782,51,3.965,58,6.069,65,6.985,88,5.681,97,5.817,99,5.837,125,6.557,182,3.306,195,8.774,200,6.182,262,8.842,264,4.804,293,4.638,396,5.414,400,7.461,438,6.205,462,6.584,639,7.887,743,14.913,875,8.774,937,7.237,991,9.134,1043,12.062,1051,12.989,1052,13.397,1065,9.748,1151,10.714]],["keywords/239",[]],["title/240",[3,488.703,278,285.979,330,255.425,426,660.735,765,348.193]],["content/240",[3,7.746,5,3.635,6,2.085,25,1.12,69,5.256,155,5.019,176,7.857,205,4.375,255,6.862,278,5.796,293,4.713,330,5.177,426,10.472,438,6.306,466,8.784,541,8.211,545,4.664,550,9.53,617,8.916,765,8.199,1118,10.887,1164,13.232,1429,16.838,1430,13.613,1431,16.838]],["keywords/240",[]],["title/241",[191,471.331,879,610.406]],["content/241",[4,1.343,6,2.015,7,4.046,19,3.885,25,1.575,33,1.676,37,3.035,49,6.098,63,2.842,87,4.504,105,9.8,125,5.129,171,3.385,181,3.454,182,3.606,186,3.831,190,6.063,191,3.896,196,4.034,202,3.987,262,12.015,297,3.677,428,6.971,437,5.087,462,5.15,512,5.306,523,6.971,560,6.864,561,6.098,562,7.475,613,4.566,617,6.864,622,5.26,642,5.806,688,7.875,732,4.535,853,10.326,866,7.625,872,6.528,879,5.046,882,7.966,883,7.027,884,7.549,886,6.457,887,7.549,937,5.661,963,5.006,994,6.971,996,5.867,1000,6.971,1056,8.162,1057,10.479,1187,8.38,1418,10.16,1432,11.986,1433,11.343]],["keywords/241",[]],["title/242",[1434,1195.939,1435,1167.014]],["content/242",[]],["keywords/242",[]],["title/243",[1436,1372.068,1437,1267.615]],["content/243",[33,1.42,37,3.73,58,4.022,114,3.192,180,5.051,185,2.652,367,14.05,670,6.159,958,5.079,1438,21.919,1439,10.98,1440,10.98,1441,13.455,1442,20.086,1443,22.215,1444,10.512,1445,10.154,1446,10.154,1447,16.055,1448,10.98,1449,10.154,1450,10.98,1451,10.154,1452,10.154,1453,14.846,1454,9.609,1455,10.154,1456,8.877,1457,10.98,1458,10.98,1459,10.154,1460,10.98,1461,10.98,1462,19.308,1463,16.055,1464,14.846,1465,20.88,1466,16.171,1467,18.979,1468,10.154,1469,10.98,1470,10.98,1471,10.154,1472,10.98,1473,16.055,1474,10.98]],["keywords/243",[]],["title/244",[1436,1630.706]],["content/244",[37,1.406,51,2.004,58,8.28,99,2.951,107,3.213,114,2.435,185,3.16,200,4.88,206,2.981,264,2.428,301,1.909,367,15.919,414,3.274,480,3.013,670,10.204,1259,6.772,1441,13.489,1442,19.912,1445,22.386,1446,7.745,1449,7.745,1451,7.745,1452,7.745,1453,14.883,1454,14.085,1456,6.772,1459,12.096,1462,14.883,1464,12.096,1468,18.247,1471,14.883,1475,13.081,1476,12.096,1477,13.081,1478,8.376,1479,7.337,1480,13.081,1481,8.376,1482,8.376,1483,8.376,1484,16.095,1485,8.376,1486,13.081,1487,8.376,1488,13.081,1489,16.095,1490,8.376,1491,8.376,1492,16.095,1493,8.376,1494,8.376,1495,7.745,1496,8.376,1497,8.376,1498,8.376,1499,7.745,1500,8.376,1501,4.785,1502,8.376,1503,8.376,1504,8.376,1505,8.376,1506,8.376,1507,13.081,1508,8.376,1509,8.376,1510,13.081,1511,9.522,1512,8.376,1513,13.081,1514,8.376,1515,8.376,1516,7.745,1517,7.33,1518,7.745,1519,8.376,1520,8.376,1521,8.376,1522,7.745,1523,8.376,1524,8.376,1525,8.376,1526,4.578,1527,8.376,1528,8.376,1529,8.376,1530,8.376,1531,8.376,1532,8.376,1533,8.376]],["keywords/244",[]],["title/245",[516,806.215,1436,1372.068]],["content/245",[5,4.336,52,5.534,107,4.933,308,6.501,315,6.542,650,11.583,1441,16.832,1534,20.085,1535,20.085,1536,14.055,1537,20.085,1538,20.085,1539,20.085]],["keywords/245",[]],["title/246",[25,70.65,179,528.056,208,580.745,220,375.547,315,346.025]],["content/246",[]],["keywords/246",[]],["title/247",[25,70.65,179,528.056,186,314.016,208,580.745,555,660.735]],["content/247",[25,1.336,96,11.368,190,9.395,201,7.757,208,10.979,237,13.171,556,7.174,643,14.324,1110,11.474,1304,16.832,1305,14.055,1540,12.491,1541,15.744]],["keywords/247",[]],["title/248",[107,292.374,181,317.157,582,667.664,1300,547.547]],["content/248",[5,3.665,6,1.644,25,1.129,51,4.062,58,6.217,99,5.98,151,5.237,161,5.363,176,6.195,181,4.523,182,4.318,184,3.681,185,5.228,192,5.707,205,4.411,243,7.809,330,4.081,373,4.378,388,9.522,454,10.975,496,6.859,504,7.526,506,9.203,582,9.522,613,5.98,622,6.889,639,8.079,652,8.128,914,7.986,1189,10.557]],["keywords/248",[]],["title/249",[4,123.338,108,620.948,220,420.766,1302,1041.648]],["content/249",[6,1.944,25,1.006,33,1.956,37,2.539,45,4.291,114,4.397,184,3.28,205,3.93,206,5.384,208,8.269,220,5.347,235,12.488,236,10.399,237,9.919,239,7.724,240,4.483,241,7.463,242,8.338,260,7.834,307,8.724,308,4.896,315,4.927,330,3.637,334,4.361,372,9.78,387,8.809,397,9.649,423,9.296,504,6.706,559,9.649,668,7.834,732,5.292,914,7.116,934,9.296,985,7.036,1019,9.525,1082,10.068,1169,6.92,1542,13.237,1543,15.126,1544,15.126,1545,15.126,1546,12.677]],["keywords/249",[]],["title/250",[225,426.689,226,607.783,563,509.904,1308,673.714]],["content/250",[6,2.002,25,1.052,40,6.037,69,6.454,70,5.042,88,5.423,155,4.714,176,5.772,208,8.645,225,7.412,226,10.558,227,8.132,229,8.871,230,4.996,231,11.279,241,5.879,271,5.61,319,7.048,322,5.814,395,6.65,409,10.088,426,9.836,545,4.381,650,9.121,891,8.718,894,6.061,972,10.371,985,7.356,1310,12.042,1311,13.254,1547,10.527,1548,10.088,1549,15.815,1550,15.815,1551,12.786]],["keywords/250",[]],["title/251",[207,656.155,718,483.032,1313,707.558,1314,848.901]],["content/251",[4,1.759,6,1.644,18,5.67,25,1.439,154,6.24,179,8.437,185,5.228,208,11.831,264,4.921,273,4.746,315,5.529,373,4.378,392,7.896,661,10.828,674,8.727,718,6.889,918,9.608,1199,13.306,1314,12.106,1315,10.689,1384,11.67,1552,11.67,1553,16.975,1554,11.879,1555,16.975,1556,15.697]],["keywords/251",[]],["title/252",[202,366.157,273,261.029,703,444.09,1320,640.194]],["content/252",[5,3.521,6,1.579,25,1.085,49,7.673,60,7.87,185,3.94,192,5.484,273,5.127,284,5.786,301,3.717,322,5.996,373,4.206,414,6.376,537,5.346,538,8.107,543,6.04,563,6.987,590,6.954,622,6.619,631,9.499,703,7.87,865,10.696,876,10.144,1183,8.991,1326,10.024,1327,8.704,1329,8.271,1501,9.318,1557,14.274,1558,10.024,1559,16.311,1560,11.213,1561,16.311]],["keywords/252",[]],["title/253",[124,397.855,181,283.072,297,301.381,757,686.894,886,379.495]],["content/253",[6,1.713,25,1.177,70,4.316,107,4.347,176,6.458,181,5.921,192,5.949,208,9.673,230,5.59,264,6.442,305,11.006,334,5.102,361,9.926,388,12.464,531,9.673,561,8.325,786,9.519,993,8.524,1168,11.605,1170,9.036,1562,12.882,1563,14.831,1564,11.288]],["keywords/253",[]],["title/254",[7,331.64,8,562.569,195,562.569,738,686.894,1333,790.76]],["content/254",[1,6.284,3,6.487,4,1.461,5,3.045,6,1.365,7,4.402,21,8.133,25,0.938,37,3.216,43,11.054,51,4.584,52,3.886,58,7.016,97,4.951,99,6.748,125,5.58,182,3.822,185,3.407,199,9.171,200,5.261,264,5.553,265,5.073,297,4.001,304,7.103,310,6.383,330,3.391,373,3.637,400,6.35,504,8.492,506,10.386,519,7.585,524,9.248,664,7.056,709,8.667,952,7.982,1030,6.92,1049,8.667,1065,8.296,1084,12.341,1335,11.054,1565,13.04,1566,12.341,1567,11.054,1568,14.102,1569,14.102,1570,14.102,1571,9.535,1572,14.102]],["keywords/254",[]],["title/255",[46,438.039,315,440.762,622,549.155]],["content/255",[1,3.017,4,0.701,6,0.655,19,2.029,22,3.667,23,4.208,24,3.81,25,0.929,32,2.957,34,4.358,35,1.941,37,1.137,40,2.584,45,1.92,114,3.208,116,2.796,124,5.232,125,2.679,151,2.089,152,2.782,161,5.091,162,2.393,164,3.466,166,5.984,167,6.072,179,3.365,184,3.03,185,1.635,191,2.035,208,6.033,220,3.901,224,2.053,225,2.427,239,3.457,241,4.102,242,3.732,243,5.077,265,2.435,271,2.401,275,2.254,301,2.515,307,9.294,308,2.191,315,3.595,330,2.653,335,4.828,347,3.114,355,4.349,356,3.149,366,3.261,381,2.185,398,2.535,438,2.535,440,3.131,454,4.377,462,2.69,466,3.532,490,2.69,520,4.996,537,3.617,541,3.301,545,1.875,572,2.418,630,5.924,639,3.222,706,3.457,735,3.048,740,3.149,758,2.928,764,3.701,765,3.617,767,6.305,770,3.343,771,4.422,772,2.808,773,4.349,774,3.701,775,3.241,776,5.253,777,3.017,778,5.039,780,3.585,806,5.316,845,4.439,876,4.21,882,4.16,886,2.418,901,2.584,912,3.532,981,3.867,1024,5.192,1151,4.377,1157,8.305,1173,4.024,1176,3.867,1189,4.21,1256,3.832,1309,6.573,1329,3.433,1338,6.26,1339,4.943,1342,7.462,1343,4.024,1345,4.21,1346,5.164,1347,4.21,1350,5.164,1351,5.039,1353,5.674,1354,4.113,1444,3.203,1573,6.77,1574,6.26,1575,5.924,1576,6.77,1577,11.037,1578,6.77,1579,5.473,1580,5.039,1581,6.26]],["keywords/255",[]],["title/256",[25,70.65,179,528.056,208,580.745,886,379.495,1074,580.745]],["content/256",[]],["keywords/256",[]],["title/257",[25,104.266,29,650.349]],["content/257",[25,1.463,28,9.512,29,9.123,722,11.077]],["keywords/257",[]],["title/258",[33,202.738,198,418.827]],["content/258",[22,6.024,23,4.135,24,7.923,32,3.946,34,4.269,35,5.347,37,3.13,275,6.209,355,7.348,764,10.193,776,10.925,777,8.309,845,12.228]],["keywords/258",[]],["title/259",[224,475.386,590,668.484]],["content/259",[23,4.251,34,3.855,271,5.973,572,6.015,630,8.726,631,9.806,758,7.282,765,7.057,767,9.619,770,8.315,771,8.627,772,6.984,773,8.485,774,9.204,775,8.062,780,8.916,1356,13.734]],["keywords/259",[]],["title/260",[315,606.931]],["content/260",[4,1.745,14,8.094,15,9.806,25,1.432,33,2.177,45,4.777,60,6.282,92,7.179,162,5.952,184,4.669,185,4.067,207,9.282,208,13.676,220,8.391,241,6.259,273,3.692,314,5.973,476,10.23,563,7.213,571,11.042,637,9.619,732,5.891,1042,10.887,1169,9.851]],["keywords/260",[]],["title/261",[19,318.465,184,230.384,886,379.495,1360,660.735,1361,571.393]],["content/261",[4,1.55,6,1.737,19,2.992,22,2.619,23,4.017,25,0.995,32,2.112,34,2.285,44,4.165,88,5.129,112,6.545,162,3.528,164,3.134,171,2.606,184,3.244,185,2.411,191,3,205,3.887,224,3.026,240,4.45,252,3.87,285,6.862,297,2.831,314,3.54,315,6.954,334,2.878,347,6.882,380,7.265,385,3.656,425,3.59,467,5.288,477,11.608,478,9.304,496,4.033,504,4.425,515,4.929,564,4.617,661,6.367,712,6.064,716,5.401,735,4.494,826,5.502,882,6.134,1024,7.038,1055,4.961,1326,6.134,1343,5.933,1346,7.613,1360,9.304,1361,9.651,1362,11.726,1363,11.726,1365,13.062,1367,8.069,1368,8.365,1369,8.734,1370,8.365,1371,8.734,1372,8.365,1373,8.365,1374,8.734,1376,9.229,1377,4.669,1582,7.429,1583,7.824,1584,12.095,1585,9.229,1586,11.726,1587,9.229,1588,7.824,1589,7.429,1590,7.613]],["keywords/261",[]],["title/262",[25,89.993,190,633.003,696,841.635]],["content/262",[6,1.329,14,7.071,21,7.919,25,1.251,33,1.775,44,5.237,60,5.123,107,4.62,181,5.717,184,2.978,185,4.544,190,6.423,208,10.282,230,4.338,236,12.931,237,9.004,240,3.066,264,3.981,273,5.061,315,6.126,322,5.047,330,3.301,373,3.541,400,6.182,413,7.111,500,9.608,563,5.882,590,5.854,607,7.444,622,5.572,668,7.111,674,7.858,732,4.804,862,8.646,865,9.004,886,4.905,961,7.569,1189,8.539,1211,10.763,1315,8.646,1556,12.697,1557,12.016,1591,13.73,1592,13.73,1593,12.016,1594,13.73]],["keywords/262",[]],["title/263",[191,471.331,879,610.406]],["content/263",[6,1.773,25,1.51,33,1.708,107,4.498,155,3.937,179,6.565,181,3.519,184,2.864,185,4.424,190,6.178,208,7.22,220,4.669,222,3.602,225,6.565,226,6.744,265,4.752,273,2.896,297,3.747,301,3.01,315,5.965,398,4.946,400,5.947,410,8.54,437,5.184,523,7.104,536,4.529,537,4.329,541,6.441,553,5.916,641,9.243,648,8.317,674,4.838,718,5.36,853,7.545,872,6.653,881,9.615,883,7.161,884,7.692,893,5.554,971,7.851,993,6.362,994,7.104,996,5.978,1034,10.679,1168,8.662,1187,8.54,1302,11.559,1314,9.42,1321,11.069,1326,8.117,1327,7.048,1562,9.615,1595,8.215,1596,12.214,1597,11.559,1598,9.615,1599,13.208,1600,13.208,1601,13.208]],["keywords/263",[]],["title/264",[2,294.246,25,53.425,33,103.882,182,160.29,301,183.096,414,314.027,537,263.302,1056,505.879]],["content/264",[]],["keywords/264",[]],["title/265",[63,296.762,401,606.144,1427,722.133]],["content/265",[2,7.745,4,1.169,5,2.435,6,2.047,12,3.932,22,2.96,25,1.406,33,3.125,37,1.893,63,2.473,70,2.75,86,4.557,87,5.689,96,6.383,103,7.295,114,3.278,182,3.266,186,3.333,196,3.51,230,3.563,246,3.563,301,3.731,306,8.043,386,11.917,393,6.066,405,5.799,414,4.408,419,6.852,438,4.223,496,4.557,498,13.151,537,5.365,540,8.394,542,7.194,556,4.028,560,5.972,561,5.305,587,7.194,636,6.165,674,4.131,694,5.605,708,7.101,712,9.946,740,5.246,785,4.992,893,4.742,910,4.538,912,5.883,918,6.383,922,8.602,931,6.704,937,4.925,943,5.927,961,6.217,991,10.623,1042,7.292,1171,7.753,1207,6.504,1552,7.753,1602,6.852,1603,8.602,1604,7.292,1605,9.451,1606,7.753,1607,10.428,1608,8.84]],["keywords/265",[]],["title/266",[10,620.401,467,554.237]],["content/266",[1,8.208,2,8.636,4,1.909,6,1.783,10,8.06,21,6.016,22,4.057,23,3.472,24,5.336,25,1.028,32,2.207,34,2.388,35,2.991,37,3.825,44,2.904,51,3.699,52,2.874,63,2.287,79,5.523,85,7.446,87,3.625,100,3.863,114,3.032,149,4.327,181,2.779,182,3.675,184,2.262,185,2.52,186,3.083,192,3.507,196,4.812,198,2.786,230,3.295,273,2.287,289,4.852,293,2.92,298,5.118,301,2.377,334,3.007,355,4.11,370,9.735,371,5.441,378,6.267,399,5.702,401,4.672,408,5.115,427,3.834,438,3.906,512,4.27,536,5.301,551,4.746,637,5.959,676,7.593,732,3.649,777,4.648,785,3.181,786,4.468,874,4.624,875,5.523,1058,5.402,1109,5.402,1110,5.959,1169,4.772,1427,5.566,1558,6.41,1609,8.433,1610,6.487,1611,7.764,1612,11.507,1613,5.799,1614,5.326,1615,9.645]],["keywords/266",[]],["title/267",[4,140.222,25,89.993,67,544.489]],["content/267",[2,5.69,4,1.298,6,1.213,10,3.138,21,4.573,25,0.833,33,1.025,37,1.331,63,2.748,67,5.042,69,3.912,70,3.789,97,5.454,113,3.688,152,3.827,155,3.735,182,3.835,186,5.682,191,2.384,196,3.9,205,2.06,265,4.508,271,2.813,278,3.373,293,4.941,301,5.61,304,3.994,306,12.589,322,2.915,330,3.013,356,3.688,386,5.772,395,3.334,396,2.591,414,3.099,428,6.739,462,3.151,467,2.803,498,4.932,519,4.265,531,4.334,533,4.488,537,8.068,542,7.993,554,3.796,560,6.635,562,4.573,565,9.991,613,5.473,617,4.199,622,7.163,632,7.371,639,3.774,712,4.817,717,3.796,785,2.418,892,4.873,893,3.334,899,5.772,910,5.042,923,5.2,937,3.463,961,4.371,988,5.655,1006,4.817,1038,4.932,1050,5.655,1056,4.993,1065,4.665,1070,6.939,1115,5.772,1118,5.127,1158,10.848,1159,6.645,1174,4.817,1180,4.764,1194,5.772,1207,4.573,1228,5.655,1232,6.411,1427,6.687,1605,6.645,1616,6.939,1617,8.104,1618,11.587,1619,6.939,1620,12.56,1621,6.939,1622,6.645,1623,5.361,1624,6.939]],["keywords/267",[]],["title/268",[25,63.794,33,124.043,37,161.05,264,278.105,875,507.977,877,533.369]],["content/268",[]],["keywords/268",[]],["title/269",[264,392.317,875,716.592,877,752.413]],["content/269",[4,1.59,7,4.791,23,2.339,58,7.426,70,3.743,108,8.007,175,9.546,176,5.601,182,3.062,195,10.736,196,6.31,200,9.009,248,10.992,264,6.581,293,4.297,401,6.875,554,7.349,567,10.066,580,7.061,614,6.639,637,8.768,738,9.924,799,10.552,875,8.128,877,11.272,892,9.433,893,6.454,963,5.928,985,7.139,1014,13.432,1625,12.41,1626,14.193,1627,15.349,1628,9.03,1629,12.032]],["keywords/269",[]],["title/270",[5,229.359,6,102.858,264,307.993,273,232.977,877,590.69]],["content/270",[5,4.697,6,2.106,44,4.765,70,5.306,113,7.961,176,6.246,181,4.56,182,3.415,252,6.636,264,6.307,273,3.753,293,4.791,375,8.928,382,8.8,705,9.967,785,5.219,875,9.063,894,6.558,910,6.886,920,9.063,924,10.917,963,6.61,1016,12.739,1191,10.917,1403,12.206,1630,14.977,1631,9.687]],["keywords/270",[]],["title/271",[25,58.151,33,113.071,205,227.2,206,311.265,264,253.505,877,486.189,1066,466.623]],["content/271",[6,1.604,25,1.417,33,2.143,44,4.614,63,3.634,105,8.984,182,3.306,186,4.898,202,6.556,205,5.537,206,7.586,252,6.425,264,6.178,334,4.778,414,6.477,437,6.503,462,6.584,474,9.556,531,9.058,536,5.681,555,10.306,556,5.919,875,8.774,877,9.213,902,9.466,903,13.397,952,9.379,990,12.989,1150,12.989,1194,12.062]],["keywords/271",[]],["title/272",[25,89.993,886,483.395,1074,739.744]],["content/272",[]],["keywords/272",[]],["title/273",[25,123.921]],["content/273",[5,3.725,6,1.671,9,7.895,12,6.017,25,1.454,33,2.231,107,4.239,122,7.574,151,5.324,155,5.144,176,6.297,181,4.598,185,4.169,192,5.802,264,5.003,314,6.121,392,8.026,414,6.745,710,14.462,718,7.003,732,6.037,785,5.262,910,6.943,914,8.118,1077,9.767,1185,13.952,1403,12.307,1632,12.075,1633,9.858]],["keywords/273",[]],["title/274",[107,332.397,185,326.9,732,473.461]],["content/274",[5,3.549,6,2.272,25,1.41,70,4.009,87,5.713,107,4.038,151,5.072,155,4.9,181,4.38,182,3.28,185,5.122,264,4.766,278,4.425,288,8.118,293,4.602,314,7.521,330,3.952,385,6.021,396,5.371,553,7.363,613,5.791,704,8.64,707,11.115,732,5.752,875,8.705,1004,13.777,1118,10.629,1148,11.504,1187,10.629,1634,11.724,1635,15.201]],["keywords/274",[]],["title/275",[183,493.826,273,343.83]],["content/275",[6,1.657,33,2.813,40,6.533,70,5.306,183,6.852,198,4.572,202,5.265,219,6.361,246,5.407,273,3.753,276,10.398,291,8.194,301,3.901,315,5.574,330,4.115,348,9.687,396,5.592,537,5.609,545,4.74,622,8.829,740,7.961,920,11.521,1078,13.837,1080,13.416,1632,11.976,1636,11.976]],["keywords/275",[]],["title/276",[273,296.762,414,528.967,1329,686.235]],["content/276",[6,2.166,23,3.79,32,3.155,33,1.928,34,3.414,63,3.27,216,13.787,273,4.907,334,4.299,385,5.461,414,7.773,462,5.924,474,8.599,532,8.683,622,6.05,639,7.096,695,7.363,804,7.226,805,9.777,865,9.777,899,10.853,926,7.613,931,8.863,945,11.687,991,8.219,1021,8.019,1056,9.389,1257,6.821,1325,9.64,1329,10.085,1444,7.055,1604,9.64,1632,13.916,1637,12.495,1638,11.687,1639,13.787,1640,14.91,1641,10.853]],["keywords/276",[]],["title/277",[63,261.029,183,374.904,555,740.294,981,679.981]],["content/277",[6,1.644,12,5.919,25,1.129,63,3.723,70,4.14,154,6.24,183,5.347,264,4.921,276,10.313,279,10.091,293,4.752,330,5.204,381,5.478,513,10.091,514,6.085,525,8.921,544,6.333,581,7.204,890,12.106,893,7.137,963,6.556,981,12.364,994,9.13,1031,12.357,1066,9.058,1325,10.975,1632,11.879,1642,16.975,1643,13.724,1644,15.697]],["keywords/277",[]],["title/278",[33,89.358,62,296.033,86,279.233,100,255.91,182,137.88,205,179.552,206,245.987,414,270.123,952,391.135,1021,371.675]],["content/278",[25,1.462,33,2.25,79,9.214,96,9.849,100,6.444,182,3.472,196,5.416,205,4.521,206,6.194,264,5.045,272,7.419,389,8.947,414,8.594,437,6.829,467,6.151,556,6.216,696,10.822,875,9.214,877,9.675,902,9.94,903,14.068,952,9.849,991,9.592,999,12.666,1110,9.94,1399,13.64,1645,16.09]],["keywords/278",[]],["title/279",[114,346.026,152,236.98,184,258.124,552,625.565]],["content/279",[6,2.305,12,5.162,25,0.984,33,2.559,37,2.485,100,5.482,114,4.304,152,4.439,155,4.413,176,5.402,184,4.292,205,3.846,219,5.503,240,3.305,310,6.701,322,5.442,385,5.422,414,5.787,560,7.839,613,6.972,732,5.179,862,9.322,906,8.026,914,6.964,931,8.8,954,7.78,968,11.604,973,7.962,985,6.886,986,10.177,1021,7.962,1025,11.292,1113,10.776,1172,10.558,1418,11.604,1632,10.359,1646,9.853,1647,14.804,1648,10.359,1649,11.604,1650,8.8,1651,8.538]],["keywords/279",[]],["title/280",[181,417.762,265,564.031]],["content/280",[6,1.881,25,1.292,70,4.737,107,3.536,151,5.992,155,4.291,176,5.253,181,5.175,182,2.872,185,3.477,192,6.53,202,4.428,205,3.74,206,5.124,240,3.214,246,4.547,264,5.631,265,5.178,278,3.875,297,4.084,314,6.89,385,5.272,392,6.695,414,5.627,438,5.391,542,9.182,553,6.448,554,6.892,561,6.772,582,8.074,590,6.137,613,5.071,704,7.565,707,9.733,732,5.036,875,7.622,877,8.003,893,6.052,914,6.772,961,7.935,1031,10.478,1165,9.44,1238,10.073,1403,10.266,1652,12.597,1653,12.597]],["keywords/280",[]],["title/281",[62,509.904,297,337.67,300,656.155,414,465.275]],["content/281",[6,1.475,7,4.756,21,8.787,25,1.342,33,2.609,86,6.157,100,5.643,125,6.029,186,4.504,196,6.28,255,6.21,300,11.122,301,3.473,414,7.886,417,6.861,512,6.237,525,8.008,533,11.419,536,5.224,543,5.643,548,9.595,552,8.008,590,6.496,598,10.302,630,8.315,639,7.252,673,7.949,695,7.525,705,8.874,718,6.183,893,6.407,966,12.77,991,8.399,1025,11.622,1040,9.719,1654,15.237,1655,14.09,1656,10.142]],["keywords/281",[]],["title/282",[152,211.512,414,415.272,435,486.049,552,558.336,765,348.193]],["content/282",[6,1.464,25,1.006,33,2.914,44,4.212,86,6.112,96,8.561,100,5.602,113,7.036,152,3.012,182,3.018,186,4.471,196,4.708,222,4.125,252,5.865,272,6.449,301,3.447,322,5.56,330,4.827,385,5.54,414,7.848,435,6.92,552,7.95,639,7.199,695,9.916,765,6.581,860,9.19,931,8.992,1016,11.259,1021,8.136,1108,10.227,1112,8.992,1164,9.296,1197,10.585,1264,11.259,1547,10.068,1616,13.237,1632,10.585,1651,8.724,1657,15.126,1658,15.126,1659,13.237]],["keywords/282",[]],["title/283",[63,343.83,555,975.122]],["content/283",[6,2.143,25,0.971,37,2.451,60,5.446,63,4.3,70,3.56,149,6.054,155,4.351,192,4.907,217,5.214,265,5.251,273,3.201,301,4.468,330,4.714,356,6.789,393,7.85,438,5.466,525,7.671,537,4.784,540,10.864,545,4.043,550,8.262,553,6.538,556,5.214,563,6.253,579,9.437,622,7.956,660,8.187,680,12.773,688,8.868,742,6.607,892,8.97,893,6.137,910,5.873,921,7.559,926,7.453,961,8.046,963,5.638,981,8.338,986,10.035,1045,11.134,1049,8.97,1053,11.442,1118,9.437,1660,14.596,1661,14.596]],["keywords/283",[]],["title/284",[4,110.083,25,70.65,264,307.993,875,562.569,877,590.69]],["content/284",[4,1.849,6,1.728,7,5.571,25,1.187,37,2.996,96,10.102,171,4.661,191,6.716,250,9.524,252,6.921,255,7.274,264,5.174,311,7.646,329,7.953,467,6.309,548,11.239,622,7.243,872,8.989,875,9.451,877,9.923,888,9.311,902,10.196,963,6.893,1610,11.1,1662,13.99]],["keywords/284",[]],["title/285",[25,104.266,1663,871.749]],["content/285",[6,1.543,12,7.245,21,9.191,25,1.629,28,6.892,29,6.61,33,2.061,44,4.437,49,7.497,110,7.03,113,7.412,190,7.454,251,8.861,252,6.18,264,4.62,265,5.733,323,8.785,427,5.858,529,9.02,617,8.439,875,8.439,877,8.861,879,6.204,883,8.64,886,7.423,887,9.281,894,6.107,992,11.365,998,11.365,1074,8.711,1075,11.862,1632,11.152,1663,8.861,1664,15.936,1665,14.736]],["keywords/285",[]],["title/286",[4,99.401,25,63.794,99,337.935,250,511.905,257,429.683,258,731.722]],["content/286",[3,7.22,6,1.52,7,4.9,25,1.368,83,11.426,97,5.51,99,5.529,155,4.679,196,4.885,202,4.828,250,10.979,252,6.086,255,6.397,257,7.031,258,11.973,264,4.55,265,5.647,291,7.515,304,7.906,394,10.433,396,5.128,401,7.031,410,10.148,438,5.878,462,6.237,536,5.382,553,7.031,554,7.515,622,6.37,749,13.154,875,8.312,877,8.727,937,6.855,965,9.762,1065,9.234,1080,12.304,1151,10.148,1666,14.514,1667,13.154]],["keywords/286",[]],["title/287",[25,79.157,65,390.118,400,535.943,408,393.825]],["content/287",[2,5.253,4,1.486,6,2.208,10,3.735,25,0.954,33,1.22,37,3.684,51,3.432,52,2.601,58,3.457,63,2.07,67,3.797,85,4.546,87,3.28,97,5.035,98,4.043,100,6.424,114,2.744,171,2.465,175,5.87,176,3.444,182,2.862,191,2.837,199,4.519,227,4.853,232,5.61,241,3.508,252,3.66,256,4.44,264,2.736,275,4.775,278,2.541,291,4.519,293,4.015,297,2.677,334,4.135,381,3.046,395,3.968,400,7.81,408,8.12,421,4.888,437,3.704,438,3.535,467,5.07,474,5.443,519,7.714,527,4.853,531,5.159,532,5.497,536,5.948,539,4.39,543,3.495,559,9.148,560,4.998,561,4.44,564,4.366,567,6.189,639,4.492,676,6.87,703,3.521,705,5.497,736,3.535,740,4.39,785,2.878,872,4.754,874,4.184,875,4.998,877,5.248,898,6.489,902,5.392,925,7.91,937,4.122,942,5.671,963,3.645,1030,4.631,1034,7.631,1038,5.87,1050,6.731,1109,4.888,1150,7.398,1295,7.398,1406,7.398,1632,6.605,1662,7.398,1668,7.398,1669,9.438,1670,8.259,1671,7.631,1672,7.631,1673,9.438,1674,9.438,1675,9.438]],["keywords/287",[]],["title/288",[6,92.877,25,63.794,184,208.027,205,249.247,219,356.567,240,214.197]],["content/288",[6,2.289,21,9.633,25,1.111,155,6.385,176,6.095,182,3.333,184,4.645,191,5.021,195,8.845,196,5.199,205,5.566,219,7.962,228,7.295,240,4.783,256,7.858,293,4.676,315,5.44,554,7.997,617,8.845,901,6.376,914,7.858,963,6.451,985,7.769,987,10.799,996,7.56,1174,10.148,1676,15.445]],["keywords/288",[]],["title/289",[25,89.993,184,293.46,982,722.133]],["content/289",[6,2.304,25,1.233,33,1.528,44,2.052,66,5.364,69,2.3,70,1.797,87,2.561,97,2.587,155,3.523,176,5.401,182,2.953,184,5.315,192,2.477,205,3.845,207,6.515,208,9.257,219,6.294,225,2.641,226,3.762,228,3.218,235,4.583,239,9.466,240,3.781,252,2.857,255,4.817,264,2.136,265,2.651,278,1.983,288,3.639,293,2.063,297,2.09,301,1.679,310,3.335,314,5.25,319,3.283,322,2.709,330,1.772,348,4.171,385,2.699,392,6.884,396,2.407,413,3.816,414,4.62,426,4.583,427,2.709,432,6.212,438,2.759,462,5.88,466,3.844,473,5.484,477,6.884,478,4.583,496,4.776,533,4.171,536,2.526,537,2.415,543,2.729,545,3.274,553,3.3,564,5.467,565,6.69,613,6.531,622,6.872,640,5.255,663,4.062,703,2.749,705,4.291,716,2.66,732,2.578,894,2.824,901,2.813,906,6.408,910,2.965,936,3.662,961,4.062,963,2.846,982,7.897,985,3.427,987,4.764,996,3.335,1030,3.616,1046,5.957,1047,5.364,1056,4.64,1066,3.932,1079,5.62,1087,6.448,1117,5.957,1118,4.764,1164,4.528,1165,4.832,1177,4.528,1195,6.448,1227,4.832,1297,10.006,1304,6.175,1360,7.351,1361,7.96,1399,5.776,1557,6.448,1583,5.776,1590,5.62,1624,6.448,1677,6.448,1678,6.814,1679,6.814,1680,7.368,1681,6.814,1682,7.368,1683,6.814,1684,6.175,1685,6.448]],["keywords/289",[]],["title/290",[25,70.65,37,178.358,179,528.056,877,590.69,932,483.439]],["content/290",[6,2.186,25,1.502,37,3.049,179,9.026,182,3.623,293,5.083,389,9.337,401,8.134,437,7.127,462,7.215,515,8.968,560,9.616,863,10.473,877,10.096,902,10.374,903,14.681,932,10.276,991,10.01,1194,13.218,1686,13.218,1687,14.681]],["keywords/290",[]],["title/291",[25,79.157,45,337.67,176,434.385,480,428.201]],["content/291",[5,3.151,6,2.143,9,6.678,25,1.304,33,1.887,45,4.141,103,6.504,155,4.351,176,7.155,182,2.912,192,4.907,200,5.446,222,3.98,291,6.989,308,4.725,373,3.764,385,5.346,400,6.572,480,7.964,487,9.191,536,5.005,556,5.214,569,7.163,659,6.714,863,8.418,897,9.572,906,10.63,914,6.867,924,9.311,931,8.677,932,8.922,933,11.442,934,8.97,1121,12.676,1140,10.864,1262,8.97,1384,10.035,1402,10.625,1632,10.214,1688,13.497,1689,14.596,1690,10.41,1691,12.773]],["keywords/291",[]],["title/292",[46,507.514,181,417.762]],["content/292",[5,3.389,6,1.992,25,1.044,70,5.018,87,5.454,151,6.347,155,4.679,181,5.482,182,3.132,185,3.792,192,6.917,202,4.828,264,4.55,265,5.647,314,5.568,361,8.804,385,5.749,396,5.128,438,5.878,447,10.012,480,5.647,553,7.031,704,8.249,706,8.015,717,7.515,785,4.787,892,9.646,893,6.6,910,6.315,914,7.384,932,9.362,961,8.652,1004,13.154,1123,11.683,1632,10.984,1652,13.736]],["keywords/292",[]],["title/293",[184,258.124,220,420.766,421,616.449,1663,661.815]],["content/293",[6,2.358,12,5.473,25,1.368,33,2.03,155,6.133,182,3.132,184,4.462,185,3.792,191,4.719,196,4.885,205,4.078,206,5.587,219,7.647,220,7.273,240,3.505,255,6.397,265,5.647,323,8.652,427,5.77,478,9.762,480,5.647,525,8.249,529,8.884,556,5.607,613,5.529,914,7.384,932,7.143,956,9.884,973,8.442,985,7.301,1080,12.304,1142,11.426,1174,9.536,1663,8.727]],["keywords/293",[]],["title/294",[5,229.359,6,102.858,205,276.033,206,378.168,742,480.872]],["content/294",[5,3.665,6,2.307,9,7.766,25,1.129,37,2.85,63,3.723,155,5.06,176,6.195,181,4.523,192,5.707,264,6.274,265,6.107,334,4.894,512,6.949,515,8.383,536,5.82,718,6.889,742,10.785,910,6.83,914,7.986,932,7.725,963,8.359,984,10.432,1050,12.106,1403,12.106,1606,11.67]],["keywords/294",[]],["title/295",[437,531.112,950,900.729,1314,965.11]],["content/295",[6,1.543,25,1.538,37,2.675,44,4.437,70,3.886,86,6.439,186,4.71,196,4.96,201,6.155,202,6.392,222,4.345,252,6.18,271,5.653,293,4.461,385,5.837,401,7.138,437,6.255,467,5.633,515,7.87,536,5.464,541,7.771,607,8.64,932,11.15,950,10.607,1019,10.035,1070,13.946,1314,11.365,1433,13.946,1622,13.356,1692,14.736,1693,15.936,1694,11.152,1695,13.946,1696,15.936]],["keywords/295",[]],["title/296",[191,471.331,879,610.406]],["content/296",[19,6.139,25,1.722,398,9.098,877,11.387,1158,12.586,1697,11.591,1698,20.48,1699,20.48]],["keywords/296",[]],["title/297",[37,178.358,52,292.723,703,396.364,958,491.403,1466,773.343]],["content/297",[]],["keywords/297",[]],["title/298",[37,227.19,52,372.867,703,504.882]],["content/298",[4,1.651,37,2.675,44,4.436,51,4.514,54,4.722,66,11.598,70,4.601,113,5.054,114,3.159,171,2.837,175,6.758,176,3.965,199,5.202,200,4.054,222,2.963,252,4.213,287,5.401,310,4.918,348,9.018,396,5.205,433,7.91,486,6.459,498,11.732,514,3.895,524,7.125,581,4.611,607,5.891,636,5.94,660,6.095,664,5.436,694,5.401,703,4.054,732,3.802,870,8.517,894,4.164,943,5.711,944,8.937,956,6.842,994,5.844,1058,5.627,1081,9.791,1148,7.604,1298,6.529,1320,5.844,1687,8.785,1700,10.866,1701,10.866,1702,10.866,1703,7.91,1704,11.879,1705,8.785,1706,10.448,1707,11.363,1708,10.953,1709,14.733,1710,8.288,1711,7.125,1712,11.149,1713,5.891,1714,10.048,1715,10.866,1716,7.749,1717,10.866,1718,7.91,1719,8.517,1720,9.509,1721,9.106,1722,7.91,1723,13.352,1724,7.025,1725,10.866,1726,5.844,1727,9.509,1728,8.088,1729,8.288,1730,10.048,1731,9.106,1732,9.509,1733,9.509]],["keywords/298",[]],["title/299",[51,284.834,52,327.97,92,507.5,703,444.09]],["content/299",[4,0.748,6,1.125,37,1.951,51,3.492,52,4.021,65,3.809,66,5.252,68,3.792,70,2.834,76,4.289,86,2.915,88,2.474,106,4.96,108,3.764,113,3.356,114,2.097,134,4.084,175,12.82,176,4.241,189,5.934,191,2.169,195,3.821,196,2.246,199,3.455,219,2.682,222,3.979,256,3.394,271,6.506,275,3.87,287,5.776,330,1.735,334,2.08,359,5.252,371,3.764,396,2.357,402,4.161,427,2.652,432,3.792,493,11.408,498,4.487,524,10.971,567,4.732,581,3.062,586,5.37,607,7.911,636,3.944,639,3.434,650,4.161,668,3.737,688,4.384,692,5.934,703,6.843,732,5.105,775,3.455,786,3.091,860,4.384,870,5.656,879,2.809,898,4.96,918,6.578,939,5.833,943,3.792,944,8.185,955,4.161,956,4.543,958,3.337,1090,5.504,1128,5.252,1178,4.878,1192,4.487,1199,5.656,1254,4.878,1294,6.047,1300,5.346,1320,6.251,1323,5.656,1631,6.578,1651,4.161,1663,4.012,1703,13.352,1704,4.543,1706,7.621,1707,10.407,1708,11.502,1713,6.301,1718,5.252,1721,9.74,1722,12.178,1723,14.021,1724,7.514,1727,6.314,1728,5.37,1729,5.504,1734,6.672,1735,6.672,1736,7.215,1737,6.314,1738,6.672,1739,7.215,1740,7.215,1741,12.229,1742,7.215,1743,5.504,1744,16.961,1745,6.672,1746,5.656,1747,4.878,1748,6.672,1749,5.504,1750,7.215,1751,5.146,1752,6.672,1753,7.215,1754,7.215,1755,5.504,1756,11.622,1757,6.314,1758,7.215,1759,7.215,1760,7.215,1761,6.672,1762,6.672,1763,6.314,1764,7.215,1765,4.603,1766,4.802]],["keywords/299",[]],["title/300",[52,327.97,581,505.129,993,573.347,1268,616.449]],["content/300",[3,5.548,4,2.074,6,1.168,10,6.798,23,3.05,32,4.235,34,2.761,37,3.87,51,4.111,68,6.339,70,2.941,176,4.402,228,5.268,246,3.81,256,5.674,264,4.981,278,3.247,287,5.995,293,3.376,298,5.918,308,3.904,310,5.459,373,3.11,402,6.956,425,4.339,551,5.488,692,6.159,703,4.5,711,8.493,868,10.108,896,10.108,901,4.604,944,12.233,1032,8.292,1298,7.247,1393,9.751,1540,7.501,1656,8.028,1703,8.78,1710,13.105,1719,9.454,1752,11.153,1767,10.108,1768,15.887,1769,10.108,1770,17.181,1771,10.555,1772,17.181,1773,12.061,1774,17.181,1775,12.061,1776,17.181,1777,12.061,1778,12.061,1779,8.292,1780,12.061,1781,12.061,1782,8.602]],["keywords/300",[]],["title/301",[20,533.158,52,327.97,1703,866.461,1733,1041.648]],["content/301",[3,5.646,6,1.684,20,7.792,37,3.69,64,8.299,65,4.023,85,5.912,106,8.438,148,7.079,152,2.444,171,3.205,191,3.69,196,3.82,197,8.754,203,6.224,230,3.878,264,3.558,278,3.304,301,2.797,304,8.762,373,3.165,402,7.079,537,5.701,539,5.709,543,4.545,581,7.382,692,8.882,693,5.498,703,6.49,708,7.729,718,4.981,740,5.709,787,5.948,792,7.079,858,6.182,861,8.091,891,6.766,894,4.704,924,7.83,944,6.885,972,8.049,1035,7.457,1165,8.049,1166,8.049,1264,9.136,1377,5.741,1466,8.935,1610,7.634,1620,9.924,1703,12.663,1706,8.049,1707,8.754,1726,6.602,1727,10.741,1771,10.741,1783,8.438,1784,10.741,1785,11.35,1786,13.636,1787,9.621,1788,12.274,1789,12.274,1790,12.274,1791,12.274,1792,8.438,1793,10.741]],["keywords/301",[]],["title/302",[278,320.414,457,804.809,703,444.09,1377,556.783]],["content/302",[5,3.184,6,1.911,23,4.033,32,3.121,34,3.377,35,2.808,40,3.738,49,4.607,51,2.343,52,2.698,70,3.597,116,6.09,121,5.884,152,1.95,176,3.574,181,2.609,230,5.604,264,4.276,278,3.97,395,4.118,398,3.667,402,5.648,463,6.984,467,3.462,468,6.747,493,6.091,494,7.47,499,5.147,515,4.836,544,3.654,607,7.996,636,5.353,700,7.289,711,4.156,718,3.974,727,6.853,732,3.426,745,5.353,785,2.986,907,6.018,944,8.272,955,5.648,1156,7.47,1194,7.129,1238,6.853,1356,6.247,1377,10.41,1628,5.761,1656,6.518,1697,8.347,1703,12.913,1719,7.676,1722,10.736,1765,6.247,1779,6.733,1782,6.984,1793,8.57,1794,9.056,1795,9.793,1796,5.95,1797,13.638,1798,8.207,1799,8.57,1800,9.793,1801,9.793,1802,9.793,1803,7.289,1804,9.056,1805,9.793,1806,9.793,1807,9.793,1808,9.793,1809,9.793,1810,9.793,1811,7.129,1812,9.793,1813,9.793,1814,6.167,1815,9.793,1816,9.793,1817,9.793,1818,9.793]],["keywords/302",[]],["title/303",[37,178.358,703,396.364,958,491.403,1794,982.391,1819,982.391]],["content/303",[4,1.395,5,3.557,6,2.056,19,2.605,23,4.033,25,0.578,32,2.849,35,2.492,37,1.459,44,3.748,69,2.713,87,3.02,110,3.833,152,2.68,171,2.269,181,2.315,192,2.922,217,3.104,222,2.37,264,2.519,287,6.691,297,2.465,308,2.813,319,3.872,322,3.195,356,4.042,396,2.839,413,8.533,433,6.326,468,3.976,493,5.405,533,4.919,551,3.954,556,4.809,563,3.723,572,3.104,614,3.758,636,4.75,683,9.42,693,3.892,703,3.242,736,5.041,737,2.922,742,9.087,757,8.704,864,5.699,901,3.317,950,5.784,996,3.933,1000,4.674,1042,5.619,1066,4.637,1147,4.79,1160,4.407,1183,4.79,1300,6.192,1384,5.974,1392,7.026,1558,5.341,1562,6.326,1819,8.036,1820,8.69,1821,5.784,1822,6.468,1823,6.812,1824,8.69,1825,7.026,1826,6.629,1827,4.874,1828,8.036,1829,7.605,1830,12.448,1831,7.283,1832,12.448,1833,8.036,1834,12.448,1835,12.448,1836,12.448,1837,12.448,1838,8.036,1839,8.036,1840,8.036,1841,12.448,1842,12.448,1843,5.543,1844,7.605,1845,7.283,1846,6.326,1847,6.468,1848,6.812,1849,8.69,1850,6.198,1851,8.69,1852,7.283,1853,8.036,1854,8.69,1855,8.69,1856,6.326,1857,8.69,1858,6.812]],["keywords/303",[]],["title/304",[52,292.723,572,379.495,736,397.855,958,491.403,1466,773.343]],["content/304",[2,8.167,5,3.196,7,4.621,20,6.631,37,2.485,51,4.736,52,5.453,144,9.098,198,3.955,230,4.677,246,4.677,364,8.026,398,5.544,409,9.443,458,6.886,463,10.558,498,9.207,572,7.965,693,9.987,736,5.544,855,8.8,861,6.886,865,9.708,870,11.604,893,6.224,968,11.604,984,9.098,1147,8.161,1179,12.955,1322,11.969,1407,11.292,1703,14.407,1826,11.292,1848,11.604,1856,10.776,1859,12.955,1860,11.292,1861,13.689,1862,12.955,1863,11.604,1864,14.804]],["keywords/304",[]],["title/305",[5,229.359,6,102.858,52,292.723,301,242.127,703,396.364]],["content/305",[6,2.341,10,5.433,37,2.305,44,3.823,52,3.783,70,4.587,134,7.771,181,3.658,185,3.317,272,5.854,278,3.696,287,6.825,301,3.129,329,6.118,373,3.541,452,6.351,453,12.016,468,8.605,484,7.702,561,6.459,567,9.004,636,7.506,664,6.87,683,9.608,693,6.15,703,5.123,711,5.827,809,6.781,876,8.539,914,6.459,943,7.216,944,7.702,1030,6.738,1109,9.741,1165,9.004,1656,9.139,1704,8.646,1708,12.931,1728,10.22,1751,9.792,1757,12.016,1826,10.473,1858,10.763,1865,12.697,1866,13.73,1867,13.73,1868,12.697,1869,10.22,1870,12.697,1871,11.101,1872,7.385,1873,13.73,1874,11.101]],["keywords/305",[]],["title/306",[191,471.331,879,610.406]],["content/306",[3,7.387,5,3.467,6,1.555,25,1.068,37,2.696,44,4.472,52,5.754,181,4.279,203,8.144,222,4.379,225,5.757,226,8.2,252,6.227,278,4.323,310,7.269,432,8.44,523,8.637,529,9.089,581,6.815,693,7.193,703,5.991,742,7.269,806,7.735,857,8.258,869,10.531,872,8.089,882,9.869,883,8.707,894,6.154,958,7.428,993,7.735,996,7.269,1326,9.869,1377,7.512,1466,11.69,1703,11.69,1875,14.053,1876,14.85]],["keywords/306",[]],["title/307",[23,122.44,25,53.425,37,134.874,185,194.068,315,261.663,480,289.005,742,363.633,877,446.678]],["content/307",[]],["keywords/307",[]],["title/308",[25,89.993,37,227.19,877,752.413]],["content/308",[]],["keywords/308",[]],["title/309",[37,178.358,181,283.072,414,415.272,1168,696.684,1300,488.703]],["content/309",[5,3.549,6,1.592,25,1.41,44,4.577,125,6.505,151,5.072,176,5.999,181,4.38,182,3.28,185,3.971,199,7.871,220,5.811,256,7.734,264,4.766,314,5.831,330,3.952,334,4.74,373,4.24,385,6.021,391,8.28,392,9.862,425,5.914,532,9.574,539,7.646,553,7.363,613,5.791,704,8.64,706,8.394,877,9.14,924,10.486,1079,12.539,1179,14.386,1332,8.842,1384,11.302]],["keywords/309",[]],["title/310",[108,705.951,462,537.688,480,486.819]],["content/310",[6,2.379,25,1.389,37,2.696,45,4.556,70,3.916,87,5.581,113,7.47,171,4.193,176,7.621,192,5.399,201,6.203,255,6.545,278,4.323,307,9.262,467,5.677,480,8.349,614,6.946,698,10.383,727,11.238,737,5.399,863,9.262,877,8.929,906,8.707,932,9.503,933,12.588,1190,12.588,1877,16.059,1878,16.059,1879,16.059,1880,16.059,1881,16.059]],["keywords/310",[]],["title/311",[6,115.243,614,514.812,742,538.773,1308,673.714]],["content/311",[2,6.427,5,3.788,6,1.699,63,3.848,136,10.12,152,3.493,176,8.066,202,5.398,315,5.715,391,8.838,392,8.162,393,9.438,498,10.913,512,7.183,556,6.268,622,7.121,693,7.86,718,7.121,742,7.942,918,9.932,921,9.087,958,8.116,984,10.784,1398,11.049,1784,15.356,1882,17.547,1883,17.547]],["keywords/311",[]],["title/312",[23,133.27,225,313.459,278,235.386,301,199.292,315,284.809,537,286.593,1313,519.794]],["content/312",[9,7.521,25,1.41,70,5.171,151,5.072,181,4.38,184,3.565,208,8.986,220,5.811,225,5.893,239,8.394,241,6.11,242,9.062,264,4.766,278,4.425,297,4.664,301,3.747,307,9.481,315,5.354,466,8.576,467,5.811,515,8.118,537,5.388,545,4.553,563,7.042,582,9.221,632,9.671,877,9.14,893,6.912,955,9.481,1006,9.988,1782,11.724,1884,16.439,1885,13.777,1886,15.201]],["keywords/312",[]],["title/313",[421,616.449,1187,769.603,1320,640.194,1747,804.809]],["content/313",[4,1.882,25,1.208,37,3.049,97,6.375,107,4.46,111,6.852,181,4.838,202,5.586,220,6.419,250,9.69,255,7.401,257,8.134,373,4.683,393,9.767,414,7.098,480,6.532,553,8.134,563,7.779,571,11.908,732,6.353,877,12.555,921,9.404,1747,12.278]],["keywords/313",[]],["title/314",[25,63.794,37,161.05,40,366.18,275,319.419,886,342.668,1378,596.617]],["content/314",[3,4.283,4,0.965,20,4.171,22,3.725,23,4.151,24,4.9,25,1.28,28,4.027,29,5.888,32,1.971,33,1.204,34,3.25,35,2.67,37,3.23,44,4.79,45,2.642,58,3.41,62,3.989,63,3.113,68,9.041,85,4.485,88,3.193,100,3.448,124,3.487,151,2.873,161,2.942,167,4.047,171,2.431,176,3.398,193,3.731,199,4.458,264,2.699,271,3.303,275,4.727,276,5.657,281,3.611,323,5.133,330,2.239,334,2.685,355,5.594,379,4.26,397,5.94,399,5.09,433,6.778,440,4.307,480,3.35,536,3.193,568,8.351,571,6.106,572,3.326,581,3.952,630,7.073,668,4.822,693,4.171,722,4.69,758,4.027,763,4.755,764,5.09,765,4.652,767,5.319,770,4.598,771,6.892,772,3.862,773,5.594,776,8.188,777,4.149,778,6.931,780,4.931,786,3.989,877,5.177,914,4.381,1168,6.106,1191,5.94,1219,4.485,1256,5.27,1257,4.26,1400,5.223,1887,9.312,1888,9.312,1889,5.863,1890,7.299,1891,6.516,1892,9.312,1893,6.402]],["keywords/314",[]],["title/315",[19,469.995,480,564.031]],["content/315",[4,1.005,5,2.095,6,1.418,19,2.908,22,4.629,23,4.187,24,5.055,25,0.645,32,3.099,34,3.353,35,2.782,37,2.459,45,5.004,111,3.661,149,4.024,151,2.993,152,1.932,161,3.065,167,4.217,185,2.344,200,3.62,223,4.989,271,5.195,275,3.23,329,4.323,334,2.797,355,5.771,425,3.49,438,3.633,480,8.282,490,3.855,496,3.92,572,3.466,581,4.117,607,7.94,630,6.484,631,10.273,737,4.923,758,4.196,763,4.954,764,5.303,765,4.8,767,5.542,770,4.791,771,7.068,772,4.024,773,5.771,776,6.97,777,4.323,780,5.137,932,4.415,1121,12.704,1262,10.841,1400,5.442,1479,5.442,1540,6.034,1690,6.919,1894,11.17,1895,7.4,1896,9.702,1897,11.84,1898,9.702,1899,9.702,1900,10.9,1901,9.702]],["keywords/315",[]],["title/316",[19,469.995,742,709.677]],["content/316",[5,2.747,6,1.232,23,4.151,25,1.187,34,2.913,35,3.649,37,2.136,124,6.682,152,2.533,184,2.759,202,3.914,271,4.514,298,6.244,301,2.9,392,5.918,438,6.682,536,4.363,556,4.545,572,4.545,630,8.211,718,5.163,737,4.278,742,8.076,758,5.503,765,6.754,767,7.269,770,6.284,771,7.149,772,5.278,773,8.12,780,6.738,918,7.202,921,6.59,958,5.885,1129,10.287,1147,7.014,1174,7.73,1220,7.269,1224,7.41,1617,6.638,1825,10.287,1827,7.137,1902,10.966,1903,13.281,1904,12.724,1905,11.766]],["keywords/316",[]],["title/317",[25,70.65,37,178.358,467,375.547,670,595.91,877,590.69]],["content/317",[5,3.665,6,1.644,37,2.85,58,6.217,110,7.488,114,4.935,142,9.986,152,3.38,202,5.222,265,6.107,278,4.569,285,11.67,322,6.24,398,8.105,414,6.635,527,8.729,556,7.731,557,6.745,563,7.272,588,12.948,694,8.437,698,10.975,742,7.684,877,9.438,892,10.432,1032,11.67,1906,16.975,1907,16.975,1908,16.975,1909,16.975]],["keywords/317",[]],["title/318",[191,471.331,879,610.406]],["content/318",[6,1.728,20,5.699,25,1.621,37,3.459,63,3.913,70,3.103,100,6.608,107,4.383,176,4.643,181,4.754,185,4.31,191,3.825,196,5.553,199,6.092,203,6.452,220,4.498,222,3.47,234,5.885,240,2.841,275,4.237,293,3.562,297,3.61,301,2.9,315,5.812,398,4.765,437,4.994,462,5.056,467,4.498,480,6.419,514,4.561,537,4.17,614,5.503,735,5.729,742,8.076,763,9.111,785,3.88,857,6.543,872,6.409,877,9.921,883,6.899,886,4.545,887,7.41,932,5.79,934,7.82,996,5.759,1007,6.687,1153,11.135,1158,7.82,1168,8.344,1433,11.135,1643,10.287,1910,12.724,1911,12.724,1912,12.724]],["keywords/318",[]],["title/319",[25,79.157,33,153.915,182,237.492,1913,723.164]],["content/319",[]],["keywords/319",[]],["title/320",[182,270.003,200,504.882,1913,822.159]],["content/320",[4,1.614,6,1.508,22,4.088,33,2.014,44,4.338,116,6.433,151,4.806,154,5.727,181,4.151,182,3.108,185,3.763,190,7.287,201,6.017,205,4.048,206,5.545,252,6.041,278,5.511,293,4.361,297,4.419,308,5.043,437,6.114,440,7.206,541,7.597,544,5.812,546,12.595,664,7.794,699,10.073,706,7.955,717,7.459,860,9.465,912,8.127,996,7.051,1015,11.883,1038,9.689,1187,10.073,1419,11.883,1604,10.073,1913,12.438,1914,11.11,1915,14.406,1916,14.406]],["keywords/320",[]],["title/321",[22,312.383,33,153.915,182,237.492,1913,723.164]],["content/321",[4,1.423,5,2.964,6,2.341,25,0.913,37,2.305,44,3.823,51,3.286,67,5.525,70,3.349,107,3.373,181,5.012,182,2.74,185,3.317,205,4.887,206,4.888,219,5.104,222,3.744,240,4.2,243,6.316,252,5.324,256,6.459,265,4.939,275,4.572,301,3.129,322,6.914,385,5.029,437,5.389,478,8.539,481,7.569,536,4.708,537,4.5,564,6.351,613,4.837,664,6.87,693,6.15,695,6.781,721,12.016,887,7.997,898,9.439,908,11.101,910,5.525,912,7.163,926,7.011,1009,12.016,1167,9.439,1322,11.101,1378,8.539,1589,10.22,1913,8.342,1917,13.73,1918,13.73,1919,13.73,1920,12.697]],["keywords/321",[]],["title/322",[25,79.157,33,153.915,437,467.161,1066,635.181]],["content/322",[5,3.695,6,1.657,25,1.447,33,2.213,51,4.095,52,4.716,152,3.407,185,4.134,234,7.916,240,3.821,256,8.051,273,3.753,278,4.607,284,7.717,293,4.791,301,3.901,314,6.071,330,4.115,537,5.609,539,7.961,613,6.029,614,7.402,652,8.194,704,8.995,722,8.62,732,5.988,937,7.475,1166,11.223,1170,8.739]],["keywords/322",[]],["title/323",[202,482.305,556,560.063]],["content/323",[6,2.18,25,1.202,69,4.046,70,3.161,72,6.169,107,3.184,125,5.129,176,4.73,182,3.606,184,2.811,192,4.358,257,5.806,273,3.964,278,3.489,281,8.07,284,4.598,297,3.677,301,2.954,311,5.552,314,4.598,315,4.222,322,4.765,330,4.346,379,8.269,381,4.183,392,6.029,396,4.235,425,4.663,438,4.854,442,9.435,490,5.15,537,4.248,538,6.443,545,3.59,584,8.764,611,8.162,613,6.367,697,8.268,718,5.26,732,4.535,734,6.528,740,8.407,921,6.713,1006,7.875,1071,11.986,1072,9.07,1073,11.986,1170,6.618,1176,7.405,1393,10.479,1751,9.244,1913,7.875,1914,9.244,1921,12.962,1922,11.986,1923,12.962,1924,11.986,1925,12.962]],["keywords/323",[]],["title/324",[25,89.993,886,483.395,1074,739.744]],["content/324",[]],["keywords/324",[]],["title/325",[25,123.921]],["content/325",[4,1.788,5,3.725,6,1.671,21,9.952,25,1.148,33,2.231,51,4.129,67,6.943,181,4.598,182,3.443,186,5.101,205,4.484,206,6.143,240,3.853,281,6.691,284,6.121,301,3.933,310,7.811,330,4.149,379,7.895,414,6.745,427,6.344,504,7.651,533,9.767,537,5.656,564,7.982,613,6.079,1067,11.668,1068,10.258,1172,12.307]],["keywords/325",[]],["title/326",[6,131.019,278,364.276,284,480.028]],["content/326",[4,1.773,6,2.106,44,4.765,116,7.068,182,3.415,183,5.39,330,5.751,425,6.157,438,6.409,451,10.518,538,8.507,544,6.385,545,6.026,622,6.945,638,9.87,668,8.863,745,9.356,751,10.518,858,8.62,1035,10.398,1085,14.343,1167,11.766,1847,12.739,1913,10.398,1914,12.206,1926,11.976,1927,12.458]],["keywords/326",[]],["title/327",[107,332.397,181,360.573,732,473.461]],["content/327",[6,1.671,9,7.895,25,1.148,107,4.239,151,5.324,155,5.144,181,4.598,182,3.443,192,5.802,240,3.853,246,5.451,310,7.811,314,7.758,392,8.026,427,6.344,477,10.05,545,6.058,613,6.079,622,7.003,706,8.811,707,11.668,762,12.844,812,12.307,985,8.026,1913,10.484,1928,15.957,1929,17.256,1930,17.256]],["keywords/327",[]],["title/328",[6,151.799,184,340.004]],["content/328",[6,2.074,25,1.111,51,3.997,65,5.474,69,7.382,70,4.073,155,4.979,176,6.095,184,4.645,186,4.937,192,5.616,205,4.34,220,5.904,225,5.987,226,8.529,227,8.589,281,6.477,297,4.738,301,3.807,315,5.44,330,4.016,410,10.799,438,6.255,537,5.474,622,6.778,740,7.769,985,7.769,1115,12.159,1141,10.953,1147,9.207]],["keywords/328",[]],["title/329",[183,493.826,273,343.83]],["content/329",[6,1.728,25,1.486,125,7.062,162,6.309,166,9.677,171,4.661,183,5.621,273,5.347,291,8.545,293,4.996,330,4.291,381,5.759,538,8.871,543,6.609,544,6.659,545,4.944,611,11.239,734,8.989,1006,10.843,1040,11.385,1170,9.113,1913,10.843,1931,11.239]],["keywords/329",[]],["title/330",[281,524.746,297,383.895,379,619.122]],["content/330",[25,1.24,69,5.821,70,4.547,219,6.931,264,5.406,281,8.901,301,4.25,330,4.483,373,4.809,385,6.83,397,11.894,425,6.708,537,6.111,545,5.165,613,6.569,741,11.329,1178,12.608,1422,13.048,1913,11.329,1932,18.646]],["keywords/330",[]],["title/331",[25,70.65,33,137.374,467,375.547,670,595.91,1913,645.446]],["content/331",[4,1.677,5,3.494,6,1.567,25,1.076,33,2.093,41,10.943,52,4.459,116,6.683,181,4.312,196,5.037,225,5.801,226,8.264,265,5.822,275,5.389,284,5.741,293,4.53,315,5.271,322,5.949,334,4.666,398,6.061,437,8.238,439,11.325,536,5.549,614,7,634,11.542,659,7.445,692,8.264,698,10.464,732,5.662,911,10.323,1167,11.126,1721,13.563,1783,11.126,1913,9.832,1933,12.686,1934,14.965,1935,12.686]],["keywords/331",[]],["title/332",[4,123.338,25,79.157,182,237.492,1913,723.164]],["content/332",[]],["keywords/332",[]],["title/333",[25,104.266,29,650.349]],["content/333",[4,1.731,12,5.824,22,4.383,25,1.659,28,9.264,29,8.885,87,5.804,97,5.864,113,7.769,144,10.265,171,4.362,190,7.813,191,5.021,319,9.545,328,13.504,452,7.726,490,6.637,722,10.789,1083,14.617,1180,10.036,1261,10.655,1263,11.912,1936,13.998,1937,13.998,1938,15.445,1939,16.703,1940,13.504]],["keywords/333",[]],["title/334",[33,174.985,198,361.493,323,745.978]],["content/334",[4,1.15,5,2.396,19,3.327,22,4.246,23,4.25,24,5.585,25,1.076,32,2.348,34,3.704,35,4.64,37,1.863,116,4.583,124,6.059,151,3.424,154,4.079,161,3.506,167,4.823,198,2.964,224,3.365,271,3.936,275,3.695,278,2.987,281,4.303,297,3.148,355,7.525,379,5.077,427,4.079,467,3.923,476,6.742,480,3.992,514,3.978,568,6.528,572,5.78,630,7.714,758,4.8,765,5.303,767,6.34,768,9.243,770,5.48,771,6.483,772,4.603,773,6.376,776,7.701,777,4.945,779,7.386,780,5.876,786,4.754,921,5.747,981,6.34,1058,5.747,1219,5.345,1256,6.281,1400,9.076,1540,6.902,1941,9.3,1942,8.699]],["keywords/334",[]],["title/335",[545,374.827,1913,822.159,1914,965.11]],["content/335",[4,1.632,6,1.525,19,4.722,23,4.207,25,0.711,32,3.956,34,3.606,35,3.068,125,4.233,151,3.301,152,2.13,162,5.568,164,5.871,166,5.8,167,4.65,183,3.37,188,8.835,224,3.244,273,2.346,284,3.795,301,2.438,330,2.572,355,4.216,425,3.849,427,3.933,476,9.57,490,4.251,538,5.318,569,7.729,642,4.792,716,3.862,732,3.743,768,13.58,771,4.286,812,7.63,824,7.486,983,6.359,1098,8.386,1526,5.848,1604,6.917,1656,7.121,1913,11.358,1914,11.234,1941,8.966,1943,10.698,1944,10.698,1945,10.698,1946,8.65,1947,10.698,1948,10.698,1949,9.893,1950,10.698,1951,10.698,1952,10.698,1953,15.752,1954,10.698,1955,15.752,1956,10.698,1957,10.698,1958,10.698]],["keywords/335",[]],["title/336",[25,79.157,65,390.118,400,535.943,408,393.825]],["content/336",[2,5.096,4,2.238,5,3.004,6,1.347,20,6.232,25,0.925,37,3.187,51,4.542,52,5.23,62,5.96,63,3.051,69,4.343,87,4.835,98,5.96,100,5.153,114,4.045,171,3.633,220,4.918,222,3.794,232,8.271,246,4.396,256,6.546,275,6.32,297,5.385,308,4.504,319,6.2,395,5.85,400,6.265,408,8.293,421,7.206,492,9.408,529,7.875,548,8.762,564,6.436,581,5.905,636,7.606,866,8.185,1030,6.828,1670,12.176,1871,11.249,1959,13.914,1960,13.914,1961,8.271,1962,12.866,1963,11.661,1964,12.866,1965,9.737]],["keywords/336",[]],["title/337",[6,92.877,25,63.794,205,249.247,219,356.567,240,214.197,613,337.935]],["content/337",[]],["keywords/337",[]],["title/338",[107,332.397,181,360.573,732,473.461]],["content/338",[5,4.026,6,1.805,25,1.24,70,4.547,107,4.58,161,5.891,181,6.116,182,3.72,185,4.504,192,6.269,240,4.164,273,4.089,314,6.614,315,6.073,396,6.092,622,7.567,706,9.521,717,8.928,732,6.524,1913,11.329]],["keywords/338",[]],["title/339",[225,562.039,226,800.578]],["content/339",[6,1.774,25,1.218,69,5.718,88,6.281,152,3.647,155,5.46,205,4.76,225,8.139,227,9.42,255,7.466,278,4.931,330,4.404,395,7.702,426,11.393,536,6.281,545,5.074,632,10.777,740,8.521,1116,9.105,1177,11.258,1310,10.669,1966,12.819]],["keywords/339",[]],["title/340",[613,552.327,1117,1267.615]],["content/340",[6,2.222,25,1.24,70,4.547,155,5.558,191,5.605,205,5.964,240,5.125,281,7.231,298,9.15,299,11.597,301,4.25,330,4.483,537,6.111,613,6.569,861,8.673,894,7.145,985,8.673,1174,11.329]],["keywords/340",[]],["title/341",[25,79.157,202,366.157,563,509.904,1119,686.479]],["content/341",[]],["keywords/341",[]],["title/342",[60,504.882,63,296.762,514,485.1]],["content/342",[6,1.822,60,8.612,63,4.126,171,4.913,191,5.656,198,5.026,273,5.062,301,4.288,512,7.702,544,7.02,693,8.428,737,6.326,740,8.751,905,11.184,1330,14.748,1427,10.04,1913,11.431,1967,14.748]],["keywords/342",[]],["title/343",[6,131.019,185,326.9,480,486.819]],["content/343",[5,4.336,6,1.945,25,1.336,51,4.806,70,4.898,182,4.007,278,5.407,297,5.698,480,7.225,863,11.583,906,10.889,924,12.812,932,9.14]],["keywords/343",[]],["title/344",[116,491.54,278,320.414,330,286.181,356,553.65]],["content/344",[4,1.967,6,2.247,33,2.455,224,5.757,241,7.057,330,5.58,356,8.831,537,6.223,545,5.259,659,8.734,668,9.833,751,11.668,1125,13.286,1126,14.132,1128,13.821,1170,9.695,1968,18.986]],["keywords/344",[]],["title/345",[217,483.395,556,483.395,742,612.527]],["content/345",[5,4.214,6,1.89,35,5.598,63,4.281,152,3.886,217,6.973,556,6.973,693,8.743,737,6.563,742,8.835,866,11.484,921,10.109,954,10.259,958,9.029,1784,17.082,1969,15.301]],["keywords/345",[]],["title/346",[4,99.401,25,63.794,85,462.071,182,191.399,855,570.235,1913,582.811]],["content/346",[2,4.222,5,2.489,6,2.068,18,3.851,20,7.45,25,1.106,33,1.491,44,4.631,60,4.301,63,2.528,64,7.794,70,2.811,111,4.35,121,6.926,144,7.084,155,4.958,166,9.017,171,3.01,181,3.071,183,3.631,191,3.465,198,5.212,210,7.673,246,3.642,264,3.342,273,3.647,284,4.089,304,5.806,314,4.089,323,6.354,360,9.501,381,3.72,385,4.222,392,5.362,427,4.237,439,8.066,468,5.274,478,7.169,514,4.132,538,8.267,545,3.193,622,4.678,664,5.767,693,5.163,736,4.317,786,4.938,858,5.806,893,4.847,905,6.852,906,6.25,914,5.423,1058,5.97,1108,7.794,1124,7.453,1143,7.453,1151,7.453,1176,6.585,1234,9.661,1671,9.32,1786,9.036,1792,7.925,1872,6.2,1913,7.003,1914,8.221,1927,8.391,1970,8.221,1971,11.527,1972,11.527,1973,11.527,1974,10.659,1975,10.088,1976,11.527,1977,10.659,1978,11.527,1979,11.527,1980,9.661,1981,7.673]],["keywords/346",[]],["title/347",[191,471.331,879,610.406]],["content/347",[4,1.413,19,5.613,25,1.657,33,1.764,51,3.264,85,6.57,87,4.74,105,10.152,125,5.397,152,2.716,171,3.562,189,6.965,190,6.381,191,4.101,192,4.586,196,4.246,202,4.196,222,3.719,265,4.907,293,3.818,366,6.57,398,5.108,523,10.071,536,4.677,853,10.697,855,8.108,857,7.014,861,6.345,872,6.87,879,7.29,882,11.508,883,10.152,884,7.944,886,4.873,887,7.944,937,5.957,993,6.57,994,7.336,995,9.728,996,6.174,997,9.929,998,9.728,1127,8.589,1154,10.692,1192,8.484,1913,8.287,1936,11.432,1982,11.028,1983,9.929,1984,8.701]],["keywords/347",[]],["title/348",[25,53.425,33,103.882,114,233.543,196,250.045,217,286.973,264,232.903,414,314.027,973,432.085]],["content/348",[]],["keywords/348",[]],["title/349",[33,137.374,114,308.839,217,379.495,414,415.272,636,580.745]],["content/349",[]],["keywords/349",[]],["title/350",[152,269.421,377,1060.767,701,841.635]],["content/350",[5,4.464,6,2.002,25,1.052,152,4.116,182,3.155,194,9.211,196,4.922,203,8.02,217,7.386,239,8.075,255,6.446,260,8.191,278,4.257,414,6.182,437,6.207,512,6.474,551,7.197,572,5.649,662,11.279,663,8.718,716,5.71,765,5.183,921,8.191,926,8.075,954,8.312,1183,8.718,1204,8.132,1430,12.786,1479,8.871,1651,9.121,1856,11.512,1933,12.397,1985,13.84,1986,10.226,1987,12.063,1988,12.786,1989,11.772]],["keywords/350",[]],["title/351",[639,644.087,765,443.523,1546,1134.114]],["content/351",[6,1.508,9,7.127,33,2.014,73,7.955,111,7.725,162,7.237,196,4.849,217,5.565,222,4.248,329,6.942,330,3.746,348,8.818,396,5.09,414,6.09,417,7.014,435,9.367,437,6.114,587,9.937,662,11.11,663,8.588,695,7.693,737,6.883,765,6.71,991,8.588,1407,11.883,1547,10.369,1623,10.533,1651,8.985,1659,13.633,1990,11.596,1991,12.212,1992,12.595,1993,10.533,1994,15.579,1995,15.579,1996,15.579,1997,13.633,1998,14.406]],["keywords/351",[]],["title/352",[70,290.285,860,723.164,920,630.307,956,749.53]],["content/352",[5,3.389,6,1.992,30,7.384,63,3.442,99,5.529,152,3.125,196,4.885,217,5.607,222,4.28,223,8.071,249,8.884,250,8.376,256,7.384,257,7.031,301,3.577,322,5.77,330,3.774,427,5.77,496,8.313,544,5.856,552,8.249,572,5.607,642,7.031,695,7.751,732,5.492,905,9.33,1021,8.442,1025,11.973,1326,9.646,1604,10.148,1614,8.015,1651,9.052,1666,14.514,1986,13.302,1999,15.696,2000,11.683,2001,15.696,2002,8.442,2003,15.696]],["keywords/352",[]],["title/353",[62,579.706,414,528.967,417,609.31]],["content/353",[5,2.619,6,1.175,33,1.569,44,3.378,70,2.959,107,2.98,114,3.527,122,5.325,152,4.353,171,3.168,182,4.006,196,3.776,201,4.685,217,7.171,222,3.308,234,5.611,255,4.944,278,3.266,301,2.765,306,8.652,322,4.46,377,9.509,379,5.55,414,4.742,417,5.462,421,6.283,452,5.611,466,6.329,501,6.238,503,6.424,537,3.976,552,6.376,560,6.424,563,5.197,639,5.774,640,8.652,663,6.687,693,5.434,718,4.923,732,4.244,860,7.37,876,7.545,914,5.707,943,6.376,1001,10.167,1007,6.376,1021,6.525,1037,8.652,1158,7.455,1173,7.211,1194,8.831,1220,6.93,1234,10.167,1356,7.738,1547,11.483,1560,8.34,1604,7.844,1651,6.996,1681,11.218,1729,9.253,1902,7.455,1986,7.844,1997,10.616,2004,9.253,2005,11.218,2006,12.131,2007,10.616,2008,12.131,2009,12.131,2010,9.808,2011,11.218,2012,11.218,2013,12.131]],["keywords/353",[]],["title/354",[381,384.109,417,535.943,965,740.294,2014,1190.303]],["content/354",[6,1.698,9,3.587,33,1.994,44,2.183,69,2.447,70,1.912,114,3.61,124,2.936,136,4.521,152,2.472,182,1.564,201,6.774,217,5.508,222,4.205,255,5.061,264,2.273,273,3.382,278,3.343,291,3.754,297,2.224,306,5.591,322,5.668,329,3.494,330,1.885,371,4.09,373,2.022,379,3.587,391,3.949,395,6.484,401,3.512,414,7.472,417,9.593,437,6.052,452,3.626,462,3.115,474,4.521,501,6.386,503,4.151,512,3.209,533,7.029,541,3.823,544,2.925,551,3.567,556,2.8,560,4.151,563,6.606,564,3.626,614,3.391,639,3.731,640,5.591,659,3.606,663,4.322,667,9.472,668,4.06,695,3.872,701,4.876,718,3.181,732,4.345,736,2.936,751,4.818,765,5.054,772,3.252,785,2.391,860,4.763,862,4.937,865,12.536,876,4.876,905,7.382,914,3.688,952,4.437,954,4.12,961,4.322,963,3.028,965,4.876,973,4.217,1021,10.282,1030,3.847,1161,6.145,1166,5.141,1169,3.587,1190,6.145,1195,6.861,1297,5.301,1315,4.937,1326,7.632,1329,3.976,1389,6.338,1395,5.835,1418,6.145,1547,5.218,1558,4.818,1560,5.39,1582,5.835,1623,5.301,1636,5.486,1645,7.249,1697,4.437,1728,5.835,1729,5.98,1846,5.707,1847,5.835,1986,5.069,1997,6.861,2004,9.472,2015,7.84,2016,7.84,2017,6.861,2018,6.145,2019,7.249,2020,7.84,2021,6.57,2022,6.57,2023,3.823,2024,7.84,2025,6.338,2026,7.84,2027,7.84,2028,7.84,2029,7.249,2030,6.861,2031,5.591,2032,6.338]],["keywords/354",[]],["title/355",[5,229.359,33,137.374,217,379.495,417,478.346,991,585.638]],["content/355",[]],["keywords/355",[]],["title/356",[217,425.189,372,769.603,1990,885.975,2033,962.349]],["content/356",[5,3.48,6,1.843,23,2.901,35,4.622,53,4.663,60,4.118,85,5.317,92,4.706,190,5.163,196,3.436,198,4.305,203,8.173,217,8.304,223,5.676,273,2.421,291,5.285,297,3.131,298,5.417,310,4.996,325,7.724,372,10.421,417,7.257,438,4.134,479,6.632,536,3.785,556,3.943,557,4.386,630,4.058,631,6.429,633,8.925,639,7.671,642,4.944,656,6.562,721,9.66,732,3.862,735,4.97,737,6.4,765,3.618,771,4.423,787,7.811,869,12.484,875,5.845,1066,5.89,1081,6.784,1310,6.429,1329,5.598,1402,8.035,1417,6.034,1427,5.89,1610,6.865,1616,9.66,1623,7.464,1651,6.366,1668,8.653,1856,8.035,1933,8.653,1986,10.421,1990,14.17,2033,8.925,2034,17.603,2035,9.251,2036,8.653,2037,10.207,2038,11.038,2039,11.038,2040,11.038,2041,11.038,2042,11.038,2043,8.035,2044,9.66,2045,9.251,2046,11.038]],["keywords/356",[]],["title/357",[5,292.154,100,501.136,217,483.395]],["content/357",[4,1.36,5,4.523,6,1.271,25,0.873,37,2.203,44,3.655,49,6.175,51,3.141,63,2.878,88,4.5,100,9.118,110,5.79,113,6.105,152,2.613,155,3.912,202,4.037,217,8.087,240,2.931,273,2.878,297,3.723,319,5.849,329,5.849,334,3.784,373,3.385,396,4.288,437,5.151,452,6.071,491,9.554,492,8.874,503,6.95,515,6.482,545,3.635,631,10.619,636,7.175,650,7.569,664,6.567,737,4.413,750,11.486,765,4.302,947,12.535,1015,10.011,1029,9.554,1261,8.372,1546,11,1763,11.486,1990,9.769,2047,13.125,2048,16.86,2049,8.486,2050,13.125,2051,11,2052,10.011,2053,13.125,2054,13.125,2055,11]],["keywords/357",[]],["title/358",[33,103.882,72,382.369,98,344.149,217,452.238,510,407.391,631,467.879,670,450.625]],["content/358",[2,6.827,5,2.298,6,1.519,12,3.711,30,5.007,37,1.787,44,4.369,60,5.855,69,3.323,88,3.649,98,9.396,113,4.951,155,3.173,156,9.87,182,2.124,185,2.571,192,3.578,196,3.313,217,7.348,230,6.499,255,4.338,278,2.865,334,3.069,391,5.361,409,10.01,438,3.986,440,4.923,483,5.725,496,4.301,498,6.62,501,5.473,545,2.948,556,3.802,581,4.517,631,6.199,636,5.818,642,4.767,650,10.75,674,3.898,693,7.029,732,3.724,736,5.877,739,10.146,887,6.199,912,5.553,1000,5.725,1007,5.594,1042,12.051,1114,5.435,1160,5.397,1171,7.317,1173,6.327,1297,7.197,1325,6.882,1356,6.789,1694,7.448,1697,6.024,1799,9.314,1965,7.448,2049,6.882,2056,10.644,2057,10.788,2058,6.789,2059,10.644,2060,8.119,2061,10.644,2062,7.084,2063,8.92,2064,10.644,2065,12.687,2066,10.644,2067,10.644,2068,10.644,2069,10.644,2070,8.605,2071,9.842,2072,9.314,2073,9.842]],["keywords/358",[]],["title/359",[7,299.457,25,63.794,33,124.043,217,342.668,264,278.105,625,731.722]],["content/359",[25,1.24,33,2.411,107,4.58,152,3.712,181,4.968,199,8.928,201,7.202,205,4.845,206,6.637,217,6.661,240,4.164,264,5.406,414,7.289,504,8.267,614,8.065,785,5.686,1172,13.298,1720,16.318,2074,18.646,2075,14.223,2076,16.318]],["keywords/359",[]],["title/360",[556,560.063,960,1267.615]],["content/360",[4,1.15,5,3.493,6,1.566,18,3.707,25,1.27,33,1.435,37,1.863,45,3.148,60,4.14,107,2.726,114,4.704,152,3.221,162,3.923,181,4.311,184,2.407,185,4.613,191,3.336,217,8.32,230,3.506,240,2.478,250,5.922,264,3.217,273,4.187,278,2.987,284,3.936,314,3.936,315,6.219,322,5.948,330,3.89,381,3.581,396,3.626,417,4.997,425,3.992,452,5.133,458,5.162,466,5.789,467,3.923,490,4.409,538,5.516,539,5.162,543,4.11,544,4.14,545,4.482,553,4.971,590,4.731,614,4.8,630,4.079,639,5.282,652,7.747,662,7.914,663,6.117,712,6.742,716,4.006,737,3.731,765,5.303,858,5.589,891,6.117,942,6.668,953,8.26,985,5.162,1147,6.117,1183,6.117,1651,6.4,1726,5.969,1846,8.078,1856,8.078,1927,8.078,1981,7.386,1991,8.699,2023,5.411,2049,7.175,2052,8.465,2077,9.3,2078,9.711]],["keywords/360",[]],["title/361",[25,79.157,202,366.157,217,425.189,563,509.904]],["content/361",[6,1.464,19,3.036,23,4.127,32,3.2,35,4.337,37,1.7,45,2.873,65,3.319,70,2.47,152,3.603,171,2.644,217,7.171,334,2.92,393,5.446,414,3.958,425,5.44,467,3.58,498,6.298,556,6.465,581,4.297,590,4.317,630,3.722,693,4.536,695,5.001,718,6.137,719,6.962,737,6.085,742,9.087,757,9.778,765,4.956,861,4.71,944,5.68,945,7.938,1065,5.957,1161,7.938,1162,9.364,1169,4.633,1183,5.582,1300,6.957,1567,7.938,1583,7.938,1755,7.724,1811,7.371,1825,8.187,1827,5.68,1828,9.364,1829,8.862,1830,13.984,1831,8.487,1832,13.984,1833,9.364,1834,13.984,1835,13.984,1836,13.984,1837,13.984,1838,9.364,1839,9.364,1840,9.364,1841,13.984,1842,13.984,1967,7.938,2079,5.785,2080,9.364,2081,10.126,2082,8.862,2083,9.364,2084,10.126,2085,9.364,2086,10.126]],["keywords/361",[]],["title/362",[191,471.331,879,610.406]],["content/362",[4,0.812,5,2.681,6,1.202,7,2.447,19,3.723,25,1.469,33,1.994,46,2.538,51,1.876,60,2.925,70,1.912,85,3.776,87,2.724,97,2.752,98,3.358,105,6.733,107,3.05,114,2.279,125,3.102,152,3.07,156,4.151,171,2.047,181,3.309,182,1.564,184,1.7,185,1.894,186,2.317,189,4.003,190,5.809,191,2.357,192,4.175,196,3.865,201,3.028,202,3.82,217,7.264,222,4.205,230,2.477,265,2.82,273,2.723,284,2.781,293,3.476,296,5.835,304,3.949,348,4.437,366,3.776,385,2.871,398,2.936,401,3.512,414,3.064,417,5.591,452,3.626,467,2.771,514,2.81,523,6.679,533,4.437,536,2.688,541,3.823,544,2.925,551,3.567,556,2.8,563,3.358,631,4.566,639,5.911,650,4.521,701,4.876,732,2.743,736,2.936,737,4.175,739,5.069,742,3.549,765,4.07,853,7.094,855,4.66,856,5.069,857,4.031,860,4.763,861,3.647,865,5.141,872,3.949,875,4.151,879,4.835,882,7.632,883,6.733,884,4.566,886,2.8,887,4.566,888,4.09,947,5.39,956,4.937,961,4.322,986,5.39,993,3.776,994,4.217,995,5.591,996,3.549,997,5.707,998,5.591,1021,6.679,1077,4.437,1127,4.937,1154,6.145,1192,4.876,1197,5.486,1233,6.57,1311,6.57,1315,4.937,1418,6.145,1659,6.861,1668,6.145,1913,4.763,1936,6.57,1982,6.338,1983,5.707,1984,5.001,1986,5.069,1990,9.243,2034,7.249,2048,7.249,2087,7.84,2088,5.591,2089,5.141,2090,7.84,2091,7.84,2092,7.84,2093,7.84,2094,5.835,2095,5.486,2096,7.84,2097,7.84,2098,4.937,2099,6.57,2100,7.84,2101,7.84,2102,6.338]],["keywords/362",[]],["title/363",[7,371.572,25,79.157,33,153.915,217,425.189]],["content/363",[]],["keywords/363",[]],["title/364",[33,174.985,217,483.395,1110,773.065]],["content/364",[4,1.744,5,4.252,6,2.422,7,5.255,12,4.087,33,1.516,58,4.293,65,3.842,86,4.736,152,3.351,155,3.494,195,6.207,196,5.239,200,4.373,217,8.734,222,3.196,251,6.517,256,5.514,297,3.325,304,5.904,322,4.309,381,3.783,382,6.027,394,8.536,395,4.929,396,3.83,416,11.204,417,5.278,421,6.071,486,6.968,519,6.304,553,5.25,558,9.188,597,9.188,598,7.925,639,5.579,674,4.293,695,5.789,701,7.29,938,9.188,956,7.381,973,6.304,1021,6.304,1036,9.824,1037,8.36,1038,7.29,1068,10.006,1157,6.968,1224,9.804,1305,8.203,1650,6.968,1651,9.708,1668,9.188,1986,10.884,2007,10.258,2023,5.716,2049,7.579,2103,11.722,2104,9.824,2105,11.722,2106,6.76,2107,10.839]],["keywords/364",[]],["title/365",[37,178.358,87,369.18,152,211.512,217,379.495,467,375.547]],["content/365",[2,6.796,4,0.9,5,2.906,6,2.366,10,6.52,12,4.694,19,2.605,25,1.096,33,2.746,37,3.944,51,2.079,52,2.394,53,3.671,58,3.183,69,4.202,84,4.637,87,5.726,99,3.061,114,2.526,152,1.73,155,2.59,176,3.171,182,4.79,185,3.252,186,3.979,198,2.321,201,3.356,206,3.093,217,3.104,219,3.23,222,2.37,230,2.745,232,9.795,240,4.741,249,4.919,252,3.37,260,4.501,264,3.903,265,3.126,297,2.465,314,3.083,334,4.751,408,2.875,432,4.567,467,4.759,478,5.405,479,5.221,504,5.968,519,4.674,525,4.567,531,4.75,535,6.812,536,2.98,539,4.042,554,4.161,560,4.602,562,5.012,564,4.02,613,4.742,652,6.445,674,3.183,678,5.472,697,5.543,740,4.042,785,2.65,856,5.619,932,3.954,936,4.319,962,6.468,965,5.405,987,5.619,1000,4.674,1030,4.264,1053,6.812,1081,5.341,1268,4.501,1295,10.552,1427,4.637,1611,6.468,1751,11.751,2108,8.69,2109,12.448,2110,8.69,2111,5.784,2112,5.699]],["keywords/365",[]],["title/366",[37,199.834,152,236.98,217,425.189,742,538.773]],["content/366",[4,1.432,6,2.084,25,0.919,30,6.502,37,3.614,45,3.921,53,7.981,63,3.031,96,7.823,152,4.286,155,4.12,182,2.758,186,4.085,202,4.252,217,6.749,252,5.36,255,5.633,273,4.721,288,6.826,298,6.782,308,4.474,334,3.985,401,6.191,438,5.176,455,6.618,466,7.21,480,4.972,514,4.955,556,4.937,560,7.319,581,5.865,617,7.319,622,5.609,703,5.157,718,5.609,737,4.647,742,10.968,843,6.256,914,6.502,944,7.753,963,7.298,999,10.061,2113,12.781,2114,9.064,2115,11.583]],["keywords/366",[]],["title/367",[6,92.877,330,230.639,435,438.882,765,475.882,2023,467.785]],["content/367",[4,1.01,5,3.173,6,1.907,19,2.922,23,4.03,25,1.31,32,2.063,33,1.9,35,4.214,45,4.169,53,4.117,69,3.043,72,4.639,152,2.926,155,2.905,171,2.545,176,3.557,177,5.012,182,1.945,201,3.765,205,2.533,217,3.482,227,5.012,240,2.176,248,5.285,271,3.458,293,2.728,297,2.765,301,2.221,330,2.343,334,2.81,373,2.514,381,3.145,382,5.012,398,3.65,435,8.093,545,2.7,556,5.25,572,3.482,590,4.156,600,7.904,630,7.769,736,3.65,758,4.216,765,5.798,770,4.814,771,7.088,772,4.043,773,6.971,774,9.67,775,7.036,860,5.922,985,4.534,987,6.302,1019,6.138,1144,8.53,1174,5.922,1211,7.641,1224,8.559,1345,6.062,1417,8.033,1444,6.954,1548,6.218,1625,7.881,1889,9.254,2023,8.626,2116,14.825,2117,6.392,2118,6.59,2119,9.747,2120,9.013,2121,5.99]],["keywords/367",[]],["title/368",[5,229.359,25,70.65,51,254.223,182,211.969,217,379.495]],["content/368",[2,5.837,3,7.331,25,1.538,37,3.882,45,4.521,46,5.158,51,5.533,52,4.391,69,6.487,113,7.412,114,4.633,182,3.18,183,6.545,198,4.257,220,5.633,273,4.557,275,5.306,281,6.18,293,4.461,297,4.521,301,3.632,437,6.255,519,8.571,536,5.464,537,5.223,545,4.414,553,7.138,554,7.63,613,5.614,962,11.862,1653,13.946]],["keywords/368",[]],["title/369",[25,79.157,33,153.915,63,261.029,217,425.189]],["content/369",[6,2.306,8,4.471,25,1.215,33,1.702,37,2.716,44,3.665,46,4.261,60,3.15,63,4.007,70,2.059,85,4.067,87,5.622,92,3.6,114,2.455,122,3.706,125,3.341,152,1.681,182,3.228,183,2.659,186,2.496,192,2.839,205,2.194,217,7.075,219,3.138,240,1.885,273,4.007,278,2.273,291,4.043,293,2.364,310,3.822,322,3.104,330,2.03,385,3.093,389,4.342,395,3.55,396,4.301,398,3.162,400,5.927,405,6.769,408,2.794,428,7.08,438,3.162,476,5.13,514,6.549,520,3.822,533,4.779,544,3.15,545,3.646,550,4.779,557,3.355,613,2.974,622,6.565,674,3.093,675,6.123,693,3.782,695,4.17,716,3.048,718,5.342,740,3.927,785,2.575,860,5.13,898,5.805,902,4.823,903,6.826,907,5.189,910,5.297,914,3.972,918,4.779,921,4.373,922,6.44,925,7.076,926,4.311,931,5.019,963,5.084,968,6.619,981,4.823,982,4.506,985,3.927,986,5.805,1007,4.437,1016,6.285,1030,4.143,1045,6.44,1050,6.022,1065,7.744,1123,6.285,1147,4.654,1151,8.511,1329,4.282,1419,6.44,1427,4.506,1571,5.709,1580,6.285,1606,9.05,1667,7.076,1668,6.619,1782,6.022,1984,5.386,1986,5.459,2122,8.444,2123,6.619,2124,7.389,2125,6.826,2126,5.62,2127,7.389,2128,8.444,2129,7.808,2130,5.537]],["keywords/369",[]],["title/370",[25,104.266,504,695.115]],["content/370",[6,1.644,25,1.129,63,3.723,182,3.387,196,6.736,202,5.222,206,7.704,217,6.064,222,4.629,240,4.833,252,6.582,255,6.918,265,6.107,355,6.689,401,7.603,414,6.635,462,6.745,504,9.595,622,8.783,639,8.079,674,6.217,899,12.357,907,10.432,963,6.556,992,12.106,2131,10.199,2132,15.697]],["keywords/370",[]],["title/371",[5,207.102,25,63.794,58,351.353,99,337.935,152,190.987,217,342.668]],["content/371",[6,2.022,7,5.013,25,1.068,46,6.76,58,8.5,97,5.638,99,7.357,152,3.197,175,9.988,182,3.204,186,4.747,196,4.998,199,7.689,217,7.46,222,4.379,252,6.227,264,6.054,278,4.323,291,7.689,394,8.144,437,6.303,536,5.506,542,10.244,560,8.504,567,10.531,622,6.517,643,11.453,674,5.882,701,9.988,1065,9.447,1151,10.383,2133,16.059]],["keywords/371",[]],["title/372",[4,123.338,33,153.915,100,440.795,217,425.189]],["content/372",[4,1.731,6,2.289,14,6.279,25,1.111,33,2.16,37,3.596,46,5.407,67,6.721,96,9.454,100,7.932,152,3.325,217,8.447,220,5.904,293,4.676,298,8.196,322,6.14,323,9.207,395,7.023,401,7.482,437,6.555,639,7.95,732,5.844,875,8.845,931,9.929,1021,8.983,2004,12.741,2104,13.998,2134,13.998]],["keywords/372",[]],["title/373",[191,471.331,879,610.406]],["content/373",[4,1.335,6,2.008,7,4.021,19,3.861,25,1.571,33,1.666,37,3.021,63,2.825,87,4.476,105,9.758,125,5.097,171,4.699,181,3.432,182,3.591,190,6.025,191,3.872,196,4.009,202,3.963,217,6.429,262,9.604,265,4.634,297,3.654,428,6.928,437,7.063,523,6.928,525,6.77,541,6.281,561,6.06,573,8.856,613,4.538,622,5.227,642,5.77,688,7.826,853,10.281,872,6.488,879,5.015,882,7.916,883,6.984,884,7.502,886,6.429,887,7.502,937,5.626,947,8.856,963,4.975,983,7.657,994,6.928,996,5.831,1000,6.928,1034,10.415,1056,8.111,1172,9.187,1432,11.912,2113,11.912,2135,11.912,2136,9.014,2137,12.881]],["keywords/373",[]],["title/374",[7,250.785,25,53.425,33,163.706,85,386.968,182,160.29,185,305.83]],["content/374",[]],["keywords/374",[]],["title/375",[4,123.338,33,153.915,67,478.927,185,287.538]],["content/375",[6,1.815,33,2.673,44,2.994,58,3.939,68,5.652,69,3.357,70,4.573,107,2.641,151,3.318,176,3.924,181,4.996,182,3.155,185,5.321,192,3.615,195,5.694,200,4.012,201,4.153,202,3.308,219,3.997,240,2.401,255,4.383,256,5.059,264,5.993,278,2.895,301,2.451,304,7.964,306,7.669,314,5.609,315,5.15,329,4.792,330,2.585,334,3.101,385,3.939,395,4.522,438,4.027,490,4.273,515,5.311,532,6.263,536,3.687,537,3.524,539,5.002,545,2.979,551,7.195,565,6.087,569,5.277,584,7.271,613,3.788,615,9.012,632,9.302,652,5.149,675,5.002,704,5.652,706,8.073,708,6.771,717,5.149,718,4.364,888,5.61,893,4.522,904,7.828,907,6.609,910,4.327,914,5.059,923,7.052,985,5.002,1011,7.271,1012,7.393,1030,5.277,1152,7.158,1158,6.609,1238,7.525,1394,9.012,1419,8.203,1590,8.203,1620,8.694,1634,7.669,1782,7.669,2138,9.411,2139,10.754,2140,10.754,2141,6.86]],["keywords/375",[]],["title/376",[63,343.83,514,562.039]],["content/376",[2,4.777,4,1.351,5,2.816,6,1.758,22,3.423,33,2.7,60,6.773,63,2.86,69,4.071,87,4.532,113,6.067,155,3.888,171,3.406,176,6.625,182,3.622,185,4.385,191,3.921,192,4.385,199,6.245,230,5.735,237,8.553,273,3.981,278,3.511,373,3.364,392,6.067,393,9.764,401,5.842,455,6.245,462,5.182,496,5.27,498,8.112,500,9.127,501,6.707,514,4.675,545,3.613,561,6.136,693,5.842,697,8.32,712,7.924,718,5.293,736,4.884,785,3.977,890,9.302,905,10.791,921,6.755,943,6.855,1112,7.753,1119,7.522,1148,9.127,1417,7.13,1427,6.96,1430,10.545,2025,10.545,2035,10.931,2142,12.061,2143,12.061,2144,13.043,2145,13.043]],["keywords/376",[]],["title/377",[480,564.031,932,713.465]],["content/377",[5,3.389,6,1.992,33,2.03,37,2.635,40,5.992,45,4.453,70,5.018,87,5.454,176,7.508,185,3.792,196,4.885,201,6.062,297,4.453,305,9.762,467,5.548,474,9.052,480,7.401,515,7.751,551,7.143,659,7.22,688,9.536,863,9.052,906,8.51,932,10.444,934,9.646,1066,8.376,1299,11.426,1410,13.736,1687,12.69,1981,10.447,2057,10.791,2146,11.426,2147,15.696,2148,15.696,2149,15.696,2150,15.696]],["keywords/377",[]],["title/378",[7,371.572,25,79.157,182,237.492,514,426.689]],["content/378",[6,1.685,7,5.432,25,1.462,33,2.843,44,4.845,107,4.274,181,5.858,182,3.472,256,8.186,278,4.684,284,7.799,301,3.966,310,7.876,414,6.802,428,9.359,537,5.703,539,8.094,564,8.049,573,11.963,614,7.526,675,8.094,692,8.885,907,10.694,961,9.592,1622,14.583]],["keywords/378",[]],["title/379",[284,480.028,301,308.418,537,443.523]],["content/379",[6,1.657,25,1.138,182,3.415,224,5.189,284,6.071,330,5.231,334,4.935,396,5.592,427,6.291,466,8.928,538,8.507,544,6.385,545,4.74,752,14.977,812,12.206,858,8.62,893,7.196,910,6.886,957,10.398,1031,12.458,1068,10.173,1077,9.687,1158,10.518,1175,10.777,1176,9.777,1617,8.928,1856,12.458,1926,11.976,2151,17.115,2152,13.055]],["keywords/379",[]],["title/380",[107,332.397,181,360.573,297,383.895]],["content/380",[3,7.275,6,1.531,25,1.052,46,5.119,70,3.857,107,3.885,176,5.772,181,5.509,192,5.317,203,8.02,220,5.591,230,4.996,264,4.585,290,12.063,304,7.966,310,7.159,314,7.334,330,3.802,423,9.72,425,5.689,438,5.923,490,6.284,553,7.084,562,9.121,564,7.315,613,5.571,622,6.418,674,5.793,704,8.312,705,9.211,706,8.075,707,10.693,732,5.533,737,5.317,1190,12.397,1417,8.645,2065,12.786,2153,15.815,2154,14.624]],["keywords/380",[]],["title/381",[6,131.019,184,293.46,639,644.087]],["content/381",[25,1.457,45,4.055,97,5.019,152,2.846,155,4.261,184,5.089,196,4.449,202,4.398,217,5.107,220,6.834,227,7.351,236,9.828,237,9.375,239,9.872,240,3.192,241,5.314,242,7.881,243,6.576,248,7.751,255,5.826,293,4.002,297,4.055,308,4.627,319,6.37,385,5.236,394,7.249,421,7.404,517,7.751,551,6.505,586,10.641,613,5.036,638,8.245,639,6.804,660,8.019,671,11.981,736,5.354,952,8.091,987,9.243,996,6.471,1078,11.558,1542,12.51,1662,11.206,1961,8.498,2075,10.904,2155,14.296,2156,13.219,2157,14.296,2158,14.296]],["keywords/381",[]],["title/382",[271,480.028,765,443.523,2023,659.894]],["content/382",[6,2.358,25,1.044,33,2.03,152,3.125,182,3.132,217,5.607,271,5.568,304,7.906,330,3.774,334,4.526,435,7.181,551,7.143,590,6.692,614,6.789,622,6.37,664,7.853,695,7.751,732,5.492,737,5.277,765,7.522,860,9.536,865,10.293,921,8.129,937,6.855,954,8.249,985,7.301,1039,11.973,1147,8.652,1224,9.141,1547,10.447,1606,10.791,1799,13.736,1993,10.613,2057,10.791,2159,15.696,2160,13.736,2161,11.973]],["keywords/382",[]],["title/383",[45,383.895,989,965.11,1305,946.964]],["content/383",[1,6.2,4,1.442,6,1.347,25,0.925,37,2.336,44,5.285,51,3.33,52,3.834,58,5.096,63,3.051,99,4.902,100,5.153,111,5.25,121,8.36,151,4.293,182,3.787,202,4.28,241,5.172,246,4.396,255,5.671,265,5.005,273,3.051,307,8.024,312,12.866,334,4.012,385,5.096,393,7.483,396,4.546,398,5.211,399,7.606,400,6.265,462,5.528,480,6.828,563,5.96,622,5.646,631,11.054,638,8.024,639,6.622,668,7.206,799,9.566,876,8.654,932,6.332,969,9.408,1047,10.128,1327,10.129,1329,7.056,1378,8.654,1389,11.249,1551,11.249,1580,10.356,2162,13.914,2163,13.914,2164,13.914,2165,9.408]],["keywords/383",[]],["title/384",[195,716.592,379,619.122,394,686.235]],["content/384",[1,6.79,3,7.009,6,1.475,25,1.013,51,3.646,52,4.198,58,5.581,69,4.756,100,5.643,181,4.06,182,3.04,195,10.684,196,4.742,198,4.07,199,7.295,200,5.685,206,5.424,240,3.402,264,5.849,265,5.481,297,4.322,321,9.364,466,7.949,524,9.992,562,8.787,588,11.622,668,7.891,715,11.341,738,9.852,743,10.662,937,6.655,952,8.624,954,8.008,962,11.341,983,9.057,985,7.087,1034,12.319,1043,11.091,1056,9.595,2094,11.341,2141,9.719,2166,15.237,2167,15.237,2168,15.237]],["keywords/384",[]],["title/385",[63,343.83,514,562.039]],["content/385",[6,1.531,25,1.375,37,2.655,60,5.9,63,3.468,70,3.857,121,9.503,149,6.56,155,4.714,166,8.575,182,3.155,192,5.317,284,5.61,301,3.604,498,9.836,512,6.474,542,10.088,663,8.718,693,7.084,701,9.836,785,4.823,892,9.72,893,6.65,910,6.363,914,7.44,921,8.191,936,7.861,937,6.907,950,10.527,963,6.108,983,9.401,1007,8.312,1047,11.512,1147,8.718,1207,9.121,1329,8.02,1378,9.836,1427,8.439,1605,13.254,2169,13.84]],["keywords/385",[]],["title/386",[253,1372.068,705,913.126]],["content/386",[3,7.445,4,1.677,6,1.567,20,7.249,25,1.076,67,6.512,70,3.947,152,3.222,155,4.824,182,3.229,184,3.51,202,4.978,203,8.207,225,5.801,230,5.113,252,6.276,255,6.596,278,4.356,293,4.53,297,4.591,311,6.933,366,7.795,437,6.352,447,10.323,512,6.625,527,8.322,541,7.892,545,4.483,550,9.16,693,7.249,736,6.061,739,10.464,996,7.325,1007,8.505,1116,8.044,1317,11.325,1729,12.345,2170,14.163]],["keywords/386",[]],["title/387",[196,421.191,202,416.281,938,1060.767]],["content/387",[7,4.937,25,1.375,45,4.487,106,10.873,110,6.976,152,3.149,186,4.675,196,6.435,198,4.225,234,7.315,297,4.487,308,5.119,401,7.084,447,10.088,466,8.25,529,8.951,536,5.423,549,8.312,560,8.375,614,6.84,869,10.371,884,9.211,958,7.315,986,10.873,996,7.159,1014,13.84,1077,8.951,1196,10.371,1233,13.254,1237,11.512,1305,11.067,1420,14.624,2094,11.772,2171,15.815,2172,10.693,2173,15.815,2174,15.815,2175,11.772,2176,12.397]],["keywords/387",[]],["title/388",[191,471.331,879,610.406]],["content/388",[25,1.552,33,2.477,37,2.368,44,3.927,68,7.411,70,3.439,85,6.793,97,6.725,105,7.646,106,9.695,107,3.464,181,3.758,182,2.814,185,4.627,190,6.597,193,5.65,195,7.468,198,3.767,222,3.845,264,4.088,278,3.796,284,5.002,301,3.214,334,4.066,437,5.535,474,8.133,481,7.774,531,7.709,537,4.622,541,6.877,565,7.982,639,6.712,648,8.88,861,6.559,883,7.646,886,5.037,888,7.357,952,7.982,1015,10.757,1030,6.92,1056,8.88,1065,8.296,1151,9.118,1153,12.341,1168,9.248,1418,11.054,1643,11.402,1697,7.982,2177,14.102,2178,9.868,2179,10.757]],["keywords/388",[]],["title/389",[7,299.457,25,63.794,33,124.043,185,231.733,1501,548.009,2180,887.06]],["content/389",[]],["keywords/389",[]],["title/390",[33,202.738,1501,895.677]],["content/390",[1,3.429,4,1.268,5,1.661,6,1.834,9,3.521,19,2.307,25,0.512,33,2.924,45,2.183,46,2.491,65,2.522,67,3.096,69,2.402,86,3.109,97,4.296,98,3.296,106,5.29,113,3.579,114,5.507,151,2.374,152,2.436,161,2.431,182,1.535,189,10.3,192,2.587,198,2.056,246,2.431,273,4.424,278,2.071,293,2.154,310,3.483,378,4.623,381,3.948,395,3.235,396,2.514,432,4.044,503,10.031,514,2.758,536,2.638,539,3.579,543,2.85,551,3.502,554,3.684,557,3.057,559,7.805,573,5.29,580,3.54,630,4.498,631,8.871,639,3.662,642,3.447,715,5.728,716,2.778,737,2.587,745,4.206,856,4.975,857,3.957,907,4.729,936,3.825,942,7.352,950,5.122,954,8.005,963,2.972,991,4.242,1082,5.122,1111,5.29,1147,4.242,1171,5.29,1183,6.745,1196,5.046,1207,4.438,1219,3.707,1294,6.449,1327,8.128,1356,7.805,1365,5.601,1479,4.316,1501,13.753,1589,5.728,1663,4.278,1749,5.87,1822,9.107,1823,6.032,1989,5.728,2025,6.221,2075,5.87,2104,6.449,2142,7.116,2165,10.299,2181,6.734,2182,10.708,2183,5.601,2184,6.449,2185,7.695,2186,7.116,2187,7.116,2188,7.116,2189,7.116,2190,7.116,2191,12.236,2192,6.221,2193,7.695,2194,6.221,2195,7.695,2196,7.116,2197,6.032,2198,7.116,2199,7.695,2200,7.695,2201,7.695,2202,7.695,2203,5.046,2204,7.695,2205,7.695,2206,5.728,2207,7.116,2208,7.695,2209,7.116,2210,7.116]],["keywords/390",[]],["title/391",[51,284.834,185,287.538,503,630.307,1631,673.714]],["content/391",[4,1.092,5,2.275,6,1.02,12,3.674,22,2.765,23,3.78,32,3.921,33,1.362,34,3.566,40,4.022,44,2.934,51,2.521,65,3.453,68,5.537,97,3.699,105,5.712,107,3.826,124,3.946,151,5.716,161,4.92,167,4.579,176,3.845,185,3.762,198,2.814,223,5.418,271,3.737,330,2.533,373,4.017,389,5.418,394,5.343,396,3.442,424,6.812,492,7.124,496,4.257,503,11.567,631,9.071,660,5.91,688,6.401,697,6.721,716,3.804,811,7.842,857,8.009,888,5.496,954,11.48,1183,5.808,1219,5.075,1479,5.91,1501,8.897,1540,6.553,1649,8.259,1746,8.259,1989,7.842,2180,9.743,2183,11.337,2184,13.053,2196,9.743,2211,9.22,2212,10.536,2213,14.402,2214,13.63,2215,13.053,2216,6.812,2217,10.536,2218,15.575,2219,10.536,2220,9.22,2221,10.536,2222,8.518,2223,10.536,2224,10.536,2225,10.536,2226,8.259,2227,9.22]],["keywords/391",[]],["title/392",[5,292.154,25,89.993,503,716.592]],["content/392",[4,1.306,5,3.69,6,0.947,7,1.012,9,1.483,12,5.137,14,1.218,19,1.753,20,1.452,22,2.566,23,4.157,24,2.018,25,0.65,32,4.083,33,1.033,34,4.417,35,0.929,36,1.691,37,1.341,44,2.224,45,0.919,46,1.049,49,1.525,51,1.912,63,1.752,65,1.062,69,1.012,107,0.796,108,1.691,111,1.223,113,1.508,121,1.947,151,1,152,3.108,154,1.191,155,1.743,158,2.041,161,1.024,162,2.824,164,4.626,167,4.25,171,1.527,173,1.927,185,0.783,190,1.516,191,2.402,196,1.009,198,1.562,201,1.252,222,0.884,224,3.426,230,1.024,246,3.089,264,1.695,271,2.074,275,2.66,281,1.257,289,3.716,291,1.552,293,0.907,301,0.739,308,1.049,311,1.388,334,2.303,355,1.277,362,2.191,364,1.757,371,1.691,373,3.251,381,1.046,396,2.61,405,1.667,408,1.072,414,1.267,419,3.553,425,1.166,503,11.512,512,1.327,513,5.813,531,3.196,539,1.508,543,1.2,551,1.475,563,1.388,572,2.089,590,1.382,596,2.268,630,5.05,631,5.695,639,1.543,668,1.679,695,1.601,711,1.375,716,2.111,718,1.315,737,1.966,758,4.887,765,3.205,770,2.888,771,7.102,772,2.426,773,4.453,774,3.196,776,2.783,777,1.444,780,3.096,806,3.848,857,1.667,886,1.158,888,4.168,907,1.992,910,1.304,936,1.611,942,1.947,954,1.703,958,2.705,963,1.252,994,1.743,1028,4.607,1077,5.535,1125,6.843,1141,3.835,1157,1.927,1164,1.992,1173,1.927,1183,1.787,1191,2.068,1193,2.472,1219,1.561,1220,1.852,1242,2.541,1309,4.601,1313,1.927,1320,1.743,1339,2.619,1354,3.553,1356,8.764,1359,2.472,1399,2.541,1403,2.312,1479,3.28,1501,5.587,1526,4.367,1614,1.655,1617,1.691,1631,5.535,1663,1.802,1713,6.126,1726,1.743,1783,2.228,1852,2.716,2037,2.997,2072,2.836,2079,1.852,2183,4.257,2203,3.835,2216,8.15,2228,4.46,2229,3.241,2230,3.241,2231,3.241,2232,3.241,2233,3.241,2234,3.241,2235,3.241,2236,2.716,2237,7.989,2238,3.241,2239,2.359,2240,2.997,2241,2.472,2242,2.541,2243,2.716,2244,5.407,2245,4.46,2246,2.997,2247,3.241,2248,3.241,2249,2.541,2250,4.584,2251,2.997,2252,3.553,2253,6.501,2254,4.522,2255,2.312,2256,3.241,2257,3.241,2258,3.241,2259,2.836,2260,3.241,2261,3.241,2262,3.241,2263,3.241,2264,2.997,2265,3.241,2266,2.997,2267,5.847,2268,5.847,2269,3.241,2270,3.241,2271,5.847,2272,3.241,2273,3.241,2274,3.241,2275,3.241,2276,3.241,2277,3.241,2278,3.241,2279,3.241,2280,5.847,2281,3.892,2282,3.241,2283,3.241,2284,2.716,2285,5.847,2286,2.62,2287,2.997]],["keywords/392",[]],["title/393",[86,480.967,1501,679.981,2288,804.809,2289,885.975]],["content/393",[4,1.103,5,2.298,16,5.473,22,2.793,23,3.135,25,1.044,32,2.252,33,1.376,63,2.334,65,3.488,69,3.323,86,7.532,92,4.538,105,5.771,106,7.317,122,4.672,151,3.284,161,3.362,182,2.124,186,3.146,189,9.517,191,3.2,204,8.82,219,5.833,222,2.902,232,6.327,264,3.086,273,3.441,293,2.979,341,6.327,398,3.986,407,5.19,421,5.512,426,6.62,503,9.87,514,3.815,539,4.951,543,3.942,551,4.843,554,5.096,562,6.138,592,6.467,630,3.913,642,4.767,648,6.702,716,6.729,736,3.986,901,8.373,936,7.8,942,6.395,982,5.68,1033,7.748,1074,5.818,1110,6.08,1219,5.127,1327,5.68,1501,13.11,1697,6.024,1705,8.605,1981,7.084,2288,7.197,2289,16.327,2290,18.639,2291,10.644,2292,10.644,2293,10.644,2294,10.644,2295,9.314,2296,9.314,2297,10.644,2298,10.644,2299,10.644,2300,10.644]],["keywords/393",[]],["title/394",[33,124.043,49,451.293,1327,511.905,1501,548.009,1651,553.247,2060,731.722]],["content/394",[5,2.789,12,4.505,19,2.471,20,3.692,22,3.39,23,3.674,32,4.144,34,2.958,46,2.668,49,3.878,68,6.789,70,2.01,86,3.331,107,3.173,114,4.631,151,2.543,152,4.324,155,2.457,156,4.365,161,2.604,162,2.914,164,2.589,173,4.9,186,2.436,189,9.208,191,2.478,193,3.303,219,3.064,234,3.813,273,3.494,301,1.879,341,9.47,371,4.3,373,3.332,388,4.624,398,3.087,405,6.643,481,4.544,503,11.001,520,5.847,533,4.666,543,3.053,592,7.849,597,6.461,631,7.524,642,5.787,673,4.3,689,7.062,754,6.461,764,4.506,806,3.971,861,3.834,888,4.3,898,5.667,901,3.147,902,4.709,911,5.258,926,4.209,982,4.399,1007,6.789,1058,4.269,1164,5.066,1219,3.971,1327,4.399,1333,6.136,1391,6.664,1399,6.461,1501,4.709,1602,5.008,1606,5.667,1737,7.214,1931,5.191,2060,6.288,2063,6.908,2126,5.487,2250,6.461,2288,8.735,2289,11.858,2295,7.214,2296,7.214,2301,5.258,2302,7.214,2303,4.433,2304,6,2305,8.243,2306,8.243,2307,8.243,2308,5.191,2309,8.243,2310,8.243,2311,7.622,2312,8.243,2313,8.243,2314,8.243,2315,8.243,2316,8.243,2317,8.243,2318,8.243,2319,8.243,2320,8.243,2321,10.032,2322,7.214,2323,7.622,2324,8.243,2325,7.622,2326,8.243,2327,8.243,2328,8.243,2329,7.622]],["keywords/394",[]],["title/395",[60,444.09,62,509.904,63,261.029,503,630.307]],["content/395",[5,3.173,6,1.423,33,1.901,37,2.468,44,4.093,60,8.289,61,7.906,121,8.832,152,3.922,186,4.345,188,8.245,222,5.371,246,4.644,273,4.32,322,5.404,341,8.738,381,4.743,396,6.436,409,9.376,428,7.906,440,6.799,503,10.431,520,6.653,557,5.84,558,11.522,693,6.584,695,7.259,714,9.784,736,5.505,737,4.942,894,5.633,926,7.506,931,8.738,963,5.677,990,11.522,991,8.103,1219,7.08,1220,8.397,1235,11.884,1501,8.397,2330,11.884,2331,11.884,2332,14.699,2333,14.699]],["keywords/395",[]],["title/396",[60,504.882,901,516.562,1501,773.065]],["content/396",[4,1.758,5,3.203,6,1.148,7,2.308,16,6.095,19,2.217,20,3.312,33,0.956,46,2.394,52,2.037,54,3.214,60,8.327,63,2.599,65,2.424,69,2.308,76,4.396,85,3.562,88,4.064,94,7.372,97,4.161,107,1.816,154,2.718,171,1.931,182,1.475,185,3.583,189,8.664,201,2.856,219,2.749,222,2.016,227,3.802,273,1.622,293,2.07,310,3.347,314,2.623,349,4.781,375,6.183,391,3.724,396,3.873,398,4.439,400,5.337,405,3.802,466,3.858,472,12.982,482,6.479,503,8.985,512,4.852,514,2.651,519,3.977,527,6.095,531,4.042,551,3.365,554,3.54,557,4.71,627,5.796,656,4.396,693,3.312,695,3.652,716,2.67,718,3.001,761,5.383,771,2.963,785,3.615,792,4.265,863,6.836,894,4.542,895,6.197,901,4.525,907,4.544,943,3.886,944,4.148,954,3.886,963,5.73,1030,5.816,1164,4.544,1166,4.849,1169,3.383,1207,4.265,1219,5.709,1320,7.979,1327,7.916,1341,15.015,1356,9.463,1378,4.599,1435,5.504,1501,9.693,1558,4.544,1571,5,1610,7.372,1646,4.922,1688,6.838,1737,10.373,1975,10.373,1989,5.504,2007,6.471,2181,6.471,2192,5.978,2209,10.96,2210,10.96,2288,5,2289,14.752,2330,5.978,2334,11.628,2335,11.853,2336,5.978,2337,7.395,2338,7.395,2339,6.838,2340,7.395,2341,7.395,2342,11.853,2343,7.395,2344,5.978,2345,7.395,2346,7.395,2347,7.395,2348,7.395,2349,7.395,2350,7.395,2351,6.838]],["keywords/396",[]],["title/397",[5,256.976,25,79.157,60,444.09,503,630.307]],["content/397",[5,3.057,19,2.07,22,1.812,23,4.201,25,0.459,32,4.284,33,0.893,34,3.733,60,8.134,88,2.367,152,1.375,155,3.343,162,2.441,164,4.447,167,3.001,171,1.803,201,2.667,219,2.566,252,2.677,291,3.306,298,3.388,341,4.104,503,10.173,514,2.475,557,5.627,580,3.176,630,2.538,716,2.493,737,6.029,758,2.986,765,4.642,771,2.766,773,5.581,774,3.774,775,3.306,806,3.326,829,10.37,894,2.646,901,2.636,1033,5.026,1111,4.747,1114,3.525,1140,5.139,1147,3.806,1148,4.831,1219,3.326,1276,3.656,1280,11.101,1309,5.276,1320,3.713,1341,9.067,1501,6.407,1526,6.131,1711,4.528,1970,4.924,2118,4.668,2216,4.464,2236,5.786,2244,6.384,2246,6.384,2249,5.412,2288,9.575,2289,12.136,2295,6.042,2296,6.042,2330,5.582,2352,6.042,2353,4.924,2354,5.786,2355,6.904,2356,5.582,2357,19.21,2358,5.582,2359,5.582,2360,13.182,2361,5.786,2362,5.582,2363,5.786,2364,5.786,2365,11.215,2366,6.384,2367,6.384,2368,6.384,2369,14.162,2370,14.162,2371,14.162,2372,14.162,2373,14.162,2374,6.042,2375,6.904,2376,5.139,2377,5.026,2378,6.042,2379,6.904,2380,6.904,2381,5.026,2382,6.384,2383,9.399,2384,6.904,2385,6.904,2386,6.384,2387,6.904,2388,6.904]],["keywords/397",[]],["title/398",[33,137.374,60,396.364,936,528.056,1327,566.919,1501,606.904]],["content/398",[4,0.486,5,1.752,6,0.455,9,2.148,23,4.222,32,4.655,33,0.607,34,3.299,37,0.788,40,1.792,49,2.209,60,6.67,61,2.525,63,2.35,65,1.539,67,1.889,69,1.466,79,2.486,103,2.092,107,1.993,108,2.449,122,2.061,134,2.657,151,2.503,155,1.399,161,4.031,162,4.51,164,5.876,167,3.526,171,2.119,173,2.791,185,1.134,189,4.143,193,1.881,201,1.813,204,2.221,219,1.745,222,1.28,228,2.05,246,1.483,273,2.798,291,2.248,298,5.258,341,9.374,389,2.414,396,1.534,398,1.758,405,2.414,407,2.289,452,2.172,458,2.184,490,1.865,503,9.908,514,1.683,519,7.75,520,3.672,543,5.336,557,3.224,590,2.002,600,4.364,660,2.633,674,3.924,694,5.326,703,3.997,716,1.695,758,2.031,775,2.248,804,5.192,805,7.026,806,5.161,818,6.039,894,1.799,901,5.5,926,2.397,937,2.05,950,3.125,963,1.813,1219,5.161,1224,2.734,1327,7.689,1501,7.289,1526,4.435,1631,2.657,1651,2.708,1931,2.956,1961,4.823,1969,3.68,1993,3.174,2060,3.581,2079,2.682,2161,3.581,2288,3.174,2289,11.737,2311,7.503,2352,9.376,2383,13.215,2389,3.935,2390,4.108,2391,4.695,2392,11.799,2393,8.114,2394,10.714,2395,8.114,2396,6.8,2397,10.714,2398,8.114,2399,12.759,2400,4.695,2401,4.695,2402,10.714,2403,12.759,2404,4.341,2405,4.695,2406,10.714,2407,4.695,2408,8.114,2409,8.114,2410,8.114,2411,8.114,2412,8.114,2413,8.114,2414,14.409,2415,11.799,2416,4.695,2417,4.695,2418,4.341,2419,4.695,2420,4.341,2421,3.494,2422,3.796,2423,4.695,2424,3.796,2425,4.695,2426,4.108]],["keywords/398",[]],["title/399",[63,343.83,2427,1195.939]],["content/399",[4,1.369,12,4.605,20,5.916,30,6.214,33,1.708,63,4.978,65,4.329,70,4.466,97,4.637,107,4.498,152,2.63,185,4.424,186,3.904,187,8.117,206,4.702,222,4.994,240,4.089,264,5.309,373,3.406,375,6.89,419,8.025,462,5.248,474,7.617,512,5.407,569,6.481,663,11.588,785,4.028,864,8.662,888,6.89,902,7.545,912,6.89,1007,6.942,1081,8.117,1109,6.84,1164,8.117,1207,10.562,1238,9.243,1595,8.215,1634,13.061,1872,7.104,1977,12.214,2045,11.069,2102,10.679,2178,9.243,2284,15.348,2427,10.075,2428,15.348,2429,9.42,2430,11.069,2431,10.075,2432,13.208,2433,13.208]],["keywords/399",[]],["title/400",[63,296.762,273,296.762,901,516.562]],["content/400",[4,1.73,23,2.983,25,0.771,33,1.499,44,4.65,52,3.194,60,8.469,61,6.234,62,4.965,63,3.662,67,4.664,86,6.747,103,5.165,149,4.808,189,8.526,192,3.897,206,4.126,240,2.588,272,4.942,273,4.978,278,3.12,297,3.288,301,3.806,341,11.635,381,3.74,402,6.685,420,7.042,482,6.336,519,8.981,520,5.247,543,6.184,551,5.275,674,4.245,699,7.494,704,6.092,713,7.494,785,3.535,792,6.685,806,5.583,888,6.047,901,7.472,918,6.561,963,4.477,1030,8.194,1081,7.124,1134,6.561,1501,6.622,1602,10.145,2060,8.842,2321,7.299,2323,15.441,2383,9.714,2404,10.719,2434,11.591,2435,11.591,2436,10.144,2437,11.591,2438,11.591,2439,16.699,2440,11.591,2441,10.719,2442,11.591,2443,9.086]],["keywords/400",[]],["title/401",[63,343.83,954,824]],["content/401",[4,1.024,12,3.447,35,2.835,63,3.257,67,3.978,114,5.767,125,3.912,188,5.545,219,3.675,222,2.696,301,4.066,322,3.634,334,2.85,424,6.392,503,11.827,527,5.083,531,5.404,540,7.358,554,4.733,693,7.991,696,6.148,736,3.702,888,5.157,898,10.211,902,5.648,918,5.596,954,12.526,958,8.252,1000,5.317,1110,5.648,1134,5.596,1183,5.45,1501,8.485,1511,7.196,1713,5.36,2114,6.483,2184,8.285,2211,8.651,2214,8.651,2215,17.82,2222,7.993,2288,6.684,2325,9.142,2421,7.358,2427,7.541,2444,6.006,2445,8.651,2446,9.886,2447,9.886,2448,14.853,2449,9.142,2450,9.886,2451,9.886,2452,9.886,2453,9.886,2454,9.886,2455,9.886,2456,19.836,2457,9.886,2458,17.841,2459,7.993,2460,9.886,2461,17.841,2462,9.886,2463,9.886,2464,9.886,2465,9.886,2466,9.886,2467,8.285,2468,14.853,2469,9.886,2470,17.841,2471,14.853,2472,9.886,2473,9.886,2474,9.886,2475,9.886,2476,9.886,2477,9.886,2478,9.886]],["keywords/401",[]],["title/402",[63,296.762,514,485.1,866,796.106]],["content/402",[4,2.043,5,2.109,6,0.946,9,6.735,12,2.036,16,3.003,19,3.775,25,0.65,33,0.755,35,1.675,37,2.75,45,3.572,49,2.747,52,1.609,60,4.698,62,4.185,63,4.324,65,4.127,69,1.823,86,5.088,92,2.49,103,7.3,105,3.166,106,4.015,107,1.434,118,4.894,136,5.634,152,2.507,171,2.551,185,1.411,186,2.887,187,3.589,201,2.256,206,2.079,222,3.434,246,1.845,256,2.747,273,3.884,341,3.471,378,3.509,382,3.003,391,2.941,397,3.725,398,3.658,407,2.848,408,3.232,439,4.087,442,7.111,460,4.454,493,3.632,503,10.85,512,8.387,514,5.277,516,3.003,520,6.663,540,4.347,543,6.066,557,6.509,568,3.436,577,3.632,643,4.165,673,3.046,674,3.578,694,2.903,703,2.179,718,2.37,775,2.796,785,2.979,857,3.003,874,2.589,890,4.165,894,3.743,912,3.046,921,3.024,926,2.982,936,2.903,942,3.509,944,5.479,954,9.883,955,10.216,1029,7.111,1086,3.776,1119,3.368,1169,2.672,1219,6.066,1254,6.605,1300,2.686,1314,4.165,1320,3.141,1325,3.776,1327,10.035,1398,3.677,1501,9.358,1526,3.192,1571,6.605,1651,3.368,1663,3.247,1697,3.305,1713,3.166,1765,3.725,1825,10.181,1843,3.725,1869,4.347,2161,4.454,2181,5.11,2183,4.251,2184,4.894,2187,9.033,2188,9.033,2189,5.4,2190,5.4,2211,5.11,2213,5.4,2214,5.11,2215,4.894,2226,4.578,2253,2.763,2288,6.605,2289,7.271,2303,3.141,2321,3.677,2352,12.882,2392,5.4,2415,5.4,2418,5.4,2426,5.11,2479,5.84,2480,5.4,2481,5.84,2482,4.894,2483,4.578,2484,5.84,2485,5.84,2486,5.4,2487,9.769,2488,4.251,2489,7.111,2490,5.84,2491,9.769,2492,3.548]],["keywords/402",[]],["title/403",[6,115.243,330,286.181,435,544.573,2493,1190.303]],["content/403",[4,1.086,5,3.35,6,1.502,23,4.211,25,1.032,32,3.284,34,3.553,45,2.974,60,5.789,70,2.557,125,4.148,161,3.312,162,5.485,164,3.292,174,6.231,176,3.826,192,3.524,198,2.8,227,5.39,249,5.933,264,3.039,271,6.553,330,3.731,366,5.049,373,2.704,435,9.342,503,10.813,536,3.594,545,5.117,557,4.165,590,4.47,600,5.638,673,8.095,745,5.73,765,7.144,886,3.745,954,5.509,1111,7.207,1204,5.39,1280,8.217,1300,8.498,1309,7.3,1501,5.989,2062,6.978,2227,9.174,2358,8.475,2359,8.475,2362,8.475,2381,7.631,2382,9.694,2383,13.004,2386,9.694,2494,15.517,2495,6.601,2496,7.631,2497,10.483,2498,10.483,2499,10.483]],["keywords/403",[]],["title/404",[33,113.071,107,214.787,185,211.234,329,389.66,331,565.374,512,357.937,1501,499.534]],["content/404",[16,6.027,19,3.514,33,1.516,46,3.794,51,2.805,65,5.517,69,3.659,71,9.824,86,4.736,103,7.501,105,6.355,188,6.575,192,3.941,196,3.648,198,3.131,215,6.16,222,3.196,246,3.703,255,4.777,273,5,288,5.789,297,4.775,311,5.021,330,2.818,331,7.579,368,10.6,382,6.027,387,6.827,407,5.716,452,5.422,482,6.408,486,6.968,503,8.914,543,4.341,582,6.575,592,10.227,631,6.827,645,6.896,672,7.29,736,4.39,866,9.903,869,7.687,888,6.115,912,6.115,940,7.121,954,11.314,993,5.646,1000,6.304,1086,7.579,1109,6.071,1152,7.802,1268,6.071,1435,8.725,1501,6.696,1706,7.687,1722,8.533,1822,8.725,2222,13.61,2321,7.381,2500,18.214,2501,11.722,2502,5.826,2503,11.722,2504,16.833,2505,16.833,2506,11.722,2507,9.477,2508,9.477]],["keywords/404",[]],["title/405",[191,471.331,879,610.406]],["content/405",[4,1.967,23,2.894,25,1.667,125,7.513,366,9.145,398,7.11,523,10.212,596,13.286,885,13.821,1435,14.132,2509,18.986,2510,16.615,2511,18.986,2512,15.912,2513,18.986,2514,16.615,2515,14.132]],["keywords/405",[]],["title/406",[107,260.952,185,256.637,331,686.894,703,396.364,1228,757.671]],["content/406",[]],["keywords/406",[]],["title/407",[107,332.397,185,326.9,1237,985.073]],["content/407",[5,2.176,6,2.178,18,3.366,33,1.303,46,4.877,69,3.146,70,5.228,107,4.919,113,4.687,136,5.812,155,3.004,156,5.336,161,3.184,171,2.631,176,6.586,181,4.015,185,5.434,186,2.979,205,2.618,222,4.109,230,3.184,240,3.364,264,4.368,265,3.625,272,4.297,279,5.99,298,4.945,314,5.345,315,4.908,318,8.445,321,6.193,392,7.009,438,3.774,455,4.825,512,4.125,542,6.428,548,6.346,556,3.6,562,5.812,565,8.529,652,4.825,674,3.691,676,7.336,703,3.76,704,5.296,716,3.638,732,3.526,735,4.537,740,4.687,785,3.073,893,4.237,910,4.055,923,6.608,932,4.586,943,5.296,971,8.957,985,4.687,1022,11.811,1023,11.215,1067,6.814,1109,5.219,1142,7.336,1228,12.871,1233,8.445,1311,8.445,1339,4.514,1417,5.509,1419,7.687,1564,6.428,1595,6.267,1604,6.516,1719,7.899,1860,7.687,1961,5.99,2126,6.708,2179,7.687,2431,7.687,2516,7.501,2517,8.819,2518,10.077,2519,10.077,2520,9.319,2521,9.319]],["keywords/407",[]],["title/408",[107,292.374,185,287.538,1541,933.04,2522,1190.303]],["content/408",[0,1.65,2,1.114,4,1.12,5,1.637,6,1.605,7,2.367,9,1.392,10,3,19,0.912,25,0.202,33,1.205,37,2.664,46,0.985,51,4.257,52,2.978,53,1.285,58,3.414,60,1.135,62,1.303,63,3.115,69,1.724,70,1.849,82,3.864,84,1.624,86,1.229,87,1.919,88,1.043,97,1.068,98,5.18,103,1.356,107,4.37,109,1.967,114,1.605,121,3.318,122,1.335,124,1.139,147,1.941,149,1.262,152,1.509,154,2.787,162,3.295,175,1.892,176,2.015,181,1.471,182,0.607,185,4.298,186,1.632,191,1.66,192,3.133,196,0.947,199,2.644,200,5.3,201,2.133,202,0.936,204,1.44,205,4.123,206,1.966,217,1.087,222,2.067,227,1.564,228,1.329,230,0.961,240,1.233,246,2.944,248,2.994,252,1.18,256,2.598,264,3.133,265,1.986,269,2.55,271,1.079,272,1.297,273,1.211,275,1.013,278,1.486,287,3.768,288,1.502,289,1.415,291,1.457,293,1.546,297,0.863,301,0.693,304,2.781,308,3.498,315,0.991,322,1.118,329,2.461,331,1.967,347,1.4,356,1.415,359,2.215,371,3.955,373,1.955,381,0.982,385,2.777,387,1.772,389,3.899,392,1.415,393,1.636,395,3.188,396,3.045,398,1.139,402,1.755,404,2.321,405,2.839,407,1.484,413,2.86,416,2.025,424,3.57,427,1.118,438,2.068,442,4.02,443,6.635,447,1.941,452,2.554,465,4.11,467,1.075,482,1.663,484,3.097,489,2.265,490,1.209,491,2.215,492,5.126,493,1.892,496,3.766,498,3.434,510,1.543,512,1.245,514,1.091,524,3.621,531,1.663,537,0.997,539,2.568,541,1.484,543,1.127,551,1.384,556,1.973,561,2.598,563,2.366,579,6.026,589,2.129,607,1.65,613,1.072,636,1.663,638,1.755,645,1.79,659,1.4,660,3.097,672,5.796,673,1.587,674,1.114,675,4.335,685,4.02,692,1.553,693,3.396,694,1.512,695,2.727,696,1.892,699,1.967,703,5.627,704,1.599,708,4.774,711,2.343,716,1.994,717,2.644,718,1.235,719,5.212,727,2.129,740,1.415,761,2.215,775,1.457,785,0.928,792,1.755,827,1.87,855,1.808,861,1.415,864,4.972,870,4.329,873,1.828,874,4.791,886,1.087,887,1.772,888,1.587,892,1.87,893,2.322,912,2.881,918,1.722,920,1.611,921,1.576,931,1.808,932,1.384,940,1.848,941,2.265,943,1.599,944,1.707,958,1.407,982,1.624,1000,1.636,1006,1.848,1011,6.302,1012,6.407,1027,2.55,1030,1.493,1049,1.87,1057,2.46,1066,1.624,1119,1.755,1157,1.808,1160,1.543,1166,1.995,1167,2.092,1183,1.677,1193,2.321,1220,1.738,1227,1.995,1315,3.477,1320,2.97,1322,2.46,1323,2.385,1327,4.046,1329,2.8,1339,2.473,1384,2.092,1411,2.662,1413,2.55,1422,2.129,1427,4.046,1501,1.738,1526,1.663,1562,2.215,1602,3.355,1605,2.55,1608,4.329,1614,1.553,1617,1.587,1630,2.662,1703,4.02,1706,1.995,1707,3.938,1708,2.092,1713,5.053,1716,2.17,1721,2.55,1722,2.215,1726,1.636,1741,2.55,1744,2.813,1755,4.212,1766,2.025,1823,2.385,1843,1.941,1869,2.265,1933,2.385,1935,2.385,1969,2.385,2005,2.813,2022,2.55,2070,2.46,2118,2.057,2125,2.46,2126,2.025,2146,4.02,2172,3.734,2243,2.55,2253,2.613,2254,1.722,2281,2.025,2286,2.46,2321,1.916,2329,5.106,2331,2.46,2431,2.321,2444,1.848,2467,2.55,2483,2.385,2489,4.02,2500,2.813,2502,1.512,2523,3.042,2524,2.662,2525,4.832,2526,3.042,2527,2.813,2528,3.042,2529,5.522,2530,2.813,2531,4.832,2532,4.628,2533,2.662,2534,4.628,2535,2.813,2536,3.042,2537,2.813,2538,5.522,2539,2.55,2540,3.042,2541,2.321,2542,2.215,2543,3.042,2544,2.662,2545,3.042,2546,2.662,2547,3.042,2548,2.813,2549,3.042,2550,5.106,2551,2.813,2552,2.46,2553,3.042,2554,2.813,2555,2.662,2556,3.042,2557,3.042,2558,3.042,2559,3.042,2560,3.621,2561,3.042,2562,3.042,2563,3.042,2564,3.042,2565,3.042,2566,3.042,2567,4.628,2568,2.129,2569,3.042,2570,3.042,2571,3.042,2572,2.46,2573,3.042,2574,2.662,2575,3.042,2576,3.042,2577,2.662,2578,3.042,2579,3.042]],["keywords/408",[]],["title/409",[107,292.374,185,287.538,264,345.078,2301,759.279]],["content/409",[4,1.773,70,4.174,107,4.204,185,4.134,186,5.059,196,5.327,202,5.265,222,5.932,264,6.307,279,10.173,287,8.507,329,7.627,334,4.935,727,11.976,886,6.114,894,6.558,963,6.61,984,10.518,994,9.205,1192,10.644,1237,12.458,2301,10.917,2580,17.115,2581,17.115,2582,17.115,2583,13.416,2584,17.115,2585,17.115,2586,14.343]],["keywords/409",[]],["title/410",[70,330.023,401,606.144,893,568.994]],["content/410",[4,0.665,5,2.28,6,2.056,9,2.935,14,2.412,18,2.143,22,1.684,33,1.366,37,1.077,40,4.031,44,4.344,46,2.077,51,1.535,54,4.59,61,3.45,63,1.407,70,4.525,87,2.229,107,3.832,147,4.092,149,2.661,152,1.277,155,3.148,162,2.268,176,3.854,177,3.299,180,4.858,181,2.814,182,1.28,183,2.021,184,1.391,185,5.413,191,1.929,192,3.551,199,3.072,205,3.497,206,3.759,207,3.536,220,2.268,240,4.143,243,2.951,256,3.018,264,5.941,272,2.735,273,1.407,281,2.488,285,7.26,293,1.796,299,3.99,301,2.407,314,3.746,315,4.384,321,3.943,322,2.358,329,2.859,330,3.751,347,2.951,373,1.654,381,2.07,385,2.35,388,3.598,392,2.984,395,2.697,401,2.874,402,3.7,410,4.148,439,4.489,452,4.885,455,3.072,480,3.799,490,2.549,512,2.626,520,2.904,537,3.461,539,2.984,543,2.376,544,2.393,545,3.728,550,3.631,559,4.092,632,6.213,636,3.507,638,3.7,645,3.774,652,5.057,663,3.536,675,4.912,692,3.276,696,3.99,701,3.99,703,2.393,704,5.55,706,3.276,708,4.04,709,3.943,710,5.376,713,4.148,717,3.072,718,2.603,735,2.889,751,3.943,762,4.775,785,1.956,863,3.7,892,3.943,906,3.478,910,4.249,920,3.397,957,6.416,971,6.278,991,3.536,1011,4.338,1012,4.41,1023,4.775,1055,3.189,1058,3.322,1176,3.665,1177,3.943,1322,5.187,1330,5.029,1419,4.893,1476,5.932,1564,4.092,1603,4.893,1624,5.614,1652,5.614,1798,5.376,1846,4.67,2057,4.41,2062,4.27,2070,5.187,2126,4.27,2152,4.893,2172,4.338,2179,4.893,2301,6.737,2302,5.614,2583,5.029,2587,9.766,2588,4.67,2589,3.943,2590,5.614,2591,6.415,2592,5.932,2593,6.415,2594,6.415,2595,6.415,2596,5.932,2597,6.415,2598,4.893,2599,6.415,2600,5.932,2601,6.415,2602,5.614,2603,5.614,2604,6.415,2605,5.932,2606,5.614,2607,6.415]],["keywords/410",[]],["title/411",[196,421.191,401,606.144,893,568.994]],["content/411",[0,1.65,2,1.114,4,0.966,5,1.192,6,1.94,9,1.392,15,1.772,18,5.537,19,1.655,25,0.202,33,1.837,37,0.511,44,2.111,46,1.787,49,2.598,51,0.728,52,0.838,53,1.285,54,2.4,61,1.636,62,2.366,69,2.367,70,3.678,79,1.611,83,2.215,86,1.229,87,1.057,88,3.196,92,1.297,96,3.125,97,1.939,107,3.705,110,1.342,111,1.148,116,1.256,122,1.335,125,1.204,144,1.87,149,3.145,152,0.606,154,1.118,166,2.994,171,0.794,176,4.413,177,1.564,181,2.879,183,1.739,184,0.66,185,4.65,186,1.632,189,1.553,191,0.915,192,1.023,196,2.901,197,2.17,198,1.475,200,1.135,201,2.928,202,0.936,203,1.543,205,2.422,207,1.677,215,2.902,218,2.321,220,3.295,222,3.297,230,0.961,240,3.172,241,2.818,243,4.287,246,3.414,250,1.624,252,3.614,262,1.624,264,4.118,265,1.094,272,1.297,273,3.48,278,2.041,281,6.153,284,2.689,287,1.512,293,0.852,296,2.265,301,2.463,304,1.532,307,1.755,308,0.985,310,2.499,311,3.248,314,1.079,315,5.168,319,2.461,322,1.118,330,4.278,334,0.877,351,2.385,355,3.673,360,1.738,364,1.65,366,3.652,373,1.955,378,1.828,379,3.469,381,2.447,385,2.023,391,1.532,395,3.188,396,0.994,400,1.37,401,1.363,402,1.755,405,2.839,409,1.941,413,1.576,425,2.727,432,2.902,452,1.407,454,4.902,466,2.881,473,4.11,477,3.216,478,3.434,490,2.194,496,2.231,508,1.916,512,1.245,513,1.808,514,1.091,527,3.899,533,1.722,537,1.81,538,2.745,542,1.941,543,3.451,544,4.032,545,3.349,552,1.599,559,1.941,563,1.303,564,2.554,565,1.722,568,3.249,569,2.71,573,2.092,579,1.967,584,2.057,589,2.129,591,2.813,592,1.848,607,2.994,611,1.916,613,1.945,625,2.321,630,1.118,632,1.79,636,1.663,638,3.185,645,1.79,652,2.644,660,1.707,664,1.522,667,2.321,668,1.576,669,2.662,674,1.114,675,1.415,693,1.363,697,1.941,706,1.553,711,2.343,716,4.771,718,4.907,732,1.932,735,1.37,736,2.839,740,1.415,762,2.265,785,1.684,786,1.303,792,1.755,809,1.502,858,1.532,861,1.415,862,1.916,866,1.79,876,3.434,878,1.995,888,1.587,891,1.677,892,1.87,893,1.279,905,1.808,908,2.46,909,2.385,910,1.224,912,1.587,918,1.722,947,2.092,955,3.185,956,1.916,963,1.175,971,1.808,973,2.97,981,1.738,982,1.624,984,1.87,985,1.415,991,1.677,1007,5.679,1011,2.057,1012,2.092,1017,2.265,1030,1.493,1042,3.57,1058,1.576,1064,2.129,1066,2.947,1072,2.129,1075,2.265,1081,1.87,1108,2.057,1112,1.808,1115,2.215,1127,1.916,1142,2.215,1156,2.321,1157,1.808,1168,1.995,1169,1.392,1170,1.553,1174,1.848,1175,1.916,1199,2.385,1204,2.839,1219,1.465,1220,1.738,1237,2.215,1268,1.576,1272,2.215,1310,3.216,1339,1.363,1360,3.434,1395,2.265,1398,1.916,1444,1.44,1522,2.813,1562,2.215,1579,2.46,1595,1.892,1603,2.321,1606,2.092,1644,2.813,1710,2.321,1755,2.321,1779,2.092,1798,2.55,1821,2.025,1826,2.321,1850,2.17,1858,4.329,1860,2.321,1872,1.636,1902,1.87,1927,2.215,1934,2.813,1967,2.385,1970,2.17,1984,1.941,1985,2.662,2018,2.385,2060,2.321,2109,2.813,2138,2.662,2152,2.321,2281,2.025,2516,2.265,2517,2.662,2533,2.662,2552,2.46,2560,1.995,2572,2.46,2606,2.662,2608,5.106,2609,3.042,2610,2.662,2611,3.042,2612,2.17,2613,3.042,2614,3.042,2615,3.042,2616,2.662,2617,4.329,2618,3.042,2619,3.042,2620,3.042,2621,3.042,2622,3.042,2623,3.042,2624,2.321,2625,2.321,2626,2.662,2627,3.042,2628,2.321,2629,3.042,2630,3.042,2631,2.662,2632,3.042,2633,3.042,2634,3.042,2635,3.042,2636,3.042,2637,3.042,2638,2.321,2639,2.55,2640,3.042,2641,3.042,2642,2.46,2643,3.042,2644,3.042,2645,2.662,2646,3.042]],["keywords/411",[]],["title/412",[107,292.374,185,287.538,703,444.09,1164,731.52]],["content/412",[2,0.898,4,1.535,5,0.979,6,2.01,7,0.399,9,2.074,10,0.506,11,0.839,12,0.446,14,0.922,18,0.819,19,2.57,20,1.099,22,0.928,23,2.837,25,0.163,30,1.154,32,0.271,33,1.551,37,1.321,40,2.719,44,4.028,46,1.144,49,2.568,51,1.704,52,0.974,60,0.915,61,1.319,62,0.548,63,1.197,64,0.865,65,1.158,67,1.422,69,1.103,70,3.528,71,1.072,78,1.072,79,0.677,84,0.683,85,0.616,87,0.852,88,1.872,92,0.545,94,0.795,97,0.449,100,0.908,105,0.693,107,3.872,108,0.667,110,3.142,111,1.711,113,0.595,114,1.027,121,1.474,124,0.479,125,0.506,136,2.038,148,0.738,149,0.531,151,0.757,152,1.418,155,1.053,156,1.299,158,0.805,161,1.116,162,0.452,164,0.77,167,1.066,171,0.641,173,0.76,176,3.129,177,1.261,179,1.219,181,2.624,182,0.255,184,1.707,185,4.496,186,1.34,188,1.376,189,0.653,191,1.363,192,2.882,193,0.512,194,0.745,196,2.45,197,0.912,198,0.944,199,1.174,200,0.915,201,2.109,202,0.393,204,3.37,205,4.314,206,3.506,207,3.484,208,1.341,215,1.289,220,1.93,222,1.723,224,0.388,225,5.055,226,2.315,227,2.331,228,0.559,229,1.376,230,2.25,231,2.521,234,1.135,236,2.43,237,2.318,239,0.653,240,3.52,241,2.349,242,0.705,243,1.626,246,1.997,248,1.33,252,0.951,255,1,256,0.602,262,1.309,263,1.034,264,4.655,265,0.46,271,1.254,273,1.88,277,2.038,278,2.308,285,0.879,289,0.595,292,1.003,293,0.687,297,1.003,298,1.734,301,1.244,304,3.587,306,0.912,311,0.548,315,5.036,319,2.02,322,3.393,325,0.895,329,2.02,330,1.892,334,2.054,347,1.128,351,1.003,355,2.807,357,0.912,359,3.3,360,0.731,366,0.616,372,0.827,373,1.169,377,1.923,379,0.585,381,1.14,382,0.658,385,0.468,386,0.931,387,2.058,388,1.376,390,0.952,391,1.235,393,0.688,395,2.995,396,0.801,398,1.324,400,1.104,401,1.099,402,1.415,404,0.976,405,2.331,409,2.254,410,0.827,413,1.27,414,0.959,417,1.104,421,2.827,423,1.508,426,1.526,427,2.007,433,0.931,435,3.258,437,2.143,440,1.135,452,1.635,454,1.586,455,1.174,458,1.141,462,0.508,466,0.667,468,0.585,475,1.183,476,0.777,478,0.795,480,0.46,481,0.705,482,0.699,484,0.717,486,0.76,493,0.795,498,1.526,500,0.895,501,0.658,503,0.677,514,0.458,515,0.632,516,0.658,520,0.579,524,0.839,527,0.658,531,3.455,533,1.388,535,1.003,537,0.419,541,1.196,544,1.319,545,0.979,546,1.034,552,0.672,553,0.573,556,0.457,559,0.816,561,0.602,563,0.548,564,1.135,565,1.388,571,0.839,573,0.879,576,1.072,577,0.795,579,1.586,581,1.041,582,0.717,587,0.816,589,0.895,593,1.003,606,1.003,607,0.693,613,0.864,621,0.912,625,0.976,628,3.09,629,1.034,630,0.47,631,1.429,632,3.212,636,1.932,638,0.738,639,0.609,640,0.912,642,0.573,648,0.805,650,1.415,652,0.612,656,0.76,660,0.717,661,0.816,663,1.948,664,1.227,668,3.273,669,1.119,673,1.844,677,1.003,683,0.895,692,1.253,693,0.573,697,2.892,698,0.827,701,0.795,703,1.319,705,0.745,716,0.886,720,0.976,726,0.931,727,2.473,732,2.492,736,2.367,737,0.43,740,1.644,745,3.455,765,1.158,772,1.017,773,0.504,775,0.612,786,1.942,787,0.62,789,1.072,808,1.072,855,1.458,856,0.827,858,1.235,860,0.777,861,1.141,864,0.839,865,0.839,876,2.198,880,0.976,886,0.457,888,1.28,889,0.865,891,0.705,893,0.538,894,0.49,896,1.072,902,0.731,907,2.172,910,0.515,911,1.565,912,2.365,914,0.602,915,0.952,921,0.662,922,0.976,931,0.76,932,1.116,935,1.034,940,0.777,941,0.952,943,0.672,944,0.717,946,1.183,952,0.724,954,1.857,957,1.49,958,2.525,963,0.494,969,1.659,970,0.976,971,2.101,972,0.839,985,3.313,989,0.912,993,0.616,999,0.931,1000,1.319,1006,0.777,1010,1.034,1021,2.936,1024,1.663,1026,0.976,1027,1.072,1030,1.204,1031,0.931,1033,0.931,1039,0.976,1065,0.752,1066,0.683,1072,2.473,1074,0.699,1081,0.786,1085,1.072,1086,0.827,1102,0.952,1103,0.895,1108,0.865,1109,0.662,1112,0.76,1113,0.931,1116,1.757,1118,0.827,1123,0.952,1126,0.952,1127,0.805,1150,1.003,1151,0.827,1155,0.865,1156,0.976,1157,0.76,1160,1.244,1164,3.884,1166,1.609,1169,1.617,1174,1.49,1180,0.768,1189,1.526,1207,0.738,1220,0.731,1227,2.318,1235,1.034,1238,1.717,1261,1.565,1262,1.508,1298,0.768,1301,1.119,1304,1.072,1305,0.895,1309,1.154,1310,4.993,1315,2.225,1326,3.355,1329,2.299,1332,0.688,1333,0.952,1399,1.003,1400,0.717,1403,0.912,1408,1.119,1411,1.119,1422,0.895,1427,0.683,1438,1.034,1444,0.605,1501,0.731,1516,1.183,1536,0.895,1541,1.003,1542,1.119,1547,0.851,1551,1.983,1558,1.508,1560,1.686,1562,1.786,1563,1.072,1571,0.865,1582,1.826,1595,0.795,1606,0.879,1609,1.034,1611,0.952,1619,2.147,1623,0.865,1631,0.724,1633,1.401,1651,0.738,1656,0.851,1671,1.034,1686,1.786,1690,0.912,1695,1.119,1704,0.805,1708,0.879,1711,0.839,1713,3.427,1747,0.865,1749,0.976,1757,2.147,1779,2.43,1792,0.879,1811,0.931,1826,0.976,1827,0.717,1846,0.931,1847,1.826,1848,1.003,1850,0.912,1856,0.931,1858,1.003,1860,3.458,1863,1.003,1869,1.826,1872,1.319,1874,1.034,1890,1.923,1931,0.805,1936,1.072,1940,1.983,1965,2.473,1966,1.717,1988,1.983,1993,1.659,2000,0.952,2012,1.183,2030,1.119,2031,0.912,2043,0.931,2044,1.119,2045,1.072,2057,1.686,2065,1.034,2089,0.839,2111,1.633,2127,1.119,2130,0.839,2131,1.474,2172,0.865,2175,0.952,2176,1.003,2220,3.093,2250,1.003,2281,1.633,2284,1.072,2303,0.688,2304,0.931,2331,2.857,2334,1.003,2421,1.826,2422,1.983,2426,2.147,2431,0.976,2483,1.003,2512,1.072,2516,1.826,2525,1.119,2534,2.056,2539,1.072,2550,2.268,2560,2.973,2567,1.072,2598,1.871,2603,1.119,2608,1.183,2617,1.003,2626,1.119,2628,0.976,2647,1.279,2648,1.279,2649,1.183,2650,1.279,2651,0.931,2652,2.268,2653,1.119,2654,1.279,2655,1.279,2656,2.268,2657,1.279,2658,2.453,2659,1.279,2660,1.183,2661,1.279,2662,1.279,2663,1.279,2664,1.279,2665,1.279,2666,1.279,2667,2.056,2668,1.279,2669,0.865,2670,1.279,2671,0.839,2672,1.279,2673,2.147,2674,1.279,2675,1.183,2676,1.119,2677,0.895,2678,1.279,2679,1.279,2680,1.279,2681,1.279,2682,1.279,2683,1.119,2684,1.279,2685,1.279,2686,1.279,2687,2.268,2688,1.183,2689,1.279,2690,2.147,2691,1.183,2692,1.717,2693,0.912,2694,1.183,2695,1.183,2696,1.279,2697,2.453,2698,2.268,2699,1.279,2700,2.453,2701,1.279,2702,2.268,2703,2.453,2704,1.279,2705,1.072,2706,1.279,2707,0.976,2708,1.003,2709,1.072,2710,1.279,2711,1.279,2712,1.279,2713,1.183,2714,1.686,2715,1.183,2716,1.279,2717,0.976,2718,1.183,2719,1.072,2720,0.805,2721,2.268,2722,1.279,2723,2.268,2724,0.952,2725,1.279,2726,1.279,2727,1.279,2728,0.976,2729,1.183,2730,1.279,2731,0.976,2732,1.279,2733,0.912,2734,1.279,2735,1.279,2736,1.119,2737,1.279,2738,1.183,2739,1.183,2740,1.072,2741,1.871,2742,1.279,2743,1.279,2744,1.119,2745,1.279,2746,1.279,2747,1.183,2748,1.279,2749,1.279,2750,1.279,2751,1.003,2752,1.183,2753,1.183,2754,1.279,2755,1.279,2756,1.279,2757,1.183,2758,1.279,2759,1.279,2760,1.183,2761,1.279,2762,1.279,2763,1.279,2764,1.279,2765,1.279,2766,0.976,2767,2.268,2768,0.895,2769,0.976,2770,1.183,2771,0.976,2772,1.183,2773,1.119,2774,1.279,2775,1.183,2776,1.279,2777,1.279]],["keywords/412",[]],["title/413",[107,332.249,185,211.234,388,490.486,670,490.486,732,305.938,991,482.031]],["content/413",[86,8.116,107,4.933,177,10.328,185,4.852,407,9.794,496,8.116,586,14.95,891,11.072,1456,16.238,2651,14.62,2778,14.324,2779,12.343,2780,18.572]],["keywords/413",[]],["title/414",[181,360.573,314,480.028,581,574.278]],["content/414",[5,4.314,6,1.454,70,3.662,107,4.908,114,4.366,136,8.661,151,4.633,162,5.308,176,5.48,185,4.827,192,5.049,207,8.278,240,4.462,246,4.744,264,5.793,314,7.088,315,4.891,385,5.5,388,8.423,392,9.294,440,6.946,465,11.178,490,5.967,520,6.797,521,12.141,561,7.065,636,8.209,664,7.513,674,5.5,710,12.585,856,9.71,891,8.278,1564,9.579,1582,11.178,1617,11.715,2044,13.142,2781,11.178,2782,15.017,2783,9.124]],["keywords/414",[]],["title/415",[63,343.83,675,729.273]],["content/415",[6,1.444,18,4.98,70,3.636,107,4.885,149,6.184,176,5.441,185,3.602,240,3.329,315,4.856,321,9.163,334,4.299,385,5.461,391,7.51,392,9.25,455,7.139,484,8.363,494,11.373,544,5.563,545,4.13,569,7.316,630,5.481,674,5.461,675,6.935,708,9.389,717,9.522,785,4.547,861,6.935,866,8.771,876,9.273,893,6.269,910,5.999,923,9.777,1011,10.081,1012,10.25,1035,9.058,1079,11.373,1158,9.163,1175,9.389,1339,6.678,1617,7.778,2126,13.237,2304,10.853,2331,12.054,2624,11.373,2784,14.91]],["keywords/415",[]],["title/416",[225,485.1,226,690.985,322,497.46]],["content/416",[4,1.534,5,3.196,6,1.916,11,9.708,61,7.962,69,4.621,70,3.61,88,5.076,107,4.862,176,5.402,181,3.944,185,4.781,205,5.143,225,5.307,240,4.979,252,5.74,264,4.292,278,3.985,314,5.251,322,5.442,427,5.442,478,9.207,490,5.882,496,5.982,521,11.969,561,6.964,616,10.359,736,5.544,739,9.572,912,7.723,914,6.964,943,7.78,1236,11.604,1301,12.955,1617,10.325,1870,13.689,2539,12.407,2708,11.604,2785,13.689,2786,14.804,2787,14.804,2788,14.804,2789,14.804]],["keywords/416",[]],["title/417",[6,115.243,37,199.834,703,444.09,1022,933.04]],["content/417",[5,3.389,6,2.358,37,2.635,70,5.018,87,5.454,107,5.054,122,6.889,171,4.099,176,5.728,185,3.792,207,8.652,222,4.28,252,6.086,293,4.394,423,9.646,425,5.647,484,8.804,577,9.762,641,10.984,693,7.031,862,9.884,934,9.646,971,9.33,1007,8.249,1164,9.646,1378,9.762,1985,13.736,2111,13.694,2134,13.154,2331,12.69,2516,11.683,2673,13.736,2728,11.973,2790,15.696,2791,15.696,2792,15.696]],["keywords/417",[]],["title/418",[1110,1064.513]],["content/418",[3,5.273,4,1.188,6,1.11,21,6.611,44,3.192,67,4.613,70,4.04,107,4.778,144,10.181,181,5.183,185,4.699,195,6.07,207,6.319,222,3.126,256,5.393,264,5.639,265,4.124,301,2.613,304,5.774,306,8.176,314,4.066,388,6.43,395,4.82,401,5.135,423,10.181,452,5.303,457,7.751,478,10.303,521,9.268,532,6.676,533,6.488,536,3.931,537,3.757,541,5.59,545,3.175,551,7.538,561,7.793,564,5.303,565,6.488,615,9.607,645,6.744,650,6.611,664,5.736,692,5.854,693,5.135,732,4.011,737,3.854,785,3.496,875,6.07,894,4.393,901,4.376,910,4.613,921,5.937,937,5.007,941,8.533,957,10.064,971,6.814,985,5.332,1007,6.025,1147,6.319,1158,7.045,1227,7.518,1427,6.117,1560,7.881,1595,7.13,1623,7.751,1848,8.986,2089,7.518,2117,7.518,2179,8.744,2236,9.607,2617,8.986,2793,11.464,2794,11.464,2795,10.601,2796,11.464]],["keywords/418",[]],["title/419",[107,384.917,181,283.072,185,256.637,670,595.91]],["content/419",[0,4.172,4,1.268,5,1.661,6,1.68,30,3.62,46,2.491,63,1.687,70,1.877,87,2.674,107,5.392,114,2.237,121,4.623,151,2.374,152,1.532,176,5.559,181,5.636,182,1.535,185,4.873,191,2.313,196,2.395,198,2.056,200,2.871,201,2.972,202,2.367,205,1.999,222,2.098,225,2.758,226,3.929,241,2.86,264,3.547,265,2.768,269,6.449,272,3.281,276,7.434,284,2.73,287,3.825,297,3.471,301,2.789,304,6.163,314,4.34,315,2.506,326,6.032,371,6.383,377,6.032,385,2.818,388,4.316,392,5.691,401,3.447,425,2.768,452,3.559,480,2.768,490,3.057,497,6.734,516,3.957,537,2.522,548,4.845,553,3.447,569,3.776,573,5.29,613,2.711,615,6.449,636,4.206,645,4.527,667,5.87,676,5.601,688,4.675,697,4.909,704,4.044,706,3.929,707,5.203,718,3.123,740,3.579,785,2.347,786,3.296,860,4.675,861,3.579,884,4.482,922,5.87,943,4.044,996,3.483,1019,4.845,1022,6.032,1023,5.728,1067,5.203,1077,4.355,1112,4.574,1185,6.221,1228,5.488,1417,4.206,1441,16.905,1454,6.734,1456,12.315,1499,7.116,1614,3.929,1747,5.203,1755,5.87,2077,6.449,2146,5.601,2161,5.87,2179,5.87,2308,4.845,2521,7.116,2577,6.734,2586,10.254,2596,7.116,2720,4.845,2724,9.107,2773,6.734,2797,7.116,2798,12.236,2799,7.695,2800,7.695,2801,7.695,2802,7.695,2803,7.695,2804,7.116,2805,7.695,2806,7.695,2807,7.695,2808,7.695,2809,7.116,2810,7.695,2811,7.695,2812,7.695,2813,6.734,2814,7.695,2815,7.116,2816,7.695,2817,7.695,2818,7.695,2819,6.734,2820,7.695,2821,7.116,2822,7.695,2823,6.221,2824,7.695,2825,7.695,2826,7.695]],["keywords/419",[]],["title/420",[4,99.401,107,235.629,185,231.733,661,611.918,2308,604.061,2827,959.288]],["content/420",[0,4.523,4,1.881,14,3.136,25,1.068,28,3.608,33,1.686,37,1.401,45,3.699,46,2.7,63,1.829,65,2.734,67,5.247,70,2.034,79,4.417,99,2.939,103,3.717,107,4.838,110,8.007,151,2.574,162,2.949,181,4.278,185,5.453,190,3.902,192,4.384,196,4.997,201,3.222,202,2.566,222,2.275,225,2.99,246,4.119,247,7.714,264,4.654,273,1.829,278,2.246,293,2.335,298,4.094,301,2.972,304,9.142,311,3.574,315,4.247,321,5.127,329,3.717,330,3.135,331,5.394,366,4.018,397,5.321,402,4.811,433,6.072,452,3.859,512,3.415,519,4.487,536,2.86,537,2.734,544,3.112,548,5.253,551,3.796,554,3.994,568,4.908,573,8.965,613,2.939,627,6.539,674,3.055,676,6.072,689,4.56,716,3.012,732,2.919,763,4.26,827,5.127,857,4.29,861,3.88,931,4.959,944,4.679,991,7.188,1109,4.32,1112,4.959,1147,4.599,1187,5.394,1219,4.018,1384,5.735,1434,6.363,1456,6.744,1541,6.539,1563,6.991,1620,6.744,1621,7.3,1872,4.487,1891,5.838,1969,6.539,1984,5.321,2179,6.363,2308,5.253,2444,5.068,2567,6.991,2577,7.3,2624,6.363,2714,13.54,2780,7.714,2828,8.342,2829,8.342,2830,12.058,2831,8.342,2832,8.342,2833,8.342,2834,8.342,2835,7.714,2836,7.3,2837,11.412,2838,6.991,2839,13.04,2840,8.342,2841,8.342,2842,6.991,2843,8.342,2844,8.342]],["keywords/420",[]],["title/421",[107,332.397,185,326.9,331,874.956]],["content/421",[6,1.374,14,3.5,46,4.595,54,4.047,70,4.692,88,3.193,105,5.049,107,3.487,147,9.055,149,5.888,156,7.517,162,3.292,181,3.782,185,4.156,196,2.898,200,3.474,201,3.596,202,2.864,222,2.539,223,4.788,230,2.942,240,2.079,264,4.987,301,3.921,315,3.033,321,5.723,329,4.149,349,6.02,371,4.858,391,7.15,392,4.331,407,4.541,452,4.307,455,4.458,468,4.26,493,5.791,499,4.894,520,4.215,537,4.652,539,6.603,545,2.579,569,4.569,584,6.296,614,4.027,696,5.791,712,5.657,713,9.178,717,4.458,727,6.516,735,4.193,736,3.487,740,4.331,750,8.149,858,4.69,861,8.002,886,3.326,891,5.133,893,5.969,894,3.568,910,3.747,912,7.405,914,4.381,919,6.516,957,5.657,1006,5.657,1040,5.94,1058,8.909,1128,6.778,1161,7.299,1170,4.755,1191,5.94,1384,6.402,1422,9.933,1606,6.402,1755,7.103,1863,7.299,1869,12.804,1927,6.778,1984,5.94,2062,6.198,2301,10.973,2351,8.61,2429,6.641,2624,10.828,2625,7.103,2709,7.804,2845,7.528,2846,9.312,2847,7.804,2848,7.804,2849,9.312,2850,9.312,2851,9.312,2852,9.312,2853,9.312,2854,9.312,2855,9.312,2856,9.312,2857,9.312,2858,9.312,2859,9.312]],["keywords/421",[]],["title/422",[861,866.742]],["content/422",[4,2.132,25,1.368,33,2.03,35,4.501,97,5.51,107,6.496,181,4.182,182,3.132,185,5.884,188,8.804,240,3.505,248,11.155,297,4.453,318,13.154,432,8.249,1228,11.194,1326,9.646,1365,11.426,1434,11.973,1598,11.426,2194,12.69,2308,9.884,2507,12.69,2860,15.696,2861,12.304,2862,15.696,2863,15.696,2864,15.696,2865,15.696,2866,15.696]],["keywords/422",[]],["title/423",[4,99.401,182,191.399,256,451.293,275,319.419,621,684.146,884,558.686]],["content/423",[]],["keywords/423",[]],["title/424",[275,522.063,308,507.514]],["content/424",[5,4.213,6,2.136,10,5.735,18,4.842,30,6.819,37,2.433,51,4.67,70,4.759,176,5.29,192,4.873,196,6.074,200,7.281,202,4.459,206,5.16,240,3.236,275,4.826,293,4.057,308,6.317,385,5.309,396,4.736,438,5.428,439,10.143,440,9.026,466,7.561,527,7.453,539,6.742,556,5.178,557,5.759,614,6.269,630,5.328,643,10.337,664,7.252,694,7.205,697,9.246,773,5.712,785,4.42,894,5.555,895,12.148,914,6.819,965,9.015,1058,7.507,1219,6.982,1726,7.796,1975,12.685]],["keywords/424",[]],["title/425",[19,287.561,37,161.05,185,231.733,855,570.235,872,483.169,901,366.18]],["content/425",[4,2.31,5,3.196,6,2.305,19,4.438,23,3.781,32,3.133,62,6.342,113,6.886,125,7.832,275,4.929,308,4.792,462,5.882,468,6.773,479,8.895,486,8.8,536,5.076,717,7.088,879,5.763,881,10.776,897,9.708,901,5.651,902,8.457,926,7.559,937,6.465,1000,7.962,1656,13.174,1769,12.407,2867,18.302,2868,17.32,2869,18.302,2870,13.689,2871,14.804,2872,14.804,2873,13.689,2874,14.804,2875,14.804]],["keywords/425",[]],["title/426",[5,207.102,6,92.877,7,299.457,217,342.668,322,352.639,2036,751.955]],["content/426",[5,4.729,6,1.872,19,4.285,23,3.851,32,4.091,35,4.1,37,2.4,70,5.342,152,2.846,217,5.107,222,3.898,275,4.76,278,3.848,297,4.055,440,6.612,556,5.107,557,5.68,572,7.825,660,8.019,695,7.06,926,9.872,936,7.106,961,7.881,975,7.689,1033,10.406,1259,11.558,1262,8.786,1351,10.641,1479,8.019,2017,12.51,2036,11.206,2049,9.243,2095,10.004,2489,10.406,2768,10.004,2876,12.51,2877,14.296,2878,14.296,2879,14.296,2880,14.296,2881,14.296]],["keywords/426",[]],["title/427",[37,199.834,185,287.538,486,707.558,703,444.09]],["content/427",[3,3.948,5,3.529,6,2.135,9,3.927,12,2.993,20,3.844,33,1.11,37,2.238,51,3.19,60,4.974,63,4.377,70,2.093,76,5.102,92,3.659,98,3.677,114,2.495,136,4.95,167,5.794,171,2.241,182,2.66,183,2.703,186,3.941,191,2.58,196,2.671,204,4.061,217,3.066,219,3.19,222,2.34,246,5.164,252,3.328,265,3.088,272,3.659,275,7.794,279,5.102,281,5.17,289,3.992,298,4.212,308,4.316,311,3.677,322,4.901,334,2.475,371,4.477,379,3.927,389,4.413,390,6.388,391,4.323,393,7.171,440,3.97,446,6.388,458,3.992,499,9.687,516,6.856,556,3.066,557,3.41,563,3.677,636,4.692,643,6.121,664,4.294,685,6.248,695,6.584,698,5.549,703,7.447,713,5.549,716,3.099,720,6.547,751,5.275,785,5.621,787,4.159,866,7.843,910,3.453,911,5.475,926,4.382,939,6.939,940,5.214,945,6.728,955,4.95,963,3.315,994,4.616,1027,7.193,1066,4.58,1082,5.713,1164,5.275,1178,5.803,1236,6.728,1262,5.275,1320,4.616,1327,4.58,1526,4.692,2004,6.547,2049,5.549,2254,4.858,2281,5.713,2882,8.583,2883,8.583,2884,7.193,2885,8.583,2886,5.9,2887,7.936,2888,8.583,2889,8.583,2890,8.583,2891,8.583,2892,7.193,2893,7.936,2894,8.583,2895,8.583,2896,7.936]],["keywords/427",[]],["title/428",[4,123.338,79,630.307,275,396.341,452,550.572]],["content/428",[]],["keywords/428",[]],["title/429",[275,522.063,391,789.701]],["content/429",[4,1.413,5,2.945,6,1.813,7,4.258,19,4.089,25,0.907,37,3.59,51,3.264,52,5.159,53,5.762,63,2.991,86,5.512,87,4.74,152,2.716,179,6.78,252,5.289,255,5.559,275,8.031,278,3.672,308,4.415,334,3.933,393,7.336,413,7.064,437,5.354,440,6.309,467,4.822,514,4.89,527,7.014,529,7.721,556,6.689,557,7.44,564,6.309,626,10.405,699,8.819,874,6.047,914,6.417,921,7.064,961,7.519,963,5.268,1030,6.694,1114,6.965,1142,9.929,1378,8.484,1961,8.108,2095,9.545,2206,10.153,2488,9.929,2541,10.405,2897,13.641,2898,11.937,2899,12.613,2900,9.079]],["keywords/429",[]],["title/430",[4,162.462,275,522.063]],["content/430",[2,5.748,4,1.626,5,3.388,6,2.358,10,6.209,37,1.787,62,4.56,63,4.088,67,4.283,92,4.538,114,3.094,125,4.212,151,3.284,152,3.124,162,5.547,171,2.779,179,5.29,182,3.719,217,5.605,222,4.279,230,3.362,232,6.327,265,3.829,273,3.441,275,6.85,278,2.865,279,9.328,293,2.979,322,3.913,334,3.069,385,3.898,386,7.748,391,5.361,428,5.725,437,6.159,467,3.762,531,5.818,536,6.391,541,5.19,643,7.591,664,5.325,674,3.898,693,4.767,694,5.29,695,5.256,714,7.084,785,4.785,868,8.92,879,4.144,905,6.327,907,6.541,911,6.789,926,5.435,958,4.923,963,4.111,1000,10.025,1148,7.448,1395,7.922,1426,8.119,1427,5.68,1614,5.435,1672,8.605,1716,7.591,1751,7.591,1767,8.92,1787,8.343,2063,8.92,2551,9.842,2731,8.119,2887,9.842,2901,10.644,2902,10.644,2903,10.644,2904,10.644,2905,10.644]],["keywords/430",[]],["title/431",[4,110.083,7,331.64,275,353.746,308,343.888,381,342.83]],["content/431",[]],["keywords/431",[]],["title/432",[52,372.867,275,450.597,670,759.062]],["content/432",[4,1.451,5,3.023,6,1.356,23,2.593,25,0.608,33,1.183,37,3.201,44,2.547,49,4.304,52,6.822,60,3.413,61,4.92,62,3.919,63,3.071,67,5.635,68,4.808,73,4.671,86,3.696,110,6.178,116,7.027,152,1.821,164,2.873,179,4.547,182,1.825,183,5.359,186,2.704,202,5.234,217,3.268,222,2.494,231,6.524,256,4.304,265,3.291,273,4.181,275,7.217,278,3.77,293,2.561,297,2.595,310,4.141,322,6.255,329,4.076,330,2.199,334,2.638,370,5.76,371,4.772,381,2.952,391,4.608,405,7.201,437,3.59,462,3.635,474,5.276,519,4.92,525,4.808,527,4.704,531,7.655,537,2.998,551,4.163,556,6.078,557,6.761,569,4.489,584,6.185,660,5.131,670,5.131,698,5.915,703,3.413,705,5.328,741,5.558,872,4.608,898,6.289,907,5.622,918,5.178,931,5.438,935,7.396,963,3.533,987,5.915,992,6.524,1082,6.089,1164,5.622,1180,5.497,1197,6.402,1320,4.92,1405,8.006,1422,6.402,1597,8.006,1713,4.96,1965,6.402,1993,6.185,2095,6.402,2444,5.558,2527,8.459,2612,6.524,2713,8.459,2906,9.148,2907,8.459]],["keywords/432",[]],["title/433",[98,509.904,308,385.295,395,500.481,874,527.718]],["content/433",[4,1.404,33,1.752,41,9.163,46,4.387,63,4.088,84,7.232,87,7.405,97,4.758,98,5.805,110,5.978,114,3.94,230,4.281,234,6.268,265,4.875,287,6.736,291,6.488,293,3.793,308,7.789,322,4.982,370,8.534,385,4.964,395,5.698,396,4.428,401,6.07,408,4.484,413,7.018,462,5.385,467,4.79,514,4.858,531,7.408,536,6.392,581,7.911,621,9.665,622,5.499,874,11.025,930,12.531,973,7.289,992,9.665,1000,7.289,1028,7.816,1106,11.357,1171,9.317,1191,8.645,1747,9.163,1961,11.081,1970,9.665,2908,13.552,2909,12.531]],["keywords/433",[]],["title/434",[275,450.597,670,759.062,1766,900.729]],["content/434",[5,3.414,6,2.23,37,3.471,63,3.468,73,8.075,86,6.39,113,7.356,131,8.02,182,3.155,196,4.922,200,7.714,205,4.109,206,5.63,256,7.44,275,5.266,301,3.604,308,5.119,392,7.356,398,5.923,490,6.284,540,11.772,543,5.857,699,10.226,703,5.9,775,7.572,901,6.037,940,9.608,1236,12.397,1417,8.645,1766,15.333,2910,15.815,2911,15.815,2912,9.836,2913,11.772,2914,15.815]],["keywords/434",[]],["title/435",[75,874.956,275,450.597,670,759.062]],["content/435",[6,2.022,37,2.696,51,3.843,52,5.754,75,13.502,77,12.984,114,4.668,121,9.649,179,7.982,182,3.204,186,4.747,205,4.173,206,5.716,248,8.707,256,7.555,301,3.66,308,5.198,371,8.378,398,6.014,417,7.231,536,5.506,541,7.831,560,8.504,698,10.383,720,12.249,920,8.504,926,8.2,940,9.757,959,14.053,963,6.203,1408,14.053,1526,8.779,1604,10.383,1623,10.858,2915,16.059,2916,14.85]],["keywords/435",[]],["title/436",[275,450.597,670,759.062,2917,1184.242]],["content/436",[4,1.703,6,2.272,10,6.505,21,9.481,22,4.314,37,2.76,44,4.577,51,3.934,67,6.614,68,8.64,196,5.117,281,6.375,293,4.602,437,6.452,531,8.986,550,9.305,564,7.604,703,6.133,707,11.115,856,10.629,1047,11.967,1058,8.514,1156,12.539,1295,12.886,1751,15.121,1963,13.777,2062,10.942,2134,13.777,2917,18.554,2918,14.386,2919,16.439,2920,15.201]],["keywords/436",[]],["title/437",[58,495.646,99,476.718,104,914.982]],["content/437",[6,1.743,7,5.62,8,9.533,10,7.123,58,8.226,76,10.701,99,7.912,104,15.186,179,8.948,182,3.592,196,5.603,275,7.478,286,11.063,297,6.371,308,5.827,387,10.484,437,7.065,536,6.172,617,9.533,2921,16.646]],["keywords/437",[]],["title/438",[94,841.635,275,450.597,504,599.958]],["content/438",[3,7.622,6,1.604,7,5.173,8,11.285,28,7.167,37,2.782,58,6.069,94,13.254,114,4.817,155,4.939,184,3.593,251,11.849,265,5.961,275,8.281,291,7.934,308,5.364,394,8.403,504,10.444,590,7.065,985,7.707,1377,7.751,1636,11.595,1671,13.397,1935,12.989,2922,16.57,2923,13.887,2924,16.57]],["keywords/438",[]],["title/439",[51,323.825,275,450.597,947,930.333]],["content/439",[4,2.094,5,2.65,6,1.956,23,3.35,32,2.598,34,3.983,37,3.896,46,3.973,51,5.26,70,4.242,73,6.267,161,3.878,167,5.335,184,2.662,192,4.127,201,4.741,210,8.17,217,4.384,219,4.562,275,5.792,293,3.436,297,3.482,308,7.511,315,3.998,381,5.614,425,4.416,427,4.512,510,6.224,543,4.545,549,6.451,564,5.677,572,4.384,587,7.83,773,4.837,785,3.743,947,15.112,1021,6.602,1300,8.002,1656,11.579,1706,11.408,1707,8.754,1902,7.543,1982,9.924,2845,9.924,2925,12.274,2926,12.274,2927,7.729,2928,17.396,2929,12.274,2930,12.274]],["keywords/439",[]],["title/440",[275,450.597,2931,1007.258,2932,1251.356]],["content/440",[4,2.352,5,4.377,6,1.963,7,7.087,8,8.128,10,6.074,25,1.021,33,1.985,46,6.563,50,8.461,69,4.791,185,4.897,275,8.041,297,5.751,308,6.563,373,5.228,381,4.953,496,6.202,642,6.875,901,5.859,941,11.425,1254,10.378,1377,7.18,1697,8.688,2923,12.864,2931,11.425,2932,20.992,2933,15.349,2934,15.349]],["keywords/440",[]],["title/441",[37,178.358,437,416.956,696,660.735,988,757.671,1110,606.904]],["content/441",[6,1.773,25,0.878,37,3.529,44,3.678,52,3.639,92,5.631,110,5.826,179,6.565,182,3.654,186,5.413,195,6.994,196,6.543,200,4.928,202,4.063,222,3.602,256,6.214,273,2.896,275,4.398,304,6.653,308,4.275,322,6.732,370,8.317,428,7.104,437,5.184,467,4.669,486,7.851,515,6.523,527,6.792,535,10.353,536,4.529,541,6.441,554,6.324,556,4.718,557,5.248,560,6.994,563,5.658,564,6.109,626,10.075,695,6.523,703,4.928,785,4.028,799,9.08,894,5.061,899,9.615,906,7.161,961,7.281,963,5.101,1050,9.42,1180,7.936,1207,7.617,1427,7.048,1606,9.08,1610,8.215,1623,8.931,1665,12.214,1767,11.069,1980,11.069,2206,9.831,2628,10.075]],["keywords/441",[]],["title/442",[191,471.331,879,610.406]],["content/442",[5,4.336,6,1.945,25,1.597,52,5.534,63,4.404,273,4.404,391,10.116,689,10.979,857,10.328,1711,13.171,2935,20.085,2936,20.085]],["keywords/442",[]],["title/443",[25,63.794,33,187.752,182,191.399,199,695.195]],["content/443",[]],["keywords/443",[]],["title/444",[33,174.985,199,647.923,486,804.418]],["content/444",[3,5.362,4,1.208,5,2.516,6,2.079,33,3.156,35,3.343,37,1.957,44,3.246,67,4.69,69,3.639,87,4.051,100,4.317,103,5.194,113,5.422,114,4.874,151,5.172,176,7.165,180,5.362,181,5.232,182,2.326,185,4.05,194,6.788,199,10.281,207,9.242,219,4.333,240,2.603,252,4.52,265,4.193,278,3.138,293,3.263,298,5.72,310,5.276,314,4.135,334,3.361,392,5.422,395,4.901,401,5.221,438,4.365,474,6.722,496,4.71,514,4.178,536,3.997,539,5.422,551,5.304,554,5.581,566,8.013,613,5.906,630,4.285,637,6.659,652,5.581,664,5.832,697,7.435,703,4.349,716,4.208,732,4.078,799,8.013,875,6.172,926,5.952,994,6.269,1228,8.313,1294,9.769,1611,8.676,1679,10.778,2075,8.891,2645,10.2,2937,10.778,2938,10.778]],["keywords/444",[]],["title/445",[25,58.151,33,113.071,199,418.671,437,343.191,1066,466.623,1237,636.528,2539,732.835]],["content/445",[4,0.641,5,1.336,6,1.955,7,3.199,12,2.157,25,1.473,30,2.911,33,2.357,40,2.362,44,1.723,46,2.003,58,2.266,65,2.028,70,3.2,87,2.15,96,5.801,97,3.598,99,3.611,107,2.518,116,2.555,125,4.056,134,3.502,142,3.64,151,1.909,155,3.055,175,3.848,176,3.74,181,3.496,182,3.045,183,1.949,185,1.495,186,3.029,192,2.08,195,8.08,196,6.72,199,7.306,200,2.308,202,1.903,222,1.687,230,1.954,234,2.862,240,1.381,246,1.954,248,3.354,250,8.143,255,4.177,264,4.424,265,2.226,276,3.759,278,1.665,284,5.999,286,3.802,288,3.055,291,2.962,293,1.732,297,1.755,298,3.036,300,3.41,301,3.855,304,3.116,314,4.654,315,2.015,330,3.155,334,1.784,356,4.767,373,1.596,385,2.266,392,2.878,394,3.137,396,3.349,401,2.771,421,3.204,425,2.226,428,3.327,437,4.023,438,3.838,462,4.072,466,3.227,490,2.458,525,5.387,537,5.001,541,3.017,542,3.946,545,1.714,548,6.454,553,4.591,560,3.276,565,5.801,566,4.253,567,4.057,573,4.253,588,4.719,613,5.376,614,2.676,617,5.427,712,3.759,722,5.162,732,2.165,735,2.786,738,6.627,745,3.382,875,8.08,892,3.802,893,5.517,909,4.85,910,2.489,936,3.075,937,5.731,947,4.253,961,3.41,962,4.605,963,2.389,973,3.327,985,4.767,992,4.412,1004,5.185,1006,3.759,1026,4.719,1043,4.503,1067,4.183,1068,7.8,1118,4,1126,4.605,1141,4.057,1169,2.83,1171,4.253,1172,4.412,1211,4.85,1237,7.461,1296,5.002,1305,4.329,1393,5.002,1422,4.329,1634,4.412,1635,5.721,1686,4.503,1872,3.327,2117,4.057,2172,4.183,2939,6.187,2940,6.187,2941,6.187,2942,4.85,2943,6.187,2944,6.187]],["keywords/445",[]],["title/446",[4,99.401,25,63.794,67,385.977,196,298.574,264,278.105,875,507.977]],["content/446",[6,1.951,25,1.417,46,4.386,58,3.21,63,1.922,68,4.605,69,2.736,70,4.04,88,3.005,97,3.076,99,3.087,107,2.152,142,5.155,151,2.704,155,4.937,175,5.45,176,3.198,181,4.414,182,4.579,186,2.59,192,2.946,195,9.87,196,4.217,198,2.341,232,5.209,250,7.23,252,3.398,264,4.802,265,4.874,278,3.647,288,4.328,291,4.196,293,2.453,298,4.3,301,4.593,304,6.824,306,6.25,314,3.109,322,3.221,330,2.107,334,2.527,373,2.26,401,3.925,405,4.506,425,3.152,428,4.713,438,3.282,490,3.482,531,7.406,537,6.109,542,5.59,545,2.427,548,5.518,551,3.988,553,3.925,560,4.64,562,5.054,565,9.375,567,5.747,588,6.684,613,4.773,616,6.132,617,4.64,622,3.556,632,5.155,664,4.384,693,3.925,695,4.328,699,5.666,704,4.605,706,4.475,718,3.556,738,8.76,861,4.076,875,4.64,888,4.572,893,3.685,918,4.96,936,4.356,989,6.25,1001,7.344,1026,6.684,1031,6.379,1043,6.379,1065,7.971,1115,6.379,1118,5.666,1123,6.523,1157,5.209,1177,5.386,1232,7.085,1315,5.518,1395,6.523,1397,10.954,1541,6.869,1617,4.572,1619,7.669,2945,8.763,2946,8.763,2947,8.763]],["keywords/446",[]],["title/447",[988,1328.96]],["content/447",[4,1.335,6,1.742,25,1.493,33,2.327,49,6.06,58,4.718,63,2.825,70,3.141,97,4.522,99,4.538,107,3.164,142,7.578,151,3.974,181,3.432,182,4.139,195,6.821,196,6.456,199,10.752,250,6.874,252,4.995,255,5.25,264,6.013,284,4.569,301,2.936,428,6.928,437,7.063,462,7.151,536,4.417,537,4.222,541,6.281,613,4.538,617,6.821,732,4.507,738,8.329,866,7.578,875,9.53,892,7.916,893,5.416,910,5.183,937,5.626,962,9.588,1000,6.928,1015,9.826,1056,8.111,1057,10.415,1062,9.588,1063,10.796,1064,9.014,1068,7.657,1171,8.856,1172,9.187,1194,9.377,1597,11.273,2948,12.881]],["keywords/447",[]],["title/448",[52,190.408,100,255.91,275,230.102,670,915.022,672,429.789,874,306.375,1766,459.966]],["content/448",[]],["keywords/448",[]],["title/449",[37,178.358,51,254.223,256,499.793,308,343.888,539,494.15]],["content/449",[4,2.143,65,6.779,67,8.322,107,5.08,308,6.695,878,13.563,891,11.401,2845,16.722,2949,20.683,2950,18.1]],["keywords/449",[]],["title/450",[1766,1240.307]],["content/450",[2,4.577,4,1.295,5,4.405,6,1.706,9,5.717,16,6.425,22,3.279,61,6.72,63,3.863,86,5.049,87,4.342,107,3.069,114,3.632,131,6.336,171,3.263,192,4.201,200,4.662,201,4.826,202,3.844,205,3.247,219,4.644,240,2.79,252,4.845,271,4.432,286,7.679,288,6.171,301,2.848,308,4.045,432,9.258,452,8.148,479,10.585,514,4.479,527,6.425,551,5.686,556,4.463,557,7,645,7.351,711,5.303,735,5.626,901,4.77,932,5.686,943,6.567,972,8.194,1066,6.668,1152,8.317,1402,9.096,1444,5.912,1649,9.795,1718,9.096,1751,8.911,1766,16.93,1844,10.935,2589,7.679,2612,8.911,2724,9.3,2838,10.472,2951,12.495,2952,12.495,2953,8.194,2954,10.472,2955,12.495]],["keywords/450",[]],["title/451",[275,620.473]],["content/451",[5,4.696,6,2.106,7,3.743,9,5.486,10,6.77,12,4.181,19,3.595,37,2.013,44,4.764,51,4.094,53,5.065,65,3.93,92,5.113,107,2.945,148,6.916,200,4.474,232,7.128,275,7.243,281,4.65,286,7.37,293,3.357,308,7.041,322,4.408,329,5.344,350,10.494,373,3.093,375,6.256,440,5.547,499,8.992,527,6.166,544,4.474,556,7.126,557,6.798,582,6.726,694,5.96,703,4.474,773,4.726,785,3.657,870,9.4,901,4.577,983,7.128,1160,6.081,1178,8.108,1183,6.61,1251,8.729,1315,7.551,1351,8.926,1633,6.85,1656,13.278,1726,6.45,1751,8.552,1865,11.089,1983,8.729,2095,8.391,2530,11.089,2653,10.494,2867,11.089,2868,10.494,2869,11.089,2917,14.973,2956,11.992]],["keywords/451",[]],["title/452",[52,513.439]],["content/452",[4,1.803,5,2.65,6,1.188,22,3.221,33,2.249,46,3.973,52,6.394,60,6.49,63,2.692,107,3.015,110,5.414,114,5.057,152,2.444,154,4.512,186,5.142,201,4.741,202,3.776,217,6.214,222,4.743,254,7.296,256,5.774,271,6.171,272,5.233,273,2.692,286,7.543,297,3.482,308,5.631,322,4.512,325,8.589,396,4.01,400,5.527,431,11.35,512,8.271,515,6.062,520,5.556,549,6.451,569,6.023,580,5.646,582,6.885,635,10.741,659,5.646,692,6.267,693,5.498,694,6.101,695,6.062,698,7.936,785,3.743,792,7.079,901,4.685,936,6.101,1066,9.283,1262,7.543,1763,10.741,2172,8.299,2502,6.101,2531,10.741,2886,8.438,2957,12.274,2958,12.274,2959,11.35,2960,11.35,2961,12.274,2962,11.35]],["keywords/452",[]],["title/453",[874,826.145]],["content/453",[4,1.78,5,4.32,6,2.112,12,4.205,14,6.458,25,0.802,37,2.025,51,2.886,60,4.5,84,6.436,87,4.191,97,6.032,98,9.343,103,5.375,110,5.32,114,4.994,125,4.772,162,4.264,182,3.993,186,3.565,187,7.412,196,3.754,200,4.5,204,5.707,217,4.308,230,3.81,273,3.768,286,10.559,287,5.995,288,5.956,289,5.61,308,3.904,310,5.459,322,4.434,395,7.224,396,3.941,479,7.247,496,6.942,510,6.116,674,4.418,693,5.402,873,7.247,874,10.22,896,10.108,901,4.604,963,4.658,1028,6.956,1082,8.028,1140,8.977,1397,9.751,1786,9.454,1821,11.435,1822,8.977,1872,6.487,2488,8.78,2963,12.061,2964,9.454,2965,12.061,2966,10.555]],["keywords/453",[]],["title/454",[100,580.619,672,975.122]],["content/454",[1,4.743,4,1.103,6,1.519,7,3.323,10,4.212,33,1.376,37,1.787,51,5.492,53,6.628,58,6.827,61,5.725,63,2.334,70,2.596,86,6.341,87,5.453,98,4.56,100,6.903,103,4.743,107,2.614,110,4.695,125,7.375,149,4.415,154,3.913,186,3.146,187,6.541,200,3.971,201,4.111,205,2.765,246,3.362,264,3.086,272,4.538,278,2.865,289,4.951,299,6.62,308,6.033,311,4.56,334,3.069,357,7.591,373,4.807,381,3.435,395,4.475,396,3.478,452,4.923,489,7.922,491,13.568,492,10.61,496,4.301,519,5.725,569,5.223,672,13.642,864,6.98,886,3.802,940,6.467,958,4.923,1038,6.62,1049,6.541,1058,5.512,1207,6.138,1224,6.199,1444,5.036,1526,5.818,1631,6.024,1663,5.918,1821,7.084,2049,6.882,2098,6.702,2172,7.197,2254,6.024,2308,6.702,2714,7.317,2733,7.591,2770,9.842,2967,9.842,2968,9.842,2969,7.197,2970,9.314,2971,10.644,2972,9.842,2973,9.842]],["keywords/454",[]],["title/455",[75,1204.817]],["content/455",[4,2.191,5,2.435,6,1.092,9,5.16,16,5.799,20,5.051,33,2.117,37,1.893,40,4.305,51,5.373,69,3.52,75,15.144,79,5.972,92,8.217,100,7.83,111,4.255,114,4.759,125,4.462,171,2.945,186,3.333,189,5.758,192,3.792,196,3.51,200,4.208,205,4.253,206,6.86,240,2.518,254,6.704,271,6.836,273,2.473,297,3.199,308,5.299,329,8.588,334,3.252,350,9.869,361,6.326,366,5.432,373,2.908,375,5.883,382,5.799,385,4.131,396,3.685,417,7.371,442,8.209,468,5.16,545,3.124,736,4.223,879,4.391,894,4.322,1066,6.018,1170,5.758,1268,5.841,1434,8.602,1595,7.014,1694,7.892,1707,8.043,1718,8.209,1765,7.194,1989,8.394,2118,7.625,2974,11.278,2975,11.278,2976,9.869,2977,11.278,2978,9.869,2979,7.625]],["keywords/455",[]],["title/456",[202,482.305,689,857.071]],["content/456",[4,1.985,22,5.029,25,1.274,37,3.217,51,4.585,86,7.742,92,8.17,114,5.57,177,9.853,202,5.894,276,11.641,308,6.202,407,9.344,420,11.641,481,10.563,891,10.563,1631,10.845,2308,12.066]],["keywords/456",[]],["title/457",[5,256.976,152,236.98,217,425.189,322,437.561]],["content/457",[4,1.36,5,5.136,6,1.765,14,4.934,33,1.697,46,4.248,52,3.616,60,4.897,63,2.878,72,6.247,100,4.86,152,2.613,182,2.619,186,3.879,192,4.413,200,4.897,201,5.069,206,4.672,217,8.497,240,2.931,271,4.656,273,3.998,297,3.723,301,2.991,308,5.902,322,6.703,357,9.36,373,5.403,382,6.749,482,7.175,557,5.215,572,6.513,631,7.644,672,8.163,736,4.915,773,8.256,880,10.011,1183,7.235,1351,13.571,1548,8.372,1821,8.736,1990,9.769,2488,9.554,2953,8.607,2980,10.288,2981,13.125,2982,12.137,2983,12.137,2984,11.486,2985,11.486]],["keywords/457",[]],["title/458",[281,524.746,297,383.895,379,619.122]],["content/458",[2,3.307,4,2.234,6,0.874,7,2.819,12,3.148,18,3.016,23,2.572,25,0.6,37,3.179,51,4.531,52,3.82,53,3.814,58,3.307,65,2.959,69,2.819,70,4.116,72,4.297,86,3.648,88,3.096,97,3.17,99,3.181,107,2.218,116,8.436,164,2.835,177,4.643,183,5.316,200,3.369,201,3.487,202,2.777,204,4.272,215,4.745,219,6.273,230,5.982,246,2.852,264,4.019,275,4.617,281,8.362,297,2.561,301,2.058,308,6.613,311,3.868,330,4.912,364,4.895,373,2.329,375,4.71,402,5.207,425,4.988,432,8.87,437,5.441,444,6.318,467,3.192,487,5.686,506,4.895,538,4.488,556,3.225,716,3.26,736,3.381,741,5.486,853,5.158,894,5.313,897,5.921,906,4.895,1081,5.549,1112,5.367,1128,6.573,1169,4.131,1170,4.61,1339,6.21,1617,7.233,1706,5.921,1726,4.856,2242,7.078,2253,4.272,2429,6.439,2492,8.423,2502,4.488,2542,10.092,2560,5.921,2572,7.3,2606,7.901,2653,7.901,2733,6.439,2907,8.349,2986,9.029,2987,9.029,2988,7.3,2989,9.029,2990,9.029,2991,9.029]],["keywords/458",[]],["title/459",[60,584.959,297,444.782]],["content/459",[5,3.289,6,1.763,14,3.844,19,3.065,23,3.874,32,4.786,33,1.97,34,2.341,37,1.717,52,5.016,60,8.741,63,2.242,65,3.351,97,3.59,98,4.381,100,3.787,116,6.291,152,2.036,162,3.615,164,5.717,188,5.736,203,5.185,215,5.374,219,5.662,230,3.23,234,4.73,248,5.544,272,4.36,273,2.242,275,3.405,297,2.901,373,2.637,382,5.258,396,3.341,398,3.829,418,8.016,501,5.258,510,5.185,519,5.5,520,4.629,543,3.787,557,4.063,634,7.293,642,4.58,672,6.36,703,3.815,711,4.339,773,4.03,785,3.118,792,5.897,859,7.8,874,4.534,987,6.612,1030,5.018,1183,5.637,1219,7.338,1224,5.955,1345,9.474,1526,5.59,1692,9.456,1724,9.849,2197,8.016,2303,5.5,2502,5.083,2542,7.444,2992,9.456,2993,10.226,2994,10.226,2995,8.016,2996,10.226,2997,10.226,2998,10.226,2999,10.226,3000,9.456,3001,9.456,3002,10.226,3003,10.226,3004,10.226,3005,10.226]],["keywords/459",[]],["title/460",[297,444.782,1028,904.237]],["content/460",[4,2.327,6,1.454,7,6.237,12,6.966,14,5.644,25,0.667,37,1.684,45,2.845,46,3.246,51,3.593,53,6.342,67,4.035,87,3.485,98,4.296,144,6.163,155,2.989,156,7.95,161,3.168,167,4.359,173,5.961,200,3.742,210,6.675,264,2.907,271,3.557,275,4.999,289,10.444,308,5.825,310,4.539,321,6.163,373,4.641,375,7.832,439,7.018,499,7.89,645,5.9,740,4.665,773,3.952,785,4.578,865,6.577,874,4.446,901,3.828,910,4.035,932,4.564,996,4.539,1028,13.425,1030,7.367,1112,5.961,1141,9.846,1236,7.861,1242,11.769,1251,7.3,1315,6.315,1339,4.492,1388,9.577,1558,6.163,1633,5.729,1766,6.675,1852,8.405,1914,7.152,1961,5.961,2252,6.093,2253,7.104,2254,12.709,2492,10.933,2964,7.861,3006,9.274,3007,8.405,3008,9.274,3009,10.029,3010,10.029,3011,9.274]],["keywords/460",[]],["title/461",[37,227.19,703,504.882,958,625.942]],["content/461",[4,0.841,5,2.755,6,1.235,7,2.533,20,7.064,34,1.858,37,3.263,40,3.098,49,6.003,51,4.278,52,4.926,70,3.112,79,4.297,88,2.782,92,3.46,114,2.359,122,6.922,131,6.471,148,4.68,154,2.983,176,2.961,191,5.375,192,2.728,193,7.163,200,3.027,219,3.016,237,5.321,240,2.849,271,2.878,275,5.251,287,4.033,361,4.552,398,4.779,457,5.487,476,4.93,490,3.224,498,5.047,507,7.936,519,4.364,539,5.935,545,2.248,636,6.975,693,3.635,697,5.176,703,8.956,711,6.692,737,2.728,858,4.087,874,3.598,944,8.846,958,9.986,1109,4.202,1143,8.25,1180,4.876,1313,10.628,1320,6.863,1339,3.635,1365,5.907,1377,3.796,1435,6.04,1466,5.907,1526,6.975,1631,4.593,1697,4.593,1705,10.317,1710,6.19,1711,5.321,1712,5.678,1713,9.693,1718,5.907,1723,16.29,1741,6.801,1766,13.737,1768,7.504,1771,7.101,1783,5.579,1993,5.487,2502,6.343,2534,6.801,2612,5.787,2718,7.504,2912,7.936,2972,11.8,3012,7.504,3013,8.115,3014,7.504,3015,8.115,3016,8.115,3017,8.115,3018,8.115,3019,6.801,3020,7.101]],["keywords/461",[]],["title/462",[63,343.83,689,857.071]],["content/462",[4,1.208,5,3.62,20,10.19,37,2.815,60,4.349,63,4.989,64,7.881,65,3.82,67,4.69,86,6.775,92,4.97,122,5.116,152,2.321,182,2.326,186,3.445,187,7.163,189,5.952,197,8.313,202,3.586,217,4.164,248,6.32,271,4.135,275,3.881,297,3.307,301,2.657,334,3.361,373,4.324,392,5.422,407,5.684,440,5.392,519,6.269,523,6.269,543,4.317,572,4.164,625,8.891,675,7.798,689,6.372,704,6.126,716,4.208,771,4.67,785,5.113,786,4.993,792,6.722,853,6.659,874,5.168,881,8.485,900,10.778,901,4.449,902,6.659,1146,10.778,1426,8.891,1427,6.22,1706,7.644,1707,8.313,1708,8.013,1766,7.758,1984,7.435,2131,7.004,2183,8.485,2197,9.137,2502,5.794,2554,10.778,2714,8.013,2884,9.769,3021,11.656,3022,11.656,3023,10.778,3024,11.656,3025,11.656,3026,16.766,3027,11.656,3028,11.656,3029,11.656]],["keywords/462",[]],["title/463",[301,357.335,786,671.65]],["content/463",[2,4.899,4,1.386,5,4.317,6,2.049,10,3.41,12,6.441,22,2.262,33,2.119,44,3.724,52,5.09,53,3.64,98,7.914,100,6.841,103,3.84,107,2.117,111,3.252,148,4.97,155,2.569,162,3.046,173,5.123,193,6.567,198,3.573,201,3.329,222,2.35,248,4.673,264,2.498,275,2.87,289,6.221,301,3.736,308,4.329,311,5.73,325,9.359,334,3.856,393,4.635,395,3.624,438,3.227,458,4.009,482,4.711,489,6.415,492,5.827,496,3.482,515,6.605,561,4.054,672,12.437,673,4.496,675,6.221,736,5.009,786,5.73,864,5.652,874,8.866,886,4.778,888,8.551,921,4.463,1028,7.714,1030,4.229,1058,4.463,1109,4.463,1204,4.432,1242,6.755,1251,6.273,1309,4.054,1313,5.123,1339,5.991,1602,9.958,1651,7.714,1663,7.437,1732,7.542,1766,5.736,1981,5.736,2049,5.572,2062,5.736,2253,4.078,2254,7.57,2449,7.969,2502,4.284,2714,11.268,2837,7.542,2898,7.542,2954,7.223,2973,7.969,3030,6.968,3031,8.618,3032,8.618,3033,8.618,3034,8.618,3035,8.618,3036,8.618,3037,7.969,3038,8.618,3039,7.969,3040,8.618]],["keywords/463",[]],["title/464",[230,427.504,527,695.85,675,629.441]],["content/464",[2,3.265,4,0.924,5,1.924,6,2.077,10,5.432,12,3.108,20,6.149,22,2.339,52,4.613,63,1.955,86,3.602,98,8.7,100,6.2,103,3.972,107,2.189,116,3.681,152,3.744,156,4.72,193,3.571,198,2.381,201,3.443,206,3.173,217,3.184,230,6.777,246,4.337,248,4.833,272,3.8,275,4.571,278,2.399,289,4.146,298,4.374,301,3.129,319,3.972,325,6.237,330,3.3,334,2.57,356,4.146,375,4.65,381,2.876,389,4.583,391,4.489,393,4.794,455,6.573,482,4.872,527,7.059,648,5.613,672,10.412,675,6.385,706,4.551,716,4.956,736,3.338,785,2.718,861,4.146,864,5.845,874,8.338,888,7.161,891,7.567,918,5.045,929,8.242,940,8.34,1028,7.917,1055,4.43,1300,4.1,1308,5.045,1339,3.992,1526,4.872,1602,11.426,1713,11.631,1946,7.206,1984,5.686,2036,6.987,2254,5.045,2502,4.43,2773,7.8,2964,6.987,3041,7.206,3042,8.242,3043,7.8,3044,8.913,3045,7.47,3046,8.913,3047,13.728,3048,13.728,3049,8.913,3050,8.913,3051,8.913,3052,7.8,3053,8.913,3054,8.913,3055,8.913,3056,8.913,3057,8.913,3058,6.799]],["keywords/464",[]],["title/465",[527,695.85,674,495.646,675,629.441]],["content/465",[2,5.272,5,3.108,15,11.312,52,5.352,63,3.157,100,7.193,152,3.867,189,7.35,193,5.767,230,4.547,248,10.531,275,6.467,289,6.695,301,3.281,407,7.019,482,7.869,672,12.08,674,8.052,675,6.695,736,5.391,771,5.767,864,9.44,874,8.611,888,7.509,891,7.935,1028,8.302,1030,7.064,1109,7.455,1427,7.681,1602,8.745,1713,7.804,1981,9.581,2254,8.147,2502,7.155,3045,12.064,3059,14.395,3060,19.423,3061,14.395,3062,14.395,3063,14.395,3064,14.395,3065,14.395,3066,14.395]],["keywords/465",[]],["title/466",[215,711.201,230,427.504,792,780.453]],["content/466",[2,4.869,6,1.781,52,5.068,62,5.694,63,2.915,86,5.371,100,7.811,103,8.197,105,7.207,152,3.662,193,5.326,215,6.986,230,4.199,248,7.207,275,4.426,289,6.183,301,3.029,308,4.303,319,5.923,373,3.428,381,4.289,482,7.266,490,8.381,648,8.37,672,13.118,675,6.183,736,4.978,785,5.609,792,10.608,859,10.139,864,8.717,874,9.351,891,7.327,1028,10.608,1339,8.239,1444,6.29,1713,7.207,2254,7.524,2502,6.607,3045,11.14,3067,11.632,3068,13.292,3069,13.292,3070,13.292,3071,13.292,3072,13.292,3073,13.292,3074,13.292,3075,12.292,3076,13.292]],["keywords/466",[]],["title/467",[215,711.201,674,495.646,792,780.453]],["content/467",[2,6.293,6,1.168,12,4.205,51,2.886,52,4.734,86,4.874,88,4.135,98,5.167,100,8.076,152,3.984,193,4.832,201,4.658,219,4.483,230,5.428,248,6.539,275,4.016,281,4.677,289,7.991,301,2.749,381,3.892,385,4.418,407,5.881,420,7.328,482,6.593,496,4.874,512,4.937,561,8.083,597,9.454,642,5.402,672,12.446,674,7.988,675,5.61,688,7.328,711,5.118,740,5.61,775,8.226,792,6.956,864,7.909,874,8.872,888,6.292,891,6.649,940,7.328,1028,9.908,1030,8.431,1602,7.328,2062,8.028,2254,9.724,2502,5.995,2898,10.555,3045,10.108,3075,11.153,3077,12.061,3078,12.061,3079,12.061,3080,12.061,3081,12.061,3082,12.061,3083,12.061,3084,12.061,3085,12.061,3086,11.153]],["keywords/467",[]],["title/468",[63,343.83,988,1118.181]],["content/468",[4,2.465,6,1.271,7,4.097,12,4.576,15,7.644,44,3.655,49,6.175,51,3.141,60,4.897,72,6.247,86,5.303,103,5.849,114,3.815,173,7.802,191,5.481,200,4.897,201,7.042,215,6.898,264,5.286,273,2.878,275,4.37,281,5.089,289,8.481,301,4.156,311,5.622,329,5.849,375,6.847,484,7.362,490,5.215,496,5.303,499,6.898,519,7.059,556,4.688,557,5.215,577,8.163,672,8.163,786,5.622,792,7.569,874,5.819,886,6.513,888,6.847,894,5.03,901,5.01,963,5.069,1028,7.569,1030,8.947,1109,6.797,1726,7.059,1821,8.736,1931,8.265,2206,9.769,2714,9.023,2837,11.486,2964,10.288,3058,10.011,3087,13.125,3088,13.125]],["keywords/468",[]],["title/469",[329,698.67,512,641.789]],["content/469",[2,5.289,4,1.496,5,4.202,6,1.398,19,4.329,25,1.294,33,1.867,37,2.424,40,3.636,45,2.702,46,3.083,52,3.979,53,4.023,60,3.553,62,4.08,63,5.017,69,5.445,70,2.323,98,6.186,152,3.473,156,5.044,176,3.476,188,5.342,191,5.244,193,5.786,219,5.368,223,4.898,230,3.009,241,3.54,246,3.009,248,5.164,249,5.391,273,3.167,275,4.809,288,4.704,301,3.291,319,4.244,329,4.244,381,3.074,382,4.898,391,4.797,432,5.006,452,4.406,458,4.43,490,3.784,496,3.849,512,9.013,514,5.177,519,5.123,537,3.122,554,4.56,564,4.406,637,5.441,689,5.206,736,3.567,785,2.904,786,6.186,861,4.43,874,4.223,894,3.65,915,7.089,936,4.734,1028,8.329,1038,5.924,1193,7.265,1205,7.466,1427,5.083,1444,4.507,1595,5.924,1610,5.924,1614,7.374,1713,5.164,1843,9.212,2253,4.507,2488,6.933,2531,8.335,2823,7.7,2900,6.34,3089,13.354,3090,9.524,3091,9.524,3092,7.089,3093,9.524,3094,8.335,3095,9.524,3096,9.524]],["keywords/469",[]],["title/470",[331,1013.728,512,641.789]],["content/470",[6,1.907,10,5.816,12,5.125,16,10.129,33,1.901,37,3.307,51,4.714,53,6.209,62,6.297,63,3.224,85,7.08,87,5.108,100,5.443,103,6.55,189,7.506,200,5.484,219,5.464,289,6.837,297,4.17,330,3.534,331,12.736,373,3.791,391,7.404,396,4.803,452,6.799,492,9.939,496,5.94,512,8.063,525,7.725,606,11.522,674,5.384,785,4.483,894,5.633,1028,8.477,1032,10.105,1268,7.613,1435,10.941,1706,9.639,1852,12.319,2254,8.32,2336,11.884,3097,12.864,3098,14.699,3099,14.699,3100,14.699]],["keywords/470",[]],["title/471",[191,471.331,879,610.406]],["content/471",[4,1.985,23,2.92,25,1.674,398,7.176,432,10.07,523,12.553,596,13.408,885,13.948,2427,14.616,2510,16.768,2514,16.768,2515,14.262,2715,17.718,3101,19.161,3102,19.161]],["keywords/471",[]],["title/472",[23,133.27,25,58.151,33,113.071,181,232.993,315,284.809,480,314.57,1643,706.971]],["content/472",[]],["keywords/472",[]],["title/473",[33,174.985,181,360.573,1110,773.065]],["content/473",[5,3.853,6,1.728,62,7.646,69,5.571,70,4.353,103,7.953,107,5.487,176,6.513,181,4.756,182,3.561,185,4.311,186,5.275,205,4.637,222,4.867,227,9.177,278,4.804,392,8.302,496,7.212,564,8.255,581,7.574,938,13.99,1228,12.729,1734,16.504,2520,16.504,2920,16.504]],["keywords/473",[]],["title/474",[149,493.733,709,731.52,713,769.603,1300,547.547]],["content/474",[33,2.195,70,4.14,147,10.828,149,7.041,154,6.24,181,4.523,182,3.387,222,4.629,230,5.363,240,4.833,402,9.79,446,12.635,455,8.128,543,6.286,652,8.128,674,6.217,708,10.689,711,7.204,713,10.975,785,5.177,893,7.137,909,13.306,910,6.83,923,11.132,1134,9.608,1152,11.299,2588,12.357,2656,15.697,3103,16.975,3104,16.975,3105,15.697]],["keywords/474",[]],["title/475",[108,620.948,281,461.561,379,544.573,985,553.65]],["content/475",[6,2.106,33,2.213,51,4.095,69,5.343,70,4.174,72,8.146,88,5.868,181,4.56,185,4.134,201,6.61,246,5.407,281,9.76,316,12.458,322,6.291,330,4.115,379,7.83,432,8.995,444,11.976,468,7.83,545,4.74,611,10.777,613,6.029,641,11.976,1006,10.398,1178,11.572,1356,10.917,3106,17.115]],["keywords/475",[]],["title/476",[6,102.858,301,242.127,537,348.193,1308,601.311,2625,810.359]],["content/476",[6,1.567,33,2.093,78,13.563,107,3.975,111,6.107,181,4.312,184,3.51,185,5.07,240,4.687,264,4.692,301,4.784,330,3.891,347,7.445,395,6.805,402,9.334,437,6.352,490,6.43,537,6.879,544,6.038,545,4.483,607,8.774,614,7,664,8.097,732,5.662,735,7.287,907,9.946,1055,8.044,1141,10.613,1167,11.126,1339,7.249,1582,12.046,2705,13.563,3107,16.184,3108,14.965]],["keywords/476",[]],["title/477",[149,493.733,240,265.779,718,483.032,1313,707.558]],["content/477",[6,1.592,70,4.009,107,4.038,181,4.38,184,3.565,185,3.971,191,4.942,205,4.271,220,5.811,222,4.483,230,5.193,240,4.734,264,4.766,490,6.532,581,8.998,674,6.021,694,8.171,711,6.976,717,7.871,751,10.103,887,9.574,963,6.349,991,9.062,994,8.842,1007,11.143,1606,14.576,1663,9.14,3109,13.777,3110,13.777,3111,16.439,3112,16.439,3113,16.439]],["keywords/477",[]],["title/478",[18,268.36,110,354.378,196,250.045,243,369.555,627,629.736,1197,562.176,1320,432.085,1384,552.302]],["content/478",[6,1.63,18,7.192,33,2.177,110,7.427,156,8.916,181,4.486,184,3.651,185,4.067,205,5.594,206,5.994,243,7.746,252,6.529,264,4.881,278,4.533,299,10.472,307,9.711,329,7.503,334,4.855,355,6.635,366,8.11,563,7.213,636,9.204,715,12.533,736,6.306,912,8.784,1017,12.533,1187,10.887,2127,14.735,2617,13.199,3114,12.257,3115,16.838]],["keywords/478",[]],["title/479",[23,133.27,25,58.151,33,113.071,181,232.993,437,343.191,462,347.44,1066,466.623]],["content/479",[3,9.062,6,1.423,7,6.149,25,1.478,33,2.873,50,8.103,51,3.517,52,4.05,99,5.178,107,3.611,181,5.249,184,3.188,205,3.819,264,4.261,273,3.224,284,5.214,373,3.791,414,5.746,480,5.288,514,5.269,537,4.818,541,7.168,544,5.484,545,4.071,554,7.038,659,6.762,735,6.618,863,8.477,875,7.784,877,8.173,934,9.034,1042,9.504,1049,9.034,1180,8.832,1264,10.941,2052,11.212,3116,14.699,3117,14.699,3118,14.699,3119,14.699,3120,14.699,3121,14.699,3122,14.699,3123,14.699]],["keywords/479",[]],["title/480",[19,405.656,1378,841.635,1663,752.413]],["content/480",[5,1.984,6,0.89,22,3.688,23,4.242,24,4.85,25,0.611,32,1.944,33,1.817,34,3.217,35,2.635,37,1.543,49,4.323,111,5.302,151,2.835,161,4.439,164,2.885,167,3.993,171,2.399,181,3.744,183,5.374,184,1.993,185,2.22,198,3.754,202,2.826,220,3.248,222,2.505,224,5.173,225,3.294,226,4.692,271,3.259,273,2.015,275,3.059,301,2.094,315,2.993,330,3.378,355,5.537,407,4.481,438,3.441,480,5.055,537,3.011,543,3.403,563,3.936,572,3.282,630,7.024,642,4.116,734,4.628,737,3.089,758,3.974,764,5.023,765,4.605,767,8.027,770,4.538,771,5.63,772,3.811,773,5.537,776,6.688,777,4.094,778,6.839,780,4.866,804,4.453,936,4.567,1157,11.359,1166,6.025,1168,6.025,1170,4.692,1257,4.204,1345,5.715,1346,7.009,1391,7.429,1406,7.202,1444,6.649,1540,5.715,1558,5.647,2125,7.429,3124,9.188,3125,9.188,3126,8.497,3127,9.188,3128,9.188]],["keywords/480",[]],["title/481",[25,79.157,46,385.295,181,317.157,315,387.69]],["content/481",[4,1.162,6,1.086,22,2.944,23,4.034,25,1.084,45,4.626,69,3.502,70,2.735,97,3.938,116,4.632,124,4.201,136,6.469,155,3.343,156,5.94,176,4.093,181,2.989,184,2.432,185,4.641,202,3.45,220,3.965,224,3.401,225,4.021,228,4.899,230,3.543,239,5.727,240,4.709,278,4.389,315,6.87,330,2.697,347,7.501,396,3.665,477,9.497,490,4.457,520,5.077,545,4.517,554,5.371,573,7.711,586,8.349,616,7.849,632,6.599,652,5.371,735,5.05,740,5.217,745,6.132,901,4.282,952,6.349,1024,7.671,1157,6.668,1169,5.132,1173,6.668,1177,6.893,1329,5.688,1339,5.024,1342,11.025,1343,6.668,1346,8.556,1347,6.976,1361,6.033,1571,7.584,1924,10.372,2102,9.069,3129,11.217,3130,11.217,3131,11.217,3132,11.217,3133,11.217,3134,11.217]],["keywords/481",[]],["title/482",[33,153.915,181,317.157,480,428.201,932,541.649]],["content/482",[6,1.365,19,2.767,22,4.49,23,4.202,24,4.867,25,0.614,32,2.984,33,1.823,34,3.228,35,2.647,37,2.872,45,2.618,70,2.251,87,3.207,92,3.935,98,3.954,151,2.847,152,1.837,155,2.751,161,2.916,167,4.011,176,3.368,181,2.459,185,2.229,192,3.103,198,2.465,224,2.798,271,3.274,275,3.073,307,8.131,334,2.661,355,5.556,385,3.38,480,8.14,536,3.164,564,4.269,572,3.297,590,3.935,630,6.289,726,6.718,737,5.752,740,4.293,758,3.992,764,5.045,765,3.025,767,5.272,770,4.558,771,6.855,772,3.828,773,5.556,776,6.711,777,4.113,780,4.887,863,8.131,914,4.342,932,4.2,1103,6.458,1121,9.116,1262,8.665,1400,9.596,1402,6.718,1628,5.429,1894,10.754,1895,7.04,1897,11.399,2052,7.04,2057,6.345,2079,5.272,2220,8.076,3135,9.229,3136,9.229,3137,9.229,3138,9.229,3139,17.108,3140,8.534]],["keywords/482",[]],["title/483",[191,471.331,879,610.406]],["content/483",[6,1.389,25,1.386,33,2.243,37,1.585,44,2.628,63,2.07,70,3.498,97,3.313,100,3.495,107,4.261,114,2.744,122,4.143,124,3.535,149,5.949,152,1.879,156,4.998,181,6.076,184,2.047,185,4.19,199,4.519,200,3.521,202,2.903,222,5.283,225,3.383,240,3.202,255,3.847,264,2.736,273,2.07,278,3.861,281,3.66,301,3.269,311,4.043,314,3.348,315,3.074,379,4.318,409,6.02,425,3.395,480,3.395,486,5.61,512,3.863,514,3.383,515,4.661,523,5.076,536,3.236,537,4.7,544,3.521,545,3.972,554,4.519,563,4.043,617,4.998,638,5.443,656,5.61,705,5.497,706,4.819,708,5.943,713,6.102,717,4.519,718,5.82,732,5.018,742,4.272,763,4.819,857,7.375,863,5.443,872,4.754,892,5.8,893,6.03,923,6.189,932,6.526,985,4.39,1007,4.96,1057,7.631,1110,5.392,1121,6.102,1158,5.8,1183,5.203,1187,6.102,1207,5.443,1326,5.8,1427,5.036,1541,7.398,1562,6.87,1847,7.025,1890,7.398,2123,7.398,2176,7.398,2588,6.87,2705,7.91,3141,9.438,3142,8.727,3143,9.438,3144,9.438,3145,9.438,3146,9.438,3147,9.438,3148,9.438,3149,9.438,3150,9.438,3151,9.438]],["keywords/483",[]],["title/484",[25,79.157,97,417.878,544,444.09,618,731.52]],["content/484",[]],["keywords/484",[]],["title/485",[401,606.144,544,504.882,618,831.659]],["content/485",[63,4.126,70,4.588,79,9.963,96,10.649,235,11.702,399,10.285,428,10.119,512,7.702,536,6.451,544,7.02,556,6.721,618,14.185,732,6.583,893,7.911,986,12.935,1019,11.848,1227,12.338,1540,11.702,3152,18.815]],["keywords/485",[]],["title/486",[62,455.105,70,259.088,544,396.364,618,652.904,893,446.695]],["content/486",[70,5.093,107,3.945,149,6.661,181,5.564,182,3.204,192,5.399,240,3.586,264,4.656,265,5.777,278,4.323,315,5.231,330,3.861,391,8.089,392,9.714,425,5.777,490,6.381,539,7.47,544,5.991,618,9.869,661,10.244,675,7.47,706,8.2,708,10.112,709,9.869,713,10.383,717,7.689,785,4.897,923,10.531,1127,10.112,1161,12.588,1332,8.637,2095,11.238,2126,10.689,3153,13.459,3154,16.059,3155,16.059]],["keywords/486",[]],["title/487",[40,454.363,62,509.904,552,625.565,1007,625.565]],["content/487",[70,4.873,131,7.615,149,6.229,152,2.99,184,3.257,185,3.628,225,7.163,240,5.014,243,9.192,278,5.379,315,6.508,321,9.229,330,3.611,334,4.33,381,4.846,385,5.5,513,11.878,545,4.16,550,8.5,553,6.726,622,6.094,627,11.771,711,8.48,717,7.19,718,6.094,736,5.624,858,7.564,1011,10.154,1050,10.71,1116,7.464,1141,13.104,1239,12.585,1339,6.726,1377,7.025,1779,10.324,1803,11.178,3156,15.017,3157,15.017]],["keywords/487",[]],["title/488",[25,70.65,97,372.969,264,307.993,544,396.364,618,652.904]],["content/488",[25,1.403,97,7.408,177,10.851,246,6.666,407,10.29,544,7.873,618,12.969,891,11.632]],["keywords/488",[]],["title/489",[33,137.374,185,256.637,544,396.364,618,652.904,1676,982.391]],["content/489",[3,5.392,5,2.531,6,1.63,8,6.207,18,3.916,21,6.76,25,1.31,33,2.177,37,2.826,52,3.23,63,2.571,69,3.659,70,4.105,85,5.646,100,4.341,107,2.879,114,3.408,122,5.145,155,3.494,181,3.123,182,2.339,185,5.507,186,3.465,192,3.941,198,3.131,220,4.144,230,5.318,240,2.617,241,4.357,252,4.545,264,3.398,301,2.671,314,4.158,315,3.818,330,4.047,385,4.293,388,6.575,398,4.39,425,4.217,467,4.144,468,5.363,483,6.304,490,4.657,496,4.736,544,6.28,545,4.663,617,6.207,618,7.204,704,6.16,706,5.985,785,3.575,861,5.452,910,4.716,915,8.725,923,11.039,957,7.121,993,5.646,1110,6.696,1127,7.381,1173,6.968,1329,5.944,1330,9.188,1430,9.477,1603,8.941,1677,10.258,1989,8.725,2624,8.941,3158,9.477,3159,10.258,3160,11.722,3161,10.839,3162,10.839]],["keywords/489",[]],["title/490",[301,242.127,330,255.425,537,348.193,544,396.364,545,294.262]],["content/490",[4,1.272,6,1.188,18,4.1,25,1.462,33,1.587,44,4.844,51,2.937,63,2.692,69,3.832,88,4.209,99,4.324,116,7.184,152,2.444,166,6.655,183,3.866,184,2.662,185,2.965,230,3.878,240,2.741,246,3.878,273,4.431,281,7.835,301,2.797,311,5.258,329,5.47,330,4.858,360,7.012,371,6.403,373,3.165,381,3.961,393,6.602,400,5.527,425,6.258,500,8.589,537,4.023,543,4.545,544,6.49,545,4.818,593,9.621,614,5.309,622,4.981,683,8.589,688,7.457,718,7.059,740,5.709,762,9.136,858,6.182,921,6.357,982,9.283,1006,7.457,1065,7.221,1077,6.947,1081,7.543,1118,7.936,1176,7.012,1927,8.935,1969,9.621,2152,9.362,2288,8.299,2322,10.741,2736,10.741,3108,11.35,3163,12.274]],["keywords/490",[]],["title/491",[184,340.004,240,350.087]],["content/491",[4,0.769,5,1.602,6,1.44,25,1.237,33,0.96,37,1.246,44,3.31,69,3.711,70,1.81,88,4.076,107,2.92,116,4.909,131,6.028,152,1.477,161,2.344,181,4.53,182,1.481,184,2.578,185,4.494,186,2.193,205,4.418,222,4.055,225,6.669,226,6.07,230,2.344,240,4.432,255,3.024,278,4.003,301,3.389,314,4.217,315,3.872,321,7.305,330,4.773,347,5.468,348,4.2,356,3.452,361,4.162,387,4.322,391,3.738,392,5.529,395,3.12,398,4.452,425,4.276,440,5.498,455,3.553,457,5.018,462,2.949,489,5.524,499,3.9,520,3.359,529,4.2,536,2.544,537,4.873,539,3.452,543,2.748,544,4.435,545,4.119,556,2.651,564,3.432,565,4.2,613,2.614,617,3.93,618,7.305,622,3.011,632,4.366,634,5.292,637,4.239,652,3.553,663,4.091,696,4.615,706,3.789,717,3.553,732,2.596,745,6.498,786,3.179,856,9.614,857,6.112,861,3.452,884,6.923,892,4.561,893,3.12,923,4.866,961,4.091,993,3.574,996,3.359,1006,4.509,1035,4.509,1053,5.817,1055,7.391,1116,5.908,1155,5.018,1158,4.561,1173,4.411,1176,6.791,1189,9.248,1540,4.615,1562,5.402,1618,6.862,1620,6,1643,6,1782,5.292,1905,6.862,1984,4.734,2023,3.619,2589,7.305,2624,5.66,2671,4.866,3164,7.421,3165,7.421,3166,7.421,3167,11.342,3168,9.962,3169,9.318,3170,5.66,3171,7.421,3172,7.421]],["keywords/491",[]],["title/492",[250,635.181,544,444.09,554,569.907,618,731.52]],["content/492",[]],["keywords/492",[]],["title/493",[19,469.995,257,702.281]],["content/493",[23,3.423,46,4.861,152,4.766,167,8.684,183,4.73,188,8.423,224,4.553,330,3.611,496,6.068,538,9.932,545,4.16,611,9.456,622,6.094,716,5.422,734,10.064,735,6.762,748,12.141,806,7.233,811,11.178,820,10.324,821,12.141,824,10.509,825,10.154,974,9.579,1006,9.124,1093,12.141,1099,13.886,1170,7.668,1356,9.579,1430,12.141,1479,8.423,1769,12.585,3173,13.886,3174,10.154,3175,15.017,3176,19.982,3177,13.886,3178,15.017,3179,15.017]],["keywords/493",[]],["title/494",[19,469.995,99,552.327]],["content/494",[4,1.36,6,1.765,18,4.384,22,3.444,23,3.985,25,1.213,32,2.778,54,5.704,99,7.975,151,4.049,154,4.825,158,8.265,161,4.146,162,4.64,164,4.122,166,7.116,224,3.98,252,5.089,273,2.878,293,3.674,304,6.611,330,3.156,427,4.825,517,7.116,545,5.05,557,5.215,642,5.879,734,6.611,819,9.184,820,9.023,825,8.874,826,12.48,936,6.524,947,9.023,974,8.372,983,7.802,1006,7.974,1024,6.175,1061,8.163,1124,8.486,1170,9.31,1177,8.066,3174,8.874,3180,18.233,3181,13.125,3182,13.125,3183,13.125,3184,13.125,3185,13.125]],["keywords/494",[]],["title/495",[264,345.078,544,444.09,577,740.294,618,731.52]],["content/495",[4,1.188,5,3.576,6,1.604,18,3.829,25,0.762,37,3.266,52,3.159,69,3.579,70,4.744,88,3.931,161,3.621,176,4.184,181,3.055,184,2.486,205,4.304,206,4.081,225,6.973,226,5.854,240,4.758,265,4.124,271,4.066,277,9.554,278,3.086,315,3.734,326,12.985,330,2.756,394,5.813,395,4.82,398,4.293,427,4.214,544,6.181,618,10.181,622,4.652,632,6.744,663,6.319,689,6.267,693,5.135,695,5.661,703,6.181,718,4.652,732,4.011,745,6.267,806,5.522,855,6.814,861,7.705,865,7.518,869,7.518,958,5.303,993,5.522,1035,6.965,1128,8.345,1147,6.319,1173,9.847,1232,9.268,1310,6.676,1330,8.986,1656,7.63,1738,10.601,1779,7.881,1846,8.345,1889,7.219,1965,8.022,2023,5.59,2051,9.607,2588,8.345,2624,8.744,2779,7.045,3092,8.533,3110,9.607,3168,9.607,3186,9.268,3187,11.464]],["keywords/495",[]],["title/496",[225,485.1,226,690.985,227,695.85]],["content/496",[4,1.188,6,1.604,14,4.309,16,5.895,25,0.762,44,3.192,54,7.2,70,2.796,107,2.816,114,3.333,152,2.282,193,4.593,205,2.979,206,4.081,222,3.126,225,5.938,229,9.292,230,5.233,231,11.814,240,4.343,264,3.323,271,5.876,277,9.554,329,5.108,330,2.756,347,7.62,457,7.751,516,5.895,545,3.175,562,6.611,565,6.488,590,4.888,593,8.986,622,4.652,632,6.744,637,6.549,732,4.011,737,3.854,739,7.412,751,7.045,857,5.895,876,7.13,901,4.376,972,7.518,1042,7.412,1046,9.268,1108,7.751,1110,9.463,1116,5.698,1177,10.181,1219,5.522,1238,8.022,1310,9.648,1552,7.881,1558,7.045,1722,8.345,1731,9.607,1871,9.268,1889,7.219,1987,8.744,1989,8.533,2058,7.313,2152,8.744,2243,9.607,2259,10.032,2429,8.176,2779,7.045,2969,7.751,3188,10.601,3189,10.601,3190,10.601,3191,11.464,3192,11.464,3193,11.464,3194,11.464,3195,11.464,3196,8.986]],["keywords/496",[]],["title/497",[4,140.222,544,504.882,618,831.659]],["content/497",[4,1.78,19,3.615,44,3.358,70,2.941,107,2.963,181,3.214,222,3.289,230,3.81,240,3.836,264,3.497,278,3.247,301,2.749,314,4.278,322,7.357,334,3.478,484,6.765,501,8.834,531,6.593,537,3.953,544,4.5,545,3.341,618,10.559,650,6.956,664,6.034,692,6.159,693,5.402,697,7.694,717,5.775,732,6.011,785,5.239,875,6.387,905,7.17,957,10.438,1000,9.24,1035,7.328,1108,8.155,1127,10.819,1149,15.035,1158,7.412,1207,9.908,1238,8.44,1315,7.595,1394,10.108,1748,11.153,1767,10.108,1779,8.292,1782,8.602,1787,9.454,2023,8.378,2057,8.292,2301,7.694,2588,8.78,2625,9.2,3168,10.108,3196,13.467,3197,12.061,3198,12.061,3199,11.153,3200,12.061,3201,12.061,3202,9.751,3203,12.061,3204,12.061,3205,12.061,3206,12.061,3207,12.061,3208,12.061]],["keywords/497",[]],["title/498",[191,471.331,879,610.406]],["content/498",[25,1.606,29,5.121,46,3.997,70,4.944,97,4.335,105,6.694,107,4.291,125,4.886,162,4.365,171,3.224,181,3.29,190,5.775,191,3.712,193,4.947,265,4.442,297,3.503,301,2.814,315,4.021,392,5.743,398,4.624,462,4.906,523,9.395,537,4.047,544,6.517,545,3.42,618,12.458,622,5.01,637,7.053,648,7.775,660,6.926,708,7.775,717,5.912,735,5.559,740,5.743,853,7.053,861,5.743,872,6.219,883,9.471,884,7.191,885,12.716,886,6.24,892,7.588,893,5.191,923,8.097,993,5.947,1005,9.418,1067,8.348,1151,7.983,1165,8.097,1168,8.097,1330,9.678,1391,14.123,1595,7.679,2089,8.097,2532,10.348,2815,11.417,3209,12.347,3210,12.347,3211,12.347,3212,10.805,3213,12.347,3214,12.347]],["keywords/498",[]],["title/499",[25,63.794,33,124.043,200,357.9,264,278.105,1152,638.508,2141,611.918]],["content/499",[]],["keywords/499",[]],["title/500",[200,504.882,264,392.317,1152,900.729]],["content/500",[1,5.375,5,2.604,29,7.126,70,4.19,85,5.81,87,4.191,96,6.827,122,5.294,149,7.126,151,3.721,155,3.595,176,6.27,181,4.578,182,2.406,186,3.565,192,4.055,195,6.387,196,3.754,199,5.775,200,7.466,256,5.674,264,6.323,298,5.918,301,2.749,314,4.278,331,7.798,392,5.61,423,7.412,462,4.792,524,7.909,536,4.135,545,3.341,550,6.827,553,7.695,554,5.775,560,6.387,561,5.674,637,6.89,697,7.694,712,7.328,718,4.894,862,7.595,875,6.387,893,5.071,962,8.977,985,5.61,992,8.602,1030,5.918,1046,9.751,1069,10.108,1082,8.028,1152,8.028,1191,7.694,1427,6.436,1546,10.108,1610,7.501,1651,6.956,1872,6.487,2032,9.751,2124,10.555,2141,13.912,2240,11.153,2253,5.707,2430,10.108,3215,12.061,3216,12.061,3217,12.061,3218,12.061]],["keywords/500",[]],["title/501",[25,63.794,33,124.043,205,249.247,206,341.47,1066,511.905,2141,611.918]],["content/501",[6,1.963,25,1.51,33,1.985,70,3.743,105,8.322,107,3.77,162,5.426,182,3.062,185,3.708,200,5.727,205,3.988,206,5.464,227,7.893,249,8.688,252,5.952,255,6.256,265,5.522,301,3.498,414,6,438,5.748,536,5.263,537,5.031,553,6.875,565,8.688,613,5.407,659,7.061,705,8.939,717,7.349,866,9.03,963,5.928,1183,8.461,1435,11.425,1604,9.924,1677,13.432,1678,14.193,2141,12.932,2546,13.432,3219,15.349,3220,15.349,3221,15.349,3222,15.349]],["keywords/501",[]],["title/502",[25,89.993,886,483.395,1074,739.744]],["content/502",[6,2.151,23,3.498,25,1.102,33,1.133,34,2.006,37,1.471,65,2.872,70,4.04,87,3.045,88,3.005,107,3.328,114,2.547,151,2.704,155,2.612,161,2.768,164,4.255,171,2.288,181,2.335,182,2.703,183,5.217,185,3.273,192,2.946,202,2.696,205,3.52,206,4.823,219,3.257,225,3.141,256,4.123,265,3.152,273,4.419,281,6.423,284,3.109,297,2.486,301,3.775,314,3.109,330,3.258,348,7.669,379,6.199,392,4.076,396,2.863,414,3.425,490,3.482,537,4.441,543,5.017,545,2.427,553,6.069,554,4.196,564,4.053,613,4.773,617,4.64,622,5.498,707,5.925,716,3.164,717,4.196,732,4.74,734,4.414,735,3.946,740,4.076,758,3.79,765,2.872,804,4.247,910,3.526,914,4.123,919,6.132,920,4.64,921,4.538,937,3.827,956,5.518,985,4.076,1005,10.335,1056,5.518,1178,5.925,1180,5.265,1211,6.869,1237,6.379,1329,4.444,1603,6.684,1604,5.666,1623,5.925,1625,7.085,1636,6.132,1686,6.379,1747,5.925,1785,8.103,1935,6.869,1983,6.379,2032,7.085,2076,7.669,2117,5.747,2141,12.855,2160,7.669,3223,6.523,3224,8.103,3225,8.763,3226,7.085,3227,6.869,3228,7.669,3229,8.103,3230,8.763,3231,8.103]],["keywords/502",[]],["title/503",[4,110.083,25,70.65,200,396.364,264,307.993,1152,707.127]],["content/503",[6,1.758,12,6.332,25,1.502,29,7.532,99,6.397,196,5.652,200,6.775,248,9.845,251,10.096,252,7.041,255,7.401,264,5.264,291,8.694,323,10.01,529,10.278,541,8.855,714,12.087,1152,12.087,1159,15.218,1167,12.484,1297,12.278,2141,11.583,3232,18.159]],["keywords/503",[]],["title/504",[65,390.118,400,535.943,408,393.825,872,599.526]],["content/504",[2,3.183,5,1.876,6,2.403,10,3.439,25,1.522,33,1.124,37,1.459,44,3.748,51,2.079,52,2.394,65,2.848,107,2.135,114,2.526,155,2.59,176,3.171,181,2.315,184,4.963,191,2.612,196,2.705,197,6.198,205,5.216,207,4.79,208,7.359,219,7.462,235,5.405,239,8.413,240,4.482,255,3.542,265,3.126,275,4.482,297,2.465,301,1.981,308,2.813,319,3.872,334,2.506,385,3.183,395,3.654,400,3.913,408,6.642,414,3.397,427,3.195,438,3.254,467,3.072,473,6.468,474,5.012,477,7.84,514,3.115,519,4.674,536,2.98,537,2.848,554,4.161,562,5.012,564,4.02,613,7.48,617,7.128,639,4.136,660,4.874,703,3.242,705,5.061,732,3.04,920,4.602,937,5.879,963,5.199,982,7.183,985,4.042,987,10.653,1031,6.326,1056,5.472,1066,4.637,1174,5.28,1227,5.699,1295,6.812,1360,8.372,1361,4.674,1583,6.812,1653,7.605,1662,6.812,1671,7.026,1961,5.166,2117,5.699,2135,8.036,2141,11.836,3233,8.69,3234,8.69,3235,8.69,3236,6.812,3237,8.69]],["keywords/504",[]],["title/505",[25,79.157,202,366.157,563,509.904,1119,686.479]],["content/505",[]],["keywords/505",[]],["title/506",[6,131.019,185,326.9,480,486.819]],["content/506",[6,2.389,25,1.218,70,4.467,182,3.655,185,4.425,202,5.635,278,4.931,480,6.59,501,9.42,525,9.627,542,11.685,863,10.565,906,9.932,932,8.336,933,14.359,1056,11.535,1401,13.064,1687,14.81,2141,11.685,3202,14.81,3238,16.939]],["keywords/506",[]],["title/507",[60,504.882,63,296.762,514,485.1]],["content/507",[6,1.822,25,1.251,60,7.02,63,4.126,70,4.588,234,8.703,467,6.651,514,6.745,536,6.451,543,6.968,910,7.57,920,9.963,926,9.607,990,14.748,1142,13.696,2141,12.002,3239,18.815,3240,17.398,3241,18.815,3242,18.815]],["keywords/507",[]],["title/508",[217,483.395,556,483.395,742,612.527]],["content/508",[6,1.789,25,1.229,37,3.103,202,5.685,217,6.602,334,5.329,514,6.625,525,9.713,532,10.763,556,6.602,718,7.5,742,8.365,904,13.453,931,10.986,936,9.186,963,7.138,984,11.358,994,9.94,1050,13.18,1066,9.862,1672,14.942,2141,11.789]],["keywords/508",[]],["title/509",[116,491.54,278,320.414,330,286.181,356,553.65]],["content/509",[6,1.822,25,1.251,70,4.588,99,6.628,265,6.768,301,4.288,330,5.549,348,10.649,356,8.751,438,7.046,537,6.167,545,5.211,717,9.008,920,9.963,1005,14.352,1056,11.848,1066,10.04,2141,12.002,2160,16.465]],["keywords/509",[]],["title/510",[988,1328.96]],["content/510",[6,1.217,25,1.477,70,4.992,107,3.088,155,3.747,181,3.349,182,2.508,183,3.959,184,2.726,185,3.037,196,6.915,198,3.358,200,6.6,202,3.867,255,5.123,264,3.644,265,6.364,273,2.757,304,6.331,347,5.783,371,6.558,480,4.522,525,6.606,536,4.31,550,7.115,553,5.631,563,5.385,617,6.657,640,8.965,706,9.033,732,4.398,860,7.637,893,7.439,910,5.058,914,8.323,1005,9.588,1056,7.916,1152,8.367,1163,10.535,1167,8.642,1172,8.965,1610,7.818,1623,8.499,1683,11.624,1684,10.535,1686,9.15,1998,16.359,2118,8.499,2141,14.171,2302,11.001,3238,11.624,3243,10.535,3244,12.57,3245,11.624,3246,12.57,3247,12.57,3248,12.57,3249,12.57]],["keywords/510",[]],["title/511",[191,471.331,879,610.406]],["content/511",[4,1.556,19,4.502,25,1.658,33,1.942,51,3.594,87,5.219,105,10.834,125,5.942,152,2.99,171,3.921,191,4.514,196,4.674,200,5.603,222,4.095,257,6.726,264,4.354,265,5.402,293,5.593,366,7.233,398,5.624,523,10.747,853,11.415,872,7.564,879,7.779,882,9.229,883,10.834,884,8.746,886,5.364,887,8.746,937,6.559,993,7.233,994,8.077,995,10.71,996,6.797,997,10.931,998,10.71,1152,9.996,1154,11.771]],["keywords/511",[]],["title/512",[25,79.157,33,153.915,99,419.316,182,237.492]],["content/512",[]],["keywords/512",[]],["title/513",[7,371.572,25,79.157,33,153.915,1066,635.181]],["content/513",[6,2.281,7,5.173,25,1.417,33,2.756,52,4.566,99,5.837,107,4.07,113,7.707,181,4.415,182,3.306,184,3.593,202,5.097,234,7.664,252,8.264,265,5.961,278,4.46,284,7.559,437,6.503,462,6.584,514,5.94,541,8.08,614,7.167,637,9.466,1067,11.204,1068,9.85,1077,9.379,2118,11.204,3250,16.57,3251,16.57]],["keywords/513",[]],["title/514",[25,123.921]],["content/514",[6,2.012,7,4.975,25,1.06,33,3.168,63,3.495,70,3.886,183,5.019,196,4.96,198,4.257,205,4.141,240,3.558,252,6.18,255,6.495,284,8.202,308,5.158,311,6.827,330,3.831,348,9.02,366,7.676,371,8.313,396,5.207,399,8.711,536,5.464,553,7.138,613,5.614,621,11.365,622,6.467,785,4.86,920,8.439,1068,9.473,1127,10.035,1166,10.451,1336,13.946,2076,13.946]],["keywords/514",[]],["title/515",[6,131.019,278,364.276,284,480.028]],["content/515",[6,2.358,25,1.044,33,2.03,44,4.371,99,5.529,125,8.141,202,4.828,246,4.959,278,4.225,279,9.33,284,7.298,297,4.453,322,5.77,330,3.774,334,4.526,425,5.647,520,7.105,525,8.249,538,7.802,545,4.348,593,12.304,622,6.37,712,9.536,732,5.492,858,7.906,910,6.315,973,8.442,991,8.652,1035,9.536,1061,9.762,1078,12.69,1170,8.015,1239,13.154,1377,7.342,1407,11.973,1604,10.148,3252,15.696]],["keywords/515",[]],["title/516",[107,332.397,185,326.9,732,473.461]],["content/516",[5,3.494,6,2.032,25,1.549,33,2.093,70,3.947,107,3.975,151,4.993,155,4.824,176,5.906,181,4.312,182,4.188,185,5.627,186,4.784,192,5.441,314,7.445,330,3.891,438,6.061,466,8.443,490,6.43,545,4.483,553,7.249,564,7.486,613,5.701,652,7.749,704,8.505,717,7.749,985,7.528,1003,13.084,1172,11.542,1296,13.084,3253,16.184]],["keywords/516",[]],["title/517",[6,151.799,184,340.004]],["content/517",[6,2.032,25,1.076,33,2.093,65,5.304,69,5.052,70,3.947,155,4.824,182,3.229,184,4.552,205,5.453,219,7.802,240,3.614,246,5.113,256,7.614,288,7.992,293,4.53,301,3.688,330,3.891,334,4.666,427,5.949,537,5.304,541,7.892,550,9.16,588,12.345,613,7.394,893,6.805,987,10.464,1081,9.946,1118,10.464,3224,14.965,3254,16.184,3255,13.563,3256,16.184]],["keywords/517",[]],["title/518",[183,493.826,273,343.83]],["content/518",[6,2.042,18,4.44,23,3.937,25,0.884,33,1.719,34,3.043,44,3.701,161,4.199,164,5.776,171,3.471,183,7.527,196,4.137,202,4.089,252,5.154,273,5.241,276,8.076,301,3.029,330,5.473,396,4.343,425,4.782,438,4.978,543,7.811,545,5.095,712,8.076,716,4.799,734,6.695,751,8.169,758,5.749,804,6.442,856,8.594,858,6.695,910,5.348,973,7.149,1035,8.076,1066,7.093,1170,6.787,1747,8.987,1931,8.37,3226,10.747,3227,10.419,3228,11.632,3229,12.292]],["keywords/518",[]],["title/519",[281,524.746,297,383.895,379,619.122]],["content/519",[6,2.063,25,1.102,51,3.965,65,5.431,69,5.173,70,4.041,155,4.939,182,4.252,200,6.182,246,5.235,281,9.976,288,8.183,293,4.638,297,4.701,330,3.984,379,7.581,466,8.644,536,5.681,564,7.664,614,7.167,617,8.774,717,7.934,785,5.053,893,6.967,963,6.4,985,7.707,1118,10.714,1178,11.204,1668,12.989]],["keywords/519",[]],["title/520",[25,70.65,33,137.374,99,374.253,467,375.547,670,595.91]],["content/520",[1,6.597,4,1.534,6,1.916,18,4.945,25,1.483,33,3.078,37,3.323,52,4.079,92,6.312,99,5.215,110,6.53,182,2.954,200,5.523,202,4.554,252,5.74,255,6.033,265,5.326,278,3.985,284,5.251,293,5.54,310,6.701,398,5.544,437,8.751,467,5.233,474,8.538,481,8.161,536,5.076,540,11.019,551,6.736,563,6.342,637,8.457,699,9.572,991,8.161,1000,7.962,1017,11.019,1032,10.177,1068,8.8,1082,9.853,1589,11.019,2616,12.955]],["keywords/520",[]],["title/521",[25,79.157,52,327.97,96,673.714,99,419.316]],["content/521",[4,1.94,6,1.321,25,1.245,40,5.207,41,9.223,52,6.341,61,7.336,63,2.991,99,6.596,114,3.965,182,2.722,196,4.246,222,5.106,252,5.289,255,5.559,256,6.417,275,4.542,279,8.108,284,4.839,293,3.818,308,4.415,322,6.883,334,3.933,393,7.336,408,6.195,487,8.589,496,5.512,536,4.677,549,7.169,559,8.701,587,8.701,659,6.275,692,6.965,699,8.819,700,10.153,712,8.287,732,4.772,858,6.87,893,5.735,956,8.589,986,9.378,1037,9.728,1068,8.108,1164,8.383,1234,11.432,1581,12.613,1984,8.701,2486,12.613,2909,12.613,2962,12.613,3257,12.613,3258,13.641,3259,13.641]],["keywords/521",[]],["title/522",[4,123.338,25,79.157,99,419.316,182,237.492]],["content/522",[12,4.181,22,5.235,23,4.082,24,5.906,25,1.53,29,8.274,32,2.538,34,2.746,35,4.907,37,2.013,54,7.436,99,6.027,124,7.47,125,4.745,182,2.393,241,4.457,255,4.887,275,3.993,291,5.741,355,4.726,408,3.968,467,7.689,481,6.61,529,6.787,600,12.863,776,8.144,777,5.344,779,7.982,786,5.137,879,4.669,981,9.774,1061,7.458,1075,8.926,1256,9.684,1257,5.486,1400,9.597,1663,6.667,1704,7.551,1769,10.05,1814,7.551,1942,9.4,3260,11.992,3261,11.992,3262,11.089,3263,10.05]],["keywords/522",[]],["title/523",[4,123.338,25,79.157,99,419.316,517,645.355]],["content/523",[6,1.677,19,3.658,23,4.094,25,0.811,32,4.262,60,4.553,99,4.299,149,5.061,161,5.473,164,5.44,171,3.186,183,3.843,224,5.253,251,6.785,252,4.732,273,3.799,284,4.328,291,5.842,293,3.416,330,2.934,425,4.39,517,11.887,543,4.519,545,3.38,581,5.178,622,4.952,854,9.565,879,4.751,937,5.329,973,6.563,1035,7.413,1061,10.774,1320,6.563,2354,10.226,3264,10.678,3265,10.678,3266,12.202,3267,12.202,3268,17.323,3269,12.202,3270,17.323,3271,11.284,3272,12.202,3273,12.202,3274,10.226,3275,12.202,3276,12.202,3277,12.202,3278,12.202,3279,12.202,3280,9.865,3281,12.202,3282,12.202,3283,12.202,3284,12.202]],["keywords/523",[]],["title/524",[25,79.157,65,390.118,400,535.943,408,393.825]],["content/524",[2,3.939,4,2.282,5,3.414,6,1.815,20,4.817,21,6.202,25,1.051,33,2.425,37,3.698,51,4.947,52,2.963,54,4.674,58,3.939,65,3.524,69,3.357,70,2.623,85,7.616,86,4.345,98,6.773,99,6.606,100,8.157,113,5.002,114,3.126,125,4.255,149,4.461,196,4.921,222,2.932,232,6.392,234,4.974,246,3.397,248,5.83,256,5.059,264,3.118,275,5.265,293,3.01,308,3.481,334,3.101,395,4.522,399,5.878,400,8.443,408,7.288,420,6.533,437,4.22,467,3.801,491,11.51,492,7.271,506,5.83,514,3.855,536,3.687,539,5.002,614,4.651,672,6.688,716,3.882,785,3.279,874,7.01,963,4.153,983,6.392,1019,6.771,1110,6.143,1173,6.392,1181,9.411,1185,8.694,1413,9.012,1434,8.203,1670,9.411,2731,8.203,3285,10.754,3286,10.754]],["keywords/524",[]],["title/525",[6,92.877,25,63.794,205,249.247,219,356.567,240,214.197,613,337.935]],["content/525",[3,6,6,1.758,25,1.207,45,5.924,65,4.275,107,3.204,114,3.792,155,3.888,181,4.837,184,4.528,192,4.385,196,4.059,204,6.171,205,5.425,219,4.848,225,4.675,226,6.66,227,6.707,240,4.663,241,4.848,246,4.12,288,6.441,297,3.7,310,5.904,314,6.44,330,3.136,334,3.761,427,4.795,490,5.182,519,7.015,536,4.472,550,7.382,551,5.935,554,6.245,613,7.953,622,5.293,732,4.563,785,3.977,894,6.957,914,6.136,931,7.753,985,6.067,987,8.433,1019,8.213,1067,8.819,1118,8.433,1148,9.127,1296,10.545,1630,11.414,2055,10.931,2117,8.553,2136,9.127,3287,13.043]],["keywords/525",[]],["title/526",[25,79.157,202,366.157,563,509.904,1119,686.479]],["content/526",[5,3.757,6,2.452,25,1.157,70,4.244,87,6.047,155,5.187,181,4.636,185,5.311,202,5.353,278,4.684,297,4.936,480,7.909,532,10.134,564,8.049,863,12.68,899,12.666,906,9.434,914,8.186,931,10.343,932,7.918,934,10.694,1190,13.64,1299,12.666]],["keywords/526",[]],["title/527",[60,504.882,63,296.762,514,485.1]],["content/527",[6,1.789,25,1.229,33,2.39,60,8.517,63,4.053,92,7.88,273,4.053,293,5.173,393,9.94,419,11.228,424,11.949,514,6.625,525,9.713,550,10.46,590,7.88,718,7.5,737,6.213,926,9.437,963,7.138,1238,12.933,1427,9.862]],["keywords/527",[]],["title/528",[217,483.395,556,483.395,742,612.527]],["content/528",[2,6.891,25,1.251,33,2.433,37,3.159,63,4.126,182,3.754,186,5.561,217,6.721,232,11.184,512,7.702,556,6.721,703,7.02,718,7.635,742,8.516,921,9.744,944,10.554,994,10.119,1045,14.352,1119,10.851,1129,15.212]],["keywords/528",[]],["title/529",[116,491.54,278,320.414,330,286.181,356,553.65]],["content/529",[6,1.728,25,1.187,40,6.813,116,9.225,151,5.506,196,5.555,202,5.49,278,4.804,293,4.996,301,4.068,330,5.371,356,8.302,438,6.684,537,5.85,538,8.871,545,4.944,551,8.122,734,8.989,735,8.036,987,11.54,1035,10.843,1128,12.992,1170,9.113,2968,16.504]],["keywords/529",[]],["title/530",[988,1328.96]],["content/530",[6,2.042,25,1.514,33,1.719,70,3.242,99,8.019,107,3.265,113,6.183,181,3.542,182,4.208,196,6.565,198,3.551,200,4.959,202,4.089,252,5.154,255,7.497,265,4.782,278,3.578,284,6.525,297,3.771,301,3.029,348,7.524,428,7.149,437,5.217,462,5.281,537,4.357,541,6.482,553,5.954,566,9.138,613,4.683,617,7.039,640,9.48,706,6.787,860,8.076,892,8.169,893,5.589,910,5.348,914,6.253,961,7.327,963,5.134,992,9.48,999,9.676,1005,10.139,1067,8.987,1068,7.901,1159,11.14,1163,11.14,1187,8.594,1684,11.14,1686,9.676,3288,13.292,3289,13.292,3290,13.292]],["keywords/530",[]],["title/531",[191,471.331,879,610.406]],["content/531",[4,1.579,19,4.567,25,1.666,33,1.97,51,3.646,87,5.295,99,5.368,105,10.939,125,6.029,152,3.034,171,3.979,191,4.58,196,4.742,222,4.155,265,5.481,293,5.648,366,7.339,398,5.706,523,12.166,853,11.526,872,7.674,879,7.855,882,9.364,883,10.939,884,8.874,886,5.443,887,8.874,937,6.655,993,7.339,994,8.195,995,10.867,996,6.897,997,11.091,998,10.867,1154,11.944]],["keywords/531",[]],["title/532",[25,63.794,33,124.043,52,264.317,99,337.935,264,278.105,462,381.156]],["content/532",[]],["keywords/532",[]],["title/533",[52,513.439]],["content/533",[5,4.601,6,2.063,33,2.143,37,3.578,51,3.965,52,4.566,181,4.415,182,3.306,186,4.898,200,6.182,222,4.518,232,9.85,286,10.183,293,4.638,297,4.701,308,5.364,322,7.834,395,6.967,501,8.52,556,5.919,557,6.584,563,7.098,572,5.919,630,6.091,659,7.622,692,8.461,694,8.236,695,8.183,911,10.57,1329,8.403,2095,11.595]],["keywords/533",[]],["title/534",[4,140.222,52,372.867,99,476.718]],["content/534",[4,1.857,5,2.764,6,2.282,9,5.857,12,4.464,23,1.951,40,6.84,44,3.565,52,4.937,63,2.807,69,3.996,70,4.37,79,6.779,97,4.494,99,4.51,107,4.402,149,7.433,151,3.95,181,3.411,182,3.575,184,2.776,185,5.41,192,4.304,193,5.129,205,4.656,206,4.557,240,4.001,243,5.889,272,5.458,273,2.807,298,6.282,334,3.691,373,3.302,385,4.689,490,5.087,520,5.795,525,6.728,559,8.166,675,5.955,704,6.728,709,7.868,713,8.277,716,4.622,718,5.195,719,8.801,893,5.383,914,6.023,924,8.166,1000,6.886,1062,9.529,1064,8.959,1197,8.959,1398,8.062,3291,11.838,3292,11.838,3293,11.838]],["keywords/534",[]],["title/535",[4,140.222,52,372.867,510,686.235]],["content/535",[4,0.965,5,2.01,6,0.902,14,3.5,16,4.788,25,1.28,37,1.563,51,2.228,52,6.447,58,5.199,63,2.042,88,3.193,92,3.97,99,3.28,110,6.262,114,2.707,125,5.617,142,5.478,152,2.826,155,2.776,182,1.858,183,6.06,186,2.752,195,4.931,196,5.354,202,4.367,222,3.871,246,2.942,252,3.611,256,4.381,264,2.699,265,3.35,273,4.542,278,2.507,281,6.671,286,5.723,293,2.607,297,4.88,300,5.133,308,6.705,310,4.215,319,4.149,322,3.423,330,2.239,364,5.049,389,4.788,390,6.931,398,3.487,425,3.35,438,3.487,462,3.7,479,5.595,480,3.35,485,7.299,506,5.049,510,4.722,536,4.867,539,4.331,543,3.448,545,2.579,549,4.894,553,4.171,559,5.94,563,6.081,587,5.94,614,4.027,630,3.423,634,6.641,659,4.283,692,4.755,700,10.566,703,3.474,727,6.516,728,8.149,738,6.02,742,4.215,943,4.894,951,8.149,963,3.596,996,4.215,1072,6.516,1164,5.723,1169,4.26,1335,7.299,1547,6.198,1697,5.27,1720,8.149,2114,6.106,2731,7.103,3294,8.61,3295,8.61,3296,9.312,3297,9.312,3298,8.61,3299,9.312,3300,8.61,3301,8.61]],["keywords/535",[]],["title/536",[25,79.157,99,419.316,171,310.82,191,357.826]],["content/536",[25,1.336,41,13.58,52,5.534,99,7.075,111,7.579,171,5.245,191,6.038,202,6.178,272,8.563,322,7.383,400,9.043,462,7.98,529,11.368]],["keywords/536",[]],["title/537",[25,104.266,29,650.349]],["content/537",[25,1.625,28,10.568,29,10.136,30,9.73,107,5.08,722,12.308]],["keywords/537",[]],["title/538",[33,174.985,198,361.493,224,410.309]],["content/538",[4,1.06,19,3.065,22,3.998,23,4.213,24,5.258,25,1.013,32,3.224,33,2.354,34,3.488,35,5.785,37,3.387,52,2.818,63,2.242,99,3.602,103,4.557,111,3.859,114,5.292,171,2.67,191,3.074,198,2.732,204,4.839,224,3.1,264,4.416,271,3.627,275,6.062,289,4.756,293,2.862,334,2.948,355,4.03,440,4.73,462,4.063,467,3.615,510,5.185,536,3.506,572,3.653,590,4.36,607,5.544,630,7.416,723,6.914,758,4.423,763,5.221,764,5.59,765,5.967,766,12.316,767,5.842,768,10.4,769,7.444,770,5.05,771,7.294,772,4.242,773,7.174,774,5.59,775,4.896,776,7.25,777,4.557,779,6.806,780,5.415,1540,6.36,3302,9.456]],["keywords/538",[]],["title/539",[784,1141.31,785,478.129]],["content/539",[23,4.255,32,4.464,33,1.45,34,5.659,35,6.704,63,2.46,171,2.929,462,8.38,490,4.457,545,3.107,642,5.024,659,5.16,682,13.184,768,6.408,784,8.165,785,3.421,786,4.805,787,7.903,788,9.4,789,13.666,790,9.816,791,9.816,792,6.469,793,9.816,794,14.27,795,9.816,796,9.816,797,14.27,798,9.816,799,11.21,800,7.849,801,9.4,802,9.816,803,16.813,804,9.311,805,12.599,806,7.855,807,9.069,808,9.4,809,5.539,810,9.816]],["keywords/539",[]],["title/540",[273,261.029,284,422.228,545,329.694,735,535.943]],["content/540",[4,1.865,6,1.743,25,1.494,99,6.342,182,3.592,183,5.67,204,8.518,265,6.476,273,3.948,284,6.386,289,8.373,293,5.039,301,4.103,419,10.937,517,9.76,537,5.9,562,10.382,722,9.067,732,6.298,735,8.106,826,9.924,936,8.948,961,9.924,3303,13.731]],["keywords/540",[]],["title/541",[99,419.316,183,374.904,517,645.355,722,599.526]],["content/541",[6,1.604,19,3.436,22,3.009,23,4.177,25,0.762,32,4.116,51,2.743,97,4.025,99,5.836,151,3.537,161,5.233,164,6.691,183,5.218,192,3.854,198,3.062,224,5.023,255,4.672,273,3.633,281,4.445,284,4.066,330,3.983,360,6.549,396,3.745,399,6.267,425,4.124,538,8.234,544,4.277,545,4.588,553,5.135,722,5.774,735,5.162,768,6.549,819,8.022,820,7.881,824,8.022,825,7.751,1033,8.345,1061,12.098,1170,5.854,3304,13.883,3305,13.883,3306,9.607,3307,10.601,3308,9.268,3309,10.601,3310,10.601,3311,10.601,3312,9.607,3313,10.032,3314,10.032,3315,10.032,3316,10.601,3317,11.464,3318,9.607,3319,9.607,3320,8.986]],["keywords/541",[]],["title/542",[826,864.293,3303,1195.939]],["content/542",[4,1.103,6,1.031,22,4.892,23,4.113,24,5.417,25,1.24,28,4.603,29,6.509,30,5.007,32,3.321,33,1.376,34,2.437,35,3.052,37,1.787,44,2.964,99,3.75,107,2.614,151,3.284,161,3.362,164,3.342,171,2.779,182,2.124,191,3.2,224,3.227,251,5.918,252,4.127,255,4.338,256,5.007,273,2.334,275,3.544,284,7.297,293,2.979,297,3.019,330,2.559,360,6.08,385,3.898,407,5.19,425,3.829,496,4.301,536,3.649,545,2.948,714,7.084,732,3.724,764,5.818,768,6.08,776,7.469,777,4.743,819,7.448,820,7.317,825,7.197,826,12.092,845,6.98,847,8.605,848,8.343,849,8.343,858,5.361,954,5.594,969,7.197,970,8.119,1077,6.024,1170,5.435,3303,15.691,3306,8.92,3308,8.605,3315,9.314,3321,10.644,3322,14.511,3323,8.92,3324,9.842,3325,10.644]],["keywords/542",[]],["title/543",[19,356.811,25,79.157,52,327.97,99,419.316]],["content/543",[4,2.34,19,5.443,25,1.634,67,7.306,85,8.747,99,6.397,182,4.505,255,7.401,291,8.694,349,11.741,523,9.767,554,8.694,580,8.353,621,12.951,853,12.9,854,14.234,855,10.794,1341,14.681,3212,15.891]],["keywords/543",[]],["title/544",[25,89.993,202,416.281,563,579.706]],["content/544",[4,1.567,6,2.419,25,1.499,33,1.956,37,3.371,184,3.28,185,3.654,201,5.842,202,4.653,222,4.125,265,5.442,278,4.072,330,3.637,425,5.442,435,9.186,480,5.442,481,8.338,514,5.422,536,5.186,553,6.775,556,5.403,563,6.48,613,5.329,614,6.542,652,7.242,742,9.088,765,4.958,856,9.78,857,7.778,861,7.036,869,9.919,872,7.619,932,6.883,1747,10.227,1782,10.788,3326,15.126,3327,15.126,3328,15.126]],["keywords/544",[]],["title/545",[52,432.005,703,584.959]],["content/545",[5,3.886,6,1.743,37,3.022,51,5.374,52,6.188,61,9.682,63,3.948,222,4.909,391,11.312,462,7.153,674,6.593,683,12.597,703,9.564,861,8.373,945,14.111,1025,13.731,1165,11.805,1558,11.063,3329,16.646]],["keywords/545",[]],["title/546",[52,432.005,179,779.313]],["content/546",[25,1.549,37,3.524,58,5.928,62,6.933,63,4.603,98,6.933,99,5.701,100,5.993,122,7.103,142,9.521,179,8.044,182,3.229,222,4.413,287,8.044,297,4.591,308,5.239,334,4.666,395,6.805,437,6.352,533,9.16,536,7.197,562,9.334,827,9.946,871,13.084,872,8.151,873,9.724,874,10.327,877,8.998,1000,8.704,1019,10.191,3330,14.965]],["keywords/546",[]],["title/547",[37,199.834,51,284.834,63,261.029,689,650.672]],["content/547",[25,1.389,37,3.507,40,7.974,51,4.999,63,4.581,114,6.073,193,8.37,554,10.002,878,13.699]],["keywords/547",[]],["title/548",[191,471.331,879,610.406]],["content/548",[4,2.051,23,2.256,25,1.65,52,5.453,99,5.215,181,3.944,182,2.954,196,4.608,198,3.955,200,5.523,202,4.554,234,6.847,256,6.964,265,5.326,273,3.246,281,5.74,284,5.251,304,7.456,322,5.442,385,5.422,398,5.544,462,5.882,496,5.982,523,7.962,563,6.342,617,7.839,642,6.631,659,6.81,692,7.559,738,9.572,853,8.457,857,7.612,883,8.026,884,8.622,885,10.776,910,5.956,912,7.723,931,8.8,937,6.465,996,6.701,1171,10.177,1583,11.604,2515,11.019,3331,13.689]],["keywords/548",[]],["title/549",[58,389.113,99,374.253,480,563.738,3332,1062.382]],["content/549",[]],["keywords/549",[]],["title/550",[23,206.245,480,486.819,2089,887.426]],["content/550",[6,2.23,70,3.857,87,5.496,155,4.714,176,5.772,182,3.155,192,5.317,228,6.907,385,5.793,480,8.789,551,7.197,556,5.649,674,5.793,718,6.418,855,9.401,863,9.121,869,10.371,906,11.21,914,7.44,1088,14.624,1103,11.067,1140,11.772,1147,8.718,1299,11.512,1401,11.279,1402,11.512,2057,10.873,2146,11.512,2592,14.624,3202,12.786,3324,14.624,3333,12.786,3334,15.815,3335,15.815,3336,15.815]],["keywords/550",[]],["title/551",[58,435.966,99,419.316,480,428.201,878,780.572]],["content/551",[4,1.451,5,3.024,6,2.099,25,0.932,33,2.466,37,3.201,44,3.9,45,3.974,58,7.94,69,4.373,98,6.001,99,7.637,100,5.187,110,8.411,185,3.384,200,5.226,222,3.82,241,5.207,255,5.709,265,5.039,297,3.974,308,4.534,400,6.307,458,6.515,480,9.035,551,6.374,556,5.004,557,5.566,614,6.058,894,5.368,932,8.677,969,9.471,970,10.685,971,8.326,1121,12.328,1262,8.608,1900,10.426,3337,14.007,3338,14.007,3339,11.325,3340,12.953,3341,14.007]],["keywords/551",[]],["title/552",[25,63.794,58,351.353,99,337.935,171,250.496,191,288.379,480,345.096]],["content/552",[]],["keywords/552",[]],["title/553",[25,70.65,29,440.672,45,301.381,334,306.314,1300,488.703]],["content/553",[25,1.588,28,10.326,29,10.612,44,5.539,45,5.643,480,7.156,1121,12.862,1262,12.225,3342,19.893,3343,18.395]],["keywords/553",[]],["title/554",[25,63.794,33,124.043,108,500.434,171,250.496,191,288.379,480,345.096]],["content/554",[1,3.507,2,5.662,4,2.111,6,0.762,10,4.929,19,3.734,20,5.579,22,4.057,23,4.195,24,4.299,25,1.169,32,2.636,33,1.018,34,2.852,35,2.257,37,3.715,45,5.778,58,2.882,62,3.371,63,1.726,100,4.612,114,3.621,151,2.428,161,2.486,167,3.42,171,2.055,186,2.326,191,2.366,198,3.327,200,2.936,203,7.839,204,3.724,223,4.046,224,2.386,271,2.791,308,2.547,334,2.269,355,4.908,378,4.728,381,2.539,402,4.538,437,3.089,480,5.561,481,4.338,529,4.454,536,2.698,537,2.579,564,3.64,572,2.811,590,3.355,607,4.267,630,6.461,758,3.404,763,4.018,765,5.066,767,4.496,770,3.886,771,6.193,772,3.264,773,6.092,774,4.302,775,3.768,777,3.507,780,4.167,932,5.668,936,3.911,1089,4.538,1121,9.995,1262,4.836,1400,4.414,1540,4.894,1612,9.271,1628,4.629,1894,9.501,1895,6.003,2913,5.857,3343,11.518,3344,7.869,3345,7.277,3346,12.455,3347,7.869,3348,7.277,3349,7.277,3350,7.869,3351,10.9,3352,10.9]],["keywords/554",[]],["title/555",[6,102.858,273,232.977,480,382.183,787,514.862,1308,601.311]],["content/555",[4,1.092,5,4,6,2.351,23,4.023,32,3.921,33,2.014,34,4.687,44,2.934,68,5.537,164,3.309,167,4.579,171,2.751,191,3.167,234,7.204,273,4.79,355,4.152,425,3.79,458,4.901,480,8.737,490,4.186,496,4.257,516,8.009,527,5.418,545,4.314,556,5.564,732,3.686,737,7.687,765,3.453,771,4.221,787,5.106,804,5.106,806,5.075,863,6.076,1112,6.263,1321,8.83,1417,8.514,1690,7.514,1900,13.791,2079,6.019,2717,8.037,2927,9.807,3345,9.743,3351,13.63,3352,13.63,3353,10.536,3354,10.536,3355,10.536,3356,9.743,3357,9.22,3358,10.536,3359,10.536,3360,10.536,3361,9.743]],["keywords/555",[]],["title/556",[58,389.113,85,511.73,99,374.253,480,382.183,855,631.517]],["content/556",[4,1.696,5,3.534,6,1.742,8,3.68,14,2.613,19,2.083,22,2.959,23,3.683,25,0.462,32,3.011,33,0.899,34,3.748,37,1.893,44,1.935,45,4.036,46,2.25,58,6.591,63,3.12,79,3.68,98,6.094,99,5.766,103,3.097,121,4.176,131,3.525,151,2.144,152,1.384,155,4.241,161,2.196,162,2.457,167,3.021,176,2.536,184,1.507,196,3.509,200,2.593,203,3.525,215,3.653,219,2.583,220,2.457,240,1.552,243,3.197,264,2.015,273,1.524,278,1.871,297,1.972,308,2.25,381,2.243,392,3.233,398,2.603,425,2.5,437,2.728,454,4.494,480,7.861,514,2.492,520,5.104,613,2.448,622,4.576,630,2.555,631,4.048,682,5.619,737,2.337,740,3.233,763,3.549,764,3.799,765,2.278,771,2.785,804,3.368,806,3.348,926,3.549,932,8.769,934,4.271,937,3.036,985,3.233,996,5.104,1000,7.652,1121,4.494,1147,3.831,1151,4.494,1191,4.434,1211,5.448,1220,6.441,1238,4.864,1298,6.775,1400,10.093,1401,8.041,1407,5.302,1580,5.173,1663,3.864,1690,4.957,1796,4.223,1822,5.173,1850,4.957,2023,5.498,2728,5.302,2927,4.377,3340,16.639,3349,6.427,3351,6.082,3356,6.427,3357,6.082,3362,6.95,3363,6.95,3364,6.95,3365,6.95,3366,6.95,3367,9.282,3368,6.082,3369,6.427,3370,6.95,3371,6.95,3372,9.45,3373,6.95,3374,11.276,3375,4.626,3376,6.95,3377,14.226,3378,16.368,3379,6.95,3380,9.867,3381,11.276]],["keywords/556",[]],["title/557",[191,471.331,879,610.406]],["content/557",[4,2.27,6,1.384,16,7.351,19,4.285,23,2.179,25,1.68,33,1.849,45,5.484,58,8.023,63,3.135,70,3.486,85,6.886,97,5.019,99,7.717,182,2.852,222,3.898,398,7.24,462,5.68,480,6.955,523,7.689,541,6.971,622,5.801,642,6.403,740,6.649,853,8.167,855,8.498,857,9.941,879,5.566,883,7.751,884,8.326,885,10.406,894,5.478,932,6.505,937,6.244,993,6.886,1039,10.904,2515,10.641,3382,14.296,3383,13.219,3384,14.296]],["keywords/557",[]],["title/558",[23,113.237,25,49.41,37,124.737,181,197.97,264,215.398,275,247.396,481,409.573,563,318.282,3385,540.846]],["content/558",[]],["keywords/558",[]],["title/559",[5,207.102,6,92.877,275,319.419,1160,486.458,1300,441.279,3385,698.297]],["content/559",[4,0.844,5,2.763,6,2.001,22,2.138,23,3.863,30,6.022,32,2.709,40,3.11,44,2.268,51,3.063,54,3.54,60,3.039,63,1.786,67,3.278,69,2.543,70,3.122,88,2.793,99,4.509,107,2.001,151,2.513,158,5.13,161,4.044,164,5.626,171,3.342,181,3.41,230,2.574,264,2.362,273,1.786,275,7.199,278,2.193,281,3.159,289,3.789,308,2.637,315,2.653,334,2.349,421,4.219,499,4.281,527,6.582,529,4.611,556,4.572,557,3.237,563,5.483,572,2.91,577,5.067,581,3.457,613,2.87,614,3.523,643,5.81,650,4.698,668,4.219,674,2.984,693,3.649,694,4.049,695,4.023,703,3.039,736,3.051,739,8.276,858,4.103,887,7.455,921,4.219,936,4.049,942,4.895,961,4.491,965,7.961,1325,5.267,1327,4.347,1384,5.6,1558,5.006,1604,5.267,1606,5.6,1719,6.386,1751,5.81,2019,7.533,2035,6.827,2052,6.214,2060,6.214,2095,5.701,2099,6.827,2254,4.611,2778,5.81,2870,7.533,2873,7.533,2884,6.827,3058,6.214,3304,10.727,3305,10.727,3312,6.827,3319,6.827,3385,5.93,3386,8.146,3387,12.8,3388,12.8,3389,8.146,3390,8.146,3391,8.146,3392,8.146,3393,8.146,3394,8.146,3395,8.146,3396,8.146,3397,8.146,3398,8.146,3399,8.146,3400,8.146,3401,8.146,3402,8.146,3403,8.146,3404,8.146,3405,8.146,3406,8.146,3407,8.146,3408,8.146,3409,8.146,3410,8.146,3411,8.146,3412,8.146,3413,8.146,3414,8.146]],["keywords/559",[]],["title/560",[52,292.723,108,554.215,275,353.746,670,595.91,1160,538.737]],["content/560",[4,1.303,5,3.819,6,1.713,16,6.464,37,2.11,44,3.5,51,3.008,52,4.875,60,6.6,69,3.924,70,3.066,87,4.368,114,3.654,171,3.282,217,6.32,222,5.582,265,4.522,273,2.757,275,5.891,284,4.459,286,7.725,293,3.519,308,4.069,400,5.66,440,8.183,480,4.522,496,5.079,527,6.464,541,6.13,556,6.32,557,7.029,563,5.385,569,6.168,572,4.49,581,5.335,613,4.428,659,5.783,692,6.419,693,5.631,694,8.793,703,4.69,773,4.954,861,5.847,898,8.642,973,6.761,1037,8.965,1327,6.708,1847,9.357,1861,11.624,1965,8.796,2035,10.535,2052,9.588,2070,10.163,2544,11.001,3385,12.878,3415,12.57,3416,12.57,3417,12.57,3418,12.57,3419,12.57,3420,12.57,3421,12.57]],["keywords/560",[]],["title/561",[25,53.425,37,134.874,481,442.858,856,519.427,1160,407.391,1308,454.709,1388,512.459,3385,584.799]],["content/561",[5,3.886,6,1.743,14,6.767,37,3.022,52,4.96,114,5.233,152,4.472,171,4.701,179,8.948,181,4.797,220,6.364,284,6.386,315,5.863,414,7.037,536,6.172,732,6.298,920,9.533,1183,9.924,1965,12.597,1986,11.639,3385,13.104,3422,16.646,3423,18.002,3424,18.002]],["keywords/561",[]],["title/562",[19,356.811,25,79.157,183,374.904,1378,740.294]],["content/562",[4,0.708,6,1.362,22,3.692,23,4.246,24,3.84,25,0.455,32,4.047,34,3.711,35,4.648,37,1.148,51,1.636,54,2.971,99,6.285,107,1.679,151,3.432,158,4.305,161,3.514,164,5.09,167,2.971,177,3.515,181,1.822,183,2.153,185,1.651,191,2.055,224,3.373,264,3.225,271,2.425,273,4.42,275,2.276,281,2.651,284,3.946,315,3.623,319,3.046,330,3.382,334,1.971,348,3.869,355,2.694,360,3.905,413,3.541,425,4.002,462,5.589,490,2.716,538,5.53,544,5.248,545,3.081,572,2.442,611,4.305,630,5.959,642,3.062,652,3.273,722,3.443,734,3.443,740,3.18,758,2.957,765,3.646,766,8.994,767,3.905,768,8.036,770,3.376,771,6.494,772,4.615,773,5.543,776,5.295,777,3.046,780,3.62,787,3.313,788,5.729,801,5.729,806,5.359,819,4.784,820,4.7,823,5.359,824,4.784,825,4.622,891,6.133,1061,6.919,1080,5.359,1143,4.42,1170,3.491,1256,3.869,1257,3.128,1300,3.145,1567,5.359,1987,5.215,2124,5.983,2130,4.483,3304,9.324,3305,9.324,3306,9.324,3307,6.322,3308,5.527,3309,6.322,3310,6.322,3315,5.983,3316,6.322,3318,5.729,3425,6.836,3426,6.836,3427,6.836,3428,11.125,3429,6.836,3430,6.836,3431,6.322]],["keywords/562",[]],["title/563",[4,90.608,183,275.416,381,282.178,826,482.031,1160,443.427,1313,519.794,3303,666.996]],["content/563",[1,4.648,4,1.081,22,4.834,23,4.047,24,5.336,25,1.028,32,3.898,34,2.388,35,2.991,37,1.751,45,2.959,78,8.741,99,3.674,111,3.936,114,4.494,125,4.127,151,3.218,167,4.533,183,5.802,196,4.812,198,2.786,222,2.844,224,3.163,271,3.7,273,2.287,275,3.473,284,7.226,297,2.959,319,6.889,355,4.11,360,5.959,381,4.989,407,5.086,452,4.825,529,5.904,563,4.468,581,6.56,636,5.702,642,4.672,664,5.219,722,7.786,732,3.649,764,5.702,776,7.358,777,4.648,826,12.998,827,6.41,850,13.529,943,5.482,965,9.615,969,7.052,970,7.956,1098,8.176,1124,6.744,1187,6.744,1196,6.84,1636,7.299,2075,7.956,3303,15.538,3308,8.433,3322,14.295,3323,8.741,3385,7.593,3432,10.431,3433,10.431]],["keywords/563",[]],["title/564",[25,70.65,37,178.358,480,382.183,1160,538.737,1320,571.393]],["content/564",[5,3.195,6,1.722,14,3.699,22,4.669,23,4.207,24,5.109,25,0.984,32,3.132,34,3.389,35,2.822,37,3.322,45,2.791,70,3.609,151,3.036,152,1.959,167,4.276,182,1.963,222,2.683,271,3.49,275,3.276,293,4.143,307,8.536,334,2.837,355,3.877,425,3.54,480,8.321,541,4.798,563,4.215,572,3.515,630,6.54,737,4.976,758,4.256,765,4.851,767,5.621,770,4.859,771,7.128,772,4.081,773,5.832,776,7.044,777,4.385,780,5.21,863,5.675,873,5.912,924,6.276,1121,6.362,1262,6.047,1400,8.302,1401,7.017,1402,7.162,1617,5.133,1894,11.289,1895,7.505,1897,11.966,1900,11.016,2304,7.162,2669,6.653,3385,10.774,3434,9.839,3435,9.839,3436,9.839,3437,9.839,3438,14.8]],["keywords/564",[]],["title/565",[181,417.762,315,510.669]],["content/565",[6,1.685,25,1.157,33,2.25,44,4.845,45,4.936,70,4.244,131,8.824,176,6.35,181,4.636,184,3.773,185,4.203,208,9.512,239,8.885,242,9.592,243,8.004,293,4.871,314,6.172,330,4.184,379,10.059,425,6.26,454,11.25,554,8.331,613,6.13,652,8.331,704,9.145,707,11.765,1170,8.885,1310,10.134]],["keywords/565",[]],["title/566",[25,63.794,52,264.317,275,319.419,670,814.443,878,629.078]],["content/566",[4,0.841,5,3.405,6,1.998,37,2.142,40,4.871,44,2.259,45,3.62,52,3.516,58,5.776,60,5.884,62,3.476,69,3.983,73,4.143,88,2.782,107,1.993,114,3.71,116,3.351,131,4.115,152,1.616,154,2.983,166,6.918,171,2.119,181,3.4,183,4.019,184,1.76,185,1.96,217,6.386,222,2.213,225,2.909,226,4.143,230,2.563,239,4.143,242,4.473,243,3.733,265,2.919,273,3.921,275,2.702,278,2.184,281,4.948,284,4.526,286,4.987,297,4.474,301,1.849,307,4.68,308,2.627,311,3.476,315,2.643,319,3.616,322,2.983,355,3.198,379,3.712,398,3.039,414,3.172,416,5.401,427,2.983,454,5.247,458,3.774,467,4.511,480,6.432,481,4.473,499,4.265,520,3.673,527,4.173,537,2.66,539,3.774,544,3.027,545,2.248,555,5.047,556,4.558,557,3.224,572,2.899,581,6.692,613,2.859,614,6.821,634,5.787,652,3.885,659,7.254,668,4.202,683,5.678,692,4.143,693,8.008,694,4.033,698,5.247,737,2.728,739,10.196,765,2.66,773,3.198,826,4.473,858,9.005,921,4.202,954,4.265,960,6.561,993,3.909,1007,4.265,1115,5.907,1207,4.68,1327,4.33,1329,4.115,1582,6.04,1980,6.801,2049,5.247,2058,5.176,2070,6.561,2082,7.101,2197,6.361,2736,7.101,2848,6.801,2979,5.487,3303,6.19,3439,8.115,3440,8.115,3441,8.115,3442,15.646,3443,7.504]],["keywords/566",[]],["title/567",[191,471.331,879,610.406]],["content/567",[1,4.113,4,0.956,6,1.656,14,3.469,19,5.129,25,1.372,37,3.215,44,2.57,45,2.618,49,4.342,70,3.438,73,4.712,85,4.445,96,5.224,99,6.027,105,9.276,106,6.345,107,3.463,113,4.293,114,4.099,125,5.579,152,1.837,171,2.41,181,4.559,182,1.841,191,4.238,193,3.698,198,2.465,200,3.443,202,2.839,217,3.297,224,2.798,225,3.308,227,4.746,255,5.746,264,2.676,265,3.32,275,3.073,278,2.484,284,3.274,301,2.103,308,2.987,311,3.954,315,3.006,334,2.661,366,4.445,398,3.456,409,5.887,438,3.456,440,4.269,474,5.323,480,6.155,481,5.088,523,4.964,527,4.746,537,3.025,541,4.5,556,3.297,557,3.667,563,3.954,590,3.935,613,3.251,637,5.272,732,3.229,737,3.103,765,3.025,826,9.431,853,5.272,855,5.486,857,4.746,861,4.293,869,6.052,872,4.648,879,3.593,881,6.718,882,5.672,883,5.004,884,5.375,888,4.815,934,5.672,965,5.74,991,5.088,993,4.445,994,4.964,996,4.177,1065,5.429,1167,6.345,1365,6.718,1565,8.534,1567,7.234,1622,11.816,1636,6.458,1733,8.076,1927,6.718,1982,7.462,2052,7.04,2123,7.234,2286,7.462,2444,5.607,3303,10.754,3385,12.454,3444,9.229,3445,8.534,3446,8.534]],["keywords/567",[]],["title/568",[33,202.738,180,721.234]],["content/568",[]],["keywords/568",[]],["title/569",[180,856.66,424,874.956]],["content/569",[6,0.841,7,2.713,9,6.159,12,5.745,33,2.131,44,2.42,51,2.079,70,2.119,92,5.739,97,3.051,116,3.589,155,2.59,176,3.171,180,9.768,182,1.734,192,2.922,196,4.19,200,3.242,211,10.883,252,3.37,254,5.166,265,3.126,291,4.161,301,5.471,329,3.872,361,9.242,373,2.241,375,4.533,395,8.928,416,5.784,424,13.729,504,3.853,537,6.959,551,3.954,614,3.758,630,3.195,663,4.79,664,4.348,675,4.042,692,4.437,741,5.28,745,4.75,785,5.659,910,7.466,924,5.543,925,7.283,928,7.605,943,4.567,957,5.28,967,6.326,971,8.002,1000,4.674,1064,6.081,1068,8.002,1086,5.619,1127,5.472,1157,8.002,1558,5.341,1602,8.178,1610,5.405,1629,6.812,1687,7.026,1966,6.081,1988,7.026,2055,7.283,2075,6.629,2117,10.805,2126,5.784,2192,7.026,2308,5.472,2321,5.472,2482,7.283,2488,6.326,2507,7.026,2560,5.699,2600,8.036,2610,7.605,2649,8.036,2709,7.283,3447,8.036,3448,7.026,3449,8.036,3450,8.69,3451,8.69,3452,8.69,3453,8.69,3454,8.036,3455,8.036,3456,8.036,3457,8.69,3458,13.461,3459,8.69,3460,7.605,3461,8.69,3462,8.69,3463,8.69,3464,8.69]],["keywords/569",[]],["title/570",[33,137.374,180,488.703,184,230.384,301,242.127,537,348.193]],["content/570",[4,1.243,6,1.931,9,9.126,25,1.138,33,3.092,44,3.339,45,3.402,88,4.112,92,5.113,111,4.525,131,6.081,176,4.376,180,10.58,184,4.326,189,6.123,194,9.965,203,6.081,205,5.652,208,6.555,210,7.982,211,9.695,212,10.494,219,6.36,240,2.678,291,5.741,314,7.076,330,4.114,356,5.578,363,11.089,381,3.87,385,4.392,427,4.408,468,5.486,482,6.555,484,6.726,545,4.739,613,4.224,636,6.555,711,5.089,735,5.399,858,6.04,892,7.37,905,7.128,1006,7.285,1035,7.285,1055,5.96,1166,7.864,1175,7.551,1176,9.774,1196,7.864,1422,8.391,1442,10.05,1444,5.674,1602,7.285,1926,8.391,2308,7.551,2507,9.695]],["keywords/570",[]],["title/571",[180,856.66,182,270.003]],["content/571",[6,1.795,12,4.121,18,2.461,19,2.209,23,3.89,25,0.984,32,1.559,33,1.528,34,1.687,51,1.763,70,3.609,97,2.587,114,2.142,116,3.043,155,2.196,161,2.328,162,5.231,164,5.318,171,3.086,173,4.38,176,2.689,180,7.79,182,3.379,183,2.321,184,1.598,186,2.178,188,4.133,192,3.974,202,2.267,205,3.071,206,2.623,210,4.904,211,5.957,212,6.448,218,5.62,222,2.009,240,1.645,252,2.857,260,3.816,273,3.714,281,2.857,291,3.528,301,2.694,330,4.071,347,3.389,361,4.133,366,3.549,381,2.378,385,2.699,389,3.789,413,6.121,421,3.816,424,4.764,469,5.776,490,2.928,496,4.776,520,3.335,536,2.526,538,5.875,543,6.865,545,3.274,562,6.817,580,3.389,587,4.7,592,7.181,611,4.64,683,5.156,686,6.814,708,4.64,716,2.66,717,3.528,734,3.711,737,2.477,758,3.187,785,3.604,804,3.571,824,5.156,876,4.583,910,4.756,928,10.343,936,3.662,957,4.477,981,4.209,982,3.932,1024,3.466,1108,4.982,1126,5.484,1127,4.64,1170,6.035,1196,4.832,1232,5.957,1300,3.389,1329,3.737,1423,6.448,1424,6.448,1425,6.175,1442,6.175,1602,7.181,1603,5.62,1626,10.929,1711,4.832,1743,5.62,1914,5.255,1927,5.364,1949,6.814,2029,6.814,2033,5.957,2126,4.904,2131,4.427,2378,6.448,2502,3.662,2555,6.448,2588,5.364,3153,6.175,3161,6.814,3177,6.814,3226,5.957,3227,5.776,3228,6.448,3456,6.814,3465,6.448,3466,11.819,3467,7.368,3468,7.368,3469,6.448,3470,7.368,3471,7.368]],["keywords/571",[]],["title/572",[191,471.331,879,610.406]],["content/572",[25,1.722,180,9.421,222,5.584,315,6.67,881,14.908,1158,12.586,3472,20.48,3473,20.48,3474,20.48]],["keywords/572",[]],["title/573",[25,79.157,33,153.915,182,237.492,2002,640.194]],["content/573",[]],["keywords/573",[]],["title/574",[33,153.915,44,331.436,182,237.492,2002,640.194]],["content/574",[5,3.548,6,2.052,18,3.788,25,0.754,33,2.125,37,1.904,44,3.157,46,3.67,49,5.334,51,3.933,63,2.487,70,2.765,103,5.053,107,2.785,114,3.296,154,4.168,181,4.379,182,3.279,185,3.97,192,3.812,202,3.488,240,3.67,252,6.373,256,5.334,265,4.079,273,2.487,278,3.052,284,6.857,301,2.584,314,4.022,315,3.693,319,5.053,322,6.042,330,2.726,334,3.269,371,5.915,385,4.153,395,4.768,396,3.705,405,5.831,437,4.45,535,8.888,544,4.23,545,3.141,553,5.079,613,3.994,638,6.539,639,5.397,693,5.079,696,7.052,704,5.959,706,5.79,718,4.601,740,5.274,937,4.952,990,8.888,1011,7.667,1012,7.795,1035,6.889,1061,7.052,1065,6.671,1077,6.418,1419,8.649,1589,8.44,1623,7.667,1655,10.485,1915,10.485,1961,6.74,2002,8.839,2095,7.935,3475,11.339,3476,10.485,3477,11.339,3478,11.339,3479,11.339,3480,11.339,3481,11.339,3482,9.923]],["keywords/574",[]],["title/575",[25,79.157,33,153.915,437,467.161,1066,635.181]],["content/575",[3,5.962,5,2.798,6,2.015,25,0.862,33,2.337,51,3.102,53,5.475,69,4.046,107,3.184,152,2.581,171,3.385,176,6.596,184,2.811,185,3.131,199,6.206,205,3.368,206,4.614,224,3.93,240,4.036,265,4.663,273,3.964,281,8.07,284,7.382,293,3.628,297,3.677,301,2.954,311,5.552,314,4.598,315,4.222,330,4.346,373,3.343,388,7.27,414,5.067,425,6.502,504,5.746,537,4.248,538,6.443,543,4.8,545,3.59,553,5.806,613,4.566,614,5.606,637,7.405,697,8.268,732,4.535,740,6.029,1061,8.061,1067,8.764,1068,7.705,1080,10.16,1118,8.38,1166,8.5,1170,6.618,1922,11.986,1927,9.435,3483,12.962,3484,12.962,3485,12.962]],["keywords/575",[]],["title/576",[25,70.65,33,137.374,467,375.547,670,595.91,2002,571.393]],["content/576",[6,2.198,10,6.074,18,5.127,25,1.348,33,1.985,37,2.577,52,4.229,86,6.202,111,5.792,181,4.09,182,3.062,184,3.329,185,3.708,202,4.722,225,5.502,226,7.837,252,5.952,255,6.256,256,7.221,278,4.132,284,5.445,288,7.58,293,4.297,299,9.546,304,7.731,400,6.911,437,6.024,462,6.099,555,9.546,582,8.61,635,13.432,732,5.37,973,8.255,991,8.461,1150,12.032,1397,12.41,1636,10.741,1933,12.032,1935,12.032,2002,8.255,3486,15.349,3487,14.193]],["keywords/576",[]],["title/577",[25,89.993,886,483.395,1074,739.744]],["content/577",[4,2.165,25,1.389,136,12.048,182,4.168,291,10.002,902,11.934,907,12.838,1694,14.618,2002,11.236]],["keywords/577",[]],["title/578",[29,772.941]],["content/578",[25,1.616,28,10.507,29,10.077,122,8.989,319,9.126,722,12.236,1083,17.922]],["keywords/578",[]],["title/579",[33,174.985,198,361.493,323,745.978]],["content/579",[4,1.06,19,4.566,22,3.998,23,4.225,24,5.258,25,1.211,32,2.164,34,3.488,35,4.368,37,2.557,45,4.321,98,4.381,116,4.223,124,5.705,144,6.284,151,3.155,158,6.439,161,3.23,167,4.444,171,2.67,182,2.04,190,4.783,191,3.074,198,2.732,271,3.627,275,5.072,278,2.753,281,3.965,291,4.896,293,2.862,297,2.901,355,6.003,379,4.678,427,5.6,432,5.374,467,3.615,480,3.679,514,3.666,572,3.653,630,7.416,758,4.423,765,4.993,767,5.842,768,8.702,770,5.05,771,6.103,772,6.319,773,6.003,776,7.25,777,4.557,779,6.806,780,5.415,981,5.842,1219,4.926,1256,5.788,1329,5.185,1400,8.545,1540,6.36,1589,7.611,1941,8.57,1942,8.016,2002,9.791,3227,8.016,3488,10.226]],["keywords/579",[]],["title/580",[25,79.157,183,374.904,284,422.228,2002,640.194]],["content/580",[4,1.06,5,2.208,6,0.99,19,3.065,22,3.998,23,4.267,25,1.013,32,2.164,34,2.341,35,2.932,161,3.23,164,5.717,183,4.798,241,3.801,273,3.992,284,3.627,308,3.31,330,3.662,341,6.079,355,7.174,425,3.679,538,7.572,543,5.641,545,2.832,572,3.653,622,4.15,642,4.58,722,5.15,734,5.15,758,4.423,768,5.842,804,4.956,818,7.611,819,7.156,820,7.03,823,8.016,824,7.156,825,6.914,858,5.15,1061,6.36,1098,8.016,1170,5.221,1308,5.788,1941,12.767,2002,11.602,3227,8.016,3489,10.226,3490,8.016,3491,10.226,3492,9.456,3493,10.226,3494,11.089,3495,9.456,3496,9.456,3497,10.226,3498,10.226,3499,9.456,3500,9.456,3501,9.456,3502,8.949,3503,7.611,3504,8.949,3505,9.456,3506,8.949,3507,10.226,3508,10.226,3509,8.949]],["keywords/580",[]],["title/581",[25,79.157,65,390.118,400,535.943,408,393.825]],["content/581",[2,4.689,4,1.857,5,2.764,6,1.735,10,7.091,20,5.734,25,0.851,37,3.471,51,4.947,52,3.527,58,6.563,63,2.807,69,3.996,85,6.167,86,5.173,87,4.449,98,5.484,100,4.741,103,5.705,154,4.706,192,4.304,195,6.779,220,4.526,256,6.023,275,5.967,297,3.632,308,5.8,329,5.705,334,3.691,373,3.302,394,6.492,395,5.383,408,7.799,467,4.526,491,9.319,492,8.656,562,7.383,581,5.433,636,6.998,639,6.093,874,5.676,898,8.801,956,8.062,958,5.922,1019,8.062,1110,7.314,1181,11.203,1261,8.166,1595,7.962,1871,10.351,1961,7.61,1962,11.838,1964,11.838,2002,6.886,3510,12.802,3511,12.802,3512,12.802,3513,12.802]],["keywords/581",[]],["title/582",[6,92.877,25,63.794,205,249.247,219,356.567,240,214.197,613,337.935]],["content/582",[6,1.21,25,1.357,45,3.545,70,4.296,88,4.284,107,3.069,136,7.206,149,5.183,152,2.488,155,5.251,181,3.329,184,2.71,185,4.929,192,4.201,204,5.912,205,3.247,222,3.407,225,6.315,226,6.38,240,4.556,243,5.748,264,3.622,278,3.364,293,3.498,301,2.848,314,4.432,330,4.906,347,5.748,379,5.717,385,4.577,517,6.775,537,4.095,545,3.461,564,5.78,584,8.448,613,6.206,622,5.071,638,7.206,652,8.435,704,6.567,706,6.38,707,8.448,711,5.303,714,8.317,718,5.071,732,4.372,892,7.679,893,5.254,910,5.027,914,5.878,1006,7.591,1024,5.878,1113,9.096,1115,9.096,1116,8.756,2002,6.72,2639,10.472,3514,12.495,3515,10.472,3516,12.495,3517,12.495,3518,12.495]],["keywords/582",[]],["title/583",[25,79.157,202,366.157,563,509.904,1119,686.479]],["content/583",[]],["keywords/583",[]],["title/584",[107,332.397,181,360.573,732,473.461]],["content/584",[6,1.713,33,2.288,37,2.971,151,5.46,181,4.715,182,3.531,185,4.275,200,6.602,240,3.951,264,5.13,265,6.366,314,6.277,347,8.14,392,8.231,532,10.306,553,7.926,564,8.185,622,7.181,707,11.965,904,12.882,937,7.729,1152,11.779,1155,11.965,2002,9.518,2141,11.288,3519,17.696,3520,17.696]],["keywords/584",[]],["title/585",[183,374.904,273,261.029,330,286.181,356,553.65]],["content/585",[6,1.699,18,5.861,25,1.167,152,3.493,161,5.543,183,5.527,252,6.804,273,3.848,299,10.913,301,3.999,330,4.219,374,14.187,385,6.427,399,9.592,496,7.09,515,8.666,537,5.751,545,4.86,727,12.279,732,6.139,734,8.838,856,11.345,858,8.838,919,12.279,973,9.438,1061,10.913,1967,13.755,2002,9.438]],["keywords/585",[]],["title/586",[6,131.019,185,326.9,480,486.819]],["content/586",[5,4.214,6,2.285,25,1.298,51,4.671,87,6.783,182,3.895,185,4.715,278,5.255,297,5.538,480,7.022,863,11.258,906,10.583,932,8.883,934,11.996,1299,14.209]],["keywords/586",[]],["title/587",[60,504.882,63,296.762,514,485.1]],["content/587",[60,7.149,63,4.202,191,5.76,273,4.202,405,9.853,581,8.131,590,8.17,718,7.776,737,6.442,868,16.058,898,13.173,905,11.39,924,12.223,984,11.776,994,10.306,1327,10.225,1427,10.225,2000,14.262]],["keywords/587",[]],["title/588",[217,483.395,556,483.395,742,612.527]],["content/588",[5,4.214,35,5.598,37,3.277,63,4.281,152,3.886,217,6.973,512,7.99,514,6.997,718,7.921,737,6.563,785,5.953,866,11.484,944,10.949,1426,14.889,1825,15.782,2590,17.082]],["keywords/588",[]],["title/589",[281,524.746,297,383.895,379,619.122]],["content/589",[6,1.758,25,1.208,69,5.669,70,5.507,155,5.413,182,3.623,198,4.851,246,5.737,281,8.756,288,8.968,301,4.139,311,7.779,330,4.366,427,6.675,537,5.952,588,13.851,611,11.435,613,6.397,893,7.635,957,11.032,1081,11.16,2002,9.767]],["keywords/589",[]],["title/590",[4,110.083,25,70.65,85,511.73,855,631.517,2002,571.393]],["content/590",[4,1.717,5,3.576,6,1.883,25,1.102,33,2.142,44,4.613,45,3.252,46,3.711,60,6.181,70,2.796,73,5.854,98,4.911,144,7.045,155,3.417,181,4.414,186,3.388,190,5.362,191,4.98,193,4.593,225,4.109,226,5.854,246,3.621,252,6.424,264,3.323,273,3.633,308,5.362,323,6.319,330,2.756,360,12.911,379,5.245,392,5.332,398,4.293,427,4.214,478,7.13,517,6.215,545,3.175,564,5.303,590,4.888,668,5.937,739,7.412,782,6.744,786,4.911,965,7.13,1061,7.13,1089,6.611,1092,8.744,1134,6.488,1143,7.412,1188,9.268,1298,9.953,1310,6.676,1427,6.117,1428,10.601,1589,8.533,1786,8.986,1966,8.022,2002,6.166,2301,7.313,3257,10.601,3482,14.497,3487,10.601,3490,12.985,3494,8.345,3521,11.464,3522,11.464,3523,11.464,3524,11.464,3525,10.601,3526,11.464,3527,11.464,3528,11.464]],["keywords/590",[]],["title/591",[191,471.331,879,610.406]],["content/591",[4,1.264,19,6.572,25,1.645,33,1.578,51,2.92,85,5.878,87,4.24,105,9.392,125,4.828,152,2.429,171,3.186,183,3.843,190,5.708,191,3.668,192,4.102,196,3.798,222,4.724,255,4.973,265,4.39,284,4.328,291,5.842,293,3.416,366,5.878,398,4.57,496,4.931,523,10.833,536,4.184,853,9.896,855,7.253,857,6.275,861,5.676,872,8.725,879,6.744,882,12.378,883,9.392,884,7.107,886,4.359,887,7.107,937,5.329,973,6.563,993,5.878,994,6.563,995,8.702,996,5.523,997,8.882,998,8.702,1127,7.684,1154,9.565,1192,7.589,1982,9.865,2002,12.937,3494,8.882,3529,10.678,3530,12.202,3531,12.202,3532,12.202]],["keywords/591",[]],["title/592",[25,63.794,33,124.043,52,264.317,264,278.105,462,381.156,2002,515.945]],["content/592",[]],["keywords/592",[]],["title/593",[52,513.439]],["content/593",[5,4.601,6,2.063,33,2.143,37,3.578,51,3.965,52,4.566,181,4.415,182,3.306,186,4.898,200,6.182,222,4.518,232,9.85,286,10.183,293,4.638,297,4.701,308,5.364,322,7.834,395,6.967,501,8.52,556,5.919,557,6.584,563,7.098,572,5.919,630,6.091,659,7.622,692,8.461,694,8.236,695,8.183,911,10.57,1329,8.403,2095,11.595]],["keywords/593",[]],["title/594",[4,140.222,52,372.867,2002,727.832]],["content/594",[4,1.857,5,2.764,6,2.282,9,5.857,12,4.464,23,1.951,40,6.84,44,3.565,52,4.937,63,2.807,69,3.996,70,4.37,79,6.779,97,4.494,107,4.402,149,7.433,151,3.95,181,3.411,182,3.575,184,2.776,185,5.41,192,4.304,193,5.129,205,4.656,206,4.557,240,4.001,243,5.889,272,5.458,273,2.807,298,6.282,334,3.691,373,3.302,385,4.689,490,5.087,520,5.795,525,6.728,559,8.166,675,5.955,704,6.728,709,7.868,713,8.277,716,4.622,718,5.195,719,8.801,893,5.383,914,6.023,924,8.166,1000,6.886,1062,9.529,1064,8.959,1197,8.959,1398,8.062,2002,6.886,3291,11.838,3292,11.838,3293,11.838]],["keywords/594",[]],["title/595",[4,140.222,52,372.867,510,686.235]],["content/595",[3,4.172,5,1.958,6,1.638,14,3.409,16,4.663,25,1.262,37,1.522,51,2.17,52,6.394,58,3.321,63,1.989,88,3.109,92,3.866,110,6.136,114,2.636,125,5.504,155,2.703,182,1.809,183,5.977,186,4.112,195,4.802,196,5.267,199,4.342,202,4.279,222,3.793,246,2.865,252,3.516,254,5.391,256,4.266,264,4.033,265,3.262,273,4.737,278,2.441,281,6.562,286,5.573,287,4.507,293,2.538,297,4.801,300,4.999,301,2.067,308,6.626,310,4.105,319,4.041,322,3.334,330,2.18,364,4.917,371,4.731,389,4.663,390,6.75,398,3.396,400,4.083,425,5.004,438,3.396,462,3.603,466,4.731,479,5.449,480,3.262,485,7.108,510,4.599,524,5.947,536,4.77,537,2.972,539,4.218,545,3.853,549,4.766,553,4.062,559,5.785,563,5.959,614,3.922,634,6.467,659,4.172,692,4.63,700,10.354,703,3.383,728,7.936,738,5.863,742,4.105,743,6.346,765,2.972,943,4.766,951,7.936,963,3.502,996,4.105,1072,6.346,1164,5.573,1335,7.108,1697,5.133,2002,4.877,2114,5.947,2731,6.917,3294,8.386,3295,8.386,3298,8.386,3300,8.386,3301,8.386,3533,9.068,3534,9.068,3535,9.068]],["keywords/595",[]],["title/596",[25,79.157,171,310.82,191,357.826,2002,640.194]],["content/596",[25,1.336,41,13.58,52,5.534,111,7.579,171,5.245,191,6.038,202,6.178,272,8.563,322,7.383,400,9.043,462,7.98,529,11.368,2002,10.802]],["keywords/596",[]],["title/597",[25,104.266,29,650.349]],["content/597",[25,1.625,28,10.568,29,10.136,30,9.73,107,5.08,722,12.308]],["keywords/597",[]],["title/598",[33,174.985,198,361.493,224,410.309]],["content/598",[4,1.024,19,2.963,22,3.898,23,4.222,24,5.127,25,1.186,32,3.143,33,1.921,34,3.401,35,5.688,37,3.33,52,2.724,63,2.168,103,4.405,111,3.73,114,5.186,151,3.05,158,6.225,161,3.123,167,4.297,171,2.582,191,2.972,204,4.678,224,2.997,264,4.306,271,3.507,275,5.941,289,4.598,293,2.767,334,2.85,355,5.853,440,4.573,462,3.928,467,3.495,510,5.013,536,3.39,572,3.531,590,4.215,607,5.36,630,7.292,723,6.684,758,4.276,763,5.048,765,5.847,766,12.009,767,5.648,768,10.192,769,7.196,770,4.882,771,7.148,772,4.101,773,7.031,774,5.404,775,4.733,776,7.069,777,4.405,778,7.358,779,6.58,780,5.235,1540,6.148,2002,5.317,3302,9.142,3536,9.886]],["keywords/598",[]],["title/599",[784,1141.31,785,478.129]],["content/599",[23,4.241,32,4.397,33,1.405,34,5.61,35,6.63,63,2.383,108,5.668,171,2.837,462,8.255,490,4.317,545,3.01,642,4.867,659,4.998,682,12.881,768,6.207,771,7.558,784,7.91,785,3.314,786,4.655,787,7.721,788,9.106,789,13.352,790,9.509,791,9.509,792,6.267,793,9.509,794,13.943,795,9.509,796,9.509,797,13.943,798,9.509,799,10.953,800,7.604,801,9.106,802,9.509,803,16.508,804,9.142,805,12.371,806,5.234,807,8.785,808,9.106,809,5.366,1300,4.998,1308,6.15,3537,10.866,3538,10.866]],["keywords/599",[]],["title/600",[273,261.029,284,422.228,545,329.694,735,535.943]],["content/600",[6,2.21,25,1.229,51,4.422,182,3.687,192,6.213,265,6.648,273,4.053,281,7.166,284,6.556,293,5.173,301,4.212,330,4.443,399,10.103,425,6.648,537,6.057,538,9.186,545,5.119,562,10.659,961,10.188,1061,11.494,2002,9.94]],["keywords/600",[]],["title/601",[4,90.608,183,275.416,308,283.049,722,440.43,1308,494.931,2002,470.306,3490,685.44]],["content/601",[6,1.623,19,3.494,22,4.4,23,4.167,32,4.155,34,2.669,51,2.789,164,5.265,183,3.671,198,3.114,273,4.306,281,4.52,330,4.031,355,6.607,399,6.372,425,4.193,538,9.759,544,4.349,545,4.644,735,5.248,768,6.659,778,12.479,819,8.157,820,8.013,823,9.137,824,8.157,825,7.881,1033,8.485,1061,10.427,1170,5.952,1663,6.481,2002,9.017,3226,9.424,3312,9.769,3313,10.2,3314,10.2,3318,9.769,3319,9.769,3320,9.137,3492,10.778,3494,8.485,3495,10.778,3496,10.778,3499,10.778,3500,10.778,3501,10.778,3502,10.2,3503,8.676,3504,10.2,3505,10.778,3506,10.2,3509,10.2,3539,10.778,3540,10.778,3541,11.656,3542,11.656,3543,11.656]],["keywords/601",[]],["title/602",[4,140.222,826,745.978,2002,727.832]],["content/602",[6,1.304,23,3.659,25,0.895,32,2.849,45,3.82,164,4.228,183,4.241,191,4.048,228,5.88,241,5.005,273,2.953,284,7.533,334,3.882,381,4.345,396,4.399,446,10.022,496,5.441,536,4.617,543,4.986,600,7.242,674,6.797,734,6.782,763,6.875,819,9.422,820,9.256,823,10.554,824,9.422,825,9.104,826,10.23,828,10.27,850,16.24,872,6.782,991,7.422,1093,10.886,1151,8.705,1174,8.18,1183,7.422,1264,10.022,2002,7.242,3226,10.886,3312,11.284,3313,11.783,3314,11.783,3318,11.284,3319,11.284,3482,11.783,3502,11.783,3503,10.022,3504,11.783,3506,11.783,3509,11.783,3539,12.45,3540,12.45,3544,13.464,3545,13.464]],["keywords/602",[]],["title/603",[19,356.811,25,79.157,52,327.97,2002,640.194]],["content/603",[4,2.34,19,5.443,25,1.634,67,7.306,85,8.747,182,4.505,255,7.401,291,8.694,349,11.741,523,9.767,554,8.694,580,8.353,621,12.951,853,12.9,854,14.234,855,10.794,1341,14.681,2002,9.767,3212,15.891]],["keywords/603",[]],["title/604",[25,89.993,202,416.281,563,579.706]],["content/604",[4,1.664,6,2.467,25,1.389,33,2.077,37,3.506,184,3.483,185,3.879,201,6.203,202,4.94,265,5.777,278,4.323,330,3.861,425,5.777,435,9.554,480,7.513,481,8.853,514,5.757,536,5.506,553,7.193,556,5.736,563,6.879,613,5.657,614,6.946,652,7.689,742,9.453,765,5.263,856,10.383,932,7.308,1747,10.858,1782,11.453]],["keywords/604",[]],["title/605",[52,432.005,703,584.959]],["content/605",[5,3.886,6,1.743,37,3.022,51,5.374,52,6.188,61,9.682,63,3.948,222,4.909,391,11.312,462,7.153,674,6.593,683,12.597,703,9.564,861,8.373,945,14.111,1025,13.731,1165,11.805,1558,11.063,3329,16.646]],["keywords/605",[]],["title/606",[52,432.005,179,779.313]],["content/606",[25,1.555,37,3.542,58,5.974,62,6.987,63,4.626,98,6.987,100,6.04,122,7.159,142,9.595,179,8.107,222,4.448,250,8.704,287,8.107,297,4.627,308,5.28,334,4.703,395,6.858,437,6.401,533,9.232,536,7.233,562,9.407,827,10.024,871,13.187,872,8.215,873,9.8,874,10.366,875,8.637,1000,8.772,1019,10.271,3330,15.082]],["keywords/606",[]],["title/607",[37,199.834,51,284.834,63,261.029,689,650.672]],["content/607",[25,1.389,37,3.507,40,7.974,51,4.999,63,4.581,114,6.073,193,8.37,554,10.002,878,13.699]],["keywords/607",[]],["title/608",[191,471.331,879,610.406]],["content/608",[4,2.051,23,2.256,25,1.65,52,5.453,181,3.944,182,2.954,196,4.608,198,3.955,200,5.523,202,4.554,234,6.847,256,6.964,265,5.326,273,3.246,281,5.74,284,5.251,304,7.456,322,5.442,385,5.422,398,5.544,462,5.882,496,5.982,523,7.962,563,6.342,617,7.839,642,6.631,659,6.81,692,7.559,738,9.572,853,8.457,857,7.612,883,8.026,884,8.622,885,10.776,910,5.956,912,7.723,931,8.8,937,6.465,996,6.701,1171,10.177,1583,11.604,2002,7.962,2515,11.019,3331,13.689]],["keywords/608",[]],["title/609",[116,250.367,240,135.375,670,845.279,1055,301.353,1109,313.99,1176,346.35,1361,326.085,2589,372.601,3546,451.274]],["content/609",[]],["keywords/609",[]],["title/610",[1109,811.993,1176,895.677]],["content/610",[4,0.847,6,1.738,7,2.553,12,2.852,23,3.825,40,3.122,51,1.957,69,2.553,107,2.009,116,3.377,125,3.236,131,4.147,148,4.717,149,3.392,151,2.523,155,2.438,162,6.347,164,4.977,181,2.179,205,5.992,206,2.911,220,2.891,222,2.23,223,6.602,240,4.623,248,4.434,272,3.487,301,1.864,311,3.503,314,5.622,347,3.762,392,3.804,396,2.672,398,3.063,420,4.969,438,3.063,440,3.783,452,3.783,456,7.157,457,5.53,490,3.25,537,2.68,539,3.804,545,3.556,616,5.723,711,7.62,718,3.319,741,4.969,786,5.5,901,4.901,906,4.434,908,6.612,910,5.166,914,3.847,955,4.717,957,9.63,963,3.159,991,4.508,996,5.811,1047,5.953,1055,4.065,1066,4.364,1082,5.444,1109,10.724,1119,4.717,1165,5.363,1175,8.085,1176,12.81,1199,6.411,1268,4.235,1297,8.681,1339,3.663,1359,6.238,1377,6.006,1564,5.217,1617,4.266,1726,4.399,2126,8.546,2436,7.157,2775,7.563,3109,6.854,3547,8.178,3548,8.178,3549,8.178,3550,7.563,3551,6.612,3552,8.178,3553,15.85,3554,8.178,3555,7.563,3556,8.178,3557,8.178,3558,8.178,3559,8.178,3560,5.953,3561,6.238,3562,8.178,3563,5.622,3564,5.833]],["keywords/610",[]],["title/611",[1055,926.214]],["content/611",[4,1.446,6,1.643,7,2.843,23,3.631,32,1.927,49,4.285,51,2.179,67,3.665,110,4.018,111,3.437,131,7.078,155,2.715,162,3.22,166,4.938,182,1.817,186,2.692,192,3.062,195,4.823,198,2.433,203,4.619,205,3.626,219,3.385,234,4.213,240,4.58,248,4.938,272,5.951,278,2.452,293,3.907,298,4.469,301,2.076,308,2.948,311,3.902,314,7.275,322,5.131,334,4.024,378,5.472,385,3.336,393,4.899,396,2.976,420,5.534,421,4.717,438,3.411,452,4.213,460,6.947,481,5.021,484,5.109,490,3.619,494,6.947,537,2.985,545,2.523,562,5.253,563,3.902,564,4.213,579,5.889,584,6.158,675,4.236,692,4.651,711,3.865,735,6.284,736,3.411,745,4.979,910,3.665,911,5.81,943,4.787,987,5.889,991,5.021,996,4.123,1055,10.194,1103,6.374,1109,7.228,1111,6.262,1158,5.597,1176,5.203,1207,5.253,1297,9.437,1339,6.252,1590,6.947,1617,4.751,1634,6.496,1646,6.062,1726,4.899,2088,6.496,2308,5.735,2421,6.779,2638,6.947,3041,7.364,3202,7.364,3565,8.422,3566,9.108,3567,12.214,3568,9.108,3569,8.422,3570,13.957,3571,9.108,3572,9.108,3573,8.422,3574,9.108,3575,7.971,3576,9.108,3577,9.108,3578,9.108,3579,8.422,3580,8.422]],["keywords/611",[]],["title/612",[116,558.828,240,302.163,2589,831.659]],["content/612",[6,1.566,7,1.783,22,1.499,23,4.033,32,3.939,35,1.638,44,1.59,51,1.367,65,1.872,92,2.435,108,2.98,113,2.657,116,9.469,131,4.862,162,4.381,164,5.5,166,3.097,171,3.236,173,3.395,186,1.688,191,3.725,198,1.526,205,4.203,206,5.167,219,2.123,220,2.019,222,1.557,240,4.536,243,2.627,246,1.804,249,3.233,264,2.78,272,2.435,278,1.538,293,1.599,301,3.308,308,1.849,310,2.585,311,2.447,314,6.213,347,2.627,356,5.764,373,1.473,381,1.843,385,2.092,396,1.866,425,2.055,427,3.525,440,2.642,467,2.019,490,2.269,496,2.308,504,2.532,529,3.233,537,1.872,545,2.656,561,4.511,562,3.294,564,2.642,616,3.997,630,4.556,695,2.821,711,2.424,716,3.462,735,2.572,736,3.591,737,1.92,740,4.46,771,2.288,786,2.447,894,3.675,971,3.395,979,4.618,996,4.34,1033,6.98,1055,4.766,1082,3.802,1125,3.997,1143,3.693,1175,3.597,1191,6.117,1224,3.326,1264,7.137,1309,2.687,1339,7.246,1350,4.357,1566,8.391,1617,10.19,1631,7.014,1638,4.477,1726,3.072,1787,4.477,1803,4.251,1928,5.282,2079,3.263,2118,3.862,2161,4.357,2175,4.251,2304,4.158,2589,5.893,2625,4.357,2912,3.552,3167,12.34,3367,2.751,3448,4.618,3575,4.998,3581,5.712,3582,5.282,3583,5.282,3584,5.712,3585,9.714,3586,3.294,3587,5.712,3588,5.712,3589,5.712,3590,8.867,3591,5.712,3592,10.804,3593,3.802,3594,5.712,3595,5.282,3596,5.712,3597,4.998,3598,5.282,3599,5.282,3600,5.712,3601,4.787,3602,5.712,3603,5.712,3604,5.712,3605,5.712,3606,5.282,3607,5.712,3608,5.712,3609,5.712,3610,5.712,3611,5.282,3612,5.712,3613,5.712,3614,5.712,3615,5.712,3616,5.712]],["keywords/612",[]],["title/613",[308,507.514,3546,1167.014]],["content/613",[3,4.921,4,1.937,6,1.81,22,2.808,46,5.099,51,2.56,58,3.918,63,2.346,65,3.506,66,7.788,68,5.623,69,3.34,97,3.756,110,4.719,182,2.135,186,3.162,192,5.296,195,8.341,200,3.991,205,2.78,219,3.977,234,4.948,240,2.389,265,3.849,272,4.561,297,5.303,298,5.25,301,2.438,304,5.388,308,5.099,310,4.842,322,3.933,334,3.085,356,7.327,392,4.976,396,3.495,398,4.006,407,5.217,419,6.5,438,4.006,462,4.251,484,6.001,496,4.323,504,4.743,531,5.848,537,3.506,551,7.168,558,8.386,565,6.055,579,6.917,584,7.234,606,8.386,671,8.966,675,4.976,692,5.463,703,3.991,705,6.231,735,4.817,912,5.581,937,4.672,963,4.132,996,4.842,1019,6.737,1038,9.796,1079,8.16,1187,6.917,1189,6.654,1207,6.17,1268,5.541,1339,4.792,1634,7.63,1685,9.362,1708,7.355,2308,6.737,2321,6.737,2560,7.016,2589,6.575,3546,17.694,3617,8.65,3618,10.698,3619,15.752,3620,10.698,3621,9.893,3622,10.698]],["keywords/613",[]],["title/614",[1361,1002.228]],["content/614",[4,1.967,6,1.063,29,4.555,44,4.47,45,3.115,46,5.197,51,3.842,67,4.418,72,5.226,182,2.191,186,3.246,187,6.748,190,5.136,199,5.257,200,5.99,205,5.425,219,5.968,240,4.662,248,5.953,265,3.95,272,4.682,288,5.423,291,5.257,297,3.115,301,3.659,308,3.554,310,4.97,311,4.704,314,5.695,322,4.036,345,8.376,356,5.107,366,5.289,373,2.832,385,4.022,438,4.112,467,3.881,477,11.053,496,4.437,515,5.423,537,5.262,571,7.201,645,6.46,660,6.159,717,5.257,732,3.842,826,6.053,879,4.275,936,5.458,937,4.796,996,8.591,1054,7.684,1055,5.458,1189,6.829,1227,7.201,1297,7.424,1332,5.906,1361,12.48,1590,8.376,1786,8.607,1823,8.607,2118,7.424,2182,9.609,2913,8.173,2918,9.609,2978,9.609,3167,8.376,3449,10.154,3546,8.173,3623,8.376,3624,10.154,3625,10.98,3626,10.98,3627,10.154]],["keywords/614",[]],["title/615",[248,850.067,703,584.959]],["content/615",[]],["keywords/615",[]],["title/616",[6,115.243,298,584.092,1339,533.158,1961,707.558]],["content/616",[4,1.578,6,2.382,19,3.065,25,0.68,53,4.319,54,4.444,58,5.579,72,4.867,73,5.221,88,3.506,110,6.72,111,3.859,112,6.706,116,4.223,131,10.23,151,3.155,174,6.079,192,3.438,205,3.958,240,4.817,241,3.801,272,4.36,297,2.901,298,5.018,308,4.931,314,6.458,329,4.557,334,2.948,335,10.864,345,7.8,381,6.51,385,3.745,396,4.977,403,8.267,418,8.016,496,4.132,515,9.962,522,9.456,561,4.811,711,8.561,786,4.381,855,6.079,932,4.653,1000,5.5,1055,5.083,1109,9.428,1169,4.678,1175,6.439,1176,10.4,1339,10.784,1350,11.62,1401,7.293,1633,5.842,1711,6.706,1902,6.284,1961,6.079,1974,9.456,2072,8.949,2589,6.284,2733,7.293,2912,6.36,3546,7.611,3585,14.27,3586,5.897,3628,10.226,3629,7.444]],["keywords/616",[]],["title/617",[703,396.364,711,450.843,757,686.894,1713,575.999,2612,757.671]],["content/617",[4,2.172,6,0.658,10,2.687,23,1.035,25,0.736,28,2.937,51,4.81,54,4.809,67,2.733,69,4.371,70,3.415,72,3.233,88,2.329,92,2.896,97,2.384,108,3.543,121,4.081,131,3.444,171,1.774,182,2.208,184,1.473,186,2.008,187,4.174,191,2.042,192,3.72,201,2.623,204,3.214,205,4.195,215,3.569,219,4.113,222,1.852,240,4.488,246,3.496,251,6.153,256,3.195,264,3.208,278,1.828,281,7.392,301,1.548,308,2.198,311,7.616,314,8.826,323,3.744,334,1.958,356,6.513,373,1.752,381,2.192,385,2.488,396,2.219,409,4.332,413,3.517,418,5.324,432,7.359,444,7.744,447,4.332,466,5.773,489,5.055,490,2.699,512,2.78,584,4.592,590,2.896,630,2.497,660,3.81,661,4.332,673,3.543,694,6.96,703,7.5,714,4.521,716,2.452,736,6.047,739,4.391,775,3.252,890,7.892,901,2.593,910,2.733,996,3.074,1058,3.517,1115,8.055,1160,3.444,1219,6.745,1298,4.081,1495,6.28,1595,4.224,1617,3.543,1633,3.88,1704,4.277,1707,4.844,1713,7.592,1718,4.944,1746,5.324,2089,4.454,2252,6.723,2303,3.653,2542,4.944,2612,7.892,2638,5.181,2669,4.592,2720,4.277,2731,5.181,3012,10.233,3169,5.324,3231,6.28,3585,5.324,3617,5.491,3629,10.194,3630,14.003,3631,6.792,3632,6.792,3633,5.944,3634,6.792,3635,6.792,3636,6.792,3637,6.792,3638,6.792,3639,6.792,3640,6.792,3641,6.28,3642,5.692,3643,6.792,3644,6.792,3645,6.28,3646,5.692,3647,6.792,3648,6.792,3649,6.792,3650,6.28,3651,6.28]],["keywords/617",[]],["title/618",[199,508.659,264,307.993,311,455.105,314,376.852,3515,890.35]],["content/618",[4,1.31,6,1.72,10,5.004,44,3.521,63,2.773,76,7.518,162,4.471,175,7.866,182,4.098,196,3.936,199,9.834,205,3.286,210,8.418,227,6.503,240,3.967,252,4.904,310,5.724,311,8.798,314,7.285,321,7.772,347,8.173,373,3.262,385,4.632,395,7.47,396,4.132,425,4.55,466,6.597,514,4.534,543,4.683,545,3.503,551,5.755,567,8.293,664,6.328,705,7.365,785,6.263,901,4.828,911,8.067,950,8.418,963,4.885,994,6.802,1055,6.286,1081,7.772,1127,7.964,1128,12.933,1160,6.413,1164,7.772,1339,5.665,1388,8.067,1405,11.067,1422,8.85,1558,7.772,1722,9.206,1726,6.802,1858,9.913,2744,11.067,3652,12.647,3653,12.647,3654,12.647,3655,12.647]],["keywords/618",[]],["title/619",[3623,1195.939,3629,1141.31]],["content/619",[3,7.387,4,2.164,25,1.068,40,6.13,70,3.916,116,6.632,131,10.59,201,8.066,240,4.663,254,9.546,255,6.545,293,4.495,314,5.697,375,8.378,420,9.757,467,5.677,499,8.44,510,8.144,516,8.258,552,8.44,711,6.815,894,6.154,1055,7.982,1109,8.317,1176,9.174,1227,10.531,1625,12.984,1729,15.929,2589,9.869,3623,12.249,3629,11.69,3656,13.459,3657,16.059,3658,16.059]],["keywords/619",[]],["title/620",[63,343.83,689,857.071]],["content/620",[4,1.295,16,6.425,20,7.891,40,4.77,63,4.859,68,6.567,86,8.245,107,3.069,114,3.632,116,5.16,149,5.183,162,6.227,193,5.006,222,3.407,240,4.556,248,6.775,301,2.848,331,8.079,349,8.079,387,7.277,428,9.475,462,4.965,496,5.049,514,6.315,551,5.686,554,5.983,556,4.463,596,8.744,606,9.795,675,8.194,683,8.744,689,6.83,861,5.812,891,9.711,955,7.206,1016,9.3,1055,8.756,1109,6.471,1165,8.194,1176,7.138,1189,7.771,1219,6.019,1361,6.72,1608,13.809,1617,6.518,1933,9.795,2304,9.096,2444,7.591,2589,7.679,3058,9.531,3167,9.531,3546,16.492,3563,8.59,3617,10.102,3621,11.554,3659,10.472,3660,12.495,3661,10.472]],["keywords/620",[]],["title/621",[675,866.742]],["content/621",[6,1.643,10,4.691,12,4.134,49,5.577,58,4.342,67,4.77,116,7.008,131,8.606,162,5.999,182,2.365,186,3.504,189,6.053,205,4.409,222,3.233,240,4.426,272,5.055,293,3.319,301,3.868,311,5.079,314,7.031,385,4.342,401,5.31,452,5.484,515,5.855,536,5.819,537,5.562,545,3.284,549,6.23,562,6.837,569,5.817,664,5.931,675,10.651,692,8.665,699,7.665,716,4.28,736,4.44,761,8.63,918,6.71,937,5.178,955,6.837,957,7.203,963,6.555,971,7.047,996,7.681,1035,7.203,1048,9.585,1055,8.435,1173,7.047,1176,6.772,1189,7.373,1297,8.016,1339,7.601,1590,9.043,1617,6.184,2589,7.286,2899,10.963,3052,10.375,3565,10.963,3617,9.585,3645,10.963,3662,11.855,3663,11.855,3664,11.855,3665,11.855]],["keywords/621",[]],["title/622",[1608,1460.68]],["content/622",[6,1.271,10,5.193,12,4.576,69,4.097,116,5.42,201,5.069,205,5.444,222,3.579,240,4.678,265,6.559,279,7.802,291,6.284,297,3.723,298,6.44,311,5.622,314,7.432,334,3.784,356,8.481,393,9.807,536,4.5,564,6.071,699,11.789,736,4.915,761,9.554,866,7.721,890,9.36,905,7.802,955,7.569,963,5.069,1030,6.44,1055,10.414,1117,10.611,1176,7.498,1207,10.516,1339,5.879,1608,18.647,1617,6.847,1631,7.429,1716,9.36,1726,7.059,2301,8.372,2441,12.137,2574,11.486,2589,8.066,3169,10.288,3666,13.125,3667,13.125,3668,18.233,3669,13.125,3670,13.125]],["keywords/622",[]],["title/623",[149,561.321,240,302.163,428,727.832]],["content/623",[4,1.865,86,5.205,116,5.319,131,6.532,149,8.604,182,2.57,186,3.807,201,4.975,205,3.347,222,3.512,232,7.657,240,5.014,278,3.468,310,5.831,314,7.966,334,3.714,356,5.992,373,3.322,385,4.718,393,6.928,401,5.77,428,12.078,466,6.72,482,7.042,494,9.826,545,4.985,564,5.958,673,6.72,693,5.77,699,8.329,711,5.466,718,5.227,866,10.587,905,7.657,918,7.291,955,7.429,963,4.975,1055,11.162,1171,8.856,1176,7.359,1185,10.415,1189,8.011,1207,7.429,1219,6.205,1297,8.71,1631,7.291,2114,8.447,2488,9.377,2589,7.916,3167,9.826,3671,12.881,3672,12.881,3673,12.881,3674,12.881]],["keywords/623",[]],["title/624",[4,123.338,67,478.927,73,607.783,232,707.558]],["content/624",[3,3.916,4,1.685,6,0.824,40,3.249,51,2.037,63,1.867,67,5.33,72,4.052,88,2.919,96,4.818,113,3.959,116,5.471,131,4.317,162,4.683,182,3.661,186,3.916,200,3.176,201,3.288,204,4.028,205,3.442,232,5.06,240,4.44,248,4.615,250,7.069,255,3.469,297,5.641,298,4.177,314,3.02,331,5.504,334,2.454,356,3.959,393,4.578,394,4.317,407,4.151,467,4.683,490,3.382,494,6.493,504,5.873,529,4.818,542,5.43,545,3.669,549,4.474,551,3.874,560,7.015,562,4.909,564,3.937,633,6.882,685,6.197,688,5.172,693,3.813,698,8.565,699,8.565,703,4.942,705,4.958,706,4.347,711,3.612,716,3.073,717,4.076,720,6.493,735,5.965,862,5.36,866,5.008,894,3.262,897,5.582,905,5.06,908,6.882,911,5.43,937,3.718,957,5.172,961,4.693,991,4.693,996,5.996,1038,5.294,1048,6.882,1055,6.585,1079,6.493,1109,4.409,1112,5.06,1119,4.909,1158,5.231,1164,5.231,1176,4.863,1180,5.115,1187,5.504,1189,8.239,1207,4.909,1297,5.756,1317,5.957,1623,5.756,1631,4.818,1634,6.071,1684,7.134,1686,6.197,1708,5.852,1730,7.872,1853,7.872,2063,7.134,2102,6.882,2429,6.071,2541,6.493,2572,6.882,2586,7.134,2589,5.231,2590,7.449,2625,6.493,2639,7.134,2916,7.872,3167,10.105,3546,9.86,3560,6.197,3582,7.872,3617,10.71,3623,6.493,3675,8.513,3676,8.513,3677,7.134,3678,7.872,3679,8.513,3680,6.493,3681,7.449,3682,8.513]],["keywords/624",[]],["title/625",[72,746.242,134,887.422]],["content/625",[72,9.844,97,7.261,134,11.707,180,9.514,234,9.567,248,11.214,356,9.62,740,9.62,2098,13.024,2741,15.776]],["keywords/625",[]],["title/626",[116,438.714,205,276.033,398,397.855,616,743.425,741,645.446]],["content/626",[4,1.875,6,0.98,18,3.383,19,3.036,25,0.673,40,3.865,49,4.764,116,9.306,131,5.135,148,8.722,155,3.018,180,4.658,181,2.698,183,3.189,184,2.196,204,4.792,205,6.376,206,3.605,220,7.097,223,5.207,228,4.423,240,4.041,246,3.199,272,4.317,288,5.001,301,2.308,314,3.592,315,6.997,345,7.724,356,9.338,381,3.268,397,9.647,398,7.518,403,8.187,455,4.848,543,3.75,545,4.189,616,7.086,650,5.84,668,5.244,711,4.297,716,5.46,735,4.559,740,4.71,741,12.197,785,3.088,901,3.865,1007,5.322,1170,5.171,1188,8.187,1191,6.459,1204,5.207,1329,5.135,1332,8.134,1339,4.536,1377,4.737,1711,6.641,1872,10.797,1931,6.376,2131,6.084,2165,6.847,2708,11.854,2886,12.443,3058,7.724,3563,6.962,3677,8.487,3678,9.364,3683,9.364,3684,9.086,3685,10.126]],["keywords/626",[]],["title/627",[72,566.533,351,933.04,1548,759.279,3623,907.934]],["content/627",[4,1.788,20,7.729,40,6.587,46,5.586,72,8.213,107,4.239,134,9.767,180,7.938,186,5.101,201,6.665,248,11.857,264,5.003,351,13.527,356,8.026,364,9.356,398,6.462,499,9.069,551,7.853,711,7.323,910,6.943,1089,9.952,1170,8.811,1227,14.342,1694,12.075,3109,14.462,3623,13.163,3629,12.561,3686,17.256]],["keywords/627",[]],["title/628",[191,471.331,879,610.406]],["content/628",[4,2.29,23,2.674,25,1.689,33,2.269,116,7.246,184,3.805,205,4.559,206,6.246,240,3.918,398,8.277,523,9.438,596,12.279,885,12.773,993,8.452,2194,14.187,2510,15.356,2514,15.356,2515,13.061,2589,10.784,3687,17.547,3688,17.547,3689,17.547,3690,17.547]],["keywords/628",[]],["title/629",[23,105.321,25,45.956,107,169.742,185,166.935,264,200.341,315,225.08,480,248.599,675,321.43,709,424.695,742,312.793]],["content/629",[]],["keywords/629",[]],["title/630",[107,260.952,185,256.637,675,494.15,709,652.904,732,371.696]],["content/630",[3,4.847,5,2.275,6,1.794,40,4.022,51,2.521,70,5.576,87,3.661,107,3.826,147,6.721,149,4.37,166,5.712,184,2.285,185,4.476,192,3.542,199,5.045,220,3.724,230,4.92,240,4.137,264,3.054,273,2.311,299,6.553,314,3.737,316,7.67,330,3.745,347,4.847,379,4.82,381,5.026,388,5.91,392,4.901,393,5.667,400,7.013,425,3.79,447,6.721,454,6.812,455,5.045,466,5.496,490,4.186,514,3.777,524,6.909,527,5.418,544,3.931,545,4.314,561,7.327,587,6.721,613,3.712,637,6.019,638,6.076,674,5.705,675,4.901,705,6.136,706,5.38,709,6.475,711,6.61,712,6.401,716,3.804,718,4.276,720,8.037,751,6.475,785,3.213,858,5.307,887,6.136,910,6.267,923,6.909,954,5.537,991,5.808,1011,7.124,1012,7.243,1024,4.957,1118,6.812,1127,11.667,1183,5.808,1403,7.514,1554,7.373,1967,8.259,2126,10.367,2241,8.037,3153,8.83,3691,10.536,3692,10.536,3693,10.536,3694,10.536,3695,10.536,3696,10.536]],["keywords/630",[]],["title/631",[25,58.151,107,214.787,185,211.234,264,253.505,556,312.357,675,406.728,709,537.397]],["content/631",[3,6.668,6,2.136,7,4.525,25,0.964,33,1.874,51,3.469,52,3.994,58,5.309,99,5.106,107,3.56,114,5.673,152,2.886,181,3.862,184,3.143,185,3.501,199,6.94,273,3.179,284,5.142,297,4.112,301,3.303,310,6.561,315,4.721,371,7.561,392,6.742,393,7.796,414,7.628,504,6.426,506,7.859,519,7.796,537,4.751,541,7.068,544,5.408,545,4.015,564,6.705,613,5.106,614,6.269,639,6.899,718,5.882,751,8.908,874,6.426,877,8.059,932,6.596,1329,7.35,1406,11.362,1662,11.362,3142,13.403,3697,14.495,3698,14.495,3699,14.495]],["keywords/631",[]],["title/632",[107,260.952,181,283.072,301,242.127,315,346.025,537,348.193]],["content/632",[4,0.523,6,0.836,19,2.588,22,2.97,23,4.119,24,2.981,25,0.336,32,1.068,33,0.653,34,1.977,35,1.447,37,1.45,44,2.404,45,2.45,46,1.634,65,1.654,69,2.696,88,1.731,114,3.29,124,1.89,131,2.56,136,2.911,151,2.664,152,2.667,155,3.373,161,2.728,162,3.052,164,3.553,167,5.822,181,2.301,183,1.59,184,4.187,185,4.237,191,1.517,192,1.697,196,1.571,198,2.307,201,1.949,205,2.94,206,4.028,208,2.759,219,1.876,220,3.052,222,2.355,224,2.618,230,1.595,239,2.577,240,4.129,241,1.876,242,2.782,246,1.595,255,2.057,264,1.463,271,1.79,273,1.894,275,2.875,278,2.324,284,1.79,299,3.139,307,2.911,314,3.063,315,2.812,323,2.782,330,3.946,334,1.455,335,3.6,347,5.205,355,3.403,356,2.348,371,2.633,392,4.016,395,2.122,425,4.071,427,1.855,455,2.417,466,2.633,467,1.784,477,5.029,480,1.816,490,3.431,545,4.17,550,2.857,553,2.261,559,3.22,572,1.803,581,2.142,590,3.682,611,3.178,622,3.504,630,4.924,632,2.969,639,2.402,642,2.261,652,4.134,668,5.86,674,1.849,675,2.348,706,2.577,708,3.178,709,3.102,718,2.048,719,3.47,722,2.542,732,1.766,735,3.888,752,4.417,758,2.183,764,2.759,765,2.83,767,4.933,770,2.493,771,3.46,772,2.094,773,3.403,774,2.759,775,2.417,776,4.11,777,2.249,780,2.673,806,2.431,858,2.542,861,2.348,882,3.102,891,2.782,910,2.031,914,2.375,917,4.23,926,2.577,1003,4.081,1024,5.323,1042,3.263,1126,3.757,1144,4.417,1157,8.949,1169,2.309,1176,2.883,1187,3.263,1188,4.081,1227,3.31,1309,4.062,1310,5.029,1336,4.417,1342,5.838,1343,3,1345,3.139,1346,8.631,1347,3.139,1353,7.237,1354,3.067,1361,2.715,1377,2.361,1400,2.831,1444,2.388,1540,3.139,1663,4.801,1782,3.6,1803,3.757,2126,3.36,2241,3.85,3551,4.081,3684,3.033,3700,5.047,3701,5.047,3702,5.047,3703,5.047,3704,5.047,3705,5.047,3706,5.047,3707,5.047,3708,5.047,3709,4.23,3710,5.047]],["keywords/632",[]],["title/633",[177,806.215,482,857.071]],["content/633",[]],["keywords/633",[]],["title/634",[6,102.858,185,256.637,330,255.425,544,396.364,618,652.904]],["content/634",[12,4.548,18,4.357,19,3.91,25,0.867,44,3.632,46,4.222,51,3.121,63,2.86,69,4.071,70,5.092,107,3.204,124,4.884,147,8.32,152,2.597,162,4.611,166,7.071,184,2.828,185,3.151,192,4.385,205,3.389,220,4.611,222,3.556,225,6.508,230,4.12,240,4.053,278,3.511,281,5.058,297,3.7,330,4.365,499,6.855,544,7.791,545,5.028,568,7.673,611,8.213,618,8.016,622,5.293,668,6.755,701,8.112,711,5.535,713,8.433,732,4.563,740,6.067,812,9.302,920,6.907,943,6.855,957,7.924,963,5.038,983,7.753,1006,7.924,1035,7.924,1111,8.967,1113,9.494,1127,8.213,1157,7.753,1220,7.451,1323,10.224,1444,6.171,1926,9.127,1984,8.32,2178,9.127,3168,10.931]],["keywords/634",[]],["title/635",[225,562.039,278,422.052]],["content/635",[4,1.492,5,3.108,6,1.394,25,1.292,54,6.256,69,4.493,70,3.51,88,4.936,107,3.536,152,3.867,176,5.253,181,3.835,185,3.477,196,4.48,205,3.74,225,7.88,226,7.35,229,8.074,230,4.547,231,10.266,241,5.35,277,11.202,278,3.875,293,4.029,395,6.052,426,8.953,632,8.468,650,8.302,732,5.036,737,4.839,740,6.695,745,7.869,950,9.581,954,7.565,969,9.733,970,10.98,971,8.557,972,9.44,985,6.695,1042,9.307,1140,10.714,1309,6.772,1310,11.312,1686,10.478,1722,10.478,1731,12.064,2845,11.638,3460,12.597]],["keywords/635",[]],["title/636",[435,717.317,765,513.868]],["content/636",[6,1.944,25,1.335,60,5.643,155,4.509,162,5.347,185,4.85,227,7.778,246,4.779,264,5.821,271,5.366,272,6.449,301,3.447,330,3.637,396,4.942,413,7.834,425,5.442,427,5.56,435,9.186,490,6.01,590,6.449,630,5.56,695,7.47,697,9.649,737,6.75,765,6.581,772,6.274,786,6.48,860,9.19,956,9.525,1020,12.677,1043,11.011,1177,9.296,1183,8.338,1192,9.408,1224,8.809,1406,11.857,1890,11.857,1992,12.229,2671,9.919,3711,13.987]],["keywords/636",[]],["title/637",[202,482.305,563,671.65]],["content/637",[]],["keywords/637",[]],["title/638",[480,564.031,1663,871.749]],["content/638",[5,2.371,6,1.554,19,3.292,22,2.882,23,4.153,24,3.79,25,0.73,32,3.398,34,3.676,35,3.149,37,2.695,70,2.678,155,3.273,176,4.007,185,2.652,271,3.895,278,2.956,297,3.115,334,3.166,355,4.327,385,4.022,480,7.511,498,6.829,572,3.922,590,6.845,630,6.977,737,6.381,758,4.749,765,6.22,767,6.273,770,5.423,771,7.604,772,4.555,773,6.327,774,6.002,775,5.257,776,5.226,780,5.814,863,6.333,869,7.201,906,8.705,934,6.748,1121,7.099,1262,6.748,1400,9.006,1402,7.993,1894,12.246,1895,8.376,1897,12.98,1900,11.95,2203,7.201,2669,7.424,3140,10.154,3202,8.877,3352,14.05,3712,10.98,3713,10.98,3714,10.98,3715,7.099]],["keywords/638",[]],["title/639",[742,709.677,1663,871.749]],["content/639",[6,1.239,23,4.127,34,2.931,35,5.139,37,2.149,124,6.711,152,2.549,184,2.776,185,3.093,191,3.849,202,3.938,224,3.882,271,4.541,438,4.794,556,6.401,569,6.282,571,8.395,572,4.573,581,5.433,622,5.195,630,8.233,693,5.734,737,4.304,742,5.795,758,5.537,765,6.776,767,7.314,770,6.322,771,7.18,772,5.31,773,7.062,774,6.998,775,6.13,780,6.779,887,7.456,943,6.728,1130,11.838,1199,10.035,1219,6.167,1398,8.062,1427,6.832,1617,6.679,1889,8.062,1902,11.013,1903,13.338,2082,11.203,2125,10.351,3339,10.351]],["keywords/639",[]],["title/640",[8,562.569,25,70.65,37,178.358,65,348.193,122,466.294]],["content/640",[1,8.536,2,5.165,3,8.812,6,1.365,8,7.468,20,6.317,37,3.216,45,4.001,51,4.584,52,3.886,58,5.165,62,6.041,98,6.041,107,3.464,113,6.559,175,8.771,185,3.407,199,9.171,200,5.261,210,9.387,232,8.383,240,3.149,256,6.634,287,7.01,297,4.001,310,6.383,319,6.284,395,5.93,400,8.625,504,6.252,514,5.055,524,9.248,536,4.835,560,7.468,567,9.248,622,5.723,675,6.559,709,8.667,716,5.091,763,7.201,866,8.296,873,8.473,1110,8.056,1112,8.383,1335,11.054,1427,7.525,1571,9.535,1871,11.402,3716,14.102,3717,14.102,3718,14.102]],["keywords/640",[]],["title/641",[63,343.83,1410,1372.068]],["content/641",[6,1.508,25,1.036,37,3.839,45,4.419,51,4.899,52,4.292,58,5.706,63,5.015,65,5.106,100,5.769,185,3.763,199,7.459,256,7.329,297,4.419,399,8.516,427,5.727,512,6.377,524,10.216,533,8.818,536,5.342,636,8.516,675,9.523,708,9.81,709,9.574,763,7.955,785,4.751,874,6.907,878,10.216,892,9.574,893,6.55,918,8.818,924,9.937,1236,12.212,1427,8.313,1608,16.048,1638,12.212]],["keywords/641",[]],["title/642",[46,385.295,289,553.65,2254,673.714,3719,1100.681]],["content/642",[3,7.683,4,1.731,6,1.617,12,5.824,33,2.16,45,4.738,51,3.997,70,4.073,155,4.979,200,6.232,230,5.277,273,3.663,289,7.769,322,6.14,408,5.526,544,6.232,693,7.482,732,5.844,740,7.769,785,6.532,891,9.207,910,6.721,914,7.858,920,8.845,1031,12.159,1134,9.454,1315,10.518,1388,10.655,1548,10.655,2253,10.136,2254,9.454,3720,16.703]],["keywords/642",[]],["title/643",[2,435.966,37,199.834,1614,607.783,1843,759.279]],["content/643",[2,6.118,6,1.617,37,2.804,44,4.651,63,3.663,69,5.214,70,4.073,224,5.064,278,4.496,322,6.14,356,7.769,385,6.118,405,8.589,563,7.155,564,7.726,581,7.088,675,7.769,688,10.148,693,7.482,709,10.265,739,10.799,893,7.023,937,7.295,1007,8.778,1029,12.159,1119,9.633,1123,12.432,1207,9.633,1614,8.529,1843,10.655,1969,13.093,2043,12.159,2717,12.741,3721,16.703]],["keywords/643",[]],["title/644",[191,471.331,879,610.406]],["content/644",[6,1.698,25,1.352,45,3.524,49,5.843,63,2.724,70,4.278,97,4.36,98,5.321,107,4.309,171,4.581,181,3.309,184,2.693,185,4.238,191,3.734,195,6.577,196,5.46,208,6.79,215,6.528,225,4.452,228,5.425,239,6.342,255,5.062,256,5.843,265,4.468,278,3.343,307,7.163,315,4.045,322,4.566,331,8.031,379,5.683,385,4.549,393,6.68,398,4.651,409,7.923,419,7.546,426,7.725,432,6.528,437,4.875,523,6.68,539,5.777,563,5.321,586,9.245,638,7.163,675,8.159,693,5.563,709,10.781,717,5.947,857,6.387,881,9.041,883,6.734,892,7.633,893,5.222,921,6.433,932,5.652,996,5.622,1228,8.858,1551,10.042,1598,9.041,1602,7.546,1621,10.869,2094,9.245,2243,10.409,3105,11.485,3722,11.485,3723,12.421,3724,12.421,3725,12.421]],["keywords/644",[]],["title/645",[23,206.245,45,383.895,2111,900.729]],["content/645",[]],["keywords/645",[]],["title/646",[29,772.941]],["content/646",[22,6.375,23,4.083,25,1.362,3726,13.064,3727,20.48,3728,20.48,3729,20.48]],["keywords/646",[]],["title/647",[246,427.504,301,308.418,2111,900.729]],["content/647",[5,3.024,23,4.042,30,6.59,32,4.588,33,1.811,34,4.366,69,4.373,84,7.475,89,12.007,124,7.141,154,7.009,229,10.695,230,4.425,246,4.425,249,7.928,272,5.972,301,4.346,373,3.612,483,7.534,490,5.566,706,7.152,735,6.307,886,5.004,1257,8.724,1332,10.255,2111,14.429,3030,11.325,3367,9.185,3684,11.457,3730,12.258,3731,12.258,3732,16.686,3733,12.953,3734,14.007,3735,14.007]],["keywords/647",[]],["title/648",[735,705.949,2111,1043.588]],["content/648",[12,5.432,23,3.947,32,4.333,34,4.687,89,9.81,124,9.096,171,5.346,230,6.468,330,4.922,452,9.47,688,9.465,735,10.296,786,6.674,1317,14.326,2111,16.792,3030,16.552,3367,7.504,3730,13.633,3731,13.633,3732,13.633,3733,14.406]],["keywords/648",[]],["title/649",[3736,1723.121]],["content/649",[23,4.19,32,4.804,89,9.665,98,8.685,124,5.748,164,6.367,183,4.834,360,8.768,483,8.255,593,12.032,735,6.911,809,7.58,1125,10.741,1257,9.275,2106,8.852,2111,15.11,2927,9.665,3030,12.41,3367,7.393,3730,13.432,3731,13.432,3732,13.432,3736,14.193,3737,15.349,3738,15.349,3739,12.864,3740,15.349,3741,15.349]],["keywords/649",[]],["title/650",[703,695.225]],["content/650",[22,5.375,44,5.702,151,6.318,186,6.053,329,9.126,483,11.015,711,8.691,1024,9.635,1268,10.606,2111,13.631,3742,16.558]],["keywords/650",[]],["title/651",[23,238.957,1814,987.288]],["content/651",[]],["keywords/651",[]],["title/652",[29,772.941]],["content/652",[22,6.375,23,4.083,25,1.362,3726,13.064,3743,18.938,3744,18.938,3745,18.938]],["keywords/652",[]],["title/653",[33,153.915,198,317.966,467,420.766,1814,749.53]],["content/653",[4,1.306,12,2.786,22,4.097,23,4.314,24,4.351,25,1.038,32,1.691,34,2.886,35,2.291,37,1.341,54,3.473,67,3.215,92,3.407,124,6.638,136,4.608,149,3.314,152,2.51,155,4.654,162,2.824,171,3.292,173,7.493,184,3.386,198,2.134,222,2.179,246,3.982,275,2.661,301,1.821,355,3.149,373,4.026,391,4.024,427,4.634,458,3.716,468,3.656,694,3.971,776,6,777,3.561,779,5.318,786,5.4,809,6.225,843,3.617,886,5.577,1058,4.138,1109,4.138,1157,4.75,1169,3.656,1204,4.109,1256,4.522,1268,4.138,1276,4.231,1320,6.78,1444,3.781,1511,11.365,1602,7.659,1704,5.031,1743,14.717,1814,13.515,1872,4.297,2088,5.698,2286,10.192,2966,11.032,3039,7.389,3263,6.696,3746,6.696,3747,10.192,3748,6.263,3749,7.99,3750,7.389,3751,7.389,3752,7.99,3753,7.99,3754,12.606,3755,7.99,3756,10.192,3757,7.99,3758,4.969,3759,6.263]],["keywords/653",[]],["title/654",[154,497.46,858,681.596,1814,852.135]],["content/654",[23,4.241,34,5.198,152,3.056,154,5.642,171,5.294,224,4.654,301,3.498,373,5.228,709,9.433,809,10.012,858,10.211,1602,9.325,1713,8.322,1814,12.766,1983,11.173,2058,9.791,2089,10.066,3263,12.864,3748,12.032,3750,20.992,3760,15.349,3761,15.349,3762,15.349,3763,14.193]],["keywords/654",[]],["title/655",[4,110.083,45,301.381,224,322.118,1814,668.979,3764,773.343]],["content/655",[4,1.651,7,4.975,14,5.991,23,3.167,34,4.758,45,4.521,62,6.827,73,8.137,152,5.188,154,5.858,183,5.019,224,6.3,467,5.633,809,12.101,858,8.027,894,6.107,1086,10.304,1125,11.152,1814,10.035,2783,9.682,3748,18.124,3763,14.736,3764,11.6,3765,15.936,3766,15.936,3767,11.6,3768,15.936]],["keywords/655",[]],["title/656",[3769,1421.376]],["content/656",[4,1.651,19,4.777,33,2.687,54,6.926,63,3.495,107,3.914,136,9.191,149,6.61,155,4.75,173,9.473,224,4.832,301,3.632,308,5.158,373,5.963,391,8.027,413,8.253,444,11.152,512,6.523,514,5.713,550,9.02,717,7.63,782,9.375,786,6.827,1058,8.253,1082,10.607,1398,10.035,1743,12.156,1814,15.429,2088,14.819,3715,10.304,3770,11.862,3771,14.736,3772,14.736]],["keywords/656",[]],["title/657",[25,70.65,33,137.374,100,393.423,142,624.992,1081,652.904]],["content/657",[]],["keywords/657",[]],["title/658",[33,174.985,142,796.106,437,531.112]],["content/658",[]],["keywords/658",[]],["title/659",[308,507.514,965,975.122]],["content/659",[4,1.109,5,4.036,6,1.997,10,4.233,16,5.501,22,4.134,23,3.959,28,6.813,29,6.534,32,2.264,34,4.722,44,2.979,51,2.56,58,5.769,60,3.991,70,2.609,87,3.718,99,3.769,104,7.234,107,2.628,142,6.294,154,3.933,161,3.38,164,3.36,171,2.794,184,2.32,186,3.162,189,5.463,202,3.291,222,2.917,230,3.38,232,6.359,265,3.849,273,3.454,275,3.562,286,6.575,297,3.035,308,6.675,322,3.933,334,3.085,389,5.501,440,7.286,527,5.501,535,8.386,549,5.623,556,7.852,557,6.259,674,3.918,694,5.318,809,5.283,965,13.671,2098,6.737,2502,5.318,2861,8.386,3773,9.893,3774,15.752,3775,10.698,3776,10.698,3777,10.698,3778,11.233,3779,10.698,3780,10.698,3781,6.824,3782,10.698]],["keywords/659",[]],["title/660",[3783,1863.425]],["content/660",[4,1.579,5,4.356,6,2.19,10,6.029,11,9.992,37,3.387,44,4.243,51,4.828,52,4.198,54,6.622,75,9.852,76,9.057,142,11.869,175,9.476,176,5.56,182,3.04,191,4.58,200,7.527,264,4.417,275,5.073,301,3.473,308,4.932,373,3.929,375,7.949,467,5.386,539,7.087,567,9.992,664,10.094,692,7.78,775,7.295,915,11.341,944,8.547,1109,7.891,1143,9.852,1444,7.21,1860,11.622,2301,9.719,3784,13.334]],["keywords/660",[]],["title/661",[100,690.067]],["content/661",[4,2.01,5,1.745,6,1.232,14,4.782,16,4.156,19,2.423,22,4.128,23,3.894,28,3.496,29,5.277,30,3.803,32,2.692,33,2.509,34,1.851,37,2.641,53,3.414,73,4.127,82,5.656,85,3.893,98,3.463,100,8.271,107,1.985,114,3.698,140,6.336,142,12.682,152,1.609,162,2.857,171,2.111,175,5.027,180,5.852,182,3.139,183,2.546,184,1.753,186,2.389,198,3.398,201,3.122,202,3.913,205,3.305,215,4.248,217,2.887,240,1.805,264,3.688,271,2.867,273,2.79,274,5.226,311,3.463,314,2.867,315,2.633,322,2.971,329,3.602,366,3.893,368,5.09,372,5.226,389,4.156,407,3.942,416,5.38,417,5.728,437,3.172,467,2.857,480,2.908,483,6.842,516,4.156,544,3.016,577,5.027,607,4.382,698,5.226,737,2.718,785,2.465,879,3.147,897,5.301,1021,4.347,1255,6.535,1631,4.575,1650,4.805,1713,4.382,1872,4.347,2467,6.774,2560,5.301,2753,7.475,2966,7.074,2995,6.336,3223,6.016,3785,6.774,3786,15.612,3787,12.722,3788,8.083,3789,8.083,3790,5.656,3791,7.074,3792,7.074,3793,7.074,3794,7.074,3795,7.074,3796,7.074,3797,12.722,3798,7.074,3799,8.083,3800,8.083,3801,8.083,3802,8.083,3803,8.083,3804,8.083,3805,7.074,3806,8.083,3807,8.083,3808,7.475,3809,7.475]],["keywords/661",[]],["title/662",[25,123.921]],["content/662",[4,1.646,5,2.613,6,1.172,7,2.913,8,2.928,10,2.188,12,1.928,18,1.847,20,2.477,22,4.52,23,4.145,24,3.221,25,1.379,28,2.392,29,3.87,32,3.009,33,2.054,34,3.636,35,4.939,37,2.032,44,1.54,45,2.647,51,1.323,52,2.571,61,2.974,63,1.213,73,4.765,83,4.025,84,4.979,86,2.234,100,7.678,103,2.464,107,1.358,108,2.885,111,3.521,114,1.608,122,2.427,142,12.197,152,1.858,155,1.648,162,1.955,164,1.736,171,1.444,175,3.439,176,2.018,180,4.292,182,2.837,183,1.742,185,1.336,186,1.634,191,1.662,192,1.859,196,1.721,198,3.798,200,2.063,224,3.67,251,3.075,264,4.122,271,1.962,273,3.118,275,1.841,284,1.962,288,2.731,319,2.464,330,1.33,334,1.594,359,4.025,373,1.426,387,3.221,400,2.49,408,5.699,414,2.162,421,2.864,534,3.944,538,2.749,539,2.572,543,3.455,544,2.063,555,3.439,572,1.975,630,5.227,660,3.102,722,2.785,736,2.071,737,1.859,757,3.575,758,2.392,763,7.26,764,3.023,765,1.812,770,2.731,771,4.85,772,2.294,773,3.677,774,3.023,775,2.648,777,2.464,787,2.68,804,4.522,805,3.626,875,2.928,894,2.119,975,2.974,1077,5.281,1143,3.575,1160,2.804,1219,2.664,1300,2.544,1308,3.13,1313,3.287,1320,2.974,1333,4.116,1613,3.075,1891,3.87,2106,3.189,3778,3.323,3781,7.721,3786,10.593,3790,3.87,3791,4.839,3792,4.839,3793,4.839,3794,4.839,3795,4.839,3796,4.839,3798,4.839,3805,4.839,3810,4.839,3811,8.166,3812,4.839,3813,3.36,3814,3.626,3815,4.839,3816,4.839,3817,4.839,3818,8.166,3819,4.839]],["keywords/662",[]],["title/663",[191,471.331,879,610.406]],["content/663",[25,1.336,33,2.597,179,9.983,188,11.266,205,5.219,206,7.149,857,10.328,883,10.889,886,7.174,1444,9.504,3186,16.238,3820,18.572,3821,17.576]],["keywords/663",[]],["title/664",[6,151.799,435,717.317]],["content/664",[6,2.085,152,4.288,193,8.63,435,9.854,1058,11.155,1388,13.739]],["keywords/664",[]],["title/665",[3255,1561.679]],["content/665",[]],["keywords/665",[]],["title/666",[334,537.276]],["content/666",[2,5.749,18,5.243,20,10.281,25,1.044,28,8.898,29,6.511,37,3.454,46,5.081,65,5.144,81,11.194,94,9.762,107,3.855,122,6.889,186,4.639,196,4.885,222,4.28,271,5.568,373,5.306,398,5.878,458,7.301,642,7.031,853,8.967,879,6.111,886,5.607,1089,11.866,1264,11.683,1697,8.884,2667,13.154,3280,12.69,3822,15.696,3823,12.304,3824,15.696,3825,15.696,3826,15.696,3827,15.696,3828,12.304]],["keywords/666",[]],["title/667",[20,702.281,569,769.371]],["content/667",[14,7.27,20,11.32,89,12.178,98,8.284,198,6.27,202,5.949,458,8.995,886,6.908,1114,9.875,2892,19.671,2976,16.924,3829,19.339,3830,14.394]],["keywords/667",[]],["title/668",[186,463.43,3831,1313.99]],["content/668",[20,10.243,28,6.738,46,6.627,97,5.469,98,6.674,111,5.878,155,6.816,156,10.841,186,4.605,198,4.162,202,4.792,255,6.349,330,3.746,368,9.81,373,5.28,409,9.937,441,15.616,516,8.011,711,6.611,879,6.065,1024,7.329,1108,10.533,1310,9.073,1648,14.326,2098,9.81,2099,13.056,2194,12.595,2301,9.937,2976,13.633,3832,15.579,3833,15.579,3834,15.579,3835,14.406,3836,15.579]],["keywords/668",[]],["title/669",[1074,857.071,1147,864.293]],["content/669",[44,6.06,1147,11.997,1598,15.842,1749,16.601,3255,18.239]],["keywords/669",[]],["title/670",[387,1085.252]],["content/670",[20,8.541,28,8.247,29,5.81,44,3.9,67,7.672,71,15.98,72,6.667,89,8.82,109,9.057,114,4.072,152,2.789,185,3.384,186,4.14,190,6.552,301,3.192,311,6.001,361,7.857,366,6.747,373,6.001,387,8.158,466,11.309,510,7.103,596,9.802,674,5.13,769,10.196,806,10.442,1147,10.511,1339,6.274,1716,9.99,2308,8.82,2344,11.325,2642,11.325,2707,10.685,2892,11.739,3255,11.739,3280,11.325,3830,16.136,3831,11.739,3837,12.953,3838,14.007,3839,12.953,3840,14.007,3841,14.007,3842,14.007]],["keywords/670",[]],["title/671",[1792,1077.888,1872,843.27]],["content/671",[]],["keywords/671",[]],["title/672",[504,695.115,581,665.361]],["content/672",[23,4.293,24,6.214,32,3.81,34,4.122,50,9.924,151,5.554,164,5.653,167,7.824,355,7.094,1260,15.087,3843,18.002,3844,18.002,3845,15.754,3846,15.754,3847,15.754]],["keywords/672",[]],["title/673",[257,702.281,581,665.361]],["content/673",[22,4.567,23,4.312,24,6.006,32,3.682,34,3.984,50,9.592,151,5.368,164,5.464,167,7.562,355,6.857,834,15.227,1260,14.583,3845,15.227,3846,15.227,3847,15.227,3848,21.986]],["keywords/673",[]],["title/674",[581,665.361,1263,1118.181]],["content/674",[8,7.176,23,4.356,24,4.678,32,2.868,34,3.103,45,3.844,50,7.47,87,4.709,125,5.362,144,8.328,151,4.181,162,4.79,164,4.256,167,5.89,171,3.539,196,5.802,203,6.872,355,5.34,366,6.528,1220,7.742,1254,9.163,1260,11.357,1872,11.461,2942,10.623,3845,11.859,3846,11.859,3847,11.859,3849,11.859,3850,12.531,3851,11.859,3852,13.552,3853,13.552,3854,13.552,3855,11.859]],["keywords/674",[]],["title/675",[1090,907.934,1792,818.312,1872,640.194,3375,792.272]],["content/675",[4,1.882,22,4.766,23,3.442,151,5.602,154,6.675,203,9.208,438,6.8,1090,13.851,1617,9.473,1792,15.524,1872,13.218,3375,12.087,3856,16.792,3857,18.159,3858,13.851,3859,13.516,3860,24.577,3861,18.159]],["keywords/675",[]],["title/676",[972,887.426,1845,1134.114,3375,900.729]],["content/676",[4,2.231,14,6.33,22,4.419,23,3.282,25,1.432,33,2.177,45,4.777,51,4.029,87,5.851,111,6.354,154,6.19,198,4.498,458,7.832,763,8.598,950,11.207,972,14.12,1026,12.844,1792,11.576,1845,18.045,1872,9.056,1914,12.008,2813,14.735,3375,11.207,3862,15.57,3863,19.893,3864,14.111]],["keywords/676",[]],["title/677",[25,89.993,45,383.895,628,765.941]],["content/677",[]],["keywords/677",[]],["title/678",[25,89.993,628,765.941,785,412.676]],["content/678",[4,1.556,19,4.502,23,4.1,25,1.493,32,3.178,45,4.26,110,6.624,124,7.483,171,5.218,177,7.722,260,7.777,373,3.873,414,5.87,476,12.14,545,6.22,590,6.403,628,11.31,737,6.718,785,7.602,1114,10.203,1300,9.192,2671,9.848,3865,13.142,3866,15.017,3867,11.455]],["keywords/678",[]],["title/679",[785,568.257]],["content/679",[4,1.818,40,6.698,44,4.886,64,11.864,152,3.493,186,5.187,246,5.543,260,9.087,301,3.999,329,7.819,398,6.571,476,10.661,515,8.666,545,4.86,711,7.446,716,6.335,785,7.745,879,6.831,993,8.452,1024,8.255,1155,11.864,1991,13.755,2165,11.864,3865,15.356,3868,17.547]],["keywords/679",[]],["title/680",[29,772.941]],["content/680",[4,1.622,5,2.73,22,5.073,23,4.253,24,4.364,25,1.181,32,3.312,33,1.037,34,4.067,35,2.3,36,4.184,37,1.347,44,2.233,45,5.039,70,1.956,111,5.906,152,1.597,171,2.094,198,3.378,224,2.432,225,2.875,241,2.981,246,3.994,271,2.845,275,2.671,319,5.635,334,2.313,373,2.069,467,5.533,476,11.744,572,2.865,590,3.42,628,13.971,630,5.754,737,5.262,758,6.769,765,5.13,770,3.961,771,6.271,772,3.327,773,3.161,774,4.385,775,6.054,776,6.018,777,3.574,779,5.339,780,4.247,785,4.773,787,3.887,879,3.123,1160,4.067,1219,3.864,1300,3.69,1309,3.773,1712,5.613,1931,5.051,2121,7.771,2671,5.26,2768,5.613,3726,5.116,3747,6.485,3867,6.118,3869,8.021,3870,8.021,3871,8.021,3872,12.644,3873,8.021,3874,8.021,3875,8.021,3876,6.485,3877,8.021,3878,7.019,3879,6.485]],["keywords/680",[]],["title/681",[628,765.941,785,412.676,1165,887.426]],["content/681",[4,1.664,14,4.128,18,5.363,19,3.292,23,4.108,34,2.514,54,4.772,62,4.704,65,3.599,67,6.46,97,3.855,107,2.697,152,3.196,171,2.867,201,4.241,222,2.994,301,2.503,334,3.166,373,5.984,381,3.543,476,11.531,557,4.363,600,5.906,611,6.914,628,11.818,656,6.527,667,8.376,668,5.687,716,3.964,737,3.692,775,9.087,785,7.493,804,11.246,942,11.403,955,6.333,975,5.906,1041,8.607,1165,10.529,1192,6.829,1268,5.687,1300,5.051,1712,7.684,2079,6.273,3659,9.202,3867,12.246,3878,9.609,3879,15.344,3880,9.202,3881,14.846]],["keywords/681",[]],["title/682",[69,371.572,373,306.972,490,472.946,785,362.986]],["content/682",[4,1.181,23,4.404,33,1.474,34,2.61,53,4.816,54,4.955,67,4.587,69,3.559,152,3.285,172,6.575,186,3.37,187,7.007,222,3.109,230,6.126,246,3.602,322,4.191,396,3.725,490,4.53,628,9.339,668,5.904,736,6.179,785,5.032,804,10.3,901,4.352,1192,7.091,1479,6.395,1646,7.589,2031,8.131,2508,9.218,3878,9.977,3879,17.183,3882,11.401]],["keywords/682",[]],["title/683",[628,887.422,787,759.84]],["content/683",[4,1.556,23,4.203,34,4.12,45,2.845,69,3.131,88,3.439,152,4.471,154,5.519,171,4.699,184,2.175,186,2.964,205,2.606,225,3.595,273,2.199,373,2.586,425,3.608,427,3.687,438,3.756,458,4.665,476,12.998,556,3.582,628,10.185,668,5.194,716,3.621,771,8.005,785,6.524,787,10.368,804,4.86,993,4.831,1165,6.577,1169,10.273,1204,5.157,1257,4.588,1300,9.841,1417,5.482,1614,5.121,1686,7.3,2058,6.397,2130,6.577,2131,6.026,2321,6.315,2671,6.577,2677,7.018,2779,6.163,3778,10.812,3867,7.65,3879,12.138,3881,9.274,3883,8.776,3884,9.274,3885,15.014,3886,15.014]],["keywords/683",[]],["title/684",[152,312.153,809,774.288]],["content/684",[23,4.082,34,5.087,88,6.068,124,8.321,152,3.523,154,6.505,171,5.802,447,11.288,628,12.577,785,5.396,809,8.739,810,15.486,2130,11.605,3879,14.307,3887,15.276,3888,15.486,3889,17.696]],["keywords/684",[]],["title/685",[184,340.004,628,887.422]],["content/685",[5,4.098,6,2.092,19,4.171,25,1.262,53,5.877,152,5.199,184,5.267,186,4.113,192,4.678,220,4.918,223,9.76,230,4.396,239,7.105,241,7.055,334,4.012,368,8.762,427,5.115,543,5.153,545,5.257,569,6.828,628,13.747,737,6.381,772,7.873,785,7.407,942,8.36,1111,9.566,1792,9.566,1862,12.176,1872,7.483,2075,10.613,2861,10.907]],["keywords/685",[]],["title/686",[629,1267.615,3890,1567.878]],["content/686",[4,2.521,6,2.068,25,1.298,33,2.151,40,4.4,45,4.718,70,2.811,88,3.952,92,4.915,110,5.085,152,2.295,162,4.075,177,5.927,184,2.5,186,3.407,202,3.546,217,4.118,220,6.897,222,4.535,230,3.642,233,10.088,241,4.285,246,3.642,273,2.528,274,7.453,288,5.693,310,5.218,381,6.893,387,6.713,398,4.317,414,7.627,421,5.97,435,5.274,452,5.332,515,5.693,551,5.245,607,6.25,628,13.357,629,13.447,668,5.97,732,4.033,765,3.778,785,5.072,857,5.927,894,4.417,1000,6.2,1169,5.274,1204,10.033,1224,6.713,1227,7.559,1595,7.169,1604,7.453,1821,7.673,2023,5.621,2165,7.794,2628,8.793,2683,14.555,3333,9.32,3891,11.527]],["keywords/686",[]],["title/687",[4,162.462,628,887.422]],["content/687",[4,2.469,18,5.67,67,6.83,70,4.14,152,4.744,217,6.064,225,6.085,230,5.363,319,7.564,330,4.081,334,4.894,396,7.071,516,8.729,628,14.203,667,12.948,668,8.791,717,8.128,754,13.306,772,7.041,785,5.177,1040,10.828,1134,9.608,1310,9.886,1646,11.299]],["keywords/687",[]],["title/688",[179,779.313,628,887.422]],["content/688",[4,1.62,6,1.514,7,3.306,18,5.222,19,3.174,21,6.107,25,1.04,45,3.004,46,5.06,70,2.583,79,5.608,85,5.101,86,4.279,114,4.545,118,8.875,125,4.19,152,3.7,171,2.765,177,5.445,179,5.264,192,3.56,222,2.888,225,8.494,227,5.445,228,4.625,229,5.94,230,3.345,231,7.552,252,4.106,271,3.756,278,2.851,322,3.893,330,2.546,381,5.997,395,4.453,425,3.81,440,4.898,483,5.696,486,6.295,496,4.279,510,7.928,536,3.631,545,2.933,552,8.216,590,6.665,614,4.58,622,4.297,628,12.965,630,3.893,639,5.04,645,6.23,668,5.484,715,7.882,717,5.07,732,5.47,737,3.56,739,6.847,785,3.229,894,5.991,1082,7.048,1116,7.771,1197,7.41,1309,8.743,1310,9.105,1558,6.508,1596,9.792,1728,7.882,1889,6.668,1966,7.41,2032,8.562,2304,7.709,2612,7.552,3892,10.59,3893,10.59,3894,10.59,3895,10.59]],["keywords/688",[]],["title/689",[577,975.122,628,887.422]],["content/689",[4,1.481,6,1.384,44,3.981,64,9.666,67,5.752,111,5.394,217,5.107,225,6.93,254,8.498,271,5.071,296,10.641,297,4.055,322,7.107,330,3.437,334,4.122,389,7.351,425,5.143,440,6.612,462,5.68,486,8.498,545,3.96,598,9.666,607,7.751,628,13.283,639,6.804,761,10.406,785,5.896,952,8.091,1047,10.406,1108,9.666,1310,12.758,1501,8.167,2106,8.245,2186,13.219,2301,9.119,2421,10.641,2422,11.558,3592,10.641,3896,14.296,3897,14.296,3898,12.51,3899,14.296,3900,14.296,3901,14.296,3902,14.296,3903,14.296,3904,14.296]],["keywords/689",[]],["title/690",[225,485.1,1110,773.065,1309,636.63]],["content/690",[4,1.906,6,1.781,14,6.915,25,0.884,49,6.253,63,2.915,70,3.242,92,5.667,107,3.265,113,6.183,114,5.347,179,6.607,181,3.542,184,2.883,225,6.594,226,6.787,230,4.199,264,3.854,272,7.843,298,6.523,395,5.589,425,6.617,515,6.564,529,7.524,573,9.138,628,11.939,639,6.327,715,9.894,858,6.695,901,5.074,905,7.901,921,6.884,954,6.986,965,8.267,971,10.934,1220,7.593,1239,11.14,1309,8.653,1310,13.257,1479,7.456,1646,8.847,1728,9.894,2078,11.632,2677,9.302,2804,12.292,3767,9.676,3905,13.292,3906,12.292,3907,13.292,3908,13.292,3909,13.292,3910,13.292]],["keywords/690",[]],["title/691",[19,240.822,65,263.302,225,287.985,381,259.246,628,454.709,737,270.095,1309,377.942,1310,467.879]],["content/691",[6,1.247,11,8.447,19,5.395,23,3.969,32,2.726,35,5.161,65,5.898,70,3.141,79,6.821,88,6.171,113,5.992,152,3.583,161,4.069,164,5.651,204,8.516,225,4.618,241,4.788,246,4.069,271,4.569,298,8.831,301,2.936,310,5.831,330,4.327,545,5.745,552,6.77,592,7.826,628,7.291,632,7.578,668,6.671,737,4.331,772,5.343,785,3.928,1116,6.403,1309,6.06,1310,10.481,2552,10.415,2690,11.273,2692,9.014,3170,9.826,3583,16.642,3911,12.881,3912,12.881,3913,12.881,3914,12.881,3915,12.881,3916,12.881,3917,12.881,3918,12.881,3919,9.377,3920,11.912]],["keywords/691",[]],["title/692",[45,444.782,506,850.067]],["content/692",[]],["keywords/692",[]],["title/693",[23,161.915,408,351.501,506,575.999,3921,832.767,3922,890.35]],["content/693",[2,5.421,4,1.534,5,2.124,6,0.953,12,7.774,23,4.194,24,3.396,25,1.183,32,4.491,34,2.253,35,2.822,37,3.743,45,4.199,68,5.171,73,5.024,151,4.566,167,4.276,189,5.024,198,3.954,273,2.158,289,9.87,293,2.754,355,3.877,373,2.538,408,6.547,438,3.685,490,5.881,506,10.729,556,5.287,643,7.017,652,4.711,716,3.552,843,6.699,894,3.771,983,11.763,996,4.454,1612,13.242,1628,5.788,1716,7.017,2253,4.656,3921,7.713,3922,8.246,3923,7.324,3924,16.451,3925,16.451,3926,9.839,3927,9.098,3928,14.8,3929,14.8,3930,9.839,3931,9.839,3932,9.839,3933,9.839]],["keywords/693",[]],["title/694",[1021,1002.228]],["content/694",[33,2.874,506,12.051,689,12.151]],["keywords/694",[]],["title/695",[23,146.203,107,356.649,181,255.603,185,231.733,577,596.617]],["content/695",[]],["keywords/695",[]],["title/696",[46,438.039,405,695.85,527,695.85]],["content/696",[4,1.526,5,4.475,6,2.007,9,3.347,14,4.418,15,4.261,16,3.762,18,2.444,19,2.193,37,1.228,40,2.793,44,3.272,46,2.368,49,3.442,51,4.72,52,4.058,61,9.071,70,4.113,72,5.594,75,7.599,77,5.915,107,1.797,111,2.761,122,3.211,124,2.74,131,3.71,147,4.667,149,6.11,162,2.586,171,1.911,176,4.289,181,1.95,182,1.46,186,4.354,191,5.553,204,3.462,205,3.827,215,3.845,220,2.586,222,3.205,230,2.311,240,3.289,254,4.349,271,2.595,275,3.913,287,3.637,304,3.685,315,2.383,330,1.759,382,3.762,391,3.685,392,3.403,396,3.84,405,3.762,413,6.087,418,5.735,457,4.947,458,3.403,467,2.586,490,2.907,498,4.55,507,7.309,515,3.613,521,5.915,539,5.467,545,2.027,576,6.132,581,3.105,673,3.817,674,2.68,694,3.637,703,6.292,711,3.105,716,2.641,736,2.74,773,2.883,812,8.382,827,4.497,855,4.349,864,4.798,866,4.304,878,4.798,884,4.261,894,4.504,944,8.262,958,5.436,967,5.326,1109,3.789,1158,4.497,1160,3.71,1174,4.445,1317,5.12,1327,3.904,1389,5.915,1413,6.132,1444,3.462,1526,4,1617,6.131,1705,5.915,1706,4.798,1707,8.382,1708,5.03,1710,8.965,1712,5.12,1713,3.967,1722,5.326,1724,4.731,1743,5.581,1745,6.766,1766,7.823,1902,4.497,2242,5.735,2431,5.581,2533,10.285,2534,6.132,2537,6.766,2671,4.798,2714,10.126,2720,4.607,2861,5.735,3094,6.403,3097,6.403,3274,6.132,3934,7.317,3935,7.317,3936,7.317,3937,6.766,3938,6.766,3939,6.766]],["keywords/696",[]],["title/697",[10,470.996,15,693.228,37,199.834,51,284.834]],["content/697",[4,1.471,5,5.052,6,2.368,18,4.743,19,4.256,37,2.384,46,4.596,51,5.224,52,3.912,53,8.129,70,4.693,156,7.519,184,3.079,185,3.43,191,4.268,205,3.689,220,6.803,229,7.964,246,6.079,278,3.822,308,4.596,357,10.126,364,7.698,410,9.18,444,9.936,487,8.941,663,7.827,668,7.353,809,9.503,873,8.531,894,7.374,932,6.461,1112,8.44,1143,9.18,1332,7.636,1333,10.568,2720,8.941,2724,10.568,2728,10.83,2729,13.129,3940,14.198]],["keywords/697",[]],["title/698",[225,667.984]],["content/698",[4,1.228,5,1.966,6,0.52,12,1.873,18,4.662,22,1.41,23,2.127,33,1.805,37,0.902,40,5.327,44,2.536,46,1.739,54,2.335,62,2.302,67,3.664,70,3.809,72,2.557,86,2.171,88,5.356,107,2.237,110,2.37,114,1.562,116,6.45,125,3.603,148,3.099,152,4.743,154,5.13,161,1.697,162,5.998,181,2.426,183,1.692,184,3.026,198,2.433,201,2.075,203,2.725,204,4.309,205,4.698,206,1.913,217,1.919,220,3.219,224,1.629,225,8.329,226,9.233,227,7.176,228,2.347,230,2.877,231,9.953,240,3.116,242,2.962,246,2.877,252,2.083,271,5.541,273,1.178,277,3.099,278,1.446,279,3.194,282,6.946,288,2.653,296,3.999,298,4.469,301,1.225,310,2.432,322,4.357,325,3.76,330,4.348,366,2.588,381,2.939,387,3.129,388,3.014,407,2.62,419,3.264,437,2.109,455,4.36,481,2.962,482,2.937,483,2.89,490,2.135,520,2.432,544,2.005,552,2.824,580,4.189,597,4.212,607,2.913,622,2.18,628,6.708,630,1.975,631,3.129,632,3.161,664,2.688,673,4.751,689,2.937,716,5.639,734,2.706,736,3.41,771,4.749,775,4.36,858,2.706,894,3.49,906,2.913,1009,4.702,1072,8.294,1074,2.937,1081,3.302,1086,5.888,1114,4.65,1116,2.671,1125,3.76,1160,2.725,1166,3.523,1169,2.458,1173,3.194,1192,3.342,1268,6.138,1272,3.911,1332,2.89,1398,3.383,1444,2.542,1560,3.694,1571,3.633,1611,10.388,1724,5.888,1822,3.999,1946,4.344,1966,3.76,1970,3.832,2129,4.968,2178,6.373,2334,4.212,2444,5.533,2541,4.098,2552,4.344,2589,5.597,2598,4.098,2605,4.968,2677,6.373,2683,4.702,2708,4.212,2979,3.633,3067,7.969,3515,4.503,3563,3.694,3715,3.474,3919,3.911,3941,9.107,3942,5.373,3943,5.373,3944,5.373,3945,11.852,3946,5.373]],["keywords/698",[]],["title/699",[180,721.234,3947,1449.827]],["content/699",[7,5.234,12,4.064,18,3.894,22,3.059,33,2.168,70,2.843,88,3.997,107,2.863,148,6.722,156,6.172,180,10.465,181,3.106,184,2.528,185,2.816,192,3.919,194,6.788,196,3.628,205,5.102,206,6.989,211,9.424,219,6.232,220,5.927,222,3.178,246,5.296,264,3.379,273,2.556,301,3.821,321,7.163,330,4.031,361,6.538,373,5.538,424,10.84,490,4.631,496,4.71,499,6.126,570,10.778,650,6.722,675,5.422,704,6.126,716,4.208,736,4.365,740,5.422,769,8.485,865,7.644,888,6.081,910,4.69,1066,6.22,1251,8.485,1554,8.157,1610,7.249,1634,8.313,2098,10.557,2114,7.644,2117,7.644,2183,12.204,2192,9.424,2281,7.758,2421,8.676,2482,9.769,2586,9.769,2741,8.891,2813,10.2,3454,10.778,3677,9.769,3948,11.656,3949,11.656,3950,11.656]],["keywords/699",[]],["title/700",[985,729.273,1860,1195.939]],["content/700",[4,1.71,6,1.104,16,5.862,18,7.099,22,2.992,70,5.183,72,5.426,107,4.053,114,3.314,124,4.27,152,3.285,181,5.663,184,5.098,185,2.754,198,3.046,205,5.038,220,5.833,246,3.602,264,5.622,278,3.069,301,2.598,366,7.948,373,2.94,374,9.218,388,9.255,402,6.575,433,8.299,464,8.486,476,6.927,482,6.232,487,7.179,501,5.862,544,6.156,545,3.158,579,7.371,582,6.395,648,7.179,716,5.957,736,4.27,740,5.303,812,8.131,886,4.073,894,4.369,1155,7.709,1204,5.862,1332,6.132,1564,7.273,1695,9.977,1991,8.937,2430,9.555,2517,9.977,2617,12.934,2642,9.218,2783,6.927,3919,8.299,3937,10.543,3938,10.543,3951,7.978,3952,9.218,3953,11.401,3954,11.401,3955,11.401,3956,11.401,3957,11.401,3958,11.401]],["keywords/700",[]],["title/701",[305,975.122,359,1141.31]],["content/701",[5,2.371,6,1.554,14,6.035,15,9.35,18,3.668,19,3.292,25,0.73,33,2.454,40,4.191,44,3.057,65,3.599,70,5.659,72,5.226,88,3.765,92,4.682,107,2.697,144,6.748,152,4.423,171,2.867,181,2.926,184,5.032,186,3.246,192,3.692,198,4.289,201,4.241,219,4.081,220,6.709,222,2.994,228,4.796,239,5.607,241,4.081,242,6.053,243,5.051,246,5.072,264,3.183,273,2.408,278,4.322,305,6.829,316,7.993,322,4.036,334,3.166,359,11.687,368,6.914,396,6.822,421,8.315,426,6.829,534,7.831,716,6.852,736,6.013,737,3.692,747,7.831,856,7.099,894,4.208,906,5.953,912,5.728,1160,5.568,1173,6.527,1564,7.004,1863,12.585,1926,11.235,1966,7.684,1970,7.831,3469,9.609,3919,7.993,3959,10.98]],["keywords/701",[]],["title/702",[33,174.985,205,351.607,435,619.122]],["content/702",[5,2.666,6,1.195,14,6.567,33,2.85,70,3.011,88,4.234,107,3.033,111,4.659,125,4.886,147,7.876,148,7.121,152,4.036,156,6.538,162,7.166,181,3.29,182,3.485,185,2.983,186,3.649,192,4.151,196,3.843,201,4.769,205,4.539,220,4.365,222,3.367,223,6.349,227,6.349,254,7.339,264,3.579,293,3.456,301,2.814,330,4.2,398,4.624,435,10.64,444,8.64,487,7.775,545,5.615,568,7.264,737,4.151,765,5.725,864,8.097,995,8.806,1204,6.349,1224,7.191,1332,6.641,1564,7.876,1629,9.678,2111,8.218,2443,9.678,2532,10.348,2707,9.418,2752,11.417,2783,7.501,2830,11.417,3680,9.418,3960,10.805,3961,10.805,3962,12.347,3963,9.418,3964,12.347,3965,12.347]],["keywords/702",[]],["title/703",[58,574.258,63,343.83]],["content/703",[1,3.778,4,1.681,5,3.502,6,1.921,7,4.122,9,3.879,12,4.604,15,4.937,19,2.541,25,0.878,30,3.988,33,1.096,37,2.217,40,5.041,41,8.929,44,3.677,51,4.382,52,3.639,62,3.632,63,3.557,67,6.526,70,3.22,84,8.656,86,5.336,97,2.976,107,3.244,114,4.715,124,3.175,125,3.355,151,2.616,152,1.688,154,7.295,173,7.85,181,3.519,186,2.506,187,5.21,198,2.265,200,3.163,201,5.1,219,4.908,234,3.921,240,1.893,246,2.678,264,3.828,278,2.282,293,2.373,308,2.744,357,6.046,364,4.597,373,3.406,395,3.565,399,7.219,400,8.245,408,2.805,458,3.943,469,6.646,496,3.426,501,6.79,544,4.927,545,2.348,642,3.797,648,5.338,660,4.755,683,5.933,689,4.634,703,3.163,785,2.585,787,4.109,886,3.028,889,5.732,902,4.843,940,8.023,983,5.04,1030,6.48,1602,5.151,1713,7.16,1827,4.755,1874,6.854,2023,4.134,2065,10.676,2130,8.66,2175,6.31,2427,6.467,2443,6.646,2555,7.419,2567,7.105,2610,7.419,2738,7.84,2739,7.84,2740,7.105,3158,6.854,3159,7.419,3448,6.854,3564,6.046,3966,8.478,3967,8.478,3968,8.478,3969,8.478,3970,8.478,3971,8.478,3972,8.478,3973,8.478,3974,8.478,3975,8.478]],["keywords/703",[]],["title/704",[967,1141.31,3963,1195.939]],["content/704",[6,1.384,14,5.374,33,1.849,37,2.4,46,4.627,62,6.124,63,3.135,65,6.336,107,3.511,156,7.57,176,7.994,177,7.351,181,3.809,189,7.3,192,6.5,205,5.023,220,5.053,264,5.605,272,6.095,273,3.135,306,10.195,321,8.786,372,9.243,373,5.649,391,7.2,407,6.971,482,7.815,543,5.294,555,8.891,703,5.334,723,9.666,888,10.086,967,14.073,1109,7.404,1315,9.002,1339,6.403,1602,8.685,1650,8.498,2131,8.59,2281,9.515,2308,9.002,2560,9.375,3067,12.51,3564,10.195,3976,14.296]],["keywords/704",[]],["title/705",[6,151.799,1021,843.27]],["content/705",[4,0.982,6,1.684,7,2.96,14,3.564,25,0.957,33,2.7,40,6.64,44,2.64,46,5.63,62,6.165,63,2.079,65,3.107,69,2.96,72,4.513,100,3.511,107,5.129,114,5.057,152,2.865,156,5.021,181,5.563,184,4.767,186,2.802,189,4.841,192,4.838,198,3.844,201,3.662,205,3.739,220,3.352,222,3.924,234,6.657,246,4.546,272,4.042,273,3.814,315,3.088,329,4.225,362,6.411,372,6.13,382,4.875,385,3.473,392,4.41,398,3.551,414,6.799,417,7.832,421,4.91,442,6.902,443,8.297,451,5.827,452,4.385,466,4.946,476,5.76,499,4.983,501,4.875,537,3.107,541,4.623,556,3.387,569,4.652,650,5.468,674,3.473,705,8.381,886,3.387,894,3.633,1021,9.355,1189,5.897,1251,6.902,1326,8.844,1329,4.808,1579,7.665,1650,8.555,1651,8.3,1694,6.635,2021,7.946,2031,6.762,2136,6.635,2175,7.057,2194,7.665,2308,5.97,2617,7.432,2771,10.977,2781,7.057,3919,6.902,3977,8.297,3978,9.481]],["keywords/705",[]],["title/706",[2,294.246,25,53.425,33,103.882,37,134.874,65,263.302,84,428.702,100,297.505,506,435.568]],["content/706",[]],["keywords/706",[]],["title/707",[33,202.738,506,850.067]],["content/707",[4,1.602,6,1.497,7,6.36,8,10.788,12,8.444,14,5.813,22,4.058,33,1.999,51,3.7,67,6.222,69,4.827,70,3.771,122,6.787,204,7.317,246,4.885,373,5.254,385,5.664,486,9.192,504,6.856,506,8.384,544,5.769,696,9.617,716,5.583,740,7.192,920,8.188,983,9.192,985,7.192,1110,8.834,1160,7.841,1329,7.841,1646,10.292,1706,10.14,3469,13.532,3979,12.959,3980,15.463,3981,15.463,3982,15.463,3983,15.463]],["keywords/707",[]],["title/708",[33,153.915,206,423.703,240,265.779,1051,933.04]],["content/708",[4,2.032,12,6.836,33,3.06,53,6.166,176,5.327,182,2.912,240,3.259,260,7.559,289,6.789,311,6.253,329,6.504,372,9.437,373,5.056,381,4.71,387,8.501,418,11.442,424,9.437,506,12.832,524,9.572,855,8.677,886,5.214,894,7.513,983,8.677,1112,8.677,1124,9.437,1261,9.311,1403,10.41,1716,10.41,1821,13.05,1847,10.864,2033,11.801,2541,11.134,2969,13.256,3448,11.801,3593,13.05,3715,12.676,3984,14.596,3985,14.596]],["keywords/708",[]],["title/709",[23,192.952,52,221.356,75,519.427,100,297.505,179,399.314,275,267.502,506,435.568]],["content/709",[2,3.395,4,2.142,5,3.054,6,1.37,12,7.208,18,3.097,33,1.829,37,2.375,41,9.565,51,4.594,52,5.289,63,3.762,69,2.894,73,4.733,75,9.147,79,4.909,84,4.947,87,3.221,171,3.694,177,7.275,182,1.85,191,2.787,192,3.117,200,6.401,219,3.446,222,2.528,228,4.049,230,4.469,246,5.42,252,3.595,254,5.51,264,2.687,273,2.033,275,4.711,281,5.486,289,4.312,292,7.267,297,2.63,301,2.113,308,5.553,330,2.229,373,2.391,378,5.57,379,4.241,381,2.991,386,6.748,387,8.239,389,4.767,391,4.669,400,6.37,403,7.495,408,4.681,413,4.801,419,5.632,421,4.801,440,4.288,482,7.733,504,4.11,506,7.67,527,4.767,544,3.459,660,7.935,674,3.395,716,3.347,740,4.312,785,2.827,856,5.994,894,5.421,912,7.38,932,6.438,940,5.632,983,11.411,1081,5.697,1089,5.346,1112,8.409,1114,4.733,1166,6.079,1564,5.913,1631,5.247,1706,6.079,1926,6.487,1931,5.837,2429,6.611,2560,6.079,2652,8.572,3979,7.769,3986,9.27,3987,8.112]],["keywords/709",[]],["title/710",[25,123.921]],["content/710",[2,3.801,4,2.183,5,1.356,6,0.608,7,3.239,12,5.37,14,3.901,18,2.098,19,3.111,20,2.813,22,3.48,23,3.994,24,3.582,25,1.443,28,2.716,29,4.304,32,2.806,33,2.205,34,3.904,35,4.416,37,1.742,45,2.944,51,1.503,52,3.654,53,2.653,62,2.69,63,2.276,69,1.96,72,2.989,73,6.771,84,5.537,85,3.025,100,4.911,107,1.543,114,1.826,122,2.756,152,2.066,164,1.972,171,1.64,180,2.889,182,2.07,183,1.978,190,2.938,191,1.888,198,3.542,201,4.008,202,3.192,203,5.262,219,2.334,220,2.22,222,1.712,224,3.146,228,2.743,246,1.984,264,1.821,273,2.908,275,4.415,281,4.024,285,4.317,289,4.827,315,3.38,319,2.798,355,2.475,373,2.676,382,3.229,385,3.801,389,3.229,397,4.006,398,3.886,400,2.828,408,6.97,414,2.455,467,3.668,480,2.259,499,3.3,504,2.784,506,9.245,508,3.954,510,3.185,538,3.121,543,3.843,544,3.872,568,3.694,639,2.989,722,3.163,736,2.352,737,2.111,742,2.843,763,3.207,776,4.939,777,2.798,785,1.915,787,3.043,804,5.029,805,4.118,857,3.229,886,2.243,983,9.155,993,3.025,1160,3.185,1329,3.185,1613,3.492,1697,3.554,1891,4.395,1963,5.263,2106,3.622,2170,5.496,3169,4.923,3778,3.773,3781,8.459,3810,5.496,3816,5.496,3817,5.496,3818,9.081,3819,5.496,3921,4.923,3922,5.263,3988,6.28,3989,15.4,3990,4.674]],["keywords/710",[]],["title/711",[25,79.157,100,440.795,385,435.966,1051,933.04]],["content/711",[4,1.626,5,2.297,6,1.907,7,2.021,12,7.429,14,4,16,3.33,23,3.617,28,2.801,29,6.508,32,2.867,33,1.752,34,1.483,35,1.857,44,1.803,50,5.866,53,2.735,58,2.372,70,2.595,73,5.434,82,4.531,100,7.89,114,3.094,116,2.674,125,2.562,152,1.289,154,2.38,161,2.046,162,3.762,163,5.235,164,4.927,167,2.814,171,1.691,182,2.123,183,2.039,184,2.308,185,1.564,186,1.914,189,3.306,191,3.199,196,2.015,198,2.843,201,2.501,202,1.992,204,3.064,205,1.682,217,2.313,219,2.407,222,1.766,230,2.046,232,3.849,240,2.376,251,5.917,271,2.297,273,4.087,274,4.187,278,1.743,289,8.063,300,3.569,315,2.109,322,2.38,329,4.742,355,2.552,368,4.077,372,4.187,398,2.425,407,5.189,416,7.083,417,7.805,437,2.541,457,4.378,480,2.329,483,5.724,500,4.531,503,3.429,504,2.871,506,5.77,520,2.931,543,2.398,544,2.416,557,2.573,577,4.027,630,2.38,674,2.372,698,4.187,737,2.177,742,2.931,785,4.131,787,3.138,886,2.313,894,2.481,897,4.246,901,2.472,926,3.306,966,5.427,983,9.327,996,2.931,1021,3.483,1068,3.849,1170,3.306,1173,3.849,1268,3.353,1339,2.9,1554,4.531,1588,5.076,1617,3.378,1631,3.665,1650,8.053,1651,6.137,1710,4.939,3223,4.82,3633,5.666,3778,3.891,3781,4.13,3921,8.342,3923,4.82,3991,6.475,3992,10.334,3993,10.642,3994,12.528,3995,6.475,3996,6.475,3997,5.988,3998,6.475,3999,6.475,4000,6.475,4001,6.475,4002,6.475,4003,6.475,4004,6.475,4005,6.475,4006,6.475,4007,6.475,4008,6.475,4009,6.475,4010,6.475,4011,6.475,4012,6.475]],["keywords/711",[]],["title/712",[191,471.331,879,610.406]],["content/712",[4,2.392,25,1.535,33,2.985,179,9.352,188,10.554,205,4.889,206,6.697,398,7.046,506,13.538,857,9.675,883,10.201,1697,10.649,3383,17.398,3821,16.465,4013,18.815]],["keywords/712",[]],["title/713",[23,161.915,25,70.65,37,178.358,185,256.637,480,382.183]],["content/713",[]],["keywords/713",[]],["title/714",[6,131.019,273,296.762,480,486.819]],["content/714",[2,6.043,4,1.71,6,2.183,9,8.872,25,1.29,37,1.914,44,3.175,46,5.341,52,3.141,63,3.618,67,4.587,87,3.962,100,4.222,107,2.8,114,4.797,125,4.511,152,4.231,182,2.275,184,2.472,186,3.37,223,8.485,273,5.156,278,3.069,389,5.862,396,3.725,408,5.459,425,4.101,480,9.243,516,5.862,703,4.254,737,7.145,762,8.486,772,4.729,785,3.477,855,6.777,874,5.055,894,4.369,926,5.821,963,4.403,1122,9.555,1124,7.371,1191,10.525,1278,5.63,1325,7.371,1327,6.084,1558,7.007,1614,5.821,1690,13.829,1827,6.395,1961,6.777,2131,6.85,3361,10.543,4014,11.401,4015,11.401]],["keywords/714",[]],["title/715",[278,422.052,1400,879.453]],["content/715",[5,3.665,25,1.129,33,2.195,70,4.14,87,5.899,220,6.001,252,6.582,264,6.274,293,6.058,334,4.894,480,7.786,590,7.238,639,8.079,782,9.986,787,8.227,886,7.731,926,11.051,1134,9.608,1400,14.865,1749,12.948,4016,16.975,4017,16.975]],["keywords/715",[]],["title/716",[480,564.031,4018,1449.827]],["content/716",[4,2.121,5,4.42,6,1.982,25,1.036,44,4.338,45,5.808,63,3.416,73,7.955,85,7.504,264,4.516,364,12.398,480,9.496,556,7.313,674,5.706,873,9.36,886,5.565,1400,14.151,1690,14.601,2117,10.216,2861,12.212,4018,21.146,4019,15.579,4020,15.579]],["keywords/716",[]],["title/717",[4,123.338,25,79.157,45,337.67,480,428.201]],["content/717",[4,1.614,22,4.087,23,4.099,24,4.338,25,0.836,28,3.443,32,3.296,33,1.625,34,2.878,35,2.283,36,4.152,37,2.97,45,5.807,50,4.388,51,1.905,58,2.915,86,3.216,97,2.794,103,5.601,108,4.152,111,3.003,114,3.654,122,3.494,152,1.585,171,2.078,186,2.353,188,4.465,198,4.725,200,4.689,204,3.766,222,2.17,223,4.093,271,2.823,275,2.65,308,4.068,334,2.295,355,3.137,370,5.012,371,4.152,381,2.569,408,4.158,480,8.591,572,2.843,590,3.394,607,4.316,630,5.725,645,4.683,737,4.225,758,3.443,764,4.351,765,5.104,770,3.931,771,6.24,772,5.213,773,4.953,774,4.351,775,3.811,776,5.982,777,3.547,780,4.215,787,3.857,843,3.603,932,3.622,958,3.682,982,4.247,1029,5.794,1121,13.234,1224,4.636,1261,5.077,1262,10.871,1268,4.122,1276,4.215,1300,3.661,1308,4.505,1400,8.736,1628,9.162,1691,6.966,1894,9.587,1895,6.071,1897,10.161,1900,9.355,3348,7.36,3876,6.435,4021,7.96,4022,7.96,4023,7.36]],["keywords/717",[]],["title/718",[4,123.338,200,444.09,308,385.295,1121,769.603]],["content/718",[22,4.604,23,4.237,24,4.287,25,1.167,32,4.304,33,1.606,34,2.844,35,3.562,36,6.479,37,3.414,45,4.976,52,3.422,103,5.535,198,3.318,200,6.545,222,3.387,223,6.387,355,4.895,480,6.311,763,6.342,932,5.652,982,9.361,1121,11.342,1400,9.84,1628,7.307,1691,19.339,4024,10.409,4025,16.221,4026,12.421,4027,11.485,4028,10.32,4029,6.479,4030,17.542,4031,17.542,4032,10.869,4033,17.542,4034,12.421,4035,12.421,4036,12.421]],["keywords/718",[]],["title/719",[330,376.96,1400,879.453]],["content/719",[4,1.567,18,5.053,33,3.231,37,2.539,45,4.291,65,6.581,70,3.689,92,6.449,152,3.012,162,5.347,171,3.95,185,3.654,198,5.364,311,6.48,329,6.74,330,4.827,398,5.665,435,9.186,458,7.036,480,5.442,557,6.01,661,12.808,674,5.54,843,6.847,1169,6.92,1377,7.076,1400,14.7,1796,9.19,2900,13.364,3043,13.237,4037,15.126]],["keywords/719",[]],["title/720",[480,564.031,3367,755.218]],["content/720",[5,3.521,6,2.042,23,4.23,32,3.452,124,8.756,171,4.259,271,5.786,355,6.428,480,8.893,572,5.826,630,5.996,758,7.054,765,5.346,772,8.75,1400,9.149,2121,10.024,3367,11.908]],["keywords/720",[]],["title/721",[480,564.031,2253,741.882]],["content/721",[4,2.121,24,5.377,37,2.615,44,4.338,53,8.648,73,7.955,79,8.249,154,5.727,171,5.346,172,8.985,289,10.637,373,4.018,408,6.774,425,5.604,439,10.902,462,6.19,480,8.227,484,8.738,531,8.516,888,8.127,1397,12.595,1400,11.484,1827,8.738,1885,13.056,2253,11.938,2254,11.588,2281,13.627,2492,9.465]],["keywords/721",[]],["title/722",[1327,836.666,4038,1167.014]],["content/722",[]],["keywords/722",[]],["title/723",[4,110.083,185,256.637,401,475.86,1327,566.919,4038,790.76]],["content/723",[2,3.536,3,2.649,4,1.292,5,2.085,6,1.413,9,4.417,10,3.821,12,2.008,18,1.924,25,0.642,33,1.249,37,0.967,44,3.471,45,4.611,46,1.864,51,2.31,60,8.258,63,3.564,67,2.317,69,1.798,70,3.558,92,2.455,107,3.062,110,2.54,113,2.679,114,2.807,134,3.26,151,1.777,152,2.482,155,5.57,181,3.888,182,2.487,185,3.012,186,1.702,191,1.731,192,3.246,202,1.772,222,1.57,224,2.928,228,2.515,240,1.286,246,1.819,255,2.347,264,3.614,273,3.857,278,1.55,281,4.834,284,2.043,291,4.623,293,1.612,297,3.537,298,2.826,301,3.326,310,2.607,314,2.043,322,4.583,330,1.385,334,1.661,341,3.423,364,3.122,379,4.417,382,2.961,385,4.566,387,3.354,393,3.097,396,1.882,405,4.965,438,2.157,440,2.664,480,3.473,483,3.097,514,2.064,536,1.975,537,4.086,543,3.576,545,4.042,553,2.58,563,2.467,569,2.826,582,3.23,611,3.626,622,2.337,636,3.148,640,4.107,650,3.321,652,2.757,660,3.23,675,4.491,676,4.192,693,2.58,701,3.582,704,3.027,705,5.623,709,3.539,718,2.337,732,2.015,737,1.936,762,4.287,785,4.45,856,3.724,858,2.901,886,2.057,887,5.623,893,2.422,904,4.192,914,2.709,922,4.393,924,3.674,936,2.863,942,7.491,943,3.027,963,4.815,985,2.679,1023,4.287,1030,2.826,1042,3.724,1049,5.934,1155,3.894,1171,3.959,1174,3.499,1237,4.192,1268,2.983,1276,5.113,1327,12.926,1329,2.92,1378,3.582,1385,4.827,1394,4.827,1427,3.073,1437,4.656,1563,4.827,1633,3.29,1690,4.107,1931,6.08,2130,3.777,2671,8.176,2741,4.393,2797,5.325,3110,4.827,3561,4.393,3758,3.582,3906,5.325,4038,10.861,4039,8.45,4040,3.833,4041,12.467,4042,5.759,4043,5.04,4044,5.759]],["keywords/723",[]],["title/724",[4,123.338,25,79.157,1327,635.181,4038,885.975]],["content/724",[2,2.661,4,1.211,5,1.569,6,0.703,22,4.408,23,4.262,25,1.224,28,3.142,32,3.103,34,3.357,54,3.158,60,6.267,69,2.268,105,7.948,107,2.871,108,3.79,109,7.556,111,2.742,114,2.112,151,2.242,152,3.665,161,2.295,164,3.67,173,4.319,174,4.319,192,2.443,198,1.941,224,4.445,234,3.361,251,6.498,273,2.563,366,3.5,373,1.874,427,2.671,467,6.951,474,4.19,490,2.887,496,2.936,580,3.342,642,3.254,694,3.611,703,2.711,706,3.71,736,2.721,737,2.443,763,5.967,764,3.972,772,3.014,773,4.605,785,2.216,786,6.28,806,5.629,861,3.379,923,9.614,1183,6.442,1204,3.736,1219,3.5,1300,3.342,1308,4.112,1327,10.493,1354,4.414,1444,3.438,1526,3.972,1639,10.807,1891,5.084,2169,6.358,2203,7.664,2303,3.908,2676,10.227,3092,5.408,3726,4.635,4038,5.408,4039,10.227,4045,11.687,4046,11.687,4047,7.266,4048,7.266,4049,14.66,4050,7.266,4051,4.765,4052,7.266,4053,7.266,4054,10.807,4055,7.266,4056,7.266,4057,6.719,4058,7.266,4059,11.687,4060,7.266,4061,7.266,4062,7.266,4063,6.719,4064,11.687,4065,7.266]],["keywords/724",[]],["title/725",[25,104.266,29,650.349]],["content/725",[]],["keywords/725",[]],["title/726",[28,805.94]],["content/726",[25,1.616,28,8.858,29,8.495,30,11.429,122,8.989,373,5.282,1133,17.163,1177,12.586,3828,16.053]],["keywords/726",[]],["title/727",[122,688.164,477,913.126]],["content/727",[28,8.945,29,10.136,30,9.73,44,5.759,122,9.078,458,9.62,477,12.046,722,12.308]],["keywords/727",[]],["title/728",[112,1221.989]],["content/728",[4,1.882,9,8.308,19,5.443,22,5.926,25,1.208,28,7.854,29,7.532,30,8.543,44,5.056,51,4.345,112,16.117,125,8.935,297,5.151,493,11.294,4066,18.159,4067,16.792,4068,18.159,4069,16.792,4070,22.581]],["keywords/728",[]],["title/729",[112,887.426,144,831.659,1254,914.982]],["content/729",[4,1.677,8,8.57,23,3.988,25,1.396,51,3.873,92,6.9,111,6.107,114,4.705,122,7.103,144,12.899,193,6.484,250,8.636,257,7.249,280,10.323,504,7.175,569,7.942,590,6.9,598,10.943,1178,15.75,1254,10.943,1263,11.542,1377,7.57,1937,13.563,2720,10.191,2923,13.563,4071,16.184,4072,14.965,4073,14.965,4074,14.163]],["keywords/729",[]],["title/730",[190,633.003,323,745.978,1663,752.413]],["content/730",[4,1.849,19,5.35,20,7.994,65,5.85,67,7.181,89,14.067,98,7.646,114,5.188,190,8.349,250,9.524,251,9.923,271,6.331,297,5.063,300,9.839,323,9.839,642,7.994,1124,11.54,1263,12.729,1586,13.99,1938,16.504,3656,14.958,3828,13.99,3837,16.504,4075,17.848,4076,17.848]],["keywords/730",[]],["title/731",[25,79.157,29,493.733,97,417.878,1177,731.52]],["content/731",[18,6.285,23,3.518,25,1.251,44,5.239,97,6.605,111,7.1,122,8.258,196,5.856,441,14.352,571,12.338,1177,14.185,2334,14.748,2667,15.768,3828,14.748,4077,17.398,4078,17.398,4079,18.815,4080,18.815]],["keywords/731",[]],["title/732",[22,489.037]],["content/732",[7,5.927,22,6.579,23,4.082,24,6.554,25,1.667,54,8.252,98,8.133,111,7.164,580,8.734,1077,10.746,1261,12.111]],["keywords/732",[]],["title/733",[556,560.063,742,709.677]],["content/733",[]],["keywords/733",[]],["title/734",[438,506.782,556,483.395,742,612.527]],["content/734",[22,4.996,23,4.259,24,5.563,32,4.029,34,3.69,35,3.165,36,5.758,37,2.706,45,4.572,108,5.758,124,6.036,171,4.209,198,4.305,271,3.916,275,3.676,355,4.35,370,6.951,371,5.758,408,5.333,438,4.134,556,6.8,572,3.943,600,5.937,630,5.925,742,9.475,758,4.774,764,6.034,765,3.618,770,5.451,771,6.458,772,4.579,773,4.35,774,8.81,775,5.285,776,7.671,777,4.919,780,5.845,806,5.317,843,4.996,1276,5.845,1300,5.078,1308,6.248,1417,6.034,1628,6.494,1903,11.996,2121,9.905,4081,14.904,4082,10.207,4083,16.117]],["keywords/734",[]],["title/735",[3758,975.122,4040,1043.588]],["content/735",[]],["keywords/735",[]],["title/736",[4,140.222,19,405.656,67,544.489]],["content/736",[4,1.481,6,1.872,51,3.421,97,5.019,173,8.498,176,5.217,205,3.714,228,6.244,240,4.317,281,5.543,301,3.258,308,6.258,311,10.053,314,5.071,407,6.971,444,13.529,462,5.68,554,6.845,735,6.437,812,13.788,894,5.478,994,7.689,1055,9.609,1219,6.886,1268,11.345,1320,10.398,1339,8.66,1421,12.51,1526,7.815,1713,7.751,1869,10.641,2286,11.558,2552,11.558,3641,13.219,3790,10.004,3835,17.877,4084,17.877,4085,13.219,4086,14.296,4087,14.296]],["keywords/736",[]],["title/737",[437,731.343]],["content/737",[4,1.471,6,1.375,25,0.944,40,5.42,51,3.398,87,4.934,148,8.189,162,5.019,186,4.197,201,5.484,219,5.278,225,5.09,228,8.405,246,7.393,252,7.462,281,9.074,311,6.082,395,5.97,398,5.317,407,6.924,410,9.18,437,5.572,482,7.761,581,6.025,652,6.798,886,5.072,897,9.311,982,7.577,1072,9.936,1089,8.189,1421,12.425,1617,7.407,1726,10.35,1765,9.057,2089,9.311,2130,12.62,3758,15.684,4040,12.809,4088,14.198,4089,14.198]],["keywords/737",[]],["title/738",[45,337.67,111,449.151,3758,740.294,4040,792.272]],["content/738",[22,6.091,23,3.98,25,1.263,45,5.386,111,7.164,438,7.11,3726,12.111,3758,14.435,4040,16.686,4090,18.986,4091,17.557,4092,18.986]],["keywords/738",[]],["title/739",[19,469.995,125,620.401]],["content/739",[19,3.701,22,3.24,23,4.179,24,4.262,30,5.809,32,3.697,34,4.641,35,3.541,37,2.073,124,4.624,162,4.365,164,5.486,173,7.339,186,3.649,193,4.947,224,3.744,275,4.111,281,4.788,301,2.814,311,5.289,355,6.884,373,3.184,421,6.394,600,6.641,735,5.559,765,4.047,776,8.314,777,5.502,780,6.538,886,4.41,912,9.113,1024,8.218,1155,8.348,1256,6.988,1400,6.926,1511,8.988,1526,6.749,1942,9.678,2121,7.588,2535,11.417,3758,10.864,4084,16.153,4093,12.347,4094,12.347,4095,12.347,4096,12.347,4097,12.347,4098,17.469,4099,12.347,4100,12.347,4101,12.347,4102,10.348]],["keywords/739",[]],["title/740",[278,364.276,2239,985.073,3758,841.635]],["content/740",[7,4.23,12,4.725,15,7.893,22,3.557,23,3.955,32,2.868,51,3.243,67,5.453,72,6.45,79,7.176,87,4.709,88,4.647,116,5.596,164,5.854,167,5.89,171,3.539,184,2.939,220,4.79,222,3.695,246,4.281,278,3.648,281,5.255,296,10.087,298,6.65,301,3.089,345,10.337,455,8.925,499,7.122,582,7.601,745,7.408,775,6.488,1058,7.018,1109,7.018,1309,6.375,2062,9.02,2239,15.511,2281,9.02,3758,14.966,4040,12.408,4091,12.531,4103,13.552,4104,13.552,4105,13.552,4106,13.552,4107,13.552,4108,13.552,4109,11.859]],["keywords/740",[]],["title/741",[19,469.995,735,705.949]],["content/741",[19,6.524,23,3.317,2669,14.715,3758,13.535,4110,20.125]],["keywords/741",[]],["title/742",[398,587.16,1697,887.422]],["content/742",[19,6.2,234,9.567,257,9.264,279,12.295,281,8.02,373,5.334,696,12.863,2669,13.985,4110,19.126,4111,20.683]],["keywords/742",[]],["title/743",[2502,926.214]],["content/743",[7,5.432,8,9.214,12,7.666,40,6.642,50,9.592,51,4.164,65,7.206,69,6.863,81,12.41,88,8.264,184,3.773,219,8.172,281,6.747,319,7.754,373,4.487,427,6.396,2183,12.666,2638,13.273,3169,13.64,3758,13.674,4040,14.634]],["keywords/743",[]],["title/744",[25,89.993,45,383.895,4112,1094.088]],["content/744",[]],["keywords/744",[]],["title/745",[4,140.222,45,383.895,4112,1094.088]],["content/745",[22,5.004,23,4.125,24,4.835,25,1.268,32,4.035,33,2.466,34,3.207,35,4.017,36,7.307,37,4.217,52,3.86,198,5.791,224,4.247,355,5.52,370,8.82,371,7.307,408,4.635,425,5.039,454,9.057,455,6.707,490,5.566,1628,14.322,1902,8.608,4028,11.217,4029,7.307,4112,15.416,4113,16.686,4114,14.007,4115,16.686]],["keywords/745",[]],["title/746",[1902,963.564,2079,895.677]],["content/746",[4,1.773,23,4.007,32,2.538,37,2.873,45,3.402,54,8.67,124,10.104,154,4.408,171,5.209,184,2.6,273,2.63,293,3.357,301,3.9,371,6.256,373,3.093,427,4.408,468,5.486,572,4.284,716,4.329,773,4.726,785,6.083,871,9.695,955,6.916,1257,5.486,1552,8.244,1726,6.45,1814,7.551,1902,14.697,2079,6.85,2900,7.982,3601,16.718,4028,7.055,4113,14.973,4115,10.494,4116,11.992,4117,11.992,4118,11.992,4119,11.992,4120,11.992,4121,11.089,4122,11.992,4123,11.992,4124,11.992]],["keywords/746",[]],["title/747",[4,123.338,151,367.227,241,442.435,1902,731.52]],["content/747",[23,3.282,32,3.563,37,2.827,45,4.777,151,5.195,164,7.454,241,6.259,373,4.342,785,5.135,1377,7.876,1902,10.348,4028,9.906,4112,13.613,4113,14.735,4115,14.735,4125,16.838,4126,23.736,4127,23.736,4128,20.772,4129,23.736,4130,16.838,4131,16.838]],["keywords/747",[]],["title/748",[25,89.993,1377,633.003,1617,705.951]],["content/748",[]],["keywords/748",[]],["title/749",[25,89.993,1377,633.003,1617,705.951]],["content/749",[1,1.096,4,1.513,5,0.531,6,0.558,7,0.526,8,0.893,12,0.303,14,0.634,18,0.563,20,1.102,22,0.443,23,0.592,24,1.102,25,0.421,30,0.408,33,0.889,34,0.386,35,2.998,37,1.064,42,0.702,44,1.082,45,1.103,46,1.033,51,0.208,53,0.712,54,0.733,58,0.318,60,3.9,61,0.467,63,0.37,64,0.587,65,1.046,69,0.271,72,0.803,76,0.516,87,0.302,88,1.333,89,1.062,97,0.592,99,0.306,100,0.911,107,0.414,112,0.569,113,0.404,124,0.921,125,10.014,131,0.44,134,1.392,151,1.199,152,2.155,154,1.901,155,0.503,161,0.533,167,0.377,171,2.629,172,0.5,174,0.516,177,0.446,179,0.431,183,1.432,184,1.374,185,0.771,186,0.256,190,0.406,196,0.27,198,0.853,203,0.44,205,0.829,210,0.578,215,0.886,217,1.14,222,0.871,224,2.673,225,1.144,228,0.737,230,0.777,234,1.798,239,0.861,241,0.323,242,0.93,246,0.274,258,0.662,260,0.449,271,2.248,273,1.73,274,1.09,277,0.5,280,0.554,281,0.654,284,0.308,293,0.472,297,0.246,298,0.426,301,0.198,311,0.722,319,0.387,329,0.387,330,0.405,334,1.311,341,2.31,347,1.132,349,0.561,355,0.665,356,0.404,361,0.946,366,0.418,373,1.488,378,0.521,379,0.397,382,0.446,385,0.901,391,0.437,394,0.44,396,2.416,407,0.423,408,0.287,413,1.653,425,0.312,427,1.671,435,2.08,438,0.632,447,1.076,455,2.176,458,0.404,467,0.307,468,0.772,469,0.68,474,0.5,477,0.505,480,1.398,487,0.546,490,0.345,508,0.546,510,0.855,516,1.999,517,1.731,537,0.284,539,0.404,543,0.911,545,0.884,556,2.642,557,2.055,566,0.597,569,1.207,572,2.818,580,3.164,582,0.487,584,0.587,590,2.459,600,0.467,628,2.2,630,2.329,637,0.496,642,0.755,652,0.415,656,2.31,659,2.379,663,1.356,664,0.434,674,0.318,694,0.431,695,0.429,703,1.45,711,0.368,735,0.391,737,4.393,741,2.361,742,0.763,763,0.443,765,4.787,770,2.554,771,0.348,772,1.886,773,3.968,774,2.125,782,0.992,785,0.514,786,0.722,787,0.421,800,1.18,804,0.421,809,0.833,827,0.533,828,0.662,843,1.759,847,0.702,848,0.68,849,0.68,861,2.947,869,1.613,871,0.702,874,0.385,886,1.14,901,1.484,941,2.376,942,2.731,996,0.393,1021,0.467,1024,1.502,1040,2.036,1061,0.54,1089,0.5,1114,1.256,1116,0.838,1158,15.54,1160,0.44,1169,2.899,1174,0.527,1183,0.478,1204,3.537,1219,1.872,1220,0.496,1256,0.491,1276,2.058,1278,0.429,1295,1.322,1299,0.632,1300,1.469,1309,2.139,1327,13.505,1345,0.54,1354,0.527,1356,1.076,1361,0.467,1377,2.964,1400,2.18,1417,5.917,1444,0.411,1479,4.691,1536,0.607,1548,0.554,1552,1.691,1628,0.51,1648,0.607,1650,0.516,1697,0.491,1712,1.18,1726,0.467,1779,0.597,1786,0.68,1792,1.691,1827,0.487,1872,1.717,1891,0.607,1903,0.646,1961,0.516,1986,0.561,1987,1.286,2023,3.09,2062,1.638,2079,1.405,2080,0.802,2114,0.569,2131,0.521,2136,0.607,2165,0.587,2239,0.632,2252,0.527,2253,1.164,2301,0.554,2303,3.978,2308,0.546,2321,1.062,2353,0.619,2376,1.255,2396,2.062,2429,0.619,2496,1.791,2502,0.838,2508,0.702,2568,2.234,2707,0.662,2779,0.533,2781,0.646,2823,1.363,2847,0.727,2884,0.727,2913,0.646,2942,1.322,2953,2.094,3114,0.632,3170,2.435,3367,1.538,3442,0.759,3494,3.765,3586,0.5,3629,0.632,3633,1.476,3646,1.413,3715,0.561,3742,1.363,3747,1.363,3764,1.791,3823,0.68,3830,0.646,3883,0.759,3888,0.759,3977,2.794,3994,0.802,4057,2.275,4121,0.802,4132,0.868,4133,25.286,4134,25.286,4135,0.868,4136,0.868,4137,2.46,4138,0.868,4139,0.868,4140,0.868,4141,0.868,4142,0.868,4143,0.868,4144,0.868,4145,0.868,4146,0.802,4147,0.802,4148,0.868,4149,0.868,4150,0.868,4151,0.868,4152,0.868,4153,0.868,4154,0.802,4155,0.868,4156,0.868,4157,0.868,4158,0.868,4159,0.868,4160,0.868,4161,0.868,4162,1.686,4163,0.868,4164,0.868,4165,1.18,4166,0.802,4167,0.868,4168,0.868,4169,0.868,4170,0.802,4171,0.868,4172,0.868,4173,1.559,4174,0.759,4175,0.868,4176,0.727,4177,0.868,4178,1.476,4179,0.868,4180,0.868,4181,0.868,4182,0.868,4183,0.868,4184,0.868,4185,3.81,4186,0.868,4187,0.868,4188,0.868,4189,0.868,4190,0.868,4191,0.868,4192,0.868,4193,0.868,4194,0.868,4195,0.759,4196,0.868,4197,0.759,4198,4.203,4199,2.153,4200,0.868,4201,0.868,4202,0.868,4203,0.868,4204,0.868,4205,0.868,4206,0.868,4207,0.868,4208,0.868,4209,0.868,4210,1.686,4211,0.868,4212,0.759,4213,0.868,4214,0.759,4215,0.868,4216,0.868,4217,0.868,4218,0.868,4219,0.868,4220,0.868,4221,0.868,4222,4.182,4223,3.193,4224,0.868,4225,0.868,4226,0.868,4227,0.868,4228,0.868,4229,0.868,4230,0.868,4231,0.868,4232,0.868,4233,0.802,4234,0.868,4235,0.868,4236,0.868,4237,0.868,4238,0.868,4239,0.759,4240,0.868,4241,0.868,4242,0.868,4243,0.868,4244,0.868,4245,0.868,4246,0.868,4247,0.868,4248,0.868,4249,0.868,4250,0.868,4251,0.868,4252,0.759,4253,0.802,4254,0.868,4255,0.868,4256,0.868,4257,3.193,4258,1.686,4259,0.868,4260,0.868,4261,0.868,4262,0.868,4263,2.46,4264,0.868,4265,0.868,4266,0.868,4267,3.193,4268,0.868,4269,0.868,4270,0.868,4271,0.868,4272,0.868,4273,1.559,4274,0.868,4275,0.868,4276,0.868,4277,0.868,4278,0.868,4279,1.559,4280,0.868,4281,0.868,4282,0.868,4283,0.868,4284,0.868,4285,0.868,4286,0.868,4287,0.868,4288,0.868,4289,0.868,4290,0.868,4291,0.868,4292,0.868,4293,0.868,4294,0.868,4295,0.868,4296,0.868,4297,0.868,4298,0.868,4299,0.868,4300,0.868,4301,0.868,4302,0.868,4303,0.868,4304,0.802,4305,0.868,4306,0.868,4307,0.868,4308,0.868,4309,1.686,4310,0.868,4311,0.868,4312,0.868,4313,0.868,4314,0.868,4315,0.868,4316,0.868,4317,0.868,4318,0.868,4319,0.868,4320,1.559,4321,0.868,4322,0.868,4323,0.868,4324,0.868,4325,0.868,4326,1.989,4327,0.868,4328,1.686,4329,0.868,4330,0.868,4331,0.868,4332,0.802,4333,0.868,4334,0.802,4335,0.759,4336,0.868,4337,0.868,4338,0.868,4339,3.401,4340,2.46,4341,0.868,4342,0.868,4343,0.868,4344,0.868,4345,0.868,4346,0.868,4347,0.868,4348,0.868,4349,1.203,4350,0.868,4351,0.868,4352,0.868,4353,0.868,4354,0.868,4355,13.344,4356,0.868,4357,0.868,4358,0.868,4359,0.868,4360,0.868,4361,0.868,4362,0.868,4363,0.868,4364,0.868,4365,0.759,4366,0.868,4367,0.868,4368,0.868,4369,0.868,4370,0.868,4371,0.868,4372,0.868,4373,0.868,4374,0.868,4375,0.868,4376,0.868,4377,0.868,4378,0.868,4379,0.868,4380,0.868,4381,0.868,4382,0.868,4383,0.868,4384,0.868,4385,0.868,4386,0.868,4387,0.868,4388,0.868,4389,0.868,4390,0.868,4391,0.868,4392,0.868,4393,0.868,4394,0.868,4395,0.868,4396,0.868,4397,0.868,4398,0.802,4399,0.868,4400,0.868,4401,0.868,4402,0.868,4403,0.868,4404,1.686,4405,0.868,4406,0.868,4407,0.868,4408,0.868,4409,0.868,4410,0.868,4411,0.868,4412,0.868,4413,0.868,4414,0.868,4415,0.868,4416,0.868,4417,0.868,4418,0.868,4419,0.802,4420,0.868,4421,0.702,4422,0.868,4423,0.868,4424,0.868,4425,0.868,4426,2.062,4427,0.868,4428,0.759,4429,0.868,4430,0.727,4431,0.868,4432,0.727,4433,0.868,4434,0.868,4435,0.868,4436,0.759,4437,0.868,4438,0.868,4439,0.868,4440,0.868]],["keywords/749",[]],["title/750",[6,102.858,33,137.374,330,255.425,435,486.049,765,348.193]],["content/750",[]],["keywords/750",[]],["title/751",[227,806.215,293,438.887]],["content/751",[4,0.73,6,1.877,9,6.569,23,4.231,32,2.412,108,9.452,111,2.658,151,3.517,152,3.86,161,7.124,162,7.215,164,2.212,174,4.187,224,3.456,227,5.861,240,1.573,271,7.788,286,4.329,293,1.972,334,2.031,381,2.273,435,5.215,468,5.215,493,4.381,549,3.702,572,2.516,590,3.003,600,3.789,737,2.368,758,6.21,765,5.938,772,2.922,773,6.501,782,4.144,910,4.586,1074,3.851,1116,3.501,1183,9.095,1219,3.393,1300,9.776,1325,4.555,1359,5.373,1392,5.695,1406,5.522,1617,8.607,1765,4.494,2206,5.243,2495,9.041,2496,14.114,2583,5.522,2967,6.514,2984,6.165,3555,6.514,3560,5.128,4441,7.044,4442,7.37,4443,13.276,4444,15.856,4445,14.357,4446,14.357,4447,12.564,4448,15.856,4449,7.044,4450,7.044,4451,7.044,4452,7.044,4453,7.044,4454,7.044,4455,6.165,4456,7.044,4457,7.044]],["keywords/751",[]],["title/752",[4458,1561.679]],["content/752",[4,0.871,6,0.814,14,3.161,18,6.09,23,4.223,32,3.858,34,3.695,44,3.654,54,3.655,62,3.602,70,3.2,149,3.488,152,1.674,154,3.091,161,5.098,164,5.067,167,3.655,183,2.649,198,2.246,201,3.248,224,2.55,278,3.532,292,6.592,301,1.917,373,4.702,402,7.568,425,3.025,435,10.357,455,4.026,464,6.259,484,4.717,513,4.999,600,4.523,641,5.885,648,5.295,694,6.522,734,4.236,758,6.979,765,2.756,775,4.026,782,4.947,806,6.321,886,5.764,888,6.845,897,5.515,917,7.048,958,3.89,993,4.051,1108,5.686,1109,6.796,1257,6.004,1300,3.868,1377,7.548,1444,3.979,1526,4.597,1552,5.781,1617,4.387,1709,7.776,1710,6.414,1724,5.437,2098,5.295,2252,5.109,2444,5.109,2495,5.295,2496,9.552,3781,5.364,4032,7.359,4198,7.776,4443,7.776,4444,7.359,4448,7.359,4458,7.048,4459,8.409,4460,8.409,4461,8.409,4462,8.409,4463,7.359,4464,8.409,4465,8.409,4466,8.409,4467,8.409,4468,7.359,4469,8.409,4470,13.122,4471,8.409,4472,8.409]],["keywords/752",[]],["title/753",[4463,1630.706]],["content/753",[4,1.69,14,6.131,18,7.81,23,4.122,32,3.452,33,2.109,70,3.978,111,6.155,149,6.766,161,5.153,164,6.624,183,5.137,224,6.396,348,9.232,402,9.407,435,10.697,734,8.215,4473,16.311,4474,16.311,4475,16.311,4476,16.311,4477,16.311,4478,16.311,4479,16.311]],["keywords/753",[]],["title/754",[435,717.317,3367,755.218]],["content/754",[5,2.681,6,1.698,22,3.26,23,4.16,25,0.826,32,2.629,34,2.844,108,6.479,152,2.473,161,6.425,162,6.201,167,8.839,171,3.243,224,3.766,246,3.924,271,4.406,330,4.218,368,7.821,373,3.203,435,8.026,451,7.633,468,5.683,545,3.44,569,6.095,572,4.437,631,7.234,736,4.651,737,4.176,740,5.777,772,5.152,809,6.134,1169,5.683,1220,7.095,1300,5.714,1308,7.03,2496,9.041,3367,8.45,3368,15.351,3764,9.041,3963,9.474,4444,17.798,4448,17.798,4480,9.245,4481,17.542,4482,14.702,4483,12.421,4484,12.421]],["keywords/754",[]],["title/755",[51,284.834,281,461.561,379,544.573,435,544.573]],["content/755",[3,8.814,4,1.985,25,1.274,51,5.585,116,7.913,155,5.711,219,7.122,224,5.81,246,6.053,281,9.051,373,4.942,435,8.766,734,9.651,1256,10.845,2130,12.565,4463,16.768]],["keywords/755",[]],["title/756",[184,340.004,435,717.317]],["content/756",[4,1.69,18,5.448,25,1.085,37,2.738,45,4.627,88,5.593,152,3.247,166,8.843,184,5.07,205,4.238,220,5.766,240,3.642,271,5.786,373,6.03,394,8.271,435,11.713,493,10.144,1024,9.924,1444,7.718,1827,9.149,2165,11.028,2502,8.107,2720,10.271,3684,12.675,4043,14.274,4339,14.274,4485,13.187]],["keywords/756",[]],["title/757",[33,153.915,373,306.972,427,437.561,435,544.573]],["content/757",[19,5.35,33,3.153,53,9.436,69,5.571,177,9.177,184,3.87,198,4.768,227,9.177,271,6.331,373,4.603,427,9.394,435,10.22,545,4.944,765,7.322,886,6.375,2253,10.57,2492,10.843]],["keywords/757",[]],["title/758",[37,263.223,435,717.317]],["content/758",[]],["keywords/758",[]],["title/759",[581,790.783]],["content/759",[4,0.916,6,1.612,12,3.081,14,3.322,22,4.37,23,4.066,24,3.05,25,0.907,32,1.87,33,2.976,34,3.122,35,4.775,37,2.796,52,3.758,54,3.841,65,2.896,68,4.645,70,4.061,124,3.31,154,3.249,162,7.151,164,2.775,198,2.361,224,6.482,275,4.541,301,2.014,334,2.548,335,11.876,355,5.374,396,2.887,408,5.51,435,10.194,458,4.111,483,4.753,513,8.107,590,5.815,592,5.369,600,4.753,674,3.237,727,6.184,741,5.369,776,6.491,843,4,891,4.872,958,4.088,1110,5.049,1169,4.043,1256,5.002,1257,7.619,1354,5.369,1558,5.431,1765,10.622,2036,6.927,2136,6.184,2252,8.285,3114,6.433,3880,7.406,4028,8.023,4029,4.61,4430,7.406,4486,17.312,4487,8.172,4488,8.172,4489,8.838,4490,8.172,4491,8.172,4492,8.172,4493,8.172,4494,8.172,4495,8.172,4496,8.172,4497,8.838,4498,8.838]],["keywords/759",[]],["title/760",[25,70.65,271,376.852,435,486.049,2172,718.317,2779,652.904]],["content/760",[4,1.175,12,3.954,22,5.073,23,4.271,25,1.41,29,4.703,33,2.741,34,2.596,35,4.713,37,3.245,65,3.716,162,4.008,164,3.561,271,5.83,275,3.776,293,3.174,334,3.269,355,4.468,373,2.924,408,3.752,435,9.699,513,9.77,592,6.889,600,6.099,776,7.822,958,5.245,1257,5.188,1354,6.889,1765,14.355,2172,7.667,2252,6.889,2779,6.968,3828,8.888,4077,10.485,4430,9.503,4486,15.198,4487,10.485,4488,10.485,4490,10.485,4491,10.485,4492,10.485,4493,10.485,4494,10.485,4495,10.485,4499,11.339,4500,11.339,4501,11.339]],["keywords/760",[]],["title/761",[23,146.203,25,63.794,271,340.282,763,489.824,993,462.071,3375,638.508]],["content/761",[4,1.825,18,4.174,22,5.815,23,4.04,25,1.72,33,1.616,69,3.901,72,5.947,151,3.855,155,3.724,271,7.238,368,7.868,373,3.222,435,5.717,487,7.868,745,6.83,763,12.988,827,7.679,993,8.486,1077,7.072,1220,7.138,1377,5.845,1694,8.744,1796,7.591,1970,8.911,3375,8.317,3859,9.3,4502,12.495,4503,24.909,4504,12.495,4505,12.495,4506,12.495,4507,12.495,4508,12.495,4509,17.616,4510,12.495,4511,12.495]],["keywords/761",[]],["title/762",[4512,1561.679]],["content/762",[]],["keywords/762",[]],["title/763",[188,1045.231]],["content/763",[25,1.447,297,6.174,517,11.8,879,8.473,4513,21.763]],["keywords/763",[]],["title/764",[517,850.067,2023,764.557]],["content/764",[4,1.818,6,1.699,9,8.028,33,2.269,65,5.751,152,5.057,171,4.582,249,9.932,330,5.314,373,5.7,375,9.154,483,9.438,517,9.514,557,6.972,659,8.072,737,7.431,1278,8.666,2023,11.799,4514,17.547,4515,10.913]],["keywords/764",[]],["title/765",[4,162.462,67,630.847]],["content/765",[4,1.898,121,11.007,122,8.04,125,7.249,167,7.961,193,7.34,241,6.809,322,6.734,499,9.627,668,9.487,954,9.627,1127,11.535,1157,10.889,1434,13.973,1558,11.258,1986,11.844,2031,13.064,4512,15.352,4516,18.319,4517,18.319,4518,18.319,4519,18.319,4520,18.319]],["keywords/765",[]],["title/766",[581,790.783]],["content/766",[6,2.198,14,6.886,83,13.335,107,5.577,151,5.652,173,10.889,174,14.667,330,4.404,427,8.346,510,9.289,517,13.377,1114,9.354,1276,9.7,1278,9.047,2953,12.013,4521,16.939]],["keywords/766",[]],["title/767",[787,903.071]],["content/767",[6,1.104,23,4.132,30,5.364,124,6.179,152,3.285,161,5.213,162,7.513,163,13.34,164,5.181,167,7.171,171,2.977,458,5.303,483,6.132,517,6.181,572,4.073,734,5.742,775,7.9,785,3.477,787,7.996,843,5.16,975,6.132,1092,8.696,1175,7.179,1257,10.318,1276,6.037,1278,9.576,1724,10.668,1796,6.927,2023,5.56,2252,12.912,2783,6.927,3883,9.977,4521,10.543,4522,11.401,4523,18.599,4524,11.401,4525,11.401,4526,11.401,4527,11.401,4528,11.401,4529,9.977,4530,21.253,4531,11.401,4532,14.439,4533,9.977,4534,10.543,4535,19.391]],["keywords/767",[]],["title/768",[30,876.641]],["content/768",[23,4.135,30,10.024,124,6.204,152,3.298,161,5.233,162,6.876,163,13.393,164,5.202,167,7.2,458,5.332,483,6.166,517,6.215,734,5.774,775,7.932,785,3.496,843,5.189,1092,8.744,1114,5.854,1175,7.219,1257,10.34,1276,6.07,1278,11.994,1796,6.965,2252,12.945,2783,6.965,4273,10.601,4523,18.646,4529,10.032,4532,14.497,4533,10.032,4536,11.464,4537,11.464,4538,11.464,4539,11.464,4540,11.464,4541,11.464,4542,21.307,4543,11.464,4544,11.464,4545,11.464,4546,11.464,4547,19.451]],["keywords/768",[]],["title/769",[468,852.533]],["content/769",[23,4.112,124,6.408,152,3.406,161,5.405,162,7.052,163,13.833,164,5.373,167,7.436,468,9.126,483,6.45,517,6.502,734,6.04,775,8.192,785,3.657,843,5.428,1092,9.147,1175,7.551,1257,10.523,1276,6.35,1278,12.156,1796,7.285,2252,13.216,2783,7.285,3888,10.494,4523,19.036,4529,10.494,4532,14.973,4533,10.494,4548,11.992,4549,11.992,4550,11.992,4551,11.992,4552,11.992,4553,11.992,4554,21.752,4555,11.992,4556,19.948]],["keywords/769",[]],["title/770",[4239,1630.706]],["content/770",[4,1.967,23,3.82,32,2.945,34,3.186,68,7.312,76,8.271,111,8.757,152,4.301,154,5.115,164,4.369,186,4.113,198,3.717,224,5.755,241,5.172,286,8.551,373,3.588,427,5.115,458,6.472,517,12.582,561,6.546,639,6.622,717,6.662,806,6.702,894,5.332,1089,8.024,1114,7.105,1170,7.105,1204,7.155,1278,10.669,2079,7.949,2842,11.661,2927,11.952,4239,18.905,4557,13.914,4558,13.914,4559,13.914,4560,12.866,4561,12.866,4562,13.914]],["keywords/770",[]],["title/771",[33,202.738,504,695.115]],["content/771",[]],["keywords/771",[]],["title/772",[10,620.401,33,202.738]],["content/772",[1,4.601,2,2.286,4,1.368,5,2.851,6,1.486,10,2.47,14,2.347,22,5.516,23,4.04,24,6.69,25,1.348,32,3.597,33,1.984,34,3.891,35,4.4,37,3.403,40,2.383,46,3.342,53,4.362,60,2.329,62,2.674,63,1.369,65,2.046,69,1.949,70,1.522,73,3.187,84,5.51,98,4.423,100,6.781,103,2.782,111,4.983,149,2.589,154,2.295,156,3.306,162,2.207,171,3.448,179,3.103,191,3.969,193,2.501,202,1.92,203,3.165,217,2.23,222,1.702,224,1.893,228,2.726,234,2.887,240,1.394,273,2.264,293,1.747,295,6.346,301,1.423,314,3.663,334,1.8,355,2.46,364,3.384,368,3.931,373,1.61,395,2.625,408,5.077,413,3.233,414,2.44,426,3.882,440,2.887,467,2.207,496,2.522,504,2.768,510,3.165,527,3.21,534,4.452,537,2.046,543,2.312,555,3.882,556,2.23,557,2.48,577,3.882,607,3.384,673,3.256,674,2.286,689,3.412,695,3.083,765,2.046,777,4.601,780,3.306,804,3.025,805,4.094,890,4.452,1007,5.427,1193,4.761,1205,4.893,1248,9.036,1329,5.236,1613,3.471,1893,7.099,2010,5.047,2098,3.931,2112,12.709,2121,3.836,2488,4.544,2927,3.931,3563,4.291,3813,6.273,3814,4.094,3951,4.368,3992,11.704,4029,3.256,4085,5.772,4563,11.704,4564,9.036,4565,5.231,4566,5.772,4567,5.463,4568,5.463,4569,6.242,4570,6.242,4571,5.231,4572,5.463,4573,10.325,4574,5.772,4575,10.325,4576,6.242,4577,5.772,4578,6.242]],["keywords/772",[]],["title/773",[2,435.966,25,79.157,33,153.915,504,527.718]],["content/773",[2,8.563,4,2.185,5,2.422,6,1.86,7,3.502,10,4.438,11,7.356,12,5.686,14,4.217,15,6.533,20,5.024,22,4.279,23,3.677,24,5.629,25,1.278,32,2.374,34,2.568,35,4.676,37,1.883,54,4.875,81,8,94,6.976,156,5.94,186,3.315,191,3.372,230,3.543,246,3.543,271,3.979,330,2.697,355,4.42,357,8,404,8.556,405,5.768,408,3.711,425,4.035,459,8.556,467,3.965,496,4.532,504,9.351,673,8.507,674,4.108,703,7.168,777,4.998,827,6.893,894,4.298,944,9.147,958,5.188,1030,5.504,1143,7.252,1272,8.165,1466,11.87,1612,12.137,1613,6.237,1648,7.849,1765,10.402,2502,5.575,2821,10.372,2979,7.584,3990,8.349,4579,11.217,4580,11.217,4581,11.217,4582,11.217]],["keywords/773",[]],["title/774",[2,389.113,10,420.379,37,178.358,315,346.025,875,562.569]],["content/774",[2,8.822,4,1.985,6,1.854,10,8.847,11,7.316,12,3.89,14,4.194,18,3.727,19,3.344,22,5.027,23,3.897,24,5.607,25,1.08,32,2.361,33,2.72,34,2.554,35,3.199,37,3.754,63,3.562,107,2.74,149,4.628,204,5.279,219,4.147,230,6.646,321,9.982,334,3.217,355,4.397,400,5.023,408,3.691,504,4.946,555,6.939,568,6.563,577,6.939,703,4.162,732,3.903,777,4.972,782,6.563,879,4.344,958,5.161,1169,5.104,1595,6.939,1613,6.203,1614,8.294,2112,10.652,2172,7.543,4029,5.82,4564,14.214,4565,9.35,4566,10.317,4567,9.763,4568,9.763,4583,12.39,4584,11.157]],["keywords/774",[]],["title/775",[25,70.65,33,137.374,219,394.886,432,558.336,4585,858.926]],["content/775",[4,1.857,5,2.764,6,1.239,12,4.464,14,4.813,18,4.276,25,0.851,33,3.159,37,2.149,46,4.144,49,6.023,62,7.676,65,4.196,148,7.383,154,4.706,161,4.044,171,3.343,184,4.483,185,3.093,204,6.058,230,4.044,240,2.859,246,4.044,249,7.246,272,5.458,273,2.807,289,5.955,293,3.584,314,4.541,373,4.621,401,5.734,405,9.214,408,5.929,413,9.28,427,6.587,432,9.418,503,6.779,504,7.945,543,4.741,555,7.962,652,9.899,716,6.469,735,5.764,785,3.904,901,4.887,1007,6.728,1086,8.277,1317,8.959,2516,13.338,3979,10.729,4585,14.488]],["keywords/775",[]],["title/776",[191,406.809,879,526.845,2132,1251.356]],["content/776",[4,2.175,7,5.052,14,6.084,25,1.549,33,3.187,81,11.542,182,3.229,188,9.078,198,4.323,234,7.486,260,10.87,301,3.688,314,5.741,373,4.174,398,7.86,408,5.355,503,8.57,504,7.175,537,5.304,857,8.322,883,8.774,886,5.781,993,7.795,1147,8.921,1444,7.658,1571,10.943,3186,13.084,4586,16.184,4587,16.184,4588,16.184]],["keywords/776",[]],["title/777",[23,161.915,107,384.917,181,283.072,185,256.637]],["content/777",[]],["keywords/777",[]],["title/778",[62,455.105,149,440.672,385,389.113,713,686.894,2587,982.391]],["content/778",[6,1.384,9,6.54,18,4.775,30,6.725,34,3.273,37,2.4,40,5.457,70,5.342,107,3.511,149,9.087,162,5.053,181,3.809,182,2.852,185,3.453,192,4.806,200,5.334,220,6.834,223,7.351,240,4.317,264,4.144,301,3.258,330,3.437,334,4.122,387,8.326,455,6.845,496,5.777,520,6.471,544,5.334,652,6.845,675,6.649,711,6.067,713,12.5,714,9.515,716,5.161,717,9.257,785,4.36,809,7.06,1006,8.685,1204,7.351,1554,10.004,1646,9.515,1926,10.004,2356,11.558,2424,11.558,2444,8.685,3158,11.558,4589,14.296]],["keywords/778",[]],["title/779",[46,385.295,281,461.561,379,544.573,581,505.129]],["content/779",[5,3.266,6,1.944,18,7.529,25,1.006,33,1.956,52,4.168,53,6.389,69,4.722,70,3.689,88,5.186,107,4.932,181,5.35,182,3.018,192,5.085,201,5.842,215,7.95,219,5.622,228,6.606,246,6.343,278,4.072,281,9.96,287,7.518,311,6.48,330,3.637,333,13.987,379,6.92,432,7.95,444,14.05,581,6.419,586,11.259,754,11.857,1762,13.987,2130,9.919,2645,13.237,4590,15.126]],["keywords/779",[]],["title/780",[22,312.383,222,324.571,675,553.65,719,818.312]],["content/780",[6,1.263,18,4.357,61,7.015,103,5.812,107,3.204,149,5.41,171,3.406,181,3.475,182,3.622,185,3.151,191,3.921,205,3.389,220,4.611,222,5.694,228,5.696,240,4.053,254,7.753,272,5.561,273,2.86,301,2.973,373,3.364,401,5.842,421,6.755,442,9.494,465,9.708,490,5.182,512,5.339,514,4.675,579,8.433,590,5.561,673,6.804,675,10.502,703,6.773,708,8.213,709,8.016,718,5.293,719,15.522,772,5.41,786,5.587,889,8.819,944,7.316,1134,7.382,1339,8.131,1427,6.96,1444,6.171,2146,9.494,2178,9.127,2289,9.708,2431,13.847,2546,11.414,2548,12.061,3443,12.061,3785,10.931,4591,12.061,4592,13.043,4593,13.043]],["keywords/780",[]],["title/781",[180,622.502,389,695.85,607,733.699]],["content/781",[6,2.128,9,5.616,25,0.816,33,1.587,44,3.418,46,3.973,70,4.242,97,4.309,107,4.273,149,5.091,152,2.444,180,8.002,181,4.635,182,2.449,184,2.662,186,3.628,192,4.127,198,3.279,205,5.25,220,7.77,228,5.361,240,3.884,272,5.233,273,2.692,276,7.457,282,9.362,293,3.436,301,2.797,311,7.452,330,2.951,347,5.646,356,5.709,360,7.012,421,6.357,444,12.173,487,7.729,496,4.96,538,6.101,543,4.545,544,6.49,545,6.427,736,4.597,737,4.127,812,12.406,1055,8.647,1058,6.357,1111,8.438,1170,6.267,1204,6.312,1268,6.357,1765,7.83,1869,9.136,1876,11.35,2954,10.287,3947,16.086,3951,8.589]],["keywords/781",[]],["title/782",[6,92.877,70,233.946,694,476.813,717,459.299,958,443.717,1007,504.155]],["content/782",[6,1.972,69,4.827,70,5.906,107,3.798,149,6.414,181,4.12,182,4.546,191,6.124,201,5.972,205,4.018,220,7.202,222,5.555,223,7.951,240,4.549,293,4.328,314,5.485,334,4.458,381,4.99,385,5.664,490,6.144,543,5.726,579,9.998,673,8.067,694,10.126,711,6.562,716,5.583,717,10.909,994,8.317,1007,10.707,1127,9.737]],["keywords/782",[]],["title/783",[8,630.307,256,559.973,264,345.078,1134,673.714]],["content/783",[4,2.186,8,7.039,18,4.44,22,4.827,63,2.915,70,4.486,107,4.518,149,9.442,181,3.542,182,4.208,186,3.929,200,4.959,205,4.779,222,3.625,249,7.524,264,5.333,272,5.667,288,9.084,301,5.446,311,7.88,330,3.196,401,5.954,444,9.302,465,9.894,490,5.281,717,6.364,736,4.978,786,7.88,875,7.039,894,5.094,1058,9.526,1109,6.884,1127,11.583,1158,8.169,1166,8.717,1332,7.149,1427,7.093,1726,7.149,1931,8.37,2141,8.479,2489,9.676,2532,11.14,2724,9.894,3659,11.14,3661,11.14]],["keywords/783",[]],["title/784",[44,436.57,307,904.237]],["content/784",[5,2.681,6,1.969,18,5.86,33,1.606,40,7.763,46,5.678,61,6.68,65,4.071,87,4.316,103,5.535,107,3.051,125,4.915,149,5.152,180,5.714,181,3.309,182,3.5,184,4.41,186,5.185,198,3.318,200,4.634,205,5.742,206,6.244,220,4.391,222,4.783,223,6.387,240,2.773,246,3.924,249,7.03,264,5.086,273,2.724,307,7.163,322,4.566,330,2.986,357,8.858,371,6.479,373,3.203,425,4.468,440,8.114,466,6.479,490,4.935,520,5.622,534,8.858,589,15.464,590,5.296,694,6.174,711,5.271,716,4.484,717,5.947,729,10.869,894,4.76,912,6.479,1309,5.843,1339,5.563,1649,9.736,2120,11.485,3089,11.485,3919,9.041]],["keywords/784",[]],["title/785",[44,436.57,1017,1167.014]],["content/785",[4,1.343,5,2.798,6,2.18,18,6.952,33,2.337,53,5.475,70,4.408,88,6.198,99,4.566,107,3.184,110,5.718,125,5.129,144,11.108,149,5.376,176,4.73,181,3.454,182,2.586,185,3.131,186,5.343,201,5.006,220,4.582,230,5.71,240,2.894,252,7.009,254,7.705,264,5.24,281,5.026,301,2.954,322,4.765,330,3.116,371,6.762,398,4.854,413,9.361,451,7.966,455,6.206,482,9.881,520,5.867,544,7.765,717,6.206,736,4.854,889,8.764,943,6.812,1017,9.648,1065,7.625,1112,7.705,1204,6.665,1251,9.435,1628,7.625,1970,9.244,2616,11.343,3158,10.479,4594,12.962,4595,10.863]],["keywords/785",[]],["title/786",[191,471.331,879,610.406]],["content/786",[5,4.062,6,1.822,25,1.535,107,5.67,181,5.013,185,5.576,191,5.656,271,6.674,273,4.126,331,12.165,703,7.02,857,9.675,879,7.325,1761,17.398,4596,18.815,4597,18.815,4598,18.815]],["keywords/786",[]],["title/787",[6,115.243,572,425.189,1021,640.194,1614,607.783]],["content/787",[]],["keywords/787",[]],["title/788",[1040,1188.656]],["content/788",[154,7.918,224,7.587,590,9.183,1038,13.395,1040,13.739]],["keywords/788",[]],["title/789",[111,510.637,224,410.309,1040,863.219]],["content/789",[4,1.413,23,4.235,32,3.963,34,4.287,35,3.912,111,5.147,151,7.441,161,5.915,172,7.867,198,3.644,224,5.677,572,6.689,580,6.275,765,6.137,768,13.778,1040,14.68,1116,6.78,1437,11.028,1614,6.965,2121,11.508,2495,11.791,4599,11.432,4600,16.386,4601,13.641,4602,12.613,4603,11.937,4604,13.641]],["keywords/789",[]],["title/790",[427,576.359,901,598.491]],["content/790",[154,7.757,224,7.497,427,7.757,590,8.997,901,8.055,1038,13.124,1278,10.421]],["keywords/790",[]],["title/791",[111,449.151,224,360.904,427,437.561,901,454.363]],["content/791",[4,1.377,23,4.316,32,4.817,34,5.471,35,3.812,151,5.675,161,5.811,193,5.326,765,6.029,768,13.003,806,8.86,901,7.021,1437,10.747,2121,11.304,2495,11.583,4599,11.14,4600,16.097,4602,12.292,4603,11.632,4605,17.009,4606,13.292,4607,13.292,4608,18.394,4609,13.292]],["keywords/791",[]],["title/792",[901,598.491,3367,755.218]],["content/792",[6,1.444,23,4.17,32,4.735,34,5.123,151,4.6,154,5.481,161,4.71,224,6.03,590,6.357,630,5.481,765,4.887,768,11.361,771,5.974,806,7.182,901,5.691,1038,9.273,1278,7.363,2121,9.163,2495,9.389,3367,10.778,3369,13.787,3372,12.495,4480,11.098,4599,12.495,4600,17.403,4605,13.787,4610,13.048,4611,13.787,4612,14.91,4613,14.91]],["keywords/792",[]],["title/793",[25,104.266,152,312.153]],["content/793",[2,4.404,23,3.754,25,0.8,29,3.123,33,0.973,37,2.52,45,3.411,46,2.437,51,3.592,52,4.136,58,2.757,63,3.292,84,4.017,94,4.682,99,4.236,100,4.453,131,3.818,142,7.074,152,2.394,184,5.191,185,1.819,198,2.011,202,2.316,208,4.115,225,2.699,239,3.844,240,1.681,241,2.798,242,4.15,255,3.068,260,6.227,273,2.637,275,4.999,277,4.342,284,2.67,294,6.086,300,4.15,315,2.452,355,2.967,362,5.09,370,4.74,391,3.792,406,6.588,408,6.61,414,2.943,435,5.501,480,2.708,501,3.871,504,5.331,506,6.519,508,4.74,514,4.31,556,2.689,561,3.542,563,3.225,628,4.261,652,3.604,670,9.616,672,4.682,742,3.407,765,3.941,843,3.407,874,5.331,878,7.885,883,4.082,886,2.689,1007,3.956,1054,5.268,1055,3.742,1074,4.115,1077,4.261,1102,5.603,1103,5.268,1133,6.309,1276,3.986,1278,3.718,1327,4.017,1329,3.818,1360,4.682,1361,4.049,1377,3.521,1501,4.301,1598,5.48,1614,3.844,1766,5.011,1792,5.175,1814,4.74,1843,4.802,1872,4.049,1875,6.588,2018,5.901,2023,3.671,2111,5.011,2112,4.937,2253,3.562,2376,5.603,2377,5.48,2492,4.574,2900,5.011,3367,3.626,3656,6.309,3758,4.682,4038,5.603,4040,5.011,4112,6.086,4165,5.268,4279,6.961,4512,6.309,4614,6.961,4615,6.588,4616,5.48,4617,9.706,4618,5.369,4619,5.268,4620,5.742,4621,7.528,4622,7.528,4623,7.528,4624,7.528,4625,7.528,4626,7.528,4627,7.528,4628,7.528,4629,7.528,4630,7.528,4631,7.528]],["keywords/793",[]],["title/794",[25,70.65,33,137.374,63,232.977,414,415.272,1875,929.703]],["content/794",[]],["keywords/794",[]],["title/795",[4,140.222,785,412.676,792,780.453]],["content/795",[4,1.818,23,3.99,34,5.06,69,5.478,152,4.4,186,5.187,230,5.543,373,4.525,381,5.662,487,11.049,696,10.913,736,6.571,785,7.379,792,10.12,1089,10.12,2381,12.773,4632,16.226,4633,17.547,4634,17.547,4635,17.547]],["keywords/795",[]],["title/796",[60,277.201,62,318.282,273,162.935,519,399.61,569,364.591,685,540.846,785,226.576,1147,409.573,4636,650.198]],["content/796",[4,0.753,19,2.178,23,4.318,25,0.483,32,3.103,33,0.939,60,7.336,62,7.196,63,1.593,65,2.381,70,3.575,111,6.338,152,1.447,155,2.166,164,4.604,171,1.897,177,3.736,193,2.911,272,3.098,273,4.714,301,4.195,322,4.296,373,1.874,514,2.604,515,3.588,519,3.908,543,2.691,569,7.194,600,7.885,630,4.296,685,15.649,703,5.47,737,6.611,785,6.556,804,7.105,861,3.379,865,4.765,886,2.595,890,5.182,891,6.442,917,14.077,942,4.365,944,9.422,1029,5.289,1075,5.408,1152,7.779,1444,6.937,1571,4.913,2568,10.259,2720,4.575,2927,4.575,3770,8.699,3778,7.022,3951,5.084,4637,7.266,4638,13.557,4639,6.719,4640,11.687,4641,7.266,4642,7.266,4643,5.695,4644,11.687,4645,7.266,4646,6.719]],["keywords/796",[]],["title/797",[60,504.882,92,576.973,171,353.369]],["content/797",[4,1.639,14,5.945,22,4.151,23,4.179,32,3.347,33,2.045,60,9.458,63,3.468,85,7.618,273,4.534,329,7.048,364,8.575,484,8.871,804,7.665,974,10.088,1086,10.226,1571,10.693,1983,15.051,2079,11.812,2303,8.506,3097,13.84,4636,13.84,4647,15.815,4648,15.815,4649,15.815]],["keywords/797",[]],["title/798",[60,396.364,65,348.193,737,357.175,1697,601.311,2321,668.979]],["content/798",[4,1.59,6,1.773,19,3.096,20,4.626,22,4.027,23,4.008,25,0.687,32,2.185,45,2.93,60,8.769,62,4.424,63,4.016,65,3.385,70,2.519,85,4.974,88,3.541,103,4.602,114,3.002,122,4.533,134,5.845,152,2.056,164,3.243,177,5.31,186,3.052,187,6.347,196,3.214,203,5.237,224,3.131,273,4.445,373,3.958,381,3.333,398,3.867,425,3.715,426,9.544,484,8.608,512,4.227,514,5.501,537,3.385,581,4.383,642,4.626,737,6.156,800,7.227,804,5.005,975,12.986,1540,6.423,1547,6.874,1610,6.423,1641,7.517,1667,8.655,1697,5.845,1724,6.677,1981,6.874,2228,7.877,2321,9.663,2502,5.133,3174,6.983,4650,9.037,4651,21.734,4652,10.738,4653,9.55,4654,9.55,4655,9.037]],["keywords/798",[]],["title/799",[149,440.672,186,314.016,273,232.977,718,431.12,4212,929.703]],["content/799",[4,1.723,14,4.333,19,3.455,23,4.114,25,1.106,32,4.129,34,3.808,44,4.631,88,3.952,155,3.436,164,5.223,166,9.017,171,3.01,186,4.916,191,5,222,3.143,273,5.175,301,2.627,373,2.973,381,3.72,382,5.927,453,10.088,487,7.259,490,4.58,504,5.111,538,5.73,543,8.388,589,8.066,600,6.2,696,7.169,711,4.892,805,7.559,974,10.609,981,6.585,982,6.151,1155,7.794,1174,10.105,1204,5.927,1268,5.97,1332,6.2,3515,9.661,3597,14.555,3680,8.793,4212,10.088,4656,16.632,4657,11.527,4658,11.527,4659,16.632,4660,16.632,4661,11.527,4662,9.661]],["keywords/799",[]],["title/800",[5,229.359,6,102.858,152,211.512,1160,538.737,3367,511.73]],["content/800",[2,4.022,4,1.138,6,1.554,7,5.012,15,6.395,23,3.82,25,1.262,32,3.398,33,1.42,34,3.676,49,5.166,62,4.704,63,2.408,69,3.428,82,7.684,83,7.993,86,4.437,149,4.555,152,4.772,154,4.036,186,3.246,187,6.748,215,5.771,217,5.735,228,7.012,249,6.215,264,3.183,273,3.521,278,2.956,279,6.527,301,3.659,322,5.902,364,5.953,378,6.597,381,5.181,382,5.646,484,9.006,496,4.437,507,6.829,520,4.97,561,5.166,577,6.829,630,4.036,650,9.259,673,5.728,695,5.423,716,3.964,737,3.692,771,4.399,918,6.215,1030,5.388,1388,7.004,1749,8.376,1983,7.993,2049,13.5,2239,7.993,2459,8.877,2876,9.609,3367,9.142,3876,8.877,4663,8.877,4664,10.154,4665,10.98,4666,10.98,4667,13.455]],["keywords/800",[]],["title/801",[12,593.444,273,261.029,2253,563.222]],["content/801",[4,1.696,6,1.866,7,3.52,9,5.16,12,6.72,25,1.089,33,2.492,37,1.893,45,3.199,51,2.699,60,4.208,63,3.59,70,4.7,136,6.504,182,3.266,189,5.758,200,4.208,222,3.075,256,5.305,265,4.057,273,3.59,278,3.036,279,6.704,289,8.964,322,4.146,379,5.16,385,4.131,391,5.68,396,3.685,414,4.408,439,7.892,499,5.927,512,4.616,514,4.043,525,5.927,540,8.394,544,6.108,545,3.124,607,6.114,717,5.4,732,3.946,785,5.877,893,4.742,909,8.84,910,6.587,914,5.305,918,6.383,920,5.972,937,4.925,943,5.927,950,7.506,983,6.704,984,6.931,1008,10.428,1028,11.114,1049,6.931,1141,7.396,1157,6.704,1220,6.442,1315,7.101,1388,10.443,2126,7.506,2252,6.852,2253,5.336,2254,12.71,2492,6.852,3240,10.428,3719,10.428]],["keywords/801",[]],["title/802",[4,123.338,45,337.67,517,645.355,955,686.479]],["content/802",[4,1.188,6,1.11,12,5.776,25,0.762,33,2.515,45,5.518,62,4.911,63,3.633,76,6.814,103,5.108,125,4.536,136,6.611,149,4.755,151,3.537,182,2.287,189,5.854,222,4.517,241,4.261,278,3.086,279,9.847,293,3.209,301,4.433,322,4.214,391,5.774,393,6.166,395,6.965,400,5.162,414,4.481,424,7.412,481,6.319,501,5.895,515,8.181,517,10.546,537,3.757,545,3.175,551,5.217,627,8.986,673,5.98,716,7.022,718,4.652,732,4.011,785,6.498,787,5.556,809,5.661,866,6.744,899,8.345,907,7.045,910,4.613,921,5.937,936,5.698,943,6.025,947,7.881,963,6.398,984,7.045,986,7.881,993,5.522,1010,9.268,1045,8.744,1049,10.181,1066,6.117,1190,8.986,1207,6.611,1238,8.022,1384,11.389,1547,7.63,4668,11.464,4669,11.464,4670,11.464,4671,11.464]],["keywords/802",[]],["title/803",[45,444.782,198,418.827]],["content/803",[]],["keywords/803",[]],["title/804",[25,123.921]],["content/804",[25,1.635,45,6.973,124,7.823,228,9.124,557,8.3,772,8.665,826,11.516]],["keywords/804",[]],["title/805",[534,1328.96]],["content/805",[14,6.826,151,6.967,174,10.794,188,10.186,193,7.276,534,18.338,539,8.446,572,6.487,580,8.353,622,7.369,716,8.152,772,7.532,861,8.446,1074,9.926,1114,9.272,1604,11.741,1827,10.186,2356,14.681,3767,13.218]],["keywords/805",[]],["title/806",[2058,1188.656]],["content/806",[4,1.31,6,1.224,14,4.754,23,3.952,25,0.841,32,2.676,45,5.04,53,5.342,125,5.004,151,3.902,154,6.531,171,3.302,172,7.294,174,7.518,188,9.966,193,7.118,224,3.835,301,2.882,334,3.646,467,8.295,515,6.246,517,12.077,534,9.019,569,6.206,572,4.518,622,5.132,642,5.665,716,4.566,765,4.145,843,5.724,861,5.882,901,4.828,1040,8.067,1086,8.177,1108,8.551,1169,5.786,1272,9.206,1276,6.697,1747,8.551,1783,8.694,2058,14.209,2098,7.964,2121,7.772,2339,11.695,2356,10.225,2495,7.964,3767,9.206,3778,10.675,3781,8.067,4672,12.647,4673,12.647]],["keywords/806",[]],["title/807",[2376,1386.998]],["content/807",[]],["keywords/807",[]],["title/808",[765,513.868,3494,1141.31]],["content/808",[4,1.201,23,4.246,32,3.534,35,6.142,158,10.515,201,4.477,224,5.063,228,5.062,246,3.662,271,5.923,557,6.635,572,4.141,630,8.692,723,7.837,737,3.897,758,7.222,767,6.622,770,8.246,772,8.119,773,9.317,1021,6.234,1196,10.95,1278,5.724,1356,7.394,1417,6.336,1437,9.371,1479,9.367,2004,8.842,2021,9.714,2106,13.091,2512,9.714,2602,10.144,3494,15.59,4674,11.591,4675,10.144,4676,11.591,4677,11.591]],["keywords/808",[]],["title/809",[2376,1386.998]],["content/809",[]],["keywords/809",[]],["title/810",[319,698.67,901,598.491]],["content/810",[4,1.614,23,3.702,32,4.333,34,5.561,35,5.871,152,3.102,161,4.921,164,4.892,349,10.073,549,8.187,656,9.261,737,5.238,806,7.504,888,8.127,901,5.947,1116,7.743,1196,10.216,1278,7.693,2021,13.056,2376,11.596,2768,14.326,2769,11.883,2953,10.216,4442,10.073,4675,20.012,4678,18.932,4679,13.633,4680,14.406,4681,15.579,4682,14.406,4683,14.406]],["keywords/810",[]],["title/811",[319,698.67,4684,1267.615]],["content/811",[23,3.845,32,4.333,34,5.561,35,5.871,46,5.043,111,5.878,164,4.892,375,8.127,557,6.19,806,7.504,1278,7.693,1961,9.261,1986,10.073,2376,11.596,2396,13.056,2502,7.743,2768,14.326,2769,11.883,4199,13.633,4222,12.595,4675,20.012,4678,18.932,4679,13.633,4680,14.406,4682,14.406,4683,14.406,4684,12.595,4685,13.633,4686,15.579,4687,15.579]],["keywords/811",[]],["title/812",[19,405.656,1196,887.426,1986,874.956]],["content/812",[23,4.303,32,4.249,34,4.597,35,4.338,164,4.75,271,5.366,572,7.172,630,8.826,758,6.542,765,4.958,772,8.328,773,7.912,1278,7.47,2106,11.58,2495,9.525,3174,10.227,3494,11.011,4688,15.126,4689,20.078,4690,15.126,4691,15.126]],["keywords/812",[]],["title/813",[19,469.995,1479,879.453]],["content/813",[23,4.279,32,4.509,34,5.255,35,5.346,164,4.256,193,5.43,271,4.807,572,4.841,630,8.437,758,5.861,765,4.442,772,5.621,773,7.346,787,6.568,806,6.528,1356,8.645,1479,7.601,2106,12.289,2495,8.534,2602,18.647,2768,9.483,2769,10.337,3174,9.163,3494,9.865,4663,10.957,4679,11.859,4692,13.552,4693,13.552,4694,13.552,4695,13.552,4696,13.552]],["keywords/813",[]],["title/814",[4697,1723.121]],["content/814",[]],["keywords/814",[]],["title/815",[561,636.63,571,887.426,1704,852.135]],["content/815",[2,6.217,4,1.759,16,8.729,25,1.129,33,2.195,40,6.48,54,7.378,67,6.83,122,7.451,151,5.237,186,5.017,187,10.432,191,6.506,198,4.535,241,6.31,246,5.363,273,4.746,373,4.378,561,10.182,571,11.132,590,9.228,1656,11.299,1704,13.628,1783,11.67,2443,13.306,3770,12.635,3784,14.855]],["keywords/815",[]],["title/816",[54,681.416,1704,987.288]],["content/816",[4,1.639,6,1.531,54,6.873,61,11.121,122,6.942,152,3.149,191,4.754,228,6.907,273,5.703,301,3.604,360,9.035,361,11.598,385,5.793,493,9.836,538,7.861,561,7.44,580,7.275,775,7.572,886,5.649,955,9.121,965,12.859,1049,9.72,1134,8.951,1143,10.226,1259,12.786,1697,8.951,1704,9.959,4698,20.159,4699,15.815,4700,15.815,4701,15.815]],["keywords/816",[]],["title/817",[273,343.83,1196,1028.176]],["content/817",[4,1.759,7,5.299,46,5.495,70,4.14,72,8.079,88,5.82,125,6.717,198,4.535,204,8.032,246,5.363,273,4.746,329,7.564,361,9.522,375,8.855,381,5.478,382,8.729,427,6.24,452,10.011,455,8.128,543,8.015,1196,11.132,1254,11.478,1332,9.13,1552,11.67,4165,15.145,4698,18.94,4702,16.975]],["keywords/817",[]],["title/818",[4,140.222,241,503.001,1704,852.135]],["content/818",[7,4.493,23,4.011,32,3.046,34,3.296,54,6.256,107,3.536,111,5.432,151,6.782,173,8.557,174,8.557,198,3.845,223,7.402,224,4.364,241,7.22,246,4.547,272,6.137,427,5.292,561,9.138,571,9.44,630,5.292,765,4.718,1074,7.869,1192,8.953,1276,10.285,1638,11.283,1704,13.843,2106,8.302,2121,8.846,2444,8.745,2495,9.064,2886,9.896,2953,9.44,3880,12.064,4165,10.073,4697,13.311,4698,12.597,4703,14.395,4704,14.395,4705,17.961]],["keywords/818",[]],["title/819",[273,343.83,514,562.039]],["content/819",[]],["keywords/819",[]],["title/820",[581,790.783]],["content/820",[4,1.997,6,1.092,8,5.972,19,3.381,20,5.051,22,4.296,23,4.351,25,1.089,32,2.387,34,2.582,37,2.748,52,3.107,69,3.52,88,3.867,152,2.245,164,5.141,193,4.518,273,4.924,301,2.57,408,3.731,514,5.868,765,3.696,771,6.559,804,7.934,975,8.805,984,6.931,1398,7.101,1526,8.949,1614,5.758,1641,8.209,4028,9.631,4515,7.014,4706,16.37,4707,11.278,4708,10.428,4709,11.278,4710,11.278,4711,16.37,4712,11.278,4713,11.278,4714,11.278]],["keywords/820",[]],["title/821",[22,411.473,869,1028.176]],["content/821",[4,2.422,5,3.52,6,1.086,7,3.502,8,5.94,19,4.888,20,5.024,22,2.944,51,2.684,60,8.36,62,4.805,63,2.46,65,3.676,70,3.977,85,9.254,97,5.725,122,7.157,152,2.233,171,4.258,182,2.238,186,5.679,187,11.807,203,9.743,222,4.446,273,4.213,279,6.668,301,5.107,304,5.65,373,5.439,408,5.395,426,10.142,484,6.292,504,4.973,514,7.561,543,6.039,642,7.304,694,5.575,737,3.771,761,8.165,911,7.155,975,10.333,1219,5.403,1220,9.315,1395,12.137,1981,7.466,2088,8,2131,6.74,2136,7.849,2344,9.069,4715,11.217,4716,11.217]],["keywords/821",[]],["title/822",[1,331.087,23,113.237,183,234.015,241,276.168,284,263.555,381,239.762,722,374.225,826,409.573,4717,742.988]],["content/822",[]],["keywords/822",[]],["title/823",[25,104.266,883,850.067]],["content/823",[]],["keywords/823",[]],["title/824",[105,850.067,648,987.288]],["content/824",[3,6.487,4,1.461,8,7.468,19,4.227,23,2.149,25,1.274,40,5.383,45,4.001,49,9.012,58,5.165,99,4.968,113,6.559,152,3.814,188,7.91,196,4.389,203,7.151,250,7.525,251,7.841,257,6.317,297,4.001,398,5.281,407,6.877,515,6.964,523,7.585,674,7.016,706,9.781,763,7.201,853,8.056,881,10.265,883,7.646,884,8.213,885,10.265,886,5.037,888,7.357,936,7.01,993,6.793,996,6.383,1062,10.497,1081,8.667,1158,8.667,1168,9.248,1326,8.667,1598,10.265,2123,11.054,2444,8.568,3742,15.487,3823,11.054,4718,14.102,4719,14.102,4720,14.102,4721,14.102]],["keywords/824",[]],["title/825",[284,480.028,569,664.05,828,1032.224]],["content/825",[4,1.849,19,4.452,22,6.08,23,4.15,24,5.127,25,1.186,32,2.092,33,1.278,34,2.263,35,2.835,37,1.66,99,3.483,108,5.157,111,3.73,124,3.702,154,3.634,158,6.225,164,3.104,171,3.879,188,5.545,241,3.675,257,10.676,264,2.866,273,2.168,284,7.036,349,6.392,454,6.392,467,3.495,572,3.531,776,4.705,804,4.791,815,12.998,819,6.918,820,6.796,821,7.993,824,6.918,825,6.684,826,10.935,828,11.33,834,12.998,844,16.498,845,6.483,846,9.142,873,5.94,1061,11.096,1093,7.993,1300,4.548,1308,5.596,2002,5.317,2995,7.749,3323,8.285,3651,9.142,3767,7.196,3987,8.651,4722,9.886,4723,9.886,4724,14.853,4725,9.886,4726,9.886,4727,9.886,4728,9.886,4729,9.886,4730,9.886,4731,9.886,4732,9.886,4733,9.886]],["keywords/825",[]],["title/826",[87,413.633,241,442.435,284,422.228,572,425.189]],["content/826",[6,0.953,18,4.944,19,2.949,23,4.148,25,0.984,32,5.037,88,3.374,92,4.195,116,4.063,152,4.225,171,3.865,183,4.662,185,2.377,186,2.908,193,3.942,241,5.501,249,8.377,272,7.585,273,3.246,284,5.25,301,4.055,381,3.175,427,3.617,543,5.481,572,5.287,736,3.685,737,5.981,809,4.859,826,14.491,847,7.955,848,11.602,849,11.602,1276,5.21,1278,4.859,1646,15.396,2669,10.007,2927,9.32,3308,7.955,3564,7.017,4165,6.885,4734,9.839,4735,9.839,4736,9.839,4737,9.839,4738,9.098,4739,9.839,4740,9.839,4741,7.505,4742,9.839,4743,9.839]],["keywords/826",[]],["title/827",[99,656.442]],["content/827",[]],["keywords/827",[]],["title/828",[276,952.558,1631,887.422]],["content/828",[4,1.481,18,6.458,25,1.457,58,5.236,63,3.135,76,8.498,79,7.57,99,8.267,121,8.59,171,3.733,183,4.503,186,4.226,204,6.764,250,7.629,255,7.879,284,6.858,319,6.37,323,7.881,330,3.437,360,8.167,381,4.613,421,7.404,517,11.877,527,7.351,664,7.153,722,7.2,734,7.2,740,6.649,954,7.513,960,11.558,967,10.406,983,11.492,1061,12.024,1124,9.243,1161,11.206,1167,9.828,1316,13.219,1407,10.904,1636,10.004,1827,8.019,2979,9.666,3859,10.641,4744,13.219]],["keywords/828",[]],["title/829",[581,790.783]],["content/829",[4,0.994,6,0.694,18,1.36,21,2.348,22,4.373,23,4.241,24,2.473,25,1.042,28,1.761,29,3.98,32,4.135,33,2.527,34,2.197,35,2.752,37,1.203,45,1.155,50,2.244,54,1.769,58,1.491,67,2.883,87,2.49,88,1.396,99,6.883,108,2.124,113,1.894,149,6.024,151,1.256,152,1.426,158,2.563,161,5.774,164,4.561,166,5.203,167,3.114,168,8.873,171,1.063,182,2.306,184,1.554,186,1.203,191,2.154,193,1.631,198,3.087,206,1.449,210,2.71,224,4.403,240,0.909,255,1.659,264,2.077,273,4.155,275,1.356,278,1.096,280,2.597,284,1.444,293,3.687,319,1.814,323,2.244,330,2.307,334,2.066,341,4.259,355,3.781,360,2.326,361,2.283,364,3.885,368,2.563,399,2.225,425,4.157,427,2.634,468,1.862,490,2.847,496,1.645,516,2.093,517,8.497,533,2.304,538,2.023,539,3.333,543,4.877,545,2.658,557,1.618,572,1.454,582,2.283,735,3.226,747,2.903,751,2.502,757,2.632,765,2.348,768,6.602,769,2.963,776,3.41,777,1.814,778,5.333,780,2.156,782,4.215,786,3.069,804,3.472,818,5.333,819,2.849,820,2.799,825,2.753,886,1.454,894,1.56,910,2.883,912,2.124,915,5.333,983,8.633,1040,2.597,1049,4.403,1061,10.898,1114,2.079,1141,4.698,1143,2.632,1160,2.064,1170,2.079,1220,2.326,1251,2.963,1268,2.108,1300,1.873,1308,2.304,1313,2.42,1320,2.19,1444,1.926,1716,2.903,1914,2.903,1965,5.014,1991,3.191,1993,2.753,2136,2.849,2913,3.03,2950,3.563,3264,3.563,3265,6.27,3271,3.764,3304,6.005,3305,6.005,3306,3.412,3323,9.685,3525,3.764,3726,2.597,4436,6.27,4442,2.632,4512,3.412,4745,4.071,4746,4.071,4747,4.071,4748,4.071,4749,4.071,4750,4.071,4751,4.071,4752,4.071,4753,4.071,4754,4.071,4755,4.071,4756,4.071,4757,4.071,4758,7.165,4759,4.071,4760,4.071,4761,6.625,4762,4.071,4763,4.071,4764,4.071,4765,4.071]],["keywords/829",[]],["title/830",[58,495.646,99,476.718,394,686.235]],["content/830",[4,1.717,33,2.756,37,2.782,45,4.701,46,5.364,51,3.965,58,7.805,64,11.204,65,5.431,88,5.681,92,9.086,99,8.761,195,8.774,198,4.426,255,8.685,293,4.638,308,5.364,490,6.584,517,8.984,636,9.058,664,8.29,723,11.204,782,9.748,894,6.35,1058,8.581,1160,8.403,1663,9.213,4766,14.501]],["keywords/830",[]],["title/831",[826,1027.214]],["content/831",[4,1.492,25,1.292,46,4.659,65,4.718,99,7.744,114,4.185,152,2.866,179,7.155,183,4.534,186,4.255,193,5.767,222,3.925,241,5.35,250,7.681,255,7.916,265,5.178,284,8.982,297,4.084,323,10.707,329,6.414,381,4.645,395,8.167,420,8.745,515,7.109,517,7.804,551,6.55,557,5.719,563,6.166,622,7.882,722,7.25,723,9.733,732,5.036,826,10.707,861,6.695,869,9.44,954,7.565,1058,7.455,1077,8.147,1124,9.307,3041,11.638,4767,12.597]],["keywords/831",[]],["title/832",[191,471.331,879,610.406]],["content/832",[3,7.331,6,1.543,19,6.229,25,1.06,33,2.061,37,2.675,49,7.497,58,5.837,65,5.223,87,5.538,88,5.464,92,6.795,99,8.145,113,9.665,182,3.18,195,8.439,199,7.63,255,6.495,276,9.682,319,7.101,402,9.191,539,7.412,581,6.763,723,10.775,747,11.365,782,9.375,854,12.492,1058,8.253,1192,9.911,1663,8.861,1984,10.166,2356,12.884,3264,13.946,3265,13.946,4436,13.946,4761,14.736]],["keywords/832",[]],["title/833",[33,174.985,58,495.646,99,476.718]],["content/833",[]],["keywords/833",[]],["title/834",[33,153.915,58,435.966,99,419.316,437,467.161]],["content/834",[4,2.64,25,1.31,33,2.548,58,7.217,67,7.928,69,6.151,73,10.061,99,6.942,179,9.794,437,7.734,452,9.114,857,10.132,1147,10.862]],["keywords/834",[]],["title/835",[104,1259.934]],["content/835",[4,1.132,5,3.453,6,1.548,7,3.41,12,3.809,23,3.379,32,2.312,34,4.332,37,1.834,44,3.041,46,3.536,51,2.614,58,5.858,65,3.58,70,3.9,73,5.577,77,8.831,87,5.558,99,5.634,104,15.661,113,5.081,114,5.501,154,4.015,156,5.784,171,2.852,186,3.229,189,5.577,202,3.36,215,8.405,222,2.978,230,3.451,232,6.493,251,6.073,265,3.929,267,9.154,273,3.507,275,3.637,287,5.429,297,3.099,308,3.536,311,4.679,322,4.015,334,3.149,364,5.922,366,5.261,373,2.817,381,5.161,401,4.892,437,4.287,440,5.052,447,6.967,466,5.698,499,8.405,527,5.617,549,8.405,556,5.713,557,4.34,674,4.001,694,5.429,785,3.331,920,5.784,969,7.385,996,7.239,1109,5.657,1548,6.967,2094,8.13,2098,6.878,2861,8.562,2868,9.559,3773,10.1,4768,10.923,4769,10.923,4770,10.923,4771,10.923]],["keywords/835",[]],["title/836",[100,690.067]],["content/836",[4,1.758,5,1.344,6,2.033,9,2.847,12,2.17,14,3.872,16,3.2,20,2.788,22,2.703,23,2.334,28,2.692,29,4.272,32,1.317,33,1.704,37,1.729,40,2.376,44,1.733,45,1.766,46,2.015,50,3.431,53,2.629,58,7.69,63,1.365,65,2.04,69,1.943,73,3.178,82,4.355,84,3.321,87,2.163,98,2.666,99,7.132,100,8.822,107,3.237,110,5.812,113,2.895,114,4.452,125,2.463,152,1.239,176,3.759,181,1.658,182,2.055,183,3.244,184,2.234,185,1.503,190,7.164,198,2.751,202,4.053,205,1.617,220,2.2,222,2.809,241,3.828,252,3.994,264,2.986,273,3.359,274,4.024,278,1.675,284,2.208,293,1.742,301,2.347,304,3.135,310,2.817,311,4.412,314,4.674,315,3.355,319,2.773,322,3.786,330,1.496,334,4.416,355,2.453,364,3.374,372,4.024,373,1.605,375,3.247,379,4.712,381,2.008,386,4.53,387,3.625,389,3.2,393,3.347,398,3.857,400,2.802,409,3.97,416,4.142,417,5.933,435,4.712,437,5.171,479,3.739,483,5.54,484,3.491,496,4.162,515,5.087,529,5.83,533,3.523,536,2.134,537,3.376,544,5.714,545,2.853,548,3.919,563,2.666,577,3.871,613,2.192,614,2.692,634,4.439,660,3.491,693,2.788,695,3.074,698,4.024,705,3.625,716,2.247,729,5.446,737,2.092,765,2.04,785,3.141,860,3.781,879,2.423,894,2.385,905,3.7,910,2.504,943,3.271,984,3.825,989,4.439,1021,3.347,1066,3.321,1378,8.195,1631,3.523,1636,4.355,1650,3.7,1697,3.523,1874,5.032,1940,5.032,2467,5.216,2502,3.093,3223,4.632,3808,5.755,3809,5.755,4772,6.224,4773,5.755,4774,6.224,4775,6.224,4776,6.224,4777,6.224,4778,6.224]],["keywords/836",[]],["title/837",[0,1010.306]],["content/837",[0,13.708,1,10.267,4,2.006,5,3.092,7,2.192,14,2.639,15,4.089,18,2.345,19,2.105,22,5.349,23,2.509,28,3.036,29,4.715,32,2.406,33,1.852,37,1.179,45,1.992,54,3.051,58,8.602,63,1.54,72,3.342,73,3.585,75,7.35,79,3.718,99,8.117,100,7.169,104,7.686,107,1.724,114,2.041,122,3.081,127,6.492,128,6.492,131,3.56,152,3.278,158,4.421,162,2.482,182,1.401,184,3.922,191,2.111,198,1.875,202,2.16,204,5.379,205,1.824,206,2.499,215,3.69,239,9.236,240,2.538,241,2.61,243,3.23,272,4.847,273,2.493,301,2.591,308,2.273,319,3.129,329,3.129,334,2.024,355,2.767,376,6.492,386,5.111,390,5.226,395,2.952,411,6.144,414,2.744,427,2.581,448,5.676,466,5.93,467,2.482,487,4.421,499,3.69,507,4.366,520,3.178,537,2.301,542,4.478,543,2.6,557,2.79,582,3.938,620,6.492,637,4.011,645,6.688,862,4.421,879,2.733,894,2.69,944,3.938,1077,6.434,1134,3.974,1378,8.909,1548,4.478,1631,3.974,1711,4.604,1783,4.827,2172,4.747,2344,5.676,3223,5.226,3333,9.191,3563,4.827,3748,5.503,3767,5.111,3830,5.226,4779,7.021,4780,7.021,4781,11.368,4782,7.021,4783,7.021,4784,7.021,4785,7.021,4786,7.021,4787,7.021,4788,7.021]],["keywords/837",[]],["title/838",[25,123.921]],["content/838",[2,3.82,4,1.984,5,2.251,6,1.497,7,2.456,9,2.073,14,2.958,18,2.628,19,1.358,22,3.268,23,3.938,24,2.716,25,1.471,28,1.96,29,3.264,32,2.207,33,1.61,34,3.228,35,4.76,37,1.751,44,1.262,45,2.958,46,1.467,53,1.914,58,6.746,61,2.437,63,1.726,69,1.415,73,2.314,85,2.183,89,2.853,97,1.591,99,6.488,100,6.82,107,3.059,108,2.364,111,1.71,113,2.108,114,2.287,122,1.989,152,1.567,155,1.351,164,1.423,171,2.055,176,1.654,180,3.62,181,1.207,182,2.081,183,2.478,184,1.706,185,1.095,186,3.082,190,2.12,191,1.362,192,2.645,196,1.41,198,2.102,199,2.17,201,1.75,202,1.394,204,2.144,222,1.236,224,2.386,239,2.314,242,2.498,264,1.314,271,1.607,273,3.39,284,2.791,293,1.268,297,2.958,301,1.033,311,1.941,315,3.397,319,3.506,323,2.498,330,2.507,334,1.307,373,1.169,381,1.462,385,1.66,388,2.542,394,2.298,396,1.481,398,2.947,399,2.477,401,2.03,408,4.664,414,1.771,420,2.753,421,4.075,425,1.63,440,2.096,480,2.831,514,1.624,536,1.554,537,1.485,538,2.252,541,2.21,543,2.914,544,2.936,545,1.255,553,2.03,555,2.818,556,1.619,568,2.666,571,2.972,572,1.619,600,2.437,614,1.96,630,4.578,656,2.694,659,2.084,689,2.477,693,2.03,694,2.252,722,2.282,732,1.585,736,1.697,737,2.645,742,3.562,757,2.93,758,1.96,763,5.325,765,2.579,770,2.238,771,4.178,772,1.88,773,3.101,774,2.477,775,2.17,777,2.019,787,2.196,804,3.813,805,2.972,857,2.33,894,3.015,910,1.823,932,2.062,954,2.381,975,2.437,993,2.183,1015,3.456,1030,2.224,1077,2.565,1147,2.498,1160,2.298,1197,3.171,1219,2.183,1256,2.565,1257,3.6,1268,2.347,1300,2.084,1305,3.171,1308,2.565,1313,2.694,1320,2.437,1378,6.486,1566,3.965,1613,2.519,1697,2.565,1755,3.456,1811,3.299,1821,3.016,1891,3.171,1893,3.115,2098,2.853,2106,2.613,2178,3.171,3367,2.183,3563,3.115,3778,2.723,3781,6.652,3790,3.171,3810,3.965,3811,3.965,3812,3.965,3813,2.753,3814,2.972,3816,3.965,3817,3.965,3818,6.886,3819,3.965,3990,3.373,4185,3.798,4620,3.456,4789,4.531,4790,4.531,4791,4.19,4792,4.531,4793,4.531,4794,4.19]],["keywords/838",[]],["title/839",[566,1281.072]],["content/839",[4,1.432,6,1.63,14,5.195,16,7.106,33,2.177,44,3.848,49,4.229,63,1.971,70,2.192,107,2.208,114,2.613,121,5.402,134,5.088,162,3.178,181,2.395,185,2.172,190,4.205,196,2.798,199,4.304,201,3.472,202,5.811,205,2.336,207,10.414,236,6.181,237,11.038,241,3.342,255,3.664,260,10.559,272,3.833,273,1.971,287,4.469,301,2.049,308,2.91,311,3.851,315,6.641,330,2.161,331,5.813,366,4.33,407,6.738,413,4.656,421,4.656,423,5.525,433,10.059,435,4.113,437,5.423,439,6.291,440,4.158,481,4.956,485,7.047,532,5.236,541,4.384,548,5.661,563,5.92,566,15.413,572,3.211,576,7.534,577,8.594,581,3.815,633,7.268,639,4.279,642,4.027,664,4.498,668,4.656,676,6.544,693,4.027,703,3.354,732,3.145,907,5.525,914,4.229,938,10.832,996,4.069,1000,4.835,1022,7.047,1030,4.412,1065,5.289,1109,4.656,1142,6.544,1224,5.236,1305,6.291,1395,6.692,1558,5.525,1582,6.692,1610,5.591,1863,7.047,1885,7.534,1980,7.534,1988,7.268,2114,5.895,2123,7.047,2660,12.778,2778,6.412,3020,7.867,3041,7.268,4795,8.313,4796,8.99,4797,15.565,4798,8.99,4799,8.99,4800,8.99,4801,8.99,4802,8.99,4803,8.99]],["keywords/839",[]],["title/840",[23,206.245,194,788.126,208,739.744]],["content/840",[4,1.94,5,2.945,6,1.321,33,1.764,46,4.415,58,6.858,72,6.492,73,6.965,99,6.596,107,3.351,114,3.965,176,4.978,181,5.697,182,2.722,183,4.296,184,4.061,190,6.381,194,10.905,197,9.728,198,3.644,201,5.268,202,5.76,205,4.865,207,10.322,208,11.688,220,4.822,235,8.484,236,9.378,237,8.945,238,9.223,241,5.07,248,7.396,289,6.345,297,3.87,305,13.298,311,5.843,329,6.078,366,6.57,373,3.518,423,8.383,516,7.014,641,9.545,645,11.016,698,8.819,886,6.689,1134,7.721]],["keywords/840",[]],["title/841",[935,1506.563]],["content/841",[0,3.806,5,3.555,6,1.387,16,5.845,25,0.467,37,1.179,44,3.989,54,3.051,60,2.619,63,1.54,67,2.825,70,1.712,98,3.008,100,2.6,104,4.747,107,1.724,114,5.628,131,3.56,152,1.398,166,3.806,171,2.968,181,4.819,183,2.211,184,1.522,185,3.978,197,8.107,199,3.361,207,7.896,217,5.117,220,4.018,236,4.827,237,7.455,239,7.314,242,3.87,260,7.418,272,2.993,273,4.654,277,4.049,278,1.89,284,5.841,301,3.265,315,6.305,328,5.676,330,1.688,348,3.974,355,2.767,378,4.218,393,3.776,394,3.56,414,5.599,416,4.673,417,6.45,435,5.201,454,4.539,467,4.018,481,7.896,503,3.718,527,5.845,537,3.726,544,2.619,545,1.945,556,2.508,557,2.79,561,3.303,563,4.87,566,12.435,572,5.117,581,2.979,614,6.195,630,4.179,636,3.838,650,6.556,659,3.23,674,2.571,693,3.145,695,3.467,703,4.241,742,5.145,765,6.345,806,8.712,954,3.69,960,5.676,969,4.747,993,3.382,1030,5.578,1315,4.421,1329,3.56,1536,4.913,1631,3.974,1636,4.913,1705,5.676,1728,5.226,1961,4.173,2022,5.884,2073,6.492,2083,6.492,2118,4.747,2156,6.492,2625,5.355,2848,5.884,2942,5.503,3199,6.492,3442,14.409,3746,5.884,3858,5.355,3898,6.144,3997,6.492,4154,6.492,4795,6.492,4804,6.144,4805,7.021,4806,7.021,4807,5.503,4808,7.021,4809,7.021,4810,7.021,4811,7.021,4812,7.021,4813,7.021,4814,7.021,4815,7.021]],["keywords/841",[]],["title/842",[191,471.331,879,610.406]],["content/842",[4,2.243,16,8.729,19,5.089,25,1.585,33,2.799,46,5.495,58,8.727,99,8.394,179,8.437,188,9.522,205,4.411,206,6.042,398,6.357,857,11.129,883,9.203,886,6.064,894,6.505,993,8.177,1444,8.032,3186,13.724,3820,15.697,3821,14.855,4816,16.975]],["keywords/842",[]],["title/843",[184,340.004,239,800.578]],["content/843",[]],["keywords/843",[]],["title/844",[2778,1328.96]],["content/844",[5,5.011,103,8.461,152,3.78,184,4.117,205,4.933,225,8.32,271,6.735,277,10.95,278,6.248,408,6.282,786,8.133,1220,10.846,4817,18.986,4818,18.986,4819,18.986,4820,17.557]],["keywords/844",[]],["title/845",[2651,1356.449]],["content/845",[45,5.643,184,5.548,224,6.032,239,10.158,246,6.284,297,5.643,674,7.286,703,7.422,757,12.862,2252,12.086,2542,14.481,4821,19.893]],["keywords/845",[]],["title/846",[581,790.783]],["content/846",[4,1.598,5,1.693,12,2.734,18,2.619,22,2.057,23,4.325,25,0.521,32,1.659,109,5.069,111,2.958,116,3.237,124,4.651,131,3.976,151,2.419,152,3.07,154,2.882,161,2.477,164,3.9,184,4.146,185,1.894,201,3.028,224,2.377,239,9.761,241,5.732,243,5.712,246,3.923,282,5.98,293,2.195,301,2.83,305,4.876,319,3.494,330,1.885,334,2.26,347,3.606,348,4.437,373,2.022,398,2.936,451,7.632,458,5.776,467,7.189,490,3.115,520,6.98,538,3.897,598,5.301,694,3.897,711,3.327,735,5.591,886,2.8,901,4.74,1024,5.842,1109,4.06,1114,8.956,1176,4.479,1257,3.587,1339,3.512,1343,4.66,1347,4.876,1354,7.545,1401,5.591,1580,5.835,1602,4.763,1743,9.472,1747,5.301,2381,9.04,3579,11.483,3586,7.162,3756,6.338,4051,5.141,4326,14.181,4822,4.66,4823,6.57,4824,7.249,4825,7.84,4826,7.84,4827,7.84,4828,7.84,4829,7.84,4830,7.84,4831,7.84,4832,5.591]],["keywords/846",[]],["title/847",[225,562.039,278,422.052]],["content/847",[4,2.042,45,5.59,184,5.148,193,7.895,222,5.373,225,8.51,278,5.304,674,7.217,1220,11.257,1276,10.434,2131,11.839,3560,14.344,4421,15.931]],["keywords/847",[]],["title/848",[19,469.995,1536,1097.157]],["content/848",[22,2.225,23,4.236,32,3.875,44,2.361,111,7.488,131,4.299,151,5.004,154,3.117,155,2.527,161,2.678,162,2.997,164,2.662,171,2.214,184,3.517,193,5.291,198,2.265,224,4.004,239,8.282,241,7.376,272,3.615,287,4.214,301,1.932,305,5.273,330,2.038,347,6.075,373,2.186,419,5.151,451,5.21,467,6.473,481,4.673,520,10.555,530,7.84,592,5.151,711,3.598,716,3.061,726,6.171,737,2.85,772,3.517,891,4.673,901,6.192,1024,6.212,1169,3.879,1309,3.988,1343,5.04,1347,8.213,1942,6.646,2303,4.56,2912,11.388,3223,6.31,3339,13.114,3586,10.56,3823,6.646,3923,6.31,4051,8.66,4326,13.114,4822,7.85,4823,11.067,4824,7.84,4833,13.594,4834,13.205,4835,13.205,4836,8.478,4837,8.478,4838,8.478,4839,8.478,4840,8.478,4841,8.478,4842,13.205,4843,8.478]],["keywords/848",[]],["title/849",[703,695.225]],["content/849",[4,2.263,23,3.12,33,1.362,51,5.227,65,3.453,69,3.289,72,5.015,171,4.067,193,4.221,219,3.916,235,9.687,239,10.452,240,2.353,246,3.328,281,4.086,314,6.573,323,5.808,355,6.138,396,3.442,437,4.135,438,3.946,447,9.935,458,4.901,479,6.331,493,6.553,613,6.527,659,7.165,660,5.91,662,7.514,688,6.401,703,8.149,711,6.61,716,3.804,736,3.946,737,3.542,757,10.07,861,4.901,943,5.537,955,6.076,1109,5.457,1176,6.019,1298,9.358,1300,4.847,1339,4.719,1389,8.518,1438,8.518,1466,7.67,1694,7.373,1713,8.444,1844,9.22,2018,8.259,2360,8.518,2612,7.514,3629,11.337,3681,9.22,3790,7.373,4844,10.536,4845,10.536,4846,10.536,4847,10.536,4848,10.536,4849,15.575,4850,15.575,4851,10.536,4852,10.536,4853,10.536,4854,10.536,4855,18.529,4856,10.536,4857,10.536,4858,10.536]],["keywords/849",[]],["title/850",[72,746.242,134,887.422]],["content/850",[]],["keywords/850",[]],["title/851",[33,202.738,741,952.558]],["content/851",[0,8.707,23,3.98,32,3.399,33,3.178,34,3.677,35,4.605,45,4.556,198,6.199,239,11.85,240,4.663,373,4.142,425,5.777,520,7.269,587,10.244,711,6.815,741,9.757,901,6.13,2106,12.044,2197,12.588,2733,14.894,3586,9.262,4859,20.884,4860,16.059]],["keywords/851",[]],["title/852",[58,574.258,99,552.327]],["content/852",[22,5.593,23,4.013,32,3.507,58,6.069,99,5.837,144,10.183,184,3.593,224,5.024,239,8.461,251,9.213,347,7.622,520,11.645,738,13.779,901,8.135,1024,7.795,1347,10.306,3586,9.556,4051,10.866,4326,13.397,4822,9.85,4823,13.887,4861,21.311]],["keywords/852",[]],["title/853",[184,293.46,194,788.126,208,739.744]],["content/853",[]],["keywords/853",[]],["title/854",[581,790.783]],["content/854",[4,1.602,22,3.269,23,4.266,28,3.404,29,5.166,32,4.053,33,1.611,35,2.257,54,3.42,60,2.936,70,1.919,108,4.105,124,2.947,152,1.567,154,2.893,171,2.055,183,2.479,184,4.417,190,3.681,192,2.646,194,9.003,208,10.469,224,5.807,230,2.486,240,1.757,241,2.925,246,2.486,251,4.375,264,2.281,293,2.203,301,2.839,319,3.507,329,3.507,330,1.892,334,3.591,347,5.73,381,2.539,398,4.664,438,2.947,467,4.403,520,3.562,572,2.811,580,3.62,590,3.355,630,2.893,664,3.937,674,4.562,716,2.841,735,5.608,737,2.646,771,3.153,786,3.371,886,4.449,901,3.004,1024,5.86,1160,3.991,1276,4.167,1300,3.62,1308,4.454,1325,5.088,1347,4.894,1377,3.681,1438,6.362,1827,4.414,1889,4.955,2502,3.911,3756,6.362,3880,6.595,4051,5.161,4332,11.518,4349,8.883,4804,10.9,4822,7.404,4862,7.869,4863,7.869,4864,7.277,4865,16.253,4866,7.869,4867,7.277,4868,7.869,4869,7.869,4870,11.518,4871,7.869,4872,11.518,4873,7.869,4874,7.869,4875,10.9,4876,6.887,4877,7.869,4878,6.595]],["keywords/854",[]],["title/855",[278,422.052,809,774.288]],["content/855",[18,7.383,25,1.167,44,4.886,65,5.751,152,4.817,171,5.771,184,4.793,208,9.592,315,5.715,330,4.219,334,5.059,361,9.842,427,6.45,446,13.061,467,6.203,582,9.842,737,5.899,809,11.949,1345,10.913,3887,12.063,4879,13.061]],["keywords/855",[]],["title/856",[171,409.414,4880,1449.827]],["content/856",[5,4.137,6,1.855,18,6.401,25,1.552,44,5.335,52,5.28,152,3.815,184,4.155,185,5.638,202,5.894,208,12.759,364,10.389,561,9.014,1204,9.853,4880,17.718]],["keywords/856",[]],["title/857",[4,90.608,18,292.098,33,113.071,184,189.626,208,478.003,1169,400.06,1204,449.64]],["content/857",[4,2.041,22,3.858,23,3.883,25,1.31,32,3.111,33,1.901,34,3.366,53,6.209,73,7.506,152,3.922,155,4.382,164,4.616,171,3.838,182,2.933,208,10.768,230,4.644,273,3.224,315,4.788,458,6.837,516,7.558,737,6.623,740,6.837,751,9.034,807,11.884,858,7.404,1169,6.725,1204,7.558,1257,9.012,2502,7.306,3887,13.543,4864,13.593,4875,20.771,4881,14.699,4882,14.699,4883,14.699,4884,14.699]],["keywords/857",[]],["title/858",[184,340.004,1325,1013.728]],["content/858",[4,1.958,23,4.223,32,2.925,33,1.787,44,3.849,124,5.176,164,6.761,184,2.997,208,10.329,224,6.528,225,4.955,347,6.358,419,8.397,467,4.886,600,10.162,740,6.429,785,4.215,1024,6.502,1325,12.217,1356,8.817,1548,8.817,2321,8.703,2717,10.543,2741,10.543,4051,9.064,4804,12.095,4822,8.216,4865,12.781,4870,12.781,4872,12.781,4875,12.095,4885,13.822,4886,18.895,4887,13.822,4888,12.781,4889,13.822,4890,13.822]],["keywords/858",[]],["title/859",[25,89.993,184,293.46,4618,965.11]],["content/859",[]],["keywords/859",[]],["title/860",[4,140.222,25,89.993,4618,965.11]],["content/860",[6,1.365,23,1.407,25,1.372,33,1.823,37,2.367,45,2.618,69,2.881,70,3.438,82,6.458,87,3.207,97,4.95,107,4.202,114,2.683,149,3.828,151,2.847,161,2.916,176,3.368,180,4.245,181,3.757,182,1.841,184,3.057,185,3.406,186,4.167,192,3.103,202,2.839,203,4.68,204,4.367,205,5.651,206,5.019,207,5.088,220,6.048,225,5.054,226,4.712,227,4.746,240,2.061,246,2.916,252,3.579,262,4.925,264,2.676,265,3.32,278,5.156,284,3.274,285,9.693,293,2.583,301,3.899,305,5.74,308,2.987,311,3.954,314,3.274,315,3.006,330,2.219,360,5.272,366,4.445,392,4.293,401,4.134,425,3.32,428,4.964,479,5.545,536,5.866,537,5.607,545,2.556,554,4.419,565,5.224,582,5.177,613,3.251,614,3.992,626,7.04,632,5.429,637,8.054,638,5.323,639,4.393,735,4.155,739,5.967,740,4.293,862,5.812,894,3.537,914,4.342,932,6.416,971,5.486,973,4.964,989,6.582,1007,7.41,1041,7.234,1060,8.534,1116,4.587,1157,5.486,1197,6.458,1393,7.462,1567,11.052,1603,7.04,2692,6.458,3990,6.869,4618,12.201,4891,14.099]],["keywords/860",[]],["title/861",[240,302.163,1732,1184.242,4618,965.11]],["content/861",[4,1.773,6,0.612,14,2.375,18,3.484,20,2.83,23,3.104,25,1.225,29,6.412,33,1.722,35,2.991,44,3.708,45,1.792,53,2.669,58,2.314,73,3.226,87,2.196,94,3.929,98,4.468,106,7.17,108,5.44,111,3.935,124,2.366,125,2.5,136,3.644,152,4.055,155,1.883,164,3.275,171,4.809,177,3.249,181,1.683,184,2.262,185,2.519,186,1.867,189,3.226,190,4.878,191,4.647,198,4.92,205,2.71,207,7.341,224,6.176,235,8.282,238,9.004,240,2.974,243,2.906,254,3.756,271,2.241,278,1.701,334,1.822,359,11.252,373,3.434,378,3.796,396,3.407,420,3.838,427,2.323,438,2.366,446,4.703,468,2.891,497,5.529,545,1.75,552,3.32,568,3.717,580,2.906,590,4.446,652,3.025,659,2.906,674,2.314,677,4.953,737,4.477,765,3.418,809,9.622,858,3.182,886,3.725,894,2.421,971,3.756,1050,7.438,1089,3.644,1174,3.838,1264,7.762,1300,4.797,1308,5.903,1313,3.756,1320,3.398,1345,3.929,1444,2.99,1638,4.953,1823,4.953,1966,4.421,1986,6.743,2502,3.14,2669,4.272,2781,13.709,2783,6.336,2953,11.219,3455,5.842,3503,4.703,3858,7.955,3887,4.344,4074,5.529,4618,17.639,4879,7.762,4892,6.318,4893,19.034,4894,5.842,4895,6.318,4896,6.318,4897,6.318,4898,6.318,4899,5.529,4900,6.318,4901,5.529]],["keywords/861",[]],["title/862",[25,70.65,171,277.416,184,230.384,191,319.37,4618,757.671]],["content/862",[18,4.04,22,4.935,23,4.231,24,4.174,25,1.251,28,3.28,29,5.016,32,3.98,33,0.981,34,2.769,35,4.326,37,1.273,108,3.956,125,3.001,151,2.339,161,2.396,162,2.681,171,3.939,184,4.078,191,3.636,198,2.026,205,5.207,206,2.699,207,4.18,223,3.899,224,4.574,235,4.716,238,5.127,240,1.693,271,2.69,275,2.525,323,4.18,334,2.186,347,3.488,355,2.988,373,1.956,387,4.416,396,2.478,407,3.698,467,2.681,482,4.145,572,2.709,630,5.545,677,9.48,735,3.414,737,2.549,757,4.903,758,3.28,764,4.145,765,3.964,767,4.332,770,3.745,771,6.044,772,3.145,773,4.766,774,4.145,775,3.631,776,5.756,777,3.379,780,4.015,809,5.972,845,4.973,886,2.709,1024,3.567,1276,4.015,1300,3.488,1308,4.292,1313,4.508,1320,4.078,1343,4.508,1347,4.716,1354,7.348,1526,6.611,1646,5.047,2106,4.373,2121,7.432,3709,6.355,3726,4.837,4618,16.457,4822,4.508,4832,5.408,4879,5.644,4902,15.085,4903,6.355,4904,7.583,4905,7.583,4906,7.583,4907,7.583,4908,7.583,4909,7.583,4910,7.583]],["keywords/862",[]],["title/863",[45,337.67,184,258.124,703,444.09,4618,848.901]],["content/863",[4,1.208,20,5.221,25,1.115,46,3.773,51,2.789,69,3.639,70,2.843,72,5.548,88,3.997,131,5.911,152,3.909,154,6.163,184,2.528,205,3.029,224,3.534,225,4.178,230,3.682,246,3.682,278,3.138,279,9.966,288,5.756,297,3.307,319,5.194,329,5.194,347,5.362,360,6.659,373,3.006,378,7.004,381,3.761,394,5.911,396,6.415,501,5.994,556,5.989,632,6.857,674,4.269,677,9.137,711,4.947,758,5.041,785,3.555,787,5.649,792,9.669,886,4.164,1417,9.165,1466,8.485,1575,10.2,1713,6.32,2004,12.788,2057,8.013,2058,7.435,2252,7.082,2353,8.313,2354,9.769,2396,9.769,2572,13.555,2766,12.788,2953,12.876,4199,14.672,4618,15.313,4643,9.137,4911,11.656,4912,11.656,4913,11.656,4914,11.656,4915,11.656,4916,11.656,4917,9.424,4918,11.656,4919,11.656,4920,11.656]],["keywords/863",[]],["title/864",[184,340.004,1054,1097.157]],["content/864",[]],["keywords/864",[]],["title/865",[4921,1863.425]],["content/865",[4,1.773,5,3.695,6,1.657,25,1.138,35,4.908,184,3.711,217,6.114,240,3.821,243,7.873,373,4.414,394,8.679,438,6.409,695,8.452,882,10.518,886,6.114,894,6.558,1054,16.737,1262,10.518,1617,8.928,1822,12.739,3990,12.739,4563,13.055,4893,19.039,4894,15.826,4922,17.115,4923,17.115,4924,17.115,4925,17.115]],["keywords/865",[]],["title/866",[581,790.783]],["content/866",[5,2.435,19,3.381,22,4.296,23,4.125,25,0.75,28,4.878,29,6.79,30,5.305,32,2.387,35,3.234,44,3.14,45,3.199,69,3.52,108,5.883,124,4.223,152,3.259,154,4.146,162,3.987,184,5.368,224,5.843,240,2.518,251,6.27,314,4,347,5.188,356,7.614,373,2.908,716,5.91,735,5.078,771,4.518,886,6.884,901,4.305,1024,5.305,1054,16.39,1259,13.235,1276,8.669,1300,5.188,1343,6.704,1347,7.014,1354,9.946,1713,6.114,2178,7.892,2768,7.892,2927,7.101,3601,9.451,4051,7.396,4822,6.704,4926,19.272,4927,11.278,4928,14.326,4929,11.278,4930,11.278,4931,11.278]],["keywords/866",[]],["title/867",[278,422.052,809,774.288]],["content/867",[18,7.383,25,1.167,44,4.886,65,5.751,152,4.817,171,5.771,184,4.793,315,5.715,330,4.219,334,5.059,361,9.842,427,6.45,446,13.061,467,6.203,582,9.842,737,5.899,809,11.949,1054,12.279,1345,10.913,3887,12.063,4879,13.061]],["keywords/867",[]],["title/868",[25,58.151,45,248.063,184,293.328,1360,543.842,1361,470.306,1992,706.971]],["content/868",[25,1.349,45,5.753,152,4.038,162,7.169,184,5.238,193,8.126,1058,10.503,1360,12.613,1361,10.908,1388,12.936,1992,16.396]],["keywords/868",[]],["title/869",[25,49.41,45,210.774,107,182.5,181,197.97,184,161.122,260,384.788,301,169.334,315,241.997,537,243.512]],["content/869",[]],["keywords/869",[]],["title/870",[202,482.305,556,560.063]],["content/870",[25,1.454,107,4.239,166,9.356,171,4.506,184,3.742,204,8.165,219,6.414,226,8.811,235,10.732,238,11.668,260,11.326,278,4.645,297,6.204,315,5.621,319,7.69,330,4.149,425,6.208,545,4.78,894,6.613,1843,11.008,2671,11.316,4563,13.163,4932,15.957,4933,17.256,4934,17.256,4935,17.256,4936,15.101]],["keywords/870",[]],["title/871",[638,904.237,878,1028.176]],["content/871",[3,5.332,4,1.201,25,1.11,45,4.737,51,2.774,68,6.092,82,8.111,131,8.468,171,3.027,182,2.313,184,3.621,199,5.55,205,6.48,206,5.944,219,4.308,220,4.097,243,5.332,260,12.916,264,3.36,272,4.942,291,5.55,297,3.288,299,7.209,314,8.052,330,2.787,334,3.342,347,5.332,356,5.391,373,2.989,374,9.371,423,7.124,462,4.606,504,5.139,514,4.155,545,4.625,613,4.083,638,6.685,659,5.332,735,5.219,785,3.535,876,7.209,879,4.513,1055,5.761,1124,7.494,1173,6.89,1189,7.209,1663,6.445,1716,8.267,1843,7.394,1961,6.89,2692,8.111,2918,10.144,3262,10.719,3785,9.714,4563,8.842,4617,15.287,4936,10.144,4937,11.591,4938,11.591,4939,10.719]],["keywords/871",[]],["title/872",[171,250.496,191,288.379,205,249.247,260,496.808,315,312.447,4617,620.238]],["content/872",[1,1.67,2,2.44,4,1.129,7,1.17,10,1.483,18,1.252,19,1.124,22,4.417,23,4.177,24,3.759,25,1.256,28,1.621,29,4.518,30,1.764,32,3.378,33,1.935,34,3.426,35,2.578,37,1.829,44,1.855,68,1.97,87,1.303,88,1.285,105,3.611,107,0.921,108,1.956,110,1.654,111,1.415,122,1.645,124,3.366,151,1.157,152,1.326,161,1.184,162,1.325,164,3.918,171,1.739,176,1.368,183,2.098,184,3.245,185,1.609,186,1.108,190,1.753,191,1.127,198,3.691,201,1.448,203,1.901,204,1.774,205,3.242,206,2.371,207,2.066,219,1.393,223,1.928,224,6.306,234,1.734,240,4.451,243,5.01,260,10.968,271,2.363,282,5.081,314,3.188,315,2.928,334,2.592,347,3.064,355,3.542,373,2.809,381,1.21,396,1.225,407,4.383,427,1.378,438,2.494,476,2.277,482,2.049,504,1.662,511,2.673,572,2.379,574,6.159,630,5.867,735,2.999,757,2.424,758,2.881,765,2.946,770,3.289,772,2.763,773,5.897,774,3.641,775,3.189,777,2.968,780,3.527,785,1.143,809,3.289,843,3.015,845,2.458,876,2.331,886,4.457,894,1.437,1024,3.134,1084,3.28,1089,2.162,1242,2.938,1255,3.031,1300,1.724,1308,2.122,1313,2.228,1320,2.016,1333,2.79,1343,2.228,1347,4.143,1354,6.617,1377,1.753,1444,1.774,1612,4.958,1633,2.141,1724,7.042,2023,1.828,2106,7.195,2165,2.535,2502,1.863,3586,2.162,3592,2.79,3593,2.495,3726,2.391,3739,3.142,3856,3.466,4432,3.142,4515,6.774,4617,8.933,4822,3.959,4832,2.673,4893,3.28,4899,3.28,4903,7.533,4936,3.28,4939,3.466,4940,3.749,4941,3.749,4942,3.749,4943,3.749,4944,3.749,4945,6.661,4946,9.531,4947,6.159,4948,3.749,4949,3.466,4950,3.749,4951,3.749,4952,6.661,4953,3.749,4954,3.749,4955,11.579,4956,7.928,4957,8.988,4958,3.749,4959,5.582,4960,3.142,4961,6.159,4962,3.466,4963,3.142,4964,3.28,4965,2.859,4966,3.749,4967,3.749,4968,3.749,4969,3.28,4970,5.221,4971,5.582,4972,3.466,4973,6.661]],["keywords/872",[]],["title/873",[191,471.331,879,610.406]],["content/873",[19,5.59,23,2.842,25,1.527,66,13.573,144,11.459,185,4.504,260,9.657,264,5.406,308,6.036,398,6.983,428,10.029,1598,13.573,1697,10.554,2176,14.616,2588,13.573,4974,18.646,4975,18.646,4976,18.646,4977,18.646,4978,18.646]],["keywords/873",[]],["title/874",[25,63.794,131,486.458,184,208.027,205,249.247,240,214.197,241,356.567]],["content/874",[]],["keywords/874",[]],["title/875",[1663,1036.075]],["content/875",[4,1.424,6,0.508,12,1.829,14,0.745,18,1.752,22,3.056,23,4.248,25,0.593,32,4.345,33,0.256,34,3.146,40,4.445,44,1.034,45,1.054,46,0.641,49,1.748,53,0.837,63,0.434,67,0.797,68,1.952,86,1.501,88,0.679,92,0.845,97,0.695,99,0.698,106,2.554,107,0.913,108,1.033,111,2.953,114,0.576,116,5.674,122,0.869,124,1.391,131,3.969,148,1.142,151,1.146,152,3.162,154,1.366,155,0.59,161,2.472,162,4.116,164,5.816,166,2.844,167,1.615,171,1.725,177,1.019,180,0.911,183,2.811,184,3.34,186,0.585,191,1.117,193,1.488,198,0.992,204,0.937,205,3.868,206,1.322,220,1.313,222,1.013,223,1.019,224,0.601,225,3.555,230,3.133,234,0.916,240,3.829,243,4.562,260,4.622,264,1.077,265,0.713,314,2.344,315,0.645,322,0.728,330,2.146,335,1.413,347,4.105,356,4.613,360,1.132,373,1.353,380,1.442,381,1.199,382,1.019,385,0.725,390,1.474,397,1.263,398,0.742,425,0.713,427,0.728,440,0.916,452,0.916,455,0.948,460,1.511,467,0.7,474,1.142,483,1.065,496,0.8,501,1.91,504,0.878,513,1.177,516,1.019,520,2.991,557,0.787,561,1.748,568,1.165,580,1.709,589,2.6,592,1.203,616,1.386,626,2.834,630,2.877,661,1.263,689,1.083,711,1.577,716,1.894,722,2.642,734,3.942,736,0.742,737,1.249,740,0.921,741,2.257,745,2.868,757,1.281,758,2.858,764,2.031,771,5.744,773,0.781,785,1.6,880,1.511,886,2.796,894,0.759,901,1.418,906,2.014,910,0.797,919,2.6,971,1.177,993,0.954,1024,5.834,1055,0.985,1069,1.66,1074,1.083,1109,1.026,1112,2.208,1118,1.281,1125,1.386,1160,1.004,1169,0.906,1175,1.247,1176,1.132,1180,1.19,1191,2.37,1224,2.164,1227,1.299,1276,1.049,1300,2.413,1308,1.121,1309,4.198,1313,1.177,1317,3.671,1320,1.065,1332,1.065,1333,1.474,1339,1.664,1342,6.705,1343,1.177,1347,1.232,1350,1.511,1354,2.257,1359,1.511,1395,1.474,1479,3.706,1540,4.11,1614,1.011,1641,1.442,1650,3.928,1741,1.66,1811,1.442,1872,2.822,1889,1.247,1970,1.413,1993,1.339,2000,1.474,2131,1.19,2178,1.386,2303,1.998,2390,1.733,2443,1.553,2482,1.66,2502,0.985,2589,2.283,2693,8.305,2740,1.66,2751,5.18,2757,1.832,2795,3.435,2823,1.601,2886,3.607,2912,1.232,2913,1.474,2979,4.468,3167,1.511,3280,4.241,3311,1.832,3551,1.601,3564,1.413,3585,6.135,3586,2.143,3590,1.832,3592,5.825,3593,1.318,3597,4.591,3598,1.832,3599,1.832,3611,1.832,3684,6.997,3715,2.402,3771,1.832,3951,1.386,4051,1.299,4442,1.281,4447,1.733,4485,3.004,4632,1.832,4643,1.553,4667,5.538,4767,1.733,4822,4.652,4928,7.809,4946,5.782,4947,3.435,4949,1.832,4969,7.809,4979,1.981,4980,1.981,4981,1.981,4982,1.981,4983,1.981,4984,1.981,4985,1.981,4986,1.981,4987,1.981,4988,1.981,4989,3.435,4990,1.981,4991,1.981,4992,1.981,4993,1.981,4994,7.826,4995,1.981,4996,1.981,4997,1.981,4998,1.981,4999,3.715,5000,1.981,5001,1.981,5002,1.981,5003,3.715,5004,1.981,5005,1.832,5006,1.981,5007,3.715,5008,1.981,5009,1.981,5010,1.981,5011,1.981,5012,1.981,5013,3.715,5014,1.733,5015,9.068,5016,5.342,5017,3.715,5018,1.981,5019,5.246,5020,1.981,5021,4.851,5022,1.981,5023,5.246,5024,3.715,5025,1.981,5026,1.981,5027,1.981,5028,1.981,5029,1.981,5030,1.981,5031,1.981,5032,1.981,5033,1.981,5034,1.981,5035,1.981,5036,1.981,5037,1.832,5038,1.981,5039,1.981,5040,3.715,5041,1.832,5042,1.981,5043,1.981,5044,1.981,5045,1.981,5046,1.981,5047,1.981,5048,3.715,5049,3.715,5050,3.715,5051,3.715,5052,1.981,5053,1.981,5054,1.981,5055,1.981,5056,1.981,5057,3.715,5058,1.981,5059,3.715,5060,1.981,5061,1.981]],["keywords/875",[]],["title/876",[40,516.562,741,822.159,869,887.426]],["content/876",[14,5.526,25,0.978,40,5.611,106,10.105,111,5.547,116,6.07,125,5.816,131,9.989,184,3.188,205,6.43,219,5.464,240,4.398,243,10.22,271,7.881,305,13.818,330,3.534,481,8.103,512,6.017,545,5.456,734,7.404,879,5.723,894,5.633,1016,10.941,1339,6.584,1548,9.376,1633,8.397,1765,9.376,1890,11.522,2429,10.483,2912,9.142,2979,9.939,3020,17.239,3586,8.477,5016,11.884,5062,14.699,5063,14.699,5064,13.593]],["keywords/876",[]],["title/877",[25,89.993,184,293.46,240,302.163]],["content/877",[]],["keywords/877",[]],["title/878",[581,790.783]],["content/878",[22,5.05,23,4.053,25,1.28,28,6.141,32,3.005,34,3.251,45,4.028,124,5.317,154,5.219,184,4.734,224,6.619,240,5.461,243,8.852,251,7.894,271,5.036,347,6.531,663,7.827,726,10.335,735,6.393,765,4.653,886,5.072,1024,6.68,1347,8.83,2303,7.636,2912,8.83,3586,12.59,4822,8.44,4833,11.899,4971,18.295,4972,13.129,5065,13.129,5066,14.198,5067,13.129]],["keywords/878",[]],["title/879",[5068,1723.121]],["content/879",[14,5.337,23,2.933,51,3.398,65,4.653,116,7.947,154,5.219,162,5.019,164,4.459,182,4.669,183,4.472,184,3.079,191,4.268,205,6.08,240,4.297,243,8.852,271,7.743,373,4.963,375,7.407,394,7.2,435,6.496,452,6.567,545,6.046,663,10.608,734,7.151,765,7.155,1058,7.353,1134,8.036,1219,6.839,1697,8.036,1765,9.057,2062,9.451,2429,10.126,3586,8.189,3951,13.466,4109,12.425,5068,13.129,5069,14.198]],["keywords/879",[]],["title/880",[1299,1356.449]],["content/880",[6,1.592,23,3.577,164,5.162,183,5.178,205,6.098,240,3.671,545,5.873,711,8.998,726,11.967,734,8.28,879,6.4,906,8.913,1111,11.302,1134,12.001,1299,11.967,1332,8.842,1536,14.837,1993,14.336,2023,10.339,2301,10.486,2912,13.187,4833,13.777,5067,15.201,5070,16.439,5071,15.201]],["keywords/880",[]],["title/881",[5072,1723.121]],["content/881",[18,5.579,23,3.265,64,14.483,67,6.721,152,3.325,164,5.245,183,5.261,184,4.645,205,5.566,240,4.783,314,5.925,330,4.016,396,6.999,425,6.009,487,13.488,516,8.589,545,4.626,557,6.637,734,8.413,1633,9.542,2598,12.741,2783,10.148,3380,14.617,3859,12.432,5072,15.445,5073,16.703,5074,16.703]],["keywords/881",[]],["title/882",[40,516.562,241,503.001,3585,1060.767]],["content/882",[4,1.59,6,1.486,23,4.069,28,6.639,32,3.248,34,3.514,40,5.859,44,4.274,46,4.968,51,3.673,58,7.426,116,6.338,171,4.008,184,3.329,198,4.1,240,4.527,251,11.272,297,4.354,308,6.563,334,4.426,381,4.953,711,6.514,1339,9.081,1536,10.741,2049,9.924,2912,9.546,3585,18.929,4822,9.124,4971,12.864,5075,15.349]],["keywords/882",[]],["title/883",[184,340.004,242,864.293]],["content/883",[]],["keywords/883",[]],["title/884",[581,790.783]],["content/884",[4,2.122,25,1.362,46,6.629,184,5.268,186,6.053,242,11.289,458,9.526,857,10.531,1089,11.811,1321,17.163]],["keywords/884",[]],["title/885",[198,317.966,240,265.779,242,656.155,394,603.606]],["content/885",[4,1.214,6,0.512,18,3.003,19,3.513,23,4.212,25,0.352,32,3.998,35,2.578,44,2.503,86,2.138,107,1.3,116,2.185,124,3.366,152,4.18,154,1.945,161,7.408,162,1.87,164,5.636,173,3.145,184,1.147,188,6.573,190,2.475,198,1.413,205,1.375,206,1.883,225,3.222,229,5.042,230,2.84,240,1.181,242,4.955,243,2.434,246,1.671,272,2.256,273,1.16,305,3.291,341,3.145,347,2.434,356,2.461,360,6.695,451,3.252,455,2.533,513,3.145,545,1.466,592,10.225,600,6.303,630,5.691,645,3.113,703,3.354,758,3.888,771,7.569,773,6.632,809,4.439,827,5.524,891,4.955,1055,2.63,1116,4.468,1169,2.421,1257,4.112,1300,7.121,1317,3.703,1339,2.37,1345,5.59,1548,3.375,1650,3.145,2106,6.759,2131,3.179,2303,2.846,2444,3.215,2692,3.703,2693,12.003,2779,3.252,2912,7.288,3656,4.434,3684,11.35,3764,3.852,4128,4.63,4485,4.278,4515,5.59,5014,4.63,5076,5.291,5077,5.291,5078,5.291,5079,5.291,5080,11.719,5081,11.719,5082,4.893,5083,4.893,5084,7.866,5085,5.291,5086,5.291,5087,4.893,5088,5.291,5089,5.291,5090,8.312,5091,5.291,5092,8.989,5093,8.989,5094,5.291,5095,13.817,5096,5.291,5097,5.291,5098,5.291,5099,11.719,5100,11.719,5101,8.989,5102,8.989,5103,5.291,5104,5.291,5105,11.719,5106,5.291,5107,8.989,5108,5.291,5109,5.291,5110,4.893,5111,5.291,5112,8.989,5113,4.893,5114,5.291]],["keywords/885",[]],["title/886",[25,104.266,205,407.374]],["content/886",[4,1.164,6,0.562,22,0.844,23,4.296,25,0.528,32,3.456,35,2.276,44,2.21,54,1.398,65,1.054,68,3.052,87,1.118,88,1.991,107,1.95,113,2.701,116,1.328,124,2.973,131,4.93,151,0.992,152,3.095,161,4.32,164,3.529,172,1.855,174,4.719,180,2.671,184,3.541,186,0.951,191,0.967,193,1.289,198,2.12,220,3.437,222,0.877,224,2.407,229,1.804,230,1.016,237,2.109,240,2.509,242,8.57,243,5.169,246,1.016,273,3.581,278,0.866,280,2.052,293,1.625,305,2,314,1.141,329,1.433,330,1.396,347,6.29,356,3.692,360,3.317,398,1.204,425,1.157,451,1.977,458,2.701,467,4.433,543,1.191,549,1.69,557,1.278,568,1.892,572,2.836,580,1.479,581,1.365,592,4.823,600,1.73,645,1.892,652,1.54,656,1.912,694,2.886,703,5.102,711,3.369,714,2.141,726,7.077,735,1.448,736,1.204,758,1.391,765,1.054,771,5.025,775,2.78,786,1.378,806,4.683,809,5.55,876,2,886,1.149,901,1.228,910,2.336,955,1.855,975,4.269,1024,8.579,1055,4.832,1074,3.174,1089,1.855,1114,5.738,1116,1.599,1175,2.025,1192,2,1194,2.341,1254,7.598,1257,1.471,1298,1.932,1317,4.063,1320,3.123,1339,4.355,1343,1.912,1354,7.619,1511,2.341,1526,1.758,1554,2.251,1650,3.452,1663,3.229,1724,2.079,1783,2.211,1827,1.804,2000,2.394,2079,1.837,2098,2.025,2589,1.977,2693,8.944,2720,2.025,2842,2.695,2912,10.985,3114,2.341,3564,4.141,3586,8.459,3684,9.341,3709,2.695,3759,2.521,4051,5.206,4339,2.815,4442,2.079,4822,4.719,4832,2.294,4833,6.653,4879,4.322,5082,2.974,5083,2.974,5084,2.815,5090,5.37,5115,8.99,5116,5.082,5117,3.216,5118,3.216,5119,5.807,5120,13.605,5121,7.86,5122,7.938,5123,3.216,5124,3.216,5125,2.974,5126,7.938,5127,3.216,5128,2.974,5129,7.938,5130,3.216,5131,3.216,5132,5.807,5133,3.216,5134,7.938,5135,3.216,5136,3.216,5137,5.082,5138,3.216,5139,3.216,5140,3.216,5141,3.216,5142,3.216,5143,3.216,5144,3.216,5145,3.216,5146,5.807,5147,5.807,5148,3.216,5149,3.216]],["keywords/886",[]],["title/887",[280,677.68,467,375.547,737,357.175,1183,585.638,4442,686.894]],["content/887",[6,1.154,23,4.31,25,0.793,32,2.523,161,3.767,164,5.351,171,3.113,191,3.584,224,3.615,242,9.393,280,12.684,334,3.438,347,5.485,375,6.22,397,7.606,398,4.465,467,7.029,468,5.455,516,8.762,557,6.771,580,5.485,737,4.009,765,3.908,772,4.946,806,8.208,809,5.888,1024,8.016,1114,6.088,1169,7.796,1183,6.573,1783,8.197,2912,7.415,3503,12.683,3586,6.876,4051,7.819,4442,14.028,4822,7.087,5115,11.025,5120,10.434,5121,9.64,5150,10.434,5151,11.923,5152,11.923]],["keywords/887",[]],["title/888",[5153,1723.121]],["content/888",[4,1.02,12,3.431,19,4.437,22,2.582,23,4.318,25,0.984,32,3.132,35,2.822,151,3.036,152,3.94,161,7.043,167,4.276,220,3.478,224,2.983,240,2.197,242,8.159,243,8.184,249,5.569,265,3.54,287,4.891,347,4.526,356,4.577,381,3.175,458,4.577,510,4.99,580,4.526,758,4.256,806,7.129,910,5.955,1024,4.629,1114,5.024,1309,4.629,1339,4.407,1479,8.302,1560,10.175,2023,4.798,2165,6.653,2420,9.098,2693,7.017,2912,6.119,3586,5.675,3684,12.75,4051,6.452,4595,12.404,4822,5.849,5005,9.098,5016,7.955,5121,7.955,5150,8.611,5153,9.098,5154,13.686,5155,16.451,5156,17.79,5157,9.839,5158,9.839,5159,9.839]],["keywords/888",[]],["title/889",[5160,1863.425]],["content/889",[4,1.632,19,5.604,22,2.808,23,4.285,25,0.711,32,2.264,151,5.768,152,2.13,161,5.906,167,4.65,222,2.917,224,3.244,225,7.392,240,2.389,242,5.897,293,2.995,329,4.767,347,7.246,451,9.68,531,5.848,572,3.822,580,4.921,597,8.386,630,6.872,765,3.506,806,5.153,857,5.501,906,5.8,910,6.338,1024,5.033,1114,5.463,1309,5.033,1560,7.355,1631,6.055,2106,6.17,2912,6.654,3586,6.17,3742,8.65,3923,11.724,4051,7.016,4078,9.893,4822,6.359,4876,9.362,5084,9.362,5087,9.893,5121,8.65,5150,9.362,5154,9.893,5155,9.893,5161,18.695,5162,10.698,5163,10.698,5164,10.698,5165,10.698,5166,10.698,5167,10.698,5168,10.698,5169,10.698]],["keywords/889",[]],["title/890",[5170,1723.121]],["content/890",[4,1.69,6,1.086,9,5.132,19,3.362,23,3.953,25,0.746,49,5.277,54,4.875,65,3.676,68,5.895,88,5.591,92,4.782,113,7.585,116,4.632,151,5.031,154,4.123,161,3.543,171,2.929,172,9.404,174,6.668,184,3.536,191,3.372,205,2.914,220,3.965,222,3.059,224,3.401,240,3.641,242,8.989,250,5.986,262,5.986,287,8.105,319,4.998,330,2.697,371,5.851,373,2.893,398,4.201,399,6.132,432,5.895,467,3.965,496,4.532,520,7.381,538,5.575,539,5.217,598,7.584,711,4.76,726,8.165,861,5.217,901,4.282,906,6.081,993,5.403,1062,8.349,1339,5.024,1401,13.702,1704,7.063,1713,6.081,1747,7.584,1751,8,1766,12.788,2612,8,2912,6.976,3593,7.466,4051,7.356,4832,8,5071,10.372,5121,13.184,5170,10.372,5171,11.217,5172,11.217,5173,11.217,5174,10.372]],["keywords/890",[]],["title/891",[184,340.004,1055,779.313]],["content/891",[]],["keywords/891",[]],["title/892",[240,302.163,886,483.395,1055,672.63]],["content/892",[22,5.373,23,4.227,24,7.067,25,1.036,32,4.333,33,2.014,34,5.236,36,10.68,198,4.162,223,8.011,240,4.571,656,9.261,843,7.051,886,5.565,1055,10.176,1343,9.261,2783,9.465,3567,13.633,3593,10.369,5175,20.473,5176,14.406,5177,15.579,5178,15.579]],["keywords/892",[]],["title/893",[240,302.163,314,480.028,1055,672.63]],["content/893",[14,5.728,22,3.999,23,4.185,32,3.225,34,4.619,35,5.786,46,4.932,184,5.432,186,4.504,205,3.959,224,7.3,240,3.402,490,6.054,716,5.501,886,7.207,1055,7.573,1343,9.057,2131,9.155,2783,9.257,3586,8.787,4051,9.992,4822,9.057,5179,20.176,5180,15.237,5181,15.237]],["keywords/893",[]],["title/894",[241,692.634]],["content/894",[4,2.46,22,5.171,28,8.522,63,4.321,110,8.692,171,5.145,293,5.516,323,10.862,467,8.392,512,8.066,943,10.356,1575,17.244,5137,17.244]],["keywords/894",[]],["title/895",[25,49.41,45,210.774,107,182.5,181,197.97,184,161.122,301,169.334,315,241.997,362,502.363,537,243.512]],["content/895",[]],["keywords/895",[]],["title/896",[25,70.65,45,301.381,202,326.806,362,718.317,556,379.495]],["content/896",[25,1.403,51,3.903,107,4.006,176,5.952,180,7.503,184,3.537,205,4.238,207,8.991,219,6.063,220,5.766,226,8.328,235,10.144,238,11.028,240,3.642,278,4.391,315,6.871,319,7.268,334,4.703,362,15.809,496,6.591,504,7.231,545,4.518,894,6.25,1262,10.024,1651,9.407,2241,12.441,2671,10.696,4932,15.082,5182,16.311,5183,16.311,5184,16.311,5185,16.311,5186,15.082]],["keywords/896",[]],["title/897",[638,904.237,878,1028.176]],["content/897",[4,2.471,6,1.279,45,3.747,51,3.161,68,6.942,82,9.243,152,2.63,162,4.669,180,6.076,184,3.971,191,3.971,199,6.324,205,6.41,240,2.949,264,3.829,272,7.808,314,4.685,330,3.176,362,15.349,410,8.54,423,8.117,496,5.337,556,6.542,618,8.117,653,12.214,659,6.076,735,5.947,739,8.54,771,5.292,882,8.117,932,6.01,934,8.117,1024,6.214,1039,10.075,1064,9.243,1114,6.744,1124,8.54,1174,8.025,1262,8.117,1650,7.851,1704,8.317,2677,9.243,2692,9.243,2728,10.075,3684,7.936,5187,12.214,5188,13.208,5189,13.208,5190,13.208,5191,13.208,5192,11.559,5193,12.214]],["keywords/897",[]],["title/898",[23,146.203,25,63.794,171,250.496,191,288.379,315,312.447,362,648.611]],["content/898",[2,1.356,4,1.282,5,1.422,10,1.465,18,1.237,19,1.11,20,1.658,22,2.832,23,4.006,24,2.274,25,0.912,28,1.601,29,2.732,32,1.883,33,0.852,34,2.037,35,2.552,37,1.494,44,1.031,45,1.869,51,1.576,52,1.02,54,3.868,65,1.213,88,1.269,107,0.909,108,1.931,111,4.073,113,1.722,121,2.224,122,1.625,124,1.386,147,2.361,151,2.032,155,1.103,158,4.148,161,3.41,162,1.309,164,3.885,180,1.703,183,2.075,184,2.34,185,0.894,186,1.094,190,3.081,193,1.483,196,1.152,198,4.235,203,1.877,205,4.545,223,3.387,224,3.272,228,1.617,229,2.077,230,1.169,234,1.712,240,1.471,241,1.376,254,2.201,264,1.073,271,1.313,273,1.951,275,2.193,280,2.361,285,4.529,301,1.501,314,1.313,315,1.206,322,1.361,330,0.89,334,1.067,347,3.03,355,1.459,361,2.077,362,12.705,373,1.699,381,1.195,388,2.077,396,1.21,407,1.805,423,2.275,425,1.332,440,1.712,452,1.712,458,4.139,467,4.847,482,2.024,520,1.676,538,1.84,545,1.825,556,4.898,557,1.471,572,1.322,590,1.578,630,5.828,631,6.286,659,1.703,716,1.337,735,1.667,736,1.386,737,4.16,741,2.249,743,2.591,749,3.103,751,2.275,757,2.394,758,1.601,764,2.024,765,4.055,770,1.828,772,1.536,773,4.253,774,2.024,775,1.772,776,3.135,777,1.65,780,1.96,806,4.286,809,7.829,845,2.428,886,2.353,894,1.419,934,2.275,942,2.224,947,4.529,954,3.462,975,3.543,1024,5.077,1049,2.275,1064,2.591,1114,4.544,1126,2.755,1169,1.694,1219,1.783,1257,1.694,1262,4.048,1300,1.703,1308,2.095,1313,2.201,1320,1.991,1325,4.259,1326,2.275,1343,2.201,1345,5.535,1347,2.302,1354,4.002,1377,3.081,1417,5.9,1422,2.591,1588,2.902,1614,5.511,1650,7.355,1651,9.646,1724,4.259,1731,3.103,1827,2.077,1829,3.24,1831,3.103,1889,5.604,1965,2.591,1990,6.624,2071,3.423,2106,5.132,2152,2.824,2198,6.091,2321,2.331,2480,3.423,2544,3.24,2669,2.503,2676,3.24,2728,2.824,2835,3.423,2848,3.103,2921,3.423,2969,2.503,2979,2.503,2980,2.902,3186,2.993,3422,3.423,3684,2.224,3711,3.423,3887,4.529,4442,8.865,4515,4.097,4744,3.423,4832,2.64,4879,2.755,4901,3.24,4903,3.103,4955,7.458,4956,4.795,5120,3.24,5186,6.091,5187,3.423,5192,3.24,5193,3.423,5194,3.702,5195,3.702,5196,3.702,5197,3.702,5198,3.702,5199,6.587,5200,3.702,5201,3.702,5202,3.423,5203,3.702,5204,8.899,5205,3.702,5206,3.702,5207,3.702,5208,3.702,5209,3.702,5210,3.702,5211,3.702,5212,3.702,5213,3.702,5214,6.587,5215,3.702,5216,3.702,5217,8.899,5218,3.702,5219,8.899,5220,6.587,5221,3.702,5222,3.702,5223,3.702,5224,3.702,5225,3.702,5226,3.702,5227,3.702,5228,3.423,5229,3.702]],["keywords/898",[]],["title/899",[191,471.331,879,610.406]],["content/899",[23,3.955,107,3.855,184,3.404,185,3.792,225,5.627,227,8.071,276,9.536,308,5.081,324,13.736,362,10.613,517,8.51,561,7.384,659,9.464,857,8.071,884,9.141,907,9.646,932,7.143,996,7.105,1077,8.884,1092,11.973,1158,9.646,1196,10.293,1326,9.646,1598,11.426,1650,9.33,1792,10.791,1803,11.683,2176,12.304,2588,11.426,5192,13.736,5230,15.696,5231,15.696,5232,15.696,5233,15.696,5234,15.696,5235,15.696]],["keywords/899",[]],["title/900",[6,66.906,7,215.722,25,45.956,51,165.365,176,252.189,184,149.858,219,256.862,315,225.08,1360,429.789,1361,371.675]],["content/900",[]],["keywords/900",[]],["title/901",[1361,1002.228]],["content/901",[4,1.264,6,1.677,46,3.95,51,2.92,58,4.469,86,4.931,109,7.89,200,4.553,205,3.17,210,8.122,219,4.536,240,3.868,264,3.538,265,4.39,299,7.589,301,2.781,311,5.227,314,7.144,438,4.57,466,6.366,473,9.083,477,13.485,478,7.589,480,4.39,496,4.931,536,4.184,537,3.999,562,7.037,582,6.845,621,8.702,660,6.845,663,9.55,674,4.469,675,5.676,701,7.589,717,5.842,718,4.952,786,5.227,878,8.002,932,5.553,996,5.523,1032,8.389,1054,8.539,1055,8.611,1087,10.678,1119,7.037,1207,7.037,1297,13.618,1361,11.792,1590,9.308,1593,10.678,1823,9.565,1961,10.298,1967,9.565,2118,8.25,2123,9.565,2182,10.678,2444,7.413,3546,12.894,3623,9.308,3624,11.284,5236,12.202,5237,12.202]],["keywords/901",[]],["title/902",[86,324.619,205,208.735,240,179.382,315,261.663,401,359.844,638,463.325,1360,499.645,1361,432.085]],["content/902",[4,1.156,5,2.409,6,2.037,30,5.249,67,4.489,88,3.825,107,2.74,121,6.703,151,3.442,162,3.944,176,4.071,184,2.419,185,3.924,205,2.899,235,6.939,240,4.992,246,3.525,264,3.234,285,7.67,291,5.342,301,2.543,310,5.05,314,5.762,315,3.634,334,3.217,385,4.086,392,5.189,393,6.001,410,7.213,413,5.778,452,5.161,477,6.498,478,11.912,496,4.508,500,7.807,512,4.567,532,6.498,533,6.315,564,5.161,656,6.632,673,5.82,675,5.189,718,6.591,719,11.167,785,3.402,826,6.15,914,5.249,921,5.778,956,7.025,1011,7.543,1012,7.67,1022,8.745,1102,8.304,1103,7.807,1207,9.368,1219,5.374,1227,7.316,1303,9.763,1326,6.857,1360,6.939,1455,10.317,1685,9.763,1719,8.745,1848,8.745,2057,7.67,2143,10.317,2639,9.35,2720,7.025,3109,9.35,3114,8.121,3898,9.763,5238,11.157,5239,11.157,5240,11.157,5241,11.157,5242,11.157,5243,11.157,5244,11.157,5245,11.157,5246,11.157,5247,11.157,5248,11.157]],["keywords/902",[]],["title/903",[7,250.785,25,53.425,33,103.882,184,174.216,477,737.328,1360,499.645,1361,432.085]],["content/903",[5,2.681,6,2.14,25,1.167,33,2.268,51,2.972,122,5.452,152,2.473,171,3.243,176,4.533,184,4.41,185,3,191,3.734,205,4.558,235,7.725,240,4.934,252,4.816,276,7.546,278,3.343,299,7.725,301,2.831,314,4.406,315,4.045,319,5.535,322,4.566,330,2.986,334,3.581,380,9.041,383,11.485,396,4.058,414,4.855,426,7.725,468,5.683,473,9.245,477,10.217,478,7.725,496,5.019,529,7.03,537,4.071,541,6.057,545,3.44,552,6.528,582,6.967,587,7.923,613,4.375,638,7.163,716,6.333,732,4.346,735,5.592,786,5.321,826,6.847,1189,10.91,1323,9.736,1360,10.91,1361,9.435,1567,9.736,5249,12.421,5250,12.421,5251,12.421,5252,12.421,5253,12.421,5254,11.485]],["keywords/903",[]],["title/904",[4,110.083,25,70.65,45,301.381,184,230.384,1361,571.393]],["content/904",[4,1.831,5,0.989,6,0.444,7,1.43,8,2.426,14,1.722,18,1.53,19,2.381,22,3.293,23,4.106,24,2.742,25,0.944,28,1.981,32,1.681,33,1.36,34,2.873,35,2.278,37,1.765,40,1.749,44,2.928,45,2.983,46,1.483,51,1.096,53,1.935,54,3.452,65,2.603,67,1.843,70,2.565,88,1.571,97,2.789,108,2.39,110,5.535,114,1.332,125,1.813,151,1.413,152,0.912,154,1.684,155,2.368,161,1.447,162,1.619,164,1.439,171,1.196,183,3.312,184,4.545,186,1.354,193,4.213,198,4.46,203,2.323,205,2.064,219,1.703,224,4.303,240,2.348,241,1.703,264,3.049,271,1.625,275,3.502,293,2.224,301,1.044,308,3.404,314,5.035,323,2.525,334,1.321,347,2.107,348,2.593,355,1.805,366,2.207,381,2.563,388,2.57,389,2.356,392,2.131,398,2.975,440,5.804,458,2.131,467,1.619,474,2.642,477,7.308,486,2.723,504,5.563,519,2.464,572,1.636,580,4.837,582,2.57,630,5.218,642,2.052,674,1.678,716,1.654,736,2.975,758,1.981,764,2.504,765,2.603,767,7.168,770,2.262,771,5.027,772,1.9,773,4.945,774,2.504,775,2.193,776,3.781,777,2.041,780,2.426,787,2.22,826,2.525,853,2.617,857,2.356,866,2.695,883,2.484,886,4.482,901,1.749,920,2.426,1024,2.155,1038,2.849,1055,3.948,1089,2.642,1157,2.723,1174,2.783,1224,2.668,1257,3.634,1300,3.654,1308,2.593,1309,5.903,1313,2.723,1320,2.464,1343,2.723,1345,2.849,1360,7.804,1361,8.365,1362,8.243,1363,8.243,1365,11.322,1367,3.704,1368,3.839,1369,4.009,1370,6.657,1371,4.009,1372,3.839,1373,3.839,1374,4.009,1377,5.869,1391,3.704,1444,4.976,1584,8.502,1585,4.236,1587,4.236,1588,3.591,1697,2.593,1713,2.484,1746,6.227,1902,2.815,2203,3.004,2502,2.277,2783,4.826,2969,3.098,3563,3.15,3586,2.642,3601,3.839,3851,4.009,3987,12.421,4832,3.267,5255,4.581,5256,4.581,5257,4.581,5258,4.581,5259,4.581,5260,4.581,5261,4.236,5262,4.581,5263,4.581]],["keywords/904",[]],["title/905",[184,340.004,735,705.949]],["content/905",[45,5.29,162,6.591,171,4.869,184,4.978,228,10.025,246,5.891,301,4.25,314,6.614,315,6.073,329,8.309,375,9.727,467,6.591,477,10.86,735,10.335,1257,8.531,1326,11.459,1361,10.029,1746,14.616]],["keywords/905",[]],["title/906",[240,350.087,826,864.293]],["content/906",[4,2.132,14,4.001,19,4.704,21,6.138,22,2.793,23,3.343,25,1.044,32,2.252,34,2.437,40,4.063,44,2.964,45,3.019,46,3.445,54,6.82,125,4.212,181,2.836,184,3.403,193,4.265,198,4.192,203,7.958,222,4.279,228,4.649,240,5.552,241,3.956,246,3.362,288,5.256,293,2.979,301,2.426,305,6.62,314,6.612,322,3.913,334,3.069,366,5.127,381,3.435,440,4.923,477,9.139,481,5.867,515,5.256,529,6.024,541,5.19,600,5.725,668,8.127,705,6.199,716,3.843,826,13.427,854,8.343,993,5.127,996,4.818,1019,6.702,1055,5.29,1147,5.867,1297,7.197,1309,7.382,1343,6.327,1360,6.62,1361,8.44,1363,8.343,1378,6.62,2603,9.314,2913,7.922,2969,7.197,3529,9.314,3580,9.842,3593,10.445,4963,8.92,5176,9.842,5261,9.842,5264,15.692]],["keywords/906",[]],["title/907",[477,913.126,2023,764.557]],["content/907",[23,4.25,32,3.178,34,3.438,54,6.527,124,7.483,151,4.633,161,6.313,164,4.716,167,6.527,172,8.661,184,4.87,240,3.353,241,5.582,347,6.908,477,14.517,826,8.278,1024,7.065,1257,6.87,1298,9.023,1362,11.771,1584,12.141,2023,7.323,3951,10.509,4185,16.746,5265,19.982]],["keywords/907",[]],["title/908",[184,258.124,225,426.689,745,650.672,1361,640.194]],["content/908",[6,1.508,7,4.863,25,1.036,33,2.014,46,5.043,69,4.863,88,5.342,151,4.806,152,3.102,171,4.068,184,3.378,191,4.683,193,6.242,205,4.048,222,4.248,225,9.283,230,4.921,241,5.791,278,5.511,334,4.492,373,4.018,395,6.55,398,5.834,473,11.596,510,7.9,622,6.322,642,6.978,716,5.624,739,10.073,745,8.516,1113,11.34,1114,7.955,1116,10.176,1309,9.631,1859,13.633]],["keywords/908",[]],["title/909",[72,746.242,134,887.422]],["content/909",[]],["keywords/909",[]],["title/910",[334,390.178,4334,1251.356,4335,1184.242]],["content/910",[4,2.091,12,7.035,23,4.237,32,3.225,45,4.322,51,3.646,110,6.721,111,5.75,112,14.833,162,5.386,164,6.336,251,8.472,257,6.825,440,7.048,477,8.874,858,7.674,901,5.816,1254,10.302,1263,10.867,4128,13.334,4335,13.334,5266,20.176,5267,15.237,5268,15.237,5269,15.237,5270,15.237,5271,15.237,5272,15.237]],["keywords/910",[]],["title/911",[112,696.684,308,343.888,504,471.004,1055,528.056,1361,571.393]],["content/911",[3,5.58,4,1.788,22,4.528,23,4.146,25,1.147,28,5.247,29,7.156,30,5.707,32,2.567,34,2.778,51,2.903,73,6.194,94,12.486,112,11.313,113,5.643,251,9.592,256,5.707,297,4.894,308,5.584,319,5.406,347,5.58,375,6.329,389,6.238,394,6.152,458,5.643,467,4.288,504,5.378,741,7.37,1024,5.707,1055,11.483,1361,11.761,1362,9.509,1363,9.509,1367,9.808,1368,10.167,1370,10.167,1372,10.167,1373,10.167,1377,5.675,1584,9.808,1796,7.37,2079,6.93,5137,15.097,5273,12.131,5274,17.252,5275,17.252,5276,12.131]],["keywords/911",[]],["title/912",[5,207.102,6,92.877,176,350.079,184,208.027,205,249.247,480,345.096]],["content/912",[4,1.295,5,3.803,6,2.262,25,1.172,45,6.286,70,4.976,87,4.342,105,6.775,155,3.724,176,7.446,184,4.425,185,3.018,192,4.201,193,5.006,205,3.247,222,3.407,255,5.093,272,5.327,293,3.498,385,4.577,437,4.904,458,5.812,480,8.72,531,6.83,532,7.277,541,6.093,553,5.597,556,4.463,564,5.78,674,4.577,732,4.372,863,7.206,906,6.775,914,5.878,932,8.016,933,9.795,934,7.679,971,7.428,1023,9.3,1035,7.591,1056,7.868,1063,10.472,1163,10.472,1191,7.97,1299,9.096,1361,6.72,1400,7.009,1631,7.072,1633,7.138,2118,8.448,5277,12.495,5278,12.495,5279,12.495,5280,12.495,5281,12.495]],["keywords/912",[]],["title/913",[191,471.331,879,610.406]],["content/913",[14,6.131,19,4.889,25,1.644,46,5.28,107,5.182,171,4.259,181,4.346,191,4.903,202,5.017,225,5.847,241,6.063,278,4.391,315,5.312,398,6.108,432,8.572,523,11.346,563,6.987,861,9.812,883,11.437,893,6.858,993,7.856,996,7.383,1360,13.12,1361,8.772,1598,11.873,2176,12.785,3722,15.082,5282,16.311,5283,16.311]],["keywords/913",[]],["title/914",[3367,897.578]],["content/914",[]],["keywords/914",[]],["title/915",[45,383.895,111,510.637,3367,651.834]],["content/915",[22,6.195,23,4.018,25,1.298,45,5.538,111,7.366,438,7.31,3367,11.37,3726,12.452,5284,19.52,5285,18.05,5286,19.52]],["keywords/915",[]],["title/916",[438,506.782,765,443.523,3367,651.834]],["content/916",[4,1.534,6,1.433,23,4.306,32,4.189,34,3.389,124,7.412,155,4.413,171,3.866,271,5.251,355,5.834,458,6.886,480,7.12,572,7.07,630,5.442,758,6.403,765,6.487,772,6.141,1276,7.839,1400,8.304,2106,8.538,2121,12.164,2495,9.322,3174,10.009,3367,11.465]],["keywords/916",[]],["title/917",[5287,1723.121]],["content/917",[4,2.216,6,2.07,22,3.58,23,4.019,25,0.907,32,2.887,34,3.123,35,3.912,58,6.858,111,5.147,112,8.945,161,4.309,162,4.822,186,4.032,198,3.644,297,5.312,308,4.415,549,7.169,630,6.883,771,5.465,773,7.379,1089,7.867,1090,10.405,1278,6.736,3367,12.002,3368,11.937,3372,15.693,4147,12.613,4480,10.153,4610,11.937,4664,12.613,4917,11.028,5288,13.641,5289,13.641,5290,13.641,5291,15.693,5292,13.641,5293,12.613,5294,12.613]],["keywords/917",[]],["title/918",[5293,1723.121]],["content/918",[6,1.789,23,3.479,32,3.911,34,4.231,88,6.337,381,5.964,510,9.372,630,6.794,771,7.405,773,7.283,1313,10.986,1993,12.496,2353,13.18,3007,15.488,3367,8.902,3372,15.488,4610,16.173,5287,17.09,5291,15.488,5295,18.481,5296,17.09]],["keywords/918",[]],["title/919",[5297,1863.425]],["content/919",[23,3.121,32,4.334,161,7.674,771,8.205,1169,9.37,3367,11.702,4442,13.241,4480,15.244,5298,16.558]],["keywords/919",[]],["title/920",[5299,1723.121]],["content/920",[23,3.216,32,4.466,161,6.666,1278,10.421,1479,11.836,3367,11.91,5300,21.102]],["keywords/920",[]],["title/921",[5299,1723.121]],["content/921",[23,3.919,32,3.843,152,3.615,164,5.702,166,9.845,183,5.719,301,4.139,356,8.446,468,8.308,569,8.911,716,6.556,734,11.374,1074,12.344,1278,8.968,3367,12.385,5301,18.159]],["keywords/921",[]],["title/922",[4480,1386.998]],["content/922",[25,1.418,630,7.837,879,8.299,1646,14.189,3367,10.268,4480,15.867,5302,21.318]],["keywords/922",[]],["title/923",[806,897.578]],["content/923",[1278,10.977,2206,16.545,3367,10.707]],["keywords/923",[]],["title/924",[771,746.606]],["content/924",[771,8.906,773,8.759,3367,10.707]],["keywords/924",[]],["title/925",[630,685.004]],["content/925",[630,8.171,773,8.759,3367,10.707]],["keywords/925",[]],["title/926",[2353,1328.96]],["content/926",[6,2.129,1219,10.594,2353,15.685,3367,10.594]],["keywords/926",[]],["title/927",[5303,1561.679]],["content/927",[6,2.273,25,1.286,68,10.164,330,5.643,381,6.241,408,6.398,773,7.621,2117,12.682,2288,15.87,2334,15.159,3367,11.306,5303,19.671]],["keywords/927",[]],["title/928",[5304,1863.425]],["content/928",[277,12.684,1219,12.199,3367,10.594]],["keywords/928",[]],["title/929",[468,852.533]],["content/929",[23,3.091,32,4.292,34,4.643,161,6.407,468,9.278,549,10.658,1116,10.08,1444,9.596,3367,11.634,5298,16.396,5305,20.28]],["keywords/929",[]],["title/930",[5306,1863.425]],["content/930",[6,1.855,23,3.836,32,4.939,34,4.387,161,6.053,167,8.328,549,10.07,1116,9.524,3367,9.229,5291,21.095,5298,15.491,5307,16.768,5308,19.161]],["keywords/930",[]],["title/931",[5294,1723.121]],["content/931",[6,1.872,23,3.852,32,4.967,34,4.428,161,6.109,549,10.164,1116,9.612,3367,9.315,5296,17.883,5298,15.635,5307,16.924,5309,19.339,5310,19.339,5311,19.339]],["keywords/931",[]],["title/932",[5312,1863.425]],["content/932",[4,0.932,5,3.634,6,1.63,22,3.627,23,4.223,24,3.103,25,0.598,32,4.315,34,3.854,35,2.578,36,4.69,37,2.826,45,2.55,51,2.151,52,2.477,72,4.279,161,2.84,171,2.348,176,3.281,186,2.657,187,5.525,193,3.602,198,3.691,201,3.472,224,2.726,230,2.84,271,3.189,297,2.55,308,4.473,330,2.161,355,3.543,356,4.182,373,2.318,375,4.69,407,4.384,408,2.974,455,4.304,458,4.182,507,5.591,549,4.725,572,3.211,600,4.835,630,3.305,659,4.135,674,3.293,742,11.158,758,3.888,765,2.946,772,3.729,773,3.543,827,5.525,944,5.043,1116,4.469,1628,5.289,1793,7.867,1827,5.043,1872,7.432,1965,6.291,2079,5.136,2085,8.313,2121,5.525,3367,11.432,4028,8.129,4029,4.69,4032,7.867,4611,8.313,5285,8.313,5298,7.268,5307,7.867,5313,8.99,5314,13.819,5315,13.819,5316,13.819,5317,8.313]],["keywords/932",[]],["title/933",[1276,986.75]],["content/933",[]],["keywords/933",[]],["title/934",[198,418.827,224,475.386]],["content/934",[4,1.683,23,4.253,32,2.361,34,2.554,35,3.199,44,4.523,45,3.165,69,3.483,124,4.178,151,6.898,152,2.221,174,6.632,198,4.339,222,3.042,224,6.779,225,3.999,241,7.119,246,3.525,467,9.038,490,4.433,556,3.985,561,5.249,571,7.316,572,3.985,765,3.657,843,5.05,901,6.2,1040,7.117,1309,5.249,1704,7.025,1916,10.317,2023,5.44,2106,6.434,2121,6.857,2495,7.025,2496,8.121,2953,7.316,3174,7.543,3367,7.824,3739,9.35,3756,9.02,4421,9.02,4458,9.35,4620,14.61,4705,10.317,4876,9.763,5318,9.02]],["keywords/934",[]],["title/935",[35,534.362]],["content/935",[4,1.882,33,2.92,35,7.048,65,5.952,88,7.743,204,8.592,224,7.796,361,10.186,474,10.473,879,7.07,942,10.911,2203,11.908,2568,12.707,3446,16.792,4643,14.234,5319,18.159,5320,16.792]],["keywords/935",[]],["title/936",[765,610.733]],["content/936",[4,1.985,25,1.552,152,3.815,189,9.784,193,7.677,217,6.845,222,5.225,224,5.81,590,8.17,674,7.018,695,9.463,765,8.586,1224,13.593]],["keywords/936",[]],["title/937",[151,483.714,4620,1195.939]],["content/937",[151,6.137,174,11.825,224,6.032,572,7.106,590,8.482,716,7.182,861,9.253,901,7.594,1040,12.689,1192,12.372,2512,16.672,3367,9.582,4620,15.174,5321,19.893]],["keywords/937",[]],["title/938",[435,852.533]],["content/938",[65,6.647,174,12.055,219,7.538,271,7.194,435,11.05,765,6.647,861,9.433,1444,9.596,2079,11.585,2496,14.763,4458,16.996]],["keywords/938",[]],["title/939",[33,202.738,224,475.386]],["content/939",[23,4.105,32,4.58,33,2.799,34,3.887,35,4.868,124,6.357,154,6.24,164,5.331,198,4.535,224,7.608,496,6.859,765,5.564,768,9.697,780,8.989,1098,13.306,1169,7.766,1337,14.226,2121,10.432,5322,21.643,5323,16.975]],["keywords/939",[]],["title/940",[151,574.895]],["content/940",[]],["keywords/940",[]],["title/941",[23,238.957,183,493.826]],["content/941",[6,1.699,23,2.674,116,7.246,154,6.45,161,5.543,164,7.976,183,6.961,224,5.32,330,4.219,356,8.162,468,8.028,545,4.86,630,6.45,722,8.838,736,6.571,787,8.504,5324,17.547,5325,23.487,5326,17.547,5327,17.547,5328,17.547]],["keywords/941",[]],["title/942",[787,903.071]],["content/942",[4,1.865,23,3.423,32,3.81,33,2.328,34,4.122,35,5.162,152,3.584,161,5.687,162,7.939,224,5.458,425,6.476,480,8.08,737,6.052,765,5.9,787,8.724,806,8.671,1278,8.89,2023,8.778,3778,10.816,3781,11.483,4515,11.196,4663,14.554]],["keywords/942",[]],["title/943",[5329,1723.121]],["content/943",[4,1.614,23,3.12,32,3.297,34,3.567,35,4.467,88,5.342,152,4.553,155,4.644,161,4.921,162,5.507,224,4.724,225,5.585,278,4.194,382,8.011,385,5.706,458,7.246,474,8.985,556,5.565,569,7.645,787,9.922,806,7.504,858,7.847,901,5.947,993,7.504,1169,10.462,1204,8.011,1278,7.693,1337,13.056,1417,8.516,1856,11.34,1859,13.633,2779,9.574,3778,9.36,3781,9.937,4515,9.689,5329,14.406,5330,15.579]],["keywords/943",[]],["title/944",[4252,1630.706]],["content/944",[4,1.343,23,4.068,32,2.743,34,2.968,35,5.183,61,6.971,68,6.812,69,4.046,103,5.776,152,4.143,154,6.644,161,6.575,164,4.07,201,5.006,225,4.646,301,2.954,381,4.183,490,5.15,543,4.8,545,3.59,572,6.457,736,4.854,772,5.376,787,10.912,792,7.475,1149,11.343,1278,8.926,1377,11.472,1479,7.27,1779,8.911,1796,7.875,2023,6.321,2301,8.268,3196,14.168,4252,15.818,4515,11.242,5331,12.962,5332,12.962,5333,12.962,5334,11.986,5335,10.863]],["keywords/944",[]],["title/945",[5336,1863.425]],["content/945",[4,1.976,14,5.266,23,4.21,32,4.035,34,4.366,62,6.001,63,3.072,125,5.543,152,3.796,161,4.425,164,4.399,177,7.203,201,5.41,293,3.921,381,4.52,427,5.149,468,9.918,490,5.566,543,7.061,572,5.004,771,5.612,792,8.078,1155,9.471,1204,7.203,1278,10.706,1377,8.919,1479,7.857,3196,14.947,5337,19.068,5338,14.007,5339,14.007,5340,14.007,5341,14.007]],["keywords/945",[]],["title/946",[5342,1630.706]],["content/946",[23,3.498,32,3.946,34,4.269,35,5.347,152,3.712,161,5.891,162,6.591,224,5.654,291,8.928,787,9.037,806,8.982,1169,8.531,1278,9.208,2000,13.879,2058,11.894,3778,11.204,4515,11.597,5335,15.627,5343,17.243,5344,18.646]],["keywords/946",[]],["title/947",[4253,1723.121]],["content/947",[23,4.269,32,3.178,34,3.438,35,5.73,63,3.293,69,4.688,86,6.068,88,5.149,152,2.99,154,5.52,161,4.744,201,5.8,272,6.403,373,5.153,512,6.147,806,7.233,1278,9.868,1377,9.347,1479,8.423,3196,15.663,3778,9.023,3781,9.579,4515,12.428,5334,13.886,5335,12.585,5342,17.487,5345,15.017]],["keywords/947",[]],["title/948",[5346,1723.121]],["content/948",[9,6.081,23,3.862,32,2.813,34,3.043,35,3.812,46,4.303,76,7.901,88,6.307,147,8.479,148,7.666,152,3.662,164,5.776,189,6.787,201,5.134,225,4.765,229,7.456,373,5.87,452,6.148,464,9.894,484,7.456,545,3.682,630,4.886,785,6.432,1166,8.717,1278,6.564,1298,7.987,1377,8.604,1417,7.266,1697,7.524,1796,8.076,2252,8.076,2381,9.676,2671,8.717,2769,10.139,2779,8.169,4419,12.292,4515,8.267,5342,20.913,5347,12.292,5348,11.14,5349,13.292,5350,18.394,5351,22.762]],["keywords/948",[]],["title/949",[642,834.662]],["content/949",[4,1.915,23,3.775,32,3.911,34,4.231,152,3.679,224,5.604,493,11.494,642,11.096,805,12.119,861,8.596,901,7.055,1049,11.358,3174,12.496,4652,12.933,5352,17.09,5353,18.481,5354,18.481,5355,18.481]],["keywords/949",[]],["title/950",[800,1303.973]],["content/950",[4,1.614,23,3.702,35,4.467,151,4.806,152,5.023,161,4.921,164,6.429,172,8.985,222,4.248,224,4.724,273,3.416,481,8.588,557,6.19,642,10.243,736,7.667,804,7.55,861,7.246,862,9.81,901,5.947,1417,11.191,3564,11.11,3778,9.36,4766,13.633,5352,14.406,5356,15.579,5357,15.579,5358,20.473,5359,18.932,5360,15.579]],["keywords/950",[]],["title/951",[4176,1561.679]],["content/951",[23,3.986,32,4.035,34,3.207,53,5.917,62,6.001,63,3.072,68,7.362,69,4.373,88,4.803,152,4.633,161,7.352,172,8.078,188,7.857,201,5.41,215,7.362,373,3.612,556,5.004,557,5.566,642,8.541,771,8.686,800,9.802,804,6.788,809,6.917,894,5.368,1085,11.739,1169,6.409,1417,10.423,1614,11.882,2117,9.186,2321,8.82,2768,9.802,2769,10.685,4176,11.739,5361,14.007,5362,14.007,5363,14.007,5364,14.007]],["keywords/951",[]],["title/952",[5365,1561.679]],["content/952",[4,2.254,22,5.71,23,3.836,25,1.138,45,4.855,111,6.458,151,5.28,152,3.407,158,10.777,164,5.374,198,4.572,217,7.771,224,5.189,458,7.961,3726,10.917,5365,14.343,5366,14.343,5367,18.233,5368,15.826,5369,15.826,5370,15.826,5371,17.115,5372,15.826,5373,14.977]],["keywords/952",[]],["title/953",[5366,1561.679]],["content/953",[4,1.95,22,6.553,23,2.868,33,2.433,68,9.888,116,7.77,151,5.805,152,3.746,164,5.908,169,16.465,217,6.721,224,5.705,716,6.793,787,9.118,4468,16.465,5367,19.344,5374,18.815]],["keywords/953",[]],["title/954",[468,852.533]],["content/954",[6,1.838,23,2.894,34,4.347,134,10.746,152,3.78,166,10.294,198,5.072,224,7.037,271,6.735,407,9.258,468,11.469,493,11.808,765,6.223,2779,11.668,5375,18.986,5376,18.986]],["keywords/954",[]],["title/955",[1726,1002.228]],["content/955",[2,6.593,6,2.175,34,4.122,183,5.67,184,3.904,191,5.412,198,4.809,224,7.422,427,6.618,452,8.327,468,8.236,569,8.834,572,6.43,607,9.76,809,8.89,843,8.148,1332,9.682,1337,15.087,2783,10.937,3320,14.111,5377,18.002,5378,18.002]],["keywords/955",[]],["title/956",[23,206.245,5379,1353.247,5380,1353.247]],["content/956",[34,5.034,46,5.632,51,4.164,64,11.765,69,5.432,111,6.566,151,5.368,164,6.904,182,3.472,192,5.85,224,6.666,281,8.525,373,4.487,413,9.012,468,11.027,745,9.512,1111,11.963,1726,11.825,5381,17.4,5382,21.986,5383,17.4]],["keywords/956",[]],["title/957",[5384,1863.425]],["content/957",[23,3.121,32,4.334,124,7.669,161,7.674,427,7.528,572,7.316,1257,9.37,1276,10.845,2303,11.015,5385,20.48]],["keywords/957",[]],["title/958",[3769,1421.376]],["content/958",[4,1.369,6,1.279,7,5.717,10,5.226,22,3.466,23,2.791,25,1.218,33,2.935,45,3.747,51,3.161,149,5.479,151,4.075,154,6.732,198,6.064,224,6.374,271,4.685,301,4.174,311,5.658,366,6.362,425,6.588,427,6.732,452,6.109,458,6.144,468,8.378,469,14.355,572,4.718,694,6.565,703,7.843,716,6.612,763,6.744,843,5.978,901,5.042,1058,6.84,1169,6.043,1178,8.931,1276,11.132,1891,9.243,2062,12.189,2252,8.025,3863,17.618,3864,11.069,5318,10.679]],["keywords/958",[]],["title/959",[843,843.452]],["content/959",[]],["keywords/959",[]],["title/960",[782,1096.24]],["content/960",[22,4.723,23,4.182,24,7.16,25,0.857,32,2.726,33,1.666,34,2.949,35,5.161,37,2.163,50,7.101,54,7.822,124,7.768,151,3.974,174,10.698,198,3.441,241,4.788,275,4.289,286,7.916,355,5.076,408,4.262,467,8.352,600,13.165,764,7.042,776,8.566,777,5.74,779,8.574,879,5.015,981,10.281,1077,7.291,1256,10.186,1257,5.893,1400,10.095,1704,8.111,1814,8.111,1942,10.097,3263,10.796]],["keywords/960",[]],["title/961",[35,534.362]],["content/961",[1,7.819,4,2.29,6,2.14,33,2.858,35,6.338,37,2.946,84,9.364,88,7.578,89,11.049,116,7.246,122,7.702,204,8.303,219,6.522,408,5.806,432,9.222,474,10.12,590,7.481,716,6.335,773,6.915,843,7.942,2131,10.543,2203,11.507,2720,11.049]],["keywords/961",[]],["title/962",[37,312.842]],["content/962",[3,5.132,4,2.558,5,2.409,6,1.08,7,3.483,8,5.908,19,3.344,22,4.263,23,3.948,24,5.607,25,0.742,32,3.437,33,1.443,34,3.719,35,4.658,36,8.473,37,3.216,40,7.311,41,7.543,46,3.611,51,3.887,63,3.562,65,6.277,67,4.489,122,7.129,152,2.221,188,6.258,201,4.309,234,5.161,260,9.919,275,5.408,278,3.003,297,3.165,314,3.958,334,3.217,355,4.397,396,3.645,399,6.099,408,7.721,504,7.201,661,7.117,776,7.731,777,7.238,920,8.601,958,5.161,1261,7.117,2389,9.35,5386,10.317,5387,15.02,5388,11.157,5389,10.317]],["keywords/962",[]],["title/963",[1400,1045.231]],["content/963",[4,2.004,14,7.27,33,2.501,171,5.05,193,7.748,222,5.273,224,5.864,480,8.444,674,7.083,737,6.502,773,7.621,1400,13.166,2354,16.207,4455,16.924,5390,19.339]],["keywords/963",[]],["title/964",[1256,1054.703]],["content/964",[7,4.463,8,7.57,12,4.985,19,4.285,33,1.849,51,3.421,58,5.236,69,4.463,70,3.486,88,6.629,99,6.811,116,7.984,124,5.354,140,11.206,171,5.048,198,3.819,204,6.764,219,7.186,222,3.898,246,4.516,264,6.351,298,7.015,301,3.258,311,6.124,427,8.627,432,10.161,438,5.354,504,6.338,506,7.751,736,8.788,1178,14.811,1205,11.206,1256,8.091,1257,6.54,1392,11.558,1398,9.002,1444,6.764,5391,14.296,5392,14.296]],["keywords/964",[]],["title/965",[981,1064.513]],["content/965",[4,1.677,25,1.396,33,2.714,44,4.506,54,7.034,62,6.933,63,4.603,124,6.061,171,4.226,177,8.322,180,7.445,183,6.611,215,11.031,228,7.068,246,5.113,271,5.741,273,4.603,382,8.322,401,7.249,514,7.524,543,5.993,545,4.483,648,10.191,706,8.264,981,11.99,982,8.636,1444,7.658,2172,10.943,5393,14.965,5394,16.184]],["keywords/965",[]],["title/966",[4214,1630.706]],["content/966",[1,5.602,14,4.725,20,5.631,23,3.568,24,6.107,25,0.836,32,3.744,33,1.625,34,4.051,35,5.87,37,2.97,63,2.757,67,5.058,69,5.523,88,7.019,124,8.32,154,4.621,171,5.345,198,4.726,203,6.375,296,9.357,382,6.464,396,5.78,427,6.503,484,7.051,487,7.916,531,6.872,776,8.42,779,11.775,843,5.69,1112,7.472,1298,7.553,1377,5.88,1398,7.916,1444,5.948,1648,8.796,1792,8.642,1796,10.748,1872,6.761,1983,9.15,2560,8.243,2950,11.001,4195,11.001,4197,11.001,4214,20.49,5395,12.57,5396,11.624]],["keywords/966",[]],["title/967",[5397,1723.121]],["content/967",[23,3.972,24,7.172,32,4.397,34,4.758,35,5.959,37,3.489,88,5.464,124,7.782,154,5.858,198,4.257,407,7.771,427,5.858,637,9.104,776,9.89,779,13.831,843,7.213,1726,12.436,4195,20.234,4197,13.946,5393,14.736,5397,19.215,5398,15.936]],["keywords/967",[]],["title/968",[5399,1723.121]],["content/968",[4,1.303,6,1.217,7,5.523,8,6.657,9,5.751,19,3.768,22,3.299,23,4,24,4.339,25,0.836,32,2.66,34,2.878,44,3.5,51,3.008,54,5.463,65,4.12,87,4.368,131,6.375,151,7.224,161,5.589,280,8.019,293,3.519,297,3.566,308,4.069,355,4.954,373,4.562,381,4.056,396,4.107,510,6.375,549,6.606,592,7.637,674,6.48,772,5.214,773,8.067,1074,6.872,1116,6.248,1377,5.88,1617,6.558,2334,18.353,3862,11.624,4146,11.624,5303,10.535,5399,11.624,5400,12.57,5401,12.57,5402,12.57,5403,12.57,5404,12.57,5405,12.57,5406,12.57,5407,12.57,5408,11.624]],["keywords/968",[]],["title/969",[901,711.307]],["content/969",[]],["keywords/969",[]],["title/970",[23,238.957,183,493.826]],["content/970",[116,8.457,154,7.528,161,6.47,164,6.431,183,6.45,230,6.47,356,9.526,722,10.315,843,9.27,5325,18.938,5409,20.48]],["keywords/970",[]],["title/971",[5365,1561.679]],["content/971",[4,2.142,6,2.002,22,5.426,23,3.723,25,1.052,33,2.045,45,4.487,111,5.968,124,5.923,151,4.879,152,3.149,158,9.959,164,4.966,172,9.121,174,9.401,198,4.225,217,7.386,224,4.795,458,7.356,480,5.689,737,5.317,1649,12.397,1690,11.279,3726,10.088,5365,13.254,5366,13.254,5367,17.328,5368,14.624,5369,14.624,5370,14.624,5372,14.624,5373,13.84,5410,15.815]],["keywords/971",[]],["title/972",[5366,1561.679]],["content/972",[4,2.081,22,6.302,23,3.061,33,3.105,151,6.196,164,6.307,217,7.174,4468,17.576,5367,20.125,5411,20.085]],["keywords/972",[]],["title/973",[2111,1240.307]],["content/973",[18,7.049,33,2.729,84,11.261,222,5.754,230,6.666,674,7.729,1268,10.929,1317,14.767]],["keywords/973",[]],["title/974",[3759,1460.68]],["content/974",[161,6.735,549,11.204,843,9.649,912,11.121,1116,10.596,3758,13.258,4040,14.189]],["keywords/974",[]],["title/975",[5412,1723.121]],["content/975",[4,1.523,22,5.17,23,4.082,33,3.069,46,4.758,161,4.644,164,6.186,172,8.477,189,7.506,301,3.35,373,5.08,381,4.743,456,17.239,549,7.725,972,9.639,1116,7.306,1155,13.319,1157,11.71,1427,7.844,1637,12.319,1814,9.256,2114,9.639,2281,9.784,2445,12.864,3770,14.662,3772,13.593,3963,15.026,5413,14.699,5414,14.699,5415,19.699,5416,14.699]],["keywords/975",[]],["title/976",[1726,1002.228]],["content/976",[2,6.427,6,2.14,24,6.057,33,3.385,34,4.018,161,5.543,183,5.527,184,3.805,191,5.275,198,4.687,427,6.45,452,8.116,468,8.028,549,9.222,572,6.268,607,9.514,1116,8.722,1332,9.438,1726,13.014,2783,10.661,5417,16.226]],["keywords/976",[]],["title/977",[468,852.533]],["content/977",[4,2.27,5,3.086,6,2.121,14,5.374,18,4.775,22,3.752,23,3.339,25,0.951,33,2.833,34,3.273,37,3.246,70,3.486,107,3.511,152,2.846,191,4.298,198,3.819,275,4.76,385,7.081,407,6.971,427,8.053,435,6.54,468,10.022,507,8.891,561,6.725,607,7.751,843,8.751,944,8.019,1656,12.868,1992,11.558,2502,7.106,2723,13.219,2779,8.786,5418,14.296,5419,14.296,5420,21.906,5421,13.219,5422,13.219]],["keywords/977",[]],["title/978",[5423,1723.121]],["content/978",[22,5.123,23,3.867,25,1.298,32,4.131,124,7.31,161,7.457,427,7.176,572,6.973,843,8.835,1257,8.931,2303,10.499,5423,18.05,5424,19.52]],["keywords/978",[]],["title/979",[224,564.997]],["content/979",[7,5.013,23,4.052,32,3.399,34,3.677,51,3.843,116,9.584,164,6.558,281,6.227,427,7.677,468,7.347,569,7.88,734,12.378,765,5.263,768,9.174,843,7.269,1170,8.2,1276,11.059,1987,12.249,2121,9.869,2495,10.112,2502,7.982,3431,14.85,3767,11.69,5425,16.059,5426,16.059]],["keywords/979",[]],["title/980",[107,214.787,180,402.245,185,211.234,264,253.505,315,284.809,622,354.85,1329,443.427]],["content/980",[]],["keywords/980",[]],["title/981",[310,538.773,315,387.69,1329,603.606,2628,907.934]],["content/981",[4,1.347,6,1.754,12,2.897,19,2.491,25,1.307,33,1.074,37,1.395,40,3.172,46,4.208,51,3.832,52,2.289,53,3.51,69,2.594,70,2.026,88,4.457,103,7.135,107,3.193,154,3.054,176,4.744,181,4.267,182,1.658,184,2.819,186,4.733,196,2.586,198,2.22,205,5.108,206,5.7,220,7.368,225,4.66,230,2.625,240,1.855,243,3.822,246,2.625,260,4.303,264,2.409,278,3.499,280,5.3,281,5.041,290,6.338,297,4.543,301,1.894,310,3.761,311,3.559,314,2.947,315,5.899,322,4.779,330,1.998,364,4.505,372,5.372,373,3.352,382,4.272,385,3.043,388,4.661,394,6.592,397,5.3,421,6.732,440,6.013,484,4.661,486,9.518,490,5.165,513,4.939,514,2.978,520,3.761,545,3.601,552,4.367,553,3.722,579,5.372,582,4.661,587,5.3,706,4.243,718,3.372,742,3.761,792,4.792,874,3.684,894,3.184,994,4.469,1053,6.513,1160,8.12,1189,9.959,1296,6.718,1329,8.12,1422,5.814,1564,5.3,1650,4.939,1713,4.505,1850,5.926,2025,6.718,2057,5.712,2089,5.449,2098,5.232,2130,5.449,2161,6.338,2303,4.469,2741,6.338,2876,7.271,3023,7.683,3190,7.683,3785,6.963,5427,8.309,5428,8.309,5429,8.309,5430,8.309,5431,8.309,5432,8.309,5433,8.309]],["keywords/981",[]],["title/982",[152,236.98,315,387.69,659,547.547,1329,603.606]],["content/982",[18,8.603,23,2.651,46,3.973,65,4.023,82,8.589,134,6.947,162,7.77,171,3.205,184,2.662,205,6.579,225,4.4,230,3.878,246,3.878,330,5.285,347,8.002,380,18.039,458,5.709,580,5.646,659,5.646,1024,5.774,1116,6.101,1177,14.261,1278,6.062,1310,7.148,1339,5.498,2131,7.375,2667,10.287,2692,16.238,2720,7.729,3642,18.422,5434,16.086,5435,18.685,5436,12.274,5437,12.274,5438,12.274,5439,12.274]],["keywords/982",[]],["title/983",[315,387.69,579,769.603,659,547.547,1329,603.606]],["content/983",[4,1.005,18,4.892,23,4.345,40,3.703,62,4.156,63,2.128,65,3.18,152,4.199,154,3.566,161,6.663,164,4.599,183,3.056,184,3.176,204,4.591,205,4.583,206,3.453,225,5.25,229,5.442,230,6.207,240,3.27,373,2.502,380,12.84,394,4.92,483,7.876,513,10.486,579,6.273,580,4.463,592,8.897,600,5.218,716,3.503,734,4.887,879,3.777,901,5.59,1074,5.303,1177,9,1309,4.564,1339,4.346,1479,8.214,1872,5.218,2303,5.218,3684,11.806,3764,7.062,4442,6.273,4485,7.844,5015,8.131,5440,12.815,5441,9.702,5442,9.702,5443,9.702,5444,8.971]],["keywords/983",[]],["title/984",[2886,1077.888,3684,942.051]],["content/984",[4,1.976,18,4.679,19,4.199,107,3.441,114,4.072,116,5.784,152,4.633,161,4.425,183,4.412,184,4.135,191,4.211,204,6.628,205,3.639,220,7.663,229,10.695,240,3.128,319,6.242,388,7.857,389,7.203,397,8.935,425,5.039,457,9.471,483,7.534,580,6.444,737,6.411,771,5.612,786,6.001,827,8.608,919,9.802,1024,6.59,1332,7.534,1339,6.274,1479,7.857,1811,10.196,1872,7.534,2303,7.534,2693,9.99,2717,10.685,2886,13.109,3684,15.441,3764,10.196,5440,12.258]],["keywords/984",[]],["title/985",[116,647.46,183,493.826]],["content/985",[10,5.433,25,0.913,49,6.459,79,7.271,116,9.983,181,3.658,183,4.325,184,2.978,205,6.281,220,8.158,240,3.066,293,3.843,301,3.129,314,4.871,315,4.472,319,9.561,330,3.301,373,3.541,375,7.163,381,4.431,388,7.702,398,5.142,455,6.574,580,6.316,616,9.608,716,4.957,734,9.474,741,8.342,912,7.163,1024,6.459,1332,7.385,1564,8.758,1872,7.385,2098,8.646,2424,11.101,2751,14.744,2886,12.931,3684,12.891,3951,9.608,5015,19.341]],["keywords/985",[]],["title/986",[6,131.019,240,302.163,3961,1184.242]],["content/986",[4,1.94,6,1.32,9,4.043,18,2.952,19,2.649,23,3.797,25,0.588,32,1.87,33,1.143,44,2.461,54,3.841,65,4.47,88,3.03,107,2.171,124,3.31,152,4.887,155,4.964,162,3.124,171,3.561,173,5.253,174,5.253,184,4.06,192,2.971,204,4.182,220,3.124,228,3.86,229,9.341,230,5.915,243,6.273,301,3.108,319,3.938,330,2.125,341,9.899,347,4.065,361,4.957,381,4.401,425,3.179,427,5.013,467,3.124,520,6.173,557,3.511,580,4.065,652,7.973,711,3.75,737,6.802,770,4.364,809,10.558,827,5.431,953,6.578,967,6.433,1024,4.158,1074,4.831,1114,4.513,1160,4.482,1169,4.043,1175,5.565,1177,5.431,1183,4.872,1257,4.043,1280,6.927,1283,7.406,1309,4.158,1339,3.958,1614,4.513,1831,7.406,1889,5.565,2146,6.433,2321,5.565,2330,11.026,2381,6.433,2444,5.369,2669,9.221,2677,9.543,2693,6.303,3684,8.194,3887,9.376,4063,8.172,4879,6.578,5202,8.172,5440,7.734,5445,8.838,5446,8.838,5447,8.838,5448,8.838,5449,8.838]],["keywords/986",[]],["title/987",[225,562.039,278,422.052]],["content/987",[4,1.039,18,8.326,23,3.422,54,4.359,67,4.035,69,3.131,88,5.148,152,3.583,154,6.615,155,2.989,162,3.545,171,2.619,181,4,184,2.175,198,4.011,205,5.191,225,8.049,228,4.38,230,3.168,240,2.239,241,5.581,267,8.405,301,3.422,330,2.411,380,16.345,387,5.841,388,5.625,455,4.802,483,5.394,484,5.625,661,9.577,772,4.16,857,5.157,1109,5.194,1113,7.3,1114,5.121,1116,4.985,1173,5.961,1220,5.729,1276,5.311,1309,9.399,1332,5.394,1339,4.492,1388,6.397,1438,12.138,2058,6.397,2079,5.729,2308,6.315,2598,7.65,3014,9.274,3564,7.152,3642,15.081,3859,7.465,3951,7.018,4421,8.108,5318,8.108,5434,13.883,5435,13.883,5444,9.274,5450,22.454,5451,17.995,5452,17.995,5453,10.029]],["keywords/987",[]],["title/988",[1342,1259.934]],["content/988",[4,1.263,5,0.578,6,0.817,14,1.848,18,2.82,19,0.803,22,1.29,23,4.329,25,0.738,32,2.785,34,2.256,44,1.897,46,0.867,51,1.176,54,3.669,65,0.878,69,2.127,73,1.368,116,4.07,122,1.176,124,4.929,147,3.136,148,3.929,151,0.826,152,3.545,154,3.623,161,3.113,162,2.408,164,3.484,167,2.137,171,2.574,172,1.545,173,1.592,180,2.261,181,1.31,183,1.548,184,4.054,185,2.039,192,0.901,193,1.97,198,0.716,201,1.035,205,1.77,206,1.75,220,3.484,222,0.73,224,0.812,225,1.762,228,1.17,229,1.502,230,0.846,240,2.477,241,2.532,246,0.846,264,0.777,281,1.906,293,0.75,301,1.924,307,3.929,311,1.147,315,1.601,319,1.194,330,1.182,335,1.91,347,5.607,356,4.584,364,1.452,373,1.268,381,2.199,387,1.56,388,1.502,397,3.136,398,1.841,400,1.206,425,1.769,427,1.807,452,1.239,455,1.282,458,2.287,467,4.653,490,1.953,513,2.922,516,1.377,520,1.212,557,2.707,580,4.534,590,1.142,600,1.441,616,1.874,630,0.985,645,2.892,648,1.687,652,6.302,711,1.137,734,2.476,735,2.213,736,1.003,737,2.838,741,1.627,745,1.464,758,2.126,771,3.382,772,1.111,806,1.29,809,6.019,861,1.246,879,1.043,886,2.434,894,1.026,901,1.022,910,2.741,950,3.272,958,1.239,1024,5.219,1055,1.331,1109,1.387,1114,6.223,1173,1.592,1176,1.53,1191,1.709,1220,1.53,1256,1.516,1257,4.509,1268,1.387,1276,1.418,1309,4.636,1317,1.874,1320,3.664,1332,2.644,1339,3.052,1342,4.607,1343,1.592,1345,4.237,1347,3.057,1350,2.043,1351,1.994,1353,5.71,1354,5.129,1359,2.043,1377,1.253,1479,2.757,1511,1.95,1526,1.464,1540,1.666,1564,3.136,1580,1.994,1602,1.627,1614,1.368,1726,1.441,1779,1.841,1803,1.994,1827,1.502,1872,3.664,1889,1.687,1993,1.811,2062,1.783,2203,1.757,2241,2.043,2303,2.644,2444,1.627,2502,2.444,2589,1.646,2669,1.811,2693,4.859,2720,1.687,2733,1.91,2751,2.1,2886,1.841,2912,1.666,2927,3.096,2979,1.811,3114,3.579,3560,1.95,3567,4.302,3569,2.477,3573,2.477,3575,2.344,3586,1.545,3642,7.075,3684,5.922,3709,2.245,3756,2.166,3758,3.057,3759,5.341,3764,1.95,3887,5.804,4051,1.757,4222,3.975,4349,1.91,4442,1.732,4638,4.546,4667,4.12,4822,1.592,4879,1.994,4989,2.477,5015,2.245,5037,2.477,5041,2.477,5128,2.477,5454,2.679,5455,2.679,5456,2.679,5457,2.679,5458,2.679,5459,2.477,5460,2.679,5461,2.679,5462,2.679,5463,2.679,5464,2.679,5465,2.679,5466,2.679,5467,4.916,5468,4.916,5469,2.477,5470,2.679,5471,2.679,5472,2.679,5473,2.679,5474,2.679,5475,2.679,5476,4.916,5477,4.916,5478,2.679,5479,2.679,5480,2.679,5481,2.679,5482,2.679,5483,2.679,5484,2.679,5485,2.679]],["keywords/988",[]],["title/989",[281,524.746,297,383.895,379,619.122]],["content/989",[4,2.101,12,5.352,22,4.028,25,1.348,33,1.985,44,4.274,45,4.354,51,4.851,62,6.575,63,3.366,69,4.791,171,5.928,177,7.893,184,4.923,201,5.928,246,4.849,281,8.803,373,5.855,379,7.022,427,8.345,504,6.805,716,5.541,782,9.03,1169,7.022,1256,8.688,1257,9.275,1547,10.216,2088,10.947,3758,9.546,3759,12.032,4040,10.216]],["keywords/989",[]],["title/990",[278,422.052,1377,733.4]],["content/990",[4,2.012,6,1.684,12,3.306,19,2.842,23,3.481,25,0.631,67,3.815,79,5.021,86,3.831,111,3.578,122,4.161,125,3.752,152,3.866,164,4.519,166,5.14,184,3.121,205,3.739,222,2.585,229,5.318,230,6.135,240,2.117,278,4.682,287,4.713,301,2.161,310,4.291,334,2.734,347,4.361,356,4.41,427,5.29,446,7.057,455,4.539,457,6.411,463,6.762,474,5.468,476,5.76,568,5.578,572,3.387,580,8.001,652,8.328,734,4.775,737,6.529,745,5.183,771,3.799,919,6.635,1024,4.46,1048,7.665,1058,7.453,1113,6.902,1204,4.875,1220,8.221,1332,7.74,1339,7.791,1377,11.007,1547,6.311,1779,9.894,1889,5.97,1890,7.432,1988,7.665,2062,9.579,2175,7.057,2179,7.232,2239,12.662,2429,10.264,2502,4.713,2767,8.767,2978,8.297,3280,11.635,3746,7.946,4109,8.297,4917,11.635,5064,13.308,5486,9.481,5487,9.481,5488,9.481,5489,8.767,5490,9.481,5491,9.481,5492,9.481,5493,9.481]],["keywords/990",[]],["title/991",[932,847.955]],["content/991",[4,1.967,184,4.117,205,6.514,206,6.758,220,8.205,330,4.565,361,10.65,413,9.833,737,6.383,939,15.35,1175,11.956,1889,11.956,2058,12.111,2693,13.541,2728,14.482,2771,14.482]],["keywords/991",[]],["title/992",[4832,1328.96]],["content/992",[4,2.187,151,6.51,161,6.666,183,6.646,184,4.576,252,8.183,1342,14.268,4832,15.05]],["keywords/992",[]],["title/993",[183,586.914]],["content/993",[23,3.745,124,7.274,152,3.867,164,7.717,183,6.118,184,4.767,285,9.896,347,6.622,373,5.009,455,6.892,652,9.3,716,7.012,734,12.377,772,5.971,1024,6.772,1175,9.064,1257,8.886,1309,6.772,1339,6.448,1377,6.733,2088,10.266,4349,10.266,4832,10.266,5359,17.961,5494,14.395,5495,14.395,5496,14.395,5497,14.395,5498,14.395,5499,19.423,5500,14.395]],["keywords/993",[]],["title/994",[4878,1561.679]],["content/994",[34,5.17,49,8.543,107,4.46,161,5.737,184,5.576,301,4.139,361,10.186,458,8.446,464,13.516,549,9.543,786,9.673,1116,9.026,1444,10.685,2088,12.951,3196,14.234,4349,12.951,4878,15.218,5501,18.159]],["keywords/994",[]],["title/995",[5502,1723.121]],["content/995",[4,1.799,5,1.661,6,0.745,14,4.6,18,2.57,19,2.307,23,3.817,25,0.512,32,1.628,34,5.026,54,3.344,124,6.5,125,3.045,148,10.01,149,5.075,152,1.532,155,2.294,161,2.431,164,4.783,176,2.808,181,2.05,182,2.441,183,3.854,184,4.587,185,2.956,196,2.395,205,1.999,229,8.544,264,5.032,281,7.345,301,3.956,315,6.889,361,4.316,373,3.928,381,2.483,402,4.438,413,6.337,427,2.829,499,8.005,545,2.131,549,6.431,557,3.057,581,5.193,713,7.911,716,2.778,758,3.328,886,5.441,1090,9.333,1112,4.574,1116,9.416,1134,4.355,1169,3.521,1204,6.292,1256,6.926,1444,3.641,1511,5.601,1726,6.581,1743,9.333,1803,5.728,1811,5.601,2088,5.488,2251,7.116,2707,5.87,2979,10.299,3751,11.315,3759,9.591,4878,15.875,5396,7.116,5502,14.085,5503,7.695,5504,7.695,5505,7.695,5506,7.695,5507,7.695,5508,7.695,5509,7.695,5510,7.695,5511,7.695,5512,12.236,5513,7.695,5514,7.695,5515,12.236,5516,7.695,5517,7.695,5518,7.695,5519,7.695,5520,7.695,5521,7.695]],["keywords/995",[]],["title/996",[2751,1460.68]],["content/996",[4,1.556,20,6.726,23,3.045,40,5.732,116,6.201,148,8.661,164,4.716,173,8.927,177,7.722,184,3.257,205,6.22,220,7.064,240,3.353,265,5.402,301,3.423,315,4.891,330,4.804,373,3.873,425,5.402,520,6.797,716,5.422,751,12.28,1140,11.178,1339,6.726,1511,10.931,1526,10.923,1564,9.579,1648,10.509,2088,10.71,2560,9.848,2751,17.603,2886,10.324,3551,12.141,3606,13.886,3684,9.023,5016,12.141,5522,19.982]],["keywords/996",[]],["title/997",[4349,1328.96]],["content/997",[34,4.735,156,10.952,161,6.534,184,4.485,191,6.218,549,10.87,1116,10.28,1143,13.373,4349,14.751,5523,20.683]],["keywords/997",[]],["title/998",[3952,1506.563]],["content/998",[23,3.061,34,5.498,184,5.207,373,5.18,568,11.816,2241,15.32,3561,15.32,3952,16.238,5524,20.085,5525,20.085,5526,20.085]],["keywords/998",[]],["title/999",[468,852.533]],["content/999",[4,1.915,18,6.173,34,4.231,152,3.679,154,6.794,184,5.764,224,5.604,468,8.455,809,12.233,3092,16.992,3561,14.097,4349,13.18,5527,18.481,5528,18.481,5529,18.481]],["keywords/999",[]],["title/1000",[5530,1863.425]],["content/1000",[23,3.061,124,7.522,161,6.345,184,5.571,464,14.95,516,10.328,735,9.043,2783,12.202,4349,14.324,5531,20.085,5532,18.572]],["keywords/1000",[]],["title/1001",[5533,1863.425]],["content/1001",[23,3.249,124,7.983,161,6.735,184,4.623,3952,17.235,5532,19.713,5534,21.318]],["keywords/1001",[]],["title/1002",[171,353.369,241,503.001,5535,1251.356]],["content/1002",[5,2.144,23,4.224,25,0.661,32,3.786,34,3.413,37,1.668,44,2.766,54,4.317,88,3.406,152,3.562,164,3.119,171,3.892,184,4.852,193,3.98,220,3.511,224,5.425,229,5.572,230,3.138,240,2.218,241,6.651,246,3.138,301,2.264,347,9.801,381,3.205,652,7.137,827,10.996,886,6.391,1024,8.417,1075,7.394,1177,6.105,1309,7.013,1342,10.079,1347,9.271,1444,4.7,1961,5.905,2303,5.342,2502,4.937,3037,13.784,3174,10.079,3684,13.942,3951,6.951,4822,8.861,5535,13.784,5536,9.933,5537,19.884,5538,9.933,5539,9.933,5540,17.892,5541,9.933,5542,9.933]],["keywords/1002",[]],["title/1003",[5543,1723.121]],["content/1003",[23,3.836,30,7.275,32,3.272,51,3.7,121,9.291,124,5.791,152,3.079,155,4.609,184,4.941,281,8.835,373,3.988,425,5.563,427,5.684,706,7.896,912,12.634,1147,8.524,1332,8.317,1342,10.455,1787,12.121,2241,11.795,2705,12.959,2744,13.532,3758,12.671,3952,12.502,4040,10.292,4822,9.192,5543,14.299,5544,18.839,5545,15.463,5546,15.463,5547,15.463]],["keywords/1003",[]],["title/1004",[184,340.004,3367,755.218]],["content/1004",[6,2.393,18,4.44,25,0.884,45,3.771,49,6.253,88,4.558,152,4.532,162,4.699,184,4.574,220,6.502,224,4.03,230,4.199,297,5.218,315,4.329,347,9.703,364,7.207,398,4.978,438,4.978,516,6.835,545,3.682,569,9.026,572,4.748,580,9.703,771,5.326,809,6.564,886,4.748,1024,6.253,1111,9.138,1329,6.741,1966,9.302,2353,9.48,2900,8.847,3367,12.442,4480,9.894,4482,11.14,5303,11.14,5343,12.292,5548,13.292,5549,13.292,5550,13.292,5551,13.292,5552,13.292]],["keywords/1004",[]],["title/1005",[184,340.004,1024,737.602]],["content/1005",[5,4.099,6,1.838,25,1.263,40,7.247,63,4.164,184,5.033,205,4.933,220,6.712,240,4.239,329,8.461,347,8.734,356,8.831,514,6.806,1024,11.794,1189,11.808,3092,14.132]],["keywords/1005",[]],["title/1006",[25,89.993,315,440.762,650,780.453]],["content/1006",[4,1.759,5,3.665,14,6.381,97,5.959,107,4.17,181,5.767,185,5.228,240,3.79,263,13.724,310,7.684,315,5.529,405,8.729,452,7.852,568,9.986,632,9.986,1042,10.975,1151,10.975,1173,10.091,1610,13.461,1614,8.668,1634,15.435,1848,13.306,1961,10.091,2125,13.724,3173,15.697,3243,14.226,5553,16.975,5554,14.855]],["keywords/1006",[]],["title/1007",[69,331.64,184,230.384,224,322.118,246,335.617,1434,810.359]],["content/1007",[5,1.462,6,1.069,18,2.261,23,4.2,25,0.929,32,4.028,33,0.875,34,3.199,44,1.885,107,1.663,148,3.904,151,4.311,152,1.348,154,4.057,155,2.018,161,2.139,162,2.393,164,3.466,166,5.984,167,4.797,171,1.768,181,2.941,184,4.353,185,2.666,191,2.035,198,1.808,206,2.41,224,3.346,240,1.512,243,3.114,246,2.139,278,1.822,288,3.343,314,2.401,315,2.205,330,2.653,335,4.828,347,5.077,348,3.832,381,2.185,392,3.149,499,3.558,520,4.996,539,3.149,590,2.886,630,2.489,632,3.983,703,2.526,708,4.263,716,5.044,736,2.535,737,2.276,771,2.712,809,3.343,876,6.864,886,3.942,914,3.185,957,4.113,1024,5.192,1039,5.164,1134,3.832,1141,4.439,1170,3.457,1173,4.024,1268,3.506,1325,4.377,1342,4.577,1347,4.21,1366,9.658,1388,4.318,1392,5.473,1589,5.039,1610,4.21,1634,4.828,1646,4.506,1663,3.764,1697,3.832,1798,5.674,1850,15.44,1920,6.26,1931,4.263,2515,5.039,2714,4.654,2783,4.113,2809,6.26,3243,13.506,3790,7.723,4822,8.305,4899,5.924,5554,12.227,5555,11.037,5556,6.77,5557,13.972,5558,6.77,5559,11.037,5560,6.77,5561,6.77,5562,11.037,5563,11.037,5564,6.77,5565,6.77,5566,6.77,5567,16.115,5568,11.037,5569,6.77,5570,6.77,5571,6.77,5572,6.77,5573,6.77,5574,11.037,5575,6.77,5576,6.77,5577,6.77,5578,6.77,5579,6.77,5580,6.77]],["keywords/1007",[]],["title/1008",[315,387.69,1850,848.901,5581,1190.303,5582,1190.303]],["content/1008",[18,7.267,33,2.213,44,4.765,65,5.609,161,5.407,166,9.279,177,8.8,184,4.718,185,4.134,301,3.901,310,7.747,379,7.83,385,6.268,401,7.666,474,9.87,520,7.747,569,8.398,648,10.777,716,6.179,1042,11.066,1204,8.8,1366,14.977,1850,15.516,2714,11.766,3243,14.343,3684,10.283,5583,17.115,5584,17.115]],["keywords/1008",[]],["title/1009",[107,235.629,182,191.399,185,231.733,315,312.447,650,553.247,667,731.722]],["content/1009",[6,1.025,18,5.222,19,3.174,37,1.778,44,4.353,65,3.471,70,5.004,88,3.631,92,6.665,107,2.601,114,4.545,134,5.994,162,5.526,164,3.325,171,2.765,181,2.822,184,4.968,185,3.777,186,3.13,190,7.313,191,4.7,198,2.829,203,5.37,246,3.345,264,4.532,272,4.515,278,2.851,315,3.449,348,5.994,392,4.926,393,5.696,396,3.46,397,6.755,452,4.898,484,5.94,564,4.898,575,9.792,581,4.494,693,7.002,716,5.644,718,4.297,719,7.28,740,4.926,861,4.926,886,3.783,893,4.453,923,6.944,971,6.295,1037,7.552,1119,6.107,1134,5.994,1143,6.847,1156,11.925,1160,5.37,1192,6.586,1268,5.484,1325,6.847,1595,6.586,1610,6.586,1729,8.077,1765,6.755,1846,7.709,1850,7.552,1856,7.709,1926,7.41,1984,6.755,2018,8.301,2134,8.875,2138,9.267,2525,9.267,2588,7.709,2708,8.301,2717,8.077,2783,6.434,3162,9.792,3274,8.875,4349,7.552,4595,8.875,5228,9.792,5554,9.267,5585,9.792,5586,10.59,5587,10.59,5588,10.59,5589,10.59,5590,10.59]],["keywords/1009",[]],["title/1010",[3769,1421.376]],["content/1010",[79,9.371,111,6.677,131,8.974,164,5.557,166,9.594,184,4.819,301,4.033,373,4.564,463,12.621,598,16.423,711,7.51,1024,8.325,1309,10.453,1377,8.278,1588,13.871,1902,10.875,2344,14.307,3274,18.622,5591,22.22,5592,17.696,5593,17.696]],["keywords/1010",[]],["title/1011",[152,312.153,185,378.748]],["content/1011",[]],["keywords/1011",[]],["title/1012",[45,337.67,111,449.151,152,236.98,185,287.538]],["content/1012",[22,6.091,23,3.98,25,1.263,45,5.386,111,7.164,152,4.991,185,5.607,438,7.11,3726,12.111,5594,18.986,5595,18.986,5596,18.986]],["keywords/1012",[]],["title/1013",[45,337.67,447,759.279,843,538.773,1276,630.307]],["content/1013",[5,4.796,14,6.65,23,3.882,24,4.339,32,2.66,33,2.647,34,2.878,35,3.605,36,9.229,37,2.97,45,3.566,62,5.385,63,2.757,68,6.606,124,8.32,136,7.25,152,4.835,171,4.62,185,5.867,198,4.726,224,5.364,381,4.056,391,6.331,427,4.621,447,13.058,600,9.515,765,4.12,776,5.983,782,7.395,786,5.385,843,9.266,1276,6.657,1617,6.558,2495,7.916,4320,20.543,5597,12.57]],["keywords/1013",[]],["title/1014",[5598,1863.425]],["content/1014",[4,1.512,6,1.898,23,4.211,32,4.149,33,2.535,34,4.489,88,5.005,152,4.408,161,4.611,162,5.16,185,5.348,198,3.899,224,4.426,549,7.671,771,8.87,1116,7.255,1169,6.678,1204,7.506,1796,8.868,2927,12.346,3778,11.78,3781,12.506,4741,11.134,5599,16.431,5600,14.596,5601,14.596]],["keywords/1014",[]],["title/1015",[5602,1863.425]],["content/1015",[6,1.713,23,4.082,32,3.745,33,2.288,34,4.052,152,3.523,161,5.59,185,4.275,198,4.727,224,5.366,549,9.3,771,7.09,1116,8.796,1169,10.166,2058,11.288,2927,11.143,3778,10.633,3781,11.288,4741,13.498,5599,14.831,5603,17.696]],["keywords/1015",[]],["title/1016",[5604,1630.706]],["content/1016",[23,3.032,32,4.21,34,4.555,161,6.284,549,10.455,642,8.91,771,7.97,1116,9.888,1169,9.101,4442,12.862,4741,18.212,5599,16.672,5605,18.395]],["keywords/1016",[]],["title/1017",[5604,1630.706]],["content/1017",[23,3.98,32,4.018,152,3.78,161,5.998,164,7.289,183,5.98,360,10.846,734,9.563,1169,8.686,4442,15.007,4741,14.482,5604,16.615,5606,18.986,5607,18.986]],["keywords/1017",[]],["title/1018",[4741,1421.376]],["content/1018",[6,2.198,23,4.271,32,4.804,34,4.641,46,6.562,64,6.983,68,5.427,87,6.363,152,3.646,164,3.243,177,5.31,183,3.253,185,2.495,223,5.31,272,4.403,280,6.588,300,8.459,319,4.602,330,2.483,468,4.725,581,4.383,630,5.641,737,3.472,765,3.385,771,4.138,773,7.216,1278,5.1,2927,6.503,2942,8.095,3042,9.55,3629,7.517,3778,14.122,3781,11.681,4741,7.877,5335,8.655,5599,12.861,5605,9.55,5608,15.345,5609,15.345,5610,10.327,5611,10.327,5612,10.327,5613,15.345,5614,8.655,5615,10.327,5616,10.327,5617,10.327]],["keywords/1018",[]],["title/1019",[2377,1356.449]],["content/1019",[]],["keywords/1019",[]],["title/1020",[198,418.827,2377,1141.31]],["content/1020",[4,1.898,6,1.279,7,4.123,12,7.33,18,6.117,23,4.082,32,3.876,34,4.193,65,6.002,151,4.075,152,2.63,164,4.148,167,5.74,193,5.292,198,3.528,224,5.553,230,5.785,234,6.109,366,8.821,413,6.84,510,6.698,771,5.292,806,10.126,1276,9.698,1309,8.615,2203,13.786,2207,12.214,2216,15.416,2245,16.035,2249,10.353,3684,7.936,5618,13.208,5619,13.208,5620,13.208,5621,13.208]],["keywords/1020",[]],["title/1021",[4,140.222,67,544.489,2377,985.073]],["content/1021",[4,2.081,6,2.325,45,5.698,65,6.583,97,7.051,185,4.852,202,6.178,499,10.556,1560,13.808,1963,16.832,2377,14.62,5622,20.085]],["keywords/1021",[]],["title/1022",[6,92.877,60,357.9,166,520.104,184,208.027,389,493.273,5623,839.484]],["content/1022",[14,5.944,19,3.224,23,4.037,32,3.968,34,4.733,44,2.994,60,5.899,62,4.607,67,4.327,69,3.357,111,4.058,152,3.733,162,3.801,164,4.965,167,4.674,171,2.808,184,3.429,185,3.82,191,3.233,224,3.261,230,3.397,272,4.585,273,3.467,278,2.895,373,2.773,374,8.694,468,4.92,773,6.231,805,7.052,806,9.032,894,4.121,963,4.153,1086,6.953,1141,7.052,1175,14.504,1309,5.059,1402,7.828,1479,8.869,1614,10.556,2031,7.669,2043,7.828,2203,7.052,2216,6.953,2245,8.203,2249,8.429,2303,5.784,2377,7.828,2489,15.049,2779,6.609,5624,9.411,5625,10.754,5626,10.754,5627,9.944,5628,9.944,5629,10.754,5630,10.754,5631,9.944,5632,9.944,5633,10.754,5634,9.944,5635,10.754,5636,10.754]],["keywords/1022",[]],["title/1023",[1327,722.133,4038,1007.258,5623,1184.242]],["content/1023",[6,1.21,23,4.186,32,4.689,34,5.073,45,3.545,60,4.662,111,4.715,162,4.417,164,5.532,167,5.43,273,2.74,373,3.222,468,5.717,580,5.748,631,7.277,806,9.828,936,6.211,963,6.804,1309,5.878,1327,9.401,1614,8.995,2192,16.497,2203,8.194,2216,11.39,2245,9.531,2249,9.795,2303,6.72,2489,12.824,2779,7.679,4038,13.112,5624,10.935,5627,11.554,5628,11.554,5631,11.554,5632,11.554,5634,11.554,5637,12.495,5638,12.495,5639,12.495,5640,12.495,5641,12.495,5642,12.495,5643,12.495,5644,12.495]],["keywords/1023",[]],["title/1024",[6,92.877,114,278.869,152,190.987,366,462.071,2714,659.493,5623,839.484]],["content/1024",[4,1.481,6,2.272,23,4.103,32,4.966,34,5.373,152,4.361,155,4.261,164,4.489,167,6.213,224,4.335,240,3.192,520,6.471,716,5.161,741,8.685,771,5.728,806,10.552,910,5.752,1309,6.725,1359,10.904,2203,9.375,2216,12.5,2245,10.904,2249,15.155,2714,13.291,5624,12.51,5645,14.296,5646,14.296,5647,19.333,5648,14.296]],["keywords/1024",[]],["title/1025",[901,598.491,2377,1141.31]],["content/1025",[]],["keywords/1025",[]],["title/1026",[5649,1723.121]],["content/1026",[12,7.003,34,5.881,152,3.999,373,5.18,448,16.238,549,10.556,1116,9.983,2216,15.526,3770,14.95,5650,20.085]],["keywords/1026",[]],["title/1027",[1726,1002.228]],["content/1027",[34,4.599,154,7.383,425,7.225,843,9.091,1134,11.368,1251,14.62,1276,10.636,1633,11.474,1726,10.802,2216,15.526,2783,12.202,5651,20.085]],["keywords/1027",[]],["title/1028",[468,852.533]],["content/1028",[5,4.295,12,6.936,34,4.555,152,3.961,366,9.582,468,9.101,886,7.106,1272,14.481,2216,15.437,2227,17.408,3092,14.807,4043,17.408,5652,19.893]],["keywords/1028",[]],["title/1029",[4,140.222,754,1060.767,2377,985.073]],["content/1029",[]],["keywords/1029",[]],["title/1030",[1309,636.63,2216,874.956,5653,1251.356]],["content/1030",[7,5.669,9,8.308,12,6.332,51,4.345,70,4.428,88,6.226,151,5.602,191,5.459,281,7.041,301,4.139,373,4.683,452,8.399,459,13.851,543,6.725,592,11.032,650,10.473,663,10.01,886,6.487,1309,8.543,1332,9.767,1726,9.767,2216,11.741,3715,11.741,5653,16.792]],["keywords/1030",[]],["title/1031",[1309,636.63,1796,822.159,2216,874.956]],["content/1031",[53,7.539,125,7.062,278,4.804,361,12.53,373,4.603,455,8.545,584,12.068,785,5.443,1134,10.102,1309,11.472,1377,8.349,1548,11.385,1628,10.5,1697,10.102,1796,13.572,1803,13.285,1811,12.992,2197,13.99,2216,14.444,2893,16.504,5654,17.848]],["keywords/1031",[]],["title/1032",[131,538.737,711,450.843,889,718.317,1309,499.793,1633,606.904]],["content/1032",[53,7.738,107,4.5,131,9.289,148,10.565,181,6.05,182,3.655,205,4.76,224,6.884,230,5.787,373,4.724,375,9.556,464,13.635,499,11.932,674,8.316,711,7.774,1134,10.368,1309,10.681,2245,13.973]],["keywords/1032",[]],["title/1033",[230,303.048,499,504.155,674,351.353,1385,803.95,2216,620.238,5655,959.288]],["content/1033",[4,1.029,6,1.443,9,4.545,12,3.464,19,2.978,23,4.185,32,3.155,34,4.553,53,6.296,69,3.101,72,4.728,88,3.406,89,11.267,98,9.127,122,4.36,147,6.336,154,3.651,164,4.681,167,6.478,183,3.129,219,3.692,224,4.52,230,4.709,246,3.138,273,2.178,299,6.178,315,3.235,361,8.361,373,2.562,499,9.403,650,5.729,656,5.905,674,6.553,716,5.382,717,4.756,806,4.785,1000,5.342,1035,6.035,1298,5.968,1309,8.417,1552,6.829,1961,5.905,2117,6.514,2203,9.775,2216,15.003,2245,13.648,2692,6.951,5649,13.784,5656,9.933,5657,9.933,5658,17.892,5659,9.933,5660,9.933,5661,9.933,5662,9.933,5663,9.933,5664,9.933,5665,9.933,5666,9.933,5667,9.933,5668,9.933]],["keywords/1033",[]],["title/1034",[1278,920.243]],["content/1034",[]],["keywords/1034",[]],["title/1035",[787,903.071]],["content/1035",[23,3.032,34,4.555,35,5.705,151,6.137,152,3.961,154,7.313,224,6.032,787,11.571,3320,15.593,3778,11.953,3781,12.689,4515,12.372,4663,16.083]],["keywords/1035",[]],["title/1036",[642,834.662]],["content/1036",[23,3.557,32,4.055,34,4.387,151,5.911,152,4.647,154,7.044,224,5.81,600,10.306,642,11.274,806,9.229,861,8.912,3320,15.02,4165,13.408,5669,19.161]],["keywords/1036",[]],["title/1037",[151,574.895]],["content/1037",[]],["keywords/1037",[]],["title/1038",[]],["content/1038",[23,3.955,32,4.858,35,7.132,152,3.712,161,7.252,425,6.708,458,8.673,480,6.708,736,6.983,737,7.717,1690,13.298,5670,17.243,5671,16.318]],["keywords/1038",[]],["title/1039",[]],["content/1039",[23,4.111,34,3.489,35,4.369,151,4.701,152,3.034,161,4.813,164,6.336,183,4.799,301,3.473,330,3.663,407,7.43,545,4.22,557,8.987,656,11.993,716,5.501,734,7.674,735,6.861,1268,7.891,1425,16.909,2303,8.195,3855,13.334,5671,13.334,5672,24.078,5673,15.237,5674,20.176,5675,15.237,5676,20.176,5677,15.237]],["keywords/1039",[]],["title/1040",[3629,1356.449]],["content/1040",[4,1.602,23,4.123,34,3.54,35,6.534,87,5.373,151,4.771,164,7.155,183,4.87,381,4.99,496,6.248,557,8.095,584,10.455,772,6.414,1278,7.636,1423,13.532,1424,13.532,1425,12.959,1986,9.998,2206,11.51,3855,17.829,4684,12.502,4766,13.532,5670,14.299,5671,13.532,5678,15.463,5679,15.463,5680,15.463,5681,15.463,5682,18.839]],["keywords/1040",[]],["title/1041",[545,516.138]],["content/1041",[22,5.219,23,4.246,25,0.992,34,3.414,45,4.23,110,6.577,111,5.626,114,5.781,152,2.968,171,5.193,274,9.64,458,6.935,545,6.198,673,7.778,975,10.696,1300,9.148,1444,7.055,2927,12.523,3726,9.511,3865,13.048,3867,11.373,4956,14.476,5683,14.91,5684,13.787,5685,13.787,5686,13.787,5687,14.91]],["keywords/1041",[]],["title/1042",[1114,951.488]],["content/1042",[6,2.085,23,4.097,32,3.563,34,3.855,114,4.895,151,5.195,152,3.352,161,6.802,162,5.952,164,5.288,451,10.348,545,4.664,557,6.69,1268,8.72,1300,7.746,5688,16.838,5689,21.531,5690,21.531,5691,16.838,5692,21.531,5693,16.838,5694,15.57]],["keywords/1042",[]],["title/1043",[744,1386.998]],["content/1043",[6,1.805,23,3.79,34,4.269,35,5.347,152,3.712,171,4.869,272,7.95,280,14.642,468,8.531,975,10.029,2058,11.894,2303,10.029,2953,15.053,5682,21.226,5694,17.243,5695,18.646]],["keywords/1043",[]],["title/1044",[225,426.689,901,454.363,1298,715.187,2671,780.572]],["content/1044",[4,1.889,18,4.384,23,4.17,25,0.873,34,5.183,152,2.613,161,4.146,164,4.122,186,5.389,223,6.749,225,4.705,271,4.656,277,7.569,279,7.802,330,4.384,381,4.235,468,6.005,501,6.749,516,6.749,545,3.635,673,6.847,744,9.769,775,8.73,901,5.01,975,12.176,993,6.322,1114,6.702,1177,8.066,1268,6.797,1278,6.482,1300,9.638,1377,6.139,2089,8.607,2381,9.554,2671,8.607,3867,10.011,5348,11,5696,13.125,5697,13.125,5698,15.956,5699,12.137,5700,13.125]],["keywords/1044",[]],["title/1045",[5701,1863.425]],["content/1045",[18,5.861,23,4.074,32,5.12,34,5.06,124,6.571,134,9.932,161,5.543,164,5.51,975,9.438,1177,10.784,1278,8.666,1526,9.592,3876,14.187,5699,16.226,5702,17.547,5703,17.547,5704,22.102,5705,17.547,5706,17.547]],["keywords/1045",[]],["title/1046",[23,238.957,183,493.826]],["content/1046",[18,6.645,23,3.032,154,7.313,161,6.284,164,6.247,183,6.266,722,10.02,1268,10.302,1278,9.824,3876,16.083,4820,18.395,5707,19.893,5708,19.893,5709,19.893]],["keywords/1046",[]],["title/1047",[468,852.533]],["content/1047",[4,1.967,5,4.099,45,5.386,152,4.991,161,5.998,171,4.958,224,5.757,273,4.164,468,8.686,582,10.65,1134,10.746,1814,11.956,2502,9.437,3748,18.194,5710,18.986,5711,16.615]],["keywords/1047",[]],["title/1048",[468,486.049,545,294.262,736,397.855,785,323.976,2031,757.671]],["content/1048",[4,1.932,6,1.312,14,7.007,19,5.588,23,4.013,34,4.268,88,6.392,124,6.981,152,4.242,155,4.039,161,4.281,162,4.79,164,4.256,171,5.993,184,2.939,330,3.258,455,6.488,468,9.749,545,3.754,557,5.385,737,4.556,785,6.498,807,10.957,809,6.692,1086,8.762,1114,9.518,1300,6.234,1889,11.738,1993,9.163,2031,9.665,3887,12.815,4102,11.357,5459,17.238,5712,13.552,5713,13.552,5714,13.552]],["keywords/1048",[]],["title/1049",[809,920.243]],["content/1049",[18,6.119,23,3.931,34,4.194,122,8.04,124,6.86,164,5.752,557,7.279,734,9.227,809,9.047,1065,10.777,1257,8.381,1278,9.047,1345,11.393,4442,11.844,5711,16.031,5715,22.704,5716,18.319,5717,22.704]],["keywords/1049",[]],["title/1050",[809,920.243]],["content/1050",[23,3.681,34,4.643,124,7.595,557,8.058,809,10.015,1257,9.278,1268,10.503,4684,16.396,5711,17.747,5718,24.152]],["keywords/1050",[]],["title/1051",[5614,1561.679]],["content/1051",[4,1.395,6,1.304,23,4.131,32,3.927,124,5.042,161,5.863,171,3.516,217,7.586,277,7.765,381,4.345,510,6.828,515,6.649,572,6.629,737,4.527,809,6.649,975,7.242,1114,6.875,1257,6.16,1300,6.194,2378,11.783,2560,8.829,2900,8.962,2979,9.104,3367,6.485,3887,9.256,4365,11.783,4482,11.284,4515,11.542,4955,15.553,4956,13.509,5373,16.24,5719,11.783,5720,12.45,5721,13.464,5722,18.558,5723,18.558,5724,18.558,5725,13.464,5726,13.464,5727,13.464,5728,13.464]],["keywords/1051",[]],["title/1052",[5720,1723.121]],["content/1052",[4,1.626,9,7.181,23,3.498,32,3.322,63,3.442,88,5.382,152,4.096,161,6.5,217,5.607,425,5.647,427,7.563,451,12.644,482,8.58,500,10.984,572,5.607,714,10.447,880,15.693,901,8.761,1272,11.426,1278,10.16,1444,7.427,2719,17.243,2768,10.984,3058,11.973,3823,16.127,5614,13.154,5729,15.696,5730,15.696,5731,15.696,5732,15.696]],["keywords/1052",[]],["title/1053",[5733,1863.425]],["content/1053",[23,3.121,32,4.334,124,7.669,161,7.674,427,7.528,572,7.316,1257,9.37,1278,10.114,2303,11.015,5734,20.48]],["keywords/1053",[]],["title/1054",[4165,1303.973]],["content/1054",[]],["keywords/1054",[]],["title/1055",[642,834.662]],["content/1055",[23,4.105,32,3.592,152,3.38,154,6.24,164,5.331,171,4.433,198,4.535,223,8.729,224,5.147,273,4.746,481,9.358,493,10.557,543,6.286,642,10.673,787,8.227,804,10.489,975,9.13,1479,9.522,3174,11.478,4165,11.879,4652,15.145]],["keywords/1055",[]],["title/1056",[800,1303.973]],["content/1056",[23,4.228,32,4.752,35,4.306,152,2.99,171,3.921,246,6.313,273,5.25,341,8.927,543,5.561,556,5.364,642,10.059,736,5.624,800,15.715,804,9.684,818,11.178,975,8.077,1278,7.416,1417,8.209,2768,13.983,3174,13.511,4442,9.71,5735,15.017,5736,15.017]],["keywords/1056",[]],["title/1057",[805,1221.989]],["content/1057",[23,3.938,32,4.966,34,5.016,152,3.849,154,5.255,155,4.261,161,4.516,164,4.489,171,3.733,186,4.226,228,6.244,273,4.804,278,5.204,300,7.881,349,9.243,543,7.159,549,7.513,552,7.513,630,7.107,800,10.004,806,6.886,974,9.119,1116,7.106,1169,6.54,1278,9.548,1796,8.685,3357,16.919,4442,9.243,4561,13.219,4662,11.981,5737,12.51,5738,14.296,5739,19.333,5740,14.296,5741,14.296]],["keywords/1057",[]],["title/1058",[23,238.957,183,493.826]],["content/1058",[4,1.404,18,4.527,23,4.19,32,3.945,33,1.752,34,3.103,88,4.647,154,4.982,162,4.79,164,6.691,171,3.539,228,8.141,246,4.281,273,4.088,360,7.742,368,8.534,402,7.816,483,7.289,538,6.736,543,8.911,544,5.056,557,5.385,734,6.826,757,8.762,787,6.568,974,8.645,977,11.357,978,11.357,979,10.957,980,11.357,1147,7.47,1268,7.018,1320,7.289,1332,7.289,1579,10.957,1826,10.337,2783,8.233,4663,10.957,5742,13.552,5743,13.552,5744,13.552]],["keywords/1058",[]],["title/1059",[545,516.138]],["content/1059",[4,1.579,22,3.999,23,4.237,32,3.225,34,3.489,44,4.243,45,4.322,111,5.75,152,3.034,164,4.785,273,4.424,349,9.852,373,3.929,543,5.643,545,6.265,673,7.949,804,7.384,901,5.816,974,9.719,975,12.166,1278,7.525,1300,9.281,3867,11.622,4652,10.662,5684,14.09,5685,14.09,5686,14.09,5745,15.237]],["keywords/1059",[]],["title/1060",[23,206.245,744,1007.258,5746,1251.356]],["content/1060",[23,4.176,32,3.682,34,3.984,151,5.368,164,5.464,171,4.544,273,4.821,349,11.25,373,4.487,543,6.444,804,8.433,974,11.1,975,12.963,1278,8.593,4455,19.24,4652,12.176,5747,17.4,5748,17.4]],["keywords/1060",[]],["title/1061",[23,206.245,1114,690.985,5749,1251.356]],["content/1061",[23,4.23,32,3.452,34,3.734,151,5.032,152,3.247,161,5.153,164,6.624,273,4.626,349,10.546,373,4.206,543,6.04,673,8.509,804,7.905,974,10.404,975,11.346,1278,8.055,1300,9.704,2381,11.873,4652,11.414,5698,18.461,5750,16.311,5751,16.311]],["keywords/1061",[]],["title/1062",[23,206.245,468,619.122,5752,1353.247]],["content/1062",[23,4.178,32,4.51,34,3.794,152,4.951,161,5.235,224,5.024,273,3.634,349,10.714,468,7.581,549,8.708,600,8.912,804,8.03,809,10.524,955,9.556,974,10.57,975,11.462,1116,8.236,4652,14.913,5753,16.57,5754,16.57]],["keywords/1062",[]],["title/1063",[5755,1863.425]],["content/1063",[6,1.52,23,4.254,32,3.322,124,7.705,152,3.125,161,4.959,164,7.65,273,3.442,771,6.289,804,9.971,942,9.431,974,13.124,975,12.344,1257,7.181,2228,11.973,2303,8.442,2927,9.884,4652,10.984,5756,15.696,5757,15.696,5758,20.574]],["keywords/1063",[]],["title/1064",[45,383.895,273,296.762,5116,1184.242]],["content/1064",[4,2.396,22,5.453,23,4.102,25,1.06,32,4.397,34,3.649,45,5.895,111,6.013,273,5.573,407,7.771,543,5.902,901,7.932,2508,16.8,3726,10.166,4662,13.356,5116,20.234,5759,15.936,5760,15.936,5761,15.936,5762,14.736]],["keywords/1064",[]],["title/1065",[19,469.995,273,343.83]],["content/1065",[4,1.852,19,4.868,23,4.206,25,1.08,33,1.442,35,5.788,46,2.22,60,2.559,63,1.504,67,2.76,76,4.077,122,3.01,152,2.807,155,2.044,161,3.524,164,5.612,170,6.002,172,3.956,174,8.38,193,2.748,228,4.872,229,3.847,230,2.167,273,4.613,274,4.435,280,4.375,328,5.545,341,9.654,385,4.086,396,2.241,417,3.088,427,4.101,451,4.215,454,4.435,467,3.943,479,4.121,496,2.771,514,2.459,556,3.985,572,2.45,587,4.375,642,6.315,674,2.512,773,2.703,787,5.406,804,7.871,806,6.791,857,7.249,942,6.702,974,10.36,981,3.918,982,3.66,993,3.304,1030,3.366,1169,5.103,1257,3.138,1327,5.953,1351,5.105,1417,6.098,1548,4.375,1641,8.12,1646,4.565,1946,9.019,2049,4.435,2301,4.375,2321,10.227,2502,3.409,2508,9.019,2568,11.365,2677,7.806,2979,4.638,3490,5.376,3778,13.069,3920,6.342,4173,13.037,4174,6.002,4639,6.342,4807,5.376,5763,6.859,5764,17.87,5765,17.87,5766,6.859,5767,6.859,5768,6.859,5769,6.859,5770,6.342,5771,6.859]],["keywords/1065",[]],["title/1066",[60,504.882,92,576.973,171,353.369]],["content/1066",[4,2.087,23,4.124,32,2.582,54,5.303,60,8.638,63,3.799,134,6.907,152,2.429,156,6.462,164,3.832,177,8.908,186,3.607,187,7.499,196,3.798,246,3.855,273,5.425,373,3.147,381,3.938,408,4.037,512,7.091,514,4.374,539,5.676,800,8.539,804,5.914,975,12.453,1086,7.89,1540,7.589,1547,8.122,1571,8.25,1641,8.882,1667,10.226,1724,7.89,2079,6.971,2178,8.539,2228,9.308,2589,7.499,3174,8.25,4636,15.16,4651,20.273,4652,12.122,4653,11.284,4654,11.284,4655,10.678]],["keywords/1066",[]],["title/1067",[1552,1281.072]],["content/1067",[4,1.653,6,1.545,14,2.095,23,4.272,24,1.924,32,4.09,33,1.574,34,2.788,35,1.598,36,2.908,37,0.936,40,2.128,44,2.616,49,2.622,60,6.453,62,4.024,63,3.499,65,3.079,68,2.93,86,4.92,88,1.911,92,4.005,122,2.447,124,3.518,152,3.664,164,5.432,171,3.732,183,2.959,198,1.489,223,7.349,273,5.211,329,2.484,334,1.607,364,3.022,373,4.461,375,2.908,381,1.799,396,3.069,398,2.087,401,2.497,408,1.844,490,3.733,516,4.831,519,5.053,520,6.469,543,4.509,561,2.622,582,6.829,590,2.377,694,4.669,703,2.08,765,3.079,785,3.713,804,8.918,805,3.655,811,4.149,858,4.732,879,3.657,942,5.644,974,5.992,975,9.303,1219,2.685,1377,4.394,1526,3.047,1552,15.653,1796,5.707,2079,3.184,2228,4.252,2353,3.975,2389,4.672,2568,10,2927,7.667,3114,4.058,3126,5.154,3919,4.058,4170,5.154,4652,3.901,4662,4.672,5772,12.175,5773,5.574,5774,5.574,5775,9.394,5776,5.574,5777,5.574,5778,5.574,5779,5.574,5780,5.574,5781,5.574,5782,4.878,5783,5.154]],["keywords/1067",[]],["title/1068",[5782,1630.706]],["content/1068",[5,3.29,6,1.475,14,7.584,25,1.013,30,7.168,33,1.97,37,2.558,44,4.243,60,5.685,63,3.341,67,6.131,73,7.78,124,5.706,152,4.503,171,3.979,198,4.07,219,5.664,228,6.655,273,3.341,289,7.087,373,5.203,378,9.155,381,4.917,382,7.835,385,5.581,396,4.978,408,5.041,516,7.835,543,5.643,561,7.168,582,8.547,652,7.295,1028,8.787,1339,6.825,1552,15.551,1633,8.704,2079,8.704,2253,7.21,2254,8.624,5782,13.334]],["keywords/1068",[]],["title/1069",[5719,1372.068,5784,1449.827]],["content/1069",[9,5.786,19,3.791,23,3.809,25,0.841,32,4.714,33,1.635,34,4.068,35,3.627,63,2.773,151,3.902,152,3.537,161,3.995,162,6.28,198,4.746,246,3.995,272,5.392,273,2.773,284,4.486,287,6.286,301,2.882,330,5.356,341,10.561,373,3.262,381,4.081,407,6.167,543,8.69,572,7.336,737,4.252,740,5.882,1114,6.458,1272,9.206,1315,7.964,2741,9.647,2779,7.772,4165,15.588,4233,11.695,5719,11.067,5737,15.548,5762,11.695,5784,16.429,5785,12.647,5786,17.767,5787,12.647,5788,12.647,5789,12.647]],["keywords/1069",[]],["title/1070",[5790,1863.425]],["content/1070",[23,3.121,32,4.334,124,7.669,161,7.674,427,7.528,572,7.316,1257,9.37,2303,11.015,4165,14.331,5791,20.48]],["keywords/1070",[]],["title/1071",[310,709.677,2628,1195.939]],["content/1071",[4,2.022,25,0.964,33,1.874,46,4.692,60,5.408,62,6.209,63,3.179,85,6.982,86,5.857,114,4.214,125,5.735,183,4.565,189,7.401,217,5.178,260,7.507,273,5.686,274,12.617,300,7.99,373,3.738,385,5.309,414,5.666,417,8.786,421,7.507,433,10.551,484,8.13,512,5.933,514,5.196,561,6.819,921,7.507,963,5.598,981,8.28,982,7.735,1030,7.113,1081,8.908,1183,7.99,1326,8.908,2781,10.789,4655,12.685,4807,17.293,5792,14.495,5793,14.495,5794,14.495]],["keywords/1071",[]],["title/1072",[3769,1421.376]],["content/1072",[2,2.009,3,4.264,4,0.568,5,2.598,6,1.661,7,2.893,12,1.913,19,1.645,23,3.607,25,1.507,30,2.581,32,2.547,33,1.199,34,1.256,35,2.658,37,2.02,44,3.939,49,2.581,52,1.512,58,2.009,60,2.047,63,3.467,65,1.798,67,7.349,69,2.893,88,4.126,92,2.339,96,3.105,125,6.256,152,3.636,156,2.905,161,2.928,182,1.849,192,1.844,202,1.688,204,2.596,205,3.127,206,4.284,217,1.96,219,2.039,220,1.939,224,4.289,228,2.396,273,4.879,291,2.627,293,2.595,297,4.866,310,2.483,322,2.017,373,2.39,375,4.835,381,2.991,385,2.009,398,2.055,405,2.821,438,2.055,452,4.287,455,2.627,467,1.939,496,2.217,501,2.821,512,2.246,515,2.709,520,4.195,536,3.178,537,1.798,543,4.457,554,2.627,559,7.677,561,2.581,569,2.692,577,3.412,614,6.118,630,2.017,631,3.195,633,4.435,637,3.134,639,2.611,650,3.164,664,2.745,670,3.077,693,2.457,703,3.458,714,3.652,732,1.919,737,6.14,738,7.781,762,4.083,804,4.492,864,3.598,901,3.538,911,3.5,918,3.105,926,2.801,937,2.396,940,3.333,943,2.883,963,3.58,974,5.912,1000,2.951,1042,7.781,1049,3.372,1112,3.261,1113,3.994,1141,3.598,1325,3.547,1327,9.154,1329,6.103,1558,3.372,1560,8.274,1631,3.105,1632,3.839,1633,5.295,1641,3.994,1735,5.073,1931,3.455,2032,4.435,2079,3.134,2112,3.598,2239,3.994,2288,3.709,2459,4.435,2542,3.994,2568,9.899,2900,6.169,3550,5.073,3592,4.083,5770,16.889,5795,5.486,5796,5.486,5797,9.269,5798,5.486,5799,14.145,5800,14.145,5801,9.269,5802,5.486]],["keywords/1072",[]],["title/1073",[4614,1723.121]],["content/1073",[]],["keywords/1073",[]],["title/1074",[19,558.59]],["content/1074",[4,0.854,5,2.789,9,5.91,19,2.471,23,4.172,35,3.705,60,3.075,124,5.966,171,3.373,219,3.064,224,2.499,271,2.924,334,4.593,440,3.813,474,4.754,480,4.647,556,2.945,569,4.045,572,2.945,580,3.792,590,3.515,600,4.433,642,3.692,736,3.087,737,6.063,758,6.89,765,4.234,768,4.709,770,4.071,772,3.419,773,3.248,774,4.506,775,6.185,879,3.209,1219,6.223,1258,7.214,1283,15.113,1285,11.946,1320,6.948,1416,11.946,1417,4.506,1479,4.624,1518,7.622,1712,5.768,1713,4.469,1900,6.136,1991,6.461,2358,6.664,2359,6.664,2360,19.122,2361,10.827,2362,10.445,2363,15.113,2364,6.908,2366,7.622,2367,7.622,2368,14.731,2374,7.214,2953,8.472,3170,6.288,3227,6.461,3367,3.971,5803,8.243,5804,7.622,5805,8.243,5806,8.243,5807,8.243,5808,8.243,5809,8.243,5810,8.243,5811,8.243,5812,8.243,5813,8.243,5814,8.243,5815,8.243,5816,8.243,5817,8.243,5818,8.243,5819,12.919,5820,12.919,5821,12.919,5822,8.243,5823,8.243,5824,8.243,5825,8.243,5826,8.243,5827,8.243,5828,8.243,5829,12.919,5830,8.243]],["keywords/1074",[]],["title/1075",[198,361.493,224,410.309,765,443.523]],["content/1075",[23,4.083,34,4.689,765,6.712,768,13.878,2495,12.896,5831,20.48,5832,20.48]],["keywords/1075",[]],["title/1076",[271,661.001]],["content/1076",[198,5.365,224,6.09,271,8.518,293,5.622,737,6.753,758,10.386,765,6.583,886,7.174,1219,9.674,2496,14.62,2583,15.744]],["keywords/1076",[]],["title/1077",[770,920.243]],["content/1077",[4,1.985,152,3.815,224,5.81,249,10.845,334,5.525,474,11.051,556,8.337,557,7.613,580,8.814,737,6.442,770,9.463,772,7.948,773,7.551,1417,12.759,3170,14.616,4222,15.491]],["keywords/1077",[]],["title/1078",[556,483.395,1417,739.744,3490,1060.767]],["content/1078",[4,1.778,5,2.001,6,0.898,23,4.236,25,0.616,32,3.631,34,2.122,69,2.894,124,5.298,152,2.817,171,4.48,198,3.779,271,3.288,334,2.673,438,3.472,556,6.857,557,3.683,572,3.311,590,3.952,600,7.609,630,7.057,642,6.337,737,5.768,758,4.009,765,3.038,767,5.296,770,6.986,771,8.73,772,5.868,773,7.565,774,7.733,775,4.438,787,4.493,1074,5.067,1141,9.277,1160,4.701,1417,11.3,1783,6.373,1903,10.53,1931,5.837,2106,5.346,2121,5.697,2781,12.769,3490,16.204,3778,8.5,3781,9.024,3884,8.572,4515,12.857,4738,8.572,4956,15.048,5833,9.27,5834,9.27,5835,9.27]],["keywords/1078",[]],["title/1079",[60,695.225]],["content/1079",[4,1.442,25,1.437,40,5.311,44,3.874,59,12.866,60,9.352,68,7.312,111,5.25,122,6.107,155,4.147,171,3.633,177,7.155,224,4.219,228,6.077,241,5.172,273,3.051,297,3.947,334,4.012,341,8.271,396,6.201,408,6.28,479,8.36,543,5.153,590,5.932,630,6.977,659,6.4,737,7.802,765,4.56,770,9.374,773,7.48,774,7.606,1219,6.702,1345,8.654,1712,9.737,1946,11.249,2104,11.661,2321,8.762,2353,9.923,2677,9.737,2900,9.261,2953,9.124,2980,10.907,3223,10.356,3747,11.249]],["keywords/1079",[]],["title/1080",[19,469.995,60,584.959]],["content/1080",[4,2.084,14,3.28,23,4.255,25,0.58,32,1.847,60,8.275,124,3.268,171,4.314,191,2.623,198,3.608,204,4.129,206,3.106,222,2.38,240,1.949,271,3.095,273,1.914,334,3.894,440,4.036,447,11.863,556,3.117,572,4.824,600,10.818,630,8.835,674,3.196,737,6.762,758,5.841,765,2.86,767,4.985,770,4.31,771,6.619,772,5.602,773,7.926,774,10.166,775,6.466,1219,7.958,1345,8.399,1356,5.567,1417,4.77,1427,4.657,1479,4.895,1611,6.495,1712,9.45,1827,4.895,1903,6.495,2106,5.033,3747,10.919,4398,12.488,4515,5.427,4650,7.637,4956,13.537,5836,8.726,5837,8.726,5838,8.726,5839,8.726,5840,8.726,5841,8.726,5842,12.488]],["keywords/1080",[]],["title/1081",[3367,897.578]],["content/1081",[4,2.165,111,7.883,224,6.334,765,6.847,861,9.717,2953,13.699,3367,11.84,4480,15.549]],["keywords/1081",[]],["title/1082",[54,809.864]],["content/1082",[4,1.395,23,4.208,32,2.849,54,9.947,107,3.307,152,2.681,171,3.516,271,4.776,334,3.882,556,4.81,557,7.374,572,4.81,590,5.741,600,9.981,630,8.825,659,6.194,737,6.239,758,5.823,770,6.649,771,8.509,772,5.585,773,8.369,774,10.145,775,6.447,787,6.525,975,7.242,1170,6.875,1417,7.36,1783,9.256,2228,10.27,2980,10.554,4515,8.374,4956,9.801,5843,13.464,5844,13.464]],["keywords/1082",[]],["title/1083",[3170,1421.376]],["content/1083",[23,4.143,32,2.66,63,2.757,96,7.115,124,4.708,155,3.747,171,4.62,183,3.959,186,3.716,228,5.49,246,3.971,271,4.459,330,3.022,334,5.101,438,4.708,512,5.146,556,4.49,568,7.395,572,4.49,600,6.761,630,8.607,737,7.469,758,5.437,770,6.208,771,8.202,772,5.214,773,8.067,774,9.671,775,6.019,975,6.761,981,7.181,982,6.708,1089,7.25,1114,9.033,1417,6.872,1444,5.948,2980,9.854,3170,17.86,3859,9.357,4515,7.818,4956,9.15,5845,12.57,5846,12.57]],["keywords/1083",[]],["title/1084",[396,442.138,516,695.85,772,561.321]],["content/1084",[4,2.164,19,3.292,23,2.447,25,0.73,33,1.42,87,3.816,171,2.867,172,6.333,183,3.458,217,3.922,228,4.796,234,5.079,375,5.728,458,5.107,482,6.002,483,5.906,572,3.922,659,5.051,736,4.112,737,3.692,765,6.22,772,6.66,879,4.275,942,6.597,1006,6.671,1108,7.424,1257,5.024,1278,7.929,1377,5.136,1614,5.607,1796,6.671,1885,9.202,1886,10.154,1903,8.173,2023,7.829,2376,8.173,2568,7.684,3767,7.993,4185,9.202,4222,12.98,4643,8.607,4684,8.877,4901,14.05,5174,10.154,5320,14.846,5847,10.98,5848,18.979,5849,10.98,5850,10.98,5851,10.154,5852,10.98,5853,10.98,5854,10.98,5855,10.98,5856,10.98,5857,10.98,5858,10.98,5859,10.98,5860,10.98,5861,10.98,5862,10.98,5863,10.98,5864,10.98,5865,10.98,5866,10.98,5867,10.98,5868,10.98,5869,10.98,5870,10.98,5871,10.98,5872,10.98,5873,10.98,5874,10.98,5875,10.98,5876,10.98,5877,10.98,5878,10.98,5879,10.98,5880,10.98,5881,10.98,5882,10.98,5883,10.98,5884,10.98,5885,10.98,5886,10.98]],["keywords/1084",[]],["title/1085",[3769,1421.376]],["content/1085",[2,1.739,4,0.849,5,3.88,6,1.647,7,1.482,8,2.514,9,4.944,19,1.423,23,3.234,25,1.251,30,6.049,33,0.614,35,4.161,37,0.797,53,3.461,60,3.057,63,1.797,65,1.556,70,1.158,72,2.26,76,2.823,79,2.514,97,1.667,105,2.574,107,1.166,111,1.792,121,4.923,134,2.688,151,1.465,152,3.159,155,1.415,162,5.61,171,2.14,177,4.213,186,1.403,192,1.596,193,1.902,196,2.55,198,3.876,203,2.408,217,2.927,224,5.157,225,2.937,227,2.442,234,8.698,241,1.765,246,2.588,254,4.87,271,1.684,273,1.041,279,2.823,293,1.329,300,4.517,301,2.93,310,3.709,311,2.034,330,4.089,334,1.369,355,1.871,373,1.225,401,2.127,407,2.315,408,1.571,413,2.459,425,2.947,427,3.012,440,2.196,458,3.811,479,2.853,482,2.596,496,1.919,510,2.408,512,1.944,514,1.702,531,2.596,536,1.628,560,2.514,563,2.034,569,2.33,572,2.927,590,4.608,598,5.54,614,3.544,630,4.727,659,8.65,673,2.477,695,2.345,716,1.714,737,5.718,758,2.054,765,7.102,772,6.582,773,3.229,775,2.273,779,3.161,782,4.82,785,1.448,843,2.149,876,2.953,879,1.849,894,1.82,901,4.908,912,2.477,941,3.534,942,4.923,950,3.161,973,2.554,1086,3.07,1114,2.425,1148,3.323,1174,9.641,1183,2.618,1224,2.765,1257,3.749,1278,4.046,1280,8.471,1298,2.853,1377,5.055,1548,5.226,1562,3.456,1574,4.391,1593,4.155,1796,2.885,1811,3.456,1827,2.663,1872,4.407,1889,2.99,1987,3.622,2022,3.979,2023,2.315,2330,3.839,2358,3.839,2359,3.839,2360,10.395,2361,9.057,2362,3.839,2363,6.867,2364,3.979,2374,4.155,2424,8.737,2496,3.456,2626,4.155,2847,6.867,2953,3.114,3189,4.391,3460,7.17,3561,3.622,3767,5.964,3830,3.534,3859,6.099,3960,4.155,4102,3.979,4174,4.155,4620,6.25,4685,4.155,5318,3.839,5421,4.391,5422,4.391,5614,3.979,5851,7.576,5887,4.748,5888,4.748,5889,4.748,5890,4.748,5891,4.748,5892,4.748,5893,4.748,5894,4.748,5895,4.748,5896,4.748,5897,4.748,5898,4.748,5899,4.748,5900,4.748,5901,4.748,5902,4.748,5903,4.748,5904,4.748,5905,4.748]],["keywords/1085",[]],["title/1086",[1007,824,4617,1013.728]],["content/1086",[]],["keywords/1086",[]],["title/1087",[1007,824,4571,1313.99]],["content/1087",[105,10.02,107,4.539,222,6.225,240,5.097,290,14.097,301,4.212,398,6.921,424,11.949,462,7.343,736,6.921,936,9.186,1007,13.019,1625,14.942,1966,12.933,4571,19.132,5906,18.481,5907,18.481]],["keywords/1087",[]],["title/1088",[7,371.572,12,415.037,69,371.572,373,306.972]],["content/1088",[4,1.343,6,1.255,7,4.046,12,7.257,24,4.474,25,1.202,46,4.196,51,3.102,54,5.633,69,6.497,70,3.161,87,4.504,88,7.136,97,4.55,105,7.027,107,3.184,116,5.353,124,4.854,149,5.376,154,4.765,171,3.385,186,3.831,205,3.368,206,4.614,222,3.534,240,4.647,243,5.962,281,5.026,297,3.677,311,5.552,330,3.116,364,7.027,373,3.343,424,8.38,425,4.663,426,8.061,427,4.765,462,5.15,490,5.15,504,5.746,581,5.501,660,7.27,662,9.244,716,4.679,843,5.867,901,4.948,936,6.443,996,5.867,1007,6.812,1204,6.665,1242,10.16,1256,10.23,1611,9.648,2098,8.162,2252,7.875,2733,9.244,2988,10.479,3681,11.343,4166,11.986,4571,10.863]],["keywords/1088",[]],["title/1089",[4,110.083,149,440.672,191,319.37,2043,773.343,2253,502.693]],["content/1089",[4,1.865,7,5.62,12,6.277,37,3.022,69,5.62,86,7.274,149,7.467,171,4.701,191,5.412,222,4.909,240,4.02,278,4.846,413,9.323,552,9.461,673,9.391,711,7.639,894,6.899,1193,13.731,1611,13.399,2253,8.518,2254,12.712,2733,12.839,3680,13.731,3979,15.087]],["keywords/1089",[]],["title/1090",[2,351.353,4,99.401,37,161.05,70,233.946,659,441.279,2102,775.576]],["content/1090",[2,8.692,4,1.523,10,8.362,11,6.392,22,5.169,23,4.03,24,3.364,25,0.977,32,3.11,33,2.287,34,4.05,35,2.795,37,3.73,63,2.138,67,3.922,70,2.377,84,5.201,85,4.695,89,6.138,94,6.062,97,3.422,111,3.678,124,3.65,171,3.837,184,2.114,222,2.658,230,5.588,234,4.509,240,2.176,246,3.079,296,7.255,334,2.81,381,3.145,400,7.965,413,5.048,455,4.667,463,6.952,468,4.459,496,3.939,663,5.373,674,3.57,711,6.237,777,4.344,785,2.972,845,6.392,894,3.735,993,4.695,1180,8.83,1342,6.59,1343,5.794,1612,7.255,1614,9.033,2057,6.701,2431,7.435,2495,6.138,2502,4.845,2574,8.53,3593,6.488,3813,8.928,4023,9.013,4029,7.666,4583,11.21,5908,12.861,5909,9.013,5910,9.013,5911,7.881,5912,9.013,5913,7.881,5914,7.881]],["keywords/1090",[]],["title/1091",[1007,824,2010,1267.615]],["content/1091",[4,2.042,25,1.31,65,6.458,67,7.928,122,8.649,240,4.4,437,7.734,736,7.379,1007,10.356,1648,13.789,2146,14.344,2165,13.323,2284,16.514,2628,15.03,3564,14.053]],["keywords/1091",[]],["title/1092",[69,371.572,316,866.461,649,962.349,736,445.761]],["content/1092",[4,1.958,6,1.829,10,5.469,25,0.919,69,5.898,70,3.371,111,5.215,182,2.758,184,4.097,191,5.68,192,4.647,218,14.412,222,3.769,228,6.037,240,5.167,243,6.358,289,6.429,316,15.671,329,6.159,373,3.564,378,8.305,385,5.062,400,6.223,457,9.345,496,5.585,515,6.826,569,6.782,580,6.358,649,18.71,663,7.619,674,6.92,711,5.865,894,5.297,1007,7.264,1112,8.216,1315,8.703,1606,9.502,1623,9.345,2043,10.061,2115,11.583,3236,10.834,5915,12.781,5916,12.781,5917,13.822,5918,13.822]],["keywords/1092",[]],["title/1093",[66,985.073,649,1094.088,1388,863.219]],["content/1093",[4,1.545,22,3.913,25,0.992,46,6.437,63,3.27,70,4.85,88,6.819,181,3.973,184,4.313,186,4.407,187,9.163,192,5.013,218,11.373,230,4.71,240,4.44,288,7.363,316,10.853,321,9.163,373,5.129,381,4.811,385,5.461,391,7.51,499,10.452,501,7.667,649,12.054,650,8.599,663,8.219,674,5.461,675,6.935,708,9.389,716,5.383,894,5.714,982,7.956,1141,9.777,1220,8.517,1388,9.511,1398,9.389,2146,14.476,3790,10.433,5916,13.787,5919,14.91]],["keywords/1093",[]],["title/1094",[33,174.985,184,293.46,4585,1094.088]],["content/1094",[4,1.534,25,0.984,33,2.559,63,3.246,97,6.948,171,3.866,180,6.81,182,2.954,184,4.292,191,4.45,219,5.503,222,5.397,230,4.677,240,4.419,249,8.379,278,3.985,289,6.886,315,4.822,385,5.422,395,6.224,424,9.572,482,8.092,504,6.563,515,7.311,638,8.538,674,5.422,711,6.282,973,7.962,1007,7.78,1388,9.443,1398,9.322,1444,7.005,1902,9.098,2010,11.969,2111,9.853,2115,12.407,2838,12.407,4585,20.638,5915,18.302]],["keywords/1094",[]],["title/1095",[4,123.338,238,804.809,408,393.825,1007,625.565]],["content/1095",[12,5.778,19,4.967,25,1.417,37,2.782,46,5.364,88,5.681,111,6.253,149,6.873,179,8.236,191,6.406,222,5.811,228,7.237,234,7.664,240,5.26,260,8.581,314,5.878,364,8.984,397,10.57,408,5.482,504,7.346,569,8.131,673,8.644,711,7.032,1007,11.2,1827,9.294,2112,10.866,2115,13.887,4563,16.255]],["keywords/1095",[]],["title/1096",[25,104.266,240,350.087]],["content/1096",[]],["keywords/1096",[]],["title/1097",[886,560.063,4617,1013.728]],["content/1097",[1,8.75,4,1.208,22,5.153,23,4.062,25,1.513,28,5.041,29,8.144,30,5.484,32,2.467,33,1.507,34,3.839,111,4.398,131,5.911,151,3.596,154,4.285,186,3.445,193,4.67,198,4.479,240,5.289,243,9.032,246,3.682,251,6.481,271,4.135,389,5.994,569,8.227,661,7.435,843,5.276,861,7.798,886,5.989,1077,6.597,1089,6.722,1540,7.249,2303,6.269,3592,14.615,3593,7.758,3715,7.536,3813,7.082,4432,9.769,4617,7.536,4959,16.455,4960,9.769,4961,15.503,4962,10.778,5911,9.424,5913,9.424,5920,14.672,5921,11.656,5922,11.656]],["keywords/1097",[]],["title/1098",[4,140.222,4617,874.956,5923,1251.356]],["content/1098",[1,10.153,4,1.602,22,5.347,23,4.016,25,1.515,32,3.272,33,1.999,34,4.665,62,6.624,63,3.391,222,4.216,256,7.275,381,4.99,420,9.395,763,7.896,1631,8.752,3592,11.51,3593,10.292,3813,9.395,4617,9.998,4959,17.074,4960,12.959,5911,12.502,5913,12.502,5920,13.532,5923,21.069,5924,20.373,5925,14.299]],["keywords/1098",[]],["title/1099",[4,140.222,4617,874.956,5926,1251.356]],["content/1099",[1,10.19,4,1.614,22,5.373,23,4.023,25,1.521,32,3.297,33,2.014,34,4.687,62,6.674,63,3.416,86,6.295,381,5.027,420,9.465,763,7.955,3592,15.239,3593,10.369,3813,9.465,4617,10.073,4959,17.158,4960,13.056,5911,12.595,5913,12.595,5920,13.633,5925,14.406,5926,21.146,5927,20.473]],["keywords/1099",[]],["title/1100",[243,721.234,4617,1013.728]],["content/1100",[6,1.141,14,4.431,23,3.011,32,2.495,35,5.666,40,4.5,44,3.282,65,5.54,111,6.378,154,4.333,164,3.702,184,2.556,204,5.578,205,4.392,206,6.016,222,3.214,224,5.991,228,5.148,234,5.453,240,4.819,243,11.907,246,3.724,271,7.009,307,6.798,314,4.181,330,2.834,331,7.622,334,3.399,407,5.748,435,5.393,543,4.365,569,8.294,590,5.026,592,7.162,630,4.333,637,6.734,716,4.256,736,4.415,765,7.074,773,4.645,901,4.5,1081,7.245,1180,7.083,1276,6.242,2130,7.73,2131,7.083,2303,6.34,2502,5.859,3586,9.748,4617,7.622,4965,8.992,5928,11.788,5929,15.629,5930,11.788,5931,9.24,5932,11.788]],["keywords/1100",[]],["title/1101",[184,340.004,243,721.234]],["content/1101",[4,1.335,6,1.247,23,3.906,25,0.857,32,3.809,34,2.949,35,3.694,45,3.654,53,5.441,92,5.492,152,2.565,164,5.651,184,5.308,205,5.389,206,4.585,224,6.809,240,5.275,243,11.26,293,3.606,314,6.384,315,4.196,319,5.74,334,3.714,347,5.926,396,4.209,569,6.321,886,4.601,901,4.917,1024,6.06,1329,6.532,1347,8.011,3586,7.429,4822,7.657,4946,11.273,4965,9.826,4969,11.273,4971,10.796,5065,11.912,5929,11.912,5931,10.097,5933,12.881,5934,12.881]],["keywords/1101",[]],["title/1102",[243,721.234,307,904.237]],["content/1102",[4,1.39,6,1.299,7,2.701,22,2.271,23,4.112,25,0.892,30,4.071,32,4.24,34,4.239,35,2.482,45,2.455,65,2.836,69,5.13,87,4.663,131,6.804,152,3.272,183,2.726,198,2.312,205,4.27,224,2.624,230,2.734,240,1.932,243,9.751,264,2.509,273,2.943,293,2.422,304,6.758,307,12.225,314,3.07,319,5.979,335,14.289,414,3.383,416,5.76,467,3.059,510,6.804,516,4.45,520,7.438,543,4.969,554,4.143,556,3.091,630,4.933,656,5.144,711,5.694,717,4.143,785,2.639,804,6.503,809,4.274,879,3.369,901,5.122,910,5.399,1068,7.976,1102,6.441,1103,6.056,1124,8.676,1191,5.52,1339,3.876,1350,6.601,1351,6.441,1417,7.335,1993,5.851,2912,8.345,3465,7.573,4617,8.676,4667,11.245,5931,6.784,5935,8.654,5936,8.654,5937,13.418,5938,8.654,5939,8.654,5940,8.654,5941,8.654,5942,8.654,5943,8.654,5944,8.654,5945,8.654,5946,8.654]],["keywords/1102",[]],["title/1103",[4964,1630.706]],["content/1103",[23,3.854,32,4.354,33,2.03,34,4.711,35,4.501,54,6.822,198,4.193,224,4.759,228,6.855,240,4.594,243,11.206,396,5.128,569,7.702,711,6.661,773,6.185,2058,10.012,2079,8.967,3593,10.447,3813,9.536,4964,22.132,4965,11.973,5911,12.69,5912,14.514,5913,12.69,5931,12.304,5947,15.696,5948,20.574]],["keywords/1103",[]],["title/1104",[1309,737.602,1536,1097.157]],["content/1104",[4,2.128,5,2.73,6,2.42,19,3.791,23,2.708,70,5.432,92,5.392,161,5.613,186,3.738,200,4.718,205,4.616,217,4.518,240,2.824,293,3.54,305,12.773,539,5.882,568,7.44,572,4.518,580,8.173,592,7.684,661,8.067,711,5.367,726,9.206,737,6.905,771,5.067,1074,6.913,1134,7.158,1188,10.225,1224,7.365,1272,9.206,1309,5.95,1536,14.372,1602,7.684,1889,7.964,2023,6.167,2049,11.487,2203,8.293,2303,6.802,2912,12.773,3339,10.225,4447,11.067,5949,17.767,5950,15.548,5951,15.548,5952,17.767,5953,12.647]],["keywords/1104",[]],["title/1105",[273,343.83,1114,800.578]],["content/1105",[4,2.245,5,2.23,6,2.097,7,3.224,19,3.096,23,3.582,32,2.185,34,2.364,35,2.961,44,2.876,63,2.265,65,6.002,67,4.155,68,5.427,79,5.469,87,3.589,88,5.262,151,4.734,152,3.646,161,6.404,167,6.669,171,2.697,172,5.956,174,6.139,184,2.239,201,3.989,205,3.987,224,3.131,240,4.089,243,9.325,273,5.41,373,3.958,396,3.374,414,5.998,520,4.674,549,5.427,568,6.075,592,6.274,661,6.588,685,11.17,716,3.728,1074,5.645,1114,10.35,1536,12.814,1641,7.517,1827,8.608,1970,7.365,2178,7.227,4617,6.677,4888,14.19,4965,7.877,5931,8.095,5950,16.025,5954,10.327,5955,10.327,5956,10.327,5957,10.327,5958,10.327,5959,10.327,5960,10.327,5961,10.327]],["keywords/1105",[]],["title/1106",[330,376.96,2023,764.557]],["content/1106",[4,1.873,5,2.798,6,1.255,7,4.046,19,5.418,23,3.912,32,2.743,34,2.968,35,3.717,92,5.526,124,4.854,151,5.576,152,4.483,161,6.575,205,5.407,224,3.93,230,6.575,240,2.894,243,8.315,330,5.693,396,5.906,458,6.029,499,6.812,545,3.59,580,5.962,685,15.15,737,4.358,772,5.376,787,6.282,993,6.243,1257,8.269,1444,6.133,1633,7.405,2023,8.814,4485,10.479,4965,9.887,5931,10.16,5951,11.343,5962,12.962,5963,12.962,5964,11.986]],["keywords/1106",[]],["title/1107",[60,584.959,240,350.087]],["content/1107",[4,2.231,23,3.94,25,1.119,44,4.687,60,8.032,63,2.571,68,6.16,111,4.423,152,3.351,171,4.396,184,2.542,186,3.465,205,3.046,206,4.172,223,6.027,240,2.617,273,3.692,334,3.38,378,7.043,385,4.293,389,6.027,425,4.217,514,4.202,515,5.789,557,4.657,737,6.622,758,5.07,765,5.517,775,8.06,879,4.563,1010,9.477,1089,6.76,1276,6.207,1280,15.44,1283,14.108,1327,6.255,2089,7.687,2358,9.477,2359,9.477,2360,15.925,2361,9.824,2362,9.477,2363,14.108,2364,14.108,3859,8.725,3887,13.541,4165,8.203,5016,9.477,5842,15.566,5950,10.258,5965,11.722,5966,11.722,5967,11.722]],["keywords/1107",[]],["title/1108",[240,350.087,737,527.124]],["content/1108",[4,2.238,6,1.347,23,3.292,32,2.945,34,3.186,35,3.99,44,3.874,63,3.051,65,4.56,68,7.312,79,7.368,152,2.77,171,4.956,193,5.575,198,3.717,205,5.613,224,4.219,230,4.396,234,6.436,240,5.182,243,9.938,246,4.396,500,9.737,590,8.093,659,6.4,737,7.802,765,6.221,861,6.472,880,10.613,1169,6.366,1900,10.356,2000,10.356,2502,6.916,3823,10.907,4965,10.613,5968,24.288,5969,13.914,5970,13.914]],["keywords/1108",[]],["title/1109",[737,527.124,2995,1229.009]],["content/1109",[23,3.931,32,3.877,86,7.402,155,5.46,162,6.476,205,4.76,240,4.09,330,4.404,557,7.279,737,7.633,1114,9.354,1796,11.129,2995,14.359,5951,16.031,5964,16.939,5971,18.319,5972,18.319,5973,18.319,5974,18.319]],["keywords/1109",[]],["title/1110",[273,296.762,396,442.138,2568,946.964]],["content/1110",[240,4.712,273,4.628,373,5.442,396,6.895,1298,12.679,2568,14.767,3380,18.467,5975,21.102]],["keywords/1110",[]],["title/1111",[225,562.039,278,422.052]],["content/1111",[4,2.187,225,8.863,243,9.707,278,5.68,745,11.535,1276,11.174,1309,9.927]],["keywords/1111",[]],["title/1112",[3769,1421.376]],["content/1112",[4,1.523,14,5.526,25,0.978,28,6.358,29,6.097,45,5.588,63,3.224,65,7.282,79,7.784,110,6.484,111,5.547,122,6.452,154,5.404,189,7.506,201,7.608,205,3.819,206,5.232,207,8.103,236,10.105,240,4.398,243,9.062,251,8.173,297,4.17,348,11.15,396,4.803,523,10.595,569,7.213,589,10.286,596,10.286,602,13.593,684,18.216,693,6.584,853,8.397,932,6.689,941,10.941,1134,8.32,1298,8.832,4617,9.504,4797,13.593,5976,14.699,5977,14.699,5978,14.699]],["keywords/1112",[]],["title/1113",[10,420.379,18,354.881,25,70.65,284,376.852,4619,743.425]],["content/1113",[]],["keywords/1113",[]],["title/1114",[198,418.827,4619,1097.157]],["content/1114",[4,1.717,10,4.536,18,7.118,22,5.592,23,4.05,24,5.718,25,1.294,32,4.116,33,2.142,34,4.454,35,3.287,37,2.781,45,3.252,69,3.579,107,4.069,111,6.251,154,6.09,171,2.993,191,3.446,198,6.037,234,5.303,275,3.817,301,2.613,425,5.959,427,7.15,572,4.095,736,4.293,776,7.885,777,5.108,779,7.63,843,7.498,901,4.376,2239,8.345,2303,6.166,2459,9.268,3726,10.567,4619,13.612,5979,16.566,5980,16.566,5981,11.464,5982,11.464,5983,10.032,5984,10.032,5985,10.601,5986,11.464,5987,11.464]],["keywords/1114",[]],["title/1115",[6,131.019,10,535.472,230,427.504]],["content/1115",[4,1.696,6,1.092,7,5.11,18,5.468,19,3.381,23,3.223,34,4.841,51,2.699,76,9.731,88,3.867,151,5.051,154,6.018,155,4.88,161,3.563,162,3.987,164,6.052,167,4.901,171,4.275,225,4.043,230,5.172,246,5.172,281,4.373,301,2.57,330,2.711,373,2.908,375,5.883,381,3.639,440,5.216,451,6.931,455,7.838,545,3.124,557,9.602,566,7.753,592,6.852,661,7.194,673,10.053,709,6.931,758,4.878,786,4.831,889,7.625,1028,6.504,1074,6.165,1114,11.466,1155,7.625,1268,8.478,1300,5.188,1332,6.066,1961,6.704,2206,8.394,2677,7.892,3503,15.739,3715,10.585,4560,10.428,5988,19.272,5989,16.37]],["keywords/1115",[]],["title/1116",[6,151.799,18,523.738]],["content/1116",[5,2.798,6,2.015,18,6.038,23,4.068,32,5.326,53,5.475,87,4.504,215,6.812,217,4.63,246,4.095,249,7.336,427,4.765,455,6.206,496,5.237,520,8.181,572,6.457,580,5.962,650,7.475,736,7.794,737,4.358,772,9.34,901,4.948,1479,7.27,1863,10.16,1986,13.456,3236,10.16,4619,9.07,5990,12.962,5991,25.167,5992,12.962,5993,12.962,5994,11.343,5995,12.962,5996,12.962,5997,12.962,5998,12.962]],["keywords/1116",[]],["title/1117",[183,586.914]],["content/1117",[4,1.512,7,4.556,18,6.549,23,3.875,32,4.149,46,4.725,51,3.493,69,4.556,87,5.072,164,4.584,183,8.007,198,3.899,234,6.751,241,5.425,281,5.66,284,5.178,360,8.338,381,4.71,490,5.8,517,7.914,520,6.607,538,7.255,544,5.446,545,4.043,566,10.035,659,6.714,722,9.875,772,6.054,826,8.046,848,11.442,849,11.442,901,5.572,1028,8.418,1309,6.867,4685,12.773,5994,17.157,5999,14.596,6000,14.596]],["keywords/1117",[]],["title/1118",[517,733.699,826,745.978,4619,946.964]],["content/1118",[4,2.08,7,3.787,19,3.637,22,4.528,23,4.169,24,5.955,32,4.889,33,2.231,34,3.95,35,3.479,37,2.037,86,4.902,87,5.995,107,2.98,111,4.578,122,5.325,161,3.832,241,4.509,250,6.474,257,5.434,284,7.122,427,4.46,517,6.577,552,6.376,722,6.11,764,6.631,776,5.774,826,11.067,828,9.253,830,11.218,831,11.218,835,11.218,836,11.218,840,15.953,845,7.955,847,9.808,848,9.509,849,9.509,4619,8.489,5983,10.616,5984,10.616,5994,10.616,6001,17.252,6002,12.131,6003,12.131,6004,12.131,6005,17.252,6006,12.131]],["keywords/1118",[]],["title/1119",[785,412.676,1814,852.135,4619,946.964]],["content/1119",[18,7.667,22,5.399,23,3.713,25,1.044,45,4.453,103,6.994,111,5.923,188,8.804,198,4.193,201,6.062,230,4.959,301,3.577,330,3.774,425,5.647,458,7.301,483,11.066,507,9.762,736,5.878,782,9.234,785,7.712,786,6.724,843,7.105,1310,9.141,1656,10.447,1765,10.012,1814,9.884,2126,10.447,3726,10.012,3743,14.514,3744,14.514,3745,14.514]],["keywords/1119",[]],["title/1120",[63,296.762,272,576.973,3715,874.956]],["content/1120",[2,6.507,4,1.841,6,1.224,10,7.03,18,6.861,25,0.841,37,3.448,51,3.026,63,4.885,65,4.145,69,5.546,72,6.019,86,7.179,110,9.06,155,3.77,186,3.738,222,4.845,225,6.369,230,7.037,254,7.518,278,4.783,281,4.904,385,4.632,427,6.531,452,5.85,455,6.055,496,7.179,507,7.866,512,5.177,514,4.534,519,6.802,555,7.866,674,6.507,688,7.684,889,8.551,1427,6.749,1548,8.067,2043,9.206,2838,10.599,2892,10.599,3715,8.177,3830,9.413,4619,16.421,4917,10.225,5985,11.695,6007,12.647,6008,11.695]],["keywords/1120",[]],["title/1121",[184,340.004,4619,1097.157]],["content/1121",[4,1.318,5,2.747,6,1.728,18,5.96,19,3.814,22,3.339,23,4.054,24,4.392,25,0.846,32,4.361,33,1.645,34,4.718,35,3.649,37,2.136,53,5.375,70,5.025,88,4.363,176,4.643,184,4.844,219,6.632,224,5.41,315,5.812,347,5.853,425,4.577,496,5.141,776,6.056,779,8.469,785,3.88,862,8.012,886,4.545,1024,5.986,1276,6.738,1343,7.564,1360,7.914,1361,9.597,1362,13.986,1363,13.986,1365,9.262,1367,10.287,1584,10.287,1746,9.974,1827,7.137,4619,8.904,5983,11.135,5984,11.135,6009,12.724]],["keywords/1121",[]],["title/1122",[5,188.782,25,58.151,33,113.071,234,404.467,556,312.357,557,347.44,2931,650.864]],["content/1122",[]],["keywords/1122",[]],["title/1123",[4616,1356.449]],["content/1123",[4,1.25,18,4.029,25,0.802,37,3.36,60,4.5,66,8.78,70,2.941,97,4.234,107,2.963,144,7.412,176,4.402,180,5.548,181,3.214,182,3.428,184,3.726,186,3.565,202,3.71,205,3.134,220,4.264,234,7.947,240,2.693,273,2.645,297,3.422,319,5.375,322,4.434,371,6.292,405,6.202,421,6.246,427,6.316,432,9.029,480,4.339,481,6.649,556,6.137,557,6.826,663,6.649,674,4.418,675,7.991,692,6.159,711,5.118,716,4.354,741,7.328,742,5.459,784,8.78,785,3.678,886,4.308,921,6.246,985,5.61,1133,10.108,1180,7.247,1610,7.501,1629,15.687,1783,8.292,1935,9.454,2011,11.153,2117,7.909,2931,16.233,3086,15.887,4616,15.876,6010,17.181,6011,17.181,6012,12.061]],["keywords/1123",[]],["title/1124",[4,162.462,67,630.847]],["content/1124",[2,2.471,4,1.969,5,3.472,6,1.35,18,2.254,19,3.3,25,1.479,33,1.423,37,2.7,40,2.576,45,3.955,63,2.414,67,2.715,97,3.864,111,2.546,116,4.546,122,2.962,125,4.356,144,4.147,152,1.343,179,3.354,180,6.413,182,2.196,183,4.391,184,4.122,185,3.368,186,1.994,189,3.446,191,2.029,192,2.269,196,2.1,201,4.251,205,2.86,206,3.918,207,3.72,208,3.689,219,5.182,220,3.891,228,2.947,234,5.091,235,4.197,236,4.639,237,4.425,238,4.562,239,3.446,240,3.113,242,3.72,246,2.132,249,3.819,254,4.011,263,5.456,273,2.414,284,2.394,297,3.123,298,3.311,301,1.538,308,2.184,315,2.198,316,4.912,330,2.646,373,3.595,381,5.19,396,4.555,398,2.527,399,3.689,400,3.038,401,3.022,405,3.47,408,2.233,427,5.913,432,5.785,435,3.087,439,4.722,440,3.121,504,2.992,510,5.582,512,2.762,519,8.651,556,2.41,557,2.681,638,3.892,711,2.864,718,4.467,736,2.527,743,7.703,771,2.704,785,3.357,843,4.982,862,4.249,894,2.586,910,2.715,918,3.819,955,3.892,1038,6.846,1054,4.722,1055,3.354,1089,3.892,1160,3.422,1174,4.1,1176,3.855,1204,3.47,1314,4.812,1329,3.422,1335,5.289,1361,3.629,1388,4.304,1398,4.249,1554,7.703,1579,5.456,1580,8.193,1629,5.289,1650,6.543,1827,3.785,1966,9.755,2033,5.456,2089,4.425,2095,4.722,2112,7.218,2702,6.24,2931,10.377,2988,5.456,3563,4.639,4616,16.188,6013,10.179,6014,6.748,6015,6.748]],["keywords/1124",[]],["title/1125",[4,140.222,408,447.737,4616,985.073]],["content/1125",[4,2.028,20,5.192,22,5.137,23,4.217,24,6.756,25,1.302,32,2.453,34,2.654,35,3.324,37,2.803,45,3.288,54,5.038,63,2.542,65,3.799,107,2.847,151,3.576,154,4.261,171,3.027,198,3.096,222,3.161,224,3.515,234,5.362,373,4.306,408,3.835,467,6.919,512,4.745,513,9.926,546,13.501,656,6.89,659,5.332,777,5.165,785,5.092,843,5.247,857,5.96,879,4.513,883,6.285,958,5.362,985,5.391,1219,5.583,1354,7.042,1613,6.445,1860,8.842,2927,7.299,3813,7.042,3977,10.144,4616,12.155,5125,10.719,6016,18.1,6017,11.591,6018,11.591,6019,11.591,6020,11.591]],["keywords/1125",[]],["title/1126",[4,110.083,37,178.358,516,546.285,2931,790.76,4616,773.343]],["content/1126",[4,1.973,5,2.383,6,1.069,12,3.849,23,4.112,24,5.563,32,3.411,33,2.462,34,3.69,35,4.622,37,3.514,53,4.663,54,4.797,76,6.562,114,4.685,116,7.861,124,7.129,155,3.29,171,4.209,186,3.263,191,3.318,198,2.949,219,4.103,246,3.487,264,3.2,279,6.562,345,8.42,355,6.351,373,2.847,427,7.695,432,8.47,487,6.951,516,5.676,734,5.56,1089,6.366,1256,12.601,1257,8.709,1629,8.653,1713,5.985,2638,8.42,2823,8.925,2931,14.17,2988,8.925,3114,8.035,3169,8.653,4616,13.857,5908,9.66,6013,10.207,6016,10.207,6021,16.117]],["keywords/1126",[]],["title/1127",[84,722.133,94,841.635,408,447.737]],["content/1127",[]],["keywords/1127",[]],["title/1128",[2778,1328.96]],["content/1128",[86,8.887,552,11.558,1663,12.228,6022,21.993]],["keywords/1128",[]],["title/1129",[2651,1356.449]],["content/1129",[23,3.283,25,1.432,45,6.11,763,10.998,1160,10.922,1891,15.072]],["keywords/1129",[]],["title/1130",[581,790.783]],["content/1130",[4,1.602,22,5.347,23,4.266,24,7.032,25,1.355,32,3.272,33,1.999,34,3.54,35,4.434,37,2.596,45,4.387,84,8.252,89,9.737,94,9.617,171,4.038,368,9.737,408,5.116,1028,8.918,1257,7.074,1613,8.598,3813,9.395,4029,8.067,5908,17.829,5909,14.299,5910,14.299,6023,15.463,6024,15.463]],["keywords/1130",[]],["title/1131",[25,79.157,33,153.915,234,550.572,2112,780.572]],["content/1131",[]],["keywords/1131",[]],["title/1132",[202,482.305,6025,1567.878]],["content/1132",[4,1.712,6,2.405,19,2.616,25,1.338,33,1.746,37,2.774,44,2.43,60,6.164,63,1.914,86,3.526,87,3.032,92,3.721,103,3.889,114,3.926,152,3.702,155,4.026,183,2.749,186,2.579,192,2.934,201,3.37,202,2.684,222,2.38,234,4.036,252,3.384,273,4.664,285,5.999,291,4.178,293,2.443,297,3.831,301,1.989,308,2.825,322,3.208,329,3.889,334,2.516,348,4.939,395,5.678,396,5.398,400,3.929,401,3.909,405,4.487,414,5.279,510,6.848,514,3.128,525,4.586,536,2.992,537,2.86,545,2.417,556,3.117,557,3.467,563,3.738,590,3.721,613,3.074,617,4.621,622,3.541,693,6.049,695,6.669,717,4.178,718,3.541,732,3.053,736,3.268,742,6.113,910,3.511,926,6.896,936,4.337,943,4.586,950,5.808,954,7.098,962,6.495,963,5.216,985,4.059,1030,4.282,1045,6.656,1048,7.055,1050,6.224,1119,5.033,1150,6.84,1171,5.999,1235,7.055,1314,6.224,1595,5.427,1604,5.642,1821,8.989,1822,6.495,2004,6.656,2017,7.637,2023,4.255,2078,7.637,2112,10.834,2116,7.313,2236,7.313,2568,6.107,3367,6.505,4650,7.637,6026,8.726,6027,8.726,6028,8.726,6029,8.726,6030,8.726,6031,8.726,6032,8.726]],["keywords/1132",[]],["title/1133",[29,772.941]],["content/1133",[4,2.405,28,9.343,29,9.626,44,5.285,46,4.504,50,7.67,83,10.128,94,11.805,192,4.678,205,4.932,240,3.107,271,6.733,319,6.2,324,12.176,373,3.588,394,7.056,466,7.258,493,8.654,876,8.654,996,6.298,1268,7.206,1310,8.103,1517,12.176,1846,13.817,2079,7.949,2094,10.356,2112,16.823,3830,10.356,3831,11.661,4565,11.661,6033,13.914,6034,13.914,6035,13.914,6036,13.914,6037,13.914,6038,13.914,6039,13.914,6040,12.866,6041,18.981]],["keywords/1133",[]],["title/1134",[581,790.783]],["content/1134",[4,1.215,22,4.418,23,4.285,24,5.81,25,0.78,32,2.481,33,1.516,34,2.684,35,3.361,37,1.968,54,5.094,63,2.571,87,4.073,98,5.021,122,5.145,152,2.334,171,3.061,271,6.987,308,5.449,330,2.818,355,4.619,394,5.944,467,5.951,512,4.798,513,6.968,519,6.304,520,5.306,656,6.968,694,5.826,711,4.974,777,5.223,859,8.941,1038,7.29,1354,7.121,1517,14.731,1613,6.517,1724,7.579,1984,7.477,2079,6.696,2112,14.117,2515,8.725,3764,8.533,3790,8.203,4563,12.84,4564,14.731,4565,9.824,4567,10.258,4568,10.258,6042,16.833,6043,10.839]],["keywords/1134",[]],["title/1135",[379,717.317,427,576.359]],["content/1135",[4,2.231,12,5.871,19,5.047,25,1.12,33,2.177,44,4.688,69,5.256,88,8.139,186,4.977,191,5.062,198,4.498,202,5.18,222,4.591,240,3.76,246,5.319,282,16.423,301,3.838,329,7.503,504,7.465,536,5.773,711,7.145,1024,7.921,2112,14.12,2542,12.257,2560,11.042,4563,16.423,5585,15.57]],["keywords/1135",[]],["title/1136",[52,432.005,408,518.75]],["content/1136",[]],["keywords/1136",[]],["title/1137",[52,372.867,63,296.762,689,739.744]],["content/1137",[2,6.32,37,4.031,52,4.755,63,4.796,86,6.973,97,6.058,100,6.39,103,7.69,193,6.914,215,9.069,230,5.451,272,7.357,273,3.784,405,8.873,516,8.873,672,10.732,689,13.125,861,8.026,874,9.696,958,7.982,1058,8.937,1427,9.208,2322,15.101,6044,17.256]],["keywords/1137",[]],["title/1138",[4,140.222,52,372.867,408,447.737]],["content/1138",[4,1.923,22,5.573,23,4.208,24,6.406,25,1.412,28,5.823,32,2.849,34,3.083,35,3.861,37,3.116,50,7.422,52,5.113,62,5.768,63,4.07,92,5.741,198,3.597,273,4.657,301,3.069,330,4.462,355,5.306,373,3.472,513,8.004,514,4.827,557,5.35,763,6.875,843,6.094,1354,11.275,1613,7.486,1633,7.692,1981,8.962,4028,12.493,4029,7.024,4428,11.783,6045,10.554,6046,13.464]],["keywords/1138",[]],["title/1139",[52,372.867,58,495.646,6047,1251.356]],["content/1139",[4,1.404,19,4.062,20,6.07,22,4.892,23,4.013,24,6.434,25,1.24,28,5.861,29,5.621,30,6.375,32,4.509,34,3.103,35,3.886,37,2.275,50,7.47,52,7.019,112,8.887,151,4.181,164,4.256,172,7.816,308,4.387,355,5.34,373,4.807,408,4.484,452,6.268,504,8.264,1613,7.535,1648,9.483,4028,12.536,4029,7.07,6048,17.238,6049,17.238,6050,17.238,6051,17.238,6052,12.531,6053,11.357]],["keywords/1139",[]],["title/1140",[37,263.223,2336,1267.615]],["content/1140",[4,1.766,5,2.574,6,1.65,22,4.472,23,4.043,24,5.882,25,1.322,32,3.606,34,3.901,35,3.419,37,3.642,52,5.978,65,3.908,70,2.908,88,4.088,151,3.678,154,4.383,161,3.767,164,3.744,185,2.88,222,3.251,252,4.623,287,5.926,293,4.77,308,3.859,355,4.699,381,3.848,396,3.896,510,6.046,572,4.259,674,4.367,736,4.465,809,5.888,894,4.569,1192,7.415,1235,9.64,1613,6.629,1869,12.683,2025,9.64,2336,16.077,2953,7.819,3041,9.64,4028,10.025,4029,6.22,6053,9.992,6054,11.923,6055,11.923,6056,11.025,6057,11.923,6058,11.923,6059,11.923,6060,11.923,6061,11.923,6062,11.923]],["keywords/1140",[]],["title/1141",[52,372.867,408,447.737,703,504.882]],["content/1141",[4,1.865,23,2.744,25,1.197,37,4.11,44,5.013,45,5.107,46,7.27,51,4.308,52,6.188,63,3.948,275,5.994,297,5.107,334,5.19,704,9.461,763,9.192,872,9.067,889,12.172,1160,9.129,1891,12.597,2215,15.087,6063,18.002]],["keywords/1141",[]],["title/1142",[408,518.75,508,987.288]],["content/1142",[]],["keywords/1142",[]],["title/1143",[37,199.834,52,327.97,508,749.53,670,667.664]],["content/1143",[4,2.208,5,2.926,6,1.312,23,2.065,37,2.275,52,5.136,60,6.955,62,5.805,63,2.972,86,5.476,97,4.758,100,5.019,103,8.307,186,4.006,189,6.92,190,6.339,191,4.074,203,6.872,230,4.281,241,5.037,273,2.972,297,5.288,308,4.387,329,6.039,334,3.907,373,3.495,381,4.373,397,8.645,408,6.168,508,8.534,512,5.547,513,8.056,516,6.968,607,7.347,674,4.964,718,7.565,763,6.92,894,5.193,940,8.233,944,7.601,958,6.268,1821,9.02,1872,7.289,2336,10.957,3007,11.357,3367,6.528,4024,11.357,6045,10.623,6064,13.552,6065,13.552,6066,13.552,6067,13.552,6068,13.552,6069,13.552,6070,13.552]],["keywords/1143",[]],["title/1144",[4,123.338,25,79.157,37,199.834,508,749.53]],["content/1144",[22,6.35,23,4.074,24,7.629,32,3.713,33,2.269,34,4.018,35,5.032,37,3.711,108,9.154,198,4.687,355,6.915,511,15.763,764,9.592,777,7.819,1300,8.072,1613,9.756,4970,17.325]],["keywords/1144",[]],["title/1145",[2,351.353,52,264.317,58,351.353,271,340.282,308,310.517,6047,887.06]],["content/1145",[4,1.413,19,4.089,20,6.11,22,4.914,23,4.019,24,6.463,28,5.9,29,5.658,30,6.417,32,4.525,34,3.123,35,3.912,37,2.29,50,7.519,52,6.646,112,8.945,151,4.208,164,4.283,172,7.867,308,4.415,355,5.375,373,4.829,408,4.513,452,6.309,504,8.302,511,13.354,764,7.457,777,6.078,1613,7.584,1648,9.545,4970,16.76,6048,17.315,6049,17.315,6050,17.315,6051,17.315,6052,12.613,6053,11.432]],["keywords/1145",[]],["title/1146",[4,140.222,511,965.11,6071,1184.242]],["content/1146",[4,2.208,23,4.082,24,5.72,32,3.507,34,3.794,35,4.752,37,2.782,45,7.055,67,6.667,88,5.681,151,5.112,172,9.556,184,3.593,201,6.4,355,6.53,395,6.967,408,5.482,480,5.961,508,14.834,1613,9.213,4970,16.705,6071,14.501]],["keywords/1146",[]],["title/1147",[25,79.157,220,420.766,315,387.69,508,749.53]],["content/1147",[1,6.327,4,1.471,6,1.863,14,5.337,21,8.189,25,0.944,44,3.953,49,6.68,58,5.2,85,6.839,184,4.173,185,3.43,193,5.689,202,4.368,204,6.718,207,12.034,220,7.717,225,6.898,252,5.506,272,6.054,278,3.822,293,3.974,299,8.83,315,4.625,334,4.094,382,7.301,408,4.698,419,8.626,437,5.572,508,8.941,511,13.724,536,4.868,556,5.072,622,5.762,652,6.798,664,7.104,732,6.733,886,5.072,887,8.269,891,7.827,971,8.44,1065,8.353,1110,8.111,1378,8.83,1663,7.894,2154,13.129,6072,14.198]],["keywords/1147",[]],["title/1148",[4,123.338,207,656.155,315,387.69,511,848.901]],["content/1148",[22,5.121,23,4.017,24,5.002,25,0.964,28,4.138,29,6.011,32,3.067,33,1.874,34,3.318,35,2.744,37,2.433,45,2.714,52,2.636,70,3.534,108,4.991,114,4.213,124,3.583,154,3.517,162,3.382,167,4.158,185,2.311,198,4.673,206,3.406,207,13.009,225,3.43,226,8.931,240,2.136,252,5.619,293,2.678,305,5.951,315,4.72,355,3.771,398,3.583,401,4.286,408,3.166,425,5.213,427,3.517,437,3.755,467,3.382,511,17.566,536,3.281,613,3.371,614,4.138,634,6.824,668,4.955,740,4.45,764,5.23,777,4.264,845,6.275,882,5.88,901,3.652,1064,6.696,1170,4.886,1300,4.401,1308,5.416,1313,5.688,1417,5.23,1536,6.696,1868,8.848,2094,7.122,2675,8.848,4867,8.848,4970,11.359,6071,17.074,6073,9.568,6074,9.568,6075,14.491,6076,9.568,6077,9.568,6078,9.568,6079,9.568,6080,9.568]],["keywords/1148",[]],["title/1149",[4,123.338,25,79.157,184,258.124,2692,832.941]],["content/1149",[4,1.668,6,0.811,14,3.148,19,2.511,22,4.774,23,4.11,24,4.515,25,1.07,32,2.768,33,1.083,34,2.995,35,4.615,37,2.196,40,3.197,45,5.598,49,3.94,97,2.94,108,4.369,111,3.16,184,5.038,198,2.237,201,3.235,220,5.69,224,5.516,225,3.002,226,4.277,227,4.307,239,11.863,240,1.87,241,3.113,242,4.617,243,6.017,246,2.646,271,2.971,272,3.571,273,1.837,307,7.544,308,2.711,315,4.261,334,2.415,355,3.301,462,3.328,511,11.479,572,2.992,622,5.308,630,6.687,639,3.986,758,3.622,764,4.578,765,4.287,770,4.136,771,6.449,772,3.474,773,5.155,774,4.578,775,4.01,777,3.732,780,4.435,845,5.493,936,4.163,975,4.505,996,3.791,1219,4.034,1300,3.853,1308,4.741,1309,3.94,1313,4.979,1343,4.979,1347,5.209,1540,5.209,2106,4.83,3586,7.544,4326,10.576,4822,4.979,4823,7.019,4903,7.019,4970,10.254,6081,8.376,6082,8.376,6083,8.376,6084,8.376]],["keywords/1149",[]],["title/1150",[180,622.502,273,296.762,2631,1184.242]],["content/1150",[6,1.773,9,6.043,19,3.959,23,3.46,25,1.398,33,1.708,44,3.678,45,3.747,63,2.896,99,4.653,154,4.855,155,3.937,162,4.669,164,4.148,183,4.16,198,3.528,202,4.063,224,4.005,273,4.978,284,4.685,293,3.697,301,3.01,315,4.302,319,5.886,330,5.054,334,3.808,385,4.838,396,4.315,399,7.22,410,8.54,425,6.588,438,4.946,490,5.248,508,8.317,511,9.42,536,4.529,537,4.329,538,6.565,543,6.782,544,4.928,545,3.658,636,7.22,660,7.409,734,6.653,735,5.947,858,6.653,888,6.89,889,8.931,1125,9.243,1176,7.545,1384,9.08,2631,11.559,6085,13.208,6086,13.208]],["keywords/1150",[]],["title/1151",[516,546.285,763,542.465,1902,652.904,3375,707.127,3858,810.359]],["content/1151",[3,5.613,4,2.087,14,6.512,22,3.202,23,3.07,25,1.339,37,2.908,40,4.658,45,3.462,70,2.976,87,4.24,103,5.438,114,3.547,151,3.765,154,4.486,155,3.637,203,6.188,291,5.842,297,3.462,334,3.518,385,4.469,408,5.732,437,4.789,466,6.366,467,4.313,468,5.583,486,10.298,508,10.909,512,4.995,514,4.374,539,5.676,557,4.848,607,6.616,642,5.466,763,11.195,872,6.146,906,6.616,994,6.563,996,5.523,1122,10.226,1147,6.727,1180,7.332,1204,6.275,1617,10.507,1672,9.865,1902,10.646,1940,9.865,2077,10.226,2502,6.065,2642,9.865,2836,10.678,3375,8.122,3858,9.308,3863,16.88,3864,10.226,4024,10.226,6087,11.284,6088,11.284,6089,11.284,6090,11.284,6091,11.284]],["keywords/1151",[]],["title/1152",[45,337.67,63,261.029,408,393.825,689,650.672]],["content/1152",[4,2.101,16,10.428,37,3.405,62,8.688,63,5.296,67,8.16,408,6.71,508,12.77,894,7.772,2443,15.897,3661,16.996]],["keywords/1152",[]],["title/1153",[275,396.341,408,393.825,514,426.689,2900,792.272]],["content/1153",[]],["keywords/1153",[]],["title/1154",[581,790.783]],["content/1154",[4,1.818,22,4.604,23,4.221,24,4.287,25,1.352,32,3.712,33,1.606,34,2.844,35,3.562,36,6.479,37,3.414,52,4.833,107,3.051,114,3.611,193,4.976,198,4.686,275,5.841,287,6.174,329,5.535,371,6.479,381,4.008,408,7.712,425,4.468,427,6.449,514,7.29,571,8.145,745,6.79,843,5.622,1074,6.79,1628,11.965,1827,6.967,2900,11.676,4028,10.32,4029,9.151,6092,15.351,6093,17.542]],["keywords/1154",[]],["title/1155",[275,522.063,408,518.75]],["content/1155",[]],["keywords/1155",[]],["title/1156",[401,702.281,556,560.063]],["content/1156",[6,1.685,15,10.134,22,5.77,24,6.006,45,4.936,122,7.637,171,4.544,172,10.035,230,5.497,275,7.321,323,9.592,405,8.947,420,10.572,527,11.305,614,7.526,626,13.273,674,6.373,776,8.282,1030,8.539,1204,8.947,1385,14.583,1663,9.675,1847,12.952,6094,17.4,6095,17.4,6096,17.4]],["keywords/1156",[]],["title/1157",[703,695.225]],["content/1157",[4,1.481,6,1.872,10,5.657,37,2.4,44,3.981,51,4.626,54,6.213,63,3.135,67,5.752,87,4.968,190,6.687,275,7.814,289,6.649,371,7.458,386,10.406,389,7.351,467,5.053,499,7.513,527,7.351,534,10.195,555,8.891,694,7.106,703,8.756,720,10.904,785,4.36,865,9.375,886,5.107,894,7.409,914,6.725,969,9.666,1029,10.406,1193,10.904,1320,7.689,1548,9.119,1713,7.751,1723,11.981,1846,10.406,1965,10.004,2165,9.666,2254,8.091,2612,10.195,3188,13.219,3990,10.641,6097,14.296,6098,14.296,6099,14.296]],["keywords/1157",[]],["title/1158",[4,123.338,25,79.157,275,396.341,408,393.825]],["content/1158",[22,4.981,23,4.257,24,5.542,25,0.73,32,3.398,33,1.42,34,4.781,35,3.149,37,2.695,108,5.728,111,4.143,152,3.196,198,2.933,224,3.329,271,3.895,273,2.408,275,3.656,334,3.166,355,4.327,572,3.922,630,7.676,758,4.749,764,6.002,765,5.262,767,11.928,770,5.423,771,8.366,772,4.555,773,6.327,776,7.642,777,4.893,780,5.814,787,5.321,804,5.321,805,7.201,886,3.922,1157,11.282,1257,5.024,1300,5.051,1308,6.215,1313,6.527,1320,5.906,1345,6.829,1444,8.98,1613,6.105,1641,7.993,6100,10.98,6101,10.98,6102,10.98,6103,10.98]],["keywords/1158",[]],["title/1159",[20,475.86,275,353.746,308,343.888,332,929.703,504,471.004]],["content/1159",[4,2.121,20,9.17,21,8.985,22,5.373,23,4.023,24,7.067,25,1.036,32,3.297,34,3.567,35,4.467,37,3.437,51,3.728,114,4.529,275,8.087,308,5.043,332,13.633,355,6.139,389,8.011,504,6.907,764,8.516,776,9.744,777,6.942,1169,7.127,1613,8.662,1648,10.902,2731,11.883,6104,20.473]],["keywords/1159",[]],["title/1160",[2,495.646,315,440.762,408,447.737]],["content/1160",[]],["keywords/1160",[]],["title/1161",[2778,1328.96]],["content/1161",[2,6.537,4,1.849,6,1.728,10,7.062,33,2.308,34,4.086,37,2.996,63,3.914,107,4.384,149,9.266,192,6,301,4.068,373,4.603,512,7.306,711,7.574,736,6.684,745,9.756,782,10.5,785,5.443,786,7.646,792,10.293,1058,9.243,1426,13.614,1554,12.489,6105,16.504]],["keywords/1161",[]],["title/1162",[2651,1356.449]],["content/1162",[2,9.095,4,1.62,5,3.375,6,1.799,7,4.88,10,4.19,12,5.451,13,9.267,23,1.614,25,1.365,34,2.425,37,3.12,45,3.004,50,5.838,51,3.741,54,4.602,61,8.408,62,6.697,72,7.441,149,4.393,152,2.108,184,4.03,217,3.783,223,5.445,230,3.345,271,5.546,297,4.435,301,2.413,315,6.684,323,5.838,364,5.741,381,5.045,399,5.789,408,5.172,435,4.845,455,5.07,461,8.875,462,4.208,463,7.552,468,7.152,469,12.254,510,5.37,552,5.565,673,5.524,763,5.407,786,6.697,827,6.508,952,5.994,955,6.107,1000,5.696,1058,5.484,1160,7.928,1204,5.445,1298,6.363,1614,5.407,2250,8.301,2421,7.882,2422,8.562,2428,8.875,2724,7.882,5914,8.562,6106,10.59,6107,9.267,6108,15.575,6109,10.59,6110,9.792,6111,9.792,6112,10.59]],["keywords/1162",[]],["title/1163",[581,790.783]],["content/1163",[2,6.889,4,1.949,10,7.443,22,4.936,23,4.271,24,4.739,25,1.251,32,4.54,34,3.144,35,3.937,36,7.163,37,4.059,52,5.183,193,5.501,198,3.668,246,4.338,315,6.126,355,5.411,408,7.099,843,6.215,1628,8.078,4028,11.065,4029,9.812,6113,16.46,6114,15.764]],["keywords/1163",[]],["title/1164",[467,658.712]],["content/1164",[2,6.605,4,0.854,7,2.573,10,5.112,11,5.406,12,4.505,22,3.39,23,4.263,25,0.548,32,1.744,34,1.887,37,3.775,44,2.295,51,1.973,54,3.583,60,4.82,63,1.808,69,2.573,76,7.679,88,2.826,103,3.673,124,7.334,136,4.754,148,4.754,149,3.419,152,1.641,155,3.851,161,4.081,164,2.589,167,3.583,171,4.16,184,3.455,192,2.771,198,2.202,201,3.184,219,3.064,222,2.248,230,6.187,246,2.604,273,1.808,293,2.307,345,6.288,373,3.332,380,6,385,3.019,391,4.152,427,3.03,458,3.834,459,6.288,467,6.375,513,4.9,557,3.275,590,3.515,736,3.087,765,2.702,785,3.94,843,3.731,901,3.147,969,5.573,983,4.9,1058,4.269,1089,4.754,1116,6.421,1169,3.771,1354,5.008,1377,3.856,1551,6.664,1633,4.709,1724,5.33,2131,4.953,2281,5.487,3375,5.487,3551,6.664,3770,6.136,5412,14.731,5783,7.622,5914,6.664,6043,7.622,6108,10.827,6113,7.214,6114,10.827,6115,14.731,6116,8.243]],["keywords/1164",[]],["title/1165",[2,389.113,37,178.358,184,230.384,315,346.025,435,486.049]],["content/1165",[2,6.629,4,1.875,19,3.036,23,4.233,24,5.22,32,4.546,33,2.596,34,4.596,35,4.337,37,3.921,52,2.79,65,3.319,88,5.185,124,3.792,155,3.018,184,4.353,198,5.363,224,3.07,230,3.199,234,4.684,273,2.221,297,2.873,315,5.895,364,5.49,373,3.9,381,4.88,399,5.535,435,8.281,458,4.71,843,4.584,1204,5.207,1255,14.633,1342,6.847,2131,6.084,4028,5.957,6108,15.169,6113,8.862,6114,15.169,6115,9.364,6117,15.123,6118,10.126,6119,15.123,6120,10.126,6121,10.126,6122,10.126,6123,10.126,6124,10.126]],["keywords/1165",[]],["title/1166",[2,574.258,408,518.75]],["content/1166",[]],["keywords/1166",[]],["title/1167",[2778,1328.96]],["content/1167",[4,2.187,15,12.29,97,7.408,958,9.761,1030,10.355,1327,11.261,1821,14.046,6125,21.102]],["keywords/1167",[]],["title/1168",[2651,1356.449]],["content/1168",[2,6.769,10,7.313,22,5.991,23,4.126,24,7.88,25,1.229,32,3.911,34,4.231,35,5.3,37,3.103,355,7.283,777,8.235,1612,16.992,1613,10.276]],["keywords/1168",[]],["title/1169",[295,963.564,408,518.75]],["content/1169",[]],["keywords/1169",[]],["title/1170",[2778,1328.96]],["content/1170",[5,3.788,6,2.343,12,6.118,40,6.698,52,4.835,61,11.887,103,9.849,124,6.571,149,10.036,273,3.848,301,5.037,373,4.525,405,9.023,408,5.806,527,9.023,711,7.446,736,6.571,761,12.773,786,9.468,6126,17.547]],["keywords/1170",[]],["title/1171",[2651,1356.449]],["content/1171",[4,1.703,5,3.549,6,2.053,7,5.132,11,10.78,12,5.732,15,9.574,33,2.126,34,3.764,51,3.934,53,6.944,61,8.842,124,6.156,215,8.64,217,5.872,297,4.664,301,4.832,461,13.777,462,6.532,463,11.724,773,6.478,952,9.305,1256,9.305,2049,10.629,2428,13.777,3758,10.224,4040,10.942,4791,15.201,6107,14.386,6127,16.439,6128,16.439,6129,21.202,6130,16.439]],["keywords/1171",[]],["title/1172",[581,790.783]],["content/1172",[1,10.399,4,1.461,6,1.365,10,7.58,14,5.301,22,5.027,23,4.19,24,6.612,25,1.274,32,4.054,34,3.229,35,4.044,37,2.368,51,3.375,52,5.994,54,6.129,114,4.1,162,4.985,171,3.682,295,11.772,355,5.557,467,4.985,777,6.284,1140,10.497,1248,16.763,1571,9.535,1613,7.841,2303,7.585,6131,19.155,6132,14.102,6133,12.341,6134,12.341]],["keywords/1172",[]],["title/1173",[1,830.371]],["content/1173",[1,11.353,5,3.82,6,1.713,10,7.002,52,4.876,58,6.481,81,12.621,84,9.443,99,6.234,114,5.144,167,7.691,222,4.825,295,14.928,302,14.307,329,7.886,642,7.926,806,8.524,1196,11.605,2178,12.383,6135,17.696,6136,17.696,6137,16.364]],["keywords/1173",[]],["title/1174",[281,524.746,297,383.895,379,619.122]],["content/1174",[2,4.66,4,1.849,6,1.995,10,5.035,11,8.344,12,4.437,18,4.25,25,0.846,33,2.664,45,3.61,50,7.014,51,3.045,69,5.57,72,6.056,79,6.738,97,4.467,149,5.278,154,4.677,162,4.498,171,3.323,198,4.766,219,4.73,264,3.689,273,3.913,279,12.249,281,9.908,295,13.727,311,7.644,373,3.281,381,4.106,427,4.677,455,6.092,507,7.914,510,6.452,716,4.594,792,7.338,843,5.759,926,6.497,1256,7.202,1257,5.821,1339,5.699,1554,8.904,1711,8.344,1726,6.844,2058,8.117,3375,8.469,3650,11.766,3758,7.914,3784,11.135,4040,11.876,6138,12.724]],["keywords/1174",[]],["title/1175",[6133,1372.068,6134,1372.068]],["content/1175",[1,5.776,4,1.343,10,9.958,18,7.521,22,3.402,25,1.202,33,3.062,62,5.552,63,2.842,69,4.046,88,4.444,124,4.854,147,8.268,148,7.475,149,9.34,154,6.644,155,5.388,171,3.385,177,6.665,186,3.831,222,3.534,224,3.93,228,5.661,230,4.095,295,11.108,373,5.367,381,4.183,467,4.582,510,6.573,668,6.713,716,6.525,782,10.633,1089,7.475,1157,7.705,1309,8.503,1444,6.133,1564,8.268,2114,8.5,2252,7.875,3770,9.648,6133,11.343,6134,15.818,6139,11.986,6140,12.962]],["keywords/1175",[]],["title/1176",[72,746.242,134,887.422]],["content/1176",[4,1.395,23,4.338,45,3.82,46,4.358,50,10.23,51,4.441,171,3.516,257,6.031,295,11.405,328,10.886,494,10.27,499,7.076,642,6.031,737,4.527,879,5.242,1116,9.224,1257,8.49,1261,8.589,1263,15.145,1377,6.298,1586,10.554,1711,12.17,3828,10.554,3849,16.24,3951,9.422,4577,17.161,6141,18.558,6142,13.464,6143,13.464]],["keywords/1176",[]],["title/1177",[4,123.338,33,153.915,295,731.52,1827,667.664]],["content/1177",[4,1.471,23,3.931,25,1.28,30,6.68,32,4.072,33,1.836,34,4.406,87,4.934,162,5.019,230,4.485,241,5.278,290,10.83,295,8.726,308,4.596,319,6.327,330,3.414,355,5.595,394,7.2,419,8.626,556,5.072,557,5.641,751,8.726,785,4.33,858,7.151,894,5.441,1257,6.496,1300,6.531,1827,10.794,2707,10.83,2785,13.129,3778,8.531,3781,9.057,3887,9.761,4102,11.899,4365,12.425,4482,11.899,6137,13.129,6144,14.198,6145,14.198,6146,14.198,6147,14.198,6148,14.198,6149,14.198,6150,14.198,6151,14.198,6152,14.198]],["keywords/1177",[]],["title/1178",[516,546.285,763,542.465,1902,652.904,3375,707.127,3858,810.359]],["content/1178",[3,5.613,4,2.087,14,6.512,22,3.202,23,3.07,25,1.339,37,2.908,40,4.658,45,3.462,70,2.976,87,4.24,103,5.438,114,3.547,151,3.765,154,4.486,155,3.637,203,6.188,291,5.842,295,7.499,297,3.462,334,3.518,385,4.469,408,5.732,437,4.789,466,6.366,467,4.313,468,5.583,486,10.298,512,4.995,514,4.374,539,5.676,557,4.848,607,6.616,642,5.466,763,11.195,872,6.146,906,6.616,994,6.563,996,5.523,1122,10.226,1147,6.727,1180,7.332,1204,6.275,1617,10.507,1672,9.865,1902,10.646,1940,9.865,2077,10.226,2502,6.065,2642,9.865,2836,10.678,3375,8.122,3858,9.308,3863,16.88,3864,10.226,4024,10.226,6087,11.284,6088,11.284,6089,11.284,6090,11.284,6091,11.284,6153,12.202]],["keywords/1178",[]],["title/1179",[2,495.646,408,447.737,1614,690.985]],["content/1179",[]],["keywords/1179",[]],["title/1180",[2778,1328.96]],["content/1180",[2,7.687,4,1.677,5,3.494,6,2.032,10,6.404,18,5.406,33,2.093,34,3.705,63,3.549,107,3.975,149,8.706,192,5.441,273,3.549,301,3.688,373,5.413,452,7.486,480,7.551,507,10.065,512,6.625,516,8.322,645,9.521,711,6.868,736,6.061,745,8.847,782,9.521,785,4.935,786,6.933,792,9.334,1058,8.381,1426,12.345,1554,11.325,6105,14.965,6154,16.184]],["keywords/1180",[]],["title/1181",[2651,1356.449]],["content/1181",[2,9.077,4,1.272,5,4.362,6,2.247,7,5.43,10,4.857,12,6.066,13,10.741,23,1.871,25,1.157,34,2.81,37,3.69,50,6.766,51,4.163,54,5.335,61,9.356,72,8.28,149,7.216,152,2.444,215,6.451,217,4.384,223,6.312,230,3.878,297,3.482,301,2.797,455,5.877,461,10.287,462,4.877,463,8.754,510,6.224,673,6.403,763,6.267,786,7.452,952,6.947,955,7.079,1058,6.357,1077,6.947,1160,8.821,1204,6.312,1298,7.375,1614,8.882,2250,9.621,2428,10.287,2724,9.136,3367,8.379,5914,9.924,6107,10.741,6108,14.579,6110,11.35,6111,11.35,6155,12.274,6156,12.274]],["keywords/1181",[]],["title/1182",[2,435.966,4,123.338,408,393.825,1614,607.783]],["content/1182",[2,6.889,4,1.949,10,7.443,22,4.936,23,4.271,24,4.739,25,1.251,32,4.54,34,3.144,35,3.937,36,7.163,37,4.191,52,5.183,193,5.501,198,3.668,355,5.411,408,7.099,843,6.215,1614,9.604,1628,8.078,4028,11.065,4029,9.812,4583,14.347,6114,15.764]],["keywords/1182",[]],["title/1183",[281,524.746,297,383.895,379,619.122]],["content/1183",[2,8.167,4,2.466,7,6.178,12,7.774,33,1.914,37,3.996,45,4.2,46,4.792,51,5.336,53,6.253,58,5.422,69,6.96,88,5.076,99,5.215,182,2.954,264,5.738,281,7.675,289,6.886,311,8.479,329,6.597,373,3.818,490,5.882,736,5.544,743,10.359,889,10.009,1072,10.359,1614,11.385,2130,9.708,2492,12.025]],["keywords/1183",[]],["title/1184",[6,131.019,10,535.472,480,486.819]],["content/1184",[2,8.009,4,1.788,5,2.619,6,1.175,10,4.8,18,4.052,22,5.269,23,4.12,24,4.187,25,1.454,32,3.651,34,2.778,35,3.479,36,6.329,37,4.146,52,3.343,152,2.415,186,3.586,200,4.526,223,6.238,249,6.866,265,4.364,273,3.783,355,4.781,370,7.639,371,9,373,4.449,408,4.014,480,7.866,507,7.545,645,7.137,737,4.079,1089,6.996,1121,7.844,1614,10.251,4025,15.953,4027,11.218,4028,10.149,4029,9,4583,13.159]],["keywords/1184",[]],["title/1185",[10,535.472,34,309.835,230,427.504]],["content/1185",[2,7.886,10,8.52,14,6.33,18,5.625,23,3.282,32,3.563,37,3.985,54,7.318,124,8.063,155,5.019,161,5.319,171,4.397,230,5.319,321,10.348,330,4.048,373,5.553,496,6.804,785,7.238,1086,10.887,1614,8.598,4028,9.906,4583,12.844,5914,17.408]],["keywords/1185",[]],["title/1186",[499,711.201,703,504.882,958,625.942]],["content/1186",[2,6.021,5,3.549,23,3.231,32,3.479,37,3.94,54,7.145,62,7.042,63,3.605,149,6.819,152,3.273,201,8.189,215,8.64,230,5.193,499,12.334,527,8.453,590,7.009,736,7.94,786,7.042,1220,9.391,1310,9.574,1511,11.967,1614,8.394,1712,11.504,1814,10.352,2436,14.386,4028,9.671,4583,12.539,6157,21.202]],["keywords/1186",[]],["title/1187",[260,811.993,408,518.75]],["content/1187",[]],["keywords/1187",[]],["title/1188",[260,700.837,408,447.737,703,504.882]],["content/1188",[4,1.639,25,1.625,33,2.674,37,2.655,63,3.468,69,4.937,76,9.401,88,5.423,230,7.277,240,3.531,260,11.93,273,3.468,279,9.401,280,10.088,297,4.487,301,3.604,326,12.397,334,4.56,389,8.132,504,7.012,516,10.632,545,4.381,674,5.793,747,11.279,843,7.159,1268,10.708,1633,9.035,2301,10.088,3092,11.772,6158,15.815,6159,15.815]],["keywords/1188",[]],["title/1189",[4,140.222,260,700.837,408,447.737]],["content/1189",[4,1.949,22,5.631,23,4.111,24,6.492,25,0.913,28,5.938,29,7.802,30,6.459,32,2.906,34,3.144,35,3.937,37,3.158,108,7.163,109,8.878,174,8.162,198,3.668,251,7.634,260,12.93,314,8.186,408,4.543,580,6.316,727,9.608,773,8.455,777,6.118,843,6.215,901,5.241,1300,6.316,1613,7.634,1663,7.634,3813,8.342,5387,19.839,5389,12.697,6160,13.73]],["keywords/1189",[]],["title/1190",[23,161.915,25,70.65,37,178.358,2427,810.359,3529,929.703]],["content/1190",[]],["keywords/1190",[]],["title/1191",[63,296.762,408,447.737,689,739.744]],["content/1191",[4,2.022,5,4.213,6,1.889,7,4.525,8,10.333,19,4.345,25,1.298,33,1.874,37,3.276,40,5.533,46,4.692,51,3.469,52,3.994,58,5.309,63,5.176,65,8.315,84,7.735,99,5.106,100,5.368,122,8.565,193,5.808,206,5.16,215,7.618,240,3.236,329,8.696,375,7.561,381,4.677,391,7.301,408,4.796,520,6.561,641,10.143,703,5.408,769,10.551,861,6.742,874,6.426,1981,9.648,2719,12.148]],["keywords/1191",[]],["title/1192",[10,620.079,37,178.358,670,595.91,1637,890.35]],["content/1192",[2,8.137,4,1.833,5,2.714,6,1.982,9,8.094,10,8.791,16,6.464,18,4.199,25,0.836,30,5.914,37,3.73,63,3.88,73,6.419,107,3.088,149,7.338,152,3.522,177,6.464,215,6.606,228,5.49,230,3.971,246,3.971,273,2.757,373,3.242,375,6.558,405,6.464,410,11.438,459,9.588,483,6.761,484,7.051,490,4.995,496,5.079,507,12.732,527,6.464,587,8.019,694,6.248,716,4.538,888,6.558,952,7.115,955,7.25,1030,6.168,1058,6.51,1089,7.25,1134,7.115,1205,16.046,1426,9.588,1444,5.948,1614,6.419,1631,7.115,1637,14.826,2055,10.535,2488,9.15,3963,9.588,6161,12.57]],["keywords/1192",[]],["title/1193",[63,343.83,689,857.071]],["content/1193",[4,2.353,15,10.669,25,1.51,63,4.979,67,7.371,171,4.783,203,9.289,329,8.163,527,9.42,581,7.774,642,8.205,689,10.014,785,5.586,879,7.132,1931,11.535,1981,15.112,1984,11.685,2131,11.007,2502,9.105]],["keywords/1193",[]],["title/1194",[1981,1240.307]],["content/1194",[5,4.313,33,1.941,37,1.684,86,6.067,107,4.42,148,5.784,152,5.251,154,6.615,186,2.964,187,6.163,193,8.997,198,2.679,201,3.873,224,3.041,230,3.168,246,4.743,249,5.676,273,3.292,301,4.101,334,2.892,373,4.641,381,3.236,490,3.985,520,9.043,552,5.271,642,8.06,716,5.42,736,8.012,761,7.3,771,6.015,775,8.616,782,5.9,787,10.368,792,10.378,879,3.904,1219,4.831,1313,8.925,1552,10.322,1713,5.437,1724,9.707,1981,11.978,2036,14.106,2169,8.776,2252,6.093,3661,8.405,4176,12.582,4430,8.405,5347,9.274,6162,10.029,6163,10.029,6164,10.029,6165,10.029,6166,10.029,6167,10.029,6168,8.776,6169,10.029]],["keywords/1194",[]],["title/1195",[37,178.358,51,254.223,63,232.977,114,308.839,689,580.745]],["content/1195",[2,6.651,4,1.882,20,8.134,37,4.126,51,4.345,52,5.003,63,4.952,67,7.306,73,9.272,114,5.279,246,5.737,378,10.911,397,11.583,413,9.404,484,10.186,568,10.683,874,8.051,886,6.487,1614,9.272,1662,14.234,1984,11.583]],["keywords/1195",[]],["title/1196",[37,178.358,63,232.977,114,308.839,689,580.745,6170,1062.382]],["content/1196",[4,2.379,37,3.13,58,8.407,73,9.521,99,6.569,100,6.905,142,10.97,182,4.58,205,5.964,206,8.171,240,4.164,260,9.657,381,6.017,408,6.169,506,10.11,516,9.588]],["keywords/1196",[]],["title/1197",[0,850.067,408,518.75]],["content/1197",[]],["keywords/1197",[]],["title/1198",[0,733.699,77,1094.088,408,447.737]],["content/1198",[0,13.187,1,3.017,4,2.08,5,2.383,16,3.481,19,3.308,25,1.48,33,1.807,34,1.55,37,2.346,45,3.964,46,3.572,49,3.185,51,1.62,52,1.865,63,2.42,67,4.441,70,2.692,72,5.253,92,2.886,111,4.165,125,2.679,136,3.904,152,3.208,161,2.139,164,2.126,179,3.365,182,1.351,184,3.495,191,2.035,192,3.711,196,3.435,198,1.808,201,6.855,202,3.395,203,3.433,205,2.868,206,3.929,218,5.164,232,4.024,239,8.229,240,3.12,246,2.139,249,3.832,254,4.024,271,3.915,272,4.706,273,3.534,277,6.365,278,1.822,301,2.515,315,2.205,329,4.918,330,2.653,353,5.924,356,3.149,359,4.928,361,3.797,370,4.263,371,3.532,378,4.068,387,3.943,391,3.41,395,2.846,396,5.265,398,4.133,399,3.701,400,3.048,406,5.924,408,7.163,409,8.913,410,4.377,413,5.716,435,3.097,442,4.928,466,3.532,467,2.393,468,3.097,482,3.701,487,4.263,493,4.21,545,1.875,552,3.558,555,4.21,560,3.585,598,4.577,607,5.984,648,4.263,673,3.532,688,4.113,714,4.506,744,8.215,747,4.828,785,2.064,886,2.418,952,3.832,958,3.131,1066,3.613,1072,4.737,1077,3.832,1086,4.377,1116,3.365,1268,3.506,1325,4.377,1329,7.085,1332,3.641,1398,4.263,1580,5.039,1656,4.506,1711,7.238,1726,3.641,2112,4.439,2172,4.577,2242,5.307,2542,4.928,3333,5.473,3748,5.307,4591,6.26,4595,5.674,6171,6.77,6172,6.77,6173,6.77,6174,6.77,6175,6.77,6176,6.77]],["keywords/1198",[]],["title/1199",[2778,1328.96]],["content/1199",[1,9.217,5,4.465,184,4.485,239,10.561,253,18.1,1305,14.473,2170,18.1,6177,20.683,6178,20.683,6179,20.683]],["keywords/1199",[]],["title/1200",[2651,1356.449]],["content/1200",[63,4.675,215,11.204,277,12.295,278,5.738,393,11.466,1261,13.598,6180,21.318]],["keywords/1200",[]],["title/1201",[581,790.783]],["content/1201",[0,8.843,1,7.268,22,5.536,23,4.277,24,7.281,25,1.085,26,17.679,27,13.669,31,11.213,32,3.452,34,3.734,35,4.677,37,2.738,55,19.507,92,6.954,109,10.546,126,15.082,355,6.428,467,5.766,1613,9.069,6181,16.311]],["keywords/1201",[]],["title/1202",[112,887.426,144,831.659,1254,914.982]],["content/1202",[0,8.707,4,1.664,8,8.504,23,3.98,25,1.068,51,3.843,81,11.453,92,6.847,111,6.06,114,4.668,144,12.834,193,6.434,250,8.57,257,7.193,280,10.244,569,7.88,598,10.858,1178,15.692,1254,10.858,1263,11.453,1377,7.512,1937,13.459,2720,10.112,2923,13.459,4072,14.85,4073,14.85,4074,14.053,6182,16.059,6183,16.059,6184,16.059,6185,16.059]],["keywords/1202",[]],["title/1203",[1,830.371]],["content/1203",[0,11.8,1,9.698,7,6.794,8,11.524,201,8.406]],["keywords/1203",[]],["title/1204",[0,645.355,4,123.338,33,153.915,1827,667.664]],["content/1204",[0,9.677,4,1.849,22,4.684,23,3.716,25,1.486,27,14.958,32,3.777,33,2.308,87,6.202,170,15.619,241,6.634,290,13.614,308,5.777,319,7.953,330,4.291,394,9.051,419,10.843,785,5.443,894,6.839,1827,10.011,2707,13.614,6186,17.848,6187,17.848]],["keywords/1204",[]],["title/1205",[25,49.41,33,96.074,98,318.282,287,369.302,395,312.401,408,245.826,873,446.421,874,527.51]],["content/1205",[]],["keywords/1205",[]],["title/1206",[874,826.145]],["content/1206",[4,1.318,37,2.996,51,3.045,52,4.916,53,5.375,58,4.66,63,2.79,84,6.79,86,5.141,87,4.422,92,5.425,96,7.202,98,10.075,103,5.67,182,4.111,192,4.278,200,4.747,202,3.914,205,3.306,206,4.529,222,4.865,252,4.934,275,4.237,287,8.869,293,3.562,308,4.119,334,3.669,356,5.918,395,5.35,396,4.157,438,4.765,489,9.471,512,5.208,514,4.561,525,6.687,536,4.363,557,5.056,562,7.338,659,5.853,692,6.497,785,5.441,873,10.721,874,9.136,932,5.79,963,4.914,971,7.564,994,6.844,1023,9.471,1041,9.974,1082,8.469,1106,10.664,1207,7.338,1427,6.79,1604,8.227,2970,15.614,6188,12.724,6189,12.724,6190,11.766]],["keywords/1206",[]],["title/1207",[703,584.959,874,695.115]],["content/1207",[4,1.335,5,2.781,6,2.008,22,3.381,51,4.307,53,5.441,63,2.825,66,9.377,70,3.141,87,4.476,98,5.518,177,6.624,182,2.57,192,4.331,222,4.907,230,4.069,256,6.06,278,3.468,287,6.403,289,8.371,297,5.884,308,6.714,361,7.225,395,5.416,402,7.429,476,7.826,483,6.928,539,5.992,590,5.492,613,6.34,674,4.718,703,4.806,704,6.77,872,6.488,873,7.74,874,7.979,901,7.918,958,5.958,1028,7.429,1075,9.588,1124,8.329,1377,6.025,1595,8.011,1617,6.72,1706,8.447,1707,9.187,1708,8.856,1797,11.912,1845,10.796,1862,11.273,2253,6.095,2254,10.186,2492,7.826,2964,10.097,3939,11.912,5489,11.912,6191,12.881]],["keywords/1207",[]],["title/1208",[46,438.039,308,438.039,874,599.958]],["content/1208",[4,1.765,6,1.154,10,2.947,23,4.135,25,0.495,32,4.735,34,5.122,35,2.136,46,2.411,67,2.997,84,3.974,87,2.588,98,10.225,107,1.829,124,4.464,162,7.028,186,2.201,198,5.311,222,2.031,228,3.253,230,5.382,286,4.577,298,3.654,308,4.825,311,3.19,326,5.838,329,3.319,330,1.791,349,4.815,375,3.885,395,3.131,465,5.543,498,4.632,510,3.777,529,4.215,572,2.66,580,3.426,613,5.251,662,5.311,663,4.105,674,4.366,758,3.221,769,5.421,773,4.698,869,4.884,873,4.475,874,5.285,901,2.843,955,4.295,958,3.445,1081,4.577,1170,3.803,1183,4.105,1332,4.006,1444,3.524,1526,4.071,1718,5.421,1726,4.006,2502,5.925,2669,5.035,2896,6.887,2970,6.517,3011,6.887,3030,9.638,3236,11.684,3445,6.887,3563,5.12,6192,7.447,6193,7.447,6194,7.447,6195,7.447,6196,7.447,6197,6.887,6198,7.447,6199,7.447,6200,7.447,6201,7.447,6202,7.447,6203,7.447,6204,11.921,6205,7.447,6206,7.447,6207,11.921,6208,7.447,6209,7.447,6210,11.921,6211,7.447,6212,7.447,6213,11.921,6214,7.447,6215,7.447,6216,7.447,6217,7.447,6218,7.447,6219,7.447,6220,7.447,6221,7.447,6222,7.447,6223,7.447,6224,7.447]],["keywords/1208",[]],["title/1209",[63,343.83,874,695.115]],["content/1209",[16,7.301,20,6.36,25,0.944,37,3.231,52,5.302,61,7.636,63,4.22,86,7.776,87,4.934,98,9.351,103,10.428,162,5.019,191,5.785,192,6.47,193,5.689,198,3.793,230,4.485,273,3.114,275,4.728,287,7.057,293,3.974,301,3.236,308,4.596,322,5.219,395,5.97,402,8.189,510,7.2,537,4.653,543,5.258,554,6.798,564,6.567,659,6.531,674,7.048,689,7.761,692,7.25,716,5.126,787,6.881,873,8.531,874,6.295,1610,8.83,1638,11.13,1821,9.451,6190,13.129,6225,14.198]],["keywords/1209",[]],["title/1210",[4,123.338,25,79.157,408,393.825,874,527.718]],["content/1210",[4,1.327,14,4.813,22,4.703,23,4.2,24,6.185,25,1.489,32,2.709,33,1.655,34,2.931,35,3.671,36,6.679,37,2.149,45,3.632,53,5.408,89,8.062,98,7.676,107,3.145,364,6.941,373,3.302,375,6.679,389,6.583,408,6.84,476,7.778,747,9.13,763,9.15,874,7.945,1028,7.383,1040,8.166,1160,6.492,1180,7.692,1891,8.959,2253,8.479,2502,6.363,2516,9.529,2969,8.656,3680,9.765,4029,6.679,6226,11.838,6227,12.802,6228,13.669,6229,12.802,6230,11.838,6231,9.319,6232,11.203,6233,12.802]],["keywords/1210",[]],["title/1211",[4,99.401,289,446.197,381,309.561,874,425.298,2253,453.912,2254,542.959]],["content/1211",[4,2.2,22,4.87,23,3.782,24,6.406,25,1.412,32,2.849,33,1.741,34,3.083,35,3.861,36,7.024,37,2.26,53,5.687,84,9.903,87,4.679,151,4.154,230,4.253,289,9.878,297,5.265,308,4.358,375,7.024,382,6.923,401,6.031,489,10.022,539,6.263,674,4.931,675,6.263,718,5.464,738,8.705,874,8.228,894,5.16,901,5.14,940,8.18,1028,7.765,1636,9.422,1708,9.256,2253,6.371,2254,12.02,2502,6.692,2964,10.554,3019,11.284,4029,7.024,6234,11.783,6235,19.637,6236,13.464]],["keywords/1211",[]],["title/1212",[97,475.083,241,503.001,2255,965.11]],["content/1212",[14,5.77,22,5.321,23,4.009,25,1.348,32,3.248,37,4.054,45,5.751,53,8.564,97,5.389,98,8.685,154,5.642,184,3.329,189,7.837,370,9.665,373,3.958,515,7.58,723,10.378,874,6.805,2253,11.426,2255,14.459,4029,10.576,6234,17.742,6237,17.795]],["keywords/1212",[]],["title/1213",[4,99.401,53,405.208,171,250.496,843,434.208,2253,453.912,4178,839.484]],["content/1213",[4,2.394,6,1.175,14,4.56,19,3.637,22,3.184,23,3.521,25,0.807,32,2.567,37,2.037,53,9.236,86,4.902,98,5.197,103,5.406,117,11.218,124,6.461,171,4.505,184,2.631,186,3.586,187,7.455,198,3.241,217,4.333,240,2.709,280,7.738,289,8.024,322,4.46,401,5.434,425,4.364,438,4.543,452,5.611,543,4.492,549,6.376,572,4.333,579,7.844,674,6.319,772,5.032,773,7.912,785,3.699,843,9.087,874,7.648,894,4.649,1377,5.675,1388,7.738,1646,8.075,1827,6.805,2253,10.347,2254,9.764,2255,8.652,2353,8.652,4029,6.329,4178,15.097,4432,10.167,5408,11.218,6228,9.253,6234,15.097,6238,12.131]],["keywords/1213",[]],["title/1214",[58,389.113,99,374.253,506,575.999,874,471.004,1052,858.926]],["content/1214",[4,2.352,6,1.617,7,5.213,25,1.11,33,2.531,37,2.803,51,5.432,53,4.896,58,6.116,73,5.919,84,10.445,87,6.802,94,7.209,98,4.965,99,5.883,100,6.184,101,14.613,202,3.566,204,5.485,210,15.109,230,3.662,264,3.36,287,5.761,289,5.391,294,9.371,297,3.288,308,7.348,323,6.39,381,3.74,389,5.96,395,4.874,408,3.835,421,6.003,496,4.684,504,8.678,506,9.054,552,6.092,579,7.494,582,6.502,785,3.535,873,6.965,874,8.678,886,4.141,901,4.425,1052,9.371,1124,7.494,1718,8.438,1931,7.299,3563,7.969,3921,9.086,3924,10.719,3925,10.719,3927,10.719,6239,11.591]],["keywords/1214",[]],["title/1215",[65,211.691,87,224.451,98,454.945,219,240.08,287,321.043,308,209.074,395,446.538,873,388.084,874,286.357]],["content/1215",[4,1.386,6,1.295,65,4.385,70,5.161,84,9.859,87,7.932,98,11.386,176,4.882,196,4.164,219,4.972,230,4.226,246,4.226,287,6.649,293,3.745,308,6.851,326,10.486,375,6.979,395,10.877,396,4.371,420,8.128,447,11.785,482,7.313,723,9.045,785,4.08,872,6.738,873,11.101,874,9.383,1106,11.211,1160,6.784,1987,10.204,2118,9.045,2136,12.929,3236,10.486,5544,12.37,6197,12.37,6240,13.378]],["keywords/1215",[]],["title/1216",[222,369.003,857,695.85,874,599.958]],["content/1216",[20,9.173,98,10.407,287,10.179,304,10.315,308,6.629,395,8.611,873,12.305,6241,20.48,6242,20.48,6243,20.48]],["keywords/1216",[]],["title/1217",[408,518.75,652,750.686]],["content/1217",[]],["keywords/1217",[]],["title/1218",[581,790.783]],["content/1218",[22,5.186,23,4.226,24,4.069,32,3.577,34,2.699,37,3.992,40,4.5,151,6.096,161,3.724,162,5.975,164,3.702,183,3.713,205,3.063,206,6.016,272,5.026,275,3.925,298,5.784,572,4.211,652,10.94,771,4.723,776,8.045,777,8.805,845,7.73,996,5.336,1339,8.85,1617,11.259,1726,9.09,1872,6.34,2203,7.73,2638,8.992,4928,14.791,6244,16.902,6245,11.788,6246,16.902,6247,11.788,6248,16.902,6249,16.902]],["keywords/1218",[]],["title/1219",[240,302.163,581,574.278,1055,672.63]],["content/1219",[2,4.153,4,1.175,18,3.788,22,5.073,23,4.151,24,3.914,32,4.091,33,2.5,34,4.426,37,3.559,45,3.217,49,5.334,87,3.94,114,4.778,151,3.498,184,2.459,198,5.164,240,4.316,246,3.582,272,4.834,382,5.831,385,4.153,408,3.752,413,5.872,423,6.968,504,5.027,580,5.216,652,10.15,777,8.614,843,5.132,845,7.436,1055,9.609,1582,8.44,1595,7.052,1612,12.233,3586,6.539,3593,10.939,3813,6.889,3923,8.44,4585,9.167,4963,13.774,6250,11.339,6251,17.876,6252,10.485,6253,11.339,6254,11.339,6255,15.198,6256,10.485]],["keywords/1219",[]],["title/1220",[241,503.001,1339,606.144,1617,705.951]],["content/1220",[4,1.404,23,4.164,32,4.509,33,1.752,34,4.268,37,3.13,154,4.982,161,5.889,164,4.256,167,5.89,193,5.43,205,3.521,217,4.841,241,5.037,246,4.281,427,6.853,572,4.841,590,5.778,652,10.202,901,5.173,1339,6.07,1617,7.07,2175,13.875,3586,7.816,3593,9.02,3778,12.803,3781,13.592,3813,8.233,4963,11.357,6251,12.531,6252,12.531,6255,12.531,6256,12.531,6257,13.552,6258,13.552,6259,13.552,6260,13.552,6261,13.552]],["keywords/1220",[]],["title/1221",[408,518.75,1843,1000.13]],["content/1221",[]],["keywords/1221",[]],["title/1222",[4,140.222,45,383.895,1843,863.219]],["content/1222",[4,1.642,5,1.766,6,1.535,16,4.205,18,2.732,19,2.452,20,3.663,22,4.16,23,4.316,24,2.823,25,0.544,32,3.354,33,2.523,34,1.872,35,2.345,36,4.266,37,2.156,52,4.367,63,1.793,65,2.68,67,3.291,69,4.008,87,2.842,107,2.009,111,3.086,122,3.59,193,3.277,198,3.43,224,5.444,273,1.793,275,4.275,287,4.065,329,5.721,330,3.087,334,2.358,381,2.639,408,7.164,427,3.006,435,3.742,460,6.238,467,4.539,514,4.602,557,6.298,659,3.762,694,6.382,765,2.68,776,6.111,777,3.644,843,3.702,886,2.921,940,4.969,958,3.783,1169,3.742,1204,4.205,1526,7.018,1628,7.553,1713,6.961,1843,15.597,1872,6.905,1984,5.217,2121,5.026,4029,4.266,6262,11.872,6263,12.839]],["keywords/1222",[]],["title/1223",[408,518.75,2492,952.558]],["content/1223",[]],["keywords/1223",[]],["title/1224",[581,790.783]],["content/1224",[]],["keywords/1224",[]],["title/1225",[12,546.69,2492,952.558]],["content/1225",[4,1.626,7,4.9,12,5.473,22,5.399,23,4.205,25,1.368,37,2.635,40,5.992,52,4.325,98,6.724,193,6.289,287,7.802,408,7.594,432,8.249,920,8.312,1628,12.104,2253,10.86,4028,13.502,4029,8.188,4708,14.514,6237,16.127,6264,13.736]],["keywords/1225",[]],["title/1226",[12,546.69,289,729.273]],["content/1226",[4,1.327,14,4.813,22,5.426,23,4.31,24,6.185,25,1.192,32,2.709,33,1.655,34,2.931,35,3.671,36,6.679,37,2.149,50,7.057,52,3.527,98,5.484,109,8.277,174,7.61,193,5.129,432,6.728,467,6.334,557,5.087,580,5.889,630,4.706,656,7.61,777,5.705,1094,11.203,1401,9.13,2253,8.479,2255,12.78,2492,7.778,2733,9.13,4028,7.531,4029,6.679,6231,9.319,6265,16.57,6266,11.838,6267,11.838,6268,12.802,6269,12.802,6270,11.838,6271,11.838]],["keywords/1226",[]],["title/1227",[97,475.083,2226,1060.767,2253,640.323]],["content/1227",[4,2.06,7,5.319,22,4.472,23,4.108,24,5.882,25,1.443,29,4.946,32,2.523,33,1.542,34,2.73,35,3.419,36,6.22,37,2.002,45,3.382,89,7.508,98,9.294,122,5.233,186,3.524,198,3.185,223,6.131,238,8.062,298,5.851,432,6.266,552,6.266,580,7.839,642,5.341,656,10.129,763,6.088,843,5.397,1168,7.819,1180,7.164,1261,10.87,2023,5.814,2226,9.346,2253,9.409,2255,14.181,2492,7.244,2516,12.683,2969,8.062,3680,12.998,3790,8.343,4029,6.22,6231,8.679,6232,14.912,6265,15.757,6272,15.757,6273,11.025,6274,11.923]],["keywords/1227",[]],["title/1228",[97,475.083,241,503.001,2253,640.323]],["content/1228",[4,1.865,37,3.022,97,6.32,98,9.621,152,3.584,241,6.691,243,8.281,373,4.643,398,6.742,432,9.461,745,9.841,993,8.671,1124,11.639,1263,12.839,1586,14.111,1617,9.391,1989,13.399,2253,12.129,2255,12.839,3715,11.639,6237,14.111]],["keywords/1228",[]],["title/1229",[172,780.453,427,497.46,2492,822.159]],["content/1229",[4,1.898,22,4.808,37,3.075,46,5.93,98,7.847,151,5.652,154,6.734,161,5.787,162,6.476,171,4.783,241,6.809,348,10.368,378,11.007,381,5.911,427,6.734,2079,10.465,2131,11.007,2253,10.743,2492,11.129,3586,10.565,6231,16.527]],["keywords/1229",[]],["title/1230",[171,353.369,1256,765.941,1257,619.122]],["content/1230",[7,5.256,14,6.33,37,2.827,53,9.095,63,3.692,88,7.383,116,6.953,171,5.622,177,8.658,198,5.752,289,7.832,330,4.048,413,8.72,432,11.316,490,8.555,512,6.892,566,14.802,843,9.746,1256,9.53,1257,7.703,1298,10.117,1339,7.542,2253,10.188,2254,9.53]],["keywords/1230",[]],["title/1231",[184,340.004,2492,952.558]],["content/1231",[4,1.086,22,5.359,23,4.237,24,5.356,25,1.229,32,3.91,33,1.356,34,3.553,35,3.006,36,5.469,37,2.605,52,2.888,53,6.554,63,3.403,73,5.353,85,5.049,107,2.575,184,4.727,198,2.8,223,5.39,242,5.779,289,7.217,298,5.144,311,4.491,361,5.88,373,4.002,381,3.383,408,5.134,413,5.429,432,5.509,452,4.849,467,3.706,747,7.476,780,5.551,843,7.024,886,6.599,1124,6.778,1142,7.631,1276,5.551,1343,6.231,2106,6.046,2253,8.741,2254,8.783,2492,6.369,3726,6.687,4028,9.128,4029,8.095,4822,6.231,6237,12.163,6264,9.174,6275,10.483,6276,10.483,6277,18.474,6278,10.483]],["keywords/1231",[]],["title/1232",[703,695.225]],["content/1232",[51,5.208,199,10.42,308,7.045,539,10.123,2492,13.222]],["keywords/1232",[]],["title/1233",[3769,1421.376]],["content/1233",[4,2.577,25,1.24,45,5.29,53,7.876,87,6.48,88,6.393,408,6.169,423,14.107,427,6.855,432,9.8,747,13.298,843,8.44,1074,10.193,2253,11.768,3006,21.226]],["keywords/1233",[]],["title/1234",[408,616.535]],["content/1234",[]],["keywords/1234",[]],["title/1235",[73,800.578,1378,975.122]],["content/1235",[4,2.583,23,3.423,37,3.77,51,3.594,52,4.138,87,7.804,97,7.015,100,8.316,101,13.142,103,6.692,142,8.834,275,6.654,325,10.509,404,11.455,405,7.722,408,7.921,440,6.946,506,8.142,508,9.456,527,7.722,607,8.142,763,11.467,958,6.946,1029,10.931,1663,8.35,2000,11.178,4426,12.585,6279,15.017,6280,15.017]],["keywords/1235",[]],["title/1236",[19,469.995,323,864.293]],["content/1236",[19,6.139,25,1.362,171,5.348,193,8.205,222,5.584,322,7.528,323,11.289,400,9.221,408,6.776,484,11.487,639,9.747]],["keywords/1236",[]],["title/1237",[5,229.359,6,102.858,51,254.223,61,571.393,932,483.439]],["content/1237",[4,2.016,5,3.576,6,2.063,22,5.592,23,4.05,24,3.957,25,0.762,32,2.426,34,2.625,36,5.98,37,3.794,44,3.192,51,2.743,52,4.564,53,4.842,97,4.025,155,3.417,193,4.593,215,6.025,222,3.126,234,5.303,264,3.323,329,5.108,480,6.998,580,5.273,637,6.549,659,5.273,673,5.98,694,5.698,718,4.652,742,9.644,765,6.375,891,6.319,932,7.538,958,5.303,963,4.428,993,5.522,1121,7.412,1262,7.045,1377,5.362,1894,12.636,1895,8.744,2023,5.59,2107,10.601,4028,9.746,4029,5.98,4081,15.318,4082,10.601,6281,11.464,6282,11.464,6283,15.318,6284,8.986,6285,8.744]],["keywords/1237",[]],["title/1238",[149,561.321,273,296.762,1207,780.453]],["content/1238",[4,1.717,6,1.11,7,3.579,12,3.997,15,6.676,22,5.592,23,4.05,24,3.957,25,1.417,32,2.426,33,1.482,34,2.625,36,5.98,37,4.077,52,3.159,136,6.611,149,4.755,193,4.593,198,3.062,273,3.633,275,5.516,301,2.613,322,4.214,368,7.219,373,4.272,381,3.699,391,5.774,396,3.745,512,4.693,514,6.973,637,6.549,736,4.293,786,8.333,936,5.698,1030,5.625,1058,5.937,1843,10.567,2252,6.965,2253,9.204,2900,11.026,4028,9.746,4029,11.115,6092,14.497,6228,12.636,6231,8.345,6262,15.318,6286,11.464,6287,10.032]],["keywords/1238",[]],["title/1239",[230,335.617,440,491.403,674,389.113,675,494.15,692,542.465]],["content/1239",[2,7.967,4,2.067,5,2.589,6,2.106,10,4.745,22,5.235,23,3.96,24,4.139,25,1.327,32,2.538,34,2.746,36,6.256,37,4.015,149,4.974,193,4.805,198,3.203,215,6.302,230,3.788,275,3.993,289,7.958,323,6.61,440,5.547,507,7.458,514,6.133,520,7.745,673,6.256,674,4.392,675,9.279,692,6.123,786,5.137,859,9.147,874,5.316,890,8.552,1339,5.371,1614,8.737,1850,8.552,2253,9.439,2254,9.684,2900,7.982,4029,10.406,4583,13.051,6092,14.973,6235,15.822]],["keywords/1239",[]],["title/1240",[40,516.562,188,759.062,408,447.737]],["content/1240",[]],["keywords/1240",[]],["title/1241",[2,682.507]],["content/1241",[2,7.286,3,9.151,4,2.061,5,4.295,6,2.312,7,6.21,12,6.936,15,11.586,37,3.34,222,5.424,510,10.088,674,7.286,1030,9.762]],["keywords/1241",[]],["title/1242",[275,620.473]],["content/1242",[5,3.99,6,1.789,25,1.229,37,3.103,51,4.422,53,7.806,114,5.373,162,6.533,171,4.826,191,5.556,222,5.039,275,7.601,308,5.982,408,6.115,527,9.503,674,6.769,886,6.602,958,8.548,1261,11.789,3990,13.756,5386,17.09]],["keywords/1242",[]],["title/1243",[23,238.957,52,432.005]],["content/1243",[4,2.061,37,3.34,52,6.579,63,4.362,67,8.004,85,9.582,114,5.783,222,5.424,368,12.526,408,6.582,510,10.088,674,7.286,874,8.819]],["keywords/1243",[]],["title/1244",[23,238.957,874,695.115]],["content/1244",[2,7.018,4,1.985,25,1.274,37,3.217,51,4.585,53,8.094,63,4.202,85,9.229,87,6.658,98,8.208,114,5.57,222,5.225,308,6.202,395,8.057,408,6.34,516,9.853,674,7.018,874,8.495]],["keywords/1244",[]],["title/1245",[23,206.245,84,722.133,94,841.635]],["content/1245",[4,2.101,12,7.071,21,11.696,25,1.349,37,3.405,84,10.822,85,9.769,94,12.613,222,5.53,504,8.991,674,7.428,1051,15.897]],["keywords/1245",[]],["title/1246",[37,227.19,45,383.895,370,852.135]],["content/1246",[2,5.96,4,2.183,5,3.051,6,1.083,7,2.148,10,2.723,12,7.344,23,2.728,25,0.94,33,1.446,37,3.393,40,2.627,44,1.916,45,4.008,51,3.381,52,1.896,63,3.569,65,2.255,69,2.148,73,3.514,79,3.644,149,5.861,152,2.227,182,2.232,192,2.314,198,3.775,222,5.512,223,3.539,224,3.391,230,2.174,235,4.28,272,2.934,273,1.509,275,4.705,285,4.731,286,4.229,287,3.42,288,3.398,289,7.569,301,1.568,370,12.078,371,8.489,373,3.644,378,4.135,382,3.539,396,3.654,399,3.762,408,7.975,413,3.564,427,4.112,452,3.183,504,3.051,506,8.823,507,4.28,510,3.49,512,6.661,514,5.065,556,2.458,557,2.734,652,8.571,674,7.403,785,2.099,786,2.948,843,3.115,888,5.835,983,6.649,996,3.115,1028,3.969,1058,3.564,1160,3.49,1388,7.135,1444,3.256,1614,5.711,1615,6.363,1617,3.59,1628,4.048,1633,6.389,1716,4.908,1827,3.86,1843,10.38,2183,5.009,2253,8.47,2254,3.895,2281,7.445,2483,5.394,2492,6.795,2638,5.249,2900,7.445,3092,5.122,3153,9.374,3921,5.394,3922,5.767,6288,11.185,6289,6.882]],["keywords/1246",[]],["title/1247",[37,199.834,114,346.026,1102,885.975,1103,832.941]],["content/1247",[4,2.242,5,2.559,23,1.807,25,1.439,33,1.533,37,3.844,52,3.266,58,4.342,63,4.745,99,4.176,100,6.285,110,5.229,114,6.291,140,9.293,142,6.974,206,6.041,222,6.244,240,3.789,260,10.265,293,5.549,370,7.465,382,10.192,408,6.558,414,4.634,428,9.128,504,5.256,506,6.428,508,12.482,548,7.465,555,7.373,556,4.235,557,4.71,674,8.387,894,7.596,932,9.02,2112,11.129,2709,9.935,2931,12.632,4616,12.353,6290,11.855]],["keywords/1247",[]],["title/1248",[25,104.266,2389,1313.99]],["content/1248",[]],["keywords/1248",[]],["title/1249",[274,1013.728,417,705.949]],["content/1249",[4,1.395,14,5.061,16,6.923,23,4.056,25,0.895,32,2.849,33,2.746,51,3.222,100,4.986,114,5.395,152,2.681,164,4.228,186,3.98,187,8.275,196,4.191,205,3.498,206,4.793,217,4.81,230,4.253,273,5.265,274,8.705,341,8.004,381,4.345,416,8.962,417,9.562,437,5.284,467,4.76,554,6.447,785,4.106,804,6.525,818,10.022,857,6.923,975,9.981,1526,7.36,1749,10.27,2175,10.022,2308,8.478,2560,8.829,3447,12.45,3476,12.45,3778,8.09,4515,8.374,4807,14.547,6291,13.464]],["keywords/1249",[]],["title/1250",[33,153.915,240,265.779,288,587.825,417,535.943]],["content/1250",[4,1.512,25,0.971,30,6.867,33,3.06,53,8.282,63,4.3,65,4.784,154,5.366,155,4.351,182,4.722,205,3.792,206,6.979,240,4.943,273,3.201,288,7.208,334,4.209,364,7.914,373,6.104,417,8.828,499,7.671,543,8.198,659,6.714,773,5.752,785,5.979,1173,8.677,1339,8.782,1554,10.214,2136,10.214,2288,13.256,6292,14.596,6293,14.596,6294,14.596]],["keywords/1250",[]],["title/1251",[297,444.782,300,864.293]],["content/1251",[4,2.197,33,2.126,44,4.577,114,4.779,125,8.39,155,6.32,177,8.453,273,5.147,274,10.629,300,9.062,301,4.832,304,8.28,373,4.24,375,8.576,381,6.842,417,7.402,483,8.842,491,11.967,515,8.118,737,5.527,771,6.587,773,6.478,1169,7.521,1633,9.391,2023,10.339,3715,10.629,4807,12.886,6295,16.439]],["keywords/1251",[]],["title/1252",[273,343.83,2781,1167.014]],["content/1252",[4,1.59,7,4.791,14,5.77,19,4.601,23,3.931,69,4.791,70,3.743,72,7.306,111,7.65,114,4.462,192,5.16,217,5.483,273,5.296,322,5.642,382,7.893,385,5.622,417,6.911,421,7.949,486,9.124,510,7.784,773,6.049,804,9.825,1165,13.295,1310,8.939,2049,9.924,2303,8.255,2781,11.425,2927,12.766,4807,12.032,6296,15.349,6297,20.274,6298,15.349]],["keywords/1252",[]],["title/1253",[114,393.395,152,269.421,414,528.967]],["content/1253",[6,1.908,25,1.31,33,2.548,152,4.726,224,5.975,276,11.972,381,6.359,414,7.702,659,9.064,737,6.625,785,6.009,1650,11.713,1651,11.364,1990,14.667]],["keywords/1253",[]],["title/1254",[7,371.572,46,385.295,288,587.825,572,425.189]],["content/1254",[]],["keywords/1254",[]],["title/1255",[561,876.641]],["content/1255",[]],["keywords/1255",[]],["title/1256",[981,1064.513]],["content/1256",[]],["keywords/1256",[]],["title/1257",[4,140.222,300,745.978,552,711.201]],["content/1257",[114,5.519,152,3.78,161,5.998,171,4.958,177,9.763,272,8.095,273,5.09,300,10.466,322,6.979,417,8.549,630,6.979,732,6.643,910,7.639,1219,9.145,1650,11.286,2098,11.956,2165,12.837,2842,15.912]],["keywords/1257",[]],["title/1258",[501,958.188]],["content/1258",[25,1.31,46,8.247,152,3.923,181,5.25,225,7.064,277,11.364,278,5.304,379,9.015,381,6.359,501,10.132,659,9.064,6299,19.705,6300,19.705]],["keywords/1258",[]],["title/1259",[1021,1002.228]],["content/1259",[46,7.195,184,4.82,421,11.512]],["keywords/1259",[]],["title/1260",[334,452.062,765,513.868]],["content/1260",[6,2.107,205,5.655,435,9.957,2116,18.239,6301,21.763]],["keywords/1260",[]],["title/1261",[]],["content/1261",[]],["keywords/1261",[]],["title/1262",[408,518.75,2253,741.882]],["content/1262",[]],["keywords/1262",[]],["title/1263",[12,546.69,2253,741.882]],["content/1263",[4,1.731,22,5.622,23,4.246,25,1.424,37,2.804,40,6.376,52,5.902,193,6.692,408,7.087,920,8.845,1628,9.826,2253,10.136,4028,12.601,4029,11.174,6237,16.791,6264,14.617]],["keywords/1263",[]],["title/1264",[12,546.69,289,729.273]],["content/1264",[4,1.395,14,5.061,22,4.87,23,4.311,24,6.406,25,1.234,32,2.849,33,1.741,34,3.083,35,3.861,36,7.024,37,2.26,50,7.422,98,5.768,109,8.705,174,8.004,193,5.395,467,6.56,557,5.35,580,6.194,630,4.95,656,8.004,1094,11.783,1401,9.602,2253,10.048,2255,9.602,2733,9.602,4029,7.024,6228,14.156,6231,9.801,6266,12.45,6267,12.45,6270,12.45,6271,12.45,6287,11.783,6302,13.464]],["keywords/1264",[]],["title/1265",[97,475.083,2226,1060.767,2253,640.323]],["content/1265",[4,2.08,7,5.385,22,4.528,23,4.12,24,5.955,25,1.454,29,5.032,32,2.567,33,1.569,34,2.778,35,3.479,36,6.329,37,2.037,45,3.441,89,7.639,98,9.367,122,5.325,186,3.586,198,3.241,223,6.238,238,8.202,298,5.953,552,6.376,580,7.936,642,5.434,656,10.255,763,6.194,843,5.491,1168,7.955,1180,7.289,1261,11.005,2023,5.916,2226,9.509,2253,9.5,2255,12.304,2492,7.37,2516,12.841,2969,8.202,3680,13.159,3790,8.489,4029,6.329,6228,13.159,6231,8.831,6232,10.616,6272,11.218,6273,11.218,6303,12.131,6304,12.131]],["keywords/1265",[]],["title/1266",[97,475.083,241,503.001,2253,640.323]],["content/1266",[4,1.792,20,4.208,23,4.29,32,4.401,45,2.665,50,5.179,89,5.916,98,4.025,124,5.352,162,3.321,193,3.764,203,4.765,241,6.43,467,3.321,514,3.368,596,6.575,656,11.491,894,3.6,921,7.402,947,6.459,1028,5.419,1116,4.67,1143,6.075,1216,8.688,1224,5.472,1257,6.539,1261,5.993,1262,5.774,1263,13.786,1380,8.688,1586,11.204,1728,6.993,1872,5.053,2222,11.555,2253,6.763,2255,10.193,2677,6.575,3236,7.365,3849,8.222,3850,8.688,3851,8.222,3990,6.993,4069,8.688,4496,8.688,4646,8.688,4773,8.688,6226,8.688,6230,8.688,6305,9.396,6306,14.293,6307,9.396,6308,14.293,6309,14.293,6310,9.396,6311,14.293,6312,9.396,6313,9.396,6314,14.293,6315,14.293,6316,9.396,6317,14.293,6318,14.293,6319,9.396,6320,9.396,6321,9.396,6322,9.396,6323,9.396]],["keywords/1266",[]],["title/1267",[33,153.915,246,376.028,1713,645.355,2253,563.222]],["content/1267",[4,1.825,5,2.698,7,3.901,12,4.357,23,3.877,24,6.081,32,4.318,33,3.021,34,4.033,35,5.052,37,3.426,65,4.095,88,4.284,149,5.183,154,6.476,198,3.338,204,5.912,222,4.804,246,7,298,6.131,427,6.476,490,4.965,716,6.36,743,12.327,785,3.81,786,5.353,843,7.974,940,7.591,1058,6.471,1254,8.448,1398,7.868,2130,8.194,2222,10.102,2253,10.484,6228,16.901,6231,9.096,6287,10.935,6324,20.404,6325,12.495,6326,12.495]],["keywords/1267",[]],["title/1268",[172,780.453,427,497.46,2253,640.323]],["content/1268",[3,6.076,19,3.959,22,5.517,23,4.04,25,1.218,32,2.795,37,3.075,52,3.639,97,6.429,98,5.658,151,4.075,154,4.855,161,4.173,162,7.431,164,6.601,171,3.449,198,3.528,241,4.909,257,5.916,348,7.476,381,4.262,427,4.855,580,6.076,1147,7.281,1937,11.069,2079,7.545,2253,10.741,2264,12.214,2266,12.214,3586,7.617,4028,10.774,4029,9.554,6228,13.969,6231,15.302,6237,14.355,6327,13.208,6328,18.313,6329,13.208,6330,13.208]],["keywords/1268",[]],["title/1269",[100,580.619,408,518.75]],["content/1269",[]],["keywords/1269",[]],["title/1270",[37,227.19,63,296.762,689,739.744]],["content/1270",[6,1.433,7,4.621,12,5.162,29,6.141,37,3.996,53,6.253,84,7.9,85,7.131,86,5.982,100,9.453,114,4.304,175,9.207,264,5.738,271,5.251,325,13.85,368,9.322,389,7.612,393,7.962,421,7.667,437,5.81,467,5.233,504,6.563,506,10.731,524,9.708,567,9.708,673,7.723,675,6.886,859,11.292,875,7.839,937,6.465,940,8.994,1204,7.612,1261,9.443,1339,6.631,1628,8.709,1874,11.969,2430,12.407,2541,11.292,2969,10.009]],["keywords/1270",[]],["title/1271",[4,140.222,100,501.136,408,447.737]],["content/1271",[1,5.617,2,2.926,4,2.224,5,1.725,14,3.004,18,2.669,19,3.779,20,3.579,21,4.608,22,4.652,23,3.848,24,2.758,25,1.427,32,2.668,33,1.033,34,1.829,35,2.291,37,4.192,46,2.586,49,8.339,50,8.606,58,4.617,60,2.981,63,1.752,65,2.619,81,5.698,88,2.74,99,2.815,100,9.002,111,3.015,122,3.507,149,3.314,152,1.591,172,4.608,176,2.916,193,3.201,198,4.171,203,6.393,204,3.781,249,4.522,251,7.009,271,7.273,273,2.764,288,3.946,297,4.429,373,2.061,389,4.109,396,2.611,398,2.992,420,4.854,452,3.696,496,3.229,506,4.332,514,2.864,520,3.617,534,5.698,539,3.716,580,7.182,703,2.981,763,9.051,777,3.561,843,3.617,861,3.716,879,4.908,1077,4.522,1112,4.75,1168,5.24,1613,4.443,1697,4.522,1893,5.493,2969,5.402,3367,3.849,3659,6.696,3715,5.166,3811,11.032,3813,4.854,3814,10.238,4426,16.17,4428,6.992,6331,6.992,6332,7.389,6333,6.696,6334,7.389]],["keywords/1271",[]],["title/1272",[3814,1221.989]],["content/1272",[4,1.556,19,4.502,25,1.329,28,6.495,33,1.942,37,2.521,40,7.628,46,4.861,65,6.549,87,5.219,100,8.865,110,10.56,125,5.942,154,5.52,198,5.338,246,6.313,308,4.861,366,7.233,375,7.834,440,6.946,496,6.068,519,8.077,554,7.19,920,7.952,993,7.233,1038,9.34,1169,6.87,1444,7.106,2969,10.154,3563,10.324,3814,9.848,3992,11.455,4572,13.142,6331,13.142,6333,12.585,6335,15.017,6336,15.017]],["keywords/1272",[]],["title/1273",[4,99.401,65,314.404,100,537.699,110,423.155,408,317.391]],["content/1273",[]],["keywords/1273",[]],["title/1274",[28,514.812,251,661.815,581,505.129,3992,907.934]],["content/1274",[4,1.343,8,6.864,19,3.885,22,5.462,23,4.258,24,6.239,25,1.202,28,5.606,32,2.743,33,1.676,34,2.968,35,3.717,37,2.176,44,3.609,50,7.145,65,5.924,100,9.082,109,8.38,142,7.625,265,4.663,308,4.196,481,7.145,504,8.013,549,6.812,572,4.63,700,9.648,785,3.953,920,6.864,1613,7.207,1633,7.405,1893,12.426,3813,7.875,3814,8.5,3923,9.648,3992,13.787,4029,6.762,4572,11.343,4574,11.986,6337,12.962]],["keywords/1274",[]],["title/1275",[251,752.413,581,574.278,6333,1134.114]],["content/1275",[4,1.626,22,6.023,23,4.135,24,7.102,25,1.368,32,3.322,34,3.594,35,4.501,37,2.635,50,8.652,100,7.619,271,5.568,389,8.071,504,9.122,827,9.646,1613,8.727,1893,14.144,2969,10.613,2985,13.736,3813,9.536,3814,10.293,4029,8.188,6331,13.736,6332,14.514,6333,13.154,6334,14.514,6338,15.696]],["keywords/1275",[]],["title/1276",[51,323.825,492,914.982,581,574.278]],["content/1276",[4,1.937,6,1.036,10,4.233,22,5.412,23,4.065,24,5.437,25,1.048,28,4.627,32,3.956,33,1.383,34,3.606,35,3.068,37,2.644,50,8.683,51,4.474,52,4.34,63,2.346,86,4.323,100,9.62,109,6.917,110,4.719,251,5.948,289,4.976,319,4.767,373,2.759,391,5.388,396,3.495,491,7.788,492,12.64,580,4.921,672,6.654,689,5.848,859,8.16,874,6.983,940,6.5,1339,4.792,1613,5.948,1631,6.055,1893,10.829,2254,6.055,2444,6.5,2502,5.318,3813,6.5,3814,7.016,3992,8.16,4029,5.581,6339,21.981,6340,10.698,6341,10.698,6342,15.752,6343,10.698,6344,10.698,6345,10.698,6346,10.698,6347,10.698]],["keywords/1276",[]],["title/1277",[58,495.646,99,476.718,581,574.278]],["content/1277",[4,1.991,22,5.88,23,4.096,24,5.629,25,1.403,28,4.851,29,4.653,32,3.451,33,1.45,34,2.568,35,3.217,37,2.738,45,3.182,46,3.631,58,8.563,99,8.236,100,9.332,108,8.507,110,4.948,171,2.929,179,5.575,198,4.356,311,4.805,381,3.62,600,6.033,843,5.077,1256,9.229,1257,7.46,1378,11.949,1613,6.237,1893,14.5,3813,6.815,3814,10.693,4029,8.507,4794,10.372,6348,11.217,6349,16.306,6350,11.217,6351,11.217]],["keywords/1277",[]],["title/1278",[100,501.136,294,1094.088,581,574.278]],["content/1278",[4,2.292,22,6.067,23,4.126,24,7.171,25,1.382,32,3.372,34,3.648,35,4.569,37,2.675,46,3.517,100,8.561,167,4.722,175,6.758,271,7.37,294,18.691,308,3.517,493,9.909,516,5.587,545,3.01,567,7.125,677,14.787,827,6.678,901,4.148,1177,6.678,1256,9.018,1257,7.289,1613,8.858,1724,10.301,1893,14.283,2502,5.401,3742,8.785,3813,9.68,3814,10.448,4029,8.311,6352,15.932,6353,10.866,6354,10.866,6355,10.866,6356,10.866]],["keywords/1278",[]],["title/1279",[100,501.136,142,796.106,581,574.278]],["content/1279",[4,1.109,8,5.665,19,3.207,22,5.769,23,4.276,24,5.437,25,1.048,28,4.627,29,4.438,32,3.333,33,1.383,34,2.449,35,3.068,37,1.796,44,2.979,45,3.035,65,5.163,100,9.033,142,14.35,151,3.301,162,3.782,175,6.654,265,3.849,308,3.463,370,6.737,481,5.897,504,4.743,549,5.623,572,3.822,700,7.963,785,3.262,920,5.665,1586,8.386,1613,5.948,1633,6.112,1893,10.829,3786,9.362,3790,7.486,3791,9.362,3792,9.362,3793,9.362,3794,9.362,3795,9.362,3796,9.362,3798,9.362,3805,9.362,3812,13.784,3813,6.5,3814,7.016,3815,9.362,3923,7.963,4029,5.581,6357,10.698]],["keywords/1279",[]],["title/1280",[100,501.136,581,574.278,4615,1184.242]],["content/1280",[22,5.709,23,3.924,24,6.612,25,0.938,32,2.984,33,1.824,34,3.229,35,4.044,37,2.368,45,5.434,53,5.957,100,8.642,111,8.209,151,4.351,202,4.338,370,8.88,373,3.637,417,9.795,777,6.284,1089,8.133,1329,7.151,1613,7.841,1893,13.169,3813,8.568,3814,9.248,3839,13.04,3992,10.757,4615,21.354,6358,14.102,6359,14.102,6360,14.102,6361,19.155,6362,14.102,6363,14.102]],["keywords/1280",[]],["title/1281",[33,202.738,314,556.163]],["content/1281",[4,1.898,22,4.808,23,3.76,25,1.218,33,2.369,44,5.101,79,9.7,87,6.366,100,6.784,314,6.498,773,7.219,879,7.132,1255,14.81,3814,12.013,4029,9.556,6364,24.674,6365,18.319,6366,18.319,6367,18.319]],["keywords/1281",[]],["title/1282",[7,331.64,72,505.648,100,393.423,134,601.311,264,307.993]],["content/1282",[4,1.897,5,3.313,6,1.486,7,3.224,8,5.469,14,3.882,23,3.301,32,3.247,33,1.335,37,2.576,46,5.927,54,4.488,100,8.406,110,4.555,124,3.867,125,4.086,142,9.028,151,5.649,154,3.796,171,4.007,172,8.85,186,3.052,192,3.472,198,2.759,217,3.689,271,6.496,297,2.93,304,5.201,308,3.343,381,3.333,382,5.31,385,5.62,408,3.417,417,4.65,467,3.651,551,4.699,580,4.751,598,6.983,673,5.387,773,4.07,785,3.149,827,6.347,901,3.942,958,4.777,1257,7.021,1300,4.751,1377,7.178,1651,8.85,1765,6.588,1821,6.874,1893,13.936,1902,11.254,2979,6.983,2982,9.55,2983,9.55,2984,9.037,2985,9.037,3007,8.655,3367,7.392,3375,6.874,3814,10.063,3815,13.429,4426,8.655,5291,8.655,6368,15.345,6369,10.327,6370,15.345,6371,10.327,6372,10.327,6373,10.327,6374,10.327,6375,15.345]],["keywords/1282",[]],["title/1283",[1021,1002.228]],["content/1283",[33,2.874,58,8.141,99,7.83]],["keywords/1283",[]],["title/1284",[45,383.895,1102,1007.258,1103,946.964]],["content/1284",[1,8.778,4,2.041,25,1.578,45,4.17,49,6.915,54,6.388,58,5.384,99,6.939,167,8.561,171,3.838,184,4.272,202,4.522,232,8.738,255,5.991,295,12.106,362,9.939,408,4.863,438,7.377,440,6.799,515,7.259,517,10.68,557,5.84,622,5.965,631,8.561,915,10.941,936,7.306,954,7.725,1102,10.941,1103,10.286,1196,9.639,1327,7.844,1889,9.256,4039,12.864,6376,14.699,6377,14.699,6378,14.699,6379,14.699,6380,14.699,6381,14.699,6382,14.699]],["keywords/1284",[]],["title/1285",[765,513.868,2023,764.557]],["content/1285",[]],["keywords/1285",[]],["title/1286",[2023,764.557,6285,1195.939]],["content/1286",[4,1.523,22,5.17,23,4.082,24,5.074,32,4.169,34,3.366,35,4.215,37,3.73,50,8.103,62,6.297,97,5.16,103,6.55,246,4.644,275,4.894,289,6.837,325,10.286,355,5.793,371,7.668,404,11.212,408,4.863,765,4.818,776,9.376,777,6.55,958,6.799,1628,8.647,2023,11.574,2116,12.319,2118,9.939,3333,11.884,6283,18.216,6284,11.522,6285,15.026,6383,12.864]],["keywords/1286",[]],["title/1287",[765,443.523,2023,659.894,2766,1032.224]],["content/1287",[4,2.238,14,5.23,22,4.981,23,4.036,24,4.803,32,4.017,34,3.186,35,3.99,37,3.627,63,3.051,217,4.97,246,4.396,275,4.633,289,6.472,298,6.828,355,5.483,371,7.258,396,4.546,408,4.604,559,8.875,765,6.221,776,9.034,777,6.2,932,6.332,1191,8.875,1628,8.185,1704,8.762,2023,11.844,2766,14.478,6284,10.907,6285,10.613,6383,12.176,6384,21.603,6385,13.914,6386,18.981]],["keywords/1287",[]],["title/1288",[217,483.395,2023,908.117]],["content/1288",[4,1.502,22,5.121,23,4.07,24,5.003,32,4.13,34,3.319,35,4.157,37,3.704,45,4.112,148,8.359,217,8.43,275,4.826,289,6.742,297,4.112,355,5.712,371,7.561,408,4.796,765,4.751,776,9.288,777,6.459,1090,11.056,1134,8.204,1628,8.527,1711,9.505,2023,12.854,3830,10.789,6284,11.362,6383,12.685,6387,19.514]],["keywords/1288",[]],["title/1289",[241,582.779,1224,913.126]],["content/1289",[33,2.572,111,9.009,198,5.314,241,7.394,293,5.568,458,9.253,765,6.52,901,7.594,1224,14.899,2023,9.701,2489,14.481]],["keywords/1289",[]],["title/1290",[241,503.001,1224,788.126,6285,1032.224]],["content/1290",[22,4.684,23,4.151,32,3.777,155,5.32,164,5.605,580,8.21,630,6.561,737,6,773,7.033,2023,8.703,2489,12.992,2819,15.619,3503,13.285,6284,13.99,6285,17.04,6388,22.339,6389,17.848,6390,16.504]],["keywords/1290",[]],["title/1291",[241,442.435,765,390.118,1224,693.228,2766,907.934]],["content/1291",[22,4.85,23,4.126,151,5.702,155,5.509,161,5.838,580,8.501,737,6.213,765,6.057,773,7.283,2489,13.453,2766,14.097,2819,16.173,3503,13.756,6284,14.487,6390,17.09,6391,18.481,6392,18.481]],["keywords/1291",[]],["title/1292",[63,296.762,689,739.744,2023,659.894]],["content/1292",[2,7.468,4,1.432,5,1.941,6,0.87,7,2.806,10,5.468,12,3.135,20,4.027,23,1.37,25,0.919,37,3.423,45,2.55,51,2.151,52,5.205,54,3.907,63,1.971,97,5.909,107,3.394,110,3.966,113,4.182,114,2.613,136,5.185,156,4.761,204,4.254,230,2.84,271,3.189,301,3.149,308,2.91,321,5.525,467,3.178,507,5.591,568,5.289,673,4.69,674,3.293,765,5.517,787,9.156,958,8.738,1030,4.412,1033,6.544,1077,5.088,1261,5.735,1412,8.313,1614,4.59,1694,6.291,1706,5.895,1826,6.857,2023,9.212,2094,6.692,2183,10.059,2281,5.984,2287,8.313,2427,6.857,2445,21.89,2692,15.064,2766,12.839,3595,12.778,4652,6.291,5317,8.313,6285,12.839,6393,8.99,6394,8.99,6395,8.99,6396,8.99,6397,8.99,6398,8.99,6399,8.99,6400,8.99,6401,8.99,6402,8.99,6403,13.819,6404,8.99,6405,8.99,6406,8.99,6407,8.99,6408,8.99,6409,8.99,6410,8.99,6411,8.99,6412,8.99,6413,8.99,6414,8.99,6415,8.99,6416,8.99,6417,8.99,6418,8.99,6419,8.99,6420,8.99,6421,8.99,6422,8.99]],["keywords/1292",[]],["title/1293",[4,123.338,52,327.97,381,384.109,391,599.526]],["content/1293",[]],["keywords/1293",[]],["title/1294",[513,932.002,6045,1229.009]],["content/1294",[4,1.094,5,2.906,6,0.621,14,2.412,20,2.874,22,1.684,23,4.228,25,0.427,32,4.151,34,1.469,40,2.449,44,4.344,52,3.709,60,6.435,63,2.952,70,1.565,103,2.859,107,1.576,124,3.955,134,3.631,148,3.7,152,2.68,154,3.882,161,2.027,162,3.733,164,4.227,166,3.478,171,1.675,179,3.189,198,2.821,229,5.924,273,2.316,319,2.859,334,1.85,373,1.654,398,2.402,402,3.7,408,2.123,457,4.338,474,3.7,496,2.592,512,5.51,513,11.66,519,3.45,531,3.507,543,6.388,557,2.549,580,2.951,648,4.04,663,3.536,674,2.35,706,5.393,737,3.551,758,2.775,771,5.393,891,3.536,894,2.458,901,4.031,926,3.276,936,3.189,958,4.885,975,9.979,1030,3.148,1066,3.423,1110,3.665,1207,3.7,1257,6.158,1354,3.898,1417,3.507,1444,6.369,1588,5.029,1595,3.99,1765,4.092,1804,5.932,2259,5.614,2303,3.45,2483,5.029,2583,5.029,2779,3.943,2959,5.932,2960,14.427,2995,5.029,3000,5.932,3001,5.932,3646,8.851,3684,6.346,5110,14.427,5113,5.932,5737,5.614,6045,12.23,6053,5.376,6168,9.242,6423,6.415,6424,6.415,6425,5.932,6426,10.561,6427,6.415,6428,6.415,6429,6.415,6430,6.415,6431,6.415,6432,5.932,6433,6.415,6434,6.415,6435,6.415,6436,6.415,6437,6.415,6438,6.415,6439,6.415,6440,6.415,6441,6.415,6442,6.415,6443,6.415,6444,6.415,6445,6.415,6446,6.415,6447,6.415]],["keywords/1294",[]],["title/1295",[52,432.005,1843,1000.13]],["content/1295",[4,1.721,5,4.608,6,0.852,20,3.942,25,0.585,33,2.148,45,2.496,51,2.106,52,3.745,60,3.283,61,4.733,63,2.981,65,2.884,69,4.243,103,6.057,149,6.889,152,3.719,154,3.235,192,2.959,205,2.287,206,4.839,215,4.625,219,5.053,223,4.525,228,3.843,230,2.78,240,4.171,246,4.294,249,4.981,272,7.965,273,3.642,301,2.006,334,2.537,357,6.276,373,4.283,381,2.84,385,3.223,393,4.733,401,3.942,405,6.99,420,8.258,428,4.733,452,4.071,512,3.602,513,8.08,543,6.15,577,5.473,638,5.075,673,8.664,674,3.223,703,3.283,716,3.177,736,5.091,771,3.526,785,2.684,786,5.823,894,3.372,901,3.359,921,4.558,940,5.347,1026,6.713,1074,7.431,1119,5.075,1444,7.859,1526,4.811,1548,5.614,1602,5.347,1843,15.877,2010,10.99,2043,9.895,2146,6.406,2250,6.898,2252,5.347,2483,6.898,2721,12.57,2886,6.05,3019,7.375,3094,7.701,4643,6.898,6045,6.898,6448,13.593,6449,8.8,6450,8.8,6451,8.8,6452,8.8,6453,8.8,6454,8.8,6455,8.8]],["keywords/1295",[]],["title/1296",[60,584.959,241,582.779]],["content/1296",[4,1.881,6,1.107,19,2.119,23,4.08,25,0.47,32,3.045,37,1.187,44,1.968,52,3.965,60,9.592,63,3.156,70,1.724,111,2.667,118,5.924,122,3.102,124,4.281,134,6.47,152,2.865,198,1.888,204,3.345,215,3.715,223,7.4,228,3.087,229,6.411,230,2.233,241,8.391,272,7.048,273,2.507,298,3.468,349,4.57,373,3.711,375,3.687,381,4.644,401,3.166,407,3.447,408,2.339,413,3.661,420,4.294,512,5.89,513,8.554,519,6.148,520,3.199,556,2.525,557,4.542,569,3.468,580,3.251,637,4.038,688,4.294,716,2.552,736,4.281,737,5.558,771,6.623,773,5.671,774,3.864,787,3.426,911,4.509,975,9.762,1219,3.405,1257,5.229,1327,3.772,1345,4.396,1417,3.864,1444,3.345,1526,3.864,1633,4.038,1931,4.451,2228,5.392,2583,5.541,2717,5.392,2783,4.294,2886,9.893,2992,13.307,3223,8.508,3646,12.06,3684,4.247,3923,5.261,5698,6.186,6045,11.28,6168,12.593,6425,10.57,6432,10.57,6456,7.068,6457,14.39,6458,7.068,6459,7.068,6460,7.068,6461,7.068,6462,7.068]],["keywords/1296",[]],["title/1297",[1609,1267.615,2524,1372.068]],["content/1297",[4,1.481,51,3.421,52,3.939,61,7.689,63,4.804,70,3.486,85,6.886,114,4.156,171,3.733,193,5.728,198,3.819,201,5.521,330,3.437,373,4.986,385,5.236,395,6.011,396,4.671,401,6.403,404,10.904,420,8.685,441,10.904,483,7.689,501,12.606,512,8.967,527,7.351,785,4.36,932,6.505,955,11.15,1000,7.689,1609,17.711,1718,10.406,1872,10.398,1926,10.004,1981,9.515,2524,16.919,3019,11.981,3110,11.981,3683,13.219,6040,13.219,6056,13.219,6463,14.296]],["keywords/1297",[]],["title/1298",[441,1032.224,501,695.85,1407,1032.224]],["content/1298",[20,7.363,23,3.577,51,5.074,63,3.605,107,4.038,147,10.486,154,6.043,183,5.178,311,7.042,381,5.305,402,9.481,413,8.514,419,9.988,441,18.913,501,10.902,512,8.679,539,7.646,901,6.275,921,8.514,993,7.918,1119,9.481,1169,7.521,1726,8.842,1983,15.434,2390,14.386,6464,21.202]],["keywords/1298",[]],["title/1299",[2,495.646,52,372.867,234,625.942]],["content/1299",[2,8.167,4,2.051,6,1.433,10,5.858,18,4.945,33,2.559,44,4.122,52,6.558,63,3.246,72,7.046,84,10.562,103,6.597,110,6.53,149,8.21,193,5.931,230,7.044,278,3.985,295,9.098,301,3.374,381,4.777,455,7.088,501,10.177,564,6.847,672,9.207,674,5.422,736,5.544,786,6.342,1035,8.994,1058,7.667,1204,7.612,1298,8.895,1711,9.708,2783,8.994,6465,14.804,6466,14.804,6467,14.804,6468,14.804,6469,14.804]],["keywords/1299",[]],["title/1300",[2,574.258,10,620.401]],["content/1300",[1,4.792,2,3.939,4,1.114,5,2.322,6,1.531,7,4.936,10,9.666,11,7.052,12,5.513,18,6.906,19,4.74,25,0.715,30,5.059,33,1.391,37,1.805,46,3.481,51,2.573,52,5.167,116,6.529,136,6.202,155,3.205,162,6.628,169,9.411,173,6.392,186,3.179,230,5.924,246,4.995,249,6.087,273,2.358,295,9.717,301,4.712,329,4.792,330,2.585,352,9.411,373,4.078,381,3.47,382,5.53,385,3.939,413,5.569,420,6.533,424,6.953,455,7.57,459,8.203,462,4.273,463,7.669,476,11.392,479,6.461,483,5.784,496,4.345,507,9.834,577,6.688,705,6.263,741,6.533,879,4.187,1030,5.277,1155,7.271,1169,7.234,1178,7.271,1298,6.461,1787,8.429,2051,9.012,2671,7.052,2720,6.771,3560,7.828,3715,6.953,3770,8.004,6008,9.944,6470,10.754,6471,15.811,6472,10.754]],["keywords/1300",[]],["title/1301",[2,435.966,281,461.561,297,337.67,379,544.573]],["content/1301",[2,3.279,4,1.739,6,1.625,7,4.299,11,5.87,12,6.572,16,4.603,18,2.99,33,2.171,46,4.458,51,4.869,65,2.934,69,5.24,70,2.183,72,6.555,88,3.069,112,5.87,149,3.713,155,2.668,181,2.385,182,1.786,184,2.987,198,2.391,200,3.34,201,3.457,205,3.579,210,5.958,215,4.704,219,7.006,220,3.164,223,4.603,228,3.91,230,2.828,240,1.999,246,4.351,264,3.993,281,8.96,297,2.539,301,3.826,308,4.458,311,3.835,361,5.021,373,2.309,375,4.67,381,4.444,382,4.603,432,4.704,455,4.286,460,6.828,499,4.704,507,5.567,562,5.163,567,5.87,569,4.393,582,5.021,664,4.479,711,3.799,716,3.232,786,3.835,888,4.67,894,5.278,996,4.052,1028,5.163,1058,4.636,1072,6.264,1134,5.067,1173,5.321,1187,5.788,1192,5.567,1204,4.603,1602,5.438,1694,6.264,1706,5.87,1708,9.469,1858,7.017,2058,5.71,2062,5.958,2089,5.87,2253,4.236,2492,13.056,2598,6.828,2988,7.237,3008,8.277,3561,6.828,3758,12.656,4040,13.545,6473,8.951,6474,8.951,6475,8.951,6476,8.951,6477,8.951]],["keywords/1301",[]],["title/1302",[674,574.258,688,952.558]],["content/1302",[33,2.524,52,5.378,107,4.795,181,5.201,191,5.868,200,7.283,495,17.082,674,7.15,1435,14.529,2141,12.452,6478,19.52,6479,19.52,6480,19.52,6481,19.52,6482,19.52,6483,19.52]],["keywords/1302",[]],["title/1303",[225,485.1,277,780.453,501,695.85]],["content/1303",[]],["keywords/1303",[]],["title/1304",[25,104.266,501,806.215]],["content/1304",[4,0.841,6,1.731,9,3.712,18,2.711,25,1.189,33,2.312,40,4.871,46,2.627,63,1.78,65,2.66,69,3.983,70,1.979,107,1.993,122,3.562,147,5.176,152,1.616,154,2.983,155,2.419,162,2.868,176,4.657,181,4.764,184,3.42,186,2.398,192,2.728,193,3.251,205,5.05,219,3.016,220,2.868,222,2.213,230,5.648,240,4.608,246,4.031,249,4.593,278,2.184,297,4.474,301,1.849,314,2.878,329,3.616,330,1.951,334,2.34,373,4.067,382,4.173,385,2.972,387,7.432,388,8.846,392,3.774,394,4.115,401,3.635,413,4.202,421,4.202,451,4.987,452,3.753,455,3.885,464,6.04,482,4.436,483,4.364,485,6.361,499,4.265,501,12.727,507,5.047,641,5.678,642,3.635,645,7.507,661,5.176,674,2.972,694,4.033,716,4.607,736,4.779,740,3.774,772,3.366,785,4.809,894,3.11,912,4.233,972,5.321,985,3.774,996,3.673,1032,5.579,1160,4.115,1169,3.712,1173,4.824,1268,4.202,1314,5.787,1332,4.364,1377,3.796,1609,6.561,1610,5.047,1633,4.636,1694,5.678,1843,5.176,1926,5.678,2030,15.646,2031,9.101,2043,5.907,2045,6.801,2117,8.368,2161,6.19,2507,6.561,2771,6.19,3043,7.101,6484,12.761,6485,8.115,6486,8.115,6487,7.504,6488,8.115,6489,8.115,6490,8.115]],["keywords/1304",[]],["title/1305",[277,1074.687]],["content/1305",[5,4.036,6,1.81,18,3.574,25,1.243,33,2.842,46,5.099,65,3.506,67,4.305,69,3.34,72,5.092,76,6.359,88,3.668,152,3.722,155,3.189,162,3.782,189,5.463,205,2.78,206,3.808,225,3.835,227,5.501,228,4.672,229,6.001,230,6.515,231,7.63,254,6.359,271,3.795,277,14.36,279,9.363,280,6.824,301,2.438,368,6.737,381,3.452,382,5.501,385,3.918,400,4.817,427,3.933,437,4.199,501,5.501,580,4.921,598,7.234,610,9.893,664,7.881,673,5.581,716,5.687,773,6.207,785,6.703,886,3.822,942,6.428,967,7.788,971,6.359,985,4.976,1219,5.153,1268,8.158,1300,7.246,1377,5.004,1633,6.112,1796,6.5,2444,6.5,2541,8.16,2771,8.16,2779,11.489,2847,8.966,3339,8.65,5348,8.966,5804,9.893,6491,10.698,6492,10.698,6493,10.698]],["keywords/1305",[]],["title/1306",[225,667.984]],["content/1306",[25,1.403,184,4.576,185,5.098,204,9.985,225,9.402,630,7.757]],["keywords/1306",[]],["title/1307",[185,378.748,225,562.039]],["content/1307",[4,1.257,5,2.619,18,5.763,25,0.807,33,2.231,51,2.903,65,3.976,67,4.881,69,5.385,88,4.16,122,5.325,125,4.8,151,3.743,152,4.353,154,4.46,155,3.616,166,6.577,182,3.442,184,3.741,185,4.85,225,8.606,230,7.298,240,2.709,278,5.404,281,6.69,381,3.915,451,7.455,455,10.469,490,4.82,552,6.376,614,5.247,652,5.808,668,6.283,736,4.543,785,6.122,894,4.649,1074,6.631,1115,8.831,1160,6.152,1192,7.545,1268,6.283,1377,8.07,1796,7.37,2671,7.955,2720,7.639,2779,7.455,3560,12.558,4917,9.808,5346,11.218,5348,10.167,5746,11.218,5749,11.218]],["keywords/1307",[]],["title/1308",[184,340.004,225,562.039]],["content/1308",[18,7.267,25,0.938,69,4.402,86,7.74,88,4.835,152,5.011,162,4.985,184,5.458,185,3.407,193,5.65,198,3.767,205,5.652,206,5.02,220,8.249,222,3.845,225,8.365,230,4.455,240,4.277,242,7.774,277,8.133,347,6.487,490,5.603,661,8.996,674,5.165,745,10.471,772,5.85,919,9.868,1116,9.521,1332,7.585,1339,6.317,2720,8.88,3560,10.265,4767,12.341]],["keywords/1308",[]],["title/1309",[225,485.1,241,503.001,1309,636.63]],["content/1309",[4,1.685,7,2.657,14,3.2,18,5.432,22,2.234,23,4.219,25,0.881,32,2.803,34,1.949,54,7.068,62,3.647,63,1.867,151,2.626,152,3.238,158,5.36,161,5.138,198,3.539,201,3.288,204,6.268,224,2.581,225,8.852,228,3.718,230,2.689,241,6.821,246,2.689,267,7.134,277,4.909,301,3.706,347,6.094,373,2.195,380,6.197,381,4.275,500,5.957,556,3.041,572,3.041,652,4.076,745,10.869,765,2.79,772,6.746,785,2.596,857,4.377,880,6.493,891,4.693,993,4.1,1024,4.005,1169,3.895,1309,10.341,1310,4.958,2058,5.43,2079,4.863,2106,4.909,2121,5.231,2131,5.115,2281,5.666,2444,5.172,2495,5.36,2598,6.493,2687,12.25,2688,7.872,2690,7.449,2691,7.872,2692,9.27,2693,6.071,2694,7.872,2695,7.872,2698,7.872,3174,5.756,3739,7.134,4421,10.71,5014,7.449,5021,7.872,5318,6.882,6494,8.513,6495,8.513,6496,8.513,6497,8.513]],["keywords/1309",[]],["title/1310",[4,140.222,25,89.993,300,745.978]],["content/1310",[]],["keywords/1310",[]],["title/1311",[4,162.462,630,576.359]],["content/1311",[4,1.696,6,0.673,23,4.327,32,4.295,33,1.458,34,4.12,35,1.993,36,5.882,37,1.167,87,2.415,111,2.623,124,2.603,151,2.144,152,2.245,161,3.562,167,4.9,191,2.089,198,1.857,224,4.963,271,2.465,334,2.004,407,3.389,517,3.768,572,2.483,630,7.084,645,4.089,694,3.455,723,4.699,758,3.006,765,3.696,766,9.116,767,3.971,768,6.441,769,5.059,770,3.432,772,4.677,773,6.45,776,3.308,787,3.368,806,3.348,845,4.558,901,5.431,975,6.064,1040,7.193,1143,4.494,1156,5.302,1219,3.348,1257,3.18,1278,3.432,1320,3.738,1903,5.173,2106,6.503,2381,5.059,2495,4.377,2719,5.825,2942,5.448,2980,5.448,4054,6.427,4515,8.848,4534,6.427,4599,9.45,4603,6.082,4620,8.601,4955,13.718,4956,10.356,5417,6.427,6498,6.95,6499,6.95,6500,14.226,6501,11.276,6502,14.226,6503,6.95,6504,6.95,6505,14.226,6506,6.95,6507,11.276,6508,6.95,6509,6.95,6510,6.95,6511,6.95,6512,6.95,6513,6.95,6514,6.95,6515,6.95,6516,6.95,6517,6.95,6518,6.95,6519,6.95,6520,6.95,6521,6.95,6522,6.95]],["keywords/1311",[]],["title/1312",[44,331.436,182,237.492,414,465.275,544,444.09]],["content/1312",[]],["keywords/1312",[]],["title/1313",[46,385.295,501,612.063,2106,686.479,2304,866.461]],["content/1313",[4,2.312,25,0.738,33,2.092,40,4.236,46,6.181,53,4.688,69,3.464,70,3.946,97,3.896,105,6.017,114,4.704,152,2.209,155,5.692,156,8.568,182,2.214,184,2.407,186,3.28,206,5.759,219,4.125,225,3.978,227,5.706,238,7.503,239,5.666,240,3.613,246,3.506,277,6.4,278,2.987,301,2.529,311,4.754,321,6.82,330,3.89,373,4.173,395,8.029,414,4.338,448,8.972,467,3.923,499,5.832,501,11.472,533,6.281,537,3.637,544,4.14,580,5.105,632,9.518,668,8.379,711,4.709,716,4.006,888,8.441,919,7.766,967,11.778,1109,9.889,1134,10.808,1157,6.597,1170,5.666,1648,7.766,1872,5.969,2098,6.988,2106,9.331,2252,6.742,2301,7.079,2304,8.078,3158,8.972,3159,9.711,3919,8.078,3963,8.465,6139,10.262,6523,11.097]],["keywords/1313",[]],["title/1314",[46,385.295,107,292.374,181,317.157,501,612.063]],["content/1314",[4,1.432,6,1.338,11,9.064,14,5.196,18,4.617,23,2.88,33,2.443,70,3.371,97,4.852,107,3.395,152,2.752,171,3.609,176,5.044,181,3.683,182,2.758,184,2.997,192,4.647,205,5.594,220,4.886,230,5.969,240,4.219,273,3.031,314,6.702,329,6.159,330,3.323,373,3.564,388,7.753,427,5.081,452,6.393,501,9.716,545,5.234,674,5.062,806,6.658,1258,16.535,1332,7.434,1403,9.857,1547,9.2,1564,8.817,1650,8.216,2117,9.064,2720,8.703,3245,12.781,3561,10.543,6524,21.529,6525,18.895,6526,18.895]],["keywords/1314",[]],["title/1315",[273,296.762,414,528.967,1021,727.832]],["content/1315",[4,1.466,6,0.898,7,2.894,14,5.318,15,5.399,23,3.151,32,2.994,33,2.673,34,3.239,40,3.539,53,3.916,63,2.033,65,4.637,69,2.894,88,4.851,103,4.131,152,1.846,155,2.763,156,4.909,161,2.929,166,5.026,171,2.421,183,2.92,185,3.417,204,8.118,219,3.446,230,4.469,240,2.07,241,8.099,246,2.929,271,3.288,272,3.952,273,4.97,289,4.312,330,4.615,373,5.619,401,4.152,405,4.767,414,6.706,417,9.811,455,8.214,501,4.767,543,6.353,652,4.438,716,5.107,736,3.472,771,3.714,858,4.669,886,3.311,897,6.079,902,5.296,926,4.733,1021,4.986,1074,5.067,1326,5.697,1560,6.373,1651,11.922,2114,6.079,2136,6.487,2242,7.267,2308,8.908,2542,6.748,2937,8.572,3448,7.495,3715,5.994,6527,9.27,6528,19.197,6529,9.27,6530,14.147,6531,9.27,6532,9.27,6533,9.27,6534,9.27,6535,9.27,6536,9.27,6537,9.27]],["keywords/1315",[]],["title/1316",[184,340.004,705,913.126]],["content/1316",[4,1.106,6,1.232,14,4.014,18,3.567,23,1.627,33,2.307,40,1.784,44,1.301,46,4.651,58,1.712,65,3.5,69,1.459,70,3.504,72,2.224,88,5.784,99,1.646,100,1.731,104,3.16,107,1.985,114,1.359,152,2.126,154,1.718,156,2.475,162,3.775,166,2.534,171,2.11,181,3.389,184,5.044,185,1.952,188,2.622,191,2.43,192,1.571,201,6.515,205,5.803,206,1.664,209,4.09,219,3.004,220,1.652,222,1.274,223,2.403,229,2.622,230,1.476,234,2.162,240,2.384,246,2.553,249,4.574,254,2.778,264,2.343,273,4.817,279,2.778,283,6.773,288,2.308,301,3.275,315,1.522,330,3.455,334,2.33,357,3.333,364,2.534,373,4.816,381,4.105,382,2.403,387,4.707,388,4.533,389,4.156,391,2.354,398,1.75,400,2.104,407,3.941,414,1.827,417,5.727,421,2.42,451,4.967,455,3.87,458,2.174,460,3.565,465,3.479,479,2.808,501,4.156,545,2.239,555,5.027,619,7.474,660,2.622,663,4.455,664,2.338,668,2.42,674,1.712,704,2.456,705,6.219,716,4.592,718,1.897,723,3.16,736,1.75,740,2.174,754,3.664,758,3.496,771,1.873,786,2.002,875,2.475,888,2.438,891,2.576,894,1.791,912,2.438,915,3.479,969,3.16,1021,2.514,1030,2.293,1049,2.872,1109,4.186,1114,2.386,1165,5.3,1173,6.347,1189,5.027,1219,2.251,1257,2.138,1268,2.42,1300,2.15,1315,2.943,1332,2.514,1356,2.981,1427,2.494,1526,2.555,1564,2.981,1631,4.574,1650,7.561,1711,3.065,1714,4.322,1889,8.01,1926,3.271,2018,3.664,2089,3.065,2114,3.065,2165,3.16,2321,6.724,2424,6.534,2444,2.84,2669,3.16,2677,5.656,2708,3.664,2714,7.341,2724,3.479,2760,4.322,2768,8.901,2769,6.165,2771,9.703,2779,2.872,2845,3.779,2913,6.016,3058,3.565,3560,3.402,3564,3.333,3627,4.322,3677,3.917,3919,3.402,5469,4.322,6487,7.474,6538,4.674,6539,4.674,6540,4.674,6541,4.674,6542,4.674,6543,4.674,6544,4.674,6545,8.082,6546,4.674,6547,4.674,6548,4.674,6549,4.674,6550,4.674,6551,4.674,6552,4.674,6553,4.674,6554,4.674,6555,4.674,6556,4.674,6557,4.674,6558,4.674,6559,4.674,6560,4.674,6561,4.674,6562,4.674,6563,4.674,6564,4.674]],["keywords/1316",[]],["title/1317",[206,481.704,240,302.163,2023,659.894]],["content/1317",[33,1.676,44,3.609,70,4.408,107,3.184,152,4.143,155,3.864,191,3.896,205,4.696,206,4.614,240,4.647,246,4.095,254,7.705,263,10.479,273,5.378,274,8.38,322,4.765,330,5.414,373,3.343,396,5.906,414,5.067,417,8.138,440,5.995,451,7.966,592,7.875,736,4.854,894,4.967,993,10.025,1039,9.887,1114,6.618,1170,6.618,1192,8.061,1313,7.705,1326,7.966,1339,5.806,1633,7.405,1650,12.371,2023,10.98,2049,8.38,2099,10.863,2114,8.5,2242,10.16,2747,11.986,3746,10.863,6565,12.962,6566,12.962,6567,12.962,6568,12.962]],["keywords/1317",[]],["title/1318",[116,647.46,514,562.039]],["content/1318",[6,0.99,12,3.566,14,3.844,15,5.955,19,3.065,25,0.68,33,1.322,46,4.931,49,4.811,69,3.192,70,2.494,88,3.506,111,3.859,114,2.973,116,8.908,152,3.033,156,5.415,162,7.625,166,5.544,171,2.67,177,7.833,183,3.221,186,3.022,189,5.221,192,3.438,205,2.657,228,6.653,229,5.736,230,3.23,241,7.498,246,4.812,249,5.788,273,5.396,278,2.753,321,6.284,330,3.662,373,4.695,381,4.916,388,5.736,389,5.258,407,7.428,414,5.954,421,5.296,455,4.896,514,7.231,543,8.676,545,4.219,569,5.018,630,3.759,703,3.815,716,3.692,785,3.118,981,5.842,982,5.457,1021,5.5,1332,8.193,1526,5.59,1651,11.634,2114,9.99,2130,6.706,2152,7.8,2288,10.3,2444,6.213,2779,6.284,3114,11.089,6569,10.226]],["keywords/1318",[]],["title/1319",[385,495.646,435,619.122,1021,727.832]],["content/1319",[5,3.024,6,2.253,22,3.676,53,5.917,107,3.441,151,4.322,152,3.796,162,4.952,182,3.804,192,4.709,205,4.954,206,4.986,215,7.362,238,12.892,271,6.764,301,3.192,330,4.584,414,5.475,435,11.138,545,3.88,568,8.24,580,8.771,706,7.152,736,5.246,765,6.249,931,8.326,954,7.362,1021,10.255,1183,7.722,1649,10.98,1650,8.326,1651,10.997,1726,7.534,1765,8.935,1931,8.82,2673,12.258,3960,12.258,3961,12.258,3963,10.685,5254,12.953,6570,14.007]],["keywords/1319",[]],["title/1320",[156,716.592,414,528.967,6571,1353.247]],["content/1320",[4,2.266,5,2.619,9,5.55,14,6.485,33,2.231,43,9.509,46,3.927,65,3.976,97,6.057,100,6.389,107,2.98,114,3.527,151,3.743,152,4.6,156,6.424,180,5.58,181,3.232,184,4.354,186,5.934,192,5.8,220,7.73,229,6.805,230,3.832,234,10.114,248,6.577,262,10.713,273,2.66,301,2.765,308,3.927,315,3.951,341,7.211,372,7.844,394,8.748,400,7.768,414,4.742,417,7.768,468,5.55,472,10.616,482,6.631,545,3.36,556,4.333,557,4.82,614,5.247,642,5.434,1112,7.211,1180,7.289,1228,8.652,1329,6.152,1779,8.34,2112,7.955,3052,10.616,6572,12.131,6573,12.131,6574,12.131]],["keywords/1320",[]],["title/1321",[273,296.762,543,501.136,561,636.63]],["content/1321",[2,8.051,5,3.401,14,4.022,15,6.231,23,1.631,33,1.383,61,5.754,65,3.506,69,3.34,88,6.41,114,3.11,122,4.696,124,4.006,152,4.106,161,3.38,171,2.794,176,3.904,177,8.1,180,4.921,182,2.135,186,4.656,188,6.001,189,5.463,201,4.132,205,2.78,206,3.808,222,4.295,224,5.668,227,5.501,228,4.672,246,3.38,273,5.552,361,6.001,373,4.062,403,8.65,414,4.182,417,4.817,476,6.5,484,6.001,490,6.259,543,8.514,544,3.991,561,10.341,572,3.822,607,5.8,703,3.991,716,5.687,736,4.006,740,4.976,765,3.506,773,4.216,943,5.623,958,4.948,1007,5.623,1030,5.25,1219,5.153,1479,6.001,1564,6.824,1607,9.893,1650,6.359,1712,7.486,2089,7.016,2098,6.737,2136,7.486,2239,7.788,2444,6.5,2459,8.65,3320,8.386]],["keywords/1321",[]],["title/1322",[297,444.782,300,864.293]],["content/1322",[14,5.605,97,6.982,114,4.334,151,4.6,152,4.455,161,4.71,177,7.667,200,5.563,224,6.03,228,6.512,230,4.71,256,7.014,264,4.322,273,4.907,300,8.219,301,3.398,395,6.269,417,6.713,421,7.722,543,7.364,580,6.859,630,9.141,716,7.18,765,4.887,858,7.51,897,9.777,942,8.958,1377,6.974,1560,10.25,1595,9.273,1631,8.439,2051,12.495,2114,9.777,2303,8.019,2560,9.777,3465,13.048,4067,13.787]],["keywords/1322",[]],["title/1323",[414,612.864,2065,1267.615]],["content/1323",[44,5.239,53,7.947,114,5.47,152,4.595,184,4.08,225,6.745,273,4.126,373,4.852,451,11.563,736,8.644,895,15.768,1021,10.119,1116,9.352,1651,10.851,1713,10.201,6575,23.082,6576,18.815]],["keywords/1323",[]],["title/1324",[33,202.738,6577,1567.878]],["content/1324",[4,1.69,5,3.52,6,1.579,7,3.502,10,4.438,23,2.485,25,0.746,33,2.484,37,1.883,40,4.282,51,3.902,63,2.46,65,3.676,75,10.543,98,4.805,100,7.115,109,7.252,114,3.261,152,2.233,156,5.94,184,5.07,186,4.82,205,4.992,206,3.993,222,3.059,225,4.021,240,2.505,260,5.809,276,6.815,277,6.469,283,9.4,298,5.504,301,2.556,372,7.252,373,4.955,385,4.108,398,4.201,407,5.47,417,8.65,454,7.252,465,8.349,476,6.815,488,13.666,501,8.385,674,4.108,688,6.815,735,5.05,736,4.201,1021,8.77,1356,7.155,1365,8.165,1614,5.727,1961,6.668,2031,8,2421,8.349,2422,9.069,2740,9.4,2771,8.556,2772,10.372,2938,10.372,2954,9.4,3831,9.4,4304,10.372,6578,11.217,6579,11.217,6580,11.217,6581,11.217,6582,11.217,6583,11.217,6584,11.217]],["keywords/1324",[]]],"invertedIndex":[["",{"_index":23,"title":{"307":{"position":[[56,1]]},"312":{"position":[[18,1]]},"472":{"position":[[5,1]]},"479":{"position":[[17,1]]},"550":{"position":[[0,2]]},"558":{"position":[[16,1]]},"629":{"position":[[40,1]]},"645":{"position":[[0,2]]},"651":{"position":[[0,2]]},"693":{"position":[[31,1]]},"695":{"position":[[25,1]]},"709":{"position":[[13,1],[25,1]]},"713":{"position":[[0,2]]},"761":{"position":[[38,3]]},"777":{"position":[[12,1]]},"822":{"position":[[8,1]]},"840":{"position":[[9,1]]},"898":{"position":[[16,1]]},"941":{"position":[[8,2]]},"956":{"position":[[8,1]]},"970":{"position":[[13,2]]},"1046":{"position":[[8,2]]},"1058":{"position":[[8,2]]},"1060":{"position":[[8,1]]},"1061":{"position":[[9,1]]},"1062":{"position":[[9,1]]},"1190":{"position":[[0,2]]},"1243":{"position":[[0,2]]},"1244":{"position":[[0,2]]},"1245":{"position":[[0,2]]}},"content":{"1":{"position":[[326,1],[345,1],[366,1],[386,1],[417,2],[528,1],[612,3]]},"2":{"position":[[98,2],[128,2],[226,2],[294,1],[331,1],[414,2],[443,3]]},"3":{"position":[[106,2],[211,1],[292,3]]},"4":{"position":[[272,2],[389,1],[476,3]]},"5":{"position":[[188,2],[299,1],[383,3]]},"6":{"position":[[255,2],[287,2],[385,2],[455,1],[494,1],[579,2],[608,3],[612,2],[673,1],[777,2],[806,3]]},"7":{"position":[[210,2],[331,1],[415,2],[443,3],[447,2],[508,1],[611,2],[639,3]]},"8":{"position":[[498,1],[515,1],[550,1],[564,1],[574,1],[594,1],[608,1],[618,1],[620,2],[674,1],[732,1],[751,1],[773,1],[809,1],[974,1],[1100,1],[1197,2],[1225,3]]},"9":{"position":[[122,2],[245,1],[340,2],[368,3]]},"10":{"position":[[51,2],[159,2],[236,1],[283,1],[375,2],[404,3],[417,1],[428,1]]},"11":{"position":[[89,2],[201,3],[205,1],[300,1],[319,1],[419,1],[508,2],[576,1],[607,1],[650,2],[659,1],[668,3],[672,3],[676,1],[708,2],[809,1],[902,2],[951,1],[953,2],[1069,1],[1071,1],[1073,3],[1077,1]]},"19":{"position":[[610,2],[651,1],[776,3],[780,2],[823,1],[869,1],[951,3]]},"50":{"position":[[201,3],[205,1],[274,1],[357,1],[475,2]]},"51":{"position":[[186,1],[205,1],[233,2],[272,1],[274,1],[401,1],[407,1],[440,2],[449,1],[466,2],[476,1],[493,1],[495,2],[523,2],[557,1],[584,1],[659,1],[661,2],[691,1],[736,2],[800,3],[804,2],[857,1],[878,1],[880,3],[895,1]]},"52":{"position":[[74,2],[159,3],[163,2],[207,1],[247,2],[250,1],[295,1],[297,3],[301,2],[334,1],[381,1],[419,1],[438,1],[451,2],[471,1],[509,1],[524,1],[562,1],[592,1],[594,3],[598,2],[618,1],[656,1],[671,1]]},"54":{"position":[[108,1],[123,1],[167,3],[177,2],[192,2],[195,5],[201,1],[255,1],[273,2],[286,2]]},"55":{"position":[[184,1],[206,1],[241,1],[271,1],[302,1],[313,1],[456,1],[465,1],[509,1],[559,1],[604,2],[607,2],[610,1],[612,2],[615,1],[675,1],[694,1],[729,1],[756,1],[807,1],[826,1],[865,1],[997,3],[1029,4],[1096,1],[1194,2],[1207,2]]},"61":{"position":[[237,1]]},"77":{"position":[[210,1],[242,1],[249,1],[259,1],[261,1],[263,3],[282,1],[316,1],[344,1],[346,1],[365,3]]},"103":{"position":[[250,1],[282,1],[289,1],[299,1],[301,1],[303,3],[322,1],[356,1],[384,1],[386,1],[405,3]]},"130":{"position":[[438,1],[440,1],[455,1],[481,2],[503,2],[522,3],[532,2],[547,2],[550,2],[553,3],[557,1],[600,1]]},"143":{"position":[[398,2],[462,3],[472,2],[487,2],[490,2],[517,1],[526,1],[559,1],[572,3],[576,2],[599,1],[643,3],[653,2],[668,2],[671,2],[698,1],[711,1],[744,1],[772,2],[775,2]]},"188":{"position":[[645,1],[664,1],[686,1],[705,1],[750,1],[807,1],[838,2],[926,1],[928,2],[962,1],[989,2],[1145,3],[1170,3],[1208,1],[1218,1],[1278,1],[1284,1],[1317,2],[1326,1],[1359,2],[1369,1],[1401,1],[1403,2],[1459,1],[1461,1],[1463,3],[1478,1],[1480,2],[1603,2],[2265,1],[2567,2],[2647,1],[2722,2],[2766,1],[2802,2],[2843,1],[3006,3],[3010,2],[3063,1],[3100,2],[3192,1],[3194,3],[3198,2],[3249,1],[3263,1],[3275,1],[3286,3],[3290,3]]},"209":{"position":[[8,1],[27,1],[62,1],[89,1],[140,1],[164,1],[223,1],[234,1],[354,3],[391,1],[401,1],[483,1],[489,1],[522,2],[532,1],[549,2],[562,1],[580,1],[582,1],[584,1],[586,1],[588,3],[592,2],[717,1],[747,1],[749,2],[797,1],[845,1],[900,2],[903,3],[933,2],[972,1],[974,2],[983,1],[1034,1],[1036,2],[1095,1],[1213,2],[1246,1],[1248,2],[1262,3],[1277,1]]},"210":{"position":[[153,1],[203,1],[262,1],[533,2],[536,3],[582,1],[620,3]]},"211":{"position":[[70,1],[89,1],[124,1],[151,1],[204,1],[286,3],[352,1],[362,1],[445,1],[451,1],[484,2],[496,1],[513,1],[515,1],[517,1],[519,1],[521,3]]},"234":{"position":[[310,1],[342,1],[349,1],[359,1],[361,1],[363,3],[382,1],[416,1],[444,1],[446,1],[465,3]]},"235":{"position":[[342,1],[344,1]]},"255":{"position":[[355,1],[374,1],[409,1],[436,1],[487,1],[511,1],[570,1],[581,1],[698,3],[735,1],[745,1],[827,1],[833,1],[866,2],[876,1],[893,2],[902,1],[920,1],[922,1],[924,1],[926,1],[928,3],[932,2],[1069,1],[1104,1],[1106,2],[1151,1],[1191,1],[1248,2],[1251,3],[1255,2],[1307,1],[1309,2],[1318,1],[1369,1],[1371,2],[1414,1],[1548,1],[1550,2],[1564,2],[1593,3],[1608,1]]},"258":{"position":[[8,1],[27,1],[62,1],[89,1],[142,1],[219,3]]},"259":{"position":[[34,1],[44,1],[127,1],[133,1],[166,2],[175,1],[192,1],[194,1],[196,1],[198,1],[200,3]]},"261":{"position":[[221,1],[271,1],[335,1],[405,2],[522,2],[626,2],[774,3],[784,3],[788,2],[818,2],[821,2],[845,3],[849,2],[943,1],[984,3]]},"266":{"position":[[547,1],[566,1],[588,1],[609,1],[656,1],[732,3]]},"269":{"position":[[20,1]]},"276":{"position":[[397,1],[439,1],[447,1],[460,1],[462,1]]},"300":{"position":[[229,1],[284,1],[315,1]]},"302":{"position":[[421,1],[683,1],[694,1],[751,1],[834,1],[850,1],[867,3],[893,1],[976,2],[1027,2],[1052,2],[1083,1],[1090,1],[1092,2],[1163,1],[1165,1]]},"303":{"position":[[444,2],[535,1],[537,1],[657,1],[659,1],[717,2],[720,1],[778,1],[780,1],[782,2],[802,1],[804,1],[896,1],[898,1],[941,2],[944,1],[987,1],[989,1],[991,2]]},"314":{"position":[[307,1],[326,1],[361,1],[388,1],[456,1],[467,1],[571,2],[610,2],[663,3],[700,1],[710,1],[793,1],[799,1],[816,2],[828,1],[845,2],[859,1],[876,1],[878,2],[898,1],[900,1],[902,3],[917,1]]},"315":{"position":[[169,1],[207,1],[258,1],[285,1],[336,1],[355,1],[416,1],[441,1],[517,3],[530,1],[636,3],[675,1],[685,1],[769,1],[775,1],[792,2],[801,1],[818,1],[820,2],[841,2],[915,1],[917,1],[919,3],[934,1]]},"316":{"position":[[142,1],[152,1],[210,2],[278,1],[284,1],[301,2],[313,1],[330,2],[344,1],[382,1],[384,1],[386,1],[388,1],[390,3]]},"334":{"position":[[172,1],[191,1],[213,1],[240,1],[314,1],[325,1],[431,2],[484,2],[523,2],[551,3],[587,1],[597,1],[679,1],[685,1],[702,2],[711,1],[728,2],[739,1],[756,1],[758,1],[760,1],[762,1],[764,3],[779,1]]},"335":{"position":[[104,2],[180,2],[183,1],[194,1],[218,2],[271,2],[274,2],[318,1],[320,2],[362,2],[421,1],[537,3],[541,3],[545,3],[549,2],[616,2],[625,1],[642,1],[683,1],[808,3],[812,3],[816,3]]},"356":{"position":[[337,1],[387,2],[657,1]]},"361":{"position":[[452,2],[532,1],[534,1],[654,1],[656,1],[714,2],[717,1],[775,1],[777,1],[779,2],[799,1],[801,1],[893,1],[895,1],[938,2],[941,1],[984,1],[986,1],[988,2]]},"367":{"position":[[671,2],[709,1],[711,1],[743,2],[822,1],[828,1],[861,2],[910,2],[919,1],[952,2],[961,1],[979,2],[993,1],[1031,1],[1033,2],[1082,1]]},"391":{"position":[[431,1],[442,1],[501,1],[604,1],[617,1],[651,1],[670,1],[716,3],[752,1]]},"392":{"position":[[214,1],[233,1],[255,1],[282,1],[335,1],[418,3],[559,1],[569,1],[629,1],[635,1],[667,2],[676,1],[693,1],[695,2],[723,1],[725,1],[727,3],[753,1],[931,1],[986,1],[1035,1],[1079,1],[1121,2],[1525,1],[1535,1],[1595,1],[1601,1],[1633,2],[1647,1],[1671,1],[1688,1],[1690,1],[1692,2],[1725,1],[1727,1],[1729,3],[1756,1],[2627,1],[2777,1],[2823,1],[2841,1],[2937,3],[2941,4],[2946,1],[2948,3],[3484,2],[3504,1],[3524,1],[3556,1],[3574,1],[3592,1],[3671,3],[3675,2],[3808,2],[3855,1],[4001,1],[4017,1],[4111,1],[4124,1],[4163,1],[4178,1],[4190,1],[4217,1],[4228,1],[4241,1],[4243,3],[4292,1],[4309,1],[4327,1],[4344,3],[4352,1],[4427,1],[4429,2],[4508,3],[4512,3],[4516,1],[4533,1],[4682,2],[4730,1],[4780,1],[4798,1],[4845,2],[4848,3],[4852,2],[4855,3],[4859,1],[4861,3]]},"393":{"position":[[923,1],[943,1],[988,1],[1056,2]]},"394":{"position":[[474,1],[494,1],[531,1],[560,1],[604,1],[643,1],[701,1],[760,1],[787,2],[851,4],[874,1]]},"397":{"position":[[484,1],[486,1],[518,2],[534,1],[536,1],[664,1],[682,1],[749,2],[775,1],[833,1],[872,1],[874,2],[877,2],[1047,2],[1072,1],[1202,2],[1226,1],[1317,1],[1319,1],[1626,1],[1646,1],[1708,1],[1710,3],[1732,4],[1752,1],[1818,1],[1864,1],[1882,1],[1928,1],[1930,1],[1959,2],[1962,2],[2078,1],[2097,1],[2163,1],[2170,1],[2201,3],[2245,4],[2250,1],[2252,3]]},"398":{"position":[[749,1],[774,1],[798,1],[892,1],[916,1],[1002,1],[1058,1],[1067,1],[1073,1],[1113,1],[1115,2],[1124,2],[1134,1],[1147,3],[1220,1],[1229,1],[1235,1],[1275,1],[1277,2],[1286,2],[1296,1],[1308,3],[1346,3],[1435,2],[1438,2],[1464,1],[1503,1],[1520,1],[1589,1],[1605,2],[1608,3],[1625,1],[1707,1],[1747,2],[1750,1],[1990,1],[2040,1],[2066,1],[2110,1],[2178,1],[2202,1],[2270,1],[2288,1],[2316,1],[2358,1],[2367,1],[2373,1],[2459,1],[2468,1],[2470,2],[2479,2],[2489,1],[2501,3],[2562,1],[2573,1],[2588,2],[2591,2],[2617,1],[2656,1],[2673,1],[2742,1],[2758,2],[2761,3],[2778,1],[2860,1],[2900,2],[2903,2],[3249,1],[3253,1]]},"400":{"position":[[288,2],[298,1],[311,3]]},"403":{"position":[[485,1],[487,1],[513,2],[615,1],[617,2],[620,3],[624,2],[627,2],[630,2],[633,3],[637,2],[640,2],[762,1],[803,1],[843,1],[919,1],[935,1],[942,1],[996,3],[1016,2],[1019,1],[1021,1],[1023,3]]},"405":{"position":[[187,1]]},"412":{"position":[[4440,1],[4452,1],[4512,1],[4514,1],[4516,3],[4520,1],[4571,1],[4625,2],[4642,1],[4644,3],[4648,1],[4706,1],[4749,1],[4784,1],[4807,1],[4845,1],[4894,1],[4963,1],[4989,2],[5016,2],[5019,3],[5023,1],[5068,1],[5121,1],[5154,2],[5174,1],[5176,3],[5180,1],[5248,1],[5321,1],[5323,1],[5392,1],[5464,1],[5543,2],[5572,1],[5574,2],[12048,2]]},"425":{"position":[[246,2],[322,2],[376,1],[412,2],[483,2]]},"426":{"position":[[304,1],[306,1],[359,2],[362,2],[439,2],[498,1]]},"432":{"position":[[778,2],[838,2],[930,4]]},"439":{"position":[[634,2],[718,3],[735,1],[807,2]]},"458":{"position":[[709,2],[769,2],[872,4]]},"459":{"position":[[521,2],[588,1],[635,1],[695,1],[746,1],[795,1],[834,1],[871,1],[891,1],[949,1],[977,3]]},"471":{"position":[[172,1]]},"480":{"position":[[165,1],[184,1],[219,1],[246,1],[314,1],[316,2],[360,1],[444,3],[448,2],[500,1],[510,1],[593,1],[599,1],[616,2],[626,1],[643,2],[652,1],[670,1],[672,1],[674,1],[676,1],[678,3],[682,2],[741,1],[755,1],[757,2],[760,2],[763,2],[860,1],[915,3],[930,1]]},"481":{"position":[[350,1],[583,1],[607,1],[731,1],[733,2],[762,2],[765,2],[774,1],[776,2],[807,2],[810,2],[824,2],[856,3]]},"482":{"position":[[166,1],[185,1],[220,1],[247,1],[298,1],[336,1],[410,1],[412,2],[481,1],[557,3],[561,2],[605,1],[716,3],[720,2],[793,1],[803,1],[893,1],[899,1],[916,2],[931,1],[948,1],[950,2],[997,2],[1027,1],[1029,1],[1031,3],[1046,1]]},"493":{"position":[[197,1],[270,2],[282,2]]},"494":{"position":[[200,2],[203,1],[205,2],[289,1],[322,1],[357,1],[404,3],[420,2],[423,1]]},"502":{"position":[[948,1],[964,1],[973,1],[975,1],[977,2],[980,2],[983,2],[990,1]]},"518":{"position":[[415,1],[431,1],[440,1],[442,1],[444,2],[447,2],[450,2],[457,1]]},"522":{"position":[[285,1],[304,1],[326,1],[353,1],[406,1],[451,2],[502,2],[545,2],[595,2],[663,2],[726,2],[729,2],[771,3]]},"523":{"position":[[344,1],[389,1],[452,1],[510,1],[512,1],[532,1],[571,3],[591,1],[614,1],[623,1],[688,1],[744,3],[856,2]]},"534":{"position":[[186,1]]},"538":{"position":[[266,1],[285,1],[320,1],[347,1],[391,2],[421,1],[466,2],[530,3],[534,2],[573,1],[575,1],[702,1],[708,1],[741,2],[750,1],[767,2],[777,1],[794,1],[796,2],[824,2],[827,2],[880,1],[901,1],[903,3]]},"539":{"position":[[74,2],[159,3],[163,2],[207,1],[247,2],[250,1],[295,1],[297,3],[301,2],[334,1],[381,1],[419,1],[438,1],[451,2],[471,1],[509,1],[524,1],[562,1],[592,1],[594,3],[598,2],[618,1],[656,1],[671,1]]},"541":{"position":[[179,1],[201,1],[248,2],[251,1],[279,1],[314,1],[316,2],[358,1],[398,1],[434,1],[458,3],[469,2],[506,2],[531,1],[610,1],[705,3],[734,2],[737,1]]},"542":{"position":[[295,1],[330,1],[386,1],[405,1],[440,1],[467,1],[526,1],[649,3],[738,5],[776,2],[779,1],[794,1],[825,1],[861,1],[910,3],[926,2],[929,1]]},"548":{"position":[[128,1]]},"554":{"position":[[482,1],[501,1],[523,1],[561,1],[605,2],[608,1],[661,1],[736,2],[746,1],[767,1],[844,1],[846,2],[929,1],[999,3],[1003,2],[1044,1],[1157,2],[1200,3],[1204,2],[1285,1],[1295,1],[1384,1],[1390,1],[1423,2],[1439,1],[1456,2],[1472,1],[1489,1],[1491,2],[1541,1],[1543,1],[1545,3],[1560,1]]},"555":{"position":[[179,2],[188,1],[199,1],[232,2],[267,1],[378,3],[382,2],[466,1],[508,1],[532,1],[586,2],[615,2],[690,3],[694,5]]},"556":{"position":[[206,2],[292,1],[373,1],[393,1],[449,1],[480,1],[533,1],[751,1],[764,1],[802,1],[850,1],[874,1],[908,1],[1034,3]]},"557":{"position":[[259,1]]},"559":{"position":[[199,1],[221,1],[268,1],[300,1],[320,1],[334,1],[383,1],[403,1],[405,3],[409,3],[432,1],[494,2],[517,1],[775,2],[778,1]]},"562":{"position":[[8,1],[27,1],[49,1],[76,1],[148,1],[159,1],[260,3],[281,1],[283,1],[365,1],[371,1],[388,2],[397,1],[414,2],[424,1],[441,1],[443,2],[471,2],[508,1],[529,1],[531,3],[535,2],[623,3],[627,2],[662,1],[716,2],[731,5],[818,1],[1050,1],[1072,1],[1119,2],[1122,1],[1150,1],[1185,1],[1199,1],[1220,2],[1296,1],[1332,1],[1356,3],[1367,2],[1395,2],[1420,2],[1445,1],[1481,1],[1554,3],[1570,2],[1573,1]]},"563":{"position":[[205,1],[224,1],[259,1],[286,1],[337,1],[372,1],[460,1],[471,1],[604,3],[608,2],[686,1],[718,1],[742,2],[761,2],[839,5]]},"564":{"position":[[193,1],[212,1],[234,1],[272,1],[323,1],[350,1],[424,1],[449,1],[525,3],[529,2],[575,1],[689,3],[728,1],[738,1],[822,1],[828,1],[845,2],[860,1],[877,1],[879,2],[926,2],[946,1],[948,1],[950,3],[954,5]]},"571":{"position":[[889,1],[905,1],[914,1],[916,1],[918,2],[921,2],[924,2],[931,1],[1036,1],[1038,2],[1119,1],[1160,1],[1171,1],[1234,1],[1248,3],[1252,2],[1377,1],[1379,1]]},"579":{"position":[[158,2],[174,1],[193,1],[215,1],[242,1],[323,1],[334,1],[440,2],[493,2],[532,2],[559,3],[595,1],[605,1],[687,1],[693,1],[710,2],[719,1],[736,2],[753,1],[770,1],[772,1],[774,1],[776,1],[778,3],[793,1]]},"580":{"position":[[38,5],[262,2],[306,1],[323,1],[344,1],[359,1],[387,1],[422,2],[431,1],[436,1],[460,2],[516,1],[532,1],[541,1],[543,2],[552,2],[567,2],[570,2],[573,2],[576,2],[587,1],[680,1],[695,1],[708,3],[712,3],[829,2],[842,2],[851,2],[872,2]]},"594":{"position":[[184,1]]},"598":{"position":[[258,2],[274,1],[293,1],[315,1],[342,1],[417,1],[428,1],[473,2],[537,3],[541,2],[580,1],[582,1],[709,1],[715,1],[748,2],[757,1],[774,2],[784,1],[801,1],[803,2],[831,2],[834,2],[887,1],[908,1],[910,3],[925,1]]},"599":{"position":[[74,2],[168,3],[172,2],[216,1],[265,2],[268,1],[322,1],[324,3],[328,2],[361,1],[408,1],[446,1],[465,1],[478,2],[498,1],[536,1],[551,1],[589,1],[619,1],[621,3],[625,2],[649,1],[687,1],[702,1]]},"601":{"position":[[264,2],[278,2],[384,1],[401,1],[422,1],[431,1],[459,1],[499,2],[508,1],[519,1],[537,2],[579,1],[599,2],[668,1],[683,1],[696,3],[700,3]]},"602":{"position":[[238,1],[261,2],[264,2],[651,2],[665,2]]},"608":{"position":[[128,1]]},"610":{"position":[[865,2],[924,1],[1014,1],[1075,2],[1127,2],[1149,1],[1151,3],[1155,1],[1203,1],[1268,1],[1326,2],[1358,3],[1362,1],[1376,2]]},"611":{"position":[[591,2],[640,1],[691,1],[709,1],[750,2],[815,2],[835,1],[853,1],[904,2]]},"612":{"position":[[1088,2],[1150,1],[1209,2],[1264,1],[1278,1],[1306,1],[1308,1],[1323,2],[1789,1],[1813,1],[1832,2],[1877,1],[1898,1],[1994,3],[2014,1],[2029,1],[2031,2],[2081,1],[2103,1],[2168,2],[2171,2],[2221,1],[2244,1],[2260,1],[2262,1],[2332,2],[2355,2],[2365,2],[2423,2],[2432,1],[2472,3],[2476,3],[2497,2]]},"617":{"position":[[55,2]]},"628":{"position":[[274,1]]},"632":{"position":[[1046,1],[1065,1],[1100,1],[1127,1],[1204,1],[1206,2],[1280,1],[1367,2],[1414,3],[1418,2],[1485,1],[1495,1],[1577,1],[1583,1],[1616,2],[1626,1],[1643,2],[1652,1],[1670,1],[1672,1],[1674,1],[1676,1],[1678,3],[1682,2],[1768,2],[1771,2],[1827,1],[1874,3],[1889,1],[2115,1],[2139,1],[2208,1],[2293,2],[2363,1],[2414,1],[2416,2],[2488,2],[2491,2],[2500,1],[2530,1],[2532,2],[2577,2],[2580,2],[2595,2],[2638,2],[2675,3],[2679,1]]},"638":{"position":[[228,1],[266,1],[333,1],[409,3],[422,1],[527,3],[566,1],[576,1],[661,1],[667,1],[700,2],[716,1],[733,1],[735,2],[783,2],[817,1],[819,1],[821,3]]},"639":{"position":[[326,1],[336,1],[439,1],[445,1],[478,2],[490,1],[507,2],[521,1],[538,1],[540,1],[542,1],[544,1],[546,3]]},"646":{"position":[[8,1],[22,1],[44,1],[63,1]]},"647":{"position":[[171,1],[173,1],[175,2],[235,2],[314,2],[375,1],[395,1],[471,2],[536,1]]},"648":{"position":[[113,1],[115,1],[117,2],[224,1],[244,1],[280,2]]},"649":{"position":[[112,1],[114,1],[180,1],[200,1],[255,1],[335,2],[343,1],[400,1],[443,2],[461,1],[463,2]]},"652":{"position":[[8,1],[22,1],[44,1],[64,1]]},"653":{"position":[[124,1],[143,1],[165,1],[192,1],[245,1],[342,1],[344,3],[348,1],[396,1],[440,1],[465,1],[487,2],[515,1],[520,1],[525,1],[530,1],[536,2],[550,3],[554,1],[624,1],[685,1],[751,1],[774,2],[804,1],[810,2],[824,3],[828,1],[865,1],[921,1],[943,2],[960,1],[965,1],[970,2],[983,3],[987,1],[1005,1],[1048,1],[1091,1],[1141,1],[1193,1],[1210,2],[1244,3],[1248,1],[1290,1],[1338,1],[1399,1],[1443,1],[1460,2],[1487,1],[1489,3]]},"654":{"position":[[84,3],[88,1],[124,1],[169,2],[204,3],[208,1],[243,1],[293,2],[332,3],[336,1],[369,1],[402,1],[443,2]]},"655":{"position":[[391,2],[453,2]]},"659":{"position":[[437,1],[451,1],[484,2],[544,3],[548,2],[562,1],[570,1],[572,1],[609,3],[613,2],[627,2],[675,3]]},"661":{"position":[[629,1],[652,1],[683,1],[756,1],[758,1],[760,1],[841,1],[853,1],[886,1],[1048,1],[1099,1],[1175,1],[1262,2],[1269,1],[1276,1],[1278,1]]},"662":{"position":[[1026,2],[1397,1],[1420,1],[1451,1],[1524,1],[1526,1],[1528,1],[1632,1],[1651,1],[1686,1],[1722,1],[1767,1],[1779,1],[1818,1],[1916,2],[1926,1],[1978,1],[2077,2],[2080,2],[2118,1],[2257,2],[2260,3],[2284,2],[2324,1],[2370,1],[2380,1],[2440,1],[2446,1],[2479,2],[2488,1],[2505,2],[2513,1],[2530,1],[2532,2],[2560,1],[2562,1],[2564,3],[2676,1],[2720,1],[2734,1],[2808,1],[2822,1],[2852,3],[2856,3],[2860,5]]},"672":{"position":[[27,1],[54,3],[82,1],[179,2],[182,1],[193,1],[213,2],[216,3],[220,2],[223,2],[226,1]]},"673":{"position":[[8,1],[20,1],[70,1],[185,2],[188,1],[199,1],[219,2],[222,3],[226,2],[229,2],[232,2],[235,3],[239,1]]},"674":{"position":[[43,1],[45,1],[72,2],[75,3],[79,2],[91,1],[93,2],[226,2],[229,1],[231,2],[234,3],[238,2],[241,2],[298,1],[341,1],[352,3],[371,1],[468,2],[471,1],[482,1],[502,2],[505,3],[509,2],[512,2],[515,2],[518,3],[522,1]]},"675":{"position":[[226,1],[244,1]]},"676":{"position":[[300,1],[317,1]]},"678":{"position":[[250,1],[252,1],[254,2],[296,1],[308,2],[311,2],[351,1],[368,1],[370,2]]},"680":{"position":[[292,2],[349,1],[385,1],[413,2],[451,1],[465,1],[509,2],[537,1],[556,1],[578,1],[605,1],[666,1],[747,3],[751,2],[807,1],[809,1],[869,1],[875,1],[908,2],[919,1],[962,2],[992,2],[1039,2],[1076,1],[1078,2],[1109,1],[1111,1],[1113,2],[1166,1],[1185,1],[1187,3],[1191,2],[1229,1],[1280,2],[1379,1],[1387,1],[1399,1],[1401,1],[1403,3]]},"681":{"position":[[644,2],[718,1],[725,1],[736,1],[738,2],[741,2],[800,1],[808,1],[820,1],[822,2],[825,2],[916,1],[918,2],[921,3],[925,1],[927,3]]},"682":{"position":[[346,1],[358,1],[360,3],[364,3],[368,3],[372,2],[384,1],[386,3],[390,3],[394,3],[398,1],[400,2],[403,1],[415,1],[417,3],[421,3],[425,3],[429,2],[441,1],[443,3],[447,3],[451,3],[455,1],[457,2],[460,1],[472,1],[474,3],[478,3],[482,3],[486,2],[498,1],[500,3],[504,3],[508,3],[512,1],[514,2],[517,1],[529,1],[531,3],[535,3],[539,3],[543,2],[555,1],[557,3],[561,3],[565,3],[569,1],[571,1],[573,3]]},"683":{"position":[[131,2],[214,3],[218,2],[305,1],[313,1],[335,1],[337,1],[339,3],[768,1],[770,2],[824,1],[841,1],[843,2],[855,1],[857,2],[907,1],[929,1],[931,2],[946,1],[948,2],[1013,1],[1025,1],[1027,1],[1029,3]]},"684":{"position":[[190,1],[198,1],[215,1],[217,1],[219,3],[223,2]]},"691":{"position":[[235,1],[237,1],[279,3],[325,1],[334,1],[396,2],[502,2],[505,1],[507,2]]},"693":{"position":[[702,2],[719,1],[744,1],[746,1],[788,1],[809,1],[811,1],[884,2],[887,1],[992,3],[996,3],[1001,2],[1022,1],[1048,1],[1050,1],[1092,1],[1113,1],[1115,1],[1166,1],[1289,2],[1292,3],[1296,2],[1299,3],[1303,2]]},"698":{"position":[[2722,2],[2825,2],[2893,2],[2960,2]]},"710":{"position":[[856,2],[1547,1],[1566,1],[1588,1],[1615,1],[1659,2],[1687,1],[1769,3],[1773,2],[1813,1],[1859,1],[1861,2],[1864,3],[1868,2],[1871,1],[1873,3],[1877,2],[1955,2],[1983,1],[2027,1],[2041,1],[2054,2],[2115,1],[2129,1],[2159,3],[2163,3],[2167,5]]},"711":{"position":[[1116,1],[1147,1],[1200,2],[1257,1],[1354,3],[1385,3],[1543,1],[1574,1],[1611,1],[1624,3],[1628,3],[1632,3],[1735,1],[1787,1]]},"717":{"position":[[149,2],[556,1],[594,1],[645,1],[672,1],[716,2],[793,1],[869,3],[1059,1],[1078,1],[1106,2],[1147,1],[1245,3],[1416,1],[1418,1],[1478,1],[1484,1],[1517,2],[1528,1],[1545,2],[1548,2],[1590,2],[1632,1],[1641,1],[1643,2]]},"718":{"position":[[101,1],[156,1],[216,1],[240,1],[289,2],[375,1],[449,3],[476,1],[478,1],[480,2],[517,1],[529,1],[606,2],[609,2],[650,1],[760,3],[764,2],[767,3],[771,2]]},"720":{"position":[[133,1],[135,1],[177,1],[179,2],[182,3],[186,2],[189,2],[205,1],[223,2],[294,1],[296,2]]},"724":{"position":[[49,2],[179,1],[202,1],[251,1],[265,1],[442,1],[462,1],[521,1],[549,2],[662,2],[757,3],[761,1],[822,1],[895,1],[961,1],[987,1],[989,1],[991,1],[993,1],[1008,2],[1049,3],[1053,1],[1066,1],[1106,1],[1147,2],[1169,3],[1173,1],[1186,1],[1261,1],[1347,1],[1368,2],[1398,3],[1402,1],[1415,1],[1479,2],[1496,3],[1500,3],[1538,2],[1628,1],[1663,3],[1667,1],[1721,1],[1786,2],[1810,1],[1844,1],[1856,3]]},"729":{"position":[[354,1],[388,1],[390,1],[397,1],[416,2],[419,2]]},"731":{"position":[[128,1],[214,1]]},"732":{"position":[[116,1],[136,2],[139,3],[143,2],[146,1]]},"734":{"position":[[132,1],[163,1],[209,1],[236,1],[312,1],[381,3],[416,1],[435,1],[472,1],[554,3],[609,1],[611,1],[635,2],[743,1],[749,1],[782,2],[831,1],[833,2],[836,3],[840,2],[843,1],[845,2],[880,1],[899,1],[901,3]]},"738":{"position":[[84,1],[98,1],[120,1],[147,1]]},"739":{"position":[[196,1],[223,1],[276,1],[403,3],[446,1],[465,1],[467,3],[509,1],[548,2],[603,2],[612,1],[625,1],[739,3],[743,2],[751,1],[758,3]]},"740":{"position":[[423,1],[460,1],[519,1],[601,1],[609,2],[618,1],[620,2],[691,1]]},"741":{"position":[[53,1]]},"745":{"position":[[203,1],[226,1],[271,1],[295,1],[344,2],[399,1],[459,3],[463,2],[521,1],[592,3],[596,2]]},"746":{"position":[[287,1],[358,1],[360,2],[431,3],[435,1],[472,2],[475,2],[562,2],[667,2],[859,1],[861,3]]},"747":{"position":[[104,1],[349,3]]},"749":{"position":[[382,3],[389,3],[4417,1],[4455,1],[4484,2]]},"751":{"position":[[503,1],[551,1],[553,2],[647,1],[682,2],[715,1],[717,1],[719,1],[721,3],[807,1],[855,1],[890,1],[925,2],[958,2],[961,3],[965,1],[1025,1],[1092,2],[1116,2],[1204,2],[1290,1],[1411,1],[1428,1],[1468,1],[1495,3],[1499,1],[1501,1],[1503,1],[1505,3],[1605,1],[1653,1],[1655,2],[1749,1],[1784,2],[1817,2],[1820,3],[1824,1],[1875,1],[1920,2],[2009,1],[2011,1],[2013,1],[2015,3]]},"752":{"position":[[362,1],[408,1],[455,2],[520,1],[549,3],[583,3],[602,1],[604,1],[606,1],[608,3],[612,2],[657,1],[705,3],[716,1],[726,1],[728,2],[782,2],[863,1],[897,2],[1041,2],[1070,3],[1074,2],[1112,1],[1132,2],[1151,1],[1160,1],[1177,1],[1190,2],[1248,2],[1285,2],[1307,1],[1309,1],[1421,1]]},"753":{"position":[[256,1],[334,1],[375,1],[410,1],[412,1],[445,2],[448,3],[452,3]]},"754":{"position":[[201,1],[214,1],[255,1],[257,1],[286,2],[402,2],[432,2],[541,1],[543,3],[562,1],[591,2],[691,1],[766,2],[784,1],[786,1]]},"759":{"position":[[94,1],[111,1],[159,1],[183,1],[239,1],[266,1],[314,2],[352,1],[452,3],[500,3],[504,1],[532,1],[580,1],[617,2],[698,2],[747,2],[778,2],[950,1],[1003,1],[1005,3]]},"760":{"position":[[104,1],[132,1],[186,1],[188,1],[253,2],[256,3],[260,2],[270,1],[287,1],[335,1],[362,1],[410,2],[496,3],[500,1],[528,1],[576,1],[613,2],[694,2],[743,2],[838,1],[891,1],[893,3],[897,2],[900,3],[904,2]]},"761":{"position":[[105,2],[422,2],[459,1],[481,1],[546,2],[567,2],[585,1],[607,1],[689,2],[707,1],[729,1]]},"767":{"position":[[316,2],[370,2],[415,1],[421,2],[432,2],[488,2],[498,2],[603,2],[614,2],[712,2],[737,2],[804,2],[815,2],[884,2],[894,2],[1012,2]]},"768":{"position":[[273,2],[337,2],[389,1],[403,2],[414,2],[480,2],[490,2],[605,2],[616,2],[722,2],[745,2],[810,2],[821,2],[888,2],[898,2],[1014,2]]},"769":{"position":[[290,2],[356,2],[367,2],[435,2],[445,2],[562,2],[573,2],[683,2],[708,2],[775,2],[786,2],[855,2],[865,2],[983,2]]},"770":{"position":[[411,1],[418,2],[437,3],[441,3],[455,1],[520,2]]},"772":{"position":[[641,1],[660,1],[682,1],[709,1],[762,1],[897,2],[900,3],[904,2],[957,1],[976,1],[978,3],[982,2],[1010,1],[1044,1],[1061,1],[1428,1],[1447,1],[1469,1],[1511,1],[1607,1],[1748,2],[1751,3],[2136,1],[2155,1],[2200,1],[2262,1],[2281,1],[2369,1],[2504,2],[2507,3]]},"773":{"position":[[443,1],[462,1],[484,1],[505,1],[552,1],[628,3],[821,1]]},"774":{"position":[[446,1],[465,1],[487,1],[514,1],[565,1],[592,1],[654,1],[825,2],[828,2],[831,3]]},"789":{"position":[[158,1],[202,1],[231,1],[270,1],[272,1],[274,1],[276,3],[310,2],[405,1],[449,1],[478,1],[518,1],[520,1],[522,1],[524,3],[558,2]]},"791":{"position":[[14,1],[58,1],[87,1],[126,1],[128,1],[130,1],[132,3],[146,1],[206,2],[273,1],[317,1],[346,1],[381,1],[383,1],[395,1],[397,5],[403,1],[405,1],[407,1],[409,3],[452,3],[466,1],[526,2]]},"792":{"position":[[141,1],[185,1],[218,1],[257,1],[259,1],[261,1],[263,3],[277,1],[327,1],[416,3],[454,2]]},"793":{"position":[[149,2],[213,2],[242,2],[278,2],[462,2],[499,2],[525,2],[552,2],[564,2],[595,2],[607,2],[622,2],[1175,2],[1210,2]]},"795":{"position":[[128,2],[137,1],[205,1],[207,2],[216,2]]},"796":{"position":[[297,3],[301,1],[350,1],[413,2],[430,1],[432,1],[444,1],[451,1],[453,1],[461,1],[473,2],[476,2],[479,1],[487,1],[499,2],[508,1],[524,1],[526,2],[529,1],[537,1],[550,1],[552,2],[586,1],[588,1],[590,3],[594,1],[646,1],[709,1],[771,1],[835,2],[855,1],[857,1],[869,1],[877,1],[903,2],[929,1],[960,2],[994,1],[996,1],[998,1],[1000,3],[1004,1],[1066,1],[1129,2],[1148,1],[1150,1],[1162,1],[1164,3],[1168,1],[1254,1],[1333,2],[1344,1],[1351,1],[1376,2],[1391,2],[1435,1],[1437,1],[1439,1]]},"797":{"position":[[249,1],[281,1],[283,2],[286,3],[290,2],[293,2],[296,2],[331,1],[352,1],[354,3]]},"798":{"position":[[540,1],[576,1],[583,1],[593,2],[604,1],[615,1],[617,2],[620,3],[624,1],[692,1],[725,1],[811,1],[908,2],[936,3]]},"799":{"position":[[509,2],[518,1],[554,1],[569,1],[599,3],[650,3],[654,2],[663,2],[678,1],[702,3],[706,5],[731,2],[786,1],[801,1],[857,3]]},"800":{"position":[[806,1],[838,3],[842,5],[865,1],[899,1],[960,3],[964,5],[1016,1],[1018,2]]},"806":{"position":[[575,1],[610,1],[639,1],[641,2],[702,1],[704,1],[706,2],[709,2],[791,2]]},"808":{"position":[[133,1],[135,1],[220,1],[228,1],[245,2],[260,1],[276,2],[321,2],[410,1],[412,1],[414,2],[528,1],[530,1],[592,1],[600,1],[617,2],[629,1],[667,1],[684,1],[686,1],[688,1],[690,2]]},"810":{"position":[[256,3],[325,3],[339,1],[404,1]]},"811":{"position":[[236,3],[305,3],[319,1],[384,1],[409,2]]},"812":{"position":[[20,1],[63,1],[73,1],[115,1],[123,1],[140,2],[151,1],[181,1],[191,1],[222,1],[224,1],[226,1],[228,1],[230,1],[232,1],[234,3],[251,1]]},"813":{"position":[[20,1],[63,1],[73,1],[115,1],[123,1],[140,2],[152,1],[190,1],[207,1],[209,1],[211,1],[213,1],[215,1],[217,3],[302,1],[327,1],[329,3],[343,1],[407,1]]},"818":{"position":[[485,1],[529,1],[585,2],[588,3],[592,2],[595,1],[597,1],[599,3]]},"820":{"position":[[8,1],[24,1],[78,1],[102,1],[161,1],[209,3],[213,1],[263,1],[312,2],[349,3],[353,1],[406,1],[445,2],[457,1],[459,3],[463,1],[502,1],[542,2],[559,1],[571,1],[578,1],[588,1],[590,2],[593,2],[611,1],[623,1],[630,1],[640,2],[653,1],[671,1],[673,2],[676,1],[678,2],[691,4],[720,4],[725,3]]},"824":{"position":[[552,2]]},"825":{"position":[[100,1],[126,1],[175,1],[196,1],[333,1],[465,3],[469,2],[549,1],[569,1],[600,1],[615,1],[648,1],[660,1],[778,1],[882,2],[885,2],[920,1],[940,1],[961,2],[1013,1],[1050,1]]},"826":{"position":[[65,1],[254,2],[359,2],[373,2],[444,1],[476,2],[506,1],[531,2],[599,1],[618,2],[695,1],[722,2],[733,2],[807,1],[831,2],[905,1],[933,2],[952,2],[1026,1],[1050,2],[1110,1]]},"829":{"position":[[466,1],[498,1],[520,1],[547,1],[620,1],[631,1],[717,3],[755,1],[776,1],[778,3],[782,3],[786,1],[808,1],[837,1],[864,2],[878,1],[1255,1],[1277,1],[1300,1],[1321,1],[1357,1],[1371,1],[1402,1],[1404,2],[1413,1],[1445,1],[1478,1],[1493,1],[1501,2],[1510,1],[1521,1],[1561,2],[1574,2],[1577,4],[1595,2],[1604,1],[1731,1],[1740,1],[1789,3],[1810,3],[1842,2],[1845,2],[1900,1],[1918,1],[1964,1],[2324,1],[2337,1],[2378,1],[2380,1],[2411,1],[2423,3],[2433,2],[2448,2],[2451,1],[2453,2],[2472,1],[2474,2],[2483,1],[2491,1],[2510,1],[2512,1],[2546,1],[2592,1],[2658,2],[3236,1],[3253,1],[3294,1],[3296,1],[3327,1],[3339,3],[3349,2],[3364,2],[3367,1],[3369,2],[3387,1],[3389,2],[3398,1],[3406,1],[3425,1],[3427,1],[3465,1],[3511,1],[3520,1],[3557,1],[3608,3],[3624,2],[3627,2]]},"835":{"position":[[368,3],[372,1],[403,1],[447,2],[497,1]]},"836":{"position":[[681,1],[939,1],[946,1],[948,1]]},"837":{"position":[[1855,1],[2103,1],[2128,1],[2161,3]]},"838":{"position":[[1514,2],[1949,1],[1968,1],[1990,1],[1997,1],[2056,2],[2066,1],[2118,1],[2196,1],[2223,2],[2252,2],[2357,2],[2493,2],[2496,3],[2538,1],[2584,1],[2594,1],[2654,1],[2660,1],[2693,2],[2702,1],[2719,2],[2727,1],[2744,1],[2746,2],[2774,1],[2776,1],[2778,3],[2890,1],[2934,1],[2948,1],[3022,1],[3036,1],[3066,3],[3070,3],[3074,5]]},"846":{"position":[[55,1],[74,1],[140,1],[160,1],[239,2],[318,3],[322,1],[351,1],[387,1],[404,2],[419,3],[423,1],[465,1],[505,1],[538,1],[575,1],[595,1],[608,2],[645,1],[647,3],[651,1],[707,1],[720,2],[738,3],[742,1],[787,1],[818,1],[831,2],[858,3],[862,3],[866,4],[871,3],[875,1],[908,1],[952,1],[1025,1],[1053,2],[1073,2],[1082,1],[1084,3],[1088,1],[1133,1],[1146,2],[1164,3],[1168,1],[1206,1],[1253,1],[1266,2],[1293,3],[1297,3],[1301,3],[1305,1],[1307,1],[1309,2]]},"848":{"position":[[198,1],[221,1],[223,2],[301,1],[331,2],[398,1],[424,1],[426,3],[430,1],[432,2],[532,2],[628,2],[631,2],[657,1],[677,1],[793,3],[797,1],[835,2],[866,3],[876,2],[879,1],[881,2],[1028,1],[1173,1],[1226,1],[1292,1],[1312,1],[1428,3],[1432,1],[1470,2],[1548,3],[1558,2],[1561,1],[1563,2]]},"849":{"position":[[870,1],[895,1],[1136,1],[1138,1]]},"851":{"position":[[233,2],[310,1],[360,1],[382,1],[398,1],[400,2]]},"852":{"position":[[175,1],[195,1],[336,3],[346,2],[349,1],[351,2]]},"854":{"position":[[99,1],[141,1],[168,1],[213,1],[242,1],[321,1],[334,2],[337,3],[341,2],[344,3],[372,1],[419,1],[598,1],[732,1],[806,2],[809,3],[813,1],[877,1],[920,1],[960,1],[981,2],[990,3],[1000,3],[1004,3],[1008,1],[1053,1],[1070,2],[1085,3],[1089,1],[1142,1],[1144,1],[1190,1],[1243,1],[1299,1],[1342,1],[1402,1],[1434,1],[1484,1],[1535,1],[1575,1],[1605,2],[1648,3]]},"857":{"position":[[212,1],[246,1],[295,1],[372,1],[439,2],[442,3]]},"858":{"position":[[180,1],[202,1],[243,1],[317,2],[326,1],[336,1],[355,5],[369,1],[371,2],[380,1],[420,3],[429,1],[431,1],[433,2],[506,3]]},"860":{"position":[[486,1]]},"861":{"position":[[566,1],[619,1],[684,1],[719,1],[866,1],[893,1],[2115,1],[2138,1]]},"862":{"position":[[225,1],[245,1],[296,1],[342,1],[377,1],[404,1],[455,1],[464,1],[531,1],[608,3],[627,1],[629,1],[709,1],[715,1],[748,2],[757,1],[774,1],[776,2],[804,2],[841,1],[860,1],[862,3],[883,1],[969,1],[1132,1],[1323,2],[1387,1],[1404,2],[1413,1],[1429,2],[1432,2],[1435,1],[1437,3],[1441,1],[1501,1],[1530,1],[1532,3],[1536,2],[1539,3]]},"866":{"position":[[351,1],[367,1],[430,1],[535,2],[611,3],[615,1],[685,1],[728,1],[767,2],[807,1],[835,2],[856,1],[872,2],[881,1],[897,1],[899,3]]},"872":{"position":[[852,1],[866,1],[902,1],[993,1],[1080,1],[1112,1],[1128,1],[1130,3],[1547,1],[1579,1],[1601,1],[1622,1],[1660,2],[1705,1],[1780,3],[1784,2],[1848,1],[1858,1],[1926,1],[1940,1],[1973,2],[1987,1],[2004,2],[2017,1],[2034,1],[2036,2],[2089,1],[2091,1],[2093,3],[2287,1],[2306,1],[2372,1],[2402,1],[2506,2],[2584,1],[2600,2],[2609,1],[2625,2],[2639,3],[3107,1],[3124,1],[3168,1],[3193,1],[3252,1],[3342,3],[3346,3],[3365,1],[3437,3],[3524,2],[3782,1],[3801,1],[3823,1],[3843,1],[3887,1],[3905,1],[3963,1],[4040,3],[4078,1],[4088,1],[4156,1],[4170,1],[4203,2],[4217,1],[4234,2],[4247,1],[4264,1],[4266,2],[4319,1],[4321,1],[4323,3],[4327,2],[4396,2],[4458,1],[4600,1],[4616,2],[4625,1],[4641,1],[4643,3]]},"873":{"position":[[108,1]]},"875":{"position":[[309,2],[334,1],[358,1],[416,1],[528,1],[530,2],[557,2],[560,2],[569,1],[571,2],[598,2],[601,1],[603,3],[780,2],[805,1],[819,1],[886,1],[957,1],[1008,1],[1066,1],[1120,1],[1158,2],[1161,3],[1187,2],[1205,2],[1214,1],[1264,3],[2003,2],[2028,1],[2042,1],[2104,1],[2115,1],[2147,1],[2198,1],[2234,1],[2236,3],[2240,1],[2304,1],[2370,1],[2444,2],[2447,1],[2459,1],[2476,1],[2478,2],[2481,1],[2493,1],[2510,1],[2516,1],[2526,1],[2528,1],[2530,1],[2532,2],[2636,1],[2655,3],[2661,1],[2663,1],[2679,1],[2681,1],[2683,1],[2760,2],[2876,4],[2881,3],[3051,2],[3092,1],[3124,2],[3127,3],[3131,2],[3140,1],[3202,1],[3221,1],[3250,1],[3264,1],[3283,1],[3305,1],[3307,3],[3326,1],[3425,2],[3439,1],[3471,1],[3528,2],[3531,1],[3533,1],[3535,2],[3538,3],[3542,2],[3545,3],[4249,2],[4274,1],[4288,1],[4323,1],[4333,1],[4348,2],[4398,1],[4421,1],[4472,1],[4491,1],[4519,1],[4521,3],[4537,1],[4539,1],[4571,3],[4592,2],[4653,1],[4778,2],[4781,1],[4850,2],[4853,1],[4940,1],[5026,2],[5055,3],[5098,1],[5100,1],[5102,1],[5104,2],[5159,1],[5166,1],[5168,2],[5299,2],[5369,1],[5371,1],[5456,2],[5459,1],[5461,1],[5525,1],[5614,3],[6095,2],[6136,1],[6168,2],[6171,3],[6175,2],[6184,1],[6231,1],[6271,1],[6298,1],[6365,2],[6401,3],[6426,1],[6477,1],[6479,1],[6481,2],[6484,3],[6488,2],[6491,3],[7203,2],[7261,1],[7282,1],[7377,3],[7400,1],[7436,1],[7455,1],[7457,1],[7481,1],[7492,3],[7512,2],[7550,3],[8021,2],[8046,1],[8056,1],[8091,1],[8126,1],[8176,1],[8200,1],[8202,2],[8227,1],[8241,1],[8259,1],[8371,3],[8375,2],[8401,1],[8433,2],[8436,3],[8440,2],[8449,1],[8451,2],[8454,3],[8458,2],[8499,1],[8501,2],[8504,3],[8508,2],[8511,3],[8941,2],[8979,1],[8981,2],[9440,2],[9465,1],[9475,1],[9510,1],[9545,1],[9595,1],[9619,1],[9621,2],[9646,1],[9648,2],[9710,1],[9748,1],[9788,1],[9790,3]]},"878":{"position":[[187,1],[205,1],[277,1],[416,2],[495,1],[534,2],[543,3],[553,3],[568,3]]},"879":{"position":[[664,1],[685,3]]},"880":{"position":[[377,1],[446,3],[450,3]]},"881":{"position":[[387,1],[430,3]]},"882":{"position":[[394,1],[420,2],[423,3],[427,2],[468,2],[471,3],[475,2],[478,3]]},"885":{"position":[[536,1],[618,1],[631,1],[713,1],[732,1],[765,1],[786,1],[831,1],[844,1],[909,1],[935,1],[1052,1],[1068,1],[1070,1],[1104,1],[1215,1],[1217,1],[1270,1],[1303,1],[1326,1],[1346,1],[1394,1],[1476,1],[1478,1],[1502,1],[1516,1],[1534,1],[1555,1],[1557,3],[1580,1],[1598,1],[1626,1],[1631,2],[1703,1],[1733,1],[1840,3],[1857,1],[1935,1],[1937,3],[1941,2],[2029,1],[2064,1],[2185,3],[2203,1],[2205,2],[2300,1],[2302,3],[2306,2],[2367,1],[2418,2],[2476,1],[2535,1],[2537,1],[2584,1],[2593,1],[2645,1],[2663,1],[2665,1]]},"886":{"position":[[386,1],[414,1],[416,3],[420,1],[464,1],[497,2],[517,1],[530,1],[532,1],[538,3],[555,2],[558,1],[572,1],[635,1],[687,1],[699,1],[731,1],[744,1],[759,1],[761,1],[763,3],[774,1],[822,1],[842,1],[844,2],[847,2],[923,1],[942,1],[1008,1],[1028,1],[1058,2],[1096,1],[1133,2],[1142,1],[1176,2],[1232,2],[1329,2],[1454,3],[1458,1],[1522,1],[1582,1],[1642,1],[1669,1],[1734,1],[1750,2],[1767,2],[1770,2],[1846,1],[1881,2],[1884,3],[1888,1],[1946,2],[1996,1],[2003,1],[2026,1],[2044,1],[2052,1],[2054,2],[2294,1],[2307,1],[2321,1],[2323,1],[2378,1],[2413,1],[2445,1],[2447,1],[2449,2],[2468,1],[2470,1],[2488,2],[2498,1],[2545,2],[2548,2],[2640,1],[2660,1],[2690,2],[2728,1],[2765,2],[2774,1],[2808,2],[2839,3],[2843,1],[2866,1],[2942,2],[2959,3],[2963,1],[2985,1],[3063,1],[3104,2],[3131,2],[3143,1],[3178,2],[3187,1],[3189,2],[3192,3],[3196,2],[3199,2],[3202,2],[3205,3],[3209,2],[3212,1],[3214,2],[3489,1],[3507,1],[3521,1],[3565,1],[3597,1],[3609,1],[3645,2],[3659,1],[3674,1],[3676,1],[3678,3],[3689,1],[3709,1],[3719,1],[3721,2],[3724,2],[3827,1],[3847,1],[3877,2],[3915,1],[3990,2],[4041,2],[4050,1],[4099,2],[4111,1],[4146,2],[4155,1],[4274,2],[4332,2],[4418,2],[4551,2],[4645,2],[4765,2],[4874,1],[4895,1],[4897,2],[4924,1],[4926,2]]},"887":{"position":[[293,1],[313,1],[348,3],[352,3],[356,4],[370,3],[374,3],[378,4],[389,3],[393,3],[397,4],[408,1],[463,1],[465,2],[521,2],[623,1],[631,3],[641,1],[658,1],[660,3],[676,2],[679,2],[682,2],[685,3],[689,2],[692,1],[694,2]]},"888":{"position":[[350,1],[352,1],[434,1],[454,1],[489,3],[493,3],[497,4],[511,3],[515,3],[519,4],[530,3],[534,3],[538,4],[549,1],[600,2],[664,2],[791,2],[892,1],[894,1],[896,3],[900,1],[971,1],[1018,2],[1032,1],[1056,1],[1099,3],[1105,1],[1125,1],[1127,1],[1198,1],[1200,2],[1203,1],[1205,2],[1208,2],[1211,3],[1215,2],[1218,1],[1220,2]]},"889":{"position":[[154,1],[222,1],[238,1],[240,1],[380,1],[390,2],[483,1],[503,1],[538,3],[542,3],[546,4],[560,3],[564,3],[568,4],[579,1],[630,1],[632,3],[636,1],[716,2],[751,2],[754,2],[763,3],[767,3],[771,4],[776,2],[779,3],[783,2],[786,1],[788,2]]},"890":{"position":[[356,5],[362,3],[803,1],[833,2],[836,3],[840,2],[867,2],[870,3],[874,2],[877,1],[879,2]]},"892":{"position":[[8,1],[27,1],[49,1],[72,1],[117,2],[169,1],[198,3],[202,5],[208,2],[254,1],[335,3],[339,2]]},"893":{"position":[[96,1],[127,1],[172,2],[220,1],[259,3],[263,1],[295,1],[338,1],[371,2],[436,3],[440,2]]},"898":{"position":[[943,1],[1207,2],[2155,2],[2172,1],[2191,1],[2226,1],[2253,1],[2313,1],[2390,3],[2428,1],[2438,1],[2506,1],[2520,1],[2553,2],[2567,1],[2584,2],[2597,1],[2614,2],[2622,1],[2639,1],[2641,2],[2694,1],[2696,1],[2698,3],[2981,1],[2996,1],[3050,1],[3116,2],[3238,1],[3258,1],[3320,1],[3464,1],[3481,2],[3536,1],[3538,2],[3606,1],[3608,2],[3676,2],[3685,2],[3694,1],[3696,2],[3754,2],[3865,2],[3868,2],[3877,1],[3893,2],[3896,2],[3947,2],[3978,2],[4006,3],[4010,2],[4397,1]]},"899":{"position":[[72,1],[148,1],[207,1],[274,1],[349,1],[439,1]]},"904":{"position":[[572,1],[591,1],[626,1],[653,1],[706,1],[787,3],[824,1],[834,1],[916,1],[922,1],[955,2],[965,1],[982,2],[991,1],[1025,2],[1037,1],[1075,1],[1077,2],[1114,1],[1116,1],[1118,3],[1122,2],[1261,3],[1312,1],[1362,1],[1803,1],[1828,1],[1830,2],[1901,2],[1969,2],[2034,2],[2110,2],[2191,2],[2274,3],[2278,1],[2351,1],[2431,1],[2507,1],[2530,2],[2592,2],[2625,2],[2681,2],[2792,2],[2837,2],[2933,2],[2983,2],[3084,3],[3094,3],[3104,2],[3107,1],[3109,2]]},"906":{"position":[[893,1],[926,1],[986,1],[1038,2],[1052,3]]},"907":{"position":[[279,1],[304,1],[306,2],[309,3],[313,2],[348,1],[363,1],[371,3],[381,2],[384,2],[387,3],[391,2],[394,1],[396,2]]},"910":{"position":[[225,1],[227,1],[229,2],[232,3],[236,2],[295,2],[298,2],[301,3],[305,2],[308,2],[393,1],[395,1],[461,2]]},"911":{"position":[[577,1],[589,1],[624,1],[649,1],[651,2],[654,3],[658,2],[829,3],[839,3],[849,2],[852,2],[855,3],[859,2],[862,1],[864,2]]},"915":{"position":[[76,1],[90,1],[112,1],[136,1]]},"916":{"position":[[140,1],[142,1],[184,1],[186,2],[189,1],[191,2],[194,1],[196,2],[199,1],[201,2],[217,1],[235,2],[306,1],[308,2],[330,1],[374,1],[393,1],[395,3]]},"917":{"position":[[88,1],[101,1],[133,1],[167,1],[184,2],[263,2],[322,2],[380,1],[382,2]]},"918":{"position":[[96,1],[193,3]]},"919":{"position":[[103,1]]},"920":{"position":[[75,1]]},"921":{"position":[[166,1],[168,3],[232,1],[246,2]]},"929":{"position":[[86,1]]},"930":{"position":[[91,1],[141,1],[171,2]]},"931":{"position":[[91,1],[151,1],[187,2]]},"932":{"position":[[85,1],[141,1],[177,2],[685,1],[724,1],[778,1],[802,1],[851,2],[948,1],[1022,3],[1035,1],[1125,3],[1129,2],[1192,1],[1194,1],[1236,1],[1238,2],[1241,1],[1243,2],[1246,1],[1248,2],[1251,1],[1253,2],[1269,1],[1294,2],[1364,1],[1366,2],[1369,2],[1372,3],[1440,2]]},"934":{"position":[[223,1],[259,2],[266,1],[291,1],[320,3],[324,2],[381,3],[385,2],[440,3],[444,2],[497,3],[501,2],[584,3],[588,2],[621,2],[688,2],[764,2],[816,2],[819,2],[875,1],[877,2],[880,3],[884,1],[886,3]]},"939":{"position":[[102,2],[148,1],[184,1],[203,1],[205,3],[227,1],[271,3]]},"941":{"position":[[171,2]]},"942":{"position":[[180,1],[239,3]]},"943":{"position":[[377,1],[447,3]]},"944":{"position":[[190,1],[256,2],[259,1],[292,4],[297,2],[305,1],[307,2],[345,2],[355,2],[358,2],[361,1]]},"945":{"position":[[131,1],[188,3],[192,2],[200,1],[202,2],[240,2],[250,2],[253,2],[256,1],[452,1],[516,2],[519,3],[523,2],[526,3]]},"946":{"position":[[152,1],[212,3]]},"947":{"position":[[164,1],[198,1],[230,2],[233,1],[265,1],[267,3],[271,3],[275,1],[277,1],[279,1],[315,1],[324,3],[328,1],[330,1],[332,2]]},"948":{"position":[[388,1],[390,1],[405,2],[434,2],[497,2],[684,2],[766,2]]},"949":{"position":[[77,2],[133,1],[193,2]]},"950":{"position":[[223,2],[289,1],[303,1],[349,2]]},"951":{"position":[[328,1],[330,1],[348,2],[351,3],[355,2],[358,2],[375,1],[434,2]]},"952":{"position":[[179,1],[193,1],[215,1],[236,1]]},"953":{"position":[[67,2]]},"954":{"position":[[166,2]]},"957":{"position":[[98,1]]},"958":{"position":[[755,1],[772,1]]},"960":{"position":[[140,1],[159,1],[194,1],[221,1],[274,1],[319,2],[370,2],[389,2],[413,2],[440,2],[490,2],[558,2],[621,2],[624,2],[666,3]]},"962":{"position":[[601,2],[665,1],[692,1],[745,1],[828,3],[832,2],[886,1],[908,1],[961,1],[1111,2],[1114,3]]},"966":{"position":[[529,1],[633,3],[647,1],[751,2],[818,3]]},"967":{"position":[[114,1],[218,3],[232,1],[336,2],[371,3],[375,2]]},"968":{"position":[[318,2],[380,1],[389,1],[447,1],[488,1],[499,1],[558,2],[561,3],[565,2],[568,3]]},"971":{"position":[[291,1],[305,1],[327,1],[348,1]]},"972":{"position":[[66,2]]},"975":{"position":[[317,1],[319,2],[424,3],[428,2],[479,2],[511,1],[513,2],[580,2],[647,3]]},"977":{"position":[[99,2],[546,1],[565,1]]},"978":{"position":[[94,1],[109,1],[133,1]]},"979":{"position":[[228,1],[276,1],[298,3],[344,1],[363,1],[365,3],[369,2]]},"982":{"position":[[240,1],[242,1]]},"983":{"position":[[836,1],[845,1],[847,1],[856,1],[858,1],[860,1],[876,1],[878,1],[880,1],[882,1],[909,1],[911,1],[913,1],[915,1],[917,1],[919,1],[921,1],[923,1],[925,1],[927,1],[929,1],[938,1],[954,1],[963,1],[965,1],[967,1],[994,1],[996,1],[998,1],[1000,1],[1002,1],[1004,1],[1006,1],[1008,1],[1022,1],[1024,1],[1026,1],[1028,1],[1059,1],[1061,1],[1063,1],[1072,1],[1074,1],[1083,1]]},"986":{"position":[[738,1],[740,1],[857,3],[861,1],[897,1],[951,1],[1001,2],[1039,3],[1043,1],[1087,1],[1125,2],[1156,1]]},"987":{"position":[[207,1],[209,1],[704,1],[706,1],[708,1],[710,1]]},"988":{"position":[[122,1],[146,1],[188,1],[202,1],[240,1],[300,3],[304,1],[347,1],[415,1],[485,1],[530,2],[611,3],[615,1],[672,1],[750,1],[814,1],[845,2],[860,3],[864,1],[923,1],[944,1],[1015,1],[1038,1],[1074,2],[1090,1],[1098,3],[1102,1],[1181,1],[1255,1],[1338,1],[1424,1],[1441,2],[1469,3],[1473,1],[1500,1],[1547,1],[1606,1],[1636,2],[1656,3],[1660,1],[1731,1],[1768,1],[1854,1],[1939,1],[1979,1],[1981,1],[2057,1],[2152,1],[2154,1],[2235,1],[2237,1],[2260,2],[2288,3],[2292,1],[2304,1],[2383,2],[2392,1],[2394,3],[2398,1],[2413,2],[2436,1],[2438,3],[2442,1],[2494,2],[2515,1],[2566,1],[2593,1],[2660,2],[2691,2],[2694,3],[2698,3],[2702,1],[2773,1],[2826,2],[2844,1],[2889,2],[2892,3],[2896,1],[2919,1],[2991,2],[3008,3],[3012,1],[3080,1],[3161,1],[3254,1],[3351,1],[3364,2],[3387,2],[3390,3],[3394,1],[3406,1],[3482,2],[3491,1],[3493,3],[3497,1],[3512,2],[3556,1],[3577,1],[3594,1],[3621,1],[3626,3],[3630,1],[3687,2],[3705,1],[3804,2],[3833,1],[3865,1],[3867,3],[3871,1],[3920,1],[3977,1],[4044,1],[4122,2],[4157,3],[4161,1],[4210,1],[4250,1],[4303,2],[4345,3],[4351,1],[4368,1],[4370,1],[4467,1],[4469,2],[4472,2],[4490,3],[4494,1],[4547,1],[4583,1],[4680,1],[4693,2],[4717,3],[4721,1],[4762,1],[4775,1],[4829,2],[4868,2],[4871,3],[4875,3],[4879,1],[4932,1],[5019,1],[5062,2],[5083,1],[5165,1],[5198,1],[5213,1],[5267,3],[5271,1],[5333,1],[5361,1],[5363,1],[5396,1],[5398,1],[5400,1],[5413,1],[5415,1],[5417,1],[5419,1],[5435,1],[5454,1],[5472,1],[5474,1],[5476,1],[5478,2],[5481,1],[5495,1],[5497,1],[5513,1],[5531,1],[5533,1],[5535,1],[5537,1],[5539,2],[5559,1],[5603,3],[5607,1],[5664,2],[5682,1],[5684,2],[5725,1],[5727,2],[5766,1],[5768,2],[5777,1],[5793,1],[5805,1],[5814,1],[5821,1],[5823,3],[5827,1],[5879,1],[5942,1],[6001,1],[6064,1],[6128,2],[6159,1],[6161,1],[6163,1]]},"990":{"position":[[1225,1],[1336,3],[1344,1],[1346,1],[1348,2],[1417,1],[1419,3]]},"993":{"position":[[85,2],[212,2],[329,2],[476,2],[613,2]]},"995":{"position":[[1442,2],[1550,1],[1572,2],[1650,1],[1739,1],[1758,2],[1761,2],[1764,2],[1767,2],[1855,1],[1862,1],[1867,1],[1872,1],[2002,1],[2004,2]]},"996":{"position":[[497,2],[587,1]]},"998":{"position":[[174,2]]},"1000":{"position":[[157,2]]},"1001":{"position":[[74,2]]},"1002":{"position":[[257,2],[406,1],[421,2],[537,1],[658,2],[661,3],[665,2],[674,1],[685,2],[688,3],[692,3],[735,1],[737,3],[931,2],[1006,1],[1074,2],[1191,1],[1312,2],[1315,3],[1319,2],[1328,1],[1339,2],[1342,3],[1346,3],[1390,1],[1392,3]]},"1003":{"position":[[383,1],[440,2],[443,3],[447,2],[450,3]]},"1007":{"position":[[1180,1],[1182,3],[1186,2],[1260,1],[1323,1],[1339,1],[1341,1],[1375,1],[1468,1],[1503,1],[1515,1],[1608,2],[1611,2],[1614,3],[1618,2],[1621,1],[1623,2],[1632,1],[1661,1],[1673,1],[1727,2],[1730,3],[1734,2],[1737,1],[1739,1],[1741,3],[1773,1],[1793,1],[1834,1],[1846,1],[1892,1],[1944,1],[1946,1],[1948,2],[1998,2],[2098,1],[2202,1],[2244,1],[2273,1],[2275,3],[2279,1]]},"1012":{"position":[[84,1],[98,1],[120,1],[147,1]]},"1013":{"position":[[229,2],[290,1],[395,2],[459,3],[501,1],[547,2],[613,1],[615,3]]},"1014":{"position":[[192,1],[236,2],[242,1],[244,2],[263,1],[265,2],[268,2],[333,1],[375,2],[381,1],[383,2],[402,1],[404,2]]},"1015":{"position":[[168,1],[212,2],[218,1],[220,2],[239,1],[241,2]]},"1016":{"position":[[127,1]]},"1017":{"position":[[110,1],[176,1],[207,2],[239,3]]},"1018":{"position":[[69,1],[110,2],[135,1],[158,2],[225,2],[284,1],[286,2],[289,2],[292,2],[295,3],[299,2],[473,1],[489,2],[512,1],[535,2],[558,1],[567,2],[613,2],[756,1],[758,1],[772,1],[789,1],[860,2],[866,1],[868,2],[887,1],[889,2],[892,2],[955,1]]},"1020":{"position":[[348,1],[482,1],[484,3],[488,1],[538,1],[568,2],[595,1],[676,3],[680,1],[682,1],[684,3]]},"1022":{"position":[[444,1],[585,1],[611,1],[613,2],[711,2],[747,1],[826,2],[870,3],[874,2],[877,1],[879,1],[881,1],[883,3],[1001,1]]},"1023":{"position":[[103,1],[241,1],[267,1],[269,2],[362,2],[398,1],[412,1],[431,3],[495,2],[531,3],[535,2],[538,1],[540,1],[542,1],[544,3],[665,1]]},"1024":{"position":[[197,1],[327,1],[353,1],[370,1],[411,1],[444,1],[539,3],[543,1],[545,1],[547,3]]},"1033":{"position":[[405,2],[430,2],[451,1],[491,1],[603,1],[619,1],[650,2],[663,2],[666,3],[670,2],[673,1],[675,3],[679,2],[700,1],[821,2],[830,1],[861,2],[864,1],[879,2],[882,3],[886,2],[889,1],[891,3]]},"1035":{"position":[[153,3]]},"1036":{"position":[[113,1],[149,2]]},"1038":{"position":[[139,1],[165,2],[185,2],[202,1]]},"1039":{"position":[[143,2],[245,1],[254,1],[265,3],[344,2],[371,2],[419,1],[428,1],[439,3]]},"1040":{"position":[[134,2],[183,1],[202,2],[249,1],[284,2],[385,1],[387,1],[400,2],[482,2]]},"1041":{"position":[[86,3],[90,1],[147,2],[157,1],[171,1],[193,1],[212,1],[305,1],[314,2],[336,2],[345,1],[367,2],[395,1],[397,3]]},"1042":{"position":[[126,1],[144,1],[158,1],[172,1],[190,1],[223,1],[296,2]]},"1043":{"position":[[114,2],[166,3],[200,2]]},"1044":{"position":[[267,2],[320,1],[329,2],[351,1],[353,3],[357,2],[416,1],[430,1],[444,1],[465,3],[469,2],[523,3],[527,2],[583,3]]},"1045":{"position":[[69,1],[135,1],[181,3],[201,1],[252,3],[268,2]]},"1046":{"position":[[96,2]]},"1048":{"position":[[408,2],[458,1],[508,1],[510,3],[514,2],[567,1],[578,1],[597,1],[618,3]]},"1049":{"position":[[94,1],[154,1],[188,2],[248,2]]},"1050":{"position":[[82,2],[151,2]]},"1051":{"position":[[169,1],[211,2],[214,1],[295,3],[299,2],[435,1],[481,2],[484,1],[588,1],[590,3],[594,2],[627,2]]},"1052":{"position":[[187,1],[232,1],[243,2]]},"1053":{"position":[[96,1]]},"1055":{"position":[[141,2],[188,1],[221,1],[228,1],[238,1],[240,1],[242,3]]},"1056":{"position":[[70,2],[96,1],[132,1],[148,1],[150,3],[155,2],[192,1],[228,3],[238,1],[253,1],[255,3],[260,2],[312,1]]},"1057":{"position":[[80,1],[117,1],[161,2],[327,2],[446,1],[485,2],[598,1]]},"1058":{"position":[[214,1],[252,1],[286,1],[314,1],[316,1],[335,3],[339,2],[364,2],[435,3],[439,5],[445,2],[459,2],[484,2],[539,2]]},"1059":{"position":[[59,2],[132,1],[151,1],[224,1],[256,1],[263,1],[273,1],[275,1],[277,3],[308,1],[317,2],[363,1],[365,3]]},"1060":{"position":[[92,1],[124,1],[131,1],[141,1],[143,1],[145,3],[177,2],[213,3]]},"1061":{"position":[[93,1],[125,1],[132,1],[142,1],[144,1],[146,3],[185,1],[199,1],[213,1],[218,2],[280,3]]},"1062":{"position":[[90,2],[149,1],[181,1],[188,1],[198,1],[200,1],[202,3],[206,2],[268,1]]},"1063":{"position":[[80,1],[82,1],[106,2],[139,1],[146,1],[156,1],[158,1],[200,2],[243,1],[250,1],[260,1],[262,1],[304,2]]},"1064":{"position":[[75,2],[114,1],[128,1],[150,1],[175,1],[249,2],[302,1],[358,1]]},"1065":{"position":[[178,2],[239,1],[247,1],[260,1],[262,1],[264,2],[321,2],[324,1],[371,1],[448,1],[560,1],[653,1],[748,1],[778,2],[811,1],[819,1],[839,1],[841,1],[843,2],[900,2],[944,2],[1065,1],[1072,1],[1074,1],[1082,1],[1095,1],[1097,2],[1100,1],[1108,1],[1125,1],[1127,2],[1130,1],[1132,2],[1189,2],[1221,2],[1309,1],[1317,1],[1350,1],[1352,1],[1354,2],[1411,2]]},"1066":{"position":[[346,1],[382,1],[389,1],[399,2],[410,1],[421,1],[423,2],[426,3],[430,1],[498,1],[531,1],[617,1],[714,2],[742,3]]},"1067":{"position":[[288,1],[321,1],[328,1],[338,1],[340,1],[342,2],[399,3],[403,2],[453,1],[475,2],[490,2],[543,1],[572,1],[574,1],[583,1],[585,1],[600,3],[1119,3],[1123,1],[1167,1],[1228,1],[1267,2],[1282,1],[1315,1],[1322,1],[1341,1],[1343,1],[1345,3],[1349,3],[1353,1],[1397,1],[1458,1],[1509,1],[1534,2],[1549,1],[1582,1],[1589,1],[1599,2],[1615,1],[1625,1],[1627,1],[1629,3],[1913,2],[1956,1],[1994,1],[2001,1],[2020,1],[2022,1],[2047,1],[2067,2],[2106,1],[2138,1],[2145,1],[2164,1],[2166,1],[2211,2],[2214,3],[2218,1],[2262,1],[2321,1],[2351,2],[2369,1],[2438,2],[2474,2],[2477,3],[2481,2],[2484,3]]},"1069":{"position":[[466,1],[509,2],[611,1],[661,2],[726,1],[768,1],[822,2]]},"1070":{"position":[[93,1]]},"1072":{"position":[[2348,1],[2350,1],[2396,2],[2410,2],[2462,1],[2494,1],[2511,1],[2529,1],[2531,1],[2533,3],[2640,1],[2672,1],[2680,1],[2718,1],[2720,2],[2746,1],[2748,3]]},"1074":{"position":[[676,1],[912,1],[932,1],[999,2],[1048,2],[1070,1],[1109,2],[1138,1],[1227,2],[1250,1],[1289,2],[1315,1],[1433,2],[1456,1],[1570,1],[1634,1],[1654,1],[1693,2],[1716,1],[1755,1],[1757,1],[1759,1],[1761,1],[1763,2],[1788,1],[1826,2],[1899,1],[1929,1],[1931,1]]},"1075":{"position":[[43,1],[66,1],[68,3],[109,2]]},"1078":{"position":[[123,1],[125,1],[149,2],[269,1],[271,2],[328,2],[391,1],[417,2],[420,2],[487,3],[491,2],[522,1],[528,1],[561,2],[610,2],[624,1],[641,2],[654,1],[671,1],[673,2],[686,1],[718,1],[720,2],[819,2],[885,2],[977,3],[981,2],[1019,1],[1104,3],[1127,1]]},"1080":{"position":[[25,1],[27,1],[145,1],[151,1],[184,2],[233,2],[247,1],[280,2],[355,2],[368,1],[385,2],[396,1],[414,2],[429,1],[446,2],[458,1],[476,2],[612,2],[628,1],[652,1],[682,1],[689,1],[706,1],[708,1],[710,1],[712,1],[714,2],[727,1],[744,2],[813,2],[825,1],[840,2],[932,2],[1005,1],[1007,2]]},"1082":{"position":[[168,1],[170,1],[230,1],[236,1],[269,2],[318,2],[332,1],[349,2],[362,1],[379,2],[387,1],[418,2],[448,1],[450,2],[470,2]]},"1083":{"position":[[368,1],[370,1],[430,1],[436,1],[469,2],[518,2],[532,1],[549,2],[562,1],[579,2],[587,1],[618,1],[620,2],[640,2]]},"1084":{"position":[[669,1],[1541,1]]},"1085":{"position":[[388,1],[470,1],[1213,1],[1341,1],[1359,1],[1426,2],[1456,1],[1495,2],[1531,2],[1563,1],[1565,2],[1607,1],[3792,1]]},"1090":{"position":[[452,1],[473,1],[518,1],[542,1],[584,1],[613,1],[675,1],[702,1],[774,1],[942,2],[945,2],[948,3],[988,3],[992,5],[1013,1],[1071,3]]},"1097":{"position":[[338,1],[355,1],[392,3],[396,1],[468,1],[531,1],[601,2],[611,1],[636,1],[697,1],[789,3],[793,2],[827,2]]},"1098":{"position":[[30,2],[178,1],[195,1],[239,1],[264,1],[333,1],[425,3]]},"1099":{"position":[[30,2],[160,1],[177,1],[221,1],[242,1],[307,1],[395,3]]},"1100":{"position":[[648,1],[734,3],[770,2]]},"1101":{"position":[[427,2],[460,1],[546,3],[609,2],[650,1],[801,3],[811,2],[814,3]]},"1102":{"position":[[334,1],[419,3],[424,2],[471,1],[508,1],[527,1],[539,1],[566,1],[633,2],[669,2],[672,2],[675,3],[694,1],[818,2],[856,1],[875,1],[930,1],[972,1],[992,3],[1004,5],[1025,1],[1058,2],[1061,3]]},"1103":{"position":[[148,1],[193,1],[278,3],[297,1],[417,3]]},"1104":{"position":[[355,1],[363,3]]},"1105":{"position":[[635,1],[659,1],[661,1],[689,2],[706,1],[723,1],[847,3]]},"1106":{"position":[[572,1],[604,1],[620,1],[627,1],[642,1],[644,1],[661,1],[789,3]]},"1107":{"position":[[538,1],[666,1],[684,1],[751,2],[772,1],[839,1],[841,2],[873,1],[910,1],[912,1]]},"1108":{"position":[[391,1],[469,2],[563,3]]},"1109":{"position":[[189,1],[262,3],[358,1],[360,1]]},"1114":{"position":[[439,1],[471,1],[493,1],[520,1],[564,2],[611,1],[629,1],[703,1],[785,3],[789,2],[830,1],[859,2],[931,1]]},"1115":{"position":[[282,2],[354,2],[418,1],[424,2]]},"1116":{"position":[[310,2],[343,1],[360,2],[393,1],[429,1],[448,2],[481,1],[528,1],[558,2],[597,1],[648,1]]},"1117":{"position":[[326,1],[370,1],[390,2],[471,1],[473,2],[490,3]]},"1118":{"position":[[347,1],[387,1],[422,1],[433,1],[537,1],[539,1],[575,1],[598,1],[613,3],[617,1],[619,2],[637,1],[745,3],[763,1],[807,1],[850,1]]},"1119":{"position":[[366,1],[380,1],[402,1],[422,1]]},"1121":{"position":[[336,1],[386,1],[443,1],[525,3],[543,1],[594,1],[619,1],[757,3],[767,2],[770,1],[772,2]]},"1125":{"position":[[160,1],[179,1],[201,1],[222,1],[279,1],[355,3],[359,1],[410,1],[440,2],[471,3],[475,1],[554,1],[578,2],[605,3],[609,1],[651,1],[712,1],[737,2],[758,2],[761,3]]},"1126":{"position":[[325,2],[359,1],[441,3],[445,1],[506,1],[548,1],[607,2],[630,3],[634,2],[672,1],[762,3],[766,1],[826,1],[890,1],[906,2],[930,3]]},"1129":{"position":[[32,2]]},"1130":{"position":[[8,1],[27,1],[49,1],[78,1],[152,1],[290,3],[294,1],[340,1],[378,2],[397,2],[400,3],[404,2],[407,3],[411,2]]},"1134":{"position":[[8,1],[27,1],[49,1],[76,1],[129,1],[211,3],[215,1],[266,1],[338,1],[380,1],[410,2],[430,3],[434,1],[475,1],[488,1],[549,2],[589,3],[593,1],[648,1],[706,1],[739,1],[752,1],[767,2],[784,2],[787,3]]},"1138":{"position":[[66,2],[150,1],[169,1],[191,1],[215,1],[273,1],[352,3],[356,1],[417,1],[475,1],[499,1],[585,1],[601,2],[619,2],[622,3]]},"1139":{"position":[[248,1],[267,1],[289,1],[313,1],[423,1],[474,1],[528,1],[662,2],[665,3]]},"1140":{"position":[[464,1],[483,1],[505,1],[529,1],[587,1],[697,1],[721,1],[766,1],[768,1],[826,2],[841,2],[844,3]]},"1141":{"position":[[32,2]]},"1143":{"position":[[124,2]]},"1144":{"position":[[36,1],[55,1],[90,1],[110,1],[177,1],[252,3]]},"1145":{"position":[[240,1],[259,1],[294,1],[314,1],[412,1],[463,1],[517,1],[647,2],[650,3]]},"1146":{"position":[[222,1],[305,1],[307,2],[332,2],[335,1],[337,2],[340,3]]},"1148":{"position":[[526,1],[545,1],[580,1],[600,1],[751,1],[795,2],[798,1],[851,1],[881,2],[933,1],[1058,2],[1070,3],[1074,1],[1076,3],[1116,1],[1165,3]]},"1149":{"position":[[670,1],[689,1],[739,1],[759,1],[803,1],[822,1],[909,1],[979,3],[1037,1],[1047,1],[1107,1],[1113,1],[1146,2],[1155,1],[1172,2],[1180,1],[1197,1],[1199,2],[1227,1],[1229,1],[1231,3],[1303,1],[1396,2],[1468,3]]},"1150":{"position":[[466,1],[468,5],[474,2],[477,3]]},"1151":{"position":[[240,2],[877,1],[894,1]]},"1154":{"position":[[205,1],[245,1],[319,1],[343,1],[392,3],[396,1],[452,2],[480,1],[522,3],[526,1],[565,1],[623,2],[659,3],[663,3],[667,1],[719,2],[737,1],[812,3]]},"1158":{"position":[[30,1],[49,1],[84,1],[111,1],[185,1],[267,3],[324,1],[334,1],[417,1],[423,1],[440,2],[450,1],[467,2],[476,1],[494,1],[496,2],[533,1],[535,1],[537,3],[632,3],[674,1],[708,1],[716,1],[729,1],[731,1]]},"1159":{"position":[[216,1],[235,1],[270,1],[318,1],[371,1],[489,2],[492,3]]},"1162":{"position":[[906,3]]},"1163":{"position":[[9,1],[33,1],[89,1],[116,1],[169,3],[173,1],[235,1],[275,2],[298,1],[325,2],[398,1],[450,3],[454,2],[531,1],[586,3],[590,3],[594,3],[598,3]]},"1164":{"position":[[82,1],[103,1],[132,1],[185,3],[189,1],[217,1],[253,1],[268,1],[270,1],[283,2],[301,3],[305,1],[394,1],[478,1],[550,1],[638,1],[729,1],[778,1],[780,1],[793,2],[823,3],[827,1],[896,1],[956,1],[1028,1],[1082,1],[1098,2],[1130,3],[1134,1],[1204,1],[1250,1],[1252,1],[1323,1],[1403,1],[1483,1],[1485,1],[1498,2],[1520,2],[1551,3]]},"1165":{"position":[[308,1],[361,1],[440,3],[463,1],[475,3],[479,1],[537,1],[581,1],[653,1],[697,2],[721,1],[791,3],[834,3],[838,4],[908,2],[911,3],[915,2],[918,3],[922,3],[926,1],[998,1],[1035,2],[1059,1],[1135,3],[1178,3],[1182,4]]},"1168":{"position":[[24,1],[43,1],[65,1],[86,1],[133,1],[209,3]]},"1172":{"position":[[8,1],[27,1],[49,1],[68,1],[106,2],[234,1],[298,1],[420,2],[423,1],[491,1],[551,2],[554,2],[557,3]]},"1176":{"position":[[310,2],[339,1],[341,2],[344,3],[348,2],[360,1],[372,1],[384,1],[386,1],[388,2],[391,3],[395,2],[398,1],[400,2],[471,2],[540,1],[542,2],[545,3],[549,2],[573,1],[597,1],[599,2],[602,3],[606,2],[609,1]]},"1177":{"position":[[250,1],[301,1],[435,3],[490,1],[518,1],[520,3],[524,2]]},"1178":{"position":[[239,2],[874,1],[891,1]]},"1181":{"position":[[858,3]]},"1182":{"position":[[9,1],[33,1],[89,1],[116,1],[169,3],[173,1],[235,1],[275,2],[298,1],[325,2],[402,1],[454,3],[458,2],[535,1],[590,3],[594,3],[598,3],[602,3]]},"1184":{"position":[[375,1],[399,1],[455,1],[482,1],[542,1],[581,1],[648,1],[758,2],[761,3],[774,1],[829,3],[833,3],[837,3],[841,3]]},"1185":{"position":[[308,1],[399,3]]},"1186":{"position":[[266,1],[350,3]]},"1189":{"position":[[275,1],[294,1],[316,1],[338,1],[396,1],[473,3],[477,1],[505,1],[578,2],[653,2],[656,3]]},"1201":{"position":[[8,1],[27,1],[49,1],[85,1],[173,1],[254,1],[256,3],[260,1],[293,1],[346,2],[349,1],[351,1],[353,3]]},"1202":{"position":[[393,1],[427,1],[429,1],[436,1],[455,2],[458,2]]},"1204":{"position":[[235,1],[262,1],[305,1]]},"1208":{"position":[[636,2],[713,1],[755,2],[802,1],[847,1],[863,3],[867,2],[926,1],[978,1],[994,3],[998,2],[1069,1],[1114,2],[1163,1],[1226,1],[1261,2],[1321,1],[1365,1],[1397,1],[1405,3],[1431,1],[1471,2],[1536,1],[1601,1],[1616,3],[1620,2],[1683,2],[1731,1],[1763,2],[1819,2]]},"1210":{"position":[[184,3],[248,2],[290,1],[309,1],[331,1],[352,1],[413,1],[489,1],[491,3],[495,1],[551,1],[606,1],[634,2],[706,1],[708,1],[710,3]]},"1211":{"position":[[539,1],[558,1],[580,1],[609,1],[668,1],[753,3]]},"1212":{"position":[[263,2],[302,1],[321,1],[372,1],[396,1],[456,1],[510,3]]},"1213":{"position":[[560,2],[599,1],[618,1],[676,1],[726,3]]},"1218":{"position":[[268,2],[292,1],[313,1],[365,1],[449,2],[512,1],[514,2],[540,1],[542,2],[545,3],[560,1],[595,3],[599,2],[623,1],[650,1],[701,1],[725,1],[861,2],[883,1],[885,3]]},"1219":{"position":[[250,2],[270,1],[291,1],[336,1],[374,1],[422,2],[508,1],[589,3],[593,2],[671,1],[759,3],[764,2],[784,1],[814,1],[873,1],[968,2],[971,3]]},"1220":{"position":[[187,1],[302,2],[363,1],[376,2],[379,1],[381,3],[470,1],[531,3],[548,1],[591,3],[616,2],[624,1],[637,1]]},"1222":{"position":[[8,1],[31,1],[86,1],[113,1],[157,3],[161,1],[226,2],[252,1],[277,3],[281,1],[323,1],[381,2],[420,3],[424,3],[428,1],[471,1],[527,2],[545,1],[547,1],[549,2],[552,3],[556,2],[569,1],[571,3],[575,1],[618,1],[705,1],[753,1],[796,1],[798,1],[894,1],[932,2],[947,3],[951,1],[968,1],[1021,1],[1108,1],[1211,1],[1274,2],[1296,1],[1298,2],[1301,3],[1305,2],[1308,1],[1310,3],[1314,1],[1366,2],[1384,1],[1457,3]]},"1225":{"position":[[108,2],[135,1],[159,1],[212,1],[236,1],[301,3],[305,1],[366,1],[383,1],[422,2],[458,3]]},"1226":{"position":[[8,1],[27,1],[49,1],[76,1],[129,1],[153,1],[209,1],[291,1],[293,3],[297,1],[348,1],[395,1],[472,1],[474,1],[561,2],[605,3],[609,1],[630,1],[648,2],[666,1],[704,1],[706,1],[708,1],[710,3]]},"1227":{"position":[[312,2],[558,1],[577,1],[599,1],[626,1],[687,1],[769,1],[771,3],[775,1],[851,1],[886,2],[932,1],[934,1],[936,3]]},"1231":{"position":[[421,2],[448,1],[472,1],[525,1],[549,1],[605,1],[637,1],[659,1],[690,1],[794,1],[821,2],[911,3],[915,3],[919,1],[971,1],[1000,2],[1018,1],[1086,3],[1124,3],[1128,3],[1132,3],[1136,3],[1163,1],[1191,3],[1195,5]]},"1235":{"position":[[184,2],[319,2],[430,2]]},"1237":{"position":[[504,1],[532,1],[575,1],[606,1],[652,1],[690,1],[741,1],[765,1],[831,1],[1015,2],[1018,2],[1021,2],[1024,3]]},"1238":{"position":[[450,1],[473,1],[528,1],[549,1],[602,1],[626,1],[682,1],[722,1],[806,1],[1011,2],[1014,2],[1017,2],[1020,3]]},"1239":{"position":[[483,1],[523,1],[597,1],[624,1],[684,1],[713,1],[776,1],[926,2],[929,2],[932,3]]},"1246":{"position":[[1,2],[339,2],[956,2],[1218,2],[1592,2]]},"1247":{"position":[[1,2]]},"1249":{"position":[[450,2],[479,1],[481,1],[493,1],[500,1],[510,2],[529,2],[538,2],[552,2],[555,2]]},"1252":{"position":[[309,1],[404,1],[406,1],[414,1],[449,1],[451,2]]},"1263":{"position":[[1,2],[21,1],[45,1],[98,1],[122,1],[195,3],[199,1],[260,1],[277,1],[316,2],[352,3]]},"1264":{"position":[[8,1],[27,1],[49,1],[70,1],[131,1],[207,1],[209,3],[213,1],[264,1],[305,1],[375,1],[377,1],[448,2],[485,3],[489,1],[510,1],[528,2],[546,1],[584,1],[586,1],[588,1],[590,3]]},"1265":{"position":[[305,2],[552,1],[571,1],[593,1],[614,1],[675,1],[751,1],[753,3],[757,1],[825,1],[860,2],[899,1],[901,1],[903,3]]},"1266":{"position":[[144,2],[176,1],[214,1],[272,1],[299,8],[308,2],[367,2],[388,1],[457,1],[478,2],[508,1],[510,1],[540,1],[570,1],[595,2],[606,1],[696,2],[699,2],[730,1],[739,1],[741,1],[792,1],[839,1],[841,1],[843,2],[846,2],[858,1],[911,2],[928,1],[1020,1],[1030,1],[1049,2],[1052,2],[1079,4],[1084,1],[1086,2]]},"1267":{"position":[[425,2],[487,1],[543,3],[547,2],[609,1],[681,3],[703,1],[775,3]]},"1268":{"position":[[158,2],[199,2],[432,1],[468,2],[537,3],[576,1],[600,1],[653,1],[677,1],[783,3]]},"1271":{"position":[[562,2],[793,2],[1079,2],[1082,2],[1124,1],[1177,1],[1215,2],[1287,2],[1368,1],[1383,1],[1419,1],[1501,3],[1505,2],[1562,1],[1625,3]]},"1274":{"position":[[8,1],[27,1],[49,1],[91,1],[137,3],[141,1],[182,1],[214,1],[260,2],[313,1],[389,3],[393,1],[451,1],[500,1],[546,1],[610,1],[631,2],[677,2],[680,3]]},"1275":{"position":[[126,1],[145,1],[167,1],[215,1],[268,1],[283,1],[324,1],[454,2],[457,3]]},"1276":{"position":[[398,1],[417,1],[439,1],[481,1],[527,3],[531,1],[576,1],[644,1],[670,1],[718,2],[839,1],[881,1],[926,1],[1045,2],[1048,3]]},"1277":{"position":[[149,1],[168,1],[190,1],[239,1],[292,1],[299,1],[335,2],[373,1],[441,2],[586,2],[589,3],[724,1],[768,1],[872,1],[952,3]]},"1278":{"position":[[252,1],[271,1],[293,1],[346,1],[399,1],[450,1],[619,2],[622,3],[704,1],[723,1],[745,1],[793,1],[846,1],[861,1],[902,1],[1054,2],[1057,3]]},"1279":{"position":[[96,1],[119,1],[150,1],[223,1],[225,1],[227,1],[317,1],[336,1],[358,1],[405,1],[451,3],[455,1],[498,2],[508,1],[544,1],[589,1],[601,1],[640,1],[700,1],[776,3],[780,1],[838,1],[887,1],[933,1],[997,1],[1018,2],[1079,2],[1082,3]]},"1280":{"position":[[248,1],[267,1],[289,1],[332,1],[435,1],[555,2],[558,3]]},"1281":{"position":[[114,1],[138,1],[300,2]]},"1282":{"position":[[765,1],[847,2],[899,3],[1136,1],[1238,3]]},"1286":{"position":[[198,1],[226,1],[269,1],[296,1],[340,2],[403,1],[469,3],[482,1],[546,3]]},"1287":{"position":[[235,1],[267,1],[315,1],[342,1],[386,2],[449,1],[519,3],[532,1],[596,3]]},"1288":{"position":[[181,1],[219,1],[275,1],[302,1],[346,2],[409,1],[485,3],[498,1],[562,3]]},"1290":{"position":[[8,1],[17,1],[63,1],[98,1],[150,2],[185,1],[194,3]]},"1291":{"position":[[8,1],[23,1],[122,1],[148,2],[183,1],[192,3]]},"1292":{"position":[[864,1]]},"1294":{"position":[[574,1],[588,1],[590,2],[778,1],[795,1],[797,3],[826,1],[903,1],[944,1],[994,1],[1003,3],[1007,1],[1064,1],[1102,2],[1117,3],[1128,1],[1165,1],[1179,1],[1200,3],[1204,1],[1252,1],[1303,2],[1306,1],[1316,1],[1330,1],[1351,1],[1364,1],[1377,2],[1380,1],[1389,1],[1430,2],[1445,2],[1472,1],[1532,1],[1582,1],[1592,1],[1626,1],[1653,1],[1700,3],[1707,1],[1714,1],[1722,1],[1729,1],[1738,1],[1766,1],[1775,2],[1778,3],[1782,1]]},"1296":{"position":[[742,2],[814,1],[820,2],[886,1],[900,1],[935,1],[937,3],[961,2],[964,3],[969,2],[1034,1],[1048,1],[1050,2],[1053,2],[1125,1],[1146,1],[1148,2],[1315,2],[1356,1],[1382,4],[1421,2],[1424,2],[1465,1],[1486,2],[1531,1],[1558,1],[1560,3],[1586,2]]},"1298":{"position":[[216,2],[316,1],[339,1]]},"1309":{"position":[[227,1],[443,1],[455,1],[550,1],[552,1],[568,1],[570,3],[574,1],[632,1],[675,1],[710,1],[733,1],[818,1],[880,1],[906,2],[933,2],[947,1],[949,3],[953,1],[996,1],[1052,1],[1054,1],[1124,1],[1183,2],[1212,1],[1214,2],[1386,1],[1422,2],[1429,1],[1454,1],[1515,1],[1517,3]]},"1311":{"position":[[60,3],[64,1],[98,2],[130,1],[236,3],[290,1],[292,1],[445,1],[459,1],[476,2],[490,1],[507,2],[520,1],[537,2],[545,1],[563,1],[565,2],[618,2],[658,1],[660,1],[713,1],[737,1],[739,1],[750,1],[752,1],[774,1],[776,2],[830,1],[832,1],[890,1],[906,1],[957,1],[959,2],[1004,1],[1082,1],[1084,3],[1088,2],[1192,2],[1254,2],[1290,2],[1304,1],[1306,1],[1331,1],[1333,1],[1345,1],[1347,1],[1361,1],[1363,1],[1381,2],[1390,2],[1403,2],[1406,3],[1410,1],[1429,2],[1432,2],[1478,1],[1580,3],[1584,2],[1634,2],[1675,2],[1743,1],[1811,3],[1815,1],[1826,2]]},"1314":{"position":[[664,1],[689,1]]},"1315":{"position":[[386,1],[414,1],[463,1],[567,1],[657,1]]},"1316":{"position":[[821,1],[903,1],[952,1]]},"1321":{"position":[[267,2]]},"1324":{"position":[[111,1],[659,1]]}},"keywords":{}}],["0",{"_index":758,"title":{},"content":{"50":{"position":[[467,1]]},"51":{"position":[[307,2]]},"143":{"position":[[528,2],[713,2]]},"188":{"position":[[1229,2]]},"209":{"position":[[434,2]]},"211":{"position":[[396,2]]},"255":{"position":[[778,2]]},"259":{"position":[[78,2]]},"314":{"position":[[744,2]]},"315":{"position":[[720,2]]},"316":{"position":[[185,2]]},"334":{"position":[[630,2]]},"367":{"position":[[722,2]]},"392":{"position":[[580,2],[1546,2],[4003,2],[4019,2],[4180,2]]},"397":{"position":[[559,2]]},"398":{"position":[[2112,2]]},"480":{"position":[[544,2]]},"482":{"position":[[844,2]]},"502":{"position":[[971,1]]},"518":{"position":[[438,1]]},"538":{"position":[[608,2]]},"554":{"position":[[1335,2]]},"562":{"position":[[316,2]]},"564":{"position":[[773,2]]},"571":{"position":[[912,1]]},"579":{"position":[[638,2]]},"580":{"position":[[539,1]]},"598":{"position":[[615,2]]},"632":{"position":[[1528,2]]},"638":{"position":[[612,2]]},"639":{"position":[[368,2]]},"662":{"position":[[2391,2]]},"680":{"position":[[820,2],[960,1],[1275,4]]},"717":{"position":[[1429,2]]},"720":{"position":[[146,2]]},"734":{"position":[[694,2]]},"751":{"position":[[122,2],[599,1],[1701,1]]},"752":{"position":[[1245,2],[1283,1],[1299,2]]},"808":{"position":[[185,2],[541,2]]},"812":{"position":[[84,2]]},"813":{"position":[[84,2]]},"838":{"position":[[2605,2]]},"862":{"position":[[660,2]]},"863":{"position":[[63,1]]},"872":{"position":[[1869,2],[4099,2]]},"875":{"position":[[2659,1],[3252,2],[4400,2],[5494,3]]},"885":{"position":[[1628,2],[1932,2]]},"886":{"position":[[553,1]]},"888":{"position":[[1103,1]]},"898":{"position":[[2449,2]]},"904":{"position":[[867,2]]},"916":{"position":[[153,2]]},"932":{"position":[[1205,2]]},"988":{"position":[[3623,2],[4349,1]]},"995":{"position":[[1558,1]]},"1074":{"position":[[355,1],[743,2],[1199,2]]},"1076":{"position":[[46,2],[82,2]]},"1078":{"position":[[208,2]]},"1080":{"position":[[38,2],[575,2]]},"1082":{"position":[[181,2]]},"1083":{"position":[[381,2]]},"1085":{"position":[[1236,2]]},"1107":{"position":[[561,2]]},"1115":{"position":[[350,3]]},"1149":{"position":[[1058,2]]},"1158":{"position":[[368,2]]},"1208":{"position":[[1403,1]]},"1294":{"position":[[1704,2]]},"1311":{"position":[[366,2]]},"1316":{"position":[[954,1],[1124,1]]}},"keywords":{}}],["0.00000001",{"_index":6434,"title":{},"content":{"1294":{"position":[[1391,11]]}},"keywords":{}}],["0.003",{"_index":2418,"title":{},"content":{"398":{"position":[[2042,6]]},"402":{"position":[[1191,6]]}},"keywords":{}}],["0.0052",{"_index":3060,"title":{},"content":{"465":{"position":[[169,6],[374,6]]}},"keywords":{}}],["0.01",{"_index":5839,"title":{},"content":{"1080":{"position":[[607,4]]}},"keywords":{}}],["0.017",{"_index":3047,"title":{},"content":{"464":{"position":[[308,5],[513,5]]}},"keywords":{}}],["0.058",{"_index":3046,"title":{},"content":{"464":{"position":[[289,5]]}},"keywords":{}}],["0.1",{"_index":3061,"title":{},"content":{"465":{"position":[[186,3]]}},"keywords":{}}],["0.12",{"_index":2188,"title":{},"content":{"390":{"position":[[565,5]]},"402":{"position":[[290,5],[331,6]]}},"keywords":{}}],["0.132",{"_index":3059,"title":{},"content":{"465":{"position":[[150,5]]}},"keywords":{}}],["0.17",{"_index":3048,"title":{},"content":{"464":{"position":[[324,4],[392,4]]}},"keywords":{}}],["0.2",{"_index":1414,"title":{},"content":{"228":{"position":[[451,3]]}},"keywords":{}}],["0.34",{"_index":2189,"title":{},"content":{"390":{"position":[[572,5]]},"402":{"position":[[297,5]]}},"keywords":{}}],["0.39",{"_index":3078,"title":{},"content":{"467":{"position":[[106,4]]}},"keywords":{}}],["0.45",{"_index":3064,"title":{},"content":{"465":{"position":[[253,4]]}},"keywords":{}}],["0.56",{"_index":2187,"title":{},"content":{"390":{"position":[[558,6]]},"402":{"position":[[283,6],[324,6]]}},"keywords":{}}],["0.78",{"_index":2481,"title":{},"content":{"402":{"position":[[303,5]]}},"keywords":{}}],["0.8",{"_index":1412,"title":{},"content":{"228":{"position":[[419,3]]},"1292":{"position":[[705,3]]}},"keywords":{}}],["0.9",{"_index":6413,"title":{},"content":{"1292":{"position":[[740,3]]}},"keywords":{}}],["0.90",{"_index":2190,"title":{},"content":{"390":{"position":[[579,6]]},"402":{"position":[[310,5]]}},"keywords":{}}],["0000",{"_index":6555,"title":{},"content":{"1316":{"position":[[2268,4]]}},"keywords":{}}],["01",{"_index":6101,"title":{},"content":{"1158":{"position":[[596,4]]}},"keywords":{}}],["02",{"_index":2984,"title":{},"content":{"457":{"position":[[330,2]]},"751":{"position":[[1869,2]]},"1282":{"position":[[405,2]]}},"keywords":{}}],["04t15:29.40.273z",{"_index":6554,"title":{},"content":{"1316":{"position":[[2251,16]]}},"keywords":{}}],["0:42",{"_index":1789,"title":{},"content":{"301":{"position":[[533,4]]}},"keywords":{}}],["0the",{"_index":5803,"title":{},"content":{"1074":{"position":[[118,4]]}},"keywords":{}}],["1",{"_index":1300,"title":{"201":{"position":[[0,2]]},"248":{"position":[[0,2]]},"309":{"position":[[0,2]]},"474":{"position":[[0,2]]},"553":{"position":[[0,2]]},"559":{"position":[[5,2]]}},"content":{"299":{"position":[[598,2],[898,1]]},"303":{"position":[[715,1],[939,1]]},"361":{"position":[[712,1],[936,1]]},"402":{"position":[[1958,1]]},"403":{"position":[[510,2],[549,1],[805,2]]},"439":{"position":[[715,2],[815,2]]},"464":{"position":[[1214,1]]},"562":{"position":[[580,4]]},"571":{"position":[[1604,1]]},"599":{"position":[[113,4]]},"662":{"position":[[1599,1]]},"678":{"position":[[287,2],[306,1]]},"680":{"position":[[1397,1]]},"681":{"position":[[818,1]]},"683":{"position":[[212,1],[333,1],[927,1],[1004,2],[1023,1]]},"717":{"position":[[506,1]]},"724":{"position":[[130,2]]},"734":{"position":[[70,1]]},"749":{"position":[[4436,3],[4450,4],[4472,2],[4482,1]]},"751":{"position":[[556,1],[612,1],[614,2],[857,2],[1010,1],[1658,1],[1714,1],[1716,2]]},"752":{"position":[[522,2]]},"754":{"position":[[259,2]]},"825":{"position":[[83,1]]},"829":{"position":[[1,1]]},"838":{"position":[[1916,1]]},"849":{"position":[[914,3]]},"854":{"position":[[1,1]]},"861":{"position":[[224,1],[294,1]]},"862":{"position":[[118,1]]},"866":{"position":[[1,1]]},"872":{"position":[[1,1]]},"875":{"position":[[1,1],[2552,2],[2559,3]]},"885":{"position":[[1776,2],[1821,2],[1886,2],[1917,2],[2511,3]]},"898":{"position":[[1,1]]},"904":{"position":[[338,1],[1186,3]]},"1041":{"position":[[312,1],[334,1]]},"1042":{"position":[[174,2]]},"1044":{"position":[[327,1],[349,1],[446,2]]},"1048":{"position":[[580,2]]},"1051":{"position":[[603,2]]},"1059":{"position":[[315,1],[361,1]]},"1061":{"position":[[215,2],[262,1]]},"1115":{"position":[[420,3]]},"1144":{"position":[[1,1]]},"1148":{"position":[[425,1]]},"1149":{"position":[[610,1]]},"1158":{"position":[[1,1]]},"1177":{"position":[[445,2]]},"1189":{"position":[[1,1]]},"1282":{"position":[[551,1]]},"1305":{"position":[[549,1],[628,1]]},"1316":{"position":[[1129,2]]}},"keywords":{}}],["1.15",{"_index":6410,"title":{},"content":{"1292":{"position":[[697,4]]}},"keywords":{}}],["1.28",{"_index":3062,"title":{},"content":{"465":{"position":[[207,4]]}},"keywords":{}}],["1.41",{"_index":3063,"title":{},"content":{"465":{"position":[[227,4]]}},"keywords":{}}],["1.46",{"_index":3049,"title":{},"content":{"464":{"position":[[346,4]]}},"keywords":{}}],["1.5",{"_index":3055,"title":{},"content":{"464":{"position":[[767,3]]}},"keywords":{}}],["1.54",{"_index":3050,"title":{},"content":{"464":{"position":[[366,4]]}},"keywords":{}}],["1.6",{"_index":2833,"title":{},"content":{"420":{"position":[[376,3]]}},"keywords":{}}],["10",{"_index":1526,"title":{},"content":{"244":{"position":[[1527,2]]},"335":{"position":[[718,4]]},"392":{"position":[[2526,2],[2745,3],[3060,2]]},"397":{"position":[[230,2],[515,2]]},"398":{"position":[[1733,4],[2886,4]]},"402":{"position":[[737,2]]},"408":{"position":[[1108,4]]},"427":{"position":[[857,2]]},"435":{"position":[[272,2]]},"454":{"position":[[454,3]]},"459":{"position":[[563,2]]},"461":{"position":[[721,2],[833,2]]},"464":{"position":[[569,2]]},"696":{"position":[[1975,3]]},"724":{"position":[[1853,2]]},"736":{"position":[[254,2]]},"739":{"position":[[753,4]]},"752":{"position":[[785,2]]},"820":{"position":[[585,2],[637,2]]},"862":{"position":[[1400,3],[1426,2]]},"886":{"position":[[4891,3]]},"988":{"position":[[4486,3]]},"996":{"position":[[520,2],[584,2]]},"1045":{"position":[[178,2]]},"1067":{"position":[[1622,2]]},"1208":{"position":[[1640,2]]},"1222":{"position":[[755,2],[943,3]]},"1249":{"position":[[507,2]]},"1295":{"position":[[920,2]]},"1296":{"position":[[1696,4]]},"1316":{"position":[[2248,2]]},"1318":{"position":[[420,2]]}},"keywords":{}}],["10)).toarray",{"_index":4998,"title":{},"content":{"875":{"position":[[2600,15]]}},"keywords":{}}],["10.0.0",{"_index":406,"title":{},"content":{"24":{"position":[[609,6]]},"793":{"position":[[1458,6]]},"1198":{"position":[[1156,6]]}},"keywords":{}}],["100",{"_index":775,"title":{},"content":{"51":{"position":[[436,3]]},"188":{"position":[[1313,3],[1355,3]]},"209":{"position":[[518,3]]},"211":{"position":[[480,3]]},"255":{"position":[[862,3]]},"259":{"position":[[162,3]]},"299":{"position":[[320,3]]},"367":{"position":[[857,3],[948,3]]},"397":{"position":[[745,3]]},"398":{"position":[[776,4]]},"402":{"position":[[1513,4]]},"408":{"position":[[3188,3]]},"412":{"position":[[8182,4]]},"434":{"position":[[180,3]]},"467":{"position":[[15,3],[677,3]]},"538":{"position":[[737,3]]},"554":{"position":[[1419,3]]},"598":{"position":[[744,3]]},"617":{"position":[[1525,3]]},"632":{"position":[[1612,3]]},"638":{"position":[[696,3]]},"639":{"position":[[474,3]]},"660":{"position":[[271,4]]},"662":{"position":[[2475,3]]},"680":{"position":[[904,3],[946,4]]},"681":{"position":[[292,4],[377,4],[732,3]]},"698":{"position":[[2820,4],[2849,4]]},"717":{"position":[[1513,3]]},"734":{"position":[[778,3]]},"740":{"position":[[107,4]]},"752":{"position":[[1302,4]]},"767":{"position":[[596,6],[1005,6]]},"768":{"position":[[598,6],[1007,6]]},"769":{"position":[[555,6],[976,6]]},"816":{"position":[[238,3]]},"838":{"position":[[2689,3]]},"862":{"position":[[744,3]]},"872":{"position":[[1969,3],[4199,3]]},"886":{"position":[[4063,4],[4168,4]]},"898":{"position":[[2549,3]]},"904":{"position":[[951,3]]},"1044":{"position":[[519,3],[579,3]]},"1074":{"position":[[995,3],[1223,3]]},"1078":{"position":[[557,3]]},"1080":{"position":[[180,3],[276,3]]},"1082":{"position":[[265,3]]},"1083":{"position":[[465,3]]},"1085":{"position":[[1422,3]]},"1107":{"position":[[747,3],[835,3]]},"1149":{"position":[[1142,3]]},"1194":{"position":[[453,4],[727,4],[952,4]]}},"keywords":{}}],["100,000",{"_index":2553,"title":{},"content":{"408":{"position":[[2940,7]]}},"keywords":{}}],["1000",{"_index":1511,"title":{},"content":{"244":{"position":[[1170,4],[1331,4]]},"401":{"position":[[305,4]]},"653":{"position":[[510,4],[799,4],[955,4]]},"739":{"position":[[746,4]]},"886":{"position":[[1998,4]]},"988":{"position":[[1092,5]]},"995":{"position":[[1857,4]]},"996":{"position":[[589,6]]},"1186":{"position":[[311,5]]}},"keywords":{}}],["10000",{"_index":2436,"title":{},"content":{"400":{"position":[[71,5]]},"610":{"position":[[1350,7]]},"1186":{"position":[[244,6]]}},"keywords":{}}],["100000",{"_index":5838,"title":{},"content":{"1080":{"position":[[587,7]]}},"keywords":{}}],["1000th",{"_index":3976,"title":{},"content":{"704":{"position":[[53,7]]}},"keywords":{}}],["100k",{"_index":2328,"title":{},"content":{"394":{"position":[[1670,4]]}},"keywords":{}}],["100the",{"_index":5806,"title":{},"content":{"1074":{"position":[[361,6]]}},"keywords":{}}],["100x",{"_index":6465,"title":{},"content":{"1299":{"position":[[244,4]]}},"keywords":{}}],["1024",{"_index":2470,"title":{},"content":{"401":{"position":[[501,4],[538,4],[581,4]]}},"keywords":{}}],["104",{"_index":3072,"title":{},"content":{"466":{"position":[[191,3]]}},"keywords":{}}],["106135",{"_index":6419,"title":{},"content":{"1292":{"position":[[976,6]]}},"keywords":{}}],["108",{"_index":6196,"title":{},"content":{"1208":{"position":[[536,4]]}},"keywords":{}}],["10k",{"_index":2250,"title":{},"content":{"392":{"position":[[3118,3],[5150,3]]},"394":{"position":[[1607,3]]},"412":{"position":[[10073,3]]},"1162":{"position":[[706,3]]},"1181":{"position":[[794,3]]},"1295":{"position":[[1231,3]]}},"keywords":{}}],["10mb",{"_index":2527,"title":{},"content":{"408":{"position":[[374,5]]},"432":{"position":[[329,4]]}},"keywords":{}}],["10x",{"_index":4023,"title":{},"content":{"717":{"position":[[304,3]]},"1090":{"position":[[183,4]]}},"keywords":{}}],["11.0.0",{"_index":4628,"title":{},"content":{"793":{"position":[[1451,6]]}},"keywords":{}}],["110",{"_index":1491,"title":{},"content":{"244":{"position":[[453,3]]}},"keywords":{}}],["12",{"_index":4455,"title":{},"content":{"751":{"position":[[1872,2]]},"963":{"position":[[160,2]]},"1060":{"position":[[174,2],[210,2]]}},"keywords":{}}],["12.0.0",{"_index":4627,"title":{},"content":{"793":{"position":[[1444,6]]}},"keywords":{}}],["120",{"_index":2569,"title":{},"content":{"408":{"position":[[4867,3]]}},"keywords":{}}],["123",{"_index":1366,"title":{},"content":{"210":{"position":[[328,5]]},"1007":{"position":[[416,5],[807,3]]},"1008":{"position":[[192,4]]}},"keywords":{}}],["1234",{"_index":4638,"title":{},"content":{"796":{"position":[[468,4],[494,4],[545,4]]},"988":{"position":[[5467,4],[5526,4]]}},"keywords":{}}],["124",{"_index":5562,"title":{},"content":{"1007":{"position":[[891,4],[934,4]]}},"keywords":{}}],["125186",{"_index":6421,"title":{},"content":{"1292":{"position":[[1002,6]]}},"keywords":{}}],["125m",{"_index":3029,"title":{},"content":{"462":{"position":[[668,7]]}},"keywords":{}}],["128.0.6613.137",{"_index":3022,"title":{},"content":{"462":{"position":[[354,16]]}},"keywords":{}}],["1291",{"_index":2460,"title":{},"content":{"401":{"position":[[352,4]]}},"keywords":{}}],["13.0.0",{"_index":4626,"title":{},"content":{"793":{"position":[[1437,6]]}},"keywords":{}}],["13.41",{"_index":3070,"title":{},"content":{"466":{"position":[[149,5]]}},"keywords":{}}],["1300",{"_index":1513,"title":{},"content":{"244":{"position":[[1211,4],[1488,4]]}},"keywords":{}}],["131.0.6778.85",{"_index":6396,"title":{},"content":{"1292":{"position":[[115,14]]}},"keywords":{}}],["1337",{"_index":5177,"title":{},"content":{"892":{"position":[[313,5]]}},"keywords":{}}],["135,900",{"_index":3025,"title":{},"content":{"462":{"position":[[620,7]]}},"keywords":{}}],["13900hx",{"_index":6402,"title":{},"content":{"1292":{"position":[[192,7]]}},"keywords":{}}],["13th",{"_index":6397,"title":{},"content":{"1292":{"position":[[162,4]]}},"keywords":{}}],["14.0.0",{"_index":4625,"title":{},"content":{"793":{"position":[[1430,6]]}},"keywords":{}}],["14.0.0)fork",{"_index":6175,"title":{},"content":{"1198":{"position":[[2198,11]]}},"keywords":{}}],["140",{"_index":1496,"title":{},"content":{"244":{"position":[[677,3]]}},"keywords":{}}],["142",{"_index":6475,"title":{},"content":{"1301":{"position":[[1115,3]]}},"keywords":{}}],["1437",{"_index":2463,"title":{},"content":{"401":{"position":[[399,4]]}},"keywords":{}}],["1486940585",{"_index":4457,"title":{},"content":{"751":{"position":[[1964,11]]}},"keywords":{}}],["15.0.0",{"_index":4624,"title":{},"content":{"793":{"position":[[1423,6]]}},"keywords":{}}],["150",{"_index":6477,"title":{},"content":{"1301":{"position":[[1444,3]]}},"keywords":{}}],["1564483474",{"_index":5448,"title":{},"content":{"986":{"position":[[1027,11]]}},"keywords":{}}],["16",{"_index":469,"title":{},"content":{"28":{"position":[[804,3]]},"571":{"position":[[1581,2]]},"703":{"position":[[1511,2]]},"749":{"position":[[9325,3]]},"958":{"position":[[497,2],[618,3]]},"1162":{"position":[[1010,2],[1059,3]]}},"keywords":{}}],["16.0.0",{"_index":4623,"title":{},"content":{"793":{"position":[[1416,6]]}},"keywords":{}}],["16.66m",{"_index":3470,"title":{},"content":{"571":{"position":[[1641,8]]}},"keywords":{}}],["162",{"_index":2461,"title":{},"content":{"401":{"position":[[361,3],[408,3],[457,3]]}},"keywords":{}}],["1647",{"_index":2437,"title":{},"content":{"400":{"position":[[94,4]]}},"keywords":{}}],["16m",{"_index":3471,"title":{},"content":{"571":{"position":[[1794,5]]}},"keywords":{}}],["17",{"_index":6452,"title":{},"content":{"1295":{"position":[[1053,2]]}},"keywords":{}}],["17.0.0",{"_index":4622,"title":{},"content":{"793":{"position":[[1409,6]]}},"keywords":{}}],["170",{"_index":1471,"title":{},"content":{"243":{"position":[[878,3]]},"244":{"position":[[281,3],[1025,3],[1559,3]]}},"keywords":{}}],["1706579817126",{"_index":5953,"title":{},"content":{"1104":{"position":[[379,15]]}},"keywords":{}}],["173",{"_index":2447,"title":{},"content":{"401":{"position":[[219,3]]}},"keywords":{}}],["1769",{"_index":2464,"title":{},"content":{"401":{"position":[[448,4]]}},"keywords":{}}],["18",{"_index":4652,"title":{},"content":{"798":{"position":[[590,2],[721,3]]},"949":{"position":[[109,2]]},"1055":{"position":[[173,2],[235,2]]},"1059":{"position":[[270,2]]},"1060":{"position":[[138,2]]},"1061":{"position":[[139,2]]},"1062":{"position":[[134,2],[195,2]]},"1063":{"position":[[153,2]]},"1066":{"position":[[396,2],[527,3]]},"1067":{"position":[[335,2]]},"1292":{"position":[[747,2]]}},"keywords":{}}],["19",{"_index":5757,"title":{},"content":{"1063":{"position":[[103,2]]}},"keywords":{}}],["19.1",{"_index":3073,"title":{},"content":{"466":{"position":[[216,4]]}},"keywords":{}}],["1900",{"_index":1518,"title":{},"content":{"244":{"position":[[1370,4]]},"1074":{"position":[[1401,5]]}},"keywords":{}}],["1994",{"_index":2952,"title":{},"content":{"450":{"position":[[46,5]]}},"keywords":{}}],["1add",{"_index":5903,"title":{},"content":{"1085":{"position":[[3324,4]]}},"keywords":{}}],["1gb",{"_index":2537,"title":{},"content":{"408":{"position":[[1181,3]]},"696":{"position":[[1429,3]]}},"keywords":{}}],["2",{"_index":108,"title":{"202":{"position":[[0,2]]},"249":{"position":[[0,2]]},"310":{"position":[[0,2]]},"475":{"position":[[0,2]]},"554":{"position":[[0,2]]},"560":{"position":[[5,2]]}},"content":{"8":{"position":[[225,2],[297,1],[374,1],[880,2]]},"269":{"position":[[18,1]]},"299":{"position":[[423,2]]},"392":{"position":[[3076,1]]},"398":{"position":[[3251,1]]},"412":{"position":[[6997,1]]},"599":{"position":[[222,4]]},"612":{"position":[[2194,1]]},"617":{"position":[[650,1]]},"662":{"position":[[1859,1]]},"717":{"position":[[873,1]]},"724":{"position":[[334,2]]},"734":{"position":[[385,1]]},"751":{"position":[[967,1],[1023,1],[1095,2],[1147,2],[1923,2]]},"754":{"position":[[405,2]]},"825":{"position":[[220,1]]},"829":{"position":[[83,1]]},"838":{"position":[[2156,1]]},"854":{"position":[[54,1]]},"861":{"position":[[401,1],[919,1]]},"862":{"position":[[182,1]]},"866":{"position":[[53,1]]},"872":{"position":[[167,1]]},"875":{"position":[[607,1]]},"898":{"position":[[64,1]]},"904":{"position":[[1265,1]]},"1144":{"position":[[147,1]]},"1148":{"position":[[488,1]]},"1149":{"position":[[850,1]]},"1158":{"position":[[155,1]]},"1189":{"position":[[59,1]]},"1277":{"position":[[697,1],[854,3]]}},"keywords":{}}],["2*n",{"_index":3636,"title":{},"content":{"617":{"position":[[715,3]]}},"keywords":{}}],["2.0",{"_index":2959,"title":{},"content":{"452":{"position":[[451,3]]},"1294":{"position":[[16,4]]}},"keywords":{}}],["2.7",{"_index":6412,"title":{},"content":{"1292":{"position":[[724,3]]}},"keywords":{}}],["2.93",{"_index":3065,"title":{},"content":{"465":{"position":[[282,4]]}},"keywords":{}}],["2.htm",{"_index":759,"title":{},"content":{"50":{"position":[[469,5]]}},"keywords":{}}],["20",{"_index":2228,"title":{},"content":{"392":{"position":[[664,2],[1630,2]]},"798":{"position":[[703,3]]},"1063":{"position":[[257,2]]},"1066":{"position":[[509,3]]},"1067":{"position":[[1596,2]]},"1082":{"position":[[415,2]]},"1296":{"position":[[816,3]]}},"keywords":{}}],["20.6",{"_index":3068,"title":{},"content":{"466":{"position":[[116,4]]}},"keywords":{}}],["200",{"_index":3067,"title":{},"content":{"466":{"position":[[53,3]]},"698":{"position":[[2955,4],[2984,4]]},"704":{"position":[[82,3]]}},"keywords":{}}],["2000",{"_index":3610,"title":{},"content":{"612":{"position":[[2358,6]]}},"keywords":{}}],["2009",{"_index":350,"title":{},"content":{"20":{"position":[[110,4]]},"451":{"position":[[84,5]]},"455":{"position":[[36,4]]}},"keywords":{}}],["200k",{"_index":601,"title":{},"content":{"38":{"position":[[991,5]]}},"keywords":{}}],["200m",{"_index":2558,"title":{},"content":{"408":{"position":[[3192,5]]}},"keywords":{}}],["200mb",{"_index":3936,"title":{},"content":{"696":{"position":[[1489,5]]}},"keywords":{}}],["2012",{"_index":245,"title":{},"content":{"15":{"position":[[17,5]]}},"keywords":{}}],["2014",{"_index":269,"title":{},"content":{"16":{"position":[[15,4]]},"26":{"position":[[332,4]]},"408":{"position":[[4495,5]]},"419":{"position":[[55,6]]}},"keywords":{}}],["2015",{"_index":1763,"title":{},"content":{"299":{"position":[[1421,5]]},"357":{"position":[[117,6]]},"452":{"position":[[71,5]]}},"keywords":{}}],["2016",{"_index":353,"title":{},"content":{"20":{"position":[[144,5]]},"32":{"position":[[296,5]]},"1198":{"position":[[35,5]]}},"keywords":{}}],["2017",{"_index":2967,"title":{},"content":{"454":{"position":[[149,4]]},"751":{"position":[[1864,4]]}},"keywords":{}}],["2018",{"_index":431,"title":{},"content":{"26":{"position":[[347,4]]},"452":{"position":[[427,5]]}},"keywords":{}}],["2019",{"_index":318,"title":{},"content":{"19":{"position":[[16,4]]},"36":{"position":[[242,4]]},"407":{"position":[[1194,4]]},"422":{"position":[[325,4]]}},"keywords":{}}],["2021",{"_index":6553,"title":{},"content":{"1316":{"position":[[2243,4]]}},"keywords":{}}],["2022",{"_index":2983,"title":{},"content":{"457":{"position":[[324,5]]},"1282":{"position":[[399,5]]}},"keywords":{}}],["2023",{"_index":3939,"title":{},"content":{"696":{"position":[[1882,7]]},"1207":{"position":[[23,5]]}},"keywords":{}}],["2024",{"_index":606,"title":{},"content":{"38":{"position":[[1038,6]]},"41":{"position":[[1,5]]},"412":{"position":[[272,4]]},"470":{"position":[[25,5]]},"613":{"position":[[650,6]]},"620":{"position":[[603,5]]}},"keywords":{}}],["2048",{"_index":4408,"title":{},"content":{"749":{"position":[[21557,5]]}},"keywords":{}}],["2050",{"_index":5824,"title":{},"content":{"1074":{"position":[[1428,4]]}},"keywords":{}}],["21",{"_index":976,"title":{},"content":{"77":{"position":[[256,2]]},"103":{"position":[[296,2]]},"234":{"position":[[356,2]]}},"keywords":{}}],["210",{"_index":1484,"title":{},"content":{"244":{"position":[[317,3],[757,3],[929,3]]}},"keywords":{}}],["213",{"_index":6405,"title":{},"content":{"1292":{"position":[[349,3]]}},"keywords":{}}],["216",{"_index":6407,"title":{},"content":{"1292":{"position":[[366,3]]}},"keywords":{}}],["2187",{"_index":2440,"title":{},"content":{"400":{"position":[[118,4]]}},"keywords":{}}],["22",{"_index":2985,"title":{},"content":{"457":{"position":[[333,3]]},"1275":{"position":[[22,2]]},"1282":{"position":[[408,3]]}},"keywords":{}}],["22k",{"_index":2831,"title":{},"content":{"420":{"position":[[187,3]]}},"keywords":{}}],["23",{"_index":2449,"title":{},"content":{"401":{"position":[[227,2]]},"463":{"position":[[698,2]]}},"keywords":{}}],["230",{"_index":6409,"title":{},"content":{"1292":{"position":[[388,3]]}},"keywords":{}}],["24",{"_index":3751,"title":{},"content":{"653":{"position":[[527,2]]},"995":{"position":[[1407,2],[1874,3]]}},"keywords":{}}],["24.04",{"_index":6395,"title":{},"content":{"1292":{"position":[[81,5]]}},"keywords":{}}],["24/7",{"_index":2597,"title":{},"content":{"410":{"position":[[1217,5]]}},"keywords":{}}],["24/7.onlin",{"_index":2793,"title":{},"content":{"418":{"position":[[246,11]]}},"keywords":{}}],["25",{"_index":6168,"title":{},"content":{"1194":{"position":[[907,3]]},"1294":{"position":[[328,2],[780,3]]},"1296":{"position":[[311,3],[1377,4],[1528,2]]}},"keywords":{}}],["25.20443",{"_index":2300,"title":{},"content":{"393":{"position":[[1059,8]]}},"keywords":{}}],["25.61",{"_index":3081,"title":{},"content":{"467":{"position":[[164,5]]}},"keywords":{}}],["2505310082",{"_index":4424,"title":{},"content":{"749":{"position":[[23135,10]]}},"keywords":{}}],["256",{"_index":5401,"title":{},"content":{"968":{"position":[[53,5]]}},"keywords":{}}],["26.8",{"_index":3033,"title":{},"content":{"463":{"position":[[716,4]]}},"keywords":{}}],["260",{"_index":1468,"title":{},"content":{"243":{"position":[[682,3]]},"244":{"position":[[161,3],[418,3],[600,3],[1056,3],[1632,3]]}},"keywords":{}}],["2616",{"_index":3634,"title":{},"content":{"617":{"position":[[441,4]]}},"keywords":{}}],["2624555824",{"_index":4182,"title":{},"content":{"749":{"position":[[3787,10]]}},"keywords":{}}],["279",{"_index":2457,"title":{},"content":{"401":{"position":[[314,3]]}},"keywords":{}}],["28",{"_index":6451,"title":{},"content":{"1295":{"position":[[957,3]]}},"keywords":{}}],["28,400",{"_index":3028,"title":{},"content":{"462":{"position":[[644,6]]}},"keywords":{}}],["280",{"_index":3071,"title":{},"content":{"466":{"position":[[172,3]]}},"keywords":{}}],["2900",{"_index":1529,"title":{},"content":{"244":{"position":[[1595,4]]}},"keywords":{}}],["29857",{"_index":1835,"title":{},"content":{"303":{"position":[[688,6],[916,6]]},"361":{"position":[[685,6],[913,6]]}},"keywords":{}}],["2k",{"_index":6161,"title":{},"content":{"1192":{"position":[[782,2]]}},"keywords":{}}],["2x",{"_index":6225,"title":{},"content":{"1209":{"position":[[201,2]]}},"keywords":{}}],["3",{"_index":1308,"title":{"203":{"position":[[0,2]]},"250":{"position":[[0,2]]},"311":{"position":[[0,2]]},"476":{"position":[[0,2]]},"555":{"position":[[0,2]]},"561":{"position":[[5,2]]},"601":{"position":[[32,1]]}},"content":{"464":{"position":[[709,1]]},"580":{"position":[[242,1]]},"599":{"position":[[274,4]]},"662":{"position":[[2016,1]]},"717":{"position":[[1249,1]]},"724":{"position":[[1510,2]]},"734":{"position":[[558,1]]},"754":{"position":[[564,2]]},"825":{"position":[[500,1]]},"829":{"position":[[880,1]]},"838":{"position":[[2500,1]]},"854":{"position":[[474,1]]},"861":{"position":[[745,1],[1199,1]]},"862":{"position":[[483,1]]},"872":{"position":[[711,1]]},"875":{"position":[[1268,1]]},"898":{"position":[[1537,1]]},"904":{"position":[[1404,1]]},"1148":{"position":[[681,1]]},"1149":{"position":[[983,1]]},"1158":{"position":[[271,1]]}},"keywords":{}}],["3.0",{"_index":2961,"title":{},"content":{"452":{"position":[[641,3]]}},"keywords":{}}],["3.05",{"_index":6411,"title":{},"content":{"1292":{"position":[[716,4]]}},"keywords":{}}],["3.17",{"_index":3051,"title":{},"content":{"464":{"position":[[421,4]]}},"keywords":{}}],["3.38.0",{"_index":2982,"title":{},"content":{"457":{"position":[[317,6]]},"1282":{"position":[[392,6]]}},"keywords":{}}],["3.59",{"_index":3082,"title":{},"content":{"467":{"position":[[191,4]]}},"keywords":{}}],["3.6.19",{"_index":2975,"title":{},"content":{"455":{"position":[[569,7]]}},"keywords":{}}],["3.9",{"_index":2047,"title":{},"content":{"357":{"position":[[113,3]]}},"keywords":{}}],["30",{"_index":1259,"title":{},"content":{"188":{"position":[[1398,2]]},"244":{"position":[[565,2]]},"426":{"position":[[328,3]]},"816":{"position":[[359,2]]},"866":{"position":[[869,2],[894,2]]}},"keywords":{}}],["300",{"_index":4428,"title":{},"content":{"749":{"position":[[23390,3]]},"1138":{"position":[[615,3]]},"1271":{"position":[[426,3]]}},"keywords":{}}],["3000",{"_index":3595,"title":{},"content":{"612":{"position":[[1835,5]]},"1292":{"position":[[316,4],[670,4]]}},"keywords":{}}],["31",{"_index":3039,"title":{},"content":{"463":{"position":[[1290,2]]},"653":{"position":[[532,3]]}},"keywords":{}}],["32",{"_index":2287,"title":{},"content":{"392":{"position":[[5212,2]]},"1292":{"position":[[154,2]]}},"keywords":{}}],["320",{"_index":1510,"title":{},"content":{"244":{"position":[[1090,3],[1121,3]]}},"keywords":{}}],["33",{"_index":5725,"title":{},"content":{"1051":{"position":[[292,2]]}},"keywords":{}}],["33%.it",{"_index":6066,"title":{},"content":{"1143":{"position":[[327,6]]}},"keywords":{}}],["3359",{"_index":2469,"title":{},"content":{"401":{"position":[[496,4]]}},"keywords":{}}],["337",{"_index":2471,"title":{},"content":{"401":{"position":[[506,3],[543,3]]}},"keywords":{}}],["34",{"_index":2452,"title":{},"content":{"401":{"position":[[257,2]]}},"keywords":{}}],["341",{"_index":2451,"title":{},"content":{"401":{"position":[[249,3]]}},"keywords":{}}],["3499",{"_index":2473,"title":{},"content":{"401":{"position":[[533,4]]}},"keywords":{}}],["35",{"_index":3086,"title":{},"content":{"467":{"position":[[703,2]]},"1123":{"position":[[101,2],[234,2]]}},"keywords":{}}],["35m",{"_index":3084,"title":{},"content":{"467":{"position":[[225,5]]}},"keywords":{}}],["36",{"_index":4911,"title":{},"content":{"863":{"position":[[173,2]]}},"keywords":{}}],["36%.it",{"_index":6064,"title":{},"content":{"1143":{"position":[[188,6]]}},"keywords":{}}],["3600",{"_index":1523,"title":{},"content":{"244":{"position":[[1451,4]]}},"keywords":{}}],["37.12",{"_index":3074,"title":{},"content":{"466":{"position":[[245,5]]}},"keywords":{}}],["384",{"_index":2448,"title":{},"content":{"401":{"position":[[223,3],[253,3]]}},"keywords":{}}],["390",{"_index":1459,"title":{},"content":{"243":{"position":[[489,3]]},"244":{"position":[[961,3],[1662,3]]}},"keywords":{}}],["39976",{"_index":6418,"title":{},"content":{"1292":{"position":[[964,5]]}},"keywords":{}}],["3:45",{"_index":1071,"title":{},"content":{"118":{"position":[[379,4]]},"323":{"position":[[637,4]]}},"keywords":{}}],["3x",{"_index":6189,"title":{},"content":{"1206":{"position":[[472,3]]}},"keywords":{}}],["4",{"_index":1313,"title":{"204":{"position":[[0,2]]},"251":{"position":[[0,2]]},"312":{"position":[[0,2]]},"477":{"position":[[0,2]]},"563":{"position":[[5,2]]}},"content":{"392":{"position":[[3078,1]]},"461":{"position":[[30,1],[255,1],[713,1],[857,1]]},"463":{"position":[[972,1]]},"662":{"position":[[2264,1]]},"829":{"position":[[1868,1]]},"838":{"position":[[2782,1]]},"861":{"position":[[1546,1]]},"862":{"position":[[896,1]]},"872":{"position":[[1339,1]]},"875":{"position":[[2885,1]]},"898":{"position":[[2702,1]]},"904":{"position":[[3356,1]]},"918":{"position":[[153,2]]},"1148":{"position":[[1080,1]]},"1149":{"position":[[1235,1]]},"1158":{"position":[[541,1]]},"1194":{"position":[[856,1],[1025,1]]},"1317":{"position":[[774,1]]}},"keywords":{}}],["4).status("eq"",{"_index":339,"title":{},"content":{"19":{"position":[[728,25]]}},"keywords":{}}],["4.99",{"_index":3079,"title":{},"content":{"467":{"position":[[121,4]]}},"keywords":{}}],["409",{"_index":5348,"title":{},"content":{"948":{"position":[[102,3]]},"1044":{"position":[[81,3]]},"1305":{"position":[[1099,3]]},"1307":{"position":[[465,3]]}},"keywords":{}}],["42",{"_index":5989,"title":{},"content":{"1115":{"position":[[446,2],[486,4]]}},"keywords":{}}],["420",{"_index":3040,"title":{},"content":{"463":{"position":[[1396,3]]}},"keywords":{}}],["4215",{"_index":2476,"title":{},"content":{"401":{"position":[[576,4]]}},"keywords":{}}],["4222:4222",{"_index":4924,"title":{},"content":{"865":{"position":[[247,9]]}},"keywords":{}}],["426",{"_index":5064,"title":{},"content":{"876":{"position":[[560,3]]},"990":{"position":[[1098,3],[1340,3]]}},"keywords":{}}],["43",{"_index":6454,"title":{},"content":{"1295":{"position":[[1147,3]]}},"keywords":{}}],["431",{"_index":3015,"title":{},"content":{"461":{"position":[[373,3]]}},"keywords":{}}],["443",{"_index":5913,"title":{},"content":{"1090":{"position":[[1067,3]]},"1097":{"position":[[785,3]]},"1098":{"position":[[421,3]]},"1099":{"position":[[391,3]]},"1103":{"position":[[274,3]]}},"keywords":{}}],["46",{"_index":3032,"title":{},"content":{"463":{"position":[[678,2]]}},"keywords":{}}],["480",{"_index":1515,"title":{},"content":{"244":{"position":[[1249,3]]}},"keywords":{}}],["4:18",{"_index":2801,"title":{},"content":{"419":{"position":[[556,4]]}},"keywords":{}}],["4gb",{"_index":4579,"title":{},"content":{"773":{"position":[[689,3]]}},"keywords":{}}],["4k",{"_index":2556,"title":{},"content":{"408":{"position":[[3046,2]]}},"keywords":{}}],["4x",{"_index":6190,"title":{},"content":{"1206":{"position":[[476,2]]},"1209":{"position":[[439,2]]}},"keywords":{}}],["5",{"_index":1320,"title":{"205":{"position":[[0,2]]},"252":{"position":[[0,2]]},"313":{"position":[[0,2]]},"478":{"position":[[0,2]]},"564":{"position":[[5,2]]}},"content":{"298":{"position":[[629,1]]},"299":{"position":[[442,2],[1319,1]]},"392":{"position":[[5174,1]]},"396":{"position":[[963,1],[1056,1],[1156,1]]},"397":{"position":[[1508,1]]},"402":{"position":[[974,1]]},"408":{"position":[[370,3],[1236,1]]},"427":{"position":[[1520,1]]},"432":{"position":[[327,1]]},"461":{"position":[[809,1],[859,1]]},"523":{"position":[[544,2]]},"653":{"position":[[967,2],[973,1]]},"662":{"position":[[2568,1]]},"736":{"position":[[334,1],[366,1]]},"829":{"position":[[2238,1]]},"838":{"position":[[2862,1]]},"861":{"position":[[2191,1]]},"862":{"position":[[1084,1]]},"872":{"position":[[2097,1]]},"875":{"position":[[3549,1]]},"886":{"position":[[2005,2],[2956,2]]},"898":{"position":[[3119,1]]},"904":{"position":[[3537,1]]},"988":{"position":[[1063,1],[1088,1],[3005,2]]},"1058":{"position":[[361,2]]},"1074":{"position":[[605,1],[1517,2]]},"1157":{"position":[[162,1]]},"1158":{"position":[[636,1]]},"1311":{"position":[[1578,1]]}},"keywords":{}}],["5.79",{"_index":3069,"title":{},"content":{"466":{"position":[[134,4]]}},"keywords":{}}],["5.84",{"_index":3083,"title":{},"content":{"467":{"position":[[220,4]]}},"keywords":{}}],["50",{"_index":1724,"title":{},"content":{"298":{"position":[[647,2]]},"299":{"position":[[502,2],[1290,2]]},"459":{"position":[[570,2],[612,4]]},"696":{"position":[[1385,4]]},"698":{"position":[[2889,3],[2917,3]]},"752":{"position":[[1186,3]]},"767":{"position":[[384,2],[417,3]]},"798":{"position":[[659,3]]},"872":{"position":[[2597,2],[2622,2],[4613,2],[4638,2]]},"886":{"position":[[1764,2]]},"898":{"position":[[3477,3],[3890,2]]},"1066":{"position":[[465,3]]},"1134":{"position":[[781,2]]},"1164":{"position":[[297,3]]},"1194":{"position":[[547,2],[626,2]]},"1278":{"position":[[101,2],[139,2]]}},"keywords":{}}],["500",{"_index":4430,"title":{},"content":{"749":{"position":[[23522,3]]},"759":{"position":[[742,4]]},"760":{"position":[[738,4]]},"1194":{"position":[[360,3]]}},"keywords":{}}],["5000",{"_index":3710,"title":{},"content":{"632":{"position":[[2632,5]]}},"keywords":{}}],["500k",{"_index":604,"title":{},"content":{"38":{"position":[[1020,5]]}},"keywords":{}}],["500m",{"_index":2743,"title":{},"content":{"412":{"position":[[10673,5]]}},"keywords":{}}],["504",{"_index":3034,"title":{},"content":{"463":{"position":[[742,3]]}},"keywords":{}}],["50m",{"_index":2742,"title":{},"content":{"412":{"position":[[10635,4]]}},"keywords":{}}],["50mb",{"_index":2529,"title":{},"content":{"408":{"position":[[606,4],[1238,4]]}},"keywords":{}}],["53409",{"_index":1837,"title":{},"content":{"303":{"position":[[749,6],[962,6]]},"361":{"position":[[746,6],[959,6]]}},"keywords":{}}],["535",{"_index":3035,"title":{},"content":{"463":{"position":[[770,3]]}},"keywords":{}}],["53k",{"_index":2829,"title":{},"content":{"420":{"position":[[123,3]]}},"keywords":{}}],["54.79",{"_index":3080,"title":{},"content":{"467":{"position":[[143,5]]}},"keywords":{}}],["5400",{"_index":1521,"title":{},"content":{"244":{"position":[[1413,4]]}},"keywords":{}}],["562",{"_index":2477,"title":{},"content":{"401":{"position":[[586,3]]}},"keywords":{}}],["590",{"_index":1464,"title":{},"content":{"243":{"position":[[581,3],[781,3]]},"244":{"position":[[832,3],[870,3]]}},"keywords":{}}],["5mb",{"_index":2530,"title":{},"content":{"408":{"position":[[671,3]]},"451":{"position":[[403,3]]}},"keywords":{}}],["6",{"_index":757,"title":{"206":{"position":[[0,2]]},"253":{"position":[[0,2]]},"617":{"position":[[0,1]]}},"content":{"50":{"position":[[465,1]]},"303":{"position":[[776,1],[985,1]]},"361":{"position":[[773,1],[982,1]]},"662":{"position":[[2648,1]]},"829":{"position":[[2958,1]]},"838":{"position":[[2961,1]]},"845":{"position":[[127,1]]},"849":{"position":[[106,1],[576,1]]},"862":{"position":[[1543,1]]},"872":{"position":[[2888,1]]},"875":{"position":[[5963,1]]},"898":{"position":[[4461,1]]},"1058":{"position":[[481,2]]}},"keywords":{}}],["6*5=30",{"_index":4087,"title":{},"content":{"736":{"position":[[395,6]]}},"keywords":{}}],["6.3.x",{"_index":6037,"title":{},"content":{"1133":{"position":[[396,7]]}},"keywords":{}}],["6.34",{"_index":3077,"title":{},"content":{"467":{"position":[[88,4]]}},"keywords":{}}],["60",{"_index":1743,"title":{},"content":{"299":{"position":[[309,2]]},"571":{"position":[[1624,2]]},"653":{"position":[[517,2],[522,2],[806,3],[813,2],[962,2]]},"656":{"position":[[261,2]]},"696":{"position":[[1324,3]]},"846":{"position":[[734,3],[1160,3]]},"995":{"position":[[1864,2],[1869,2]]}},"keywords":{}}],["60000",{"_index":4830,"title":{},"content":{"846":{"position":[[1067,5]]}},"keywords":{}}],["620",{"_index":4566,"title":{},"content":{"772":{"position":[[856,4]]},"774":{"position":[[784,4]]}},"keywords":{}}],["62080c42d471e3d2625e49dcca3b8e3",{"_index":6149,"title":{},"content":{"1177":{"position":[[448,34]]}},"keywords":{}}],["6265",{"_index":3013,"title":{},"content":{"461":{"position":[[50,5]]}},"keywords":{}}],["64",{"_index":115,"title":{},"content":{"8":{"position":[[480,2],[528,3]]}},"keywords":{}}],["67",{"_index":6406,"title":{},"content":{"1292":{"position":[[360,2]]}},"keywords":{}}],["68",{"_index":6404,"title":{},"content":{"1292":{"position":[[343,2]]}},"keywords":{}}],["7",{"_index":1333,"title":{"207":{"position":[[0,2]]},"254":{"position":[[0,2]]}},"content":{"394":{"position":[[1725,1]]},"412":{"position":[[7948,2]]},"662":{"position":[[2747,1]]},"697":{"position":[[193,1]]},"872":{"position":[[3584,1]]},"875":{"position":[[6495,1]]}},"keywords":{}}],["7.1.x",{"_index":6036,"title":{},"content":{"1133":{"position":[[387,5]]}},"keywords":{}}],["70",{"_index":1533,"title":{},"content":{"244":{"position":[[1702,2]]}},"keywords":{}}],["700",{"_index":2327,"title":{},"content":{"394":{"position":[[1634,3]]}},"keywords":{}}],["71",{"_index":6408,"title":{},"content":{"1292":{"position":[[382,2]]}},"keywords":{}}],["720",{"_index":1517,"title":{},"content":{"244":{"position":[[1288,3]]},"1133":{"position":[[582,3]]},"1134":{"position":[[405,4],[425,4]]}},"keywords":{}}],["72773",{"_index":6420,"title":{},"content":{"1292":{"position":[[985,5]]}},"keywords":{}}],["730",{"_index":6041,"title":{},"content":{"1133":{"position":[[612,4],[665,4]]}},"keywords":{}}],["73103",{"_index":6417,"title":{},"content":{"1292":{"position":[[956,5]]}},"keywords":{}}],["765",{"_index":2435,"title":{},"content":{"400":{"position":[[67,3]]}},"keywords":{}}],["768",{"_index":2456,"title":{},"content":{"401":{"position":[[310,3],[357,3],[404,3],[453,3]]}},"keywords":{}}],["8",{"_index":5047,"title":{},"content":{"875":{"position":[[7740,1]]}},"keywords":{}}],["8.0.0",{"_index":4279,"title":{},"content":{"749":{"position":[[10991,5],[11129,5]]},"793":{"position":[[1471,5]]}},"keywords":{}}],["8.1.4",{"_index":3635,"title":{},"content":{"617":{"position":[[456,6]]}},"keywords":{}}],["80",{"_index":1741,"title":{},"content":{"299":{"position":[[260,4],[767,3],[1124,3]]},"408":{"position":[[990,4]]},"461":{"position":[[1187,3]]},"875":{"position":[[1259,4]]}},"keywords":{}}],["8080",{"_index":4963,"title":{},"content":{"872":{"position":[[3330,5]]},"906":{"position":[[1033,4]]},"1219":{"position":[[560,5],[723,5]]},"1220":{"position":[[239,5]]}},"keywords":{}}],["8100",{"_index":1508,"title":{},"content":{"244":{"position":[[993,4]]}},"keywords":{}}],["88",{"_index":2439,"title":{},"content":{"400":{"position":[[115,2],[583,2]]}},"keywords":{}}],["8gb",{"_index":4580,"title":{},"content":{"773":{"position":[[860,3]]}},"keywords":{}}],["9",{"_index":4643,"title":{},"content":{"796":{"position":[[898,4]]},"863":{"position":[[65,2]]},"875":{"position":[[8515,1]]},"935":{"position":[[244,5]]},"1084":{"position":[[369,3]]},"1295":{"position":[[1048,1]]}},"keywords":{}}],["9.0.0",{"_index":4629,"title":{},"content":{"793":{"position":[[1465,5]]}},"keywords":{}}],["90",{"_index":1488,"title":{},"content":{"244":{"position":[[383,2],[639,2]]}},"keywords":{}}],["91882",{"_index":6422,"title":{},"content":{"1292":{"position":[[1011,5]]}},"keywords":{}}],["934",{"_index":2438,"title":{},"content":{"400":{"position":[[99,3]]}},"keywords":{}}],["938.9",{"_index":2971,"title":{},"content":{"454":{"position":[[687,5]]}},"keywords":{}}],["999",{"_index":3789,"title":{},"content":{"661":{"position":[[386,4]]}},"keywords":{}}],["9:47",{"_index":4900,"title":{},"content":{"861":{"position":[[1167,4]]}},"keywords":{}}],["9_]*]?[a",{"_index":5850,"title":{},"content":{"1084":{"position":[[354,8]]}},"keywords":{}}],["9dcca3b8e1a",{"_index":6492,"title":{},"content":{"1305":{"position":[[551,11]]}},"keywords":{}}],["_",{"_index":2396,"title":{},"content":{"398":{"position":[[879,3],[2165,3]]},"749":{"position":[[4933,1],[8287,1],[17589,1]]},"811":{"position":[[114,1]]},"863":{"position":[[83,1]]}},"keywords":{}}],["__dirnam",{"_index":6310,"title":{},"content":{"1266":{"position":[[288,10]]}},"keywords":{}}],["_attach",{"_index":4482,"title":{},"content":{"754":{"position":[[305,12],[439,12]]},"1004":{"position":[[294,12]]},"1051":{"position":[[574,13]]},"1177":{"position":[[421,13]]}},"keywords":{}}],["_delet",{"_index":3887,"title":{},"content":{"684":{"position":[[60,8],[200,9]]},"855":{"position":[[189,8]]},"857":{"position":[[129,8],[387,9]]},"861":{"position":[[1764,8]]},"867":{"position":[[184,8]]},"898":{"position":[[1872,8],[3995,10]]},"986":{"position":[[376,8],[1410,9]]},"988":{"position":[[1818,11],[1908,11],[3143,10],[5437,9]]},"1048":{"position":[[377,8],[493,9]]},"1051":{"position":[[557,9]]},"1107":{"position":[[36,8],[273,8],[454,9]]},"1177":{"position":[[404,9]]}},"keywords":{}}],["_deleted:tru",{"_index":5710,"title":{},"content":{"1047":{"position":[[116,13]]}},"keywords":{}}],["_deleted=fals",{"_index":5966,"title":{},"content":{"1107":{"position":[[128,15]]}},"keywords":{}}],["_id",{"_index":4223,"title":{},"content":{"749":{"position":[[6864,4],[7228,4],[23786,3],[23879,4]]}},"keywords":{}}],["_meta",{"_index":6150,"title":{},"content":{"1177":{"position":[[483,6]]}},"keywords":{}}],["_modifi",{"_index":5204,"title":{},"content":{"898":{"position":[[1229,9],[1921,9],[3965,12]]}},"keywords":{}}],["_modified)y",{"_index":5195,"title":{},"content":{"898":{"position":[[342,13]]}},"keywords":{}}],["_rev",{"_index":4365,"title":{},"content":{"749":{"position":[[17675,6]]},"1051":{"position":[[597,5]]},"1177":{"position":[[439,5]]}},"keywords":{}}],["a.id",{"_index":5101,"title":{},"content":{"885":{"position":[[1862,5],[1892,5]]}},"keywords":{}}],["a.updatedat",{"_index":5099,"title":{},"content":{"885":{"position":[[1738,12],[1782,12],[1827,12]]}},"keywords":{}}],["aaah",{"_index":4600,"title":{},"content":{"789":{"position":[[260,9],[313,8]]},"791":{"position":[[116,9],[209,8]]},"792":{"position":[[247,9],[457,8]]}},"keywords":{}}],["abcd",{"_index":5126,"title":{},"content":{"886":{"position":[[1871,9],[3168,9],[4136,9]]}},"keywords":{}}],["abil",{"_index":542,"title":{},"content":{"34":{"position":[[593,7]]},"173":{"position":[[1214,7]]},"174":{"position":[[2396,7]]},"190":{"position":[[41,7]]},"207":{"position":[[37,7]]},"265":{"position":[[79,7]]},"267":{"position":[[514,7],[1290,7]]},"280":{"position":[[65,7]]},"371":{"position":[[210,7]]},"385":{"position":[[35,7]]},"407":{"position":[[1018,7]]},"411":{"position":[[2781,7]]},"445":{"position":[[469,7]]},"446":{"position":[[1204,7]]},"506":{"position":[[29,7]]},"624":{"position":[[708,7]]},"837":{"position":[[137,7]]}},"keywords":{}}],["abov",{"_index":3564,"title":{},"content":{"610":{"position":[[1490,6]]},"703":{"position":[[897,5]]},"704":{"position":[[421,6]]},"826":{"position":[[487,5]]},"875":{"position":[[6963,5]]},"886":{"position":[[1201,5],[2833,5]]},"950":{"position":[[403,5]]},"987":{"position":[[251,6]]},"1091":{"position":[[26,5]]},"1316":{"position":[[2663,6]]}},"keywords":{}}],["absent",{"_index":2922,"title":{},"content":{"438":{"position":[[32,6]]}},"keywords":{}}],["absolut",{"_index":6099,"title":{},"content":{"1157":{"position":[[508,8]]}},"keywords":{}}],["abstract",{"_index":41,"title":{},"content":{"2":{"position":[[52,8]]},"24":{"position":[[583,10]]},"27":{"position":[[147,8]]},"35":{"position":[[111,9]]},"43":{"position":[[411,11]]},"331":{"position":[[276,11]]},"433":{"position":[[542,11]]},"521":{"position":[[426,9]]},"536":{"position":[[51,9]]},"596":{"position":[[49,9]]},"703":{"position":[[632,13],[817,11]]},"709":{"position":[[746,13],[1109,11]]},"962":{"position":[[89,11]]}},"keywords":{}}],["absurd",{"_index":495,"title":{"31":{"position":[[0,6]]}},"content":{"31":{"position":[[1,6]]},"1302":{"position":[[91,6]]}},"keywords":{}}],["accelar",{"_index":2571,"title":{},"content":{"408":{"position":[[5209,11]]}},"keywords":{}}],["accept",{"_index":1993,"title":{},"content":{"351":{"position":[[156,6]]},"382":{"position":[[197,10]]},"398":{"position":[[323,10]]},"412":{"position":[[2646,9],[6042,10]]},"432":{"position":[[719,11]]},"461":{"position":[[309,6]]},"829":{"position":[[3131,7]]},"875":{"position":[[6300,9]]},"880":{"position":[[89,6],[310,8]]},"918":{"position":[[29,7]]},"988":{"position":[[2595,9]]},"1048":{"position":[[358,6]]},"1102":{"position":[[568,9]]}},"keywords":{}}],["access",{"_index":87,"title":{"88":{"position":[[16,11]]},"97":{"position":[[28,10]]},"215":{"position":[[8,14]]},"365":{"position":[[12,6]]},"826":{"position":[[0,9]]},"1215":{"position":[[31,6]]}},"content":{"6":{"position":[[206,6]]},"11":{"position":[[309,9]]},"46":{"position":[[276,6]]},"65":{"position":[[268,6],[437,7],[532,10],[1168,6],[1907,7]]},"84":{"position":[[187,6]]},"87":{"position":[[92,8]]},"88":{"position":[[48,14],[118,6]]},"97":{"position":[[68,10],[185,14]]},"114":{"position":[[200,6]]},"131":{"position":[[430,6],[506,6]]},"149":{"position":[[200,6]]},"152":{"position":[[90,6]]},"159":{"position":[[337,6]]},"166":{"position":[[227,8]]},"173":{"position":[[697,8],[1379,11],[1431,10],[1536,6],[2730,10],[2939,10]]},"175":{"position":[[193,6]]},"183":{"position":[[293,6]]},"188":{"position":[[1840,6]]},"191":{"position":[[56,8]]},"195":{"position":[[193,7]]},"215":{"position":[[74,14]]},"216":{"position":[[86,8]]},"237":{"position":[[159,6]]},"241":{"position":[[499,14]]},"265":{"position":[[435,6],[811,6]]},"266":{"position":[[209,10]]},"274":{"position":[[212,6]]},"287":{"position":[[1025,6]]},"289":{"position":[[1363,6]]},"292":{"position":[[186,10]]},"303":{"position":[[1478,8]]},"310":{"position":[[175,6]]},"333":{"position":[[226,6]]},"336":{"position":[[275,6]]},"347":{"position":[[200,6]]},"362":{"position":[[1271,6]]},"365":{"position":[[87,6],[1194,13],[1365,13]]},"369":{"position":[[913,6],[1178,7],[1506,6]]},"373":{"position":[[514,14]]},"376":{"position":[[258,8]]},"377":{"position":[[124,7]]},"408":{"position":[[1591,6],[3796,6]]},"410":{"position":[[1417,6]]},"411":{"position":[[459,7]]},"412":{"position":[[12064,6],[12850,6]]},"417":{"position":[[98,7]]},"419":{"position":[[404,7]]},"429":{"position":[[291,9]]},"433":{"position":[[83,6],[199,6],[332,10]]},"444":{"position":[[556,7]]},"445":{"position":[[548,6]]},"450":{"position":[[505,6]]},"453":{"position":[[372,6]]},"454":{"position":[[790,6],[1032,6]]},"460":{"position":[[981,6]]},"470":{"position":[[197,6]]},"482":{"position":[[1210,6]]},"500":{"position":[[655,6]]},"502":{"position":[[475,6]]},"511":{"position":[[200,6]]},"526":{"position":[[191,7]]},"531":{"position":[[200,6]]},"550":{"position":[[73,6]]},"560":{"position":[[394,7]]},"581":{"position":[[281,6]]},"586":{"position":[[167,7]]},"591":{"position":[[200,6]]},"630":{"position":[[1003,10]]},"659":{"position":[[807,6]]},"674":{"position":[[130,8]]},"676":{"position":[[192,6]]},"709":{"position":[[84,6]]},"714":{"position":[[121,6]]},"715":{"position":[[350,6]]},"737":{"position":[[150,7]]},"740":{"position":[[370,6]]},"749":{"position":[[9366,7]]},"784":{"position":[[659,6]]},"829":{"position":[[1870,9],[2203,6]]},"832":{"position":[[187,6]]},"835":{"position":[[130,6],[912,6]]},"836":{"position":[[1634,6]]},"860":{"position":[[961,6]]},"861":{"position":[[2282,6]]},"872":{"position":[[218,6]]},"886":{"position":[[1372,6]]},"912":{"position":[[384,6]]},"968":{"position":[[783,6]]},"1018":{"position":[[113,6],[394,9],[667,6]]},"1040":{"position":[[81,6]]},"1084":{"position":[[658,9]]},"1088":{"position":[[687,10]]},"1102":{"position":[[46,6],[235,6]]},"1105":{"position":[[1242,6]]},"1116":{"position":[[256,9]]},"1117":{"position":[[224,9]]},"1118":{"position":[[42,6],[304,6]]},"1132":{"position":[[831,6]]},"1134":{"position":[[722,6]]},"1151":{"position":[[743,6]]},"1157":{"position":[[216,7]]},"1177":{"position":[[32,6]]},"1178":{"position":[[742,6]]},"1204":{"position":[[32,6]]},"1206":{"position":[[340,7]]},"1207":{"position":[[496,6]]},"1208":{"position":[[639,6]]},"1209":{"position":[[63,6]]},"1211":{"position":[[202,6]]},"1214":{"position":[[58,10],[628,6],[1032,6]]},"1215":{"position":[[76,6],[147,6],[167,6],[686,7]]},"1219":{"position":[[160,6]]},"1222":{"position":[[911,6]]},"1233":{"position":[[211,8]]},"1235":{"position":[[195,6],[330,6],[441,7]]},"1244":{"position":[[48,6]]},"1272":{"position":[[62,6]]},"1281":{"position":[[16,6]]},"1311":{"position":[[1587,6]]}},"keywords":{}}],["access.r",{"_index":3477,"title":{},"content":{"574":{"position":[[263,11]]}},"keywords":{}}],["accesshandl",{"_index":3011,"title":{},"content":{"460":{"position":[[1278,12]]},"1208":{"position":[[1056,12]]}},"keywords":{}}],["accesshandle.clos",{"_index":6224,"title":{},"content":{"1208":{"position":[[1912,21]]}},"keywords":{}}],["accesshandle.flush",{"_index":6223,"title":{},"content":{"1208":{"position":[[1797,21]]}},"keywords":{}}],["accesshandle.gets",{"_index":6222,"title":{},"content":{"1208":{"position":[[1739,23]]}},"keywords":{}}],["accesshandle.read(readbuff",{"_index":6214,"title":{},"content":{"1208":{"position":[[1367,29]]}},"keywords":{}}],["accesshandle.truncate(10",{"_index":6220,"title":{},"content":{"1208":{"position":[[1656,26]]}},"keywords":{}}],["accesshandle.write(writebuff",{"_index":6210,"title":{},"content":{"1208":{"position":[[1228,32],[1569,31]]}},"keywords":{}}],["accident",{"_index":3859,"title":{},"content":{"675":{"position":[[104,12]]},"761":{"position":[[64,12]]},"828":{"position":[[447,10]]},"881":{"position":[[303,12]]},"987":{"position":[[903,12]]},"1083":{"position":[[228,12]]},"1085":{"position":[[2061,10],[2285,12]]},"1107":{"position":[[1026,12]]}},"keywords":{}}],["accommod",{"_index":1668,"title":{},"content":{"287":{"position":[[106,11]]},"356":{"position":[[4,11]]},"362":{"position":[[62,11]]},"364":{"position":[[510,11]]},"369":{"position":[[816,11]]},"519":{"position":[[74,12]]}},"keywords":{}}],["accomplish",{"_index":1702,"title":{},"content":{"298":{"position":[[86,12]]}},"keywords":{}}],["accord",{"_index":1638,"title":{},"content":{"276":{"position":[[330,9]]},"612":{"position":[[1531,9]]},"641":{"position":[[77,9]]},"818":{"position":[[60,9]]},"861":{"position":[[2419,9]]},"1209":{"position":[[144,9]]}},"keywords":{}}],["accordingli",{"_index":1111,"title":{},"content":{"131":{"position":[[1005,12]]},"136":{"position":[[255,12]]},"390":{"position":[[1755,12]]},"397":{"position":[[1387,11]]},"403":{"position":[[376,12]]},"611":{"position":[[1064,12]]},"634":{"position":[[573,12]]},"685":{"position":[[426,12]]},"781":{"position":[[534,12]]},"880":{"position":[[263,11]]},"956":{"position":[[224,12]]},"1004":{"position":[[650,12]]}},"keywords":{}}],["account",{"_index":2708,"title":{},"content":{"412":{"position":[[6237,7]]},"416":{"position":[[282,7]]},"626":{"position":[[357,7],[1089,8]]},"698":{"position":[[2599,10]]},"1009":{"position":[[383,8]]},"1316":{"position":[[2200,8]]}},"keywords":{}}],["accur",{"_index":3108,"title":{},"content":{"476":{"position":[[331,9]]},"490":{"position":[[665,8]]}},"keywords":{}}],["accuraci",{"_index":2423,"title":{},"content":{"398":{"position":[[3168,9]]}},"keywords":{}}],["achiev",{"_index":419,"title":{},"content":{"25":{"position":[[222,7]]},"40":{"position":[[409,7]]},"81":{"position":[[27,8]]},"157":{"position":[[131,8]]},"166":{"position":[[42,7]]},"190":{"position":[[164,9]]},"265":{"position":[[403,7]]},"392":{"position":[[1306,7],[2348,7]]},"399":{"position":[[638,11]]},"527":{"position":[[36,9]]},"540":{"position":[[121,9]]},"613":{"position":[[603,8]]},"644":{"position":[[460,7]]},"698":{"position":[[2281,7]]},"709":{"position":[[221,8]]},"848":{"position":[[100,7]]},"858":{"position":[[100,7]]},"1147":{"position":[[107,7]]},"1177":{"position":[[189,7]]},"1204":{"position":[[190,7]]},"1298":{"position":[[87,9]]}},"keywords":{}}],["acid",{"_index":2030,"title":{},"content":{"354":{"position":[[1285,4]]},"412":{"position":[[13602,4]]},"1304":{"position":[[42,4],[151,4],[441,4],[1209,4]]}},"keywords":{}}],["acquisit",{"_index":4802,"title":{},"content":{"839":{"position":[[1033,12]]}},"keywords":{}}],["act",{"_index":2593,"title":{},"content":{"410":{"position":[[884,4]]}},"keywords":{}}],["action",{"_index":1127,"title":{},"content":{"140":{"position":[[199,8]]},"347":{"position":[[493,6]]},"362":{"position":[[1564,6]]},"411":{"position":[[2912,7]]},"412":{"position":[[8605,7]]},"486":{"position":[[62,7]]},"489":{"position":[[363,6]]},"497":{"position":[[593,6],[773,8]]},"514":{"position":[[202,7]]},"569":{"position":[[812,6]]},"571":{"position":[[377,7]]},"591":{"position":[[648,6]]},"618":{"position":[[721,6]]},"630":{"position":[[42,6],[532,7],[1033,8]]},"634":{"position":[[211,6]]},"765":{"position":[[220,6]]},"782":{"position":[[289,7]]},"783":{"position":[[80,6],[609,7]]}},"keywords":{}}],["action.compar",{"_index":2177,"title":{},"content":{"388":{"position":[[119,14]]}},"keywords":{}}],["action—lead",{"_index":3113,"title":{},"content":{"477":{"position":[[318,14]]}},"keywords":{}}],["activ",{"_index":447,"title":{"1013":{"position":[[0,8]]}},"content":{"27":{"position":[[419,6]]},"28":{"position":[[572,6]]},"88":{"position":[[80,6]]},"292":{"position":[[280,6]]},"386":{"position":[[255,6]]},"387":{"position":[[261,6]]},"408":{"position":[[3327,6]]},"617":{"position":[[799,6]]},"630":{"position":[[385,8]]},"684":{"position":[[146,10]]},"749":{"position":[[14395,10],[22782,10]]},"835":{"position":[[754,8]]},"849":{"position":[[108,6],[578,6]]},"1013":{"position":[[232,8],[404,8],[556,8]]},"1080":{"position":[[388,7],[735,8],[907,10],[996,8]]},"1215":{"position":[[324,8],[652,8]]}},"keywords":{}}],["activerepl",{"_index":5565,"title":{},"content":{"1007":{"position":[[1161,18]]}},"keywords":{}}],["activereplications[chunkid",{"_index":5567,"title":{},"content":{"1007":{"position":[[1265,29],[1745,27],[1854,28],[1915,28]]}},"keywords":{}}],["actual",{"_index":661,"title":{"420":{"position":[[10,8]]}},"content":{"42":{"position":[[263,8]]},"251":{"position":[[178,8]]},"261":{"position":[[1183,6]]},"412":{"position":[[2163,6]]},"486":{"position":[[86,6]]},"617":{"position":[[1481,8]]},"719":{"position":[[431,6],[488,6]]},"875":{"position":[[9265,6]]},"962":{"position":[[160,8]]},"987":{"position":[[374,6],[466,6]]},"1097":{"position":[[308,8]]},"1104":{"position":[[156,6]]},"1105":{"position":[[165,6]]},"1115":{"position":[[895,8]]},"1304":{"position":[[397,8]]},"1308":{"position":[[464,6]]}},"keywords":{}}],["ad",{"_index":569,"title":{"667":{"position":[[0,6]]},"796":{"position":[[26,6]]},"825":{"position":[[0,6]]}},"content":{"36":{"position":[[72,5]]},"144":{"position":[[15,6]]},"291":{"position":[[45,6]]},"335":{"position":[[563,6],[912,5]]},"375":{"position":[[226,6]]},"399":{"position":[[78,6]]},"411":{"position":[[3781,5],[5699,6]]},"415":{"position":[[312,6]]},"419":{"position":[[1099,6]]},"421":{"position":[[234,5]]},"432":{"position":[[998,5]]},"452":{"position":[[476,5]]},"454":{"position":[[106,5]]},"560":{"position":[[668,6]]},"621":{"position":[[777,5]]},"639":{"position":[[238,6]]},"685":{"position":[[518,6]]},"705":{"position":[[1323,6]]},"723":{"position":[[1495,5]]},"729":{"position":[[235,5]]},"749":{"position":[[1443,5],[6634,5],[14593,5]]},"754":{"position":[[85,5]]},"796":{"position":[[303,6],[596,6],[1006,6]]},"806":{"position":[[290,6]]},"921":{"position":[[117,5]]},"943":{"position":[[314,5]]},"955":{"position":[[250,5]]},"979":{"position":[[41,5]]},"1004":{"position":[[221,5],[627,5]]},"1008":{"position":[[4,5]]},"1072":{"position":[[1591,5]]},"1074":{"position":[[630,6]]},"1085":{"position":[[2955,5]]},"1092":{"position":[[564,6]]},"1095":{"position":[[223,6]]},"1097":{"position":[[220,6],[836,6]]},"1100":{"position":[[293,5],[330,5]]},"1101":{"position":[[241,5]]},"1103":{"position":[[27,6]]},"1112":{"position":[[412,5]]},"1202":{"position":[[274,5]]},"1296":{"position":[[615,5]]},"1301":{"position":[[1080,5]]},"1318":{"position":[[456,5]]}},"keywords":{}}],["adapt",{"_index":1,"title":{"0":{"position":[[8,8]]},"822":{"position":[[34,8]]},"1173":{"position":[[0,9]]},"1203":{"position":[[0,9]]}},"content":{"1":{"position":[[44,8],[198,7],[440,7],[494,7]]},"2":{"position":[[28,8],[88,8],[151,7],[206,7],[239,8]]},"3":{"position":[[15,7],[129,7],[180,7]]},"4":{"position":[[37,7],[219,8],[262,8],[295,7],[352,7]]},"5":{"position":[[6,7],[141,7],[211,7],[265,7]]},"6":{"position":[[6,7],[136,9],[151,7],[310,7],[365,7],[398,8]]},"7":{"position":[[6,7],[233,7],[292,7],[435,7],[631,7]]},"8":{"position":[[84,8],[173,7],[249,7],[925,7],[1068,7],[1217,7]]},"9":{"position":[[76,7],[145,7],[205,7],[360,7]]},"10":{"position":[[13,7],[74,7],[139,7],[172,8]]},"11":{"position":[[112,7],[174,7],[992,7]]},"16":{"position":[[298,8]]},"24":{"position":[[95,7],[185,8]]},"28":{"position":[[271,9]]},"32":{"position":[[194,8]]},"39":{"position":[[643,8]]},"40":{"position":[[661,8]]},"42":{"position":[[246,8]]},"47":{"position":[[1292,8]]},"72":{"position":[[118,9]]},"83":{"position":[[92,13]]},"174":{"position":[[2256,5]]},"188":{"position":[[333,7],[1110,8]]},"202":{"position":[[412,5]]},"207":{"position":[[245,6]]},"212":{"position":[[422,5]]},"254":{"position":[[429,8]]},"255":{"position":[[1746,5]]},"266":{"position":[[40,8],[86,8],[390,7]]},"383":{"position":[[315,9]]},"384":{"position":[[244,8]]},"390":{"position":[[1747,7]]},"454":{"position":[[1006,8]]},"500":{"position":[[742,8]]},"520":{"position":[[394,7]]},"554":{"position":[[432,8]]},"563":{"position":[[825,7]]},"567":{"position":[[247,9]]},"640":{"position":[[64,7],[468,5]]},"703":{"position":[[414,7]]},"749":{"position":[[603,7],[4770,7],[5619,7]]},"772":{"position":[[1936,8],[2465,8]]},"837":{"position":[[961,7],[1064,7],[1114,7],[1135,8],[1170,7],[1246,8],[1286,7],[1341,7],[1607,7],[1754,7],[2130,8]]},"872":{"position":[[3291,8]]},"961":{"position":[[249,7]]},"966":{"position":[[89,8]]},"1097":{"position":[[204,8],[417,7],[746,8]]},"1098":{"position":[[33,7],[300,7],[382,8]]},"1099":{"position":[[33,7],[278,7],[356,8]]},"1147":{"position":[[492,12]]},"1172":{"position":[[187,8],[278,10],[372,8],[543,7]]},"1173":{"position":[[20,8],[97,8],[197,8],[282,8]]},"1175":{"position":[[159,8]]},"1198":{"position":[[260,7]]},"1199":{"position":[[117,8]]},"1201":{"position":[[148,7]]},"1203":{"position":[[18,8]]},"1271":{"position":[[842,7],[1353,7]]},"1284":{"position":[[365,7],[386,7]]},"1300":{"position":[[396,7]]}},"keywords":{}}],["adapter.j",{"_index":4578,"title":{},"content":{"772":{"position":[[2241,13]]}},"keywords":{}}],["adapterabsurd",{"_index":6466,"title":{},"content":{"1299":{"position":[[520,13]]}},"keywords":{}}],["adapteror",{"_index":4779,"title":{},"content":{"837":{"position":[[1092,9]]}},"keywords":{}}],["adapterth",{"_index":3968,"title":{},"content":{"703":{"position":[[395,10]]}},"keywords":{}}],["add",{"_index":111,"title":{"738":{"position":[[0,3]]},"789":{"position":[[0,3]]},"791":{"position":[[0,3]]},"915":{"position":[[0,3]]},"1012":{"position":[[0,3]]}},"content":{"8":{"position":[[394,3]]},"33":{"position":[[192,4]]},"51":{"position":[[807,3]]},"155":{"position":[[214,4]]},"188":{"position":[[1873,3]]},"211":{"position":[[290,3]]},"313":{"position":[[168,3]]},"315":{"position":[[23,3]]},"346":{"position":[[807,3]]},"351":{"position":[[104,3],[259,3]]},"383":{"position":[[81,3]]},"392":{"position":[[431,3]]},"411":{"position":[[4338,4]]},"412":{"position":[[4130,4],[9883,3],[11078,3],[13098,4]]},"455":{"position":[[673,3]]},"463":{"position":[[1274,4]]},"476":{"position":[[85,3]]},"480":{"position":[[58,3],[451,3]]},"536":{"position":[[88,4]]},"538":{"position":[[830,3]]},"563":{"position":[[1069,3]]},"570":{"position":[[460,5]]},"576":{"position":[[81,4]]},"596":{"position":[[86,4]]},"598":{"position":[[837,3]]},"611":{"position":[[1175,3]]},"616":{"position":[[1055,4]]},"662":{"position":[[1344,3],[2266,3]]},"668":{"position":[[229,3]]},"676":{"position":[[68,3]]},"680":{"position":[[50,3],[416,3],[1116,3]]},"689":{"position":[[550,3]]},"696":{"position":[[1733,3]]},"702":{"position":[[92,3]]},"717":{"position":[[1352,3]]},"724":{"position":[[133,3]]},"729":{"position":[[291,3]]},"731":{"position":[[51,3]]},"732":{"position":[[17,3]]},"738":{"position":[[44,3]]},"751":{"position":[[149,3]]},"753":{"position":[[137,3]]},"770":{"position":[[142,4],[165,3],[228,3],[614,3]]},"772":{"position":[[306,4],[422,3],[907,3]]},"789":{"position":[[4,3]]},"796":{"position":[[126,3],[561,3],[969,3],[1400,3]]},"811":{"position":[[89,3]]},"818":{"position":[[413,3]]},"825":{"position":[[472,3]]},"838":{"position":[[2502,3]]},"846":{"position":[[470,3]]},"848":{"position":[[41,3],[154,3],[435,3],[799,3],[1434,3]]},"861":{"position":[[1201,3],[1548,3]]},"872":{"position":[[1787,3]]},"875":{"position":[[533,3],[574,3],[1165,3],[2932,3],[6033,3]]},"876":{"position":[[420,3]]},"898":{"position":[[1390,3],[1488,3],[1617,3],[3699,3]]},"910":{"position":[[350,3]]},"915":{"position":[[40,3]]},"917":{"position":[[1,4]]},"952":{"position":[[145,3]]},"956":{"position":[[20,3]]},"971":{"position":[[257,3]]},"990":{"position":[[546,3]]},"1010":{"position":[[230,3]]},"1012":{"position":[[44,3]]},"1022":{"position":[[714,3]]},"1023":{"position":[[365,3]]},"1041":{"position":[[124,3]]},"1059":{"position":[[102,3]]},"1064":{"position":[[78,3]]},"1079":{"position":[[617,3]]},"1081":{"position":[[51,3]]},"1085":{"position":[[2184,3]]},"1090":{"position":[[260,3]]},"1092":{"position":[[528,3]]},"1095":{"position":[[279,3]]},"1097":{"position":[[796,3]]},"1100":{"position":[[32,3],[365,3]]},"1107":{"position":[[392,3]]},"1112":{"position":[[483,3]]},"1114":{"position":[[219,3],[573,3]]},"1118":{"position":[[253,3]]},"1119":{"position":[[303,3]]},"1124":{"position":[[671,3]]},"1149":{"position":[[985,3]]},"1158":{"position":[[273,3]]},"1198":{"position":[[1879,3],[2312,3]]},"1202":{"position":[[330,3]]},"1222":{"position":[[430,3]]},"1252":{"position":[[139,3],[193,3]]},"1271":{"position":[[813,3]]},"1280":{"position":[[1,3],[61,3],[113,3]]},"1289":{"position":[[42,3],[94,3]]},"1296":{"position":[[764,3]]},"1311":{"position":[[1091,3]]},"1318":{"position":[[600,3]]}},"keywords":{}}],["addcollect",{"_index":5318,"title":{},"content":{"934":{"position":[[78,17]]},"958":{"position":[[212,16]]},"987":{"position":[[1070,16]]},"1085":{"position":[[2819,17]]},"1309":{"position":[[1347,17]]}},"keywords":{}}],["addeventlistener("storage"",{"_index":2907,"title":{},"content":{"432":{"position":[[878,37]]},"458":{"position":[[820,37]]}},"keywords":{}}],["addfulltextsearch",{"_index":4049,"title":{},"content":{"724":{"position":[[404,19],[444,17],[529,19]]}},"keywords":{}}],["addherobtn').on('click",{"_index":1952,"title":{},"content":{"335":{"position":[[581,28]]}},"keywords":{}}],["addit",{"_index":515,"title":{},"content":{"33":{"position":[[197,10]]},"43":{"position":[[529,8]]},"99":{"position":[[198,10]]},"131":{"position":[[727,8]]},"148":{"position":[[470,8]]},"173":{"position":[[3043,10]]},"210":{"position":[[4,8]]},"219":{"position":[[237,10]]},"228":{"position":[[440,10]]},"261":{"position":[[4,8]]},"290":{"position":[[244,10]]},"294":{"position":[[4,8]]},"295":{"position":[[4,8]]},"302":{"position":[[174,10]]},"312":{"position":[[4,8]]},"357":{"position":[[80,10]]},"375":{"position":[[835,9]]},"377":{"position":[[255,10]]},"412":{"position":[[4017,10]]},"441":{"position":[[441,10]]},"452":{"position":[[717,8]]},"463":{"position":[[137,10],[1279,10]]},"483":{"position":[[594,10]]},"585":{"position":[[245,10]]},"614":{"position":[[264,10]]},"616":{"position":[[338,10],[460,10],[581,10],[1060,10]]},"621":{"position":[[331,10]]},"679":{"position":[[81,10]]},"686":{"position":[[872,10]]},"690":{"position":[[359,9]]},"696":{"position":[[1478,10]]},"796":{"position":[[130,10]]},"802":{"position":[[123,10],[296,10]]},"806":{"position":[[469,10]]},"824":{"position":[[586,10]]},"831":{"position":[[4,8]]},"836":{"position":[[1512,10],[1977,10]]},"906":{"position":[[688,10]]},"1051":{"position":[[348,10]]},"1072":{"position":[[2229,10]]},"1092":{"position":[[571,10]]},"1094":{"position":[[409,10]]},"1107":{"position":[[399,10]]},"1212":{"position":[[22,10]]},"1251":{"position":[[44,10]]},"1284":{"position":[[260,10]]}},"keywords":{}}],["addition",{"_index":540,"title":{},"content":{"34":{"position":[[524,13]]},"265":{"position":[[506,13]]},"283":{"position":[[143,13]]},"401":{"position":[[690,13]]},"402":{"position":[[2344,12]]},"434":{"position":[[236,13]]},"520":{"position":[[320,13]]},"801":{"position":[[593,13]]}},"keywords":{}}],["additionalproperti",{"_index":5851,"title":{},"content":{"1084":{"position":[[377,20]]},"1085":{"position":[[1642,21],[1711,21]]}},"keywords":{}}],["addon",{"_index":6071,"title":{"1146":{"position":[[12,7]]}},"content":{"1146":{"position":[[297,7]]},"1148":{"position":[[451,6],[482,5],[673,7],[773,7]]}},"keywords":{}}],["addpouchplugin",{"_index":126,"title":{},"content":{"8":{"position":[[775,15]]},"1201":{"position":[[70,14]]}},"keywords":{}}],["addpouchplugin(require('pouchdb",{"_index":31,"title":{},"content":{"1":{"position":[[462,31]]},"2":{"position":[[174,31]]},"3":{"position":[[148,31]]},"4":{"position":[[320,31]]},"5":{"position":[[233,31]]},"6":{"position":[[333,31]]},"7":{"position":[[260,31]]},"8":{"position":[[1036,31]]},"9":{"position":[[173,31]]},"10":{"position":[[107,31]]},"11":{"position":[[142,31]]},"1201":{"position":[[116,31]]}},"keywords":{}}],["addpouchplugin(sqliteadapt",{"_index":130,"title":{},"content":{"8":{"position":[[1005,30]]}},"keywords":{}}],["addreplicationendpoint",{"_index":5933,"title":{},"content":{"1101":{"position":[[270,24]]}},"keywords":{}}],["address",{"_index":990,"title":{},"content":{"83":{"position":[[256,10]]},"229":{"position":[[54,9]]},"271":{"position":[[41,7]]},"395":{"position":[[4,7]]},"507":{"position":[[59,9]]},"574":{"position":[[818,9]]}},"keywords":{}}],["addrxplugin",{"_index":3726,"title":{},"content":{"646":{"position":[[10,11]]},"652":{"position":[[10,11]]},"680":{"position":[[453,11]]},"724":{"position":[[253,11]]},"738":{"position":[[86,11]]},"829":{"position":[[486,11]]},"862":{"position":[[316,12]]},"872":{"position":[[1567,11]]},"915":{"position":[[78,11]]},"952":{"position":[[181,11]]},"971":{"position":[[293,11]]},"1012":{"position":[[86,11]]},"1041":{"position":[[159,11]]},"1064":{"position":[[116,11]]},"1114":{"position":[[239,14],[459,11]]},"1119":{"position":[[368,11]]},"1231":{"position":[[625,11]]}},"keywords":{}}],["addrxplugin(module.rxdbdevmodeplugin",{"_index":3847,"title":{},"content":{"672":{"position":[[141,37]]},"673":{"position":[[147,37]]},"674":{"position":[[430,37]]}},"keywords":{}}],["addrxplugin(rxdbattachmentsplugin",{"_index":5286,"title":{},"content":{"915":{"position":[[171,35]]}},"keywords":{}}],["addrxplugin(rxdbbackupplugin",{"_index":3729,"title":{},"content":{"646":{"position":[[93,30]]}},"keywords":{}}],["addrxplugin(rxdbcleanupplugin",{"_index":3745,"title":{},"content":{"652":{"position":[[95,31]]},"1119":{"position":[[453,31]]}},"keywords":{}}],["addrxplugin(rxdbcrdtplugin",{"_index":3875,"title":{},"content":{"680":{"position":[[480,28]]}},"keywords":{}}],["addrxplugin(rxdbflexsearchplugin",{"_index":4047,"title":{},"content":{"724":{"position":[[293,34]]}},"keywords":{}}],["addrxplugin(rxdbjsondumpplugin",{"_index":5370,"title":{},"content":{"952":{"position":[[269,32]]},"971":{"position":[[381,32]]}},"keywords":{}}],["addrxplugin(rxdbleaderelectionplugin",{"_index":4092,"title":{},"content":{"738":{"position":[[186,38]]}},"keywords":{}}],["addrxplugin(rxdblocaldocumentsplugin",{"_index":5596,"title":{},"content":{"1012":{"position":[[186,38]]}},"keywords":{}}],["addrxplugin(rxdbquerybuilderplugin",{"_index":5761,"title":{},"content":{"1064":{"position":[[212,36]]}},"keywords":{}}],["addrxplugin(rxdbreplicationgraphqlplugin",{"_index":6276,"title":{},"content":{"1231":{"position":[[733,42]]}},"keywords":{}}],["addrxplugin(rxdbstateplugin",{"_index":5982,"title":{},"content":{"1114":{"position":[[658,29]]}},"keywords":{}}],["addrxplugin(rxdbupdateplugin",{"_index":5686,"title":{},"content":{"1041":{"position":[[242,30]]},"1059":{"position":[[181,30]]}},"keywords":{}}],["addrxplugin.add",{"_index":3869,"title":{},"content":{"680":{"position":[[74,15]]}},"keywords":{}}],["addstat",{"_index":5980,"title":{},"content":{"1114":{"position":[[281,10],[333,8]]}},"keywords":{}}],["adequ",{"_index":867,"title":{},"content":{"58":{"position":[[105,8]]}},"keywords":{}}],["adher",{"_index":5280,"title":{},"content":{"912":{"position":[[690,8]]}},"keywords":{}}],["adjust",{"_index":2770,"title":{},"content":{"412":{"position":[[14361,6]]},"454":{"position":[[329,12]]}},"keywords":{}}],["admin",{"_index":2754,"title":{},"content":{"412":{"position":[[12695,5]]}},"keywords":{}}],["adopt",{"_index":1187,"title":{"313":{"position":[[11,5]]}},"content":{"164":{"position":[[28,6]]},"231":{"position":[[6,6]]},"241":{"position":[[356,8]]},"263":{"position":[[257,5]]},"274":{"position":[[26,7]]},"320":{"position":[[103,7]]},"420":{"position":[[877,8]]},"478":{"position":[[128,5]]},"483":{"position":[[1143,8]]},"530":{"position":[[279,8]]},"563":{"position":[[951,6]]},"613":{"position":[[623,9]]},"624":{"position":[[894,8]]},"632":{"position":[[954,8]]},"1301":{"position":[[1025,7]]}},"keywords":{}}],["advanc",{"_index":563,"title":{"57":{"position":[[0,8]]},"137":{"position":[[0,8]]},"166":{"position":[[0,8]]},"193":{"position":[[0,8]]},"203":{"position":[[3,8]]},"250":{"position":[[3,8]]},"341":{"position":[[0,8]]},"361":{"position":[[0,8]]},"505":{"position":[[0,8]]},"526":{"position":[[0,8]]},"544":{"position":[[0,8]]},"558":{"position":[[45,8]]},"583":{"position":[[0,8]]},"604":{"position":[[0,8]]},"637":{"position":[[0,8]]}},"content":{"35":{"position":[[593,8]]},"39":{"position":[[656,8]]},"47":{"position":[[1039,8],[1137,8]]},"64":{"position":[[195,8]]},"137":{"position":[[21,8]]},"161":{"position":[[244,8]]},"170":{"position":[[371,8]]},"193":{"position":[[24,8]]},"198":{"position":[[339,8]]},"252":{"position":[[70,8]]},"260":{"position":[[198,8]]},"262":{"position":[[315,8]]},"283":{"position":[[45,8]]},"303":{"position":[[112,8]]},"312":{"position":[[57,8]]},"313":{"position":[[193,8]]},"317":{"position":[[100,8]]},"353":{"position":[[517,8]]},"354":{"position":[[542,8],[837,8],[1428,8]]},"362":{"position":[[910,8]]},"383":{"position":[[154,8]]},"392":{"position":[[154,8]]},"408":{"position":[[3456,11],[4631,8]]},"411":{"position":[[5259,8]]},"412":{"position":[[3648,8]]},"427":{"position":[[435,8]]},"441":{"position":[[318,8]]},"478":{"position":[[273,8]]},"480":{"position":[[1072,8]]},"483":{"position":[[634,8]]},"510":{"position":[[318,8]]},"520":{"position":[[301,8]]},"533":{"position":[[249,8]]},"535":{"position":[[522,8],[1046,8]]},"544":{"position":[[18,8]]},"548":{"position":[[404,8]]},"559":{"position":[[1163,8],[1499,8]]},"560":{"position":[[727,8]]},"563":{"position":[[181,8]]},"564":{"position":[[10,8]]},"567":{"position":[[576,8]]},"593":{"position":[[249,8]]},"595":{"position":[[542,8],[1123,8]]},"604":{"position":[[18,8]]},"608":{"position":[[402,8]]},"611":{"position":[[385,11]]},"643":{"position":[[41,8]]},"644":{"position":[[172,8]]},"723":{"position":[[2282,8]]},"793":{"position":[[978,8]]},"831":{"position":[[360,8]]},"836":{"position":[[2366,8]]},"839":{"position":[[500,8],[729,8]]},"841":{"position":[[98,8],[475,8]]},"913":{"position":[[85,8]]},"1085":{"position":[[1817,8]]},"1132":{"position":[[634,8]]}},"keywords":{}}],["advantag",{"_index":96,"title":{"521":{"position":[[27,9]]}},"content":{"7":{"position":[[77,10]]},"47":{"position":[[13,11]]},"65":{"position":[[461,9],[1855,11]]},"66":{"position":[[72,11]]},"71":{"position":[[88,11]]},"92":{"position":[[29,9]]},"174":{"position":[[67,10]]},"180":{"position":[[102,11]]},"186":{"position":[[190,10]]},"217":{"position":[[306,12]]},"232":{"position":[[243,12]]},"247":{"position":[[116,10]]},"265":{"position":[[16,10]]},"278":{"position":[[121,10]]},"282":{"position":[[463,9]]},"284":{"position":[[198,9]]},"366":{"position":[[343,10]]},"372":{"position":[[254,12]]},"411":{"position":[[2739,10],[5393,10]]},"445":{"position":[[443,10],[2094,10]]},"485":{"position":[[32,11]]},"500":{"position":[[385,10]]},"567":{"position":[[76,9]]},"624":{"position":[[85,10]]},"1072":{"position":[[889,9]]},"1083":{"position":[[170,11]]},"1206":{"position":[[555,10]]}},"keywords":{}}],["advis",{"_index":2097,"title":{},"content":{"362":{"position":[[619,9]]}},"keywords":{}}],["ae",{"_index":1691,"title":{},"content":{"291":{"position":[[452,3]]},"717":{"position":[[107,3]]},"718":{"position":[[507,4],[519,4],[531,4],[552,4]]}},"keywords":{}}],["aerospac",{"_index":3452,"title":{},"content":{"569":{"position":[[300,10]]}},"keywords":{}}],["aesinvalid",{"_index":1877,"title":{},"content":{"310":{"position":[[156,13]]}},"keywords":{}}],["affect",{"_index":2114,"title":{},"content":{"366":{"position":[[515,6]]},"401":{"position":[[733,7]]},"535":{"position":[[1007,6]]},"595":{"position":[[1084,6]]},"623":{"position":[[117,9]]},"699":{"position":[[501,6]]},"749":{"position":[[21613,6]]},"839":{"position":[[1383,6]]},"975":{"position":[[232,6]]},"1175":{"position":[[419,6]]},"1315":{"position":[[1328,6]]},"1316":{"position":[[3417,8]]},"1317":{"position":[[540,8]]},"1318":{"position":[[47,7],[1019,6]]},"1322":{"position":[[515,6]]}},"keywords":{}}],["afford",{"_index":1693,"title":{},"content":{"295":{"position":[[96,10]]}},"keywords":{}}],["afoul",{"_index":1867,"title":{},"content":{"305":{"position":[[121,5]]}},"keywords":{}}],["aftermigratebatch",{"_index":4493,"title":{},"content":{"759":{"position":[[886,18]]},"760":{"position":[[774,18]]}},"keywords":{}}],["aftermigratebatchhandlerinput",{"_index":4494,"title":{},"content":{"759":{"position":[[913,30]]},"760":{"position":[[801,30]]}},"keywords":{}}],["afterward",{"_index":1272,"title":{},"content":{"188":{"position":[[2373,10]]},"411":{"position":[[179,10]]},"698":{"position":[[2667,10]]},"773":{"position":[[423,11]]},"806":{"position":[[712,10]]},"1028":{"position":[[112,10]]},"1052":{"position":[[71,11]]},"1069":{"position":[[425,11]]},"1104":{"position":[[448,10]]}},"keywords":{}}],["afterwards.do",{"_index":4819,"title":{},"content":{"844":{"position":[[153,15]]}},"keywords":{}}],["ag",{"_index":975,"title":{},"content":{"77":{"position":[[244,4]]},"103":{"position":[[284,4]]},"234":{"position":[[344,4]]},"426":{"position":[[323,4]]},"662":{"position":[[2508,4]]},"681":{"position":[[720,4]]},"767":{"position":[[377,3]]},"798":{"position":[[386,3],[445,6],[474,7],[578,4],[717,3],[774,6],[881,7],[929,6]]},"820":{"position":[[573,4],[625,4]]},"821":{"position":[[733,3],[798,3],[828,3]]},"838":{"position":[[2722,4]]},"886":{"position":[[709,3],[2423,3],[3621,4]]},"898":{"position":[[2617,4],[3554,3]]},"1041":{"position":[[307,4],[327,3]]},"1043":{"position":[[99,4]]},"1044":{"position":[[322,4],[342,3],[514,4],[574,4]]},"1045":{"position":[[173,4]]},"1051":{"position":[[287,4]]},"1055":{"position":[[223,4]]},"1056":{"position":[[240,5]]},"1059":{"position":[[258,4],[310,4],[330,3]]},"1060":{"position":[[126,4],[169,4],[188,3]]},"1061":{"position":[[127,4],[231,3]]},"1062":{"position":[[117,3],[183,4]]},"1063":{"position":[[98,4],[141,4],[245,4]]},"1066":{"position":[[384,4],[523,3],[580,6],[687,7],[735,6]]},"1067":{"position":[[323,4],[1317,4],[1480,6],[1584,4],[1996,4],[2140,4]]},"1082":{"position":[[382,4]]},"1083":{"position":[[582,4]]},"1149":{"position":[[1175,4]]},"1249":{"position":[[495,4],[541,4]]},"1294":{"position":[[311,3],[470,3],[561,4],[576,6],[623,3],[1284,3]]},"1296":{"position":[[294,3],[713,4],[1021,4],[1036,6],[1105,4]]},"1311":{"position":[[540,4],[1573,4]]}},"keywords":{}}],["again",{"_index":1332,"title":{},"content":{"206":{"position":[[346,6]]},"309":{"position":[[275,6]]},"412":{"position":[[8329,7]]},"486":{"position":[[384,6]]},"614":{"position":[[914,5]]},"626":{"position":[[804,6],[1070,6]]},"647":{"position":[[143,6],[479,5]]},"697":{"position":[[446,6]]},"698":{"position":[[103,6]]},"700":{"position":[[923,5]]},"702":{"position":[[858,6]]},"783":{"position":[[105,6]]},"799":{"position":[[473,5]]},"817":{"position":[[275,5]]},"875":{"position":[[8934,6]]},"880":{"position":[[319,6]]},"955":{"position":[[202,5]]},"976":{"position":[[251,5]]},"984":{"position":[[63,6]]},"985":{"position":[[461,6]]},"987":{"position":[[968,6]]},"988":{"position":[[5872,6],[6121,6]]},"990":{"position":[[79,5],[452,6]]},"1003":{"position":[[284,5]]},"1030":{"position":[[197,5]]},"1058":{"position":[[512,5]]},"1115":{"position":[[720,5]]},"1198":{"position":[[2341,6]]},"1208":{"position":[[1899,6]]},"1304":{"position":[[1845,6]]},"1308":{"position":[[628,6]]},"1314":{"position":[[584,5]]},"1316":{"position":[[3241,6]]},"1318":{"position":[[246,6],[685,6]]}},"keywords":{}}],["against",{"_index":1554,"title":{},"content":{"251":{"position":[[81,7]]},"630":{"position":[[572,7]]},"699":{"position":[[702,7]]},"711":{"position":[[835,7]]},"778":{"position":[[344,7]]},"886":{"position":[[1817,7]]},"1124":{"position":[[1552,7],[1814,7]]},"1161":{"position":[[62,7]]},"1174":{"position":[[522,7]]},"1180":{"position":[[62,7]]},"1250":{"position":[[42,7]]}},"keywords":{}}],["age+id",{"_index":6456,"title":{},"content":{"1296":{"position":[[335,6]]}},"keywords":{}}],["ageidcustomindex",{"_index":6457,"title":{},"content":{"1296":{"position":[[589,16],[772,16],[1127,18]]}},"keywords":{}}],["agent",{"_index":6056,"title":{},"content":{"1140":{"position":[[154,5]]},"1297":{"position":[[206,5]]}},"keywords":{}}],["aggreg",{"_index":1560,"title":{},"content":{"252":{"position":[[240,10]]},"353":{"position":[[69,13]]},"354":{"position":[[756,13]]},"412":{"position":[[12709,9],[14148,14]]},"418":{"position":[[343,11]]},"698":{"position":[[2678,9]]},"888":{"position":[[288,9],[921,9]]},"889":{"position":[[657,9]]},"1021":{"position":[[96,9]]},"1072":{"position":[[634,12],[931,11],[1049,11]]},"1315":{"position":[[842,9]]},"1322":{"position":[[490,9]]}},"keywords":{}}],["aggress",{"_index":1756,"title":{},"content":{"299":{"position":[[968,10],[1522,12]]}},"keywords":{}}],["agil",{"_index":2087,"title":{},"content":{"362":{"position":[[224,5]]}},"keywords":{}}],["agnost",{"_index":1546,"title":{"351":{"position":[[17,9]]}},"content":{"249":{"position":[[297,8]]},"357":{"position":[[447,8]]},"500":{"position":[[721,9]]}},"keywords":{}}],["ago",{"_index":443,"title":{},"content":{"27":{"position":[[349,3]]},"408":{"position":[[489,4],[1482,4],[5605,4]]},"705":{"position":[[36,3]]}},"keywords":{}}],["ahead",{"_index":2563,"title":{},"content":{"408":{"position":[[4062,6]]}},"keywords":{}}],["ai",{"_index":2505,"title":{},"content":{"404":{"position":[[462,2],[503,2]]}},"keywords":{}}],["ai/mxbai",{"_index":2466,"title":{},"content":{"401":{"position":[[472,8]]}},"keywords":{}}],["aim",{"_index":2302,"title":{},"content":{"394":{"position":[[192,3]]},"410":{"position":[[166,3]]},"510":{"position":[[532,6]]}},"keywords":{}}],["airbag",{"_index":3458,"title":{},"content":{"569":{"position":[[668,8],[772,7]]}},"keywords":{}}],["ajax",{"_index":1915,"title":{},"content":{"320":{"position":[[72,4]]},"574":{"position":[[658,4]]}},"keywords":{}}],["ajv",{"_index":6285,"title":{"1286":{"position":[[9,4]]},"1290":{"position":[[0,3]]}},"content":{"1237":{"position":[[562,5]]},"1286":{"position":[[72,3],[256,5]]},"1287":{"position":[[36,3]]},"1290":{"position":[[47,5],[59,3]]},"1292":{"position":[[356,3],[712,3],[972,3]]}},"keywords":{}}],["ajv.addformat('email",{"_index":6389,"title":{},"content":{"1290":{"position":[[75,22]]}},"keywords":{}}],["aka",{"_index":1625,"title":{},"content":{"269":{"position":[[7,4]]},"367":{"position":[[655,4]]},"502":{"position":[[643,4]]},"619":{"position":[[79,4]]},"1087":{"position":[[18,3]]}},"keywords":{}}],["aklsdjfhaklsdjhf",{"_index":5728,"title":{},"content":{"1051":{"position":[[606,20]]}},"keywords":{}}],["alert",{"_index":3655,"title":{},"content":{"618":{"position":[[673,5]]}},"keywords":{}}],["algorithm",{"_index":982,"title":{"78":{"position":[[48,10]]},"82":{"position":[[12,9]]},"108":{"position":[[48,10]]},"113":{"position":[[12,9]]},"234":{"position":[[48,10]]},"238":{"position":[[12,9]]},"289":{"position":[[17,10]]}},"content":{"78":{"position":[[20,9]]},"82":{"position":[[20,9]]},"108":{"position":[[30,9],[75,9]]},"113":{"position":[[33,9]]},"174":{"position":[[1550,10],[1595,9],[1640,9],[2898,9],[2954,9]]},"218":{"position":[[186,11]]},"223":{"position":[[251,10]]},"234":{"position":[[54,10],[70,9]]},"238":{"position":[[29,9]]},"289":{"position":[[70,9],[154,9],[340,10]]},"369":{"position":[[1238,9]]},"393":{"position":[[526,9]]},"394":{"position":[[1091,11]]},"408":{"position":[[3648,11]]},"411":{"position":[[3424,10]]},"490":{"position":[[463,10],[517,9]]},"504":{"position":[[730,10],[777,10]]},"571":{"position":[[1748,9]]},"717":{"position":[[111,9]]},"718":{"position":[[483,9],[541,10]]},"737":{"position":[[67,9]]},"799":{"position":[[239,9]]},"965":{"position":[[234,9]]},"1065":{"position":[[1652,10]]},"1071":{"position":[[470,9]]},"1083":{"position":[[291,10]]},"1093":{"position":[[214,9]]},"1318":{"position":[[864,9]]}},"keywords":{}}],["alias",{"_index":1131,"title":{},"content":{"141":{"position":[[153,8]]}},"keywords":{}}],["alic",{"_index":2768,"title":{},"content":{"412":{"position":[[13954,5]]},"426":{"position":[[314,8]]},"680":{"position":[[1258,8]]},"810":{"position":[[227,8],[317,7]]},"811":{"position":[[207,8],[297,7]]},"813":{"position":[[284,8]]},"866":{"position":[[720,7]]},"951":{"position":[[332,8]]},"1052":{"position":[[234,8]]},"1056":{"position":[[78,5],[140,7]]},"1316":{"position":[[754,6],[1007,5],[1177,5],[1251,5]]}},"keywords":{}}],["alice@example.com",{"_index":2877,"title":{},"content":{"426":{"position":[[339,19]]}},"keywords":{}}],["align",{"_index":956,"title":{"352":{"position":[[0,7]]}},"content":{"68":{"position":[[112,5]]},"70":{"position":[[129,5]]},"104":{"position":[[43,5]]},"174":{"position":[[521,8]]},"222":{"position":[[213,5]]},"231":{"position":[[88,6]]},"293":{"position":[[371,7]]},"298":{"position":[[737,6]]},"299":{"position":[[845,7]]},"362":{"position":[[32,5]]},"364":{"position":[[147,6]]},"411":{"position":[[5284,6]]},"502":{"position":[[160,5]]},"521":{"position":[[109,5]]},"581":{"position":[[646,6]]},"636":{"position":[[402,6]]},"902":{"position":[[490,6]]}},"keywords":{}}],["aliv",{"_index":3599,"title":{},"content":{"612":{"position":[[1986,7]]},"875":{"position":[[7341,7]]}},"keywords":{}}],["aliveheroes.map(doc",{"_index":3467,"title":{},"content":{"571":{"position":[[1121,19]]}},"keywords":{}}],["allattach",{"_index":5299,"title":{"920":{"position":[[0,17]]},"921":{"position":[[0,16]]}},"content":{},"keywords":{}}],["alldoc",{"_index":6508,"title":{},"content":{"1311":{"position":[[898,7]]}},"keywords":{}}],["alldocs.length",{"_index":6510,"title":{},"content":{"1311":{"position":[[941,15]]}},"keywords":{}}],["alldocsresult",{"_index":4882,"title":{},"content":{"857":{"position":[[281,13]]}},"keywords":{}}],["alldocsresult.foreach(doc",{"_index":4884,"title":{},"content":{"857":{"position":[[340,25]]}},"keywords":{}}],["allhero",{"_index":3428,"title":{},"content":{"562":{"position":[[652,9],[719,11]]}},"keywords":{}}],["alli",{"_index":3219,"title":{},"content":{"501":{"position":[[86,5]]}},"keywords":{}}],["alloc",{"_index":1770,"title":{},"content":{"300":{"position":[[190,9],[356,9]]}},"keywords":{}}],["allot",{"_index":1795,"title":{},"content":{"302":{"position":[[60,8]]}},"keywords":{}}],["allow",{"_index":396,"title":{"1084":{"position":[[4,7]]},"1110":{"position":[[19,8]]}},"content":{"24":{"position":[[115,6],[626,6]]},"34":{"position":[[139,6],[427,8]]},"38":{"position":[[869,5]]},"39":{"position":[[89,8]]},"40":{"position":[[462,6]]},"45":{"position":[[105,6]]},"65":{"position":[[178,6],[890,6],[1628,6]]},"77":{"position":[[39,6]]},"88":{"position":[[29,6]]},"90":{"position":[[125,6]]},"91":{"position":[[68,8]]},"94":{"position":[[156,6]]},"99":{"position":[[332,8]]},"106":{"position":[[6,6]]},"109":{"position":[[48,8]]},"111":{"position":[[33,6]]},"113":{"position":[[139,6]]},"122":{"position":[[72,6]]},"124":{"position":[[85,6]]},"133":{"position":[[68,6]]},"135":{"position":[[51,8]]},"138":{"position":[[36,6]]},"140":{"position":[[36,5]]},"144":{"position":[[55,5]]},"147":{"position":[[199,5]]},"156":{"position":[[197,6]]},"158":{"position":[[178,5]]},"160":{"position":[[32,8]]},"162":{"position":[[457,6]]},"164":{"position":[[62,8]]},"166":{"position":[[115,6]]},"172":{"position":[[278,6]]},"173":{"position":[[507,6],[1818,6],[2356,6],[2798,8]]},"174":{"position":[[988,6],[1842,8],[3131,6]]},"177":{"position":[[78,6]]},"181":{"position":[[254,6]]},"183":{"position":[[153,6]]},"188":{"position":[[1823,5]]},"194":{"position":[[105,6]]},"202":{"position":[[73,6]]},"215":{"position":[[171,8]]},"230":{"position":[[167,8]]},"232":{"position":[[124,8]]},"237":{"position":[[41,8]]},"239":{"position":[[227,6]]},"267":{"position":[[728,8]]},"274":{"position":[[106,6]]},"275":{"position":[[91,6]]},"286":{"position":[[315,6]]},"289":{"position":[[1695,6]]},"292":{"position":[[77,8]]},"298":{"position":[[506,5],[613,5]]},"299":{"position":[[1644,5]]},"303":{"position":[[88,7]]},"323":{"position":[[82,8]]},"338":{"position":[[31,6]]},"351":{"position":[[193,8]]},"357":{"position":[[13,6]]},"360":{"position":[[828,8]]},"364":{"position":[[558,8]]},"369":{"position":[[245,6],[1332,6]]},"379":{"position":[[46,8]]},"383":{"position":[[65,8]]},"390":{"position":[[422,8]]},"391":{"position":[[177,8]]},"392":{"position":[[1213,6],[2401,6],[4877,6]]},"395":{"position":[[77,6],[214,8]]},"396":{"position":[[409,8],[1764,6]]},"398":{"position":[[2920,5]]},"408":{"position":[[977,6],[1658,6],[3497,6],[4106,5]]},"411":{"position":[[5212,5]]},"412":{"position":[[1847,5],[12527,6]]},"424":{"position":[[193,8]]},"433":{"position":[[554,6]]},"445":{"position":[[508,6],[1821,6]]},"452":{"position":[[299,6]]},"453":{"position":[[68,6]]},"454":{"position":[[46,6]]},"455":{"position":[[46,7]]},"459":{"position":[[125,6]]},"470":{"position":[[117,5]]},"481":{"position":[[514,8]]},"502":{"position":[[457,8]]},"514":{"position":[[319,8]]},"518":{"position":[[96,8]]},"541":{"position":[[51,8]]},"574":{"position":[[206,8]]},"602":{"position":[[143,6]]},"610":{"position":[[639,6]]},"611":{"position":[[422,8]]},"612":{"position":[[999,8]]},"613":{"position":[[302,8]]},"616":{"position":[[34,5],[1167,6]]},"617":{"position":[[22,5]]},"618":{"position":[[656,5]]},"636":{"position":[[84,6]]},"682":{"position":[[276,6]]},"687":{"position":[[47,6],[290,7]]},"696":{"position":[[1292,6],[1372,6]]},"701":{"position":[[172,7],[389,5],[823,7],[1035,7]]},"714":{"position":[[726,6]]},"723":{"position":[[2106,6]]},"749":{"position":[[2638,8],[2863,7],[5293,7],[6095,7],[8476,7],[8563,7],[16770,7],[18359,8],[18426,7],[19057,7],[21062,8]]},"759":{"position":[[1421,6]]},"801":{"position":[[618,5]]},"838":{"position":[[664,8]]},"849":{"position":[[20,6]]},"861":{"position":[[1417,5],[2449,5]]},"862":{"position":[[1663,6]]},"863":{"position":[[28,5],[329,5],[484,5]]},"872":{"position":[[2765,6]]},"881":{"position":[[60,7],[112,7]]},"898":{"position":[[4581,6]]},"903":{"position":[[155,6]]},"962":{"position":[[106,6]]},"966":{"position":[[487,7],[809,5]]},"968":{"position":[[777,5]]},"1009":{"position":[[304,7]]},"1065":{"position":[[593,7]]},"1067":{"position":[[950,7],[2223,5]]},"1068":{"position":[[4,5]]},"1079":{"position":[[105,7],[172,5]]},"1101":{"position":[[26,6]]},"1103":{"position":[[156,6]]},"1105":{"position":[[972,7]]},"1106":{"position":[[98,7],[401,5]]},"1110":{"position":[[24,7]]},"1112":{"position":[[560,5]]},"1124":{"position":[[171,6],[799,5],[1934,6]]},"1132":{"position":[[206,8],[621,8],[1408,8]]},"1140":{"position":[[138,6]]},"1150":{"position":[[103,8]]},"1198":{"position":[[1205,6],[1311,7],[1671,6],[1864,6]]},"1206":{"position":[[76,6]]},"1215":{"position":[[671,5]]},"1238":{"position":[[206,6]]},"1246":{"position":[[80,6],[424,6]]},"1271":{"position":[[165,6]]},"1276":{"position":[[106,6]]},"1287":{"position":[[125,7]]},"1297":{"position":[[25,5]]},"1317":{"position":[[236,7],[592,7]]}},"keywords":{}}],["allowslowcount",{"_index":5782,"title":{"1068":{"position":[[0,15]]}},"content":{"1067":{"position":[[2416,15]]},"1068":{"position":[[80,15]]}},"keywords":{}}],["allowslowcount=tru",{"_index":4170,"title":{},"content":{"749":{"position":[[2725,19]]},"1067":{"position":[[2301,19]]}},"keywords":{}}],["allstates.foreach(migrationst",{"_index":4477,"title":{},"content":{"753":{"position":[[336,32]]}},"keywords":{}}],["allstatesobserv",{"_index":4474,"title":{},"content":{"753":{"position":[[236,19]]}},"keywords":{}}],["allstatesobservable.subscribe(allst",{"_index":4476,"title":{},"content":{"753":{"position":[[288,39]]}},"keywords":{}}],["alltask",{"_index":3707,"title":{},"content":{"632":{"position":[[1863,10]]}},"keywords":{}}],["alon",{"_index":583,"title":{"44":{"position":[[67,5]]}},"content":{"37":{"position":[[352,5]]},"228":{"position":[[394,5]]}},"keywords":{}}],["along",{"_index":5164,"title":{},"content":{"889":{"position":[[298,5]]}},"keywords":{}}],["alongsid",{"_index":2236,"title":{},"content":{"392":{"position":[[1396,9]]},"397":{"position":[[39,9]]},"418":{"position":[[629,9]]},"1132":{"position":[[1484,9]]}},"keywords":{}}],["alphahero",{"_index":3427,"title":{},"content":{"562":{"position":[[591,12]]}},"keywords":{}}],["alreadi",{"_index":1204,"title":{"857":{"position":[[30,7]]}},"content":{"173":{"position":[[1667,7]]},"217":{"position":[[95,7]]},"350":{"position":[[312,7]]},"403":{"position":[[146,7]]},"411":{"position":[[2119,7],[2695,8]]},"463":{"position":[[1351,7]]},"626":{"position":[[533,8]]},"653":{"position":[[1168,7]]},"683":{"position":[[971,8]]},"686":{"position":[[11,7],[344,7],[466,7]]},"700":{"position":[[248,7]]},"702":{"position":[[272,7]]},"724":{"position":[[1313,7]]},"749":{"position":[[1435,7],[5030,7],[5627,7],[8778,8],[9336,7],[10731,7],[12216,7],[12420,7],[14306,7],[14585,7]]},"770":{"position":[[564,7]]},"778":{"position":[[583,7]]},"781":{"position":[[585,7]]},"785":{"position":[[475,7]]},"799":{"position":[[325,8]]},"856":{"position":[[218,8]]},"857":{"position":[[42,7]]},"943":{"position":[[140,7]]},"945":{"position":[[398,7]]},"990":{"position":[[170,7]]},"995":{"position":[[255,7],[900,7]]},"1008":{"position":[[230,7]]},"1014":{"position":[[102,7]]},"1088":{"position":[[162,7]]},"1124":{"position":[[2025,7]]},"1151":{"position":[[722,7]]},"1156":{"position":[[86,7]]},"1162":{"position":[[636,7]]},"1165":{"position":[[679,7]]},"1178":{"position":[[721,7]]},"1181":{"position":[[724,7]]},"1222":{"position":[[861,7]]},"1270":{"position":[[364,7]]},"1299":{"position":[[476,7]]},"1301":{"position":[[408,7]]}},"keywords":{}}],["alter",{"_index":3711,"title":{},"content":{"636":{"position":[[62,7]]},"898":{"position":[[1452,5]]}},"keywords":{}}],["altern",{"_index":179,"title":{"12":{"position":[[0,12]]},"13":{"position":[[0,12]]},"59":{"position":[[0,12]]},"199":{"position":[[38,11]]},"200":{"position":[[52,12]]},"246":{"position":[[21,11]]},"247":{"position":[[34,13]]},"256":{"position":[[41,12]]},"290":{"position":[[11,11]]},"546":{"position":[[0,12]]},"606":{"position":[[0,12]]},"688":{"position":[[5,12]]},"709":{"position":[[37,12]]}},"content":{"13":{"position":[[122,13],[320,12]]},"34":{"position":[[371,11],[691,11]]},"186":{"position":[[90,12]]},"219":{"position":[[31,11]]},"251":{"position":[[258,11]]},"255":{"position":[[1812,11]]},"263":{"position":[[42,11]]},"290":{"position":[[97,11]]},"412":{"position":[[1816,14],[12789,11]]},"429":{"position":[[114,11]]},"430":{"position":[[123,12]]},"432":{"position":[[108,12]]},"435":{"position":[[207,12]]},"437":{"position":[[231,11]]},"441":{"position":[[389,12]]},"546":{"position":[[57,11]]},"561":{"position":[[198,11]]},"606":{"position":[[57,11]]},"663":{"position":[[147,13]]},"688":{"position":[[132,11]]},"690":{"position":[[31,11]]},"712":{"position":[[166,12]]},"749":{"position":[[5845,11]]},"772":{"position":[[1084,11]]},"831":{"position":[[71,11]]},"834":{"position":[[172,13]]},"842":{"position":[[281,12]]},"1095":{"position":[[4,11]]},"1124":{"position":[[590,13]]},"1198":{"position":[[1326,12]]},"1277":{"position":[[649,11]]},"1294":{"position":[[130,11]]}},"keywords":{}}],["alternative"",{"_index":367,"title":{},"content":{"22":{"position":[[59,18]]},"243":{"position":[[247,17],[296,17]]},"244":{"position":[[16,17],[1311,17],[1468,17],[1682,17]]}},"keywords":{}}],["alternatives"",{"_index":1514,"title":{},"content":{"244":{"position":[[1228,18]]}},"keywords":{}}],["although",{"_index":633,"title":{},"content":{"40":{"position":[[143,8]]},"356":{"position":[[590,8]]},"624":{"position":[[1496,8]]},"839":{"position":[[1165,8]]},"1072":{"position":[[2019,8]]}},"keywords":{}}],["altogeth",{"_index":3115,"title":{},"content":{"478":{"position":[[298,11]]}},"keywords":{}}],["alway",{"_index":228,"title":{"97":{"position":[[21,6]]}},"content":{"14":{"position":[[842,6]]},"19":{"position":[[592,6]]},"97":{"position":[[61,6]]},"98":{"position":[[83,6]]},"143":{"position":[[367,6]]},"159":{"position":[[325,6]]},"173":{"position":[[2723,6],[2932,6]]},"182":{"position":[[298,6]]},"288":{"position":[[338,6]]},"289":{"position":[[1351,6]]},"300":{"position":[[752,6]]},"398":{"position":[[269,6]]},"408":{"position":[[2466,6]]},"412":{"position":[[4254,6]]},"481":{"position":[[128,6]]},"550":{"position":[[267,6]]},"602":{"position":[[498,6]]},"626":{"position":[[1149,6]]},"644":{"position":[[693,6]]},"688":{"position":[[1042,6]]},"698":{"position":[[745,6]]},"701":{"position":[[1085,6]]},"709":{"position":[[991,6]]},"710":{"position":[[1292,6]]},"723":{"position":[[1216,6]]},"736":{"position":[[134,6]]},"737":{"position":[[99,6],[294,6]]},"749":{"position":[[17903,6],[18024,6]]},"772":{"position":[[415,6]]},"779":{"position":[[279,6]]},"780":{"position":[[202,6]]},"781":{"position":[[851,6]]},"800":{"position":[[108,6],[344,6]]},"804":{"position":[[80,6]]},"808":{"position":[[340,6]]},"816":{"position":[[216,6]]},"898":{"position":[[223,6]]},"905":{"position":[[27,6],[91,6]]},"906":{"position":[[420,6]]},"965":{"position":[[323,6]]},"986":{"position":[[1177,6]]},"987":{"position":[[778,6]]},"988":{"position":[[1206,6]]},"1057":{"position":[[556,6]]},"1058":{"position":[[28,6],[138,6]]},"1065":{"position":[[1539,6],[1830,6]]},"1068":{"position":[[368,6]]},"1072":{"position":[[425,6]]},"1079":{"position":[[499,6]]},"1083":{"position":[[90,6]]},"1084":{"position":[[401,6]]},"1092":{"position":[[521,6]]},"1095":{"position":[[272,6]]},"1100":{"position":[[81,6]]},"1103":{"position":[[90,6]]},"1124":{"position":[[1131,6]]},"1175":{"position":[[485,6]]},"1192":{"position":[[37,6]]},"1208":{"position":[[1822,6]]},"1295":{"position":[[813,6]]},"1296":{"position":[[403,6]]},"1301":{"position":[[1310,6]]},"1305":{"position":[[365,6]]},"1309":{"position":[[989,6]]},"1318":{"position":[[40,6],[1134,6]]},"1321":{"position":[[623,6]]},"1322":{"position":[[347,6]]}},"keywords":{}}],["amazon",{"_index":2645,"title":{},"content":{"411":{"position":[[5646,7]]},"444":{"position":[[623,6]]},"779":{"position":[[30,7]]}},"keywords":{}}],["ambigu",{"_index":2810,"title":{},"content":{"419":{"position":[[1484,10]]}},"keywords":{}}],["amount",{"_index":694,"title":{"782":{"position":[[36,6]]}},"content":{"45":{"position":[[74,7]]},"58":{"position":[[267,6]]},"63":{"position":[[54,7]]},"66":{"position":[[448,6]]},"143":{"position":[[412,7],[519,6],[552,6],[704,6],[737,6],[764,7]]},"265":{"position":[[694,6]]},"298":{"position":[[434,6]]},"317":{"position":[[75,7]]},"398":{"position":[[3222,6],[3255,7],[3315,6]]},"402":{"position":[[1440,6]]},"408":{"position":[[2279,7]]},"424":{"position":[[103,7]]},"430":{"position":[[502,6]]},"451":{"position":[[327,7]]},"452":{"position":[[125,7]]},"477":{"position":[[280,6]]},"533":{"position":[[54,7]]},"559":{"position":[[1026,7]]},"560":{"position":[[246,7],[313,7]]},"566":{"position":[[694,7]]},"593":{"position":[[54,7]]},"617":{"position":[[1381,6],[1502,7],[1783,6]]},"653":{"position":[[568,6]]},"659":{"position":[[726,6]]},"696":{"position":[[289,6]]},"724":{"position":[[1068,6]]},"749":{"position":[[9262,6]]},"752":{"position":[[1193,6],[1251,6]]},"782":{"position":[[274,6],[332,6]]},"784":{"position":[[753,7]]},"821":{"position":[[648,6]]},"835":{"position":[[831,6]]},"838":{"position":[[1120,7]]},"846":{"position":[[653,6]]},"886":{"position":[[1460,6],[2868,6]]},"958":{"position":[[553,6]]},"1067":{"position":[[24,6],[576,6]]},"1134":{"position":[[595,6]]},"1157":{"position":[[302,7]]},"1192":{"position":[[507,7]]},"1222":{"position":[[577,6],[686,6]]},"1237":{"position":[[60,6]]},"1304":{"position":[[1477,6]]},"1311":{"position":[[1728,7]]}},"keywords":{}}],["amountinstock",{"_index":6548,"title":{},"content":{"1316":{"position":[[1105,13]]}},"keywords":{}}],["amp",{"_index":285,"title":{},"content":{"17":{"position":[[30,5]]},"261":{"position":[[668,5]]},"317":{"position":[[193,5]]},"410":{"position":[[13,5],[498,5]]},"412":{"position":[[8937,5]]},"710":{"position":[[1377,5]]},"860":{"position":[[888,5],[1066,5]]},"898":{"position":[[92,5],[1563,5]]},"902":{"position":[[362,5]]},"993":{"position":[[384,5]]},"1132":{"position":[[873,5]]},"1246":{"position":[[2011,5]]}},"keywords":{}}],["amp;&",{"_index":3280,"title":{},"content":{"523":{"position":[[762,10]]},"666":{"position":[[224,10]]},"670":{"position":[[529,10]]},"875":{"position":[[4737,10],[4799,10],[4839,10]]},"990":{"position":[[1255,10],[1293,10]]}},"keywords":{}}],["amp;limit=${batchs",{"_index":1358,"title":{},"content":{"209":{"position":[[1186,26]]}},"keywords":{}}],["ampl",{"_index":1696,"title":{},"content":{"295":{"position":[[303,5]]}},"keywords":{}}],["amplifi",{"_index":303,"title":{"18":{"position":[[4,8]]}},"content":{"18":{"position":[[7,7],[290,7],[406,7]]},"19":{"position":[[25,7],[265,7]]}},"keywords":{}}],["analyt",{"_index":306,"title":{},"content":{"18":{"position":[[176,10]]},"265":{"position":[[902,10]]},"267":{"position":[[851,9],[940,9],[1017,9],[1540,9]]},"353":{"position":[[526,9]]},"354":{"position":[[690,10]]},"375":{"position":[[494,9]]},"412":{"position":[[12719,11]]},"418":{"position":[[403,9]]},"446":{"position":[[993,9]]},"704":{"position":[[502,10]]}},"keywords":{}}],["analytics.legaci",{"_index":2026,"title":{},"content":{"354":{"position":[[904,16]]}},"keywords":{}}],["analyz",{"_index":6569,"title":{},"content":{"1318":{"position":[[543,7]]}},"keywords":{}}],["android",{"_index":567,"title":{},"content":{"36":{"position":[[44,7]]},"177":{"position":[[154,7]]},"269":{"position":[[291,8]]},"287":{"position":[[1163,7]]},"299":{"position":[[1018,7]]},"305":{"position":[[175,7]]},"371":{"position":[[136,7]]},"445":{"position":[[2260,7]]},"446":{"position":[[1371,8]]},"618":{"position":[[73,7]]},"640":{"position":[[356,8]]},"660":{"position":[[511,8]]},"1270":{"position":[[413,9]]},"1278":{"position":[[43,7]]},"1301":{"position":[[1003,7]]}},"keywords":{}}],["angular",{"_index":257,"title":{"44":{"position":[[28,7]]},"46":{"position":[[21,8]]},"48":{"position":[[15,8]]},"55":{"position":[[5,7]]},"56":{"position":[[0,7]]},"115":{"position":[[25,7]]},"116":{"position":[[0,7]]},"117":{"position":[[27,7]]},"126":{"position":[[15,7]]},"127":{"position":[[17,7]]},"128":{"position":[[22,7]]},"130":{"position":[[8,7]]},"142":{"position":[[33,7]]},"145":{"position":[[4,7]]},"286":{"position":[[33,8]]},"493":{"position":[[0,7]]},"673":{"position":[[11,8]]}},"content":{"15":{"position":[[319,8]]},"49":{"position":[[32,7]]},"50":{"position":[[66,7],[457,7]]},"51":{"position":[[960,7],[1045,7]]},"54":{"position":[[4,8]]},"55":{"position":[[1,7]]},"56":{"position":[[39,7],[151,7]]},"61":{"position":[[397,7]]},"94":{"position":[[100,8]]},"116":{"position":[[1,7],[188,7]]},"117":{"position":[[32,7]]},"118":{"position":[[272,7],[418,7]]},"125":{"position":[[87,7]]},"126":{"position":[[54,7]]},"127":{"position":[[107,7]]},"128":{"position":[[19,7],[238,7]]},"129":{"position":[[1,7],[255,8],[466,7],[563,8],[628,7]]},"130":{"position":[[1,7],[255,7]]},"132":{"position":[[29,7],[219,7]]},"133":{"position":[[75,7]]},"136":{"position":[[173,7]]},"137":{"position":[[84,7]]},"138":{"position":[[284,7]]},"140":{"position":[[316,7]]},"142":{"position":[[34,7]]},"143":{"position":[[189,7]]},"144":{"position":[[72,7]]},"145":{"position":[[103,7]]},"148":{"position":[[42,7],[190,7],[487,7]]},"149":{"position":[[445,7]]},"173":{"position":[[2298,8]]},"222":{"position":[[117,8]]},"286":{"position":[[190,8]]},"313":{"position":[[70,7]]},"323":{"position":[[676,7]]},"352":{"position":[[261,7]]},"511":{"position":[[468,7]]},"729":{"position":[[24,7]]},"742":{"position":[[9,7]]},"824":{"position":[[232,8]]},"825":{"position":[[1,7],[22,7],[37,7],[158,9],[523,7],[977,7],[1090,7],[1134,7]]},"910":{"position":[[315,7]]},"1118":{"position":[[213,7]]},"1176":{"position":[[462,8]]},"1202":{"position":[[24,7]]},"1268":{"position":[[309,7]]}},"keywords":{}}],["angular'",{"_index":748,"title":{},"content":{"50":{"position":[[42,9],[259,9]]},"55":{"position":[[156,9]]},"129":{"position":[[165,9]]},"143":{"position":[[1,9]]},"493":{"position":[[3,9]]}},"keywords":{}}],["angular/common",{"_index":4725,"title":{},"content":{"825":{"position":[[622,18]]}},"keywords":{}}],["angular/cor",{"_index":834,"title":{},"content":{"55":{"position":[[278,16],[833,16]]},"673":{"position":[[27,16]]},"825":{"position":[[203,16],[576,16]]}},"keywords":{}}],["angular/core/rxj",{"_index":835,"title":{},"content":{"55":{"position":[[320,19]]},"1118":{"position":[[440,19]]}},"keywords":{}}],["anim",{"_index":1916,"title":{},"content":{"320":{"position":[[266,11]]},"934":{"position":[[866,8]]}},"keywords":{}}],["announc",{"_index":2510,"title":{},"content":{"405":{"position":[[16,12]]},"471":{"position":[[10,12]]},"628":{"position":[[67,12]]}},"keywords":{}}],["anon",{"_index":5193,"title":{},"content":{"897":{"position":[[536,4]]},"898":{"position":[[2816,4]]}},"keywords":{}}],["anoth",{"_index":413,"title":{},"content":{"25":{"position":[[44,7]]},"262":{"position":[[556,7]]},"289":{"position":[[1060,7]]},"303":{"position":[[1050,7],[1205,7],[1362,7]]},"408":{"position":[[3448,7],[4213,7]]},"411":{"position":[[4541,7]]},"412":{"position":[[1624,7],[4038,7]]},"429":{"position":[[628,7]]},"433":{"position":[[1,7]]},"562":{"position":[[1700,7]]},"571":{"position":[[401,7],[448,7]]},"617":{"position":[[734,7]]},"636":{"position":[[187,8]]},"656":{"position":[[122,7]]},"696":{"position":[[734,7],[1737,7]]},"709":{"position":[[630,7]]},"749":{"position":[[4745,7],[5385,7],[8829,8],[15064,7]]},"772":{"position":[[1076,7]]},"775":{"position":[[95,7],[122,7]]},"785":{"position":[[604,7],[632,7]]},"839":{"position":[[12,7]]},"902":{"position":[[94,8]]},"956":{"position":[[158,7]]},"991":{"position":[[160,7]]},"995":{"position":[[240,7],[885,7]]},"1020":{"position":[[64,7]]},"1085":{"position":[[2837,7]]},"1089":{"position":[[1,7]]},"1090":{"position":[[1,7]]},"1195":{"position":[[223,7]]},"1198":{"position":[[664,7],[2108,7]]},"1219":{"position":[[170,7]]},"1230":{"position":[[272,7]]},"1231":{"position":[[171,7]]},"1246":{"position":[[811,7]]},"1296":{"position":[[1702,7]]},"1298":{"position":[[41,7]]},"1300":{"position":[[483,7]]},"1304":{"position":[[1009,7]]}},"keywords":{}}],["answer",{"_index":2175,"title":{},"content":{"387":{"position":[[312,9]]},"412":{"position":[[10298,6]]},"612":{"position":[[540,6]]},"703":{"position":[[1271,6]]},"705":{"position":[[402,6]]},"990":{"position":[[239,9]]},"1220":{"position":[[347,8],[541,6]]},"1249":{"position":[[75,6]]}},"keywords":{}}],["ant",{"_index":4657,"title":{},"content":{"799":{"position":[[219,3]]}},"keywords":{}}],["anticip",{"_index":1387,"title":{},"content":{"212":{"position":[[392,10]]}},"keywords":{}}],["any>>",{"_index":5475,"title":{},"content":{"988":{"position":[[5136,14]]}},"keywords":{}}],["any).embed",{"_index":2411,"title":{},"content":{"398":{"position":[[1548,15],[2701,15]]}},"keywords":{}}],["any).glob",{"_index":4072,"title":{},"content":{"729":{"position":[[342,11]]},"1202":{"position":[[381,11]]}},"keywords":{}}],["any).process",{"_index":4073,"title":{},"content":{"729":{"position":[[375,12]]},"1202":{"position":[[414,12]]}},"keywords":{}}],["anyfield",{"_index":4543,"title":{},"content":{"768":{"position":[[347,8]]}},"keywords":{}}],["anymor",{"_index":448,"title":{},"content":{"27":{"position":[[434,8]]},"28":{"position":[[579,8],[723,7]]},"837":{"position":[[657,8]]},"1026":{"position":[[184,8]]},"1313":{"position":[[428,7]]}},"keywords":{}}],["anyon",{"_index":6523,"title":{},"content":{"1313":{"position":[[631,6]]}},"keywords":{}}],["anyth",{"_index":2098,"title":{},"content":{"362":{"position":[[633,8]]},"454":{"position":[[1054,8]]},"625":{"position":[[90,8]]},"659":{"position":[[957,8]]},"668":{"position":[[189,9]]},"699":{"position":[[508,8],[587,8]]},"752":{"position":[[553,8]]},"772":{"position":[[1279,8]]},"806":{"position":[[644,8]]},"835":{"position":[[1021,8]]},"838":{"position":[[787,8]]},"886":{"position":[[4436,8]]},"981":{"position":[[756,8]]},"985":{"position":[[312,8]]},"1088":{"position":[[655,9]]},"1257":{"position":[[129,8]]},"1313":{"position":[[559,8]]},"1321":{"position":[[294,9]]}},"keywords":{}}],["anyvalu",{"_index":4545,"title":{},"content":{"768":{"position":[[391,11]]}},"keywords":{}}],["anyway",{"_index":345,"title":{},"content":{"19":{"position":[[1086,7]]},"614":{"position":[[890,6]]},"616":{"position":[[362,7]]},"626":{"position":[[243,7]]},"740":{"position":[[315,8]]},"1126":{"position":[[872,6]]},"1164":{"position":[[444,6]]}},"keywords":{}}],["apach",{"_index":376,"title":{},"content":{"23":{"position":[[3,6]]},"837":{"position":[[70,6]]}},"keywords":{}}],["apart",{"_index":1881,"title":{},"content":{"310":{"position":[[317,5]]}},"keywords":{}}],["api",{"_index":308,"title":{"424":{"position":[[25,5]]},"431":{"position":[[40,3]]},"433":{"position":[[12,3]]},"449":{"position":[[22,4]]},"601":{"position":[[46,4]]},"613":{"position":[[25,5]]},"659":{"position":[[12,4]]},"718":{"position":[[17,4]]},"911":{"position":[[34,3]]},"1145":{"position":[[40,3]]},"1159":{"position":[[25,3]]},"1208":{"position":[[13,3]]},"1215":{"position":[[38,3]]}},"content":{"18":{"position":[[194,4]]},"24":{"position":[[80,4],[807,4]]},"27":{"position":[[207,4]]},"33":{"position":[[76,3]]},"35":{"position":[[103,4]]},"45":{"position":[[37,3],[270,3]]},"47":{"position":[[155,4],[310,4],[445,4],[714,4]]},"100":{"position":[[254,4]]},"120":{"position":[[243,3]]},"126":{"position":[[280,3]]},"128":{"position":[[278,3]]},"131":{"position":[[154,3],[437,3],[499,3],[673,3]]},"139":{"position":[[79,4]]},"155":{"position":[[105,3]]},"181":{"position":[[103,4],[143,3]]},"209":{"position":[[705,5]]},"222":{"position":[[191,4]]},"227":{"position":[[228,4]]},"245":{"position":[[71,3]]},"249":{"position":[[266,3]]},"255":{"position":[[1057,5]]},"291":{"position":[[492,3]]},"300":{"position":[[102,4]]},"303":{"position":[[248,4]]},"320":{"position":[[26,3]]},"336":{"position":[[282,3]]},"366":{"position":[[526,3]]},"381":{"position":[[458,5]]},"387":{"position":[[47,5]]},"392":{"position":[[5069,4]]},"408":{"position":[[1499,4],[1528,3],[1598,4],[3822,4],[4096,4]]},"411":{"position":[[1104,3]]},"424":{"position":[[18,3],[372,3]]},"425":{"position":[[113,3]]},"427":{"position":[[131,4],[218,4]]},"429":{"position":[[58,3]]},"433":{"position":[[52,5],[63,3],[298,3],[532,4],[598,3]]},"434":{"position":[[231,4]]},"435":{"position":[[132,3]]},"437":{"position":[[47,3]]},"438":{"position":[[291,3]]},"439":{"position":[[74,4],[291,3],[375,3],[558,3],[655,3]]},"440":{"position":[[56,3],[245,4]]},"441":{"position":[[493,4]]},"449":{"position":[[51,5]]},"450":{"position":[[808,4]]},"451":{"position":[[18,3],[121,3],[530,3],[736,4]]},"452":{"position":[[103,3],[168,3]]},"453":{"position":[[59,3]]},"454":{"position":[[627,5],[820,3],[946,5]]},"455":{"position":[[18,3],[381,3]]},"456":{"position":[[45,5]]},"457":{"position":[[427,4],[588,3]]},"458":{"position":[[482,4],[636,3],[925,3],[1091,3],[1364,3]]},"460":{"position":[[312,3],[444,3],[1003,5]]},"463":{"position":[[37,4],[230,4]]},"466":{"position":[[353,3]]},"504":{"position":[[150,3]]},"514":{"position":[[174,3]]},"521":{"position":[[91,3]]},"524":{"position":[[924,4]]},"533":{"position":[[26,3]]},"535":{"position":[[48,3],[134,4],[388,4],[709,4],[754,3]]},"546":{"position":[[144,3]]},"551":{"position":[[476,3]]},"554":{"position":[[188,3]]},"556":{"position":[[1157,4]]},"559":{"position":[[36,3]]},"560":{"position":[[220,3]]},"566":{"position":[[304,3]]},"567":{"position":[[920,3]]},"580":{"position":[[256,4]]},"581":{"position":[[288,3],[580,4]]},"590":{"position":[[247,3],[477,3]]},"593":{"position":[[26,3]]},"595":{"position":[[48,3],[134,4],[416,4],[730,4],[775,3]]},"606":{"position":[[144,3]]},"611":{"position":[[942,3]]},"612":{"position":[[932,3]]},"613":{"position":[[32,3],[949,3]]},"614":{"position":[[68,3]]},"616":{"position":[[751,4],[1037,4]]},"617":{"position":[[1667,4]]},"656":{"position":[[427,3]]},"659":{"position":[[43,3],[360,3],[696,3],[936,3]]},"660":{"position":[[45,4]]},"697":{"position":[[66,5]]},"703":{"position":[[267,3]]},"709":{"position":[[114,4],[914,4],[1213,4]]},"717":{"position":[[227,3],[398,3]]},"736":{"position":[[201,3],[500,3]]},"830":{"position":[[143,5]]},"835":{"position":[[98,4]]},"837":{"position":[[59,3]]},"839":{"position":[[356,4]]},"860":{"position":[[150,5]]},"873":{"position":[[129,3]]},"882":{"position":[[99,4],[144,3]]},"899":{"position":[[13,3]]},"904":{"position":[[482,3],[2884,4],[3033,4]]},"911":{"position":[[60,5],[453,3]]},"917":{"position":[[438,3]]},"932":{"position":[[573,4],[630,3]]},"968":{"position":[[137,3]]},"1124":{"position":[[1248,3]]},"1132":{"position":[[100,4]]},"1134":{"position":[[232,3],[367,3]]},"1139":{"position":[[26,4]]},"1140":{"position":[[21,3]]},"1143":{"position":[[638,3]]},"1145":{"position":[[26,4]]},"1149":{"position":[[377,5]]},"1159":{"position":[[24,3]]},"1177":{"position":[[221,4]]},"1204":{"position":[[222,4]]},"1206":{"position":[[67,3]]},"1207":{"position":[[60,3],[320,3],[642,4]]},"1208":{"position":[[10,3],[380,3],[1975,3]]},"1209":{"position":[[40,3]]},"1211":{"position":[[55,3]]},"1214":{"position":[[41,3],[272,3],[361,3],[742,4],[1048,4]]},"1215":{"position":[[83,3],[154,3],[303,4]]},"1216":{"position":[[25,3]]},"1232":{"position":[[18,3]]},"1242":{"position":[[82,4]]},"1244":{"position":[[55,4]]},"1272":{"position":[[43,4]]},"1274":{"position":[[495,4]]},"1278":{"position":[[691,4]]},"1279":{"position":[[882,4]]},"1282":{"position":[[50,3]]},"1292":{"position":[[248,3]]},"1301":{"position":[[917,3],[1163,3]]},"1320":{"position":[[100,5]]}},"keywords":{}}],["api"",{"_index":2958,"title":{},"content":{"452":{"position":[[58,9]]}},"keywords":{}}],["api.avoid",{"_index":1386,"title":{},"content":{"212":{"position":[[359,9]]}},"keywords":{}}],["api.indexeddb",{"_index":1181,"title":{},"content":{"162":{"position":[[219,13]]},"524":{"position":[[277,13]]},"581":{"position":[[186,13]]}},"keywords":{}}],["api/voxels/pull?chunkid=${chunkid}&cp=${checkpoint}&limit=${limit",{"_index":5570,"title":{},"content":{"1007":{"position":[[1530,77]]}},"keywords":{}}],["api/voxels/pull?chunkid=123",{"_index":5560,"title":{},"content":{"1007":{"position":[[554,29]]}},"keywords":{}}],["api/voxels/push?chunkid=123",{"_index":5561,"title":{},"content":{"1007":{"position":[[624,30]]}},"keywords":{}}],["apiduckdb",{"_index":6469,"title":{},"content":{"1299":{"position":[[576,9]]}},"keywords":{}}],["apiin",{"_index":3970,"title":{},"content":{"703":{"position":[[493,5]]}},"keywords":{}}],["apivers",{"_index":4565,"title":{},"content":{"772":{"position":[[844,11]]},"774":{"position":[[772,11]]},"1133":{"position":[[568,10]]},"1134":{"position":[[413,11]]}},"keywords":{}}],["apollo",{"_index":578,"title":{"37":{"position":[[0,7]]}},"content":{"37":{"position":[[5,6]]}},"keywords":{}}],["apolog",{"_index":6090,"title":{},"content":{"1151":{"position":[[333,9]]},"1178":{"position":[[332,9]]}},"keywords":{}}],["app",{"_index":264,"title":{"44":{"position":[[36,5]]},"128":{"position":[[30,4]]},"204":{"position":[[36,5]]},"268":{"position":[[44,4]]},"269":{"position":[[22,6]]},"270":{"position":[[38,4]]},"271":{"position":[[53,5]]},"284":{"position":[[30,4]]},"348":{"position":[[50,3]]},"359":{"position":[[45,5]]},"409":{"position":[[39,4]]},"446":{"position":[[29,3]]},"488":{"position":[[23,4]]},"495":{"position":[[27,5]]},"499":{"position":[[39,4]]},"500":{"position":[[26,4]]},"503":{"position":[[32,4]]},"532":{"position":[[28,4]]},"558":{"position":[[62,4]]},"592":{"position":[[26,4]]},"618":{"position":[[40,5]]},"629":{"position":[[25,4]]},"631":{"position":[[43,5]]},"783":{"position":[[7,4]]},"980":{"position":[[44,4]]},"1282":{"position":[[39,5]]}},"content":{"15":{"position":[[506,3]]},"18":{"position":[[436,3]]},"38":{"position":[[98,5]]},"46":{"position":[[36,3]]},"51":{"position":[[349,5]]},"59":{"position":[[219,3]]},"112":{"position":[[131,4]]},"148":{"position":[[351,5]]},"151":{"position":[[373,4]]},"172":{"position":[[204,4]]},"174":{"position":[[2737,4]]},"178":{"position":[[170,3],[428,4]]},"201":{"position":[[228,3]]},"204":{"position":[[196,3]]},"207":{"position":[[113,3]]},"215":{"position":[[336,4]]},"239":{"position":[[168,4]]},"244":{"position":[[849,3]]},"251":{"position":[[226,5]]},"253":{"position":[[81,3],[168,3]]},"254":{"position":[[103,3],[178,4]]},"262":{"position":[[54,3]]},"269":{"position":[[29,4],[112,3],[319,4]]},"270":{"position":[[88,5],[100,4]]},"271":{"position":[[91,5],[322,5]]},"273":{"position":[[261,3]]},"274":{"position":[[118,3]]},"277":{"position":[[265,3]]},"278":{"position":[[258,3]]},"280":{"position":[[225,3],[468,4]]},"284":{"position":[[43,3]]},"285":{"position":[[363,4]]},"286":{"position":[[174,3]]},"287":{"position":[[1281,5]]},"289":{"position":[[1190,3]]},"292":{"position":[[376,3]]},"294":{"position":[[220,3],[272,3]]},"300":{"position":[[22,3],[808,3]]},"301":{"position":[[703,3]]},"302":{"position":[[44,3],[566,4]]},"303":{"position":[[29,3]]},"309":{"position":[[174,3]]},"312":{"position":[[98,3]]},"314":{"position":[[1111,3]]},"330":{"position":[[21,3]]},"346":{"position":[[579,3]]},"354":{"position":[[817,3]]},"359":{"position":[[106,5]]},"360":{"position":[[529,3]]},"365":{"position":[[125,3],[507,3]]},"371":{"position":[[12,3],[316,5]]},"375":{"position":[[88,4],[179,4],[906,4],[937,3]]},"380":{"position":[[336,5]]},"384":{"position":[[264,3],[321,4]]},"388":{"position":[[440,3]]},"392":{"position":[[2094,3],[2256,3]]},"393":{"position":[[670,4]]},"399":{"position":[[120,4],[385,3]]},"403":{"position":[[244,3]]},"407":{"position":[[402,3],[538,4]]},"408":{"position":[[231,4],[1282,4],[1438,4],[1669,4],[3423,3]]},"409":{"position":[[210,4],[285,3]]},"410":{"position":[[161,4],[662,3],[1031,3],[1186,3],[1319,3],[1352,3],[1472,5],[1602,4]]},"411":{"position":[[845,5],[2093,4],[3094,4],[4049,3],[4483,4],[4829,3],[4915,4],[5511,4]]},"412":{"position":[[1522,4],[4154,3],[4213,5],[6159,3],[6338,4],[7136,3],[8239,3],[8405,3],[8482,4],[8778,4],[8953,3],[8977,3],[9414,3],[9607,3],[10099,4],[10165,3],[11036,3],[11111,4],[11189,4],[11412,3],[11475,3],[11883,3],[12095,5],[14064,3],[14709,3],[15411,4]]},"414":{"position":[[14,4],[269,4]]},"416":{"position":[[428,3]]},"418":{"position":[[123,4],[526,4],[839,3]]},"419":{"position":[[42,4],[239,4]]},"420":{"position":[[106,4],[1376,5],[1434,5]]},"421":{"position":[[314,4],[538,5],[968,4]]},"445":{"position":[[385,3],[1679,3],[1742,3],[2115,3]]},"446":{"position":[[141,4],[955,4],[1121,3]]},"447":{"position":[[205,3],[318,5],[620,3]]},"454":{"position":[[378,4]]},"458":{"position":[[38,3],[121,3]]},"460":{"position":[[135,3]]},"463":{"position":[[170,3]]},"468":{"position":[[597,3],[667,4]]},"476":{"position":[[1,4]]},"477":{"position":[[18,4]]},"478":{"position":[[9,4]]},"479":{"position":[[346,4]]},"483":{"position":[[52,3]]},"486":{"position":[[236,5]]},"489":{"position":[[645,3]]},"496":{"position":[[399,4]]},"497":{"position":[[46,5]]},"500":{"position":[[17,4],[110,3],[239,5],[439,3]]},"503":{"position":[[41,4]]},"510":{"position":[[80,4]]},"511":{"position":[[461,3]]},"524":{"position":[[1027,4]]},"535":{"position":[[331,3]]},"538":{"position":[[253,4],[650,5]]},"556":{"position":[[1613,3]]},"559":{"position":[[1600,3]]},"562":{"position":[[1029,5],[1647,3]]},"567":{"position":[[1027,5]]},"582":{"position":[[81,3]]},"584":{"position":[[237,4]]},"590":{"position":[[846,5]]},"595":{"position":[[344,3],[843,3]]},"598":{"position":[[252,4],[657,5]]},"612":{"position":[[1742,4],[1785,3]]},"617":{"position":[[1816,4],[1907,3]]},"627":{"position":[[227,3]]},"630":{"position":[[661,4]]},"632":{"position":[[2759,3]]},"636":{"position":[[12,4],[342,3]]},"660":{"position":[[17,4]]},"661":{"position":[[622,5],[1488,4]]},"662":{"position":[[82,5],[494,4],[1167,4],[1328,4]]},"690":{"position":[[253,3]]},"699":{"position":[[670,4]]},"700":{"position":[[18,3],[214,4],[829,3]]},"701":{"position":[[21,3]]},"702":{"position":[[23,4]]},"703":{"position":[[43,4],[1300,4]]},"704":{"position":[[196,4],[482,3]]},"709":{"position":[[314,4]]},"710":{"position":[[161,4]]},"715":{"position":[[241,3],[329,3]]},"716":{"position":[[382,3]]},"723":{"position":[[1462,3],[1752,3],[1902,3]]},"778":{"position":[[311,5]]},"783":{"position":[[340,5],[377,5]]},"784":{"position":[[365,5],[849,4]]},"785":{"position":[[213,4],[448,5]]},"800":{"position":[[8,3]]},"825":{"position":[[707,4]]},"829":{"position":[[1398,3],[1863,4]]},"836":{"position":[[1166,5],[1911,3]]},"838":{"position":[[678,3]]},"854":{"position":[[238,3]]},"860":{"position":[[1220,4]]},"871":{"position":[[718,4]]},"873":{"position":[[93,4]]},"875":{"position":[[1116,3],[1237,3]]},"897":{"position":[[464,5]]},"898":{"position":[[2787,4]]},"901":{"position":[[104,4]]},"902":{"position":[[698,4]]},"904":{"position":[[98,3],[2142,4],[2205,4]]},"964":{"position":[[467,4],[482,3],[514,3]]},"981":{"position":[[1303,5]]},"988":{"position":[[403,3]]},"995":{"position":[[597,3],[1050,3],[1177,3],[1360,3]]},"1009":{"position":[[733,4],[923,3]]},"1102":{"position":[[153,4]]},"1126":{"position":[[70,4]]},"1174":{"position":[[48,3]]},"1183":{"position":[[216,3],[480,4]]},"1214":{"position":[[958,3]]},"1237":{"position":[[30,3]]},"1270":{"position":[[267,4],[449,4]]},"1301":{"position":[[61,4],[97,3]]},"1316":{"position":[[21,4],[387,4]]},"1322":{"position":[[12,4]]}},"keywords":{}}],["app"",{"_index":1489,"title":{},"content":{"244":{"position":[[406,9],[1044,9],[1078,9]]}},"keywords":{}}],["app'",{"_index":1632,"title":{},"content":{"273":{"position":[[103,5]]},"275":{"position":[[103,5]]},"276":{"position":[[76,5],[348,5]]},"277":{"position":[[117,5]]},"279":{"position":[[491,5]]},"282":{"position":[[374,5]]},"285":{"position":[[267,5]]},"287":{"position":[[262,5]]},"291":{"position":[[87,5]]},"292":{"position":[[249,5]]},"1072":{"position":[[1159,5]]}},"keywords":{}}],["app.component.t",{"_index":753,"title":{},"content":{"50":{"position":[[184,16]]},"129":{"position":[[681,16]]}},"keywords":{}}],["app.get('/ev",{"_index":3596,"title":{},"content":{"612":{"position":[[1841,18]]}},"keywords":{}}],["app.get('/list",{"_index":4659,"title":{},"content":{"799":{"position":[[520,16],[752,16]]}},"keywords":{}}],["app.get('/pul",{"_index":4990,"title":{},"content":{"875":{"position":[[2070,16]]}},"keywords":{}}],["app.get('/pullstream",{"_index":5042,"title":{},"content":{"875":{"position":[[7221,22]]}},"keywords":{}}],["app.get('/push",{"_index":5018,"title":{},"content":{"875":{"position":[[4438,16]]}},"keywords":{}}],["app.listen(80",{"_index":4986,"title":{},"content":{"875":{"position":[[1190,14]]}},"keywords":{}}],["app.listen(port",{"_index":3614,"title":{},"content":{"612":{"position":[[2480,16]]}},"keywords":{}}],["app.on('readi",{"_index":3930,"title":{},"content":{"693":{"position":[[853,15]]}},"keywords":{}}],["app.th",{"_index":2844,"title":{},"content":{"420":{"position":[[1305,7]]}},"keywords":{}}],["app.use(express.json",{"_index":4985,"title":{},"content":{"875":{"position":[[1133,24]]}},"keywords":{}}],["appa",{"_index":3211,"title":{},"content":{"498":{"position":[[247,4]]}},"keywords":{}}],["appeal",{"_index":1233,"title":{},"content":{"177":{"position":[[302,9]]},"362":{"position":[[135,9]]},"387":{"position":[[421,9]]},"407":{"position":[[801,9]]}},"keywords":{}}],["appear",{"_index":3560,"title":{},"content":{"610":{"position":[[1168,6]]},"624":{"position":[[361,6]]},"751":{"position":[[1891,6]]},"847":{"position":[[16,6]]},"988":{"position":[[2746,8]]},"1300":{"position":[[743,8]]},"1307":{"position":[[338,7],[438,8]]},"1308":{"position":[[24,7]]},"1316":{"position":[[2890,6]]}},"keywords":{}}],["append",{"_index":1946,"title":{},"content":{"335":{"position":[[365,6]]},"464":{"position":[[1052,6]]},"698":{"position":[[2644,6]]},"1065":{"position":[[1546,6],[1837,6]]},"1079":{"position":[[506,6]]}},"keywords":{}}],["appl",{"_index":3940,"title":{},"content":{"697":{"position":[[116,5]]}},"keywords":{}}],["appli",{"_index":1192,"title":{},"content":{"169":{"position":[[86,8]]},"299":{"position":[[1155,8]]},"347":{"position":[[533,5]]},"362":{"position":[[1604,5]]},"409":{"position":[[148,7]]},"591":{"position":[[762,5]]},"636":{"position":[[326,7]]},"681":{"position":[[505,7]]},"682":{"position":[[35,7]]},"698":{"position":[[993,7]]},"818":{"position":[[372,5]]},"832":{"position":[[343,7]]},"886":{"position":[[4428,7]]},"937":{"position":[[93,7]]},"1009":{"position":[[66,7]]},"1140":{"position":[[224,8]]},"1301":{"position":[[1204,5]]},"1307":{"position":[[854,8]]},"1317":{"position":[[283,7]]}},"keywords":{}}],["applic",{"_index":182,"title":{"12":{"position":[[51,12]]},"76":{"position":[[45,13]]},"90":{"position":[[19,12]]},"93":{"position":[[15,11]]},"107":{"position":[[45,13]]},"115":{"position":[[33,11]]},"116":{"position":[[12,13]]},"117":{"position":[[35,13]]},"127":{"position":[[25,12]]},"142":{"position":[[41,13]]},"150":{"position":[[36,12]]},"151":{"position":[[16,12]]},"152":{"position":[[35,13]]},"173":{"position":[[24,13]]},"174":{"position":[[47,13]]},"176":{"position":[[32,11]]},"177":{"position":[[27,13]]},"178":{"position":[[35,13]]},"187":{"position":[[24,12]]},"213":{"position":[[70,12]]},"217":{"position":[[18,11]]},"221":{"position":[[18,12]]},"225":{"position":[[61,12]]},"230":{"position":[[45,13]]},"264":{"position":[[55,12]]},"278":{"position":[[42,12]]},"319":{"position":[[31,11]]},"320":{"position":[[11,13]]},"321":{"position":[[34,13]]},"332":{"position":[[23,12]]},"346":{"position":[[40,13]]},"368":{"position":[[32,13]]},"374":{"position":[[80,12]]},"378":{"position":[[37,13]]},"423":{"position":[[29,13]]},"443":{"position":[[46,12]]},"512":{"position":[[29,12]]},"522":{"position":[[22,12]]},"571":{"position":[[24,13]]},"573":{"position":[[28,11]]},"574":{"position":[[8,12]]},"1009":{"position":[[39,12]]},"1312":{"position":[[7,12]]}},"content":{"14":{"position":[[74,13]]},"15":{"position":[[81,13]]},"17":{"position":[[229,11]]},"18":{"position":[[90,13]]},"25":{"position":[[94,13]]},"26":{"position":[[294,13]]},"34":{"position":[[741,13]]},"37":{"position":[[77,12],[377,11]]},"38":{"position":[[577,11]]},"46":{"position":[[180,11]]},"47":{"position":[[366,11]]},"49":{"position":[[40,11]]},"56":{"position":[[47,11]]},"61":{"position":[[405,13]]},"64":{"position":[[208,13]]},"65":{"position":[[252,11],[631,12],[759,13],[787,13],[902,11],[1218,12],[1281,11],[1405,12],[1445,11],[1568,12],[2066,12]]},"66":{"position":[[530,12]]},"67":{"position":[[112,12]]},"68":{"position":[[156,13]]},"69":{"position":[[114,13]]},"70":{"position":[[157,13]]},"72":{"position":[[139,11]]},"73":{"position":[[152,13]]},"76":{"position":[[56,13]]},"80":{"position":[[5,12]]},"83":{"position":[[182,12],[411,12]]},"87":{"position":[[172,11]]},"88":{"position":[[147,12]]},"89":{"position":[[106,12],[277,13]]},"90":{"position":[[51,12]]},"91":{"position":[[279,12]]},"92":{"position":[[232,12]]},"93":{"position":[[49,11],[136,11]]},"98":{"position":[[127,13]]},"99":{"position":[[345,11]]},"100":{"position":[[55,13],[136,13]]},"101":{"position":[[95,13]]},"102":{"position":[[131,13]]},"105":{"position":[[166,12]]},"107":{"position":[[64,13]]},"109":{"position":[[34,13],[141,12],[202,11]]},"110":{"position":[[206,11]]},"114":{"position":[[555,13],[676,12]]},"116":{"position":[[123,12],[287,13]]},"117":{"position":[[40,12],[205,11]]},"118":{"position":[[280,12]]},"122":{"position":[[92,12],[311,12]]},"123":{"position":[[163,11]]},"125":{"position":[[95,11]]},"126":{"position":[[62,13],[318,12]]},"127":{"position":[[115,12]]},"128":{"position":[[27,12],[246,11]]},"132":{"position":[[37,11],[227,11]]},"133":{"position":[[83,12],[305,12]]},"136":{"position":[[181,12]]},"137":{"position":[[92,12]]},"138":{"position":[[292,12]]},"140":{"position":[[324,12]]},"142":{"position":[[42,12]]},"145":{"position":[[301,12]]},"146":{"position":[[267,11]]},"148":{"position":[[50,13],[198,12],[253,12],[373,13],[406,13]]},"151":{"position":[[94,12],[151,11],[388,12],[461,13]]},"152":{"position":[[8,12],[227,13]]},"153":{"position":[[114,13],[297,12]]},"156":{"position":[[224,12]]},"157":{"position":[[51,12],[313,11]]},"158":{"position":[[184,12]]},"159":{"position":[[312,12]]},"160":{"position":[[41,12]]},"161":{"position":[[44,13],[383,13]]},"164":{"position":[[71,12],[162,12]]},"165":{"position":[[417,13]]},"166":{"position":[[327,13]]},"167":{"position":[[353,13]]},"168":{"position":[[139,12]]},"169":{"position":[[255,12]]},"170":{"position":[[68,13],[156,13],[305,12],[564,12]]},"172":{"position":[[100,12]]},"173":{"position":[[22,13],[109,12],[862,12],[946,12],[1456,11],[1520,11],[1625,11],[1850,11],[2887,11],[3235,12]]},"174":{"position":[[101,13],[1245,13],[1328,13],[1876,11],[2228,12]]},"175":{"position":[[481,13],[711,13]]},"177":{"position":[[129,12],[327,13]]},"178":{"position":[[40,12],[334,11]]},"179":{"position":[[250,13],[436,12]]},"180":{"position":[[53,12]]},"183":{"position":[[78,12]]},"184":{"position":[[63,13]]},"186":{"position":[[47,13],[411,13]]},"187":{"position":[[100,12]]},"188":{"position":[[82,12],[2027,12]]},"189":{"position":[[736,12]]},"192":{"position":[[398,13]]},"198":{"position":[[67,13],[256,13],[408,12],[529,11]]},"201":{"position":[[134,11]]},"203":{"position":[[293,11]]},"204":{"position":[[319,12]]},"206":{"position":[[221,11]]},"207":{"position":[[207,12]]},"215":{"position":[[124,12],[208,11],[316,12]]},"216":{"position":[[109,12],[269,12]]},"217":{"position":[[52,11],[188,12],[323,12]]},"219":{"position":[[168,11],[375,12]]},"220":{"position":[[257,12]]},"221":{"position":[[10,12],[167,12]]},"224":{"position":[[295,12]]},"225":{"position":[[175,13]]},"226":{"position":[[224,12]]},"227":{"position":[[149,13]]},"228":{"position":[[110,12]]},"229":{"position":[[213,13]]},"230":{"position":[[47,13]]},"231":{"position":[[274,13]]},"232":{"position":[[66,13]]},"234":{"position":[[283,13]]},"239":{"position":[[116,12]]},"241":{"position":[[72,13],[473,12]]},"248":{"position":[[35,11],[129,11]]},"254":{"position":[[143,12],[530,11]]},"265":{"position":[[332,12],[866,12]]},"266":{"position":[[196,12],[525,13],[1106,13]]},"267":{"position":[[63,13],[115,12],[271,12],[1219,12],[1481,13]]},"269":{"position":[[154,13]]},"270":{"position":[[58,12]]},"271":{"position":[[231,13]]},"274":{"position":[[71,13]]},"278":{"position":[[76,13]]},"280":{"position":[[45,12]]},"282":{"position":[[43,11]]},"287":{"position":[[830,12],[1131,13]]},"288":{"position":[[82,11]]},"289":{"position":[[356,11],[1318,12],[1483,12]]},"290":{"position":[[56,13]]},"291":{"position":[[358,12]]},"292":{"position":[[91,11]]},"293":{"position":[[52,11]]},"309":{"position":[[52,13]]},"320":{"position":[[287,12]]},"321":{"position":[[28,12]]},"323":{"position":[[187,11],[561,11]]},"325":{"position":[[230,13]]},"326":{"position":[[131,12]]},"327":{"position":[[101,11]]},"338":{"position":[[50,11]]},"343":{"position":[[88,11]]},"350":{"position":[[299,12]]},"353":{"position":[[20,12],[225,12],[602,11]]},"354":{"position":[[117,13]]},"358":{"position":[[257,11]]},"362":{"position":[[182,12]]},"365":{"position":[[45,12],[184,12],[349,11],[558,12],[674,12],[716,11],[808,13],[956,13],[1129,12],[1146,12]]},"366":{"position":[[299,11]]},"367":{"position":[[51,12]]},"368":{"position":[[59,13]]},"369":{"position":[[455,11],[539,11],[790,12]]},"370":{"position":[[101,13]]},"371":{"position":[[151,13]]},"373":{"position":[[72,13],[488,12]]},"375":{"position":[[435,12],[576,12]]},"376":{"position":[[77,12],[535,12]]},"378":{"position":[[110,13]]},"379":{"position":[[226,11]]},"382":{"position":[[230,11]]},"383":{"position":[[248,12],[463,11]]},"384":{"position":[[393,11]]},"385":{"position":[[237,12]]},"386":{"position":[[93,12]]},"388":{"position":[[373,13]]},"390":{"position":[[1191,13]]},"393":{"position":[[425,12]]},"396":{"position":[[1488,13]]},"408":{"position":[[747,11]]},"410":{"position":[[1894,11]]},"412":{"position":[[6021,12]]},"419":{"position":[[833,12]]},"422":{"position":[[433,11]]},"427":{"position":[[337,11],[1054,12]]},"430":{"position":[[196,11],[871,12],[953,11]]},"432":{"position":[[1194,12]]},"434":{"position":[[416,13]]},"435":{"position":[[338,12]]},"437":{"position":[[280,13]]},"441":{"position":[[208,11],[686,13]]},"444":{"position":[[109,13]]},"445":{"position":[[342,13],[522,12],[916,12],[2211,12]]},"446":{"position":[[15,13],[57,12],[174,12],[452,12],[776,13],[861,12],[1100,13],[1236,13]]},"447":{"position":[[83,13],[455,12],[708,13]]},"453":{"position":[[79,12],[172,12],[623,11]]},"457":{"position":[[30,12]]},"462":{"position":[[257,11]]},"473":{"position":[[159,11]]},"474":{"position":[[1,12]]},"486":{"position":[[282,11]]},"489":{"position":[[67,11]]},"491":{"position":[[54,12]]},"500":{"position":[[345,13]]},"501":{"position":[[161,13]]},"502":{"position":[[92,13],[1353,12]]},"506":{"position":[[158,12]]},"510":{"position":[[39,11]]},"513":{"position":[[112,13]]},"516":{"position":[[51,12],[185,11]]},"517":{"position":[[45,12]]},"519":{"position":[[5,12],[324,11]]},"520":{"position":[[46,13]]},"521":{"position":[[562,13]]},"522":{"position":[[46,11]]},"528":{"position":[[170,12]]},"530":{"position":[[23,11],[476,12],[681,13]]},"533":{"position":[[325,13]]},"534":{"position":[[21,13],[231,11]]},"535":{"position":[[94,11]]},"540":{"position":[[74,13]]},"542":{"position":[[86,13]]},"543":{"position":[[54,11],[142,13]]},"546":{"position":[[263,12]]},"548":{"position":[[250,12]]},"550":{"position":[[363,11]]},"557":{"position":[[473,12]]},"564":{"position":[[1141,11]]},"567":{"position":[[414,11]]},"569":{"position":[[238,12]]},"571":{"position":[[40,13],[194,11],[656,13],[1414,11]]},"574":{"position":[[155,12],[712,11]]},"576":{"position":[[437,13]]},"577":{"position":[[61,12]]},"579":{"position":[[859,11]]},"584":{"position":[[5,12]]},"586":{"position":[[5,12]]},"589":{"position":[[46,12]]},"593":{"position":[[325,13]]},"594":{"position":[[19,13],[229,11]]},"595":{"position":[[94,11]]},"600":{"position":[[74,13]]},"603":{"position":[[52,11],[140,13]]},"608":{"position":[[248,12]]},"611":{"position":[[281,12]]},"613":{"position":[[385,12]]},"614":{"position":[[177,12]]},"617":{"position":[[1846,12],[2390,12]]},"618":{"position":[[26,12],[261,12],[683,11]]},"621":{"position":[[134,12]]},"623":{"position":[[143,12]]},"624":{"position":[[491,12],[802,13],[1080,13],[1195,12]]},"660":{"position":[[328,11]]},"661":{"position":[[95,13],[1456,11],[1817,13]]},"662":{"position":[[57,12],[252,12],[313,12],[389,13]]},"696":{"position":[[1860,13]]},"702":{"position":[[250,13],[504,13]]},"708":{"position":[[250,11]]},"709":{"position":[[276,11]]},"710":{"position":[[43,13],[129,12]]},"711":{"position":[[123,12],[1950,13]]},"714":{"position":[[307,11]]},"723":{"position":[[638,13],[2480,12],[2637,12]]},"776":{"position":[[345,11]]},"778":{"position":[[17,13]]},"779":{"position":[[256,13]]},"780":{"position":[[96,12],[517,11]]},"781":{"position":[[567,13]]},"782":{"position":[[11,13],[160,12],[236,12]]},"783":{"position":[[201,12],[272,12],[531,12]]},"784":{"position":[[15,13],[267,11]]},"785":{"position":[[33,12]]},"801":{"position":[[87,12],[784,11]]},"802":{"position":[[898,12]]},"821":{"position":[[144,11]]},"829":{"position":[[215,13],[945,12],[1798,11],[2985,12]]},"832":{"position":[[36,11]]},"836":{"position":[[97,13],[1303,13]]},"837":{"position":[[325,12]]},"838":{"position":[[57,13],[281,12],[342,12]]},"840":{"position":[[319,11]]},"857":{"position":[[495,13]]},"860":{"position":[[375,11]]},"871":{"position":[[332,12]]},"879":{"position":[[216,11],[438,11],[521,12],[545,11]]},"956":{"position":[[201,11]]},"981":{"position":[[1573,11]]},"995":{"position":[[516,12],[617,11]]},"1032":{"position":[[88,11]]},"1072":{"position":[[521,11],[832,11]]},"1092":{"position":[[407,12]]},"1094":{"position":[[9,11]]},"1123":{"position":[[166,11],[753,11]]},"1124":{"position":[[338,11],[889,12]]},"1183":{"position":[[158,12]]},"1196":{"position":[[29,12],[142,12]]},"1198":{"position":[[396,13]]},"1206":{"position":[[87,12],[416,12],[533,12]]},"1207":{"position":[[796,12]]},"1246":{"position":[[315,12],[635,12]]},"1250":{"position":[[281,11],[319,11],[414,12],[521,11]]},"1301":{"position":[[34,11]]},"1307":{"position":[[188,11],[556,11]]},"1313":{"position":[[482,11]]},"1314":{"position":[[41,12]]},"1319":{"position":[[631,13],[698,11]]},"1321":{"position":[[63,12]]}},"keywords":{}}],["application'",{"_index":1019,"title":{},"content":{"96":{"position":[[169,13]]},"131":{"position":[[959,13]]},"134":{"position":[[234,13]]},"147":{"position":[[314,13]]},"173":{"position":[[1787,13]]},"178":{"position":[[272,13]]},"249":{"position":[[354,13]]},"295":{"position":[[332,13]]},"367":{"position":[[262,13]]},"419":{"position":[[416,13]]},"485":{"position":[[203,13]]},"524":{"position":[[150,13]]},"525":{"position":[[701,13]]},"546":{"position":[[19,13]]},"581":{"position":[[667,13]]},"606":{"position":[[19,13]]},"613":{"position":[[1090,13]]},"906":{"position":[[718,13]]}},"keywords":{}}],["application.data",{"_index":1210,"title":{},"content":{"173":{"position":[[2690,16]]}},"keywords":{}}],["application.rxdb",{"_index":3532,"title":{},"content":{"591":{"position":[[668,16]]}},"keywords":{}}],["application.stor",{"_index":1201,"title":{},"content":{"173":{"position":[[1127,17]]}},"keywords":{}}],["application.us",{"_index":1198,"title":{},"content":{"173":{"position":[[595,15]]}},"keywords":{}}],["application/json",{"_index":4667,"title":{},"content":{"800":{"position":[[970,20],[997,18]]},"875":{"position":[[2793,20],[5557,20],[6310,19],[6346,18]]},"988":{"position":[[2605,19],[2641,18]]},"1102":{"position":[[578,19],[614,18]]}},"keywords":{}}],["applications.bett",{"_index":1214,"title":{},"content":{"174":{"position":[[684,19]]}},"keywords":{}}],["applications.compress",{"_index":6030,"title":{},"content":{"1132":{"position":[[1039,25]]}},"keywords":{}}],["applications.memori",{"_index":3285,"title":{},"content":{"524":{"position":[[477,19]]}},"keywords":{}}],["applications.rxdb",{"_index":6376,"title":{},"content":{"1284":{"position":[[75,17]]}},"keywords":{}}],["applications—lead",{"_index":3151,"title":{},"content":{"483":{"position":[[1245,20]]}},"keywords":{}}],["approach",{"_index":732,"title":{"122":{"position":[[14,9]]},"133":{"position":[[14,9]]},"157":{"position":[[14,9]]},"164":{"position":[[14,9]]},"183":{"position":[[14,9]]},"191":{"position":[[14,9]]},"274":{"position":[[12,9]]},"327":{"position":[[14,9]]},"338":{"position":[[14,9]]},"413":{"position":[[41,11]]},"516":{"position":[[12,9]]},"584":{"position":[[14,9]]},"630":{"position":[[36,10]]}},"content":{"47":{"position":[[523,8]]},"51":{"position":[[61,8]]},"55":{"position":[[29,8]]},"64":{"position":[[67,8]]},"68":{"position":[[74,8]]},"91":{"position":[[166,8]]},"96":{"position":[[145,8]]},"99":{"position":[[149,8]]},"103":{"position":[[121,8]]},"116":{"position":[[178,9]]},"122":{"position":[[59,9]]},"126":{"position":[[143,9]]},"133":{"position":[[55,9]]},"156":{"position":[[188,8]]},"157":{"position":[[32,9]]},"161":{"position":[[350,8]]},"164":{"position":[[52,9]]},"170":{"position":[[217,9]]},"172":{"position":[[214,8]]},"173":{"position":[[1030,8]]},"174":{"position":[[358,8],[753,8]]},"183":{"position":[[31,9]]},"186":{"position":[[272,9]]},"191":{"position":[[22,8]]},"198":{"position":[[104,9]]},"203":{"position":[[78,9]]},"205":{"position":[[91,8]]},"219":{"position":[[264,8]]},"226":{"position":[[114,8]]},"231":{"position":[[21,9]]},"233":{"position":[[181,8]]},"241":{"position":[[606,8]]},"249":{"position":[[306,8]]},"260":{"position":[[107,9]]},"262":{"position":[[101,8]]},"266":{"position":[[251,8]]},"273":{"position":[[72,9]]},"274":{"position":[[17,8]]},"279":{"position":[[65,8]]},"280":{"position":[[163,9]]},"289":{"position":[[1637,8]]},"298":{"position":[[303,8]]},"299":{"position":[[346,9],[867,9],[1457,8]]},"302":{"position":[[343,8]]},"313":{"position":[[24,8]]},"322":{"position":[[114,8]]},"323":{"position":[[167,9]]},"331":{"position":[[372,9]]},"335":{"position":[[831,9]]},"338":{"position":[[22,8]]},"352":{"position":[[371,8]]},"353":{"position":[[765,8]]},"354":{"position":[[867,8],[1019,8]]},"356":{"position":[[604,8]]},"358":{"position":[[137,9]]},"362":{"position":[[447,8]]},"372":{"position":[[238,8]]},"380":{"position":[[301,8]]},"382":{"position":[[109,8]]},"407":{"position":[[341,8]]},"411":{"position":[[293,8],[3285,8]]},"412":{"position":[[15,8],[301,10],[831,10],[1953,8],[3458,10],[6594,8],[14940,10]]},"418":{"position":[[549,11]]},"420":{"position":[[636,11]]},"444":{"position":[[832,11]]},"445":{"position":[[416,9]]},"447":{"position":[[126,9]]},"476":{"position":[[42,8]]},"483":{"position":[[33,8],[1172,8]]},"485":{"position":[[171,8]]},"491":{"position":[[1157,9]]},"495":{"position":[[100,9]]},"496":{"position":[[681,8]]},"497":{"position":[[203,8],[727,9]]},"502":{"position":[[231,9],[298,9]]},"504":{"position":[[1431,8]]},"510":{"position":[[260,9]]},"515":{"position":[[351,8]]},"521":{"position":[[611,9]]},"525":{"position":[[19,8]]},"540":{"position":[[107,10]]},"542":{"position":[[937,8]]},"555":{"position":[[883,8]]},"561":{"position":[[123,8]]},"563":{"position":[[106,10]]},"567":{"position":[[881,11]]},"575":{"position":[[331,9]]},"576":{"position":[[25,10]]},"582":{"position":[[33,9]]},"585":{"position":[[132,8]]},"614":{"position":[[708,8]]},"632":{"position":[[608,11]]},"634":{"position":[[15,9]]},"635":{"position":[[238,9]]},"642":{"position":[[118,8]]},"686":{"position":[[847,9]]},"688":{"position":[[144,8],[495,8]]},"723":{"position":[[1679,8]]},"774":{"position":[[847,8]]},"801":{"position":[[712,8]]},"802":{"position":[[704,8]]},"831":{"position":[[308,10]]},"838":{"position":[[997,8]]},"839":{"position":[[255,8]]},"903":{"position":[[241,8]]},"912":{"position":[[506,8]]},"1072":{"position":[[1484,8]]},"1132":{"position":[[459,8]]},"1147":{"position":[[93,10],[382,8]]},"1257":{"position":[[31,9]]}},"keywords":{}}],["approach.custom",{"_index":1383,"title":{},"content":{"212":{"position":[[183,15]]}},"keywords":{}}],["appropri",{"_index":1148,"title":{},"content":{"146":{"position":[[294,11]]},"162":{"position":[[776,11]]},"189":{"position":[[666,11]]},"192":{"position":[[286,11]]},"274":{"position":[[350,13]]},"298":{"position":[[927,14]]},"376":{"position":[[469,11]]},"397":{"position":[[1592,11]]},"430":{"position":[[150,12]]},"525":{"position":[[667,11]]},"1085":{"position":[[3333,11]]}},"keywords":{}}],["approv",{"_index":1748,"title":{},"content":{"299":{"position":[[404,10]]},"497":{"position":[[376,9]]}},"keywords":{}}],["approx",{"_index":1739,"title":{},"content":{"299":{"position":[[219,7]]}},"keywords":{}}],["approxim",{"_index":1737,"title":{},"content":{"299":{"position":[[142,11]]},"394":{"position":[[1711,13]]},"396":{"position":[[220,11],[620,11]]}},"keywords":{}}],["apps"",{"_index":1483,"title":{},"content":{"244":{"position":[[268,10]]}},"keywords":{}}],["apps.offlin",{"_index":4789,"title":{},"content":{"838":{"position":[[564,12]]}},"keywords":{}}],["apps.resili",{"_index":5244,"title":{},"content":{"902":{"position":[[547,15]]}},"keywords":{}}],["apps/plugin",{"_index":6362,"title":{},"content":{"1280":{"position":[[398,11]]}},"keywords":{}}],["appstor",{"_index":3965,"title":{},"content":{"702":{"position":[[816,8]]}},"keywords":{}}],["appsync",{"_index":320,"title":{},"content":{"19":{"position":[[155,7],[480,7]]}},"keywords":{}}],["apps—no",{"_index":3144,"title":{},"content":{"483":{"position":[[396,7]]}},"keywords":{}}],["appwrit",{"_index":4618,"title":{"859":{"position":[[5,8]]},"860":{"position":[[29,10]]},"861":{"position":[[14,8]]},"862":{"position":[[22,8]]},"863":{"position":[[19,8]]}},"content":{"793":{"position":[[840,8]]},"860":{"position":[[1,8],[488,8],[902,8]]},"861":{"position":[[24,8],[56,8],[236,8],[279,8],[827,8],[931,8],[983,8],[1022,8],[1103,8],[1126,8],[1172,8],[1239,8],[1399,8],[1472,9],[1573,8],[1855,8],[2219,8],[2240,8]]},"862":{"position":[[29,8],[132,8],[168,8],[195,8],[278,10],[471,11],[912,8],[929,8],[1181,8],[1360,8]]},"863":{"position":[[1,8],[191,8],[256,8],[779,8]]}},"keywords":{}}],["appwrite/appwrite:1.6.1",{"_index":4898,"title":{},"content":{"861":{"position":[[721,23]]}},"keywords":{}}],["appwrite’",{"_index":4891,"title":{},"content":{"860":{"position":[[579,10],[1132,10]]}},"keywords":{}}],["app’",{"_index":1733,"title":{"301":{"position":[[13,5]]}},"content":{"298":{"position":[[907,5]]},"567":{"position":[[1120,5]]}},"keywords":{}}],["arbitrari",{"_index":1593,"title":{},"content":{"262":{"position":[[447,9]]},"901":{"position":[[138,9]]},"1085":{"position":[[1089,9]]}},"keywords":{}}],["architect",{"_index":2777,"title":{},"content":{"412":{"position":[[15381,12]]}},"keywords":{}}],["architectur",{"_index":638,"title":{"871":{"position":[[0,12]]},"897":{"position":[[0,12]]},"902":{"position":[[59,13]]}},"content":{"40":{"position":[[431,13]]},"96":{"position":[[183,12]]},"113":{"position":[[199,14]]},"153":{"position":[[231,12]]},"181":{"position":[[241,12]]},"326":{"position":[[51,12]]},"381":{"position":[[518,13]]},"383":{"position":[[51,13]]},"408":{"position":[[4333,13]]},"410":{"position":[[1811,13]]},"411":{"position":[[42,13],[1133,12]]},"412":{"position":[[2740,13]]},"483":{"position":[[809,13]]},"574":{"position":[[55,12]]},"582":{"position":[[619,13]]},"630":{"position":[[18,13]]},"644":{"position":[[625,12]]},"860":{"position":[[1104,13]]},"871":{"position":[[37,13]]},"903":{"position":[[743,13]]},"1094":{"position":[[50,12]]},"1124":{"position":[[1992,13]]},"1295":{"position":[[296,13]]}},"keywords":{}}],["archiv",{"_index":2987,"title":{},"content":{"458":{"position":[[978,9]]}},"keywords":{}}],["area",{"_index":1652,"title":{},"content":{"280":{"position":[[130,4]]},"292":{"position":[[69,4]]},"410":{"position":[[1167,6]]}},"keywords":{}}],["aren't",{"_index":951,"title":{"67":{"position":[[30,6]]}},"content":{"535":{"position":[[1105,6]]},"595":{"position":[[1182,6]]}},"keywords":{}}],["arg",{"_index":4128,"title":{},"content":{"747":{"position":[[207,5],[265,5],[325,5]]},"885":{"position":[[1491,4]]},"910":{"position":[[412,8]]}},"keywords":{}}],["args.checkpoint",{"_index":5093,"title":{},"content":{"885":{"position":[[1518,15],[1582,15]]}},"keywords":{}}],["args.checkpoint.id",{"_index":5094,"title":{},"content":{"885":{"position":[[1536,18]]}},"keywords":{}}],["args.checkpoint.updatedat",{"_index":5096,"title":{},"content":{"885":{"position":[[1600,25]]}},"keywords":{}}],["args.limit",{"_index":5109,"title":{},"content":{"885":{"position":[[2405,12]]}},"keywords":{}}],["arguabl",{"_index":2654,"title":{},"content":{"412":{"position":[[552,8]]}},"keywords":{}}],["argument",{"_index":3977,"title":{},"content":{"705":{"position":[[420,9]]},"749":{"position":[[3948,8],[4027,9],[4135,9],[4300,9]]},"1125":{"position":[[509,8]]}},"keywords":{}}],["aris",{"_index":1113,"title":{},"content":{"134":{"position":[[40,5]]},"279":{"position":[[311,5]]},"412":{"position":[[1550,5]]},"582":{"position":[[489,5]]},"634":{"position":[[449,6]]},"908":{"position":[[78,5]]},"987":{"position":[[139,6]]},"990":{"position":[[745,5]]},"1072":{"position":[[1848,6]]}},"keywords":{}}],["around",{"_index":371,"title":{},"content":{"22":{"position":[[198,6]]},"24":{"position":[[540,6]]},"47":{"position":[[131,6]]},"208":{"position":[[115,7]]},"266":{"position":[[790,6]]},"299":{"position":[[1414,6]]},"354":{"position":[[968,6]]},"392":{"position":[[3069,6]]},"394":{"position":[[1627,6]]},"408":{"position":[[1174,6],[2933,6],[4860,6]]},"419":{"position":[[47,7],[1671,6]]},"421":{"position":[[582,6]]},"427":{"position":[[1513,6]]},"432":{"position":[[320,6]]},"435":{"position":[[265,6]]},"490":{"position":[[22,6]]},"510":{"position":[[775,6]]},"514":{"position":[[299,6]]},"574":{"position":[[77,6]]},"595":{"position":[[173,6]]},"631":{"position":[[238,7]]},"632":{"position":[[35,6]]},"717":{"position":[[477,6]]},"734":{"position":[[41,6]]},"745":{"position":[[45,6]]},"746":{"position":[[104,6]]},"784":{"position":[[394,6]]},"785":{"position":[[114,7]]},"890":{"position":[[962,7]]},"1123":{"position":[[347,6]]},"1154":{"position":[[33,6]]},"1157":{"position":[[155,6]]},"1184":{"position":[[286,6],[321,6]]},"1198":{"position":[[170,6]]},"1246":{"position":[[47,6],[391,6],[1278,6],[1680,6]]},"1286":{"position":[[363,6]]},"1287":{"position":[[409,6]]},"1288":{"position":[[369,6]]}},"keywords":{}}],["arr",{"_index":603,"title":{},"content":{"38":{"position":[[1005,5]]}},"keywords":{}}],["array",{"_index":1479,"title":{"813":{"position":[[13,6]]}},"content":{"244":{"position":[[177,5],[225,5]]},"315":{"position":[[863,5]]},"350":{"position":[[75,6]]},"390":{"position":[[535,5]]},"391":{"position":[[873,5]]},"392":{"position":[[1476,5],[1655,8]]},"426":{"position":[[243,7]]},"493":{"position":[[450,5]]},"682":{"position":[[294,5]]},"690":{"position":[[381,5]]},"749":{"position":[[1594,5],[4066,5],[4401,5],[4652,5],[9556,5],[10914,5],[13902,5],[15923,5],[16963,5],[17064,5],[18533,5],[18640,6],[19166,6]]},"808":{"position":[[478,6],[637,8]]},"813":{"position":[[160,8]]},"875":{"position":[[1786,5],[1996,6],[3672,5],[4133,6]]},"888":{"position":[[245,6],[965,5]]},"920":{"position":[[12,5]]},"944":{"position":[[169,6]]},"945":{"position":[[110,6]]},"947":{"position":[[145,6]]},"983":{"position":[[493,5],[599,5]]},"984":{"position":[[578,5]]},"988":{"position":[[2716,5],[2819,6]]},"1022":{"position":[[214,6],[234,6]]},"1055":{"position":[[118,5]]},"1074":{"position":[[515,5]]},"1080":{"position":[[636,8]]},"1116":{"position":[[572,5]]},"1321":{"position":[[307,6]]}},"keywords":{}}],["array<string>",{"_index":4360,"title":{},"content":{"749":{"position":[[17228,19]]}},"keywords":{}}],["array(5).fill(0).map((_",{"_index":2382,"title":{},"content":{"397":{"position":[[2042,24]]},"403":{"position":[[883,24]]}},"keywords":{}}],["array(5).fill(0).map(async",{"_index":2395,"title":{},"content":{"398":{"position":[[852,26],[2138,26]]}},"keywords":{}}],["array(navigator.hardwareconcurr",{"_index":2262,"title":{},"content":{"392":{"position":[[3861,36]]}},"keywords":{}}],["array.<rxdocument>",{"_index":4696,"title":{},"content":{"813":{"position":[[465,24]]}},"keywords":{}}],["array.from(candidates).map(doc",{"_index":2409,"title":{},"content":{"398":{"position":[[1466,30],[2619,30]]}},"keywords":{}}],["array.from(output.data",{"_index":2225,"title":{},"content":{"391":{"position":[[727,24]]}},"keywords":{}}],["array.pullstream",{"_index":5443,"title":{},"content":{"983":{"position":[[715,16]]}},"keywords":{}}],["array.reduc",{"_index":6294,"title":{},"content":{"1250":{"position":[[547,14]]}},"keywords":{}}],["arraybuff",{"_index":6192,"title":{},"content":{"1208":{"position":[[207,11]]}},"keywords":{}}],["arriv",{"_index":752,"title":{},"content":{"50":{"position":[[133,8]]},"379":{"position":[[284,7]]},"632":{"position":[[342,6]]}},"keywords":{}}],["articl",{"_index":1435,"title":{"242":{"position":[[10,8]]}},"content":{"396":{"position":[[1878,8]]},"404":{"position":[[720,7]]},"405":{"position":[[76,7]]},"461":{"position":[[1412,7]]},"470":{"position":[[482,7]]},"501":{"position":[[251,7]]},"1302":{"position":[[158,7]]}},"keywords":{}}],["articleshared/lik",{"_index":3688,"title":{},"content":{"628":{"position":[[45,18]]}},"keywords":{}}],["artifici",{"_index":1791,"title":{},"content":{"301":{"position":[[620,12]]}},"keywords":{}}],["asc",{"_index":818,"title":{},"content":{"54":{"position":[[186,5]]},"130":{"position":[[541,5]]},"143":{"position":[[481,5],[662,5]]},"398":{"position":[[1302,5],[2495,5]]},"580":{"position":[[561,5]]},"829":{"position":[[2442,5],[3358,5]]},"1056":{"position":[[246,6]]},"1249":{"position":[[546,5]]}},"keywords":{}}],["ascend",{"_index":2320,"title":{},"content":{"394":{"position":[[1030,9]]}},"keywords":{}}],["ask",{"_index":1749,"title":{},"content":{"299":{"position":[[482,5]]},"390":{"position":[[611,6]]},"412":{"position":[[12881,4]]},"669":{"position":[[42,3]]},"715":{"position":[[225,3]]},"800":{"position":[[777,5]]},"1249":{"position":[[10,3]]}},"keywords":{}}],["aspect",{"_index":1016,"title":{},"content":{"95":{"position":[[23,6]]},"184":{"position":[[32,6]]},"218":{"position":[[23,6]]},"270":{"position":[[44,6]]},"282":{"position":[[170,7]]},"369":{"position":[[52,7]]},"620":{"position":[[131,7]]},"876":{"position":[[139,7]]}},"keywords":{}}],["assembl",{"_index":3810,"title":{},"content":{"662":{"position":[[1544,8]]},"710":{"position":[[1485,8]]},"838":{"position":[[1861,8]]}},"keywords":{}}],["assess",{"_index":1767,"title":{},"content":{"300":{"position":[[4,6]]},"430":{"position":[[562,6]]},"441":{"position":[[254,6]]},"497":{"position":[[540,9]]}},"keywords":{}}],["asset",{"_index":1266,"title":{},"content":{"188":{"position":[[1887,6],[1933,7]]}},"keywords":{}}],["assign",{"_index":2206,"title":{},"content":{"390":{"position":[[1548,7]]},"429":{"position":[[206,11]]},"441":{"position":[[183,12]]},"468":{"position":[[180,11]]},"751":{"position":[[244,9]]},"923":{"position":[[40,8]]},"1040":{"position":[[36,8]]},"1115":{"position":[[533,10]]}},"keywords":{}}],["associ",{"_index":922,"title":{},"content":{"65":{"position":[[1105,10]]},"223":{"position":[[380,10]]},"265":{"position":[[576,10]]},"369":{"position":[[1157,10]]},"412":{"position":[[409,10]]},"419":{"position":[[1328,9]]},"723":{"position":[[752,10]]}},"keywords":{}}],["assum",{"_index":2720,"title":{},"content":{"412":{"position":[[7342,6]]},"419":{"position":[[176,6]]},"617":{"position":[[1871,6]]},"696":{"position":[[1114,6]]},"697":{"position":[[538,6]]},"729":{"position":[[181,6]]},"756":{"position":[[264,7]]},"796":{"position":[[1180,6]]},"886":{"position":[[1594,6]]},"902":{"position":[[657,9]]},"961":{"position":[[157,7]]},"982":{"position":[[726,8]]},"988":{"position":[[3989,7]]},"1202":{"position":[[220,7]]},"1300":{"position":[[811,6]]},"1307":{"position":[[52,7]]},"1308":{"position":[[239,7]]},"1314":{"position":[[60,7]]}},"keywords":{}}],["assumedmasterst",{"_index":4485,"title":{},"content":{"756":{"position":[[137,18]]},"875":{"position":[[3857,19],[3946,18]]},"885":{"position":[[937,19]]},"983":{"position":[[508,18]]},"1106":{"position":[[460,18]]}},"keywords":{}}],["assumpt",{"_index":3937,"title":{},"content":{"696":{"position":[[1614,11]]},"700":{"position":[[451,11]]}},"keywords":{}}],["assur",{"_index":3161,"title":{},"content":{"489":{"position":[[769,7]]},"571":{"position":[[1822,6]]}},"keywords":{}}],["asymmetr",{"_index":4018,"title":{"716":{"position":[[0,10]]}},"content":{"716":{"position":[[154,10],[199,10],[307,10]]}},"keywords":{}}],["async",{"_index":167,"title":{"54":{"position":[[26,5]]},"130":{"position":[[16,5]]},"143":{"position":[[4,5]]}},"content":{"11":{"position":[[678,5]]},"51":{"position":[[635,5]]},"130":{"position":[[22,5],[181,5],[602,5]]},"143":{"position":[[11,5],[93,5],[385,5]]},"188":{"position":[[888,5]]},"209":{"position":[[199,5],[728,5],[994,5]]},"255":{"position":[[546,5],[1080,5],[1329,5]]},"314":{"position":[[432,5]]},"315":{"position":[[383,5]]},"334":{"position":[[284,5]]},"335":{"position":[[610,5]]},"391":{"position":[[562,5]]},"392":{"position":[[2758,5],[3558,5],[4029,5],[4711,5]]},"397":{"position":[[1799,5]]},"398":{"position":[[679,5],[1925,5]]},"412":{"position":[[5059,5],[5157,5]]},"427":{"position":[[116,5],[203,5]]},"439":{"position":[[385,5]]},"460":{"position":[[1299,5]]},"480":{"position":[[290,5]]},"482":{"position":[[380,5]]},"493":{"position":[[13,5],[199,6]]},"554":{"position":[[805,5]]},"555":{"position":[[172,6]]},"556":{"position":[[336,5]]},"562":{"position":[[120,6]]},"563":{"position":[[421,6]]},"564":{"position":[[394,6]]},"579":{"position":[[293,5]]},"598":{"position":[[393,5]]},"632":{"position":[[1171,5],[2174,5],[2374,5],[2511,5]]},"672":{"position":[[1,5]]},"673":{"position":[[44,5]]},"674":{"position":[[315,5]]},"693":{"position":[[869,5]]},"711":{"position":[[1513,5]]},"740":{"position":[[603,5]]},"749":{"position":[[7788,5]]},"752":{"position":[[525,5]]},"754":{"position":[[262,5],[408,5],[567,5]]},"765":{"position":[[79,5]]},"767":{"position":[[501,5],[897,5]]},"768":{"position":[[493,5],[901,5]]},"769":{"position":[[448,5],[868,5]]},"829":{"position":[[591,5],[1495,5]]},"875":{"position":[[3142,5],[6186,5]]},"888":{"position":[[569,5]]},"889":{"position":[[599,5]]},"907":{"position":[[329,5]]},"930":{"position":[[65,7]]},"988":{"position":[[2416,5],[3515,5]]},"1007":{"position":[[1470,5],[1634,5]]},"1020":{"position":[[463,5]]},"1022":{"position":[[566,5]]},"1023":{"position":[[222,5]]},"1024":{"position":[[308,5]]},"1033":{"position":[[584,5],[815,5]]},"1105":{"position":[[1090,5],[1130,5]]},"1115":{"position":[[794,6]]},"1148":{"position":[[884,5]]},"1164":{"position":[[642,7]]},"1173":{"position":[[266,5]]},"1220":{"position":[[269,5]]},"1278":{"position":[[685,5]]},"1284":{"position":[[349,5],[380,5]]},"1311":{"position":[[853,5],[1397,5]]}},"keywords":{}}],["async">",{"_index":822,"title":{},"content":{"54":{"position":[[257,15]]}},"keywords":{}}],["async(param",{"_index":6058,"title":{},"content":{"1140":{"position":[[677,13]]}},"keywords":{}}],["async.mj",{"_index":6344,"title":{},"content":{"1276":{"position":[[776,11]]}},"keywords":{}}],["async/await",{"_index":2962,"title":{},"content":{"452":{"position":[[784,11]]},"521":{"position":[[154,11]]}},"keywords":{}}],["asynchron",{"_index":286,"title":{},"content":{"17":{"position":[[36,12]]},"129":{"position":[[375,12]]},"437":{"position":[[122,12]]},"445":{"position":[[1360,12]]},"450":{"position":[[783,12]]},"451":{"position":[[541,12]]},"452":{"position":[[228,12]]},"453":{"position":[[293,12],[359,12]]},"533":{"position":[[223,12]]},"535":{"position":[[213,12]]},"560":{"position":[[207,12]]},"566":{"position":[[711,12]]},"593":{"position":[[223,12]]},"595":{"position":[[226,12]]},"659":{"position":[[368,12]]},"751":{"position":[[726,12]]},"770":{"position":[[294,13]]},"960":{"position":[[32,12]]},"1208":{"position":[[475,12]]},"1246":{"position":[[753,12]]}},"keywords":{}}],["asyncpip",{"_index":813,"title":{},"content":{"54":{"position":[[48,10]]}},"keywords":{}}],["asyncstorag",{"_index":104,"title":{"9":{"position":[[0,13]]},"10":{"position":[[0,12]]},"437":{"position":[[0,12]]},"835":{"position":[[0,13]]}},"content":{"8":{"position":[[71,12]]},"9":{"position":[[21,13],[153,12],[213,16],[325,14]]},"10":{"position":[[36,13],[82,12]]},"437":{"position":[[34,12],[200,12]]},"659":{"position":[[172,13]]},"835":{"position":[[1,12],[144,12],[537,12],[733,12],[792,12],[991,12]]},"837":{"position":[[1122,12],[1157,12]]},"841":{"position":[[16,12]]},"1316":{"position":[[3619,13]]}},"keywords":{}}],["asyncstorage.getitem('mykey",{"_index":4771,"title":{},"content":{"835":{"position":[[505,30]]}},"keywords":{}}],["asyncstoragedown",{"_index":137,"title":{},"content":{"10":{"position":[[219,16]]}},"keywords":{}}],["at1",{"_index":4299,"title":{},"content":{"749":{"position":[[12775,3]]}},"keywords":{}}],["atla",{"_index":574,"title":{},"content":{"36":{"position":[[383,5]]},"872":{"position":[[319,5],[456,5]]}},"keywords":{}}],["atom",{"_index":2031,"title":{"1048":{"position":[[30,6]]}},"content":{"354":{"position":[[1321,9]]},"412":{"position":[[14627,6]]},"682":{"position":[[211,6]]},"705":{"position":[[1000,6]]},"765":{"position":[[27,9]]},"1022":{"position":[[33,6]]},"1048":{"position":[[289,6]]},"1304":{"position":[[93,10],[1601,6]]},"1324":{"position":[[848,6]]}},"keywords":{}}],["attach",{"_index":3367,"title":{"720":{"position":[[10,12]]},"754":{"position":[[10,12]]},"792":{"position":[[0,10]]},"800":{"position":[[37,11]]},"914":{"position":[[0,11]]},"915":{"position":[[8,11]]},"916":{"position":[[7,11]]},"1004":{"position":[[0,10]]},"1081":{"position":[[0,12]]}},"content":{"556":{"position":[[544,12],[632,12],[659,11],[897,10],[1250,11],[1290,11]]},"612":{"position":[[865,9]]},"647":{"position":[[326,11],[357,12]]},"648":{"position":[[206,12]]},"649":{"position":[[162,12]]},"720":{"position":[[14,11],[81,11],[192,12],[239,10]]},"749":{"position":[[998,10],[12786,12],[13674,11],[23259,12]]},"754":{"position":[[330,11],[628,10]]},"792":{"position":[[1,10],[205,12],[316,10]]},"793":{"position":[[1031,11]]},"800":{"position":[[638,11],[688,10],[854,10]]},"838":{"position":[[3376,11]]},"915":{"position":[[15,12],[48,11]]},"916":{"position":[[20,12],[61,11],[204,12],[251,10]]},"917":{"position":[[9,10],[68,11],[122,10],[208,10],[292,10],[346,10]]},"918":{"position":[[85,10]]},"919":{"position":[[58,10],[92,10]]},"920":{"position":[[25,11],[63,11]]},"921":{"position":[[48,11],[101,10],[210,11],[234,11]]},"922":{"position":[[5,11]]},"923":{"position":[[26,10]]},"924":{"position":[[25,11]]},"925":{"position":[[27,11]]},"926":{"position":[[31,10]]},"927":{"position":[[17,11],[191,11]]},"928":{"position":[[28,10]]},"929":{"position":[[13,11],[75,10]]},"930":{"position":[[80,10]]},"931":{"position":[[80,10]]},"932":{"position":[[74,10],[188,10],[225,11],[345,11],[404,11],[456,11],[884,10],[1256,12],[1419,11]]},"934":{"position":[[427,12],[476,11]]},"937":{"position":[[42,12]]},"1004":{"position":[[1,10],[196,11],[335,10],[408,10],[431,11],[496,11],[598,11],[764,12]]},"1051":{"position":[[390,11]]},"1074":{"position":[[637,11]]},"1081":{"position":[[8,11],[59,11]]},"1132":{"position":[[1316,11],[1390,11]]},"1143":{"position":[[254,11]]},"1181":{"position":[[21,11],[53,11]]},"1271":{"position":[[386,10]]},"1282":{"position":[[94,11],[194,11]]}},"keywords":{}}],["attachment'",{"_index":5307,"title":{},"content":{"930":{"position":[[38,12]]},"931":{"position":[[38,12]]},"932":{"position":[[38,12]]}},"keywords":{}}],["attachment.getdata",{"_index":5308,"title":{},"content":{"930":{"position":[[149,21]]}},"keywords":{}}],["attachment.getdatabase64",{"_index":5311,"title":{},"content":{"931":{"position":[[159,27]]}},"keywords":{}}],["attachment.getstringdata",{"_index":5313,"title":{},"content":{"932":{"position":[[149,27]]}},"keywords":{}}],["attachment.remov",{"_index":5305,"title":{},"content":{"929":{"position":[[131,20]]}},"keywords":{}}],["attachments.compress",{"_index":4144,"title":{},"content":{"749":{"position":[[956,23]]}},"keywords":{}}],["attachments.data",{"_index":4791,"title":{},"content":{"838":{"position":[[932,16]]},"1171":{"position":[[21,16]]}},"keywords":{}}],["attachments.lik",{"_index":4821,"title":{},"content":{"845":{"position":[[37,16]]}},"keywords":{}}],["attachments.when",{"_index":6106,"title":{},"content":{"1162":{"position":[[21,16]]}},"keywords":{}}],["attachmentsbig",{"_index":6179,"title":{},"content":{"1199":{"position":[[89,14]]}},"keywords":{}}],["attachmentsth",{"_index":5548,"title":{},"content":{"1004":{"position":[[388,14]]}},"keywords":{}}],["attack",{"_index":3380,"title":{},"content":{"556":{"position":[[1888,8],[1975,9]]},"881":{"position":[[320,6]]},"1110":{"position":[[70,8]]}},"keywords":{}}],["attempt",{"_index":1859,"title":{},"content":{"304":{"position":[[133,7]]},"908":{"position":[[141,7]]},"943":{"position":[[32,8]]}},"keywords":{}}],["attent",{"_index":3251,"title":{},"content":{"513":{"position":[[52,9]]}},"keywords":{}}],["attract",{"_index":1070,"title":{},"content":{"118":{"position":[[344,10]]},"267":{"position":[[1404,10]]},"295":{"position":[[169,10]]}},"keywords":{}}],["attribut",{"_index":2953,"title":{},"content":{"450":{"position":[[250,9]]},"457":{"position":[[384,10]]},"749":{"position":[[20204,9],[20370,9],[20638,9],[20895,9]]},"766":{"position":[[179,10]]},"810":{"position":[[95,9]]},"818":{"position":[[433,9]]},"861":{"position":[[1220,11],[1271,10],[1434,11],[1514,10],[1562,10]]},"863":{"position":[[765,10],[848,11],[955,10]]},"934":{"position":[[177,10]]},"1043":{"position":[[22,10],[128,9]]},"1074":{"position":[[494,9],[572,10]]},"1079":{"position":[[268,10]]},"1081":{"position":[[71,9]]},"1085":{"position":[[377,10]]},"1140":{"position":[[445,10]]}},"keywords":{}}],["attributes/method",{"_index":5302,"title":{},"content":{"922":{"position":[[90,19]]}},"keywords":{}}],["audienc",{"_index":2807,"title":{},"content":{"419":{"position":[[1275,9]]}},"keywords":{}}],["audio",{"_index":2182,"title":{},"content":{"390":{"position":[[240,6],[952,5]]},"614":{"position":[[335,6]]},"901":{"position":[[121,6]]}},"keywords":{}}],["augment",{"_index":2713,"title":{},"content":{"412":{"position":[[6614,12]]},"432":{"position":[[1084,7]]}},"keywords":{}}],["auth",{"_index":1536,"title":{"848":{"position":[[0,4]]},"1104":{"position":[[0,4]]}},"content":{"245":{"position":[[114,4]]},"412":{"position":[[13069,4]]},"749":{"position":[[16578,4]]},"841":{"position":[[853,4]]},"880":{"position":[[18,4],[156,4]]},"882":{"position":[[243,4]]},"1104":{"position":[[163,4],[263,4],[331,4]]},"1105":{"position":[[147,4],[497,4],[1229,4]]},"1148":{"position":[[329,6]]}},"keywords":{}}],["auth_token",{"_index":5088,"title":{},"content":{"885":{"position":[[1305,11]]}},"keywords":{}}],["authdata.data.userid",{"_index":5956,"title":{},"content":{"1105":{"position":[[668,20]]}},"keywords":{}}],["authent",{"_index":305,"title":{"701":{"position":[[16,15]]}},"content":{"18":{"position":[[160,15]]},"21":{"position":[[87,15]]},"29":{"position":[[288,15]]},"117":{"position":[[161,15]]},"206":{"position":[[89,14]]},"253":{"position":[[104,15]]},"377":{"position":[[347,14]]},"701":{"position":[[243,14]]},"840":{"position":[[203,15],[368,14],[413,14]]},"846":{"position":[[474,14]]},"848":{"position":[[14,14]]},"860":{"position":[[90,15]]},"876":{"position":[[171,15],[190,12],[252,14]]},"885":{"position":[[1239,12]]},"886":{"position":[[3429,13]]},"906":{"position":[[669,14]]},"1104":{"position":[[4,12],[189,12],[579,14]]},"1148":{"position":[[288,15]]}},"keywords":{}}],["authhandl",{"_index":5949,"title":{},"content":{"1104":{"position":[[87,11],[669,11]]}},"keywords":{}}],["author",{"_index":726,"title":{},"content":{"47":{"position":[[346,7]]},"412":{"position":[[12202,10]]},"482":{"position":[[1187,10]]},"848":{"position":[[1149,14]]},"878":{"position":[[497,14]]},"880":{"position":[[409,14]]},"886":{"position":[[1848,14],[3145,14],[4113,14],[4750,14]]},"890":{"position":[[341,14]]},"1104":{"position":[[695,13]]}},"keywords":{}}],["authorit",{"_index":669,"title":{},"content":{"43":{"position":[[146,13]]},"411":{"position":[[1920,13]]},"412":{"position":[[5704,13]]}},"keywords":{}}],["auto",{"_index":2848,"title":{},"content":{"421":{"position":[[261,4]]},"566":{"position":[[552,4]]},"841":{"position":[[605,4]]},"898":{"position":[[1213,4]]}},"keywords":{}}],["autocomplet",{"_index":6295,"title":{},"content":{"1251":{"position":[[208,12]]}},"keywords":{}}],["autoencod",{"_index":2491,"title":{},"content":{"402":{"position":[[2477,12],[2493,11]]}},"keywords":{}}],["autoload",{"_index":6133,"title":{"1175":{"position":[[13,9]]}},"content":{"1172":{"position":[[468,8]]},"1175":{"position":[[181,8]]}},"keywords":{}}],["autom",{"_index":1868,"title":{},"content":{"305":{"position":[[130,9]]},"1148":{"position":[[377,9]]}},"keywords":{}}],["automat",{"_index":425,"title":{"77":{"position":[[29,13]]},"103":{"position":[[29,13]]},"233":{"position":[[23,9]]}},"content":{"26":{"position":[[156,13]]},"34":{"position":[[635,9]]},"50":{"position":[[80,13]]},"53":{"position":[[84,13]]},"57":{"position":[[198,9]]},"77":{"position":[[75,13]]},"103":{"position":[[61,9]]},"122":{"position":[[181,13]]},"124":{"position":[[127,13]]},"125":{"position":[[149,13]]},"130":{"position":[[126,14]]},"133":{"position":[[175,13]]},"136":{"position":[[109,13]]},"156":{"position":[[126,13]]},"157":{"position":[[345,13]]},"159":{"position":[[195,9]]},"174":{"position":[[287,13]]},"182":{"position":[[144,13]]},"185":{"position":[[75,13]]},"191":{"position":[[146,13]]},"201":{"position":[[373,13]]},"221":{"position":[[235,13]]},"226":{"position":[[302,9]]},"233":{"position":[[88,13]]},"261":{"position":[[1076,13]]},"300":{"position":[[576,13]]},"309":{"position":[[287,13]]},"315":{"position":[[971,13]]},"323":{"position":[[259,13]]},"326":{"position":[[85,13]]},"330":{"position":[[48,13]]},"335":{"position":[[967,14]]},"360":{"position":[[346,13]]},"361":{"position":[[346,13],[1039,13]]},"380":{"position":[[236,13]]},"392":{"position":[[1893,14]]},"411":{"position":[[1490,14],[2963,13],[4378,13]]},"417":{"position":[[337,14]]},"419":{"position":[[496,13]]},"439":{"position":[[445,9]]},"445":{"position":[[676,13]]},"446":{"position":[[358,13]]},"458":{"position":[[504,13],[583,13]]},"483":{"position":[[125,9]]},"486":{"position":[[340,13]]},"489":{"position":[[800,13]]},"490":{"position":[[143,9],[208,13]]},"491":{"position":[[1268,13],[1405,13]]},"515":{"position":[[220,13]]},"518":{"position":[[181,9]]},"523":{"position":[[145,13]]},"535":{"position":[[993,13]]},"541":{"position":[[811,13]]},"542":{"position":[[955,9]]},"544":{"position":[[233,9]]},"555":{"position":[[108,13]]},"556":{"position":[[693,14]]},"562":{"position":[[846,13],[965,13]]},"564":{"position":[[1004,13]]},"565":{"position":[[203,13]]},"575":{"position":[[251,13],[638,13]]},"580":{"position":[[52,13]]},"595":{"position":[[813,13],[1070,13]]},"600":{"position":[[111,13]]},"601":{"position":[[792,13]]},"604":{"position":[[205,9]]},"612":{"position":[[1376,13]]},"618":{"position":[[242,13]]},"630":{"position":[[420,13]]},"632":{"position":[[290,13],[1702,13],[2026,13]]},"636":{"position":[[312,13]]},"683":{"position":[[67,13]]},"688":{"position":[[27,13]]},"689":{"position":[[24,9]]},"690":{"position":[[214,9],[521,10]]},"714":{"position":[[215,13]]},"721":{"position":[[475,14]]},"745":{"position":[[172,13]]},"749":{"position":[[17700,13]]},"752":{"position":[[27,13]]},"773":{"position":[[388,13]]},"784":{"position":[[597,13]]},"798":{"position":[[1009,13]]},"829":{"position":[[2814,13],[3017,13],[3644,13],[3775,13]]},"838":{"position":[[460,9]]},"851":{"position":[[46,13]]},"860":{"position":[[509,13]]},"870":{"position":[[84,9]]},"875":{"position":[[8605,13]]},"881":{"position":[[239,13]]},"886":{"position":[[4849,13]]},"898":{"position":[[1902,14]]},"942":{"position":[[97,13]]},"958":{"position":[[137,13],[409,13]]},"984":{"position":[[643,13]]},"986":{"position":[[1561,13]]},"988":{"position":[[1533,13],[5609,13]]},"996":{"position":[[435,13]]},"1003":{"position":[[233,13]]},"1027":{"position":[[92,13]]},"1038":{"position":[[85,13]]},"1052":{"position":[[391,13]]},"1085":{"position":[[1624,13],[1692,13]]},"1088":{"position":[[437,13]]},"1107":{"position":[[83,13]]},"1114":{"position":[[70,13],[362,13]]},"1119":{"position":[[197,13]]},"1121":{"position":[[262,13]]},"1148":{"position":[[80,9],[191,9]]},"1150":{"position":[[50,13],[537,13]]},"1154":{"position":[[74,13]]},"1213":{"position":[[267,13]]}},"keywords":{}}],["automatically—perhap",{"_index":1855,"title":{},"content":{"303":{"position":[[1409,21]]}},"keywords":{}}],["automerg",{"_index":2683,"title":{},"content":{"412":{"position":[[3819,9]]},"686":{"position":[[113,9],[744,9]]},"698":{"position":[[3091,9]]}},"keywords":{}}],["automerge.j",{"_index":3890,"title":{"686":{"position":[[8,12]]}},"content":{},"keywords":{}}],["automigr",{"_index":4458,"title":{"752":{"position":[[0,12]]}},"content":{"752":{"position":[[435,12]]},"934":{"position":[[602,12]]},"938":{"position":[[45,11]]}},"keywords":{}}],["automot",{"_index":3451,"title":{},"content":{"569":{"position":[[276,10]]}},"keywords":{}}],["autonomi",{"_index":2154,"title":{},"content":{"380":{"position":[[410,8]]},"1147":{"position":[[509,8]]}},"keywords":{}}],["autosav",{"_index":6134,"title":{"1175":{"position":[[0,8]]}},"content":{"1172":{"position":[[481,9]]},"1175":{"position":[[44,8],[340,8]]}},"keywords":{}}],["autostart",{"_index":5128,"title":{},"content":{"886":{"position":[[2034,9]]},"988":{"position":[[1639,10]]}},"keywords":{}}],["avail",{"_index":539,"title":{"449":{"position":[[4,9]]}},"content":{"34":{"position":[[504,9]]},"51":{"position":[[1025,9]]},"56":{"position":[[62,9]]},"90":{"position":[[98,12]]},"122":{"position":[[257,10]]},"126":{"position":[[40,9]]},"131":{"position":[[72,9],[450,9]]},"133":{"position":[[251,10]]},"157":{"position":[[248,10]]},"173":{"position":[[2954,9]]},"183":{"position":[[254,10],[351,13]]},"206":{"position":[[336,9]]},"287":{"position":[[308,9]]},"301":{"position":[[640,9]]},"309":{"position":[[265,9]]},"322":{"position":[[305,10]]},"360":{"position":[[618,10]]},"365":{"position":[[873,10]]},"375":{"position":[[979,10]]},"378":{"position":[[238,13]]},"390":{"position":[[1102,9]]},"392":{"position":[[5018,9]]},"393":{"position":[[134,9]]},"408":{"position":[[2839,9],[3352,9]]},"410":{"position":[[1207,9]]},"421":{"position":[[479,10],[597,13]]},"424":{"position":[[286,9]]},"444":{"position":[[374,10]]},"461":{"position":[[1106,9],[1568,9]]},"486":{"position":[[374,9]]},"491":{"position":[[340,9]]},"524":{"position":[[183,9]]},"535":{"position":[[1147,9]]},"566":{"position":[[1345,10]]},"595":{"position":[[1224,9]]},"610":{"position":[[400,10]]},"644":{"position":[[700,9]]},"660":{"position":[[94,10]]},"662":{"position":[[415,9]]},"696":{"position":[[13,9],[1169,9]]},"749":{"position":[[1119,9]]},"805":{"position":[[242,9]]},"829":{"position":[[1187,9],[2041,10]]},"832":{"position":[[293,9]]},"890":{"position":[[929,9]]},"1007":{"position":[[1143,10]]},"1066":{"position":[[108,9]]},"1104":{"position":[[54,9]]},"1151":{"position":[[188,12]]},"1178":{"position":[[187,12]]},"1207":{"position":[[333,9]]},"1211":{"position":[[67,9]]},"1232":{"position":[[29,9]]},"1271":{"position":[[46,9]]},"1298":{"position":[[236,9]]}},"keywords":{}}],["avenu",{"_index":1680,"title":{},"content":{"289":{"position":[[1068,6]]}},"keywords":{}}],["averag",{"_index":3023,"title":{},"content":{"462":{"position":[[578,7]]},"981":{"position":[[242,7]]}},"keywords":{}}],["avoid",{"_index":121,"title":{},"content":{"8":{"position":[[623,5]]},"46":{"position":[[478,5]]},"143":{"position":[[113,5]]},"302":{"position":[[298,5]]},"346":{"position":[[128,5]]},"383":{"position":[[527,8]]},"385":{"position":[[300,5]]},"392":{"position":[[2135,5]]},"395":{"position":[[90,5]]},"408":{"position":[[1972,5],[2731,8]]},"412":{"position":[[2486,5],[4223,5]]},"419":{"position":[[1700,5]]},"435":{"position":[[119,8]]},"556":{"position":[[26,5]]},"617":{"position":[[878,5]]},"765":{"position":[[53,8]]},"828":{"position":[[440,6]]},"839":{"position":[[1295,5]]},"898":{"position":[[4367,5]]},"902":{"position":[[418,8]]},"1003":{"position":[[80,5]]},"1085":{"position":[[2055,5],[2119,6]]}},"keywords":{}}],["aw",{"_index":302,"title":{"18":{"position":[[0,3]]},"19":{"position":[[0,3]]}},"content":{"18":{"position":[[3,3],[243,3],[402,3],[432,3]]},"19":{"position":[[54,3],[151,3],[476,3],[616,3],[786,3],[1015,3],[1082,3]]},"1173":{"position":[[121,3]]}},"keywords":{}}],["await",{"_index":34,"title":{"1185":{"position":[[0,5]]}},"content":{"1":{"position":[[530,5]]},"2":{"position":[[333,5]]},"3":{"position":[[213,5]]},"4":{"position":[[391,5]]},"5":{"position":[[301,5]]},"6":{"position":[[496,5],[675,5]]},"7":{"position":[[333,5],[510,5]]},"8":{"position":[[1102,5]]},"9":{"position":[[247,5]]},"10":{"position":[[285,5]]},"11":{"position":[[759,5],[811,5]]},"19":{"position":[[653,5],[825,5]]},"51":{"position":[[693,5],[823,5]]},"52":{"position":[[84,5],[178,5],[336,5],[383,5],[473,5],[537,5],[620,5],[684,5]]},"55":{"position":[[867,5]]},"188":{"position":[[964,5],[1174,5],[2649,5],[2845,5]]},"209":{"position":[[236,5],[358,5],[799,5],[914,5],[1097,5],[1223,5]]},"210":{"position":[[264,5]]},"211":{"position":[[206,5],[319,5]]},"255":{"position":[[583,5],[702,5],[1153,5],[1289,5],[1416,5],[1530,5]]},"258":{"position":[[144,5]]},"259":{"position":[[1,5]]},"261":{"position":[[337,5]]},"266":{"position":[[658,5]]},"276":{"position":[[399,5]]},"300":{"position":[[231,5]]},"302":{"position":[[783,5],[819,5]]},"314":{"position":[[469,5],[667,5]]},"315":{"position":[[532,5],[640,5]]},"316":{"position":[[110,5]]},"334":{"position":[[327,5],[555,5]]},"335":{"position":[[196,5],[723,5]]},"391":{"position":[[619,5],[653,5]]},"392":{"position":[[337,5],[526,5],[933,5],[988,5],[1037,5],[1081,5],[1491,5],[2629,5],[2779,5],[2843,5],[2878,5],[3594,5],[4535,5],[4732,5],[4800,5]]},"394":{"position":[[645,5],[703,5]]},"397":{"position":[[1754,5],[1820,5],[1884,5],[2205,5]]},"398":{"position":[[829,5],[1004,5],[1992,5],[2115,5],[2318,5]]},"403":{"position":[[719,5],[845,5]]},"439":{"position":[[669,5],[737,5]]},"459":{"position":[[836,5]]},"461":{"position":[[1278,5]]},"480":{"position":[[362,5],[467,5]]},"482":{"position":[[607,5],[754,5]]},"502":{"position":[[915,5]]},"518":{"position":[[382,5]]},"522":{"position":[[408,5]]},"538":{"position":[[423,5],[846,5]]},"539":{"position":[[84,5],[178,5],[336,5],[383,5],[473,5],[537,5],[620,5],[684,5]]},"542":{"position":[[528,5]]},"554":{"position":[[1046,5],[1247,5]]},"555":{"position":[[201,5],[269,5],[468,5],[630,5]]},"556":{"position":[[395,5],[804,5],[810,5],[910,5]]},"562":{"position":[[161,5],[474,5],[551,5],[664,5]]},"563":{"position":[[473,5]]},"564":{"position":[[577,5],[693,5]]},"571":{"position":[[856,5]]},"579":{"position":[[336,5],[563,5]]},"580":{"position":[[438,5]]},"598":{"position":[[430,5],[853,5]]},"599":{"position":[[84,5],[187,5],[363,5],[410,5],[500,5],[564,5],[651,5],[715,5]]},"601":{"position":[[521,5]]},"632":{"position":[[1282,5],[1452,5]]},"638":{"position":[[424,5],[531,5]]},"639":{"position":[[294,5]]},"647":{"position":[[431,5],[572,5]]},"648":{"position":[[297,5],[374,5]]},"653":{"position":[[247,5],[1017,5]]},"654":{"position":[[172,5],[296,5],[446,5]]},"655":{"position":[[415,5],[484,5]]},"659":{"position":[[419,5],[493,5],[574,5],[637,5]]},"661":{"position":[[1177,5]]},"662":{"position":[[2120,5],[2326,5],[2589,5],[2678,5],[2766,5]]},"672":{"position":[[84,5]]},"673":{"position":[[90,5]]},"674":{"position":[[373,5]]},"680":{"position":[[668,5],[1133,5],[1231,5],[1340,5]]},"681":{"position":[[614,5]]},"682":{"position":[[316,5]]},"683":{"position":[[164,5],[262,5],[724,5]]},"684":{"position":[[158,5],[229,5]]},"693":{"position":[[1168,5]]},"710":{"position":[[1689,5],[1815,5],[1896,5],[1985,5],[2073,5]]},"711":{"position":[[1737,5]]},"717":{"position":[[1149,5],[1593,5]]},"718":{"position":[[652,5]]},"724":{"position":[[523,5],[1630,5],[1812,5]]},"734":{"position":[[474,5],[848,5]]},"739":{"position":[[278,5],[407,5],[627,5]]},"745":{"position":[[523,5]]},"749":{"position":[[14828,5],[14984,5]]},"752":{"position":[[364,5],[659,5],[1454,5]]},"754":{"position":[[693,5]]},"759":{"position":[[354,5],[456,5]]},"760":{"position":[[452,5]]},"770":{"position":[[457,5]]},"772":{"position":[[764,5],[924,5],[1012,5],[1609,5],[2371,5]]},"773":{"position":[[554,5]]},"774":{"position":[[656,5]]},"778":{"position":[[204,5]]},"789":{"position":[[160,5],[407,5]]},"791":{"position":[[16,5],[148,5],[275,5],[413,5],[468,5]]},"792":{"position":[[143,5],[279,5],[329,5]]},"795":{"position":[[169,5],[219,5]]},"799":{"position":[[571,5],[803,5]]},"800":{"position":[[808,5],[867,5]]},"810":{"position":[[189,5],[260,5],[341,5],[406,5]]},"811":{"position":[[169,5],[240,5],[321,5],[386,5]]},"812":{"position":[[22,5],[253,5]]},"813":{"position":[[22,5],[250,5],[345,5],[409,5]]},"818":{"position":[[487,5]]},"820":{"position":[[163,5]]},"825":{"position":[[335,5]]},"829":{"position":[[633,5],[721,5],[1523,5]]},"835":{"position":[[417,7],[450,5],[499,5]]},"838":{"position":[[2198,5],[2540,5],[2803,5],[2892,5],[2980,5]]},"851":{"position":[[322,5]]},"857":{"position":[[297,5]]},"862":{"position":[[533,5],[807,5]]},"872":{"position":[[1026,5],[1707,5],[1814,5],[3254,5],[3562,5],[3965,5],[4044,5]]},"875":{"position":[[418,5],[959,5],[1068,5],[2200,5],[3094,5],[3328,5],[3441,5],[6138,5],[6233,5],[6428,5],[8403,5],[9712,5]]},"878":{"position":[[279,5]]},"882":{"position":[[396,5]]},"892":{"position":[[171,5],[256,5],[358,5]]},"893":{"position":[[222,5],[464,5]]},"898":{"position":[[2315,5],[2394,5],[4152,5]]},"904":{"position":[[708,5],[791,5],[1152,5],[1805,5]]},"906":{"position":[[988,5]]},"907":{"position":[[281,5]]},"911":{"position":[[626,5]]},"916":{"position":[[332,5]]},"917":{"position":[[135,5]]},"918":{"position":[[98,5]]},"929":{"position":[[125,5]]},"930":{"position":[[143,5]]},"931":{"position":[[153,5]]},"932":{"position":[[87,5],[143,5],[1037,5]]},"934":{"position":[[225,5]]},"939":{"position":[[150,5]]},"942":{"position":[[182,5]]},"943":{"position":[[379,5]]},"944":{"position":[[192,5]]},"945":{"position":[[133,5],[454,5]]},"946":{"position":[[154,5]]},"947":{"position":[[166,5]]},"948":{"position":[[719,5]]},"949":{"position":[[135,5]]},"951":{"position":[[377,5]]},"954":{"position":[[137,5]]},"955":{"position":[[294,5]]},"956":{"position":[[238,5],[303,5]]},"960":{"position":[[276,5]]},"962":{"position":[[747,5],[963,5]]},"966":{"position":[[531,5],[649,5]]},"967":{"position":[[116,5],[234,5]]},"968":{"position":[[501,5]]},"976":{"position":[[313,5]]},"977":{"position":[[72,5]]},"979":{"position":[[302,5]]},"988":{"position":[[242,5],[2517,5],[2846,5],[3707,5],[3835,5]]},"994":{"position":[[40,5],[272,5]]},"995":{"position":[[389,5],[657,5],[1503,5],[1652,5],[1692,5],[1814,5],[1878,5],[2007,5]]},"997":{"position":[[96,5]]},"998":{"position":[[102,5],[138,5]]},"999":{"position":[[281,5]]},"1002":{"position":[[1008,5],[1014,6]]},"1007":{"position":[[1517,5],[1675,5],[1848,5]]},"1013":{"position":[[292,5]]},"1014":{"position":[[194,5],[335,5]]},"1015":{"position":[[170,5]]},"1016":{"position":[[129,5]]},"1018":{"position":[[71,5],[202,5],[312,5],[791,5]]},"1020":{"position":[[350,5],[597,5]]},"1022":{"position":[[446,5],[640,5],[749,5],[1003,5]]},"1023":{"position":[[105,5],[296,5],[435,5],[667,5]]},"1024":{"position":[[199,5],[372,5],[446,5],[469,5]]},"1026":{"position":[[9,5],[47,5],[89,5]]},"1027":{"position":[[1,5]]},"1028":{"position":[[1,5]]},"1033":{"position":[[493,5],[621,5],[724,5],[832,5]]},"1035":{"position":[[96,5]]},"1036":{"position":[[115,5]]},"1039":{"position":[[269,5]]},"1040":{"position":[[425,5]]},"1041":{"position":[[273,5]]},"1042":{"position":[[225,5]]},"1043":{"position":[[59,5]]},"1044":{"position":[[277,5],[367,5],[478,5],[537,5]]},"1045":{"position":[[71,5],[137,5]]},"1048":{"position":[[433,5],[539,5]]},"1049":{"position":[[197,5]]},"1050":{"position":[[91,5]]},"1057":{"position":[[119,5],[448,5],[600,5]]},"1058":{"position":[[405,5]]},"1059":{"position":[[281,5]]},"1060":{"position":[[149,5]]},"1061":{"position":[[150,5]]},"1062":{"position":[[270,5]]},"1064":{"position":[[360,5]]},"1067":{"position":[[455,5],[1958,5],[2371,5]]},"1069":{"position":[[613,5],[770,5]]},"1072":{"position":[[2413,5]]},"1075":{"position":[[1,5]]},"1078":{"position":[[855,5]]},"1090":{"position":[[776,5],[952,5],[1015,5]]},"1097":{"position":[[699,5],[875,5]]},"1098":{"position":[[335,5],[429,5]]},"1099":{"position":[[309,5],[399,5]]},"1101":{"position":[[652,5]]},"1102":{"position":[[336,5],[473,5],[696,5],[1027,5]]},"1103":{"position":[[195,5],[299,5]]},"1105":{"position":[[725,5]]},"1106":{"position":[[663,5]]},"1108":{"position":[[393,5]]},"1114":{"position":[[705,5],[832,5],[933,5]]},"1115":{"position":[[313,5],[379,5],[449,5],[813,5]]},"1118":{"position":[[639,5],[765,5]]},"1121":{"position":[[445,5],[545,5],[596,5]]},"1125":{"position":[[281,5]]},"1126":{"position":[[361,5],[674,5]]},"1130":{"position":[[154,5]]},"1134":{"position":[[131,5]]},"1138":{"position":[[275,5]]},"1139":{"position":[[530,5]]},"1140":{"position":[[589,5],[723,5]]},"1144":{"position":[[179,5]]},"1145":{"position":[[519,5]]},"1146":{"position":[[224,5]]},"1148":{"position":[[935,5],[1118,5]]},"1149":{"position":[[911,5],[1003,5]]},"1154":{"position":[[739,5]]},"1158":{"position":[[187,5],[291,5],[562,5],[676,5]]},"1159":{"position":[[373,5]]},"1161":{"position":[[259,5]]},"1162":{"position":[[512,5]]},"1163":{"position":[[533,5]]},"1164":{"position":[[1151,5]]},"1165":{"position":[[723,5],[795,5],[1061,5],[1139,5]]},"1168":{"position":[[135,5]]},"1171":{"position":[[280,5]]},"1172":{"position":[[300,5]]},"1177":{"position":[[303,5],[607,5]]},"1180":{"position":[[259,5]]},"1181":{"position":[[599,5]]},"1182":{"position":[[537,5]]},"1184":{"position":[[776,5]]},"1189":{"position":[[398,5]]},"1198":{"position":[[1888,7]]},"1201":{"position":[[175,5]]},"1208":{"position":[[580,5],[715,5],[804,5],[928,5],[1071,5],[1650,5],[1733,5],[1791,5],[1906,5]]},"1210":{"position":[[415,5]]},"1211":{"position":[[670,5]]},"1218":{"position":[[562,5]]},"1219":{"position":[[510,5],[673,5],[875,5]]},"1220":{"position":[[189,5],[550,5]]},"1222":{"position":[[1386,5]]},"1226":{"position":[[211,5]]},"1227":{"position":[[689,5]]},"1231":{"position":[[1020,5],[1090,5]]},"1237":{"position":[[833,5]]},"1238":{"position":[[808,5]]},"1239":{"position":[[778,5]]},"1264":{"position":[[133,5]]},"1265":{"position":[[677,5]]},"1267":{"position":[[611,5],[705,5]]},"1271":{"position":[[1564,5]]},"1274":{"position":[[315,5]]},"1275":{"position":[[326,5]]},"1276":{"position":[[841,5],[928,5]]},"1277":{"position":[[375,5]]},"1278":{"position":[[452,5],[904,5]]},"1279":{"position":[[702,5]]},"1280":{"position":[[437,5]]},"1286":{"position":[[484,5]]},"1287":{"position":[[534,5]]},"1288":{"position":[[500,5]]},"1294":{"position":[[1130,5]]},"1309":{"position":[[1388,5]]},"1311":{"position":[[132,5],[908,5],[962,5],[1480,5],[1745,5]]},"1315":{"position":[[569,5],[659,5]]}},"keywords":{}}],["awaitcapacitordevicereadi",{"_index":159,"title":{},"content":{"11":{"position":[[527,28],[765,28]]}},"keywords":{}}],["awaitidl",{"_index":5649,"title":{"1026":{"position":[[0,12]]}},"content":{"1033":{"position":[[360,11],[940,11]]}},"keywords":{}}],["awaitinitialrepl",{"_index":4878,"title":{"994":{"position":[[0,26]]}},"content":{"854":{"position":[[1773,26]]},"994":{"position":[[6,25]]},"995":{"position":[[40,25],[440,25],[678,25],[933,25],[1124,25]]}},"keywords":{}}],["awaitinsync",{"_index":5502,"title":{"995":{"position":[[0,14]]}},"content":{"995":{"position":[[288,13],[470,13],[707,13]]}},"keywords":{}}],["awaitreplicationsinsync",{"_index":3757,"title":{},"content":{"653":{"position":[[1213,24]]}},"keywords":{}}],["awaitwritepersist",{"_index":5914,"title":{},"content":{"1090":{"position":[[1319,22]]},"1162":{"position":[[264,21]]},"1164":{"position":[[1101,22]]},"1181":{"position":[[330,21]]},"1185":{"position":[[264,22],[337,22]]}},"keywords":{}}],["awar",{"_index":939,"title":{},"content":{"66":{"position":[[105,5]]},"129":{"position":[[477,5]]},"299":{"position":[[200,5]]},"427":{"position":[[101,5]]},"991":{"position":[[4,5]]}},"keywords":{}}],["away",{"_index":439,"title":{},"content":{"27":{"position":[[156,4]]},"331":{"position":[[288,4]]},"346":{"position":[[500,4]]},"402":{"position":[[240,4]]},"410":{"position":[[2182,5]]},"424":{"position":[[348,4]]},"460":{"position":[[75,4]]},"721":{"position":[[187,4]]},"801":{"position":[[961,4]]},"839":{"position":[[890,4]]},"1124":{"position":[[262,4]]}},"keywords":{}}],["away."",{"_index":2601,"title":{},"content":{"410":{"position":[[1450,11]]}},"keywords":{}}],["awesom",{"_index":450,"title":{},"content":{"28":{"position":[[112,7]]}},"keywords":{}}],["b",{"_index":2692,"title":{"1149":{"position":[[0,2]]}},"content":{"412":{"position":[[4639,2],[5012,3]]},"691":{"position":[[252,2]]},"860":{"position":[[1258,1]]},"871":{"position":[[519,1]]},"885":{"position":[[1724,2]]},"897":{"position":[[26,1]]},"982":{"position":[[206,1],[244,1],[308,1],[446,1],[541,1]]},"1033":{"position":[[691,2]]},"1292":{"position":[[962,1],[970,1],[983,1],[991,1],[1009,1],[1017,1]]},"1309":{"position":[[565,2],[929,3]]}},"keywords":{}}],["b.id",{"_index":5102,"title":{},"content":{"885":{"position":[[1873,5],[1903,5]]}},"keywords":{}}],["b.updatedat",{"_index":5100,"title":{},"content":{"885":{"position":[[1756,12],[1800,12],[1844,12]]}},"keywords":{}}],["b1",{"_index":5450,"title":{},"content":{"987":{"position":[[175,2],[211,2],[323,2],[408,3],[668,2],[712,2]]}},"keywords":{}}],["baar",{"_index":3779,"title":{},"content":{"659":{"position":[[536,7]]}},"keywords":{}}],["babel",{"_index":4069,"title":{},"content":{"728":{"position":[[143,5]]},"1266":{"position":[[802,6]]}},"keywords":{}}],["babel.config",{"_index":6313,"title":{},"content":{"1266":{"position":[[425,17]]}},"keywords":{}}],["babel/polyfil",{"_index":4070,"title":{},"content":{"728":{"position":[[172,15],[265,18]]}},"keywords":{}}],["babelconfig",{"_index":6311,"title":{},"content":{"1266":{"position":[[376,11],[827,11]]}},"keywords":{}}],["back",{"_index":1173,"title":{},"content":{"157":{"position":[[387,4]]},"255":{"position":[[173,4]]},"353":{"position":[[490,4]]},"358":{"position":[[557,5]]},"392":{"position":[[3458,4]]},"481":{"position":[[90,4]]},"489":{"position":[[827,4]]},"491":{"position":[[105,4]]},"495":{"position":[[174,5],[721,4]]},"524":{"position":[[43,6]]},"621":{"position":[[304,4]]},"698":{"position":[[1861,4]]},"701":{"position":[[615,5]]},"711":{"position":[[665,4]]},"871":{"position":[[205,4]]},"987":{"position":[[457,4]]},"988":{"position":[[6086,4]]},"1006":{"position":[[291,4]]},"1007":{"position":[[607,4]]},"1250":{"position":[[233,4]]},"1301":{"position":[[1100,4]]},"1304":{"position":[[969,4]]},"1316":{"position":[[1695,4],[2797,4],[2933,4]]}},"keywords":{}}],["backbon",{"_index":1676,"title":{"489":{"position":[[20,8]]}},"content":{"288":{"position":[[63,8]]}},"keywords":{}}],["backend",{"_index":220,"title":{"82":{"position":[[49,8]]},"113":{"position":[[49,8]]},"199":{"position":[[78,7]]},"238":{"position":[[54,8]]},"246":{"position":[[61,7]]},"249":{"position":[[22,8]]},"293":{"position":[[36,8]]},"1147":{"position":[[24,7]]}},"content":{"14":{"position":[[576,8],[1040,8]]},"15":{"position":[[374,7]]},"16":{"position":[[129,7]]},"18":{"position":[[350,7]]},"19":{"position":[[1025,9]]},"20":{"position":[[18,7],[217,7]]},"21":{"position":[[157,8]]},"27":{"position":[[13,7],[113,7],[235,7]]},"29":{"position":[[189,7]]},"38":{"position":[[132,7]]},"39":{"position":[[413,7]]},"41":{"position":[[362,7]]},"42":{"position":[[186,8],[340,7]]},"43":{"position":[[226,9],[298,9]]},"46":{"position":[[506,7]]},"82":{"position":[[69,7]]},"113":{"position":[[103,7],[191,7]]},"162":{"position":[[290,8]]},"174":{"position":[[2912,7],[3019,7],[3175,7]]},"201":{"position":[[429,8]]},"202":{"position":[[423,7]]},"204":{"position":[[227,7]]},"207":{"position":[[386,7]]},"208":{"position":[[227,7],[312,7]]},"210":{"position":[[36,8]]},"211":{"position":[[605,8]]},"212":{"position":[[433,7]]},"223":{"position":[[53,7],[324,8]]},"238":{"position":[[94,7],[199,8],[268,7]]},"249":{"position":[[289,7]]},"255":{"position":[[339,7],[1759,7]]},"260":{"position":[[51,7],[238,8],[330,8]]},"263":{"position":[[108,8]]},"293":{"position":[[68,7],[276,7]]},"309":{"position":[[332,7]]},"312":{"position":[[138,7]]},"313":{"position":[[158,9]]},"318":{"position":[[133,8]]},"328":{"position":[[57,9]]},"336":{"position":[[32,8]]},"368":{"position":[[130,9]]},"372":{"position":[[50,7]]},"380":{"position":[[273,8]]},"381":{"position":[[109,9],[351,9]]},"410":{"position":[[831,7]]},"411":{"position":[[371,8],[1163,7],[1551,7],[4940,7]]},"412":{"position":[[906,7],[1568,7],[2930,7],[12297,7],[12813,7]]},"477":{"position":[[238,8]]},"480":{"position":[[1023,8]]},"481":{"position":[[260,8]]},"489":{"position":[[180,8]]},"556":{"position":[[1625,7]]},"561":{"position":[[210,8]]},"581":{"position":[[32,8]]},"610":{"position":[[1512,7]]},"612":{"position":[[439,7]]},"626":{"position":[[302,7],[407,7],[445,7],[762,7]]},"630":{"position":[[748,7]]},"632":{"position":[[686,8],[892,8]]},"634":{"position":[[670,7]]},"685":{"position":[[466,7]]},"686":{"position":[[452,7],[611,8],[632,7]]},"696":{"position":[[1764,7]]},"697":{"position":[[424,7],[519,8]]},"698":{"position":[[1616,8],[1698,7]]},"699":{"position":[[53,8],[394,7]]},"700":{"position":[[87,8],[276,7]]},"701":{"position":[[372,7],[593,8],[999,7]]},"702":{"position":[[582,7]]},"704":{"position":[[552,7]]},"705":{"position":[[321,8]]},"710":{"position":[[397,8]]},"715":{"position":[[318,7]]},"740":{"position":[[307,7]]},"756":{"position":[[413,7]]},"778":{"position":[[125,7],[606,8]]},"780":{"position":[[722,7]]},"781":{"position":[[143,7],[301,7],[630,8],[890,7]]},"782":{"position":[[86,7],[182,7]]},"784":{"position":[[170,7]]},"785":{"position":[[621,7]]},"836":{"position":[[1894,8]]},"840":{"position":[[578,8]]},"841":{"position":[[567,7],[1548,8]]},"860":{"position":[[35,7],[66,7],[1026,8]]},"871":{"position":[[656,7]]},"875":{"position":[[7659,7],[9226,7]]},"886":{"position":[[1634,7],[3450,8],[4994,8],[5072,7]]},"888":{"position":[[884,7]]},"890":{"position":[[530,7]]},"896":{"position":[[12,8]]},"981":{"position":[[359,8],[529,7],[567,8],[619,7],[703,8],[1679,7]]},"984":{"position":[[245,7],[276,7],[553,7]]},"985":{"position":[[38,8],[67,7],[142,7],[671,7]]},"986":{"position":[[538,7]]},"988":{"position":[[907,7],[1778,7],[4053,8],[4737,7],[5282,7]]},"991":{"position":[[79,7],[104,7]]},"996":{"position":[[115,8],[310,7]]},"1002":{"position":[[880,7]]},"1004":{"position":[[568,7],[718,7]]},"1005":{"position":[[103,7]]},"1072":{"position":[[1706,8]]},"1123":{"position":[[780,8]]},"1124":{"position":[[1882,9],[1984,7]]},"1147":{"position":[[46,7],[245,7],[327,8]]},"1149":{"position":[[32,7],[481,8],[560,7]]},"1301":{"position":[[439,7]]},"1304":{"position":[[1895,7]]},"1308":{"position":[[137,7],[340,7],[356,7],[434,7]]},"1314":{"position":[[164,8]]},"1316":{"position":[[60,7]]},"1320":{"position":[[92,7],[271,8],[284,7],[496,7]]}},"keywords":{}}],["backend"",{"_index":1516,"title":{},"content":{"244":{"position":[[1272,13]]},"412":{"position":[[2784,13]]}},"keywords":{}}],["backend.learn",{"_index":3690,"title":{},"content":{"628":{"position":[[172,13]]}},"keywords":{}}],["backend.us",{"_index":6073,"title":{},"content":{"1148":{"position":[[275,12]]}},"keywords":{}}],["backend/protocol",{"_index":6015,"title":{},"content":{"1124":{"position":[[2228,17]]}},"keywords":{}}],["backendsencrypt",{"_index":3142,"title":{},"content":{"483":{"position":[[275,18]]},"631":{"position":[[419,18]]}},"keywords":{}}],["backendsfield",{"_index":3118,"title":{},"content":{"479":{"position":[[226,13]]}},"keywords":{}}],["background",{"_index":321,"title":{},"content":{"19":{"position":[[170,11]]},"196":{"position":[[200,10]]},"384":{"position":[[185,10]]},"407":{"position":[[259,11]]},"410":{"position":[[2061,10]]},"415":{"position":[[207,10]]},"420":{"position":[[1596,11]]},"421":{"position":[[832,10]]},"460":{"position":[[219,11]]},"487":{"position":[[415,11]]},"491":{"position":[[229,11],[1087,11]]},"618":{"position":[[283,10]]},"699":{"position":[[910,10]]},"704":{"position":[[339,10]]},"774":{"position":[[309,11],[1087,10]]},"1093":{"position":[[493,10]]},"1185":{"position":[[159,11]]},"1292":{"position":[[614,11]]},"1313":{"position":[[837,10]]},"1318":{"position":[[832,10]]}},"keywords":{}}],["background.on",{"_index":3980,"title":{},"content":{"707":{"position":[[150,14]]}},"keywords":{}}],["backpressur",{"_index":3666,"title":{},"content":{"622":{"position":[[105,12]]}},"keywords":{}}],["backup",{"_index":2111,"title":{"645":{"position":[[3,6]]},"647":{"position":[[9,7]]},"648":{"position":[[5,7]]},"973":{"position":[[0,9]]}},"content":{"365":{"position":[[1498,6]]},"412":{"position":[[8385,7],[8892,6]]},"417":{"position":[[203,7],[329,7]]},"647":{"position":[[199,6],[259,6],[297,6]]},"648":{"position":[[29,6],[74,6],[154,6],[189,6],[315,6]]},"649":{"position":[[77,6],[145,6],[407,6]]},"650":{"position":[[55,7]]},"702":{"position":[[374,7]]},"793":{"position":[[1105,6]]},"1094":{"position":[[443,8]]}},"keywords":{}}],["backup/repl",{"_index":2594,"title":{},"content":{"410":{"position":[[894,18]]}},"keywords":{}}],["backupopt",{"_index":3730,"title":{},"content":{"647":{"position":[[157,13]]},"648":{"position":[[99,13]]},"649":{"position":[[98,13]]}},"keywords":{}}],["backupst",{"_index":3731,"title":{},"content":{"647":{"position":[[383,11]]},"648":{"position":[[232,11]]},"649":{"position":[[188,11]]}},"keywords":{}}],["backupstate.awaitinitialbackup",{"_index":3733,"title":{},"content":{"647":{"position":[[437,33]]},"648":{"position":[[380,33]]}},"keywords":{}}],["backupstate.writeevents$.subscribe(writeev",{"_index":3737,"title":{},"content":{"649":{"position":[[257,45]]}},"keywords":{}}],["backupstate2",{"_index":3734,"title":{},"content":{"647":{"position":[[523,12]]}},"keywords":{}}],["backupstate2.awaitinitialbackup",{"_index":3735,"title":{},"content":{"647":{"position":[[578,34]]}},"keywords":{}}],["backward",{"_index":859,"title":{},"content":{"57":{"position":[[246,8]]},"459":{"position":[[1168,9]]},"466":{"position":[[510,9]]},"1134":{"position":[[284,9]]},"1239":{"position":[[437,9]]},"1270":{"position":[[210,9]]},"1276":{"position":[[316,9]]}},"keywords":{}}],["bad",{"_index":403,"title":{},"content":{"24":{"position":[[477,3]]},"616":{"position":[[840,3]]},"626":{"position":[[429,3]]},"709":{"position":[[388,3]]},"1321":{"position":[[489,3]]}},"keywords":{}}],["balanc",{"_index":1611,"title":{},"content":{"266":{"position":[[427,9]]},"365":{"position":[[741,8]]},"412":{"position":[[6245,7]]},"444":{"position":[[855,7]]},"698":{"position":[[2778,7],[2828,7],[2896,7],[2963,7]]},"1080":{"position":[[449,8]]},"1088":{"position":[[744,8]]},"1089":{"position":[[260,9]]}},"keywords":{}}],["bandwidth",{"_index":719,"title":{"780":{"position":[[31,10]]}},"content":{"46":{"position":[[635,9]]},"57":{"position":[[425,9]]},"204":{"position":[[284,9]]},"361":{"position":[[440,10]]},"408":{"position":[[2124,9],[3017,9],[3362,9]]},"534":{"position":[[667,9]]},"594":{"position":[[665,9]]},"632":{"position":[[227,9]]},"780":{"position":[[24,9],[119,9],[222,9],[629,10]]},"902":{"position":[[839,9],[876,9]]},"1009":{"position":[[843,9]]}},"keywords":{}}],["bank",{"_index":1695,"title":{},"content":{"295":{"position":[[247,5]]},"412":{"position":[[6151,7]]},"700":{"position":[[821,7]]}},"keywords":{}}],["bar",{"_index":3781,"title":{},"content":{"659":{"position":[[621,5]]},"662":{"position":[[2639,8],[2728,5],[2816,5]]},"710":{"position":[[1946,8],[2035,5],[2123,5]]},"711":{"position":[[1376,8]]},"752":{"position":[[339,4]]},"806":{"position":[[794,5]]},"838":{"position":[[2853,8],[2942,5],[3030,5]]},"942":{"position":[[233,5]]},"943":{"position":[[441,5]]},"947":{"position":[[241,6]]},"1014":{"position":[[257,5],[396,5]]},"1015":{"position":[[233,5]]},"1018":{"position":[[560,6],[605,7],[881,5]]},"1035":{"position":[[147,5]]},"1078":{"position":[[971,5],[1098,5]]},"1177":{"position":[[397,6]]},"1220":{"position":[[370,5],[580,4],[631,5]]}},"keywords":{}}],["bar1",{"_index":5333,"title":{},"content":{"944":{"position":[[249,6]]}},"keywords":{}}],["bar2",{"_index":5335,"title":{},"content":{"944":{"position":[[285,6]]},"946":{"position":[[205,6]]},"947":{"position":[[223,6]]},"1018":{"position":[[193,8]]}},"keywords":{}}],["barrier",{"_index":2835,"title":{},"content":{"420":{"position":[[866,7]]},"898":{"position":[[4067,7]]}},"keywords":{}}],["base",{"_index":114,"title":{"68":{"position":[[10,5]]},"99":{"position":[[10,5]]},"150":{"position":[[15,5]]},"152":{"position":[[19,5]]},"153":{"position":[[27,4]]},"161":{"position":[[20,4]]},"226":{"position":[[10,5]]},"279":{"position":[[16,5]]},"348":{"position":[[5,5]]},"349":{"position":[[9,5]]},"1024":{"position":[[23,5]]},"1195":{"position":[[8,5]]},"1196":{"position":[[12,5]]},"1247":{"position":[[12,5]]},"1253":{"position":[[13,5]]}},"content":{"8":{"position":[[475,4],[522,5]]},"19":{"position":[[88,6]]},"26":{"position":[[21,5],[43,5]]},"31":{"position":[[54,5]]},"34":{"position":[[348,5]]},"35":{"position":[[97,5],[445,5]]},"36":{"position":[[362,5]]},"38":{"position":[[471,5]]},"40":{"position":[[15,5]]},"45":{"position":[[152,5],[320,5]]},"47":{"position":[[90,6],[149,5],[217,5]]},"51":{"position":[[96,5]]},"60":{"position":[[55,5]]},"64":{"position":[[87,5]]},"66":{"position":[[189,5]]},"67":{"position":[[106,5]]},"71":{"position":[[41,5]]},"83":{"position":[[73,5]]},"98":{"position":[[121,5]]},"114":{"position":[[670,5]]},"116":{"position":[[172,5]]},"126":{"position":[[274,5]]},"129":{"position":[[116,5]]},"131":{"position":[[795,5]]},"134":{"position":[[220,5]]},"135":{"position":[[257,5]]},"152":{"position":[[150,5],[246,5]]},"153":{"position":[[31,5],[59,4]]},"155":{"position":[[40,4],[172,4]]},"161":{"position":[[23,4],[126,5]]},"167":{"position":[[120,4]]},"169":{"position":[[204,6]]},"170":{"position":[[35,4]]},"174":{"position":[[22,5]]},"179":{"position":[[96,5],[318,5]]},"181":{"position":[[88,5]]},"189":{"position":[[630,5],[694,5]]},"221":{"position":[[55,5]]},"223":{"position":[[409,5]]},"227":{"position":[[143,5]]},"243":{"position":[[957,5]]},"244":{"position":[[884,5]]},"249":{"position":[[260,5]]},"255":{"position":[[253,5],[955,5]]},"265":{"position":[[272,5]]},"266":{"position":[[1100,5]]},"279":{"position":[[59,5]]},"287":{"position":[[362,5]]},"298":{"position":[[480,5]]},"299":{"position":[[1738,5]]},"317":{"position":[[35,5]]},"336":{"position":[[486,5]]},"353":{"position":[[738,5]]},"354":{"position":[[35,5],[1646,5]]},"360":{"position":[[269,5],[722,5]]},"362":{"position":[[6,5]]},"365":{"position":[[1242,5]]},"368":{"position":[[53,5]]},"369":{"position":[[841,5]]},"390":{"position":[[449,5],[809,5],[1348,5],[1435,5],[1575,5]]},"394":{"position":[[439,5],[990,5],[1085,5]]},"401":{"position":[[297,4],[344,4],[391,4],[438,4]]},"408":{"position":[[2037,5],[2575,4]]},"412":{"position":[[4192,5],[5992,5],[12089,5]]},"414":{"position":[[263,5]]},"419":{"position":[[1865,5]]},"427":{"position":[[999,5]]},"430":{"position":[[240,5]]},"433":{"position":[[103,6]]},"435":{"position":[[32,5]]},"438":{"position":[[160,5]]},"444":{"position":[[570,5],[826,5]]},"450":{"position":[[604,4]]},"452":{"position":[[361,4],[737,5]]},"453":{"position":[[486,4],[792,5]]},"455":{"position":[[109,5],[385,5]]},"456":{"position":[[153,5]]},"461":{"position":[[1093,5]]},"468":{"position":[[262,5]]},"483":{"position":[[1083,5]]},"489":{"position":[[189,5]]},"496":{"position":[[201,5]]},"502":{"position":[[36,5]]},"504":{"position":[[489,5]]},"521":{"position":[[85,5]]},"524":{"position":[[1015,5]]},"525":{"position":[[686,5]]},"535":{"position":[[128,5]]},"538":{"position":[[64,5],[105,5],[228,5]]},"547":{"position":[[55,5]]},"554":{"position":[[459,5],[713,5]]},"560":{"position":[[54,5]]},"561":{"position":[[248,5]]},"563":{"position":[[627,5],[1038,5]]},"566":{"position":[[285,5],[366,5]]},"567":{"position":[[408,5],[827,5]]},"571":{"position":[[531,5]]},"574":{"position":[[876,5]]},"595":{"position":[[128,5]]},"598":{"position":[[64,5],[105,5],[229,5]]},"607":{"position":[[55,5]]},"620":{"position":[[537,5]]},"631":{"position":[[22,5],[312,5]]},"632":{"position":[[132,5],[886,5],[1257,5]]},"661":{"position":[[17,5],[1450,5]]},"662":{"position":[[237,5]]},"670":{"position":[[291,5]]},"688":{"position":[[912,5],[1011,5]]},"690":{"position":[[185,5],[387,5]]},"698":{"position":[[1963,5]]},"700":{"position":[[436,5]]},"703":{"position":[[23,5],[1062,5],[1312,5]]},"705":{"position":[[181,5],[477,5],[707,5]]},"710":{"position":[[123,5]]},"711":{"position":[[17,5],[1944,5]]},"714":{"position":[[749,5],[815,5]]},"717":{"position":[[94,5],[196,5]]},"723":{"position":[[2093,5],[2363,5]]},"724":{"position":[[720,5]]},"729":{"position":[[49,5]]},"730":{"position":[[124,4]]},"798":{"position":[[492,5]]},"831":{"position":[[302,5]]},"835":{"position":[[219,6],[396,6],[681,5]]},"836":{"position":[[19,5],[734,5],[1160,5],[1284,5]]},"837":{"position":[[949,5]]},"838":{"position":[[266,5],[991,5]]},"839":{"position":[[240,5]]},"840":{"position":[[24,5]]},"841":{"position":[[177,5],[193,5],[213,5],[245,6],[364,5],[1187,5]]},"860":{"position":[[1098,5]]},"875":{"position":[[1809,5]]},"904":{"position":[[424,5]]},"984":{"position":[[83,5]]},"1009":{"position":[[555,5],[570,5]]},"1041":{"position":[[22,5],[56,5]]},"1042":{"position":[[26,5]]},"1071":{"position":[[115,5]]},"1126":{"position":[[335,5],[648,5]]},"1132":{"position":[[348,5],[389,5]]},"1148":{"position":[[269,5],[698,5]]},"1151":{"position":[[112,5]]},"1154":{"position":[[181,5]]},"1159":{"position":[[79,5]]},"1172":{"position":[[524,5]]},"1173":{"position":[[11,5]]},"1178":{"position":[[111,5]]},"1195":{"position":[[41,5]]},"1202":{"position":[[49,5]]},"1219":{"position":[[458,5],[625,5]]},"1242":{"position":[[18,5]]},"1243":{"position":[[28,5]]},"1244":{"position":[[23,5]]},"1247":{"position":[[165,5],[182,5],[373,5],[546,5]]},"1249":{"position":[[106,5],[410,5]]},"1251":{"position":[[15,5]]},"1252":{"position":[[15,5]]},"1257":{"position":[[25,5]]},"1270":{"position":[[62,5]]},"1292":{"position":[[224,6]]},"1297":{"position":[[10,5]]},"1313":{"position":[[476,5],[1049,5]]},"1316":{"position":[[798,5]]},"1318":{"position":[[1104,5]]},"1320":{"position":[[628,5]]},"1321":{"position":[[693,5]]},"1322":{"position":[[209,5]]},"1323":{"position":[[107,5]]},"1324":{"position":[[582,5]]}},"keywords":{}}],["base64",{"_index":3007,"title":{},"content":{"460":{"position":[[603,6]]},"918":{"position":[[45,6]]},"1143":{"position":[[292,6]]},"1282":{"position":[[214,6]]}},"keywords":{}}],["base64databas",{"_index":5310,"title":{},"content":{"931":{"position":[[136,14]]}},"keywords":{}}],["base64str",{"_index":5309,"title":{},"content":{"931":{"position":[[59,13]]}},"keywords":{}}],["basedir",{"_index":6314,"title":{},"content":{"1266":{"position":[[449,7],[562,7]]}},"keywords":{}}],["basepath",{"_index":5909,"title":{},"content":{"1090":{"position":[[889,9]]},"1130":{"position":[[236,9]]}},"keywords":{}}],["basestorag",{"_index":6277,"title":{},"content":{"1231":{"position":[[782,11],[899,11],[1074,11]]}},"keywords":{}}],["basi",{"_index":895,"title":{},"content":{"63":{"position":[[131,5]]},"396":{"position":[[504,5]]},"424":{"position":[[186,6]]},"1323":{"position":[[216,6]]}},"keywords":{}}],["basic",{"_index":481,"title":{"558":{"position":[[23,5]]},"561":{"position":[[22,5]]}},"content":{"29":{"position":[[345,5]]},"41":{"position":[[141,9]]},"47":{"position":[[509,5]]},"63":{"position":[[213,5]]},"321":{"position":[[343,5]]},"388":{"position":[[90,5]]},"394":{"position":[[118,5]]},"412":{"position":[[5255,9]]},"456":{"position":[[23,5]]},"520":{"position":[[234,5]]},"522":{"position":[[264,5]]},"544":{"position":[[55,5]]},"554":{"position":[[100,5]]},"566":{"position":[[218,5]]},"567":{"position":[[948,7]]},"604":{"position":[[55,5]]},"611":{"position":[[918,6]]},"698":{"position":[[3230,9]]},"802":{"position":[[547,5]]},"839":{"position":[[690,5]]},"841":{"position":[[339,5],[827,5],[1398,5]]},"848":{"position":[[504,7]]},"876":{"position":[[38,6]]},"906":{"position":[[478,5]]},"950":{"position":[[11,9]]},"1055":{"position":[[13,5]]},"1123":{"position":[[515,5]]},"1274":{"position":[[604,5]]},"1279":{"position":[[991,5]]}},"keywords":{}}],["batch",{"_index":513,"title":{"1294":{"position":[[0,7]]}},"content":{"33":{"position":[[137,8]]},"146":{"position":[[71,8]]},"277":{"position":[[174,7]]},"392":{"position":[[2515,7],[3046,5],[3092,6],[4965,5]]},"411":{"position":[[780,8]]},"487":{"position":[[111,5],[208,8]]},"752":{"position":[[795,5]]},"759":{"position":[[750,5],[984,5]]},"760":{"position":[[746,5],[872,5]]},"875":{"position":[[5880,5]]},"885":{"position":[[2343,5]]},"981":{"position":[[865,8]]},"983":{"position":[[56,7],[757,7],[825,8]]},"988":{"position":[[2898,5],[5302,5]]},"1125":{"position":[[642,8],[676,5]]},"1134":{"position":[[632,5]]},"1138":{"position":[[401,7]]},"1143":{"position":[[349,7]]},"1164":{"position":[[246,6]]},"1294":{"position":[[369,7],[698,5],[1017,7],[1854,7],[1928,5],[2041,5],[2122,7]]},"1295":{"position":[[877,7],[1106,7]]},"1296":{"position":[[369,7],[1242,7],[1672,7]]}},"keywords":{}}],["batches.simplifi",{"_index":3696,"title":{},"content":{"630":{"position":[[866,18]]}},"keywords":{}}],["batchsiz",{"_index":1354,"title":{},"content":{"209":{"position":[[1017,10]]},"255":{"position":[[1352,10]]},"392":{"position":[[2734,10],[4640,10]]},"632":{"position":[[2397,10]]},"724":{"position":[[1150,10]]},"749":{"position":[[22514,9]]},"759":{"position":[[731,10]]},"760":{"position":[[727,10]]},"846":{"position":[[723,10],[1149,10]]},"862":{"position":[[1389,10],[1415,10]]},"866":{"position":[[858,10],[883,10]]},"872":{"position":[[2586,10],[2611,10],[4602,10],[4627,10]]},"875":{"position":[[1896,9],[3174,11]]},"886":{"position":[[1559,11],[1753,10],[2845,9],[2945,10],[4052,10],[4157,10]]},"898":{"position":[[3466,10],[3879,10]]},"988":{"position":[[2994,10],[3545,10],[3966,10],[4475,10]]},"1125":{"position":[[740,10]]},"1134":{"position":[[770,10]]},"1138":{"position":[[438,9],[604,10]]},"1164":{"position":[[286,10]]},"1294":{"position":[[1494,11]]}},"keywords":{}}],["batteri",{"_index":2744,"title":{},"content":{"412":{"position":[[10701,7]]},"618":{"position":[[465,7]]},"1003":{"position":[[180,8]]}},"keywords":{}}],["battl",{"_index":2170,"title":{},"content":{"386":{"position":[[9,6]]},"710":{"position":[[322,6]]},"1199":{"position":[[6,6]]}},"keywords":{}}],["be",{"_index":645,"title":{},"content":{"41":{"position":[[22,5]]},"76":{"position":[[1,5]]},"174":{"position":[[1259,5]]},"207":{"position":[[363,5]]},"404":{"position":[[491,5]]},"408":{"position":[[615,5]]},"410":{"position":[[955,5]]},"411":{"position":[[637,5]]},"418":{"position":[[233,5]]},"419":{"position":[[346,5]]},"450":{"position":[[719,5]]},"460":{"position":[[145,5]]},"614":{"position":[[682,5]]},"688":{"position":[[1069,5]]},"717":{"position":[[1323,5]]},"837":{"position":[[284,5],[782,5]]},"840":{"position":[[337,5],[428,5]]},"885":{"position":[[434,5]]},"886":{"position":[[4834,5]]},"988":{"position":[[1592,5],[1753,5]]},"1180":{"position":[[349,5]]},"1184":{"position":[[173,5]]},"1304":{"position":[[1512,5],[1777,5]]},"1311":{"position":[[349,7]]}},"keywords":{}}],["bearer",{"_index":4833,"title":{},"content":{"848":{"position":[[47,6],[439,6],[900,6]]},"878":{"position":[[512,7]]},"880":{"position":[[424,7]]},"886":{"position":[[1863,7],[3160,7],[4128,7]]}},"keywords":{}}],["beat",{"_index":691,"title":{"44":{"position":[[51,5]]}},"content":{},"keywords":{}}],["becam",{"_index":4591,"title":{},"content":{"780":{"position":[[166,6]]},"1198":{"position":[[345,6]]}},"keywords":{}}],["becom",{"_index":912,"title":{},"content":{"65":{"position":[[503,7]]},"89":{"position":[[169,7]]},"90":{"position":[[64,7]]},"97":{"position":[[40,7]]},"122":{"position":[[249,7]]},"133":{"position":[[243,7]]},"152":{"position":[[26,6]]},"173":{"position":[[341,7]]},"174":{"position":[[2154,7]]},"232":{"position":[[16,6]]},"255":{"position":[[1793,7]]},"265":{"position":[[667,6]]},"320":{"position":[[391,7]]},"321":{"position":[[397,6]]},"358":{"position":[[447,7]]},"399":{"position":[[443,7]]},"402":{"position":[[316,7]]},"404":{"position":[[228,6]]},"408":{"position":[[3221,7],[5436,6]]},"411":{"position":[[2027,7]]},"412":{"position":[[5829,6],[7311,6],[10215,6],[12769,7]]},"416":{"position":[[432,7]]},"421":{"position":[[732,6],[1212,6]]},"478":{"position":[[219,7]]},"548":{"position":[[428,7]]},"608":{"position":[[426,7]]},"613":{"position":[[920,6]]},"701":{"position":[[724,7]]},"709":{"position":[[458,7],[801,6]]},"739":{"position":[[168,7],[570,7]]},"784":{"position":[[279,8]]},"829":{"position":[[2033,7]]},"974":{"position":[[54,7]]},"985":{"position":[[647,6]]},"1003":{"position":[[126,7],[202,7],[268,7],[307,7]]},"1085":{"position":[[2472,6]]},"1304":{"position":[[699,7]]},"1316":{"position":[[3796,6]]}},"keywords":{}}],["befor",{"_index":458,"title":{},"content":{"28":{"position":[[350,6]]},"151":{"position":[[1,6]]},"188":{"position":[[1607,6]]},"304":{"position":[[323,6]]},"360":{"position":[[184,6]]},"398":{"position":[[643,6]]},"412":{"position":[[121,6],[15364,6]]},"427":{"position":[[720,6]]},"463":{"position":[[1,6]]},"469":{"position":[[1065,6]]},"551":{"position":[[496,6]]},"555":{"position":[[122,6]]},"566":{"position":[[1311,6]]},"653":{"position":[[427,6]]},"666":{"position":[[1,6]]},"667":{"position":[[1,6]]},"676":{"position":[[262,6]]},"683":{"position":[[812,7]]},"696":{"position":[[361,6]]},"703":{"position":[[1678,6]]},"719":{"position":[[468,6]]},"727":{"position":[[80,7]]},"749":{"position":[[13297,6]]},"759":{"position":[[1532,6]]},"767":{"position":[[387,6]]},"768":{"position":[[356,6]]},"770":{"position":[[635,6]]},"846":{"position":[[789,6],[1208,6]]},"849":{"position":[[143,6]]},"857":{"position":[[27,6]]},"884":{"position":[[1,6]]},"886":{"position":[[1276,6],[3017,6]]},"888":{"position":[[92,6]]},"898":{"position":[[1289,6],[3646,6],[3767,6]]},"904":{"position":[[1,6]]},"911":{"position":[[387,6]]},"912":{"position":[[306,6]]},"916":{"position":[[1,6]]},"932":{"position":[[357,6]]},"943":{"position":[[248,6]]},"952":{"position":[[83,6]]},"958":{"position":[[720,6]]},"971":{"position":[[195,6]]},"982":{"position":[[146,6]]},"988":{"position":[[3037,6],[4553,6]]},"994":{"position":[[227,6]]},"1038":{"position":[[109,6]]},"1041":{"position":[[104,7]]},"1084":{"position":[[49,6]]},"1085":{"position":[[2944,6],[3653,6]]},"1106":{"position":[[303,6]]},"1119":{"position":[[326,6]]},"1164":{"position":[[1206,6]]},"1165":{"position":[[619,6]]},"1289":{"position":[[112,6]]},"1316":{"position":[[1664,6]]}},"keywords":{}}],["before.when",{"_index":6470,"title":{},"content":{"1300":{"position":[[752,11]]}},"keywords":{}}],["beforeunload",{"_index":6471,"title":{},"content":{"1300":{"position":[[785,12],[907,12]]}},"keywords":{}}],["began",{"_index":2852,"title":{},"content":{"421":{"position":[[372,5]]}},"keywords":{}}],["begin",{"_index":1075,"title":{},"content":{"119":{"position":[[4,5]]},"206":{"position":[[198,5]]},"285":{"position":[[155,5]]},"411":{"position":[[3142,10]]},"522":{"position":[[78,5]]},"796":{"position":[[938,9]]},"1002":{"position":[[54,9]]},"1207":{"position":[[10,9]]}},"keywords":{}}],["beginn",{"_index":4892,"title":{},"content":{"861":{"position":[[132,9]]}},"keywords":{}}],["behav",{"_index":64,"title":{},"content":{"4":{"position":[[128,6]]},"14":{"position":[[702,7]]},"301":{"position":[[707,7]]},"346":{"position":[[583,7]]},"412":{"position":[[8219,7]]},"462":{"position":[[562,6]]},"679":{"position":[[300,8]]},"689":{"position":[[355,6]]},"749":{"position":[[16659,7]]},"830":{"position":[[332,7]]},"881":{"position":[[17,7],[412,8]]},"956":{"position":[[217,6]]},"1018":{"position":[[19,7]]}},"keywords":{}}],["behavior",{"_index":76,"title":{},"content":{"5":{"position":[[79,9]]},"16":{"position":[[463,8]]},"38":{"position":[[285,8],[462,8]]},"147":{"position":[[238,8]]},"168":{"position":[[370,10]]},"299":{"position":[[683,8]]},"396":{"position":[[1962,8]]},"427":{"position":[[1274,8]]},"437":{"position":[[88,8]]},"618":{"position":[[379,8]]},"660":{"position":[[129,8]]},"749":{"position":[[5779,8]]},"770":{"position":[[177,8]]},"802":{"position":[[458,10]]},"828":{"position":[[418,8]]},"948":{"position":[[320,8]]},"1065":{"position":[[712,8]]},"1085":{"position":[[2349,9]]},"1115":{"position":[[562,8],[762,9]]},"1126":{"position":[[314,9]]},"1164":{"position":[[63,9],[501,8]]},"1188":{"position":[[338,9]]},"1305":{"position":[[345,8]]}},"keywords":{}}],["behavior.multi",{"_index":5433,"title":{},"content":{"981":{"position":[[1484,14]]}},"keywords":{}}],["behaviorsubject",{"_index":5743,"title":{},"content":{"1058":{"position":[[367,16]]}},"keywords":{}}],["behaviorsubjectse",{"_index":5742,"title":{},"content":{"1058":{"position":[[4,18]]}},"keywords":{}}],["behind",{"_index":1161,"title":{},"content":{"152":{"position":[[126,6]]},"354":{"position":[[1234,6]]},"361":{"position":[[1119,6]]},"421":{"position":[[894,7]]},"486":{"position":[[149,6]]},"828":{"position":[[332,6]]}},"keywords":{}}],["belong",{"_index":2512,"title":{},"content":{"405":{"position":[[60,7]]},"412":{"position":[[10815,6]]},"808":{"position":[[77,7]]},"937":{"position":[[131,6]]}},"keywords":{}}],["below",{"_index":1540,"title":{},"content":{"247":{"position":[[90,5]]},"300":{"position":[[119,5]]},"315":{"position":[[108,5]]},"334":{"position":[[1,5]]},"391":{"position":[[253,5]]},"480":{"position":[[1,5]]},"485":{"position":[[126,5]]},"491":{"position":[[1478,7]]},"538":{"position":[[148,5]]},"554":{"position":[[230,5]]},"579":{"position":[[95,5]]},"598":{"position":[[149,5]]},"632":{"position":[[482,6]]},"798":{"position":[[711,5]]},"875":{"position":[[551,5],[592,5],[1181,5],[4376,5]]},"988":{"position":[[4768,6]]},"1066":{"position":[[517,5]]},"1097":{"position":[[820,6]]},"1149":{"position":[[491,5]]}},"keywords":{}}],["benchmark",{"_index":2427,"title":{"399":{"position":[[12,11]]},"1190":{"position":[[25,10]]}},"content":{"399":{"position":[[533,10]]},"401":{"position":[[602,11]]},"471":{"position":[[49,10]]},"703":{"position":[[952,9]]},"1292":{"position":[[31,10]]}},"keywords":{}}],["benchmarks.eas",{"_index":6095,"title":{},"content":{"1156":{"position":[[232,15]]}},"keywords":{}}],["benefici",{"_index":904,"title":{},"content":{"65":{"position":[[100,10]]},"74":{"position":[[49,10]]},"169":{"position":[[240,10]]},"216":{"position":[[254,10]]},"220":{"position":[[242,10]]},"375":{"position":[[34,10]]},"508":{"position":[[118,10]]},"584":{"position":[[206,10]]},"723":{"position":[[609,10]]}},"keywords":{}}],["benefit",{"_index":401,"title":{"85":{"position":[[10,8]]},"151":{"position":[[38,7]]},"265":{"position":[[22,9]]},"410":{"position":[[16,9]]},"411":{"position":[[21,9]]},"485":{"position":[[0,8]]},"723":{"position":[[0,8]]},"902":{"position":[[0,8]]},"1156":{"position":[[4,9]]}},"content":{"24":{"position":[[257,7]]},"53":{"position":[[7,7]]},"65":{"position":[[2042,8]]},"105":{"position":[[196,8]]},"114":{"position":[[634,9]]},"151":{"position":[[284,7]]},"173":{"position":[[231,8],[2429,10]]},"174":{"position":[[3204,10]]},"175":{"position":[[628,8]]},"232":{"position":[[174,7]]},"236":{"position":[[169,8]]},"266":{"position":[[273,8]]},"269":{"position":[[382,10]]},"286":{"position":[[389,10]]},"290":{"position":[[255,9]]},"295":{"position":[[66,9]]},"354":{"position":[[162,7]]},"362":{"position":[[1040,8]]},"366":{"position":[[311,8]]},"370":{"position":[[29,7]]},"372":{"position":[[153,8]]},"376":{"position":[[25,7]]},"387":{"position":[[245,7]]},"410":{"position":[[993,8]]},"411":{"position":[[5268,8]]},"412":{"position":[[9593,9],[15141,8]]},"418":{"position":[[695,8]]},"419":{"position":[[972,8]]},"433":{"position":[[257,9]]},"444":{"position":[[793,8]]},"445":{"position":[[357,8]]},"446":{"position":[[575,7]]},"621":{"position":[[783,8]]},"623":{"position":[[650,10]]},"775":{"position":[[409,7]]},"780":{"position":[[529,7]]},"783":{"position":[[544,7]]},"835":{"position":[[240,7]]},"838":{"position":[[396,8]]},"860":{"position":[[312,9]]},"965":{"position":[[27,7]]},"1008":{"position":[[10,7]]},"1067":{"position":[[1009,7]]},"1085":{"position":[[1860,9]]},"1124":{"position":[[69,8]]},"1132":{"position":[[51,8]]},"1148":{"position":[[176,8]]},"1211":{"position":[[436,8]]},"1213":{"position":[[119,7]]},"1295":{"position":[[530,7]]},"1296":{"position":[[1714,7]]},"1297":{"position":[[596,7]]},"1304":{"position":[[1639,8]]},"1315":{"position":[[1122,7]]}},"keywords":{}}],["besid",{"_index":2861,"title":{},"content":{"422":{"position":[[102,8]]},"659":{"position":[[791,7]]},"685":{"position":[[54,7]]},"696":{"position":[[698,7]]},"716":{"position":[[356,6]]},"835":{"position":[[896,7]]}},"keywords":{}}],["best",{"_index":85,"title":{"142":{"position":[[0,4]]},"346":{"position":[[0,4]]},"374":{"position":[[45,4]]},"556":{"position":[[0,4]]},"590":{"position":[[0,4]]}},"content":{"6":{"position":[[90,4]]},"56":{"position":[[177,4]]},"67":{"position":[[82,4]]},"98":{"position":[[196,4]]},"118":{"position":[[107,4]]},"131":{"position":[[943,4]]},"142":{"position":[[78,4]]},"266":{"position":[[343,4],[403,4]]},"287":{"position":[[1254,4]]},"301":{"position":[[5,4]]},"314":{"position":[[963,4]]},"347":{"position":[[510,4]]},"356":{"position":[[624,4]]},"362":{"position":[[1581,4]]},"369":{"position":[[1564,5]]},"388":{"position":[[192,4]]},"396":{"position":[[1949,4]]},"412":{"position":[[6938,4]]},"470":{"position":[[356,4]]},"489":{"position":[[318,5]]},"500":{"position":[[82,4]]},"524":{"position":[[133,4],[776,4]]},"543":{"position":[[167,4]]},"557":{"position":[[349,4]]},"567":{"position":[[966,4]]},"581":{"position":[[641,4]]},"591":{"position":[[739,4]]},"603":{"position":[[165,4]]},"661":{"position":[[479,4]]},"688":{"position":[[980,4]]},"710":{"position":[[783,4]]},"716":{"position":[[85,4]]},"797":{"position":[[80,4]]},"798":{"position":[[1032,4]]},"821":{"position":[[58,4],[168,4],[596,4]]},"838":{"position":[[1441,4]]},"1071":{"position":[[390,4]]},"1090":{"position":[[99,4]]},"1147":{"position":[[396,4]]},"1231":{"position":[[115,4]]},"1243":{"position":[[87,4]]},"1244":{"position":[[73,4]]},"1245":{"position":[[32,4]]},"1270":{"position":[[298,4]]},"1297":{"position":[[472,4]]}},"keywords":{}}],["best.if",{"_index":3208,"title":{},"content":{"497":{"position":[[653,7]]}},"keywords":{}}],["bestfriend",{"_index":4675,"title":{},"content":{"808":{"position":[[248,11]]},"810":{"position":[[236,11],[305,11],[393,10]]},"811":{"position":[[216,11],[285,11],[373,10]]}},"keywords":{}}],["bestindex",{"_index":4709,"title":{},"content":{"820":{"position":[[149,11]]}},"keywords":{}}],["better",{"_index":62,"title":{"73":{"position":[[27,6]]},"74":{"position":[[10,6]]},"91":{"position":[[28,7]]},"104":{"position":[[27,6]]},"105":{"position":[[10,6]]},"232":{"position":[[0,6]]},"278":{"position":[[15,6]]},"281":{"position":[[10,6]]},"353":{"position":[[9,8]]},"395":{"position":[[28,6]]},"486":{"position":[[0,6]]},"487":{"position":[[0,6]]},"778":{"position":[[6,6]]},"796":{"position":[[48,6]]}},"content":{"4":{"position":[[101,6]]},"31":{"position":[[228,6]]},"33":{"position":[[69,6]]},"59":{"position":[[130,6]]},"131":{"position":[[687,6]]},"314":{"position":[[136,6]]},"336":{"position":[[290,6]]},"400":{"position":[[502,6]]},"402":{"position":[[1598,6],[1982,7]]},"408":{"position":[[4963,6]]},"411":{"position":[[3718,6],[3936,6]]},"412":{"position":[[4969,6]]},"425":{"position":[[48,6]]},"430":{"position":[[832,6]]},"432":{"position":[[1410,6]]},"466":{"position":[[401,6]]},"469":{"position":[[1374,6]]},"470":{"position":[[134,6]]},"473":{"position":[[203,6]]},"546":{"position":[[163,6]]},"554":{"position":[[196,6]]},"566":{"position":[[677,6]]},"606":{"position":[[163,6]]},"640":{"position":[[241,6]]},"655":{"position":[[270,6]]},"681":{"position":[[143,6]]},"698":{"position":[[968,6]]},"703":{"position":[[1637,6]]},"704":{"position":[[523,6]]},"705":{"position":[[456,6],[508,6]]},"710":{"position":[[2178,6]]},"752":{"position":[[245,6]]},"772":{"position":[[2587,8]]},"775":{"position":[[428,6],[614,6]]},"796":{"position":[[225,6],[363,6],[659,6],[1079,6]]},"798":{"position":[[464,6]]},"800":{"position":[[173,6]]},"802":{"position":[[98,6]]},"821":{"position":[[1010,6]]},"945":{"position":[[355,6]]},"951":{"position":[[65,6]]},"965":{"position":[[292,6]]},"983":{"position":[[81,6]]},"989":{"position":[[5,6]]},"1013":{"position":[[5,6]]},"1022":{"position":[[114,6]]},"1067":{"position":[[140,6],[631,6]]},"1071":{"position":[[168,6]]},"1098":{"position":[[120,6]]},"1099":{"position":[[112,6]]},"1138":{"position":[[362,6]]},"1143":{"position":[[205,6]]},"1152":{"position":[[109,6]]},"1162":{"position":[[1100,6],[1141,6]]},"1175":{"position":[[259,6]]},"1186":{"position":[[105,6]]},"1286":{"position":[[112,6]]},"1309":{"position":[[886,6]]}},"keywords":{}}],["between",{"_index":219,"title":{"132":{"position":[[29,7]]},"163":{"position":[[29,7]]},"190":{"position":[[29,7]]},"288":{"position":[[30,7]]},"337":{"position":[[29,7]]},"525":{"position":[[29,7]]},"582":{"position":[[29,7]]},"775":{"position":[[15,7]]},"900":{"position":[[45,7]]},"1215":{"position":[[11,7]]}},"content":{"14":{"position":[[552,7]]},"26":{"position":[[185,7]]},"37":{"position":[[54,7]]},"82":{"position":[[125,7]]},"123":{"position":[[53,7]]},"132":{"position":[[18,7],[208,7]]},"147":{"position":[[40,7]]},"151":{"position":[[244,7]]},"153":{"position":[[391,7]]},"158":{"position":[[49,7]]},"165":{"position":[[94,7]]},"173":{"position":[[2838,7]]},"181":{"position":[[308,7]]},"184":{"position":[[159,7]]},"190":{"position":[[69,7]]},"192":{"position":[[96,7]]},"208":{"position":[[54,7]]},"223":{"position":[[28,7],[299,7]]},"275":{"position":[[235,7]]},"279":{"position":[[138,7]]},"288":{"position":[[28,7],[282,7]]},"289":{"position":[[120,7],[557,7],[775,7],[1164,7]]},"293":{"position":[[27,7],[234,7]]},"299":{"position":[[703,7]]},"321":{"position":[[148,7]]},"330":{"position":[[83,7]]},"365":{"position":[[708,7]]},"369":{"position":[[1069,7]]},"375":{"position":[[675,7]]},"393":{"position":[[184,7],[855,7]]},"394":{"position":[[367,7]]},"396":{"position":[[477,7]]},"397":{"position":[[1460,7]]},"398":{"position":[[3144,7]]},"401":{"position":[[831,7]]},"427":{"position":[[607,7]]},"439":{"position":[[478,7]]},"444":{"position":[[863,7]]},"450":{"position":[[281,7]]},"458":{"position":[[293,7],[537,7],[616,7]]},"459":{"position":[[20,7],[555,7]]},"461":{"position":[[892,7]]},"467":{"position":[[631,7]]},"469":{"position":[[191,7],[1156,7]]},"470":{"position":[[381,7]]},"502":{"position":[[1321,7]]},"504":{"position":[[559,7],[635,7],[841,7],[965,7],[1372,7]]},"517":{"position":[[87,7],[216,7]]},"525":{"position":[[472,7]]},"556":{"position":[[1601,7]]},"570":{"position":[[695,7],[791,7]]},"611":{"position":[[93,7]]},"612":{"position":[[950,7]]},"613":{"position":[[86,7]]},"614":{"position":[[367,7],[511,7]]},"617":{"position":[[2130,7],[2295,7]]},"632":{"position":[[187,7]]},"699":{"position":[[24,7],[381,7]]},"701":{"position":[[675,7]]},"703":{"position":[[134,7],[973,7]]},"709":{"position":[[497,7]]},"710":{"position":[[1133,7]]},"711":{"position":[[368,7]]},"737":{"position":[[373,7]]},"743":{"position":[[92,7],[257,7]]},"755":{"position":[[186,7]]},"774":{"position":[[1043,7]]},"779":{"position":[[424,7]]},"849":{"position":[[646,7]]},"870":{"position":[[21,7]]},"871":{"position":[[413,7]]},"872":{"position":[[2207,7]]},"876":{"position":[[73,7]]},"896":{"position":[[128,7]]},"901":{"position":[[162,7]]},"904":{"position":[[131,7]]},"938":{"position":[[87,7]]},"961":{"position":[[201,7]]},"964":{"position":[[181,7],[293,7]]},"1033":{"position":[[1006,7]]},"1068":{"position":[[406,7]]},"1072":{"position":[[913,7]]},"1074":{"position":[[347,7]]},"1094":{"position":[[250,7]]},"1121":{"position":[[122,7],[304,7]]},"1124":{"position":[[1047,7],[1268,7],[1614,7]]},"1126":{"position":[[892,7]]},"1164":{"position":[[1030,7]]},"1174":{"position":[[396,7]]},"1215":{"position":[[52,7]]},"1295":{"position":[[329,7],[474,7]]},"1301":{"position":[[20,7],[707,7],[1182,7],[1228,7]]},"1304":{"position":[[294,7]]},"1313":{"position":[[747,8]]},"1315":{"position":[[1641,8]]},"1316":{"position":[[2535,7],[2607,7]]}},"keywords":{}}],["beyond",{"_index":856,"title":{"561":{"position":[[15,6]]}},"content":{"57":{"position":[[1,6]]},"362":{"position":[[642,6]]},"365":{"position":[[330,6]]},"390":{"position":[[909,6]]},"412":{"position":[[7264,6]]},"414":{"position":[[301,7]]},"436":{"position":[[37,6]]},"491":{"position":[[569,6],[1507,7],[1624,6]]},"518":{"position":[[41,6]]},"544":{"position":[[48,6]]},"585":{"position":[[1,6]]},"604":{"position":[[48,6]]},"701":{"position":[[35,6]]},"709":{"position":[[293,6]]},"723":{"position":[[2236,6]]}},"keywords":{}}],["bi",{"_index":2155,"title":{},"content":{"381":{"position":[[35,2]]}},"keywords":{}}],["bidirect",{"_index":1117,"title":{"135":{"position":[[0,13]]},"340":{"position":[[0,13]]}},"content":{"135":{"position":[[15,13]]},"289":{"position":[[745,13]]},"622":{"position":[[631,13]]}},"keywords":{}}],["big",{"_index":215,"title":{"466":{"position":[[0,3]]},"467":{"position":[[0,3]]}},"content":{"14":{"position":[[506,3],[676,3]]},"36":{"position":[[459,3]]},"404":{"position":[[825,3]]},"411":{"position":[[2735,3],[3515,3]]},"412":{"position":[[6470,3],[10419,3]]},"458":{"position":[[3,3]]},"459":{"position":[[5,3]]},"466":{"position":[[28,3]]},"468":{"position":[[145,3]]},"556":{"position":[[1202,3]]},"617":{"position":[[1022,3]]},"644":{"position":[[226,3]]},"661":{"position":[[1796,3]]},"696":{"position":[[1842,3]]},"749":{"position":[[21584,3],[21652,3]]},"779":{"position":[[12,3]]},"800":{"position":[[482,3]]},"835":{"position":[[107,3],[236,3]]},"837":{"position":[[545,3]]},"951":{"position":[[135,3]]},"965":{"position":[[23,3],[73,3]]},"1116":{"position":[[64,3]]},"1137":{"position":[[220,3]]},"1171":{"position":[[420,3]]},"1181":{"position":[[49,3]]},"1186":{"position":[[90,3]]},"1191":{"position":[[3,3]]},"1192":{"position":[[503,3]]},"1200":{"position":[[1,3]]},"1237":{"position":[[56,3]]},"1239":{"position":[[274,3]]},"1295":{"position":[[645,3]]},"1296":{"position":[[1710,3]]},"1301":{"position":[[5,3]]},"1319":{"position":[[160,3]]}},"keywords":{}}],["big.becaus",{"_index":6110,"title":{},"content":{"1162":{"position":[[490,11]]},"1181":{"position":[[577,11]]}},"keywords":{}}],["bigger",{"_index":404,"title":{},"content":{"24":{"position":[[497,6]]},"408":{"position":[[2483,6]]},"412":{"position":[[11940,6]]},"773":{"position":[[733,6]]},"1235":{"position":[[89,6]]},"1286":{"position":[[171,6]]},"1297":{"position":[[570,6]]}},"keywords":{}}],["biggest",{"_index":233,"title":{},"content":{"14":{"position":[[926,7]]},"19":{"position":[[960,7]]},"686":{"position":[[96,7]]}},"keywords":{}}],["bill",{"_index":1319,"title":{},"content":{"204":{"position":[[139,5]]}},"keywords":{}}],["billabl",{"_index":1553,"title":{},"content":{"251":{"position":[[34,8]]}},"keywords":{}}],["binari",{"_index":1821,"title":{},"content":{"303":{"position":[[156,6]]},"411":{"position":[[3519,6]]},"453":{"position":[[213,6],[435,6]]},"454":{"position":[[27,6]]},"457":{"position":[[458,6]]},"468":{"position":[[499,6]]},"686":{"position":[[532,6]]},"708":{"position":[[222,8],[448,8]]},"838":{"position":[[3361,6]]},"1132":{"position":[[1309,6],[1447,6]]},"1143":{"position":[[274,6]]},"1167":{"position":[[19,6]]},"1209":{"position":[[73,6]]},"1282":{"position":[[87,6]]}},"keywords":{}}],["bind",{"_index":83,"title":{},"content":{"6":{"position":[[33,7]]},"50":{"position":[[400,7]]},"130":{"position":[[221,4]]},"286":{"position":[[222,8]]},"411":{"position":[[2274,4]]},"662":{"position":[[917,7]]},"766":{"position":[[248,4]]},"800":{"position":[[248,7]]},"1133":{"position":[[126,8]]}},"keywords":{}}],["bind_ip_al",{"_index":4944,"title":{},"content":{"872":{"position":[[568,11]]}},"keywords":{}}],["birthyear",{"_index":5808,"title":{},"content":{"1074":{"position":[[410,9]]}},"keywords":{}}],["bit",{"_index":325,"title":{},"content":{"19":{"position":[[285,3]]},"42":{"position":[[94,3]]},"356":{"position":[[916,3]]},"412":{"position":[[8529,3]]},"452":{"position":[[177,3]]},"463":{"position":[[609,3],[1380,3]]},"464":{"position":[[893,3]]},"698":{"position":[[1580,3]]},"1235":{"position":[[213,3]]},"1270":{"position":[[25,3],[135,3]]},"1286":{"position":[[100,3]]}},"keywords":{}}],["bite",{"_index":3959,"title":{},"content":{"701":{"position":[[610,4]]}},"keywords":{}}],["blend",{"_index":2796,"title":{},"content":{"418":{"position":[[537,5]]}},"keywords":{}}],["bloat",{"_index":2083,"title":{},"content":{"361":{"position":[[286,5]]},"841":{"position":[[964,5]]}},"keywords":{}}],["blob",{"_index":5291,"title":{},"content":{"917":{"position":[[433,4],[642,6]]},"918":{"position":[[72,5]]},"930":{"position":[[59,5],[136,4],[174,4]]},"1282":{"position":[[114,5]]}},"keywords":{}}],["blob.arraybuff",{"_index":5292,"title":{},"content":{"917":{"position":[[511,18]]}},"keywords":{}}],["block",{"_index":499,"title":{"1033":{"position":[[22,5]]},"1186":{"position":[[0,5]]}},"content":{"31":{"position":[[188,6]]},"302":{"position":[[398,6]]},"421":{"position":[[931,7]]},"427":{"position":[[122,8],[209,8],[296,5],[1107,9]]},"451":{"position":[[575,6],[672,5]]},"460":{"position":[[1319,5],[1398,5]]},"468":{"position":[[73,6]]},"491":{"position":[[995,7]]},"559":{"position":[[1121,5]]},"566":{"position":[[647,10]]},"619":{"position":[[213,5]]},"627":{"position":[[130,5]]},"634":{"position":[[618,8]]},"699":{"position":[[869,7]]},"705":{"position":[[1029,5]]},"710":{"position":[[2415,5]]},"740":{"position":[[168,7]]},"765":{"position":[[69,6]]},"801":{"position":[[220,5]]},"835":{"position":[[166,8],[295,5]]},"837":{"position":[[269,6]]},"995":{"position":[[506,5],[587,5],[1331,5]]},"1007":{"position":[[94,5]]},"1021":{"position":[[36,5]]},"1032":{"position":[[152,7],[256,7]]},"1033":{"position":[[85,8],[200,5],[657,5]]},"1093":{"position":[[438,8],[512,8]]},"1106":{"position":[[508,5]]},"1157":{"position":[[248,5]]},"1176":{"position":[[279,5]]},"1186":{"position":[[71,6],[94,6],[222,6]]},"1250":{"position":[[345,8]]},"1301":{"position":[[1533,7]]},"1304":{"position":[[1728,8]]},"1313":{"position":[[350,5]]}},"keywords":{}}],["blocksizelimit",{"_index":6157,"title":{},"content":{"1186":{"position":[[142,14],[295,15]]}},"keywords":{}}],["blue",{"_index":6525,"title":{},"content":{"1314":{"position":[[476,5],[691,7]]}},"keywords":{}}],["boast",{"_index":964,"title":{},"content":{"74":{"position":[[6,6]]}},"keywords":{}}],["bob",{"_index":2769,"title":{},"content":{"412":{"position":[[13971,3]]},"810":{"position":[[298,6]]},"811":{"position":[[278,6]]},"813":{"position":[[304,6]]},"948":{"position":[[398,6]]},"951":{"position":[[341,6]]},"1316":{"position":[[1059,4],[1198,3]]}},"keywords":{}}],["bob'",{"_index":6549,"title":{},"content":{"1316":{"position":[[1136,5]]}},"keywords":{}}],["bodi",{"_index":1350,"title":{},"content":{"209":{"position":[[863,5]]},"255":{"position":[[1209,5]]},"612":{"position":[[471,4]]},"616":{"position":[[707,4],[1182,4]]},"875":{"position":[[6368,5]]},"988":{"position":[[2663,5]]},"1102":{"position":[[636,5]]}},"keywords":{}}],["boilerpl",{"_index":1934,"title":{},"content":{"331":{"position":[[140,12]]},"411":{"position":[[1527,11]]}},"keywords":{}}],["bolster",{"_index":5278,"title":{},"content":{"912":{"position":[[112,10]]}},"keywords":{}}],["bombard",{"_index":2609,"title":{},"content":{"411":{"position":[[643,9]]}},"keywords":{}}],["book",{"_index":2332,"title":{},"content":{"395":{"position":[[361,5]]}},"keywords":{}}],["boolean",{"_index":1345,"title":{},"content":{"209":{"position":[[570,9]]},"255":{"position":[[910,9]]},"367":{"position":[[969,9]]},"459":{"position":[[1048,7],[1145,7]]},"480":{"position":[[660,9]]},"632":{"position":[[1660,9]]},"749":{"position":[[20733,7]]},"855":{"position":[[181,7]]},"861":{"position":[[2025,7]]},"867":{"position":[[176,7]]},"885":{"position":[[609,8],[704,8]]},"898":{"position":[[363,7],[588,7],[1105,7]]},"904":{"position":[[999,10]]},"988":{"position":[[1688,7],[2024,7],[2144,7]]},"1049":{"position":[[9,7]]},"1079":{"position":[[185,7]]},"1080":{"position":[[404,9],[753,7]]},"1158":{"position":[[484,9]]},"1296":{"position":[[1775,7]]}},"keywords":{}}],["boost",{"_index":1969,"title":{},"content":{"345":{"position":[[128,5]]},"398":{"position":[[159,6]]},"408":{"position":[[4227,5]]},"420":{"position":[[1538,5]]},"490":{"position":[[684,8]]},"643":{"position":[[162,5]]}},"keywords":{}}],["bot",{"_index":6172,"title":{},"content":{"1198":{"position":[[764,3]]}},"keywords":{}}],["both",{"_index":298,"title":{"616":{"position":[[16,4]]}},"content":{"17":{"position":[[513,4]]},"38":{"position":[[379,4]]},"43":{"position":[[236,4]]},"135":{"position":[[73,4]]},"266":{"position":[[351,4]]},"300":{"position":[[147,4]]},"316":{"position":[[509,4]]},"340":{"position":[[30,4]]},"356":{"position":[[632,4]]},"366":{"position":[[325,4]]},"372":{"position":[[165,4]]},"397":{"position":[[151,4]]},"398":{"position":[[495,4],[619,4],[2907,4]]},"407":{"position":[[943,4]]},"412":{"position":[[3141,4],[3183,4],[3474,4]]},"420":{"position":[[1475,4]]},"427":{"position":[[1440,4]]},"444":{"position":[[805,4]]},"445":{"position":[[2247,4]]},"446":{"position":[[1358,4]]},"464":{"position":[[979,4]]},"500":{"position":[[90,4]]},"534":{"position":[[82,4]]},"594":{"position":[[80,4]]},"611":{"position":[[431,4]]},"613":{"position":[[255,4]]},"616":{"position":[[56,4]]},"622":{"position":[[607,4]]},"624":{"position":[[1229,4]]},"690":{"position":[[459,4]]},"691":{"position":[[176,4],[612,4]]},"698":{"position":[[64,4],[466,4]]},"723":{"position":[[1859,4]]},"740":{"position":[[265,4]]},"749":{"position":[[501,5]]},"964":{"position":[[314,4]]},"1124":{"position":[[1414,4]]},"1208":{"position":[[623,4]]},"1218":{"position":[[195,4]]},"1227":{"position":[[506,5]]},"1231":{"position":[[383,4]]},"1265":{"position":[[500,5]]},"1267":{"position":[[575,4]]},"1287":{"position":[[1,4]]},"1296":{"position":[[1497,4]]},"1324":{"position":[[97,5]]}},"keywords":{}}],["bottleneck",{"_index":386,"title":{},"content":{"23":{"position":[[264,10]]},"265":{"position":[[545,11],[676,10]]},"267":{"position":[[1348,12]]},"412":{"position":[[10224,11]]},"430":{"position":[[783,12]]},"709":{"position":[[825,11]]},"836":{"position":[[1698,11]]},"837":{"position":[[706,10]]},"1157":{"position":[[344,11]]}},"keywords":{}}],["bought",{"_index":429,"title":{},"content":{"26":{"position":[[315,6]]},"36":{"position":[[255,6]]}},"keywords":{}}],["bound",{"_index":2719,"title":{},"content":{"412":{"position":[[7242,5]]},"1052":{"position":[[314,5],[405,5]]},"1191":{"position":[[120,5]]},"1311":{"position":[[1213,5]]}},"keywords":{}}],["boundari",{"_index":3245,"title":{},"content":{"510":{"position":[[551,10]]},"1314":{"position":[[279,8]]}},"keywords":{}}],["box",{"_index":634,"title":{},"content":{"40":{"position":[[283,4]]},"125":{"position":[[26,3]]},"331":{"position":[[262,3]]},"459":{"position":[[296,4]]},"491":{"position":[[919,4]]},"535":{"position":[[769,4]]},"566":{"position":[[1096,4]]},"595":{"position":[[790,4]]},"836":{"position":[[1352,4]]},"1148":{"position":[[159,4]]}},"keywords":{}}],["boxrxdb",{"_index":1909,"title":{},"content":{"317":{"position":[[226,7]]}},"keywords":{}}],["branch",{"_index":649,"title":{"1092":{"position":[[31,9]]},"1093":{"position":[[11,8]]}},"content":{"41":{"position":[[61,7]]},"1092":{"position":[[255,9],[269,8],[459,8],[537,8]]},"1093":{"position":[[138,8]]}},"keywords":{}}],["brand",{"_index":2815,"title":{},"content":{"419":{"position":[[1653,8]]},"498":{"position":[[118,5]]}},"keywords":{}}],["breach",{"_index":2592,"title":{},"content":{"410":{"position":[[743,9]]},"550":{"position":[[340,8]]}},"keywords":{}}],["break",{"_index":1694,"title":{},"content":{"295":{"position":[[234,8]]},"358":{"position":[[675,5]]},"455":{"position":[[709,8]]},"577":{"position":[[7,5]]},"627":{"position":[[163,5]]},"705":{"position":[[779,8]]},"761":{"position":[[145,5]]},"849":{"position":[[918,6]]},"1292":{"position":[[842,6]]},"1301":{"position":[[1492,5]]},"1304":{"position":[[876,6]]}},"keywords":{}}],["brick",{"_index":2750,"title":{},"content":{"412":{"position":[[11873,5]]}},"keywords":{}}],["bridg",{"_index":1636,"title":{},"content":{"275":{"position":[[228,6]]},"354":{"position":[[1052,8]]},"438":{"position":[[223,7]]},"502":{"position":[[522,7]]},"563":{"position":[[1073,8]]},"567":{"position":[[872,8]]},"576":{"position":[[328,7]]},"828":{"position":[[198,7]]},"836":{"position":[[1624,6]]},"841":{"position":[[920,8]]},"1211":{"position":[[484,6]]}},"keywords":{}}],["brief",{"_index":2949,"title":{},"content":{"449":{"position":[[19,5]]}},"keywords":{}}],["bring",{"_index":1069,"title":{},"content":{"118":{"position":[[297,6]]},"153":{"position":[[182,6]]},"500":{"position":[[365,5]]},"875":{"position":[[6711,6]]}},"keywords":{}}],["broad",{"_index":2105,"title":{},"content":{"364":{"position":[[354,5]]}},"keywords":{}}],["broadcast",{"_index":3169,"title":{},"content":{"491":{"position":[[712,9],[1726,9]]},"617":{"position":[[2226,9]]},"622":{"position":[[236,12]]},"710":{"position":[[1104,9]]},"743":{"position":[[44,9]]},"1126":{"position":[[488,9]]}},"keywords":{}}],["broadcastchannel",{"_index":2988,"title":{},"content":{"458":{"position":[[1074,16]]},"1088":{"position":[[525,17]]},"1124":{"position":[[1231,16]]},"1126":{"position":[[254,16]]},"1301":{"position":[[1146,16]]}},"keywords":{}}],["broader",{"_index":2802,"title":{},"content":{"419":{"position":[[645,7]]}},"keywords":{}}],["broken",{"_index":2635,"title":{},"content":{"411":{"position":[[4836,7]]}},"keywords":{}}],["brought",{"_index":6557,"title":{},"content":{"1316":{"position":[[2315,7]]}},"keywords":{}}],["brows",{"_index":1982,"title":{},"content":{"347":{"position":[[453,6]]},"362":{"position":[[1524,6]]},"439":{"position":[[242,8]]},"567":{"position":[[499,6]]},"591":{"position":[[695,6]]}},"keywords":{}}],["browser",{"_index":51,"title":{"60":{"position":[[34,7]]},"62":{"position":[[0,7],[41,8]]},"65":{"position":[[22,8]]},"66":{"position":[[0,7]]},"67":{"position":[[56,8]]},"71":{"position":[[26,7]]},"85":{"position":[[22,7]]},"86":{"position":[[40,8]]},"91":{"position":[[0,7]]},"98":{"position":[[57,8]]},"102":{"position":[[31,8]]},"299":{"position":[[0,7]]},"368":{"position":[[24,7]]},"391":{"position":[[35,8]]},"439":{"position":[[16,7]]},"449":{"position":[[39,8]]},"547":{"position":[[34,7]]},"607":{"position":[[34,7]]},"697":{"position":[[0,7]]},"755":{"position":[[26,9]]},"900":{"position":[[53,8]]},"1195":{"position":[[0,7]]},"1237":{"position":[[23,7]]},"1276":{"position":[[30,8]]}},"content":{"2":{"position":[[448,7]]},"3":{"position":[[71,8]]},"16":{"position":[[514,7]]},"17":{"position":[[377,8]]},"28":{"position":[[525,7]]},"30":{"position":[[302,8]]},"32":{"position":[[87,9]]},"35":{"position":[[278,9]]},"38":{"position":[[675,9]]},"45":{"position":[[191,8]]},"47":{"position":[[934,7],[1172,7],[1209,7]]},"53":{"position":[[139,7]]},"58":{"position":[[246,8]]},"59":{"position":[[89,7]]},"60":{"position":[[47,7]]},"63":{"position":[[88,8]]},"64":{"position":[[79,7]]},"65":{"position":[[60,8],[170,7],[474,7],[835,7],[1071,8],[1339,7],[1612,7],[1832,7]]},"66":{"position":[[7,7],[181,7],[412,8]]},"67":{"position":[[98,7]]},"71":{"position":[[33,7]]},"80":{"position":[[103,7]]},"82":{"position":[[137,7]]},"83":{"position":[[65,7],[319,8],[460,7]]},"84":{"position":[[62,7]]},"86":{"position":[[62,8]]},"87":{"position":[[17,7]]},"88":{"position":[[21,7]]},"89":{"position":[[1,7]]},"90":{"position":[[14,7]]},"91":{"position":[[1,7]]},"92":{"position":[[1,7]]},"93":{"position":[[21,7]]},"94":{"position":[[1,7]]},"95":{"position":[[95,7]]},"96":{"position":[[19,7]]},"97":{"position":[[28,8]]},"98":{"position":[[113,7],[213,8]]},"99":{"position":[[266,7]]},"100":{"position":[[128,7],[163,7],[212,7],[246,7]]},"101":{"position":[[87,7],[109,7],[228,7]]},"102":{"position":[[59,7],[123,7]]},"107":{"position":[[175,7]]},"112":{"position":[[166,9]]},"114":{"position":[[62,7],[490,7],[662,7]]},"120":{"position":[[129,7]]},"125":{"position":[[130,7]]},"131":{"position":[[289,7],[474,9],[638,7]]},"149":{"position":[[62,7]]},"160":{"position":[[93,7],[262,7]]},"162":{"position":[[197,8]]},"172":{"position":[[184,7]]},"174":{"position":[[2005,7],[2766,9]]},"181":{"position":[[80,7]]},"201":{"position":[[157,9]]},"207":{"position":[[144,8]]},"227":{"position":[[135,7],[220,7]]},"228":{"position":[[102,7],[266,7]]},"237":{"position":[[108,7]]},"239":{"position":[[212,9]]},"244":{"position":[[358,7]]},"248":{"position":[[47,9]]},"254":{"position":[[114,8],[298,8]]},"266":{"position":[[180,8],[1092,7]]},"287":{"position":[[375,8],[484,7]]},"298":{"position":[[1,8],[203,8],[486,9]]},"299":{"position":[[51,8],[211,7],[1635,8]]},"300":{"position":[[440,8],[563,7]]},"302":{"position":[[81,8]]},"304":{"position":[[202,7],[446,8]]},"321":{"position":[[349,7]]},"322":{"position":[[147,8]]},"325":{"position":[[62,7]]},"328":{"position":[[144,7]]},"336":{"position":[[117,8],[478,7]]},"343":{"position":[[55,8]]},"347":{"position":[[62,7]]},"357":{"position":[[589,7]]},"362":{"position":[[1133,7]]},"365":{"position":[[900,7]]},"368":{"position":[[45,7],[212,7],[336,7]]},"383":{"position":[[387,8]]},"384":{"position":[[94,8]]},"391":{"position":[[227,7]]},"392":{"position":[[122,8],[2108,8],[2170,7]]},"404":{"position":[[198,7]]},"408":{"position":[[173,7],[289,9],[525,9],[636,8],[799,8],[1520,7],[1646,8],[1889,8],[3582,7],[3834,8],[4610,8],[4935,8],[5032,7]]},"410":{"position":[[1527,7]]},"411":{"position":[[4138,9]]},"412":{"position":[[7667,8],[7710,7],[7784,8],[7963,8],[8063,7],[8554,9],[10201,7]]},"424":{"position":[[51,8],[327,7]]},"427":{"position":[[1316,7],[1468,8]]},"429":{"position":[[281,9]]},"435":{"position":[[166,9]]},"436":{"position":[[181,7]]},"439":{"position":[[7,7],[164,7],[314,7],[508,7]]},"451":{"position":[[166,8],[880,7]]},"453":{"position":[[129,8]]},"454":{"position":[[121,8],[224,8],[370,7],[550,7],[831,8],[938,7]]},"455":{"position":[[54,8],[281,8],[515,8],[732,8],[901,7]]},"456":{"position":[[145,7]]},"458":{"position":[[137,7],[1126,7],[1409,7],[1512,7]]},"460":{"position":[[236,7],[881,7]]},"461":{"position":[[180,8],[678,8],[1040,7],[1161,8]]},"467":{"position":[[607,7]]},"468":{"position":[[707,7]]},"470":{"position":[[93,7],[335,7]]},"475":{"position":[[46,7]]},"479":{"position":[[306,8]]},"490":{"position":[[379,7]]},"504":{"position":[[128,8]]},"511":{"position":[[62,7]]},"519":{"position":[[44,7]]},"524":{"position":[[255,8],[657,7],[916,7],[1007,7]]},"531":{"position":[[62,7]]},"533":{"position":[[88,8]]},"535":{"position":[[1221,8]]},"541":{"position":[[875,7]]},"545":{"position":[[167,8],[227,7]]},"547":{"position":[[47,7]]},"559":{"position":[[28,7],[82,8]]},"560":{"position":[[162,8]]},"562":{"position":[[1708,7]]},"569":{"position":[[1316,8]]},"571":{"position":[[409,7]]},"574":{"position":[[588,8],[868,7]]},"575":{"position":[[176,9]]},"581":{"position":[[164,8],[486,8],[572,7]]},"586":{"position":[[126,8]]},"591":{"position":[[62,7]]},"593":{"position":[[88,8]]},"595":{"position":[[1282,7]]},"600":{"position":[[196,7]]},"601":{"position":[[850,7]]},"605":{"position":[[167,8],[227,7]]},"607":{"position":[[47,7]]},"610":{"position":[[108,8]]},"611":{"position":[[148,8]]},"612":{"position":[[718,8]]},"613":{"position":[[764,7]]},"614":{"position":[[157,8],[375,9]]},"617":{"position":[[13,8],[191,7],[1214,7],[1636,8],[1808,7],[1838,7],[1942,7]]},"624":{"position":[[782,7]]},"630":{"position":[[276,9]]},"631":{"position":[[145,8]]},"634":{"position":[[411,7]]},"640":{"position":[[144,8],[200,8]]},"641":{"position":[[275,9],[331,9]]},"642":{"position":[[6,7]]},"659":{"position":[[134,8]]},"660":{"position":[[121,7],[442,9]]},"662":{"position":[[874,8]]},"676":{"position":[[35,8]]},"696":{"position":[[778,8],[1043,7],[1255,7],[1303,7],[1441,7],[1908,8]]},"697":{"position":[[211,8],[330,8],[593,7]]},"703":{"position":[[441,7],[504,8],[1033,7],[1121,8]]},"707":{"position":[[233,7]]},"709":{"position":[[43,7],[516,7],[725,7],[1194,8]]},"710":{"position":[[1141,7]]},"717":{"position":[[389,8]]},"723":{"position":[[820,7],[970,7]]},"728":{"position":[[105,9]]},"729":{"position":[[244,7]]},"736":{"position":[[336,7]]},"737":{"position":[[386,7]]},"740":{"position":[[270,7]]},"743":{"position":[[183,7]]},"749":{"position":[[8845,7]]},"755":{"position":[[56,8],[194,7]]},"793":{"position":[[193,9],[216,9],[245,9]]},"801":{"position":[[865,9]]},"821":{"position":[[516,8]]},"830":{"position":[[126,7]]},"835":{"position":[[76,8]]},"849":{"position":[[154,7],[235,7],[268,8],[374,7],[658,7]]},"863":{"position":[[226,9]]},"871":{"position":[[699,8]]},"879":{"position":[[537,7]]},"882":{"position":[[136,7]]},"896":{"position":[[321,8]]},"897":{"position":[[444,8]]},"898":{"position":[[2044,8],[2799,8]]},"901":{"position":[[84,8]]},"903":{"position":[[410,10]]},"904":{"position":[[491,8]]},"910":{"position":[[8,7]]},"911":{"position":[[18,8]]},"932":{"position":[[667,9]]},"956":{"position":[[122,7]]},"958":{"position":[[19,7]]},"962":{"position":[[515,7],[649,8]]},"964":{"position":[[254,7]]},"968":{"position":[[759,7]]},"979":{"position":[[203,7]]},"981":{"position":[[818,9],[942,8],[1535,7]]},"988":{"position":[[1167,7],[1241,7]]},"989":{"position":[[97,7],[434,7]]},"1003":{"position":[[164,7]]},"1030":{"position":[[80,7]]},"1088":{"position":[[261,7]]},"1115":{"position":[[648,7]]},"1117":{"position":[[553,7]]},"1120":{"position":[[308,7]]},"1141":{"position":[[111,7]]},"1157":{"position":[[118,8],[553,8]]},"1159":{"position":[[43,9]]},"1162":{"position":[[98,7],[414,7]]},"1164":{"position":[[1466,7]]},"1171":{"position":[[115,7]]},"1172":{"position":[[116,8]]},"1174":{"position":[[81,7]]},"1176":{"position":[[186,8],[506,7]]},"1181":{"position":[[164,7],[501,7]]},"1183":{"position":[[150,7],[240,7],[401,7]]},"1191":{"position":[[274,7]]},"1195":{"position":[[33,7]]},"1198":{"position":[[1392,8]]},"1202":{"position":[[283,7]]},"1206":{"position":[[51,7]]},"1207":{"position":[[91,8],[647,8]]},"1214":{"position":[[33,7],[72,9],[191,7],[283,7],[611,7]]},"1232":{"position":[[54,7]]},"1235":{"position":[[8,8]]},"1237":{"position":[[22,7]]},"1242":{"position":[[60,8]]},"1244":{"position":[[156,8]]},"1246":{"position":[[125,9],[477,10],[1969,9]]},"1249":{"position":[[56,9]]},"1276":{"position":[[8,7],[341,8],[540,8]]},"1292":{"position":[[259,9]]},"1295":{"position":[[421,8]]},"1297":{"position":[[16,8]]},"1298":{"position":[[124,7],[253,9]]},"1300":{"position":[[1089,7]]},"1301":{"position":[[113,7],[240,7],[797,7],[942,9],[1612,7]]},"1307":{"position":[[273,7]]},"1324":{"position":[[157,8],[212,8]]}},"keywords":{}}],["browser'",{"_index":1671,"title":{},"content":{"287":{"position":[[695,9]]},"346":{"position":[[653,9]]},"412":{"position":[[9987,9]]},"438":{"position":[[268,9]]},"504":{"position":[[204,9]]}},"keywords":{}}],["browser.fast",{"_index":6094,"title":{},"content":{"1156":{"position":[[109,12]]}},"keywords":{}}],["browser.observ",{"_index":3485,"title":{},"content":{"575":{"position":[[610,18]]}},"keywords":{}}],["browser/phon",{"_index":2734,"title":{},"content":{"412":{"position":[[9326,13]]}},"keywords":{}}],["browsers.memori",{"_index":1962,"title":{},"content":{"336":{"position":[[322,15]]},"581":{"position":[[326,15]]}},"keywords":{}}],["browsers.opf",{"_index":1670,"title":{},"content":{"287":{"position":[[649,13]]},"336":{"position":[[229,13]]},"524":{"position":[[377,13]]}},"keywords":{}}],["browser—no",{"_index":3404,"title":{},"content":{"559":{"position":[[909,10]]}},"keywords":{}}],["browser’",{"_index":1866,"title":{},"content":{"305":{"position":[[79,9]]}},"keywords":{}}],["bucket",{"_index":2336,"title":{"1140":{"position":[[8,8]]}},"content":{"396":{"position":[[201,7]]},"470":{"position":[[563,7]]},"1140":{"position":[[13,7],[190,7],[326,7]]},"1143":{"position":[[630,7]]}},"keywords":{}}],["buckets"",{"_index":6055,"title":{},"content":{"1140":{"position":[[118,14]]}},"keywords":{}}],["buffer",{"_index":6368,"title":{},"content":{"1282":{"position":[[43,6],[310,7]]}},"keywords":{}}],["bug",{"_index":3830,"title":{},"content":{"667":{"position":[[154,4]]},"670":{"position":[[18,4],[282,3],[346,3]]},"749":{"position":[[21956,4]]},"837":{"position":[[613,4]]},"1085":{"position":[[3138,4]]},"1120":{"position":[[368,5]]},"1133":{"position":[[514,3]]},"1288":{"position":[[76,3]]}},"keywords":{}}],["bugfix",{"_index":2976,"title":{},"content":{"455":{"position":[[627,6]]},"667":{"position":[[29,6]]},"668":{"position":[[69,6]]}},"keywords":{}}],["build",{"_index":97,"title":{"44":{"position":[[0,5]]},"69":{"position":[[0,5]]},"90":{"position":[[0,8]]},"100":{"position":[[0,5]]},"221":{"position":[[0,8]]},"228":{"position":[[0,5]]},"484":{"position":[[0,8]]},"488":{"position":[[0,8]]},"731":{"position":[[27,6]]},"1212":{"position":[[0,8]]},"1227":{"position":[[4,5]]},"1228":{"position":[[0,8]]},"1265":{"position":[[4,5]]},"1266":{"position":[[0,8]]}},"content":{"7":{"position":[[124,5]]},"24":{"position":[[534,5]]},"38":{"position":[[48,8]]},"59":{"position":[[191,8]]},"61":{"position":[[351,5]]},"69":{"position":[[54,5]]},"90":{"position":[[32,8]]},"100":{"position":[[92,5],[317,5]]},"105":{"position":[[150,5]]},"116":{"position":[[105,5]]},"122":{"position":[[86,5]]},"124":{"position":[[231,5]]},"148":{"position":[[219,5],[318,8]]},"151":{"position":[[437,8]]},"156":{"position":[[218,5]]},"168":{"position":[[294,8]]},"170":{"position":[[286,8]]},"174":{"position":[[82,8]]},"175":{"position":[[669,8]]},"177":{"position":[[99,5]]},"179":{"position":[[233,8],[402,5]]},"183":{"position":[[61,8]]},"184":{"position":[[42,8]]},"186":{"position":[[368,8]]},"198":{"position":[[375,5]]},"207":{"position":[[98,8]]},"221":{"position":[[152,5]]},"227":{"position":[[66,5],[290,6]]},"228":{"position":[[61,5],[340,5]]},"232":{"position":[[48,8]]},"239":{"position":[[107,8]]},"254":{"position":[[88,8]]},"267":{"position":[[257,8],[1203,5],[1595,8]]},"286":{"position":[[147,8]]},"287":{"position":[[1151,5],[1221,5]]},"289":{"position":[[1454,5]]},"313":{"position":[[187,5]]},"333":{"position":[[102,5]]},"362":{"position":[[975,8]]},"371":{"position":[[127,8]]},"381":{"position":[[384,5]]},"388":{"position":[[82,5],[333,5]]},"390":{"position":[[1643,5],[1897,5]]},"391":{"position":[[23,5]]},"396":{"position":[[583,6],[1467,8]]},"399":{"position":[[362,8]]},"408":{"position":[[2473,5]]},"411":{"position":[[1292,5],[3868,5]]},"412":{"position":[[10862,5]]},"422":{"position":[[413,5]]},"433":{"position":[[481,6]]},"445":{"position":[[2183,5],[2448,8]]},"446":{"position":[[1215,5]]},"447":{"position":[[401,5]]},"453":{"position":[[596,5],[779,5]]},"458":{"position":[[23,8]]},"459":{"position":[[319,5]]},"481":{"position":[[539,8]]},"483":{"position":[[380,5]]},"488":{"position":[[49,5]]},"498":{"position":[[16,8]]},"534":{"position":[[6,8]]},"541":{"position":[[67,5]]},"557":{"position":[[423,5]]},"569":{"position":[[1487,5]]},"571":{"position":[[641,5]]},"594":{"position":[[6,8]]},"613":{"position":[[1022,5]]},"617":{"position":[[1830,5]]},"625":{"position":[[84,5]]},"644":{"position":[[385,8]]},"668":{"position":[[177,5]]},"681":{"position":[[49,5]]},"703":{"position":[[659,5]]},"717":{"position":[[358,5]]},"731":{"position":[[264,5]]},"736":{"position":[[305,6]]},"749":{"position":[[21244,5],[23634,5]]},"781":{"position":[[217,5]]},"821":{"position":[[11,5],[95,5]]},"838":{"position":[[537,5]]},"860":{"position":[[651,5],[1193,5]]},"875":{"position":[[7567,5]]},"904":{"position":[[85,5],[172,5]]},"1006":{"position":[[16,8]]},"1021":{"position":[[27,8]]},"1085":{"position":[[2574,5]]},"1088":{"position":[[170,5]]},"1090":{"position":[[434,5]]},"1094":{"position":[[24,5],[95,5]]},"1123":{"position":[[724,5]]},"1124":{"position":[[874,5],[1955,5]]},"1137":{"position":[[148,5]]},"1143":{"position":[[168,5]]},"1149":{"position":[[417,8]]},"1167":{"position":[[57,5]]},"1174":{"position":[[39,5]]},"1212":{"position":[[112,5]]},"1228":{"position":[[4,5]]},"1235":{"position":[[73,5],[242,5]]},"1237":{"position":[[14,5]]},"1268":{"position":[[260,5],[384,5]]},"1286":{"position":[[178,5]]},"1292":{"position":[[874,5],[901,5],[924,5]]},"1313":{"position":[[465,5]]},"1314":{"position":[[18,5]]},"1320":{"position":[[611,5],[855,5]]},"1322":{"position":[[21,5],[129,5]]}},"keywords":{}}],["builder",{"_index":5116,"title":{"1064":{"position":[[6,7]]}},"content":{"886":{"position":[[297,7],[2143,7]]},"1064":{"position":[[58,7],[92,7],[202,9]]}},"keywords":{}}],["built",{"_index":614,"title":{"80":{"position":[[0,5]]},"109":{"position":[[0,5]]},"237":{"position":[[0,5]]},"311":{"position":[[3,5]]}},"content":{"39":{"position":[[63,5]]},"40":{"position":[[640,5]]},"47":{"position":[[983,5],[1082,5]]},"76":{"position":[[7,5]]},"79":{"position":[[15,5]]},"99":{"position":[[302,5]]},"107":{"position":[[9,5]]},"118":{"position":[[42,5]]},"120":{"position":[[91,5]]},"123":{"position":[[15,5]]},"126":{"position":[[157,5]]},"131":{"position":[[398,5]]},"132":{"position":[[129,5]]},"139":{"position":[[15,5]]},"153":{"position":[[128,5]]},"155":{"position":[[134,5]]},"161":{"position":[[155,5]]},"162":{"position":[[177,5]]},"174":{"position":[[1265,5],[1814,5]]},"181":{"position":[[32,5]]},"186":{"position":[[310,5]]},"206":{"position":[[145,5]]},"212":{"position":[[85,5]]},"230":{"position":[[61,5]]},"237":{"position":[[13,5]]},"269":{"position":[[177,5]]},"303":{"position":[[308,5]]},"310":{"position":[[287,5]]},"318":{"position":[[59,5]]},"322":{"position":[[39,5]]},"331":{"position":[[183,5]]},"354":{"position":[[962,5]]},"359":{"position":[[61,5]]},"360":{"position":[[446,5]]},"378":{"position":[[124,5]]},"382":{"position":[[268,5]]},"387":{"position":[[53,5]]},"421":{"position":[[576,5]]},"424":{"position":[[27,5]]},"445":{"position":[[106,5]]},"476":{"position":[[168,5]]},"490":{"position":[[16,5]]},"513":{"position":[[126,5]]},"519":{"position":[[113,5]]},"524":{"position":[[235,5]]},"535":{"position":[[1112,5]]},"544":{"position":[[313,5]]},"551":{"position":[[98,5]]},"559":{"position":[[19,5]]},"566":{"position":[[528,5],[1000,5],[1130,5]]},"569":{"position":[[1243,5]]},"575":{"position":[[41,5]]},"595":{"position":[[1189,5]]},"604":{"position":[[266,5]]},"631":{"position":[[232,5]]},"688":{"position":[[178,5]]},"836":{"position":[[1787,5]]},"838":{"position":[[593,5]]},"841":{"position":[[507,5],[575,5],[760,5]]},"860":{"position":[[914,5]]},"1072":{"position":[[1040,5],[1276,5],[1568,5],[2048,5]]},"1085":{"position":[[1944,5],[2101,5]]},"1148":{"position":[[304,5]]},"1156":{"position":[[94,5]]},"1307":{"position":[[815,5]]},"1320":{"position":[[698,5]]}},"keywords":{}}],["bulk",{"_index":792,"title":{"466":{"position":[[4,4]]},"467":{"position":[[4,4]]},"795":{"position":[[4,4]]}},"content":{"52":{"position":[[166,4]]},"301":{"position":[[217,4]]},"396":{"position":[[1652,4]]},"400":{"position":[[435,4]]},"408":{"position":[[2526,4]]},"411":{"position":[[270,4]]},"452":{"position":[[597,5]]},"459":{"position":[[478,4]]},"462":{"position":[[163,4]]},"466":{"position":[[32,4],[411,4]]},"467":{"position":[[34,4]]},"468":{"position":[[149,4]]},"539":{"position":[[166,4]]},"599":{"position":[[175,4]]},"795":{"position":[[72,4]]},"863":{"position":[[339,4],[429,4]]},"944":{"position":[[53,4]]},"945":{"position":[[53,4]]},"981":{"position":[[1167,5]]},"1161":{"position":[[157,4]]},"1174":{"position":[[135,4]]},"1180":{"position":[[157,4]]},"1194":{"position":[[345,7],[388,4],[431,7]]}},"keywords":{}}],["bulk.less",{"_index":3156,"title":{},"content":{"487":{"position":[[142,9]]}},"keywords":{}}],["bulki",{"_index":3259,"title":{},"content":{"521":{"position":[[206,5]]}},"keywords":{}}],["bulkinsert",{"_index":4252,"title":{"944":{"position":[[0,13]]}},"content":{"749":{"position":[[9064,13]]},"944":{"position":[[369,10],[507,12]]}},"keywords":{}}],["bulkremov",{"_index":5336,"title":{"945":{"position":[[0,13]]}},"content":{},"keywords":{}}],["bulkupsert",{"_index":4253,"title":{"947":{"position":[[0,13]]}},"content":{"749":{"position":[[9082,13]]}},"keywords":{}}],["bulkwrit",{"_index":4121,"title":{},"content":{"746":{"position":[[681,10]]},"749":{"position":[[1551,11]]}},"keywords":{}}],["bun",{"_index":2932,"title":{"440":{"position":[[25,4]]}},"content":{"440":{"position":[[196,3],[369,4],[464,3]]}},"keywords":{}}],["bun:sqlit",{"_index":2934,"title":{},"content":{"440":{"position":[[392,10]]}},"keywords":{}}],["bundl",{"_index":1261,"title":{},"content":{"188":{"position":[[1659,6],[1760,7]]},"333":{"position":[[191,7]]},"357":{"position":[[377,7]]},"412":{"position":[[862,7],[9192,6]]},"581":{"position":[[541,6]]},"708":{"position":[[560,7]]},"717":{"position":[[413,8]]},"732":{"position":[[72,6]]},"962":{"position":[[293,6]]},"1176":{"position":[[10,6]]},"1200":{"position":[[5,6]]},"1227":{"position":[[100,7],[155,7]]},"1242":{"position":[[131,6]]},"1265":{"position":[[93,7],[148,7]]},"1266":{"position":[[20,6]]},"1270":{"position":[[548,7]]},"1292":{"position":[[815,6]]}},"keywords":{}}],["bundler",{"_index":1937,"title":{},"content":{"333":{"position":[[135,8]]},"729":{"position":[[269,9]]},"1202":{"position":[[308,9]]},"1268":{"position":[[285,8]]}},"keywords":{}}],["burden",{"_index":1010,"title":{},"content":{"91":{"position":[[212,6]]},"224":{"position":[[154,6]]},"412":{"position":[[4335,6]]},"802":{"position":[[739,6]]},"1107":{"position":[[952,7]]}},"keywords":{}}],["busi",{"_index":667,"title":{"1009":{"position":[[30,8]]}},"content":{"43":{"position":[[93,8]]},"354":{"position":[[617,8],[1488,8]]},"411":{"position":[[1597,8]]},"419":{"position":[[1430,10]]},"681":{"position":[[170,8]]},"687":{"position":[[32,8]]}},"keywords":{}}],["button",{"_index":3159,"title":{},"content":{"489":{"position":[[387,6]]},"703":{"position":[[1426,6]]},"1313":{"position":[[600,6]]}},"keywords":{}}],["buy",{"_index":2808,"title":{},"content":{"419":{"position":[[1411,6]]}},"keywords":{}}],["bwvvdw",{"_index":5296,"title":{},"content":{"918":{"position":[[162,11]]},"931":{"position":[[190,10]]}},"keywords":{}}],["bypass",{"_index":1087,"title":{},"content":{"129":{"position":[[158,6]]},"289":{"position":[[1751,9]]},"901":{"position":[[177,9]]}},"keywords":{}}],["byte",{"_index":2970,"title":{},"content":{"454":{"position":[[647,4]]},"1206":{"position":[[327,4],[335,4]]},"1208":{"position":[[1643,6]]}},"keywords":{}}],["c",{"_index":82,"title":{},"content":{"6":{"position":[[29,3]]},"19":{"position":[[681,1],[695,1]]},"408":{"position":[[3546,3],[3550,4]]},"661":{"position":[[54,1]]},"711":{"position":[[58,1]]},"800":{"position":[[244,3]]},"836":{"position":[[56,1]]},"860":{"position":[[1267,1]]},"871":{"position":[[528,1]]},"897":{"position":[[35,1]]},"982":{"position":[[248,1]]}},"keywords":{}}],["c+d.the",{"_index":5437,"title":{},"content":{"982":{"position":[[355,7]]}},"keywords":{}}],["c.or",{"_index":337,"title":{},"content":{"19":{"position":[[689,5]]}},"keywords":{}}],["c.rating("gt"",{"_index":338,"title":{},"content":{"19":{"position":[[703,24]]}},"keywords":{}}],["c1",{"_index":5451,"title":{},"content":{"987":{"position":[[180,2],[397,2],[673,2]]}},"keywords":{}}],["c1.rxdb",{"_index":5453,"title":{},"content":{"987":{"position":[[486,7]]}},"keywords":{}}],["c2",{"_index":5452,"title":{},"content":{"987":{"position":[[216,2],[329,2],[717,2]]}},"keywords":{}}],["cabl",{"_index":4592,"title":{},"content":{"780":{"position":[[251,6]]}},"keywords":{}}],["cach",{"_index":561,"title":{"87":{"position":[[21,8]]},"216":{"position":[[0,8]]},"815":{"position":[[0,5]]},"1255":{"position":[[0,8]]},"1321":{"position":[[0,7]]}},"content":{"35":{"position":[[538,7]]},"37":{"position":[[253,7],[344,7]]},"39":{"position":[[336,6]]},"65":{"position":[[141,8],[192,5]]},"87":{"position":[[64,8],[197,7]]},"117":{"position":[[177,7]]},"157":{"position":[[148,7]]},"164":{"position":[[140,7]]},"173":{"position":[[628,8],[678,7],[717,7]]},"189":{"position":[[624,5]]},"206":{"position":[[36,8]]},"215":{"position":[[141,5]]},"216":{"position":[[44,7],[230,7]]},"241":{"position":[[514,8]]},"253":{"position":[[35,8]]},"265":{"position":[[950,8]]},"280":{"position":[[181,6]]},"287":{"position":[[944,5]]},"305":{"position":[[202,6]]},"373":{"position":[[529,8]]},"376":{"position":[[230,8]]},"408":{"position":[[735,5],[1291,5]]},"412":{"position":[[8664,5]]},"414":{"position":[[316,8]]},"416":{"position":[[124,6]]},"418":{"position":[[603,9],[867,6]]},"463":{"position":[[1339,7]]},"467":{"position":[[239,6],[507,6]]},"500":{"position":[[613,7]]},"612":{"position":[[1937,6],[1958,7]]},"616":{"position":[[927,7]]},"630":{"position":[[885,8],[930,8]]},"770":{"position":[[583,6]]},"793":{"position":[[948,5]]},"800":{"position":[[406,6]]},"815":{"position":[[43,5],[98,6]]},"816":{"position":[[88,5]]},"818":{"position":[[3,5],[208,6]]},"841":{"position":[[841,8]]},"856":{"position":[[62,6]]},"875":{"position":[[7349,6],[7370,6]]},"899":{"position":[[106,8]]},"934":{"position":[[709,5]]},"977":{"position":[[503,5]]},"1067":{"position":[[1109,8]]},"1068":{"position":[[267,6]]},"1071":{"position":[[519,6]]},"1072":{"position":[[185,6]]},"1321":{"position":[[208,5],[392,7],[975,5],[1001,6],[1086,5]]}},"keywords":{}}],["cache.it",{"_index":4700,"title":{},"content":{"816":{"position":[[279,8]]}},"keywords":{}}],["cachereplacementpolici",{"_index":4705,"title":{},"content":{"818":{"position":[[443,23],[549,23]]},"934":{"position":[[650,23]]}},"keywords":{}}],["calcul",{"_index":2288,"title":{"393":{"position":[[21,11]]}},"content":{"393":{"position":[[822,9]]},"394":{"position":[[271,11],[342,11]]},"396":{"position":[[1126,9]]},"397":{"position":[[1437,9],[1529,10],[1965,9]]},"398":{"position":[[535,9]]},"401":{"position":[[38,9]]},"402":{"position":[[428,11],[1812,11]]},"490":{"position":[[595,10]]},"927":{"position":[[69,10],[103,10]]},"1072":{"position":[[1129,12]]},"1250":{"position":[[198,9],[567,10]]},"1318":{"position":[[879,10],[1078,9]]}},"keywords":{}}],["call",{"_index":154,"title":{"654":{"position":[[0,7]]}},"content":{"11":{"position":[[371,6]]},"27":{"position":[[187,5]]},"38":{"position":[[258,6],[356,7]]},"212":{"position":[[339,4]]},"251":{"position":[[128,5]]},"277":{"position":[[27,6]]},"320":{"position":[[77,6]]},"334":{"position":[[86,4]]},"392":{"position":[[1971,7]]},"396":{"position":[[1629,6]]},"408":{"position":[[2764,5],[3314,5],[4047,6]]},"411":{"position":[[2838,6]]},"452":{"position":[[743,5]]},"454":{"position":[[973,6]]},"461":{"position":[[1270,7]]},"474":{"position":[[19,4]]},"494":{"position":[[463,4]]},"566":{"position":[[670,6]]},"574":{"position":[[663,6]]},"581":{"position":[[43,6]]},"647":{"position":[[55,6],[474,4]]},"654":{"position":[[50,7]]},"655":{"position":[[120,4]]},"659":{"position":[[335,5]]},"675":{"position":[[181,4]]},"676":{"position":[[240,4]]},"683":{"position":[[134,7],[241,7]]},"684":{"position":[[78,7]]},"698":{"position":[[342,6],[2499,6],[2567,4],[3010,6]]},"703":{"position":[[253,4],[306,5],[366,5],[422,5],[561,5]]},"711":{"position":[[1675,4]]},"721":{"position":[[369,7]]},"746":{"position":[[233,7]]},"749":{"position":[[1573,6],[2022,6],[2750,7],[4282,6],[11026,6],[11165,6],[22269,7]]},"752":{"position":[[81,7]]},"759":{"position":[[1079,4]]},"770":{"position":[[14,6]]},"772":{"position":[[607,7]]},"775":{"position":[[788,7]]},"788":{"position":[[48,6]]},"790":{"position":[[59,6]]},"792":{"position":[[61,6]]},"800":{"position":[[236,5]]},"806":{"position":[[317,6],[378,5]]},"825":{"position":[[292,7]]},"835":{"position":[[429,4]]},"846":{"position":[[1322,4]]},"848":{"position":[[535,4]]},"854":{"position":[[524,7]]},"863":{"position":[[532,5],[743,5]]},"866":{"position":[[163,4]]},"875":{"position":[[1750,7],[5875,4]]},"878":{"position":[[152,7]]},"879":{"position":[[316,4]]},"885":{"position":[[498,6]]},"890":{"position":[[10,4]]},"904":{"position":[[1470,4]]},"939":{"position":[[50,4]]},"941":{"position":[[1,7]]},"944":{"position":[[91,7],[499,4]]},"947":{"position":[[107,6]]},"958":{"position":[[203,4],[685,4]]},"966":{"position":[[766,4]]},"967":{"position":[[351,4]]},"970":{"position":[[1,7]]},"981":{"position":[[1053,7]]},"983":{"position":[[419,6]]},"987":{"position":[[335,7],[543,4],[1062,7]]},"988":{"position":[[59,7],[1598,7],[3288,6],[4224,4],[4617,6]]},"999":{"position":[[146,7]]},"1007":{"position":[[43,6],[1951,6]]},"1027":{"position":[[106,6]]},"1033":{"position":[[935,4]]},"1035":{"position":[[53,4]]},"1036":{"position":[[48,4]]},"1046":{"position":[[1,7]]},"1055":{"position":[[28,4]]},"1057":{"position":[[238,4]]},"1058":{"position":[[505,6]]},"1088":{"position":[[598,7]]},"1097":{"position":[[273,4]]},"1100":{"position":[[353,7]]},"1112":{"position":[[457,7]]},"1114":{"position":[[272,4],[325,7]]},"1115":{"position":[[42,6],[823,4]]},"1125":{"position":[[126,7]]},"1140":{"position":[[97,6]]},"1148":{"position":[[873,7]]},"1150":{"position":[[27,6]]},"1151":{"position":[[814,4]]},"1174":{"position":[[562,4]]},"1175":{"position":[[673,5],[755,6]]},"1178":{"position":[[811,4]]},"1194":{"position":[[670,4],[865,5],[1003,5]]},"1212":{"position":[[187,7]]},"1220":{"position":[[422,4]]},"1229":{"position":[[121,7]]},"1250":{"position":[[562,4]]},"1267":{"position":[[6,4],[428,4]]},"1268":{"position":[[115,7]]},"1272":{"position":[[188,6]]},"1282":{"position":[[1091,7]]},"1294":{"position":[[400,5],[746,4]]},"1295":{"position":[[204,6]]},"1298":{"position":[[166,4]]},"1304":{"position":[[1852,6]]},"1307":{"position":[[489,7]]},"1316":{"position":[[747,6]]}},"keywords":{}}],["call.find",{"_index":6167,"title":{},"content":{"1194":{"position":[[777,9]]}},"keywords":{}}],["call.insert",{"_index":6164,"title":{},"content":{"1194":{"position":[[508,11]]}},"keywords":{}}],["callback",{"_index":700,"title":{},"content":{"45":{"position":[[311,8]]},"47":{"position":[[81,8],[140,8]]},"302":{"position":[[437,10]]},"521":{"position":[[76,8]]},"535":{"position":[[119,8],[167,9]]},"595":{"position":[[119,8],[180,9]]},"1274":{"position":[[486,8]]},"1279":{"position":[[873,8]]}},"keywords":{}}],["calledpreinsert",{"_index":4522,"title":{},"content":{"767":{"position":[[98,15]]}},"keywords":{}}],["calledpreremov",{"_index":4548,"title":{},"content":{"769":{"position":[[90,15]]}},"keywords":{}}],["calledpresav",{"_index":4536,"title":{},"content":{"768":{"position":[[83,13]]}},"keywords":{}}],["came",{"_index":4595,"title":{},"content":{"785":{"position":[[586,4]]},"888":{"position":[[701,4],[747,4]]},"1009":{"position":[[1027,4]]},"1198":{"position":[[307,4]]}},"keywords":{}}],["can't",{"_index":941,"title":{},"content":{"66":{"position":[[213,5]]},"408":{"position":[[2544,5]]},"412":{"position":[[1458,5]]},"418":{"position":[[219,5]]},"440":{"position":[[309,5]]},"749":{"position":[[4365,5],[4616,5],[10613,5],[13664,5]]},"1085":{"position":[[2684,5]]},"1112":{"position":[[393,5]]}},"keywords":{}}],["cancel",{"_index":4349,"title":{"997":{"position":[[0,9]]}},"content":{"749":{"position":[[16430,8],[16696,9]]},"854":{"position":[[1667,6],[1760,8]]},"988":{"position":[[799,6]]},"993":{"position":[[515,9]]},"994":{"position":[[204,6]]},"997":{"position":[[1,7]]},"999":{"position":[[1,7]]},"1000":{"position":[[116,9]]},"1009":{"position":[[782,10]]}},"keywords":{}}],["candid",{"_index":2311,"title":{},"content":{"394":{"position":[[690,10]]},"398":{"position":[[787,10],[2055,10]]}},"keywords":{}}],["candidates.add(d",{"_index":2406,"title":{},"content":{"398":{"position":[[1373,19],[1415,19],[2533,19]]}},"keywords":{}}],["candidates.map(doc",{"_index":2314,"title":{},"content":{"394":{"position":[[762,18]]}},"keywords":{}}],["can’t",{"_index":2019,"title":{},"content":{"354":{"position":[[321,5]]},"559":{"position":[[1466,5]]}},"keywords":{}}],["cap",{"_index":870,"title":{},"content":{"58":{"position":[[259,3]]},"298":{"position":[[699,5]]},"299":{"position":[[290,3]]},"304":{"position":[[22,3]]},"408":{"position":[[651,6],[2160,7]]},"451":{"position":[[415,4]]}},"keywords":{}}],["capabilities.sqlit",{"_index":1292,"title":{},"content":{"189":{"position":[[266,19]]}},"keywords":{}}],["capabl",{"_index":265,"title":{"280":{"position":[[8,8]]}},"content":{"15":{"position":[[524,8]]},"27":{"position":[[295,13]]},"34":{"position":[[565,13]]},"39":{"position":[[221,13]]},"40":{"position":[[801,12]]},"61":{"position":[[389,7]]},"83":{"position":[[116,13]]},"84":{"position":[[45,12]]},"89":{"position":[[211,10]]},"95":{"position":[[135,10]]},"96":{"position":[[225,12]]},"114":{"position":[[45,12]]},"122":{"position":[[273,10]]},"126":{"position":[[182,13]]},"133":{"position":[[267,10]]},"136":{"position":[[283,10]]},"148":{"position":[[111,13],[398,7]]},"149":{"position":[[45,12]]},"151":{"position":[[129,13]]},"153":{"position":[[350,7]]},"161":{"position":[[227,12]]},"165":{"position":[[395,12]]},"166":{"position":[[92,13]]},"168":{"position":[[256,10]]},"173":{"position":[[2390,12]]},"174":{"position":[[1368,12],[2203,12],[3245,13]]},"175":{"position":[[42,12]]},"184":{"position":[[110,12]]},"189":{"position":[[378,13]]},"198":{"position":[[173,13]]},"224":{"position":[[118,12]]},"226":{"position":[[379,12]]},"254":{"position":[[276,13]]},"255":{"position":[[1865,13]]},"263":{"position":[[145,13]]},"267":{"position":[[8,12],[212,12]]},"280":{"position":[[397,10]]},"283":{"position":[[63,13]]},"285":{"position":[[141,13]]},"286":{"position":[[437,13]]},"289":{"position":[[36,12]]},"292":{"position":[[321,10]]},"293":{"position":[[309,10]]},"294":{"position":[[37,13]]},"317":{"position":[[269,12]]},"321":{"position":[[580,13]]},"331":{"position":[[364,7]]},"347":{"position":[[45,12]]},"362":{"position":[[1116,12]]},"365":{"position":[[1505,12]]},"370":{"position":[[49,13]]},"373":{"position":[[434,12]]},"383":{"position":[[231,12]]},"384":{"position":[[305,7]]},"407":{"position":[[472,11]]},"408":{"position":[[67,12],[1374,12]]},"411":{"position":[[5503,7]]},"412":{"position":[[1514,7]]},"418":{"position":[[590,12]]},"419":{"position":[[30,7]]},"427":{"position":[[912,13]]},"430":{"position":[[322,13]]},"432":{"position":[[1004,13]]},"433":{"position":[[400,13]]},"438":{"position":[[375,13]]},"444":{"position":[[527,12]]},"445":{"position":[[284,12]]},"446":{"position":[[300,12],[624,12]]},"486":{"position":[[175,11]]},"495":{"position":[[549,7]]},"498":{"position":[[499,12]]},"501":{"position":[[232,13]]},"502":{"position":[[700,13]]},"504":{"position":[[108,12]]},"509":{"position":[[91,10]]},"510":{"position":[[211,13],[394,8]]},"511":{"position":[[45,12]]},"513":{"position":[[309,13]]},"520":{"position":[[143,13]]},"530":{"position":[[262,13]]},"531":{"position":[[45,12]]},"535":{"position":[[415,12]]},"540":{"position":[[40,13]]},"544":{"position":[[333,13]]},"548":{"position":[[236,7]]},"551":{"position":[[118,13]]},"560":{"position":[[736,12]]},"566":{"position":[[205,12]]},"567":{"position":[[121,13]]},"569":{"position":[[1550,7]]},"574":{"position":[[192,13]]},"575":{"position":[[92,12]]},"584":{"position":[[179,10]]},"591":{"position":[[45,12]]},"595":{"position":[[443,12]]},"600":{"position":[[40,13]]},"604":{"position":[[286,13]]},"608":{"position":[[236,7]]},"613":{"position":[[194,13]]},"614":{"position":[[124,12]]},"622":{"position":[[13,7],[180,7]]},"644":{"position":[[507,13]]},"659":{"position":[[778,12]]},"801":{"position":[[842,12]]},"831":{"position":[[369,10]]},"835":{"position":[[883,12]]},"860":{"position":[[227,12]]},"875":{"position":[[9241,7]]},"888":{"position":[[160,7]]},"901":{"position":[[502,13]]},"996":{"position":[[325,7]]},"1184":{"position":[[22,7]]},"1274":{"position":[[583,7]]},"1279":{"position":[[970,7]]}},"keywords":{}}],["capac",{"_index":1193,"title":{},"content":{"169":{"position":[[315,11]]},"392":{"position":[[4916,8]]},"408":{"position":[[960,9]]},"469":{"position":[[1244,8]]},"772":{"position":[[483,9]]},"1089":{"position":[[37,8]]},"1157":{"position":[[108,9]]}},"keywords":{}}],["capacitor",{"_index":142,"title":{"657":{"position":[[0,9]]},"658":{"position":[[23,10]]},"1279":{"position":[[18,10]]}},"content":{"10":{"position":[[430,9]]},"11":{"position":[[77,10]]},"59":{"position":[[235,9]]},"317":{"position":[[25,9]]},"445":{"position":[[1791,10]]},"446":{"position":[[1158,9]]},"447":{"position":[[254,10]]},"535":{"position":[[1312,10]]},"546":{"position":[[279,9]]},"606":{"position":[[278,10]]},"659":{"position":[[1,9]]},"660":{"position":[[7,9],[493,9]]},"661":{"position":[[228,10],[269,10],[432,10],[552,10],[843,9],[1055,11],[1478,9]]},"662":{"position":[[348,10],[484,9],[944,10],[1157,9],[1204,9],[1290,10],[1376,9],[1729,11],[1769,9],[2246,10]]},"793":{"position":[[226,10],[298,11]]},"1196":{"position":[[67,11]]},"1235":{"position":[[382,10]]},"1247":{"position":[[119,10]]},"1274":{"position":[[511,9]]},"1279":{"position":[[20,9],[78,9],[283,9],[480,9],[551,11],[591,9],[898,9],[1068,10]]},"1282":{"position":[[835,11],[1206,11]]}},"keywords":{}}],["capacitor)n",{"_index":3120,"title":{},"content":{"479":{"position":[[359,16]]}},"keywords":{}}],["capacitor.j",{"_index":1052,"title":{"1214":{"position":[[34,13]]}},"content":{"112":{"position":[[143,14]]},"174":{"position":[[2747,14]]},"239":{"position":[[179,13]]},"1214":{"position":[[1008,12]]}},"keywords":{}}],["capacitor/cor",{"_index":3795,"title":{},"content":{"661":{"position":[[860,18]]},"662":{"position":[[1786,18]]},"1279":{"position":[[608,18]]}},"keywords":{}}],["capacitor/cordova",{"_index":146,"title":{},"content":{"11":{"position":[[210,17]]}},"keywords":{}}],["capacitor/prefer",{"_index":3774,"title":{},"content":{"659":{"position":[[248,22],[458,25]]}},"keywords":{}}],["capacitors.j",{"_index":2110,"title":{},"content":{"365":{"position":[[1070,13]]}},"keywords":{}}],["capacitorsqlit",{"_index":3796,"title":{},"content":{"661":{"position":[[888,16]]},"662":{"position":[[1688,16]]},"1279":{"position":[[510,16]]}},"keywords":{}}],["capechoresult",{"_index":3802,"title":{},"content":{"661":{"position":[[992,14]]}},"keywords":{}}],["capncdatabasepathresult",{"_index":3804,"title":{},"content":{"661":{"position":[[1024,23]]}},"keywords":{}}],["capsqlitechang",{"_index":3800,"title":{},"content":{"661":{"position":[[957,17]]}},"keywords":{}}],["capsqliteresult",{"_index":3803,"title":{},"content":{"661":{"position":[[1007,16]]}},"keywords":{}}],["capsqliteset",{"_index":3799,"title":{},"content":{"661":{"position":[[943,13]]}},"keywords":{}}],["capsqlitevalu",{"_index":3801,"title":{},"content":{"661":{"position":[[975,16]]}},"keywords":{}}],["captiv",{"_index":3225,"title":{},"content":{"502":{"position":[[875,9]]}},"keywords":{}}],["captur",{"_index":3287,"title":{},"content":{"525":{"position":[[165,8]]}},"keywords":{}}],["car",{"_index":3457,"title":{},"content":{"569":{"position":[[664,3]]}},"keywords":{}}],["card",{"_index":2576,"title":{},"content":{"408":{"position":[[5378,5]]}},"keywords":{}}],["care",{"_index":889,"title":{"1032":{"position":[[3,7]]}},"content":{"61":{"position":[[430,4]]},"143":{"position":[[203,4]]},"164":{"position":[[318,4]]},"412":{"position":[[11802,7]]},"703":{"position":[[1201,4]]},"780":{"position":[[692,4]]},"785":{"position":[[563,4]]},"1115":{"position":[[857,4]]},"1120":{"position":[[273,6]]},"1141":{"position":[[142,4]]},"1150":{"position":[[503,4]]},"1183":{"position":[[504,4]]}},"keywords":{}}],["carefulli",{"_index":1980,"title":{},"content":{"346":{"position":[[823,9]]},"441":{"position":[[281,10]]},"566":{"position":[[958,9]]},"839":{"position":[[1343,9]]}},"keywords":{}}],["cargo",{"_index":6359,"title":{},"content":{"1280":{"position":[[107,5]]}},"keywords":{}}],["carol",{"_index":4679,"title":{},"content":{"810":{"position":[[248,7]]},"811":{"position":[[228,7]]},"813":{"position":[[311,8]]}},"keywords":{}}],["carolina",{"_index":5723,"title":{},"content":{"1051":{"position":[[255,11],[525,11]]}},"keywords":{}}],["carri",{"_index":3513,"title":{},"content":{"581":{"position":[[524,7]]}},"keywords":{}}],["case",{"_index":67,"title":{"267":{"position":[[4,5]]},"375":{"position":[[4,5]]},"446":{"position":[[4,5]]},"624":{"position":[[24,4]]},"736":{"position":[[4,4]]},"765":{"position":[[4,6]]},"1021":{"position":[[4,5]]},"1124":{"position":[[4,6]]}},"content":{"4":{"position":[[158,6]]},"13":{"position":[[300,6]]},"14":{"position":[[915,5]]},"36":{"position":[[485,6]]},"58":{"position":[[41,6],[127,6]]},"162":{"position":[[818,5]]},"267":{"position":[[94,5],[1456,6]]},"287":{"position":[[130,6]]},"321":{"position":[[444,6]]},"325":{"position":[[281,6]]},"372":{"position":[[9,6]]},"386":{"position":[[64,5]]},"390":{"position":[[1723,6]]},"398":{"position":[[360,6]]},"400":{"position":[[522,4]]},"401":{"position":[[934,5]]},"412":{"position":[[6390,4],[11830,5],[15335,5]]},"418":{"position":[[202,4]]},"420":{"position":[[1228,5],[1458,5]]},"430":{"position":[[77,5]]},"432":{"position":[[770,6],[1355,4]]},"436":{"position":[[387,6]]},"444":{"position":[[421,6]]},"449":{"position":[[79,4]]},"460":{"position":[[461,4]]},"462":{"position":[[244,4]]},"543":{"position":[[238,6]]},"559":{"position":[[1554,6]]},"603":{"position":[[236,6]]},"611":{"position":[[1364,5]]},"614":{"position":[[748,5]]},"617":{"position":[[1130,6]]},"621":{"position":[[653,5]]},"624":{"position":[[104,4],[1330,6]]},"653":{"position":[[82,6]]},"670":{"position":[[57,4],[362,5]]},"681":{"position":[[95,6],[196,6]]},"682":{"position":[[245,6]]},"687":{"position":[[127,5]]},"689":{"position":[[471,6]]},"698":{"position":[[959,6],[2081,6]]},"703":{"position":[[690,5],[1260,6],[1623,6]]},"707":{"position":[[428,4]]},"714":{"position":[[977,6]]},"723":{"position":[[2295,5]]},"730":{"position":[[89,6]]},"740":{"position":[[202,5]]},"815":{"position":[[288,5]]},"829":{"position":[[2138,5],[2915,5]]},"834":{"position":[[124,6]]},"841":{"position":[[1326,5]]},"875":{"position":[[8545,4]]},"881":{"position":[[38,5]]},"902":{"position":[[942,6]]},"904":{"position":[[2012,5]]},"962":{"position":[[213,4]]},"966":{"position":[[239,5]]},"987":{"position":[[246,4]]},"990":{"position":[[389,5]]},"1022":{"position":[[343,4]]},"1065":{"position":[[1197,4]]},"1068":{"position":[[454,4]]},"1072":{"position":[[1635,4],[1766,4],[1999,4],[2069,4],[2187,4],[2588,4],[2723,4]]},"1090":{"position":[[1241,5]]},"1091":{"position":[[139,5]]},"1105":{"position":[[398,5]]},"1124":{"position":[[100,5]]},"1146":{"position":[[95,6]]},"1152":{"position":[[71,5]]},"1157":{"position":[[483,5]]},"1193":{"position":[[193,5]]},"1195":{"position":[[130,5]]},"1198":{"position":[[62,4],[1481,5]]},"1208":{"position":[[628,6]]},"1222":{"position":[[1032,5]]},"1243":{"position":[[67,6]]},"1305":{"position":[[244,6]]},"1307":{"position":[[621,5]]}},"keywords":{}}],["cases.discord",{"_index":2862,"title":{},"content":{"422":{"position":[[163,14]]}},"keywords":{}}],["cases.web",{"_index":3344,"title":{},"content":{"554":{"position":[[110,9]]}},"keywords":{}}],["cassandra",{"_index":6582,"title":{},"content":{"1324":{"position":[[921,10]]}},"keywords":{}}],["cat.txt",{"_index":4610,"title":{},"content":{"792":{"position":[[359,10]]},"917":{"position":[[173,10]]},"918":{"position":[[134,10]]}},"keywords":{}}],["catch",{"_index":1811,"title":{},"content":{"302":{"position":[[836,5]]},"361":{"position":[[150,8]]},"412":{"position":[[6068,5]]},"838":{"position":[[1017,5]]},"875":{"position":[[8854,5]]},"984":{"position":[[110,5]]},"995":{"position":[[1560,11]]},"1031":{"position":[[150,5]]},"1085":{"position":[[2662,5]]}},"keywords":{}}],["catch(error",{"_index":3559,"title":{},"content":{"610":{"position":[[1130,12]]}},"keywords":{}}],["categori",{"_index":2207,"title":{},"content":{"390":{"position":[[1556,10]]},"1020":{"position":[[653,9]]}},"keywords":{}}],["cater",{"_index":1653,"title":{},"content":{"280":{"position":[[473,8]]},"368":{"position":[[189,8]]},"504":{"position":[[6,6]]}},"keywords":{}}],["caught",{"_index":1574,"title":{},"content":{"255":{"position":[[220,6]]},"1085":{"position":[[2548,6]]}},"keywords":{}}],["caus",{"_index":1548,"title":{"627":{"position":[[22,5]]}},"content":{"250":{"position":[[79,5]]},"367":{"position":[[68,5]]},"457":{"position":[[681,5]]},"642":{"position":[[283,5]]},"749":{"position":[[21941,6]]},"835":{"position":[[337,5]]},"837":{"position":[[726,6]]},"858":{"position":[[566,5]]},"876":{"position":[[349,6]]},"885":{"position":[[1127,6]]},"1031":{"position":[[92,5]]},"1065":{"position":[[696,5]]},"1085":{"position":[[258,5],[3124,5]]},"1120":{"position":[[331,5]]},"1157":{"position":[[326,5]]},"1295":{"position":[[1478,5]]}},"keywords":{}}],["caveat",{"_index":1738,"title":{},"content":{"299":{"position":[[178,7]]},"495":{"position":[[50,8]]}},"keywords":{}}],["cbc",{"_index":4034,"title":{},"content":{"718":{"position":[[524,4]]}},"keywords":{}}],["cd",{"_index":3825,"title":{},"content":{"666":{"position":[[216,2]]}},"keywords":{}}],["ceil",{"_index":2538,"title":{},"content":{"408":{"position":[[1343,8],[4992,7]]}},"keywords":{}}],["center",{"_index":3475,"title":{},"content":{"574":{"position":[[68,8]]}},"keywords":{}}],["central",{"_index":478,"title":{},"content":{"29":{"position":[[177,11]]},"43":{"position":[[81,11],[137,8]]},"201":{"position":[[52,7]]},"210":{"position":[[24,11]]},"212":{"position":[[650,7]]},"261":{"position":[[31,7],[1160,7]]},"289":{"position":[[1776,7]]},"293":{"position":[[388,7]]},"321":{"position":[[174,7]]},"346":{"position":[[1,10]]},"365":{"position":[[1444,11]]},"411":{"position":[[4932,7],[5156,7]]},"412":{"position":[[11978,11]]},"416":{"position":[[343,7]]},"418":{"position":[[311,7],[648,7]]},"590":{"position":[[82,10]]},"901":{"position":[[189,7]]},"902":{"position":[[33,7],[215,7],[591,7]]},"903":{"position":[[58,11]]}},"keywords":{}}],["centric",{"_index":1418,"title":{},"content":{"231":{"position":[[266,7]]},"241":{"position":[[598,7]]},"279":{"position":[[403,7]]},"354":{"position":[[1590,8]]},"362":{"position":[[157,7]]},"388":{"position":[[365,7]]}},"keywords":{}}],["certain",{"_index":1558,"title":{},"content":{"252":{"position":[[40,7]]},"266":{"position":[[517,7]]},"303":{"position":[[1493,7]]},"354":{"position":[[140,7]]},"396":{"position":[[1578,7]]},"412":{"position":[[8594,7],[12899,7]]},"460":{"position":[[991,7]]},"480":{"position":[[1040,7]]},"496":{"position":[[470,7]]},"545":{"position":[[106,7]]},"559":{"position":[[1050,7]]},"569":{"position":[[907,7]]},"605":{"position":[[106,7]]},"618":{"position":[[302,7]]},"688":{"position":[[632,7]]},"714":{"position":[[651,7]]},"759":{"position":[[1460,7]]},"765":{"position":[[212,7]]},"839":{"position":[[749,7]]},"1072":{"position":[[473,7]]}},"keywords":{}}],["certainli",{"_index":2122,"title":{},"content":{"369":{"position":[[1,10]]}},"keywords":{}}],["certif",{"_index":3381,"title":{},"content":{"556":{"position":[[1951,12],[2009,12]]}},"keywords":{}}],["chain",{"_index":2508,"title":{},"content":{"404":{"position":[[842,8]]},"682":{"position":[[119,7]]},"749":{"position":[[3181,7]]},"1064":{"position":[[8,7],[268,7]]},"1065":{"position":[[161,7],[1414,7]]}},"keywords":{}}],["challeng",{"_index":1164,"title":{"412":{"position":[[0,10]]}},"content":{"152":{"position":[[357,11]]},"170":{"position":[[272,10]]},"223":{"position":[[68,12]]},"240":{"position":[[109,12],[140,9]]},"282":{"position":[[97,12]]},"289":{"position":[[2004,11]]},"392":{"position":[[3007,11]]},"394":{"position":[[1398,10]]},"396":{"position":[[1525,10]]},"399":{"position":[[141,9]]},"412":{"position":[[51,11],[334,11],[788,9],[8646,10],[14904,11],[15072,11]]},"417":{"position":[[121,10]]},"427":{"position":[[936,11]]},"432":{"position":[[664,9]]},"521":{"position":[[42,11]]},"535":{"position":[[617,12]]},"595":{"position":[[644,12]]},"618":{"position":[[190,10]]},"624":{"position":[[903,11]]}},"keywords":{}}],["champion",{"_index":3514,"title":{},"content":{"582":{"position":[[6,9]]}},"keywords":{}}],["chanc",{"_index":3097,"title":{},"content":{"470":{"position":[[81,6]]},"696":{"position":[[1540,6]]},"797":{"position":[[58,6]]}},"keywords":{}}],["chang",{"_index":330,"title":{"50":{"position":[[6,6]]},"77":{"position":[[60,8]]},"79":{"position":[[19,8]]},"103":{"position":[[60,8]]},"110":{"position":[[19,8]]},"129":{"position":[[6,6]]},"140":{"position":[[0,6]]},"168":{"position":[[0,6]]},"196":{"position":[[0,6]]},"240":{"position":[[16,7]]},"344":{"position":[[0,6]]},"367":{"position":[[47,8]]},"403":{"position":[[30,8]]},"490":{"position":[[13,7]]},"509":{"position":[[0,6]]},"529":{"position":[[0,6]]},"585":{"position":[[23,6]]},"634":{"position":[[28,8]]},"719":{"position":[[0,8]]},"750":{"position":[[32,7]]},"1106":{"position":[[0,6]]}},"content":{"19":{"position":[[416,6]]},"34":{"position":[[472,8]]},"36":{"position":[[272,7]]},"38":{"position":[[595,7]]},"39":{"position":[[98,7]]},"47":{"position":[[760,8],[801,7],[910,7]]},"50":{"position":[[102,6],[323,6]]},"53":{"position":[[59,7]]},"57":{"position":[[175,8]]},"65":{"position":[[683,8]]},"77":{"position":[[112,8]]},"79":{"position":[[52,8]]},"89":{"position":[[297,7]]},"90":{"position":[[207,7]]},"99":{"position":[[374,7]]},"103":{"position":[[92,7]]},"106":{"position":[[139,7]]},"110":{"position":[[32,8]]},"121":{"position":[[209,7]]},"122":{"position":[[208,7]]},"124":{"position":[[173,8],[281,7]]},"125":{"position":[[219,7]]},"129":{"position":[[14,6],[74,8],[175,6],[218,7],[285,6],[486,7],[636,6]]},"130":{"position":[[326,7]]},"133":{"position":[[202,7]]},"136":{"position":[[80,7]]},"140":{"position":[[14,6],[65,7],[126,6],[261,6]]},"156":{"position":[[159,6],[268,8]]},"159":{"position":[[242,8]]},"160":{"position":[[138,7]]},"168":{"position":[[13,6],[96,7],[123,6],[236,6]]},"170":{"position":[[416,6]]},"173":{"position":[[1016,8]]},"174":{"position":[[335,8],[1114,7],[2048,7],[2115,7]]},"182":{"position":[[192,8]]},"185":{"position":[[121,8]]},"188":{"position":[[1032,6]]},"191":{"position":[[121,7]]},"196":{"position":[[15,6],[63,7],[92,6],[251,8]]},"201":{"position":[[404,7]]},"204":{"position":[[252,8]]},"208":{"position":[[212,7],[288,7]]},"209":{"position":[[763,7],[886,8]]},"210":{"position":[[681,7]]},"221":{"position":[[69,8],[223,7]]},"226":{"position":[[278,7]]},"233":{"position":[[135,7]]},"235":{"position":[[72,7],[206,7]]},"240":{"position":[[94,7],[201,8]]},"248":{"position":[[278,7]]},"249":{"position":[[453,7]]},"254":{"position":[[514,7]]},"255":{"position":[[165,7],[1585,7]]},"262":{"position":[[578,6]]},"267":{"position":[[559,7],[692,7]]},"274":{"position":[[325,7]]},"275":{"position":[[171,7]]},"277":{"position":[[142,7],[188,7]]},"282":{"position":[[8,7],[289,7]]},"283":{"position":[[334,6],[469,7]]},"289":{"position":[[191,8]]},"299":{"position":[[1439,7]]},"309":{"position":[[314,7]]},"314":{"position":[[1164,6]]},"322":{"position":[[241,7]]},"323":{"position":[[73,8],[122,7]]},"325":{"position":[[100,7]]},"326":{"position":[[171,7],[219,7],[277,6]]},"328":{"position":[[291,7]]},"329":{"position":[[96,8]]},"330":{"position":[[75,7]]},"335":{"position":[[878,7]]},"339":{"position":[[171,7]]},"340":{"position":[[17,7]]},"344":{"position":[[5,6],[177,8]]},"351":{"position":[[202,7]]},"352":{"position":[[54,8]]},"354":{"position":[[1707,8]]},"360":{"position":[[378,7],[485,7]]},"367":{"position":[[112,8]]},"369":{"position":[[1293,8]]},"375":{"position":[[261,7]]},"379":{"position":[[75,7],[154,6]]},"380":{"position":[[224,7]]},"382":{"position":[[252,8]]},"391":{"position":[[1067,6]]},"403":{"position":[[10,6],[313,7]]},"404":{"position":[[162,8]]},"410":{"position":[[1087,7],[1761,7],[1963,8],[2226,7]]},"411":{"position":[[170,8],[532,7],[882,8],[958,6],[1466,7],[2353,7],[2810,7],[2879,7],[3188,7],[3256,8],[3466,7],[4405,6],[4530,7]]},"412":{"position":[[717,7],[1125,6],[2097,8],[2627,7],[3200,7],[3443,8],[3746,7],[11056,6]]},"420":{"position":[[698,7],[898,6]]},"432":{"position":[[806,7]]},"445":{"position":[[1005,6],[1096,7],[1492,7]]},"446":{"position":[[333,7]]},"458":{"position":[[285,7],[699,8],[737,7],[1253,8],[1601,8]]},"464":{"position":[[91,7],[1112,7]]},"470":{"position":[[268,7]]},"475":{"position":[[193,7]]},"476":{"position":[[261,8]]},"480":{"position":[[693,7],[823,7]]},"481":{"position":[[43,7]]},"486":{"position":[[317,7]]},"487":{"position":[[177,7]]},"489":{"position":[[421,7],[782,7]]},"490":{"position":[[65,7],[255,8],[393,7]]},"491":{"position":[[300,7],[416,7],[704,7],[1119,7],[1289,7],[1575,7]]},"493":{"position":[[542,8]]},"494":{"position":[[264,7]]},"495":{"position":[[305,7]]},"496":{"position":[[358,8]]},"502":{"position":[[780,7],[1063,7]]},"509":{"position":[[17,6],[64,7]]},"514":{"position":[[365,7]]},"515":{"position":[[269,7]]},"516":{"position":[[317,7]]},"517":{"position":[[279,7]]},"518":{"position":[[53,8],[239,7],[366,8],[530,7]]},"519":{"position":[[162,7]]},"523":{"position":[[187,7]]},"525":{"position":[[140,7]]},"529":{"position":[[41,6],[89,7]]},"535":{"position":[[974,7]]},"541":{"position":[[786,8],[854,8]]},"542":{"position":[[991,8]]},"544":{"position":[[209,7]]},"562":{"position":[[877,8],[1278,7],[1675,7]]},"565":{"position":[[180,7]]},"570":{"position":[[290,7],[783,7]]},"571":{"position":[[181,8],[313,6],[998,8],[1768,7]]},"574":{"position":[[318,7]]},"575":{"position":[[571,7],[717,7]]},"580":{"position":[[94,7],[644,6]]},"582":{"position":[[179,7],[321,6],[399,7]]},"585":{"position":[[81,6]]},"589":{"position":[[128,7]]},"590":{"position":[[883,7]]},"595":{"position":[[1051,7]]},"600":{"position":[[174,7]]},"601":{"position":[[767,8],[835,7]]},"604":{"position":[[181,7]]},"630":{"position":[[402,7],[855,7]]},"632":{"position":[[62,7],[324,7],[1743,7],[1999,7],[2555,7],[2745,8]]},"634":{"position":[[154,7],[530,7]]},"636":{"position":[[38,7]]},"648":{"position":[[59,7],[341,7]]},"662":{"position":[[143,7]]},"668":{"position":[[245,8]]},"687":{"position":[[76,7]]},"688":{"position":[[360,7]]},"689":{"position":[[257,7]]},"691":{"position":[[181,7],[548,6]]},"696":{"position":[[221,7]]},"698":{"position":[[864,7],[1763,6],[2655,7],[2758,6],[2812,7],[2880,7],[2947,7]]},"699":{"position":[[67,6],[95,7]]},"702":{"position":[[56,6],[128,6]]},"709":{"position":[[596,7]]},"719":{"position":[[65,6],[179,6]]},"723":{"position":[[1597,7]]},"749":{"position":[[8948,8],[11401,7]]},"754":{"position":[[76,8],[642,6]]},"764":{"position":[[96,6],[217,7]]},"766":{"position":[[172,6]]},"773":{"position":[[700,6]]},"778":{"position":[[591,7]]},"779":{"position":[[213,6]]},"781":{"position":[[898,8]]},"783":{"position":[[219,7]]},"784":{"position":[[573,7]]},"785":{"position":[[421,8]]},"828":{"position":[[39,7]]},"829":{"position":[[2774,7],[3056,8],[3695,8]]},"836":{"position":[[2065,7]]},"838":{"position":[[172,7],[502,8],[1701,8]]},"839":{"position":[[1108,7]]},"841":{"position":[[537,7]]},"846":{"position":[[1105,7]]},"848":{"position":[[913,7]]},"854":{"position":[[1323,8]]},"855":{"position":[[261,6]]},"860":{"position":[[549,8]]},"867":{"position":[[256,6]]},"870":{"position":[[145,6]]},"871":{"position":[[132,7]]},"875":{"position":[[3681,6],[3802,6],[5951,6],[6647,7],[6757,7],[8660,7]]},"876":{"position":[[360,7]]},"881":{"position":[[78,8]]},"886":{"position":[[1619,7],[2162,7]]},"890":{"position":[[244,7]]},"897":{"position":[[283,7]]},"898":{"position":[[1444,7]]},"903":{"position":[[545,7]]},"927":{"position":[[175,6],[208,8]]},"932":{"position":[[547,6]]},"941":{"position":[[65,6]]},"981":{"position":[[1335,7]]},"982":{"position":[[347,7],[383,7],[644,7],[677,6]]},"985":{"position":[[333,7]]},"986":{"position":[[1249,7]]},"987":{"position":[[940,7]]},"988":{"position":[[2351,7],[3454,7]]},"991":{"position":[[196,6]]},"996":{"position":[[247,7],[462,7]]},"1007":{"position":[[599,7],[1989,8]]},"1018":{"position":[[161,6]]},"1039":{"position":[[133,8]]},"1044":{"position":[[17,6],[170,6]]},"1048":{"position":[[23,6]]},"1069":{"position":[[102,6],[272,8],[346,7],[413,6]]},"1083":{"position":[[161,7]]},"1085":{"position":[[228,8],[2690,6],[2738,7],[3000,6],[3206,7],[3238,6],[3456,6]]},"1088":{"position":[[648,6]]},"1100":{"position":[[924,6]]},"1106":{"position":[[5,6],[177,6],[282,6],[441,6],[564,7]]},"1109":{"position":[[210,8]]},"1115":{"position":[[888,6]]},"1119":{"position":[[20,7]]},"1124":{"position":[[1012,7],[1179,7]]},"1134":{"position":[[658,6]]},"1138":{"position":[[427,6],[517,6]]},"1150":{"position":[[94,8],[134,7],[525,7]]},"1177":{"position":[[108,7]]},"1185":{"position":[[144,7]]},"1198":{"position":[[1639,8],[1919,6]]},"1204":{"position":[[109,7]]},"1208":{"position":[[1774,7]]},"1222":{"position":[[473,8],[811,8]]},"1230":{"position":[[148,6]]},"1297":{"position":[[300,7]]},"1300":{"position":[[989,8]]},"1304":{"position":[[978,7]]},"1313":{"position":[[643,6],[736,7]]},"1314":{"position":[[458,7]]},"1315":{"position":[[1212,6],[1452,7],[1605,7],[1622,6]]},"1316":{"position":[[1164,7],[2878,7],[3204,8],[3302,7],[3332,7]]},"1317":{"position":[[108,7],[158,7],[291,7],[603,6]]},"1318":{"position":[[920,8],[993,6]]},"1319":{"position":[[21,6],[493,8]]}},"keywords":{}}],["change.assumedmasterstate.myreadonlyfield",{"_index":5973,"title":{},"content":{"1109":{"position":[[266,43]]}},"keywords":{}}],["change.pass",{"_index":3178,"title":{},"content":{"493":{"position":[[424,13]]}},"keywords":{}}],["change.w",{"_index":6560,"title":{},"content":{"1316":{"position":[[2839,9]]}},"keywords":{}}],["changed"",{"_index":5061,"title":{},"content":{"875":{"position":[[9105,13]]}},"keywords":{}}],["changedth",{"_index":5809,"title":{},"content":{"1074":{"position":[[476,10]]}},"keywords":{}}],["changeev",{"_index":5707,"title":{},"content":{"1046":{"position":[[107,12]]}},"keywords":{}}],["changefunct",{"_index":5688,"title":{},"content":{"1042":{"position":[[111,14]]}},"keywords":{}}],["changepoint",{"_index":4988,"title":{},"content":{"875":{"position":[[1557,11]]}},"keywords":{}}],["changer",{"_index":1635,"title":{},"content":{"274":{"position":[[52,7]]},"445":{"position":[[64,7]]}},"keywords":{}}],["changerow",{"_index":5019,"title":{},"content":{"875":{"position":[[4480,10],[4605,9],[4618,12]]}},"keywords":{}}],["changerow.assumedmasterst",{"_index":5024,"title":{},"content":{"875":{"position":[[4748,29],[4810,28]]}},"keywords":{}}],["changerow.assumedmasterstate.updatedat",{"_index":5026,"title":{},"content":{"875":{"position":[[5059,38]]}},"keywords":{}}],["changerow.newdocumentst",{"_index":5029,"title":{},"content":{"875":{"position":[[5272,26]]}},"keywords":{}}],["changerow.newdocumentstate.id",{"_index":5023,"title":{},"content":{"875":{"position":[[4684,32],[5240,31],[5377,30]]}},"keywords":{}}],["changerow.newdocumentstate.updatedat",{"_index":5032,"title":{},"content":{"875":{"position":[[5419,36]]}},"keywords":{}}],["changes.handl",{"_index":1972,"title":{},"content":{"346":{"position":[[317,14]]}},"keywords":{}}],["changes.multi",{"_index":1925,"title":{},"content":{"323":{"position":[[506,13]]}},"keywords":{}}],["changes.multiinst",{"_index":5392,"title":{},"content":{"964":{"position":[[345,21]]}},"keywords":{}}],["changes.no",{"_index":2059,"title":{},"content":{"358":{"position":[[326,10]]}},"keywords":{}}],["changes.offlin",{"_index":3483,"title":{},"content":{"575":{"position":[[309,15]]}},"keywords":{}}],["changes.y",{"_index":6542,"title":{},"content":{"1316":{"position":[[560,11]]}},"keywords":{}}],["changesschema",{"_index":3697,"title":{},"content":{"631":{"position":[[298,13]]}},"keywords":{}}],["changestream",{"_index":282,"title":{},"content":{"16":{"position":[[567,13]]},"23":{"position":[[433,12]]},"698":{"position":[[1021,12],[1055,12]]},"781":{"position":[[692,12]]},"846":{"position":[[938,13]]},"872":{"position":[[409,12],[1176,13]]},"1135":{"position":[[39,13],[315,12]]}},"keywords":{}}],["changestreampreandpostimag",{"_index":4952,"title":{},"content":{"872":{"position":[[1082,29],[1190,28]]}},"keywords":{}}],["changes—perfect",{"_index":3430,"title":{},"content":{"562":{"position":[[987,15]]}},"keywords":{}}],["changevalid",{"_index":5951,"title":{},"content":{"1104":{"position":[[242,16],[484,16]]},"1106":{"position":[[754,16]]},"1109":{"position":[[146,16]]}},"keywords":{}}],["changevalidatormust",{"_index":5959,"title":{},"content":{"1105":{"position":[[1063,19]]}},"keywords":{}}],["channel",{"_index":2638,"title":{},"content":{"411":{"position":[[5107,8]]},"611":{"position":[[48,7]]},"617":{"position":[[2236,7]]},"743":{"position":[[54,7]]},"1126":{"position":[[498,7]]},"1218":{"position":[[48,7]]},"1246":{"position":[[774,8]]}},"keywords":{}}],["channels.th",{"_index":5252,"title":{},"content":{"903":{"position":[[468,12]]}},"keywords":{}}],["channelsconflict",{"_index":5184,"title":{},"content":{"896":{"position":[[253,16]]}},"keywords":{}}],["char",{"_index":4138,"title":{},"content":{"749":{"position":[[377,4]]}},"keywords":{}}],["charact",{"_index":2354,"title":{},"content":{"397":{"position":[[233,11]]},"523":{"position":[[462,11]]},"863":{"position":[[42,10]]},"963":{"position":[[163,11]]}},"keywords":{}}],["character={charact",{"_index":3278,"title":{},"content":{"523":{"position":[[704,21]]}},"keywords":{}}],["characterist",{"_index":960,"title":{"360":{"position":[[4,16]]}},"content":{"70":{"position":[[105,15]]},"566":{"position":[[1,14]]},"828":{"position":[[495,15]]},"841":{"position":[[1,14]]}},"keywords":{}}],["characteristics.anomali",{"_index":2202,"title":{},"content":{"390":{"position":[[1451,23]]}},"keywords":{}}],["characters.map((charact",{"_index":3276,"title":{},"content":{"523":{"position":[[647,27]]}},"keywords":{}}],["characters.th",{"_index":4912,"title":{},"content":{"863":{"position":[[176,14]]}},"keywords":{}}],["charg",{"_index":1555,"title":{},"content":{"251":{"position":[[143,8]]}},"keywords":{}}],["chart",{"_index":4085,"title":{},"content":{"736":{"position":[[102,7]]},"772":{"position":[[2545,5]]}},"keywords":{}}],["chat",{"_index":1158,"title":{},"content":{"151":{"position":[[383,4]]},"267":{"position":[[110,4],[266,4],[458,4],[1476,4]]},"296":{"position":[[80,4]]},"318":{"position":[[549,4]]},"353":{"position":[[703,4]]},"375":{"position":[[596,4]]},"379":{"position":[[221,4]]},"415":{"position":[[120,5]]},"418":{"position":[[118,4]]},"483":{"position":[[945,4]]},"491":{"position":[[1805,6]]},"497":{"position":[[41,4]]},"572":{"position":[[109,4]]},"611":{"position":[[304,5]]},"624":{"position":[[797,4]]},"696":{"position":[[416,4]]},"749":{"position":[[86,4],[433,4],[560,4],[651,4],[804,4],[941,4],[1076,4],[1300,4],[1388,4],[1537,4],[1640,4],[1737,4],[1854,4],[1980,4],[2083,4],[2189,4],[2283,4],[2376,4],[2461,4],[2578,4],[2819,4],[2932,4],[3165,4],[3285,4],[3641,4],[3838,4],[3925,4],[3997,4],[4112,4],[4228,4],[4350,4],[4527,4],[4601,4],[4708,4],[4843,4],[4975,4],[5127,4],[5229,4],[5341,4],[5548,4],[6056,4],[6192,4],[6328,4],[6447,4],[6589,4],[6701,4],[6816,4],[6940,4],[7048,4],[7167,4],[7291,4],[7474,4],[7554,4],[7631,4],[7730,4],[7834,4],[7929,4],[8029,4],[8123,4],[8221,4],[8329,4],[8424,4],[8524,4],[8646,4],[8723,4],[8897,4],[9047,4],[9205,4],[9496,4],[9641,4],[9725,4],[9813,4],[9920,4],[10034,4],[10152,4],[10261,4],[10366,4],[10454,4],[10577,4],[10681,4],[10787,4],[10878,4],[10960,4],[11098,4],[11239,4],[11350,4],[11449,4],[11525,4],[11670,4],[11767,4],[11876,4],[12177,4],[12268,4],[12395,4],[12476,4],[12549,4],[12764,4],[12873,4],[12950,4],[13059,4],[13176,4],[13250,4],[13370,4],[13499,4],[13622,4],[13745,4],[13843,4],[13987,4],[14070,4],[14164,4],[14276,4],[14361,4],[14557,4],[14639,4],[14754,4],[14910,4],[15121,4],[15280,4],[15455,4],[15587,4],[15721,4],[15853,4],[15988,4],[16090,4],[16238,4],[16357,4],[16479,4],[16628,4],[16821,4],[16910,4],[17016,4],[17139,4],[17288,4],[17397,4],[17513,4],[17631,4],[17754,4],[17863,4],[17984,4],[18106,4],[18203,4],[18303,4],[18485,4],[18579,4],[18698,4],[18802,4],[18908,4],[19011,4],[19105,4],[19307,4],[19435,4],[19561,4],[19676,4],[19777,4],[19869,4],[19993,4],[20111,4],[20268,4],[20434,4],[20535,4],[20702,4],[20839,4],[21012,4],[21296,4],[21450,4],[21713,4],[22015,4],[22135,4],[22219,4],[22337,4],[22444,4],[22564,4],[22704,4],[22833,4],[22993,4],[23186,4],[23312,4],[23444,4],[23577,4],[23768,4],[23950,4],[24070,4],[24231,4],[24361,4],[24441,4]]},"783":{"position":[[335,4]]},"824":{"position":[[394,5]]},"899":{"position":[[441,4]]}},"keywords":{}}],["cheaper",{"_index":2582,"title":{},"content":{"409":{"position":[[45,7]]}},"keywords":{}}],["check",{"_index":993,"title":{"300":{"position":[[0,8]]},"761":{"position":[[16,5]]}},"content":{"84":{"position":[[79,5]]},"114":{"position":[[92,5]]},"149":{"position":[[92,5]]},"188":{"position":[[2499,5]]},"253":{"position":[[72,5]]},"263":{"position":[[380,5]]},"306":{"position":[[15,8]]},"347":{"position":[[92,5]]},"362":{"position":[[1163,5]]},"404":{"position":[[251,5]]},"412":{"position":[[4896,5]]},"489":{"position":[[213,5]]},"491":{"position":[[1928,5]]},"495":{"position":[[650,5]]},"498":{"position":[[228,5]]},"511":{"position":[[92,5]]},"531":{"position":[[92,5]]},"557":{"position":[[138,5]]},"566":{"position":[[521,6]]},"567":{"position":[[845,5]]},"591":{"position":[[92,5]]},"628":{"position":[[1,5]]},"679":{"position":[[309,5]]},"683":{"position":[[607,5]]},"710":{"position":[[2510,5]]},"752":{"position":[[615,5]]},"761":{"position":[[20,5],[336,5]]},"776":{"position":[[1,5]]},"802":{"position":[[329,6]]},"824":{"position":[[266,5]]},"838":{"position":[[3238,5]]},"841":{"position":[[1221,7]]},"842":{"position":[[65,5]]},"875":{"position":[[4989,5]]},"890":{"position":[[970,5]]},"906":{"position":[[1119,5]]},"913":{"position":[[1,5]]},"943":{"position":[[221,5]]},"1044":{"position":[[127,6]]},"1065":{"position":[[960,6]]},"1090":{"position":[[1104,5]]},"1106":{"position":[[428,5]]},"1228":{"position":[[35,5]]},"1237":{"position":[[188,7]]},"1272":{"position":[[364,5]]},"1298":{"position":[[272,5]]},"1309":{"position":[[820,5]]},"1317":{"position":[[214,5],[514,5],[623,5]]}},"keywords":{}}],["check'",{"_index":5902,"title":{},"content":{"1085":{"position":[[3179,7]]}},"keywords":{}}],["check.j",{"_index":4509,"title":{},"content":{"761":{"position":[[655,10],[778,10]]}},"keywords":{}}],["checkout",{"_index":3194,"title":{},"content":{"496":{"position":[[522,10]]}},"keywords":{}}],["checkpoint",{"_index":3684,"title":{"984":{"position":[[0,10]]}},"content":{"626":{"position":[[684,10],[1016,10]]},"632":{"position":[[121,10]]},"647":{"position":[[109,10],[506,10]]},"756":{"position":[[375,10],[450,11]]},"875":{"position":[[1457,11],[1473,10],[1828,10],[1849,11],[2850,11],[3500,11],[4575,11],[8338,11],[9286,10]]},"885":{"position":[[89,10],[237,11],[721,10],[808,11],[820,10],[868,11],[2451,10],[2619,11]]},"886":{"position":[[131,10],[388,12],[453,10],[503,13],[519,10],[659,12],[733,10],[824,11],[3648,10]]},"888":{"position":[[189,11],[302,10],[852,10],[935,10],[1075,11]]},"897":{"position":[[159,10]]},"898":{"position":[[3774,10]]},"983":{"position":[[214,10],[306,11],[335,10],[801,10]]},"984":{"position":[[72,10],[144,10],[219,10],[366,11],[471,11],[493,10],[531,11]]},"985":{"position":[[240,11],[398,10],[687,10]]},"986":{"position":[[323,11],[1312,10]]},"988":{"position":[[4172,10],[4257,10],[4306,11],[5483,11],[6008,11]]},"996":{"position":[[57,10]]},"1002":{"position":[[244,11],[277,10],[408,12],[645,12],[860,10],[952,10],[1299,12]]},"1008":{"position":[[60,14]]},"1020":{"position":[[217,10]]},"1294":{"position":[[669,10],[1240,11]]},"1296":{"position":[[1257,11]]}},"keywords":{}}],["checkpoint')).json",{"_index":5542,"title":{},"content":{"1002":{"position":[[1052,21]]}},"keywords":{}}],["checkpointinput",{"_index":5118,"title":{},"content":{"886":{"position":[[604,16]]}},"keywords":{}}],["checkpointornul",{"_index":5007,"title":{},"content":{"875":{"position":[[3204,16],[3266,16]]}},"keywords":{}}],["checkpointornull.id",{"_index":5009,"title":{},"content":{"875":{"position":[[3285,19]]}},"keywords":{}}],["checkpointornull.updatedat",{"_index":5008,"title":{},"content":{"875":{"position":[[3223,26]]}},"keywords":{}}],["childpath",{"_index":4270,"title":{},"content":{"749":{"position":[[10500,9]]}},"keywords":{}}],["chip",{"_index":3464,"title":{},"content":{"569":{"position":[[885,4]]}},"keywords":{}}],["choic",{"_index":560,"title":{},"content":{"35":{"position":[[511,6]]},"64":{"position":[[179,6]]},"67":{"position":[[87,6]]},"71":{"position":[[22,6]]},"83":{"position":[[212,6]]},"98":{"position":[[102,6]]},"102":{"position":[[33,6]]},"118":{"position":[[355,6]]},"161":{"position":[[85,7]]},"174":{"position":[[154,7],[1469,6]]},"175":{"position":[[658,6]]},"179":{"position":[[222,6]]},"186":{"position":[[357,6]]},"207":{"position":[[271,7]]},"238":{"position":[[291,7]]},"241":{"position":[[654,6]]},"265":{"position":[[855,6]]},"267":{"position":[[246,6],[1415,6]]},"279":{"position":[[103,6]]},"287":{"position":[[745,6]]},"290":{"position":[[194,6]]},"353":{"position":[[463,6]]},"354":{"position":[[1573,7]]},"365":{"position":[[1274,7]]},"366":{"position":[[410,6]]},"371":{"position":[[264,6]]},"387":{"position":[[431,6]]},"435":{"position":[[327,6]]},"441":{"position":[[156,6]]},"445":{"position":[[905,6]]},"446":{"position":[[46,6]]},"500":{"position":[[327,6]]},"624":{"position":[[480,6],[771,6]]},"640":{"position":[[106,7]]},"1085":{"position":[[1838,6]]},"1198":{"position":[[1512,6]]}},"keywords":{}}],["choos",{"_index":1110,"title":{"364":{"position":[[4,6]]},"418":{"position":[[8,6]]},"441":{"position":[[12,8]]},"473":{"position":[[4,6]]},"690":{"position":[[8,6]]}},"content":{"131":{"position":[[913,6]]},"146":{"position":[[283,6]]},"162":{"position":[[760,6]]},"174":{"position":[[3152,6]]},"178":{"position":[[292,8]]},"189":{"position":[[653,8]]},"202":{"position":[[87,6]]},"247":{"position":[[139,8]]},"266":{"position":[[379,6]]},"278":{"position":[[18,8]]},"393":{"position":[[384,6]]},"401":{"position":[[896,8]]},"483":{"position":[[190,8]]},"489":{"position":[[151,6]]},"496":{"position":[[325,8],[594,6]]},"524":{"position":[[103,6]]},"581":{"position":[[610,6]]},"640":{"position":[[425,8]]},"707":{"position":[[380,8]]},"759":{"position":[[1495,8]]},"1147":{"position":[[371,6]]},"1294":{"position":[[1912,8]]}},"keywords":{}}],["chosen",{"_index":1667,"title":{},"content":{"286":{"position":[[366,6]]},"369":{"position":[[1425,6]]},"798":{"position":[[874,6]]},"1066":{"position":[[680,6]]}},"keywords":{}}],["chrome",{"_index":1706,"title":{},"content":{"298":{"position":[[155,7],[459,6]]},"299":{"position":[[1026,6],[1052,6]]},"301":{"position":[[448,6]]},"404":{"position":[[273,6]]},"408":{"position":[[970,6]]},"439":{"position":[[30,6],[662,6]]},"458":{"position":[[933,7]]},"462":{"position":[[338,6]]},"470":{"position":[[571,7]]},"696":{"position":[[1285,6]]},"707":{"position":[[226,6]]},"709":{"position":[[32,6]]},"1207":{"position":[[113,7]]},"1292":{"position":[[100,6]]},"1301":{"position":[[1011,7]]}},"keywords":{}}],["chrome.storage.local.get('foobar",{"_index":2929,"title":{},"content":{"439":{"position":[[743,35]]}},"keywords":{}}],["chrome.storage.local.set",{"_index":2926,"title":{},"content":{"439":{"position":[[675,26]]}},"keywords":{}}],["chrome/chromium/edg",{"_index":3016,"title":{},"content":{"461":{"position":[[787,21]]}},"keywords":{}}],["chrome://gpu",{"_index":2501,"title":{},"content":{"404":{"position":[[307,14]]}},"keywords":{}}],["chrome’",{"_index":1727,"title":{},"content":{"298":{"position":[[757,8]]},"299":{"position":[[758,8]]},"301":{"position":[[668,8]]}},"keywords":{}}],["chromium",{"_index":1718,"title":{},"content":{"298":{"position":[[471,8]]},"299":{"position":[[858,8]]},"450":{"position":[[767,8]]},"455":{"position":[[940,9]]},"461":{"position":[[1152,8]]},"617":{"position":[[1750,8]]},"1208":{"position":[[527,8]]},"1214":{"position":[[199,10]]},"1297":{"position":[[1,8]]}},"keywords":{}}],["chunk",{"_index":1850,"title":{"1008":{"position":[[29,6]]}},"content":{"303":{"position":[[1213,5]]},"411":{"position":[[81,6]]},"412":{"position":[[7177,5]]},"556":{"position":[[1206,6]]},"981":{"position":[[1024,5]]},"1007":{"position":[[313,5],[399,5],[410,5],[464,6],[801,5],[885,5],[928,5],[1333,5],[2047,7]]},"1008":{"position":[[186,5],[318,6]]},"1009":{"position":[[549,5]]},"1239":{"position":[[278,6]]}},"keywords":{}}],["chunk'",{"_index":5559,"title":{},"content":{"1007":{"position":[[528,7],[763,7]]}},"keywords":{}}],["chunkid",{"_index":5557,"title":{},"content":{"1007":{"position":[[143,8],[1189,7],[1343,8]]}},"keywords":{}}],["ci",{"_index":3837,"title":{},"content":{"670":{"position":[[79,2]]},"730":{"position":[[37,2]]}},"keywords":{}}],["ciphertext",{"_index":3360,"title":{},"content":{"555":{"position":[[846,10]]}},"keywords":{}}],["circular",{"_index":5667,"title":{},"content":{"1033":{"position":[[984,8]]}},"keywords":{}}],["circumst",{"_index":6538,"title":{},"content":{"1316":{"position":[[365,13]]}},"keywords":{}}],["circumv",{"_index":1853,"title":{},"content":{"303":{"position":[[1288,10]]},"624":{"position":[[277,13]]}},"keywords":{}}],["cite",{"_index":1742,"title":{},"content":{"299":{"position":[[300,5]]}},"keywords":{}}],["citi",{"_index":6528,"title":{},"content":{"1315":{"position":[[215,6],[233,4],[393,4],[1413,4]]}},"keywords":{}}],["citizen",{"_index":3910,"title":{},"content":{"690":{"position":[[488,8]]}},"keywords":{}}],["city.id",{"_index":6533,"title":{},"content":{"1315":{"position":[[465,8]]}},"keywords":{}}],["city.nam",{"_index":6531,"title":{},"content":{"1315":{"position":[[404,9]]}},"keywords":{}}],["city_id",{"_index":6529,"title":{},"content":{"1315":{"position":[[272,8]]}},"keywords":{}}],["citydocu",{"_index":6534,"title":{},"content":{"1315":{"position":[[554,12]]}},"keywords":{}}],["cj",{"_index":4510,"title":{},"content":{"761":{"position":[[696,3]]}},"keywords":{}}],["claim",{"_index":102,"title":{},"content":{"8":{"position":[[37,6]]},"38":{"position":[[107,6]]}},"keywords":{}}],["clariti",{"_index":2078,"title":{},"content":{"360":{"position":[[739,8]]},"690":{"position":[[589,8]]},"1132":{"position":[[528,7]]}},"keywords":{}}],["clash",{"_index":1886,"title":{},"content":{"312":{"position":[[301,8]]},"1084":{"position":[[620,5]]}},"keywords":{}}],["class",{"_index":3767,"title":{},"content":{"655":{"position":[[192,5]]},"690":{"position":[[482,5]]},"805":{"position":[[173,5]]},"806":{"position":[[46,5]]},"825":{"position":[[895,5]]},"837":{"position":[[1463,5]]},"979":{"position":[[165,6]]},"1084":{"position":[[535,5]]},"1085":{"position":[[1906,5],[1953,5]]}},"keywords":{}}],["claus",{"_index":6576,"title":{},"content":{"1323":{"position":[[124,7]]}},"keywords":{}}],["clean",{"_index":1143,"title":{},"content":{"145":{"position":[[56,5]]},"346":{"position":[[465,5]]},"461":{"position":[[503,5],[585,7]]},"562":{"position":[[1398,5]]},"590":{"position":[[506,5]]},"612":{"position":[[2368,5]]},"660":{"position":[[144,5]]},"662":{"position":[[733,7]]},"697":{"position":[[239,5]]},"773":{"position":[[402,6]]},"816":{"position":[[27,8]]},"829":{"position":[[3764,7]]},"997":{"position":[[83,7]]},"1009":{"position":[[1054,5]]},"1266":{"position":[[631,6]]},"1311":{"position":[[1817,5]]}},"keywords":{}}],["cleanup",{"_index":1814,"title":{"651":{"position":[[3,7]]},"653":{"position":[[23,7]]},"654":{"position":[[8,7]]},"655":{"position":[[10,7]]},"1119":{"position":[[0,7]]}},"content":{"302":{"position":[[935,7]]},"522":{"position":[[745,7]]},"653":{"position":[[24,7],[456,8],[723,7],[848,7],[873,7],[1282,7],[1434,8]]},"654":{"position":[[24,7],[107,7]]},"655":{"position":[[343,7]]},"656":{"position":[[15,7],[31,7],[227,7],[468,7]]},"746":{"position":[[818,8]]},"793":{"position":[[1097,7]]},"960":{"position":[[640,7]]},"975":{"position":[[206,8]]},"1047":{"position":[[215,7]]},"1119":{"position":[[311,7]]},"1186":{"position":[[8,8]]}},"keywords":{}}],["cleanuppolici",{"_index":3263,"title":{},"content":{"522":{"position":[[711,14]]},"653":{"position":[[327,14]]},"654":{"position":[[154,14]]},"960":{"position":[[606,14]]}},"keywords":{}}],["clear",{"_index":1656,"title":{},"content":{"281":{"position":[[257,5]]},"300":{"position":[[590,8]]},"302":{"position":[[504,5]]},"305":{"position":[[69,5]]},"335":{"position":[[323,5]]},"412":{"position":[[8051,5]]},"425":{"position":[[201,6],[486,8]]},"439":{"position":[[177,5],[230,5]]},"451":{"position":[[227,5],[825,8],[863,7]]},"495":{"position":[[441,5]]},"815":{"position":[[84,6]]},"977":{"position":[[146,5],[493,5]]},"1119":{"position":[[266,5]]},"1198":{"position":[[352,5]]}},"keywords":{}}],["clearer",{"_index":2811,"title":{},"content":{"419":{"position":[[1505,7]]}},"keywords":{}}],["clearinterval(intervalid",{"_index":3612,"title":{},"content":{"612":{"position":[[2434,26]]}},"keywords":{}}],["clearli",{"_index":6281,"title":{},"content":{"1237":{"position":[[327,7]]}},"keywords":{}}],["clever",{"_index":6563,"title":{},"content":{"1316":{"position":[[3481,6]]}},"keywords":{}}],["cli",{"_index":324,"title":{},"content":{"19":{"position":[[273,3]]},"899":{"position":[[345,3]]},"1133":{"position":[[33,3]]}},"keywords":{}}],["click",{"_index":3158,"title":{},"content":{"489":{"position":[[376,8]]},"703":{"position":[[1411,5]]},"778":{"position":[[530,7]]},"785":{"position":[[105,8]]},"1313":{"position":[[584,6]]}},"keywords":{}}],["client",{"_index":205,"title":{"132":{"position":[[37,7]]},"163":{"position":[[37,7]]},"190":{"position":[[37,7]]},"271":{"position":[[22,6]]},"278":{"position":[[30,6]]},"288":{"position":[[38,7]]},"294":{"position":[[15,6]]},"337":{"position":[[37,7]]},"501":{"position":[[22,6]]},"525":{"position":[[37,7]]},"582":{"position":[[37,7]]},"626":{"position":[[2,6]]},"702":{"position":[[24,6]]},"872":{"position":[[15,6]]},"874":{"position":[[46,7]]},"886":{"position":[[5,7]]},"902":{"position":[[45,6]]},"912":{"position":[[37,6]]}},"content":{"14":{"position":[[146,6],[560,7]]},"16":{"position":[[70,6]]},"19":{"position":[[95,6]]},"20":{"position":[[72,6],[170,6],[232,6]]},"21":{"position":[[16,6]]},"22":{"position":[[319,6]]},"37":{"position":[[153,7]]},"38":{"position":[[17,6],[301,6]]},"41":{"position":[[228,7],[322,6]]},"42":{"position":[[139,6]]},"43":{"position":[[469,6],[577,6]]},"45":{"position":[[45,6]]},"46":{"position":[[461,6],[678,6]]},"99":{"position":[[95,6],[109,6]]},"110":{"position":[[78,6]]},"120":{"position":[[11,6]]},"123":{"position":[[61,7],[284,8]]},"134":{"position":[[60,7]]},"135":{"position":[[82,6],[192,7]]},"136":{"position":[[151,7]]},"139":{"position":[[146,6]]},"147":{"position":[[48,7]]},"151":{"position":[[252,7]]},"153":{"position":[[42,6],[399,7]]},"157":{"position":[[176,6]]},"158":{"position":[[57,7],[237,8],[301,6]]},"164":{"position":[[398,8]]},"165":{"position":[[102,7]]},"172":{"position":[[34,6],[150,6],[320,6]]},"173":{"position":[[1349,6],[1981,6],[2581,6]]},"174":{"position":[[2072,6],[2139,6]]},"181":{"position":[[11,6],[325,7]]},"184":{"position":[[177,7]]},"190":{"position":[[86,7]]},"192":{"position":[[104,7]]},"201":{"position":[[127,6]]},"203":{"position":[[343,7]]},"208":{"position":[[67,6]]},"210":{"position":[[635,6],[741,6]]},"212":{"position":[[489,6]]},"224":{"position":[[134,6]]},"226":{"position":[[88,6]]},"240":{"position":[[62,6]]},"248":{"position":[[28,6]]},"249":{"position":[[368,6]]},"261":{"position":[[153,7],[408,7]]},"267":{"position":[[400,7]]},"271":{"position":[[110,6],[219,6]]},"278":{"position":[[64,6]]},"279":{"position":[[146,7]]},"280":{"position":[[33,6]]},"288":{"position":[[36,7],[290,7]]},"289":{"position":[[128,7],[565,7],[801,6]]},"293":{"position":[[40,6]]},"320":{"position":[[218,6]]},"321":{"position":[[156,7],[509,6]]},"325":{"position":[[11,6]]},"328":{"position":[[117,7]]},"339":{"position":[[17,7]]},"340":{"position":[[46,6],[82,7]]},"359":{"position":[[71,6]]},"367":{"position":[[193,6]]},"369":{"position":[[1077,7]]},"407":{"position":[[69,6]]},"408":{"position":[[107,6],[449,6],[775,7],[2750,6],[2816,7],[3733,7],[4371,6],[4451,6],[5171,8],[5300,6]]},"410":{"position":[[680,6],[1389,6],[1772,8]]},"411":{"position":[[484,6],[1229,6],[1408,6],[4021,7]]},"412":{"position":[[940,6],[1079,6],[2139,6],[2301,7],[4349,6],[4390,6],[6729,7],[6831,7],[8919,6],[9013,6],[9311,7],[10392,6],[10516,6],[10992,7],[11000,6],[11366,7],[11433,7],[11860,6],[12171,6],[12874,6],[13144,6],[13444,6],[13817,7],[13893,7],[14262,6],[14420,6],[14742,7],[14992,6]]},"416":{"position":[[92,7],[391,7]]},"419":{"position":[[826,6]]},"434":{"position":[[35,6]]},"435":{"position":[[52,6]]},"450":{"position":[[352,6]]},"454":{"position":[[306,6]]},"455":{"position":[[88,6],[205,6]]},"473":{"position":[[67,6]]},"477":{"position":[[170,6]]},"478":{"position":[[61,6],[198,7]]},"479":{"position":[[85,6]]},"491":{"position":[[451,7],[739,8],[1344,7],[1603,7]]},"495":{"position":[[767,6],[820,6]]},"496":{"position":[[846,6]]},"501":{"position":[[97,6]]},"502":{"position":[[80,6],[375,6]]},"504":{"position":[[571,7],[647,7],[849,7],[973,7],[1380,7]]},"514":{"position":[[240,7]]},"517":{"position":[[104,7],[299,6]]},"525":{"position":[[91,6],[311,6],[480,7]]},"534":{"position":[[473,6],[636,6]]},"570":{"position":[[346,7],[444,6],[509,7],[818,8]]},"571":{"position":[[28,6],[495,7]]},"575":{"position":[[152,6]]},"582":{"position":[[502,7]]},"594":{"position":[[471,6],[634,6]]},"610":{"position":[[64,6],[242,6],[477,7],[570,6],[897,6],[1247,6],[1439,6],[1569,6],[1635,6]]},"611":{"position":[[105,6],[620,6]]},"612":{"position":[[79,6],[187,7],[291,6],[613,7],[701,6]]},"613":{"position":[[98,7]]},"614":{"position":[[563,6],[570,6],[629,6],[695,7]]},"616":{"position":[[117,6],[431,6]]},"617":{"position":[[109,6],[613,6],[1090,6],[2314,8]]},"618":{"position":[[628,8]]},"621":{"position":[[249,6],[584,6]]},"622":{"position":[[128,6],[266,7],[380,6]]},"623":{"position":[[266,7]]},"624":{"position":[[28,6],[533,6]]},"626":{"position":[[8,6],[139,7],[485,6],[582,6],[786,6],[916,6],[943,6],[1052,6],[1137,7]]},"628":{"position":[[136,6]]},"632":{"position":[[199,6],[534,7],[2733,6]]},"634":{"position":[[120,7]]},"635":{"position":[[64,7]]},"661":{"position":[[1716,7],[1778,7]]},"663":{"position":[[126,6]]},"683":{"position":[[391,6]]},"696":{"position":[[94,7],[634,6],[1790,7]]},"697":{"position":[[439,6]]},"698":{"position":[[116,7],[720,7],[1555,7],[1659,7],[1751,6],[1873,8],[2713,7]]},"699":{"position":[[36,7],[411,7],[769,6]]},"700":{"position":[[111,7],[139,6],[298,8]]},"702":{"position":[[663,6],[752,7]]},"704":{"position":[[160,6],[593,7]]},"705":{"position":[[792,7],[1409,7]]},"711":{"position":[[2158,6]]},"712":{"position":[[145,6]]},"736":{"position":[[463,7]]},"749":{"position":[[16389,7],[16519,7],[16652,6],[16728,6]]},"756":{"position":[[333,8]]},"780":{"position":[[588,6]]},"781":{"position":[[316,7],[346,6],[431,6]]},"782":{"position":[[385,7]]},"783":{"position":[[352,8],[656,6]]},"784":{"position":[[194,6],[485,7],[643,7],[778,6]]},"836":{"position":[[2423,6]]},"837":{"position":[[300,6]]},"839":{"position":[[1276,7]]},"840":{"position":[[70,7],[294,7]]},"842":{"position":[[260,6]]},"844":{"position":[[217,7]]},"860":{"position":[[249,6],[703,7],[1042,6],[1242,6],[1251,6],[1260,6]]},"861":{"position":[[1746,8],[2460,7]]},"862":{"position":[[63,6],[457,6],[921,7],[962,6],[975,9],[1204,7]]},"863":{"position":[[631,7]]},"871":{"position":[[51,7],[166,7],[185,6],[231,6],[421,8],[486,6],[512,6],[521,6]]},"872":{"position":[[15,6],[3056,6],[3593,6],[3626,6],[4002,8]]},"875":{"position":[[37,7],[772,7],[2922,6],[3588,6],[6087,7],[6787,6],[7021,7],[7138,7],[7786,6],[7918,7],[7930,6],[8554,6],[9066,6],[9132,6]]},"876":{"position":[[86,7],[207,6],[337,6],[576,7],[615,6]]},"879":{"position":[[162,7],[300,6],[422,6],[500,6]]},"880":{"position":[[10,7],[118,6],[140,6]]},"881":{"position":[[10,6],[287,6]]},"885":{"position":[[402,6]]},"890":{"position":[[1045,6]]},"893":{"position":[[301,6]]},"896":{"position":[[53,6]]},"897":{"position":[[1,6],[19,6],[28,6],[40,7],[99,7],[548,7]]},"898":{"position":[[483,7],[634,7],[712,6],[2158,6],[2724,7],[2755,6],[2917,8],[2967,6],[3224,6],[3363,7]]},"901":{"position":[[677,6]]},"902":{"position":[[84,6]]},"903":{"position":[[190,8],[720,6]]},"904":{"position":[[139,8],[1941,7]]},"908":{"position":[[98,7]]},"912":{"position":[[38,6]]},"981":{"position":[[799,6],[923,6],[1096,6],[1248,6],[1667,6]]},"982":{"position":[[278,6],[330,6],[363,6],[460,6],[556,7],[572,6],[719,6],[785,7]]},"983":{"position":[[433,6],[448,6],[931,6]]},"984":{"position":[[43,6]]},"985":{"position":[[11,6],[125,7],[430,6],[605,6],[636,6]]},"987":{"position":[[15,7],[262,6],[524,6],[849,7]]},"988":{"position":[[4999,6],[5838,6],[6046,6]]},"990":{"position":[[1046,6],[1351,6]]},"991":{"position":[[15,6],[72,6],[212,7]]},"995":{"position":[[1337,7]]},"996":{"position":[[88,6],[205,6],[358,6],[423,6]]},"1005":{"position":[[135,7]]},"1032":{"position":[[204,6]]},"1072":{"position":[[140,6],[685,6],[1234,6]]},"1088":{"position":[[214,7]]},"1100":{"position":[[878,6],[1012,8]]},"1101":{"position":[[33,7],[184,6],[600,7]]},"1102":{"position":[[737,6],[831,6],[923,6]]},"1104":{"position":[[206,6],[621,6]]},"1105":{"position":[[88,6],[1003,7]]},"1106":{"position":[[122,7],[161,7],[365,7]]},"1107":{"position":[[1071,6]]},"1108":{"position":[[126,8],[135,7],[366,8]]},"1109":{"position":[[81,7]]},"1112":{"position":[[242,6]]},"1123":{"position":[[620,6]]},"1124":{"position":[[1293,6],[1360,6]]},"1133":{"position":[[26,6],[256,6]]},"1196":{"position":[[10,6],[130,6]]},"1198":{"position":[[98,6],[1691,7]]},"1206":{"position":[[521,6]]},"1218":{"position":[[278,6]]},"1220":{"position":[[393,6]]},"1249":{"position":[[299,6]]},"1250":{"position":[[369,6]]},"1260":{"position":[[22,7]]},"1295":{"position":[[486,6]]},"1301":{"position":[[353,6],[515,6]]},"1304":{"position":[[1058,7],[1293,8],[1312,6],[1384,7],[1688,7]]},"1305":{"position":[[125,6]]},"1308":{"position":[[46,7],[295,6],[498,6]]},"1314":{"position":[[316,7],[391,6],[565,6]]},"1316":{"position":[[193,6],[288,7],[1074,7],[1142,6],[1928,7],[1936,6],[2016,6],[2139,6],[2181,7],[2359,6],[2640,8],[2670,7],[2771,6],[2859,7],[3040,6],[3140,6]]},"1317":{"position":[[19,6],[141,6]]},"1318":{"position":[[140,7]]},"1319":{"position":[[619,6],[677,6]]},"1321":{"position":[[51,6]]},"1324":{"position":[[56,6],[545,7],[754,8]]}},"keywords":{}}],["client'",{"_index":1403,"title":{},"content":{"220":{"position":[[72,8]]},"270":{"position":[[275,8]]},"273":{"position":[[155,8]]},"280":{"position":[[195,8]]},"294":{"position":[[125,8]]},"392":{"position":[[4932,8]]},"412":{"position":[[11250,8]]},"630":{"position":[[255,8]]},"708":{"position":[[289,8]]},"1314":{"position":[[226,8]]}},"keywords":{}}],["client.delet",{"_index":5550,"title":{},"content":{"1004":{"position":[[481,14]]}},"keywords":{}}],["client.j",{"_index":6254,"title":{},"content":{"1219":{"position":[[767,9]]}},"keywords":{}}],["client.queri",{"_index":5942,"title":{},"content":{"1102":{"position":[[1033,14]]}},"keywords":{}}],["client.setendpoint('https://cloud.appwrite.io/v1",{"_index":4904,"title":{},"content":{"862":{"position":[[985,51]]}},"keywords":{}}],["client.setproject('your_appwrite_project_id",{"_index":4905,"title":{},"content":{"862":{"position":[[1037,46]]}},"keywords":{}}],["client.subscrib",{"_index":1328,"title":{},"content":{"205":{"position":[[249,16]]}},"keywords":{}}],["client.t",{"_index":4969,"title":{},"content":{"872":{"position":[[3765,9]]},"875":{"position":[[317,9],[3059,9],[6103,9],[8029,9],[8949,9],[9448,9]]},"1101":{"position":[[617,9]]}},"keywords":{}}],["clientopt",{"_index":5141,"title":{},"content":{"886":{"position":[[4465,13]]}},"keywords":{}}],["clients.improv",{"_index":3478,"title":{},"content":{"574":{"position":[[381,16]]}},"keywords":{}}],["clock",{"_index":2771,"title":{},"content":{"412":{"position":[[14634,5]]},"705":{"position":[[1007,5],[1439,6]]},"991":{"position":[[27,6]]},"1304":{"position":[[1151,5]]},"1305":{"position":[[465,7]]},"1316":{"position":[[1899,5],[1948,6],[2036,5],[2120,5]]},"1324":{"position":[[855,6]]}},"keywords":{}}],["clojur",{"_index":624,"title":{},"content":{"39":{"position":[[448,8]]}},"keywords":{}}],["clone",{"_index":3823,"title":{},"content":{"666":{"position":[[151,5]]},"749":{"position":[[11937,7]]},"824":{"position":[[154,5]]},"848":{"position":[[231,5]]},"1052":{"position":[[37,6],[102,7]]},"1108":{"position":[[693,5]]}},"keywords":{}}],["close",{"_index":1726,"title":{"955":{"position":[[0,8]]},"976":{"position":[[0,8]]},"1027":{"position":[[0,8]]}},"content":{"298":{"position":[[744,7]]},"301":{"position":[[383,5]]},"360":{"position":[[65,7]]},"392":{"position":[[2322,6]]},"408":{"position":[[5135,7]]},"424":{"position":[[316,6]]},"451":{"position":[[905,7]]},"458":{"position":[[111,5]]},"468":{"position":[[692,6]]},"610":{"position":[[507,7]]},"611":{"position":[[1247,7]]},"612":{"position":[[2400,6]]},"618":{"position":[[344,7]]},"622":{"position":[[495,7]]},"737":{"position":[[226,7],[272,7]]},"746":{"position":[[833,6]]},"749":{"position":[[8760,6]]},"783":{"position":[[96,5]]},"956":{"position":[[71,6],[292,10]]},"967":{"position":[[19,6],[361,5],[389,7]]},"976":{"position":[[1,6],[159,7],[167,7]]},"988":{"position":[[5647,5]]},"995":{"position":[[342,6],[999,6]]},"1027":{"position":[[168,7]]},"1030":{"position":[[71,6]]},"1174":{"position":[[634,7]]},"1198":{"position":[[744,6]]},"1208":{"position":[[1829,5]]},"1218":{"position":[[212,7],[234,6]]},"1298":{"position":[[205,5]]},"1319":{"position":[[688,5]]}},"keywords":{}}],["closedupl",{"_index":5397,"title":{"967":{"position":[[0,16]]}},"content":{"967":{"position":[[196,16],[314,16]]}},"keywords":{}}],["closest",{"_index":2199,"title":{},"content":{"390":{"position":[[1235,7]]}},"keywords":{}}],["cloud",{"_index":207,"title":{"202":{"position":[[32,6]]},"204":{"position":[[9,5]]},"251":{"position":[[11,5]]},"1148":{"position":[[13,5]]}},"content":{"14":{"position":[[199,5],[597,5],[1027,5]]},"18":{"position":[[247,6]]},"19":{"position":[[1019,5]]},"26":{"position":[[15,5],[125,5],[408,6]]},"36":{"position":[[389,5],[440,5]]},"260":{"position":[[222,5]]},"289":{"position":[[1024,5],[1210,5]]},"410":{"position":[[1596,5]]},"411":{"position":[[5370,5]]},"412":{"position":[[2875,5],[4186,5],[8767,5],[8812,5],[11099,5],[12083,5]]},"414":{"position":[[257,5]]},"417":{"position":[[276,5]]},"418":{"position":[[758,5]]},"444":{"position":[[564,5],[820,5]]},"504":{"position":[[1145,5]]},"839":{"position":[[389,5],[455,6],[910,5],[1301,5]]},"840":{"position":[[18,5],[122,5]]},"841":{"position":[[252,5],[650,7],[811,5]]},"860":{"position":[[1143,5]]},"861":{"position":[[33,5],[101,5],[288,5]]},"862":{"position":[[938,5]]},"872":{"position":[[325,6]]},"896":{"position":[[1,5]]},"1112":{"position":[[305,5]]},"1124":{"position":[[1774,5]]},"1147":{"position":[[162,5],[239,5],[471,5]]},"1148":{"position":[[7,5],[213,5],[263,5],[445,5],[476,5],[512,6],[667,5],[723,5]]}},"keywords":{}}],["cloud.integr",{"_index":1306,"title":{},"content":{"202":{"position":[[175,15]]}},"keywords":{}}],["cloudant",{"_index":422,"title":{"26":{"position":[[0,9]]}},"content":{"26":{"position":[[1,8],[356,8]]}},"keywords":{}}],["cluster",{"_index":4563,"title":{},"content":{"772":{"position":[[240,7],[459,7],[1268,7],[1845,8]]},"865":{"position":[[39,7]]},"870":{"position":[[269,8]]},"871":{"position":[[874,8]]},"1095":{"position":[[189,7],[336,7]]},"1134":{"position":[[256,9],[461,7]]},"1135":{"position":[[88,7],[239,8]]}},"keywords":{}}],["cluster.instal",{"_index":6033,"title":{},"content":{"1133":{"position":[[88,15]]}},"keywords":{}}],["cluster.privaci",{"_index":5242,"title":{},"content":{"902":{"position":[[346,15]]}},"keywords":{}}],["clusterfil",{"_index":4567,"title":{},"content":{"772":{"position":[[861,12]]},"774":{"position":[[789,12]]},"1134":{"position":[[552,12]]}},"keywords":{}}],["co",{"_index":4717,"title":{"822":{"position":[[10,3]]}},"content":{},"keywords":{}}],["coal",{"_index":2585,"title":{},"content":{"409":{"position":[[139,5]]}},"keywords":{}}],["cockroach",{"_index":6580,"title":{},"content":{"1324":{"position":[[817,9]]}},"keywords":{}}],["code",{"_index":125,"title":{"209":{"position":[[7,5]]},"239":{"position":[[27,4]]},"739":{"position":[[0,4]]}},"content":{"8":{"position":[[718,5]]},"27":{"position":[[121,5]]},"29":{"position":[[417,4]]},"35":{"position":[[225,4]]},"38":{"position":[[805,4]]},"47":{"position":[[1330,4]]},"74":{"position":[[102,4]]},"84":{"position":[[205,5]]},"112":{"position":[[48,4]]},"114":{"position":[[218,5]]},"149":{"position":[[218,5]]},"174":{"position":[[2845,4]]},"175":{"position":[[211,5]]},"188":{"position":[[1641,5],[2429,4]]},"198":{"position":[[496,4]]},"207":{"position":[[302,4]]},"228":{"position":[[129,4],[478,4]]},"232":{"position":[[196,4]]},"239":{"position":[[53,4]]},"241":{"position":[[313,5]]},"254":{"position":[[542,5]]},"255":{"position":[[301,4]]},"281":{"position":[[443,4]]},"309":{"position":[[351,4]]},"323":{"position":[[430,4]]},"329":{"position":[[193,4]]},"335":{"position":[[932,4]]},"347":{"position":[[218,5]]},"362":{"position":[[1289,5]]},"369":{"position":[[1483,5]]},"373":{"position":[[313,5]]},"401":{"position":[[443,4]]},"403":{"position":[[283,4]]},"405":{"position":[[50,4]]},"411":{"position":[[1539,4]]},"412":{"position":[[9252,5]]},"425":{"position":[[31,4],[231,4]]},"430":{"position":[[385,4]]},"445":{"position":[[1472,4],[1598,4]]},"453":{"position":[[582,4]]},"454":{"position":[[70,4],[347,4],[652,4]]},"455":{"position":[[456,4]]},"498":{"position":[[342,4]]},"511":{"position":[[218,5]]},"515":{"position":[[199,5],[371,4]]},"522":{"position":[[237,4]]},"524":{"position":[[848,4]]},"531":{"position":[[218,5]]},"535":{"position":[[226,4],[1290,4]]},"563":{"position":[[1082,4]]},"567":{"position":[[476,5],[863,4]]},"591":{"position":[[218,5]]},"595":{"position":[[239,4],[1364,4]]},"610":{"position":[[1485,4]]},"674":{"position":[[260,5]]},"688":{"position":[[484,5]]},"698":{"position":[[1467,4],[1933,5]]},"702":{"position":[[790,4]]},"703":{"position":[[158,4]]},"711":{"position":[[1044,4]]},"714":{"position":[[319,5]]},"728":{"position":[[9,5],[251,5]]},"749":{"position":[[3,5],[91,5],[438,5],[565,5],[656,5],[809,5],[946,5],[1081,5],[1305,5],[1393,5],[1542,5],[1645,5],[1742,5],[1859,5],[1985,5],[2088,5],[2194,5],[2288,5],[2381,5],[2466,5],[2583,5],[2824,5],[2937,5],[3170,5],[3290,5],[3646,5],[3843,5],[3930,5],[4002,5],[4117,5],[4233,5],[4355,5],[4532,5],[4606,5],[4713,5],[4848,5],[4980,5],[5132,5],[5234,5],[5346,5],[5553,5],[5980,4],[6061,5],[6197,5],[6333,5],[6452,5],[6594,5],[6706,5],[6821,5],[6945,5],[7053,5],[7172,5],[7296,5],[7479,5],[7559,5],[7636,5],[7735,5],[7839,5],[7934,5],[8034,5],[8128,5],[8226,5],[8334,5],[8429,5],[8529,5],[8651,5],[8728,5],[8902,5],[9052,5],[9210,5],[9501,5],[9646,5],[9730,5],[9818,5],[9925,5],[10039,5],[10157,5],[10266,5],[10371,5],[10459,5],[10582,5],[10686,5],[10792,5],[10883,5],[10965,5],[11103,5],[11244,5],[11355,5],[11454,5],[11530,5],[11675,5],[11772,5],[11881,5],[12182,5],[12273,5],[12400,5],[12481,5],[12554,5],[12769,5],[12878,5],[12955,5],[13064,5],[13181,5],[13255,5],[13375,5],[13504,5],[13627,5],[13750,5],[13848,5],[13992,5],[14075,5],[14169,5],[14281,5],[14366,5],[14562,5],[14644,5],[14759,5],[14915,5],[15126,5],[15285,5],[15460,5],[15592,5],[15726,5],[15858,5],[15993,5],[16095,5],[16243,5],[16362,5],[16484,5],[16633,5],[16826,5],[16915,5],[17021,5],[17144,5],[17293,5],[17402,5],[17518,5],[17636,5],[17759,5],[17868,5],[17989,5],[18111,5],[18208,5],[18308,5],[18490,5],[18584,5],[18703,5],[18807,5],[18913,5],[19016,5],[19110,5],[19312,5],[19440,5],[19566,5],[19681,5],[19782,5],[19874,5],[19998,5],[20116,5],[20273,5],[20439,5],[20540,5],[20707,5],[20844,5],[21017,5],[21301,5],[21455,5],[21718,5],[22020,5],[22140,5],[22224,5],[22342,5],[22449,5],[22569,5],[22709,5],[22838,5],[22998,5],[23191,5],[23317,5],[23449,5],[23582,5],[23773,5],[23955,5],[24075,5],[24236,5],[24366,5]]},"765":{"position":[[85,5]]},"784":{"position":[[201,4]]},"785":{"position":[[349,4]]},"802":{"position":[[307,4]]},"806":{"position":[[338,4]]},"817":{"position":[[155,4]]},"836":{"position":[[552,4]]},"861":{"position":[[1084,4]]},"862":{"position":[[75,4]]},"876":{"position":[[555,4]]},"904":{"position":[[2501,5]]},"906":{"position":[[1136,4]]},"945":{"position":[[382,4]]},"990":{"position":[[1125,4]]},"995":{"position":[[1436,5]]},"1031":{"position":[[134,4]]},"1071":{"position":[[269,4]]},"1072":{"position":[[533,4],[844,5],[976,4],[1165,5],[1388,4]]},"1124":{"position":[[1311,5],[1392,4]]},"1198":{"position":[[811,4]]},"1251":{"position":[[104,4],[221,4]]},"1272":{"position":[[381,4]]},"1282":{"position":[[545,5]]},"1307":{"position":[[497,4]]}},"keywords":{}}],["code"",{"_index":2620,"title":{},"content":{"411":{"position":[[2476,10]]}},"keywords":{}}],["code.for",{"_index":4719,"title":{},"content":{"824":{"position":[[194,8]]}},"keywords":{}}],["codebas",{"_index":1043,"title":{},"content":{"107":{"position":[[128,9]]},"145":{"position":[[62,9]]},"177":{"position":[[187,9]]},"219":{"position":[[288,9]]},"239":{"position":[[256,8]]},"384":{"position":[[341,9]]},"445":{"position":[[2467,8]]},"446":{"position":[[1325,8]]},"636":{"position":[[426,9]]}},"keywords":{}}],["codesearch",{"_index":4133,"title":{},"content":{"749":{"position":[[56,10],[403,10],[530,10],[621,10],[774,10],[911,10],[1046,10],[1270,10],[1358,10],[1507,10],[1610,10],[1707,10],[1824,10],[1950,10],[2053,10],[2159,10],[2253,10],[2346,10],[2431,10],[2548,10],[2789,10],[2902,10],[3135,10],[3255,10],[3611,10],[3808,10],[3895,10],[3967,10],[4082,10],[4198,10],[4320,10],[4497,10],[4571,10],[4678,10],[4813,10],[4945,10],[5097,10],[5199,10],[5311,10],[5518,10],[6026,10],[6162,10],[6298,10],[6417,10],[6559,10],[6671,10],[6786,10],[6910,10],[7018,10],[7137,10],[7261,10],[7444,10],[7524,10],[7601,10],[7700,10],[7804,10],[7899,10],[7999,10],[8093,10],[8191,10],[8299,10],[8394,10],[8494,10],[8616,10],[8693,10],[8867,10],[9017,10],[9175,10],[9466,10],[9611,10],[9695,10],[9783,10],[9890,10],[10004,10],[10122,10],[10231,10],[10336,10],[10424,10],[10547,10],[10651,10],[10757,10],[10848,10],[10930,10],[11068,10],[11209,10],[11320,10],[11419,10],[11495,10],[11640,10],[11737,10],[11846,10],[12147,10],[12238,10],[12365,10],[12446,10],[12519,10],[12734,10],[12843,10],[12920,10],[13029,10],[13146,10],[13220,10],[13340,10],[13469,10],[13592,10],[13715,10],[13813,10],[13957,10],[14040,10],[14134,10],[14246,10],[14331,10],[14527,10],[14609,10],[14724,10],[14880,10],[15091,10],[15250,10],[15425,10],[15557,10],[15691,10],[15823,10],[15958,10],[16060,10],[16208,10],[16327,10],[16449,10],[16598,10],[16791,10],[16880,10],[16986,10],[17109,10],[17258,10],[17367,10],[17483,10],[17601,10],[17724,10],[17833,10],[17954,10],[18076,10],[18173,10],[18273,10],[18455,10],[18549,10],[18668,10],[18772,10],[18878,10],[18981,10],[19075,10],[19277,10],[19405,10],[19531,10],[19646,10],[19747,10],[19839,10],[19963,10],[20081,10],[20238,10],[20404,10],[20505,10],[20672,10],[20809,10],[20982,10],[21266,10],[21420,10],[21683,10],[21985,10],[22105,10],[22189,10],[22307,10],[22414,10],[22534,10],[22674,10],[22803,10],[22963,10],[23156,10],[23282,10],[23414,10],[23547,10],[23738,10],[23920,10],[24040,10],[24201,10],[24331,10],[24411,10]]}},"keywords":{}}],["code—rxdb",{"_index":2084,"title":{},"content":{"361":{"position":[[1029,9]]}},"keywords":{}}],["cohes",{"_index":3256,"title":{},"content":{"517":{"position":[[359,8]]}},"keywords":{}}],["col",{"_index":5969,"title":{},"content":{"1108":{"position":[[464,4]]}},"keywords":{}}],["col1",{"_index":4219,"title":{},"content":{"749":{"position":[[6712,4]]}},"keywords":{}}],["col10",{"_index":4238,"title":{},"content":{"749":{"position":[[7741,5]]}},"keywords":{}}],["col11",{"_index":4240,"title":{},"content":{"749":{"position":[[7845,5]]}},"keywords":{}}],["col12",{"_index":4241,"title":{},"content":{"749":{"position":[[7940,5]]}},"keywords":{}}],["col13",{"_index":4242,"title":{},"content":{"749":{"position":[[8040,5]]}},"keywords":{}}],["col14",{"_index":4243,"title":{},"content":{"749":{"position":[[8134,5]]}},"keywords":{}}],["col15",{"_index":4244,"title":{},"content":{"749":{"position":[[8232,5]]}},"keywords":{}}],["col16",{"_index":4245,"title":{},"content":{"749":{"position":[[8340,5]]}},"keywords":{}}],["col17",{"_index":4246,"title":{},"content":{"749":{"position":[[8435,5]]}},"keywords":{}}],["col18",{"_index":4248,"title":{},"content":{"749":{"position":[[8535,5]]}},"keywords":{}}],["col2",{"_index":4221,"title":{},"content":{"749":{"position":[[6827,4]]}},"keywords":{}}],["col20",{"_index":4249,"title":{},"content":{"749":{"position":[[8657,5]]}},"keywords":{}}],["col21",{"_index":4250,"title":{},"content":{"749":{"position":[[8734,5]]}},"keywords":{}}],["col22",{"_index":4251,"title":{},"content":{"749":{"position":[[9058,5]]}},"keywords":{}}],["col23",{"_index":4254,"title":{},"content":{"749":{"position":[[9216,5]]}},"keywords":{}}],["col3",{"_index":4224,"title":{},"content":{"749":{"position":[[6951,4]]}},"keywords":{}}],["col4",{"_index":4226,"title":{},"content":{"749":{"position":[[7059,4]]}},"keywords":{}}],["col5",{"_index":4228,"title":{},"content":{"749":{"position":[[7178,4]]}},"keywords":{}}],["col6",{"_index":4231,"title":{},"content":{"749":{"position":[[7302,4]]}},"keywords":{}}],["col7",{"_index":4234,"title":{},"content":{"749":{"position":[[7485,4]]}},"keywords":{}}],["col8",{"_index":4235,"title":{},"content":{"749":{"position":[[7565,4]]}},"keywords":{}}],["col9",{"_index":4236,"title":{},"content":{"749":{"position":[[7642,4]]}},"keywords":{}}],["collabor",{"_index":565,"title":{},"content":{"35":{"position":[[647,13]]},"38":{"position":[[67,14]]},"39":{"position":[[511,14]]},"40":{"position":[[96,13]]},"89":{"position":[[263,13]]},"109":{"position":[[227,13]]},"136":{"position":[[302,13]]},"148":{"position":[[337,13]]},"151":{"position":[[318,13]]},"158":{"position":[[255,13]]},"168":{"position":[[313,13]]},"174":{"position":[[1951,13]]},"212":{"position":[[526,14]]},"267":{"position":[[475,13],[599,13],[751,13],[1495,13]]},"289":{"position":[[949,13],[1958,13]]},"375":{"position":[[612,13]]},"388":{"position":[[459,13]]},"407":{"position":[[948,13],[1046,11]]},"411":{"position":[[5120,14]]},"412":{"position":[[3774,14],[6494,13]]},"418":{"position":[[783,13]]},"445":{"position":[[942,13],[1178,13]]},"446":{"position":[[437,14],[488,14],[534,13]]},"491":{"position":[[1812,13]]},"496":{"position":[[385,13]]},"501":{"position":[[317,12]]},"613":{"position":[[483,13]]},"860":{"position":[[657,13]]}},"keywords":{}}],["collaboration.memori",{"_index":1184,"title":{},"content":{"162":{"position":[[512,20]]}},"keywords":{}}],["collect",{"_index":224,"title":{"51":{"position":[[22,12]]},"259":{"position":[[7,13]]},"538":{"position":[[22,12]]},"598":{"position":[[22,12]]},"655":{"position":[[36,11]]},"789":{"position":[[17,11]]},"791":{"position":[[26,11]]},"934":{"position":[[11,11]]},"939":{"position":[[6,10]]},"979":{"position":[[0,13]]},"1007":{"position":[[10,11]]},"1075":{"position":[[9,10]]}},"content":{"14":{"position":[[780,12]]},"16":{"position":[[218,11]]},"18":{"position":[[20,10]]},"22":{"position":[[86,10]]},"47":{"position":[[814,10]]},"51":{"position":[[811,11]]},"130":{"position":[[484,10]]},"140":{"position":[[90,10]]},"168":{"position":[[175,11]]},"188":{"position":[[2731,10],[2755,10]]},"209":{"position":[[646,11]]},"210":{"position":[[288,11]]},"211":{"position":[[296,10]]},"255":{"position":[[997,11]]},"261":{"position":[[361,11]]},"334":{"position":[[66,11]]},"335":{"position":[[867,10]]},"344":{"position":[[72,10]]},"379":{"position":[[96,11]]},"392":{"position":[[443,10],[888,10],[1147,10],[2071,11],[2599,11]]},"412":{"position":[[1096,12]]},"480":{"position":[[64,11],[455,11],[947,10]]},"481":{"position":[[666,11]]},"482":{"position":[[743,10]]},"493":{"position":[[413,10]]},"494":{"position":[[575,10]]},"523":{"position":[[314,11],[333,10]]},"538":{"position":[[834,11]]},"541":{"position":[[237,10],[509,14]]},"542":{"position":[[765,10]]},"554":{"position":[[1236,10]]},"562":{"position":[[1108,10],[1423,14]]},"563":{"position":[[675,10]]},"567":{"position":[[671,12]]},"575":{"position":[[706,10]]},"598":{"position":[[841,11]]},"632":{"position":[[1440,11],[2234,11]]},"639":{"position":[[274,10]]},"643":{"position":[[75,11]]},"654":{"position":[[36,10]]},"655":{"position":[[17,10],[205,10]]},"656":{"position":[[293,10]]},"662":{"position":[[2272,11],[2294,11],[2312,11]]},"680":{"position":[[1122,10]]},"698":{"position":[[1484,10]]},"710":{"position":[[1783,11],[1801,11]]},"723":{"position":[[465,12],[1519,11]]},"724":{"position":[[384,10],[676,10],[729,11]]},"739":{"position":[[102,11]]},"745":{"position":[[606,11]]},"749":{"position":[[101,10],[4887,10],[5019,10],[5273,10],[5415,10],[6502,10],[8541,10],[9272,11],[10194,10],[13285,11],[15197,11],[19497,10],[22251,11],[24272,10]]},"751":{"position":[[20,11],[1909,10]]},"752":{"position":[[58,10]]},"753":{"position":[[91,10],[141,11]]},"754":{"position":[[367,10]]},"755":{"position":[[129,11]]},"759":{"position":[[817,11],[1020,11],[1157,11],[1307,11],[1468,11],[1510,11]]},"770":{"position":[[125,11],[663,11]]},"772":{"position":[[913,10]]},"788":{"position":[[21,10],[62,11]]},"789":{"position":[[69,11],[379,11]]},"790":{"position":[[30,10],[92,11]]},"792":{"position":[[32,10],[115,11]]},"798":{"position":[[367,10]]},"806":{"position":[[564,10]]},"808":{"position":[[50,10],[289,10]]},"818":{"position":[[474,10]]},"829":{"position":[[1880,12],[1953,10],[2014,10],[2217,10],[2382,11],[3298,11]]},"838":{"position":[[2508,11],[2526,11]]},"845":{"position":[[129,11]]},"846":{"position":[[211,11]]},"848":{"position":[[728,11],[1363,11]]},"852":{"position":[[246,11]]},"854":{"position":[[157,10],[455,10],[693,11],[774,11],[1549,11]]},"858":{"position":[[51,11],[204,11],[285,11]]},"861":{"position":[[953,11],[1046,11],[1248,11],[1864,10],[1990,11],[2228,11],[2296,10],[2347,10]]},"862":{"position":[[510,11],[872,10],[1369,11]]},"863":{"position":[[788,11]]},"866":{"position":[[180,10],[448,11],[520,10]]},"872":{"position":[[743,11],[816,11],[1067,12],[1291,10],[1368,11],[1417,11],[1796,10],[2108,10],[2224,10],[2251,11],[2424,12],[2509,11],[2942,10],[3415,11],[3678,10],[4520,11]]},"875":{"position":[[448,11]]},"878":{"position":[[121,10],[303,11],[449,10]]},"886":{"position":[[1030,11],[2662,11],[3849,11]]},"887":{"position":[[315,11]]},"888":{"position":[[456,11]]},"889":{"position":[[505,11]]},"890":{"position":[[805,11]]},"893":{"position":[[49,10],[308,10],[354,10],[374,11]]},"898":{"position":[[1569,11],[1623,10],[3158,10],[3381,11]]},"904":{"position":[[364,11],[1498,11],[1868,10],[1879,11],[2291,10]]},"932":{"position":[[1388,11]]},"934":{"position":[[23,11],[110,10],[129,10],[361,10],[846,11]]},"935":{"position":[[34,10],[78,10],[120,11],[183,10]]},"936":{"position":[[45,10]]},"937":{"position":[[146,11]]},"939":{"position":[[20,10],[59,10],[119,10],[136,11]]},"941":{"position":[[88,11]]},"942":{"position":[[57,10]]},"943":{"position":[[75,10]]},"946":{"position":[[54,11]]},"949":{"position":[[27,11]]},"950":{"position":[[173,11]]},"952":{"position":[[70,11]]},"953":{"position":[[35,11]]},"954":{"position":[[31,10],[169,10]]},"955":{"position":[[153,11],[191,10],[256,10]]},"956":{"position":[[56,10],[182,10]]},"958":{"position":[[43,11],[116,11],[500,12]]},"963":{"position":[[54,11]]},"971":{"position":[[77,10]]},"988":{"position":[[272,11]]},"999":{"position":[[249,10]]},"1002":{"position":[[293,10],[563,11],[1217,11]]},"1004":{"position":[[153,10]]},"1007":{"position":[[32,10],[1401,11]]},"1013":{"position":[[99,10],[602,10]]},"1014":{"position":[[46,11]]},"1015":{"position":[[46,10]]},"1020":{"position":[[313,10],[556,11]]},"1022":{"position":[[416,11]]},"1024":{"position":[[52,10]]},"1032":{"position":[[133,10],[237,10]]},"1033":{"position":[[70,10],[319,12]]},"1035":{"position":[[29,11]]},"1036":{"position":[[24,11]]},"1047":{"position":[[36,11]]},"1055":{"position":[[46,10]]},"1062":{"position":[[239,10]]},"1072":{"position":[[596,11],[1204,10],[1291,10],[1544,10]]},"1074":{"position":[[41,10]]},"1076":{"position":[[141,10]]},"1077":{"position":[[108,11]]},"1079":{"position":[[78,11]]},"1081":{"position":[[27,11]]},"1085":{"position":[[755,10],[841,10],[2713,10],[2765,11],[2867,10],[2933,10],[3101,11]]},"1100":{"position":[[167,11],[597,11],[703,11]]},"1101":{"position":[[326,10],[414,11],[515,11],[676,11]]},"1102":{"position":[[388,11]]},"1103":{"position":[[358,11]]},"1105":{"position":[[784,11]]},"1106":{"position":[[722,11]]},"1108":{"position":[[452,11]]},"1121":{"position":[[247,10],[621,11]]},"1125":{"position":[[818,11]]},"1149":{"position":[[534,10],[991,11],[1246,10],[1373,11]]},"1150":{"position":[[323,11]]},"1158":{"position":[[279,11]]},"1165":{"position":[[867,11]]},"1175":{"position":[[616,10]]},"1194":{"position":[[174,12]]},"1222":{"position":[[994,10],[1053,12],[1090,10],[1283,12]]},"1246":{"position":[[1759,10],[1924,12]]},"1253":{"position":[[130,12]]},"1309":{"position":[[1331,10]]},"1311":{"position":[[86,11],[1199,10],[1349,11],[1711,10]]},"1321":{"position":[[607,11],[853,11],[1107,10]]},"1322":{"position":[[262,10],[331,10]]}},"keywords":{}}],["collection'",{"_index":3320,"title":{},"content":{"541":{"position":[[773,12]]},"601":{"position":[[754,12]]},"955":{"position":[[13,12]]},"1035":{"position":[[62,12]]},"1036":{"position":[[57,12]]},"1321":{"position":[[706,12]]}},"keywords":{}}],["collection(firestoredatabas",{"_index":4871,"title":{},"content":{"854":{"position":[[421,29]]}},"keywords":{}}],["collection.find",{"_index":3308,"title":{},"content":{"541":{"position":[[360,18]]},"542":{"position":[[796,21]]},"562":{"position":[[1201,18]]},"563":{"position":[[720,21]]},"826":{"position":[[809,21]]}},"keywords":{}}],["collection.find().$.subscribe(result",{"_index":6086,"title":{},"content":{"1150":{"position":[[422,37]]}},"keywords":{}}],["collection.find().where('affiliation').equals('jedi",{"_index":3267,"title":{},"content":{"523":{"position":[[391,54]]}},"keywords":{}}],["collection.findon",{"_index":4740,"title":{},"content":{"826":{"position":[[907,24]]}},"keywords":{}}],["collection.html?console=limit#faq",{"_index":4255,"title":{},"content":{"749":{"position":[[9422,33]]}},"keywords":{}}],["collection.insert",{"_index":1279,"title":{},"content":{"188":{"position":[[2851,19]]}},"keywords":{}}],["collection.options.foo",{"_index":4673,"title":{},"content":{"806":{"position":[[765,25]]}},"keywords":{}}],["collection2",{"_index":5322,"title":{},"content":{"939":{"position":[[215,11],[275,13]]}},"keywords":{}}],["collectionid",{"_index":4908,"title":{},"content":{"862":{"position":[[1253,13]]}},"keywords":{}}],["collectionnam",{"_index":3739,"title":{},"content":{"649":{"position":[[345,15]]},"872":{"position":[[2404,15]]},"934":{"position":[[268,14]]},"1309":{"position":[[1431,14]]}},"keywords":{}}],["collections.humans.find",{"_index":3818,"title":{},"content":{"662":{"position":[[2684,25],[2772,25]]},"710":{"position":[[1991,25],[2079,25]]},"838":{"position":[[2898,25],[2986,25]]}},"keywords":{}}],["collections.humans.insert({id",{"_index":3817,"title":{},"content":{"662":{"position":[[2595,30]]},"710":{"position":[[1902,30]]},"838":{"position":[[2809,30]]}},"keywords":{}}],["collections/sync",{"_index":4723,"title":{},"content":{"825":{"position":[[476,16]]}},"keywords":{}}],["collectionsofflin",{"_index":4932,"title":{},"content":{"870":{"position":[[46,18]]},"896":{"position":[[161,18]]}},"keywords":{}}],["collis",{"_index":3460,"title":{},"content":{"569":{"position":[[692,9]]},"635":{"position":[[159,10]]},"1085":{"position":[[1879,10],[2079,10]]}},"keywords":{}}],["color",{"_index":1258,"title":{},"content":{"188":{"position":[[1362,6],[1450,8]]},"1074":{"position":[[265,5]]},"1314":{"position":[[438,6],[469,6]]}},"keywords":{}}],["colorcontroller.text",{"_index":1286,"title":{},"content":{"188":{"position":[[2985,20]]}},"keywords":{}}],["column",{"_index":1990,"title":{"356":{"position":[[5,7]]}},"content":{"351":{"position":[[38,6]]},"356":{"position":[[125,8],[221,7],[777,8]]},"357":{"position":[[57,8]]},"362":{"position":[[363,8],[498,7]]},"457":{"position":[[296,6]]},"898":{"position":[[1709,6],[3926,6],[4263,8]]},"1253":{"position":[[105,8]]}},"keywords":{}}],["combin",{"_index":637,"title":{},"content":{"40":{"position":[[354,7]]},"61":{"position":[[276,9]]},"118":{"position":[[94,8]]},"179":{"position":[[269,8]]},"260":{"position":[[171,7]]},"266":{"position":[[260,8]]},"269":{"position":[[34,7]]},"444":{"position":[[781,7]]},"469":{"position":[[964,11]]},"491":{"position":[[782,9]]},"496":{"position":[[305,9]]},"498":{"position":[[459,9]]},"500":{"position":[[68,9]]},"513":{"position":[[171,8]]},"520":{"position":[[94,11]]},"567":{"position":[[800,7]]},"575":{"position":[[67,9]]},"630":{"position":[[830,7]]},"749":{"position":[[5665,11]]},"837":{"position":[[1474,8]]},"860":{"position":[[277,9],[1118,8]]},"967":{"position":[[90,12]]},"1072":{"position":[[1397,7]]},"1100":{"position":[[541,11]]},"1237":{"position":[[116,11]]},"1238":{"position":[[23,11]]},"1296":{"position":[[1489,7]]}},"keywords":{}}],["come",{"_index":389,"title":{"781":{"position":[[9,5]]},"1022":{"position":[[28,5]]}},"content":{"23":{"position":[[338,5]]},"46":{"position":[[283,5]]},"157":{"position":[[382,4]]},"186":{"position":[[78,4]]},"228":{"position":[[37,4]]},"278":{"position":[[9,5]]},"290":{"position":[[9,5]]},"369":{"position":[[76,5]]},"391":{"position":[[167,5]]},"398":{"position":[[182,5]]},"408":{"position":[[2016,5],[3153,5],[4081,4]]},"427":{"position":[[44,4]]},"464":{"position":[[910,5]]},"535":{"position":[[52,5]]},"571":{"position":[[343,4]]},"595":{"position":[[52,5]]},"659":{"position":[[11,5]]},"661":{"position":[[377,5]]},"689":{"position":[[71,4]]},"709":{"position":[[353,4]]},"710":{"position":[[83,4]]},"714":{"position":[[455,5]]},"836":{"position":[[1251,5]]},"904":{"position":[[1756,5]]},"911":{"position":[[348,4]]},"984":{"position":[[50,5]]},"1097":{"position":[[447,5]]},"1107":{"position":[[928,4]]},"1157":{"position":[[63,4]]},"1159":{"position":[[127,5]]},"1188":{"position":[[216,4]]},"1210":{"position":[[152,5]]},"1214":{"position":[[574,5]]},"1270":{"position":[[358,5]]},"1271":{"position":[[91,5]]},"1275":{"position":[[90,5]]},"1316":{"position":[[1641,5],[2791,5]]},"1318":{"position":[[233,5]]}},"keywords":{}}],["comfort",{"_index":1666,"title":{},"content":{"286":{"position":[[345,7]]},"352":{"position":[[284,11]]}},"keywords":{}}],["command",{"_index":1084,"title":{},"content":{"128":{"position":[[157,8]]},"254":{"position":[[188,7]]},"872":{"position":[[536,8]]}},"keywords":{}}],["comment",{"_index":4496,"title":{},"content":{"759":{"position":[[1188,11]]},"1266":{"position":[[1032,9]]}},"keywords":{}}],["commerc",{"_index":3193,"title":{},"content":{"496":{"position":[[513,8]]}},"keywords":{}}],["commerci",{"_index":599,"title":{},"content":{"38":{"position":[[943,10]]},"43":{"position":[[642,10]]}},"keywords":{}}],["commit",{"_index":441,"title":{"1298":{"position":[[21,8]]}},"content":{"27":{"position":[[318,6]]},"32":{"position":[[274,6]]},"668":{"position":[[84,9],[170,6]]},"731":{"position":[[270,7]]},"1297":{"position":[[263,9]]},"1298":{"position":[[15,10],[135,6],[175,8],[219,9]]}},"keywords":{}}],["commithash",{"_index":4080,"title":{},"content":{"731":{"position":[[225,10]]}},"keywords":{}}],["common",{"_index":1112,"title":{},"content":{"132":{"position":[[67,6]]},"282":{"position":[[22,6]]},"376":{"position":[[199,6]]},"411":{"position":[[4463,6]]},"412":{"position":[[991,6]]},"419":{"position":[[66,6]]},"420":{"position":[[472,6]]},"458":{"position":[[1279,6]]},"460":{"position":[[437,6]]},"555":{"position":[[876,6]]},"624":{"position":[[1359,6]]},"640":{"position":[[99,6]]},"697":{"position":[[361,6]]},"708":{"position":[[98,6]]},"709":{"position":[[25,6],[95,6]]},"785":{"position":[[250,6]]},"875":{"position":[[1704,6],[7084,6]]},"966":{"position":[[167,6]]},"995":{"position":[[531,6]]},"1072":{"position":[[2108,6]]},"1092":{"position":[[10,6]]},"1271":{"position":[[1027,6]]},"1320":{"position":[[180,6]]}},"keywords":{}}],["commonli",{"_index":6336,"title":{},"content":{"1272":{"position":[[304,8]]}},"keywords":{}}],["commonmodul",{"_index":4724,"title":{},"content":{"825":{"position":[[602,12],[752,15]]}},"keywords":{}}],["commonplac",{"_index":2854,"title":{},"content":{"421":{"position":[[739,11]]}},"keywords":{}}],["commun",{"_index":996,"title":{},"content":{"84":{"position":[[230,9]]},"114":{"position":[[243,9]]},"149":{"position":[[243,9]]},"175":{"position":[[236,9]]},"188":{"position":[[203,12],[554,11],[1523,11]]},"204":{"position":[[205,12]]},"210":{"position":[[668,12]]},"241":{"position":[[333,9]]},"263":{"position":[[434,10]]},"288":{"position":[[268,13]]},"289":{"position":[[1713,11]]},"303":{"position":[[1087,14]]},"306":{"position":[[269,9]]},"318":{"position":[[527,9]]},"320":{"position":[[145,9]]},"347":{"position":[[243,9]]},"362":{"position":[[1314,9]]},"373":{"position":[[333,9]]},"381":{"position":[[257,9]]},"386":{"position":[[274,9]]},"387":{"position":[[226,9]]},"419":{"position":[[1367,9]]},"460":{"position":[[622,12]]},"491":{"position":[[1536,13]]},"511":{"position":[[243,9]]},"531":{"position":[[243,9]]},"535":{"position":[[870,14]]},"548":{"position":[[376,14]]},"556":{"position":[[1544,14],[1587,13]]},"567":{"position":[[506,9]]},"591":{"position":[[243,9]]},"595":{"position":[[945,14]]},"608":{"position":[[374,14]]},"610":{"position":[[163,14],[777,13]]},"611":{"position":[[34,13]]},"612":{"position":[[158,13],[1028,14]]},"613":{"position":[[72,13]]},"614":{"position":[[23,14],[104,13],[636,13]]},"617":{"position":[[1097,13]]},"621":{"position":[[62,13],[256,13]]},"624":{"position":[[35,13],[687,14]]},"644":{"position":[[289,9]]},"693":{"position":[[575,12]]},"711":{"position":[[340,11]]},"749":{"position":[[23599,11]]},"824":{"position":[[369,9]]},"835":{"position":[[671,9],[715,9]]},"839":{"position":[[1144,9]]},"899":{"position":[[388,10]]},"901":{"position":[[33,14]]},"906":{"position":[[573,14]]},"913":{"position":[[249,9]]},"1088":{"position":[[451,11]]},"1133":{"position":[[54,11]]},"1149":{"position":[[451,12]]},"1151":{"position":[[36,10]]},"1178":{"position":[[36,10]]},"1218":{"position":[[20,12]]},"1246":{"position":[[725,11]]},"1301":{"position":[[1170,11]]},"1304":{"position":[[747,11]]}},"keywords":{}}],["communication.long",{"_index":3669,"title":{},"content":{"622":{"position":[[387,18]]}},"keywords":{}}],["community/sqlit",{"_index":3786,"title":{},"content":{"661":{"position":[[280,16],[443,16],[563,16],[1067,18]]},"662":{"position":[[955,16],[1301,17],[1741,18]]},"1279":{"position":[[563,18]]}},"keywords":{}}],["communityhav",{"_index":3147,"title":{},"content":{"483":{"position":[[880,13]]}},"keywords":{}}],["compani",{"_index":351,"title":{"627":{"position":[[0,7]]}},"content":{"20":{"position":[[123,7]]},"38":{"position":[[971,9]]},"411":{"position":[[5623,9]]},"412":{"position":[[1435,7]]},"627":{"position":[[36,7]]}},"keywords":{}}],["companion",{"_index":3290,"title":{},"content":{"530":{"position":[[633,9]]}},"keywords":{}}],["compar",{"_index":86,"title":{"74":{"position":[[36,8]]},"105":{"position":[[36,8]]},"232":{"position":[[26,8]]},"278":{"position":[[55,8]]},"393":{"position":[[0,9]]},"902":{"position":[[33,8]]}},"content":{"6":{"position":[[107,8]]},"13":{"position":[[244,8]]},"16":{"position":[[355,8]]},"25":{"position":[[163,8]]},"33":{"position":[[292,8]]},"37":{"position":[[289,8]]},"39":{"position":[[594,8]]},"40":{"position":[[603,8]]},"47":{"position":[[182,8]]},"66":{"position":[[151,8]]},"89":{"position":[[119,8]]},"131":{"position":[[586,8]]},"161":{"position":[[279,8]]},"173":{"position":[[270,8],[454,8]]},"174":{"position":[[723,8]]},"212":{"position":[[126,8]]},"224":{"position":[[47,8]]},"232":{"position":[[261,8]]},"265":{"position":[[243,8]]},"281":{"position":[[339,8]]},"282":{"position":[[478,8]]},"295":{"position":[[107,8]]},"299":{"position":[[1587,9]]},"364":{"position":[[636,8]]},"390":{"position":[[769,8]]},"393":{"position":[[77,7],[490,7],[719,7]]},"394":{"position":[[1506,7]]},"400":{"position":[[195,8],[729,8]]},"402":{"position":[[654,7],[1366,8],[2600,7]]},"404":{"position":[[387,8]]},"408":{"position":[[4006,8]]},"411":{"position":[[965,8]]},"413":{"position":[[73,7]]},"429":{"position":[[102,8]]},"432":{"position":[[1294,7]]},"434":{"position":[[202,8]]},"450":{"position":[[524,8]]},"454":{"position":[[414,8],[594,7]]},"456":{"position":[[56,7]]},"458":{"position":[[42,8]]},"462":{"position":[[308,7],[990,7]]},"464":{"position":[[585,8]]},"466":{"position":[[427,8]]},"467":{"position":[[345,8]]},"468":{"position":[[383,7]]},"524":{"position":[[1032,8]]},"576":{"position":[[1,8]]},"581":{"position":[[553,8]]},"620":{"position":[[1,9],[463,11],[744,7]]},"623":{"position":[[756,8]]},"662":{"position":[[806,8]]},"688":{"position":[[601,7]]},"698":{"position":[[595,9]]},"703":{"position":[[1041,8],[1107,7]]},"717":{"position":[[315,8]]},"800":{"position":[[284,8]]},"875":{"position":[[2265,7],[4912,7]]},"885":{"position":[[2231,7]]},"901":{"position":[[538,9]]},"947":{"position":[[73,8]]},"990":{"position":[[509,7]]},"1067":{"position":[[187,8],[842,7],[1017,8]]},"1071":{"position":[[191,8]]},"1089":{"position":[[201,8]]},"1099":{"position":[[131,8]]},"1109":{"position":[[112,9]]},"1118":{"position":[[124,8]]},"1120":{"position":[[60,8],[718,10]]},"1128":{"position":[[14,8]]},"1132":{"position":[[60,7]]},"1137":{"position":[[58,8]]},"1143":{"position":[[409,8]]},"1194":{"position":[[113,7],[1082,8]]},"1206":{"position":[[486,8]]},"1209":{"position":[[105,8],[449,8]]},"1213":{"position":[[203,8]]},"1270":{"position":[[36,8]]},"1276":{"position":[[212,8]]},"1308":{"position":[[388,9],[509,7]]}},"keywords":{}}],["comparison",{"_index":689,"title":{"60":{"position":[[12,10]]},"456":{"position":[[8,11]]},"462":{"position":[[12,11]]},"547":{"position":[[12,10]]},"607":{"position":[[12,10]]},"620":{"position":[[12,11]]},"1137":{"position":[[22,11]]},"1152":{"position":[[12,10]]},"1191":{"position":[[22,11]]},"1193":{"position":[[12,11]]},"1195":{"position":[[35,11]]},"1196":{"position":[[39,11]]},"1270":{"position":[[12,10]]},"1292":{"position":[[12,10]]}},"content":{"43":{"position":[[754,10]]},"394":{"position":[[78,10],[996,12]]},"420":{"position":[[269,11]]},"442":{"position":[[128,10]]},"462":{"position":[[90,12]]},"469":{"position":[[1309,10]]},"495":{"position":[[900,12]]},"620":{"position":[[279,10]]},"694":{"position":[[1,10]]},"698":{"position":[[687,10]]},"703":{"position":[[962,10]]},"772":{"position":[[2534,10]]},"838":{"position":[[3158,11]]},"875":{"position":[[5014,11]]},"1137":{"position":[[26,10],[250,10],[272,10]]},"1193":{"position":[[65,12]]},"1209":{"position":[[307,10]]},"1276":{"position":[[378,11]]}},"keywords":{}}],["comparisons.hierarch",{"_index":2337,"title":{},"content":{"396":{"position":[[311,24]]}},"keywords":{}}],["comparisonspeed",{"_index":6478,"title":{},"content":{"1302":{"position":[[24,18]]}},"keywords":{}}],["compat",{"_index":394,"title":{"82":{"position":[[26,13]]},"113":{"position":[[26,13]]},"238":{"position":[[34,10]]},"384":{"position":[[15,14]]},"830":{"position":[[13,14]]},"885":{"position":[[11,10]]}},"content":{"24":{"position":[[44,10],[314,10],[358,14],[779,10]]},"57":{"position":[[255,13]]},"76":{"position":[[137,13]]},"82":{"position":[[42,13]]},"110":{"position":[[185,13]]},"113":{"position":[[79,10],[125,13]]},"173":{"position":[[2342,13]]},"174":{"position":[[2594,14],[2796,13],[2920,14],[2995,10]]},"188":{"position":[[442,10]]},"238":{"position":[[70,10]]},"286":{"position":[[73,13],[301,13]]},"364":{"position":[[203,14],[333,13]]},"371":{"position":[[172,13]]},"381":{"position":[[212,10]]},"391":{"position":[[1030,10]]},"438":{"position":[[351,10]]},"445":{"position":[[1807,13]]},"495":{"position":[[515,14]]},"581":{"position":[[737,14]]},"624":{"position":[[991,13]]},"749":{"position":[[159,10]]},"756":{"position":[[429,10]]},"838":{"position":[[771,10]]},"841":{"position":[[744,10]]},"863":{"position":[[864,13]]},"865":{"position":[[150,10]]},"879":{"position":[[251,10]]},"911":{"position":[[226,10]]},"981":{"position":[[518,10],[676,10]]},"983":{"position":[[155,10]]},"1133":{"position":[[216,10]]},"1134":{"position":[[294,10]]},"1177":{"position":[[129,10]]},"1204":{"position":[[130,10]]},"1304":{"position":[[1884,10]]},"1320":{"position":[[71,10],[129,10]]}},"keywords":{}}],["compel",{"_index":999,"title":{},"content":{"86":{"position":[[11,10]]},"174":{"position":[[143,10]]},"175":{"position":[[647,10]]},"186":{"position":[[346,10]]},"215":{"position":[[5,10]]},"278":{"position":[[110,10]]},"366":{"position":[[399,10]]},"412":{"position":[[15195,10]]},"530":{"position":[[158,10]]}},"keywords":{}}],["compet",{"_index":686,"title":{},"content":{"43":{"position":[[662,8]]},"571":{"position":[[1395,9]]}},"keywords":{}}],["compil",{"_index":491,"title":{},"content":{"30":{"position":[[215,9]]},"188":{"position":[[35,8]]},"357":{"position":[[313,8]]},"408":{"position":[[3518,7]]},"454":{"position":[[241,7],[506,8],[638,8]]},"524":{"position":[[712,8],[797,8]]},"581":{"position":[[454,8]]},"1251":{"position":[[334,7]]},"1276":{"position":[[646,8]]}},"keywords":{}}],["complet",{"_index":641,"title":{"201":{"position":[[3,8]]}},"content":{"40":{"position":[[722,8]]},"201":{"position":[[238,10]]},"209":{"position":[[552,9]]},"263":{"position":[[324,8]]},"417":{"position":[[27,8]]},"475":{"position":[[167,10]]},"752":{"position":[[1031,9]]},"840":{"position":[[255,8]]},"1191":{"position":[[456,10]]},"1304":{"position":[[903,8]]}},"keywords":{}}],["complex",{"_index":322,"title":{"416":{"position":[[0,10]]},"426":{"position":[[8,7]]},"457":{"position":[[8,7]]}},"content":{"19":{"position":[[227,7],[339,7]]},"33":{"position":[[336,7]]},"34":{"position":[[721,7]]},"35":{"position":[[664,7]]},"45":{"position":[[285,7]]},"47":{"position":[[450,7]]},"61":{"position":[[454,13]]},"64":{"position":[[141,7]]},"66":{"position":[[365,7]]},"89":{"position":[[131,7]]},"126":{"position":[[335,7]]},"173":{"position":[[466,7]]},"178":{"position":[[187,7]]},"212":{"position":[[202,7],[296,7]]},"217":{"position":[[359,7]]},"219":{"position":[[306,11]]},"223":{"position":[[110,7],[346,10],[396,7]]},"250":{"position":[[145,7]]},"252":{"position":[[195,7]]},"262":{"position":[[376,7]]},"267":{"position":[[1009,7]]},"279":{"position":[[291,10]]},"282":{"position":[[426,7]]},"289":{"position":[[433,13]]},"303":{"position":[[1350,11]]},"317":{"position":[[125,7]]},"321":{"position":[[241,7],[432,7]]},"323":{"position":[[435,10]]},"331":{"position":[[312,12]]},"352":{"position":[[181,7]]},"353":{"position":[[61,7]]},"354":{"position":[[197,7],[609,7],[1480,7]]},"360":{"position":[[137,7],[241,7]]},"364":{"position":[[522,7]]},"369":{"position":[[378,7]]},"372":{"position":[[285,7]]},"395":{"position":[[513,7]]},"401":{"position":[[845,10]]},"408":{"position":[[404,7]]},"410":{"position":[[1790,8]]},"411":{"position":[[1964,7]]},"412":{"position":[[3931,7],[4135,10],[8911,7],[8998,7],[9640,11],[13103,11],[13422,7],[13578,7],[13911,7],[14120,7]]},"416":{"position":[[26,10]]},"427":{"position":[[557,7],[1080,7]]},"430":{"position":[[336,7]]},"432":{"position":[[159,7],[637,7],[1124,7]]},"433":{"position":[[309,8]]},"441":{"position":[[220,10],[337,7]]},"446":{"position":[[904,7]]},"451":{"position":[[428,7]]},"452":{"position":[[274,7]]},"453":{"position":[[653,8]]},"457":{"position":[[72,7],[608,7]]},"475":{"position":[[252,7]]},"497":{"position":[[283,7],[428,7],[682,7]]},"515":{"position":[[175,7]]},"521":{"position":[[216,7],[442,13]]},"533":{"position":[[173,7],[313,7]]},"535":{"position":[[466,7]]},"536":{"position":[[71,12]]},"548":{"position":[[298,12]]},"566":{"position":[[262,7]]},"574":{"position":[[559,7],[774,7]]},"593":{"position":[[173,7],[313,7]]},"595":{"position":[[494,7]]},"596":{"position":[[69,12]]},"608":{"position":[[296,12]]},"611":{"position":[[988,7],[1260,10]]},"613":{"position":[[961,7]]},"614":{"position":[[211,7]]},"642":{"position":[[231,7]]},"643":{"position":[[276,7]]},"644":{"position":[[243,7]]},"659":{"position":[[828,7]]},"661":{"position":[[1800,7]]},"682":{"position":[[105,7]]},"688":{"position":[[899,7]]},"689":{"position":[[112,11],[566,11]]},"698":{"position":[[1402,7],[2110,7],[3249,10]]},"701":{"position":[[742,7]]},"711":{"position":[[2245,7]]},"723":{"position":[[276,7],[2055,7],[2211,7]]},"765":{"position":[[119,7]]},"784":{"position":[[254,7]]},"785":{"position":[[233,10]]},"796":{"position":[[10,7],[908,7]]},"800":{"position":[[503,7],[582,7]]},"801":{"position":[[286,7]]},"802":{"position":[[514,10]]},"835":{"position":[[933,7]]},"836":{"position":[[1760,7],[2295,7]]},"875":{"position":[[4981,7]]},"898":{"position":[[694,10]]},"903":{"position":[[712,7]]},"906":{"position":[[1096,7]]},"981":{"position":[[372,7],[588,7]]},"1072":{"position":[[1597,11]]},"1123":{"position":[[562,7]]},"1132":{"position":[[598,7]]},"1209":{"position":[[482,7]]},"1213":{"position":[[215,7]]},"1236":{"position":[[95,7]]},"1238":{"position":[[93,7]]},"1252":{"position":[[268,7]]},"1257":{"position":[[176,7]]},"1317":{"position":[[414,7]]}},"keywords":{}}],["complex—larg",{"_index":3423,"title":{},"content":{"561":{"position":[[22,13]]}},"keywords":{}}],["complex—need",{"_index":3411,"title":{},"content":{"559":{"position":[[1610,15]]}},"keywords":{}}],["compli",{"_index":4304,"title":{},"content":{"749":{"position":[[13010,8]]},"1324":{"position":[[374,8]]}},"keywords":{}}],["complianc",{"_index":3444,"title":{},"content":{"567":{"position":[[717,10]]}},"keywords":{}}],["compliant",{"_index":3333,"title":{},"content":{"550":{"position":[[382,9]]},"686":{"position":[[681,9]]},"837":{"position":[[190,9],[788,9]]},"1198":{"position":[[451,9]]},"1286":{"position":[[119,9]]}},"keywords":{}}],["complic",{"_index":1847,"title":{},"content":{"303":{"position":[[1075,11]]},"326":{"position":[[265,11]]},"354":{"position":[[880,10]]},"412":{"position":[[11561,11],[14768,10]]},"483":{"position":[[455,11]]},"560":{"position":[[543,11]]},"708":{"position":[[485,11]]},"1156":{"position":[[16,11]]}},"keywords":{}}],["compon",{"_index":1061,"title":{},"content":{"116":{"position":[[162,9]]},"124":{"position":[[249,10]]},"494":{"position":[[651,9]]},"515":{"position":[[417,11]]},"522":{"position":[[211,11]]},"523":{"position":[[91,11],[166,10]]},"541":{"position":[[82,11],[123,9],[745,9]]},"562":{"position":[[767,10],[892,10]]},"574":{"position":[[123,11]]},"575":{"position":[[284,10]]},"580":{"position":[[73,10]]},"585":{"position":[[226,10]]},"590":{"position":[[534,10]]},"600":{"position":[[142,10]]},"601":{"position":[[28,9],[726,9]]},"749":{"position":[[24138,9]]},"825":{"position":[[531,10],[551,10],[684,12]]},"828":{"position":[[144,9],[408,9]]},"829":{"position":[[349,10],[1200,10],[2110,10],[2281,10],[2692,9],[2718,9],[3634,9],[3739,9],[3798,9]]}},"keywords":{}}],["components.rxdb",{"_index":3531,"title":{},"content":{"591":{"position":[[562,15]]}},"keywords":{}}],["compos",{"_index":2781,"title":{"1252":{"position":[[0,11]]}},"content":{"414":{"position":[[112,7]]},"705":{"position":[[571,11]]},"749":{"position":[[11278,8]]},"861":{"position":[[329,7],[390,7],[515,7],[857,8],[880,7],[908,7]]},"1071":{"position":[[233,10]]},"1078":{"position":[[51,8],[291,8],[370,8]]},"1252":{"position":[[50,7]]}},"keywords":{}}],["composit",{"_index":3490,"title":{"601":{"position":[[34,11]]},"1078":{"position":[[0,9]]}},"content":{"580":{"position":[[244,11]]},"590":{"position":[[235,11],[465,11]]},"1065":{"position":[[916,9]]},"1078":{"position":[[18,9],[237,9],[795,9],[837,9],[992,9]]}},"keywords":{}}],["compound",{"_index":4650,"title":{},"content":{"798":{"position":[[30,8]]},"1080":{"position":[[960,8]]},"1132":{"position":[[303,8]]}},"keywords":{}}],["compoundindex",{"_index":4387,"title":{},"content":{"749":{"position":[[19336,15]]}},"keywords":{}}],["comprehens",{"_index":621,"title":{"423":{"position":[[45,13]]}},"content":{"39":{"position":[[280,13]]},"56":{"position":[[3,13]]},"116":{"position":[[207,13]]},"412":{"position":[[355,13]]},"433":{"position":[[490,13]]},"514":{"position":[[160,13]]},"543":{"position":[[3,13]]},"603":{"position":[[3,13]]},"901":{"position":[[606,13]]}},"keywords":{}}],["compress",{"_index":742,"title":{"81":{"position":[[18,11]]},"111":{"position":[[18,11]]},"141":{"position":[[9,12]]},"169":{"position":[[9,12]]},"197":{"position":[[9,12]]},"236":{"position":[[18,11]]},"294":{"position":[[0,11]]},"307":{"position":[[44,11]]},"311":{"position":[[17,12]]},"316":{"position":[[0,11]]},"345":{"position":[[9,12]]},"366":{"position":[[0,11]]},"508":{"position":[[9,12]]},"528":{"position":[[9,12]]},"588":{"position":[[9,12]]},"629":{"position":[[63,11]]},"639":{"position":[[6,12]]},"733":{"position":[[4,11]]},"734":{"position":[[11,12]]}},"content":{"47":{"position":[[1115,12]]},"57":{"position":[[393,12],[451,12],[487,12]]},"81":{"position":[[53,12]]},"111":{"position":[[44,11],[78,10]]},"141":{"position":[[81,12],[103,12]]},"169":{"position":[[70,12],[95,11]]},"170":{"position":[[445,12]]},"174":{"position":[[2368,11],[2428,10]]},"197":{"position":[[81,12]]},"236":{"position":[[50,10],[143,10]]},"283":{"position":[[170,11]]},"294":{"position":[[73,12],[156,11],[242,11]]},"303":{"position":[[203,11],[228,11],[321,11],[464,11],[791,10]]},"306":{"position":[[181,11]]},"311":{"position":[[94,11]]},"316":{"position":[[54,11],[220,11]]},"317":{"position":[[203,11]]},"318":{"position":[[94,12],[639,10]]},"345":{"position":[[66,11]]},"361":{"position":[[242,12],[327,11],[472,11],[788,10]]},"362":{"position":[[945,12]]},"366":{"position":[[1,11],[75,11],[141,10],[242,10],[457,11]]},"483":{"position":[[619,11]]},"508":{"position":[[26,12]]},"528":{"position":[[23,11]]},"535":{"position":[[1093,11]]},"544":{"position":[[406,12],[428,11]]},"595":{"position":[[1170,11]]},"604":{"position":[[300,12],[340,12]]},"639":{"position":[[97,11]]},"710":{"position":[[273,11]]},"711":{"position":[[2302,11]]},"734":{"position":[[9,11],[105,11],[188,13],[569,10]]},"749":{"position":[[721,11],[1009,11]]},"793":{"position":[[443,11]]},"838":{"position":[[916,11],[3329,12]]},"841":{"position":[[1015,11],[1229,11]]},"932":{"position":[[199,11],[332,8],[416,11],[443,8],[582,11],[610,11],[757,13],[895,12],[1140,11],[1271,12],[1315,11]]},"981":{"position":[[913,9]]},"1123":{"position":[[605,11]]},"1132":{"position":[[1083,11],[1262,8]]},"1237":{"position":[[168,12],[427,11],[461,10],[631,13]]}},"keywords":{}}],["compromis",{"_index":1123,"title":{},"content":{"139":{"position":[[272,12]]},"167":{"position":[[233,12]]},"218":{"position":[[238,12]]},"292":{"position":[[23,10]]},"369":{"position":[[715,12]]},"412":{"position":[[13205,11]]},"446":{"position":[[258,12]]},"643":{"position":[[308,12]]}},"keywords":{}}],["comput",{"_index":424,"title":{"569":{"position":[[24,10]]}},"content":{"26":{"position":[[131,9]]},"224":{"position":[[104,13]]},"391":{"position":[[70,7]]},"401":{"position":[[796,7]]},"408":{"position":[[153,10],[1801,9]]},"527":{"position":[[178,13]]},"569":{"position":[[96,9],[123,9],[146,8],[651,9],[1109,10],[1504,9]]},"571":{"position":[[1870,9]]},"699":{"position":[[206,10],[1026,10]]},"708":{"position":[[36,9]]},"802":{"position":[[725,13]]},"1087":{"position":[[132,8]]},"1088":{"position":[[17,7]]},"1094":{"position":[[456,7]]},"1300":{"position":[[1163,8]]}},"keywords":{}}],["computation",{"_index":1396,"title":{},"content":{"216":{"position":[[326,15]]}},"keywords":{}}],["computing"",{"_index":214,"title":{},"content":{"14":{"position":[[441,16]]}},"keywords":{}}],["con",{"_index":2651,"title":{"845":{"position":[[0,5]]},"1129":{"position":[[0,5]]},"1162":{"position":[[0,5]]},"1168":{"position":[[0,5]]},"1171":{"position":[[0,5]]},"1181":{"position":[[0,5]]},"1200":{"position":[[0,5]]}},"content":{"412":{"position":[[377,5]]},"413":{"position":[[35,4]]}},"keywords":{}}],["concat",{"_index":5833,"title":{},"content":{"1078":{"position":[[450,6]]}},"keywords":{}}],["concaten",{"_index":4053,"title":{},"content":{"724":{"position":[[908,13]]}},"keywords":{}}],["concept",{"_index":276,"title":{"828":{"position":[[8,8]]}},"content":{"16":{"position":[[390,7]]},"119":{"position":[[58,8]]},"121":{"position":[[28,7]]},"159":{"position":[[21,7]]},"182":{"position":[[106,7]]},"185":{"position":[[21,7]]},"233":{"position":[[21,7]]},"275":{"position":[[83,7]]},"277":{"position":[[19,7]]},"314":{"position":[[23,7]]},"419":{"position":[[653,7],[1089,9]]},"445":{"position":[[994,7]]},"456":{"position":[[29,8]]},"518":{"position":[[18,7]]},"781":{"position":[[681,7]]},"832":{"position":[[334,8]]},"899":{"position":[[43,8]]},"903":{"position":[[357,7]]},"1253":{"position":[[77,7]]},"1324":{"position":[[309,7]]}},"keywords":{}}],["conceptu",{"_index":3896,"title":{},"content":{"689":{"position":[[101,10]]}},"keywords":{}}],["concern",{"_index":1142,"title":{},"content":{"145":{"position":[[32,8]]},"169":{"position":[[38,8]]},"293":{"position":[[85,7]]},"407":{"position":[[824,8]]},"411":{"position":[[1632,8]]},"429":{"position":[[13,8]]},"507":{"position":[[74,7]]},"839":{"position":[[1005,9]]},"1231":{"position":[[254,9]]}},"keywords":{}}],["concis",{"_index":2941,"title":{},"content":{"445":{"position":[[1451,8]]}},"keywords":{}}],["conclus",{"_index":988,"title":{"148":{"position":[[0,11]]},"170":{"position":[[0,11]]},"198":{"position":[[0,11]]},"441":{"position":[[0,11]]},"447":{"position":[[0,11]]},"468":{"position":[[12,12]]},"510":{"position":[[0,11]]},"530":{"position":[[0,11]]}},"content":{"83":{"position":[[4,11]]},"267":{"position":[[1112,11]]}},"keywords":{}}],["concret",{"_index":6191,"title":{},"content":{"1207":{"position":[[602,8]]}},"keywords":{}}],["concurr",{"_index":739,"title":{},"content":{"47":{"position":[[894,10]]},"203":{"position":[[232,10]]},"358":{"position":[[219,12],[897,12]]},"362":{"position":[[682,12]]},"386":{"position":[[204,10]]},"416":{"position":[[375,12]]},"496":{"position":[[259,10]]},"559":{"position":[[1297,11],[1415,11]]},"566":{"position":[[818,11],[940,11],[983,11]]},"590":{"position":[[872,10]]},"617":{"position":[[1529,10]]},"643":{"position":[[28,12]]},"688":{"position":[[47,10]]},"860":{"position":[[828,10]]},"897":{"position":[[252,11]]},"908":{"position":[[173,13]]}},"keywords":{}}],["condit",{"_index":1165,"title":{"681":{"position":[[0,11]]}},"content":{"152":{"position":[[377,11]]},"280":{"position":[[510,11]]},"289":{"position":[[2024,11]]},"301":{"position":[[68,10]]},"305":{"position":[[529,11]]},"498":{"position":[[661,11]]},"545":{"position":[[114,11]]},"605":{"position":[[114,11]]},"610":{"position":[[1185,10]]},"620":{"position":[[211,11]]},"681":{"position":[[203,11],[388,11]]},"683":{"position":[[558,11]]},"1252":{"position":[[147,9],[201,9]]},"1316":{"position":[[809,10],[1295,9]]}},"keywords":{}}],["confidenti",{"_index":933,"title":{},"content":{"65":{"position":[[1771,12]]},"95":{"position":[[196,15]]},"291":{"position":[[398,12]]},"310":{"position":[[238,13]]},"506":{"position":[[232,12]]},"912":{"position":[[582,12]]}},"keywords":{}}],["config",{"_index":1586,"title":{},"content":{"261":{"position":[[805,6],[838,6]]},"730":{"position":[[109,7]]},"1176":{"position":[[301,7]]},"1228":{"position":[[57,6]]},"1266":{"position":[[92,6],[329,6]]},"1279":{"position":[[88,6]]}},"keywords":{}}],["configur",{"_index":323,"title":{"334":{"position":[[13,11]]},"579":{"position":[[13,11]]},"730":{"position":[[18,14]]},"1236":{"position":[[0,13]]}},"content":{"19":{"position":[[243,13]]},"27":{"position":[[161,13]]},"131":{"position":[[990,9]]},"192":{"position":[[270,11]]},"285":{"position":[[221,9]]},"293":{"position":[[203,9]]},"314":{"position":[[1175,14]]},"346":{"position":[[42,9]]},"372":{"position":[[107,10]]},"503":{"position":[[114,11]]},"590":{"position":[[127,9]]},"617":{"position":[[1557,15]]},"632":{"position":[[2059,12]]},"730":{"position":[[129,13]]},"828":{"position":[[339,13]]},"829":{"position":[[404,11]]},"831":{"position":[[155,10],[531,11]]},"838":{"position":[[1723,14]]},"849":{"position":[[682,9]]},"862":{"position":[[898,9]]},"894":{"position":[[56,13]]},"904":{"position":[[310,9]]},"1156":{"position":[[28,14]]},"1162":{"position":[[1176,10]]},"1214":{"position":[[472,10]]},"1236":{"position":[[80,9]]},"1239":{"position":[[26,13]]}},"keywords":{}}],["confirm",{"_index":3168,"title":{},"content":{"491":{"position":[[694,9],[1565,9]]},"495":{"position":[[335,9]]},"497":{"position":[[838,13]]},"634":{"position":[[247,13]]}},"keywords":{}}],["conflict",{"_index":225,"title":{"134":{"position":[[0,8]]},"203":{"position":[[12,8]]},"250":{"position":[[12,8]]},"312":{"position":[[20,8]]},"339":{"position":[[0,8]]},"416":{"position":[[15,8]]},"496":{"position":[[0,8]]},"635":{"position":[[0,8]]},"690":{"position":[[15,8]]},"691":{"position":[[39,8]]},"698":{"position":[[13,10]]},"847":{"position":[[0,8]]},"908":{"position":[[0,8]]},"987":{"position":[[0,8]]},"1044":{"position":[[8,9]]},"1111":{"position":[[0,8]]},"1303":{"position":[[14,9]]},"1306":{"position":[[0,10]]},"1307":{"position":[[6,10]]},"1308":{"position":[[12,10]]},"1309":{"position":[[7,8]]}},"content":{"14":{"position":[[797,8]]},"16":{"position":[[414,8]]},"35":{"position":[[414,8]]},"39":{"position":[[574,8],[665,8]]},"40":{"position":[[21,9],[219,8],[744,8]]},"43":{"position":[[112,8]]},"123":{"position":[[202,8]]},"134":{"position":[[26,9],[117,8],[189,8],[303,9]]},"135":{"position":[[229,9],[278,8]]},"147":{"position":[[111,8]]},"162":{"position":[[478,8]]},"165":{"position":[[229,8]]},"192":{"position":[[235,8]]},"203":{"position":[[151,8],[198,8]]},"209":{"position":[[943,11]]},"237":{"position":[[251,9]]},"250":{"position":[[38,8],[193,8]]},"255":{"position":[[1265,9]]},"263":{"position":[[191,8],[621,8]]},"289":{"position":[[200,8]]},"306":{"position":[[197,8]]},"312":{"position":[[253,9]]},"328":{"position":[[200,8]]},"331":{"position":[[200,8]]},"339":{"position":[[63,8],[119,9]]},"386":{"position":[[185,10]]},"412":{"position":[[1143,8],[2118,10],[2170,8],[2228,8],[2971,8],[3070,10],[3240,8],[3601,9],[3681,9],[4120,9],[4614,10],[4678,9],[4797,9],[4862,8],[5037,9],[5135,8],[5340,8],[13538,8],[14045,10],[14857,8]]},"416":{"position":[[67,10]]},"419":{"position":[[1163,8]]},"420":{"position":[[830,10]]},"480":{"position":[[1095,8]]},"481":{"position":[[476,8]]},"483":{"position":[[643,8]]},"487":{"position":[[326,9],[398,9]]},"491":{"position":[[494,9],[1029,9],[1131,10],[1391,9],[1468,9]]},"495":{"position":[[60,8],[180,9],[264,10]]},"496":{"position":[[571,9],[808,8]]},"502":{"position":[[1388,10]]},"525":{"position":[[620,8]]},"566":{"position":[[1009,8]]},"567":{"position":[[289,10]]},"576":{"position":[[277,8]]},"582":{"position":[[224,9],[475,9]]},"590":{"position":[[810,8]]},"634":{"position":[[440,8],[489,8]]},"635":{"position":[[24,9],[293,8],[447,8]]},"644":{"position":[[181,8]]},"680":{"position":[[240,8]]},"683":{"position":[[431,8]]},"687":{"position":[[187,11]]},"688":{"position":[[110,9],[187,8],[222,8],[258,8],[329,10],[692,10],[704,8]]},"689":{"position":[[34,8],[498,9]]},"690":{"position":[[5,8],[561,8]]},"691":{"position":[[149,8]]},"698":{"position":[[188,11],[349,8],[436,8],[471,11],[894,9],[1214,11],[1257,9],[1410,8],[1532,8],[1798,9],[1919,8],[2159,8],[2221,9],[3017,8],[3134,8],[3276,8]]},"737":{"position":[[436,9]]},"749":{"position":[[8908,8],[8933,9],[15938,9],[22923,8]]},"793":{"position":[[922,9]]},"844":{"position":[[78,8],[104,9]]},"847":{"position":[[6,9],[148,8]]},"858":{"position":[[574,8]]},"860":{"position":[[728,8],[768,8]]},"863":{"position":[[607,9]]},"875":{"position":[[3729,11],[3881,8],[4124,8],[4509,9],[4880,9],[5117,8],[5174,8]]},"885":{"position":[[1094,9],[1136,9]]},"889":{"position":[[117,11],[156,10],[288,9],[671,11]]},"899":{"position":[[128,8]]},"908":{"position":[[8,8],[59,9],[196,8],[270,8],[345,8],[392,8]]},"913":{"position":[[115,8]]},"934":{"position":[[787,8]]},"943":{"position":[[277,10]]},"944":{"position":[[404,9]]},"948":{"position":[[106,8]]},"981":{"position":[[411,8],[1223,8]]},"982":{"position":[[745,8]]},"983":{"position":[[653,10],[680,10]]},"987":{"position":[[130,8],[507,9],[552,8],[756,8],[1000,8],[1117,8]]},"988":{"position":[[2731,9],[2792,10]]},"1044":{"position":[[85,8]]},"1085":{"position":[[2126,9],[2298,8]]},"1111":{"position":[[22,10],[37,8]]},"1115":{"position":[[679,10]]},"1120":{"position":[[155,9],[286,9]]},"1147":{"position":[[257,8],[351,8]]},"1148":{"position":[[128,8]]},"1149":{"position":[[43,8]]},"1258":{"position":[[68,8]]},"1305":{"position":[[1103,8]]},"1306":{"position":[[24,9],[53,8],[82,9]]},"1307":{"position":[[9,8],[429,8],[469,8],[602,10],[838,9],[893,11]]},"1308":{"position":[[15,8],[252,9],[375,8],[675,9]]},"1309":{"position":[[3,8],[119,9],[142,8],[176,8],[314,8],[373,8],[604,9],[723,9],[786,8],[967,8],[1071,8],[1243,8]]},"1313":{"position":[[1071,9]]},"1323":{"position":[[188,9]]},"1324":{"position":[[876,9]]}},"keywords":{}}],["conflicthandl",{"_index":4421,"title":{},"content":{"749":{"position":[[22882,15]]},"847":{"position":[[47,15]]},"934":{"position":[[734,16]]},"987":{"position":[[1041,15]]},"1309":{"position":[[1290,15],[1474,16]]}},"keywords":{}}],["conflictmessag",{"_index":5162,"title":{},"content":{"889":{"position":[[175,17]]}},"keywords":{}}],["conflicts"",{"_index":2685,"title":{},"content":{"412":{"position":[[3877,16]]}},"keywords":{}}],["conflicts.push(realmasterst",{"_index":5027,"title":{},"content":{"875":{"position":[[5126,32]]}},"keywords":{}}],["conflictsarray",{"_index":5040,"title":{},"content":{"875":{"position":[[6411,14],[6461,15]]}},"keywords":{}}],["confus",{"_index":326,"title":{},"content":{"19":{"position":[[289,9]]},"419":{"position":[[1248,9]]},"495":{"position":[[280,10],[497,10]]},"1188":{"position":[[293,7]]},"1208":{"position":[[557,10]]},"1215":{"position":[[22,8]]}},"keywords":{}}],["congest",{"_index":3665,"title":{},"content":{"621":{"position":[[862,10]]}},"keywords":{}}],["congestion."",{"_index":3639,"title":{},"content":{"617":{"position":[[884,17]]}},"keywords":{}}],["connect",{"_index":314,"title":{"414":{"position":[[0,12]]},"618":{"position":[[0,11]]},"893":{"position":[[0,7]]},"1281":{"position":[[9,11]]}},"content":{"18":{"position":[[418,7]]},"46":{"position":[[86,13],[228,10]]},"65":{"position":[[723,10]]},"69":{"position":[[221,12]]},"88":{"position":[[96,11]]},"122":{"position":[[353,12]]},"123":{"position":[[274,9]]},"133":{"position":[[346,12]]},"135":{"position":[[182,9]]},"136":{"position":[[141,9]]},"157":{"position":[[114,13],[234,10]]},"164":{"position":[[241,11],[262,10]]},"183":{"position":[[138,11],[240,10]]},"184":{"position":[[334,9]]},"188":{"position":[[2438,7],[2603,7]]},"191":{"position":[[109,11],[196,10]]},"201":{"position":[[322,12]]},"206":{"position":[[74,10],[260,13]]},"211":{"position":[[577,7]]},"212":{"position":[[66,11]]},"215":{"position":[[242,10],[370,13]]},"228":{"position":[[487,11]]},"260":{"position":[[29,7]]},"261":{"position":[[884,9]]},"273":{"position":[[216,13]]},"274":{"position":[[165,11],[239,12]]},"280":{"position":[[281,11],[296,12]]},"289":{"position":[[233,12],[1153,10],[1849,12]]},"292":{"position":[[296,11]]},"309":{"position":[[235,11]]},"322":{"position":[[291,10]]},"323":{"position":[[291,12]]},"327":{"position":[[190,11],[207,12]]},"338":{"position":[[146,12]]},"346":{"position":[[609,11]]},"360":{"position":[[604,10]]},"365":{"position":[[1112,9]]},"375":{"position":[[147,11],[750,12]]},"380":{"position":[[110,13],[188,10]]},"396":{"position":[[723,9]]},"407":{"position":[[657,12],[844,12]]},"410":{"position":[[1062,14],[1266,12]]},"411":{"position":[[5608,14]]},"414":{"position":[[154,11],[387,10]]},"416":{"position":[[452,12]]},"418":{"position":[[164,12]]},"419":{"position":[[223,12],[529,12]]},"444":{"position":[[275,13]]},"445":{"position":[[628,10],[730,10],[1111,9]]},"446":{"position":[[242,12]]},"483":{"position":[[917,7]]},"489":{"position":[[704,11]]},"491":{"position":[[729,9],[1227,12]]},"497":{"position":[[235,12]]},"500":{"position":[[505,13]]},"502":{"position":[[576,12]]},"516":{"position":[[237,13],[260,10]]},"525":{"position":[[208,12],[368,9]]},"565":{"position":[[258,12]]},"570":{"position":[[336,9],[526,9],[753,10]]},"574":{"position":[[371,9]]},"575":{"position":[[399,12]]},"582":{"position":[[129,12]]},"584":{"position":[[275,13]]},"610":{"position":[[339,10],[493,10],[1205,10]]},"611":{"position":[[82,10],[480,10],[1030,10],[1103,10],[1229,10]]},"612":{"position":[[507,10],[633,10],[1091,10],[1403,10],[1966,13],[2386,10]]},"614":{"position":[[309,11],[500,10]]},"616":{"position":[[143,11],[304,10],[522,11]]},"617":{"position":[[32,11],[157,11],[287,10],[411,13],[497,11],[549,11],[652,11],[719,11],[1048,11],[1246,10],[1327,11],[1400,12],[1490,11],[1588,10],[1793,11],[2018,10],[2105,10]]},"618":{"position":[[107,12],[361,12],[778,11]]},"619":{"position":[[228,12]]},"621":{"position":[[102,11],[430,11],[632,11]]},"622":{"position":[[62,11],[503,12],[669,11]]},"623":{"position":[[53,11],[290,10],[530,10],[698,11]]},"624":{"position":[[1483,12]]},"626":{"position":[[18,11]]},"630":{"position":[[365,8]]},"632":{"position":[[665,7],[1977,12]]},"661":{"position":[[793,10]]},"723":{"position":[[2721,13]]},"736":{"position":[[543,12]]},"772":{"position":[[38,10],[213,8]]},"775":{"position":[[653,7]]},"776":{"position":[[316,10]]},"782":{"position":[[458,10]]},"836":{"position":[[611,11],[834,11],[893,10]]},"849":{"position":[[131,11],[836,10],[1102,10]]},"860":{"position":[[455,12]]},"866":{"position":[[795,11]]},"871":{"position":[[59,7],[94,8],[156,9],[682,11],[835,10]]},"872":{"position":[[620,10],[2437,11],[3074,8]]},"875":{"position":[[725,10],[7321,13],[7937,8],[8572,11]]},"881":{"position":[[149,10]]},"886":{"position":[[4297,10]]},"897":{"position":[[48,7]]},"898":{"position":[[3140,7]]},"901":{"position":[[222,10],[308,12],[735,11]]},"902":{"position":[[295,11],[626,11]]},"903":{"position":[[430,7]]},"904":{"position":[[1555,10],[2183,7],[2338,12],[2465,10],[3320,9]]},"905":{"position":[[139,10]]},"906":{"position":[[169,12],[264,10],[827,10]]},"962":{"position":[[1039,11]]},"981":{"position":[[1404,10]]},"985":{"position":[[21,9]]},"1007":{"position":[[1129,10]]},"1095":{"position":[[316,7]]},"1100":{"position":[[88,9]]},"1101":{"position":[[46,7],[199,7]]},"1102":{"position":[[145,7]]},"1189":{"position":[[207,10],[249,10],[487,10],[581,11]]},"1281":{"position":[[36,10]]},"1304":{"position":[[858,11]]},"1314":{"position":[[146,10],[369,11]]}},"keywords":{}}],["connection.perform",{"_index":3291,"title":{},"content":{"534":{"position":[[287,23]]},"594":{"position":[[285,23]]}},"keywords":{}}],["connectionhandlercr",{"_index":1367,"title":{},"content":{"210":{"position":[[334,25]]},"261":{"position":[[463,25]]},"904":{"position":[[2533,25]]},"911":{"position":[[661,25]]},"1121":{"position":[[689,25]]}},"keywords":{}}],["connectionparam",{"_index":5146,"title":{},"content":{"886":{"position":[[4669,16],[4795,16]]}},"keywords":{}}],["connectivity.fast",{"_index":1203,"title":{},"content":{"173":{"position":[[1597,19]]}},"keywords":{}}],["connectivity.reduc",{"_index":3694,"title":{},"content":{"630":{"position":[[727,20]]}},"keywords":{}}],["connector",{"_index":1246,"title":{},"content":{"188":{"position":[[514,10],[1493,9]]}},"keywords":{}}],["connectsocket",{"_index":5477,"title":{},"content":{"988":{"position":[[5182,15],[5693,16]]}},"keywords":{}}],["consensu",{"_index":6486,"title":{},"content":{"1304":{"position":[[785,9]]}},"keywords":{}}],["consequ",{"_index":2148,"title":{},"content":{"377":{"position":[[132,13]]}},"keywords":{}}],["conserv",{"_index":3654,"title":{},"content":{"618":{"position":[[456,8]]}},"keywords":{}}],["consid",{"_index":1000,"title":{},"content":{"86":{"position":[[33,8]]},"142":{"position":[[55,8]]},"146":{"position":[[210,8]]},"147":{"position":[[87,8]]},"161":{"position":[[6,11]]},"186":{"position":[[6,11]]},"241":{"position":[[86,8]]},"303":{"position":[[194,8]]},"358":{"position":[[17,8]]},"365":{"position":[[105,9]]},"373":{"position":[[86,8]]},"401":{"position":[[880,10]]},"404":{"position":[[91,8]]},"408":{"position":[[4422,8]]},"412":{"position":[[9455,8],[11277,9]]},"425":{"position":[[208,8]]},"430":{"position":[[83,8],[614,8],[1019,8]]},"433":{"position":[[414,8]]},"447":{"position":[[597,11]]},"497":{"position":[[555,8],[709,8]]},"520":{"position":[[7,11]]},"534":{"position":[[145,8]]},"546":{"position":[[90,9]]},"556":{"position":[[612,8],[1088,8],[1826,8]]},"569":{"position":[[620,8]]},"594":{"position":[[143,8]]},"606":{"position":[[90,9]]},"616":{"position":[[827,10]]},"686":{"position":[[59,10]]},"839":{"position":[[1334,8]]},"1033":{"position":[[918,9]]},"1072":{"position":[[541,8]]},"1162":{"position":[[1071,8]]},"1297":{"position":[[216,8]]}},"keywords":{}}],["consider",{"_index":1410,"title":{"228":{"position":[[11,15]]},"641":{"position":[[12,15]]}},"content":{"377":{"position":[[57,15]]}},"keywords":{}}],["consist",{"_index":985,"title":{"475":{"position":[[13,12]]},"700":{"position":[[9,12]]}},"content":{"80":{"position":[[74,11]]},"109":{"position":[[175,10]]},"112":{"position":[[237,10]]},"123":{"position":[[252,10]]},"134":{"position":[[335,10]]},"135":{"position":[[160,10]]},"158":{"position":[[210,10]]},"160":{"position":[[218,10]]},"164":{"position":[[375,11]]},"173":{"position":[[3212,11]]},"174":{"position":[[2303,10]]},"184":{"position":[[311,11]]},"191":{"position":[[243,11]]},"203":{"position":[[313,10]]},"207":{"position":[[284,11]]},"237":{"position":[[143,10]]},"249":{"position":[[401,11]]},"250":{"position":[[338,11]]},"269":{"position":[[334,10]]},"279":{"position":[[510,10]]},"288":{"position":[[134,10]]},"289":{"position":[[386,11]]},"293":{"position":[[15,11]]},"327":{"position":[[300,11]]},"328":{"position":[[250,10]]},"340":{"position":[[156,11]]},"360":{"position":[[804,11]]},"367":{"position":[[371,11]]},"369":{"position":[[636,11]]},"375":{"position":[[127,10]]},"382":{"position":[[132,11]]},"384":{"position":[[457,10]]},"407":{"position":[[317,10]]},"411":{"position":[[3970,12]]},"412":{"position":[[5587,11],[5663,10],[5836,10],[6304,12],[6365,12],[6410,11],[14649,11]]},"418":{"position":[[469,11]]},"438":{"position":[[336,10]]},"445":{"position":[[777,12],[2493,10]]},"483":{"position":[[112,12]]},"500":{"position":[[258,10]]},"502":{"position":[[1215,11]]},"504":{"position":[[1016,11]]},"516":{"position":[[368,11]]},"519":{"position":[[245,11]]},"525":{"position":[[283,10]]},"556":{"position":[[1801,11]]},"635":{"position":[[488,10]]},"707":{"position":[[213,7]]},"723":{"position":[[2752,10]]},"1123":{"position":[[22,10]]},"1125":{"position":[[361,11]]},"1132":{"position":[[512,11]]},"1304":{"position":[[104,12]]},"1305":{"position":[[567,8]]}},"keywords":{}}],["consistency.conflict",{"_index":3516,"title":{},"content":{"582":{"position":[[417,20]]}},"keywords":{}}],["consistency.lack",{"_index":3298,"title":{},"content":{"535":{"position":[[678,16]]},"595":{"position":[[699,16]]}},"keywords":{}}],["consistency.perform",{"_index":4792,"title":{},"content":{"838":{"position":[[1054,24]]}},"keywords":{}}],["consistencylevel",{"_index":6018,"title":{},"content":{"1125":{"position":[[443,17]]}},"keywords":{}}],["consistent"",{"_index":3954,"title":{},"content":{"700":{"position":[[765,17]]}},"keywords":{}}],["consol",{"_index":3858,"title":{"1151":{"position":[[26,7]]},"1178":{"position":[[26,7]]}},"content":{"675":{"position":[[77,7]]},"841":{"position":[[1305,7]]},"861":{"position":[[1135,7],[2336,7]]},"1151":{"position":[[67,7]]},"1178":{"position":[[67,7]]}},"keywords":{}}],["console.dir(alivehero",{"_index":3229,"title":{},"content":{"502":{"position":[[1100,26]]},"518":{"position":[[567,26]]}},"keywords":{}}],["console.dir(answ",{"_index":6261,"title":{},"content":{"1220":{"position":[[595,20]]}},"keywords":{}}],["console.dir(bestfriend",{"_index":4682,"title":{},"content":{"810":{"position":[[440,24]]},"811":{"position":[[435,24]]}},"keywords":{}}],["console.dir(bool",{"_index":5499,"title":{},"content":{"993":{"position":[[593,19],[730,19]]}},"keywords":{}}],["console.dir(changeev",{"_index":5325,"title":{},"content":{"941":{"position":[[144,26],[292,26],[368,26],[444,26]]},"970":{"position":[[131,26]]}},"keywords":{}}],["console.dir(currentrxdocu",{"_index":5709,"title":{},"content":{"1046":{"position":[[168,32]]}},"keywords":{}}],["console.dir(doc",{"_index":5359,"title":{},"content":{"950":{"position":[[330,18],[466,18]]},"993":{"position":[[193,18],[310,18]]}},"keywords":{}}],["console.dir(docsmap",{"_index":5363,"title":{},"content":{"951":{"position":[[412,21]]}},"keywords":{}}],["console.dir(docu",{"_index":5765,"title":{},"content":{"1065":{"position":[[296,24],[875,24],[1164,24],[1386,24],[1503,24]]}},"keywords":{}}],["console.dir(documentornul",{"_index":5607,"title":{},"content":{"1017":{"position":[[178,28]]}},"keywords":{}}],["console.dir(error",{"_index":5497,"title":{},"content":{"993":{"position":[[455,20]]}},"keywords":{}}],["console.dir(ev",{"_index":5426,"title":{},"content":{"979":{"position":[[278,19]]}},"keywords":{}}],["console.dir(friend",{"_index":4695,"title":{},"content":{"813":{"position":[[436,21]]}},"keywords":{}}],["console.dir(isnam",{"_index":5677,"title":{},"content":{"1039":{"position":[[323,20]]}},"keywords":{}}],["console.dir(json",{"_index":5373,"title":{},"content":{"952":{"position":[[346,19]]},"971":{"position":[[456,19]]},"1051":{"position":[[192,18],[462,18]]}},"keywords":{}}],["console.dir(moth",{"_index":4691,"title":{},"content":{"812":{"position":[[286,20]]}},"keywords":{}}],["console.dir(mydatabase.heroes.nam",{"_index":5832,"title":{},"content":{"1075":{"position":[[72,36]]}},"keywords":{}}],["console.dir(queryresult",{"_index":2319,"title":{},"content":{"394":{"position":[[945,25]]}},"keywords":{}}],["console.dir(result",{"_index":5737,"title":{},"content":{"1057":{"position":[[139,21]]},"1069":{"position":[[639,21],[800,21]]},"1294":{"position":[[1784,20]]}},"keywords":{}}],["console.dir(st",{"_index":4466,"title":{},"content":{"752":{"position":[[970,19]]}},"keywords":{}}],["console.dir(writeev",{"_index":3738,"title":{},"content":{"649":{"position":[[309,25]]}},"keywords":{}}],["console.error('[repl",{"_index":5225,"title":{},"content":{"898":{"position":[[4114,30]]}},"keywords":{}}],["console.error('indexeddb",{"_index":1818,"title":{},"content":{"302":{"position":[[1115,24]]}},"keywords":{}}],["console.error('p2p",{"_index":1376,"title":{},"content":{"210":{"position":[[584,18]]},"261":{"position":[[945,18]]}},"keywords":{}}],["console.error('webrtc",{"_index":5262,"title":{},"content":{"904":{"position":[[3499,21]]}},"keywords":{}}],["console.error(error",{"_index":4467,"title":{},"content":{"752":{"position":[[1009,21]]}},"keywords":{}}],["console.log",{"_index":4478,"title":{},"content":{"753":{"position":[[377,12]]}},"keywords":{}}],["console.log("receiv",{"_index":3557,"title":{},"content":{"610":{"position":[[1016,26]]}},"keywords":{}}],["console.log('al",{"_index":3706,"title":{},"content":{"632":{"position":[[1829,16]]}},"keywords":{}}],["console.log('approx",{"_index":1776,"title":{},"content":{"300":{"position":[[330,19],[388,19]]}},"keywords":{}}],["console.log('cli",{"_index":5074,"title":{},"content":{"881":{"position":[[389,19]]}},"keywords":{}}],["console.log('connect",{"_index":3571,"title":{},"content":{"611":{"position":[[711,23]]}},"keywords":{}}],["console.log('curr",{"_index":3126,"title":{},"content":{"480":{"position":[[862,22]]},"1067":{"position":[[545,22]]}},"keywords":{}}],["console.log('don",{"_index":4468,"title":{},"content":{"752":{"position":[[1050,19]]},"953":{"position":[[147,21]]},"972":{"position":[[147,21]]}},"keywords":{}}],["console.log('error",{"_index":5593,"title":{},"content":{"1010":{"position":[[323,21]]}},"keywords":{}}],["console.log('got",{"_index":979,"title":{},"content":{"77":{"position":[[318,16]]},"103":{"position":[[358,16]]},"234":{"position":[[418,16]]},"612":{"position":[[1280,16]]},"1058":{"position":[[288,16]]}},"keywords":{}}],["console.log('hero",{"_index":3429,"title":{},"content":{"562":{"position":[[695,20]]}},"keywords":{}}],["console.log('i",{"_index":5382,"title":{},"content":{"956":{"position":[[274,14],[340,14]]}},"keywords":{}}],["console.log('insert",{"_index":6514,"title":{},"content":{"1311":{"position":[[1308,19]]}},"keywords":{}}],["console.log('long",{"_index":4095,"title":{},"content":{"739":{"position":[[511,17]]}},"keywords":{}}],["console.log('messag",{"_index":3574,"title":{},"content":{"611":{"position":[[855,20]]}},"keywords":{}}],["console.log('nam",{"_index":1424,"title":{},"content":{"235":{"position":[[320,17]]},"571":{"position":[[1355,17]]},"1040":{"position":[[363,17]]}},"keywords":{}}],["console.log('repl",{"_index":4966,"title":{},"content":{"872":{"position":[[3441,24]]}},"keywords":{}}],["console.log('storag",{"_index":4495,"title":{},"content":{"759":{"position":[[952,20]]},"760":{"position":[[840,20]]}},"keywords":{}}],["console.log(`exampl",{"_index":4987,"title":{},"content":{"875":{"position":[[1216,20]]}},"keywords":{}}],["console.log(`serv",{"_index":3615,"title":{},"content":{"612":{"position":[[2506,19]]}},"keywords":{}}],["console.log(amount",{"_index":6522,"title":{},"content":{"1311":{"position":[[1790,20]]}},"keywords":{}}],["console.log(attachment.scream",{"_index":4613,"title":{},"content":{"792":{"position":[[420,33]]}},"keywords":{}}],["console.log(collections.hero",{"_index":5323,"title":{},"content":{"939":{"position":[[240,30]]}},"keywords":{}}],["console.log(dist",{"_index":2299,"title":{},"content":{"393":{"position":[[1033,22]]}},"keywords":{}}],["console.log(doc.myfield",{"_index":4562,"title":{},"content":{"770":{"position":[[494,25]]}},"keywords":{}}],["console.log(doc.scream",{"_index":4606,"title":{},"content":{"791":{"position":[[179,26]]}},"keywords":{}}],["console.log(doc.whoami",{"_index":4609,"title":{},"content":{"791":{"position":[[499,26]]}},"keywords":{}}],["console.log(docafteredit",{"_index":5706,"title":{},"content":{"1045":{"position":[[227,24]]}},"keywords":{}}],["console.log(fetcheddoc.secretfield",{"_index":3358,"title":{},"content":{"555":{"position":[[549,36]]}},"keywords":{}}],["console.log(hero.firstnam",{"_index":6519,"title":{},"content":{"1311":{"position":[[1605,28]]}},"keywords":{}}],["console.log(heroes.scream",{"_index":4601,"title":{},"content":{"789":{"position":[[280,29]]}},"keywords":{}}],["console.log(heroes.whoami",{"_index":4604,"title":{},"content":{"789":{"position":[[528,29]]}},"keywords":{}}],["console.log(lastst",{"_index":5717,"title":{},"content":{"1049":{"position":[[164,23],[224,23]]}},"keywords":{}}],["console.log(mydocument.delet",{"_index":5718,"title":{},"content":{"1050":{"position":[[49,32],[118,32]]}},"keywords":{}}],["console.log(mydocument.nam",{"_index":5694,"title":{},"content":{"1042":{"position":[[266,29]]},"1043":{"position":[[170,29]]}},"keywords":{}}],["console.log(myendpoint.urlpath",{"_index":5932,"title":{},"content":{"1100":{"position":[[738,31]]}},"keywords":{}}],["console.log(result.foobar",{"_index":2930,"title":{},"content":{"439":{"position":[[779,27]]}},"keywords":{}}],["console.log.bind(consol",{"_index":6372,"title":{},"content":{"1282":{"position":[[873,25]]}},"keywords":{}}],["console.tim",{"_index":4118,"title":{},"content":{"746":{"position":[[512,14]]}},"keywords":{}}],["console.time()/console.timeend",{"_index":4116,"title":{},"content":{"746":{"position":[[71,32]]}},"keywords":{}}],["console.timeend",{"_index":4119,"title":{},"content":{"746":{"position":[[531,17]]}},"keywords":{}}],["console.warn",{"_index":3857,"title":{},"content":{"675":{"position":[[47,14]]}},"keywords":{}}],["console.warn('indexeddb",{"_index":1813,"title":{},"content":{"302":{"position":[[895,23]]}},"keywords":{}}],["consolid",{"_index":2666,"title":{},"content":{"412":{"position":[[1691,11]]}},"keywords":{}}],["const",{"_index":32,"title":{},"content":{"1":{"position":[[513,5]]},"2":{"position":[[280,5],[316,5]]},"3":{"position":[[196,5]]},"4":{"position":[[374,5]]},"5":{"position":[[284,5]]},"6":{"position":[[439,5],[479,5],[658,5]]},"7":{"position":[[316,5],[493,5]]},"8":{"position":[[954,5],[1085,5]]},"9":{"position":[[230,5]]},"10":{"position":[[213,5],[268,5]]},"11":{"position":[[794,5]]},"19":{"position":[[639,5],[811,5]]},"51":{"position":[[255,5],[682,5]]},"52":{"position":[[321,5],[367,5],[461,5],[608,5]]},"55":{"position":[[850,5],[1077,5]]},"77":{"position":[[198,5],[267,5]]},"103":{"position":[[238,5],[307,5]]},"188":{"position":[[953,5]]},"209":{"position":[[225,5],[786,5],[1080,5]]},"210":{"position":[[245,5]]},"211":{"position":[[195,5]]},"234":{"position":[[298,5],[367,5]]},"255":{"position":[[572,5],[1141,5],[1404,5]]},"258":{"position":[[133,5]]},"261":{"position":[[313,5]]},"266":{"position":[[647,5]]},"276":{"position":[[376,5]]},"300":{"position":[[217,5],[267,5],[299,5]]},"302":{"position":[[685,5],[739,5]]},"303":{"position":[[516,5],[785,5]]},"314":{"position":[[458,5]]},"315":{"position":[[418,5],[521,5]]},"334":{"position":[[316,5]]},"335":{"position":[[185,5],[627,5],[666,5]]},"361":{"position":[[513,5],[782,5]]},"367":{"position":[[694,5]]},"391":{"position":[[483,5],[606,5],[638,5]]},"392":{"position":[[326,5],[731,5],[916,5],[971,5],[1023,5],[1060,5],[1733,5],[2612,5],[2825,5],[3576,5],[3841,5],[4219,5],[4294,5],[4518,5],[4782,5]]},"393":{"position":[[973,5]]},"394":{"position":[[588,5],[625,5],[684,5],[741,5],[856,5]]},"397":{"position":[[466,5],[521,5],[1676,5],[1737,5],[1866,5],[1914,5],[2080,5]]},"398":{"position":[[751,5],[781,5],[894,5],[972,5],[1441,5],[1505,5],[1612,5],[2020,5],[2049,5],[2180,5],[2258,5],[2305,5],[2594,5],[2658,5],[2765,5]]},"403":{"position":[[470,5],[827,5]]},"412":{"position":[[4488,5]]},"425":{"position":[[355,5]]},"426":{"position":[[293,5],[481,5]]},"439":{"position":[[722,5]]},"459":{"position":[[573,5],[617,5],[677,5],[734,5],[781,5],[821,5]]},"480":{"position":[[351,5]]},"482":{"position":[[458,5],[596,5]]},"494":{"position":[[272,5]]},"522":{"position":[[397,5]]},"523":{"position":[[327,5],[377,5],[446,5]]},"538":{"position":[[412,5],[556,5]]},"539":{"position":[[321,5],[367,5],[461,5],[608,5]]},"541":{"position":[[253,5],[346,5],[379,5]]},"542":{"position":[[511,5],[781,5]]},"554":{"position":[[900,5],[1035,5]]},"555":{"position":[[190,5],[257,5],[449,5]]},"556":{"position":[[375,5],[792,5],[891,5]]},"559":{"position":[[270,5],[322,5]]},"562":{"position":[[150,5],[264,5],[646,5],[1124,5],[1187,5],[1286,5]]},"563":{"position":[[462,5],[669,5],[699,5]]},"564":{"position":[[426,5],[566,5]]},"571":{"position":[[1102,5]]},"579":{"position":[[325,5]]},"580":{"position":[[374,5]]},"598":{"position":[[419,5],[563,5]]},"599":{"position":[[348,5],[394,5],[488,5],[635,5]]},"601":{"position":[[446,5],[510,5],[567,5]]},"602":{"position":[[219,5]]},"611":{"position":[[627,5]]},"612":{"position":[[1134,5],[1779,5],[1802,5],[1998,5],[2083,5],[2204,5],[2246,5]]},"632":{"position":[[1271,5]]},"638":{"position":[[310,5],[413,5]]},"647":{"position":[[151,5],[377,5],[517,5]]},"648":{"position":[[93,5],[226,5]]},"649":{"position":[[92,5],[182,5],[236,5]]},"653":{"position":[[236,5]]},"659":{"position":[[556,5]]},"661":{"position":[[1086,5],[1140,5]]},"662":{"position":[[1805,5],[2099,5],[2306,5],[2663,5]]},"672":{"position":[[184,5]]},"673":{"position":[[190,5]]},"674":{"position":[[473,5]]},"678":{"position":[[228,5]]},"680":{"position":[[649,5],[792,5],[1212,5]]},"691":{"position":[[210,5]]},"693":{"position":[[713,5],[782,5],[1016,5],[1086,5],[1157,5]]},"710":{"position":[[1678,5],[1795,5],[1970,5]]},"711":{"position":[[1102,5],[1138,5],[1724,5]]},"717":{"position":[[770,5],[1138,5],[1403,5]]},"718":{"position":[[343,5],[453,5],[641,5]]},"720":{"position":[[118,5]]},"724":{"position":[[504,5],[1607,5],[1789,5]]},"734":{"position":[[280,5],[463,5],[594,5]]},"739":{"position":[[267,5],[614,5]]},"740":{"position":[[499,5]]},"745":{"position":[[378,5],[512,5]]},"746":{"position":[[266,5]]},"747":{"position":[[83,5]]},"751":{"position":[[1272,5],[1413,5]]},"752":{"position":[[345,5],[644,5],[842,5],[1398,5]]},"753":{"position":[[230,5]]},"754":{"position":[[229,5]]},"759":{"position":[[343,5]]},"770":{"position":[[445,5]]},"772":{"position":[[753,5],[997,5],[1588,5],[2170,5],[2350,5]]},"773":{"position":[[543,5]]},"774":{"position":[[645,5]]},"789":{"position":[[145,5],[392,5]]},"791":{"position":[[1,5],[136,5],[260,5],[456,5]]},"792":{"position":[[128,5],[267,5],[310,5]]},"796":{"position":[[416,5],[838,5],[1132,5]]},"797":{"position":[[235,5]]},"798":{"position":[[528,5]]},"799":{"position":[[556,5],[666,5],[788,5]]},"800":{"position":[[789,5],[848,5]]},"806":{"position":[[558,5]]},"808":{"position":[[118,5],[493,5]]},"810":{"position":[[329,5],[387,5]]},"811":{"position":[[309,5],[367,5]]},"812":{"position":[[1,5],[238,5]]},"813":{"position":[[1,5],[333,5],[393,5]]},"818":{"position":[[468,5]]},"820":{"position":[[143,5]]},"825":{"position":[[318,5]]},"826":{"position":[[431,5],[493,5],[586,5],[682,5],[794,5],[892,5],[1013,5],[1097,5]]},"829":{"position":[[622,5],[1392,5],[1415,5],[1480,5],[1512,5],[1947,5],[2366,5],[2456,5],[2485,5],[3282,5],[3372,5],[3400,5]]},"835":{"position":[[485,5]]},"836":{"position":[[672,5]]},"837":{"position":[[1835,5],[2094,5]]},"838":{"position":[[2177,5],[2520,5],[2877,5]]},"846":{"position":[[117,5]]},"848":{"position":[[178,5],[279,5],[634,5],[1269,5]]},"851":{"position":[[285,5]]},"852":{"position":[[152,5]]},"854":{"position":[[197,5],[232,5],[348,5],[393,5],[575,5]]},"857":{"position":[[275,5]]},"858":{"position":[[157,5]]},"862":{"position":[[522,5],[612,5],[866,5],[956,5],[1109,5]]},"866":{"position":[[407,5]]},"872":{"position":[[884,5],[973,5],[1696,5],[2349,5],[3239,5],[3350,5],[3954,5],[4435,5]]},"875":{"position":[[393,5],[868,5],[935,5],[988,5],[1044,5],[1110,5],[2106,5],[2131,5],[2182,5],[2616,5],[3069,5],[3186,5],[3255,5],[3311,5],[3428,5],[4403,5],[4474,5],[4503,5],[4525,5],[4631,5],[6113,5],[6213,5],[6405,5],[7381,5],[8071,5],[8108,5],[8243,5],[8378,5],[9490,5],[9527,5],[9687,5]]},"878":{"position":[[254,5]]},"882":{"position":[[371,5]]},"885":{"position":[[1460,5],[1504,5],[1561,5],[1681,5],[1996,5],[2349,5],[2462,5],[2515,5]]},"886":{"position":[[363,5],[560,5],[985,5],[2271,5],[2309,5],[2452,5],[2617,5],[3460,5],[3509,5],[3804,5]]},"887":{"position":[[226,5]]},"888":{"position":[[367,5],[1021,5]]},"889":{"position":[[416,5]]},"892":{"position":[[152,5],[236,5]]},"893":{"position":[[197,5]]},"898":{"position":[[2304,5],[3035,5],[3302,5]]},"904":{"position":[[697,5],[1781,5]]},"906":{"position":[[968,5]]},"907":{"position":[[257,5]]},"910":{"position":[[211,5]]},"911":{"position":[[602,5]]},"916":{"position":[[125,5],[311,5]]},"917":{"position":[[116,5]]},"918":{"position":[[79,5]]},"919":{"position":[[86,5]]},"920":{"position":[[57,5]]},"921":{"position":[[156,5]]},"929":{"position":[[69,5]]},"930":{"position":[[74,5],[130,5]]},"931":{"position":[[74,5],[130,5]]},"932":{"position":[[68,5],[130,5],[908,5],[1026,5],[1177,5]]},"934":{"position":[[203,5]]},"939":{"position":[[130,5],[209,5]]},"942":{"position":[[170,5]]},"943":{"position":[[367,5]]},"944":{"position":[[177,5]]},"945":{"position":[[118,5],[439,5]]},"946":{"position":[[142,5]]},"947":{"position":[[153,5]]},"948":{"position":[[374,5]]},"949":{"position":[[112,5]]},"951":{"position":[[318,5],[361,5]]},"957":{"position":[[89,5]]},"960":{"position":[[265,5]]},"962":{"position":[[736,5],[947,5]]},"966":{"position":[[519,5],[637,5]]},"967":{"position":[[104,5],[222,5]]},"968":{"position":[[490,5]]},"978":{"position":[[124,5]]},"979":{"position":[[218,5]]},"986":{"position":[[724,5]]},"988":{"position":[[217,5],[2497,5],[2829,5],[3558,5],[3690,5],[3807,5],[5065,5],[5200,5]]},"995":{"position":[[1842,5]]},"1002":{"position":[[514,5],[979,5],[1168,5]]},"1003":{"position":[[360,5]]},"1007":{"position":[[1155,5],[1303,5],[1352,5],[1505,5],[1663,5],[1836,5]]},"1013":{"position":[[273,5]]},"1014":{"position":[[177,5],[318,5]]},"1015":{"position":[[153,5]]},"1016":{"position":[[112,5]]},"1017":{"position":[[91,5]]},"1018":{"position":[[54,5],[125,5],[463,5],[502,5],[774,5],[937,5]]},"1020":{"position":[[333,5],[575,6]]},"1022":{"position":[[429,5],[591,6],[987,5]]},"1023":{"position":[[88,5],[247,6],[400,5],[651,5]]},"1024":{"position":[[182,5],[333,6],[355,5],[427,5]]},"1033":{"position":[[475,5],[605,5]]},"1036":{"position":[[102,5]]},"1038":{"position":[[128,5],[191,5]]},"1042":{"position":[[105,5]]},"1045":{"position":[[52,5],[116,5],[185,5]]},"1051":{"position":[[158,5],[424,5]]},"1052":{"position":[[176,5]]},"1053":{"position":[[87,5]]},"1055":{"position":[[176,5]]},"1056":{"position":[[84,5],[180,5],[300,5]]},"1057":{"position":[[68,5],[103,5],[425,5],[588,5]]},"1058":{"position":[[202,5],[237,5]]},"1059":{"position":[[212,5]]},"1060":{"position":[[80,5]]},"1061":{"position":[[81,5]]},"1062":{"position":[[137,5],[250,5]]},"1063":{"position":[[61,5]]},"1064":{"position":[[290,5],[345,5]]},"1066":{"position":[[334,5]]},"1067":{"position":[[276,5],[432,5],[1270,5],[1537,5],[1940,5],[2035,5],[2093,5],[2354,5]]},"1069":{"position":[[448,5],[597,5],[704,5],[754,5]]},"1070":{"position":[[84,5]]},"1072":{"position":[[2333,5],[2450,5],[2628,5]]},"1078":{"position":[[108,5],[1010,5],[1108,5]]},"1080":{"position":[[1,5]]},"1082":{"position":[[141,5]]},"1083":{"position":[[343,5]]},"1090":{"position":[[755,5],[998,5]]},"1097":{"position":[[682,5]]},"1098":{"position":[[318,5]]},"1099":{"position":[[292,5]]},"1100":{"position":[[631,5]]},"1101":{"position":[[445,5],[627,5]]},"1102":{"position":[[319,5],[457,5],[679,5],[917,5],[1010,5]]},"1103":{"position":[[178,5],[282,5]]},"1105":{"position":[[708,5]]},"1106":{"position":[[646,5]]},"1108":{"position":[[376,5]]},"1109":{"position":[[165,5]]},"1114":{"position":[[688,5],[816,5],[912,5]]},"1116":{"position":[[333,5],[383,5],[419,5],[471,5],[518,5],[587,5],[638,5]]},"1117":{"position":[[309,5],[353,5]]},"1118":{"position":[[470,5],[622,5],[749,5],[792,5],[835,5]]},"1121":{"position":[[428,5],[529,5],[572,5]]},"1125":{"position":[[260,5]]},"1126":{"position":[[350,5],[663,5]]},"1130":{"position":[[133,5]]},"1134":{"position":[[120,5]]},"1138":{"position":[[264,5]]},"1139":{"position":[[403,5],[452,5],[519,5]]},"1140":{"position":[[578,5],[699,5]]},"1144":{"position":[[168,5]]},"1145":{"position":[[392,5],[441,5],[508,5]]},"1146":{"position":[[213,5]]},"1148":{"position":[[737,5],[1107,5]]},"1149":{"position":[[900,5],[1280,5]]},"1154":{"position":[[455,5],[722,5]]},"1158":{"position":[[176,5],[655,5]]},"1159":{"position":[[362,5]]},"1163":{"position":[[278,5],[384,5],[522,5]]},"1164":{"position":[[118,5]]},"1165":{"position":[[288,5],[335,5],[444,5],[700,5],[1038,5]]},"1168":{"position":[[124,5]]},"1172":{"position":[[196,5],[289,5]]},"1177":{"position":[[228,5],[284,5]]},"1182":{"position":[[278,5],[388,5],[526,5]]},"1184":{"position":[[634,5],[765,5]]},"1185":{"position":[[294,5]]},"1186":{"position":[[252,5]]},"1189":{"position":[[377,5]]},"1201":{"position":[[164,5]]},"1204":{"position":[[293,5]]},"1208":{"position":[[702,5],[781,5],[909,5],[1050,5],[1210,5],[1304,5],[1350,5],[1409,5],[1716,5]]},"1210":{"position":[[398,5]]},"1211":{"position":[[653,5]]},"1212":{"position":[[442,5]]},"1213":{"position":[[662,5]]},"1218":{"position":[[351,5],[549,5]]},"1219":{"position":[[480,5],[651,5],[862,5]]},"1220":{"position":[[159,5],[456,5],[535,5]]},"1222":{"position":[[229,5],[530,5],[1369,5]]},"1226":{"position":[[194,5]]},"1227":{"position":[[672,5]]},"1231":{"position":[[776,5],[1003,5],[1140,5]]},"1237":{"position":[[814,5]]},"1238":{"position":[[789,5]]},"1239":{"position":[[759,5]]},"1249":{"position":[[467,5]]},"1264":{"position":[[116,5]]},"1265":{"position":[[660,5]]},"1266":{"position":[[165,5],[195,5],[250,5],[370,5],[443,5]]},"1267":{"position":[[467,5],[591,5],[685,5]]},"1268":{"position":[[418,5]]},"1271":{"position":[[1405,5],[1543,5]]},"1274":{"position":[[294,5]]},"1275":{"position":[[305,5]]},"1276":{"position":[[820,5],[867,5],[907,5]]},"1277":{"position":[[354,5],[858,5]]},"1278":{"position":[[431,5],[883,5]]},"1279":{"position":[[627,5],[681,5]]},"1280":{"position":[[416,5]]},"1282":{"position":[[751,5],[1122,5]]},"1286":{"position":[[389,5],[473,5]]},"1287":{"position":[[435,5],[523,5]]},"1288":{"position":[[395,5],[489,5]]},"1290":{"position":[[53,5]]},"1294":{"position":[[765,5],[801,5],[891,5],[932,5],[1167,5],[1448,5],[1594,5]]},"1296":{"position":[[796,5],[1344,5],[1453,5]]},"1309":{"position":[[491,5],[1366,5]]},"1311":{"position":[[101,5],[240,5],[621,5],[779,5],[892,5],[1453,5],[1722,5]]},"1315":{"position":[[548,5],[633,5]]}},"keywords":{}}],["constant",{"_index":710,"title":{},"content":{"46":{"position":[[335,8]]},"273":{"position":[[199,8]]},"410":{"position":[[1560,8]]},"414":{"position":[[378,8]]}},"keywords":{}}],["constantli",{"_index":1924,"title":{},"content":{"323":{"position":[[483,10]]},"481":{"position":[[845,10]]}},"keywords":{}}],["constel",{"_index":384,"title":{},"content":{"23":{"position":[[216,13]]}},"keywords":{}}],["constrain",{"_index":2545,"title":{},"content":{"408":{"position":[[2354,11]]}},"keywords":{}}],["constraint",{"_index":865,"title":{},"content":{"58":{"position":[[67,12]]},"228":{"position":[[251,11]]},"252":{"position":[[48,11]]},"262":{"position":[[351,11]]},"276":{"position":[[100,11]]},"304":{"position":[[217,11]]},"354":{"position":[[447,12],[484,11],[525,12],[1101,11],[1464,12]]},"362":{"position":[[294,12]]},"382":{"position":[[157,11]]},"412":{"position":[[9664,11]]},"460":{"position":[[810,12]]},"495":{"position":[[846,11]]},"699":{"position":[[1003,10]]},"796":{"position":[[809,10]]},"1157":{"position":[[78,12]]}},"keywords":{}}],["construct",{"_index":2842,"title":{},"content":{"420":{"position":[[1269,13]]},"770":{"position":[[46,12]]},"886":{"position":[[308,9]]},"1257":{"position":[[184,10]]}},"keywords":{}}],["constructor",{"_index":1094,"title":{},"content":{"130":{"position":[[363,12]]},"1226":{"position":[[370,11]]},"1264":{"position":[[280,11]]}},"keywords":{}}],["constructor(priv",{"_index":814,"title":{},"content":{"54":{"position":[[60,19]]}},"keywords":{}}],["consult",{"_index":3656,"title":{},"content":{"619":{"position":[[6,10]]},"730":{"position":[[209,7]]},"793":{"position":[[1485,10]]},"885":{"position":[[2706,7]]}},"keywords":{}}],["consum",{"_index":1716,"title":{},"content":{"298":{"position":[[408,9]]},"408":{"position":[[2994,7]]},"430":{"position":[[480,7]]},"622":{"position":[[522,8]]},"670":{"position":[[218,9]]},"693":{"position":[[199,7]]},"708":{"position":[[353,8]]},"829":{"position":[[447,7]]},"871":{"position":[[349,8]]},"1246":{"position":[[2225,7]]}},"keywords":{}}],["consumpt",{"_index":2584,"title":{},"content":{"409":{"position":[[109,12]]}},"keywords":{}}],["contact",{"_index":4630,"title":{},"content":{"793":{"position":[[1477,7]]}},"keywords":{}}],["contain",{"_index":580,"title":{},"content":{"37":{"position":[[117,8]]},"269":{"position":[[235,9]]},"390":{"position":[[1291,7]]},"397":{"position":[[411,8]]},"452":{"position":[[670,8]]},"543":{"position":[[126,8]]},"571":{"position":[[601,8]]},"603":{"position":[[124,8]]},"698":{"position":[[1136,8],[1339,8]]},"724":{"position":[[1579,8]]},"732":{"position":[[84,8]]},"749":{"position":[[359,7],[826,8],[3674,7],[6524,8],[11707,7],[11804,7],[13081,8],[18621,7],[18746,7],[23382,7]]},"789":{"position":[[92,8]]},"805":{"position":[[25,8]]},"816":{"position":[[126,8]]},"854":{"position":[[1409,8]]},"861":{"position":[[480,10]]},"875":{"position":[[3813,8],[7993,7]]},"886":{"position":[[1540,8]]},"887":{"position":[[125,8]]},"888":{"position":[[839,8]]},"889":{"position":[[275,8]]},"904":{"position":[[2865,7],[3011,7],[3281,8]]},"982":{"position":[[80,8]]},"983":{"position":[[610,8]]},"984":{"position":[[408,7]]},"985":{"position":[[212,8]]},"986":{"position":[[863,8]]},"988":{"position":[[2009,8],[2704,8],[3325,7],[3873,8],[4654,7]]},"990":{"position":[[796,7],[843,8],[882,7]]},"1004":{"position":[[283,7],[320,9],[688,7]]},"1023":{"position":[[611,7]]},"1074":{"position":[[540,7]]},"1077":{"position":[[22,8]]},"1092":{"position":[[176,8]]},"1104":{"position":[[414,7],[522,8]]},"1106":{"position":[[448,8]]},"1116":{"position":[[92,8]]},"1189":{"position":[[228,8]]},"1208":{"position":[[237,8]]},"1219":{"position":[[27,8]]},"1226":{"position":[[299,8]]},"1227":{"position":[[37,10],[69,8]]},"1237":{"position":[[355,7]]},"1264":{"position":[[215,8]]},"1265":{"position":[[30,10],[62,8]]},"1268":{"position":[[366,8]]},"1271":{"position":[[133,8],[579,8],[633,8]]},"1276":{"position":[[616,8]]},"1282":{"position":[[33,7]]},"1290":{"position":[[173,7]]},"1291":{"position":[[171,7]]},"1294":{"position":[[485,8]]},"1296":{"position":[[667,8]]},"1305":{"position":[[760,7]]},"1313":{"position":[[82,9]]},"1319":{"position":[[219,10],[389,10]]},"1322":{"position":[[472,7]]}},"keywords":{}}],["contemporari",{"_index":2914,"title":{},"content":{"434":{"position":[[399,12]]}},"keywords":{}}],["content",{"_index":1191,"title":{},"content":{"167":{"position":[[125,9]]},"211":{"position":[[487,8]]},"270":{"position":[[157,8]]},"314":{"position":[[819,8]]},"392":{"position":[[516,8]]},"421":{"position":[[88,8]]},"433":{"position":[[213,8]]},"500":{"position":[[662,7]]},"556":{"position":[[989,9]]},"612":{"position":[[1466,7],[1900,8]]},"626":{"position":[[225,7]]},"714":{"position":[[772,8],[828,8]]},"875":{"position":[[6330,8],[7284,8]]},"912":{"position":[[571,7]]},"988":{"position":[[2625,8]]},"1102":{"position":[[598,8]]},"1287":{"position":[[136,7]]}},"keywords":{}}],["contentasstr",{"_index":6215,"title":{},"content":{"1208":{"position":[[1415,15]]}},"keywords":{}}],["contention.effici",{"_index":2145,"title":{},"content":{"376":{"position":[[432,20]]}},"keywords":{}}],["context",{"_index":210,"title":{},"content":{"14":{"position":[[352,8]]},"173":{"position":[[8,7]]},"346":{"position":[[392,8]]},"439":{"position":[[119,7]]},"460":{"position":[[859,7]]},"570":{"position":[[210,7]]},"571":{"position":[[8,7]]},"618":{"position":[[8,7]]},"640":{"position":[[556,8]]},"749":{"position":[[24111,8]]},"829":{"position":[[1003,8]]},"901":{"position":[[691,9]]},"1214":{"position":[[177,9],[210,7],[234,8],[291,8],[619,8]]},"1301":{"position":[[724,9]]}},"keywords":{}}],["contextu",{"_index":3906,"title":{},"content":{"690":{"position":[[112,10]]},"723":{"position":[[2172,10]]}},"keywords":{}}],["continu",{"_index":706,"title":{},"content":{"46":{"position":[[161,8]]},"61":{"position":[[1,8]]},"65":{"position":[[610,8]]},"157":{"position":[[287,8]]},"164":{"position":[[179,8]]},"170":{"position":[[577,8]]},"173":{"position":[[1490,8]]},"208":{"position":[[265,12]]},"215":{"position":[[189,8]]},"255":{"position":[[280,10]]},"292":{"position":[[380,9]]},"309":{"position":[[215,10]]},"320":{"position":[[178,8]]},"327":{"position":[[113,9]]},"338":{"position":[[105,8]]},"375":{"position":[[217,8],[650,10]]},"380":{"position":[[144,8]]},"410":{"position":[[1012,8]]},"411":{"position":[[443,10]]},"419":{"position":[[249,8]]},"446":{"position":[[215,8]]},"464":{"position":[[1360,8]]},"483":{"position":[[528,8]]},"486":{"position":[[252,8]]},"489":{"position":[[649,9]]},"491":{"position":[[274,12]]},"510":{"position":[[85,8],[462,9]]},"530":{"position":[[587,9]]},"574":{"position":[[224,8]]},"582":{"position":[[657,10]]},"624":{"position":[[727,10]]},"630":{"position":[[670,8]]},"632":{"position":[[2598,12]]},"647":{"position":[[86,8]]},"724":{"position":[[598,8]]},"824":{"position":[[324,8],[503,9]]},"965":{"position":[[194,13]]},"981":{"position":[[1319,8]]},"1003":{"position":[[21,9]]},"1294":{"position":[[714,8],[1265,8]]},"1319":{"position":[[756,9]]}},"keywords":{}}],["contrari",{"_index":2897,"title":{},"content":{"429":{"position":[[1,8]]}},"keywords":{}}],["contrast",{"_index":587,"title":{},"content":{"38":{"position":[[151,8]]},"99":{"position":[[256,9]]},"100":{"position":[[153,9]]},"226":{"position":[[205,9]]},"265":{"position":[[719,9]]},"351":{"position":[[130,9]]},"412":{"position":[[8786,8]]},"439":{"position":[[337,8]]},"521":{"position":[[349,9]]},"535":{"position":[[1233,9]]},"571":{"position":[[509,8]]},"630":{"position":[[203,9]]},"851":{"position":[[4,8]]},"903":{"position":[[115,9]]},"981":{"position":[[4,8]]},"1065":{"position":[[1932,8]]},"1192":{"position":[[235,9]]}},"keywords":{}}],["contribut",{"_index":3255,"title":{"665":{"position":[[0,12]]}},"content":{"517":{"position":[[341,12]]},"669":{"position":[[28,13]]},"670":{"position":[[606,13]]}},"keywords":{}}],["contributor",{"_index":2174,"title":{},"content":{"387":{"position":[[281,12]]}},"keywords":{}}],["control",{"_index":971,"title":{},"content":{"75":{"position":[[86,7]]},"97":{"position":[[121,7]]},"263":{"position":[[333,7]]},"407":{"position":[[758,7],[1160,7]]},"410":{"position":[[490,7],[629,7]]},"411":{"position":[[5327,7]]},"412":{"position":[[12071,8],[12857,8],[15178,7]]},"417":{"position":[[80,7]]},"418":{"position":[[319,7]]},"551":{"position":[[406,8]]},"569":{"position":[[267,8],[873,11]]},"612":{"position":[[1944,9]]},"621":{"position":[[873,8]]},"635":{"position":[[338,7]]},"690":{"position":[[62,7],[615,8]]},"860":{"position":[[968,9]]},"861":{"position":[[2269,7]]},"875":{"position":[[7356,9]]},"912":{"position":[[656,7]]},"1009":{"position":[[830,7]]},"1147":{"position":[[309,7]]},"1206":{"position":[[289,7]]},"1305":{"position":[[422,8]]}},"keywords":{}}],["conveni",{"_index":643,"title":{},"content":{"40":{"position":[[833,11]]},"130":{"position":[[45,10]]},"247":{"position":[[14,10]]},"371":{"position":[[68,10]]},"402":{"position":[[2041,10]]},"424":{"position":[[387,10]]},"427":{"position":[[13,12]]},"430":{"position":[[27,12]]},"559":{"position":[[1005,10]]},"693":{"position":[[254,10]]}},"keywords":{}}],["converg",{"_index":2517,"title":{},"content":{"407":{"position":[[303,8]]},"411":{"position":[[4750,9]]},"700":{"position":[[362,9]]}},"keywords":{}}],["convers",{"_index":3474,"title":{},"content":{"572":{"position":[[88,12]]}},"keywords":{}}],["convert",{"_index":829,"title":{},"content":{"55":{"position":[[114,7]]},"397":{"position":[[181,7],[1554,9]]}},"keywords":{}}],["cooki",{"_index":1766,"title":{"434":{"position":[[16,8]]},"448":{"position":[[31,7]]},"450":{"position":[[9,8]]}},"content":{"299":{"position":[[1731,6]]},"408":{"position":[[330,7]]},"434":{"position":[[1,8],[250,7],[342,7]]},"450":{"position":[[1,7],[52,7],[173,7],[273,7],[310,7],[454,6],[498,6],[574,7]]},"460":{"position":[[1040,8]]},"461":{"position":[[1,7],[75,7],[189,6],[268,7],[516,7],[573,7]]},"462":{"position":[[893,9]]},"463":{"position":[[255,7]]},"696":{"position":[[822,8],[876,7]]},"793":{"position":[[1367,7]]},"890":{"position":[[375,8],[483,7],[625,7]]}},"keywords":{}}],["cookiescannot",{"_index":3009,"title":{},"content":{"460":{"position":[[724,13]]}},"keywords":{}}],["cookiestor",{"_index":2955,"title":{},"content":{"450":{"position":[[796,11]]}},"keywords":{}}],["coordin",{"_index":1392,"title":{},"content":{"212":{"position":[[658,12]]},"303":{"position":[[1267,11]]},"751":{"position":[[1278,11]]},"964":{"position":[[574,12]]},"1007":{"position":[[152,12]]}},"keywords":{}}],["copi",{"_index":2516,"title":{},"content":{"407":{"position":[[38,4]]},"411":{"position":[[4117,4]]},"412":{"position":[[4291,4],[5718,4]]},"417":{"position":[[36,4]]},"775":{"position":[[306,6],[497,4]]},"1210":{"position":[[577,4]]},"1227":{"position":[[342,4],[795,6]]},"1265":{"position":[[335,4],[777,6]]}},"keywords":{}}],["cor",{"_index":4964,"title":{"1103":{"position":[[0,5]]}},"content":{"872":{"position":[[3336,5]]},"1103":{"position":[[63,4],[85,4],[114,5],[241,5],[390,5]]}},"keywords":{}}],["cordova",{"_index":140,"title":{"11":{"position":[[0,7]]}},"content":{"10":{"position":[[409,7]]},"11":{"position":[[65,7],[120,7],[182,7],[884,8],[977,7]]},"661":{"position":[[308,7]]},"964":{"position":[[474,7]]},"1247":{"position":[[108,7]]}},"keywords":{}}],["cordova'",{"_index":143,"title":{},"content":{"11":{"position":[[6,9]]}},"keywords":{}}],["cordova.sqliteplugin",{"_index":145,"title":{},"content":{"11":{"position":[[23,21]]}},"keywords":{}}],["core",{"_index":1077,"title":{},"content":{"121":{"position":[[8,4]]},"180":{"position":[[84,4]]},"187":{"position":[[28,4]]},"207":{"position":[[15,4]]},"273":{"position":[[8,5]]},"362":{"position":[[1035,4]]},"379":{"position":[[8,4]]},"387":{"position":[[349,4]]},"392":{"position":[[3722,4],[3836,4],[4697,4],[5219,6]]},"419":{"position":[[430,4]]},"490":{"position":[[8,4]]},"513":{"position":[[249,4]]},"542":{"position":[[230,4]]},"574":{"position":[[37,4]]},"662":{"position":[[1898,4],[2059,4]]},"732":{"position":[[102,5]]},"761":{"position":[[96,4]]},"793":{"position":[[83,4]]},"831":{"position":[[125,4]]},"837":{"position":[[106,4],[1569,6]]},"838":{"position":[[2038,4]]},"899":{"position":[[38,4]]},"960":{"position":[[81,4]]},"1097":{"position":[[463,4]]},"1181":{"position":[[897,4]]},"1198":{"position":[[2336,4]]},"1271":{"position":[[124,5]]},"1292":{"position":[[157,4]]}},"keywords":{}}],["core(tm",{"_index":6400,"title":{},"content":{"1292":{"position":[[180,8]]}},"keywords":{}}],["corner",{"_index":4111,"title":{},"content":{"742":{"position":[[87,7]]}},"keywords":{}}],["cornerston",{"_index":3224,"title":{},"content":{"502":{"position":[[246,11]]},"517":{"position":[[23,11]]}},"keywords":{}}],["corpor",{"_index":1730,"title":{},"content":{"298":{"position":[[807,9]]},"624":{"position":[[291,9]]}},"keywords":{}}],["correct",{"_index":3715,"title":{"1120":{"position":[[0,11]]}},"content":{"638":{"position":[[923,7]]},"656":{"position":[[446,7]]},"698":{"position":[[271,7]]},"708":{"position":[[198,7],[440,7]]},"749":{"position":[[16570,7]]},"875":{"position":[[3005,7],[3968,7]]},"1030":{"position":[[254,7]]},"1097":{"position":[[514,7]]},"1115":{"position":[[554,7],[754,7]]},"1120":{"position":[[26,12]]},"1228":{"position":[[237,7]]},"1251":{"position":[[293,11]]},"1271":{"position":[[821,7]]},"1300":{"position":[[529,7]]},"1315":{"position":[[1483,7]]}},"keywords":{}}],["correctli",{"_index":754,"title":{"1029":{"position":[[17,10]]}},"content":{"50":{"position":[[346,10]]},"394":{"position":[[48,9]]},"687":{"position":[[171,9]]},"779":{"position":[[94,10]]},"1316":{"position":[[1861,10]]}},"keywords":{}}],["correctly.link",{"_index":1091,"title":{},"content":{"129":{"position":[[659,14]]}},"keywords":{}}],["correspond",{"_index":2356,"title":{},"content":{"397":{"position":[[437,13]]},"778":{"position":[[94,10]]},"805":{"position":[[159,13]]},"806":{"position":[[364,13]]},"832":{"position":[[250,13]]}},"keywords":{}}],["corrupt",{"_index":1799,"title":{},"content":{"302":{"position":[[320,11]]},"358":{"position":[[637,9]]},"382":{"position":[[385,10]]}},"keywords":{}}],["cosin",{"_index":2292,"title":{},"content":{"393":{"position":[[253,6]]}},"keywords":{}}],["cost",{"_index":1314,"title":{"204":{"position":[[15,5]]},"251":{"position":[[17,6]]},"295":{"position":[[0,4]]}},"content":{"251":{"position":[[295,6]]},"263":{"position":[[305,6]]},"295":{"position":[[51,4]]},"402":{"position":[[1064,4]]},"1124":{"position":[[1780,5]]},"1132":{"position":[[1189,4]]},"1304":{"position":[[1452,4]]}},"keywords":{}}],["costli",{"_index":4812,"title":{},"content":{"841":{"position":[[1107,6]]}},"keywords":{}}],["couch",{"_index":2156,"title":{},"content":{"381":{"position":[[206,5]]},"841":{"position":[[555,5]]}},"keywords":{}}],["couchbas",{"_index":411,"title":{"25":{"position":[[0,10]]}},"content":{"25":{"position":[[1,9],[247,9]]},"837":{"position":[[911,9]]}},"keywords":{}}],["couchdb",{"_index":239,"title":{"23":{"position":[[0,8]]},"843":{"position":[[17,7]]}},"content":{"14":{"position":[[1121,7]]},"23":{"position":[[10,7],[177,7],[419,7]]},"24":{"position":[[72,7],[306,7],[350,7],[799,7]]},"26":{"position":[[52,7]]},"27":{"position":[[220,7]]},"113":{"position":[[245,8]]},"174":{"position":[[3077,8]]},"238":{"position":[[160,8]]},"249":{"position":[[183,8]]},"255":{"position":[[1699,8]]},"289":{"position":[[448,7],[493,7],[586,8],[706,7],[814,7]]},"312":{"position":[[146,9]]},"350":{"position":[[160,8]]},"381":{"position":[[129,8],[146,7]]},"412":{"position":[[12519,7]]},"481":{"position":[[294,7]]},"504":{"position":[[870,7],[915,8],[985,7]]},"565":{"position":[[134,8]]},"566":{"position":[[1187,8]]},"632":{"position":[[757,8]]},"644":{"position":[[131,8]]},"685":{"position":[[157,7]]},"701":{"position":[[488,8]]},"749":{"position":[[175,7],[273,7]]},"793":{"position":[[717,7]]},"837":{"position":[[77,7],[182,7],[433,8],[801,8],[900,7]]},"838":{"position":[[627,8]]},"841":{"position":[[736,7],[790,8],[1428,7]]},"845":{"position":[[58,7]]},"846":{"position":[[107,9],[189,7],[253,7],[1235,7],[1562,7]]},"848":{"position":[[706,7],[1259,9],[1341,7]]},"849":{"position":[[7,7],[551,7],[670,7],[760,8]]},"851":{"position":[[75,7],[102,7],[254,7]]},"852":{"position":[[224,7]]},"1124":{"position":[[2271,8]]},"1149":{"position":[[130,7],[175,7],[552,7],[581,7],[647,7],[722,9],[1264,7],[1351,7],[1415,7]]},"1198":{"position":[[276,7],[464,8],[1573,7],[1708,7]]},"1199":{"position":[[57,7]]},"1313":{"position":[[1028,7]]}},"keywords":{}}],["couchdb.build",{"_index":1307,"title":{},"content":{"202":{"position":[[264,13]]}},"keywords":{}}],["couchdb/pouchdb",{"_index":2679,"title":{},"content":{"412":{"position":[[3385,18]]}},"keywords":{}}],["count",{"_index":1552,"title":{"1067":{"position":[[0,6]]}},"content":{"251":{"position":[[25,5]]},"265":{"position":[[369,7]]},"496":{"position":[[165,6]]},"746":{"position":[[736,6]]},"749":{"position":[[2604,7],[2660,7],[2839,5]]},"752":{"position":[[1170,6]]},"817":{"position":[[40,5]]},"1033":{"position":[[773,7]]},"1067":{"position":[[124,5],[384,5],[414,5],[610,5],[785,7],[1173,5],[1403,5],[1649,5],[1826,5],[1920,5],[2041,5],[2078,5],[2099,6],[2247,5]]},"1068":{"position":[[28,5],[187,8],[483,5]]},"1194":{"position":[[945,6],[995,7]]}},"keywords":{}}],["countalldocu",{"_index":6506,"title":{},"content":{"1311":{"position":[[834,18]]}},"keywords":{}}],["counter",{"_index":5776,"title":{},"content":{"1067":{"position":[[1756,8]]}},"keywords":{}}],["countri",{"_index":4450,"title":{},"content":{"751":{"position":[[1226,7]]}},"keywords":{}}],["coupl",{"_index":576,"title":{},"content":{"36":{"position":[[416,8]]},"412":{"position":[[925,7]]},"696":{"position":[[1137,6]]},"839":{"position":[[428,7]]}},"keywords":{}}],["cours",{"_index":357,"title":{},"content":{"20":{"position":[[248,6]]},"412":{"position":[[2805,6]]},"454":{"position":[[139,6]]},"457":{"position":[[474,6]]},"697":{"position":[[456,7]]},"703":{"position":[[1595,6]]},"773":{"position":[[229,6]]},"784":{"position":[[731,6]]},"1295":{"position":[[442,6]]},"1316":{"position":[[3356,7]]}},"keywords":{}}],["cover",{"_index":3020,"title":{},"content":{"461":{"position":[[1468,6]]},"839":{"position":[[678,6]]},"876":{"position":[[26,7],[119,5]]}},"keywords":{}}],["cpu",{"_index":2281,"title":{},"content":{"392":{"position":[[4693,3],[5215,3]]},"408":{"position":[[4749,4]]},"411":{"position":[[3611,3]]},"412":{"position":[[4830,3],[9294,3]]},"427":{"position":[[1236,3]]},"699":{"position":[[841,3]]},"704":{"position":[[364,5]]},"721":{"position":[[158,3],[192,3]]},"740":{"position":[[97,3]]},"975":{"position":[[162,4]]},"1164":{"position":[[1311,3]]},"1246":{"position":[[194,3],[514,3]]},"1292":{"position":[[200,4]]},"1309":{"position":[[756,3]]}},"keywords":{}}],["craft",{"_index":3223,"title":{},"content":{"502":{"position":[[57,7]]},"661":{"position":[[65,7]]},"711":{"position":[[90,7]]},"836":{"position":[[67,7]]},"837":{"position":[[1440,5]]},"848":{"position":[[116,8]]},"1079":{"position":[[424,5]]},"1296":{"position":[[840,5],[1202,7]]}},"keywords":{}}],["crash",{"_index":463,"title":{},"content":{"28":{"position":[[533,8]]},"302":{"position":[[304,7]]},"304":{"position":[[459,5]]},"990":{"position":[[328,5]]},"1010":{"position":[[204,9]]},"1090":{"position":[[1197,7]]},"1162":{"position":[[106,7]]},"1171":{"position":[[123,7]]},"1181":{"position":[[172,7]]},"1300":{"position":[[1130,7]]}},"keywords":{}}],["crdt",{"_index":628,"title":{"677":{"position":[[5,4]]},"678":{"position":[[5,4]]},"681":{"position":[[12,4]]},"683":{"position":[[0,5]]},"685":{"position":[[0,5]]},"687":{"position":[[16,6]]},"688":{"position":[[0,4]]},"689":{"position":[[13,6]]},"691":{"position":[[68,5]]}},"content":{"39":{"position":[[687,6]]},"40":{"position":[[10,4]]},"412":{"position":[[2406,5],[3675,5],[3846,5],[3917,5],[9239,4]]},"678":{"position":[[12,4],[204,4]]},"680":{"position":[[8,5],[58,4],[145,4],[192,4],[330,4],[424,4],[779,4],[965,6],[1023,4],[1070,5],[1081,4],[1101,7],[1289,4]]},"681":{"position":[[17,5],[215,5],[400,5],[497,4]]},"682":{"position":[[17,4],[163,5]]},"683":{"position":[[6,5],[91,4],[467,5]]},"684":{"position":[[34,4],[136,5]]},"685":{"position":[[1,4],[213,4],[410,4],[527,4],[660,4]]},"686":{"position":[[19,4],[224,4],[547,6],[703,4],[797,4],[842,4]]},"687":{"position":[[1,4],[231,5],[258,5],[308,4]]},"688":{"position":[[11,4],[156,4],[251,5],[371,4],[797,4],[963,6]]},"689":{"position":[[1,5],[124,5],[415,4],[540,5]]},"690":{"position":[[26,4],[237,5],[506,5]]},"691":{"position":[[703,4]]},"698":{"position":[[3059,5],[3073,4],[3220,5]]},"749":{"position":[[22581,4],[22624,4],[22772,5],[22857,5],[22918,4]]},"793":{"position":[[1139,4]]}},"keywords":{}}],["crdt1",{"_index":4417,"title":{},"content":{"749":{"position":[[22575,5]]}},"keywords":{}}],["crdt2",{"_index":4418,"title":{},"content":{"749":{"position":[[22715,5]]}},"keywords":{}}],["crdt3",{"_index":4420,"title":{},"content":{"749":{"position":[[22844,5]]}},"keywords":{}}],["creat",{"_index":198,"title":{"51":{"position":[[0,6]]},"258":{"position":[[0,6]]},"334":{"position":[[0,8]]},"538":{"position":[[0,6]]},"579":{"position":[[0,8]]},"598":{"position":[[0,6]]},"653":{"position":[[0,6]]},"803":{"position":[[0,8]]},"885":{"position":[[0,8]]},"934":{"position":[[0,8]]},"1020":{"position":[[0,8]]},"1075":{"position":[[0,6]]},"1114":{"position":[[0,8]]}},"content":{"14":{"position":[[50,8],[1055,7]]},"26":{"position":[[274,6]]},"30":{"position":[[204,7]]},"37":{"position":[[200,6]]},"45":{"position":[[119,6]]},"50":{"position":[[6,7],[223,7]]},"51":{"position":[[664,6]]},"55":{"position":[[641,8]]},"65":{"position":[[954,8],[2055,6]]},"83":{"position":[[359,6]]},"116":{"position":[[251,8]]},"124":{"position":[[99,6]]},"128":{"position":[[285,6]]},"129":{"position":[[527,7]]},"138":{"position":[[225,8]]},"145":{"position":[[93,6]]},"153":{"position":[[290,6]]},"170":{"position":[[107,6]]},"174":{"position":[[267,6]]},"177":{"position":[[55,7],[286,6]]},"181":{"position":[[178,8]]},"188":{"position":[[433,6],[474,7],[931,6],[3013,6],[3103,6]]},"194":{"position":[[63,8]]},"208":{"position":[[158,7]]},"211":{"position":[[38,6]]},"266":{"position":[[830,7]]},"275":{"position":[[219,6]]},"304":{"position":[[470,8]]},"334":{"position":[[38,6]]},"342":{"position":[[1,6]]},"346":{"position":[[137,8],[354,6],[444,6]]},"356":{"position":[[315,6],[694,6]]},"365":{"position":[[468,6]]},"368":{"position":[[273,6]]},"384":{"position":[[290,6]]},"387":{"position":[[294,8]]},"388":{"position":[[402,8]]},"390":{"position":[[247,7]]},"391":{"position":[[769,7]]},"392":{"position":[[43,6],[3811,6]]},"403":{"position":[[86,6]]},"404":{"position":[[171,8]]},"411":{"position":[[1246,8],[1667,8]]},"412":{"position":[[10910,6],[10971,8],[12534,8]]},"419":{"position":[[1644,8]]},"446":{"position":[[1308,6]]},"463":{"position":[[71,8],[1167,8]]},"464":{"position":[[1007,6]]},"480":{"position":[[33,6],[319,6]]},"482":{"position":[[564,6]]},"489":{"position":[[732,7]]},"510":{"position":[[367,6]]},"514":{"position":[[377,6]]},"530":{"position":[[647,8]]},"538":{"position":[[394,6]]},"541":{"position":[[319,6]]},"548":{"position":[[202,6]]},"554":{"position":[[1006,6],[1227,6]]},"563":{"position":[[611,6]]},"567":{"position":[[385,6]]},"579":{"position":[[802,8]]},"589":{"position":[[189,8]]},"601":{"position":[[540,6]]},"608":{"position":[[202,6]]},"611":{"position":[[1056,7]]},"612":{"position":[[622,8]]},"632":{"position":[[820,6],[1209,6]]},"653":{"position":[[60,8]]},"661":{"position":[[775,6],[1789,6]]},"662":{"position":[[1571,6],[2018,6],[2083,6],[2287,6]]},"667":{"position":[[18,8],[61,6]]},"668":{"position":[[254,6]]},"676":{"position":[[269,8]]},"680":{"position":[[512,6],[754,6]]},"693":{"position":[[169,6],[549,6]]},"698":{"position":[[1312,6],[2725,6]]},"700":{"position":[[783,6]]},"701":{"position":[[331,6],[418,8]]},"703":{"position":[[10,6]]},"705":{"position":[[11,8],[1241,8]]},"710":{"position":[[1512,6],[1662,6],[1776,6]]},"711":{"position":[[1082,6],[1203,6]]},"717":{"position":[[875,6],[958,8],[1109,6],[1251,6]]},"718":{"position":[[612,6]]},"719":{"position":[[316,7],[475,8]]},"724":{"position":[[337,6]]},"734":{"position":[[387,6],[560,6]]},"745":{"position":[[105,6],[466,6],[599,6]]},"749":{"position":[[3362,6],[5402,7],[13274,6],[22244,6]]},"752":{"position":[[72,8]]},"757":{"position":[[130,7]]},"759":{"position":[[317,6]]},"770":{"position":[[572,7]]},"776":{"position":[[128,7]]},"781":{"position":[[252,6]]},"784":{"position":[[182,6]]},"789":{"position":[[57,6]]},"793":{"position":[[954,8]]},"815":{"position":[[200,7]]},"817":{"position":[[251,8]]},"818":{"position":[[302,6]]},"829":{"position":[[175,7],[392,8],[1074,7],[3722,7]]},"830":{"position":[[301,8]]},"836":{"position":[[593,6],[825,6]]},"837":{"position":[[2021,6]]},"838":{"position":[[1888,6],[2158,6]]},"840":{"position":[[487,7]]},"848":{"position":[[1121,6]]},"851":{"position":[[60,6],[159,6],[236,6]]},"861":{"position":[[499,6],[921,6],[971,8],[1012,6],[1260,6],[2512,8]]},"862":{"position":[[485,6]]},"872":{"position":[[713,6],[792,6],[1341,6],[1387,6],[1663,6],[3641,6]]},"875":{"position":[[4156,7],[7826,6]]},"882":{"position":[[344,8]]},"885":{"position":[[143,6]]},"886":{"position":[[3235,6],[3278,6],[4960,6]]},"892":{"position":[[120,6]]},"898":{"position":[[66,6],[131,6],[830,6],[892,6],[1249,6],[1539,6],[1581,6],[2704,6]]},"904":{"position":[[273,6],[340,6],[384,6],[1028,8],[1227,8],[2324,6],[2449,6]]},"906":{"position":[[467,8],[626,6]]},"917":{"position":[[635,6]]},"932":{"position":[[854,6],[1376,6]]},"934":{"position":[[4,6],[830,6]]},"939":{"position":[[111,7]]},"952":{"position":[[22,6]]},"954":{"position":[[209,7]]},"955":{"position":[[180,6]]},"958":{"position":[[250,6],[282,6],[458,6],[727,8]]},"960":{"position":[[17,7]]},"964":{"position":[[25,6]]},"966":{"position":[[24,6],[759,6]]},"967":{"position":[[344,6]]},"971":{"position":[[22,6]]},"976":{"position":[[231,6]]},"977":{"position":[[386,8]]},"981":{"position":[[507,8]]},"987":{"position":[[593,6],[1101,6]]},"988":{"position":[[4881,8]]},"1007":{"position":[[269,6]]},"1009":{"position":[[768,8]]},"1013":{"position":[[60,6],[118,8]]},"1014":{"position":[[1,7]]},"1015":{"position":[[1,7]]},"1020":{"position":[[15,7]]},"1055":{"position":[[4,6]]},"1067":{"position":[[2328,8]]},"1068":{"position":[[106,8]]},"1069":{"position":[[392,6],[512,7]]},"1076":{"position":[[132,6]]},"1078":{"position":[[359,6],[784,6]]},"1080":{"position":[[859,6],[951,6]]},"1085":{"position":[[802,6],[2854,7],[2923,7],[3660,8],[3744,6]]},"1097":{"position":[[4,6],[162,6]]},"1102":{"position":[[278,8]]},"1103":{"position":[[6,8]]},"1108":{"position":[[22,7]]},"1114":{"position":[[23,7],[257,6],[399,6],[792,6],[875,6]]},"1117":{"position":[[175,7]]},"1119":{"position":[[333,8]]},"1125":{"position":[[806,6]]},"1126":{"position":[[119,8]]},"1135":{"position":[[278,6]]},"1138":{"position":[[117,8]]},"1144":{"position":[[149,6]]},"1148":{"position":[[683,6],[842,8],[1082,6]]},"1149":{"position":[[852,6]]},"1150":{"position":[[297,7]]},"1154":{"position":[[135,8],[669,6]]},"1158":{"position":[[157,6]]},"1163":{"position":[[457,6]]},"1164":{"position":[[346,7]]},"1165":{"position":[[254,8],[481,6],[611,7],[928,6]]},"1174":{"position":[[479,8],[773,8]]},"1182":{"position":[[461,6]]},"1189":{"position":[[178,8]]},"1194":{"position":[[151,6]]},"1198":{"position":[[144,7]]},"1208":{"position":[[96,6],[758,6],[849,7],[870,6],[980,7],[1001,6]]},"1209":{"position":[[253,7]]},"1213":{"position":[[767,6]]},"1219":{"position":[[56,6],[440,6],[607,6]]},"1222":{"position":[[1165,6],[1316,6]]},"1227":{"position":[[435,6]]},"1230":{"position":[[34,6],[245,6]]},"1231":{"position":[[926,6]]},"1238":{"position":[[50,6]]},"1239":{"position":[[9,6]]},"1246":{"position":[[1318,7],[1903,6],[2195,6]]},"1265":{"position":[[428,6]]},"1267":{"position":[[40,6]]},"1268":{"position":[[327,6]]},"1271":{"position":[[938,8],[1218,6],[1508,6]]},"1272":{"position":[[51,6],[324,8]]},"1277":{"position":[[120,6],[338,6]]},"1282":{"position":[[935,7]]},"1289":{"position":[[123,6]]},"1294":{"position":[[173,7],[460,6]]},"1296":{"position":[[325,6]]},"1297":{"position":[[65,8]]},"1301":{"position":[[744,6]]},"1308":{"position":[[556,6]]},"1309":{"position":[[414,6],[1320,8]]},"1311":{"position":[[66,6]]}},"keywords":{}}],["createblob",{"_index":3368,"title":{},"content":{"556":{"position":[[753,10]]},"754":{"position":[[203,10],[699,11]]},"917":{"position":[[90,10]]}},"keywords":{}}],["createblob('meowmeow",{"_index":5288,"title":{},"content":{"917":{"position":[[225,22]]}},"keywords":{}}],["createblob('sensit",{"_index":3371,"title":{},"content":{"556":{"position":[[967,21]]}},"keywords":{}}],["createblob(json.stringifi",{"_index":4666,"title":{},"content":{"800":{"position":[[930,29]]}},"keywords":{}}],["createcli",{"_index":5214,"title":{},"content":{"898":{"position":[[2983,12],[3052,13]]}},"keywords":{}}],["created.leverag",{"_index":3521,"title":{},"content":{"590":{"position":[[212,16]]}},"keywords":{}}],["createdat",{"_index":1904,"title":{},"content":{"316":{"position":[[333,10]]}},"keywords":{}}],["createdb",{"_index":1260,"title":{},"content":{"188":{"position":[[1594,8]]},"672":{"position":[[16,10]]},"673":{"position":[[59,10]]},"674":{"position":[[330,10]]}},"keywords":{}}],["createdb(databasenam",{"_index":1252,"title":{},"content":{"188":{"position":[[903,22]]}},"keywords":{}}],["createpassword",{"_index":4026,"title":{},"content":{"718":{"position":[[141,14]]}},"keywords":{}}],["createreactivityfactori",{"_index":4722,"title":{},"content":{"825":{"position":[[102,23]]}},"keywords":{}}],["createreactivityfactory(inject(injector",{"_index":846,"title":{},"content":{"55":{"position":[[955,41]]},"825":{"position":[[423,41]]}},"keywords":{}}],["createreactivityfactory(injector",{"_index":837,"title":{},"content":{"55":{"position":[[366,33]]}},"keywords":{}}],["createrestcli",{"_index":5939,"title":{},"content":{"1102":{"position":[[858,16]]}},"keywords":{}}],["createrestclient('http://localhost:80",{"_index":5941,"title":{},"content":{"1102":{"position":[[932,39]]}},"keywords":{}}],["createrxdatabas",{"_index":24,"title":{},"content":{"1":{"position":[[328,16],[536,18]]},"2":{"position":[[339,18]]},"3":{"position":[[219,18]]},"4":{"position":[[397,18]]},"5":{"position":[[307,18]]},"6":{"position":[[502,18],[681,18]]},"7":{"position":[[339,18],[516,18]]},"8":{"position":[[734,16],[1108,18]]},"9":{"position":[[253,18]]},"10":{"position":[[291,18]]},"11":{"position":[[817,18]]},"51":{"position":[[188,16],[699,18]]},"55":{"position":[[677,16],[873,18]]},"188":{"position":[[647,16],[970,18]]},"209":{"position":[[10,16],[242,18]]},"211":{"position":[[72,16],[212,18]]},"255":{"position":[[357,16],[589,18]]},"258":{"position":[[10,16],[150,18]]},"266":{"position":[[549,16],[664,18]]},"314":{"position":[[309,16],[475,18]]},"315":{"position":[[338,16],[538,18]]},"334":{"position":[[174,16],[333,18]]},"392":{"position":[[216,16],[343,18]]},"480":{"position":[[167,16],[368,18]]},"482":{"position":[[168,16],[613,18]]},"522":{"position":[[287,16],[414,18]]},"538":{"position":[[268,16],[429,18]]},"542":{"position":[[388,16],[534,18]]},"554":{"position":[[484,16],[1052,18]]},"562":{"position":[[10,16],[167,18]]},"563":{"position":[[207,16],[479,18]]},"564":{"position":[[195,16],[583,18]]},"579":{"position":[[176,16],[342,18]]},"598":{"position":[[276,16],[436,18]]},"632":{"position":[[1048,16],[1288,18]]},"638":{"position":[[430,18]]},"653":{"position":[[126,16],[253,18]]},"662":{"position":[[1634,16],[2126,18]]},"672":{"position":[[195,17]]},"673":{"position":[[201,17]]},"674":{"position":[[484,17]]},"680":{"position":[[539,16],[674,18]]},"693":{"position":[[1174,18]]},"710":{"position":[[1549,16],[1695,18]]},"717":{"position":[[1061,16],[1155,18]]},"718":{"position":[[658,18]]},"721":{"position":[[377,16]]},"732":{"position":[[118,17]]},"734":{"position":[[418,16],[480,18]]},"739":{"position":[[284,18]]},"745":{"position":[[529,18]]},"749":{"position":[[2762,16],[5563,19],[6208,19],[6463,19]]},"759":{"position":[[360,18]]},"772":{"position":[[615,17],[643,16],[770,18],[1430,16],[1615,18],[2138,16],[2377,18]]},"773":{"position":[[445,16],[560,18]]},"774":{"position":[[448,16],[662,18]]},"825":{"position":[[300,17],[341,18]]},"829":{"position":[[468,17],[639,18]]},"838":{"position":[[1951,16],[2204,18]]},"862":{"position":[[298,17],[539,18]]},"872":{"position":[[1549,17],[1713,18],[3784,16],[3971,18]]},"892":{"position":[[10,16],[177,20]]},"898":{"position":[[2174,16],[2321,18]]},"904":{"position":[[574,16],[714,18]]},"932":{"position":[[1043,18]]},"960":{"position":[[45,19],[142,16],[282,18]]},"962":{"position":[[753,18],[969,18]]},"966":{"position":[[537,18],[655,18]]},"967":{"position":[[122,18],[240,18]]},"968":{"position":[[507,18]]},"976":{"position":[[262,19]]},"1013":{"position":[[298,18]]},"1067":{"position":[[2377,18]]},"1088":{"position":[[606,19]]},"1090":{"position":[[782,18]]},"1114":{"position":[[441,17],[711,18]]},"1118":{"position":[[370,16],[645,18]]},"1121":{"position":[[451,18]]},"1125":{"position":[[134,16],[162,16],[287,18]]},"1126":{"position":[[367,18],[680,18]]},"1130":{"position":[[10,16],[160,18]]},"1134":{"position":[[10,16],[137,18]]},"1138":{"position":[[152,16],[281,18]]},"1139":{"position":[[250,16],[536,18]]},"1140":{"position":[[466,16],[595,18]]},"1144":{"position":[[38,16],[185,18]]},"1145":{"position":[[242,16],[525,18]]},"1146":{"position":[[230,18]]},"1148":{"position":[[528,16],[1124,18]]},"1149":{"position":[[805,16],[917,18]]},"1154":{"position":[[745,18]]},"1156":{"position":[[334,19]]},"1158":{"position":[[32,16],[193,18]]},"1159":{"position":[[218,16],[379,18]]},"1163":{"position":[[539,18]]},"1165":{"position":[[729,18],[1067,18]]},"1168":{"position":[[26,16],[141,18]]},"1172":{"position":[[10,16],[306,18]]},"1182":{"position":[[543,18]]},"1184":{"position":[[782,18]]},"1189":{"position":[[277,16],[404,18]]},"1201":{"position":[[10,16],[181,18]]},"1210":{"position":[[292,16],[421,18]]},"1211":{"position":[[541,16],[676,18]]},"1218":{"position":[[568,18]]},"1219":{"position":[[881,18]]},"1222":{"position":[[1392,18]]},"1226":{"position":[[10,16],[217,18]]},"1227":{"position":[[560,16],[695,18]]},"1231":{"position":[[607,17],[1026,18]]},"1237":{"position":[[839,18]]},"1238":{"position":[[814,18]]},"1239":{"position":[[784,18]]},"1264":{"position":[[10,16],[139,18]]},"1265":{"position":[[554,16],[683,18]]},"1267":{"position":[[617,18],[711,18]]},"1271":{"position":[[1570,18]]},"1274":{"position":[[10,16],[321,18]]},"1275":{"position":[[128,16],[332,18]]},"1276":{"position":[[400,16],[934,18]]},"1277":{"position":[[151,16],[381,18]]},"1278":{"position":[[254,16],[458,18],[706,16],[910,18]]},"1279":{"position":[[319,16],[708,18]]},"1280":{"position":[[250,16],[443,18]]},"1286":{"position":[[490,18]]},"1287":{"position":[[540,18]]},"1288":{"position":[[506,18]]}},"keywords":{}}],["createrxdatabase<mydatabasecollections>",{"_index":6498,"title":{},"content":{"1311":{"position":[[138,47]]}},"keywords":{}}],["createrxserv",{"_index":4959,"title":{},"content":{"872":{"position":[[3109,14],[3260,16]]},"1097":{"position":[[132,16],[340,14],[705,16]]},"1098":{"position":[[180,14],[341,16]]},"1099":{"position":[[162,14],[315,16]]}},"keywords":{}}],["createsyncaccesshandl",{"_index":2964,"title":{},"content":{"453":{"position":[[388,24]]},"460":{"position":[[1137,22]]},"464":{"position":[[1172,24]]},"468":{"position":[[351,24]]},"1207":{"position":[[449,24]]},"1211":{"position":[[5,22]]}},"keywords":{}}],["createwrit",{"_index":6236,"title":{},"content":{"1211":{"position":[[336,14]]}},"keywords":{}}],["creation",{"_index":782,"title":{"145":{"position":[[34,9]]},"960":{"position":[[0,9]]}},"content":{"51":{"position":[[939,8]]},"56":{"position":[[128,9]]},"145":{"position":[[205,9]]},"188":{"position":[[857,8]]},"590":{"position":[[102,9]]},"656":{"position":[[279,8]]},"715":{"position":[[137,8]]},"749":{"position":[[6652,8],[14433,9]]},"751":{"position":[[6,8]]},"752":{"position":[[490,8]]},"774":{"position":[[150,8]]},"829":{"position":[[94,9],[113,8]]},"830":{"position":[[218,9]]},"832":{"position":[[122,8]]},"989":{"position":[[288,8]]},"1013":{"position":[[815,9]]},"1085":{"position":[[897,8],[1004,9]]},"1119":{"position":[[184,9]]},"1161":{"position":[[269,8]]},"1175":{"position":[[234,9],[627,8]]},"1180":{"position":[[269,8]]},"1194":{"position":[[273,8]]}},"keywords":{}}],["creativ",{"_index":949,"title":{},"content":{"66":{"position":[[611,8]]}},"keywords":{}}],["credenti",{"_index":1401,"title":{},"content":{"218":{"position":[[132,11]]},"506":{"position":[[185,12]]},"550":{"position":[[204,12]]},"556":{"position":[[381,11],[435,13]]},"564":{"position":[[1071,12]]},"616":{"position":[[874,11]]},"846":{"position":[[492,12]]},"890":{"position":[[446,11],[593,10],[843,12]]},"1226":{"position":[[684,12]]},"1264":{"position":[[564,12]]}},"keywords":{}}],["credentials.password",{"_index":3365,"title":{},"content":{"556":{"position":[[458,21]]}},"keywords":{}}],["creditcard",{"_index":5840,"title":{},"content":{"1080":{"position":[[615,12]]}},"keywords":{}}],["criteria",{"_index":2887,"title":{},"content":{"427":{"position":[[1017,9]]},"430":{"position":[[258,9]]}},"keywords":{}}],["critic",{"_index":1238,"title":{},"content":{"184":{"position":[[23,8]]},"280":{"position":[[442,8]]},"302":{"position":[[617,8]]},"375":{"position":[[410,8]]},"399":{"position":[[453,8]]},"412":{"position":[[278,7],[383,11]]},"496":{"position":[[134,8]]},"497":{"position":[[793,8]]},"527":{"position":[[23,8]]},"556":{"position":[[1078,9]]},"802":{"position":[[863,8]]}},"keywords":{}}],["critical.serv",{"_index":3662,"title":{},"content":{"621":{"position":[[180,15]]}},"keywords":{}}],["crm",{"_index":2138,"title":{},"content":{"375":{"position":[[201,5]]},"411":{"position":[[901,3]]},"1009":{"position":[[328,4]]}},"keywords":{}}],["cross",{"_index":738,"title":{"254":{"position":[[3,5]]}},"content":{"47":{"position":[[858,5]]},"174":{"position":[[2579,5],[2781,5]]},"207":{"position":[[319,5]]},"269":{"position":[[139,5]]},"384":{"position":[[27,5]]},"445":{"position":[[2132,5],[2189,5]]},"446":{"position":[[1085,5],[1221,5]]},"447":{"position":[[440,5]]},"535":{"position":[[894,5]]},"548":{"position":[[366,5]]},"595":{"position":[[969,5]]},"608":{"position":[[364,5]]},"852":{"position":[[92,5],[137,6]]},"1072":{"position":[[1198,5],[1285,5],[1538,5]]},"1211":{"position":[[467,5]]}},"keywords":{}}],["crossfetch",{"_index":4861,"title":{},"content":{"852":{"position":[[121,10],[318,11]]}},"keywords":{}}],["crown",{"_index":4110,"title":{},"content":{"741":{"position":[[47,5]]},"742":{"position":[[64,5]]}},"keywords":{}}],["crucial",{"_index":924,"title":{},"content":{"65":{"position":[[1206,7]]},"68":{"position":[[220,8]]},"95":{"position":[[15,7]]},"218":{"position":[[15,7]]},"228":{"position":[[155,8]]},"270":{"position":[[294,8]]},"291":{"position":[[346,7]]},"301":{"position":[[516,7]]},"309":{"position":[[26,7]]},"343":{"position":[[72,7]]},"534":{"position":[[56,7]]},"564":{"position":[[1045,7]]},"569":{"position":[[227,7]]},"587":{"position":[[120,7]]},"594":{"position":[[54,7]]},"641":{"position":[[38,7]]},"723":{"position":[[2625,7]]}},"keywords":{}}],["crud",{"_index":784,"title":{"52":{"position":[[0,4]]},"539":{"position":[[0,4]]},"599":{"position":[[0,4]]}},"content":{"52":{"position":[[56,4]]},"57":{"position":[[15,4]]},"181":{"position":[[162,4]]},"539":{"position":[[56,4]]},"599":{"position":[[56,4]]},"1123":{"position":[[521,4]]}},"keywords":{}}],["crypto",{"_index":1121,"title":{"718":{"position":[[10,6]]}},"content":{"139":{"position":[[72,6]]},"291":{"position":[[459,6],[485,6]]},"315":{"position":[[31,6],[93,6],[143,6],[239,6]]},"482":{"position":[[368,6],[437,6]]},"483":{"position":[[1076,6]]},"551":{"position":[[448,6],[469,6]]},"553":{"position":[[108,6]]},"554":{"position":[[120,6],[181,6],[593,6]]},"556":{"position":[[1119,6]]},"564":{"position":[[304,6]]},"638":{"position":[[298,6]]},"717":{"position":[[69,6],[128,6],[174,6],[220,6],[327,6],[626,6]]},"718":{"position":[[36,8],[200,8]]},"1184":{"position":[[625,8]]},"1237":{"position":[[722,6]]}},"keywords":{}}],["crypto.subtl",{"_index":5402,"title":{},"content":{"968":{"position":[[123,13]]}},"keywords":{}}],["crypto.subtle.digest",{"_index":4146,"title":{},"content":{"749":{"position":[[1091,20]]},"968":{"position":[[793,21]]}},"keywords":{}}],["crypto.subtle.digest('sha",{"_index":5400,"title":{},"content":{"968":{"position":[[27,25]]}},"keywords":{}}],["cryptoj",{"_index":3343,"title":{},"content":{"553":{"position":[[61,8]]},"554":{"position":[[38,8],[287,8]]}},"keywords":{}}],["css",{"_index":1627,"title":{},"content":{"269":{"position":[[83,4]]}},"keywords":{}}],["ctr",{"_index":4033,"title":{},"content":{"718":{"position":[[512,4],[557,5]]}},"keywords":{}}],["cumbersom",{"_index":729,"title":{},"content":{"47":{"position":[[481,10]]},"784":{"position":[[410,10]]},"836":{"position":[[2192,11]]}},"keywords":{}}],["cumbersome.complex",{"_index":3295,"title":{},"content":{"535":{"position":[[236,22]]},"595":{"position":[[249,22]]}},"keywords":{}}],["cumul",{"_index":4669,"title":{},"content":{"802":{"position":[[221,12]]}},"keywords":{}}],["curb",{"_index":1700,"title":{},"content":{"298":{"position":[[24,4]]}},"keywords":{}}],["current",{"_index":1268,"title":{"300":{"position":[[14,7]]}},"content":{"188":{"position":[[2109,9]]},"365":{"position":[[341,7]]},"404":{"position":[[265,7]]},"411":{"position":[[4895,7]]},"455":{"position":[[297,7]]},"470":{"position":[[159,9]]},"610":{"position":[[1645,9]]},"613":{"position":[[561,9]]},"650":{"position":[[7,9]]},"653":{"position":[[1301,7]]},"681":{"position":[[59,7]]},"698":{"position":[[2396,7],[2474,7],[2692,7]]},"711":{"position":[[847,9]]},"717":{"position":[[6,9]]},"723":{"position":[[1255,7]]},"736":{"position":[[46,7],[228,7],[295,9]]},"781":{"position":[[392,9]]},"799":{"position":[[296,7]]},"829":{"position":[[3182,7]]},"838":{"position":[[130,7]]},"973":{"position":[[12,7]]},"988":{"position":[[1310,7]]},"1007":{"position":[[346,9]]},"1009":{"position":[[414,9]]},"1039":{"position":[[67,7]]},"1042":{"position":[[63,7]]},"1044":{"position":[[211,7]]},"1046":{"position":[[55,7]]},"1050":{"position":[[21,7]]},"1058":{"position":[[43,7]]},"1115":{"position":[[108,7],[266,7]]},"1133":{"position":[[297,9]]},"1188":{"position":[[61,9],[102,9]]},"1198":{"position":[[2033,9]]},"1304":{"position":[[205,7]]},"1305":{"position":[[907,9],[1038,9]]},"1307":{"position":[[110,9]]},"1316":{"position":[[3161,7]]}},"keywords":{}}],["cursor",{"_index":6045,"title":{"1294":{"position":[[8,7]]}},"content":{"1138":{"position":[[409,7]]},"1143":{"position":[[357,6]]},"1294":{"position":[[377,6],[1025,6],[1862,6],[2130,7]]},"1295":{"position":[[885,6]]},"1296":{"position":[[377,6],[1250,6],[1680,6]]}},"keywords":{}}],["custom",{"_index":241,"title":{"144":{"position":[[4,6]]},"209":{"position":[[30,6]]},"747":{"position":[[6,6]]},"818":{"position":[[8,6]]},"822":{"position":[[16,6]]},"826":{"position":[[10,6]]},"874":{"position":[[24,6]]},"882":{"position":[[0,6]]},"894":{"position":[[0,10]]},"1002":{"position":[[10,6]]},"1212":{"position":[[11,6]]},"1220":{"position":[[8,6]]},"1228":{"position":[[11,6]]},"1266":{"position":[[11,6]]},"1289":{"position":[[0,6]]},"1290":{"position":[[4,6]]},"1291":{"position":[[9,6]]},"1296":{"position":[[0,6]]},"1309":{"position":[[0,6]]}},"content":{"14":{"position":[[1139,6]]},"18":{"position":[[343,6]]},"39":{"position":[[537,13]]},"43":{"position":[[219,6]]},"55":{"position":[[79,6]]},"144":{"position":[[22,6]]},"147":{"position":[[212,9]]},"168":{"position":[[212,6]]},"188":{"position":[[318,6]]},"196":{"position":[[133,6]]},"202":{"position":[[278,6]]},"205":{"position":[[136,6]]},"209":{"position":[[603,6],[691,7]]},"249":{"position":[[208,6],[237,6]]},"250":{"position":[[186,6]]},"255":{"position":[[332,6],[943,6]]},"260":{"position":[[44,6]]},"287":{"position":[[180,14]]},"312":{"position":[[179,6]]},"344":{"position":[[146,6]]},"381":{"position":[[390,6]]},"383":{"position":[[425,6]]},"411":{"position":[[942,8],[1000,8],[1097,6]]},"412":{"position":[[1772,6],[2378,6],[2423,6],[4855,6],[5333,6],[12954,6]]},"419":{"position":[[1128,6]]},"469":{"position":[[241,6]]},"489":{"position":[[288,7]]},"522":{"position":[[738,6]]},"525":{"position":[[613,6]]},"551":{"position":[[359,6]]},"580":{"position":[[197,6]]},"602":{"position":[[78,6]]},"616":{"position":[[1098,6]]},"632":{"position":[[829,6]]},"635":{"position":[[286,6]]},"680":{"position":[[233,6]]},"685":{"position":[[189,6],[459,6]]},"686":{"position":[[445,6]]},"691":{"position":[[142,6]]},"701":{"position":[[1123,6]]},"747":{"position":[[41,6]]},"749":{"position":[[6608,6]]},"765":{"position":[[246,6]]},"770":{"position":[[232,6]]},"793":{"position":[[1055,6]]},"802":{"position":[[451,6]]},"815":{"position":[[307,6]]},"818":{"position":[[314,6],[380,6]]},"825":{"position":[[56,6]]},"826":{"position":[[173,6],[302,6]]},"831":{"position":[[506,6]]},"836":{"position":[[1999,6],[2090,6]]},"837":{"position":[[1448,6]]},"839":{"position":[[622,6]]},"840":{"position":[[559,6]]},"846":{"position":[[427,6],[744,6],[1170,6]]},"848":{"position":[[127,6],[577,6],[807,6],[950,6],[1442,6]]},"854":{"position":[[1376,6]]},"898":{"position":[[3621,9]]},"904":{"position":[[2458,6]]},"906":{"position":[[1061,6]]},"907":{"position":[[158,6]]},"908":{"position":[[189,6]]},"913":{"position":[[108,6]]},"934":{"position":[[515,6],[702,6],[780,6]]},"960":{"position":[[633,6]]},"987":{"position":[[993,6],[1110,6]]},"988":{"position":[[1662,6],[1988,6],[3108,6]]},"1002":{"position":[[134,6],[616,6],[1270,6]]},"1079":{"position":[[430,6]]},"1085":{"position":[[2188,6]]},"1117":{"position":[[100,6]]},"1118":{"position":[[49,6]]},"1143":{"position":[[367,6]]},"1149":{"position":[[277,6]]},"1177":{"position":[[5,6]]},"1204":{"position":[[5,6]]},"1220":{"position":[[45,6]]},"1228":{"position":[[12,6]]},"1229":{"position":[[165,6]]},"1266":{"position":[[29,6],[546,6],[576,6]]},"1268":{"position":[[377,6]]},"1289":{"position":[[46,6]]},"1296":{"position":[[499,6],[551,6],[848,6],[1056,6],[1116,8],[1195,6],[1440,6],[1610,6],[1731,6],[1862,6]]},"1309":{"position":[[423,6],[779,6],[1064,6],[1283,6]]},"1315":{"position":[[201,9],[257,8],[303,8],[434,8],[887,9],[1432,8]]},"1318":{"position":[[378,9],[423,10],[444,8],[612,8]]}},"keywords":{}}],["custom.work",{"_index":6330,"title":{},"content":{"1268":{"position":[[502,15]]}},"keywords":{}}],["custom.worker.t",{"_index":6328,"title":{},"content":{"1268":{"position":[[339,16],[552,16]]}},"keywords":{}}],["customer.city_id",{"_index":6532,"title":{},"content":{"1315":{"position":[[446,16]]}},"keywords":{}}],["customerdocu",{"_index":6536,"title":{},"content":{"1315":{"position":[[639,17]]}},"keywords":{}}],["customiz",{"_index":1596,"title":{},"content":{"263":{"position":[[178,12]]},"688":{"position":[[819,13]]}},"keywords":{}}],["customrequest",{"_index":6259,"title":{},"content":{"1220":{"position":[[431,15]]}},"keywords":{}}],["customrequesthandl",{"_index":6257,"title":{},"content":{"1220":{"position":[[131,20]]}},"keywords":{}}],["customrequesthandler(msg",{"_index":6258,"title":{},"content":{"1220":{"position":[[275,26]]}},"keywords":{}}],["cut",{"_index":1685,"title":{},"content":{"289":{"position":[[1624,7]]},"613":{"position":[[19,7]]},"902":{"position":[[860,3]]}},"keywords":{}}],["cvc",{"_index":5841,"title":{},"content":{"1080":{"position":[[684,4]]}},"keywords":{}}],["cycl",{"_index":2088,"title":{},"content":{"362":{"position":[[242,6]]},"611":{"position":[[232,7]]},"653":{"position":[[1076,5]]},"656":{"position":[[39,6],[476,6]]},"821":{"position":[[913,6]]},"989":{"position":[[223,7]]},"993":{"position":[[646,5]]},"994":{"position":[[107,5]]},"995":{"position":[[138,5]]},"996":{"position":[[19,5]]}},"keywords":{}}],["d",{"_index":3642,"title":{},"content":{"617":{"position":[[988,1]]},"982":{"position":[[218,1],[252,1],[473,1],[585,1]]},"987":{"position":[[621,1],[682,1],[722,1]]},"988":{"position":[[3377,1],[3385,1],[4706,1],[4714,2]]}},"keywords":{}}],["d.get('tim",{"_index":5520,"title":{},"content":{"995":{"position":[[1960,13]]}},"keywords":{}}],["d.point",{"_index":1137,"title":{},"content":{"143":{"position":[[561,10],[746,10]]}},"keywords":{}}],["damag",{"_index":5810,"title":{},"content":{"1074":{"position":[[565,6]]}},"keywords":{}}],["danger",{"_index":2707,"title":{},"content":{"412":{"position":[[6220,9]]},"670":{"position":[[232,10]]},"702":{"position":[[302,10]]},"749":{"position":[[3115,9]]},"995":{"position":[[776,9]]},"1177":{"position":[[77,9]]},"1204":{"position":[[78,9]]}},"keywords":{}}],["daniel",{"_index":2650,"title":{},"content":{"412":{"position":[[263,8]]}},"keywords":{}}],["dart",{"_index":1244,"title":{},"content":{"188":{"position":[[233,4],[2071,4],[2155,4],[2424,4]]}},"keywords":{}}],["dashboard",{"_index":1620,"title":{},"content":{"267":{"position":[[861,11],[950,11],[1550,11]]},"301":{"position":[[291,10]]},"375":{"position":[[479,11]]},"420":{"position":[[1424,9]]},"491":{"position":[[1846,11]]}},"keywords":{}}],["data",{"_index":6,"title":{"65":{"position":[[10,4]]},"86":{"position":[[28,4]]},"88":{"position":[[0,4]]},"90":{"position":[[53,5]]},"95":{"position":[[12,4]]},"97":{"position":[[0,4]]},"121":{"position":[[9,4]]},"123":{"position":[[0,4]]},"132":{"position":[[14,4]]},"139":{"position":[[20,5]]},"146":{"position":[[10,4]]},"147":{"position":[[0,4]]},"150":{"position":[[10,4],[63,4]]},"152":{"position":[[14,4]]},"153":{"position":[[22,4]]},"156":{"position":[[9,4]]},"158":{"position":[[0,4]]},"161":{"position":[[15,4]]},"163":{"position":[[14,4]]},"167":{"position":[[20,5]]},"182":{"position":[[9,4]]},"184":{"position":[[0,4]]},"190":{"position":[[14,4]]},"195":{"position":[[20,5]]},"213":{"position":[[45,4]]},"214":{"position":[[28,4]]},"218":{"position":[[30,5]]},"221":{"position":[[42,5]]},"270":{"position":[[21,4]]},"288":{"position":[[15,4]]},"294":{"position":[[34,5]]},"305":{"position":[[26,4]]},"311":{"position":[[12,4]]},"326":{"position":[[9,4]]},"328":{"position":[[0,4]]},"337":{"position":[[14,4]]},"343":{"position":[[20,5]]},"367":{"position":[[22,4]]},"381":{"position":[[9,4]]},"403":{"position":[[10,4]]},"417":{"position":[[0,4]]},"426":{"position":[[16,4]]},"476":{"position":[[13,4]]},"506":{"position":[[20,5]]},"515":{"position":[[9,4]]},"517":{"position":[[0,4]]},"525":{"position":[[14,4]]},"555":{"position":[[36,5]]},"559":{"position":[[16,4]]},"582":{"position":[[14,4]]},"586":{"position":[[20,5]]},"616":{"position":[[8,4]]},"634":{"position":[[23,4]]},"664":{"position":[[0,4]]},"705":{"position":[[23,5]]},"714":{"position":[[19,5]]},"750":{"position":[[17,4]]},"782":{"position":[[12,4]]},"787":{"position":[[7,4]]},"800":{"position":[[29,4]]},"900":{"position":[[40,4]]},"912":{"position":[[19,4]]},"986":{"position":[[0,4]]},"1022":{"position":[[18,4]]},"1024":{"position":[[18,4]]},"1115":{"position":[[8,4]]},"1116":{"position":[[10,5]]},"1184":{"position":[[29,5]]},"1237":{"position":[[13,4]]}},"content":{"1":{"position":[[67,4],[146,4]]},"3":{"position":[[34,4]]},"5":{"position":[[25,4]]},"6":{"position":[[55,4],[653,4]]},"7":{"position":[[49,4],[488,4]]},"11":{"position":[[1032,5]]},"14":{"position":[[496,4],[752,4]]},"16":{"position":[[190,4]]},"17":{"position":[[254,5],[453,5]]},"19":{"position":[[142,4],[1071,4]]},"20":{"position":[[60,4],[203,4]]},"24":{"position":[[292,4]]},"26":{"position":[[147,4]]},"28":{"position":[[158,5],[419,4]]},"29":{"position":[[147,4]]},"30":{"position":[[146,4]]},"31":{"position":[[112,4],[180,4]]},"34":{"position":[[199,4]]},"35":{"position":[[327,4]]},"37":{"position":[[49,4]]},"38":{"position":[[490,5],[507,4]]},"39":{"position":[[37,4],[318,4]]},"40":{"position":[[47,4],[172,4],[765,4]]},"41":{"position":[[186,4]]},"45":{"position":[[96,5],[158,4]]},"46":{"position":[[205,4],[271,4],[449,4],[570,4]]},"47":{"position":[[755,4],[905,4],[1146,4]]},"50":{"position":[[128,4]]},"54":{"position":[[34,4]]},"57":{"position":[[30,4],[89,4],[150,4],[285,4],[358,4]]},"58":{"position":[[277,4]]},"63":{"position":[[65,4],[219,4]]},"64":{"position":[[93,4]]},"65":{"position":[[48,4],[158,4],[285,4],[498,4],[808,4],[885,4],[1178,5],[1250,4],[1329,4],[1542,4],[1606,5],[1723,4],[1820,4]]},"66":{"position":[[301,4],[458,4],[558,4],[640,4]]},"68":{"position":[[47,4]]},"73":{"position":[[140,4]]},"75":{"position":[[99,4]]},"77":{"position":[[107,4]]},"78":{"position":[[48,4]]},"80":{"position":[[69,4],[130,4]]},"81":{"position":[[11,4]]},"82":{"position":[[104,4]]},"86":{"position":[[50,4]]},"87":{"position":[[101,4]]},"88":{"position":[[9,4]]},"89":{"position":[[164,4]]},"90":{"position":[[120,4],[145,4],[233,5]]},"92":{"position":[[195,4]]},"93":{"position":[[9,4],[96,4]]},"95":{"position":[[33,4],[161,4],[245,5]]},"97":{"position":[[6,4],[152,5],[168,4]]},"99":{"position":[[122,4],[239,4],[369,4]]},"103":{"position":[[87,4],[161,4]]},"106":{"position":[[134,4]]},"108":{"position":[[119,4]]},"109":{"position":[[57,4],[186,4]]},"110":{"position":[[51,4],[166,4]]},"111":{"position":[[197,4]]},"112":{"position":[[248,4]]},"113":{"position":[[155,4]]},"114":{"position":[[528,4]]},"117":{"position":[[128,5],[185,5]]},"120":{"position":[[191,4],[260,4],[290,4]]},"121":{"position":[[48,4],[143,4],[204,4]]},"122":{"position":[[164,4]]},"123":{"position":[[36,4],[113,4],[239,4]]},"124":{"position":[[168,4],[276,4]]},"125":{"position":[[173,4]]},"126":{"position":[[343,4]]},"129":{"position":[[69,4],[99,4]]},"130":{"position":[[321,4]]},"131":{"position":[[54,5],[580,5],[887,4]]},"132":{"position":[[1,4],[150,4],[203,4]]},"133":{"position":[[158,4]]},"134":{"position":[[84,4]]},"135":{"position":[[29,4],[147,4]]},"136":{"position":[[100,4]]},"138":{"position":[[127,4]]},"139":{"position":[[53,4],[127,4],[200,5]]},"140":{"position":[[60,4],[159,4]]},"141":{"position":[[294,5]]},"146":{"position":[[48,4],[232,4]]},"147":{"position":[[19,4]]},"148":{"position":[[82,4],[138,4]]},"151":{"position":[[187,4]]},"152":{"position":[[145,4],[204,4],[241,4],[269,4]]},"153":{"position":[[26,4],[54,4],[247,4],[370,4]]},"155":{"position":[[35,4],[122,5],[167,4],[268,4]]},"156":{"position":[[54,4],[116,4],[263,4]]},"157":{"position":[[156,4],[340,4]]},"158":{"position":[[32,4],[145,4],[205,4]]},"159":{"position":[[102,5],[170,4],[237,4],[358,5]]},"160":{"position":[[133,4]]},"161":{"position":[[18,4],[213,4],[371,4]]},"162":{"position":[[613,4]]},"164":{"position":[[148,4],[344,4]]},"165":{"position":[[89,4],[270,4]]},"166":{"position":[[136,4]]},"167":{"position":[[20,4],[91,5],[115,4]]},"168":{"position":[[91,4]]},"169":{"position":[[199,4]]},"170":{"position":[[30,4],[188,4],[323,4]]},"173":{"position":[[75,4],[144,5],[380,4],[706,5],[828,4],[896,5],[922,4],[1011,4],[1151,4],[1237,4],[1418,4],[1549,4],[1659,4],[1720,4],[2780,4],[2878,4],[2924,4],[3207,4]]},"174":{"position":[[330,4],[509,4],[1109,4],[1913,4],[2274,4]]},"175":{"position":[[541,4]]},"178":{"position":[[136,5],[195,4],[286,5]]},"181":{"position":[[287,4]]},"182":{"position":[[50,4],[187,4]]},"183":{"position":[[160,4],[324,4]]},"184":{"position":[[1,4],[154,4],[280,4]]},"185":{"position":[[116,4],[212,5]]},"186":{"position":[[291,4],[319,4]]},"188":{"position":[[256,4],[401,5]]},"189":{"position":[[75,4],[250,4],[443,4],[526,4],[636,4]]},"190":{"position":[[64,4]]},"191":{"position":[[44,4],[238,4]]},"192":{"position":[[75,4],[360,4]]},"194":{"position":[[201,4]]},"195":{"position":[[11,4],[72,5],[96,4]]},"196":{"position":[[58,4],[246,4]]},"198":{"position":[[124,4],[159,4],[396,4]]},"201":{"position":[[86,5],[279,4]]},"202":{"position":[[139,4]]},"203":{"position":[[46,4],[367,4]]},"204":{"position":[[353,5]]},"205":{"position":[[103,4],[279,4]]},"206":{"position":[[121,5]]},"208":{"position":[[44,4]]},"210":{"position":[[130,4]]},"212":{"position":[[674,4]]},"215":{"position":[[32,4],[157,4]]},"216":{"position":[[95,4],[310,4]]},"217":{"position":[[9,4],[87,4],[153,4],[367,4]]},"218":{"position":[[33,4],[113,5],[255,4]]},"219":{"position":[[354,4]]},"220":{"position":[[313,4]]},"221":{"position":[[64,4],[89,4],[218,4]]},"223":{"position":[[278,4]]},"226":{"position":[[76,4],[188,4],[260,4],[289,4]]},"229":{"position":[[143,4]]},"231":{"position":[[67,4],[248,4]]},"233":{"position":[[161,5]]},"236":{"position":[[219,4],[339,4]]},"237":{"position":[[50,4],[154,4],[264,4]]},"240":{"position":[[35,4],[288,4]]},"241":{"position":[[443,4],[558,4],[716,4]]},"248":{"position":[[97,4]]},"249":{"position":[[91,4],[380,4]]},"250":{"position":[[137,4],[316,4]]},"251":{"position":[[173,4]]},"252":{"position":[[123,4]]},"253":{"position":[[182,4]]},"254":{"position":[[313,4]]},"255":{"position":[[1770,4]]},"261":{"position":[[174,4],[1101,4],[1190,4]]},"262":{"position":[[384,5]]},"263":{"position":[[94,4],[349,4]]},"265":{"position":[[160,4],[430,4],[704,4],[929,4]]},"266":{"position":[[160,4],[312,4],[487,4]]},"267":{"position":[[532,4],[992,4]]},"270":{"position":[[22,4],[263,4]]},"271":{"position":[[53,4]]},"273":{"position":[[109,4]]},"274":{"position":[[93,4],[228,5],[301,5]]},"275":{"position":[[166,4]]},"276":{"position":[[82,5],[249,5],[325,4]]},"277":{"position":[[137,4]]},"279":{"position":[[77,4],[121,4],[213,5],[497,4]]},"280":{"position":[[173,4],[335,4]]},"281":{"position":[[237,4]]},"282":{"position":[[380,4]]},"283":{"position":[[94,4],[246,4],[464,4]]},"284":{"position":[[95,4]]},"285":{"position":[[326,4]]},"286":{"position":[[421,4]]},"287":{"position":[[223,4],[537,4],[775,4],[868,4],[955,4],[978,4],[1020,4]]},"288":{"position":[[11,4],[121,4],[330,4]]},"289":{"position":[[99,4],[186,4],[296,4],[381,4],[552,4],[670,4],[864,4],[967,4],[1079,4],[1279,4],[1649,4],[1934,4]]},"290":{"position":[[37,4],[223,4]]},"291":{"position":[[93,5],[115,4],[327,4]]},"292":{"position":[[173,4],[350,4]]},"293":{"position":[[10,4],[213,4],[343,4],[416,4]]},"294":{"position":[[68,4],[106,4],[318,4]]},"295":{"position":[[359,4]]},"299":{"position":[[990,4],[1512,4]]},"300":{"position":[[604,4]]},"301":{"position":[[89,4],[188,4]]},"302":{"position":[[185,5],[315,4],[555,5],[1003,4]]},"303":{"position":[[163,4],[273,5],[1004,4],[1138,5],[1172,4],[1397,4]]},"305":{"position":[[11,4],[89,4],[402,5],[510,4],[602,5]]},"306":{"position":[[171,4]]},"309":{"position":[[147,4]]},"310":{"position":[[20,4],[131,4],[170,4],[233,4]]},"311":{"position":[[21,4]]},"315":{"position":[[17,5],[1064,4]]},"316":{"position":[[521,4]]},"317":{"position":[[86,4]]},"318":{"position":[[89,4],[656,5]]},"320":{"position":[[364,4]]},"321":{"position":[[9,4],[76,4],[143,4],[249,4],[497,4]]},"322":{"position":[[135,4]]},"323":{"position":[[10,4],[68,4],[251,4],[602,4]]},"325":{"position":[[50,4]]},"326":{"position":[[70,4],[214,4]]},"327":{"position":[[156,4]]},"328":{"position":[[25,4],[245,4]]},"329":{"position":[[71,4]]},"331":{"position":[[85,5]]},"335":{"position":[[49,4],[850,4]]},"336":{"position":[[356,4]]},"338":{"position":[[81,4]]},"339":{"position":[[190,4]]},"340":{"position":[[12,4],[179,5]]},"342":{"position":[[80,4]]},"343":{"position":[[36,4]]},"344":{"position":[[34,4],[172,4]]},"345":{"position":[[9,4]]},"346":{"position":[[229,5],[312,4],[771,4],[793,4]]},"350":{"position":[[11,4],[327,5]]},"351":{"position":[[176,4]]},"352":{"position":[[63,5],[210,5]]},"353":{"position":[[284,4]]},"354":{"position":[[100,4],[228,4],[589,4],[1618,5]]},"356":{"position":[[40,5],[419,4],[762,4]]},"357":{"position":[[33,5]]},"358":{"position":[[601,4],[829,5]]},"360":{"position":[[373,4],[799,4]]},"361":{"position":[[115,4],[1066,4]]},"362":{"position":[[91,4],[483,4]]},"364":{"position":[[104,4],[190,4],[305,4],[472,5],[541,4],[587,4],[671,4],[820,4]]},"365":{"position":[[210,4],[242,4],[308,4],[403,4],[581,4],[613,4],[760,4],[1169,4],[1282,4],[1330,4],[1456,4]]},"366":{"position":[[161,5],[215,4],[435,4]]},"367":{"position":[[107,4],[165,4],[366,4],[525,4]]},"369":{"position":[[103,5],[190,5],[293,4],[702,4],[860,4],[908,4],[983,5],[1064,4],[1173,4],[1288,4]]},"370":{"position":[[187,4]]},"371":{"position":[[106,5],[275,4]]},"372":{"position":[[89,5],[293,4],[352,4]]},"373":{"position":[[455,4],[575,4],[744,4]]},"375":{"position":[[245,5],[474,4],[661,4]]},"376":{"position":[[267,4],[566,4]]},"377":{"position":[[9,4],[381,4]]},"378":{"position":[[171,4]]},"379":{"position":[[91,4]]},"380":{"position":[[173,5]]},"382":{"position":[[33,4],[127,4],[208,4],[380,4]]},"383":{"position":[[135,4]]},"384":{"position":[[468,4]]},"385":{"position":[[22,4]]},"386":{"position":[[235,4]]},"390":{"position":[[80,4],[209,5],[444,4],[904,4],[1570,4]]},"391":{"position":[[1131,5]]},"392":{"position":[[110,4],[909,5],[1248,4],[2973,4]]},"395":{"position":[[304,4]]},"396":{"position":[[141,4],[986,4]]},"398":{"position":[[3530,5]]},"402":{"position":[[1561,4],[2520,4]]},"403":{"position":[[133,4],[413,5]]},"407":{"position":[[51,4],[187,4],[500,4],[646,5],[775,5],[1171,5]]},"408":{"position":[[412,5],[934,5],[1909,4],[2117,5],[2290,4],[2531,5],[2801,4],[3133,4],[3405,4],[3856,4],[5527,4]]},"410":{"position":[[354,4],[521,4],[648,5],[738,4],[800,4],[863,4],[1369,4],[1499,4],[2116,4]]},"411":{"position":[[91,4],[454,4],[804,5],[863,4],[932,4],[1040,4],[1366,4],[1429,5],[2761,4],[2805,4],[2874,4],[3251,4],[3733,4],[4129,5],[4343,4],[4651,4],[5005,4],[5052,5]]},"412":{"position":[[506,4],[528,4],[676,4],[1712,4],[2726,4],[3039,5],[3707,4],[4028,4],[5730,4],[5924,4],[6007,5],[6058,4],[6651,4],[6665,4],[6712,4],[6952,4],[7044,4],[7073,4],[7186,4],[7382,4],[7466,4],[7515,4],[7604,4],[7698,4],[7803,4],[7907,4],[8017,5],[8167,4],[8280,4],[8430,4],[8630,5],[8670,4],[8800,4],[10180,4],[11063,4],[11573,4],[11724,4],[12111,4],[12192,4],[12276,4],[12355,4],[12364,4],[12738,4],[13125,4],[13379,4],[13413,4],[13796,4],[14089,4],[14373,4],[14973,4],[15173,4]]},"414":{"position":[[421,5]]},"415":{"position":[[22,4]]},"416":{"position":[[50,4],[366,4]]},"417":{"position":[[44,4],[137,4],[264,4],[432,5]]},"418":{"position":[[338,4]]},"419":{"position":[[478,4],[806,4],[1004,4],[1907,4]]},"421":{"position":[[449,4],[644,4]]},"424":{"position":[[114,4],[256,4],[273,4]]},"425":{"position":[[257,4],[336,4],[424,4],[499,4]]},"426":{"position":[[98,4],[221,4]]},"427":{"position":[[407,4],[565,4],[615,4],[668,4],[715,4],[994,4],[1088,4]]},"429":{"position":[[328,4],[403,4]]},"430":{"position":[[164,4],[235,4],[344,4],[585,4],[906,4],[997,4],[1044,4],[1144,5]]},"432":{"position":[[70,4],[1371,4]]},"434":{"position":[[47,4],[159,5],[374,4]]},"435":{"position":[[64,4],[373,4]]},"436":{"position":[[20,4],[142,4],[278,4]]},"437":{"position":[[247,4]]},"438":{"position":[[362,4]]},"439":{"position":[[154,5],[187,4],[473,4]]},"440":{"position":[[155,4],[353,4]]},"441":{"position":[[96,4],[345,4]]},"442":{"position":[[30,4]]},"444":{"position":[[70,4],[551,4],[685,5],[897,4]]},"445":{"position":[[311,4],[555,4],[700,4],[772,4],[800,4],[860,4],[1384,4],[1503,5]]},"446":{"position":[[679,4],[761,4],[846,4],[912,4],[962,4]]},"447":{"position":[[146,4],[303,4]]},"450":{"position":[[92,4],[444,4]]},"451":{"position":[[338,4],[436,4],[781,4],[855,4]]},"452":{"position":[[152,5]]},"453":{"position":[[157,4],[220,4],[442,4],[754,4]]},"454":{"position":[[860,4],[1027,4]]},"455":{"position":[[183,4]]},"457":{"position":[[16,4],[465,5]]},"458":{"position":[[333,4]]},"459":{"position":[[51,4],[103,4],[1195,5]]},"460":{"position":[[20,4],[667,4]]},"461":{"position":[[38,4],[1351,4]]},"463":{"position":[[26,5],[616,4],[917,4],[1014,4],[1109,4],[1256,4]]},"464":{"position":[[86,4],[161,4],[622,4],[802,4],[862,4],[971,4]]},"466":{"position":[[298,4],[493,4]]},"467":{"position":[[592,5]]},"468":{"position":[[290,5]]},"469":{"position":[[925,4],[1060,4]]},"470":{"position":[[141,4],[376,4]]},"473":{"position":[[46,4]]},"475":{"position":[[25,4],[145,4]]},"476":{"position":[[68,4]]},"477":{"position":[[158,4]]},"478":{"position":[[110,4]]},"479":{"position":[[278,4]]},"480":{"position":[[976,4]]},"481":{"position":[[120,4]]},"482":{"position":[[7,4],[828,6]]},"483":{"position":[[107,4],[441,5]]},"489":{"position":[[615,4],[751,4]]},"490":{"position":[[250,4]]},"491":{"position":[[182,4],[475,5],[804,4]]},"494":{"position":[[259,4],[620,5]]},"495":{"position":[[155,5],[755,4]]},"496":{"position":[[115,5],[143,4]]},"501":{"position":[[37,4],[194,4]]},"502":{"position":[[120,4],[338,4],[500,4],[542,4],[775,4],[1210,4],[1383,4]]},"503":{"position":[[221,4]]},"504":{"position":[[238,4],[372,4],[408,4],[476,4],[544,4],[614,4],[820,4],[948,4],[1011,4],[1105,4],[1213,4],[1351,4]]},"506":{"position":[[54,5],[70,4],[245,5]]},"507":{"position":[[125,4]]},"508":{"position":[[163,4]]},"509":{"position":[[59,4]]},"510":{"position":[[407,4]]},"513":{"position":[[98,4],[280,4],[334,4]]},"514":{"position":[[228,4],[360,4]]},"515":{"position":[[61,4],[136,4],[264,4],[318,4]]},"516":{"position":[[125,4],[363,4]]},"517":{"position":[[1,4],[146,4]]},"518":{"position":[[48,4],[234,4],[375,5]]},"519":{"position":[[157,4],[240,4]]},"520":{"position":[[240,4],[492,5]]},"521":{"position":[[537,4]]},"523":{"position":[[68,4],[182,4]]},"524":{"position":[[354,4],[515,4],[612,4]]},"525":{"position":[[270,4],[451,4]]},"526":{"position":[[21,4],[77,5],[97,4],[265,4]]},"527":{"position":[[204,4]]},"529":{"position":[[84,4]]},"530":{"position":[[58,4],[365,4],[535,4]]},"533":{"position":[[76,4],[258,4]]},"534":{"position":[[212,4],[323,4],[375,4],[461,4],[584,4]]},"535":{"position":[[1023,4]]},"540":{"position":[[35,4]]},"541":{"position":[[157,4],[849,4]]},"542":{"position":[[986,4]]},"544":{"position":[[61,4],[112,4],[243,4],[265,4],[303,4]]},"545":{"position":[[202,4]]},"550":{"position":[[109,5],[191,4],[335,4]]},"551":{"position":[[53,5],[244,4],[491,4]]},"554":{"position":[[1312,4]]},"555":{"position":[[50,4],[252,4],[372,5],[401,4],[609,5],[625,4],[684,5],[992,4]]},"556":{"position":[[961,5],[1216,4],[1666,4],[1695,4],[1796,4]]},"557":{"position":[[508,4]]},"559":{"position":[[178,5],[1037,5],[1146,4],[1381,5],[1637,5],[1649,4]]},"560":{"position":[[262,4],[324,4]]},"561":{"position":[[6,4]]},"562":{"position":[[872,4],[1273,4],[1670,4]]},"564":{"position":[[72,4],[965,4],[1120,4]]},"565":{"position":[[40,4]]},"566":{"position":[[454,4],[605,4],[642,4],[705,5],[764,5],[1297,4]]},"567":{"position":[[700,4],[1001,4],[1195,4]]},"569":{"position":[[729,5]]},"570":{"position":[[285,4],[477,4],[690,4]]},"571":{"position":[[158,4],[176,4],[246,4],[327,4],[1534,4]]},"574":{"position":[[300,4],[479,4],[504,4],[618,4]]},"575":{"position":[[304,4],[348,4],[461,4]]},"576":{"position":[[134,4],[371,4],[418,4]]},"580":{"position":[[89,4]]},"581":{"position":[[111,4],[360,4]]},"582":{"position":[[43,4]]},"584":{"position":[[144,4]]},"585":{"position":[[25,5]]},"586":{"position":[[84,5],[95,4]]},"589":{"position":[[72,4]]},"590":{"position":[[329,4],[625,4],[902,4]]},"593":{"position":[[76,4],[258,4]]},"594":{"position":[[210,4],[321,4],[373,4],[459,4],[582,4]]},"595":{"position":[[392,4],[1100,4],[1353,4]]},"600":{"position":[[35,4],[169,4]]},"601":{"position":[[62,4],[830,4]]},"602":{"position":[[166,4]]},"604":{"position":[[61,4],[112,4],[151,4],[215,4],[256,4]]},"605":{"position":[[202,4]]},"610":{"position":[[269,4],[392,4],[665,4],[1056,6]]},"611":{"position":[[181,4],[263,4],[452,4]]},"612":{"position":[[347,4],[1605,4],[2016,6],[2074,6],[2105,6]]},"613":{"position":[[180,4],[224,4],[311,4]]},"614":{"position":[[353,4]]},"616":{"position":[[48,4],[103,4],[124,4],[271,4],[408,4],[592,4],[690,4],[784,4],[1187,4]]},"617":{"position":[[1305,4]]},"618":{"position":[[607,4],[702,5]]},"621":{"position":[[163,4],[451,4]]},"622":{"position":[[150,4]]},"624":{"position":[[1258,4]]},"626":{"position":[[770,5]]},"630":{"position":[[243,4],[697,5],[967,4]]},"631":{"position":[[293,4],[358,4],[449,4]]},"632":{"position":[[276,5],[497,4]]},"635":{"position":[[483,4]]},"636":{"position":[[155,4],[252,4]]},"638":{"position":[[14,4],[884,4]]},"639":{"position":[[7,4]]},"640":{"position":[[415,5]]},"641":{"position":[[18,4]]},"642":{"position":[[147,4]]},"643":{"position":[[194,4]]},"644":{"position":[[230,4],[528,4]]},"659":{"position":[[113,5],[313,5],[736,4],[991,4]]},"660":{"position":[[314,4],[365,4],[404,4]]},"661":{"position":[[1704,4],[1750,4]]},"662":{"position":[[474,4],[575,4],[669,4]]},"664":{"position":[[0,4]]},"685":{"position":[[119,4],[275,4],[594,4]]},"686":{"position":[[380,4],[431,4],[539,4],[930,4]]},"688":{"position":[[324,4],[944,4]]},"689":{"position":[[486,4]]},"690":{"position":[[92,4],[332,4]]},"691":{"position":[[195,4]]},"693":{"position":[[644,5]]},"696":{"position":[[8,4],[299,5],[622,4],[769,5],[981,4],[1574,4],[1936,5]]},"697":{"position":[[6,4],[146,4],[259,5],[345,5],[577,4]]},"698":{"position":[[3042,4]]},"700":{"position":[[717,4]]},"701":{"position":[[581,4],[626,4]]},"702":{"position":[[67,4]]},"703":{"position":[[65,4],[587,4],[739,4],[925,5],[1484,4]]},"704":{"position":[[497,4]]},"705":{"position":[[483,5],[682,4],[958,5]]},"707":{"position":[[496,5]]},"709":{"position":[[209,4],[790,4]]},"710":{"position":[[547,4]]},"711":{"position":[[147,4],[352,4],[590,5],[678,5],[1705,4],[2064,4],[2146,4]]},"714":{"position":[[47,4],[204,5],[242,4],[707,4],[894,4]]},"716":{"position":[[127,5],[373,5]]},"720":{"position":[[26,4],[250,4]]},"723":{"position":[[356,4],[437,4],[1276,4],[1814,4]]},"724":{"position":[[787,4]]},"736":{"position":[[158,5],[390,4]]},"737":{"position":[[145,4]]},"749":{"position":[[3324,5],[11908,4],[11985,4],[12091,4],[13325,4],[16583,4],[16750,4],[21898,4]]},"751":{"position":[[316,4],[378,5],[581,4],[992,4],[1087,4],[1683,4]]},"752":{"position":[[183,4]]},"754":{"position":[[605,4],[653,5]]},"759":{"position":[[1117,4],[1281,4],[1377,4]]},"764":{"position":[[51,4]]},"766":{"position":[[26,4],[154,4]]},"767":{"position":[[29,4]]},"772":{"position":[[59,4],[1144,4],[1333,4],[1965,4]]},"773":{"position":[[114,4],[217,4],[240,4]]},"774":{"position":[[93,5],[176,4],[235,4]]},"775":{"position":[[85,4]]},"778":{"position":[[88,5]]},"779":{"position":[[311,4],[379,4]]},"780":{"position":[[653,4]]},"781":{"position":[[78,5],[113,4],[708,4],[878,4]]},"782":{"position":[[342,5],[358,4]]},"784":{"position":[[74,4],[223,4],[764,4]]},"785":{"position":[[1,4],[378,4],[581,4],[716,4]]},"786":{"position":[[30,4]]},"792":{"position":[[370,5]]},"798":{"position":[[253,4],[288,4],[521,5]]},"800":{"position":[[699,4],[924,5]]},"801":{"position":[[294,4],[387,4],[637,4]]},"802":{"position":[[829,4]]},"806":{"position":[[528,4]]},"816":{"position":[[116,4]]},"820":{"position":[[696,4]]},"821":{"position":[[626,4]]},"826":{"position":[[16,4]]},"829":{"position":[[2180,5],[2800,4]]},"832":{"position":[[182,4]]},"835":{"position":[[841,4],[1069,5]]},"836":{"position":[[759,4],[1479,4],[1576,4],[1768,4],[1855,4],[1937,4],[2124,4],[2276,4],[2430,4]]},"838":{"position":[[497,4],[830,4],[1031,4],[1131,4],[1251,4],[3368,4]]},"839":{"position":[[277,4],[960,4],[1264,4]]},"840":{"position":[[62,4]]},"841":{"position":[[949,4],[1375,5],[1480,4]]},"856":{"position":[[205,4]]},"860":{"position":[[261,4],[353,4]]},"861":{"position":[[2277,4]]},"865":{"position":[[97,4]]},"875":{"position":[[1804,4],[3434,4],[7110,4]]},"880":{"position":[[23,4]]},"882":{"position":[[248,5]]},"885":{"position":[[333,4]]},"886":{"position":[[1440,4],[2264,5]]},"887":{"position":[[188,4]]},"890":{"position":[[503,4]]},"897":{"position":[[483,4]]},"901":{"position":[[148,4],[777,4]]},"902":{"position":[[53,4],[380,4],[449,4],[723,4]]},"903":{"position":[[26,4],[162,4],[224,4],[463,4]]},"904":{"position":[[450,4]]},"908":{"position":[[168,4]]},"912":{"position":[[20,4],[123,4],[417,4],[595,4],[679,4]]},"916":{"position":[[262,4]]},"917":{"position":[[219,5],[280,4],[357,4]]},"918":{"position":[[156,5]]},"926":{"position":[[19,4]]},"927":{"position":[[29,4],[203,4]]},"930":{"position":[[51,4]]},"931":{"position":[[51,4]]},"932":{"position":[[51,4],[136,4],[468,4]]},"941":{"position":[[75,4]]},"954":{"position":[[19,4]]},"955":{"position":[[165,5],[287,5]]},"958":{"position":[[396,4]]},"961":{"position":[[145,4],[319,5]]},"962":{"position":[[637,4]]},"968":{"position":[[59,5]]},"971":{"position":[[63,4],[164,4]]},"976":{"position":[[216,5],[286,4]]},"977":{"position":[[260,4],[349,4],[460,4]]},"981":{"position":[[973,4],[1033,4],[1159,4],[1454,4]]},"986":{"position":[[622,4],[1169,4]]},"988":{"position":[[1721,4],[1955,4],[1967,4],[4987,4]]},"990":{"position":[[347,4],[447,4],[659,5]]},"995":{"position":[[88,4]]},"1004":{"position":[[208,4],[250,5],[351,4],[419,4],[558,5],[705,5]]},"1005":{"position":[[81,4]]},"1007":{"position":[[771,5],[986,4]]},"1009":{"position":[[104,4]]},"1014":{"position":[[247,4],[386,4]]},"1015":{"position":[[223,4]]},"1018":{"position":[[120,4],[168,4],[236,4],[418,4],[687,4],[871,4]]},"1020":{"position":[[294,4]]},"1021":{"position":[[106,4],[132,5]]},"1023":{"position":[[51,4]]},"1024":{"position":[[24,4],[138,4],[257,6],[522,5]]},"1033":{"position":[[157,5],[1047,4]]},"1042":{"position":[[21,4],[71,4]]},"1043":{"position":[[52,5]]},"1048":{"position":[[612,5]]},"1051":{"position":[[24,4]]},"1063":{"position":[[36,4]]},"1067":{"position":[[97,4],[722,4],[863,5],[1100,4],[1864,4]]},"1068":{"position":[[401,4]]},"1072":{"position":[[335,5],[577,4],[729,4],[1000,5],[2134,4],[2288,4]]},"1078":{"position":[[101,5]]},"1085":{"position":[[65,4],[489,4],[713,5],[1081,4],[1526,4],[2970,4],[3378,4]]},"1088":{"position":[[500,4]]},"1092":{"position":[[199,4],[302,4]]},"1100":{"position":[[145,4]]},"1101":{"position":[[73,4]]},"1102":{"position":[[57,4],[242,4]]},"1104":{"position":[[49,4],[168,4],[336,4],[357,5],[399,4],[426,4],[795,4]]},"1105":{"position":[[152,4],[502,4],[1136,4],[1177,4],[1234,4]]},"1106":{"position":[[298,4]]},"1108":{"position":[[712,4]]},"1115":{"position":[[9,4]]},"1116":{"position":[[105,5],[204,4],[328,4]]},"1120":{"position":[[121,4]]},"1121":{"position":[[19,4],[117,4]]},"1124":{"position":[[492,4],[2043,4],[2140,4]]},"1126":{"position":[[864,4]]},"1132":{"position":[[238,4],[354,4],[395,4],[497,5],[643,4],[717,4],[1018,4],[1078,4],[1248,5],[1290,5],[1454,4],[1505,4]]},"1140":{"position":[[77,4],[263,4]]},"1143":{"position":[[266,4]]},"1147":{"position":[[19,4],[336,4]]},"1149":{"position":[[222,4]]},"1150":{"position":[[89,4],[625,4]]},"1156":{"position":[[176,4]]},"1157":{"position":[[313,4],[541,4]]},"1161":{"position":[[140,4]]},"1162":{"position":[[320,4],[473,4],[628,4]]},"1170":{"position":[[36,4],[124,4],[215,4]]},"1171":{"position":[[172,4],[356,4]]},"1172":{"position":[[144,4]]},"1173":{"position":[[70,5]]},"1174":{"position":[[127,4],[299,4],[604,5]]},"1180":{"position":[[140,4],[324,4]]},"1181":{"position":[[65,4],[407,4],[560,4],[616,4],[716,4]]},"1184":{"position":[[143,4]]},"1191":{"position":[[249,5],[311,4]]},"1192":{"position":[[299,4],[443,4],[575,4]]},"1207":{"position":[[611,4],[682,4],[713,4]]},"1208":{"position":[[250,5],[1288,4]]},"1213":{"position":[[333,4]]},"1214":{"position":[[412,4],[806,5]]},"1215":{"position":[[681,4]]},"1222":{"position":[[511,4],[638,4],[926,5]]},"1237":{"position":[[70,4],[241,4],[384,5],[472,4]]},"1238":{"position":[[116,4]]},"1239":{"position":[[161,4],[288,4],[320,4],[396,4]]},"1241":{"position":[[27,4],[44,4]]},"1242":{"position":[[43,4]]},"1246":{"position":[[1424,4],[1560,4]]},"1253":{"position":[[43,4]]},"1260":{"position":[[14,4]]},"1270":{"position":[[163,4]]},"1276":{"position":[[278,4]]},"1282":{"position":[[106,4],[206,4]]},"1292":{"position":[[570,4]]},"1294":{"position":[[221,4]]},"1295":{"position":[[1486,4]]},"1296":{"position":[[89,4],[215,4]]},"1299":{"position":[[129,4]]},"1300":{"position":[[60,4],[175,4]]},"1301":{"position":[[300,5],[397,4],[839,4]]},"1304":{"position":[[183,4],[389,4],[1715,4],[1766,4]]},"1305":{"position":[[735,4],[785,5],[822,4]]},"1311":{"position":[[1267,4]]},"1314":{"position":[[106,5]]},"1315":{"position":[[856,4]]},"1316":{"position":[[31,4],[3297,4],[3340,4],[3830,4]]},"1318":{"position":[[985,5]]},"1319":{"position":[[47,5],[239,5],[367,5],[413,4]]},"1324":{"position":[[280,4],[1009,4]]}},"keywords":{}}],["data"",{"_index":2727,"title":{},"content":{"412":{"position":[[8133,12]]}},"keywords":{}}],["data'",{"_index":2294,"title":{},"content":{"393":{"position":[[563,6]]}},"keywords":{}}],["data._delet",{"_index":5714,"title":{},"content":{"1048":{"position":[[583,13]]}},"keywords":{}}],["data.ag",{"_index":5713,"title":{},"content":{"1048":{"position":[[569,8]]}},"keywords":{}}],["data.attach",{"_index":6031,"title":{},"content":{"1132":{"position":[[1328,17]]}},"keywords":{}}],["data.bas",{"_index":3296,"title":{},"content":{"535":{"position":[[371,10]]}},"keywords":{}}],["data.checkpoint",{"_index":5012,"title":{},"content":{"875":{"position":[[3512,15]]}},"keywords":{}}],["data.docu",{"_index":5011,"title":{},"content":{"875":{"position":[[3484,15]]}},"keywords":{}}],["data.high",{"_index":2066,"title":{},"content":{"358":{"position":[[714,9]]}},"keywords":{}}],["data.nosql",{"_index":1213,"title":{},"content":{"174":{"position":[[430,10]]}},"keywords":{}}],["data.optim",{"_index":3526,"title":{},"content":{"590":{"position":[[575,13]]}},"keywords":{}}],["data.p",{"_index":1390,"title":{},"content":{"212":{"position":[[508,9]]}},"keywords":{}}],["data.sqlit",{"_index":1964,"title":{},"content":{"336":{"position":[[401,11]]},"581":{"position":[[405,11]]}},"keywords":{}}],["data.when",{"_index":5845,"title":{},"content":{"1083":{"position":[[254,9]]}},"keywords":{}}],["data:"",{"_index":3558,"title":{},"content":{"610":{"position":[[1043,12]]}},"keywords":{}}],["dataar",{"_index":4633,"title":{},"content":{"795":{"position":[[160,8]]}},"keywords":{}}],["databas",{"_index":33,"title":{"51":{"position":[[9,8]]},"62":{"position":[[28,8]]},"67":{"position":[[8,9]]},"69":{"position":[[26,10]]},"85":{"position":[[30,9]]},"87":{"position":[[8,8]]},"89":{"position":[[37,8]]},"91":{"position":[[8,9]]},"96":{"position":[[14,8]]},"98":{"position":[[8,9]]},"100":{"position":[[26,10]]},"115":{"position":[[10,8]]},"117":{"position":[[14,9]]},"118":{"position":[[22,8]]},"126":{"position":[[23,8]]},"145":{"position":[[25,8]]},"171":{"position":[[26,8]]},"172":{"position":[[20,10]]},"173":{"position":[[9,8]]},"174":{"position":[[24,8]]},"176":{"position":[[10,8]]},"178":{"position":[[14,9]]},"179":{"position":[[22,8]]},"186":{"position":[[23,8]]},"199":{"position":[[29,8]]},"200":{"position":[[43,8]]},"213":{"position":[[25,9]]},"219":{"position":[[6,8]]},"223":{"position":[[26,8]]},"225":{"position":[[8,9]]},"258":{"position":[[9,10]]},"264":{"position":[[24,9]]},"268":{"position":[[24,8]]},"271":{"position":[[34,8]]},"278":{"position":[[78,9]]},"319":{"position":[[10,8]]},"321":{"position":[[14,9]]},"322":{"position":[[22,8]]},"331":{"position":[[22,8]]},"334":{"position":[[27,9]]},"348":{"position":[[11,10]]},"349":{"position":[[15,9]]},"355":{"position":[[32,10]]},"358":{"position":[[9,8]]},"359":{"position":[[21,8]]},"363":{"position":[[12,8]]},"364":{"position":[[18,10]]},"369":{"position":[[10,8]]},"372":{"position":[[23,9]]},"374":{"position":[[16,8],[56,8]]},"375":{"position":[[19,10]]},"389":{"position":[[13,8]]},"390":{"position":[[17,10]]},"394":{"position":[[21,8]]},"398":{"position":[[21,8]]},"404":{"position":[[51,10]]},"443":{"position":[[7,8],[26,8]]},"444":{"position":[[21,10]]},"445":{"position":[[45,8]]},"472":{"position":[[28,8]]},"473":{"position":[[22,10]]},"479":{"position":[[38,8]]},"482":{"position":[[22,8]]},"489":{"position":[[6,9]]},"499":{"position":[[10,8]]},"501":{"position":[[34,8]]},"512":{"position":[[10,8]]},"513":{"position":[[33,9]]},"520":{"position":[[21,8]]},"532":{"position":[[10,8]]},"538":{"position":[[9,8]]},"554":{"position":[[20,8]]},"568":{"position":[[19,9]]},"570":{"position":[[10,8]]},"573":{"position":[[10,8]]},"574":{"position":[[28,9]]},"575":{"position":[[22,8]]},"576":{"position":[[19,8]]},"579":{"position":[[30,9]]},"592":{"position":[[10,8]]},"598":{"position":[[9,8]]},"653":{"position":[[9,8]]},"657":{"position":[[10,8]]},"658":{"position":[[0,8]]},"702":{"position":[[31,9]]},"706":{"position":[[9,8]]},"707":{"position":[[0,9]]},"708":{"position":[[12,9]]},"750":{"position":[[8,8]]},"757":{"position":[[31,8]]},"771":{"position":[[8,8]]},"772":{"position":[[11,9]]},"773":{"position":[[26,9]]},"775":{"position":[[6,8]]},"794":{"position":[[42,9]]},"833":{"position":[[13,8]]},"834":{"position":[[0,8]]},"851":{"position":[[0,8]]},"857":{"position":[[57,8]]},"903":{"position":[[63,9]]},"939":{"position":[[26,9]]},"1094":{"position":[[10,9]]},"1122":{"position":[[5,8]]},"1131":{"position":[[5,8]]},"1177":{"position":[[26,9]]},"1204":{"position":[[27,9]]},"1205":{"position":[[34,8]]},"1250":{"position":[[16,8]]},"1267":{"position":[[15,9]]},"1281":{"position":[[0,8]]},"1324":{"position":[[13,8]]}},"content":{"1":{"position":[[519,8]]},"2":{"position":[[322,8]]},"3":{"position":[[202,8]]},"4":{"position":[[380,8]]},"5":{"position":[[290,8]]},"6":{"position":[[485,8],[664,8]]},"7":{"position":[[193,8],[322,8],[499,8]]},"8":{"position":[[1091,8]]},"9":{"position":[[236,8]]},"10":{"position":[[274,8]]},"11":{"position":[[800,8]]},"13":{"position":[[61,9],[149,8]]},"14":{"position":[[158,10],[182,8],[237,9],[270,8],[293,8],[480,8],[662,9],[731,8]]},"15":{"position":[[171,8],[417,8]]},"17":{"position":[[60,9],[315,9],[425,8]]},"19":{"position":[[107,8]]},"20":{"position":[[26,8],[182,9]]},"22":{"position":[[218,9]]},"23":{"position":[[54,8]]},"24":{"position":[[27,8]]},"25":{"position":[[67,8],[272,9]]},"28":{"position":[[46,9]]},"29":{"position":[[27,9]]},"30":{"position":[[76,8]]},"32":{"position":[[45,8],[237,8]]},"33":{"position":[[560,8]]},"34":{"position":[[30,8],[354,9],[463,8]]},"36":{"position":[[31,8],[229,9]]},"38":{"position":[[226,9]]},"39":{"position":[[354,8]]},"40":{"position":[[321,9]]},"41":{"position":[[173,9]]},"42":{"position":[[64,8]]},"43":{"position":[[351,8],[745,8]]},"51":{"position":[[673,8],[755,8],[930,8]]},"52":{"position":[[11,8]]},"55":{"position":[[856,8]]},"56":{"position":[[119,8]]},"57":{"position":[[108,9]]},"66":{"position":[[170,10],[263,10]]},"67":{"position":[[5,9]]},"68":{"position":[[5,9]]},"69":{"position":[[13,9]]},"70":{"position":[[5,9]]},"79":{"position":[[73,8]]},"83":{"position":[[302,9]]},"87":{"position":[[25,9]]},"89":{"position":[[9,9],[47,8]]},"90":{"position":[[22,9]]},"91":{"position":[[9,9]]},"92":{"position":[[9,9]]},"93":{"position":[[171,9]]},"94":{"position":[[9,10],[201,8]]},"95":{"position":[[103,10]]},"96":{"position":[[27,8]]},"98":{"position":[[11,10],[171,9]]},"99":{"position":[[5,9],[274,9]]},"100":{"position":[[13,10],[171,9]]},"101":{"position":[[56,9],[117,10]]},"102":{"position":[[67,8]]},"105":{"position":[[67,10]]},"114":{"position":[[70,8],[498,10]]},"117":{"position":[[1,9],[233,8]]},"118":{"position":[[26,8],[130,9],[215,8]]},"120":{"position":[[23,8],[137,9]]},"126":{"position":[[23,8],[219,10]]},"128":{"position":[[303,10]]},"131":{"position":[[297,8]]},"139":{"position":[[158,9]]},"140":{"position":[[78,8]]},"144":{"position":[[99,8]]},"145":{"position":[[153,8],[196,8],[276,8]]},"148":{"position":[[20,8]]},"149":{"position":[[70,8]]},"172":{"position":[[13,8],[46,8],[258,8],[289,8]]},"173":{"position":[[48,8],[261,8],[303,9],[326,8],[445,8],[547,8],[615,8],[649,8],[1182,10],[1408,9],[1925,10],[2210,10],[2454,8],[2535,9],[2763,9],[2990,8],[3113,8]]},"174":{"position":[[37,8],[3236,8]]},"175":{"position":[[70,9],[466,8]]},"178":{"position":[[1,9],[214,8],[311,8]]},"179":{"position":[[26,8],[154,8],[324,8]]},"181":{"position":[[23,8],[94,8]]},"182":{"position":[[322,9]]},"186":{"position":[[18,8],[141,9]]},"188":{"position":[[359,8],[591,8],[848,8],[2618,8],[2638,8]]},"189":{"position":[[154,8],[342,8]]},"197":{"position":[[144,9]]},"198":{"position":[[37,8]]},"201":{"position":[[26,9]]},"202":{"position":[[25,8],[207,9]]},"203":{"position":[[19,8]]},"204":{"position":[[36,9]]},"211":{"position":[[53,8]]},"215":{"position":[[114,9]]},"216":{"position":[[10,9]]},"218":{"position":[[64,9]]},"219":{"position":[[10,9],[126,9]]},"220":{"position":[[10,9],[150,8]]},"221":{"position":[[127,9],[197,8]]},"222":{"position":[[10,10],[162,9],[338,8]]},"223":{"position":[[13,8],[140,10],[202,8]]},"224":{"position":[[10,9],[75,10]]},"225":{"position":[[11,9],[132,9]]},"226":{"position":[[5,9],[340,10]]},"227":{"position":[[5,9],[172,10]]},"228":{"position":[[17,9],[173,10]]},"229":{"position":[[40,8],[87,9]]},"232":{"position":[[277,10]]},"233":{"position":[[292,8]]},"236":{"position":[[121,8]]},"239":{"position":[[302,8]]},"241":{"position":[[387,9]]},"243":{"position":[[238,8]]},"249":{"position":[[156,9]]},"260":{"position":[[71,9]]},"262":{"position":[[92,8]]},"263":{"position":[[511,8]]},"265":{"position":[[63,8],[128,8],[185,8],[278,10],[604,10],[630,10],[742,8]]},"267":{"position":[[1166,8]]},"271":{"position":[[122,8]]},"273":{"position":[[30,8]]},"275":{"position":[[190,9],[248,8]]},"276":{"position":[[146,10]]},"278":{"position":[[37,8]]},"279":{"position":[[7,10],[367,8]]},"281":{"position":[[122,9],[367,9]]},"282":{"position":[[116,10],[203,9],[271,10]]},"285":{"position":[[236,8]]},"287":{"position":[[1111,8]]},"289":{"position":[[620,9],[1043,9]]},"291":{"position":[[143,8]]},"293":{"position":[[396,9]]},"314":{"position":[[290,8]]},"320":{"position":[[330,8]]},"322":{"position":[[26,9]]},"325":{"position":[[29,8]]},"331":{"position":[[303,8]]},"344":{"position":[[60,8]]},"346":{"position":[[17,9]]},"347":{"position":[[70,8]]},"351":{"position":[[368,8]]},"353":{"position":[[437,9]]},"354":{"position":[[643,9],[721,9],[1510,8]]},"359":{"position":[[12,9]]},"360":{"position":[[675,9]]},"362":{"position":[[12,9],[1070,9],[1141,8]]},"364":{"position":[[138,8]]},"365":{"position":[[129,8],[488,9],[511,8],[1103,8],[1248,8],[1588,8]]},"367":{"position":[[36,8],[547,9]]},"369":{"position":[[1021,9],[1474,8]]},"372":{"position":[[183,8]]},"373":{"position":[[384,8]]},"375":{"position":[[7,9],[351,9],[716,9],[851,9]]},"376":{"position":[[44,8],[352,8],[633,9]]},"377":{"position":[[157,9]]},"378":{"position":[[16,9],[53,8]]},"382":{"position":[[336,8]]},"388":{"position":[[156,8],[269,8]]},"390":{"position":[[10,8],[36,8],[314,9],[382,9],[760,8],[869,9],[1140,9],[1658,8],[1832,8]]},"391":{"position":[[50,8]]},"392":{"position":[[59,8],[1203,9],[1800,9]]},"393":{"position":[[47,9]]},"395":{"position":[[161,10]]},"396":{"position":[[1113,9]]},"397":{"position":[[344,9]]},"398":{"position":[[3482,8]]},"399":{"position":[[16,10]]},"400":{"position":[[793,8]]},"402":{"position":[[85,9]]},"404":{"position":[[20,8]]},"407":{"position":[[203,8]]},"408":{"position":[[1856,8],[3623,8],[3667,10],[4648,9]]},"410":{"position":[[229,8],[1929,8]]},"411":{"position":[[1901,8],[2178,9],[2286,8],[2421,9],[2954,8],[3651,9],[3766,9],[4161,9]]},"412":{"position":[[7215,9],[9212,8],[9497,8],[9732,8],[10883,8],[11007,8],[11162,9],[11265,8],[12447,8],[12547,8],[12821,8],[13270,9],[13464,9],[13659,8],[14209,8]]},"420":{"position":[[672,8],[1555,9]]},"422":{"position":[[75,9]]},"427":{"position":[[444,10]]},"432":{"position":[[1227,8]]},"433":{"position":[[504,8]]},"440":{"position":[[450,8]]},"444":{"position":[[8,9],[129,9],[364,9],[434,10],[576,10],[610,8],[748,10]]},"445":{"position":[[32,9],[95,10],[667,8],[1056,8],[2052,8],[2327,8]]},"447":{"position":[[8,9],[573,8]]},"452":{"position":[[49,8],[413,9]]},"454":{"position":[[527,8]]},"455":{"position":[[74,9],[241,10]]},"457":{"position":[[191,9]]},"459":{"position":[[30,8],[83,8]]},"463":{"position":[[80,10],[348,8],[833,8]]},"469":{"position":[[208,8],[409,8]]},"470":{"position":[[320,9]]},"474":{"position":[[107,9]]},"475":{"position":[[74,9]]},"476":{"position":[[289,8]]},"478":{"position":[[145,9]]},"479":{"position":[[16,9],[48,8],[526,9]]},"480":{"position":[[48,9],[342,8]]},"482":{"position":[[571,8],[1079,8]]},"483":{"position":[[24,8],[686,9],[1163,8]]},"489":{"position":[[9,8],[468,9]]},"490":{"position":[[353,8]]},"491":{"position":[[1212,9]]},"501":{"position":[[115,9]]},"502":{"position":[[48,8]]},"504":{"position":[[1164,9]]},"511":{"position":[[70,8]]},"513":{"position":[[29,9],[224,8]]},"514":{"position":[[26,9],[65,8],[127,8],[193,8]]},"515":{"position":[[88,9]]},"516":{"position":[[341,9]]},"517":{"position":[[251,9]]},"518":{"position":[[142,8]]},"520":{"position":[[19,8],[134,8],[278,8],[406,8]]},"524":{"position":[[630,9],[694,8],[985,8]]},"527":{"position":[[54,8]]},"528":{"position":[[137,9]]},"530":{"position":[[253,8]]},"531":{"position":[[70,8]]},"533":{"position":[[125,8]]},"538":{"position":[[196,8],[403,8],[485,8]]},"539":{"position":[[11,8]]},"542":{"position":[[517,8]]},"544":{"position":[[129,9]]},"551":{"position":[[83,9],[519,8]]},"554":{"position":[[1026,8]]},"555":{"position":[[24,8],[864,9]]},"556":{"position":[[175,8]]},"557":{"position":[[105,8]]},"565":{"position":[[231,8]]},"569":{"position":[[1009,10],[1277,9],[1514,9]]},"570":{"position":[[29,10],[170,8],[243,9],[489,9],[548,8],[703,10]]},"571":{"position":[[537,9],[592,8]]},"574":{"position":[[762,8],[882,8]]},"575":{"position":[[27,8],[83,8]]},"576":{"position":[[235,9]]},"584":{"position":[[77,8]]},"590":{"position":[[93,8],[191,8]]},"591":{"position":[[70,8]]},"593":{"position":[[125,8]]},"598":{"position":[[197,8],[492,8]]},"599":{"position":[[11,8]]},"604":{"position":[[129,9]]},"628":{"position":[[153,8]]},"631":{"position":[[34,8]]},"632":{"position":[[1028,9]]},"642":{"position":[[40,8]]},"647":{"position":[[17,8]]},"656":{"position":[[81,8],[130,8]]},"661":{"position":[[34,8],[784,8],[823,9],[1146,9],[1421,8]]},"662":{"position":[[33,8],[1350,8],[1580,8],[2027,8],[2090,8]]},"663":{"position":[[138,8]]},"676":{"position":[[282,9]]},"680":{"position":[[521,8]]},"682":{"position":[[71,8]]},"686":{"position":[[761,9],[824,8]]},"694":{"position":[[24,9]]},"698":{"position":[[407,9],[1041,9],[1116,9],[2320,8]]},"699":{"position":[[720,9],[781,9]]},"701":{"position":[[342,8],[437,9],[708,10]]},"702":{"position":[[181,8],[365,8],[590,9],[670,9]]},"703":{"position":[[1068,9]]},"704":{"position":[[23,8]]},"705":{"position":[[122,9],[212,9],[279,8],[383,10],[1287,8]]},"707":{"position":[[399,8]]},"708":{"position":[[124,8],[206,8],[332,8],[539,8]]},"709":{"position":[[481,8],[545,8]]},"710":{"position":[[19,8],[1118,8],[1521,8],[1669,8],[2388,8]]},"711":{"position":[[34,8],[1091,9],[1918,8]]},"712":{"position":[[26,8],[157,8]]},"715":{"position":[[128,8]]},"717":{"position":[[971,9],[1129,8]]},"718":{"position":[[632,8]]},"719":{"position":[[21,8],[90,9],[120,8],[264,8],[495,9]]},"723":{"position":[[579,9],[775,8]]},"745":{"position":[[117,8],[478,8]]},"749":{"position":[[117,8],[183,10],[281,8],[311,8],[5737,8],[6643,8],[10212,8],[12576,8],[12641,8],[24099,8]]},"753":{"position":[[109,9]]},"757":{"position":[[22,8],[140,8],[223,8]]},"759":{"position":[[479,9],[522,9],[586,8],[722,8],[1054,8],[1144,8],[1213,8],[1340,8]]},"760":{"position":[[475,9],[518,9],[582,8],[718,8]]},"761":{"position":[[156,8]]},"764":{"position":[[340,9]]},"772":{"position":[[29,8],[114,8],[511,8],[1178,9]]},"774":{"position":[[53,8],[141,8],[868,8],[949,8]]},"775":{"position":[[25,8],[158,8],[328,8],[688,9],[750,8],[796,9]]},"776":{"position":[[166,9],[209,8],[307,8],[385,8]]},"779":{"position":[[347,9]]},"781":{"position":[[658,9]]},"784":{"position":[[701,8]]},"785":{"position":[[534,9],[697,8]]},"793":{"position":[[1185,8]]},"796":{"position":[[43,10]]},"797":{"position":[[35,8]]},"800":{"position":[[12,9]]},"801":{"position":[[8,8],[131,10],[147,8]]},"802":{"position":[[60,8],[244,8],[553,8]]},"815":{"position":[[216,8]]},"825":{"position":[[324,8]]},"829":{"position":[[85,8],[104,8],[420,9],[896,9],[962,8],[1055,8],[1178,8],[1378,13],[1421,10],[1585,9],[1704,11],[3047,8]]},"830":{"position":[[209,8],[289,8]]},"832":{"position":[[113,8]]},"834":{"position":[[20,8]]},"836":{"position":[[36,8],[602,8],[740,8]]},"837":{"position":[[33,8],[92,9],[2038,8]]},"838":{"position":[[33,8],[1897,8],[2167,9],[2298,8]]},"839":{"position":[[20,8],[246,8],[1231,9]]},"840":{"position":[[30,8]]},"842":{"position":[[32,8],[272,8]]},"849":{"position":[[436,8]]},"851":{"position":[[83,10],[133,8],[213,8],[262,8]]},"854":{"position":[[82,9],[745,9]]},"857":{"position":[[90,9]]},"858":{"position":[[256,9]]},"860":{"position":[[115,8],[175,8]]},"861":{"position":[[940,8],[1031,8],[1181,8]]},"862":{"position":[[494,8]]},"872":{"position":[[730,8],[801,8],[1014,11],[1355,8],[1402,8],[2496,9],[3277,9]]},"875":{"position":[[4045,9]]},"892":{"position":[[285,9]]},"898":{"position":[[1554,8],[1602,9]]},"903":{"position":[[592,8],[734,8]]},"904":{"position":[[284,8],[351,8],[393,8]]},"908":{"position":[[125,8]]},"935":{"position":[[96,9],[144,8]]},"939":{"position":[[40,9],[91,9]]},"942":{"position":[[43,9]]},"953":{"position":[[93,8]]},"958":{"position":[[71,9],[165,8],[262,9],[738,9]]},"960":{"position":[[5,8]]},"961":{"position":[[5,8],[61,9]]},"962":{"position":[[145,9]]},"963":{"position":[[71,9]]},"964":{"position":[[67,8]]},"965":{"position":[[56,8],[124,8]]},"966":{"position":[[453,9]]},"971":{"position":[[96,9]]},"972":{"position":[[36,9],[92,8]]},"973":{"position":[[33,8]]},"975":{"position":[[43,8],[138,8],[354,8],[548,8]]},"976":{"position":[[12,9],[147,8],[177,8],[206,9],[242,8]]},"977":{"position":[[102,8],[154,8],[306,9]]},"981":{"position":[[36,8]]},"986":{"position":[[477,8]]},"989":{"position":[[279,8]]},"1007":{"position":[[1104,8]]},"1008":{"position":[[207,8]]},"1013":{"position":[[87,8],[450,8],[806,8]]},"1014":{"position":[[34,8],[309,8]]},"1015":{"position":[[34,8]]},"1058":{"position":[[191,9]]},"1065":{"position":[[1955,9],[2074,9]]},"1067":{"position":[[1878,8],[2341,9],[2360,8]]},"1068":{"position":[[119,9]]},"1069":{"position":[[28,9]]},"1071":{"position":[[23,10]]},"1072":{"position":[[152,8],[1246,8]]},"1084":{"position":[[82,9]]},"1085":{"position":[[3727,8]]},"1090":{"position":[[350,8],[924,8],[1037,9]]},"1094":{"position":[[131,8],[167,8]]},"1097":{"position":[[722,9]]},"1098":{"position":[[358,9]]},"1099":{"position":[[332,9]]},"1103":{"position":[[217,9]]},"1114":{"position":[[306,8],[694,8]]},"1118":{"position":[[286,8],[628,8]]},"1121":{"position":[[434,8]]},"1124":{"position":[[225,9],[1027,8]]},"1126":{"position":[[132,9],[341,8],[654,8]]},"1130":{"position":[[271,8]]},"1132":{"position":[[539,8],[1521,9]]},"1134":{"position":[[713,8]]},"1135":{"position":[[207,9]]},"1144":{"position":[[158,9]]},"1148":{"position":[[821,8],[1097,9]]},"1149":{"position":[[867,8]]},"1150":{"position":[[310,8]]},"1154":{"position":[[728,8]]},"1158":{"position":[[166,9]]},"1161":{"position":[[194,8]]},"1165":{"position":[[497,8],[594,8],[644,8],[958,8]]},"1171":{"position":[[385,8]]},"1174":{"position":[[467,8],[540,9],[683,8]]},"1175":{"position":[[106,8],[225,8],[286,8],[507,8],[604,8]]},"1177":{"position":[[59,9]]},"1180":{"position":[[194,8]]},"1183":{"position":[[197,9]]},"1188":{"position":[[49,8],[162,8]]},"1191":{"position":[[102,9]]},"1194":{"position":[[160,8],[264,8]]},"1198":{"position":[[110,8],[612,8],[1116,8]]},"1204":{"position":[[60,9]]},"1210":{"position":[[404,8]]},"1211":{"position":[[659,8]]},"1214":{"position":[[840,8],[923,8],[986,8]]},"1219":{"position":[[187,8],[233,8],[566,9]]},"1220":{"position":[[245,9]]},"1222":{"position":[[878,8],[1011,9],[1202,8],[1240,10],[1375,8]]},"1226":{"position":[[200,8]]},"1227":{"position":[[678,8]]},"1231":{"position":[[1009,8]]},"1238":{"position":[[59,8]]},"1246":{"position":[[1105,8],[1910,9]]},"1247":{"position":[[408,8]]},"1249":{"position":[[27,8],[255,8],[311,11]]},"1250":{"position":[[52,8],[130,8],[381,8],[502,8]]},"1251":{"position":[[95,8]]},"1253":{"position":[[18,10]]},"1264":{"position":[[122,8]]},"1265":{"position":[[666,8]]},"1267":{"position":[[128,8],[403,8],[580,10],[642,9],[736,9]]},"1271":{"position":[[1517,8]]},"1272":{"position":[[80,9]]},"1274":{"position":[[173,8]]},"1276":{"position":[[567,8]]},"1277":{"position":[[345,8]]},"1279":{"position":[[52,8]]},"1280":{"position":[[80,8]]},"1281":{"position":[[27,8]]},"1282":{"position":[[256,8]]},"1283":{"position":[[14,9]]},"1289":{"position":[[135,9]]},"1295":{"position":[[55,10],[76,8],[857,9]]},"1299":{"position":[[107,9],[435,9]]},"1300":{"position":[[636,8]]},"1301":{"position":[[166,8],[755,8],[872,9]]},"1302":{"position":[[15,8]]},"1304":{"position":[[226,9],[264,8],[483,8],[648,8]]},"1305":{"position":[[82,8],[137,9],[684,8],[931,9],[1062,9]]},"1307":{"position":[[134,9],[696,8]]},"1311":{"position":[[73,8],[1420,8]]},"1313":{"position":[[110,8],[1005,9]]},"1314":{"position":[[187,8],[235,8]]},"1315":{"position":[[41,9],[809,8],[938,9],[1283,8],[1592,8]]},"1316":{"position":[[260,8],[631,8],[715,8],[995,8],[1231,8],[2905,8],[2974,8],[3725,8]]},"1317":{"position":[[85,9]]},"1318":{"position":[[12,10]]},"1320":{"position":[[25,8],[746,8]]},"1321":{"position":[[183,8]]},"1324":{"position":[[20,9],[518,9],[694,9]]}},"keywords":{}}],["database"",{"_index":1442,"title":{},"content":{"243":{"position":[[45,14],[124,14],[167,14],[382,14],[414,14],[963,14],[995,14]]},"244":{"position":[[300,14],[366,14],[548,14],[660,14],[815,14],[853,14],[890,14],[944,14],[1008,14],[1542,14]]},"570":{"position":[[861,15]]},"571":{"position":[[1880,14]]}},"keywords":{}}],["database'",{"_index":1020,"title":{},"content":{"96":{"position":[[214,10]]},"205":{"position":[[33,10]]},"212":{"position":[[156,10]]},"636":{"position":[[381,10]]}},"keywords":{}}],["database'?"",{"_index":2193,"title":{},"content":{"390":{"position":[[652,18]]}},"keywords":{}}],["database(",{"_index":2670,"title":{},"content":{"412":{"position":[[2555,12]]}},"keywords":{}}],["database.addcollect",{"_index":5377,"title":{},"content":{"955":{"position":[[213,26]]}},"keywords":{}}],["database.addst",{"_index":5984,"title":{},"content":{"1114":{"position":[[838,20]]},"1118":{"position":[[771,20]]},"1121":{"position":[[551,20]]}},"keywords":{}}],["database.addstate('mynamepsac",{"_index":5987,"title":{},"content":{"1114":{"position":[[939,33]]}},"keywords":{}}],["database.explor",{"_index":3722,"title":{},"content":{"644":{"position":[[62,16]]},"913":{"position":[[68,16]]}},"keywords":{}}],["database.getcollection('hero",{"_index":1277,"title":{},"content":{"188":{"position":[[2768,33]]}},"keywords":{}}],["database.heroes.find",{"_index":851,"title":{},"content":{"55":{"position":[[1098,26]]}},"keywords":{}}],["database.nam",{"_index":1253,"title":{},"content":{"188":{"position":[[996,13]]}},"keywords":{}}],["database.query('select",{"_index":3807,"title":{},"content":{"661":{"position":[[1280,22]]}},"keywords":{}}],["database.stor",{"_index":4037,"title":{},"content":{"719":{"position":[[290,14]]}},"keywords":{}}],["database/storag",{"_index":3332,"title":{"549":{"position":[[38,16]]}},"content":{},"keywords":{}}],["database={database}>",{"_index":4754,"title":{},"content":{"829":{"position":[[1765,23]]}},"keywords":{}}],["databaseid",{"_index":4906,"title":{},"content":{"862":{"position":[[1212,11]]}},"keywords":{}}],["databasenam",{"_index":1255,"title":{},"content":{"188":{"position":[[1068,13],[2707,14]]},"661":{"position":[[1213,13]]},"872":{"position":[[2478,13]]},"1165":{"position":[[450,12],[754,13],[1092,13]]},"1281":{"position":[[279,13]]}},"keywords":{}}],["databaseon",{"_index":6325,"title":{},"content":{"1267":{"position":[[597,11]]}},"keywords":{}}],["databasepostinsert",{"_index":4527,"title":{},"content":{"767":{"position":[[199,18]]}},"keywords":{}}],["databasepostremov",{"_index":4551,"title":{},"content":{"769":{"position":[[173,18]]}},"keywords":{}}],["databasepostsav",{"_index":4539,"title":{},"content":{"768":{"position":[[162,16]]}},"keywords":{}}],["databaseservic",{"_index":783,"title":{},"content":{"51":{"position":[[990,16]]},"54":{"position":[[91,16]]},"130":{"position":[[395,16]]}},"keywords":{}}],["databasesus",{"_index":3337,"title":{},"content":{"551":{"position":[[70,12]]}},"keywords":{}}],["databasesync",{"_index":6332,"title":{},"content":{"1271":{"position":[[1370,12]]},"1275":{"position":[[270,12]]}},"keywords":{}}],["databases—rel",{"_index":2068,"title":{},"content":{"358":{"position":[[836,20]]}},"keywords":{}}],["databasetwo",{"_index":6326,"title":{},"content":{"1267":{"position":[[691,11]]}},"keywords":{}}],["databaseurl",{"_index":4867,"title":{},"content":{"854":{"position":[[280,12]]},"1148":{"position":[[973,12]]}},"keywords":{}}],["databuilt",{"_index":3403,"title":{},"content":{"559":{"position":[[889,9]]}},"keywords":{}}],["datacent",{"_index":5919,"title":{},"content":{"1093":{"position":[[154,10]]}},"keywords":{}}],["datachannel",{"_index":5274,"title":{},"content":{"911":{"position":[[302,11],[415,11]]}},"keywords":{}}],["datachannel/polyfil",{"_index":1372,"title":{},"content":{"210":{"position":[[463,23]]},"261":{"position":[[704,23]]},"904":{"position":[[2909,23]]},"911":{"position":[[547,22]]}},"keywords":{}}],["datalearn",{"_index":1911,"title":{},"content":{"318":{"position":[[441,9]]}},"keywords":{}}],["datalog",{"_index":623,"title":{},"content":{"39":{"position":[[396,8]]}},"keywords":{}}],["datapath",{"_index":5123,"title":{},"content":{"886":{"position":[[1308,9]]}},"keywords":{}}],["datarxdb",{"_index":3966,"title":{},"content":{"703":{"position":[[297,8]]}},"keywords":{}}],["dataset",{"_index":405,"title":{"696":{"position":[[25,9]]}},"content":{"24":{"position":[[504,9]]},"58":{"position":[[183,9]]},"64":{"position":[[128,8]]},"66":{"position":[[353,8]]},"138":{"position":[[198,9]]},"141":{"position":[[262,8]]},"169":{"position":[[287,8]]},"173":{"position":[[2121,8]]},"217":{"position":[[347,8]]},"265":{"position":[[778,7]]},"369":{"position":[[508,9],[571,7]]},"392":{"position":[[814,7]]},"394":{"position":[[1596,7],[1785,9]]},"396":{"position":[[1986,8]]},"398":{"position":[[3370,7]]},"408":{"position":[[759,8],[1308,8]]},"411":{"position":[[256,8],[3927,8]]},"412":{"position":[[6745,7],[7251,7],[7592,8],[12459,7]]},"432":{"position":[[388,9],[1448,9]]},"446":{"position":[[892,8]]},"574":{"position":[[547,8]]},"587":{"position":[[139,8]]},"643":{"position":[[11,8]]},"696":{"position":[[136,7]]},"723":{"position":[[194,9],[1653,8]]},"773":{"position":[[740,8]]},"775":{"position":[[509,8],[573,7]]},"1006":{"position":[[173,7]]},"1072":{"position":[[2912,9]]},"1123":{"position":[[540,8]]},"1124":{"position":[[1663,7]]},"1132":{"position":[[267,9]]},"1137":{"position":[[224,9]]},"1156":{"position":[[132,9]]},"1170":{"position":[[197,9]]},"1192":{"position":[[747,7]]},"1235":{"position":[[96,9]]},"1295":{"position":[[907,7],[1095,7]]},"1315":{"position":[[1499,7]]}},"keywords":{}}],["datasets.flex",{"_index":1225,"title":{},"content":{"174":{"position":[[2543,17]]}},"keywords":{}}],["datasets.indexeddb",{"_index":1669,"title":{},"content":{"287":{"position":[[432,18]]}},"keywords":{}}],["datasets.mani",{"_index":2903,"title":{},"content":{"430":{"position":[[670,13]]}},"keywords":{}}],["datasets​.dist",{"_index":2343,"title":{},"content":{"396":{"position":[[777,18]]}},"keywords":{}}],["datastor",{"_index":316,"title":{"19":{"position":[[4,10]]},"1092":{"position":[[7,9]]}},"content":{"19":{"position":[[58,9],[620,9],[790,9]]},"475":{"position":[[114,10]]},"630":{"position":[[588,10]]},"701":{"position":[[982,9]]},"1092":{"position":[[166,9],[323,9],[499,9]]},"1093":{"position":[[94,10]]},"1124":{"position":[[724,10]]}},"keywords":{}}],["datastore.query(post",{"_index":336,"title":{},"content":{"19":{"position":[[659,21],[831,21]]}},"keywords":{}}],["data—rath",{"_index":3112,"title":{},"content":{"477":{"position":[[290,11]]}},"keywords":{}}],["date",{"_index":1174,"title":{},"content":{"158":{"position":[[327,4]]},"185":{"position":[[191,4]]},"267":{"position":[[811,4]]},"288":{"position":[[155,4]]},"293":{"position":[[362,4]]},"316":{"position":[[370,5]]},"340":{"position":[[174,4]]},"367":{"position":[[1019,5]]},"411":{"position":[[4286,4]]},"412":{"position":[[4286,4],[6264,4]]},"504":{"position":[[1208,4]]},"602":{"position":[[511,4]]},"696":{"position":[[384,4]]},"723":{"position":[[1229,5]]},"749":{"position":[[12006,6]]},"799":{"position":[[32,4],[206,4]]},"861":{"position":[[377,5]]},"897":{"position":[[347,5]]},"904":{"position":[[1063,5]]},"1085":{"position":[[19,5],[126,6],[196,6],[315,4],[527,4],[585,4]]},"1124":{"position":[[1144,5]]}},"keywords":{}}],["date().gettim",{"_index":4102,"title":{},"content":{"739":{"position":[[722,16]]},"1048":{"position":[[475,17]]},"1085":{"position":[[3798,16]]},"1177":{"position":[[501,16]]}},"keywords":{}}],["date().toisostr",{"_index":5258,"title":{},"content":{"904":{"position":[[1240,20]]}},"keywords":{}}],["date().tojson",{"_index":3945,"title":{},"content":{"698":{"position":[[2795,16],[2863,16],[2930,16]]}},"keywords":{}}],["date().totimestr",{"_index":3607,"title":{},"content":{"612":{"position":[[2274,22]]}},"keywords":{}}],["date(olddoc.time).gettim",{"_index":4446,"title":{},"content":{"751":{"position":[[653,28],[896,28],[1755,28]]}},"keywords":{}}],["date.now",{"_index":5512,"title":{},"content":{"995":{"position":[[1747,10],[1979,11]]}},"keywords":{}}],["date.now().tostr",{"_index":1958,"title":{},"content":{"335":{"position":[[750,22]]}},"keywords":{}}],["date.toisostr",{"_index":5890,"title":{},"content":{"1085":{"position":[[553,19]]}},"keywords":{}}],["datetime.now()}"",{"_index":1282,"title":{},"content":{"188":{"position":[[2902,24]]}},"keywords":{}}],["dave",{"_index":4692,"title":{},"content":{"813":{"position":[[320,6]]}},"keywords":{}}],["day",{"_index":2724,"title":{},"content":{"412":{"position":[[7951,5]]},"419":{"position":[[14,4],[1048,4]]},"450":{"position":[[690,4]]},"697":{"position":[[195,5]]},"783":{"position":[[330,4]]},"1162":{"position":[[444,4]]},"1181":{"position":[[531,4]]},"1316":{"position":[[540,4]]}},"keywords":{}}],["db",{"_index":355,"title":{},"content":{"20":{"position":[[158,2]]},"41":{"position":[[214,2]]},"51":{"position":[[688,2],[891,3]]},"188":{"position":[[959,2],[1474,3]]},"209":{"position":[[231,2],[1273,3]]},"211":{"position":[[201,2]]},"255":{"position":[[578,2],[1604,3]]},"258":{"position":[[139,2]]},"266":{"position":[[653,2]]},"314":{"position":[[464,2],[913,3]]},"315":{"position":[[527,2],[930,3]]},"334":{"position":[[139,2],[322,2],[775,3]]},"335":{"position":[[191,2]]},"370":{"position":[[157,2]]},"392":{"position":[[332,2]]},"411":{"position":[[2024,2],[2548,2],[2652,2],[4433,2]]},"412":{"position":[[9775,2],[9951,2],[10528,3],[11223,2],[11990,2],[12603,2],[12765,3]]},"478":{"position":[[216,2]]},"480":{"position":[[357,2],[926,3]]},"482":{"position":[[602,2],[1042,3]]},"522":{"position":[[403,2]]},"538":{"position":[[418,2]]},"554":{"position":[[1041,2],[1556,3]]},"555":{"position":[[196,2]]},"562":{"position":[[156,2]]},"563":{"position":[[468,2]]},"564":{"position":[[572,2]]},"566":{"position":[[920,3]]},"579":{"position":[[331,2],[789,3]]},"580":{"position":[[366,7],[402,3],[433,2]]},"598":{"position":[[425,2],[921,3]]},"601":{"position":[[438,7],[516,2]]},"632":{"position":[[1277,2],[1885,3]]},"638":{"position":[[419,2]]},"653":{"position":[[242,2]]},"672":{"position":[[190,2]]},"673":{"position":[[196,2]]},"674":{"position":[[479,2]]},"693":{"position":[[1163,2]]},"710":{"position":[[1684,2]]},"711":{"position":[[1144,2]]},"717":{"position":[[1144,2]]},"718":{"position":[[647,2]]},"720":{"position":[[282,2]]},"734":{"position":[[469,2]]},"739":{"position":[[273,2],[567,2]]},"745":{"position":[[518,2]]},"749":{"position":[[6236,2],[6491,2]]},"759":{"position":[[349,2],[489,2]]},"760":{"position":[[485,2]]},"772":{"position":[[759,2]]},"773":{"position":[[549,2]]},"774":{"position":[[651,2]]},"793":{"position":[[1261,2]]},"829":{"position":[[628,2],[874,3],[1518,2]]},"836":{"position":[[678,2]]},"837":{"position":[[2100,2]]},"841":{"position":[[1498,3]]},"849":{"position":[[891,3],[905,8]]},"862":{"position":[[528,2]]},"872":{"position":[[1702,2],[3287,3],[3960,2]]},"898":{"position":[[2310,2]]},"904":{"position":[[703,2]]},"916":{"position":[[294,2]]},"932":{"position":[[1032,2]]},"960":{"position":[[271,2]]},"962":{"position":[[742,2]]},"968":{"position":[[496,2]]},"1085":{"position":[[3540,2]]},"1126":{"position":[[356,2],[669,2]]},"1134":{"position":[[126,2]]},"1138":{"position":[[270,2]]},"1139":{"position":[[525,2]]},"1140":{"position":[[584,2]]},"1144":{"position":[[174,2]]},"1145":{"position":[[514,2]]},"1146":{"position":[[219,2]]},"1148":{"position":[[1113,2]]},"1149":{"position":[[906,2]]},"1158":{"position":[[182,2]]},"1159":{"position":[[368,2]]},"1163":{"position":[[528,2]]},"1168":{"position":[[130,2]]},"1172":{"position":[[295,2]]},"1177":{"position":[[603,3]]},"1182":{"position":[[532,2]]},"1184":{"position":[[771,2]]},"1201":{"position":[[170,2]]},"1286":{"position":[[479,2]]},"1287":{"position":[[529,2]]},"1288":{"position":[[495,2]]}},"keywords":{}}],["db.addcollect",{"_index":780,"title":{},"content":{"51":{"position":[[829,19]]},"188":{"position":[[1180,19]]},"209":{"position":[[364,19]]},"211":{"position":[[325,19]]},"255":{"position":[[708,19]]},"259":{"position":[[7,19]]},"314":{"position":[[673,19]]},"315":{"position":[[646,19]]},"316":{"position":[[116,19]]},"334":{"position":[[561,19]]},"392":{"position":[[532,19],[1497,19]]},"480":{"position":[[473,19]]},"482":{"position":[[760,19]]},"538":{"position":[[852,19]]},"554":{"position":[[1253,19]]},"562":{"position":[[480,19]]},"564":{"position":[[699,19]]},"579":{"position":[[569,19]]},"598":{"position":[[859,19]]},"632":{"position":[[1458,19]]},"638":{"position":[[537,19]]},"639":{"position":[[300,19]]},"680":{"position":[[1139,19]]},"717":{"position":[[1599,19]]},"734":{"position":[[854,19]]},"739":{"position":[[413,19]]},"772":{"position":[[930,19]]},"829":{"position":[[727,19]]},"862":{"position":[[813,19]]},"872":{"position":[[1820,19],[4050,19]]},"898":{"position":[[2400,19]]},"904":{"position":[[797,19]]},"939":{"position":[[156,19]]},"1149":{"position":[[1009,19]]},"1158":{"position":[[297,19]]},"1231":{"position":[[1096,19]]}},"keywords":{}}],["db.all(sqlqueri",{"_index":4007,"title":{},"content":{"711":{"position":[[1576,16]]}},"keywords":{}}],["db.cities.findone().where('name').equals('tokyo').exec",{"_index":6535,"title":{},"content":{"1315":{"position":[[575,57]]}},"keywords":{}}],["db.customers.find().where('city_id').equals(citydocument.id).exec",{"_index":6537,"title":{},"content":{"1315":{"position":[[665,68]]}},"keywords":{}}],["db.execute('select",{"_index":4774,"title":{},"content":{"836":{"position":[[950,18]]}},"keywords":{}}],["db.file",{"_index":5661,"title":{},"content":{"1033":{"position":[[565,9]]}},"keywords":{}}],["db.files.addpipelin",{"_index":5660,"title":{},"content":{"1033":{"position":[[499,22]]}},"keywords":{}}],["db.folder",{"_index":5664,"title":{},"content":{"1033":{"position":[[794,11]]}},"keywords":{}}],["db.folders.addpipelin",{"_index":5663,"title":{},"content":{"1033":{"position":[[730,24]]}},"keywords":{}}],["db.hero",{"_index":1098,"title":{},"content":{"130":{"position":[[472,8]]},"143":{"position":[[435,8],[616,8]]},"335":{"position":[[255,7]]},"563":{"position":[[688,10]]},"580":{"position":[[490,7]]},"939":{"position":[[229,10]]}},"keywords":{}}],["db.hero.insert",{"_index":1957,"title":{},"content":{"335":{"position":[[729,16]]}},"keywords":{}}],["db.heroes.bulkinsert",{"_index":793,"title":{},"content":{"52":{"position":[[184,22]]},"539":{"position":[[184,22]]},"599":{"position":[[193,22]]}},"keywords":{}}],["db.heroes.find",{"_index":3226,"title":{},"content":{"502":{"position":[[921,16]]},"518":{"position":[[388,16]]},"571":{"position":[[862,16]]},"601":{"position":[[581,17]]},"602":{"position":[[240,20]]}},"keywords":{}}],["db.heroes.find().exec",{"_index":801,"title":{},"content":{"52":{"position":[[342,24]]},"539":{"position":[[342,24]]},"562":{"position":[[670,24]]},"599":{"position":[[369,24]]}},"keywords":{}}],["db.heroes.findon",{"_index":803,"title":{},"content":{"52":{"position":[[389,19],[479,19],[626,19]]},"539":{"position":[[389,19],[479,19],[626,19]]},"599":{"position":[[416,19],[506,19],[657,19]]}},"keywords":{}}],["db.heroes.insert",{"_index":788,"title":{},"content":{"52":{"position":[[90,18]]},"539":{"position":[[90,18]]},"562":{"position":[[557,18]]},"599":{"position":[[90,18]]}},"keywords":{}}],["db.human",{"_index":4903,"title":{},"content":{"862":{"position":[[885,10]]},"872":{"position":[[2521,10],[3427,9],[4532,10]]},"898":{"position":[[3393,10]]},"1149":{"position":[[1385,10]]}},"keywords":{}}],["db.humans.syncgraphql",{"_index":6278,"title":{},"content":{"1231":{"position":[[1165,25]]}},"keywords":{}}],["db.item",{"_index":2230,"title":{},"content":{"392":{"position":[[755,9]]}},"keywords":{}}],["db.j",{"_index":3488,"title":{},"content":{"579":{"position":[[161,5]]}},"keywords":{}}],["db.run("cr",{"_index":4002,"title":{},"content":{"711":{"position":[[1259,19]]}},"keywords":{}}],["db.run("insert",{"_index":4004,"title":{},"content":{"711":{"position":[[1316,19]]}},"keywords":{}}],["db.securedata.findon",{"_index":3356,"title":{},"content":{"555":{"position":[[474,23]]},"556":{"position":[[816,23]]}},"keywords":{}}],["db.securedata.insert",{"_index":3353,"title":{},"content":{"555":{"position":[[275,22]]}},"keywords":{}}],["db.serial",{"_index":4001,"title":{},"content":{"711":{"position":[[1235,15]]}},"keywords":{}}],["db.servic",{"_index":4726,"title":{},"content":{"825":{"position":[[667,16]]}},"keywords":{}}],["db.t",{"_index":3536,"title":{},"content":{"598":{"position":[[261,5]]}},"keywords":{}}],["db.task",{"_index":1346,"title":{},"content":{"209":{"position":[[658,9]]},"210":{"position":[[300,9]]},"255":{"position":[[1009,9]]},"261":{"position":[[373,9]]},"480":{"position":[[714,8]]},"481":{"position":[[678,9]]},"632":{"position":[[1751,8],[1926,8],[2246,9]]}},"keywords":{}}],["db.tasks.find",{"_index":6103,"title":{},"content":{"1158":{"position":[[682,15]]}},"keywords":{}}],["db.tasks.insert",{"_index":6100,"title":{},"content":{"1158":{"position":[[568,17]]}},"keywords":{}}],["db.temperature.insert",{"_index":4100,"title":{},"content":{"739":{"position":[[673,23]]}},"keywords":{}}],["db.todo",{"_index":5260,"title":{},"content":{"904":{"position":[[1891,9]]}},"keywords":{}}],["db.todos.insert",{"_index":5257,"title":{},"content":{"904":{"position":[[1158,17]]}},"keywords":{}}],["db.transaction('largestor",{"_index":1805,"title":{},"content":{"302":{"position":[[696,28]]}},"keywords":{}}],["db.transaction('product",{"_index":2994,"title":{},"content":{"459":{"position":[[637,26]]}},"keywords":{}}],["db.transaction([storenam",{"_index":6428,"title":{},"content":{"1294":{"position":[[828,27]]}},"keywords":{}}],["db.users.find",{"_index":4569,"title":{},"content":{"772":{"position":[[1018,15]]}},"keywords":{}}],["db.users.insert({id",{"_index":3877,"title":{},"content":{"680":{"position":[[1237,20]]}},"keywords":{}}],["db.vector",{"_index":2238,"title":{},"content":{"392":{"position":[[1758,10]]}},"keywords":{}}],["db.voxel",{"_index":5555,"title":{},"content":{"1007":{"position":[[50,10],[1413,10]]}},"keywords":{}}],["db.waitforleadership",{"_index":4094,"title":{},"content":{"739":{"position":[[471,22]]}},"keywords":{}}],["db1",{"_index":4195,"title":{},"content":{"749":{"position":[[4719,3]]},"966":{"position":[[525,3]]},"967":{"position":[[110,3],[367,3],[378,3]]}},"keywords":{}}],["db11",{"_index":4215,"title":{},"content":{"749":{"position":[[6203,4]]}},"keywords":{}}],["db12",{"_index":4216,"title":{},"content":{"749":{"position":[[6339,4]]}},"keywords":{}}],["db13",{"_index":4217,"title":{},"content":{"749":{"position":[[6458,4]]}},"keywords":{}}],["db14",{"_index":4218,"title":{},"content":{"749":{"position":[[6600,4]]}},"keywords":{}}],["db2",{"_index":4197,"title":{},"content":{"749":{"position":[[4854,3]]},"966":{"position":[[643,3]]},"967":{"position":[[228,3]]}},"keywords":{}}],["db3",{"_index":4200,"title":{},"content":{"749":{"position":[[4986,3]]}},"keywords":{}}],["db4",{"_index":4202,"title":{},"content":{"749":{"position":[[5138,3]]}},"keywords":{}}],["db5",{"_index":4203,"title":{},"content":{"749":{"position":[[5240,3]]}},"keywords":{}}],["db6",{"_index":4204,"title":{},"content":{"749":{"position":[[5352,3]]}},"keywords":{}}],["db8",{"_index":4207,"title":{},"content":{"749":{"position":[[5559,3]]}},"keywords":{}}],["db9",{"_index":4213,"title":{},"content":{"749":{"position":[[6067,3]]}},"keywords":{}}],["dblocat",{"_index":4489,"title":{},"content":{"759":{"position":[[385,11]]}},"keywords":{}}],["dbmongo",{"_index":5388,"title":{},"content":{"962":{"position":[[953,7]]}},"keywords":{}}],["dbservic",{"_index":815,"title":{},"content":{"54":{"position":[[80,10]]},"130":{"position":[[384,10]]},"825":{"position":[[650,9],[930,9]]}},"keywords":{}}],["de",{"_index":2459,"title":{},"content":{"401":{"position":[[349,2]]},"800":{"position":[[386,2]]},"1072":{"position":[[196,2]]},"1114":{"position":[[376,2]]},"1321":{"position":[[872,2]]}},"keywords":{}}],["de/flexsearch#index",{"_index":4060,"title":{},"content":{"724":{"position":[[1451,19]]}},"keywords":{}}],["de/flexsearch#search",{"_index":4065,"title":{},"content":{"724":{"position":[[1757,20]]}},"keywords":{}}],["deadlin",{"_index":3454,"title":{},"content":{"569":{"position":[[442,10]]},"699":{"position":[[970,8]]}},"keywords":{}}],["deadlock",{"_index":5658,"title":{},"content":{"1033":{"position":[[421,8],[870,8],[907,10]]}},"keywords":{}}],["deal",{"_index":931,"title":{},"content":{"65":{"position":[[1586,4]]},"169":{"position":[[268,7]]},"173":{"position":[[2102,7]]},"174":{"position":[[2524,7]]},"223":{"position":[[97,7]]},"265":{"position":[[879,7]]},"276":{"position":[[204,7]]},"279":{"position":[[322,7]]},"282":{"position":[[72,7]]},"291":{"position":[[376,4]]},"369":{"position":[[489,7]]},"372":{"position":[[272,7]]},"395":{"position":[[410,7]]},"408":{"position":[[1780,4]]},"412":{"position":[[15047,4]]},"420":{"position":[[775,4]]},"432":{"position":[[141,7]]},"508":{"position":[[138,7]]},"525":{"position":[[78,7]]},"526":{"position":[[242,7]]},"548":{"position":[[271,7]]},"608":{"position":[[269,7]]},"1319":{"position":[[164,4]]}},"keywords":{}}],["debounc",{"_index":1145,"title":{},"content":{"146":{"position":[[89,11]]}},"keywords":{}}],["debug",{"_index":598,"title":{},"content":{"38":{"position":[[893,5]]},"281":{"position":[[414,9]]},"364":{"position":[[806,9]]},"689":{"position":[[326,10]]},"729":{"position":[[399,6]]},"846":{"position":[[1431,9]]},"890":{"position":[[127,9]]},"1010":{"position":[[49,6],[218,5],[265,5]]},"1085":{"position":[[297,6],[3164,6]]},"1198":{"position":[[1137,6]]},"1202":{"position":[[438,6]]},"1282":{"position":[[618,5]]},"1305":{"position":[[309,6]]}},"keywords":{}}],["decad",{"_index":2528,"title":{},"content":{"408":{"position":[[482,6]]}},"keywords":{}}],["decemb",{"_index":317,"title":{},"content":{"19":{"position":[[7,8]]}},"keywords":{}}],["decentr",{"_index":473,"title":{},"content":{"29":{"position":[[69,13]]},"91":{"position":[[152,13]]},"289":{"position":[[656,13]]},"411":{"position":[[4866,17],[5224,13]]},"504":{"position":[[1417,13]]},"901":{"position":[[763,13]]},"903":{"position":[[268,14]]},"908":{"position":[[111,13]]}},"keywords":{}}],["decid",{"_index":1966,"title":{},"content":{"339":{"position":[[97,6]]},"412":{"position":[[128,8],[2320,7]]},"569":{"position":[[751,6]]},"590":{"position":[[852,6]]},"688":{"position":[[415,6]]},"698":{"position":[[2026,6]]},"701":{"position":[[877,6]]},"861":{"position":[[192,6]]},"1004":{"position":[[580,6]]},"1087":{"position":[[192,6]]},"1124":{"position":[[247,6],[411,6],[658,6]]}},"keywords":{}}],["decim",{"_index":2355,"title":{},"content":{"397":{"position":[[301,8]]}},"keywords":{}}],["decis",{"_index":2628,"title":{"981":{"position":[[7,9]]},"1071":{"position":[[7,10]]}},"content":{"411":{"position":[[3526,8]]},"412":{"position":[[5982,9]]},"441":{"position":[[631,9]]},"686":{"position":[[136,8]]},"1091":{"position":[[105,8]]}},"keywords":{}}],["decisions.y",{"_index":3907,"title":{},"content":{"690":{"position":[[140,13]]}},"keywords":{}}],["declar",{"_index":2942,"title":{},"content":{"445":{"position":[[1460,11]]},"674":{"position":[[267,7]]},"749":{"position":[[17924,7],[18046,7]]},"841":{"position":[[1241,11]]},"1018":{"position":[[723,7]]},"1311":{"position":[[18,7]]}},"keywords":{}}],["decod",{"_index":117,"title":{},"content":{"8":{"position":[[500,7],[610,7]]},"1213":{"position":[[281,6]]}},"keywords":{}}],["decompress",{"_index":2085,"title":{},"content":{"361":{"position":[[1053,12]]},"932":{"position":[[486,10]]}},"keywords":{}}],["decreas",{"_index":1398,"title":{"217":{"position":[[0,9]]}},"content":{"217":{"position":[[30,9]]},"311":{"position":[[114,9]]},"402":{"position":[[1638,10]]},"411":{"position":[[314,9]]},"534":{"position":[[649,10]]},"594":{"position":[[647,10]]},"639":{"position":[[167,10]]},"656":{"position":[[171,9]]},"698":{"position":[[2904,9]]},"820":{"position":[[414,9]]},"964":{"position":[[528,8]]},"966":{"position":[[387,8]]},"1093":{"position":[[414,8]]},"1094":{"position":[[604,10]]},"1124":{"position":[[1431,9]]},"1198":{"position":[[918,9]]},"1267":{"position":[[346,8]]}},"keywords":{}}],["decrypt",{"_index":1690,"title":{},"content":{"291":{"position":[[297,10]]},"315":{"position":[[1120,8]]},"412":{"position":[[13343,10]]},"555":{"position":[[147,9]]},"556":{"position":[[1315,9]]},"714":{"position":[[33,10],[229,8],[882,7]]},"716":{"position":[[400,7],[454,9]]},"723":{"position":[[2033,9]]},"971":{"position":[[142,7]]},"1038":{"position":[[99,9]]}},"keywords":{}}],["decryption.if",{"_index":3373,"title":{},"content":{"556":{"position":[[1188,13]]}},"keywords":{}}],["dedic",{"_index":1589,"title":{},"content":{"261":{"position":[[1150,9]]},"321":{"position":[[465,9]]},"390":{"position":[[1815,9]]},"520":{"position":[[268,9]]},"574":{"position":[[847,10]]},"579":{"position":[[63,9]]},"590":{"position":[[147,9]]},"1007":{"position":[[446,9]]}},"keywords":{}}],["deep",{"_index":880,"title":{},"content":{"61":{"position":[[15,4]]},"412":{"position":[[4772,4]]},"457":{"position":[[350,4]]},"875":{"position":[[5003,4]]},"1052":{"position":[[32,4],[97,4]]},"1108":{"position":[[688,4]]},"1309":{"position":[[698,4]]}},"keywords":{}}],["deepequ",{"_index":2687,"title":{},"content":{"412":{"position":[[4442,9],[4817,9]]},"1309":{"position":[[445,9],[743,9]]}},"keywords":{}}],["deepequal(a",{"_index":2694,"title":{},"content":{"412":{"position":[[4999,12]]},"1309":{"position":[[916,12]]}},"keywords":{}}],["deeper",{"_index":2123,"title":{},"content":{"369":{"position":[[24,6]]},"483":{"position":[[769,6]]},"567":{"position":[[27,6]]},"824":{"position":[[27,6]]},"839":{"position":[[167,6]]},"901":{"position":[[523,6]]}},"keywords":{}}],["deepli",{"_index":1999,"title":{},"content":{"352":{"position":[[37,6]]}},"keywords":{}}],["default",{"_index":54,"title":{"816":{"position":[[4,7]]},"1082":{"position":[[0,8]]}},"content":{"3":{"position":[[96,8]]},"298":{"position":[[855,7]]},"396":{"position":[[1954,7]]},"410":{"position":[[475,8],[1866,7]]},"411":{"position":[[4596,7],[5819,8]]},"421":{"position":[[1050,7]]},"494":{"position":[[432,7]]},"496":{"position":[[656,9],[673,7]]},"522":{"position":[[629,8],[695,8]]},"524":{"position":[[306,7]]},"559":{"position":[[787,7]]},"562":{"position":[[1582,7]]},"616":{"position":[[715,7]]},"617":{"position":[[1514,7],[1971,7]]},"635":{"position":[[201,8]]},"653":{"position":[[93,8]]},"656":{"position":[[214,8]]},"660":{"position":[[113,7]]},"681":{"position":[[4,8]]},"682":{"position":[[4,8]]},"698":{"position":[[377,7]]},"724":{"position":[[1349,8]]},"732":{"position":[[64,7]]},"746":{"position":[[4,8],[399,10],[440,8]]},"749":{"position":[[17425,7],[22910,7]]},"752":{"position":[[4,8]]},"759":{"position":[[848,9]]},"773":{"position":[[654,7]]},"815":{"position":[[238,7]]},"816":{"position":[[5,7]]},"818":{"position":[[359,8]]},"829":{"position":[[1855,7]]},"837":{"position":[[1897,7]]},"841":{"position":[[728,7]]},"854":{"position":[[1133,8]]},"886":{"position":[[488,8]]},"890":{"position":[[462,8]]},"898":{"position":[[330,8],[1113,7],[1184,7]]},"904":{"position":[[1010,8],[1645,7]]},"906":{"position":[[201,7],[1148,7]]},"907":{"position":[[4,7]]},"960":{"position":[[524,8],[590,8]]},"965":{"position":[[375,7]]},"968":{"position":[[4,8]]},"986":{"position":[[1388,8]]},"987":{"position":[[748,7]]},"988":{"position":[[620,7],[828,7],[1052,7],[1620,7]]},"995":{"position":[[871,9]]},"1002":{"position":[[4,8]]},"1066":{"position":[[4,8]]},"1082":{"position":[[1,7],[124,7],[406,8],[427,7]]},"1088":{"position":[[546,7]]},"1103":{"position":[[124,7]]},"1125":{"position":[[567,10]]},"1126":{"position":[[568,8]]},"1134":{"position":[[531,7]]},"1157":{"position":[[431,7]]},"1162":{"position":[[932,7]]},"1164":{"position":[[310,8]]},"1172":{"position":[[515,8]]},"1181":{"position":[[884,7]]},"1185":{"position":[[52,7]]},"1186":{"position":[[233,7]]},"1282":{"position":[[907,8]]},"1284":{"position":[[314,7]]},"1292":{"position":[[500,8]]},"1309":{"position":[[365,7],[959,7],[1235,7]]}},"keywords":{}}],["default).opf",{"_index":3716,"title":{},"content":{"640":{"position":[[153,14]]}},"keywords":{}}],["default:tru",{"_index":5547,"title":{},"content":{"1003":{"position":[[346,12]]}},"keywords":{}}],["default='_delet",{"_index":5460,"title":{},"content":{"988":{"position":[[2239,20]]}},"keywords":{}}],["default='servertimestamp",{"_index":4877,"title":{},"content":{"854":{"position":[[1577,27]]}},"keywords":{}}],["default='strong",{"_index":6017,"title":{},"content":{"1125":{"position":[[423,16]]}},"keywords":{}}],["default=100",{"_index":5125,"title":{},"content":{"886":{"position":[[1736,13]]},"1125":{"position":[[725,11]]}},"keywords":{}}],["default=300",{"_index":6046,"title":{},"content":{"1138":{"position":[[587,13]]}},"keywords":{}}],["default=5",{"_index":3755,"title":{},"content":{"653":{"position":[[923,10]]}},"keywords":{}}],["default=50",{"_index":6043,"title":{},"content":{"1134":{"position":[[754,12]]},"1164":{"position":[[255,12]]}},"keywords":{}}],["default=60",{"_index":3752,"title":{},"content":{"653":{"position":[[753,11]]}},"keywords":{}}],["default=60000",{"_index":4829,"title":{},"content":{"846":{"position":[[1038,14]]}},"keywords":{}}],["default=dis",{"_index":4874,"title":{},"content":{"854":{"position":[[962,18]]}},"keywords":{}}],["default=fals",{"_index":5783,"title":{},"content":{"1067":{"position":[[2458,15]]},"1164":{"position":[[1084,13]]}},"keywords":{}}],["default=on",{"_index":3749,"title":{},"content":{"653":{"position":[[467,12]]}},"keywords":{}}],["default=tru",{"_index":3756,"title":{},"content":{"653":{"position":[[1195,14],[1445,14]]},"846":{"position":[[389,14]]},"854":{"position":[[1055,14]]},"934":{"position":[[635,14]]},"988":{"position":[[1426,14]]}},"keywords":{}}],["defaultconflicthandl",{"_index":6495,"title":{},"content":{"1309":{"position":[[497,23]]}},"keywords":{}}],["defaultsasynchron",{"_index":4518,"title":{},"content":{"765":{"position":[[178,20]]}},"keywords":{}}],["defeat",{"_index":3627,"title":{},"content":{"614":{"position":[[967,7]]},"1316":{"position":[[3664,7]]}},"keywords":{}}],["defin",{"_index":590,"title":{"259":{"position":[[0,6]]}},"content":{"38":{"position":[[438,6]]},"51":{"position":[[236,6]]},"134":{"position":[[182,6]]},"135":{"position":[[270,7]]},"138":{"position":[[50,6]]},"166":{"position":[[196,8]]},"182":{"position":[[227,6]]},"194":{"position":[[126,6]]},"205":{"position":[[129,6]]},"212":{"position":[[263,6]]},"222":{"position":[[183,7]]},"252":{"position":[[159,6]]},"262":{"position":[[409,6]]},"280":{"position":[[12,8]]},"281":{"position":[[229,7]]},"360":{"position":[[708,6]]},"361":{"position":[[51,6]]},"367":{"position":[[752,6]]},"382":{"position":[[76,6]]},"392":{"position":[[1331,6]]},"398":{"position":[[1785,7]]},"403":{"position":[[451,6]]},"438":{"position":[[133,7]]},"482":{"position":[[723,6]]},"496":{"position":[[726,6]]},"527":{"position":[[104,6]]},"538":{"position":[[537,6]]},"554":{"position":[[1207,6]]},"567":{"position":[[257,8]]},"587":{"position":[[4,8]]},"590":{"position":[[644,6]]},"598":{"position":[[544,6]]},"617":{"position":[[376,7]]},"632":{"position":[[1421,6],[2296,6]]},"636":{"position":[[275,6]]},"638":{"position":[[212,7],[786,6]]},"678":{"position":[[30,7]]},"680":{"position":[[118,7]]},"688":{"position":[[392,6],[841,6]]},"715":{"position":[[15,6]]},"717":{"position":[[1305,6]]},"729":{"position":[[130,8]]},"749":{"position":[[1918,7],[2971,7],[12806,6],[17336,7],[17452,7],[17667,7],[18850,7],[19614,7]]},"751":{"position":[[1153,7]]},"759":{"position":[[1227,7],[1525,6]]},"780":{"position":[[351,7]]},"784":{"position":[[113,6]]},"788":{"position":[[13,7]]},"790":{"position":[[22,7]]},"792":{"position":[[24,7]]},"815":{"position":[[71,7],[298,8]]},"854":{"position":[[1388,7]]},"861":{"position":[[1313,6],[1899,6]]},"898":{"position":[[2028,6]]},"936":{"position":[[12,7]]},"937":{"position":[[63,6]]},"961":{"position":[[282,6]]},"988":{"position":[[2921,7]]},"1007":{"position":[[11,6]]},"1067":{"position":[[1511,7]]},"1074":{"position":[[27,6]]},"1078":{"position":[[9,6]]},"1079":{"position":[[43,7]]},"1082":{"position":[[28,7]]},"1085":{"position":[[341,6],[1136,6],[2146,7]]},"1100":{"position":[[482,6]]},"1108":{"position":[[66,7],[504,7]]},"1132":{"position":[[285,6]]},"1164":{"position":[[191,7]]},"1186":{"position":[[157,7]]},"1207":{"position":[[627,7]]},"1220":{"position":[[122,6]]}},"keywords":{}}],["defined</span>",{"_index":6185,"title":{},"content":{"1202":{"position":[[174,20]]}},"keywords":{}}],["definit",{"_index":1991,"title":{},"content":{"351":{"position":[[45,11]]},"360":{"position":[[281,12]]},"679":{"position":[[268,10]]},"700":{"position":[[158,10]]},"829":{"position":[[298,12]]},"1074":{"position":[[227,10]]}},"keywords":{}}],["deflat",{"_index":5316,"title":{},"content":{"932":{"position":[[1284,9],[1344,11]]}},"keywords":{}}],["degrad",{"_index":868,"title":{},"content":{"58":{"position":[[160,7]]},"300":{"position":[[815,7]]},"430":{"position":[[523,7]]},"587":{"position":[[182,8]]}},"keywords":{}}],["degre",{"_index":4101,"title":{},"content":{"739":{"position":[[697,8]]}},"keywords":{}}],["delay",{"_index":2126,"title":{},"content":{"369":{"position":[[1144,6]]},"394":{"position":[[1691,5]]},"407":{"position":[[428,5]]},"408":{"position":[[2344,6]]},"410":{"position":[[122,5]]},"415":{"position":[[226,8],[452,6]]},"486":{"position":[[101,6]]},"569":{"position":[[506,7]]},"571":{"position":[[290,6]]},"610":{"position":[[767,6],[1319,6]]},"630":{"position":[[157,5],[340,7]]},"632":{"position":[[1965,6]]},"801":{"position":[[527,6]]},"1119":{"position":[[160,5]]}},"keywords":{}}],["delet",{"_index":809,"title":{"684":{"position":[[0,8]]},"855":{"position":[[9,8]]},"867":{"position":[[9,8]]},"1049":{"position":[[0,9]]},"1050":{"position":[[4,8]]}},"content":{"52":{"position":[[601,6]]},"181":{"position":[[201,7]]},"305":{"position":[[587,8]]},"411":{"position":[[1269,7]]},"539":{"position":[[601,6]]},"599":{"position":[[628,6]]},"649":{"position":[[446,8]]},"653":{"position":[[419,7],[1123,7]]},"654":{"position":[[348,7],[394,7]]},"655":{"position":[[305,6],[371,7],[394,6],[466,7]]},"659":{"position":[[630,6]]},"684":{"position":[[9,6]]},"697":{"position":[[134,7],[318,7]]},"749":{"position":[[10624,7],[10739,7]]},"754":{"position":[[474,6]]},"778":{"position":[[79,8]]},"802":{"position":[[389,10]]},"826":{"position":[[652,7]]},"855":{"position":[[34,6],[95,8],[237,8]]},"861":{"position":[[1554,7],[1598,7],[1658,7],[1702,8],[2045,7],[2143,7],[2538,8]]},"862":{"position":[[1312,10],[1348,8]]},"867":{"position":[[34,6],[95,8],[232,8]]},"872":{"position":[[1159,9],[1325,7]]},"885":{"position":[[600,8],[695,8]]},"886":{"position":[[723,7],[1963,10],[2437,7],[3637,7],[4914,9]]},"887":{"position":[[643,6]]},"898":{"position":[[450,6],[506,8],[550,8],[580,7],[612,8],[661,9],[3578,6],[4442,8]]},"951":{"position":[[268,8]]},"955":{"position":[[142,6]]},"986":{"position":[[355,8],[434,8],[577,7],[1067,8],[1091,7],[1475,7]]},"988":{"position":[[1669,7],[1759,8],[1995,7],[2043,7],[2156,7],[2277,10],[3115,7]]},"999":{"position":[[29,7],[174,6],[219,6]]},"1004":{"position":[[618,8]]},"1007":{"position":[[1908,6]]},"1048":{"position":[[247,8]]},"1049":{"position":[[63,7]]},"1050":{"position":[[38,9]]},"1051":{"position":[[409,7]]},"1062":{"position":[[1,7],[70,7]]},"1102":{"position":[[1351,6]]},"1140":{"position":[[183,6]]}},"keywords":{}}],["deletedat",{"_index":5459,"title":{},"content":{"988":{"position":[[2204,11]]},"1048":{"position":[[164,9],[460,10]]}},"keywords":{}}],["deletedfield",{"_index":4879,"title":{},"content":{"855":{"position":[[296,12]]},"861":{"position":[[1908,12],[2117,15]]},"862":{"position":[[1298,13]]},"867":{"position":[[291,12]]},"886":{"position":[[1949,13],[4900,13]]},"898":{"position":[[3981,13]]},"986":{"position":[[1510,12]]},"988":{"position":[[2263,13]]}},"keywords":{}}],["deliv",{"_index":892,"title":{},"content":{"61":{"position":[[489,10]]},"267":{"position":[[357,9]]},"269":{"position":[[131,7]]},"283":{"position":[[416,10]]},"292":{"position":[[393,7]]},"317":{"position":[[248,10]]},"385":{"position":[[86,8]]},"408":{"position":[[5292,7]]},"410":{"position":[[458,8]]},"411":{"position":[[1798,10]]},"445":{"position":[[2480,10]]},"447":{"position":[[473,7]]},"483":{"position":[[56,8]]},"491":{"position":[[855,8]]},"498":{"position":[[561,7]]},"530":{"position":[[88,10]]},"570":{"position":[[319,9]]},"582":{"position":[[717,7]]},"641":{"position":[[385,8]]},"644":{"position":[[673,10]]}},"keywords":{}}],["delta",{"_index":591,"title":{},"content":{"38":{"position":[[456,5]]},"411":{"position":[[163,6]]}},"keywords":{}}],["delta"",{"_index":3943,"title":{},"content":{"698":{"position":[[2532,11]]}},"keywords":{}}],["delv",{"_index":903,"title":{},"content":{"65":{"position":[[75,5]]},"271":{"position":[[251,5]]},"278":{"position":[[176,5]]},"290":{"position":[[156,5]]},"369":{"position":[[18,5]]}},"keywords":{}}],["demand",{"_index":1623,"title":{},"content":{"267":{"position":[[1655,7]]},"351":{"position":[[61,6]]},"354":{"position":[[233,7]]},"356":{"position":[[20,6]]},"412":{"position":[[6395,7]]},"418":{"position":[[294,6]]},"435":{"position":[[356,6]]},"441":{"position":[[311,6]]},"502":{"position":[[194,7]]},"510":{"position":[[432,6]]},"574":{"position":[[724,7]]},"624":{"position":[[660,9]]},"1092":{"position":[[669,7]]}},"keywords":{}}],["demo",{"_index":1391,"title":{},"content":{"212":{"position":[[564,5]]},"394":{"position":[[1311,4]]},"480":{"position":[[18,4]]},"498":{"position":[[242,4],[273,4]]},"904":{"position":[[1202,4]]}},"keywords":{}}],["demo</h2>",{"_index":3393,"title":{},"content":{"559":{"position":[[562,15]]}},"keywords":{}}],["demonstr",{"_index":854,"title":{},"content":{"56":{"position":[[106,12]]},"523":{"position":[[224,12]]},"543":{"position":[[186,13]]},"603":{"position":[[184,13]]},"832":{"position":[[53,12]]},"906":{"position":[[308,13]]}},"keywords":{}}],["deni",{"_index":1778,"title":{},"content":{"300":{"position":[[671,4]]}},"keywords":{}}],["deno",{"_index":2931,"title":{"440":{"position":[[16,4]]},"1122":{"position":[[24,4]]},"1126":{"position":[[29,5]]}},"content":{"440":{"position":[[5,4]]},"1123":{"position":[[126,4],[161,4],[181,4],[775,4]]},"1124":{"position":[[286,4],[1226,4],[1762,4]]},"1126":{"position":[[65,4],[183,4],[483,4]]},"1247":{"position":[[452,5],[559,4]]}},"keywords":{}}],["deno.openkv(settings.openkvpath",{"_index":6019,"title":{},"content":{"1125":{"position":[[521,32]]}},"keywords":{}}],["denodeploy",{"_index":6013,"title":{},"content":{"1124":{"position":[[272,10],[1055,10]]},"1126":{"position":[[527,10]]}},"keywords":{}}],["denokv",{"_index":4616,"title":{"1123":{"position":[[8,7]]},"1125":{"position":[[10,6]]},"1126":{"position":[[10,6]]}},"content":{"793":{"position":[[373,6]]},"1123":{"position":[[1,6],[365,6],[450,6],[681,6]]},"1124":{"position":[[12,6],[36,7],[504,6],[689,6],[1004,7],[1488,6],[1571,7],[1624,6],[1826,7],[2152,6]]},"1125":{"position":[[12,6],[251,8]]},"1126":{"position":[[38,6],[328,6],[641,6]]},"1247":{"position":[[428,7],[462,6]]}},"keywords":{}}],["denokvdatabas",{"_index":6021,"title":{},"content":{"1126":{"position":[[392,17],[705,17]]}},"keywords":{}}],["denomin",{"_index":6572,"title":{},"content":{"1320":{"position":[[187,12]]}},"keywords":{}}],["depend",{"_index":122,"title":{"640":{"position":[[24,9]]},"727":{"position":[[5,11]]}},"content":{"8":{"position":[[640,9]]},"59":{"position":[[1,9]]},"128":{"position":[[79,13]]},"188":{"position":[[2097,11],[2290,13]]},"273":{"position":[[185,10]]},"353":{"position":[[4,7]]},"369":{"position":[[1489,9]]},"393":{"position":[[545,9]]},"398":{"position":[[3337,9]]},"408":{"position":[[940,9]]},"411":{"position":[[5348,10]]},"417":{"position":[[375,6]]},"461":{"position":[[661,9],[1025,7],[1553,7]]},"462":{"position":[[773,9]]},"483":{"position":[[173,13]]},"489":{"position":[[546,10]]},"500":{"position":[[483,10]]},"546":{"position":[[1,9]]},"578":{"position":[[42,7]]},"606":{"position":[[1,9]]},"662":{"position":[[1238,12]]},"666":{"position":[[203,12]]},"696":{"position":[[1013,7]]},"707":{"position":[[408,7]]},"710":{"position":[[1432,12]]},"717":{"position":[[1008,7]]},"726":{"position":[[47,12]]},"727":{"position":[[35,10]]},"729":{"position":[[160,12]]},"731":{"position":[[65,10]]},"765":{"position":[[146,9]]},"798":{"position":[[413,7]]},"815":{"position":[[170,9]]},"816":{"position":[[47,9]]},"821":{"position":[[358,9],[615,7]]},"837":{"position":[[1304,12]]},"838":{"position":[[1769,12]]},"872":{"position":[[22,13]]},"875":{"position":[[7643,7]]},"898":{"position":[[11,13]]},"903":{"position":[[47,7]]},"961":{"position":[[221,9]]},"962":{"position":[[191,9],[387,9]]},"988":{"position":[[2076,7]]},"990":{"position":[[367,9]]},"1033":{"position":[[993,12]]},"1049":{"position":[[24,9]]},"1065":{"position":[[1739,6]]},"1067":{"position":[[222,9]]},"1079":{"position":[[211,9]]},"1091":{"position":[[114,7]]},"1112":{"position":[[169,12]]},"1118":{"position":[[142,9]]},"1124":{"position":[[78,9]]},"1134":{"position":[[693,9]]},"1156":{"position":[[55,12]]},"1191":{"position":[[170,9],[477,9]]},"1222":{"position":[[620,9]]},"1227":{"position":[[82,12]]},"1265":{"position":[[75,12]]},"1271":{"position":[[850,9]]},"1296":{"position":[[1220,9]]},"1304":{"position":[[188,9]]},"1307":{"position":[[539,9]]},"1321":{"position":[[351,7]]}},"keywords":{}}],["dependency:npm",{"_index":3260,"title":{},"content":{"522":{"position":[[108,14]]}},"keywords":{}}],["deploy",{"_index":1629,"title":{},"content":{"269":{"position":[[251,8]]},"569":{"position":[[761,6]]},"702":{"position":[[382,6]]},"1123":{"position":[[131,7],[186,7],[266,10]]},"1124":{"position":[[1767,6]]},"1126":{"position":[[188,6]]}},"keywords":{}}],["deprec",{"_index":77,"title":{"1198":{"position":[[29,12]]}},"content":{"5":{"position":[[99,11]]},"435":{"position":[[83,10]]},"696":{"position":[[923,11]]},"835":{"position":[[609,10]]}},"keywords":{}}],["desc",{"_index":2404,"title":{},"content":{"398":{"position":[[1140,6]]},"400":{"position":[[304,6]]}},"keywords":{}}],["descend",{"_index":2323,"title":{},"content":{"394":{"position":[[1128,10]]},"400":{"position":[[243,10],[335,10]]}},"keywords":{}}],["describ",{"_index":723,"title":{},"content":{"47":{"position":[[273,9]]},"51":{"position":[[323,10]]},"538":{"position":[[624,10]]},"598":{"position":[[631,10]]},"704":{"position":[[411,9]]},"808":{"position":[[31,9]]},"830":{"position":[[25,9]]},"831":{"position":[[424,9]]},"832":{"position":[[79,9]]},"1212":{"position":[[222,9]]},"1215":{"position":[[456,9]]},"1311":{"position":[[330,10]]},"1316":{"position":[[1482,8]]}},"keywords":{}}],["described.learn",{"_index":2866,"title":{},"content":{"422":{"position":[[390,15]]}},"keywords":{}}],["descript",{"_index":769,"title":{},"content":{"51":{"position":[[310,12]]},"538":{"position":[[611,12]]},"598":{"position":[[618,12]]},"670":{"position":[[311,12]]},"699":{"position":[[347,12]]},"829":{"position":[[3147,11]]},"1191":{"position":[[585,12]]},"1208":{"position":[[1951,11]]},"1311":{"position":[[317,12]]}},"keywords":{}}],["deseri",{"_index":3056,"title":{},"content":{"464":{"position":[[953,13]]}},"keywords":{}}],["deserv",{"_index":3214,"title":{},"content":{"498":{"position":[[731,8]]}},"keywords":{}}],["design",{"_index":310,"title":{"981":{"position":[[0,6]]},"1071":{"position":[[0,6]]}},"content":{"18":{"position":[[301,8]]},"26":{"position":[[112,8]]},"34":{"position":[[76,8]]},"39":{"position":[[14,8],[253,6]]},"47":{"position":[[122,8]]},"100":{"position":[[24,8]]},"101":{"position":[[151,8]]},"153":{"position":[[73,8]]},"172":{"position":[[119,8]]},"179":{"position":[[52,8]]},"201":{"position":[[210,6]]},"212":{"position":[[108,6]]},"222":{"position":[[41,8]]},"227":{"position":[[15,8]]},"228":{"position":[[220,8]]},"230":{"position":[[9,8]]},"238":{"position":[[42,8]]},"254":{"position":[[9,8]]},"279":{"position":[[96,6]]},"289":{"position":[[80,8]]},"298":{"position":[[343,8]]},"300":{"position":[[796,6]]},"306":{"position":[[72,7]]},"325":{"position":[[145,6]]},"327":{"position":[[70,7]]},"356":{"position":[[891,7]]},"369":{"position":[[433,8]]},"378":{"position":[[62,8]]},"380":{"position":[[16,6]]},"390":{"position":[[1667,8]]},"396":{"position":[[374,8]]},"411":{"position":[[1171,7],[5783,6]]},"432":{"position":[[194,8]]},"444":{"position":[[51,8]]},"453":{"position":[[144,8]]},"460":{"position":[[790,6]]},"520":{"position":[[470,8]]},"525":{"position":[[65,7]]},"535":{"position":[[153,8]]},"595":{"position":[[164,8]]},"612":{"position":[[125,8]]},"613":{"position":[[36,8]]},"614":{"position":[[395,8]]},"618":{"position":[[230,8]]},"623":{"position":[[618,8]]},"631":{"position":[[43,8]]},"640":{"position":[[504,6]]},"686":{"position":[[210,9]]},"691":{"position":[[682,9]]},"698":{"position":[[2297,9]]},"723":{"position":[[2452,8]]},"836":{"position":[[1834,8]]},"902":{"position":[[483,6]]},"981":{"position":[[93,8]]},"990":{"position":[[284,8]]},"1006":{"position":[[232,6]]},"1008":{"position":[[50,6]]},"1072":{"position":[[1864,6]]},"1085":{"position":[[722,7],[1831,6]]}},"keywords":{}}],["desir",{"_index":3880,"title":{},"content":{"681":{"position":[[162,7]]},"759":{"position":[[1483,8]]},"818":{"position":[[250,7]]},"854":{"position":[[951,8]]}},"keywords":{}}],["desk",{"_index":3957,"title":{},"content":{"700":{"position":[[901,4]]}},"keywords":{}}],["desktop",{"_index":524,"title":{},"content":{"33":{"position":[[518,8]]},"207":{"position":[[165,7]]},"254":{"position":[[135,7]]},"298":{"position":[[656,8]]},"299":{"position":[[429,9],[512,8],[1044,7],[1306,7]]},"384":{"position":[[313,7]]},"408":{"position":[[1042,9],[5163,7]]},"412":{"position":[[10654,7]]},"500":{"position":[[776,8]]},"595":{"position":[[1382,7]]},"630":{"position":[[294,9]]},"640":{"position":[[281,7]]},"641":{"position":[[426,8]]},"708":{"position":[[28,7]]},"1270":{"position":[[432,7]]}},"keywords":{}}],["despit",{"_index":720,"title":{},"content":{"47":{"position":[[1,7]]},"412":{"position":[[15058,7]]},"427":{"position":[[1,7]]},"435":{"position":[[9,7]]},"624":{"position":[[865,7]]},"630":{"position":[[100,7]]},"1157":{"position":[[375,7]]}},"keywords":{}}],["destin",{"_index":2245,"title":{},"content":{"392":{"position":[[2703,12],[4609,12]]},"1020":{"position":[[88,12],[416,12],[544,11]]},"1022":{"position":[[517,12]]},"1023":{"position":[[178,12]]},"1024":{"position":[[264,12]]},"1032":{"position":[[121,11]]},"1033":{"position":[[58,11],[552,12],[781,12]]}},"keywords":{}}],["destroy",{"_index":3766,"title":{},"content":{"655":{"position":[[169,7]]}},"keywords":{}}],["detail",{"_index":869,"title":{"821":{"position":[[10,8]]},"876":{"position":[[23,8]]}},"content":{"58":{"position":[[198,7]]},"306":{"position":[[59,6]]},"356":{"position":[[373,7],[452,8],[816,7]]},"387":{"position":[[154,8]]},"404":{"position":[[676,8]]},"495":{"position":[[688,7]]},"544":{"position":[[419,8]]},"550":{"position":[[252,7]]},"567":{"position":[[209,8]]},"638":{"position":[[128,8]]},"749":{"position":[[15539,7],[15673,7],[15805,7]]},"831":{"position":[[449,7]]},"1208":{"position":[[1942,8]]}},"keywords":{}}],["detect",{"_index":745,"title":{"50":{"position":[[13,9]]},"129":{"position":[[13,9]]},"908":{"position":[[9,9]]}},"content":{"50":{"position":[[109,9],[330,9]]},"129":{"position":[[21,9],[34,6],[182,9],[243,8],[292,9],[643,9]]},"134":{"position":[[296,6]]},"302":{"position":[[455,6]]},"326":{"position":[[284,9]]},"390":{"position":[[1475,10]]},"403":{"position":[[305,7]]},"412":{"position":[[1132,10],[2218,7],[4543,6],[4607,6],[4671,6],[4694,6]]},"445":{"position":[[1023,6]]},"481":{"position":[[485,9]]},"491":{"position":[[486,7],[1419,8]]},"495":{"position":[[240,6]]},"569":{"position":[[685,6]]},"611":{"position":[[1088,9]]},"635":{"position":[[152,6]]},"740":{"position":[[640,8]]},"761":{"position":[[305,9]]},"875":{"position":[[3890,10],[3932,6],[4873,6]]},"908":{"position":[[35,9]]},"956":{"position":[[146,6]]},"988":{"position":[[1006,8]]},"990":{"position":[[622,6]]},"1111":{"position":[[4,6]]},"1154":{"position":[[88,6]]},"1161":{"position":[[179,7]]},"1180":{"position":[[179,7]]},"1228":{"position":[[199,7]]},"1308":{"position":[[266,8],[364,8]]},"1309":{"position":[[65,6],[185,10],[290,6],[597,6],[620,6]]}},"keywords":{}}],["determin",{"_index":2178,"title":{},"content":{"388":{"position":[[178,9]]},"399":{"position":[[172,10]]},"634":{"position":[[513,10]]},"698":{"position":[[253,9],[581,10]]},"780":{"position":[[61,11]]},"838":{"position":[[2284,9]]},"866":{"position":[[636,10]]},"875":{"position":[[1498,10]]},"1066":{"position":[[81,9]]},"1105":{"position":[[921,9]]},"1173":{"position":[[34,9]]}},"keywords":{}}],["determinism.limit",{"_index":3897,"title":{},"content":{"689":{"position":[[203,19]]}},"keywords":{}}],["determinist",{"_index":2677,"title":{},"content":{"412":{"position":[[3318,13]]},"683":{"position":[[504,13]]},"690":{"position":[[532,13]]},"698":{"position":[[422,13],[701,14]]},"897":{"position":[[189,13]]},"986":{"position":[[70,13],[118,13]]},"1065":{"position":[[1700,13],[1796,13]]},"1079":{"position":[[555,13]]},"1115":{"position":[[736,13]]},"1266":{"position":[[941,16]]},"1316":{"position":[[1445,13],[2330,13]]}},"keywords":{}}],["deterministically.your",{"_index":3908,"title":{},"content":{"690":{"position":[[309,22]]}},"keywords":{}}],["dev",{"_index":1792,"title":{"671":{"position":[[0,3]]},"675":{"position":[[12,3]]}},"content":{"301":{"position":[[677,3]]},"346":{"position":[[663,3]]},"412":{"position":[[13236,3]]},"675":{"position":[[10,3],[125,3]]},"676":{"position":[[48,3]]},"685":{"position":[[546,3]]},"749":{"position":[[6106,3],[20929,3],[21734,3]]},"793":{"position":[[63,3]]},"899":{"position":[[323,3]]},"966":{"position":[[508,3]]}},"keywords":{}}],["develop",{"_index":196,"title":{"348":{"position":[[54,11]]},"387":{"position":[[0,9]]},"411":{"position":[[0,9]]},"446":{"position":[[33,12]]},"478":{"position":[[11,12]]}},"content":{"14":{"position":[[26,9]]},"18":{"position":[[57,7]]},"19":{"position":[[444,11]]},"27":{"position":[[77,11]]},"34":{"position":[[436,10]]},"40":{"position":[[692,10]]},"47":{"position":[[378,10]]},"65":{"position":[[128,11],[2001,10]]},"74":{"position":[[64,10]]},"75":{"position":[[14,10]]},"76":{"position":[[106,11]]},"77":{"position":[[184,12]]},"83":{"position":[[234,11],[328,10]]},"89":{"position":[[234,11]]},"94":{"position":[[163,10],[321,12]]},"104":{"position":[[67,11]]},"105":{"position":[[48,12]]},"112":{"position":[[205,11]]},"114":{"position":[[79,12],[456,10]]},"116":{"position":[[44,9],[91,10]]},"118":{"position":[[366,11]]},"148":{"position":[[495,11]]},"149":{"position":[[79,12]]},"153":{"position":[[275,10]]},"156":{"position":[[204,10]]},"159":{"position":[[133,10]]},"161":{"position":[[58,10]]},"162":{"position":[[575,12],[746,10]]},"165":{"position":[[327,10]]},"166":{"position":[[244,10]]},"167":{"position":[[135,10]]},"168":{"position":[[68,10]]},"169":{"position":[[132,10]]},"170":{"position":[[93,10],[458,10]]},"173":{"position":[[1054,11],[2363,10]]},"174":{"position":[[253,10],[576,12],[881,11],[995,10],[2821,11],[3138,10]]},"175":{"position":[[495,10]]},"177":{"position":[[39,11],[85,10],[272,10]]},"179":{"position":[[388,10]]},"182":{"position":[[212,10]]},"185":{"position":[[257,10]]},"186":{"position":[[61,10]]},"189":{"position":[[749,10]]},"192":{"position":[[318,10]]},"194":{"position":[[112,10]]},"195":{"position":[[123,10]]},"196":{"position":[[108,10]]},"198":{"position":[[207,11]]},"207":{"position":[[334,11]]},"218":{"position":[[74,10]]},"219":{"position":[[136,10]]},"221":{"position":[[137,10]]},"222":{"position":[[280,10],[370,11]]},"226":{"position":[[454,12]]},"230":{"position":[[176,10]]},"232":{"position":[[133,10]]},"235":{"position":[[52,10],[148,10]]},"241":{"position":[[674,10]]},"265":{"position":[[388,10]]},"266":{"position":[[138,10],[364,10]]},"267":{"position":[[317,10],[1189,10]]},"269":{"position":[[116,11],[436,12]]},"278":{"position":[[262,12]]},"281":{"position":[[94,9],[322,11]]},"282":{"position":[[55,12]]},"286":{"position":[[107,11]]},"288":{"position":[[94,12]]},"293":{"position":[[97,11]]},"295":{"position":[[191,10]]},"299":{"position":[[1346,10]]},"301":{"position":[[429,9]]},"318":{"position":[[219,11],[593,10]]},"331":{"position":[[22,10]]},"347":{"position":[[79,12]]},"350":{"position":[[374,9]]},"351":{"position":[[245,9]]},"352":{"position":[[69,10]]},"353":{"position":[[809,12]]},"356":{"position":[[187,10]]},"358":{"position":[[6,10]]},"362":{"position":[[230,11],[1150,12]]},"364":{"position":[[67,12],[567,10]]},"370":{"position":[[9,10],[304,12]]},"371":{"position":[[16,10]]},"373":{"position":[[696,10]]},"377":{"position":[[230,10]]},"381":{"position":[[276,10]]},"384":{"position":[[42,12]]},"387":{"position":[[5,11],[393,12]]},"392":{"position":[[5190,9]]},"404":{"position":[[580,12]]},"408":{"position":[[3504,10]]},"409":{"position":[[299,10]]},"411":{"position":[[1574,10],[1820,9],[3857,10],[5413,10]]},"412":{"position":[[437,11],[593,12],[1220,10],[2458,11],[9436,10],[9611,9],[10335,10],[15013,10]]},"419":{"position":[[158,10]]},"420":{"position":[[576,10],[733,10],[1120,10]]},"421":{"position":[[1099,10]]},"424":{"position":[[77,10],[202,10]]},"427":{"position":[[80,10]]},"434":{"position":[[100,11]]},"436":{"position":[[70,10]]},"437":{"position":[[18,11]]},"441":{"position":[[28,12],[238,10],[602,10]]},"445":{"position":[[389,11],[1328,11],[1430,10],[1746,11],[1828,10],[2007,10],[2119,12],[2169,10],[2384,11],[2424,10]]},"446":{"position":[[1293,10],[1403,11]]},"447":{"position":[[209,11],[387,10],[624,12]]},"453":{"position":[[514,11]]},"455":{"position":[[147,10]]},"500":{"position":[[44,12]]},"503":{"position":[[170,10]]},"504":{"position":[[453,10]]},"510":{"position":[[51,12],[353,10],[521,10],[642,10]]},"511":{"position":[[79,12]]},"514":{"position":[[328,10]]},"518":{"position":[[105,10]]},"521":{"position":[[244,11]]},"524":{"position":[[88,10],[566,11]]},"525":{"position":[[641,10]]},"529":{"position":[[14,10]]},"530":{"position":[[35,12],[300,10],[575,11]]},"531":{"position":[[79,12]]},"535":{"position":[[106,11],[304,10],[335,10]]},"548":{"position":[[469,12]]},"556":{"position":[[1381,12],[1474,12]]},"563":{"position":[[71,10],[906,10]]},"569":{"position":[[25,10],[1042,11]]},"591":{"position":[[79,12]]},"595":{"position":[[106,11],[317,10],[348,10]]},"608":{"position":[[467,12]]},"618":{"position":[[512,10]]},"632":{"position":[[809,10]]},"635":{"position":[[252,10]]},"644":{"position":[[374,10],[755,9]]},"662":{"position":[[296,7]]},"666":{"position":[[22,11]]},"674":{"position":[[300,14],[356,14]]},"699":{"position":[[579,7]]},"702":{"position":[[7,10]]},"711":{"position":[[2330,9]]},"731":{"position":[[24,11]]},"749":{"position":[[20950,10]]},"798":{"position":[[638,9]]},"824":{"position":[[513,12]]},"838":{"position":[[325,7]]},"839":{"position":[[708,10]]},"898":{"position":[[2948,11]]},"981":{"position":[[250,10]]},"995":{"position":[[568,10]]},"1066":{"position":[[444,9]]},"1085":{"position":[[2169,10],[3427,11]]},"1124":{"position":[[1441,11]]},"1198":{"position":[[16,10],[2003,11]]},"1215":{"position":[[7,10]]},"1249":{"position":[[177,10]]}},"keywords":{}}],["developers.optim",{"_index":1218,"title":{},"content":{"174":{"position":[[1491,20]]}},"keywords":{}}],["development"",{"_index":1499,"title":{},"content":{"244":{"position":[[737,17]]},"419":{"position":[[1574,17]]}},"keywords":{}}],["development.electron",{"_index":2168,"title":{},"content":{"384":{"position":[[268,21]]}},"keywords":{}}],["devic",{"_index":176,"title":{"291":{"position":[[8,6]]},"900":{"position":[[66,7]]},"912":{"position":[[44,7]]}},"content":{"11":{"position":[[964,8]]},"28":{"position":[[498,6]]},"65":{"position":[[1752,7]]},"89":{"position":[[78,7]]},"91":{"position":[[59,8]]},"110":{"position":[[85,8]]},"123":{"position":[[134,7]]},"172":{"position":[[327,7]]},"173":{"position":[[1988,6],[2588,7],[2846,7]]},"174":{"position":[[2079,8],[2146,7]]},"184":{"position":[[344,8]]},"191":{"position":[[266,8]]},"195":{"position":[[115,7]]},"210":{"position":[[113,7]]},"218":{"position":[[228,6]]},"220":{"position":[[81,7]]},"224":{"position":[[141,8]]},"240":{"position":[[69,8],[267,8]]},"248":{"position":[[194,6]]},"250":{"position":[[113,7]]},"253":{"position":[[199,6]]},"269":{"position":[[368,7]]},"270":{"position":[[284,6]]},"273":{"position":[[164,7]]},"279":{"position":[[528,8]]},"280":{"position":[[204,7]]},"287":{"position":[[1179,8]]},"288":{"position":[[175,7]]},"289":{"position":[[405,7],[1702,7],[1913,7]]},"291":{"position":[[19,6],[196,6]]},"294":{"position":[[134,6]]},"298":{"position":[[723,8]]},"299":{"position":[[653,7],[1106,8]]},"300":{"position":[[623,6]]},"302":{"position":[[17,6]]},"309":{"position":[[84,7]]},"310":{"position":[[13,6],[264,6]]},"311":{"position":[[54,7],[152,7]]},"314":{"position":[[990,8]]},"318":{"position":[[334,8]]},"323":{"position":[[347,6]]},"328":{"position":[[169,7]]},"365":{"position":[[642,6]]},"367":{"position":[[200,7]]},"375":{"position":[[701,8]]},"376":{"position":[[140,7],[689,8]]},"377":{"position":[[22,7],[289,6]]},"380":{"position":[[88,6]]},"391":{"position":[[112,7]]},"403":{"position":[[175,8]]},"407":{"position":[[226,7],[284,7],[1074,8]]},"408":{"position":[[114,7],[953,6]]},"410":{"position":[[394,7],[1544,7]]},"411":{"position":[[3963,6],[4092,8],[4702,8],[4732,6],[5032,6],[5058,7]]},"412":{"position":[[632,6],[3132,8],[5774,6],[7844,9],[9368,7],[9703,7],[10607,8],[10763,7],[13221,6]]},"414":{"position":[[64,7]]},"415":{"position":[[52,7]]},"416":{"position":[[250,8]]},"417":{"position":[[62,7]]},"419":{"position":[[183,7],[1023,7],[1900,6]]},"424":{"position":[[144,7]]},"444":{"position":[[233,6],[501,7],[732,8]]},"445":{"position":[[1121,8],[2268,8]]},"446":{"position":[[392,6]]},"461":{"position":[[1141,7]]},"469":{"position":[[1267,7]]},"473":{"position":[[74,7]]},"481":{"position":[[199,6]]},"482":{"position":[[1058,6]]},"495":{"position":[[127,7]]},"500":{"position":[[714,6],[762,8]]},"504":{"position":[[1055,8]]},"516":{"position":[[387,8]]},"550":{"position":[[88,6]]},"556":{"position":[[1921,6]]},"565":{"position":[[19,6]]},"569":{"position":[[1207,8]]},"570":{"position":[[357,7]]},"571":{"position":[[456,6]]},"575":{"position":[[205,8],[501,8]]},"635":{"position":[[53,7]]},"638":{"position":[[154,6]]},"660":{"position":[[226,6]]},"662":{"position":[[605,7]]},"696":{"position":[[102,7],[1098,7]]},"704":{"position":[[167,6],[270,8],[294,7]]},"708":{"position":[[298,6]]},"736":{"position":[[471,7]]},"785":{"position":[[640,6]]},"836":{"position":[[1876,7],[1930,6]]},"838":{"position":[[1146,8]]},"840":{"position":[[78,7]]},"860":{"position":[[870,8]]},"872":{"position":[[3063,7]]},"896":{"position":[[60,7]]},"902":{"position":[[409,8]]},"903":{"position":[[421,8]]},"912":{"position":[[45,7],[398,6],[621,8]]},"932":{"position":[[281,6]]},"981":{"position":[[806,7],[930,7]]},"995":{"position":[[1088,6]]},"1121":{"position":[[139,7]]},"1123":{"position":[[339,7]]},"1215":{"position":[[194,6]]},"1271":{"position":[[195,7]]},"1304":{"position":[[1135,7],[1166,7]]},"1314":{"position":[[126,6]]},"1321":{"position":[[119,6]]}},"keywords":{}}],["device.data",{"_index":1202,"title":{},"content":{"173":{"position":[[1356,11]]}},"keywords":{}}],["device.memori",{"_index":1293,"title":{},"content":{"189":{"position":[[455,13]]}},"keywords":{}}],["devicereadi",{"_index":153,"title":{},"content":{"11":{"position":[[356,11],[732,11]]}},"keywords":{}}],["devices.in",{"_index":1572,"title":{},"content":{"254":{"position":[[456,10]]}},"keywords":{}}],["devices.stor",{"_index":1223,"title":{},"content":{"174":{"position":[[2342,15]]}},"keywords":{}}],["devices.they",{"_index":6539,"title":{},"content":{"1316":{"position":[[417,12]]}},"keywords":{}}],["devmod",{"_index":3374,"title":{},"content":{"556":{"position":[[1370,7],[1401,7]]}},"keywords":{}}],["devtool",{"_index":1790,"title":{},"content":{"301":{"position":[[570,8]]}},"keywords":{}}],["dexi",{"_index":511,"title":{"1146":{"position":[[6,5]]},"1148":{"position":[[7,5]]}},"content":{"33":{"position":[[102,5],[606,5]]},"872":{"position":[[3872,7]]},"1144":{"position":[[14,5],[139,7]]},"1145":{"position":[[48,5],[343,7]]},"1147":{"position":[[156,5],[465,5]]},"1148":{"position":[[1,5],[58,5],[207,5],[439,5],[470,5],[506,5],[629,7],[660,6],[692,5],[815,5]]},"1149":{"position":[[633,5],[788,7],[885,5]]},"1150":{"position":[[276,6]]}},"keywords":{}}],["dexie.j",{"_index":508,"title":{"33":{"position":[[0,9]]},"1142":{"position":[[10,8]]},"1143":{"position":[[0,8]]},"1144":{"position":[[11,8]]},"1147":{"position":[[5,8]]}},"content":{"33":{"position":[[1,8],[310,8],[457,8],[548,8]]},"411":{"position":[[3818,8]]},"710":{"position":[[676,8]]},"749":{"position":[[23061,8]]},"793":{"position":[[356,8]]},"1143":{"position":[[7,8]]},"1146":{"position":[[1,8],[111,8],[315,8]]},"1147":{"position":[[135,8]]},"1150":{"position":[[1,8]]},"1151":{"position":[[103,8],[770,8]]},"1152":{"position":[[24,8]]},"1235":{"position":[[121,8]]},"1247":{"position":[[141,9],[156,8],[195,8]]}},"keywords":{}}],["dexie.js.it",{"_index":6068,"title":{},"content":{"1143":{"position":[[505,11]]}},"keywords":{}}],["dexie/sqlit",{"_index":4810,"title":{},"content":{"841":{"position":[[999,12]]}},"keywords":{}}],["dexiecloud",{"_index":6075,"title":{},"content":{"1148":{"position":[[644,10],[781,13]]}},"keywords":{}}],["dexiedatabase.cloud.configur",{"_index":6078,"title":{},"content":{"1148":{"position":[[941,31]]}},"keywords":{}}],["dexiedatabasenam",{"_index":6077,"title":{},"content":{"1148":{"position":[[914,18]]}},"keywords":{}}],["di",{"_index":4089,"title":{},"content":{"737":{"position":[[489,7]]}},"keywords":{}}],["diagram",{"_index":4938,"title":{},"content":{"871":{"position":[[373,7]]}},"keywords":{}}],["dialect",{"_index":6573,"title":{},"content":{"1320":{"position":[[378,7]]}},"keywords":{}}],["dialog",{"_index":1095,"title":{},"content":{"130":{"position":[[420,7]]}},"keywords":{}}],["diarydirectori",{"_index":6199,"title":{},"content":{"1208":{"position":[[787,14]]}},"keywords":{}}],["diarydirectory.getfilehandle('example.txt",{"_index":6203,"title":{},"content":{"1208":{"position":[[934,43]]}},"keywords":{}}],["dictat",{"_index":6574,"title":{},"content":{"1320":{"position":[[455,7]]}},"keywords":{}}],["didn't",{"_index":2626,"title":{},"content":{"411":{"position":[[3307,6]]},"412":{"position":[[15032,6]]},"1085":{"position":[[2396,6]]}},"keywords":{}}],["diff",{"_index":2608,"title":{},"content":{"411":{"position":[[157,5],[282,4]]},"412":{"position":[[3633,4]]}},"keywords":{}}],["differ",{"_index":65,"title":{"131":{"position":[[0,9]]},"162":{"position":[[0,9]]},"189":{"position":[[0,9]]},"287":{"position":[[0,9]]},"336":{"position":[[0,9]]},"504":{"position":[[10,9]]},"524":{"position":[[0,9]]},"581":{"position":[[0,9]]},"640":{"position":[[0,9]]},"691":{"position":[[17,9]]},"706":{"position":[[30,9]]},"798":{"position":[[4,9]]},"1215":{"position":[[0,10]]},"1273":{"position":[[32,9]]}},"content":{"4":{"position":[[135,9]]},"5":{"position":[[57,9]]},"14":{"position":[[680,10],[934,10]]},"16":{"position":[[280,9]]},"19":{"position":[[191,10],[968,10]]},"24":{"position":[[640,9]]},"35":{"position":[[126,9]]},"37":{"position":[[164,9],[243,9]]},"47":{"position":[[1338,9]]},"72":{"position":[[73,9]]},"80":{"position":[[93,9]]},"109":{"position":[[101,9]]},"112":{"position":[[66,9]]},"113":{"position":[[181,9]]},"160":{"position":[[252,9]]},"162":{"position":[[87,9],[716,9]]},"174":{"position":[[2332,9],[2863,9]]},"184":{"position":[[167,9]]},"237":{"position":[[228,9]]},"239":{"position":[[71,9],[318,9]]},"299":{"position":[[23,6],[696,6]]},"301":{"position":[[102,9]]},"328":{"position":[[47,9]]},"361":{"position":[[1009,10]]},"364":{"position":[[250,9]]},"390":{"position":[[1511,6]]},"391":{"position":[[976,9]]},"392":{"position":[[3252,9]]},"393":{"position":[[173,10]]},"396":{"position":[[822,9]]},"398":{"position":[[3056,6]]},"399":{"position":[[601,9]]},"402":{"position":[[946,9],[2638,9],[2671,9]]},"404":{"position":[[940,9],[961,9]]},"412":{"position":[[10576,9],[10597,9],[11510,9]]},"420":{"position":[[755,9]]},"445":{"position":[[2356,9]]},"449":{"position":[[41,9]]},"451":{"position":[[749,10]]},"458":{"position":[[7,10]]},"459":{"position":[[9,10]]},"462":{"position":[[287,7]]},"502":{"position":[[1234,9]]},"504":{"position":[[1225,9]]},"517":{"position":[[224,9]]},"519":{"position":[[343,9]]},"524":{"position":[[55,9]]},"525":{"position":[[301,9]]},"612":{"position":[[1330,10]]},"613":{"position":[[853,9]]},"632":{"position":[[676,9]]},"641":{"position":[[129,11]]},"666":{"position":[[444,9]]},"681":{"position":[[876,9]]},"691":{"position":[[37,9],[555,9]]},"701":{"position":[[136,9]]},"704":{"position":[[260,9],[307,9]]},"705":{"position":[[690,9]]},"719":{"position":[[136,9],[343,9]]},"730":{"position":[[60,9]]},"743":{"position":[[100,9],[265,9]]},"749":{"position":[[4784,9],[5433,9],[13442,9],[23645,9]]},"759":{"position":[[601,9]]},"760":{"position":[[597,9]]},"764":{"position":[[1,9]]},"772":{"position":[[2558,9]]},"775":{"position":[[213,9]]},"784":{"position":[[38,9]]},"796":{"position":[[273,9]]},"798":{"position":[[128,9]]},"821":{"position":[[248,9]]},"830":{"position":[[236,9]]},"831":{"position":[[198,9]]},"832":{"position":[[426,10]]},"835":{"position":[[111,10]]},"836":{"position":[[317,9]]},"849":{"position":[[313,9]]},"855":{"position":[[286,9]]},"867":{"position":[[281,9]]},"879":{"position":[[82,9]]},"886":{"position":[[4026,9]]},"890":{"position":[[661,9]]},"898":{"position":[[3939,7]]},"904":{"position":[[2039,9],[3127,10]]},"935":{"position":[[110,9]]},"938":{"position":[[95,9]]},"962":{"position":[[124,9],[234,9],[257,9]]},"968":{"position":[[92,9]]},"982":{"position":[[687,9]]},"983":{"position":[[1115,9]]},"986":{"position":[[553,9],[1451,9]]},"988":{"position":[[1793,9]]},"1008":{"position":[[263,11]]},"1009":{"position":[[462,9]]},"1020":{"position":[[169,9],[196,9]]},"1021":{"position":[[46,9]]},"1067":{"position":[[176,10],[214,7]]},"1072":{"position":[[902,10]]},"1085":{"position":[[2885,9]]},"1091":{"position":[[75,9]]},"1100":{"position":[[36,9],[440,9]]},"1102":{"position":[[181,9]]},"1105":{"position":[[297,9],[360,9],[384,9]]},"1108":{"position":[[299,9]]},"1112":{"position":[[33,9],[116,9],[263,9]]},"1120":{"position":[[576,9]]},"1125":{"position":[[666,9]]},"1140":{"position":[[308,9]]},"1165":{"position":[[265,9]]},"1191":{"position":[[7,10],[74,10],[206,9],[467,9],[609,9],[662,10]]},"1215":{"position":[[40,11]]},"1222":{"position":[[697,7]]},"1246":{"position":[[851,9]]},"1250":{"position":[[451,10]]},"1267":{"position":[[49,9]]},"1271":{"position":[[1330,9]]},"1272":{"position":[[1,9],[33,9]]},"1274":{"position":[[395,9],[419,9]]},"1279":{"position":[[782,9],[806,9]]},"1295":{"position":[[1365,9]]},"1301":{"position":[[9,10]]},"1304":{"position":[[1125,9]]},"1305":{"position":[[1002,9]]},"1307":{"position":[[62,9]]},"1315":{"position":[[751,12],[967,11]]},"1316":{"position":[[1221,9],[1980,9],[3123,10]]},"1320":{"position":[[364,9]]},"1321":{"position":[[823,9]]},"1324":{"position":[[780,9]]}},"keywords":{}}],["differenti",{"_index":2643,"title":{},"content":{"411":{"position":[[5528,13]]}},"keywords":{}}],["diffi",{"_index":5581,"title":{"1008":{"position":[[0,5]]}},"content":{},"keywords":{}}],["difficult",{"_index":485,"title":{},"content":{"29":{"position":[[445,9]]},"47":{"position":[[230,9],[950,9]]},"535":{"position":[[934,10]]},"595":{"position":[[1009,10]]},"839":{"position":[[923,9]]},"1304":{"position":[[716,10]]}},"keywords":{}}],["difficulti",{"_index":2775,"title":{},"content":{"412":{"position":[[15263,13]]},"610":{"position":[[1542,12]]}},"keywords":{}}],["digest",{"_index":5303,"title":{"927":{"position":[[0,7]]}},"content":{"927":{"position":[[55,6],[163,6]]},"968":{"position":[[658,9]]},"1004":{"position":[[369,7]]}},"keywords":{}}],["digit",{"_index":1683,"title":{},"content":{"289":{"position":[[1530,7]]},"510":{"position":[[702,7]]}},"keywords":{}}],["dimens",{"_index":2333,"title":{},"content":{"395":{"position":[[551,10]]}},"keywords":{}}],["dimension",{"_index":2181,"title":{},"content":{"390":{"position":[[105,11]]},"396":{"position":[[266,11]]},"402":{"position":[[2444,14]]}},"keywords":{}}],["direct",{"_index":1961,"title":{"616":{"position":[[21,11]]}},"content":{"336":{"position":[[185,6]]},"381":{"position":[[38,11]]},"398":{"position":[[500,11],[624,10]]},"407":{"position":[[493,6]]},"429":{"position":[[257,6]]},"433":{"position":[[76,6],[629,6]]},"460":{"position":[[974,6]]},"504":{"position":[[1344,6]]},"574":{"position":[[651,6]]},"581":{"position":[[211,6]]},"616":{"position":[[61,10]]},"714":{"position":[[733,6]]},"749":{"position":[[460,9]]},"811":{"position":[[52,6]]},"841":{"position":[[519,6]]},"871":{"position":[[675,6]]},"901":{"position":[[377,6],[715,6]]},"1002":{"position":[[777,9]]},"1006":{"position":[[89,10]]},"1033":{"position":[[1035,11]]},"1115":{"position":[[526,6]]},"1324":{"position":[[175,6]]}},"keywords":{}}],["directli",{"_index":496,"title":{},"content":{"31":{"position":[[95,8]]},"47":{"position":[[25,8],[736,8]]},"130":{"position":[[238,8]]},"131":{"position":[[216,8]]},"162":{"position":[[255,8]]},"172":{"position":[[81,8]]},"210":{"position":[[135,9]]},"212":{"position":[[633,8]]},"219":{"position":[[186,8]]},"227":{"position":[[202,8]]},"248":{"position":[[11,8]]},"261":{"position":[[179,8]]},"265":{"position":[[165,8]]},"289":{"position":[[1725,8],[1939,9]]},"315":{"position":[[1039,8]]},"352":{"position":[[118,9],[340,8]]},"358":{"position":[[95,8]]},"376":{"position":[[117,8]]},"391":{"position":[[89,8]]},"408":{"position":[[1873,8],[3375,8],[3787,8],[4154,9]]},"411":{"position":[[2265,8],[5077,8]]},"413":{"position":[[64,8]]},"416":{"position":[[498,8]]},"440":{"position":[[421,8]]},"444":{"position":[[478,8]]},"453":{"position":[[113,8],[544,8]]},"454":{"position":[[781,8]]},"463":{"position":[[304,8]]},"467":{"position":[[558,8]]},"468":{"position":[[403,8]]},"469":{"position":[[930,8]]},"470":{"position":[[188,8]]},"473":{"position":[[51,8]]},"489":{"position":[[441,8]]},"493":{"position":[[118,8]]},"521":{"position":[[17,8]]},"542":{"position":[[682,8]]},"548":{"position":[[324,9]]},"555":{"position":[[726,8]]},"560":{"position":[[562,8]]},"571":{"position":[[211,8],[780,8]]},"585":{"position":[[203,8]]},"591":{"position":[[497,8]]},"602":{"position":[[348,8]]},"608":{"position":[[322,9]]},"612":{"position":[[890,8]]},"613":{"position":[[1075,8]]},"614":{"position":[[137,8]]},"616":{"position":[[413,8]]},"620":{"position":[[98,8]]},"688":{"position":[[547,8]]},"699":{"position":[[86,8]]},"703":{"position":[[70,8]]},"724":{"position":[[1272,8]]},"772":{"position":[[1303,8]]},"773":{"position":[[119,8]]},"778":{"position":[[335,8]]},"781":{"position":[[754,8]]},"800":{"position":[[227,8]]},"829":{"position":[[3906,9]]},"836":{"position":[[774,8],[1269,8]]},"875":{"position":[[6799,8]]},"890":{"position":[[733,8]]},"896":{"position":[[68,8]]},"897":{"position":[[56,8]]},"901":{"position":[[153,8]]},"902":{"position":[[66,8]]},"903":{"position":[[175,8]]},"939":{"position":[[75,8]]},"1040":{"position":[[72,8]]},"1065":{"position":[[181,8]]},"1072":{"position":[[1142,8]]},"1085":{"position":[[142,9]]},"1090":{"position":[[202,8]]},"1092":{"position":[[439,8]]},"1116":{"position":[[276,8]]},"1120":{"position":[[103,8],[662,8]]},"1121":{"position":[[318,9]]},"1185":{"position":[[68,8]]},"1192":{"position":[[86,8]]},"1214":{"position":[[791,8]]},"1271":{"position":[[97,8]]},"1272":{"position":[[224,8]]},"1294":{"position":[[2068,8]]},"1300":{"position":[[21,8]]}},"keywords":{}}],["directori",{"_index":3030,"title":{},"content":{"463":{"position":[[527,10]]},"647":{"position":[[281,10]]},"648":{"position":[[81,10],[173,10]]},"649":{"position":[[129,10]]},"1208":{"position":[[113,11],[655,9]]}},"keywords":{}}],["disabl",{"_index":3375,"title":{"675":{"position":[[0,7]]},"676":{"position":[[0,7]]},"761":{"position":[[0,7]]},"1151":{"position":[[0,9]]},"1178":{"position":[[0,9]]}},"content":{"556":{"position":[[1487,7]]},"675":{"position":[[152,7]]},"676":{"position":[[211,7]]},"761":{"position":[[323,7]]},"1151":{"position":[[852,7]]},"1164":{"position":[[488,7]]},"1174":{"position":[[723,7]]},"1178":{"position":[[849,7]]},"1282":{"position":[[1044,7]]}},"keywords":{}}],["disableversioncheck",{"_index":4503,"title":{},"content":{"761":{"position":[[371,21],[461,19],[523,22],[587,19],[666,22],[709,19],[789,22]]}},"keywords":{}}],["disablewarn",{"_index":3860,"title":{},"content":{"675":{"position":[[190,17],[228,15],[276,18]]}},"keywords":{}}],["disadvantag",{"_index":6476,"title":{},"content":{"1301":{"position":[[1347,12]]}},"keywords":{}}],["disallow",{"_index":5900,"title":{},"content":{"1085":{"position":[[2589,11]]}},"keywords":{}}],["disc",{"_index":507,"title":{},"content":{"32":{"position":[[259,5]]},"461":{"position":[[1116,4],[1578,4]]},"696":{"position":[[1072,4],[1341,4]]},"800":{"position":[[742,5]]},"837":{"position":[[521,4]]},"932":{"position":[[263,4]]},"977":{"position":[[59,4]]},"1119":{"position":[[83,5]]},"1120":{"position":[[260,4]]},"1174":{"position":[[196,5]]},"1180":{"position":[[332,4]]},"1184":{"position":[[161,5]]},"1192":{"position":[[106,4],[138,4],[342,4]]},"1239":{"position":[[340,4]]},"1246":{"position":[[1575,5]]},"1292":{"position":[[606,4]]},"1300":{"position":[[291,5],[439,4]]},"1301":{"position":[[225,5]]},"1304":{"position":[[421,5]]}},"keywords":{}}],["disconnect",{"_index":1188,"title":{},"content":{"164":{"position":[[110,12]]},"590":{"position":[[772,14]]},"626":{"position":[[950,11]]},"632":{"position":[[2660,14]]},"1104":{"position":[[637,13]]}},"keywords":{}}],["discord",{"_index":1598,"title":{},"content":{"263":{"position":[[426,7]]},"422":{"position":[[187,7]]},"644":{"position":[[313,7]]},"669":{"position":[[49,8]]},"793":{"position":[[1496,7]]},"824":{"position":[[386,7]]},"873":{"position":[[173,7]]},"899":{"position":[[431,7]]},"913":{"position":[[272,7]]}},"keywords":{}}],["discourag",{"_index":3682,"title":{},"content":{"624":{"position":[[1608,11]]}},"keywords":{}}],["discov",{"_index":3529,"title":{"1190":{"position":[[3,8]]}},"content":{"591":{"position":[[463,8]]},"906":{"position":[[135,8]]}},"keywords":{}}],["discoveri",{"_index":5250,"title":{},"content":{"903":{"position":[[329,10]]}},"keywords":{}}],["discret",{"_index":1647,"title":{},"content":{"279":{"position":[[195,8]]}},"keywords":{}}],["discuss",{"_index":2194,"title":{},"content":{"390":{"position":[[707,7]]},"422":{"position":[[7,7]]},"628":{"position":[[26,10]]},"668":{"position":[[273,7]]},"705":{"position":[[1180,10]]}},"keywords":{}}],["disk",{"_index":498,"title":{},"content":{"31":{"position":[[164,4]]},"162":{"position":[[653,5]]},"236":{"position":[[194,4]]},"265":{"position":[[267,4],[536,4],[641,4],[806,4]]},"267":{"position":[[1339,4]]},"298":{"position":[[37,4],[243,4],[555,4]]},"299":{"position":[[273,5]]},"304":{"position":[[114,4]]},"311":{"position":[[204,4]]},"358":{"position":[[109,4]]},"361":{"position":[[425,4]]},"376":{"position":[[288,4]]},"385":{"position":[[157,4]]},"408":{"position":[[1003,4],[1116,4]]},"412":{"position":[[7778,5],[10021,5]]},"461":{"position":[[1200,4]]},"638":{"position":[[906,4]]},"696":{"position":[[1992,4]]},"1208":{"position":[[1785,5]]}},"keywords":{}}],["display",{"_index":812,"title":{},"content":{"54":{"position":[[21,7]]},"73":{"position":[[132,7]]},"327":{"position":[[136,8]]},"335":{"position":[[116,10]]},"379":{"position":[[242,7]]},"634":{"position":[[639,10]]},"696":{"position":[[408,7],[565,8]]},"700":{"position":[[1087,7]]},"736":{"position":[[33,8],[141,7]]},"781":{"position":[[64,7],[101,7]]}},"keywords":{}}],["displaystoragefulldialog",{"_index":1817,"title":{},"content":{"302":{"position":[[1055,27]]}},"keywords":{}}],["disrupt",{"_index":3692,"title":{},"content":{"630":{"position":[[177,7]]}},"keywords":{}}],["dist",{"_index":3833,"title":{},"content":{"668":{"position":[[206,4]]}},"keywords":{}}],["dist/work",{"_index":6315,"title":{},"content":{"1266":{"position":[[459,18],[681,14]]}},"keywords":{}}],["distanc",{"_index":2289,"title":{"393":{"position":[[37,9]]}},"content":{"393":{"position":[[223,9],[243,9],[478,8],[846,8],[979,8]]},"394":{"position":[[358,8],[795,9],[981,8]]},"396":{"position":[[880,8],[1140,8],[1273,9],[1376,8],[1849,8],[1897,8]]},"397":{"position":[[1406,8],[1451,8],[1540,9],[1979,8]]},"398":{"position":[[549,8],[1511,8],[1591,9],[1793,9],[2664,8],[2744,9]]},"402":{"position":[[440,9],[1147,8]]},"780":{"position":[[437,8]]}},"keywords":{}}],["distancetoindex",{"_index":2397,"title":{},"content":{"398":{"position":[[900,15],[2186,15],[2272,15]]}},"keywords":{}}],["distinct",{"_index":3675,"title":{},"content":{"624":{"position":[[76,8]]}},"keywords":{}}],["distingu",{"_index":4735,"title":{},"content":{"826":{"position":[[199,13]]}},"keywords":{}}],["distinguish",{"_index":1928,"title":{},"content":{"327":{"position":[[15,14]]},"612":{"position":[[936,13]]}},"keywords":{}}],["distribut",{"_index":426,"title":{"240":{"position":[[27,11]]}},"content":{"26":{"position":[[173,11]]},"91":{"position":[[19,10]]},"134":{"position":[[6,11]]},"184":{"position":[[51,11]]},"240":{"position":[[4,11]]},"250":{"position":[[357,11]]},"289":{"position":[[640,11]]},"339":{"position":[[212,11]]},"393":{"position":[[570,12]]},"412":{"position":[[801,11],[14961,11]]},"635":{"position":[[471,11]]},"644":{"position":[[576,11]]},"701":{"position":[[663,11]]},"772":{"position":[[271,11]]},"798":{"position":[[268,12],[505,12]]},"821":{"position":[[631,12],[861,12]]},"903":{"position":[[92,10]]},"1088":{"position":[[483,10]]}},"keywords":{}}],["dive",{"_index":881,"title":{},"content":{"61":{"position":[[20,4]]},"151":{"position":[[8,6]]},"263":{"position":[[371,4]]},"425":{"position":[[7,4]]},"462":{"position":[[68,4]]},"567":{"position":[[22,4]]},"572":{"position":[[1,4]]},"644":{"position":[[1,4]]},"824":{"position":[[22,4]]}},"keywords":{}}],["diverg",{"_index":2657,"title":{},"content":{"412":{"position":[[692,9]]}},"keywords":{}}],["divers",{"_index":1662,"title":{},"content":{"284":{"position":[[215,7]]},"287":{"position":[[118,7]]},"381":{"position":[[510,7]]},"504":{"position":[[16,7]]},"631":{"position":[[411,7]]},"1195":{"position":[[65,8]]}},"keywords":{}}],["divid",{"_index":3469,"title":{},"content":{"571":{"position":[[1613,7]]},"701":{"position":[[285,6]]},"707":{"position":[[28,7]]}},"keywords":{}}],["dm1",{"_index":4292,"title":{},"content":{"749":{"position":[[12188,3]]}},"keywords":{}}],["dm2",{"_index":4293,"title":{},"content":{"749":{"position":[[12279,3]]}},"keywords":{}}],["dm3",{"_index":4294,"title":{},"content":{"749":{"position":[[12406,3]]}},"keywords":{}}],["dm4",{"_index":4295,"title":{},"content":{"749":{"position":[[12487,3]]}},"keywords":{}}],["dm5",{"_index":4296,"title":{},"content":{"749":{"position":[[12560,3]]}},"keywords":{}}],["do",{"_index":1633,"title":{"1032":{"position":[[16,5]]}},"content":{"273":{"position":[[233,5]]},"412":{"position":[[9343,5],[10369,5]]},"451":{"position":[[612,5]]},"460":{"position":[[494,5]]},"616":{"position":[[384,5]]},"617":{"position":[[990,3]]},"723":{"position":[[903,5]]},"872":{"position":[[2859,5]]},"876":{"position":[[48,5]]},"881":{"position":[[316,3]]},"912":{"position":[[337,5]]},"1027":{"position":[[71,5]]},"1068":{"position":[[129,5]]},"1072":{"position":[[921,5],[955,5]]},"1106":{"position":[[378,5]]},"1138":{"position":[[553,5]]},"1164":{"position":[[1379,5]]},"1188":{"position":[[267,5]]},"1246":{"position":[[171,5],[491,5]]},"1251":{"position":[[279,5]]},"1274":{"position":[[594,5]]},"1279":{"position":[[981,5]]},"1296":{"position":[[473,5]]},"1304":{"position":[[1322,5]]},"1305":{"position":[[67,5]]},"1317":{"position":[[489,3]]}},"keywords":{}}],["doabl",{"_index":2747,"title":{},"content":{"412":{"position":[[11732,6]]},"1317":{"position":[[749,7]]}},"keywords":{}}],["doc",{"_index":806,"title":{"923":{"position":[[0,4]]}},"content":{"52":{"position":[[467,3],[614,3]]},"209":{"position":[[734,6],[895,4]]},"255":{"position":[[1114,4],[1232,5]]},"306":{"position":[[47,5]]},"392":{"position":[[2764,6],[4717,6],[4765,5]]},"394":{"position":[[790,4]]},"397":{"position":[[1805,6]]},"398":{"position":[[1601,3],[2311,4],[2754,3]]},"400":{"position":[[35,4]]},"493":{"position":[[248,3]]},"495":{"position":[[679,4]]},"539":{"position":[[467,3],[614,3]]},"555":{"position":[[263,3]]},"556":{"position":[[798,3]]},"562":{"position":[[547,3],[636,4]]},"599":{"position":[[494,3]]},"632":{"position":[[2517,6]]},"670":{"position":[[413,4],[461,4],[490,4]]},"724":{"position":[[963,3],[1024,3]]},"734":{"position":[[874,5]]},"752":{"position":[[816,4],[1269,4]]},"770":{"position":[[451,3]]},"791":{"position":[[142,3],[462,3]]},"792":{"position":[[273,3]]},"810":{"position":[[335,3]]},"811":{"position":[[315,3]]},"813":{"position":[[339,3]]},"841":{"position":[[157,3],[189,3],[241,3],[1183,3],[1404,3]]},"886":{"position":[[1217,3],[1227,4],[3117,3],[3127,3]]},"887":{"position":[[452,4],[671,4]]},"888":{"position":[[1027,4],[1069,5]]},"889":{"position":[[129,5]]},"898":{"position":[[3509,4],[3524,5],[3601,4]]},"942":{"position":[[176,3]]},"943":{"position":[[373,3]]},"946":{"position":[[148,3]]},"947":{"position":[[159,4]]},"988":{"position":[[2686,4]]},"1020":{"position":[[469,6],[582,3],[589,5]]},"1022":{"position":[[572,6],[598,3],[605,5]]},"1023":{"position":[[228,6],[254,3],[261,5]]},"1024":{"position":[[314,6],[340,3],[347,5]]},"1033":{"position":[[590,6]]},"1036":{"position":[[108,4]]},"1057":{"position":[[594,3]]},"1065":{"position":[[75,5],[93,4],[137,4]]},"1173":{"position":[[220,5]]},"1311":{"position":[[1272,4]]},"1314":{"position":[[644,4]]}},"keywords":{}}],["doc._delet",{"_index":5211,"title":{},"content":{"898":{"position":[[1889,12]]}},"keywords":{}}],["doc.ag",{"_index":5220,"title":{},"content":{"898":{"position":[[3567,10],[3585,8]]}},"keywords":{}}],["doc.bestfriend_",{"_index":4686,"title":{},"content":{"811":{"position":[[392,16]]}},"keywords":{}}],["doc.categori",{"_index":5621,"title":{},"content":{"1020":{"position":[[663,12]]}},"keywords":{}}],["doc.embed",{"_index":2316,"title":{},"content":{"394":{"position":[[836,14]]}},"keywords":{}}],["doc.firstnam",{"_index":4054,"title":{},"content":{"724":{"position":[[973,13],[1034,14]]},"1311":{"position":[[1365,15]]}},"keywords":{}}],["doc.id",{"_index":5106,"title":{},"content":{"885":{"position":[[2248,7]]}},"keywords":{}}],["doc.lastnam",{"_index":4055,"title":{},"content":{"724":{"position":[[995,12]]}},"keywords":{}}],["doc.modify(data",{"_index":5712,"title":{},"content":{"1048":{"position":[[545,15]]}},"keywords":{}}],["doc.nam",{"_index":3177,"title":{},"content":{"493":{"position":[[273,8]]},"571":{"position":[[1162,8]]}},"keywords":{}}],["doc.populate('bestfriend",{"_index":4681,"title":{},"content":{"810":{"position":[[412,27]]}},"keywords":{}}],["doc.primari",{"_index":2249,"title":{},"content":{"392":{"position":[[2914,12]]},"397":{"position":[[1936,12]]},"1020":{"position":[[640,12]]},"1022":{"position":[[838,12]]},"1023":{"position":[[507,12]]},"1024":{"position":[[413,13],[509,12]]}},"keywords":{}}],["doc.primary}).remov",{"_index":5627,"title":{},"content":{"1022":{"position":[[687,23]]},"1023":{"position":[[338,23]]}},"keywords":{}}],["doc.putattach",{"_index":3369,"title":{},"content":{"556":{"position":[[916,19]]},"792":{"position":[[335,19]]}},"keywords":{}}],["doc.putattachmentbase64",{"_index":5295,"title":{},"content":{"918":{"position":[[104,25]]}},"keywords":{}}],["doc.receivers.map(receiv",{"_index":5630,"title":{},"content":{"1022":{"position":[[793,26]]}},"keywords":{}}],["doc.remov",{"_index":810,"title":{},"content":{"52":{"position":[[690,13]]},"539":{"position":[[690,13]]},"684":{"position":[[235,13]]}},"keywords":{}}],["doc.text.split",{"_index":5639,"title":{},"content":{"1023":{"position":[[414,16]]}},"keywords":{}}],["doc.upd",{"_index":807,"title":{},"content":{"52":{"position":[[543,12]]},"539":{"position":[[543,12]]},"599":{"position":[[570,12]]},"857":{"position":[[374,12]]},"1048":{"position":[[439,12]]}},"keywords":{}}],["doc.updatecrdt",{"_index":3889,"title":{},"content":{"684":{"position":[[164,16]]}},"keywords":{}}],["doc.updatedat",{"_index":5105,"title":{},"content":{"885":{"position":[[2069,14],[2120,14],[2170,14]]}},"keywords":{}}],["doc1",{"_index":4256,"title":{},"content":{"749":{"position":[[9507,4]]}},"keywords":{}}],["doc10",{"_index":4269,"title":{},"content":{"749":{"position":[[10465,5]]}},"keywords":{}}],["doc11",{"_index":4272,"title":{},"content":{"749":{"position":[[10588,5]]}},"keywords":{}}],["doc13",{"_index":4274,"title":{},"content":{"749":{"position":[[10692,5]]}},"keywords":{}}],["doc14",{"_index":4275,"title":{},"content":{"749":{"position":[[10798,5]]}},"keywords":{}}],["doc15",{"_index":4277,"title":{},"content":{"749":{"position":[[10889,5]]}},"keywords":{}}],["doc16",{"_index":4278,"title":{},"content":{"749":{"position":[[10971,5]]}},"keywords":{}}],["doc17",{"_index":4280,"title":{},"content":{"749":{"position":[[11109,5]]}},"keywords":{}}],["doc18",{"_index":4281,"title":{},"content":{"749":{"position":[[11250,5]]}},"keywords":{}}],["doc19",{"_index":4282,"title":{},"content":{"749":{"position":[[11361,5]]}},"keywords":{}}],["doc2",{"_index":4259,"title":{},"content":{"749":{"position":[[9652,4]]}},"keywords":{}}],["doc20",{"_index":4284,"title":{},"content":{"749":{"position":[[11460,5]]}},"keywords":{}}],["doc21",{"_index":4285,"title":{},"content":{"749":{"position":[[11536,5]]}},"keywords":{}}],["doc22",{"_index":4288,"title":{},"content":{"749":{"position":[[11681,5]]}},"keywords":{}}],["doc23",{"_index":4290,"title":{},"content":{"749":{"position":[[11778,5]]}},"keywords":{}}],["doc24",{"_index":4291,"title":{},"content":{"749":{"position":[[11887,5]]}},"keywords":{}}],["doc3",{"_index":4260,"title":{},"content":{"749":{"position":[[9736,4]]}},"keywords":{}}],["doc4",{"_index":4261,"title":{},"content":{"749":{"position":[[9824,4]]}},"keywords":{}}],["doc5",{"_index":4262,"title":{},"content":{"749":{"position":[[9931,4]]}},"keywords":{}}],["doc6",{"_index":4264,"title":{},"content":{"749":{"position":[[10045,4]]}},"keywords":{}}],["doc7",{"_index":4265,"title":{},"content":{"749":{"position":[[10163,4]]}},"keywords":{}}],["doc8",{"_index":4266,"title":{},"content":{"749":{"position":[[10272,4]]}},"keywords":{}}],["doc9",{"_index":4268,"title":{},"content":{"749":{"position":[[10377,4]]}},"keywords":{}}],["doc[k",{"_index":5152,"title":{},"content":{"887":{"position":[[650,7]]}},"keywords":{}}],["docafteredit",{"_index":5703,"title":{},"content":{"1045":{"position":[[122,12]]}},"keywords":{}}],["docdata",{"_index":2381,"title":{},"content":{"397":{"position":[[1920,7]]},"403":{"position":[[1007,8]]},"795":{"position":[[149,7]]},"846":{"position":[[844,7],[1279,7]]},"948":{"position":[[380,7]]},"986":{"position":[[730,7]]},"1044":{"position":[[456,8]]},"1061":{"position":[[271,8]]},"1311":{"position":[[1232,8]]}},"keywords":{}}],["docdata.ag",{"_index":5698,"title":{},"content":{"1044":{"position":[[418,11],[432,11]]},"1061":{"position":[[187,11],[201,11]]},"1296":{"position":[[888,11]]}},"keywords":{}}],["docdata.ageidcustomindex",{"_index":6459,"title":{},"content":{"1296":{"position":[[861,24]]}},"keywords":{}}],["docdata.id.padstart(idmaxlength",{"_index":6460,"title":{},"content":{"1296":{"position":[[902,32]]}},"keywords":{}}],["docdata['idx",{"_index":2386,"title":{},"content":{"397":{"position":[[2149,13]]},"403":{"position":[[921,13]]}},"keywords":{}}],["docker",{"_index":4893,"title":{},"content":{"861":{"position":[[296,7],[311,6],[322,6],[383,6],[473,6],[508,6],[546,6],[850,6],[873,6],[901,6]]},"865":{"position":[[196,6],[211,6]]},"872":{"position":[[441,6]]}},"keywords":{}}],["docorundefin",{"_index":5739,"title":{},"content":{"1057":{"position":[[330,14],[431,14]]}},"keywords":{}}],["docread",{"_index":2414,"title":{},"content":{"398":{"position":[[1738,8],[2101,8],[2553,8],[2564,8],[2891,8]]}},"keywords":{}}],["docs">",{"_index":3176,"title":{},"content":{"493":{"position":[[209,14],[255,14]]}},"keywords":{}}],["docs.color",{"_index":6526,"title":{},"content":{"1314":{"position":[[653,10],[678,10]]}},"keywords":{}}],["docs.foreach(d",{"_index":1136,"title":{},"content":{"143":{"position":[[531,14],[716,14]]}},"keywords":{}}],["docs.length",{"_index":2420,"title":{},"content":{"398":{"position":[[2575,12]]},"888":{"position":[[1087,11]]}},"keywords":{}}],["docs.map((doc",{"_index":3182,"title":{},"content":{"494":{"position":[[335,15]]}},"keywords":{}}],["docs.map(d",{"_index":2419,"title":{},"content":{"398":{"position":[[2516,10]]}},"keywords":{}}],["docs.rend",{"_index":3179,"title":{},"content":{"493":{"position":[[474,12]]}},"keywords":{}}],["docs/api/database/changes.html",{"_index":4828,"title":{},"content":{"846":{"position":[[994,30]]}},"keywords":{}}],["docs:instal",{"_index":3840,"title":{},"content":{"670":{"position":[[516,12]]}},"keywords":{}}],["docs:serv",{"_index":3841,"title":{},"content":{"670":{"position":[[548,10]]}},"keywords":{}}],["docsaft",{"_index":2401,"title":{},"content":{"398":{"position":[[991,10]]}},"keywords":{}}],["docsafter.map(d",{"_index":2407,"title":{},"content":{"398":{"position":[[1393,15]]}},"keywords":{}}],["docsbefor",{"_index":2400,"title":{},"content":{"398":{"position":[[978,12]]}},"keywords":{}}],["docsbefore.map(d",{"_index":2405,"title":{},"content":{"398":{"position":[[1350,16]]}},"keywords":{}}],["docsmap",{"_index":5361,"title":{},"content":{"951":{"position":[[367,7]]}},"keywords":{}}],["docsperindexsid",{"_index":2392,"title":{},"content":{"398":{"position":[[757,16],[1158,16],[1319,16],[3232,16]]},"402":{"position":[[1493,16]]}},"keywords":{}}],["docssign",{"_index":3181,"title":{},"content":{"494":{"position":[[278,10]]}},"keywords":{}}],["docssignal.valu",{"_index":3184,"title":{},"content":{"494":{"position":[[468,16]]}},"keywords":{}}],["docswithdist",{"_index":2408,"title":{},"content":{"398":{"position":[[1447,16],[2600,16]]}},"keywords":{}}],["docswithdistance.sort(sortbyobjectnumberproperty('distance')).revers",{"_index":2412,"title":{},"content":{"398":{"position":[[1627,72],[2780,72]]}},"keywords":{}}],["doctostr",{"_index":4056,"title":{},"content":{"724":{"position":[[1011,12]]}},"keywords":{}}],["document",{"_index":152,"title":{"73":{"position":[[11,9]]},"75":{"position":[[11,8]]},"81":{"position":[[8,9]]},"104":{"position":[[11,9]]},"106":{"position":[[11,8]]},"111":{"position":[[8,9]]},"231":{"position":[[13,9]]},"235":{"position":[[11,8]]},"236":{"position":[[8,9]]},"279":{"position":[[7,8]]},"282":{"position":[[35,10]]},"350":{"position":[[0,8]]},"365":{"position":[[36,10]]},"366":{"position":[[29,10]]},"371":{"position":[[19,9]]},"457":{"position":[[21,10]]},"684":{"position":[[9,10]]},"793":{"position":[[5,13]]},"800":{"position":[[20,8]]},"982":{"position":[[23,8]]},"1011":{"position":[[6,9]]},"1012":{"position":[[14,9]]},"1024":{"position":[[39,10]]},"1253":{"position":[[4,8]]}},"content":{"11":{"position":[[347,8]]},"14":{"position":[[760,9]]},"16":{"position":[[198,9]]},"19":{"position":[[79,8]]},"23":{"position":[[36,8]]},"24":{"position":[[442,9],[748,8]]},"25":{"position":[[58,8]]},"32":{"position":[[103,8]]},"33":{"position":[[405,8]]},"41":{"position":[[164,8]]},"47":{"position":[[617,8],[842,8]]},"73":{"position":[[12,10]]},"75":{"position":[[47,8]]},"81":{"position":[[44,8]]},"84":{"position":[[211,14]]},"104":{"position":[[26,10],[164,9]]},"106":{"position":[[34,8]]},"111":{"position":[[59,10],[89,9]]},"114":{"position":[[224,14]]},"138":{"position":[[92,10]]},"149":{"position":[[224,14]]},"151":{"position":[[332,8]]},"168":{"position":[[190,9]]},"174":{"position":[[446,9],[492,9],[646,9],[966,8],[1042,10],[2358,9],[2413,9]]},"175":{"position":[[217,14]]},"179":{"position":[[309,8]]},"181":{"position":[[212,10]]},"188":{"position":[[2814,8],[2834,8],[3182,9],[3265,9]]},"194":{"position":[[144,8]]},"204":{"position":[[243,8]]},"208":{"position":[[166,9]]},"209":{"position":[[955,9]]},"231":{"position":[[42,9],[194,10]]},"235":{"position":[[26,8],[107,10]]},"236":{"position":[[35,9]]},"255":{"position":[[122,9],[1086,11],[1238,9]]},"267":{"position":[[489,8],[613,8],[672,9],[831,9],[1509,8]]},"279":{"position":[[50,8],[172,9],[394,8]]},"282":{"position":[[184,9]]},"301":{"position":[[229,9]]},"302":{"position":[[626,9]]},"303":{"position":[[366,10],[495,9]]},"311":{"position":[[124,8]]},"315":{"position":[[1095,8]]},"316":{"position":[[483,8]]},"317":{"position":[[151,8]]},"322":{"position":[[181,9]]},"335":{"position":[[245,9]]},"339":{"position":[[41,9]]},"345":{"position":[[98,8]]},"347":{"position":[[224,14]]},"350":{"position":[[50,8],[213,9]]},"352":{"position":[[360,10]]},"353":{"position":[[208,9],[414,10],[661,9],[747,8]]},"354":{"position":[[41,8],[358,10]]},"357":{"position":[[471,8]]},"359":{"position":[[147,9]]},"360":{"position":[[55,9],[666,8]]},"361":{"position":[[169,9],[394,9],[503,9]]},"362":{"position":[[210,9],[1061,8],[1295,14]]},"364":{"position":[[496,9],[698,8]]},"365":{"position":[[25,9]]},"366":{"position":[[30,9],[152,8],[253,9]]},"367":{"position":[[14,9],[784,9]]},"369":{"position":[[322,10]]},"371":{"position":[[236,9]]},"372":{"position":[[208,8]]},"381":{"position":[[306,9]]},"382":{"position":[[83,8]]},"386":{"position":[[310,13]]},"387":{"position":[[139,14]]},"390":{"position":[[630,8],[697,9]]},"392":{"position":[[470,9],[1292,10],[1411,9],[1783,9],[1858,9],[1955,8],[2281,9],[2529,10],[3122,9]]},"394":{"position":[[204,9],[331,10],[1210,9],[1277,8],[1457,9],[1611,9],[1675,10]]},"395":{"position":[[185,9],[274,10]]},"397":{"position":[[402,8]]},"399":{"position":[[420,10]]},"402":{"position":[[754,9],[1237,8],[1450,9]]},"408":{"position":[[2973,9],[4529,10],[4847,9]]},"410":{"position":[[1673,10]]},"411":{"position":[[3457,8]]},"412":{"position":[[2274,10],[3160,8],[4557,9],[4708,8],[4758,9],[10483,9],[14395,8]]},"419":{"position":[[1600,13]]},"426":{"position":[[282,9]]},"429":{"position":[[608,9]]},"430":{"position":[[420,10],[450,9]]},"432":{"position":[[251,10]]},"452":{"position":[[611,10]]},"457":{"position":[[85,9]]},"459":{"position":[[486,9]]},"462":{"position":[[844,9]]},"464":{"position":[[816,8],[1031,8],[1309,8],[1388,9]]},"465":{"position":[[30,10],[87,9]]},"466":{"position":[[57,9],[576,9]]},"467":{"position":[[19,9],[487,9],[681,9]]},"469":{"position":[[300,9],[719,9],[812,9]]},"482":{"position":[[105,8]]},"483":{"position":[[749,13]]},"487":{"position":[[311,8]]},"490":{"position":[[178,8]]},"491":{"position":[[1366,9]]},"493":{"position":[[99,10],[396,9],[459,9],[492,8]]},"496":{"position":[[349,8]]},"511":{"position":[[224,14]]},"531":{"position":[[224,14]]},"535":{"position":[[664,8],[844,8]]},"556":{"position":[[1273,8]]},"561":{"position":[[51,10],[162,9]]},"564":{"position":[[124,9]]},"566":{"position":[[163,9]]},"567":{"position":[[187,13]]},"575":{"position":[[680,9]]},"582":{"position":[[526,8]]},"585":{"position":[[106,10]]},"588":{"position":[[55,10]]},"591":{"position":[[224,14]]},"631":{"position":[[324,9]]},"632":{"position":[[172,9],[556,8],[2322,9],[2347,9]]},"634":{"position":[[301,8]]},"635":{"position":[[86,8],[122,8]]},"639":{"position":[[53,9]]},"653":{"position":[[400,8],[1131,9]]},"654":{"position":[[356,9]]},"655":{"position":[[33,9],[83,10],[316,9],[379,10],[405,9],[474,9]]},"661":{"position":[[1546,8]]},"662":{"position":[[206,9],[2579,9]]},"664":{"position":[[20,13]]},"670":{"position":[[437,13]]},"679":{"position":[[331,13]]},"680":{"position":[[1203,8]]},"681":{"position":[[67,8],[520,8]]},"682":{"position":[[50,8],[218,8]]},"683":{"position":[[358,8],[645,9],[713,9],[789,8],[867,8],[954,8]]},"684":{"position":[[18,8]]},"685":{"position":[[76,8],[110,8],[266,8],[311,8],[371,9],[484,9],[585,8],[609,8]]},"686":{"position":[[652,8]]},"687":{"position":[[67,8],[199,8],[327,8]]},"688":{"position":[[58,8],[428,8],[770,8]]},"691":{"position":[[66,8],[594,8]]},"698":{"position":[[48,9],[147,8],[221,9],[299,8],[499,8],[559,9],[623,8],[653,8],[855,8],[1175,8],[1299,8],[1325,8],[1498,10],[1840,8],[1969,9],[2344,9],[2422,9],[2740,8]]},"700":{"position":[[427,8],[1125,8]]},"701":{"position":[[153,9],[296,10],[801,9],[890,9],[1043,8]]},"702":{"position":[[115,9],[225,10],[473,10]]},"703":{"position":[[230,8]]},"705":{"position":[[203,8],[468,8]]},"710":{"position":[[240,10],[1887,8]]},"711":{"position":[[2005,8]]},"714":{"position":[[150,8],[606,9],[805,9],[1061,9]]},"717":{"position":[[277,8]]},"719":{"position":[[386,9]]},"723":{"position":[[1080,8],[1481,9],[2320,9]]},"724":{"position":[[696,9],[778,8],[886,8],[1078,9],[1550,9]]},"749":{"position":[[6767,8],[8917,8],[8959,8],[9124,9],[10632,8],[10719,8],[11189,9],[11256,8],[11899,8],[12082,8],[12296,8],[12318,8],[13695,9],[14226,9],[14297,8],[14472,9],[22499,9],[23394,9],[23817,9]]},"751":{"position":[[307,8],[369,8],[418,8],[1078,8],[1536,9],[1843,9]]},"752":{"position":[[1203,9]]},"754":{"position":[[49,9]]},"756":{"position":[[156,9]]},"764":{"position":[[42,8],[108,9],[246,9],[313,8]]},"767":{"position":[[52,9],[176,8]]},"768":{"position":[[26,8],[139,8]]},"769":{"position":[[29,8],[150,8]]},"770":{"position":[[195,9],[256,10],[590,10]]},"781":{"position":[[810,10]]},"793":{"position":[[5,13],[1087,9]]},"795":{"position":[[43,10],[106,8]]},"796":{"position":[[1300,9]]},"798":{"position":[[670,9]]},"800":{"position":[[89,9],[125,8],[367,9],[416,8],[486,9],[560,9],[718,8]]},"810":{"position":[[157,8]]},"816":{"position":[[107,8]]},"820":{"position":[[709,10]]},"821":{"position":[[673,10]]},"824":{"position":[[69,13],[345,14]]},"826":{"position":[[149,8],[407,8],[567,8],[673,8],[998,8]]},"829":{"position":[[3831,9],[3865,9]]},"831":{"position":[[562,14]]},"836":{"position":[[1423,8]]},"837":{"position":[[370,9],[488,9],[766,9],[2082,10]]},"838":{"position":[[235,9],[2793,9]]},"841":{"position":[[449,8]]},"844":{"position":[[191,8]]},"846":{"position":[[663,9],[777,9],[1196,9]]},"854":{"position":[[1233,9]]},"855":{"position":[[41,10],[115,8],[211,9]]},"856":{"position":[[69,8]]},"857":{"position":[[55,9],[193,10]]},"861":{"position":[[1210,9],[1290,10],[1345,8],[1606,10],[1666,9],[1790,8],[1943,9],[2101,8]]},"863":{"position":[[406,9],[568,9],[653,8]]},"866":{"position":[[655,9],[703,8]]},"867":{"position":[[41,10],[115,8],[206,9]]},"868":{"position":[[79,13]]},"872":{"position":[[1150,8],[1311,9]]},"875":{"position":[[1412,9],[1604,8],[1795,8],[1952,9],[2188,9],[2360,9],[2839,10],[3040,10],[3473,10],[3741,9],[4023,8],[4560,10],[5199,8],[5812,8],[8306,10],[9272,9]]},"881":{"position":[[87,9]]},"885":{"position":[[191,8],[341,9],[375,8],[409,8],[788,10],[1112,8],[1956,9],[1987,8],[2326,9],[2434,8],[2595,10]]},"886":{"position":[[689,9],[1266,9],[1470,9],[1571,10],[2170,8],[2878,8],[3007,9],[3094,9],[3599,9]]},"888":{"position":[[236,8],[331,10],[955,9],[1058,10]]},"889":{"position":[[683,9]]},"897":{"position":[[126,9]]},"903":{"position":[[536,8]]},"904":{"position":[[1143,8]]},"908":{"position":[[313,8]]},"921":{"position":[[69,9]]},"934":{"position":[[417,9]]},"936":{"position":[[28,9]]},"942":{"position":[[24,9]]},"943":{"position":[[57,8],[96,8],[356,9]]},"944":{"position":[[30,9],[462,9],[550,8]]},"945":{"position":[[30,9],[284,8]]},"946":{"position":[[13,8]]},"947":{"position":[[41,10]]},"948":{"position":[[174,9],[552,8]]},"949":{"position":[[9,9]]},"950":{"position":[[68,9],[124,8],[155,9],[230,8],[356,8]]},"951":{"position":[[11,9],[197,8],[223,9],[233,9]]},"952":{"position":[[54,8]]},"953":{"position":[[225,9]]},"954":{"position":[[86,10]]},"962":{"position":[[180,10]]},"971":{"position":[[184,9]]},"977":{"position":[[11,9]]},"983":{"position":[[6,8],[67,9],[257,9],[556,8],[630,8]]},"984":{"position":[[200,9],[317,9],[398,9],[611,10]]},"986":{"position":[[56,9],[155,9],[335,9],[454,8],[585,10],[697,9],[906,9],[1076,10],[1099,8],[1373,10],[1483,10]]},"987":{"position":[[55,8],[303,8],[606,8]]},"988":{"position":[[1712,8],[1741,8],[1882,9],[2066,9],[2459,9],[2938,9],[3027,9],[3201,8],[3893,9],[4034,9],[4125,10],[4199,10],[4509,9],[4745,8],[5402,10]]},"990":{"position":[[16,8],[144,8],[438,8],[581,9]]},"993":{"position":[[99,8],[226,8]]},"995":{"position":[[1255,8]]},"999":{"position":[[230,9]]},"1002":{"position":[[85,9],[460,9],[1113,9]]},"1003":{"position":[[48,8]]},"1004":{"position":[[268,9],[537,9],[674,8],[736,8]]},"1007":{"position":[[72,8]]},"1012":{"position":[[21,10],[58,9],[174,11]]},"1013":{"position":[[35,8],[201,9],[247,9],[433,9],[585,9],[652,9]]},"1014":{"position":[[17,8],[76,8],[294,9]]},"1015":{"position":[[17,8]]},"1017":{"position":[[58,8]]},"1018":{"position":[[361,8],[408,9],[699,8]]},"1020":{"position":[[515,9]]},"1022":{"position":[[40,9],[100,9],[163,9]]},"1024":{"position":[[38,8],[117,9],[161,8]]},"1026":{"position":[[155,9]]},"1028":{"position":[[156,9]]},"1035":{"position":[[13,8]]},"1036":{"position":[[9,9],[167,9]]},"1038":{"position":[[37,9]]},"1039":{"position":[[124,8]]},"1041":{"position":[[13,8]]},"1042":{"position":[[11,9]]},"1043":{"position":[[42,9]]},"1044":{"position":[[182,9]]},"1047":{"position":[[18,8],[84,8],[197,9]]},"1048":{"position":[[32,9],[260,8],[349,8]]},"1052":{"position":[[259,8],[418,9]]},"1055":{"position":[[129,10]]},"1056":{"position":[[272,8]]},"1057":{"position":[[270,8],[527,8]]},"1059":{"position":[[349,8]]},"1061":{"position":[[250,8]]},"1062":{"position":[[19,10],[78,10],[97,9],[220,9]]},"1063":{"position":[[27,8]]},"1065":{"position":[[1026,8],[1773,10],[2012,9]]},"1066":{"position":[[476,9]]},"1067":{"position":[[34,9],[88,8],[587,12],[713,8],[854,8],[1091,8],[1855,8]]},"1068":{"position":[[230,8],[258,8],[392,8]]},"1069":{"position":[[671,9],[832,9]]},"1072":{"position":[[21,8],[102,8],[217,9],[445,10],[1094,9],[2254,9],[2339,8]]},"1077":{"position":[[156,8]]},"1078":{"position":[[92,8],[744,8]]},"1082":{"position":[[82,8]]},"1085":{"position":[[82,9],[949,8],[1929,9],[2440,8],[2961,8],[3077,9]]},"1101":{"position":[[389,9]]},"1102":{"position":[[1260,9],[1318,9],[1367,9]]},"1105":{"position":[[76,9],[551,9],[960,8]]},"1106":{"position":[[78,8],[193,8],[226,8],[289,8]]},"1107":{"position":[[113,9],[244,9]]},"1108":{"position":[[703,8]]},"1124":{"position":[[1191,9]]},"1132":{"position":[[879,10],[920,9],[1281,8],[1474,9]]},"1134":{"position":[[605,9]]},"1158":{"position":[[552,9],[644,10]]},"1162":{"position":[[464,8]]},"1164":{"position":[[208,8]]},"1181":{"position":[[551,8]]},"1184":{"position":[[134,8]]},"1186":{"position":[[189,9]]},"1192":{"position":[[518,10],[785,11]]},"1194":{"position":[[305,8],[335,9],[364,9],[415,9],[472,9],[520,9],[550,10],[587,9],[629,9],[693,9],[746,9],[787,9],[839,9],[934,10],[971,9]]},"1198":{"position":[[516,9],[571,8],[1072,9],[1290,9]]},"1228":{"position":[[78,14]]},"1246":{"position":[[1081,9],[1770,10]]},"1249":{"position":[[381,8]]},"1253":{"position":[[51,8],[143,9]]},"1257":{"position":[[16,8]]},"1258":{"position":[[89,8]]},"1271":{"position":[[430,9]]},"1294":{"position":[[288,9],[1228,8],[2087,9]]},"1295":{"position":[[137,9],[176,9],[570,9],[1235,9]]},"1296":{"position":[[271,9],[629,8],[748,8]]},"1304":{"position":[[1580,8]]},"1305":{"position":[[479,8],[776,8],[813,8]]},"1307":{"position":[[81,8],[235,9],[356,8],[905,8]]},"1308":{"position":[[72,9],[100,9],[316,8],[471,8],[537,8],[579,8]]},"1309":{"position":[[79,8],[634,8],[684,9]]},"1311":{"position":[[1257,9],[1444,8]]},"1313":{"position":[[654,8]]},"1314":{"position":[[546,9]]},"1315":{"position":[[1418,9]]},"1316":{"position":[[3169,9],[3195,8],[3218,8]]},"1317":{"position":[[116,8],[166,8],[263,8]]},"1318":{"position":[[67,9],[209,9]]},"1319":{"position":[[189,9],[276,8]]},"1320":{"position":[[562,9],[592,10],[619,8],[832,8],[887,9]]},"1321":{"position":[[682,10],[809,9],[890,10],[942,9]]},"1322":{"position":[[200,8],[248,8],[371,8]]},"1323":{"position":[[97,9],[207,8]]},"1324":{"position":[[573,8]]}},"keywords":{}}],["document'",{"_index":2378,"title":{},"content":{"397":{"position":[[1472,10]]},"571":{"position":[[1290,10]]},"1051":{"position":[[13,10]]}},"keywords":{}}],["document(",{"_index":5124,"title":{},"content":{"886":{"position":[[1383,12]]}},"keywords":{}}],["document).ready(async",{"_index":1943,"title":{},"content":{"335":{"position":[[147,23]]}},"keywords":{}}],["document.addeventlistener('devicereadi",{"_index":165,"title":{},"content":{"11":{"position":[[609,40]]}},"keywords":{}}],["document.find",{"_index":6166,"title":{},"content":{"1194":{"position":[[679,13]]}},"keywords":{}}],["document.getelementbyid('#mylist').innerhtml",{"_index":3468,"title":{},"content":{"571":{"position":[[1189,44]]}},"keywords":{}}],["document.if",{"_index":5438,"title":{},"content":{"982":{"position":[[482,11]]}},"keywords":{}}],["document.pushhandl",{"_index":5441,"title":{},"content":{"983":{"position":[[377,20]]}},"keywords":{}}],["document.rxdb",{"_index":3891,"title":{},"content":{"686":{"position":[[390,13]]}},"keywords":{}}],["document.th",{"_index":5804,"title":{},"content":{"1074":{"position":[[252,12]]},"1305":{"position":[[671,12]]}},"keywords":{}}],["documentationjoin",{"_index":4977,"title":{},"content":{"873":{"position":[[151,17]]}},"keywords":{}}],["documentdata",{"_index":5756,"title":{},"content":{"1063":{"position":[[67,12]]}},"keywords":{}}],["documentid",{"_index":3740,"title":{},"content":{"649":{"position":[[371,11]]}},"keywords":{}}],["documents+checkpoint",{"_index":5479,"title":{},"content":{"988":{"position":[[5311,21]]}},"keywords":{}}],["documents.count",{"_index":6169,"title":{},"content":{"1194":{"position":[[918,15]]}},"keywords":{}}],["documents.cross",{"_index":3535,"title":{},"content":{"595":{"position":[[925,15]]}},"keywords":{}}],["documents.length",{"_index":5000,"title":{},"content":{"875":{"position":[[2638,16]]}},"keywords":{}}],["documents.sort((a",{"_index":5098,"title":{},"content":{"885":{"position":[[1705,18]]}},"keywords":{}}],["documents.th",{"_index":6111,"title":{},"content":{"1162":{"position":[[710,13]]},"1181":{"position":[[798,13]]}},"keywords":{}}],["documents/field",{"_index":2756,"title":{},"content":{"412":{"position":[[12907,17]]}},"keywords":{}}],["documentsasynchron",{"_index":4517,"title":{},"content":{"765":{"position":[[156,21]]}},"keywords":{}}],["documentscr",{"_index":4845,"title":{},"content":{"849":{"position":[[511,15]]}},"keywords":{}}],["documentsfromremot",{"_index":5467,"title":{},"content":{"988":{"position":[[3813,19],[4136,20]]}},"keywords":{}}],["documentsfromremote.length",{"_index":5468,"title":{},"content":{"988":{"position":[[3934,26],[4318,26]]}},"keywords":{}}],["documentsno",{"_index":6403,"title":{},"content":{"1292":{"position":[[321,11],[675,11]]}},"keywords":{}}],["documents—particularli",{"_index":2101,"title":{},"content":{"362":{"position":[[792,22]]}},"keywords":{}}],["documentth",{"_index":5805,"title":{},"content":{"1074":{"position":[[299,11]]}},"keywords":{}}],["doe",{"_index":5800,"title":{},"content":{"1072":{"position":[[2364,5],[2391,4],[2524,4],[2697,6]]}},"keywords":{}}],["doesdocumentdatamatch",{"_index":5755,"title":{"1063":{"position":[[0,24]]}},"content":{},"keywords":{}}],["doesdocumentdatamatch(documentdata",{"_index":5758,"title":{},"content":{"1063":{"position":[[160,39],[264,39]]}},"keywords":{}}],["doesn't",{"_index":559,"title":{},"content":{"35":{"position":[[366,7]]},"42":{"position":[[101,7]]},"65":{"position":[[314,7]]},"249":{"position":[[24,7]]},"287":{"position":[[6,7],[1036,7]]},"390":{"position":[[1283,7],[1797,7]]},"410":{"position":[[1323,7]]},"411":{"position":[[4502,7]]},"412":{"position":[[8732,7]]},"521":{"position":[[101,7]]},"534":{"position":[[380,7]]},"535":{"position":[[724,7]]},"594":{"position":[[378,7]]},"595":{"position":[[745,7]]},"632":{"position":[[938,7]]},"1072":{"position":[[613,7],[1024,7],[1614,7]]},"1287":{"position":[[209,7]]}},"keywords":{}}],["doesn’t",{"_index":3409,"title":{},"content":{"559":{"position":[[1400,7]]}},"keywords":{}}],["dollar",{"_index":848,"title":{},"content":{"55":{"position":[[1017,6]]},"542":{"position":[[726,6]]},"749":{"position":[[6537,6]]},"826":{"position":[[53,6],[241,6]]},"1117":{"position":[[273,6]]},"1118":{"position":[[17,6]]}},"keywords":{}}],["dom",{"_index":1914,"title":{"335":{"position":[[13,3]]}},"content":{"320":{"position":[[34,3]]},"323":{"position":[[137,3]]},"326":{"position":[[190,3]]},"335":{"position":[[98,4],[389,3]]},"346":{"position":[[517,3]]},"460":{"position":[[1018,4]]},"571":{"position":[[805,3]]},"676":{"position":[[97,4]]},"829":{"position":[[79,3]]}},"keywords":{}}],["dom.indexeddb.warningquota",{"_index":1759,"title":{},"content":{"299":{"position":[[1252,27]]}},"keywords":{}}],["domain",{"_index":2612,"title":{"617":{"position":[[15,6]]}},"content":{"411":{"position":[[1616,6]]},"432":{"position":[[338,7]]},"450":{"position":[[243,6]]},"461":{"position":[[868,6]]},"617":{"position":[[48,6],[1261,6]]},"688":{"position":[[566,6]]},"849":{"position":[[255,6]]},"890":{"position":[[567,6]]},"1157":{"position":[[171,7]]}},"keywords":{}}],["domainfirefox",{"_index":3017,"title":{},"content":{"461":{"position":[[818,14]]}},"keywords":{}}],["domainsafari",{"_index":3018,"title":{},"content":{"461":{"position":[[843,13]]}},"keywords":{}}],["don't",{"_index":1108,"title":{},"content":{"131":{"position":[[866,5]]},"282":{"position":[[213,5]]},"346":{"position":[[412,5]]},"411":{"position":[[2195,5]]},"412":{"position":[[10062,5]]},"496":{"position":[[414,5]]},"497":{"position":[[159,5]]},"571":{"position":[[1666,5]]},"668":{"position":[[312,5]]},"689":{"position":[[349,5]]},"752":{"position":[[1319,5]]},"806":{"position":[[207,5]]},"1084":{"position":[[426,5]]}},"keywords":{}}],["done",{"_index":1444,"title":{},"content":{"243":{"position":[[66,5],[145,5],[271,5],[320,5],[361,5]]},"255":{"position":[[896,5]]},"276":{"position":[[441,5]]},"367":{"position":[[955,5],[1061,7]]},"411":{"position":[[3169,4]]},"412":{"position":[[12147,4]]},"450":{"position":[[670,4]]},"454":{"position":[[960,4]]},"466":{"position":[[539,4]]},"469":{"position":[[479,4]]},"480":{"position":[[646,5],[743,5]]},"570":{"position":[[900,4]]},"632":{"position":[[1646,5]]},"634":{"position":[[313,5]]},"653":{"position":[[859,5]]},"660":{"position":[[434,4]]},"663":{"position":[[16,4]]},"696":{"position":[[509,4]]},"698":{"position":[[1637,4]]},"724":{"position":[[836,4]]},"749":{"position":[[17695,4]]},"752":{"position":[[1153,6]]},"756":{"position":[[197,5]]},"776":{"position":[[50,4]]},"780":{"position":[[602,4]]},"796":{"position":[[1246,7],[1315,6],[1384,6]]},"829":{"position":[[1020,4]]},"842":{"position":[[147,4]]},"861":{"position":[[785,5]]},"872":{"position":[[266,4]]},"904":{"position":[[985,5],[1106,7],[1214,5]]},"929":{"position":[[62,5]]},"938":{"position":[[131,5]]},"964":{"position":[[597,5]]},"965":{"position":[[110,4]]},"966":{"position":[[129,4]]},"994":{"position":[[78,4],[265,5]]},"995":{"position":[[804,4]]},"1002":{"position":[[758,4]]},"1041":{"position":[[99,4]]},"1052":{"position":[[154,4]]},"1083":{"position":[[336,5]]},"1094":{"position":[[505,4]]},"1106":{"position":[[112,4]]},"1158":{"position":[[470,5],[525,7],[710,5]]},"1175":{"position":[[596,4]]},"1192":{"position":[[214,4]]},"1208":{"position":[[1865,5]]},"1246":{"position":[[1060,4]]},"1272":{"position":[[175,4]]},"1294":{"position":[[989,4],[1111,5],[1709,4]]},"1295":{"position":[[276,4],[823,4],[1446,5]]},"1296":{"position":[[1815,4]]}},"keywords":{}}],["done.insert",{"_index":6162,"title":{},"content":{"1194":{"position":[[323,11]]}},"keywords":{}}],["done.when",{"_index":6155,"title":{},"content":{"1181":{"position":[[94,9]]}},"keywords":{}}],["don’t",{"_index":2071,"title":{},"content":{"358":{"position":[[1007,5]]},"898":{"position":[[1805,5]]}},"keywords":{}}],["door",{"_index":2636,"title":{},"content":{"411":{"position":[[4984,4]]}},"keywords":{}}],["dot",{"_index":3497,"title":{},"content":{"580":{"position":[[583,3]]}},"keywords":{}}],["doubl",{"_index":847,"title":{},"content":{"55":{"position":[[1010,6]]},"542":{"position":[[719,6]]},"749":{"position":[[11814,6]]},"826":{"position":[[234,6]]},"1118":{"position":[[10,6]]}},"keywords":{}}],["doubt",{"_index":6042,"title":{},"content":{"1134":{"position":[[388,6],[496,6]]}},"keywords":{}}],["down",{"_index":136,"title":{"10":{"position":[[13,5]]}},"content":{"10":{"position":[[95,4],[260,7]]},"20":{"position":[[136,4]]},"28":{"position":[[513,4]]},"311":{"position":[[49,4]]},"354":{"position":[[899,4]]},"402":{"position":[[2147,4],[2255,4]]},"407":{"position":[[600,5]]},"412":{"position":[[6717,4],[10013,4],[12340,4]]},"414":{"position":[[357,5]]},"427":{"position":[[832,4]]},"481":{"position":[[95,5]]},"577":{"position":[[13,4]]},"582":{"position":[[387,4]]},"632":{"position":[[50,4]]},"653":{"position":[[708,4]]},"656":{"position":[[366,5]]},"801":{"position":[[234,4]]},"802":{"position":[[239,4]]},"861":{"position":[[888,4]]},"1013":{"position":[[789,4]]},"1164":{"position":[[1440,4]]},"1198":{"position":[[538,4]]},"1238":{"position":[[338,4]]},"1292":{"position":[[849,4]]},"1300":{"position":[[279,4]]}},"keywords":{}}],["downgrad",{"_index":6571,"title":{"1320":{"position":[[18,10]]}},"content":{},"keywords":{}}],["download",{"_index":2714,"title":{"1024":{"position":[[9,8]]}},"content":{"412":{"position":[[6802,8],[7154,8]]},"420":{"position":[[19,8],[127,9],[198,10],[255,10],[359,10]]},"454":{"position":[[710,10]]},"462":{"position":[[609,10]]},"463":{"position":[[125,11],[404,8],[455,8]]},"468":{"position":[[481,8]]},"696":{"position":[[204,8],[268,8],[597,11]]},"1007":{"position":[[966,9]]},"1008":{"position":[[298,8]]},"1024":{"position":[[143,10],[247,9]]},"1316":{"position":[[3047,9],[3147,9],[3230,10]]}},"keywords":{}}],["downsid",{"_index":577,"title":{"495":{"position":[[0,9]]},"689":{"position":[[0,9]]},"695":{"position":[[0,9]]}},"content":{"36":{"position":[[463,8]]},"402":{"position":[[504,8]]},"412":{"position":[[1289,8]]},"417":{"position":[[359,9]]},"468":{"position":[[59,10]]},"559":{"position":[[958,9]]},"661":{"position":[[1336,8]]},"711":{"position":[[1813,8]]},"772":{"position":[[1368,8]]},"774":{"position":[[933,10]]},"800":{"position":[[455,8]]},"836":{"position":[[1128,9]]},"839":{"position":[[362,10],[587,8]]},"1072":{"position":[[2791,9]]},"1295":{"position":[[1213,9]]},"1300":{"position":[[5,8]]}},"keywords":{}}],["downtim",{"_index":2789,"title":{},"content":{"416":{"position":[[489,8]]}},"keywords":{}}],["dozen",{"_index":2614,"title":{},"content":{"411":{"position":[[1692,6]]}},"keywords":{}}],["draft",{"_index":3619,"title":{},"content":{"613":{"position":[[581,5],[686,5]]}},"keywords":{}}],["dramat",{"_index":2531,"title":{},"content":{"408":{"position":[[813,12],[4354,8]]},"452":{"position":[[570,12]]},"469":{"position":[[454,12]]}},"keywords":{}}],["drastic",{"_index":1967,"title":{},"content":{"342":{"position":[[104,11]]},"361":{"position":[[1099,11]]},"411":{"position":[[302,11]]},"585":{"position":[[145,11]]},"630":{"position":[[304,11]]},"901":{"position":[[416,11]]}},"keywords":{}}],["drawback",{"_index":390,"title":{},"content":{"23":{"position":[[353,8]]},"47":{"position":[[69,10]]},"412":{"position":[[96,9]]},"427":{"position":[[152,8]]},"535":{"position":[[71,9]]},"595":{"position":[[71,9]]},"837":{"position":[[254,9]]},"875":{"position":[[9430,9]]}},"keywords":{}}],["drift",{"_index":6552,"title":{},"content":{"1316":{"position":[[1955,6]]}},"keywords":{}}],["drive",{"_index":1745,"title":{},"content":{"299":{"position":[[327,6]]},"696":{"position":[[1750,5]]}},"keywords":{}}],["driven",{"_index":1167,"title":{},"content":{"153":{"position":[[224,6]]},"174":{"position":[[677,6]]},"198":{"position":[[401,6]]},"321":{"position":[[14,6]]},"326":{"position":[[44,6]]},"331":{"position":[[348,7]]},"408":{"position":[[29,6]]},"476":{"position":[[35,6]]},"503":{"position":[[46,6]]},"510":{"position":[[412,6]]},"567":{"position":[[516,6]]},"828":{"position":[[113,6]]}},"keywords":{}}],["driver",{"_index":4939,"title":{},"content":{"871":{"position":[[822,6]]},"872":{"position":[[115,7]]}},"keywords":{}}],["drizzl",{"_index":6374,"title":{},"content":{"1282":{"position":[[988,7]]}},"keywords":{}}],["drop",{"_index":2598,"title":{},"content":{"410":{"position":[[1289,5]]},"412":{"position":[[3427,4],[5201,4]]},"698":{"position":[[877,8]]},"881":{"position":[[140,4]]},"987":{"position":[[785,4]]},"1301":{"position":[[959,7]]},"1309":{"position":[[998,4]]}},"keywords":{}}],["due",{"_index":699,"title":{},"content":{"45":{"position":[[300,3]]},"67":{"position":[[125,3]]},"71":{"position":[[55,3]]},"161":{"position":[[193,3]]},"320":{"position":[[111,3]]},"400":{"position":[[223,3]]},"408":{"position":[[259,3]]},"429":{"position":[[231,3]]},"434":{"position":[[112,3]]},"446":{"position":[[1191,3]]},"520":{"position":[[76,3]]},"521":{"position":[[54,3]]},"621":{"position":[[39,3]]},"622":{"position":[[40,3],[449,3]]},"623":{"position":[[480,3]]},"624":{"position":[[1401,3],[1620,3]]}},"keywords":{}}],["dump",{"_index":5367,"title":{},"content":{"952":{"position":[[158,4],[262,6]]},"953":{"position":[[20,4],[81,4]]},"971":{"position":[[270,4],[374,6]]},"972":{"position":[[20,5],[80,4]]}},"keywords":{}}],["duplex",{"_index":3565,"title":{},"content":{"611":{"position":[[27,6]]},"621":{"position":[[55,6]]}},"keywords":{}}],["duplic",{"_index":2239,"title":{"740":{"position":[[7,9]]}},"content":{"392":{"position":[[2141,9]]},"740":{"position":[[246,9],[338,9],[623,9]]},"749":{"position":[[5727,9]]},"800":{"position":[[389,9]]},"990":{"position":[[337,9],[428,9],[629,10]]},"1072":{"position":[[199,10]]},"1114":{"position":[[379,10]]},"1321":{"position":[[875,10]]}},"keywords":{}}],["durabl",{"_index":1609,"title":{"1297":{"position":[[8,11]]}},"content":{"266":{"position":[[317,11]]},"412":{"position":[[7755,7]]},"1297":{"position":[[38,10],[144,10],[418,10]]},"1304":{"position":[[131,11]]}},"keywords":{}}],["durat",{"_index":2919,"title":{},"content":{"436":{"position":[[160,8]]}},"keywords":{}}],["dure",{"_index":1220,"title":{},"content":{"174":{"position":[[1687,6]]},"188":{"position":[[1857,6]]},"217":{"position":[[172,6]]},"316":{"position":[[548,6]]},"353":{"position":[[802,6]]},"392":{"position":[[1942,6]]},"395":{"position":[[130,6]]},"408":{"position":[[3320,6]]},"411":{"position":[[108,6]]},"412":{"position":[[2191,6]]},"556":{"position":[[1350,6],[1467,6]]},"634":{"position":[[462,6]]},"674":{"position":[[139,6]]},"690":{"position":[[438,6]]},"749":{"position":[[21237,6]]},"754":{"position":[[499,6]]},"761":{"position":[[194,6]]},"801":{"position":[[270,6]]},"821":{"position":[[88,6],[181,6]]},"829":{"position":[[2052,6]]},"844":{"position":[[126,6]]},"847":{"position":[[23,6]]},"987":{"position":[[146,6]]},"988":{"position":[[2755,6]]},"990":{"position":[[751,6],[959,6]]},"1093":{"position":[[535,6]]},"1186":{"position":[[1,6]]}},"keywords":{}}],["dvm1",{"_index":4409,"title":{},"content":{"749":{"position":[[21724,4]]}},"keywords":{}}],["dxe1",{"_index":4422,"title":{},"content":{"749":{"position":[[23004,4]]}},"keywords":{}}],["dynam",{"_index":348,"title":{},"content":{"20":{"position":[[47,7]]},"34":{"position":[[733,7]]},"47":{"position":[[461,7]]},"90":{"position":[[160,7]]},"116":{"position":[[260,7]]},"124":{"position":[[106,7]]},"226":{"position":[[427,7]]},"275":{"position":[[130,11]]},"289":{"position":[[1460,7]]},"298":{"position":[[295,7],[866,7]]},"351":{"position":[[168,7]]},"362":{"position":[[984,8]]},"491":{"position":[[1838,7]]},"502":{"position":[[186,7],[692,7]]},"509":{"position":[[111,7]]},"514":{"position":[[384,7]]},"530":{"position":[[667,7]]},"562":{"position":[[1007,7]]},"753":{"position":[[153,11]]},"841":{"position":[[1472,7]]},"846":{"position":[[526,11]]},"904":{"position":[[3574,11]]},"1007":{"position":[[2001,11]]},"1009":{"position":[[756,11]]},"1112":{"position":[[418,12],[566,7]]},"1132":{"position":[[995,7]]},"1229":{"position":[[188,11]]},"1268":{"position":[[266,11]]}},"keywords":{}}],["dynamodb",{"_index":2938,"title":{},"content":{"444":{"position":[[630,9]]},"1324":{"position":[[939,9]]}},"keywords":{}}],["e",{"_index":2259,"title":{},"content":{"392":{"position":[[3564,3]]},"496":{"position":[[511,1]]},"1294":{"position":[[1584,1]]}},"keywords":{}}],["e.data.id",{"_index":2261,"title":{},"content":{"392":{"position":[[3650,10]]}},"keywords":{}}],["e.g",{"_index":876,"title":{},"content":{"59":{"position":[[223,6]]},"112":{"position":[[136,6]]},"252":{"position":[[60,6]]},"255":{"position":[[1683,6]]},"305":{"position":[[158,6]]},"353":{"position":[[671,6]]},"354":{"position":[[282,6]]},"383":{"position":[[363,6]]},"411":{"position":[[101,6],[5597,5]]},"412":{"position":[[2237,6],[3585,6],[6422,6]]},"415":{"position":[[94,6]]},"496":{"position":[[488,6]]},"571":{"position":[[547,6]]},"871":{"position":[[609,6]]},"872":{"position":[[4399,4]]},"886":{"position":[[4744,5]]},"1007":{"position":[[543,6],[612,6]]},"1085":{"position":[[1967,6]]},"1133":{"position":[[381,5]]}},"keywords":{}}],["e.target.result",{"_index":6443,"title":{},"content":{"1294":{"position":[[1628,16]]}},"keywords":{}}],["e5",{"_index":2475,"title":{},"content":{"401":{"position":[[567,2]]}},"keywords":{}}],["each",{"_index":716,"title":{},"content":{"46":{"position":[[528,4]]},"158":{"position":[[296,4]]},"162":{"position":[[659,4]]},"204":{"position":[[46,4]]},"220":{"position":[[134,4]]},"261":{"position":[[451,4],[1111,4]]},"289":{"position":[[1739,4]]},"335":{"position":[[372,4]]},"350":{"position":[[35,4]]},"360":{"position":[[33,4]]},"369":{"position":[[1436,4]]},"390":{"position":[[849,4]]},"391":{"position":[[1046,4]]},"392":{"position":[[1406,4],[3409,4]]},"393":{"position":[[102,4],[343,4],[741,4]]},"396":{"position":[[1077,4]]},"397":{"position":[[397,4]]},"398":{"position":[[516,4]]},"407":{"position":[[125,4]]},"408":{"position":[[2600,4],[3163,4]]},"411":{"position":[[430,4],[1224,4],[1391,4],[3374,4],[4101,4],[4727,4],[5027,4]]},"412":{"position":[[11361,4],[12427,4]]},"420":{"position":[[137,4]]},"427":{"position":[[1530,4]]},"444":{"position":[[385,4]]},"458":{"position":[[301,4]]},"462":{"position":[[41,4]]},"464":{"position":[[128,4],[1304,4]]},"493":{"position":[[487,4]]},"502":{"position":[[1025,4]]},"518":{"position":[[492,4]]},"524":{"position":[[38,4]]},"534":{"position":[[543,4]]},"571":{"position":[[1063,4]]},"594":{"position":[[541,4]]},"612":{"position":[[572,4],[1518,4]]},"617":{"position":[[308,4]]},"621":{"position":[[446,4]]},"624":{"position":[[63,4]]},"626":{"position":[[233,4],[480,4]]},"630":{"position":[[32,4]]},"640":{"position":[[76,4]]},"679":{"position":[[286,4]]},"681":{"position":[[483,4]]},"683":{"position":[[488,4]]},"693":{"position":[[478,4]]},"696":{"position":[[1473,4]]},"698":{"position":[[1083,4],[1239,4],[1479,4],[1746,4],[2753,4]]},"699":{"position":[[62,4]]},"700":{"position":[[128,4],[1120,4]]},"701":{"position":[[120,4],[355,4],[1061,4]]},"707":{"position":[[277,4]]},"709":{"position":[[511,4]]},"746":{"position":[[111,4]]},"775":{"position":[[443,4],[584,4]]},"778":{"position":[[157,4]]},"782":{"position":[[25,4]]},"784":{"position":[[61,4]]},"800":{"position":[[704,4]]},"802":{"position":[[118,4],[341,4],[749,4]]},"805":{"position":[[49,4],[112,4]]},"806":{"position":[[324,4]]},"836":{"position":[[1562,4]]},"848":{"position":[[78,4]]},"849":{"position":[[499,4]]},"854":{"position":[[926,4]]},"866":{"position":[[330,4],[547,4]]},"875":{"position":[[3797,4],[3980,4],[5946,4]]},"893":{"position":[[44,4]]},"898":{"position":[[1324,4]]},"903":{"position":[[367,4],[441,4]]},"904":{"position":[[1992,4]]},"906":{"position":[[144,4]]},"908":{"position":[[297,4]]},"921":{"position":[[88,4]]},"937":{"position":[[104,4]]},"953":{"position":[[211,4]]},"958":{"position":[[236,4],[444,4]]},"961":{"position":[[209,4]]},"983":{"position":[[551,4]]},"985":{"position":[[591,4]]},"989":{"position":[[189,4]]},"993":{"position":[[94,4],[221,4]]},"995":{"position":[[1470,4]]},"996":{"position":[[515,4]]},"1007":{"position":[[67,4],[308,4],[721,4]]},"1008":{"position":[[75,4]]},"1009":{"position":[[128,4],[208,4]]},"1024":{"position":[[33,4]]},"1033":{"position":[[206,4],[343,4]]},"1039":{"position":[[110,4]]},"1085":{"position":[[3761,4]]},"1088":{"position":[[468,4]]},"1093":{"position":[[447,4]]},"1100":{"position":[[427,4]]},"1105":{"position":[[325,4]]},"1123":{"position":[[222,4]]},"1174":{"position":[[284,4]]},"1175":{"position":[[127,4],[721,4]]},"1192":{"position":[[67,4]]},"1194":{"position":[[571,4],[893,4]]},"1209":{"position":[[264,4]]},"1267":{"position":[[1,4],[123,4]]},"1295":{"position":[[222,4]]},"1296":{"position":[[624,4]]},"1301":{"position":[[269,4]]},"1304":{"position":[[764,4],[1737,4]]},"1305":{"position":[[474,4],[652,4]]},"1313":{"position":[[202,4]]},"1315":{"position":[[228,4],[252,4]]},"1316":{"position":[[2354,4],[2766,4],[3035,4],[3183,4]]},"1318":{"position":[[23,4]]},"1321":{"position":[[460,4],[990,4]]},"1322":{"position":[[243,4],[438,4]]}},"keywords":{}}],["eachus",{"_index":4846,"title":{},"content":{"849":{"position":[[616,7]]}},"keywords":{}}],["earli",{"_index":1755,"title":{},"content":{"299":{"position":[[929,5]]},"361":{"position":[[179,5]]},"408":{"position":[[299,5],[4571,5]]},"411":{"position":[[3279,5]]},"419":{"position":[[8,5]]},"421":{"position":[[1,5]]},"838":{"position":[[1036,5]]}},"keywords":{}}],["earlier",{"_index":1186,"title":{},"content":{"164":{"position":[[14,8]]}},"keywords":{}}],["eas",{"_index":1015,"title":{},"content":{"94":{"position":[[313,4]]},"179":{"position":[[454,5]]},"320":{"position":[[122,4]]},"357":{"position":[[456,4]]},"388":{"position":[[529,4]]},"447":{"position":[[538,4]]},"838":{"position":[[962,4]]}},"keywords":{}}],["easi",{"_index":421,"title":{"293":{"position":[[0,4]]},"313":{"position":[[3,4]]}},"content":{"25":{"position":[[316,5]]},"34":{"position":[[99,4]]},"63":{"position":[[155,4]]},"167":{"position":[[310,4]]},"287":{"position":[[398,4]]},"336":{"position":[[149,4]]},"353":{"position":[[372,4]]},"364":{"position":[[765,4]]},"381":{"position":[[180,4]]},"393":{"position":[[376,4]]},"412":{"position":[[12638,5],[13533,4],[14018,4],[14516,4],[14875,5]]},"445":{"position":[[1650,4]]},"559":{"position":[[851,4]]},"571":{"position":[[633,4]]},"611":{"position":[[950,4]]},"662":{"position":[[288,4]]},"686":{"position":[[563,4]]},"701":{"position":[[311,4],[530,5]]},"705":{"position":[[650,5]]},"709":{"position":[[168,4]]},"739":{"position":[[12,5]]},"780":{"position":[[339,5]]},"781":{"position":[[835,4]]},"828":{"position":[[511,4]]},"838":{"position":[[317,4],[737,4]]},"839":{"position":[[272,4]]},"981":{"position":[[129,4],[216,4]]},"1071":{"position":[[248,4]]},"1123":{"position":[[716,4]]},"1214":{"position":[[464,4]]},"1252":{"position":[[42,4]]},"1259":{"position":[[20,4]]},"1270":{"position":[[496,4]]},"1304":{"position":[[1926,4]]},"1316":{"position":[[2435,4]]},"1318":{"position":[[91,4]]},"1322":{"position":[[192,4]]}},"keywords":{}}],["easier",{"_index":552,"title":{"89":{"position":[[0,6]]},"90":{"position":[[35,6]]},"94":{"position":[[0,6]]},"222":{"position":[[0,6]]},"279":{"position":[[0,6]]},"282":{"position":[[0,6]]},"487":{"position":[[19,6]]},"1257":{"position":[[0,6]]}},"content":{"35":{"position":[[209,6]]},"46":{"position":[[399,6]]},"89":{"position":[[177,6]]},"105":{"position":[[140,6]]},"173":{"position":[[349,7],[878,6]]},"281":{"position":[[315,6]]},"282":{"position":[[352,6]]},"352":{"position":[[88,6]]},"353":{"position":[[185,6]]},"411":{"position":[[1768,6]]},"412":{"position":[[8882,6]]},"619":{"position":[[293,6]]},"688":{"position":[[507,6],[728,6]]},"691":{"position":[[654,6]]},"698":{"position":[[1584,6]]},"861":{"position":[[160,6]]},"903":{"position":[[684,6]]},"981":{"position":[[903,6]]},"1057":{"position":[[318,7]]},"1089":{"position":[[184,6]]},"1118":{"position":[[110,6]]},"1128":{"position":[[1,6]]},"1162":{"position":[[1166,6]]},"1194":{"position":[[1072,6]]},"1198":{"position":[[1938,6]]},"1214":{"position":[[865,6]]},"1227":{"position":[[119,6]]},"1265":{"position":[[112,6]]},"1307":{"position":[[633,6]]}},"keywords":{}}],["easiest",{"_index":3990,"title":{},"content":{"710":{"position":[[811,7]]},"773":{"position":[[12,7]]},"838":{"position":[[1469,7]]},"860":{"position":[[1178,7]]},"865":{"position":[[127,7]]},"1157":{"position":[[27,7]]},"1242":{"position":[[97,7]]},"1266":{"position":[[5,7]]}},"keywords":{}}],["easili",{"_index":862,"title":{},"content":{"57":{"position":[[333,6]]},"121":{"position":[[184,6]]},"165":{"position":[[342,6]]},"173":{"position":[[963,6]]},"192":{"position":[[333,6]]},"221":{"position":[[185,7]]},"262":{"position":[[501,6]]},"279":{"position":[[227,6]]},"354":{"position":[[327,6]]},"411":{"position":[[760,6]]},"417":{"position":[[294,7]]},"500":{"position":[[134,6]]},"624":{"position":[[399,6]]},"837":{"position":[[457,6]]},"860":{"position":[[989,6]]},"950":{"position":[[138,7]]},"1121":{"position":[[77,6]]},"1124":{"position":[[1948,6]]}},"keywords":{}}],["easily.bas",{"_index":3533,"title":{},"content":{"595":{"position":[[397,12]]}},"keywords":{}}],["easy.compat",{"_index":5429,"title":{},"content":{"981":{"position":[[542,15]]}},"keywords":{}}],["ecosystem",{"_index":1305,"title":{"383":{"position":[[12,10]]}},"content":{"202":{"position":[[57,10]]},"231":{"position":[[120,10]]},"247":{"position":[[79,10]]},"364":{"position":[[411,10]]},"387":{"position":[[268,9]]},"412":{"position":[[1041,10]]},"445":{"position":[[1864,9]]},"838":{"position":[[902,9]]},"839":{"position":[[561,10]]},"1199":{"position":[[104,9]]}},"keywords":{}}],["ecosystemd",{"_index":3145,"title":{},"content":{"483":{"position":[[575,13]]}},"keywords":{}}],["ed",{"_index":3776,"title":{},"content":{"659":{"position":[[425,3]]}},"keywords":{}}],["edg",{"_index":66,"title":{"1093":{"position":[[28,6]]}},"content":{"4":{"position":[[153,4]]},"289":{"position":[[1632,4]]},"298":{"position":[[180,5],[732,4]]},"299":{"position":[[742,4]]},"613":{"position":[[27,4]]},"873":{"position":[[88,4]]},"1123":{"position":[[261,4]]},"1207":{"position":[[121,4]]}},"keywords":{}}],["edit",{"_index":632,"title":{},"content":{"40":{"position":[[134,8]]},"151":{"position":[[341,7]]},"203":{"position":[[243,5]]},"267":{"position":[[622,8],[665,4]]},"312":{"position":[[315,6]]},"339":{"position":[[155,4]]},"375":{"position":[[237,7],[626,7]]},"410":{"position":[[1664,6],[1976,5]]},"411":{"position":[[1442,6]]},"412":{"position":[[2256,5],[3014,5],[3146,4],[4261,7],[6508,7]]},"446":{"position":[[548,7]]},"481":{"position":[[184,5]]},"491":{"position":[[1352,4]]},"495":{"position":[[141,4]]},"496":{"position":[[270,6]]},"632":{"position":[[542,4]]},"635":{"position":[[72,4]]},"691":{"position":[[32,4]]},"698":{"position":[[1953,4]]},"860":{"position":[[839,5]]},"863":{"position":[[639,4]]},"1006":{"position":[[254,4]]},"1007":{"position":[[1051,5]]},"1313":{"position":[[595,4],[684,4]]}},"keywords":{}}],["editor",{"_index":1618,"title":{},"content":{"267":{"position":[[498,8],[1518,8]]},"491":{"position":[[1826,8]]}},"keywords":{}}],["edits.fin",{"_index":1550,"title":{},"content":{"250":{"position":[[291,10]]}},"keywords":{}}],["eede1195b7d94dd5",{"_index":6556,"title":{},"content":{"1316":{"position":[[2273,17]]}},"keywords":{}}],["effect",{"_index":950,"title":{"295":{"position":[[5,9]]}},"content":{"66":{"position":[[645,12]]},"295":{"position":[[56,9]]},"303":{"position":[[1370,9]]},"385":{"position":[[189,12]]},"390":{"position":[[1161,9]]},"398":{"position":[[445,9]]},"618":{"position":[[332,11]]},"635":{"position":[[185,12]]},"676":{"position":[[128,13]]},"801":{"position":[[362,11]]},"988":{"position":[[3342,8],[4671,8]]},"1085":{"position":[[2460,11]]},"1132":{"position":[[1194,9]]}},"keywords":{}}],["effici",{"_index":963,"title":{"146":{"position":[[0,9]]},"213":{"position":[[35,9]]}},"content":{"73":{"position":[[101,9]]},"78":{"position":[[38,9]]},"81":{"position":[[1,9]]},"83":{"position":[[366,10]]},"91":{"position":[[254,9]]},"96":{"position":[[273,12]]},"101":{"position":[[195,9]]},"106":{"position":[[103,9]]},"108":{"position":[[152,9]]},"114":{"position":[[518,9]]},"117":{"position":[[83,9]]},"118":{"position":[[205,9]]},"120":{"position":[[331,9]]},"121":{"position":[[253,9]]},"146":{"position":[[38,9]]},"152":{"position":[[259,9]]},"159":{"position":[[81,11]]},"162":{"position":[[468,9]]},"166":{"position":[[126,9]]},"173":{"position":[[125,11],[518,9]]},"174":{"position":[[1078,9]]},"175":{"position":[[531,9]]},"178":{"position":[[232,11]]},"181":{"position":[[265,9]]},"189":{"position":[[230,9],[797,11]]},"194":{"position":[[175,10]]},"197":{"position":[[172,9]]},"216":{"position":[[34,9]]},"224":{"position":[[322,12]]},"227":{"position":[[121,9]]},"228":{"position":[[297,9]]},"234":{"position":[[161,12]]},"236":{"position":[[320,9]]},"241":{"position":[[693,9]]},"269":{"position":[[402,10]]},"270":{"position":[[239,9]]},"277":{"position":[[220,9]]},"283":{"position":[[236,9]]},"284":{"position":[[85,9]]},"287":{"position":[[788,12]]},"288":{"position":[[1,9]]},"289":{"position":[[286,9]]},"294":{"position":[[144,11],[299,10]]},"354":{"position":[[796,12]]},"366":{"position":[[120,9],[440,12]]},"369":{"position":[[110,9],[163,9]]},"370":{"position":[[163,11]]},"373":{"position":[[721,9]]},"385":{"position":[[54,9]]},"390":{"position":[[1001,9]]},"392":{"position":[[2203,9]]},"395":{"position":[[223,9]]},"396":{"position":[[67,10],[387,9],[757,10]]},"398":{"position":[[88,11]]},"400":{"position":[[400,11]]},"409":{"position":[[61,9]]},"411":{"position":[[555,12]]},"412":{"position":[[9523,11]]},"427":{"position":[[959,9]]},"429":{"position":[[218,12]]},"430":{"position":[[1119,10]]},"432":{"position":[[448,9]]},"435":{"position":[[363,9]]},"441":{"position":[[663,9]]},"445":{"position":[[1953,10]]},"453":{"position":[[759,12]]},"468":{"position":[[224,11]]},"477":{"position":[[341,9]]},"501":{"position":[[27,9]]},"504":{"position":[[228,9],[797,9]]},"508":{"position":[[195,10]]},"519":{"position":[[190,11]]},"524":{"position":[[344,9]]},"527":{"position":[[1,9]]},"530":{"position":[[48,9]]},"535":{"position":[[446,11]]},"595":{"position":[[474,11]]},"610":{"position":[[803,9]]},"613":{"position":[[49,10]]},"618":{"position":[[569,9]]},"621":{"position":[[485,9],[835,9]]},"622":{"position":[[222,9]]},"623":{"position":[[675,10]]},"634":{"position":[[603,9]]},"714":{"position":[[946,9]]},"723":{"position":[[1,9],[107,11],[1369,11]]},"802":{"position":[[674,12],[811,9]]},"1022":{"position":[[906,11]]},"1023":{"position":[[60,9],[567,11]]},"1071":{"position":[[335,9]]},"1072":{"position":[[1906,10],[2845,12]]},"1132":{"position":[[228,9],[1162,11]]},"1206":{"position":[[592,9]]},"1237":{"position":[[485,10]]}},"keywords":{}}],["efficiently.ther",{"_index":3093,"title":{},"content":{"469":{"position":[[852,17]]}},"keywords":{}}],["effort",{"_index":1026,"title":{},"content":{"99":{"position":[[209,6]]},"112":{"position":[[217,7]]},"412":{"position":[[2470,7]]},"445":{"position":[[2405,7]]},"446":{"position":[[1424,7]]},"676":{"position":[[155,7]]},"1295":{"position":[[1323,6]]}},"keywords":{}}],["effort.observ",{"_index":1923,"title":{},"content":{"323":{"position":[[396,17]]}},"keywords":{}}],["effortless",{"_index":2113,"title":{},"content":{"366":{"position":[[48,10]]},"373":{"position":[[564,10]]}},"keywords":{}}],["effortlessli",{"_index":1080,"title":{},"content":{"123":{"position":[[175,13]]},"275":{"position":[[298,13]]},"286":{"position":[[282,13]]},"293":{"position":[[190,12]]},"562":{"position":[[1766,13]]},"575":{"position":[[442,12]]}},"keywords":{}}],["eg",{"_index":4639,"title":{},"content":{"796":{"position":[[489,4]]},"1065":{"position":[[936,3]]}},"keywords":{}}],["eini",{"_index":6483,"title":{},"content":{"1302":{"position":[[174,4]]}},"keywords":{}}],["elect",{"_index":4040,"title":{"735":{"position":[[7,8]]},"738":{"position":[[15,8]]}},"content":{"723":{"position":[[868,9]]},"737":{"position":[[58,8],[182,7]]},"738":{"position":[[22,9],[59,8],[175,10]]},"740":{"position":[[63,8],[488,10]]},"743":{"position":[[12,8],[84,7]]},"793":{"position":[[1119,8]]},"974":{"position":[[62,7]]},"989":{"position":[[361,8]]},"1003":{"position":[[114,7]]},"1171":{"position":[[297,8]]},"1174":{"position":[[436,7],[658,7]]},"1301":{"position":[[1219,8],[1253,8],[1379,8],[1479,8],[1639,8]]}},"keywords":{}}],["elector",{"_index":4104,"title":{},"content":{"740":{"position":[[388,7]]}},"keywords":{}}],["electr",{"_index":647,"title":{},"content":{"41":{"position":[[47,8]]}},"keywords":{}}],["electricsql",{"_index":644,"title":{"41":{"position":[[0,12]]}},"content":{"41":{"position":[[7,11],[350,11]]}},"keywords":{}}],["electron",{"_index":506,"title":{"692":{"position":[[0,8]]},"693":{"position":[[10,8]]},"706":{"position":[[0,8]]},"707":{"position":[[14,9]]},"709":{"position":[[63,9]]},"1214":{"position":[[8,9]]}},"content":{"32":{"position":[[74,8]]},"47":{"position":[[1262,9]]},"201":{"position":[[176,9]]},"207":{"position":[[156,8]]},"248":{"position":[[66,9]]},"254":{"position":[[126,8],[467,9]]},"458":{"position":[[54,8]]},"524":{"position":[[468,8]]},"535":{"position":[[1326,9]]},"631":{"position":[[205,9]]},"693":{"position":[[16,9],[145,8],[279,8],[691,9]]},"694":{"position":[[15,8]]},"707":{"position":[[4,8]]},"708":{"position":[[9,8],[241,8],[365,9],[586,9]]},"709":{"position":[[9,8],[1251,8]]},"710":{"position":[[152,8],[499,9],[924,9],[1356,8],[2482,9]]},"711":{"position":[[261,8],[867,8]]},"712":{"position":[[38,8],[95,8],[208,9]]},"793":{"position":[[337,9],[598,8]]},"964":{"position":[[505,8]]},"1196":{"position":[[57,9]]},"1214":{"position":[[149,8],[589,8]]},"1235":{"position":[[256,8]]},"1246":{"position":[[931,8],[1990,8],[2042,9],[2171,8]]},"1247":{"position":[[84,9]]},"1270":{"position":[[440,8],[539,8]]},"1271":{"position":[[245,9]]}},"keywords":{}}],["electron"",{"_index":1493,"title":{},"content":{"244":{"position":[[470,14]]}},"keywords":{}}],["electron)node.jsserv",{"_index":3122,"title":{},"content":{"479":{"position":[[419,24]]}},"keywords":{}}],["electron.in",{"_index":3718,"title":{},"content":{"640":{"position":[[373,11]]}},"keywords":{}}],["electron.ipcmain",{"_index":3931,"title":{},"content":{"693":{"position":[[975,16]]}},"keywords":{}}],["electron.ipcrender",{"_index":3933,"title":{},"content":{"693":{"position":[[1268,20]]}},"keywords":{}}],["electron.j",{"_index":1051,"title":{"708":{"position":[[25,12]]},"711":{"position":[[10,11]]}},"content":{"112":{"position":[[97,12]]},"174":{"position":[[2703,12]]},"239":{"position":[[134,12]]},"1245":{"position":[[91,12]]}},"keywords":{}}],["electron/rebuild",{"_index":3993,"title":{},"content":{"711":{"position":[[780,17],[924,18]]}},"keywords":{}}],["electron/remot",{"_index":3991,"title":{},"content":{"711":{"position":[[438,16]]}},"keywords":{}}],["eleg",{"_index":2939,"title":{},"content":{"445":{"position":[[240,7]]}},"keywords":{}}],["element",{"_index":1085,"title":{},"content":{"129":{"position":[[55,8]]},"326":{"position":[[194,8]]},"412":{"position":[[5096,7]]},"951":{"position":[[508,8]]}},"keywords":{}}],["elements.offlin",{"_index":1976,"title":{},"content":{"346":{"position":[[521,16]]}},"keywords":{}}],["elements.stringif",{"_index":2883,"title":{},"content":{"427":{"position":[[620,24]]}},"keywords":{}}],["elev",{"_index":3222,"title":{},"content":{"501":{"position":[[390,9]]}},"keywords":{}}],["elimin",{"_index":712,"title":{},"content":{"46":{"position":[[364,11]]},"92":{"position":[[93,11]]},"96":{"position":[[57,10]]},"103":{"position":[[130,10]]},"159":{"position":[[256,10]]},"172":{"position":[[223,10]]},"217":{"position":[[123,11]]},"219":{"position":[[212,11]]},"233":{"position":[[190,10]]},"261":{"position":[[1123,11]]},"265":{"position":[[525,10],[794,11]]},"267":{"position":[[1329,9]]},"360":{"position":[[126,10]]},"376":{"position":[[148,11]]},"421":{"position":[[1113,9]]},"445":{"position":[[2294,10]]},"500":{"position":[[415,9]]},"515":{"position":[[284,11]]},"518":{"position":[[302,11]]},"521":{"position":[[621,11]]},"630":{"position":[[449,11]]}},"keywords":{}}],["elixir",{"_index":655,"title":{},"content":{"41":{"position":[[264,7],[384,7]]}},"keywords":{}}],["else.perform",{"_index":5431,"title":{},"content":{"981":{"position":[[765,16]]}},"keywords":{}}],["email",{"_index":2489,"title":{},"content":{"402":{"position":[[2321,5],[2403,6]]},"408":{"position":[[4445,5],[4841,5]]},"426":{"position":[[332,6]]},"783":{"position":[[346,5]]},"1022":{"position":[[157,5],[300,6],[499,5],[938,6]]},"1023":{"position":[[153,6],[599,6]]},"1289":{"position":[[68,5]]},"1290":{"position":[[160,5]]},"1291":{"position":[[158,5]]}},"keywords":{}}],["emailbyreceivercollect",{"_index":5625,"title":{},"content":{"1022":{"position":[[530,26]]}},"keywords":{}}],["emailbyreceivercollection.bulkinsert",{"_index":5629,"title":{},"content":{"1022":{"position":[[755,37]]}},"keywords":{}}],["emailbyreceivercollection.find",{"_index":5635,"title":{},"content":{"1022":{"position":[[1009,32]]}},"keywords":{}}],["emailbyreceivercollection.find({emailid",{"_index":5626,"title":{},"content":{"1022":{"position":[[646,40]]}},"keywords":{}}],["emailbyreceivercollection.find({word",{"_index":5643,"title":{},"content":{"1023":{"position":[[673,37]]}},"keywords":{}}],["emailcollection.addpipelin",{"_index":5624,"title":{},"content":{"1022":{"position":[[452,29]]},"1023":{"position":[[111,29]]},"1024":{"position":[[205,29]]}},"keywords":{}}],["emailid",{"_index":5631,"title":{},"content":{"1022":{"position":[[829,8]]},"1023":{"position":[[498,8]]}},"keywords":{}}],["emb",{"_index":2467,"title":{},"content":{"401":{"position":[[481,5]]},"408":{"position":[[1843,5]]},"661":{"position":[[79,5]]},"836":{"position":[[81,5]]}},"keywords":{}}],["embed",{"_index":503,"title":{"171":{"position":[[17,8]]},"172":{"position":[[11,8]]},"173":{"position":[[0,8]]},"174":{"position":[[15,8]]},"391":{"position":[[11,10]]},"392":{"position":[[12,10]]},"395":{"position":[[13,10]]},"397":{"position":[[16,10]]}},"content":{"32":{"position":[[12,8]]},"172":{"position":[[4,8]]},"173":{"position":[[39,8],[252,8],[436,8],[491,8],[640,8],[1173,8],[1399,8],[1916,8],[2201,8],[2445,8],[2526,8],[2754,8],[3104,8]]},"174":{"position":[[28,8],[3227,8]]},"175":{"position":[[61,8],[457,8]]},"189":{"position":[[333,8]]},"201":{"position":[[106,8]]},"353":{"position":[[714,8]]},"354":{"position":[[337,8]]},"357":{"position":[[532,8]]},"390":{"position":[[147,11],[165,10],[506,10],[778,10],[986,10]]},"391":{"position":[[78,10],[372,9],[780,9],[960,10],[1111,10]]},"392":{"position":[[14,11],[803,10],[1174,11],[1273,11],[1370,10],[1466,9],[1636,10],[1712,12],[1837,10],[2022,10],[2470,11],[2550,11],[2681,10],[2831,9],[2927,9],[3385,9],[3448,9],[3582,9],[3661,9],[4587,10],[4788,9],[5154,10]]},"393":{"position":[[29,10],[867,10],[1100,10]]},"394":{"position":[[20,10],[287,9],[381,10],[406,10],[1514,10],[1571,10]]},"395":{"position":[[52,10],[388,10]]},"396":{"position":[[937,11],[1003,10],[1082,9],[1771,10]]},"397":{"position":[[49,10],[423,9],[1483,9],[1872,9],[1949,9],[2137,11]]},"398":{"position":[[10,10],[572,9],[605,10],[1841,10],[1913,10],[2953,10],[3075,10],[3207,9],[3325,11]]},"401":{"position":[[57,9],[150,9],[330,10],[377,10],[424,10],[804,11]]},"402":{"position":[[104,11],[145,10],[202,10],[372,9],[590,10],[992,11],[1137,9],[1802,9],[2627,10]]},"403":{"position":[[97,11],[689,10],[833,9],[984,11]]},"404":{"position":[[180,10],[971,10]]},"412":{"position":[[10921,10]]},"711":{"position":[[104,8]]},"775":{"position":[[16,8]]},"776":{"position":[[146,8]]},"841":{"position":[[115,8]]}},"keywords":{}}],["embedd",{"_index":449,"title":{},"content":{"28":{"position":[[24,11]]}},"keywords":{}}],["embedding2",{"_index":2298,"title":{},"content":{"393":{"position":[[1020,12]]}},"keywords":{}}],["embrac",{"_index":1172,"title":{},"content":{"157":{"position":[[6,8]]},"170":{"position":[[361,9]]},"279":{"position":[[40,7]]},"325":{"position":[[152,8]]},"359":{"position":[[161,8]]},"373":{"position":[[356,9]]},"445":{"position":[[1258,8]]},"447":{"position":[[637,7]]},"510":{"position":[[626,9]]},"516":{"position":[[6,8]]}},"keywords":{}}],["emerg",{"_index":1686,"title":{},"content":{"290":{"position":[[75,7]]},"412":{"position":[[847,8],[15227,8]]},"445":{"position":[[46,7]]},"502":{"position":[[6,7]]},"510":{"position":[[129,7]]},"530":{"position":[[145,7]]},"624":{"position":[[147,6]]},"635":{"position":[[34,6]]},"683":{"position":[[445,6]]}},"keywords":{}}],["emiss",{"_index":3134,"title":{},"content":{"481":{"position":[[504,9]]}},"keywords":{}}],["emit",{"_index":734,"title":{},"content":{"47":{"position":[[745,4]]},"130":{"position":[[334,7]]},"174":{"position":[[1672,7]]},"196":{"position":[[37,4]]},"323":{"position":[[30,5]]},"329":{"position":[[113,5]]},"480":{"position":[[793,5]]},"493":{"position":[[368,5],[442,7]]},"494":{"position":[[606,5]]},"502":{"position":[[1019,5]]},"518":{"position":[[486,5]]},"529":{"position":[[63,4]]},"562":{"position":[[1258,5]]},"571":{"position":[[960,5]]},"580":{"position":[[611,5]]},"585":{"position":[[44,4]]},"602":{"position":[[161,4]]},"698":{"position":[[1068,5]]},"752":{"position":[[1081,7]]},"753":{"position":[[57,5]]},"755":{"position":[[178,7]]},"767":{"position":[[264,7]]},"768":{"position":[[223,7]]},"769":{"position":[[238,7]]},"828":{"position":[[33,5]]},"875":{"position":[[4181,7],[6907,4],[7864,5],[8782,8],[9252,8]]},"876":{"position":[[548,4]]},"879":{"position":[[403,5]]},"880":{"position":[[220,4]]},"881":{"position":[[191,4]]},"921":{"position":[[26,5],[82,5]]},"979":{"position":[[1,5],[115,5],[184,4],[378,5]]},"983":{"position":[[751,5]]},"985":{"position":[[273,4],[571,4]]},"988":{"position":[[5335,4],[5958,4]]},"990":{"position":[[714,5]]},"993":{"position":[[88,5],[215,5],[332,5],[479,5],[616,5]]},"1017":{"position":[[48,5]]},"1039":{"position":[[102,7]]},"1049":{"position":[[1,5]]},"1058":{"position":[[384,4]]},"1126":{"position":[[508,5]]},"1150":{"position":[[551,8]]}},"keywords":{}}],["emitted.al",{"_index":5503,"title":{},"content":{"995":{"position":[[70,11]]}},"keywords":{}}],["emphas",{"_index":2804,"title":{},"content":{"419":{"position":[[719,11]]},"690":{"position":[[579,9]]}},"keywords":{}}],["emphasi",{"_index":1930,"title":{},"content":{"327":{"position":[[44,8]]}},"keywords":{}}],["employ",{"_index":1045,"title":{},"content":{"108":{"position":[[6,7]]},"208":{"position":[[6,7]]},"283":{"position":[[182,8]]},"369":{"position":[[199,7]]},"528":{"position":[[6,7]]},"802":{"position":[[607,9]]},"1132":{"position":[[1070,7]]}},"keywords":{}}],["empow",{"_index":1056,"title":{"150":{"position":[[21,10]]},"264":{"position":[[34,10]]}},"content":{"114":{"position":[[447,8]]},"170":{"position":[[82,10]]},"241":{"position":[[460,7]]},"267":{"position":[[1180,8]]},"276":{"position":[[27,8]]},"289":{"position":[[1438,8]]},"373":{"position":[[474,8]]},"384":{"position":[[369,8]]},"388":{"position":[[317,8]]},"447":{"position":[[378,8]]},"502":{"position":[[308,10]]},"504":{"position":[[444,8]]},"506":{"position":[[6,8]]},"509":{"position":[[102,8]]},"510":{"position":[[344,8]]},"912":{"position":[[636,8]]}},"keywords":{}}],["empscripten",{"_index":6468,"title":{},"content":{"1299":{"position":[[553,11]]}},"keywords":{}}],["empti",{"_index":3764,"title":{"655":{"position":[[28,5]]}},"content":{"655":{"position":[[59,5]]},"749":{"position":[[40,5],[1588,5],[2212,5]]},"754":{"position":[[458,5]]},"885":{"position":[[1156,5]]},"983":{"position":[[709,5]]},"984":{"position":[[572,5]]},"988":{"position":[[2813,5]]},"1134":{"position":[[514,5]]}},"keywords":{}}],["emptydatabase.importjson(json",{"_index":5411,"title":{},"content":{"972":{"position":[[101,30]]}},"keywords":{}}],["emul",{"_index":3548,"title":{},"content":{"610":{"position":[[142,8]]}},"keywords":{}}],["en1",{"_index":4300,"title":{},"content":{"749":{"position":[[12884,3]]}},"keywords":{}}],["en2",{"_index":4301,"title":{},"content":{"749":{"position":[[12961,3]]}},"keywords":{}}],["en3",{"_index":4305,"title":{},"content":{"749":{"position":[[13070,3]]}},"keywords":{}}],["en4",{"_index":4306,"title":{},"content":{"749":{"position":[[13187,3]]}},"keywords":{}}],["enabl",{"_index":438,"title":{"734":{"position":[[0,6]]},"916":{"position":[[0,6]]}},"content":{"27":{"position":[[35,7],[274,6]]},"40":{"position":[[77,8]]},"75":{"position":[[6,7]]},"87":{"position":[[114,7]]},"89":{"position":[[222,7]]},"103":{"position":[[52,8]]},"106":{"position":[[95,7]]},"112":{"position":[[39,8]]},"114":{"position":[[509,8]]},"116":{"position":[[83,7]]},"121":{"position":[[114,6]]},"136":{"position":[[294,7]]},"138":{"position":[[112,7]]},"140":{"position":[[276,6]]},"152":{"position":[[252,6]]},"155":{"position":[[251,6]]},"157":{"position":[[42,8]]},"158":{"position":[[246,8]]},"160":{"position":[[207,8]]},"162":{"position":[[737,8]]},"165":{"position":[[137,6]]},"168":{"position":[[59,8]]},"173":{"position":[[101,7],[2773,6]]},"174":{"position":[[244,8],[846,7],[1070,7],[1943,7],[2837,7]]},"177":{"position":[[265,6]]},"179":{"position":[[379,8]]},"184":{"position":[[128,6]]},"210":{"position":[[104,8]]},"215":{"position":[[59,6]]},"220":{"position":[[20,6]]},"222":{"position":[[271,8]]},"224":{"position":[[286,8]]},"235":{"position":[[43,8]]},"237":{"position":[[187,8]]},"239":{"position":[[45,7]]},"240":{"position":[[307,8]]},"255":{"position":[[85,8]]},"265":{"position":[[460,8]]},"266":{"position":[[131,6]]},"280":{"position":[[212,8]]},"283":{"position":[[227,8]]},"286":{"position":[[246,6]]},"287":{"position":[[195,8]]},"289":{"position":[[1949,8]]},"292":{"position":[[213,8]]},"315":{"position":[[953,8]]},"316":{"position":[[83,6],[213,6]]},"323":{"position":[[334,6]]},"326":{"position":[[27,7]]},"328":{"position":[[70,8]]},"356":{"position":[[178,8]]},"358":{"position":[[910,8]]},"366":{"position":[[108,7]]},"369":{"position":[[648,8]]},"375":{"position":[[361,6]]},"380":{"position":[[129,7]]},"407":{"position":[[935,7]]},"408":{"position":[[1603,7],[5085,6]]},"424":{"position":[[65,7]]},"444":{"position":[[691,8]]},"445":{"position":[[1161,7],[2161,7]]},"446":{"position":[[637,6]]},"463":{"position":[[1331,7]]},"480":{"position":[[125,6]]},"501":{"position":[[354,8]]},"504":{"position":[[788,8]]},"509":{"position":[[33,8]]},"516":{"position":[[42,8]]},"518":{"position":[[173,7]]},"529":{"position":[[6,7]]},"535":{"position":[[794,8]]},"567":{"position":[[304,8]]},"595":{"position":[[881,8]]},"610":{"position":[[48,6]]},"611":{"position":[[140,7]]},"613":{"position":[[160,6]]},"614":{"position":[[86,7]]},"639":{"position":[[225,6]]},"675":{"position":[[22,8]]},"683":{"position":[[16,7]]},"693":{"position":[[680,7]]},"723":{"position":[[2268,8]]},"734":{"position":[[659,6]]},"738":{"position":[[4,6]]},"749":{"position":[[983,7],[21746,8]]},"849":{"position":[[799,6]]},"854":{"position":[[826,6]]},"861":{"position":[[2493,6]]},"865":{"position":[[57,7]]},"872":{"position":[[1114,8],[1227,8]]},"901":{"position":[[76,7]]},"915":{"position":[[4,6]]},"964":{"position":[[156,6]]},"1004":{"position":[[174,7]]},"1012":{"position":[[4,6]]},"1072":{"position":[[2180,6]]},"1078":{"position":[[173,6]]},"1083":{"position":[[268,6]]},"1150":{"position":[[248,6]]},"1206":{"position":[[318,8]]},"1213":{"position":[[498,6]]},"1284":{"position":[[162,7],[215,7]]}},"keywords":{}}],["enableindexeddbpersist",{"_index":4880,"title":{"856":{"position":[[11,29]]}},"content":{"856":{"position":[[19,28]]}},"keywords":{}}],["encapsul",{"_index":781,"title":{},"content":{"51":{"position":[[918,11]]}},"keywords":{}}],["encod",{"_index":118,"title":{},"content":{"8":{"position":[[508,6],[566,7]]},"402":{"position":[[2505,7]]},"688":{"position":[[351,8]]},"1296":{"position":[[1768,6]]}},"keywords":{}}],["encount",{"_index":1179,"title":{},"content":{"161":{"position":[[75,9]]},"304":{"position":[[278,9]]},"309":{"position":[[92,9]]}},"keywords":{}}],["encourag",{"_index":2077,"title":{},"content":{"360":{"position":[[690,10]]},"419":{"position":[[1401,9]]},"1151":{"position":[[544,9]]},"1178":{"position":[[543,9]]}},"keywords":{}}],["encrypt",{"_index":480,"title":{"95":{"position":[[22,11]]},"139":{"position":[[0,10]]},"167":{"position":[[0,10]]},"195":{"position":[[0,10]]},"218":{"position":[[9,10]]},"291":{"position":[[15,10]]},"307":{"position":[[32,11]]},"310":{"position":[[12,11]]},"315":{"position":[[0,10]]},"343":{"position":[[0,10]]},"377":{"position":[[13,11]]},"472":{"position":[[51,10]]},"482":{"position":[[36,11]]},"506":{"position":[[0,10]]},"549":{"position":[[13,10],[28,9]]},"550":{"position":[[7,10]]},"551":{"position":[[13,10]]},"552":{"position":[[11,10]]},"554":{"position":[[34,11]]},"555":{"position":[[26,9]]},"556":{"position":[[32,11]]},"564":{"position":[[8,10]]},"586":{"position":[[0,10]]},"629":{"position":[[48,10]]},"638":{"position":[[6,11]]},"713":{"position":[[3,9]]},"714":{"position":[[9,9]]},"716":{"position":[[11,11]]},"717":{"position":[[15,10]]},"720":{"position":[[0,9]]},"721":{"position":[[0,10]]},"912":{"position":[[24,9]]},"1184":{"position":[[0,10]]}},"content":{"29":{"position":[[273,10]]},"47":{"position":[[1103,11]]},"57":{"position":[[321,11],[340,7],[381,11]]},"65":{"position":[[1552,11],[1652,10]]},"95":{"position":[[171,11]]},"139":{"position":[[36,10],[89,11],[187,8]]},"167":{"position":[[74,10],[100,10],[278,10],[339,10]]},"170":{"position":[[404,11]]},"173":{"position":[[1161,11],[1247,11]]},"195":{"position":[[52,10],[81,10]]},"218":{"position":[[89,7],[175,10]]},"244":{"position":[[1144,9]]},"291":{"position":[[26,10],[159,10],[424,10]]},"292":{"position":[[163,9]]},"293":{"position":[[333,9]]},"310":{"position":[[89,10],[123,7],[296,10]]},"313":{"position":[[172,11]]},"314":{"position":[[631,11]]},"315":{"position":[[41,10],[884,10],[895,10],[942,10],[985,9],[1014,9],[1072,11]]},"318":{"position":[[68,11],[414,10]]},"334":{"position":[[443,10]]},"343":{"position":[[15,10]]},"366":{"position":[[565,9]]},"377":{"position":[[175,10],[302,11]]},"383":{"position":[[111,11],[163,10]]},"410":{"position":[[692,11],[790,9]]},"412":{"position":[[13256,7]]},"419":{"position":[[1186,11]]},"479":{"position":[[246,10]]},"480":{"position":[[132,10],[1032,7]]},"482":{"position":[[69,10],[138,10],[447,10],[733,9],[812,10],[971,10],[1009,9]]},"483":{"position":[[1089,10]]},"506":{"position":[[40,7]]},"510":{"position":[[327,11]]},"526":{"position":[[1,10],[102,11]]},"535":{"position":[[1079,10]]},"544":{"position":[[322,10]]},"550":{"position":[[1,10],[160,10],[277,10],[295,10]]},"551":{"position":[[60,9],[107,10],[152,10],[187,10],[340,9],[483,7]]},"553":{"position":[[22,10]]},"554":{"position":[[17,10],[882,10],[1016,9]]},"555":{"position":[[38,11],[98,9],[242,9],[391,9],[432,9],[742,9],[776,9],[1000,9]]},"556":{"position":[[56,10],[144,9],[536,7],[621,10],[683,9],[1173,10],[1225,10],[1450,10],[1708,9]]},"557":{"position":[[309,10],[395,10]]},"560":{"position":[[754,11]]},"564":{"position":[[109,7],[166,10],[555,10],[900,10],[938,7],[984,9],[1018,9]]},"566":{"position":[[1226,10],[1289,7],[1326,10],[1377,10]]},"567":{"position":[[599,11],[616,10],[648,7]]},"579":{"position":[[452,10]]},"586":{"position":[[64,10]]},"595":{"position":[[1156,10]]},"604":{"position":[[232,11],[275,10]]},"632":{"position":[[1393,10]]},"638":{"position":[[161,10],[756,10],[809,7],[846,9]]},"661":{"position":[[1227,10]]},"710":{"position":[[258,10]]},"711":{"position":[[2290,11]]},"714":{"position":[[18,10],[340,10],[473,9],[491,9],[626,9],[697,9],[762,9],[840,9],[1051,9],[1082,9]]},"715":{"position":[[59,10],[193,10]]},"716":{"position":[[5,10],[45,10],[165,10],[210,10],[268,9],[337,9],[485,10]]},"717":{"position":[[36,11],[58,10],[446,10],[537,11],[752,10],[1025,10],[1119,9],[1282,9],[1329,10],[1366,9],[1568,10]]},"718":{"position":[[325,10],[622,9]]},"719":{"position":[[396,7]]},"720":{"position":[[31,10],[58,10],[207,10],[263,9]]},"721":{"position":[[66,11],[102,10],[135,10]]},"723":{"position":[[1928,9],[2010,9]]},"749":{"position":[[835,9],[859,10],[13090,9],[18153,9],[19590,9]]},"793":{"position":[[428,10]]},"838":{"position":[[871,10],[3315,10]]},"901":{"position":[[491,10]]},"912":{"position":[[25,9],[68,10],[221,10],[273,10],[471,10],[752,10]]},"916":{"position":[[219,10],[275,9]]},"942":{"position":[[111,7],[123,9]]},"963":{"position":[[30,9],[192,10]]},"971":{"position":[[154,9]]},"1038":{"position":[[63,10]]},"1074":{"position":[[391,9],[664,9]]},"1123":{"position":[[593,11]]},"1146":{"position":[[58,11]]},"1180":{"position":[[314,9],[386,9]]},"1184":{"position":[[52,9],[148,9],[210,9],[259,10]]},"1237":{"position":[[144,12],[394,10],[447,10]]}},"keywords":{}}],["encrypted/compress",{"_index":6282,"title":{},"content":{"1237":{"position":[[363,20]]}},"keywords":{}}],["encryptedfile.txt",{"_index":3370,"title":{},"content":{"556":{"position":[[940,20]]}},"keywords":{}}],["encryptedindexeddbstorag",{"_index":4030,"title":{},"content":{"718":{"position":[[349,25],[706,26]]}},"keywords":{}}],["encryptedmemorystorag",{"_index":3346,"title":{},"content":{"554":{"position":[[906,22],[1109,23]]}},"keywords":{}}],["encryptedstorag",{"_index":1897,"title":{},"content":{"315":{"position":[[424,16],[589,17]]},"482":{"position":[[464,16],[666,17]]},"564":{"position":[[432,16],[639,17]]},"638":{"position":[[316,16],[476,17]]},"717":{"position":[[776,16],[1203,17]]}},"keywords":{}}],["encryption"",{"_index":1446,"title":{},"content":{"243":{"position":[[94,16]]},"244":{"position":[[620,16]]}},"keywords":{}}],["encryptioncompress",{"_index":3328,"title":{},"content":{"544":{"position":[[356,22]]}},"keywords":{}}],["encryptionif",{"_index":3341,"title":{},"content":{"551":{"position":[[366,12]]}},"keywords":{}}],["end",{"_index":663,"title":{"225":{"position":[[51,3]]}},"content":{"42":{"position":[[299,3]]},"43":{"position":[[347,3]]},"167":{"position":[[328,3],[335,3]]},"218":{"position":[[60,3]]},"289":{"position":[[892,3]]},"350":{"position":[[295,3]]},"351":{"position":[[241,3]]},"353":{"position":[[495,5]]},"354":{"position":[[686,3]]},"360":{"position":[[92,3]]},"385":{"position":[[344,3]]},"399":{"position":[[190,3],[259,3],[555,3]]},"410":{"position":[[606,3]]},"412":{"position":[[9364,3],[10650,3],[10688,3]]},"491":{"position":[[110,4]]},"495":{"position":[[726,4]]},"569":{"position":[[1197,3]]},"697":{"position":[[276,3]]},"749":{"position":[[6275,6],[11608,3],[16142,3]]},"878":{"position":[[482,3]]},"879":{"position":[[68,3],[152,4]]},"901":{"position":[[480,3],[487,3]]},"1030":{"position":[[240,3]]},"1090":{"position":[[44,3]]},"1092":{"position":[[360,3]]},"1093":{"position":[[174,3]]},"1123":{"position":[[329,3]]},"1208":{"position":[[1507,3]]},"1294":{"position":[[1073,3]]},"1316":{"position":[[233,3],[1207,3]]}},"keywords":{}}],["endlessli",{"_index":1973,"title":{},"content":{"346":{"position":[[431,9]]}},"keywords":{}}],["endpoint",{"_index":243,"title":{"209":{"position":[[37,9]]},"478":{"position":[[30,10]]},"1100":{"position":[[9,10]]},"1101":{"position":[[12,9]]},"1102":{"position":[[5,9]]}},"content":{"14":{"position":[[1154,10]]},"18":{"position":[[453,9]]},"24":{"position":[[325,9]]},"37":{"position":[[103,10],[215,10]]},"46":{"position":[[514,9]]},"202":{"position":[[285,9]]},"248":{"position":[[302,9]]},"255":{"position":[[1132,8],[1395,8]]},"321":{"position":[[330,9]]},"381":{"position":[[238,10]]},"410":{"position":[[913,9]]},"411":{"position":[[1108,10],[1319,8],[1346,9],[1718,10]]},"412":{"position":[[1805,10],[1891,9],[2430,9]]},"478":{"position":[[36,9]]},"487":{"position":[[14,10],[456,8]]},"534":{"position":[[529,9]]},"556":{"position":[[1778,9]]},"565":{"position":[[108,9]]},"566":{"position":[[1161,9]]},"582":{"position":[[364,8]]},"594":{"position":[[527,9]]},"612":{"position":[[1712,8]]},"701":{"position":[[1142,8]]},"837":{"position":[[200,9]]},"846":{"position":[[261,8],[1243,9]]},"861":{"position":[[245,8]]},"865":{"position":[[21,8]]},"871":{"position":[[275,8]]},"872":{"position":[[3356,8],[3466,11],[3732,8],[4364,8]]},"875":{"position":[[1289,9],[1313,9],[1738,8],[3570,9],[6007,8],[6523,9],[7813,8]]},"876":{"position":[[446,8],[500,9],[531,9]]},"878":{"position":[[136,8],[419,8]]},"879":{"position":[[271,9],[330,8]]},"885":{"position":[[41,8]]},"886":{"position":[[352,9],[1081,9],[2713,9],[3053,9],[3900,9]]},"888":{"position":[[83,8],[144,8],[1008,9]]},"981":{"position":[[306,9]]},"986":{"position":[[1337,8],[1435,8]]},"1007":{"position":[[500,9]]},"1088":{"position":[[715,9]]},"1092":{"position":[[238,8]]},"1097":{"position":[[231,9],[800,9],[847,10]]},"1100":{"position":[[55,10],[69,8],[207,9],[246,8],[268,9],[318,8],[369,8],[503,8],[522,8],[692,10]]},"1101":{"position":[[17,8],[214,9],[229,8],[345,8],[451,8],[504,10]]},"1102":{"position":[[10,8],[294,8],[325,8],[377,10],[807,9],[1075,8]]},"1103":{"position":[[34,10],[76,8],[288,8],[347,10]]},"1105":{"position":[[330,8],[370,9],[714,8],[773,10]]},"1106":{"position":[[652,8],[711,10]]},"1108":{"position":[[5,9],[382,8],[441,10]]},"1111":{"position":[[63,9]]},"1112":{"position":[[399,9],[487,10]]},"1149":{"position":[[244,9],[1423,8]]},"1228":{"position":[[255,10]]}},"keywords":{}}],["endpoint.urlpath",{"_index":5937,"title":{},"content":{"1102":{"position":[[510,16],[974,17]]}},"keywords":{}}],["endpoint/0",{"_index":5929,"title":{},"content":{"1100":{"position":[[618,11],[782,11]]},"1101":{"position":[[782,12]]}},"keywords":{}}],["endpoints.impl",{"_index":1545,"title":{},"content":{"249":{"position":[[215,19]]}},"keywords":{}}],["endpointsrest",{"_index":3132,"title":{},"content":{"481":{"position":[[336,13]]}},"keywords":{}}],["endpointsupport",{"_index":6178,"title":{},"content":{"1199":{"position":[[65,15]]}},"keywords":{}}],["enforc",{"_index":1547,"title":{},"content":{"250":{"position":[[11,8]]},"282":{"position":[[219,7]]},"351":{"position":[[24,7]]},"353":{"position":[[83,8],[548,8]]},"354":{"position":[[474,9]]},"382":{"position":[[147,9]]},"412":{"position":[[12101,9]]},"535":{"position":[[656,7]]},"798":{"position":[[745,7]]},"802":{"position":[[315,7]]},"989":{"position":[[176,7]]},"990":{"position":[[1376,7]]},"1066":{"position":[[551,7]]},"1314":{"position":[[255,9]]}},"keywords":{}}],["engag",{"_index":1005,"title":{},"content":{"88":{"position":[[205,11]]},"173":{"position":[[1834,6]]},"498":{"position":[[629,7]]},"502":{"position":[[819,8],[905,8]]},"509":{"position":[[178,11]]},"510":{"position":[[611,11]]},"530":{"position":[[114,8]]}},"keywords":{}}],["engin",{"_index":1329,"title":{"276":{"position":[[12,7]]},"980":{"position":[[21,6]]},"981":{"position":[[29,7]]},"982":{"position":[[9,6]]},"983":{"position":[[9,6]]}},"content":{"205":{"position":[[322,7]]},"208":{"position":[[27,6]]},"252":{"position":[[19,6]]},"255":{"position":[[45,7]]},"276":{"position":[[20,6],[276,7]]},"354":{"position":[[1391,7]]},"356":{"position":[[58,7]]},"369":{"position":[[138,10]]},"383":{"position":[[432,7]]},"385":{"position":[[72,8]]},"408":{"position":[[1865,7],[3632,8]]},"412":{"position":[[2001,7],[2962,7],[9109,7],[9975,7]]},"481":{"position":[[18,6]]},"489":{"position":[[257,7]]},"502":{"position":[[675,6]]},"533":{"position":[[213,6]]},"566":{"position":[[114,6]]},"571":{"position":[[1429,10]]},"579":{"position":[[149,7]]},"593":{"position":[[213,6]]},"626":{"position":[[616,6]]},"631":{"position":[[383,7]]},"705":{"position":[[936,6]]},"707":{"position":[[241,6]]},"710":{"position":[[341,6]]},"723":{"position":[[215,6]]},"772":{"position":[[293,7],[327,7]]},"793":{"position":[[630,6]]},"841":{"position":[[128,6]]},"981":{"position":[[82,6],[158,6],[398,7]]},"1004":{"position":[[54,6]]},"1072":{"position":[[1691,7],[1733,7],[1880,8]]},"1101":{"position":[[112,7]]},"1124":{"position":[[1906,6]]},"1198":{"position":[[248,7],[1253,6],[1746,7]]},"1280":{"position":[[89,6]]},"1320":{"position":[[868,6]]}},"keywords":{}}],["engine"",{"_index":1532,"title":{},"content":{"244":{"position":[[1647,12]]}},"keywords":{}}],["engineatla",{"_index":4935,"title":{},"content":{"870":{"position":[[204,11]]}},"keywords":{}}],["enginefirestor",{"_index":1599,"title":{},"content":{"263":{"position":[[580,15]]}},"keywords":{}}],["enginejoin",{"_index":3473,"title":{},"content":{"572":{"position":[[73,10]]}},"keywords":{}}],["enginework",{"_index":5185,"title":{},"content":{"896":{"position":[[306,11]]}},"keywords":{}}],["enhanc",{"_index":525,"title":{},"content":{"33":{"position":[[583,8]]},"65":{"position":[[857,8],[1919,8]]},"77":{"position":[[137,8]]},"81":{"position":[[106,9]]},"87":{"position":[[253,9]]},"94":{"position":[[286,9]]},"97":{"position":[[158,9]]},"109":{"position":[[218,8]]},"114":{"position":[[573,8]]},"136":{"position":[[329,8]]},"137":{"position":[[71,7]]},"166":{"position":[[273,7]]},"170":{"position":[[495,7]]},"173":{"position":[[184,7],[735,8],[1092,8],[2062,8]]},"174":{"position":[[872,8],[1159,9],[1724,8]]},"175":{"position":[[581,8]]},"193":{"position":[[62,7]]},"232":{"position":[[187,8]]},"277":{"position":[[256,8]]},"281":{"position":[[85,8]]},"283":{"position":[[387,8]]},"293":{"position":[[406,9]]},"365":{"position":[[1476,8]]},"373":{"position":[[538,8]]},"432":{"position":[[1159,9]]},"445":{"position":[[1196,8],[1589,8]]},"470":{"position":[[105,8]]},"506":{"position":[[60,9]]},"508":{"position":[[177,9]]},"510":{"position":[[195,9]]},"515":{"position":[[380,8]]},"527":{"position":[[139,9]]},"534":{"position":[[72,9]]},"594":{"position":[[70,9]]},"801":{"position":[[730,8]]},"1132":{"position":[[1141,7]]},"1206":{"position":[[624,8]]}},"keywords":{}}],["enough",{"_index":2443,"title":{},"content":{"400":{"position":[[610,6]]},"702":{"position":[[285,6]]},"703":{"position":[[1176,7]]},"815":{"position":[[268,6]]},"875":{"position":[[151,6]]},"1152":{"position":[[51,6]]}},"keywords":{}}],["enough"",{"_index":3975,"title":{},"content":{"703":{"position":[[1456,12]]}},"keywords":{}}],["enough?"",{"_index":2739,"title":{},"content":{"412":{"position":[[10273,14]]},"703":{"position":[[1232,14]]}},"keywords":{}}],["ensur",{"_index":155,"title":{},"content":{"11":{"position":[[384,7]]},"50":{"position":[[316,6]]},"65":{"position":[[587,7],[1702,7]]},"78":{"position":[[30,7]]},"82":{"position":[[86,8]]},"88":{"position":[[160,8]]},"92":{"position":[[179,8]]},"95":{"position":[[183,8]]},"97":{"position":[[97,7]]},"101":{"position":[[249,8]]},"103":{"position":[[186,7]]},"107":{"position":[[83,7]]},"109":{"position":[[167,7]]},"110":{"position":[[157,8]]},"112":{"position":[[229,7]]},"117":{"position":[[268,8]]},"123":{"position":[[226,7]]},"125":{"position":[[206,7]]},"129":{"position":[[206,6],[617,6]]},"130":{"position":[[278,7]]},"135":{"position":[[134,7]]},"139":{"position":[[206,8]]},"143":{"position":[[239,8]]},"145":{"position":[[4,6]]},"152":{"position":[[315,8]]},"156":{"position":[[277,8]]},"157":{"position":[[264,7]]},"158":{"position":[[282,8]]},"159":{"position":[[299,7]]},"160":{"position":[[120,7]]},"164":{"position":[[366,8]]},"165":{"position":[[263,6]]},"167":{"position":[[150,6]]},"173":{"position":[[1264,7],[2911,7],[3199,7]]},"174":{"position":[[393,7],[906,8],[2216,6]]},"182":{"position":[[274,8]]},"183":{"position":[[270,7]]},"184":{"position":[[302,8]]},"191":{"position":[[31,7],[230,7]]},"195":{"position":[[4,6]]},"202":{"position":[[357,7]]},"218":{"position":[[203,7]]},"228":{"position":[[288,8]]},"233":{"position":[[236,7]]},"234":{"position":[[123,7]]},"235":{"position":[[214,8]]},"237":{"position":[[135,7]]},"240":{"position":[[213,7]]},"250":{"position":[[331,6]]},"263":{"position":[[278,6]]},"267":{"position":[[332,6],[769,8]]},"273":{"position":[[248,7]]},"274":{"position":[[307,8]]},"279":{"position":[[473,7]]},"280":{"position":[[408,7]]},"283":{"position":[[113,6]]},"286":{"position":[[64,8]]},"288":{"position":[[107,8],[311,8]]},"289":{"position":[[851,7],[1331,8]]},"291":{"position":[[170,8]]},"292":{"position":[[332,7]]},"293":{"position":[[1,8],[320,7]]},"294":{"position":[[254,7]]},"327":{"position":[[291,8]]},"328":{"position":[[96,6]]},"339":{"position":[[181,8]]},"340":{"position":[[121,7]]},"346":{"position":[[401,6],[696,6]]},"357":{"position":[[299,6]]},"358":{"position":[[967,8]]},"364":{"position":[[325,7]]},"365":{"position":[[258,8]]},"366":{"position":[[280,8]]},"367":{"position":[[357,8]]},"376":{"position":[[615,6]]},"381":{"position":[[482,7]]},"385":{"position":[[207,7]]},"386":{"position":[[227,7]]},"392":{"position":[[1821,6],[2196,6]]},"394":{"position":[[133,6]]},"397":{"position":[[118,6],[314,7]]},"398":{"position":[[2997,8]]},"407":{"position":[[271,8]]},"410":{"position":[[1307,7],[2088,6]]},"412":{"position":[[702,8],[8699,8],[12317,6]]},"438":{"position":[[327,8]]},"445":{"position":[[569,8],[1509,8]]},"446":{"position":[[192,7],[321,6],[700,8]]},"460":{"position":[[118,7]]},"463":{"position":[[158,6]]},"481":{"position":[[106,7]]},"482":{"position":[[1174,7]]},"489":{"position":[[104,8]]},"500":{"position":[[638,6]]},"502":{"position":[[402,7]]},"504":{"position":[[1002,8]]},"510":{"position":[[653,6]]},"516":{"position":[[144,7]]},"517":{"position":[[266,7]]},"519":{"position":[[144,7]]},"525":{"position":[[127,7]]},"526":{"position":[[114,8]]},"535":{"position":[[566,8]]},"550":{"position":[[12,7]]},"556":{"position":[[708,8],[1684,6],[1909,7]]},"569":{"position":[[364,6]]},"571":{"position":[[1653,6]]},"582":{"position":[[160,7],[410,6]]},"589":{"position":[[64,7]]},"590":{"position":[[173,8]]},"595":{"position":[[593,8]]},"610":{"position":[[1558,6]]},"611":{"position":[[1208,6]]},"626":{"position":[[1124,7]]},"632":{"position":[[261,8],[489,7],[901,8]]},"636":{"position":[[362,8]]},"638":{"position":[[876,7]]},"642":{"position":[[184,8]]},"653":{"position":[[631,7],[1098,7],[1345,7]]},"656":{"position":[[307,6]]},"662":{"position":[[692,7]]},"668":{"position":[[29,6],[126,7],[393,6]]},"723":{"position":[[124,7],[671,7],[840,7],[1184,7],[1416,8],[1728,7],[2555,8]]},"749":{"position":[[20910,6],[24127,6]]},"755":{"position":[[73,6]]},"761":{"position":[[40,7]]},"796":{"position":[[166,6]]},"799":{"position":[[162,7]]},"838":{"position":[[1046,7]]},"848":{"position":[[334,6]]},"857":{"position":[[599,6]]},"861":{"position":[[304,6]]},"875":{"position":[[5768,6]]},"898":{"position":[[151,6]]},"904":{"position":[[2150,6],[3377,6]]},"912":{"position":[[350,7]]},"916":{"position":[[45,6]]},"943":{"position":[[174,8]]},"986":{"position":[[42,6],[251,7],[1212,7]]},"987":{"position":[[836,7]]},"995":{"position":[[1575,6]]},"1003":{"position":[[1,7]]},"1007":{"position":[[944,7]]},"1024":{"position":[[106,6]]},"1048":{"position":[[208,6]]},"1057":{"position":[[258,6]]},"1065":{"position":[[1787,6]]},"1079":{"position":[[546,6]]},"1083":{"position":[[209,6]]},"1085":{"position":[[1771,6]]},"1109":{"position":[[97,6]]},"1115":{"position":[[547,6],[729,6]]},"1120":{"position":[[141,7]]},"1126":{"position":[[210,7]]},"1132":{"position":[[503,8],[938,7]]},"1150":{"position":[[574,8]]},"1151":{"position":[[455,6]]},"1164":{"position":[[963,7],[1295,6]]},"1165":{"position":[[658,6]]},"1175":{"position":[[366,6],[646,7]]},"1178":{"position":[[454,6]]},"1185":{"position":[[199,6]]},"1237":{"position":[[302,6]]},"1250":{"position":[[302,7]]},"1251":{"position":[[70,6],[323,7]]},"1290":{"position":[[153,6]]},"1291":{"position":[[151,6]]},"1300":{"position":[[236,6]]},"1301":{"position":[[1262,7]]},"1304":{"position":[[242,7]]},"1305":{"position":[[329,6]]},"1307":{"position":[[643,6]]},"1313":{"position":[[126,7],[312,7],[718,6]]},"1315":{"position":[[1297,6]]},"1317":{"position":[[458,6]]}},"keywords":{}}],["enter",{"_index":1920,"title":{},"content":{"321":{"position":[[451,5]]},"1007":{"position":[[379,6]]}},"keywords":{}}],["enterpris",{"_index":1729,"title":{},"content":{"298":{"position":[[793,10]]},"299":{"position":[[814,10]]},"353":{"position":[[479,10]]},"354":{"position":[[939,10]]},"386":{"position":[[121,10]]},"619":{"position":[[55,10],[307,10]]},"1009":{"position":[[77,10]]}},"keywords":{}}],["entir",{"_index":1042,"title":{},"content":{"107":{"position":[[15,8]]},"174":{"position":[[1271,8]]},"220":{"position":[[56,8]]},"260":{"position":[[291,8]]},"265":{"position":[[771,6]]},"303":{"position":[[359,6]]},"358":{"position":[[509,6],[685,6],[742,6]]},"411":{"position":[[3338,6],[3920,6]]},"479":{"position":[[68,8]]},"496":{"position":[[438,6]]},"632":{"position":[[966,8]]},"635":{"position":[[511,6]]},"723":{"position":[[1646,6]]},"1006":{"position":[[112,6]]},"1008":{"position":[[311,6]]},"1072":{"position":[[210,6],[323,6],[669,8]]}},"keywords":{}}],["entiti",{"_index":2018,"title":{},"content":{"354":{"position":[[273,8]]},"411":{"position":[[1396,7]]},"793":{"position":[[88,8]]},"849":{"position":[[453,8]]},"1009":{"position":[[963,8]]},"1316":{"position":[[676,9]]}},"keywords":{}}],["entri",{"_index":3851,"title":{},"content":{"674":{"position":[[47,6]]},"904":{"position":[[123,7]]},"1266":{"position":[[533,6]]}},"keywords":{}}],["entrypoint="install"",{"_index":4897,"title":{},"content":{"861":{"position":[[688,30]]}},"keywords":{}}],["enum",{"_index":4644,"title":{},"content":{"796":{"position":[[1054,4],[1212,4]]}},"keywords":{}}],["enumqueri",{"_index":4645,"title":{},"content":{"796":{"position":[[1138,9]]}},"keywords":{}}],["env",{"_index":4074,"title":{},"content":{"729":{"position":[[392,4]]},"861":{"position":[[535,4]]},"1202":{"position":[[431,4]]}},"keywords":{}}],["environ",{"_index":3,"title":{"240":{"position":[[39,13]]}},"content":{"1":{"position":[[8,12]]},"3":{"position":[[80,12]]},"47":{"position":[[1228,12]]},"67":{"position":[[53,13]]},"70":{"position":[[40,13]]},"94":{"position":[[244,11]]},"100":{"position":[[220,12]]},"101":{"position":[[236,12]]},"107":{"position":[[183,12]]},"122":{"position":[[388,13]]},"133":{"position":[[381,13]]},"164":{"position":[[123,13]]},"172":{"position":[[157,12]]},"202":{"position":[[106,12]]},"207":{"position":[[70,12]]},"222":{"position":[[382,12]]},"228":{"position":[[274,13]]},"239":{"position":[[328,13]]},"240":{"position":[[16,12]]},"254":{"position":[[32,11]]},"286":{"position":[[119,12]]},"300":{"position":[[738,13]]},"301":{"position":[[112,13]]},"306":{"position":[[368,13]]},"314":{"position":[[42,11]]},"368":{"position":[[220,13]]},"380":{"position":[[61,13]]},"384":{"position":[[79,13]]},"386":{"position":[[37,13]]},"418":{"position":[[177,13]]},"427":{"position":[[1132,12]]},"438":{"position":[[314,12]]},"444":{"position":[[191,13]]},"479":{"position":[[92,12],[406,12]]},"489":{"position":[[306,11]]},"525":{"position":[[378,12]]},"575":{"position":[[164,11]]},"595":{"position":[[1390,13]]},"613":{"position":[[877,13]]},"619":{"position":[[66,12]]},"624":{"position":[[1535,12]]},"630":{"position":[[264,11]]},"631":{"position":[[130,12]]},"640":{"position":[[81,12],[289,12]]},"642":{"position":[[14,12]]},"723":{"position":[[2675,12]]},"755":{"position":[[36,12]]},"824":{"position":[[463,11]]},"832":{"position":[[363,12]]},"871":{"position":[[596,12]]},"911":{"position":[[172,12]]},"962":{"position":[[415,11]]},"1072":{"position":[[812,11],[1466,12]]},"1151":{"position":[[654,13]]},"1178":{"position":[[653,13]]},"1241":{"position":[[125,13]]},"1268":{"position":[[227,12]]}},"keywords":{}}],["environments.repl",{"_index":1226,"title":{},"content":{"174":{"position":[[2873,24]]}},"keywords":{}}],["ephemer",{"_index":1871,"title":{},"content":{"305":{"position":[[309,9]]},"336":{"position":[[391,9]]},"496":{"position":[[175,9]]},"581":{"position":[[395,9]]},"640":{"position":[[405,9]]}},"keywords":{}}],["ephemeral/incognito",{"_index":1750,"title":{},"content":{"299":{"position":[[521,19]]}},"keywords":{}}],["eq",{"_index":1641,"title":{},"content":{"276":{"position":[[449,4]]},"798":{"position":[[606,4]]},"820":{"position":[[655,4]]},"875":{"position":[[2495,4]]},"1065":{"position":[[249,4],[1084,4]]},"1066":{"position":[[412,4]]},"1072":{"position":[[2513,4]]},"1105":{"position":[[663,4]]},"1158":{"position":[[718,4]]}},"keywords":{}}],["equal",{"_index":2131,"title":{},"content":{"370":{"position":[[272,7]]},"412":{"position":[[4573,6],[4777,6]]},"462":{"position":[[411,5]]},"571":{"position":[[1634,6]]},"626":{"position":[[1174,5]]},"683":{"position":[[232,5]]},"704":{"position":[[288,5]]},"714":{"position":[[642,6]]},"749":{"position":[[11561,5]]},"821":{"position":[[853,7]]},"847":{"position":[[92,5]]},"875":{"position":[[5008,5]]},"885":{"position":[[2224,6]]},"893":{"position":[[332,5]]},"961":{"position":[[168,5]]},"982":{"position":[[514,5]]},"1100":{"position":[[865,5]]},"1164":{"position":[[702,5]]},"1165":{"position":[[938,5]]},"1193":{"position":[[264,5]]},"1229":{"position":[[222,5]]},"1309":{"position":[[703,6]]}},"keywords":{}}],["equalsolv",{"_index":6494,"title":{},"content":{"1309":{"position":[[99,10]]}},"keywords":{}}],["equip",{"_index":2840,"title":{},"content":{"420":{"position":[[1250,10]]}},"keywords":{}}],["equival",{"_index":3920,"title":{},"content":{"691":{"position":[[692,10]]},"1065":{"position":[[344,10]]}},"keywords":{}}],["eras",{"_index":3944,"title":{},"content":{"698":{"position":[[2632,7]]}},"keywords":{}}],["err",{"_index":1588,"title":{},"content":{"261":{"position":[[978,5]]},"711":{"position":[[1593,5]]},"898":{"position":[[4145,6]]},"904":{"position":[[3530,6]]},"1010":{"position":[[345,6]]},"1294":{"position":[[1534,3]]}},"keywords":{}}],["error",{"_index":1377,"title":{"302":{"position":[[9,6]]},"748":{"position":[[5,5]]},"749":{"position":[[9,5]]},"990":{"position":[[0,5]]}},"content":{"210":{"position":[[603,8],[612,7]]},"261":{"position":[[969,8]]},"301":{"position":[[248,5]]},"302":{"position":[[244,5],[470,6],[842,7],[1108,6],[1146,8],[1155,7]]},"306":{"position":[[80,5]]},"438":{"position":[[91,5]]},"440":{"position":[[282,5]]},"461":{"position":[[367,5]]},"487":{"position":[[271,5]]},"515":{"position":[[187,5]]},"610":{"position":[[1157,6],[1273,6]]},"626":{"position":[[973,6]]},"632":{"position":[[2650,6]]},"719":{"position":[[169,6]]},"729":{"position":[[85,5]]},"747":{"position":[[331,6]]},"749":{"position":[[8677,5],[12501,7],[15510,5],[15522,7],[15644,5],[15656,7],[15776,5],[15788,7],[16044,5]]},"752":{"position":[[990,6],[997,5],[1162,7]]},"761":{"position":[[282,5]]},"793":{"position":[[971,6]]},"854":{"position":[[1752,7]]},"872":{"position":[[2849,6]]},"898":{"position":[[4032,6],[4380,7]]},"904":{"position":[[3366,7],[3405,7],[3425,6],[3521,8]]},"911":{"position":[[114,5]]},"944":{"position":[[163,5],[348,6],[559,6],[588,7],[623,5],[636,6]]},"945":{"position":[[104,5],[243,6]]},"947":{"position":[[125,5],[317,6]]},"948":{"position":[[115,6],[265,7]]},"966":{"position":[[202,5]]},"968":{"position":[[588,5]]},"988":{"position":[[5657,6]]},"990":{"position":[[132,7],[484,5],[694,7],[789,6],[865,6],[942,5],[1017,7],[1119,5]]},"993":{"position":[[342,6]]},"1010":{"position":[[247,6]]},"1031":{"position":[[98,7]]},"1044":{"position":[[94,5]]},"1067":{"position":[[1153,5],[1383,5]]},"1084":{"position":[[468,5]]},"1085":{"position":[[2668,6],[2802,5],[3228,6]]},"1164":{"position":[[683,6]]},"1176":{"position":[[67,5]]},"1202":{"position":[[85,6]]},"1207":{"position":[[825,5]]},"1213":{"position":[[835,5]]},"1237":{"position":[[316,6]]},"1282":{"position":[[495,5],[506,7]]},"1304":{"position":[[1000,5]]},"1305":{"position":[[1112,6]]},"1307":{"position":[[478,6],[523,5]]},"1322":{"position":[[140,6]]}},"keywords":{}}],["error('myreadonlyfield",{"_index":5974,"title":{},"content":{"1109":{"position":[[320,22]]}},"keywords":{}}],["error('no",{"_index":3366,"title":{},"content":{"556":{"position":[[492,9]]}},"keywords":{}}],["error('stop",{"_index":4533,"title":{},"content":{"767":{"position":[[697,14]]},"768":{"position":[[707,14]]},"769":{"position":[[668,14]]}},"keywords":{}}],["error.nam",{"_index":1812,"title":{},"content":{"302":{"position":[[855,11]]}},"keywords":{}}],["error.parameters.error",{"_index":5491,"title":{},"content":{"990":{"position":[[1231,23]]}},"keywords":{}}],["error.parameters.errors[0",{"_index":5492,"title":{},"content":{"990":{"position":[[1266,26]]}},"keywords":{}}],["error.parameters.errors[0].cod",{"_index":5493,"title":{},"content":{"990":{"position":[[1304,31]]}},"keywords":{}}],["errors.observ",{"_index":1215,"title":{},"content":{"174":{"position":[[948,17]]}},"keywords":{}}],["es5",{"_index":4068,"title":{},"content":{"728":{"position":[[42,4]]}},"keywords":{}}],["es8",{"_index":4066,"title":{},"content":{"728":{"position":[[20,3]]}},"keywords":{}}],["esm",{"_index":4507,"title":{},"content":{"761":{"position":[[574,3]]}},"keywords":{}}],["especi",{"_index":943,"title":{},"content":{"66":{"position":[[332,10]]},"95":{"position":[[47,10]]},"111":{"position":[[162,10]]},"138":{"position":[[163,10]]},"174":{"position":[[2508,10]]},"217":{"position":[[295,10]]},"223":{"position":[[81,10]]},"265":{"position":[[297,10]]},"298":{"position":[[705,10]]},"299":{"position":[[1083,10]]},"305":{"position":[[541,10]]},"353":{"position":[[501,10]]},"376":{"position":[[510,10]]},"396":{"position":[[1536,10]]},"407":{"position":[[790,10]]},"408":{"position":[[4540,10]]},"412":{"position":[[7822,11]]},"416":{"position":[[259,10]]},"419":{"position":[[1305,11]]},"450":{"position":[[555,10]]},"535":{"position":[[630,10]]},"563":{"position":[[958,10]]},"569":{"position":[[1020,10]]},"595":{"position":[[657,10]]},"611":{"position":[[1077,10]]},"634":{"position":[[25,10]]},"639":{"position":[[32,10]]},"723":{"position":[[598,10]]},"785":{"position":[[15,10]]},"801":{"position":[[259,10]]},"802":{"position":[[852,10]]},"836":{"position":[[1736,10]]},"849":{"position":[[277,10]]},"894":{"position":[[94,10]]},"1072":{"position":[[2891,10]]},"1132":{"position":[[1216,10]]},"1321":{"position":[[31,10]]}},"keywords":{}}],["essenti",{"_index":907,"title":{},"content":{"65":{"position":[[275,9],[1319,9],[1480,9]]},"117":{"position":[[254,9]]},"215":{"position":[[147,9]]},"236":{"position":[[298,9]]},"302":{"position":[[285,9]]},"369":{"position":[[776,9]]},"370":{"position":[[249,9]]},"375":{"position":[[74,9]]},"378":{"position":[[272,10]]},"390":{"position":[[520,11]]},"392":{"position":[[2122,9]]},"396":{"position":[[1723,9]]},"412":{"position":[[6317,12],[8337,12],[9033,11]]},"430":{"position":[[549,9]]},"432":{"position":[[87,9]]},"476":{"position":[[189,11]]},"577":{"position":[[22,10]]},"802":{"position":[[617,9]]},"839":{"position":[[527,11]]},"899":{"position":[[170,11]]}},"keywords":{}}],["essential.hybrid",{"_index":2794,"title":{},"content":{"418":{"position":[[484,17]]}},"keywords":{}}],["establish",{"_index":1297,"title":{},"content":{"192":{"position":[[340,9]]},"289":{"position":[[602,11],[735,9],[1141,9]]},"354":{"position":[[1246,11]]},"358":{"position":[[941,12]]},"503":{"position":[[181,9]]},"610":{"position":[[325,11],[1090,9]]},"611":{"position":[[494,12],[735,14]]},"614":{"position":[[488,9]]},"621":{"position":[[408,12]]},"623":{"position":[[541,14]]},"624":{"position":[[1461,12]]},"901":{"position":[[236,12],[321,14],[367,9]]},"906":{"position":[[159,9]]}},"keywords":{}}],["estim",{"_index":1768,"title":{},"content":{"300":{"position":[[91,10],[138,8]]},"461":{"position":[[1227,10]]}},"keywords":{}}],["etc",{"_index":454,"title":{},"content":{"28":{"position":[[232,5]]},"32":{"position":[[217,4]]},"33":{"position":[[657,4]]},"248":{"position":[[90,6]]},"255":{"position":[[1731,6]]},"411":{"position":[[1277,6],[2013,6],[5654,5]]},"412":{"position":[[9258,6],[13785,5]]},"556":{"position":[[605,6]]},"565":{"position":[[154,6]]},"566":{"position":[[1196,5]]},"630":{"position":[[559,5]]},"745":{"position":[[618,6]]},"825":{"position":[[493,6]]},"841":{"position":[[799,5]]},"1065":{"position":[[1272,6]]},"1324":{"position":[[681,4]]}},"keywords":{}}],["etc.).us",{"_index":1544,"title":{},"content":{"249":{"position":[[137,9]]}},"keywords":{}}],["etho",{"_index":2640,"title":{},"content":{"411":{"position":[[5300,5]]}},"keywords":{}}],["euclidean",{"_index":2290,"title":{},"content":{"393":{"position":[[213,9],[468,9],[836,9]]}},"keywords":{}}],["euclideandist",{"_index":2295,"title":{},"content":{"393":{"position":[[925,17]]},"394":{"position":[[476,17]]},"397":{"position":[[1628,17]]}},"keywords":{}}],["euclideandistance((doc",{"_index":2410,"title":{},"content":{"398":{"position":[[1522,22],[2675,22]]}},"keywords":{}}],["euclideandistance(embedding1",{"_index":2297,"title":{},"content":{"393":{"position":[[990,29]]}},"keywords":{}}],["euclideandistance(mysamplevectors[idx",{"_index":2499,"title":{},"content":{"403":{"position":[[944,39]]}},"keywords":{}}],["euclideandistance(queryvector",{"_index":2315,"title":{},"content":{"394":{"position":[[805,30]]}},"keywords":{}}],["euclideandistance(samplevectors[i",{"_index":2398,"title":{},"content":{"398":{"position":[[918,35],[2204,35]]}},"keywords":{}}],["euclideandistance(samplevectors[idx",{"_index":2385,"title":{},"content":{"397":{"position":[[2099,37]]}},"keywords":{}}],["ev",{"_index":2274,"title":{},"content":{"392":{"position":[[4311,4]]}},"keywords":{}}],["ev.data.id",{"_index":2275,"title":{},"content":{"392":{"position":[[4332,11]]}},"keywords":{}}],["eval",{"_index":6384,"title":{},"content":{"1287":{"position":[[44,6],[112,5],[221,5]]}},"keywords":{}}],["evalu",{"_index":3659,"title":{},"content":{"620":{"position":[[116,10]]},"681":{"position":[[568,8]]},"783":{"position":[[168,10]]},"1271":{"position":[[513,10]]}},"keywords":{}}],["even",{"_index":192,"title":{},"content":{"13":{"position":[[259,4]]},"14":{"position":[[1173,4]]},"18":{"position":[[254,4]]},"23":{"position":[[292,4]]},"47":{"position":[[828,4]]},"53":{"position":[[127,4]]},"65":{"position":[[543,4],[1715,4]]},"110":{"position":[[41,4]]},"133":{"position":[[119,4]]},"139":{"position":[[238,4]]},"152":{"position":[[349,4]]},"157":{"position":[[83,4]]},"164":{"position":[[216,4]]},"167":{"position":[[199,4]]},"173":{"position":[[1317,4],[1442,4]]},"183":{"position":[[113,4]]},"191":{"position":[[78,4]]},"203":{"position":[[324,4]]},"212":{"position":[[291,4]]},"215":{"position":[[220,4]]},"218":{"position":[[216,4]]},"227":{"position":[[378,4]]},"248":{"position":[[166,4]]},"252":{"position":[[270,4]]},"253":{"position":[[187,4]]},"266":{"position":[[220,4]]},"273":{"position":[[300,4]]},"280":{"position":[[85,4],[256,4]]},"283":{"position":[[456,4]]},"289":{"position":[[1996,4]]},"291":{"position":[[184,4]]},"292":{"position":[[125,4],[264,4]]},"294":{"position":[[310,4]]},"303":{"position":[[1,4]]},"310":{"position":[[252,4]]},"323":{"position":[[206,4]]},"327":{"position":[[161,4]]},"328":{"position":[[261,4]]},"338":{"position":[[127,4]]},"347":{"position":[[561,4]]},"358":{"position":[[789,4]]},"362":{"position":[[753,4],[1632,4]]},"369":{"position":[[479,4]]},"375":{"position":[[990,4]]},"376":{"position":[[657,4]]},"380":{"position":[[75,4]]},"385":{"position":[[220,4]]},"390":{"position":[[1263,4]]},"400":{"position":[[674,4]]},"403":{"position":[[40,4]]},"404":{"position":[[375,4]]},"408":{"position":[[418,4],[1132,4],[5092,4],[5182,4]]},"410":{"position":[[757,4],[1223,4]]},"411":{"position":[[4078,4]]},"412":{"position":[[1556,4],[3984,4],[5080,4],[5972,4],[7108,4],[8568,4],[9691,4],[13832,4],[14611,4]]},"414":{"position":[[107,4]]},"420":{"position":[[244,4],[1286,4]]},"424":{"position":[[296,4]]},"439":{"position":[[565,4]]},"445":{"position":[[606,4]]},"446":{"position":[[232,4]]},"450":{"position":[[679,4]]},"455":{"position":[[833,4]]},"457":{"position":[[341,4]]},"461":{"position":[[457,4]]},"482":{"position":[[1235,4]]},"486":{"position":[[294,4]]},"489":{"position":[[679,4]]},"500":{"position":[[670,4]]},"502":{"position":[[438,4]]},"516":{"position":[[87,4]]},"525":{"position":[[329,4]]},"534":{"position":[[262,4]]},"541":{"position":[[863,4]]},"550":{"position":[[26,4]]},"569":{"position":[[1226,4]]},"571":{"position":[[425,4],[1263,4]]},"574":{"position":[[241,4]]},"581":{"position":[[296,4]]},"582":{"position":[[101,4]]},"591":{"position":[[702,4]]},"594":{"position":[[260,4]]},"600":{"position":[[184,4]]},"611":{"position":[[1374,4]]},"613":{"position":[[297,4],[892,4]]},"616":{"position":[[653,4]]},"617":{"position":[[172,4],[371,4]]},"630":{"position":[[703,4]]},"632":{"position":[[698,4]]},"634":{"position":[[384,4]]},"662":{"position":[[181,4]]},"685":{"position":[[180,4]]},"688":{"position":[[651,4]]},"699":{"position":[[676,4]]},"701":{"position":[[732,4]]},"702":{"position":[[524,4]]},"704":{"position":[[283,4],[439,4]]},"705":{"position":[[539,4],[1388,4]]},"709":{"position":[[865,4]]},"723":{"position":[[178,4],[2381,4]]},"724":{"position":[[900,4]]},"778":{"position":[[456,4]]},"779":{"position":[[7,4]]},"781":{"position":[[749,4]]},"838":{"position":[[210,4],[3350,4]]},"854":{"position":[[1245,4]]},"860":{"position":[[412,4]]},"912":{"position":[[363,4]]},"956":{"position":[[101,4]]},"986":{"position":[[143,4]]},"988":{"position":[[1398,4]]},"1072":{"position":[[252,4]]},"1085":{"position":[[663,4]]},"1092":{"position":[[559,4]]},"1093":{"position":[[254,4]]},"1124":{"position":[[1680,4]]},"1132":{"position":[[253,4]]},"1133":{"position":[[586,4]]},"1161":{"position":[[174,4]]},"1164":{"position":[[991,4]]},"1180":{"position":[[174,4]]},"1198":{"position":[[940,4],[1404,4]]},"1206":{"position":[[368,4]]},"1207":{"position":[[419,4]]},"1209":{"position":[[286,4],[472,4]]},"1246":{"position":[[841,4]]},"1252":{"position":[[322,4]]},"1282":{"position":[[288,4]]},"1295":{"position":[[1142,4]]},"1304":{"position":[[1351,4]]},"1314":{"position":[[112,4]]},"1316":{"position":[[1999,4]]},"1318":{"position":[[759,4]]},"1319":{"position":[[653,4]]},"1320":{"position":[[327,4],[758,4]]}},"keywords":{}}],["event",{"_index":116,"title":{"140":{"position":[[19,5]]},"168":{"position":[[19,5]]},"196":{"position":[[19,5]]},"344":{"position":[[19,5]]},"509":{"position":[[19,5]]},"529":{"position":[[19,5]]},"609":{"position":[[26,6]]},"612":{"position":[[21,8]]},"626":{"position":[[22,6]]},"985":{"position":[[0,5]]},"1318":{"position":[[0,5]]}},"content":{"8":{"position":[[483,6]]},"11":{"position":[[744,5]]},"134":{"position":[[286,6]]},"140":{"position":[[293,5]]},"153":{"position":[[218,5]]},"168":{"position":[[32,5]]},"174":{"position":[[1680,6]]},"196":{"position":[[42,6],[140,5]]},"234":{"position":[[112,6]]},"255":{"position":[[247,5]]},"302":{"position":[[250,6],[431,5]]},"320":{"position":[[52,5]]},"326":{"position":[[38,5]]},"331":{"position":[[342,5]]},"334":{"position":[[536,5]]},"411":{"position":[[4440,8]]},"432":{"position":[[624,6],[831,6],[916,7]]},"445":{"position":[[1373,6]]},"458":{"position":[[530,6],[609,6],[664,5],[762,6],[858,7]]},"459":{"position":[[893,7],[951,7]]},"464":{"position":[[220,6]]},"481":{"position":[[498,5]]},"490":{"position":[[450,5],[504,5]]},"491":{"position":[[641,6],[1680,6]]},"529":{"position":[[68,6],[145,5]]},"566":{"position":[[499,8]]},"569":{"position":[[219,7]]},"571":{"position":[[148,6]]},"579":{"position":[[544,5]]},"610":{"position":[[1589,6]]},"612":{"position":[[13,6],[397,6],[585,5],[658,6],[824,7],[875,5],[974,6],[991,7],[1121,5],[1237,6],[1266,5],[1592,5],[1645,5],[2182,5]]},"616":{"position":[[547,6]]},"619":{"position":[[273,6]]},"620":{"position":[[54,6]]},"621":{"position":[[201,7],[569,5]]},"622":{"position":[[214,7]]},"623":{"position":[[184,7]]},"624":{"position":[[134,6],[593,5]]},"626":{"position":[[71,6],[163,6],[380,7],[498,6],[833,5],[1113,6]]},"628":{"position":[[114,6]]},"698":{"position":[[1077,5],[1130,5],[1244,5],[2450,6],[2575,5]]},"711":{"position":[[1519,7]]},"740":{"position":[[355,6]]},"755":{"position":[[167,6]]},"826":{"position":[[91,6]]},"846":{"position":[[1419,7]]},"875":{"position":[[4167,5],[4531,5],[6682,5],[6916,7],[6990,6],[7053,6],[7726,5],[7874,6],[7981,6],[8229,5],[8772,6],[9340,6]]},"876":{"position":[[302,6]]},"879":{"position":[[477,5],[604,6]]},"882":{"position":[[21,7]]},"885":{"position":[[467,7]]},"886":{"position":[[5056,6]]},"890":{"position":[[115,7]]},"941":{"position":[[202,5]]},"953":{"position":[[200,6]]},"961":{"position":[[194,6]]},"964":{"position":[[167,5],[271,6]]},"970":{"position":[[69,6]]},"979":{"position":[[7,6],[189,6],[388,5]]},"984":{"position":[[671,5]]},"985":{"position":[[51,6],[225,6],[285,6],[525,7],[585,5]]},"988":{"position":[[4096,6],[5054,7],[5561,5],[5906,6],[6096,6]]},"996":{"position":[[344,6]]},"1088":{"position":[[509,6]]},"1124":{"position":[[830,7],[1261,6]]},"1126":{"position":[[223,6],[514,5],[819,6]]},"1230":{"position":[[155,6]]},"1300":{"position":[[798,5],[1055,5]]},"1318":{"position":[[34,5],[126,6],[292,6],[555,5],[1117,6]]}},"keywords":{}}],["event.checkpoint",{"_index":5031,"title":{},"content":{"875":{"position":[[5352,16]]}},"keywords":{}}],["event.data",{"_index":3575,"title":{},"content":{"611":{"position":[[891,12]]},"612":{"position":[[1310,12]]},"988":{"position":[[5365,10]]}},"keywords":{}}],["event.documents.push(changerow.newdocumentst",{"_index":5030,"title":{},"content":{"875":{"position":[[5302,49]]}},"keywords":{}}],["eventdata",{"_index":5052,"title":{},"content":{"875":{"position":[[8249,9]]}},"keywords":{}}],["eventdata.checkpoint",{"_index":5056,"title":{},"content":{"875":{"position":[[8350,20]]}},"keywords":{}}],["eventdata.docu",{"_index":5055,"title":{},"content":{"875":{"position":[[8317,20]]}},"keywords":{}}],["eventreduc",{"_index":981,"title":{"78":{"position":[[36,11]]},"108":{"position":[[36,11]]},"234":{"position":[[36,11]]},"277":{"position":[[31,12]]},"965":{"position":[[0,12]]},"1256":{"position":[[0,12]]}},"content":{"78":{"position":[[8,11]]},"108":{"position":[[18,11]]},"174":{"position":[[1538,11],[1583,11]]},"209":{"position":[[336,12]]},"234":{"position":[[42,11]]},"255":{"position":[[680,12]]},"277":{"position":[[34,12],[150,11]]},"283":{"position":[[357,11]]},"334":{"position":[[505,12]]},"369":{"position":[[1226,11]]},"411":{"position":[[3412,11]]},"522":{"position":[[644,12],[672,11]]},"571":{"position":[[1736,11]]},"579":{"position":[[514,12]]},"799":{"position":[[227,11]]},"960":{"position":[[539,12],[567,11]]},"965":{"position":[[222,11],[334,12]]},"1065":{"position":[[1640,11]]},"1071":{"position":[[458,11]]},"1083":{"position":[[279,11]]},"1318":{"position":[[852,11]]}},"keywords":{}}],["events.get",{"_index":5944,"title":{},"content":{"1102":{"position":[[1226,10]]}},"keywords":{}}],["eventsnotif",{"_index":4520,"title":{},"content":{"765":{"position":[[253,19]]}},"keywords":{}}],["eventsourc",{"_index":3585,"title":{"882":{"position":[[7,11]]}},"content":{"612":{"position":[[745,11],[906,11],[1359,11]]},"616":{"position":[[739,11],[982,11],[1025,11]]},"617":{"position":[[1677,12]]},"875":{"position":[[8114,11],[8132,12],[8588,11],[9533,11],[9551,12]]},"882":{"position":[[33,11],[87,11],[262,11],[430,12]]}},"keywords":{}}],["eventsource("https://example.com/events"",{"_index":3588,"title":{},"content":{"612":{"position":[[1156,52]]}},"keywords":{}}],["eventsource.onerror",{"_index":5058,"title":{},"content":{"875":{"position":[[8959,19]]}},"keywords":{}}],["eventsource.onmessag",{"_index":5051,"title":{},"content":{"875":{"position":[[8205,21],[9624,21]]}},"keywords":{}}],["eventu",{"_index":1860,"title":{"700":{"position":[[0,8]]}},"content":{"304":{"position":[[187,10]]},"407":{"position":[[292,10]]},"411":{"position":[[4739,10]]},"412":{"position":[[5578,8],[5652,10],[5847,11],[6356,8]]},"660":{"position":[[383,11]]},"1125":{"position":[[399,10]]}},"keywords":{}}],["everyday",{"_index":3294,"title":{},"content":{"535":{"position":[[85,8]]},"595":{"position":[[85,8]]}},"keywords":{}}],["everyon",{"_index":1619,"title":{},"content":{"267":{"position":[[783,8]]},"412":{"position":[[4242,8],[11658,8]]},"446":{"position":[[714,8]]}},"keywords":{}}],["everyth",{"_index":156,"title":{"1320":{"position":[[0,10]]}},"content":{"11":{"position":[[397,10]]},"18":{"position":[[137,10],[218,10]]},"28":{"position":[[68,10]]},"188":{"position":[[1768,10]]},"358":{"position":[[34,10],[410,11],[1018,10]]},"362":{"position":[[560,10]]},"394":{"position":[[140,10]]},"407":{"position":[[679,10]]},"412":{"position":[[6811,10],[8745,10]]},"421":{"position":[[185,10],[845,10]]},"460":{"position":[[1050,10],[1404,11]]},"464":{"position":[[1059,10]]},"469":{"position":[[367,10]]},"478":{"position":[[180,10]]},"481":{"position":[[460,10]]},"483":{"position":[[485,10]]},"668":{"position":[[134,10],[400,10]]},"697":{"position":[[404,10]]},"699":{"position":[[423,10]]},"702":{"position":[[719,10]]},"704":{"position":[[534,10]]},"705":{"position":[[601,10]]},"772":{"position":[[2003,10]]},"773":{"position":[[412,10]]},"835":{"position":[[197,10]]},"997":{"position":[[63,10]]},"1066":{"position":[[174,10]]},"1072":{"position":[[1438,10]]},"1292":{"position":[[419,10]]},"1313":{"position":[[284,10],[356,10]]},"1315":{"position":[[1669,11]]},"1316":{"position":[[1017,10]]},"1318":{"position":[[268,10]]},"1320":{"position":[[650,10]]},"1324":{"position":[[465,10]]}},"keywords":{}}],["everything.no",{"_index":3408,"title":{},"content":{"559":{"position":[[1283,13]]}},"keywords":{}}],["everywher",{"_index":1334,"title":{"207":{"position":[[9,10]]}},"content":{},"keywords":{}}],["evict",{"_index":1757,"title":{},"content":{"299":{"position":[[995,8]]},"305":{"position":[[140,8]]},"412":{"position":[[7797,5],[7987,8]]}},"keywords":{}}],["evid",{"_index":2478,"title":{},"content":{"401":{"position":[[619,7]]}},"keywords":{}}],["evolut",{"_index":1431,"title":{},"content":{"240":{"position":[[332,10]]}},"keywords":{}}],["evolv",{"_index":860,"title":{"352":{"position":[[13,8]]}},"content":{"57":{"position":[[273,6]]},"110":{"position":[[218,8]]},"170":{"position":[[589,7]]},"174":{"position":[[2265,8]]},"202":{"position":[[456,8]]},"282":{"position":[[362,6]]},"299":{"position":[[1197,8]]},"320":{"position":[[300,7]]},"353":{"position":[[275,8]]},"354":{"position":[[1604,8]]},"362":{"position":[[74,9]]},"367":{"position":[[283,8]]},"369":{"position":[[851,8]]},"382":{"position":[[324,6]]},"412":{"position":[[11040,8]]},"419":{"position":[[628,7]]},"510":{"position":[[13,8]]},"530":{"position":[[600,7]]},"636":{"position":[[17,6]]},"836":{"position":[[2139,7]]}},"keywords":{}}],["evtsourc",{"_index":3587,"title":{},"content":{"612":{"position":[[1140,9]]}},"keywords":{}}],["evtsource.onmessag",{"_index":3589,"title":{},"content":{"612":{"position":[[1244,19]]}},"keywords":{}}],["ex",{"_index":4847,"title":{},"content":{"849":{"position":[[632,4]]}},"keywords":{}}],["exact",{"_index":2165,"title":{},"content":{"383":{"position":[[514,5]]},"390":{"position":[[339,5],[478,5],[1303,5]]},"626":{"position":[[1168,5]]},"679":{"position":[[262,5]]},"686":{"position":[[585,5]]},"749":{"position":[[1468,5]]},"756":{"position":[[289,5]]},"872":{"position":[[3652,5]]},"888":{"position":[[607,5]]},"1091":{"position":[[129,5]]},"1157":{"position":[[186,5]]},"1257":{"position":[[65,5]]},"1316":{"position":[[249,5]]}},"keywords":{}}],["exactli",{"_index":2130,"title":{},"content":{"369":{"position":[[1536,7]]},"412":{"position":[[961,7]]},"562":{"position":[[1657,7]]},"683":{"position":[[224,7]]},"684":{"position":[[114,7]]},"703":{"position":[[669,7],[838,7]]},"723":{"position":[[883,7]]},"737":{"position":[[106,7],[301,7]]},"755":{"position":[[85,7]]},"779":{"position":[[286,7]]},"981":{"position":[[1602,7]]},"1100":{"position":[[101,7]]},"1183":{"position":[[361,7]]},"1267":{"position":[[454,7]]},"1318":{"position":[[55,7]]}},"keywords":{}}],["examin",{"_index":2647,"title":{},"content":{"412":{"position":[[172,7]]}},"keywords":{}}],["exampl",{"_index":19,"title":{"56":{"position":[[18,7]]},"261":{"position":[[0,8]]},"315":{"position":[[11,8]]},"316":{"position":[[12,8]]},"425":{"position":[[45,8]]},"480":{"position":[[12,8]]},"493":{"position":[[8,8]]},"494":{"position":[[6,8]]},"543":{"position":[[16,7]]},"562":{"position":[[11,7]]},"603":{"position":[[14,7]]},"691":{"position":[[0,8]]},"736":{"position":[[9,8]]},"739":{"position":[[5,8]]},"741":{"position":[[5,8]]},"812":{"position":[[0,7]]},"813":{"position":[[0,7]]},"848":{"position":[[5,8]]},"1065":{"position":[[6,9]]},"1074":{"position":[[0,8]]},"1080":{"position":[[6,8]]},"1236":{"position":[[14,9]]}},"content":{"1":{"position":[[291,7]]},"51":{"position":[[1014,7],[1053,8]]},"56":{"position":[[17,7]]},"149":{"position":[[453,7]]},"188":{"position":[[1701,7]]},"198":{"position":[[508,7]]},"228":{"position":[[358,7]]},"241":{"position":[[319,9]]},"255":{"position":[[306,8]]},"261":{"position":[[994,7]]},"296":{"position":[[24,7]]},"303":{"position":[[447,8]]},"315":{"position":[[120,7]]},"334":{"position":[[20,7]]},"335":{"position":[[107,8],[552,7]]},"347":{"position":[[443,9],[469,8]]},"361":{"position":[[455,8]]},"362":{"position":[[1514,9],[1540,8]]},"365":{"position":[[887,8]]},"367":{"position":[[686,7]]},"373":{"position":[[319,9]]},"390":{"position":[[591,8]]},"392":{"position":[[773,7],[2489,8]]},"394":{"position":[[1551,8]]},"396":{"position":[[1304,7]]},"397":{"position":[[376,7]]},"402":{"position":[[275,7],[838,8],[2307,7]]},"404":{"position":[[597,7]]},"408":{"position":[[539,8]]},"411":{"position":[[3809,8],[4308,8]]},"412":{"position":[[998,7],[3085,8],[4373,7],[5190,7],[6843,8],[9902,8],[10847,7],[12510,8],[13861,7]]},"425":{"position":[[36,8]]},"426":{"position":[[261,7]]},"429":{"position":[[471,7]]},"451":{"position":[[495,7]]},"459":{"position":[[454,8]]},"469":{"position":[[163,7],[593,7]]},"482":{"position":[[149,8]]},"497":{"position":[[391,8]]},"511":{"position":[[476,7]]},"523":{"position":[[216,7]]},"531":{"position":[[451,7]]},"538":{"position":[[160,7]]},"541":{"position":[[104,7]]},"543":{"position":[[17,7]]},"554":{"position":[[242,7],[309,7]]},"556":{"position":[[209,8]]},"557":{"position":[[170,7]]},"567":{"position":[[523,8],[775,9],[855,7]]},"571":{"position":[[674,7]]},"579":{"position":[[107,7],[876,8]]},"580":{"position":[[225,7]]},"591":{"position":[[582,7],[625,7],[685,9],[721,8]]},"598":{"position":[[161,7]]},"601":{"position":[[11,7]]},"603":{"position":[[17,7]]},"616":{"position":[[965,7]]},"626":{"position":[[627,7]]},"632":{"position":[[1003,7],[2073,7]]},"634":{"position":[[265,8]]},"638":{"position":[[195,8]]},"656":{"position":[[202,8]]},"661":{"position":[[1497,7]]},"678":{"position":[[218,8]]},"681":{"position":[[239,7]]},"685":{"position":[[443,7]]},"688":{"position":[[584,8]]},"691":{"position":[[5,8],[519,8]]},"696":{"position":[[1946,7]]},"697":{"position":[[126,7]]},"701":{"position":[[480,7]]},"703":{"position":[[342,7]]},"710":{"position":[[170,8],[2525,7]]},"728":{"position":[[119,7]]},"730":{"position":[[8,8]]},"739":{"position":[[29,7]]},"741":{"position":[[9,7]]},"742":{"position":[[17,7]]},"757":{"position":[[46,8]]},"774":{"position":[[338,7]]},"796":{"position":[[260,8]]},"798":{"position":[[327,7]]},"799":{"position":[[339,7]]},"820":{"position":[[223,7]]},"821":{"position":[[413,7],[688,7]]},"824":{"position":[[288,7]]},"825":{"position":[[1055,7],[1142,7]]},"826":{"position":[[280,7]]},"832":{"position":[[28,7],[277,7]]},"837":{"position":[[342,7]]},"838":{"position":[[3253,7]]},"842":{"position":[[97,7]]},"866":{"position":[[691,7]]},"872":{"position":[[1437,7]]},"873":{"position":[[34,7]]},"885":{"position":[[122,7],[2672,8],[2726,7]]},"888":{"position":[[128,7],[910,7]]},"889":{"position":[[67,7],[646,7],[1100,8]]},"890":{"position":[[989,7]]},"898":{"position":[[791,7]]},"904":{"position":[[178,7],[1135,7]]},"906":{"position":[[534,7],[756,7]]},"913":{"position":[[169,7]]},"962":{"position":[[461,7]]},"964":{"position":[[212,7]]},"968":{"position":[[321,7]]},"981":{"position":[[990,7]]},"984":{"position":[[382,7]]},"986":{"position":[[681,7]]},"988":{"position":[[3640,7]]},"990":{"position":[[1029,7]]},"995":{"position":[[1308,7]]},"1009":{"position":[[38,8]]},"1022":{"position":[[135,7]]},"1033":{"position":[[408,7]]},"1048":{"position":[[94,7],[397,8]]},"1065":{"position":[[11,8],[378,7],[952,7],[1229,7]]},"1069":{"position":[[438,8]]},"1072":{"position":[[2619,8]]},"1074":{"position":[[9,7]]},"1084":{"position":[[294,8]]},"1085":{"position":[[1204,8]]},"1095":{"position":[[124,7]]},"1104":{"position":[[656,7]]},"1105":{"position":[[429,7]]},"1106":{"position":[[134,7],[345,7]]},"1115":{"position":[[173,7]]},"1118":{"position":[[202,7]]},"1121":{"position":[[170,7]]},"1124":{"position":[[396,7],[2010,7]]},"1132":{"position":[[741,7]]},"1135":{"position":[[153,7]]},"1139":{"position":[[84,7]]},"1145":{"position":[[80,7]]},"1149":{"position":[[503,7]]},"1150":{"position":[[410,7]]},"1165":{"position":[[143,7]]},"1191":{"position":[[259,7]]},"1198":{"position":[[1020,7],[1357,7]]},"1213":{"position":[[434,7]]},"1222":{"position":[[1114,7]]},"1236":{"position":[[61,8]]},"1252":{"position":[[91,7]]},"1268":{"position":[[298,7]]},"1271":{"position":[[997,8],[1652,8]]},"1272":{"position":[[422,7]]},"1274":{"position":[[457,7]]},"1279":{"position":[[844,7]]},"1296":{"position":[[241,7]]},"1300":{"position":[[358,7],[556,7]]},"1318":{"position":[[152,7]]}},"keywords":{}}],["example.if",{"_index":4586,"title":{},"content":{"776":{"position":[[27,10]]}},"keywords":{}}],["example.txt",{"_index":6201,"title":{},"content":{"1208":{"position":[[894,14]]}},"keywords":{}}],["exampledb",{"_index":1613,"title":{},"content":{"266":{"position":[[689,12]]},"662":{"position":[[2151,12]]},"710":{"position":[[1720,12]]},"772":{"position":[[795,12]]},"773":{"position":[[585,12]]},"774":{"position":[[687,12]]},"838":{"position":[[2322,12]]},"1125":{"position":[[312,12]]},"1130":{"position":[[185,12]]},"1134":{"position":[[162,12]]},"1138":{"position":[[306,12]]},"1139":{"position":[[561,12]]},"1140":{"position":[[620,12]]},"1144":{"position":[[210,12]]},"1145":{"position":[[550,12]]},"1146":{"position":[[255,12]]},"1158":{"position":[[218,12]]},"1159":{"position":[[404,12]]},"1168":{"position":[[166,12]]},"1172":{"position":[[331,12]]},"1189":{"position":[[429,12]]},"1201":{"position":[[206,12]]},"1271":{"position":[[1595,12]]},"1274":{"position":[[346,12]]},"1275":{"position":[[357,12]]},"1276":{"position":[[959,12]]},"1277":{"position":[[406,12]]},"1278":{"position":[[483,12],[935,12]]},"1279":{"position":[[733,12]]},"1280":{"position":[[468,12]]}},"keywords":{}}],["examples"",{"_index":1500,"title":{},"content":{"244":{"position":[[781,14]]}},"keywords":{}}],["examplether",{"_index":4013,"title":{},"content":{"712":{"position":[[104,12]]}},"keywords":{}}],["exce",{"_index":1794,"title":{"303":{"position":[[10,6]]}},"content":{"302":{"position":[[48,7]]}},"keywords":{}}],["exceed",{"_index":1793,"title":{},"content":{"301":{"position":[[731,9]]},"302":{"position":[[925,9]]},"932":{"position":[[291,9]]}},"keywords":{}}],["excel",{"_index":961,"title":{"200":{"position":[[15,9]]}},"content":{"71":{"position":[[12,9]]},"98":{"position":[[38,5]]},"102":{"position":[[23,9]]},"105":{"position":[[100,9]]},"110":{"position":[[6,6]]},"174":{"position":[[771,9]]},"179":{"position":[[212,9]]},"225":{"position":[[21,5]]},"229":{"position":[[186,9]]},"232":{"position":[[94,9]]},"262":{"position":[[128,5]]},"265":{"position":[[845,9]]},"267":{"position":[[236,9]]},"280":{"position":[[115,6]]},"283":{"position":[[8,9]]},"289":{"position":[[630,6]]},"292":{"position":[[54,6]]},"354":{"position":[[464,6]]},"362":{"position":[[673,5]]},"378":{"position":[[191,6]]},"426":{"position":[[23,6]]},"429":{"position":[[171,6]]},"441":{"position":[[146,9]]},"445":{"position":[[895,9]]},"491":{"position":[[1780,6]]},"530":{"position":[[493,5]]},"540":{"position":[[6,6]]},"559":{"position":[[1577,10]]},"600":{"position":[[6,6]]},"624":{"position":[[641,5]]}},"keywords":{}}],["except",{"_index":1194,"title":{},"content":{"170":{"position":[[18,11]]},"198":{"position":[[437,11]]},"267":{"position":[[1237,11]]},"271":{"position":[[143,11]]},"290":{"position":[[182,11]]},"302":{"position":[[142,10]]},"353":{"position":[[45,11]]},"447":{"position":[[484,11]]},"886":{"position":[[4554,6]]}},"keywords":{}}],["excess",{"_index":2551,"title":{},"content":{"408":{"position":[[2740,9]]},"430":{"position":[[707,9]]}},"keywords":{}}],["exchang",{"_index":1590,"title":{},"content":{"261":{"position":[[1195,9]]},"289":{"position":[[1925,8]]},"375":{"position":[[666,8]]},"611":{"position":[[172,8]]},"614":{"position":[[358,8]]},"621":{"position":[[168,8]]},"901":{"position":[[112,8]]}},"keywords":{}}],["excit",{"_index":2641,"title":{},"content":{"411":{"position":[[5428,7]]}},"keywords":{}}],["exclam",{"_index":6217,"title":{},"content":{"1208":{"position":[[1483,11]]}},"keywords":{}}],["exclud",{"_index":4646,"title":{},"content":{"796":{"position":[[1288,7]]},"1266":{"position":[[760,8]]}},"keywords":{}}],["exclus",{"_index":3581,"title":{},"content":{"612":{"position":[[134,11]]}},"keywords":{}}],["exec",{"_index":805,"title":{"1057":{"position":[[0,7]]}},"content":{"52":{"position":[[440,10],[526,10],[673,10]]},"276":{"position":[[464,10]]},"398":{"position":[[1175,10],[1336,9],[2505,10]]},"539":{"position":[[440,10],[526,10],[673,10]]},"599":{"position":[[467,10],[553,10],[704,10]]},"662":{"position":[[2736,10]]},"710":{"position":[[2043,10]]},"772":{"position":[[1063,10]]},"799":{"position":[[603,12]]},"838":{"position":[[2950,10]]},"949":{"position":[[184,8]]},"1022":{"position":[[1073,10]]},"1067":{"position":[[2024,10]]},"1158":{"position":[[733,10]]}},"keywords":{}}],["exec().then(doc",{"_index":5358,"title":{},"content":{"950":{"position":[[305,18],[443,16]]}},"keywords":{}}],["exec().then(docu",{"_index":5764,"title":{},"content":{"1065":{"position":[[267,22],[846,22],[1135,22],[1357,22],[1474,22]]}},"keywords":{}}],["exec(tru",{"_index":3357,"title":{},"content":{"555":{"position":[[534,14]]},"556":{"position":[[876,14]]},"1057":{"position":[[243,11],[493,12]]}},"keywords":{}}],["execut",{"_index":1049,"title":{},"content":{"108":{"position":[[168,9]]},"138":{"position":[[152,10]]},"166":{"position":[[168,10]]},"173":{"position":[[2557,8]]},"174":{"position":[[1700,10]]},"220":{"position":[[159,8]]},"254":{"position":[[53,7]]},"283":{"position":[[132,10]]},"408":{"position":[[3565,9]]},"454":{"position":[[75,9]]},"479":{"position":[[481,9]]},"723":{"position":[[504,7],[703,8]]},"801":{"position":[[171,8]]},"802":{"position":[[288,7],[529,9]]},"816":{"position":[[331,8]]},"829":{"position":[[2674,8],[2760,9]]},"898":{"position":[[1333,7]]},"949":{"position":[[196,7]]},"1072":{"position":[[1344,7]]},"1316":{"position":[[1753,7]]}},"keywords":{}}],["exhibit",{"_index":1758,"title":{},"content":{"299":{"position":[[1063,7]]}},"keywords":{}}],["exist",{"_index":1169,"title":{"857":{"position":[[38,8]]}},"content":{"155":{"position":[[150,8]]},"230":{"position":[[205,8]]},"249":{"position":[[147,8]]},"260":{"position":[[62,8],[149,6]]},"266":{"position":[[770,6]]},"354":{"position":[[975,8]]},"361":{"position":[[71,6]]},"396":{"position":[[17,5]]},"402":{"position":[[1976,5]]},"411":{"position":[[3482,8]]},"412":{"position":[[1426,8],[1916,8],[2546,8]]},"445":{"position":[[1855,8]]},"458":{"position":[[249,5]]},"481":{"position":[[236,5]]},"535":{"position":[[1202,6]]},"616":{"position":[[282,8]]},"632":{"position":[[872,8]]},"653":{"position":[[615,8]]},"683":{"position":[[630,9],[663,7],[806,5],[826,8],[884,6],[963,7]]},"686":{"position":[[474,8]]},"698":{"position":[[2335,8]]},"719":{"position":[[111,8]]},"749":{"position":[[5038,7],[5635,7],[6758,8],[9293,5],[9866,7],[9980,7],[10832,5],[14314,6],[22072,6]]},"754":{"position":[[485,8]]},"759":{"position":[[1037,5]]},"774":{"position":[[1036,6]]},"806":{"position":[[234,8]]},"848":{"position":[[362,6]]},"857":{"position":[[184,8]]},"875":{"position":[[7164,5]]},"885":{"position":[[32,5]]},"887":{"position":[[22,8],[499,8]]},"898":{"position":[[854,6]]},"919":{"position":[[78,6]]},"939":{"position":[[11,8]]},"943":{"position":[[148,6],[231,8],[347,8]]},"946":{"position":[[37,5]]},"951":{"position":[[255,5]]},"958":{"position":[[586,5]]},"986":{"position":[[463,6]]},"989":{"position":[[418,5]]},"995":{"position":[[1587,6]]},"1014":{"position":[[110,7]]},"1015":{"position":[[64,7],[90,7]]},"1016":{"position":[[103,7]]},"1017":{"position":[[82,7]]},"1057":{"position":[[279,6]]},"1065":{"position":[[1010,8],[1110,8]]},"1108":{"position":[[94,5]]},"1159":{"position":[[33,6]]},"1164":{"position":[[711,8]]},"1222":{"position":[[869,8]]},"1251":{"position":[[252,5]]},"1272":{"position":[[393,8]]},"1298":{"position":[[284,7]]},"1300":{"position":[[129,6],[1097,6]]},"1304":{"position":[[1967,8]]},"1309":{"position":[[110,8]]}},"keywords":{}}],["exit",{"_index":459,"title":{},"content":{"28":{"position":[[380,6],[452,5]]},"30":{"position":[[187,6]]},"773":{"position":[[303,6]]},"1030":{"position":[[34,4]]},"1164":{"position":[[1022,5]]},"1192":{"position":[[367,6]]},"1300":{"position":[[849,6]]}},"keywords":{}}],["expand",{"_index":2125,"title":{},"content":{"369":{"position":[[579,8]]},"408":{"position":[[2204,8]]},"480":{"position":[[105,6]]},"639":{"position":[[16,6]]},"1006":{"position":[[73,6]]}},"keywords":{}}],["expect",{"_index":2301,"title":{"409":{"position":[[13,6]]}},"content":{"394":{"position":[[164,9]]},"409":{"position":[[319,6]]},"410":{"position":[[415,6],[1492,6]]},"421":{"position":[[40,8],[1031,6],[1243,12]]},"497":{"position":[[137,8]]},"590":{"position":[[741,8]]},"622":{"position":[[567,8]]},"660":{"position":[[349,6]]},"668":{"position":[[420,8]]},"689":{"position":[[365,9]]},"749":{"position":[[4145,8]]},"880":{"position":[[229,7]]},"944":{"position":[[429,6]]},"1065":{"position":[[1668,7]]},"1188":{"position":[[194,7]]},"1313":{"position":[[611,7]]}},"keywords":{}}],["expected.do",{"_index":3832,"title":{},"content":{"668":{"position":[[154,11]]}},"keywords":{}}],["expedit",{"_index":3240,"title":{},"content":{"507":{"position":[[116,8]]},"801":{"position":[[664,8]]}},"keywords":{}}],["expens",{"_index":500,"title":{},"content":{"31":{"position":[[282,9]]},"204":{"position":[[306,8]]},"262":{"position":[[217,10]]},"376":{"position":[[305,9]]},"412":{"position":[[4834,10]]},"490":{"position":[[571,9]]},"711":{"position":[[2176,9]]},"902":{"position":[[886,9]]},"1052":{"position":[[125,9]]},"1108":{"position":[[730,10]]},"1309":{"position":[[760,10]]}},"keywords":{}}],["experi",{"_index":893,"title":{"201":{"position":[[26,11]]},"410":{"position":[[5,10]]},"411":{"position":[[10,10]]},"486":{"position":[[12,10]]}},"content":{"61":{"position":[[513,10]]},"65":{"position":[[417,11],[1933,12]]},"66":{"position":[[283,10]]},"69":{"position":[[165,11]]},"77":{"position":[[155,10]]},"87":{"position":[[241,11]]},"90":{"position":[[327,11]]},"101":{"position":[[272,11]]},"109":{"position":[[255,12]]},"114":{"position":[[587,12]]},"117":{"position":[[306,11]]},"125":{"position":[[306,11]]},"136":{"position":[[355,11]]},"148":{"position":[[291,11]]},"152":{"position":[[338,10]]},"156":{"position":[[326,11]]},"160":{"position":[[234,10]]},"174":{"position":[[893,12],[2314,10]]},"175":{"position":[[595,12]]},"178":{"position":[[410,10]]},"191":{"position":[[301,11]]},"198":{"position":[[454,11]]},"205":{"position":[[423,11]]},"216":{"position":[[217,12]]},"217":{"position":[[275,11]]},"221":{"position":[[305,11]]},"263":{"position":[[449,10]]},"265":{"position":[[492,12]]},"267":{"position":[[463,11]]},"269":{"position":[[350,10]]},"277":{"position":[[230,11]]},"280":{"position":[[430,11]]},"281":{"position":[[104,11]]},"283":{"position":[[445,10]]},"292":{"position":[[432,11]]},"304":{"position":[[421,10]]},"312":{"position":[[222,11]]},"346":{"position":[[712,10]]},"375":{"position":[[951,10]]},"379":{"position":[[328,11]]},"385":{"position":[[353,11]]},"407":{"position":[[717,10]]},"408":{"position":[[2086,10],[5187,12]]},"411":{"position":[[1830,11]]},"412":{"position":[[15158,10]]},"415":{"position":[[441,10]]},"421":{"position":[[720,11],[1170,10]]},"445":{"position":[[1210,11],[1543,11],[2509,10]]},"446":{"position":[[1073,11]]},"447":{"position":[[501,11]]},"474":{"position":[[305,11]]},"483":{"position":[[836,10],[1291,11]]},"485":{"position":[[68,10]]},"491":{"position":[[954,10]]},"498":{"position":[[715,10]]},"500":{"position":[[274,10]]},"510":{"position":[[111,12],[754,11]]},"517":{"position":[[385,11]]},"519":{"position":[[282,10]]},"521":{"position":[[522,10]]},"530":{"position":[[128,11]]},"534":{"position":[[108,11]]},"582":{"position":[[748,11]]},"589":{"position":[[213,11]]},"594":{"position":[[106,11]]},"641":{"position":[[65,11]]},"643":{"position":[[346,11]]},"644":{"position":[[715,10]]},"723":{"position":[[2783,10]]},"801":{"position":[[581,11]]},"913":{"position":[[335,12]]},"1009":{"position":[[705,10]]}},"keywords":{}}],["experience.limit",{"_index":2882,"title":{},"content":{"427":{"position":[[388,18]]}},"keywords":{}}],["experiences.synchron",{"_index":1917,"title":{},"content":{"321":{"position":[[119,23]]}},"keywords":{}}],["experiment",{"_index":2572,"title":{},"content":{"408":{"position":[[5266,12]]},"411":{"position":[[5183,12]]},"458":{"position":[[892,12]]},"624":{"position":[[1139,12]]},"863":{"position":[[822,12],[929,12]]}},"keywords":{}}],["expir",{"_index":1854,"title":{},"content":{"303":{"position":[[1402,6]]}},"keywords":{}}],["explain",{"_index":6527,"title":{},"content":{"1315":{"position":[[156,8]]}},"keywords":{}}],["explicit",{"_index":1407,"title":{"1298":{"position":[[0,8]]}},"content":{"226":{"position":[[166,8]]},"304":{"position":[[13,8]]},"351":{"position":[[68,8]]},"515":{"position":[[309,8]]},"556":{"position":[[1328,8]]},"828":{"position":[[381,8]]}},"keywords":{}}],["explicitli",{"_index":1983,"title":{},"content":{"347":{"position":[[582,10]]},"362":{"position":[[1653,10]]},"451":{"position":[[814,10]]},"502":{"position":[[65,10]]},"654":{"position":[[259,10]]},"797":{"position":[[189,10],[299,10]]},"800":{"position":[[766,10]]},"966":{"position":[[798,10]]},"1298":{"position":[[4,10],[194,10]]}},"keywords":{}}],["explor",{"_index":872,"title":{"425":{"position":[[0,9]]},"504":{"position":[[0,9]]}},"content":{"59":{"position":[[36,8]]},"61":{"position":[[195,7]]},"65":{"position":[[16,8]]},"84":{"position":[[4,7]]},"114":{"position":[[4,7]]},"127":{"position":[[71,7]]},"132":{"position":[[178,7]]},"149":{"position":[[4,7]]},"173":{"position":[[211,7]]},"174":{"position":[[121,7]]},"175":{"position":[[12,7]]},"180":{"position":[[72,7]]},"187":{"position":[[57,7]]},"190":{"position":[[124,7]]},"193":{"position":[[111,7]]},"229":{"position":[[163,7]]},"241":{"position":[[12,7]]},"263":{"position":[[238,10]]},"284":{"position":[[118,7]]},"287":{"position":[[288,7]]},"306":{"position":[[218,7]]},"318":{"position":[[366,7]]},"347":{"position":[[4,7]]},"362":{"position":[[1084,7]]},"373":{"position":[[12,7]]},"432":{"position":[[100,7]]},"483":{"position":[[558,7]]},"498":{"position":[[330,7]]},"511":{"position":[[4,7]]},"531":{"position":[[4,7]]},"544":{"position":[[347,8]]},"546":{"position":[[328,8]]},"567":{"position":[[201,7]]},"591":{"position":[[4,7],[601,7]]},"602":{"position":[[11,9]]},"606":{"position":[[318,8]]},"1141":{"position":[[297,9]]},"1151":{"position":[[561,7]]},"1178":{"position":[[560,7]]},"1207":{"position":[[153,8]]},"1215":{"position":[[246,8]]}},"keywords":{}}],["expo",{"_index":294,"title":{"1278":{"position":[[11,4]]}},"content":{"17":{"position":[[342,4]]},"793":{"position":[[324,5]]},"1214":{"position":[[714,5]]},"1278":{"position":[[13,4],[84,4],[177,4],[416,5],[636,4],[868,5]]}},"keywords":{}}],["expo/react",{"_index":4147,"title":{},"content":{"749":{"position":[[1150,10]]},"917":{"position":[[394,10]]}},"keywords":{}}],["export",{"_index":158,"title":{},"content":{"11":{"position":[[511,6]]},"51":{"position":[[628,6]]},"55":{"position":[[350,6]]},"392":{"position":[[4022,6]]},"412":{"position":[[4481,6]]},"494":{"position":[[425,6]]},"559":{"position":[[780,6]]},"562":{"position":[[1575,6]]},"579":{"position":[[286,6]]},"598":{"position":[[386,6]]},"808":{"position":[[111,6],[486,6]]},"825":{"position":[[888,6]]},"829":{"position":[[1848,6]]},"837":{"position":[[1890,6]]},"898":{"position":[[2297,6],[3028,6]]},"952":{"position":[[36,6]]},"971":{"position":[[36,6]]},"1309":{"position":[[484,6]]}},"keywords":{}}],["exportjson",{"_index":5365,"title":{"952":{"position":[[0,13]]},"971":{"position":[[0,13]]}},"content":{"952":{"position":[[90,12]]},"971":{"position":[[202,12]]}},"keywords":{}}],["expos",{"_index":1124,"title":{},"content":{"140":{"position":[[6,7]]},"346":{"position":[[71,6]]},"494":{"position":[[118,7]]},"563":{"position":[[16,7]]},"708":{"position":[[310,7]]},"714":{"position":[[686,6]]},"730":{"position":[[199,8]]},"828":{"position":[[226,8]]},"831":{"position":[[169,6]]},"871":{"position":[[253,7]]},"897":{"position":[[376,7]]},"1102":{"position":[[19,7],[1084,7]]},"1207":{"position":[[537,7]]},"1214":{"position":[[500,6]]},"1228":{"position":[[225,7]]},"1231":{"position":[[830,6]]}},"keywords":{}}],["exposeipcmainrxstorag",{"_index":3924,"title":{},"content":{"693":{"position":[[325,22],[721,22],[889,24]]},"1214":{"position":[[544,24]]}},"keywords":{}}],["exposerxstorageremot",{"_index":6249,"title":{},"content":{"1218":{"position":[[703,21],[763,23]]}},"keywords":{}}],["exposeworkerrxstorag",{"_index":6237,"title":{},"content":{"1212":{"position":[[195,21],[374,21],[478,23]]},"1225":{"position":[[137,21],[277,23]]},"1228":{"position":[[177,21]]},"1231":{"position":[[450,21],[866,23]]},"1263":{"position":[[23,21],[171,23]]},"1268":{"position":[[578,21],[726,23]]}},"keywords":{}}],["express",{"_index":3592,"title":{},"content":{"612":{"position":[[1734,7],[1755,7],[1768,10],[1791,10]]},"689":{"position":[[249,7]]},"872":{"position":[[3229,9]]},"875":{"position":[[638,7],[691,7],[844,7],[857,10],[1122,10]]},"1072":{"position":[[2564,11]]},"1097":{"position":[[409,7],[489,7],[672,9]]},"1098":{"position":[[85,8]]},"1099":{"position":[[81,8],[143,8]]}},"keywords":{}}],["extend",{"_index":1747,"title":{"313":{"position":[[21,7]]}},"content":{"299":{"position":[[390,8]]},"313":{"position":[[132,6]]},"412":{"position":[[658,8]]},"419":{"position":[[1053,8]]},"433":{"position":[[389,6]]},"502":{"position":[[1153,7]]},"518":{"position":[[6,7]]},"544":{"position":[[41,6]]},"604":{"position":[[41,6]]},"806":{"position":[[260,6]]},"846":{"position":[[1464,7]]},"890":{"position":[[160,7]]}},"keywords":{}}],["extens",{"_index":947,"title":{"439":{"position":[[24,11]]}},"content":{"66":{"position":[[548,9]]},"357":{"position":[[144,10],[160,9]]},"362":{"position":[[411,10]]},"373":{"position":[[424,9]]},"411":{"position":[[1198,9]]},"439":{"position":[[15,10],[136,9],[273,9],[322,11]]},"445":{"position":[[195,10]]},"494":{"position":[[103,9]]},"802":{"position":[[271,10]]},"898":{"position":[[837,9],[880,11]]},"1266":{"position":[[860,11]]}},"keywords":{}}],["extensions.moddatetime('_modifi",{"_index":5207,"title":{},"content":{"898":{"position":[[1350,36]]}},"keywords":{}}],["extern",{"_index":1385,"title":{"1033":{"position":[[28,8]]}},"content":{"212":{"position":[[350,8]]},"723":{"position":[[560,8]]},"1156":{"position":[[46,8]]}},"keywords":{}}],["extra",{"_index":1384,"title":{"478":{"position":[[44,5]]}},"content":{"212":{"position":[[333,5]]},"251":{"position":[[137,5]]},"291":{"position":[[55,5]]},"303":{"position":[[1344,5]]},"309":{"position":[[345,5]]},"408":{"position":[[3978,5]]},"420":{"position":[[846,5]]},"421":{"position":[[1129,5]]},"559":{"position":[[920,5]]},"802":{"position":[[160,5],[323,5]]},"1150":{"position":[[648,5]]}},"keywords":{}}],["extract",{"_index":2220,"title":{},"content":{"391":{"position":[[521,12]]},"412":{"position":[[13182,10],[13291,10],[13384,10]]},"482":{"position":[[1096,10]]}},"keywords":{}}],["extractcom",{"_index":6323,"title":{},"content":{"1266":{"position":[[1055,16]]}},"keywords":{}}],["extrem",{"_index":1826,"title":{},"content":{"303":{"position":[[389,9]]},"304":{"position":[[154,9]]},"305":{"position":[[521,7]]},"411":{"position":[[5808,7]]},"412":{"position":[[14573,9]]},"1058":{"position":[[80,9]]},"1292":{"position":[[444,9]]}},"keywords":{}}],["ey",{"_index":2150,"title":{},"content":{"377":{"position":[[398,5]]}},"keywords":{}}],["eyjhbgcioi",{"_index":5216,"title":{},"content":{"898":{"position":[[3100,15]]}},"keywords":{}}],["f",{"_index":3996,"title":{},"content":{"711":{"position":[[1014,1]]}},"keywords":{}}],["f5",{"_index":2606,"title":{},"content":{"410":{"position":[[2203,2]]},"411":{"position":[[4807,2]]},"458":{"position":[[407,2]]}},"keywords":{}}],["face",{"_index":2102,"title":{"1090":{"position":[[37,6]]}},"content":{"362":{"position":[[998,6]]},"399":{"position":[[125,4]]},"481":{"position":[[558,6]]},"624":{"position":[[888,5]]}},"keywords":{}}],["facil",{"_index":2748,"title":{},"content":{"412":{"position":[[11773,12]]}},"keywords":{}}],["facilit",{"_index":987,"title":{},"content":{"82":{"position":[[30,11]]},"173":{"position":[[150,10]]},"174":{"position":[[1126,11]]},"223":{"position":[[267,10]]},"288":{"position":[[248,10]]},"289":{"position":[[936,12]]},"365":{"position":[[1317,12]]},"367":{"position":[[330,10]]},"381":{"position":[[167,12]]},"432":{"position":[[436,11]]},"459":{"position":[[167,10]]},"504":{"position":[[594,10],[929,11],[1331,12]]},"517":{"position":[[179,10]]},"525":{"position":[[440,10]]},"529":{"position":[[123,11]]},"611":{"position":[[240,12]]}},"keywords":{}}],["fact",{"_index":2610,"title":{},"content":{"411":{"position":[[823,4]]},"569":{"position":[[1149,5]]},"703":{"position":[[107,4]]}},"keywords":{}}],["factor",{"_index":2431,"title":{},"content":{"399":{"position":[[462,6]]},"407":{"position":[[865,8]]},"408":{"position":[[4294,6]]},"412":{"position":[[10568,7]]},"696":{"position":[[1028,8]]},"780":{"position":[[51,6],[186,7]]},"1090":{"position":[[173,6]]}},"keywords":{}}],["factori",{"_index":828,"title":{"825":{"position":[[20,8]]}},"content":{"55":{"position":[[97,8],[628,7]]},"144":{"position":[[40,9]]},"602":{"position":[[96,9]]},"749":{"position":[[6626,7]]},"825":{"position":[[241,8],[258,7]]},"1118":{"position":[[270,7]]}},"keywords":{}}],["fail",{"_index":1779,"title":{},"content":{"300":{"position":[[712,4]]},"302":{"position":[[230,5]]},"411":{"position":[[5592,4]]},"412":{"position":[[7425,4],[8859,5],[11838,6]]},"487":{"position":[[300,5]]},"495":{"position":[[394,6]]},"497":{"position":[[606,5]]},"749":{"position":[[12305,6]]},"944":{"position":[[389,4]]},"988":{"position":[[900,6]]},"990":{"position":[[39,5],[249,6]]},"1320":{"position":[[409,5]]}},"keywords":{}}],["fail).app",{"_index":3200,"title":{},"content":{"497":{"position":[[165,10]]}},"keywords":{}}],["failur",{"_index":1149,"title":{},"content":{"147":{"position":[[152,9]]},"497":{"position":[[314,7],[670,8]]},"944":{"position":[[444,7]]}},"keywords":{}}],["fairli",{"_index":3441,"title":{},"content":{"566":{"position":[[311,6]]}},"keywords":{}}],["fake",{"_index":6048,"title":{},"content":{"1139":{"position":[[165,4],[381,4]]},"1145":{"position":[[161,4],[370,4]]}},"keywords":{}}],["fakeidbkeyrang",{"_index":6051,"title":{},"content":{"1139":{"position":[[458,15],[646,15]]},"1145":{"position":[[447,15],[631,15]]}},"keywords":{}}],["fakeindexeddb",{"_index":6049,"title":{},"content":{"1139":{"position":[[409,13],[618,14]]},"1145":{"position":[[398,13],[603,14]]}},"keywords":{}}],["fall",{"_index":1688,"title":{},"content":{"291":{"position":[[203,5]]},"396":{"position":[[182,4]]}},"keywords":{}}],["fallback",{"_index":494,"title":{},"content":{"30":{"position":[[333,9]]},"302":{"position":[[583,8]]},"415":{"position":[[379,8]]},"611":{"position":[[1388,9]]},"623":{"position":[[585,8]]},"624":{"position":[[1523,8]]},"1176":{"position":[[362,9]]}},"keywords":{}}],["fallen",{"_index":2910,"title":{},"content":{"434":{"position":[[66,6]]}},"keywords":{}}],["fals",{"_index":1257,"title":{"1230":{"position":[[19,6]]}},"content":{"188":{"position":[[1164,5]]},"276":{"position":[[454,5]]},"314":{"position":[[565,5]]},"480":{"position":[[749,5]]},"522":{"position":[[704,6]]},"562":{"position":[[254,5]]},"647":{"position":[[181,6],[228,6]]},"649":{"position":[[122,6],[455,5]]},"683":{"position":[[835,5]]},"746":{"position":[[568,6]]},"752":{"position":[[448,6],[709,6]]},"759":{"position":[[446,5],[771,6],[842,5]]},"760":{"position":[[767,6]]},"767":{"position":[[424,7],[606,7],[715,7],[807,7],[1015,7]]},"768":{"position":[[406,7],[608,7],[725,7],[813,7],[1017,7]]},"769":{"position":[[359,7],[565,7],[686,7],[778,7],[986,7]]},"838":{"position":[[2350,6],[2378,5]]},"846":{"position":[[353,5]]},"857":{"position":[[147,5],[397,6]]},"885":{"position":[[2110,6],[2293,6]]},"886":{"position":[[4267,6]]},"898":{"position":[[1121,5]]},"904":{"position":[[1019,5],[1220,6]]},"905":{"position":[[191,5]]},"907":{"position":[[232,5]]},"957":{"position":[[74,5]]},"960":{"position":[[599,6]]},"964":{"position":[[384,5]]},"978":{"position":[[72,5]]},"986":{"position":[[1150,5]]},"988":{"position":[[692,5],[1364,6],[1493,6],[5447,6],[5807,6]]},"989":{"position":[[162,5],[312,5]]},"993":{"position":[[525,5],[664,5]]},"1049":{"position":[[191,5]]},"1050":{"position":[[85,5]]},"1051":{"position":[[567,6]]},"1053":{"position":[[72,5]]},"1063":{"position":[[312,5]]},"1065":{"position":[[1119,5]]},"1070":{"position":[[69,5]]},"1084":{"position":[[415,6]]},"1085":{"position":[[1664,5],[1733,5]]},"1106":{"position":[[499,5],[613,6]]},"1126":{"position":[[108,5],[787,5],[924,5]]},"1130":{"position":[[391,5]]},"1158":{"position":[[723,5]]},"1174":{"position":[[762,5]]},"1176":{"position":[[378,5],[591,5]]},"1177":{"position":[[414,6]]},"1230":{"position":[[123,5]]},"1266":{"position":[[1042,6],[1072,6]]},"1277":{"position":[[434,6],[471,5]]},"1278":{"position":[[511,6],[963,6]]},"1282":{"position":[[1080,5],[1232,5]]},"1294":{"position":[[996,6],[1121,6],[1439,5]]},"1296":{"position":[[1415,5],[1580,5]]},"1311":{"position":[[1384,5]]},"1316":{"position":[[905,5]]}},"keywords":{}}],["famili",{"_index":4688,"title":{},"content":{"812":{"position":[[143,7]]}},"keywords":{}}],["familiar",{"_index":1014,"title":{},"content":{"94":{"position":[[235,8]]},"269":{"position":[[417,11]]},"387":{"position":[[69,8]]}},"keywords":{}}],["familynam",{"_index":5837,"title":{},"content":{"1080":{"position":[[417,11]]}},"keywords":{}}],["faq",{"_index":3769,"title":{"656":{"position":[[0,4]]},"958":{"position":[[0,4]]},"1010":{"position":[[0,4]]},"1072":{"position":[[0,4]]},"1085":{"position":[[0,4]]},"1112":{"position":[[0,4]]},"1233":{"position":[[0,4]]}},"content":{},"keywords":{}}],["far",{"_index":1323,"title":{},"content":{"205":{"position":[[75,3]]},"207":{"position":[[346,3]]},"299":{"position":[[1650,3]]},"408":{"position":[[3125,3]]},"634":{"position":[[594,3]]},"903":{"position":[[680,3]]}},"keywords":{}}],["farm",{"_index":2839,"title":{},"content":{"420":{"position":[[1242,7],[1300,4]]}},"keywords":{}}],["fast",{"_index":1030,"title":{},"content":{"101":{"position":[[171,4]]},"189":{"position":[[221,4]]},"227":{"position":[[357,5]]},"254":{"position":[[485,4]]},"287":{"position":[[417,4]]},"289":{"position":[[1519,4]]},"305":{"position":[[579,4]]},"336":{"position":[[140,4]]},"354":{"position":[[1599,4]]},"365":{"position":[[267,4]]},"369":{"position":[[266,4]]},"375":{"position":[[970,4]]},"388":{"position":[[339,5]]},"396":{"position":[[615,4],[1701,5]]},"400":{"position":[[605,4],[653,4]]},"408":{"position":[[1718,5]]},"411":{"position":[[5489,5]]},"412":{"position":[[9715,5],[10268,4]]},"429":{"position":[[92,4]]},"459":{"position":[[178,4]]},"460":{"position":[[166,4],[1107,4]]},"463":{"position":[[181,5]]},"465":{"position":[[359,4]]},"467":{"position":[[340,4],[413,5]]},"468":{"position":[[24,4],[450,4]]},"500":{"position":[[534,4]]},"622":{"position":[[158,4]]},"703":{"position":[[1171,4],[1227,4]]},"723":{"position":[[1877,4]]},"773":{"position":[[194,4]]},"800":{"position":[[279,4]]},"838":{"position":[[3118,5]]},"839":{"position":[[227,5]]},"841":{"position":[[1034,4],[1049,4]]},"1065":{"position":[[23,4]]},"1071":{"position":[[326,4]]},"1132":{"position":[[219,4]]},"1156":{"position":[[209,4]]},"1167":{"position":[[8,5]]},"1192":{"position":[[398,4]]},"1238":{"position":[[128,5]]},"1241":{"position":[[97,4]]},"1292":{"position":[[454,4]]},"1294":{"position":[[364,4]]},"1300":{"position":[[329,4]]},"1316":{"position":[[3587,4]]},"1321":{"position":[[157,4]]}},"keywords":{}}],["fast.wasm",{"_index":3076,"title":{},"content":{"466":{"position":[[375,9]]}},"keywords":{}}],["faster",{"_index":103,"title":{"93":{"position":[[0,6]]}},"content":{"8":{"position":[[55,6]]},"65":{"position":[[742,6],[925,6],[1266,6]]},"87":{"position":[[216,6]]},"92":{"position":[[188,6]]},"93":{"position":[[194,6]]},"138":{"position":[[120,6]]},"166":{"position":[[155,6]]},"173":{"position":[[821,6]]},"205":{"position":[[155,6]]},"216":{"position":[[185,6]]},"220":{"position":[[198,6]]},"227":{"position":[[301,6]]},"236":{"position":[[212,6]]},"265":{"position":[[121,6],[236,6]]},"291":{"position":[[505,6]]},"398":{"position":[[416,6]]},"400":{"position":[[722,6]]},"402":{"position":[[390,6],[453,6],[1272,6],[1708,6],[1876,7]]},"404":{"position":[[235,7],[426,6]]},"408":{"position":[[5097,6]]},"420":{"position":[[1333,7]]},"444":{"position":[[544,6]]},"453":{"position":[[351,7]]},"454":{"position":[[407,6]]},"463":{"position":[[1384,6]]},"464":{"position":[[1144,6]]},"466":{"position":[[341,6],[523,6]]},"468":{"position":[[308,6]]},"470":{"position":[[123,6]]},"473":{"position":[[171,7]]},"538":{"position":[[129,6]]},"556":{"position":[[1166,6]]},"574":{"position":[[472,6]]},"581":{"position":[[301,6]]},"598":{"position":[[129,6]]},"662":{"position":[[799,6]]},"717":{"position":[[246,6],[308,6]]},"718":{"position":[[69,6]]},"772":{"position":[[1210,6]]},"780":{"position":[[612,6]]},"784":{"position":[[859,7]]},"798":{"position":[[188,7]]},"802":{"position":[[778,6]]},"844":{"position":[[1,6]]},"944":{"position":[[79,6]]},"981":{"position":[[880,6],[978,7],[1041,6]]},"1119":{"position":[[5,6]]},"1132":{"position":[[1208,7]]},"1137":{"position":[[197,6]]},"1143":{"position":[[149,6],[565,6]]},"1151":{"position":[[204,6]]},"1164":{"position":[[376,6]]},"1170":{"position":[[17,6],[78,6]]},"1178":{"position":[[203,6]]},"1206":{"position":[[479,6]]},"1209":{"position":[[98,6],[210,6],[291,7],[442,6]]},"1213":{"position":[[196,6]]},"1235":{"position":[[217,6]]},"1286":{"position":[[104,7]]},"1294":{"position":[[123,6]]},"1295":{"position":[[961,6],[1151,6]]},"1299":{"position":[[249,7]]},"1315":{"position":[[790,6]]}},"keywords":{}}],["faster.offlin",{"_index":5432,"title":{},"content":{"981":{"position":[[1176,14]]}},"keywords":{}}],["fastest",{"_index":6044,"title":{},"content":{"1137":{"position":[[163,7]]}},"keywords":{}}],["fastifi",{"_index":5923,"title":{"1098":{"position":[[20,8]]}},"content":{"1098":{"position":[[66,7],[94,7],[308,9]]}},"keywords":{}}],["fault",{"_index":6290,"title":{},"content":{"1247":{"position":[[701,5]]}},"keywords":{}}],["favor",{"_index":2911,"title":{},"content":{"434":{"position":[[80,5]]}},"keywords":{}}],["fe",{"_index":5766,"title":{},"content":{"1065":{"position":[[391,3]]}},"keywords":{}}],["feasibl",{"_index":2525,"title":{},"content":{"408":{"position":[[250,8],[1831,8]]},"412":{"position":[[6790,8]]},"1009":{"position":[[897,9]]}},"keywords":{}}],["featur",{"_index":202,"title":{"57":{"position":[[14,9]]},"137":{"position":[[14,8]]},"166":{"position":[[14,8]]},"193":{"position":[[14,8]]},"252":{"position":[[22,9]]},"323":{"position":[[4,9]]},"341":{"position":[[14,8]]},"361":{"position":[[14,8]]},"387":{"position":[[19,9]]},"456":{"position":[[0,7]]},"505":{"position":[[14,8]]},"526":{"position":[[14,8]]},"544":{"position":[[14,9]]},"583":{"position":[[14,8]]},"604":{"position":[[14,9]]},"637":{"position":[[9,9]]},"870":{"position":[[4,9]]},"896":{"position":[[4,8]]},"1132":{"position":[[0,8]]}},"content":{"14":{"position":[[106,8]]},"22":{"position":[[152,9],[354,7]]},"23":{"position":[[117,8]]},"26":{"position":[[84,9]]},"29":{"position":[[55,9],[227,8]]},"30":{"position":[[272,8]]},"33":{"position":[[222,8],[622,8]]},"34":{"position":[[483,7],[663,8]]},"37":{"position":[[261,8]]},"40":{"position":[[497,9]]},"47":{"position":[[1048,8],[1162,9]]},"61":{"position":[[333,9]]},"65":{"position":[[579,7]]},"71":{"position":[[75,8]]},"83":{"position":[[39,7]]},"90":{"position":[[249,8]]},"106":{"position":[[87,7]]},"109":{"position":[[159,7]]},"114":{"position":[[621,8]]},"116":{"position":[[238,8]]},"118":{"position":[[112,8],[319,8]]},"119":{"position":[[71,9]]},"120":{"position":[[276,8]]},"122":{"position":[[21,8]]},"127":{"position":[[55,9]]},"136":{"position":[[316,8]]},"137":{"position":[[30,8]]},"148":{"position":[[427,8]]},"155":{"position":[[239,8]]},"156":{"position":[[21,8]]},"158":{"position":[[269,8]]},"160":{"position":[[112,7]]},"161":{"position":[[269,9]]},"168":{"position":[[327,9]]},"169":{"position":[[216,7]]},"170":{"position":[[380,8]]},"173":{"position":[[1079,8]]},"174":{"position":[[1935,7]]},"175":{"position":[[615,8]]},"179":{"position":[[187,8]]},"180":{"position":[[89,8]]},"185":{"position":[[135,7]]},"186":{"position":[[377,7]]},"187":{"position":[[33,8]]},"193":{"position":[[33,8],[134,9]]},"197":{"position":[[99,7]]},"198":{"position":[[222,7],[348,8]]},"215":{"position":[[274,7]]},"236":{"position":[[308,7]]},"237":{"position":[[127,7]]},"241":{"position":[[628,8]]},"271":{"position":[[171,8],[270,8]]},"275":{"position":[[24,8]]},"280":{"position":[[21,8]]},"286":{"position":[[273,8]]},"292":{"position":[[255,8]]},"295":{"position":[[29,9],[309,8]]},"311":{"position":[[106,7]]},"313":{"position":[[216,8]]},"316":{"position":[[66,8]]},"317":{"position":[[109,8]]},"347":{"position":[[593,9]]},"357":{"position":[[91,8]]},"362":{"position":[[1005,8],[1664,9]]},"366":{"position":[[100,7]]},"370":{"position":[[259,8]]},"373":{"position":[[639,7]]},"375":{"position":[[399,7]]},"381":{"position":[[12,7]]},"383":{"position":[[576,9]]},"386":{"position":[[337,7]]},"408":{"position":[[5040,8]]},"409":{"position":[[228,9]]},"411":{"position":[[3795,9]]},"412":{"position":[[1244,8]]},"419":{"position":[[435,8]]},"420":{"position":[[1153,9]]},"421":{"position":[[250,8]]},"424":{"position":[[36,7]]},"432":{"position":[[573,7],[846,7],[1107,8]]},"441":{"position":[[452,8]]},"445":{"position":[[956,8]]},"450":{"position":[[609,7]]},"452":{"position":[[770,8]]},"456":{"position":[[78,8]]},"458":{"position":[[777,7]]},"462":{"position":[[29,8]]},"480":{"position":[[1081,8]]},"481":{"position":[[565,9]]},"483":{"position":[[605,8]]},"502":{"position":[[1282,7]]},"506":{"position":[[129,7]]},"508":{"position":[[41,7]]},"510":{"position":[[230,8]]},"513":{"position":[[254,8]]},"515":{"position":[[24,8]]},"518":{"position":[[165,7]]},"520":{"position":[[310,9]]},"526":{"position":[[204,7]]},"529":{"position":[[204,8]]},"530":{"position":[[336,9]]},"535":{"position":[[1055,9],[1065,8]]},"536":{"position":[[113,8]]},"544":{"position":[[27,8]]},"548":{"position":[[413,9]]},"567":{"position":[[585,8]]},"571":{"position":[[610,8]]},"574":{"position":[[739,8]]},"576":{"position":[[250,8]]},"595":{"position":[[1132,9],[1142,8]]},"596":{"position":[[111,8]]},"604":{"position":[[27,8]]},"608":{"position":[[411,9]]},"639":{"position":[[109,7]]},"659":{"position":[[853,8]]},"661":{"position":[[1382,8],[1601,8]]},"667":{"position":[[41,8]]},"668":{"position":[[58,7]]},"686":{"position":[[883,8]]},"710":{"position":[[69,8],[285,8]]},"711":{"position":[[1879,8]]},"723":{"position":[[1851,7]]},"772":{"position":[[353,8]]},"793":{"position":[[987,8]]},"835":{"position":[[952,8]]},"836":{"position":[[1967,9],[2313,8],[2474,7]]},"837":{"position":[[111,7]]},"838":{"position":[[3301,8]]},"839":{"position":[[509,9],[656,9],[771,8],[1123,8]]},"840":{"position":[[171,8],[228,7]]},"856":{"position":[[48,7]]},"860":{"position":[[671,8]]},"913":{"position":[[94,8]]},"1021":{"position":[[56,8]]},"1072":{"position":[[1985,8]]},"1123":{"position":[[570,8]]},"1132":{"position":[[930,7]]},"1135":{"position":[[377,8]]},"1147":{"position":[[63,7]]},"1150":{"position":[[19,7]]},"1198":{"position":[[224,8],[1896,8]]},"1206":{"position":[[654,9]]},"1214":{"position":[[831,8]]},"1280":{"position":[[136,8]]},"1284":{"position":[[271,8]]}},"keywords":{}}],["feature.rich",{"_index":2173,"title":{},"content":{"387":{"position":[[213,12]]}},"keywords":{}}],["features.custom",{"_index":6083,"title":{},"content":{"1149":{"position":[[339,15]]}},"keywords":{}}],["features.rxdb",{"_index":1432,"title":{},"content":{"241":{"position":[[223,13]]},"373":{"position":[[223,13]]}},"keywords":{}}],["features.typescript",{"_index":3297,"title":{},"content":{"535":{"position":[[537,19]]}},"keywords":{}}],["features—lik",{"_index":3149,"title":{},"content":{"483":{"position":[[1025,13]]}},"keywords":{}}],["features—y",{"_index":3412,"title":{},"content":{"559":{"position":[[1677,12]]}},"keywords":{}}],["feature—without",{"_index":1996,"title":{},"content":{"351":{"position":[[310,15]]}},"keywords":{}}],["feed",{"_index":2625,"title":{"476":{"position":[[18,6]]}},"content":{"411":{"position":[[3196,4]]},"421":{"position":[[275,6]]},"497":{"position":[[59,6]]},"612":{"position":[[242,6]]},"624":{"position":[[562,6]]},"841":{"position":[[545,4]]}},"keywords":{}}],["feedback",{"_index":2588,"title":{},"content":{"410":{"position":[[432,9]]},"474":{"position":[[181,9]]},"483":{"position":[[907,9]]},"495":{"position":[[454,8]]},"497":{"position":[[469,8]]},"571":{"position":[[1449,8]]},"873":{"position":[[205,8]]},"899":{"position":[[412,9]]},"1009":{"position":[[696,8]]}},"keywords":{}}],["feedback.data",{"_index":2140,"title":{},"content":{"375":{"position":[[533,13]]}},"keywords":{}}],["feel",{"_index":2624,"title":{},"content":{"411":{"position":[[3099,4]]},"415":{"position":[[126,5]]},"420":{"position":[[716,4]]},"421":{"position":[[381,4],[875,4]]},"489":{"position":[[518,4]]},"491":{"position":[[990,4]]},"495":{"position":[[22,4]]}},"keywords":{}}],["fetch",{"_index":520,"title":{},"content":{"33":{"position":[[448,8]]},"65":{"position":[[341,5]]},"93":{"position":[[107,7]]},"173":{"position":[[1725,8]]},"209":{"position":[[1039,5],[1103,6]]},"217":{"position":[[147,5]]},"255":{"position":[[101,5],[1374,5]]},"369":{"position":[[348,8]]},"394":{"position":[[318,8],[1496,5]]},"395":{"position":[[96,8]]},"398":{"position":[[586,5],[2964,7]]},"400":{"position":[[741,8]]},"402":{"position":[[694,5],[1117,8],[1423,8],[1550,5]]},"410":{"position":[[2209,5]]},"412":{"position":[[2618,8]]},"414":{"position":[[401,5]]},"421":{"position":[[652,8]]},"452":{"position":[[588,8]]},"459":{"position":[[470,5]]},"481":{"position":[[736,5]]},"491":{"position":[[354,7]]},"515":{"position":[[141,8]]},"534":{"position":[[399,7]]},"556":{"position":[[165,5],[1337,8]]},"566":{"position":[[448,5]]},"571":{"position":[[709,5]]},"594":{"position":[[397,7]]},"698":{"position":[[1271,5]]},"711":{"position":[[1699,5]]},"778":{"position":[[59,9]]},"784":{"position":[[217,5]]},"785":{"position":[[710,5]]},"800":{"position":[[678,5]]},"837":{"position":[[760,5]]},"846":{"position":[[434,7],[611,6],[679,7]]},"848":{"position":[[134,7],[553,5],[600,6],[814,5],[838,6],[957,5],[1130,5],[1449,5],[1473,6]]},"851":{"position":[[328,6]]},"852":{"position":[[37,5],[70,5],[98,5],[144,7],[311,6]]},"854":{"position":[[1317,5]]},"875":{"position":[[1402,5],[3028,7],[3334,6],[6972,5]]},"890":{"position":[[400,5],[891,5]]},"898":{"position":[[3653,8]]},"981":{"position":[[852,7]]},"986":{"position":[[967,7],[1235,7]]},"988":{"position":[[3713,6]]},"996":{"position":[[449,5]]},"1007":{"position":[[247,5],[1523,6]]},"1008":{"position":[[251,7]]},"1024":{"position":[[18,5]]},"1067":{"position":[[698,5],[832,5],[1083,7],[1845,5]]},"1072":{"position":[[313,5],[987,8]]},"1102":{"position":[[451,5],[1128,5],[1245,5]]},"1105":{"position":[[99,5]]},"1116":{"position":[[119,5],[195,8]]},"1117":{"position":[[12,8]]},"1134":{"position":[[621,7]]},"1191":{"position":[[243,5]]},"1194":{"position":[[447,5],[721,5],[815,5],[898,8]]},"1239":{"position":[[145,5],[265,8]]},"1271":{"position":[[444,7]]},"1296":{"position":[[76,8]]}},"keywords":{}}],["fetch('./files/items.json",{"_index":2233,"title":{},"content":{"392":{"position":[[994,28]]}},"keywords":{}}],["fetch('http://example.com/pol",{"_index":3554,"title":{},"content":{"610":{"position":[[926,32]]}},"keywords":{}}],["fetch('http://example.com/pul",{"_index":5541,"title":{},"content":{"1002":{"position":[[1021,30]]}},"keywords":{}}],["fetch('http://localhost:80",{"_index":5936,"title":{},"content":{"1102":{"position":[[479,28]]}},"keywords":{}}],["fetch('http://myserver.com/api/countrybycoordinates/'+coordin",{"_index":4453,"title":{},"content":{"751":{"position":[[1319,70]]}},"keywords":{}}],["fetch('https://example.com/api/sync/push",{"_index":5462,"title":{},"content":{"988":{"position":[[2523,42]]}},"keywords":{}}],["fetch('https://example.com/api/temp",{"_index":4099,"title":{},"content":{"739":{"position":[[633,39]]}},"keywords":{}}],["fetch('https://example.com/doc",{"_index":5646,"title":{},"content":{"1024":{"position":[[378,32]]}},"keywords":{}}],["fetch('https://localhost/push",{"_index":5038,"title":{},"content":{"875":{"position":[[6239,31]]}},"keywords":{}}],["fetch('https://myapi.com/push",{"_index":1576,"title":{},"content":{"255":{"position":[[1159,31]]}},"keywords":{}}],["fetch('https://yourapi.com/tasks/push",{"_index":1349,"title":{},"content":{"209":{"position":[[805,39]]}},"keywords":{}}],["fetch(`/api/voxels/push?chunkid=${chunkid",{"_index":5572,"title":{},"content":{"1007":{"position":[[1681,45]]}},"keywords":{}}],["fetch(`https://myapi.com/pull?checkpoint=${json.stringify(lastcheckpoint)}&limit=${batchs",{"_index":1578,"title":{},"content":{"255":{"position":[[1422,100]]}},"keywords":{}}],["fetcheddoc",{"_index":3355,"title":{},"content":{"555":{"position":[[455,10]]}},"keywords":{}}],["fetcheddoc.patch",{"_index":3359,"title":{},"content":{"555":{"position":[[636,18]]}},"keywords":{}}],["fetchmor",{"_index":3269,"title":{},"content":{"523":{"position":[[486,10]]}},"keywords":{}}],["few",{"_index":864,"title":{},"content":{"58":{"position":[[63,3]]},"193":{"position":[[121,3]]},"303":{"position":[[108,3]]},"399":{"position":[[416,3]]},"408":{"position":[[41,3],[1472,3],[5595,3]]},"412":{"position":[[10121,3]]},"454":{"position":[[325,3]]},"463":{"position":[[796,3]]},"464":{"position":[[448,3]]},"465":{"position":[[309,3]]},"466":{"position":[[273,3]]},"467":{"position":[[268,3]]},"696":{"position":[[521,3]]},"702":{"position":[[893,3]]},"1072":{"position":[[276,3]]}},"keywords":{}}],["fewer",{"_index":627,"title":{"478":{"position":[[24,5]]}},"content":{"39":{"position":[[531,5]]},"396":{"position":[[711,6]]},"420":{"position":[[249,5]]},"487":{"position":[[1,5]]},"802":{"position":[[11,5]]}},"keywords":{}}],["fiber",{"_index":2547,"title":{},"content":{"408":{"position":[[2422,6]]}},"keywords":{}}],["fiddl",{"_index":518,"title":{},"content":{"33":{"position":[[389,8]]}},"keywords":{}}],["field",{"_index":737,"title":{"75":{"position":[[20,7]]},"106":{"position":[[20,7]]},"235":{"position":[[20,7]]},"691":{"position":[[27,6]]},"798":{"position":[[32,7]]},"887":{"position":[[43,7]]},"1108":{"position":[[12,7]]},"1109":{"position":[[9,7]]}},"content":{"47":{"position":[[851,6]]},"75":{"position":[[56,7]]},"106":{"position":[[43,7]]},"138":{"position":[[77,6]]},"166":{"position":[[236,7]]},"174":{"position":[[975,7],[1028,6]]},"194":{"position":[[92,7],[153,7]]},"235":{"position":[[35,7],[140,7],[199,6]]},"303":{"position":[[344,5]]},"310":{"position":[[136,6]]},"315":{"position":[[848,6],[1024,6]]},"316":{"position":[[436,5]]},"342":{"position":[[38,6]]},"345":{"position":[[44,5]]},"351":{"position":[[120,6],[269,5]]},"356":{"position":[[306,7],[673,8],[844,6]]},"357":{"position":[[215,7]]},"360":{"position":[[870,7]]},"361":{"position":[[64,6],[270,5],[369,5]]},"362":{"position":[[385,7],[524,6]]},"366":{"position":[[575,6]]},"380":{"position":[[342,5]]},"382":{"position":[[186,6]]},"390":{"position":[[367,7]]},"392":{"position":[[494,5],[1441,6]]},"395":{"position":[[207,6]]},"397":{"position":[[457,7],[886,6],[1346,7],[1610,7],[2031,6]]},"412":{"position":[[11086,7]]},"418":{"position":[[145,5]]},"461":{"position":[[394,6]]},"480":{"position":[[1048,7]]},"482":{"position":[[114,6],[1000,5],[1227,7]]},"496":{"position":[[315,6]]},"527":{"position":[[131,7]]},"555":{"position":[[58,6],[442,6],[752,6],[786,6],[921,6],[1010,7]]},"556":{"position":[[1282,7]]},"564":{"position":[[929,5],[994,6]]},"566":{"position":[[1365,5]]},"567":{"position":[[656,6]]},"571":{"position":[[1301,7]]},"587":{"position":[[44,7]]},"588":{"position":[[28,5]]},"612":{"position":[[1633,6]]},"635":{"position":[[369,7]]},"636":{"position":[[30,7],[46,5]]},"638":{"position":[[183,7],[799,6],[836,6]]},"639":{"position":[[134,5]]},"661":{"position":[[1555,7]]},"662":{"position":[[195,5]]},"678":{"position":[[278,5],[331,5]]},"680":{"position":[[92,5],[1004,5],[1094,6]]},"681":{"position":[[261,5]]},"685":{"position":[[48,5],[85,7]]},"688":{"position":[[640,7]]},"691":{"position":[[47,6]]},"701":{"position":[[929,6]]},"702":{"position":[[105,6]]},"710":{"position":[[230,6]]},"711":{"position":[[2014,6]]},"714":{"position":[[483,7],[501,6],[636,5],[850,7]]},"717":{"position":[[1314,5],[1376,6]]},"723":{"position":[[239,5]]},"724":{"position":[[948,6]]},"749":{"position":[[845,6],[1808,5],[2489,5],[3682,6],[4465,6],[9562,6],[9747,6],[9874,5],[9988,5],[10388,6],[13908,6],[16969,6],[17553,6],[19143,6],[19389,5],[19600,6],[19906,5],[20127,6],[20284,6],[20452,5],[20551,6],[20718,6],[21033,6],[21211,6],[21495,6],[23028,6]]},"751":{"position":[[1189,5]]},"754":{"position":[[610,5]]},"764":{"position":[[74,5],[225,6]]},"781":{"position":[[800,6]]},"796":{"position":[[406,6],[702,6],[737,6],[1059,6],[1122,6],[1198,5]]},"798":{"position":[[18,6],[158,6],[403,6]]},"800":{"position":[[570,6]]},"808":{"position":[[65,5]]},"810":{"position":[[81,5]]},"821":{"position":[[737,6]]},"826":{"position":[[158,6],[416,5],[1091,5]]},"836":{"position":[[1432,7]]},"838":{"position":[[224,5],[859,5]]},"848":{"position":[[169,6]]},"849":{"position":[[489,5]]},"854":{"position":[[1396,5]]},"855":{"position":[[198,5]]},"857":{"position":[[138,5],[532,6]]},"861":{"position":[[1328,6],[1841,5],[2033,5]]},"862":{"position":[[1326,5]]},"867":{"position":[[193,5]]},"875":{"position":[[2298,5],[2327,5]]},"887":{"position":[[508,5]]},"898":{"position":[[270,5],[371,5],[1736,6],[3558,5],[4306,6]]},"942":{"position":[[133,7]]},"963":{"position":[[40,6]]},"971":{"position":[[169,6]]},"984":{"position":[[174,6],[439,6]]},"986":{"position":[[385,5],[563,5],[1401,5],[1461,5],[1583,5]]},"988":{"position":[[1677,6],[1933,5],[2003,5],[3154,6]]},"990":{"position":[[568,5],[596,5],[832,5],[914,5]]},"991":{"position":[[168,6]]},"1007":{"position":[[127,6]]},"1018":{"position":[[423,6]]},"1038":{"position":[[24,5],[54,5]]},"1048":{"position":[[386,6]]},"1051":{"position":[[364,6]]},"1069":{"position":[[360,6]]},"1072":{"position":[[30,6],[280,7],[357,6],[481,7],[2149,5],[2240,5],[2404,5]]},"1074":{"position":[[271,5],[324,5],[375,5],[420,5]]},"1076":{"position":[[13,5]]},"1077":{"position":[[16,5]]},"1078":{"position":[[331,6],[383,7],[461,6]]},"1079":{"position":[[116,5],[193,6],[228,5],[398,6]]},"1080":{"position":[[296,6],[486,6],[761,6],[901,5],[989,6]]},"1082":{"position":[[52,7],[97,6]]},"1083":{"position":[[14,5],[79,6],[113,6],[194,6]]},"1084":{"position":[[594,6]]},"1085":{"position":[[357,5],[653,5],[868,6],[937,6],[1116,7],[1797,6],[2428,7]]},"1104":{"position":[[404,5],[516,5],[800,5]]},"1106":{"position":[[202,6]]},"1107":{"position":[[45,5],[410,5],[496,5]]},"1108":{"position":[[79,6],[161,6],[481,5],[613,6]]},"1109":{"position":[[15,6],[126,6]]},"1116":{"position":[[270,5]]},"1176":{"position":[[514,5]]},"1184":{"position":[[62,7]]},"1251":{"position":[[242,6]]},"1253":{"position":[[157,7]]},"1290":{"position":[[166,6]]},"1291":{"position":[[164,6]]},"1294":{"position":[[517,6],[627,5]]},"1296":{"position":[[454,6],[583,5],[692,5],[789,6]]}},"keywords":{}}],["fielda",{"_index":4648,"title":{},"content":{"797":{"position":[[333,9]]}},"keywords":{}}],["fieldb",{"_index":4649,"title":{},"content":{"797":{"position":[[343,8]]}},"keywords":{}}],["fieldnam",{"_index":4222,"title":{},"content":{"749":{"position":[[6854,9],[8579,9],[16836,10],[17044,9],[17167,9],[18342,9],[19040,9]]},"811":{"position":[[123,10]]},"988":{"position":[[1803,9],[1838,9]]},"1077":{"position":[[35,9]]},"1084":{"position":[[152,11],[303,10]]}},"keywords":{}}],["fields.cross",{"_index":3299,"title":{},"content":{"535":{"position":[[853,12]]}},"keywords":{}}],["fieldsasynchron",{"_index":3419,"title":{},"content":{"560":{"position":[[494,18]]}},"keywords":{}}],["fieldsreact",{"_index":3143,"title":{},"content":{"483":{"position":[[307,14]]}},"keywords":{}}],["fifoo",{"_index":5767,"title":{},"content":{"1065":{"position":[[416,7]]}},"keywords":{}}],["fifoofa",{"_index":5769,"title":{},"content":{"1065":{"position":[[438,9]]}},"keywords":{}}],["file",{"_index":98,"title":{"358":{"position":[[42,4]]},"433":{"position":[[0,4]]},"1205":{"position":[[15,4]]},"1215":{"position":[[19,4],[61,4]]}},"content":{"7":{"position":[[202,6]]},"30":{"position":[[85,4]]},"34":{"position":[[219,5],[343,4]]},"59":{"position":[[61,4]]},"131":{"position":[[418,4],[533,4]]},"162":{"position":[[403,4],[421,4]]},"188":{"position":[[464,4],[1687,5],[1813,5],[1852,4],[2527,5]]},"228":{"position":[[389,4]]},"287":{"position":[[705,4]]},"336":{"position":[[263,4]]},"358":{"position":[[62,5],[299,5],[516,5],[697,5],[749,4]]},"362":{"position":[[604,4]]},"390":{"position":[[958,6]]},"408":{"position":[[1547,4],[1579,4],[1623,4],[1684,4],[1922,5],[2101,4]]},"427":{"position":[[1304,4]]},"433":{"position":[[39,5]]},"453":{"position":[[20,4],[107,5],[240,4],[707,5]]},"454":{"position":[[993,4]]},"459":{"position":[[67,5]]},"460":{"position":[[594,4]]},"463":{"position":[[420,4],[483,4],[515,4],[1036,4]]},"464":{"position":[[829,5],[1022,4],[1082,5],[1151,4],[1379,4]]},"467":{"position":[[294,5]]},"469":{"position":[[291,4],[390,4]]},"482":{"position":[[1088,4]]},"524":{"position":[[423,4],[818,4]]},"546":{"position":[[116,4]]},"551":{"position":[[531,5]]},"556":{"position":[[578,5],[598,6],[722,5]]},"579":{"position":[[73,4]]},"581":{"position":[[269,4]]},"590":{"position":[[157,4]]},"606":{"position":[[116,4]]},"640":{"position":[[184,4]]},"644":{"position":[[340,4]]},"649":{"position":[[84,6],[393,6]]},"661":{"position":[[1635,6]]},"667":{"position":[[191,5]]},"668":{"position":[[183,5]]},"730":{"position":[[143,5]]},"732":{"position":[[45,4]]},"772":{"position":[[82,4],[1989,4]]},"836":{"position":[[729,4]]},"841":{"position":[[146,4]]},"861":{"position":[[523,4],[540,5]]},"1033":{"position":[[445,5],[453,5],[534,5],[694,5],[767,5]]},"1134":{"position":[[469,5]]},"1206":{"position":[[20,4],[110,5],[301,4],[348,4],[456,4]]},"1207":{"position":[[48,4]]},"1208":{"position":[[103,5],[198,5],[332,5],[689,4],[883,4],[1044,5],[1141,5],[1269,4],[1518,5],[1632,4],[1710,5],[1894,4]]},"1209":{"position":[[28,4],[80,6],[245,4]]},"1210":{"position":[[142,4],[502,4]]},"1212":{"position":[[137,5],[290,4]]},"1213":{"position":[[587,4]]},"1214":{"position":[[16,4]]},"1215":{"position":[[64,4],[110,4],[135,4],[181,5],[201,4],[241,4],[291,4],[344,5],[383,4],[423,4]]},"1216":{"position":[[13,4],[49,4]]},"1225":{"position":[[34,5]]},"1226":{"position":[[458,4]]},"1227":{"position":[[59,4],[170,5],[489,4],[802,4]]},"1228":{"position":[[29,5],[104,4]]},"1229":{"position":[[179,4]]},"1244":{"position":[[36,4]]},"1264":{"position":[[361,4]]},"1265":{"position":[[52,4],[163,5],[483,4],[784,4]]},"1266":{"position":[[46,4]]},"1268":{"position":[[356,4]]},"1324":{"position":[[1037,4]]}},"keywords":{}}],["filebas",{"_index":4570,"title":{},"content":{"772":{"position":[[1168,9]]}},"keywords":{}}],["filehandl",{"_index":6202,"title":{},"content":{"1208":{"position":[[915,10]]}},"keywords":{}}],["filehandle.createsyncaccesshandl",{"_index":6205,"title":{},"content":{"1208":{"position":[[1077,36]]}},"keywords":{}}],["filenam",{"_index":4773,"title":{},"content":{"836":{"position":[[868,9]]},"1266":{"position":[[608,9]]}},"keywords":{}}],["filepicker.origin",{"_index":6240,"title":{},"content":{"1215":{"position":[[357,17]]}},"keywords":{}}],["files",{"_index":6221,"title":{},"content":{"1208":{"position":[[1722,8]]}},"keywords":{}}],["filesystem",{"_index":84,"title":{"706":{"position":[[60,10]]},"1127":{"position":[[0,10]]},"1245":{"position":[[3,10]]}},"content":{"6":{"position":[[67,11],[125,10],[222,10]]},"7":{"position":[[61,11]]},"24":{"position":[[226,10]]},"28":{"position":[[221,10]]},"188":{"position":[[2215,10]]},"365":{"position":[[982,10]]},"408":{"position":[[1941,11]]},"412":{"position":[[8503,10]]},"433":{"position":[[120,10]]},"453":{"position":[[491,10]]},"647":{"position":[[33,10]]},"662":{"position":[[587,10],[681,10]]},"703":{"position":[[92,11],[171,10],[599,10]]},"709":{"position":[[1372,10]]},"710":{"position":[[706,10],[2339,10]]},"772":{"position":[[1352,11],[1925,10]]},"793":{"position":[[262,10]]},"836":{"position":[[790,10]]},"961":{"position":[[293,10]]},"973":{"position":[[55,11]]},"1090":{"position":[[650,10]]},"1130":{"position":[[115,10]]},"1173":{"position":[[140,10]]},"1191":{"position":[[357,10]]},"1206":{"position":[[165,11]]},"1208":{"position":[[71,11]]},"1211":{"position":[[44,10],[221,10]]},"1214":{"position":[[350,10],[516,10],[777,10]]},"1215":{"position":[[497,10],[579,11]]},"1245":{"position":[[5,10]]},"1270":{"position":[[86,10]]},"1299":{"position":[[414,11],[565,10]]}},"keywords":{}}],["filesystemaccessapirespons",{"_index":6481,"title":{},"content":{"1302":{"position":[[122,27]]}},"keywords":{}}],["filesystemsyncaccesshandl",{"_index":6204,"title":{},"content":{"1208":{"position":[[1010,26],[1835,26]]}},"keywords":{}}],["filesystemsyncaccesshandlehav",{"_index":6195,"title":{},"content":{"1208":{"position":[[439,30]]}},"keywords":{}}],["fill",{"_index":1783,"title":{},"content":{"301":{"position":[[134,4]]},"331":{"position":[[226,5]]},"392":{"position":[[870,4]]},"461":{"position":[[238,4]]},"806":{"position":[[512,6]]},"815":{"position":[[17,4]]},"837":{"position":[[513,4]]},"886":{"position":[[472,4]]},"887":{"position":[[9,5]]},"1078":{"position":[[928,6]]},"1082":{"position":[[112,6]]},"1123":{"position":[[688,5]]}},"keywords":{}}],["fill(0",{"_index":2263,"title":{},"content":{"392":{"position":[[3898,8]]}},"keywords":{}}],["filter",{"_index":1325,"title":{"858":{"position":[[0,8]]}},"content":{"205":{"position":[[198,8]]},"276":{"position":[[302,7]]},"277":{"position":[[162,7]]},"358":{"position":[[357,9]]},"402":{"position":[[2208,6]]},"559":{"position":[[1246,9]]},"714":{"position":[[784,6]]},"751":{"position":[[1523,6]]},"854":{"position":[[913,6]]},"858":{"position":[[328,7],[382,7]]},"898":{"position":[[3703,8],[3785,9]]},"1007":{"position":[[741,8]]},"1009":{"position":[[358,8]]},"1072":{"position":[[497,6]]},"1198":{"position":[[1910,8]]}},"keywords":{}}],["filter(d",{"_index":5519,"title":{},"content":{"995":{"position":[[1945,8]]}},"keywords":{}}],["filterforminupdatedatandid",{"_index":5103,"title":{},"content":{"885":{"position":[[2002,26]]}},"keywords":{}}],["filterforminupdatedatandid.slice(0",{"_index":5108,"title":{},"content":{"885":{"position":[[2369,35]]}},"keywords":{}}],["final",{"_index":3170,"title":{"1083":{"position":[[0,6]]}},"content":{"491":{"position":[[1042,5]]},"691":{"position":[[581,5]]},"749":{"position":[[9741,5],[10382,5],[12312,5],[12342,5]]},"1074":{"position":[[429,5]]},"1077":{"position":[[191,5]]},"1083":{"position":[[23,6],[73,5],[107,5],[188,5],[606,6]]}},"keywords":{}}],["financi",{"_index":3202,"title":{},"content":{"497":{"position":[[400,9]]},"506":{"position":[[198,9]]},"550":{"position":[[242,9]]},"611":{"position":[[321,9]]},"638":{"position":[[118,9]]}},"keywords":{}}],["find",{"_index":642,"title":{"949":{"position":[[0,7]]},"1036":{"position":[[0,5]]},"1055":{"position":[[0,7]]}},"content":{"40":{"position":[[818,4]]},"52":{"position":[[304,4]]},"130":{"position":[[495,7]]},"143":{"position":[[444,7],[625,7]]},"198":{"position":[[480,4]]},"241":{"position":[[304,4]]},"335":{"position":[[263,7]]},"352":{"position":[[80,4]]},"356":{"position":[[906,4]]},"358":{"position":[[346,7]]},"373":{"position":[[304,4]]},"390":{"position":[[1225,5]]},"393":{"position":[[637,4]]},"394":{"position":[[4,4],[199,4]]},"412":{"position":[[14194,4]]},"440":{"position":[[315,4]]},"459":{"position":[[524,4]]},"467":{"position":[[665,7]]},"480":{"position":[[723,7]]},"494":{"position":[[208,10]]},"539":{"position":[[304,4]]},"548":{"position":[[137,4]]},"557":{"position":[[268,4]]},"562":{"position":[[933,7]]},"563":{"position":[[917,4]]},"580":{"position":[[498,7]]},"599":{"position":[[331,4]]},"608":{"position":[[137,4]]},"632":{"position":[[1760,7]]},"666":{"position":[[404,4]]},"703":{"position":[[945,4]]},"724":{"position":[[1541,4]]},"730":{"position":[[32,4]]},"749":{"position":[[22381,4],[24094,4]]},"798":{"position":[[1023,4]]},"806":{"position":[[392,4]]},"821":{"position":[[49,4],[584,7]]},"839":{"position":[[719,4]]},"904":{"position":[[159,4]]},"908":{"position":[[367,4]]},"949":{"position":[[4,4],[80,4],[154,7]]},"950":{"position":[[26,6],[110,4],[150,4]]},"951":{"position":[[1,4],[121,6]]},"1016":{"position":[[1,4]]},"1036":{"position":[[4,4],[70,7],[158,4]]},"1055":{"position":[[33,7],[144,4],[203,7]]},"1056":{"position":[[73,4],[158,4],[263,4]]},"1065":{"position":[[88,4],[326,4],[903,4]]},"1074":{"position":[[238,4]]},"1078":{"position":[[737,4],[984,4]]},"1151":{"position":[[489,4]]},"1173":{"position":[[168,4]]},"1176":{"position":[[80,4]]},"1178":{"position":[[488,4]]},"1193":{"position":[[26,4]]},"1194":{"position":[[621,4],[770,6],[858,6]]},"1227":{"position":[[207,4]]},"1265":{"position":[[200,4]]},"1304":{"position":[[778,4]]},"1320":{"position":[[164,4]]}},"keywords":{}}],["findbestindex",{"_index":4706,"title":{},"content":{"820":{"position":[[10,13],[169,15]]}},"keywords":{}}],["findbyid",{"_index":4176,"title":{"951":{"position":[[0,12]]}},"content":{"749":{"position":[[3215,11]]},"951":{"position":[[470,9]]},"1194":{"position":[[496,11],[658,11]]}},"keywords":{}}],["finddocumentsbyid",{"_index":4122,"title":{},"content":{"746":{"position":[[698,18]]}},"keywords":{}}],["findon",{"_index":800,"title":{"950":{"position":[[0,10]]},"1056":{"position":[[0,10]]}},"content":{"52":{"position":[[313,7]]},"539":{"position":[[313,7]]},"599":{"position":[[340,7]]},"749":{"position":[[2032,10],[2133,7]]},"798":{"position":[[555,10]]},"951":{"position":[[106,9]]},"1056":{"position":[[3,7],[111,10],[207,10]]},"1057":{"position":[[210,10]]},"1066":{"position":[[361,10]]}},"keywords":{}}],["findone(_id",{"_index":4230,"title":{},"content":{"749":{"position":[[7237,13]]}},"keywords":{}}],["fine",{"_index":969,"title":{},"content":{"75":{"position":[[73,4]]},"106":{"position":[[151,4]]},"383":{"position":[[491,4]]},"412":{"position":[[10052,4],[12837,4]]},"542":{"position":[[131,4]]},"551":{"position":[[393,4]]},"563":{"position":[[973,4]]},"635":{"position":[[325,4]]},"835":{"position":[[808,4]]},"841":{"position":[[877,4]]},"1157":{"position":[[287,4]]},"1164":{"position":[[33,4]]},"1316":{"position":[[1031,5]]}},"keywords":{}}],["finish",{"_index":464,"title":{},"content":{"28":{"position":[[599,8]]},"700":{"position":[[697,9]]},"752":{"position":[[153,9]]},"948":{"position":[[710,8]]},"994":{"position":[[128,8]]},"1000":{"position":[[86,8]]},"1032":{"position":[[184,9]]},"1304":{"position":[[349,9]]}},"keywords":{}}],["fire",{"_index":169,"title":{},"content":{"11":{"position":[[753,5]]},"953":{"position":[[195,4]]},"1300":{"position":[[775,5]]}},"keywords":{}}],["firebas",{"_index":194,"title":{"14":{"position":[[0,9]]},"199":{"position":[[11,8]]},"200":{"position":[[25,8]]},"840":{"position":[[0,8]]},"853":{"position":[[32,8]]}},"content":{"14":{"position":[[3,8],[88,8],[217,8],[252,8],[462,8],[586,8],[961,8],[1018,8]]},"18":{"position":[[115,9]]},"22":{"position":[[50,8],[143,8]]},"113":{"position":[[235,9]]},"174":{"position":[[3067,9]]},"201":{"position":[[8,8]]},"202":{"position":[[7,8]]},"203":{"position":[[1,8]]},"204":{"position":[[18,8]]},"205":{"position":[[15,8]]},"206":{"position":[[7,8]]},"212":{"position":[[138,8]]},"238":{"position":[[150,9]]},"350":{"position":[[169,9]]},"412":{"position":[[1032,8]]},"444":{"position":[[592,8]]},"570":{"position":[[152,8],[225,8]]},"699":{"position":[[281,8]]},"840":{"position":[[113,8],[677,8]]},"854":{"position":[[15,8],[45,8],[104,8]]}},"keywords":{}}],["firebase"",{"_index":1512,"title":{},"content":{"244":{"position":[[1194,14]]}},"keywords":{}}],["firebase.initializeapp",{"_index":4866,"title":{},"content":{"854":{"position":[[244,24]]}},"keywords":{}}],["firebase/app",{"_index":4862,"title":{},"content":{"854":{"position":[[118,15]]}},"keywords":{}}],["firebase/firestor",{"_index":4864,"title":{},"content":{"854":{"position":[[175,21]]},"857":{"position":[[253,21]]}},"keywords":{}}],["firefox",{"_index":1707,"title":{},"content":{"298":{"position":[[163,8],[575,7]]},"299":{"position":[[415,7],[1226,7],[1427,7]]},"301":{"position":[[458,7]]},"408":{"position":[[554,7],[1052,7]]},"439":{"position":[[41,7]]},"455":{"position":[[746,7]]},"462":{"position":[[371,7]]},"617":{"position":[[1763,8]]},"696":{"position":[[1364,7],[1954,7]]},"1207":{"position":[[130,8]]}},"keywords":{}}],["firestor",{"_index":208,"title":{"246":{"position":[[11,9]]},"247":{"position":[[24,9]]},"256":{"position":[[31,9]]},"840":{"position":[[11,10]]},"853":{"position":[[17,9]]},"857":{"position":[[47,9]]}},"content":{"14":{"position":[[205,10],[305,10],[603,10],[619,9],[829,9],[1188,9],[1215,9]]},"247":{"position":[[1,9]]},"249":{"position":[[8,10]]},"250":{"position":[[1,9]]},"251":{"position":[[1,9],[248,9]]},"253":{"position":[[7,9]]},"255":{"position":[[1708,9],[1827,9]]},"260":{"position":[[88,9],[122,9],[228,9],[281,9]]},"262":{"position":[[183,9],[524,9]]},"263":{"position":[[32,9]]},"289":{"position":[[981,9],[1004,10],[1110,9],[1416,9]]},"312":{"position":[[156,10]]},"412":{"position":[[1009,9],[3303,11]]},"504":{"position":[[1064,9],[1122,10]]},"565":{"position":[[143,10]]},"570":{"position":[[188,11]]},"632":{"position":[[766,10]]},"644":{"position":[[140,10]]},"793":{"position":[[760,9]]},"840":{"position":[[3,9],[477,9],[608,9]]},"854":{"position":[[72,9],[721,10],[864,9],[1149,9],[1452,9]]},"855":{"position":[[148,9]]},"856":{"position":[[1,9],[150,9]]},"857":{"position":[[80,9],[577,9]]},"858":{"position":[[81,10],[232,10]]},"1124":{"position":[[2288,9]]}},"keywords":{}}],["firestore'",{"_index":1557,"title":{},"content":{"252":{"position":[[1,11]]},"262":{"position":[[333,11]]},"289":{"position":[[1198,11]]}},"keywords":{}}],["firestorecollect",{"_index":4870,"title":{},"content":{"854":{"position":[[399,19],[786,19]]},"858":{"position":[[297,19]]}},"keywords":{}}],["firestoredatabas",{"_index":4804,"title":{},"content":{"841":{"position":[[55,17]]},"854":{"position":[[354,17],[755,18]]},"858":{"position":[[266,18]]}},"keywords":{}}],["firestoregraphql",{"_index":3131,"title":{},"content":{"481":{"position":[[319,16]]}},"keywords":{}}],["firewal",{"_index":3623,"title":{"619":{"position":[[12,10]]},"627":{"position":[[8,9]]}},"content":{"614":{"position":[[429,10]]},"619":{"position":[[203,9]]},"624":{"position":[[301,8]]},"627":{"position":[[117,8]]},"901":{"position":[[353,9]]}},"keywords":{}}],["first",{"_index":107,"title":{"12":{"position":[[34,5]]},"44":{"position":[[22,5]]},"122":{"position":[[8,5]]},"133":{"position":[[8,5]]},"157":{"position":[[8,5]]},"164":{"position":[[8,5]]},"183":{"position":[[8,5]]},"191":{"position":[[8,5]]},"201":{"position":[[20,5]]},"248":{"position":[[17,6]]},"274":{"position":[[6,5]]},"327":{"position":[[8,5]]},"338":{"position":[[8,5]]},"380":{"position":[[8,5]]},"404":{"position":[[38,5]]},"406":{"position":[[10,5]]},"407":{"position":[[18,5]]},"408":{"position":[[10,5]]},"409":{"position":[[33,5]]},"412":{"position":[[36,6]]},"413":{"position":[[6,5],[35,5]]},"419":{"position":[[8,5],[24,6]]},"420":{"position":[[29,5]]},"421":{"position":[[10,5]]},"516":{"position":[[6,5]]},"584":{"position":[[8,5]]},"629":{"position":[[19,5]]},"630":{"position":[[30,5]]},"631":{"position":[[37,5]]},"632":{"position":[[27,6]]},"695":{"position":[[19,5],[35,5]]},"777":{"position":[[6,5],[22,5]]},"869":{"position":[[57,5]]},"895":{"position":[[58,5]]},"980":{"position":[[38,5]]},"1009":{"position":[[24,5]]},"1314":{"position":[[38,6]]}},"content":{"8":{"position":[[151,5]]},"11":{"position":[[711,5]]},"13":{"position":[[43,6]]},"14":{"position":[[287,5]]},"15":{"position":[[518,5]]},"19":{"position":[[562,5]]},"22":{"position":[[391,6]]},"27":{"position":[[51,5],[289,5]]},"35":{"position":[[610,5]]},"37":{"position":[[330,5]]},"38":{"position":[[88,5],[175,5]]},"39":{"position":[[247,5]]},"40":{"position":[[425,5],[795,5]]},"43":{"position":[[61,5],[739,5]]},"46":{"position":[[21,6]]},"65":{"position":[[1512,5]]},"122":{"position":[[53,5]]},"126":{"position":[[137,5]]},"128":{"position":[[43,5]]},"133":{"position":[[49,5]]},"148":{"position":[[105,5]]},"157":{"position":[[26,5]]},"164":{"position":[[46,5]]},"170":{"position":[[211,5]]},"179":{"position":[[430,5]]},"183":{"position":[[25,5]]},"186":{"position":[[266,5]]},"188":{"position":[[2040,5]]},"191":{"position":[[16,5]]},"198":{"position":[[98,5]]},"212":{"position":[[102,5]]},"244":{"position":[[400,5],[731,5]]},"245":{"position":[[13,5]]},"253":{"position":[[142,6]]},"262":{"position":[[18,6],[48,5]]},"263":{"position":[[139,5],[494,6]]},"273":{"position":[[66,5]]},"274":{"position":[[11,5]]},"280":{"position":[[157,5]]},"313":{"position":[[210,5]]},"318":{"position":[[41,5],[620,6]]},"321":{"position":[[574,5]]},"323":{"position":[[161,5]]},"327":{"position":[[64,5]]},"338":{"position":[[16,5]]},"353":{"position":[[218,6]]},"359":{"position":[[181,5]]},"360":{"position":[[434,5]]},"362":{"position":[[176,5],[773,5]]},"375":{"position":[[195,5]]},"378":{"position":[[40,6]]},"380":{"position":[[295,5]]},"388":{"position":[[422,5]]},"391":{"position":[[9,5],[37,5]]},"392":{"position":[[26,5]]},"394":{"position":[[1056,7],[1154,7]]},"396":{"position":[[1482,5]]},"398":{"position":[[3182,5],[3469,5]]},"399":{"position":[[114,5],[379,5]]},"402":{"position":[[648,5]]},"407":{"position":[[10,5],[532,5],[881,5],[993,5]]},"408":{"position":[[20,5],[147,5],[221,5],[1428,5],[1795,5],[2671,5],[3268,5],[3417,5],[4189,5],[4271,5],[4327,5],[4439,5],[5426,5]]},"409":{"position":[[169,5]]},"410":{"position":[[155,5],[452,5],[1301,5],[1805,5]]},"411":{"position":[[36,5],[275,6],[1127,5],[2087,5],[2581,5],[4565,6],[4909,5],[5448,6],[5777,5]]},"412":{"position":[[159,6],[295,5],[431,5],[587,5],[3219,5],[4206,6],[4317,5],[5636,5],[6145,5],[6588,5],[6689,5],[6926,5],[7122,5],[7407,5],[7560,5],[8233,5],[8971,5],[11105,5],[11183,5],[12232,5],[14756,5],[14796,6],[14934,5],[15094,5],[15405,5]]},"413":{"position":[[52,6]]},"414":{"position":[[7,6],[243,6]]},"415":{"position":[[7,6],[251,6]]},"416":{"position":[[7,6],[327,6]]},"417":{"position":[[7,6],[245,6]]},"418":{"position":[[7,6],[258,6],[833,5]]},"419":{"position":[[577,6],[676,5],[860,5],[919,5],[1083,5],[1532,5],[1568,5],[1684,5]]},"420":{"position":[[100,5],[221,5],[432,5],[544,5],[1147,5]]},"421":{"position":[[532,5],[714,5]]},"422":{"position":[[45,5],[138,5],[153,5],[314,5],[356,5],[375,5],[427,5]]},"445":{"position":[[278,5],[410,5]]},"446":{"position":[[9,5]]},"447":{"position":[[120,5]]},"449":{"position":[[1,5]]},"450":{"position":[[14,5]]},"451":{"position":[[26,5]]},"452":{"position":[[15,5]]},"454":{"position":[[752,5]]},"458":{"position":[[1047,5]]},"463":{"position":[[603,5]]},"464":{"position":[[882,5]]},"473":{"position":[[9,5],[24,5]]},"476":{"position":[[147,5]]},"477":{"position":[[135,5]]},"479":{"position":[[134,5]]},"483":{"position":[[224,5],[743,5],[803,5]]},"486":{"position":[[230,5]]},"489":{"position":[[600,6]]},"491":{"position":[[798,5],[1151,5]]},"496":{"position":[[704,5]]},"497":{"position":[[197,5]]},"498":{"position":[[213,5],[493,5]]},"501":{"position":[[369,5]]},"502":{"position":[[225,5],[292,5]]},"504":{"position":[[296,5]]},"510":{"position":[[254,5]]},"513":{"position":[[303,5]]},"516":{"position":[[23,5]]},"525":{"position":[[13,5]]},"530":{"position":[[388,5]]},"534":{"position":[[180,5],[194,6]]},"537":{"position":[[1,6]]},"542":{"position":[[163,6]]},"559":{"position":[[1671,5]]},"562":{"position":[[1023,5]]},"566":{"position":[[1214,5]]},"567":{"position":[[104,6],[397,5]]},"574":{"position":[[756,5]]},"575":{"position":[[325,5]]},"582":{"position":[[27,5]]},"594":{"position":[[178,5],[192,6]]},"597":{"position":[[1,6]]},"610":{"position":[[22,5]]},"620":{"position":[[224,5]]},"627":{"position":[[272,5]]},"630":{"position":[[221,5],[945,5]]},"631":{"position":[[64,5]]},"634":{"position":[[9,5]]},"635":{"position":[[10,5]]},"640":{"position":[[498,5]]},"644":{"position":[[56,5],[619,5]]},"656":{"position":[[255,5]]},"659":{"position":[[202,5]]},"661":{"position":[[527,5]]},"662":{"position":[[20,6]]},"666":{"position":[[288,6]]},"681":{"position":[[536,5]]},"690":{"position":[[476,5]]},"696":{"position":[[151,5]]},"698":{"position":[[401,5],[2260,5]]},"699":{"position":[[232,5]]},"700":{"position":[[12,5],[1030,5]]},"701":{"position":[[15,5]]},"702":{"position":[[498,5]]},"703":{"position":[[37,5],[1294,5]]},"704":{"position":[[190,5]]},"705":{"position":[[116,5],[377,5],[1132,5],[1218,5],[1281,5]]},"710":{"position":[[1401,6]]},"714":{"position":[[876,5]]},"723":{"position":[[632,5],[2414,5],[2474,5]]},"724":{"position":[[1241,5],[1334,5]]},"749":{"position":[[12656,6],[17541,5]]},"766":{"position":[[34,5],[197,5]]},"774":{"position":[[219,5]]},"778":{"position":[[305,5]]},"779":{"position":[[250,5],[341,5]]},"780":{"position":[[511,5]]},"781":{"position":[[561,5],[652,5]]},"782":{"position":[[230,5]]},"783":{"position":[[126,5],[525,5]]},"784":{"position":[[359,5]]},"785":{"position":[[442,5]]},"786":{"position":[[144,5],[166,5]]},"818":{"position":[[136,5]]},"836":{"position":[[248,5],[432,5],[1961,5]]},"837":{"position":[[1256,5]]},"838":{"position":[[20,6],[577,5],[1637,6],[1739,5]]},"839":{"position":[[765,5]]},"840":{"position":[[272,5]]},"841":{"position":[[1453,5]]},"860":{"position":[[221,5],[331,6],[1205,5]]},"870":{"position":[[65,5]]},"872":{"position":[[197,5]]},"875":{"position":[[1302,5],[3918,5]]},"885":{"position":[[1654,5]]},"886":{"position":[[50,5],[426,5],[1411,5]]},"896":{"position":[[180,5]]},"898":{"position":[[4056,5]]},"899":{"position":[[93,5]]},"902":{"position":[[513,5]]},"913":{"position":[[57,5],[144,5]]},"977":{"position":[[408,6]]},"981":{"position":[[1191,5],[1297,5]]},"984":{"position":[[4,5]]},"986":{"position":[[28,5]]},"994":{"position":[[145,5]]},"1006":{"position":[[226,5]]},"1007":{"position":[[704,5]]},"1009":{"position":[[727,5]]},"1032":{"position":[[82,5]]},"1082":{"position":[[40,5]]},"1085":{"position":[[506,5]]},"1087":{"position":[[172,5]]},"1088":{"position":[[51,5]]},"1114":{"position":[[174,5],[567,5]]},"1118":{"position":[[247,5]]},"1123":{"position":[[747,5]]},"1125":{"position":[[503,5]]},"1154":{"position":[[398,5]]},"1161":{"position":[[219,5]]},"1180":{"position":[[219,5]]},"1192":{"position":[[467,5]]},"1194":{"position":[[51,5],[218,5],[292,5]]},"1208":{"position":[[48,5]]},"1210":{"position":[[571,5]]},"1222":{"position":[[163,5]]},"1231":{"position":[[824,5]]},"1292":{"position":[[296,5],[650,5]]},"1294":{"position":[[446,5]]},"1298":{"position":[[266,5]]},"1302":{"position":[[9,5]]},"1304":{"position":[[1542,6]]},"1314":{"position":[[35,5]]},"1316":{"position":[[15,5],[960,6]]},"1317":{"position":[[364,5]]},"1319":{"position":[[558,5]]},"1320":{"position":[[19,5]]}},"keywords":{}}],["first"",{"_index":1456,"title":{},"content":{"243":{"position":[[449,11]]},"244":{"position":[[1513,11]]},"413":{"position":[[114,11]]},"419":{"position":[[98,12],[1229,11],[1350,11]]},"420":{"position":[[624,11]]}},"keywords":{}}],["first.creat",{"_index":6489,"title":{},"content":{"1304":{"position":[[1867,14]]}},"keywords":{}}],["first/loc",{"_index":702,"title":{},"content":{"46":{"position":[[9,11]]}},"keywords":{}}],["firstdo",{"_index":6299,"title":{},"content":{"1258":{"position":[[28,9]]}},"keywords":{}}],["firsti",{"_index":4597,"title":{},"content":{"786":{"position":[[88,6]]}},"keywords":{}}],["firstnam",{"_index":4956,"title":{},"content":{"872":{"position":[[1976,10],[2064,12],[4206,10],[4294,12]]},"898":{"position":[[2556,10],[2669,12]]},"1041":{"position":[[347,10],[375,9]]},"1051":{"position":[[244,10],[514,10]]},"1078":{"position":[[393,12],[613,10],[694,12],[943,10],[1070,10]]},"1080":{"position":[[236,10],[827,12],[889,11],[918,13]]},"1082":{"position":[[321,10]]},"1083":{"position":[[521,10]]},"1311":{"position":[[479,10],[593,12],[1533,10]]}},"keywords":{}}],["firstopen",{"_index":5476,"title":{},"content":{"988":{"position":[[5155,9],[5795,9]]}},"keywords":{}}],["firstread",{"_index":3146,"title":{},"content":{"483":{"position":[[721,9]]}},"keywords":{}}],["firstsupabas",{"_index":5231,"title":{},"content":{"899":{"position":[[156,13]]}},"keywords":{}}],["firstsyncencrypt",{"_index":1908,"title":{},"content":{"317":{"position":[[173,19]]}},"keywords":{}}],["firstvaluefrom",{"_index":5516,"title":{},"content":{"995":{"position":[[1884,15]]}},"keywords":{}}],["fit",{"_index":952,"title":{"67":{"position":[[44,3]]},"71":{"position":[[19,3]]},"73":{"position":[[34,3]]},"98":{"position":[[45,3]]},"102":{"position":[[19,3]]},"104":{"position":[[34,3]]},"225":{"position":[[33,3]]},"229":{"position":[[19,3]]},"278":{"position":[[22,3]]}},"content":{"98":{"position":[[201,3]]},"102":{"position":[[115,3]]},"174":{"position":[[666,3]]},"229":{"position":[[196,3]]},"254":{"position":[[257,3]]},"271":{"position":[[308,3]]},"278":{"position":[[232,3]]},"354":{"position":[[75,3]]},"381":{"position":[[500,4]]},"384":{"position":[[19,3]]},"388":{"position":[[197,3]]},"412":{"position":[[6638,4]]},"481":{"position":[[426,4]]},"689":{"position":[[270,3]]},"1162":{"position":[[325,4]]},"1171":{"position":[[182,3]]},"1181":{"position":[[412,4]]},"1192":{"position":[[580,4]]},"1198":{"position":[[134,7]]}},"keywords":{}}],["fix",{"_index":1711,"title":{},"content":{"298":{"position":[[278,5]]},"397":{"position":[[214,5]]},"412":{"position":[[2924,5]]},"442":{"position":[[100,3]]},"461":{"position":[[945,5]]},"571":{"position":[[1829,5]]},"616":{"position":[[938,3]]},"626":{"position":[[388,6]]},"837":{"position":[[651,5]]},"1174":{"position":[[358,5]]},"1176":{"position":[[203,3],[484,3]]},"1198":{"position":[[728,6],[987,3]]},"1288":{"position":[[83,6]]},"1299":{"position":[[40,3]]},"1316":{"position":[[1390,3]]}},"keywords":{}}],["fix"",{"_index":3649,"title":{},"content":{"617":{"position":[[1737,9]]}},"keywords":{}}],["flag",{"_index":2979,"title":{},"content":{"455":{"position":[[909,5]]},"566":{"position":[[1418,5]]},"698":{"position":[[1195,4]]},"773":{"position":[[814,5]]},"828":{"position":[[353,6]]},"875":{"position":[[8536,5],[8800,4],[9046,4],[9361,5]]},"876":{"position":[[434,4]]},"898":{"position":[[1881,4]]},"988":{"position":[[3123,4]]},"995":{"position":[[1465,4],[1582,4],[1782,4]]},"1051":{"position":[[417,5]]},"1065":{"position":[[553,6]]},"1282":{"position":[[966,5]]}},"keywords":{}}],["flag.th",{"_index":6156,"title":{},"content":{"1181":{"position":[[352,8]]}},"keywords":{}}],["flag.thi",{"_index":6109,"title":{},"content":{"1162":{"position":[[286,9]]}},"keywords":{}}],["flags)str",{"_index":3416,"title":{},"content":{"560":{"position":[[352,12]]}},"keywords":{}}],["flaki",{"_index":2596,"title":{},"content":{"410":{"position":[[1056,5]]},"419":{"position":[[217,5]]}},"keywords":{}}],["flat",{"_index":530,"title":{},"content":{"34":{"position":[[209,4]]},"848":{"position":[[226,4]]}},"keywords":{}}],["fledg",{"_index":635,"title":{},"content":{"40":{"position":[[313,7]]},"452":{"position":[[405,7]]},"576":{"position":[[227,7]]}},"keywords":{}}],["flexibl",{"_index":639,"title":{"72":{"position":[[0,8]]},"112":{"position":[[0,8]]},"239":{"position":[[0,8]]},"351":{"position":[[0,9]]},"381":{"position":[[0,8]]}},"content":{"40":{"position":[[450,11]]},"42":{"position":[[161,11]]},"72":{"position":[[15,8]]},"112":{"position":[[15,8],[181,11]]},"174":{"position":[[805,11],[2625,8],[3119,11]]},"198":{"position":[[28,8]]},"202":{"position":[[345,11]]},"238":{"position":[[57,8]]},"239":{"position":[[17,8]]},"248":{"position":[[224,8]]},"255":{"position":[[1803,8]]},"267":{"position":[[1256,12]]},"276":{"position":[[162,11]]},"281":{"position":[[157,9]]},"282":{"position":[[331,11]]},"287":{"position":[[164,11]]},"299":{"position":[[1670,8]]},"353":{"position":[[255,8]]},"354":{"position":[[83,9]]},"356":{"position":[[31,8],[659,8]]},"360":{"position":[[850,11]]},"362":{"position":[[201,8],[515,8]]},"364":{"position":[[478,12]]},"370":{"position":[[219,12]]},"372":{"position":[[332,11]]},"381":{"position":[[470,11]]},"383":{"position":[[284,8]]},"388":{"position":[[538,12]]},"390":{"position":[[1773,11]]},"392":{"position":[[1239,8]]},"412":{"position":[[13506,11]]},"504":{"position":[[432,11]]},"574":{"position":[[46,8]]},"581":{"position":[[92,11]]},"631":{"position":[[338,8]]},"632":{"position":[[628,8]]},"688":{"position":[[301,8]]},"689":{"position":[[223,12]]},"690":{"position":[[598,12]]},"710":{"position":[[422,8]]},"715":{"position":[[163,11]]},"770":{"position":[[149,8]]},"839":{"position":[[801,8]]},"860":{"position":[[759,8]]},"1072":{"position":[[1921,11]]},"1149":{"position":[[10,11]]},"1236":{"position":[[37,9]]}},"keywords":{}}],["flexsearch",{"_index":4039,"title":{},"content":{"723":{"position":[[56,10],[2082,10]]},"724":{"position":[[5,10],[510,10]]},"1284":{"position":[[93,10]]}},"keywords":{}}],["flexsearch.find('foobar",{"_index":4064,"title":{},"content":{"724":{"position":[[1636,26],[1818,25]]}},"keywords":{}}],["flexsearch.rxdb",{"_index":6377,"title":{},"content":{"1284":{"position":[[140,15]]}},"keywords":{}}],["fli",{"_index":1994,"title":{},"content":{"351":{"position":[[217,4]]}},"keywords":{}}],["flight",{"_index":1978,"title":{},"content":{"346":{"position":[[681,6]]}},"keywords":{}}],["flip",{"_index":2648,"title":{},"content":{"412":{"position":[[184,4]]}},"keywords":{}}],["float",{"_index":5080,"title":{},"content":{"885":{"position":[[592,7],[687,7],[758,6]]}},"keywords":{}}],["flood",{"_index":3695,"title":{},"content":{"630":{"position":[[773,8]]}},"keywords":{}}],["flourish",{"_index":2046,"title":{},"content":{"356":{"position":[[865,8]]}},"keywords":{}}],["flow",{"_index":299,"title":{},"content":{"17":{"position":[[518,4]]},"47":{"position":[[223,6]]},"90":{"position":[[150,5]]},"208":{"position":[[49,4]]},"219":{"position":[[359,4]]},"226":{"position":[[265,6]]},"340":{"position":[[25,4]]},"410":{"position":[[2121,5]]},"454":{"position":[[868,4]]},"478":{"position":[[115,5]]},"576":{"position":[[139,5]]},"585":{"position":[[198,4]]},"630":{"position":[[194,5]]},"632":{"position":[[182,4]]},"871":{"position":[[397,4]]},"901":{"position":[[782,6]]},"903":{"position":[[170,4]]},"1033":{"position":[[1052,5]]},"1147":{"position":[[341,5]]}},"keywords":{}}],["fluctuat",{"_index":1679,"title":{},"content":{"289":{"position":[[246,13]]},"444":{"position":[[251,12]]}},"keywords":{}}],["fluid",{"_index":3105,"title":{},"content":{"474":{"position":[[299,5]]},"644":{"position":[[686,6]]}},"keywords":{}}],["flutter",{"_index":678,"title":{"176":{"position":[[24,7]]},"177":{"position":[[12,7]]},"178":{"position":[[27,7]]},"186":{"position":[[15,7]]},"187":{"position":[[16,7]]},"188":{"position":[[20,8]]}},"content":{"43":{"position":[[499,8]]},"177":{"position":[[1,7]]},"178":{"position":[[32,7],[326,7]]},"179":{"position":[[122,8],[242,7]]},"180":{"position":[[45,7]]},"183":{"position":[[70,7]]},"186":{"position":[[39,7],[245,8],[403,7]]},"187":{"position":[[92,7]]},"188":{"position":[[74,7],[225,7],[543,7],[1049,7],[1511,7],[1829,7],[1924,8],[2007,7],[2089,7]]},"192":{"position":[[390,7]]},"198":{"position":[[59,7],[248,7],[300,7],[521,7]]},"365":{"position":[[1061,8]]}},"keywords":{}}],["flutter'",{"_index":1230,"title":{},"content":{"177":{"position":[[197,9]]}},"keywords":{}}],["flutter_qj",{"_index":1241,"title":{},"content":{"188":{"position":[[99,11]]}},"keywords":{}}],["fn",{"_index":5270,"title":{},"content":{"910":{"position":[[407,4]]}},"keywords":{}}],["fn(...arg",{"_index":5272,"title":{},"content":{"910":{"position":[[447,13]]}},"keywords":{}}],["focu",{"_index":573,"title":{},"content":{"36":{"position":[[293,6]]},"61":{"position":[[480,5]]},"373":{"position":[[604,5]]},"378":{"position":[[137,5]]},"390":{"position":[[392,5]]},"411":{"position":[[1588,5]]},"412":{"position":[[1235,5]]},"419":{"position":[[603,5]]},"420":{"position":[[332,5],[1324,5]]},"445":{"position":[[2439,5]]},"481":{"position":[[530,5]]},"690":{"position":[[512,5]]}},"keywords":{}}],["focus",{"_index":625,"title":{"359":{"position":[[13,7]]}},"content":{"39":{"position":[[470,7]]},"40":{"position":[[66,7]]},"41":{"position":[[75,7]]},"411":{"position":[[705,7]]},"412":{"position":[[2057,8]]},"462":{"position":[[103,8]]}},"keywords":{}}],["folder",{"_index":89,"title":{},"content":{"6":{"position":[[233,7],[633,6]]},"7":{"position":[[468,6]]},"647":{"position":[[242,6],[304,9]]},"648":{"position":[[196,9]]},"649":{"position":[[152,9]]},"667":{"position":[[119,7]]},"670":{"position":[[470,7]]},"730":{"position":[[17,6],[117,6]]},"749":{"position":[[337,7],[6245,6]]},"838":{"position":[[2269,6]]},"961":{"position":[[304,6]]},"1033":{"position":[[466,8],[611,7],[702,7]]},"1090":{"position":[[933,8]]},"1130":{"position":[[280,9]]},"1210":{"position":[[626,7]]},"1227":{"position":[[224,6]]},"1265":{"position":[[217,6]]},"1266":{"position":[[348,6]]}},"keywords":{}}],["folder)befor",{"_index":3834,"title":{},"content":{"668":{"position":[[211,13]]}},"keywords":{}}],["folder/foobar/document.json",{"_index":3741,"title":{},"content":{"649":{"position":[[414,28]]}},"keywords":{}}],["folders.find().exec",{"_index":5662,"title":{},"content":{"1033":{"position":[[627,22]]}},"keywords":{}}],["follow",{"_index":879,"title":{"61":{"position":[[0,6]]},"84":{"position":[[0,6]]},"114":{"position":[[0,6]]},"149":{"position":[[0,6]]},"175":{"position":[[0,6]]},"241":{"position":[[0,6]]},"263":{"position":[[0,6]]},"296":{"position":[[0,6]]},"306":{"position":[[0,6]]},"318":{"position":[[0,6]]},"347":{"position":[[0,6]]},"362":{"position":[[0,6]]},"373":{"position":[[0,6]]},"388":{"position":[[0,6]]},"405":{"position":[[0,6]]},"442":{"position":[[0,6]]},"471":{"position":[[0,6]]},"483":{"position":[[0,6]]},"498":{"position":[[0,6]]},"511":{"position":[[0,6]]},"531":{"position":[[0,6]]},"548":{"position":[[0,6]]},"557":{"position":[[0,6]]},"567":{"position":[[0,6]]},"572":{"position":[[0,6]]},"591":{"position":[[0,6]]},"608":{"position":[[0,6]]},"628":{"position":[[0,6]]},"644":{"position":[[0,6]]},"663":{"position":[[0,6]]},"712":{"position":[[0,6]]},"776":{"position":[[0,6]]},"786":{"position":[[0,6]]},"832":{"position":[[0,6]]},"842":{"position":[[0,6]]},"873":{"position":[[0,6]]},"899":{"position":[[0,6]]},"913":{"position":[[0,6]]}},"content":{"84":{"position":[[93,9],[298,9]]},"114":{"position":[[106,9],[311,9]]},"120":{"position":[[37,7]]},"128":{"position":[[147,9]]},"142":{"position":[[68,9]]},"149":{"position":[[106,9],[311,9]]},"175":{"position":[[84,9],[304,9]]},"183":{"position":[[6,7]]},"241":{"position":[[99,9]]},"285":{"position":[[392,6]]},"299":{"position":[[115,9]]},"347":{"position":[[106,9],[311,9]]},"362":{"position":[[1177,9],[1382,9]]},"373":{"position":[[99,9]]},"425":{"position":[[221,9]]},"430":{"position":[[96,9]]},"455":{"position":[[796,9]]},"511":{"position":[[106,9],[311,9]]},"522":{"position":[[227,9]]},"523":{"position":[[206,9]]},"531":{"position":[[106,9],[311,9]]},"557":{"position":[[333,9]]},"567":{"position":[[1045,6]]},"591":{"position":[[106,9],[311,9]]},"614":{"position":[[774,9]]},"661":{"position":[[179,7]]},"666":{"position":[[41,10]]},"668":{"position":[[40,10]]},"679":{"position":[[141,9]]},"680":{"position":[[38,10]]},"763":{"position":[[19,9]]},"774":{"position":[[328,9]]},"786":{"position":[[103,6]]},"836":{"position":[[181,7]]},"837":{"position":[[47,7]]},"871":{"position":[[363,9]]},"876":{"position":[[129,9]]},"880":{"position":[[283,9]]},"922":{"position":[[80,9]]},"935":{"position":[[215,9]]},"960":{"position":[[110,9]]},"983":{"position":[[131,9]]},"988":{"position":[[103,10]]},"1067":{"position":[[1129,9],[1359,9]]},"1074":{"position":[[61,9]]},"1084":{"position":[[525,9]]},"1085":{"position":[[3283,9]]},"1102":{"position":[[1096,9]]},"1107":{"position":[[525,10]]},"1125":{"position":[[850,6]]},"1176":{"position":[[269,9]]},"1193":{"position":[[8,9]]},"1194":{"position":[[10,9]]},"1271":{"position":[[970,9],[1637,10]]},"1281":{"position":[[195,9]]},"1300":{"position":[[604,9]]}},"keywords":{}}],["followup",{"_index":3821,"title":{},"content":{"663":{"position":[[103,8]]},"712":{"position":[[122,8]]},"842":{"position":[[237,8]]}},"keywords":{}}],["foo",{"_index":3778,"title":{},"content":{"659":{"position":[[522,6],[603,5],[669,5]]},"662":{"position":[[2626,6]]},"683":{"position":[[198,5],[319,5],[913,5]]},"710":{"position":[[1933,6]]},"711":{"position":[[1368,7]]},"796":{"position":[[755,5],[954,5]]},"806":{"position":[[605,4],[684,4]]},"838":{"position":[[2840,6]]},"942":{"position":[[216,6]]},"943":{"position":[[424,6]]},"946":{"position":[[188,6]]},"947":{"position":[[206,6]]},"950":{"position":[[297,5]]},"1014":{"position":[[252,4],[391,4]]},"1015":{"position":[[228,4]]},"1018":{"position":[[131,3],[469,3],[508,3],[760,4],[876,4],[921,3],[943,4]]},"1035":{"position":[[130,6]]},"1065":{"position":[[254,5],[401,5],[829,9],[988,3],[1089,5],[1248,5],[1257,5],[1266,5],[1327,8]]},"1078":{"position":[[954,6],[1081,6]]},"1177":{"position":[[383,6]]},"1220":{"position":[[365,4],[585,5],[626,4]]},"1249":{"position":[[523,5]]}},"keywords":{}}],["foo(.*)0",{"_index":4642,"title":{},"content":{"796":{"position":[[887,10]]}},"keywords":{}}],["foo1",{"_index":5332,"title":{},"content":{"944":{"position":[[231,7]]}},"keywords":{}}],["foo2",{"_index":5334,"title":{},"content":{"944":{"position":[[267,7]]},"947":{"position":[[258,6]]}},"keywords":{}}],["foobar",{"_index":2927,"title":{},"content":{"439":{"position":[[702,7]]},"555":{"position":[[329,9],[523,8]]},"556":{"position":[[865,8]]},"649":{"position":[[383,9]]},"770":{"position":[[427,9],[523,8]]},"772":{"position":[[1052,8]]},"796":{"position":[[515,8]]},"826":{"position":[[422,8],[1084,6]]},"866":{"position":[[785,9]]},"988":{"position":[[5425,9],[5503,9]]},"1014":{"position":[[226,9],[365,9]]},"1015":{"position":[[202,9]]},"1018":{"position":[[850,9]]},"1041":{"position":[[358,8],[388,6]]},"1063":{"position":[[88,9]]},"1067":{"position":[[1332,8],[2011,8],[2155,8]]},"1125":{"position":[[593,11]]},"1252":{"position":[[170,9],[311,9]]}},"keywords":{}}],["foobar'}).exec",{"_index":5644,"title":{},"content":{"1023":{"position":[[711,18]]}},"keywords":{}}],["foobar.alic",{"_index":4929,"title":{},"content":{"866":{"position":[[752,14]]}},"keywords":{}}],["foobar2",{"_index":5676,"title":{},"content":{"1039":{"position":[[310,12],[361,9]]}},"keywords":{}}],["foobar@example.com",{"_index":5636,"title":{},"content":{"1022":{"position":[[1052,20]]}},"keywords":{}}],["foofa",{"_index":5768,"title":{},"content":{"1065":{"position":[[427,7]]}},"keywords":{}}],["foooobarnew",{"_index":5692,"title":{},"content":{"1042":{"position":[[192,14],[299,13]]}},"keywords":{}}],["footprint",{"_index":1129,"title":{},"content":{"141":{"position":[[23,9]]},"169":{"position":[[180,9]]},"174":{"position":[[2472,9]]},"316":{"position":[[25,10]]},"528":{"position":[[120,9]]}},"keywords":{}}],["for(const",{"_index":4632,"title":{},"content":{"795":{"position":[[139,9]]},"875":{"position":[[4595,9]]}},"keywords":{}}],["for="hero",{"_index":3504,"title":{},"content":{"580":{"position":[[769,14]]},"601":{"position":[[157,14]]},"602":{"position":[[532,14]]}},"keywords":{}}],["forbid",{"_index":5895,"title":{},"content":{"1085":{"position":[[2011,10]]}},"keywords":{}}],["forbidden",{"_index":5072,"title":{"881":{"position":[[0,11]]}},"content":{"881":{"position":[[203,10]]}},"keywords":{}}],["forc",{"_index":1988,"title":{},"content":{"350":{"position":[[106,6]]},"412":{"position":[[1677,6],[11904,5]]},"569":{"position":[[702,6]]},"839":{"position":[[374,6]]},"990":{"position":[[1155,5]]}},"keywords":{}}],["forefront",{"_index":3247,"title":{},"content":{"510":{"position":[[685,9]]}},"keywords":{}}],["foreign",{"_index":2021,"title":{},"content":{"354":{"position":[[504,7]]},"705":{"position":[[809,7]]},"808":{"position":[[390,7]]},"810":{"position":[[149,7]]}},"keywords":{}}],["forev",{"_index":2729,"title":{},"content":{"412":{"position":[[8203,8]]},"697":{"position":[[107,8]]}},"keywords":{}}],["forget",{"_index":4432,"title":{},"content":{"749":{"position":[[23677,6]]},"872":{"position":[[3534,6]]},"1097":{"position":[[263,6]]},"1213":{"position":[[738,6]]}},"keywords":{}}],["forgiv",{"_index":1658,"title":{},"content":{"282":{"position":[[152,9]]}},"keywords":{}}],["fork",{"_index":267,"title":{},"content":{"16":{"position":[[1,6]]},"835":{"position":[[725,4]]},"987":{"position":[[794,4]]},"1309":{"position":[[1007,4]]}},"keywords":{}}],["fork/client",{"_index":5434,"title":{},"content":{"982":{"position":[[68,11],[254,11]]},"987":{"position":[[219,11],[724,11]]}},"keywords":{}}],["form",{"_index":1989,"title":{},"content":{"350":{"position":[[243,5]]},"390":{"position":[[92,4]]},"391":{"position":[[862,4]]},"396":{"position":[[492,7]]},"455":{"position":[[430,4]]},"489":{"position":[[410,6]]},"496":{"position":[[504,6]]},"1228":{"position":[[109,4]]}},"keywords":{}}],["formal",{"_index":4813,"title":{},"content":{"841":{"position":[[1168,6]]}},"keywords":{}}],["format",{"_index":1224,"title":{"1289":{"position":[[7,8]]},"1290":{"position":[[11,7]]},"1291":{"position":[[16,7]]}},"content":{"174":{"position":[[2439,7]]},"236":{"position":[[61,7]]},"316":{"position":[[362,7]]},"364":{"position":[[195,7],[318,6]]},"367":{"position":[[93,6],[1011,7]]},"382":{"position":[[213,8]]},"398":{"position":[[46,7]]},"454":{"position":[[34,6]]},"459":{"position":[[113,6]]},"612":{"position":[[1511,6]]},"636":{"position":[[257,8]]},"686":{"position":[[229,6]]},"702":{"position":[[139,6]]},"717":{"position":[[985,6]]},"839":{"position":[[965,6]]},"875":{"position":[[1484,6],[1716,7]]},"904":{"position":[[1055,7]]},"936":{"position":[[91,7],[155,6]]},"1085":{"position":[[370,6]]},"1104":{"position":[[348,6]]},"1266":{"position":[[1022,7]]},"1289":{"position":[[53,7],[74,7],[104,7]]}},"keywords":{}}],["formatteddata",{"_index":3602,"title":{},"content":{"612":{"position":[[2089,13]]}},"keywords":{}}],["forum",{"_index":4978,"title":{},"content":{"873":{"position":[[181,5]]}},"keywords":{}}],["forward",{"_index":4856,"title":{},"content":{"849":{"position":[[1048,9]]}},"keywords":{}}],["found",{"_index":349,"title":{},"content":{"20":{"position":[[99,7]]},"396":{"position":[[855,5]]},"421":{"position":[[160,5]]},"543":{"position":[[73,5]]},"603":{"position":[[71,5]]},"620":{"position":[[297,5]]},"749":{"position":[[22045,6]]},"810":{"position":[[181,6]]},"825":{"position":[[1116,5]]},"1057":{"position":[[546,5]]},"1059":{"position":[[343,5]]},"1060":{"position":[[201,5]]},"1061":{"position":[[244,5]]},"1062":{"position":[[13,5]]},"1208":{"position":[[1986,5]]},"1296":{"position":[[229,6]]}},"keywords":{}}],["foundat",{"_index":1159,"title":{},"content":{"151":{"position":[[422,10]]},"267":{"position":[[1580,10]]},"503":{"position":[[199,10]]},"530":{"position":[[449,12]]}},"keywords":{}}],["foundationdb",{"_index":2112,"title":{"1131":{"position":[[24,12]]}},"content":{"365":{"position":[[1551,12]]},"772":{"position":[[192,12],[227,12],[446,12],[553,12],[738,14],[1222,12],[1832,12]]},"774":{"position":[[350,12],[543,14]]},"793":{"position":[[380,12]]},"1072":{"position":[[1818,13]]},"1095":{"position":[[136,12]]},"1124":{"position":[[454,12],[541,12]]},"1132":{"position":[[22,13],[87,12],[130,12]]},"1133":{"position":[[13,12],[75,12],[108,12],[162,13],[232,12],[325,12],[526,13]]},"1134":{"position":[[105,14],[243,12],[268,12],[448,12]]},"1135":{"position":[[9,12],[302,12]]},"1198":{"position":[[1413,12]]},"1247":{"position":[[592,13],[643,12]]},"1320":{"position":[[807,13]]}},"keywords":{}}],["foundationdb.observ",{"_index":6029,"title":{},"content":{"1132":{"position":[[841,23]]}},"keywords":{}}],["foundationdb@1.1.4",{"_index":6038,"title":{},"content":{"1133":{"position":[[431,18]]}},"keywords":{}}],["founddocu",{"_index":1639,"title":{},"content":{"276":{"position":[[382,14]]},"724":{"position":[[1613,14],[1795,14]]}},"keywords":{}}],["four",{"_index":5255,"title":{},"content":{"904":{"position":[[264,4]]}},"keywords":{}}],["fraction",{"_index":2067,"title":{},"content":{"358":{"position":[[813,8]]}},"keywords":{}}],["frame",{"_index":2555,"title":{},"content":{"408":{"position":[[3034,6]]},"571":{"position":[[1627,6]]},"703":{"position":[[1577,6]]}},"keywords":{}}],["framework",{"_index":250,"title":{"94":{"position":[[35,11]]},"222":{"position":[[35,11]]},"286":{"position":[[14,10]]},"492":{"position":[[25,11]]}},"content":{"15":{"position":[[131,9],[303,10]]},"17":{"position":[[162,11]]},"38":{"position":[[34,9]]},"94":{"position":[[81,10],[275,10]]},"116":{"position":[[34,9]]},"173":{"position":[[2189,11],[2282,10],[2412,10]]},"174":{"position":[[1423,10]]},"177":{"position":[[207,9]]},"179":{"position":[[102,11]]},"201":{"position":[[363,9]]},"222":{"position":[[98,10],[259,11]]},"230":{"position":[[141,10]]},"284":{"position":[[177,11]]},"286":{"position":[[52,11],[373,9]]},"313":{"position":[[87,10]]},"352":{"position":[[230,10]]},"360":{"position":[[96,10]]},"411":{"position":[[5196,10]]},"445":{"position":[[1683,11],[1758,10],[1893,11],[1995,11]]},"446":{"position":[[1125,10],[1281,11]]},"447":{"position":[[221,10]]},"606":{"position":[[264,10]]},"624":{"position":[[447,11],[952,10]]},"729":{"position":[[55,11]]},"730":{"position":[[70,10]]},"824":{"position":[[203,10]]},"828":{"position":[[120,10]]},"831":{"position":[[337,11]]},"890":{"position":[[406,9]]},"1118":{"position":[[172,9]]},"1202":{"position":[[55,11]]}},"keywords":{}}],["free",{"_index":607,"title":{"781":{"position":[[19,5]]}},"content":{"38":{"position":[[1064,4]]},"40":{"position":[[31,4]]},"51":{"position":[[45,4]]},"262":{"position":[[249,4]]},"295":{"position":[[273,4]]},"298":{"position":[[550,4]]},"299":{"position":[[268,4],[774,4],[1128,4]]},"302":{"position":[[639,4],[961,4]]},"315":{"position":[[59,5],[138,4]]},"408":{"position":[[998,4]]},"411":{"position":[[568,7],[1568,5]]},"412":{"position":[[3691,4]]},"476":{"position":[[228,6]]},"538":{"position":[[46,4]]},"554":{"position":[[57,4]]},"598":{"position":[[46,4]]},"661":{"position":[[346,4]]},"686":{"position":[[896,4]]},"689":{"position":[[43,4]]},"698":{"position":[[3026,4]]},"717":{"position":[[53,4]]},"772":{"position":[[1792,4]]},"801":{"position":[[467,4]]},"955":{"position":[[74,4]]},"976":{"position":[[50,4]]},"977":{"position":[[51,4]]},"1143":{"position":[[42,5]]},"1151":{"position":[[98,4]]},"1178":{"position":[[98,4]]},"1198":{"position":[[316,5],[1995,4]]},"1235":{"position":[[138,6]]},"1321":{"position":[[106,4]]}},"keywords":{}}],["freedom",{"_index":1302,"title":{"202":{"position":[[3,7]]},"249":{"position":[[3,7]]}},"content":{"263":{"position":[[73,7]]}},"keywords":{}}],["freeli",{"_index":1932,"title":{},"content":{"330":{"position":[[113,6]]}},"keywords":{}}],["frequenc",{"_index":3566,"title":{},"content":{"611":{"position":[[571,9]]}},"keywords":{}}],["frequent",{"_index":905,"title":{},"content":{"65":{"position":[[198,10]]},"87":{"position":[[81,10]]},"141":{"position":[[274,10]]},"166":{"position":[[216,10]]},"173":{"position":[[686,10]]},"204":{"position":[[337,10]]},"216":{"position":[[75,10]]},"220":{"position":[[304,8]]},"342":{"position":[[19,10]]},"346":{"position":[[784,8]]},"352":{"position":[[15,10]]},"354":{"position":[[821,10],[1691,8]]},"376":{"position":[[247,10],[579,8]]},"411":{"position":[[658,8]]},"430":{"position":[[897,8]]},"497":{"position":[[661,8]]},"570":{"position":[[638,8]]},"587":{"position":[[24,10]]},"622":{"position":[[472,10]]},"623":{"position":[[521,8]]},"624":{"position":[[514,8]]},"690":{"position":[[266,8]]},"836":{"position":[[2147,11]]}},"keywords":{}}],["fresh",{"_index":3129,"title":{},"content":{"481":{"position":[[135,5]]}},"keywords":{}}],["friction",{"_index":1997,"title":{},"content":{"351":{"position":[[330,8]]},"353":{"position":[[793,8]]},"354":{"position":[[1679,8]]}},"keywords":{}}],["friend",{"_index":2602,"title":{},"content":{"410":{"position":[[1657,6]]},"808":{"position":[[620,8]]},"813":{"position":[[143,8],[293,8],[399,7]]}},"keywords":{}}],["friendli",{"_index":938,"title":{"387":{"position":[[10,8]]}},"content":{"65":{"position":[[2113,9]]},"83":{"position":[[398,8]]},"364":{"position":[[12,13]]},"473":{"position":[[189,9]]},"839":{"position":[[347,8],[1154,9]]}},"keywords":{}}],["fromobservable(ob",{"_index":6003,"title":{},"content":{"1118":{"position":[[541,19]]}},"keywords":{}}],["fromobservable(observ",{"_index":839,"title":{},"content":{"55":{"position":[[467,27]]}},"keywords":{}}],["front",{"_index":662,"title":{"225":{"position":[[45,5]]}},"content":{"42":{"position":[[293,5]]},"43":{"position":[[341,5]]},"218":{"position":[[54,5]]},"350":{"position":[[289,5]]},"351":{"position":[[235,5]]},"360":{"position":[[86,5]]},"849":{"position":[[746,5]]},"1088":{"position":[[767,5]]},"1208":{"position":[[589,5]]}},"keywords":{}}],["frontend",{"_index":262,"title":{"213":{"position":[[16,8],[61,8]]},"214":{"position":[[40,9]]},"229":{"position":[[31,9]]}},"content":{"15":{"position":[[433,9]]},"18":{"position":[[81,8]]},"26":{"position":[[244,8]]},"27":{"position":[[68,8],[262,8]]},"38":{"position":[[568,8],[648,8]]},"215":{"position":[[44,8],[105,8]]},"216":{"position":[[1,8]]},"217":{"position":[[21,8]]},"219":{"position":[[1,8],[202,9]]},"220":{"position":[[1,8]]},"221":{"position":[[118,8]]},"222":{"position":[[1,8],[329,8]]},"223":{"position":[[40,8],[131,8],[311,8]]},"224":{"position":[[1,8]]},"225":{"position":[[92,9],[166,8]]},"226":{"position":[[215,8],[331,8],[445,8]]},"227":{"position":[[163,8]]},"228":{"position":[[164,8]]},"229":{"position":[[20,8],[134,8],[204,8]]},"232":{"position":[[57,8]]},"233":{"position":[[253,8]]},"234":{"position":[[274,8]]},"235":{"position":[[253,8]]},"236":{"position":[[330,8]]},"239":{"position":[[293,8]]},"241":{"position":[[63,8],[378,8],[434,8],[665,8]]},"373":{"position":[[63,8],[687,8]]},"411":{"position":[[1873,9]]},"412":{"position":[[9138,9],[9183,8]]},"860":{"position":[[192,8]]},"890":{"position":[[542,8]]},"1320":{"position":[[41,9],[228,8],[446,8]]}},"keywords":{}}],["frontend+backend",{"_index":2659,"title":{},"content":{"412":{"position":[[870,16]]}},"keywords":{}}],["frustratingli",{"_index":2855,"title":{},"content":{"421":{"position":[[880,13]]}},"keywords":{}}],["fs",{"_index":4577,"title":{},"content":{"772":{"position":[[2227,2]]},"1176":{"position":[[250,2],[374,3]]}},"keywords":{}}],["fuel",{"_index":2565,"title":{},"content":{"408":{"position":[[4301,7]]}},"keywords":{}}],["fulfil",{"_index":2622,"title":{},"content":{"411":{"position":[[2655,8]]}},"keywords":{}}],["full",{"_index":49,"title":{"394":{"position":[[37,4]]}},"content":{"2":{"position":[[421,4]]},"6":{"position":[[586,4],[784,4]]},"10":{"position":[[382,4]]},"36":{"position":[[220,4]]},"39":{"position":[[349,4]]},"40":{"position":[[308,4]]},"51":{"position":[[1009,4]]},"83":{"position":[[442,4]]},"205":{"position":[[217,4]]},"222":{"position":[[307,4]]},"241":{"position":[[416,4]]},"252":{"position":[[216,4]]},"285":{"position":[[374,4]]},"302":{"position":[[31,4]]},"357":{"position":[[466,4]]},"392":{"position":[[4902,4]]},"394":{"position":[[1358,4]]},"398":{"position":[[115,4]]},"402":{"position":[[1380,4]]},"411":{"position":[[4112,4],[5047,4]]},"412":{"position":[[10451,4],[11912,4],[13650,4],[13712,4],[14644,4]]},"432":{"position":[[969,4]]},"447":{"position":[[678,4]]},"461":{"position":[[250,4],[1407,4]]},"468":{"position":[[494,4]]},"480":{"position":[[146,4]]},"567":{"position":[[71,4]]},"574":{"position":[[734,4]]},"611":{"position":[[22,4]]},"621":{"position":[[50,4]]},"626":{"position":[[220,4]]},"644":{"position":[[494,4]]},"690":{"position":[[57,4]]},"696":{"position":[[131,4]]},"775":{"position":[[568,4]]},"800":{"position":[[362,4]]},"824":{"position":[[64,4],[99,4]]},"832":{"position":[[17,4]]},"839":{"position":[[487,4]]},"875":{"position":[[1991,4],[5714,4]]},"890":{"position":[[984,4]]},"985":{"position":[[190,4]]},"994":{"position":[[90,4]]},"1004":{"position":[[403,4]]},"1067":{"position":[[708,4]]},"1072":{"position":[[440,4]]},"1147":{"position":[[304,4]]},"1149":{"position":[[5,4]]},"1198":{"position":[[820,4]]},"1219":{"position":[[228,4]]},"1271":{"position":[[293,4],[592,4],[644,4],[687,4]]},"1284":{"position":[[108,4]]},"1318":{"position":[[1160,4]]}},"keywords":{}}],["fulli",{"_index":582,"title":{"248":{"position":[[3,5]]}},"content":{"37":{"position":[[316,5],[392,5]]},"201":{"position":[[100,5]]},"248":{"position":[[149,5]]},"280":{"position":[[239,5]]},"312":{"position":[[28,5]]},"404":{"position":[[131,5]]},"412":{"position":[[200,5]]},"451":{"position":[[569,5]]},"452":{"position":[[399,5]]},"576":{"position":[[221,5]]},"700":{"position":[[482,5]]},"723":{"position":[[2004,5]]},"740":{"position":[[162,5]]},"749":{"position":[[2695,5]]},"829":{"position":[[3845,5]]},"837":{"position":[[476,5]]},"855":{"position":[[28,5]]},"860":{"position":[[395,5]]},"867":{"position":[[28,5]]},"901":{"position":[[757,5]]},"903":{"position":[[262,5]]},"904":{"position":[[166,5]]},"981":{"position":[[1274,5]]},"1047":{"position":[[183,5]]},"1067":{"position":[[904,5],[1812,5],[2233,5]]},"1068":{"position":[[14,5]]},"1214":{"position":[[825,5]]},"1301":{"position":[[1527,5]]}},"keywords":{}}],["fulltext",{"_index":4038,"title":{"722":{"position":[[0,8]]},"723":{"position":[[26,8]]},"724":{"position":[[15,8]]},"1023":{"position":[[9,8]]}},"content":{"723":{"position":[[512,8],[1143,8],[1344,8],[2506,8]]},"724":{"position":[[1219,8]]},"793":{"position":[[1159,8]]},"1023":{"position":[[70,8],[160,8]]}},"keywords":{}}],["fun",{"_index":3964,"title":{},"content":{"702":{"position":[[534,4]]}},"keywords":{}}],["function",{"_index":151,"title":{"747":{"position":[[21,10]]},"937":{"position":[[4,10]]},"940":{"position":[[0,10]]},"1037":{"position":[[0,10]]}},"content":{"11":{"position":[[326,8],[518,8],[684,8]]},"19":{"position":[[328,10]]},"21":{"position":[[72,9]]},"46":{"position":[[49,8]]},"51":{"position":[[641,8]]},"55":{"position":[[357,8]]},"122":{"position":[[337,8]]},"133":{"position":[[99,8]]},"151":{"position":[[209,14]]},"160":{"position":[[57,8]]},"164":{"position":[[87,8]]},"183":{"position":[[104,8]]},"188":{"position":[[894,8]]},"193":{"position":[[74,13]]},"201":{"position":[[249,10]]},"209":{"position":[[205,8]]},"248":{"position":[[155,10]]},"255":{"position":[[552,8]]},"273":{"position":[[288,11]]},"274":{"position":[[125,8]]},"280":{"position":[[76,8],[245,10]]},"292":{"position":[[34,14],[201,11]]},"309":{"position":[[9,13]]},"312":{"position":[[16,11]]},"314":{"position":[[438,8]]},"315":{"position":[[389,8]]},"320":{"position":[[230,14]]},"327":{"position":[[126,9]]},"334":{"position":[[290,8]]},"335":{"position":[[171,8]]},"375":{"position":[[59,14]]},"383":{"position":[[85,13]]},"390":{"position":[[1875,9]]},"391":{"position":[[308,9],[568,8],[760,8]]},"392":{"position":[[4035,8]]},"393":{"position":[[329,9]]},"394":{"position":[[151,9]]},"398":{"position":[[685,8],[1931,8]]},"412":{"position":[[2391,9],[4408,9]]},"414":{"position":[[289,11]]},"419":{"position":[[450,9]]},"420":{"position":[[1210,13]]},"430":{"position":[[969,8]]},"444":{"position":[[314,14],[879,13]]},"445":{"position":[[592,13]]},"446":{"position":[[99,14]]},"447":{"position":[[59,13]]},"480":{"position":[[296,8]]},"482":{"position":[[386,8]]},"494":{"position":[[164,8]]},"500":{"position":[[178,8]]},"502":{"position":[[427,10]]},"516":{"position":[[67,8]]},"529":{"position":[[109,13]]},"534":{"position":[[251,10]]},"541":{"position":[[217,8]]},"542":{"position":[[745,8]]},"554":{"position":[[811,8]]},"556":{"position":[[342,8]]},"559":{"position":[[237,8]]},"562":{"position":[[127,8],[1088,8]]},"563":{"position":[[428,8]]},"564":{"position":[[401,8]]},"579":{"position":[[299,8]]},"584":{"position":[[33,8]]},"594":{"position":[[249,10]]},"598":{"position":[[399,8]]},"610":{"position":[[904,8]]},"616":{"position":[[1071,13]]},"632":{"position":[[1177,8],[2180,8]]},"650":{"position":[[80,14]]},"672":{"position":[[7,8]]},"673":{"position":[[50,8]]},"674":{"position":[[321,8]]},"675":{"position":[[208,9]]},"693":{"position":[[315,9],[875,8]]},"703":{"position":[[858,9]]},"723":{"position":[[2663,8]]},"724":{"position":[[424,9]]},"747":{"position":[[52,9]]},"749":{"position":[[7505,8],[8074,8],[8375,8],[12025,9],[14194,8]]},"751":{"position":[[207,8],[279,8]]},"761":{"position":[[393,8]]},"766":{"position":[[224,9]]},"789":{"position":[[15,10],[101,10],[128,8],[241,11],[488,11]]},"791":{"position":[[97,11],[356,11]]},"792":{"position":[[228,11]]},"802":{"position":[[432,15]]},"805":{"position":[[36,8],[117,8]]},"806":{"position":[[16,9]]},"815":{"position":[[139,8]]},"818":{"position":[[51,8],[421,8],[573,11]]},"829":{"position":[[597,8]]},"846":{"position":[[1450,10]]},"848":{"position":[[559,8],[820,8],[1455,8]]},"860":{"position":[[401,10]]},"862":{"position":[[1685,13]]},"872":{"position":[[2787,13]]},"875":{"position":[[236,8],[5724,8]]},"886":{"position":[[91,8]]},"888":{"position":[[575,9]]},"889":{"position":[[605,8],[799,10],[836,9]]},"890":{"position":[[146,10],[774,9]]},"898":{"position":[[1341,8],[4603,13]]},"902":{"position":[[669,11]]},"904":{"position":[[1574,8]]},"907":{"position":[[179,8]]},"908":{"position":[[256,9]]},"934":{"position":[[342,9],[403,9],[462,9],[674,13],[751,12]]},"937":{"position":[[74,9]]},"950":{"position":[[377,12]]},"952":{"position":[[10,8]]},"953":{"position":[[56,9]]},"956":{"position":[[26,8]]},"958":{"position":[[711,8]]},"960":{"position":[[65,8]]},"968":{"position":[[107,8],[214,8],[239,8],[334,8],[405,8]]},"971":{"position":[[10,8]]},"972":{"position":[[55,9]]},"988":{"position":[[5173,8]]},"992":{"position":[[5,8]]},"1007":{"position":[[1220,8],[1795,8],[2055,8]]},"1020":{"position":[[254,8]]},"1030":{"position":[[114,8]]},"1035":{"position":[[85,9]]},"1036":{"position":[[78,9]]},"1039":{"position":[[6,8]]},"1040":{"position":[[122,9]]},"1042":{"position":[[37,8]]},"1060":{"position":[[29,8]]},"1061":{"position":[[30,8]]},"1069":{"position":[[299,8]]},"1085":{"position":[[2158,10]]},"1097":{"position":[[149,8]]},"1105":{"position":[[36,8],[593,8]]},"1106":{"position":[[38,8],[527,8]]},"1115":{"position":[[85,8],[839,8]]},"1125":{"position":[[74,8]]},"1139":{"position":[[230,9]]},"1140":{"position":[[381,8]]},"1145":{"position":[[222,9]]},"1146":{"position":[[202,9]]},"1151":{"position":[[840,8]]},"1178":{"position":[[837,8]]},"1211":{"position":[[351,8]]},"1218":{"position":[[105,8],[183,8],[220,8]]},"1219":{"position":[[43,9]]},"1229":{"position":[[66,8]]},"1268":{"position":[[66,8]]},"1279":{"position":[[238,8]]},"1280":{"position":[[198,8]]},"1282":{"position":[[522,9],[663,8],[859,8]]},"1291":{"position":[[101,8]]},"1307":{"position":[[876,9]]},"1309":{"position":[[53,10]]},"1311":{"position":[[1143,8]]},"1319":{"position":[[300,8]]},"1320":{"position":[[673,14]]},"1322":{"position":[[500,9]]}},"keywords":{}}],["function"",{"_index":2681,"title":{},"content":{"412":{"position":[[3539,14]]}},"keywords":{}}],["function(authdata",{"_index":5971,"title":{},"content":{"1109":{"position":[[191,18]]}},"keywords":{}}],["function(docdata",{"_index":2497,"title":{},"content":{"403":{"position":[[808,18]]}},"keywords":{}}],["function(ev",{"_index":3570,"title":{},"content":{"611":{"position":[[693,15],[837,15]]}},"keywords":{}}],["function(olddoc",{"_index":4444,"title":{},"content":{"751":{"position":[[617,17],[860,17],[1098,17],[1719,17],[1926,17]]},"752":{"position":[[531,17]]},"754":{"position":[[268,17],[414,17],[573,17]]}},"keywords":{}}],["function(thi",{"_index":6501,"title":{},"content":{"1311":{"position":[[670,14],[859,14]]}},"keywords":{}}],["functionality.run",{"_index":1209,"title":{},"content":{"173":{"position":[[2463,21]]}},"keywords":{}}],["fund",{"_index":605,"title":{},"content":{"38":{"position":[[1029,8]]}},"keywords":{}}],["fundament",{"_index":1630,"title":{},"content":{"270":{"position":[[32,11]]},"408":{"position":[[2702,11]]},"525":{"position":[[33,11]]}},"keywords":{}}],["funnel",{"_index":2618,"title":{},"content":{"411":{"position":[[2402,6]]}},"keywords":{}}],["further",{"_index":688,"title":{"1302":{"position":[[0,7]]}},"content":{"43":{"position":[[722,7]]},"137":{"position":[[63,7]]},"175":{"position":[[4,7]]},"241":{"position":[[4,7]]},"283":{"position":[[379,7]]},"299":{"position":[[674,8]]},"373":{"position":[[4,7]]},"377":{"position":[[365,7]]},"391":{"position":[[920,7]]},"419":{"position":[[1818,7]]},"467":{"position":[[419,7]]},"490":{"position":[[676,7]]},"624":{"position":[[1051,7]]},"643":{"position":[[154,7]]},"648":{"position":[[333,7]]},"849":{"position":[[183,7]]},"1120":{"position":[[498,7]]},"1198":{"position":[[945,8]]},"1296":{"position":[[1627,7]]},"1324":{"position":[[803,7]]}},"keywords":{}}],["furthermor",{"_index":2240,"title":{},"content":{"392":{"position":[[2231,12]]},"500":{"position":[[692,12]]}},"keywords":{}}],["futur",{"_index":331,"title":{"404":{"position":[[9,6]]},"406":{"position":[[32,6]]},"421":{"position":[[23,7]]},"470":{"position":[[0,6]]}},"content":{"19":{"position":[[430,7]]},"404":{"position":[[108,7]]},"408":{"position":[[4089,6]]},"420":{"position":[[912,6]]},"470":{"position":[[283,7],[458,7]]},"500":{"position":[[30,6]]},"620":{"position":[[583,6]]},"624":{"position":[[1188,6]]},"644":{"position":[[645,6]]},"786":{"position":[[179,6]]},"839":{"position":[[1083,6]]},"1100":{"position":[[306,7]]}},"keywords":{}}],["gain",{"_index":1541,"title":{"408":{"position":[[19,7]]}},"content":{"247":{"position":[[131,4]]},"412":{"position":[[9587,5]]},"420":{"position":[[1096,5]]},"446":{"position":[[1173,6]]},"483":{"position":[[209,5]]}},"keywords":{}}],["game",{"_index":1634,"title":{},"content":{"274":{"position":[[47,4]]},"375":{"position":[[456,6]]},"399":{"position":[[263,6],[559,6]]},"445":{"position":[[59,4]]},"611":{"position":[[310,7]]},"613":{"position":[[455,7]]},"624":{"position":[[790,6]]},"699":{"position":[[646,4]]},"1006":{"position":[[48,4],[263,4]]},"1007":{"position":[[956,4]]}},"keywords":{}}],["gap",{"_index":1935,"title":{},"content":{"331":{"position":[[238,4]]},"408":{"position":[[5147,3]]},"438":{"position":[[235,4]]},"502":{"position":[[534,4]]},"576":{"position":[[340,3]]},"1123":{"position":[[699,3]]}},"keywords":{}}],["garner",{"_index":3250,"title":{},"content":{"513":{"position":[[43,8]]}},"keywords":{}}],["gather",{"_index":5960,"title":{},"content":{"1105":{"position":[[1165,6]]}},"keywords":{}}],["gb",{"_index":1744,"title":{},"content":{"299":{"position":[[312,2],[324,2],[426,2],[601,2],[900,3]]},"408":{"position":[[1034,2]]}},"keywords":{}}],["gcm",{"_index":4035,"title":{},"content":{"718":{"position":[[536,4]]}},"keywords":{}}],["gdpr",{"_index":3335,"title":{},"content":{"550":{"position":[[414,4]]}},"keywords":{}}],["gen",{"_index":6398,"title":{},"content":{"1292":{"position":[[167,3]]}},"keywords":{}}],["gender",{"_index":4651,"title":{},"content":{"798":{"position":[[396,6],[434,10],[482,9],[596,7],[763,10],[889,9],[918,10]]},"1066":{"position":[[402,7],[569,10],[695,9],[724,10]]}},"keywords":{}}],["gener",{"_index":1631,"title":{"391":{"position":[[0,10]]},"828":{"position":[[0,7]]}},"content":{"270":{"position":[[147,9]]},"299":{"position":[[835,9],[1145,9]]},"392":{"position":[[1872,9],[2009,8],[2540,9],[3395,10]]},"398":{"position":[[313,9]]},"412":{"position":[[9744,9]]},"454":{"position":[[387,9]]},"456":{"position":[[171,8]]},"461":{"position":[[691,9]]},"612":{"position":[[810,9],[958,7],[1221,7]]},"622":{"position":[[415,9]]},"623":{"position":[[508,9]]},"624":{"position":[[1598,9]]},"661":{"position":[[169,9]]},"709":{"position":[[922,9]]},"711":{"position":[[1843,8]]},"836":{"position":[[171,9]]},"837":{"position":[[698,7]]},"841":{"position":[[904,9]]},"889":{"position":[[994,8]]},"912":{"position":[[561,9]]},"1072":{"position":[[1741,9]]},"1098":{"position":[[146,7]]},"1192":{"position":[[619,7]]},"1276":{"position":[[171,7]]},"1316":{"position":[[2146,9],[3647,7]]},"1322":{"position":[[280,9]]}},"keywords":{}}],["geniu",{"_index":790,"title":{},"content":{"52":{"position":[[134,7]]},"539":{"position":[[134,7]]},"599":{"position":[[143,7]]}},"keywords":{}}],["genuin",{"_index":2518,"title":{},"content":{"407":{"position":[[456,7]]}},"keywords":{}}],["geoloc",{"_index":2822,"title":{},"content":{"419":{"position":[[1785,11]]}},"keywords":{}}],["german",{"_index":3024,"title":{},"content":{"462":{"position":[[586,6]]}},"keywords":{}}],["get",{"_index":1074,"title":{"119":{"position":[[0,7]]},"154":{"position":[[0,7]]},"180":{"position":[[0,7]]},"256":{"position":[[0,7]]},"272":{"position":[[0,7]]},"324":{"position":[[0,7]]},"502":{"position":[[0,7]]},"577":{"position":[[0,7]]},"669":{"position":[[0,7]]}},"content":{"285":{"position":[[1,7]]},"393":{"position":[[753,4]]},"412":{"position":[[12183,4]]},"698":{"position":[[872,4]]},"751":{"position":[[294,4]]},"793":{"position":[[19,7]]},"805":{"position":[[126,4]]},"818":{"position":[[111,4]]},"875":{"position":[[3664,4]]},"886":{"position":[[105,4],[3358,4]]},"921":{"position":[[1,4],[112,4]]},"968":{"position":[[248,4]]},"983":{"position":[[485,4]]},"986":{"position":[[1108,4]]},"1078":{"position":[[46,4]]},"1104":{"position":[[276,4]]},"1105":{"position":[[138,4]]},"1115":{"position":[[99,4]]},"1154":{"position":[[20,4]]},"1233":{"position":[[206,4]]},"1295":{"position":[[1070,7],[1223,7]]},"1307":{"position":[[365,4]]},"1315":{"position":[[1447,4]]}},"keywords":{}}],["get/put",{"_index":731,"title":{},"content":{"47":{"position":[[515,7]]}},"keywords":{}}],["get/set",{"_index":3440,"title":{},"content":{"566":{"position":[[224,7]]}},"keywords":{}}],["getajv",{"_index":6388,"title":{},"content":{"1290":{"position":[[10,6],[65,9]]}},"keywords":{}}],["getal",{"_index":2960,"title":{},"content":{"452":{"position":[[527,8]]},"1294":{"position":[[104,8],[409,8],[754,9],[2101,9]]}},"keywords":{}}],["getallkey",{"_index":6424,"title":{},"content":{"1294":{"position":[[429,13]]}},"keywords":{}}],["getattach",{"_index":5297,"title":{"919":{"position":[[0,16]]}},"content":{},"keywords":{}}],["getattachmentdata",{"_index":4123,"title":{},"content":{"746":{"position":[[761,18]]}},"keywords":{}}],["getchangeddocumentssinc",{"_index":4124,"title":{},"content":{"746":{"position":[[786,25]]}},"keywords":{}}],["getconnectionhandlersimplep",{"_index":1363,"title":{},"content":{"210":{"position":[[172,30],[360,32]]},"261":{"position":[[240,30],[489,32]]},"904":{"position":[[1331,30],[1679,30],[2559,32]]},"906":{"position":[[851,33]]},"911":{"position":[[687,32]]},"1121":{"position":[[355,30],[715,35]]}},"keywords":{}}],["getcrdtschemapart",{"_index":3872,"title":{},"content":{"680":{"position":[[351,18],[972,19]]}},"keywords":{}}],["getcrdtschemapart()set",{"_index":3870,"title":{},"content":{"680":{"position":[[165,22]]}},"keywords":{}}],["getdata",{"_index":5306,"title":{"930":{"position":[[0,10]]}},"content":{},"keywords":{}}],["getdatabas",{"_index":168,"title":{},"content":{"11":{"position":[[693,14]]},"829":{"position":[[606,13],[1359,11],[1529,14]]}},"keywords":{}}],["getdatabase64",{"_index":5294,"title":{"931":{"position":[[0,16]]}},"content":{"917":{"position":[[592,15]]}},"keywords":{}}],["getdatabaseconnect",{"_index":6364,"title":{},"content":{"1281":{"position":[[74,21],[116,21],[217,22]]}},"keywords":{}}],["getdatabasepassword",{"_index":3363,"title":{},"content":{"556":{"position":[[351,21]]}},"keywords":{}}],["getdoc",{"_index":4881,"title":{},"content":{"857":{"position":[[214,8]]}},"keywords":{}}],["getdocs(query(firestorecollect",{"_index":4883,"title":{},"content":{"857":{"position":[[303,36]]}},"keywords":{}}],["getembedding(doc.text",{"_index":2380,"title":{},"content":{"397":{"position":[[1890,23]]}},"keywords":{}}],["getembedding(docdata.bodi",{"_index":2498,"title":{},"content":{"403":{"position":[[851,27]]}},"keywords":{}}],["getembeddingfromtext",{"_index":2212,"title":{},"content":{"391":{"position":[[285,22]]}},"keywords":{}}],["getembeddingfromtext(text",{"_index":2221,"title":{},"content":{"391":{"position":[[577,26]]}},"keywords":{}}],["getembeddingfromtext(userinput",{"_index":2310,"title":{},"content":{"394":{"position":[[651,32]]}},"keywords":{}}],["getfetchwithcouchdbauthor",{"_index":4842,"title":{},"content":{"848":{"position":[[1083,34],[1193,32]]}},"keywords":{}}],["getfetchwithcouchdbauthorization('myusernam",{"_index":4843,"title":{},"content":{"848":{"position":[[1480,46]]}},"keywords":{}}],["getfirestor",{"_index":4863,"title":{},"content":{"854":{"position":[[143,13]]}},"keywords":{}}],["getfirestore(app",{"_index":4869,"title":{},"content":{"854":{"position":[[374,18]]}},"keywords":{}}],["getitem",{"_index":2868,"title":{},"content":{"425":{"position":[[176,8],[347,7]]},"451":{"position":[[203,8]]},"835":{"position":[[437,9]]}},"keywords":{}}],["getitem())rxdb",{"_index":3421,"title":{},"content":{"560":{"position":[[595,16]]}},"keywords":{}}],["getitem/setitem",{"_index":4805,"title":{},"content":{"841":{"position":[[280,15]]}},"keywords":{}}],["getlatest",{"_index":5701,"title":{"1045":{"position":[[0,12]]}},"content":{},"keywords":{}}],["getleaderelectorbybroadcastchannel",{"_index":4105,"title":{},"content":{"740":{"position":[[425,34]]}},"keywords":{}}],["getleaderelectorbybroadcastchannel(broadcastchannel",{"_index":4107,"title":{},"content":{"740":{"position":[[521,53]]}},"keywords":{}}],["getloc",{"_index":5604,"title":{"1016":{"position":[[0,11]]},"1017":{"position":[[0,12]]}},"content":{"1017":{"position":[[6,10]]}},"keywords":{}}],["getlocalstoragemetaoptimizerrxstorag",{"_index":6092,"title":{},"content":{"1154":{"position":[[207,37],[482,39]]},"1238":{"position":[[684,37],[842,39]]},"1239":{"position":[[485,37],[812,39]]}},"keywords":{}}],["getlocalstoragemock",{"_index":6104,"title":{},"content":{"1159":{"position":[[298,19],[467,21]]}},"keywords":{}}],["getlokijsadapterflutt",{"_index":1249,"title":{},"content":{"188":{"position":[[783,23],[1119,25]]}},"keywords":{}}],["getmemorymappedrxstorag",{"_index":4583,"title":{},"content":{"774":{"position":[[567,24],[709,26]]},"1090":{"position":[[677,24],[824,26]]},"1182":{"position":[[91,24],[404,26]]},"1184":{"position":[[457,24],[650,26]]},"1185":{"position":[[310,26]]},"1186":{"position":[[268,26]]},"1239":{"position":[[599,24],[861,26]]}},"keywords":{}}],["getmemorysyncedrxstorag",{"_index":6113,"title":{},"content":{"1163":{"position":[[91,24],[400,26]]},"1164":{"position":[[134,26]]},"1165":{"position":[[363,26]]}},"keywords":{}}],["getpouchdbofrxcollect",{"_index":6186,"title":{},"content":{"1204":{"position":[[237,24]]}},"keywords":{}}],["getpouchdbofrxcollection(myrxcollect",{"_index":6187,"title":{},"content":{"1204":{"position":[[307,41]]}},"keywords":{}}],["getrxdatabase("javascript/dist/index.js"",{"_index":1275,"title":{},"content":{"188":{"position":[[2655,51]]}},"keywords":{}}],["getrxstoragedenokv",{"_index":6016,"title":{},"content":{"1125":{"position":[[55,18],[203,18],[334,20]]},"1126":{"position":[[419,21]]}},"keywords":{}}],["getrxstoragedexi",{"_index":4970,"title":{},"content":{"872":{"position":[[3825,17],[4020,19]]},"1144":{"position":[[92,17],[232,19]]},"1145":{"position":[[202,19],[296,17],[572,19]]},"1146":{"position":[[182,19],[277,19]]},"1148":{"position":[[582,17],[753,19]]},"1149":{"position":[[741,17],[959,19]]}},"keywords":{}}],["getrxstoragefilesystemnod",{"_index":5908,"title":{},"content":{"1090":{"position":[[586,26],[860,28]]},"1126":{"position":[[732,29]]},"1130":{"position":[[51,26],[207,28]]}},"keywords":{}}],["getrxstoragefoundationdb",{"_index":4564,"title":{},"content":{"772":{"position":[[684,24],[817,26]]},"774":{"position":[[489,24],[745,26]]},"1134":{"position":[[51,24],[184,26]]}},"keywords":{}}],["getrxstorageindexeddb",{"_index":4028,"title":{},"content":{"718":{"position":[[218,21],[425,23]]},"745":{"position":[[273,21],[433,25]]},"746":{"position":[[321,26]]},"747":{"position":[[138,26]]},"759":{"position":[[161,21],[406,24]]},"820":{"position":[[80,21],[324,24]]},"932":{"position":[[780,21],[998,23]]},"1138":{"position":[[88,23],[193,21],[328,23]]},"1139":{"position":[[206,23],[291,21],[583,23]]},"1140":{"position":[[507,21],[642,23]]},"1154":{"position":[[321,21],[635,23]]},"1163":{"position":[[11,21],[300,24]]},"1165":{"position":[[310,24]]},"1182":{"position":[[11,21],[300,24]]},"1184":{"position":[[377,21],[734,23]]},"1185":{"position":[[375,23]]},"1186":{"position":[[326,23]]},"1225":{"position":[[82,24],[214,21],[434,23]]},"1226":{"position":[[131,21]]},"1231":{"position":[[527,21],[796,24]]},"1237":{"position":[[743,21],[991,23]]},"1238":{"position":[[604,21],[987,23]]},"1263":{"position":[[100,21],[328,23]]},"1268":{"position":[[655,21],[759,23]]}},"keywords":{}}],["getrxstorageipcrender",{"_index":3925,"title":{},"content":{"693":{"position":[[352,24],[1024,23],[1208,25]]},"1214":{"position":[[661,25]]}},"keywords":{}}],["getrxstoragelocalstorag",{"_index":776,"title":{},"content":{"51":{"position":[[559,24],[773,26]]},"55":{"position":[[731,24],[915,27]]},"209":{"position":[[64,24],[287,27]]},"211":{"position":[[126,24],[259,26]]},"255":{"position":[[411,24],[631,27]]},"258":{"position":[[64,24],[192,26]]},"314":{"position":[[363,24],[522,27],[1051,26]]},"315":{"position":[[260,24],[490,26]]},"334":{"position":[[215,24],[379,27]]},"392":{"position":[[257,24],[391,26]]},"480":{"position":[[221,24],[417,26]]},"482":{"position":[[222,24],[530,26]]},"522":{"position":[[328,24],[474,27]]},"538":{"position":[[322,24],[503,26]]},"542":{"position":[[442,24],[576,27]]},"562":{"position":[[51,24],[211,27]]},"563":{"position":[[261,24],[531,27]]},"564":{"position":[[325,24],[498,26]]},"579":{"position":[[217,24],[388,27]]},"598":{"position":[[317,24],[510,26]]},"632":{"position":[[1102,24],[1339,27]]},"638":{"position":[[382,26]]},"653":{"position":[[167,24],[299,27]]},"680":{"position":[[580,24],[720,26]]},"710":{"position":[[1590,24],[1742,26]]},"717":{"position":[[647,24],[842,26]]},"734":{"position":[[211,24],[354,26]]},"739":{"position":[[198,24],[331,27]]},"759":{"position":[[241,24],[670,27]]},"760":{"position":[[337,24],[666,27]]},"825":{"position":[[383,27]]},"829":{"position":[[522,24],[690,26]]},"862":{"position":[[379,24],[581,26]]},"898":{"position":[[2228,24],[2363,26]]},"904":{"position":[[628,24],[760,26]]},"960":{"position":[[196,24],[342,27]]},"962":{"position":[[667,24],[801,26]]},"966":{"position":[[583,27],[701,27]]},"967":{"position":[[168,27],[286,27]]},"1013":{"position":[[346,27]]},"1114":{"position":[[495,24],[757,27]]},"1118":{"position":[[687,27]]},"1121":{"position":[[497,27]]},"1156":{"position":[[302,26]]},"1158":{"position":[[86,24],[240,26]]},"1159":{"position":[[272,25],[426,26]]},"1218":{"position":[[625,24],[796,27]]},"1222":{"position":[[88,24],[393,26]]},"1286":{"position":[[271,24],[442,26]]},"1287":{"position":[[317,24],[492,26]]},"1288":{"position":[[277,24],[458,26]]},"1311":{"position":[[209,26]]}},"keywords":{}}],["getrxstorageloki",{"_index":1248,"title":{},"content":{"188":{"position":[[688,16],[1091,18]]},"772":{"position":[[2264,16],[2446,18]]},"1172":{"position":[[51,16],[353,18]]}},"keywords":{}}],["getrxstoragememori",{"_index":1612,"title":{},"content":{"266":{"position":[[590,18],[711,20]]},"554":{"position":[[748,18],[978,20]]},"693":{"position":[[790,18],[944,21],[1094,18]]},"773":{"position":[[486,18],[607,20]]},"872":{"position":[[1603,18],[1759,20]]},"1090":{"position":[[454,18]]},"1168":{"position":[[67,18],[188,20]]},"1219":{"position":[[272,18],[738,20]]}},"keywords":{}}],["getrxstoragemongodb",{"_index":5387,"title":{},"content":{"962":{"position":[[888,19],[1017,21]]},"1189":{"position":[[133,19],[318,19],[451,21]]}},"keywords":{}}],["getrxstorageopf",{"_index":6234,"title":{},"content":{"1211":{"position":[[125,18]]},"1212":{"position":[[304,16],[458,19]]},"1213":{"position":[[601,16],[678,18]]}},"keywords":{}}],["getrxstorageopfsmainthread",{"_index":6235,"title":{},"content":{"1211":{"position":[[271,28],[582,26],[724,28]]},"1239":{"position":[[686,26],[897,28]]}},"keywords":{}}],["getrxstoragepouch",{"_index":26,"title":{},"content":{"1":{"position":[[368,17]]},"8":{"position":[[791,17]]},"11":{"position":[[865,18]]},"1201":{"position":[[51,18],[228,18]]}},"keywords":{}}],["getrxstoragepouch('idb",{"_index":56,"title":{},"content":{"3":{"position":[[267,24]]}},"keywords":{}}],["getrxstoragepouch('indexeddb",{"_index":74,"title":{},"content":{"4":{"position":[[445,30]]}},"keywords":{}}],["getrxstoragepouch('memori",{"_index":38,"title":{},"content":{"1":{"position":[[584,27]]}},"keywords":{}}],["getrxstoragepouch('nod",{"_index":135,"title":{},"content":{"9":{"position":[[301,23]]}},"keywords":{}}],["getrxstoragepouch('react",{"_index":132,"title":{},"content":{"8":{"position":[[1156,24]]}},"keywords":{}}],["getrxstoragepouch('websql",{"_index":80,"title":{},"content":{"5":{"position":[[355,27]]},"7":{"position":[[387,27],[583,27]]}},"keywords":{}}],["getrxstoragepouch(asyncstoragedown",{"_index":139,"title":{},"content":{"10":{"position":[[339,35]]}},"keywords":{}}],["getrxstoragepouch(leveldown",{"_index":91,"title":{},"content":{"6":{"position":[[550,28],[748,28]]}},"keywords":{}}],["getrxstoragepouch(memdown",{"_index":48,"title":{},"content":{"2":{"position":[[387,26]]}},"keywords":{}}],["getrxstorageremot",{"_index":6246,"title":{},"content":{"1218":{"position":[[294,18],[367,20]]}},"keywords":{}}],["getrxstorageremotewebsocket",{"_index":6255,"title":{},"content":{"1219":{"position":[[786,27],[909,29]]},"1220":{"position":[[472,29]]}},"keywords":{}}],["getrxstorageshard",{"_index":6262,"title":{},"content":{"1222":{"position":[[10,20],[254,22]]},"1238":{"position":[[452,20],[891,22]]}},"keywords":{}}],["getrxstoragesharedwork",{"_index":6265,"title":{},"content":{"1226":{"position":[[51,24],[265,25]]},"1227":{"position":[[601,24],[743,25]]}},"keywords":{}}],["getrxstoragesqlit",{"_index":1893,"title":{},"content":{"314":{"position":[[1083,20]]},"772":{"position":[[1471,19],[1684,20]]},"838":{"position":[[2425,20]]},"1271":{"position":[[752,18]]},"1274":{"position":[[51,19],[368,20]]},"1275":{"position":[[169,19],[379,20]]},"1276":{"position":[[441,19],[981,20]]},"1277":{"position":[[192,19],[518,20],[726,19],[874,20]]},"1278":{"position":[[295,19],[527,20],[747,19],[979,20]]},"1279":{"position":[[360,19],[755,20]]},"1280":{"position":[[291,19],[490,20]]},"1282":{"position":[[675,20],[767,20],[1099,21],[1138,20]]}},"keywords":{}}],["getrxstoragesqlitetri",{"_index":3811,"title":{},"content":{"662":{"position":[[1928,24],[2173,25]]},"838":{"position":[[2068,24]]},"1271":{"position":[[1126,24],[1421,25]]}},"keywords":{}}],["getrxstoragework",{"_index":6228,"title":{},"content":{"1210":{"position":[[333,18],[469,19]]},"1213":{"position":[[241,20]]},"1238":{"position":[[530,18],[923,20]]},"1264":{"position":[[51,18],[187,19]]},"1265":{"position":[[595,18],[731,19]]},"1267":{"position":[[14,20],[269,20],[433,20],[489,20]]},"1268":{"position":[[124,20],[434,20]]}},"keywords":{}}],["getsqlitebasicscapacitor",{"_index":3812,"title":{},"content":{"662":{"position":[[1953,24]]},"838":{"position":[[2093,24]]},"1279":{"position":[[247,24],[380,24]]}},"keywords":{}}],["getsqlitebasicscapacitor(sqlit",{"_index":3815,"title":{},"content":{"662":{"position":[[2213,32]]},"1279":{"position":[[1035,32]]},"1282":{"position":[[802,32],[1173,32]]}},"keywords":{}}],["getsqlitebasicsexposqlit",{"_index":6354,"title":{},"content":{"1278":{"position":[[767,25]]}},"keywords":{}}],["getsqlitebasicsexposqlite(opendatabas",{"_index":6356,"title":{},"content":{"1278":{"position":[[1014,39]]}},"keywords":{}}],["getsqlitebasicsexposqliteasync",{"_index":6352,"title":{},"content":{"1278":{"position":[[203,32],[315,30]]}},"keywords":{}}],["getsqlitebasicsexposqliteasync(sqlite.opendatabaseasync",{"_index":6353,"title":{},"content":{"1278":{"position":[[562,56]]}},"keywords":{}}],["getsqlitebasicsnod",{"_index":4572,"title":{},"content":{"772":{"position":[[1491,19]]},"1272":{"position":[[470,21]]},"1274":{"position":[[71,19]]}},"keywords":{}}],["getsqlitebasicsnode(sqlite3",{"_index":4574,"title":{},"content":{"772":{"position":[[1719,28]]},"1274":{"position":[[648,28]]}},"keywords":{}}],["getsqlitebasicsnoden",{"_index":6331,"title":{},"content":{"1271":{"position":[[1151,25]]},"1272":{"position":[[536,27]]},"1275":{"position":[[189,25]]}},"keywords":{}}],["getsqlitebasicsnodenative(databasesync",{"_index":6334,"title":{},"content":{"1271":{"position":[[1461,39]]},"1275":{"position":[[414,39]]}},"keywords":{}}],["getsqlitebasicsquicksqlit",{"_index":6349,"title":{},"content":{"1277":{"position":[[56,26],[212,26]]}},"keywords":{}}],["getsqlitebasicsquicksqlite(open",{"_index":4794,"title":{},"content":{"838":{"position":[[2460,32]]},"1277":{"position":[[553,32]]}},"keywords":{}}],["getsqlitebasicstauri",{"_index":6361,"title":{},"content":{"1280":{"position":[[177,20],[311,20]]}},"keywords":{}}],["getsqlitebasicstauri(sqlite3",{"_index":6363,"title":{},"content":{"1280":{"position":[[525,29]]}},"keywords":{}}],["getsqlitebasicswasm",{"_index":6340,"title":{},"content":{"1276":{"position":[[461,19]]}},"keywords":{}}],["getsqlitebasicswasm(sqlite3",{"_index":6347,"title":{},"content":{"1276":{"position":[[1016,28]]}},"keywords":{}}],["getsqlitebasicswebsql",{"_index":6350,"title":{},"content":{"1277":{"position":[[746,21]]}},"keywords":{}}],["getsqlitebasicswebsql(sqlite.opendatabas",{"_index":6351,"title":{},"content":{"1277":{"position":[[909,42]]}},"keywords":{}}],["getstringdata",{"_index":5312,"title":{"932":{"position":[[0,16]]}},"content":{},"keywords":{}}],["getter",{"_index":4684,"title":{"811":{"position":[[4,7]]}},"content":{"811":{"position":[[59,7]]},"1040":{"position":[[48,7]]},"1050":{"position":[[3,6]]},"1084":{"position":[[113,7]]}},"keywords":{}}],["getter/sett",{"_index":4557,"title":{},"content":{"770":{"position":[[239,13]]}},"keywords":{}}],["getvectorfromtext",{"_index":2256,"title":{},"content":{"392":{"position":[[3506,17]]}},"keywords":{}}],["getvectorfromtext(doc.text",{"_index":2247,"title":{},"content":{"392":{"position":[[2849,28]]}},"keywords":{}}],["getvectorfromtext(e.data.text",{"_index":2260,"title":{},"content":{"392":{"position":[[3600,31]]}},"keywords":{}}],["getvectorfromtextwithworker(doc.bodi",{"_index":2283,"title":{},"content":{"392":{"position":[[4806,38]]}},"keywords":{}}],["getvectorfromtextwithworker(text",{"_index":2269,"title":{},"content":{"392":{"position":[[4044,33]]}},"keywords":{}}],["gibson",{"_index":5724,"title":{},"content":{"1051":{"position":[[277,9],[547,9]]}},"keywords":{}}],["gigabyt",{"_index":2534,"title":{},"content":{"408":{"position":[[921,9],[1089,9]]},"412":{"position":[[6761,12],[6999,11]]},"461":{"position":[[1338,9]]},"696":{"position":[[1228,9]]}},"keywords":{}}],["git",{"_index":2667,"title":{},"content":{"412":{"position":[[1987,3],[3597,3]]},"666":{"position":[[147,3]]},"731":{"position":[[61,3]]},"982":{"position":[[53,4]]}},"keywords":{}}],["github",{"_index":523,"title":{},"content":{"33":{"position":[[511,6]]},"38":{"position":[[848,6]]},"56":{"position":[[84,6]]},"61":{"position":[[94,6],[187,7],[259,6]]},"84":{"position":[[120,6],[158,6]]},"114":{"position":[[133,6],[171,6]]},"149":{"position":[[133,6],[171,6],[464,6]]},"175":{"position":[[126,6],[164,6]]},"198":{"position":[[548,6]]},"241":{"position":[[237,6]]},"263":{"position":[[645,6]]},"306":{"position":[[282,6]]},"347":{"position":[[133,6],[171,6]]},"362":{"position":[[1204,6],[1242,6]]},"373":{"position":[[237,6]]},"405":{"position":[[158,6]]},"462":{"position":[[502,6]]},"471":{"position":[[67,6],[143,6]]},"483":{"position":[[970,7]]},"498":{"position":[[377,6],[436,6]]},"511":{"position":[[133,6],[171,6]]},"531":{"position":[[133,6],[171,6],[462,6]]},"543":{"position":[[91,6]]},"548":{"position":[[93,6]]},"557":{"position":[[224,6]]},"567":{"position":[[443,6]]},"591":{"position":[[133,6],[171,6],[593,7]]},"603":{"position":[[89,6]]},"608":{"position":[[93,6]]},"628":{"position":[[245,6]]},"644":{"position":[[302,6]]},"824":{"position":[[413,6]]},"913":{"position":[[196,6],[262,6]]},"1112":{"position":[[43,6],[126,6]]}},"keywords":{}}],["githublearn",{"_index":2513,"title":{},"content":{"405":{"position":[[87,11]]}},"keywords":{}}],["give",{"_index":1595,"title":{},"content":{"263":{"position":[[59,5]]},"399":{"position":[[572,4]]},"407":{"position":[[747,5]]},"411":{"position":[[5309,6]]},"412":{"position":[[12422,4]]},"418":{"position":[[561,6]]},"455":{"position":[[142,4]]},"469":{"position":[[1366,5]]},"498":{"position":[[695,4]]},"581":{"position":[[81,6]]},"617":{"position":[[1350,5]]},"686":{"position":[[862,5]]},"774":{"position":[[856,5]]},"1009":{"position":[[663,5]]},"1132":{"position":[[36,5]]},"1207":{"position":[[486,5]]},"1219":{"position":[[138,4]]},"1294":{"position":[[1873,4]]},"1322":{"position":[[120,4]]}},"keywords":{}}],["given",{"_index":2303,"title":{},"content":{"394":{"position":[[227,5]]},"402":{"position":[[1434,5]]},"412":{"position":[[5877,5]]},"459":{"position":[[501,5]]},"617":{"position":[[585,5]]},"724":{"position":[[797,5]]},"749":{"position":[[13,5],[575,5],[1315,5],[2330,5],[2392,5],[8140,5],[8346,5],[11893,5],[13130,5],[18831,5],[18937,5]]},"797":{"position":[[107,5]]},"848":{"position":[[241,5]]},"875":{"position":[[1451,5],[1822,5]]},"878":{"position":[[115,5]]},"885":{"position":[[231,5]]},"957":{"position":[[21,5]]},"978":{"position":[[21,5]]},"981":{"position":[[1642,5]]},"983":{"position":[[300,5]]},"984":{"position":[[360,5]]},"988":{"position":[[2956,5],[3053,5]]},"1002":{"position":[[238,5]]},"1022":{"position":[[312,5]]},"1023":{"position":[[621,5]]},"1039":{"position":[[44,5]]},"1043":{"position":[[16,5]]},"1053":{"position":[[21,5]]},"1063":{"position":[[21,5]]},"1070":{"position":[[21,5]]},"1097":{"position":[[183,5]]},"1100":{"position":[[560,5]]},"1104":{"position":[[285,5]]},"1114":{"position":[[896,5]]},"1172":{"position":[[537,5]]},"1252":{"position":[[115,5]]},"1294":{"position":[[1990,5]]},"1322":{"position":[[365,5]]}},"keywords":{}}],["global",{"_index":144,"title":{"729":{"position":[[13,6]]},"1202":{"position":[[13,6]]}},"content":{"11":{"position":[[16,6]]},"304":{"position":[[236,6]]},"333":{"position":[[241,8]]},"346":{"position":[[116,8]]},"411":{"position":[[2103,6]]},"418":{"position":[[462,6],[801,6]]},"460":{"position":[[852,6]]},"579":{"position":[[918,6]]},"590":{"position":[[256,6]]},"674":{"position":[[102,6]]},"701":{"position":[[85,6]]},"729":{"position":[[116,6],[207,6]]},"785":{"position":[[193,6],[459,6]]},"852":{"position":[[30,6]]},"873":{"position":[[71,7]]},"1123":{"position":[[52,8]]},"1124":{"position":[[1564,6]]},"1202":{"position":[[160,6],[246,6]]}},"keywords":{}}],["global.atob",{"_index":120,"title":{},"content":{"8":{"position":[[579,14],[596,11]]}},"keywords":{}}],["global.btoa",{"_index":119,"title":{},"content":{"8":{"position":[[535,14],[552,11]]}},"keywords":{}}],["go",{"_index":387,"title":{"670":{"position":[[3,3]]}},"content":{"23":{"position":[[301,2]]},"29":{"position":[[477,5]]},"249":{"position":[[125,3]]},"404":{"position":[[54,3]]},"408":{"position":[[3928,2]]},"412":{"position":[[140,2],[9936,2],[13995,2]]},"437":{"position":[[58,2]]},"491":{"position":[[1621,2]]},"620":{"position":[[352,2]]},"662":{"position":[[861,2]]},"670":{"position":[[274,2]]},"686":{"position":[[183,2]]},"698":{"position":[[93,2]]},"708":{"position":[[416,2]]},"709":{"position":[[704,2],[1168,2]]},"723":{"position":[[2233,2]]},"778":{"position":[[332,2]]},"836":{"position":[[1596,2]]},"862":{"position":[[53,2]]},"987":{"position":[[958,2]]},"988":{"position":[[6083,2]]},"1198":{"position":[[1096,2]]},"1304":{"position":[[1075,2],[1178,2]]},"1316":{"position":[[470,2],[3495,2]]}},"keywords":{}}],["goal",{"_index":290,"title":{},"content":{"17":{"position":[[183,4]]},"27":{"position":[[136,4]]},"380":{"position":[[23,4]]},"981":{"position":[[113,5]]},"1087":{"position":[[53,4]]},"1177":{"position":[[202,5]]},"1204":{"position":[[203,5]]}},"keywords":{}}],["god",{"_index":795,"title":{},"content":{"52":{"position":[[230,4]]},"539":{"position":[[230,4]]},"599":{"position":[[248,4]]}},"keywords":{}}],["goe",{"_index":1564,"title":{},"content":{"253":{"position":[[212,4]]},"407":{"position":[[595,4]]},"410":{"position":[[1445,4]]},"414":{"position":[[352,4]]},"610":{"position":[[1254,4]]},"700":{"position":[[953,4]]},"701":{"position":[[30,4]]},"702":{"position":[[435,4]]},"709":{"position":[[288,4]]},"981":{"position":[[1083,4]]},"985":{"position":[[437,4]]},"988":{"position":[[5860,4],[5996,4]]},"996":{"position":[[47,4]]},"1175":{"position":[[173,4]]},"1314":{"position":[[572,4]]},"1316":{"position":[[3835,4]]},"1321":{"position":[[376,4]]}},"keywords":{}}],["gone",{"_index":5419,"title":{},"content":{"977":{"position":[[127,4]]}},"keywords":{}}],["good",{"_index":16,"title":{"67":{"position":[[39,4]]},"71":{"position":[[14,4]]},"98":{"position":[[40,4]]},"102":{"position":[[14,4]]},"225":{"position":[[28,4]]},"229":{"position":[[14,4]]}},"content":{"1":{"position":[[237,4]]},"5":{"position":[[174,4]]},"127":{"position":[[20,4]]},"131":{"position":[[318,4]]},"393":{"position":[[1118,4]]},"396":{"position":[[919,4],[1232,4]]},"402":{"position":[[1077,4]]},"404":{"position":[[46,4]]},"450":{"position":[[493,4]]},"455":{"position":[[324,4]]},"470":{"position":[[76,4],[477,4]]},"496":{"position":[[121,4]]},"535":{"position":[[575,4]]},"557":{"position":[[76,4]]},"560":{"position":[[298,4]]},"595":{"position":[[602,4]]},"620":{"position":[[262,4]]},"659":{"position":[[703,4]]},"661":{"position":[[1662,4]]},"696":{"position":[[587,4]]},"700":{"position":[[552,4]]},"711":{"position":[[2104,4]]},"815":{"position":[[263,4]]},"836":{"position":[[2230,4]]},"839":{"position":[[311,4],[1189,4]]},"841":{"position":[[914,5],[1064,4]]},"842":{"position":[[3,4]]},"1152":{"position":[[46,4]]},"1192":{"position":[[163,4]]},"1198":{"position":[[1507,4]]},"1209":{"position":[[302,4]]},"1222":{"position":[[770,4]]},"1249":{"position":[[342,4]]},"1301":{"position":[[1581,4]]}},"keywords":{}}],["googl",{"_index":197,"title":{},"content":{"14":{"position":[[39,6]]},"116":{"position":[[72,7]]},"177":{"position":[[66,6]]},"301":{"position":[[661,6]]},"411":{"position":[[5638,7]]},"412":{"position":[[14680,6]]},"462":{"position":[[331,6]]},"504":{"position":[[1115,6]]},"840":{"position":[[151,7]]},"841":{"position":[[261,6],[1541,6]]}},"keywords":{}}],["google'",{"_index":1304,"title":{},"content":{"202":{"position":[[48,8]]},"247":{"position":[[70,8]]},"289":{"position":[[1015,8]]},"412":{"position":[[1058,8]]}},"keywords":{}}],["goto",{"_index":1675,"title":{},"content":{"287":{"position":[[1106,4]]}},"keywords":{}}],["gpu",{"_index":2570,"title":{},"content":{"408":{"position":[[5205,3]]}},"keywords":{}}],["gql1",{"_index":4415,"title":{},"content":{"749":{"position":[[22348,4]]}},"keywords":{}}],["gql3",{"_index":4416,"title":{},"content":{"749":{"position":[[22455,4]]}},"keywords":{}}],["gracefulli",{"_index":1782,"title":{},"content":{"300":{"position":[[781,10]]},"302":{"position":[[271,10]]},"312":{"position":[[263,10]]},"369":{"position":[[600,11]]},"375":{"position":[[763,11]]},"491":{"position":[[1448,10]]},"497":{"position":[[248,11]]},"544":{"position":[[217,10]]},"604":{"position":[[189,10]]},"632":{"position":[[509,10]]}},"keywords":{}}],["gracefully.scal",{"_index":3517,"title":{},"content":{"582":{"position":[[599,19]]}},"keywords":{}}],["grain",{"_index":970,"title":{},"content":{"75":{"position":[[78,7]]},"106":{"position":[[156,7]]},"412":{"position":[[12842,7]]},"542":{"position":[[136,7]]},"551":{"position":[[398,7]]},"563":{"position":[[978,7]]},"635":{"position":[[330,7]]}},"keywords":{}}],["grant",{"_index":4016,"title":{},"content":{"715":{"position":[[152,6]]}},"keywords":{}}],["granular",{"_index":1041,"title":{},"content":{"106":{"position":[[61,8]]},"174":{"position":[[1058,11]]},"235":{"position":[[85,8]]},"681":{"position":[[107,8]]},"860":{"position":[[952,8]]},"1206":{"position":[[280,8]]}},"keywords":{}}],["graph",{"_index":472,"title":{},"content":{"29":{"position":[[21,5]]},"396":{"position":[[358,5],[441,5],[605,5]]},"1320":{"position":[[740,5]]}},"keywords":{}}],["graphic",{"_index":2575,"title":{},"content":{"408":{"position":[[5369,8]]}},"keywords":{}}],["graphql",{"_index":242,"title":{"883":{"position":[[17,7]]},"885":{"position":[[22,7]]}},"content":{"14":{"position":[[1146,7]]},"18":{"position":[[445,7]]},"37":{"position":[[12,7],[95,7],[145,7],[207,7]]},"202":{"position":[[307,8]]},"249":{"position":[[244,7]]},"255":{"position":[[1690,8]]},"312":{"position":[[167,8]]},"381":{"position":[[328,7]]},"412":{"position":[[12997,7]]},"565":{"position":[[125,8]]},"566":{"position":[[1178,8]]},"632":{"position":[[777,8]]},"698":{"position":[[1726,7]]},"701":{"position":[[1179,7]]},"749":{"position":[[22353,7],[22460,7]]},"793":{"position":[[675,7]]},"838":{"position":[[643,7]]},"841":{"position":[[781,8]]},"884":{"position":[[20,7]]},"885":{"position":[[1402,7],[2718,7]]},"886":{"position":[[192,7],[344,7],[975,9],[1073,7],[2242,7],[2705,7],[3045,7],[3892,7],[4454,7]]},"887":{"position":[[1,7],[548,7]]},"888":{"position":[[75,7],[1000,7]]},"889":{"position":[[1092,7]]},"890":{"position":[[201,7],[1009,7]]},"1124":{"position":[[2251,8]]},"1149":{"position":[[236,7]]},"1231":{"position":[[723,9]]},"1308":{"position":[[182,7]]}},"keywords":{}}],["graphql'",{"_index":6082,"title":{},"content":{"1149":{"position":[[314,9]]}},"keywords":{}}],["graphql.check",{"_index":3723,"title":{},"content":{"644":{"position":[[154,13]]}},"keywords":{}}],["graphqlschemafromrxschema",{"_index":5166,"title":{},"content":{"889":{"position":[[846,28]]}},"keywords":{}}],["great",{"_index":555,"title":{"247":{"position":[[18,5]]},"277":{"position":[[0,5]]},"283":{"position":[[0,5]]}},"content":{"35":{"position":[[309,5]]},"61":{"position":[[502,5]]},"271":{"position":[[302,5]]},"566":{"position":[[1402,5]]},"576":{"position":[[180,5]]},"662":{"position":[[224,5]]},"704":{"position":[[106,6]]},"772":{"position":[[2049,5]]},"774":{"position":[[882,5]]},"775":{"position":[[51,5]]},"838":{"position":[[253,5]]},"1120":{"position":[[420,5]]},"1157":{"position":[[425,5]]},"1198":{"position":[[198,5]]},"1247":{"position":[[36,5]]},"1316":{"position":[[2510,5],[2582,5]]}},"keywords":{}}],["greater",{"_index":2583,"title":{},"content":{"409":{"position":[[93,7]]},"410":{"position":[[621,7]]},"751":{"position":[[109,7]]},"1076":{"position":[[69,7]]},"1294":{"position":[[315,7]]},"1296":{"position":[[298,7]]}},"keywords":{}}],["greatest",{"_index":2162,"title":{},"content":{"383":{"position":[[15,8]]}},"keywords":{}}],["greatli",{"_index":1001,"title":{},"content":{"87":{"position":[[156,7]]},"151":{"position":[[276,7]]},"353":{"position":[[778,7]]},"446":{"position":[[567,7]]}},"keywords":{}}],["grind",{"_index":2599,"title":{},"content":{"410":{"position":[[1331,5]]}},"keywords":{}}],["group",{"_index":2025,"title":{},"content":{"354":{"position":[[770,10]]},"376":{"position":[[343,8]]},"390":{"position":[[1327,6]]},"981":{"position":[[831,8]]},"1140":{"position":[[87,9]]}},"keywords":{}}],["group"",{"_index":5587,"title":{},"content":{"1009":{"position":[[230,11]]}},"keywords":{}}],["grow",{"_index":1606,"title":{},"content":{"265":{"position":[[709,6]]},"294":{"position":[[331,5]]},"369":{"position":[[551,5],[828,7]]},"382":{"position":[[242,5]]},"394":{"position":[[1525,5]]},"411":{"position":[[3738,6]]},"412":{"position":[[15121,7]]},"421":{"position":[[1079,7]]},"441":{"position":[[231,6]]},"477":{"position":[[120,6],[265,5]]},"559":{"position":[[1604,5]]},"1092":{"position":[[643,4]]}},"keywords":{}}],["grown",{"_index":2543,"title":{},"content":{"408":{"position":[[2138,6]]}},"keywords":{}}],["gt",{"_index":164,"title":{},"content":{"11":{"position":[[601,5],[653,5]]},"19":{"position":[[683,5],[697,5],[879,5]]},"50":{"position":[[177,6]]},"55":{"position":[[531,5]]},"77":{"position":[[251,4],[310,5]]},"103":{"position":[[291,4],[350,5]]},"129":{"position":[[674,6]]},"143":{"position":[[511,5],[546,5],[692,5],[731,5]]},"209":{"position":[[741,5],[1028,5]]},"210":{"position":[[576,5]]},"234":{"position":[[351,4],[410,5]]},"235":{"position":[[314,5]]},"255":{"position":[[1098,5],[1363,5]]},"261":{"position":[[937,5]]},"335":{"position":[[312,5],[415,5],[619,5]]},"392":{"position":[[2771,5],[2817,5],[3568,5],[3915,5],[4286,5],[4321,5],[4724,5],[4774,5]]},"394":{"position":[[781,5]]},"397":{"position":[[1812,5],[1858,5],[2072,5]]},"398":{"position":[[886,5],[1237,4],[1367,5],[1409,5],[1497,5],[2172,5],[2375,4],[2527,5],[2650,5]]},"403":{"position":[[913,5]]},"412":{"position":[[9825,4],[9841,4]]},"432":{"position":[[924,5]]},"458":{"position":[[866,5]]},"459":{"position":[[865,5],[901,5],[959,5]]},"480":{"position":[[854,5]]},"494":{"position":[[351,5]]},"502":{"position":[[966,4],[1094,5]]},"518":{"position":[[433,4],[561,5]]},"523":{"position":[[682,5],[738,5]]},"541":{"position":[[308,5],[428,5],[472,5],[604,5]]},"542":{"position":[[855,5]]},"555":{"position":[[182,5]]},"559":{"position":[[314,5],[426,5],[639,5],[718,5]]},"562":{"position":[[1179,5],[1326,5],[1370,5],[1475,5]]},"571":{"position":[[907,4],[1030,5],[1141,5],[1349,5]]},"580":{"position":[[425,5],[534,4],[674,5]]},"601":{"position":[[502,5],[662,5]]},"602":{"position":[[518,4]]},"610":{"position":[[974,5],[1008,5],[1143,5]]},"612":{"position":[[1272,5],[1871,5],[2023,5],[2238,5],[2426,5],[2500,5]]},"632":{"position":[[1821,5],[2408,5],[2524,5]]},"649":{"position":[[303,5],[338,4]]},"659":{"position":[[616,4]]},"662":{"position":[[2846,5]]},"672":{"position":[[135,5]]},"673":{"position":[[141,5]]},"674":{"position":[[424,5]]},"691":{"position":[[255,5],[319,5]]},"710":{"position":[[2153,5]]},"711":{"position":[[1251,5],[1537,5],[1568,5],[1605,5]]},"724":{"position":[[967,5],[1028,5]]},"739":{"position":[[503,5],[606,5]]},"740":{"position":[[612,5],[650,4]]},"747":{"position":[[213,5],[271,5],[338,5]]},"751":{"position":[[1405,5]]},"752":{"position":[[964,5],[1003,5],[1044,5]]},"753":{"position":[[328,5],[369,5]]},"759":{"position":[[944,5]]},"760":{"position":[[832,5]]},"767":{"position":[[574,5],[983,5]]},"768":{"position":[[576,5],[985,5]]},"769":{"position":[[533,5],[954,5]]},"770":{"position":[[421,5]]},"796":{"position":[[463,4],[510,4],[1379,4]]},"798":{"position":[[585,4]]},"799":{"position":[[548,5],[780,5]]},"810":{"position":[[465,6]]},"811":{"position":[[460,6]]},"812":{"position":[[307,6]]},"813":{"position":[[458,6]]},"820":{"position":[[580,4],[632,4]]},"825":{"position":[[841,6]]},"829":{"position":[[1407,5],[1472,5],[1504,5],[2477,5],[3392,5],[3551,5]]},"838":{"position":[[3060,5]]},"846":{"position":[[852,5],[1287,5]]},"848":{"position":[[215,5]]},"857":{"position":[[366,5]]},"858":{"position":[[397,5],[518,5],[527,6]]},"861":{"position":[[2359,4],[2374,4]]},"872":{"position":[[828,6],[1523,6],[2263,6],[3083,6],[3758,6]]},"875":{"position":[[312,4],[783,4],[1208,5],[2006,4],[2098,5],[2461,4],[2518,4],[3054,4],[4252,4],[4466,5],[5184,4],[5489,4],[6098,4],[7206,4],[7255,5],[7430,5],[7515,5],[8024,4],[8235,5],[8944,4],[8984,5],[9443,4],[9651,5]]},"879":{"position":[[658,5]]},"880":{"position":[[371,5]]},"881":{"position":[[381,5]]},"885":{"position":[[1496,5],[1727,5],[1751,4],[1868,4],[2058,5],[2135,4],[2256,4]]},"886":{"position":[[408,5],[1221,5],[2301,5],[3121,5],[3501,5]]},"887":{"position":[[457,5],[617,5]]},"898":{"position":[[2960,6],[3217,6],[3530,5],[3688,5],[4108,5]]},"904":{"position":[[3493,5]]},"907":{"position":[[342,5]]},"910":{"position":[[421,5],[441,5]]},"921":{"position":[[222,5]]},"939":{"position":[[289,6]]},"941":{"position":[[138,5],[286,5],[362,5],[438,5]]},"944":{"position":[[300,4]]},"945":{"position":[[195,4]]},"948":{"position":[[501,4],[770,4]]},"950":{"position":[[324,5],[460,5]]},"952":{"position":[[340,5]]},"953":{"position":[[141,5]]},"956":{"position":[[268,5],[334,5]]},"970":{"position":[[125,5]]},"971":{"position":[[450,5]]},"972":{"position":[[141,5]]},"975":{"position":[[311,5],[505,5]]},"979":{"position":[[270,5],[373,4]]},"983":{"position":[[904,4],[989,4]]},"988":{"position":[[3379,5],[4708,5],[5567,5],[5687,5],[5730,5],[5771,5]]},"990":{"position":[[1219,5],[1371,4]]},"993":{"position":[[187,5],[304,5],[449,5],[587,5],[724,5]]},"995":{"position":[[1644,5],[1954,5],[1974,4]]},"996":{"position":[[547,5]]},"1002":{"position":[[380,5]]},"1007":{"position":[[1198,4],[2196,5]]},"1009":{"position":[[1100,4]]},"1010":{"position":[[317,5]]},"1017":{"position":[[170,5],[210,4]]},"1018":{"position":[[278,5]]},"1020":{"position":[[476,5]]},"1022":{"position":[[579,5],[820,5]]},"1023":{"position":[[235,5],[489,5]]},"1024":{"position":[[321,5]]},"1033":{"position":[[597,5],[824,5]]},"1039":{"position":[[239,5],[413,5]]},"1040":{"position":[[357,5],[403,4],[485,4]]},"1042":{"position":[[138,5]]},"1044":{"position":[[410,5]]},"1045":{"position":[[271,4]]},"1046":{"position":[[162,5]]},"1048":{"position":[[561,5]]},"1049":{"position":[[138,5]]},"1055":{"position":[[230,4]]},"1057":{"position":[[164,4]]},"1058":{"position":[[280,5],[342,4],[462,4]]},"1059":{"position":[[265,4]]},"1060":{"position":[[133,4]]},"1061":{"position":[[134,4],[179,5]]},"1063":{"position":[[148,4],[203,4],[252,4],[307,4]]},"1065":{"position":[[290,5],[869,5],[1158,5],[1380,5],[1497,5]]},"1066":{"position":[[391,4]]},"1067":{"position":[[330,4],[478,4],[537,5],[1591,4],[1617,4],[2190,5]]},"1100":{"position":[[773,4]]},"1101":{"position":[[430,4],[612,4]]},"1115":{"position":[[344,5],[410,5],[480,5]]},"1117":{"position":[[465,5]]},"1139":{"position":[[362,6]]},"1140":{"position":[[691,5]]},"1145":{"position":[[351,6]]},"1150":{"position":[[460,5]]},"1164":{"position":[[1523,5]]},"1198":{"position":[[1041,3]]},"1218":{"position":[[452,5]]},"1220":{"position":[[619,4]]},"1249":{"position":[[502,4]]},"1268":{"position":[[161,5],[471,5],[542,6]]},"1290":{"position":[[128,5]]},"1294":{"position":[[1159,5],[1538,5],[1586,5]]}},"keywords":{}}],["gt(18",{"_index":5355,"title":{},"content":{"949":{"position":[[176,7]]}},"keywords":{}}],["gt;'bar",{"_index":4672,"title":{},"content":{"806":{"position":[[689,12]]}},"keywords":{}}],["gt;=0",{"_index":4367,"title":{},"content":{"749":{"position":[[17805,6]]}},"keywords":{}}],["gt;onlin",{"_index":5455,"title":{},"content":{"988":{"position":[[985,10]]}},"keywords":{}}],["gt;reproduc",{"_index":3101,"title":{},"content":{"471":{"position":[[31,13]]}},"keywords":{}}],["gt;storag",{"_index":2562,"title":{},"content":{"408":{"position":[[4035,11]]}},"keywords":{}}],["gt;valu",{"_index":3773,"title":{},"content":{"659":{"position":[[81,9]]},"835":{"position":[[23,9]]}},"keywords":{}}],["gte",{"_index":4640,"title":{},"content":{"796":{"position":[[539,5],[948,5]]}},"keywords":{}}],["guarante",{"_index":2117,"title":{},"content":{"367":{"position":[[496,12]]},"418":{"position":[[441,10]]},"445":{"position":[[759,12]]},"502":{"position":[[1197,12]]},"504":{"position":[[1191,10]]},"525":{"position":[[254,10]]},"569":{"position":[[171,10],[895,9],[1449,9]]},"699":{"position":[[949,9]]},"716":{"position":[[75,9]]},"927":{"position":[[141,9]]},"951":{"position":[[487,10]]},"1033":{"position":[[99,10]]},"1123":{"position":[[277,10]]},"1304":{"position":[[65,9],[365,10]]},"1314":{"position":[[501,9]]}},"keywords":{}}],["guarantee.onlin",{"_index":2792,"title":{},"content":{"417":{"position":[[228,16]]}},"keywords":{}}],["guards.stream",{"_index":5190,"title":{},"content":{"897":{"position":[[264,14]]}},"keywords":{}}],["guess",{"_index":4258,"title":{},"content":{"749":{"position":[[9593,7],[13939,7]]}},"keywords":{}}],["guid",{"_index":884,"title":{"423":{"position":[[59,5]]}},"content":{"61":{"position":[[60,6]]},"84":{"position":[[332,6]]},"114":{"position":[[345,6]]},"149":{"position":[[345,6]]},"175":{"position":[[338,6]]},"241":{"position":[[153,5]]},"263":{"position":[[410,6]]},"347":{"position":[[345,6]]},"362":{"position":[[1416,6]]},"373":{"position":[[153,5]]},"387":{"position":[[163,7]]},"419":{"position":[[300,7]]},"491":{"position":[[757,5],[1943,6]]},"498":{"position":[[152,5]]},"511":{"position":[[345,6]]},"531":{"position":[[345,6]]},"548":{"position":[[54,6]]},"557":{"position":[[54,6]]},"567":{"position":[[218,6]]},"591":{"position":[[345,6]]},"608":{"position":[[54,6]]},"696":{"position":[[2059,5]]},"824":{"position":[[137,5]]},"899":{"position":[[99,6]]}},"keywords":{}}],["guidecheck",{"_index":1910,"title":{},"content":{"318":{"position":[[394,10]]}},"keywords":{}}],["guidelin",{"_index":3638,"title":{},"content":{"617":{"position":[[819,10]]}},"keywords":{}}],["guild.dev/graphql/ws/docs/interfaces/client.clientopt",{"_index":5143,"title":{},"content":{"886":{"position":[[4493,57]]}},"keywords":{}}],["gun",{"_index":471,"title":{},"content":{"29":{"position":[[1,3],[205,3],[367,3]]}},"keywords":{}}],["gundb",{"_index":470,"title":{"29":{"position":[[0,6]]}},"content":{},"keywords":{}}],["guy",{"_index":3978,"title":{},"content":{"705":{"position":[[1107,3]]}},"keywords":{}}],["gzip",{"_index":5317,"title":{},"content":{"932":{"position":[[1356,7]]},"1292":{"position":[[866,6]]}},"keywords":{}}],["h1rg9ugdd30o",{"_index":5722,"title":{},"content":{"1051":{"position":[[228,15],[498,15]]}},"keywords":{}}],["hack",{"_index":3089,"title":{},"content":{"469":{"position":[[64,5],[147,5]]},"784":{"position":[[389,4]]}},"keywords":{}}],["hackernew",{"_index":3687,"title":{},"content":{"628":{"position":[[15,10]]}},"keywords":{}}],["hackernewsloc",{"_index":2860,"title":{},"content":{"422":{"position":[[29,15]]}},"keywords":{}}],["half",{"_index":2837,"title":{},"content":{"420":{"position":[[1170,4],[1319,4]]},"463":{"position":[[1203,4]]},"468":{"position":[[540,4]]}},"keywords":{}}],["halt",{"_index":2600,"title":{},"content":{"410":{"position":[[1342,5]]},"569":{"position":[[1353,6]]}},"keywords":{}}],["hand",{"_index":897,"title":{},"content":{"64":{"position":[[25,5]]},"101":{"position":[[141,5]]},"203":{"position":[[107,5]]},"227":{"position":[[196,5]]},"228":{"position":[[197,5]]},"291":{"position":[[224,6]]},"425":{"position":[[22,5]]},"458":{"position":[[395,4]]},"624":{"position":[[624,5]]},"661":{"position":[[1400,7]]},"711":{"position":[[1897,7]]},"737":{"position":[[400,4]]},"752":{"position":[[279,5]]},"1315":{"position":[[1006,4]]},"1322":{"position":[[452,4]]}},"keywords":{}}],["handi",{"_index":1963,"title":{},"content":{"336":{"position":[[372,5]]},"436":{"position":[[249,5]]},"710":{"position":[[91,5]]},"1021":{"position":[[21,5]]}},"keywords":{}}],["handl",{"_index":278,"title":{"79":{"position":[[0,8]]},"110":{"position":[[0,8]]},"121":{"position":[[14,9]]},"140":{"position":[[25,9]]},"146":{"position":[[15,9]]},"150":{"position":[[68,8]]},"156":{"position":[[14,9]]},"168":{"position":[[25,9]]},"182":{"position":[[14,9]]},"196":{"position":[[25,9]]},"203":{"position":[[21,9]]},"240":{"position":[[0,8]]},"302":{"position":[[0,8]]},"312":{"position":[[29,9]]},"326":{"position":[[14,9]]},"344":{"position":[[25,9]]},"509":{"position":[[25,9]]},"515":{"position":[[14,9]]},"529":{"position":[[25,9]]},"635":{"position":[[9,9]]},"715":{"position":[[9,9]]},"740":{"position":[[0,6]]},"847":{"position":[[9,9]]},"855":{"position":[[0,8]]},"867":{"position":[[0,8]]},"987":{"position":[[9,9]]},"990":{"position":[[6,9]]},"1111":{"position":[[9,9]]}},"content":{"16":{"position":[[423,9]]},"24":{"position":[[412,8]]},"28":{"position":[[82,7]]},"35":{"position":[[423,9]]},"39":{"position":[[674,8]]},"40":{"position":[[159,6],[531,6]]},"46":{"position":[[654,8]]},"47":{"position":[[885,8]]},"64":{"position":[[114,6]]},"78":{"position":[[53,8]]},"79":{"position":[[36,8]]},"80":{"position":[[61,7]]},"95":{"position":[[63,8]]},"96":{"position":[[241,6]]},"100":{"position":[[36,6]]},"104":{"position":[[114,8]]},"110":{"position":[[16,8],[120,6]]},"117":{"position":[[147,8]]},"120":{"position":[[196,9],[347,9]]},"121":{"position":[[53,9]]},"123":{"position":[[194,7]]},"129":{"position":[[104,8]]},"130":{"position":[[92,6]]},"134":{"position":[[151,6]]},"135":{"position":[[221,7]]},"140":{"position":[[299,8]]},"143":{"position":[[45,8]]},"145":{"position":[[189,6]]},"146":{"position":[[53,9],[237,8]]},"147":{"position":[[135,8]]},"148":{"position":[[87,9]]},"155":{"position":[[113,8]]},"156":{"position":[[59,9]]},"158":{"position":[[115,6]]},"161":{"position":[[218,8]]},"165":{"position":[[222,6]]},"168":{"position":[[38,8]]},"170":{"position":[[193,9]]},"174":{"position":[[2099,8]]},"181":{"position":[[275,8]]},"182":{"position":[[55,9]]},"186":{"position":[[296,9]]},"196":{"position":[[146,8]]},"198":{"position":[[164,8]]},"206":{"position":[[154,6]]},"212":{"position":[[284,6]]},"240":{"position":[[78,8],[185,8]]},"267":{"position":[[525,6],[969,6]]},"274":{"position":[[270,7]]},"280":{"position":[[327,7]]},"287":{"position":[[761,6]]},"289":{"position":[[178,7]]},"300":{"position":[[759,6]]},"301":{"position":[[17,6]]},"302":{"position":[[257,8],[1095,6]]},"305":{"position":[[439,6]]},"306":{"position":[[86,9]]},"310":{"position":[[43,8]]},"312":{"position":[[245,7]]},"317":{"position":[[62,6]]},"320":{"position":[[58,9],[209,8]]},"322":{"position":[[126,8]]},"323":{"position":[[15,9]]},"334":{"position":[[542,8]]},"339":{"position":[[72,8]]},"343":{"position":[[100,7]]},"350":{"position":[[320,6]]},"353":{"position":[[137,9]]},"354":{"position":[[735,6],[1145,9]]},"358":{"position":[[888,8]]},"360":{"position":[[107,6]]},"369":{"position":[[664,6]]},"371":{"position":[[92,8]]},"375":{"position":[[730,6]]},"376":{"position":[[553,6]]},"378":{"position":[[176,9]]},"386":{"position":[[51,8]]},"388":{"position":[[492,6]]},"390":{"position":[[879,6]]},"400":{"position":[[412,6]]},"408":{"position":[[1689,7],[5512,6]]},"411":{"position":[[218,6],[592,6],[1359,6]]},"412":{"position":[[976,6],[4111,8],[7481,6],[11578,8],[11620,6],[12629,8],[13547,9],[14030,8],[14866,8]]},"416":{"position":[[58,8]]},"420":{"position":[[814,6]]},"426":{"position":[[33,8]]},"429":{"position":[[181,8]]},"430":{"position":[[649,8]]},"432":{"position":[[360,6],[1379,7]]},"444":{"position":[[63,6]]},"445":{"position":[[1351,8]]},"446":{"position":[[879,6],[1022,6]]},"454":{"position":[[1020,6]]},"464":{"position":[[1156,6]]},"473":{"position":[[213,8]]},"478":{"position":[[103,6]]},"481":{"position":[[245,6],[452,7]]},"483":{"position":[[475,9],[652,8]]},"486":{"position":[[141,7]]},"487":{"position":[[168,8],[277,9]]},"491":{"position":[[809,8],[1072,7],[1102,8]]},"495":{"position":[[251,6]]},"497":{"position":[[215,6]]},"506":{"position":[[171,8]]},"513":{"position":[[285,9]]},"515":{"position":[[66,9]]},"520":{"position":[[483,8]]},"526":{"position":[[53,8]]},"529":{"position":[[151,8]]},"530":{"position":[[370,9]]},"535":{"position":[[950,7]]},"544":{"position":[[195,6]]},"556":{"position":[[17,8]]},"559":{"position":[[1408,6]]},"566":{"position":[[933,6]]},"567":{"position":[[280,8]]},"574":{"position":[[509,9]]},"576":{"position":[[376,8]]},"579":{"position":[[550,8]]},"582":{"position":[[574,6]]},"586":{"position":[[18,8]]},"595":{"position":[[1025,7]]},"604":{"position":[[167,6]]},"611":{"position":[[1346,7]]},"612":{"position":[[1212,8]]},"617":{"position":[[1076,6]]},"623":{"position":[[689,8]]},"632":{"position":[[436,6],[468,8]]},"634":{"position":[[498,8]]},"635":{"position":[[456,8]]},"638":{"position":[[36,6]]},"643":{"position":[[269,6]]},"644":{"position":[[190,8]]},"688":{"position":[[196,8]]},"697":{"position":[[375,6]]},"698":{"position":[[2214,6]]},"700":{"position":[[564,6]]},"701":{"position":[[273,8],[521,8]]},"703":{"position":[[467,8]]},"711":{"position":[[1476,8]]},"714":{"position":[[6,7]]},"723":{"position":[[226,6]]},"740":{"position":[[327,6]]},"752":{"position":[[1236,8],[1261,7]]},"779":{"position":[[71,6]]},"800":{"position":[[153,8]]},"801":{"position":[[475,6]]},"802":{"position":[[834,8]]},"829":{"position":[[2126,6]]},"836":{"position":[[2049,8]]},"841":{"position":[[1121,8]]},"844":{"position":[[87,8],[118,7]]},"847":{"position":[[157,8]]},"860":{"position":[[266,9],[737,9],[821,6],[923,6]]},"861":{"position":[[1633,8]]},"863":{"position":[[598,8]]},"870":{"position":[[179,7]]},"886":{"position":[[1292,7]]},"896":{"position":[[281,7]]},"903":{"position":[[512,7]]},"908":{"position":[[17,8],[401,8]]},"913":{"position":[[124,8]]},"943":{"position":[[268,8]]},"962":{"position":[[169,6]]},"981":{"position":[[420,8],[1232,8]]},"990":{"position":[[296,6],[490,8],[1010,6]]},"1007":{"position":[[660,7]]},"1009":{"position":[[424,9]]},"1022":{"position":[[331,6]]},"1031":{"position":[[177,6]]},"1057":{"position":[[309,8],[401,7]]},"1089":{"position":[[148,6]]},"1094":{"position":[[366,6]]},"1111":{"position":[[15,6]]},"1120":{"position":[[169,7],[213,7]]},"1147":{"position":[[360,9]]},"1198":{"position":[[1972,9]]},"1200":{"position":[[53,8]]},"1207":{"position":[[781,7]]},"1258":{"position":[[77,8]]},"1299":{"position":[[24,8]]},"1304":{"position":[[690,8]]},"1307":{"position":[[512,6],[587,8],[831,6]]},"1313":{"position":[[1084,6]]},"1318":{"position":[[171,8]]}},"keywords":{}}],["handler",{"_index":1309,"title":{"690":{"position":[[24,9]]},"691":{"position":[[48,8]]},"1030":{"position":[[9,8]]},"1031":{"position":[[9,8]]},"1032":{"position":[[43,8]]},"1104":{"position":[[5,8]]},"1309":{"position":[[16,8]]}},"content":{"203":{"position":[[207,9]]},"209":{"position":[[719,8],[985,8]]},"255":{"position":[[1071,8],[1320,8],[1631,7]]},"392":{"position":[[1924,7],[2749,8],[3031,7],[4702,8]]},"397":{"position":[[1379,7],[1790,8]]},"403":{"position":[[460,8],[661,7]]},"412":{"position":[[4871,7],[5349,7]]},"463":{"position":[[1041,8]]},"612":{"position":[[881,8]]},"632":{"position":[[2365,8],[2502,8]]},"635":{"position":[[302,8]]},"680":{"position":[[249,8]]},"688":{"position":[[231,8],[267,8],[713,8]]},"690":{"position":[[14,8],[570,8]]},"691":{"position":[[158,7]]},"740":{"position":[[406,8]]},"749":{"position":[[733,7],[870,7],[15493,7],[15759,7],[15897,7],[22932,7]]},"784":{"position":[[155,7]]},"848":{"position":[[1136,7]]},"875":{"position":[[1353,8],[2906,8],[2985,7],[5984,8],[6555,7],[7768,8]]},"888":{"position":[[674,9]]},"889":{"position":[[1003,8]]},"904":{"position":[[1566,7],[2302,7],[2381,7],[2476,8]]},"906":{"position":[[275,8],[838,7]]},"908":{"position":[[205,7],[279,7]]},"934":{"position":[[796,7]]},"983":{"position":[[43,8]]},"986":{"position":[[644,8]]},"987":{"position":[[561,7],[765,7],[1009,7],[1126,8]]},"988":{"position":[[2405,7],[2974,7],[3071,8],[3504,7],[4241,8]]},"993":{"position":[[395,9]]},"1002":{"position":[[676,8],[1330,8]]},"1010":{"position":[[193,7],[254,7]]},"1020":{"position":[[263,7],[454,8]]},"1022":{"position":[[557,8]]},"1023":{"position":[[213,8]]},"1024":{"position":[[299,8]]},"1030":{"position":[[106,7]]},"1031":{"position":[[10,8],[73,7],[201,7]]},"1032":{"position":[[43,8],[170,8]]},"1033":{"position":[[395,8],[575,8],[806,8]]},"1104":{"position":[[268,7]]},"1111":{"position":[[46,7]]},"1117":{"position":[[118,8]]},"1149":{"position":[[438,7]]},"1175":{"position":[[402,7],[554,8]]},"1309":{"position":[[12,7],[151,7],[382,7],[795,7],[976,7],[1080,7],[1252,8]]}},"keywords":{}}],["handler'",{"_index":5654,"title":{},"content":{"1031":{"position":[[124,9]]}},"keywords":{}}],["handler(changeddoc",{"_index":5571,"title":{},"content":{"1007":{"position":[[1640,20]]}},"keywords":{}}],["handler(changerow",{"_index":5036,"title":{},"content":{"875":{"position":[[6192,20]]}},"keywords":{}}],["handler(checkpoint",{"_index":5569,"title":{},"content":{"1007":{"position":[[1476,19]]}},"keywords":{}}],["handler(checkpointornul",{"_index":5006,"title":{},"content":{"875":{"position":[[3148,25]]}},"keywords":{}}],["handler(doc",{"_index":5461,"title":{},"content":{"988":{"position":[[2422,13]]}},"keywords":{}}],["handler(lastcheckpoint",{"_index":5463,"title":{},"content":{"988":{"position":[[3521,23]]}},"keywords":{}}],["handler.avoid",{"_index":5666,"title":{},"content":{"1033":{"position":[[970,13]]}},"keywords":{}}],["happen",{"_index":455,"title":{},"content":{"28":{"position":[[297,7]]},"129":{"position":[[494,9]]},"201":{"position":[[301,6]]},"205":{"position":[[356,6]]},"366":{"position":[[469,7]]},"376":{"position":[[110,6]]},"407":{"position":[[244,7]]},"410":{"position":[[372,6]]},"412":{"position":[[3020,6],[7493,7]]},"415":{"position":[[38,6]]},"421":{"position":[[511,9]]},"464":{"position":[[104,6],[210,9]]},"474":{"position":[[143,6]]},"491":{"position":[[424,6]]},"626":{"position":[[83,8]]},"630":{"position":[[565,6]]},"632":{"position":[[1935,6]]},"698":{"position":[[1101,7],[2246,6]]},"740":{"position":[[27,6],[81,6]]},"745":{"position":[[186,7]]},"749":{"position":[[3342,7],[5916,7],[11950,7],[12050,7],[16713,7],[24394,6]]},"752":{"position":[[41,7]]},"778":{"position":[[376,7]]},"785":{"position":[[68,6]]},"817":{"position":[[90,6]]},"875":{"position":[[1434,8]]},"885":{"position":[[212,8]]},"932":{"position":[[515,7]]},"985":{"position":[[477,6]]},"987":{"position":[[116,6]]},"988":{"position":[[5918,8]]},"990":{"position":[[116,7]]},"993":{"position":[[354,6]]},"1031":{"position":[[289,7]]},"1048":{"position":[[269,7]]},"1072":{"position":[[782,6]]},"1090":{"position":[[1154,7]]},"1115":{"position":[[27,6],[904,9]]},"1116":{"position":[[220,6]]},"1120":{"position":[[655,6]]},"1162":{"position":[[161,6]]},"1174":{"position":[[241,6]]},"1181":{"position":[[227,6]]},"1299":{"position":[[212,6]]},"1300":{"position":[[214,10],[1070,6]]},"1301":{"position":[[1570,8]]},"1304":{"position":[[284,6]]},"1307":{"position":[[22,6],[153,6],[254,6],[667,7]]},"1315":{"position":[[1244,8],[1371,6],[1629,8]]},"1316":{"position":[[171,8],[1655,8]]},"1318":{"position":[[817,7]]}},"keywords":{}}],["happen.conflict",{"_index":3165,"title":{},"content":{"491":{"position":[[385,15]]}},"keywords":{}}],["happier",{"_index":1644,"title":{},"content":{"277":{"position":[[320,7]]},"411":{"position":[[5463,7]]}},"keywords":{}}],["haproxi",{"_index":4848,"title":{},"content":{"849":{"position":[[637,8]]}},"keywords":{}}],["har",{"_index":992,"title":{},"content":{"83":{"position":[[343,7]]},"87":{"position":[[43,7]]},"175":{"position":[[510,7]]},"285":{"position":[[126,10]]},"370":{"position":[[123,7]]},"432":{"position":[[957,7]]},"433":{"position":[[568,7]]},"445":{"position":[[2022,7]]},"500":{"position":[[557,10]]},"530":{"position":[[315,7]]}},"keywords":{}}],["hard",{"_index":254,"title":{},"content":{"15":{"position":[[253,4]]},"19":{"position":[[459,4]]},"29":{"position":[[333,4]]},"452":{"position":[[181,4]]},"455":{"position":[[464,4]]},"569":{"position":[[403,4]]},"595":{"position":[[805,4]]},"619":{"position":[[117,4]]},"689":{"position":[[385,4]]},"696":{"position":[[1745,4]]},"702":{"position":[[280,4]]},"709":{"position":[[466,4]]},"780":{"position":[[484,4]]},"785":{"position":[[9,5]]},"861":{"position":[[1593,4]]},"898":{"position":[[445,4]]},"1085":{"position":[[289,4],[3156,4]]},"1120":{"position":[[350,4]]},"1124":{"position":[[852,4]]},"1198":{"position":[[1129,4]]},"1305":{"position":[[301,4]]},"1316":{"position":[[345,4]]},"1317":{"position":[[794,5]]}},"keywords":{}}],["hardcod",{"_index":3349,"title":{},"content":{"554":{"position":[[1177,8]]},"556":{"position":[[32,10]]}},"keywords":{}}],["harder",{"_index":2673,"title":{},"content":{"412":{"position":[[2812,6],[13742,6]]},"417":{"position":[[218,6]]},"1319":{"position":[[658,6]]}},"keywords":{}}],["hardest",{"_index":2655,"title":{},"content":{"412":{"position":[[565,7]]}},"keywords":{}}],["hardi",{"_index":6028,"title":{},"content":{"1132":{"position":[[791,5]]}},"keywords":{}}],["hardwar",{"_index":2284,"title":{},"content":{"392":{"position":[[4907,8]]},"399":{"position":[[66,8],[160,8]]},"412":{"position":[[9788,9]]},"1091":{"position":[[50,8]]}},"keywords":{}}],["hardwhi",{"_index":6301,"title":{},"content":{"1260":{"position":[[33,7]]}},"keywords":{}}],["harmoni",{"_index":3221,"title":{},"content":{"501":{"position":[[330,12]]}},"keywords":{}}],["hash",{"_index":2334,"title":{},"content":{"396":{"position":[[115,7],[134,6],[1838,7]]},"412":{"position":[[3341,7]]},"698":{"position":[[609,6]]},"731":{"position":[[245,4]]},"927":{"position":[[5,4]]},"968":{"position":[[69,8],[102,4],[209,4],[234,4],[329,4]]}},"keywords":{}}],["hashfunct",{"_index":5399,"title":{"968":{"position":[[0,13]]}},"content":{"968":{"position":[[526,13]]}},"keywords":{}}],["hasn't",{"_index":2703,"title":{},"content":{"412":{"position":[[5936,6],[7924,6]]}},"keywords":{}}],["hassl",{"_index":3218,"title":{},"content":{"500":{"position":[[429,6]]}},"keywords":{}}],["have",{"_index":382,"title":{},"content":{"23":{"position":[[137,6],[238,6],[365,6]]},"27":{"position":[[97,6]]},"29":{"position":[[43,6]]},"65":{"position":[[801,6]]},"270":{"position":[[217,6]]},"364":{"position":[[718,6]]},"367":{"position":[[132,6]]},"402":{"position":[[2580,6]]},"404":{"position":[[749,6]]},"412":{"position":[[12731,6]]},"455":{"position":[[371,6]]},"457":{"position":[[557,6]]},"459":{"position":[[1030,6]]},"469":{"position":[[801,6]]},"696":{"position":[[368,6]]},"705":{"position":[[520,6]]},"710":{"position":[[1155,6]]},"723":{"position":[[938,6]]},"749":{"position":[[21575,6]]},"799":{"position":[[1,6]]},"800":{"position":[[351,6]]},"817":{"position":[[305,6]]},"875":{"position":[[9177,6]]},"943":{"position":[[202,6]]},"965":{"position":[[38,6]]},"966":{"position":[[415,6]]},"981":{"position":[[1467,6]]},"1068":{"position":[[219,6]]},"1147":{"position":[[1,6]]},"1211":{"position":[[457,6]]},"1219":{"position":[[204,6]]},"1246":{"position":[[1549,6]]},"1247":{"position":[[324,6],[497,6],[684,6]]},"1252":{"position":[[235,6]]},"1282":{"position":[[301,6]]},"1300":{"position":[[144,6]]},"1301":{"position":[[855,6]]},"1304":{"position":[[1655,6]]},"1305":{"position":[[39,6]]},"1316":{"position":[[3693,6]]}},"keywords":{}}],["haven't",{"_index":3186,"title":{},"content":{"495":{"position":[[318,7]]},"663":{"position":[[8,7]]},"776":{"position":[[42,7]]},"842":{"position":[[139,7]]},"898":{"position":[[523,7]]}},"keywords":{}}],["haven’t",{"_index":1857,"title":{},"content":{"303":{"position":[[1465,7]]}},"keywords":{}}],["hbase",{"_index":6583,"title":{},"content":{"1324":{"position":[[932,6]]}},"keywords":{}}],["headach",{"_index":2658,"title":{},"content":{"412":{"position":[[767,9],[11947,8]]}},"keywords":{}}],["header",{"_index":2912,"title":{},"content":{"434":{"position":[[283,7]]},"461":{"position":[[325,7],[387,6]]},"612":{"position":[[1479,6]]},"616":{"position":[[1110,8]]},"848":{"position":[[68,6],[162,6],[345,7],[455,7]]},"875":{"position":[[6289,8]]},"876":{"position":[[267,7]]},"878":{"position":[[486,8]]},"880":{"position":[[161,7],[255,7]]},"882":{"position":[[173,7]]},"885":{"position":[[1219,7],[1295,7],[1369,9]]},"886":{"position":[[1773,7],[1837,8],[3134,8],[3367,7],[3491,9],[3556,8],[3587,9],[3711,7],[4102,8],[4286,7],[4736,7],[4821,7]]},"887":{"position":[[361,8]]},"888":{"position":[[502,8]]},"889":{"position":[[551,8]]},"890":{"position":[[256,7]]},"988":{"position":[[2584,8]]},"1102":{"position":[[557,8],[996,7]]},"1104":{"position":[[132,7],[291,7],[709,6]]}},"keywords":{}}],["healthpoint",{"_index":3227,"title":{},"content":{"502":{"position":[[950,13]]},"518":{"position":[[417,13]]},"571":{"position":[[891,13]]},"579":{"position":[[739,13]]},"580":{"position":[[518,13]]},"1074":{"position":[[311,12]]}},"keywords":{}}],["hear",{"_index":3447,"title":{},"content":{"569":{"position":[[36,4]]},"1249":{"position":[[84,4]]}},"keywords":{}}],["heart",{"_index":1677,"title":{},"content":{"289":{"position":[[8,5]]},"489":{"position":[[25,5]]},"501":{"position":[[8,5]]}},"keywords":{}}],["heartbeat",{"_index":3579,"title":{},"content":{"611":{"position":[[1195,9]]},"846":{"position":[[877,9],[1056,10]]}},"keywords":{}}],["heatmap",{"_index":4086,"title":{},"content":{"736":{"position":[[121,9]]}},"keywords":{}}],["heavi",{"_index":1315,"title":{"204":{"position":[[30,5]]}},"content":{"251":{"position":[[220,5]]},"262":{"position":[[163,6]]},"354":{"position":[[111,5]]},"362":{"position":[[266,5]]},"408":{"position":[[135,5],[3700,5]]},"412":{"position":[[10174,5],[10791,5],[14072,5]]},"446":{"position":[[1033,5]]},"451":{"position":[[643,5]]},"460":{"position":[[14,5]]},"497":{"position":[[348,5]]},"642":{"position":[[141,5]]},"704":{"position":[[491,5]]},"801":{"position":[[277,5]]},"841":{"position":[[1074,5]]},"1069":{"position":[[48,5]]},"1092":{"position":[[401,5]]},"1316":{"position":[[2747,5]]}},"keywords":{}}],["heavier",{"_index":6098,"title":{},"content":{"1157":{"position":[[361,7]]}},"keywords":{}}],["heavili",{"_index":1395,"title":{},"content":{"216":{"position":[[287,7]]},"354":{"position":[[1078,7]]},"411":{"position":[[5667,7]]},"430":{"position":[[215,7]]},"446":{"position":[[75,7]]},"821":{"position":[[350,7],[607,7]]},"839":{"position":[[857,7]]},"875":{"position":[[7635,7]]}},"keywords":{}}],["height",{"_index":6493,"title":{},"content":{"1305":{"position":[[594,7]]}},"keywords":{}}],["heighten",{"_index":3242,"title":{},"content":{"507":{"position":[[184,10]]}},"keywords":{}}],["hello",{"_index":3608,"title":{},"content":{"612":{"position":[[2306,6]]}},"keywords":{}}],["help",{"_index":1147,"title":{"669":{"position":[[8,5]]},"796":{"position":[[0,4]]}},"content":{"146":{"position":[[149,4]]},"175":{"position":[[111,8]]},"178":{"position":[[223,5]]},"303":{"position":[[399,7]]},"304":{"position":[[379,7]]},"316":{"position":[[503,5]]},"328":{"position":[[231,4]]},"360":{"position":[[784,5]]},"369":{"position":[[1126,4]]},"382":{"position":[[315,4]]},"385":{"position":[[294,5]]},"390":{"position":[[1888,4]]},"397":{"position":[[266,5]]},"418":{"position":[[27,7]]},"420":{"position":[[1012,4]]},"495":{"position":[[485,4]]},"550":{"position":[[353,4]]},"556":{"position":[[1420,4]]},"669":{"position":[[13,4]]},"670":{"position":[[147,4],[402,4]]},"776":{"position":[[190,4]]},"834":{"position":[[143,7]]},"838":{"position":[[1011,5]]},"906":{"position":[[123,5]]},"1003":{"position":[[74,5]]},"1058":{"position":[[90,7]]},"1151":{"position":[[447,4]]},"1178":{"position":[[446,4]]},"1268":{"position":[[215,7]]}},"keywords":{}}],["helper",{"_index":3923,"title":{},"content":{"693":{"position":[[308,6]]},"711":{"position":[[2340,7]]},"848":{"position":[[1069,6]]},"889":{"position":[[792,6],[829,6]]},"1219":{"position":[[36,6]]},"1274":{"position":[[561,6]]},"1279":{"position":[[948,6]]},"1296":{"position":[[576,6]]}},"keywords":{}}],["henc",{"_index":3463,"title":{},"content":{"569":{"position":[[862,6]]}},"keywords":{}}],["here",{"_index":193,"title":{},"content":{"13":{"position":[[307,4]]},"60":{"position":[[1,4]]},"98":{"position":[[141,4]]},"188":{"position":[[1749,4]]},"210":{"position":[[625,5]]},"225":{"position":[[102,4]]},"314":{"position":[[658,4]]},"388":{"position":[[23,4]]},"394":{"position":[[1339,5]]},"398":{"position":[[432,4]]},"412":{"position":[[4362,4]]},"461":{"position":[[203,5],[781,5],[1379,5],[1614,5]]},"463":{"position":[[539,4],[775,4],[988,4]]},"464":{"position":[[427,4]]},"465":{"position":[[288,4]]},"466":{"position":[[252,4]]},"467":{"position":[[247,4]]},"469":{"position":[[153,5],[1276,4]]},"496":{"position":[[873,5]]},"498":{"position":[[59,4]]},"534":{"position":[[120,4]]},"547":{"position":[[1,4]]},"567":{"position":[[135,4]]},"590":{"position":[[1,4]]},"594":{"position":[[118,4]]},"607":{"position":[[1,4]]},"620":{"position":[[383,4]]},"664":{"position":[[57,4]]},"729":{"position":[[324,5]]},"739":{"position":[[18,4]]},"765":{"position":[[91,4]]},"772":{"position":[[2512,4]]},"791":{"position":[[219,4]]},"796":{"position":[[1170,4]]},"805":{"position":[[263,4]]},"806":{"position":[[179,5],[417,5]]},"813":{"position":[[244,5]]},"820":{"position":[[504,4]]},"826":{"position":[[266,4]]},"829":{"position":[[803,4]]},"831":{"position":[[434,5]]},"847":{"position":[[166,5]]},"848":{"position":[[829,5],[1464,5]]},"849":{"position":[[334,6]]},"868":{"position":[[116,4]]},"875":{"position":[[1621,4],[7029,4]]},"886":{"position":[[2133,5]]},"898":{"position":[[780,4]]},"904":{"position":[[77,4],[376,4],[2353,4]]},"906":{"position":[[740,4]]},"908":{"position":[[410,4]]},"912":{"position":[[771,5]]},"932":{"position":[[1332,5]]},"936":{"position":[[162,5]]},"963":{"position":[[203,5]]},"988":{"position":[[1848,5],[4934,4]]},"1002":{"position":[[836,4]]},"1020":{"position":[[490,4]]},"1065":{"position":[[1,4]]},"1085":{"position":[[1498,4]]},"1097":{"position":[[810,4]]},"1108":{"position":[[472,4]]},"1137":{"position":[[1,4]]},"1147":{"position":[[80,4]]},"1154":{"position":[[528,4]]},"1163":{"position":[[175,4]]},"1182":{"position":[[175,4]]},"1191":{"position":[[534,4]]},"1194":{"position":[[1,4],[439,4],[613,4],[713,4],[807,4],[1009,4]]},"1202":{"position":[[363,5]]},"1209":{"position":[[404,4]]},"1220":{"position":[[305,4]]},"1222":{"position":[[283,4]]},"1225":{"position":[[385,4]]},"1226":{"position":[[466,5]]},"1236":{"position":[[47,4]]},"1237":{"position":[[98,4]]},"1238":{"position":[[134,4]]},"1239":{"position":[[1,4]]},"1263":{"position":[[279,4]]},"1264":{"position":[[369,5]]},"1266":{"position":[[72,4]]},"1271":{"position":[[1243,4]]},"1297":{"position":[[394,5]]},"1299":{"position":[[186,4]]},"1304":{"position":[[1227,5]]},"1308":{"position":[[685,5]]}},"keywords":{}}],["here'",{"_index":1033,"title":{},"content":{"102":{"position":[[86,6]]},"393":{"position":[[808,6]]},"397":{"position":[[355,6]]},"412":{"position":[[346,6]]},"426":{"position":[[251,6]]},"541":{"position":[[94,6]]},"601":{"position":[[1,6]]},"612":{"position":[[1043,6],[1673,6]]},"1292":{"position":[[828,6]]}},"keywords":{}}],["here.ther",{"_index":4718,"title":{},"content":{"824":{"position":[[83,10]]}},"keywords":{}}],["hero",{"_index":768,"title":{},"content":{"51":{"position":[[283,5],[336,4],[849,7]]},"52":{"position":[[327,6]]},"54":{"position":[[239,4],[247,7]]},"55":{"position":[[1161,4]]},"130":{"position":[[584,4],[592,7]]},"188":{"position":[[1200,7]]},"334":{"position":[[581,5],[606,5]]},"335":{"position":[[127,6],[240,4],[377,4],[576,4],[862,4],[904,4],[960,6]]},"538":{"position":[[584,5],[637,4],[872,7]]},"539":{"position":[[327,6]]},"541":{"position":[[259,8]]},"542":{"position":[[787,6]]},"562":{"position":[[292,5],[500,7],[1130,8]]},"579":{"position":[[589,5],[614,5]]},"580":{"position":[[380,6]]},"598":{"position":[[591,5],[644,4],[879,7]]},"599":{"position":[[354,6]]},"601":{"position":[[452,6]]},"789":{"position":[[151,6],[194,7],[398,6],[441,7],[561,8]]},"791":{"position":[[7,6],[50,7],[266,6],[309,7]]},"792":{"position":[[134,6],[177,7]]},"829":{"position":[[747,7],[2394,9],[2619,7],[3310,9]]},"939":{"position":[[176,7]]},"979":{"position":[[336,7]]},"1074":{"position":[[36,4]]},"1075":{"position":[[35,7],[112,6]]},"1311":{"position":[[996,7],[1459,5]]}},"keywords":{}}],["hero"",{"_index":5817,"title":{},"content":{"1074":{"position":[[796,11]]}},"keywords":{}}],["hero.allow",{"_index":5811,"title":{},"content":{"1074":{"position":[[618,11]]}},"keywords":{}}],["hero.healthpoint",{"_index":3508,"title":{},"content":{"580":{"position":[[854,17]]}},"keywords":{}}],["hero.nam",{"_index":823,"title":{},"content":{"54":{"position":[[276,9]]},"55":{"position":[[1197,9]]},"562":{"position":[[1508,11]]},"580":{"position":[[832,9]]},"601":{"position":[[234,9]]},"602":{"position":[[621,9]]}},"keywords":{}}],["hero.point",{"_index":1951,"title":{},"content":{"335":{"position":[[510,14]]}},"keywords":{}}],["hero.pow",{"_index":3318,"title":{},"content":{"541":{"position":[[680,12]]},"562":{"position":[[1529,12]]},"601":{"position":[[267,10]]},"602":{"position":[[654,10]]}},"keywords":{}}],["hero.scream('aah",{"_index":6520,"title":{},"content":{"1311":{"position":[[1654,20]]}},"keywords":{}}],["herocollect",{"_index":6507,"title":{},"content":{"1311":{"position":[[874,15],[1176,15]]}},"keywords":{}}],["herocollectionmethod",{"_index":6505,"title":{},"content":{"1311":{"position":[[785,22],[808,21],[1060,21]]}},"keywords":{}}],["herocount",{"_index":4757,"title":{},"content":{"829":{"position":[[2462,9]]}},"keywords":{}}],["herodb",{"_index":3426,"title":{},"content":{"562":{"position":[[192,9]]}},"keywords":{}}],["herodb_sign",{"_index":3433,"title":{},"content":{"563":{"position":[[504,17]]}},"keywords":{}}],["herodocmethod",{"_index":6500,"title":{},"content":{"1311":{"position":[[627,15],[643,14],[1035,15]]}},"keywords":{}}],["herodoctyp",{"_index":6513,"title":{},"content":{"1311":{"position":[[1241,12]]}},"keywords":{}}],["herodocu",{"_index":6502,"title":{},"content":{"1311":{"position":[[685,13],[1277,12],[1465,12]]}},"keywords":{}}],["heroes"",{"_index":3505,"title":{},"content":{"580":{"position":[[787,12]]},"601":{"position":[[175,12]]}},"keywords":{}}],["heroes.findone().exec",{"_index":4605,"title":{},"content":{"791":{"position":[[154,24],[474,24]]},"792":{"position":[[285,24]]}},"keywords":{}}],["heroes.foreach((hero",{"_index":1947,"title":{},"content":{"335":{"position":[[393,21]]}},"keywords":{}}],["heroes.insert",{"_index":4607,"title":{},"content":{"791":{"position":[[419,15]]}},"keywords":{}}],["heroes.map(hero",{"_index":3315,"title":{},"content":{"541":{"position":[[587,16]]},"542":{"position":[[838,16]]},"562":{"position":[[1458,16]]}},"keywords":{}}],["heroes.valu",{"_index":3499,"title":{},"content":{"580":{"position":[[682,12]]},"601":{"position":[[670,12]]}},"keywords":{}}],["heroes;">",{"_index":1100,"title":{},"content":{"130":{"position":[[611,17]]}},"keywords":{}}],["heroesdb",{"_index":779,"title":{},"content":{"51":{"position":[[724,11]]},"334":{"position":[[358,11]]},"522":{"position":[[439,11]]},"538":{"position":[[454,11]]},"579":{"position":[[367,11]]},"598":{"position":[[461,11]]},"653":{"position":[[278,11]]},"680":{"position":[[699,11]]},"960":{"position":[[307,11]]},"966":{"position":[[562,11],[680,11]]},"967":{"position":[[147,11],[265,11]]},"1085":{"position":[[3781,10]]},"1114":{"position":[[736,11]]},"1121":{"position":[[476,11]]}},"keywords":{}}],["heroesreactdb",{"_index":4745,"title":{},"content":{"829":{"position":[[664,16]]}},"keywords":{}}],["heroessign",{"_index":850,"title":{},"content":{"55":{"position":[[1083,12]]},"563":{"position":[[705,12],[786,14]]},"602":{"position":[[225,12],[367,14]]}},"keywords":{}}],["heroessignal()">",{"_index":852,"title":{},"content":{"55":{"position":[[1169,24]]}},"keywords":{}}],["heroessignal.valu",{"_index":3544,"title":{},"content":{"602":{"position":[[470,18]]}},"keywords":{}}],["heroessignal.value"",{"_index":3545,"title":{},"content":{"602":{"position":[[550,24]]}},"keywords":{}}],["heroinputpushrowt0assumedmasterstatet0",{"_index":5085,"title":{},"content":{"885":{"position":[[957,38]]}},"keywords":{}}],["heroinputpushrowt0newdocumentstatet0",{"_index":5086,"title":{},"content":{"885":{"position":[[1014,37]]}},"keywords":{}}],["herolist",{"_index":3306,"title":{},"content":{"541":{"position":[[226,10]]},"542":{"position":[[754,10]]},"562":{"position":[[1097,10],[1590,9]]},"829":{"position":[[3378,8]]}},"keywords":{}}],["herolist').append",{"_index":1948,"title":{},"content":{"335":{"position":[[423,23]]}},"keywords":{}}],["herolist').empti",{"_index":1945,"title":{},"content":{"335":{"position":[[338,23]]}},"keywords":{}}],["herolist.vu",{"_index":3491,"title":{},"content":{"580":{"position":[[265,12]]}},"keywords":{}}],["heronam",{"_index":1953,"title":{},"content":{"335":{"position":[[633,8],[779,9]]}},"keywords":{}}],["heroname').v",{"_index":1954,"title":{},"content":{"335":{"position":[[644,21]]}},"keywords":{}}],["heropoint",{"_index":1955,"title":{},"content":{"335":{"position":[[672,10],[797,10]]}},"keywords":{}}],["heroschema",{"_index":766,"title":{},"content":{"51":{"position":[[261,10],[867,10]]},"538":{"position":[[562,10],[890,10]]},"562":{"position":[[270,10],[518,10]]},"598":{"position":[[569,10],[897,10]]},"1311":{"position":[[246,11],[1014,11]]}},"keywords":{}}],["hibern",{"_index":5545,"title":{},"content":{"1003":{"position":[[146,10]]}},"keywords":{}}],["hidden",{"_index":5546,"title":{},"content":{"1003":{"position":[[210,7]]}},"keywords":{}}],["hide",{"_index":4744,"title":{},"content":{"828":{"position":[[314,6]]},"898":{"position":[[685,4]]}},"keywords":{}}],["hideloadingspinn",{"_index":5521,"title":{},"content":{"995":{"position":[[2013,21]]}},"keywords":{}}],["hierarch",{"_index":2007,"title":{},"content":{"353":{"position":[[304,12]]},"364":{"position":[[616,12]]},"396":{"position":[[592,12]]}},"keywords":{}}],["high",{"_index":1207,"title":{"1238":{"position":[[0,4]]}},"content":{"173":{"position":[[2133,4]]},"177":{"position":[[105,4]]},"265":{"position":[[913,4]]},"267":{"position":[[976,4]]},"385":{"position":[[95,4]]},"390":{"position":[[100,4]]},"396":{"position":[[261,4]]},"399":{"position":[[254,4],[550,4]]},"412":{"position":[[10645,4]]},"441":{"position":[[365,4]]},"454":{"position":[[53,4]]},"483":{"position":[[1008,4]]},"497":{"position":[[100,4],[309,4]]},"566":{"position":[[335,4]]},"611":{"position":[[566,4]]},"613":{"position":[[408,4]]},"622":{"position":[[24,4],[587,4]]},"623":{"position":[[491,4]]},"624":{"position":[[1433,4]]},"643":{"position":[[23,4]]},"802":{"position":[[875,4]]},"901":{"position":[[462,4]]},"902":{"position":[[834,4],[912,4]]},"1206":{"position":[[439,4]]},"1294":{"position":[[1923,4]]}},"keywords":{}}],["higher",{"_index":761,"title":{},"content":{"51":{"position":[[115,6]]},"396":{"position":[[687,6]]},"408":{"position":[[2224,6]]},"621":{"position":[[377,6]]},"622":{"position":[[333,6]]},"689":{"position":[[94,6]]},"821":{"position":[[878,6]]},"1170":{"position":[[265,6]]},"1194":{"position":[[1050,6]]}},"keywords":{}}],["highli",{"_index":1171,"title":{},"content":{"156":{"position":[[288,6]]},"265":{"position":[[469,6]]},"358":{"position":[[572,6]]},"390":{"position":[[1154,6]]},"433":{"position":[[140,6]]},"445":{"position":[[1520,6]]},"447":{"position":[[407,6]]},"548":{"position":[[209,6]]},"608":{"position":[[209,6]]},"623":{"position":[[633,6]]},"723":{"position":[[324,6]]},"1132":{"position":[[427,6]]}},"keywords":{}}],["highlight",{"_index":2577,"title":{},"content":{"408":{"position":[[5406,9]]},"419":{"position":[[925,10]]},"420":{"position":[[1464,10]]}},"keywords":{}}],["hinder",{"_index":2888,"title":{},"content":{"427":{"position":[[1047,6]]}},"keywords":{}}],["hint",{"_index":1815,"title":{},"content":{"302":{"position":[[1021,5]]}},"keywords":{}}],["hipaa",{"_index":3336,"title":{},"content":{"550":{"position":[[422,6]]}},"keywords":{}}],["histor",{"_index":1721,"title":{},"content":{"298":{"position":[[583,12]]},"299":{"position":[[626,12],[1165,13]]},"331":{"position":[[1,13]]},"408":{"position":[[1144,13]]}},"keywords":{}}],["histori",{"_index":2845,"title":{},"content":{"421":{"position":[[14,7]]},"439":{"position":[[251,8]]},"449":{"position":[[88,8]]},"635":{"position":[[394,10]]},"1316":{"position":[[3083,8]]}},"keywords":{}}],["hit",{"_index":1322,"title":{},"content":{"205":{"position":[[11,3]]},"304":{"position":[[198,3]]},"321":{"position":[[284,7]]},"408":{"position":[[1333,7]]},"410":{"position":[[2199,3]]}},"keywords":{}}],["hnsw",{"_index":2342,"title":{},"content":{"396":{"position":[[570,7],[578,4]]}},"keywords":{}}],["hnsw'",{"_index":2340,"title":{},"content":{"396":{"position":[[514,6]]}},"keywords":{}}],["hold",{"_index":1985,"title":{},"content":{"350":{"position":[[63,4]]},"411":{"position":[[1910,5]]},"417":{"position":[[20,4]]}},"keywords":{}}],["home",{"_index":3215,"title":{},"content":{"500":{"position":[[165,4]]}},"keywords":{}}],["hood",{"_index":2736,"title":{},"content":{"412":{"position":[[9872,5]]},"490":{"position":[[484,5]]},"566":{"position":[[813,4]]}},"keywords":{}}],["hood.i",{"_index":445,"title":{},"content":{"27":{"position":[[369,9]]}},"keywords":{}}],["hoodi",{"_index":436,"title":{"27":{"position":[[0,7]]}},"content":{"27":{"position":[[1,6],[200,6],[329,6]]}},"keywords":{}}],["hook",{"_index":517,"title":{"523":{"position":[[17,6]]},"541":{"position":[[32,6]]},"764":{"position":[[25,6]]},"802":{"position":[[21,6]]},"1118":{"position":[[25,6]]}},"content":{"33":{"position":[[285,6]]},"134":{"position":[[276,5]]},"147":{"position":[[188,5]]},"381":{"position":[[375,5]]},"494":{"position":[[494,4]]},"523":{"position":[[10,5],[48,5],[109,5],[285,5]]},"540":{"position":[[189,5]]},"582":{"position":[[565,5]]},"590":{"position":[[451,5]]},"749":{"position":[[7490,4],[7570,5],[7670,4],[7772,5]]},"763":{"position":[[29,6]]},"764":{"position":[[300,5]]},"766":{"position":[[5,5],[166,5],[219,4]]},"767":{"position":[[11,4]]},"768":{"position":[[8,4]]},"769":{"position":[[11,4]]},"770":{"position":[[6,4],[278,5],[543,4],[629,5]]},"802":{"position":[[17,5],[134,4],[627,5]]},"806":{"position":[[186,5],[297,5],[358,5],[411,5]]},"828":{"position":[[164,6],[250,5],[390,6]]},"829":{"position":[[280,6],[1997,4],[2149,4],[2311,5],[2850,4],[3116,5],[3126,4]]},"830":{"position":[[5,5]]},"831":{"position":[[26,5]]},"899":{"position":[[66,5]]},"1117":{"position":[[143,6]]},"1118":{"position":[[93,6]]},"1284":{"position":[[25,5],[40,5]]},"1311":{"position":[[1108,4]]}},"keywords":{}}],["hooksdelet",{"_index":4550,"title":{},"content":{"769":{"position":[[137,12]]}},"keywords":{}}],["hooksev",{"_index":4529,"title":{},"content":{"767":{"position":[[250,10]]},"768":{"position":[[209,10]]},"769":{"position":[[224,10]]}},"keywords":{}}],["hookspostinsert",{"_index":4528,"title":{},"content":{"767":{"position":[[225,15]]}},"keywords":{}}],["hookspostremov",{"_index":4552,"title":{},"content":{"769":{"position":[[199,15]]}},"keywords":{}}],["hookspostsav",{"_index":4540,"title":{},"content":{"768":{"position":[[186,13]]}},"keywords":{}}],["hookspreinsert",{"_index":4524,"title":{},"content":{"767":{"position":[[121,14]]}},"keywords":{}}],["hookspreremov",{"_index":4549,"title":{},"content":{"769":{"position":[[113,14]]}},"keywords":{}}],["hookspresav",{"_index":4537,"title":{},"content":{"768":{"position":[[104,12]]}},"keywords":{}}],["hooksschema",{"_index":4525,"title":{},"content":{"767":{"position":[[145,11]]}},"keywords":{}}],["hooksupd",{"_index":4538,"title":{},"content":{"768":{"position":[[126,12]]}},"keywords":{}}],["hop",{"_index":2143,"title":{},"content":{"376":{"position":[[193,5]]},"902":{"position":[[48,4]]}},"keywords":{}}],["hope",{"_index":3962,"title":{},"content":{"702":{"position":[[417,4]]}},"keywords":{}}],["hopefulli",{"_index":3938,"title":{},"content":{"696":{"position":[[1635,9]]},"700":{"position":[[238,9]]}},"keywords":{}}],["horizon",{"_index":358,"title":{"21":{"position":[[0,8]]}},"content":{"21":{"position":[[1,7],[199,8]]}},"keywords":{}}],["horizont",{"_index":2010,"title":{"1091":{"position":[[0,10]]}},"content":{"353":{"position":[[377,10]]},"772":{"position":[[386,12]]},"1094":{"position":[[140,12]]},"1295":{"position":[[100,13],[580,12]]}},"keywords":{}}],["host",{"_index":235,"title":{},"content":{"14":{"position":[[1033,6],[1114,6]]},"18":{"position":[[229,6]]},"174":{"position":[[3051,6]]},"202":{"position":[[98,7],[129,4]]},"204":{"position":[[298,7]]},"249":{"position":[[54,7],[81,4]]},"289":{"position":[[1030,6]]},"485":{"position":[[24,4]]},"504":{"position":[[1151,6]]},"840":{"position":[[571,6]]},"849":{"position":[[1017,4],[1022,6]]},"861":{"position":[[47,4],[207,4],[272,6]]},"862":{"position":[[949,6]]},"870":{"position":[[225,6]]},"896":{"position":[[29,6]]},"902":{"position":[[864,7]]},"903":{"position":[[377,5]]},"1124":{"position":[[2065,6]]},"1246":{"position":[[861,4]]}},"keywords":{}}],["hosting.miss",{"_index":4799,"title":{},"content":{"839":{"position":[[629,15]]}},"keywords":{}}],["hot",{"_index":4212,"title":{"799":{"position":[[13,5]]}},"content":{"749":{"position":[[5952,3]]},"799":{"position":[[748,3]]}},"keywords":{}}],["hour",{"_index":2251,"title":{},"content":{"392":{"position":[[3152,5]]},"995":{"position":[[1410,6]]}},"keywords":{}}],["hp",{"_index":3507,"title":{},"content":{"580":{"position":[[847,3]]}},"keywords":{}}],["href="https://rxdb.info/react.html">rxdb</a>",{"_index":4751,"title":{},"content":{"829":{"position":[[1640,63]]}},"keywords":{}}],["hsw",{"_index":2338,"title":{},"content":{"396":{"position":[[349,3]]}},"keywords":{}}],["html",{"_index":1626,"title":{},"content":{"269":{"position":[[76,6]]},"571":{"position":[[800,4],[1053,4]]}},"keywords":{}}],["http",{"_index":131,"title":{"874":{"position":[[0,4]]},"1032":{"position":[[22,4]]}},"content":{"8":{"position":[[1076,8]]},"16":{"position":[[154,5]]},"165":{"position":[[212,5]]},"434":{"position":[[278,4]]},"450":{"position":[[384,4]]},"461":{"position":[[117,4],[362,4]]},"487":{"position":[[55,4]]},"491":{"position":[[583,4],[1638,4]]},"556":{"position":[[1563,5]]},"565":{"position":[[118,6]]},"566":{"position":[[1171,6]]},"570":{"position":[[647,4]]},"610":{"position":[[122,5]]},"611":{"position":[[210,4],[414,4]]},"612":{"position":[[91,5],[416,4]]},"616":{"position":[[349,4],[471,4],[702,4],[1105,4]]},"617":{"position":[[854,4]]},"619":{"position":[[223,4],[365,4]]},"621":{"position":[[342,4],[425,4]]},"623":{"position":[[361,4]]},"624":{"position":[[1478,4]]},"626":{"position":[[723,4]]},"632":{"position":[[836,4]]},"696":{"position":[[525,4]]},"749":{"position":[[21180,4]]},"793":{"position":[[637,4]]},"837":{"position":[[1615,6]]},"841":{"position":[[774,6]]},"846":{"position":[[694,4]]},"848":{"position":[[63,4]]},"863":{"position":[[376,4]]},"871":{"position":[[302,5],[781,4]]},"875":{"position":[[75,4],[169,4],[503,4],[751,4],[1308,4]]},"876":{"position":[[56,4],[284,4]]},"886":{"position":[[1098,5],[1803,4],[2730,5],[3917,5]]},"968":{"position":[[735,5]]},"1010":{"position":[[126,4]]},"1032":{"position":[[14,4]]},"1097":{"position":[[317,4]]},"1102":{"position":[[110,4],[433,4]]}},"keywords":{}}],["http.encrypt",{"_index":4790,"title":{},"content":{"838":{"position":[[810,15]]}},"keywords":{}}],["http/",{"_index":3676,"title":{},"content":{"624":{"position":[[223,6]]}},"keywords":{}}],["http/1.1",{"_index":3632,"title":{},"content":{"617":{"position":[[351,8]]}},"keywords":{}}],["http/2",{"_index":3644,"title":{},"content":{"617":{"position":[[1182,6]]}},"keywords":{}}],["http/3",{"_index":3617,"title":{},"content":{"613":{"position":[[136,6]]},"617":{"position":[[1192,6]]},"620":{"position":[[559,6]]},"621":{"position":[[810,6]]},"624":{"position":[[1044,6],[1152,6]]}},"keywords":{}}],["http/3'",{"_index":3674,"title":{},"content":{"623":{"position":[[666,8]]}},"keywords":{}}],["http/websocket",{"_index":5191,"title":{},"content":{"897":{"position":[[398,15]]}},"keywords":{}}],["http1.1",{"_index":4844,"title":{},"content":{"849":{"position":[[51,7]]}},"keywords":{}}],["http2",{"_index":4850,"title":{},"content":{"849":{"position":[[806,5],[872,5]]}},"keywords":{}}],["http2.0",{"_index":4849,"title":{},"content":{"849":{"position":[[702,8],[717,7]]}},"keywords":{}}],["http://172.0.0.1:5984",{"_index":4852,"title":{},"content":{"849":{"position":[[936,22]]}},"keywords":{}}],["http://example.com",{"_index":5948,"title":{},"content":{"1103":{"position":[[247,20],[396,20]]}},"keywords":{}}],["http://example.com/db",{"_index":4860,"title":{},"content":{"851":{"position":[[335,24]]}},"keywords":{}}],["http://example.com/db/human",{"_index":4823,"title":{},"content":{"846":{"position":[[286,31]]},"848":{"position":[[761,31],[1396,31]]},"852":{"position":[[279,31]]},"1149":{"position":[[1437,30]]}},"keywords":{}}],["http://example.com/graphql",{"_index":5122,"title":{},"content":{"886":{"position":[[1104,28],[2736,28],[3923,29]]}},"keywords":{}}],["http://localhost/pullstream",{"_index":5049,"title":{},"content":{"875":{"position":[[8145,30],[9564,30]]}},"keywords":{}}],["http://localhost:${port",{"_index":3616,"title":{},"content":{"612":{"position":[[2537,28]]}},"keywords":{}}],["http://localhost:3000/repl",{"_index":1460,"title":{},"content":{"243":{"position":[[493,33]]}},"keywords":{}}],["http://localhost:4000",{"_index":3842,"title":{},"content":{"670":{"position":[[568,22]]}},"keywords":{}}],["http://localhost:80/mi",{"_index":5934,"title":{},"content":{"1101":{"position":[[758,23]]}},"keywords":{}}],["http://localhost:80/users/0",{"_index":5066,"title":{},"content":{"878":{"position":[[385,30]]}},"keywords":{}}],["http://localhost:8080/${endpoint.urlpath",{"_index":4967,"title":{},"content":{"872":{"position":[[3478,45]]}},"keywords":{}}],["http://localhost:8080/humans/0",{"_index":4973,"title":{},"content":{"872":{"position":[[4404,30],[4548,33]]}},"keywords":{}}],["http://localhost:8080?n",{"_index":4868,"title":{},"content":{"854":{"position":[[293,27]]}},"keywords":{}}],["httppouch",{"_index":4780,"title":{},"content":{"837":{"position":[[1583,9]]}},"keywords":{}}],["https://cordova.apache.org/docs/de/latest/cordova/events/events.deviceready.html",{"_index":157,"title":{},"content":{"11":{"position":[[427,80]]}},"keywords":{}}],["https://developer.mozilla.org/en",{"_index":6267,"title":{},"content":{"1226":{"position":[[482,32]]},"1264":{"position":[[385,32]]}},"keywords":{}}],["https://discord.com/channels/969553741705539624/1341392686267109458/1343639513850843217",{"_index":4148,"title":{},"content":{"749":{"position":[[1172,87]]}},"keywords":{}}],["https://docs.couchdb.org/en/3.2.2",{"_index":4827,"title":{},"content":{"846":{"position":[[960,33]]}},"keywords":{}}],["https://example.com/api/sync",{"_index":5454,"title":{},"content":{"988":{"position":[[580,30]]}},"keywords":{}}],["https://example.com/api/sync/?minupdatedat=${mintimestamp}&limit=${batchs",{"_index":5466,"title":{},"content":{"988":{"position":[[3720,83]]}},"keywords":{}}],["https://example.com/mydatabas",{"_index":4346,"title":{},"content":{"749":{"position":[[16164,33]]}},"keywords":{}}],["https://firestore.googleapis.com/${projectid",{"_index":4873,"title":{},"content":{"854":{"position":[[644,48]]}},"keywords":{}}],["https://github.com/nextapp",{"_index":4059,"title":{},"content":{"724":{"position":[[1423,27],[1729,27]]}},"keywords":{}}],["https://github.com/pubkey/rxdb",{"_index":5921,"title":{},"content":{"1097":{"position":[[538,30]]}},"keywords":{}}],["https://github.com/pubkey/rxdb.gitinstal",{"_index":3824,"title":{},"content":{"666":{"position":[[157,41]]}},"keywords":{}}],["https://github.com/pubkey/rxdb/issues/6792#issuecom",{"_index":4181,"title":{},"content":{"749":{"position":[[3731,55]]}},"keywords":{}}],["https://github.com/pubkey/rxdb/pull/6643#issuecom",{"_index":4423,"title":{},"content":{"749":{"position":[[23081,53]]}},"keywords":{}}],["https://localhost/pull?updatedat=${updatedat}&id=${id}&limit=${batchs",{"_index":5010,"title":{},"content":{"875":{"position":[[3341,83]]}},"keywords":{}}],["https://neighbourhood.ie/blog/2020/10/13/everyth",{"_index":4136,"title":{},"content":{"749":{"position":[[198,51]]}},"keywords":{}}],["https://pouchdb.com/api.html#create_databas",{"_index":6181,"title":{},"content":{"1201":{"position":[[301,44]]}},"keywords":{}}],["https://rxdb.info/articles/indexeddb",{"_index":1465,"title":{},"content":{"243":{"position":[[585,36],[686,36],[785,36],[882,36]]}},"keywords":{}}],["https://rxdb.info/migr",{"_index":4297,"title":{},"content":{"749":{"position":[[12667,27]]}},"keywords":{}}],["https://rxdb.info/repl",{"_index":4336,"title":{},"content":{"749":{"position":[[15358,29]]}},"keywords":{}}],["https://rxdb.info/rx",{"_index":4057,"title":{},"content":{"724":{"position":[[1112,20]]},"749":{"position":[[3466,20],[9401,20],[18372,20]]}},"keywords":{}}],["https://spacetelescope.github.io/understand",{"_index":4384,"title":{},"content":{"749":{"position":[[19177,46]]}},"keywords":{}}],["https://supabase.com/docs/guides/auth/row",{"_index":5232,"title":{},"content":{"899":{"position":[[209,41]]}},"keywords":{}}],["https://supabase.com/docs/guides/cli",{"_index":5235,"title":{},"content":{"899":{"position":[[351,36]]}},"keywords":{}}],["https://supabase.com/docs/guides/realtimeloc",{"_index":5234,"title":{},"content":{"899":{"position":[[276,46]]}},"keywords":{}}],["https://the",{"_index":5142,"title":{},"content":{"886":{"position":[[4481,11]]}},"keywords":{}}],["https://www.bennadel.com/blog/3448",{"_index":755,"title":{},"content":{"50":{"position":[[365,34]]}},"keywords":{}}],["https://www.mongodb.com/docs/manual/reference/connect",{"_index":6160,"title":{},"content":{"1189":{"position":[[513,56]]}},"keywords":{}}],["https://www.npmjs.com/package/sqlite3",{"_index":6337,"title":{},"content":{"1274":{"position":[[222,37]]}},"keywords":{}}],["https://www.npmjs.com/package/wa",{"_index":6341,"title":{},"content":{"1276":{"position":[[678,32]]}},"keywords":{}}],["https://xyzcompany.supabase.co",{"_index":5215,"title":{},"content":{"898":{"position":[[3066,33]]}},"keywords":{}}],["https://yourapi.com/tasks/pull?checkpoint=${json.stringifi",{"_index":1357,"title":{},"content":{"209":{"position":[[1110,60]]}},"keywords":{}}],["httpwebsocket",{"_index":3133,"title":{},"content":{"481":{"position":[[352,13]]}},"keywords":{}}],["huge",{"_index":2483,"title":{},"content":{"402":{"position":[[905,4]]},"408":{"position":[[1775,4]]},"412":{"position":[[6756,4]]},"1246":{"position":[[1024,4]]},"1294":{"position":[[1880,4]]},"1295":{"position":[[1496,4]]}},"keywords":{}}],["huggingfac",{"_index":2211,"title":{},"content":{"391":{"position":[[155,11]]},"401":{"position":[[98,11]]},"402":{"position":[[2017,11]]}},"keywords":{}}],["hulk",{"_index":797,"title":{},"content":{"52":{"position":[[258,7],[517,6]]},"539":{"position":[[258,7],[517,6]]},"599":{"position":[[285,7],[544,6]]}},"keywords":{}}],["human",{"_index":2106,"title":{"1313":{"position":[[30,6]]}},"content":{"364":{"position":[[741,5]]},"649":{"position":[[361,9]]},"662":{"position":[[2362,7]]},"689":{"position":[[517,5]]},"710":{"position":[[1851,7]]},"808":{"position":[[144,6],[168,7],[267,8],[300,5],[651,8]]},"812":{"position":[[56,6],[214,7]]},"813":{"position":[[56,6],[174,8],[237,6]]},"818":{"position":[[521,7]]},"838":{"position":[[2576,7]]},"851":{"position":[[245,8],[312,9]]},"862":{"position":[[833,7]]},"872":{"position":[[1840,7],[2555,7],[3405,9],[4070,7],[4501,7]]},"885":{"position":[[625,5],[799,8],[1207,7]]},"889":{"position":[[167,7]]},"898":{"position":[[2420,7],[3353,9],[3427,7]]},"916":{"position":[[366,7]]},"934":{"position":[[283,7]]},"1078":{"position":[[218,6]]},"1080":{"position":[[48,6]]},"1149":{"position":[[1029,7]]},"1231":{"position":[[1116,7]]},"1309":{"position":[[1446,7]]},"1311":{"position":[[301,6],[343,5]]},"1313":{"position":[[517,6],[910,5]]}},"keywords":{}}],["humaninput",{"_index":5079,"title":{},"content":{"885":{"position":[[525,10]]}},"keywords":{}}],["humaninputpushrow",{"_index":5084,"title":{},"content":{"885":{"position":[[917,17],[1184,22]]},"886":{"position":[[2356,21]]},"889":{"position":[[343,22]]}},"keywords":{}}],["humanpullbulk",{"_index":5081,"title":{},"content":{"885":{"position":[[772,13],[894,14],[1379,14]]}},"keywords":{}}],["humanscollection.findone('alice').exec",{"_index":4693,"title":{},"content":{"813":{"position":[[351,41]]}},"keywords":{}}],["humanscollection.findone('bob').exec",{"_index":4680,"title":{},"content":{"810":{"position":[[347,39]]},"811":{"position":[[327,39]]}},"keywords":{}}],["humanscollection.insert",{"_index":4678,"title":{},"content":{"810":{"position":[[195,25],[266,25]]},"811":{"position":[[175,25],[246,25]]}},"keywords":{}}],["hundr",{"_index":2533,"title":{},"content":{"408":{"position":[[887,8]]},"411":{"position":[[399,8]]},"696":{"position":[[1147,7],[1216,8]]}},"keywords":{}}],["hunt",{"_index":3838,"title":{},"content":{"670":{"position":[[286,4]]}},"keywords":{}}],["hybrid",{"_index":875,"title":{"268":{"position":[[37,6]]},"269":{"position":[[15,6]]},"284":{"position":[[23,6]]},"446":{"position":[[22,6]]},"774":{"position":[[0,6]]}},"content":{"59":{"position":[[212,6]]},"112":{"position":[[124,6]]},"174":{"position":[[2730,6]]},"239":{"position":[[161,6]]},"266":{"position":[[244,6]]},"269":{"position":[[22,6]]},"270":{"position":[[81,6]]},"271":{"position":[[84,6]]},"274":{"position":[[64,6]]},"278":{"position":[[251,6]]},"280":{"position":[[461,6]]},"284":{"position":[[36,6]]},"285":{"position":[[356,6]]},"286":{"position":[[167,6]]},"287":{"position":[[1274,6]]},"356":{"position":[[884,6]]},"362":{"position":[[440,6]]},"372":{"position":[[231,6]]},"418":{"position":[[670,6]]},"444":{"position":[[741,6]]},"445":{"position":[[378,6],[1672,6],[1735,6],[2108,6]]},"446":{"position":[[1114,6]]},"447":{"position":[[198,6],[613,6]]},"479":{"position":[[339,6]]},"497":{"position":[[720,6]]},"500":{"position":[[232,6]]},"606":{"position":[[257,6]]},"662":{"position":[[75,6]]},"783":{"position":[[370,6]]},"1270":{"position":[[260,6]]},"1316":{"position":[[2105,6]]}},"keywords":{}}],["i'v",{"_index":1073,"title":{},"content":{"118":{"position":[[406,4]]},"323":{"position":[[664,4]]}},"keywords":{}}],["i.",{"_index":2544,"title":{},"content":{"408":{"position":[[2326,6]]},"560":{"position":[[571,6]]},"898":{"position":[[4325,6]]}},"keywords":{}}],["i.assumedmasterst",{"_index":2699,"title":{},"content":{"412":{"position":[[5420,20]]}},"keywords":{}}],["i.newdocumentst",{"_index":2700,"title":{},"content":{"412":{"position":[[5445,18],[5476,18]]}},"keywords":{}}],["i.realmasterst",{"_index":2698,"title":{},"content":{"412":{"position":[[5401,18],[5553,18]]},"1309":{"position":[[1193,18]]}},"keywords":{}}],["i/o",{"_index":1605,"title":{},"content":{"265":{"position":[[541,3]]},"267":{"position":[[1344,3]]},"385":{"position":[[162,3]]},"408":{"position":[[1628,3]]}},"keywords":{}}],["i9",{"_index":6401,"title":{},"content":{"1292":{"position":[[189,2]]}},"keywords":{}}],["ibm",{"_index":430,"title":{},"content":{"26":{"position":[[325,3],[404,3]]}},"keywords":{}}],["ic",{"_index":3624,"title":{},"content":{"614":{"position":[[465,4]]},"901":{"position":[[291,3]]}},"keywords":{}}],["icon",{"_index":2820,"title":{},"content":{"419":{"position":[[1762,4]]}},"keywords":{}}],["id",{"_index":771,"title":{"924":{"position":[[0,3]]}},"content":{"51":{"position":[[367,5],[403,3],[508,6]]},"188":{"position":[[1244,5],[1280,3],[1435,6]]},"209":{"position":[[465,5],[485,3]]},"211":{"position":[[411,5],[447,3]]},"255":{"position":[[809,5],[829,3]]},"259":{"position":[[93,5],[129,3]]},"314":{"position":[[775,5],[795,3],[891,6]]},"315":{"position":[[751,5],[771,3],[833,7]]},"316":{"position":[[260,5],[280,3]]},"334":{"position":[[645,5],[681,3]]},"335":{"position":[[746,3]]},"356":{"position":[[339,2]]},"367":{"position":[[737,5],[824,3],[1046,6]]},"392":{"position":[[595,5],[631,3],[708,6],[1455,2],[1561,5],[1597,3],[1705,6],[2910,3],[3646,3],[4225,2],[4348,3],[4499,3]]},"396":{"position":[[1626,2]]},"397":{"position":[[1932,3]]},"462":{"position":[[857,2]]},"465":{"position":[[106,3]]},"480":{"position":[[575,5],[595,3]]},"482":{"position":[[875,5],[895,3],[963,7]]},"538":{"position":[[668,5],[704,3],[809,6]]},"554":{"position":[[1366,5],[1386,3],[1504,6]]},"555":{"position":[[298,3]]},"556":{"position":[[936,3]]},"562":{"position":[[347,5],[367,3],[456,6],[576,3]]},"564":{"position":[[804,5],[824,3],[892,7]]},"579":{"position":[[653,5],[689,3]]},"598":{"position":[[675,5],[711,3],[816,6]]},"599":{"position":[[109,3],[218,3],[270,3]]},"612":{"position":[[1651,2]]},"632":{"position":[[1559,5],[1579,3]]},"638":{"position":[[643,5],[663,3],[748,7]]},"639":{"position":[[421,5],[441,3]]},"662":{"position":[[2422,5],[2442,3],[2545,6]]},"680":{"position":[[835,5],[871,3],[1052,6]]},"683":{"position":[[194,3],[315,3],[820,3],[909,3]]},"698":{"position":[[2786,4],[2854,4],[2921,4]]},"717":{"position":[[1444,5],[1480,3],[1561,6]]},"734":{"position":[[709,5],[745,3]]},"749":{"position":[[14102,2]]},"792":{"position":[[355,3]]},"800":{"position":[[901,3]]},"820":{"position":[[498,3],[538,3]]},"838":{"position":[[2636,5],[2656,3],[2759,6]]},"854":{"position":[[227,4]]},"862":{"position":[[675,5],[711,3],[789,6]]},"866":{"position":[[717,2]]},"875":{"position":[[1683,2],[2112,2],[2295,2],[2440,3],[2512,3],[2523,2],[2555,3],[2665,3],[2685,3],[3261,2],[4541,3],[5235,4],[5373,3]]},"885":{"position":[[538,3],[542,4],[633,3],[637,4],[734,3],[1668,2],[2242,2],[2539,3]]},"886":{"position":[[534,3],[701,2],[746,2],[2415,2],[3611,3],[3661,2]]},"897":{"position":[[181,3]]},"904":{"position":[[898,5],[918,3],[1090,6],[1176,3]]},"917":{"position":[[169,3]]},"918":{"position":[[130,3]]},"919":{"position":[[32,3]]},"924":{"position":[[5,2]]},"945":{"position":[[293,4]]},"951":{"position":[[30,2],[324,3],[550,3]]},"984":{"position":[[419,2]]},"988":{"position":[[309,2],[4372,3],[5421,3],[5499,3]]},"990":{"position":[[565,2]]},"1004":{"position":[[356,4]]},"1007":{"position":[[139,3]]},"1014":{"position":[[99,2],[239,2],[378,2]]},"1015":{"position":[[215,2]]},"1016":{"position":[[31,3]]},"1018":{"position":[[863,2]]},"1020":{"position":[[636,3]]},"1024":{"position":[[505,3]]},"1063":{"position":[[84,3]]},"1078":{"position":[[322,5],[524,3],[688,5],[888,3],[913,3],[1016,2]]},"1080":{"position":[[111,5],[147,3],[729,5]]},"1082":{"position":[[196,5],[232,3],[463,6]]},"1083":{"position":[[396,5],[432,3],[633,6]]},"1104":{"position":[[785,2]]},"1124":{"position":[[783,3]]},"1149":{"position":[[1089,5],[1109,3],[1212,6]]},"1158":{"position":[[383,5],[419,3],[509,6],[586,3]]},"1194":{"position":[[428,2],[600,2]]},"1218":{"position":[[404,4]]},"1251":{"position":[[55,3]]},"1294":{"position":[[506,2],[583,4],[1292,2]]},"1295":{"position":[[1254,2]]},"1296":{"position":[[431,4],[729,2],[1043,4],[1296,2]]},"1315":{"position":[[245,2]]},"1316":{"position":[[2156,2]]}},"keywords":{}}],["idb",{"_index":55,"title":{},"content":{"3":{"position":[[137,3],[188,7]]},"1201":{"position":[[156,7],[247,6]]}},"keywords":{}}],["idbkeyrang",{"_index":6053,"title":{},"content":{"1139":{"position":[[633,12]]},"1140":{"position":[[829,11]]},"1145":{"position":[[618,12]]},"1294":{"position":[[1996,11]]}},"keywords":{}}],["idbkeyrange.bound",{"_index":6432,"title":{},"content":{"1294":{"position":[[1181,18]]},"1296":{"position":[[1358,18],[1467,18]]}},"keywords":{}}],["idbkeyrange.bound(10",{"_index":2993,"title":{},"content":{"459":{"position":[[590,21]]}},"keywords":{}}],["idbobjectstor",{"_index":6450,"title":{},"content":{"1295":{"position":[[831,14]]}},"keywords":{}}],["idbtransact",{"_index":6427,"title":{},"content":{"1294":{"position":[[811,14]]}},"keywords":{}}],["idea",{"_index":1434,"title":{"242":{"position":[[0,5]]},"1007":{"position":[[0,5]]}},"content":{"420":{"position":[[565,5]]},"422":{"position":[[232,5]]},"455":{"position":[[130,4]]},"524":{"position":[[781,5]]},"765":{"position":[[111,6]]}},"keywords":{}}],["ideal",{"_index":562,"title":{},"content":{"35":{"position":[[583,5]]},"83":{"position":[[206,5]]},"183":{"position":[[51,5]]},"241":{"position":[[648,5]]},"267":{"position":[[589,5]]},"365":{"position":[[162,5]]},"380":{"position":[[313,5]]},"384":{"position":[[150,5]]},"393":{"position":[[520,5]]},"407":{"position":[[999,6]]},"446":{"position":[[40,5]]},"496":{"position":[[375,5]]},"504":{"position":[[388,5]]},"540":{"position":[[54,5]]},"546":{"position":[[247,5]]},"571":{"position":[[1478,7],[1523,8]]},"581":{"position":[[376,5]]},"600":{"position":[[54,5]]},"606":{"position":[[247,5]]},"611":{"position":[[517,5]]},"612":{"position":[[207,5]]},"621":{"position":[[114,5]]},"624":{"position":[[474,5]]},"901":{"position":[[747,5]]},"1206":{"position":[[406,5]]},"1301":{"position":[[539,5]]}},"keywords":{}}],["idempot",{"_index":5653,"title":{"1030":{"position":[[26,11]]}},"content":{"1030":{"position":[[131,11]]}},"keywords":{}}],["ident",{"_index":4766,"title":{},"content":{"830":{"position":[[340,12]]},"950":{"position":[[390,9]]},"1040":{"position":[[137,9]]}},"keywords":{}}],["identifi",{"_index":2203,"title":{},"content":{"390":{"position":[[1486,10]]},"392":{"position":[[2665,11],[4571,11]]},"638":{"position":[[89,12]]},"724":{"position":[[559,11],[637,11]]},"904":{"position":[[2122,10]]},"935":{"position":[[19,10]]},"961":{"position":[[46,10]]},"988":{"position":[[335,8]]},"1020":{"position":[[104,10],[126,8],[389,11]]},"1022":{"position":[[482,11]]},"1023":{"position":[[141,11]]},"1024":{"position":[[235,11]]},"1033":{"position":[[522,11],[755,11]]},"1104":{"position":[[748,8]]},"1218":{"position":[[388,11]]}},"keywords":{}}],["identifier,"",{"_index":5584,"title":{},"content":{"1008":{"position":[[129,17]]}},"keywords":{}}],["idl",{"_index":3770,"title":{},"content":{"656":{"position":[[93,4]]},"796":{"position":[[1222,8],[1353,7]]},"815":{"position":[[228,5]]},"975":{"position":[[58,5],[121,4]]},"1026":{"position":[[19,8]]},"1164":{"position":[[1318,4]]},"1175":{"position":[[519,4]]},"1300":{"position":[[648,4]]}},"keywords":{}}],["idmaxlength",{"_index":6458,"title":{},"content":{"1296":{"position":[[802,11]]}},"keywords":{}}],["idx",{"_index":2383,"title":{},"content":{"397":{"position":[[2067,4],[2165,4]]},"398":{"position":[[1060,6],[1127,6],[1222,6],[1289,6],[2360,6],[2482,6]]},"400":{"position":[[291,6]]},"403":{"position":[[908,4],[937,4]]}},"keywords":{}}],["if"",{"_index":4916,"title":{},"content":{"863":{"position":[[523,8]]}},"keywords":{}}],["if(!doc.delet",{"_index":5628,"title":{},"content":{"1022":{"position":[[730,16]]},"1023":{"position":[[381,16]]}},"keywords":{}}],["if(!optionswithauth.head",{"_index":4837,"title":{},"content":{"848":{"position":[[369,28]]}},"keywords":{}}],["if(!work",{"_index":2272,"title":{},"content":{"392":{"position":[[4151,11]]}},"keywords":{}}],["if(change.assumedmasterst",{"_index":5963,"title":{},"content":{"1106":{"position":[[574,29]]}},"keywords":{}}],["if(change.newdocumentstate.myreadonlyfield",{"_index":5972,"title":{},"content":{"1109":{"position":[[219,42]]}},"keywords":{}}],["if(event.documents.length",{"_index":5033,"title":{},"content":{"875":{"position":[[5463,25]]}},"keywords":{}}],["if(firstopen",{"_index":5484,"title":{},"content":{"988":{"position":[[5779,13]]}},"keywords":{}}],["if(need",{"_index":4461,"title":{},"content":{"752":{"position":[[695,9]]}},"keywords":{}}],["if(olddoc.tim",{"_index":4456,"title":{},"content":{"751":{"position":[[1944,14]]}},"keywords":{}}],["ifiabl",{"_index":2925,"title":{},"content":{"439":{"position":[[591,7]]}},"keywords":{}}],["ifmatch",{"_index":3879,"title":{},"content":{"680":{"position":[[1370,8]]},"681":{"position":[[456,7],[681,7],[791,8]]},"682":{"position":[[375,8],[432,8],[489,8],[546,8]]},"683":{"position":[[296,8],[846,8]]},"684":{"position":[[181,8]]}},"keywords":{}}],["ifnotmatch",{"_index":3881,"title":{},"content":{"681":{"position":[[468,11],[904,11]]},"683":{"position":[[934,11]]}},"keywords":{}}],["ifram",{"_index":1845,"title":{"676":{"position":[[21,7]]}},"content":{"303":{"position":[[1039,7]]},"676":{"position":[[83,6],[224,7]]},"1207":{"position":[[409,6]]}},"keywords":{}}],["ignor",{"_index":2978,"title":{},"content":{"455":{"position":[[819,6]]},"614":{"position":[[799,7]]},"990":{"position":[[644,6]]}},"keywords":{}}],["ignoredupl",{"_index":4214,"title":{"966":{"position":[[0,16]]}},"content":{"749":{"position":[[6071,15]]},"966":{"position":[[305,15],[346,16],[463,15],[611,16],[729,16]]}},"keywords":{}}],["illustr",{"_index":3262,"title":{},"content":{"522":{"position":[[250,11]]},"871":{"position":[[381,11]]}},"keywords":{}}],["imag",{"_index":1822,"title":{},"content":{"303":{"position":[[176,6]]},"390":{"position":[[229,7],[932,7]]},"404":{"position":[[628,5]]},"453":{"position":[[718,7]]},"556":{"position":[[584,8]]},"698":{"position":[[1982,7]]},"865":{"position":[[203,6]]},"1132":{"position":[[1464,6]]}},"keywords":{}}],["image/jpeg",{"_index":5290,"title":{},"content":{"917":{"position":[[367,12]]}},"keywords":{}}],["imagin",{"_index":2552,"title":{},"content":{"408":{"position":[[2911,8]]},"411":{"position":[[891,7]]},"691":{"position":[[14,7]]},"698":{"position":[[1,7]]},"736":{"position":[[1,7]]}},"keywords":{}}],["immedi",{"_index":957,"title":{},"content":{"68":{"position":[[176,9]]},"125":{"position":[[247,11]]},"160":{"position":[[161,11]]},"206":{"position":[[233,12]]},"217":{"position":[[253,9]]},"221":{"position":[[37,9]]},"379":{"position":[[120,9]]},"410":{"position":[[379,11],[2018,11]]},"412":{"position":[[6294,9],[11479,12]]},"418":{"position":[[77,9],[452,9]]},"421":{"position":[[1184,9]]},"489":{"position":[[483,9]]},"497":{"position":[[459,9],[821,9]]},"569":{"position":[[739,11]]},"571":{"position":[[89,9]]},"589":{"position":[[156,11]]},"610":{"position":[[515,11],[655,9],[1078,11]]},"621":{"position":[[153,9]]},"624":{"position":[[1070,9]]},"634":{"position":[[346,11]]},"1007":{"position":[[1016,9]]}},"keywords":{}}],["immers",{"_index":3249,"title":{},"content":{"510":{"position":[[744,9]]}},"keywords":{}}],["immut",{"_index":5719,"title":{"1069":{"position":[[14,10]]}},"content":{"1051":{"position":[[71,9]]},"1069":{"position":[[164,10]]}},"keywords":{}}],["impact",{"_index":1236,"title":{},"content":{"178":{"position":[[364,6]]},"416":{"position":[[507,7]]},"427":{"position":[[1183,6]]},"434":{"position":[[301,6]]},"460":{"position":[[937,6]]},"641":{"position":[[182,6]]}},"keywords":{}}],["impact.it",{"_index":4405,"title":{},"content":{"749":{"position":[[21152,9]]}},"keywords":{}}],["imper",{"_index":3461,"title":{},"content":{"569":{"position":[[822,10]]}},"keywords":{}}],["implement",{"_index":40,"title":{"89":{"position":[[7,14]]},"314":{"position":[[13,12]]},"487":{"position":[[29,10]]},"876":{"position":[[8,14]]},"882":{"position":[[19,15]]},"1240":{"position":[[14,15]]}},"content":{"2":{"position":[[42,9]]},"24":{"position":[[660,16]]},"31":{"position":[[30,10]]},"38":{"position":[[339,12],[414,9]]},"41":{"position":[[298,12]]},"43":{"position":[[42,12]]},"46":{"position":[[409,10],[484,12]]},"47":{"position":[[243,10]]},"60":{"position":[[69,14]]},"65":{"position":[[1642,9]]},"90":{"position":[[276,12]]},"99":{"position":[[219,9]]},"102":{"position":[[44,12]]},"147":{"position":[[251,9]]},"165":{"position":[[349,9]]},"167":{"position":[[318,9]]},"173":{"position":[[357,12]]},"196":{"position":[[123,9]]},"203":{"position":[[122,9]]},"227":{"position":[[396,9]]},"250":{"position":[[176,9]]},"255":{"position":[[1639,15]]},"275":{"position":[[40,14]]},"302":{"position":[[571,9]]},"377":{"position":[[245,9]]},"391":{"position":[[265,14]]},"398":{"position":[[3433,15]]},"410":{"position":[[670,9],[1698,9]]},"412":{"position":[[1860,9],[3517,9],[3836,9],[5265,10],[9997,15],[13056,12],[14525,12]]},"445":{"position":[[2336,15]]},"455":{"position":[[412,14]]},"461":{"position":[[1048,15]]},"469":{"position":[[1344,15]]},"521":{"position":[[224,15]]},"529":{"position":[[191,12]]},"534":{"position":[[429,15],[507,12]]},"547":{"position":[[69,14]]},"559":{"position":[[859,9]]},"566":{"position":[[489,9],[1109,11]]},"594":{"position":[[427,15],[505,12]]},"607":{"position":[[69,15]]},"610":{"position":[[1406,12]]},"619":{"position":[[125,9]]},"620":{"position":[[367,15]]},"624":{"position":[[192,10]]},"626":{"position":[[565,11]]},"627":{"position":[[206,9]]},"630":{"position":[[905,12]]},"679":{"position":[[47,11]]},"686":{"position":[[571,9]]},"696":{"position":[[1263,15]]},"698":{"position":[[1385,9],[2100,9],[3207,12],[3263,12]]},"701":{"position":[[1108,9]]},"703":{"position":[[526,11],[1703,15]]},"705":{"position":[[912,9],[1111,12],[1197,12]]},"737":{"position":[[341,12]]},"743":{"position":[[24,11]]},"772":{"position":[[149,15]]},"778":{"position":[[474,9]]},"784":{"position":[[137,9],[334,10],[814,12]]},"815":{"position":[[122,11]]},"824":{"position":[[104,14]]},"836":{"position":[[1456,12]]},"875":{"position":[[1270,9],[1334,9],[2887,9],[3551,9],[3633,9],[5965,9],[6497,9],[6872,9],[7742,9]]},"876":{"position":[[154,15]]},"882":{"position":[[324,14]]},"904":{"position":[[1588,10]]},"906":{"position":[[764,14]]},"962":{"position":[[25,14],[354,15],[583,15]]},"981":{"position":[[461,11]]},"983":{"position":[[117,9]]},"996":{"position":[[181,11]]},"1005":{"position":[[148,10]]},"1067":{"position":[[251,14]]},"1079":{"position":[[466,16]]},"1100":{"position":[[217,12]]},"1124":{"position":[[519,11]]},"1149":{"position":[[383,9]]},"1151":{"position":[[128,15]]},"1170":{"position":[[296,16]]},"1178":{"position":[[127,15]]},"1191":{"position":[[35,15]]},"1218":{"position":[[69,9]]},"1225":{"position":[[324,14]]},"1246":{"position":[[988,15]]},"1263":{"position":[[218,14]]},"1272":{"position":[[492,15],[564,14]]},"1294":{"position":[[352,9]]},"1304":{"position":[[431,9],[1404,12]]},"1313":{"position":[[958,11]]},"1315":{"position":[[1065,14]]},"1316":{"position":[[297,12]]},"1324":{"position":[[237,15]]}},"keywords":{}}],["implementations.also",{"_index":4720,"title":{},"content":{"824":{"position":[[296,20]]}},"keywords":{}}],["impli",{"_index":2821,"title":{},"content":{"419":{"position":[[1777,7]]},"773":{"position":[[91,8]]}},"keywords":{}}],["implicit",{"_index":2159,"title":{},"content":{"382":{"position":[[24,8]]}},"keywords":{}}],["import",{"_index":22,"title":{"117":{"position":[[0,10]]},"152":{"position":[[0,10]]},"178":{"position":[[0,10]]},"321":{"position":[[0,10]]},"732":{"position":[[0,7]]},"780":{"position":[[16,9]]},"821":{"position":[[0,9]]}},"content":{"1":{"position":[[319,6],[359,6]]},"8":{"position":[[491,6],[725,6],[766,6],[840,6],[883,6]]},"50":{"position":[[207,10],[291,6],[478,6]]},"51":{"position":[[179,6],[550,6]]},"55":{"position":[[177,6],[234,6],[295,6],[668,6],[722,6],[800,6]]},"66":{"position":[[89,9]]},"128":{"position":[[216,6]]},"129":{"position":[[592,6],[698,6]]},"147":{"position":[[74,9]]},"188":{"position":[[638,6],[679,6],[743,6],[2392,6],[2534,6]]},"209":{"position":[[1,6],[55,6],[133,6]]},"210":{"position":[[146,6]]},"211":{"position":[[63,6],[117,6]]},"255":{"position":[[348,6],[402,6],[480,6]]},"258":{"position":[[1,6],[55,6]]},"261":{"position":[[214,6]]},"265":{"position":[[308,9]]},"266":{"position":[[540,6],[581,6]]},"314":{"position":[[300,6],[354,6]]},"315":{"position":[[162,6],[251,6],[329,6]]},"320":{"position":[[412,10]]},"333":{"position":[[257,6]]},"334":{"position":[[165,6],[206,6]]},"376":{"position":[[521,9]]},"391":{"position":[[424,6]]},"392":{"position":[[207,6],[248,6],[922,8],[3497,6]]},"393":{"position":[[916,6]]},"394":{"position":[[467,6],[524,6]]},"397":{"position":[[1619,6]]},"410":{"position":[[1137,9]]},"412":{"position":[[68,9],[4433,6],[8756,10]]},"436":{"position":[[304,9]]},"450":{"position":[[594,9]]},"452":{"position":[[703,9]]},"456":{"position":[[109,9]]},"463":{"position":[[214,10]]},"464":{"position":[[53,9]]},"480":{"position":[[158,6],[212,6]]},"481":{"position":[[576,6]]},"482":{"position":[[159,6],[213,6],[291,6]]},"494":{"position":[[137,6]]},"522":{"position":[[168,8],[278,6],[319,6]]},"538":{"position":[[259,6],[313,6]]},"541":{"position":[[172,6]]},"542":{"position":[[288,6],[379,6],[433,6]]},"554":{"position":[[475,6],[516,6],[739,6]]},"556":{"position":[[285,6],[744,6]]},"559":{"position":[[185,6]]},"562":{"position":[[1,6],[42,6],[1036,6]]},"563":{"position":[[198,6],[252,6],[330,6]]},"564":{"position":[[186,6],[227,6],[316,6]]},"579":{"position":[[167,6],[208,6]]},"580":{"position":[[299,6],[337,6]]},"598":{"position":[[267,6],[308,6]]},"601":{"position":[[377,6],[415,6]]},"612":{"position":[[1748,6]]},"613":{"position":[[522,9]]},"632":{"position":[[1039,6],[1093,6],[2108,6]]},"638":{"position":[[221,6]]},"646":{"position":[[1,6],[37,6]]},"650":{"position":[[33,6]]},"652":{"position":[[1,6],[37,6]]},"653":{"position":[[117,6],[158,6],[675,9]]},"659":{"position":[[288,6],[430,6]]},"661":{"position":[[834,6],[879,6],[1623,6]]},"662":{"position":[[1601,6],[1625,6],[1679,6],[1760,6],[1861,6],[1919,6]]},"673":{"position":[[1,6]]},"675":{"position":[[219,6]]},"676":{"position":[[293,6]]},"680":{"position":[[295,6],[342,6],[444,6],[530,6],[571,6]]},"698":{"position":[[829,9]]},"699":{"position":[[616,10]]},"700":{"position":[[734,9]]},"707":{"position":[[348,9]]},"710":{"position":[[303,9],[1540,6],[1581,6]]},"717":{"position":[[549,6],[638,6],[1052,6]]},"718":{"position":[[94,6],[209,6]]},"724":{"position":[[80,8],[172,6],[244,6],[435,6]]},"728":{"position":[[231,6],[258,6]]},"732":{"position":[[4,6],[53,6],[109,6]]},"734":{"position":[[125,6],[202,6],[409,6]]},"738":{"position":[[77,6],[113,6]]},"739":{"position":[[189,6]]},"740":{"position":[[416,6]]},"745":{"position":[[196,6],[264,6]]},"749":{"position":[[13312,6],[13416,8]]},"754":{"position":[[194,6]]},"759":{"position":[[87,6],[152,6],[232,6]]},"760":{"position":[[263,6],[328,6],[419,6]]},"761":{"position":[[345,9],[452,6],[578,6],[700,6]]},"772":{"position":[[542,6],[634,6],[675,6],[1421,6],[1462,6],[1557,6],[2129,6],[2255,6],[2319,6]]},"773":{"position":[[436,6],[477,6]]},"774":{"position":[[439,6],[480,6],[558,6]]},"783":{"position":[[146,9],[476,9]]},"797":{"position":[[160,10]]},"798":{"position":[[53,9],[216,9]]},"820":{"position":[[1,6],[71,6]]},"821":{"position":[[536,9]]},"825":{"position":[[85,7],[93,6],[168,6],[542,6],[593,6],[641,6],[743,8]]},"829":{"position":[[459,6],[513,6],[1241,6],[1293,6],[1350,6],[1893,6],[2317,6],[3229,6]]},"836":{"position":[[570,6],[624,6]]},"837":{"position":[[1499,6],[1540,6],[1576,6],[1622,6],[1669,6],[1712,6],[1784,6]]},"838":{"position":[[1918,6],[1942,6],[1983,6],[2059,6]]},"846":{"position":[[48,6]]},"848":{"position":[[1166,6]]},"852":{"position":[[63,6],[114,6]]},"854":{"position":[[92,6],[134,6]]},"857":{"position":[[205,6]]},"862":{"position":[[184,6],[218,6],[289,6],[370,6],[448,6]]},"866":{"position":[[104,6],[344,6]]},"872":{"position":[[845,6],[1540,6],[1594,6],[2280,6],[3100,6],[3161,6],[3775,6],[3816,6],[3880,6]]},"875":{"position":[[203,6],[327,6],[798,6],[837,6],[2021,6],[4267,6],[4316,6],[8039,6],[9458,6]]},"878":{"position":[[34,8],[180,6]]},"886":{"position":[[916,6]]},"888":{"position":[[343,6]]},"889":{"position":[[383,6]]},"892":{"position":[[1,6],[42,6]]},"893":{"position":[[89,6]]},"894":{"position":[[105,9]]},"898":{"position":[[2165,6],[2219,6],[2974,6],[3231,6]]},"904":{"position":[[565,6],[619,6],[1267,6],[1305,6]]},"906":{"position":[[886,6]]},"911":{"position":[[505,6],[570,6]]},"915":{"position":[[69,6],[105,6]]},"917":{"position":[[81,6]]},"932":{"position":[[678,6],[771,6]]},"952":{"position":[[172,6],[208,6]]},"953":{"position":[[4,6],[70,6],[180,9]]},"958":{"position":[[748,6]]},"960":{"position":[[133,6],[187,6]]},"962":{"position":[[658,6],[879,6]]},"968":{"position":[[373,6]]},"971":{"position":[[284,6],[320,6]]},"972":{"position":[[4,6],[69,6]]},"975":{"position":[[185,9],[252,9]]},"977":{"position":[[539,6]]},"978":{"position":[[87,6]]},"988":{"position":[[115,6],[181,6]]},"989":{"position":[[343,6]]},"1012":{"position":[[77,6],[113,6]]},"1041":{"position":[[150,6],[186,6]]},"1059":{"position":[[125,6]]},"1064":{"position":[[107,6],[143,6]]},"1090":{"position":[[445,6],[511,6],[577,6],[668,6]]},"1093":{"position":[[370,9]]},"1097":{"position":[[121,6],[331,6],[604,6]]},"1098":{"position":[[171,6],[232,6]]},"1099":{"position":[[153,6],[214,6]]},"1102":{"position":[[849,6]]},"1114":{"position":[[188,6],[432,6],[486,6],[604,6]]},"1118":{"position":[[340,6],[415,6]]},"1119":{"position":[[359,6],[395,6]]},"1121":{"position":[[329,6]]},"1125":{"position":[[44,6],[153,6],[194,6]]},"1130":{"position":[[1,6],[42,6]]},"1134":{"position":[[1,6],[42,6]]},"1138":{"position":[[34,6],[143,6],[184,6]]},"1139":{"position":[[241,6],[282,6]]},"1140":{"position":[[457,6],[498,6]]},"1144":{"position":[[3,6],[29,6],[83,6]]},"1145":{"position":[[233,6],[287,6]]},"1148":{"position":[[490,6],[519,6],[573,6],[637,6]]},"1149":{"position":[[612,6],[663,6],[732,6],[796,6]]},"1151":{"position":[[870,6]]},"1154":{"position":[[198,6],[312,6]]},"1156":{"position":[[263,6],[282,6]]},"1158":{"position":[[3,6],[23,6],[77,6]]},"1159":{"position":[[209,6],[263,6]]},"1163":{"position":[[2,6],[82,6]]},"1164":{"position":[[75,6],[1344,9]]},"1168":{"position":[[17,6],[58,6]]},"1172":{"position":[[1,6],[42,6]]},"1175":{"position":[[450,9]]},"1178":{"position":[[867,6]]},"1182":{"position":[[2,6],[82,6]]},"1184":{"position":[[368,6],[448,6],[535,6]]},"1189":{"position":[[122,6],[268,6],[309,6]]},"1201":{"position":[[1,6],[42,6]]},"1204":{"position":[[228,6]]},"1207":{"position":[[221,9]]},"1210":{"position":[[283,6],[324,6]]},"1211":{"position":[[532,6],[573,6]]},"1212":{"position":[[295,6],[365,6]]},"1213":{"position":[[592,6]]},"1218":{"position":[[285,6],[616,6],[694,6]]},"1219":{"position":[[263,6],[329,6],[777,6]]},"1222":{"position":[[1,6],[79,6],[800,10]]},"1225":{"position":[[128,6],[205,6]]},"1226":{"position":[[1,6],[42,6],[122,6]]},"1227":{"position":[[551,6],[592,6]]},"1229":{"position":[[200,6]]},"1231":{"position":[[441,6],[518,6],[598,6],[652,6]]},"1237":{"position":[[497,6],[568,6],[645,6],[734,6]]},"1238":{"position":[[443,6],[521,6],[595,6],[675,6]]},"1239":{"position":[[476,6],[590,6],[677,6]]},"1263":{"position":[[14,6],[91,6]]},"1264":{"position":[[1,6],[42,6]]},"1265":{"position":[[545,6],[586,6]]},"1268":{"position":[[406,6],[569,6],[646,6]]},"1271":{"position":[[745,6],[1085,6],[1117,6],[1361,6]]},"1274":{"position":[[1,6],[42,6],[263,6]]},"1275":{"position":[[119,6],[160,6],[261,6]]},"1276":{"position":[[391,6],[432,6],[721,6],[788,6]]},"1277":{"position":[[142,6],[183,6],[285,6],[717,6],[814,6]]},"1278":{"position":[[245,6],[286,6],[392,6],[697,6],[738,6],[839,6]]},"1279":{"position":[[310,6],[351,6],[457,6],[501,6],[582,6]]},"1280":{"position":[[241,6],[282,6],[370,6]]},"1281":{"position":[[107,6]]},"1286":{"position":[[191,6],[262,6]]},"1287":{"position":[[228,6],[308,6]]},"1288":{"position":[[174,6],[268,6]]},"1290":{"position":[[1,6]]},"1291":{"position":[[1,6]]},"1294":{"position":[[1942,10]]},"1309":{"position":[[436,6]]},"1319":{"position":[[525,9]]}},"keywords":{}}],["import('rxdb/plugins/dev",{"_index":3845,"title":{},"content":{"672":{"position":[[90,24]]},"673":{"position":[[96,24]]},"674":{"position":[[379,24]]}},"keywords":{}}],["import.meta.url",{"_index":2266,"title":{},"content":{"392":{"position":[[3963,19]]},"1268":{"position":[[518,18]]}},"keywords":{}}],["importjson",{"_index":5366,"title":{"953":{"position":[[0,13]]},"972":{"position":[[0,13]]}},"content":{"952":{"position":[[107,12]]},"971":{"position":[[219,12]]}},"keywords":{}}],["impos",{"_index":945,"title":{},"content":{"66":{"position":[[421,6]]},"276":{"position":[[112,7]]},"361":{"position":[[189,8]]},"427":{"position":[[1487,6]]},"545":{"position":[[176,6]]},"605":{"position":[[176,6]]}},"keywords":{}}],["imposs",{"_index":263,"title":{},"content":{"15":{"position":[[478,10]]},"412":{"position":[[6908,11]]},"1006":{"position":[[150,10]]},"1124":{"position":[[860,10]]},"1317":{"position":[[347,11]]}},"keywords":{}}],["impract",{"_index":1411,"title":{},"content":{"228":{"position":[[86,11]]},"408":{"position":[[720,11]]},"412":{"position":[[7318,12]]}},"keywords":{}}],["impress",{"_index":930,"title":{},"content":{"65":{"position":[[1518,11]]},"433":{"position":[[234,10]]}},"keywords":{}}],["improv",{"_index":512,"title":{"224":{"position":[[0,8]]},"404":{"position":[[16,12]]},"469":{"position":[[9,13]]},"470":{"position":[[7,13]]}},"content":{"33":{"position":[[113,8]]},"65":{"position":[[1877,8]]},"78":{"position":[[77,9]]},"87":{"position":[[164,7]]},"91":{"position":[[175,8]]},"92":{"position":[[151,8]]},"93":{"position":[[220,8]]},"108":{"position":[[182,8]]},"111":{"position":[[132,8]]},"138":{"position":[[4,7]]},"141":{"position":[[37,7]]},"173":{"position":[[2631,8]]},"174":{"position":[[2486,8]]},"194":{"position":[[161,9]]},"197":{"position":[[194,8]]},"224":{"position":[[26,8]]},"234":{"position":[[231,8]]},"236":{"position":[[103,9],[251,8]]},"241":{"position":[[523,8]]},"266":{"position":[[1018,7]]},"281":{"position":[[290,8]]},"294":{"position":[[202,9]]},"311":{"position":[[160,9]]},"342":{"position":[[116,7]]},"350":{"position":[[364,9]]},"354":{"position":[[1187,8]]},"385":{"position":[[330,9]]},"386":{"position":[[345,13]]},"392":{"position":[[3161,7]]},"396":{"position":[[53,7],[740,9]]},"399":{"position":[[46,8]]},"402":{"position":[[40,7],[163,8],[767,7],[922,12],[1023,8],[1656,7],[1746,7],[2553,7],[2711,7]]},"407":{"position":[[1094,9]]},"408":{"position":[[4249,12]]},"410":{"position":[[1256,9]]},"411":{"position":[[5737,8]]},"420":{"position":[[930,9]]},"452":{"position":[[493,13],[549,8],[684,13]]},"467":{"position":[[520,8]]},"469":{"position":[[35,12],[433,8],[755,8],[1001,7],[1089,7],[1201,7]]},"470":{"position":[[442,8],[597,7]]},"483":{"position":[[823,7]]},"485":{"position":[[49,9]]},"528":{"position":[[63,7]]},"588":{"position":[[113,9]]},"617":{"position":[[846,7]]},"641":{"position":[[297,8]]},"656":{"position":[[434,7]]},"780":{"position":[[133,8]]},"798":{"position":[[790,7]]},"801":{"position":[[60,7]]},"876":{"position":[[371,7]]},"894":{"position":[[118,7]]},"902":{"position":[[135,9]]},"947":{"position":[[52,8]]},"1066":{"position":[[240,7],[596,7]]},"1071":{"position":[[483,7]]},"1072":{"position":[[388,7]]},"1083":{"position":[[319,12]]},"1085":{"position":[[2359,8]]},"1120":{"position":[[506,7]]},"1124":{"position":[[1715,8]]},"1125":{"position":[[691,7]]},"1134":{"position":[[673,7]]},"1143":{"position":[[583,8]]},"1151":{"position":[[378,9]]},"1161":{"position":[[1,8]]},"1178":{"position":[[377,9]]},"1180":{"position":[[1,8]]},"1206":{"position":[[571,8]]},"1230":{"position":[[194,7]]},"1238":{"position":[[413,7]]},"1246":{"position":[[273,7],[593,7],[1041,11],[1505,7]]},"1294":{"position":[[74,7],[187,8],[1885,12]]},"1295":{"position":[[661,11]]},"1296":{"position":[[9,7],[522,7],[1635,7]]},"1297":{"position":[[171,7],[438,7],[489,11]]},"1298":{"position":[[68,11],[346,11]]}},"keywords":{}}],["inaccess",{"_index":1689,"title":{},"content":{"291":{"position":[[265,12]]}},"keywords":{}}],["inact",{"_index":3652,"title":{},"content":{"618":{"position":[[320,11]]}},"keywords":{}}],["inadvert",{"_index":4671,"title":{},"content":{"802":{"position":[[487,13]]}},"keywords":{}}],["inc",{"_index":3867,"title":{},"content":{"678":{"position":[[290,5]]},"680":{"position":[[1381,5]]},"681":{"position":[[328,4],[802,5]]},"683":{"position":[[1007,5]]},"1041":{"position":[[299,5]]},"1044":{"position":[[314,5]]},"1059":{"position":[[302,5]]}},"keywords":{}}],["includ",{"_index":113,"title":{},"content":{"8":{"position":[[436,8]]},"19":{"position":[[41,8]]},"34":{"position":[[579,9]]},"65":{"position":[[1867,9]]},"94":{"position":[[20,9]]},"105":{"position":[[78,9]]},"112":{"position":[[87,9]]},"129":{"position":[[400,9]]},"131":{"position":[[98,8]]},"162":{"position":[[143,8]]},"173":{"position":[[2221,9]]},"174":{"position":[[2693,9]]},"189":{"position":[[103,8]]},"201":{"position":[[146,10]]},"222":{"position":[[21,9]]},"267":{"position":[[100,8]]},"270":{"position":[[71,9]]},"282":{"position":[[127,9]]},"285":{"position":[[60,9]]},"298":{"position":[[785,7]]},"299":{"position":[[1243,8]]},"310":{"position":[[80,8]]},"333":{"position":[[204,9]]},"357":{"position":[[124,9]]},"358":{"position":[[206,8]]},"368":{"position":[[140,9]]},"376":{"position":[[220,8]]},"390":{"position":[[922,9]]},"392":{"position":[[1432,8]]},"407":{"position":[[1006,7]]},"412":{"position":[[9199,10]]},"425":{"position":[[157,9]]},"434":{"position":[[262,8]]},"444":{"position":[[217,7]]},"513":{"position":[[263,7]]},"524":{"position":[[201,8]]},"530":{"position":[[346,9]]},"567":{"position":[[956,9]]},"612":{"position":[[1572,8]]},"624":{"position":[[963,9]]},"640":{"position":[[114,8]]},"690":{"position":[[103,8]]},"691":{"position":[[603,8]]},"723":{"position":[[2147,9]]},"749":{"position":[[2515,8]]},"824":{"position":[[577,8]]},"829":{"position":[[229,9]]},"832":{"position":[[6,8],[103,9]]},"835":{"position":[[565,8]]},"836":{"position":[[262,7]]},"838":{"position":[[413,8]]},"886":{"position":[[4277,8],[4840,8]]},"890":{"position":[[617,7],[856,10]]},"898":{"position":[[1997,7]]},"911":{"position":[[484,8]]},"1292":{"position":[[754,9]]}},"keywords":{}}],["includewshead",{"_index":5140,"title":{},"content":{"886":{"position":[[4249,17]]}},"keywords":{}}],["inclus",{"_index":6032,"title":{},"content":{"1132":{"position":[[1434,9]]}},"keywords":{}}],["incognito",{"_index":1873,"title":{},"content":{"305":{"position":[[328,9]]}},"keywords":{}}],["incom",{"_index":2152,"title":{},"content":{"379":{"position":[[250,8]]},"410":{"position":[[1992,8]]},"411":{"position":[[3448,8]]},"490":{"position":[[104,8]]},"496":{"position":[[757,8]]},"898":{"position":[[3500,8]]},"1318":{"position":[[911,8]]}},"keywords":{}}],["inconsist",{"_index":1428,"title":{},"content":{"237":{"position":[[269,16]]},"590":{"position":[[907,16]]}},"keywords":{}}],["inconveni",{"_index":6088,"title":{},"content":{"1151":{"position":[[301,14]]},"1178":{"position":[[300,14]]}},"keywords":{}}],["incorpor",{"_index":1053,"title":{},"content":{"113":{"position":[[6,12]]},"174":{"position":[[1566,12]]},"283":{"position":[[291,13]]},"365":{"position":[[6,13]]},"491":{"position":[[605,11]]},"981":{"position":[[1209,13]]}},"keywords":{}}],["incorrectli",{"_index":5656,"title":{},"content":{"1033":{"position":[[234,12]]}},"keywords":{}}],["increas",{"_index":673,"title":{},"content":{"43":{"position":[[423,9]]},"69":{"position":[[76,8]]},"281":{"position":[[433,9]]},"394":{"position":[[1467,10]]},"402":{"position":[[1518,10]]},"403":{"position":[[419,8],[522,8]]},"408":{"position":[[826,9]]},"412":{"position":[[8943,9],[9157,8],[9273,9]]},"463":{"position":[[1089,9]]},"617":{"position":[[1619,9]]},"623":{"position":[[83,8]]},"696":{"position":[[1698,8]]},"698":{"position":[[2836,9],[2971,9]]},"772":{"position":[[470,8]]},"773":{"position":[[767,8],[823,8]]},"780":{"position":[[209,8]]},"782":{"position":[[107,8]]},"800":{"position":[[525,8]]},"802":{"position":[[501,8]]},"902":{"position":[[257,9]]},"1041":{"position":[[317,9]]},"1044":{"position":[[332,9]]},"1059":{"position":[[320,9]]},"1061":{"position":[[221,9]]},"1085":{"position":[[3300,8]]},"1089":{"position":[[16,9]]},"1095":{"position":[[206,8]]},"1115":{"position":[[184,8],[252,9],[357,8]]},"1162":{"position":[[609,8]]},"1181":{"position":[[697,8]]},"1198":{"position":[[644,8]]},"1237":{"position":[[201,8]]},"1239":{"position":[[453,8]]},"1270":{"position":[[220,9]]},"1282":{"position":[[242,9]]},"1292":{"position":[[789,9]]},"1295":{"position":[[369,9],[714,10],[1025,9]]},"1305":{"position":[[637,9]]}},"keywords":{}}],["increasingli",{"_index":1419,"title":{},"content":{"232":{"position":[[23,12]]},"320":{"position":[[399,12]]},"369":{"position":[[671,12]]},"375":{"position":[[865,12]]},"407":{"position":[[353,12]]},"410":{"position":[[1124,12]]},"574":{"position":[[528,12]]}},"keywords":{}}],["increment",{"_index":2671,"title":{"1044":{"position":[[27,11]]}},"content":{"412":{"position":[[2604,13]]},"491":{"position":[[242,11]]},"636":{"position":[[91,11]]},"678":{"position":[[257,9]]},"680":{"position":[[1309,10]]},"683":{"position":[[980,9]]},"696":{"position":[[1495,10]]},"723":{"position":[[1544,13],[1667,11],[1967,11]]},"870":{"position":[[94,11]]},"896":{"position":[[202,11]]},"948":{"position":[[285,11]]},"1044":{"position":[[245,11]]},"1300":{"position":[[374,11]]},"1307":{"position":[[684,11]]}},"keywords":{}}],["incrementalmodifi",{"_index":5749,"title":{"1061":{"position":[[11,20]]}},"content":{"1307":{"position":[[721,20]]}},"keywords":{}}],["incrementalpatch",{"_index":5746,"title":{"1060":{"position":[[10,19]]}},"content":{"1307":{"position":[[742,18]]}},"keywords":{}}],["incrementalremov",{"_index":5752,"title":{"1062":{"position":[[11,20]]}},"content":{},"keywords":{}}],["incrementalupsert",{"_index":5346,"title":{"948":{"position":[[0,20]]}},"content":{"1307":{"position":[[764,20]]}},"keywords":{}}],["incur",{"_index":2899,"title":{},"content":{"429":{"position":[[333,5]]},"621":{"position":[[370,6]]}},"keywords":{}}],["indefinit",{"_index":1865,"title":{},"content":{"305":{"position":[[27,12]]},"451":{"position":[[795,12]]}},"keywords":{}}],["independ",{"_index":3041,"title":{},"content":{"464":{"position":[[111,11]]},"611":{"position":[[457,13]]},"831":{"position":[[387,11]]},"839":{"position":[[102,11]]},"1140":{"position":[[198,13]]}},"keywords":{}}],["index",{"_index":60,"title":{"138":{"position":[[0,8]]},"194":{"position":[[0,8]]},"342":{"position":[[0,8]]},"395":{"position":[[0,8]]},"396":{"position":[[7,8]]},"397":{"position":[[8,7]]},"398":{"position":[[54,8]]},"459":{"position":[[0,8]]},"507":{"position":[[0,8]]},"527":{"position":[[0,8]]},"587":{"position":[[0,8]]},"796":{"position":[[68,5]]},"797":{"position":[[15,6]]},"798":{"position":[[26,5]]},"1022":{"position":[[12,5]]},"1066":{"position":[[19,6]]},"1079":{"position":[[0,8]]},"1080":{"position":[[0,5]]},"1107":{"position":[[12,8]]},"1296":{"position":[[7,8]]}},"content":{"4":{"position":[[73,8]]},"33":{"position":[[434,5]]},"40":{"position":[[538,9]]},"45":{"position":[[236,8]]},"47":{"position":[[544,8]]},"138":{"position":[[57,7],[103,8],[234,8]]},"166":{"position":[[1,8],[83,8],[106,8],[205,7]]},"170":{"position":[[394,9]]},"188":{"position":[[1406,8]]},"194":{"position":[[1,8],[72,7],[133,7]]},"205":{"position":[[143,7]]},"212":{"position":[[270,9]]},"252":{"position":[[94,10],[170,7]]},"260":{"position":[[185,8]]},"262":{"position":[[425,8]]},"283":{"position":[[54,8]]},"342":{"position":[[8,7],[91,8]]},"346":{"position":[[811,7]]},"356":{"position":[[242,5]]},"358":{"position":[[337,8],[954,8]]},"360":{"position":[[748,9]]},"362":{"position":[[695,9]]},"369":{"position":[[224,8]]},"376":{"position":[[453,9],[481,7]]},"385":{"position":[[181,7]]},"395":{"position":[[201,5],[288,5],[499,8]]},"396":{"position":[[27,8],[832,8],[931,5],[1058,5],[1158,5],[1200,5],[1448,5],[1684,5],[1743,8]]},"397":{"position":[[26,5],[134,5],[451,5],[880,5],[1340,5],[1510,5],[1604,5],[1718,5],[2025,5]]},"398":{"position":[[38,7],[143,8],[404,7],[475,5],[521,5],[1766,5],[1886,5],[3266,9]]},"400":{"position":[[77,5],[103,5],[138,5],[427,7],[469,5]]},"402":{"position":[[976,7],[1015,7],[1464,5]]},"403":{"position":[[21,5],[704,5]]},"408":{"position":[[5104,8]]},"412":{"position":[[9506,10],[10461,8]]},"427":{"position":[[874,9],[903,8]]},"432":{"position":[[427,8]]},"452":{"position":[[216,7],[326,7]]},"453":{"position":[[827,8]]},"457":{"position":[[398,8]]},"459":{"position":[[156,7],[276,8],[325,7],[507,5],[740,5],[1037,7],[1077,5]]},"462":{"position":[[941,7]]},"468":{"position":[[256,5]]},"469":{"position":[[248,5]]},"507":{"position":[[94,8]]},"523":{"position":[[675,6]]},"527":{"position":[[11,8],[111,7]]},"559":{"position":[[1452,9]]},"560":{"position":[[272,9],[476,5]]},"566":{"position":[[144,7],[279,5],[390,8]]},"587":{"position":[[13,7]]},"590":{"position":[[601,8],[651,7]]},"636":{"position":[[70,8]]},"659":{"position":[[867,7]]},"723":{"position":[[22,8],[361,8],[662,8],[921,8],[995,8],[1123,7],[1159,5],[1330,8],[1360,5],[1434,5],[1535,5],[1950,5]]},"724":{"position":[[607,8],[1091,5],[1228,5],[1304,5]]},"749":{"position":[[2398,5],[2712,5],[17910,6],[17938,5],[18060,5],[18514,7],[18608,7],[18837,5],[19381,7],[19464,7],[20169,6],[20334,6],[20489,5],[20593,6],[20761,6],[21354,7],[21487,7],[23022,5]]},"772":{"position":[[335,7]]},"796":{"position":[[78,5],[203,5],[381,5],[677,5],[828,6],[1097,5]]},"797":{"position":[[85,5],[113,8],[214,5],[318,5],[324,6]]},"798":{"position":[[39,5],[96,5],[152,5],[428,5],[781,5],[911,6],[1037,8]]},"801":{"position":[[697,9]]},"821":{"position":[[63,7],[173,7],[501,7],[601,5],[1017,5]]},"841":{"position":[[395,7]]},"854":{"position":[[1285,7]]},"1022":{"position":[[121,9],[251,8]]},"1023":{"position":[[40,5]]},"1065":{"position":[[1909,8]]},"1066":{"position":[[118,7],[230,6],[289,5],[587,5],[717,6]]},"1067":{"position":[[919,5],[1216,5],[1446,5],[1503,5],[1818,7],[2239,7]]},"1068":{"position":[[20,7]]},"1071":{"position":[[395,7]]},"1072":{"position":[[2837,7]]},"1074":{"position":[[181,8]]},"1079":{"position":[[25,7],[91,5],[203,6],[437,7],[535,7],[643,6]]},"1080":{"position":[[67,9],[323,6],[513,6],[788,6],[816,8],[875,5],[969,5]]},"1085":{"position":[[681,6],[998,5]]},"1107":{"position":[[20,7],[438,7],[920,7],[984,7]]},"1123":{"position":[[553,8]]},"1132":{"position":[[106,8],[158,7],[312,7]]},"1143":{"position":[[374,7],[470,7]]},"1164":{"position":[[362,7],[396,7]]},"1271":{"position":[[370,8]]},"1294":{"position":[[474,5],[566,7],[938,5],[963,8],[1084,5]]},"1295":{"position":[[1132,6]]},"1296":{"position":[[1,7],[172,5],[342,6],[393,6],[448,5],[506,5],[558,5],[652,5],[855,5],[979,5],[1026,7],[1063,5],[1110,5],[1173,6],[1338,5],[1447,5],[1617,5],[1738,8],[1842,8],[1869,7]]}},"keywords":{}}],["index.getall(keyrang",{"_index":2999,"title":{},"content":{"459":{"position":[[797,23]]}},"keywords":{}}],["index.getall(rang",{"_index":6437,"title":{},"content":{"1294":{"position":[[1474,19]]}},"keywords":{}}],["index.j",{"_index":4582,"title":{},"content":{"773":{"position":[[895,8]]}},"keywords":{}}],["indexdb",{"_index":2906,"title":{},"content":{"432":{"position":[[398,7]]}},"keywords":{}}],["indexdist",{"_index":2415,"title":{},"content":{"398":{"position":[[1810,13],[2026,13],[2290,14],[3395,14]]},"402":{"position":[[1168,13]]}},"keywords":{}}],["indexeddb",{"_index":52,"title":{"3":{"position":[[0,10]]},"4":{"position":[[0,10]]},"44":{"position":[[57,9]]},"45":{"position":[[8,11]]},"46":{"position":[[8,9]]},"47":{"position":[[16,9]]},"56":{"position":[[8,9]]},"58":{"position":[[15,10]]},"59":{"position":[[16,10]]},"64":{"position":[[0,10]]},"297":{"position":[[0,9]]},"298":{"position":[[4,9]]},"299":{"position":[[17,9]]},"300":{"position":[[22,9]]},"301":{"position":[[19,9]]},"304":{"position":[[0,9]]},"305":{"position":[[41,11]]},"432":{"position":[[16,10]]},"448":{"position":[[17,9]]},"452":{"position":[[8,10]]},"521":{"position":[[0,9]]},"532":{"position":[[0,9]]},"533":{"position":[[8,11]]},"534":{"position":[[8,9]]},"535":{"position":[[21,10]]},"543":{"position":[[6,9]]},"545":{"position":[[15,10]]},"546":{"position":[[16,10]]},"560":{"position":[[25,10]]},"566":{"position":[[26,9]]},"592":{"position":[[0,9]]},"593":{"position":[[8,11]]},"594":{"position":[[8,9]]},"595":{"position":[[21,10]]},"603":{"position":[[4,9]]},"605":{"position":[[15,10]]},"606":{"position":[[16,10]]},"709":{"position":[[15,9]]},"1136":{"position":[[0,9]]},"1137":{"position":[[0,9]]},"1138":{"position":[[10,9]]},"1139":{"position":[[30,10]]},"1141":{"position":[[19,9]]},"1143":{"position":[[12,9]]},"1145":{"position":[[30,9]]},"1243":{"position":[[3,10]]},"1293":{"position":[[4,9]]},"1295":{"position":[[0,9]]},"1299":{"position":[[20,10]]}},"content":{"3":{"position":[[5,9],[49,9]]},"4":{"position":[[27,9],[303,9],[360,13]]},"16":{"position":[[311,10]]},"24":{"position":[[203,10]]},"28":{"position":[[209,11]]},"31":{"position":[[44,9],[126,10],[147,9],[292,9]]},"32":{"position":[[207,9]]},"33":{"position":[[40,10],[91,10],[212,9],[592,9]]},"35":{"position":[[163,10]]},"45":{"position":[[1,9],[200,9]]},"46":{"position":[[100,9]]},"47":{"position":[[47,9],[97,9],[254,9],[719,9],[963,10],[1066,9],[1186,9]]},"51":{"position":[[159,9],[540,9]]},"58":{"position":[[7,9],[134,9],[219,10],[299,10],[353,10]]},"64":{"position":[[1,10]]},"65":{"position":[[1963,9]]},"66":{"position":[[49,10]]},"100":{"position":[[264,10]]},"120":{"position":[[107,10]]},"131":{"position":[[234,9],[264,9],[652,11]]},"155":{"position":[[199,10]]},"161":{"position":[[98,10],[171,10]]},"162":{"position":[[273,9]]},"181":{"position":[[48,10]]},"207":{"position":[[127,9]]},"227":{"position":[[238,10]]},"245":{"position":[[61,9]]},"254":{"position":[[321,9]]},"266":{"position":[[103,10]]},"287":{"position":[[501,9]]},"299":{"position":[[1,9],[1597,9],[1692,9]]},"302":{"position":[[213,9]]},"304":{"position":[[73,9],[330,9]]},"305":{"position":[[1,9]]},"306":{"position":[[28,9],[321,9]]},"322":{"position":[[55,9]]},"331":{"position":[[63,9]]},"336":{"position":[[192,9],[519,9]]},"365":{"position":[[921,9]]},"368":{"position":[[150,10]]},"383":{"position":[[370,9]]},"384":{"position":[[103,12]]},"396":{"position":[[1567,10]]},"400":{"position":[[381,9]]},"402":{"position":[[2744,9]]},"408":{"position":[[423,10],[658,9],[857,9],[2027,9],[3954,9]]},"411":{"position":[[4190,9]]},"412":{"position":[[7723,9],[7897,9],[9830,9]]},"429":{"position":[[149,9],[649,10]]},"432":{"position":[[126,9],[181,9],[346,9],[531,9],[679,10],[731,9],[868,9],[983,9],[1092,9],[1302,9],[1329,9]]},"435":{"position":[[225,10],[293,10]]},"441":{"position":[[407,10]]},"442":{"position":[[71,9]]},"452":{"position":[[1,9],[78,9],[194,9],[433,9],[623,9]]},"457":{"position":[[207,9]]},"458":{"position":[[799,9],[905,9]]},"459":{"position":[[238,9],[440,9],[994,9]]},"461":{"position":[[910,9],[1015,9],[1453,9],[1532,10]]},"463":{"position":[[319,9],[758,11],[823,9],[1233,9]]},"464":{"position":[[314,9],[409,11],[681,9]]},"465":{"position":[[176,9],[270,11]]},"466":{"position":[[139,9],[233,11]]},"467":{"position":[[111,9],[208,11]]},"469":{"position":[[103,9],[739,10]]},"479":{"position":[[315,11]]},"489":{"position":[[265,11]]},"495":{"position":[[801,9]]},"504":{"position":[[214,9]]},"513":{"position":[[146,9]]},"520":{"position":[[194,9]]},"521":{"position":[[7,9],[279,9],[374,9],[675,10]]},"524":{"position":[[934,9]]},"533":{"position":[[1,9]]},"534":{"position":[[35,9],[160,10]]},"535":{"position":[[7,9],[139,9],[259,9],[604,9],[714,9],[921,9],[1123,10],[1192,9]]},"536":{"position":[[61,9]]},"538":{"position":[[95,9]]},"545":{"position":[[7,9],[78,9]]},"548":{"position":[[183,10],[314,9]]},"560":{"position":[[429,10],[638,9]]},"561":{"position":[[185,9]]},"566":{"position":[[29,9],[775,9]]},"576":{"position":[[47,9]]},"581":{"position":[[590,9]]},"593":{"position":[[1,9]]},"594":{"position":[[33,9],[158,10]]},"595":{"position":[[7,9],[139,9],[272,9],[631,9],[735,9],[996,9],[1200,10],[1269,9]]},"596":{"position":[[59,9]]},"598":{"position":[[95,9]]},"605":{"position":[[7,9],[78,9]]},"608":{"position":[[183,10],[312,9]]},"631":{"position":[[154,10]]},"640":{"position":[[124,9]]},"641":{"position":[[227,9]]},"660":{"position":[[55,10]]},"662":{"position":[[649,11],[818,10]]},"696":{"position":[[856,10],[948,10],[1003,9]]},"697":{"position":[[28,9]]},"703":{"position":[[483,9],[513,9]]},"709":{"position":[[138,9],[660,9],[1203,9],[1238,9]]},"710":{"position":[[627,9],[1243,9],[2246,9]]},"714":{"position":[[389,10]]},"718":{"position":[[277,11]]},"745":{"position":[[332,11]]},"759":{"position":[[65,9],[220,11]]},"779":{"position":[[394,9]]},"793":{"position":[[203,9],[1326,9],[1353,9]]},"820":{"position":[[242,9]]},"856":{"position":[[96,10]]},"898":{"position":[[2099,10]]},"932":{"position":[[839,11]]},"981":{"position":[[1121,9]]},"1072":{"position":[[1805,9]]},"1137":{"position":[[121,9]]},"1138":{"position":[[12,9],[252,11]]},"1139":{"position":[[16,9],[48,9],[170,9],[350,11],[386,9],[439,12],[607,10]]},"1140":{"position":[[348,9],[435,9],[566,11],[666,10]]},"1141":{"position":[[215,9],[254,9]]},"1143":{"position":[[104,9],[425,9]]},"1145":{"position":[[16,9],[166,9],[375,9],[428,12],[592,10]]},"1148":{"position":[[236,9]]},"1154":{"position":[[380,11],[544,9]]},"1163":{"position":[[70,11],[191,9]]},"1165":{"position":[[180,9]]},"1170":{"position":[[134,9]]},"1172":{"position":[[152,10],[177,9],[268,9]]},"1173":{"position":[[110,10]]},"1182":{"position":[[70,11],[191,9]]},"1184":{"position":[[436,11]]},"1191":{"position":[[326,9]]},"1195":{"position":[[78,9]]},"1198":{"position":[[1369,9]]},"1206":{"position":[[184,9],[498,10]]},"1209":{"position":[[117,9],[461,10]]},"1222":{"position":[[1131,9],[1192,9],[1230,9]]},"1225":{"position":[[401,9]]},"1226":{"position":[[182,11]]},"1231":{"position":[[586,11]]},"1235":{"position":[[152,9]]},"1237":{"position":[[157,10],[802,11]]},"1238":{"position":[[663,11]]},"1243":{"position":[[5,9],[43,10]]},"1246":{"position":[[1010,11]]},"1247":{"position":[[204,9]]},"1263":{"position":[[159,11],[295,9]]},"1268":{"position":[[714,11]]},"1276":{"position":[[137,9],[244,9]]},"1292":{"position":[[206,9],[238,9],[270,9],[912,11]]},"1294":{"position":[[6,9],[235,9],[2145,9]]},"1295":{"position":[[406,9],[607,9]]},"1296":{"position":[[42,9],[1832,9],[1884,9]]},"1297":{"position":[[77,9]]},"1299":{"position":[[92,9],[331,9],[391,9],[510,9]]},"1300":{"position":[[36,10],[164,10],[386,9]]},"1302":{"position":[[46,9]]}},"keywords":{}}],["indexeddb"",{"_index":1449,"title":{},"content":{"243":{"position":[[195,15]]},"244":{"position":[[507,15]]}},"keywords":{}}],["indexeddb'",{"_index":730,"title":{},"content":{"47":{"position":[[497,11],[665,11]]},"61":{"position":[[286,11]]}},"keywords":{}}],["indexeddb.opf",{"_index":3512,"title":{},"content":{"581":{"position":[[234,14]]}},"keywords":{}}],["indexeddb.shar",{"_index":6274,"title":{},"content":{"1227":{"position":[[902,18]]}},"keywords":{}}],["indexeddb.worker.j",{"_index":6304,"title":{},"content":{"1265":{"position":[[876,22]]}},"keywords":{}}],["indexeddb/lib/fdbkeyrang",{"_index":6052,"title":{},"content":{"1139":{"position":[[490,28]]},"1145":{"position":[[479,28]]}},"keywords":{}}],["indexeddbstorag",{"_index":3329,"title":{},"content":{"545":{"position":[[142,16]]},"605":{"position":[[142,16]]}},"keywords":{}}],["indexeddbth",{"_index":3969,"title":{},"content":{"703":{"position":[[428,12]]}},"keywords":{}}],["indexeddb—a",{"_index":3415,"title":{},"content":{"560":{"position":[[184,11]]}},"keywords":{}}],["indexes.array",{"_index":4377,"title":{},"content":{"749":{"position":[[18727,13]]}},"keywords":{}}],["indexing.typescript",{"_index":3534,"title":{},"content":{"595":{"position":[[564,19]]}},"keywords":{}}],["indexkey",{"_index":4380,"title":{},"content":{"749":{"position":[[18943,8]]}},"keywords":{}}],["indexnrtostring(distancetoindex",{"_index":2403,"title":{},"content":{"398":{"position":[[1080,32],[1242,32],[2380,31],[2427,31]]}},"keywords":{}}],["indexnrtostring(indexvalu",{"_index":2387,"title":{},"content":{"397":{"position":[[2172,28]]}},"keywords":{}}],["indexopt",{"_index":4061,"title":{},"content":{"724":{"position":[[1482,13]]}},"keywords":{}}],["indexschema",{"_index":2357,"title":{},"content":{"397":{"position":[[472,11],[911,12],[942,12],[973,12],[1004,12],[1035,11]]}},"keywords":{}}],["indexvalu",{"_index":2384,"title":{},"content":{"397":{"position":[[2086,10]]}},"keywords":{}}],["indic",{"_index":446,"title":{},"content":{"27":{"position":[[396,9]]},"427":{"position":[[1407,10]]},"474":{"position":[[225,10]]},"602":{"position":[[267,9]]},"855":{"position":[[224,8]]},"861":{"position":[[1773,9]]},"867":{"position":[[219,8]]},"990":{"position":[[925,9]]}},"keywords":{}}],["indirect",{"_index":2561,"title":{},"content":{"408":{"position":[[3984,11]]}},"keywords":{}}],["indispens",{"_index":3238,"title":{},"content":{"506":{"position":[[140,13]]},"510":{"position":[[498,13]]}},"keywords":{}}],["individu",{"_index":968,"title":{},"content":{"75":{"position":[[36,10]]},"106":{"position":[[23,10]]},"174":{"position":[[1017,10]]},"279":{"position":[[246,10]]},"304":{"position":[[42,10]]},"369":{"position":[[357,10]]}},"keywords":{}}],["industri",{"_index":3450,"title":{},"content":{"569":{"position":[[256,10]]}},"keywords":{}}],["ineffici",{"_index":2063,"title":{},"content":{"358":{"position":[[579,11]]},"394":{"position":[[1762,11]]},"430":{"position":[[373,11]]},"624":{"position":[[1412,12]]}},"keywords":{}}],["inequ",{"_index":4890,"title":{},"content":{"858":{"position":[[471,10]]}},"keywords":{}}],["inevit",{"_index":2656,"title":{},"content":{"412":{"position":[[681,10],[3049,10]]},"474":{"position":[[57,10]]}},"keywords":{}}],["infin",{"_index":3646,"title":{},"content":{"617":{"position":[[1372,8]]},"749":{"position":[[21388,8],[21401,8]]},"1294":{"position":[[1333,9],[1367,9]]},"1296":{"position":[[1387,10],[1398,10],[1564,9]]}},"keywords":{}}],["infinit",{"_index":3274,"title":{},"content":{"523":{"position":[[559,11]]},"696":{"position":[[280,8]]},"1009":{"position":[[872,8]]},"1010":{"position":[[8,8],[70,8]]}},"keywords":{}}],["influenc",{"_index":1754,"title":{},"content":{"299":{"position":[[792,10]]}},"keywords":{}}],["info",{"_index":871,"title":{},"content":{"58":{"position":[[319,5]]},"546":{"position":[[216,5]]},"606":{"position":[[216,5]]},"746":{"position":[[749,5]]},"749":{"position":[[297,5]]}},"keywords":{}}],["inform",{"_index":906,"title":{},"content":{"65":{"position":[[214,12],[661,12],[1684,12]]},"95":{"position":[[82,12]]},"152":{"position":[[100,11]]},"158":{"position":[[332,12]]},"167":{"position":[[172,11]]},"173":{"position":[[1287,11]]},"195":{"position":[[156,11]]},"218":{"position":[[156,12]]},"279":{"position":[[267,11]]},"289":{"position":[[1384,12],[1976,11]]},"291":{"position":[[245,11],[411,12]]},"310":{"position":[[62,12]]},"343":{"position":[[123,12]]},"346":{"position":[[296,6]]},"377":{"position":[[217,12]]},"410":{"position":[[563,11]]},"441":{"position":[[622,8]]},"458":{"position":[[1229,6]]},"506":{"position":[[111,12]]},"526":{"position":[[143,11]]},"550":{"position":[[136,11],[226,12]]},"586":{"position":[[37,12]]},"610":{"position":[[435,12]]},"638":{"position":[[58,11],[102,12]]},"698":{"position":[[1145,11]]},"701":{"position":[[771,11]]},"875":{"position":[[8737,8],[9157,11]]},"880":{"position":[[129,6]]},"889":{"position":[[315,11]]},"890":{"position":[[911,11]]},"912":{"position":[[294,11]]},"1151":{"position":[[167,6]]},"1178":{"position":[[166,6]]}},"keywords":{}}],["infrastructur",{"_index":1227,"title":{},"content":{"174":{"position":[[3183,14]]},"201":{"position":[[60,14]]},"289":{"position":[[1216,15]]},"408":{"position":[[2177,14]]},"412":{"position":[[1443,14],[1925,15],[4167,15]]},"418":{"position":[[764,14]]},"485":{"position":[[110,15]]},"504":{"position":[[1480,14]]},"614":{"position":[[226,14]]},"619":{"position":[[163,14]]},"627":{"position":[[44,14],[242,15]]},"632":{"position":[[986,15]]},"686":{"position":[[483,15]]},"875":{"position":[[7671,15]]},"902":{"position":[[223,15]]}},"keywords":{}}],["infrastructure.optim",{"_index":6490,"title":{},"content":{"1304":{"position":[[1976,28]]}},"keywords":{}}],["inher",{"_index":1025,"title":{},"content":{"99":{"position":[[165,10]]},"226":{"position":[[130,10]]},"279":{"position":[[29,10]]},"281":{"position":[[146,10]]},"352":{"position":[[273,10]]},"545":{"position":[[42,8]]},"605":{"position":[[42,8]]}},"keywords":{}}],["inherit",{"_index":5127,"title":{},"content":{"886":{"position":[[1913,9]]}},"keywords":{}}],["init",{"_index":3037,"title":{},"content":{"463":{"position":[[1022,4]]},"1002":{"position":[[640,4],[1294,4]]}},"keywords":{}}],["initdatabas",{"_index":1941,"title":{},"content":{"334":{"position":[[299,14]]},"335":{"position":[[202,15]]},"579":{"position":[[308,14]]},"580":{"position":[[346,12],[444,15]]}},"keywords":{}}],["initdb",{"_index":778,"title":{},"content":{"51":{"position":[[650,8]]},"209":{"position":[[214,8]]},"255":{"position":[[561,8]]},"314":{"position":[[447,8]]},"480":{"position":[[305,8]]},"598":{"position":[[408,8]]},"601":{"position":[[424,6],[527,9]]},"829":{"position":[[1486,6],[1564,9]]}},"keywords":{}}],["initencrypteddatabas",{"_index":3345,"title":{},"content":{"554":{"position":[[820,23]]},"555":{"position":[[207,24]]}},"keywords":{}}],["initencrypteddb",{"_index":1896,"title":{},"content":{"315":{"position":[[398,17]]}},"keywords":{}}],["initi",{"_index":786,"title":{"70":{"position":[[0,14]]},"93":{"position":[[7,7]]},"101":{"position":[[0,14]]},"206":{"position":[[16,15]]},"217":{"position":[[10,7]]},"227":{"position":[[0,14]]},"463":{"position":[[0,14]]}},"content":{"52":{"position":[[23,12]]},"65":{"position":[[1273,7],[1375,7]]},"69":{"position":[[89,7]]},"70":{"position":[[64,14]]},"93":{"position":[[41,7],[201,14]]},"101":{"position":[[5,14],[176,14]]},"145":{"position":[[215,15]]},"173":{"position":[[1617,7],[1712,7]]},"206":{"position":[[66,7]]},"217":{"position":[[44,7]]},"227":{"position":[[82,14],[308,14]]},"253":{"position":[[85,14],[224,10]]},"266":{"position":[[1026,7]]},"299":{"position":[[448,7]]},"314":{"position":[[275,10]]},"334":{"position":[[111,12]]},"346":{"position":[[27,10]]},"411":{"position":[[118,7]]},"412":{"position":[[6177,8],[6643,7],[7194,10],[7281,7]]},"419":{"position":[[1461,12]]},"462":{"position":[[115,14]]},"463":{"position":[[191,14],[492,10]]},"468":{"position":[[471,9]]},"469":{"position":[[663,7],[768,7]]},"491":{"position":[[1182,9]]},"522":{"position":[[181,11]]},"539":{"position":[[23,12]]},"590":{"position":[[112,10]]},"599":{"position":[[23,12]]},"610":{"position":[[577,9],[1379,8]]},"612":{"position":[[731,10]]},"616":{"position":[[632,7]]},"636":{"position":[[346,15]]},"648":{"position":[[307,7]]},"653":{"position":[[651,7],[840,7]]},"656":{"position":[[318,7]]},"724":{"position":[[1194,10],[1281,10],[1371,15]]},"749":{"position":[[14834,7],[14990,7]]},"780":{"position":[[567,7]]},"783":{"position":[[495,7],[635,7]]},"829":{"position":[[1228,12],[2063,7]]},"844":{"position":[[8,7]]},"854":{"position":[[56,10]]},"886":{"position":[[4390,10]]},"901":{"position":[[214,7]]},"903":{"position":[[321,7]]},"984":{"position":[[10,7]]},"994":{"position":[[50,7],[238,7]]},"1013":{"position":[[798,7]]},"1115":{"position":[[285,9]]},"1119":{"position":[[170,7]]},"1161":{"position":[[102,7]]},"1162":{"position":[[521,7],[582,7]]},"1170":{"position":[[85,7],[240,7]]},"1180":{"position":[[102,7]]},"1181":{"position":[[608,7],[670,7]]},"1186":{"position":[[112,7]]},"1238":{"position":[[314,14],[347,7],[421,14]]},"1239":{"position":[[301,14]]},"1246":{"position":[[1801,7]]},"1267":{"position":[[359,7]]},"1295":{"position":[[725,7],[1005,14]]},"1299":{"position":[[167,7]]},"1301":{"position":[[1419,7]]},"1316":{"position":[[3531,9]]}},"keywords":{}}],["initialcheckpoint",{"_index":5535,"title":{"1002":{"position":[[17,18]]}},"content":{"1002":{"position":[[696,18],[1350,18]]}},"keywords":{}}],["initialis",{"_index":6129,"title":{},"content":{"1171":{"position":[[207,14],[319,14]]}},"keywords":{}}],["initialvalu",{"_index":840,"title":{},"content":{"55":{"position":[[495,13],[561,13]]},"1118":{"position":[[561,13],[600,12]]}},"keywords":{}}],["initsecuredb",{"_index":3135,"title":{},"content":{"482":{"position":[[395,14]]}},"keywords":{}}],["initzerolocaldb",{"_index":3703,"title":{},"content":{"632":{"position":[[1186,17]]}},"keywords":{}}],["inject",{"_index":844,"title":{},"content":{"55":{"position":[[809,7]]},"825":{"position":[[177,11],[189,6],[562,6]]}},"keywords":{}}],["inject(dbservic",{"_index":4731,"title":{},"content":{"825":{"position":[[942,18]]}},"keywords":{}}],["injector",{"_index":833,"title":{},"content":{"55":{"position":[[262,8],[400,10],[575,9],[817,8]]}},"keywords":{}}],["ink&switch",{"_index":2521,"title":{},"content":{"407":{"position":[[1177,16]]},"419":{"position":[[703,15]]}},"keywords":{}}],["inner",{"_index":2767,"title":{},"content":{"412":{"position":[[13943,5],[13960,5]]},"990":{"position":[[807,5]]}},"keywords":{}}],["innov",{"_index":3246,"title":{},"content":{"510":{"position":[[565,10]]}},"keywords":{}}],["input",{"_index":592,"title":{},"content":{"38":{"position":[[484,5]]},"393":{"position":[[773,5]]},"394":{"position":[[238,5],[306,5]]},"404":{"position":[[774,5],[922,5]]},"411":{"position":[[2367,6]]},"571":{"position":[[163,7],[1694,5]]},"691":{"position":[[311,7]]},"759":{"position":[[905,7]]},"760":{"position":[[793,7]]},"848":{"position":[[273,5]]},"875":{"position":[[3696,5]]},"885":{"position":[[111,6],[519,5],[715,5],[911,5],[1289,5],[1981,5]]},"886":{"position":[[157,5],[2182,5],[3404,6]]},"968":{"position":[[265,5]]},"983":{"position":[[238,6],[574,6]]},"1030":{"position":[[217,6]]},"1100":{"position":[[465,5]]},"1104":{"position":[[309,5]]},"1105":{"position":[[187,5]]},"1115":{"position":[[125,5]]},"1317":{"position":[[31,6]]}},"keywords":{}}],["input.newdocumentstate.nam",{"_index":3915,"title":{},"content":{"691":{"position":[[368,27]]}},"keywords":{}}],["input.realmasterst",{"_index":3914,"title":{},"content":{"691":{"position":[[336,25]]}},"keywords":{}}],["input.realmasterstate.nam",{"_index":3916,"title":{},"content":{"691":{"position":[[399,27]]}},"keywords":{}}],["input.realmasterstate.scor",{"_index":3918,"title":{},"content":{"691":{"position":[[473,28]]}},"keywords":{}}],["insensit",{"_index":5770,"title":{},"content":{"1065":{"position":[[1202,11]]},"1072":{"position":[[1640,11],[1771,11],[2004,14],[2074,11],[2192,11],[2593,11],[2728,11]]}},"keywords":{}}],["insert",{"_index":787,"title":{"555":{"position":[[3,9]]},"683":{"position":[[9,8]]},"767":{"position":[[0,7]]},"942":{"position":[[0,9]]},"1035":{"position":[[0,7]]}},"content":{"52":{"position":[[77,6],[171,6]]},"188":{"position":[[2805,6]]},"301":{"position":[[222,6]]},"356":{"position":[[393,6],[424,6]]},"412":{"position":[[9911,9]]},"427":{"position":[[1357,7]]},"539":{"position":[[77,6],[171,6]]},"555":{"position":[[235,6]]},"562":{"position":[[538,6]]},"599":{"position":[[77,6],[180,6]]},"662":{"position":[[2570,6]]},"680":{"position":[[1194,6]]},"683":{"position":[[45,6],[370,8],[460,6],[570,6],[891,6]]},"703":{"position":[[221,6]]},"710":{"position":[[1880,6]]},"711":{"position":[[1222,6]]},"715":{"position":[[254,6]]},"717":{"position":[[286,7]]},"749":{"position":[[6748,6]]},"767":{"position":[[4,6],[626,6]]},"802":{"position":[[365,11]]},"813":{"position":[[221,9]]},"838":{"position":[[2784,6]]},"863":{"position":[[701,7]]},"904":{"position":[[1125,6]]},"941":{"position":[[219,7]]},"942":{"position":[[13,6]]},"943":{"position":[[44,6],[255,9]]},"944":{"position":[[18,6],[58,7],[99,9],[480,9]]},"946":{"position":[[1,7]]},"953":{"position":[[216,8]]},"1035":{"position":[[4,6],[75,9]]},"1055":{"position":[[61,6]]},"1058":{"position":[[448,6]]},"1065":{"position":[[1753,6],[2058,8]]},"1078":{"position":[[822,9]]},"1082":{"position":[[73,6]]},"1106":{"position":[[384,7]]},"1158":{"position":[[543,6]]},"1194":{"position":[[57,7],[224,6],[353,6],[393,6],[540,6]]},"1209":{"position":[[226,7]]},"1292":{"position":[[302,6],[309,6],[656,6],[663,6]]},"1296":{"position":[[757,6]]},"1311":{"position":[[1435,6]]}},"keywords":{}}],["insert/upd",{"_index":4953,"title":{},"content":{"872":{"position":[[1272,13]]}},"keywords":{}}],["insert/update/delet",{"_index":6568,"title":{},"content":{"1317":{"position":[[697,20]]}},"keywords":{}}],["insertcrdt",{"_index":3885,"title":{},"content":{"683":{"position":[[249,12],[537,12]]}},"keywords":{}}],["insertifnotexist",{"_index":5329,"title":{"943":{"position":[[0,20]]}},"content":{"943":{"position":[[5,19]]}},"keywords":{}}],["insertloc",{"_index":5598,"title":{"1014":{"position":[[0,14]]}},"content":{},"keywords":{}}],["insertresult",{"_index":2234,"title":{},"content":{"392":{"position":[[1066,12]]}},"keywords":{}}],["inserts/upd",{"_index":5189,"title":{},"content":{"897":{"position":[[219,15]]}},"keywords":{}}],["insid",{"_index":53,"title":{"1213":{"position":[[62,6]]}},"content":{"3":{"position":[[39,6]]},"5":{"position":[[30,6]]},"8":{"position":[[703,6]]},"14":{"position":[[770,6]]},"16":{"position":[[208,6]]},"188":{"position":[[368,6],[1894,6],[2226,6],[2267,6]]},"356":{"position":[[829,6]]},"365":{"position":[[652,6]]},"366":{"position":[[477,6],[606,6]]},"367":{"position":[[24,6]]},"408":{"position":[[4913,6]]},"411":{"position":[[2158,6]]},"429":{"position":[[618,6]]},"451":{"position":[[150,6]]},"454":{"position":[[212,6],[536,6]]},"458":{"position":[[1486,6]]},"460":{"position":[[407,6],[1083,6]]},"463":{"position":[[369,6]]},"469":{"position":[[729,6]]},"470":{"position":[[230,6]]},"575":{"position":[[140,6]]},"616":{"position":[[789,6]]},"661":{"position":[[85,6]]},"682":{"position":[[192,6]]},"685":{"position":[[28,6]]},"697":{"position":[[21,6],[582,6]]},"708":{"position":[[576,6]]},"710":{"position":[[552,6]]},"711":{"position":[[113,6]]},"721":{"position":[[113,6],[317,6]]},"749":{"position":[[3395,6],[3580,6]]},"757":{"position":[[86,6],[158,6]]},"772":{"position":[[1149,6],[1338,6]]},"779":{"position":[[384,6]]},"785":{"position":[[514,6]]},"806":{"position":[[34,6]]},"836":{"position":[[87,6]]},"838":{"position":[[1256,6]]},"857":{"position":[[65,6]]},"861":{"position":[[461,6]]},"875":{"position":[[5733,6]]},"904":{"position":[[455,6]]},"951":{"position":[[289,6]]},"981":{"position":[[473,6]]},"1031":{"position":[[59,6]]},"1032":{"position":[[28,6]]},"1033":{"position":[[377,6],[952,6]]},"1085":{"position":[[70,6],[3087,6]]},"1101":{"position":[[399,6]]},"1116":{"position":[[18,6]]},"1121":{"position":[[34,6]]},"1126":{"position":[[53,6]]},"1171":{"position":[[371,6]]},"1183":{"position":[[336,6]]},"1206":{"position":[[509,6]]},"1207":{"position":[[343,6]]},"1210":{"position":[[36,6]]},"1211":{"position":[[77,6]]},"1212":{"position":[[78,6],[266,6]]},"1213":{"position":[[23,6],[393,6],[563,6],[795,6]]},"1214":{"position":[[932,6]]},"1230":{"position":[[57,6],[331,6]]},"1231":{"position":[[81,6],[190,6]]},"1233":{"position":[[126,6]]},"1237":{"position":[[413,6]]},"1242":{"position":[[48,6]]},"1244":{"position":[[144,6]]},"1250":{"position":[[400,6],[488,6]]},"1270":{"position":[[525,6]]},"1280":{"position":[[152,6]]},"1313":{"position":[[65,6]]},"1315":{"position":[[1173,6]]},"1319":{"position":[[461,6]]},"1323":{"position":[[50,6]]}},"keywords":{}}],["insight",{"_index":1621,"title":{},"content":{"267":{"position":[[1070,8]]},"420":{"position":[[1102,8]]},"644":{"position":[[330,9]]}},"keywords":{}}],["inspect",{"_index":597,"title":{},"content":{"38":{"position":[[882,7]]},"364":{"position":[[825,10]]},"394":{"position":[[1169,7]]},"467":{"position":[[427,10]]},"698":{"position":[[2147,7]]},"889":{"position":[[1080,7]]}},"keywords":{}}],["instal",{"_index":29,"title":{"49":{"position":[[0,10]]},"128":{"position":[[0,10]]},"257":{"position":[[0,7]]},"333":{"position":[[0,10]]},"537":{"position":[[0,10]]},"553":{"position":[[3,7]]},"578":{"position":[[0,13]]},"597":{"position":[[0,10]]},"646":{"position":[[0,13]]},"652":{"position":[[0,13]]},"680":{"position":[[0,13]]},"725":{"position":[[0,7]]},"731":{"position":[[0,10]]},"1133":{"position":[[0,13]]}},"content":{"1":{"position":[[424,7]]},"2":{"position":[[105,7],[135,7]]},"3":{"position":[[113,7]]},"4":{"position":[[279,7]]},"5":{"position":[[195,7]]},"6":{"position":[[262,7],[294,7]]},"7":{"position":[[217,7]]},"8":{"position":[[157,7],[233,7],[467,7]]},"9":{"position":[[129,7]]},"10":{"position":[[58,7]]},"11":{"position":[[96,7]]},"38":{"position":[[754,9]]},"49":{"position":[[9,7],[66,7]]},"128":{"position":[[57,7],[101,7],[171,7],[197,10]]},"188":{"position":[[1986,7],[2189,7],[2250,13]]},"211":{"position":[[1,7],[19,7]]},"257":{"position":[[5,7]]},"285":{"position":[[164,10]]},"314":{"position":[[238,7],[256,7]]},"333":{"position":[[1,7],[47,7]]},"498":{"position":[[180,12]]},"500":{"position":[[141,9],[449,13]]},"503":{"position":[[135,10]]},"522":{"position":[[87,10],[123,7],[145,10]]},"537":{"position":[[8,7],[45,7]]},"542":{"position":[[170,7],[206,7]]},"553":{"position":[[1,7],[83,7],[100,7]]},"578":{"position":[[9,7],[76,7]]},"597":{"position":[[8,7],[47,7]]},"614":{"position":[[248,12]]},"659":{"position":[[216,7],[240,7]]},"661":{"position":[[516,7],[537,7]]},"662":{"position":[[1226,7],[1259,7]]},"666":{"position":[[72,9]]},"670":{"position":[[175,10]]},"710":{"position":[[1420,7],[1453,7]]},"711":{"position":[[688,7],[857,9],[886,7],[908,7]]},"726":{"position":[[4,7]]},"727":{"position":[[18,7],[67,9]]},"728":{"position":[[70,7]]},"760":{"position":[[60,7]]},"793":{"position":[[55,7]]},"829":{"position":[[3,13],[17,7],[54,7]]},"836":{"position":[[450,7],[509,7]]},"837":{"position":[[1274,7],[1325,7]]},"838":{"position":[[1757,7],[1790,7]]},"854":{"position":[[3,7],[37,7]]},"861":{"position":[[340,9],[411,12],[436,12],[769,12]]},"862":{"position":[[120,7],[160,7]]},"866":{"position":[[3,7],[33,7]]},"872":{"position":[[3,7],[64,7],[127,7],[474,9]]},"898":{"position":[[3,7],[29,7]]},"911":{"position":[[377,9],[402,7]]},"1097":{"position":[[36,7],[77,7],[497,9]]},"1112":{"position":[[206,7]]},"1133":{"position":[[1,7],[154,7],[186,7],[423,7]]},"1139":{"position":[[373,7]]},"1145":{"position":[[362,7]]},"1148":{"position":[[427,7],[462,7]]},"1189":{"position":[[3,7],[36,7]]},"1227":{"position":[[285,9]]},"1265":{"position":[[278,9]]},"1270":{"position":[[372,9]]},"1277":{"position":[[1,7]]},"1279":{"position":[[1,7]]}},"keywords":{}}],["installmak",{"_index":3826,"title":{},"content":{"666":{"position":[[239,11]]}},"keywords":{}}],["instanc",{"_index":427,"title":{"757":{"position":[[40,10]]},"790":{"position":[[0,8]]},"791":{"position":[[4,8]]},"1135":{"position":[[6,9]]},"1229":{"position":[[26,9]]},"1268":{"position":[[20,9]]}},"content":{"26":{"position":[[261,9]]},"89":{"position":[[89,9]]},"109":{"position":[[119,9]]},"123":{"position":[[145,9]]},"145":{"position":[[162,9]]},"173":{"position":[[578,9]]},"174":{"position":[[1860,9]]},"266":{"position":[[916,8]]},"285":{"position":[[245,8]]},"289":{"position":[[1300,9]]},"293":{"position":[[258,8]]},"299":{"position":[[1210,9]]},"325":{"position":[[119,9]]},"327":{"position":[[323,10]]},"334":{"position":[[53,8]]},"335":{"position":[[25,9]]},"346":{"position":[[82,8]]},"352":{"position":[[220,9]]},"379":{"position":[[209,9]]},"408":{"position":[[4412,9]]},"412":{"position":[[3793,10],[4046,8],[6124,9],[7858,9],[10441,9]]},"416":{"position":[[114,9]]},"439":{"position":[[490,9]]},"494":{"position":[[74,9]]},"495":{"position":[[605,9]]},"504":{"position":[[1235,9]]},"517":{"position":[[234,9]]},"525":{"position":[[318,10]]},"566":{"position":[[974,8]]},"570":{"position":[[557,8]]},"579":{"position":[[49,8],[820,9]]},"589":{"position":[[104,9]]},"590":{"position":[[200,8]]},"612":{"position":[[757,8],[918,9]]},"632":{"position":[[1229,8]]},"636":{"position":[[211,9]]},"641":{"position":[[217,9]]},"653":{"position":[[1309,8],[1410,8]]},"683":{"position":[[398,9]]},"685":{"position":[[340,9]]},"724":{"position":[[363,8]]},"743":{"position":[[286,10]]},"746":{"position":[[604,9]]},"749":{"position":[[3006,9],[3235,9],[4753,8],[5393,8],[15072,8],[23842,8]]},"757":{"position":[[31,9],[149,8],[232,10],[247,9]]},"766":{"position":[[98,8],[273,9]]},"770":{"position":[[109,8]]},"775":{"position":[[184,10],[350,9]]},"790":{"position":[[1,8]]},"817":{"position":[[324,9]]},"818":{"position":[[223,9]]},"826":{"position":[[347,10]]},"829":{"position":[[971,8],[2228,9]]},"837":{"position":[[2047,8]]},"855":{"position":[[133,10]]},"861":{"position":[[836,8]]},"867":{"position":[[133,10]]},"872":{"position":[[1687,8]]},"875":{"position":[[6836,10]]},"945":{"position":[[330,10]]},"955":{"position":[[33,8]]},"957":{"position":[[40,8]]},"958":{"position":[[100,8],[311,8]]},"964":{"position":[[46,8],[197,10],[411,9],[565,8]]},"966":{"position":[[51,9],[431,9]]},"967":{"position":[[48,9]]},"976":{"position":[[29,9]]},"977":{"position":[[111,8],[184,8],[527,10]]},"978":{"position":[[40,8]]},"979":{"position":[[65,8],[136,8]]},"986":{"position":[[519,10],[991,9]]},"988":{"position":[[1318,8],[2373,9]]},"989":{"position":[[58,8],[250,8],[408,9]]},"990":{"position":[[197,8],[267,8]]},"995":{"position":[[1293,10]]},"1003":{"position":[[298,8]]},"1013":{"position":[[218,9]]},"1052":{"position":[[327,8],[428,9]]},"1053":{"position":[[40,8]]},"1065":{"position":[[577,8],[662,9]]},"1070":{"position":[[40,8]]},"1085":{"position":[[133,8],[2845,8]]},"1088":{"position":[[422,9]]},"1114":{"position":[[11,8],[315,9],[807,8]]},"1116":{"position":[[38,8]]},"1118":{"position":[[67,9]]},"1120":{"position":[[557,9],[637,10]]},"1123":{"position":[[210,8],[426,10]]},"1124":{"position":[[1066,9],[1166,8],[1276,10],[2170,9]]},"1126":{"position":[[195,9],[278,9],[538,9],[835,9]]},"1148":{"position":[[830,8]]},"1154":{"position":[[123,8],[187,9]]},"1164":{"position":[[611,9]]},"1174":{"position":[[264,9]]},"1220":{"position":[[84,9],[400,8]]},"1222":{"position":[[608,9]]},"1229":{"position":[[107,8]]},"1233":{"position":[[245,9]]},"1246":{"position":[[1114,10],[1404,8]]},"1267":{"position":[[66,8],[203,8]]},"1268":{"position":[[101,8]]},"1305":{"position":[[693,8]]},"1314":{"position":[[301,9]]}},"keywords":{}}],["instanceadd",{"_index":5905,"title":{},"content":{"1085":{"position":[[3686,11]]}},"keywords":{}}],["instanceof",{"_index":4188,"title":{},"content":{"749":{"position":[[4154,10]]}},"keywords":{}}],["instances.multi",{"_index":3484,"title":{},"content":{"575":{"position":[[520,15]]}},"keywords":{}}],["instand",{"_index":2128,"title":{},"content":{"369":{"position":[[1266,7]]}},"keywords":{}}],["instant",{"_index":923,"title":{},"content":{"65":{"position":[[1160,7]]},"152":{"position":[[82,7]]},"267":{"position":[[1062,7]]},"375":{"position":[[525,7]]},"407":{"position":[[394,7]]},"415":{"position":[[73,7]]},"474":{"position":[[173,7]]},"483":{"position":[[70,7]]},"486":{"position":[[73,8]]},"489":{"position":[[126,7],[325,7]]},"491":{"position":[[678,8]]},"498":{"position":[[582,7]]},"630":{"position":[[495,7]]},"724":{"position":[[1263,8],[1358,9],[1387,10]]},"1009":{"position":[[688,7]]}},"keywords":{}}],["instantan",{"_index":1603,"title":{},"content":{"265":{"position":[[416,13]]},"410":{"position":[[72,13]]},"411":{"position":[[3693,13]]},"489":{"position":[[560,13]]},"502":{"position":[[848,13]]},"571":{"position":[[107,13]]},"860":{"position":[[711,16]]}},"keywords":{}}],["instantdb",{"_index":612,"title":{"39":{"position":[[0,10]]}},"content":{"39":{"position":[[1,9],[457,9]]}},"keywords":{}}],["instantli",{"_index":1006,"title":{},"content":{"90":{"position":[[189,9]]},"156":{"position":[[250,9]]},"205":{"position":[[388,10]]},"267":{"position":[[704,9]]},"312":{"position":[[106,9]]},"323":{"position":[[98,9]]},"329":{"position":[[202,9]]},"408":{"position":[[2829,9]]},"412":{"position":[[6561,11]]},"421":{"position":[[986,9]]},"445":{"position":[[1069,9]]},"475":{"position":[[201,9]]},"490":{"position":[[412,9]]},"491":{"position":[[1583,9]]},"493":{"position":[[517,9]]},"494":{"position":[[661,10]]},"570":{"position":[[588,10]]},"582":{"position":[[335,9]]},"634":{"position":[[136,9]]},"778":{"position":[[391,10]]},"1084":{"position":[[449,9]]}},"keywords":{}}],["instead",{"_index":381,"title":{"144":{"position":[[38,7]]},"354":{"position":[[19,7]]},"431":{"position":[[12,7]]},"563":{"position":[[29,7]]},"691":{"position":[[57,7]]},"822":{"position":[[43,7]]},"1211":{"position":[[30,7]]},"1293":{"position":[[38,7]]}},"content":{"23":{"position":[[126,7]]},"31":{"position":[[84,7]]},"38":{"position":[[236,7],[328,7]]},"40":{"position":[[331,8]]},"55":{"position":[[1050,7]]},"91":{"position":[[100,7]]},"93":{"position":[[73,7]]},"143":{"position":[[308,7]]},"144":{"position":[[108,7]]},"173":{"position":[[1995,7],[3021,7]]},"188":{"position":[[2169,7]]},"220":{"position":[[89,7]]},"255":{"position":[[269,7]]},"277":{"position":[[88,7]]},"287":{"position":[[54,8]]},"323":{"position":[[472,7]]},"329":{"position":[[1,7]]},"346":{"position":[[187,7]]},"360":{"position":[[230,7]]},"364":{"position":[[707,7]]},"367":{"position":[[121,7]]},"390":{"position":[[600,7],[1072,7]]},"392":{"position":[[3760,7]]},"395":{"position":[[446,8]]},"400":{"position":[[546,8]]},"408":{"position":[[3843,8]]},"410":{"position":[[238,7]]},"411":{"position":[[626,7],[1179,7],[3615,7]]},"412":{"position":[[2938,7],[5749,7],[10960,7]]},"432":{"position":[[1236,7]]},"439":{"position":[[261,7],[607,7]]},"440":{"position":[[410,7]]},"454":{"position":[[840,7]]},"464":{"position":[[1044,7]]},"466":{"position":[[556,7]]},"467":{"position":[[719,8]]},"469":{"position":[[345,7]]},"487":{"position":[[25,7]]},"490":{"position":[[549,7]]},"554":{"position":[[727,8]]},"556":{"position":[[1262,7]]},"563":{"position":[[639,7],[877,7]]},"570":{"position":[[714,7]]},"571":{"position":[[739,7]]},"602":{"position":[[182,7]]},"612":{"position":[[489,7]]},"616":{"position":[[373,7],[756,7],[1003,7],[1214,7]]},"617":{"position":[[2074,7]]},"626":{"position":[[542,7]]},"630":{"position":[[762,7],[894,7]]},"681":{"position":[[896,7]]},"686":{"position":[[175,7],[290,7],[521,7],[720,7]]},"688":{"position":[[240,7],[340,7],[786,7]]},"698":{"position":[[1509,7],[2373,7]]},"708":{"position":[[514,7]]},"709":{"position":[[1221,7]]},"717":{"position":[[402,7]]},"751":{"position":[[443,7]]},"782":{"position":[[301,7]]},"795":{"position":[[88,7]]},"798":{"position":[[899,8]]},"799":{"position":[[439,7]]},"800":{"position":[[99,8],[748,7]]},"817":{"position":[[334,7]]},"826":{"position":[[257,8]]},"828":{"position":[[303,7]]},"831":{"position":[[219,7]]},"835":{"position":[[189,7],[695,8]]},"836":{"position":[[1091,7]]},"838":{"position":[[2226,7]]},"854":{"position":[[1347,7]]},"863":{"position":[[578,7]]},"872":{"position":[[1514,8]]},"875":{"position":[[1518,7],[5908,7]]},"882":{"position":[[65,7]]},"888":{"position":[[205,7]]},"898":{"position":[[565,8]]},"904":{"position":[[2733,8],[3221,7]]},"906":{"position":[[457,8]]},"918":{"position":[[59,7]]},"927":{"position":[[89,7]]},"944":{"position":[[596,7]]},"945":{"position":[[259,7]]},"968":{"position":[[223,8]]},"975":{"position":[[147,7]]},"985":{"position":[[260,7]]},"986":{"position":[[364,7],[1045,7]]},"988":{"position":[[2121,7],[2226,8],[3128,7]]},"995":{"position":[[1197,7]]},"1002":{"position":[[888,7]]},"1007":{"position":[[195,7]]},"1013":{"position":[[127,7]]},"1040":{"position":[[95,7]]},"1044":{"position":[[134,7]]},"1051":{"position":[[148,8]]},"1066":{"position":[[705,8]]},"1067":{"position":[[1708,7]]},"1068":{"position":[[496,7]]},"1069":{"position":[[281,7]]},"1072":{"position":[[1070,8],[1327,8]]},"1090":{"position":[[191,7]]},"1093":{"position":[[1,7]]},"1098":{"position":[[74,7]]},"1099":{"position":[[70,7]]},"1115":{"position":[[513,7]]},"1117":{"position":[[1,7]]},"1124":{"position":[[19,7],[354,7],[1518,7],[1852,8]]},"1140":{"position":[[390,7]]},"1143":{"position":[[281,7]]},"1154":{"position":[[614,8]]},"1162":{"position":[[797,7],[1063,7]]},"1165":{"position":[[78,7],[243,7]]},"1174":{"position":[[554,7]]},"1175":{"position":[[467,7]]},"1191":{"position":[[344,7]]},"1194":{"position":[[187,7]]},"1196":{"position":[[194,8]]},"1214":{"position":[[323,7]]},"1222":{"position":[[372,8]]},"1229":{"position":[[1,7]]},"1231":{"position":[[334,8]]},"1238":{"position":[[255,7]]},"1249":{"position":[[358,7]]},"1251":{"position":[[148,8],[347,7]]},"1253":{"position":[[114,7]]},"1258":{"position":[[108,7]]},"1268":{"position":[[1,7]]},"1277":{"position":[[707,8]]},"1282":{"position":[[228,8]]},"1295":{"position":[[114,7]]},"1296":{"position":[[65,7],[462,7],[698,7]]},"1298":{"position":[[97,7]]},"1299":{"position":[[117,7]]},"1300":{"position":[[444,7]]},"1301":{"position":[[844,7],[1120,8]]},"1305":{"position":[[317,8]]},"1307":{"position":[[576,7]]},"1309":{"position":[[1043,8],[1174,8]]},"1316":{"position":[[1536,7],[2057,7],[3248,7],[3599,7]]},"1318":{"position":[[160,7],[650,7]]}},"keywords":{}}],["instead.th",{"_index":6063,"title":{},"content":{"1141":{"position":[[203,11]]}},"keywords":{}}],["instock=fals",{"_index":6544,"title":{},"content":{"1316":{"position":[[854,13]]}},"keywords":{}}],["instruct",{"_index":998,"title":{},"content":{"84":{"position":[[367,12]]},"114":{"position":[[380,12]]},"149":{"position":[[380,12]]},"175":{"position":[[371,12]]},"285":{"position":[[379,12]]},"347":{"position":[[378,12]]},"362":{"position":[[1449,12]]},"511":{"position":[[380,12]]},"531":{"position":[[380,12]]},"591":{"position":[[378,12]]}},"keywords":{}}],["insuffici",{"_index":2791,"title":{},"content":{"417":{"position":[[186,13]]}},"keywords":{}}],["int",{"_index":5083,"title":{},"content":{"885":{"position":[[887,6]]},"886":{"position":[[629,5]]}},"keywords":{}}],["intact",{"_index":4042,"title":{},"content":{"723":{"position":[[1448,6]]}},"keywords":{}}],["integ",{"_index":2980,"title":{},"content":{"457":{"position":[[143,8]]},"898":{"position":[[1075,8]]},"1079":{"position":[[136,7]]},"1082":{"position":[[395,10]]},"1083":{"position":[[595,10]]},"1311":{"position":[[553,9]]}},"keywords":{}}],["integr",{"_index":255,"title":{"94":{"position":[[7,11]]},"222":{"position":[[7,11]]}},"content":{"15":{"position":[[261,9]]},"56":{"position":[[159,11]]},"72":{"position":[[58,9]]},"76":{"position":[[86,10]]},"94":{"position":[[47,9],[144,11]]},"107":{"position":[[100,11]]},"110":{"position":[[171,9]]},"118":{"position":[[255,11]]},"127":{"position":[[86,9]]},"148":{"position":[[163,11]]},"152":{"position":[[36,8]]},"165":{"position":[[275,10]]},"167":{"position":[[251,10]]},"172":{"position":[[70,10]]},"173":{"position":[[2161,11],[2237,9]]},"174":{"position":[[1385,10]]},"186":{"position":[[228,11]]},"187":{"position":[[72,9]]},"198":{"position":[[273,11]]},"222":{"position":[[53,9]]},"226":{"position":[[408,9]]},"230":{"position":[[113,11]]},"238":{"position":[[231,10]]},"240":{"position":[[293,9]]},"281":{"position":[[206,12]]},"284":{"position":[[8,11]]},"286":{"position":[[17,10]]},"289":{"position":[[476,11],[1237,11]]},"293":{"position":[[421,9]]},"310":{"position":[[371,10]]},"313":{"position":[[37,10]]},"339":{"position":[[195,9]]},"350":{"position":[[260,10]]},"353":{"position":[[569,9]]},"354":{"position":[[433,9],[921,12]]},"358":{"position":[[990,9]]},"366":{"position":[[220,10]]},"370":{"position":[[66,11]]},"375":{"position":[[878,8]]},"381":{"position":[[185,11]]},"383":{"position":[[200,9]]},"386":{"position":[[240,10]]},"404":{"position":[[537,9]]},"412":{"position":[[2515,9],[13774,10]]},"429":{"position":[[264,11]]},"445":{"position":[[1655,11],[1711,10]]},"447":{"position":[[181,11]]},"483":{"position":[[1,11]]},"491":{"position":[[1905,11]]},"501":{"position":[[141,10]]},"503":{"position":[[1,11]]},"504":{"position":[[1179,11]]},"510":{"position":[[169,11]]},"514":{"position":[[90,10]]},"520":{"position":[[437,10]]},"521":{"position":[[456,11]]},"522":{"position":[[16,11]]},"530":{"position":[[190,11],[540,10]]},"541":{"position":[[6,10]]},"542":{"position":[[64,10]]},"543":{"position":[[207,9]]},"551":{"position":[[423,9]]},"567":{"position":[[537,9],[763,11]]},"576":{"position":[[360,10]]},"591":{"position":[[536,11]]},"603":{"position":[[205,9]]},"619":{"position":[[318,12]]},"624":{"position":[[406,10]]},"632":{"position":[[921,11]]},"644":{"position":[[422,11]]},"668":{"position":[[354,11]]},"723":{"position":[[1016,10]]},"793":{"position":[[1233,12]]},"828":{"position":[[186,11],[364,11]]},"829":{"position":[[147,11]]},"830":{"position":[[93,11],[320,11]]},"831":{"position":[[275,9],[412,11]]},"832":{"position":[[322,11]]},"839":{"position":[[174,11]]},"912":{"position":[[196,10]]},"1284":{"position":[[49,9]]}},"keywords":{}}],["integrated.commun",{"_index":4801,"title":{},"content":{"839":{"position":[[984,20]]}},"keywords":{}}],["intel(r",{"_index":6399,"title":{},"content":{"1292":{"position":[[171,8]]}},"keywords":{}}],["intellect",{"_index":791,"title":{},"content":{"52":{"position":[[148,10]]},"539":{"position":[[148,10]]},"599":{"position":[[157,10]]}},"keywords":{}}],["intellig",{"_index":1046,"title":{},"content":{"108":{"position":[[85,13]]},"234":{"position":[[80,13]]},"289":{"position":[[164,13]]},"496":{"position":[[288,13]]},"500":{"position":[[601,11]]}},"keywords":{}}],["intend",{"_index":2731,"title":{},"content":{"412":{"position":[[8440,8]]},"430":{"position":[[594,6]]},"524":{"position":[[541,8]]},"535":{"position":[[283,8]]},"595":{"position":[[296,8]]},"617":{"position":[[834,8]]},"1159":{"position":[[152,8]]}},"keywords":{}}],["intens",{"_index":1397,"title":{},"content":{"216":{"position":[[342,9]]},"446":{"position":[[766,9],[851,9]]},"453":{"position":[[162,9]]},"576":{"position":[[423,9]]},"721":{"position":[[162,9]]}},"keywords":{}}],["intent",{"_index":2950,"title":{},"content":{"449":{"position":[[63,11]]},"829":{"position":[[330,12]]},"966":{"position":[[282,11]]}},"keywords":{}}],["intention",{"_index":2725,"title":{},"content":{"412":{"position":[[8079,14]]}},"keywords":{}}],["interact",{"_index":717,"title":{"782":{"position":[[51,12]]}},"content":{"46":{"position":[[538,12]]},"65":{"position":[[940,13]]},"70":{"position":[[241,13]]},"88":{"position":[[129,8]]},"90":{"position":[[310,11]]},"145":{"position":[[255,11]]},"156":{"position":[[295,11]]},"173":{"position":[[1502,8]]},"183":{"position":[[304,8]]},"217":{"position":[[263,11]]},"267":{"position":[[1619,11]]},"292":{"position":[[231,8]]},"320":{"position":[[248,13]]},"338":{"position":[[114,12]]},"375":{"position":[[423,11]]},"408":{"position":[[2773,11],[3248,13]]},"410":{"position":[[86,13]]},"415":{"position":[[81,12],[263,12]]},"421":{"position":[[939,12]]},"425":{"position":[[144,12]]},"477":{"position":[[29,11]]},"483":{"position":[[78,13]]},"486":{"position":[[264,8]]},"487":{"position":[[90,12]]},"491":{"position":[[971,12]]},"497":{"position":[[23,12]]},"498":{"position":[[595,12]]},"501":{"position":[[405,12]]},"502":{"position":[[486,8]]},"509":{"position":[[160,13]]},"516":{"position":[[167,8]]},"519":{"position":[[303,11]]},"571":{"position":[[275,11]]},"614":{"position":[[577,13]]},"624":{"position":[[738,11]]},"644":{"position":[[480,13]]},"656":{"position":[[139,11]]},"687":{"position":[[144,11]]},"688":{"position":[[669,11]]},"770":{"position":[[642,11]]},"778":{"position":[[41,12],[171,12]]},"782":{"position":[[35,11],[141,8],[417,12]]},"783":{"position":[[458,12]]},"784":{"position":[[79,12]]},"785":{"position":[[175,8]]},"801":{"position":[[487,12]]},"901":{"position":[[295,12]]},"1033":{"position":[[225,8]]},"1102":{"position":[[780,12]]},"1132":{"position":[[1023,12]]}},"keywords":{}}],["interaction.scal",{"_index":3293,"title":{},"content":{"534":{"position":[[553,24]]},"594":{"position":[[551,24]]}},"keywords":{}}],["interactions.complex",{"_index":6027,"title":{},"content":{"1132":{"position":[[548,20]]}},"keywords":{}}],["interactions.join",{"_index":3724,"title":{},"content":{"644":{"position":[[262,17]]}},"keywords":{}}],["intercept",{"_index":1088,"title":{},"content":{"129":{"position":[[353,10]]},"550":{"position":[[98,10]]}},"keywords":{}}],["interest",{"_index":2954,"title":{},"content":{"450":{"position":[[477,11]]},"463":{"position":[[1061,11]]},"781":{"position":[[441,10]]},"1324":{"position":[[1059,11]]}},"keywords":{}}],["interestingli",{"_index":6447,"title":{},"content":{"1294":{"position":[[1898,13]]}},"keywords":{}}],["interfac",{"_index":920,"title":{"352":{"position":[[27,11]]}},"content":{"65":{"position":[[999,10]]},"68":{"position":[[206,9]]},"73":{"position":[[62,11]]},"77":{"position":[[55,9]]},"90":{"position":[[173,10]]},"103":{"position":[[226,10]]},"136":{"position":[[245,9]]},"162":{"position":[[73,10]]},"173":{"position":[[986,9]]},"174":{"position":[[317,9]]},"185":{"position":[[327,9]]},"235":{"position":[[262,10]]},"270":{"position":[[194,11]]},"275":{"position":[[114,9],[266,10]]},"408":{"position":[[4120,9]]},"410":{"position":[[2166,9]]},"435":{"position":[[38,9]]},"502":{"position":[[833,9]]},"504":{"position":[[267,11]]},"507":{"position":[[170,9]]},"509":{"position":[[139,10]]},"514":{"position":[[397,11]]},"561":{"position":[[254,10]]},"634":{"position":[[169,9]]},"642":{"position":[[312,10]]},"707":{"position":[[266,10]]},"801":{"position":[[248,10]]},"835":{"position":[[356,10]]},"904":{"position":[[1631,10]]},"962":{"position":[[57,10],[73,9]]},"1225":{"position":[[356,9]]},"1263":{"position":[[250,9]]},"1272":{"position":[[208,10]]},"1274":{"position":[[429,10]]},"1279":{"position":[[816,10]]}},"keywords":{}}],["interfer",{"_index":6139,"title":{},"content":{"1175":{"position":[[706,9]]},"1313":{"position":[[187,9]]}},"keywords":{}}],["intermediari",{"_index":3237,"title":{},"content":{"504":{"position":[[1396,15]]}},"keywords":{}}],["intermitt",{"_index":1394,"title":{},"content":{"215":{"position":[[357,12]]},"375":{"position":[[737,12]]},"497":{"position":[[222,12]]},"723":{"position":[[2693,12]]}},"keywords":{}}],["intern",{"_index":1827,"title":{"1177":{"position":[[10,8]]},"1204":{"position":[[10,8]]}},"content":{"303":{"position":[[505,10]]},"316":{"position":[[448,11]]},"361":{"position":[[404,11]]},"412":{"position":[[4593,10]]},"703":{"position":[[458,8]]},"714":{"position":[[52,11]]},"721":{"position":[[435,10]]},"749":{"position":[[6392,8]]},"756":{"position":[[81,8]]},"805":{"position":[[64,8]]},"828":{"position":[[9,10]]},"854":{"position":[[1196,10]]},"886":{"position":[[4630,8]]},"898":{"position":[[1832,10]]},"932":{"position":[[523,10]]},"988":{"position":[[1892,10]]},"1080":{"position":[[1116,8]]},"1085":{"position":[[1024,8]]},"1095":{"position":[[108,11]]},"1105":{"position":[[256,10],[907,10]]},"1121":{"position":[[47,8]]},"1124":{"position":[[1201,10]]},"1154":{"position":[[106,8]]},"1177":{"position":[[43,8],[589,8]]},"1204":{"position":[[43,8]]},"1213":{"position":[[51,10]]},"1246":{"position":[[887,10]]}},"keywords":{}}],["internalindex",{"_index":5842,"title":{},"content":{"1080":{"position":[[1011,15],[1088,15]]},"1107":{"position":[[480,15],[1047,15]]}},"keywords":{}}],["internet",{"_index":704,"title":{},"content":{"46":{"position":[[77,8]]},"65":{"position":[[714,8]]},"69":{"position":[[212,8]]},"88":{"position":[[87,8]]},"157":{"position":[[105,8]]},"164":{"position":[[232,8]]},"173":{"position":[[1588,8]]},"183":{"position":[[129,8]]},"191":{"position":[[100,8]]},"212":{"position":[[57,8]]},"215":{"position":[[233,8]]},"274":{"position":[[156,8]]},"280":{"position":[[272,8]]},"292":{"position":[[287,8]]},"309":{"position":[[226,8]]},"322":{"position":[[282,8]]},"375":{"position":[[138,8]]},"380":{"position":[[101,8]]},"400":{"position":[[811,9]]},"407":{"position":[[586,8]]},"408":{"position":[[2168,8]]},"410":{"position":[[1043,8],[1436,8]]},"419":{"position":[[395,8]]},"446":{"position":[[417,9]]},"462":{"position":[[593,8]]},"489":{"position":[[695,8]]},"516":{"position":[[228,8]]},"534":{"position":[[278,8]]},"565":{"position":[[249,8]]},"574":{"position":[[254,8]]},"582":{"position":[[114,9]]},"594":{"position":[[276,8]]},"699":{"position":[[372,8]]},"723":{"position":[[2712,8]]},"1141":{"position":[[288,8]]},"1207":{"position":[[144,8]]},"1316":{"position":[[446,8]]}},"keywords":{}}],["internetexplor",{"_index":6473,"title":{},"content":{"1301":{"position":[[983,16]]}},"keywords":{}}],["interop",{"_index":836,"title":{},"content":{"55":{"position":[[340,9]]},"1118":{"position":[[460,9]]}},"keywords":{}}],["interrupt",{"_index":2072,"title":{},"content":{"358":{"position":[[1047,11]]},"392":{"position":[[2332,12]]},"616":{"position":[[492,12]]}},"keywords":{}}],["interv",{"_index":3551,"title":{},"content":{"610":{"position":[[301,10]]},"632":{"position":[[426,9]]},"875":{"position":[[9208,9]]},"996":{"position":[[402,8]]},"1164":{"position":[[1072,9]]}},"keywords":{}}],["intervalid",{"_index":3605,"title":{},"content":{"612":{"position":[[2210,10]]}},"keywords":{}}],["intervent",{"_index":1239,"title":{},"content":{"185":{"position":[[352,13]]},"487":{"position":[[480,13]]},"515":{"position":[[119,12]]},"690":{"position":[[425,12]]}},"keywords":{}}],["intric",{"_index":2017,"title":{},"content":{"354":{"position":[[241,9]]},"426":{"position":[[88,9]]},"1132":{"position":[[707,9]]}},"keywords":{}}],["intricaci",{"_index":2909,"title":{},"content":{"433":{"position":[[614,11]]},"521":{"position":[[181,9]]}},"keywords":{}}],["intrigu",{"_index":2908,"title":{},"content":{"433":{"position":[[9,10]]}},"keywords":{}}],["intrins",{"_index":6085,"title":{},"content":{"1150":{"position":[[178,13]]}},"keywords":{}}],["introduc",{"_index":1066,"title":{"118":{"position":[[0,11]]},"153":{"position":[[0,11]]},"179":{"position":[[0,11]]},"271":{"position":[[0,11]]},"322":{"position":[[0,11]]},"445":{"position":[[0,11]]},"479":{"position":[[0,11]]},"501":{"position":[[0,11]]},"513":{"position":[[0,11]]},"575":{"position":[[0,11]]}},"content":{"159":{"position":[[6,10]]},"185":{"position":[[6,10]]},"233":{"position":[[6,10]]},"277":{"position":[[6,10]]},"289":{"position":[[1611,10]]},"303":{"position":[[1333,10]]},"356":{"position":[[97,10]]},"377":{"position":[[30,10]]},"408":{"position":[[464,10]]},"411":{"position":[[3397,10],[3827,10]]},"412":{"position":[[14951,9]]},"427":{"position":[[779,10]]},"450":{"position":[[20,10]]},"452":{"position":[[21,10],[459,11]]},"455":{"position":[[22,10]]},"504":{"position":[[746,10]]},"508":{"position":[[6,10]]},"509":{"position":[[6,10]]},"518":{"position":[[65,10]]},"610":{"position":[[757,9]]},"699":{"position":[[267,10]]},"802":{"position":[[149,10]]},"836":{"position":[[1676,9]]},"1198":{"position":[[1168,10]]},"1294":{"position":[[38,10]]}},"keywords":{}}],["introduction.a",{"_index":3382,"title":{},"content":{"557":{"position":[[61,14]]}},"keywords":{}}],["introduction.check",{"_index":3331,"title":{},"content":{"548":{"position":[[61,18]]},"608":{"position":[[61,18]]}},"keywords":{}}],["intuit",{"_index":1037,"title":{},"content":{"104":{"position":[[179,10]]},"120":{"position":[[233,9]]},"181":{"position":[[133,9]]},"223":{"position":[[229,9]]},"231":{"position":[[238,9]]},"353":{"position":[[171,9]]},"364":{"position":[[602,9]]},"521":{"position":[[601,9]]},"560":{"position":[[682,9]]},"1009":{"position":[[28,9]]}},"keywords":{}}],["invalid",{"_index":4185,"title":{},"content":{"749":{"position":[[3940,7],[4012,7],[4127,7],[4542,7],[6228,7],[6483,7]]},"838":{"position":[[1023,7]]},"907":{"position":[[114,7],[241,7]]},"1084":{"position":[[491,7]]}},"keywords":{}}],["invalu",{"_index":1583,"title":{},"content":{"261":{"position":[[122,10]]},"289":{"position":[[1811,10]]},"361":{"position":[[135,10]]},"504":{"position":[[1443,10]]},"548":{"position":[[439,10]]},"608":{"position":[[437,10]]}},"keywords":{}}],["inventori",{"_index":2710,"title":{},"content":{"412":{"position":[[6429,9]]}},"keywords":{}}],["invest",{"_index":2646,"title":{},"content":{"411":{"position":[[5660,6]]}},"keywords":{}}],["invok",{"_index":4498,"title":{},"content":{"759":{"position":[[1539,8]]}},"keywords":{}}],["involv",{"_index":2304,"title":{"1313":{"position":[[37,9]]}},"content":{"394":{"position":[[262,8]]},"412":{"position":[[3667,7]]},"415":{"position":[[276,7]]},"564":{"position":[[80,8]]},"612":{"position":[[856,8]]},"620":{"position":[[107,8]]},"688":{"position":[[656,7]]},"1313":{"position":[[919,9]]}},"keywords":{}}],["inwork",{"_index":6024,"title":{},"content":{"1130":{"position":[[381,9]]}},"keywords":{}}],["inworker=tru",{"_index":6023,"title":{},"content":{"1130":{"position":[[300,13]]}},"keywords":{}}],["io",{"_index":175,"title":{},"content":{"11":{"position":[[960,3]]},"36":{"position":[[56,4]]},"177":{"position":[[146,3]]},"269":{"position":[[286,4]]},"287":{"position":[[1175,3]]},"298":{"position":[[719,3]]},"299":{"position":[[592,5],[649,3],[711,3],[877,3],[925,3],[935,3],[1544,3]]},"371":{"position":[[147,3]]},"408":{"position":[[1199,4]]},"445":{"position":[[2252,3]]},"446":{"position":[[1363,3]]},"618":{"position":[[85,4]]},"640":{"position":[[365,4]]},"660":{"position":[[503,3]]},"661":{"position":[[618,3]]},"662":{"position":[[1324,3]]},"1270":{"position":[[404,4]]},"1278":{"position":[[68,4]]},"1279":{"position":[[48,3]]}},"keywords":{}}],["ionic",{"_index":877,"title":{"268":{"position":[[0,5]]},"269":{"position":[[9,5]]},"270":{"position":[[32,5]]},"271":{"position":[[47,5]]},"284":{"position":[[17,5]]},"290":{"position":[[27,5]]},"307":{"position":[[13,5]]},"308":{"position":[[13,5]]},"317":{"position":[[15,5]]}},"content":{"59":{"position":[[248,7]]},"269":{"position":[[1,5],[12,5]]},"271":{"position":[[78,5]]},"278":{"position":[[245,5]]},"280":{"position":[[455,5]]},"284":{"position":[[30,5]]},"285":{"position":[[350,5]]},"286":{"position":[[161,5]]},"287":{"position":[[1292,6]]},"290":{"position":[[50,5]]},"296":{"position":[[18,5]]},"309":{"position":[[168,5]]},"310":{"position":[[339,5]]},"312":{"position":[[92,5]]},"313":{"position":[[64,5],[117,6]]},"314":{"position":[[57,6]]},"317":{"position":[[1,5]]},"318":{"position":[[5,5],[587,5]]},"479":{"position":[[351,7]]},"546":{"position":[[292,6]]},"631":{"position":[[182,7]]}},"keywords":{}}],["ionicsecur",{"_index":3788,"title":{},"content":{"661":{"position":[[351,11]]}},"keywords":{}}],["iosdatabaseloc",{"_index":178,"title":{},"content":{"11":{"position":[[1038,20]]}},"keywords":{}}],["iot",{"_index":5248,"title":{},"content":{"902":{"position":[[928,3]]}},"keywords":{}}],["ipado",{"_index":1753,"title":{},"content":{"299":{"position":[[734,7]]}},"keywords":{}}],["ipc",{"_index":6289,"title":{},"content":{"1246":{"position":[[940,4]]}},"keywords":{}}],["ipchandl",{"_index":4009,"title":{},"content":{"711":{"position":[[1684,10]]}},"keywords":{}}],["ipcmain",{"_index":3922,"title":{"693":{"position":[[33,8]]}},"content":{"693":{"position":[[966,8]]},"710":{"position":[[1383,7]]},"1246":{"position":[[2017,8]]}},"keywords":{}}],["ipcmain.handle('db",{"_index":4005,"title":{},"content":{"711":{"position":[[1486,18]]}},"keywords":{}}],["ipcrender",{"_index":3921,"title":{"693":{"position":[[19,11]]}},"content":{"693":{"position":[[1255,12]]},"710":{"position":[[1365,11]]},"711":{"position":[[480,11],[1418,11]]},"1214":{"position":[[426,12]]},"1246":{"position":[[1999,11]]}},"keywords":{}}],["ipcrenderer.invoke('db",{"_index":4010,"title":{},"content":{"711":{"position":[[1743,22]]}},"keywords":{}}],["iron",{"_index":789,"title":{},"content":{"52":{"position":[[115,5],[427,5]]},"412":{"position":[[10423,4]]},"539":{"position":[[115,5],[427,5]]},"599":{"position":[[124,5],[454,5]]}},"keywords":{}}],["ironman",{"_index":802,"title":{},"content":{"52":{"position":[[373,7]]},"539":{"position":[[373,7]]},"599":{"position":[[400,7]]}},"keywords":{}}],["irrespect",{"_index":916,"title":{},"content":{"65":{"position":[[692,12]]},"173":{"position":[[1566,12]]}},"keywords":{}}],["isdevmod",{"_index":3848,"title":{},"content":{"673":{"position":[[10,9],[75,14]]}},"keywords":{}}],["isequ",{"_index":2690,"title":{},"content":{"412":{"position":[[4522,9],[4650,9]]},"691":{"position":[[239,8]]},"1309":{"position":[[576,9]]}},"keywords":{}}],["isequal(a",{"_index":2691,"title":{},"content":{"412":{"position":[[4628,10]]},"1309":{"position":[[554,10]]}},"keywords":{}}],["isexhaust",{"_index":3270,"title":{},"content":{"523":{"position":[[497,12],[748,13]]}},"keywords":{}}],["isfetch",{"_index":3268,"title":{},"content":{"523":{"position":[[474,11],[578,12]]}},"keywords":{}}],["isn't",{"_index":1936,"title":{},"content":{"333":{"position":[[82,5]]},"347":{"position":[[576,5]]},"362":{"position":[[1647,5]]},"412":{"position":[[7520,5]]}},"keywords":{}}],["isnam",{"_index":5672,"title":{},"content":{"1039":{"position":[[188,7],[247,6],[347,6],[421,6]]}},"keywords":{}}],["isn’t",{"_index":1734,"title":{},"content":{"299":{"position":[[87,5]]},"473":{"position":[[96,5]]}},"keywords":{}}],["isol",{"_index":6484,"title":{},"content":{"1304":{"position":[[117,9],[602,10]]}},"keywords":{}}],["ispaus",{"_index":5533,"title":{"1001":{"position":[[0,11]]}},"content":{},"keywords":{}}],["ispeervalid",{"_index":5265,"title":{},"content":{"907":{"position":[[165,13],[316,12]]}},"keywords":{}}],["isrxcollect",{"_index":5384,"title":{"957":{"position":[[0,15]]}},"content":{},"keywords":{}}],["isrxcollection(myobj",{"_index":5385,"title":{},"content":{"957":{"position":[[100,22]]}},"keywords":{}}],["isrxdatabas",{"_index":5423,"title":{"978":{"position":[[0,13]]}},"content":{"978":{"position":[[96,12]]}},"keywords":{}}],["isrxdatabase(myobj",{"_index":5424,"title":{},"content":{"978":{"position":[[135,20]]}},"keywords":{}}],["isrxdocu",{"_index":5733,"title":{"1053":{"position":[[0,13]]}},"content":{},"keywords":{}}],["isrxdocument(myobj",{"_index":5734,"title":{},"content":{"1053":{"position":[[98,20]]}},"keywords":{}}],["isrxqueri",{"_index":5790,"title":{"1070":{"position":[[0,10]]}},"content":{},"keywords":{}}],["isrxquery(myobj",{"_index":5791,"title":{},"content":{"1070":{"position":[[95,17]]}},"keywords":{}}],["isstop",{"_index":5530,"title":{"1000":{"position":[[0,12]]}},"content":{},"keywords":{}}],["issu",{"_index":409,"title":{},"content":{"24":{"position":[[706,6]]},"28":{"position":[[748,7]]},"61":{"position":[[220,7]]},"76":{"position":[[151,7]]},"250":{"position":[[85,6]]},"304":{"position":[[302,6]]},"358":{"position":[[199,6],[878,6]]},"395":{"position":[[28,6]]},"411":{"position":[[4470,5]]},"412":{"position":[[1540,5],[6474,6],[14978,6]]},"483":{"position":[[961,5]]},"567":{"position":[[487,7]]},"617":{"position":[[1698,6]]},"644":{"position":[[345,7]]},"668":{"position":[[264,5]]},"836":{"position":[[1728,7]]},"1198":{"position":[[694,6],[758,5],[876,6]]}},"keywords":{}}],["issuessearch",{"_index":4134,"title":{},"content":{"749":{"position":[[70,12],[417,12],[544,12],[635,12],[788,12],[925,12],[1060,12],[1284,12],[1372,12],[1521,12],[1624,12],[1721,12],[1838,12],[1964,12],[2067,12],[2173,12],[2267,12],[2360,12],[2445,12],[2562,12],[2803,12],[2916,12],[3149,12],[3269,12],[3625,12],[3822,12],[3909,12],[3981,12],[4096,12],[4212,12],[4334,12],[4511,12],[4585,12],[4692,12],[4827,12],[4959,12],[5111,12],[5213,12],[5325,12],[5532,12],[6040,12],[6176,12],[6312,12],[6431,12],[6573,12],[6685,12],[6800,12],[6924,12],[7032,12],[7151,12],[7275,12],[7458,12],[7538,12],[7615,12],[7714,12],[7818,12],[7913,12],[8013,12],[8107,12],[8205,12],[8313,12],[8408,12],[8508,12],[8630,12],[8707,12],[8881,12],[9031,12],[9189,12],[9480,12],[9625,12],[9709,12],[9797,12],[9904,12],[10018,12],[10136,12],[10245,12],[10350,12],[10438,12],[10561,12],[10665,12],[10771,12],[10862,12],[10944,12],[11082,12],[11223,12],[11334,12],[11433,12],[11509,12],[11654,12],[11751,12],[11860,12],[12161,12],[12252,12],[12379,12],[12460,12],[12533,12],[12748,12],[12857,12],[12934,12],[13043,12],[13160,12],[13234,12],[13354,12],[13483,12],[13606,12],[13729,12],[13827,12],[13971,12],[14054,12],[14148,12],[14260,12],[14345,12],[14541,12],[14623,12],[14738,12],[14894,12],[15105,12],[15264,12],[15439,12],[15571,12],[15705,12],[15837,12],[15972,12],[16074,12],[16222,12],[16341,12],[16463,12],[16612,12],[16805,12],[16894,12],[17000,12],[17123,12],[17272,12],[17381,12],[17497,12],[17615,12],[17738,12],[17847,12],[17968,12],[18090,12],[18187,12],[18287,12],[18469,12],[18563,12],[18682,12],[18786,12],[18892,12],[18995,12],[19089,12],[19291,12],[19419,12],[19545,12],[19660,12],[19761,12],[19853,12],[19977,12],[20095,12],[20252,12],[20418,12],[20519,12],[20686,12],[20823,12],[20996,12],[21280,12],[21434,12],[21697,12],[21999,12],[22119,12],[22203,12],[22321,12],[22428,12],[22548,12],[22688,12],[22817,12],[22977,12],[23170,12],[23296,12],[23428,12],[23561,12],[23752,12],[23934,12],[24054,12],[24215,12],[24345,12],[24425,12]]}},"keywords":{}}],["it'",{"_index":531,"title":{},"content":{"34":{"position":[[248,4]]},"47":{"position":[[315,4]]},"51":{"position":[[898,4]]},"66":{"position":[[84,4]]},"117":{"position":[[142,4]]},"147":{"position":[[69,4]]},"151":{"position":[[311,4]]},"178":{"position":[[150,4]]},"253":{"position":[[235,4]]},"267":{"position":[[1471,4]]},"271":{"position":[[97,4]]},"287":{"position":[[801,4]]},"365":{"position":[[1406,4]]},"388":{"position":[[280,4]]},"392":{"position":[[2117,4],[2317,4]]},"396":{"position":[[1718,4]]},"401":{"position":[[614,4]]},"408":{"position":[[2824,4]]},"412":{"position":[[63,4],[6102,4],[6774,4],[8711,4],[8821,4],[12197,4]]},"430":{"position":[[544,4]]},"432":{"position":[[82,4],[508,4]]},"433":{"position":[[322,4]]},"436":{"position":[[299,4]]},"446":{"position":[[122,4],[937,4]]},"497":{"position":[[615,4]]},"613":{"position":[[517,4]]},"721":{"position":[[78,4]]},"889":{"position":[[1,4]]},"912":{"position":[[313,4]]},"966":{"position":[[98,4]]},"1085":{"position":[[1542,4]]},"1294":{"position":[[1279,4]]}},"keywords":{}}],["it.serv",{"_index":3667,"title":{},"content":{"622":{"position":[[199,9]]}},"keywords":{}}],["item",{"_index":1356,"title":{},"content":{"209":{"position":[[1057,5]]},"259":{"position":[[27,6],[53,6]]},"302":{"position":[[518,5]]},"353":{"position":[[723,7]]},"358":{"position":[[367,5]]},"390":{"position":[[1342,5],[1429,5]]},"392":{"position":[[437,5],[552,6],[882,5],[1029,5],[1115,5],[1664,6],[2447,5]]},"396":{"position":[[162,5],[908,5],[972,5]]},"475":{"position":[[186,6]]},"493":{"position":[[511,5]]},"749":{"position":[[16943,6],[17074,5]]},"808":{"position":[[660,6]]},"813":{"position":[[183,6]]},"858":{"position":[[390,6]]},"1080":{"position":[[645,6]]},"1316":{"position":[[832,5]]},"1324":{"position":[[1014,4]]}},"keywords":{}}],["item.syncen",{"_index":4889,"title":{},"content":{"858":{"position":[[403,16]]}},"keywords":{}}],["itemscollect",{"_index":2229,"title":{},"content":{"392":{"position":[[737,15]]}},"keywords":{}}],["itemscollection.addpipelin",{"_index":2244,"title":{},"content":{"392":{"position":[[2635,29],[4541,29]]},"397":{"position":[[1760,29]]}},"keywords":{}}],["itemscollection.bulkinsert",{"_index":2235,"title":{},"content":{"392":{"position":[[1087,27]]}},"keywords":{}}],["itemscollection.count().exec",{"_index":2232,"title":{},"content":{"392":{"position":[[939,31]]}},"keywords":{}}],["items—id",{"_index":3386,"title":{},"content":{"559":{"position":[[127,11]]}},"keywords":{}}],["iter",{"_index":2886,"title":{"984":{"position":[[11,10]]}},"content":{"427":{"position":[[981,7]]},"452":{"position":[[309,7]]},"626":{"position":[[695,9],[749,7],[1027,9]]},"818":{"position":[[190,8]]},"875":{"position":[[1589,7],[6598,9],[8883,9]]},"984":{"position":[[89,9],[504,9]]},"985":{"position":[[409,10],[698,9]]},"988":{"position":[[6020,10]]},"996":{"position":[[68,9]]},"1295":{"position":[[1114,9]]},"1296":{"position":[[155,7],[187,9],[1156,7]]}},"keywords":{}}],["itrxstorag",{"_index":2936,"title":{},"content":{"442":{"position":[[104,11]]}},"keywords":{}}],["itself",{"_index":364,"title":{},"content":{"22":{"position":[[19,6]]},"40":{"position":[[292,6]]},"188":{"position":[[171,6]]},"230":{"position":[[84,7]]},"304":{"position":[[340,6]]},"392":{"position":[[1482,7]]},"411":{"position":[[868,6]]},"458":{"position":[[640,6]]},"535":{"position":[[17,6]]},"595":{"position":[[17,6]]},"627":{"position":[[305,6]]},"697":{"position":[[289,6]]},"703":{"position":[[762,7]]},"716":{"position":[[23,6],[179,7],[291,6]]},"723":{"position":[[1956,6]]},"772":{"position":[[254,6]]},"797":{"position":[[44,6]]},"800":{"position":[[328,7]]},"829":{"position":[[159,7],[1064,6]]},"835":{"position":[[590,7]]},"836":{"position":[[289,6]]},"856":{"position":[[183,6]]},"981":{"position":[[488,7]]},"988":{"position":[[806,7]]},"1004":{"position":[[61,7]]},"1067":{"position":[[102,7]]},"1088":{"position":[[152,6]]},"1095":{"position":[[246,7]]},"1162":{"position":[[746,6]]},"1165":{"position":[[27,6]]},"1210":{"position":[[20,6]]},"1250":{"position":[[331,6]]},"1316":{"position":[[3345,7]]}},"keywords":{}}],["it’",{"_index":2052,"title":{},"content":{"357":{"position":[[491,4]]},"360":{"position":[[659,4]]},"479":{"position":[[105,4]]},"482":{"position":[[29,4]]},"559":{"position":[[91,4]]},"560":{"position":[[31,4]]},"567":{"position":[[1148,4]]}},"keywords":{}}],["jaccard",{"_index":2293,"title":{},"content":{"393":{"position":[[276,7]]}},"keywords":{}}],["jan",{"_index":268,"title":{},"content":{"16":{"position":[[11,3]]}},"keywords":{}}],["javascript",{"_index":7,"title":{"12":{"position":[[40,10]]},"76":{"position":[[8,11],[34,10]]},"94":{"position":[[24,10]]},"107":{"position":[[8,11],[34,10]]},"207":{"position":[[20,10]]},"213":{"position":[[5,10]]},"222":{"position":[[24,10]]},"230":{"position":[[8,11],[34,10]]},"254":{"position":[[23,10]]},"359":{"position":[[34,10]]},"363":{"position":[[25,10]]},"374":{"position":[[69,10]]},"378":{"position":[[26,10]]},"389":{"position":[[55,10]]},"426":{"position":[[24,10]]},"431":{"position":[[47,11]]},"513":{"position":[[22,10]]},"900":{"position":[[77,10]]},"903":{"position":[[52,10]]},"1088":{"position":[[13,10]]},"1254":{"position":[[0,10]]},"1282":{"position":[[28,10]]}},"content":{"1":{"position":[[79,10]]},"13":{"position":[[50,10],[161,10]]},"15":{"position":[[61,10],[292,10]]},"16":{"position":[[94,10]]},"17":{"position":[[49,10],[151,10]]},"24":{"position":[[16,10]]},"27":{"position":[[57,10]]},"28":{"position":[[13,10],[361,10],[433,10]]},"29":{"position":[[10,10]]},"30":{"position":[[13,10],[168,10],[322,10]]},"34":{"position":[[168,10]]},"35":{"position":[[26,10]]},"36":{"position":[[129,11]]},"42":{"position":[[53,10]]},"45":{"position":[[26,10]]},"76":{"position":[[16,10],[45,10]]},"83":{"position":[[171,10]]},"94":{"position":[[70,10]]},"104":{"position":[[82,11]]},"105":{"position":[[37,10]]},"107":{"position":[[27,11],[53,10],[117,10]]},"116":{"position":[[23,10]]},"155":{"position":[[24,10]]},"173":{"position":[[2178,10],[2271,10]]},"174":{"position":[[11,10],[1208,11],[1234,10],[1283,11],[1317,10],[1412,10],[1480,10]]},"179":{"position":[[85,10]]},"188":{"position":[[47,11],[146,10],[453,10],[575,10],[1544,10],[1630,10],[2453,10],[2580,10]]},"207":{"position":[[59,10]]},"222":{"position":[[87,10]]},"228":{"position":[[467,10]]},"229":{"position":[[29,10]]},"230":{"position":[[36,10],[73,10],[130,10],[214,10]]},"231":{"position":[[109,10],[134,10]]},"241":{"position":[[587,10]]},"254":{"position":[[61,11]]},"269":{"position":[[88,11]]},"281":{"position":[[35,11]]},"284":{"position":[[166,10]]},"286":{"position":[[41,10]]},"304":{"position":[[312,10]]},"362":{"position":[[819,10]]},"364":{"position":[[1,10],[26,11]]},"371":{"position":[[191,10]]},"373":{"position":[[613,10]]},"378":{"position":[[99,10]]},"387":{"position":[[78,10]]},"392":{"position":[[3262,10]]},"396":{"position":[[1550,11]]},"408":{"position":[[3887,10],[4024,10],[4893,11]]},"412":{"position":[[9679,11]]},"429":{"position":[[65,10]]},"437":{"position":[[158,10]]},"438":{"position":[[54,10]]},"440":{"position":[[10,10],[234,10],[439,10]]},"445":{"position":[[152,11],[210,12]]},"451":{"position":[[587,10]]},"454":{"position":[[426,11]]},"458":{"position":[[200,10]]},"460":{"position":[[89,10],[525,10],[583,10],[1329,10]]},"461":{"position":[[476,10]]},"468":{"position":[[89,10]]},"479":{"position":[[37,10],[470,10]]},"513":{"position":[[18,10]]},"514":{"position":[[54,10]]},"569":{"position":[[1305,10]]},"610":{"position":[[886,10]]},"611":{"position":[[609,10]]},"612":{"position":[[1075,11]]},"631":{"position":[[11,10]]},"655":{"position":[[181,10]]},"662":{"position":[[46,10],[624,10]]},"688":{"position":[[473,10]]},"699":{"position":[[798,10],[813,10]]},"703":{"position":[[147,10],[1142,10]]},"705":{"position":[[439,10]]},"707":{"position":[[101,10],[455,10]]},"710":{"position":[[32,10],[566,10]]},"711":{"position":[[1033,10]]},"732":{"position":[[34,10]]},"740":{"position":[[140,10]]},"743":{"position":[[132,10]]},"749":{"position":[[1479,10],[8804,10]]},"773":{"position":[[153,10]]},"776":{"position":[[155,10]]},"800":{"position":[[216,10],[317,10]]},"801":{"position":[[192,10]]},"817":{"position":[[6,11]]},"818":{"position":[[40,10]]},"821":{"position":[[389,10]]},"835":{"position":[[306,10]]},"837":{"position":[[16,10]]},"838":{"position":[[46,10],[1270,10]]},"872":{"position":[[44,10]]},"904":{"position":[[544,10]]},"908":{"position":[[245,10]]},"958":{"position":[[89,10],[293,10]]},"962":{"position":[[404,10]]},"964":{"position":[[88,10]]},"968":{"position":[[166,10],[362,10]]},"979":{"position":[[125,10]]},"1020":{"position":[[243,10]]},"1030":{"position":[[11,10]]},"1072":{"position":[[801,10],[1377,10]]},"1085":{"position":[[111,10]]},"1088":{"position":[[364,10]]},"1089":{"position":[[228,10]]},"1102":{"position":[[218,10]]},"1105":{"position":[[25,10]]},"1106":{"position":[[27,10]]},"1115":{"position":[[74,10],[582,10]]},"1117":{"position":[[530,10]]},"1118":{"position":[[161,10]]},"1162":{"position":[[42,10],[353,10]]},"1164":{"position":[[1003,10]]},"1171":{"position":[[59,10]]},"1181":{"position":[[108,10],[440,10]]},"1183":{"position":[[102,10],[437,10]]},"1191":{"position":[[147,10]]},"1203":{"position":[[35,10]]},"1214":{"position":[[88,10],[166,10]]},"1225":{"position":[[23,10]]},"1227":{"position":[[48,10],[478,10]]},"1230":{"position":[[169,10]]},"1238":{"position":[[275,10]]},"1241":{"position":[[70,10]]},"1246":{"position":[[819,10]]},"1252":{"position":[[75,11]]},"1265":{"position":[[41,10],[472,10]]},"1267":{"position":[[155,10]]},"1270":{"position":[[177,10]]},"1282":{"position":[[6,10]]},"1292":{"position":[[804,10]]},"1300":{"position":[[110,10],[827,10]]},"1301":{"position":[[651,10],[1505,10]]},"1309":{"position":[[42,10]]},"1315":{"position":[[1054,10]]},"1324":{"position":[[386,11]]}},"keywords":{}}],["javascript"",{"_index":1528,"title":{},"content":{"244":{"position":[[1576,16]]}},"keywords":{}}],["javascript'",{"_index":1036,"title":{},"content":{"104":{"position":[[94,12]]},"174":{"position":[[589,12],[1355,12]]},"179":{"position":[[296,12]]},"364":{"position":[[170,12]]}},"keywords":{}}],["javascript/dist/index.j",{"_index":1265,"title":{},"content":{"188":{"position":[[1788,24],[1943,24]]}},"keywords":{}}],["jd1",{"_index":4307,"title":{},"content":{"749":{"position":[[13261,3]]}},"keywords":{}}],["jd2",{"_index":4308,"title":{},"content":{"749":{"position":[[13381,3]]}},"keywords":{}}],["jd3",{"_index":4310,"title":{},"content":{"749":{"position":[[13510,3]]}},"keywords":{}}],["jetstream",{"_index":4922,"title":{},"content":{"865":{"position":[[65,9]]}},"keywords":{}}],["jevon",{"_index":2580,"title":{},"content":{"409":{"position":[[1,7]]}},"keywords":{}}],["jinaai/jina",{"_index":2458,"title":{},"content":{"401":{"position":[[318,11],[365,11],[412,11]]}},"keywords":{}}],["john",{"_index":5799,"title":{},"content":{"1072":{"position":[[2358,5],[2385,5],[2518,5],[2690,6]]}},"keywords":{}}],["john_do",{"_index":2871,"title":{},"content":{"425":{"position":[[309,12]]}},"keywords":{}}],["join",{"_index":1326,"title":{},"content":{"205":{"position":[[207,6]]},"210":{"position":[[647,5]]},"252":{"position":[[79,6]]},"261":{"position":[[1053,7]]},"263":{"position":[[417,4]]},"306":{"position":[[260,4]]},"352":{"position":[[189,5]]},"354":{"position":[[251,5],[785,5]]},"412":{"position":[[13586,4],[13949,4],[13966,4],[14169,4],[14449,5]]},"422":{"position":[[178,4]]},"483":{"position":[[871,4]]},"705":{"position":[[530,5],[733,6]]},"824":{"position":[[360,4]]},"898":{"position":[[3712,6]]},"899":{"position":[[422,4]]},"902":{"position":[[188,4]]},"905":{"position":[[130,4]]},"1071":{"position":[[282,7]]},"1315":{"position":[[429,4]]},"1317":{"position":[[781,4]]}},"keywords":{}}],["joins.requir",{"_index":2009,"title":{},"content":{"353":{"position":[[358,13]]}},"keywords":{}}],["journey",{"_index":1076,"title":{},"content":{"119":{"position":[[14,7]]}},"keywords":{}}],["journeyapp",{"_index":687,"title":{},"content":{"43":{"position":[[694,11]]}},"keywords":{}}],["jqueri",{"_index":1913,"title":{"319":{"position":[[24,6]]},"320":{"position":[[0,6]]},"321":{"position":[[27,6]]},"331":{"position":[[15,6]]},"332":{"position":[[16,6]]},"335":{"position":[[22,7]]},"346":{"position":[[33,6]]}},"content":{"320":{"position":[[1,6],[198,6]]},"321":{"position":[[21,6]]},"323":{"position":[[554,6]]},"326":{"position":[[124,6]]},"327":{"position":[[94,6]]},"329":{"position":[[186,6]]},"330":{"position":[[14,6]]},"331":{"position":[[15,6]]},"335":{"position":[[73,6],[140,6],[925,6]]},"338":{"position":[[43,6]]},"342":{"position":[[150,6]]},"346":{"position":[[572,6]]},"347":{"position":[[569,6]]},"362":{"position":[[1640,6]]}},"keywords":{}}],["jquery.offlin",{"_index":1921,"title":{},"content":{"323":{"position":[[146,14]]}},"keywords":{}}],["js",{"_index":1262,"title":{},"content":{"188":{"position":[[1683,3]]},"291":{"position":[[466,2]]},"315":{"position":[[38,2],[150,2],[246,4]]},"412":{"position":[[9729,2],[9820,3]]},"426":{"position":[[7,2]]},"427":{"position":[[169,2]]},"452":{"position":[[767,2]]},"482":{"position":[[375,4],[444,2]]},"551":{"position":[[455,2]]},"553":{"position":[[115,2]]},"554":{"position":[[600,4]]},"564":{"position":[[311,4]]},"638":{"position":[[305,4]]},"717":{"position":[[76,2],[135,2],[334,2],[633,4]]},"865":{"position":[[270,2]]},"896":{"position":[[366,2]]},"897":{"position":[[96,2]]},"898":{"position":[[61,2],[3023,4]]},"1237":{"position":[[729,4]]},"1266":{"position":[[888,6]]}},"keywords":{}}],["js/typescript",{"_index":681,"title":{},"content":{"43":{"position":[[541,14]]}},"keywords":{}}],["jsfiddl",{"_index":1864,"title":{},"content":{"304":{"position":[[412,8]]}},"keywords":{}}],["json",{"_index":217,"title":{"73":{"position":[[6,4]]},"104":{"position":[[6,4]]},"141":{"position":[[0,4]]},"169":{"position":[[0,4]]},"197":{"position":[[0,4]]},"231":{"position":[[6,6]]},"345":{"position":[[0,4]]},"348":{"position":[[0,4]]},"349":{"position":[[4,4]]},"355":{"position":[[8,4]]},"356":{"position":[[0,4]]},"357":{"position":[[8,4]]},"358":{"position":[[0,4],[32,4]]},"359":{"position":[[8,4]]},"361":{"position":[[9,4]]},"363":{"position":[[7,4]]},"364":{"position":[[13,4]]},"365":{"position":[[31,4]]},"366":{"position":[[24,4]]},"368":{"position":[[6,4]]},"369":{"position":[[5,4]]},"371":{"position":[[14,4]]},"372":{"position":[[18,4]]},"426":{"position":[[40,4]]},"457":{"position":[[16,4]]},"508":{"position":[[0,4]]},"528":{"position":[[0,4]]},"588":{"position":[[0,4]]},"1288":{"position":[[15,4]]}},"content":{"14":{"position":[[523,4]]},"20":{"position":[[55,4]]},"34":{"position":[[25,4],[214,4]]},"73":{"position":[[7,4]]},"104":{"position":[[21,4],[126,4]]},"141":{"position":[[72,4]]},"169":{"position":[[61,4],[121,4]]},"170":{"position":[[436,4]]},"174":{"position":[[441,4],[485,6],[621,4],[833,4]]},"197":{"position":[[72,4]]},"231":{"position":[[37,4],[165,4]]},"283":{"position":[[161,4]]},"303":{"position":[[268,4]]},"345":{"position":[[57,4]]},"350":{"position":[[29,5],[238,4]]},"351":{"position":[[280,4]]},"352":{"position":[[308,4]]},"353":{"position":[[327,4],[656,4],[733,4]]},"354":{"position":[[30,4],[1613,4],[1641,4]]},"356":{"position":[[120,4],[156,4],[211,4],[274,4],[414,4],[668,4]]},"357":{"position":[[28,4],[180,4],[210,4],[264,4]]},"358":{"position":[[57,4],[294,4],[382,4],[692,4]]},"359":{"position":[[142,4]]},"360":{"position":[[7,4],[50,4],[171,4],[264,4],[639,4],[717,4]]},"361":{"position":[[1,4],[30,4],[233,4],[389,4]]},"362":{"position":[[1,4],[380,4],[493,4],[594,4],[787,4],[893,4]]},"364":{"position":[[95,4],[133,4],[218,4],[313,4],[467,4],[491,4],[757,4]]},"365":{"position":[[20,4]]},"366":{"position":[[25,4],[430,4]]},"367":{"position":[[9,4]]},"369":{"position":[[98,4],[185,4],[317,4],[566,4],[978,4]]},"370":{"position":[[152,4]]},"371":{"position":[[101,4],[231,4]]},"372":{"position":[[84,4],[203,4],[347,4]]},"373":{"position":[[379,4],[450,4]]},"381":{"position":[[301,4]]},"382":{"position":[[61,4]]},"408":{"position":[[2968,4]]},"426":{"position":[[119,4]]},"427":{"position":[[663,4]]},"430":{"position":[[415,4],[445,4]]},"432":{"position":[[246,4]]},"439":{"position":[[586,4]]},"452":{"position":[[147,4],[606,4]]},"453":{"position":[[749,4]]},"457":{"position":[[80,4],[228,4],[281,4],[503,4],[568,4]]},"462":{"position":[[720,4]]},"464":{"position":[[797,4]]},"508":{"position":[[17,4]]},"528":{"position":[[14,4]]},"560":{"position":[[257,4],[454,4]]},"566":{"position":[[96,4],[158,4],[187,4],[361,4]]},"567":{"position":[[266,4]]},"588":{"position":[[50,4]]},"661":{"position":[[1630,4]]},"686":{"position":[[375,4]]},"687":{"position":[[95,4]]},"689":{"position":[[288,4]]},"698":{"position":[[43,4]]},"711":{"position":[[673,4]]},"749":{"position":[[3057,4],[11980,4],[13425,4],[19224,4]]},"772":{"position":[[1979,4]]},"800":{"position":[[79,4],[134,4]]},"841":{"position":[[199,6],[359,4],[1202,4]]},"865":{"position":[[116,5]]},"936":{"position":[[110,4]]},"952":{"position":[[31,4],[153,4]]},"953":{"position":[[15,4]]},"971":{"position":[[31,4],[265,4]]},"972":{"position":[[15,4]]},"1051":{"position":[[38,4],[164,4],[430,4]]},"1052":{"position":[[182,4]]},"1071":{"position":[[110,4]]},"1072":{"position":[[330,4]]},"1084":{"position":[[273,4]]},"1085":{"position":[[60,4],[1521,4]]},"1104":{"position":[[730,4]]},"1116":{"position":[[75,4]]},"1162":{"position":[[459,4]]},"1171":{"position":[[424,4]]},"1181":{"position":[[546,4]]},"1213":{"position":[[223,4]]},"1220":{"position":[[329,4]]},"1249":{"position":[[405,4]]},"1252":{"position":[[10,4]]},"1282":{"position":[[449,4]]},"1287":{"position":[[12,4]]},"1288":{"position":[[20,4],[110,4],[139,4],[255,4]]}},"keywords":{}}],["json.firstnam",{"_index":5730,"title":{},"content":{"1052":{"position":[[217,14]]}},"keywords":{}}],["json.pars",{"_index":2876,"title":{},"content":{"426":{"position":[[171,11]]},"800":{"position":[[200,12]]},"981":{"position":[[1006,12]]}},"keywords":{}}],["json.parse(event.data",{"_index":5053,"title":{},"content":{"875":{"position":[[8261,23]]}},"keywords":{}}],["json.parse(localstorage.getitem('us",{"_index":2881,"title":{},"content":{"426":{"position":[[500,41]]}},"keywords":{}}],["json.parse(sav",{"_index":3390,"title":{},"content":{"559":{"position":[[385,17]]}},"keywords":{}}],["json.passwordhash",{"_index":4311,"title":{},"content":{"749":{"position":[[13541,17]]}},"keywords":{}}],["json.stringifi",{"_index":1351,"title":{},"content":{"209":{"position":[[869,16]]},"255":{"position":[[1215,16]]},"426":{"position":[[152,14]]},"451":{"position":[[508,17]]},"457":{"position":[[532,16],[649,16]]},"988":{"position":[[2669,16]]},"1065":{"position":[[622,16]]},"1102":{"position":[[642,16]]}},"keywords":{}}],["json.stringify("production"",{"_index":3854,"title":{},"content":{"674":{"position":[[187,38]]}},"keywords":{}}],["json.stringify(a",{"_index":3912,"title":{},"content":{"691":{"position":[[261,17]]}},"keywords":{}}],["json.stringify(b",{"_index":3913,"title":{},"content":{"691":{"position":[[283,18]]}},"keywords":{}}],["json.stringify(changerow",{"_index":5039,"title":{},"content":{"875":{"position":[[6374,26]]}},"keywords":{}}],["json.stringify(data)}\\n\\n",{"_index":3603,"title":{},"content":{"612":{"position":[[2112,29]]}},"keywords":{}}],["json.stringify(ev",{"_index":5045,"title":{},"content":{"875":{"position":[[7459,21]]}},"keywords":{}}],["json.stringify(us",{"_index":2879,"title":{},"content":{"426":{"position":[[416,22]]}},"keywords":{}}],["json.stringify(usernam",{"_index":3391,"title":{},"content":{"559":{"position":[[467,26]]}},"keywords":{}}],["json/nosql",{"_index":2014,"title":{"354":{"position":[[30,11]]}},"content":{},"keywords":{}}],["json1",{"_index":2048,"title":{},"content":{"357":{"position":[[138,5],[334,5]]},"362":{"position":[[405,5]]}},"keywords":{}}],["json_extract",{"_index":6370,"title":{},"content":{"1282":{"position":[[467,13],[532,12]]}},"keywords":{}}],["jsonb",{"_index":2034,"title":{},"content":{"356":{"position":[[165,5],[381,5],[838,5]]},"362":{"position":[[357,5]]}},"keywords":{}}],["jsonschema",{"_index":2116,"title":{},"content":{"367":{"position":[[411,10],[465,10],[571,10]]},"1132":{"position":[[378,10]]},"1260":{"position":[[41,10]]},"1286":{"position":[[136,10]]}},"keywords":{}}],["json—wheth",{"_index":2090,"title":{},"content":{"362":{"position":[[328,12]]}},"keywords":{}}],["jsx",{"_index":5732,"title":{},"content":{"1052":{"position":[[531,4]]}},"keywords":{}}],["jump",{"_index":2339,"title":{},"content":{"396":{"position":[[424,5]]},"806":{"position":[[343,5]]}},"keywords":{}}],["jwt",{"_index":1538,"title":{},"content":{"245":{"position":[[160,3]]}},"keywords":{}}],["karma",{"_index":4076,"title":{},"content":{"730":{"position":[[177,6]]}},"keywords":{}}],["kb",{"_index":2972,"title":{},"content":{"454":{"position":[[693,2]]},"461":{"position":[[32,2],[257,2]]}},"keywords":{}}],["kbit/",{"_index":3026,"title":{},"content":{"462":{"position":[[628,7],[651,7]]}},"keywords":{}}],["keep",{"_index":740,"title":{},"content":{"47":{"position":[[1015,5]]},"125":{"position":[[163,5]]},"158":{"position":[[200,4]]},"162":{"position":[[607,5]]},"185":{"position":[[170,7]]},"255":{"position":[[1567,4]]},"265":{"position":[[761,5]]},"275":{"position":[[277,7]]},"287":{"position":[[972,5]]},"301":{"position":[[306,4]]},"323":{"position":[[177,4],[596,5]]},"328":{"position":[[236,4]]},"339":{"position":[[136,7]]},"342":{"position":[[137,7]]},"365":{"position":[[236,5]]},"369":{"position":[[445,4]]},"407":{"position":[[616,4]]},"408":{"position":[[5013,4]]},"411":{"position":[[2490,4]]},"412":{"position":[[3469,4],[8795,4],[15346,4]]},"419":{"position":[[984,7]]},"421":{"position":[[786,4]]},"460":{"position":[[139,5]]},"467":{"position":[[477,5]]},"481":{"position":[[827,4]]},"482":{"position":[[91,4]]},"490":{"position":[[646,4]]},"498":{"position":[[613,4]]},"502":{"position":[[895,4]]},"556":{"position":[[1791,4]]},"557":{"position":[[491,4]]},"562":{"position":[[1742,7]]},"574":{"position":[[289,7]]},"575":{"position":[[455,5]]},"612":{"position":[[497,5],[1980,5]]},"625":{"position":[[115,4]]},"626":{"position":[[907,4]]},"634":{"position":[[541,5]]},"635":{"position":[[465,5]]},"642":{"position":[[136,4]]},"699":{"position":[[552,4]]},"700":{"position":[[860,4]]},"707":{"position":[[487,4]]},"709":{"position":[[608,4]]},"754":{"position":[[321,4]]},"828":{"position":[[477,5]]},"857":{"position":[[521,4]]},"858":{"position":[[437,4]]},"860":{"position":[[343,5]]},"875":{"position":[[7335,5]]},"1009":{"position":[[596,5]]},"1069":{"position":[[367,4]]},"1148":{"position":[[219,5]]},"1304":{"position":[[499,4]]},"1316":{"position":[[3061,5]]},"1321":{"position":[[424,4]]}},"keywords":{}}],["keep.first",{"_index":3195,"title":{},"content":{"496":{"position":[[618,10]]}},"keywords":{}}],["keepindexesonpar",{"_index":6115,"title":{},"content":{"1164":{"position":[[521,19],[749,19],[796,20]]},"1165":{"position":[[414,20]]}},"keywords":{}}],["kelso",{"_index":5349,"title":{},"content":{"948":{"position":[[426,7]]}},"keywords":{}}],["kept",{"_index":3515,"title":{"618":{"position":[[20,4]]}},"content":{"582":{"position":[[51,4]]},"698":{"position":[[512,4]]},"799":{"position":[[195,4]]}},"keywords":{}}],["key",{"_index":556,"title":{"141":{"position":[[5,3]]},"169":{"position":[[5,3]]},"197":{"position":[[5,3]]},"323":{"position":[[0,3]]},"345":{"position":[[5,3]]},"360":{"position":[[0,3]]},"508":{"position":[[5,3]]},"528":{"position":[[5,3]]},"588":{"position":[[5,3]]},"631":{"position":[[11,3]]},"733":{"position":[[0,3]]},"734":{"position":[[7,3]]},"870":{"position":[[0,3]]},"896":{"position":[[0,3]]},"1078":{"position":[[18,4]]},"1122":{"position":[[29,3]]},"1156":{"position":[[0,3]]}},"content":{"35":{"position":[[345,3]]},"45":{"position":[[126,3]]},"53":{"position":[[3,3]]},"57":{"position":[[447,3],[483,3]]},"63":{"position":[[121,3]]},"119":{"position":[[54,3]]},"133":{"position":[[12,3]]},"141":{"position":[[77,3],[99,3],[135,4]]},"169":{"position":[[66,3],[126,5]]},"170":{"position":[[441,3]]},"182":{"position":[[12,3]]},"190":{"position":[[12,3]]},"197":{"position":[[77,3],[127,4]]},"247":{"position":[[112,3]]},"265":{"position":[[12,3]]},"271":{"position":[[266,3]]},"278":{"position":[[191,3]]},"283":{"position":[[166,3]]},"291":{"position":[[308,4]]},"293":{"position":[[81,3]]},"303":{"position":[[317,3],[460,3]]},"311":{"position":[[90,3]]},"316":{"position":[[50,3]]},"317":{"position":[[41,3],[199,3]]},"345":{"position":[[62,3]]},"354":{"position":[[512,5]]},"356":{"position":[[357,4]]},"358":{"position":[[195,3]]},"361":{"position":[[238,3],[323,3],[468,3]]},"362":{"position":[[941,3]]},"366":{"position":[[71,3]]},"367":{"position":[[771,3],[882,3]]},"407":{"position":[[861,3]]},"408":{"position":[[45,3],[3752,3]]},"412":{"position":[[10240,3]]},"424":{"position":[[176,3]]},"426":{"position":[[49,3]]},"427":{"position":[[491,3]]},"429":{"position":[[196,3],[554,3]]},"432":{"position":[[221,3],[1254,3],[1438,3]]},"441":{"position":[[173,3]]},"450":{"position":[[82,3]]},"451":{"position":[[134,3],[262,3],[745,3]]},"458":{"position":[[410,3]]},"468":{"position":[[170,3]]},"485":{"position":[[141,3]]},"491":{"position":[[24,3]]},"508":{"position":[[22,3]]},"528":{"position":[[19,3]]},"533":{"position":[[156,3]]},"544":{"position":[[402,3]]},"550":{"position":[[171,4]]},"551":{"position":[[234,3]]},"555":{"position":[[421,3],[770,5]]},"559":{"position":[[52,3],[1228,4]]},"560":{"position":[[60,3],[384,3]]},"566":{"position":[[54,3],[235,4]]},"567":{"position":[[991,3]]},"593":{"position":[[156,3]]},"604":{"position":[[336,3]]},"620":{"position":[[127,3]]},"639":{"position":[[75,3],[93,3]]},"659":{"position":[[77,3],[517,4],[598,4],[664,4],[803,3]]},"683":{"position":[[702,3]]},"693":{"position":[[914,4],[1234,4]]},"705":{"position":[[817,4]]},"716":{"position":[[318,4],[438,3]]},"734":{"position":[[5,3],[101,3],[803,3]]},"749":{"position":[[717,3],[1907,3],[7390,4],[9161,3],[10303,3],[11295,3],[19720,3],[20035,3],[20867,3],[21474,3],[22400,3]]},"772":{"position":[[283,3]]},"793":{"position":[[439,3]]},"835":{"position":[[19,3],[908,3]]},"838":{"position":[[392,3]]},"841":{"position":[[78,3]]},"863":{"position":[[18,4],[149,3]]},"897":{"position":[[541,3],[577,3]]},"898":{"position":[[176,3],[213,4],[981,4],[1688,3],[2821,3],[4455,5]]},"912":{"position":[[482,3]]},"934":{"position":[[262,3]]},"943":{"position":[[127,3]]},"951":{"position":[[186,3]]},"1056":{"position":[[296,3]]},"1065":{"position":[[1565,3],[1856,3]]},"1074":{"position":[[1020,3]]},"1077":{"position":[[90,3],[145,3]]},"1078":{"position":[[36,3],[317,4],[379,3],[582,3]]},"1080":{"position":[[205,3]]},"1082":{"position":[[290,3]]},"1083":{"position":[[490,3]]},"1102":{"position":[[1394,4]]},"1123":{"position":[[33,3],[479,3]]},"1124":{"position":[[967,3]]},"1132":{"position":[[821,3]]},"1147":{"position":[[59,3]]},"1177":{"position":[[378,4]]},"1246":{"position":[[1865,3]]},"1247":{"position":[[564,3]]},"1296":{"position":[[427,3]]},"1309":{"position":[[1425,3]]},"1320":{"position":[[775,3]]}},"keywords":{}}],["key(",{"_index":4283,"title":{},"content":{"749":{"position":[[11384,6]]}},"keywords":{}}],["key.set",{"_index":5945,"title":{},"content":{"1102":{"position":[[1287,7]]}},"keywords":{}}],["key="hero.id">",{"_index":3506,"title":{},"content":{"580":{"position":[[800,28]]},"601":{"position":[[188,28]]},"602":{"position":[[575,28]]}},"keywords":{}}],["key={doc.id}>{doc.name}</li>",{"_index":3183,"title":{},"content":{"494":{"position":[[366,37]]}},"keywords":{}}],["key={hero.id}>",{"_index":3316,"title":{},"content":{"541":{"position":[[619,17]]},"562":{"position":[[1490,17]]}},"keywords":{}}],["key={hero.id}>{hero.name}</li>",{"_index":3325,"title":{},"content":{"542":{"position":[[870,39]]}},"keywords":{}}],["key={hero.name}>{hero.name}</li>",{"_index":4764,"title":{},"content":{"829":{"position":[[3566,41]]}},"keywords":{}}],["key={index",{"_index":3279,"title":{},"content":{"523":{"position":[[726,11]]}},"keywords":{}}],["keychain",{"_index":3340,"title":{},"content":{"551":{"position":[[315,8]]},"556":{"position":[[119,8],[237,8],[297,8],[325,10],[521,11]]}},"keywords":{}}],["keychain.getgenericpassword",{"_index":3364,"title":{},"content":{"556":{"position":[[401,30]]}},"keywords":{}}],["keycompress",{"_index":1903,"title":{},"content":{"316":{"position":[[188,15],[400,15]]},"639":{"position":[[245,15],[371,15]]},"734":{"position":[[613,15],[670,14]]},"749":{"position":[[666,14]]},"1078":{"position":[[127,15],[184,14]]},"1080":{"position":[[77,15]]},"1084":{"position":[[164,14]]},"1311":{"position":[[369,15]]}},"keywords":{}}],["keyrang",{"_index":2992,"title":{},"content":{"459":{"position":[[579,8]]},"1296":{"position":[[1210,9],[1318,8],[1427,8]]}},"keywords":{}}],["keys.us",{"_index":3362,"title":{},"content":{"556":{"position":[[67,8]]}},"keywords":{}}],["keys/valu",{"_index":4809,"title":{},"content":{"841":{"position":[[892,11]]}},"keywords":{}}],["keystrok",{"_index":2712,"title":{},"content":{"412":{"position":[[6528,9]]}},"keywords":{}}],["keyword",{"_index":1437,"title":{"243":{"position":[[4,10]]}},"content":{"723":{"position":[[2250,7]]},"789":{"position":[[349,7]]},"791":{"position":[[250,8]]},"808":{"position":[[9,7]]}},"keywords":{}}],["keywords.y",{"_index":6565,"title":{},"content":{"1317":{"position":[[437,12]]}},"keywords":{}}],["key—but",{"_index":5212,"title":{},"content":{"898":{"position":[[2890,7]]}},"keywords":{}}],["kill",{"_index":6107,"title":{},"content":{"1162":{"position":[[64,6]]},"1171":{"position":[[81,6]]},"1181":{"position":[[130,6]]}},"keywords":{}}],["kind",{"_index":3919,"title":{},"content":{"691":{"position":[[631,4]]},"698":{"position":[[779,4]]},"700":{"position":[[1046,5]]},"701":{"position":[[235,4]]},"705":{"position":[[195,4]]},"784":{"position":[[66,4]]},"1067":{"position":[[1661,5]]},"1313":{"position":[[934,4]]},"1316":{"position":[[2484,4]]}},"keywords":{}}],["king",{"_index":4096,"title":{},"content":{"739":{"position":[[539,8]]}},"keywords":{}}],["kit",{"_index":1229,"title":{},"content":{"177":{"position":[[51,3]]}},"keywords":{}}],["kitti",{"_index":4612,"title":{},"content":{"792":{"position":[[389,7]]}},"keywords":{}}],["know",{"_index":177,"title":{"633":{"position":[[23,4]]}},"content":{"11":{"position":[[1009,4]]},"367":{"position":[[613,4]]},"410":{"position":[[848,4]]},"411":{"position":[[4510,4]]},"412":{"position":[[239,4],[955,5]]},"413":{"position":[[17,4]]},"456":{"position":[[14,4]]},"458":{"position":[[1590,4]]},"488":{"position":[[13,4]]},"562":{"position":[[1651,5]]},"678":{"position":[[82,4]]},"686":{"position":[[352,4]]},"688":{"position":[[1049,4]]},"704":{"position":[[235,4]]},"709":{"position":[[584,4],[958,4]]},"749":{"position":[[262,4]]},"757":{"position":[[262,4]]},"796":{"position":[[714,4]]},"798":{"position":[[648,5]]},"861":{"position":[[1374,5]]},"875":{"position":[[1919,5]]},"945":{"position":[[387,5]]},"965":{"position":[[133,5]]},"989":{"position":[[394,4]]},"996":{"position":[[217,5]]},"1008":{"position":[[216,5]]},"1018":{"position":[[911,4]]},"1066":{"position":[[169,4],[454,5]]},"1079":{"position":[[347,4]]},"1085":{"position":[[922,4],[2403,4]]},"1175":{"position":[[253,5]]},"1192":{"position":[[724,4]]},"1207":{"position":[[234,4]]},"1230":{"position":[[10,4]]},"1251":{"position":[[230,5]]},"1257":{"position":[[56,4]]},"1318":{"position":[[491,4],[573,4]]},"1321":{"position":[[92,4],[630,4]]},"1322":{"position":[[74,4]]}},"keywords":{}}],["knowledg",{"_index":1415,"title":{},"content":{"230":{"position":[[225,9]]}},"keywords":{}}],["known",{"_index":134,"title":{"625":{"position":[[0,5]]},"850":{"position":[[0,5]]},"909":{"position":[[0,5]]},"1176":{"position":[[0,5]]},"1282":{"position":[[0,5]]}},"content":{"9":{"position":[[51,5]]},"23":{"position":[[78,5]]},"25":{"position":[[23,5]]},"162":{"position":[[39,5]]},"189":{"position":[[39,5]]},"299":{"position":[[953,5]]},"305":{"position":[[562,5]]},"398":{"position":[[3201,5]]},"445":{"position":[[14,5]]},"625":{"position":[[59,5]]},"627":{"position":[[16,5]]},"723":{"position":[[76,5]]},"749":{"position":[[1691,5],[7585,5],[7684,5]]},"798":{"position":[[831,5]]},"839":{"position":[[301,5]]},"954":{"position":[[13,5]]},"982":{"position":[[427,5]]},"1009":{"position":[[742,5]]},"1045":{"position":[[20,5]]},"1066":{"position":[[637,5]]},"1085":{"position":[[1808,5]]},"1294":{"position":[[1962,5]]},"1296":{"position":[[831,5],[1307,6]]}},"keywords":{}}],["koa",{"_index":5926,"title":{"1099":{"position":[[20,4]]}},"content":{"1099":{"position":[[66,3],[90,3],[286,5]]}},"keywords":{}}],["kopieren",{"_index":1381,"title":{},"content":{"211":{"position":[[310,8]]}},"keywords":{}}],["kotlin",{"_index":679,"title":{},"content":{"43":{"position":[[508,7]]}},"keywords":{}}],["l6",{"_index":2214,"title":{},"content":{"391":{"position":[[410,2],[553,2]]},"401":{"position":[[213,2]]},"402":{"position":[[1912,2]]}},"keywords":{}}],["lab",{"_index":6581,"title":{},"content":{"1324":{"position":[[827,5]]}},"keywords":{}}],["label",{"_index":363,"title":{},"content":{"22":{"position":[[12,6]]},"570":{"position":[[835,7]]}},"keywords":{}}],["lack",{"_index":698,"title":{},"content":{"45":{"position":[[249,5]]},"47":{"position":[[1076,5]]},"310":{"position":[[366,4]]},"317":{"position":[[95,4]]},"331":{"position":[[153,4]]},"412":{"position":[[14279,4]]},"427":{"position":[[897,5]]},"432":{"position":[[541,5]]},"435":{"position":[[183,5]]},"452":{"position":[[256,5]]},"566":{"position":[[327,5]]},"624":{"position":[[985,5],[1548,7]]},"661":{"position":[[1369,7]]},"711":{"position":[[1866,7]]},"836":{"position":[[1318,4]]},"840":{"position":[[236,7]]}},"keywords":{}}],["lag",{"_index":2029,"title":{},"content":{"354":{"position":[[1230,3]]},"571":{"position":[[1685,3]]}},"keywords":{}}],["laggi",{"_index":4768,"title":{},"content":{"835":{"position":[[345,5]]}},"keywords":{}}],["lamport",{"_index":6491,"title":{},"content":{"1305":{"position":[[457,7]]}},"keywords":{}}],["lan",{"_index":2637,"title":{},"content":{"411":{"position":[[5090,3]]}},"keywords":{}}],["lan.cost",{"_index":5247,"title":{},"content":{"902":{"position":[[788,8]]}},"keywords":{}}],["land",{"_index":2564,"title":{},"content":{"408":{"position":[[4177,5]]}},"keywords":{}}],["landscap",{"_index":1684,"title":{},"content":{"289":{"position":[[1538,10]]},"510":{"position":[[22,9]]},"530":{"position":[[558,9]]},"624":{"position":[[8,9]]}},"keywords":{}}],["lang",{"_index":3660,"title":{},"content":{"620":{"position":[[355,4]]}},"keywords":{}}],["lang="ts">",{"_index":3541,"title":{},"content":{"601":{"position":[[353,23]]}},"keywords":{}}],["languag",{"_index":416,"title":{},"content":{"25":{"position":[[131,8],[193,10]]},"36":{"position":[[96,9]]},"37":{"position":[[174,9]]},"39":{"position":[[379,8]]},"364":{"position":[[50,8],[272,9]]},"408":{"position":[[3536,9]]},"566":{"position":[[352,8]]},"569":{"position":[[1176,8]]},"661":{"position":[[149,8]]},"711":{"position":[[72,8],[201,8]]},"836":{"position":[[151,8]]},"841":{"position":[[376,9]]},"1102":{"position":[[203,9]]},"1249":{"position":[[158,8]]}},"keywords":{}}],["laptop",{"_index":2037,"title":{},"content":{"356":{"position":[[468,10]]},"392":{"position":[[5200,6]]}},"keywords":{}}],["laravel",{"_index":6379,"title":{},"content":{"1284":{"position":[[187,7]]}},"keywords":{}}],["larg",{"_index":693,"title":{},"content":{"45":{"position":[[68,5]]},"58":{"position":[[177,5]]},"66":{"position":[[347,5]]},"100":{"position":[[43,5]]},"111":{"position":[[191,5]]},"138":{"position":[[192,5]]},"141":{"position":[[256,5]]},"169":{"position":[[281,5]]},"173":{"position":[[2115,5]]},"174":{"position":[[2537,5]]},"217":{"position":[[341,5]]},"301":{"position":[[83,5]]},"303":{"position":[[420,5]]},"304":{"position":[[33,5],[164,5],[364,5]]},"305":{"position":[[196,5]]},"306":{"position":[[157,5]]},"311":{"position":[[1,5]]},"314":{"position":[[1129,7]]},"321":{"position":[[232,5]]},"342":{"position":[[74,5]]},"345":{"position":[[24,5]]},"346":{"position":[[765,5]]},"353":{"position":[[400,5]]},"358":{"position":[[376,5],[595,5]]},"361":{"position":[[255,6]]},"369":{"position":[[502,5]]},"376":{"position":[[560,5]]},"385":{"position":[[225,5]]},"386":{"position":[[109,5]]},"395":{"position":[[463,5]]},"396":{"position":[[771,5]]},"401":{"position":[[487,5],[524,5],[570,5]]},"408":{"position":[[741,5],[1302,5],[2273,5]]},"411":{"position":[[75,5]]},"412":{"position":[[7394,6]]},"417":{"position":[[156,6]]},"418":{"position":[[391,5]]},"430":{"position":[[439,5]]},"446":{"position":[[886,5]]},"452":{"position":[[119,5]]},"453":{"position":[[101,5]]},"461":{"position":[[405,6]]},"495":{"position":[[880,7]]},"497":{"position":[[276,6]]},"559":{"position":[[1643,5]]},"560":{"position":[[448,5]]},"566":{"position":[[599,5],[636,5],[688,5],[758,5]]},"574":{"position":[[541,5]]},"623":{"position":[[27,5]]},"624":{"position":[[1384,7]]},"639":{"position":[[47,5]]},"642":{"position":[[250,5]]},"643":{"position":[[5,5]]},"644":{"position":[[567,5]]},"723":{"position":[[188,5]]},"836":{"position":[[1751,5]]},"838":{"position":[[1114,5]]},"839":{"position":[[1102,5]]},"841":{"position":[[1463,5]]},"1009":{"position":[[118,5],[890,6]]},"1072":{"position":[[2906,5]]},"1112":{"position":[[299,5]]},"1132":{"position":[[261,5],[1231,5]]}},"keywords":{}}],["large.no",{"_index":3407,"title":{},"content":{"559":{"position":[[1154,8]]}},"keywords":{}}],["larger",{"_index":898,"title":{},"content":{"64":{"position":[[121,6]]},"227":{"position":[[59,6]]},"287":{"position":[[768,6]]},"299":{"position":[[1654,6]]},"321":{"position":[[417,6]]},"369":{"position":[[684,6]]},"394":{"position":[[1778,6]]},"401":{"position":[[644,6],[759,6]]},"432":{"position":[[381,6]]},"560":{"position":[[239,6]]},"581":{"position":[[534,6]]},"587":{"position":[[132,6]]}},"keywords":{}}],["larger.webtransport",{"_index":3664,"title":{},"content":{"621":{"position":[[694,20]]}},"keywords":{}}],["largest",{"_index":2324,"title":{},"content":{"394":{"position":[[1145,8]]}},"keywords":{}}],["lasagna",{"_index":4594,"title":{},"content":{"785":{"position":[[341,7]]}},"keywords":{}}],["last",{"_index":229,"title":{},"content":{"14":{"position":[[849,4]]},"27":{"position":[[313,4]]},"32":{"position":[[269,4]]},"203":{"position":[[65,4]]},"250":{"position":[[22,4]]},"412":{"position":[[2359,4],[3287,4]]},"496":{"position":[[1,4],[91,4]]},"635":{"position":[[222,4]]},"647":{"position":[[104,4],[501,4]]},"688":{"position":[[880,4]]},"697":{"position":[[188,4]]},"885":{"position":[[84,4],[2429,4]]},"886":{"position":[[114,4]]},"898":{"position":[[293,4]]},"948":{"position":[[698,4]]},"983":{"position":[[209,4]]},"984":{"position":[[188,4],[526,4]]},"986":{"position":[[102,4],[179,4],[876,4]]},"988":{"position":[[4167,4]]},"990":{"position":[[521,4]]},"995":{"position":[[1226,4],[1402,4],[1452,4]]},"1002":{"position":[[942,4]]},"1065":{"position":[[1863,4]]},"1294":{"position":[[512,4],[684,4]]},"1296":{"position":[[443,4],[1237,4]]},"1305":{"position":[[157,4]]},"1316":{"position":[[1675,4]]},"1318":{"position":[[287,4]]},"1320":{"position":[[911,4]]}},"keywords":{}}],["lastcheckpoint",{"_index":1353,"title":{},"content":{"209":{"position":[[1000,16],[1171,14]]},"255":{"position":[[1335,16]]},"632":{"position":[[2380,16],[2473,14]]},"988":{"position":[[3579,14],[4286,16],[4353,14]]}},"keywords":{}}],["lastcheckpoint.updatedat",{"_index":5465,"title":{},"content":{"988":{"position":[[3596,24]]}},"keywords":{}}],["lastdoc",{"_index":5110,"title":{},"content":{"885":{"position":[[2468,7]]},"1294":{"position":[[976,8],[1308,7],[1343,7],[1645,7]]}},"keywords":{}}],["lastdoc.ag",{"_index":6433,"title":{},"content":{"1294":{"position":[[1318,11]]}},"keywords":{}}],["lastdoc.id",{"_index":5113,"title":{},"content":{"885":{"position":[[2543,11]]},"1294":{"position":[[1353,10]]}},"keywords":{}}],["lastdoc.updatedat",{"_index":5114,"title":{},"content":{"885":{"position":[[2566,17]]}},"keywords":{}}],["lasteventid",{"_index":5017,"title":{},"content":{"875":{"position":[[4386,11],[4545,14]]}},"keywords":{}}],["lastid",{"_index":2268,"title":{},"content":{"392":{"position":[[4010,6],[4230,10]]}},"keywords":{}}],["lastlocalcheckpoint",{"_index":5537,"title":{},"content":{"1002":{"position":[[308,20],[386,19],[494,19],[715,19]]}},"keywords":{}}],["lastnam",{"_index":4515,"title":{},"content":{"764":{"position":[[150,8]]},"820":{"position":[[643,9]]},"872":{"position":[[2007,9],[2077,11],[4237,9],[4307,11]]},"885":{"position":[[562,9],[657,9]]},"898":{"position":[[2587,9],[2682,11]]},"942":{"position":[[223,9]]},"943":{"position":[[431,9]]},"944":{"position":[[239,9],[275,9]]},"946":{"position":[[195,9]]},"947":{"position":[[213,9],[248,9]]},"948":{"position":[[416,9]]},"1035":{"position":[[137,9]]},"1051":{"position":[[267,9],[537,9]]},"1078":{"position":[[406,10],[644,9],[707,10],[961,9],[1088,9]]},"1080":{"position":[[358,9]]},"1082":{"position":[[352,9]]},"1083":{"position":[[552,9]]},"1249":{"position":[[513,9]]},"1311":{"position":[[510,9],[606,11],[1553,9]]}},"keywords":{}}],["lastname)"",{"_index":4003,"title":{},"content":{"711":{"position":[[1298,17]]}},"keywords":{}}],["lastofarray",{"_index":4989,"title":{},"content":{"875":{"position":[[2030,11],[4276,11]]},"988":{"position":[[190,11]]}},"keywords":{}}],["lastofarray(docs).nam",{"_index":5158,"title":{},"content":{"888":{"position":[[1135,23]]}},"keywords":{}}],["lastofarray(docs).updatedat",{"_index":5159,"title":{},"content":{"888":{"position":[[1170,27]]}},"keywords":{}}],["lastofarray(documents).id",{"_index":5001,"title":{},"content":{"875":{"position":[[2689,26]]}},"keywords":{}}],["lastofarray(documents).updatedat",{"_index":5002,"title":{},"content":{"875":{"position":[[2727,32]]}},"keywords":{}}],["lastofarray(documentsfromremote).id",{"_index":5470,"title":{},"content":{"988":{"position":[[4376,36]]}},"keywords":{}}],["lastofarray(documentsfromremote).updatedat",{"_index":5471,"title":{},"content":{"988":{"position":[[4424,42]]}},"keywords":{}}],["lastofarray(subresult",{"_index":6444,"title":{},"content":{"1294":{"position":[[1655,23]]}},"keywords":{}}],["lastremotecheckpoint",{"_index":5540,"title":{},"content":{"1002":{"position":[[985,20],[1147,20],[1369,20]]}},"keywords":{}}],["laststat",{"_index":5715,"title":{},"content":{"1049":{"position":[[84,9],[144,9]]}},"keywords":{}}],["lastworkerid",{"_index":2267,"title":{},"content":{"392":{"position":[[3988,12],[4165,12]]}},"keywords":{}}],["late",{"_index":3100,"title":{},"content":{"470":{"position":[[532,6]]}},"keywords":{}}],["latenc",{"_index":675,"title":{"92":{"position":[[32,8]]},"220":{"position":[[4,7]]},"415":{"position":[[0,7]]},"464":{"position":[[0,7]]},"465":{"position":[[0,7]]},"621":{"position":[[0,8]]},"629":{"position":[[5,7]]},"630":{"position":[[9,7]]},"631":{"position":[[23,7]]},"780":{"position":[[0,7]]},"1239":{"position":[[4,7]]}},"content":{"43":{"position":[[448,8]]},"46":{"position":[[304,8]]},"65":{"position":[[1014,7],[1097,7]]},"92":{"position":[[84,8]]},"173":{"position":[[2050,7],[2509,8],[2617,8]]},"216":{"position":[[163,8]]},"220":{"position":[[31,7]]},"369":{"position":[[880,8],[952,7]]},"375":{"position":[[293,8]]},"378":{"position":[[221,8]]},"408":{"position":[[2149,7],[2318,7],[2714,7],[3198,7]]},"410":{"position":[[60,7],[191,7]]},"411":{"position":[[5687,7]]},"415":{"position":[[327,7]]},"462":{"position":[[148,10],[659,8]]},"463":{"position":[[889,7],[1081,7]]},"464":{"position":[[20,7],[495,7]]},"465":{"position":[[474,8]]},"466":{"position":[[456,8]]},"467":{"position":[[533,7]]},"486":{"position":[[32,8]]},"534":{"position":[[339,7]]},"569":{"position":[[394,8]]},"594":{"position":[[337,7]]},"611":{"position":[[554,7]]},"613":{"position":[[64,7]]},"620":{"position":[[147,8],[756,8]]},"621":{"position":[[31,7],[227,7],[384,7],[663,7],[737,7]]},"630":{"position":[[143,9]]},"632":{"position":[[247,8]]},"640":{"position":[[484,7]]},"641":{"position":[[57,7],[204,8]]},"643":{"position":[[333,7]]},"644":{"position":[[399,7],[605,7]]},"699":{"position":[[480,7]]},"723":{"position":[[734,7],[2804,8]]},"778":{"position":[[222,7]]},"780":{"position":[[158,7],[321,7],[707,7],[767,7]]},"901":{"position":[[436,7]]},"902":{"position":[[9,7]]},"1093":{"position":[[350,7]]},"1123":{"position":[[80,7],[296,7]]},"1211":{"position":[[502,7]]},"1239":{"position":[[72,7],[253,7],[466,8]]},"1270":{"position":[[234,8]]}},"keywords":{}}],["latency"",{"_index":5243,"title":{},"content":{"902":{"position":[[533,13]]}},"keywords":{}}],["later",{"_index":568,"title":{},"content":{"36":{"position":[[61,5]]},"212":{"position":[[441,6]]},"314":{"position":[[117,6],[937,6]]},"334":{"position":[[153,5]]},"402":{"position":[[688,5]]},"411":{"position":[[287,5],[3385,6]]},"420":{"position":[[706,5]]},"634":{"position":[[456,5]]},"702":{"position":[[38,5]]},"710":{"position":[[2226,5]]},"774":{"position":[[256,5]]},"838":{"position":[[1644,5]]},"861":{"position":[[186,5]]},"875":{"position":[[4217,5]]},"886":{"position":[[326,5]]},"990":{"position":[[90,5]]},"998":{"position":[[51,5]]},"1006":{"position":[[310,6]]},"1083":{"position":[[66,6]]},"1104":{"position":[[810,5]]},"1105":{"position":[[1252,6]]},"1195":{"position":[[171,5]]},"1292":{"position":[[588,5]]},"1319":{"position":[[11,5]]}},"keywords":{}}],["latest",{"_index":1177,"title":{"731":{"position":[[15,6]]}},"content":{"159":{"position":[[351,6]]},"185":{"position":[[205,6]]},"289":{"position":[[1377,6]]},"339":{"position":[[148,6]]},"410":{"position":[[2219,6]]},"446":{"position":[[732,6]]},"481":{"position":[[169,6]]},"494":{"position":[[528,6]]},"496":{"position":[[338,6],[737,6]]},"636":{"position":[[419,6]]},"726":{"position":[[16,6]]},"731":{"position":[[17,6],[257,6]]},"982":{"position":[[295,6],[420,6],[527,6],[601,6],[663,6]]},"983":{"position":[[353,6],[794,6]]},"986":{"position":[[1292,6]]},"1002":{"position":[[270,6]]},"1044":{"position":[[35,6]]},"1045":{"position":[[13,6]]},"1278":{"position":[[170,6]]}},"keywords":{}}],["latestdoc",{"_index":5704,"title":{},"content":{"1045":{"position":[[191,9],[256,11]]}},"keywords":{}}],["launch",{"_index":1563,"title":{},"content":{"253":{"position":[[157,6]]},"412":{"position":[[11401,6]]},"420":{"position":[[1390,6]]},"723":{"position":[[1756,8]]}},"keywords":{}}],["lay",{"_index":3955,"title":{},"content":{"700":{"position":[[880,6]]}},"keywords":{}}],["layer",{"_index":400,"title":{"72":{"position":[[17,5]]},"112":{"position":[[17,5]]},"131":{"position":[[20,6]]},"162":{"position":[[20,6]]},"189":{"position":[[20,6]]},"239":{"position":[[17,5]]},"287":{"position":[[20,6]]},"336":{"position":[[20,6]]},"504":{"position":[[30,7]]},"524":{"position":[[20,6]]},"581":{"position":[[20,6]]}},"content":{"24":{"position":[[163,6],[573,5]]},"40":{"position":[[399,6]]},"46":{"position":[[144,6]]},"72":{"position":[[32,5]]},"112":{"position":[[32,6]]},"131":{"position":[[32,6],[257,6],[809,6],[932,5]]},"155":{"position":[[221,5]]},"162":{"position":[[31,7],[136,6],[249,5],[446,5],[601,5],[674,5]]},"174":{"position":[[2569,5],[2642,5]]},"189":{"position":[[58,7],[193,5],[426,5],[688,5]]},"239":{"position":[[34,5]]},"254":{"position":[[235,5]]},"262":{"position":[[601,6]]},"263":{"position":[[354,6]]},"287":{"position":[[96,6],[151,6],[1212,5]]},"291":{"position":[[61,5]]},"336":{"position":[[52,8]]},"369":{"position":[[1312,6],[1367,6]]},"383":{"position":[[357,5]]},"396":{"position":[[674,6],[694,6]]},"411":{"position":[[2230,6]]},"412":{"position":[[2697,7],[9813,6]]},"452":{"position":[[366,5]]},"490":{"position":[[239,5]]},"504":{"position":[[60,7]]},"524":{"position":[[30,7],[122,5],[327,6]]},"536":{"position":[[95,5]]},"551":{"position":[[163,6]]},"560":{"position":[[692,5]]},"576":{"position":[[107,5]]},"595":{"position":[[1358,5]]},"596":{"position":[[93,5]]},"630":{"position":[[924,5],[972,5]]},"640":{"position":[[16,5],[453,6]]},"662":{"position":[[894,7]]},"703":{"position":[[127,6],[621,6],[756,5],[891,5]]},"709":{"position":[[715,6],[1121,6]]},"710":{"position":[[439,5]]},"774":{"position":[[431,6]]},"802":{"position":[[166,6]]},"836":{"position":[[1523,6]]},"988":{"position":[[1972,6]]},"1090":{"position":[[249,6],[277,5],[1176,5]]},"1092":{"position":[[582,6]]},"1124":{"position":[[159,5]]},"1132":{"position":[[151,6]]},"1198":{"position":[[1193,5]]},"1236":{"position":[[15,5]]},"1305":{"position":[[740,5]]},"1316":{"position":[[3864,6]]},"1320":{"position":[[634,5],[841,5]]}},"keywords":{}}],["layers"",{"_index":3511,"title":{},"content":{"581":{"position":[[66,12]]}},"keywords":{}}],["layout",{"_index":3961,"title":{"986":{"position":[[5,6]]}},"content":{"702":{"position":[[72,7]]},"1319":{"position":[[32,6]]}},"keywords":{}}],["lazi",{"_index":2169,"title":{},"content":{"385":{"position":[[6,4]]},"724":{"position":[[1188,5]]},"1194":{"position":[[83,5]]}},"keywords":{}}],["lazili",{"_index":6007,"title":{},"content":{"1120":{"position":[[242,6]]}},"keywords":{}}],["ld1",{"_index":4312,"title":{},"content":{"749":{"position":[[13633,3]]}},"keywords":{}}],["ld2",{"_index":4314,"title":{},"content":{"749":{"position":[[13756,3]]}},"keywords":{}}],["ld3",{"_index":4316,"title":{},"content":{"749":{"position":[[13854,3]]}},"keywords":{}}],["ld4",{"_index":4317,"title":{},"content":{"749":{"position":[[13998,3]]}},"keywords":{}}],["ld5",{"_index":4318,"title":{},"content":{"749":{"position":[[14081,3]]}},"keywords":{}}],["ld6",{"_index":4319,"title":{},"content":{"749":{"position":[[14175,3]]}},"keywords":{}}],["ld7",{"_index":4321,"title":{},"content":{"749":{"position":[[14287,3]]}},"keywords":{}}],["ld8",{"_index":4322,"title":{},"content":{"749":{"position":[[14372,3]]}},"keywords":{}}],["lead",{"_index":279,"title":{},"content":{"16":{"position":[[445,4]]},"277":{"position":[[247,5]]},"407":{"position":[[385,5]]},"409":{"position":[[84,5]]},"427":{"position":[[319,7]]},"430":{"position":[[365,4],[763,4]]},"515":{"position":[[164,7]]},"521":{"position":[[197,5]]},"622":{"position":[[310,7]]},"698":{"position":[[2462,4]]},"742":{"position":[[35,7]]},"800":{"position":[[661,4]]},"801":{"position":[[534,7]]},"802":{"position":[[81,4],[767,7]]},"821":{"position":[[999,5]]},"863":{"position":[[111,7],[548,4]]},"1044":{"position":[[71,4]]},"1085":{"position":[[2327,7]]},"1126":{"position":[[300,4]]},"1174":{"position":[[421,7],[571,7],[619,7]]},"1188":{"position":[[320,4]]},"1305":{"position":[[30,5],[266,5]]},"1316":{"position":[[3286,5]]}},"keywords":{}}],["leader",{"_index":3758,"title":{"735":{"position":[[0,6]]},"738":{"position":[[8,6]]},"740":{"position":[[17,8]]}},"content":{"653":{"position":[[1330,7]]},"723":{"position":[[861,6]]},"737":{"position":[[51,6],[190,6],[207,6],[313,7],[422,7],[465,6]]},"738":{"position":[[15,6],[52,6]]},"739":{"position":[[180,7],[578,6]]},"740":{"position":[[53,6],[256,8],[348,6],[381,6],[633,6]]},"741":{"position":[[21,6]]},"743":{"position":[[5,6],[74,6]]},"793":{"position":[[1112,6]]},"974":{"position":[[70,7]]},"988":{"position":[[1330,7],[1416,7]]},"989":{"position":[[354,6]]},"1003":{"position":[[107,6],[315,8]]},"1171":{"position":[[290,6]]},"1174":{"position":[[648,6]]},"1301":{"position":[[1212,6],[1246,6],[1332,7],[1372,6],[1472,6]]}},"keywords":{}}],["leaderelect",{"_index":3650,"title":{},"content":{"617":{"position":[[2202,14]]},"1174":{"position":[[373,14]]}},"keywords":{}}],["leaderelector",{"_index":4106,"title":{},"content":{"740":{"position":[[505,13]]}},"keywords":{}}],["leaderelector.ondupl",{"_index":4108,"title":{},"content":{"740":{"position":[[575,25]]}},"keywords":{}}],["leak",{"_index":1974,"title":{},"content":{"346":{"position":[[458,6]]},"616":{"position":[[892,4]]}},"keywords":{}}],["lean",{"_index":5589,"title":{},"content":{"1009":{"position":[[621,5]]}},"keywords":{}}],["leaner",{"_index":1409,"title":{},"content":{"227":{"position":[[283,6]]}},"keywords":{}}],["leap",{"_index":2566,"title":{},"content":{"408":{"position":[[4363,4]]}},"keywords":{}}],["learn",{"_index":857,"title":{"1216":{"position":[[0,5]]}},"content":{"57":{"position":[[118,5],[464,5]]},"306":{"position":[[1,5]]},"318":{"position":[[353,5]]},"347":{"position":[[504,5]]},"362":{"position":[[1575,5]]},"390":{"position":[[266,8]]},"391":{"position":[[204,8],[994,8]]},"392":{"position":[[1991,8]]},"402":{"position":[[1777,8]]},"420":{"position":[[749,5]]},"442":{"position":[[1,5]]},"483":{"position":[[542,8],[696,5]]},"491":{"position":[[766,5],[1862,5]]},"496":{"position":[[859,5]]},"544":{"position":[[151,5]]},"548":{"position":[[1,5]]},"557":{"position":[[1,5],[88,5]]},"567":{"position":[[635,5]]},"591":{"position":[[733,5]]},"608":{"position":[[1,5]]},"644":{"position":[[357,5]]},"663":{"position":[[43,8]]},"686":{"position":[[267,5]]},"710":{"position":[[2449,5]]},"712":{"position":[[1,5]]},"776":{"position":[[77,8]]},"786":{"position":[[1,5]]},"834":{"position":[[154,5]]},"838":{"position":[[3173,5]]},"842":{"position":[[15,5],[177,8]]},"884":{"position":[[58,7]]},"889":{"position":[[1050,5]]},"899":{"position":[[28,5]]},"904":{"position":[[2436,5]]},"987":{"position":[[1088,5]]},"1065":{"position":[[28,5],[100,5],[144,5]]},"1125":{"position":[[875,5]]},"1249":{"position":[[192,7]]},"1309":{"position":[[401,5]]}},"keywords":{}}],["leav",{"_index":2515,"title":{},"content":{"405":{"position":[[174,5]]},"471":{"position":[[159,5]]},"548":{"position":[[115,5]]},"557":{"position":[[246,5]]},"608":{"position":[[115,5]]},"628":{"position":[[261,5]]},"1007":{"position":[[794,6]]},"1134":{"position":[[503,5]]}},"keywords":{}}],["led",{"_index":3902,"title":{},"content":{"689":{"position":[[436,3]]}},"keywords":{}}],["left",{"_index":2242,"title":{},"content":{"392":{"position":[[2305,4]]},"458":{"position":[[390,4]]},"696":{"position":[[1086,4]]},"1198":{"position":[[1487,4]]},"1315":{"position":[[424,4]]},"1317":{"position":[[776,4]]}},"keywords":{}}],["legitim",{"_index":3643,"title":{},"content":{"617":{"position":[[1115,10]]}},"keywords":{}}],["lend",{"_index":2604,"title":{},"content":{"410":{"position":[[1835,4]]}},"keywords":{}}],["length",{"_index":2353,"title":{"926":{"position":[[0,7]]}},"content":{"397":{"position":[[220,6]]},"749":{"position":[[12987,6]]},"863":{"position":[[163,6]]},"918":{"position":[[145,7]]},"926":{"position":[[5,6]]},"1004":{"position":[[361,7]]},"1067":{"position":[[1728,6]]},"1079":{"position":[[386,6]]},"1213":{"position":[[928,11]]}},"keywords":{}}],["less",{"_index":955,"title":{"802":{"position":[[4,4]]}},"content":{"68":{"position":[[86,4]]},"227":{"position":[[116,4]]},"299":{"position":[[911,4]]},"302":{"position":[[612,4]]},"312":{"position":[[284,4]]},"402":{"position":[[486,4],[1010,4],[1072,4],[1232,4],[1346,4],[2608,4]]},"411":{"position":[[1083,4],[1956,4]]},"427":{"position":[[367,4]]},"610":{"position":[[798,4]]},"620":{"position":[[694,4]]},"621":{"position":[[480,4]]},"622":{"position":[[279,4]]},"623":{"position":[[285,4]]},"681":{"position":[[367,4]]},"746":{"position":[[177,4]]},"816":{"position":[[228,4]]},"849":{"position":[[606,5]]},"886":{"position":[[1549,4]]},"1062":{"position":[[124,4]]},"1124":{"position":[[1794,4]]},"1162":{"position":[[696,4]]},"1181":{"position":[[784,4]]},"1192":{"position":[[771,5]]},"1208":{"position":[[552,4]]},"1297":{"position":[[132,4],[564,5]]}},"keywords":{}}],["less"",{"_index":5893,"title":{},"content":{"1085":{"position":[[830,10]]}},"keywords":{}}],["let",{"_index":891,"title":{},"content":{"61":{"position":[[468,7]]},"203":{"position":[[113,4]]},"212":{"position":[[224,4]]},"250":{"position":[[165,4]]},"301":{"position":[[363,7]]},"360":{"position":[[330,7]]},"411":{"position":[[3849,7]]},"412":{"position":[[6168,4]]},"413":{"position":[[59,4]]},"414":{"position":[[72,7]]},"421":{"position":[[772,7]]},"449":{"position":[[7,4]]},"456":{"position":[[51,4]]},"464":{"position":[[6,4],[658,7]]},"465":{"position":[[41,4]]},"466":{"position":[[15,4]]},"467":{"position":[[5,4]]},"488":{"position":[[44,4]]},"562":{"position":[[830,7],[950,7]]},"620":{"position":[[230,4],[734,4]]},"632":{"position":[[656,4]]},"642":{"position":[[127,4]]},"759":{"position":[[1,4]]},"796":{"position":[[246,4],[1175,4]]},"848":{"position":[[1,4]]},"885":{"position":[[130,4],[316,4]]},"1147":{"position":[[215,7]]},"1237":{"position":[[1,4]]},"1294":{"position":[[253,4]]},"1309":{"position":[[341,4]]},"1316":{"position":[[691,4]]}},"keywords":{}}],["let'",{"_index":902,"title":{},"content":{"65":{"position":[[69,5]]},"119":{"position":[[33,5]]},"127":{"position":[[65,5]]},"132":{"position":[[172,5]]},"151":{"position":[[43,5]]},"173":{"position":[[205,5]]},"174":{"position":[[115,5]]},"180":{"position":[[66,5]]},"187":{"position":[[51,5]]},"190":{"position":[[118,5]]},"193":{"position":[[105,5]]},"229":{"position":[[157,5]]},"271":{"position":[[245,5]]},"278":{"position":[[170,5]]},"284":{"position":[[112,5]]},"287":{"position":[[282,5]]},"290":{"position":[[150,5]]},"369":{"position":[[12,5]]},"394":{"position":[[106,5]]},"399":{"position":[[511,5]]},"401":{"position":[[1,5]]},"412":{"position":[[166,5]]},"425":{"position":[[1,5]]},"462":{"position":[[62,5]]},"577":{"position":[[1,5]]},"703":{"position":[[207,5]]},"1315":{"position":[[166,5]]}},"keywords":{}}],["level",{"_index":659,"title":{"982":{"position":[[32,6]]},"983":{"position":[[32,6]]},"1090":{"position":[[44,6]]}},"content":{"42":{"position":[[124,5]]},"45":{"position":[[20,5]]},"52":{"position":[[142,5]]},"61":{"position":[[448,5]]},"114":{"position":[[701,5]]},"131":{"position":[[283,5]]},"140":{"position":[[101,6]]},"181":{"position":[[74,5]]},"235":{"position":[[94,5]]},"291":{"position":[[318,5]]},"331":{"position":[[297,5]]},"344":{"position":[[83,6]]},"354":{"position":[[1519,6]]},"377":{"position":[[296,5]]},"408":{"position":[[3530,5]]},"452":{"position":[[97,5]]},"479":{"position":[[240,5]]},"501":{"position":[[433,6]]},"521":{"position":[[69,6]]},"533":{"position":[[20,5]]},"535":{"position":[[276,6]]},"539":{"position":[[142,5]]},"548":{"position":[[292,5]]},"560":{"position":[[200,6]]},"566":{"position":[[89,6],[340,5],[1371,5]]},"593":{"position":[[20,5]]},"595":{"position":[[289,6]]},"599":{"position":[[151,5]]},"608":{"position":[[290,5]]},"749":{"position":[[2483,5],[17351,5],[17467,5],[17547,5],[18336,5],[19515,5],[21817,6]]},"764":{"position":[[80,5]]},"838":{"position":[[865,5]]},"841":{"position":[[410,5]]},"849":{"position":[[226,5],[382,5]]},"861":{"position":[[2307,6]]},"871":{"position":[[829,5]]},"897":{"position":[[497,5]]},"898":{"position":[[1757,5]]},"899":{"position":[[186,5],[251,5]]},"932":{"position":[[1171,5]]},"982":{"position":[[19,6]]},"1079":{"position":[[65,5]]},"1082":{"position":[[46,5]]},"1084":{"position":[[588,5]]},"1085":{"position":[[862,5],[969,5],[1681,5],[1750,5],[1791,5],[2001,6],[2034,5],[2230,5],[2422,5]]},"1108":{"position":[[607,5]]},"1117":{"position":[[242,5]]},"1125":{"position":[[373,6]]},"1206":{"position":[[377,5]]},"1209":{"position":[[57,5]]},"1222":{"position":[[1101,6]]},"1237":{"position":[[293,5]]},"1250":{"position":[[533,5]]},"1253":{"position":[[60,6]]},"1258":{"position":[[98,5]]}},"keywords":{}}],["level"",{"_index":725,"title":{},"content":{"47":{"position":[[298,11]]}},"keywords":{}}],["leveldb",{"_index":43,"title":{},"content":{"2":{"position":[[159,7],[214,11],[257,7]]},"6":{"position":[[21,7],[318,7],[373,11],[416,7]]},"7":{"position":[[116,7]]},"10":{"position":[[147,11],[190,7]]},"254":{"position":[[355,7]]},"1320":{"position":[[796,7]]}},"keywords":{}}],["leveldown",{"_index":42,"title":{"6":{"position":[[0,10]]}},"content":{"2":{"position":[[61,9],[229,9],[426,9]]},"6":{"position":[[270,9],[388,9],[445,9],[591,9],[789,9]]},"10":{"position":[[3,9],[162,9],[387,9]]},"749":{"position":[[581,9]]}},"keywords":{}}],["leverag",{"_index":937,"title":{},"content":{"65":{"position":[[2027,8]]},"83":{"position":[[429,8]]},"84":{"position":[[32,8]]},"87":{"position":[[4,10]]},"93":{"position":[[152,8]]},"94":{"position":[[177,8]]},"96":{"position":[[199,10]]},"100":{"position":[[237,8]]},"105":{"position":[[183,8]]},"114":{"position":[[32,8],[603,10]]},"120":{"position":[[151,9]]},"121":{"position":[[68,9]]},"124":{"position":[[185,10]]},"136":{"position":[[36,10]]},"146":{"position":[[117,10]]},"149":{"position":[[32,8]]},"151":{"position":[[116,8]]},"155":{"position":[[50,9]]},"165":{"position":[[289,10]]},"173":{"position":[[905,10],[2377,8]]},"174":{"position":[[195,9],[1345,9]]},"175":{"position":[[29,8]]},"182":{"position":[[68,9]]},"196":{"position":[[81,10]]},"198":{"position":[[326,8]]},"215":{"position":[[92,10]]},"222":{"position":[[294,8]]},"224":{"position":[[89,10]]},"227":{"position":[[211,8]]},"230":{"position":[[190,8]]},"232":{"position":[[147,8]]},"239":{"position":[[269,8]]},"241":{"position":[[208,10]]},"265":{"position":[[90,8]]},"267":{"position":[[1301,8]]},"286":{"position":[[260,8]]},"287":{"position":[[462,10]]},"322":{"position":[[69,9]]},"347":{"position":[[32,8]]},"373":{"position":[[208,10]]},"382":{"position":[[51,9]]},"384":{"position":[[219,8]]},"385":{"position":[[170,10]]},"398":{"position":[[395,8]]},"418":{"position":[[747,10]]},"425":{"position":[[73,8]]},"445":{"position":[[827,9],[1401,10],[1842,8]]},"447":{"position":[[327,10]]},"502":{"position":[[717,10]]},"504":{"position":[[93,10],[891,10]]},"511":{"position":[[32,8]]},"523":{"position":[[115,8]]},"531":{"position":[[32,8]]},"548":{"position":[[157,10]]},"556":{"position":[[1140,9]]},"557":{"position":[[368,10]]},"574":{"position":[[443,10]]},"584":{"position":[[53,10]]},"591":{"position":[[32,8]]},"608":{"position":[[157,10]]},"613":{"position":[[122,9]]},"614":{"position":[[608,9]]},"621":{"position":[[795,10]]},"624":{"position":[[203,10]]},"643":{"position":[[115,10]]},"801":{"position":[[811,10]]},"1072":{"position":[[2828,8]]},"1270":{"position":[[325,8]]}},"keywords":{}}],["li",{"_index":1678,"title":{},"content":{"289":{"position":[[49,4]]},"501":{"position":[[22,4]]}},"keywords":{}}],["lib/main.dart",{"_index":1273,"title":{},"content":{"188":{"position":[[2513,13]]}},"keywords":{}}],["librari",{"_index":110,"title":{"478":{"position":[[56,8]]},"1273":{"position":[[49,10]]}},"content":{"8":{"position":[[326,8]]},"11":{"position":[[1059,9]]},"13":{"position":[[178,8]]},"15":{"position":[[111,7]]},"18":{"position":[[44,9]]},"19":{"position":[[33,7]]},"21":{"position":[[28,7]]},"30":{"position":[[24,7]]},"34":{"position":[[61,8]]},"35":{"position":[[37,7]]},"37":{"position":[[187,9]]},"40":{"position":[[58,7]]},"47":{"position":[[338,7]]},"96":{"position":[[110,9]]},"120":{"position":[[170,7]]},"129":{"position":[[340,7]]},"167":{"position":[[289,10]]},"173":{"position":[[3071,9]]},"174":{"position":[[1438,10]]},"188":{"position":[[111,7],[2408,7]]},"219":{"position":[[75,9],[248,10]]},"230":{"position":[[156,10]]},"285":{"position":[[79,7]]},"303":{"position":[[281,7]]},"317":{"position":[[295,8]]},"357":{"position":[[364,7]]},"387":{"position":[[354,10]]},"411":{"position":[[1989,9]]},"412":{"position":[[1086,9],[2146,7],[3804,9],[9221,8],[9954,8],[11745,9],[14432,9]]},"420":{"position":[[80,9],[167,7],[291,7],[438,10]]},"432":{"position":[[1032,9],[1074,9]]},"433":{"position":[[439,7]]},"441":{"position":[[426,9]]},"452":{"position":[[382,9]]},"453":{"position":[[506,7]]},"454":{"position":[[256,9]]},"478":{"position":[[288,9]]},"520":{"position":[[357,9]]},"535":{"position":[[296,7],[491,9]]},"551":{"position":[[287,9],[433,9]]},"595":{"position":[[309,7],[511,9]]},"611":{"position":[[1296,7]]},"613":{"position":[[1028,9]]},"616":{"position":[[1047,7],[1138,7]]},"678":{"position":[[192,8]]},"686":{"position":[[24,9]]},"698":{"position":[[3078,7]]},"723":{"position":[[67,8]]},"785":{"position":[[281,9]]},"836":{"position":[[281,7],[462,7],[581,7]]},"872":{"position":[[81,9]]},"894":{"position":[[19,8]]},"904":{"position":[[1744,7],[2422,8],[2829,7],[2975,7]]},"910":{"position":[[332,9]]},"1041":{"position":[[75,8]]},"1112":{"position":[[543,9]]},"1120":{"position":[[84,10],[199,9],[744,10]]},"1247":{"position":[[222,8]]},"1272":{"position":[[18,9],[104,7],[285,9],[450,7]]},"1276":{"position":[[636,7]]},"1277":{"position":[[699,7]]},"1282":{"position":[[355,9]]},"1292":{"position":[[776,7]]},"1299":{"position":[[461,9]]}},"keywords":{}}],["libraries.bridg",{"_index":4776,"title":{},"content":{"836":{"position":[[1533,18]]}},"keywords":{}}],["librariesfor",{"_index":3338,"title":{},"content":{"551":{"position":[[221,12]]}},"keywords":{}}],["library"",{"_index":1494,"title":{},"content":{"244":{"position":[[584,13]]}},"keywords":{}}],["libraryth",{"_index":4021,"title":{},"content":{"717":{"position":[[138,10]]}},"keywords":{}}],["libspersist",{"_index":3405,"title":{},"content":{"559":{"position":[[926,14]]}},"keywords":{}}],["licens",{"_index":684,"title":{},"content":{"43":{"position":[[619,7]]},"1112":{"position":[[273,7],[379,8]]}},"keywords":{}}],["lie",{"_index":3947,"title":{"699":{"position":[[14,4]]}},"content":{"781":{"position":[[15,3],[47,3]]}},"keywords":{}}],["lifecycl",{"_index":1092,"title":{},"content":{"130":{"position":[[116,9]]},"143":{"position":[[228,10]]},"590":{"position":[[441,9]]},"767":{"position":[[63,10]]},"768":{"position":[[52,10]]},"769":{"position":[[57,10]]},"899":{"position":[[56,9]]}},"keywords":{}}],["lift",{"_index":2947,"title":{},"content":{"446":{"position":[[1039,7]]}},"keywords":{}}],["light",{"_index":2546,"title":{},"content":{"408":{"position":[[2382,5]]},"501":{"position":[[265,5]]},"780":{"position":[[423,5]]}},"keywords":{}}],["lighten",{"_index":3518,"title":{},"content":{"582":{"position":[[693,7]]}},"keywords":{}}],["lightn",{"_index":2124,"title":{},"content":{"369":{"position":[[256,9]]},"500":{"position":[[208,9]]},"562":{"position":[[611,11]]}},"keywords":{}}],["lightweight",{"_index":535,"title":{},"content":{"34":{"position":[[330,12]]},"365":{"position":[[172,11]]},"412":{"position":[[1974,12]]},"441":{"position":[[84,11]]},"574":{"position":[[25,11]]},"659":{"position":[[101,11]]}},"keywords":{}}],["like"",{"_index":3190,"title":{},"content":{"496":{"position":[[153,11]]},"981":{"position":[[193,10]]}},"keywords":{}}],["likeerror",{"_index":5901,"title":{},"content":{"1085":{"position":[[2808,10]]}},"keywords":{}}],["likelihood",{"_index":3207,"title":{},"content":{"497":{"position":[[568,10]]}},"keywords":{}}],["likes."",{"_index":3198,"title":{},"content":{"497":{"position":[[69,13]]}},"keywords":{}}],["liketestdata",{"_index":4715,"title":{},"content":{"821":{"position":[[570,13]]}},"keywords":{}}],["likewis",{"_index":1764,"title":{},"content":{"299":{"position":[[1481,9]]}},"keywords":{}}],["limit",{"_index":703,"title":{"58":{"position":[[0,11]]},"66":{"position":[[16,12]]},"252":{"position":[[6,6]]},"297":{"position":[[27,5]]},"298":{"position":[[28,6]]},"299":{"position":[[27,7]]},"302":{"position":[[21,6]]},"303":{"position":[[34,11]]},"305":{"position":[[16,5]]},"406":{"position":[[56,11]]},"412":{"position":[[15,11]]},"417":{"position":[[27,7]]},"427":{"position":[[18,11]]},"461":{"position":[[13,7]]},"545":{"position":[[0,11]]},"605":{"position":[[0,11]]},"615":{"position":[[0,11]]},"617":{"position":[[22,6]]},"650":{"position":[[0,12]]},"849":{"position":[[0,12]]},"863":{"position":[[0,11]]},"1141":{"position":[[0,11]]},"1157":{"position":[[0,12]]},"1186":{"position":[[11,6]]},"1188":{"position":[[0,11]]},"1207":{"position":[[5,12]]},"1232":{"position":[[0,12]]}},"content":{"46":{"position":[[63,7]]},"47":{"position":[[536,7]]},"58":{"position":[[238,7],[343,6]]},"63":{"position":[[181,12]]},"66":{"position":[[118,12],[399,12],[496,10]]},"83":{"position":[[271,11]]},"169":{"position":[[299,7]]},"205":{"position":[[53,7]]},"215":{"position":[[346,7]]},"225":{"position":[[63,11]]},"229":{"position":[[68,11]]},"232":{"position":[[305,7]]},"252":{"position":[[29,7],[86,7]]},"287":{"position":[[14,5]]},"289":{"position":[[1865,7]]},"298":{"position":[[874,6]]},"299":{"position":[[154,6],[227,5],[661,5],[1185,6],[1506,5]]},"300":{"position":[[59,7]]},"301":{"position":[[408,5],[479,7]]},"303":{"position":[[1313,12]]},"305":{"position":[[297,7]]},"306":{"position":[[348,5]]},"366":{"position":[[546,10]]},"398":{"position":[[1151,6],[1312,6],[2933,5]]},"402":{"position":[[2377,6]]},"407":{"position":[[836,7]]},"408":{"position":[[189,7],[274,11],[363,6],[705,6],[842,7],[2407,11],[2633,6],[2722,5],[3756,10]]},"410":{"position":[[538,5]]},"412":{"position":[[6675,7],[7034,5],[7676,13]]},"427":{"position":[[63,11],[471,7],[1032,10],[1461,6],[1504,5]]},"432":{"position":[[311,5]]},"434":{"position":[[125,12]]},"436":{"position":[[345,7]]},"441":{"position":[[562,11]]},"444":{"position":[[225,7]]},"451":{"position":[[390,7]]},"459":{"position":[[1012,10]]},"461":{"position":[[13,7],[136,10],[196,6],[638,10],[775,5],[956,10],[1074,5],[1261,5],[1443,6],[1518,10],[1547,5]]},"495":{"position":[[739,7],[793,7]]},"504":{"position":[[1498,8]]},"528":{"position":[[188,7]]},"535":{"position":[[428,5]]},"545":{"position":[[51,12],[159,7],[183,6],[243,6]]},"559":{"position":[[1058,12]]},"560":{"position":[[36,7]]},"595":{"position":[[456,5]]},"605":{"position":[[51,12],[159,7],[183,6],[243,7]]},"613":{"position":[[825,6]]},"617":{"position":[[64,6],[139,10],[325,10],[516,5],[1155,10],[1470,6],[1599,5]]},"624":{"position":[[1059,6],[1651,12]]},"696":{"position":[[328,5],[742,5],[963,5],[1808,6]]},"703":{"position":[[1672,5]]},"704":{"position":[[464,6]]},"714":{"position":[[436,10]]},"724":{"position":[[1846,6]]},"749":{"position":[[2886,5],[9314,7],[9394,6],[23371,7],[23503,7]]},"773":{"position":[[669,5],[780,5],[851,5]]},"774":{"position":[[966,7]]},"780":{"position":[[42,8],[177,8]]},"786":{"position":[[203,11]]},"796":{"position":[[370,6],[666,6],[1086,6]]},"839":{"position":[[648,7]]},"841":{"position":[[467,7],[1098,8]]},"845":{"position":[[104,7]]},"849":{"position":[[92,10],[205,10],[323,6],[353,10],[847,5]]},"885":{"position":[[880,6],[2654,8]]},"886":{"position":[[148,5],[401,6],[621,7],[672,6],[679,7],[836,5],[1701,5]]},"958":{"position":[[488,5],[607,7],[637,6]]},"1007":{"position":[[1496,6]]},"1067":{"position":[[345,7]]},"1072":{"position":[[166,7],[1837,10]]},"1157":{"position":[[92,7],[133,5],[192,6],[389,12]]},"1191":{"position":[[133,6]]},"1207":{"position":[[621,5]]},"1271":{"position":[[409,7]]},"1295":{"position":[[1437,5]]},"1318":{"position":[[774,5]]},"1321":{"position":[[11,7]]}},"keywords":{}}],["limit"",{"_index":1463,"title":{},"content":{"243":{"position":[[567,11],[668,11]]}},"keywords":{}}],["limit(parseint(req.query.batchs",{"_index":4997,"title":{},"content":{"875":{"position":[[2563,36]]}},"keywords":{}}],["limit.html",{"_index":1472,"title":{},"content":{"243":{"position":[[931,10]]}},"keywords":{}}],["limit.htmlx",{"_index":1467,"title":{},"content":{"243":{"position":[[634,11],[735,11],[834,11]]}},"keywords":{}}],["limiteddoc",{"_index":5107,"title":{},"content":{"885":{"position":[[2355,11],[2606,12]]}},"keywords":{}}],["limiteddocs[limiteddocs.length",{"_index":5111,"title":{},"content":{"885":{"position":[[2478,30]]}},"keywords":{}}],["limits"",{"_index":1470,"title":{},"content":{"243":{"position":[[863,12]]}},"keywords":{}}],["line",{"_index":1566,"title":{},"content":{"254":{"position":[[196,4]]},"612":{"position":[[567,4],[2046,5]]},"838":{"position":[[1714,5]]}},"keywords":{}}],["linearli",{"_index":5241,"title":{},"content":{"902":{"position":[[267,8]]}},"keywords":{}}],["linebreak",{"_index":4289,"title":{},"content":{"749":{"position":[[11717,9]]}},"keywords":{}}],["link",{"_index":109,"title":{},"content":{"8":{"position":[[317,4],[349,4]]},"11":{"position":[[421,5]]},"50":{"position":[[359,5]]},"212":{"position":[[617,4]]},"408":{"position":[[2439,6]]},"670":{"position":[[121,4]]},"724":{"position":[[1417,5],[1723,5]]},"846":{"position":[[954,5]]},"901":{"position":[[384,6]]},"1189":{"position":[[507,5]]},"1201":{"position":[[295,5]]},"1226":{"position":[[476,5]]},"1264":{"position":[[379,5]]},"1274":{"position":[[216,5]]},"1276":{"position":[[672,5]]},"1324":{"position":[[1071,5]]}},"keywords":{}}],["linkedin",{"_index":4631,"title":{},"content":{"793":{"position":[[1504,8]]}},"keywords":{}}],["lirst",{"_index":658,"title":{},"content":{"42":{"position":[[47,5]]}},"keywords":{}}],["list",{"_index":188,"title":{"763":{"position":[[0,5]]},"1240":{"position":[[30,5]]}},"content":{"13":{"position":[[97,4],[203,4]]},"188":{"position":[[3110,4]]},"335":{"position":[[333,4],[952,4]]},"395":{"position":[[469,5]]},"401":{"position":[[123,5]]},"404":{"position":[[795,4]]},"412":{"position":[[369,4],[14896,4]]},"422":{"position":[[67,4]]},"459":{"position":[[212,4]]},"469":{"position":[[127,4]]},"493":{"position":[[506,4]]},"571":{"position":[[1058,4]]},"663":{"position":[[112,4]]},"712":{"position":[[131,4]]},"717":{"position":[[1383,4]]},"776":{"position":[[138,4]]},"805":{"position":[[230,4]]},"806":{"position":[[153,4],[399,4]]},"824":{"position":[[280,4]]},"825":{"position":[[718,6]]},"842":{"position":[[246,4]]},"885":{"position":[[183,4],[1082,4],[1162,5]]},"951":{"position":[[542,4]]},"962":{"position":[[565,4]]},"1119":{"position":[[61,4]]},"1316":{"position":[[1598,4]]},"1321":{"position":[[674,4]]}},"keywords":{}}],["list</h2>",{"_index":3314,"title":{},"content":{"541":{"position":[[560,15]]},"601":{"position":[[121,15]]},"602":{"position":[[427,15]]}},"keywords":{}}],["list<rxdocument<rxherodoctype>>",{"_index":1289,"title":{},"content":{"188":{"position":[[3138,43]]}},"keywords":{}}],["listen",{"_index":1125,"title":{},"content":{"140":{"position":[[49,6]]},"168":{"position":[[156,6]]},"204":{"position":[[60,8]]},"344":{"position":[[23,6]]},"392":{"position":[[3344,7],[4300,8],[4416,10],[4467,10]]},"612":{"position":[[833,9]]},"649":{"position":[[9,6]]},"655":{"position":[[229,9]]},"698":{"position":[[1004,9]]},"875":{"position":[[1241,9]]},"1150":{"position":[[511,9]]}},"keywords":{}}],["live",{"_index":735,"title":{"53":{"position":[[21,4]]},"540":{"position":[[21,4]]},"600":{"position":[[21,4]]},"648":{"position":[[0,4]]},"741":{"position":[[0,4]]},"905":{"position":[[0,4]]}},"content":{"47":{"position":[[750,4]]},"152":{"position":[[57,6]]},"209":{"position":[[1251,5]]},"255":{"position":[[1553,5]]},"261":{"position":[[1012,4]]},"318":{"position":[[111,4]]},"356":{"position":[[824,4]]},"407":{"position":[[56,5]]},"410":{"position":[[1912,5]]},"411":{"position":[[3114,4]]},"421":{"position":[[282,4]]},"445":{"position":[[968,4]]},"450":{"position":[[231,4]]},"476":{"position":[[322,4]]},"479":{"position":[[62,5]]},"481":{"position":[[813,5]]},"493":{"position":[[374,4]]},"498":{"position":[[252,4]]},"502":{"position":[[648,4]]},"529":{"position":[[239,4]]},"540":{"position":[[131,4]]},"541":{"position":[[152,4]]},"570":{"position":[[767,4]]},"601":{"position":[[57,4]]},"611":{"position":[[76,5],[299,4]]},"612":{"position":[[232,4]]},"613":{"position":[[463,4]]},"624":{"position":[[588,4],[820,4]]},"626":{"position":[[261,4]]},"632":{"position":[[271,4],[2583,5]]},"647":{"position":[[222,5]]},"648":{"position":[[6,5],[124,5],[161,5]]},"649":{"position":[[116,5]]},"736":{"position":[[153,4]]},"739":{"position":[[529,5]]},"749":{"position":[[14859,5]]},"775":{"position":[[360,4]]},"829":{"position":[[2927,4],[2960,4]]},"846":{"position":[[333,4],[407,5]]},"854":{"position":[[1022,4],[1073,5]]},"860":{"position":[[625,4]]},"862":{"position":[[1508,6]]},"866":{"position":[[838,5]]},"871":{"position":[[457,4]]},"872":{"position":[[2628,5],[4582,5]]},"878":{"position":[[557,5]]},"886":{"position":[[1974,5]]},"897":{"position":[[318,4]]},"898":{"position":[[3446,5]]},"903":{"position":[[253,4]]},"905":{"position":[[34,4],[185,5]]},"988":{"position":[[686,5],[848,5]]},"1000":{"position":[[66,4]]},"1039":{"position":[[154,4]]},"1150":{"position":[[255,4]]},"1324":{"position":[[833,6]]}},"keywords":{}}],["live=tru",{"_index":5472,"title":{},"content":{"988":{"position":[[4819,9]]}},"keywords":{}}],["livequeri",{"_index":2631,"title":{"1150":{"position":[[0,9]]}},"content":{"411":{"position":[[3838,10]]},"1150":{"position":[[34,9]]}},"keywords":{}}],["load",{"_index":149,"title":{"474":{"position":[[8,7]]},"477":{"position":[[18,5]]},"623":{"position":[[23,5]]},"778":{"position":[[21,7]]},"799":{"position":[[29,5]]},"1089":{"position":[[30,5]]},"1238":{"position":[[11,5]]}},"content":{"11":{"position":[[267,6],[411,7]]},"46":{"position":[[381,7],[601,4]]},"65":{"position":[[1383,4]]},"69":{"position":[[97,4]]},"227":{"position":[[408,7]]},"266":{"position":[[1039,4]]},"283":{"position":[[272,7]]},"315":{"position":[[1107,7]]},"385":{"position":[[11,7]]},"400":{"position":[[694,7]]},"408":{"position":[[5532,5]]},"410":{"position":[[328,7]]},"411":{"position":[[16,5],[814,5],[1035,4]]},"412":{"position":[[6656,4]]},"415":{"position":[[361,7]]},"421":{"position":[[618,7],[1135,7]]},"454":{"position":[[763,5]]},"474":{"position":[[73,7]]},"483":{"position":[[409,7],[865,5]]},"486":{"position":[[4,7]]},"487":{"position":[[159,5]]},"500":{"position":[[200,4],[539,7]]},"523":{"position":[[600,13]]},"524":{"position":[[868,6]]},"534":{"position":[[354,7],[604,4]]},"582":{"position":[[708,4]]},"594":{"position":[[352,7],[602,4]]},"610":{"position":[[729,5]]},"620":{"position":[[175,5]]},"623":{"position":[[99,5],[503,4],[751,4]]},"630":{"position":[[756,5]]},"653":{"position":[[664,5]]},"656":{"position":[[331,4]]},"696":{"position":[[48,6],[122,4],[187,4]]},"752":{"position":[[331,7]]},"753":{"position":[[184,7]]},"772":{"position":[[1998,4]]},"774":{"position":[[167,4]]},"778":{"position":[[277,7],[426,7],[486,7]]},"780":{"position":[[77,7]]},"781":{"position":[[127,6]]},"782":{"position":[[120,5]]},"783":{"position":[[132,4],[503,7],[588,7],[623,7]]},"784":{"position":[[789,4]]},"785":{"position":[[131,6]]},"800":{"position":[[730,6]]},"802":{"position":[[880,4]]},"829":{"position":[[1626,7],[2502,7],[2536,9],[3214,7],[3417,7],[3455,9]]},"860":{"position":[[941,5]]},"958":{"position":[[151,4]]},"995":{"position":[[732,7],[1798,7]]},"1088":{"position":[[739,4]]},"1089":{"position":[[255,4]]},"1095":{"position":[[215,4]]},"1161":{"position":[[115,4],[131,4]]},"1162":{"position":[[595,4]]},"1164":{"position":[[388,5]]},"1170":{"position":[[93,4],[114,5],[248,4]]},"1174":{"position":[[121,5]]},"1175":{"position":[[196,5],[313,4],[565,4],[668,4]]},"1180":{"position":[[115,4],[131,4]]},"1181":{"position":[[621,7],[683,4]]},"1186":{"position":[[120,4]]},"1192":{"position":[[431,7],[478,4]]},"1238":{"position":[[360,5]]},"1239":{"position":[[328,6]]},"1246":{"position":[[198,4],[518,4],[1814,4]]},"1267":{"position":[[372,5]]},"1271":{"position":[[649,4]]},"1295":{"position":[[324,4],[469,4],[1491,4]]},"1299":{"position":[[137,6],[180,5]]},"1301":{"position":[[1432,4]]}},"keywords":{}}],["loader",{"_index":6318,"title":{},"content":{"1266":{"position":[[794,7],[809,8]]}},"keywords":{}}],["local",{"_index":185,"title":{"90":{"position":[[47,5]]},"92":{"position":[[16,7]]},"95":{"position":[[6,5]]},"96":{"position":[[8,5]]},"139":{"position":[[14,5]]},"167":{"position":[[14,5]]},"195":{"position":[[14,5]]},"205":{"position":[[12,5]]},"218":{"position":[[24,5]]},"219":{"position":[[0,5]]},"220":{"position":[[12,5]]},"221":{"position":[[36,5]]},"274":{"position":[[0,5]]},"307":{"position":[[7,5]]},"343":{"position":[[14,5]]},"374":{"position":[[10,5],[50,5]]},"375":{"position":[[13,5]]},"389":{"position":[[0,5]]},"391":{"position":[[22,7]]},"404":{"position":[[32,5]]},"406":{"position":[[4,5]]},"407":{"position":[[12,5]]},"408":{"position":[[4,5]]},"409":{"position":[[27,5]]},"412":{"position":[[30,5]]},"413":{"position":[[0,5]]},"419":{"position":[[18,5]]},"420":{"position":[[23,5]]},"421":{"position":[[4,5]]},"425":{"position":[[10,5]]},"427":{"position":[[33,5]]},"489":{"position":[[0,5]]},"506":{"position":[[14,5]]},"516":{"position":[[0,5]]},"586":{"position":[[14,5]]},"629":{"position":[[13,5]]},"630":{"position":[[24,5]]},"631":{"position":[[31,5]]},"634":{"position":[[17,5]]},"695":{"position":[[13,5]]},"713":{"position":[[13,5]]},"723":{"position":[[20,5]]},"777":{"position":[[0,5]]},"980":{"position":[[32,5]]},"1009":{"position":[[18,5]]},"1011":{"position":[[0,5]]},"1012":{"position":[[8,5]]},"1307":{"position":[[0,5]]}},"content":{"13":{"position":[[37,5]]},"19":{"position":[[438,5]]},"34":{"position":[[19,5]]},"35":{"position":[[332,7]]},"38":{"position":[[82,5],[169,5],[220,5]]},"39":{"position":[[119,7]]},"40":{"position":[[419,5]]},"41":{"position":[[222,5]]},"42":{"position":[[41,5]]},"43":{"position":[[55,5]]},"46":{"position":[[130,5],[265,5],[564,5]]},"47":{"position":[[414,5]]},"57":{"position":[[24,5],[83,5]]},"58":{"position":[[329,5]]},"59":{"position":[[275,8]]},"61":{"position":[[298,5]]},"65":{"position":[[820,7],[879,5],[1052,7],[1536,5]]},"66":{"position":[[482,8]]},"87":{"position":[[106,7]]},"90":{"position":[[8,5],[114,5]]},"91":{"position":[[92,7]]},"92":{"position":[[58,8]]},"93":{"position":[[165,5]]},"95":{"position":[[155,5]]},"96":{"position":[[13,5]]},"122":{"position":[[169,7]]},"133":{"position":[[163,7]]},"139":{"position":[[47,5]]},"157":{"position":[[161,7]]},"164":{"position":[[153,8]]},"167":{"position":[[85,5]]},"172":{"position":[[305,7]]},"173":{"position":[[69,5],[890,5],[916,5],[1145,5],[1231,5],[1334,7],[1682,8],[1901,5],[1966,7],[2493,7],[2566,7],[2984,5],[3138,5]]},"183":{"position":[[178,7]]},"188":{"position":[[2209,5]]},"189":{"position":[[80,8]]},"195":{"position":[[66,5]]},"201":{"position":[[308,8],[398,5]]},"204":{"position":[[182,8]]},"205":{"position":[[162,5],[363,8]]},"206":{"position":[[115,5]]},"208":{"position":[[206,5]]},"209":{"position":[[757,5]]},"211":{"position":[[47,5]]},"212":{"position":[[254,8],[320,7]]},"215":{"position":[[162,8]]},"216":{"position":[[100,8]]},"217":{"position":[[111,8]]},"218":{"position":[[107,5]]},"219":{"position":[[120,5]]},"220":{"position":[[176,8]]},"221":{"position":[[94,7]]},"224":{"position":[[230,8]]},"243":{"position":[[443,5]]},"244":{"position":[[46,5],[1507,5]]},"248":{"position":[[112,8],[272,5]]},"251":{"position":[[73,7],[94,5]]},"252":{"position":[[138,8]]},"254":{"position":[[490,5]]},"255":{"position":[[159,5]]},"260":{"position":[[179,5]]},"261":{"position":[[1095,5]]},"262":{"position":[[86,5],[258,6]]},"263":{"position":[[285,5],[488,5]]},"266":{"position":[[165,7]]},"273":{"position":[[60,5]]},"274":{"position":[[5,5],[98,7]]},"280":{"position":[[151,5]]},"292":{"position":[[148,7]]},"293":{"position":[[247,5]]},"305":{"position":[[596,5]]},"309":{"position":[[152,7]]},"315":{"position":[[11,5]]},"318":{"position":[[213,5],[650,5]]},"320":{"position":[[369,7]]},"321":{"position":[[81,7]]},"322":{"position":[[191,8]]},"338":{"position":[[86,8]]},"358":{"position":[[117,5]]},"360":{"position":[[1,5],[386,7],[564,8]]},"362":{"position":[[767,5]]},"365":{"position":[[116,5],[498,5]]},"375":{"position":[[1,5],[345,5],[710,5],[791,7],[845,5]]},"376":{"position":[[38,5],[627,5]]},"377":{"position":[[151,5]]},"388":{"position":[[150,5],[504,5]]},"391":{"position":[[31,5],[938,8]]},"392":{"position":[[2978,7]]},"396":{"position":[[96,8],[1476,5],[1819,8]]},"398":{"position":[[3463,5]]},"399":{"position":[[108,5],[373,5]]},"402":{"position":[[72,5]]},"407":{"position":[[4,5],[197,5],[526,5],[640,5],[875,5],[987,5]]},"408":{"position":[[14,5],[141,5],[215,5],[1317,7],[1422,5],[1789,5],[2665,5],[3262,5],[4183,5],[4265,5],[4321,5],[4433,5],[5420,5]]},"409":{"position":[[163,5]]},"410":{"position":[[36,5],[149,5],[223,5],[446,5],[526,7],[1295,5],[1374,7],[1799,5],[1923,5],[1982,6],[2136,5]]},"411":{"position":[[30,5],[1121,5],[1423,5],[1895,5],[2172,5],[2542,5],[2575,5],[2766,7],[2948,5],[3760,5],[4291,5],[4427,5],[4559,5],[4903,5],[5442,5],[5771,5]]},"412":{"position":[[153,5],[289,5],[425,5],[581,5],[2656,5],[3213,5],[4311,5],[5210,5],[5630,5],[6582,5],[6683,5],[6920,5],[7209,5],[7359,5],[7401,5],[7534,9],[7554,5],[8161,5],[8227,5],[8274,5],[8424,5],[8624,5],[8965,5],[9491,5],[9723,5],[10870,5],[11177,5],[11259,5],[11718,5],[12226,5],[13264,5],[14203,5],[14750,5],[14790,5],[14928,5],[15088,5],[15399,5]]},"413":{"position":[[46,5]]},"414":{"position":[[1,5],[48,7]]},"415":{"position":[[1,5]]},"416":{"position":[[1,5],[144,7]]},"417":{"position":[[1,5]]},"418":{"position":[[1,5],[707,5],[827,5]]},"419":{"position":[[483,8],[811,7],[913,5],[1455,5],[1678,5],[1809,8]]},"420":{"position":[[94,5],[215,5],[341,5],[426,5],[538,5],[666,5],[1141,5],[1549,5]]},"421":{"position":[[526,5],[708,5],[1194,5]]},"422":{"position":[[147,5],[308,5],[350,5],[421,5]]},"440":{"position":[[140,7],[358,7]]},"444":{"position":[[428,5],[810,5]]},"445":{"position":[[560,8]]},"473":{"position":[[18,5]]},"475":{"position":[[108,5]]},"476":{"position":[[141,5],[275,5]]},"477":{"position":[[198,5]]},"478":{"position":[[210,5]]},"480":{"position":[[328,5]]},"481":{"position":[[37,5],[114,5],[784,5]]},"482":{"position":[[1,5]]},"483":{"position":[[230,5],[499,6],[797,5]]},"487":{"position":[[185,7]]},"489":{"position":[[3,5],[95,8],[457,5],[493,5],[631,8]]},"490":{"position":[[88,5]]},"491":{"position":[[7,5],[176,5],[294,5],[792,5],[1206,5]]},"501":{"position":[[363,5]]},"502":{"position":[[219,5],[286,5]]},"506":{"position":[[48,5]]},"510":{"position":[[248,5]]},"516":{"position":[[17,5],[130,8],[311,5]]},"526":{"position":[[15,5],[128,7]]},"534":{"position":[[188,5],[217,8],[317,5],[578,5]]},"544":{"position":[[106,5]]},"551":{"position":[[47,5]]},"562":{"position":[[1683,7]]},"565":{"position":[[166,5]]},"566":{"position":[[1073,6]]},"574":{"position":[[349,7],[454,5]]},"575":{"position":[[353,7]]},"576":{"position":[[60,5]]},"582":{"position":[[56,7],[173,5],[315,5]]},"584":{"position":[[71,5]]},"586":{"position":[[78,5]]},"594":{"position":[[186,5],[215,8],[315,5],[576,5]]},"604":{"position":[[106,5]]},"630":{"position":[[215,5],[582,5],[939,5]]},"631":{"position":[[483,5]]},"632":{"position":[[85,5],[1022,5],[1218,5],[1727,5],[1942,7],[2341,5],[2549,5]]},"634":{"position":[[3,5]]},"635":{"position":[[4,5]]},"636":{"position":[[149,5],[375,5]]},"638":{"position":[[19,8]]},"639":{"position":[[1,5]]},"640":{"position":[[492,5]]},"641":{"position":[[12,5]]},"644":{"position":[[50,5],[613,5]]},"662":{"position":[[14,5]]},"670":{"position":[[495,8]]},"697":{"position":[[339,5]]},"699":{"position":[[714,5]]},"700":{"position":[[223,5]]},"702":{"position":[[576,5]]},"711":{"position":[[152,8]]},"719":{"position":[[380,5]]},"723":{"position":[[350,5],[431,5],[656,5]]},"749":{"position":[[13689,5],[14220,5],[14291,5],[14466,5]]},"775":{"position":[[9,6]]},"778":{"position":[[356,5]]},"780":{"position":[[783,8]]},"785":{"position":[[528,5]]},"786":{"position":[[138,5],[160,5]]},"793":{"position":[[1081,5]]},"826":{"position":[[992,5]]},"836":{"position":[[2265,5]]},"838":{"position":[[14,5]]},"839":{"position":[[1225,5]]},"841":{"position":[[140,5],[618,5],[1358,5],[1485,5]]},"846":{"position":[[1099,5]]},"856":{"position":[[85,7],[210,7]]},"860":{"position":[[358,8],[1199,5]]},"861":{"position":[[1810,7],[2179,5]]},"872":{"position":[[298,7],[492,8]]},"873":{"position":[[62,5]]},"898":{"position":[[2942,5]]},"899":{"position":[[150,5]]},"902":{"position":[[507,5],[734,5]]},"903":{"position":[[391,5]]},"912":{"position":[[325,8]]},"988":{"position":[[738,5],[2345,5],[2453,5],[3469,5]]},"995":{"position":[[82,5],[1249,5]]},"1006":{"position":[[123,7],[220,5]]},"1007":{"position":[[593,5],[1098,5]]},"1008":{"position":[[201,5]]},"1009":{"position":[[607,5],[721,5]]},"1012":{"position":[[15,5],[52,5]]},"1013":{"position":[[29,5],[195,5],[241,5],[427,5],[579,5],[646,5]]},"1014":{"position":[[11,5],[70,5],[288,5]]},"1015":{"position":[[11,5]]},"1018":{"position":[[355,5]]},"1021":{"position":[[126,5]]},"1022":{"position":[[68,7],[260,7]]},"1124":{"position":[[1500,5],[1648,7],[1844,7]]},"1140":{"position":[[62,7]]},"1147":{"position":[[13,5]]},"1148":{"position":[[230,5]]},"1306":{"position":[[47,5]]},"1307":{"position":[[3,5],[423,5],[596,5]]},"1308":{"position":[[531,5]]},"1315":{"position":[[932,5],[1103,8]]},"1316":{"position":[[989,5],[3764,8]]}},"keywords":{}}],["localdb",{"_index":1344,"title":{},"content":{"209":{"position":[[267,10]]}},"keywords":{}}],["localdoc",{"_index":5599,"title":{},"content":{"1014":{"position":[[183,8],[324,8]]},"1015":{"position":[[159,8]]},"1016":{"position":[[118,8]]},"1018":{"position":[[60,8],[780,8]]}},"keywords":{}}],["localdoc.foo",{"_index":5613,"title":{},"content":{"1018":{"position":[[475,13],[545,12]]}},"keywords":{}}],["localdoc.get$('foo').subscribe(valu",{"_index":5611,"title":{},"content":{"1018":{"position":[[241,36]]}},"keywords":{}}],["localdoc.get('foo",{"_index":5608,"title":{},"content":{"1018":{"position":[[137,20],[514,20]]}},"keywords":{}}],["localdoc.remov",{"_index":5612,"title":{},"content":{"1018":{"position":[[318,18]]}},"keywords":{}}],["localdoc.sav",{"_index":5610,"title":{},"content":{"1018":{"position":[[208,16]]}},"keywords":{}}],["localdoc.set('foo",{"_index":5609,"title":{},"content":{"1018":{"position":[[173,19],[585,19]]}},"keywords":{}}],["localdoc.tojson().foo",{"_index":5617,"title":{},"content":{"1018":{"position":[[957,22]]}},"keywords":{}}],["localdocu",{"_index":4320,"title":{},"content":{"749":{"position":[[14179,14],[14376,14]]},"1013":{"position":[[151,15],[374,15],[526,15],[724,15]]}},"keywords":{}}],["localdocuments=tru",{"_index":4323,"title":{},"content":{"749":{"position":[[14410,19]]}},"keywords":{}}],["localforag",{"_index":547,"title":{"35":{"position":[[0,12]]}},"content":{"35":{"position":[[1,11],[294,11],[490,11]]}},"keywords":{}}],["localhost",{"_index":3862,"title":{},"content":{"676":{"position":[[14,9]]},"968":{"position":[[718,9]]}},"keywords":{}}],["localhost:4222",{"_index":4931,"title":{},"content":{"866":{"position":[[818,16]]}},"keywords":{}}],["locally.background",{"_index":3700,"title":{},"content":{"632":{"position":[[349,18]]}},"keywords":{}}],["locally.y",{"_index":1594,"title":{},"content":{"262":{"position":[[465,11]]}},"keywords":{}}],["locally—provid",{"_index":3103,"title":{},"content":{"474":{"position":[[150,17]]}},"keywords":{}}],["localst",{"_index":6146,"title":{},"content":{"1177":{"position":[[290,10]]}},"keywords":{}}],["localstate.collection.insert",{"_index":6148,"title":{},"content":{"1177":{"position":[[347,30]]}},"keywords":{}}],["localstate.databasestate.savequeue.addwrit",{"_index":6152,"title":{},"content":{"1177":{"position":[[613,46]]}},"keywords":{}}],["localstorag",{"_index":275,"title":{"63":{"position":[[0,13]]},"314":{"position":[[36,12]]},"423":{"position":[[6,12]]},"424":{"position":[[12,12]]},"428":{"position":[[21,13]]},"429":{"position":[[3,12]]},"430":{"position":[[16,13]]},"431":{"position":[[27,12]]},"432":{"position":[[0,12]]},"434":{"position":[[0,12]]},"435":{"position":[[0,12]]},"436":{"position":[[0,12]]},"438":{"position":[[5,12]]},"439":{"position":[[0,12]]},"440":{"position":[[0,12]]},"448":{"position":[[0,12]]},"451":{"position":[[8,13]]},"558":{"position":[[29,12]]},"559":{"position":[[37,13]]},"560":{"position":[[8,12]]},"566":{"position":[[10,12]]},"709":{"position":[[0,12]]},"1153":{"position":[[10,12]]},"1155":{"position":[[10,12]]},"1158":{"position":[[15,12]]},"1159":{"position":[[12,12]]},"1242":{"position":[[0,13]]}},"content":{"16":{"position":[[330,12]]},"35":{"position":[[185,13]]},"51":{"position":[[83,12],[527,12],[613,14]]},"55":{"position":[[785,14]]},"63":{"position":[[1,12]]},"65":{"position":[[1946,12]]},"66":{"position":[[32,12]]},"131":{"position":[[108,12],[141,12]]},"162":{"position":[[153,12],[206,12]]},"209":{"position":[[118,14]]},"211":{"position":[[180,14]]},"255":{"position":[[465,14]]},"258":{"position":[[118,14]]},"287":{"position":[[338,12],[384,13]]},"299":{"position":[[1610,13],[1715,12]]},"314":{"position":[[76,12],[417,14]]},"315":{"position":[[314,14]]},"318":{"position":[[196,12]]},"321":{"position":[[371,13]]},"331":{"position":[[43,12]]},"334":{"position":[[269,14]]},"336":{"position":[[126,13],[503,12]]},"368":{"position":[[161,12]]},"392":{"position":[[77,12],[131,13],[311,14]]},"408":{"position":[[341,12]]},"424":{"position":[[5,12]]},"425":{"position":[[95,13]]},"426":{"position":[[10,12]]},"427":{"position":[[26,12],[172,12],[267,12],[455,12],[676,12],[884,12],[1155,12],[1344,12],[1544,13]]},"429":{"position":[[45,12],[315,12],[429,12],[489,12],[509,12]]},"430":{"position":[[7,12],[268,12],[463,12],[746,12]]},"432":{"position":[[7,12],[269,13],[591,12],[781,12],[1315,13],[1393,12]]},"434":{"position":[[218,12]]},"437":{"position":[[100,12],[186,13]]},"438":{"position":[[16,12],[113,12],[198,12],[278,12]]},"439":{"position":[[61,12],[349,13]]},"440":{"position":[[43,12],[221,12],[264,12],[330,13]]},"441":{"position":[[41,12]]},"451":{"position":[[5,12],[90,12],[279,12],[768,12]]},"458":{"position":[[557,12],[712,12]]},"459":{"position":[[360,12]]},"460":{"position":[[707,12],[1023,13]]},"461":{"position":[[606,12],[757,12],[972,13]]},"462":{"position":[[912,13]]},"463":{"position":[[238,12]]},"464":{"position":[[295,12],[461,12]]},"465":{"position":[[156,12],[322,12]]},"466":{"position":[[121,12]]},"467":{"position":[[93,12]]},"468":{"position":[[1,12]]},"469":{"position":[[622,12],[683,12]]},"480":{"position":[[275,14]]},"482":{"position":[[276,14]]},"504":{"position":[[69,12],[137,12]]},"521":{"position":[[402,12]]},"522":{"position":[[382,14]]},"524":{"position":[[211,12],[264,12]]},"538":{"position":[[51,12],[215,12],[376,14]]},"542":{"position":[[496,14]]},"559":{"position":[[1,12],[549,12],[825,12],[989,12],[1104,12],[1387,12],[1561,12]]},"560":{"position":[[7,12],[283,13]]},"562":{"position":[[105,14]]},"563":{"position":[[315,14]]},"564":{"position":[[379,14]]},"566":{"position":[[16,12]]},"567":{"position":[[935,12]]},"579":{"position":[[121,12],[271,14]]},"581":{"position":[[131,12],[173,12]]},"598":{"position":[[51,12],[216,12],[371,14]]},"632":{"position":[[1156,14],[1244,12]]},"653":{"position":[[221,14]]},"659":{"position":[[143,12]]},"660":{"position":[[66,12]]},"662":{"position":[[1099,12]]},"680":{"position":[[634,14]]},"696":{"position":[[831,13],[888,12]]},"709":{"position":[[124,13],[837,12]]},"710":{"position":[[650,12],[1030,12],[1644,14]]},"717":{"position":[[701,14]]},"734":{"position":[[265,14]]},"739":{"position":[[252,14]]},"759":{"position":[[35,12],[299,14]]},"760":{"position":[[395,14]]},"793":{"position":[[180,12],[567,12],[1336,12]]},"829":{"position":[[576,14]]},"835":{"position":[[85,12]]},"862":{"position":[[433,14]]},"898":{"position":[[2083,12],[2282,14]]},"904":{"position":[[411,12],[469,12],[682,14]]},"960":{"position":[[250,14]]},"962":{"position":[[485,12],[721,14]]},"977":{"position":[[615,16]]},"1114":{"position":[[549,14]]},"1141":{"position":[[182,12]]},"1154":{"position":[[168,12],[282,12]]},"1156":{"position":[[70,12],[186,12]]},"1157":{"position":[[7,12],[139,12],[224,12],[402,12]]},"1158":{"position":[[140,14]]},"1159":{"position":[[11,12],[66,12],[347,14],[453,13]]},"1206":{"position":[[198,13]]},"1209":{"position":[[130,13]]},"1218":{"position":[[679,14]]},"1222":{"position":[[142,14],[299,12]]},"1235":{"position":[[25,12],[467,12]]},"1238":{"position":[[382,12],[759,12]]},"1239":{"position":[[560,12]]},"1242":{"position":[[69,12],[194,12]]},"1246":{"position":[[1595,12],[1639,12],[1833,12]]},"1286":{"position":[[325,14]]},"1287":{"position":[[371,14]]},"1288":{"position":[[331,14]]}},"keywords":{}}],["localstorage"",{"_index":1477,"title":{},"content":{"244":{"position":[[78,18],[186,19]]}},"keywords":{}}],["localstorage.clear",{"_index":2875,"title":{},"content":{"425":{"position":[[504,21]]}},"keywords":{}}],["localstorage.getitem('usernam",{"_index":2873,"title":{},"content":{"425":{"position":[[378,33]]},"559":{"position":[[336,33]]}},"keywords":{}}],["localstorage.j",{"_index":1959,"title":{},"content":{"336":{"position":[[81,15]]}},"keywords":{}}],["localstorage.removeitem('usernam",{"_index":2874,"title":{},"content":{"425":{"position":[[446,36]]}},"keywords":{}}],["localstorage.send",{"_index":3054,"title":{},"content":{"464":{"position":[[597,20]]}},"keywords":{}}],["localstorage.setitem",{"_index":2933,"title":{},"content":{"440":{"position":[[71,22]]}},"keywords":{}}],["localstorage.setitem('us",{"_index":2878,"title":{},"content":{"426":{"position":[[387,28]]}},"keywords":{}}],["localstorage.setitem('usernam",{"_index":2870,"title":{},"content":{"425":{"position":[[276,32]]},"559":{"position":[[434,32]]}},"keywords":{}}],["localstorage/indexeddb/websql",{"_index":3783,"title":{"660":{"position":[[0,30]]}},"content":{},"keywords":{}}],["localstorageexampl",{"_index":3387,"title":{},"content":{"559":{"position":[[246,21],[795,20]]}},"keywords":{}}],["localstoragewhil",{"_index":3406,"title":{},"content":{"559":{"position":[[971,17]]}},"keywords":{}}],["localstorage’",{"_index":3414,"title":{},"content":{"559":{"position":[[1712,14]]}},"keywords":{}}],["localstroag",{"_index":5386,"title":{},"content":{"962":{"position":[[612,12]]},"1242":{"position":[[5,12]]}},"keywords":{}}],["locat",{"_index":3790,"title":{},"content":{"661":{"position":[[605,8]]},"662":{"position":[[1359,8]]},"736":{"position":[[82,8]]},"838":{"position":[[2307,8]]},"849":{"position":[[882,8]]},"1007":{"position":[[1026,9],[1980,8]]},"1093":{"position":[[78,8]]},"1134":{"position":[[539,9]]},"1227":{"position":[[357,8]]},"1265":{"position":[[350,8]]},"1279":{"position":[[61,8]]}},"keywords":{}}],["location.reload",{"_index":4109,"title":{},"content":{"740":{"position":[[672,18]]},"879":{"position":[[666,18]]},"990":{"position":[[1398,18]]}},"keywords":{}}],["lock",{"_index":237,"title":{},"content":{"14":{"position":[[1072,4]]},"202":{"position":[[376,6]]},"212":{"position":[[376,4]]},"247":{"position":[[56,4]]},"249":{"position":[[340,4]]},"262":{"position":[[492,4]]},"376":{"position":[[427,4]]},"381":{"position":[[540,7]]},"412":{"position":[[1301,4],[1532,4],[2499,4]]},"461":{"position":[[542,6]]},"839":{"position":[[539,6],[836,4],[1314,4]]},"840":{"position":[[504,4]]},"841":{"position":[[1502,6],[1581,4]]},"886":{"position":[[4619,6]]},"1124":{"position":[[121,4]]}},"keywords":{}}],["lodash",{"_index":528,"title":{},"content":{"34":{"position":[[54,6]]}},"keywords":{}}],["log",{"_index":1902,"title":{"746":{"position":[[19,7]]},"747":{"position":[[13,7]]},"1151":{"position":[[34,4]]},"1178":{"position":[[34,4]]}},"content":{"316":{"position":[[136,5],[161,5]]},"353":{"position":[[708,5]]},"411":{"position":[[4327,4]]},"439":{"position":[[533,6]]},"616":{"position":[[909,5]]},"639":{"position":[[320,5],[345,4]]},"696":{"position":[[581,5]]},"745":{"position":[[159,7]]},"746":{"position":[[29,3],[151,3],[168,4],[386,3],[495,3],[587,3]]},"747":{"position":[[48,3]]},"904":{"position":[[3387,3]]},"1010":{"position":[[236,3]]},"1094":{"position":[[432,7]]},"1151":{"position":[[801,4],[864,4]]},"1178":{"position":[[798,4],[861,4]]},"1282":{"position":[[659,3],[855,3],[868,4]]}},"keywords":{}}],["logger",{"_index":4112,"title":{"744":{"position":[[5,6]]},"745":{"position":[[10,6]]}},"content":{"745":{"position":[[5,6],[371,6]]},"747":{"position":[[10,6]]},"793":{"position":[[455,6]]}},"keywords":{}}],["loggingstorag",{"_index":4115,"title":{},"content":{"745":{"position":[[384,14],[577,14]]},"746":{"position":[[272,14]]},"747":{"position":[[89,14]]}},"keywords":{}}],["logic",{"_index":668,"title":{},"content":{"43":{"position":[[102,5]]},"51":{"position":[[948,5]]},"168":{"position":[[219,5]]},"196":{"position":[[155,6]]},"203":{"position":[[171,6]]},"249":{"position":[[435,5]]},"262":{"position":[[434,5]]},"299":{"position":[[1139,5]]},"314":{"position":[[1115,5]]},"326":{"position":[[294,6]]},"344":{"position":[[153,5]]},"354":{"position":[[626,5]]},"383":{"position":[[475,6]]},"384":{"position":[[405,5]]},"392":{"position":[[4999,7]]},"411":{"position":[[1606,5]]},"412":{"position":[[1278,6],[4158,5],[8931,5],[9122,6],[11342,5],[13837,9]]},"559":{"position":[[1320,6]]},"566":{"position":[[952,5]]},"590":{"position":[[726,5]]},"626":{"position":[[594,6]]},"632":{"position":[[20,5],[2419,5],[2535,5]]},"634":{"position":[[507,5]]},"681":{"position":[[179,6]]},"682":{"position":[[113,5]]},"683":{"position":[[597,6]]},"686":{"position":[[596,5]]},"687":{"position":[[41,5]]},"688":{"position":[[573,6]]},"691":{"position":[[639,5]]},"697":{"position":[[230,5]]},"765":{"position":[[43,5]]},"839":{"position":[[950,5]]},"906":{"position":[[699,5],[1104,6]]},"1148":{"position":[[398,5]]},"1175":{"position":[[349,6]]},"1307":{"position":[[568,6]]},"1313":{"position":[[59,5],[942,5]]},"1316":{"position":[[2112,7]]}},"keywords":{}}],["logic.async",{"_index":3524,"title":{},"content":{"590":{"position":[[395,11]]}},"keywords":{}}],["logic.compat",{"_index":3894,"title":{},"content":{"688":{"position":[[918,16]]}},"keywords":{}}],["logic.your",{"_index":3905,"title":{},"content":{"690":{"position":[[81,10]]}},"keywords":{}}],["logid",{"_index":4127,"title":{},"content":{"747":{"position":[[200,6],[258,6],[318,6]]}},"keywords":{}}],["login",{"_index":333,"title":{},"content":{"19":{"position":[[583,5]]},"779":{"position":[[166,5]]}},"keywords":{}}],["logo",{"_index":2816,"title":{},"content":{"419":{"position":[[1665,5]]}},"keywords":{}}],["loki",{"_index":6137,"title":{},"content":{"1173":{"position":[[261,4]]},"1177":{"position":[[598,4]]}},"keywords":{}}],["loki.j",{"_index":6153,"title":{},"content":{"1178":{"position":[[103,7]]}},"keywords":{}}],["lokifsstructuredadapt",{"_index":4575,"title":{},"content":{"772":{"position":[[2176,23],[2478,25]]}},"keywords":{}}],["lokiincrementalindexeddbadapt",{"_index":6131,"title":{},"content":{"1172":{"position":[[202,31],[385,34]]}},"keywords":{}}],["lokij",{"_index":295,"title":{"28":{"position":[[0,7]]},"1169":{"position":[[10,6]]},"1177":{"position":[[19,6]]}},"content":{"17":{"position":[[408,6]]},"28":{"position":[[1,6],[101,6],[662,6],[698,6]]},"32":{"position":[[168,6]]},"186":{"position":[[121,7]]},"188":{"position":[[277,6],[734,8]]},"189":{"position":[[113,6],[131,6]]},"772":{"position":[[1890,6],[2310,8]]},"1172":{"position":[[97,8],[436,6]]},"1173":{"position":[[1,6],[80,6],[213,6]]},"1174":{"position":[[20,7],[114,6],[257,6],[327,6]]},"1175":{"position":[[18,7],[86,6]]},"1176":{"position":[[21,6],[124,6]]},"1177":{"position":[[52,6]]},"1178":{"position":[[769,6]]},"1284":{"position":[[398,7],[429,6]]},"1299":{"position":[[494,6]]},"1300":{"position":[[347,6],[573,6]]}},"keywords":{}}],["long",{"_index":1109,"title":{"609":{"position":[[36,4]]},"610":{"position":[[8,4]]}},"content":{"131":{"position":[[877,4]]},"141":{"position":[[130,4]]},"212":{"position":[[1,4]]},"266":{"position":[[477,4]]},"287":{"position":[[1052,4]]},"305":{"position":[[43,4],[233,4]]},"399":{"position":[[596,4]]},"404":{"position":[[440,4]]},"407":{"position":[[1127,4]]},"412":{"position":[[14891,4]]},"420":{"position":[[1035,4]]},"461":{"position":[[320,4]]},"463":{"position":[[579,4]]},"465":{"position":[[58,4]]},"468":{"position":[[644,4]]},"610":{"position":[[1,4],[312,4],[868,4],[1106,4],[1392,4],[1419,4]]},"611":{"position":[[71,4],[1401,4]]},"616":{"position":[[193,4],[291,4],[509,4]]},"619":{"position":[[336,4]]},"620":{"position":[[68,4]]},"624":{"position":[[1338,4]]},"653":{"position":[[391,4]]},"660":{"position":[[209,4]]},"696":{"position":[[338,4]]},"704":{"position":[[205,4]]},"740":{"position":[[182,4]]},"752":{"position":[[222,4],[578,4]]},"783":{"position":[[414,4]]},"835":{"position":[[256,4]]},"839":{"position":[[1395,4]]},"846":{"position":[[918,4]]},"849":{"position":[[59,4]]},"875":{"position":[[7189,4]]},"987":{"position":[[885,4]]},"988":{"position":[[5026,4]]},"1313":{"position":[[380,4],[554,4],[817,4]]},"1316":{"position":[[2699,4],[2810,4]]}},"keywords":{}}],["longer",{"_index":1134,"title":{"783":{"position":[[17,6]]}},"content":{"143":{"position":[[293,6]]},"400":{"position":[[188,6]]},"401":{"position":[[671,6]]},"474":{"position":[[200,6]]},"590":{"position":[[559,6]]},"642":{"position":[[276,6]]},"687":{"position":[[283,6]]},"715":{"position":[[363,6]]},"780":{"position":[[677,6]]},"816":{"position":[[427,6]]},"837":{"position":[[1184,6]]},"840":{"position":[[448,6]]},"879":{"position":[[241,6]]},"880":{"position":[[48,6],[82,6]]},"995":{"position":[[1061,6]]},"1007":{"position":[[818,6]]},"1009":{"position":[[1085,6]]},"1027":{"position":[[64,6]]},"1031":{"position":[[252,6]]},"1032":{"position":[[59,6]]},"1047":{"position":[[152,6]]},"1104":{"position":[[600,6]]},"1112":{"position":[[476,6]]},"1192":{"position":[[492,6]]},"1288":{"position":[[48,6]]},"1301":{"position":[[1547,6]]},"1313":{"position":[[277,6],[535,6],[882,6]]}},"keywords":{}}],["longpol",{"_index":3553,"title":{},"content":{"610":{"position":[[913,10],[1063,11],[1364,11]]}},"keywords":{}}],["longth",{"_index":3036,"title":{},"content":{"463":{"position":[[881,7]]}},"keywords":{}}],["look",{"_index":2444,"title":{},"content":{"401":{"position":[[12,4]]},"408":{"position":[[4054,7]]},"420":{"position":[[7,4]]},"432":{"position":[[946,7]]},"567":{"position":[[11,7]]},"620":{"position":[[235,4]]},"698":{"position":[[315,4],[2065,5]]},"752":{"position":[[1096,4]]},"778":{"position":[[264,7]]},"818":{"position":[[347,4]]},"824":{"position":[[540,4]]},"885":{"position":[[1448,4]]},"901":{"position":[[530,4]]},"986":{"position":[[707,4]]},"988":{"position":[[5381,4]]},"1276":{"position":[[357,4]]},"1305":{"position":[[538,5]]},"1309":{"position":[[353,4]]},"1316":{"position":[[2233,4]]},"1318":{"position":[[522,4]]},"1321":{"position":[[655,4]]}},"keywords":{}}],["lookup",{"_index":2035,"title":{},"content":{"356":{"position":[[288,7]]},"376":{"position":[[588,8]]},"559":{"position":[[1488,7]]},"560":{"position":[[70,7]]}},"keywords":{}}],["lookups.perform",{"_index":1324,"title":{},"content":{"205":{"position":[[168,15]]}},"keywords":{}}],["lookups.test",{"_index":3527,"title":{},"content":{"590":{"position":[[671,12]]}},"keywords":{}}],["loop",{"_index":5591,"title":{},"content":{"1010":{"position":[[17,5],[79,5]]}},"keywords":{}}],["loos",{"_index":460,"title":{},"content":{"28":{"position":[[413,5]]},"402":{"position":[[525,5]]},"611":{"position":[[1024,5]]},"875":{"position":[[8561,6]]},"1222":{"position":[[905,5]]},"1301":{"position":[[294,5]]},"1316":{"position":[[1474,7]]}},"keywords":{}}],["lose",{"_index":2065,"title":{"1323":{"position":[[9,4]]}},"content":{"358":{"position":[[703,6],[1013,4]]},"380":{"position":[[95,5]]},"412":{"position":[[8740,4]]},"703":{"position":[[703,4],[783,4]]}},"keywords":{}}],["loss",{"_index":2161,"title":{},"content":{"382":{"position":[[399,5]]},"398":{"position":[[214,4]]},"402":{"position":[[2538,4]]},"419":{"position":[[907,5]]},"612":{"position":[[1414,5]]},"981":{"position":[[1459,4]]},"1304":{"position":[[1499,4]]}},"keywords":{}}],["lost",{"_index":11,"title":{},"content":{"1":{"position":[[154,4]]},"30":{"position":[[154,4]]},"412":{"position":[[8288,5]]},"416":{"position":[[468,5]]},"660":{"position":[[378,4]]},"691":{"position":[[203,5]]},"773":{"position":[[274,4]]},"774":{"position":[[1006,4]]},"1090":{"position":[[1277,5]]},"1164":{"position":[[986,4]]},"1171":{"position":[[45,4]]},"1174":{"position":[[307,5]]},"1300":{"position":[[187,5]]},"1301":{"position":[[392,4]]},"1314":{"position":[[137,4]]}},"keywords":{}}],["lot",{"_index":292,"title":{},"content":{"17":{"position":[[246,4]]},"24":{"position":[[393,3]]},"33":{"position":[[382,3]]},"412":{"position":[[15250,3]]},"709":{"position":[[783,3]]},"752":{"position":[[175,4]]}},"keywords":{}}],["low",{"_index":692,"title":{"92":{"position":[[28,3]]},"220":{"position":[[0,3]]},"1239":{"position":[[0,3]]}},"content":{"45":{"position":[[16,3]]},"65":{"position":[[1010,3]]},"92":{"position":[[80,3]]},"122":{"position":[[349,3]]},"131":{"position":[[279,3]]},"133":{"position":[[342,3]]},"173":{"position":[[2505,3]]},"181":{"position":[[70,3]]},"220":{"position":[[27,3]]},"299":{"position":[[1007,3],[1094,3]]},"300":{"position":[[635,3]]},"301":{"position":[[56,3],[547,3]]},"331":{"position":[[293,3]]},"378":{"position":[[217,3]]},"408":{"position":[[3526,3]]},"410":{"position":[[56,3]]},"412":{"position":[[9360,3],[10684,3]]},"418":{"position":[[160,3]]},"452":{"position":[[93,3]]},"497":{"position":[[625,4]]},"521":{"position":[[65,3]]},"533":{"position":[[16,3]]},"535":{"position":[[272,3]]},"548":{"position":[[288,3]]},"560":{"position":[[196,3]]},"566":{"position":[[85,3]]},"569":{"position":[[390,3]]},"593":{"position":[[16,3]]},"595":{"position":[[285,3]]},"608":{"position":[[286,3]]},"611":{"position":[[550,3]]},"613":{"position":[[60,3]]},"621":{"position":[[223,3],[733,3]]},"660":{"position":[[236,3]]},"1123":{"position":[[76,3]]},"1206":{"position":[[373,3]]},"1209":{"position":[[53,3]]},"1239":{"position":[[68,3]]}},"keywords":{}}],["lowdb",{"_index":526,"title":{"34":{"position":[[0,6]]}},"content":{"34":{"position":[[1,5],[133,5],[386,6],[517,6],[706,5]]}},"keywords":{}}],["lower",{"_index":890,"title":{"204":{"position":[[3,5]]}},"content":{"61":{"position":[[442,5]]},"277":{"position":[[282,5]]},"376":{"position":[[665,5]]},"402":{"position":[[1206,5]]},"617":{"position":[[386,5],[1773,5]]},"622":{"position":[[432,5]]},"772":{"position":[[2577,6]]},"796":{"position":[[803,5]]},"1239":{"position":[[247,5]]}},"keywords":{}}],["lowercas",{"_index":5797,"title":{},"content":{"1072":{"position":[[2159,9],[2322,10]]}},"keywords":{}}],["lowest",{"_index":3052,"title":{},"content":{"464":{"position":[[482,6]]},"621":{"position":[[24,6]]},"1320":{"position":[[173,6]]}},"keywords":{}}],["lsh",{"_index":2335,"title":{},"content":{"396":{"position":[[123,6],[130,3]]}},"keywords":{}}],["lt",{"_index":600,"title":{},"content":{"38":{"position":[[986,4],[1015,4]]},"367":{"position":[[746,4],[864,4]]},"398":{"position":[[1075,4],[2422,4]]},"403":{"position":[[516,4]]},"522":{"position":[[454,4],[505,4],[548,4],[598,4],[666,4],[732,4]]},"602":{"position":[[454,5]]},"681":{"position":[[727,4]]},"734":{"position":[[785,4]]},"739":{"position":[[551,4]]},"749":{"position":[[21551,5]]},"751":{"position":[[1959,4]]},"752":{"position":[[458,4]]},"759":{"position":[[781,4]]},"760":{"position":[[413,4]]},"796":{"position":[[555,4],[963,4],[1394,4]]},"799":{"position":[[734,4]]},"838":{"position":[[2360,4]]},"858":{"position":[[492,6],[499,6]]},"885":{"position":[[1795,4],[1898,4],[2084,4]]},"886":{"position":[[3993,4]]},"906":{"position":[[1041,4]]},"932":{"position":[[1297,4]]},"960":{"position":[[322,4],[373,4],[443,4],[493,4],[561,4],[627,4]]},"983":{"position":[[1030,4]]},"988":{"position":[[3961,4]]},"1013":{"position":[[398,4],[550,4]]},"1036":{"position":[[152,4]]},"1062":{"position":[[190,4]]},"1074":{"position":[[1002,4]]},"1078":{"position":[[564,4],[892,4]]},"1080":{"position":[[187,4],[283,4],[747,4],[843,4],[935,4]]},"1082":{"position":[[272,4],[421,4]]},"1083":{"position":[[472,4]]},"1277":{"position":[[444,4]]}},"keywords":{}}],["lt;/characterlist>",{"_index":3284,"title":{},"content":{"523":{"position":[[833,22]]}},"keywords":{}}],["lt;/div>",{"_index":3319,"title":{},"content":{"541":{"position":[[721,12]]},"559":{"position":[[762,12]]},"601":{"position":[[305,12]]},"602":{"position":[[692,12]]}},"keywords":{}}],["lt;/li>",{"_index":824,"title":{},"content":{"54":{"position":[[289,11]]},"55":{"position":[[1210,11]]},"335":{"position":[[525,11]]},"493":{"position":[[285,11]]},"541":{"position":[[693,11]]},"562":{"position":[[1542,11]]},"571":{"position":[[1173,15]]},"580":{"position":[[875,11]]},"601":{"position":[[281,11]]},"602":{"position":[[668,11]]},"825":{"position":[[856,13]]}},"keywords":{}}],["lt;/rxdatabaseprovider>",{"_index":4755,"title":{},"content":{"829":{"position":[[1814,27]]}},"keywords":{}}],["lt;/script>",{"_index":3501,"title":{},"content":{"580":{"position":[[716,15]]},"601":{"position":[[704,15]]}},"keywords":{}}],["lt;/span>",{"_index":4752,"title":{},"content":{"829":{"position":[[1716,14]]}},"keywords":{}}],["lt;/strong>",{"_index":3540,"title":{},"content":{"601":{"position":[[244,17]]},"602":{"position":[[631,17]]}},"keywords":{}}],["lt;/template>",{"_index":3509,"title":{},"content":{"580":{"position":[[899,17]]},"601":{"position":[[318,17]]},"602":{"position":[[705,17]]}},"keywords":{}}],["lt;/ul>",{"_index":825,"title":{},"content":{"54":{"position":[[301,11]]},"55":{"position":[[1222,11]]},"130":{"position":[[664,11]]},"493":{"position":[[297,11]]},"494":{"position":[[408,11]]},"541":{"position":[[709,11]]},"542":{"position":[[914,11]]},"562":{"position":[[1558,11]]},"580":{"position":[[887,11]]},"601":{"position":[[293,11]]},"602":{"position":[[680,11]]},"825":{"position":[[870,11]]},"829":{"position":[[3612,11]]}},"keywords":{}}],["lt;a",{"_index":4750,"title":{},"content":{"829":{"position":[[1634,5]]}},"keywords":{}}],["lt;button",{"_index":3281,"title":{},"content":{"523":{"position":[[773,10]]}},"keywords":{}}],["lt;charact",{"_index":3277,"title":{},"content":{"523":{"position":[[690,13]]}},"keywords":{}}],["lt;characterlist>",{"_index":3275,"title":{},"content":{"523":{"position":[[625,21]]}},"keywords":{}}],["lt;div>",{"_index":3312,"title":{},"content":{"541":{"position":[[533,11]]},"559":{"position":[[519,11]]},"601":{"position":[[94,11]]},"602":{"position":[[400,11]]}},"keywords":{}}],["lt;h2>hero",{"_index":3313,"title":{},"content":{"541":{"position":[[545,14]]},"601":{"position":[[106,14]]},"602":{"position":[[412,14]]}},"keywords":{}}],["lt;h2>reactj",{"_index":3392,"title":{},"content":{"559":{"position":[[531,17]]}},"keywords":{}}],["lt;input",{"_index":3394,"title":{},"content":{"559":{"position":[[578,9]]}},"keywords":{}}],["lt;li",{"_index":820,"title":{},"content":{"54":{"position":[[215,6]]},"55":{"position":[[1137,6]]},"493":{"position":[[224,6]]},"494":{"position":[[359,6]]},"541":{"position":[[612,6]]},"542":{"position":[[863,6]]},"562":{"position":[[1483,6]]},"580":{"position":[[760,6]]},"601":{"position":[[148,6]]},"602":{"position":[[523,6]]},"825":{"position":[[791,6]]},"829":{"position":[[3559,6]]}},"keywords":{}}],["lt;li>",{"_index":1949,"title":{},"content":{"335":{"position":[[447,10]]},"571":{"position":[[1147,12]]}},"keywords":{}}],["lt;li>{{hero.name}}</li>",{"_index":1101,"title":{},"content":{"130":{"position":[[629,34]]}},"keywords":{}}],["lt;p>store",{"_index":3401,"title":{},"content":{"559":{"position":[[724,16]]}},"keywords":{}}],["lt;rxdatabaseprovid",{"_index":4753,"title":{},"content":{"829":{"position":[[1742,22]]}},"keywords":{}}],["lt;rxdatabaseprovider>",{"_index":4438,"title":{},"content":{"749":{"position":[[24164,26]]}},"keywords":{}}],["lt;script",{"_index":3492,"title":{},"content":{"580":{"position":[[278,10]]},"601":{"position":[[336,10]]}},"keywords":{}}],["lt;span",{"_index":6182,"title":{},"content":{"1202":{"position":[[93,8]]}},"keywords":{}}],["lt;span>",{"_index":4749,"title":{},"content":{"829":{"position":[[1613,12]]}},"keywords":{}}],["lt;span>loading...</span>",{"_index":4758,"title":{},"content":{"829":{"position":[[2555,36],[3474,36]]}},"keywords":{}}],["lt;span>tot",{"_index":4759,"title":{},"content":{"829":{"position":[[2601,17]]}},"keywords":{}}],["lt;strong>",{"_index":3539,"title":{},"content":{"601":{"position":[[217,16]]},"602":{"position":[[604,16]]}},"keywords":{}}],["lt;strong>${hero.name}</strong>",{"_index":1950,"title":{},"content":{"335":{"position":[[458,41]]}},"keywords":{}}],["lt;strong>{hero.name}</strong>",{"_index":3317,"title":{},"content":{"541":{"position":[[637,40]]}},"keywords":{}}],["lt;template>",{"_index":3502,"title":{},"content":{"580":{"position":[[732,16]]},"601":{"position":[[77,16]]},"602":{"position":[[383,16]]}},"keywords":{}}],["lt;ul",{"_index":1099,"title":{},"content":{"130":{"position":[[560,6]]},"493":{"position":[[155,6]]}},"keywords":{}}],["lt;ul>",{"_index":819,"title":{},"content":{"54":{"position":[[204,10]]},"55":{"position":[[1126,10]]},"494":{"position":[[324,10]]},"541":{"position":[[576,10]]},"542":{"position":[[827,10]]},"562":{"position":[[1447,10]]},"580":{"position":[[749,10]]},"601":{"position":[[137,10]]},"602":{"position":[[443,10]]},"825":{"position":[[780,10]]},"829":{"position":[[3522,10]]}},"keywords":{}}],["luck",{"_index":3934,"title":{},"content":{"696":{"position":[[592,4]]}},"keywords":{}}],["lwt",{"_index":6151,"title":{},"content":{"1177":{"position":[[492,4]]}},"keywords":{}}],["m",{"_index":4653,"title":{},"content":{"798":{"position":[[611,3]]},"1066":{"position":[[417,3]]}},"keywords":{}}],["machin",{"_index":2183,"title":{},"content":{"390":{"position":[[258,7]]},"391":{"position":[[196,7],[986,7]]},"392":{"position":[[1983,7],[4941,8]]},"402":{"position":[[1769,7]]},"462":{"position":[[484,7]]},"699":{"position":[[448,7],[530,9]]},"743":{"position":[[232,8]]},"1246":{"position":[[866,8]]},"1292":{"position":[[87,7],[142,7]]}},"keywords":{}}],["made",{"_index":288,"title":{"76":{"position":[[0,4]]},"107":{"position":[[0,4]]},"230":{"position":[[0,4]]},"238":{"position":[[29,4]]},"1250":{"position":[[7,4]]},"1254":{"position":[[14,4]]}},"content":{"17":{"position":[[87,4]]},"21":{"position":[[188,4]]},"25":{"position":[[76,4]]},"36":{"position":[[313,4]]},"37":{"position":[[32,4]]},"113":{"position":[[74,4]]},"125":{"position":[[227,4]]},"129":{"position":[[226,4]]},"136":{"position":[[88,4]]},"174":{"position":[[2990,4]]},"191":{"position":[[129,4]]},"274":{"position":[[333,4]]},"289":{"position":[[877,4]]},"366":{"position":[[43,4]]},"404":{"position":[[497,5]]},"408":{"position":[[712,4]]},"445":{"position":[[1044,4]]},"446":{"position":[[341,4]]},"450":{"position":[[725,4]]},"453":{"position":[[473,4]]},"469":{"position":[[120,4]]},"517":{"position":[[287,4]]},"519":{"position":[[170,4]]},"525":{"position":[[148,4]]},"576":{"position":[[401,4]]},"589":{"position":[[136,4]]},"614":{"position":[[543,4]]},"626":{"position":[[313,4]]},"662":{"position":[[376,4]]},"686":{"position":[[149,4]]},"698":{"position":[[1573,4]]},"783":{"position":[[117,4],[401,4]]},"863":{"position":[[397,4]]},"906":{"position":[[299,4]]},"1007":{"position":[[1057,4]]},"1093":{"position":[[227,4]]},"1246":{"position":[[692,4]]},"1250":{"position":[[8,4]]},"1271":{"position":[[333,4]]},"1316":{"position":[[3541,4]]}},"keywords":{}}],["made.nest",{"_index":4920,"title":{},"content":{"863":{"position":[[753,11]]}},"keywords":{}}],["magic",{"_index":3946,"title":{},"content":{"698":{"position":[[3106,9]]}},"keywords":{}}],["mailbywordcollect",{"_index":5637,"title":{},"content":{"1023":{"position":[[191,21]]}},"keywords":{}}],["mailbywordcollection.bulkinsert",{"_index":5640,"title":{},"content":{"1023":{"position":[[441,32]]}},"keywords":{}}],["mailbywordcollection.find({emailid",{"_index":5638,"title":{},"content":{"1023":{"position":[[302,35]]}},"keywords":{}}],["mailid",{"_index":5634,"title":{},"content":{"1022":{"position":[[993,7]]},"1023":{"position":[[657,7]]}},"keywords":{}}],["main",{"_index":289,"title":{"642":{"position":[[25,4]]},"1211":{"position":[[18,4]]},"1226":{"position":[[7,4]]},"1264":{"position":[[7,4]]}},"content":{"17":{"position":[[178,4]]},"19":{"position":[[186,4]]},"24":{"position":[[252,4]]},"27":{"position":[[131,4]]},"29":{"position":[[102,4]]},"266":{"position":[[988,4]]},"392":{"position":[[3470,4],[3686,4],[3794,4]]},"408":{"position":[[3906,4]]},"412":{"position":[[826,4]]},"427":{"position":[[306,4]]},"453":{"position":[[313,4]]},"454":{"position":[[890,4]]},"460":{"position":[[100,4],[644,4],[876,4],[948,4],[1214,4],[1382,4]]},"463":{"position":[[686,4],[931,4]]},"464":{"position":[[334,4]]},"465":{"position":[[195,4]]},"466":{"position":[[160,4]]},"467":{"position":[[131,4],[368,4]]},"468":{"position":[[84,4],[419,4]]},"470":{"position":[[393,4]]},"538":{"position":[[19,4]]},"540":{"position":[[102,4]]},"559":{"position":[[1131,4]]},"598":{"position":[[19,4]]},"642":{"position":[[171,4]]},"693":{"position":[[72,4],[453,4],[612,4],[919,5],[1239,5]]},"708":{"position":[[610,4]]},"709":{"position":[[1067,4]]},"710":{"position":[[1324,4],[2367,4]]},"711":{"position":[[323,4],[381,4],[538,4],[628,4],[1057,4]]},"721":{"position":[[211,4],[236,4],[403,4]]},"775":{"position":[[745,4]]},"801":{"position":[[187,4],[447,4],[975,4]]},"840":{"position":[[223,4]]},"1068":{"position":[[433,4]]},"1092":{"position":[[494,4]]},"1094":{"position":[[282,4]]},"1157":{"position":[[258,4]]},"1183":{"position":[[570,4]]},"1207":{"position":[[393,4],[552,4]]},"1211":{"position":[[151,4],[241,4],[415,4]]},"1213":{"position":[[176,4],[309,4]]},"1214":{"position":[[639,4]]},"1230":{"position":[[372,4]]},"1231":{"position":[[322,4],[392,4]]},"1239":{"position":[[225,4],[410,4]]},"1246":{"position":[[212,4],[532,4],[1475,4],[2098,4]]},"1276":{"position":[[292,4]]},"1286":{"position":[[374,4]]},"1287":{"position":[[420,4]]},"1288":{"position":[[380,4]]},"1315":{"position":[[1117,4]]}},"keywords":{}}],["main.j",{"_index":3927,"title":{},"content":{"693":{"position":[[705,7]]},"1214":{"position":[[491,8]]}},"keywords":{}}],["mainli",{"_index":2838,"title":{},"content":{"420":{"position":[[1190,6]]},"450":{"position":[[106,6]]},"1094":{"position":[[495,6]]},"1120":{"position":[[221,6]]}},"keywords":{}}],["maintain",{"_index":466,"title":{},"content":{"28":{"position":[[712,10]]},"47":{"position":[[573,11]]},"116":{"position":[[58,10]]},"145":{"position":[[45,8]]},"173":{"position":[[2860,11]]},"240":{"position":[[276,11]]},"255":{"position":[[1843,11]]},"289":{"position":[[372,8]]},"312":{"position":[[193,11]]},"353":{"position":[[195,8]]},"360":{"position":[[790,8]]},"366":{"position":[[203,11]]},"379":{"position":[[292,11]]},"384":{"position":[[443,11]]},"387":{"position":[[337,11]]},"396":{"position":[[453,11]]},"411":{"position":[[1680,11],[1788,9]]},"412":{"position":[[13749,12]]},"424":{"position":[[405,8]]},"445":{"position":[[1603,16]]},"516":{"position":[[351,11]]},"519":{"position":[[228,11]]},"595":{"position":[[683,8]]},"617":{"position":[[571,8],[631,8]]},"618":{"position":[[90,11]]},"623":{"position":[[13,11]]},"630":{"position":[[233,9]]},"632":{"position":[[109,9]]},"670":{"position":[[156,10],[252,10],[375,10]]},"705":{"position":[[56,11]]},"784":{"position":[[321,8]]},"835":{"position":[[763,10]]},"837":{"position":[[592,10],[1191,11]]},"901":{"position":[[450,11]]},"1133":{"position":[[307,10]]},"1151":{"position":[[362,11]]},"1178":{"position":[[361,11]]},"1198":{"position":[[2236,8]]}},"keywords":{}}],["mainten",{"_index":2753,"title":{},"content":{"412":{"position":[[12030,11]]},"661":{"position":[[484,11]]}},"keywords":{}}],["major",{"_index":2172,"title":{"760":{"position":[[29,5]]}},"content":{"387":{"position":[[207,5]]},"408":{"position":[[4221,5],[4288,5]]},"410":{"position":[[987,5]]},"412":{"position":[[782,5]]},"445":{"position":[[437,5]]},"452":{"position":[[487,5]]},"454":{"position":[[115,5]]},"760":{"position":[[33,5]]},"774":{"position":[[927,5]]},"837":{"position":[[607,5]]},"965":{"position":[[395,5]]},"1198":{"position":[[2169,5]]}},"keywords":{}}],["make",{"_index":186,"title":{"247":{"position":[[5,5]]},"668":{"position":[[0,6]]},"799":{"position":[[0,4]]}},"content":{"13":{"position":[[77,5],[275,5]]},"15":{"position":[[492,4]]},"34":{"position":[[672,4]]},"35":{"position":[[199,6],[484,5]]},"41":{"position":[[132,5]]},"64":{"position":[[158,6]]},"65":{"position":[[678,4],[1494,6]]},"72":{"position":[[94,6]]},"83":{"position":[[195,4]]},"104":{"position":[[139,5]]},"105":{"position":[[130,6]]},"118":{"position":[[333,4]]},"126":{"position":[[284,4]]},"129":{"position":[[451,4]]},"142":{"position":[[4,4]]},"148":{"position":[[451,4]]},"164":{"position":[[203,4]]},"167":{"position":[[300,6]]},"174":{"position":[[634,5],[1449,6]]},"175":{"position":[[637,4]]},"179":{"position":[[201,4]]},"183":{"position":[[41,6]]},"186":{"position":[[336,4]]},"206":{"position":[[301,4]]},"207":{"position":[[296,5]]},"227":{"position":[[104,6]]},"236":{"position":[[285,6]]},"241":{"position":[[637,4]]},"265":{"position":[[833,5]]},"266":{"position":[[189,6]]},"267":{"position":[[21,4],[225,4],[580,5],[902,4],[1393,4]]},"271":{"position":[[292,4]]},"281":{"position":[[167,6]]},"282":{"position":[[343,5]]},"295":{"position":[[156,6]]},"325":{"position":[[194,6]]},"328":{"position":[[286,4]]},"362":{"position":[[124,5]]},"365":{"position":[[370,6],[776,6]]},"366":{"position":[[385,6]]},"369":{"position":[[1031,6]]},"371":{"position":[[246,4]]},"387":{"position":[[406,6]]},"393":{"position":[[366,6]]},"394":{"position":[[1736,6]]},"395":{"position":[[493,5]]},"399":{"position":[[200,6]]},"402":{"position":[[601,5],[2029,5]]},"407":{"position":[[702,5]]},"408":{"position":[[1822,5],[2242,6]]},"409":{"position":[[27,6]]},"411":{"position":[[3089,4],[3666,5]]},"412":{"position":[[5977,4],[12612,5],[14498,5],[14835,5]]},"427":{"position":[[525,5],[926,6]]},"432":{"position":[[468,6]]},"435":{"position":[[304,6]]},"441":{"position":[[135,4],[617,4]]},"445":{"position":[[882,6],[1905,6]]},"446":{"position":[[825,4]]},"452":{"position":[[340,5],[754,5]]},"453":{"position":[[678,4]]},"454":{"position":[[574,5]]},"455":{"position":[[477,4]]},"457":{"position":[[596,4]]},"462":{"position":[[972,5]]},"473":{"position":[[148,5]]},"489":{"position":[[505,5]]},"491":{"position":[[508,5]]},"500":{"position":[[303,6]]},"516":{"position":[[201,4]]},"528":{"position":[[147,6]]},"533":{"position":[[270,6]]},"535":{"position":[[206,6]]},"554":{"position":[[1160,4]]},"571":{"position":[[625,4]]},"590":{"position":[[703,4]]},"593":{"position":[[270,6]]},"595":{"position":[[219,6],[795,6]]},"611":{"position":[[507,6]]},"612":{"position":[[195,6]]},"613":{"position":[[346,5]]},"614":{"position":[[722,5]]},"617":{"position":[[921,5]]},"621":{"position":[[470,6]]},"623":{"position":[[556,6]]},"624":{"position":[[459,6],[750,5]]},"627":{"position":[[258,4]]},"650":{"position":[[102,4]]},"659":{"position":[[914,5]]},"661":{"position":[[1647,5]]},"662":{"position":[[279,5]]},"666":{"position":[[53,4]]},"668":{"position":[[8,4]]},"670":{"position":[[35,4]]},"679":{"position":[[109,4]]},"682":{"position":[[136,4]]},"683":{"position":[[553,4]]},"685":{"position":[[350,5]]},"686":{"position":[[554,5]]},"696":{"position":[[1,6],[548,4],[1609,4]]},"701":{"position":[[504,5]]},"702":{"position":[[358,4]]},"703":{"position":[[1089,5]]},"705":{"position":[[632,5]]},"711":{"position":[[2089,5]]},"714":{"position":[[277,6]]},"717":{"position":[[237,5]]},"723":{"position":[[1833,6]]},"737":{"position":[[83,5]]},"739":{"position":[[4,4]]},"749":{"position":[[5643,4]]},"770":{"position":[[601,4]]},"773":{"position":[[178,5]]},"781":{"position":[[826,5]]},"783":{"position":[[434,5]]},"784":{"position":[[33,4],[808,5]]},"785":{"position":[[390,4],[678,4]]},"795":{"position":[[54,4]]},"798":{"position":[[730,5]]},"799":{"position":[[92,4],[740,4]]},"800":{"position":[[45,4]]},"815":{"position":[[328,4]]},"821":{"position":[[201,5],[424,5],[747,5]]},"826":{"position":[[168,4]]},"828":{"position":[[402,5]]},"829":{"position":[[1167,6]]},"831":{"position":[[254,5]]},"835":{"position":[[985,5]]},"838":{"position":[[308,5],[511,6],[745,4]]},"860":{"position":[[800,6],[1158,5]]},"861":{"position":[[2314,4]]},"872":{"position":[[779,4]]},"875":{"position":[[9378,4]]},"884":{"position":[[41,4]]},"886":{"position":[[4701,4]]},"893":{"position":[[268,4]]},"898":{"position":[[2732,4]]},"904":{"position":[[29,4]]},"917":{"position":[[452,4]]},"932":{"position":[[318,4]]},"981":{"position":[[501,5],[657,5],[1328,6]]},"1009":{"position":[[863,4]]},"1044":{"position":[[1,6],[163,4]]},"1057":{"position":[[293,4]]},"1066":{"position":[[536,5]]},"1083":{"position":[[34,4]]},"1085":{"position":[[2733,4]]},"1088":{"position":[[668,4]]},"1093":{"position":[[114,5]]},"1097":{"position":[[470,4]]},"1104":{"position":[[30,4]]},"1107":{"position":[[1005,4]]},"1120":{"position":[[687,5]]},"1123":{"position":[[707,5]]},"1124":{"position":[[843,5]]},"1126":{"position":[[75,4]]},"1132":{"position":[[1174,6]]},"1135":{"position":[[340,4]]},"1143":{"position":[[388,5]]},"1175":{"position":[[71,4]]},"1184":{"position":[[237,4]]},"1194":{"position":[[95,5]]},"1208":{"position":[[544,4]]},"1213":{"position":[[419,4]]},"1227":{"position":[[111,4]]},"1249":{"position":[[130,5]]},"1265":{"position":[[104,4]]},"1282":{"position":[[274,5]]},"1300":{"position":[[310,4]]},"1304":{"position":[[1252,4]]},"1313":{"position":[[397,4]]},"1318":{"position":[[82,5]]},"1320":{"position":[[63,4],[106,6],[512,4]]},"1321":{"position":[[583,4],[1075,5]]},"1324":{"position":[[775,4],[1019,4]]}},"keywords":{}}],["male",{"_index":4654,"title":{},"content":{"798":{"position":[[684,7]]},"1066":{"position":[[490,7]]}},"keywords":{}}],["malform",{"_index":2080,"title":{},"content":{"361":{"position":[[159,9]]},"749":{"position":[[3301,9]]}},"keywords":{}}],["malici",{"_index":1714,"title":{},"content":{"298":{"position":[[363,9]]},"1316":{"position":[[2006,9]]}},"keywords":{}}],["man",{"_index":682,"title":{},"content":{"43":{"position":[[573,3]]},"52":{"position":[[121,5],[433,4]]},"539":{"position":[[121,5],[433,4]]},"556":{"position":[[1870,3]]},"599":{"position":[[130,5],[460,4]]}},"keywords":{}}],["manag",{"_index":252,"title":{"96":{"position":[[33,11]]},"219":{"position":[[25,11]]}},"content":{"15":{"position":[[162,8],[180,10]]},"21":{"position":[[114,10]]},"47":{"position":[[1151,10]]},"57":{"position":[[239,6]]},"66":{"position":[[633,6]]},"79":{"position":[[82,10]]},"96":{"position":[[46,10],[99,10]]},"112":{"position":[[253,10]]},"114":{"position":[[533,11]]},"117":{"position":[[121,6]]},"120":{"position":[[251,8]]},"128":{"position":[[296,6]]},"145":{"position":[[135,8]]},"151":{"position":[[362,10]]},"152":{"position":[[191,8]]},"153":{"position":[[252,11]]},"161":{"position":[[362,8]]},"173":{"position":[[137,6],[3009,11],[3060,10],[3150,11],[3184,10]]},"175":{"position":[[546,11]]},"178":{"position":[[244,8]]},"189":{"position":[[255,10]]},"208":{"position":[[37,6]]},"212":{"position":[[496,7]]},"219":{"position":[[64,10],[161,6]]},"237":{"position":[[81,10]]},"261":{"position":[[872,7]]},"270":{"position":[[256,6]]},"271":{"position":[[58,10]]},"282":{"position":[[318,7]]},"284":{"position":[[100,11]]},"285":{"position":[[331,10]]},"286":{"position":[[426,10]]},"287":{"position":[[228,10]]},"289":{"position":[[92,6]]},"295":{"position":[[364,10]]},"298":{"position":[[113,10]]},"306":{"position":[[150,6]]},"320":{"position":[[357,6]]},"321":{"position":[[489,7]]},"365":{"position":[[1461,10]]},"366":{"position":[[421,8]]},"370":{"position":[[175,6]]},"371":{"position":[[280,10]]},"386":{"position":[[196,7]]},"397":{"position":[[275,8]]},"408":{"position":[[1677,6]]},"411":{"position":[[1415,7],[1859,10],[1978,10],[2684,10]]},"412":{"position":[[1109,6],[9628,6]]},"416":{"position":[[358,7]]},"417":{"position":[[322,6]]},"427":{"position":[[584,8]]},"429":{"position":[[540,6]]},"444":{"position":[[87,10]]},"446":{"position":[[153,8]]},"447":{"position":[[294,8]]},"450":{"position":[[130,11]]},"478":{"position":[[79,7]]},"489":{"position":[[623,7]]},"494":{"position":[[52,10]]},"501":{"position":[[42,11]]},"503":{"position":[[226,10]]},"513":{"position":[[89,8],[233,11]]},"514":{"position":[[353,6]]},"518":{"position":[[288,10]]},"520":{"position":[[346,10]]},"521":{"position":[[542,10]]},"523":{"position":[[73,10]]},"530":{"position":[[63,10]]},"535":{"position":[[885,8]]},"542":{"position":[[1019,6]]},"569":{"position":[[1390,7]]},"571":{"position":[[1761,6]]},"574":{"position":[[99,10],[519,8]]},"576":{"position":[[196,11]]},"585":{"position":[[172,11]]},"590":{"position":[[322,6],[484,6]]},"595":{"position":[[960,8]]},"618":{"position":[[433,10]]},"688":{"position":[[317,6]]},"698":{"position":[[2172,6]]},"709":{"position":[[474,6]]},"715":{"position":[[186,6]]},"737":{"position":[[125,8],[162,8]]},"785":{"position":[[221,6],[270,10]]},"836":{"position":[[2037,11],[2159,8]]},"860":{"position":[[124,11]]},"903":{"position":[[81,6]]},"992":{"position":[[87,6]]},"1132":{"position":[[1376,10]]},"1140":{"position":[[172,6]]},"1147":{"position":[[179,7]]},"1148":{"position":[[112,11],[318,10]]},"1206":{"position":[[103,6]]}},"keywords":{}}],["mango",{"_index":4807,"title":{},"content":{"841":{"position":[[345,5]]},"1065":{"position":[[117,5]]},"1071":{"position":[[48,5],[121,5],[149,5]]},"1249":{"position":[[416,5],[455,5]]},"1251":{"position":[[129,5]]},"1252":{"position":[[21,5]]}},"keywords":{}}],["manhattan",{"_index":2291,"title":{},"content":{"393":{"position":[[233,9]]}},"keywords":{}}],["mani",{"_index":201,"title":{},"content":{"14":{"position":[[101,4]]},"22":{"position":[[138,4]]},"24":{"position":[[180,4]]},"28":{"position":[[743,4]]},"29":{"position":[[50,4]]},"58":{"position":[[32,4]]},"66":{"position":[[67,4]]},"247":{"position":[[29,4]]},"295":{"position":[[257,4]]},"310":{"position":[[328,4]]},"320":{"position":[[164,4]]},"353":{"position":[[474,4]]},"354":{"position":[[289,4],[297,4],[934,4],[1161,4]]},"359":{"position":[[1,4]]},"362":{"position":[[149,4]]},"365":{"position":[[1024,4]]},"367":{"position":[[188,4]]},"375":{"position":[[564,4]]},"377":{"position":[[146,4]]},"392":{"position":[[3306,4]]},"396":{"position":[[1603,4]]},"397":{"position":[[296,4]]},"398":{"position":[[3070,4]]},"402":{"position":[[1733,4]]},"408":{"position":[[520,4],[4524,4]]},"411":{"position":[[2209,4],[3755,4],[4148,4]]},"412":{"position":[[1383,4],[6016,4],[9808,4],[11739,5],[12754,4]]},"419":{"position":[[1293,4]]},"420":{"position":[[571,4]]},"421":{"position":[[1154,4]]},"439":{"position":[[195,4]]},"450":{"position":[[629,4]]},"452":{"position":[[679,4]]},"454":{"position":[[479,4]]},"457":{"position":[[666,4]]},"458":{"position":[[232,4]]},"463":{"position":[[32,4]]},"464":{"position":[[75,4]]},"467":{"position":[[289,4]]},"468":{"position":[[702,4],[720,4]]},"475":{"position":[[1,4]]},"544":{"position":[[13,4]]},"604":{"position":[[13,4]]},"617":{"position":[[2158,4]]},"619":{"position":[[17,4],[186,4]]},"622":{"position":[[261,4]]},"623":{"position":[[161,4]]},"624":{"position":[[1102,4]]},"627":{"position":[[11,4]]},"632":{"position":[[804,4]]},"661":{"position":[[1377,4]]},"681":{"position":[[90,4]]},"698":{"position":[[388,4]]},"701":{"position":[[432,4]]},"702":{"position":[[468,4]]},"703":{"position":[[122,4],[985,4]]},"705":{"position":[[25,4]]},"710":{"position":[[64,4],[464,4]]},"711":{"position":[[1874,4]]},"737":{"position":[[248,4]]},"752":{"position":[[811,4]]},"779":{"position":[[1,5]]},"782":{"position":[[412,4]]},"785":{"position":[[52,4]]},"808":{"position":[[445,4]]},"838":{"position":[[3290,4]]},"839":{"position":[[685,4]]},"840":{"position":[[166,4]]},"846":{"position":[[1094,4]]},"872":{"position":[[2654,4]]},"932":{"position":[[220,4]]},"944":{"position":[[25,4]]},"945":{"position":[[25,4]]},"947":{"position":[[93,4]]},"948":{"position":[[14,4]]},"951":{"position":[[6,4]]},"962":{"position":[[339,4]]},"988":{"position":[[2933,4]]},"989":{"position":[[403,4]]},"1105":{"position":[[895,4]]},"1112":{"position":[[164,4],[514,4]]},"1119":{"position":[[124,4]]},"1124":{"position":[[1373,4],[2194,4]]},"1132":{"position":[[46,4]]},"1146":{"position":[[41,4]]},"1149":{"position":[[99,4]]},"1164":{"position":[[203,4]]},"1186":{"position":[[54,4],[184,4]]},"1194":{"position":[[65,4]]},"1198":{"position":[[391,4],[689,4],[899,4],[1472,4],[1883,4]]},"1203":{"position":[[13,4]]},"1297":{"position":[[524,4]]},"1301":{"position":[[1290,4]]},"1309":{"position":[[208,4]]},"1316":{"position":[[581,4],[626,4],[2635,4],[2738,4],[2854,4],[2873,4],[2938,4]]},"1321":{"position":[[1058,4]]}},"keywords":{}}],["manipul",{"_index":1604,"title":{},"content":{"265":{"position":[[446,13]]},"276":{"position":[[314,10]]},"320":{"position":[[38,13]]},"335":{"position":[[83,10]]},"352":{"position":[[26,10]]},"353":{"position":[[643,12]]},"407":{"position":[[176,10]]},"435":{"position":[[378,12]]},"501":{"position":[[219,12]]},"502":{"position":[[355,12]]},"515":{"position":[[323,13]]},"559":{"position":[[1361,10]]},"686":{"position":[[360,10]]},"805":{"position":[[100,11]]},"1132":{"position":[[648,12]]},"1206":{"position":[[383,14]]}},"keywords":{}}],["manipulation.lack",{"_index":2904,"title":{},"content":{"430":{"position":[[911,17]]}},"keywords":{}}],["manner",{"_index":558,"title":{},"content":{"35":{"position":[[355,7]]},"121":{"position":[[263,7]]},"134":{"position":[[346,7]]},"364":{"position":[[629,6]]},"395":{"position":[[335,7]]},"613":{"position":[[284,8]]}},"keywords":{}}],["manual",{"_index":858,"title":{"654":{"position":[[16,9]]}},"content":{"57":{"position":[[211,6]]},"103":{"position":[[154,6]]},"143":{"position":[[131,8],[319,8]]},"159":{"position":[[280,6]]},"185":{"position":[[345,6]]},"233":{"position":[[214,6]]},"301":{"position":[[152,8]]},"326":{"position":[[247,6]]},"346":{"position":[[209,8]]},"360":{"position":[[164,6]]},"379":{"position":[[166,6]]},"411":{"position":[[3047,6]]},"412":{"position":[[3567,6],[5144,9]]},"421":{"position":[[419,6]]},"461":{"position":[[596,9]]},"487":{"position":[[468,6]]},"490":{"position":[[283,8]]},"515":{"position":[[112,6]]},"518":{"position":[[326,8]]},"521":{"position":[[645,6]]},"542":{"position":[[1040,9]]},"559":{"position":[[1265,8]]},"566":{"position":[[240,6],[511,6],[1121,8],[1302,8]]},"570":{"position":[[620,6]]},"580":{"position":[[109,8]]},"585":{"position":[[256,6]]},"630":{"position":[[461,6]]},"632":{"position":[[380,6]]},"654":{"position":[[9,8],[90,8]]},"655":{"position":[[296,8]]},"690":{"position":[[418,6]]},"698":{"position":[[1458,8]]},"723":{"position":[[1299,6]]},"857":{"position":[[112,8]]},"861":{"position":[[799,8]]},"910":{"position":[[367,9]]},"943":{"position":[[212,8]]},"1067":{"position":[[1926,8],[2084,8]]},"1150":{"position":[[665,6]]},"1177":{"position":[[527,8]]},"1315":{"position":[[537,9]]},"1322":{"position":[[407,8]]}},"keywords":{}}],["map",{"_index":1614,"title":{"643":{"position":[[19,6]]},"787":{"position":[[23,7]]},"1179":{"position":[[7,6]]},"1182":{"position":[[17,6]]}},"content":{"266":{"position":[[753,6]]},"352":{"position":[[331,3]]},"392":{"position":[[3907,7]]},"408":{"position":[[4769,6]]},"419":{"position":[[1729,4]]},"430":{"position":[[1069,5]]},"469":{"position":[[884,6],[920,4]]},"643":{"position":[[135,6]]},"683":{"position":[[81,6]]},"714":{"position":[[1017,6]]},"774":{"position":[[122,6],[636,8]]},"789":{"position":[[112,6]]},"793":{"position":[[535,6]]},"820":{"position":[[480,6]]},"875":{"position":[[9332,3]]},"898":{"position":[[1854,4],[3541,3],[4221,6],[4388,3]]},"951":{"position":[[164,3],[209,6],[312,4],[454,3]]},"986":{"position":[[1575,3]]},"988":{"position":[[1946,4]]},"1006":{"position":[[119,3]]},"1022":{"position":[[392,7],[494,4],[632,7],[722,7]]},"1023":{"position":[[288,7],[373,7]]},"1084":{"position":[[109,3]]},"1090":{"position":[[404,6],[746,8],[1361,6]]},"1162":{"position":[[1114,6]]},"1181":{"position":[[368,6],[819,6]]},"1182":{"position":[[160,8],[372,6]]},"1183":{"position":[[19,6],[316,6],[548,6]]},"1184":{"position":[[98,6],[339,6],[526,8]]},"1185":{"position":[[34,6]]},"1186":{"position":[[28,6]]},"1192":{"position":[[282,6]]},"1195":{"position":[[259,7]]},"1239":{"position":[[127,6],[668,8]]},"1246":{"position":[[1228,7],[1248,6]]},"1292":{"position":[[541,6]]},"1324":{"position":[[182,7]]}},"keywords":{}}],["map(2",{"_index":5364,"title":{},"content":{"951":{"position":[[437,6]]}},"keywords":{}}],["map(doc",{"_index":1139,"title":{},"content":{"143":{"position":[[683,8]]}},"keywords":{}}],["map(result",{"_index":5780,"title":{},"content":{"1067":{"position":[[2179,10]]}},"keywords":{}}],["map/reduc",{"_index":4806,"title":{},"content":{"841":{"position":[[325,10]]}},"keywords":{}}],["mapreduc",{"_index":4781,"title":{},"content":{"837":{"position":[[1676,9],[1700,11]]}},"keywords":{}}],["march",{"_index":3621,"title":{},"content":{"613":{"position":[[643,6]]},"620":{"position":[[597,5]]}},"keywords":{}}],["mark",{"_index":2669,"title":{},"content":{"412":{"position":[[2110,7]]},"564":{"position":[[977,6]]},"617":{"position":[[1715,6]]},"638":{"position":[[831,4]]},"741":{"position":[[31,6]]},"742":{"position":[[50,6]]},"826":{"position":[[32,6],[222,6]]},"861":{"position":[[1938,4]]},"898":{"position":[[599,4]]},"986":{"position":[[572,4],[1470,4]]},"988":{"position":[[1733,5]]},"1208":{"position":[[1495,4]]},"1316":{"position":[[823,4]]}},"keywords":{}}],["markedli",{"_index":4668,"title":{},"content":{"802":{"position":[[89,8]]}},"keywords":{}}],["market",{"_index":2813,"title":{},"content":{"419":{"position":[[1618,9]]},"676":{"position":[[145,9]]},"699":{"position":[[313,9]]}},"keywords":{}}],["mass",{"_index":2591,"title":{},"content":{"410":{"position":[[733,4]]}},"keywords":{}}],["massag",{"_index":6335,"title":{},"content":{"1272":{"position":[[120,8]]}},"keywords":{}}],["massiv",{"_index":1848,"title":{},"content":{"303":{"position":[[1122,7]]},"304":{"position":[[479,7]]},"412":{"position":[[7584,7]]},"418":{"position":[[330,7]]},"902":{"position":[[331,7]]},"1006":{"position":[[190,8]]}},"keywords":{}}],["master",{"_index":380,"title":{},"content":{"23":{"position":[[98,6],[146,6],[247,6]]},"261":{"position":[[198,6]]},"875":{"position":[[4104,6]]},"903":{"position":[[344,6]]},"982":{"position":[[398,6],[433,6],[498,6],[534,6],[608,6],[628,6],[670,6]]},"983":{"position":[[474,7],[623,6],[772,6]]},"987":{"position":[[284,6],[381,6],[416,6],[473,6],[655,7],[817,6]]},"1164":{"position":[[1234,6]]},"1309":{"position":[[1030,6]]}},"keywords":{}}],["master.th",{"_index":5436,"title":{},"content":{"982":{"position":[[319,10]]}},"keywords":{}}],["master/serv",{"_index":5435,"title":{},"content":{"982":{"position":[[132,13],[186,14],[220,13]]},"987":{"position":[[187,13],[684,13]]}},"keywords":{}}],["match",{"_index":942,"title":{},"content":{"66":{"position":[[219,5]]},"287":{"position":[[251,5]]},"360":{"position":[[73,8]]},"390":{"position":[[345,7],[1243,7]]},"392":{"position":[[4979,5]]},"393":{"position":[[1128,5]]},"402":{"position":[[745,8]]},"559":{"position":[[1508,9]]},"681":{"position":[[668,8],[783,7],[853,6]]},"685":{"position":[[636,5]]},"723":{"position":[[262,9],[2258,9],[2395,9]]},"749":{"position":[[137,5],[2701,7],[12336,5],[13568,5],[16854,5],[22166,5]]},"796":{"position":[[728,8]]},"898":{"position":[[1697,5]]},"935":{"position":[[205,5]]},"1063":{"position":[[41,7]]},"1065":{"position":[[395,5],[1242,5]]},"1067":{"position":[[49,5],[910,5]]},"1084":{"position":[[319,5]]},"1085":{"position":[[3061,5],[3403,5]]},"1305":{"position":[[878,7]]},"1322":{"position":[[171,6]]}},"keywords":{}}],["matcher",{"_index":5777,"title":{},"content":{"1067":{"position":[[1903,8]]}},"keywords":{}}],["matchingamount",{"_index":5773,"title":{},"content":{"1067":{"position":[[438,14]]}},"keywords":{}}],["matdialog",{"_index":1096,"title":{},"content":{"130":{"position":[[428,9]]}},"keywords":{}}],["materi",{"_index":2814,"title":{},"content":{"419":{"position":[[1628,10]]}},"keywords":{}}],["math.max(input.newdocumentstate.scor",{"_index":3917,"title":{},"content":{"691":{"position":[[434,38]]}},"keywords":{}}],["mathemat",{"_index":2682,"title":{},"content":{"412":{"position":[[3725,14]]}},"keywords":{}}],["matter",{"_index":2089,"title":{"550":{"position":[[18,8]]}},"content":{"362":{"position":[[249,6]]},"412":{"position":[[4091,6]]},"418":{"position":[[102,7]]},"498":{"position":[[642,6]]},"617":{"position":[[2147,6]]},"654":{"position":[[371,6]]},"737":{"position":[[237,6]]},"981":{"position":[[715,6]]},"1044":{"position":[[195,6]]},"1107":{"position":[[291,7]]},"1124":{"position":[[1153,6]]},"1301":{"position":[[1279,6]]},"1316":{"position":[[159,6]]},"1321":{"position":[[1047,6]]}},"keywords":{}}],["matur",{"_index":620,"title":{},"content":{"39":{"position":[[270,6]]},"837":{"position":[[234,7]]}},"keywords":{}}],["max",{"_index":1466,"title":{"297":{"position":[[10,3]]},"304":{"position":[[10,3]]}},"content":{"243":{"position":[[622,3],[723,3],[764,3],[822,3],[919,3]]},"301":{"position":[[404,3]]},"306":{"position":[[331,3]]},"461":{"position":[[1434,3]]},"773":{"position":[[795,3],[871,3]]},"849":{"position":[[569,3]]},"863":{"position":[[159,3]]}},"keywords":{}}],["maxag",{"_index":6426,"title":{},"content":{"1294":{"position":[[771,6],[1382,6]]}},"keywords":{}}],["maxim",{"_index":1044,"title":{},"content":{"107":{"position":[[142,9]]}},"keywords":{}}],["maximum",{"_index":1712,"title":{},"content":{"298":{"position":[[284,7],[691,7]]},"461":{"position":[[990,7]]},"680":{"position":[[937,8]]},"681":{"position":[[281,7]]},"696":{"position":[[1193,7]]},"749":{"position":[[20630,7],[21321,7]]},"1074":{"position":[[594,7]]},"1079":{"position":[[356,7]]},"1080":{"position":[[543,7],[578,8]]},"1186":{"position":[[169,7]]},"1321":{"position":[[1092,7]]}},"keywords":{}}],["maxlenght",{"_index":1382,"title":{},"content":{"211":{"position":[[469,10]]}},"keywords":{}}],["maxlength",{"_index":774,"title":{},"content":{"51":{"position":[[425,10]]},"188":{"position":[[1302,10],[1344,10],[1387,10]]},"209":{"position":[[507,10]]},"255":{"position":[[851,10]]},"259":{"position":[[151,10]]},"367":{"position":[[846,10],[900,9],[937,10]]},"392":{"position":[[653,10],[1619,10]]},"397":{"position":[[504,10]]},"538":{"position":[[726,10]]},"554":{"position":[[1408,10]]},"598":{"position":[[733,10]]},"632":{"position":[[1601,10]]},"638":{"position":[[685,10]]},"639":{"position":[[463,10]]},"662":{"position":[[2464,10]]},"680":{"position":[[893,10]]},"717":{"position":[[1502,10]]},"734":{"position":[[767,10],[821,9]]},"749":{"position":[[20194,9],[20885,9],[21333,9],[21533,9],[21588,9]]},"838":{"position":[[2678,10]]},"862":{"position":[[733,10]]},"872":{"position":[[1958,10],[4188,10]]},"898":{"position":[[2538,10]]},"904":{"position":[[940,10]]},"1074":{"position":[[1038,9]]},"1078":{"position":[[546,10],[600,9]]},"1079":{"position":[[284,9]]},"1080":{"position":[[169,10],[223,9],[265,10],[344,10]]},"1082":{"position":[[254,10],[308,9]]},"1083":{"position":[[454,10],[508,9]]},"1149":{"position":[[1131,10]]},"1296":{"position":[[1283,9]]}},"keywords":{}}],["mayb",{"_index":2702,"title":{},"content":{"412":{"position":[[5786,5],[10113,5]]},"1124":{"position":[[1674,5]]}},"keywords":{}}],["mb",{"_index":1723,"title":{},"content":{"298":{"position":[[631,2],[650,2]]},"299":{"position":[[445,2],[505,2],[1293,2],[1321,2]]},"461":{"position":[[715,2],[724,2],[811,2],[836,2],[861,2]]},"1157":{"position":[[164,2]]}},"keywords":{}}],["mb)xenova/al",{"_index":2446,"title":{},"content":{"401":{"position":[[191,14]]}},"keywords":{}}],["mdn",{"_index":3445,"title":{},"content":{"567":{"position":[[893,4]]},"1208":{"position":[[1995,4]]}},"keywords":{}}],["mean",{"_index":9,"title":{},"content":{"1":{"position":[[111,5]]},"14":{"position":[[382,5]]},"28":{"position":[[397,5]]},"37":{"position":[[367,4]]},"40":{"position":[[516,5]]},"50":{"position":[[58,7]]},"65":{"position":[[232,5]]},"123":{"position":[[87,5]]},"125":{"position":[[68,5]]},"201":{"position":[[217,5]]},"273":{"position":[[87,5]]},"291":{"position":[[104,5]]},"294":{"position":[[91,5]]},"312":{"position":[[276,7]]},"327":{"position":[[83,5]]},"351":{"position":[[227,5]]},"354":{"position":[[1034,4]]},"390":{"position":[[458,7]]},"392":{"position":[[3099,7]]},"398":{"position":[[233,7]]},"402":{"position":[[1218,5],[1326,5],[1540,5],[1870,5]]},"408":{"position":[[3617,5]]},"410":{"position":[[50,5]]},"411":{"position":[[4252,5]]},"412":{"position":[[5864,5],[8151,5],[11308,5],[12938,5]]},"427":{"position":[[228,5]]},"450":{"position":[[417,5]]},"451":{"position":[[560,5]]},"455":{"position":[[583,5]]},"534":{"position":[[328,5]]},"569":{"position":[[1079,4],[1125,4]]},"570":{"position":[[110,4],[274,5],[424,5]]},"594":{"position":[[326,5]]},"696":{"position":[[31,5]]},"703":{"position":[[1469,5]]},"714":{"position":[[69,5],[330,5],[553,5]]},"723":{"position":[[483,5],[1580,7]]},"728":{"position":[[52,5]]},"751":{"position":[[558,6],[969,6],[1660,6]]},"764":{"position":[[123,5]]},"778":{"position":[[146,5]]},"781":{"position":[[329,5]]},"801":{"position":[[437,5]]},"836":{"position":[[1445,5]]},"838":{"position":[[92,5]]},"890":{"position":[[476,6]]},"948":{"position":[[127,5]]},"968":{"position":[[680,5]]},"986":{"position":[[132,5]]},"1030":{"position":[[148,5]]},"1033":{"position":[[175,5]]},"1052":{"position":[[443,5]]},"1069":{"position":[[180,6]]},"1074":{"position":[[161,5],[441,5]]},"1085":{"position":[[785,5],[2489,5],[2908,5]]},"1150":{"position":[[486,5]]},"1192":{"position":[[61,5],[155,5]]},"1304":{"position":[[37,4]]},"1320":{"position":[[146,5]]}},"keywords":{}}],["meaningless",{"_index":6564,"title":{},"content":{"1316":{"position":[[3803,11]]}},"keywords":{}}],["meant",{"_index":570,"title":{},"content":{"36":{"position":[[148,5]]},"699":{"position":[[302,5]]}},"keywords":{}}],["meantim",{"_index":3771,"title":{},"content":{"656":{"position":[[188,9]]},"875":{"position":[[8701,9]]}},"keywords":{}}],["meanwhil",{"_index":5564,"title":{},"content":{"1007":{"position":[[1036,10]]}},"keywords":{}}],["measur",{"_index":1981,"title":{"1194":{"position":[[0,13]]}},"content":{"346":{"position":[[833,7]]},"360":{"position":[[839,7]]},"377":{"position":[[275,8]]},"393":{"position":[[147,7]]},"463":{"position":[[557,12]]},"465":{"position":[[46,7]]},"798":{"position":[[169,7]]},"821":{"position":[[980,12]]},"1138":{"position":[[571,13]]},"1191":{"position":[[568,12]]},"1193":{"position":[[48,12],[222,12]]},"1194":{"position":[[32,9],[198,7],[1017,7]]},"1297":{"position":[[510,8]]}},"keywords":{}}],["mechan",{"_index":550,"title":{"208":{"position":[[19,9]]}},"content":{"35":{"position":[[144,10]]},"59":{"position":[[105,9]]},"99":{"position":[[45,10],[320,11]]},"110":{"position":[[106,10]]},"124":{"position":[[33,9]]},"129":{"position":[[192,10],[302,9]]},"134":{"position":[[137,10]]},"146":{"position":[[23,10]]},"168":{"position":[[47,11]]},"173":{"position":[[725,9]]},"192":{"position":[[255,11]]},"216":{"position":[[52,11]]},"223":{"position":[[175,10]]},"240":{"position":[[170,10]]},"283":{"position":[[369,9]]},"369":{"position":[[920,10]]},"386":{"position":[[166,9]]},"410":{"position":[[2077,10]]},"436":{"position":[[124,9]]},"487":{"position":[[355,9]]},"500":{"position":[[621,11]]},"510":{"position":[[302,11]]},"517":{"position":[[163,10]]},"525":{"position":[[244,9]]},"527":{"position":[[90,10]]},"632":{"position":[[138,10]]},"656":{"position":[[385,10]]}},"keywords":{}}],["mechanism.webtransport",{"_index":3673,"title":{},"content":{"623":{"position":[[594,23]]}},"keywords":{}}],["media",{"_index":2946,"title":{},"content":{"446":{"position":[[944,5]]}},"keywords":{}}],["medium",{"_index":3443,"title":{},"content":{"566":{"position":[[748,6]]},"780":{"position":[[402,7]]}},"keywords":{}}],["meet",{"_index":1622,"title":{},"content":{"267":{"position":[[1645,5]]},"295":{"position":[[321,4]]},"378":{"position":[[74,4]]},"567":{"position":[[709,7],[1110,4]]}},"keywords":{}}],["megabyt",{"_index":1413,"title":{},"content":{"228":{"position":[[423,8],[455,8]]},"408":{"position":[[899,9]]},"524":{"position":[[836,8]]},"696":{"position":[[1155,9]]}},"keywords":{}}],["membas",{"_index":412,"title":{},"content":{"25":{"position":[[32,8]]}},"keywords":{}}],["memdown",{"_index":39,"title":{"2":{"position":[[0,8]]}},"content":{"2":{"position":[[80,7],[113,7],[286,7]]}},"keywords":{}}],["memori",{"_index":2,"title":{"1":{"position":[[0,7]]},"264":{"position":[[11,6]]},"643":{"position":[[12,6]]},"706":{"position":[[78,6]]},"773":{"position":[[19,6]]},"774":{"position":[[10,6]]},"1090":{"position":[[10,6]]},"1145":{"position":[[55,6]]},"1160":{"position":[[0,6]]},"1165":{"position":[[35,6]]},"1166":{"position":[[0,6]]},"1179":{"position":[[0,6]]},"1182":{"position":[[10,6]]},"1241":{"position":[[0,7]]},"1299":{"position":[[3,6]]},"1300":{"position":[[3,7]]},"1301":{"position":[[3,7]]}},"content":{"1":{"position":[[37,6],[98,7],[448,6],[502,10]]},"16":{"position":[[86,7]]},"17":{"position":[[418,6]]},"28":{"position":[[39,6],[93,7]]},"30":{"position":[[100,6]]},"32":{"position":[[38,6]]},"42":{"position":[[34,6]]},"131":{"position":[[788,6]]},"161":{"position":[[119,6]]},"162":{"position":[[621,6]]},"189":{"position":[[147,6],[243,6],[502,6],[534,7]]},"265":{"position":[[50,6],[102,6],[177,7],[735,6]]},"266":{"position":[[25,6],[288,6],[453,6],[638,8],[746,6],[844,6],[909,6]]},"267":{"position":[[163,6],[1153,6],[1313,6]]},"287":{"position":[[899,6],[986,7]]},"304":{"position":[[210,6],[295,6],[490,6]]},"311":{"position":[[75,7]]},"336":{"position":[[364,7]]},"346":{"position":[[451,6]]},"358":{"position":[[535,7],[724,6],[781,7]]},"365":{"position":[[146,6],[250,7],[432,6],[481,6]]},"368":{"position":[[181,7]]},"376":{"position":[[275,6]]},"408":{"position":[[4762,6]]},"411":{"position":[[2217,6]]},"412":{"position":[[9283,6],[14458,7]]},"430":{"position":[[512,6],[1037,6]]},"450":{"position":[[746,6]]},"458":{"position":[[374,6]]},"463":{"position":[[733,8],[1413,9]]},"464":{"position":[[383,8]]},"465":{"position":[[244,8]]},"466":{"position":[[207,8]]},"467":{"position":[[182,8],[500,6]]},"469":{"position":[[877,6],[942,7]]},"504":{"position":[[380,7]]},"524":{"position":[[523,7]]},"528":{"position":[[113,6]]},"554":{"position":[[329,6],[637,6],[796,8]]},"581":{"position":[[368,7]]},"640":{"position":[[385,6]]},"643":{"position":[[128,6]]},"666":{"position":[[352,6]]},"693":{"position":[[843,9],[1147,9]]},"709":{"position":[[1403,6]]},"710":{"position":[[514,6],[577,6]]},"714":{"position":[[1010,6],[1095,6]]},"723":{"position":[[100,6],[2046,7]]},"724":{"position":[[1212,6]]},"772":{"position":[[2019,6]]},"773":{"position":[[61,6],[131,6],[323,6],[534,8],[662,6],[844,6]]},"774":{"position":[[46,6],[115,6],[190,6],[245,6],[629,6],[981,6],[1066,6]]},"793":{"position":[[255,6],[528,6]]},"800":{"position":[[399,6]]},"815":{"position":[[33,7]]},"838":{"position":[[1218,6],[1281,6],[1622,6]]},"872":{"position":[[1449,6],[1651,8]]},"898":{"position":[[2139,6]]},"955":{"position":[[82,6]]},"976":{"position":[[58,6]]},"1072":{"position":[[174,7]]},"1085":{"position":[[3517,6]]},"1090":{"position":[[71,6],[270,6],[343,6],[397,6],[502,8],[739,6],[1169,6],[1354,6]]},"1120":{"position":[[231,6],[674,6]]},"1124":{"position":[[1691,6]]},"1137":{"position":[[78,6]]},"1161":{"position":[[77,6]]},"1162":{"position":[[178,6],[339,6],[431,6],[574,7],[724,6],[861,6],[958,6],[1017,6],[1107,6]]},"1163":{"position":[[153,6],[365,6]]},"1164":{"position":[[462,6],[650,6],[927,6],[1038,6]]},"1165":{"position":[[5,6],[630,6],[944,6]]},"1168":{"position":[[115,8]]},"1174":{"position":[[180,6]]},"1180":{"position":[[77,6],[399,6]]},"1181":{"position":[[73,6],[244,6],[361,6],[426,6],[518,6],[662,7],[812,6]]},"1182":{"position":[[153,6],[365,6]]},"1183":{"position":[[12,6],[309,6],[541,6]]},"1184":{"position":[[91,6],[223,6],[332,6],[519,6]]},"1185":{"position":[[27,6],[114,6]]},"1186":{"position":[[21,6]]},"1192":{"position":[[275,6],[307,6],[453,6],[594,6]]},"1195":{"position":[[252,6]]},"1219":{"position":[[320,8]]},"1239":{"position":[[120,6],[169,7],[350,7],[661,6]]},"1241":{"position":[[56,6]]},"1244":{"position":[[110,6]]},"1246":{"position":[[1221,6],[1241,6],[1332,6],[1397,6]]},"1271":{"position":[[494,7]]},"1292":{"position":[[396,6],[433,6],[534,6],[578,6],[627,6]]},"1299":{"position":[[153,6],[222,6],[300,6]]},"1300":{"position":[[255,6]]},"1301":{"position":[[184,6]]},"1321":{"position":[[1,6],[443,7],[565,7],[773,7],[1026,6]]}},"keywords":{}}],["memory)no",{"_index":6416,"title":{},"content":{"1292":{"position":[[935,10]]}},"keywords":{}}],["memory.it",{"_index":6126,"title":{},"content":{"1170":{"position":[[57,9]]}},"keywords":{}}],["memory.slow",{"_index":6128,"title":{},"content":{"1171":{"position":[[195,11]]}},"keywords":{}}],["memory.watermelondb",{"_index":6578,"title":{},"content":{"1324":{"position":[[489,19]]}},"keywords":{}}],["memorydatabas",{"_index":6123,"title":{},"content":{"1165":{"position":[[1044,14]]}},"keywords":{}}],["memorydatabase.addcollect",{"_index":6124,"title":{},"content":{"1165":{"position":[[1145,32]]}},"keywords":{}}],["memorysyncedstorag",{"_index":6117,"title":{},"content":{"1165":{"position":[[341,19],[1115,19]]}},"keywords":{}}],["mention",{"_index":209,"title":{},"content":{"14":{"position":[[329,9]]},"164":{"position":[[4,9]]},"1316":{"position":[[2653,9]]}},"keywords":{}}],["meow",{"_index":4611,"title":{},"content":{"792":{"position":[[376,5]]},"932":{"position":[[180,6]]}},"keywords":{}}],["merg",{"_index":1310,"title":{"691":{"position":[[9,7]]}},"content":{"203":{"position":[[226,5]]},"250":{"position":[[241,7],[321,6]]},"339":{"position":[[163,7]]},"356":{"position":[[613,6]]},"411":{"position":[[1435,6],[3441,6]]},"412":{"position":[[2335,5],[2385,5],[3064,5],[3492,5],[3574,5],[3740,5],[4081,6],[4402,5],[5375,5]]},"495":{"position":[[209,7]]},"496":{"position":[[207,7],[277,5]]},"565":{"position":[[197,5]]},"590":{"position":[[866,5]]},"632":{"position":[[502,6],[2710,6]]},"635":{"position":[[174,5],[353,7]]},"668":{"position":[[297,6]]},"687":{"position":[[181,5]]},"688":{"position":[[41,5],[852,5]]},"689":{"position":[[48,8],[197,5],[342,6]]},"690":{"position":[[75,5],[224,7],[302,6],[546,8]]},"691":{"position":[[170,5],[587,6]]},"982":{"position":[[116,6]]},"1119":{"position":[[211,5]]},"1133":{"position":[[633,7]]},"1186":{"position":[[48,5]]},"1252":{"position":[[327,7]]},"1309":{"position":[[1107,5]]}},"keywords":{}}],["mergefieldshandl",{"_index":3911,"title":{},"content":{"691":{"position":[[216,18]]}},"keywords":{}}],["mergemap(async",{"_index":5509,"title":{},"content":{"995":{"position":[[1627,16]]}},"keywords":{}}],["merit",{"_index":1240,"title":{},"content":{"186":{"position":[[162,7]]}},"keywords":{}}],["messag",{"_index":1617,"title":{"748":{"position":[[11,8]]},"749":{"position":[[15,9]]},"1220":{"position":[[15,9]]}},"content":{"267":{"position":[[142,10],[298,9],[344,8]]},"316":{"position":[[304,8]]},"379":{"position":[[259,8]]},"392":{"position":[[3356,8]]},"408":{"position":[[4482,9]]},"414":{"position":[[39,8],[94,8],[183,8]]},"415":{"position":[[156,8]]},"416":{"position":[[135,8],[170,8]]},"446":{"position":[[511,9]]},"458":{"position":[[1110,8],[1547,8]]},"564":{"position":[[1092,9]]},"610":{"position":[[71,9]]},"611":{"position":[[763,7]]},"612":{"position":[[847,8],[966,7],[1229,7],[1297,8],[1523,7],[2038,7],[2252,7],[2297,8]]},"617":{"position":[[116,9]]},"620":{"position":[[332,8]]},"621":{"position":[[295,8]]},"622":{"position":[[249,8]]},"639":{"position":[[481,8]]},"675":{"position":[[62,7]]},"696":{"position":[[421,8],[473,8]]},"711":{"position":[[1438,7]]},"737":{"position":[[356,9]]},"751":{"position":[[493,9],[797,9],[1241,7],[1595,9]]},"752":{"position":[[398,9]]},"865":{"position":[[89,7]]},"968":{"position":[[594,7]]},"1013":{"position":[[491,9]]},"1151":{"position":[[75,7],[149,7],[532,8]]},"1178":{"position":[[75,7],[148,7],[531,8]]},"1207":{"position":[[831,7]]},"1218":{"position":[[40,7],[149,9],[476,10],[824,10]]},"1220":{"position":[[52,8]]},"1228":{"position":[[245,9]]},"1246":{"position":[[766,7]]}},"keywords":{}}],["messagechannelcr",{"_index":6244,"title":{},"content":{"1218":{"position":[[83,21],[426,22]]}},"keywords":{}}],["messagecol",{"_index":4459,"title":{},"content":{"752":{"position":[[351,10]]}},"keywords":{}}],["messagecol.getmigrationst",{"_index":4464,"title":{},"content":{"752":{"position":[[865,31]]}},"keywords":{}}],["messagecol.migratepromise(10",{"_index":4472,"title":{},"content":{"752":{"position":[[1423,30]]}},"keywords":{}}],["messagecol.migrationneed",{"_index":4460,"title":{},"content":{"752":{"position":[[665,29]]}},"keywords":{}}],["messagecol.startmigration(10",{"_index":4462,"title":{},"content":{"752":{"position":[[751,30]]}},"keywords":{}}],["messageoruncaught",{"_index":6238,"title":{},"content":{"1213":{"position":[[841,17]]}},"keywords":{}}],["messageschema",{"_index":5597,"title":{},"content":{"1013":{"position":[[511,14]]}},"keywords":{}}],["messageschemav1",{"_index":4443,"title":{},"content":{"751":{"position":[[513,16],[817,16],[1615,16]]},"752":{"position":[[418,16]]}},"keywords":{}}],["met",{"_index":6550,"title":{},"content":{"1316":{"position":[[1313,4]]}},"keywords":{}}],["meta",{"_index":2900,"title":{"1153":{"position":[[23,4]]}},"content":{"429":{"position":[[522,4]]},"469":{"position":[[635,4]]},"719":{"position":[[324,4],[408,4]]},"746":{"position":[[591,4]]},"793":{"position":[[580,4]]},"1004":{"position":[[346,4]]},"1051":{"position":[[359,4]]},"1072":{"position":[[2144,4],[2399,4]]},"1079":{"position":[[263,4]]},"1154":{"position":[[5,4],[295,4]]},"1238":{"position":[[395,4],[772,4]]},"1239":{"position":[[573,4]]},"1246":{"position":[[1608,4],[1652,4]]}},"keywords":{}}],["metadata",{"_index":3092,"title":{},"content":{"469":{"position":[[671,8]]},"495":{"position":[[591,8]]},"724":{"position":[[585,8]]},"999":{"position":[[41,8],[197,9]]},"1005":{"position":[[224,8]]},"1028":{"position":[[58,8]]},"1188":{"position":[[257,9]]},"1246":{"position":[[1875,8]]}},"keywords":{}}],["metastorageinst",{"_index":4120,"title":{},"content":{"746":{"position":[[639,21]]}},"keywords":{}}],["meteor",{"_index":244,"title":{"15":{"position":[[0,7]]}},"content":{"15":{"position":[[3,6],[95,6],[347,6],[499,6]]}},"keywords":{}}],["meteorjss",{"_index":270,"title":{},"content":{"16":{"position":[[25,10]]}},"keywords":{}}],["method",{"_index":901,"title":{"396":{"position":[[16,8]]},"400":{"position":[[25,8]]},"425":{"position":[[24,8]]},"790":{"position":[[9,8]]},"791":{"position":[[13,7]]},"792":{"position":[[11,8]]},"810":{"position":[[4,7]]},"969":{"position":[[0,8]]},"1025":{"position":[[11,8]]},"1044":{"position":[[39,8]]}},"content":{"65":{"position":[[29,7]]},"145":{"position":[[243,7]]},"188":{"position":[[880,7]]},"209":{"position":[[847,7]]},"255":{"position":[[1193,7]]},"288":{"position":[[235,7]]},"289":{"position":[[1797,6]]},"300":{"position":[[510,6]]},"303":{"position":[[1380,6]]},"393":{"position":[[122,7],[357,8],[409,6],[654,6],[746,6]]},"394":{"position":[[1368,6]]},"396":{"position":[[9,7],[1752,6]]},"397":{"position":[[1426,7]]},"398":{"position":[[152,6],[455,8],[2912,7],[3188,6],[3287,6]]},"400":{"position":[[7,6],[161,6],[481,6]]},"418":{"position":[[677,6]]},"425":{"position":[[132,7]]},"434":{"position":[[25,6]]},"440":{"position":[[108,8]]},"450":{"position":[[546,8]]},"451":{"position":[[186,7]]},"452":{"position":[[536,6]]},"453":{"position":[[413,7]]},"460":{"position":[[1160,6]]},"462":{"position":[[54,7]]},"468":{"position":[[376,6]]},"481":{"position":[[284,8]]},"496":{"position":[[48,7]]},"610":{"position":[[81,6],[632,6]]},"617":{"position":[[126,8]]},"618":{"position":[[592,6]]},"626":{"position":[[1082,6]]},"682":{"position":[[269,6]]},"690":{"position":[[464,7]]},"711":{"position":[[2049,6]]},"749":{"position":[[4243,6],[8153,6],[8245,6],[8359,6],[8552,6]]},"775":{"position":[[223,8]]},"790":{"position":[[10,7]]},"791":{"position":[[78,8],[337,8]]},"792":{"position":[[12,7]]},"806":{"position":[[248,7]]},"810":{"position":[[60,7]]},"846":{"position":[[442,6],[1508,6]]},"848":{"position":[[142,6],[963,6],[1076,6]]},"851":{"position":[[384,7]]},"852":{"position":[[43,7],[76,6]]},"854":{"position":[[1713,7]]},"866":{"position":[[131,6]]},"875":{"position":[[6273,7],[7152,6]]},"886":{"position":[[5025,6]]},"890":{"position":[[218,8]]},"904":{"position":[[1710,6]]},"910":{"position":[[76,7]]},"934":{"position":[[96,7],[372,8]]},"937":{"position":[[30,7]]},"943":{"position":[[25,6]]},"949":{"position":[[48,7]]},"950":{"position":[[194,7]]},"958":{"position":[[229,6]]},"983":{"position":[[141,7],[400,6]]},"988":{"position":[[2568,7]]},"1044":{"position":[[257,8]]},"1052":{"position":[[288,7],[351,6],[381,6]]},"1059":{"position":[[82,7]]},"1064":{"position":[[22,8],[282,7]]},"1072":{"position":[[1061,8],[2766,6]]},"1085":{"position":[[1959,7],[2110,8],[2199,7],[2314,6]]},"1088":{"position":[[292,6]]},"1100":{"position":[[378,6]]},"1101":{"position":[[295,7]]},"1102":{"position":[[35,7],[541,7]]},"1114":{"position":[[292,6]]},"1116":{"position":[[243,6]]},"1117":{"position":[[211,6]]},"1148":{"position":[[858,6]]},"1164":{"position":[[1188,6]]},"1189":{"position":[[153,6]]},"1207":{"position":[[276,7],[474,6],[522,7]]},"1208":{"position":[[428,7]]},"1211":{"position":[[28,6]]},"1214":{"position":[[687,7]]},"1220":{"position":[[447,7]]},"1278":{"position":[[236,7]]},"1282":{"position":[[454,7]]},"1289":{"position":[[31,7]]},"1294":{"position":[[25,7],[113,7]]},"1295":{"position":[[1465,6]]},"1298":{"position":[[184,6]]},"1311":{"position":[[1026,8],[1647,6],[1695,6]]}},"keywords":{}}],["methodolog",{"_index":3253,"title":{},"content":{"516":{"position":[[29,12]]}},"keywords":{}}],["metric",{"_index":3661,"title":{},"content":{"620":{"position":[[711,6]]},"783":{"position":[[156,6]]},"1152":{"position":[[128,8]]},"1194":{"position":[[20,7]]}},"keywords":{}}],["mg1",{"_index":4433,"title":{},"content":{"749":{"position":[[23779,3]]}},"keywords":{}}],["mib",{"_index":2895,"title":{},"content":{"427":{"position":[[1522,3]]}},"keywords":{}}],["microsecond",{"_index":3456,"title":{},"content":{"569":{"position":[[605,13]]},"571":{"position":[[1509,13]]}},"keywords":{}}],["microservic",{"_index":4585,"title":{"775":{"position":[[23,13]]},"1094":{"position":[[24,14]]}},"content":{"775":{"position":[[456,12],[589,13]]},"1094":{"position":[[37,12],[72,13],[185,13],[262,13],[517,13],[582,13]]},"1219":{"position":[[147,12]]}},"keywords":{}}],["microsoft",{"_index":522,"title":{},"content":{"33":{"position":[[491,9]]},"616":{"position":[[1151,9]]}},"keywords":{}}],["mid",{"_index":2073,"title":{},"content":{"358":{"position":[[1059,3]]},"841":{"position":[[945,3]]}},"keywords":{}}],["middl",{"_index":3379,"title":{},"content":{"556":{"position":[[1881,6]]}},"keywords":{}}],["middlewar",{"_index":4512,"title":{"762":{"position":[[0,10]]}},"content":{"765":{"position":[[1,10]]},"793":{"position":[[1128,10]]},"829":{"position":[[826,10]]}},"keywords":{}}],["midnight",{"_index":2752,"title":{},"content":{"412":{"position":[[11996,8]]},"702":{"position":[[328,9]]}},"keywords":{}}],["migrat",{"_index":435,"title":{"282":{"position":[[14,9]]},"367":{"position":[[27,9]]},"403":{"position":[[0,9]]},"636":{"position":[[7,11]]},"664":{"position":[[5,9]]},"702":{"position":[[12,7]]},"750":{"position":[[0,7]]},"754":{"position":[[0,9]]},"755":{"position":[[0,9]]},"756":{"position":[[0,9]]},"757":{"position":[[0,9]]},"758":{"position":[[8,9]]},"760":{"position":[[0,7]]},"938":{"position":[[0,10]]},"1165":{"position":[[16,9]]},"1319":{"position":[[0,9]]}},"content":{"26":{"position":[[392,8]]},"57":{"position":[[155,9],[225,10],[310,10]]},"110":{"position":[[134,10]]},"174":{"position":[[2193,9]]},"282":{"position":[[434,9]]},"351":{"position":[[84,10],[356,9]]},"367":{"position":[[178,9],[241,10],[306,9]]},"382":{"position":[[299,9]]},"403":{"position":[[121,7],[207,9],[357,9],[651,9]]},"412":{"position":[[11016,11],[11138,9],[11332,9],[11699,9],[11763,9],[11845,9],[11966,9]]},"544":{"position":[[184,10],[248,11]]},"604":{"position":[[156,10],[220,11]]},"636":{"position":[[110,10],[287,9]]},"664":{"position":[[5,9]]},"686":{"position":[[935,10]]},"702":{"position":[[206,7],[563,7],[627,9],[711,7],[769,7]]},"719":{"position":[[232,9],[252,7]]},"749":{"position":[[12192,9],[12202,9],[12283,9],[12410,9],[12491,9],[12628,7]]},"751":{"position":[[454,9],[1556,9]]},"752":{"position":[[17,9],[139,9],[265,9],[298,9],[464,9],[624,9],[741,9],[1227,8]]},"753":{"position":[[67,9],[205,10],[390,10]]},"754":{"position":[[120,10],[510,10]]},"755":{"position":[[114,9]]},"756":{"position":[[50,9],[125,7],[184,9],[300,9],[398,9]]},"757":{"position":[[188,9],[277,9]]},"759":{"position":[[22,7],[552,9],[805,7],[868,7],[973,10],[1122,9],[1447,7]]},"760":{"position":[[4,7],[212,9],[548,9],[861,10]]},"761":{"position":[[201,10]]},"793":{"position":[[1003,9],[1021,9]]},"836":{"position":[[2097,9],[2174,10]]},"839":{"position":[[880,9]]},"841":{"position":[[1147,10],[1261,9]]},"879":{"position":[[53,10]]},"938":{"position":[[77,9],[141,10]]},"977":{"position":[[252,7]]},"1100":{"position":[[976,9]]},"1124":{"position":[[418,7]]},"1162":{"position":[[786,10]]},"1165":{"position":[[67,10],[570,10],[665,9]]},"1198":{"position":[[2097,7]]},"1222":{"position":[[516,10]]},"1260":{"position":[[1,9]]},"1319":{"position":[[96,7],[426,9],[550,7],[591,9],[730,9]]}},"keywords":{}}],["migrated.ani",{"_index":4497,"title":{},"content":{"759":{"position":[[1294,12]]}},"keywords":{}}],["migratepromis",{"_index":4470,"title":{},"content":{"752":{"position":[[1378,18],[1460,15]]}},"keywords":{}}],["migratestorag",{"_index":4486,"title":{},"content":{"759":{"position":[[96,14],[462,16],[1084,16],[1548,17]]},"760":{"position":[[272,14],[458,16]]}},"keywords":{}}],["migrationencrypt",{"_index":3327,"title":{},"content":{"544":{"position":[[270,20]]}},"keywords":{}}],["migrationpromis",{"_index":4471,"title":{},"content":{"752":{"position":[[1404,16]]}},"keywords":{}}],["migrationst",{"_index":4463,"title":{"753":{"position":[[0,18]]}},"content":{"752":{"position":[[848,14]]},"755":{"position":[[150,16]]}},"keywords":{}}],["migrationstate.$.subscrib",{"_index":4465,"title":{},"content":{"752":{"position":[[923,28]]}},"keywords":{}}],["migrationstate.collection.nam",{"_index":4479,"title":{},"content":{"753":{"position":[[414,30]]}},"keywords":{}}],["migrationstrategi",{"_index":2496,"title":{},"content":{"403":{"position":[[782,20]]},"749":{"position":[[7851,19],[7948,17],[8046,17]]},"751":{"position":[[52,19],[170,19],[256,17],[530,20],[834,20],[1632,20]]},"752":{"position":[[195,19],[499,20]]},"754":{"position":[[235,19]]},"934":{"position":[[563,20]]},"938":{"position":[[21,19]]},"1076":{"position":[[109,19]]},"1085":{"position":[[3345,19]]}},"keywords":{}}],["mild",{"_index":2081,"title":{},"content":{"361":{"position":[[198,4]]}},"keywords":{}}],["million",{"_index":2567,"title":{},"content":{"408":{"position":[[4474,7],[4824,7]]},"412":{"position":[[10475,7]]},"420":{"position":[[380,7]]},"703":{"position":[[1351,7]]}},"keywords":{}}],["millisecond",{"_index":1602,"title":{},"content":{"265":{"position":[[357,11]]},"394":{"position":[[1638,13]]},"400":{"position":[[22,12],[586,12]]},"408":{"position":[[3091,13],[4871,12]]},"463":{"position":[[974,13],[1293,13],[1400,12]]},"464":{"position":[[519,12],[711,12],[771,12],[1216,11]]},"465":{"position":[[381,12]]},"467":{"position":[[706,12]]},"569":{"position":[[577,13],[787,13]]},"570":{"position":[[405,13]]},"571":{"position":[[1493,12],[1584,12]]},"644":{"position":[[468,11]]},"653":{"position":[[370,12],[908,12]]},"654":{"position":[[279,13]]},"703":{"position":[[1514,12]]},"704":{"position":[[86,13]]},"846":{"position":[[895,12]]},"988":{"position":[[874,12]]},"1104":{"position":[[553,12]]},"1295":{"position":[[1056,13]]},"1301":{"position":[[1448,14]]}},"keywords":{}}],["millisecondscooki",{"_index":3045,"title":{},"content":{"464":{"position":[[269,19]]},"465":{"position":[[130,19]]},"466":{"position":[[96,19]]},"467":{"position":[[68,19]]}},"keywords":{}}],["millisecondsindexeddb",{"_index":3031,"title":{},"content":{"463":{"position":[[656,21]]}},"keywords":{}}],["mimic",{"_index":369,"title":{},"content":{"22":{"position":[[132,5]]}},"keywords":{}}],["min",{"_index":4303,"title":{},"content":{"749":{"position":[[12983,3]]}},"keywords":{}}],["min$max$inc$set$unset$push$addtoset$pop$pullall$renam",{"_index":3868,"title":{},"content":{"679":{"position":[[197,55]]}},"keywords":{}}],["mind",{"_index":2741,"title":{},"content":{"412":{"position":[[10354,7],[15359,4]]},"625":{"position":[[129,5]]},"699":{"position":[[565,4]]},"723":{"position":[[2496,5]]},"858":{"position":[[445,4]]},"981":{"position":[[122,5]]},"1069":{"position":[[380,4]]}},"keywords":{}}],["mine",{"_index":2841,"title":{},"content":{"420":{"position":[[1261,7]]}},"keywords":{}}],["minecraft",{"_index":5553,"title":{},"content":{"1006":{"position":[[27,9]]}},"keywords":{}}],["mingo",{"_index":3865,"title":{},"content":{"678":{"position":[[186,5]]},"679":{"position":[[62,6]]},"1041":{"position":[[69,5]]}},"keywords":{}}],["minid",{"_index":5092,"title":{},"content":{"885":{"position":[[1510,5],[2261,6]]}},"keywords":{}}],["minifi",{"_index":6414,"title":{},"content":{"1292":{"position":[[854,9]]}},"keywords":{}}],["minified+gzip",{"_index":6415,"title":{},"content":{"1292":{"position":[[885,15]]}},"keywords":{}}],["minilm",{"_index":2184,"title":{},"content":{"390":{"position":[[287,7]]},"391":{"position":[[403,6],[546,6]]},"401":{"position":[[206,6]]},"402":{"position":[[1905,6]]}},"keywords":{}}],["minim",{"_index":921,"title":{},"content":{"65":{"position":[[1084,8]]},"76":{"position":[[126,10]]},"173":{"position":[[2609,7]]},"197":{"position":[[4,8]]},"216":{"position":[[126,8]]},"224":{"position":[[239,10]]},"234":{"position":[[177,10]]},"283":{"position":[[199,9]]},"311":{"position":[[67,7]]},"313":{"position":[[230,7]]},"316":{"position":[[4,8]]},"323":{"position":[[388,7]]},"334":{"position":[[12,7]]},"345":{"position":[[82,8]]},"350":{"position":[[333,10]]},"369":{"position":[[1131,8]]},"376":{"position":[[296,8]]},"382":{"position":[[360,10]]},"385":{"position":[[146,10]]},"402":{"position":[[2530,7]]},"408":{"position":[[3292,10]]},"412":{"position":[[754,7]]},"418":{"position":[[360,7]]},"429":{"position":[[339,7]]},"463":{"position":[[1006,7]]},"490":{"position":[[530,8]]},"502":{"position":[[1372,10]]},"528":{"position":[[99,9]]},"559":{"position":[[881,7]]},"566":{"position":[[830,8]]},"644":{"position":[[546,7]]},"690":{"position":[[410,7]]},"802":{"position":[[577,10]]},"902":{"position":[[103,10]]},"1071":{"position":[[357,7]]},"1123":{"position":[[288,7]]},"1266":{"position":[[958,9],[974,10]]},"1295":{"position":[[1035,7]]},"1298":{"position":[[379,8]]}},"keywords":{}}],["minimalist",{"_index":509,"title":{},"content":{"33":{"position":[[15,12]]}},"keywords":{}}],["minimongo",{"_index":261,"title":{"16":{"position":[[0,10]]}},"content":{"15":{"position":[[407,9]]},"16":{"position":[[36,9],[55,9],[266,9],[373,9],[528,9]]}},"keywords":{}}],["minimum",{"_index":3747,"title":{},"content":{"653":{"position":[[354,7],[560,7]]},"680":{"position":[[951,8]]},"749":{"position":[[20618,7],[21312,8]]},"1079":{"position":[[297,8]]},"1080":{"position":[[534,8],[566,8]]}},"keywords":{}}],["minimumcollectionag",{"_index":3753,"title":{},"content":{"653":{"position":[[777,21]]}},"keywords":{}}],["minimumdeletedtim",{"_index":3750,"title":{},"content":{"653":{"position":[[490,19]]},"654":{"position":[[126,18],[224,18],[415,18]]}},"keywords":{}}],["minor",{"_index":6087,"title":{},"content":{"1151":{"position":[[295,5]]},"1178":{"position":[[294,5]]}},"keywords":{}}],["mintimestamp",{"_index":5464,"title":{},"content":{"988":{"position":[[3564,12]]}},"keywords":{}}],["minupdatedat",{"_index":5095,"title":{},"content":{"885":{"position":[[1567,12],[2089,13],[2140,13],[2189,13]]}},"keywords":{}}],["minut",{"_index":2286,"title":{},"content":{"392":{"position":[[5176,7]]},"408":{"position":[[4597,7]]},"567":{"position":[[429,8]]},"653":{"position":[[934,8],[975,7]]},"736":{"position":[[412,7]]}},"keywords":{}}],["mirror",{"_index":2921,"title":{},"content":{"437":{"position":[[74,9]]},"898":{"position":[[1647,7]]}},"keywords":{}}],["mishandl",{"_index":3106,"title":{},"content":{"475":{"position":[[15,9]]}},"keywords":{}}],["mislead",{"_index":3204,"title":{},"content":{"497":{"position":[[484,7]]}},"keywords":{}}],["mismatch",{"_index":4502,"title":{},"content":{"761":{"position":[[296,8]]}},"keywords":{}}],["miss",{"_index":741,"title":{"626":{"position":[[13,4]]},"851":{"position":[[9,8]]},"876":{"position":[[0,7]]}},"content":{"47":{"position":[[1057,8]]},"330":{"position":[[143,7]]},"432":{"position":[[857,7]]},"458":{"position":[[788,7]]},"569":{"position":[[437,4]]},"610":{"position":[[1609,4]]},"626":{"position":[[62,4],[152,6],[369,6],[1102,6]]},"749":{"position":[[5181,7],[7969,7],[11302,7],[11477,7],[19705,7]]},"759":{"position":[[1319,7]]},"851":{"position":[[67,7]]},"875":{"position":[[8683,6],[8765,6]]},"898":{"position":[[497,4]]},"911":{"position":[[74,7]]},"985":{"position":[[509,6]]},"988":{"position":[[5895,6]]},"1024":{"position":[[173,7]]},"1123":{"position":[[651,8]]},"1300":{"position":[[1047,7]]}},"keywords":{}}],["mistak",{"_index":5396,"title":{},"content":{"966":{"position":[[174,8]]},"995":{"position":[[538,7]]}},"keywords":{}}],["mitig",{"_index":2550,"title":{},"content":{"408":{"position":[[2688,8],[3274,9]]},"412":{"position":[[13366,8],[15239,8]]}},"keywords":{}}],["mix",{"_index":2823,"title":{},"content":{"419":{"position":[[1826,6]]},"469":{"position":[[521,3]]},"749":{"position":[[4371,3],[4622,3]]},"875":{"position":[[5801,3]]},"1126":{"position":[[238,5]]}},"keywords":{}}],["mixedbread",{"_index":2465,"title":{},"content":{"401":{"position":[[461,10]]}},"keywords":{}}],["mj",{"_index":6319,"title":{},"content":{"1266":{"position":[[895,7]]}},"keywords":{}}],["mobil",{"_index":199,"title":{"152":{"position":[[28,6]]},"177":{"position":[[20,6]]},"443":{"position":[[0,6],[39,6]]},"444":{"position":[[14,6]]},"445":{"position":[[38,6]]},"618":{"position":[[33,6]]}},"content":{"14":{"position":[[59,6]]},"18":{"position":[[74,6]]},"36":{"position":[[24,6]]},"59":{"position":[[202,6]]},"152":{"position":[[1,6]]},"153":{"position":[[107,6]]},"170":{"position":[[61,6],[557,6]]},"172":{"position":[[197,6]]},"177":{"position":[[122,6]]},"207":{"position":[[200,6]]},"215":{"position":[[309,6]]},"254":{"position":[[171,6],[449,6]]},"287":{"position":[[1124,6]]},"298":{"position":[[637,6]]},"299":{"position":[[460,6]]},"309":{"position":[[45,6]]},"314":{"position":[[983,6]]},"318":{"position":[[327,6]]},"359":{"position":[[99,6]]},"371":{"position":[[5,6]]},"376":{"position":[[682,6]]},"384":{"position":[[257,6]]},"408":{"position":[[629,6],[4949,6]]},"410":{"position":[[1235,6]]},"412":{"position":[[7837,6],[8475,6]]},"444":{"position":[[1,6],[102,6],[184,6],[357,6]]},"445":{"position":[[88,6],[335,6],[515,6],[2204,6]]},"447":{"position":[[1,6],[76,6],[311,6],[701,6]]},"483":{"position":[[1058,6]]},"500":{"position":[[103,6]]},"575":{"position":[[198,6]]},"595":{"position":[[1372,6]]},"614":{"position":[[170,6]]},"618":{"position":[[19,6],[201,6],[537,6]]},"630":{"position":[[286,7]]},"631":{"position":[[175,6]]},"640":{"position":[[271,6],[533,7]]},"641":{"position":[[416,6]]},"832":{"position":[[356,6]]},"838":{"position":[[1139,6]]},"839":{"position":[[74,6]]},"841":{"position":[[1057,6]]},"871":{"position":[[711,6]]},"897":{"position":[[457,6]]},"1232":{"position":[[47,6]]}},"keywords":{}}],["mobile.join",{"_index":1912,"title":{},"content":{"318":{"position":[[511,11]]}},"keywords":{}}],["mobile—mani",{"_index":1760,"title":{},"content":{"299":{"position":[[1334,11]]}},"keywords":{}}],["mobx",{"_index":2616,"title":{},"content":{"411":{"position":[[2007,5]]},"520":{"position":[[382,4]]},"785":{"position":[[305,5]]}},"keywords":{}}],["mocha",{"_index":4075,"title":{},"content":{"730":{"position":[[170,6]]}},"keywords":{}}],["mock",{"_index":332,"title":{"1159":{"position":[[0,7]]}},"content":{"19":{"position":[[488,4]]},"1159":{"position":[[117,4]]}},"keywords":{}}],["modal",{"_index":2504,"title":{},"content":{"404":{"position":[[456,5],[556,10]]}},"keywords":{}}],["moddatetim",{"_index":5198,"title":{},"content":{"898":{"position":[[861,11]]}},"keywords":{}}],["mode",{"_index":1872,"title":{"671":{"position":[[4,4]]},"675":{"position":[[16,4]]}},"content":{"305":{"position":[[319,5]]},"346":{"position":[[688,4]]},"399":{"position":[[340,5]]},"411":{"position":[[5714,5]]},"412":{"position":[[10716,5],[12042,5]]},"420":{"position":[[1503,4]]},"445":{"position":[[499,5]]},"453":{"position":[[278,6]]},"500":{"position":[[686,5]]},"626":{"position":[[644,5],[705,4],[851,4],[1037,4]]},"653":{"position":[[1393,5]]},"661":{"position":[[1238,5]]},"674":{"position":[[181,5],[279,5],[346,5]]},"675":{"position":[[14,4],[129,4],[269,6]]},"676":{"position":[[52,4]]},"685":{"position":[[550,4]]},"749":{"position":[[2626,4],[6110,4],[20933,4],[21738,4]]},"793":{"position":[[67,4]]},"875":{"position":[[6608,5],[6700,5],[8893,4]]},"932":{"position":[[1152,4],[1327,4]]},"966":{"position":[[512,5]]},"983":{"position":[[1125,6]]},"984":{"position":[[689,5]]},"985":{"position":[[708,5]]},"988":{"position":[[4116,5],[6031,4],[6116,4]]},"1085":{"position":[[3270,5],[3439,5]]},"1143":{"position":[[536,4]]},"1218":{"position":[[409,5]]},"1222":{"position":[[962,5],[1277,5]]},"1266":{"position":[[702,5]]},"1297":{"position":[[155,5],[429,4]]},"1313":{"position":[[689,5]]}},"keywords":{}}],["mode').then",{"_index":3846,"title":{},"content":{"672":{"position":[[115,12]]},"673":{"position":[[121,12]]},"674":{"position":[[404,12]]}},"keywords":{}}],["mode.wasm",{"_index":3085,"title":{},"content":{"467":{"position":[[380,9]]}},"keywords":{}}],["model",{"_index":954,"title":{"401":{"position":[[19,7]]}},"content":{"68":{"position":[[37,5]]},"126":{"position":[[122,6]]},"174":{"position":[[514,6]]},"179":{"position":[[333,5]]},"210":{"position":[[755,6]]},"226":{"position":[[45,6]]},"231":{"position":[[253,5]]},"279":{"position":[[423,5]]},"345":{"position":[[14,5]]},"350":{"position":[[254,5]]},"354":{"position":[[1274,7]]},"382":{"position":[[38,7]]},"384":{"position":[[473,6]]},"390":{"position":[[275,6],[1050,5],[1124,7]]},"391":{"position":[[213,6],[416,6],[832,5],[1003,6],[1079,6]]},"392":{"position":[[2000,5]]},"396":{"position":[[1034,6]]},"401":{"position":[[82,6],[130,5],[180,5],[632,6],[708,5],[766,6],[839,5],[915,5]]},"402":{"position":[[1715,7],[1786,7],[1847,7],[1888,5],[2002,6],[2092,5],[2118,5]]},"403":{"position":[[62,5]]},"404":{"position":[[465,7],[506,6],[851,6],[950,5]]},"412":{"position":[[11068,6],[13728,5],[14378,5]]},"542":{"position":[[155,6]]},"566":{"position":[[48,5]]},"630":{"position":[[227,5]]},"635":{"position":[[16,7]]},"690":{"position":[[97,5]]},"765":{"position":[[37,5]]},"828":{"position":[[216,6]]},"831":{"position":[[94,6]]},"838":{"position":[[949,8]]},"841":{"position":[[274,5]]},"898":{"position":[[1819,5],[4294,5]]},"1132":{"position":[[359,6],[400,6]]},"1284":{"position":[[294,7]]},"1319":{"position":[[203,7]]}},"keywords":{}}],["model.histor",{"_index":4796,"title":{},"content":{"839":{"position":[[282,18]]}},"keywords":{}}],["model/index",{"_index":2493,"title":{"403":{"position":[[18,11]]}},"content":{},"keywords":{}}],["modelofflin",{"_index":1907,"title":{},"content":{"317":{"position":[[160,12]]}},"keywords":{}}],["models.r",{"_index":2006,"title":{},"content":{"353":{"position":[[289,11]]}},"keywords":{}}],["modelsadvanc",{"_index":3698,"title":{},"content":{"631":{"position":[[363,14]]}},"keywords":{}}],["moder",{"_index":4814,"title":{},"content":{"841":{"position":[[1381,8]]}},"keywords":{}}],["modern",{"_index":256,"title":{"423":{"position":[[22,6]]},"449":{"position":[[32,6]]},"783":{"position":[[0,6]]}},"content":{"15":{"position":[[285,6]]},"47":{"position":[[194,6]]},"83":{"position":[[223,6]]},"105":{"position":[[30,6]]},"131":{"position":[[467,6]]},"174":{"position":[[566,6]]},"175":{"position":[[678,7]]},"287":{"position":[[642,6]]},"288":{"position":[[75,6]]},"299":{"position":[[1628,6]]},"300":{"position":[[454,6]]},"309":{"position":[[38,6]]},"321":{"position":[[1,7]]},"322":{"position":[[97,7]]},"336":{"position":[[222,6]]},"352":{"position":[[4,6]]},"364":{"position":[[392,6]]},"375":{"position":[[569,6]]},"378":{"position":[[92,6]]},"402":{"position":[[1995,6]]},"408":{"position":[[792,6],[1271,6]]},"410":{"position":[[402,6]]},"412":{"position":[[15210,6]]},"418":{"position":[[519,6]]},"432":{"position":[[1187,6]]},"434":{"position":[[89,6]]},"435":{"position":[[159,6]]},"441":{"position":[[17,6]]},"452":{"position":[[760,6]]},"500":{"position":[[338,6]]},"502":{"position":[[205,6]]},"517":{"position":[[38,6]]},"521":{"position":[[127,6]]},"524":{"position":[[370,6]]},"535":{"position":[[189,6]]},"542":{"position":[[123,7]]},"548":{"position":[[458,6]]},"574":{"position":[[144,6]]},"576":{"position":[[410,7]]},"581":{"position":[[319,6]]},"595":{"position":[[202,6]]},"608":{"position":[[456,6]]},"617":{"position":[[6,6]]},"640":{"position":[[137,6]]},"641":{"position":[[268,6]]},"644":{"position":[[655,6]]},"801":{"position":[[858,6]]},"911":{"position":[[11,6]]},"1098":{"position":[[162,7]]},"1207":{"position":[[84,6]]},"1322":{"position":[[1,6]]}},"keywords":{}}],["modif",{"_index":1126,"title":{},"content":{"140":{"position":[[164,13]]},"206":{"position":[[282,13]]},"344":{"position":[[39,13]]},"412":{"position":[[2662,13]]},"445":{"position":[[1030,13]]},"571":{"position":[[1539,12]]},"632":{"position":[[91,14]]},"898":{"position":[[298,12]]}},"keywords":{}}],["modifi",{"_index":1114,"title":{"1042":{"position":[[0,9]]},"1061":{"position":[[0,8]]},"1105":{"position":[[6,9]]}},"content":{"134":{"position":[[68,6]]},"191":{"position":[[69,8]]},"203":{"position":[[351,6]]},"358":{"position":[[522,6]]},"397":{"position":[[1357,6]]},"429":{"position":[[305,9]]},"667":{"position":[[167,6]]},"678":{"position":[[322,8],[353,9]]},"698":{"position":[[27,6],[138,8]]},"709":{"position":[[534,6]]},"749":{"position":[[10317,8],[10405,8],[14115,8]]},"766":{"position":[[143,6]]},"768":{"position":[[340,6]]},"770":{"position":[[85,6]]},"805":{"position":[[205,6]]},"829":{"position":[[3886,8]]},"846":{"position":[[751,8],[834,9],[1177,8],[1269,9]]},"886":{"position":[[1207,9],[1246,8],[2965,8],[2987,8],[3107,9]]},"887":{"position":[[442,9]]},"888":{"position":[[40,6]]},"889":{"position":[[23,6]]},"897":{"position":[[170,10]]},"898":{"position":[[261,8],[3514,9],[3744,9]]},"908":{"position":[[152,6]]},"986":{"position":[[665,10]]},"987":{"position":[[39,6]]},"988":{"position":[[3014,8],[3175,8],[3272,8],[3367,9],[4496,8],[4601,8],[4696,9]]},"1044":{"position":[[360,6]]},"1048":{"position":[[323,9],[517,8]]},"1051":{"position":[[118,9]]},"1069":{"position":[[551,6]]},"1083":{"position":[[57,8],[241,8]]},"1085":{"position":[[3391,8]]},"1105":{"position":[[11,8],[217,8],[313,8],[459,8]]},"1109":{"position":[[42,8]]},"1115":{"position":[[49,9],[152,8],[238,8],[496,8],[694,8]]},"1316":{"position":[[2023,8]]},"1317":{"position":[[247,6]]}},"keywords":{}}],["modifiedfield",{"_index":5223,"title":{},"content":{"898":{"position":[[3950,14]]}},"keywords":{}}],["modul",{"_index":50,"title":{},"content":{"2":{"position":[[436,6]]},"6":{"position":[[601,6],[799,6]]},"8":{"position":[[650,7]]},"10":{"position":[[397,6]]},"440":{"position":[[403,6]]},"479":{"position":[[376,7]]},"672":{"position":[[128,6]]},"673":{"position":[[134,6]]},"674":{"position":[[417,6]]},"711":{"position":[[754,7],[828,6]]},"717":{"position":[[429,7]]},"743":{"position":[[62,7]]},"829":{"position":[[1122,7]]},"836":{"position":[[1659,7]]},"960":{"position":[[91,7]]},"1133":{"position":[[139,6]]},"1138":{"position":[[73,6]]},"1139":{"position":[[180,6]]},"1145":{"position":[[176,6]]},"1162":{"position":[[945,7]]},"1174":{"position":[[388,7]]},"1176":{"position":[[85,6],[253,6]]},"1181":{"position":[[902,7]]},"1226":{"position":[[674,9]]},"1264":{"position":[[554,9]]},"1266":{"position":[[722,7]]},"1271":{"position":[[876,6],[1280,6],[1303,7]]},"1274":{"position":[[206,7]]},"1275":{"position":[[78,6]]},"1276":{"position":[[94,6],[603,7]]},"1286":{"position":[[14,6]]}},"keywords":{}}],["modular",{"_index":1060,"title":{},"content":{"116":{"position":[[150,7]]},"860":{"position":[[1072,11]]}},"keywords":{}}],["module.export",{"_index":3850,"title":{},"content":{"674":{"position":[[28,14]]},"1266":{"position":[[493,14]]}},"keywords":{}}],["moduleadd",{"_index":6357,"title":{},"content":{"1279":{"position":[[34,9]]}},"keywords":{}}],["moduleid",{"_index":6321,"title":{},"content":{"1266":{"position":[[930,10]]}},"keywords":{}}],["moduleimport",{"_index":6348,"title":{},"content":{"1277":{"position":[[43,12]]}},"keywords":{}}],["moment",{"_index":1155,"title":{},"content":{"151":{"position":[[56,6]]},"412":{"position":[[5883,7]]},"491":{"position":[[1748,6]]},"584":{"position":[[99,6]]},"679":{"position":[[8,7]]},"700":{"position":[[186,6]]},"723":{"position":[[1891,6]]},"739":{"position":[[140,6]]},"799":{"position":[[276,6]]},"945":{"position":[[413,6]]},"975":{"position":[[343,6],[537,6]]},"1115":{"position":[[872,6]]},"1300":{"position":[[860,6]]}},"keywords":{}}],["monet",{"_index":2674,"title":{},"content":{"412":{"position":[[2822,8]]}},"keywords":{}}],["money",{"_index":2706,"title":{},"content":{"412":{"position":[[6188,5]]}},"keywords":{}}],["mongo",{"_index":5683,"title":{},"content":{"1041":{"position":[[35,5]]}},"keywords":{}}],["mongocli",{"_index":4947,"title":{},"content":{"872":{"position":[[854,11],[890,11]]},"875":{"position":[[807,11],[874,11]]}},"keywords":{}}],["mongoclient('mongodb://localhost:27017",{"_index":4979,"title":{},"content":{"875":{"position":[[892,42]]}},"keywords":{}}],["mongoclient('mongodb://localhost:27017/?directconnection=tru",{"_index":4948,"title":{},"content":{"872":{"position":[[908,64]]}},"keywords":{}}],["mongoclient.connect",{"_index":4981,"title":{},"content":{"875":{"position":[[965,22]]}},"keywords":{}}],["mongoclient.db('mi",{"_index":4950,"title":{},"content":{"872":{"position":[[995,18]]}},"keywords":{}}],["mongocollect",{"_index":4983,"title":{},"content":{"875":{"position":[[1050,15]]}},"keywords":{}}],["mongocollection.find",{"_index":4993,"title":{},"content":{"875":{"position":[[2206,22]]}},"keywords":{}}],["mongocollection.findone({id",{"_index":5022,"title":{},"content":{"875":{"position":[[4655,28]]}},"keywords":{}}],["mongocollection.updateon",{"_index":5028,"title":{},"content":{"875":{"position":[[5208,26]]}},"keywords":{}}],["mongoconnect",{"_index":4980,"title":{},"content":{"875":{"position":[[941,15]]}},"keywords":{}}],["mongoconnection.db('mydatabas",{"_index":4982,"title":{},"content":{"875":{"position":[[1010,33]]}},"keywords":{}}],["mongod",{"_index":4941,"title":{},"content":{"872":{"position":[[545,6]]}},"keywords":{}}],["mongodatabas",{"_index":4949,"title":{},"content":{"872":{"position":[[979,13]]},"875":{"position":[[994,13]]}},"keywords":{}}],["mongodatabase.collection('mydoc",{"_index":4984,"title":{},"content":{"875":{"position":[[1074,35]]}},"keywords":{}}],["mongodatabase.createcollection('mi",{"_index":4951,"title":{},"content":{"872":{"position":[[1032,34]]}},"keywords":{}}],["mongodb",{"_index":260,"title":{"36":{"position":[[0,7]]},"869":{"position":[[0,7]]},"872":{"position":[[31,7]]},"1187":{"position":[[0,7]]},"1188":{"position":[[19,7]]},"1189":{"position":[[10,7]]}},"content":{"15":{"position":[[359,7]]},"16":{"position":[[116,7],[171,8]]},"23":{"position":[[476,8]]},"32":{"position":[[154,8]]},"33":{"position":[[344,8],[636,7]]},"36":{"position":[[247,7],[343,7],[375,7],[432,7]]},"43":{"position":[[182,9]]},"249":{"position":[[195,7]]},"350":{"position":[[151,8]]},"365":{"position":[[1568,7]]},"571":{"position":[[563,7]]},"678":{"position":[[97,7]]},"679":{"position":[[323,7]]},"708":{"position":[[159,8]]},"749":{"position":[[23834,7]]},"776":{"position":[[263,7],[291,7]]},"793":{"position":[[365,7],[782,7]]},"839":{"position":[[145,8],[191,7],[381,7],[441,7],[1025,7]]},"841":{"position":[[219,8],[435,7],[1512,7]]},"870":{"position":[[29,7],[137,7]]},"871":{"position":[[106,8],[145,7],[213,8],[444,7],[504,7],[544,7],[726,7],[760,7]]},"872":{"position":[[99,7],[152,7],[178,7],[238,7],[401,7],[448,7],[484,7],[663,7],[722,7],[763,7],[873,10],[2128,7],[2243,7],[2339,9],[2393,8],[2563,7],[2977,8]]},"873":{"position":[[26,7]]},"875":{"position":[[650,8],[717,7],[826,10],[5745,7],[5900,7],[7718,7]]},"962":{"position":[[534,7],[849,7],[937,9]]},"981":{"position":[[745,7]]},"1071":{"position":[[78,7]]},"1095":{"position":[[160,7]]},"1188":{"position":[[41,7],[154,7],[388,7]]},"1189":{"position":[[15,7],[44,7],[72,7],[241,7],[367,9],[479,7]]},"1196":{"position":[[178,7]]},"1247":{"position":[[242,8],[288,7],[394,7]]},"1324":{"position":[[912,8]]}},"keywords":{}}],["mongodb'",{"_index":4797,"title":{},"content":{"839":{"position":[[551,9],[900,9],[1357,9]]},"1112":{"position":[[369,9]]}},"keywords":{}}],["mongodb://localhost:27017",{"_index":4945,"title":{},"content":{"872":{"position":[[683,27],[2449,28]]}},"keywords":{}}],["mongodb://localhost:27017,localhost:27018,localhost:27019",{"_index":5389,"title":{},"content":{"962":{"position":[[1051,59]]},"1189":{"position":[[593,59]]}},"keywords":{}}],["mongodbrepl",{"_index":4975,"title":{},"content":{"873":{"position":[[110,18]]}},"keywords":{}}],["mongoos",{"_index":4514,"title":{},"content":{"764":{"position":[[14,9]]}},"keywords":{}}],["monitor",{"_index":1785,"title":{},"content":{"301":{"position":[[279,8]]},"502":{"position":[[752,7]]}},"keywords":{}}],["monkey",{"_index":6173,"title":{},"content":{"1198":{"position":[[844,6]]}},"keywords":{}}],["monolith",{"_index":2096,"title":{},"content":{"362":{"position":[[583,10]]}},"keywords":{}}],["monopol",{"_index":2891,"title":{},"content":{"427":{"position":[[1223,12]]}},"keywords":{}}],["month",{"_index":2966,"title":{},"content":{"453":{"position":[[872,7]]},"653":{"position":[[480,6],[543,6]]},"661":{"position":[[395,6]]}},"keywords":{}}],["monthli",{"_index":1318,"title":{},"content":{"204":{"position":[[131,7]]}},"keywords":{}}],["more",{"_index":222,"title":{"780":{"position":[[11,4]]},"1216":{"position":[[6,4]]}},"content":{"14":{"position":[[710,4]]},"25":{"position":[[149,4]]},"28":{"position":[[594,4]]},"34":{"position":[[716,4]]},"36":{"position":[[187,4]]},"39":{"position":[[326,4],[478,4]]},"40":{"position":[[717,4],[828,4]]},"47":{"position":[[320,4]]},"57":{"position":[[124,4],[470,4]]},"58":{"position":[[193,4],[314,4]]},"64":{"position":[[40,4],[190,4]]},"65":{"position":[[290,4],[396,4],[965,4],[1457,4],[2088,4]]},"84":{"position":[[12,4]]},"89":{"position":[[188,4]]},"90":{"position":[[72,4]]},"91":{"position":[[249,4]]},"92":{"position":[[216,4]]},"104":{"position":[[174,4]]},"114":{"position":[[12,4]]},"144":{"position":[[142,5]]},"149":{"position":[[12,4]]},"161":{"position":[[320,4]]},"173":{"position":[[1862,4]]},"174":{"position":[[3108,5]]},"197":{"position":[[167,4]]},"203":{"position":[[132,4]]},"205":{"position":[[79,4]]},"216":{"position":[[196,4]]},"219":{"position":[[333,4]]},"221":{"position":[[180,4]]},"224":{"position":[[317,4]]},"231":{"position":[[221,4]]},"263":{"position":[[553,4]]},"282":{"position":[[147,4]]},"291":{"position":[[516,4]]},"295":{"position":[[91,4]]},"298":{"position":[[619,4]]},"299":{"position":[[963,4],[1517,4],[1665,4]]},"303":{"position":[[44,4]]},"306":{"position":[[7,4]]},"318":{"position":[[359,5]]},"321":{"position":[[427,4]]},"336":{"position":[[548,4]]},"347":{"position":[[12,4]]},"351":{"position":[[163,4]]},"352":{"position":[[335,4]]},"353":{"position":[[166,4]]},"354":{"position":[[170,4],[669,4],[791,4]]},"362":{"position":[[256,4],[510,4],[1092,4]]},"364":{"position":[[597,4]]},"365":{"position":[[1029,4]]},"370":{"position":[[322,4]]},"371":{"position":[[327,4]]},"388":{"position":[[252,4]]},"392":{"position":[[149,4]]},"393":{"position":[[300,6]]},"395":{"position":[[508,4],[537,4]]},"396":{"position":[[718,4]]},"398":{"position":[[83,4]]},"399":{"position":[[85,4],[404,4]]},"401":{"position":[[783,4]]},"402":{"position":[[607,4],[1556,4],[1990,4]]},"404":{"position":[[671,4]]},"407":{"position":[[488,4],[728,4]]},"408":{"position":[[596,4],[2295,4],[3209,5]]},"409":{"position":[[56,4],[223,4]]},"411":{"position":[[550,4],[599,4],[755,4],[3109,4],[5254,4],[5322,4]]},"412":{"position":[[2453,4],[3643,4],[8533,4],[8993,4],[9349,4],[14390,4]]},"417":{"position":[[289,4]]},"418":{"position":[[850,4]]},"419":{"position":[[1145,4]]},"420":{"position":[[494,4]]},"421":{"position":[[223,4]]},"426":{"position":[[83,4]]},"427":{"position":[[430,4]]},"430":{"position":[[145,4],[623,4]]},"432":{"position":[[154,4]]},"441":{"position":[[504,4]]},"445":{"position":[[1948,4]]},"452":{"position":[[349,4],[796,4]]},"463":{"position":[[1104,4]]},"473":{"position":[[179,4]]},"474":{"position":[[294,4]]},"477":{"position":[[336,4]]},"480":{"position":[[1067,4]]},"483":{"position":[[404,4],[430,4],[450,4],[702,4]]},"491":{"position":[[772,5],[1459,5],[1868,4]]},"496":{"position":[[865,4]]},"497":{"position":[[788,4]]},"511":{"position":[[12,4]]},"521":{"position":[[505,4],[596,4]]},"524":{"position":[[972,4]]},"531":{"position":[[12,4]]},"533":{"position":[[194,5]]},"535":{"position":[[231,4],[517,4]]},"544":{"position":[[157,5]]},"545":{"position":[[131,5]]},"546":{"position":[[211,4]]},"551":{"position":[[388,4]]},"557":{"position":[[289,4]]},"560":{"position":[[127,4],[525,4],[677,4]]},"563":{"position":[[927,4]]},"564":{"position":[[5,4]]},"566":{"position":[[257,4]]},"571":{"position":[[1776,4]]},"572":{"position":[[39,4]]},"582":{"position":[[727,4]]},"591":{"position":[[12,4],[707,4]]},"593":{"position":[[194,5]]},"595":{"position":[[244,4],[537,4]]},"605":{"position":[[131,5]]},"606":{"position":[[211,4]]},"610":{"position":[[650,4]]},"612":{"position":[[1012,4]]},"617":{"position":[[640,4]]},"620":{"position":[[624,4]]},"621":{"position":[[830,4]]},"622":{"position":[[531,4]]},"623":{"position":[[192,4]]},"632":{"position":[[798,5],[1435,4]]},"634":{"position":[[598,4]]},"653":{"position":[[670,4]]},"659":{"position":[[966,4]]},"666":{"position":[[409,4]]},"681":{"position":[[102,4]]},"682":{"position":[[100,4]]},"686":{"position":[[192,4],[819,4]]},"688":{"position":[[296,4]]},"696":{"position":[[1241,5],[1931,4]]},"699":{"position":[[297,4]]},"701":{"position":[[737,4]]},"702":{"position":[[529,4]]},"705":{"position":[[566,4],[1303,4]]},"709":{"position":[[423,4]]},"710":{"position":[[2455,4]]},"711":{"position":[[2240,4]]},"717":{"position":[[257,4]]},"718":{"position":[[80,4]]},"723":{"position":[[2277,4]]},"740":{"position":[[39,4]]},"749":{"position":[[15534,4],[15668,4],[15800,4],[22494,4]]},"772":{"position":[[426,4]]},"780":{"position":[[246,4],[269,4],[624,4]]},"782":{"position":[[130,4],[177,4]]},"783":{"position":[[471,4]]},"784":{"position":[[249,4],[292,4]]},"799":{"position":[[58,4]]},"801":{"position":[[560,4]]},"802":{"position":[[669,4],[806,4]]},"821":{"position":[[903,4],[946,4]]},"831":{"position":[[444,4]]},"835":{"position":[[1030,4]]},"836":{"position":[[2361,4],[2469,4]]},"838":{"position":[[3179,4]]},"847":{"position":[[137,4]]},"875":{"position":[[1943,4],[4976,4]]},"886":{"position":[[1614,4]]},"889":{"position":[[98,4]]},"890":{"position":[[906,4]]},"906":{"position":[[635,4],[1091,4]]},"908":{"position":[[376,4]]},"912":{"position":[[737,4]]},"934":{"position":[[18,4]]},"936":{"position":[[128,4]]},"950":{"position":[[133,4]]},"963":{"position":[[181,4]]},"964":{"position":[[32,4]]},"973":{"position":[[72,4]]},"988":{"position":[[4015,4]]},"990":{"position":[[469,4]]},"1080":{"position":[[1139,4]]},"1087":{"position":[[65,4],[112,4]]},"1088":{"position":[[12,4]]},"1089":{"position":[[155,4]]},"1090":{"position":[[22,4]]},"1092":{"position":[[532,4]]},"1094":{"position":[[568,4],[577,4]]},"1095":{"position":[[230,4],[283,4]]},"1098":{"position":[[157,4]]},"1100":{"position":[[946,4]]},"1120":{"position":[[468,4],[544,4]]},"1125":{"position":[[881,4]]},"1132":{"position":[[1184,4]]},"1135":{"position":[[101,4]]},"1140":{"position":[[295,4]]},"1164":{"position":[[1339,4]]},"1173":{"position":[[173,4]]},"1175":{"position":[[445,4]]},"1206":{"position":[[275,4],[587,4]]},"1207":{"position":[[677,4],[708,4]]},"1208":{"position":[[1937,4]]},"1236":{"position":[[90,4]]},"1237":{"position":[[480,4]]},"1241":{"position":[[144,4]]},"1242":{"position":[[223,4]]},"1243":{"position":[[141,4]]},"1244":{"position":[[170,4]]},"1245":{"position":[[109,4]]},"1246":{"position":[[333,4],[653,4],[950,4],[1212,4],[1586,4],[1984,4],[2268,4]]},"1247":{"position":[[135,4],[236,4],[422,4],[586,4],[745,4]]},"1267":{"position":[[97,4],[215,4]]},"1304":{"position":[[711,4]]},"1308":{"position":[[648,4]]},"1316":{"position":[[3642,4]]},"1321":{"position":[[505,4],[531,4]]},"1324":{"position":[[1054,4]]}},"keywords":{}}],["more</button>",{"_index":3283,"title":{},"content":{"523":{"position":[[812,20]]}},"keywords":{}}],["more.loki",{"_index":6382,"title":{},"content":{"1284":{"position":[[339,9]]}},"keywords":{}}],["moreov",{"_index":2916,"title":{},"content":{"435":{"position":[[236,9]]},"624":{"position":[[1018,9]]}},"keywords":{}}],["morn",{"_index":3958,"title":{},"content":{"700":{"position":[[941,8]]}},"keywords":{}}],["mostli",{"_index":378,"title":{},"content":{"23":{"position":[[71,6]]},"26":{"position":[[68,6]]},"31":{"position":[[248,6]]},"266":{"position":[[1075,6]]},"390":{"position":[[1021,6]]},"402":{"position":[[1863,6]]},"411":{"position":[[3162,6]]},"554":{"position":[[441,6]]},"611":{"position":[[1158,6]]},"709":{"position":[[679,6]]},"749":{"position":[[16706,6]]},"800":{"position":[[599,6]]},"841":{"position":[[1313,6]]},"861":{"position":[[2002,6]]},"863":{"position":[[445,6]]},"1068":{"position":[[143,6]]},"1092":{"position":[[379,6]]},"1107":{"position":[[299,6]]},"1195":{"position":[[115,6]]},"1198":{"position":[[410,6]]},"1229":{"position":[[137,6]]},"1246":{"position":[[875,6]]}},"keywords":{}}],["mother",{"_index":4689,"title":{},"content":{"812":{"position":[[183,7],[244,6]]}},"keywords":{}}],["mount",{"_index":4765,"title":{},"content":{"829":{"position":[[3749,6]]}},"keywords":{}}],["mous",{"_index":3044,"title":{},"content":{"464":{"position":[[232,5]]}},"keywords":{}}],["move",{"_index":1388,"title":{"561":{"position":[[8,6]]},"1093":{"position":[[0,6]]}},"content":{"212":{"position":[[414,4]]},"460":{"position":[[55,4],[389,4]]},"618":{"position":[[256,4]]},"642":{"position":[[35,4]]},"664":{"position":[[48,5]]},"800":{"position":[[625,4]]},"801":{"position":[[1,6],[935,4]]},"868":{"position":[[107,5]]},"987":{"position":[[294,4]]},"1007":{"position":[[876,5]]},"1093":{"position":[[129,4]]},"1094":{"position":[[156,6]]},"1124":{"position":[[257,4]]},"1213":{"position":[[459,4]]},"1246":{"position":[[229,4],[549,4]]}},"keywords":{}}],["movement",{"_index":2773,"title":{},"content":{"412":{"position":[[15100,8]]},"419":{"position":[[1386,9]]},"464":{"position":[[238,10]]}},"keywords":{}}],["mpnet",{"_index":2455,"title":{},"content":{"401":{"position":[[291,5]]}},"keywords":{}}],["mq1",{"_index":4183,"title":{},"content":{"749":{"position":[[3849,3]]}},"keywords":{}}],["mq2",{"_index":4184,"title":{},"content":{"749":{"position":[[3936,3]]}},"keywords":{}}],["mq3",{"_index":4186,"title":{},"content":{"749":{"position":[[4008,3]]}},"keywords":{}}],["mq4",{"_index":4187,"title":{},"content":{"749":{"position":[[4123,3]]}},"keywords":{}}],["mq5",{"_index":4190,"title":{},"content":{"749":{"position":[[4239,3]]}},"keywords":{}}],["mq6",{"_index":4191,"title":{},"content":{"749":{"position":[[4361,3]]}},"keywords":{}}],["mq7",{"_index":4193,"title":{},"content":{"749":{"position":[[4538,3]]}},"keywords":{}}],["mq8",{"_index":4194,"title":{},"content":{"749":{"position":[[4612,3]]}},"keywords":{}}],["mqueri",{"_index":4189,"title":{},"content":{"749":{"position":[[4165,6]]}},"keywords":{}}],["ms",{"_index":2445,"title":{},"content":{"401":{"position":[[163,4]]},"975":{"position":[[490,2]]},"1292":{"position":[[346,2],[353,2],[363,2],[370,2],[385,2],[392,2],[702,2],[709,2],[721,2],[728,2],[744,2],[750,2]]}},"keywords":{}}],["mt",{"_index":6320,"title":{},"content":{"1266":{"position":[[903,7]]}},"keywords":{}}],["much",{"_index":61,"title":{"1237":{"position":[[8,4]]}},"content":{"4":{"position":[[96,4]]},"8":{"position":[[50,4]]},"23":{"position":[[396,4]]},"31":{"position":[[223,4]]},"395":{"position":[[343,4]]},"398":{"position":[[78,4]]},"400":{"position":[[497,4]]},"410":{"position":[[548,4]]},"411":{"position":[[3104,4]]},"412":{"position":[[11935,4],[13737,4]]},"416":{"position":[[14,4]]},"432":{"position":[[1366,4]]},"450":{"position":[[439,4]]},"454":{"position":[[402,4]]},"521":{"position":[[633,4]]},"545":{"position":[[197,4]]},"605":{"position":[[197,4]]},"662":{"position":[[794,4]]},"696":{"position":[[976,4],[1067,4],[1569,4],[2029,4]]},"749":{"position":[[7984,4]]},"780":{"position":[[607,4]]},"784":{"position":[[854,4]]},"816":{"position":[[64,4],[102,4]]},"838":{"position":[[521,4]]},"944":{"position":[[74,4]]},"1162":{"position":[[426,4],[623,4]]},"1170":{"position":[[73,4],[210,4]]},"1171":{"position":[[351,4]]},"1181":{"position":[[513,4],[711,4]]},"1209":{"position":[[93,4]]},"1295":{"position":[[1318,4]]},"1297":{"position":[[609,5]]},"1321":{"position":[[101,4]]}},"keywords":{}}],["multi",{"_index":379,"title":{"80":{"position":[[9,5]]},"109":{"position":[[9,5]]},"125":{"position":[[0,5]]},"160":{"position":[[0,5]]},"237":{"position":[[9,5]]},"330":{"position":[[0,5]]},"384":{"position":[[0,5]]},"458":{"position":[[0,5]]},"475":{"position":[[3,5]]},"519":{"position":[[0,5]]},"589":{"position":[[0,5]]},"755":{"position":[[13,5]]},"779":{"position":[[0,5]]},"989":{"position":[[0,5]]},"1135":{"position":[[0,5]]},"1174":{"position":[[0,5]]},"1183":{"position":[[0,5]]},"1301":{"position":[[11,5]]}},"content":{"23":{"position":[[92,5]]},"33":{"position":[[258,5]]},"35":{"position":[[636,5]]},"42":{"position":[[133,5]]},"47":{"position":[[992,5]]},"80":{"position":[[28,5]]},"109":{"position":[[24,5]]},"120":{"position":[[308,5]]},"125":{"position":[[42,5]]},"160":{"position":[[13,5]]},"174":{"position":[[1781,5],[1823,5]]},"237":{"position":[[22,5]]},"314":{"position":[[594,5]]},"323":{"position":[[341,5],[357,5]]},"325":{"position":[[267,5]]},"334":{"position":[[487,5]]},"353":{"position":[[346,5]]},"354":{"position":[[1305,5]]},"411":{"position":[[3943,5],[3957,5],[4572,5]]},"412":{"position":[[14163,5]]},"427":{"position":[[1122,5]]},"475":{"position":[[260,5]]},"483":{"position":[[97,5]]},"502":{"position":[[1128,5],[1176,5]]},"519":{"position":[[122,5]]},"565":{"position":[[13,5],[29,5]]},"566":{"position":[[968,5]]},"579":{"position":[[496,5]]},"582":{"position":[[453,5]]},"590":{"position":[[835,5]]},"630":{"position":[[918,5]]},"644":{"position":[[251,5]]},"709":{"position":[[392,5]]},"723":{"position":[[233,5],[2157,5]]},"749":{"position":[[5769,5]]},"779":{"position":[[78,5]]},"801":{"position":[[826,5]]},"836":{"position":[[1924,5],[2417,5]]},"989":{"position":[[244,5]]},"1008":{"position":[[26,5]]},"1258":{"position":[[52,5]]}},"keywords":{}}],["multiinst",{"_index":1256,"title":{"964":{"position":[[0,14]]},"1230":{"position":[[4,14]]}},"content":{"188":{"position":[[1149,14]]},"209":{"position":[[315,14]]},"255":{"position":[[659,14]]},"314":{"position":[[550,14]]},"334":{"position":[[463,14]]},"522":{"position":[[574,14],[604,13]]},"562":{"position":[[239,14]]},"579":{"position":[[472,14]]},"653":{"position":[[1379,13]]},"739":{"position":[[383,14]]},"749":{"position":[[15013,13]]},"755":{"position":[[22,13]]},"759":{"position":[[431,14]]},"838":{"position":[[2335,14]]},"960":{"position":[[469,14],[499,13]]},"964":{"position":[[123,13]]},"988":{"position":[[1109,13]]},"989":{"position":[[297,14]]},"995":{"position":[[188,14],[823,14]]},"1088":{"position":[[187,13],[558,13]]},"1126":{"position":[[93,14],[451,14],[610,14],[772,14],[909,14]]},"1171":{"position":[[242,14]]},"1174":{"position":[[747,14]]},"1230":{"position":[[108,14]]},"1277":{"position":[[419,14],[454,13]]},"1278":{"position":[[496,14],[948,14]]}},"keywords":{}}],["multilingu",{"_index":2454,"title":{},"content":{"401":{"position":[[278,12]]}},"keywords":{}}],["multipl",{"_index":69,"title":{"682":{"position":[[8,9]]},"1007":{"position":[[22,8]]},"1088":{"position":[[4,8]]},"1092":{"position":[[22,8]]}},"content":{"4":{"position":[[171,8]]},"6":{"position":[[180,8]]},"7":{"position":[[154,8]]},"16":{"position":[[505,8]]},"19":{"position":[[360,8]]},"47":{"position":[[925,8]]},"51":{"position":[[15,8]]},"89":{"position":[[69,8]]},"110":{"position":[[69,8]]},"112":{"position":[[271,8]]},"123":{"position":[[125,8]]},"125":{"position":[[121,8]]},"131":{"position":[[15,8]]},"134":{"position":[[51,8]]},"158":{"position":[[228,8]]},"160":{"position":[[84,8]]},"173":{"position":[[569,8]]},"174":{"position":[[1851,8],[1996,8],[2063,8],[2130,8]]},"181":{"position":[[316,8]]},"189":{"position":[[13,8]]},"190":{"position":[[77,8]]},"203":{"position":[[261,8],[334,8]]},"237":{"position":[[99,8]]},"240":{"position":[[53,8]]},"250":{"position":[[95,8],[277,8]]},"267":{"position":[[391,8],[631,8]]},"289":{"position":[[1291,8]]},"303":{"position":[[1016,8]]},"323":{"position":[[576,8]]},"328":{"position":[[108,8],[135,8],[271,8]]},"330":{"position":[[28,8]]},"336":{"position":[[15,8]]},"339":{"position":[[8,8]]},"354":{"position":[[264,8]]},"358":{"position":[[235,8]]},"365":{"position":[[1213,8],[1386,8]]},"367":{"position":[[456,8]]},"368":{"position":[[74,8],[327,8]]},"375":{"position":[[683,8]]},"376":{"position":[[176,8]]},"384":{"position":[[418,8]]},"390":{"position":[[886,8]]},"392":{"position":[[2161,8]]},"393":{"position":[[1091,8]]},"396":{"position":[[665,8]]},"398":{"position":[[378,8]]},"402":{"position":[[11,8]]},"404":{"position":[[547,8]]},"407":{"position":[[1065,8]]},"408":{"position":[[912,8],[4719,8]]},"411":{"position":[[4061,8],[4083,8],[4693,8]]},"412":{"position":[[2997,8],[11627,8],[13627,8]]},"416":{"position":[[301,8]]},"440":{"position":[[180,8]]},"444":{"position":[[723,8]]},"446":{"position":[[644,8]]},"455":{"position":[[315,8]]},"458":{"position":[[128,8]]},"469":{"position":[[199,8],[561,8],[1164,8]]},"473":{"position":[[222,8]]},"475":{"position":[[37,8]]},"481":{"position":[[219,8]]},"489":{"position":[[163,8]]},"490":{"position":[[370,8]]},"491":{"position":[[442,8],[1335,8]]},"495":{"position":[[110,8]]},"517":{"position":[[95,8]]},"519":{"position":[[35,8]]},"524":{"position":[[13,8]]},"534":{"position":[[520,8]]},"551":{"position":[[23,8]]},"559":{"position":[[1330,8]]},"560":{"position":[[485,8]]},"566":{"position":[[853,8],[888,8]]},"575":{"position":[[486,8]]},"581":{"position":[[15,8]]},"589":{"position":[[20,8]]},"594":{"position":[[518,8]]},"610":{"position":[[1533,8]]},"613":{"position":[[234,8]]},"617":{"position":[[238,8],[1039,8],[1933,8]]},"622":{"position":[[729,8]]},"632":{"position":[[525,8],[575,8]]},"634":{"position":[[402,8]]},"635":{"position":[[44,8]]},"643":{"position":[[94,8]]},"647":{"position":[[62,8]]},"682":{"position":[[154,8]]},"683":{"position":[[382,8]]},"705":{"position":[[1048,8]]},"707":{"position":[[168,8]]},"709":{"position":[[329,8]]},"710":{"position":[[1162,8]]},"723":{"position":[[811,8]]},"724":{"position":[[939,8]]},"743":{"position":[[157,8],[194,8]]},"749":{"position":[[9115,8]]},"757":{"position":[[13,8]]},"761":{"position":[[227,8]]},"772":{"position":[[132,8]]},"779":{"position":[[121,8]]},"782":{"position":[[61,8]]},"795":{"position":[[34,8]]},"800":{"position":[[432,8]]},"820":{"position":[[355,8]]},"834":{"position":[[11,8]]},"836":{"position":[[1867,8]]},"838":{"position":[[1166,8]]},"849":{"position":[[527,8]]},"860":{"position":[[852,8]]},"863":{"position":[[622,8]]},"866":{"position":[[273,8]]},"908":{"position":[[89,8]]},"934":{"position":[[837,8]]},"944":{"position":[[109,8]]},"947":{"position":[[32,8]]},"951":{"position":[[97,8]]},"956":{"position":[[113,8]]},"964":{"position":[[245,8]]},"966":{"position":[[31,8],[422,8]]},"981":{"position":[[1547,8]]},"987":{"position":[[6,8]]},"988":{"position":[[1158,8],[3295,8],[4624,8]]},"989":{"position":[[88,8]]},"1022":{"position":[[183,8]]},"1033":{"position":[[268,8]]},"1072":{"position":[[234,8],[1352,8]]},"1078":{"position":[[65,8]]},"1088":{"position":[[115,8],[252,8],[355,8]]},"1089":{"position":[[219,8]]},"1092":{"position":[[28,8],[131,8]]},"1102":{"position":[[1251,8],[1309,8],[1358,8]]},"1114":{"position":[[342,8]]},"1117":{"position":[[521,8]]},"1120":{"position":[[299,8],[620,8]]},"1135":{"position":[[180,8]]},"1164":{"position":[[591,8]]},"1174":{"position":[[72,8],[217,8]]},"1175":{"position":[[659,8]]},"1183":{"position":[[93,8],[188,8],[231,8]]},"1188":{"position":[[1,8]]},"1222":{"position":[[1172,8],[1221,8]]},"1246":{"position":[[1096,8]]},"1252":{"position":[[352,8]]},"1295":{"position":[[337,8],[598,8]]},"1301":{"position":[[104,8],[231,8],[715,8]]},"1304":{"position":[[660,8],[1049,8]]},"1305":{"position":[[73,8]]},"1307":{"position":[[165,8],[294,8]]},"1308":{"position":[[37,8]]},"1313":{"position":[[139,8]]},"1315":{"position":[[74,8]]},"1316":{"position":[[2543,8]]},"1318":{"position":[[180,8]]},"1321":{"position":[[909,8]]}},"keywords":{}}],["multiplay",{"_index":3949,"title":{},"content":{"699":{"position":[[634,11]]}},"keywords":{}}],["multipleof",{"_index":4398,"title":{},"content":{"749":{"position":[[20359,10]]},"1080":{"position":[[555,10],[595,11]]}},"keywords":{}}],["multiplex",{"_index":3645,"title":{},"content":{"617":{"position":[[1281,12]]},"621":{"position":[[845,12]]}},"keywords":{}}],["multithread",{"_index":6286,"title":{},"content":{"1238":{"position":[[240,14]]}},"keywords":{}}],["muscl",{"_index":2986,"title":{},"content":{"458":{"position":[[367,6]]}},"keywords":{}}],["mutabl",{"_index":4174,"title":{},"content":{"749":{"position":[[3092,7]]},"1065":{"position":[[676,7]]},"1085":{"position":[[208,7]]}},"keywords":{}}],["mutat",{"_index":451,"title":{},"content":{"28":{"position":[[137,8]]},"38":{"position":[[265,8],[424,8]]},"326":{"position":[[75,9]]},"705":{"position":[[674,7]]},"754":{"position":[[150,8]]},"785":{"position":[[366,8]]},"846":{"position":[[763,6],[1189,6]]},"848":{"position":[[262,6]]},"885":{"position":[[1059,8]]},"886":{"position":[[2325,8]]},"889":{"position":[[53,9],[229,8]]},"1042":{"position":[[51,7]]},"1052":{"position":[[63,7],[275,7]]},"1065":{"position":[[740,7]]},"1115":{"position":[[782,8]]},"1304":{"position":[[176,6]]},"1307":{"position":[[867,8]]},"1316":{"position":[[779,7],[1428,9]]},"1317":{"position":[[636,8]]},"1323":{"position":[[90,6]]}},"keywords":{}}],["mutationpushhuman",{"_index":5077,"title":{},"content":{"885":{"position":[[292,17]]}},"keywords":{}}],["mutex",{"_index":2990,"title":{},"content":{"458":{"position":[[1394,7]]}},"keywords":{}}],["mychangevalid",{"_index":5964,"title":{},"content":{"1106":{"position":[[771,17]]},"1109":{"position":[[171,17]]}},"keywords":{}}],["mychangevalidator(authdata",{"_index":5962,"title":{},"content":{"1106":{"position":[[536,27]]}},"keywords":{}}],["mychildst",{"_index":5986,"title":{},"content":{"1114":{"position":[[918,12]]}},"keywords":{}}],["mycollect",{"_index":3174,"title":{},"content":{"493":{"position":[[83,12]]},"494":{"position":[[187,12]]},"798":{"position":[[542,12]]},"812":{"position":[[7,12]]},"813":{"position":[[7,12]]},"916":{"position":[[317,12]]},"934":{"position":[[209,13]]},"949":{"position":[[141,12]]},"1002":{"position":[[575,13],[1229,13]]},"1055":{"position":[[190,12]]},"1056":{"position":[[98,12],[194,12]]},"1066":{"position":[[348,12]]},"1309":{"position":[[1372,13]]}},"keywords":{}}],["mycollection.$.subscribe(changeev",{"_index":5324,"title":{},"content":{"941":{"position":[[101,36]]}},"keywords":{}}],["mycollection.bulkinsert",{"_index":5331,"title":{},"content":{"944":{"position":[[198,26]]}},"keywords":{}}],["mycollection.bulkinsert(dataar",{"_index":4635,"title":{},"content":{"795":{"position":[[225,32]]}},"keywords":{}}],["mycollection.bulkremov",{"_index":5337,"title":{},"content":{"945":{"position":[[139,25],[460,25]]}},"keywords":{}}],["mycollection.bulkupsert",{"_index":5345,"title":{},"content":{"947":{"position":[[172,25]]}},"keywords":{}}],["mycollection.checkpoint$.subscribe(checkpoint",{"_index":5538,"title":{},"content":{"1002":{"position":[[334,45]]}},"keywords":{}}],["mycollection.clos",{"_index":5378,"title":{},"content":{"955":{"position":[[300,21]]}},"keywords":{}}],["mycollection.count",{"_index":5772,"title":{},"content":{"1067":{"position":[[290,20],[1284,20],[1551,20]]}},"keywords":{}}],["mycollection.customcleanupfunct",{"_index":5415,"title":{},"content":{"975":{"position":[[386,37],[609,37]]}},"keywords":{}}],["mycollection.exportjson",{"_index":5371,"title":{},"content":{"952":{"position":[[303,25]]}},"keywords":{}}],["mycollection.find",{"_index":974,"title":{},"content":{"77":{"position":[[212,19]]},"103":{"position":[[252,19]]},"234":{"position":[[312,19]]},"493":{"position":[[339,22]]},"494":{"position":[[291,23]]},"797":{"position":[[251,19]]},"799":{"position":[[577,21],[680,21]]},"1057":{"position":[[82,20]]},"1058":{"position":[[216,20]]},"1059":{"position":[[226,19]]},"1060":{"position":[[94,19]]},"1061":{"position":[[95,19]]},"1062":{"position":[[151,19]]},"1063":{"position":[[109,19],[213,19]]},"1065":{"position":[[209,19],[781,19],[1035,19],[1279,19]]},"1067":{"position":[[1964,19],[2108,19]]},"1072":{"position":[[2464,19],[2642,19]]}},"keywords":{}}],["mycollection.find().exec",{"_index":5669,"title":{},"content":{"1036":{"position":[[121,27]]}},"keywords":{}}],["mycollection.find().where('age').gt(18",{"_index":5762,"title":{},"content":{"1064":{"position":[[304,40]]},"1069":{"position":[[468,40]]}},"keywords":{}}],["mycollection.find().where('name').eq('foo",{"_index":5771,"title":{},"content":{"1065":{"position":[[1430,43]]}},"keywords":{}}],["mycollection.findbyids(id",{"_index":5362,"title":{},"content":{"951":{"position":[[383,28]]}},"keywords":{}}],["mycollection.findon",{"_index":5357,"title":{},"content":{"950":{"position":[[256,22]]}},"keywords":{}}],["mycollection.findone('foo",{"_index":5360,"title":{},"content":{"950":{"position":[[415,27]]}},"keywords":{}}],["mycollection.findone('foobar",{"_index":5736,"title":{},"content":{"1056":{"position":[[314,31]]}},"keywords":{}}],["mycollection.findone('foobar').exec",{"_index":5702,"title":{},"content":{"1045":{"position":[[77,38]]}},"keywords":{}}],["mycollection.findone().exec",{"_index":4561,"title":{},"content":{"770":{"position":[[463,30]]},"1057":{"position":[[454,30]]}},"keywords":{}}],["mycollection.findone().exec(tru",{"_index":5741,"title":{},"content":{"1057":{"position":[[606,34]]}},"keywords":{}}],["mycollection.getlocal$('foobar').subscribe(documentornul",{"_index":5606,"title":{},"content":{"1017":{"position":[[112,57]]}},"keywords":{}}],["mycollection.getlocal$('last",{"_index":5517,"title":{},"content":{"995":{"position":[[1900,28]]}},"keywords":{}}],["mycollection.getlocal('foobar",{"_index":5605,"title":{},"content":{"1016":{"position":[[135,32]]},"1018":{"position":[[77,32]]}},"keywords":{}}],["mycollection.importjson(json",{"_index":5374,"title":{},"content":{"953":{"position":[[102,29]]}},"keywords":{}}],["mycollection.incrementalupsert(docdata",{"_index":5351,"title":{},"content":{"948":{"position":[[561,40],[602,40],[643,40],[725,40]]}},"keywords":{}}],["mycollection.insert",{"_index":4663,"title":{},"content":{"800":{"position":[[814,23]]},"813":{"position":[[256,21]]},"942":{"position":[[188,21]]},"1035":{"position":[[102,21]]},"1058":{"position":[[411,23]]}},"keywords":{}}],["mycollection.insert$.subscribe(changeev",{"_index":5326,"title":{},"content":{"941":{"position":[[243,42]]}},"keywords":{}}],["mycollection.insert(docdata",{"_index":4634,"title":{},"content":{"795":{"position":[[175,29]]}},"keywords":{}}],["mycollection.insert(docu",{"_index":5802,"title":{},"content":{"1072":{"position":[[2419,30]]}},"keywords":{}}],["mycollection.insertifnotexist",{"_index":5330,"title":{},"content":{"943":{"position":[[385,32]]}},"keywords":{}}],["mycollection.insertloc",{"_index":5600,"title":{},"content":{"1014":{"position":[[200,25]]}},"keywords":{}}],["mycollection.insertlocal('last",{"_index":5507,"title":{},"content":{"995":{"position":[[1509,30]]}},"keywords":{}}],["mycollection.onclos",{"_index":5381,"title":{},"content":{"956":{"position":[[244,23]]}},"keywords":{}}],["mycollection.onremov",{"_index":5383,"title":{},"content":{"956":{"position":[[309,24]]}},"keywords":{}}],["mycollection.postcreate(function(plaindata",{"_index":4558,"title":{},"content":{"770":{"position":[[309,43]]}},"keywords":{}}],["mycollection.postinsert(function(plaindata",{"_index":4535,"title":{},"content":{"767":{"position":[[747,43],[827,43],[903,43]]}},"keywords":{}}],["mycollection.postremove(function(plaindata",{"_index":4556,"title":{},"content":{"769":{"position":[[718,43],[798,43],[874,43]]}},"keywords":{}}],["mycollection.postsave(function(plaindata",{"_index":4547,"title":{},"content":{"768":{"position":[[755,41],[833,41],[907,41]]}},"keywords":{}}],["mycollection.preinsert(function(plaindata",{"_index":4530,"title":{},"content":{"767":{"position":[[326,43],[444,43],[507,43],[643,43]]}},"keywords":{}}],["mycollection.preremove(function(plaindata",{"_index":4554,"title":{},"content":{"769":{"position":[[300,42],[379,42],[454,42],[602,42]]}},"keywords":{}}],["mycollection.presave(function(plaindata",{"_index":4542,"title":{},"content":{"768":{"position":[[283,40],[426,40],[499,40],[643,40]]}},"keywords":{}}],["mycollection.remov",{"_index":5376,"title":{},"content":{"954":{"position":[[143,22]]}},"keywords":{}}],["mycollection.remove$.subscribe(changeev",{"_index":5328,"title":{},"content":{"941":{"position":[[395,42]]}},"keywords":{}}],["mycollection.syncgraphql",{"_index":5171,"title":{},"content":{"890":{"position":[[15,26]]}},"keywords":{}}],["mycollection.update$.subscribe(changeev",{"_index":5327,"title":{},"content":{"941":{"position":[[319,42]]}},"keywords":{}}],["mycollection.upsert",{"_index":5344,"title":{},"content":{"946":{"position":[[160,21]]}},"keywords":{}}],["mycollection.upsert(docdata",{"_index":5350,"title":{},"content":{"948":{"position":[[437,29],[467,29]]}},"keywords":{}}],["mycollection.upsertloc",{"_index":5603,"title":{},"content":{"1015":{"position":[[176,25]]}},"keywords":{}}],["mycollection.upsertlocal<mylocaldocumenttype>",{"_index":5616,"title":{},"content":{"1018":{"position":[[797,52]]}},"keywords":{}}],["mycollection.upsertlocal('last",{"_index":5511,"title":{},"content":{"995":{"position":[[1698,30]]}},"keywords":{}}],["mycompon",{"_index":3180,"title":{},"content":{"494":{"position":[[173,13],[440,12]]}},"keywords":{}}],["myconflicthandl",{"_index":2689,"title":{},"content":{"412":{"position":[[4494,17]]}},"keywords":{}}],["mycrdtoper",{"_index":3866,"title":{},"content":{"678":{"position":[[234,15]]}},"keywords":{}}],["mycustomconflicthandl",{"_index":6497,"title":{},"content":{"1309":{"position":[[1491,23]]}},"keywords":{}}],["mycustomfetch",{"_index":4834,"title":{},"content":{"848":{"position":[[184,13],[845,14]]}},"keywords":{}}],["mycustomfetchmethod",{"_index":4826,"title":{},"content":{"846":{"position":[[618,20]]}},"keywords":{}}],["mydata",{"_index":6118,"title":{},"content":{"1165":{"position":[[465,9]]}},"keywords":{}}],["mydatabas",{"_index":36,"title":{},"content":{"1":{"position":[[561,13]]},"2":{"position":[[364,13]]},"3":{"position":[[244,13]]},"4":{"position":[[422,13]]},"5":{"position":[[332,13]]},"6":{"position":[[527,13]]},"7":{"position":[[364,13]]},"8":{"position":[[1133,13]]},"9":{"position":[[278,13]]},"10":{"position":[[316,13]]},"11":{"position":[[842,13]]},"392":{"position":[[368,13]]},"680":{"position":[[655,10]]},"717":{"position":[[1180,13]]},"718":{"position":[[683,13]]},"734":{"position":[[505,13]]},"745":{"position":[[554,13]]},"892":{"position":[[158,10],[295,11]]},"932":{"position":[[1068,13]]},"962":{"position":[[778,13],[994,13]]},"1013":{"position":[[279,10],[323,13]]},"1067":{"position":[[2402,13]]},"1154":{"position":[[770,13]]},"1163":{"position":[[564,12]]},"1182":{"position":[[568,12]]},"1184":{"position":[[807,12]]},"1210":{"position":[[446,13]]},"1211":{"position":[[701,13]]},"1222":{"position":[[1417,13]]},"1226":{"position":[[242,13]]},"1227":{"position":[[720,13]]},"1231":{"position":[[1051,13]]},"1237":{"position":[[820,10]]},"1238":{"position":[[795,10]]},"1239":{"position":[[765,10]]},"1264":{"position":[[164,13]]},"1265":{"position":[[708,13]]},"1311":{"position":[[107,11],[119,10]]}},"keywords":{}}],["mydatabase.addcollect",{"_index":2495,"title":{},"content":{"403":{"position":[[725,27]]},"751":{"position":[[465,27],[769,27],[1567,27]]},"752":{"position":[[370,27]]},"789":{"position":[[166,27],[413,27]]},"791":{"position":[[22,27],[281,27]]},"792":{"position":[[149,27]]},"806":{"position":[[577,27]]},"812":{"position":[[28,27]]},"813":{"position":[[28,27]]},"818":{"position":[[493,27]]},"916":{"position":[[338,27]]},"934":{"position":[[231,27]]},"979":{"position":[[308,27]]},"1013":{"position":[[463,27]]},"1075":{"position":[[7,27]]},"1090":{"position":[[958,29]]},"1309":{"position":[[1394,27]]},"1311":{"position":[[968,27]]}},"keywords":{}}],["mydatabase.backup(backupopt",{"_index":3732,"title":{},"content":{"647":{"position":[[397,33],[538,33]]},"648":{"position":[[246,33]]},"649":{"position":[[202,33]]}},"keywords":{}}],["mydatabase.clos",{"_index":5417,"title":{},"content":{"976":{"position":[[319,19]]},"1311":{"position":[[1829,19]]}},"keywords":{}}],["mydatabase.collections$.subscribe(ev",{"_index":5425,"title":{},"content":{"979":{"position":[[230,39]]}},"keywords":{}}],["mydatabase.exportjson",{"_index":5410,"title":{},"content":{"971":{"position":[[415,23]]}},"keywords":{}}],["mydatabase.heroes.countalldocu",{"_index":6521,"title":{},"content":{"1311":{"position":[[1751,38]]}},"keywords":{}}],["mydatabase.heroes.insert",{"_index":6515,"title":{},"content":{"1311":{"position":[[1486,26]]}},"keywords":{}}],["mydatabase.heroes.postinsert",{"_index":6511,"title":{},"content":{"1311":{"position":[[1113,29]]}},"keywords":{}}],["mydatabase.insertloc",{"_index":5601,"title":{},"content":{"1014":{"position":[[341,23]]}},"keywords":{}}],["mydatabase.migrationst",{"_index":4475,"title":{},"content":{"753":{"position":[[258,29]]}},"keywords":{}}],["mydatabase.remov",{"_index":5418,"title":{},"content":{"977":{"position":[[78,20]]}},"keywords":{}}],["mydatabase.requestidlepromise().then",{"_index":5414,"title":{},"content":{"975":{"position":[[271,39]]}},"keywords":{}}],["mydatabase.requestidlepromise(1000",{"_index":5416,"title":{},"content":{"975":{"position":[[444,34]]}},"keywords":{}}],["mydatabase.todos.find",{"_index":1640,"title":{},"content":{"276":{"position":[[405,23]]}},"keywords":{}}],["mydatabase[collectionnam",{"_index":4201,"title":{},"content":{"749":{"position":[[5050,26]]}},"keywords":{}}],["mydb",{"_index":845,"title":{},"content":{"55":{"position":[[898,7]]},"255":{"position":[[614,7]]},"258":{"position":[[175,7]]},"542":{"position":[[559,7]]},"825":{"position":[[366,7]]},"862":{"position":[[564,7]]},"872":{"position":[[3996,5]]},"898":{"position":[[2346,7]]},"1090":{"position":[[807,7]]},"1118":{"position":[[670,7]]},"1148":{"position":[[1149,7]]},"1149":{"position":[[942,7]]},"1218":{"position":[[555,4]]},"1219":{"position":[[868,4]]},"1311":{"position":[[192,7]]}},"keywords":{}}],["mydb.$.subscribe(changeev",{"_index":5409,"title":{},"content":{"970":{"position":[[96,28]]}},"keywords":{}}],["mydestinationcollect",{"_index":5619,"title":{},"content":{"1020":{"position":[[429,24]]}},"keywords":{}}],["mydestinationcollection.insert",{"_index":5620,"title":{},"content":{"1020":{"position":[[603,32]]}},"keywords":{}}],["mydocu",{"_index":3876,"title":{},"content":{"680":{"position":[[1218,10]]},"717":{"position":[[1619,12]]},"800":{"position":[[795,10]]},"1045":{"position":[[58,10]]},"1046":{"position":[[120,12]]}},"keywords":{}}],["mydocument.allattach",{"_index":5300,"title":{},"content":{"920":{"position":[[77,28]]}},"keywords":{}}],["mydocument.allattachments$.subscrib",{"_index":5301,"title":{},"content":{"921":{"position":[[172,37]]}},"keywords":{}}],["mydocument.deleted$.subscribe(st",{"_index":5716,"title":{},"content":{"1049":{"position":[[102,35]]}},"keywords":{}}],["mydocument.family.mother_",{"_index":4690,"title":{},"content":{"812":{"position":[[259,26]]}},"keywords":{}}],["mydocument.firstname$.subscribe(newnam",{"_index":1423,"title":{},"content":{"235":{"position":[[274,39]]},"571":{"position":[[1309,39]]},"1040":{"position":[[317,39]]}},"keywords":{}}],["mydocument.friends_",{"_index":4694,"title":{},"content":{"813":{"position":[[415,20]]}},"keywords":{}}],["mydocument.get$('nam",{"_index":5673,"title":{},"content":{"1039":{"position":[[196,23]]}},"keywords":{}}],["mydocument.get('nam",{"_index":5670,"title":{},"content":{"1038":{"position":[[141,23]]},"1040":{"position":[[150,23]]}},"keywords":{}}],["mydocument.getattachment('cat.jpg",{"_index":5298,"title":{},"content":{"919":{"position":[[105,36]]},"929":{"position":[[88,36]]},"930":{"position":[[93,36]]},"931":{"position":[[93,36]]},"932":{"position":[[93,36]]}},"keywords":{}}],["mydocument.getlatest",{"_index":5705,"title":{},"content":{"1045":{"position":[[203,23]]}},"keywords":{}}],["mydocument.incrementalmodify(docdata",{"_index":5697,"title":{},"content":{"1044":{"position":[[373,36]]}},"keywords":{}}],["mydocument.incrementalpatch",{"_index":5699,"title":{},"content":{"1044":{"position":[[484,29]]},"1045":{"position":[[143,29]]}},"keywords":{}}],["mydocument.incrementalpatch({firstnam",{"_index":5681,"title":{},"content":{"1040":{"position":[[431,39]]}},"keywords":{}}],["mydocument.incrementalpatch({nam",{"_index":5675,"title":{},"content":{"1039":{"position":[[275,34]]}},"keywords":{}}],["mydocument.incrementalremov",{"_index":5700,"title":{},"content":{"1044":{"position":[[543,30]]}},"keywords":{}}],["mydocument.incrementalupd",{"_index":5696,"title":{},"content":{"1044":{"position":[[283,30]]}},"keywords":{}}],["mydocument.modify(changefunct",{"_index":5693,"title":{},"content":{"1042":{"position":[[231,34]]}},"keywords":{}}],["mydocument.nam",{"_index":5671,"title":{},"content":{"1038":{"position":[[204,16]]},"1039":{"position":[[377,16]]},"1040":{"position":[[185,16]]}},"keywords":{}}],["mydocument.patch",{"_index":5695,"title":{},"content":{"1043":{"position":[[65,18]]}},"keywords":{}}],["mydocument.putattach",{"_index":4664,"title":{},"content":{"800":{"position":[[873,25]]},"917":{"position":[[141,25]]}},"keywords":{}}],["mydocument.remov",{"_index":5711,"title":{},"content":{"1047":{"position":[[232,20]]},"1049":{"position":[[203,20]]},"1050":{"position":[[97,20]]}},"keywords":{}}],["mydocument.tojosn",{"_index":5899,"title":{},"content":{"1085":{"position":[[2514,19]]}},"keywords":{}}],["mydocument.tojson",{"_index":5721,"title":{},"content":{"1051":{"position":[[171,20]]}},"keywords":{}}],["mydocument.tojson(tru",{"_index":5727,"title":{},"content":{"1051":{"position":[[437,24]]}},"keywords":{}}],["mydocument.tomutablejson",{"_index":5729,"title":{},"content":{"1052":{"position":[[189,27]]}},"keywords":{}}],["mydocument.upd",{"_index":5687,"title":{},"content":{"1041":{"position":[[279,19]]}},"keywords":{}}],["mydocument.updatecrdt",{"_index":3878,"title":{},"content":{"680":{"position":[[1346,23]]},"681":{"position":[[620,23]]},"682":{"position":[[322,23]]}},"keywords":{}}],["mydocument.whatever.nestedfield",{"_index":5679,"title":{},"content":{"1040":{"position":[[251,32]]}},"keywords":{}}],["myencrypteddatabas",{"_index":3347,"title":{},"content":{"554":{"position":[[1077,22]]}},"keywords":{}}],["myencryptionpassword",{"_index":3714,"title":{},"content":{"638":{"position":[[504,22]]}},"keywords":{}}],["myendpoint",{"_index":5930,"title":{},"content":{"1100":{"position":[[637,10]]}},"keywords":{}}],["myeventsourceconstructor",{"_index":5075,"title":{},"content":{"882":{"position":[[443,24]]}},"keywords":{}}],["myfield",{"_index":4560,"title":{},"content":{"770":{"position":[[400,10]]},"1115":{"position":[[206,7]]}},"keywords":{}}],["myfirstqueri",{"_index":4711,"title":{},"content":{"820":{"position":[[516,12],[545,13]]}},"keywords":{}}],["myheroschema",{"_index":5831,"title":{},"content":{"1075":{"position":[[53,12]]}},"keywords":{}}],["myid",{"_index":6516,"title":{},"content":{"1311":{"position":[[1525,7]]}},"keywords":{}}],["myindexeddbobjectstore.createindex",{"_index":6425,"title":{},"content":{"1294":{"position":[[525,35]]},"1296":{"position":[[985,35],[1069,35]]}},"keywords":{}}],["myionicdb",{"_index":1888,"title":{},"content":{"314":{"position":[[500,12]]}},"keywords":{}}],["mylocaldb",{"_index":1379,"title":{},"content":{"211":{"position":[[237,12]]}},"keywords":{}}],["mylocaldocumenttyp",{"_index":5615,"title":{},"content":{"1018":{"position":[[736,19]]}},"keywords":{}}],["mymethod.bind(mydocu",{"_index":5731,"title":{},"content":{"1052":{"position":[[484,25]]}},"keywords":{}}],["myofflinedb",{"_index":3124,"title":{},"content":{"480":{"position":[[393,14]]}},"keywords":{}}],["myolddatabasenam",{"_index":4491,"title":{},"content":{"759":{"position":[[637,20]]},"760":{"position":[[633,20]]}},"keywords":{}}],["myownhashfunct",{"_index":5407,"title":{},"content":{"968":{"position":[[540,17]]}},"keywords":{}}],["myownhashfunction(input",{"_index":5405,"title":{},"content":{"968":{"position":[[414,24]]}},"keywords":{}}],["mypassword",{"_index":1942,"title":{},"content":{"334":{"position":[[417,13]]},"522":{"position":[[531,13]]},"579":{"position":[[426,13]]},"739":{"position":[[369,13]]},"848":{"position":[[1527,14]]},"960":{"position":[[426,13]]}},"keywords":{}}],["mypasswordobject",{"_index":4031,"title":{},"content":{"718":{"position":[[459,16],[743,16]]}},"keywords":{}}],["mypostinserthook",{"_index":6512,"title":{},"content":{"1311":{"position":[[1152,17]]}},"keywords":{}}],["mypullstream",{"_index":5048,"title":{},"content":{"875":{"position":[[8077,13],[9496,13]]}},"keywords":{}}],["mypullstream$.asobserv",{"_index":5057,"title":{},"content":{"875":{"position":[[8470,28],[9759,28]]}},"keywords":{}}],["mypullstream$.next",{"_index":5054,"title":{},"content":{"875":{"position":[[8285,20]]}},"keywords":{}}],["mypullstream$.next('resync",{"_index":5059,"title":{},"content":{"875":{"position":[[8990,29],[9657,29]]}},"keywords":{}}],["mypullstream$.next(ev",{"_index":5034,"title":{},"content":{"875":{"position":[[5498,26]]}},"keywords":{}}],["myqueri",{"_index":4647,"title":{},"content":{"797":{"position":[[241,7]]}},"keywords":{}}],["myquerymodifi",{"_index":5957,"title":{},"content":{"1105":{"position":[[831,15]]}},"keywords":{}}],["myquerymodifier(authdata",{"_index":5954,"title":{},"content":{"1105":{"position":[[602,25]]}},"keywords":{}}],["myrandompasswordwithmin8length",{"_index":4036,"title":{},"content":{"718":{"position":[[573,32]]}},"keywords":{}}],["myreplicationstate.active$.pip",{"_index":5508,"title":{},"content":{"995":{"position":[[1594,32]]}},"keywords":{}}],["myreplicationstate.awaitinsync",{"_index":5510,"title":{},"content":{"995":{"position":[[1658,33]]}},"keywords":{}}],["myrxcollect",{"_index":4051,"title":{},"content":{"724":{"position":[[741,15]]},"846":{"position":[[223,15]]},"848":{"position":[[740,15],[1375,15]]},"852":{"position":[[258,15]]},"854":{"position":[[705,15]]},"858":{"position":[[216,15]]},"866":{"position":[[460,15]]},"875":{"position":[[460,15]]},"886":{"position":[[1042,15],[2674,15],[3861,15]]},"887":{"position":[[327,15]]},"888":{"position":[[468,15]]},"889":{"position":[[517,15]]},"890":{"position":[[817,15]]},"893":{"position":[[386,15]]},"988":{"position":[[284,15]]}},"keywords":{}}],["myrxcollection.cleanup",{"_index":3761,"title":{},"content":{"654":{"position":[[178,25]]}},"keywords":{}}],["myrxcollection.cleanup(0",{"_index":3763,"title":{},"content":{"654":{"position":[[452,26]]},"655":{"position":[[490,26]]}},"keywords":{}}],["myrxcollection.cleanup(1000",{"_index":3762,"title":{},"content":{"654":{"position":[[302,29]]}},"keywords":{}}],["myrxcollection.find().remov",{"_index":3768,"title":{},"content":{"655":{"position":[[421,31]]}},"keywords":{}}],["myrxcollection.findone(id).exec",{"_index":5835,"title":{},"content":{"1078":{"position":[[1129,34]]}},"keywords":{}}],["myrxcollection.insert",{"_index":3884,"title":{},"content":{"683":{"position":[[170,23]]},"1078":{"position":[[861,23]]}},"keywords":{}}],["myrxcollection.insertcrdt",{"_index":3886,"title":{},"content":{"683":{"position":[[268,27],[730,27]]}},"keywords":{}}],["myrxcollection.remov",{"_index":3765,"title":{},"content":{"655":{"position":[[125,24]]}},"keywords":{}}],["myrxcollection.schema.getprimaryofdocumentdata",{"_index":5834,"title":{},"content":{"1078":{"position":[[1021,48]]}},"keywords":{}}],["myrxcollection.storageinst",{"_index":6145,"title":{},"content":{"1177":{"position":[[252,31]]}},"keywords":{}}],["myrxdatabas",{"_index":3813,"title":{},"content":{"662":{"position":[[2105,12]]},"772":{"position":[[1594,12],[2356,12]]},"838":{"position":[[2183,12]]},"1090":{"position":[[761,12],[1047,13]]},"1097":{"position":[[732,13]]},"1098":{"position":[[368,13]]},"1099":{"position":[[342,13]]},"1103":{"position":[[227,13]]},"1125":{"position":[[266,12]]},"1130":{"position":[[139,12]]},"1189":{"position":[[383,12]]},"1219":{"position":[[576,12]]},"1220":{"position":[[255,13]]},"1271":{"position":[[1549,12]]},"1274":{"position":[[300,12]]},"1275":{"position":[[311,12]]},"1276":{"position":[[913,12]]},"1277":{"position":[[360,12]]},"1278":{"position":[[437,12],[889,12]]},"1279":{"position":[[687,12]]},"1280":{"position":[[422,12]]}},"keywords":{}}],["myrxdatabase.addcollect",{"_index":3816,"title":{},"content":{"662":{"position":[[2332,29]]},"710":{"position":[[1821,29]]},"838":{"position":[[2546,29]]}},"keywords":{}}],["myrxdocu",{"_index":4738,"title":{},"content":{"826":{"position":[[601,16]]},"1078":{"position":[[1114,12]]}},"keywords":{}}],["myrxdocument.delet",{"_index":4739,"title":{},"content":{"826":{"position":[[697,23]]}},"keywords":{}}],["myrxdocument.foobar",{"_index":4737,"title":{},"content":{"826":{"position":[[508,22]]}},"keywords":{}}],["myrxdocument.get$$('foobar",{"_index":4736,"title":{},"content":{"826":{"position":[[446,29]]}},"keywords":{}}],["myrxdocument1",{"_index":5340,"title":{},"content":{"945":{"position":[[486,14]]}},"keywords":{}}],["myrxdocument2",{"_index":5341,"title":{},"content":{"945":{"position":[[501,14]]}},"keywords":{}}],["myrxjsonschema",{"_index":4710,"title":{},"content":{"820":{"position":[[193,15]]}},"keywords":{}}],["myrxlocaldocu",{"_index":4742,"title":{},"content":{"826":{"position":[[1028,21]]}},"keywords":{}}],["myrxlocaldocument.get$$('foobar",{"_index":4743,"title":{},"content":{"826":{"position":[[1112,34]]}},"keywords":{}}],["myrxpipeline.awaitidl",{"_index":5650,"title":{},"content":{"1026":{"position":[[53,25]]}},"keywords":{}}],["myrxpipeline.clos",{"_index":5651,"title":{},"content":{"1027":{"position":[[7,20]]}},"keywords":{}}],["myrxpipeline.remov",{"_index":5652,"title":{},"content":{"1028":{"position":[[7,21]]}},"keywords":{}}],["myrxreplicationstate.active$.subscribe(bool",{"_index":5500,"title":{},"content":{"993":{"position":[[680,43]]}},"keywords":{}}],["myrxreplicationstate.awaitinitialrepl",{"_index":5501,"title":{},"content":{"994":{"position":[[278,47]]}},"keywords":{}}],["myrxreplicationstate.awaitinsync",{"_index":5505,"title":{},"content":{"995":{"position":[[395,35]]}},"keywords":{}}],["myrxreplicationstate.cancel",{"_index":5523,"title":{},"content":{"997":{"position":[[102,30]]}},"keywords":{}}],["myrxreplicationstate.canceled$.subscribe(bool",{"_index":5498,"title":{},"content":{"993":{"position":[[541,45]]}},"keywords":{}}],["myrxreplicationstate.error$.subscribe(err",{"_index":5592,"title":{},"content":{"1010":{"position":[[275,41]]}},"keywords":{}}],["myrxreplicationstate.error$.subscribe(error",{"_index":5496,"title":{},"content":{"993":{"position":[[405,43]]}},"keywords":{}}],["myrxreplicationstate.paus",{"_index":5525,"title":{},"content":{"998":{"position":[[108,29]]}},"keywords":{}}],["myrxreplicationstate.received$.subscribe(doc",{"_index":5494,"title":{},"content":{"993":{"position":[[142,44]]}},"keywords":{}}],["myrxreplicationstate.remov",{"_index":5529,"title":{},"content":{"999":{"position":[[287,30]]}},"keywords":{}}],["myrxreplicationstate.resync",{"_index":5522,"title":{},"content":{"996":{"position":[[270,30],[553,30]]}},"keywords":{}}],["myrxreplicationstate.sent$.subscribe(doc",{"_index":5495,"title":{},"content":{"993":{"position":[[263,40]]}},"keywords":{}}],["myrxreplicationstate.start",{"_index":5526,"title":{},"content":{"998":{"position":[[144,29]]}},"keywords":{}}],["myrxschema",{"_index":4746,"title":{},"content":{"829":{"position":[[765,10]]}},"keywords":{}}],["myrxserver.addreplicationendpoint",{"_index":5928,"title":{},"content":{"1100":{"position":[[390,36]]}},"keywords":{}}],["myrxstate.myfield",{"_index":5990,"title":{},"content":{"1116":{"position":[[290,18]]}},"keywords":{}}],["mys3cretp4ssw0rd",{"_index":1899,"title":{},"content":{"315":{"position":[[617,18]]}},"keywords":{}}],["myschema",{"_index":2121,"title":{},"content":{"367":{"position":[[700,8]]},"680":{"position":[[798,8],[1176,8]]},"720":{"position":[[124,8]]},"734":{"position":[[600,8],[890,8]]},"739":{"position":[[456,8]]},"772":{"position":[[967,8]]},"789":{"position":[[212,9],[459,9]]},"791":{"position":[[68,9],[327,9]]},"792":{"position":[[195,9]]},"806":{"position":[[620,9]]},"818":{"position":[[539,9]]},"862":{"position":[[618,8],[851,8]]},"916":{"position":[[131,8],[384,8]]},"932":{"position":[[1183,8]]},"934":{"position":[[301,9]]},"939":{"position":[[194,8]]},"979":{"position":[[354,8]]},"1078":{"position":[[114,8]]},"1222":{"position":[[536,8]]},"1309":{"position":[[1464,9]]}},"keywords":{}}],["mysecondqueri",{"_index":4712,"title":{},"content":{"820":{"position":[[596,14]]}},"keywords":{}}],["mysecretid",{"_index":3354,"title":{},"content":{"555":{"position":[[302,13]]}},"keywords":{}}],["myserv",{"_index":5911,"title":{},"content":{"1090":{"position":[[1004,8]]},"1097":{"position":[[688,8]]},"1098":{"position":[[324,8]]},"1099":{"position":[[298,8]]},"1103":{"position":[[184,8]]}},"keywords":{}}],["myserver.start",{"_index":5920,"title":{},"content":{"1097":{"position":[[278,16],[881,17]]},"1098":{"position":[[435,17]]},"1099":{"position":[[405,17]]}},"keywords":{}}],["myservercollect",{"_index":5931,"title":{},"content":{"1100":{"position":[[715,18]]},"1101":{"position":[[527,18]]},"1102":{"position":[[400,18]]},"1103":{"position":[[370,19]]},"1105":{"position":[[796,19]]},"1106":{"position":[[734,19]]}},"keywords":{}}],["mysign",{"_index":6005,"title":{},"content":{"1118":{"position":[[798,8],[841,8]]}},"keywords":{}}],["mysourcecollection.addpipelin",{"_index":5618,"title":{},"content":{"1020":{"position":[[356,32]]}},"keywords":{}}],["mysql",{"_index":2033,"title":{"356":{"position":[[30,6]]}},"content":{"356":{"position":[[90,6]]},"571":{"position":[[554,5]]},"708":{"position":[[138,6]]},"1124":{"position":[[2072,5]]}},"keywords":{}}],["mysql’",{"_index":2092,"title":{},"content":{"362":{"position":[[372,7]]}},"keywords":{}}],["mystat",{"_index":5983,"title":{},"content":{"1114":{"position":[[822,7]]},"1118":{"position":[[755,7]]},"1121":{"position":[[535,7]]}},"keywords":{}}],["mystate.collect",{"_index":6009,"title":{},"content":{"1121":{"position":[[633,19]]}},"keywords":{}}],["mystate.get",{"_index":5992,"title":{},"content":{"1116":{"position":[[345,14]]}},"keywords":{}}],["mystate.get$$('myfield",{"_index":6006,"title":{},"content":{"1118":{"position":[[809,25]]}},"keywords":{}}],["mystate.get$('myfield",{"_index":5999,"title":{},"content":{"1117":{"position":[[328,24]]}},"keywords":{}}],["mystate.get('myarrayfield[0].foobar",{"_index":5997,"title":{},"content":{"1116":{"position":[[599,38]]}},"keywords":{}}],["mystate.get('myfield",{"_index":5993,"title":{},"content":{"1116":{"position":[[395,23]]}},"keywords":{}}],["mystate.get('myfield.childfield",{"_index":5995,"title":{},"content":{"1116":{"position":[[483,34]]}},"keywords":{}}],["mystate.myarrayfield[0].foobar",{"_index":5998,"title":{},"content":{"1116":{"position":[[650,31]]}},"keywords":{}}],["mystate.myfield",{"_index":5994,"title":{},"content":{"1116":{"position":[[431,16]]},"1117":{"position":[[290,17],[372,17]]},"1118":{"position":[[852,18]]}},"keywords":{}}],["mystate.myfield.childfield",{"_index":5996,"title":{},"content":{"1116":{"position":[[530,27]]}},"keywords":{}}],["mystate.set('myfield",{"_index":5988,"title":{},"content":{"1115":{"position":[[319,22],[385,22],[455,22]]}},"keywords":{}}],["mystoragebucket",{"_index":6059,"title":{},"content":{"1140":{"position":[[705,15]]}},"keywords":{}}],["mystoragebucket.indexeddb",{"_index":6062,"title":{},"content":{"1140":{"position":[[799,26]]}},"keywords":{}}],["mystrongpassword123",{"_index":3437,"title":{},"content":{"564":{"position":[[667,21]]}},"keywords":{}}],["mytododb",{"_index":5256,"title":{},"content":{"904":{"position":[[739,11]]}},"keywords":{}}],["mytopsecretpassword",{"_index":3137,"title":{},"content":{"482":{"position":[[694,21]]}},"keywords":{}}],["myvalu",{"_index":4770,"title":{},"content":{"835":{"position":[[473,11]]}},"keywords":{}}],["myzerolocaldb",{"_index":3704,"title":{},"content":{"632":{"position":[[1313,16]]}},"keywords":{}}],["n",{"_index":3637,"title":{},"content":{"617":{"position":[[765,1]]}},"keywords":{}}],["n1ql",{"_index":415,"title":{},"content":{"25":{"position":[[120,4]]}},"keywords":{}}],["n\\n",{"_index":5046,"title":{},"content":{"875":{"position":[[7483,8]]}},"keywords":{}}],["nakamoto",{"_index":4713,"title":{},"content":{"820":{"position":[[660,10]]}},"keywords":{}}],["name",{"_index":35,"title":{"935":{"position":[[0,5]]},"961":{"position":[[0,5]]}},"content":{"1":{"position":[[555,5]]},"2":{"position":[[358,5]]},"3":{"position":[[238,5]]},"4":{"position":[[416,5]]},"5":{"position":[[326,5]]},"6":{"position":[[521,5],[700,5]]},"7":{"position":[[358,5],[422,4],[535,5],[618,4]]},"8":{"position":[[1127,5],[1204,4]]},"9":{"position":[[272,5],[347,4]]},"10":{"position":[[310,5]]},"11":{"position":[[836,5]]},"51":{"position":[[443,5],[515,7],[718,5],[743,4]]},"52":{"position":[[109,5],[209,5],[252,5],[421,5],[511,5],[658,5]]},"54":{"position":[[180,5]]},"55":{"position":[[892,5]]},"130":{"position":[[535,5]]},"143":{"position":[[475,5],[656,5]]},"188":{"position":[[1062,5],[1320,5],[1415,9],[1442,7]]},"189":{"position":[[487,4]]},"209":{"position":[[261,5]]},"211":{"position":[[231,5]]},"255":{"position":[[608,5]]},"258":{"position":[[169,5]]},"266":{"position":[[683,5]]},"302":{"position":[[136,5]]},"303":{"position":[[350,5]]},"314":{"position":[[494,5]]},"315":{"position":[[557,5]]},"316":{"position":[[442,5]]},"334":{"position":[[352,5],[705,5]]},"335":{"position":[[773,5]]},"345":{"position":[[50,6]]},"356":{"position":[[362,4],[445,6]]},"361":{"position":[[276,5],[375,5]]},"367":{"position":[[913,5],[1053,7]]},"392":{"position":[[362,5]]},"401":{"position":[[136,4]]},"402":{"position":[[2098,4]]},"422":{"position":[[340,6]]},"426":{"position":[[308,5]]},"444":{"position":[[766,4]]},"480":{"position":[[387,5]]},"482":{"position":[[632,5]]},"522":{"position":[[433,5],[460,4]]},"538":{"position":[[448,5],[473,4],[744,5],[816,7]]},"539":{"position":[[109,5],[209,5],[252,5],[421,5],[511,5],[658,5]]},"542":{"position":[[553,5]]},"554":{"position":[[1071,5]]},"562":{"position":[[186,5],[391,5],[463,7],[585,5]]},"563":{"position":[[498,5]]},"564":{"position":[[602,5]]},"579":{"position":[[361,5],[713,5]]},"580":{"position":[[555,5]]},"588":{"position":[[34,5]]},"598":{"position":[[455,5],[480,4],[751,5],[823,7]]},"599":{"position":[[118,5],[227,5],[279,5],[448,5],[538,5],[689,5]]},"612":{"position":[[985,5]]},"632":{"position":[[1307,5]]},"638":{"position":[[449,5]]},"639":{"position":[[79,6],[140,5]]},"653":{"position":[[272,5]]},"662":{"position":[[2145,5],[2482,5],[2552,7],[2633,5],[2722,5],[2810,5]]},"680":{"position":[[693,5]]},"691":{"position":[[107,5],[362,5]]},"693":{"position":[[1193,5]]},"710":{"position":[[1714,5],[1940,5],[2029,5],[2117,5]]},"711":{"position":[[1291,6]]},"717":{"position":[[1174,5]]},"718":{"position":[[677,5]]},"734":{"position":[[499,5]]},"739":{"position":[[303,5]]},"745":{"position":[[548,5]]},"749":{"position":[[19,4],[126,5],[290,6],[320,4],[349,4],[1426,4],[4898,5],[5284,4],[5610,4],[6239,5],[6494,4],[6513,5],[6519,4],[7675,4],[8160,4],[8252,5],[8467,4],[16938,4]]},"759":{"position":[[379,5],[506,4],[611,5]]},"760":{"position":[[502,4],[607,5]]},"772":{"position":[[789,5],[1046,5],[1634,5],[2396,5]]},"773":{"position":[[86,4],[579,5]]},"774":{"position":[[681,5]]},"789":{"position":[[137,6]]},"791":{"position":[[435,5]]},"808":{"position":[[200,7],[222,5],[556,7],[594,5]]},"810":{"position":[[221,5],[292,5]]},"811":{"position":[[201,5],[272,5]]},"812":{"position":[[117,5]]},"813":{"position":[[117,5],[278,5]]},"825":{"position":[[360,5]]},"829":{"position":[[658,5],[2436,5],[3352,5]]},"838":{"position":[[2246,5],[2316,5],[2696,5],[2766,7],[2847,5],[2936,5],[3024,5]]},"851":{"position":[[222,4]]},"854":{"position":[[466,7]]},"861":{"position":[[1930,4],[2039,5]]},"862":{"position":[[558,5],[751,5],[796,7]]},"865":{"position":[[229,4]]},"866":{"position":[[566,4]]},"872":{"position":[[1732,5],[3399,5],[3990,5]]},"885":{"position":[[547,5],[642,5]]},"886":{"position":[[704,4],[2418,4],[3615,5]]},"888":{"position":[[1129,5]]},"893":{"position":[[319,4],[365,5]]},"898":{"position":[[1716,4],[2340,5],[3933,5]]},"904":{"position":[[733,5],[1930,6]]},"917":{"position":[[196,4]]},"932":{"position":[[1062,5]]},"934":{"position":[[140,4]]},"935":{"position":[[5,4],[177,5],[194,5]]},"939":{"position":[[70,4]]},"942":{"position":[[210,5]]},"943":{"position":[[418,5]]},"944":{"position":[[225,5],[261,5]]},"946":{"position":[[182,5]]},"947":{"position":[[200,5],[235,5]]},"948":{"position":[[392,5]]},"950":{"position":[[291,5]]},"960":{"position":[[301,5],[328,4]]},"961":{"position":[[14,4],[106,4]]},"962":{"position":[[772,5],[988,5]]},"966":{"position":[[75,4],[556,5],[674,5]]},"967":{"position":[[141,5],[259,5]]},"1013":{"position":[[317,5]]},"1035":{"position":[[124,5]]},"1038":{"position":[[134,4],[180,4],[197,4]]},"1039":{"position":[[177,6]]},"1040":{"position":[[178,4],[408,5],[490,5]]},"1043":{"position":[[84,5]]},"1056":{"position":[[134,5]]},"1065":{"position":[[241,5],[813,5],[973,4],[998,4],[1076,5],[1102,5],[1311,5]]},"1067":{"position":[[2396,5]]},"1069":{"position":[[699,4]]},"1072":{"position":[[2352,5],[2674,5]]},"1074":{"position":[[123,4],[552,4]]},"1085":{"position":[[2072,6],[2274,4],[2321,5],[3736,4],[3775,5]]},"1090":{"position":[[801,5]]},"1100":{"position":[[450,4],[566,4],[682,5]]},"1101":{"position":[[494,5]]},"1102":{"position":[[367,5]]},"1103":{"position":[[337,5]]},"1105":{"position":[[763,5]]},"1106":{"position":[[701,5]]},"1108":{"position":[[431,5]]},"1114":{"position":[[730,5]]},"1118":{"position":[[664,5]]},"1121":{"position":[[470,5]]},"1125":{"position":[[306,5]]},"1126":{"position":[[386,5],[699,5]]},"1130":{"position":[[179,5]]},"1134":{"position":[[156,5]]},"1138":{"position":[[300,5]]},"1139":{"position":[[555,5]]},"1140":{"position":[[614,5]]},"1144":{"position":[[204,5]]},"1145":{"position":[[544,5]]},"1146":{"position":[[249,5]]},"1148":{"position":[[1143,5]]},"1149":{"position":[[936,5],[1149,5],[1219,7]]},"1154":{"position":[[764,5]]},"1158":{"position":[[212,5]]},"1159":{"position":[[398,5]]},"1163":{"position":[[558,5]]},"1165":{"position":[[748,5],[1086,5]]},"1168":{"position":[[160,5]]},"1172":{"position":[[325,5]]},"1182":{"position":[[562,5]]},"1184":{"position":[[801,5]]},"1189":{"position":[[423,5]]},"1201":{"position":[[200,5]]},"1208":{"position":[[888,5]]},"1210":{"position":[[440,5]]},"1211":{"position":[[695,5]]},"1222":{"position":[[1411,5]]},"1226":{"position":[[236,5]]},"1227":{"position":[[714,5]]},"1231":{"position":[[1045,5]]},"1264":{"position":[[158,5]]},"1265":{"position":[[702,5]]},"1267":{"position":[[636,5],[730,5]]},"1271":{"position":[[1589,5]]},"1274":{"position":[[340,5]]},"1275":{"position":[[351,5]]},"1276":{"position":[[953,5]]},"1277":{"position":[[400,5]]},"1278":{"position":[[477,5],[929,5]]},"1279":{"position":[[727,5]]},"1280":{"position":[[462,5]]},"1286":{"position":[[509,5]]},"1287":{"position":[[559,5]]},"1288":{"position":[[525,5]]},"1311":{"position":[[186,5]]}},"keywords":{}}],["name+collect",{"_index":6119,"title":{},"content":{"1165":{"position":[[520,16],[981,16]]}},"keywords":{}}],["name:foobar",{"_index":5356,"title":{},"content":{"950":{"position":[[244,11]]}},"keywords":{}}],["name].j",{"_index":6316,"title":{},"content":{"1266":{"position":[[618,12]]}},"keywords":{}}],["namecontroller.text",{"_index":1284,"title":{},"content":{"188":{"position":[[2945,20]]}},"keywords":{}}],["namelowercas",{"_index":5801,"title":{},"content":{"1072":{"position":[[2370,14],[2496,14]]}},"keywords":{}}],["namespac",{"_index":5985,"title":{},"content":{"1114":{"position":[[902,9]]},"1120":{"position":[[586,10]]}},"keywords":{}}],["narrow",{"_index":2487,"title":{},"content":{"402":{"position":[[2140,6],[2248,6]]}},"keywords":{}}],["narrowli",{"_index":2615,"title":{},"content":{"411":{"position":[[1702,8]]}},"keywords":{}}],["nat",{"_index":1054,"title":{"864":{"position":[[17,4]]}},"content":{"113":{"position":[[254,4]]},"174":{"position":[[3086,5]]},"238":{"position":[[169,5]]},"614":{"position":[[420,4]]},"793":{"position":[[823,4]]},"865":{"position":[[34,4],[161,4],[239,4]]},"866":{"position":[[15,4],[41,4],[400,6],[503,4],[541,5],[679,5]]},"867":{"position":[[148,4]]},"901":{"position":[[261,3]]},"1124":{"position":[[2302,5]]}},"keywords":{}}],["nativ",{"_index":58,"title":{"8":{"position":[[6,6]]},"371":{"position":[[38,7]]},"437":{"position":[[23,7]]},"549":{"position":[[6,6]]},"551":{"position":[[6,6]]},"552":{"position":[[40,7]]},"556":{"position":[[25,6]]},"703":{"position":[[19,7]]},"830":{"position":[[6,6]]},"833":{"position":[[6,6]]},"834":{"position":[[29,7]]},"852":{"position":[[6,7]]},"1139":{"position":[[23,6]]},"1145":{"position":[[23,6]]},"1214":{"position":[[24,6]]},"1277":{"position":[[17,7]]}},"content":{"4":{"position":[[56,6]]},"7":{"position":[[650,6]]},"8":{"position":[[187,6],[211,6],[263,6],[283,6],[342,6],[360,6],[454,7],[866,6],[939,6],[1181,6]]},"17":{"position":[[112,7],[269,7]]},"34":{"position":[[161,6],[495,8]]},"38":{"position":[[722,7]]},"47":{"position":[[1252,6]]},"66":{"position":[[163,6],[244,6]]},"80":{"position":[[52,8]]},"104":{"position":[[107,6]]},"109":{"position":[[6,8]]},"112":{"position":[[116,7]]},"120":{"position":[[122,6]]},"174":{"position":[[602,6],[2722,7]]},"201":{"position":[[196,8]]},"207":{"position":[[193,6]]},"231":{"position":[[145,8]]},"239":{"position":[[153,7]]},"243":{"position":[[87,6]]},"244":{"position":[[109,6],[434,6],[535,6],[1137,6],[1265,6],[1304,6],[1348,6],[1430,6]]},"248":{"position":[[82,7]]},"254":{"position":[[164,6],[400,7]]},"269":{"position":[[105,6],[228,6]]},"287":{"position":[[477,6]]},"314":{"position":[[143,6]]},"317":{"position":[[7,6]]},"364":{"position":[[183,6]]},"365":{"position":[[1053,7]]},"371":{"position":[[46,7],[309,6],[349,7]]},"375":{"position":[[930,6]]},"383":{"position":[[412,7]]},"384":{"position":[[211,7]]},"408":{"position":[[1616,6],[2073,6],[3598,6],[5156,6]]},"437":{"position":[[11,6],[273,6]]},"438":{"position":[[9,6]]},"445":{"position":[[1780,6]]},"446":{"position":[[1147,6]]},"447":{"position":[[243,6]]},"454":{"position":[[249,6],[470,7],[620,6]]},"458":{"position":[[72,7]]},"524":{"position":[[909,6]]},"535":{"position":[[41,6],[1304,7]]},"546":{"position":[[308,6]]},"551":{"position":[[7,6],[308,6],[333,6]]},"554":{"position":[[170,6]]},"556":{"position":[[112,6],[137,6],[230,6],[318,6],[1150,6]]},"557":{"position":[[125,6],[163,6],[466,6]]},"566":{"position":[[474,9],[1251,8],[1274,9]]},"581":{"position":[[227,6],[565,6]]},"595":{"position":[[41,6]]},"606":{"position":[[298,6]]},"613":{"position":[[793,6]]},"616":{"position":[[732,6],[1018,6]]},"621":{"position":[[281,8]]},"631":{"position":[[196,8]]},"640":{"position":[[335,6]]},"641":{"position":[[399,6]]},"659":{"position":[[24,6],[165,6]]},"711":{"position":[[739,6]]},"717":{"position":[[209,6]]},"749":{"position":[[1161,6]]},"793":{"position":[[316,7]]},"824":{"position":[[247,6]]},"828":{"position":[[85,7]]},"829":{"position":[[938,6]]},"830":{"position":[[75,7],[193,6]]},"832":{"position":[[270,6]]},"834":{"position":[[67,7]]},"835":{"position":[[583,6],[633,6]]},"836":{"position":[[236,7],[402,6],[486,6],[523,6],[650,6],[1061,6],[1296,6],[1617,6],[1645,6]]},"837":{"position":[[318,6],[855,7],[1032,7],[1078,6],[1232,6],[1355,6],[1375,6],[1401,6],[1513,6],[1768,6],[1813,6],[2146,6]]},"838":{"position":[[383,7],[1201,7],[1347,6],[1588,7],[1827,6],[2011,6],[2409,6],[3212,7],[3419,7]]},"840":{"position":[[627,7],[670,6]]},"842":{"position":[[52,6],[90,6],[321,7]]},"852":{"position":[[7,6]]},"861":{"position":[[1582,10]]},"882":{"position":[[80,6],[129,6]]},"901":{"position":[[97,6]]},"917":{"position":[[405,6],[442,9]]},"964":{"position":[[460,6]]},"1072":{"position":[[1790,9]]},"1147":{"position":[[528,6]]},"1173":{"position":[[236,6]]},"1183":{"position":[[473,6]]},"1191":{"position":[[383,6]]},"1196":{"position":[[22,6],[49,7]]},"1206":{"position":[[44,6]]},"1214":{"position":[[110,6],[702,6]]},"1247":{"position":[[100,7]]},"1271":{"position":[[235,6],[1266,6]]},"1277":{"position":[[19,6],[313,6],[502,6],[603,6],[683,6],[840,6]]},"1283":{"position":[[7,6]]},"1284":{"position":[[457,7]]},"1316":{"position":[[3556,6]]}},"keywords":{}}],["native"",{"_index":1520,"title":{},"content":{"244":{"position":[[1398,12]]}},"keywords":{}}],["native'",{"_index":133,"title":{},"content":{"9":{"position":[[12,8]]}},"keywords":{}}],["native)desktop",{"_index":3121,"title":{},"content":{"479":{"position":[[391,14]]}},"keywords":{}}],["natively.with",{"_index":2981,"title":{},"content":{"457":{"position":[[241,13]]}},"keywords":{}}],["nativescript",{"_index":6136,"title":{},"content":{"1173":{"position":[[154,13]]}},"keywords":{}}],["nats:2.9.17",{"_index":4925,"title":{},"content":{"865":{"position":[[257,11]]}},"keywords":{}}],["natur",{"_index":701,"title":{"350":{"position":[[21,7]]}},"content":{"45":{"position":[[326,7]]},"68":{"position":[[142,6]]},"73":{"position":[[89,7]]},"104":{"position":[[49,9]]},"173":{"position":[[500,6]]},"174":{"position":[[658,7],[1461,7]]},"226":{"position":[[435,6]]},"231":{"position":[[226,7]]},"354":{"position":[[67,7]]},"362":{"position":[[22,9]]},"364":{"position":[[80,9]]},"371":{"position":[[256,7]]},"385":{"position":[[282,6]]},"410":{"position":[[1825,9]]},"412":{"position":[[5677,7]]},"634":{"position":[[47,9]]},"723":{"position":[[1059,7]]},"901":{"position":[[409,6]]}},"keywords":{}}],["navig",{"_index":1975,"title":{},"content":{"346":{"position":[[489,10]]},"396":{"position":[[397,11],[547,9]]},"424":{"position":[[338,9]]}},"keywords":{}}],["navigator.hardwareconcurr",{"_index":2280,"title":{},"content":{"392":{"position":[[4651,30],[5039,29]]}},"keywords":{}}],["navigator.onlin",{"_index":5456,"title":{},"content":{"988":{"position":[[1021,16]]}},"keywords":{}}],["navigator.storage.estim",{"_index":1771,"title":{},"content":{"300":{"position":[[237,29]]},"301":{"position":[[325,28]]},"461":{"position":[[1284,29]]}},"keywords":{}}],["navigator.storage.getdirectori",{"_index":6197,"title":{},"content":{"1208":{"position":[[721,33]]},"1215":{"position":[[518,33]]}},"keywords":{}}],["navigator.storage.persist",{"_index":1777,"title":{},"content":{"300":{"position":[[482,27]]}},"keywords":{}}],["navigator.storagebuckets.open('myapp",{"_index":6060,"title":{},"content":{"1140":{"position":[[729,36]]}},"keywords":{}}],["near",{"_index":708,"title":{},"content":{"46":{"position":[[294,4]]},"65":{"position":[[1155,4]]},"265":{"position":[[411,4]]},"301":{"position":[[720,7]]},"375":{"position":[[520,4]]},"408":{"position":[[1611,4],[2068,4],[3593,4]]},"410":{"position":[[181,4]]},"415":{"position":[[68,4]]},"474":{"position":[[168,4]]},"483":{"position":[[65,4]]},"486":{"position":[[22,4]]},"498":{"position":[[577,4]]},"571":{"position":[[102,4]]},"632":{"position":[[1955,4]]},"641":{"position":[[394,4]]},"780":{"position":[[757,4]]},"1007":{"position":[[356,5]]},"1093":{"position":[[165,4]]}},"keywords":{}}],["nearbi",{"_index":2809,"title":{},"content":{"419":{"position":[[1423,6]]},"1007":{"position":[[2040,6]]}},"keywords":{}}],["nearest",{"_index":2209,"title":{},"content":{"390":{"position":[[1597,7]]},"396":{"position":[[232,7],[632,7]]}},"keywords":{}}],["nearli",{"_index":2127,"title":{},"content":{"369":{"position":[[1259,6]]},"412":{"position":[[2715,6]]},"478":{"position":[[173,6]]}},"keywords":{}}],["neatli",{"_index":3257,"title":{},"content":{"521":{"position":[[115,6]]},"590":{"position":[[315,6]]}},"keywords":{}}],["necessari",{"_index":714,"title":{},"content":{"46":{"position":[[439,9]]},"128":{"position":[[69,9]]},"227":{"position":[[383,9]]},"395":{"position":[[264,9]]},"430":{"position":[[303,9]]},"503":{"position":[[150,9]]},"542":{"position":[[182,9]]},"582":{"position":[[237,10]]},"617":{"position":[[2056,9]]},"778":{"position":[[461,9]]},"886":{"position":[[4726,9]]},"1052":{"position":[[164,10]]},"1072":{"position":[[567,9]]},"1198":{"position":[[1809,9]]}},"keywords":{}}],["necessary.vers",{"_index":4778,"title":{},"content":{"836":{"position":[[2019,17]]}},"keywords":{}}],["necessit",{"_index":948,"title":{},"content":{"66":{"position":[[597,13]]}},"keywords":{}}],["nedb",{"_index":502,"title":{"32":{"position":[[0,5]]}},"content":{"32":{"position":[[1,4],[284,4]]}},"keywords":{}}],["need",{"_index":44,"title":{"574":{"position":[[21,4]]},"784":{"position":[[14,4]]},"785":{"position":[[14,4]]},"1312":{"position":[[20,4]]}},"content":{"2":{"position":[[248,4]]},"6":{"position":[[407,4]]},"7":{"position":[[109,4]]},"8":{"position":[[423,4]]},"10":{"position":[[181,4]]},"11":{"position":[[1000,5]]},"18":{"position":[[148,6]]},"34":{"position":[[323,4]]},"35":{"position":[[568,6]]},"40":{"position":[[592,4]]},"46":{"position":[[40,5],[326,4]]},"47":{"position":[[400,4]]},"59":{"position":[[19,6]]},"65":{"position":[[322,4]]},"70":{"position":[[144,5]]},"72":{"position":[[151,6]]},"92":{"position":[[109,4]]},"96":{"position":[[72,4]]},"103":{"position":[[145,4]]},"122":{"position":[[329,4]]},"128":{"position":[[49,4]]},"129":{"position":[[267,4]]},"131":{"position":[[872,4]]},"133":{"position":[[323,4]]},"143":{"position":[[123,4],[300,7]]},"147":{"position":[[328,6]]},"159":{"position":[[271,4]]},"172":{"position":[[238,4]]},"173":{"position":[[772,4],[1703,4]]},"183":{"position":[[96,4]]},"188":{"position":[[1978,4]]},"212":{"position":[[33,4],[403,7],[553,4]]},"217":{"position":[[139,4]]},"219":{"position":[[228,4]]},"224":{"position":[[254,4]]},"233":{"position":[[205,4]]},"261":{"position":[[161,4],[1139,4]]},"262":{"position":[[32,4],[310,4]]},"266":{"position":[[420,6]]},"270":{"position":[[111,4]]},"271":{"position":[[69,5]]},"282":{"position":[[417,4]]},"285":{"position":[[273,6]]},"289":{"position":[[1765,4]]},"295":{"position":[[375,6]]},"298":{"position":[[10,4],[921,5]]},"303":{"position":[[39,4],[1111,4]]},"305":{"position":[[259,8]]},"306":{"position":[[120,4]]},"309":{"position":[[205,7]]},"314":{"position":[[131,4],[626,4],[954,4]]},"320":{"position":[[312,4]]},"321":{"position":[[47,4]]},"326":{"position":[[238,4]]},"346":{"position":[[97,6],[880,7]]},"353":{"position":[[582,7]]},"354":{"position":[[576,5]]},"357":{"position":[[541,5]]},"358":{"position":[[758,4],[806,4]]},"369":{"position":[[808,4],[865,6]]},"375":{"position":[[515,4]]},"378":{"position":[[83,5]]},"383":{"position":[[102,7],[520,6]]},"388":{"position":[[518,5]]},"391":{"position":[[62,4]]},"392":{"position":[[1133,4],[1323,4],[1813,4]]},"395":{"position":[[38,4]]},"400":{"position":[[234,4],[679,4]]},"410":{"position":[[319,4],[1195,5],[1690,4],[2191,4]]},"411":{"position":[[1088,4],[2201,4],[2614,4]]},"412":{"position":[[2587,5],[3233,4],[4012,4],[6288,5],[6609,4],[7146,4],[7305,5],[7440,4],[7508,6],[8243,5],[9447,4],[10068,4],[10108,4],[10774,7],[11318,4],[11612,4],[12258,4],[12660,4],[14353,4],[14616,7],[14719,5]]},"418":{"position":[[376,6]]},"432":{"position":[[75,6]]},"436":{"position":[[283,6]]},"441":{"position":[[275,5]]},"444":{"position":[[297,4]]},"445":{"position":[[2309,4]]},"451":{"position":[[250,4],[348,4]]},"463":{"position":[[395,5],[446,5]]},"468":{"position":[[245,4]]},"483":{"position":[[1003,4]]},"490":{"position":[[275,4],[636,6]]},"491":{"position":[[78,4],[894,5]]},"496":{"position":[[541,4]]},"497":{"position":[[181,4]]},"504":{"position":[[24,5],[509,5]]},"515":{"position":[[300,4]]},"518":{"position":[[318,4]]},"534":{"position":[[388,4]]},"542":{"position":[[1008,7]]},"551":{"position":[[383,4]]},"553":{"position":[[47,5]]},"555":{"position":[[933,4]]},"556":{"position":[[564,4]]},"559":{"position":[[1353,4]]},"560":{"position":[[155,6]]},"565":{"position":[[8,4]]},"566":{"position":[[1040,6]]},"567":{"position":[[1133,6]]},"569":{"position":[[1534,4]]},"570":{"position":[[611,4]]},"574":{"position":[[834,5]]},"590":{"position":[[566,4],[634,5]]},"594":{"position":[[386,4]]},"612":{"position":[[298,5]]},"614":{"position":[[202,4],[866,4]]},"618":{"position":[[751,4]]},"632":{"position":[[395,7],[1407,6]]},"634":{"position":[[223,4]]},"643":{"position":[[244,7]]},"650":{"position":[[70,4]]},"659":{"position":[[741,5]]},"660":{"position":[[340,5]]},"662":{"position":[[340,4]]},"669":{"position":[[8,4]]},"670":{"position":[[27,4]]},"679":{"position":[[76,4]]},"680":{"position":[[29,4]]},"689":{"position":[[511,5]]},"696":{"position":[[114,4],[196,4]]},"698":{"position":[[239,4],[2624,4]]},"701":{"position":[[225,4]]},"703":{"position":[[877,6],[1333,4]]},"705":{"position":[[968,4]]},"711":{"position":[[771,4]]},"714":{"position":[[868,4]]},"716":{"position":[[194,4]]},"721":{"position":[[276,4]]},"723":{"position":[[548,4],[1790,4],[2655,4]]},"727":{"position":[[10,4]]},"728":{"position":[[203,4]]},"731":{"position":[[8,4]]},"749":{"position":[[254,4],[7330,5],[17790,5],[19352,5],[19472,5]]},"752":{"position":[[637,6],[650,6]]},"781":{"position":[[353,5]]},"799":{"position":[[51,6],[287,4]]},"835":{"position":[[846,5]]},"836":{"position":[[2349,7]]},"838":{"position":[[369,4]]},"839":{"position":[[603,4],[696,6]]},"841":{"position":[[858,6],[1158,6],[1271,6]]},"848":{"position":[[33,4]]},"855":{"position":[[60,6]]},"856":{"position":[[119,6]]},"858":{"position":[[11,4]]},"861":{"position":[[215,7],[1647,5],[1826,4]]},"866":{"position":[[559,4]]},"867":{"position":[[60,6]]},"872":{"position":[[213,4],[347,4]]},"875":{"position":[[1326,4],[6622,4]]},"882":{"position":[[107,4]]},"885":{"position":[[285,4],[478,4]]},"886":{"position":[[56,4],[2112,4],[3270,4]]},"898":{"position":[[1811,4]]},"904":{"position":[[2284,4],[2815,4],[2956,4]]},"906":{"position":[[732,6]]},"934":{"position":[[39,4],[121,5]]},"965":{"position":[[187,6]]},"968":{"position":[[85,4]]},"986":{"position":[[415,6]]},"988":{"position":[[2311,6],[3413,6],[4786,4]]},"989":{"position":[[335,4]]},"1002":{"position":[[844,4]]},"1007":{"position":[[825,5]]},"1008":{"position":[[287,4]]},"1009":{"position":[[143,5],[1092,5]]},"1022":{"position":[[272,4]]},"1059":{"position":[[94,4]]},"1067":{"position":[[15,4],[79,4]]},"1068":{"position":[[474,4]]},"1072":{"position":[[269,4],[468,4],[1108,4],[1422,7]]},"1079":{"position":[[414,6]]},"1100":{"position":[[432,5]]},"1105":{"position":[[1125,4]]},"1107":{"position":[[226,4],[996,4]]},"1108":{"position":[[284,4]]},"1132":{"position":[[697,5]]},"1133":{"position":[[352,4],[549,4]]},"1135":{"position":[[367,4]]},"1141":{"position":[[78,4]]},"1147":{"position":[[412,5]]},"1150":{"position":[[240,4]]},"1157":{"position":[[499,4]]},"1164":{"position":[[412,6]]},"1237":{"position":[[39,5]]},"1246":{"position":[[1894,5]]},"1251":{"position":[[39,4]]},"1274":{"position":[[554,4]]},"1279":{"position":[[941,4]]},"1281":{"position":[[8,4]]},"1294":{"position":[[394,5],[452,4],[655,4],[2012,7]]},"1296":{"position":[[410,4]]},"1299":{"position":[[73,4]]},"1316":{"position":[[1823,4]]},"1317":{"position":[[370,4]]},"1323":{"position":[[160,4]]}},"keywords":{}}],["need.perform",{"_index":1559,"title":{},"content":{"252":{"position":[[182,12]]}},"keywords":{}}],["needs—especi",{"_index":3434,"title":{},"content":{"564":{"position":[[35,16]]}},"keywords":{}}],["neg",{"_index":4404,"title":{},"content":{"749":{"position":[[21131,8],[21602,10]]}},"keywords":{}}],["neighbor",{"_index":2210,"title":{},"content":{"390":{"position":[[1605,10]]},"396":{"position":[[240,8],[640,8]]}},"keywords":{}}],["neighboringchunkids.foreach(startchunkrepl",{"_index":5577,"title":{},"content":{"1007":{"position":[[2100,51]]}},"keywords":{}}],["neighboringchunkids.includes(cid",{"_index":5579,"title":{},"content":{"1007":{"position":[[2207,36]]}},"keywords":{}}],["ness",{"_index":5413,"title":{},"content":{"975":{"position":[[126,4]]}},"keywords":{}}],["nest",{"_index":1986,"title":{"812":{"position":[[13,6]]}},"content":{"350":{"position":[[68,6]]},"352":{"position":[[44,6],[301,6]]},"353":{"position":[[320,6]]},"354":{"position":[[93,6]]},"356":{"position":[[299,6],[809,6]]},"362":{"position":[[84,6]]},"364":{"position":[[534,6],[664,6]]},"369":{"position":[[386,6]]},"561":{"position":[[44,6]]},"749":{"position":[[15232,7]]},"765":{"position":[[62,6]]},"811":{"position":[[153,6]]},"861":{"position":[[1427,6],[1507,6]]},"1040":{"position":[[218,6]]},"1116":{"position":[[182,6],[455,6],[565,6]]}},"keywords":{}}],["nestedvalu",{"_index":5678,"title":{},"content":{"1040":{"position":[[237,11]]}},"keywords":{}}],["netscap",{"_index":2951,"title":{},"content":{"450":{"position":[[34,8]]}},"keywords":{}}],["network",{"_index":392,"title":{},"content":{"23":{"position":[[401,7]]},"40":{"position":[[388,10]]},"65":{"position":[[1121,7]]},"122":{"position":[[241,7],[380,7]]},"133":{"position":[[235,7],[373,7]]},"147":{"position":[[144,7]]},"152":{"position":[[369,7]]},"173":{"position":[[790,7]]},"183":{"position":[[343,7]]},"206":{"position":[[325,7]]},"216":{"position":[[135,7]]},"236":{"position":[[260,7]]},"251":{"position":[[120,7]]},"273":{"position":[[208,7]]},"280":{"position":[[502,7]]},"289":{"position":[[225,7],[1841,7],[2016,7]]},"309":{"position":[[121,9],[254,7]]},"311":{"position":[[245,7]]},"316":{"position":[[530,7]]},"323":{"position":[[227,7]]},"327":{"position":[[182,7]]},"346":{"position":[[601,7]]},"376":{"position":[[185,7]]},"407":{"position":[[153,8],[420,7]]},"408":{"position":[[2891,7]]},"410":{"position":[[1242,8]]},"414":{"position":[[146,7],[334,7]]},"415":{"position":[[319,7],[400,7]]},"419":{"position":[[287,8],[899,7]]},"421":{"position":[[589,7]]},"434":{"position":[[308,7]]},"444":{"position":[[267,7]]},"445":{"position":[[620,7]]},"462":{"position":[[551,7]]},"473":{"position":[[123,7]]},"486":{"position":[[93,7],[363,7]]},"491":{"position":[[329,7],[1011,9]]},"498":{"position":[[653,7]]},"500":{"position":[[497,7]]},"502":{"position":[[568,7]]},"556":{"position":[[1579,7]]},"584":{"position":[[110,7]]},"590":{"position":[[764,7]]},"610":{"position":[[702,7]]},"613":{"position":[[425,11]]},"630":{"position":[[108,7]]},"631":{"position":[[493,7]]},"632":{"position":[[716,9],[2812,7]]},"696":{"position":[[710,7]]},"705":{"position":[[1335,7]]},"860":{"position":[[426,7]]},"902":{"position":[[740,8]]},"904":{"position":[[3347,8]]},"1007":{"position":[[1121,7]]},"1009":{"position":[[635,7]]},"1304":{"position":[[850,7]]}},"keywords":{}}],["network.easi",{"_index":3292,"title":{},"content":{"534":{"position":[[414,14]]},"594":{"position":[[412,14]]}},"keywords":{}}],["never",{"_index":361,"title":{},"content":{"21":{"position":[[182,5]]},"253":{"position":[[206,5]]},"292":{"position":[[17,5]]},"455":{"position":[[754,5]]},"461":{"position":[[232,5]]},"491":{"position":[[984,5]]},"569":{"position":[[431,5],[1073,5],[1432,5]]},"571":{"position":[[1816,5]]},"670":{"position":[[268,5]]},"699":{"position":[[943,5]]},"749":{"position":[[6124,5],[24388,5]]},"816":{"position":[[144,5],[325,5]]},"817":{"position":[[197,5]]},"829":{"position":[[367,5]]},"855":{"position":[[22,5]]},"867":{"position":[[22,5]]},"898":{"position":[[2898,5]]},"935":{"position":[[157,5]]},"986":{"position":[[349,5]]},"991":{"position":[[38,5]]},"994":{"position":[[183,5]]},"995":{"position":[[1155,5]]},"1031":{"position":[[24,5],[283,5]]},"1033":{"position":[[123,5],[929,5]]},"1198":{"position":[[717,5]]},"1207":{"position":[[195,5]]},"1231":{"position":[[358,5]]},"1301":{"position":[[1019,5]]},"1321":{"position":[[86,5]]}},"keywords":{}}],["new",{"_index":162,"title":{},"content":{"11":{"position":[[585,3]]},"38":{"position":[[1099,3]]},"41":{"position":[[43,3]]},"50":{"position":[[124,3]]},"255":{"position":[[107,3]]},"260":{"position":[[326,3]]},"261":{"position":[[1043,3]]},"329":{"position":[[123,3]]},"335":{"position":[[572,3],[900,3]]},"351":{"position":[[265,3],[306,3]]},"360":{"position":[[866,3]]},"392":{"position":[[3857,3],[3921,3],[4254,3]]},"394":{"position":[[606,4]]},"397":{"position":[[2038,3]]},"398":{"position":[[800,3],[848,3],[2068,3],[2134,3]]},"403":{"position":[[685,3],[879,3]]},"408":{"position":[[49,3],[1400,3],[1487,3],[1516,3]]},"410":{"position":[[2100,3]]},"412":{"position":[[11082,3]]},"414":{"position":[[120,3]]},"420":{"position":[[561,3]]},"421":{"position":[[84,3]]},"430":{"position":[[1065,3],[1078,3]]},"453":{"position":[[55,3]]},"459":{"position":[[842,3]]},"463":{"position":[[819,3]]},"494":{"position":[[616,3]]},"498":{"position":[[124,3]]},"501":{"position":[[429,3]]},"556":{"position":[[488,3]]},"571":{"position":[[242,3],[839,3],[1083,3]]},"610":{"position":[[388,3],[431,3],[589,3],[1102,3]]},"611":{"position":[[642,3]]},"612":{"position":[[237,4],[1152,3],[2270,3]]},"618":{"position":[[698,3]]},"620":{"position":[[522,3],[555,3]]},"621":{"position":[[421,3],[628,3]]},"624":{"position":[[557,4],[1474,3]]},"632":{"position":[[157,3],[975,3]]},"634":{"position":[[368,3]]},"636":{"position":[[26,3]]},"653":{"position":[[869,3]]},"661":{"position":[[1101,3]]},"662":{"position":[[1820,3]]},"674":{"position":[[154,3]]},"686":{"position":[[275,3]]},"696":{"position":[[217,3]]},"698":{"position":[[279,3],[1321,3],[2736,3],[2791,3],[2859,3],[2926,3]]},"702":{"position":[[101,3],[393,3],[786,3]]},"711":{"position":[[1149,3],[1552,3]]},"719":{"position":[[286,3]]},"737":{"position":[[461,3]]},"739":{"position":[[718,3]]},"751":{"position":[[352,4],[649,3],[892,3],[1074,3],[1126,3],[1751,3],[1905,3]]},"754":{"position":[[363,3],[715,3]]},"759":{"position":[[328,3],[582,3],[1050,3],[1209,3],[1336,3]]},"760":{"position":[[578,3]]},"767":{"position":[[48,3],[558,3],[693,3],[967,3]]},"768":{"position":[[560,3],[703,3],[969,3]]},"769":{"position":[[517,3],[664,3],[938,3]]},"772":{"position":[[2474,3]]},"778":{"position":[[560,3]]},"837":{"position":[[2105,3]]},"839":{"position":[[1119,3]]},"848":{"position":[[946,3]]},"862":{"position":[[971,3]]},"866":{"position":[[310,3]]},"868":{"position":[[75,3]]},"872":{"position":[[904,3]]},"875":{"position":[[888,3],[1845,3],[1948,3],[4019,3],[4423,3],[8093,3],[8128,3],[9512,3],[9547,3]]},"879":{"position":[[119,3]]},"885":{"position":[[398,3]]},"897":{"position":[[279,3]]},"898":{"position":[[140,3]]},"902":{"position":[[174,3]]},"904":{"position":[[1236,3]]},"905":{"position":[[115,3]]},"910":{"position":[[239,3]]},"917":{"position":[[64,3]]},"942":{"position":[[20,3],[153,3]]},"943":{"position":[[53,3]]},"946":{"position":[[110,3]]},"982":{"position":[[93,3],[169,3],[456,3],[568,3]]},"986":{"position":[[1243,5]]},"987":{"position":[[602,3]]},"988":{"position":[[5085,3],[5215,3],[5298,3]]},"1004":{"position":[[732,3]]},"1007":{"position":[[908,3]]},"1009":{"position":[[188,3],[532,3]]},"1014":{"position":[[155,3]]},"1022":{"position":[[718,3]]},"1023":{"position":[[369,3]]},"1042":{"position":[[92,3]]},"1048":{"position":[[471,3]]},"1058":{"position":[[527,3]]},"1069":{"position":[[318,3],[522,3]]},"1085":{"position":[[122,3],[3041,3],[3413,3],[3671,3],[3753,3],[3794,3]]},"1109":{"position":[[316,3]]},"1115":{"position":[[147,4]]},"1148":{"position":[[811,3]]},"1150":{"position":[[560,3]]},"1172":{"position":[[381,3]]},"1174":{"position":[[644,3]]},"1177":{"position":[[497,3]]},"1208":{"position":[[879,3],[1165,3],[1323,3],[1433,3],[1538,3],[1694,3]]},"1209":{"position":[[241,3]]},"1218":{"position":[[487,3],[835,3]]},"1229":{"position":[[90,3]]},"1242":{"position":[[155,3]]},"1266":{"position":[[985,4]]},"1268":{"position":[[90,3],[167,3],[477,3]]},"1279":{"position":[[642,3]]},"1294":{"position":[[21,3],[1136,3]]},"1300":{"position":[[421,3],[732,3],[985,3]]},"1304":{"position":[[385,3]]},"1305":{"position":[[772,3]]},"1308":{"position":[[565,4]]},"1316":{"position":[[1631,3],[1730,3],[3136,3]]},"1318":{"position":[[440,3],[504,3],[608,3],[890,3],[1092,3]]},"1319":{"position":[[337,3]]}},"keywords":{}}],["new/upd",{"_index":1355,"title":{},"content":{"209":{"position":[[1045,11]]}},"keywords":{}}],["newcheckpoint",{"_index":4999,"title":{},"content":{"875":{"position":[[2622,13],[2862,13]]}},"keywords":{}}],["newcont",{"_index":3466,"title":{},"content":{"571":{"position":[[1108,10],[1236,11]]}},"keywords":{}}],["newcustomfetchmethod",{"_index":4841,"title":{},"content":{"848":{"position":[[1030,21]]}},"keywords":{}}],["newdocumentst",{"_index":5014,"title":{},"content":{"875":{"position":[[3824,16]]},"885":{"position":[[996,17]]},"1309":{"position":[[1157,16]]}},"keywords":{}}],["newer",{"_index":827,"title":{},"content":{"55":{"position":[[23,5]]},"59":{"position":[[83,5]]},"408":{"position":[[5026,5]]},"420":{"position":[[161,5]]},"546":{"position":[[138,5]]},"563":{"position":[[89,5]]},"606":{"position":[[138,5]]},"696":{"position":[[1890,5]]},"749":{"position":[[12596,5]]},"761":{"position":[[445,6]]},"773":{"position":[[710,5]]},"885":{"position":[[64,5],[1966,5]]},"932":{"position":[[661,5]]},"984":{"position":[[605,5]]},"986":{"position":[[1367,5]]},"1002":{"position":[[223,5],[479,5],[1132,5]]},"1162":{"position":[[1090,5]]},"1275":{"position":[[29,6]]},"1278":{"position":[[145,5]]},"1282":{"position":[[415,6]]}},"keywords":{}}],["newest",{"_index":4820,"title":{},"content":{"844":{"position":[[241,6]]},"1046":{"position":[[63,6]]}},"keywords":{}}],["newfetchmethod",{"_index":4825,"title":{},"content":{"846":{"position":[[577,17]]}},"keywords":{}}],["newforkst",{"_index":5442,"title":{},"content":{"983":{"position":[[535,12]]}},"keywords":{}}],["newhero",{"_index":3500,"title":{},"content":{"580":{"position":[[697,10]]},"601":{"position":[[685,10]]}},"keywords":{}}],["newli",{"_index":1337,"title":{},"content":{"208":{"position":[[152,5]]},"939":{"position":[[105,5]]},"943":{"position":[[308,5]]},"955":{"position":[[244,5]]}},"keywords":{}}],["newnam",{"_index":1425,"title":{},"content":{"235":{"position":[[346,10]]},"571":{"position":[[1381,10]]},"1039":{"position":[[256,8],[430,8]]},"1040":{"position":[[389,10]]}},"keywords":{}}],["next",{"_index":648,"title":{"824":{"position":[[0,4]]}},"content":{"41":{"position":[[56,4]]},"114":{"position":[[696,4]]},"263":{"position":[[538,4]]},"388":{"position":[[37,4]]},"393":{"position":[[61,4]]},"412":{"position":[[11386,4]]},"464":{"position":[[1,4]]},"466":{"position":[[4,4]]},"498":{"position":[[73,4]]},"700":{"position":[[936,4]]},"703":{"position":[[1572,4]]},"752":{"position":[[952,5]]},"965":{"position":[[390,4]]},"988":{"position":[[4219,4]]},"1008":{"position":[[154,4]]},"1198":{"position":[[2164,4]]},"1294":{"position":[[741,4]]}},"keywords":{}}],["next.j",{"_index":2924,"title":{},"content":{"438":{"position":[[180,8]]}},"keywords":{}}],["nextjs/vercel",{"_index":595,"title":{},"content":{"38":{"position":[[698,13]]}},"keywords":{}}],["nexttick",{"_index":5269,"title":{},"content":{"910":{"position":[[397,9]]}},"keywords":{}}],["ngfor="let",{"_index":821,"title":{},"content":{"54":{"position":[[222,16]]},"55":{"position":[[1144,16]]},"130":{"position":[[567,16]]},"493":{"position":[[231,16]]},"825":{"position":[[798,16]]}},"keywords":{}}],["ngif="(mycollection.find",{"_index":3175,"title":{},"content":{"493":{"position":[[162,34]]}},"keywords":{}}],["nginx",{"_index":3681,"title":{},"content":{"624":{"position":[[1123,5]]},"849":{"position":[[737,5]]},"1088":{"position":[[758,5]]}},"keywords":{}}],["ngrx",{"_index":1018,"title":{},"content":{"96":{"position":[[134,5]]},"173":{"position":[[3095,5]]},"219":{"position":[[99,5]]}},"keywords":{}}],["ngzone",{"_index":756,"title":{},"content":{"50":{"position":[[447,6]]}},"keywords":{}}],["nich",{"_index":3626,"title":{},"content":{"614":{"position":[[738,5]]}},"keywords":{}}],["night",{"_index":3956,"title":{},"content":{"700":{"position":[[895,5]]}},"keywords":{}}],["nobodi",{"_index":2846,"title":{},"content":{"421":{"position":[[153,6]]}},"keywords":{}}],["node",{"_index":94,"title":{"7":{"position":[[0,4]]},"438":{"position":[[0,4]]},"1127":{"position":[[11,4]]},"1245":{"position":[[14,5]]}},"content":{"7":{"position":[[23,4],[241,4],[300,4]]},"8":{"position":[[635,4]]},"396":{"position":[[485,6],[733,6]]},"412":{"position":[[14668,5]]},"438":{"position":[[155,4],[193,4]]},"666":{"position":[[370,5]]},"773":{"position":[[864,4]]},"793":{"position":[[273,4]]},"861":{"position":[[1098,4]]},"911":{"position":[[297,4],[410,4],[541,5]]},"1090":{"position":[[661,6]]},"1130":{"position":[[126,6]]},"1133":{"position":[[121,4],[521,4]]},"1214":{"position":[[511,4]]},"1245":{"position":[[16,4]]}},"keywords":{}}],["node.j",{"_index":504,"title":{"370":{"position":[[8,8]]},"438":{"position":[[22,8]]},"672":{"position":[[11,8]]},"771":{"position":[[0,7]]},"773":{"position":[[8,7]]},"911":{"position":[[41,8]]},"1159":{"position":[[44,8]]}},"content":{"32":{"position":[[58,8]]},"201":{"position":[[167,8]]},"248":{"position":[[57,8]]},"249":{"position":[[115,9]]},"254":{"position":[[211,8],[342,8]]},"261":{"position":[[629,7]]},"325":{"position":[[74,8]]},"359":{"position":[[115,8]]},"365":{"position":[[666,7],[974,7]]},"370":{"position":[[1,7],[93,7]]},"438":{"position":[[46,7],[144,7],[306,7]]},"569":{"position":[[1328,8]]},"575":{"position":[[186,8]]},"612":{"position":[[1726,7]]},"613":{"position":[[811,8]]},"624":{"position":[[422,7],[973,7]]},"631":{"position":[[215,7]]},"640":{"position":[[568,8]]},"707":{"position":[[93,7]]},"709":{"position":[[1355,7]]},"710":{"position":[[698,7]]},"711":{"position":[[746,7]]},"729":{"position":[[190,7]]},"772":{"position":[[178,8]]},"773":{"position":[[39,7],[145,7],[678,7],[836,7]]},"774":{"position":[[1020,7]]},"775":{"position":[[37,7],[103,7]]},"776":{"position":[[337,7]]},"793":{"position":[[281,9],[347,8]]},"799":{"position":[[368,7]]},"821":{"position":[[466,7]]},"871":{"position":[[588,7]]},"872":{"position":[[107,7]]},"875":{"position":[[617,7]]},"896":{"position":[[334,7]]},"904":{"position":[[2803,8],[2848,7],[2944,8],[2994,7]]},"911":{"position":[[85,7]]},"962":{"position":[[555,8],[870,8]]},"964":{"position":[[435,7]]},"989":{"position":[[113,7]]},"1088":{"position":[[332,8]]},"1094":{"position":[[104,8]]},"1095":{"position":[[288,7]]},"1124":{"position":[[429,8]]},"1135":{"position":[[115,7]]},"1139":{"position":[[1,7],[71,8]]},"1145":{"position":[[1,7],[67,8]]},"1159":{"position":[[96,7]]},"1188":{"position":[[10,7]]},"1214":{"position":[[120,8],[226,7],[368,7]]},"1219":{"position":[[127,7]]},"1245":{"position":[[67,7]]},"1246":{"position":[[158,9]]},"1247":{"position":[[75,8]]},"1270":{"position":[[54,7]]},"1274":{"position":[[146,8],[468,7]]},"1275":{"position":[[6,7],[109,8]]},"1279":{"position":[[855,7]]}},"keywords":{}}],["node.js.appwrit",{"_index":4913,"title":{},"content":{"863":{"position":[[303,16]]}},"keywords":{}}],["node/n",{"_index":6170,"title":{"1196":{"position":[[0,11]]}},"content":{},"keywords":{}}],["node:sqlit",{"_index":6333,"title":{"1275":{"position":[[15,11]]}},"content":{"1271":{"position":[[1390,14]]},"1272":{"position":[[512,11]]},"1275":{"position":[[290,14]]}},"keywords":{}}],["node_modul",{"_index":6230,"title":{},"content":{"1210":{"position":[[613,12]]},"1266":{"position":[[769,17]]}},"keywords":{}}],["node_modules/.bin/electron",{"_index":3995,"title":{},"content":{"711":{"position":[[976,28]]}},"keywords":{}}],["node_modules/rxdb",{"_index":6232,"title":{},"content":{"1210":{"position":[[650,18]]},"1227":{"position":[[231,17],[812,17]]},"1265":{"position":[[224,17]]}},"keywords":{}}],["node_modules/rxdb/dist/work",{"_index":6303,"title":{},"content":{"1265":{"position":[[794,30]]}},"keywords":{}}],["nodedatachannelpolyfil",{"_index":5275,"title":{},"content":{"911":{"position":[[512,23],[772,24]]}},"keywords":{}}],["nodeintegr",{"_index":3926,"title":{},"content":{"693":{"position":[[656,15]]}},"keywords":{}}],["nodej",{"_index":81,"title":{},"content":{"5":{"position":[[388,6]]},"6":{"position":[[189,6]]},"7":{"position":[[163,6]]},"666":{"position":[[82,6]]},"743":{"position":[[203,6]]},"773":{"position":[[288,6]]},"776":{"position":[[20,6]]},"1173":{"position":[[133,6]]},"1202":{"position":[[230,6]]},"1271":{"position":[[1259,6]]}},"keywords":{}}],["noisi",{"_index":4117,"title":{},"content":{"746":{"position":[[182,6]]}},"keywords":{}}],["non",{"_index":516,"title":{"245":{"position":[[0,3]]},"1084":{"position":[[0,3]]},"1126":{"position":[[6,3]]},"1151":{"position":[[14,3]]},"1178":{"position":[[14,3]]}},"content":{"33":{"position":[[208,3]]},"38":{"position":[[939,3]]},"402":{"position":[[876,3]]},"412":{"position":[[1413,3]]},"419":{"position":[[1261,3]]},"427":{"position":[[112,3],[199,3]]},"496":{"position":[[130,3]]},"555":{"position":[[428,3],[738,3]]},"619":{"position":[[219,3]]},"661":{"position":[[342,3]]},"668":{"position":[[233,3]]},"687":{"position":[[304,3]]},"714":{"position":[[1078,3]]},"749":{"position":[[9862,3],[9976,3],[11175,3],[11970,3],[23009,3]]},"829":{"position":[[205,3]]},"840":{"position":[[251,3]]},"857":{"position":[[486,3]]},"875":{"position":[[1987,3]]},"881":{"position":[[56,3]]},"887":{"position":[[18,3],[495,3]]},"988":{"position":[[2020,3]]},"1000":{"position":[[62,3]]},"1004":{"position":[[384,3]]},"1044":{"position":[[31,3]]},"1067":{"position":[[1808,3],[2229,3]]},"1068":{"position":[[10,3]]},"1102":{"position":[[85,3]]},"1126":{"position":[[637,3]]},"1137":{"position":[[74,3]]},"1143":{"position":[[457,3]]},"1180":{"position":[[382,3]]},"1188":{"position":[[131,3],[273,3]]},"1196":{"position":[[126,3]]},"1244":{"position":[[103,3]]},"1278":{"position":[[681,3]]}},"keywords":{}}],["nondonetask",{"_index":6102,"title":{},"content":{"1158":{"position":[[661,12]]}},"keywords":{}}],["none",{"_index":3442,"title":{},"content":{"566":{"position":[[434,5],[469,4],[1060,5],[1080,4]]},"749":{"position":[[515,4]]},"841":{"position":[[502,4],[715,4],[720,4],[1130,4]]}},"keywords":{}}],["norm.classif",{"_index":2205,"title":{},"content":{"390":{"position":[[1527,20]]}},"keywords":{}}],["normal",{"_index":223,"title":{},"content":{"14":{"position":[[722,8]]},"315":{"position":[[1136,6]]},"352":{"position":[[198,11]]},"356":{"position":[[770,6]]},"391":{"position":[[699,10]]},"421":{"position":[[129,6]]},"469":{"position":[[402,6]]},"554":{"position":[[858,6]]},"610":{"position":[[183,6],[1178,6]]},"626":{"position":[[716,6]]},"685":{"position":[[67,8],[300,8]]},"702":{"position":[[241,8]]},"714":{"position":[[184,7],[1135,7]]},"717":{"position":[[728,6]]},"718":{"position":[[301,6]]},"778":{"position":[[4,8]]},"782":{"position":[[4,6]]},"784":{"position":[[4,6]]},"818":{"position":[[33,6]]},"862":{"position":[[1706,6]]},"872":{"position":[[2808,6]]},"875":{"position":[[6543,6]]},"892":{"position":[[145,6]]},"898":{"position":[[1590,6],[4624,6]]},"1018":{"position":[[34,6]]},"1044":{"position":[[10,6]]},"1055":{"position":[[97,6]]},"1067":{"position":[[201,6],[655,6],[1029,6],[1695,6]]},"1107":{"position":[[1,6]]},"1162":{"position":[[381,8]]},"1181":{"position":[[468,8]]},"1184":{"position":[[1,8]]},"1227":{"position":[[516,6]]},"1231":{"position":[[935,6]]},"1246":{"position":[[1752,6]]},"1265":{"position":[[510,6]]},"1295":{"position":[[26,8]]},"1296":{"position":[[972,6],[1331,6],[1825,6]]},"1301":{"position":[[52,8]]},"1316":{"position":[[2070,6]]}},"keywords":{}}],["normalfield",{"_index":3351,"title":{},"content":{"554":{"position":[[1426,12],[1511,14]]},"555":{"position":[[316,12],[510,12]]},"556":{"position":[[852,12]]}},"keywords":{}}],["nosql",{"_index":414,"title":{"73":{"position":[[0,5]]},"74":{"position":[[0,5]]},"104":{"position":[[0,5]]},"105":{"position":[[0,5]]},"231":{"position":[[0,5]]},"264":{"position":[[18,5]]},"276":{"position":[[0,5]]},"278":{"position":[[4,5]]},"281":{"position":[[0,5]]},"282":{"position":[[29,5]]},"309":{"position":[[17,5]]},"348":{"position":[[26,5]]},"349":{"position":[[39,6]]},"353":{"position":[[3,5]]},"794":{"position":[[36,5]]},"1253":{"position":[[19,8]]},"1312":{"position":[[25,5]]},"1315":{"position":[[22,6]]},"1320":{"position":[[32,6]]},"1323":{"position":[[19,6]]}},"content":{"25":{"position":[[52,5],[181,5]]},"41":{"position":[[153,5]]},"73":{"position":[[1,5]]},"104":{"position":[[15,5],[158,5]]},"105":{"position":[[61,5]]},"118":{"position":[[124,5]]},"126":{"position":[[237,5]]},"174":{"position":[[479,5],[640,5],[747,5]]},"179":{"position":[[20,5]]},"202":{"position":[[242,5]]},"231":{"position":[[15,5],[188,5]]},"244":{"position":[[542,5]]},"252":{"position":[[117,5]]},"265":{"position":[[57,5]]},"267":{"position":[[1160,5]]},"271":{"position":[[104,5]]},"273":{"position":[[24,5]]},"276":{"position":[[8,5],[264,5]]},"278":{"position":[[90,5],[207,5]]},"279":{"position":[[1,5]]},"280":{"position":[[104,5]]},"281":{"position":[[116,5],[272,5]]},"282":{"position":[[110,5],[197,5]]},"289":{"position":[[614,5],[1037,5]]},"313":{"position":[[18,5]]},"317":{"position":[[145,5]]},"325":{"position":[[23,5]]},"350":{"position":[[127,5]]},"351":{"position":[[140,5]]},"353":{"position":[[151,5]]},"354":{"position":[[1,5],[861,5],[1013,5],[1166,5],[1632,5]]},"359":{"position":[[6,5]]},"361":{"position":[[218,5]]},"362":{"position":[[43,5]]},"370":{"position":[[146,5]]},"378":{"position":[[47,5]]},"392":{"position":[[1197,5]]},"412":{"position":[[14481,5],[14818,5]]},"479":{"position":[[31,5]]},"501":{"position":[[109,5]]},"502":{"position":[[42,5]]},"504":{"position":[[1158,5]]},"561":{"position":[[242,5]]},"566":{"position":[[152,5]]},"575":{"position":[[77,5]]},"631":{"position":[[28,5],[318,5]]},"662":{"position":[[27,5]]},"678":{"position":[[43,5]]},"686":{"position":[[197,5],[310,5],[505,5]]},"705":{"position":[[233,6],[548,5],[615,5]]},"710":{"position":[[13,5]]},"772":{"position":[[315,5]]},"793":{"position":[[1298,5]]},"801":{"position":[[125,5]]},"802":{"position":[[54,5]]},"837":{"position":[[27,5]]},"838":{"position":[[27,5]]},"841":{"position":[[151,5],[183,5],[235,5]]},"903":{"position":[[586,5]]},"1071":{"position":[[17,5]]},"1102":{"position":[[1151,5]]},"1105":{"position":[[172,5],[226,5]]},"1132":{"position":[[606,5],[1275,5]]},"1247":{"position":[[402,5]]},"1253":{"position":[[12,5]]},"1313":{"position":[[999,5]]},"1315":{"position":[[139,6],[480,5],[1383,6]]},"1316":{"position":[[3098,6]]},"1317":{"position":[[79,5]]},"1318":{"position":[[6,5],[741,5]]},"1319":{"position":[[134,5]]},"1320":{"position":[[541,6]]},"1321":{"position":[[601,5]]}},"keywords":{}}],["nosql/docu",{"_index":2763,"title":{},"content":{"412":{"position":[[13478,14]]}},"keywords":{}}],["nosql—solv",{"_index":2069,"title":{},"content":{"358":{"position":[[860,11]]}},"keywords":{}}],["nosql’",{"_index":2003,"title":{},"content":{"352":{"position":[[352,7]]}},"keywords":{}}],["not"",{"_index":4919,"title":{},"content":{"863":{"position":[[733,9]]}},"keywords":{}}],["notabl",{"_index":1616,"title":{},"content":{"267":{"position":[[82,7]]},"282":{"position":[[455,7]]},"356":{"position":[[66,8]]}},"keywords":{}}],["note",{"_index":68,"title":{},"content":{"4":{"position":[[166,4]]},"9":{"position":[[36,4]]},"198":{"position":[[467,4]]},"211":{"position":[[345,6],[371,6]]},"299":{"position":[[169,5]]},"300":{"position":[[649,4]]},"314":{"position":[[613,5],[693,6],[719,6]]},"375":{"position":[[167,4]]},"388":{"position":[[428,4]]},"391":{"position":[[948,4]]},"394":{"position":[[972,4],[1301,4]]},"432":{"position":[[519,6]]},"436":{"position":[[317,4]]},"446":{"position":[[129,4]]},"555":{"position":[[701,5]]},"613":{"position":[[535,4]]},"620":{"position":[[478,4]]},"693":{"position":[[651,4]]},"759":{"position":[[1010,4]]},"770":{"position":[[533,4]]},"871":{"position":[[535,4]]},"872":{"position":[[1134,4]]},"875":{"position":[[5618,4],[7554,4]]},"886":{"position":[[4648,5],[4930,4]]},"890":{"position":[[949,4]]},"897":{"position":[[354,4]]},"927":{"position":[[46,4]]},"944":{"position":[[364,4]]},"951":{"position":[[445,4]]},"953":{"position":[[170,4]]},"1013":{"position":[[620,4]]},"1018":{"position":[[338,4]]},"1067":{"position":[[605,4]]},"1079":{"position":[[484,4]]},"1105":{"position":[[1012,4]]},"1107":{"position":[[915,4]]},"1108":{"position":[[568,4]]}},"keywords":{}}],["noteschrome/chromium",{"_index":1740,"title":{},"content":{"299":{"position":[[233,20]]}},"keywords":{}}],["noth",{"_index":3963,"title":{"704":{"position":[[0,7]]}},"content":{"702":{"position":[[427,7]]},"754":{"position":[[292,7]]},"975":{"position":[[367,7],[561,7]]},"1192":{"position":[[196,7]]},"1313":{"position":[[725,7]]},"1319":{"position":[[373,7]]}},"keywords":{}}],["notic",{"_index":2502,"title":{"743":{"position":[[0,7]]}},"content":{"404":{"position":[[322,6]]},"408":{"position":[[3229,10]]},"452":{"position":[[512,10]]},"458":{"position":[[1325,6]]},"459":{"position":[[982,6]]},"461":{"position":[[209,6],[1385,6]]},"462":{"position":[[181,6]]},"463":{"position":[[787,6]]},"464":{"position":[[439,6]]},"465":{"position":[[300,6]]},"466":{"position":[[264,6]]},"467":{"position":[[259,6]]},"571":{"position":[[297,6]]},"659":{"position":[[319,6]]},"749":{"position":[[7361,6],[21563,6]]},"756":{"position":[[342,6]]},"773":{"position":[[638,6]]},"798":{"position":[[941,6]]},"811":{"position":[[412,6]]},"836":{"position":[[705,6]]},"854":{"position":[[1486,6]]},"857":{"position":[[452,6]]},"861":{"position":[[1387,6]]},"872":{"position":[[332,6]]},"875":{"position":[[2242,6]]},"904":{"position":[[3112,6]]},"977":{"position":[[415,6]]},"979":{"position":[[93,6]]},"988":{"position":[[3256,6],[4585,6]]},"990":{"position":[[771,6]]},"1002":{"position":[[824,6]]},"1047":{"position":[[48,6]]},"1065":{"position":[[450,6]]},"1090":{"position":[[1080,6]]},"1100":{"position":[[795,6]]},"1108":{"position":[[231,6]]},"1151":{"position":[[58,6]]},"1178":{"position":[[58,6]]},"1193":{"position":[[78,6]]},"1208":{"position":[[134,6],[404,6]]},"1210":{"position":[[189,6]]},"1211":{"position":[[310,6]]},"1276":{"position":[[156,6]]},"1278":{"position":[[1,6]]}},"keywords":{}}],["notif",{"_index":1128,"title":{},"content":{"140":{"position":[[246,14]]},"168":{"position":[[337,14]]},"299":{"position":[[1375,13]]},"344":{"position":[[128,14]]},"421":{"position":[[287,14]]},"458":{"position":[[1199,12]]},"495":{"position":[[471,13]]},"529":{"position":[[221,13]]},"618":{"position":[[549,13],[642,13]]}},"keywords":{}}],["notifi",{"_index":593,"title":{},"content":{"38":{"position":[[556,6]]},"412":{"position":[[2288,8]]},"490":{"position":[[222,8]]},"496":{"position":[[549,6]]},"515":{"position":[[234,8]]},"649":{"position":[[54,8]]}},"keywords":{}}],["notion",{"_index":2798,"title":{},"content":{"419":{"position":[[146,6],[1840,6]]}},"keywords":{}}],["notori",{"_index":2722,"title":{},"content":{"412":{"position":[[7875,11]]}},"keywords":{}}],["now",{"_index":407,"title":{},"content":{"24":{"position":[[622,3]]},"36":{"position":[[300,3]]},"65":{"position":[[1,3]]},"127":{"position":[[1,3]]},"187":{"position":[[1,3]]},"393":{"position":[[1,3]]},"398":{"position":[[3452,3]]},"402":{"position":[[353,3]]},"404":{"position":[[5,3]]},"408":{"position":[[1060,3]]},"413":{"position":[[4,3]]},"421":{"position":[[550,4]]},"456":{"position":[[1,3]]},"462":{"position":[[1,3]]},"465":{"position":[[1,3]]},"467":{"position":[[1,3]]},"480":{"position":[[933,3]]},"488":{"position":[[1,3]]},"542":{"position":[[654,4]]},"563":{"position":[[764,3]]},"613":{"position":[[639,3]]},"624":{"position":[[1380,3]]},"661":{"position":[[763,3]]},"698":{"position":[[171,3]]},"704":{"position":[[120,3]]},"711":{"position":[[1078,3],[1671,3]]},"736":{"position":[[319,3]]},"737":{"position":[[331,3]]},"749":{"position":[[2634,3]]},"824":{"position":[[9,3]]},"839":{"position":[[132,3],[416,3]]},"862":{"position":[[1,3]]},"872":{"position":[[1380,3],[2144,3],[2908,3]]},"898":{"position":[[1192,5]]},"932":{"position":[[543,3]]},"954":{"position":[[183,3]]},"967":{"position":[[385,3]]},"977":{"position":[[123,3]]},"1039":{"position":[[357,3]]},"1064":{"position":[[252,3]]},"1069":{"position":[[846,3]]},"1085":{"position":[[2991,3]]},"1100":{"position":[[184,3]]},"1296":{"position":[[658,3]]},"1311":{"position":[[1,3]]},"1316":{"position":[[687,3],[1132,3]]},"1318":{"position":[[434,3],[565,3]]},"1324":{"position":[[437,4]]}},"keywords":{}}],["nowaday",{"_index":2630,"title":{},"content":{"411":{"position":[[3745,9]]}},"keywords":{}}],["npm",{"_index":28,"title":{"726":{"position":[[0,4]]},"1274":{"position":[[23,3]]}},"content":{"1":{"position":[[420,3]]},"2":{"position":[[101,3],[131,3]]},"3":{"position":[[109,3]]},"4":{"position":[[275,3]]},"5":{"position":[[191,3]]},"6":{"position":[[258,3],[290,3]]},"7":{"position":[[213,3]]},"8":{"position":[[229,3],[463,3]]},"9":{"position":[[125,3]]},"10":{"position":[[54,3]]},"11":{"position":[[92,3]]},"38":{"position":[[778,4]]},"49":{"position":[[56,4],[62,3]]},"128":{"position":[[120,3],[167,3]]},"188":{"position":[[1738,3],[2246,3]]},"211":{"position":[[15,3]]},"257":{"position":[[1,3]]},"285":{"position":[[201,3]]},"314":{"position":[[252,3]]},"333":{"position":[[29,3],[43,3]]},"420":{"position":[[15,3]]},"438":{"position":[[211,3]]},"537":{"position":[[35,4],[41,3]]},"542":{"position":[[202,3]]},"553":{"position":[[79,3],[96,3]]},"578":{"position":[[58,3],[72,3]]},"597":{"position":[[37,4],[43,3]]},"617":{"position":[[2244,3]]},"659":{"position":[[232,3],[236,3]]},"661":{"position":[[533,3]]},"662":{"position":[[1255,3]]},"666":{"position":[[235,3],[311,3]]},"668":{"position":[[376,3]]},"670":{"position":[[508,3],[540,3]]},"710":{"position":[[1449,3]]},"711":{"position":[[904,3]]},"717":{"position":[[425,3]]},"724":{"position":[[111,3]]},"726":{"position":[[100,3]]},"727":{"position":[[89,3]]},"728":{"position":[[166,3]]},"829":{"position":[[50,3]]},"836":{"position":[[505,3]]},"837":{"position":[[1321,3]]},"838":{"position":[[1786,3]]},"854":{"position":[[33,3]]},"862":{"position":[[156,3]]},"866":{"position":[[29,3]]},"872":{"position":[[123,3]]},"878":{"position":[[64,3]]},"882":{"position":[[45,3]]},"894":{"position":[[15,3]]},"898":{"position":[[25,3]]},"904":{"position":[[2418,3]]},"911":{"position":[[398,3]]},"1097":{"position":[[73,3]]},"1112":{"position":[[59,3]]},"1133":{"position":[[135,3],[150,3],[419,3]]},"1138":{"position":[[69,3]]},"1139":{"position":[[369,3]]},"1145":{"position":[[358,3]]},"1148":{"position":[[458,3]]},"1189":{"position":[[32,3]]},"1272":{"position":[[446,3]]},"1274":{"position":[[202,3]]},"1276":{"position":[[599,3]]},"1277":{"position":[[39,3]]},"1279":{"position":[[30,3]]}},"keywords":{}}],["nr",{"_index":2928,"title":{},"content":{"439":{"position":[[710,4],[810,4]]}},"keywords":{}}],["nuanc",{"_index":2806,"title":{},"content":{"419":{"position":[[1150,7]]}},"keywords":{}}],["null",{"_index":4442,"title":{"887":{"position":[[13,4]]}},"content":{"751":{"position":[[408,5],[1983,5]]},"810":{"position":[[169,4]]},"829":{"position":[[1598,5]]},"875":{"position":[[4587,4]]},"886":{"position":[[3075,4]]},"887":{"position":[[52,4],[207,4],[540,4],[635,5]]},"898":{"position":[[1017,5],[1053,5],[1131,5],[1202,4],[4245,4],[4392,4]]},"919":{"position":[[44,4]]},"983":{"position":[[229,5]]},"988":{"position":[[3191,5]]},"1016":{"position":[[91,4]]},"1017":{"position":[[70,4],[234,4]]},"1049":{"position":[[96,5]]},"1056":{"position":[[49,4]]},"1057":{"position":[[375,4]]}},"keywords":{}}],["nullabl",{"_index":5219,"title":{},"content":{"898":{"position":[[3545,8],[4197,8],[4254,8]]}},"keywords":{}}],["number",{"_index":1219,"title":{},"content":{"174":{"position":[[1662,6]]},"314":{"position":[[867,8]]},"334":{"position":[[747,8]]},"390":{"position":[[544,8]]},"391":{"position":[[882,8]]},"392":{"position":[[4989,6]]},"393":{"position":[[800,7]]},"394":{"position":[[1440,6]]},"395":{"position":[[478,8]]},"396":{"position":[[301,6],[1187,6]]},"397":{"position":[[1697,10]]},"398":{"position":[[739,9],[1980,9],[2943,6]]},"402":{"position":[[245,7],[491,8],[2613,7]]},"411":{"position":[[334,6]]},"420":{"position":[[408,7]]},"424":{"position":[[230,8]]},"459":{"position":[[1095,8],[1156,7]]},"496":{"position":[[228,7]]},"579":{"position":[[761,8]]},"617":{"position":[[392,6],[526,6],[774,6]]},"620":{"position":[[251,8]]},"623":{"position":[[33,6]]},"639":{"position":[[529,8]]},"662":{"position":[[2521,8]]},"680":{"position":[[927,9]]},"724":{"position":[[1161,7]]},"736":{"position":[[110,7]]},"749":{"position":[[7425,8],[17798,6],[20566,6],[21375,8],[23903,6]]},"751":{"position":[[99,6]]},"821":{"position":[[783,6]]},"838":{"position":[[2735,8]]},"879":{"position":[[138,6]]},"898":{"position":[[2630,8]]},"902":{"position":[[285,6]]},"926":{"position":[[45,7]]},"928":{"position":[[14,6],[42,7]]},"1067":{"position":[[483,6]]},"1074":{"position":[[94,6],[340,6]]},"1076":{"position":[[24,7]]},"1079":{"position":[[148,7]]},"1080":{"position":[[466,9],[479,6],[697,8]]},"1125":{"position":[[751,6]]},"1149":{"position":[[1188,8]]},"1194":{"position":[[1057,6]]},"1257":{"position":[[145,6]]},"1296":{"position":[[718,6]]},"1305":{"position":[[604,6]]},"1311":{"position":[[1736,6]]},"1316":{"position":[[2167,6]]},"1321":{"position":[[316,7]]}},"keywords":{}}],["number/integ",{"_index":4397,"title":{},"content":{"749":{"position":[[20299,14]]}},"keywords":{}}],["numer",{"_index":715,"title":{},"content":{"46":{"position":[[497,8]]},"71":{"position":[[66,8]]},"174":{"position":[[58,8]]},"384":{"position":[[70,8]]},"390":{"position":[[180,9]]},"478":{"position":[[22,8]]},"688":{"position":[[996,7]]},"690":{"position":[[369,8]]}},"keywords":{}}],["nvmrcclone",{"_index":3822,"title":{},"content":{"666":{"position":[[120,11]]}},"keywords":{}}],["nw.j",{"_index":505,"title":{},"content":{"32":{"position":[[67,6]]}},"keywords":{}}],["object",{"_index":572,"title":{"304":{"position":[[31,7]]},"787":{"position":[[0,6]]},"826":{"position":[[28,8]]},"1254":{"position":[[32,8]]}},"content":{"36":{"position":[[200,6]]},"45":{"position":[[139,6]]},"47":{"position":[[685,6]]},"51":{"position":[[379,9]]},"104":{"position":[[131,7]]},"174":{"position":[[626,7],[838,7]]},"188":{"position":[[1256,9]]},"209":{"position":[[443,9]]},"211":{"position":[[423,9]]},"231":{"position":[[170,8]]},"255":{"position":[[787,9]]},"259":{"position":[[105,9]]},"303":{"position":[[434,8]]},"304":{"position":[[53,6],[170,7],[497,8]]},"314":{"position":[[753,9]]},"315":{"position":[[729,9]]},"316":{"position":[[238,9]]},"334":{"position":[[142,6],[657,9]]},"350":{"position":[[90,7]]},"352":{"position":[[110,7]]},"367":{"position":[[800,9]]},"392":{"position":[[607,9],[1573,9]]},"426":{"position":[[231,7],[380,6],[474,6]]},"439":{"position":[[599,7]]},"457":{"position":[[233,7],[508,6]]},"462":{"position":[[725,6]]},"480":{"position":[[553,9]]},"482":{"position":[[853,9]]},"533":{"position":[[181,8]]},"538":{"position":[[680,9]]},"554":{"position":[[1344,9]]},"559":{"position":[[1208,7]]},"560":{"position":[[459,8]]},"562":{"position":[[325,9]]},"564":{"position":[[782,9]]},"566":{"position":[[126,6]]},"579":{"position":[[665,9]]},"580":{"position":[[167,8]]},"593":{"position":[[181,8]]},"598":{"position":[[687,9]]},"632":{"position":[[1537,9]]},"638":{"position":[[621,9]]},"639":{"position":[[399,9]]},"662":{"position":[[2400,9]]},"680":{"position":[[847,9]]},"717":{"position":[[1456,9]]},"720":{"position":[[155,9]]},"734":{"position":[[721,9]]},"746":{"position":[[221,6]]},"749":{"position":[[1490,6],[3039,7],[3878,6],[4055,7],[4181,6],[4410,6],[4661,6],[7882,6],[12013,6],[12129,7],[19713,6],[22150,6]]},"751":{"position":[[156,6]]},"754":{"position":[[464,6]]},"767":{"position":[[34,6]]},"789":{"position":[[41,6],[85,6]]},"805":{"position":[[145,6]]},"806":{"position":[[131,7]]},"808":{"position":[[570,9]]},"812":{"position":[[93,9],[159,9]]},"813":{"position":[[93,9]]},"825":{"position":[[74,8]]},"826":{"position":[[191,7],[320,7]]},"829":{"position":[[3159,6]]},"838":{"position":[[2614,9]]},"839":{"position":[[233,6]]},"841":{"position":[[206,6],[403,6],[1491,6]]},"854":{"position":[[892,6]]},"862":{"position":[[687,9]]},"872":{"position":[[1904,9],[4134,9]]},"886":{"position":[[178,6],[264,8],[1357,6]]},"889":{"position":[[709,6]]},"898":{"position":[[2484,9]]},"904":{"position":[[876,9]]},"916":{"position":[[73,6],[162,9]]},"932":{"position":[[1214,9]]},"934":{"position":[[57,6]]},"937":{"position":[[118,7]]},"944":{"position":[[136,6],[668,7]]},"945":{"position":[[77,6]]},"955":{"position":[[26,6]]},"957":{"position":[[27,6]]},"958":{"position":[[304,6]]},"976":{"position":[[22,6]]},"978":{"position":[[27,6]]},"990":{"position":[[732,7]]},"1004":{"position":[[307,6]]},"1051":{"position":[[43,7],[81,7]]},"1052":{"position":[[44,6]]},"1053":{"position":[[27,6]]},"1065":{"position":[[202,6]]},"1069":{"position":[[258,6],[330,6],[534,7]]},"1070":{"position":[[27,6]]},"1074":{"position":[[526,7]]},"1078":{"position":[[500,9]]},"1080":{"position":[[123,9],[660,9]]},"1082":{"position":[[208,9]]},"1083":{"position":[[408,9]]},"1084":{"position":[[41,7]]},"1085":{"position":[[532,6],[1555,7]]},"1104":{"position":[[299,6]]},"1114":{"position":[[423,7]]},"1116":{"position":[[80,6],[135,6]]},"1140":{"position":[[409,6]]},"1149":{"position":[[1067,9]]},"1158":{"position":[[395,9]]},"1208":{"position":[[315,7]]},"1213":{"position":[[228,8]]},"1218":{"position":[[131,6]]},"1220":{"position":[[334,6]]},"1274":{"position":[[568,6]]},"1279":{"position":[[955,6]]},"1309":{"position":[[26,6]]},"1311":{"position":[[423,9]]},"1321":{"position":[[1033,7]]}},"keywords":{}}],["object.assign",{"_index":4836,"title":{},"content":{"848":{"position":[[303,17]]}},"keywords":{}}],["object.defineproperty(rxdocu",{"_index":4559,"title":{},"content":{"770":{"position":[[366,33]]}},"keywords":{}}],["object.entries(doc).foreach(([k",{"_index":5151,"title":{},"content":{"887":{"position":[[580,32]]}},"keywords":{}}],["object.keys(activereplications).foreach(cid",{"_index":5578,"title":{},"content":{"1007":{"position":[[2152,43]]}},"keywords":{}}],["object/key",{"_index":6188,"title":{},"content":{"1206":{"position":[[235,10]]}},"keywords":{}}],["objectid",{"_index":4434,"title":{},"content":{"749":{"position":[[23891,8]]}},"keywords":{}}],["objects"",{"_index":1481,"title":{},"content":{"244":{"position":[[234,13]]}},"keywords":{}}],["objects.avoid",{"_index":2008,"title":{},"content":{"353":{"position":[[332,13]]}},"keywords":{}}],["objectstor",{"_index":2996,"title":{},"content":{"459":{"position":[[683,11]]}},"keywords":{}}],["objectstore.index('priceindex",{"_index":2998,"title":{},"content":{"459":{"position":[[748,32]]}},"keywords":{}}],["object—perhap",{"_index":1995,"title":{},"content":{"351":{"position":[[285,14]]}},"keywords":{}}],["objpath",{"_index":4315,"title":{},"content":{"749":{"position":[[13778,7]]}},"keywords":{}}],["observ",{"_index":183,"title":{"54":{"position":[[10,11]]},"75":{"position":[[0,10]]},"77":{"position":[[0,10]]},"78":{"position":[[10,8]]},"103":{"position":[[0,10]]},"106":{"position":[[0,10]]},"108":{"position":[[10,8]]},"124":{"position":[[0,10]]},"130":{"position":[[30,7]]},"144":{"position":[[54,12]]},"159":{"position":[[0,10]]},"185":{"position":[[0,10]]},"233":{"position":[[0,10]]},"234":{"position":[[10,8]]},"235":{"position":[[0,10]]},"275":{"position":[[0,10]]},"277":{"position":[[6,7]]},"329":{"position":[[0,10]]},"518":{"position":[[0,10]]},"541":{"position":[[10,11]]},"562":{"position":[[19,14]]},"563":{"position":[[40,12]]},"580":{"position":[[24,12]]},"585":{"position":[[0,10]]},"601":{"position":[[11,11]]},"822":{"position":[[59,11]]},"941":{"position":[[0,7]]},"970":{"position":[[0,7]]},"985":{"position":[[6,12]]},"993":{"position":[[0,11]]},"1046":{"position":[[0,7]]},"1058":{"position":[[0,7]]},"1117":{"position":[[0,14]]}},"content":{"13":{"position":[[12,11]]},"16":{"position":[[545,10]]},"33":{"position":[[236,10]]},"38":{"position":[[499,7]]},"47":{"position":[[703,10]]},"50":{"position":[[19,11],[236,11],[413,10]]},"55":{"position":[[127,11],[1064,11]]},"75":{"position":[[28,7]]},"77":{"position":[[20,10]]},"103":{"position":[[15,10]]},"106":{"position":[[13,9]]},"108":{"position":[[52,8]]},"121":{"position":[[78,11]]},"124":{"position":[[60,10],[203,10]]},"126":{"position":[[262,11]]},"129":{"position":[[125,12],[410,12],[540,11]]},"130":{"position":[[76,11],[195,7]]},"143":{"position":[[54,11],[176,12],[343,12]]},"144":{"position":[[124,12]]},"153":{"position":[[202,11]]},"156":{"position":[[81,11]]},"159":{"position":[[32,10],[113,10]]},"174":{"position":[[163,10],[218,11],[1009,7],[1512,8],[1617,8]]},"182":{"position":[[91,12]]},"185":{"position":[[32,10],[239,10]]},"221":{"position":[[210,7]]},"233":{"position":[[32,10],[69,10]]},"234":{"position":[[16,8]]},"235":{"position":[[15,10],[121,9]]},"275":{"position":[[58,10],[207,11]]},"277":{"position":[[67,11]]},"326":{"position":[[15,11]]},"329":{"position":[[42,10]]},"335":{"position":[[281,10]]},"346":{"position":[[174,12]]},"368":{"position":[[234,10],[280,10]]},"369":{"position":[[1186,8]]},"410":{"position":[[1950,8]]},"411":{"position":[[2704,10],[2845,10]]},"427":{"position":[[1390,7]]},"432":{"position":[[547,14],[798,7],[1144,14]]},"445":{"position":[[1417,12]]},"458":{"position":[[691,7],[729,7],[915,9]]},"480":{"position":[[80,7],[685,7],[777,10]]},"490":{"position":[[29,11]]},"493":{"position":[[51,12]]},"502":{"position":[[603,10],[624,10],[1003,10]]},"510":{"position":[[270,10]]},"514":{"position":[[306,12]]},"518":{"position":[[29,11],[76,10],[119,7],[254,10],[470,10]]},"523":{"position":[[304,7]]},"535":{"position":[[698,10],[743,10],[810,7],[1014,8]]},"540":{"position":[[166,11]]},"541":{"position":[[38,12],[329,10]]},"562":{"position":[[1242,10]]},"563":{"position":[[44,12],[656,12],[888,12]]},"566":{"position":[[420,13],[569,11]]},"571":{"position":[[944,10]]},"580":{"position":[[26,11],[595,10]]},"585":{"position":[[49,11]]},"591":{"position":[[481,11]]},"595":{"position":[[719,10],[764,10],[897,7],[1091,8]]},"601":{"position":[[550,10]]},"602":{"position":[[205,12]]},"626":{"position":[[839,11]]},"632":{"position":[[1790,10]]},"649":{"position":[[36,10]]},"655":{"position":[[243,12]]},"661":{"position":[[1527,7]]},"662":{"position":[[2749,7]]},"698":{"position":[[3194,7]]},"710":{"position":[[2057,7]]},"711":{"position":[[1986,7]]},"749":{"position":[[9539,10],[9664,7],[9764,8],[9852,7],[13885,10],[14009,7]]},"752":{"position":[[912,10]]},"753":{"position":[[41,10]]},"826":{"position":[[5,10],[132,10]]},"828":{"position":[[56,12]]},"831":{"position":[[235,12]]},"836":{"position":[[1326,14],[1404,7]]},"838":{"position":[[423,13],[2963,7]]},"840":{"position":[[185,13]]},"841":{"position":[[488,13]]},"854":{"position":[[1655,7]]},"872":{"position":[[1142,7],[2839,9]]},"875":{"position":[[6688,11],[6947,10],[7589,10],[7706,7],[7800,7],[7848,10]]},"879":{"position":[[392,10]]},"880":{"position":[[204,10]]},"881":{"position":[[214,11]]},"898":{"position":[[744,11],[4024,7]]},"904":{"position":[[3358,7],[3413,7],[3432,10]]},"921":{"position":[[9,10]]},"941":{"position":[[34,10],[187,7]]},"955":{"position":[[102,9]]},"965":{"position":[[150,8],[256,8]]},"970":{"position":[[34,10]]},"976":{"position":[[78,9]]},"983":{"position":[[735,10]]},"984":{"position":[[677,11]]},"985":{"position":[[79,8]]},"988":{"position":[[4103,12],[6103,12]]},"992":{"position":[[98,7]]},"993":{"position":[[4,7],[61,10]]},"995":{"position":[[1268,7],[1770,7]]},"1017":{"position":[[32,10]]},"1018":{"position":[[228,7]]},"1033":{"position":[[129,7]]},"1039":{"position":[[26,10]]},"1040":{"position":[[304,12]]},"1046":{"position":[[34,10]]},"1067":{"position":[[493,7],[2070,7]]},"1071":{"position":[[506,8]]},"1083":{"position":[[130,8]]},"1084":{"position":[[124,7]]},"1102":{"position":[[1184,7]]},"1117":{"position":[[50,7],[85,11],[156,11],[315,10],[359,10],[424,10]]},"1124":{"position":[[753,11],[808,7],[1088,7]]},"1132":{"position":[[897,10]]},"1150":{"position":[[375,8]]},"1218":{"position":[[159,10]]},"1298":{"position":[[392,10]]},"1315":{"position":[[1580,7]]},"1318":{"position":[[333,10]]}},"keywords":{}}],["observable.subscribe(newvalu",{"_index":6000,"title":{},"content":{"1117":{"position":[[435,29]]}},"keywords":{}}],["observables.excel",{"_index":2171,"title":{},"content":{"387":{"position":[[117,21]]}},"keywords":{}}],["obstacl",{"_index":2652,"title":{},"content":{"412":{"position":[[399,9],[494,10]]},"709":{"position":[[338,9]]}},"keywords":{}}],["obtain",{"_index":3324,"title":{},"content":{"542":{"position":[[667,6]]},"550":{"position":[[56,7]]}},"keywords":{}}],["obvious",{"_index":2595,"title":{},"content":{"410":{"position":[[944,10]]}},"keywords":{}}],["occas",{"_index":4103,"title":{},"content":{"740":{"position":[[9,10]]}},"keywords":{}}],["occasion",{"_index":2055,"title":{},"content":{"357":{"position":[[569,12]]},"525":{"position":[[355,12]]},"569":{"position":[[495,10]]},"1192":{"position":[[347,12]]}},"keywords":{}}],["occur",{"_index":1035,"title":{},"content":{"103":{"position":[[100,6]]},"156":{"position":[[166,7]]},"168":{"position":[[243,7]]},"196":{"position":[[71,6]]},"301":{"position":[[254,7]]},"326":{"position":[[227,5]]},"415":{"position":[[193,6]]},"491":{"position":[[1760,6]]},"495":{"position":[[190,5]]},"497":{"position":[[702,6]]},"515":{"position":[[277,6]]},"518":{"position":[[247,6]]},"523":{"position":[[195,6]]},"529":{"position":[[97,6]]},"570":{"position":[[381,6]]},"574":{"position":[[334,6]]},"621":{"position":[[530,5]]},"634":{"position":[[107,5]]},"912":{"position":[[405,7]]},"1033":{"position":[[257,5]]},"1299":{"position":[[286,9]]}},"keywords":{}}],["occurr",{"_index":1657,"title":{},"content":{"282":{"position":[[29,10]]}},"keywords":{}}],["off",{"_index":2422,"title":{},"content":{"398":{"position":[[3139,4]]},"412":{"position":[[116,4],[3961,4]]},"689":{"position":[[87,5]]},"1162":{"position":[[1154,4]]},"1324":{"position":[[796,5]]}},"keywords":{}}],["offer",{"_index":536,"title":{},"content":{"34":{"position":[[398,6]]},"39":{"position":[[173,6]]},"40":{"position":[[634,5]]},"42":{"position":[[109,5]]},"43":{"position":[[492,6],[566,6]]},"47":{"position":[[1277,6]]},"59":{"position":[[124,5]]},"64":{"position":[[31,6]]},"65":{"position":[[1840,6]]},"66":{"position":[[60,6]]},"70":{"position":[[186,5]]},"72":{"position":[[6,6]]},"75":{"position":[[64,8]]},"92":{"position":[[19,5]]},"95":{"position":[[125,5]]},"105":{"position":[[94,5]]},"112":{"position":[[6,6]]},"118":{"position":[[239,6]]},"120":{"position":[[269,6]]},"124":{"position":[[6,6]]},"131":{"position":[[311,6]]},"134":{"position":[[110,6]]},"137":{"position":[[6,6]]},"148":{"position":[[64,8]]},"151":{"position":[[406,6]]},"160":{"position":[[6,6]]},"161":{"position":[[311,6]]},"166":{"position":[[76,6]]},"168":{"position":[[6,6]]},"173":{"position":[[1204,5]]},"174":{"position":[[51,6],[2385,6]]},"175":{"position":[[351,6]]},"179":{"position":[[167,6]]},"186":{"position":[[175,6]]},"189":{"position":[[6,6],[356,6]]},"192":{"position":[[139,5]]},"193":{"position":[[6,6]]},"197":{"position":[[65,6]]},"198":{"position":[[6,6]]},"205":{"position":[[66,6]]},"206":{"position":[[16,6]]},"222":{"position":[[172,5]]},"223":{"position":[[223,5]]},"224":{"position":[[20,5]]},"230":{"position":[[97,6]]},"236":{"position":[[162,6]]},"237":{"position":[[6,6]]},"263":{"position":[[117,6]]},"266":{"position":[[12,6],[57,6]]},"271":{"position":[[136,6]]},"281":{"position":[[283,6]]},"286":{"position":[[215,6]]},"287":{"position":[[158,5],[521,6],[1243,6]]},"289":{"position":[[1053,6]]},"291":{"position":[[6,6]]},"294":{"position":[[61,6]]},"295":{"position":[[44,6]]},"314":{"position":[[200,7]]},"316":{"position":[[41,6]]},"321":{"position":[[527,8]]},"331":{"position":[[174,5]]},"339":{"position":[[56,6]]},"347":{"position":[[358,6]]},"356":{"position":[[145,6]]},"362":{"position":[[1429,6]]},"365":{"position":[[687,8]]},"368":{"position":[[6,6]]},"371":{"position":[[59,6]]},"375":{"position":[[919,8]]},"387":{"position":[[22,7]]},"390":{"position":[[1860,6]]},"403":{"position":[[189,6]]},"418":{"position":[[684,6]]},"420":{"position":[[1512,5]]},"425":{"position":[[117,6]]},"430":{"position":[[20,6],[826,5],[1103,5]]},"433":{"position":[[177,6],[227,6]]},"435":{"position":[[17,8]]},"437":{"position":[[213,6]]},"441":{"position":[[498,5]]},"444":{"position":[[844,8]]},"447":{"position":[[265,6]]},"482":{"position":[[62,6]]},"483":{"position":[[1128,10]]},"485":{"position":[[16,5]]},"491":{"position":[[120,6]]},"500":{"position":[[250,5]]},"501":{"position":[[175,8]]},"504":{"position":[[673,6]]},"507":{"position":[[85,8]]},"510":{"position":[[722,8]]},"514":{"position":[[151,6]]},"519":{"position":[[104,8]]},"520":{"position":[[259,6]]},"521":{"position":[[587,6]]},"524":{"position":[[6,6]]},"525":{"position":[[397,6]]},"535":{"position":[[511,5],[1248,6]]},"538":{"position":[[120,8]]},"542":{"position":[[115,5]]},"544":{"position":[[6,6]]},"546":{"position":[[157,5],[299,8]]},"554":{"position":[[6,6]]},"561":{"position":[[223,6]]},"571":{"position":[[1443,5]]},"591":{"position":[[358,6]]},"595":{"position":[[531,5],[1301,6]]},"598":{"position":[[120,8]]},"602":{"position":[[71,6]]},"604":{"position":[[6,6]]},"606":{"position":[[157,5],[289,8]]},"621":{"position":[[13,6],[727,5]]},"622":{"position":[[425,6]]},"640":{"position":[[326,8]]},"641":{"position":[[290,6]]},"688":{"position":[[276,5]]},"723":{"position":[[2735,8]]},"836":{"position":[[1373,5]]},"838":{"position":[[975,6]]},"860":{"position":[[206,6],[752,6],[1149,8]]},"901":{"position":[[708,6]]},"1072":{"position":[[1493,6],[2042,5]]},"1085":{"position":[[1845,6]]},"1132":{"position":[[418,6]]},"1135":{"position":[[31,5]]},"1147":{"position":[[297,6]]},"1148":{"position":[[73,6]]},"1150":{"position":[[10,6]]},"1206":{"position":[[546,8]]}},"keywords":{}}],["offici",{"_index":882,"title":{},"content":{"61":{"position":[[40,8]]},"84":{"position":[[149,8]]},"114":{"position":[[162,8]]},"149":{"position":[[162,8]]},"175":{"position":[[155,8]]},"241":{"position":[[260,8]]},"255":{"position":[[1667,8]]},"261":{"position":[[545,8]]},"306":{"position":[[38,8]]},"347":{"position":[[162,8],[460,8]]},"362":{"position":[[1233,8],[1531,8]]},"373":{"position":[[260,8]]},"511":{"position":[[162,8]]},"531":{"position":[[162,8]]},"567":{"position":[[178,8]]},"591":{"position":[[162,8],[612,8],[712,8]]},"632":{"position":[[736,8]]},"865":{"position":[[187,8]]},"897":{"position":[[87,8]]},"1148":{"position":[[19,8]]}},"keywords":{}}],["offlin",{"_index":181,"title":{"12":{"position":[[26,7]]},"44":{"position":[[14,7]]},"88":{"position":[[8,7]]},"122":{"position":[[0,7]]},"133":{"position":[[0,7]]},"157":{"position":[[0,7]]},"164":{"position":[[0,7]]},"183":{"position":[[0,7]]},"191":{"position":[[0,7]]},"201":{"position":[[12,7]]},"206":{"position":[[8,7]]},"215":{"position":[[0,7]]},"248":{"position":[[9,7]]},"253":{"position":[[8,7]]},"280":{"position":[[0,7]]},"292":{"position":[[6,8]]},"309":{"position":[[3,7]]},"327":{"position":[[0,7]]},"338":{"position":[[0,7]]},"380":{"position":[[0,7]]},"414":{"position":[[17,7]]},"419":{"position":[[0,7]]},"472":{"position":[[20,7]]},"473":{"position":[[14,7]]},"479":{"position":[[30,7]]},"481":{"position":[[4,7]]},"482":{"position":[[14,7]]},"558":{"position":[[54,7]]},"565":{"position":[[0,7]]},"584":{"position":[[0,7]]},"632":{"position":[[19,7]]},"695":{"position":[[27,7]]},"777":{"position":[[14,7]]},"869":{"position":[[49,7]]},"895":{"position":[[50,7]]},"1314":{"position":[[30,7]]}},"content":{"15":{"position":[[510,7]]},"19":{"position":[[554,7]]},"20":{"position":[[275,8]]},"21":{"position":[[166,7]]},"22":{"position":[[383,7]]},"27":{"position":[[43,7],[281,7],[382,7]]},"35":{"position":[[49,7],[602,7]]},"37":{"position":[[274,7],[322,7],[422,8]]},"39":{"position":[[72,7],[239,7],[310,7]]},"40":{"position":[[787,7]]},"43":{"position":[[731,7]]},"46":{"position":[[1,7],[192,8]]},"61":{"position":[[381,7]]},"65":{"position":[[429,7],[565,8],[1899,7]]},"88":{"position":[[40,7]]},"122":{"position":[[45,7],[133,7]]},"126":{"position":[[129,7]]},"133":{"position":[[41,7],[127,7]]},"148":{"position":[[97,7],[390,7]]},"151":{"position":[[201,7]]},"153":{"position":[[331,7]]},"157":{"position":[[18,7]]},"164":{"position":[[38,7]]},"170":{"position":[[124,7],[203,7]]},"173":{"position":[[1371,7],[1471,8]]},"179":{"position":[[422,7]]},"183":{"position":[[17,7]]},"186":{"position":[[258,7]]},"191":{"position":[[8,7],[134,7]]},"198":{"position":[[90,7]]},"201":{"position":[[260,8]]},"206":{"position":[[28,7],[164,7]]},"212":{"position":[[6,7],[94,7],[175,7]]},"215":{"position":[[66,7]]},"241":{"position":[[491,7]]},"248":{"position":[[176,8]]},"253":{"position":[[27,7],[134,7]]},"262":{"position":[[10,7],[40,7],[70,8]]},"263":{"position":[[131,7]]},"266":{"position":[[230,8]]},"270":{"position":[[127,8]]},"273":{"position":[[310,8]]},"274":{"position":[[338,7]]},"280":{"position":[[95,8],[389,7]]},"292":{"position":[[135,8],[313,7]]},"294":{"position":[[29,7]]},"302":{"position":[[547,7]]},"303":{"position":[[1130,7]]},"305":{"position":[[394,7]]},"306":{"position":[[163,7]]},"309":{"position":[[1,7]]},"312":{"position":[[34,8]]},"313":{"position":[[202,7]]},"318":{"position":[[33,7],[612,7]]},"320":{"position":[[382,8]]},"321":{"position":[[196,7],[566,7]]},"325":{"position":[[244,7]]},"327":{"position":[[56,7]]},"331":{"position":[[356,7]]},"338":{"position":[[8,7],[132,8]]},"346":{"position":[[630,7]]},"359":{"position":[[173,7]]},"360":{"position":[[426,7],[536,8]]},"362":{"position":[[168,7],[845,7]]},"373":{"position":[[506,7]]},"375":{"position":[[51,7],[187,7],[1000,8]]},"378":{"position":[[32,7],[230,7]]},"380":{"position":[[53,7],[287,7]]},"384":{"position":[[297,7]]},"388":{"position":[[414,7]]},"407":{"position":[[464,7],[1034,7]]},"408":{"position":[[4640,7],[5491,8]]},"410":{"position":[[924,7],[974,7]]},"411":{"position":[[470,7],[2079,7],[4153,7],[5495,7],[5706,7]]},"412":{"position":[[646,7],[1506,7],[2248,7],[3006,7],[3169,8],[6137,7],[6203,7],[8009,7],[8675,7],[11448,7],[13885,7]]},"416":{"position":[[179,8]]},"418":{"position":[[55,7],[368,7],[582,7]]},"419":{"position":[[22,7],[201,7],[569,7],[612,7],[740,7],[852,7],[1075,7]]},"420":{"position":[[785,7],[1202,7],[1495,7]]},"421":{"position":[[804,8],[1014,8]]},"422":{"position":[[130,7]]},"444":{"position":[[306,7],[519,7],[871,7]]},"445":{"position":[[270,7],[402,7],[491,7]]},"446":{"position":[[1,7],[91,7],[346,7]]},"447":{"position":[[112,7]]},"473":{"position":[[1,7]]},"474":{"position":[[99,7]]},"475":{"position":[[66,7]]},"476":{"position":[[281,7]]},"477":{"position":[[127,7]]},"478":{"position":[[137,7]]},"479":{"position":[[126,7],[518,7]]},"480":{"position":[[334,7],[981,8]]},"481":{"position":[[176,7]]},"482":{"position":[[1243,7]]},"483":{"position":[[16,7],[216,7],[467,7],[678,7],[713,7],[735,7],[1155,7]]},"486":{"position":[[222,7],[304,8]]},"489":{"position":[[592,7]]},"491":{"position":[[431,7],[1111,7],[1143,7],[1382,8]]},"495":{"position":[[119,7]]},"497":{"position":[[189,7]]},"498":{"position":[[485,7]]},"500":{"position":[[187,8],[678,7]]},"502":{"position":[[448,8]]},"504":{"position":[[288,7]]},"510":{"position":[[386,7]]},"513":{"position":[[295,7]]},"516":{"position":[[95,7]]},"525":{"position":[[5,7],[153,7]]},"526":{"position":[[273,7]]},"530":{"position":[[380,7]]},"533":{"position":[[293,7]]},"534":{"position":[[172,7]]},"548":{"position":[[228,7]]},"559":{"position":[[1312,7],[1663,7]]},"561":{"position":[[74,7]]},"562":{"position":[[1015,7]]},"565":{"position":[[172,7]]},"566":{"position":[[1047,7],[1206,7]]},"567":{"position":[[96,7],[313,7],[1187,7]]},"574":{"position":[[184,7],[748,7]]},"576":{"position":[[302,7]]},"582":{"position":[[19,7]]},"584":{"position":[[42,7]]},"590":{"position":[[684,7],[718,7]]},"593":{"position":[[293,7]]},"594":{"position":[[170,7]]},"608":{"position":[[228,7]]},"610":{"position":[[1259,8]]},"626":{"position":[[46,8]]},"631":{"position":[[56,7]]},"632":{"position":[[565,8],[1897,8]]},"635":{"position":[[101,8]]},"644":{"position":[[499,7]]},"690":{"position":[[275,7]]},"696":{"position":[[23,7]]},"698":{"position":[[73,8],[393,7]]},"699":{"position":[[224,7]]},"700":{"position":[[4,7],[541,8],[847,8],[1022,7]]},"701":{"position":[[7,7]]},"702":{"position":[[490,7]]},"703":{"position":[[29,7],[1286,7]]},"704":{"position":[[182,7]]},"705":{"position":[[108,7],[369,7],[1124,7],[1210,7],[1273,7]]},"723":{"position":[[624,7],[2406,7],[2466,7],[2608,8]]},"778":{"position":[[297,7]]},"779":{"position":[[242,7],[333,7]]},"780":{"position":[[503,7]]},"781":{"position":[[553,7],[644,7]]},"782":{"position":[[222,7]]},"783":{"position":[[517,7]]},"784":{"position":[[351,7]]},"785":{"position":[[434,7]]},"786":{"position":[[80,7]]},"836":{"position":[[1953,7]]},"838":{"position":[[690,7]]},"839":{"position":[[757,7]]},"840":{"position":[[264,7],[343,7],[434,7]]},"841":{"position":[[687,7],[695,7],[833,7],[1445,7],[1565,8]]},"860":{"position":[[213,7],[323,7]]},"861":{"position":[[1625,7]]},"906":{"position":[[376,7]]},"913":{"position":[[136,7]]},"981":{"position":[[432,7],[1289,7],[1349,8]]},"985":{"position":[[442,7]]},"987":{"position":[[99,9],[866,7]]},"988":{"position":[[977,7],[5848,7]]},"995":{"position":[[1098,7]]},"1006":{"position":[[135,7],[274,7]]},"1007":{"position":[[696,7],[1062,7]]},"1009":{"position":[[679,8]]},"1032":{"position":[[74,7],[214,8]]},"1093":{"position":[[269,7]]},"1123":{"position":[[739,7]]},"1258":{"position":[[20,7]]},"1301":{"position":[[525,8]]},"1302":{"position":[[1,7]]},"1304":{"position":[[1097,8],[1534,7],[1783,7],[1859,7]]},"1314":{"position":[[27,7]]},"1316":{"position":[[7,7],[473,7],[518,7],[2685,7]]},"1320":{"position":[[11,7]]}},"keywords":{}}],["offline"",{"_index":1478,"title":{},"content":{"244":{"position":[[145,13]]}},"keywords":{}}],["offline/first",{"_index":4598,"title":{},"content":{"786":{"position":[[124,13]]}},"keywords":{}}],["offload",{"_index":3719,"title":{"642":{"position":[[0,10]]}},"content":{"801":{"position":[[314,10]]}},"keywords":{}}],["ohash",{"_index":5404,"title":{},"content":{"968":{"position":[[396,8]]}},"keywords":{}}],["ok",{"_index":3746,"title":{},"content":{"653":{"position":[[112,3]]},"841":{"position":[[938,2]]},"990":{"position":[[407,2]]},"1317":{"position":[[303,3]]}},"keywords":{}}],["old",{"_index":1765,"title":{},"content":{"299":{"position":[[1711,3]]},"302":{"position":[[514,3]]},"402":{"position":[[1965,4]]},"455":{"position":[[924,3]]},"737":{"position":[[481,3]]},"751":{"position":[[303,3]]},"759":{"position":[[518,3],[718,3],[1140,3]]},"760":{"position":[[72,5],[239,3],[435,3],[514,3],[714,3]]},"773":{"position":[[799,3],[875,3]]},"781":{"position":[[109,3]]},"876":{"position":[[527,3]]},"879":{"position":[[196,3]]},"1009":{"position":[[494,3]]},"1119":{"position":[[276,3]]},"1282":{"position":[[592,3]]},"1294":{"position":[[149,3]]},"1319":{"position":[[257,3]]}},"keywords":{}}],["old"",{"_index":4500,"title":{},"content":{"760":{"position":[[145,10]]}},"keywords":{}}],["old/dist/es/shared/vers",{"_index":4508,"title":{},"content":{"761":{"position":[[628,26]]}},"keywords":{}}],["old/dist/lib/shared/vers",{"_index":4511,"title":{},"content":{"761":{"position":[[750,27]]}},"keywords":{}}],["old/plugins/shar",{"_index":4505,"title":{},"content":{"761":{"position":[[502,20]]}},"keywords":{}}],["old/plugins/storag",{"_index":4488,"title":{},"content":{"759":{"position":[[279,19]]},"760":{"position":[[375,19]]}},"keywords":{}}],["olddata",{"_index":5689,"title":{},"content":{"1042":{"position":[[128,9],[214,8]]}},"keywords":{}}],["olddata.ag",{"_index":5690,"title":{},"content":{"1042":{"position":[[146,11],[160,11]]}},"keywords":{}}],["olddata.nam",{"_index":5691,"title":{},"content":{"1042":{"position":[[177,12]]}},"keywords":{}}],["olddatabasenam",{"_index":4490,"title":{},"content":{"759":{"position":[[620,16]]},"760":{"position":[[616,16]]}},"keywords":{}}],["olddoc",{"_index":4448,"title":{},"content":{"751":{"position":[[707,7],[950,7],[1487,7],[1809,7],[2001,7]]},"752":{"position":[[594,7]]},"754":{"position":[[394,7],[554,7],[776,7]]}},"keywords":{}}],["olddoc._attach",{"_index":4481,"title":{},"content":{"754":{"position":[[163,19],[521,19]]}},"keywords":{}}],["olddoc._attachments.myfile.content_typ",{"_index":4484,"title":{},"content":{"754":{"position":[[726,39]]}},"keywords":{}}],["olddoc._attachments.myfile.data",{"_index":4483,"title":{},"content":{"754":{"position":[[659,31]]}},"keywords":{}}],["olddoc.coordin",{"_index":4452,"title":{},"content":{"751":{"position":[[1292,19]]}},"keywords":{}}],["olddoc.sendercountri",{"_index":4454,"title":{},"content":{"751":{"position":[[1447,20]]}},"keywords":{}}],["olddoc.tim",{"_index":4445,"title":{},"content":{"751":{"position":[[635,11],[878,11],[1737,11]]}},"keywords":{}}],["older",{"_index":493,"title":{},"content":{"30":{"position":[[296,5]]},"299":{"position":[[467,5],[919,5],[1220,5],[1538,5],[1563,5]]},"302":{"position":[[997,5]]},"303":{"position":[[1431,5]]},"402":{"position":[[2423,5]]},"408":{"position":[[548,5]]},"412":{"position":[[9379,5]]},"421":{"position":[[336,5]]},"728":{"position":[[99,5]]},"751":{"position":[[1853,5]]},"756":{"position":[[465,5]]},"816":{"position":[[348,5]]},"849":{"position":[[288,5]]},"949":{"position":[[98,5]]},"954":{"position":[[114,5]]},"1055":{"position":[[162,5]]},"1133":{"position":[[367,5]]},"1198":{"position":[[2192,5]]},"1278":{"position":[[107,6],[630,5]]}},"keywords":{}}],["olderdocu",{"_index":5353,"title":{},"content":{"949":{"position":[[118,14]]}},"keywords":{}}],["oldest",{"_index":247,"title":{},"content":{"15":{"position":[[37,6]]},"420":{"position":[[73,6]]}},"keywords":{}}],["oldstorag",{"_index":4492,"title":{},"content":{"759":{"position":[[658,11]]},"760":{"position":[[654,11]]}},"keywords":{}}],["omit",{"_index":6271,"title":{},"content":{"1226":{"position":[[697,6]]},"1264":{"position":[[577,6]]}},"keywords":{}}],["on",{"_index":246,"title":{"647":{"position":[[0,3]]},"1007":{"position":[[6,3]]},"1267":{"position":[[0,3]]}},"content":{"15":{"position":[[26,3]]},"17":{"position":[[475,3]]},"27":{"position":[[340,3]]},"28":{"position":[[243,3]]},"65":{"position":[[445,3]]},"122":{"position":[[1,3]]},"125":{"position":[[235,3]]},"133":{"position":[[1,3]]},"156":{"position":[[1,3]]},"160":{"position":[[149,3]]},"182":{"position":[[1,3]]},"190":{"position":[[1,3]]},"192":{"position":[[189,3]]},"207":{"position":[[1,3]]},"211":{"position":[[543,3]]},"215":{"position":[[1,3]]},"265":{"position":[[1,3]]},"275":{"position":[[1,3]]},"280":{"position":[[1,3]]},"300":{"position":[[461,5]]},"304":{"position":[[150,3]]},"327":{"position":[[1,3]]},"336":{"position":[[74,5]]},"346":{"position":[[60,3]]},"383":{"position":[[1,3]]},"390":{"position":[[1084,3]]},"392":{"position":[[3707,3],[3818,3],[4685,3],[5086,3]]},"395":{"position":[[547,3]]},"398":{"position":[[291,4]]},"402":{"position":[[2434,3]]},"404":{"position":[[908,3]]},"408":{"position":[[2660,4],[4470,3],[4740,4],[4820,3]]},"411":{"position":[[2724,3],[4351,3],[4494,3],[4634,3],[5366,3]]},"412":{"position":[[3432,3],[5766,3],[5792,3],[5932,3],[12396,3],[12543,3]]},"414":{"position":[[124,4]]},"420":{"position":[[62,3],[519,3]]},"427":{"position":[[136,3],[1145,3],[1368,3]]},"445":{"position":[[426,3]]},"454":{"position":[[927,3]]},"458":{"position":[[196,3]]},"464":{"position":[[812,3],[1375,3]]},"469":{"position":[[287,3]]},"475":{"position":[[153,3]]},"488":{"position":[[55,3]]},"490":{"position":[[404,3]]},"515":{"position":[[1,3]]},"517":{"position":[[295,3]]},"519":{"position":[[178,3]]},"524":{"position":[[832,3]]},"525":{"position":[[567,3]]},"535":{"position":[[985,3]]},"589":{"position":[[144,3]]},"590":{"position":[[187,3]]},"595":{"position":[[1062,3]]},"612":{"position":[[150,3]]},"617":{"position":[[2000,3],[2269,3]]},"626":{"position":[[673,3]]},"632":{"position":[[1428,3]]},"636":{"position":[[165,3]]},"647":{"position":[[190,3]]},"653":{"position":[[539,3],[1406,3]]},"679":{"position":[[92,5]]},"680":{"position":[[286,4],[1336,3]]},"682":{"position":[[13,3]]},"686":{"position":[[104,4]]},"691":{"position":[[93,3]]},"697":{"position":[[41,3],[309,3]]},"698":{"position":[[844,3],[2732,3]]},"699":{"position":[[77,3],[444,3]]},"700":{"position":[[96,3]]},"701":{"position":[[338,3],[413,4]]},"703":{"position":[[682,3]]},"705":{"position":[[171,5],[301,3]]},"707":{"position":[[310,3]]},"709":{"position":[[371,3],[433,3],[1003,3]]},"710":{"position":[[956,3]]},"723":{"position":[[891,3]]},"737":{"position":[[114,3],[309,3],[415,3],[485,3]]},"740":{"position":[[49,3]]},"749":{"position":[[21777,3]]},"754":{"position":[[494,4]]},"755":{"position":[[93,3]]},"773":{"position":[[1,3]]},"775":{"position":[[232,3]]},"779":{"position":[[175,3],[294,3]]},"784":{"position":[[584,3]]},"808":{"position":[[438,3]]},"815":{"position":[[314,4]]},"817":{"position":[[345,4]]},"818":{"position":[[258,4]]},"845":{"position":[[92,3]]},"846":{"position":[[365,3],[690,3]]},"849":{"position":[[294,5]]},"854":{"position":[[1032,3]]},"860":{"position":[[1167,3]]},"863":{"position":[[372,3]]},"885":{"position":[[2339,3]]},"886":{"position":[[1509,3]]},"902":{"position":[[80,3]]},"905":{"position":[[66,3]]},"906":{"position":[[1156,4]]},"934":{"position":[[11,3]]},"964":{"position":[[42,3]]},"965":{"position":[[19,3]]},"981":{"position":[[1610,3]]},"982":{"position":[[706,3]]},"988":{"position":[[1225,3]]},"989":{"position":[[54,3]]},"1002":{"position":[[903,3]]},"1007":{"position":[[217,3]]},"1009":{"position":[[520,3]]},"1033":{"position":[[1031,3]]},"1056":{"position":[[176,3],[268,3]]},"1058":{"position":[[455,3]]},"1066":{"position":[[97,3]]},"1069":{"position":[[567,3]]},"1083":{"position":[[224,3]]},"1085":{"position":[[3484,3],[3757,3]]},"1090":{"position":[[377,4]]},"1097":{"position":[[438,3]]},"1100":{"position":[[109,3]]},"1108":{"position":[[195,3]]},"1115":{"position":[[217,4],[375,3]]},"1116":{"position":[[189,5]]},"1124":{"position":[[1705,4]]},"1126":{"position":[[167,3]]},"1135":{"position":[[111,3]]},"1149":{"position":[[85,3]]},"1163":{"position":[[379,4]]},"1164":{"position":[[627,3]]},"1192":{"position":[[709,5]]},"1194":{"position":[[561,3],[654,3]]},"1195":{"position":[[166,4]]},"1198":{"position":[[778,4]]},"1215":{"position":[[223,4]]},"1219":{"position":[[143,3]]},"1220":{"position":[[95,3]]},"1267":{"position":[[107,3],[225,3],[318,4],[652,5]]},"1272":{"position":[[342,3],[402,4]]},"1286":{"position":[[59,3]]},"1287":{"position":[[168,3]]},"1295":{"position":[[150,3],[246,3]]},"1300":{"position":[[1,3],[297,3]]},"1301":{"position":[[1,3],[1317,3]]},"1304":{"position":[[886,3],[1308,3]]},"1309":{"position":[[430,4]]},"1313":{"position":[[325,3]]},"1315":{"position":[[1222,3]]},"1316":{"position":[[728,3],[1268,3]]},"1317":{"position":[[259,3]]},"1318":{"position":[[63,3],[1003,3]]},"1321":{"position":[[739,5]]}},"keywords":{}}],["onc",{"_index":490,"title":{"682":{"position":[[32,5]]}},"content":{"30":{"position":[[159,4]]},"35":{"position":[[230,4]]},"46":{"position":[[468,5]]},"52":{"position":[[1,4]]},"128":{"position":[[192,4]]},"164":{"position":[[253,4]]},"191":{"position":[[189,4]]},"206":{"position":[[316,4]]},"255":{"position":[[208,4]]},"315":{"position":[[1088,4]]},"323":{"position":[[286,4]]},"333":{"position":[[199,4]]},"335":{"position":[[1,4]]},"360":{"position":[[597,4]]},"375":{"position":[[269,4]]},"380":{"position":[[179,4]]},"398":{"position":[[1,4]]},"408":{"position":[[2796,4]]},"410":{"position":[[1103,4]]},"411":{"position":[[96,4],[4711,4]]},"414":{"position":[[166,4]]},"416":{"position":[[188,4]]},"419":{"position":[[524,4]]},"434":{"position":[[10,4]]},"445":{"position":[[721,4]]},"446":{"position":[[383,4]]},"461":{"position":[[412,4]]},"466":{"position":[[70,5],[551,4],[567,4]]},"468":{"position":[[615,4]]},"469":{"position":[[583,5]]},"476":{"position":[[235,4]]},"477":{"position":[[177,5]]},"481":{"position":[[190,4]]},"486":{"position":[[354,4]]},"489":{"position":[[814,4]]},"502":{"position":[[563,4]]},"516":{"position":[[251,4]]},"525":{"position":[[203,4]]},"534":{"position":[[480,4]]},"539":{"position":[[1,4]]},"555":{"position":[[1,4]]},"562":{"position":[[641,4]]},"571":{"position":[[729,5]]},"594":{"position":[[478,4]]},"599":{"position":[[1,4]]},"610":{"position":[[411,4]]},"611":{"position":[[471,4]]},"612":{"position":[[479,5]]},"617":{"position":[[1920,5]]},"624":{"position":[[1352,4]]},"630":{"position":[[348,4]]},"632":{"position":[[332,4],[1972,4]]},"636":{"position":[[266,4]]},"647":{"position":[[44,5]]},"682":{"position":[[187,4]]},"693":{"position":[[441,4],[470,4]]},"696":{"position":[[1780,4]]},"698":{"position":[[1541,4]]},"699":{"position":[[471,4]]},"724":{"position":[[1100,5]]},"745":{"position":[[67,4]]},"749":{"position":[[5706,4]]},"780":{"position":[[644,4]]},"782":{"position":[[348,4]]},"783":{"position":[[296,4]]},"784":{"position":[[527,5]]},"799":{"position":[[68,5]]},"829":{"position":[[1211,4],[2025,4]]},"830":{"position":[[280,4]]},"846":{"position":[[1127,5]]},"893":{"position":[[35,4]]},"934":{"position":[[861,4]]},"944":{"position":[[43,5]]},"945":{"position":[[43,5]]},"981":{"position":[[1064,4],[1397,4]]},"988":{"position":[[723,4],[2985,5]]},"1067":{"position":[[427,4],[1935,4]]},"1088":{"position":[[277,5]]},"1117":{"position":[[31,5]]},"1150":{"position":[[283,4]]},"1183":{"position":[[369,4]]},"1192":{"position":[[610,5]]},"1194":{"position":[[1035,4]]},"1230":{"position":[[326,4],[360,4]]},"1267":{"position":[[462,4]]},"1307":{"position":[[317,4]]},"1308":{"position":[[85,4]]},"1321":{"position":[[451,4],[981,4]]}},"keywords":{}}],["once.delet",{"_index":5946,"title":{},"content":{"1102":{"position":[[1331,11]]}},"keywords":{}}],["onchange={",{"_index":3397,"title":{},"content":{"559":{"position":[[627,11]]}},"keywords":{}}],["onclick={fetchmore}>load",{"_index":3282,"title":{},"content":{"523":{"position":[[784,27]]}},"keywords":{}}],["onclos",{"_index":5379,"title":{"956":{"position":[[0,7]]}},"content":{},"keywords":{}}],["oncreate(dexiedatabas",{"_index":6076,"title":{},"content":{"1148":{"position":[[890,23]]}},"keywords":{}}],["one?"",{"_index":2195,"title":{},"content":{"390":{"position":[[738,10]]}},"keywords":{}}],["oneday",{"_index":5515,"title":{},"content":{"995":{"position":[[1848,6],[1993,8]]}},"keywords":{}}],["oneof",{"_index":4032,"title":{},"content":{"718":{"position":[[500,6]]},"752":{"position":[[1135,5]]},"932":{"position":[[1338,5]]}},"keywords":{}}],["onerror",{"_index":1802,"title":{},"content":{"302":{"position":[[423,7]]}},"keywords":{}}],["ongo",{"_index":1317,"title":{},"content":{"204":{"position":[[88,7]]},"386":{"position":[[293,7]]},"624":{"position":[[670,8]]},"648":{"position":[[51,7],[146,7]]},"696":{"position":[[179,7]]},"775":{"position":[[380,7]]},"875":{"position":[[6639,7],[6982,7],[8005,7]]},"885":{"position":[[459,7]]},"886":{"position":[[3310,7],[5048,7]]},"973":{"position":[[24,8]]},"988":{"position":[[642,7]]}},"keywords":{}}],["onlin",{"_index":388,"title":{"413":{"position":[[28,6]]}},"content":{"23":{"position":[[313,6]]},"61":{"position":[[524,6]]},"157":{"position":[[392,7]]},"248":{"position":[[209,7]]},"253":{"position":[[65,6],[217,6]]},"394":{"position":[[1332,6]]},"410":{"position":[[1108,7]]},"412":{"position":[[4198,7],[13998,7]]},"414":{"position":[[171,7]]},"418":{"position":[[239,6]]},"419":{"position":[[352,6]]},"489":{"position":[[832,7]]},"575":{"position":[[392,6]]},"630":{"position":[[394,7]]},"698":{"position":[[96,6]]},"700":{"position":[[814,6],[958,6]]},"838":{"position":[[723,7]]},"898":{"position":[[536,6]]},"904":{"position":[[255,7]]},"981":{"position":[[440,6]]},"984":{"position":[[56,6]]},"985":{"position":[[454,6]]},"987":{"position":[[961,6]]},"988":{"position":[[5865,6]]},"1304":{"position":[[1087,6],[1396,7],[1838,6]]},"1314":{"position":[[577,6]]},"1316":{"position":[[186,6],[484,6]]},"1318":{"position":[[239,6]]}},"keywords":{}}],["only"",{"_index":2851,"title":{},"content":{"421":{"position":[[355,10]]}},"keywords":{}}],["onlyb",{"_index":3010,"title":{},"content":{"460":{"position":[[1171,6]]}},"keywords":{}}],["onmessag",{"_index":2258,"title":{},"content":{"392":{"position":[[3546,9]]}},"keywords":{}}],["onmount",{"_index":3495,"title":{},"content":{"580":{"position":[[313,9]]},"601":{"position":[[391,9]]}},"keywords":{}}],["onmounted(async",{"_index":3496,"title":{},"content":{"580":{"position":[[406,15]]},"601":{"position":[[483,15]]}},"keywords":{}}],["onoperationend",{"_index":4130,"title":{},"content":{"747":{"position":[[225,15]]}},"keywords":{}}],["onoperationerror",{"_index":4131,"title":{},"content":{"747":{"position":[[283,17]]}},"keywords":{}}],["onoperationstart",{"_index":4125,"title":{},"content":{"747":{"position":[[165,17]]}},"keywords":{}}],["onplayermove(neighboringchunkid",{"_index":5576,"title":{},"content":{"1007":{"position":[[2064,33]]}},"keywords":{}}],["onremov",{"_index":5380,"title":{"956":{"position":[[10,11]]}},"content":{},"keywords":{}}],["onstream($head",{"_index":5135,"title":{},"content":{"886":{"position":[[3537,18]]}},"keywords":{}}],["onsuccess",{"_index":1801,"title":{},"content":{"302":{"position":[[411,9]]}},"keywords":{}}],["onto",{"_index":5552,"title":{},"content":{"1004":{"position":[[587,4]]}},"keywords":{}}],["op",{"_index":4154,"title":{},"content":{"749":{"position":[[1684,2]]},"841":{"position":[[484,3]]}},"keywords":{}}],["open",{"_index":311,"title":{"618":{"position":[[25,4]]}},"content":{"18":{"position":[[316,4]]},"22":{"position":[[38,4],[100,4]]},"29":{"position":[[374,4]]},"38":{"position":[[817,4]]},"61":{"position":[[215,4]]},"113":{"position":[[51,4]]},"155":{"position":[[12,4]]},"160":{"position":[[196,4]]},"168":{"position":[[267,5]]},"174":{"position":[[2967,4]]},"177":{"position":[[15,4]]},"284":{"position":[[47,5]]},"323":{"position":[[543,5]]},"386":{"position":[[262,4]]},"392":{"position":[[2187,4]]},"404":{"position":[[299,7]]},"411":{"position":[[991,4],[4053,4],[4974,5]]},"412":{"position":[[2952,4]]},"420":{"position":[[963,4]]},"427":{"position":[[1286,7]]},"454":{"position":[[160,6]]},"458":{"position":[[102,4]]},"463":{"position":[[341,4],[809,7]]},"468":{"position":[[681,6]]},"483":{"position":[[953,4]]},"490":{"position":[[362,4]]},"514":{"position":[[42,4]]},"566":{"position":[[906,4]]},"567":{"position":[[482,4]]},"575":{"position":[[586,4]]},"589":{"position":[[15,4]]},"610":{"position":[[377,4]]},"611":{"position":[[1224,4]]},"612":{"position":[[518,4]]},"614":{"position":[[44,4]]},"617":{"position":[[216,4],[1232,4],[1995,4],[2086,4],[2172,5]]},"618":{"position":[[102,4],[356,4],[773,4]]},"621":{"position":[[618,7]]},"622":{"position":[[483,7]]},"661":{"position":[[503,4]]},"670":{"position":[[563,4]]},"708":{"position":[[461,7]]},"719":{"position":[[100,7]]},"736":{"position":[[176,5],[323,4],[361,4],[525,7]]},"737":{"position":[[262,6]]},"739":{"position":[[157,6]]},"749":{"position":[[9229,4],[12571,4]]},"779":{"position":[[150,4]]},"781":{"position":[[172,6],[402,6]]},"783":{"position":[[58,4],[289,6]]},"835":{"position":[[778,4]]},"836":{"position":[[631,6],[888,4]]},"838":{"position":[[1992,4]]},"839":{"position":[[1071,4]]},"840":{"position":[[686,4]]},"860":{"position":[[23,4]]},"901":{"position":[[57,4]]},"958":{"position":[[520,4]]},"964":{"position":[[238,6]]},"981":{"position":[[1589,7]]},"988":{"position":[[1236,4]]},"1085":{"position":[[1550,4]]},"1088":{"position":[[245,6]]},"1174":{"position":[[207,6],[408,4]]},"1183":{"position":[[85,4],[183,4]]},"1208":{"position":[[1885,4]]},"1231":{"position":[[163,7]]},"1277":{"position":[[294,4]]},"1298":{"position":[[145,4]]},"1301":{"position":[[1304,5]]},"1313":{"position":[[806,4]]}},"keywords":{}}],["open('mydb.sqlit",{"_index":4772,"title":{},"content":{"836":{"position":[[683,20]]}},"keywords":{}}],["openapi",{"_index":2119,"title":{},"content":{"367":{"position":[[647,7]]}},"keywords":{}}],["opencursor",{"_index":6423,"title":{},"content":{"1294":{"position":[[153,12]]}},"keywords":{}}],["opencursorrequest",{"_index":6436,"title":{},"content":{"1294":{"position":[[1454,17]]}},"keywords":{}}],["opencursorrequest.onerror",{"_index":6438,"title":{},"content":{"1294":{"position":[[1506,25]]}},"keywords":{}}],["opencursorrequest.onsuccess",{"_index":6440,"title":{},"content":{"1294":{"position":[[1554,27]]}},"keywords":{}}],["opendatabas",{"_index":6355,"title":{},"content":{"1278":{"position":[[848,12]]}},"keywords":{}}],["openkvpath",{"_index":6020,"title":{},"content":{"1125":{"position":[[581,11]]}},"keywords":{}}],["oper",{"_index":785,"title":{"52":{"position":[[5,11]]},"208":{"position":[[29,9]]},"539":{"position":[[5,11]]},"599":{"position":[[5,11]]},"678":{"position":[[10,11]]},"679":{"position":[[0,10]]},"681":{"position":[[17,11]]},"682":{"position":[[18,10]]},"795":{"position":[[9,11]]},"796":{"position":[[33,9]]},"1048":{"position":[[37,10]]},"1119":{"position":[[16,11]]}},"content":{"52":{"position":[[61,11]]},"63":{"position":[[100,8]]},"66":{"position":[[373,11]]},"96":{"position":[[262,10]]},"104":{"position":[[213,11]]},"129":{"position":[[388,11]]},"133":{"position":[[331,7]]},"162":{"position":[[375,12]]},"164":{"position":[[191,7]]},"172":{"position":[[131,7]]},"181":{"position":[[167,10]]},"205":{"position":[[345,10]]},"216":{"position":[[352,11]]},"224":{"position":[[205,10]]},"228":{"position":[[232,7]]},"236":{"position":[[235,11]]},"265":{"position":[[137,11],[194,10]]},"266":{"position":[[892,11]]},"267":{"position":[[1027,10]]},"270":{"position":[[119,7]]},"273":{"position":[[44,8]]},"287":{"position":[[674,9]]},"292":{"position":[[106,7]]},"302":{"position":[[374,10]]},"318":{"position":[[47,11]]},"354":{"position":[[1311,9]]},"359":{"position":[[22,7]]},"365":{"position":[[287,11]]},"369":{"position":[[1115,10]]},"376":{"position":[[361,10]]},"385":{"position":[[106,10]]},"396":{"position":[[1586,11],[1657,11]]},"399":{"position":[[611,10]]},"400":{"position":[[440,11]]},"402":{"position":[[2215,9],[2363,8]]},"407":{"position":[[443,12]]},"408":{"position":[[5123,11]]},"410":{"position":[[137,11]]},"411":{"position":[[730,11],[1236,9]]},"415":{"position":[[27,10]]},"418":{"position":[[63,9]]},"419":{"position":[[748,9]]},"424":{"position":[[155,8]]},"427":{"position":[[185,8],[243,10],[837,10],[1168,10]]},"430":{"position":[[695,11],[732,10]]},"439":{"position":[[399,10]]},"441":{"position":[[377,11]]},"451":{"position":[[649,10]]},"452":{"position":[[241,11]]},"459":{"position":[[140,10]]},"460":{"position":[[25,11],[1251,10]]},"462":{"position":[[168,11],[955,10]]},"464":{"position":[[745,10]]},"466":{"position":[[37,10],[416,10]]},"469":{"position":[[86,11]]},"470":{"position":[[146,11]]},"474":{"position":[[132,10]]},"486":{"position":[[123,10]]},"489":{"position":[[662,7]]},"497":{"position":[[122,10],[802,10]]},"514":{"position":[[136,11]]},"519":{"position":[[24,7]]},"524":{"position":[[411,11]]},"525":{"position":[[339,9]]},"539":{"position":[[61,11]]},"569":{"position":[[336,9],[939,7],[1367,9],[1558,9]]},"571":{"position":[[388,9],[433,9]]},"588":{"position":[[150,11]]},"599":{"position":[[61,11]]},"618":{"position":[[50,9],[208,9],[405,9]]},"626":{"position":[[653,9]]},"630":{"position":[[650,10]]},"641":{"position":[[23,10]]},"642":{"position":[[49,10],[262,10]]},"661":{"position":[[109,10]]},"678":{"position":[[17,9],[56,10],[112,10],[161,10],[209,8]]},"679":{"position":[[33,9],[151,9],[291,8],[355,10]]},"680":{"position":[[150,10],[1028,10],[1294,9]]},"681":{"position":[[23,10],[116,10],[333,10],[441,9],[583,10],[689,9],[747,9],[886,9]]},"682":{"position":[[22,9],[303,11]]},"683":{"position":[[52,10],[96,9],[120,9],[577,10],[677,9]]},"684":{"position":[[39,9]]},"685":{"position":[[6,10],[218,10],[415,10],[532,10],[665,11]]},"686":{"position":[[322,10],[511,9]]},"687":{"position":[[100,10]]},"688":{"position":[[376,11]]},"689":{"position":[[155,9],[420,10]]},"691":{"position":[[708,11]]},"703":{"position":[[189,9]]},"709":{"position":[[1149,10]]},"710":{"position":[[2397,10]]},"711":{"position":[[161,10],[357,10],[2253,10]]},"714":{"position":[[526,9]]},"723":{"position":[[144,10],[291,11],[399,10],[2580,10]]},"724":{"position":[[1526,10]]},"746":{"position":[[37,10],[116,10],[670,10]]},"747":{"position":[[70,11]]},"749":{"position":[[22586,10],[23526,10]]},"767":{"position":[[633,9]]},"768":{"position":[[633,9]]},"769":{"position":[[592,9]]},"775":{"position":[[730,10]]},"778":{"position":[[321,10]]},"795":{"position":[[20,10],[77,10],[115,11]]},"796":{"position":[[153,9],[324,8],[577,8],[617,8],[985,8],[1027,8],[1275,8],[1416,8]]},"801":{"position":[[156,10],[299,11],[331,10]]},"802":{"position":[[253,11],[346,10],[562,11],[661,7]]},"835":{"position":[[175,9]]},"836":{"position":[[111,10],[1581,9]]},"858":{"position":[[482,9]]},"863":{"position":[[350,10]]},"871":{"position":[[12,8]]},"872":{"position":[[2876,11]]},"875":{"position":[[5886,10],[5931,10],[9191,10]]},"902":{"position":[[645,11]]},"948":{"position":[[26,10],[210,9],[304,11]]},"1031":{"position":[[48,10]]},"1048":{"position":[[79,10],[296,10],[333,10]]},"1067":{"position":[[1179,9],[1249,8],[1409,9]]},"1085":{"position":[[634,10]]},"1090":{"position":[[1257,9]]},"1102":{"position":[[115,11]]},"1119":{"position":[[69,10],[129,10],[227,10],[252,9],[280,11]]},"1121":{"position":[[293,10]]},"1123":{"position":[[526,10]]},"1124":{"position":[[1541,10],[1799,10]]},"1125":{"position":[[616,10],[838,11]]},"1157":{"position":[[237,10]]},"1161":{"position":[[47,10]]},"1164":{"position":[[855,10],[1354,9]]},"1177":{"position":[[12,11]]},"1180":{"position":[[47,10]]},"1185":{"position":[[9,10],[86,9],[212,10]]},"1193":{"position":[[134,11]]},"1198":{"position":[[1045,9]]},"1204":{"position":[[12,11]]},"1206":{"position":[[306,11],[461,10]]},"1213":{"position":[[87,9]]},"1214":{"position":[[995,11]]},"1215":{"position":[[262,9]]},"1246":{"position":[[1380,11]]},"1249":{"position":[[369,8]]},"1250":{"position":[[31,10],[175,10]]},"1253":{"position":[[34,8]]},"1267":{"position":[[412,11]]},"1274":{"position":[[619,11]]},"1279":{"position":[[1006,11]]},"1282":{"position":[[632,11]]},"1295":{"position":[[692,10]]},"1297":{"position":[[333,9]]},"1304":{"position":[[273,10],[1336,10],[1565,9]]},"1305":{"position":[[91,10],[191,11],[713,9],[951,9],[1076,9]]},"1307":{"position":[[42,9],[705,10],[797,10]]},"1309":{"position":[[245,10]]},"1318":{"position":[[789,10]]}},"keywords":{}}],["operation'",{"_index":3205,"title":{},"content":{"497":{"position":[[507,11]]}},"keywords":{}}],["operation.find",{"_index":6163,"title":{},"content":{"1194":{"position":[[400,14]]}},"keywords":{}}],["operationnam",{"_index":5119,"title":{},"content":{"886":{"position":[[783,14],[2507,14]]}},"keywords":{}}],["operations.batch",{"_index":2144,"title":{},"content":{"376":{"position":[[315,19]]}},"keywords":{}}],["operations.fulli",{"_index":3893,"title":{},"content":{"688":{"position":[[802,16]]}},"keywords":{}}],["operations.no",{"_index":4777,"title":{},"content":{"836":{"position":[[1773,13]]}},"keywords":{}}],["operations.nosql",{"_index":5794,"title":{},"content":{"1071":{"position":[[407,16]]}},"keywords":{}}],["operations.onli",{"_index":3087,"title":{},"content":{"468":{"position":[[154,15]]}},"keywords":{}}],["operations.scal",{"_index":3479,"title":{},"content":{"574":{"position":[[484,19]]}},"keywords":{}}],["operations.smal",{"_index":6125,"title":{},"content":{"1167":{"position":[[40,16]]}},"keywords":{}}],["operationsnam",{"_index":4126,"title":{},"content":{"747":{"position":[[183,16],[241,16],[301,16]]}},"keywords":{}}],["operators.difficult",{"_index":3899,"title":{},"content":{"689":{"position":[[306,19]]}},"keywords":{}}],["opf",{"_index":874,"title":{"433":{"position":[[16,7]]},"448":{"position":[[43,4]]},"453":{"position":[[8,5]]},"1205":{"position":[[27,6],[57,4]]},"1206":{"position":[[8,5]]},"1207":{"position":[[0,4]]},"1208":{"position":[[8,4]]},"1209":{"position":[[0,4]]},"1210":{"position":[[6,4]]},"1211":{"position":[[6,4]]},"1214":{"position":[[0,4]]},"1215":{"position":[[73,7]]},"1216":{"position":[[17,6]]},"1244":{"position":[[3,5]]}},"content":{"59":{"position":[[73,7],[164,4]]},"100":{"position":[[275,5]]},"131":{"position":[[371,4],[668,4]]},"161":{"position":[[109,5]]},"162":{"position":[[370,4]]},"227":{"position":[[249,5]]},"266":{"position":[[126,4]]},"287":{"position":[[718,4]]},"402":{"position":[[2769,4]]},"408":{"position":[[1504,7],[1559,7],[1958,5],[3967,5],[4685,4]]},"429":{"position":[[162,5]]},"433":{"position":[[34,4],[222,4],[293,4],[459,4],[527,4],[593,4]]},"453":{"position":[[32,6],[254,4],[465,4],[569,4],[787,4]]},"459":{"position":[[376,4]]},"460":{"position":[[1123,4]]},"461":{"position":[[1487,4]]},"462":{"position":[[903,4]]},"463":{"position":[[441,4],[681,4],[701,4],[958,4],[1031,4]]},"464":{"position":[[329,4],[351,4],[740,4],[1017,4]]},"465":{"position":[[190,4],[212,4]]},"466":{"position":[[155,4],[176,4],[348,4]]},"467":{"position":[[126,4],[149,4],[307,4]]},"468":{"position":[[296,4]]},"469":{"position":[[498,4]]},"524":{"position":[[435,6],[948,4]]},"546":{"position":[[128,7],[197,4],[227,4]]},"581":{"position":[[603,5]]},"606":{"position":[[128,7],[197,4],[227,4]]},"631":{"position":[[168,6]]},"641":{"position":[[285,4]]},"714":{"position":[[400,4]]},"749":{"position":[[3371,4]]},"793":{"position":[[237,4],[1379,4]]},"981":{"position":[[1134,4]]},"1137":{"position":[[99,4],[189,4]]},"1191":{"position":[[339,4]]},"1195":{"position":[[244,4]]},"1206":{"position":[[32,6],[261,4],[398,4]]},"1207":{"position":[[315,4],[444,4]]},"1208":{"position":[[5,4],[1970,4]]},"1209":{"position":[[187,4]]},"1210":{"position":[[5,4],[205,4]]},"1211":{"position":[[401,4],[646,6]]},"1212":{"position":[[358,6]]},"1213":{"position":[[18,4],[655,6]]},"1214":{"position":[[267,4],[737,4],[1043,4]]},"1215":{"position":[[122,7],[395,6],[552,4]]},"1239":{"position":[[197,4]]},"1243":{"position":[[122,4]]},"1244":{"position":[[5,4]]},"1276":{"position":[[150,5],[257,4]]}},"keywords":{}}],["opfs)mobil",{"_index":3119,"title":{},"content":{"479":{"position":[[327,11]]}},"keywords":{}}],["opfs.html?console=opfs#set",{"_index":4179,"title":{},"content":{"749":{"position":[[3495,30]]}},"keywords":{}}],["opfs.in",{"_index":1569,"title":{},"content":{"254":{"position":[[334,7]]}},"keywords":{}}],["opfs.worker.j",{"_index":6227,"title":{},"content":{"1210":{"position":[[127,14]]}},"keywords":{}}],["opportun",{"_index":2968,"title":{},"content":{"454":{"position":[[183,13]]},"529":{"position":[[173,13]]}},"keywords":{}}],["opt",{"_index":1575,"title":{},"content":{"255":{"position":[[239,3]]},"863":{"position":[[909,6]]},"894":{"position":[[141,6]]}},"keywords":{}}],["optim",{"_index":514,"title":{"76":{"position":[[20,9]]},"78":{"position":[[0,9]]},"107":{"position":[[20,9]]},"108":{"position":[[0,9]]},"138":{"position":[[25,13]]},"194":{"position":[[25,13]]},"230":{"position":[[20,9]]},"234":{"position":[[0,9]]},"342":{"position":[[25,13]]},"376":{"position":[[12,13]]},"378":{"position":[[12,9]]},"385":{"position":[[12,13]]},"402":{"position":[[22,14]]},"507":{"position":[[25,13]]},"527":{"position":[[25,13]]},"587":{"position":[[25,13]]},"819":{"position":[[6,9]]},"1153":{"position":[[28,9]]},"1318":{"position":[[6,13]]}},"content":{"33":{"position":[[169,14]]},"70":{"position":[[19,9]]},"76":{"position":[[31,9]]},"83":{"position":[[154,12]]},"98":{"position":[[94,7]]},"100":{"position":[[198,9]]},"106":{"position":[[176,10]]},"107":{"position":[[39,9]]},"108":{"position":[[43,8]]},"111":{"position":[[4,8]]},"117":{"position":[[277,7]]},"138":{"position":[[251,8]]},"141":{"position":[[202,12]]},"146":{"position":[[154,8]]},"166":{"position":[[26,12],[50,7]]},"170":{"position":[[473,8]]},"174":{"position":[[1220,9],[1303,9],[1608,8]]},"189":{"position":[[764,8]]},"194":{"position":[[33,8]]},"197":{"position":[[38,8]]},"228":{"position":[[139,12]]},"229":{"position":[[113,7]]},"230":{"position":[[22,9]]},"234":{"position":[[6,9]]},"277":{"position":[[53,9]]},"298":{"position":[[383,9]]},"318":{"position":[[293,7]]},"334":{"position":[[526,9]]},"346":{"position":[[860,8]]},"362":{"position":[[919,13]]},"366":{"position":[[358,7]]},"369":{"position":[[214,9],[1105,9],[1207,9],[1398,7]]},"376":{"position":[[206,13]]},"390":{"position":[[45,9]]},"393":{"position":[[646,7]]},"396":{"position":[[209,10]]},"397":{"position":[[5,7]]},"398":{"position":[[283,7]]},"402":{"position":[[793,8],[880,7],[1351,7],[2281,8]]},"408":{"position":[[5065,13]]},"411":{"position":[[767,9]]},"412":{"position":[[9425,10]]},"429":{"position":[[527,9]]},"433":{"position":[[147,9]]},"444":{"position":[[143,9]]},"450":{"position":[[646,13]]},"469":{"position":[[548,8],[640,9]]},"479":{"position":[[110,9]]},"483":{"position":[[664,8]]},"504":{"position":[[467,8]]},"507":{"position":[[13,12]]},"508":{"position":[[89,12]]},"513":{"position":[[68,7]]},"524":{"position":[[977,7]]},"527":{"position":[[46,7]]},"544":{"position":[[379,8]]},"556":{"position":[[1039,8]]},"579":{"position":[[535,8]]},"588":{"position":[[6,12]]},"604":{"position":[[313,8]]},"618":{"position":[[477,8]]},"620":{"position":[[641,14],[677,9]]},"630":{"position":[[116,14]]},"640":{"position":[[56,7]]},"656":{"position":[[50,9]]},"723":{"position":[[1697,9]]},"780":{"position":[[492,9]]},"793":{"position":[[585,9],[1200,9]]},"796":{"position":[[70,7]]},"798":{"position":[[85,10],[972,9]]},"801":{"position":[[766,9]]},"820":{"position":[[59,11],[379,9]]},"821":{"position":[[228,12],[337,9],[450,12],[491,9]]},"838":{"position":[[1079,9]]},"871":{"position":[[574,9]]},"965":{"position":[[89,13],[247,8]]},"981":{"position":[[785,9]]},"1005":{"position":[[176,13]]},"1065":{"position":[[1616,14]]},"1066":{"position":[[222,7]]},"1071":{"position":[[439,9]]},"1085":{"position":[[1033,14]]},"1107":{"position":[[193,7]]},"1120":{"position":[[12,9]]},"1132":{"position":[[178,8]]},"1138":{"position":[[451,8]]},"1151":{"position":[[608,9]]},"1154":{"position":[[10,9],[300,11],[441,10]]},"1178":{"position":[[607,9]]},"1206":{"position":[[222,9]]},"1222":{"position":[[672,7],[732,8]]},"1238":{"position":[[76,9],[400,9],[777,11]]},"1239":{"position":[[48,9],[578,11]]},"1246":{"position":[[1613,10],[1657,9],[1788,8]]},"1266":{"position":[[914,13]]},"1271":{"position":[[669,13]]},"1318":{"position":[[99,8],[324,8],[707,13],[936,13]]}},"keywords":{}}],["optimis",{"_index":5785,"title":{},"content":{"1069":{"position":[[66,12]]}},"keywords":{}}],["optimist",{"_index":618,"title":{"484":{"position":[[12,10]]},"485":{"position":[[15,10]]},"486":{"position":[[28,10]]},"488":{"position":[[9,10]]},"489":{"position":[[35,10]]},"492":{"position":[[0,10]]},"495":{"position":[[13,10]]},"497":{"position":[[27,10]]},"634":{"position":[[0,10]]}},"content":{"39":{"position":[[189,10]]},"485":{"position":[[1,10],[160,10]]},"486":{"position":[[187,10]]},"488":{"position":[[26,10]]},"489":{"position":[[37,10]]},"491":{"position":[[34,10],[880,10]]},"495":{"position":[[7,10],[89,10]]},"497":{"position":[[630,10],[745,10]]},"498":{"position":[[34,10],[288,10],[538,10]]},"634":{"position":[[69,10]]},"897":{"position":[[241,10]]}},"keywords":{}}],["optimization.hierarch",{"_index":2341,"title":{},"content":{"396":{"position":[[521,25]]}},"keywords":{}}],["optimizedrxstorag",{"_index":6093,"title":{},"content":{"1154":{"position":[[461,18],[793,18]]}},"keywords":{}}],["option",{"_index":467,"title":{"126":{"position":[[32,8]]},"161":{"position":[[25,8]]},"186":{"position":[[32,8]]},"266":{"position":[[12,8]]},"317":{"position":[[29,8]]},"331":{"position":[[31,8]]},"365":{"position":[[19,7]]},"520":{"position":[[30,8]]},"576":{"position":[[28,8]]},"653":{"position":[[31,8]]},"887":{"position":[[34,8]]},"1164":{"position":[[0,8]]}},"content":{"28":{"position":[[769,6]]},"39":{"position":[[551,7]]},"51":{"position":[[32,8]]},"126":{"position":[[32,7]]},"131":{"position":[[90,7],[623,7],[758,8]]},"161":{"position":[[28,7],[297,8]]},"162":{"position":[[788,6]]},"167":{"position":[[62,7]]},"186":{"position":[[27,7]]},"189":{"position":[[30,8],[95,7],[553,6]]},"202":{"position":[[248,7]]},"236":{"position":[[19,6]]},"261":{"position":[[791,8],[824,8]]},"267":{"position":[[1385,7]]},"278":{"position":[[149,7]]},"284":{"position":[[231,8]]},"287":{"position":[[328,8],[568,6]]},"295":{"position":[[180,6]]},"302":{"position":[[979,10]]},"310":{"position":[[353,7]]},"312":{"position":[[78,8]]},"318":{"position":[[80,8]]},"334":{"position":[[434,8]]},"360":{"position":[[630,8]]},"361":{"position":[[314,8]]},"362":{"position":[[884,8]]},"365":{"position":[[94,7],[229,6]]},"377":{"position":[[186,7]]},"408":{"position":[[317,7]]},"429":{"position":[[459,7]]},"430":{"position":[[1095,7]]},"433":{"position":[[20,6]]},"441":{"position":[[593,8]]},"458":{"position":[[1053,6]]},"489":{"position":[[236,7]]},"504":{"position":[[703,8]]},"507":{"position":[[103,7]]},"520":{"position":[[28,7]]},"522":{"position":[[563,10],[618,10],[684,10],[760,10]]},"524":{"position":[[193,7]]},"538":{"position":[[32,8]]},"566":{"position":[[178,8],[381,8]]},"579":{"position":[[443,8]]},"581":{"position":[[629,6]]},"598":{"position":[[32,8]]},"612":{"position":[[1624,8]]},"614":{"position":[[813,7]]},"619":{"position":[[395,7]]},"624":{"position":[[182,6],[1310,6]]},"632":{"position":[[1370,9]]},"655":{"position":[[277,6]]},"660":{"position":[[478,7]]},"661":{"position":[[255,8]]},"680":{"position":[[197,7],[784,7],[1086,7]]},"696":{"position":[[801,7]]},"710":{"position":[[469,7],[973,8]]},"724":{"position":[[1055,10],[1175,10],[1404,10],[1471,7],[1693,7],[1778,7]]},"749":{"position":[[22629,7]]},"772":{"position":[[1872,6]]},"773":{"position":[[330,6]]},"806":{"position":[[424,7],[480,7],[630,8],[676,7],[741,7]]},"825":{"position":[[280,6]]},"837":{"position":[[1003,7]]},"841":{"position":[[386,8],[1193,8]]},"846":{"position":[[597,10],[709,10],[820,10],[1027,10],[1135,10],[1255,10]]},"848":{"position":[[206,8],[247,7],[321,9],[584,8]]},"854":{"position":[[904,8],[1091,10]]},"855":{"position":[[321,8]]},"858":{"position":[[147,8]]},"862":{"position":[[1465,7]]},"867":{"position":[[316,8]]},"875":{"position":[[3848,8]]},"886":{"position":[[1235,10],[1332,10],[1890,7],[2855,10],[2974,10],[4345,7]]},"887":{"position":[[31,8],[134,8],[486,8]]},"890":{"position":[[939,8]]},"894":{"position":[[47,8],[159,8]]},"898":{"position":[[1934,8],[3484,9],[3611,9],[3899,8],[4013,10],[4316,8]]},"904":{"position":[[1513,7]]},"905":{"position":[[197,6]]},"911":{"position":[[157,6]]},"934":{"position":[[192,9],[327,10],[388,10],[447,10],[488,8],[504,10],[591,10],[624,10],[691,10],[767,10]]},"960":{"position":[[392,8],[458,10],[513,10],[579,10],[655,10]]},"986":{"position":[[1542,7]]},"988":{"position":[[816,11],[1040,11],[1608,11],[2294,9],[2910,8],[3353,10],[3396,9],[4682,10]]},"1065":{"position":[[530,8],[1336,9]]},"1072":{"position":[[2704,9]]},"1102":{"position":[[838,10]]},"1125":{"position":[[412,10],[556,10],[714,10]]},"1134":{"position":[[477,10],[741,10]]},"1148":{"position":[[1061,8]]},"1151":{"position":[[589,8]]},"1157":{"position":[[439,6]]},"1164":{"position":[[6,7],[272,10],[782,10],[1487,10]]},"1172":{"position":[[455,7]]},"1175":{"position":[[53,6]]},"1178":{"position":[[588,8]]},"1198":{"position":[[2087,8]]},"1201":{"position":[[285,7]]},"1222":{"position":[[447,7],[488,7]]},"1226":{"position":[[611,10],[622,7]]},"1231":{"position":[[120,6]]},"1249":{"position":[[347,6]]},"1264":{"position":[[491,10],[502,7]]},"1266":{"position":[[818,8]]},"1270":{"position":[[303,6]]},"1282":{"position":[[1028,7]]},"1292":{"position":[[60,7]]},"1313":{"position":[[766,6]]}},"keywords":{}}],["option.opf",{"_index":1182,"title":{},"content":{"162":{"position":[[347,11]]}},"keywords":{}}],["option.send",{"_index":3098,"title":{},"content":{"470":{"position":[[361,14]]}},"keywords":{}}],["optional)if",{"_index":5390,"title":{},"content":{"963":{"position":[[1,12]]}},"keywords":{}}],["optional."",{"_index":2800,"title":{},"content":{"419":{"position":[[362,15]]}},"keywords":{}}],["optional=fals",{"_index":5393,"title":{},"content":{"965":{"position":[[1,16]]},"967":{"position":[[1,16]]}},"keywords":{}}],["optional=false)if",{"_index":5395,"title":{},"content":{"966":{"position":[[1,18]]}},"keywords":{}}],["optional=true)when",{"_index":5391,"title":{},"content":{"964":{"position":[[1,19]]}},"keywords":{}}],["options.storag",{"_index":2164,"title":{},"content":{"383":{"position":[[299,15]]}},"keywords":{}}],["optionswithauth",{"_index":4835,"title":{},"content":{"848":{"position":[[285,15],[612,15]]}},"keywords":{}}],["optionswithauth.head",{"_index":4838,"title":{},"content":{"848":{"position":[[400,23]]}},"keywords":{}}],["optionswithauth.headers['author",{"_index":4839,"title":{},"content":{"848":{"position":[[463,40]]}},"keywords":{}}],["opts.wrtc",{"_index":5273,"title":{},"content":{"911":{"position":[[147,9]]}},"keywords":{}}],["or/and",{"_index":327,"title":{},"content":{"19":{"position":[[369,6]]}},"keywords":{}}],["orchestr",{"_index":5254,"title":{},"content":{"903":{"position":[[696,13]]},"1319":{"position":[[575,11]]}},"keywords":{}}],["order",{"_index":2321,"title":{"798":{"position":[[14,8]]}},"content":{"394":{"position":[[1040,5],[1139,5],[1233,7]]},"400":{"position":[[259,6]]},"402":{"position":[[786,6]]},"404":{"position":[[787,7]]},"408":{"position":[[1080,5]]},"569":{"position":[[568,5]]},"613":{"position":[[334,6]]},"683":{"position":[[518,6]]},"749":{"position":[[9577,5],[13923,5]]},"798":{"position":[[5,5],[138,6]]},"858":{"position":[[588,8]]},"898":{"position":[[3799,8]]},"951":{"position":[[529,5]]},"986":{"position":[[225,6]]},"1065":{"position":[[1719,5],[1760,5],[1810,9],[2029,5]]},"1079":{"position":[[574,5]]},"1316":{"position":[[1850,5],[2344,5],[2409,6]]}},"keywords":{}}],["ordering.push",{"_index":5188,"title":{},"content":{"897":{"position":[[203,15]]}},"keywords":{}}],["oren",{"_index":6482,"title":{},"content":{"1302":{"position":[[169,4]]}},"keywords":{}}],["organ",{"_index":1235,"title":{},"content":{"178":{"position":[[257,10]]},"395":{"position":[[294,9]]},"412":{"position":[[1388,14]]},"1132":{"position":[[471,10]]},"1140":{"position":[[53,8]]}},"keywords":{}}],["orient",{"_index":377,"title":{"350":{"position":[[9,8]]}},"content":{"23":{"position":[[45,8]]},"32":{"position":[[112,8]]},"353":{"position":[[756,8]]},"412":{"position":[[13493,8],[14404,8]]},"419":{"position":[[1377,8]]}},"keywords":{}}],["origin",{"_index":287,"title":{"1205":{"position":[[0,6]]},"1215":{"position":[[46,6]]}},"content":{"17":{"position":[[76,10]]},"24":{"position":[[523,10]]},"25":{"position":[[11,11]]},"26":{"position":[[101,10]]},"36":{"position":[[1,10]]},"47":{"position":[[111,10]]},"59":{"position":[[46,6]]},"298":{"position":[[316,7]]},"299":{"position":[[283,6],[608,6]]},"300":{"position":[[208,7]]},"303":{"position":[[71,6],[1306,6]]},"305":{"position":[[101,6]]},"408":{"position":[[1018,6],[1189,6],[1532,6]]},"409":{"position":[[122,10]]},"411":{"position":[[4239,7]]},"419":{"position":[[1066,8]]},"433":{"position":[[96,6]]},"453":{"position":[[5,6]]},"461":{"position":[[731,7]]},"546":{"position":[[101,6]]},"595":{"position":[[153,10]]},"606":{"position":[[101,6]]},"640":{"position":[[168,7]]},"696":{"position":[[1356,7]]},"779":{"position":[[453,7]]},"835":{"position":[[554,10]]},"839":{"position":[[88,10]]},"848":{"position":[[544,8]]},"888":{"position":[[656,7]]},"890":{"position":[[428,6],[671,7]]},"990":{"position":[[856,8]]},"1069":{"position":[[241,8]]},"1140":{"position":[[282,7]]},"1154":{"position":[[413,8]]},"1206":{"position":[[5,6],[141,6]]},"1207":{"position":[[33,6]]},"1209":{"position":[[13,6]]},"1214":{"position":[[1,6]]},"1215":{"position":[[95,6]]},"1216":{"position":[[34,6]]},"1222":{"position":[[178,8]]},"1225":{"position":[[58,8]]},"1246":{"position":[[1729,8]]}},"keywords":{}}],["origin'",{"_index":2896,"title":{},"content":{"427":{"position":[[1535,8]]},"1208":{"position":[[672,8]]}},"keywords":{}}],["origin==='handl",{"_index":5157,"title":{},"content":{"888":{"position":[[797,19]]}},"keywords":{}}],["orion",{"_index":6378,"title":{},"content":{"1284":{"position":[[156,5]]}},"keywords":{}}],["orion.rxdb",{"_index":6380,"title":{},"content":{"1284":{"position":[[195,10]]}},"keywords":{}}],["orm",{"_index":4620,"title":{"937":{"position":[[0,3]]}},"content":{"793":{"position":[[1155,3]]},"838":{"position":[[3406,3]]},"934":{"position":[[338,3],[399,3],[458,3]]},"937":{"position":[[70,3]]},"1085":{"position":[[2154,3],[2195,3]]},"1311":{"position":[[1643,3],[1691,3]]}},"keywords":{}}],["orm/drm",{"_index":5321,"title":{},"content":{"937":{"position":[[162,8]]}},"keywords":{}}],["orqueri",{"_index":4637,"title":{},"content":{"796":{"position":[[422,7]]}},"keywords":{}}],["orwait",{"_index":5657,"title":{},"content":{"1033":{"position":[[332,6]]}},"keywords":{}}],["os",{"_index":1874,"title":{},"content":{"305":{"position":[[483,2]]},"412":{"position":[[8602,2]]},"703":{"position":[[571,2]]},"836":{"position":[[808,3]]},"1270":{"position":[[401,2]]}},"keywords":{}}],["other",{"_index":1081,"title":{"657":{"position":[[38,6]]}},"content":{"125":{"position":[[272,7]]},"298":{"position":[[190,7],[261,6]]},"356":{"position":[[899,6]]},"365":{"position":[[1088,7]]},"399":{"position":[[281,6]]},"400":{"position":[[207,7]]},"411":{"position":[[5585,6]]},"412":{"position":[[6554,6]]},"458":{"position":[[813,6]]},"490":{"position":[[439,7]]},"517":{"position":[[333,7]]},"589":{"position":[[181,7]]},"618":{"position":[[162,7]]},"698":{"position":[[2554,6]]},"709":{"position":[[570,6]]},"824":{"position":[[258,7]]},"1071":{"position":[[90,7]]},"1100":{"position":[[278,6]]},"1208":{"position":[[1874,6]]}},"keywords":{}}],["other.cli",{"_index":6488,"title":{},"content":{"1304":{"position":[[1742,13]]}},"keywords":{}}],["other.find",{"_index":6165,"title":{},"content":{"1194":{"position":[[576,10]]}},"keywords":{}}],["othernumb",{"_index":5775,"title":{},"content":{"1067":{"position":[[1487,15],[1602,12]]}},"keywords":{}}],["others.miss",{"_index":3300,"title":{},"content":{"535":{"position":[[1031,14]]},"595":{"position":[[1108,14]]}},"keywords":{}}],["otherstuff.json",{"_index":4665,"title":{},"content":{"800":{"position":[[905,18]]}},"keywords":{}}],["otherwis",{"_index":2000,"title":{},"content":{"352":{"position":[[151,9]]},"412":{"position":[[1761,10]]},"587":{"position":[[172,9]]},"875":{"position":[[4055,9]]},"886":{"position":[[1396,10]]},"946":{"position":[[66,9]]},"1108":{"position":[[653,9]]},"1235":{"position":[[449,9]]}},"keywords":{}}],["out",{"_index":398,"title":{"626":{"position":[[18,3]]},"742":{"position":[[7,4]]}},"content":{"24":{"position":[[136,3],[594,3]]},"40":{"position":[[272,3]]},"84":{"position":[[85,3]]},"102":{"position":[[13,3]]},"114":{"position":[[98,3]]},"125":{"position":[[15,3]]},"126":{"position":[[88,3]]},"144":{"position":[[88,3]]},"149":{"position":[[98,3]]},"161":{"position":[[189,3]]},"188":{"position":[[2505,3]]},"212":{"position":[[122,3]]},"255":{"position":[[1623,3]]},"263":{"position":[[386,3]]},"296":{"position":[[5,3],[43,3]]},"302":{"position":[[510,3]]},"304":{"position":[[288,3]]},"317":{"position":[[215,3],[241,3]]},"318":{"position":[[405,3]]},"331":{"position":[[251,3]]},"347":{"position":[[98,3]]},"362":{"position":[[1169,3]]},"367":{"position":[[212,3]]},"369":{"position":[[1351,3]]},"383":{"position":[[330,3]]},"393":{"position":[[698,3]]},"394":{"position":[[9,3]]},"396":{"position":[[861,3],[1023,3]]},"398":{"position":[[3300,3]]},"402":{"position":[[405,3],[2084,3]]},"405":{"position":[[145,3]]},"408":{"position":[[2479,3]]},"412":{"position":[[324,3],[6257,3],[7893,3]]},"434":{"position":[[73,3]]},"435":{"position":[[152,3]]},"459":{"position":[[285,3]]},"461":{"position":[[549,3],[1375,3]]},"471":{"position":[[130,3]]},"489":{"position":[[219,3]]},"491":{"position":[[908,3],[1934,3]]},"495":{"position":[[656,3]]},"498":{"position":[[234,3]]},"511":{"position":[[98,3]]},"520":{"position":[[72,3]]},"531":{"position":[[98,3]]},"535":{"position":[[758,3]]},"548":{"position":[[80,3]]},"556":{"position":[[1999,3]]},"557":{"position":[[144,3],[211,3]]},"566":{"position":[[1085,3]]},"567":{"position":[[851,3]]},"590":{"position":[[47,3]]},"591":{"position":[[98,3]]},"595":{"position":[[779,3]]},"608":{"position":[[80,3]]},"610":{"position":[[1614,3]]},"613":{"position":[[327,3]]},"626":{"position":[[67,3],[159,3],[376,3],[1109,3]]},"627":{"position":[[283,3]]},"628":{"position":[[7,3],[232,3]]},"644":{"position":[[168,3]]},"666":{"position":[[302,3]]},"679":{"position":[[315,3]]},"686":{"position":[[34,3]]},"702":{"position":[[680,3]]},"705":{"position":[[132,3]]},"710":{"position":[[910,3],[2516,3]]},"711":{"position":[[2388,3]]},"712":{"position":[[82,3]]},"719":{"position":[[464,3]]},"737":{"position":[[405,3]]},"776":{"position":[[7,3],[255,3]]},"785":{"position":[[721,3]]},"798":{"position":[[124,3]]},"824":{"position":[[272,3]]},"836":{"position":[[335,3],[1341,3]]},"838":{"position":[[1568,3],[3244,3]]},"842":{"position":[[71,3]]},"846":{"position":[[522,3]]},"854":{"position":[[1186,3],[1270,4]]},"873":{"position":[[8,3]]},"875":{"position":[[8690,3]]},"886":{"position":[[5040,3]]},"887":{"position":[[203,3]]},"890":{"position":[[976,3]]},"904":{"position":[[251,3],[3391,3]]},"908":{"position":[[372,3]]},"913":{"position":[[7,3]]},"985":{"position":[[516,3]]},"988":{"position":[[3102,3],[5902,3]]},"1004":{"position":[[519,3]]},"1067":{"position":[[727,3]]},"1072":{"position":[[509,3]]},"1087":{"position":[[76,3]]},"1124":{"position":[[190,3]]},"1148":{"position":[[148,3]]},"1198":{"position":[[119,3],[1226,3]]},"1228":{"position":[[41,3]]},"1271":{"position":[[183,3]]},"1294":{"position":[[331,3]]},"1316":{"position":[[838,3]]},"1324":{"position":[[30,3]]}},"keywords":{}}],["outag",{"_index":2520,"title":{},"content":{"407":{"position":[[557,7]]},"473":{"position":[[131,8]]}},"keywords":{}}],["outcom",{"_index":1781,"title":{},"content":{"300":{"position":[[772,8]]}},"keywords":{}}],["outdat",{"_index":2429,"title":{},"content":{"399":{"position":[[303,8]]},"421":{"position":[[394,9]]},"458":{"position":[[324,8]]},"496":{"position":[[779,8]]},"624":{"position":[[1392,8]]},"709":{"position":[[616,8]]},"749":{"position":[[16380,8]]},"876":{"position":[[567,8]]},"879":{"position":[[347,8]]},"990":{"position":[[1056,9],[1361,8]]}},"keywords":{}}],["outdatedcli",{"_index":5068,"title":{"879":{"position":[[0,16]]}},"content":{"879":{"position":[[376,15]]}},"keywords":{}}],["outer",{"_index":4658,"title":{},"content":{"799":{"position":[[411,5]]}},"keywords":{}}],["outlier",{"_index":2204,"title":{},"content":{"390":{"position":[[1497,8]]}},"keywords":{}}],["outperform",{"_index":2574,"title":{},"content":{"408":{"position":[[5329,11]]},"622":{"position":[[681,13]]},"1090":{"position":[[136,11]]}},"keywords":{}}],["output",{"_index":2222,"title":{},"content":{"391":{"position":[[644,6]]},"401":{"position":[[658,7]]},"404":{"position":[[803,8],[985,8]]},"1266":{"position":[[481,6],[598,7]]},"1267":{"position":[[259,6]]}},"keywords":{}}],["output.multi",{"_index":2506,"title":{},"content":{"404":{"position":[[685,12]]}},"keywords":{}}],["outsid",{"_index":747,"title":{},"content":{"50":{"position":[[31,7],[248,7],[432,7]]},"129":{"position":[[552,7]]},"701":{"position":[[845,10]]},"829":{"position":[[1082,7]]},"832":{"position":[[131,7]]},"1188":{"position":[[413,7]]},"1198":{"position":[[1007,8]]},"1210":{"position":[[595,7]]},"1231":{"position":[[858,7]]},"1233":{"position":[[226,7]]}},"keywords":{}}],["outstand",{"_index":6040,"title":{},"content":{"1133":{"position":[[502,11]]},"1297":{"position":[[288,11]]}},"keywords":{}}],["over",{"_index":272,"title":{"210":{"position":[[27,4]]},"1120":{"position":[[12,4]]}},"content":{"16":{"position":[[149,4]]},"19":{"position":[[323,4]]},"22":{"position":[[267,4]]},"35":{"position":[[121,4]]},"37":{"position":[[90,4]]},"75":{"position":[[94,4]]},"186":{"position":[[201,4]]},"228":{"position":[[414,4]]},"278":{"position":[[132,4]]},"282":{"position":[[395,4]]},"305":{"position":[[226,4]]},"400":{"position":[[802,4]]},"407":{"position":[[144,4]]},"408":{"position":[[475,4]]},"410":{"position":[[637,4]]},"411":{"position":[[3642,4]]},"419":{"position":[[587,4]]},"427":{"position":[[989,4]]},"452":{"position":[[317,4]]},"454":{"position":[[130,4]]},"459":{"position":[[151,4]]},"464":{"position":[[704,4]]},"534":{"position":[[407,4]]},"536":{"position":[[122,4]]},"594":{"position":[[405,4]]},"596":{"position":[[120,4]]},"610":{"position":[[117,4]]},"611":{"position":[[56,4],[397,4]]},"612":{"position":[[86,4]]},"613":{"position":[[229,4]]},"614":{"position":[[924,4]]},"616":{"position":[[129,4]]},"621":{"position":[[76,4]]},"626":{"position":[[757,4]]},"636":{"position":[[1,4]]},"647":{"position":[[138,4]]},"690":{"position":[[70,4],[209,4]]},"704":{"position":[[48,4]]},"705":{"position":[[1043,4]]},"775":{"position":[[313,4]]},"780":{"position":[[142,4]]},"781":{"position":[[489,4]]},"783":{"position":[[315,4]]},"796":{"position":[[188,4]]},"818":{"position":[[199,4]]},"826":{"position":[[576,4],[784,4],[882,4]]},"837":{"position":[[387,4],[532,4]]},"839":{"position":[[208,4]]},"841":{"position":[[970,4]]},"848":{"position":[[921,4]]},"871":{"position":[[284,4]]},"885":{"position":[[1272,4]]},"897":{"position":[[136,4],[393,4]]},"912":{"position":[[664,4]]},"947":{"position":[[27,4]]},"1009":{"position":[[838,4]]},"1018":{"position":[[708,4]]},"1022":{"position":[[50,4]]},"1043":{"position":[[33,4]]},"1069":{"position":[[109,4]]},"1137":{"position":[[215,4]]},"1147":{"position":[[317,4]]},"1149":{"position":[[22,4]]},"1198":{"position":[[326,4],[653,4]]},"1218":{"position":[[33,4]]},"1219":{"position":[[80,4]]},"1246":{"position":[[745,4]]},"1257":{"position":[[152,4]]},"1295":{"position":[[892,4],[984,4],[1124,4],[1286,4]]},"1296":{"position":[[163,4],[384,4],[569,4],[1164,4]]},"1315":{"position":[[69,4]]}},"keywords":{}}],["overal",{"_index":984,"title":{},"content":{"78":{"position":[[87,7]]},"81":{"position":[[116,7]]},"87":{"position":[[263,7]]},"111":{"position":[[141,7]]},"136":{"position":[[342,7]]},"141":{"position":[[175,7]]},"166":{"position":[[285,7]]},"173":{"position":[[2644,7]]},"236":{"position":[[113,7]]},"294":{"position":[[212,7]]},"304":{"position":[[106,7]]},"311":{"position":[[170,7]]},"409":{"position":[[101,7]]},"411":{"position":[[1746,7]]},"508":{"position":[[187,7]]},"587":{"position":[[88,7]]},"801":{"position":[[776,7]]},"802":{"position":[[821,7]]},"820":{"position":[[428,7]]},"836":{"position":[[2205,8]]}},"keywords":{}}],["overcom",{"_index":1876,"title":{},"content":{"306":{"position":[[306,10]]},"781":{"position":[[192,8]]}},"keywords":{}}],["overcompl",{"_index":3725,"title":{},"content":{"644":{"position":[[734,16]]}},"keywords":{}}],["overfetch",{"_index":3973,"title":{},"content":{"703":{"position":[[915,9]]}},"keywords":{}}],["overflow",{"_index":1762,"title":{},"content":{"299":{"position":[[1398,9]]},"779":{"position":[[55,8]]}},"keywords":{}}],["overhead",{"_index":393,"title":{},"content":{"23":{"position":[[409,9]]},"24":{"position":[[400,8]]},"265":{"position":[[818,9]]},"283":{"position":[[217,9]]},"311":{"position":[[253,8]]},"313":{"position":[[238,9]]},"361":{"position":[[1087,8]]},"376":{"position":[[164,8],[414,8]]},"383":{"position":[[552,8]]},"408":{"position":[[2002,8]]},"412":{"position":[[9887,10]]},"427":{"position":[[645,9],[802,9]]},"429":{"position":[[347,9]]},"463":{"position":[[897,8]]},"464":{"position":[[925,8]]},"490":{"position":[[539,9]]},"521":{"position":[[652,8]]},"527":{"position":[[192,8]]},"611":{"position":[[198,8]]},"622":{"position":[[284,8],[460,8]]},"623":{"position":[[301,8]]},"624":{"position":[[1438,8]]},"630":{"position":[[484,9]]},"631":{"position":[[501,8]]},"644":{"position":[[554,8]]},"723":{"position":[[948,8]]},"802":{"position":[[201,9]]},"836":{"position":[[1552,9]]},"841":{"position":[[929,8]]},"902":{"position":[[248,8]]},"1009":{"position":[[643,9]]},"1200":{"position":[[62,8]]},"1270":{"position":[[142,8]]},"1295":{"position":[[1501,9]]}},"keywords":{}}],["overhead.built",{"_index":1221,"title":{},"content":{"174":{"position":[[1763,14]]}},"keywords":{}}],["overhead.y",{"_index":1592,"title":{},"content":{"262":{"position":[[297,12]]}},"keywords":{}}],["overload",{"_index":5240,"title":{},"content":{"902":{"position":[[201,11]]}},"keywords":{}}],["overrid",{"_index":1731,"title":{},"content":{"298":{"position":[[824,10]]},"496":{"position":[[96,9]]},"635":{"position":[[267,8]]},"898":{"position":[[3908,9]]}},"keywords":{}}],["oversel",{"_index":2711,"title":{},"content":{"412":{"position":[[6453,11]]}},"keywords":{}}],["oversight",{"_index":3904,"title":{},"content":{"689":{"position":[[523,10]]}},"keywords":{}}],["overus",{"_index":4670,"title":{},"content":{"802":{"position":[[475,7]]}},"keywords":{}}],["overview",{"_index":878,"title":{"151":{"position":[[0,8]]},"177":{"position":[[0,8]]},"551":{"position":[[24,9]]},"566":{"position":[[0,9]]},"871":{"position":[[13,9]]},"897":{"position":[[13,9]]}},"content":{"60":{"position":[[23,8]]},"411":{"position":[[1009,8]]},"449":{"position":[[25,8]]},"547":{"position":[[23,8]]},"607":{"position":[[23,8]]},"641":{"position":[[119,9]]},"696":{"position":[[2010,8]]},"793":{"position":[[35,8],[171,8]]},"901":{"position":[[620,9]]}},"keywords":{}}],["overwhelm",{"_index":1642,"title":{},"content":{"277":{"position":[[99,12]]}},"keywords":{}}],["overwrit",{"_index":2058,"title":{"806":{"position":[[0,13]]}},"content":{"358":{"position":[[314,11]]},"496":{"position":[[428,9]]},"566":{"position":[[839,10]]},"654":{"position":[[210,9]]},"683":{"position":[[478,9]]},"806":{"position":[[94,9],[118,12],[165,13],[221,9]]},"863":{"position":[[556,11]]},"946":{"position":[[84,9]]},"987":{"position":[[916,9]]},"991":{"position":[[119,9]]},"1015":{"position":[[72,10]]},"1043":{"position":[[1,10]]},"1103":{"position":[[97,9]]},"1174":{"position":[[274,9]]},"1301":{"position":[[259,9]]},"1309":{"position":[[1221,9]]}},"keywords":{}}],["overwrite/polyfil",{"_index":6047,"title":{"1139":{"position":[[0,18]]},"1145":{"position":[[0,18]]}},"content":{},"keywords":{}}],["overwritten",{"_index":5343,"title":{},"content":{"946":{"position":[[117,11]]},"1004":{"position":[[636,12]]}},"keywords":{}}],["own",{"_index":4795,"title":{},"content":{"839":{"position":[[136,5]]},"841":{"position":[[228,6]]}},"keywords":{}}],["owner",{"_index":3640,"title":{},"content":{"617":{"position":[[952,6]]}},"keywords":{}}],["ownership",{"_index":1022,"title":{"417":{"position":[[5,9]]}},"content":{"97":{"position":[[133,9]]},"407":{"position":[[505,9],[966,9]]},"419":{"position":[[936,10]]},"839":{"position":[[1367,9]]},"902":{"position":[[368,9]]}},"keywords":{}}],["p",{"_index":4923,"title":{},"content":{"865":{"position":[[245,1]]}},"keywords":{}}],["p2",{"_index":4151,"title":{},"content":{"749":{"position":[[1548,2]]}},"keywords":{}}],["p2p",{"_index":1360,"title":{"210":{"position":[[11,3]]},"261":{"position":[[24,3]]},"868":{"position":[[28,3]]},"900":{"position":[[0,3]]},"902":{"position":[[12,3]]},"903":{"position":[[13,5]]}},"content":{"210":{"position":[[317,4]]},"261":{"position":[[394,3],[1017,3]]},"289":{"position":[[1582,5],[1679,3]]},"411":{"position":[[4858,3],[5103,3]]},"504":{"position":[[1270,5],[1314,3]]},"793":{"position":[[744,3]]},"868":{"position":[[28,3]]},"902":{"position":[[622,3]]},"903":{"position":[[139,3],[668,3]]},"904":{"position":[[1197,4],[1416,3],[2233,3],[3343,3]]},"906":{"position":[[5,3]]},"913":{"position":[[220,3],[324,3]]},"1121":{"position":[[187,3]]}},"keywords":{}}],["p2p"",{"_index":1458,"title":{},"content":{"243":{"position":[[477,9]]}},"keywords":{}}],["p2pconnectionhandlercr",{"_index":5259,"title":{},"content":{"904":{"position":[[1603,27]]}},"keywords":{}}],["pace",{"_index":1682,"title":{},"content":{"289":{"position":[[1524,5]]}},"keywords":{}}],["packag",{"_index":251,"title":{"1274":{"position":[[27,8]]},"1275":{"position":[[27,8]]}},"content":{"15":{"position":[[154,7]]},"16":{"position":[[46,8]]},"188":{"position":[[2076,7],[2123,7]]},"285":{"position":[[184,7]]},"364":{"position":[[427,8]]},"438":{"position":[[215,7],[245,7]]},"503":{"position":[[160,9]]},"523":{"position":[[16,7]]},"542":{"position":[[192,8]]},"617":{"position":[[2248,7],[2340,7]]},"662":{"position":[[972,8]]},"711":{"position":[[720,7],[798,7]]},"724":{"position":[[41,7],[115,8]]},"730":{"position":[[254,8]]},"824":{"position":[[563,7]]},"835":{"position":[[687,7]]},"852":{"position":[[104,8]]},"854":{"position":[[24,8]]},"866":{"position":[[20,8]]},"878":{"position":[[68,8]]},"882":{"position":[[49,7],[274,7]]},"910":{"position":[[186,7]]},"911":{"position":[[314,7],[468,7]]},"1097":{"position":[[60,7]]},"1112":{"position":[[63,8]]},"1189":{"position":[[23,8]]},"1271":{"position":[[796,7],[1041,9]]},"1276":{"position":[[42,7]]}},"keywords":{}}],["package.json",{"_index":3828,"title":{},"content":{"666":{"position":[[383,12]]},"726":{"position":[[80,13]]},"730":{"position":[[217,12]]},"731":{"position":[[86,13]]},"760":{"position":[[90,12]]},"1176":{"position":[[527,12]]}},"keywords":{}}],["package:rxdb/rxdb.dart",{"_index":1274,"title":{},"content":{"188":{"position":[[2541,25]]}},"keywords":{}}],["packageth",{"_index":3787,"title":{},"content":{"661":{"position":[[297,10],[331,10]]}},"keywords":{}}],["padstart(idmaxlength",{"_index":6462,"title":{},"content":{"1296":{"position":[[1533,24]]}},"keywords":{}}],["page",{"_index":1058,"title":{},"content":{"116":{"position":[[118,4]]},"266":{"position":[[1034,4]]},"298":{"position":[[397,5]]},"334":{"position":[[106,4]]},"346":{"position":[[387,4]]},"394":{"position":[[1316,4]]},"410":{"position":[[1569,4]]},"411":{"position":[[1018,4]]},"421":{"position":[[56,6],[114,5],[309,4]]},"424":{"position":[[362,5]]},"436":{"position":[[210,4]]},"454":{"position":[[758,4]]},"463":{"position":[[1321,4]]},"617":{"position":[[230,4]]},"653":{"position":[[659,4]]},"656":{"position":[[326,4]]},"664":{"position":[[34,4]]},"740":{"position":[[666,5]]},"781":{"position":[[384,4]]},"783":{"position":[[179,4],[267,4]]},"830":{"position":[[43,4]]},"831":{"position":[[46,5]]},"832":{"position":[[97,5]]},"868":{"position":[[93,4]]},"879":{"position":[[591,4]]},"958":{"position":[[177,4]]},"990":{"position":[[1163,4],[1386,4]]},"1137":{"position":[[261,4]]},"1161":{"position":[[110,4]]},"1162":{"position":[[590,4]]},"1164":{"position":[[383,4]]},"1180":{"position":[[110,4]]},"1181":{"position":[[678,4]]},"1192":{"position":[[473,4]]},"1238":{"position":[[355,4]]},"1246":{"position":[[1809,4]]},"1267":{"position":[[367,4]]},"1299":{"position":[[175,4]]},"1301":{"position":[[1427,4]]}},"keywords":{}}],["pageload",{"_index":3094,"title":{},"content":{"469":{"position":[[1009,9]]},"696":{"position":[[157,8]]},"1295":{"position":[[733,8]]}},"keywords":{}}],["pages",{"_index":3272,"title":{},"content":{"523":{"position":[[534,9]]}},"keywords":{}}],["pagin",{"_index":3273,"title":{},"content":{"523":{"position":[[547,11]]}},"keywords":{}}],["pain",{"_index":2755,"title":{},"content":{"412":{"position":[[12779,5]]}},"keywords":{}}],["painless",{"_index":3702,"title":{},"content":{"632":{"position":[[912,8]]}},"keywords":{}}],["pair",{"_index":2095,"title":{},"content":{"362":{"position":[[456,7]]},"426":{"position":[[59,6]]},"429":{"position":[[565,5]]},"432":{"position":[[231,5]]},"451":{"position":[[144,5]]},"486":{"position":[[201,5]]},"533":{"position":[[166,6]]},"559":{"position":[[62,5]]},"574":{"position":[[896,5]]},"593":{"position":[[166,6]]},"1124":{"position":[[977,6]]}},"keywords":{}}],["paper",{"_index":2865,"title":{},"content":{"422":{"position":[[296,5]]}},"keywords":{}}],["paradigm",{"_index":1237,"title":{"407":{"position":[[24,9]]},"445":{"position":[[20,8]]}},"content":{"179":{"position":[[369,9]]},"387":{"position":[[89,9]]},"409":{"position":[[175,8]]},"411":{"position":[[4965,8]]},"445":{"position":[[1243,9],[1580,8]]},"502":{"position":[[393,8]]},"723":{"position":[[2543,8]]}},"keywords":{}}],["paradox",{"_index":2581,"title":{},"content":{"409":{"position":[[9,7]]}},"keywords":{}}],["parallel",{"_index":2252,"title":{},"content":{"392":{"position":[[3192,8],[3322,9]]},"460":{"position":[[203,8]]},"617":{"position":[[1391,8],[1958,9]]},"749":{"position":[[9302,8]]},"752":{"position":[[833,8]]},"759":{"position":[[761,9],[832,9]]},"760":{"position":[[757,9]]},"767":{"position":[[136,8],[241,8],[435,8],[818,8]]},"768":{"position":[[117,8],[200,8],[417,8],[824,8]]},"769":{"position":[[128,8],[215,8],[370,8],[789,8]]},"801":{"position":[[628,8]]},"845":{"position":[[144,9]]},"863":{"position":[[665,9]]},"948":{"position":[[524,8]]},"958":{"position":[[595,8]]},"1088":{"position":[[137,9]]},"1175":{"position":[[693,8]]},"1194":{"position":[[883,9]]},"1238":{"position":[[231,8]]},"1295":{"position":[[939,8]]},"1313":{"position":[[175,8]]}},"keywords":{}}],["param",{"_index":4166,"title":{},"content":{"749":{"position":[[2323,6]]},"1088":{"position":[[572,5]]}},"keywords":{}}],["paramet",{"_index":174,"title":{},"content":{"11":{"position":[[941,9]]},"403":{"position":[[27,9]]},"616":{"position":[[807,10]]},"724":{"position":[[1711,9]]},"749":{"position":[[24283,9]]},"751":{"position":[[326,9]]},"766":{"position":[[40,10],[117,10],[203,10]]},"805":{"position":[[182,9]]},"806":{"position":[[488,10]]},"818":{"position":[[142,9]]},"886":{"position":[[4308,9],[4377,9],[4567,11]]},"890":{"position":[[604,9]]},"934":{"position":[[522,10]]},"937":{"position":[[10,10]]},"938":{"position":[[10,10]]},"960":{"position":[[120,11],[401,11]]},"971":{"position":[[129,9]]},"986":{"position":[[298,9]]},"1065":{"position":[[539,9],[1581,10],[1873,9]]},"1105":{"position":[[193,9]]},"1189":{"position":[[218,9]]},"1226":{"position":[[338,9]]},"1264":{"position":[[254,9]]}},"keywords":{}}],["parameters.direct",{"_index":5488,"title":{},"content":{"990":{"position":[[892,21]]}},"keywords":{}}],["parameters.error",{"_index":5487,"title":{},"content":{"990":{"position":[[813,18]]}},"keywords":{}}],["paramount",{"_index":1190,"title":{},"content":{"167":{"position":[[37,10]]},"310":{"position":[[28,9]]},"354":{"position":[[1335,10]]},"380":{"position":[[423,10]]},"526":{"position":[[38,9]]},"802":{"position":[[932,10]]}},"keywords":{}}],["params.databasenam",{"_index":6061,"title":{},"content":{"1140":{"position":[[770,21]]}},"keywords":{}}],["parent",{"_index":6108,"title":{},"content":{"1162":{"position":[[217,6],[550,6],[842,6]]},"1164":{"position":[[323,6],[572,6]]},"1165":{"position":[[123,6],[490,6],[587,6]]},"1181":{"position":[[283,6],[638,6]]}},"keywords":{}}],["parentdatabas",{"_index":6120,"title":{},"content":{"1165":{"position":[[706,14]]}},"keywords":{}}],["parentdatabase.addcollect",{"_index":6121,"title":{},"content":{"1165":{"position":[[801,32]]}},"keywords":{}}],["parentdatabase.mycollect",{"_index":6122,"title":{},"content":{"1165":{"position":[[879,28]]}},"keywords":{}}],["parentstorag",{"_index":6114,"title":{},"content":{"1163":{"position":[[284,13],[436,13]]},"1164":{"position":[[170,14],[941,14]]},"1165":{"position":[[294,13],[399,14],[777,13]]},"1182":{"position":[[284,13],[440,13]]}},"keywords":{}}],["pars",{"_index":2049,"title":{},"content":{"357":{"position":[[174,5]]},"358":{"position":[[769,6]]},"360":{"position":[[176,7]]},"364":{"position":[[439,6]]},"426":{"position":[[457,7]]},"427":{"position":[[739,7]]},"454":{"position":[[725,6]]},"463":{"position":[[1143,7]]},"566":{"position":[[247,5]]},"800":{"position":[[69,5],[142,6],[266,5],[306,7]]},"882":{"position":[[233,5]]},"1065":{"position":[[770,7]]},"1104":{"position":[[121,6],[720,5]]},"1171":{"position":[[412,5]]},"1252":{"position":[[245,5]]},"1317":{"position":[[384,5]]}},"keywords":{}}],["parsefloat(req.query.updatedat",{"_index":4992,"title":{},"content":{"875":{"position":[[2149,32]]}},"keywords":{}}],["parseint($('#heropoints').v",{"_index":1956,"title":{},"content":{"335":{"position":[[685,32]]}},"keywords":{}}],["part",{"_index":1160,"title":{"559":{"position":[[0,4]]},"560":{"position":[[0,4]]},"561":{"position":[[0,4]]},"563":{"position":[[0,4]]},"564":{"position":[[0,4]]},"800":{"position":[[6,5]]}},"content":{"152":{"position":[[45,4]]},"188":{"position":[[2015,4]]},"303":{"position":[[1160,4]]},"358":{"position":[[244,5]]},"408":{"position":[[1567,4]]},"412":{"position":[[573,4],[1019,5]]},"451":{"position":[[44,4]]},"617":{"position":[[339,4]]},"618":{"position":[[393,4]]},"662":{"position":[[1014,4]]},"680":{"position":[[315,5]]},"696":{"position":[[1846,5]]},"698":{"position":[[2121,5]]},"701":{"position":[[1052,5]]},"707":{"position":[[45,6]]},"710":{"position":[[844,4]]},"749":{"position":[[15185,4]]},"829":{"position":[[129,4]]},"830":{"position":[[177,4]]},"838":{"position":[[1502,4]]},"854":{"position":[[1537,4]]},"875":{"position":[[7607,4]]},"981":{"position":[[329,5],[380,5],[596,5]]},"986":{"position":[[311,4]]},"1009":{"position":[[1067,5]]},"1078":{"position":[[775,5]]},"1124":{"position":[[1378,5]]},"1129":{"position":[[7,4]]},"1141":{"position":[[7,4]]},"1162":{"position":[[885,4],[920,4]]},"1181":{"position":[[837,4],[872,4]]},"1210":{"position":[[223,4]]},"1215":{"position":[[411,4]]},"1246":{"position":[[794,4]]},"1304":{"position":[[916,4]]},"1307":{"position":[[174,5]]}},"keywords":{}}],["parti",{"_index":1103,"title":{"1247":{"position":[[6,5]]},"1284":{"position":[[6,5]]}},"content":{"131":{"position":[[176,5]]},"412":{"position":[[1600,5]]},"482":{"position":[[1198,7]]},"550":{"position":[[50,5]]},"611":{"position":[[436,7]]},"793":{"position":[[1219,5]]},"902":{"position":[[463,5]]},"1102":{"position":[[264,5]]},"1284":{"position":[[6,5]]}},"keywords":{}}],["partial",{"_index":650,"title":{"1006":{"position":[[0,7]]},"1009":{"position":[[0,7]]}},"content":{"41":{"position":[[86,7]]},"212":{"position":[[167,7]]},"245":{"position":[[19,7]]},"250":{"position":[[233,7]]},"299":{"position":[[379,7]]},"357":{"position":[[230,7]]},"358":{"position":[[471,7],[656,7],[919,7]]},"362":{"position":[[709,7]]},"412":{"position":[[7458,7],[13804,7]]},"418":{"position":[[574,7]]},"497":{"position":[[737,7]]},"559":{"position":[[1480,7]]},"626":{"position":[[328,7]]},"635":{"position":[[361,7]]},"699":{"position":[[859,9]]},"705":{"position":[[750,9]]},"723":{"position":[[254,7]]},"800":{"position":[[59,9],[298,7]]},"841":{"position":[[679,7],[1557,7]]},"1030":{"position":[[172,9]]},"1033":{"position":[[137,9]]},"1072":{"position":[[94,7]]},"1093":{"position":[[259,9]]},"1116":{"position":[[145,9]]}},"keywords":{}}],["participants.onlin",{"_index":2782,"title":{},"content":{"414":{"position":[[223,19]]}},"keywords":{}}],["particular",{"_index":5558,"title":{},"content":{"1007":{"position":[[388,10]]}},"keywords":{}}],["particularli",{"_index":532,"title":{},"content":{"34":{"position":[[253,12]]},"40":{"position":[[112,12]]},"65":{"position":[[1193,12]]},"69":{"position":[[177,12]]},"122":{"position":[[287,12]]},"133":{"position":[[281,12]]},"141":{"position":[[218,12]]},"169":{"position":[[227,12]]},"173":{"position":[[2084,12]]},"185":{"position":[[146,12]]},"215":{"position":[[285,12]]},"216":{"position":[[241,12]]},"220":{"position":[[229,12]]},"232":{"position":[[230,12]]},"276":{"position":[[177,12]]},"287":{"position":[[806,12]]},"309":{"position":[[66,12]]},"375":{"position":[[21,12]]},"418":{"position":[[14,12]]},"508":{"position":[[105,12]]},"526":{"position":[[215,12]]},"584":{"position":[[193,12]]},"839":{"position":[[46,12]]},"902":{"position":[[896,12]]},"912":{"position":[[518,12]]}},"keywords":{}}],["partit",{"_index":2721,"title":{},"content":{"412":{"position":[[7624,11],[12266,9]]},"1295":{"position":[[88,11],[553,12]]}},"keywords":{}}],["partli",{"_index":2764,"title":{},"content":{"412":{"position":[[13683,6]]}},"keywords":{}}],["pass",{"_index":172,"title":{"1229":{"position":[[0,7]]},"1268":{"position":[[0,7]]}},"content":{"11":{"position":[[924,6]]},"55":{"position":[[618,4]]},"682":{"position":[[286,4]]},"721":{"position":[[428,6]]},"749":{"position":[[11965,4]]},"789":{"position":[[26,4]]},"806":{"position":[[660,6]]},"886":{"position":[[4365,6]]},"890":{"position":[[584,4],[742,4]]},"907":{"position":[[148,7]]},"950":{"position":[[86,4]]},"951":{"position":[[554,6]]},"971":{"position":[[114,4]]},"975":{"position":[[602,6]]},"988":{"position":[[4276,6]]},"1065":{"position":[[190,4]]},"1084":{"position":[[483,4]]},"1105":{"position":[[290,4]]},"1139":{"position":[[191,4]]},"1145":{"position":[[187,4]]},"1146":{"position":[[162,7]]},"1156":{"position":[[297,4]]},"1271":{"position":[[284,4]]},"1282":{"position":[[652,4],[850,4]]}},"keywords":{}}],["passeng",{"_index":3462,"title":{},"content":{"569":{"position":[[850,11]]}},"keywords":{}}],["passportid",{"_index":4955,"title":{},"content":{"872":{"position":[[1884,13],[1928,11],[2049,14],[4114,13],[4158,11],[4279,14]]},"898":{"position":[[2464,13],[2508,11],[2654,14]]},"1051":{"position":[[216,11],[486,11]]},"1311":{"position":[[403,13],[447,11],[578,14],[1513,11]]}},"keywords":{}}],["password",{"_index":1400,"title":{"218":{"position":[[0,8]]},"715":{"position":[[0,8]]},"719":{"position":[[13,9]]},"963":{"position":[[0,9]]}},"content":{"314":{"position":[[647,10]]},"315":{"position":[[607,9]]},"334":{"position":[[407,9],[454,8]]},"412":{"position":[[13354,8]]},"482":{"position":[[587,8],[684,9],[1159,9]]},"522":{"position":[[521,9],[554,8]]},"554":{"position":[[1133,9]]},"556":{"position":[[8,8],[43,9],[184,8],[276,8],[502,8]]},"564":{"position":[[542,8],[657,9]]},"579":{"position":[[416,9],[463,8]]},"632":{"position":[[1380,8]]},"638":{"position":[[494,9],[931,9]]},"715":{"position":[[70,9],[116,8],[204,10],[265,9],[299,8],[384,10]]},"716":{"position":[[63,8],[282,8],[347,8],[412,8],[464,8]]},"717":{"position":[[944,8],[999,8],[1221,9]]},"718":{"position":[[563,9],[733,9]]},"719":{"position":[[5,8],[76,8],[146,8],[190,8],[329,8],[413,8],[443,8]]},"720":{"position":[[285,8]]},"721":{"position":[[308,8],[343,8]]},"739":{"position":[[359,9]]},"749":{"position":[[4794,8],[12888,8],[12997,8],[13118,8],[13191,8]]},"912":{"position":[[490,10]]},"916":{"position":[[297,8]]},"960":{"position":[[416,9],[449,8]]},"963":{"position":[[99,8],[120,8]]}},"keywords":{}}],["passwordkeep",{"_index":1879,"title":{},"content":{"310":{"position":[[208,12]]}},"keywords":{}}],["past",{"_index":465,"title":{},"content":{"28":{"position":[[635,5]]},"408":{"position":[[204,5],[1262,4]]},"414":{"position":[[89,4]]},"780":{"position":[[8,5]]},"783":{"position":[[8,4]]},"1208":{"position":[[495,5]]},"1316":{"position":[[1610,4]]},"1324":{"position":[[128,4]]}},"keywords":{}}],["patch",{"_index":744,"title":{"50":{"position":[[0,5]]},"129":{"position":[[0,5]]},"1043":{"position":[[0,8]]},"1060":{"position":[[0,7]]}},"content":{"50":{"position":[[151,5],[307,5],[507,5]]},"129":{"position":[[275,5],[426,8],[608,5],[727,5]]},"1044":{"position":[[472,5]]},"1198":{"position":[[851,7],[910,7]]}},"keywords":{}}],["path",{"_index":656,"title":{},"content":{"41":{"position":[[282,4]]},"188":{"position":[[2310,5]]},"356":{"position":[[257,5]]},"396":{"position":[[471,5]]},"412":{"position":[[11709,4]]},"483":{"position":[[551,5]]},"681":{"position":[[594,4]]},"749":{"position":[[3853,4],[6252,5],[9680,4],[10096,4],[14025,4]]},"810":{"position":[[87,4]]},"838":{"position":[[2276,4]]},"886":{"position":[[1364,4]]},"892":{"position":[[319,5]]},"902":{"position":[[691,6]]},"1033":{"position":[[540,4]]},"1039":{"position":[[50,5],[89,4]]},"1102":{"position":[[1106,6]]},"1125":{"position":[[477,4]]},"1134":{"position":[[436,4]]},"1226":{"position":[[429,4]]},"1227":{"position":[[427,4],[777,4]]},"1264":{"position":[[339,4]]},"1265":{"position":[[420,4],[759,4]]},"1266":{"position":[[171,4],[311,4],[488,4],[644,5]]}},"keywords":{}}],["path.join(__dirnam",{"_index":5910,"title":{},"content":{"1090":{"position":[[899,20]]},"1130":{"position":[[246,20]]}},"keywords":{}}],["path.resolv",{"_index":6309,"title":{},"content":{"1266":{"position":[[274,13],[650,13]]}},"keywords":{}}],["path/to/database/file/foobar.db",{"_index":4573,"title":{},"content":{"772":{"position":[[1640,34],[2402,34]]}},"keywords":{}}],["path/to/fdb.clust",{"_index":4568,"title":{},"content":{"772":{"position":[[874,22]]},"774":{"position":[[802,22]]},"1134":{"position":[[565,23]]}},"keywords":{}}],["path/to/shar",{"_index":6269,"title":{},"content":{"1226":{"position":[[577,15]]}},"keywords":{}}],["path/to/worker.j",{"_index":6287,"title":{},"content":{"1238":{"position":[[957,20]]},"1264":{"position":[[464,20]]},"1267":{"position":[[523,19]]}},"keywords":{}}],["path/to/your/node_modules/rxdb/src/plugins/flutter/dart",{"_index":1271,"title":{},"content":{"188":{"position":[[2316,55]]}},"keywords":{}}],["pattern",{"_index":1984,"title":{},"content":{"347":{"position":[[607,8]]},"362":{"position":[[1678,8]]},"369":{"position":[[1513,9]]},"411":{"position":[[3077,7]]},"420":{"position":[[765,9]]},"421":{"position":[[500,7]]},"462":{"position":[[429,9]]},"464":{"position":[[1104,7]]},"491":{"position":[[1772,7]]},"521":{"position":[[166,9]]},"634":{"position":[[83,8]]},"832":{"position":[[70,8]]},"1009":{"position":[[588,7]]},"1134":{"position":[[729,9]]},"1193":{"position":[[246,8]]},"1195":{"position":[[17,8]]},"1222":{"position":[[658,9]]}},"keywords":{}}],["paus",{"_index":3952,"title":{"998":{"position":[[0,8]]}},"content":{"700":{"position":[[687,6]]},"998":{"position":[[1,6]]},"1001":{"position":[[36,7]]},"1003":{"position":[[247,7]]}},"keywords":{}}],["pave",{"_index":1665,"title":{},"content":{"285":{"position":[[299,5]]},"441":{"position":[[646,4]]}},"keywords":{}}],["pay",{"_index":1556,"title":{},"content":{"251":{"position":[[156,3]]},"262":{"position":[[274,3]]}},"keywords":{}}],["payload",{"_index":3591,"title":{},"content":{"612":{"position":[[1610,9]]}},"keywords":{}}],["pc",{"_index":2428,"title":{},"content":{"399":{"position":[[270,4],[566,2]]},"1162":{"position":[[134,2]]},"1171":{"position":[[151,2]]},"1181":{"position":[[200,2]]}},"keywords":{}}],["peer",{"_index":477,"title":{"727":{"position":[[0,4]]},"903":{"position":[[0,4],[8,4]]},"907":{"position":[[0,4]]}},"content":{"29":{"position":[[152,4],[160,4]]},"40":{"position":[[243,4],[251,4]]},"210":{"position":[[59,4],[67,4],[698,6]]},"212":{"position":[[521,4]]},"261":{"position":[[71,4],[79,4],[894,5],[1047,5]]},"289":{"position":[[1569,4],[1577,4]]},"327":{"position":[[284,6]]},"411":{"position":[[4992,4],[5000,4]]},"481":{"position":[[381,4],[389,4]]},"504":{"position":[[1257,4],[1265,4]]},"614":{"position":[[296,4],[304,4],[519,6]]},"632":{"position":[[703,4],[711,4]]},"727":{"position":[[30,4]]},"749":{"position":[[16035,4]]},"901":{"position":[[170,6],[396,4],[404,4],[722,4],[730,4]]},"902":{"position":[[178,5]]},"903":{"position":[[372,4],[560,6]]},"904":{"position":[[1739,4],[2376,4],[2412,5],[3330,5]]},"905":{"position":[[119,5]]},"906":{"position":[[129,5],[259,4]]},"907":{"position":[[54,4],[122,5],[222,5],[249,6],[335,6]]},"910":{"position":[[99,4]]}},"keywords":{}}],["pend",{"_index":2153,"title":{},"content":{"380":{"position":[[216,7]]}},"keywords":{}}],["peopl",{"_index":2308,"title":{"420":{"position":[[3,6]]}},"content":{"394":{"position":[[616,8]]},"419":{"position":[[1298,6]]},"420":{"position":[[1062,6]]},"422":{"position":[[215,6]]},"454":{"position":[[484,6]]},"456":{"position":[[123,6]]},"569":{"position":[[982,6]]},"570":{"position":[[45,6]]},"611":{"position":[[1283,6]]},"613":{"position":[[1015,6]]},"670":{"position":[[193,7]]},"704":{"position":[[248,6]]},"705":{"position":[[246,6]]},"749":{"position":[[21854,6]]},"987":{"position":[[932,7]]},"1249":{"position":[[14,6]]},"1315":{"position":[[11,6],[96,6]]}},"keywords":{}}],["per",{"_index":1713,"title":{"617":{"position":[[11,3]]},"1267":{"position":[[11,3]]}},"content":{"298":{"position":[[312,3]]},"299":{"position":[[279,3],[604,3]]},"392":{"position":[[3088,3],[3718,3],[3832,3],[4689,3],[5097,3]]},"401":{"position":[[146,3]]},"402":{"position":[[1460,3]]},"408":{"position":[[1014,3],[1099,3],[1185,3],[4745,3]]},"412":{"position":[[5770,3],[6961,3],[7636,3],[10132,3],[12281,3],[12556,3]]},"432":{"position":[[334,3]]},"461":{"position":[[727,3],[814,3],[839,3],[864,3]]},"464":{"position":[[532,3],[724,3],[825,3],[1027,3],[1228,3],[1384,3]]},"465":{"position":[[394,3]]},"466":{"position":[[572,3]]},"469":{"position":[[296,3]]},"617":{"position":[[44,3],[1257,3],[2029,3]]},"654":{"position":[[32,3]]},"661":{"position":[[391,3]]},"696":{"position":[[1352,3]]},"703":{"position":[[1003,3],[1372,3]]},"736":{"position":[[408,3]]},"849":{"position":[[243,3],[251,3]]},"863":{"position":[[402,3]]},"866":{"position":[[237,3]]},"890":{"position":[[458,3]]},"904":{"position":[[2062,3]]},"981":{"position":[[1069,3]]},"1074":{"position":[[614,3]]},"1126":{"position":[[179,3]]},"1157":{"position":[[167,3]]},"1194":{"position":[[675,3]]},"1222":{"position":[[594,3],[1188,3]]},"1323":{"position":[[203,3]]}},"keywords":{}}],["perceiv",{"_index":3153,"title":{},"content":{"486":{"position":[[47,8]]},"571":{"position":[[1672,8]]},"630":{"position":[[330,9]]},"1246":{"position":[[285,9],[605,9]]}},"keywords":{}}],["percent",{"_index":4469,"title":{},"content":{"752":{"position":[[1274,8]]}},"keywords":{}}],["percentag",{"_index":1709,"title":{},"content":{"298":{"position":[[218,10],[525,10]]},"752":{"position":[[1288,10]]}},"keywords":{}}],["percept",{"_index":4589,"title":{},"content":{"778":{"position":[[414,11]]}},"keywords":{}}],["perf",{"_index":4811,"title":{},"content":{"841":{"position":[[1080,5]]}},"keywords":{}}],["perfect",{"_index":1034,"title":{},"content":{"102":{"position":[[107,7]]},"263":{"position":[[480,7]]},"287":{"position":[[919,7]]},"373":{"position":[[665,7]]},"384":{"position":[[11,7]]}},"keywords":{}}],["perfectli",{"_index":3155,"title":{},"content":{"486":{"position":[[207,9]]}},"keywords":{}}],["perfekt""how",{"_index":1535,"title":{},"content":{"245":{"position":[[85,22]]}},"keywords":{}}],["perform",{"_index":63,"title":{"60":{"position":[[0,11]]},"70":{"position":[[24,12]]},"101":{"position":[[24,12]]},"138":{"position":[[13,11]]},"194":{"position":[[13,11]]},"227":{"position":[[24,12]]},"265":{"position":[[10,11]]},"277":{"position":[[14,11]]},"283":{"position":[[6,12]]},"342":{"position":[[13,11]]},"369":{"position":[[19,12]]},"376":{"position":[[0,11]]},"385":{"position":[[0,11]]},"395":{"position":[[35,12]]},"399":{"position":[[0,11]]},"400":{"position":[[0,11]]},"401":{"position":[[0,11]]},"402":{"position":[[10,11]]},"415":{"position":[[12,12]]},"462":{"position":[[0,11]]},"468":{"position":[[0,11]]},"507":{"position":[[13,11]]},"527":{"position":[[13,11]]},"547":{"position":[[0,11]]},"587":{"position":[[13,11]]},"607":{"position":[[0,11]]},"620":{"position":[[0,11]]},"641":{"position":[[0,11]]},"703":{"position":[[0,11]]},"794":{"position":[[0,11]]},"1120":{"position":[[17,12]]},"1137":{"position":[[10,11]]},"1152":{"position":[[0,11]]},"1191":{"position":[[10,11]]},"1193":{"position":[[0,11]]},"1195":{"position":[[23,11]]},"1196":{"position":[[27,11]]},"1209":{"position":[[5,12]]},"1270":{"position":[[0,11]]},"1292":{"position":[[0,11]]}},"content":{"4":{"position":[[108,11]]},"5":{"position":[[67,11]]},"6":{"position":[[95,11]]},"17":{"position":[[207,11]]},"24":{"position":[[481,11],[694,11]]},"28":{"position":[[120,11]]},"31":{"position":[[235,12],[270,11]]},"33":{"position":[[122,11]]},"34":{"position":[[153,7]]},"46":{"position":[[252,12]]},"51":{"position":[[122,12]]},"52":{"position":[[44,7]]},"58":{"position":[[144,11]]},"59":{"position":[[137,12]]},"60":{"position":[[11,11]]},"61":{"position":[[357,11]]},"65":{"position":[[866,12],[1886,12]]},"66":{"position":[[139,11],[229,11]]},"70":{"position":[[93,11],[202,11]]},"78":{"position":[[95,11]]},"81":{"position":[[124,12]]},"87":{"position":[[184,12]]},"92":{"position":[[166,12]]},"101":{"position":[[29,11],[205,11]]},"106":{"position":[[187,11]]},"107":{"position":[[152,11]]},"108":{"position":[[191,12]]},"111":{"position":[[149,12]]},"114":{"position":[[710,12]]},"117":{"position":[[285,11]]},"131":{"position":[[323,11]]},"138":{"position":[[18,12],[264,11]]},"140":{"position":[[182,7]]},"141":{"position":[[45,12]]},"146":{"position":[[163,11]]},"166":{"position":[[14,11],[58,12],[293,11]]},"170":{"position":[[482,12]]},"173":{"position":[[192,12],[744,11],[1950,7],[2652,11]]},"174":{"position":[[1169,11],[1739,11],[2495,12]]},"177":{"position":[[110,11]]},"178":{"position":[[375,12]]},"181":{"position":[[151,10]]},"189":{"position":[[773,11]]},"193":{"position":[[92,12]]},"194":{"position":[[48,11]]},"197":{"position":[[47,12],[209,12]]},"204":{"position":[[172,9]]},"212":{"position":[[233,7]]},"216":{"position":[[318,7]]},"224":{"position":[[220,9]]},"234":{"position":[[151,9],[240,11]]},"236":{"position":[[130,12]]},"241":{"position":[[532,12]]},"265":{"position":[[212,9]]},"266":{"position":[[295,11]]},"267":{"position":[[170,11],[1001,7]]},"271":{"position":[[155,11]]},"276":{"position":[[43,7]]},"277":{"position":[[269,12]]},"283":{"position":[[18,11],[403,12]]},"287":{"position":[[1259,11]]},"294":{"position":[[224,12]]},"311":{"position":[[178,11]]},"314":{"position":[[150,12],[968,11]]},"318":{"position":[[301,11],[496,11]]},"336":{"position":[[297,11]]},"342":{"position":[[57,12]]},"345":{"position":[[134,12]]},"346":{"position":[[847,12]]},"352":{"position":[[170,10]]},"357":{"position":[[191,7]]},"366":{"position":[[372,12]]},"369":{"position":[[40,11],[418,11],[616,11],[1406,11]]},"370":{"position":[[232,12]]},"373":{"position":[[547,12]]},"376":{"position":[[13,11]]},"383":{"position":[[540,11]]},"385":{"position":[[257,11]]},"392":{"position":[[2995,11],[3169,12],[3369,11]]},"393":{"position":[[622,11]]},"396":{"position":[[82,12],[1502,11]]},"398":{"position":[[61,7],[166,12],[3152,11]]},"399":{"position":[[27,11],[207,11],[431,11],[521,11]]},"400":{"position":[[353,11],[488,8]]},"401":{"position":[[741,12],[860,11]]},"402":{"position":[[52,11],[910,11],[1043,11],[1670,11],[1754,11],[2290,12],[2565,11],[2723,11]]},"408":{"position":[[1710,7],[1990,11],[3688,11],[4236,12],[4395,12],[4980,11],[5312,11],[5543,11]]},"410":{"position":[[1,11]]},"412":{"position":[[4976,12],[9464,11],[9652,11],[10546,11],[10725,11]]},"419":{"position":[[960,11]]},"420":{"position":[[1526,11]]},"427":{"position":[[254,9],[349,11],[790,11],[951,7],[1194,11]]},"429":{"position":[[28,12]]},"430":{"position":[[531,12],[771,11],[839,11]]},"432":{"position":[[704,11],[1417,11]]},"433":{"position":[[161,11],[245,11]]},"434":{"position":[[316,12]]},"442":{"position":[[116,11]]},"446":{"position":[[797,11]]},"447":{"position":[[43,11]]},"450":{"position":[[512,11],[634,11]]},"452":{"position":[[558,11]]},"454":{"position":[[58,11]]},"457":{"position":[[687,11]]},"459":{"position":[[183,10]]},"462":{"position":[[78,11],[316,11],[417,11],[821,11],[1002,11]]},"464":{"position":[[1092,11]]},"465":{"position":[[426,7]]},"466":{"position":[[392,8]]},"469":{"position":[[52,11],[135,11],[442,11],[1101,11],[1209,11],[1297,11],[1400,12]]},"470":{"position":[[605,12]]},"483":{"position":[[1013,11]]},"485":{"position":[[217,11]]},"489":{"position":[[352,7]]},"490":{"position":[[703,12]]},"507":{"position":[[1,11]]},"514":{"position":[[182,10]]},"521":{"position":[[306,11]]},"527":{"position":[[63,12]]},"528":{"position":[[71,12]]},"534":{"position":[[87,11]]},"535":{"position":[[458,7]]},"538":{"position":[[136,11]]},"539":{"position":[[44,7]]},"545":{"position":[[65,12]]},"546":{"position":[[170,12],[315,12]]},"547":{"position":[[11,11]]},"554":{"position":[[203,11]]},"556":{"position":[[1048,11],[1063,11],[1516,11]]},"557":{"position":[[437,11]]},"559":{"position":[[1472,7]]},"574":{"position":[[398,12]]},"581":{"position":[[698,12]]},"587":{"position":[[154,11]]},"588":{"position":[[123,11]]},"594":{"position":[[85,11]]},"595":{"position":[[486,7]]},"598":{"position":[[136,11]]},"599":{"position":[[44,7]]},"605":{"position":[[65,12]]},"606":{"position":[[170,12],[305,12]]},"607":{"position":[[11,11]]},"613":{"position":[[413,11]]},"618":{"position":[[486,12]]},"620":{"position":[[15,11],[267,11],[408,11],[629,11]]},"624":{"position":[[1639,11]]},"634":{"position":[[199,8]]},"641":{"position":[[1,10],[107,11],[247,8]]},"643":{"position":[[168,12]]},"644":{"position":[[203,11]]},"656":{"position":[[151,11]]},"662":{"position":[[769,11]]},"690":{"position":[[257,8]]},"703":{"position":[[713,11],[793,11],[1660,11]]},"704":{"position":[[392,11]]},"705":{"position":[[493,11]]},"709":{"position":[[647,12],[813,11],[1029,11]]},"710":{"position":[[788,11],[2185,11]]},"714":{"position":[[570,7],[908,7]]},"716":{"position":[[90,11]]},"723":{"position":[[159,9],[414,9],[1707,11],[2203,7],[2598,9]]},"749":{"position":[[21140,11],[21624,12]]},"772":{"position":[[2522,11]]},"774":{"position":[[25,11],[888,11]]},"783":{"position":[[67,7]]},"793":{"position":[[1264,11],[1286,11],[1304,11]]},"796":{"position":[[232,12]]},"797":{"position":[[140,11]]},"798":{"position":[[67,12],[452,11],[798,12]]},"800":{"position":[[180,11]]},"801":{"position":[[68,11],[796,11]]},"802":{"position":[[105,12],[917,11]]},"821":{"position":[[928,9]]},"828":{"position":[[483,11]]},"836":{"position":[[1686,11]]},"837":{"position":[[670,11]]},"838":{"position":[[1446,11],[3146,11]]},"839":{"position":[[316,11]]},"841":{"position":[[865,11]]},"875":{"position":[[9418,11]]},"894":{"position":[[126,11]]},"945":{"position":[[362,11]]},"947":{"position":[[61,11]]},"951":{"position":[[72,11]]},"962":{"position":[[280,12],[431,11]]},"965":{"position":[[77,11],[299,12]]},"966":{"position":[[400,11]]},"983":{"position":[[88,12]]},"989":{"position":[[12,12]]},"1005":{"position":[[164,11]]},"1013":{"position":[[12,12]]},"1052":{"position":[[113,11]]},"1065":{"position":[[1604,11]]},"1066":{"position":[[254,12],[604,12]]},"1067":{"position":[[147,12],[164,11],[638,11],[997,11],[1783,11]]},"1068":{"position":[[512,12]]},"1069":{"position":[[54,11]]},"1071":{"position":[[491,11]]},"1072":{"position":[[396,12],[877,11],[1117,7],[1509,11],[2580,7]]},"1083":{"position":[[307,11]]},"1085":{"position":[[164,11],[978,7]]},"1090":{"position":[[120,12]]},"1093":{"position":[[423,11]]},"1094":{"position":[[619,11]]},"1098":{"position":[[127,11]]},"1099":{"position":[[119,11]]},"1105":{"position":[[1021,11]]},"1107":{"position":[[940,11]]},"1108":{"position":[[577,11]]},"1112":{"position":[[586,11]]},"1120":{"position":[[47,12],[426,10],[520,11],[706,11]]},"1124":{"position":[[577,12],[1730,11]]},"1125":{"position":[[699,12]]},"1132":{"position":[[193,12]]},"1134":{"position":[[681,11]]},"1137":{"position":[[14,11],[238,11]]},"1138":{"position":[[369,12],[559,11]]},"1141":{"position":[[153,12]]},"1143":{"position":[[212,11]]},"1150":{"position":[[360,7]]},"1152":{"position":[[5,11],[116,11]]},"1157":{"position":[[332,11]]},"1161":{"position":[[21,11]]},"1164":{"position":[[47,11]]},"1175":{"position":[[430,11]]},"1180":{"position":[[21,11]]},"1186":{"position":[[125,12]]},"1188":{"position":[[360,7]]},"1191":{"position":[[58,12],[437,11],[556,11],[647,11]]},"1192":{"position":[[176,11],[414,12]]},"1193":{"position":[[36,11],[149,11]]},"1195":{"position":[[5,11],[188,11]]},"1198":{"position":[[432,12],[928,11]]},"1200":{"position":[[21,11]]},"1206":{"position":[[444,11]]},"1207":{"position":[[253,10]]},"1209":{"position":[[169,11],[354,11]]},"1222":{"position":[[712,11]]},"1230":{"position":[[202,12]]},"1231":{"position":[[131,12],[270,12]]},"1243":{"position":[[92,11]]},"1244":{"position":[[78,11]]},"1246":{"position":[[295,11],[615,11],[1029,11],[1525,11]]},"1247":{"position":[[42,11],[354,10],[527,10],[720,10]]},"1250":{"position":[[262,11],[439,11]]},"1271":{"position":[[657,11]]},"1276":{"position":[[366,11]]},"1287":{"position":[[54,7]]},"1292":{"position":[[19,11]]},"1294":{"position":[[82,12],[196,11],[1815,11]]},"1295":{"position":[[649,11],[771,11]]},"1296":{"position":[[27,11],[534,12],[1647,11]]},"1297":{"position":[[183,12],[446,11],[477,11]]},"1298":{"position":[[56,11]]},"1299":{"position":[[48,11]]},"1304":{"position":[[1487,11]]},"1309":{"position":[[893,12]]},"1315":{"position":[[1037,11]]},"1324":{"position":[[976,7]]}},"keywords":{}}],["performance.big",{"_index":2902,"title":{},"content":{"430":{"position":[[399,15]]}},"keywords":{}}],["performance.memori",{"_index":1107,"title":{},"content":{"131":{"position":[[694,18]]}},"keywords":{}}],["performance.sqlit",{"_index":3717,"title":{},"content":{"640":{"position":[[248,18]]}},"keywords":{}}],["performance.tri",{"_index":5282,"title":{},"content":{"913":{"position":[[150,15]]}},"keywords":{}}],["performance.vers",{"_index":5063,"title":{},"content":{"876":{"position":[[379,19]]}},"keywords":{}}],["performancey",{"_index":17,"title":{},"content":{"1":{"position":[[242,14]]}},"keywords":{}}],["perhap",{"_index":2745,"title":{},"content":{"412":{"position":[[11374,7]]}},"keywords":{}}],["period",{"_index":1858,"title":{},"content":{"303":{"position":[[1501,7]]},"305":{"position":[[238,6]]},"411":{"position":[[501,12],[716,8]]},"412":{"position":[[667,8]]},"618":{"position":[[310,6]]},"1301":{"position":[[200,12]]}},"keywords":{}}],["perk",{"_index":2859,"title":{},"content":{"421":{"position":[[1230,5]]}},"keywords":{}}],["perman",{"_index":453,"title":{},"content":{"28":{"position":[[191,9]]},"305":{"position":[[384,9]]},"799":{"position":[[126,11]]}},"keywords":{}}],["permanentlycal",{"_index":5904,"title":{},"content":{"1085":{"position":[[3590,15]]}},"keywords":{}}],["permiss",{"_index":359,"title":{"701":{"position":[[0,11]]}},"content":{"21":{"position":[[103,10]]},"299":{"position":[[488,10]]},"408":{"position":[[688,11]]},"412":{"position":[[12379,10],[12618,10],[13033,12],[13078,11]]},"662":{"position":[[883,10]]},"701":{"position":[[262,10],[510,10]]},"861":{"position":[[2201,10],[2254,11],[2379,11],[2408,10]]},"1198":{"position":[[1961,10]]}},"keywords":{}}],["permissions).conflict",{"_index":6074,"title":{},"content":{"1148":{"position":[[343,21]]}},"keywords":{}}],["permit",{"_index":2536,"title":{},"content":{"408":{"position":[[1166,7]]}},"keywords":{}}],["persist",{"_index":10,"title":{"266":{"position":[[0,11]]},"697":{"position":[[30,11]]},"772":{"position":[[0,10]]},"774":{"position":[[17,11]]},"1113":{"position":[[19,10]]},"1115":{"position":[[17,12]]},"1184":{"position":[[18,10]]},"1185":{"position":[[12,12]]},"1192":{"position":[[0,10],[19,10]]},"1300":{"position":[[11,12]]}},"content":{"1":{"position":[[127,10],[269,10]]},"28":{"position":[[178,7],[285,11]]},"30":{"position":[[129,12]]},"31":{"position":[[60,11]]},"32":{"position":[[21,10],[182,11],[225,7]]},"34":{"position":[[191,7]]},"35":{"position":[[549,10]]},"40":{"position":[[561,11],[770,12]]},"42":{"position":[[234,11],[357,12]]},"117":{"position":[[194,10]]},"131":{"position":[[43,10],[548,12],[604,10],[739,10],[892,12]]},"162":{"position":[[636,10]]},"178":{"position":[[68,10]]},"188":{"position":[[261,11],[346,8]]},"189":{"position":[[435,7],[577,12]]},"266":{"position":[[64,11],[152,7],[492,11],[971,12]]},"267":{"position":[[1373,11]]},"287":{"position":[[542,12]]},"300":{"position":[[528,10],[826,10]]},"305":{"position":[[416,10]]},"365":{"position":[[525,10],[696,11],[850,10]]},"408":{"position":[[1898,10],[3803,10],[4135,10]]},"412":{"position":[[7655,11]]},"424":{"position":[[119,12]]},"430":{"position":[[932,12],[986,10]]},"436":{"position":[[25,11]]},"437":{"position":[[252,11]]},"440":{"position":[[163,9]]},"451":{"position":[[356,7],[786,8]]},"454":{"position":[[801,10]]},"463":{"position":[[1261,12]]},"464":{"position":[[186,7],[669,7]]},"470":{"position":[[206,10]]},"504":{"position":[[302,11]]},"554":{"position":[[413,10],[695,10]]},"576":{"position":[[310,12]]},"581":{"position":[[119,10],[711,12]]},"617":{"position":[[486,10]]},"618":{"position":[[762,10]]},"621":{"position":[[91,10]]},"622":{"position":[[51,10]]},"659":{"position":[[66,10]]},"660":{"position":[[288,11]]},"662":{"position":[[706,10]]},"723":{"position":[[1319,10],[1381,9]]},"772":{"position":[[67,9]]},"773":{"position":[[252,9]]},"774":{"position":[[74,11],[283,10],[419,11],[904,11],[1098,11]]},"872":{"position":[[1495,10]]},"898":{"position":[[2059,10]]},"958":{"position":[[386,9]]},"985":{"position":[[108,9]]},"1090":{"position":[[148,10],[237,11],[366,10],[1115,11],[1222,10]]},"1092":{"position":[[189,9]]},"1114":{"position":[[87,9]]},"1120":{"position":[[112,8],[249,7]]},"1157":{"position":[[533,7]]},"1161":{"position":[[285,10]]},"1162":{"position":[[200,9]]},"1163":{"position":[[214,11],[337,10]]},"1164":{"position":[[908,9],[1060,11]]},"1168":{"position":[[4,11]]},"1172":{"position":[[136,7],[443,11]]},"1173":{"position":[[59,10]]},"1174":{"position":[[164,8]]},"1175":{"position":[[93,8],[147,11],[206,9],[274,7],[390,11],[542,11],[577,9]]},"1180":{"position":[[285,10]]},"1181":{"position":[[266,9]]},"1182":{"position":[[214,11],[337,10]]},"1184":{"position":[[297,10]]},"1185":{"position":[[136,7],[226,10]]},"1192":{"position":[[44,11],[250,10],[660,10],[698,10]]},"1208":{"position":[[1766,7]]},"1239":{"position":[[181,11]]},"1246":{"position":[[1458,12]]},"1276":{"position":[[120,11]]},"1292":{"position":[[485,11],[594,8]]},"1299":{"position":[[316,9]]},"1300":{"position":[[72,10],[151,9],[315,10],[455,10],[511,10],[588,8],[707,7],[882,7]]},"1324":{"position":[[445,10]]}},"keywords":{}}],["persistence.l",{"_index":1340,"title":{},"content":{"208":{"position":[[239,16]]}},"keywords":{}}],["persistence.memori",{"_index":3235,"title":{},"content":{"504":{"position":[[334,18]]}},"keywords":{}}],["persistence.sqlit",{"_index":1674,"title":{},"content":{"287":{"position":[[1062,18]]}},"keywords":{}}],["persistenceth",{"_index":3988,"title":{},"content":{"710":{"position":[[592,14]]}},"keywords":{}}],["persistenceus",{"_index":4793,"title":{},"content":{"838":{"position":[[1296,14]]}},"keywords":{}}],["persistet",{"_index":2108,"title":{},"content":{"365":{"position":[[320,9]]}},"keywords":{}}],["person",{"_index":1402,"title":{},"content":{"218":{"position":[[147,8]]},"291":{"position":[[386,8]]},"356":{"position":[[710,12]]},"450":{"position":[[142,16]]},"482":{"position":[[47,9]]},"550":{"position":[[217,8]]},"564":{"position":[[1111,8]]},"638":{"position":[[79,9]]},"1022":{"position":[[952,6]]}},"keywords":{}}],["phase",{"_index":2915,"title":{},"content":{"435":{"position":[[145,6]]}},"keywords":{}}],["philosophi",{"_index":2076,"title":{},"content":{"359":{"position":[[187,11]]},"502":{"position":[[268,10]]},"514":{"position":[[279,10]]}},"keywords":{}}],["phone",{"_index":2331,"title":{},"content":{"395":{"position":[[355,5]]},"408":{"position":[[4956,6]]},"412":{"position":[[6899,5],[9385,6],[10692,5]]},"415":{"position":[[177,7]]},"417":{"position":[[163,5]]}},"keywords":{}}],["phonegap",{"_index":141,"title":{},"content":{"10":{"position":[[419,8]]}},"keywords":{}}],["phonet",{"_index":4044,"title":{},"content":{"723":{"position":[[2386,8]]}},"keywords":{}}],["phrase",{"_index":2797,"title":{},"content":{"419":{"position":[[73,6]]},"723":{"position":[[2344,8]]}},"keywords":{}}],["physic",{"_index":2146,"title":{},"content":{"377":{"position":[[93,8]]},"408":{"position":[[2398,8],[2624,8]]},"419":{"position":[[1800,8]]},"550":{"position":[[64,8]]},"780":{"position":[[366,8]]},"986":{"position":[[1056,10]]},"1091":{"position":[[41,8]]},"1093":{"position":[[69,8],[297,10]]},"1295":{"position":[[346,8]]}},"keywords":{}}],["pick",{"_index":1571,"title":{},"content":{"254":{"position":[[408,4]]},"369":{"position":[[1531,4]]},"396":{"position":[[953,4]]},"402":{"position":[[850,6],[967,6]]},"412":{"position":[[3352,4]]},"481":{"position":[[405,4]]},"640":{"position":[[47,4]]},"698":{"position":[[752,4]]},"776":{"position":[[202,4]]},"796":{"position":[[61,4]]},"797":{"position":[[68,7]]},"1066":{"position":[[208,4]]},"1172":{"position":[[503,4]]}},"keywords":{}}],["piec",{"_index":1649,"title":{},"content":{"279":{"position":[[257,6]]},"391":{"position":[[332,5]]},"450":{"position":[[72,6]]},"784":{"position":[[672,5]]},"971":{"position":[[54,5]]},"1319":{"position":[[230,5]]}},"keywords":{}}],["pii",{"_index":3712,"title":{},"content":{"638":{"position":[[75,3]]}},"keywords":{}}],["pillar",{"_index":3288,"title":{},"content":{"530":{"position":[[462,7]]}},"keywords":{}}],["pin",{"_index":3378,"title":{},"content":{"556":{"position":[[1817,8],[1839,7],[1901,7],[1944,6]]}},"keywords":{}}],["pin"",{"_index":2818,"title":{},"content":{"419":{"position":[[1734,9]]}},"keywords":{}}],["ping",{"_index":3577,"title":{},"content":{"611":{"position":[[1181,4]]}},"keywords":{}}],["pinia",{"_index":3487,"title":{},"content":{"576":{"position":[[170,5]]},"590":{"position":[[306,5]]}},"keywords":{}}],["piotr",{"_index":6517,"title":{},"content":{"1311":{"position":[[1544,8]]}},"keywords":{}}],["pipe",{"_index":811,"title":{"54":{"position":[[32,6]]},"130":{"position":[[22,4]]},"143":{"position":[[10,4]]}},"content":{"130":{"position":[[28,5],[187,4]]},"143":{"position":[[17,4],[99,5],[391,5],[674,8]]},"391":{"position":[[612,4]]},"493":{"position":[[19,4]]},"1067":{"position":[[2168,10]]}},"keywords":{}}],["pipe(text",{"_index":2223,"title":{},"content":{"391":{"position":[[659,10]]}},"keywords":{}}],["pipelin",{"_index":2216,"title":{"1030":{"position":[[0,8]]},"1031":{"position":[[0,8]]},"1033":{"position":[[0,9]]}},"content":{"391":{"position":[[433,8]]},"392":{"position":[[2378,8],[2500,8],[2618,8],[2692,10],[4524,8],[4598,10]]},"397":{"position":[[1743,8]]},"1020":{"position":[[1,9],[152,8],[179,9],[339,8],[405,10]]},"1022":{"position":[[435,8]]},"1023":{"position":[[21,8],[94,8]]},"1024":{"position":[[94,8],[188,8]]},"1026":{"position":[[33,8],[128,8]]},"1027":{"position":[[38,8],[156,8]]},"1028":{"position":[[41,8],[103,8]]},"1030":{"position":[[97,8]]},"1031":{"position":[[1,8],[222,8]]},"1033":{"position":[[9,8],[186,9],[277,10],[386,8],[433,8],[682,8],[961,8]]}},"keywords":{}}],["pipeline('featur",{"_index":2219,"title":{},"content":{"391":{"position":[[503,17]]}},"keywords":{}}],["pipeline.awaitidl",{"_index":2417,"title":{},"content":{"398":{"position":[[1998,21]]}},"keywords":{}}],["pipeline.html",{"_index":4058,"title":{},"content":{"724":{"position":[[1133,13]]}},"keywords":{}}],["pipelinea",{"_index":5659,"title":{},"content":{"1033":{"position":[[481,9]]}},"keywords":{}}],["pipelinea.awaitidl",{"_index":5665,"title":{},"content":{"1033":{"position":[[838,22]]}},"keywords":{}}],["pipelines.pref",{"_index":5668,"title":{},"content":{"1033":{"position":[[1014,16]]}},"keywords":{}}],["pipepromis",{"_index":2218,"title":{},"content":{"391":{"position":[[489,11],[625,12]]}},"keywords":{}}],["pitfal",{"_index":1404,"title":{},"content":{"223":{"position":[[371,8]]}},"keywords":{}}],["pivot",{"_index":1163,"title":{},"content":{"152":{"position":[[163,7]]},"510":{"position":[[142,7]]},"530":{"position":[[77,7]]},"912":{"position":[[91,7]]}},"keywords":{}}],["pl1",{"_index":4149,"title":{},"content":{"749":{"position":[[1311,3]]}},"keywords":{}}],["pl3",{"_index":4150,"title":{},"content":{"749":{"position":[[1399,3]]}},"keywords":{}}],["place",{"_index":1970,"title":{},"content":{"346":{"position":[[64,6]]},"397":{"position":[[74,5]]},"411":{"position":[[2145,5]]},"433":{"position":[[187,5]]},"698":{"position":[[2266,6]]},"701":{"position":[[650,6]]},"761":{"position":[[29,5]]},"785":{"position":[[501,5]]},"875":{"position":[[6019,6]]},"1105":{"position":[[900,6]]}},"keywords":{}}],["placeholder="ent",{"_index":3399,"title":{},"content":{"559":{"position":[[674,23]]}},"keywords":{}}],["plain",{"_index":510,"title":{"47":{"position":[[10,5]]},"358":{"position":[[26,5]]},"535":{"position":[[15,5]]},"595":{"position":[[15,5]]}},"content":{"33":{"position":[[85,5]]},"51":{"position":[[153,5]]},"408":{"position":[[4018,5]]},"439":{"position":[[618,5]]},"453":{"position":[[701,5]]},"459":{"position":[[61,5]]},"535":{"position":[[915,5]]},"538":{"position":[[89,5]]},"595":{"position":[[990,5]]},"598":{"position":[[89,5]]},"619":{"position":[[359,5]]},"670":{"position":[[305,5]]},"688":{"position":[[467,5],[764,5]]},"710":{"position":[[1237,5]]},"749":{"position":[[4175,5],[11974,5]]},"766":{"position":[[20,5]]},"772":{"position":[[1973,5]]},"888":{"position":[[230,5]]},"908":{"position":[[239,5]]},"918":{"position":[[39,5]]},"968":{"position":[[356,5]]},"1020":{"position":[[237,5]]},"1051":{"position":[[32,5]]},"1085":{"position":[[54,5]]},"1102":{"position":[[104,5],[427,5]]},"1124":{"position":[[30,5],[701,5]]},"1132":{"position":[[81,5],[815,5]]},"1140":{"position":[[403,5]]},"1162":{"position":[[453,5]]},"1174":{"position":[[14,5]]},"1175":{"position":[[12,5]]},"1181":{"position":[[540,5]]},"1208":{"position":[[298,5]]},"1209":{"position":[[220,5]]},"1241":{"position":[[38,5]]},"1243":{"position":[[37,5]]},"1246":{"position":[[1859,5]]},"1252":{"position":[[69,5]]}},"keywords":{}}],["plaindata.ag",{"_index":4531,"title":{},"content":{"767":{"position":[[401,13]]}},"keywords":{}}],["plaindata.anyfield",{"_index":4544,"title":{},"content":{"768":{"position":[[370,18]]}},"keywords":{}}],["plainrespons",{"_index":5155,"title":{},"content":{"888":{"position":[[585,14],[687,13],[1034,14]]},"889":{"position":[[614,15]]}},"keywords":{}}],["plainresponse.conflict",{"_index":5165,"title":{},"content":{"889":{"position":[[726,24]]}},"keywords":{}}],["plan",{"_index":433,"title":{},"content":{"26":{"position":[[372,4]]},"298":{"position":[[897,4]]},"303":{"position":[[13,4]]},"314":{"position":[[589,4]]},"412":{"position":[[14330,4]]},"420":{"position":[[1397,8]]},"700":{"position":[[388,4]]},"839":{"position":[[1248,4],[1405,6]]},"1071":{"position":[[381,4]]}},"keywords":{}}],["planer",{"_index":4655,"title":{},"content":{"798":{"position":[[850,6]]},"1066":{"position":[[656,6]]},"1071":{"position":[[371,6]]}},"keywords":{}}],["planner",{"_index":4636,"title":{"796":{"position":[[15,7]]}},"content":{"797":{"position":[[20,7]]},"1066":{"position":[[68,7],[154,7]]}},"keywords":{}}],["platform",{"_index":195,"title":{"72":{"position":[[35,10]]},"112":{"position":[[35,10]]},"254":{"position":[[9,9]]},"384":{"position":[[6,8]]}},"content":{"14":{"position":[[17,8]]},"36":{"position":[[395,9]]},"37":{"position":[[20,8]]},"43":{"position":[[706,9]]},"47":{"position":[[1348,10]]},"72":{"position":[[83,10]]},"112":{"position":[[76,10],[280,10]]},"174":{"position":[[2585,8],[2682,10],[2787,8]]},"177":{"position":[[162,9]]},"207":{"position":[[325,8]]},"239":{"position":[[81,10]]},"269":{"position":[[145,8],[271,9]]},"288":{"position":[[187,10]]},"299":{"position":[[64,10]]},"364":{"position":[[286,10]]},"375":{"position":[[463,10]]},"384":{"position":[[33,8],[427,9]]},"388":{"position":[[473,9]]},"418":{"position":[[413,9]]},"441":{"position":[[475,8]]},"445":{"position":[[2138,8],[2195,8],[2366,10],[2527,10]]},"446":{"position":[[521,9],[1003,9],[1091,8],[1227,8]]},"447":{"position":[[446,8]]},"500":{"position":[[292,10]]},"535":{"position":[[1174,8]]},"581":{"position":[[728,8]]},"595":{"position":[[1251,8]]},"611":{"position":[[339,10]]},"613":{"position":[[497,10],[863,9]]},"644":{"position":[[116,9]]},"830":{"position":[[159,8]]},"832":{"position":[[390,8]]}},"keywords":{}}],["platforms.onlin",{"_index":2787,"title":{},"content":{"416":{"position":[[310,16]]}},"keywords":{}}],["play",{"_index":1062,"title":{},"content":{"117":{"position":[[11,4]]},"152":{"position":[[156,4]]},"178":{"position":[[11,4]]},"447":{"position":[[18,4]]},"534":{"position":[[49,4]]},"594":{"position":[[47,4]]},"824":{"position":[[180,4]]},"890":{"position":[[957,4]]}},"keywords":{}}],["player",{"_index":3243,"title":{},"content":{"510":{"position":[[150,7]]},"1006":{"position":[[242,7]]},"1007":{"position":[[336,6],[372,6],[787,6],[869,6]]},"1008":{"position":[[168,6]]}},"keywords":{}}],["player'",{"_index":5563,"title":{},"content":{"1007":{"position":[[1007,8],[1971,8]]}},"keywords":{}}],["pleas",{"_index":3742,"title":{},"content":{"650":{"position":[[95,6]]},"749":{"position":[[12799,6],[24120,6]]},"824":{"position":[[317,6],[526,6]]},"889":{"position":[[1073,6]]},"1278":{"position":[[114,6]]}},"keywords":{}}],["plethora",{"_index":3217,"title":{},"content":{"500":{"position":[[373,8]]}},"keywords":{}}],["plu",{"_index":1884,"title":{},"content":{"312":{"position":[[234,5]]}},"keywords":{}}],["pluggabl",{"_index":312,"title":{},"content":{"18":{"position":[[325,9]]},"383":{"position":[[41,9]]}},"keywords":{}}],["plugin",{"_index":45,"title":{"165":{"position":[[17,8]]},"192":{"position":[[17,8]]},"291":{"position":[[26,7]]},"383":{"position":[[5,6]]},"553":{"position":[[29,8]]},"645":{"position":[[10,6]]},"655":{"position":[[18,6]]},"677":{"position":[[10,6]]},"692":{"position":[[9,6]]},"717":{"position":[[26,8]]},"738":{"position":[[24,7]]},"744":{"position":[[12,6]]},"745":{"position":[[17,7]]},"802":{"position":[[9,7]]},"803":{"position":[[9,7]]},"863":{"position":[[40,7]]},"868":{"position":[[9,6]]},"869":{"position":[[20,6]]},"895":{"position":[[21,6]]},"896":{"position":[[34,7]]},"904":{"position":[[39,7]]},"915":{"position":[[20,7]]},"1012":{"position":[[24,7]]},"1013":{"position":[[13,6]]},"1064":{"position":[[14,7]]},"1152":{"position":[[44,8]]},"1222":{"position":[[19,7]]},"1246":{"position":[[16,8]]},"1284":{"position":[[12,7]]}},"content":{"2":{"position":[[265,6]]},"6":{"position":[[424,6]]},"10":{"position":[[198,6]]},"11":{"position":[[255,7]]},"14":{"position":[[1237,7]]},"17":{"position":[[347,6]]},"147":{"position":[[176,7]]},"158":{"position":[[102,7],[170,7]]},"164":{"position":[[305,7]]},"165":{"position":[[38,7],[129,7],[318,8]]},"170":{"position":[[243,8]]},"184":{"position":[[219,8]]},"192":{"position":[[27,7],[131,7],[310,7]]},"211":{"position":[[566,7]]},"249":{"position":[[445,7]]},"255":{"position":[[1676,6]]},"260":{"position":[[19,6]]},"291":{"position":[[37,7]]},"310":{"position":[[100,7]]},"314":{"position":[[228,8]]},"315":{"position":[[52,6],[100,7],[153,7]]},"360":{"position":[[467,7]]},"361":{"position":[[339,6]]},"366":{"position":[[87,7]]},"367":{"position":[[433,8],[487,8]]},"368":{"position":[[91,8]]},"377":{"position":[[329,8]]},"381":{"position":[[267,8]]},"387":{"position":[[303,8]]},"390":{"position":[[1841,7]]},"392":{"position":[[2387,7]]},"402":{"position":[[2653,8],[2694,7],[2798,6]]},"403":{"position":[[217,6]]},"420":{"position":[[999,7],[1084,8]]},"460":{"position":[[378,7]]},"469":{"position":[[899,6]]},"481":{"position":[[228,7],[414,6]]},"482":{"position":[[80,7]]},"525":{"position":[[427,7],[507,7],[679,6]]},"551":{"position":[[198,7]]},"553":{"position":[[70,7]]},"554":{"position":[[28,8],[47,7],[127,7],[145,6],[296,7],[893,6]]},"556":{"position":[[1126,7],[1409,6],[1749,7]]},"557":{"position":[[320,8],[406,8]]},"563":{"position":[[171,6]]},"564":{"position":[[177,7]]},"565":{"position":[[88,7]]},"566":{"position":[[1029,7],[1337,7]]},"567":{"position":[[627,7]]},"570":{"position":[[940,8]]},"579":{"position":[[87,7],[906,6]]},"582":{"position":[[302,8]]},"590":{"position":[[165,7]]},"602":{"position":[[115,7]]},"614":{"position":[[275,8]]},"632":{"position":[[596,7],[745,7]]},"640":{"position":[[318,7]]},"641":{"position":[[371,7]]},"642":{"position":[[105,7]]},"644":{"position":[[91,7]]},"655":{"position":[[351,6]]},"662":{"position":[[435,7],[1037,7]]},"674":{"position":[[82,8]]},"676":{"position":[[57,6]]},"678":{"position":[[142,7]]},"680":{"position":[[63,6],[262,6],[335,6],[429,6]]},"683":{"position":[[33,7]]},"686":{"position":[[708,7],[802,6]]},"688":{"position":[[16,6]]},"693":{"position":[[154,6],[288,6]]},"710":{"position":[[867,7],[1391,8]]},"716":{"position":[[16,6],[496,6]]},"717":{"position":[[24,7],[79,6],[181,6],[457,6],[763,6],[1036,6]]},"718":{"position":[[53,6],[336,6]]},"719":{"position":[[242,6]]},"723":{"position":[[36,6],[380,7],[1009,6],[2099,6],[2522,6]]},"734":{"position":[[21,6],[117,7]]},"738":{"position":[[68,7]]},"746":{"position":[[17,6]]},"747":{"position":[[17,6]]},"749":{"position":[[1021,6],[1321,6],[1340,7],[1405,6],[20938,6]]},"756":{"position":[[37,8]]},"793":{"position":[[963,7],[1225,7]]},"798":{"position":[[982,6]]},"801":{"position":[[925,6]]},"802":{"position":[[27,7],[142,6],[637,8]]},"804":{"position":[[37,6],[55,7]]},"806":{"position":[[549,7],[757,7]]},"824":{"position":[[597,7]]},"829":{"position":[[258,8]]},"830":{"position":[[254,6]]},"836":{"position":[[301,7]]},"837":{"position":[[1489,8]]},"838":{"position":[[895,6],[1367,7],[1525,7]]},"845":{"position":[[78,8]]},"847":{"position":[[123,8]]},"851":{"position":[[30,6]]},"860":{"position":[[1091,6]]},"861":{"position":[[2079,6]]},"866":{"position":[[152,6]]},"868":{"position":[[9,6]]},"871":{"position":[[5,6],[564,6]]},"875":{"position":[[92,6],[134,6]]},"878":{"position":[[24,6]]},"897":{"position":[[111,7]]},"898":{"position":[[1847,6],[1963,6]]},"904":{"position":[[21,7],[1297,7],[3163,8]]},"905":{"position":[[234,8]]},"906":{"position":[[62,7]]},"910":{"position":[[217,7]]},"912":{"position":[[79,6],[178,6],[232,8],[763,7]]},"915":{"position":[[60,7]]},"932":{"position":[[428,6]]},"934":{"position":[[555,7]]},"952":{"position":[[163,7]]},"958":{"position":[[673,7]]},"971":{"position":[[275,7]]},"989":{"position":[[370,6]]},"1004":{"position":[[97,7]]},"1012":{"position":[[68,7]]},"1013":{"position":[[44,6]]},"1021":{"position":[[69,8]]},"1023":{"position":[[30,6]]},"1041":{"position":[[139,7]]},"1047":{"position":[[223,7]]},"1059":{"position":[[117,7]]},"1064":{"position":[[66,7],[100,6]]},"1101":{"position":[[157,6]]},"1102":{"position":[[749,6]]},"1112":{"position":[[20,7],[99,7]]},"1114":{"position":[[589,6]]},"1119":{"position":[[319,6]]},"1124":{"position":[[384,7],[642,7],[2199,7]]},"1125":{"position":[[92,6]]},"1129":{"position":[[35,6]]},"1130":{"position":[[370,7]]},"1141":{"position":[[35,6]]},"1146":{"position":[[22,6],[46,7],[151,7],[324,7]]},"1148":{"position":[[729,7]]},"1149":{"position":[[116,7],[150,7],[209,7],[601,7],[655,7]]},"1150":{"position":[[654,7]]},"1151":{"position":[[251,8]]},"1156":{"position":[[274,7]]},"1162":{"position":[[875,6]]},"1174":{"position":[[334,7]]},"1176":{"position":[[28,6]]},"1178":{"position":[[250,8]]},"1183":{"position":[[290,6]]},"1198":{"position":[[1659,6],[1759,7],[2249,6]]},"1210":{"position":[[251,6]]},"1212":{"position":[[33,7],[254,7]]},"1219":{"position":[[20,6]]},"1227":{"position":[[315,7]]},"1233":{"position":[[16,6]]},"1246":{"position":[[1143,6],[1942,6],[2180,6]]},"1265":{"position":[[308,7]]},"1266":{"position":[[240,9]]},"1277":{"position":[[99,6]]},"1279":{"position":[[490,7]]},"1280":{"position":[[19,6],[123,6]]},"1284":{"position":[[12,7]]},"1288":{"position":[[121,6]]},"1292":{"position":[[548,6]]},"1295":{"position":[[1561,7]]}},"keywords":{}}],["plugin(",{"_index":3342,"title":{},"content":{"553":{"position":[[33,9]]}},"keywords":{}}],["plugin(mapreduc",{"_index":4786,"title":{},"content":{"837":{"position":[[1952,18]]}},"keywords":{}}],["plugin(repl",{"_index":4785,"title":{},"content":{"837":{"position":[[1931,20]]}},"keywords":{}}],["plugin(sqliteadapt",{"_index":4787,"title":{},"content":{"837":{"position":[[1971,23]]}},"keywords":{}}],["plugincustom",{"_index":1600,"title":{},"content":{"263":{"position":[[608,12]]}},"keywords":{}}],["pluginin",{"_index":6239,"title":{},"content":{"1214":{"position":[[598,8]]}},"keywords":{}}],["plugins.ful",{"_index":2163,"title":{},"content":{"383":{"position":[[174,12]]}},"keywords":{}}],["plugins.indexeddb",{"_index":1104,"title":{},"content":{"131":{"position":[[182,17]]}},"keywords":{}}],["plugin—consid",{"_index":3150,"title":{},"content":{"483":{"position":[[1100,15]]}},"keywords":{}}],["point",{"_index":476,"title":{},"content":{"29":{"position":[[122,6]]},"260":{"position":[[307,5]]},"334":{"position":[[731,7]]},"335":{"position":[[502,7],[789,7]]},"369":{"position":[[298,6]]},"412":{"position":[[318,5]]},"461":{"position":[[439,5]]},"678":{"position":[[271,6],[298,7]]},"679":{"position":[[181,5]]},"680":{"position":[[911,7],[1059,10],[1267,7],[1324,8],[1389,7]]},"681":{"position":[[267,6],[351,6],[810,7]]},"683":{"position":[[204,7],[325,7],[919,7],[994,6],[1015,7]]},"700":{"position":[[507,5]]},"705":{"position":[[827,5]]},"872":{"position":[[643,6]]},"990":{"position":[[96,5]]},"1207":{"position":[[695,6]]},"1210":{"position":[[105,5]]},"1300":{"position":[[301,5],[491,5],[537,5]]},"1321":{"position":[[1008,5]]},"1324":{"position":[[339,5]]}},"keywords":{}}],["polici",{"_index":1704,"title":{"815":{"position":[[18,7]]},"816":{"position":[[12,7]]},"818":{"position":[[15,7]]}},"content":{"298":{"position":[[124,9],[330,8],[817,6]]},"299":{"position":[[825,9]]},"305":{"position":[[149,8]]},"412":{"position":[[7996,8]]},"522":{"position":[[753,6]]},"617":{"position":[[914,6]]},"653":{"position":[[32,6]]},"815":{"position":[[61,6],[246,6]]},"816":{"position":[[13,6]]},"818":{"position":[[21,6],[321,7],[387,6]]},"890":{"position":[[435,6]]},"897":{"position":[[518,9]]},"934":{"position":[[727,6]]},"960":{"position":[[648,6]]},"1287":{"position":[[153,9]]}},"keywords":{}}],["poll",{"_index":1176,"title":{"609":{"position":[[41,7]]},"610":{"position":[[13,9]]}},"content":{"159":{"position":[[287,7]]},"255":{"position":[[291,8]]},"323":{"position":[[494,7]]},"346":{"position":[[198,7]]},"379":{"position":[[173,7]]},"410":{"position":[[1723,7]]},"490":{"position":[[292,4]]},"491":{"position":[[588,8],[1643,8]]},"570":{"position":[[627,7],[725,8]]},"610":{"position":[[6,7],[223,8],[317,7],[873,7],[1111,7],[1300,7],[1397,7],[1424,7]]},"611":{"position":[[1406,7]]},"616":{"position":[[198,7],[296,7],[514,7]]},"619":{"position":[[341,7]]},"620":{"position":[[73,7]]},"621":{"position":[[361,8]]},"622":{"position":[[406,8]]},"623":{"position":[[452,8]]},"624":{"position":[[1343,8]]},"632":{"position":[[387,7]]},"846":{"position":[[923,7]]},"849":{"position":[[64,7]]},"875":{"position":[[7194,8]]},"988":{"position":[[5031,7]]},"1124":{"position":[[918,7]]},"1150":{"position":[[672,8]]}},"keywords":{}}],["polyfil",{"_index":112,"title":{"728":{"position":[[0,10]]},"729":{"position":[[0,8]]},"911":{"position":[[0,8]]},"1202":{"position":[[0,8]]}},"content":{"8":{"position":[[403,9]]},"261":{"position":[[648,8]]},"616":{"position":[[994,8]]},"728":{"position":[[78,9],[149,9],[208,10]]},"749":{"position":[[15342,11]]},"910":{"position":[[129,8],[197,8],[358,8]]},"911":{"position":[[207,8],[258,9]]},"917":{"position":[[479,8]]},"1139":{"position":[[123,8]]},"1145":{"position":[[119,8]]},"1301":{"position":[[1055,11]]}},"keywords":{}}],["pong",{"_index":3578,"title":{},"content":{"611":{"position":[[1190,4]]}},"keywords":{}}],["pool",{"_index":1746,"title":{},"content":{"299":{"position":[[341,4]]},"391":{"position":[[672,8]]},"617":{"position":[[298,4]]},"904":{"position":[[2267,6],[3450,5]]},"905":{"position":[[150,5]]},"1121":{"position":[[682,6]]}},"keywords":{}}],["poor",{"_index":2644,"title":{},"content":{"411":{"position":[[5603,4]]}},"keywords":{}}],["poorli",{"_index":1715,"title":{},"content":{"298":{"position":[[376,6]]}},"keywords":{}}],["popul",{"_index":2376,"title":{"807":{"position":[[0,10]]},"809":{"position":[[0,11]]}},"content":{"397":{"position":[[1325,8]]},"749":{"position":[[9965,8],[10079,8]]},"793":{"position":[[1144,10]]},"810":{"position":[[49,10]]},"811":{"position":[[22,9]]},"1084":{"position":[[136,8]]}},"keywords":{}}],["popular",{"_index":548,"title":{},"content":{"35":{"position":[[18,7]]},"94":{"position":[[62,7]]},"155":{"position":[[159,7]]},"173":{"position":[[2263,7]]},"189":{"position":[[309,7]]},"222":{"position":[[79,7]]},"232":{"position":[[36,7]]},"281":{"position":[[15,7]]},"284":{"position":[[158,7]]},"336":{"position":[[66,7]]},"407":{"position":[[366,7]]},"419":{"position":[[130,11]]},"420":{"position":[[283,7]]},"445":{"position":[[122,7],[1727,7]]},"446":{"position":[[1180,10]]},"836":{"position":[[1118,8]]},"839":{"position":[[59,7]]},"1247":{"position":[[386,7]]}},"keywords":{}}],["port",{"_index":3593,"title":{},"content":{"612":{"position":[[1808,4]]},"708":{"position":[[320,4],[469,5]]},"872":{"position":[[3324,5]]},"875":{"position":[[1254,4]]},"890":{"position":[[578,5]]},"892":{"position":[[307,5]]},"906":{"position":[[1027,5],[1047,4]]},"1090":{"position":[[1061,5]]},"1097":{"position":[[779,5]]},"1098":{"position":[[415,5]]},"1099":{"position":[[385,5]]},"1103":{"position":[[268,5]]},"1219":{"position":[[554,5],[717,5]]},"1220":{"position":[[233,5]]}},"keywords":{}}],["portabl",{"_index":913,"title":{"97":{"position":[[8,8]]}},"content":{"65":{"position":[[511,8]]},"97":{"position":[[48,8]]},"173":{"position":[[2710,8],[2785,12]]}},"keywords":{}}],["pose",{"_index":1405,"title":{},"content":{"225":{"position":[[58,4]]},"432":{"position":[[657,4]]},"618":{"position":[[170,5]]}},"keywords":{}}],["posit",{"_index":929,"title":{},"content":{"65":{"position":[[1503,8]]},"464":{"position":[[1291,8]]}},"keywords":{}}],["possibl",{"_index":329,"title":{"404":{"position":[[0,8]]},"469":{"position":[[0,8]]}},"content":{"19":{"position":[[395,8]]},"168":{"position":[[276,13]]},"284":{"position":[[67,13]]},"305":{"position":[[450,11]]},"315":{"position":[[1048,8]]},"351":{"position":[[399,9]]},"354":{"position":[[1554,8]]},"357":{"position":[[395,9]]},"375":{"position":[[821,9]]},"408":{"position":[[1404,13],[2252,8]]},"409":{"position":[[271,9]]},"410":{"position":[[762,8]]},"412":{"position":[[3989,8],[9230,8],[9846,8],[13847,9]]},"420":{"position":[[821,8]]},"421":{"position":[[458,8]]},"432":{"position":[[489,9]]},"451":{"position":[[449,8]]},"455":{"position":[[661,8],[700,8],[853,8]]},"468":{"position":[[196,9]]},"469":{"position":[[26,8]]},"478":{"position":[[50,8]]},"490":{"position":[[619,8]]},"496":{"position":[[39,8]]},"569":{"position":[[1231,8]]},"581":{"position":[[501,9]]},"616":{"position":[[179,8]]},"650":{"position":[[21,8]]},"661":{"position":[[1515,8]]},"679":{"position":[[24,8]]},"705":{"position":[[1396,8]]},"708":{"position":[[80,8]]},"711":{"position":[[277,8],[1974,8]]},"719":{"position":[[53,8]]},"749":{"position":[[23043,8]]},"797":{"position":[[98,8]]},"817":{"position":[[28,8]]},"831":{"position":[[263,8]]},"837":{"position":[[464,8]]},"840":{"position":[[530,8]]},"854":{"position":[[1169,8]]},"863":{"position":[[809,8]]},"886":{"position":[[4948,8]]},"889":{"position":[[11,8]]},"905":{"position":[[98,8]]},"1005":{"position":[[37,8]]},"1067":{"position":[[767,8]]},"1092":{"position":[[618,8]]},"1132":{"position":[[797,8]]},"1135":{"position":[[63,8]]},"1143":{"position":[[491,8]]},"1154":{"position":[[578,8]]},"1173":{"position":[[188,8]]},"1183":{"position":[[51,8]]},"1191":{"position":[[216,13],[293,8]]},"1193":{"position":[[120,8]]},"1198":{"position":[[975,8],[1598,8]]},"1208":{"position":[[266,8]]},"1222":{"position":[[336,8],[847,8]]},"1237":{"position":[[88,9]]},"1300":{"position":[[337,9]]},"1304":{"position":[[1431,9]]},"1314":{"position":[[343,8]]}},"keywords":{}}],["possibleso",{"_index":6171,"title":{},"content":{"1198":{"position":[[597,10]]}},"keywords":{}}],["post",{"_index":335,"title":{},"content":{"19":{"position":[[645,5],[817,5]]},"209":{"position":[[752,4],[855,7]]},"255":{"position":[[1201,7]]},"616":{"position":[[680,4],[1200,4]]},"632":{"position":[[2544,4]]},"759":{"position":[[1179,8],[1245,9],[1275,5]]},"875":{"position":[[6281,7]]},"988":{"position":[[2576,7]]},"1007":{"position":[[619,4]]},"1102":{"position":[[549,7],[1120,7],[1237,7],[1295,7],[1343,7]]}},"keywords":{}}],["postcreat",{"_index":4239,"title":{"770":{"position":[[0,11]]}},"content":{"749":{"position":[[7760,11]]},"770":{"position":[[71,10],[267,10],[618,10]]}},"keywords":{}}],["postgr",{"_index":653,"title":{},"content":{"41":{"position":[[205,8]]},"897":{"position":[[384,8]]}},"keywords":{}}],["postgresql",{"_index":372,"title":{"356":{"position":[[16,10]]}},"content":{"22":{"position":[[207,10]]},"43":{"position":[[167,11]]},"202":{"position":[[222,10]]},"249":{"position":[[171,11]]},"356":{"position":[[75,10],[134,10]]},"412":{"position":[[1648,11]]},"661":{"position":[[191,10]]},"704":{"position":[[12,10]]},"705":{"position":[[1363,11]]},"708":{"position":[[145,10]]},"711":{"position":[[225,10]]},"836":{"position":[[193,10]]},"981":{"position":[[733,11]]},"1320":{"position":[[336,10]]},"1324":{"position":[[670,10]]}},"keywords":{}}],["postgresql’",{"_index":2091,"title":{},"content":{"362":{"position":[[344,12]]}},"keywords":{}}],["postgrest",{"_index":5187,"title":{},"content":{"897":{"position":[[141,9]]},"898":{"position":[[3728,9]]}},"keywords":{}}],["postinsert",{"_index":4534,"title":{},"content":{"767":{"position":[[724,11]]},"1311":{"position":[[1097,10]]}},"keywords":{}}],["postmessag",{"_index":1852,"title":{},"content":{"303":{"position":[[1250,13]]},"392":{"position":[[3632,13]]},"460":{"position":[[677,14]]},"470":{"position":[[500,13]]}},"keywords":{}}],["postremov",{"_index":4555,"title":{},"content":{"769":{"position":[[695,11]]}},"keywords":{}}],["postsav",{"_index":4546,"title":{},"content":{"768":{"position":[[734,9]]}},"keywords":{}}],["poststatus.publish",{"_index":340,"title":{},"content":{"19":{"position":[[754,21]]}},"keywords":{}}],["potenti",{"_index":866,"title":{"402":{"position":[[0,9]]}},"content":{"58":{"position":[[81,11]]},"66":{"position":[[585,11]]},"83":{"position":[[447,9]]},"204":{"position":[[103,11]]},"222":{"position":[[312,9]]},"223":{"position":[[361,9]]},"241":{"position":[[421,9]]},"336":{"position":[[436,12]]},"345":{"position":[[116,11]]},"404":{"position":[[215,9],[829,9]]},"411":{"position":[[4844,9]]},"415":{"position":[[339,11]]},"427":{"position":[[284,11],[812,11]]},"447":{"position":[[683,9]]},"501":{"position":[[293,9]]},"588":{"position":[[101,11]]},"622":{"position":[[321,11]]},"623":{"position":[[105,11],[723,11]]},"624":{"position":[[877,10]]},"640":{"position":[[229,11]]},"696":{"position":[[1204,11]]},"802":{"position":[[191,9]]},"904":{"position":[[3395,9]]}},"keywords":{}}],["potter",{"_index":6518,"title":{},"content":{"1311":{"position":[[1563,9]]}},"keywords":{}}],["pouch",{"_index":170,"title":{},"content":{"11":{"position":[[905,5]]},"1065":{"position":[[82,5]]},"1204":{"position":[[299,5]]}},"keywords":{}}],["pouchdb",{"_index":0,"title":{"0":{"position":[[0,7]]},"24":{"position":[[0,8]]},"837":{"position":[[0,8]]},"1197":{"position":[[10,7]]},"1198":{"position":[[11,7]]},"1204":{"position":[[19,7]]}},"content":{"1":{"position":[[432,7]]},"2":{"position":[[143,7]]},"3":{"position":[[121,7]]},"4":{"position":[[287,7]]},"5":{"position":[[203,7]]},"6":{"position":[[302,7]]},"7":{"position":[[225,7]]},"8":{"position":[[165,7],[241,7],[916,8]]},"9":{"position":[[137,7]]},"10":{"position":[[66,7]]},"11":{"position":[[104,7]]},"24":{"position":[[3,7],[373,7],[547,7],[677,7]]},"25":{"position":[[264,7]]},"26":{"position":[[253,7]]},"27":{"position":[[247,7]]},"408":{"position":[[4577,8]]},"411":{"position":[[3210,8]]},"419":{"position":[[122,7]]},"420":{"position":[[52,7]]},"837":{"position":[[3,7],[122,7],[216,7],[570,7],[685,7],[838,7],[938,7],[1056,7],[1106,7],[1333,7],[1455,7],[1547,7],[1560,8],[1598,8],[1646,8],[1691,8],[1745,8],[2030,7]]},"841":{"position":[[36,7]]},"851":{"position":[[16,8]]},"1198":{"position":[[177,8],[216,7],[363,7],[473,7],[704,7],[793,7],[1344,8],[1530,7],[1612,8],[1830,7],[1856,7],[2053,7],[2214,7],[2280,7],[2316,7]]},"1201":{"position":[[268,7]]},"1202":{"position":[[212,7]]},"1203":{"position":[[1,7]]},"1204":{"position":[[52,7]]}},"keywords":{}}],["pouchdb('mydb.db",{"_index":4788,"title":{},"content":{"837":{"position":[[2109,18]]}},"keywords":{}}],["pouchdb.easi",{"_index":4818,"title":{},"content":{"844":{"position":[[63,14]]}},"keywords":{}}],["pouchdb.plugin(httppouch",{"_index":4784,"title":{},"content":{"837":{"position":[[1905,25]]}},"keywords":{}}],["pouchdb.pouchdb",{"_index":3967,"title":{},"content":{"703":{"position":[[350,15]]}},"keywords":{}}],["pouchdbgoogl",{"_index":3130,"title":{},"content":{"481":{"position":[[305,13]]}},"keywords":{}}],["power",{"_index":462,"title":{"205":{"position":[[3,8]]},"310":{"position":[[3,8]]},"479":{"position":[[21,8]]},"532":{"position":[[39,5]]},"592":{"position":[[37,5]]}},"content":{"28":{"position":[[485,5]]},"34":{"position":[[39,7]]},"40":{"position":[[210,8]]},"51":{"position":[[469,6]]},"52":{"position":[[127,6],[223,6],[266,6],[564,6]]},"61":{"position":[[324,8]]},"67":{"position":[[34,8]]},"83":{"position":[[26,8]]},"87":{"position":[[55,5]]},"94":{"position":[[190,5]]},"103":{"position":[[35,7]]},"114":{"position":[[481,5]]},"116":{"position":[[14,8]]},"118":{"position":[[149,5]]},"124":{"position":[[15,8]]},"143":{"position":[[27,8]]},"148":{"position":[[11,8]]},"152":{"position":[[214,6]]},"153":{"position":[[193,5]]},"159":{"position":[[62,8]]},"161":{"position":[[341,8]]},"166":{"position":[[319,7]]},"170":{"position":[[630,8]]},"174":{"position":[[209,5]]},"175":{"position":[[522,5]]},"179":{"position":[[11,8]]},"182":{"position":[[82,5]]},"198":{"position":[[15,8]]},"229":{"position":[[11,8]]},"233":{"position":[[52,7]]},"239":{"position":[[282,5]]},"241":{"position":[[619,8]]},"255":{"position":[[21,7]]},"267":{"position":[[1141,8]]},"271":{"position":[[20,8]]},"276":{"position":[[51,8]]},"286":{"position":[[412,8]]},"289":{"position":[[524,8],[793,7],[1182,7]]},"290":{"position":[[88,8]]},"318":{"position":[[158,8]]},"354":{"position":[[1540,9]]},"370":{"position":[[135,5]]},"376":{"position":[[671,7]]},"383":{"position":[[210,8]]},"399":{"position":[[327,5]]},"412":{"position":[[14729,5]]},"425":{"position":[[86,5]]},"432":{"position":[[974,5]]},"433":{"position":[[580,5]]},"445":{"position":[[841,5],[2034,5]]},"447":{"position":[[342,5],[649,5]]},"491":{"position":[[129,8]]},"498":{"position":[[476,8]]},"500":{"position":[[572,5]]},"513":{"position":[[9,8]]},"530":{"position":[[327,8]]},"535":{"position":[[27,9]]},"536":{"position":[[104,8]]},"538":{"position":[[770,6]]},"539":{"position":[[127,6],[223,6],[266,6],[564,6]]},"545":{"position":[[20,9]]},"548":{"position":[[395,8]]},"557":{"position":[[386,8]]},"562":{"position":[[417,6],[604,6],[1522,6]]},"576":{"position":[[88,9]]},"595":{"position":[[27,9]]},"596":{"position":[[102,8]]},"598":{"position":[[777,6]]},"599":{"position":[[136,6],[241,6],[293,6],[591,6]]},"605":{"position":[[20,9]]},"608":{"position":[[393,8]]},"613":{"position":[[367,8]]},"620":{"position":[[699,5]]},"689":{"position":[[11,8]]},"721":{"position":[[196,5]]},"736":{"position":[[449,5]]},"871":{"position":[[324,7]]},"1087":{"position":[[70,5]]},"1088":{"position":[[25,5]]},"1149":{"position":[[324,8]]},"1162":{"position":[[121,5]]},"1171":{"position":[[138,5]]},"1181":{"position":[[187,5]]},"1300":{"position":[[1150,5]]}},"keywords":{}}],["powersync",{"_index":665,"title":{"43":{"position":[[0,10]]}},"content":{"43":{"position":[[1,9],[250,9],[312,9],[482,9],[556,9],[598,9],[676,9]]}},"keywords":{}}],["pr",{"_index":3831,"title":{"668":{"position":[[9,3]]}},"content":{"670":{"position":[[42,2]]},"1133":{"position":[[627,2]]},"1324":{"position":[[1026,2]]}},"keywords":{}}],["practic",{"_index":855,"title":{"142":{"position":[[5,9]]},"346":{"position":[[5,9]]},"425":{"position":[[35,9]]},"556":{"position":[[5,9]]},"590":{"position":[[5,9]]}},"content":{"56":{"position":[[182,10]]},"142":{"position":[[83,10]]},"304":{"position":[[261,9]]},"347":{"position":[[515,9]]},"362":{"position":[[1586,9]]},"408":{"position":[[5449,10]]},"412":{"position":[[3901,9],[7014,9]]},"495":{"position":[[778,9]]},"543":{"position":[[172,9]]},"550":{"position":[[306,9]]},"557":{"position":[[354,9]]},"567":{"position":[[971,9]]},"591":{"position":[[744,9]]},"603":{"position":[[170,9]]},"616":{"position":[[844,8]]},"696":{"position":[[308,8]]},"708":{"position":[[378,9]]},"714":{"position":[[959,9]]}},"keywords":{}}],["pragmat",{"_index":2053,"title":{},"content":{"357":{"position":[[498,9]]}},"keywords":{}}],["pre",{"_index":2226,"title":{"1227":{"position":[[0,3]]},"1265":{"position":[[0,3]]}},"content":{"391":{"position":[[820,3]]},"402":{"position":[[623,3]]},"1227":{"position":[[151,3]]},"1265":{"position":[[144,3]]}},"keywords":{}}],["preact",{"_index":3303,"title":{"542":{"position":[[5,6]]},"563":{"position":[[14,6]]}},"content":{"540":{"position":[[208,6]]},"542":{"position":[[20,6],[100,6],[260,6],[362,6]]},"563":{"position":[[122,6],[404,6],[804,6],[846,6]]},"566":{"position":[[584,6]]},"567":{"position":[[556,6],[742,6]]}},"keywords":{}}],["preact/sign",{"_index":3321,"title":{},"content":{"542":{"position":[[214,15]]}},"keywords":{}}],["preactsignalsrxreactivityfactori",{"_index":3322,"title":{},"content":{"542":{"position":[[297,32],[616,32]]},"563":{"position":[[339,32],[571,32]]}},"keywords":{}}],["prebuild",{"_index":6226,"title":{},"content":{"1210":{"position":[[118,8]]},"1266":{"position":[[125,8]]}},"keywords":{}}],["precis",{"_index":2352,"title":{},"content":{"397":{"position":[[169,8]]},"398":{"position":[[222,10],[3019,7],[3103,7]]},"402":{"position":[[531,9],[1295,9],[1605,9],[1693,10]]}},"keywords":{}}],["precondit",{"_index":4921,"title":{"865":{"position":[[0,13]]}},"content":{},"keywords":{}}],["predefin",{"_index":2185,"title":{},"content":{"390":{"position":[[356,10]]}},"keywords":{}}],["predicates.al",{"_index":342,"title":{},"content":{"19":{"position":[[853,15]]}},"keywords":{}}],["predict",{"_index":967,"title":{"704":{"position":[[11,12]]}},"content":{"74":{"position":[[107,14]]},"569":{"position":[[371,14]]},"696":{"position":[[1557,7]]},"704":{"position":[[384,7],[444,7]]},"828":{"position":[[427,12]]},"986":{"position":[[208,11]]},"1305":{"position":[[372,12]]},"1313":{"position":[[265,7],[542,7]]}},"keywords":{}}],["predominantli",{"_index":2013,"title":{},"content":{"353":{"position":[[617,13]]}},"keywords":{}}],["prefer",{"_index":965,"title":{"354":{"position":[[8,6]]},"659":{"position":[[0,11]]}},"content":{"74":{"position":[[79,6]]},"94":{"position":[[265,9]]},"143":{"position":[[374,6]]},"174":{"position":[[3165,9]]},"211":{"position":[[595,9]]},"222":{"position":[[360,9]]},"286":{"position":[[97,9]]},"354":{"position":[[1356,6]]},"365":{"position":[[1264,9]]},"424":{"position":[[435,11]]},"559":{"position":[[151,11],[1538,11]]},"563":{"position":[[82,6],[1026,6]]},"567":{"position":[[1165,11]]},"590":{"position":[[422,6]]},"659":{"position":[[31,11],[348,11],[439,11],[684,11],[924,11]]},"690":{"position":[[154,6]]},"816":{"position":[[288,7],[372,7]]}},"keywords":{}}],["preferences.get",{"_index":3780,"title":{},"content":{"659":{"position":[[580,17]]}},"keywords":{}}],["preferences.remov",{"_index":3782,"title":{},"content":{"659":{"position":[[643,20]]}},"keywords":{}}],["preferences.set",{"_index":3777,"title":{},"content":{"659":{"position":[[499,17]]}},"keywords":{}}],["prefix",{"_index":3601,"title":{},"content":{"612":{"position":[[2060,8]]},"746":{"position":[[375,6],[410,7],[422,8]]},"866":{"position":[[629,6]]},"904":{"position":[[2088,6]]}},"keywords":{}}],["preinsert",{"_index":4521,"title":{},"content":{"766":{"position":[[63,9]]},"767":{"position":[[304,10]]}},"keywords":{}}],["preinsertpostinsertpresavepostsavepreremovepostremovepostcr",{"_index":4513,"title":{},"content":{"763":{"position":[[37,63]]}},"keywords":{}}],["preload",{"_index":927,"title":{},"content":{"65":{"position":[[1308,10]]}},"keywords":{}}],["premis",{"_index":4798,"title":{},"content":{"839":{"position":[[611,7]]}},"keywords":{}}],["premium",{"_index":763,"title":{"761":{"position":[[30,7]]},"1151":{"position":[[18,7]]},"1178":{"position":[[18,7]]}},"content":{"51":{"position":[[145,7]]},"314":{"position":[[220,7]]},"315":{"position":[[81,7]]},"318":{"position":[[266,7],[480,7]]},"420":{"position":[[991,7]]},"483":{"position":[[1120,7]]},"538":{"position":[[81,7]]},"554":{"position":[[137,7]]},"556":{"position":[[1107,7]]},"598":{"position":[[81,7]]},"602":{"position":[[106,8]]},"640":{"position":[[310,7]]},"641":{"position":[[363,7]]},"662":{"position":[[1029,7],[1282,7],[1908,7],[2069,7]]},"676":{"position":[[184,7]]},"710":{"position":[[859,7]]},"718":{"position":[[45,7]]},"724":{"position":[[33,7],[103,7]]},"749":{"position":[[9358,7]]},"761":{"position":[[6,7],[108,7],[412,8],[430,7],[494,7],[554,7],[620,7],[742,7]]},"824":{"position":[[555,7]]},"838":{"position":[[1517,7],[1813,7],[2048,7]]},"958":{"position":[[665,7]]},"1098":{"position":[[22,7]]},"1099":{"position":[[22,7]]},"1129":{"position":[[24,7]]},"1138":{"position":[[58,7]]},"1141":{"position":[[24,7]]},"1143":{"position":[[96,7]]},"1151":{"position":[[243,7],[433,7],[573,7],[735,7]]},"1162":{"position":[[898,7]]},"1178":{"position":[[242,7],[432,7],[572,7],[734,7]]},"1181":{"position":[[850,7]]},"1210":{"position":[[176,7],[240,7]]},"1227":{"position":[[304,7]]},"1235":{"position":[[187,7],[322,7],[433,7]]},"1265":{"position":[[297,7]]},"1271":{"position":[[554,7],[785,7],[1071,7],[1680,7]]}},"keywords":{}}],["premium/dist/work",{"_index":6272,"title":{},"content":{"1227":{"position":[[249,20],[830,20]]},"1265":{"position":[[242,20]]}},"keywords":{}}],["premium/dist/workers/opfs.worker.j",{"_index":6233,"title":{},"content":{"1210":{"position":[[669,36]]}},"keywords":{}}],["premium/plugins/encrypt",{"_index":4027,"title":{},"content":{"718":{"position":[[169,26]]},"1184":{"position":[[594,26]]}},"keywords":{}}],["premium/plugins/flexsearch",{"_index":4046,"title":{},"content":{"724":{"position":[[215,28],[475,28]]}},"keywords":{}}],["premium/plugins/indexeddb",{"_index":4708,"title":{},"content":{"820":{"position":[[115,27]]},"1225":{"position":[[249,27]]}},"keywords":{}}],["premium/plugins/logg",{"_index":4114,"title":{},"content":{"745":{"position":[[239,24]]}},"keywords":{}}],["premium/plugins/queri",{"_index":4707,"title":{},"content":{"820":{"position":[[37,21]]}},"keywords":{}}],["premium/plugins/serv",{"_index":5925,"title":{},"content":{"1098":{"position":[[277,22]]},"1099":{"position":[[255,22]]}},"keywords":{}}],["premium/plugins/shar",{"_index":3864,"title":{},"content":{"676":{"position":[[330,24]]},"958":{"position":[[785,24]]},"1151":{"position":[[907,24]]},"1178":{"position":[[904,24]]}},"keywords":{}}],["premium/plugins/storag",{"_index":4029,"title":{},"content":{"718":{"position":[[253,23]]},"745":{"position":[[308,23]]},"759":{"position":[[196,23]]},"772":{"position":[[1524,23]]},"774":{"position":[[605,23]]},"932":{"position":[[815,23]]},"1090":{"position":[[626,23],[715,23]]},"1130":{"position":[[91,23]]},"1138":{"position":[[228,23]]},"1139":{"position":[[326,23]]},"1140":{"position":[[542,23]]},"1154":{"position":[[258,23],[356,23]]},"1163":{"position":[[46,23],[129,23]]},"1182":{"position":[[46,23],[129,23]]},"1184":{"position":[[412,23],[495,23]]},"1210":{"position":[[365,23]]},"1211":{"position":[[622,23]]},"1212":{"position":[[334,23],[409,23]]},"1213":{"position":[[631,23]]},"1222":{"position":[[44,23]]},"1225":{"position":[[172,23]]},"1226":{"position":[[89,23]]},"1227":{"position":[[639,23]]},"1231":{"position":[[485,23],[562,23]]},"1237":{"position":[[778,23]]},"1238":{"position":[[486,23],[562,23],[639,23],[735,23]]},"1239":{"position":[[536,23],[637,23],[726,23]]},"1263":{"position":[[58,23],[135,23]]},"1264":{"position":[[83,23]]},"1265":{"position":[[627,23]]},"1268":{"position":[[613,23],[690,23]]},"1274":{"position":[[104,23]]},"1275":{"position":[[228,23]]},"1276":{"position":[[494,23]]},"1277":{"position":[[252,23],[781,23]]},"1278":{"position":[[359,23],[806,23]]},"1279":{"position":[[418,23]]},"1281":{"position":[[151,23]]}},"keywords":{}}],["premiumencrypt",{"_index":4022,"title":{},"content":{"717":{"position":[[152,17]]}},"keywords":{}}],["premiumif",{"_index":3148,"title":{},"content":{"483":{"position":[[989,9]]}},"keywords":{}}],["premiumsqlit",{"_index":1892,"title":{},"content":{"314":{"position":[[1017,13]]}},"keywords":{}}],["prepar",{"_index":1732,"title":{"861":{"position":[[0,9]]}},"content":{"298":{"position":[[881,8]]},"463":{"position":[[1359,8]]}},"keywords":{}}],["prepend",{"_index":5965,"title":{},"content":{"1107":{"position":[[51,9]]}},"keywords":{}}],["preprocess",{"_index":5798,"title":{},"content":{"1072":{"position":[[2296,12]]}},"keywords":{}}],["preremov",{"_index":4553,"title":{},"content":{"769":{"position":[[278,10]]}},"keywords":{}}],["presav",{"_index":4541,"title":{},"content":{"768":{"position":[[263,8]]}},"keywords":{}}],["present",{"_index":1399,"title":{},"content":{"217":{"position":[[103,7]]},"278":{"position":[[101,8]]},"289":{"position":[[513,8]]},"392":{"position":[[2986,8]]},"394":{"position":[[1375,8]]},"412":{"position":[[7526,7]]}},"keywords":{}}],["preserv",{"_index":1311,"title":{},"content":{"203":{"position":[[252,8]]},"250":{"position":[[268,8]]},"362":{"position":[[1020,10]]},"407":{"position":[[1137,13]]}},"keywords":{}}],["press",{"_index":2634,"title":{},"content":{"411":{"position":[[4801,5]]}},"keywords":{}}],["pressur",{"_index":2858,"title":{},"content":{"421":{"position":[[1087,8]]}},"keywords":{}}],["pretti",{"_index":3563,"title":{},"content":{"610":{"position":[[1454,6]]},"620":{"position":[[515,6]]},"626":{"position":[[422,6]]},"698":{"position":[[1395,6]]},"772":{"position":[[523,6]]},"837":{"position":[[227,6]]},"838":{"position":[[3111,6]]},"904":{"position":[[2515,6]]},"1124":{"position":[[1916,6]]},"1208":{"position":[[17,6]]},"1214":{"position":[[457,6]]},"1272":{"position":[[349,6]]}},"keywords":{}}],["preval",{"_index":2103,"title":{},"content":{"364":{"position":[[40,9]]}},"keywords":{}}],["prevent",{"_index":1298,"title":{"1044":{"position":[[0,7]]}},"content":{"195":{"position":[[172,7]]},"298":{"position":[[355,7]]},"300":{"position":[[548,10]]},"412":{"position":[[13283,7]]},"556":{"position":[[1862,7],[1964,10]]},"590":{"position":[[361,10],[894,7]]},"617":{"position":[[936,7]]},"849":{"position":[[162,8],[824,7]]},"886":{"position":[[4812,8]]},"907":{"position":[[106,7]]},"948":{"position":[[242,7]]},"966":{"position":[[154,7]]},"1033":{"position":[[899,7]]},"1085":{"position":[[1870,8]]},"1110":{"position":[[56,7]]},"1112":{"position":[[291,7]]},"1162":{"position":[[245,9]]},"1181":{"position":[[311,9]]},"1230":{"position":[[132,7]]},"1299":{"position":[[4,7]]},"1300":{"position":[[196,7]]}},"keywords":{}}],["previou",{"_index":2779,"title":{"760":{"position":[[15,8]]}},"content":{"413":{"position":[[92,8]]},"495":{"position":[[425,8]]},"496":{"position":[[106,8]]},"683":{"position":[[621,8]]},"749":{"position":[[8989,8]]},"760":{"position":[[19,8]]},"885":{"position":[[366,8]]},"943":{"position":[[338,8]]},"948":{"position":[[194,8]]},"954":{"position":[[50,8]]},"977":{"position":[[340,8]]},"1022":{"position":[[623,8]]},"1023":{"position":[[279,8]]},"1069":{"position":[[558,8]]},"1294":{"position":[[1219,8]]},"1305":{"position":[[804,8],[860,8],[981,8]]},"1307":{"position":[[72,8]]},"1316":{"position":[[1704,8]]},"1318":{"position":[[628,8]]}},"keywords":{}}],["previous",{"_index":2523,"title":{},"content":{"408":{"position":[[85,10]]}},"keywords":{}}],["pri",{"_index":2149,"title":{},"content":{"377":{"position":[[391,6]]}},"keywords":{}}],["price",{"_index":1692,"title":{},"content":{"295":{"position":[[84,6]]},"459":{"position":[[549,5]]}},"keywords":{}}],["primari",{"_index":1417,"title":{"1078":{"position":[[10,7]]}},"content":{"231":{"position":[[59,7]]},"356":{"position":[[349,7]]},"367":{"position":[[763,7],[874,7]]},"376":{"position":[[5,7]]},"380":{"position":[[8,7]]},"407":{"position":[[30,7]]},"419":{"position":[[996,7]]},"434":{"position":[[17,7]]},"555":{"position":[[413,7],[762,7]]},"683":{"position":[[694,7]]},"734":{"position":[[795,7]]},"749":{"position":[[1800,7],[7000,7],[7119,7],[7382,7],[9153,7],[9672,7],[10295,7],[11287,7],[11376,7],[14017,7],[17316,7],[17892,7],[18013,7],[18135,7],[18232,7],[19898,7],[20027,7],[20859,7],[21466,7]]},"808":{"position":[[378,8]]},"863":{"position":[[10,7],[141,7]]},"898":{"position":[[168,7],[204,8],[973,7],[1680,7]]},"943":{"position":[[119,7]]},"948":{"position":[[408,7]]},"950":{"position":[[93,7],[368,8]]},"951":{"position":[[33,8],[178,7]]},"1056":{"position":[[288,7]]},"1065":{"position":[[1557,7],[1848,7]]},"1074":{"position":[[1012,7]]},"1077":{"position":[[82,7],[137,7]]},"1078":{"position":[[28,7],[247,9],[574,7],[847,7],[1002,7]]},"1080":{"position":[[197,7]]},"1082":{"position":[[282,7]]},"1083":{"position":[[482,7]]},"1102":{"position":[[1279,7],[1386,7]]},"1148":{"position":[[168,7]]},"1294":{"position":[[498,7]]},"1296":{"position":[[419,7]]}},"keywords":{}}],["primarili",{"_index":1185,"title":{},"content":{"162":{"position":[[544,9]]},"273":{"position":[[138,9]]},"419":{"position":[[869,9]]},"524":{"position":[[531,9]]},"623":{"position":[[225,9]]}},"keywords":{}}],["primary1",{"_index":5338,"title":{},"content":{"945":{"position":[[165,11]]}},"keywords":{}}],["primary2",{"_index":5339,"title":{},"content":{"945":{"position":[[177,10]]}},"keywords":{}}],["primarykey",{"_index":770,"title":{"1077":{"position":[[0,11]]}},"content":{"51":{"position":[[355,11]]},"188":{"position":[[1232,11]]},"209":{"position":[[453,11]]},"211":{"position":[[399,11]]},"255":{"position":[[797,11]]},"259":{"position":[[81,11]]},"314":{"position":[[763,11]]},"315":{"position":[[739,11]]},"316":{"position":[[248,11]]},"334":{"position":[[633,11]]},"367":{"position":[[725,11]]},"392":{"position":[[583,11],[1549,11]]},"480":{"position":[[563,11]]},"482":{"position":[[863,11]]},"538":{"position":[[656,11]]},"554":{"position":[[1354,11]]},"562":{"position":[[335,11]]},"564":{"position":[[792,11]]},"579":{"position":[[641,11]]},"598":{"position":[[663,11]]},"632":{"position":[[1547,11]]},"638":{"position":[[631,11]]},"639":{"position":[[409,11]]},"662":{"position":[[2410,11]]},"680":{"position":[[823,11]]},"717":{"position":[[1432,11]]},"734":{"position":[[697,11]]},"749":{"position":[[6889,10],[11466,10],[11542,10],[11687,10],[11784,10],[19806,10],[23801,11]]},"808":{"position":[[188,11],[544,11]]},"838":{"position":[[2624,11]]},"862":{"position":[[663,11]]},"872":{"position":[[1872,11],[4102,11]]},"898":{"position":[[2452,11]]},"904":{"position":[[886,11]]},"986":{"position":[[272,10]]},"1074":{"position":[[144,11]]},"1077":{"position":[[5,10]]},"1078":{"position":[[257,11],[805,11]]},"1079":{"position":[[517,10],[625,10]]},"1080":{"position":[[99,11]]},"1082":{"position":[[184,11]]},"1083":{"position":[[384,11]]},"1149":{"position":[[1077,11]]},"1158":{"position":[[371,11]]},"1311":{"position":[[391,11]]}},"keywords":{}}],["primarykey.trim",{"_index":4286,"title":{},"content":{"749":{"position":[[11570,18]]}},"keywords":{}}],["prime",{"_index":3679,"title":{},"content":{"624":{"position":[[765,5]]}},"keywords":{}}],["primit",{"_index":4767,"title":{},"content":{"831":{"position":[[208,10]]},"875":{"position":[[123,10]]},"1308":{"position":[[222,11]]}},"keywords":{}}],["principl",{"_index":1067,"title":{},"content":{"118":{"position":[[55,10]]},"120":{"position":[[49,10]]},"136":{"position":[[68,11]]},"153":{"position":[[141,10]]},"325":{"position":[[182,11]]},"407":{"position":[[906,10]]},"419":{"position":[[308,9]]},"445":{"position":[[1271,10]]},"498":{"position":[[521,10]]},"513":{"position":[[184,10]]},"525":{"position":[[45,9]]},"530":{"position":[[223,10]]},"575":{"position":[[54,9]]}},"keywords":{}}],["print",{"_index":3856,"title":{},"content":{"675":{"position":[[39,5]]},"872":{"position":[[4373,7]]}},"keywords":{}}],["priorit",{"_index":2032,"title":{},"content":{"354":{"position":[[1417,10]]},"500":{"position":[[523,10]]},"502":{"position":[[327,10]]},"688":{"position":[[621,10]]},"1072":{"position":[[1895,10]]}},"keywords":{}}],["prioriti",{"_index":3239,"title":{},"content":{"507":{"position":[[35,8]]}},"keywords":{}}],["privaci",{"_index":1023,"title":{},"content":{"97":{"position":[[173,7]]},"195":{"position":[[16,7]]},"407":{"position":[[816,7],[1118,8]]},"410":{"position":[[504,8]]},"419":{"position":[[947,8]]},"723":{"position":[[2432,7]]},"912":{"position":[[146,8]]},"1206":{"position":[[646,7]]}},"keywords":{}}],["privat",{"_index":873,"title":{"1205":{"position":[[7,7]]},"1215":{"position":[[53,7]]}},"content":{"59":{"position":[[53,7]]},"130":{"position":[[376,7],[412,7]]},"131":{"position":[[525,7]]},"202":{"position":[[167,7]]},"408":{"position":[[1539,7]]},"453":{"position":[[12,7]]},"546":{"position":[[108,7]]},"564":{"position":[[1084,7]]},"606":{"position":[[108,7]]},"640":{"position":[[176,7]]},"697":{"position":[[569,7]]},"716":{"position":[[430,7]]},"825":{"position":[[922,7]]},"1206":{"position":[[12,7],[121,8]]},"1207":{"position":[[40,7]]},"1208":{"position":[[681,7]]},"1209":{"position":[[20,7]]},"1214":{"position":[[8,7]]},"1215":{"position":[[102,7],[375,7]]},"1216":{"position":[[41,7]]}},"keywords":{}}],["private/publickey",{"_index":4020,"title":{},"content":{"716":{"position":[[228,18]]}},"keywords":{}}],["pro",{"_index":2778,"title":{"844":{"position":[[0,5]]},"1128":{"position":[[0,5]]},"1161":{"position":[[0,5]]},"1167":{"position":[[0,5]]},"1170":{"position":[[0,5]]},"1180":{"position":[[0,5]]},"1199":{"position":[[0,5]]}},"content":{"413":{"position":[[26,4]]},"559":{"position":[[817,4]]},"839":{"position":[[220,5]]}},"keywords":{}}],["probabl",{"_index":3206,"title":{},"content":{"497":{"position":[[527,12]]}},"keywords":{}}],["problem",{"_index":72,"title":{"47":{"position":[[31,8]]},"358":{"position":[[52,8]]},"625":{"position":[[6,9]]},"627":{"position":[[28,9]]},"850":{"position":[[6,9]]},"909":{"position":[[6,9]]},"1176":{"position":[[6,9]]},"1282":{"position":[[6,8]]}},"content":{"4":{"position":[[200,8]]},"9":{"position":[[57,8]]},"19":{"position":[[1055,7]]},"118":{"position":[[398,7]]},"323":{"position":[[656,7]]},"367":{"position":[[76,7]]},"457":{"position":[[699,9]]},"458":{"position":[[1008,8]]},"468":{"position":[[748,8]]},"475":{"position":[[289,9]]},"614":{"position":[[826,7]]},"616":{"position":[[947,8]]},"617":{"position":[[1026,7]]},"624":{"position":[[343,8]]},"625":{"position":[[65,9]]},"627":{"position":[[22,8]]},"670":{"position":[[102,8]]},"696":{"position":[[448,8],[1511,7]]},"698":{"position":[[3143,9]]},"700":{"position":[[576,7]]},"701":{"position":[[463,7]]},"705":{"position":[[900,8]]},"710":{"position":[[1199,7]]},"740":{"position":[[227,7]]},"749":{"position":[[21845,8],[21965,9]]},"761":{"position":[[186,7]]},"817":{"position":[[208,8]]},"837":{"position":[[549,7]]},"840":{"position":[[457,8]]},"849":{"position":[[853,8]]},"863":{"position":[[689,7]]},"932":{"position":[[246,7]]},"1033":{"position":[[248,8]]},"1085":{"position":[[272,7]]},"1120":{"position":[[337,8]]},"1162":{"position":[[396,7],[673,7]]},"1174":{"position":[[347,7]]},"1181":{"position":[[483,7],[761,7]]},"1198":{"position":[[672,7],[2288,8]]},"1252":{"position":[[378,8]]},"1299":{"position":[[60,9]]},"1301":{"position":[[326,7],[563,8]]},"1305":{"position":[[283,8]]},"1316":{"position":[[2469,9]]}},"keywords":{}}],["problem.appwrit",{"_index":4914,"title":{},"content":{"863":{"position":[[458,16]]}},"keywords":{}}],["problemat",{"_index":946,"title":{},"content":{"66":{"position":[[514,11]]},"412":{"position":[[6107,12]]}},"keywords":{}}],["process",{"_index":12,"title":{"801":{"position":[[0,7],[28,8]]},"1088":{"position":[[24,10]]},"1225":{"position":[[20,8]]},"1226":{"position":[[12,8]]},"1263":{"position":[[14,8]]},"1264":{"position":[[12,8]]}},"content":{"1":{"position":[[168,7]]},"6":{"position":[[196,9]]},"7":{"position":[[170,9]]},"28":{"position":[[372,7],[444,7]]},"30":{"position":[[179,7]]},"46":{"position":[[590,10]]},"66":{"position":[[320,11]]},"70":{"position":[[79,9]]},"132":{"position":[[108,7]]},"158":{"position":[[21,7]]},"165":{"position":[[64,7]]},"184":{"position":[[248,7]]},"188":{"position":[[1555,7],[2464,7],[2591,7]]},"192":{"position":[[53,7]]},"196":{"position":[[211,10]]},"201":{"position":[[78,7]]},"217":{"position":[[382,10]]},"265":{"position":[[934,11]]},"273":{"position":[[128,9]]},"277":{"position":[[79,8]]},"279":{"position":[[461,7]]},"285":{"position":[[48,8],[291,7]]},"293":{"position":[[130,7]]},"333":{"position":[[108,8]]},"358":{"position":[[1036,7]]},"364":{"position":[[459,7]]},"365":{"position":[[1222,10],[1395,10]]},"391":{"position":[[928,9]]},"392":{"position":[[2270,10],[2437,9],[2962,10],[3107,10],[3201,10],[3273,7],[3771,10],[5130,10]]},"394":{"position":[[254,7],[1754,7]]},"399":{"position":[[394,9]]},"401":{"position":[[681,8]]},"402":{"position":[[478,7]]},"412":{"position":[[10185,11]]},"427":{"position":[[771,7]]},"445":{"position":[[1340,7]]},"451":{"position":[[598,7]]},"453":{"position":[[454,10]]},"458":{"position":[[211,7]]},"460":{"position":[[64,10],[181,10],[536,8],[1340,8]]},"463":{"position":[[58,7],[112,9],[285,7],[429,7]]},"464":{"position":[[646,7]]},"467":{"position":[[469,7]]},"468":{"position":[[100,7]]},"470":{"position":[[251,8]]},"503":{"position":[[102,8]]},"522":{"position":[[5,7]]},"534":{"position":[[681,10]]},"569":{"position":[[155,10],[717,7],[1337,8]]},"571":{"position":[[121,10],[1562,9]]},"594":{"position":[[679,10]]},"610":{"position":[[610,7]]},"621":{"position":[[607,7]]},"622":{"position":[[142,7]]},"634":{"position":[[678,9]]},"642":{"position":[[152,10]]},"648":{"position":[[363,10]]},"653":{"position":[[731,7]]},"662":{"position":[[751,8]]},"693":{"position":[[77,7],[120,10],[228,8],[458,7],[492,8],[617,7]]},"698":{"position":[[331,7]]},"699":{"position":[[921,10]]},"703":{"position":[[1341,7],[1492,9]]},"707":{"position":[[74,7],[112,7],[198,9],[291,7]]},"708":{"position":[[274,7],[634,8]]},"709":{"position":[[67,8],[446,8],[1017,7],[1276,8],[1344,7]]},"710":{"position":[[1069,10],[1180,9],[1329,7],[2372,7]]},"711":{"position":[[302,8],[328,8],[404,10],[543,7],[633,7],[1062,7],[1464,7],[1654,8],[2168,7]]},"723":{"position":[[1609,9]]},"740":{"position":[[151,7]]},"743":{"position":[[110,9],[210,9]]},"749":{"position":[[6007,8]]},"759":{"position":[[990,12]]},"760":{"position":[[878,12]]},"773":{"position":[[164,8],[295,7]]},"774":{"position":[[1028,7]]},"775":{"position":[[111,7]]},"801":{"position":[[392,10],[642,11],[950,10]]},"802":{"position":[[176,10],[843,8]]},"835":{"position":[[317,7]]},"836":{"position":[[2107,8]]},"846":{"position":[[1116,7]]},"875":{"position":[[625,7],[5789,7],[5848,10]]},"888":{"position":[[105,9]]},"910":{"position":[[37,7],[267,8]]},"964":{"position":[[443,8]]},"981":{"position":[[960,7]]},"989":{"position":[[121,10]]},"990":{"position":[[213,10]]},"1020":{"position":[[206,10],[282,7],[503,7]]},"1026":{"position":[[141,9]]},"1028":{"position":[[134,10]]},"1030":{"position":[[22,7]]},"1033":{"position":[[147,9]]},"1072":{"position":[[734,10]]},"1088":{"position":[[124,9],[375,9],[677,9]]},"1089":{"position":[[239,9]]},"1095":{"position":[[301,9]]},"1126":{"position":[[171,7]]},"1135":{"position":[[123,7]]},"1162":{"position":[[53,7],[364,8]]},"1164":{"position":[[1014,7],[1474,8]]},"1170":{"position":[[44,9]]},"1171":{"position":[[70,7]]},"1174":{"position":[[696,9]]},"1181":{"position":[[119,7],[451,8]]},"1183":{"position":[[113,10],[448,8],[575,8]]},"1225":{"position":[[15,7]]},"1238":{"position":[[286,8]]},"1241":{"position":[[81,8]]},"1245":{"position":[[75,7]]},"1246":{"position":[[217,7],[255,7],[537,7],[575,7],[830,7],[2103,7],[2146,10],[2254,8]]},"1267":{"position":[[173,8]]},"1270":{"position":[[188,7]]},"1292":{"position":[[560,9]]},"1300":{"position":[[121,7],[838,7]]},"1301":{"position":[[662,7],[1388,7],[1516,7],[1648,8]]},"1318":{"position":[[112,10]]}},"keywords":{}}],["process.brows",{"_index":123,"title":{},"content":{"8":{"position":[[658,15]]}},"keywords":{}}],["process.env.node_env",{"_index":3843,"title":{},"content":{"672":{"position":[[32,21]]}},"keywords":{}}],["process.env.port",{"_index":3594,"title":{},"content":{"612":{"position":[[1815,16]]}},"keywords":{}}],["process.nexttick",{"_index":4335,"title":{"910":{"position":[[28,19]]}},"content":{"749":{"position":[[15323,18]]},"910":{"position":[[57,18]]}},"keywords":{}}],["process.slow",{"_index":6130,"title":{},"content":{"1171":{"position":[[306,12]]}},"keywords":{}}],["process/brows",{"_index":5266,"title":{},"content":{"910":{"position":[[170,15],[276,18]]}},"keywords":{}}],["processed.download",{"_index":3038,"title":{},"content":{"463":{"position":[[1117,21]]}},"keywords":{}}],["processor",{"_index":2285,"title":{},"content":{"392":{"position":[[5007,10],[5101,10]]}},"keywords":{}}],["produc",{"_index":3530,"title":{},"content":{"591":{"position":[[506,7]]}},"keywords":{}}],["product",{"_index":203,"title":{},"content":{"14":{"position":[[119,9],[970,8]]},"38":{"position":[[1112,7]]},"88":{"position":[[183,12]]},"94":{"position":[[296,12]]},"212":{"position":[[578,10]]},"301":{"position":[[417,11]]},"306":{"position":[[357,10]]},"318":{"position":[[316,10]]},"350":{"position":[[384,13]]},"356":{"position":[[328,8],[436,8]]},"380":{"position":[[323,12]]},"386":{"position":[[26,10]]},"411":{"position":[[5547,7]]},"459":{"position":[[533,8]]},"554":{"position":[[376,10],[666,10],[1189,10]]},"556":{"position":[[1501,10]]},"570":{"position":[[131,7]]},"611":{"position":[[999,11]]},"674":{"position":[[285,12]]},"675":{"position":[[137,11]]},"698":{"position":[[3173,10]]},"710":{"position":[[1270,11],[2274,11]]},"749":{"position":[[6141,10]]},"772":{"position":[[2116,11]]},"798":{"position":[[311,11]]},"821":{"position":[[301,11],[559,10],[813,10]]},"824":{"position":[[452,10]]},"860":{"position":[[930,10]]},"872":{"position":[[1468,10]]},"898":{"position":[[2926,10]]},"904":{"position":[[2691,10]]},"906":{"position":[[400,10],[600,11]]},"966":{"position":[[371,10]]},"1009":{"position":[[912,10]]},"1085":{"position":[[3259,10]]},"1143":{"position":[[130,11]]},"1151":{"position":[[643,10]]},"1178":{"position":[[642,10]]},"1193":{"position":[[293,11]]},"1198":{"position":[[1105,10]]},"1266":{"position":[[708,13]]},"1271":{"position":[[342,11],[597,10]]}},"keywords":{}}],["profession",{"_index":4024,"title":{},"content":{"718":{"position":[[5,14]]},"1143":{"position":[[53,12]]},"1151":{"position":[[622,12]]},"1178":{"position":[[621,12]]}},"keywords":{}}],["profil",{"_index":1234,"title":{},"content":{"178":{"position":[[160,9]]},"346":{"position":[[750,10]]},"353":{"position":[[683,9]]},"521":{"position":[[318,7]]}},"keywords":{}}],["program",{"_index":1068,"title":{},"content":{"118":{"position":[[78,12],[167,11]]},"120":{"position":[[72,12]]},"126":{"position":[[110,11]]},"136":{"position":[[56,11]]},"153":{"position":[[164,12]]},"155":{"position":[[69,11]]},"179":{"position":[[357,11]]},"182":{"position":[[128,12]]},"207":{"position":[[173,8]]},"325":{"position":[[170,11]]},"364":{"position":[[260,11],[399,11]]},"379":{"position":[[33,12]]},"445":{"position":[[1231,11],[1294,12],[1568,11]]},"447":{"position":[[360,12]]},"513":{"position":[[207,11]]},"514":{"position":[[110,11]]},"520":{"position":[[118,11]]},"521":{"position":[[477,11]]},"530":{"position":[[211,11]]},"569":{"position":[[1164,11],[1289,8]]},"575":{"position":[[119,12]]},"711":{"position":[[60,11]]},"1102":{"position":[[167,10],[191,11]]}},"keywords":{}}],["progress",{"_index":1152,"title":{"499":{"position":[[23,11]]},"500":{"position":[[10,11]]},"503":{"position":[[16,11]]}},"content":{"148":{"position":[[357,11]]},"375":{"position":[[890,11]]},"404":{"position":[[479,8]]},"450":{"position":[[710,8]]},"474":{"position":[[216,8]]},"500":{"position":[[1,11]]},"503":{"position":[[25,11]]},"510":{"position":[[64,11]]},"511":{"position":[[445,11]]},"584":{"position":[[221,11]]},"796":{"position":[[1235,10],[1365,10]]}},"keywords":{}}],["project",{"_index":190,"title":{"262":{"position":[[23,9]]},"730":{"position":[[0,7]]}},"content":{"13":{"position":[[110,8],[216,8]]},"15":{"position":[[548,8]]},"17":{"position":[[491,8]]},"19":{"position":[[211,8],[235,7]]},"27":{"position":[[426,7]]},"28":{"position":[[552,7]]},"31":{"position":[[17,7]]},"34":{"position":[[288,9]]},"36":{"position":[[284,8]]},"38":{"position":[[954,9]]},"61":{"position":[[243,7]]},"74":{"position":[[131,9]]},"83":{"position":[[246,9]]},"84":{"position":[[418,9]]},"114":{"position":[[431,9]]},"175":{"position":[[422,9]]},"198":{"position":[[308,9]]},"202":{"position":[[448,7]]},"241":{"position":[[190,7]]},"247":{"position":[[34,9]]},"262":{"position":[[147,7]]},"263":{"position":[[543,8]]},"285":{"position":[[95,8]]},"320":{"position":[[169,8]]},"333":{"position":[[74,7]]},"347":{"position":[[551,7]]},"356":{"position":[[856,8]]},"362":{"position":[[830,9],[1622,7]]},"373":{"position":[[190,7]]},"388":{"position":[[96,7]]},"392":{"position":[[163,9]]},"420":{"position":[[1045,8]]},"498":{"position":[[219,8]]},"579":{"position":[[17,8]]},"590":{"position":[[71,9]]},"591":{"position":[[780,9]]},"614":{"position":[[56,7]]},"670":{"position":[[201,8]]},"710":{"position":[[2533,8]]},"730":{"position":[[47,8]]},"749":{"position":[[5938,8]]},"836":{"position":[[327,7],[422,8],[493,7],[1083,7]]},"838":{"position":[[3261,8]]},"839":{"position":[[114,8]]},"840":{"position":[[698,8]]},"854":{"position":[[219,7]]},"861":{"position":[[258,8],[992,7]]},"872":{"position":[[55,8]]},"885":{"position":[[2734,8]]},"898":{"position":[[84,7],[122,8]]},"1009":{"position":[[395,8],[472,8]]},"1143":{"position":[[66,8]]},"1157":{"position":[[458,9]]}},"keywords":{}}],["project.mak",{"_index":6358,"title":{},"content":{"1280":{"position":[[40,12]]}},"keywords":{}}],["projectid",{"_index":4865,"title":{},"content":{"854":{"position":[[203,9],[269,10],[323,10],[734,10]]},"858":{"position":[[245,10]]}},"keywords":{}}],["projectrootpath",{"_index":6308,"title":{},"content":{"1266":{"position":[[256,15],[664,16]]}},"keywords":{}}],["projects.node.j",{"_index":2166,"title":{},"content":{"384":{"position":[[132,17]]}},"keywords":{}}],["projects.rxdb",{"_index":1154,"title":{},"content":{"149":{"position":[[431,13]]},"347":{"position":[[429,13]]},"362":{"position":[[1500,13]]},"511":{"position":[[431,13]]},"531":{"position":[[431,13]]},"591":{"position":[[429,13]]}},"keywords":{}}],["projecttri",{"_index":1698,"title":{},"content":{"296":{"position":[[32,10]]}},"keywords":{}}],["promis",{"_index":549,"title":{},"content":{"35":{"position":[[89,7]]},"47":{"position":[[201,7]]},"387":{"position":[[104,8]]},"439":{"position":[[419,8]]},"452":{"position":[[729,7]]},"521":{"position":[[142,7]]},"535":{"position":[[196,9]]},"595":{"position":[[209,9]]},"621":{"position":[[715,8]]},"624":{"position":[[1174,9]]},"659":{"position":[[398,7]]},"751":{"position":[[1042,7]]},"810":{"position":[[119,7]]},"835":{"position":[[211,7],[388,7]]},"886":{"position":[[230,7]]},"917":{"position":[[47,7]]},"929":{"position":[[35,7]]},"930":{"position":[[11,7]]},"931":{"position":[[11,7]]},"932":{"position":[[11,7]]},"968":{"position":[[285,7]]},"974":{"position":[[11,7]]},"975":{"position":[[11,7]]},"976":{"position":[[116,7]]},"994":{"position":[[170,7]]},"995":{"position":[[11,7],[667,7]]},"997":{"position":[[36,7]]},"1014":{"position":[[128,7]]},"1015":{"position":[[108,7]]},"1016":{"position":[[45,7]]},"1026":{"position":[[97,7]]},"1057":{"position":[[11,7]]},"1062":{"position":[[40,7]]},"1105":{"position":[[1109,8]]},"1213":{"position":[[863,8]]},"1274":{"position":[[536,9]]},"1279":{"position":[[923,9]]}},"keywords":{}}],["promise<number[]>",{"_index":2270,"title":{},"content":{"392":{"position":[[4087,23]]}},"keywords":{}}],["promise<number[]>(r",{"_index":2273,"title":{},"content":{"392":{"position":[[4258,27]]}},"keywords":{}}],["promise<sqlitedatabaseclass>",{"_index":6367,"title":{},"content":{"1281":{"position":[[303,35]]}},"keywords":{}}],["promise<void>",{"_index":160,"title":{},"content":{"11":{"position":[[556,19]]}},"keywords":{}}],["promise((r",{"_index":3000,"title":{},"content":{"459":{"position":[[846,13]]},"1294":{"position":[[1140,13]]}},"keywords":{}}],["promise(r",{"_index":163,"title":{},"content":{"11":{"position":[[589,11]]},"711":{"position":[[1556,11]]},"767":{"position":[[562,11],[971,11]]},"768":{"position":[[564,11],[973,11]]},"769":{"position":[[521,11],[942,11]]}},"keywords":{}}],["promise.al",{"_index":2394,"title":{},"content":{"398":{"position":[[835,12],[1010,13],[2121,12]]}},"keywords":{}}],["promise.all(docs.map(async",{"_index":2282,"title":{},"content":{"392":{"position":[[4738,26]]}},"keywords":{}}],["promise.all(docs.map(async(doc",{"_index":2246,"title":{},"content":{"392":{"position":[[2785,31]]},"397":{"position":[[1826,31]]}},"keywords":{}}],["promise.resolv",{"_index":6247,"title":{},"content":{"1218":{"position":[[458,17]]}},"keywords":{}}],["promise.resolve(sha256(input",{"_index":5406,"title":{},"content":{"968":{"position":[[456,31]]}},"keywords":{}}],["promot",{"_index":2160,"title":{},"content":{"382":{"position":[[118,8]]},"502":{"position":[[1290,8]]},"509":{"position":[[150,9]]}},"keywords":{}}],["prompt",{"_index":1722,"title":{},"content":{"298":{"position":[[596,7]]},"299":{"position":[[372,6],[576,8],[1296,6],[1324,6]]},"302":{"position":[[485,6],[946,6]]},"404":{"position":[[655,6]]},"408":{"position":[[577,6]]},"496":{"position":[[458,8]]},"618":{"position":[[708,9]]},"635":{"position":[[408,9]]},"696":{"position":[[1454,6]]}},"keywords":{}}],["promptli",{"_index":3254,"title":{},"content":{"517":{"position":[[310,8]]}},"keywords":{}}],["prone",{"_index":3252,"title":{},"content":{"515":{"position":[[193,5]]}},"keywords":{}}],["proof",{"_index":1887,"title":{},"content":{"314":{"position":[[14,5]]}},"keywords":{}}],["propag",{"_index":1118,"title":{},"content":{"136":{"position":[[123,10]]},"240":{"position":[[241,9]]},"267":{"position":[[549,9]]},"274":{"position":[[364,11]]},"283":{"position":[[481,10]]},"289":{"position":[[911,10]]},"412":{"position":[[725,9]]},"445":{"position":[[1079,10]]},"446":{"position":[[372,10]]},"490":{"position":[[422,9]]},"517":{"position":[[319,10]]},"519":{"position":[[202,10]]},"525":{"position":[[178,10]]},"575":{"position":[[560,10]]},"630":{"position":[[410,9]]},"875":{"position":[[6812,10]]}},"keywords":{}}],["proper",{"_index":1140,"title":{},"content":{"145":{"position":[[11,6]]},"291":{"position":[[290,6]]},"397":{"position":[[322,6]]},"453":{"position":[[820,6]]},"550":{"position":[[288,6]]},"635":{"position":[[440,6]]},"996":{"position":[[154,6]]},"1172":{"position":[[508,6]]}},"keywords":{}}],["properli",{"_index":4917,"title":{},"content":{"863":{"position":[[589,8]]},"917":{"position":[[493,8]]},"990":{"position":[[308,8],[1001,8]]},"1120":{"position":[[177,9]]},"1307":{"position":[[529,9]]}},"keywords":{}}],["properti",{"_index":772,"title":{"1084":{"position":[[12,11]]}},"content":{"51":{"position":[[389,11]]},"188":{"position":[[1266,11]]},"209":{"position":[[471,11]]},"211":{"position":[[433,11]]},"255":{"position":[[815,11]]},"259":{"position":[[115,11]]},"314":{"position":[[781,11]]},"315":{"position":[[757,11]]},"316":{"position":[[266,11]]},"334":{"position":[[667,11]]},"354":{"position":[[1290,10]]},"367":{"position":[[810,11]]},"392":{"position":[[617,11],[1583,11]]},"412":{"position":[[4907,11],[5381,10]]},"480":{"position":[[581,11]]},"482":{"position":[[881,11]]},"538":{"position":[[690,11]]},"554":{"position":[[1372,11]]},"562":{"position":[[353,11],[820,9]]},"564":{"position":[[810,11]]},"579":{"position":[[675,11],[925,8]]},"598":{"position":[[697,11]]},"632":{"position":[[1565,11]]},"636":{"position":[[230,8]]},"638":{"position":[[649,11]]},"639":{"position":[[427,11]]},"662":{"position":[[2428,11]]},"680":{"position":[[857,11]]},"685":{"position":[[320,9],[618,10]]},"687":{"position":[[336,11]]},"691":{"position":[[565,11]]},"714":{"position":[[132,10]]},"717":{"position":[[1292,9],[1466,11]]},"720":{"position":[[93,8],[165,11]]},"724":{"position":[[870,8]]},"734":{"position":[[731,11]]},"749":{"position":[[3692,10],[11265,8],[13100,10],[18434,10],[19724,12],[20048,8]]},"751":{"position":[[190,8]]},"754":{"position":[[183,9]]},"780":{"position":[[375,10]]},"804":{"position":[[10,8]]},"805":{"position":[[16,8]]},"808":{"position":[[20,10],[208,11],[580,11]]},"812":{"position":[[103,11],[169,11]]},"813":{"position":[[103,11]]},"838":{"position":[[2642,11]]},"848":{"position":[[353,8]]},"862":{"position":[[697,11]]},"872":{"position":[[1914,11],[4144,11]]},"887":{"position":[[143,11]]},"898":{"position":[[2494,11]]},"904":{"position":[[904,11]]},"916":{"position":[[172,11]]},"932":{"position":[[1224,11]]},"944":{"position":[[643,8]]},"968":{"position":[[625,10]]},"987":{"position":[[1032,8]]},"988":{"position":[[1696,8]]},"993":{"position":[[72,11]]},"1040":{"position":[[5,10]]},"1074":{"position":[[128,8]]},"1077":{"position":[[52,8]]},"1078":{"position":[[74,10],[510,11]]},"1080":{"position":[[133,11],[670,11]]},"1082":{"position":[[218,11]]},"1083":{"position":[[418,11]]},"1084":{"position":[[541,10],[646,8]]},"1085":{"position":[[1145,8],[1912,11],[2040,11],[2236,10],[2265,8],[2609,11]]},"1106":{"position":[[479,8]]},"1116":{"position":[[168,10],[374,8],[462,8],[578,8]]},"1117":{"position":[[248,8]]},"1149":{"position":[[1095,11]]},"1158":{"position":[[405,11]]},"1213":{"position":[[895,10]]},"1304":{"position":[[79,10]]},"1308":{"position":[[417,12]]},"1309":{"position":[[831,11],[1113,10],[1306,8]]},"1311":{"position":[[433,11],[1596,8]]}},"keywords":{}}],["proportion",{"_index":2326,"title":{},"content":{"394":{"position":[[1531,15]]}},"keywords":{}}],["propos",{"_index":2653,"title":{},"content":{"412":{"position":[[453,8]]},"451":{"position":[[32,8]]},"458":{"position":[[949,8]]}},"keywords":{}}],["proprietari",{"_index":1542,"title":{},"content":{"249":{"position":[[42,11]]},"381":{"position":[[424,11]]},"412":{"position":[[1339,11]]}},"keywords":{}}],["protect",{"_index":934,"title":{},"content":{"65":{"position":[[1788,10]]},"95":{"position":[[216,10]]},"139":{"position":[[109,7]]},"173":{"position":[[1307,9]]},"195":{"position":[[138,7]]},"218":{"position":[[288,10]]},"249":{"position":[[315,8]]},"291":{"position":[[332,10]]},"318":{"position":[[428,7]]},"377":{"position":[[373,7]]},"417":{"position":[[418,7]]},"479":{"position":[[260,7]]},"526":{"position":[[163,9]]},"556":{"position":[[732,10]]},"567":{"position":[[684,10]]},"586":{"position":[[135,10]]},"638":{"position":[[175,7]]},"897":{"position":[[470,7]]},"898":{"position":[[2830,11]]},"912":{"position":[[430,9]]}},"keywords":{}}],["protocol",{"_index":1189,"title":{},"content":{"165":{"position":[[180,10]]},"202":{"position":[[329,9]]},"248":{"position":[[245,8]]},"255":{"position":[[76,8]]},"262":{"position":[[119,8]]},"412":{"position":[[1327,8],[11597,8]]},"491":{"position":[[664,9],[1713,9],[1885,9]]},"613":{"position":[[148,8]]},"614":{"position":[[450,9]]},"620":{"position":[[566,9]]},"621":{"position":[[817,8]]},"623":{"position":[[394,8]]},"624":{"position":[[230,9],[379,10]]},"705":{"position":[[1343,9]]},"871":{"position":[[798,8]]},"903":{"position":[[498,8],[621,8]]},"981":{"position":[[57,10],[667,8],[1265,8]]},"1005":{"position":[[22,8]]},"1316":{"position":[[333,8],[1363,8]]}},"keywords":{}}],["prototyp",{"_index":534,"title":{"805":{"position":[[0,11]]}},"content":{"34":{"position":[[298,12]]},"662":{"position":[[1140,11]]},"701":{"position":[[44,10]]},"772":{"position":[[2065,10]]},"784":{"position":[[827,10]]},"805":{"position":[[5,10],[73,9],[135,9],[252,10]]},"806":{"position":[[52,9]]},"1157":{"position":[[468,11]]},"1271":{"position":[[528,10]]}},"keywords":{}}],["prove",{"_index":1195,"title":{},"content":{"170":{"position":[[602,6]]},"289":{"position":[[1804,6]]},"354":{"position":[[663,5]]}},"keywords":{}}],["proven",{"_index":253,"title":{"386":{"position":[[0,6]]}},"content":{"15":{"position":[[240,6],[465,6]]},"1199":{"position":[[13,6]]}},"keywords":{}}],["provid",{"_index":293,"title":{"751":{"position":[[0,9]]}},"content":{"17":{"position":[[299,8]]},"18":{"position":[[128,8]]},"21":{"position":[[56,8]]},"22":{"position":[[178,9]]},"28":{"position":[[254,8]]},"33":{"position":[[57,9]]},"34":{"position":[[543,8]]},"35":{"position":[[70,8],[374,7]]},"40":{"position":[[201,8]]},"42":{"position":[[10,8],[205,9]]},"46":{"position":[[110,8]]},"73":{"position":[[79,7]]},"79":{"position":[[6,8]]},"84":{"position":[[312,8],[345,8]]},"87":{"position":[[205,8]]},"90":{"position":[[289,9]]},"99":{"position":[[294,7]]},"101":{"position":[[163,7]]},"103":{"position":[[6,8]]},"106":{"position":[[51,9]]},"110":{"position":[[97,8]]},"114":{"position":[[325,8],[358,8]]},"116":{"position":[[196,8]]},"117":{"position":[[56,9]]},"118":{"position":[[182,7]]},"120":{"position":[[211,8]]},"123":{"position":[[6,8]]},"125":{"position":[[6,8],[280,9]]},"130":{"position":[[9,8]]},"131":{"position":[[487,8],[777,8]]},"132":{"position":[[120,8]]},"134":{"position":[[267,8]]},"136":{"position":[[6,8]]},"139":{"position":[[6,8]]},"145":{"position":[[235,7]]},"146":{"position":[[6,8],[317,8]]},"147":{"position":[[167,8]]},"148":{"position":[[271,7]]},"149":{"position":[[325,8],[358,8]]},"152":{"position":[[64,9]]},"155":{"position":[[85,8]]},"156":{"position":[[96,7]]},"158":{"position":[[81,8]]},"162":{"position":[[6,8],[299,9]]},"165":{"position":[[6,8]]},"167":{"position":[[53,8]]},"169":{"position":[[52,8]]},"170":{"position":[[6,8]]},"174":{"position":[[762,8],[1805,8],[2291,9],[2614,8]]},"175":{"position":[[318,8]]},"177":{"position":[[217,8]]},"178":{"position":[[56,9]]},"181":{"position":[[111,8]]},"184":{"position":[[82,8]]},"189":{"position":[[212,8],[569,7]]},"191":{"position":[[275,9]]},"192":{"position":[[6,8]]},"196":{"position":[[6,8]]},"198":{"position":[[426,7]]},"205":{"position":[[399,9]]},"217":{"position":[[231,7]]},"219":{"position":[[20,7],[322,8]]},"221":{"position":[[264,9]]},"223":{"position":[[160,7]]},"226":{"position":[[362,7]]},"229":{"position":[[101,8]]},"231":{"position":[[210,8]]},"232":{"position":[[85,8]]},"236":{"position":[[6,8]]},"239":{"position":[[6,8]]},"240":{"position":[[153,9]]},"266":{"position":[[329,9]]},"267":{"position":[[422,9],[1052,9],[1365,7],[1567,8]]},"269":{"position":[[324,7]]},"270":{"position":[[170,7]]},"274":{"position":[[177,9]]},"277":{"position":[[199,7]]},"287":{"position":[[66,8],[1044,7]]},"288":{"position":[[203,8]]},"289":{"position":[[1249,8]]},"290":{"position":[[234,9]]},"295":{"position":[[294,8]]},"300":{"position":[[472,7]]},"318":{"position":[[147,8]]},"320":{"position":[[8,8]]},"322":{"position":[[87,7]]},"329":{"position":[[33,8]]},"331":{"position":[[329,9]]},"347":{"position":[[325,8]]},"362":{"position":[[742,7],[1396,8]]},"367":{"position":[[297,8]]},"368":{"position":[[350,9]]},"369":{"position":[[1251,7]]},"372":{"position":[[139,9]]},"381":{"position":[[366,8]]},"386":{"position":[[284,8]]},"390":{"position":[[1805,7]]},"392":{"position":[[2367,8]]},"393":{"position":[[312,8]]},"396":{"position":[[1936,8]]},"408":{"position":[[2056,9],[2216,7]]},"410":{"position":[[173,7]]},"411":{"position":[[5376,9]]},"412":{"position":[[11680,9],[11755,7]]},"417":{"position":[[306,9]]},"420":{"position":[[1569,7]]},"424":{"position":[[376,8]]},"430":{"position":[[291,7]]},"432":{"position":[[1210,9]]},"433":{"position":[[67,8]]},"436":{"position":[[237,9]]},"439":{"position":[[436,8]]},"444":{"position":[[509,9]]},"445":{"position":[[228,8]]},"446":{"position":[[1051,7]]},"451":{"position":[[103,8]]},"494":{"position":[[219,8]]},"511":{"position":[[325,8],[358,8]]},"517":{"position":[[130,8]]},"519":{"position":[[261,9]]},"520":{"position":[[226,7],[425,8]]},"521":{"position":[[493,9]]},"523":{"position":[[24,8]]},"524":{"position":[[334,9]]},"527":{"position":[[81,8]]},"529":{"position":[[164,8]]},"531":{"position":[[325,8],[358,8]]},"533":{"position":[[100,8]]},"535":{"position":[[732,7]]},"538":{"position":[[6,8]]},"540":{"position":[[16,9]]},"542":{"position":[[946,8]]},"560":{"position":[[176,7]]},"564":{"position":[[148,8],[532,7]]},"565":{"position":[[67,8]]},"575":{"position":[[218,9]]},"576":{"position":[[347,9]]},"579":{"position":[[888,9]]},"582":{"position":[[556,8]]},"591":{"position":[[325,8]]},"593":{"position":[[100,8]]},"595":{"position":[[753,7]]},"598":{"position":[[6,8]]},"600":{"position":[[16,9]]},"611":{"position":[[12,7],[1379,8]]},"612":{"position":[[26,7]]},"619":{"position":[[280,8]]},"621":{"position":[[214,8]]},"635":{"position":[[316,8]]},"693":{"position":[[295,8]]},"702":{"position":[[617,7]]},"703":{"position":[[846,7]]},"715":{"position":[[104,7],[370,9]]},"723":{"position":[[303,9]]},"746":{"position":[[202,7]]},"749":{"position":[[23973,7],[24249,8]]},"751":{"position":[[44,7]]},"760":{"position":[[225,9]]},"772":{"position":[[123,8]]},"775":{"position":[[200,8]]},"781":{"position":[[668,7]]},"782":{"position":[[212,8]]},"802":{"position":[[415,7]]},"829":{"position":[[882,9],[988,8],[1134,8],[2194,8],[3088,8]]},"830":{"position":[[15,9]]},"836":{"position":[[858,7]]},"838":{"position":[[3281,8]]},"846":{"position":[[456,8]]},"854":{"position":[[879,9]]},"860":{"position":[[295,8]]},"886":{"position":[[4661,7],[4776,9]]},"889":{"position":[[816,8]]},"894":{"position":[[70,8]]},"904":{"position":[[1533,7],[2651,8]]},"906":{"position":[[525,8]]},"912":{"position":[[241,9]]},"945":{"position":[[270,9]]},"968":{"position":[[194,7]]},"985":{"position":[[180,7]]},"988":{"position":[[2132,9]]},"1072":{"position":[[1032,7],[1268,7]]},"1076":{"position":[[97,7]]},"1085":{"position":[[2636,7]]},"1101":{"position":[[364,8]]},"1102":{"position":[[761,8]]},"1104":{"position":[[107,8]]},"1132":{"position":[[985,9]]},"1140":{"position":[[25,8],[421,9]]},"1147":{"position":[[168,8]]},"1148":{"position":[[42,8]]},"1150":{"position":[[192,8]]},"1164":{"position":[[21,8]]},"1206":{"position":[[266,8]]},"1209":{"position":[[44,8]]},"1215":{"position":[[158,8]]},"1247":{"position":[[306,8],[479,8],[666,8]]},"1289":{"position":[[23,7]]}},"keywords":{}}],["prowess",{"_index":3230,"title":{},"content":{"502":{"position":[[1165,7]]}},"keywords":{}}],["proxi",{"_index":3629,"title":{"619":{"position":[[0,7]]},"1040":{"position":[[0,5]]}},"content":{"616":{"position":[[915,7]]},"617":{"position":[[683,6],[692,5],[752,6]]},"619":{"position":[[191,7]]},"627":{"position":[[105,7]]},"749":{"position":[[12123,5]]},"849":{"position":[[626,5],[812,8]]},"1018":{"position":[[441,5]]}},"keywords":{}}],["proxim",{"_index":2142,"title":{},"content":{"376":{"position":[[60,9]]},"390":{"position":[[1361,9]]}},"keywords":{}}],["proxy_add_x_forward",{"_index":4857,"title":{},"content":{"849":{"position":[[1062,22]]}},"keywords":{}}],["proxy_buff",{"_index":4854,"title":{},"content":{"849":{"position":[[979,15]]}},"keywords":{}}],["proxy_pass",{"_index":4851,"title":{},"content":{"849":{"position":[[925,10]]}},"keywords":{}}],["proxy_redirect",{"_index":4853,"title":{},"content":{"849":{"position":[[959,14]]}},"keywords":{}}],["proxy_set_head",{"_index":4855,"title":{},"content":{"849":{"position":[[1000,16],[1029,16],[1085,16]]}},"keywords":{}}],["pseudo",{"_index":3042,"title":{},"content":{"464":{"position":[[194,6]]},"1018":{"position":[[434,6]]}},"keywords":{}}],["pub.dev",{"_index":1270,"title":{},"content":{"188":{"position":[[2160,8]]}},"keywords":{}}],["public",{"_index":2198,"title":{},"content":{"390":{"position":[[1095,6]]},"898":{"position":[[1409,11],[1458,11]]}},"keywords":{}}],["public.human",{"_index":5206,"title":{},"content":{"898":{"position":[[1306,13]]}},"keywords":{}}],["publish",{"_index":1269,"title":{},"content":{"188":{"position":[[2138,9]]}},"keywords":{}}],["pubspec.yaml",{"_index":1267,"title":{},"content":{"188":{"position":[[1909,13],[2277,12]]}},"keywords":{}}],["pull",{"_index":1024,"title":{"1005":{"position":[[0,4]]}},"content":{"99":{"position":[[116,5]]},"208":{"position":[[124,5]]},"209":{"position":[[977,5]]},"255":{"position":[[95,5],[1312,5]]},"261":{"position":[[778,5],[800,4]]},"412":{"position":[[2635,6],[6704,7],[8305,7]]},"481":{"position":[[69,5],[725,5]]},"494":{"position":[[518,5]]},"571":{"position":[[526,4]]},"582":{"position":[[379,7]]},"630":{"position":[[850,4]]},"632":{"position":[[42,7],[2310,4],[2357,5]]},"650":{"position":[[109,4]]},"668":{"position":[[15,4]]},"679":{"position":[[116,4]]},"739":{"position":[[62,6],[118,7]]},"749":{"position":[[493,4],[15488,4],[15622,4],[22481,4]]},"756":{"position":[[370,4],[445,4]]},"846":{"position":[[639,5],[770,6]]},"848":{"position":[[860,5],[1542,5]]},"852":{"position":[[330,5]]},"854":{"position":[[842,4],[984,5]]},"858":{"position":[[320,5]]},"862":{"position":[[1381,5]]},"866":{"position":[[850,5]]},"872":{"position":[[2578,5],[4594,5]]},"875":{"position":[[563,5],[1284,4],[1348,4],[1733,4],[2901,4],[3134,5],[6550,4],[8443,5],[9304,4],[9742,5]]},"878":{"position":[[547,5]]},"886":{"position":[[1,4],[28,4],[432,4],[897,4],[1136,5],[1259,6],[3181,5],[3218,4],[3287,4],[3304,5],[3346,4],[4149,5],[5035,4]]},"887":{"position":[[181,6],[402,5]]},"888":{"position":[[543,5]]},"889":{"position":[[757,5]]},"897":{"position":[[120,5]]},"898":{"position":[[652,4],[2011,4],[3458,5],[3635,4]]},"904":{"position":[[3088,5]]},"907":{"position":[[365,5]]},"911":{"position":[[833,5]]},"982":{"position":[[285,5]]},"984":{"position":[[193,6]]},"985":{"position":[[377,4]]},"986":{"position":[[1596,4]]},"988":{"position":[[3485,5],[3499,4],[3886,6],[4236,4],[4540,6],[4894,4]]},"990":{"position":[[966,4]]},"993":{"position":[[390,4]]},"1002":{"position":[[947,4],[1108,4],[1322,5]]},"1004":{"position":[[667,6]]},"1005":{"position":[[52,4],[89,6],[236,4]]},"1007":{"position":[[513,4],[1462,5]]},"1010":{"position":[[188,4]]},"1101":{"position":[[805,5]]},"1121":{"position":[[751,5]]},"1135":{"position":[[347,4]]},"1309":{"position":[[222,4]]}},"keywords":{}}],["pull.filt",{"_index":4886,"title":{},"content":{"858":{"position":[[135,11],[537,11]]}},"keywords":{}}],["pull.handl",{"_index":5005,"title":{},"content":{"875":{"position":[[2940,12]]},"888":{"position":[[715,13]]}},"keywords":{}}],["pull.initialcheckpoint",{"_index":5539,"title":{},"content":{"1002":{"position":[[800,23]]}},"keywords":{}}],["pull.modifi",{"_index":5228,"title":{},"content":{"898":{"position":[[4416,13]]},"1009":{"position":[[980,14]]}},"keywords":{}}],["pull.responsemodifi",{"_index":5153,"title":{"888":{"position":[[0,22]]}},"content":{"888":{"position":[[10,21]]}},"keywords":{}}],["pull.stream",{"_index":5016,"title":{},"content":{"875":{"position":[[4235,13],[4363,12],[7835,12],[8814,13]]},"876":{"position":[[316,12]]},"888":{"position":[[761,11]]},"996":{"position":[[161,12]]},"1107":{"position":[[330,12]]}},"keywords":{}}],["pull/push",{"_index":6084,"title":{},"content":{"1149":{"position":[[428,9]]}},"keywords":{}}],["pullhandl",{"_index":5440,"title":{},"content":{"983":{"position":[[189,11],[862,13]]},"984":{"position":[[257,14]]},"986":{"position":[[1261,14]]}},"keywords":{}}],["pullhuman",{"_index":5090,"title":{},"content":{"885":{"position":[[1427,9],[1480,10]]},"886":{"position":[[798,12],[1714,11]]}},"keywords":{}}],["pullhuman($checkpoint",{"_index":5117,"title":{},"content":{"886":{"position":[[581,22]]}},"keywords":{}}],["pullhuman(checkpoint",{"_index":5082,"title":{},"content":{"885":{"position":[[846,21]]},"886":{"position":[[637,21]]}},"keywords":{}}],["pullquerybuild",{"_index":5115,"title":{},"content":{"886":{"position":[[63,17],[369,16],[1158,17],[4187,17]]},"887":{"position":[[424,17]]}},"keywords":{}}],["pullquerybuilderfromrxschema",{"_index":5167,"title":{},"content":{"889":{"position":[[875,31]]}},"keywords":{}}],["pullstream",{"_index":5015,"title":{},"content":{"875":{"position":[[4196,11],[4409,11],[6511,11],[6886,10],[6935,11],[7577,11],[7756,11],[8517,11]]},"983":{"position":[[1010,11]]},"985":{"position":[[92,11],[195,11],[493,11],[547,11]]},"988":{"position":[[5071,11]]}},"keywords":{}}],["pullstream$.asobserv",{"_index":5473,"title":{},"content":{"988":{"position":[[4841,26]]}},"keywords":{}}],["pullstream$.next('resync",{"_index":5485,"title":{},"content":{"988":{"position":[[6131,27]]}},"keywords":{}}],["pullstream$.next(event.data",{"_index":5480,"title":{},"content":{"988":{"position":[[5573,29]]}},"keywords":{}}],["pullstream$.subscribe(ev",{"_index":5043,"title":{},"content":{"875":{"position":[[7402,27]]}},"keywords":{}}],["pullstreambuilderfromrxschema",{"_index":5168,"title":{},"content":{"889":{"position":[[907,31]]}},"keywords":{}}],["pullstreamquerybuild",{"_index":5134,"title":{},"content":{"886":{"position":[[3466,22],[3737,22],[4225,23]]}},"keywords":{}}],["punch",{"_index":5237,"title":{},"content":{"901":{"position":[[339,5]]}},"keywords":{}}],["purchas",{"_index":1891,"title":{},"content":{"314":{"position":[[999,8]]},"420":{"position":[[1069,8]]},"662":{"position":[[1059,10]]},"710":{"position":[[889,10]]},"724":{"position":[[66,9]]},"749":{"position":[[9344,9]]},"838":{"position":[[1547,10]]},"958":{"position":[[652,8]]},"1129":{"position":[[55,10]]},"1141":{"position":[[55,10]]},"1210":{"position":[[271,10]]}},"keywords":{}}],["pure",{"_index":1582,"title":{},"content":{"261":{"position":[[66,4]]},"354":{"position":[[1006,6]]},"412":{"position":[[6575,6],[8417,6]]},"414":{"position":[[250,6]]},"476":{"position":[[21,6]]},"566":{"position":[[1066,6]]},"839":{"position":[[1213,6]]},"1219":{"position":[[636,4]]}},"keywords":{}}],["purg",{"_index":3748,"title":{},"content":{"653":{"position":[[442,6]]},"654":{"position":[[338,5]]},"655":{"position":[[71,7],[361,5],[456,5]]},"837":{"position":[[482,5]]},"1047":{"position":[[74,5],[189,5]]},"1198":{"position":[[557,7]]}},"keywords":{}}],["purpos",{"_index":2913,"title":{},"content":{"434":{"position":[[387,8]]},"554":{"position":[[356,9]]},"614":{"position":[[979,7]]},"749":{"position":[[5749,7]]},"829":{"position":[[3074,8]]},"875":{"position":[[9024,7]]},"906":{"position":[[322,8]]},"1316":{"position":[[2045,8],[3682,7]]}},"keywords":{}}],["purposes.sqlit",{"_index":3286,"title":{},"content":{"524":{"position":[[578,15]]}},"keywords":{}}],["pursuit",{"_index":2137,"title":{},"content":{"373":{"position":[[710,7]]}},"keywords":{}}],["push",{"_index":347,"title":{},"content":{"20":{"position":[[40,6]]},"99":{"position":[[73,6]]},"209":{"position":[[711,5]]},"226":{"position":[[69,6]]},"255":{"position":[[1063,5]]},"261":{"position":[[812,5],[833,4]]},"408":{"position":[[5,4]]},"410":{"position":[[1756,4]]},"412":{"position":[[2676,7],[4727,6]]},"476":{"position":[[110,4]]},"481":{"position":[[30,6],[768,5]]},"491":{"position":[[287,6],[1282,6]]},"496":{"position":[[721,4],[766,4]]},"510":{"position":[[542,4]]},"571":{"position":[[521,4]]},"582":{"position":[[345,6]]},"584":{"position":[[152,6]]},"610":{"position":[[158,4]]},"612":{"position":[[52,4]]},"618":{"position":[[544,4],[637,4]]},"630":{"position":[[842,4]]},"632":{"position":[[74,7],[2336,4],[2494,5]]},"749":{"position":[[485,4],[15754,4],[15892,4]]},"781":{"position":[[476,4]]},"846":{"position":[[1076,5]]},"848":{"position":[[870,5],[1552,5]]},"852":{"position":[[340,5]]},"854":{"position":[[833,4],[994,5]]},"858":{"position":[[374,5]]},"862":{"position":[[1407,5]]},"863":{"position":[[367,4]]},"866":{"position":[[875,5]]},"871":{"position":[[178,6]]},"872":{"position":[[2603,5],[4619,5]]},"875":{"position":[[522,5],[3565,4],[5719,4],[5979,4],[6002,4],[6178,5]]},"878":{"position":[[537,5]]},"885":{"position":[[258,4]]},"886":{"position":[[2058,4],[2085,4],[2598,4],[2768,5],[2900,6],[3000,6],[4044,5]]},"887":{"position":[[383,5]]},"888":{"position":[[524,5]]},"889":{"position":[[48,4],[573,5]]},"898":{"position":[[1983,4],[3871,5]]},"904":{"position":[[3098,5]]},"907":{"position":[[375,5]]},"911":{"position":[[843,5]]},"982":{"position":[[160,4],[370,6]]},"986":{"position":[[1605,4]]},"988":{"position":[[2386,5],[2400,4],[2444,4],[2767,5],[2969,4],[3066,4],[3170,4]]},"990":{"position":[[974,5]]},"993":{"position":[[378,4]]},"1002":{"position":[[17,4],[76,4],[202,4],[455,4],[668,5]]},"1004":{"position":[[234,4],[261,6],[530,6]]},"1005":{"position":[[119,6]]},"1007":{"position":[[588,4],[1626,5]]},"1101":{"position":[[795,5]]},"1121":{"position":[[761,5]]},"1308":{"position":[[607,6]]},"1309":{"position":[[229,4],[653,6]]}},"keywords":{}}],["push.filt",{"_index":4885,"title":{},"content":{"858":{"position":[[119,11]]}},"keywords":{}}],["push.handl",{"_index":5013,"title":{},"content":{"875":{"position":[[3647,13],[6039,12]]}},"keywords":{}}],["push.initialcheckpoint",{"_index":5536,"title":{},"content":{"1002":{"position":[[141,23]]}},"keywords":{}}],["push.responsemodifi",{"_index":5160,"title":{"889":{"position":[[0,22]]}},"content":{},"keywords":{}}],["push/pul",{"_index":953,"title":{"68":{"position":[[0,9]]},"99":{"position":[[0,9]]},"226":{"position":[[0,9]]}},"content":{"68":{"position":[[27,9]]},"99":{"position":[[35,9]]},"226":{"position":[[35,9]]},"360":{"position":[[475,9]]},"986":{"position":[[634,9]]}},"keywords":{}}],["pushes/pul",{"_index":2611,"title":{},"content":{"411":{"position":[[1453,12]]}},"keywords":{}}],["pushhandl",{"_index":5444,"title":{},"content":{"983":{"position":[[940,13]]},"987":{"position":[[343,14]]}},"keywords":{}}],["pushhuman",{"_index":5133,"title":{},"content":{"886":{"position":[[2522,12]]}},"keywords":{}}],["pushhuman($writerow",{"_index":5130,"title":{},"content":{"886":{"position":[[2334,21]]}},"keywords":{}}],["pushhuman(row",{"_index":5087,"title":{},"content":{"885":{"position":[[1168,15]]},"889":{"position":[[327,15]]}},"keywords":{}}],["pushhuman(writerow",{"_index":5131,"title":{},"content":{"886":{"position":[[2380,20]]}},"keywords":{}}],["pushing/pul",{"_index":5253,"title":{},"content":{"903":{"position":[[520,15]]}},"keywords":{}}],["pushquerybuild",{"_index":5129,"title":{},"content":{"886":{"position":[[2277,16],[2790,17],[4082,16]]}},"keywords":{}}],["pushquerybuilderfromrxschema",{"_index":5169,"title":{},"content":{"889":{"position":[[943,30]]}},"keywords":{}}],["pushrespons",{"_index":5161,"title":{},"content":{"889":{"position":[[141,12],[252,12],[366,13]]}},"keywords":{}}],["put",{"_index":2733,"title":{},"content":{"412":{"position":[[9045,7]]},"454":{"position":[[918,3]]},"458":{"position":[[381,4]]},"616":{"position":[[776,3]]},"851":{"position":[[194,3],[392,5]]},"988":{"position":[[477,3]]},"1088":{"position":[[733,3]]},"1089":{"position":[[52,3]]},"1226":{"position":[[421,3]]},"1264":{"position":[[331,3]]}},"keywords":{}}],["putattach",{"_index":5287,"title":{"917":{"position":[[0,16]]}},"content":{"918":{"position":[[9,15]]}},"keywords":{}}],["putattachmentbase64",{"_index":5293,"title":{"918":{"position":[[0,22]]}},"content":{"917":{"position":[[566,21]]}},"keywords":{}}],["pwa",{"_index":2141,"title":{"499":{"position":[[44,5]]},"501":{"position":[[47,5]]}},"content":{"375":{"position":[[911,7]]},"384":{"position":[[128,3]]},"500":{"position":[[245,4],[360,4],[633,4],[705,4]]},"501":{"position":[[17,4],[348,5]]},"502":{"position":[[212,5],[319,4],[415,4],[743,4],[1272,4]]},"503":{"position":[[250,4]]},"504":{"position":[[524,4],[567,3],[643,3],[1252,4]]},"506":{"position":[[15,4]]},"507":{"position":[[48,5]]},"508":{"position":[[133,4]]},"509":{"position":[[42,4]]},"510":{"position":[[186,4],[419,5],[457,4],[666,4]]},"584":{"position":[[242,6]]},"783":{"position":[[361,4]]},"1302":{"position":[[113,3]]}},"keywords":{}}],["python",{"_index":1543,"title":{},"content":{"249":{"position":[[129,7]]}},"keywords":{}}],["qa",{"_index":1788,"title":{},"content":{"301":{"position":[[528,3]]}},"keywords":{}}],["qu1",{"_index":4152,"title":{},"content":{"749":{"position":[[1651,3]]}},"keywords":{}}],["qu10",{"_index":4163,"title":{},"content":{"749":{"position":[[2200,4]]}},"keywords":{}}],["qu11",{"_index":4164,"title":{},"content":{"749":{"position":[[2294,4]]}},"keywords":{}}],["qu12",{"_index":4167,"title":{},"content":{"749":{"position":[[2387,4]]}},"keywords":{}}],["qu13",{"_index":4168,"title":{},"content":{"749":{"position":[[2472,4]]}},"keywords":{}}],["qu14",{"_index":4169,"title":{},"content":{"749":{"position":[[2589,4]]}},"keywords":{}}],["qu15",{"_index":4171,"title":{},"content":{"749":{"position":[[2830,4]]}},"keywords":{}}],["qu16",{"_index":4172,"title":{},"content":{"749":{"position":[[2943,4]]}},"keywords":{}}],["qu17",{"_index":4175,"title":{},"content":{"749":{"position":[[3176,4]]}},"keywords":{}}],["qu18",{"_index":4177,"title":{},"content":{"749":{"position":[[3296,4]]}},"keywords":{}}],["qu19",{"_index":4180,"title":{},"content":{"749":{"position":[[3652,4]]}},"keywords":{}}],["qu4",{"_index":4155,"title":{},"content":{"749":{"position":[[1748,3]]}},"keywords":{}}],["qu5",{"_index":4157,"title":{},"content":{"749":{"position":[[1865,3]]}},"keywords":{}}],["qu6",{"_index":4159,"title":{},"content":{"749":{"position":[[1991,3]]}},"keywords":{}}],["qu9",{"_index":4161,"title":{},"content":{"749":{"position":[[2094,3]]}},"keywords":{}}],["qualiti",{"_index":1420,"title":{},"content":{"232":{"position":[[201,7]]},"387":{"position":[[372,9]]}},"keywords":{}}],["quarter",{"_index":6453,"title":{},"content":{"1295":{"position":[[1080,7]]}},"keywords":{}}],["queri",{"_index":273,"title":{"53":{"position":[[9,7]]},"77":{"position":[[11,7]]},"78":{"position":[[19,7]]},"92":{"position":[[8,7]]},"103":{"position":[[11,7]]},"108":{"position":[[19,7]]},"124":{"position":[[11,8]]},"130":{"position":[[46,6]]},"159":{"position":[[11,8]]},"185":{"position":[[11,8]]},"205":{"position":[[18,8]]},"220":{"position":[[18,8]]},"233":{"position":[[11,7]]},"234":{"position":[[19,7]]},"252":{"position":[[16,5]]},"270":{"position":[[12,8]]},"275":{"position":[[11,8]]},"276":{"position":[[6,5]]},"329":{"position":[[11,8]]},"400":{"position":[[19,5]]},"518":{"position":[[11,8]]},"540":{"position":[[9,7]]},"555":{"position":[[17,8]]},"585":{"position":[[11,7]]},"600":{"position":[[9,7]]},"714":{"position":[[0,8]]},"796":{"position":[[9,5]]},"799":{"position":[[7,5]]},"801":{"position":[[8,7]]},"817":{"position":[[20,8]]},"819":{"position":[[0,5]]},"1064":{"position":[[0,5]]},"1065":{"position":[[0,5]]},"1105":{"position":[[0,5]]},"1110":{"position":[[7,7]]},"1150":{"position":[[21,8]]},"1238":{"position":[[5,5]]},"1252":{"position":[[12,8]]},"1315":{"position":[[11,7]]},"1321":{"position":[[8,5]]}},"content":{"16":{"position":[[252,5],[556,7]]},"17":{"position":[[447,5]]},"19":{"position":[[299,5],[347,7],[633,5],[805,5]]},"22":{"position":[[250,7]]},"23":{"position":[[452,5]]},"25":{"position":[[125,5],[187,5]]},"28":{"position":[[149,8]]},"32":{"position":[[138,5]]},"33":{"position":[[247,7],[359,7],[649,7]]},"34":{"position":[[179,7],[559,5],[617,5]]},"35":{"position":[[405,8],[672,9]]},"39":{"position":[[373,5]]},"40":{"position":[[548,8],[675,5]]},"45":{"position":[[264,5]]},"46":{"position":[[575,7],[663,7]]},"47":{"position":[[439,5],[469,7]]},"56":{"position":[[138,8]]},"64":{"position":[[149,8]]},"65":{"position":[[1022,8],[1044,7]]},"77":{"position":[[31,7],[204,5]]},"91":{"position":[[34,5],[77,7]]},"92":{"position":[[50,7],[160,5]]},"103":{"position":[[26,8],[244,5]]},"108":{"position":[[61,8],[162,5]]},"120":{"position":[[341,5]]},"124":{"position":[[24,8],[71,8],[114,7],[214,8]]},"130":{"position":[[211,5],[354,6],[506,5]]},"138":{"position":[[12,5],[146,5]]},"159":{"position":[[43,8],[93,8],[124,8],[175,7]]},"166":{"position":[[162,5]]},"173":{"position":[[1907,8],[1958,7],[2138,5],[2485,7],[2545,7]]},"174":{"position":[[174,7],[274,7],[1521,7],[1626,8],[1694,5],[1733,5]]},"182":{"position":[[234,7]]},"185":{"position":[[43,8],[62,7],[250,6]]},"188":{"position":[[3022,5],[3057,5],[3124,5],[3216,5]]},"194":{"position":[[42,5],[189,7]]},"197":{"position":[[203,5]]},"204":{"position":[[51,5],[160,7]]},"205":{"position":[[44,8],[316,5]]},"212":{"position":[[210,8],[246,7]]},"220":{"position":[[39,7],[139,6],[168,7]]},"224":{"position":[[193,7]]},"227":{"position":[[340,7]]},"233":{"position":[[43,8],[80,7]]},"234":{"position":[[25,7],[304,5]]},"251":{"position":[[11,7],[61,7]]},"252":{"position":[[13,5],[203,8],[327,5]]},"260":{"position":[[207,7]]},"262":{"position":[[203,5],[324,8],[345,5],[457,7]]},"263":{"position":[[215,8]]},"266":{"position":[[876,5]]},"270":{"position":[[13,8]]},"275":{"position":[[69,8]]},"276":{"position":[[14,5],[60,7],[270,5]]},"283":{"position":[[126,5]]},"322":{"position":[[200,5]]},"323":{"position":[[414,8],[464,7]]},"329":{"position":[[19,8],[53,8],[90,5]]},"335":{"position":[[43,5]]},"338":{"position":[[75,5]]},"342":{"position":[[30,7],[124,5]]},"346":{"position":[[275,7],[841,5]]},"354":{"position":[[701,8],[850,8],[1448,8]]},"356":{"position":[[649,7]]},"357":{"position":[[199,7]]},"360":{"position":[[221,7],[275,5],[315,5]]},"362":{"position":[[283,7],[875,8]]},"366":{"position":[[231,7],[366,5],[615,6]]},"368":{"position":[[245,8],[291,7]]},"369":{"position":[[120,9],[173,8],[412,5],[1195,7]]},"376":{"position":[[90,7],[501,8]]},"383":{"position":[[293,5]]},"390":{"position":[[71,8],[438,5],[679,5],[1011,9],[1256,6],[1277,5]]},"393":{"position":[[608,5],[1145,5]]},"394":{"position":[[124,5],[182,6],[400,5]]},"395":{"position":[[139,6],[233,7]]},"396":{"position":[[61,5]]},"398":{"position":[[423,8],[465,5],[1753,5],[3517,5]]},"400":{"position":[[1,5],[155,5],[274,7],[564,5],[754,5]]},"402":{"position":[[627,5],[1037,5],[1094,7],[1400,7],[1664,5],[2233,6]]},"404":{"position":[[615,5],[703,8],[765,5],[861,7],[912,5]]},"408":{"position":[[5117,5],[5221,7]]},"410":{"position":[[212,8]]},"411":{"position":[[673,7],[2302,7],[2715,8],[2856,8],[3000,5],[3234,7],[3345,5],[3491,5],[3560,5],[3672,5]]},"412":{"position":[[9103,5],[9517,5],[10618,5],[12668,5],[13430,8],[13591,7],[13975,5],[14140,7],[14305,8]]},"420":{"position":[[310,6]]},"430":{"position":[[226,8],[313,8]]},"432":{"position":[[458,9],[481,7],[645,7],[1132,7]]},"441":{"position":[[327,9]]},"442":{"position":[[24,5]]},"452":{"position":[[282,7]]},"453":{"position":[[743,5],[840,8]]},"455":{"position":[[177,5]]},"457":{"position":[[355,7],[629,7]]},"459":{"position":[[194,8]]},"468":{"position":[[274,7]]},"469":{"position":[[841,5],[1023,5]]},"479":{"position":[[154,7]]},"480":{"position":[[90,6]]},"483":{"position":[[322,7]]},"490":{"position":[[169,5],[581,8],[651,5]]},"494":{"position":[[555,6]]},"502":{"position":[[614,8],[635,7],[653,8],[734,8],[1057,5]]},"510":{"position":[[281,8]]},"518":{"position":[[87,8],[151,8],[202,5],[265,7],[524,5]]},"523":{"position":[[294,5],[383,5]]},"527":{"position":[[149,5]]},"534":{"position":[[617,7]]},"535":{"position":[[382,5],[409,5],[474,8],[531,5],[818,5]]},"540":{"position":[[136,7]]},"541":{"position":[[340,5],[352,5]]},"542":{"position":[[701,7]]},"548":{"position":[[348,8]]},"555":{"position":[[162,8],[385,5],[720,5],[811,7],[944,7]]},"556":{"position":[[1357,8]]},"559":{"position":[[1172,8]]},"560":{"position":[[702,8]]},"562":{"position":[[630,5],[747,8],[801,5],[941,8],[1193,5],[1223,7],[1627,8]]},"563":{"position":[[633,5]]},"566":{"position":[[199,5],[291,8],[346,5],[372,8]]},"571":{"position":[[715,5],[770,5],[827,5],[1087,5]]},"574":{"position":[[567,7]]},"575":{"position":[[629,8],[698,7]]},"580":{"position":[[6,7],[484,5],[630,5]]},"585":{"position":[[36,7]]},"587":{"position":[[69,7]]},"590":{"position":[[589,7],[615,5]]},"594":{"position":[[615,7]]},"595":{"position":[[386,5],[410,5],[437,5],[502,8],[551,8],[905,7]]},"600":{"position":[[103,7]]},"601":{"position":[[561,5],[573,5],[619,5]]},"602":{"position":[[150,7]]},"608":{"position":[[346,8]]},"630":{"position":[[540,9]]},"631":{"position":[[256,7]]},"632":{"position":[[282,7],[1694,5]]},"642":{"position":[[239,7]]},"659":{"position":[[772,5],[836,7]]},"661":{"position":[[143,5],[1535,7]]},"662":{"position":[[172,5],[468,5],[2656,6],[2759,6]]},"683":{"position":[[671,5]]},"686":{"position":[[316,5]]},"693":{"position":[[638,5]]},"698":{"position":[[545,5]]},"699":{"position":[[696,5]]},"701":{"position":[[563,5]]},"704":{"position":[[42,5]]},"705":{"position":[[554,7],[663,5],[1035,7]]},"709":{"position":[[772,8]]},"710":{"position":[[206,5],[1964,5],[2067,5]]},"711":{"position":[[195,5],[613,7],[1505,7],[1766,7],[1994,7],[2190,7]]},"714":{"position":[[464,8],[539,8],[578,7],[740,8],[920,6],[1119,5]]},"723":{"position":[[245,8],[528,7],[691,7],[784,8],[2063,5],[2138,8]]},"724":{"position":[[1254,6],[1340,6]]},"746":{"position":[[723,6]]},"749":{"position":[[2141,7],[2317,5],[2502,5],[2612,5],[2668,5],[2845,7],[2955,7],[3189,7],[3311,5],[3657,7],[10895,5],[14673,5]]},"772":{"position":[[321,5],[991,5]]},"775":{"position":[[478,7]]},"780":{"position":[[775,7]]},"781":{"position":[[776,5]]},"784":{"position":[[710,6]]},"786":{"position":[[24,5]]},"793":{"position":[[942,5],[1194,5]]},"796":{"position":[[18,8],[95,8],[177,5],[283,5],[344,5],[640,5],[782,5],[1042,5]]},"797":{"position":[[14,5],[126,7]]},"798":{"position":[[351,5],[534,5],[844,5],[966,5]]},"799":{"position":[[10,5],[101,5],[179,5],[433,5],[467,5],[672,5]]},"800":{"position":[[441,8],[534,5]]},"801":{"position":[[684,8],[944,5]]},"815":{"position":[[105,8],[188,7]]},"816":{"position":[[39,7],[69,7],[158,7],[242,7],[307,7],[391,7]]},"817":{"position":[[226,7],[269,5]]},"820":{"position":[[364,7],[448,8],[465,7],[492,5],[532,5]]},"821":{"position":[[80,7],[331,5],[713,5]]},"825":{"position":[[969,5]]},"826":{"position":[[767,5],[865,5]]},"829":{"position":[[2240,8],[2259,5],[2372,5],[2404,6],[2665,5],[2744,5],[2965,8],[3141,5],[3288,5],[3320,6],[3682,5]]},"835":{"position":[[877,5],[941,7]]},"836":{"position":[[145,5],[925,8],[1412,7],[1567,5]]},"837":{"position":[[629,5],[2076,5]]},"838":{"position":[[120,5],[201,5],[451,8],[1105,8],[2870,6],[2973,6]]},"839":{"position":[[738,7]]},"841":{"position":[[107,7],[268,5],[351,7],[370,5],[416,8],[458,8],[593,8],[1390,7]]},"857":{"position":[[223,6]]},"885":{"position":[[838,5]]},"886":{"position":[[200,5],[291,5],[566,5],[574,6],[776,6],[2250,5],[2315,5],[2500,6],[3515,5],[3691,6]]},"898":{"position":[[3640,5],[3679,5],[3738,5]]},"950":{"position":[[409,5]]},"965":{"position":[[141,5],[278,8]]},"1022":{"position":[[286,5],[918,5]]},"1023":{"position":[[579,5]]},"1033":{"position":[[115,7]]},"1047":{"position":[[171,8]]},"1055":{"position":[[104,7],[182,5]]},"1056":{"position":[[11,5],[90,5],[186,5],[306,5]]},"1057":{"position":[[60,6],[74,5],[221,8]]},"1058":{"position":[[208,5],[561,5]]},"1059":{"position":[[43,5],[218,5]]},"1060":{"position":[[65,5],[86,5]]},"1061":{"position":[[66,5],[87,5]]},"1062":{"position":[[143,5]]},"1063":{"position":[[53,6]]},"1064":{"position":[[16,5],[52,5],[86,5],[276,5],[296,5]]},"1065":{"position":[[47,7],[169,7],[470,8],[760,5],[1422,7],[1680,7],[1890,7],[1973,5]]},"1066":{"position":[[17,5],[62,5],[148,5],[248,5],[326,6],[340,5],[650,5]]},"1067":{"position":[[57,6],[130,5],[208,5],[282,5],[390,8],[616,7],[662,7],[793,5],[880,5],[975,7],[1036,7],[1276,5],[1543,5],[1670,8],[1702,5],[1897,5],[2253,8]]},"1068":{"position":[[34,8]]},"1069":{"position":[[82,5]]},"1071":{"position":[[54,5],[127,5],[155,7],[221,7],[365,5],[424,7],[526,8]]},"1072":{"position":[[61,6],[243,8],[650,8],[1084,5],[1215,8],[1302,7],[1361,7],[1555,7],[1955,7],[2456,5],[2549,6],[2634,5],[2807,7]]},"1079":{"position":[[583,5]]},"1080":{"position":[[1125,8]]},"1085":{"position":[[628,5]]},"1102":{"position":[[529,9],[1114,5]]},"1105":{"position":[[5,5],[178,5],[232,5],[307,5],[453,5],[530,5],[628,6],[699,6],[937,7]]},"1107":{"position":[[234,5],[423,6]]},"1110":{"position":[[8,7]]},"1123":{"position":[[584,8]]},"1124":{"position":[[1098,5],[1724,5]]},"1132":{"position":[[187,5],[569,8],[612,8],[774,7],[865,7],[908,7]]},"1137":{"position":[[207,7]]},"1138":{"position":[[382,7],[464,5],[490,8]]},"1143":{"position":[[394,7]]},"1149":{"position":[[333,5]]},"1150":{"position":[[72,5],[210,8],[260,7],[350,5]]},"1158":{"position":[[638,5]]},"1164":{"position":[[431,7]]},"1165":{"position":[[1026,8]]},"1170":{"position":[[1,7]]},"1174":{"position":[[514,7],[706,8]]},"1180":{"position":[[367,7]]},"1184":{"position":[[41,7],[191,7]]},"1188":{"position":[[373,7]]},"1192":{"position":[[119,7]]},"1194":{"position":[[706,6],[800,6]]},"1198":{"position":[[242,5],[543,8],[1028,7],[1282,7]]},"1209":{"position":[[490,8]]},"1222":{"position":[[652,5]]},"1238":{"position":[[101,7],[220,7]]},"1246":{"position":[[1364,5]]},"1249":{"position":[[152,5],[422,5],[439,9],[461,5],[473,5]]},"1250":{"position":[[475,5]]},"1251":{"position":[[135,5],[193,7],[308,7]]},"1252":{"position":[[27,8],[58,7],[121,5],[361,7]]},"1257":{"position":[[83,5],[110,5]]},"1271":{"position":[[483,7],[692,5]]},"1294":{"position":[[273,5],[2077,5]]},"1295":{"position":[[1200,8],[1400,5],[1421,5]]},"1296":{"position":[[21,5],[252,5]]},"1300":{"position":[[669,5]]},"1314":{"position":[[422,5]]},"1315":{"position":[[61,7],[361,5],[979,8],[1162,5],[1263,5],[1353,6],[1543,9]]},"1316":{"position":[[768,5],[971,5],[1575,8],[1615,8],[1635,5],[1680,6],[1713,8],[1734,6],[1769,7],[1815,7],[2189,5],[2389,7],[3077,5],[3275,5],[3436,6]]},"1317":{"position":[[332,5],[394,5],[474,5],[566,5],[681,7],[763,5]]},"1318":{"position":[[344,5],[368,5],[404,5],[508,5],[679,5],[747,7],[894,5],[1028,5],[1165,5]]},"1320":{"position":[[395,7]]},"1321":{"position":[[214,5],[249,5],[370,5],[465,6],[510,7],[590,5],[833,7],[918,7],[995,5],[1063,7]]},"1322":{"position":[[97,5],[315,7],[443,5]]},"1323":{"position":[[28,7]]}},"keywords":{}}],["queries.cockroach",{"_index":6579,"title":{},"content":{"1324":{"position":[[641,17]]}},"keywords":{}}],["queries.it",{"_index":6562,"title":{},"content":{"1316":{"position":[[3007,10]]}},"keywords":{}}],["queries.strong",{"_index":2020,"title":{},"content":{"354":{"position":[[418,14]]}},"keywords":{}}],["queriesful",{"_index":1906,"title":{},"content":{"317":{"position":[[133,11]]}},"keywords":{}}],["queriesminim",{"_index":1883,"title":{},"content":{"311":{"position":[[227,17]]}},"keywords":{}}],["queriesmqueri",{"_index":5763,"title":{},"content":{"1065":{"position":[[123,13]]}},"keywords":{}}],["query'",{"_index":3465,"title":{},"content":{"571":{"position":[[979,7]]},"1102":{"position":[[1194,7]]},"1322":{"position":[[538,7]]}},"keywords":{}}],["query.$().listen((result",{"_index":1290,"title":{},"content":{"188":{"position":[[3222,26]]}},"keywords":{}}],["query.$.subscribe((newhero",{"_index":3543,"title":{},"content":{"601":{"position":[[625,29]]}},"keywords":{}}],["query.$.subscribe(amount",{"_index":5774,"title":{},"content":{"1067":{"position":[[512,24]]}},"keywords":{}}],["query.$.subscribe(newhero",{"_index":3309,"title":{},"content":{"541":{"position":[[400,27]]},"562":{"position":[[1298,27]]}},"keywords":{}}],["query.$.subscribe(result",{"_index":978,"title":{},"content":{"77":{"position":[[284,25]]},"103":{"position":[[324,25]]},"234":{"position":[[384,25]]},"1058":{"position":[[254,25]]}},"keywords":{}}],["query.eq("status"",{"_index":5221,"title":{},"content":{"898":{"position":[[3815,28]]}},"keywords":{}}],["query.exec",{"_index":4662,"title":{},"content":{"799":{"position":[[809,13]]},"1057":{"position":[[125,13]]},"1064":{"position":[[366,13]]},"1067":{"position":[[461,13]]}},"keywords":{}}],["query.modify((docdata",{"_index":5751,"title":{},"content":{"1061":{"position":[[156,22]]}},"keywords":{}}],["query.patch",{"_index":5748,"title":{},"content":{"1060":{"position":[[155,13]]}},"keywords":{}}],["query.query/observ",{"_index":5943,"title":{},"content":{"1102":{"position":[[1157,19]]}},"keywords":{}}],["query.remov",{"_index":5754,"title":{},"content":{"1062":{"position":[[276,15]]}},"keywords":{}}],["query.selector.us",{"_index":6296,"title":{},"content":{"1252":{"position":[[289,19]]}},"keywords":{}}],["query.selector.userid",{"_index":5955,"title":{},"content":{"1105":{"position":[[637,21]]}},"keywords":{}}],["query.subscrib",{"_index":4661,"title":{},"content":{"799":{"position":[[712,18]]}},"keywords":{}}],["query.upd",{"_index":5745,"title":{},"content":{"1059":{"position":[[287,14]]}},"keywords":{}}],["query/writ",{"_index":1615,"title":{},"content":{"266":{"position":[[1048,11]]},"1246":{"position":[[1513,11]]}},"keywords":{}}],["querya.selector",{"_index":6297,"title":{},"content":{"1252":{"position":[[388,15],[416,16]]}},"keywords":{}}],["queryabl",{"_index":2901,"title":{},"content":{"430":{"position":[[177,10]]}},"keywords":{}}],["queryb.selector",{"_index":6298,"title":{},"content":{"1252":{"position":[[433,15]]}},"keywords":{}}],["querybuild",{"_index":5120,"title":{},"content":{"886":{"position":[[860,13],[1144,13],[1183,12],[2119,13],[2561,13],[2776,13],[2815,12],[4068,13],[4173,13]]},"887":{"position":[[410,13]]},"898":{"position":[[3662,13]]}},"keywords":{}}],["querycach",{"_index":4697,"title":{"814":{"position":[[0,10]]}},"content":{"818":{"position":[[160,10]]}},"keywords":{}}],["querymodifi",{"_index":5950,"title":{},"content":{"1104":{"position":[[224,13],[466,13]]},"1105":{"position":[[816,14],[878,13],[1045,13]]},"1107":{"position":[[367,13]]}},"keywords":{}}],["queryobject",{"_index":4233,"title":{},"content":{"749":{"position":[[7338,11]]},"1069":{"position":[[454,11]]}},"keywords":{}}],["queryobject.exec",{"_index":5787,"title":{},"content":{"1069":{"position":[[619,19]]}},"keywords":{}}],["queryobject.sort('nam",{"_index":5786,"title":{},"content":{"1069":{"position":[[571,25],[728,25]]}},"keywords":{}}],["queryobjectsort",{"_index":5788,"title":{},"content":{"1069":{"position":[[710,15]]}},"keywords":{}}],["queryobjectsort.exec",{"_index":5789,"title":{},"content":{"1069":{"position":[[776,23]]}},"keywords":{}}],["querypullhuman",{"_index":5076,"title":{},"content":{"885":{"position":[[152,14]]}},"keywords":{}}],["queryresult",{"_index":2317,"title":{},"content":{"394":{"position":[[862,11]]}},"keywords":{}}],["querysub",{"_index":977,"title":{},"content":{"77":{"position":[[273,8]]},"103":{"position":[[313,8]]},"234":{"position":[[373,8]]},"1058":{"position":[[243,8]]}},"keywords":{}}],["querysub.unsubscrib",{"_index":5744,"title":{},"content":{"1058":{"position":[[567,22]]}},"keywords":{}}],["queryvector",{"_index":2309,"title":{},"content":{"394":{"position":[[631,11]]}},"keywords":{}}],["question",{"_index":2176,"title":{},"content":{"387":{"position":[[322,10]]},"412":{"position":[[10244,8]]},"483":{"position":[[894,9]]},"873":{"position":[[191,9]]},"899":{"position":[[399,9]]},"913":{"position":[[292,9]]}},"keywords":{}}],["queu",{"_index":615,"title":{},"content":{"39":{"position":[[112,6]]},"375":{"position":[[775,7]]},"418":{"position":[[613,6]]},"419":{"position":[[470,7]]}},"keywords":{}}],["queue",{"_index":2785,"title":{},"content":{"416":{"position":[[156,6]]},"1177":{"position":[[553,5]]}},"keywords":{}}],["quic",{"_index":3618,"title":{},"content":{"613":{"position":[[143,4]]}},"keywords":{}}],["quick",{"_index":1378,"title":{"211":{"position":[[0,5]]},"314":{"position":[[0,5]]},"480":{"position":[[0,5]]},"562":{"position":[[5,5]]},"1235":{"position":[[0,5]]}},"content":{"212":{"position":[[558,5]]},"321":{"position":[[93,5]]},"383":{"position":[[274,5]]},"385":{"position":[[121,5]]},"396":{"position":[[418,5]]},"417":{"position":[[92,5]]},"429":{"position":[[377,5]]},"723":{"position":[[1769,6]]},"836":{"position":[[409,5],[530,5],[657,5]]},"837":{"position":[[1382,5],[1408,5],[1820,5]]},"838":{"position":[[1354,5],[1834,5],[2018,5]]},"906":{"position":[[750,5]]},"1147":{"position":[[201,5]]},"1277":{"position":[[26,5],[320,5],[610,5]]}},"keywords":{}}],["quicker",{"_index":1661,"title":{},"content":{"283":{"position":[[264,7]]}},"keywords":{}}],["quickj",{"_index":1243,"title":{},"content":{"188":{"position":[[138,7]]}},"keywords":{}}],["quickli",{"_index":887,"title":{},"content":{"61":{"position":[[148,7]]},"65":{"position":[[295,7]]},"84":{"position":[[277,7]]},"114":{"position":[[290,7]]},"149":{"position":[[290,7]]},"175":{"position":[[283,7]]},"217":{"position":[[205,7]]},"241":{"position":[[162,7]]},"285":{"position":[[112,7]]},"318":{"position":[[183,7]]},"321":{"position":[[389,7]]},"347":{"position":[[290,7]]},"358":{"position":[[439,7]]},"362":{"position":[[1361,7]]},"373":{"position":[[162,7]]},"408":{"position":[[2300,8]]},"477":{"position":[[101,7]]},"511":{"position":[[290,7]]},"531":{"position":[[290,7]]},"559":{"position":[[869,7],[1696,7]]},"591":{"position":[[290,7]]},"630":{"position":[[995,7]]},"639":{"position":[[23,8]]},"723":{"position":[[169,8],[712,8]]},"1147":{"position":[[452,7]]}},"keywords":{}}],["quickly.improv",{"_index":1206,"title":{},"content":{"173":{"position":[[1867,16]]}},"keywords":{}}],["quickstart",{"_index":883,"title":{"823":{"position":[[5,10]]}},"content":{"61":{"position":[[49,10],[124,11],[170,11]]},"84":{"position":[[253,11],[321,10]]},"114":{"position":[[266,11],[334,10]]},"149":{"position":[[266,11],[334,10]]},"175":{"position":[[259,11],[327,10]]},"241":{"position":[[126,11]]},"263":{"position":[[399,10]]},"285":{"position":[[408,11]]},"306":{"position":[[235,11]]},"318":{"position":[[383,10]]},"347":{"position":[[266,11],[334,10]]},"362":{"position":[[1337,11],[1405,10]]},"373":{"position":[[126,11]]},"388":{"position":[[58,10]]},"498":{"position":[[141,10],[262,10]]},"511":{"position":[[266,11],[334,10]]},"531":{"position":[[266,11],[334,10]]},"548":{"position":[[37,10]]},"557":{"position":[[37,10]]},"567":{"position":[[343,10]]},"591":{"position":[[266,11],[334,10]]},"608":{"position":[[37,10]]},"644":{"position":[[20,10]]},"663":{"position":[[72,10]]},"712":{"position":[[56,10]]},"776":{"position":[[106,10]]},"793":{"position":[[44,10]]},"824":{"position":[[126,10]]},"842":{"position":[[206,10]]},"904":{"position":[[206,10]]},"913":{"position":[[20,10],[185,10]]},"1125":{"position":[[861,10]]}},"keywords":{}}],["quickstartcheck",{"_index":2514,"title":{},"content":{"405":{"position":[[129,15]]},"471":{"position":[[114,15]]},"628":{"position":[[216,15]]}},"keywords":{}}],["quickstartdiscov",{"_index":3472,"title":{},"content":{"572":{"position":[[20,18]]}},"keywords":{}}],["quickstartdownsid",{"_index":4596,"title":{},"content":{"786":{"position":[[57,19]]}},"keywords":{}}],["quickstartif",{"_index":3209,"title":{},"content":{"498":{"position":[[98,12]]}},"keywords":{}}],["quickstartjoin",{"_index":1699,"title":{},"content":{"296":{"position":[[56,14]]}},"keywords":{}}],["quickstartwhi",{"_index":2935,"title":{},"content":{"442":{"position":[[57,13]]}},"keywords":{}}],["quietli",{"_index":3171,"title":{},"content":{"491":{"position":[[1064,7]]}},"keywords":{}}],["quit",{"_index":2051,"title":{},"content":{"357":{"position":[[425,5]]},"495":{"position":[[874,5]]},"1300":{"position":[[1021,5]]},"1322":{"position":[[186,5]]}},"keywords":{}}],["quot",{"_index":3633,"title":{},"content":{"617":{"position":[[426,5]]},"711":{"position":[[1358,9]]},"749":{"position":[[11821,5],[11827,8]]}},"keywords":{}}],["quot;$$"",{"_index":5863,"title":{},"content":{"1084":{"position":[[950,15]]}},"keywords":{}}],["quot;$"",{"_index":5862,"title":{},"content":{"1084":{"position":[[935,14]]}},"keywords":{}}],["quot;$(pwd)"/appwrite:/usr/src/code/appwrite:rw",{"_index":4896,"title":{},"content":{"861":{"position":[[630,53]]}},"keywords":{}}],["quot;@xenova/transformers"",{"_index":2217,"title":{},"content":{"391":{"position":[[449,33]]}},"keywords":{}}],["quot;_data"",{"_index":5853,"title":{},"content":{"1084":{"position":[[695,18]]}},"keywords":{}}],["quot;_deleted"",{"_index":5202,"title":{},"content":{"898":{"position":[[1084,20]]},"986":{"position":[[1128,21]]}},"keywords":{}}],["quot;_modified"",{"_index":5203,"title":{},"content":{"898":{"position":[[1137,21]]}},"keywords":{}}],["quot;_propertycache"",{"_index":5854,"title":{},"content":{"1084":{"position":[[714,27]]}},"keywords":{}}],["quot;_savedata"",{"_index":5882,"title":{},"content":{"1084":{"position":[[1408,22]]}},"keywords":{}}],["quot;active"",{"_index":5222,"title":{},"content":{"898":{"position":[[3844,20]]}},"keywords":{}}],["quot;age"",{"_index":5201,"title":{},"content":{"898":{"position":[[1059,15]]}},"keywords":{}}],["quot;aggregation"",{"_index":5796,"title":{},"content":{"1072":{"position":[[702,23]]}},"keywords":{}}],["quot;al",{"_index":5632,"title":{},"content":{"1022":{"position":[[928,9]]},"1023":{"position":[[589,9]]}},"keywords":{}}],["quot;alice"",{"_index":5445,"title":{},"content":{"986":{"position":[[796,18]]}},"keywords":{}}],["quot;allattachments$"",{"_index":5877,"title":{},"content":{"1084":{"position":[[1279,28]]}},"keywords":{}}],["quot;allattachments"",{"_index":5876,"title":{},"content":{"1084":{"position":[[1251,27]]}},"keywords":{}}],["quot;amount"",{"_index":1836,"title":{},"content":{"303":{"position":[[695,19],[756,19]]},"361":{"position":[[692,19],[753,19]]}},"keywords":{}}],["quot;an",{"_index":365,"title":{},"content":{"22":{"position":[[29,8]]}},"keywords":{}}],["quot;ani",{"_index":2672,"title":{},"content":{"412":{"position":[[2774,9]]}},"keywords":{}}],["quot;app",{"_index":2799,"title":{},"content":{"419":{"position":[[322,10]]}},"keywords":{}}],["quot;array"",{"_index":2366,"title":{},"content":{"397":{"position":[[795,18]]},"1074":{"position":[[1476,18]]}},"keywords":{}}],["quot;at",{"_index":3657,"title":{},"content":{"619":{"position":[[84,8]]}},"keywords":{}}],["quot;attachments"",{"_index":5830,"title":{},"content":{"1074":{"position":[[1874,24]]}},"keywords":{}}],["quot;average"",{"_index":2554,"title":{},"content":{"408":{"position":[[2948,19]]},"462":{"position":[[700,19]]}},"keywords":{}}],["quot;aw",{"_index":309,"title":{},"content":{"18":{"position":[[280,9]]}},"keywords":{}}],["quot;awesom",{"_index":1525,"title":{},"content":{"244":{"position":[[1493,13]]}},"keywords":{}}],["quot;birthyear"",{"_index":5822,"title":{},"content":{"1074":{"position":[[1292,22]]}},"keywords":{}}],["quot;boat"",{"_index":2348,"title":{},"content":{"396":{"position":[[1388,16]]}},"keywords":{}}],["quot;branches"",{"_index":5916,"title":{},"content":{"1092":{"position":[[140,21]]},"1093":{"position":[[24,20]]}},"keywords":{}}],["quot;brand"",{"_index":2038,"title":{},"content":{"356":{"position":[[479,20]]}},"keywords":{}}],["quot;brandx"",{"_index":2039,"title":{},"content":{"356":{"position":[[500,19]]}},"keywords":{}}],["quot;brows",{"_index":3982,"title":{},"content":{"707":{"position":[[314,13]]}},"keywords":{}}],["quot;browser"",{"_index":6143,"title":{},"content":{"1176":{"position":[[552,20]]}},"keywords":{}}],["quot;calculated"",{"_index":2629,"title":{},"content":{"411":{"position":[[3581,22]]}},"keywords":{}}],["quot;capacitorsqlite"",{"_index":3792,"title":{},"content":{"661":{"position":[[654,28]]},"662":{"position":[[1422,28]]},"1279":{"position":[[121,28]]}},"keywords":{}}],["quot;clear",{"_index":2726,"title":{},"content":{"412":{"position":[[8116,11]]}},"keywords":{}}],["quot;client",{"_index":1495,"title":{},"content":{"244":{"position":[[642,12]]},"617":{"position":[[463,13]]}},"keywords":{}}],["quot;close"",{"_index":5885,"title":{},"content":{"1084":{"position":[[1482,18]]}},"keywords":{}}],["quot;closedupl",{"_index":4211,"title":{},"content":{"749":{"position":[[5869,22]]}},"keywords":{}}],["quot;collection"",{"_index":5852,"title":{},"content":{"1084":{"position":[[671,23]]}},"keywords":{}}],["quot;color"",{"_index":1285,"title":{},"content":{"188":{"position":[[2966,18]]},"1074":{"position":[[1051,18],[1808,17]]}},"keywords":{}}],["quot;correct"",{"_index":2686,"title":{},"content":{"412":{"position":[[4061,19]]}},"keywords":{}}],["quot;corrine"",{"_index":1830,"title":{},"content":{"303":{"position":[[562,20],[822,20]]},"361":{"position":[[559,20],[819,20]]}},"keywords":{}}],["quot;damage"",{"_index":5828,"title":{},"content":{"1074":{"position":[[1696,19]]}},"keywords":{}}],["quot;dat",{"_index":5888,"title":{},"content":{"1085":{"position":[[448,10]]}},"keywords":{}}],["quot;databas",{"_index":1506,"title":{},"content":{"244":{"position":[[965,14]]}},"keywords":{}}],["quot;datastore"",{"_index":5915,"title":{},"content":{"1092":{"position":[[105,21]]},"1094":{"position":[[287,21],[321,21]]}},"keywords":{}}],["quot;datastores"",{"_index":5917,"title":{},"content":{"1092":{"position":[[592,22]]}},"keywords":{}}],["quot;deleted$$"",{"_index":5860,"title":{},"content":{"1084":{"position":[[868,22]]}},"keywords":{}}],["quot;deleted$"",{"_index":5859,"title":{},"content":{"1084":{"position":[[846,21]]}},"keywords":{}}],["quot;deleted"",{"_index":4901,"title":{},"content":{"861":{"position":[[1956,19]]},"898":{"position":[[409,20]]},"1084":{"position":[[891,20],[1501,20]]}},"keywords":{}}],["quot;dependencies"",{"_index":4077,"title":{},"content":{"731":{"position":[[102,25]]},"760":{"position":[[106,25]]}},"keywords":{}}],["quot;describ",{"_index":5816,"title":{},"content":{"1074":{"position":[[771,15]]}},"keywords":{}}],["quot;description"",{"_index":5815,"title":{},"content":{"1074":{"position":[[746,24]]}},"keywords":{}}],["quot;dumb,"",{"_index":2668,"title":{},"content":{"412":{"position":[[2039,17]]}},"keywords":{}}],["quot;dump"",{"_index":5430,"title":{},"content":{"981":{"position":[[634,16]]}},"keywords":{}}],["quot;electron",{"_index":1485,"title":{},"content":{"244":{"position":[[321,14]]}},"keywords":{}}],["quot;embedding"",{"_index":2365,"title":{},"content":{"397":{"position":[[752,22],[1090,22]]}},"keywords":{}}],["quot;encrypted"",{"_index":5829,"title":{},"content":{"1074":{"position":[[1829,22],[1901,22]]}},"keywords":{}}],["quot;eventu",{"_index":3953,"title":{},"content":{"700":{"position":[[750,14]]}},"keywords":{}}],["quot;everyth",{"_index":3942,"title":{},"content":{"698":{"position":[[2510,16]]}},"keywords":{}}],["quot;exactli",{"_index":2632,"title":{},"content":{"411":{"position":[[4620,13]]}},"keywords":{}}],["quot;expo",{"_index":1505,"title":{},"content":{"244":{"position":[[933,10]]}},"keywords":{}}],["quot;fast",{"_index":3974,"title":{},"content":{"703":{"position":[[1445,10]]}},"keywords":{}}],["quot;features"",{"_index":2040,"title":{},"content":{"356":{"position":[[520,21]]}},"keywords":{}}],["quot;final"",{"_index":5823,"title":{},"content":{"1074":{"position":[[1355,18]]}},"keywords":{}}],["quot;find",{"_index":4014,"title":{},"content":{"714":{"position":[[591,10]]}},"keywords":{}}],["quot;firebas",{"_index":1450,"title":{},"content":{"243":{"position":[[214,14]]}},"keywords":{}}],["quot;firestor",{"_index":1451,"title":{},"content":{"243":{"position":[[280,15]]},"244":{"position":[[1175,15]]}},"keywords":{}}],["quot;first",{"_index":2696,"title":{},"content":{"412":{"position":[[5278,11]]}},"keywords":{}}],["quot;firstname"",{"_index":1829,"title":{},"content":{"303":{"position":[[539,22]]},"361":{"position":[[536,22]]},"898":{"position":[[986,21]]}},"keywords":{}}],["quot;flag"",{"_index":5590,"title":{},"content":{"1009":{"position":[[942,16]]}},"keywords":{}}],["quot;flutt",{"_index":1519,"title":{},"content":{"244":{"position":[[1375,13]]}},"keywords":{}}],["quot;foobar"",{"_index":4063,"title":{},"content":{"724":{"position":[[1588,18]]},"986":{"position":[[758,19]]}},"keywords":{}}],["quot;format"",{"_index":5887,"title":{},"content":{"1085":{"position":[[428,19]]}},"keywords":{}}],["quot;framework"",{"_index":666,"title":{},"content":{"43":{"position":[[16,21]]}},"keywords":{}}],["quot;from",{"_index":5527,"title":{},"content":{"999":{"position":[[120,10]]}},"keywords":{}}],["quot;fs"",{"_index":6141,"title":{},"content":{"1176":{"position":[[92,15],[575,15]]}},"keywords":{}}],["quot;get$$"",{"_index":5865,"title":{},"content":{"1084":{"position":[[984,18]]}},"keywords":{}}],["quot;get$"",{"_index":5864,"title":{},"content":{"1084":{"position":[[966,17]]}},"keywords":{}}],["quot;get"",{"_index":5867,"title":{},"content":{"1084":{"position":[[1025,16]]}},"keywords":{}}],["quot;getattachment"",{"_index":5875,"title":{},"content":{"1084":{"position":[[1224,26]]}},"keywords":{}}],["quot;getlatest"",{"_index":5861,"title":{},"content":{"1084":{"position":[[912,22]]}},"keywords":{}}],["quot;git",{"_index":5427,"title":{},"content":{"981":{"position":[[183,9]]}},"keywords":{}}],["quot;git+https://git@github.com/pubkey/rxdb.git#commithash"",{"_index":4079,"title":{},"content":{"731":{"position":[[148,65]]}},"keywords":{}}],["quot;glu",{"_index":2619,"title":{},"content":{"411":{"position":[[2465,10]]}},"keywords":{}}],["quot;googl",{"_index":2817,"title":{},"content":{"419":{"position":[[1716,12]]}},"keywords":{}}],["quot;hack"",{"_index":3547,"title":{},"content":{"610":{"position":[[28,16]]}},"keywords":{}}],["quot;healthpoints"",{"_index":5818,"title":{},"content":{"1074":{"position":[[1112,25]]}},"keywords":{}}],["quot;hero",{"_index":5813,"title":{},"content":{"1074":{"position":[[697,10]]}},"keywords":{}}],["quot;hot"",{"_index":4656,"title":{},"content":{"799":{"position":[[107,15],[417,15]]}},"keywords":{}}],["quot;https://<yourdatabase>.dexie.cloud"",{"_index":6079,"title":{},"content":{"1148":{"position":[[986,53]]}},"keywords":{}}],["quot;human"",{"_index":5197,"title":{},"content":{"898":{"position":[[805,17]]}},"keywords":{}}],["quot;i",{"_index":2738,"title":{},"content":{"412":{"position":[[10256,8]]},"703":{"position":[[1215,8]]}},"keywords":{}}],["quot;id"",{"_index":1280,"title":{},"content":{"188":{"position":[[2871,15]]},"397":{"position":[[586,15],[666,15],[1074,15]]},"403":{"position":[[575,15]]},"986":{"position":[[742,15]]},"1085":{"position":[[1263,15],[1343,15],[1590,16]]},"1107":{"position":[[588,15],[668,15],[894,15]]}},"keywords":{}}],["quot;idx0"",{"_index":2369,"title":{},"content":{"397":{"position":[[893,17],[1113,17],[1228,17]]}},"keywords":{}}],["quot;idx1"",{"_index":2370,"title":{},"content":{"397":{"position":[[924,17],[1131,17],[1246,17]]}},"keywords":{}}],["quot;idx2"",{"_index":2371,"title":{},"content":{"397":{"position":[[955,17],[1149,17],[1264,17]]}},"keywords":{}}],["quot;idx3"",{"_index":2372,"title":{},"content":{"397":{"position":[[986,17],[1167,17],[1282,17]]}},"keywords":{}}],["quot;idx4"",{"_index":2373,"title":{},"content":{"397":{"position":[[1017,17],[1185,16],[1300,16]]}},"keywords":{}}],["quot;ignoredupl",{"_index":4209,"title":{},"content":{"749":{"position":[[5807,22]]}},"keywords":{}}],["quot;in",{"_index":1487,"title":{},"content":{"244":{"position":[[349,8]]}},"keywords":{}}],["quot;incrementalmodify"",{"_index":5879,"title":{},"content":{"1084":{"position":[[1328,30]]}},"keywords":{}}],["quot;incrementalpatch"",{"_index":5881,"title":{},"content":{"1084":{"position":[[1378,29]]}},"keywords":{}}],["quot;incrementalremove"",{"_index":5884,"title":{},"content":{"1084":{"position":[[1451,30]]}},"keywords":{}}],["quot;incrementalupdate"",{"_index":5871,"title":{},"content":{"1084":{"position":[[1109,30]]}},"keywords":{}}],["quot;index",{"_index":2957,"title":{},"content":{"452":{"position":[[35,13]]}},"keywords":{}}],["quot;indexeddb",{"_index":1462,"title":{},"content":{"243":{"position":[[543,15],[647,15],[748,15],[847,15]]},"244":{"position":[[568,15],[604,15],[1666,15]]}},"keywords":{}}],["quot;indexes"",{"_index":2375,"title":{},"content":{"397":{"position":[[1205,20]]}},"keywords":{}}],["quot;insert",{"_index":4918,"title":{},"content":{"863":{"position":[[717,12]]}},"keywords":{}}],["quot;internalindexes"",{"_index":5967,"title":{},"content":{"1107":{"position":[[844,28]]}},"keywords":{}}],["quot;ion",{"_index":1452,"title":{},"content":{"243":{"position":[[329,11]]},"244":{"position":[[1216,11]]}},"keywords":{}}],["quot;iosdatabaselocation"",{"_index":3793,"title":{},"content":{"661":{"position":[[685,32]]},"662":{"position":[[1453,32]]},"1279":{"position":[[152,32]]}},"keywords":{}}],["quot;isinstanceofrxdocument"",{"_index":5855,"title":{},"content":{"1084":{"position":[[742,35]]}},"keywords":{}}],["quot;items"",{"_index":2367,"title":{},"content":{"397":{"position":[[814,18]]},"1074":{"position":[[1551,18]]}},"keywords":{}}],["quot;jqueri",{"_index":1448,"title":{},"content":{"243":{"position":[[154,12]]}},"keywords":{}}],["quot;json",{"_index":1473,"title":{},"content":{"243":{"position":[[946,10],[981,10]]}},"keywords":{}}],["quot;keep_alive"",{"_index":4858,"title":{},"content":{"849":{"position":[[1113,22]]}},"keywords":{}}],["quot;last",{"_index":2701,"title":{},"content":{"412":{"position":[[5505,10]]}},"keywords":{}}],["quot;lastname"",{"_index":1831,"title":{},"content":{"303":{"position":[[583,21]]},"361":{"position":[[580,21]]},"898":{"position":[[1023,20]]},"986":{"position":[[815,21]]}},"keywords":{}}],["quot;library/capacitordatabase"",{"_index":3794,"title":{},"content":{"661":{"position":[[718,37]]},"662":{"position":[[1486,37]]},"1279":{"position":[[185,37]]}},"keywords":{}}],["quot;livequery"",{"_index":1504,"title":{},"content":{"244":{"position":[[905,21]]}},"keywords":{}}],["quot;loc",{"_index":1441,"title":{},"content":{"243":{"position":[[33,11],[370,11]]},"244":{"position":[[719,11],[761,11],[796,11]]},"245":{"position":[[1,11]]},"419":{"position":[[664,11],[1217,11],[1338,11],[1520,11],[1556,11],[1850,14]]}},"keywords":{}}],["quot;localstorag",{"_index":1480,"title":{},"content":{"244":{"position":[[206,18],[485,18]]}},"keywords":{}}],["quot;low",{"_index":724,"title":{},"content":{"47":{"position":[[288,9]]}},"keywords":{}}],["quot;mag",{"_index":2684,"title":{},"content":{"412":{"position":[[3855,15]]}},"keywords":{}}],["quot;main"",{"_index":3979,"title":{},"content":{"707":{"position":[[57,16]]},"709":{"position":[[1327,16]]},"775":{"position":[[671,16]]},"1089":{"position":[[101,16]]}},"keywords":{}}],["quot;many"",{"_index":6551,"title":{},"content":{"1316":{"position":[[1495,16]]}},"keywords":{}}],["quot;maximum"",{"_index":5820,"title":{},"content":{"1074":{"position":[[1202,20],[1407,20]]}},"keywords":{}}],["quot;maxitems"",{"_index":5826,"title":{},"content":{"1074":{"position":[[1495,21]]}},"keywords":{}}],["quot;maxlength"",{"_index":2364,"title":{},"content":{"397":{"position":[[722,22]]},"1074":{"position":[[972,22]]},"1085":{"position":[[1399,22]]},"1107":{"position":[[724,22],[812,22]]}},"keywords":{}}],["quot;mean"",{"_index":2224,"title":{},"content":{"391":{"position":[[681,17]]}},"keywords":{}}],["quot;merg",{"_index":2680,"title":{},"content":{"412":{"position":[[3527,11]]}},"keywords":{}}],["quot;minimum"",{"_index":5819,"title":{},"content":{"1074":{"position":[[1178,20],[1380,20]]}},"keywords":{}}],["quot;mobil",{"_index":1502,"title":{},"content":{"244":{"position":[[836,12]]}},"keywords":{}}],["quot;modify"",{"_index":5878,"title":{},"content":{"1084":{"position":[[1308,19]]}},"keywords":{}}],["quot;mydynamicdata"",{"_index":5894,"title":{},"content":{"1085":{"position":[[1429,26]]}},"keywords":{}}],["quot;name"",{"_index":1283,"title":{},"content":{"188":{"position":[[2927,17]]},"986":{"position":[[778,17]]},"1074":{"position":[[832,17],[914,17],[1636,17],[1790,17]]},"1107":{"position":[[754,17],[875,18]]}},"keywords":{}}],["quot;native"",{"_index":6338,"title":{},"content":{"1275":{"position":[[52,18]]}},"keywords":{}}],["quot;new"",{"_index":3628,"title":{},"content":{"616":{"position":[[255,15]]}},"keywords":{}}],["quot;normal"",{"_index":2488,"title":{},"content":{"402":{"position":[[2189,18]]},"429":{"position":[[589,18]]},"453":{"position":[[604,18]]},"457":{"position":[[108,18]]},"469":{"position":[[700,18]]},"569":{"position":[[6,18]]},"623":{"position":[[342,18]]},"772":{"position":[[10,18]]},"1192":{"position":[[5,18]]}},"keywords":{}}],["quot;npm:rxdb@14.17.1"",{"_index":4501,"title":{},"content":{"760":{"position":[[156,29]]}},"keywords":{}}],["quot;number"",{"_index":2368,"title":{},"content":{"397":{"position":[[853,18]]},"1074":{"position":[[1158,19],[1335,19],[1736,18]]}},"keywords":{}}],["quot;object"",{"_index":2361,"title":{},"content":{"397":{"position":[[620,19]]},"1074":{"position":[[868,19],[1590,19]]},"1085":{"position":[[1165,18],[1297,19],[1476,18]]},"1107":{"position":[[622,19]]}},"keywords":{}}],["quot;offlin",{"_index":1454,"title":{},"content":{"243":{"position":[[400,13]]},"244":{"position":[[386,13],[1060,13],[1094,13]]},"419":{"position":[[84,13]]}},"keywords":{}}],["quot;on",{"_index":2825,"title":{},"content":{"419":{"position":[[1891,8]]}},"keywords":{}}],["quot;onlin",{"_index":2780,"title":{},"content":{"413":{"position":[[101,12]]},"420":{"position":[[611,12]]}},"keywords":{}}],["quot;only"",{"_index":6012,"title":{},"content":{"1123":{"position":[[460,16]]}},"keywords":{}}],["quot;optimist",{"_index":1439,"title":{},"content":{"243":{"position":[[4,16]]}},"keywords":{}}],["quot;original"",{"_index":2864,"title":{},"content":{"422":{"position":[[275,20]]}},"keywords":{}}],["quot;p2p",{"_index":1509,"title":{},"content":{"244":{"position":[[998,9]]}},"keywords":{}}],["quot;passportid"",{"_index":5200,"title":{},"content":{"898":{"position":[[945,22]]}},"keywords":{}}],["quot;patch"",{"_index":5880,"title":{},"content":{"1084":{"position":[[1359,18]]}},"keywords":{}}],["quot;permiss",{"_index":5586,"title":{},"content":{"1009":{"position":[[213,16]]}},"keywords":{}}],["quot;pipes"",{"_index":2549,"title":{},"content":{"408":{"position":[[2490,17]]}},"keywords":{}}],["quot;plugins"",{"_index":3791,"title":{},"content":{"661":{"position":[[631,20]]},"662":{"position":[[1399,20]]},"1279":{"position":[[98,20]]}},"keywords":{}}],["quot;populate"",{"_index":5866,"title":{},"content":{"1084":{"position":[[1003,21]]}},"keywords":{}}],["quot;primary"",{"_index":5857,"title":{},"content":{"1084":{"position":[[803,20]]}},"keywords":{}}],["quot;primarykey"",{"_index":2359,"title":{},"content":{"397":{"position":[[562,23]]},"403":{"position":[[551,23]]},"1074":{"position":[[808,23]]},"1085":{"position":[[1239,23]]},"1107":{"position":[[564,23]]}},"keywords":{}}],["quot;primarypath"",{"_index":5856,"title":{},"content":{"1084":{"position":[[778,24]]}},"keywords":{}}],["quot;production"",{"_index":3844,"title":{},"content":{"672":{"position":[[58,23]]}},"keywords":{}}],["quot;productnumber"",{"_index":1834,"title":{},"content":{"303":{"position":[[661,26],[722,26]]},"361":{"position":[[658,26],[719,26]]}},"keywords":{}}],["quot;properties"",{"_index":2362,"title":{},"content":{"397":{"position":[[640,23]]},"403":{"position":[[591,23]]},"1074":{"position":[[888,23],[1610,23]]},"1085":{"position":[[1317,23]]},"1107":{"position":[[642,23]]}},"keywords":{}}],["quot;public"."humans"",{"_index":5199,"title":{},"content":{"898":{"position":[[905,37],[1498,38]]}},"keywords":{}}],["quot;putattachment"",{"_index":5873,"title":{},"content":{"1084":{"position":[[1164,26]]}},"keywords":{}}],["quot;putattachmentbase64"",{"_index":5874,"title":{},"content":{"1084":{"position":[[1191,32]]}},"keywords":{}}],["quot;react",{"_index":1445,"title":{},"content":{"243":{"position":[[75,11]]},"244":{"position":[[66,11],[97,11],[285,14],[422,11],[523,11],[1029,14],[1125,11],[1253,11],[1292,11],[1336,11],[1418,11]]}},"keywords":{}}],["quot;reactj",{"_index":1474,"title":{},"content":{"243":{"position":[[1013,13]]}},"keywords":{}}],["quot;real",{"_index":1482,"title":{},"content":{"244":{"position":[[248,10]]}},"keywords":{}}],["quot;real"",{"_index":2482,"title":{},"content":{"402":{"position":[[704,16]]},"569":{"position":[[1251,16]]},"699":{"position":[[742,16]]},"875":{"position":[[4087,16]]}},"keywords":{}}],["quot;realtim",{"_index":212,"title":{},"content":{"14":{"position":[[388,14],[426,14]]},"570":{"position":[[846,14]]},"571":{"position":[[1855,14]]}},"keywords":{}}],["quot;realtime"",{"_index":211,"title":{},"content":{"14":{"position":[[361,20]]},"569":{"position":[[50,21],[950,21]]},"570":{"position":[[253,20]]},"571":{"position":[[54,20]]},"699":{"position":[[154,20]]}},"keywords":{}}],["quot;redux",{"_index":1524,"title":{},"content":{"244":{"position":[[1456,11]]}},"keywords":{}}],["quot;region,"",{"_index":5588,"title":{},"content":{"1009":{"position":[[245,19]]}},"keywords":{}}],["quot;reload",{"_index":2850,"title":{},"content":{"421":{"position":[[342,12]]}},"keywords":{}}],["quot;remove"",{"_index":5883,"title":{},"content":{"1084":{"position":[[1431,19]]}},"keywords":{}}],["quot;renderer"",{"_index":3981,"title":{},"content":{"707":{"position":[[177,20]]}},"keywords":{}}],["quot;repl",{"_index":5583,"title":{},"content":{"1008":{"position":[[111,17]]}},"keywords":{}}],["quot;required"",{"_index":2374,"title":{},"content":{"397":{"position":[[1050,21]]},"1074":{"position":[[1766,21]]},"1085":{"position":[[1568,21]]}},"keywords":{}}],["quot;revision"",{"_index":5858,"title":{},"content":{"1084":{"position":[[824,21]]}},"keywords":{}}],["quot;revokes"",{"_index":2761,"title":{},"content":{"412":{"position":[[13319,19]]}},"keywords":{}}],["quot;rxdb",{"_index":4499,"title":{},"content":{"760":{"position":[[134,10]]}},"keywords":{}}],["quot;rxdb"",{"_index":4078,"title":{},"content":{"731":{"position":[[130,17]]},"889":{"position":[[398,17]]}},"keywords":{}}],["quot;rxstorag",{"_index":3510,"title":{},"content":{"581":{"position":[[50,15]]}},"keywords":{}}],["quot;scal",{"_index":5906,"title":{},"content":{"1087":{"position":[[22,13]]}},"keywords":{}}],["quot;schema",{"_index":5892,"title":{},"content":{"1085":{"position":[[817,12]]}},"keywords":{}}],["quot;secret"",{"_index":5821,"title":{},"content":{"1074":{"position":[[1230,19],[1852,21]]}},"keywords":{}}],["quot;select",{"_index":4011,"title":{},"content":{"711":{"position":[[1774,12]]}},"keywords":{}}],["quot;server"",{"_index":3984,"title":{},"content":{"708":{"position":[[105,18]]}},"keywords":{}}],["quot;shapes"",{"_index":651,"title":{},"content":{"41":{"position":[[105,20]]}},"keywords":{}}],["quot;shoe"",{"_index":2346,"title":{},"content":{"396":{"position":[[1322,16]]}},"keywords":{}}],["quot;shoppingcartitems"",{"_index":1833,"title":{},"content":{"303":{"position":[[626,30]]},"361":{"position":[[623,30]]}},"keywords":{}}],["quot;shortening"",{"_index":2479,"title":{},"content":{"402":{"position":[[175,22]]}},"keywords":{}}],["quot;skills"",{"_index":5825,"title":{},"content":{"1074":{"position":[[1436,19]]}},"keywords":{}}],["quot;socks"",{"_index":2347,"title":{},"content":{"396":{"position":[[1343,17]]}},"keywords":{}}],["quot;someth",{"_index":5060,"title":{},"content":{"875":{"position":[[9078,15]]}},"keywords":{}}],["quot;sort"",{"_index":4995,"title":{},"content":{"875":{"position":[[2409,16]]}},"keywords":{}}],["quot;sqlit",{"_index":1492,"title":{},"content":{"244":{"position":[[457,12],[1563,12],[1600,12]]}},"keywords":{}}],["quot;ssd"",{"_index":2042,"title":{},"content":{"356":{"position":[[568,20]]}},"keywords":{}}],["quot;stealing"",{"_index":5977,"title":{},"content":{"1112":{"position":[[324,20]]}},"keywords":{}}],["quot;stor",{"_index":1476,"title":{},"content":{"244":{"position":[[34,11],[165,11]]},"410":{"position":[[1356,12]]}},"keywords":{}}],["quot;storag",{"_index":6054,"title":{},"content":{"1140":{"position":[[104,13]]}},"keywords":{}}],["quot;string"",{"_index":2363,"title":{},"content":{"397":{"position":[[702,19]]},"1074":{"position":[[952,19],[1090,18],[1270,18],[1674,18]]},"1085":{"position":[[408,19],[1379,19]]},"1107":{"position":[[704,19],[792,19]]}},"keywords":{}}],["quot;supabas",{"_index":1475,"title":{},"content":{"244":{"position":[[1,14],[130,14]]}},"keywords":{}}],["quot;sync",{"_index":1531,"title":{},"content":{"244":{"position":[[1636,10]]}},"keywords":{}}],["quot;synced"",{"_index":5886,"title":{},"content":{"1084":{"position":[[1522,18]]}},"keywords":{}}],["quot;tauri",{"_index":1527,"title":{},"content":{"244":{"position":[[1530,11]]}},"keywords":{}}],["quot;title"",{"_index":5812,"title":{},"content":{"1074":{"position":[[678,18]]}},"keywords":{}}],["quot;tojson"",{"_index":5868,"title":{},"content":{"1084":{"position":[[1042,19]]}},"keywords":{}}],["quot;tomutablejson"",{"_index":5869,"title":{},"content":{"1084":{"position":[[1062,26]]}},"keywords":{}}],["quot;touchscreen"",{"_index":2041,"title":{},"content":{"356":{"position":[[542,25]]}},"keywords":{}}],["quot;type"",{"_index":2360,"title":{},"content":{"397":{"position":[[602,17],[684,17],[777,17],[835,17]]},"849":{"position":[[472,16]]},"1074":{"position":[[850,17],[934,17],[1072,17],[1140,17],[1252,17],[1317,17],[1458,17],[1572,17],[1656,17],[1718,17]]},"1085":{"position":[[390,17],[1279,17],[1361,17],[1458,17]]},"1107":{"position":[[604,17],[686,17],[774,17]]}},"keywords":{}}],["quot;uniqueitems"",{"_index":5827,"title":{},"content":{"1074":{"position":[[1520,24]]}},"keywords":{}}],["quot;upd",{"_index":4915,"title":{},"content":{"863":{"position":[[510,12]]}},"keywords":{}}],["quot;update"",{"_index":5870,"title":{},"content":{"1084":{"position":[[1089,19]]}},"keywords":{}}],["quot;updatecrdt"",{"_index":5872,"title":{},"content":{"1084":{"position":[[1140,23]]}},"keywords":{}}],["quot;updatedat"",{"_index":5447,"title":{},"content":{"986":{"position":[[1004,22]]}},"keywords":{}}],["quot;version"",{"_index":2358,"title":{},"content":{"397":{"position":[[538,20]]},"403":{"position":[[489,20]]},"1074":{"position":[[722,20]]},"1085":{"position":[[1215,20]]},"1107":{"position":[[540,20]]}},"keywords":{}}],["quot;voxel"",{"_index":5556,"title":{},"content":{"1007":{"position":[[103,17]]}},"keywords":{}}],["quot;vu",{"_index":1447,"title":{},"content":{"243":{"position":[[114,9],[185,9]]}},"keywords":{}}],["quot;web",{"_index":1503,"title":{},"content":{"244":{"position":[[874,9]]}},"keywords":{}}],["quot;webrtc",{"_index":1457,"title":{},"content":{"243":{"position":[[464,12]]}},"keywords":{}}],["quot;webtransport",{"_index":1497,"title":{},"content":{"244":{"position":[[681,18]]}},"keywords":{}}],["quot;which",{"_index":2191,"title":{},"content":{"390":{"position":[[618,11],[685,11]]}},"keywords":{}}],["quot;wilson"",{"_index":5446,"title":{},"content":{"986":{"position":[[837,19]]}},"keywords":{}}],["quot;winner"",{"_index":2678,"title":{},"content":{"412":{"position":[[3359,18]]}},"keywords":{}}],["quot;wins"",{"_index":3892,"title":{},"content":{"688":{"position":[[445,16]]}},"keywords":{}}],["quot;won't",{"_index":3648,"title":{},"content":{"617":{"position":[[1725,11]]}},"keywords":{}}],["quot;you",{"_index":2621,"title":{},"content":{"411":{"position":[[2594,9]]}},"keywords":{}}],["quot;zero",{"_index":1455,"title":{},"content":{"243":{"position":[[432,10]]},"902":{"position":[[522,10]]}},"keywords":{}}],["quot;zflutt",{"_index":1281,"title":{},"content":{"188":{"position":[[2887,14]]}},"keywords":{}}],["quot;ziemann"",{"_index":1832,"title":{},"content":{"303":{"position":[[605,20],[859,20]]},"361":{"position":[[602,20],[856,20]]}},"keywords":{}}],["quot;|b"",{"_index":1842,"title":{},"content":{"303":{"position":[[923,15],[969,15]]},"361":{"position":[[920,15],[966,15]]}},"keywords":{}}],["quot;|e"",{"_index":1838,"title":{},"content":{"303":{"position":[[806,15]]},"361":{"position":[[803,15]]}},"keywords":{}}],["quot;|g"",{"_index":1839,"title":{},"content":{"303":{"position":[[843,15]]},"361":{"position":[[840,15]]}},"keywords":{}}],["quot;|h"",{"_index":1841,"title":{},"content":{"303":{"position":[[900,15],[946,15]]},"361":{"position":[[897,15],[943,15]]}},"keywords":{}}],["quot;|i"",{"_index":1840,"title":{},"content":{"303":{"position":[[880,15]]},"361":{"position":[[877,15]]}},"keywords":{}}],["quota",{"_index":1703,"title":{"301":{"position":[[29,7]]}},"content":{"298":{"position":[[107,5]]},"299":{"position":[[16,6],[356,5],[667,6],[979,6],[1451,5]]},"300":{"position":[[223,5]]},"301":{"position":[[559,5],[745,6]]},"302":{"position":[[69,6],[464,5],[919,5]]},"304":{"position":[[119,6],[251,6]]},"306":{"position":[[100,5]]},"408":{"position":[[510,6],[1226,6]]}},"keywords":{}}],["quota.quota",{"_index":1773,"title":{},"content":{"300":{"position":[[286,12]]}},"keywords":{}}],["quota.usag",{"_index":1775,"title":{},"content":{"300":{"position":[[317,12]]}},"keywords":{}}],["quotaexceedederror",{"_index":1797,"title":{},"content":{"302":{"position":[[103,18],[871,21]]},"1207":{"position":[[736,18]]}},"keywords":{}}],["r1",{"_index":4435,"title":{},"content":{"749":{"position":[[23961,2]]}},"keywords":{}}],["r2",{"_index":4437,"title":{},"content":{"749":{"position":[[24081,2]]}},"keywords":{}}],["r3",{"_index":4439,"title":{},"content":{"749":{"position":[[24242,2]]}},"keywords":{}}],["rais",{"_index":2790,"title":{},"content":{"417":{"position":[[115,5]]}},"keywords":{}}],["ram",{"_index":1607,"title":{},"content":{"265":{"position":[[789,4]]},"1321":{"position":[[111,3]]}},"keywords":{}}],["ran",{"_index":6393,"title":{},"content":{"1292":{"position":[[15,3]]}},"keywords":{}}],["random",{"_index":2344,"title":{},"content":{"396":{"position":[[965,6]]},"670":{"position":[[186,6]]},"821":{"position":[[776,6]]},"837":{"position":[[1524,6]]},"1010":{"position":[[108,6]]}},"keywords":{}}],["randomcouchstring(10",{"_index":6383,"title":{},"content":{"1286":{"position":[[515,22]]},"1287":{"position":[[565,22]]},"1288":{"position":[[531,22]]}},"keywords":{}}],["randomli",{"_index":3043,"title":{},"content":{"464":{"position":[[201,8]]},"719":{"position":[[307,8]]},"1304":{"position":[[1078,8]]}},"keywords":{}}],["rang",{"_index":519,"title":{"796":{"position":[[74,6]]}},"content":{"33":{"position":[[414,5]]},"165":{"position":[[17,5]]},"177":{"position":[[233,5]]},"193":{"position":[[15,5]]},"254":{"position":[[420,5]]},"267":{"position":[[1433,5]]},"287":{"position":[[77,5],[598,5]]},"364":{"position":[[360,5]]},"365":{"position":[[841,5]]},"368":{"position":[[203,5]]},"396":{"position":[[1690,6]]},"398":{"position":[[1772,5],[1871,5],[2264,5],[2414,7],[2461,6]]},"400":{"position":[[109,5],[475,5]]},"420":{"position":[[1445,5]]},"432":{"position":[[475,5]]},"454":{"position":[[174,5]]},"459":{"position":[[513,6]]},"461":{"position":[[701,6]]},"462":{"position":[[949,5]]},"468":{"position":[[268,5]]},"469":{"position":[[17,5]]},"504":{"position":[[682,5]]},"525":{"position":[[406,5]]},"631":{"position":[[121,5]]},"796":{"position":[[84,5]]},"904":{"position":[[516,5]]},"1067":{"position":[[1222,5],[1452,5]]},"1120":{"position":[[411,5]]},"1124":{"position":[[60,5],[625,5],[820,6],[957,6]]},"1134":{"position":[[319,5]]},"1272":{"position":[[251,5]]},"1294":{"position":[[1173,5]]},"1296":{"position":[[1350,5],[1459,5]]}},"keywords":{}}],["rapid",{"_index":925,"title":{},"content":{"65":{"position":[[1244,5]]},"287":{"position":[[1014,5]]},"369":{"position":[[153,5]]},"569":{"position":[[806,5]]}},"keywords":{}}],["rapidli",{"_index":2005,"title":{},"content":{"353":{"position":[[267,7]]},"408":{"position":[[2196,7]]}},"keywords":{}}],["rare",{"_index":296,"title":{},"content":{"17":{"position":[[486,4]]},"362":{"position":[[612,6]]},"411":{"position":[[875,6]]},"689":{"position":[[491,6]]},"698":{"position":[[908,5]]},"740":{"position":[[4,4]]},"966":{"position":[[234,4]]},"1090":{"position":[[1236,4]]}},"keywords":{}}],["rate",{"_index":3199,"title":{},"content":{"497":{"position":[[113,5]]},"841":{"position":[[1093,4]]}},"keywords":{}}],["rates.scenario",{"_index":3201,"title":{},"content":{"497":{"position":[[322,15]]}},"keywords":{}}],["raw",{"_index":1933,"title":{},"content":{"331":{"position":[[59,3]]},"350":{"position":[[232,5]]},"356":{"position":[[207,3]]},"408":{"position":[[3129,3]]},"576":{"position":[[43,3]]},"620":{"position":[[247,3]]}},"keywords":{}}],["rawrespons",{"_index":5037,"title":{},"content":{"875":{"position":[[6219,11]]},"988":{"position":[[2503,11]]}},"keywords":{}}],["rawresponse.json",{"_index":5041,"title":{},"content":{"875":{"position":[[6434,19]]},"988":{"position":[[2852,19]]}},"keywords":{}}],["rc1",{"_index":4324,"title":{},"content":{"749":{"position":[[14568,3]]}},"keywords":{}}],["rc2",{"_index":4325,"title":{},"content":{"749":{"position":[[14650,3]]}},"keywords":{}}],["rc4",{"_index":4327,"title":{},"content":{"749":{"position":[[14765,3]]}},"keywords":{}}],["rc5",{"_index":4329,"title":{},"content":{"749":{"position":[[14921,3]]}},"keywords":{}}],["rc6",{"_index":4330,"title":{},"content":{"749":{"position":[[15132,3]]}},"keywords":{}}],["rc7",{"_index":4333,"title":{},"content":{"749":{"position":[[15291,3]]}},"keywords":{}}],["rc_couchdb_1",{"_index":4345,"title":{},"content":{"749":{"position":[[16101,12]]}},"keywords":{}}],["rc_couchdb_2",{"_index":4347,"title":{},"content":{"749":{"position":[[16249,12]]}},"keywords":{}}],["rc_forbidden",{"_index":4352,"title":{},"content":{"749":{"position":[[16639,12]]}},"keywords":{}}],["rc_outdat",{"_index":4348,"title":{},"content":{"749":{"position":[[16368,11]]}},"keywords":{}}],["rc_pull",{"_index":4338,"title":{},"content":{"749":{"position":[[15466,7]]}},"keywords":{}}],["rc_push",{"_index":4342,"title":{},"content":{"749":{"position":[[15732,7]]}},"keywords":{}}],["rc_push_no_ar",{"_index":4343,"title":{},"content":{"749":{"position":[[15864,13]]}},"keywords":{}}],["rc_stream",{"_index":4341,"title":{},"content":{"749":{"position":[[15598,9]]}},"keywords":{}}],["rc_unauthor",{"_index":4350,"title":{},"content":{"749":{"position":[[16490,15]]}},"keywords":{}}],["rc_webrtc_peer",{"_index":4344,"title":{},"content":{"749":{"position":[[15999,14]]}},"keywords":{}}],["rddt",{"_index":1443,"title":{},"content":{"243":{"position":[[60,5],[139,5],[265,5],[314,5],[355,5]]}},"keywords":{}}],["re",{"_index":166,"title":{"1022":{"position":[[9,2]]}},"content":{"11":{"position":[[661,6]]},"234":{"position":[[200,2]]},"255":{"position":[[1147,3],[1410,3]]},"329":{"position":[[110,2]]},"335":{"position":[[937,2]]},"346":{"position":[[134,2],[418,2]]},"385":{"position":[[318,2]]},"411":{"position":[[3223,2],[3626,2]]},"490":{"position":[[560,2]]},"494":{"position":[[636,2]]},"566":{"position":[[445,2],[518,2]]},"611":{"position":[[1053,2]]},"612":{"position":[[1866,4]]},"630":{"position":[[362,2]]},"634":{"position":[[336,2]]},"756":{"position":[[222,2]]},"799":{"position":[[543,4],[775,4]]},"829":{"position":[[2728,2],[2757,2],[3658,2]]},"841":{"position":[[850,2]]},"870":{"position":[[106,2]]},"875":{"position":[[2093,4],[4461,4],[7250,4]]},"921":{"position":[[79,2]]},"954":{"position":[[206,2]]},"990":{"position":[[651,2]]},"1007":{"position":[[1511,3],[1669,3]]},"1008":{"position":[[295,2]]},"1010":{"position":[[115,2]]},"1294":{"position":[[1768,6]]},"1307":{"position":[[851,2]]},"1315":{"position":[[1662,2]]},"1316":{"position":[[1750,2]]},"1318":{"position":[[1149,2]]}},"keywords":{}}],["reach",{"_index":457,"title":{"302":{"position":[[32,8]]}},"content":{"28":{"position":[[324,7]]},"418":{"position":[[808,6]]},"461":{"position":[[426,7]]},"491":{"position":[[1593,5]]},"496":{"position":[[72,7]]},"610":{"position":[[1227,7]]},"696":{"position":[[1798,5]]},"711":{"position":[[2395,6]]},"984":{"position":[[514,7]]},"990":{"position":[[178,7]]},"1092":{"position":[[481,8]]},"1294":{"position":[[1093,8]]}},"keywords":{}}],["reachabl",{"_index":6273,"title":{},"content":{"1227":{"position":[[856,9]]},"1265":{"position":[[830,9]]}},"keywords":{}}],["react",{"_index":99,"title":{"8":{"position":[[0,5]]},"286":{"position":[[25,7]]},"371":{"position":[[32,5]]},"437":{"position":[[17,5]]},"494":{"position":[[0,5]]},"512":{"position":[[23,5]]},"520":{"position":[[15,5]]},"521":{"position":[[13,5]]},"522":{"position":[[16,5]]},"523":{"position":[[11,5]]},"532":{"position":[[22,5]]},"534":{"position":[[21,6]]},"536":{"position":[[15,6]]},"541":{"position":[[26,5]]},"543":{"position":[[0,5]]},"549":{"position":[[0,5]]},"551":{"position":[[0,5]]},"552":{"position":[[34,5]]},"556":{"position":[[19,5]]},"827":{"position":[[0,5]]},"830":{"position":[[0,5]]},"833":{"position":[[0,5]]},"834":{"position":[[23,5]]},"852":{"position":[[0,5]]},"1214":{"position":[[18,5]]},"1277":{"position":[[11,5]]}},"content":{"7":{"position":[[644,5]]},"8":{"position":[[181,5],[205,5],[257,5],[277,5],[336,5],[354,5],[448,5],[859,6],[933,5]]},"9":{"position":[[6,5]]},"17":{"position":[[96,5],[106,5],[263,5]]},"33":{"position":[[279,5]]},"38":{"position":[[716,5]]},"47":{"position":[[1246,5]]},"99":{"position":[[360,5]]},"112":{"position":[[110,5]]},"121":{"position":[[221,5]]},"140":{"position":[[150,5]]},"168":{"position":[[82,5]]},"174":{"position":[[2716,5]]},"201":{"position":[[190,5]]},"207":{"position":[[187,5]]},"239":{"position":[[147,5]]},"244":{"position":[[1392,5]]},"248":{"position":[[76,5]]},"254":{"position":[[158,5],[394,5]]},"286":{"position":[[183,6]]},"352":{"position":[[246,6]]},"365":{"position":[[1047,5]]},"371":{"position":[[40,5],[303,5]]},"383":{"position":[[406,5]]},"420":{"position":[[304,5]]},"437":{"position":[[5,5],[267,5]]},"445":{"position":[[1482,6],[1774,5]]},"446":{"position":[[1141,5]]},"447":{"position":[[237,5]]},"458":{"position":[[66,5]]},"479":{"position":[[384,6]]},"490":{"position":[[46,5]]},"494":{"position":[[6,6],[144,5],[155,8],[630,5]]},"503":{"position":[[74,6]]},"509":{"position":[[50,5]]},"513":{"position":[[106,5]]},"515":{"position":[[411,5]]},"520":{"position":[[40,5]]},"521":{"position":[[29,5],[556,5]]},"522":{"position":[[40,5],[205,5]]},"523":{"position":[[42,5]]},"524":{"position":[[670,5],[753,5],[1021,5]]},"530":{"position":[[17,5],[294,5],[470,5],[675,5]]},"531":{"position":[[445,5]]},"534":{"position":[[15,5]]},"535":{"position":[[1298,5]]},"536":{"position":[[22,5]]},"538":{"position":[[247,5]]},"540":{"position":[[183,5]]},"541":{"position":[[117,5],[208,8]]},"542":{"position":[[80,5]]},"543":{"position":[[48,5]]},"546":{"position":[[257,5]]},"548":{"position":[[244,5]]},"551":{"position":[[1,5],[302,5],[327,5]]},"556":{"position":[[106,5],[131,5],[224,5],[311,6]]},"557":{"position":[[119,5],[157,5],[460,5]]},"559":{"position":[[192,6],[228,8]]},"562":{"position":[[761,5],[886,5],[1043,6],[1079,8],[1641,5]]},"563":{"position":[[814,5]]},"567":{"position":[[757,5],[808,5],[1021,5]]},"631":{"position":[[190,5]]},"659":{"position":[[159,5]]},"749":{"position":[[5932,5]]},"785":{"position":[[402,5]]},"793":{"position":[[310,5],[1246,5]]},"824":{"position":[[241,5]]},"825":{"position":[[9,5]]},"828":{"position":[[69,5],[79,5],[180,5],[287,5]]},"829":{"position":[[34,5],[67,5],[73,5],[141,5],[209,5],[343,5],[923,5],[932,5],[1093,6],[1248,6],[1284,8],[2979,5]]},"830":{"position":[[69,5],[87,5],[187,5],[314,5]]},"831":{"position":[[20,5],[322,5],[406,5]]},"832":{"position":[[22,5],[142,6],[264,5]]},"834":{"position":[[61,5]]},"835":{"position":[[577,5],[627,5]]},"836":{"position":[[230,5],[396,5],[480,5],[517,5],[643,6],[1055,5],[1290,5],[1611,5]]},"837":{"position":[[312,5],[849,5],[1026,5],[1072,5],[1349,5],[1369,5],[1395,5],[1506,6],[1762,5],[1806,6],[2139,6]]},"838":{"position":[[377,5],[1195,5],[1341,5],[1582,5],[1821,5],[2004,6],[2403,5],[3206,5],[3413,5]]},"840":{"position":[[621,5],[664,5]]},"842":{"position":[[46,5],[84,5],[315,5]]},"852":{"position":[[1,5]]},"875":{"position":[[9143,5]]},"964":{"position":[[327,5],[454,5]]},"1150":{"position":[[119,5]]},"1173":{"position":[[230,5]]},"1183":{"position":[[467,5]]},"1191":{"position":[[377,5]]},"1196":{"position":[[42,6]]},"1214":{"position":[[104,5],[696,5]]},"1247":{"position":[[94,5]]},"1271":{"position":[[229,5]]},"1277":{"position":[[13,5],[306,6],[496,5],[597,5],[677,5],[833,6]]},"1283":{"position":[[1,5]]},"1284":{"position":[[69,5],[451,5]]},"1316":{"position":[[3550,5]]}},"keywords":{}}],["react'",{"_index":3258,"title":{},"content":{"521":{"position":[[134,7]]}},"keywords":{}}],["react.j",{"_index":1013,"title":{},"content":{"94":{"position":[[109,9]]},"173":{"position":[[2307,9]]},"222":{"position":[[126,9]]}},"keywords":{}}],["react/remix",{"_index":594,"title":{},"content":{"38":{"position":[[685,12]]}},"keywords":{}}],["reactiv",{"_index":284,"title":{"53":{"position":[[0,8]]},"68":{"position":[[20,9]]},"99":{"position":[[20,9]]},"121":{"position":[[0,8]]},"144":{"position":[[11,10]]},"150":{"position":[[54,8]]},"156":{"position":[[0,8]]},"182":{"position":[[0,8]]},"226":{"position":[[20,9]]},"326":{"position":[[0,8]]},"379":{"position":[[10,11]]},"515":{"position":[[0,8]]},"540":{"position":[[0,8]]},"580":{"position":[[4,10]]},"600":{"position":[[0,8]]},"822":{"position":[[23,10]]},"825":{"position":[[9,10]]},"826":{"position":[[17,10]]},"1113":{"position":[[10,8]]}},"content":{"17":{"position":[[21,8]]},"34":{"position":[[415,11]]},"35":{"position":[[396,8]]},"41":{"position":[[334,11]]},"42":{"position":[[21,9],[303,10]]},"53":{"position":[[26,11]]},"55":{"position":[[42,11],[86,10],[943,11]]},"68":{"position":[[91,8]]},"77":{"position":[[126,10]]},"90":{"position":[[136,8]]},"99":{"position":[[176,8],[311,8]]},"103":{"position":[[112,8]]},"106":{"position":[[70,11]]},"118":{"position":[[17,8],[69,8],[158,8]]},"120":{"position":[[63,8],[182,8]]},"121":{"position":[[39,8],[94,8],[240,8]]},"124":{"position":[[237,8]]},"126":{"position":[[101,8]]},"136":{"position":[[47,8]]},"144":{"position":[[29,10]]},"148":{"position":[[73,8]]},"153":{"position":[[17,8],[155,8]]},"155":{"position":[[60,8],[230,8]]},"156":{"position":[[45,8],[179,8]]},"161":{"position":[[204,8]]},"168":{"position":[[361,8]]},"170":{"position":[[114,9],[179,8]]},"174":{"position":[[349,8]]},"179":{"position":[[145,8],[348,8]]},"182":{"position":[[41,8],[119,8]]},"186":{"position":[[282,8]]},"198":{"position":[[150,8]]},"205":{"position":[[307,8]]},"226":{"position":[[141,9],[251,8],[370,8]]},"233":{"position":[[172,8]]},"235":{"position":[[163,10]]},"252":{"position":[[300,10]]},"322":{"position":[[17,8],[105,8]]},"323":{"position":[[1,8]]},"325":{"position":[[161,8]]},"331":{"position":[[158,11]]},"335":{"position":[[54,10]]},"346":{"position":[[250,11]]},"360":{"position":[[212,8]]},"362":{"position":[[866,8]]},"378":{"position":[[6,9],[146,10]]},"379":{"position":[[24,8]]},"385":{"position":[[273,8]]},"388":{"position":[[295,8]]},"411":{"position":[[2313,8],[2643,8],[3068,8]]},"419":{"position":[[1116,11]]},"445":{"position":[[23,8],[185,9],[1222,8],[1285,8],[1559,8]]},"447":{"position":[[351,8]]},"479":{"position":[[6,9]]},"502":{"position":[[19,9]]},"513":{"position":[[198,8],[271,8]]},"514":{"position":[[17,8],[101,8],[342,10]]},"515":{"position":[[52,8],[342,8]]},"520":{"position":[[109,8]]},"521":{"position":[[468,8]]},"523":{"position":[[131,10]]},"530":{"position":[[202,8],[356,8]]},"540":{"position":[[26,8]]},"541":{"position":[[73,8]]},"542":{"position":[[39,11],[144,10],[275,11],[604,11]]},"548":{"position":[[339,8]]},"560":{"position":[[711,11]]},"561":{"position":[[232,9]]},"562":{"position":[[738,8],[1618,8]]},"563":{"position":[[24,10],[95,10],[559,11],[986,11]]},"566":{"position":[[409,10],[537,11]]},"567":{"position":[[833,11]]},"574":{"position":[[84,8],[858,9],[924,10]]},"575":{"position":[[18,8],[110,8],[239,11]]},"576":{"position":[[98,8]]},"580":{"position":[[204,10]]},"591":{"position":[[443,10]]},"600":{"position":[[26,8]]},"602":{"position":[[27,10],[85,10],[279,8]]},"608":{"position":[[337,8]]},"631":{"position":[[247,8]]},"632":{"position":[[1685,8]]},"662":{"position":[[102,9]]},"723":{"position":[[1050,8]]},"749":{"position":[[6615,10]]},"793":{"position":[[1062,10]]},"825":{"position":[[63,10],[230,10],[269,10],[411,11]]},"826":{"position":[[180,10],[309,10]]},"828":{"position":[[20,8],[321,10]]},"829":{"position":[[3851,8]]},"831":{"position":[[83,10],[130,10],[176,8],[474,10],[513,10],[551,10]]},"836":{"position":[[2394,8]]},"838":{"position":[[77,8],[555,8]]},"841":{"position":[[526,10],[584,8],[624,11],[1436,8]]},"860":{"position":[[166,8]]},"1069":{"position":[[19,8]]},"1117":{"position":[[107,10]]},"1118":{"position":[[56,10],[259,10],[715,11]]},"1124":{"position":[[675,13]]},"1150":{"position":[[201,8]]}},"keywords":{}}],["reactivityfactori",{"_index":6001,"title":{},"content":{"1118":{"position":[[476,18],[727,17]]}},"keywords":{}}],["reactj",{"_index":3385,"title":{"558":{"position":[[0,7]]},"559":{"position":[[24,7]]},"561":{"position":[[46,8]]}},"content":{"559":{"position":[[841,8]]},"560":{"position":[[139,7],[657,7]]},"561":{"position":[[135,7]]},"563":{"position":[[1001,8]]},"564":{"position":[[19,7],[1133,7]]},"567":{"position":[[39,7],[547,8],[1082,7]]}},"keywords":{}}],["reactn",{"_index":101,"title":{},"content":{"8":{"position":[[6,11]]},"1214":{"position":[[765,11],[946,11]]},"1235":{"position":[[269,12]]}},"keywords":{}}],["read",{"_index":674,"title":{"204":{"position":[[25,4]]},"465":{"position":[[17,6]]},"467":{"position":[[9,6]]},"1033":{"position":[[37,5]]},"1239":{"position":[[33,6]]},"1302":{"position":[[8,5]]}},"content":{"43":{"position":[[433,4],[717,4]]},"144":{"position":[[137,4]]},"181":{"position":[[187,5]]},"201":{"position":[[284,5]]},"204":{"position":[[96,6],[348,4]]},"251":{"position":[[43,6],[205,5],[215,4]]},"262":{"position":[[158,4],[170,7],[239,5]]},"263":{"position":[[291,6]]},"265":{"position":[[646,5]]},"358":{"position":[[78,4]]},"364":{"position":[[773,4]]},"365":{"position":[[272,4]]},"369":{"position":[[1004,7]]},"370":{"position":[[317,4]]},"371":{"position":[[322,4]]},"380":{"position":[[153,7]]},"398":{"position":[[3090,4],[3217,4],[3294,5]]},"400":{"position":[[40,4]]},"402":{"position":[[400,4],[1227,4]]},"407":{"position":[[130,4]]},"408":{"position":[[2853,5]]},"411":{"position":[[1255,5]]},"414":{"position":[[84,4]]},"415":{"position":[[112,7]]},"420":{"position":[[1368,7]]},"430":{"position":[[717,4]]},"453":{"position":[[208,4]]},"465":{"position":[[75,4],[335,5],[434,5]]},"467":{"position":[[10,4],[281,7],[552,5],[658,6]]},"470":{"position":[[9,7]]},"474":{"position":[[117,4]]},"477":{"position":[[204,5]]},"545":{"position":[[126,4]]},"550":{"position":[[127,4]]},"559":{"position":[[1085,7]]},"602":{"position":[[357,4],[465,4]]},"605":{"position":[[126,4]]},"630":{"position":[[83,5],[682,4]]},"632":{"position":[[1906,5]]},"659":{"position":[[551,4]]},"670":{"position":[[481,4]]},"696":{"position":[[2049,4]]},"705":{"position":[[1170,4]]},"709":{"position":[[1144,4]]},"711":{"position":[[576,4]]},"716":{"position":[[107,7]]},"719":{"position":[[456,4]]},"749":{"position":[[5451,4]]},"759":{"position":[[1399,4]]},"772":{"position":[[1323,5]]},"773":{"position":[[202,4]]},"824":{"position":[[52,7],[333,7]]},"835":{"position":[[280,5]]},"841":{"position":[[1069,4]]},"845":{"position":[[154,4]]},"847":{"position":[[132,4]]},"854":{"position":[[1181,4],[1262,4]]},"861":{"position":[[2521,5]]},"863":{"position":[[416,5]]},"901":{"position":[[597,4]]},"904":{"position":[[2485,4]]},"912":{"position":[[732,4]]},"932":{"position":[[503,6]]},"936":{"position":[[123,4]]},"963":{"position":[[176,4]]},"968":{"position":[[620,4],[649,8]]},"973":{"position":[[67,4]]},"1032":{"position":[[108,5],[268,5]]},"1033":{"position":[[34,5],[289,4],[459,6]]},"1065":{"position":[[63,7]]},"1080":{"position":[[1134,4]]},"1090":{"position":[[104,4]]},"1092":{"position":[[396,4],[428,5]]},"1093":{"position":[[399,5]]},"1094":{"position":[[468,5]]},"1120":{"position":[[649,5],[701,4]]},"1123":{"position":[[88,5]]},"1140":{"position":[[290,4]]},"1143":{"position":[[227,5]]},"1156":{"position":[[154,7]]},"1188":{"position":[[368,4]]},"1207":{"position":[[289,6]]},"1208":{"position":[[186,4],[1264,4]]},"1209":{"position":[[276,5],[423,5]]},"1211":{"position":[[513,5]]},"1213":{"position":[[890,4],[919,8]]},"1239":{"position":[[90,5]]},"1241":{"position":[[139,4]]},"1242":{"position":[[218,4]]},"1243":{"position":[[136,4]]},"1244":{"position":[[165,4]]},"1245":{"position":[[104,4]]},"1246":{"position":[[328,4],[648,4],[945,4],[1207,4],[1581,4],[1979,4],[2263,4]]},"1247":{"position":[[130,4],[231,4],[417,4],[581,4],[740,4]]},"1292":{"position":[[459,5]]},"1294":{"position":[[213,7]]},"1295":{"position":[[687,4]]},"1299":{"position":[[195,5]]},"1302":{"position":[[56,5]]},"1304":{"position":[[1700,4]]},"1308":{"position":[[643,4]]},"1314":{"position":[[91,4]]},"1316":{"position":[[3002,4]]},"1324":{"position":[[811,4]]}},"keywords":{}}],["read.th",{"_index":3066,"title":{},"content":{"465":{"position":[[398,8]]}},"keywords":{}}],["read/writ",{"_index":1426,"title":{},"content":{"236":{"position":[[224,10]]},"430":{"position":[[684,10]]},"462":{"position":[[137,10]]},"588":{"position":[[139,10]]},"1161":{"position":[[10,10]]},"1180":{"position":[[10,10]]},"1192":{"position":[[403,10]]}},"keywords":{}}],["readabl",{"_index":2107,"title":{},"content":{"364":{"position":[[747,9]]},"1237":{"position":[[335,8]]}},"keywords":{}}],["readbuff",{"_index":6211,"title":{},"content":{"1208":{"position":[[1310,10]]}},"keywords":{}}],["readi",{"_index":1168,"title":{"309":{"position":[[11,5]]}},"content":{"153":{"position":[[339,6]]},"170":{"position":[[132,6]]},"253":{"position":[[240,5]]},"263":{"position":[[362,5]]},"314":{"position":[[920,5]]},"318":{"position":[[344,5]]},"388":{"position":[[1,5]]},"411":{"position":[[478,5]]},"480":{"position":[[961,5]]},"498":{"position":[[1,5]]},"824":{"position":[[13,5]]},"1227":{"position":[[185,5]]},"1265":{"position":[[178,5]]},"1271":{"position":[[608,5]]}},"keywords":{}}],["readili",{"_index":2853,"title":{},"content":{"421":{"position":[[471,7]]}},"keywords":{}}],["readonli",{"_index":2995,"title":{"1109":{"position":[[0,8]]}},"content":{"459":{"position":[[664,12]]},"661":{"position":[[1253,8]]},"825":{"position":[[992,8]]},"1109":{"position":[[346,11]]},"1294":{"position":[[856,11]]}},"keywords":{}}],["reads/writ",{"_index":2070,"title":{},"content":{"358":{"position":[[927,13]]},"408":{"position":[[1736,12]]},"410":{"position":[[359,12]]},"560":{"position":[[109,13]]},"566":{"position":[[724,12]]}},"keywords":{}}],["readsiz",{"_index":6213,"title":{},"content":{"1208":{"position":[[1356,8],[1607,8]]}},"keywords":{}}],["readwrit",{"_index":1806,"title":{},"content":{"302":{"position":[[725,13]]}},"keywords":{}}],["read—but",{"_index":2086,"title":{},"content":{"361":{"position":[[1074,8]]}},"keywords":{}}],["real",{"_index":537,"title":{"90":{"position":[[9,4]]},"136":{"position":[[0,4]]},"174":{"position":[[37,4]]},"264":{"position":[[45,4]]},"312":{"position":[[3,4]]},"379":{"position":[[0,4]]},"476":{"position":[[3,4]]},"490":{"position":[[0,4]]},"570":{"position":[[0,4]]},"632":{"position":[[0,4]]},"869":{"position":[[38,4]]},"895":{"position":[[39,4]]}},"content":{"34":{"position":[[405,4]]},"35":{"position":[[386,4]]},"39":{"position":[[27,4],[501,4]]},"40":{"position":[[86,4],[487,4]]},"42":{"position":[[78,4]]},"53":{"position":[[117,4]]},"65":{"position":[[749,4],[777,4]]},"68":{"position":[[132,4]]},"77":{"position":[[92,4]]},"83":{"position":[[106,4]]},"89":{"position":[[249,4]]},"90":{"position":[[41,4],[239,4]]},"99":{"position":[[229,4]]},"103":{"position":[[196,4]]},"109":{"position":[[245,4]]},"114":{"position":[[545,4]]},"121":{"position":[[121,4]]},"124":{"position":[[292,4]]},"126":{"position":[[308,4]]},"136":{"position":[[15,4],[162,4],[273,4]]},"140":{"position":[[283,4]]},"148":{"position":[[327,4]]},"151":{"position":[[177,4]]},"155":{"position":[[258,4]]},"156":{"position":[[311,4]]},"158":{"position":[[153,4]]},"162":{"position":[[502,4]]},"165":{"position":[[144,4]]},"168":{"position":[[107,4],[303,4]]},"170":{"position":[[295,4]]},"173":{"position":[[161,4],[370,4],[852,4],[936,4],[1069,4]]},"174":{"position":[[91,4],[401,4],[1969,4]]},"175":{"position":[[558,4]]},"179":{"position":[[408,4]]},"184":{"position":[[270,4]]},"185":{"position":[[280,4]]},"192":{"position":[[350,4]]},"198":{"position":[[114,4]]},"205":{"position":[[269,4]]},"208":{"position":[[324,4]]},"212":{"position":[[573,4]]},"220":{"position":[[283,4]]},"252":{"position":[[344,4]]},"255":{"position":[[197,4],[1855,4]]},"263":{"position":[[501,4]]},"265":{"position":[[322,4],[892,4]]},"267":{"position":[[53,4],[132,4],[186,4],[288,4],[411,4],[570,4],[741,4],[841,4],[930,4],[1041,4],[1209,4],[1442,4],[1530,4]]},"275":{"position":[[153,4]]},"283":{"position":[[308,4]]},"289":{"position":[[1258,4]]},"301":{"position":[[24,4],[263,4]]},"312":{"position":[[207,4]]},"318":{"position":[[667,4]]},"321":{"position":[[536,4]]},"322":{"position":[[214,4]]},"323":{"position":[[36,4]]},"325":{"position":[[220,4]]},"328":{"position":[[15,4]]},"330":{"position":[[151,4]]},"340":{"position":[[95,4]]},"344":{"position":[[107,4]]},"353":{"position":[[693,4]]},"368":{"position":[[360,4]]},"375":{"position":[[368,4]]},"378":{"position":[[161,4]]},"388":{"position":[[449,4]]},"408":{"position":[[1917,4]]},"410":{"position":[[422,4],[1619,4]]},"411":{"position":[[2821,4],[3874,4]]},"412":{"position":[[6484,4]]},"418":{"position":[[301,4]]},"419":{"position":[[1106,4]]},"420":{"position":[[1341,4]]},"421":{"position":[[240,4],[439,4]]},"432":{"position":[[1222,4]]},"445":{"position":[[301,4],[790,4],[850,4],[1135,4]]},"446":{"position":[[427,4],[478,4],[598,4],[750,4]]},"447":{"position":[[136,4]]},"469":{"position":[[1389,4]]},"476":{"position":[[100,4],[205,4]]},"479":{"position":[[182,4]]},"480":{"position":[[704,4]]},"483":{"position":[[135,4],[334,4]]},"490":{"position":[[693,4]]},"491":{"position":[[258,4],[823,4],[1526,4]]},"497":{"position":[[13,4]]},"498":{"position":[[311,4]]},"501":{"position":[[184,4]]},"502":{"position":[[110,4],[791,4]]},"504":{"position":[[1135,4]]},"509":{"position":[[75,4]]},"517":{"position":[[190,4]]},"529":{"position":[[135,4]]},"530":{"position":[[407,4]]},"540":{"position":[[64,4]]},"554":{"position":[[371,4]]},"566":{"position":[[399,4]]},"567":{"position":[[111,4]]},"569":{"position":[[86,4],[113,4],[408,4],[464,4],[514,4],[641,4]]},"575":{"position":[[229,4]]},"582":{"position":[[251,4]]},"585":{"position":[[122,4]]},"589":{"position":[[117,4]]},"595":{"position":[[850,4]]},"600":{"position":[[64,4]]},"610":{"position":[[824,4]]},"611":{"position":[[253,4]]},"612":{"position":[[321,4]]},"613":{"position":[[445,4]]},"614":{"position":[[13,4],[94,4]]},"621":{"position":[[124,4],[499,4]]},"631":{"position":[[74,4]]},"705":{"position":[[351,4]]},"723":{"position":[[985,4],[1168,4],[1569,4]]},"749":{"position":[[21370,4]]},"772":{"position":[[104,4]]},"776":{"position":[[375,4]]},"798":{"position":[[242,4]]},"802":{"position":[[888,4]]},"836":{"position":[[1469,4],[2303,4]]},"837":{"position":[[819,4]]},"838":{"position":[[441,4]]},"841":{"position":[[658,4],[1531,4]]},"860":{"position":[[140,4],[558,4],[590,4]]},"901":{"position":[[23,4]]},"903":{"position":[[16,4]]},"1072":{"position":[[872,4]]},"1132":{"position":[[946,4]]},"1150":{"position":[[145,4]]},"1209":{"position":[[324,4]]},"1313":{"position":[[512,4]]}},"keywords":{}}],["realiti",{"_index":2795,"title":{},"content":{"418":{"position":[[505,8]]},"875":{"position":[[4945,7],[5687,7]]}},"keywords":{}}],["realiz",{"_index":6559,"title":{},"content":{"1316":{"position":[[2444,11]]}},"keywords":{}}],["realli",{"_index":15,"title":{"697":{"position":[[23,6]]}},"content":{"1":{"position":[[230,6]]},"5":{"position":[[167,6]]},"19":{"position":[[547,6]]},"29":{"position":[[326,6]]},"260":{"position":[[258,6]]},"411":{"position":[[951,6]]},"465":{"position":[[345,6],[352,6]]},"468":{"position":[[17,6]]},"696":{"position":[[1550,6]]},"701":{"position":[[454,6],[958,6]]},"703":{"position":[[1194,6]]},"740":{"position":[[220,6]]},"773":{"position":[[187,6]]},"800":{"position":[[272,6]]},"837":{"position":[[585,6]]},"1156":{"position":[[202,6]]},"1167":{"position":[[1,6]]},"1171":{"position":[[344,6]]},"1193":{"position":[[164,6]]},"1238":{"position":[[121,6]]},"1241":{"position":[[90,6]]},"1315":{"position":[[958,6]]},"1318":{"position":[[957,6]]},"1321":{"position":[[126,6]]}},"keywords":{}}],["realm",{"_index":566,"title":{"36":{"position":[[8,6]]},"839":{"position":[[0,6]]}},"content":{"36":{"position":[[12,5],[262,5],[304,5],[351,5]]},"444":{"position":[[464,6]]},"445":{"position":[[79,5]]},"530":{"position":[[8,5]]},"749":{"position":[[8815,5]]},"839":{"position":[[3,5],[123,5],[402,5],[449,5],[672,5],[868,5],[1174,5]]},"841":{"position":[[49,5],[443,5],[639,5],[805,5],[1520,5]]},"1115":{"position":[[593,6]]},"1117":{"position":[[541,6]]},"1230":{"position":[[180,6],[280,6]]}},"keywords":{}}],["realm'",{"_index":4803,"title":{},"content":{"839":{"position":[[1063,7]]}},"keywords":{}}],["realmasterst",{"_index":5021,"title":{},"content":{"875":{"position":[[4637,15],[4721,15],[4783,15]]},"1309":{"position":[[1133,15]]}},"keywords":{}}],["realmasterstate.updatedat",{"_index":5025,"title":{},"content":{"875":{"position":[[5029,25]]}},"keywords":{}}],["realtim",{"_index":180,"title":{"12":{"position":[[17,8]]},"199":{"position":[[20,8]]},"200":{"position":[[34,8]]},"221":{"position":[[9,8]]},"568":{"position":[[10,8]]},"569":{"position":[[0,8],[15,8]]},"570":{"position":[[25,8]]},"571":{"position":[[0,8],[15,8]]},"699":{"position":[[0,8]]},"781":{"position":[[0,8]]},"980":{"position":[[7,8]]},"1150":{"position":[[12,8]]}},"content":{"14":{"position":[[173,8],[228,8],[261,8],[471,8],[653,8]]},"15":{"position":[[72,8]]},"18":{"position":[[380,8]]},"19":{"position":[[510,8]]},"20":{"position":[[82,9]]},"22":{"position":[[241,8]]},"25":{"position":[[85,8]]},"38":{"position":[[57,9]]},"201":{"position":[[17,8]]},"202":{"position":[[16,8]]},"203":{"position":[[10,8]]},"204":{"position":[[27,8]]},"205":{"position":[[24,8]]},"212":{"position":[[147,8]]},"221":{"position":[[1,8],[158,8]]},"238":{"position":[[8,8]]},"243":{"position":[[229,8]]},"410":{"position":[[1463,8],[1854,8]]},"444":{"position":[[601,8]]},"569":{"position":[[1000,8],[1084,9],[1100,8],[1268,8],[1495,8],[1541,8]]},"570":{"position":[[20,8],[61,9],[77,8],[161,8],[234,8]]},"571":{"position":[[19,8],[583,8],[647,8],[1405,8]]},"572":{"position":[[59,8]]},"625":{"position":[[16,8]]},"626":{"position":[[879,8]]},"627":{"position":[[218,8]]},"661":{"position":[[1580,8],[1808,8]]},"662":{"position":[[243,8],[304,8]]},"699":{"position":[[135,9],[197,8],[254,8],[759,9],[1017,8]]},"710":{"position":[[373,8]]},"781":{"position":[[225,8],[600,8]]},"784":{"position":[[544,8]]},"838":{"position":[[272,8],[333,8]]},"860":{"position":[[1211,8]]},"875":{"position":[[6722,8]]},"886":{"position":[[3244,8],[3781,8]]},"896":{"position":[[244,8]]},"897":{"position":[[306,8]]},"898":{"position":[[735,8]]},"965":{"position":[[47,8]]},"988":{"position":[[650,8],[4910,8]]},"1094":{"position":[[236,8]]},"1123":{"position":[[730,8]]},"1124":{"position":[[880,8],[1593,8],[2111,8]]},"1320":{"position":[[949,8]]},"1321":{"position":[[162,8]]}},"keywords":{}}],["reason",{"_index":79,"title":{"428":{"position":[[0,7]]}},"content":{"5":{"position":[[179,7]]},"67":{"position":[[140,8]]},"86":{"position":[[22,7]]},"98":{"position":[[155,7]]},"215":{"position":[[16,6]]},"225":{"position":[[116,7]]},"266":{"position":[[993,6]]},"278":{"position":[[195,7]]},"398":{"position":[[3008,10]]},"411":{"position":[[5726,7]]},"412":{"position":[[6973,10]]},"420":{"position":[[523,6]]},"455":{"position":[[329,8]]},"461":{"position":[[150,11]]},"485":{"position":[[145,7]]},"534":{"position":[[134,7]]},"556":{"position":[[1528,8]]},"594":{"position":[[132,7]]},"688":{"position":[[517,6]]},"691":{"position":[[664,6]]},"709":{"position":[[1072,6]]},"721":{"position":[[241,6]]},"740":{"position":[[129,6]]},"828":{"position":[[519,6]]},"837":{"position":[[824,6]]},"985":{"position":[[158,6]]},"990":{"position":[[53,7]]},"1010":{"position":[[161,6]]},"1085":{"position":[[176,7]]},"1105":{"position":[[1033,7]]},"1108":{"position":[[589,8]]},"1112":{"position":[[611,8]]},"1174":{"position":[[99,6]]},"1246":{"position":[[1480,6]]},"1281":{"position":[[55,6]]}},"keywords":{}}],["reassign",{"_index":4088,"title":{},"content":{"737":{"position":[[450,8]]}},"keywords":{}}],["rebuild",{"_index":3994,"title":{},"content":{"711":{"position":[[809,7],[956,7],[1005,7]]},"749":{"position":[[23687,7]]}},"keywords":{}}],["recalcul",{"_index":2627,"title":{},"content":{"411":{"position":[[3361,12]]}},"keywords":{}}],["receiv",{"_index":1175,"title":{},"content":{"159":{"position":[[187,7]]},"185":{"position":[[272,7]]},"379":{"position":[[112,7]]},"411":{"position":[[523,8]]},"415":{"position":[[475,9]]},"570":{"position":[[566,7]]},"610":{"position":[[533,9],[1576,8]]},"612":{"position":[[648,9]]},"616":{"position":[[88,7]]},"767":{"position":[[16,8]]},"768":{"position":[[13,8]]},"769":{"position":[[16,8]]},"875":{"position":[[7960,8]]},"886":{"position":[[2151,8]]},"986":{"position":[[1355,7]]},"991":{"position":[[183,8]]},"993":{"position":[[117,8]]},"1022":{"position":[[192,9],[318,9],[505,11],[851,9],[861,8],[1042,9]]}},"keywords":{}}],["received"",{"_index":5633,"title":{},"content":{"1022":{"position":[[959,14]]}},"keywords":{}}],["recent",{"_index":2704,"title":{},"content":{"412":{"position":[[5950,9]]}},"keywords":{}}],["recombin",{"_index":6455,"title":{},"content":{"1295":{"position":[[1333,10]]}},"keywords":{}}],["recommend",{"_index":73,"title":{"624":{"position":[[0,15]]},"1235":{"position":[[6,16]]}},"content":{"4":{"position":[[238,11]]},"9":{"position":[[98,11]]},"51":{"position":[[903,11]]},"145":{"position":[[78,11]]},"351":{"position":[[425,12]]},"432":{"position":[[1055,12]]},"434":{"position":[[358,11]]},"439":{"position":[[89,11]]},"566":{"position":[[620,11]]},"567":{"position":[[149,11]]},"590":{"position":[[15,15]]},"616":{"position":[[227,11]]},"655":{"position":[[98,11]]},"661":{"position":[[409,11]]},"662":{"position":[[513,11],[1076,11]]},"693":{"position":[[32,11]]},"709":{"position":[[937,11]]},"710":{"position":[[724,11],[1010,9],[2292,11]]},"711":{"position":[[460,12],[492,14]]},"716":{"position":[[253,11]]},"721":{"position":[[83,11]]},"772":{"position":[[2090,11]]},"834":{"position":[[89,9]]},"835":{"position":[[651,10]]},"836":{"position":[[375,9]]},"837":{"position":[[1209,11]]},"838":{"position":[[1382,11]]},"840":{"position":[[641,11]]},"857":{"position":[[554,11]]},"861":{"position":[[116,11]]},"911":{"position":[[274,11]]},"988":{"position":[[462,11]]},"1068":{"position":[[287,11]]},"1192":{"position":[[633,11]]},"1195":{"position":[[99,11]]},"1196":{"position":[[109,12]]},"1214":{"position":[[310,12]]},"1231":{"position":[[46,11]]},"1246":{"position":[[2058,11]]}},"keywords":{}}],["recommended)nev",{"_index":6174,"title":{},"content":{"1198":{"position":[[2126,18]]}},"keywords":{}}],["reconcil",{"_index":1301,"title":{},"content":{"201":{"position":[[387,10]]},"412":{"position":[[739,9]]},"416":{"position":[[214,9]]}},"keywords":{}}],["reconnect",{"_index":616,"title":{"626":{"position":[[34,13]]}},"content":{"39":{"position":[[152,11]]},"416":{"position":[[193,12]]},"446":{"position":[[399,10]]},"481":{"position":[[206,11]]},"610":{"position":[[1655,13]]},"612":{"position":[[1390,9]]},"626":{"position":[[30,12]]},"875":{"position":[[8619,9]]},"985":{"position":[[612,11]]},"988":{"position":[[5623,9]]}},"keywords":{}}],["reconnect.low",{"_index":2139,"title":{},"content":{"375":{"position":[[279,13]]}},"keywords":{}}],["reconnections.plan",{"_index":3528,"title":{},"content":{"590":{"position":[[791,18]]}},"keywords":{}}],["record",{"_index":1856,"title":{},"content":{"303":{"position":[[1437,7]]},"304":{"position":[[63,6]]},"350":{"position":[[40,6]]},"356":{"position":[[402,6]]},"360":{"position":[[38,6]]},"379":{"position":[[146,7]]},"412":{"position":[[9923,6]]},"943":{"position":[[240,7]]},"1009":{"position":[[288,7]]}},"keywords":{}}],["records.us",{"_index":3192,"title":{},"content":{"496":{"position":[[445,12]]}},"keywords":{}}],["recov",{"_index":2730,"title":{},"content":{"412":{"position":[[8263,7]]}},"keywords":{}}],["recreat",{"_index":2227,"title":{},"content":{"391":{"position":[[1098,8]]},"403":{"position":[[672,8]]},"1028":{"position":[[88,10]]}},"keywords":{}}],["recur",{"_index":5394,"title":{},"content":{"965":{"position":[[268,9]]}},"keywords":{}}],["red",{"_index":6524,"title":{},"content":{"1314":{"position":[[445,3],[542,3],[666,5]]}},"keywords":{}}],["red;">uncaught",{"_index":6184,"title":{},"content":{"1202":{"position":[[121,22]]}},"keywords":{}}],["reddit",{"_index":4590,"title":{},"content":{"779":{"position":[[38,6]]}},"keywords":{}}],["redefin",{"_index":1998,"title":{},"content":{"351":{"position":[[342,10]]},"510":{"position":[[97,8],[580,8]]}},"keywords":{}}],["redo",{"_index":5975,"title":{},"content":{"1110":{"position":[[64,5]]}},"keywords":{}}],["redraw",{"_index":2623,"title":{},"content":{"411":{"position":[[3030,6]]}},"keywords":{}}],["reduc",{"_index":718,"title":{"251":{"position":[[3,7]]},"477":{"position":[[3,7]]},"799":{"position":[[22,6]]}},"content":{"46":{"position":[[628,6]]},"57":{"position":[[406,6]]},"65":{"position":[[1364,6]]},"81":{"position":[[66,8]]},"87":{"position":[[129,6]]},"91":{"position":[[199,8]]},"93":{"position":[[29,7]]},"108":{"position":[[99,7]]},"111":{"position":[[99,7]]},"141":{"position":[[4,6],[162,8]]},"146":{"position":[[179,6]]},"169":{"position":[[161,6]]},"170":{"position":[[517,6]]},"173":{"position":[[760,7],[1775,7],[2042,7]]},"174":{"position":[[931,8],[1650,7],[1755,7],[2452,7]]},"197":{"position":[[107,7]]},"204":{"position":[[275,8]]},"216":{"position":[[156,6]]},"219":{"position":[[298,7]]},"223":{"position":[[333,8]]},"224":{"position":[[184,8]]},"234":{"position":[[94,7]]},"236":{"position":[[69,8],[186,7]]},"251":{"position":[[288,6]]},"263":{"position":[[298,6]]},"273":{"position":[[172,8]]},"281":{"position":[[406,7]]},"294":{"position":[[168,8]]},"301":{"position":[[633,6]]},"302":{"position":[[527,6]]},"311":{"position":[[195,8]]},"316":{"position":[[474,8]]},"323":{"position":[[423,6]]},"353":{"position":[[786,6]]},"354":{"position":[[1668,6]]},"361":{"position":[[416,8],[1111,7]]},"366":{"position":[[167,8]]},"369":{"position":[[872,7],[945,6]]},"375":{"position":[[305,8]]},"376":{"position":[[407,6]]},"392":{"position":[[5119,6]]},"396":{"position":[[288,8]]},"402":{"position":[[1283,7]]},"408":{"position":[[2564,6]]},"410":{"position":[[712,8]]},"411":{"position":[[1,7],[1519,7],[2454,6],[5135,8],[5339,8],[5678,8]]},"419":{"position":[[1477,6]]},"446":{"position":[[1394,8]]},"483":{"position":[[158,7],[851,6]]},"487":{"position":[[221,6]]},"490":{"position":[[456,6],[510,6]]},"495":{"position":[[490,6]]},"500":{"position":[[476,6]]},"508":{"position":[[54,7]]},"527":{"position":[[165,8]]},"528":{"position":[[38,6]]},"534":{"position":[[589,7]]},"550":{"position":[[316,6]]},"574":{"position":[[411,8]]},"582":{"position":[[636,8]]},"587":{"position":[[81,6]]},"588":{"position":[[74,8]]},"594":{"position":[[587,7]]},"610":{"position":[[682,7]]},"623":{"position":[[735,8]]},"630":{"position":[[316,8]]},"631":{"position":[[476,6]]},"632":{"position":[[218,8]]},"723":{"position":[[721,8]]},"780":{"position":[[308,8]]},"802":{"position":[[713,7]]},"901":{"position":[[428,7]]},"902":{"position":[[1,7],[807,8]]},"981":{"position":[[1659,7]]},"1009":{"position":[[627,7]]},"1124":{"position":[[107,6],[1750,6]]},"1132":{"position":[[1109,6]]},"1143":{"position":[[160,7],[305,7]]},"1211":{"position":[[495,6]]},"1237":{"position":[[223,6]]},"1316":{"position":[[1417,6]]}},"keywords":{}}],["reduct",{"_index":2490,"title":{},"content":{"402":{"position":[[2459,9]]}},"keywords":{}}],["redund",{"_index":1421,"title":{},"content":{"234":{"position":[[102,9]]},"736":{"position":[[533,9]]},"737":{"position":[[22,10]]}},"keywords":{}}],["redux",{"_index":1017,"title":{"785":{"position":[[19,6]]}},"content":{"96":{"position":[[125,5]]},"173":{"position":[[3086,5]]},"219":{"position":[[90,5]]},"411":{"position":[[1999,7]]},"478":{"position":[[93,6]]},"520":{"position":[[372,5]]},"785":{"position":[[296,5]]}},"keywords":{}}],["redux"",{"_index":1522,"title":{},"content":{"244":{"position":[[1437,11]]},"411":{"position":[[2619,11]]}},"keywords":{}}],["reestablish",{"_index":1296,"title":{},"content":{"191":{"position":[[210,14]]},"445":{"position":[[744,14]]},"516":{"position":[[274,14]]},"525":{"position":[[224,14]]},"981":{"position":[[1418,13]]}},"keywords":{}}],["ref",{"_index":3494,"title":{"808":{"position":[[12,4]]}},"content":{"580":{"position":[[308,4],[389,8]]},"590":{"position":[[284,5]]},"591":{"position":[[518,5]]},"601":{"position":[[386,4]]},"749":{"position":[[10108,3],[10190,3],[12069,5],[17060,3],[17183,3],[21028,4],[21206,4]]},"808":{"position":[[5,3],[262,4],[324,3],[646,4]]},"812":{"position":[[209,4]]},"813":{"position":[[169,4]]}},"keywords":{}}],["ref<any[]>",{"_index":3542,"title":{},"content":{"601":{"position":[[461,21]]}},"keywords":{}}],["refactor",{"_index":6014,"title":{},"content":{"1124":{"position":[[318,8]]}},"keywords":{}}],["refer",{"_index":1196,"title":{"812":{"position":[[20,10]]},"817":{"position":[[6,10]]}},"content":{"172":{"position":[[22,6]]},"188":{"position":[[2488,10]]},"387":{"position":[[186,10]]},"390":{"position":[[132,8]]},"563":{"position":[[776,9]]},"570":{"position":[[52,5]]},"571":{"position":[[75,6]]},"808":{"position":[[279,6],[450,9]]},"810":{"position":[[12,8]]},"817":{"position":[[46,10]]},"899":{"position":[[17,10]]},"1173":{"position":[[272,9]]},"1284":{"position":[[355,9]]}},"keywords":{}}],["referenc",{"_index":4702,"title":{},"content":{"817":{"position":[[131,10]]}},"keywords":{}}],["referenceerror",{"_index":2923,"title":{},"content":{"438":{"position":[[97,15]]},"440":{"position":[[293,15]]},"729":{"position":[[100,15]]},"1202":{"position":[[144,15]]}},"keywords":{}}],["referencerxserv",{"_index":4976,"title":{},"content":{"873":{"position":[[133,17]]}},"keywords":{}}],["referenti",{"_index":2012,"title":{},"content":{"353":{"position":[[557,11]]},"412":{"position":[[13762,11]]}},"keywords":{}}],["refetch",{"_index":2151,"title":{},"content":{"379":{"position":[[184,10]]}},"keywords":{}}],["refetch.cross",{"_index":3163,"title":{},"content":{"490":{"position":[[300,13]]}},"keywords":{}}],["refhuman",{"_index":4674,"title":{},"content":{"808":{"position":[[124,8]]}},"keywords":{}}],["refin",{"_index":3446,"title":{},"content":{"567":{"position":[[1070,6]]},"935":{"position":[[67,6]]}},"keywords":{}}],["reflect",{"_index":611,"title":{},"content":{"38":{"position":[[1146,9]]},"53":{"position":[[98,7]]},"90":{"position":[[199,7]]},"125":{"position":[[259,9]]},"160":{"position":[[173,9]]},"185":{"position":[[302,7]]},"323":{"position":[[108,7]]},"329":{"position":[[212,7]]},"411":{"position":[[4392,7]]},"475":{"position":[[211,7]]},"493":{"position":[[527,10]]},"562":{"position":[[979,7]]},"571":{"position":[[230,7]]},"589":{"position":[[168,9]]},"632":{"position":[[304,7]]},"634":{"position":[[146,7]]},"681":{"position":[[150,7]]},"723":{"position":[[1235,10]]}},"keywords":{}}],["refresh",{"_index":1927,"title":{},"content":{"326":{"position":[[254,7]]},"346":{"position":[[218,10]]},"360":{"position":[[360,7]]},"411":{"position":[[3054,8]]},"421":{"position":[[426,7]]},"490":{"position":[[156,8]]},"567":{"position":[[924,7]]},"571":{"position":[[1041,7]]},"575":{"position":[[652,7]]}},"keywords":{}}],["refs/react",{"_index":3489,"title":{},"content":{"580":{"position":[[153,13]]}},"keywords":{}}],["refus",{"_index":1862,"title":{},"content":{"304":{"position":[[347,7]]},"685":{"position":[[565,6]]},"1207":{"position":[[661,6]]}},"keywords":{}}],["regardless",{"_index":1003,"title":{},"content":{"88":{"position":[[63,10]]},"183":{"position":[[329,10]]},"206":{"position":[[246,10]]},"516":{"position":[[214,10]]},"632":{"position":[[2794,10]]}},"keywords":{}}],["regex",{"_index":2568,"title":{"1110":{"position":[[0,6]]}},"content":{"408":{"position":[[4804,5]]},"749":{"position":[[147,5],[1784,8],[2948,6],[16864,5]]},"796":{"position":[[633,6],[879,7],[916,5]]},"935":{"position":[[225,6]]},"1065":{"position":[[481,5],[507,6],[821,7],[1319,7]]},"1067":{"position":[[1242,6],[1324,7],[2003,7],[2147,7]]},"1072":{"position":[[2543,5],[2682,7],[2740,5],[2801,5]]},"1084":{"position":[[329,5]]},"1110":{"position":[[1,6]]},"1132":{"position":[[760,6]]}},"keywords":{}}],["regexp",{"_index":4173,"title":{},"content":{"749":{"position":[[2999,6],[3032,6]]},"1065":{"position":[[570,6],[655,6],[730,6]]}},"keywords":{}}],["regexqueri",{"_index":4641,"title":{},"content":{"796":{"position":[[844,10]]}},"keywords":{}}],["region",{"_index":6011,"title":{},"content":{"1123":{"position":[[114,7],[247,8]]}},"keywords":{}}],["registri",{"_index":1664,"title":{},"content":{"285":{"position":[[205,9]]}},"keywords":{}}],["regul",{"_index":3334,"title":{},"content":{"550":{"position":[[397,11]]}},"keywords":{}}],["regular",{"_index":3550,"title":{},"content":{"610":{"position":[[293,7]]},"1072":{"position":[[2556,7]]}},"keywords":{}}],["regularli",{"_index":3784,"title":{},"content":{"660":{"position":[[168,9]]},"815":{"position":[[159,10]]},"1174":{"position":[[154,9]]}},"keywords":{}}],["reimplement",{"_index":57,"title":{},"content":{"4":{"position":[[3,16]]}},"keywords":{}}],["reindex",{"_index":4041,"title":{},"content":{"723":{"position":[[1306,11],[1631,10],[1798,7]]}},"keywords":{}}],["rej",{"_index":3001,"title":{},"content":{"459":{"position":[[860,4]]},"1294":{"position":[[1154,4]]}},"keywords":{}}],["rej(err",{"_index":6439,"title":{},"content":{"1294":{"position":[[1544,9]]}},"keywords":{}}],["rej(ev",{"_index":3005,"title":{},"content":{"459":{"position":[[965,11]]}},"keywords":{}}],["reject",{"_index":3014,"title":{},"content":{"461":{"position":[[337,6]]},"987":{"position":[[429,6]]}},"keywords":{}}],["rejecterror",{"_index":842,"title":{},"content":{"55":{"position":[[585,13]]}},"keywords":{}}],["rel",{"_index":896,"title":{},"content":{"63":{"position":[[144,10]]},"300":{"position":[[33,8]]},"412":{"position":[[2028,10]]},"453":{"position":[[44,10]]}},"keywords":{}}],["relat",{"_index":1021,"title":{"278":{"position":[[67,10]]},"694":{"position":[[0,8]]},"705":{"position":[[12,10]]},"787":{"position":[[12,10]]},"1259":{"position":[[7,10]]},"1283":{"position":[[0,8]]},"1315":{"position":[[0,10]]},"1319":{"position":[[18,10]]}},"content":{"96":{"position":[[254,7]]},"104":{"position":[[205,7]]},"202":{"position":[[196,10]]},"276":{"position":[[135,10]]},"279":{"position":[[356,10]]},"282":{"position":[[260,10]]},"352":{"position":[[388,10]]},"353":{"position":[[426,10]]},"354":{"position":[[387,10],[710,10],[984,10],[1380,10],[1437,10]]},"362":{"position":[[272,10],[472,10]]},"364":{"position":[[725,7]]},"372":{"position":[[172,10]]},"412":{"position":[[13402,10],[13717,10],[14078,10],[14294,10],[14543,10]]},"439":{"position":[[146,7]]},"661":{"position":[[23,10]]},"705":{"position":[[268,10],[356,9],[947,10]]},"711":{"position":[[23,10]]},"749":{"position":[[21091,7]]},"808":{"position":[[151,7]]},"836":{"position":[[25,10]]},"1315":{"position":[[30,10]]},"1316":{"position":[[3714,10]]},"1318":{"position":[[974,10]]},"1319":{"position":[[356,10],[604,10]]},"1323":{"position":[[17,10]]},"1324":{"position":[[269,10],[630,10]]}},"keywords":{}}],["relationship",{"_index":2004,"title":{},"content":{"353":{"position":[[92,14]]},"354":{"position":[[205,14],[302,13]]},"372":{"position":[[298,13]]},"427":{"position":[[593,13]]},"808":{"position":[[95,14]]},"863":{"position":[[835,12],[942,12]]},"1132":{"position":[[722,14]]}},"keywords":{}}],["relax",{"_index":2524,"title":{"1297":{"position":[[0,7]]}},"content":{"408":{"position":[[165,7]]},"1297":{"position":[[52,7],[410,7]]}},"keywords":{}}],["releas",{"_index":1133,"title":{},"content":{"143":{"position":[[267,8]]},"726":{"position":[[23,7]]},"793":{"position":[[1400,8]]},"1123":{"position":[[148,7]]}},"keywords":{}}],["relev",{"_index":1931,"title":{},"content":{"329":{"position":[[76,8]]},"394":{"position":[[1244,10]]},"398":{"position":[[596,8]]},"412":{"position":[[7090,8]]},"468":{"position":[[573,8]]},"518":{"position":[[225,8]]},"626":{"position":[[178,8]]},"680":{"position":[[306,8]]},"709":{"position":[[1053,9]]},"723":{"position":[[331,8],[2353,9]]},"783":{"position":[[675,9]]},"1007":{"position":[[991,8]]},"1072":{"position":[[2274,8]]},"1078":{"position":[[766,8]]},"1193":{"position":[[171,8]]},"1214":{"position":[[403,8]]},"1296":{"position":[[206,8]]},"1319":{"position":[[404,8]]}},"keywords":{}}],["reli",{"_index":664,"title":{},"content":{"42":{"position":[[320,7]]},"91":{"position":[[111,7]]},"99":{"position":[[25,4]]},"173":{"position":[[2006,7],[3032,7]]},"201":{"position":[[42,6]]},"204":{"position":[[10,4]]},"216":{"position":[[295,4]]},"220":{"position":[[100,7]]},"226":{"position":[[25,4]]},"254":{"position":[[477,4]]},"298":{"position":[[268,4]]},"305":{"position":[[376,4]]},"320":{"position":[[190,4]]},"321":{"position":[[305,7]]},"346":{"position":[[235,4]]},"357":{"position":[[354,4]]},"382":{"position":[[13,7]]},"411":{"position":[[1951,4]]},"412":{"position":[[1962,6],[14110,6]]},"414":{"position":[[368,4]]},"418":{"position":[[225,4]]},"424":{"position":[[455,7]]},"427":{"position":[[1072,4]]},"430":{"position":[[208,6]]},"444":{"position":[[640,4]]},"446":{"position":[[83,4]]},"476":{"position":[[11,4]]},"497":{"position":[[813,4]]},"563":{"position":[[861,4]]},"569":{"position":[[314,6]]},"618":{"position":[[529,4]]},"621":{"position":[[398,6]]},"660":{"position":[[276,4],[535,4]]},"698":{"position":[[1601,7]]},"749":{"position":[[13430,6]]},"828":{"position":[[136,4]]},"830":{"position":[[114,4]]},"839":{"position":[[852,4]]},"854":{"position":[[1366,4]]},"1072":{"position":[[1665,6]]},"1147":{"position":[[227,4]]},"1301":{"position":[[343,4]]},"1305":{"position":[[147,4],[390,6]]},"1316":{"position":[[1887,4]]}},"keywords":{}}],["reliability.opf",{"_index":1105,"title":{},"content":{"131":{"position":[[339,16]]}},"keywords":{}}],["reliabl",{"_index":705,"title":{"386":{"position":[[7,12]]},"1316":{"position":[[0,8]]}},"content":{"46":{"position":[[121,8]]},"170":{"position":[[617,8]]},"178":{"position":[[83,8]]},"270":{"position":[[226,8]]},"281":{"position":[[448,12]]},"287":{"position":[[528,8]]},"289":{"position":[[273,8]]},"380":{"position":[[389,11]]},"412":{"position":[[8899,10]]},"432":{"position":[[32,8]]},"483":{"position":[[1210,12]]},"501":{"position":[[77,8]]},"504":{"position":[[811,8]]},"613":{"position":[[260,8]]},"618":{"position":[[583,8]]},"624":{"position":[[1234,8]]},"630":{"position":[[985,9]]},"705":{"position":[[991,8],[1430,8]]},"723":{"position":[[1864,8],[2767,8]]},"836":{"position":[[1189,8]]},"906":{"position":[[354,8]]},"1300":{"position":[[1027,9]]},"1316":{"position":[[112,9],[141,8],[312,8]]}},"keywords":{}}],["relianc",{"_index":2639,"title":{},"content":{"411":{"position":[[5144,8]]},"582":{"position":[[645,8]]},"624":{"position":[[1032,8]]},"902":{"position":[[820,8]]}},"keywords":{}}],["reliant",{"_index":2027,"title":{},"content":{"354":{"position":[[1086,7]]}},"keywords":{}}],["reload",{"_index":2062,"title":{},"content":{"358":{"position":[[498,6]]},"403":{"position":[[251,8]]},"410":{"position":[[1574,8]]},"421":{"position":[[101,8]]},"436":{"position":[[215,7]]},"463":{"position":[[1307,9]]},"467":{"position":[[622,8]]},"740":{"position":[[655,6]]},"749":{"position":[[5956,6],[5968,7],[5993,9]]},"879":{"position":[[580,6]]},"958":{"position":[[8,6],[182,8]]},"988":{"position":[[407,7]]},"990":{"position":[[1168,7],[1391,6]]},"1301":{"position":[[1601,6]]}},"keywords":{}}],["remain",{"_index":914,"title":{},"content":{"65":{"position":[[524,7],[1763,7]]},"123":{"position":[[244,7]]},"135":{"position":[[152,7]]},"139":{"position":[[223,7]]},"167":{"position":[[184,7]]},"173":{"position":[[1299,7],[1423,7]]},"203":{"position":[[305,7]]},"218":{"position":[[260,7]]},"233":{"position":[[262,7]]},"248":{"position":[[141,7]]},"249":{"position":[[393,7]]},"273":{"position":[[265,7]]},"279":{"position":[[502,7]]},"280":{"position":[[232,6]]},"288":{"position":[[126,7]]},"291":{"position":[[257,7]]},"292":{"position":[[178,7]]},"293":{"position":[[348,7]]},"294":{"position":[[276,7]]},"305":{"position":[[20,6]]},"314":{"position":[[1121,7]]},"346":{"position":[[723,7]]},"353":{"position":[[37,7]]},"354":{"position":[[1530,7]]},"366":{"position":[[263,6]]},"369":{"position":[[628,7]]},"375":{"position":[[103,6]]},"385":{"position":[[250,6]]},"412":{"position":[[2020,7]]},"416":{"position":[[399,6]]},"421":{"position":[[1000,6]]},"424":{"position":[[278,7]]},"429":{"position":[[442,7]]},"482":{"position":[[1118,7]]},"502":{"position":[[420,6]]},"510":{"position":[[487,7],[671,6]]},"525":{"position":[[275,7]]},"526":{"position":[[155,7]]},"530":{"position":[[613,7]]},"534":{"position":[[243,7]]},"550":{"position":[[375,6]]},"582":{"position":[[85,7]]},"594":{"position":[[241,7]]},"610":{"position":[[369,7]]},"632":{"position":[[2763,7]]},"642":{"position":[[200,7]]},"723":{"position":[[1440,7]]},"801":{"position":[[459,7]]},"839":{"position":[[1137,6]]},"860":{"position":[[387,7]]},"902":{"position":[[638,6]]},"912":{"position":[[422,7]]},"1007":{"position":[[1070,6]]},"1157":{"position":[[415,7]]}},"keywords":{}}],["rememb",{"_index":3058,"title":{},"content":{"464":{"position":[[1273,8]]},"468":{"position":[[33,8]]},"559":{"position":[[1523,9]]},"620":{"position":[[483,8]]},"626":{"position":[[467,8]]},"1052":{"position":[[83,8]]},"1316":{"position":[[1587,8]]}},"keywords":{}}],["remot",{"_index":652,"title":{"1217":{"position":[[0,6]]}},"content":{"41":{"position":[[198,6]]},"57":{"position":[[101,6]]},"173":{"position":[[1741,6]]},"201":{"position":[[422,6]]},"208":{"position":[[78,6]]},"216":{"position":[[303,6]]},"248":{"position":[[295,6]]},"322":{"position":[[256,6]]},"360":{"position":[[402,6],[506,6]]},"365":{"position":[[1302,6],[1581,6]]},"375":{"position":[[329,6]]},"407":{"position":[[90,6]]},"410":{"position":[[590,6],[1160,6]]},"411":{"position":[[2374,6],[2930,6]]},"412":{"position":[[4741,7]]},"444":{"position":[[648,6]]},"474":{"position":[[24,6]]},"481":{"position":[[75,6]]},"491":{"position":[[98,6]]},"516":{"position":[[334,6]]},"544":{"position":[[122,6]]},"562":{"position":[[1729,6]]},"565":{"position":[[224,6]]},"566":{"position":[[1154,6]]},"582":{"position":[[357,6],[392,6]]},"604":{"position":[[122,6]]},"632":{"position":[[55,6],[1736,6]]},"693":{"position":[[178,6]]},"723":{"position":[[768,6]]},"737":{"position":[[138,6]]},"749":{"position":[[23618,6]]},"775":{"position":[[272,6],[632,6],[702,6]]},"778":{"position":[[244,6]]},"793":{"position":[[465,6]]},"861":{"position":[[1983,6]]},"886":{"position":[[1489,6]]},"986":{"position":[[984,6],[1330,6],[1428,6]]},"988":{"position":[[441,6],[772,6],[2366,6],[2474,6],[3246,7],[3447,6],[3668,6],[3912,7]]},"990":{"position":[[32,6],[190,6],[260,6]]},"993":{"position":[[135,6],[256,6]]},"1002":{"position":[[113,7],[853,6]]},"1068":{"position":[[327,8]]},"1147":{"position":[[39,6]]},"1218":{"position":[[5,6],[342,8],[525,6],[609,6],[754,8]]},"1219":{"position":[[5,6],[65,6],[403,6],[843,6]]},"1220":{"position":[[5,6],[77,6],[103,6]]},"1246":{"position":[[659,7],[672,6],[706,6],[787,6],[2204,6]]},"1307":{"position":[[388,6]]},"1309":{"position":[[667,7]]},"1315":{"position":[[802,6]]}},"keywords":{}}],["remote.no",{"_index":5504,"title":{},"content":{"995":{"position":[[116,9]]}},"keywords":{}}],["remotedatabasenam",{"_index":4859,"title":{},"content":{"851":{"position":[[291,18],[362,19]]}},"keywords":{}}],["remotemessagechannel",{"_index":6245,"title":{},"content":{"1218":{"position":[[245,21]]}},"keywords":{}}],["remov",{"_index":468,"title":{"769":{"position":[[0,7]]},"929":{"position":[[0,9]]},"954":{"position":[[0,9]]},"977":{"position":[[0,9]]},"999":{"position":[[0,9]]},"1028":{"position":[[0,9]]},"1047":{"position":[[0,9]]},"1048":{"position":[[0,6]]},"1062":{"position":[[0,8]]}},"content":{"28":{"position":[[780,7]]},"46":{"position":[[313,8],[583,6]]},"302":{"position":[[604,7],[990,6]]},"303":{"position":[[1449,7]]},"305":{"position":[[189,6],[498,6]]},"346":{"position":[[508,8]]},"412":{"position":[[8617,6]]},"421":{"position":[[753,8]]},"425":{"position":[[415,8]]},"455":{"position":[[268,7]]},"475":{"position":[[244,7]]},"489":{"position":[[534,7]]},"570":{"position":[[469,7]]},"653":{"position":[[1116,6]]},"746":{"position":[[846,7]]},"749":{"position":[[8770,7],[9382,6]]},"751":{"position":[[435,7],[1831,7]]},"754":{"position":[[94,7]]},"769":{"position":[[4,6],[47,8],[585,6]]},"829":{"position":[[3898,7]]},"861":{"position":[[1802,7]]},"887":{"position":[[479,6]]},"903":{"position":[[199,8]]},"921":{"position":[[126,7]]},"929":{"position":[[1,7]]},"941":{"position":[[235,7]]},"945":{"position":[[18,6],[58,7],[423,8]]},"954":{"position":[[1,7],[74,7],[187,7]]},"955":{"position":[[1,7]]},"956":{"position":[[81,8],[170,7],[358,11]]},"958":{"position":[[477,6],[625,6]]},"976":{"position":[[195,6]]},"977":{"position":[[171,8],[329,6],[442,6]]},"979":{"position":[[50,7]]},"999":{"position":[[154,9]]},"1018":{"position":[[302,6]]},"1022":{"position":[[616,6]]},"1023":{"position":[[272,6]]},"1028":{"position":[[29,7]]},"1043":{"position":[[156,6]]},"1044":{"position":[[530,6]]},"1047":{"position":[[6,7]]},"1048":{"position":[[57,6],[424,8],[530,8]]},"1062":{"position":[[209,6]]},"1090":{"position":[[1291,6]]},"1151":{"position":[[520,6]]},"1162":{"position":[[986,7],[1035,7]]},"1178":{"position":[[519,6]]},"1198":{"position":[[1847,8]]},"1320":{"position":[[664,8]]}},"keywords":{}}],["removeddoc",{"_index":5753,"title":{},"content":{"1062":{"position":[[256,11]]}},"keywords":{}}],["removeitem",{"_index":2869,"title":{},"content":{"425":{"position":[[185,11],[435,10]]},"451":{"position":[[212,10]]}},"keywords":{}}],["removeolddocu",{"_index":1816,"title":{},"content":{"302":{"position":[[1030,21]]}},"keywords":{}}],["removerxdatabas",{"_index":5420,"title":{},"content":{"977":{"position":[[202,19],[359,18],[548,16]]}},"keywords":{}}],["removerxdatabase('mydatabasenam",{"_index":5422,"title":{},"content":{"977":{"position":[[580,34]]},"1085":{"position":[[3606,34]]}},"keywords":{}}],["renam",{"_index":1992,"title":{"868":{"position":[[41,7]]}},"content":{"351":{"position":[[111,6]]},"636":{"position":[[221,6]]},"868":{"position":[[41,7]]},"977":{"position":[[293,8]]}},"keywords":{}}],["render",{"_index":983,"title":{},"content":{"78":{"position":[[66,10]]},"217":{"position":[[213,6]]},"234":{"position":[[203,8]]},"335":{"position":[[940,7]]},"373":{"position":[[651,6]]},"384":{"position":[[172,9]]},"385":{"position":[[321,8]]},"451":{"position":[[691,10]]},"494":{"position":[[639,7]]},"524":{"position":[[879,8]]},"634":{"position":[[339,6]]},"693":{"position":[[111,8],[219,8],[483,8],[508,8]]},"703":{"position":[[1543,6]]},"707":{"position":[[282,8]]},"708":{"position":[[625,8]]},"709":{"position":[[58,8],[437,8],[1007,9],[1267,8]]},"710":{"position":[[1060,8],[1171,8],[2204,8],[2425,9]]},"711":{"position":[[293,8],[395,8],[1455,8],[1645,8]]},"801":{"position":[[504,6]]},"828":{"position":[[106,6],[293,8]]},"829":{"position":[[2071,7],[2252,6],[2702,8],[2731,8],[2900,10],[3661,7]]},"1164":{"position":[[1449,9]]},"1246":{"position":[[2137,8],[2245,8]]}},"keywords":{}}],["renderer.j",{"_index":3932,"title":{},"content":{"693":{"position":[[1004,11]]}},"keywords":{}}],["renown",{"_index":1655,"title":{},"content":{"281":{"position":[[50,8]]},"574":{"position":[[8,8]]}},"keywords":{}}],["reopen",{"_index":6138,"title":{},"content":{"1174":{"position":[[671,7]]}},"keywords":{}}],["rep",{"_index":5574,"title":{},"content":{"1007":{"position":[[1842,3],[1886,5]]}},"keywords":{}}],["rep.cancel",{"_index":5575,"title":{},"content":{"1007":{"position":[[1894,13]]}},"keywords":{}}],["repeat",{"_index":1199,"title":{},"content":{"173":{"position":[[781,8]]},"251":{"position":[[111,8]]},"299":{"position":[[562,8]]},"411":{"position":[[225,8]]},"610":{"position":[[618,8]]},"639":{"position":[[66,8]]}},"keywords":{}}],["repeatedli",{"_index":908,"title":{},"content":{"65":{"position":[[330,10]]},"321":{"position":[[273,10]]},"411":{"position":[[3896,10]]},"610":{"position":[[249,10]]},"624":{"position":[[1450,10]]}},"keywords":{}}],["repetit",{"_index":1784,"title":{},"content":{"301":{"position":[[172,10]]},"311":{"position":[[10,10]]},"345":{"position":[[33,10]]}},"keywords":{}}],["replac",{"_index":571,"title":{"815":{"position":[[6,11]]}},"content":{"36":{"position":[[157,11]]},"141":{"position":[[121,8]]},"260":{"position":[[273,7]]},"313":{"position":[[142,7]]},"314":{"position":[[1043,7]]},"412":{"position":[[1479,8]]},"614":{"position":[[1008,11]]},"639":{"position":[[117,8]]},"731":{"position":[[217,7]]},"815":{"position":[[49,11]]},"818":{"position":[[9,11]]},"838":{"position":[[1658,7]]},"934":{"position":[[715,11]]},"1154":{"position":[[148,7]]}},"keywords":{}}],["replic",{"_index":184,"title":{"82":{"position":[[0,11]]},"89":{"position":[[25,11]]},"113":{"position":[[0,11]]},"123":{"position":[[5,12]]},"158":{"position":[[5,12]]},"165":{"position":[[5,11]]},"184":{"position":[[5,12]]},"192":{"position":[[5,11]]},"210":{"position":[[15,11]]},"223":{"position":[[11,11]]},"238":{"position":[[0,11]]},"261":{"position":[[28,12]]},"279":{"position":[[22,12]]},"288":{"position":[[0,11]]},"289":{"position":[[5,11]]},"293":{"position":[[14,11]]},"328":{"position":[[5,12]]},"381":{"position":[[14,12]]},"491":{"position":[[0,11]]},"517":{"position":[[5,12]]},"570":{"position":[[34,12]]},"685":{"position":[[11,12]]},"756":{"position":[[14,12]]},"843":{"position":[[0,11]]},"853":{"position":[[0,11]]},"857":{"position":[[10,11]]},"858":{"position":[[9,12]]},"859":{"position":[[14,11]]},"862":{"position":[[31,12]]},"863":{"position":[[28,11]]},"864":{"position":[[0,11]]},"868":{"position":[[16,11],[52,11]]},"869":{"position":[[8,11]]},"874":{"position":[[5,11]]},"877":{"position":[[12,11]]},"883":{"position":[[0,11]]},"891":{"position":[[10,11]]},"895":{"position":[[9,11]]},"900":{"position":[[11,11]]},"903":{"position":[[26,11]]},"904":{"position":[[27,11]]},"905":{"position":[[5,13]]},"908":{"position":[[29,12]]},"912":{"position":[[8,10]]},"1004":{"position":[[11,12]]},"1005":{"position":[[10,12]]},"1007":{"position":[[31,13]]},"1022":{"position":[[39,12]]},"1094":{"position":[[0,9]]},"1101":{"position":[[0,11]]},"1121":{"position":[[8,12]]},"1149":{"position":[[16,12]]},"1165":{"position":[[0,11]]},"1231":{"position":[[0,11]]},"1308":{"position":[[0,11]]},"1316":{"position":[[9,12]]}},"content":{"13":{"position":[[24,12]]},"14":{"position":[[541,10],[1090,9],[1178,9],[1225,11]]},"15":{"position":[[195,12],[390,9]]},"16":{"position":[[137,11],[487,11]]},"18":{"position":[[389,12]]},"19":{"position":[[132,9],[519,12]]},"22":{"position":[[342,11]]},"23":{"position":[[105,11],[159,12],[197,11],[379,11]]},"24":{"position":[[282,9]]},"25":{"position":[[230,11]]},"26":{"position":[[229,9]]},"29":{"position":[[83,11],[137,9]]},"35":{"position":[[451,11]]},"36":{"position":[[322,11]]},"40":{"position":[[36,10],[649,11]]},"42":{"position":[[146,11]]},"46":{"position":[[423,11]]},"57":{"position":[[60,12],[137,12]]},"82":{"position":[[8,11]]},"89":{"position":[[32,11],[152,11]]},"109":{"position":[[82,11]]},"113":{"position":[[21,11]]},"120":{"position":[[295,12]]},"123":{"position":[[41,11]]},"132":{"position":[[6,11],[193,9]]},"135":{"position":[[106,10]]},"147":{"position":[[226,11]]},"158":{"position":[[37,11],[90,11]]},"164":{"position":[[293,11]]},"165":{"position":[[26,11],[154,11],[306,11]]},"170":{"position":[[231,11]]},"173":{"position":[[314,11],[405,11],[528,11]]},"174":{"position":[[2942,11]]},"184":{"position":[[6,11],[98,11],[207,11]]},"186":{"position":[[324,11]]},"192":{"position":[[15,11],[197,12],[218,12],[298,11]]},"208":{"position":[[94,11]]},"209":{"position":[[610,11]]},"211":{"position":[[554,11]]},"212":{"position":[[601,11]]},"223":{"position":[[1,11],[190,11],[239,11],[415,12]]},"238":{"position":[[17,11]]},"248":{"position":[[233,11]]},"249":{"position":[[423,11]]},"255":{"position":[[6,11],[961,11],[1718,12]]},"260":{"position":[[7,11],[132,11]]},"261":{"position":[[84,11],[1021,11]]},"262":{"position":[[589,11]]},"263":{"position":[[596,11]]},"266":{"position":[[928,10]]},"279":{"position":[[126,11],[411,11]]},"288":{"position":[[16,11],[223,11]]},"289":{"position":[[24,11],[301,12],[328,11],[456,12],[501,11],[714,12],[991,12],[1084,11],[1120,12],[1426,11],[1556,12],[1588,11],[1683,11],[1900,12]]},"293":{"position":[[163,11],[297,11]]},"312":{"position":[[66,11]]},"316":{"position":[[555,12]]},"323":{"position":[[321,12]]},"328":{"position":[[30,11],[79,12]]},"360":{"position":[[455,11]]},"362":{"position":[[853,12]]},"381":{"position":[[50,12],[154,12],[291,9],[397,11]]},"386":{"position":[[154,11]]},"410":{"position":[[779,10]]},"411":{"position":[[1307,11]]},"412":{"position":[[1779,11],[1879,11],[3696,10],[12490,9],[12569,11],[13698,11],[14504,11],[14841,11]]},"438":{"position":[[253,10]]},"439":{"position":[[463,9]]},"476":{"position":[[177,11]]},"477":{"position":[[148,9]]},"478":{"position":[[163,9]]},"479":{"position":[[201,11]]},"480":{"position":[[1005,9]]},"481":{"position":[[272,11]]},"483":{"position":[[252,11]]},"487":{"position":[[343,11]]},"490":{"position":[[113,11]]},"491":{"position":[[138,11],[1256,11]]},"495":{"position":[[667,11]]},"504":{"position":[[691,11],[718,11],[765,11],[878,12],[953,11],[1074,12],[1287,12],[1318,12]]},"510":{"position":[[290,11]]},"513":{"position":[[339,12]]},"517":{"position":[[6,11],[151,11]]},"525":{"position":[[415,11],[575,12],[596,12]]},"534":{"position":[[445,11]]},"544":{"position":[[81,12]]},"556":{"position":[[1737,11]]},"565":{"position":[[76,11]]},"566":{"position":[[1139,11]]},"570":{"position":[[86,12],[678,11],[928,11]]},"571":{"position":[[477,10]]},"575":{"position":[[429,12]]},"576":{"position":[[264,12]]},"582":{"position":[[290,11]]},"594":{"position":[[443,11]]},"604":{"position":[[81,12]]},"617":{"position":[[2283,11]]},"626":{"position":[[984,11]]},"628":{"position":[[124,9]]},"630":{"position":[[814,11]]},"631":{"position":[[84,11]]},"632":{"position":[[8,11],[403,11],[584,11],[637,11],[841,11],[2044,11],[2094,12],[2611,9],[2687,11]]},"634":{"position":[[469,12]]},"639":{"position":[[208,12]]},"644":{"position":[[79,11]]},"653":{"position":[[1035,12],[1064,11],[1181,11]]},"659":{"position":[[878,11]]},"661":{"position":[[1589,11]]},"683":{"position":[[417,11]]},"685":{"position":[[98,11],[138,11],[165,11],[196,12],[237,10]]},"686":{"position":[[421,9]]},"690":{"position":[[445,12]]},"697":{"position":[[394,9]]},"698":{"position":[[124,9],[1667,9],[1734,11],[3031,10]]},"699":{"position":[[8,9]]},"700":{"position":[[256,10],[488,10],[599,11],[654,11],[969,10],[1099,11]]},"701":{"position":[[186,10],[398,9],[903,10],[1016,9],[1130,11],[1187,12]]},"705":{"position":[[638,11],[760,10],[873,10],[1084,11],[1138,11],[1250,11]]},"711":{"position":[[2037,11],[2277,12]]},"714":{"position":[[1037,9]]},"740":{"position":[[283,9]]},"743":{"position":[[275,10]]},"746":{"position":[[627,11]]},"749":{"position":[[448,11],[14572,12],[14842,11],[14998,11],[15039,11],[16414,11],[16680,11],[22361,12],[22468,12]]},"756":{"position":[[90,11],[233,11],[358,11]]},"757":{"position":[[74,11]]},"775":{"position":[[239,11],[294,11],[365,10]]},"781":{"position":[[609,11]]},"784":{"position":[[436,9],[497,11],[553,11]]},"793":{"position":[[610,11],[642,11],[663,11],[683,11],[705,11],[725,11],[748,11],[770,11],[790,11],[811,11],[828,11],[849,11]]},"829":{"position":[[267,12],[851,12]]},"836":{"position":[[1796,12],[2435,12]]},"837":{"position":[[161,11],[418,9],[883,9],[1629,11],[1655,13]]},"838":{"position":[[651,12],[759,11]]},"840":{"position":[[90,10],[542,9]]},"841":{"position":[[703,11]]},"844":{"position":[[133,11]]},"845":{"position":[[22,11],[66,11],[115,11]]},"846":{"position":[[11,11],[197,13],[338,12],[374,12],[1570,11]]},"847":{"position":[[30,12],[111,11]]},"848":{"position":[[714,13],[980,11],[1349,13]]},"852":{"position":[[232,13]]},"854":{"position":[[486,12],[509,11],[847,11],[939,11],[1041,11],[1678,12]]},"855":{"position":[[81,9],[158,11]]},"856":{"position":[[135,9]]},"858":{"position":[[19,9]]},"860":{"position":[[497,11],[630,12]]},"861":{"position":[[1724,10],[2155,9]]},"862":{"position":[[104,12],[1096,12],[1190,13],[1482,11],[1570,11]]},"863":{"position":[[200,11]]},"865":{"position":[[9,11]]},"866":{"position":[[65,12],[91,12],[204,11],[220,11],[263,9],[314,11],[508,11],[595,11]]},"867":{"position":[[81,9],[153,11]]},"868":{"position":[[16,11],[52,11]]},"870":{"position":[[9,11]]},"871":{"position":[[263,11],[552,11]]},"872":{"position":[[2163,11],[2195,11],[2675,11],[2961,10],[3698,9],[3720,11],[4336,11]]},"875":{"position":[[13,11],[80,11],[111,11],[174,11],[259,11],[508,13],[1387,11],[2960,11],[6059,11],[6580,11],[6664,11],[6731,11],[8715,11],[8832,11],[9387,11]]},"876":{"position":[[61,11]]},"878":{"position":[[5,11],[96,11],[366,13]]},"879":{"position":[[92,11]]},"881":{"position":[[168,11],[262,11]]},"882":{"position":[[357,12]]},"884":{"position":[[28,12],[79,11]]},"885":{"position":[[263,12]]},"886":{"position":[[6,12],[33,12],[119,11],[902,12],[1657,11],[2063,12],[2090,12],[2603,12],[3253,12],[3790,12]]},"890":{"position":[[272,11],[1017,11]]},"893":{"position":[[5,11],[77,10],[185,11],[277,11],[452,11]]},"896":{"position":[[116,11]]},"897":{"position":[[323,11],[429,9]]},"898":{"position":[[3127,12],[3204,12],[3308,11],[4488,11]]},"899":{"position":[[1,11]]},"902":{"position":[[713,9]]},"903":{"position":[[143,11],[486,11],[609,11]]},"904":{"position":[[107,10],[324,12],[1285,11],[1420,12],[1446,11],[1843,11],[1977,9],[2237,12],[3151,11],[3183,11],[3294,11],[3548,12],[3595,12]]},"905":{"position":[[12,11],[222,11]]},"906":{"position":[[9,11],[50,11]]},"907":{"position":[[16,11],[33,9],[133,11]]},"908":{"position":[[302,10]]},"912":{"position":[[9,10],[166,11],[603,10]]},"955":{"position":[[116,13]]},"976":{"position":[[92,13]]},"981":{"position":[[45,11],[1623,11]]},"982":{"position":[[30,11]]},"983":{"position":[[175,12],[1091,11]]},"984":{"position":[[18,12],[626,11]]},"985":{"position":[[382,11]]},"986":{"position":[[12,11],[497,10],[1113,11],[1530,11]]},"987":{"position":[[157,12]]},"988":{"position":[[19,11],[320,11],[388,11],[424,9],[565,11],[659,12],[702,11],[1187,11],[1385,12],[1506,11],[2335,9],[3437,9],[3651,9],[4023,10],[4069,11],[4919,12],[5984,11]]},"989":{"position":[[29,11],[211,11],[461,12]]},"990":{"position":[[675,11],[758,12]]},"991":{"position":[[87,12]]},"992":{"position":[[110,12]]},"993":{"position":[[16,12],[499,11],[634,11]]},"994":{"position":[[58,11],[95,11],[215,11],[246,11]]},"995":{"position":[[96,10],[126,11],[275,12],[357,11],[920,12],[1014,11],[1480,11]]},"996":{"position":[[35,11]]},"997":{"position":[[13,12]]},"998":{"position":[[18,12],[35,11]]},"999":{"position":[[13,11],[57,11],[108,11],[185,11],[267,12]]},"1000":{"position":[[21,11],[71,11],[100,11]]},"1001":{"position":[[21,11]]},"1002":{"position":[[22,11],[182,11],[434,11],[623,11],[1087,11],[1277,11]]},"1003":{"position":[[9,11],[218,11],[324,11]]},"1004":{"position":[[12,11],[85,11],[134,11]]},"1005":{"position":[[10,11],[62,12]]},"1007":{"position":[[221,11],[285,11],[434,11],[726,11],[849,12],[912,11],[2024,11]]},"1008":{"position":[[32,11],[80,11]]},"1009":{"position":[[192,11],[337,11],[498,11],[576,11],[793,11],[1004,11]]},"1010":{"position":[[29,12],[93,11]]},"1022":{"position":[[23,9],[147,9]]},"1048":{"position":[[134,11]]},"1090":{"position":[[321,11]]},"1092":{"position":[[226,11],[292,9]]},"1093":{"position":[[202,11],[466,11]]},"1094":{"position":[[216,11],[377,11]]},"1100":{"position":[[234,11]]},"1101":{"position":[[5,11],[63,9],[138,11],[373,11],[581,11],[739,13]]},"1105":{"position":[[108,9]]},"1107":{"position":[[348,11]]},"1121":{"position":[[97,11],[198,11],[228,11],[670,11]]},"1123":{"position":[[61,10],[634,12]]},"1124":{"position":[[1473,9],[1602,11],[1861,9],[1963,11],[2120,11],[2211,11]]},"1146":{"position":[[70,11]]},"1147":{"position":[[284,12],[535,12]]},"1149":{"position":[[104,11],[138,11],[158,9],[197,11],[355,11],[402,11],[514,11],[589,11],[1359,13]]},"1162":{"position":[[529,11],[770,11],[817,9]]},"1164":{"position":[[223,10],[1213,11],[1414,11]]},"1165":{"position":[[51,11],[98,9],[215,11],[554,11]]},"1198":{"position":[[284,11],[1554,11],[1681,9],[1945,11]]},"1199":{"position":[[38,11]]},"1212":{"position":[[66,11]]},"1213":{"position":[[468,11]]},"1219":{"position":[[214,9]]},"1231":{"position":[[69,11],[220,11],[303,11],[368,11],[987,12]]},"1259":{"position":[[25,11]]},"1284":{"position":[[170,11],[223,11]]},"1301":{"position":[[367,12],[419,10]]},"1304":{"position":[[1800,9],[1911,11],[1948,9]]},"1306":{"position":[[70,11]]},"1307":{"position":[[370,10],[402,12]]},"1308":{"position":[[3,11],[119,10],[163,9],[190,11],[210,11],[663,11]]},"1313":{"position":[[860,12]]},"1314":{"position":[[607,11]]},"1316":{"position":[[39,10],[126,11],[217,11],[321,11],[1149,10],[1351,11],[1516,12],[1564,10],[2378,10],[2492,11],[2525,9],[2597,9],[2824,10],[3105,11],[3259,11],[3318,9],[3403,9],[3702,11],[3852,11]]},"1320":{"position":[[249,9],[517,11],[958,12]]},"1323":{"position":[[176,11]]},"1324":{"position":[[76,12],[320,11],[409,11],[588,11],[620,9],[709,12]]}},"keywords":{}}],["replica",{"_index":4936,"title":{},"content":{"870":{"position":[[244,7]]},"871":{"position":[[851,7]]},"872":{"position":[[362,7]]}},"keywords":{}}],["replicach",{"_index":585,"title":{"38":{"position":[[0,11]]}},"content":{"38":{"position":[[1,10],[188,10],[515,11],[617,10],[736,10],[787,10],[837,10],[921,10],[1045,10],[1131,10]]}},"keywords":{}}],["replicateappwrit",{"_index":4902,"title":{},"content":{"862":{"position":[[227,17],[1134,19],[1643,19]]}},"keywords":{}}],["replicatecouchdb",{"_index":4326,"title":{},"content":{"749":{"position":[[14654,18],[16114,18],[16262,18]]},"846":{"position":[[27,19],[57,16],[142,17],[1327,18]]},"848":{"position":[[659,17],[1175,17],[1294,17]]},"852":{"position":[[177,17]]},"1149":{"position":[[672,16],[1305,18]]}},"keywords":{}}],["replicatefirestor",{"_index":4872,"title":{},"content":{"854":{"position":[[532,20],[600,20]]},"858":{"position":[[182,19]]}},"keywords":{}}],["replicategraphql",{"_index":5121,"title":{},"content":{"886":{"position":[[925,16],[1010,17],[2642,17],[3829,17]]},"887":{"position":[[295,17]]},"888":{"position":[[436,17]]},"889":{"position":[[485,17]]},"890":{"position":[[757,16],[785,17]]}},"keywords":{}}],["replicatemongodb",{"_index":4957,"title":{},"content":{"872":{"position":[[2289,16],[2374,18],[2746,18]]}},"keywords":{}}],["replicatenat",{"_index":4926,"title":{},"content":{"866":{"position":[[115,15],[353,13],[432,15]]}},"keywords":{}}],["replicaterxcollect",{"_index":1342,"title":{"988":{"position":[[0,24]]}},"content":{"209":{"position":[[142,21],[622,23]]},"255":{"position":[[489,21],[973,23]]},"481":{"position":[[585,21],[642,23]]},"632":{"position":[[2117,21],[2210,23]]},"875":{"position":[[214,21],[336,21],[424,23],[3100,23],[6144,23],[8409,23],[9718,23]]},"988":{"position":[[67,23],[124,21],[248,23]]},"992":{"position":[[14,23]]},"1002":{"position":[[539,23],[1193,23]]},"1003":{"position":[[385,23]]},"1007":{"position":[[1377,23]]},"1090":{"position":[[520,21]]},"1165":{"position":[[843,23]]}},"keywords":{}}],["replicateserv",{"_index":4971,"title":{},"content":{"872":{"position":[[3889,15],[4460,17]]},"878":{"position":[[160,18],[189,15],[285,17]]},"882":{"position":[[402,17]]},"1101":{"position":[[658,17]]}},"keywords":{}}],["replicatesupabas",{"_index":5217,"title":{},"content":{"898":{"position":[[3240,17],[3322,19],[4561,19]]}},"keywords":{}}],["replicatewebrtc",{"_index":1362,"title":{},"content":{"210":{"position":[[155,16],[270,17]]},"261":{"position":[[223,16],[343,17]]},"904":{"position":[[1314,16],[1475,15],[1811,16]]},"907":{"position":[[287,16]]},"911":{"position":[[632,16]]},"1121":{"position":[[338,16],[602,16]]}},"keywords":{}}],["replicatewithwebsocketserv",{"_index":5179,"title":{},"content":{"893":{"position":[[98,28],[228,30]]}},"keywords":{}}],["replication"",{"_index":213,"title":{},"content":{"14":{"position":[[403,18]]}},"keywords":{}}],["replication.awaitinitialrepl",{"_index":5226,"title":{},"content":{"898":{"position":[[4158,38]]}},"keywords":{}}],["replication.error$.subscribe(err",{"_index":5224,"title":{},"content":{"898":{"position":[[4075,32]]}},"keywords":{}}],["replication.work",{"_index":4817,"title":{},"content":{"844":{"position":[[16,17]]}},"keywords":{}}],["replicationconflictmessag",{"_index":5163,"title":{},"content":{"889":{"position":[[193,28]]}},"keywords":{}}],["replicationdata",{"_index":3326,"title":{},"content":{"544":{"position":[[168,15]]}},"keywords":{}}],["replicationid",{"_index":5568,"title":{},"content":{"1007":{"position":[[1309,13],[1447,14]]}},"keywords":{}}],["replicationidentifi",{"_index":1347,"title":{},"content":{"209":{"position":[[668,22]]},"255":{"position":[[1019,22]]},"481":{"position":[[688,22]]},"632":{"position":[[2256,22]]},"846":{"position":[[162,22]]},"848":{"position":[[679,22],[1314,22]]},"852":{"position":[[197,22]]},"854":{"position":[[621,22]]},"862":{"position":[[1154,22]]},"866":{"position":[[476,22]]},"872":{"position":[[2532,22],[4478,22]]},"875":{"position":[[476,22]]},"878":{"position":[[332,22]]},"898":{"position":[[3404,22]]},"988":{"position":[[507,22],[533,22]]},"1002":{"position":[[589,22],[1243,22]]},"1007":{"position":[[1424,22]]},"1101":{"position":[[705,22]]},"1149":{"position":[[1324,22]]}},"keywords":{}}],["replicationofflin",{"_index":5230,"title":{},"content":{"899":{"position":[[74,18]]}},"keywords":{}}],["replicationpool",{"_index":1584,"title":{},"content":{"261":{"position":[[319,15],[856,15]]},"904":{"position":[[1787,15],[3205,15],[3265,15]]},"907":{"position":[[263,15]]},"911":{"position":[[608,15]]},"1121":{"position":[[578,15]]}},"keywords":{}}],["replicationpool.cancel",{"_index":5263,"title":{},"content":{"904":{"position":[[3608,25]]}},"keywords":{}}],["replicationpool.error$.subscribe(err",{"_index":1587,"title":{},"content":{"261":{"position":[[900,36]]},"904":{"position":[[3456,36]]}},"keywords":{}}],["replicationst",{"_index":4822,"title":{},"content":{"846":{"position":[[123,16]]},"848":{"position":[[640,16],[1275,16]]},"852":{"position":[[158,16]]},"854":{"position":[[581,16],[1730,16]]},"858":{"position":[[163,16]]},"862":{"position":[[1115,16]]},"866":{"position":[[413,16]]},"872":{"position":[[2355,16],[4441,16]]},"875":{"position":[[399,16],[3075,16],[6119,16],[8384,16],[9693,16]]},"878":{"position":[[260,16]]},"882":{"position":[[377,16]]},"886":{"position":[[991,16],[2623,16],[3810,16]]},"887":{"position":[[232,17]]},"888":{"position":[[373,17]]},"889":{"position":[[422,17]]},"893":{"position":[[203,16]]},"988":{"position":[[223,16]]},"1002":{"position":[[520,16],[1174,16]]},"1003":{"position":[[366,16]]},"1007":{"position":[[1203,16],[1358,16],[1775,17]]},"1101":{"position":[[633,16]]},"1149":{"position":[[1286,16]]},"1231":{"position":[[1146,16]]}},"keywords":{}}],["replicationstate.cancel",{"_index":5181,"title":{},"content":{"893":{"position":[[470,26]]}},"keywords":{}}],["replicationstate.error$.subscribe((error",{"_index":5490,"title":{},"content":{"990":{"position":[[1177,41]]}},"keywords":{}}],["replicationstate.fetch",{"_index":4824,"title":{},"content":{"846":{"position":[[551,23]]},"848":{"position":[[1005,22]]}},"keywords":{}}],["replicationstate.forbidden$.subscrib",{"_index":5073,"title":{},"content":{"881":{"position":[[340,40]]}},"keywords":{}}],["replicationstate.head",{"_index":4351,"title":{},"content":{"749":{"position":[[16538,24]]}},"keywords":{}}],["replicationstate.ispaus",{"_index":5534,"title":{},"content":{"1001":{"position":[[45,28]]}},"keywords":{}}],["replicationstate.isstop",{"_index":5531,"title":{},"content":{"1000":{"position":[[127,29]]}},"keywords":{}}],["replicationstate.outdatedclient$.subscrib",{"_index":5069,"title":{},"content":{"879":{"position":[[612,45]]}},"keywords":{}}],["replicationstate.setcredentials('includ",{"_index":5173,"title":{},"content":{"890":{"position":[[685,43]]}},"keywords":{}}],["replicationstate.sethead",{"_index":5071,"title":{},"content":{"880":{"position":[[379,29]]},"890":{"position":[[311,29]]}},"keywords":{}}],["replicationstate.start",{"_index":5457,"title":{},"content":{"988":{"position":[[1567,24]]}},"keywords":{}}],["replicationstate.unauthorized$.subscrib",{"_index":5070,"title":{},"content":{"880":{"position":[[327,43]]}},"keywords":{}}],["replset",{"_index":4942,"title":{},"content":{"872":{"position":[[554,7]]}},"keywords":{}}],["repo",{"_index":596,"title":{},"content":{"38":{"position":[[855,4]]},"61":{"position":[[266,5]]},"198":{"position":[[555,4]]},"392":{"position":[[781,5]]},"405":{"position":[[165,4]]},"471":{"position":[[150,4]]},"620":{"position":[[311,4]]},"628":{"position":[[252,4]]},"670":{"position":[[133,4]]},"1112":{"position":[[50,4]]},"1266":{"position":[[362,4]]}},"keywords":{}}],["repo.if",{"_index":4721,"title":{},"content":{"824":{"position":[[420,7]]}},"keywords":{}}],["repolearn",{"_index":3102,"title":{},"content":{"471":{"position":[[74,9]]}},"keywords":{}}],["report",{"_index":71,"title":{},"content":{"4":{"position":[[191,8]]},"404":{"position":[[350,8]]},"412":{"position":[[14174,9]]},"670":{"position":[[6,9],[335,6]]}},"keywords":{}}],["reposhow",{"_index":3213,"title":{},"content":{"498":{"position":[[384,8]]}},"keywords":{}}],["repositori",{"_index":853,"title":{},"content":{"56":{"position":[[91,11]]},"61":{"position":[[80,10]]},"84":{"position":[[127,11],[165,10]]},"114":{"position":[[140,11],[178,10]]},"149":{"position":[[140,11],[178,10]]},"175":{"position":[[133,11],[171,10]]},"241":{"position":[[244,11],[269,10]]},"263":{"position":[[652,10]]},"347":{"position":[[140,11],[178,10]]},"362":{"position":[[1211,11],[1249,10]]},"373":{"position":[[244,11],[269,10]]},"458":{"position":[[958,10]]},"462":{"position":[[509,11]]},"498":{"position":[[443,11]]},"511":{"position":[[140,11],[178,10]]},"531":{"position":[[140,11],[178,10]]},"543":{"position":[[98,11],[115,10]]},"548":{"position":[[100,10]]},"557":{"position":[[231,10]]},"567":{"position":[[450,10]]},"591":{"position":[[140,11],[178,10]]},"603":{"position":[[96,11],[113,10]]},"608":{"position":[[100,10]]},"666":{"position":[[136,10]]},"824":{"position":[[165,10]]},"904":{"position":[[217,10]]},"1112":{"position":[[133,10]]}},"keywords":{}}],["repositoryread",{"_index":4974,"title":{},"content":{"873":{"position":[[42,14]]}},"keywords":{}}],["repres",{"_index":1646,"title":{},"content":{"279":{"position":[[182,12]]},"396":{"position":[[701,9]]},"611":{"position":[[361,9]]},"682":{"position":[[90,9]]},"687":{"position":[[57,9]]},"690":{"position":[[344,11]]},"707":{"position":[[299,10]]},"778":{"position":[[545,10]]},"826":{"position":[[392,10],[550,10],[637,10],[752,10],[850,10],[971,10],[1069,10]]},"862":{"position":[[1337,10]]},"922":{"position":[[29,11]]},"1007":{"position":[[81,10]]},"1065":{"position":[[490,11]]},"1213":{"position":[[77,9]]}},"keywords":{}}],["represent",{"_index":2104,"title":{},"content":{"364":{"position":[[109,15]]},"372":{"position":[[357,15]]},"390":{"position":[[190,15]]},"1079":{"position":[[371,14]]}},"keywords":{}}],["representations.recommend",{"_index":2201,"title":{},"content":{"390":{"position":[[1387,32]]}},"keywords":{}}],["reproduc",{"_index":2892,"title":{},"content":{"427":{"position":[[1259,9]]},"667":{"position":[[78,9],[142,9]]},"670":{"position":[[86,10]]},"1120":{"position":[[358,9]]}},"keywords":{}}],["req",{"_index":3597,"title":{},"content":{"612":{"position":[[1860,5]]},"799":{"position":[[537,5],[769,5]]},"875":{"position":[[2087,5],[4455,5],[7244,5]]}},"keywords":{}}],["req.bodi",{"_index":5020,"title":{},"content":{"875":{"position":[[4493,9]]}},"keywords":{}}],["req.on('clos",{"_index":3611,"title":{},"content":{"612":{"position":[[2407,15]]},"875":{"position":[[7496,15]]}},"keywords":{}}],["req.query.id",{"_index":4991,"title":{},"content":{"875":{"position":[[2117,13]]}},"keywords":{}}],["request",{"_index":711,"title":{"617":{"position":[[2,8]]},"1032":{"position":[[27,8]]}},"content":{"46":{"position":[[351,8]]},"65":{"position":[[1129,9]]},"87":{"position":[[143,8]]},"173":{"position":[[798,9]]},"216":{"position":[[143,8]]},"226":{"position":[[100,8],[175,8]]},"300":{"position":[[520,7],[681,9],[698,7]]},"302":{"position":[[202,7]]},"305":{"position":[[408,7]]},"392":{"position":[[3414,8]]},"408":{"position":[[2605,8],[3168,7]]},"411":{"position":[[234,8],[355,8]]},"450":{"position":[[389,7]]},"459":{"position":[[787,7]]},"461":{"position":[[122,8],[348,8],[379,7]]},"467":{"position":[[39,8]]},"474":{"position":[[49,7]]},"477":{"position":[[52,7]]},"487":{"position":[[60,7],[292,7]]},"570":{"position":[[652,9]]},"582":{"position":[[675,9]]},"610":{"position":[[194,9],[260,8],[593,8],[1119,7]]},"611":{"position":[[215,7]]},"612":{"position":[[421,7]]},"616":{"position":[[354,7],[476,7],[640,8],[1205,8]]},"619":{"position":[[370,8]]},"623":{"position":[[366,7]]},"624":{"position":[[259,9]]},"626":{"position":[[728,8]]},"627":{"position":[[169,8]]},"630":{"position":[[58,8],[804,9]]},"634":{"position":[[692,8]]},"650":{"position":[[114,8]]},"668":{"position":[[20,8]]},"679":{"position":[[121,7]]},"696":{"position":[[530,9]]},"749":{"position":[[21185,8]]},"778":{"position":[[110,7]]},"782":{"position":[[70,8]]},"784":{"position":[[48,8]]},"799":{"position":[[488,7]]},"846":{"position":[[699,7]]},"848":{"position":[[83,8]]},"849":{"position":[[72,8],[191,8]]},"851":{"position":[[198,7]]},"863":{"position":[[381,7]]},"875":{"position":[[756,8],[2993,7]]},"880":{"position":[[100,8],[293,8]]},"882":{"position":[[190,7]]},"886":{"position":[[1513,8],[1808,8],[2933,8]]},"890":{"position":[[636,8]]},"986":{"position":[[1610,9]]},"988":{"position":[[915,7]]},"1010":{"position":[[131,8]]},"1032":{"position":[[19,8]]},"1089":{"position":[[160,9]]},"1090":{"position":[[27,8],[219,8]]},"1092":{"position":[[344,8]]},"1094":{"position":[[389,8]]},"1095":{"position":[[355,8]]},"1102":{"position":[[438,7],[463,7]]},"1103":{"position":[[167,9]]},"1104":{"position":[[74,9]]},"1123":{"position":[[317,8]]},"1124":{"position":[[707,7]]},"1134":{"position":[[638,9]]},"1135":{"position":[[352,7]]},"1161":{"position":[[162,8]]},"1170":{"position":[[156,8]]},"1180":{"position":[[162,8]]},"1301":{"position":[[816,7]]},"1313":{"position":[[445,9]]}},"keywords":{}}],["request.json",{"_index":5938,"title":{},"content":{"1102":{"position":[[702,15]]}},"keywords":{}}],["request.onerror",{"_index":3004,"title":{},"content":{"459":{"position":[[933,15]]}},"keywords":{}}],["request.onsuccess",{"_index":3002,"title":{},"content":{"459":{"position":[[873,17]]}},"keywords":{}}],["requestcheckpoint",{"_index":5156,"title":{},"content":{"888":{"position":[[773,17],[821,17],[1107,17]]}},"keywords":{}}],["requestidlecallback",{"_index":3772,"title":{},"content":{"656":{"position":[[405,21]]},"975":{"position":[[86,19]]}},"keywords":{}}],["requestidlepromis",{"_index":5412,"title":{"975":{"position":[[0,21]]}},"content":{"1164":{"position":[[84,18],[1267,20],[1529,21]]}},"keywords":{}}],["requests.long",{"_index":3663,"title":{},"content":{"621":{"position":[[347,13]]}},"keywords":{}}],["requestsskip",{"_index":5062,"title":{},"content":{"876":{"position":[[289,12]]}},"keywords":{}}],["requir",{"_index":334,"title":{"553":{"position":[[20,8]]},"666":{"position":[[0,13]]},"910":{"position":[[11,8]]},"1260":{"position":[[16,9]]}},"content":{"19":{"position":[[599,9]]},"33":{"position":[[371,8]]},"35":{"position":[[626,9]]},"40":{"position":[[707,7]]},"51":{"position":[[498,9]]},"63":{"position":[[232,13]]},"65":{"position":[[1236,7]]},"66":{"position":[[571,13]]},"70":{"position":[[214,8]]},"79":{"position":[[110,9]]},"80":{"position":[[18,9]]},"81":{"position":[[89,12]]},"99":{"position":[[189,8]]},"111":{"position":[[115,12]]},"131":{"position":[[973,12]]},"132":{"position":[[74,12]]},"134":{"position":[[248,13]]},"146":{"position":[[246,12]]},"151":{"position":[[168,8]]},"170":{"position":[[344,13],[532,13]]},"174":{"position":[[550,12]]},"188":{"position":[[1425,9]]},"189":{"position":[[716,12]]},"197":{"position":[[21,12]]},"206":{"position":[[54,8]]},"210":{"position":[[717,9]]},"220":{"position":[[275,7]]},"221":{"position":[[29,7]]},"222":{"position":[[237,12]]},"226":{"position":[[157,8],[243,7]]},"236":{"position":[[86,12]]},"249":{"position":[[32,7]]},"253":{"position":[[53,8]]},"261":{"position":[[637,8]]},"266":{"position":[[504,8]]},"271":{"position":[[203,12]]},"276":{"position":[[361,13]]},"287":{"position":[[268,13],[848,7]]},"294":{"position":[[185,12]]},"299":{"position":[[554,7]]},"309":{"position":[[356,9]]},"314":{"position":[[881,9]]},"315":{"position":[[823,9]]},"331":{"position":[[120,7]]},"357":{"position":[[284,7]]},"358":{"position":[[392,8]]},"361":{"position":[[95,9]]},"365":{"position":[[571,9],[1159,9],[1434,9]]},"366":{"position":[[184,12]]},"367":{"position":[[1036,9]]},"375":{"position":[[642,7]]},"379":{"position":[[195,9]]},"382":{"position":[[177,8]]},"383":{"position":[[266,7]]},"388":{"position":[[217,13]]},"392":{"position":[[698,9],[1695,9],[1913,8]]},"401":{"position":[[773,9]]},"409":{"position":[[202,7]]},"411":{"position":[[435,7]]},"412":{"position":[[2445,7],[3557,7],[6695,8],[10410,8],[11793,8],[14094,12],[14565,7]]},"415":{"position":[[351,9]]},"427":{"position":[[689,8]]},"429":{"position":[[419,9]]},"430":{"position":[[889,7]]},"432":{"position":[[167,13]]},"444":{"position":[[168,12]]},"445":{"position":[[934,7]]},"446":{"position":[[470,7]]},"454":{"position":[[851,8]]},"455":{"position":[[506,8]]},"462":{"position":[[746,8]]},"463":{"position":[[42,7],[329,8]]},"464":{"position":[[1254,7]]},"478":{"position":[[14,7]]},"482":{"position":[[953,9]]},"487":{"position":[[435,9]]},"497":{"position":[[338,9]]},"504":{"position":[[413,13]]},"508":{"position":[[70,13]]},"515":{"position":[[104,7]]},"517":{"position":[[63,7]]},"521":{"position":[[661,8]]},"524":{"position":[[164,13]]},"525":{"position":[[731,13]]},"534":{"position":[[692,13]]},"538":{"position":[[799,9]]},"546":{"position":[[33,13]]},"554":{"position":[[1494,9]]},"559":{"position":[[1256,8]]},"562":{"position":[[446,9]]},"564":{"position":[[882,9]]},"567":{"position":[[728,13]]},"574":{"position":[[174,8]]},"581":{"position":[[681,12]]},"594":{"position":[[690,13]]},"598":{"position":[[806,9]]},"602":{"position":[[127,10]]},"606":{"position":[[33,13]]},"611":{"position":[[542,7],[1417,9]]},"613":{"position":[[398,9]]},"616":{"position":[[321,7]]},"617":{"position":[[1064,8]]},"622":{"position":[[719,9]]},"623":{"position":[[235,7]]},"624":{"position":[[504,9]]},"632":{"position":[[946,7]]},"638":{"position":[[738,9]]},"659":{"position":[[818,9]]},"662":{"position":[[2535,9]]},"680":{"position":[[1042,9]]},"681":{"position":[[131,8]]},"685":{"position":[[387,8]]},"687":{"position":[[159,8]]},"689":{"position":[[130,7]]},"701":{"position":[[1092,8]]},"715":{"position":[[88,8]]},"717":{"position":[[1551,9]]},"723":{"position":[[1289,9]]},"749":{"position":[[15306,8],[16404,9],[19134,8],[19820,8],[20776,8],[23013,8]]},"751":{"position":[[1180,8]]},"759":{"position":[[562,8]]},"760":{"position":[[558,8]]},"772":{"position":[[1248,7]]},"774":{"position":[[66,7]]},"778":{"position":[[184,7]]},"782":{"position":[[441,8]]},"806":{"position":[[533,8]]},"829":{"position":[[2948,9],[2998,7]]},"835":{"position":[[923,9]]},"836":{"position":[[1503,8],[1915,8],[2079,8],[2375,13]]},"837":{"position":[[406,8]]},"838":{"position":[[2749,9]]},"846":{"position":[[270,10]]},"854":{"position":[[815,10],[1304,8]]},"855":{"position":[[6,8]]},"861":{"position":[[2064,10]]},"862":{"position":[[779,9]]},"867":{"position":[[6,8]]},"871":{"position":[[811,8]]},"872":{"position":[[1248,8],[2039,9],[4269,9]]},"882":{"position":[[207,8]]},"887":{"position":[[68,8]]},"896":{"position":[[43,9]]},"898":{"position":[[2644,9]]},"902":{"position":[[319,9]]},"903":{"position":[[283,9]]},"904":{"position":[[1080,9]]},"906":{"position":[[92,9]]},"908":{"position":[[357,9]]},"962":{"position":[[443,13]]},"990":{"position":[[1110,8]]},"1067":{"position":[[820,8]]},"1074":{"position":[[190,8],[280,8],[453,8]]},"1077":{"position":[[204,9]]},"1078":{"position":[[676,9]]},"1079":{"position":[[314,8]]},"1080":{"position":[[717,9],[803,9]]},"1082":{"position":[[453,9]]},"1083":{"position":[[97,9],[623,9]]},"1085":{"position":[[735,8]]},"1090":{"position":[[1127,13]]},"1100":{"position":[[817,8]]},"1101":{"position":[[306,8]]},"1107":{"position":[[314,8]]},"1132":{"position":[[1124,12]]},"1141":{"position":[[233,8]]},"1143":{"position":[[461,8]]},"1147":{"position":[[480,7]]},"1149":{"position":[[1202,9]]},"1150":{"position":[[638,9]]},"1151":{"position":[[393,8]]},"1158":{"position":[[499,9]]},"1178":{"position":[[392,8]]},"1188":{"position":[[248,8]]},"1194":{"position":[[139,8]]},"1206":{"position":[[429,9]]},"1222":{"position":[[501,7]]},"1250":{"position":[[186,8]]},"1294":{"position":[[602,8]]},"1295":{"position":[[1391,8]]},"1304":{"position":[[952,8]]},"1311":{"position":[[568,9]]},"1316":{"position":[[2721,7],[3021,8]]}},"keywords":{}}],["require('asyncstorag",{"_index":138,"title":{},"content":{"10":{"position":[[238,21]]}},"keywords":{}}],["require('f",{"_index":6142,"title":{},"content":{"1176":{"position":[[138,13]]}},"keywords":{}}],["require('fak",{"_index":6050,"title":{},"content":{"1139":{"position":[[425,13],[476,13]]},"1145":{"position":[[414,13],[465,13]]}},"keywords":{}}],["require('leveldown",{"_index":90,"title":{},"content":{"6":{"position":[[457,21]]}},"keywords":{}}],["require('lokijs/src/increment",{"_index":6132,"title":{},"content":{"1172":{"position":[[236,31]]}},"keywords":{}}],["require('lokijs/src/loki",{"_index":4576,"title":{},"content":{"772":{"position":[[2202,24]]}},"keywords":{}}],["require('memdown",{"_index":47,"title":{},"content":{"2":{"position":[[296,19]]}},"keywords":{}}],["require('nod",{"_index":1371,"title":{},"content":{"210":{"position":[[449,13]]},"261":{"position":[[690,13]]},"904":{"position":[[2895,13]]}},"keywords":{}}],["require('path",{"_index":6305,"title":{},"content":{"1266":{"position":[[178,16]]}},"keywords":{}}],["require('rxdb/plugins/electron",{"_index":3928,"title":{},"content":{"693":{"position":[[748,33],[1052,33]]}},"keywords":{}}],["require('rxdb/plugins/storag",{"_index":3929,"title":{},"content":{"693":{"position":[[813,29],[1117,29]]}},"keywords":{}}],["require('sqlite3",{"_index":3999,"title":{},"content":{"711":{"position":[[1118,19]]}},"keywords":{}}],["require('ters",{"_index":6307,"title":{},"content":{"1266":{"position":[[216,15]]}},"keywords":{}}],["require('ws').websocket",{"_index":1374,"title":{},"content":{"210":{"position":[[509,23]]},"261":{"position":[[750,23]]},"904":{"position":[[3060,23]]}},"keywords":{}}],["require(path.join(projectrootpath",{"_index":6312,"title":{},"content":{"1266":{"position":[[390,34]]}},"keywords":{}}],["requireauth",{"_index":6080,"title":{},"content":{"1148":{"position":[[1040,12]]}},"keywords":{}}],["res(ev.data.embed",{"_index":2276,"title":{},"content":{"392":{"position":[[4354,23]]}},"keywords":{}}],["res(event.target.result",{"_index":3003,"title":{},"content":{"459":{"position":[[907,25]]}},"keywords":{}}],["res(row",{"_index":4008,"title":{},"content":{"711":{"position":[[1613,10]]}},"keywords":{}}],["res.end",{"_index":3613,"title":{},"content":{"612":{"position":[[2461,10]]}},"keywords":{}}],["res.end(json.stringifi",{"_index":5004,"title":{},"content":{"875":{"position":[[2814,24]]}},"keywords":{}}],["res.end(json.stringify(conflict",{"_index":5035,"title":{},"content":{"875":{"position":[[5578,35]]}},"keywords":{}}],["res.json",{"_index":1577,"title":{},"content":{"255":{"position":[[1295,11],[1536,11]]}},"keywords":{}}],["res.send(json.stringify(result",{"_index":4660,"title":{},"content":{"799":{"position":[[616,33],[823,33]]}},"keywords":{}}],["res.setheader('cont",{"_index":5003,"title":{},"content":{"875":{"position":[[2763,22],[5527,22]]}},"keywords":{}}],["res.write('data",{"_index":5044,"title":{},"content":{"875":{"position":[[7438,16]]}},"keywords":{}}],["res.write(formatteddata",{"_index":3604,"title":{},"content":{"612":{"position":[[2142,25]]}},"keywords":{}}],["res.writehead(200",{"_index":3598,"title":{},"content":{"612":{"position":[[1879,18]]},"875":{"position":[[7263,18]]}},"keywords":{}}],["reserv",{"_index":4356,"title":{},"content":{"749":{"position":[[16950,8]]}},"keywords":{}}],["reset",{"_index":5421,"title":{},"content":{"977":{"position":[[268,5]]},"1085":{"position":[[3543,6]]}},"keywords":{}}],["resid",{"_index":2937,"title":{},"content":{"444":{"position":[[471,6]]},"1315":{"position":[[317,7]]}},"keywords":{}}],["resili",{"_index":2179,"title":{},"content":{"388":{"position":[[345,10]]},"407":{"position":[[733,9]]},"410":{"position":[[932,11]]},"418":{"position":[[723,11]]},"419":{"position":[[885,10]]},"420":{"position":[[1484,10]]},"990":{"position":[[474,9]]}},"keywords":{}}],["resolut",{"_index":226,"title":{"134":{"position":[[9,11]]},"250":{"position":[[21,11]]},"339":{"position":[[9,11]]},"416":{"position":[[24,11]]},"496":{"position":[[9,10]]}},"content":{"14":{"position":[[806,10]]},"39":{"position":[[583,10]]},"40":{"position":[[228,10],[753,11]]},"43":{"position":[[121,10]]},"123":{"position":[[211,10]]},"134":{"position":[[126,10],[198,10]]},"135":{"position":[[287,10]]},"147":{"position":[[120,10]]},"162":{"position":[[487,10]]},"165":{"position":[[238,10]]},"192":{"position":[[244,10]]},"203":{"position":[[160,10]]},"250":{"position":[[47,10],[202,10]]},"263":{"position":[[200,10]]},"289":{"position":[[209,11]]},"306":{"position":[[206,11]]},"328":{"position":[[209,10]]},"331":{"position":[[209,11]]},"412":{"position":[[1152,11],[2179,11],[2980,11],[3249,10]]},"419":{"position":[[1172,10]]},"480":{"position":[[1104,11]]},"491":{"position":[[401,11],[1320,11]]},"495":{"position":[[69,11]]},"525":{"position":[[629,11]]},"566":{"position":[[1018,10]]},"576":{"position":[[286,11]]},"582":{"position":[[438,11]]},"590":{"position":[[819,11]]},"635":{"position":[[428,11]]},"690":{"position":[[191,10]]},"698":{"position":[[358,11],[445,10],[787,10],[975,10],[1419,10],[2183,11],[3285,10]]},"860":{"position":[[777,10]]},"870":{"position":[[168,10]]},"896":{"position":[[270,10]]},"1148":{"position":[[137,10],[365,11],[387,10]]},"1149":{"position":[[52,10]]}},"keywords":{}}],["resolution.rxdb'",{"_index":6072,"title":{},"content":{"1147":{"position":[[266,17]]}},"keywords":{}}],["resolutionrxdb",{"_index":1601,"title":{},"content":{"263":{"position":[[630,14]]}},"keywords":{}}],["resolv",{"_index":1116,"title":{},"content":{"134":{"position":[[317,7]]},"135":{"position":[[243,8]]},"339":{"position":[[111,7]]},"386":{"position":[[176,8]]},"412":{"position":[[5025,9],[5123,7],[13010,9]]},"487":{"position":[[390,7]]},"491":{"position":[[536,7],[1439,8]]},"496":{"position":[[830,8]]},"582":{"position":[[214,9],[585,7]]},"688":{"position":[[102,7],[684,7]]},"691":{"position":[[302,8]]},"698":{"position":[[1815,8]]},"749":{"position":[[21083,7],[21228,8]]},"751":{"position":[[1056,8]]},"789":{"position":[[363,8]]},"810":{"position":[[133,8]]},"860":{"position":[[523,8]]},"885":{"position":[[1410,8],[2695,10]]},"886":{"position":[[243,8]]},"908":{"position":[[49,9],[332,8]]},"929":{"position":[[48,8]]},"930":{"position":[[25,8]]},"931":{"position":[[25,8]]},"932":{"position":[[25,8]]},"968":{"position":[[298,8]]},"974":{"position":[[25,8]]},"975":{"position":[[25,8]]},"976":{"position":[[129,8]]},"982":{"position":[[769,8]]},"987":{"position":[[494,8]]},"994":{"position":[[189,7]]},"995":{"position":[[24,8],[311,7],[759,8],[968,7],[1161,7]]},"997":{"position":[[49,8]]},"1014":{"position":[[142,8]]},"1015":{"position":[[122,8]]},"1016":{"position":[[59,8]]},"1026":{"position":[[110,8]]},"1057":{"position":[[24,8]]},"1062":{"position":[[54,8]]},"1164":{"position":[[871,7],[1195,8]]},"1176":{"position":[[238,7],[351,8]]},"1198":{"position":[[862,7]]},"1266":{"position":[[849,8]]},"1308":{"position":[[279,8],[570,8]]},"1323":{"position":[[168,7]]}},"keywords":{}}],["resolve(i",{"_index":2695,"title":{},"content":{"412":{"position":[[5163,10]]},"1309":{"position":[[936,10]]}},"keywords":{}}],["resourc",{"_index":994,"title":{},"content":{"84":{"position":[[103,10]]},"91":{"position":[[136,10]]},"114":{"position":[[116,10]]},"143":{"position":[[253,9]]},"149":{"position":[[116,10]]},"175":{"position":[[94,9]]},"224":{"position":[[171,9]]},"228":{"position":[[307,8]]},"241":{"position":[[109,10]]},"263":{"position":[[558,10]]},"277":{"position":[[288,8]]},"298":{"position":[[67,10]]},"347":{"position":[[116,10]]},"362":{"position":[[1187,10]]},"373":{"position":[[109,10]]},"392":{"position":[[2220,10]]},"409":{"position":[[36,8]]},"427":{"position":[[1240,10]]},"444":{"position":[[240,10]]},"477":{"position":[[86,8]]},"508":{"position":[[210,8]]},"511":{"position":[[116,10]]},"528":{"position":[[196,10]]},"531":{"position":[[116,10]]},"567":{"position":[[161,10]]},"587":{"position":[[96,8]]},"591":{"position":[[116,10]]},"618":{"position":[[424,8]]},"736":{"position":[[512,9]]},"782":{"position":[[190,9]]},"981":{"position":[[1687,10]]},"1151":{"position":[[414,10]]},"1178":{"position":[[413,10]]},"1206":{"position":[[609,10]]}},"keywords":{}}],["resources.webtransport",{"_index":3670,"title":{},"content":{"622":{"position":[[543,23]]}},"keywords":{}}],["resp",{"_index":1348,"title":{},"content":{"209":{"position":[[792,4]]}},"keywords":{}}],["resp.json",{"_index":1352,"title":{},"content":{"209":{"position":[[920,12]]}},"keywords":{}}],["respect",{"_index":2757,"title":{},"content":{"412":{"position":[[13025,7]]},"875":{"position":[[1884,7]]}},"keywords":{}}],["respond",{"_index":919,"title":{},"content":{"65":{"position":[[917,7]]},"124":{"position":[[265,7]]},"156":{"position":[[242,7]]},"421":{"position":[[978,7]]},"502":{"position":[[764,7]]},"585":{"position":[[66,7]]},"875":{"position":[[1769,8],[7001,7]]},"984":{"position":[[300,7]]},"990":{"position":[[1083,7]]},"1308":{"position":[[447,7]]},"1313":{"position":[[417,10]]}},"keywords":{}}],["respons",{"_index":910,"title":{},"content":{"65":{"position":[[401,10],[983,10],[2093,10]]},"78":{"position":[[111,15]]},"83":{"position":[[377,11]]},"91":{"position":[[268,10]]},"92":{"position":[[221,10]]},"103":{"position":[[210,10]]},"106":{"position":[[203,15]]},"114":{"position":[[740,15]]},"116":{"position":[[272,10]]},"145":{"position":[[119,11]]},"148":{"position":[[225,10]]},"153":{"position":[[319,11]]},"173":{"position":[[999,8],[1105,14],[2668,14]]},"175":{"position":[[686,11]]},"177":{"position":[[316,10]]},"182":{"position":[[175,8]]},"196":{"position":[[225,8]]},"198":{"position":[[381,10]]},"209":{"position":[[1086,8]]},"216":{"position":[[201,10]]},"220":{"position":[[205,8]]},"221":{"position":[[289,10]]},"234":{"position":[[256,14]]},"235":{"position":[[225,10]]},"265":{"position":[[476,10]]},"267":{"position":[[447,10],[1604,10]]},"270":{"position":[[178,10]]},"273":{"position":[[273,10]]},"283":{"position":[[429,10]]},"289":{"position":[[1472,10]]},"292":{"position":[[403,10]]},"294":{"position":[[284,10]]},"321":{"position":[[103,10]]},"369":{"position":[[467,11],[740,15]]},"375":{"position":[[378,15]]},"379":{"position":[[317,10]]},"385":{"position":[[127,8]]},"392":{"position":[[977,8]]},"407":{"position":[[406,9]]},"410":{"position":[[199,9],[270,10]]},"411":{"position":[[3123,11]]},"412":{"position":[[9076,16]]},"415":{"position":[[137,11]]},"418":{"position":[[87,14]]},"421":{"position":[[695,9]]},"427":{"position":[[372,10]]},"445":{"position":[[1527,10]]},"447":{"position":[[414,11]]},"460":{"position":[[151,10]]},"474":{"position":[[255,10]]},"489":{"position":[[581,10]]},"502":{"position":[[145,14]]},"507":{"position":[[195,15]]},"510":{"position":[[374,11]]},"515":{"position":[[393,14]]},"518":{"position":[[354,8]]},"530":{"position":[[502,15]]},"548":{"position":[[216,11]]},"569":{"position":[[191,8],[524,9],[915,8],[1468,8]]},"571":{"position":[[136,8],[1835,8]]},"582":{"position":[[732,10]]},"608":{"position":[[216,11]]},"610":{"position":[[461,8],[556,9]]},"611":{"position":[[223,8]]},"617":{"position":[[859,8]]},"627":{"position":[[182,10]]},"630":{"position":[[163,9],[503,15]]},"632":{"position":[[2771,10]]},"642":{"position":[[219,11]]},"699":{"position":[[961,8]]},"751":{"position":[[1419,8],[1470,9]]},"801":{"position":[[565,10],[742,14]]},"802":{"position":[[785,8]]},"829":{"position":[[376,11],[1151,11]]},"836":{"position":[[1713,14]]},"838":{"position":[[543,11]]},"875":{"position":[[3317,8]]},"886":{"position":[[1431,8],[1531,8]]},"888":{"position":[[57,8],[613,8]]},"889":{"position":[[34,8],[700,8]]},"988":{"position":[[2835,8],[2879,9],[3696,8]]},"1024":{"position":[[361,8]]},"1102":{"position":[[685,8],[1016,8]]},"1124":{"position":[[715,8]]},"1132":{"position":[[1007,10]]},"1257":{"position":[[89,8]]}},"keywords":{}}],["response.json",{"_index":1359,"title":{},"content":{"209":{"position":[[1229,16]]},"392":{"position":[[1043,16]]},"610":{"position":[[980,16]]},"751":{"position":[[1430,16]]},"875":{"position":[[3447,16]]},"988":{"position":[[3841,16]]},"1024":{"position":[[452,16]]}},"keywords":{}}],["responsemodifi",{"_index":5154,"title":{},"content":{"888":{"position":[[268,16],[551,17]]},"889":{"position":[[581,17]]}},"keywords":{}}],["responsiveness.it",{"_index":6070,"title":{},"content":{"1143":{"position":[[592,17]]}},"keywords":{}}],["responsiveness.mad",{"_index":1217,"title":{},"content":{"174":{"position":[[1185,19]]}},"keywords":{}}],["responsiveness.scal",{"_index":5239,"title":{},"content":{"902":{"position":[[145,26]]}},"keywords":{}}],["rest",{"_index":307,"title":{"784":{"position":[[19,5]]},"1102":{"position":[[0,4]]}},"content":{"18":{"position":[[189,4]]},"38":{"position":[[364,4]]},"57":{"position":[[366,5]]},"89":{"position":[[139,4]]},"173":{"position":[[474,4]]},"202":{"position":[[301,5]]},"223":{"position":[[118,4],[404,4]]},"249":{"position":[[255,4]]},"255":{"position":[[950,4],[1052,4],[1127,4],[1390,4]]},"310":{"position":[[146,4]]},"312":{"position":[[186,6]]},"383":{"position":[[143,4]]},"411":{"position":[[1208,4]]},"478":{"position":[[31,4]]},"482":{"position":[[131,5],[1022,4]]},"564":{"position":[[137,5],[1031,5]]},"566":{"position":[[1391,4]]},"632":{"position":[[881,4]]},"644":{"position":[[536,5]]},"784":{"position":[[297,4]]},"988":{"position":[[560,4],[2481,4],[3675,4]]},"1100":{"position":[[263,4]]},"1102":{"position":[[5,4],[289,4],[744,4],[802,4],[910,6],[1070,4]]},"1149":{"position":[[372,4],[473,7]]}},"keywords":{}}],["rest.queri",{"_index":1901,"title":{},"content":{"315":{"position":[[998,12]]}},"keywords":{}}],["restart",{"_index":3561,"title":{},"content":{"610":{"position":[[1288,7]]},"723":{"position":[[1466,9]]},"998":{"position":[[177,7]]},"999":{"position":[[96,7]]},"1085":{"position":[[3553,7]]},"1301":{"position":[[1627,7]]},"1314":{"position":[[594,8]]}},"keywords":{}}],["restarts/reload",{"_index":4050,"title":{},"content":{"724":{"position":[[619,17]]}},"keywords":{}}],["restcompress",{"_index":3699,"title":{},"content":{"631":{"position":[[457,15]]}},"keywords":{}}],["restor",{"_index":707,"title":{},"content":{"46":{"position":[[242,9]]},"164":{"position":[[276,9]]},"201":{"position":[[338,9]]},"274":{"position":[[255,9]]},"280":{"position":[[312,9]]},"327":{"position":[[223,9]]},"380":{"position":[[202,9]]},"419":{"position":[[545,9]]},"436":{"position":[[227,9]]},"502":{"position":[[592,9]]},"565":{"position":[[274,9]]},"582":{"position":[[145,9]]},"584":{"position":[[121,9]]}},"keywords":{}}],["restored.data",{"_index":1922,"title":{},"content":{"323":{"position":[[307,13]]},"575":{"position":[[415,13]]}},"keywords":{}}],["restrict",{"_index":685,"title":{"796":{"position":[[55,8]]}},"content":{"43":{"position":[[632,9]]},"66":{"position":[[428,12]]},"408":{"position":[[96,10],[498,11]]},"427":{"position":[[513,11]]},"624":{"position":[[310,12]]},"796":{"position":[[141,11],[312,11],[565,11],[605,11],[973,11],[1015,11],[1263,11],[1404,11]]},"1105":{"position":[[61,8],[516,9]]},"1106":{"position":[[63,8],[152,8],[356,8]]}},"keywords":{}}],["restructur",{"_index":5622,"title":{},"content":{"1021":{"position":[[114,11]]}},"keywords":{}}],["result",{"_index":543,"title":{"1321":{"position":[[14,8]]}},"content":{"34":{"position":[[623,7]]},"65":{"position":[[370,7],[1144,7]]},"69":{"position":[[137,6]]},"77":{"position":[[335,8]]},"91":{"position":[[234,9]]},"92":{"position":[[67,9]]},"93":{"position":[[181,9]]},"100":{"position":[[296,9]]},"103":{"position":[[375,8]]},"108":{"position":[[139,9]]},"130":{"position":[[230,7]]},"173":{"position":[[808,9],[2596,9]]},"174":{"position":[[1711,9]]},"182":{"position":[[265,8]]},"188":{"position":[[3130,7],[3277,8]]},"197":{"position":[[154,9]]},"216":{"position":[[172,9]]},"220":{"position":[[185,9]]},"227":{"position":[[270,9]]},"234":{"position":[[435,8]]},"252":{"position":[[333,7]]},"281":{"position":[[395,7]]},"287":{"position":[[1004,6]]},"289":{"position":[[260,9]]},"301":{"position":[[354,8]]},"329":{"position":[[127,6]]},"360":{"position":[[321,8]]},"390":{"position":[[801,7]]},"392":{"position":[[3441,6]]},"393":{"position":[[731,8]]},"394":{"position":[[1181,8]]},"398":{"position":[[250,6],[1709,7],[2862,7],[3034,7],[3115,7]]},"400":{"position":[[457,7],[760,6]]},"402":{"position":[[556,8],[1312,7],[1359,6],[1629,8],[2388,7]]},"404":{"position":[[897,7]]},"408":{"position":[[4792,6]]},"410":{"position":[[286,7]]},"411":{"position":[[1734,7],[3006,8],[3497,6],[3566,7]]},"434":{"position":[[334,7]]},"439":{"position":[[728,6]]},"459":{"position":[[827,6]]},"462":{"position":[[273,7]]},"474":{"position":[[266,9]]},"480":{"position":[[812,6]]},"490":{"position":[[657,7]]},"491":{"position":[[928,6]]},"502":{"position":[[806,6],[1039,6]]},"507":{"position":[[141,9]]},"518":{"position":[[131,7],[208,7],[506,6]]},"523":{"position":[[454,7]]},"535":{"position":[[824,7]]},"571":{"position":[[721,7],[843,6],[987,6],[1093,8],[1461,7]]},"575":{"position":[[664,6]]},"580":{"position":[[138,7],[636,7]]},"602":{"position":[[288,6]]},"618":{"position":[[504,7]]},"626":{"position":[[336,8]]},"662":{"position":[[160,6],[2669,6]]},"685":{"position":[[646,6]]},"704":{"position":[[578,7]]},"710":{"position":[[212,7],[1976,6]]},"711":{"position":[[658,6]]},"723":{"position":[[340,8],[1204,7]]},"749":{"position":[[2205,6],[3317,6],[16299,6]]},"772":{"position":[[1003,6]]},"775":{"position":[[774,6]]},"781":{"position":[[782,7]]},"782":{"position":[[51,6]]},"796":{"position":[[106,6]]},"799":{"position":[[37,6],[185,6],[304,8],[562,6],[794,6]]},"817":{"position":[[176,8],[295,6]]},"821":{"position":[[128,7],[317,6]]},"826":{"position":[[773,6],[871,6]]},"829":{"position":[[2265,7],[2493,8],[3190,7],[3408,8],[3688,6]]},"837":{"position":[[635,7]]},"838":{"position":[[189,6],[2883,6]]},"886":{"position":[[1417,6]]},"944":{"position":[[183,6]]},"945":{"position":[[124,6],[445,6]]},"965":{"position":[[175,7]]},"1030":{"position":[[262,7]]},"1055":{"position":[[83,6]]},"1056":{"position":[[57,6]]},"1057":{"position":[[42,6],[109,7]]},"1058":{"position":[[51,6],[305,8],[352,8],[472,8],[531,7]]},"1059":{"position":[[49,7]]},"1060":{"position":[[71,7]]},"1061":{"position":[[72,7]]},"1064":{"position":[[351,6]]},"1067":{"position":[[420,6],[505,6],[1742,6]]},"1068":{"position":[[489,6]]},"1069":{"position":[[88,7],[603,7],[664,6],[760,7],[825,6]]},"1072":{"position":[[1011,7],[1411,7],[2863,7]]},"1079":{"position":[[589,8]]},"1100":{"position":[[493,9]]},"1102":{"position":[[1138,7],[1202,7]]},"1150":{"position":[[78,7],[564,7]]},"1209":{"position":[[366,7]]},"1213":{"position":[[97,8]]},"1250":{"position":[[212,6],[243,7],[582,7]]},"1294":{"position":[[788,6],[1042,7],[1731,6],[1832,7],[1977,7]]},"1295":{"position":[[788,8],[1348,7],[1406,7]]},"1315":{"position":[[900,6],[1339,6],[1469,6]]},"1318":{"position":[[350,8],[410,6],[514,7],[637,7],[900,7],[1096,7],[1190,8]]},"1321":{"position":[[220,8],[274,6],[433,6],[536,7],[643,6],[749,6]]},"1322":{"position":[[103,6],[546,7]]}},"keywords":{}}],["result.concat(subresult",{"_index":6446,"title":{},"content":{"1294":{"position":[[1740,25]]}},"keywords":{}}],["result.length",{"_index":5781,"title":{},"content":{"1067":{"position":[[2196,14]]}},"keywords":{}}],["results.for",{"_index":2484,"title":{},"content":{"402":{"position":[[1082,11]]}},"keywords":{}}],["results.length",{"_index":980,"title":{},"content":{"77":{"position":[[348,16]]},"103":{"position":[[388,16]]},"234":{"position":[[448,16]]},"1058":{"position":[[318,16]]}},"keywords":{}}],["results.length}</span>",{"_index":4760,"title":{},"content":{"829":{"position":[[2627,30]]}},"keywords":{}}],["results.map(hero",{"_index":4763,"title":{},"content":{"829":{"position":[[3533,17]]}},"keywords":{}}],["resultset",{"_index":5778,"title":{},"content":{"1067":{"position":[[1946,9]]}},"keywords":{}}],["resultset.length",{"_index":5779,"title":{},"content":{"1067":{"position":[[2049,17]]}},"keywords":{}}],["resultsit",{"_index":4699,"title":{},"content":{"816":{"position":[[197,9]]}},"keywords":{}}],["resum",{"_index":2241,"title":{},"content":{"392":{"position":[[2263,6]]},"630":{"position":[[377,7]]},"632":{"position":[[1990,8]]},"896":{"position":[[191,10]]},"988":{"position":[[377,6]]},"998":{"position":[[60,7]]},"1003":{"position":[[336,8]]}},"keywords":{}}],["resync",{"_index":2751,"title":{"996":{"position":[[0,9]]}},"content":{"412":{"position":[[11917,7]]},"875":{"position":[[8529,6],[8793,6],[9039,6],[9354,6]]},"985":{"position":[[278,6],[578,6]]},"988":{"position":[[5965,6]]},"996":{"position":[[12,6],[387,8],[508,6]]}},"keywords":{}}],["retain",{"_index":2134,"title":{},"content":{"372":{"position":[[318,9]]},"417":{"position":[[70,9]]},"436":{"position":[[134,7]]},"1009":{"position":[[817,6]]}},"keywords":{}}],["retcheckpoint",{"_index":5112,"title":{},"content":{"885":{"position":[[2521,13],[2631,13]]}},"keywords":{}}],["retent",{"_index":2109,"title":{},"content":{"365":{"position":[[586,9],[765,10]]},"411":{"position":[[5746,9]]}},"keywords":{}}],["rethink",{"_index":354,"title":{},"content":{"20":{"position":[[150,7]]}},"keywords":{}}],["rethinkdb",{"_index":346,"title":{"20":{"position":[[0,10]]}},"content":{"20":{"position":[[3,9]]},"21":{"position":[[40,9],[147,9]]},"22":{"position":[[292,10]]}},"keywords":{}}],["retir",{"_index":434,"title":{},"content":{"26":{"position":[[380,7]]}},"keywords":{}}],["retri",{"_index":1803,"title":{},"content":{"302":{"position":[[659,7]]},"487":{"position":[[380,5]]},"612":{"position":[[1658,5]]},"632":{"position":[[2641,5]]},"899":{"position":[[115,8]]},"988":{"position":[[935,8]]},"995":{"position":[[161,5]]},"1031":{"position":[[184,8]]}},"keywords":{}}],["retriev",{"_index":926,"title":{},"content":{"65":{"position":[[1255,10]]},"66":{"position":[[306,9]]},"92":{"position":[[200,9]]},"117":{"position":[[107,9]]},"131":{"position":[[571,8]]},"138":{"position":[[132,9]]},"152":{"position":[[274,10]]},"166":{"position":[[141,9]]},"178":{"position":[[125,10]]},"194":{"position":[[206,10]]},"205":{"position":[[108,10]]},"208":{"position":[[130,10]]},"217":{"position":[[372,9]]},"220":{"position":[[318,10]]},"276":{"position":[[292,9]]},"283":{"position":[[99,9]]},"321":{"position":[[67,8]]},"350":{"position":[[198,8]]},"369":{"position":[[271,9]]},"394":{"position":[[1560,10]]},"395":{"position":[[246,8]]},"398":{"position":[[1828,8]]},"402":{"position":[[132,9]]},"425":{"position":[[325,10]]},"426":{"position":[[201,8],[442,10]]},"427":{"position":[[755,10]]},"430":{"position":[[349,9]]},"435":{"position":[[395,10]]},"444":{"position":[[676,8]]},"507":{"position":[[130,10]]},"527":{"position":[[209,10]]},"556":{"position":[[258,8]]},"632":{"position":[[2428,8]]},"711":{"position":[[645,8]]},"714":{"position":[[264,8]]},"715":{"position":[[46,8],[286,8]]},"1072":{"position":[[111,10]]},"1132":{"position":[[243,9],[665,10]]},"1174":{"position":[[595,8]]},"1294":{"position":[[1054,9]]},"1315":{"position":[[1400,8]]}},"keywords":{}}],["retrieval.build",{"_index":1200,"title":{},"content":{"173":{"position":[[833,18]]}},"keywords":{}}],["retrieval.tab",{"_index":2889,"title":{},"content":{"427":{"position":[[1093,13]]}},"keywords":{}}],["retryattempt",{"_index":5148,"title":{},"content":{"886":{"position":[[4876,14]]}},"keywords":{}}],["retrytim",{"_index":3709,"title":{},"content":{"632":{"position":[[2621,10]]},"862":{"position":[[1518,11]]},"886":{"position":[[1986,9]]},"988":{"position":[[1077,10]]}},"keywords":{}}],["return",{"_index":161,"title":{},"content":{"11":{"position":[[578,6]]},"51":{"position":[[884,6]]},"55":{"position":[[458,6],[511,6]]},"143":{"position":[[757,6]]},"188":{"position":[[1467,6]]},"209":{"position":[[907,6],[936,6],[1216,6],[1266,6]]},"248":{"position":[[201,7]]},"255":{"position":[[1258,6],[1282,6],[1523,6],[1597,6]]},"314":{"position":[[906,6]]},"315":{"position":[[923,6]]},"334":{"position":[[768,6]]},"338":{"position":[[159,8]]},"390":{"position":[[793,7]]},"391":{"position":[[720,6],[842,9]]},"392":{"position":[[4247,6]]},"393":{"position":[[783,7]]},"394":{"position":[[1220,8]]},"398":{"position":[[1582,6],[1700,6],[2735,6],[2853,6]]},"403":{"position":[[1000,6]]},"407":{"position":[[670,8]]},"412":{"position":[[4992,6],[5469,6],[5546,6]]},"439":{"position":[[410,6]]},"460":{"position":[[1269,8]]},"480":{"position":[[766,7],[919,6]]},"482":{"position":[[1035,6]]},"491":{"position":[[1240,8]]},"494":{"position":[[315,6]]},"495":{"position":[[572,9]]},"502":{"position":[[992,7]]},"518":{"position":[[459,7]]},"523":{"position":[[593,6],[616,6]]},"541":{"position":[[462,6],[524,6]]},"542":{"position":[[818,6]]},"554":{"position":[[1549,6]]},"556":{"position":[[451,6]]},"559":{"position":[[370,6],[510,6]]},"562":{"position":[[1360,6],[1438,6]]},"571":{"position":[[933,7]]},"579":{"position":[[782,6]]},"580":{"position":[[14,6]]},"585":{"position":[[15,9]]},"598":{"position":[[914,6]]},"632":{"position":[[1774,7],[1878,6]]},"659":{"position":[[389,6]]},"691":{"position":[[327,6]]},"698":{"position":[[665,9]]},"711":{"position":[[1545,6]]},"724":{"position":[[844,9]]},"749":{"position":[[15913,6],[22486,7]]},"751":{"position":[[340,7],[400,7],[700,6],[943,6],[1032,7],[1312,6],[1480,6],[1802,6],[1976,6],[1994,6]]},"752":{"position":[[117,7],[587,6],[718,7]]},"753":{"position":[[30,7]]},"754":{"position":[[387,6],[547,6],[769,6]]},"767":{"position":[[551,6],[960,6]]},"768":{"position":[[553,6],[962,6]]},"769":{"position":[[510,6],[931,6]]},"775":{"position":[[763,6]]},"789":{"position":[[253,6],[500,6]]},"791":{"position":[[109,6],[368,6]]},"792":{"position":[[240,6]]},"810":{"position":[[109,7]]},"829":{"position":[[867,6],[1606,6],[1733,6],[2002,7],[2548,6],[2594,6],[3170,7],[3467,6],[3513,6],[3822,8]]},"846":{"position":[[1349,7]]},"848":{"position":[[593,6]]},"860":{"position":[[468,8]]},"862":{"position":[[1629,8]]},"872":{"position":[[2732,8]]},"875":{"position":[[1977,7],[3464,6],[3713,6],[4076,6],[6454,6]]},"885":{"position":[[56,7],[173,7],[1072,7],[1146,6],[1769,6],[1813,6],[1879,6],[1909,6],[1925,6],[1949,6],[2103,6],[2154,6],[2268,6],[2286,6],[2314,6],[2586,6],[2647,6]]},"886":{"position":[[167,7],[767,6],[2232,7],[2491,6],[3065,9],[3682,6],[4714,7]]},"887":{"position":[[664,6]]},"888":{"position":[[171,9],[218,7],[322,8],[631,8],[982,8],[1049,6]]},"889":{"position":[[90,7],[242,7],[719,6]]},"890":{"position":[[45,7]]},"898":{"position":[[3594,6],[3808,6],[4237,7],[4547,8]]},"904":{"position":[[3195,7]]},"907":{"position":[[200,7],[350,6]]},"917":{"position":[[37,7]]},"919":{"position":[[1,7],[36,7]]},"920":{"position":[[1,7]]},"929":{"position":[[25,7]]},"930":{"position":[[1,7]]},"931":{"position":[[1,7]]},"932":{"position":[[1,7]]},"941":{"position":[[19,6]]},"942":{"position":[[141,7]]},"943":{"position":[[289,7]]},"944":{"position":[[125,7],[612,6],[659,8]]},"945":{"position":[[66,7]]},"946":{"position":[[98,7]]},"947":{"position":[[114,7]]},"950":{"position":[[46,7]]},"951":{"position":[[154,7],[303,8],[458,8],[501,6]]},"957":{"position":[[1,7],[66,7]]},"968":{"position":[[275,7],[449,6]]},"970":{"position":[[19,6]]},"974":{"position":[[1,7]]},"975":{"position":[[1,7]]},"976":{"position":[[106,7]]},"978":{"position":[[1,7],[64,7]]},"983":{"position":[[245,7],[323,7],[368,8],[589,6],[699,6]]},"984":{"position":[[561,7]]},"988":{"position":[[2803,6],[2872,6],[3184,6],[3858,6],[4190,8]]},"992":{"position":[[38,7]]},"994":{"position":[[161,8]]},"995":{"position":[[1,7]]},"997":{"position":[[26,7]]},"1000":{"position":[[1,7]]},"1001":{"position":[[1,7]]},"1007":{"position":[[1295,7]]},"1008":{"position":[[175,7]]},"1014":{"position":[[118,7]]},"1015":{"position":[[98,7]]},"1016":{"position":[[35,7]]},"1017":{"position":[[21,7]]},"1038":{"position":[[116,10],[168,7]]},"1039":{"position":[[15,7]]},"1042":{"position":[[80,7],[207,6]]},"1044":{"position":[[449,6]]},"1045":{"position":[[1,7]]},"1046":{"position":[[19,6]]},"1047":{"position":[[159,8]]},"1048":{"position":[[605,6]]},"1051":{"position":[[1,7],[61,6]]},"1052":{"position":[[22,7],[250,8]]},"1053":{"position":[[1,7],[64,7]]},"1057":{"position":[[1,7]]},"1061":{"position":[[264,6]]},"1062":{"position":[[30,7]]},"1063":{"position":[[1,7]]},"1065":{"position":[[1691,6],[2001,6]]},"1069":{"position":[[308,7]]},"1070":{"position":[[1,7],[61,7]]},"1072":{"position":[[41,8],[432,7]]},"1104":{"position":[[144,7],[319,7]]},"1105":{"position":[[207,7],[544,6],[692,6],[1100,6]]},"1106":{"position":[[492,6],[606,6],[629,6]]},"1115":{"position":[[135,7]]},"1118":{"position":[[577,6]]},"1140":{"position":[[792,6]]},"1164":{"position":[[1167,6],[1257,9]]},"1185":{"position":[[60,7]]},"1198":{"position":[[1055,6]]},"1218":{"position":[[120,7]]},"1220":{"position":[[318,6],[356,6]]},"1229":{"position":[[80,7]]},"1257":{"position":[[122,6]]},"1268":{"position":[[80,7]]},"1291":{"position":[[124,6]]},"1294":{"position":[[689,8]]},"1309":{"position":[[332,7],[909,6],[1186,6]]},"1311":{"position":[[715,6],[934,6]]},"1315":{"position":[[871,6]]},"1321":{"position":[[926,6]]},"1322":{"position":[[354,6]]}},"keywords":{}}],["reus",{"_index":743,"title":{"239":{"position":[[32,6]]}},"content":{"47":{"position":[[1315,5]]},"112":{"position":[[53,5]]},"174":{"position":[[2660,6],[2850,5]]},"239":{"position":[[58,5],[241,5]]},"384":{"position":[[387,5]]},"595":{"position":[[1338,5]]},"898":{"position":[[2766,5]]},"1124":{"position":[[1287,5],[1404,6]]},"1183":{"position":[[386,6]]},"1267":{"position":[[186,5],[323,7]]}},"keywords":{}}],["reusabl",{"_index":3476,"title":{},"content":{"574":{"position":[[114,8]]},"1249":{"position":[[231,8]]}},"keywords":{}}],["rev",{"_index":5304,"title":{"928":{"position":[[0,4]]}},"content":{},"keywords":{}}],["revenu",{"_index":602,"title":{},"content":{"38":{"position":[[997,7]]},"1112":{"position":[[349,8]]}},"keywords":{}}],["revers",{"_index":2442,"title":{},"content":{"400":{"position":[[419,7]]}},"keywords":{}}],["revert",{"_index":3187,"title":{},"content":{"495":{"position":[[413,6]]}},"keywords":{}}],["review",{"_index":3021,"title":{},"content":{"462":{"position":[[16,8]]}},"keywords":{}}],["revis",{"_index":277,"title":{"1303":{"position":[[28,9]]},"1305":{"position":[[0,10]]}},"content":{"16":{"position":[[401,9]]},"24":{"position":[[425,8],[757,8]]},"35":{"position":[[436,8]]},"203":{"position":[[184,9]]},"412":{"position":[[2077,10],[3332,8],[4946,8]]},"495":{"position":[[227,9],[582,8]]},"496":{"position":[[219,8],[788,8]]},"635":{"position":[[131,9],[385,8]]},"698":{"position":[[2049,8]]},"749":{"position":[[8998,8]]},"793":{"position":[[932,9]]},"841":{"position":[[168,8]]},"844":{"position":[[200,9]]},"928":{"position":[[5,8]]},"1044":{"position":[[118,8]]},"1051":{"position":[[380,9]]},"1198":{"position":[[498,8],[580,9]]},"1200":{"position":[[44,8]]},"1258":{"position":[[149,9]]},"1305":{"position":[[400,9],[431,9],[516,8],[585,8],[836,8],[869,8],[890,8],[990,8],[1021,8]]},"1308":{"position":[[398,9]]},"1309":{"position":[[870,9]]},"1313":{"position":[[1058,8]]},"1324":{"position":[[890,9]]}},"keywords":{}}],["revisions.stor",{"_index":1549,"title":{},"content":{"250":{"position":[[217,15]]}},"keywords":{}}],["revisit",{"_index":5582,"title":{"1008":{"position":[[16,10]]}},"content":{},"keywords":{}}],["revok",{"_index":4017,"title":{},"content":{"715":{"position":[[343,6]]}},"keywords":{}}],["revolut",{"_index":3248,"title":{},"content":{"510":{"position":[[710,11]]}},"keywords":{}}],["revolution",{"_index":3152,"title":{},"content":{"485":{"position":[[184,13]]}},"keywords":{}}],["revolv",{"_index":1336,"title":{},"content":{"208":{"position":[[106,8]]},"514":{"position":[[290,8]]},"632":{"position":[[26,8]]}},"keywords":{}}],["rewrit",{"_index":1389,"title":{},"content":{"212":{"position":[[470,9]]},"354":{"position":[[1039,9]]},"383":{"position":[[448,9]]},"696":{"position":[[1834,7]]},"849":{"position":[[897,7]]}},"keywords":{}}],["rewritten",{"_index":646,"title":{},"content":{"41":{"position":[[28,9]]}},"keywords":{}}],["rfc",{"_index":3012,"title":{},"content":{"461":{"position":[[46,3]]},"617":{"position":[[360,3],[437,3]]}},"keywords":{}}],["riak",{"_index":6584,"title":{},"content":{"1324":{"position":[[953,4]]}},"keywords":{}}],["rich",{"_index":989,"title":{"383":{"position":[[0,4]]}},"content":{"83":{"position":[[47,4]]},"90":{"position":[[301,4]]},"148":{"position":[[281,4]]},"186":{"position":[[385,4]]},"198":{"position":[[230,4]]},"412":{"position":[[3764,4]]},"446":{"position":[[950,4]]},"836":{"position":[[2482,4]]},"860":{"position":[[244,4]]}},"keywords":{}}],["right",{"_index":696,"title":{"212":{"position":[[12,5]]},"262":{"position":[[8,5]]},"441":{"position":[[25,5]]}},"content":{"45":{"position":[[171,5]]},"93":{"position":[[247,5]]},"143":{"position":[[579,6]]},"178":{"position":[[305,5]]},"205":{"position":[[236,5]]},"278":{"position":[[31,5]]},"401":{"position":[[909,5]]},"408":{"position":[[3720,5]]},"410":{"position":[[2176,5]]},"421":{"position":[[544,5]]},"491":{"position":[[902,5]]},"574":{"position":[[575,5]]},"707":{"position":[[393,5]]},"742":{"position":[[81,5]]},"795":{"position":[[210,5]]},"799":{"position":[[657,5]]}},"keywords":{}}],["rigid",{"_index":1659,"title":{},"content":{"282":{"position":[[229,5]]},"351":{"position":[[32,5]]},"362":{"position":[[104,5]]}},"keywords":{}}],["rise",{"_index":2329,"title":{},"content":{"394":{"position":[[1703,4]]},"408":{"position":[[4313,4],[5018,7]]}},"keywords":{}}],["risk",{"_index":2057,"title":{},"content":{"358":{"position":[[309,4],[622,5]]},"377":{"position":[[85,4]]},"382":{"position":[[371,5]]},"410":{"position":[[725,4]]},"412":{"position":[[8469,5],[13395,5]]},"482":{"position":[[21,4]]},"497":{"position":[[550,4]]},"550":{"position":[[327,4]]},"863":{"position":[[995,5]]},"902":{"position":[[427,5]]},"981":{"position":[[1446,7]]},"1090":{"position":[[1303,4]]}},"keywords":{}}],["rl",{"_index":5192,"title":{},"content":{"897":{"position":[[512,5]]},"898":{"position":[[2825,4]]},"899":{"position":[[201,5]]}},"keywords":{}}],["rm",{"_index":4894,"title":{},"content":{"861":{"position":[[563,2]]},"865":{"position":[[224,2]]}},"keywords":{}}],["rm1",{"_index":4431,"title":{},"content":{"749":{"position":[[23588,3]]}},"keywords":{}}],["robust",{"_index":541,"title":{},"content":{"34":{"position":[[552,6]]},"45":{"position":[[257,6]]},"47":{"position":[[407,6]]},"61":{"position":[[369,7]]},"64":{"position":[[45,6]]},"74":{"position":[[13,6]]},"117":{"position":[[226,6]]},"151":{"position":[[415,6]]},"162":{"position":[[311,6]]},"165":{"position":[[359,6]]},"174":{"position":[[854,6]]},"184":{"position":[[91,6]]},"189":{"position":[[363,6]]},"205":{"position":[[84,6]]},"240":{"position":[[163,6]]},"255":{"position":[[69,6]]},"263":{"position":[[124,6]]},"295":{"position":[[210,6]]},"320":{"position":[[323,6]]},"354":{"position":[[1457,6]]},"362":{"position":[[1054,6]]},"373":{"position":[[632,6]]},"386":{"position":[[147,6]]},"388":{"position":[[287,7]]},"408":{"position":[[1849,6]]},"412":{"position":[[9781,6],[14287,6]]},"418":{"position":[[641,6]]},"430":{"position":[[628,6]]},"435":{"position":[[193,10]]},"441":{"position":[[509,6]]},"445":{"position":[[2045,6]]},"447":{"position":[[274,6]]},"479":{"position":[[511,6]]},"503":{"position":[[214,6]]},"513":{"position":[[327,6]]},"517":{"position":[[139,6]]},"530":{"position":[[656,6]]},"557":{"position":[[453,6]]},"560":{"position":[[132,6]]},"564":{"position":[[159,6]]},"567":{"position":[[1180,6]]},"631":{"position":[[351,6]]},"705":{"position":[[924,6]]},"838":{"position":[[888,6]]},"839":{"position":[[791,6]]},"903":{"position":[[661,6]]},"906":{"position":[[640,6]]},"912":{"position":[[253,6]]}},"keywords":{}}],["robust.high",{"_index":2024,"title":{},"content":{"354":{"position":[[674,11]]}},"keywords":{}}],["rocicorp",{"_index":608,"title":{},"content":{"38":{"position":[[1073,8]]}},"keywords":{}}],["role",{"_index":1064,"title":{},"content":{"117":{"position":[[24,4]]},"152":{"position":[[171,4]]},"178":{"position":[[24,4]]},"411":{"position":[[2669,5]]},"447":{"position":[[31,4]]},"534":{"position":[[64,4]]},"569":{"position":[[633,4]]},"594":{"position":[[62,4]]},"897":{"position":[[572,4]]},"898":{"position":[[2885,4]]},"1148":{"position":[[336,6]]}},"keywords":{}}],["roll",{"_index":6487,"title":{},"content":{"1304":{"position":[[964,4]]},"1316":{"position":[[1690,4],[2928,4]]}},"keywords":{}}],["rollback",{"_index":619,"title":{},"content":{"39":{"position":[[212,8]]},"1316":{"position":[[2753,9],[2960,9]]}},"keywords":{}}],["rollup",{"_index":1938,"title":{},"content":{"333":{"position":[[160,7]]},"730":{"position":[[162,7]]}},"keywords":{}}],["room",{"_index":1585,"title":{},"content":{"261":{"position":[[398,6]]},"904":{"position":[[1924,5]]}},"keywords":{}}],["root",{"_index":3236,"title":{},"content":{"504":{"position":[[906,5]]},"1092":{"position":[[100,4]]},"1116":{"position":[[317,4]]},"1208":{"position":[[66,4],[650,4],[708,4]]},"1215":{"position":[[508,4]]},"1266":{"position":[[343,4]]}},"keywords":{}}],["root.getdirectoryhandle('subfold",{"_index":6200,"title":{},"content":{"1208":{"position":[[810,36]]}},"keywords":{}}],["root/user/project/mydatabas",{"_index":93,"title":{},"content":{"6":{"position":[[706,32]]},"7":{"position":[[541,32]]}},"keywords":{}}],["rootpath",{"_index":4271,"title":{},"content":{"749":{"position":[[10515,8]]}},"keywords":{}}],["rootvalu",{"_index":5091,"title":{},"content":{"885":{"position":[[1466,9]]}},"keywords":{}}],["roughli",{"_index":2349,"title":{},"content":{"396":{"position":[[1431,7]]}},"keywords":{}}],["round",{"_index":1011,"title":{},"content":{"92":{"position":[[125,5]]},"173":{"position":[[2024,5]]},"220":{"position":[[118,5]]},"224":{"position":[[270,5]]},"375":{"position":[[314,5]]},"408":{"position":[[2333,5],[2580,5],[2899,5],[3303,5]]},"410":{"position":[[111,5]]},"411":{"position":[[344,5]]},"415":{"position":[[286,5]]},"487":{"position":[[249,5]]},"574":{"position":[[427,5]]},"630":{"position":[[625,5]]},"902":{"position":[[114,5]]}},"keywords":{}}],["rout",{"_index":589,"title":{},"content":{"38":{"position":[[369,6]]},"89":{"position":[[144,7]]},"173":{"position":[[479,7]]},"223":{"position":[[123,7]]},"408":{"position":[[2450,8]]},"411":{"position":[[1213,6]]},"412":{"position":[[4104,6]]},"784":{"position":[[130,6],[149,5],[238,6],[302,6]]},"799":{"position":[[501,6]]},"875":{"position":[[1169,6],[6897,5]]},"1112":{"position":[[574,7]]}},"keywords":{}}],["row",{"_index":1650,"title":{},"content":{"279":{"position":[[335,4]]},"364":{"position":[[658,5]]},"661":{"position":[[1271,4]]},"704":{"position":[[64,5]]},"705":{"position":[[842,4],[860,4]]},"711":{"position":[[1231,3],[1599,5],[1730,4]]},"749":{"position":[[16311,5]]},"836":{"position":[[941,4]]},"875":{"position":[[3688,4],[3809,3],[3985,4],[5958,4]]},"885":{"position":[[70,4]]},"886":{"position":[[2296,4],[2483,4]]},"897":{"position":[[493,3]]},"898":{"position":[[326,3],[395,3],[457,4],[604,4],[1329,3]]},"899":{"position":[[182,3]]},"981":{"position":[[1073,4]]},"1124":{"position":[[775,4],[816,3]]},"1253":{"position":[[96,4]]},"1257":{"position":[[166,4]]},"1314":{"position":[[449,4]]},"1316":{"position":[[792,5],[1092,3],[1279,5],[3426,4]]},"1317":{"position":[[526,4],[653,4],[730,4]]},"1319":{"position":[[448,3]]},"1321":{"position":[[343,4]]}},"keywords":{}}],["rowid",{"_index":6373,"title":{},"content":{"1282":{"position":[[960,5]]}},"keywords":{}}],["rows/docu",{"_index":6570,"title":{},"content":{"1319":{"position":[[115,15]]}},"keywords":{}}],["rs0",{"_index":4943,"title":{},"content":{"872":{"position":[[562,3]]}},"keywords":{}}],["rtc",{"_index":3449,"title":{},"content":{"569":{"position":[[106,6]]},"614":{"position":[[118,5]]}},"keywords":{}}],["rto",{"_index":3453,"title":{},"content":{"569":{"position":[[354,6]]}},"keywords":{}}],["rudimentari",{"_index":728,"title":{},"content":{"47":{"position":[[427,11]]},"535":{"position":[[397,11]]},"595":{"position":[[425,11]]}},"keywords":{}}],["rule",{"_index":1728,"title":{},"content":{"298":{"position":[[766,5]]},"299":{"position":[[105,5]]},"305":{"position":[[362,6]]},"354":{"position":[[1497,5]]},"688":{"position":[[907,4]]},"690":{"position":[[180,4]]},"841":{"position":[[1296,5]]},"1266":{"position":[[732,6]]}},"keywords":{}}],["rules).workflow",{"_index":3203,"title":{},"content":{"497":{"position":[[436,16]]}},"keywords":{}}],["run",{"_index":373,"title":{"92":{"position":[[0,7]]},"188":{"position":[[13,3]]},"207":{"position":[[31,5]]},"682":{"position":[[0,7]]},"757":{"position":[[20,3]]},"1088":{"position":[[0,3]]}},"content":{"22":{"position":[[263,3]]},"23":{"position":[[193,3]]},"29":{"position":[[358,8]]},"30":{"position":[[35,3]]},"38":{"position":[[247,4]]},"65":{"position":[[1040,3]]},"91":{"position":[[88,3]]},"92":{"position":[[42,7]]},"125":{"position":[[110,7]]},"128":{"position":[[135,7]]},"172":{"position":[[301,3]]},"188":{"position":[[62,3],[178,4]]},"204":{"position":[[115,7]]},"207":{"position":[[48,3]]},"220":{"position":[[52,3]]},"248":{"position":[[6,4]]},"251":{"position":[[69,3]]},"252":{"position":[[212,3]]},"254":{"position":[[21,3]]},"262":{"position":[[443,3]]},"291":{"position":[[435,4]]},"300":{"position":[[630,4]]},"301":{"position":[[196,7]]},"305":{"position":[[117,3]]},"309":{"position":[[182,3]]},"313":{"position":[[6,4]]},"330":{"position":[[1,7]]},"354":{"position":[[832,4]]},"357":{"position":[[604,3]]},"367":{"position":[[235,3]]},"376":{"position":[[643,3]]},"391":{"position":[[192,3],[793,7]]},"392":{"position":[[1937,4],[2098,4],[3019,7],[3242,4],[3302,3],[5078,7]]},"394":{"position":[[112,3],[1328,3]]},"399":{"position":[[517,3]]},"403":{"position":[[348,4]]},"408":{"position":[[127,7],[3716,3],[4905,7]]},"410":{"position":[[23,7]]},"411":{"position":[[3226,7],[3629,7],[4721,5]]},"412":{"position":[[11132,3],[11353,4],[13901,7],[14445,3]]},"440":{"position":[[63,7],[189,5]]},"445":{"position":[[2229,3]]},"446":{"position":[[1339,4]]},"451":{"position":[[635,7]]},"454":{"position":[[208,3],[290,3],[397,4]]},"455":{"position":[[865,3]]},"457":{"position":[[346,3],[621,7],[641,7]]},"458":{"position":[[219,8]]},"459":{"position":[[132,7]]},"460":{"position":[[6,7],[196,3],[834,3]]},"462":{"position":[[201,3],[447,3]]},"466":{"position":[[322,7]]},"470":{"position":[[291,7]]},"479":{"position":[[292,3]]},"490":{"position":[[563,7]]},"534":{"position":[[625,3]]},"569":{"position":[[1190,3]]},"575":{"position":[[135,4]]},"581":{"position":[[428,4]]},"594":{"position":[[623,3]]},"612":{"position":[[2526,7]]},"614":{"position":[[920,3]]},"617":{"position":[[1297,3]]},"618":{"position":[[39,7]]},"623":{"position":[[427,3]]},"647":{"position":[[488,3]]},"653":{"position":[[742,8],[1027,7],[1082,8]]},"654":{"position":[[18,3],[99,3]]},"656":{"position":[[23,3],[63,3],[244,3]]},"660":{"position":[[22,3]]},"662":{"position":[[2650,3]]},"666":{"position":[[315,3],[425,3]]},"668":{"position":[[337,3],[380,3]]},"670":{"position":[[67,4],[504,3],[512,3],[544,3]]},"678":{"position":[[153,3]]},"680":{"position":[[1283,3]]},"681":{"position":[[42,3],[320,3],[560,3],[704,3],[762,4],[870,3]]},"683":{"position":[[778,3]]},"693":{"position":[[47,3]]},"699":{"position":[[690,3],[791,3],[824,4],[897,7]]},"700":{"position":[[669,8]]},"703":{"position":[[449,4],[1022,3]]},"704":{"position":[[36,3],[324,7],[530,3]]},"707":{"position":[[125,4],[252,4]]},"708":{"position":[[18,4],[572,3]]},"709":{"position":[[1315,4]]},"710":{"position":[[1299,3],[1958,3]]},"721":{"position":[[98,3]]},"724":{"position":[[1513,3]]},"726":{"position":[[94,4]]},"739":{"position":[[557,4]]},"742":{"position":[[1,3]]},"743":{"position":[[253,3]]},"746":{"position":[[65,3]]},"747":{"position":[[37,3]]},"749":{"position":[[2594,7],[2654,3],[9106,3],[12224,3],[12428,7],[15057,3],[21176,3],[23514,7]]},"752":{"position":[[483,3],[826,3],[1122,9],[1141,9]]},"754":{"position":[[108,7]]},"755":{"position":[[104,7]]},"756":{"position":[[70,3],[225,3],[281,3]]},"757":{"position":[[66,7]]},"760":{"position":[[204,3]]},"761":{"position":[[359,7]]},"764":{"position":[[59,7],[206,3]]},"770":{"position":[[557,3]]},"772":{"position":[[985,3]]},"775":{"position":[[474,3],[722,3]]},"776":{"position":[[361,4]]},"780":{"position":[[753,3]]},"784":{"position":[[523,3]]},"795":{"position":[[10,3]]},"796":{"position":[[183,4]]},"798":{"position":[[183,4],[229,3]]},"799":{"position":[[450,7]]},"815":{"position":[[154,4]]},"821":{"position":[[188,3],[219,3],[442,3],[893,5]]},"835":{"position":[[261,7]]},"836":{"position":[[917,3]]},"838":{"position":[[2864,3]]},"840":{"position":[[144,3]]},"846":{"position":[[543,7]]},"848":{"position":[[995,8]]},"851":{"position":[[184,7]]},"861":{"position":[[403,3],[456,4],[553,3]]},"862":{"position":[[1677,3]]},"863":{"position":[[422,3]]},"865":{"position":[[218,3]]},"866":{"position":[[232,4]]},"871":{"position":[[626,4]]},"872":{"position":[[230,7],[281,7],[655,7],[2779,3]]},"875":{"position":[[5706,3],[5919,7],[9187,3]]},"879":{"position":[[47,3],[185,7]]},"890":{"position":[[551,3]]},"898":{"position":[[3762,4],[4595,3]]},"908":{"position":[[290,3]]},"932":{"position":[[597,3]]},"947":{"position":[[22,4],[85,7]]},"948":{"position":[[10,3],[151,3],[230,8],[281,3]]},"951":{"position":[[89,7]]},"956":{"position":[[43,3]]},"968":{"position":[[348,4],[707,7]]},"975":{"position":[[332,3],[526,3]]},"981":{"position":[[998,7],[1614,4]]},"983":{"position":[[1103,4]]},"985":{"position":[[369,3]]},"988":{"position":[[719,3],[1213,3]]},"989":{"position":[[41,4],[198,4],[453,3]]},"993":{"position":[[366,7],[655,8]]},"995":{"position":[[147,7],[263,7],[908,7]]},"996":{"position":[[383,3]]},"998":{"position":[[10,7]]},"1003":{"position":[[31,7]]},"1010":{"position":[[118,4]]},"1022":{"position":[[977,8]]},"1023":{"position":[[641,8]]},"1026":{"position":[[176,7]]},"1030":{"position":[[167,4]]},"1031":{"position":[[44,3]]},"1032":{"position":[[10,3]]},"1033":{"position":[[21,8]]},"1059":{"position":[[1,4]]},"1060":{"position":[[1,4]]},"1061":{"position":[[1,4]]},"1066":{"position":[[314,7]]},"1067":{"position":[[779,3],[961,3],[1196,3],[1426,3],[1798,7],[1891,3]]},"1068":{"position":[[179,3],[319,7]]},"1069":{"position":[[215,3]]},"1071":{"position":[[317,3]]},"1072":{"position":[[664,4],[1449,4]]},"1085":{"position":[[3766,3]]},"1088":{"position":[[88,7]]},"1092":{"position":[[448,3]]},"1093":{"position":[[12,7],[482,3]]},"1105":{"position":[[948,3],[1144,3]]},"1110":{"position":[[35,3]]},"1115":{"position":[[716,3]]},"1124":{"position":[[1529,7],[1587,3],[1810,3]]},"1125":{"position":[[635,3],[834,3]]},"1126":{"position":[[163,3]]},"1133":{"position":[[415,3]]},"1138":{"position":[[390,3]]},"1139":{"position":[[40,3],[95,3]]},"1143":{"position":[[517,4]]},"1145":{"position":[[40,3],[91,3]]},"1161":{"position":[[58,3]]},"1164":{"position":[[451,3],[1367,8]]},"1165":{"position":[[211,3],[692,4]]},"1170":{"position":[[13,3]]},"1174":{"position":[[510,3]]},"1175":{"position":[[378,7],[533,4],[686,3]]},"1180":{"position":[[58,3],[363,3]]},"1183":{"position":[[331,4]]},"1184":{"position":[[33,7],[187,3]]},"1185":{"position":[[1,7],[100,3]]},"1192":{"position":[[127,3]]},"1194":{"position":[[79,3],[876,3],[1027,4]]},"1210":{"position":[[32,3]]},"1212":{"position":[[18,3]]},"1228":{"position":[[216,4]]},"1231":{"position":[[61,3],[364,3]]},"1238":{"position":[[89,3],[216,3]]},"1246":{"position":[[90,3],[434,3],[2073,3]]},"1250":{"position":[[27,3],[166,4],[395,4],[484,3]]},"1251":{"position":[[358,3]]},"1271":{"position":[[479,3]]},"1276":{"position":[[53,3]]},"1280":{"position":[[99,7]]},"1294":{"position":[[1009,3]]},"1295":{"position":[[867,7],[973,7],[1282,3]]},"1296":{"position":[[363,3],[564,4],[1662,7]]},"1297":{"position":[[106,4],[559,4]]},"1300":{"position":[[503,3],[678,8]]},"1301":{"position":[[638,4]]},"1304":{"position":[[520,7],[595,3],[823,3]]},"1309":{"position":[[204,3]]},"1313":{"position":[[46,3],[168,3]]},"1314":{"position":[[408,3]]},"1315":{"position":[[57,3],[786,3],[1095,7],[1168,4],[1269,5],[1665,3]]},"1316":{"position":[[211,3],[761,4],[977,4],[1187,4],[1552,7],[1722,3],[1913,7],[1971,3],[2370,3]]},"1317":{"position":[[554,7]]},"1318":{"position":[[661,7],[728,3],[1152,3]]},"1321":{"position":[[239,3],[522,4]]},"1323":{"position":[[13,3]]},"1324":{"position":[[45,3],[533,4],[731,3]]}},"keywords":{}}],["runaway",{"_index":1701,"title":{},"content":{"298":{"position":[[29,7]]}},"keywords":{}}],["runeach",{"_index":3754,"title":{},"content":{"653":{"position":[[898,9],[946,8]]}},"keywords":{}}],["runsnew",{"_index":4526,"title":{},"content":{"767":{"position":[[168,7]]}},"keywords":{}}],["runtim",{"_index":8,"title":{"254":{"position":[[34,8]]},"640":{"position":[[41,8]]},"783":{"position":[[24,9]]}},"content":{"1":{"position":[[90,7]]},"36":{"position":[[110,9]]},"174":{"position":[[940,7]]},"188":{"position":[[157,8],[191,7],[238,8],[1864,8]]},"207":{"position":[[260,7]]},"369":{"position":[[1441,7]]},"437":{"position":[[169,8]]},"438":{"position":[[65,8],[166,8]]},"440":{"position":[[21,7]]},"489":{"position":[[203,7]]},"556":{"position":[[196,8]]},"640":{"position":[[518,7]]},"662":{"position":[[635,7]]},"674":{"position":[[146,7]]},"707":{"position":[[13,7],[466,8]]},"729":{"position":[[252,8]]},"743":{"position":[[143,8]]},"749":{"position":[[1137,8],[21197,8]]},"783":{"position":[[419,9]]},"820":{"position":[[436,8]]},"821":{"position":[[400,8]]},"824":{"position":[[218,8]]},"904":{"position":[[555,9]]},"962":{"position":[[318,9]]},"964":{"position":[[99,8]]},"968":{"position":[[177,8]]},"1085":{"position":[[2558,8]]},"1191":{"position":[[158,7],[187,8]]},"1202":{"position":[[291,8]]},"1203":{"position":[[46,9]]},"1274":{"position":[[405,8]]},"1279":{"position":[[792,8]]},"1282":{"position":[[17,8]]}},"keywords":{}}],["runtime’",{"_index":1568,"title":{},"content":{"254":{"position":[[266,9]]}},"keywords":{}}],["rust",{"_index":2559,"title":{},"content":{"408":{"position":[[3555,5]]}},"keywords":{}}],["rxappwritereplicationst",{"_index":4910,"title":{},"content":{"862":{"position":[[1593,26]]}},"keywords":{}}],["rxattach",{"_index":4480,"title":{"922":{"position":[[0,13]]}},"content":{"754":{"position":[[16,13]]},"792":{"position":[[75,13]]},"917":{"position":[[541,13]]},"919":{"position":[[12,12]]},"922":{"position":[[53,12]]},"1004":{"position":[[182,13]]},"1081":{"position":[[100,13]]}},"keywords":{}}],["rxcachereplacementpolici",{"_index":4703,"title":{},"content":{"818":{"position":[[82,25]]}},"keywords":{}}],["rxcollect",{"_index":1276,"title":{"933":{"position":[[0,12]]},"1013":{"position":[[40,13]]}},"content":{"188":{"position":[[2742,12]]},"397":{"position":[[101,13]]},"653":{"position":[[592,12]]},"717":{"position":[[1261,12]]},"723":{"position":[[1106,13],[1402,13]]},"734":{"position":[[580,13]]},"749":{"position":[[7747,12],[8744,12],[14503,13],[14701,12],[24308,12]]},"766":{"position":[[260,12]]},"767":{"position":[[290,12]]},"768":{"position":[[249,12]]},"769":{"position":[[264,12]]},"793":{"position":[[117,12]]},"806":{"position":[[448,12]]},"818":{"position":[[120,12],[399,13]]},"826":{"position":[[72,14]]},"847":{"position":[[70,12]]},"854":{"position":[[561,13]]},"862":{"position":[[329,12]]},"866":{"position":[[241,13],[282,13]]},"875":{"position":[[295,13]]},"916":{"position":[[109,13]]},"957":{"position":[[52,13]]},"958":{"position":[[327,12],[431,12],[563,13]]},"979":{"position":[[25,12],[152,12]]},"987":{"position":[[576,12]]},"988":{"position":[[43,12]]},"1013":{"position":[[667,12]]},"1020":{"position":[[42,12],[72,12]]},"1027":{"position":[[122,12]]},"1100":{"position":[[113,12]]},"1107":{"position":[[1083,14]]},"1111":{"position":[[73,12]]},"1121":{"position":[[56,12]]},"1231":{"position":[[957,13]]}},"keywords":{}}],["rxcollection.addhook",{"_index":4237,"title":{},"content":{"749":{"position":[[7647,22]]}},"keywords":{}}],["rxcollection.cleanup",{"_index":3760,"title":{},"content":{"654":{"position":[[58,23]]}},"keywords":{}}],["rxcollection.find",{"_index":4229,"title":{},"content":{"749":{"position":[[7183,19]]}},"keywords":{}}],["rxcollection.findon",{"_index":4232,"title":{},"content":{"749":{"position":[[7307,22]]}},"keywords":{}}],["rxcollection.importjson",{"_index":4309,"title":{},"content":{"749":{"position":[[13385,26],[13514,26]]}},"keywords":{}}],["rxcollection.incrementalupsert",{"_index":4227,"title":{},"content":{"749":{"position":[[7064,32]]}},"keywords":{}}],["rxcollection.insert",{"_index":3883,"title":{},"content":{"683":{"position":[[142,21]]},"749":{"position":[[6832,21]]},"767":{"position":[[75,19]]}},"keywords":{}}],["rxcollection.orm",{"_index":4247,"title":{},"content":{"749":{"position":[[8441,17]]}},"keywords":{}}],["rxcollection.upsert",{"_index":4225,"title":{},"content":{"749":{"position":[[6956,21]]}},"keywords":{}}],["rxconflicthandler<any>",{"_index":6496,"title":{},"content":{"1309":{"position":[[521,28]]}},"keywords":{}}],["rxcouchdbreplicationst",{"_index":4831,"title":{},"content":{"846":{"position":[[1359,25]]}},"keywords":{}}],["rxcouchdbreplicationstate.awaitinitialrepl",{"_index":4328,"title":{},"content":{"749":{"position":[[14769,51],[14925,51]]}},"keywords":{}}],["rxdatabas",{"_index":843,"title":{"959":{"position":[[0,10]]},"1013":{"position":[[26,10]]},"1213":{"position":[[38,10]]}},"content":{"55":{"position":[[655,11]]},"188":{"position":[[487,10],[942,10],[2627,10]]},"366":{"position":[[491,10]]},"653":{"position":[[46,10]]},"693":{"position":[[93,10],[558,10]]},"717":{"position":[[884,10]]},"719":{"position":[[353,10]]},"734":{"position":[[397,11]]},"749":{"position":[[3384,10],[3556,10],[5585,10],[14489,10],[23989,10]]},"759":{"position":[[332,10]]},"767":{"position":[[275,10]]},"768":{"position":[[234,10]]},"769":{"position":[[249,10]]},"793":{"position":[[97,10]]},"806":{"position":[[433,10]]},"872":{"position":[[2927,10],[3663,10]]},"892":{"position":[[129,10]]},"934":{"position":[[46,10]]},"955":{"position":[[51,11]]},"958":{"position":[[370,11]]},"961":{"position":[[80,11]]},"966":{"position":[[40,10]]},"967":{"position":[[36,11]]},"970":{"position":[[83,11]]},"974":{"position":[[43,10]]},"977":{"position":[[397,10],[516,10]]},"978":{"position":[[52,11]]},"979":{"position":[[81,11]]},"1013":{"position":[[262,10],[695,11],[752,10]]},"1027":{"position":[[138,10]]},"1085":{"position":[[3675,10]]},"1088":{"position":[[403,10]]},"1097":{"position":[[189,10]]},"1114":{"position":[[43,11],[148,11]]},"1119":{"position":[[346,11]]},"1124":{"position":[[1631,10],[2159,10]]},"1125":{"position":[[782,10]]},"1138":{"position":[[130,11]]},"1154":{"position":[[680,10]]},"1163":{"position":[[468,10]]},"1164":{"position":[[600,10]]},"1165":{"position":[[275,11]]},"1174":{"position":[[786,11]]},"1182":{"position":[[472,10]]},"1188":{"position":[[305,10]]},"1189":{"position":[[191,11]]},"1213":{"position":[[357,11],[382,10],[784,10]]},"1219":{"position":[[469,10]]},"1222":{"position":[[1327,10]]},"1227":{"position":[[446,10]]},"1230":{"position":[[46,10],[315,10]]},"1231":{"position":[[179,10],[942,10]]},"1233":{"position":[[234,10]]},"1246":{"position":[[2119,10]]},"1265":{"position":[[439,11]]},"1267":{"position":[[111,11],[229,11]]},"1271":{"position":[[951,11]]},"1277":{"position":[[129,11]]}},"keywords":{}}],["rxdatabase.addcollect",{"_index":4198,"title":{},"content":{"749":{"position":[[4858,28],[4990,28],[5142,28],[5244,28],[5356,28],[6344,28]]},"752":{"position":[[89,27]]}},"keywords":{}}],["rxdatabase.migrationst",{"_index":4473,"title":{},"content":{"753":{"position":[[1,28]]}},"keywords":{}}],["rxdatabase.serv",{"_index":4414,"title":{},"content":{"749":{"position":[[22277,19]]}},"keywords":{}}],["rxdatabaseprovid",{"_index":4436,"title":{},"content":{"749":{"position":[[24011,18]]},"829":{"position":[[1031,19],[1302,18]]},"832":{"position":[[158,19]]}},"keywords":{}}],["rxdatabasestate.collection.find",{"_index":1288,"title":{},"content":{"188":{"position":[[3065,34]]}},"keywords":{}}],["rxdb",{"_index":25,"title":{"13":{"position":[[16,5]]},"44":{"position":[[46,4]]},"48":{"position":[[7,4]]},"49":{"position":[[11,5]]},"56":{"position":[[31,5]]},"57":{"position":[[9,4]]},"62":{"position":[[18,4]]},"71":{"position":[[4,4]]},"85":{"position":[[0,5]]},"102":{"position":[[4,4]]},"115":{"position":[[0,4]]},"118":{"position":[[12,4]]},"119":{"position":[[21,5]]},"120":{"position":[[8,6]]},"126":{"position":[[0,4]]},"127":{"position":[[6,4]]},"128":{"position":[[11,4]]},"130":{"position":[[41,4]]},"131":{"position":[[31,5]]},"132":{"position":[[24,4]]},"137":{"position":[[9,4]]},"142":{"position":[[25,4]]},"150":{"position":[[0,4]]},"151":{"position":[[51,5]]},"153":{"position":[[12,4]]},"154":{"position":[[21,5]]},"155":{"position":[[8,6]]},"161":{"position":[[0,4]]},"162":{"position":[[31,5]]},"163":{"position":[[24,4]]},"165":{"position":[[0,4]]},"166":{"position":[[9,4]]},"171":{"position":[[6,4]]},"174":{"position":[[4,4]]},"176":{"position":[[0,4]]},"179":{"position":[[12,4]]},"180":{"position":[[21,5]]},"181":{"position":[[8,6]]},"186":{"position":[[0,4]]},"187":{"position":[[6,4]]},"188":{"position":[[4,4]]},"189":{"position":[[31,5]]},"190":{"position":[[24,4]]},"192":{"position":[[0,4]]},"193":{"position":[[9,4]]},"199":{"position":[[0,4]]},"200":{"position":[[4,4]]},"209":{"position":[[18,4]]},"212":{"position":[[3,4]]},"213":{"position":[[0,4]]},"229":{"position":[[4,4]]},"246":{"position":[[0,4]]},"247":{"position":[[11,4]]},"256":{"position":[[21,4]]},"257":{"position":[[8,6]]},"262":{"position":[[3,4]]},"264":{"position":[[0,4]]},"267":{"position":[[14,5]]},"268":{"position":[[16,4]]},"271":{"position":[[12,4]]},"272":{"position":[[21,5]]},"273":{"position":[[8,6]]},"284":{"position":[[6,4]]},"285":{"position":[[6,5]]},"286":{"position":[[6,4]]},"287":{"position":[[31,5]]},"288":{"position":[[25,4]]},"289":{"position":[[0,4]]},"290":{"position":[[0,4]]},"291":{"position":[[0,4]]},"307":{"position":[[0,4]]},"308":{"position":[[4,4]]},"314":{"position":[[26,4]]},"317":{"position":[[0,4]]},"319":{"position":[[0,4]]},"322":{"position":[[12,4]]},"324":{"position":[[21,5]]},"325":{"position":[[8,6]]},"331":{"position":[[0,4]]},"332":{"position":[[6,4]]},"333":{"position":[[11,5]]},"336":{"position":[[31,5]]},"337":{"position":[[24,4]]},"341":{"position":[[9,4]]},"346":{"position":[[25,4]]},"348":{"position":[[36,4]]},"359":{"position":[[0,5]]},"361":{"position":[[26,5]]},"363":{"position":[[0,4]]},"368":{"position":[[16,4]]},"369":{"position":[[0,4]]},"370":{"position":[[0,4]]},"371":{"position":[[0,4]]},"374":{"position":[[33,4]]},"378":{"position":[[4,4]]},"389":{"position":[[27,4]]},"392":{"position":[[26,5]]},"397":{"position":[[30,5]]},"443":{"position":[[18,4]]},"445":{"position":[[12,5]]},"446":{"position":[[14,4]]},"472":{"position":[[0,4]]},"479":{"position":[[12,4]]},"481":{"position":[[26,5]]},"484":{"position":[[31,4]]},"488":{"position":[[33,5]]},"499":{"position":[[0,4]]},"501":{"position":[[12,4]]},"502":{"position":[[21,5]]},"503":{"position":[[6,4]]},"505":{"position":[[9,4]]},"512":{"position":[[0,4]]},"513":{"position":[[12,4]]},"514":{"position":[[8,6]]},"520":{"position":[[0,4]]},"521":{"position":[[40,5]]},"522":{"position":[[6,4]]},"523":{"position":[[6,4]]},"524":{"position":[[31,5]]},"525":{"position":[[24,4]]},"526":{"position":[[9,4]]},"532":{"position":[[48,4]]},"536":{"position":[[7,4]]},"537":{"position":[[11,5]]},"543":{"position":[[29,5]]},"544":{"position":[[9,4]]},"552":{"position":[[25,4]]},"553":{"position":[[11,4]]},"554":{"position":[[15,4]]},"558":{"position":[[72,4]]},"561":{"position":[[37,4]]},"562":{"position":[[0,4]]},"564":{"position":[[36,5]]},"566":{"position":[[39,5]]},"573":{"position":[[0,4]]},"575":{"position":[[12,4]]},"576":{"position":[[0,4]]},"577":{"position":[[21,5]]},"580":{"position":[[19,4]]},"581":{"position":[[31,5]]},"582":{"position":[[24,4]]},"583":{"position":[[9,4]]},"590":{"position":[[25,4]]},"592":{"position":[[46,4]]},"596":{"position":[[7,4]]},"597":{"position":[[11,5]]},"603":{"position":[[27,5]]},"604":{"position":[[9,4]]},"629":{"position":[[35,4]]},"631":{"position":[[0,5]]},"640":{"position":[[10,4]]},"657":{"position":[[29,4]]},"662":{"position":[[0,5]]},"677":{"position":[[0,4]]},"678":{"position":[[0,4]]},"706":{"position":[[20,4]]},"710":{"position":[[0,5]]},"711":{"position":[[30,5]]},"713":{"position":[[32,4]]},"717":{"position":[[10,4]]},"724":{"position":[[10,4]]},"725":{"position":[[8,4]]},"731":{"position":[[22,4]]},"744":{"position":[[0,4]]},"748":{"position":[[0,4]]},"749":{"position":[[4,4]]},"760":{"position":[[24,4]]},"761":{"position":[[25,4]]},"773":{"position":[[0,4]]},"775":{"position":[[42,5]]},"793":{"position":[[0,4]]},"794":{"position":[[21,4]]},"804":{"position":[[0,5]]},"823":{"position":[[0,4]]},"838":{"position":[[0,5]]},"859":{"position":[[0,4]]},"860":{"position":[[19,4]]},"862":{"position":[[15,4]]},"868":{"position":[[4,4]]},"869":{"position":[[31,4]]},"874":{"position":[[41,4]]},"877":{"position":[[0,4]]},"886":{"position":[[0,4]]},"895":{"position":[[32,4]]},"896":{"position":[[20,4]]},"898":{"position":[[11,4]]},"900":{"position":[[28,4]]},"903":{"position":[[47,4]]},"904":{"position":[[6,4]]},"1006":{"position":[[18,5]]},"1096":{"position":[[0,4]]},"1113":{"position":[[41,4]]},"1122":{"position":[[0,4]]},"1131":{"position":[[0,4]]},"1144":{"position":[[37,5]]},"1147":{"position":[[35,5]]},"1149":{"position":[[11,4]]},"1158":{"position":[[43,5]]},"1190":{"position":[[12,4]]},"1205":{"position":[[52,4]]},"1210":{"position":[[27,5]]},"1248":{"position":[[0,4]]},"1304":{"position":[[4,4]]},"1310":{"position":[[6,4]]}},"content":{"1":{"position":[[352,6]]},"2":{"position":[[6,4]]},"8":{"position":[[758,7]]},"13":{"position":[[1,4],[230,4],[336,5]]},"14":{"position":[[948,4],[1081,4],[1201,4]]},"16":{"position":[[367,5]]},"19":{"position":[[982,4]]},"24":{"position":[[514,4]]},"28":{"position":[[641,4],[791,4]]},"33":{"position":[[304,5],[528,4],[617,4]]},"34":{"position":[[393,4],[538,4],[677,4]]},"35":{"position":[[468,4]]},"37":{"position":[[301,4]]},"39":{"position":[[606,5]]},"40":{"position":[[615,5],[823,4]]},"42":{"position":[[200,4],[229,4],[331,4]]},"43":{"position":[[195,4],[241,4]]},"47":{"position":[[774,5],[974,4],[1272,4]]},"49":{"position":[[17,4],[74,4]]},"50":{"position":[[1,4],[218,4]]},"51":{"position":[[1,4]]},"53":{"position":[[18,4]]},"55":{"position":[[54,4]]},"56":{"position":[[28,4],[79,4]]},"57":{"position":[[44,4],[132,4],[184,4],[305,4],[376,4],[478,4]]},"58":{"position":[[209,4]]},"59":{"position":[[150,4],[288,4]]},"60":{"position":[[87,5]]},"61":{"position":[[30,4],[119,4],[165,4],[182,4],[254,4],[419,4]]},"71":{"position":[[1,4]]},"72":{"position":[[1,4]]},"73":{"position":[[31,5]]},"74":{"position":[[1,4]]},"75":{"position":[[1,4]]},"76":{"position":[[70,4]]},"79":{"position":[[1,4]]},"80":{"position":[[47,4]]},"83":{"position":[[16,4],[351,4]]},"84":{"position":[[23,4],[115,4],[179,4],[290,4],[405,4]]},"94":{"position":[[30,5]]},"95":{"position":[[119,5]]},"99":{"position":[[289,4]]},"102":{"position":[[1,4],[97,4]]},"103":{"position":[[1,4]]},"104":{"position":[[1,4]]},"105":{"position":[[88,5]]},"106":{"position":[[1,4]]},"107":{"position":[[1,4]]},"108":{"position":[[1,4]]},"109":{"position":[[1,4]]},"110":{"position":[[1,4]]},"111":{"position":[[28,4]]},"112":{"position":[[1,4]]},"113":{"position":[[1,4]]},"114":{"position":[[23,4],[128,4],[192,4],[303,4],[418,4],[442,4]]},"118":{"position":[[1,4],[234,4]]},"119":{"position":[[27,5]]},"120":{"position":[[1,4],[206,4]]},"121":{"position":[[16,4],[63,4],[170,5]]},"122":{"position":[[33,4],[152,4]]},"123":{"position":[[1,4],[189,4]]},"124":{"position":[[1,4]]},"125":{"position":[[1,4],[144,4]]},"126":{"position":[[76,4]]},"127":{"position":[[42,4]]},"128":{"position":[[8,4],[109,4],[179,4],[223,4]]},"129":{"position":[[234,4],[507,5],[522,4]]},"130":{"position":[[159,5],[206,4],[349,4]]},"131":{"position":[[1,4],[211,4],[390,4],[767,4],[1000,4]]},"132":{"position":[[87,4],[258,5]]},"133":{"position":[[29,4],[146,4]]},"134":{"position":[[105,4],[262,4]]},"135":{"position":[[1,4],[216,4]]},"136":{"position":[[1,4]]},"137":{"position":[[1,4]]},"138":{"position":[[31,4]]},"139":{"position":[[1,4],[168,4]]},"140":{"position":[[1,4]]},"141":{"position":[[58,4],[116,4]]},"142":{"position":[[21,4]]},"143":{"position":[[171,4]]},"144":{"position":[[1,4]]},"145":{"position":[[148,4]]},"146":{"position":[[1,4],[329,5]]},"147":{"position":[[162,4]]},"148":{"position":[[1,4],[175,4]]},"149":{"position":[[23,4],[128,4],[192,4],[303,4],[418,4]]},"151":{"position":[[37,5],[297,5],[401,4]]},"153":{"position":[[1,5],[177,4],[269,5]]},"155":{"position":[[1,4]]},"156":{"position":[[33,4]]},"157":{"position":[[1,4]]},"158":{"position":[[1,4]]},"159":{"position":[[1,4]]},"160":{"position":[[1,4]]},"161":{"position":[[143,5],[306,4]]},"162":{"position":[[1,4]]},"164":{"position":[[23,4]]},"165":{"position":[[1,4]]},"166":{"position":[[71,4],[314,4]]},"167":{"position":[[48,4],[246,4]]},"168":{"position":[[1,4]]},"169":{"position":[[47,4]]},"170":{"position":[[1,4],[252,4],[597,4]]},"173":{"position":[[1198,5],[1944,5],[2231,5]]},"174":{"position":[[1,4],[133,4],[190,4],[465,4],[983,4],[1295,4],[1561,4],[1800,4],[2093,5],[2380,4],[2609,4]]},"175":{"position":[[20,4],[121,4],[185,4],[296,4],[409,4],[446,4]]},"179":{"position":[[1,4],[264,4]]},"180":{"position":[[19,4]]},"181":{"position":[[1,4]]},"182":{"position":[[29,4],[206,5]]},"183":{"position":[[1,4]]},"184":{"position":[[77,4],[228,4]]},"185":{"position":[[1,4]]},"186":{"position":[[170,4]]},"187":{"position":[[45,5]]},"188":{"position":[[1,4],[166,4],[415,5],[586,4],[671,7],[1994,4],[2066,4],[2241,4],[2304,5],[2403,4]]},"189":{"position":[[1,4],[203,5],[392,4]]},"190":{"position":[[29,4]]},"192":{"position":[[1,4]]},"193":{"position":[[1,4]]},"194":{"position":[[100,4]]},"195":{"position":[[38,4]]},"196":{"position":[[1,4]]},"197":{"position":[[60,4]]},"198":{"position":[[1,4],[187,4],[285,4],[516,4]]},"201":{"position":[[92,4]]},"202":{"position":[[68,4]]},"203":{"position":[[88,5],[217,4]]},"204":{"position":[[150,5]]},"205":{"position":[[61,4]]},"206":{"position":[[127,5]]},"208":{"position":[[1,4]]},"210":{"position":[[45,4]]},"211":{"position":[[9,4],[27,4]]},"212":{"position":[[219,4]]},"222":{"position":[[31,5]]},"226":{"position":[[356,5]]},"229":{"position":[[1,4],[175,4]]},"230":{"position":[[1,4],[92,4]]},"231":{"position":[[1,4],[205,4]]},"232":{"position":[[80,4]]},"233":{"position":[[1,4]]},"234":{"position":[[1,4],[212,4]]},"235":{"position":[[1,4]]},"236":{"position":[[1,4]]},"237":{"position":[[1,4]]},"238":{"position":[[208,4]]},"239":{"position":[[1,4],[222,4]]},"240":{"position":[[122,4]]},"241":{"position":[[20,4],[121,4],[177,4],[284,5],[365,4]]},"247":{"position":[[148,5]]},"248":{"position":[[1,4]]},"249":{"position":[[19,4]]},"250":{"position":[[160,4]]},"251":{"position":[[55,5],[238,4]]},"252":{"position":[[110,5]]},"253":{"position":[[120,4]]},"254":{"position":[[1,4]]},"255":{"position":[[1,4],[320,4],[1783,4]]},"257":{"position":[[13,4]]},"260":{"position":[[117,4],[313,4]]},"261":{"position":[[47,4],[554,4]]},"262":{"position":[[233,5],[395,5]]},"263":{"position":[[224,4],[394,4],[464,4],[570,4]]},"265":{"position":[[36,4],[382,5],[520,4],[756,4]]},"266":{"position":[[7,4],[573,7]]},"267":{"position":[[1124,4],[1562,4]]},"271":{"position":[[1,4],[282,4]]},"273":{"position":[[14,4],[243,4]]},"274":{"position":[[37,4],[265,4]]},"277":{"position":[[1,4]]},"278":{"position":[[96,4],[213,4]]},"279":{"position":[[23,5]]},"280":{"position":[[110,4],[322,4]]},"281":{"position":[[137,4],[278,4]]},"282":{"position":[[137,5]]},"283":{"position":[[194,4]]},"284":{"position":[[140,5]]},"285":{"position":[[22,4],[74,4],[179,4],[403,4]]},"286":{"position":[[1,4],[210,4]]},"287":{"position":[[1,4],[1199,4]]},"288":{"position":[[198,4]]},"289":{"position":[[323,4],[788,4],[1099,5],[1177,4],[1673,5]]},"290":{"position":[[70,4],[171,4]]},"291":{"position":[[1,4],[138,4]]},"292":{"position":[[49,4]]},"293":{"position":[[109,4],[253,4]]},"294":{"position":[[51,4]]},"295":{"position":[[39,4],[76,4],[289,4]]},"296":{"position":[[13,4],[51,4],[75,4]]},"303":{"position":[[294,4]]},"306":{"position":[[230,4]]},"309":{"position":[[131,4],[282,4]]},"310":{"position":[[75,4],[312,4]]},"312":{"position":[[43,4],[240,4]]},"313":{"position":[[1,4]]},"314":{"position":[[215,4],[246,4],[264,4],[1012,4]]},"315":{"position":[[1115,4]]},"316":{"position":[[36,4],[422,4]]},"318":{"position":[[142,4],[378,4],[409,4],[475,4],[544,4],[555,4]]},"321":{"position":[[457,5]]},"322":{"position":[[1,4],[161,5]]},"323":{"position":[[25,4],[591,4]]},"325":{"position":[[1,4]]},"327":{"position":[[233,4]]},"328":{"position":[[1,4]]},"329":{"position":[[28,4],[105,4]]},"330":{"position":[[43,4]]},"331":{"position":[[221,4]]},"333":{"position":[[9,4],[55,4],[177,4],[236,4]]},"334":{"position":[[48,4],[198,7]]},"335":{"position":[[20,4]]},"336":{"position":[[1,4]]},"338":{"position":[[168,4]]},"339":{"position":[[51,4]]},"340":{"position":[[6,5]]},"343":{"position":[[1,4]]},"346":{"position":[[52,4],[291,4]]},"347":{"position":[[23,4],[128,4],[192,4],[303,4],[416,4],[485,4]]},"350":{"position":[[183,4]]},"357":{"position":[[632,4]]},"359":{"position":[[53,4]]},"360":{"position":[[21,4],[254,4],[685,4]]},"362":{"position":[[737,4],[958,4],[1103,4],[1199,4],[1263,4],[1374,4],[1487,4],[1556,4]]},"365":{"position":[[422,5],[827,5],[1533,4]]},"366":{"position":[[392,4]]},"367":{"position":[[292,4],[442,4],[557,4],[674,4]]},"368":{"position":[[1,4],[100,4],[259,5]]},"369":{"position":[[63,4],[130,4],[588,4],[1327,4]]},"370":{"position":[[78,4]]},"371":{"position":[[54,4]]},"372":{"position":[[95,4]]},"373":{"position":[[20,4],[121,4],[177,4],[284,5],[366,4]]},"378":{"position":[[1,4],[186,4]]},"379":{"position":[[16,4]]},"380":{"position":[[124,4]]},"381":{"position":[[23,4],[361,4],[495,4]]},"382":{"position":[[46,4]]},"383":{"position":[[501,4]]},"384":{"position":[[1,4]]},"385":{"position":[[81,4],[202,4]]},"386":{"position":[[1,4]]},"387":{"position":[[17,4],[413,4]]},"388":{"position":[[111,4],[134,4],[244,4],[483,4]]},"390":{"position":[[1792,4]]},"392":{"position":[[54,4],[240,7],[1186,5],[2362,4]]},"393":{"position":[[307,4],[909,5]]},"397":{"position":[[63,4]]},"400":{"position":[[321,4]]},"402":{"position":[[2648,4],[2662,4]]},"403":{"position":[[184,4],[300,4]]},"405":{"position":[[110,4],[124,4],[153,4]]},"408":{"position":[[4663,5]]},"411":{"position":[[3392,4]]},"412":{"position":[[1842,4],[4427,5]]},"420":{"position":[[152,4],[955,4],[1025,4]]},"422":{"position":[[111,5],[450,5]]},"429":{"position":[[479,4]]},"432":{"position":[[1047,4]]},"440":{"position":[[481,5]]},"441":{"position":[[466,5]]},"442":{"position":[[40,4],[52,4]]},"445":{"position":[[3,5],[223,4],[369,4],[457,4],[822,4],[1253,4],[1695,4],[1930,4],[1977,4],[2156,4],[2418,5]]},"446":{"position":[[29,4],[187,4],[316,4],[588,5],[1013,4],[1263,4]]},"447":{"position":[[97,5],[373,4],[551,4],[658,4]]},"453":{"position":[[810,4]]},"456":{"position":[[136,4]]},"458":{"position":[[1319,5]]},"460":{"position":[[331,4]]},"469":{"position":[[493,4],[604,4],[909,4],[1331,4]]},"471":{"position":[[95,4],[109,4],[138,4]]},"479":{"position":[[1,4],[296,4],[491,4]]},"480":{"position":[[43,4]]},"481":{"position":[[1,4],[447,4]]},"482":{"position":[[57,4]]},"483":{"position":[[199,5],[356,4],[570,4],[940,4],[1186,5]]},"488":{"position":[[64,5]]},"489":{"position":[[57,5],[223,4],[463,4]]},"490":{"position":[[203,4],[348,4],[490,4],[590,4]]},"491":{"position":[[115,4],[269,4],[481,4],[850,4],[1922,5]]},"494":{"position":[[98,4],[550,4]]},"495":{"position":[[217,4]]},"496":{"position":[[650,5]]},"498":{"position":[[53,5],[93,4],[131,5],[257,4],[410,4],[431,4]]},"501":{"position":[[58,4],[125,4],[306,4]]},"502":{"position":[[1,4],[517,4],[1148,4]]},"503":{"position":[[13,4],[126,4]]},"504":{"position":[[1,4],[554,4],[668,4],[713,4],[741,4],[924,4],[1087,4],[1300,4]]},"506":{"position":[[1,4]]},"507":{"position":[[54,4]]},"508":{"position":[[1,4]]},"509":{"position":[[1,4]]},"510":{"position":[[124,4],[339,4],[482,4],[636,5]]},"511":{"position":[[23,4],[128,4],[192,4],[303,4],[418,4]]},"513":{"position":[[1,5],[166,4]]},"514":{"position":[[1,5]]},"515":{"position":[[205,5]]},"516":{"position":[[1,4],[139,4],[289,4]]},"517":{"position":[[125,4]]},"518":{"position":[[1,4]]},"519":{"position":[[69,4]]},"520":{"position":[[60,4],[254,4],[420,4]]},"521":{"position":[[359,5],[582,4]]},"522":{"position":[[28,4],[98,4],[131,4],[156,4],[311,7]]},"523":{"position":[[5,4]]},"524":{"position":[[1,4],[314,4]]},"525":{"position":[[122,4],[392,4]]},"526":{"position":[[83,4]]},"527":{"position":[[76,4]]},"528":{"position":[[1,4]]},"529":{"position":[[1,4]]},"530":{"position":[[140,4],[288,5],[439,4],[608,4]]},"531":{"position":[[23,4],[128,4],[192,4],[303,4],[418,4]]},"535":{"position":[[506,4],[774,4],[945,4],[1243,4]]},"536":{"position":[[12,4]]},"537":{"position":[[16,4],[53,4]]},"538":{"position":[[1,4],[191,4]]},"540":{"position":[[1,4],[149,5]]},"541":{"position":[[1,4]]},"542":{"position":[[1,4],[250,4],[696,4]]},"543":{"position":[[34,4],[86,4],[217,4]]},"544":{"position":[[1,4],[76,4],[163,4]]},"546":{"position":[[183,4],[222,4],[337,4]]},"547":{"position":[[87,5]]},"548":{"position":[[18,4],[32,4],[88,4],[168,4],[423,4]]},"551":{"position":[[173,4]]},"553":{"position":[[9,4],[91,4]]},"554":{"position":[[1,4],[272,4],[508,7],[655,5]]},"556":{"position":[[645,4]]},"557":{"position":[[18,4],[32,4],[100,4],[152,4],[219,4],[304,4]]},"562":{"position":[[34,7]]},"563":{"position":[[1,4],[138,4]]},"564":{"position":[[143,4],[219,7]]},"565":{"position":[[62,4]]},"567":{"position":[[173,4],[338,4],[403,4],[438,4],[611,4]]},"570":{"position":[[910,4],[923,4]]},"571":{"position":[[687,4],[1285,4],[1718,4]]},"572":{"position":[[15,4],[54,4],[104,4]]},"574":{"position":[[813,4]]},"575":{"position":[[1,4]]},"576":{"position":[[76,4],[323,4]]},"577":{"position":[[43,4]]},"578":{"position":[[17,4],[84,4]]},"579":{"position":[[44,4],[200,7],[815,4]]},"580":{"position":[[1,4],[479,4]]},"581":{"position":[[1,4]]},"582":{"position":[[1,4],[155,4],[551,4]]},"585":{"position":[[31,4]]},"586":{"position":[[50,4]]},"589":{"position":[[59,4]]},"590":{"position":[[54,4],[137,4]]},"591":{"position":[[23,4],[128,4],[192,4],[303,4],[416,4],[476,4],[640,4]]},"595":{"position":[[526,4],[861,4],[1020,4],[1296,4]]},"596":{"position":[[12,4]]},"597":{"position":[[16,4],[55,4]]},"598":{"position":[[1,4],[192,4],[300,7]]},"600":{"position":[[1,4]]},"602":{"position":[[61,4]]},"603":{"position":[[34,4],[84,4],[215,4]]},"604":{"position":[[1,4],[76,4]]},"606":{"position":[[183,4],[222,4],[327,4]]},"607":{"position":[[88,5]]},"608":{"position":[[18,4],[32,4],[88,4],[168,4],[421,4]]},"616":{"position":[[956,4]]},"617":{"position":[[2178,4],[2368,5]]},"619":{"position":[[22,4]]},"626":{"position":[[606,4]]},"628":{"position":[[148,4],[197,4],[211,4],[240,4]]},"631":{"position":[[1,4]]},"632":{"position":[[1224,4]]},"634":{"position":[[41,5]]},"635":{"position":[[110,4],[210,4]]},"636":{"position":[[79,4],[307,4]]},"638":{"position":[[137,4]]},"641":{"position":[[94,4]]},"644":{"position":[[15,4],[284,4],[434,4]]},"646":{"position":[[29,7]]},"652":{"position":[[29,7]]},"653":{"position":[[150,7],[1007,4],[1363,4]]},"662":{"position":[[3,4],[368,4],[1267,4],[1277,4],[1608,4],[1872,4],[1893,4],[1903,4],[2054,4],[2064,4]]},"663":{"position":[[58,4]]},"666":{"position":[[219,4]]},"676":{"position":[[166,5],[324,5]]},"678":{"position":[[4,5],[130,4],[172,4]]},"680":{"position":[[19,5],[439,4],[472,7],[563,7]]},"685":{"position":[[133,4],[555,4]]},"686":{"position":[[86,5],[698,4],[783,4]]},"688":{"position":[[123,5],[403,4]]},"690":{"position":[[500,5]]},"693":{"position":[[8,4],[140,4],[274,4]]},"701":{"position":[[1173,5]]},"703":{"position":[[242,5],[262,4]]},"705":{"position":[[20,4],[143,4]]},"710":{"position":[[3,4],[102,4],[448,5],[914,4],[996,5],[1088,4],[1261,5],[1461,4],[1573,7],[2472,4]]},"712":{"position":[[18,4],[90,4]]},"714":{"position":[[1,4],[210,4],[672,4]]},"715":{"position":[[1,4]]},"716":{"position":[[480,4]]},"717":{"position":[[1,4],[441,4]]},"718":{"position":[[163,5],[247,5]]},"723":{"position":[[460,4],[2444,4]]},"724":{"position":[[28,4],[98,4],[165,5],[209,5],[469,5]]},"726":{"position":[[34,4],[106,4]]},"728":{"position":[[1,4]]},"729":{"position":[[14,4],[176,4]]},"731":{"position":[[45,5]]},"732":{"position":[[11,5],[97,4],[153,7]]},"737":{"position":[[509,4]]},"738":{"position":[[105,7]]},"745":{"position":[[233,5],[302,5]]},"749":{"position":[[1335,4],[7376,5],[9252,5],[12602,4],[20966,5],[21071,4],[21871,4],[23655,4],[23722,5]]},"754":{"position":[[221,7]]},"755":{"position":[[12,4]]},"756":{"position":[[259,4]]},"759":{"position":[[190,5],[273,5]]},"760":{"position":[[28,4],[78,4],[369,5],[439,4]]},"761":{"position":[[1,4],[91,4],[248,4],[407,4],[425,4],[488,5],[549,4],[614,5],[736,5]]},"763":{"position":[[1,4]]},"772":{"position":[[99,4],[301,4],[506,4],[585,4],[667,7],[1454,7],[1518,5],[2162,7]]},"773":{"position":[[31,4],[350,4],[469,7]]},"774":{"position":[[472,7],[599,5]]},"775":{"position":[[195,4]]},"776":{"position":[[15,4],[92,4],[370,4]]},"779":{"position":[[363,5]]},"781":{"position":[[736,4]]},"786":{"position":[[40,4],[52,4]]},"793":{"position":[[0,4],[898,4]]},"796":{"position":[[27,4]]},"798":{"position":[[953,4]]},"799":{"position":[[214,4],[360,4]]},"800":{"position":[[27,5],[377,4],[666,4]]},"801":{"position":[[109,4],[880,4]]},"802":{"position":[[38,4]]},"804":{"position":[[5,4],[50,4]]},"806":{"position":[[243,4]]},"815":{"position":[[12,4]]},"820":{"position":[[31,5],[109,5]]},"824":{"position":[[39,5],[442,4]]},"825":{"position":[[964,4],[1103,5],[1129,4]]},"826":{"position":[[24,4],[333,4]]},"828":{"position":[[1,4],[175,4],[271,4]]},"829":{"position":[[25,4],[62,4],[167,4],[505,7],[913,4],[3083,4],[3860,4]]},"831":{"position":[[52,4],[285,4]]},"832":{"position":[[1,4]]},"834":{"position":[[106,4]]},"838":{"position":[[3,4],[408,4],[754,4],[845,4],[1187,4],[1572,4],[1798,4],[1808,4],[1925,4],[1975,7],[2033,4],[2043,4],[2395,4],[3196,4],[3276,4],[3395,4]]},"841":{"position":[[44,4]]},"842":{"position":[[27,4],[79,4],[192,4]]},"846":{"position":[[812,5]]},"855":{"position":[[1,4]]},"856":{"position":[[165,4],[178,4]]},"857":{"position":[[22,4],[490,4]]},"860":{"position":[[156,4],[338,4],[481,4],[747,4],[984,4]]},"861":{"position":[[1362,4],[1462,4],[1533,4],[1642,4],[1758,5],[2185,5]]},"862":{"position":[[91,4],[149,6],[177,4],[212,5],[1477,4]]},"863":{"position":[[883,4],[971,4]]},"865":{"position":[[234,4]]},"866":{"position":[[147,4]]},"867":{"position":[[1,4]]},"868":{"position":[[4,4]]},"870":{"position":[[41,4],[194,4]]},"871":{"position":[[319,4],[621,4]]},"872":{"position":[[76,4],[135,4],[140,4],[1350,4],[1397,4],[1586,7],[1682,4],[2219,4],[3131,5],[3200,5],[3808,7],[3912,5]]},"873":{"position":[[21,4],[103,4]]},"875":{"position":[[32,4],[45,4],[1382,4],[1512,5],[1914,4],[6746,4]]},"876":{"position":[[81,4]]},"878":{"position":[[52,4],[212,5]]},"884":{"position":[[74,4]]},"885":{"position":[[321,4]]},"886":{"position":[[273,4],[1303,4],[1584,4]]},"887":{"position":[[63,4]]},"888":{"position":[[118,5],[359,7]]},"889":{"position":[[811,4]]},"890":{"position":[[1004,4]]},"892":{"position":[[34,7]]},"896":{"position":[[156,4],[296,4]]},"898":{"position":[[37,4],[675,4],[1549,4],[1597,4],[3153,4],[4279,4]]},"903":{"position":[[481,4],[576,4]]},"904":{"position":[[201,4],[500,4],[1775,5],[2228,4],[2663,4]]},"906":{"position":[[38,4],[183,4]]},"908":{"position":[[387,4]]},"911":{"position":[[358,4],[498,5]]},"912":{"position":[[63,4],[216,4]]},"913":{"position":[[15,4],[63,4],[180,4],[244,4]]},"915":{"position":[[97,7]]},"917":{"position":[[108,7]]},"922":{"position":[[20,4]]},"927":{"position":[[83,5]]},"932":{"position":[[809,5]]},"936":{"position":[[72,4],[143,4]]},"952":{"position":[[200,7]]},"958":{"position":[[543,5],[779,5]]},"960":{"position":[[86,4]]},"962":{"position":[[1,4]]},"965":{"position":[[208,4],[401,4]]},"966":{"position":[[183,4]]},"968":{"position":[[13,4]]},"971":{"position":[[312,7]]},"977":{"position":[[572,7]]},"978":{"position":[[116,7]]},"981":{"position":[[72,4],[342,5],[483,4],[609,5],[1517,4]]},"985":{"position":[[302,4]]},"986":{"position":[[1230,4]]},"988":{"position":[[209,7],[361,4],[1150,4],[1856,4],[3984,4],[4577,5]]},"989":{"position":[[72,4],[385,4]]},"990":{"position":[[61,4]]},"995":{"position":[[549,4]]},"1002":{"position":[[916,4]]},"1004":{"position":[[44,4]]},"1005":{"position":[[143,4]]},"1007":{"position":[[27,4],[181,4],[655,4]]},"1012":{"position":[[105,7]]},"1041":{"position":[[178,7]]},"1044":{"position":[[108,4]]},"1064":{"position":[[135,7]]},"1065":{"position":[[465,4],[1529,4],[1663,4],[1820,4]]},"1068":{"position":[[253,4]]},"1069":{"position":[[9,4]]},"1071":{"position":[[34,4]]},"1072":{"position":[[56,4],[72,4],[130,4],[420,4],[621,4],[659,4],[765,4],[946,4],[1019,4],[1181,4],[1224,4],[1622,4],[1660,4],[2028,4]]},"1078":{"position":[[938,4]]},"1079":{"position":[[1,4],[331,4],[489,4]]},"1080":{"position":[[1041,4]]},"1084":{"position":[[439,4]]},"1085":{"position":[[30,4],[323,5],[730,4],[912,4],[1619,4],[1687,4],[1924,4],[2391,4],[3174,4]]},"1088":{"position":[[100,4],[147,4]]},"1090":{"position":[[620,5],[709,5]]},"1091":{"position":[[14,4]]},"1092":{"position":[[50,4]]},"1093":{"position":[[197,4]]},"1094":{"position":[[211,4]]},"1095":{"position":[[34,4],[296,4]]},"1097":{"position":[[48,4],[85,4],[362,5],[458,4],[643,5]]},"1098":{"position":[[17,4],[202,5],[271,5]]},"1099":{"position":[[17,4],[184,5],[249,5]]},"1101":{"position":[[102,4]]},"1102":{"position":[[89,4],[882,5]]},"1107":{"position":[[8,4],[157,4]]},"1112":{"position":[[230,4]]},"1114":{"position":[[229,4],[478,7],[599,4]]},"1119":{"position":[[387,7]]},"1120":{"position":[[394,4]]},"1121":{"position":[[92,4]]},"1123":{"position":[[666,4]]},"1124":{"position":[[7,4],[130,4],[604,4],[989,4],[1212,4],[1330,4],[1506,4],[1896,4],[2098,4],[2180,4]]},"1125":{"position":[[34,5],[186,7],[903,5]]},"1129":{"position":[[19,4]]},"1130":{"position":[[34,7],[85,5]]},"1132":{"position":[[7,4],[118,4],[329,4],[1065,4],[1346,4]]},"1134":{"position":[[34,7]]},"1135":{"position":[[202,4]]},"1138":{"position":[[53,4],[176,7],[222,5]]},"1139":{"position":[[274,7],[320,5]]},"1140":{"position":[[343,4],[490,7],[536,5]]},"1141":{"position":[[19,4]]},"1147":{"position":[[74,5]]},"1148":{"position":[[497,4],[1092,4]]},"1149":{"position":[[529,4],[623,4],[862,4]]},"1150":{"position":[[173,4],[340,5],[492,4]]},"1151":{"position":[[388,4],[503,4],[901,5]]},"1154":{"position":[[101,4],[252,5],[350,5]]},"1158":{"position":[[626,5]]},"1159":{"position":[[138,5]]},"1162":{"position":[[893,4],[940,4],[997,4],[1046,4]]},"1163":{"position":[[40,5],[123,5]]},"1164":{"position":[[110,7]]},"1168":{"position":[[50,7]]},"1172":{"position":[[34,7],[493,4]]},"1174":{"position":[[322,4]]},"1175":{"position":[[248,4],[475,4]]},"1177":{"position":[[145,5],[216,4]]},"1178":{"position":[[387,4],[502,4],[898,5]]},"1181":{"position":[[845,4],[892,4]]},"1182":{"position":[[40,5],[123,5]]},"1184":{"position":[[10,4],[406,5],[489,5],[588,5]]},"1188":{"position":[[135,4],[189,4],[226,4],[277,4]]},"1189":{"position":[[301,7]]},"1191":{"position":[[112,4],[504,4]]},"1192":{"position":[[72,4]]},"1193":{"position":[[129,4],[285,4]]},"1198":{"position":[[27,4],[152,4],[887,4],[1163,4],[1266,4],[1648,4],[1736,4],[1871,4],[2152,4],[2331,4]]},"1201":{"position":[[34,7]]},"1202":{"position":[[14,4]]},"1204":{"position":[[146,5],[217,4]]},"1208":{"position":[[1202,7]]},"1209":{"position":[[389,4]]},"1210":{"position":[[171,4],[235,4],[316,7],[359,5]]},"1211":{"position":[[254,4],[565,7],[616,5]]},"1212":{"position":[[328,5],[403,5]]},"1213":{"position":[[625,5]]},"1214":{"position":[[444,4],[854,4]]},"1222":{"position":[[38,5]]},"1225":{"position":[[166,5],[243,5]]},"1226":{"position":[[34,7],[83,5]]},"1227":{"position":[[135,4],[299,4],[584,7],[633,5]]},"1231":{"position":[[479,5],[556,5],[644,7]]},"1233":{"position":[[121,4]]},"1236":{"position":[[24,4]]},"1237":{"position":[[772,5]]},"1238":{"position":[[480,5],[556,5],[633,5],[729,5]]},"1239":{"position":[[530,5],[631,5],[720,5]]},"1242":{"position":[[162,5]]},"1244":{"position":[[131,4]]},"1245":{"position":[[57,4]]},"1246":{"position":[[1889,4],[2034,4],[2166,4]]},"1247":{"position":[[59,4],[259,4],[444,4],[614,4]]},"1249":{"position":[[283,4]]},"1250":{"position":[[359,4]]},"1253":{"position":[[29,4]]},"1258":{"position":[[133,4]]},"1263":{"position":[[52,5],[129,5]]},"1264":{"position":[[34,7],[77,5]]},"1265":{"position":[[128,4],[292,4],[578,7],[621,5]]},"1268":{"position":[[607,5],[684,5]]},"1271":{"position":[[60,5],[119,4],[187,4],[298,4],[549,4],[780,4],[1066,4]]},"1272":{"position":[[146,4],[219,4]]},"1274":{"position":[[34,7],[98,5]]},"1275":{"position":[[152,7],[222,5]]},"1276":{"position":[[424,7],[488,5]]},"1277":{"position":[[175,7],[246,5],[488,4],[775,5]]},"1278":{"position":[[278,7],[353,5],[730,7],[800,5]]},"1279":{"position":[[343,7],[412,5]]},"1280":{"position":[[274,7]]},"1281":{"position":[[145,5]]},"1284":{"position":[[20,4],[59,4],[129,4],[284,4]]},"1292":{"position":[[5,4],[529,4]]},"1294":{"position":[[2112,4]]},"1295":{"position":[[1538,4]]},"1296":{"position":[[1852,4]]},"1300":{"position":[[568,4]]},"1304":{"position":[[1035,4],[1233,4],[1628,5],[1939,4]]},"1305":{"position":[[357,4],[385,4],[730,4]]},"1306":{"position":[[37,5]]},"1307":{"position":[[447,4]]},"1308":{"position":[[234,4]]},"1309":{"position":[[259,5],[393,4]]},"1313":{"position":[[1020,4]]},"1318":{"position":[[803,4]]},"1324":{"position":[[903,4]]}},"keywords":{}}],["rxdb""wher",{"_index":1537,"title":{},"content":{"245":{"position":[[124,21]]}},"keywords":{}}],["rxdb""whi",{"_index":1534,"title":{},"content":{"245":{"position":[[37,19]]}},"keywords":{}}],["rxdb'",{"_index":622,"title":{"208":{"position":[[4,6]]},"255":{"position":[[9,6]]},"980":{"position":[[0,6]]}},"content":{"39":{"position":[[297,6]]},"51":{"position":[[1038,6]]},"61":{"position":[[317,6]]},"77":{"position":[[1,6]]},"78":{"position":[[1,6]]},"82":{"position":[[1,6]]},"114":{"position":[[614,6]]},"124":{"position":[[196,6]]},"126":{"position":[[230,6]]},"129":{"position":[[92,6]]},"148":{"position":[[420,6]]},"164":{"position":[[286,6]]},"174":{"position":[[740,6],[2179,6],[2935,6],[3220,6]]},"175":{"position":[[608,6]]},"181":{"position":[[223,6]]},"186":{"position":[[212,6]]},"191":{"position":[[1,6]]},"201":{"position":[[348,6]]},"205":{"position":[[300,6]]},"207":{"position":[[8,6],[220,6]]},"212":{"position":[[78,6]]},"238":{"position":[[1,6]]},"241":{"position":[[580,6]]},"248":{"position":[[217,6]]},"252":{"position":[[293,6]]},"262":{"position":[[79,6]]},"267":{"position":[[1,6],[153,6],[507,6],[873,6]]},"275":{"position":[[8,6],[200,6]]},"276":{"position":[[1,6]]},"283":{"position":[[1,6],[396,6]]},"284":{"position":[[1,6]]},"286":{"position":[[405,6]]},"289":{"position":[[17,6],[469,6],[699,6],[1397,6]]},"311":{"position":[[83,6]]},"326":{"position":[[1,6]]},"327":{"position":[[8,6]]},"328":{"position":[[193,6]]},"338":{"position":[[1,6]]},"346":{"position":[[243,6]]},"366":{"position":[[64,6]]},"369":{"position":[[405,6],[889,6],[1098,6]]},"370":{"position":[[42,6],[212,6]]},"371":{"position":[[165,6]]},"373":{"position":[[597,6]]},"380":{"position":[[1,6]]},"382":{"position":[[261,6]]},"383":{"position":[[8,6]]},"433":{"position":[[452,6]]},"446":{"position":[[790,6]]},"487":{"position":[[336,6]]},"490":{"position":[[1,6]]},"491":{"position":[[1249,6]]},"493":{"position":[[44,6]]},"495":{"position":[[660,6]]},"496":{"position":[[666,6]]},"498":{"position":[[469,6]]},"502":{"position":[[261,6],[685,6]]},"514":{"position":[[261,6]]},"515":{"position":[[8,6]]},"523":{"position":[[124,6]]},"525":{"position":[[58,6]]},"556":{"position":[[1394,6],[1730,6]]},"557":{"position":[[379,6]]},"580":{"position":[[190,6]]},"582":{"position":[[283,6]]},"584":{"position":[[64,6]]},"632":{"position":[[1,6],[621,6]]},"634":{"position":[[482,6]]},"639":{"position":[[86,6]]},"640":{"position":[[1,6]]},"688":{"position":[[171,6]]},"698":{"position":[[1719,6]]},"723":{"position":[[1043,6]]},"805":{"position":[[57,6]]},"806":{"position":[[9,6]]},"831":{"position":[[118,6],[467,6]]},"908":{"position":[[1,6]]},"1132":{"position":[[890,6]]},"1147":{"position":[[521,6]]},"1149":{"position":[[92,6],[574,6]]},"1284":{"position":[[422,6]]}},"keywords":{}}],["rxdb)you",{"_index":5194,"title":{},"content":{"898":{"position":[[244,8]]}},"keywords":{}}],["rxdb+foundationdb",{"_index":6025,"title":{"1132":{"position":[[12,18]]}},"content":{},"keywords":{}}],["rxdb+node.j",{"_index":2132,"title":{"776":{"position":[[13,13]]}},"content":{"370":{"position":[[333,13]]}},"keywords":{}}],["rxdb+react",{"_index":2133,"title":{},"content":{"371":{"position":[[338,10]]}},"keywords":{}}],["rxdb.check",{"_index":4588,"title":{},"content":{"776":{"position":[[244,10]]}},"keywords":{}}],["rxdb.client",{"_index":5251,"title":{},"content":{"903":{"position":[[397,12]]}},"keywords":{}}],["rxdb.limit",{"_index":3301,"title":{},"content":{"535":{"position":[[1161,12]]},"595":{"position":[[1238,12]]}},"keywords":{}}],["rxdb/plugins/attach",{"_index":5285,"title":{},"content":{"915":{"position":[[143,27]]},"932":{"position":[[731,25]]}},"keywords":{}}],["rxdb/plugins/backup",{"_index":3728,"title":{},"content":{"646":{"position":[[70,22]]}},"keywords":{}}],["rxdb/plugins/cleanup",{"_index":3744,"title":{},"content":{"652":{"position":[[71,23]]},"1119":{"position":[[429,23]]}},"keywords":{}}],["rxdb/plugins/cor",{"_index":764,"title":{},"content":{"51":{"position":[[212,20]]},"55":{"position":[[213,20],[701,20]]},"209":{"position":[[34,20]]},"211":{"position":[[96,20]]},"255":{"position":[[381,20]]},"258":{"position":[[34,20]]},"314":{"position":[[333,20]]},"315":{"position":[[362,20]]},"394":{"position":[[567,20]]},"480":{"position":[[191,20]]},"482":{"position":[[192,20]]},"538":{"position":[[292,20]]},"542":{"position":[[412,20]]},"556":{"position":[[771,20]]},"563":{"position":[[231,20]]},"632":{"position":[[1072,20]]},"662":{"position":[[1658,20]]},"717":{"position":[[1085,20]]},"724":{"position":[[272,20]]},"734":{"position":[[442,20]]},"862":{"position":[[349,20]]},"875":{"position":[[2049,20],[4295,20]]},"898":{"position":[[2198,20]]},"904":{"position":[[598,20]]},"960":{"position":[[166,20]]},"1118":{"position":[[394,20]]},"1144":{"position":[[62,20]]},"1145":{"position":[[266,20]]},"1148":{"position":[[552,20]]},"1149":{"position":[[829,20]]},"1158":{"position":[[56,20]]},"1159":{"position":[[242,20]]}},"keywords":{}}],["rxdb/plugins/crdt",{"_index":3874,"title":{},"content":{"680":{"position":[[392,20]]}},"keywords":{}}],["rxdb/plugins/dev",{"_index":3861,"title":{},"content":{"675":{"position":[[251,17]]}},"keywords":{}}],["rxdb/plugins/encrypt",{"_index":1895,"title":{},"content":{"315":{"position":[[214,24]]},"482":{"position":[[343,24]]},"554":{"position":[[568,24]]},"564":{"position":[[279,24]]},"638":{"position":[[273,24]]},"717":{"position":[[601,24]]},"1237":{"position":[[697,24]]}},"keywords":{}}],["rxdb/plugins/flutt",{"_index":1250,"title":{},"content":{"188":{"position":[[814,23]]}},"keywords":{}}],["rxdb/plugins/json",{"_index":5369,"title":{},"content":{"952":{"position":[[243,18]]},"971":{"position":[[355,18]]}},"keywords":{}}],["rxdb/plugins/key",{"_index":4082,"title":{},"content":{"734":{"position":[[170,17]]},"1237":{"position":[[613,17]]}},"keywords":{}}],["rxdb/plugins/lead",{"_index":4091,"title":{},"content":{"738":{"position":[[154,20]]},"740":{"position":[[467,20]]}},"keywords":{}}],["rxdb/plugins/loc",{"_index":5595,"title":{},"content":{"1012":{"position":[[154,19]]}},"keywords":{}}],["rxdb/plugins/migr",{"_index":4487,"title":{},"content":{"759":{"position":[[118,23]]},"760":{"position":[[294,23]]}},"keywords":{}}],["rxdb/plugins/pouchdb",{"_index":27,"title":{},"content":{"1":{"position":[[393,23]]},"8":{"position":[[816,23]]},"1201":{"position":[[92,23]]},"1204":{"position":[[269,23]]}},"keywords":{}}],["rxdb/plugins/queri",{"_index":5760,"title":{},"content":{"1064":{"position":[[182,19]]}},"keywords":{}}],["rxdb/plugins/react",{"_index":3323,"title":{},"content":{"542":{"position":[[337,24]]},"563":{"position":[[379,24]]},"825":{"position":[[133,24]]},"829":{"position":[[1328,21],[1925,21],[2344,21],[3260,21]]}},"keywords":{}}],["rxdb/plugins/repl",{"_index":1343,"title":{},"content":{"209":{"position":[[171,27]]},"210":{"position":[[210,25]]},"255":{"position":[[518,27]]},"261":{"position":[[278,25]]},"481":{"position":[[614,27]]},"632":{"position":[[2146,27]]},"846":{"position":[[81,25]]},"848":{"position":[[1233,25]]},"862":{"position":[[252,25]]},"866":{"position":[[374,25]]},"872":{"position":[[2313,25]]},"875":{"position":[[365,27]]},"886":{"position":[[949,25]]},"892":{"position":[[79,25]]},"893":{"position":[[134,25]]},"898":{"position":[[3265,25]]},"904":{"position":[[1369,25]]},"906":{"position":[[933,25]]},"988":{"position":[[153,27]]},"1090":{"position":[[549,27]]},"1121":{"position":[[393,25]]},"1149":{"position":[[696,25]]},"1231":{"position":[[697,25]]}},"keywords":{}}],["rxdb/plugins/st",{"_index":5981,"title":{},"content":{"1114":{"position":[[636,21]]}},"keywords":{}}],["rxdb/plugins/storag",{"_index":777,"title":{},"content":{"51":{"position":[[591,21]]},"55":{"position":[[763,21]]},"188":{"position":[[712,21]]},"209":{"position":[[96,21]]},"211":{"position":[[158,21]]},"255":{"position":[[443,21]]},"258":{"position":[[96,21]]},"266":{"position":[[616,21]]},"314":{"position":[[395,21]]},"315":{"position":[[292,21]]},"334":{"position":[[247,21]]},"392":{"position":[[289,21]]},"480":{"position":[[253,21]]},"482":{"position":[[254,21]]},"522":{"position":[[360,21]]},"538":{"position":[[354,21]]},"542":{"position":[[474,21]]},"554":{"position":[[774,21]]},"562":{"position":[[83,21]]},"563":{"position":[[293,21]]},"564":{"position":[[357,21]]},"579":{"position":[[249,21]]},"598":{"position":[[349,21]]},"632":{"position":[[1134,21]]},"653":{"position":[[199,21]]},"662":{"position":[[1985,21]]},"680":{"position":[[612,21]]},"710":{"position":[[1622,21]]},"717":{"position":[[679,21]]},"734":{"position":[[243,21]]},"739":{"position":[[230,21]]},"772":{"position":[[716,21],[2288,21]]},"773":{"position":[[512,21]]},"774":{"position":[[521,21]]},"829":{"position":[[554,21]]},"838":{"position":[[2125,21]]},"862":{"position":[[411,21]]},"872":{"position":[[1629,21],[3850,21]]},"898":{"position":[[2260,21]]},"904":{"position":[[660,21]]},"960":{"position":[[228,21]]},"962":{"position":[[699,21],[915,21]]},"1090":{"position":[[480,21]]},"1114":{"position":[[527,21]]},"1125":{"position":[[229,21]]},"1134":{"position":[[83,21]]},"1144":{"position":[[117,21]]},"1145":{"position":[[321,21]]},"1148":{"position":[[607,21]]},"1149":{"position":[[766,21]]},"1158":{"position":[[118,21]]},"1159":{"position":[[325,21]]},"1168":{"position":[[93,21]]},"1172":{"position":[[75,21]]},"1189":{"position":[[345,21]]},"1218":{"position":[[320,21],[657,21],[732,21]]},"1219":{"position":[[298,21],[381,21],[821,21]]},"1222":{"position":[[120,21]]},"1226":{"position":[[160,21]]},"1271":{"position":[[1184,21]]},"1280":{"position":[[339,21]]},"1286":{"position":[[303,21]]},"1287":{"position":[[349,21]]},"1288":{"position":[[309,21]]}},"keywords":{}}],["rxdb/plugins/upd",{"_index":5685,"title":{},"content":{"1041":{"position":[[219,22]]},"1059":{"position":[[158,22]]}},"keywords":{}}],["rxdb/plugins/util",{"_index":2688,"title":{},"content":{"412":{"position":[[4459,21]]},"1309":{"position":[[462,21]]}},"keywords":{}}],["rxdb/plugins/valid",{"_index":6284,"title":{},"content":{"1237":{"position":[[539,22]]},"1286":{"position":[[233,22]]},"1287":{"position":[[274,22]]},"1288":{"position":[[226,22]]},"1290":{"position":[[24,22]]},"1291":{"position":[[30,22]]}},"keywords":{}}],["rxdb/plugins/vector",{"_index":2296,"title":{},"content":{"393":{"position":[[950,22]]},"394":{"position":[[501,22]]},"397":{"position":[[1653,22]]}},"keywords":{}}],["rxdbattachmentsplugin",{"_index":5284,"title":{},"content":{"915":{"position":[[114,21]]}},"keywords":{}}],["rxdbbackupplugin",{"_index":3727,"title":{},"content":{"646":{"position":[[46,16]]}},"keywords":{}}],["rxdbcleanupplugin",{"_index":3743,"title":{},"content":{"652":{"position":[[46,17]]},"1119":{"position":[[404,17]]}},"keywords":{}}],["rxdbcrdtplugin",{"_index":3873,"title":{},"content":{"680":{"position":[[370,14]]}},"keywords":{}}],["rxdbdata",{"_index":3439,"title":{},"content":{"566":{"position":[[39,8]]}},"keywords":{}}],["rxdbflexsearchplugin",{"_index":4045,"title":{},"content":{"724":{"position":[[141,20],[181,20]]}},"keywords":{}}],["rxdbjsondumpplugin",{"_index":5368,"title":{},"content":{"952":{"position":[[217,18]]},"971":{"position":[[329,18]]}},"keywords":{}}],["rxdbleaderelectionplugin",{"_index":4090,"title":{},"content":{"738":{"position":[[122,24]]}},"keywords":{}}],["rxdblocaldocumentsplugin",{"_index":5594,"title":{},"content":{"1012":{"position":[[122,24]]}},"keywords":{}}],["rxdbquerybuilderplugin",{"_index":5759,"title":{},"content":{"1064":{"position":[[152,22]]}},"keywords":{}}],["rxdbreplicationgraphqlplugin",{"_index":6275,"title":{},"content":{"1231":{"position":[[661,28]]}},"keywords":{}}],["rxdbstateplugin",{"_index":5979,"title":{},"content":{"1114":{"position":[[199,15],[613,15]]}},"keywords":{}}],["rxdbupdateplugin",{"_index":5684,"title":{},"content":{"1041":{"position":[[195,16]]},"1059":{"position":[[134,16]]}},"keywords":{}}],["rxdb’",{"_index":1567,"title":{},"content":{"254":{"position":[[220,6]]},"361":{"position":[[307,6]]},"562":{"position":[[811,6]]},"567":{"position":[[89,6]]},"860":{"position":[[618,6],[1084,6]]},"903":{"position":[[125,6]]}},"keywords":{}}],["rxdocument",{"_index":1278,"title":{"1034":{"position":[[0,10]]}},"content":{"188":{"position":[[2823,10]]},"714":{"position":[[101,11]]},"749":{"position":[[11046,11]]},"764":{"position":[[164,11]]},"766":{"position":[[87,10]]},"767":{"position":[[791,12],[871,12],[947,12]]},"768":{"position":[[324,12],[467,12],[540,12],[684,12],[797,12],[875,12],[949,12]]},"769":{"position":[[343,12],[422,12],[497,12],[645,12],[762,12],[842,12],[918,12]]},"770":{"position":[[32,10],[98,10],[353,12]]},"790":{"position":[[73,11]]},"792":{"position":[[96,11]]},"793":{"position":[[130,10]]},"808":{"position":[[398,11]]},"810":{"position":[[21,11]]},"811":{"position":[[32,10]]},"812":{"position":[[314,10]]},"826":{"position":[[362,10]]},"917":{"position":[[25,11]]},"920":{"position":[[44,11]]},"921":{"position":[[143,11]]},"923":{"position":[[5,10]]},"942":{"position":[[157,11]]},"943":{"position":[[320,10]]},"944":{"position":[[319,12],[332,12]]},"945":{"position":[[214,12],[227,12],[319,10]]},"946":{"position":[[129,11]]},"947":{"position":[[290,12],[303,11]]},"948":{"position":[[49,10]]},"982":{"position":[[8,10]]},"1018":{"position":[[41,11]]},"1040":{"position":[[21,10]]},"1044":{"position":[[55,10]]},"1045":{"position":[[39,11]]},"1046":{"position":[[83,11]]},"1049":{"position":[[49,10]]},"1052":{"position":[[299,10],[365,11]]},"1053":{"position":[[52,11]]},"1056":{"position":[[35,10]]},"1057":{"position":[[361,10],[577,10]]},"1059":{"position":[[25,10]]},"1060":{"position":[[47,10]]},"1061":{"position":[[48,10]]},"1084":{"position":[[555,10],[635,10]]},"1085":{"position":[[1895,10],[2210,12]]},"1311":{"position":[[1293,10]]}},"keywords":{}}],["rxdocument,rxdocument,rxdocu",{"_index":5738,"title":{},"content":{"1057":{"position":[[169,36]]}},"keywords":{}}],["rxdocument.allattach",{"_index":4313,"title":{},"content":{"749":{"position":[[13637,26]]}},"keywords":{}}],["rxdocument.clos",{"_index":4276,"title":{},"content":{"749":{"position":[[10804,18]]}},"keywords":{}}],["rxdocument.get",{"_index":4257,"title":{},"content":{"749":{"position":[[9512,15],[9829,15],[13760,17],[13858,15]]}},"keywords":{}}],["rxdocument.incrementalmodifi",{"_index":4419,"title":{},"content":{"749":{"position":[[22721,30]]},"948":{"position":[[343,29]]}},"keywords":{}}],["rxdocument.insert",{"_index":4220,"title":{},"content":{"749":{"position":[[6717,19]]}},"keywords":{}}],["rxdocument.modifi",{"_index":5750,"title":{},"content":{"1061":{"position":[[10,19]]}},"keywords":{}}],["rxdocument.myfield",{"_index":4734,"title":{},"content":{"826":{"position":[[101,19]]}},"keywords":{}}],["rxdocument.patch",{"_index":5747,"title":{},"content":{"1060":{"position":[[10,18]]}},"keywords":{}}],["rxdocument.popul",{"_index":4263,"title":{},"content":{"749":{"position":[[9936,21],[10050,21],[10168,21]]}},"keywords":{}}],["rxdocument.prepar",{"_index":4196,"title":{},"content":{"749":{"position":[[4723,21]]}},"keywords":{}}],["rxdocument.remov",{"_index":3888,"title":{},"content":{"684":{"position":[[86,19]]},"749":{"position":[[10698,20]]},"769":{"position":[[69,17]]}},"keywords":{}}],["rxdocument.sav",{"_index":4273,"title":{},"content":{"749":{"position":[[10594,18],[11135,17]]},"768":{"position":[[64,15]]}},"keywords":{}}],["rxdocument.set",{"_index":4267,"title":{},"content":{"749":{"position":[[10277,17],[10471,17],[10997,16],[14085,16]]}},"keywords":{}}],["rxdocument[alic",{"_index":4683,"title":{},"content":{"810":{"position":[[472,17]]},"811":{"position":[[467,17]]}},"keywords":{}}],["rxerror",{"_index":5486,"title":{},"content":{"990":{"position":[[724,7]]}},"keywords":{}}],["rxfulltextsearch",{"_index":4048,"title":{},"content":{"724":{"position":[[346,16]]}},"keywords":{}}],["rxgraphqlreplicationst",{"_index":5170,"title":{"890":{"position":[[0,26]]}},"content":{"890":{"position":[[55,25]]}},"keywords":{}}],["rxgraphqlreplicationstate<rxdoctype>",{"_index":5150,"title":{},"content":{"887":{"position":[[250,42]]},"888":{"position":[[391,42]]},"889":{"position":[[440,42]]}},"keywords":{}}],["rxj",{"_index":722,"title":{"54":{"position":[[5,4]]},"77":{"position":[[19,6]]},"103":{"position":[[19,6]]},"144":{"position":[[49,4]]},"541":{"position":[[5,4]]},"601":{"position":[[6,4]]},"822":{"position":[[54,4]]}},"content":{"47":{"position":[[212,4]]},"50":{"position":[[14,4],[157,4],[231,4],[302,4],[408,4],[513,6]]},"55":{"position":[[122,4]]},"103":{"position":[[46,5]]},"120":{"position":[[165,4]]},"129":{"position":[[535,4],[603,4],[733,6]]},"144":{"position":[[119,4]]},"174":{"position":[[182,7],[238,5]]},"211":{"position":[[32,4]]},"233":{"position":[[63,5]]},"257":{"position":[[18,4]]},"314":{"position":[[269,4]]},"322":{"position":[[79,4]]},"333":{"position":[[19,5],[60,4]]},"445":{"position":[[180,4],[1412,4]]},"537":{"position":[[25,4],[58,4]]},"540":{"position":[[161,4]]},"541":{"position":[[33,4]]},"562":{"position":[[1237,4]]},"563":{"position":[[39,4],[1033,4]]},"578":{"position":[[27,5],[89,4]]},"580":{"position":[[21,4]]},"597":{"position":[[26,5],[60,4]]},"632":{"position":[[1785,4]]},"662":{"position":[[1272,4]]},"710":{"position":[[1466,5]]},"727":{"position":[[46,4],[95,4]]},"828":{"position":[[51,4]]},"831":{"position":[[230,4]]},"838":{"position":[[1803,4]]},"875":{"position":[[4340,7],[8063,7],[9482,7]]},"941":{"position":[[29,4]]},"970":{"position":[[29,4]]},"1046":{"position":[[29,4]]},"1117":{"position":[[80,4],[151,4]]},"1118":{"position":[[136,5]]}},"keywords":{}}],["rxjsonc",{"_index":3261,"title":{},"content":{"522":{"position":[[136,8]]}},"keywords":{}}],["rxjsonschema",{"_index":4876,"title":{},"content":{"854":{"position":[[1561,13]]},"889":{"position":[[1033,13]]},"934":{"position":[[157,13]]}},"keywords":{}}],["rxjsonschema<herodoctype>",{"_index":6499,"title":{},"content":{"1311":{"position":[[258,31]]}},"keywords":{}}],["rxlocaldocu",{"_index":4741,"title":{"1018":{"position":[[0,16]]}},"content":{"826":{"position":[[936,15]]},"1014":{"position":[[159,16]]},"1015":{"position":[[135,16]]},"1016":{"position":[[8,15],[72,15]]},"1017":{"position":[[215,15]]},"1018":{"position":[[3,15]]}},"keywords":{}}],["rxmongodbreplicationst",{"_index":4958,"title":{},"content":{"872":{"position":[[2697,25]]}},"keywords":{}}],["rxpipelin",{"_index":2377,"title":{"1019":{"position":[[0,10]]},"1020":{"position":[[11,11]]},"1021":{"position":[[14,11]]},"1025":{"position":[[0,10]]},"1029":{"position":[[6,10]]}},"content":{"397":{"position":[[1368,10]]},"793":{"position":[[1043,11]]},"1021":{"position":[[5,10]]},"1022":{"position":[[365,10]]}},"keywords":{}}],["rxqueri",{"_index":4165,"title":{"1054":{"position":[[0,7]]}},"content":{"749":{"position":[[2299,8],[3227,7]]},"793":{"position":[[141,7]]},"817":{"position":[[114,7],[316,7]]},"818":{"position":[[215,7]]},"826":{"position":[[725,7]]},"1036":{"position":[[92,8]]},"1055":{"position":[[19,8]]},"1069":{"position":[[203,7],[250,7],[322,7],[526,7]]},"1070":{"position":[[52,8]]},"1107":{"position":[[73,9]]}},"keywords":{}}],["rxquery<rxherodoctype>",{"_index":1287,"title":{},"content":{"188":{"position":[[3028,28]]}},"keywords":{}}],["rxquery'",{"_index":5784,"title":{"1069":{"position":[[0,9]]}},"content":{"1069":{"position":[[143,9],[399,9]]}},"keywords":{}}],["rxquery._execoverdatabas",{"_index":4153,"title":{},"content":{"749":{"position":[[1655,28]]}},"keywords":{}}],["rxquery.find",{"_index":5352,"title":{},"content":{"949":{"position":[[60,15]]},"950":{"position":[[206,15]]}},"keywords":{}}],["rxquery.limit",{"_index":4160,"title":{},"content":{"749":{"position":[[1995,16]]}},"keywords":{}}],["rxquery.regex",{"_index":4156,"title":{},"content":{"749":{"position":[[1752,16]]}},"keywords":{}}],["rxquery.sort",{"_index":4158,"title":{},"content":{"749":{"position":[[1869,15]]}},"keywords":{}}],["rxreactivityfactori",{"_index":831,"title":{},"content":{"55":{"position":[[186,19]]},"1118":{"position":[[349,20]]}},"keywords":{}}],["rxreactivityfactory<reactivitytype>",{"_index":6002,"title":{},"content":{"1118":{"position":[[495,41]]}},"keywords":{}}],["rxreactivityfactory<signal<any>>",{"_index":838,"title":{},"content":{"55":{"position":[[411,44]]}},"keywords":{}}],["rxreplic",{"_index":4339,"title":{},"content":{"749":{"position":[[15474,13],[15608,13],[15740,13],[15878,13],[16014,13]]},"756":{"position":[[23,13]]},"886":{"position":[[1932,13]]}},"keywords":{}}],["rxreplicationst",{"_index":4832,"title":{"992":{"position":[[0,19]]}},"content":{"846":{"position":[[1476,18]]},"862":{"position":[[1713,19]]},"872":{"position":[[2815,18]]},"886":{"position":[[3382,18]]},"890":{"position":[[172,18]]},"898":{"position":[[4631,19]]},"904":{"position":[[3241,19]]},"992":{"position":[[48,18]]},"993":{"position":[[33,18]]}},"keywords":{}}],["rxreplicationstate.emitev",{"_index":5149,"title":{},"content":{"886":{"position":[[5112,31]]}},"keywords":{}}],["rxreplicationstate.start",{"_index":5524,"title":{},"content":{"998":{"position":[[73,27]]}},"keywords":{}}],["rxschema",{"_index":4614,"title":{"1073":{"position":[[0,8]]}},"content":{"793":{"position":[[108,8]]}},"keywords":{}}],["rxserver",{"_index":4617,"title":{"872":{"position":[[22,8]]},"1086":{"position":[[12,8]]},"1097":{"position":[[11,9]]},"1098":{"position":[[6,8]]},"1099":{"position":[[6,8]]},"1100":{"position":[[0,8]]}},"content":{"793":{"position":[[654,8],[868,8],[877,8]]},"871":{"position":[[70,9],[115,8],[244,8],[430,9],[495,8],[638,8]]},"872":{"position":[[2898,9],[3001,8],[3609,9],[3748,9],[4355,8],[4509,10]]},"1097":{"position":[[14,9]]},"1098":{"position":[[52,8]]},"1099":{"position":[[52,8]]},"1100":{"position":[[15,8]]},"1102":{"position":[[71,8],[308,9]]},"1105":{"position":[[856,8]]},"1112":{"position":[[76,8]]}},"keywords":{}}],["rxserver.start",{"_index":5978,"title":{},"content":{"1112":{"position":[[437,16]]}},"keywords":{}}],["rxserveradapterexpress",{"_index":4961,"title":{},"content":{"872":{"position":[[3170,22],[3300,23]]},"1097":{"position":[[613,22],[755,23]]}},"keywords":{}}],["rxserveradapterfastifi",{"_index":5924,"title":{},"content":{"1098":{"position":[[241,22],[391,23]]}},"keywords":{}}],["rxserveradapterkoa",{"_index":5927,"title":{},"content":{"1099":{"position":[[223,18],[365,19]]}},"keywords":{}}],["rxserverauthhandl",{"_index":5961,"title":{},"content":{"1105":{"position":[[1189,19]]}},"keywords":{}}],["rxstate",{"_index":4619,"title":{"1113":{"position":[[0,7]]},"1114":{"position":[[11,8]]},"1118":{"position":[[0,7]]},"1119":{"position":[[8,7]]},"1121":{"position":[[0,7]]}},"content":{"793":{"position":[[1073,7]]},"1114":{"position":[[3,7],[415,7],[581,7]]},"1116":{"position":[[30,7]]},"1118":{"position":[[330,8]]},"1120":{"position":[[1,7],[95,7],[375,7],[549,7],[693,7]]},"1121":{"position":[[285,7]]}},"keywords":{}}],["rxstorag",{"_index":408,"title":{"131":{"position":[[10,9]]},"162":{"position":[[10,9]]},"189":{"position":[[10,9]]},"287":{"position":[[10,9]]},"336":{"position":[[10,9]]},"504":{"position":[[20,9]]},"524":{"position":[[10,9]]},"581":{"position":[[10,9]]},"693":{"position":[[0,9]]},"1095":{"position":[[19,10]]},"1125":{"position":[[17,10]]},"1127":{"position":[[16,9]]},"1136":{"position":[[10,9]]},"1138":{"position":[[20,10]]},"1141":{"position":[[29,10]]},"1142":{"position":[[0,9]]},"1152":{"position":[[34,9]]},"1153":{"position":[[0,9]]},"1155":{"position":[[0,9]]},"1158":{"position":[[28,9]]},"1160":{"position":[[14,9]]},"1166":{"position":[[7,9]]},"1169":{"position":[[0,9]]},"1179":{"position":[[14,9]]},"1182":{"position":[[24,10]]},"1187":{"position":[[8,9]]},"1188":{"position":[[27,10]]},"1189":{"position":[[18,10]]},"1191":{"position":[[0,9]]},"1197":{"position":[[0,9]]},"1198":{"position":[[19,9]]},"1205":{"position":[[62,9]]},"1210":{"position":[[14,9]]},"1217":{"position":[[7,9]]},"1221":{"position":[[9,9]]},"1223":{"position":[[13,9]]},"1234":{"position":[[0,9]]},"1240":{"position":[[4,9]]},"1262":{"position":[[7,9]]},"1269":{"position":[[7,9]]},"1271":{"position":[[17,10]]},"1273":{"position":[[17,9]]}},"content":{"24":{"position":[[650,9]]},"28":{"position":[[672,9]]},"131":{"position":[[121,10],[200,10],[356,10],[376,9],[713,10]]},"162":{"position":[[48,10],[166,10],[233,10],[359,10],[533,10],[664,9]]},"188":{"position":[[284,9]]},"189":{"position":[[48,9],[120,10],[286,10],[469,10],[509,9],[678,9]]},"266":{"position":[[760,9],[807,10]]},"287":{"position":[[86,9],[318,9],[351,10],[451,10],[511,9],[663,10],[723,9],[888,10],[906,9],[1081,10]]},"336":{"position":[[41,10],[97,10],[174,10],[243,10],[338,10],[413,10]]},"365":{"position":[[439,9]]},"369":{"position":[[1302,9]]},"392":{"position":[[195,10]]},"402":{"position":[[2754,10],[2774,10]]},"433":{"position":[[464,10]]},"504":{"position":[[50,9],[82,10],[176,10],[256,10],[353,10]]},"521":{"position":[[384,9],[415,10]]},"522":{"position":[[511,9]]},"524":{"position":[[224,10],[291,10],[391,10],[497,10],[594,10]]},"581":{"position":[[144,10],[200,10],[249,10],[342,10],[417,10]]},"642":{"position":[[95,9]]},"662":{"position":[[425,9],[543,9],[1001,9],[1112,9],[1191,9],[1557,9]]},"693":{"position":[[55,9],[185,9],[399,10],[431,9]]},"703":{"position":[[327,10]]},"709":{"position":[[1383,9],[1410,10]]},"710":{"position":[[521,9],[754,9],[1043,9],[1307,9],[1346,9],[1498,9],[2256,10],[2322,9],[2350,9]]},"714":{"position":[[366,9],[1024,9]]},"717":{"position":[[494,10],[518,9]]},"721":{"position":[[25,9],[51,9]]},"734":{"position":[[58,10],[82,9]]},"745":{"position":[[56,10]]},"749":{"position":[[23070,10]]},"759":{"position":[[48,9],[75,10],[701,9]]},"760":{"position":[[697,9]]},"772":{"position":[[566,9],[1118,9],[1775,9],[1897,9]]},"773":{"position":[[68,10]]},"774":{"position":[[394,9]]},"775":{"position":[[279,10],[639,9]]},"776":{"position":[[271,9]]},"793":{"position":[[161,9],[472,9],[489,9],[515,9],[542,9],[1276,9]]},"820":{"position":[[252,10]]},"821":{"position":[[258,9],[375,9]]},"838":{"position":[[1225,9],[1322,9],[1412,9],[1874,9],[3098,9]]},"844":{"position":[[43,10]]},"927":{"position":[[121,10]]},"932":{"position":[[384,10]]},"960":{"position":[[379,9]]},"961":{"position":[[128,10]]},"962":{"position":[[47,9],[344,9],[498,9],[542,9],[573,9],[857,9]]},"1066":{"position":[[43,10]]},"1067":{"position":[[241,9]]},"1068":{"position":[[306,9]]},"1079":{"position":[[161,10],[456,9]]},"1085":{"position":[[3641,11]]},"1095":{"position":[[82,9]]},"1124":{"position":[[467,9]]},"1125":{"position":[[19,9]]},"1130":{"position":[[330,9]]},"1139":{"position":[[58,9]]},"1143":{"position":[[16,9],[114,9]]},"1145":{"position":[[54,9]]},"1146":{"position":[[120,9]]},"1147":{"position":[[144,10]]},"1148":{"position":[[704,9]]},"1151":{"position":[[118,9],[779,9]]},"1152":{"position":[[33,9]]},"1154":{"position":[[50,10],[422,9],[554,10],[604,9],[708,10]]},"1162":{"position":[[972,9],[1121,9]]},"1163":{"position":[[201,9],[247,9],[512,9]]},"1170":{"position":[[286,9]]},"1178":{"position":[[117,9],[776,9]]},"1182":{"position":[[201,9],[247,9],[516,9]]},"1184":{"position":[[105,10]]},"1189":{"position":[[80,10]]},"1191":{"position":[[25,9]]},"1196":{"position":[[96,9]]},"1198":{"position":[[801,9],[1183,9],[1379,9],[1426,9],[1538,10],[1781,9],[2061,10],[2116,9],[2222,9]]},"1210":{"position":[[10,9],[84,9],[210,9]]},"1214":{"position":[[890,9]]},"1219":{"position":[[641,9]]},"1222":{"position":[[187,9],[215,10],[312,10],[362,9],[598,9],[1141,10],[1355,10]]},"1225":{"position":[[67,9],[346,9],[411,10]]},"1231":{"position":[[21,9],[841,9]]},"1233":{"position":[[191,9]]},"1235":{"position":[[162,9],[297,9],[357,9],[408,9]]},"1236":{"position":[[5,9]]},"1242":{"position":[[207,10]]},"1243":{"position":[[15,9]]},"1244":{"position":[[10,9]]},"1246":{"position":[[24,9],[64,9],[368,9],[408,9],[679,9],[978,9],[1173,9],[1255,9],[1295,10],[1629,9],[1697,10],[1738,9],[2081,9],[2211,9]]},"1247":{"position":[[296,9],[469,9],[656,9]]},"1263":{"position":[[240,9],[305,10]]},"1282":{"position":[[329,9]]},"1284":{"position":[[436,9]]},"1286":{"position":[[379,9]]},"1287":{"position":[[425,9]]},"1288":{"position":[[385,9]]},"1294":{"position":[[2155,10]]},"1296":{"position":[[1894,10]]}},"keywords":{}}],["rxstorage.it",{"_index":6067,"title":{},"content":{"1143":{"position":[[435,12]]}},"keywords":{}}],["rxstorage.y",{"_index":3091,"title":{},"content":{"469":{"position":[[503,13]]}},"keywords":{}}],["rxstoragesupport",{"_index":6177,"title":{},"content":{"1199":{"position":[[20,17]]}},"keywords":{}}],["rxstorageth",{"_index":3989,"title":{},"content":{"710":{"position":[[614,12],[637,12],[663,12],[685,12]]}},"keywords":{}}],["rxsupabasereplicationst",{"_index":5229,"title":{},"content":{"898":{"position":[[4511,26]]}},"keywords":{}}],["s",{"_index":343,"title":{},"content":{"19":{"position":[[877,1]]}},"keywords":{}}],["s.rating(sortdirection.ascending).title(sortdirection.descend",{"_index":344,"title":{},"content":{"19":{"position":[[885,65]]}},"keywords":{}}],["s0vlu0uhi",{"_index":5067,"title":{},"content":{"878":{"position":[[520,13]]},"880":{"position":[[432,13]]}},"keywords":{}}],["s0vlu0uhiexfq0",{"_index":4840,"title":{},"content":{"848":{"position":[[512,19]]}},"keywords":{}}],["s1",{"_index":4413,"title":{},"content":{"749":{"position":[[22230,2]]}},"keywords":{}}],["s3",{"_index":6135,"title":{},"content":{"1173":{"position":[[125,3]]}},"keywords":{}}],["saa",{"_index":2675,"title":{},"content":{"412":{"position":[[2856,4]]},"1148":{"position":[[28,4]]}},"keywords":{}}],["sacrif",{"_index":2944,"title":{},"content":{"445":{"position":[[2078,11]]}},"keywords":{}}],["safari",{"_index":1708,"title":{},"content":{"298":{"position":[[172,7],[665,6]]},"299":{"position":[[585,6],[715,6],[881,6],[1491,6]]},"305":{"position":[[165,6],[552,6]]},"408":{"position":[[1137,6]]},"412":{"position":[[7868,6]]},"462":{"position":[[383,6]]},"613":{"position":[[757,6]]},"624":{"position":[[1010,7]]},"696":{"position":[[1397,6]]},"1207":{"position":[[105,7]]},"1211":{"position":[[386,7]]},"1301":{"position":[[952,6],[1108,6]]}},"keywords":{}}],["safe",{"_index":1039,"title":{},"content":{"105":{"position":[[161,4]]},"382":{"position":[[352,7]]},"412":{"position":[[8836,4]]},"557":{"position":[[513,5]]},"897":{"position":[[422,6]]},"1007":{"position":[[1077,6]]},"1317":{"position":[[308,6]]}},"keywords":{}}],["safeguard",{"_index":1687,"title":{},"content":{"290":{"position":[[205,12]]},"298":{"position":[[52,9]]},"377":{"position":[[197,9]]},"506":{"position":[[88,12]]},"569":{"position":[[837,12]]}},"keywords":{}}],["safeti",{"_index":966,"title":{},"content":{"74":{"position":[[91,6]]},"174":{"position":[[920,6]]},"281":{"position":[[304,6]]},"711":{"position":[[2369,6]]}},"keywords":{}}],["same",{"_index":88,"title":{},"content":{"6":{"position":[[217,4]]},"7":{"position":[[188,4]]},"16":{"position":[[247,4]]},"17":{"position":[[545,4]]},"26":{"position":[[79,4]]},"30":{"position":[[267,4]]},"32":{"position":[[133,4]]},"42":{"position":[[119,4]]},"47":{"position":[[1325,4]]},"109":{"position":[[136,4]]},"134":{"position":[[79,4]]},"203":{"position":[[362,4],[379,4]]},"210":{"position":[[657,4]]},"239":{"position":[[251,4]]},"250":{"position":[[132,4]]},"261":{"position":[[425,4],[1065,4]]},"299":{"position":[[1119,4]]},"314":{"position":[[1141,5]]},"339":{"position":[[36,4]]},"357":{"position":[[435,4]]},"358":{"position":[[289,4]]},"396":{"position":[[196,4],[1443,4]]},"397":{"position":[[96,4]]},"408":{"position":[[3012,4]]},"411":{"position":[[251,4],[4234,4],[4275,4],[4767,4]]},"412":{"position":[[2269,4],[3034,4],[3115,4],[3155,4],[5919,4]]},"416":{"position":[[277,4]]},"421":{"position":[[495,4]]},"446":{"position":[[674,4]]},"458":{"position":[[157,4]]},"461":{"position":[[1500,4]]},"467":{"position":[[587,4]]},"475":{"position":[[103,4]]},"490":{"position":[[343,4]]},"491":{"position":[[470,4],[1361,4]]},"495":{"position":[[150,4]]},"502":{"position":[[1267,4]]},"535":{"position":[[1285,4]]},"559":{"position":[[1376,4]]},"566":{"position":[[915,4]]},"570":{"position":[[543,4]]},"582":{"position":[[521,4]]},"595":{"position":[[1348,4]]},"616":{"position":[[138,4]]},"617":{"position":[[225,4]]},"624":{"position":[[218,4]]},"632":{"position":[[551,4]]},"635":{"position":[[81,4]]},"683":{"position":[[353,4]]},"684":{"position":[[126,4]]},"686":{"position":[[591,4]]},"691":{"position":[[61,4],[82,4]]},"698":{"position":[[38,4],[216,4],[761,4],[1686,4],[3244,4]]},"699":{"position":[[186,4]]},"701":{"position":[[80,4]]},"702":{"position":[[737,4]]},"740":{"position":[[302,4]]},"743":{"position":[[127,4],[178,4],[227,4]]},"749":{"position":[[1421,4],[1474,4],[5605,4],[9148,4],[14696,4]]},"756":{"position":[[295,4]]},"779":{"position":[[448,4]]},"785":{"position":[[82,4],[654,4]]},"798":{"position":[[300,4]]},"799":{"position":[[462,4]]},"817":{"position":[[264,4]]},"820":{"position":[[396,4]]},"826":{"position":[[479,4]]},"829":{"position":[[190,4]]},"830":{"position":[[57,4]]},"832":{"position":[[317,4]]},"863":{"position":[[648,4]]},"872":{"position":[[3658,4]]},"875":{"position":[[2381,4]]},"886":{"position":[[259,4],[1689,4]]},"890":{"position":[[423,4],[562,4]]},"898":{"position":[[1703,5]]},"902":{"position":[[775,4]]},"904":{"position":[[1958,4]]},"908":{"position":[[163,4]]},"918":{"position":[[1,4]]},"935":{"position":[[139,4],[172,4]]},"943":{"position":[[114,4]]},"947":{"position":[[1,4]]},"948":{"position":[[44,4],[547,4]]},"951":{"position":[[524,4]]},"961":{"position":[[101,4],[123,4]]},"964":{"position":[[62,4],[340,4]]},"966":{"position":[[70,4],[84,4],[448,4]]},"967":{"position":[[72,4]]},"981":{"position":[[1078,4],[1568,4]]},"986":{"position":[[174,4]]},"987":{"position":[[50,4],[71,4]]},"1002":{"position":[[746,4]]},"1004":{"position":[[700,4]]},"1009":{"position":[[51,4]]},"1014":{"position":[[94,4]]},"1030":{"position":[[212,4]]},"1033":{"position":[[314,4]]},"1048":{"position":[[74,4],[284,4]]},"1052":{"position":[[1,4]]},"1058":{"position":[[154,4]]},"1067":{"position":[[1778,4]]},"1072":{"position":[[796,4],[1461,4],[1504,4]]},"1088":{"position":[[287,4],[398,4],[710,4]]},"1093":{"position":[[64,4],[340,4]]},"1095":{"position":[[331,4]]},"1105":{"position":[[411,4],[575,4]]},"1115":{"position":[[626,4]]},"1121":{"position":[[154,4]]},"1135":{"position":[[83,4],[138,4],[234,4]]},"1140":{"position":[[237,4]]},"1146":{"position":[[146,4]]},"1164":{"position":[[567,4]]},"1165":{"position":[[515,4],[976,4]]},"1175":{"position":[[168,4]]},"1183":{"position":[[72,4]]},"1188":{"position":[[36,4]]},"1230":{"position":[[256,4],[310,4]]},"1233":{"position":[[78,4]]},"1267":{"position":[[558,4]]},"1271":{"position":[[1724,4]]},"1301":{"position":[[133,4]]},"1305":{"position":[[109,4]]},"1307":{"position":[[230,4]]},"1308":{"position":[[67,4]]},"1315":{"position":[[506,5],[1032,4]]},"1316":{"position":[[255,4],[599,4],[654,4],[671,4],[1049,4],[2404,4],[3380,4]]},"1318":{"position":[[204,4]]},"1321":{"position":[[848,4],[937,4],[1021,4]]}},"keywords":{}}],["sampl",{"_index":1341,"title":{"209":{"position":[[0,6]]}},"content":{"396":{"position":[[799,8],[894,6],[1861,8],[1909,8],[1979,6]]},"397":{"position":[[1418,7],[1995,7]]},"543":{"position":[[135,6]]},"603":{"position":[[133,6]]}},"keywords":{}}],["samplevector",{"_index":2379,"title":{},"content":{"397":{"position":[[1682,14]]}},"keywords":{}}],["sandbox",{"_index":1106,"title":{},"content":{"131":{"position":[[515,9]]},"433":{"position":[[110,9]]},"1206":{"position":[[130,10]]},"1215":{"position":[[569,9]]}},"keywords":{}}],["satellit",{"_index":2548,"title":{},"content":{"408":{"position":[[2429,9]]},"780":{"position":[[283,10]]}},"keywords":{}}],["satisfact",{"_index":1002,"title":{},"content":{"87":{"position":[[276,13]]},"93":{"position":[[234,12]]}},"keywords":{}}],["save",{"_index":30,"title":{"768":{"position":[[0,5]]}},"content":{"1":{"position":[[457,4]]},"2":{"position":[[123,4],[169,4]]},"3":{"position":[[143,4]]},"4":{"position":[[315,4]]},"5":{"position":[[228,4]]},"6":{"position":[[282,4],[328,4]]},"7":{"position":[[255,4]]},"9":{"position":[[168,4]]},"10":{"position":[[102,4]]},"11":{"position":[[137,4],[1023,4]]},"49":{"position":[[81,4]]},"65":{"position":[[655,5]]},"128":{"position":[[186,4]]},"352":{"position":[[128,6]]},"358":{"position":[[664,4]]},"366":{"position":[[336,6]]},"399":{"position":[[333,6]]},"412":{"position":[[7811,4],[10709,6]]},"419":{"position":[[460,6]]},"424":{"position":[[216,4]]},"445":{"position":[[2377,6]]},"537":{"position":[[65,7]]},"542":{"position":[[237,4]]},"559":{"position":[[328,5],[377,5]]},"597":{"position":[[67,4]]},"647":{"position":[[351,5]]},"661":{"position":[[547,4]]},"703":{"position":[[1421,4]]},"726":{"position":[[64,4],[113,4]]},"727":{"position":[[102,4]]},"728":{"position":[[190,4]]},"739":{"position":[[91,5]]},"749":{"position":[[10619,4]]},"767":{"position":[[394,6]]},"768":{"position":[[3,4],[44,6],[363,6],[628,4]]},"778":{"position":[[69,6]]},"866":{"position":[[48,4]]},"872":{"position":[[162,4]]},"902":{"position":[[797,7]]},"911":{"position":[[429,5]]},"1003":{"position":[[175,4]]},"1068":{"position":[[507,4]]},"1072":{"position":[[2313,5]]},"1085":{"position":[[1983,6],[3071,5],[3372,5],[3584,5]]},"1097":{"position":[[99,4]]},"1102":{"position":[[775,4]]},"1139":{"position":[[398,4]]},"1145":{"position":[[387,4]]},"1177":{"position":[[548,4]]},"1189":{"position":[[54,4]]},"1192":{"position":[[334,4]]},"1250":{"position":[[256,5]]},"1300":{"position":[[415,5]]}},"keywords":{}}],["savedatabas",{"_index":6140,"title":{},"content":{"1175":{"position":[[740,14]]}},"keywords":{}}],["sc1",{"_index":4353,"title":{},"content":{"749":{"position":[[16832,3]]}},"keywords":{}}],["sc10",{"_index":4364,"title":{},"content":{"749":{"position":[[17642,4]]}},"keywords":{}}],["sc11",{"_index":4366,"title":{},"content":{"749":{"position":[[17765,4]]}},"keywords":{}}],["sc13",{"_index":4368,"title":{},"content":{"749":{"position":[[17874,4]]}},"keywords":{}}],["sc14",{"_index":4369,"title":{},"content":{"749":{"position":[[17995,4]]}},"keywords":{}}],["sc15",{"_index":4370,"title":{},"content":{"749":{"position":[[18117,4]]}},"keywords":{}}],["sc16",{"_index":4371,"title":{},"content":{"749":{"position":[[18214,4]]}},"keywords":{}}],["sc17",{"_index":4372,"title":{},"content":{"749":{"position":[[18314,4]]}},"keywords":{}}],["sc18",{"_index":4374,"title":{},"content":{"749":{"position":[[18496,4]]}},"keywords":{}}],["sc19",{"_index":4375,"title":{},"content":{"749":{"position":[[18590,4]]}},"keywords":{}}],["sc2",{"_index":4354,"title":{},"content":{"749":{"position":[[16921,3]]}},"keywords":{}}],["sc20",{"_index":4376,"title":{},"content":{"749":{"position":[[18709,4]]}},"keywords":{}}],["sc21",{"_index":4378,"title":{},"content":{"749":{"position":[[18813,4]]}},"keywords":{}}],["sc22",{"_index":4379,"title":{},"content":{"749":{"position":[[18919,4]]}},"keywords":{}}],["sc23",{"_index":4382,"title":{},"content":{"749":{"position":[[19022,4]]}},"keywords":{}}],["sc24",{"_index":4383,"title":{},"content":{"749":{"position":[[19116,4]]}},"keywords":{}}],["sc25",{"_index":4386,"title":{},"content":{"749":{"position":[[19318,4]]}},"keywords":{}}],["sc26",{"_index":4388,"title":{},"content":{"749":{"position":[[19446,4]]}},"keywords":{}}],["sc28",{"_index":4389,"title":{},"content":{"749":{"position":[[19572,4]]}},"keywords":{}}],["sc29",{"_index":4390,"title":{},"content":{"749":{"position":[[19687,4]]}},"keywords":{}}],["sc3",{"_index":4357,"title":{},"content":{"749":{"position":[[17027,3]]}},"keywords":{}}],["sc30",{"_index":4391,"title":{},"content":{"749":{"position":[[19788,4]]}},"keywords":{}}],["sc32",{"_index":4392,"title":{},"content":{"749":{"position":[[19880,4]]}},"keywords":{}}],["sc33",{"_index":4394,"title":{},"content":{"749":{"position":[[20004,4]]}},"keywords":{}}],["sc34",{"_index":4395,"title":{},"content":{"749":{"position":[[20122,4]]}},"keywords":{}}],["sc35",{"_index":4396,"title":{},"content":{"749":{"position":[[20279,4]]}},"keywords":{}}],["sc36",{"_index":4399,"title":{},"content":{"749":{"position":[[20445,4]]}},"keywords":{}}],["sc37",{"_index":4400,"title":{},"content":{"749":{"position":[[20546,4]]}},"keywords":{}}],["sc38",{"_index":4401,"title":{},"content":{"749":{"position":[[20713,4]]}},"keywords":{}}],["sc39",{"_index":4402,"title":{},"content":{"749":{"position":[[20850,4]]}},"keywords":{}}],["sc4",{"_index":4358,"title":{},"content":{"749":{"position":[[17150,3]]}},"keywords":{}}],["sc40",{"_index":4403,"title":{},"content":{"749":{"position":[[21023,4]]}},"keywords":{}}],["sc41",{"_index":4406,"title":{},"content":{"749":{"position":[[21307,4]]}},"keywords":{}}],["sc42",{"_index":4407,"title":{},"content":{"749":{"position":[[21461,4]]}},"keywords":{}}],["sc6",{"_index":4361,"title":{},"content":{"749":{"position":[[17299,3]]}},"keywords":{}}],["sc7",{"_index":4362,"title":{},"content":{"749":{"position":[[17408,3]]}},"keywords":{}}],["sc8",{"_index":4363,"title":{},"content":{"749":{"position":[[17524,3]]}},"keywords":{}}],["scalabl",{"_index":428,"title":{"224":{"position":[[9,12]]},"623":{"position":[[0,11]]}},"content":{"26":{"position":[[281,8]]},"46":{"position":[[551,12]]},"91":{"position":[[184,11]]},"114":{"position":[[723,12]]},"118":{"position":[[192,8]]},"148":{"position":[[240,8]]},"165":{"position":[[370,8]]},"173":{"position":[[1884,11],[2071,12]]},"175":{"position":[[702,8]]},"178":{"position":[[388,12]]},"186":{"position":[[394,8]]},"198":{"position":[[239,8]]},"224":{"position":[[35,11]]},"241":{"position":[[707,8]]},"267":{"position":[[890,11],[1273,12]]},"369":{"position":[[518,12],[761,11]]},"373":{"position":[[735,8]]},"378":{"position":[[256,11]]},"395":{"position":[[16,11]]},"430":{"position":[[855,11]]},"441":{"position":[[677,8]]},"445":{"position":[[1620,12]]},"446":{"position":[[813,11]]},"447":{"position":[[426,9]]},"485":{"position":[[233,12]]},"530":{"position":[[518,12]]},"620":{"position":[[185,11],[788,12]]},"623":{"position":[[127,11],[197,8],[471,8],[640,9]]},"860":{"position":[[879,8]]},"873":{"position":[[79,8]]},"1247":{"position":[[341,8],[514,8]]},"1295":{"position":[[379,12]]}},"keywords":{}}],["scalablemor",{"_index":3420,"title":{},"content":{"560":{"position":[[530,12]]}},"keywords":{}}],["scale",{"_index":1007,"title":{"91":{"position":[[22,5]]},"487":{"position":[[7,7]]},"782":{"position":[[0,6]]},"1086":{"position":[[0,7]]},"1087":{"position":[[9,8]]},"1091":{"position":[[11,8]]},"1095":{"position":[[11,7]]}},"content":{"100":{"position":[[49,5]]},"224":{"position":[[311,5]]},"318":{"position":[[250,5]]},"353":{"position":[[388,7]]},"358":{"position":[[188,6]]},"369":{"position":[[593,6]]},"385":{"position":[[231,5]]},"386":{"position":[[115,5]]},"394":{"position":[[1421,5],[1658,5]]},"399":{"position":[[58,7]]},"411":{"position":[[544,5],[792,6],[1778,5],[3314,5],[3711,6]]},"417":{"position":[[282,6]]},"418":{"position":[[397,5]]},"477":{"position":[[75,7],[351,8]]},"483":{"position":[[390,5]]},"566":{"position":[[737,6]]},"626":{"position":[[415,6]]},"643":{"position":[[260,5]]},"772":{"position":[[379,6],[1401,6]]},"775":{"position":[[420,7]]},"782":{"position":[[256,5],[314,5]]},"793":{"position":[[886,7]]},"860":{"position":[[996,6],[1230,6]]},"1087":{"position":[[10,7],[150,7],[213,6]]},"1088":{"position":[[68,5]]},"1091":{"position":[[4,5]]},"1092":{"position":[[549,5]]},"1094":{"position":[[121,5]]},"1095":{"position":[[19,7],[98,6]]},"1321":{"position":[[477,6]]}},"keywords":{}}],["scan",{"_index":2060,"title":{"394":{"position":[[48,5]]}},"content":{"358":{"position":[[401,8]]},"394":{"position":[[1363,4]]},"398":{"position":[[126,5]]},"400":{"position":[[62,4]]},"411":{"position":[[3907,8]]},"559":{"position":[[1274,8]]}},"keywords":{}}],["scan.for",{"_index":2485,"title":{},"content":{"402":{"position":[[1391,8]]}},"keywords":{}}],["scatter",{"_index":3523,"title":{},"content":{"590":{"position":[[372,9]]}},"keywords":{}}],["scenario",{"_index":564,"title":{},"content":{"35":{"position":[[616,9]]},"98":{"position":[[59,10]]},"111":{"position":[[176,9]]},"122":{"position":[[141,10]]},"125":{"position":[[52,10]]},"126":{"position":[[348,10]]},"131":{"position":[[846,9]]},"133":{"position":[[135,10]]},"134":{"position":[[163,10]]},"162":{"position":[[726,10]]},"167":{"position":[[4,9]]},"169":{"position":[[4,9]]},"174":{"position":[[1979,9]]},"206":{"position":[[178,9]]},"225":{"position":[[42,10]]},"261":{"position":[[137,9]]},"287":{"position":[[607,9]]},"289":{"position":[[675,10],[1825,9]]},"321":{"position":[[204,9]]},"325":{"position":[[252,10]]},"336":{"position":[[492,10]]},"354":{"position":[[148,9]]},"365":{"position":[[1424,9]]},"378":{"position":[[201,9]]},"380":{"position":[[373,9]]},"411":{"position":[[383,9],[5569,9]]},"412":{"position":[[6092,9],[12238,9]]},"418":{"position":[[39,9]]},"429":{"position":[[361,9]]},"436":{"position":[[4,9]]},"439":{"position":[[200,9]]},"441":{"position":[[296,9]]},"469":{"position":[[570,9]]},"473":{"position":[[237,10]]},"482":{"position":[[1251,10]]},"491":{"position":[[1790,9]]},"502":{"position":[[1186,10]]},"504":{"position":[[1457,9]]},"516":{"position":[[103,10]]},"519":{"position":[[92,8]]},"526":{"position":[[281,10]]},"554":{"position":[[387,9]]},"582":{"position":[[464,10]]},"584":{"position":[[253,9]]},"590":{"position":[[692,10]]},"611":{"position":[[527,9]]},"612":{"position":[[217,9]]},"622":{"position":[[709,9]]},"623":{"position":[[210,9]]},"624":{"position":[[650,9]]},"631":{"position":[[96,10]]},"643":{"position":[[290,9]]},"902":{"position":[[573,10]]},"912":{"position":[[540,9]]},"1009":{"position":[[88,9]]},"1209":{"position":[[335,10]]},"1299":{"position":[[382,8]]}},"keywords":{}}],["scene",{"_index":1162,"title":{},"content":{"152":{"position":[[137,7]]},"361":{"position":[[1130,7]]}},"keywords":{}}],["scenes.offlin",{"_index":3154,"title":{},"content":{"486":{"position":[[160,14]]}},"keywords":{}}],["schedul",{"_index":6485,"title":{},"content":{"1304":{"position":[[550,8]]}},"keywords":{}}],["schema",{"_index":765,"title":{"79":{"position":[[12,6]]},"110":{"position":[[12,6]]},"240":{"position":[[9,6]]},"282":{"position":[[7,6]]},"351":{"position":[[10,6]]},"367":{"position":[[0,6],[40,6]]},"382":{"position":[[0,6]]},"636":{"position":[[0,6]]},"750":{"position":[[25,6]]},"808":{"position":[[0,6]]},"916":{"position":[[26,7]]},"936":{"position":[[0,7]]},"1075":{"position":[[29,7]]},"1260":{"position":[[9,6]]},"1285":{"position":[[0,6]]},"1287":{"position":[[11,7]]},"1291":{"position":[[2,6]]}},"content":{"51":{"position":[[248,6],[289,8],[859,7]]},"57":{"position":[[168,6],[218,6]]},"79":{"position":[[45,6]]},"110":{"position":[[25,6],[127,6]]},"174":{"position":[[2041,6],[2108,6],[2186,6]]},"188":{"position":[[1210,7]]},"209":{"position":[[393,7],[416,8]]},"211":{"position":[[354,7],[378,8]]},"240":{"position":[[87,6],[194,6],[226,6],[325,6]]},"255":{"position":[[737,7],[760,8]]},"259":{"position":[[36,7],[60,8]]},"282":{"position":[[1,6],[282,6]]},"314":{"position":[[702,7],[726,8]]},"315":{"position":[[677,7],[702,8]]},"316":{"position":[[101,7],[144,7],[167,8]]},"334":{"position":[[589,7],[612,8]]},"350":{"position":[[119,7]]},"351":{"position":[[77,6],[377,7]]},"354":{"position":[[398,6],[995,8],[1700,6]]},"356":{"position":[[731,7]]},"357":{"position":[[440,6]]},"360":{"position":[[644,6],[728,6]]},"361":{"position":[[6,7],[35,7]]},"362":{"position":[[110,8],[898,7]]},"367":{"position":[[276,6],[394,6],[679,6]]},"382":{"position":[[66,6],[277,6],[345,6]]},"392":{"position":[[561,7],[1340,6],[1425,6],[1527,7]]},"397":{"position":[[369,6],[384,6],[527,6]]},"403":{"position":[[200,6],[329,6],[432,6],[531,6],[764,7]]},"412":{"position":[[11301,6],[11536,6],[11636,6]]},"480":{"position":[[502,7],[526,8]]},"482":{"position":[[795,7]]},"502":{"position":[[29,6]]},"538":{"position":[[549,6],[590,8],[882,7]]},"544":{"position":[[202,6]]},"554":{"position":[[1216,6],[1287,7],[1317,8]]},"555":{"position":[[83,6]]},"556":{"position":[[1439,6]]},"562":{"position":[[298,8],[510,7]]},"564":{"position":[[730,7],[755,8]]},"566":{"position":[[192,6]]},"567":{"position":[[271,8]]},"579":{"position":[[597,7],[620,8]]},"595":{"position":[[692,6]]},"598":{"position":[[556,6],[597,8],[889,7]]},"604":{"position":[[174,6]]},"632":{"position":[[1487,7],[1510,8]]},"636":{"position":[[103,6],[169,6]]},"638":{"position":[[568,7],[594,8],[863,7]]},"639":{"position":[[285,7],[328,7],[350,8]]},"662":{"position":[[2372,7]]},"680":{"position":[[106,6],[763,6],[1168,7]]},"686":{"position":[[909,6]]},"702":{"position":[[190,6],[397,6]]},"717":{"position":[[1395,7],[1409,6],[1634,6]]},"720":{"position":[[109,7]]},"734":{"position":[[882,7]]},"739":{"position":[[448,7]]},"749":{"position":[[703,6],[819,6],[1933,6],[2414,6],[2531,6],[5171,6],[5443,7],[8599,6],[12348,6],[12826,6],[13074,6],[13452,6],[15209,6],[17660,6],[17783,6],[18861,6],[19508,6],[19629,6],[20064,6],[20221,6],[20387,6],[20655,6],[20792,6],[21047,6],[21099,7],[21788,6],[21928,6],[22034,6],[22087,7],[22172,6],[22390,6],[22656,7]]},"751":{"position":[[226,6],[505,7],[809,7],[1130,6],[1607,7]]},"752":{"position":[[410,7]]},"757":{"position":[[181,6],[314,6]]},"772":{"position":[[959,7]]},"789":{"position":[[204,7],[451,7]]},"791":{"position":[[60,7],[319,7]]},"792":{"position":[[187,7]]},"793":{"position":[[410,6],[996,6]]},"806":{"position":[[612,7]]},"812":{"position":[[65,7]]},"813":{"position":[[65,7]]},"818":{"position":[[531,7]]},"820":{"position":[[185,7]]},"829":{"position":[[291,6],[757,7]]},"836":{"position":[[2058,6]]},"838":{"position":[[984,6],[2586,7]]},"841":{"position":[[1114,6],[1139,7],[1175,7],[1207,7],[1253,7],[1288,7]]},"861":{"position":[[1367,6],[1538,7]]},"862":{"position":[[642,8],[843,7]]},"872":{"position":[[1807,6],[1850,7],[4080,7]]},"878":{"position":[[460,6]]},"879":{"position":[[22,6],[123,6],[356,6]]},"886":{"position":[[1726,7]]},"887":{"position":[[118,6]]},"889":{"position":[[1016,7]]},"898":{"position":[[873,6],[1640,6],[1951,6],[2430,7],[4373,6]]},"904":{"position":[[826,7],[849,8]]},"916":{"position":[[94,6],[376,7]]},"932":{"position":[[1164,6]]},"934":{"position":[[293,7]]},"936":{"position":[[5,6],[84,6],[115,7],[148,6]]},"938":{"position":[[105,6]]},"939":{"position":[[186,7]]},"942":{"position":[[86,6]]},"954":{"position":[[101,8]]},"979":{"position":[[346,7]]},"1013":{"position":[[503,7]]},"1018":{"position":[[386,7]]},"1067":{"position":[[932,7],[1526,7]]},"1074":{"position":[[17,6],[108,6]]},"1075":{"position":[[45,7]]},"1076":{"position":[[162,7]]},"1078":{"position":[[225,6]]},"1079":{"position":[[58,6]]},"1080":{"position":[[55,6]]},"1081":{"position":[[88,7]]},"1084":{"position":[[5,6],[229,6],[499,6]]},"1085":{"position":[[772,7],[890,6],[1192,7],[1761,6],[2701,6],[2753,6],[2895,7],[3011,7],[3045,6],[3195,6],[3249,6],[3417,6],[3449,6],[3570,6]]},"1100":{"position":[[575,6],[847,6],[890,6],[938,7]]},"1107":{"position":[[13,6],[509,6]]},"1108":{"position":[[309,6],[339,6]]},"1149":{"position":[[284,6],[1039,7]]},"1158":{"position":[[326,7],[350,8]]},"1164":{"position":[[690,7]]},"1222":{"position":[[463,7]]},"1237":{"position":[[181,6],[264,6],[309,6]]},"1286":{"position":[[35,6]]},"1287":{"position":[[183,6],[299,8]]},"1288":{"position":[[154,6]]},"1289":{"position":[[5,6]]},"1291":{"position":[[55,8]]},"1292":{"position":[[375,6],[733,6],[995,6]]},"1309":{"position":[[1456,7]]},"1311":{"position":[[308,8],[1006,7]]},"1319":{"position":[[68,6],[506,7]]},"1321":{"position":[[719,6]]},"1322":{"position":[[299,7]]}},"keywords":{}}],["schema"",{"_index":5814,"title":{},"content":{"1074":{"position":[[708,13]]}},"keywords":{}}],["schema'",{"_index":4441,"title":{},"content":{"751":{"position":[[82,8]]}},"keywords":{}}],["schema.do",{"_index":3871,"title":{},"content":{"680":{"position":[[213,9]]}},"keywords":{}}],["schema.html?console=qa#faq",{"_index":4206,"title":{},"content":{"749":{"position":[[5481,26]]}},"keywords":{}}],["schema.html?console=toplevel#non",{"_index":4373,"title":{},"content":{"749":{"position":[[18393,32]]}},"keywords":{}}],["schema.org",{"_index":5847,"title":{},"content":{"1084":{"position":[[278,11]]}},"keywords":{}}],["schema.schema",{"_index":6026,"title":{},"content":{"1132":{"position":[[334,13]]}},"keywords":{}}],["schema/reference/object.html#requir",{"_index":4385,"title":{},"content":{"749":{"position":[[19229,37]]}},"keywords":{}}],["schemacheck",{"_index":4355,"title":{},"content":{"749":{"position":[[16925,12],[17031,12],[17154,12],[17303,12],[17412,12],[17528,12],[17647,12],[17770,12],[17879,12],[18000,12],[18122,12],[18219,12],[18319,12],[18501,12],[18595,12],[18714,12],[18818,12],[18924,12],[19027,12],[19121,12],[19323,12],[19451,12],[19577,12],[19692,12],[19793,12],[19885,12],[20009,12]]}},"keywords":{}}],["schemaless",{"_index":5891,"title":{},"content":{"1085":{"position":[[702,10]]}},"keywords":{}}],["schemapath",{"_index":4411,"title":{},"content":{"749":{"position":[[22061,10]]}},"keywords":{}}],["schemav1",{"_index":2494,"title":{},"content":{"403":{"position":[[476,8],[772,9]]}},"keywords":{}}],["schemavers",{"_index":5375,"title":{},"content":{"954":{"position":[[120,15]]}},"keywords":{}}],["schemawithdefaultag",{"_index":5844,"title":{},"content":{"1082":{"position":[[147,20]]}},"keywords":{}}],["schemawithfinalag",{"_index":5846,"title":{},"content":{"1083":{"position":[[349,18]]}},"keywords":{}}],["schemawithindex",{"_index":5836,"title":{},"content":{"1080":{"position":[[7,17]]}},"keywords":{}}],["schemawithonetomanyrefer",{"_index":4677,"title":{},"content":{"808":{"position":[[499,28]]}},"keywords":{}}],["school/univers",{"_index":6291,"title":{},"content":{"1249":{"position":[[203,17]]}},"keywords":{}}],["scope",{"_index":1156,"title":{},"content":{"151":{"position":[[81,5]]},"302":{"position":[[538,5]]},"411":{"position":[[1711,6]]},"412":{"position":[[12588,6]]},"436":{"position":[[356,5]]},"1009":{"position":[[536,6],[564,5]]},"1311":{"position":[[1226,5]]}},"keywords":{}}],["score",{"_index":3583,"title":{},"content":{"612":{"position":[[256,7]]},"691":{"position":[[133,6],[427,6]]}},"keywords":{}}],["scratch",{"_index":4043,"title":{},"content":{"723":{"position":[[1824,8]]},"756":{"position":[[250,8]]},"1028":{"position":[[171,8]]}},"keywords":{}}],["scratch"",{"_index":5528,"title":{},"content":{"999":{"position":[[131,14]]}},"keywords":{}}],["scream",{"_index":4599,"title":{},"content":{"789":{"position":[[233,7]]},"791":{"position":[[89,7]]},"792":{"position":[[220,7]]},"1311":{"position":[[662,7],[741,8]]}},"keywords":{}}],["screen",{"_index":3216,"title":{},"content":{"500":{"position":[[170,7]]}},"keywords":{}}],["script",{"_index":1264,"title":{},"content":{"188":{"position":[[1742,6]]},"282":{"position":[[444,8]]},"301":{"position":[[204,7]]},"479":{"position":[[447,7]]},"602":{"position":[[332,7]]},"612":{"position":[[798,6],[1446,6]]},"666":{"position":[[414,7]]},"861":{"position":[[424,7],[449,6]]}},"keywords":{}}],["script.leverag",{"_index":1971,"title":{},"content":{"346":{"position":[[158,15]]}},"keywords":{}}],["sdk",{"_index":677,"title":{},"content":{"43":{"position":[[476,5]]},"412":{"position":[[947,3]]},"861":{"position":[[1112,3]]},"862":{"position":[[141,3],[204,3]]},"863":{"position":[[265,3]]},"1278":{"position":[[89,3],[182,3],[641,3]]}},"keywords":{}}],["seamless",{"_index":617,"title":{},"content":{"39":{"position":[[180,8]]},"65":{"position":[[970,8]]},"70":{"position":[[227,8]]},"82":{"position":[[95,8]]},"107":{"position":[[91,8]]},"113":{"position":[[146,8]]},"118":{"position":[[246,8]]},"125":{"position":[[292,8]]},"148":{"position":[[129,8]]},"153":{"position":[[361,8]]},"155":{"position":[[96,8]]},"186":{"position":[[219,8]]},"191":{"position":[[287,8]]},"221":{"position":[[276,8]]},"230":{"position":[[104,8]]},"240":{"position":[[316,8]]},"241":{"position":[[549,8]]},"267":{"position":[[434,8]]},"285":{"position":[[317,8]]},"288":{"position":[[259,8]]},"366":{"position":[[270,9]]},"437":{"position":[[222,8]]},"445":{"position":[[261,8],[1169,8]]},"446":{"position":[[275,8]]},"447":{"position":[[172,8]]},"483":{"position":[[1277,8]]},"489":{"position":[[113,8]]},"491":{"position":[[940,8]]},"502":{"position":[[1301,8]]},"504":{"position":[[325,8],[605,8]]},"510":{"position":[[731,8]]},"519":{"position":[[273,8]]},"530":{"position":[[101,8]]},"548":{"position":[[357,8]]},"608":{"position":[[355,8]]},"1132":{"position":[[1425,8]]}},"keywords":{}}],["seamlessli",{"_index":553,"title":{},"content":{"35":{"position":[[252,10]]},"47":{"position":[[1304,10]]},"72":{"position":[[47,10]]},"76":{"position":[[75,10]]},"89":{"position":[[309,10]]},"90":{"position":[[265,10]]},"94":{"position":[[36,10]]},"99":{"position":[[382,11]]},"110":{"position":[[145,11]]},"122":{"position":[[119,10]]},"133":{"position":[[108,10]]},"135":{"position":[[117,11]]},"157":{"position":[[72,10]]},"160":{"position":[[66,10]]},"164":{"position":[[96,10]]},"167":{"position":[[262,10]]},"173":{"position":[[1554,11],[2247,10],[2816,10]]},"174":{"position":[[530,10],[1396,10],[1918,11],[2245,10]]},"179":{"position":[[69,10]]},"183":{"position":[[190,10]]},"190":{"position":[[106,11]]},"222":{"position":[[63,10]]},"226":{"position":[[397,10]]},"237":{"position":[[210,10]]},"238":{"position":[[220,10]]},"263":{"position":[[266,11]]},"274":{"position":[[134,10]]},"280":{"position":[[372,11]]},"283":{"position":[[492,11]]},"286":{"position":[[6,10]]},"289":{"position":[[900,10]]},"292":{"position":[[114,10]]},"309":{"position":[[186,10]]},"313":{"position":[[48,10]]},"360":{"position":[[586,10]]},"364":{"position":[[154,10]]},"368":{"position":[[309,10]]},"380":{"position":[[39,10]]},"412":{"position":[[2525,10]]},"419":{"position":[[266,10]]},"445":{"position":[[1700,10],[2233,10]]},"446":{"position":[[1344,10]]},"487":{"position":[[369,10]]},"500":{"position":[[57,10],[731,10]]},"501":{"position":[[130,10]]},"502":{"position":[[166,10],[505,11]]},"510":{"position":[[158,10]]},"514":{"position":[[79,10]]},"516":{"position":[[76,10]]},"530":{"position":[[179,10]]},"535":{"position":[[963,10]]},"541":{"position":[[17,10]]},"544":{"position":[[139,11]]},"574":{"position":[[902,10]]},"575":{"position":[[549,10]]},"584":{"position":[[22,10]]},"595":{"position":[[1038,10]]},"604":{"position":[[139,11]]},"632":{"position":[[2699,10]]},"723":{"position":[[1027,10]]},"838":{"position":[[702,10]]},"912":{"position":[[185,10]]},"981":{"position":[[1386,10]]}},"keywords":{}}],["seamlessly.handl",{"_index":1919,"title":{},"content":{"321":{"position":[[214,17]]}},"keywords":{}}],["search",{"_index":1327,"title":{"394":{"position":[[0,9]]},"398":{"position":[[0,9]]},"722":{"position":[[9,6]]},"723":{"position":[[35,7]]},"724":{"position":[[24,7]]},"1023":{"position":[[18,7]]}},"content":{"205":{"position":[[227,8]]},"252":{"position":[[226,7]]},"263":{"position":[[16,9]]},"383":{"position":[[192,7],[224,6]]},"390":{"position":[[1217,7],[1692,6],[1919,6]]},"393":{"position":[[1138,6]]},"394":{"position":[[1747,6]]},"396":{"position":[[249,8],[649,7],[750,6]]},"398":{"position":[[69,8],[349,6],[565,6],[1906,6],[3027,6]]},"402":{"position":[[549,6],[1107,6],[1413,6],[1622,6],[2156,6],[2264,6],[2327,6]]},"408":{"position":[[3641,6],[4501,9],[4810,6]]},"427":{"position":[[969,8]]},"559":{"position":[[1233,9]]},"560":{"position":[[405,9]]},"566":{"position":[[270,8]]},"587":{"position":[[35,8]]},"696":{"position":[[649,6]]},"714":{"position":[[794,6]]},"723":{"position":[[11,6],[137,6],[208,6],[284,6],[392,6],[521,6],[684,6],[1152,6],[1197,6],[1353,6],[1844,6],[2131,6],[2183,9],[2219,8],[2306,9],[2515,6],[2573,6],[2776,6]]},"724":{"position":[[16,6],[653,8],[710,6],[1247,6],[1519,6],[1686,6]]},"749":{"position":[[46,6],[393,6],[520,6],[611,6],[764,6],[901,6],[1036,6],[1260,6],[1348,6],[1497,6],[1600,6],[1697,6],[1814,6],[1940,6],[2043,6],[2149,6],[2243,6],[2336,6],[2421,6],[2538,6],[2779,6],[2892,6],[3125,6],[3245,6],[3601,6],[3798,6],[3885,6],[3957,6],[4072,6],[4188,6],[4310,6],[4487,6],[4561,6],[4668,6],[4803,6],[4935,6],[5087,6],[5189,6],[5301,6],[5508,6],[6016,6],[6152,6],[6288,6],[6407,6],[6549,6],[6661,6],[6776,6],[6900,6],[7008,6],[7127,6],[7218,6],[7251,6],[7434,6],[7514,6],[7591,6],[7690,6],[7794,6],[7889,6],[7989,6],[8083,6],[8181,6],[8289,6],[8384,6],[8484,6],[8606,6],[8683,6],[8857,6],[9007,6],[9165,6],[9456,6],[9601,6],[9685,6],[9773,6],[9880,6],[9994,6],[10112,6],[10221,6],[10326,6],[10414,6],[10537,6],[10641,6],[10747,6],[10838,6],[10920,6],[11058,6],[11199,6],[11310,6],[11409,6],[11485,6],[11630,6],[11727,6],[11836,6],[12137,6],[12228,6],[12355,6],[12436,6],[12509,6],[12724,6],[12833,6],[12910,6],[13019,6],[13136,6],[13210,6],[13330,6],[13459,6],[13582,6],[13705,6],[13803,6],[13947,6],[14030,6],[14124,6],[14236,6],[14321,6],[14517,6],[14599,6],[14714,6],[14870,6],[15081,6],[15240,6],[15415,6],[15547,6],[15681,6],[15813,6],[15948,6],[16050,6],[16198,6],[16317,6],[16439,6],[16588,6],[16781,6],[16870,6],[16976,6],[17099,6],[17248,6],[17357,6],[17473,6],[17591,6],[17714,6],[17823,6],[17944,6],[18066,6],[18163,6],[18263,6],[18445,6],[18539,6],[18658,6],[18762,6],[18868,6],[18971,6],[19065,6],[19267,6],[19395,6],[19521,6],[19636,6],[19737,6],[19829,6],[19953,6],[20071,6],[20228,6],[20394,6],[20495,6],[20662,6],[20799,6],[20972,6],[21256,6],[21410,6],[21673,6],[21975,6],[22095,6],[22179,6],[22297,6],[22404,6],[22524,6],[22664,6],[22793,6],[22953,6],[23146,6],[23272,6],[23404,6],[23537,6],[23728,6],[23910,6],[24030,6],[24191,6],[24321,6],[24401,6]]},"793":{"position":[[1168,6]]},"1023":{"position":[[79,7],[169,8]]},"1065":{"position":[[195,6],[1214,6]]},"1072":{"position":[[1652,7],[1783,6],[2086,7],[2169,7],[2204,7],[2605,9]]},"1107":{"position":[[102,6]]},"1167":{"position":[[26,6]]},"1284":{"position":[[118,6]]},"1296":{"position":[[120,6]]}},"keywords":{}}],["search.us",{"_index":1561,"title":{},"content":{"252":{"position":[[282,10]]}},"keywords":{}}],["searchabl",{"_index":4052,"title":{},"content":{"724":{"position":[[803,10]]}},"keywords":{}}],["searchembed",{"_index":2399,"title":{},"content":{"398":{"position":[[954,17],[1564,17],[2240,17],[2717,17]]}},"keywords":{}}],["searchstr",{"_index":4062,"title":{},"content":{"724":{"position":[[1566,12]]}},"keywords":{}}],["second",{"_index":173,"title":{},"content":{"11":{"position":[[934,6]]},"392":{"position":[[3080,7]]},"394":{"position":[[1727,8]]},"398":{"position":[[3280,6]]},"412":{"position":[[10136,6]]},"460":{"position":[[518,6]]},"463":{"position":[[1210,7]]},"468":{"position":[[547,7]]},"571":{"position":[[1606,6]]},"612":{"position":[[2196,7]]},"653":{"position":[[765,8],[816,7]]},"656":{"position":[[264,7]]},"703":{"position":[[1007,6],[1376,7]]},"724":{"position":[[1704,6]]},"736":{"position":[[257,8]]},"739":{"position":[[79,7]]},"766":{"position":[[110,6]]},"818":{"position":[[174,7]]},"885":{"position":[[1674,6]]},"986":{"position":[[286,6]]},"988":{"position":[[1065,8]]},"996":{"position":[[523,8]]},"1300":{"position":[[938,7]]}},"keywords":{}}],["secondari",{"_index":59,"title":{},"content":{"4":{"position":[[63,9]]},"1079":{"position":[[15,9]]}},"keywords":{}}],["secondsit",{"_index":4701,"title":{},"content":{"816":{"position":[[362,9]]}},"keywords":{}}],["secret",{"_index":1900,"title":{},"content":{"315":{"position":[[666,8],[694,7]]},"551":{"position":[[265,9]]},"555":{"position":[[365,6],[602,6],[677,6]]},"564":{"position":[[719,8],[747,7]]},"638":{"position":[[557,8],[585,8]]},"717":{"position":[[1520,7],[1579,10]]},"1074":{"position":[[368,6]]},"1108":{"position":[[553,9]]}},"keywords":{}}],["secretdata",{"_index":3139,"title":{},"content":{"482":{"position":[[919,11],[982,14],[1107,10]]}},"keywords":{}}],["secretfield",{"_index":3352,"title":{},"content":{"554":{"position":[[1459,12],[1526,14]]},"555":{"position":[[339,12],[655,12]]},"638":{"position":[[703,12],[767,15]]}},"keywords":{}}],["secretinfo",{"_index":3438,"title":{},"content":{"564":{"position":[[848,11],[911,14]]}},"keywords":{}}],["secretss",{"_index":5970,"title":{},"content":{"1108":{"position":[[491,9]]}},"keywords":{}}],["section",{"_index":3231,"title":{},"content":{"502":{"position":[[1337,8]]},"617":{"position":[[448,7]]}},"keywords":{}}],["secur",{"_index":932,"title":{"290":{"position":[[33,6]]},"377":{"position":[[0,8]]},"482":{"position":[[0,8]]},"991":{"position":[[0,9]]},"1237":{"position":[[31,9]]}},"content":{"65":{"position":[[1666,6]]},"95":{"position":[[1,8]]},"139":{"position":[[231,6]]},"167":{"position":[[25,8],[192,6]]},"170":{"position":[[503,9]]},"195":{"position":[[28,9]]},"218":{"position":[[1,8],[268,8]]},"290":{"position":[[18,8],[124,6]]},"291":{"position":[[70,8],[521,7]]},"292":{"position":[[1,8],[358,7]]},"293":{"position":[[435,9]]},"294":{"position":[[16,8]]},"295":{"position":[[20,8],[130,6],[217,8],[346,8]]},"310":{"position":[[1,8],[382,9]]},"315":{"position":[[4,6]]},"318":{"position":[[627,7]]},"343":{"position":[[29,6]]},"365":{"position":[[1485,8]]},"377":{"position":[[48,8],[266,8],[314,6]]},"383":{"position":[[123,6]]},"407":{"position":[[1108,9]]},"408":{"position":[[1697,8]]},"412":{"position":[[12051,8],[12116,8]]},"450":{"position":[[198,8]]},"460":{"position":[[801,8]]},"482":{"position":[[121,6]]},"483":{"position":[[518,8],[1227,8]]},"506":{"position":[[75,8]]},"526":{"position":[[26,8]]},"544":{"position":[[291,6]]},"551":{"position":[[40,6],[206,6]]},"554":{"position":[[219,9],[1304,7]]},"556":{"position":[[1,6],[76,6],[249,8],[1537,6],[1572,6],[1771,6]]},"557":{"position":[[429,7]]},"586":{"position":[[110,8]]},"604":{"position":[[244,6]]},"616":{"position":[[857,8]]},"631":{"position":[[442,6]]},"644":{"position":[[521,6]]},"697":{"position":[[606,6]]},"709":{"position":[[733,8],[1095,8]]},"717":{"position":[[262,6]]},"718":{"position":[[85,7]]},"838":{"position":[[835,9]]},"860":{"position":[[15,7],[894,7]]},"897":{"position":[[503,8]]},"899":{"position":[[192,8]]},"901":{"position":[[467,8]]},"912":{"position":[[128,8],[712,8]]},"1112":{"position":[[602,8]]},"1206":{"position":[[633,8]]},"1237":{"position":[[78,6],[210,8]]},"1247":{"position":[[333,7],[506,7],[693,7]]},"1287":{"position":[[144,8]]},"1297":{"position":[[137,6]]}},"keywords":{}}],["securedata",{"_index":3350,"title":{},"content":{"554":{"position":[[1273,11]]}},"keywords":{}}],["securedb",{"_index":3713,"title":{},"content":{"638":{"position":[[455,11]]}},"keywords":{}}],["secureionicdb",{"_index":1898,"title":{},"content":{"315":{"position":[[563,16]]}},"keywords":{}}],["secureofflinedb",{"_index":3136,"title":{},"content":{"482":{"position":[[638,18]]}},"keywords":{}}],["securereactstorag",{"_index":3436,"title":{},"content":{"564":{"position":[[608,21]]}},"keywords":{}}],["securesetup",{"_index":3435,"title":{},"content":{"564":{"position":[[410,13]]}},"keywords":{}}],["securityrealtim",{"_index":5233,"title":{},"content":{"899":{"position":[[257,16]]}},"keywords":{}}],["see",{"_index":861,"title":{"422":{"position":[[0,3]]}},"content":{"57":{"position":[[301,3],[372,3]]},"58":{"position":[[325,3]]},"59":{"position":[[284,3]]},"301":{"position":[[375,3],[690,3]]},"304":{"position":[[442,3]]},"340":{"position":[[152,3]]},"347":{"position":[[481,3]]},"361":{"position":[[1001,4]]},"362":{"position":[[1552,3]]},"388":{"position":[[107,3]]},"394":{"position":[[1197,3]]},"408":{"position":[[4209,3]]},"411":{"position":[[4267,3]]},"412":{"position":[[5911,3],[12134,3]]},"415":{"position":[[64,3]]},"419":{"position":[[698,4]]},"420":{"position":[[43,3]]},"421":{"position":[[80,3],[614,3],[1075,3]]},"446":{"position":[[723,4]]},"464":{"position":[[842,3]]},"469":{"position":[[1289,3]]},"489":{"position":[[247,3]]},"491":{"position":[[748,3]]},"495":{"position":[[301,3],[888,3]]},"498":{"position":[[350,3]]},"544":{"position":[[260,4]]},"545":{"position":[[222,4]]},"560":{"position":[[622,4]]},"567":{"position":[[461,3]]},"591":{"position":[[636,3]]},"605":{"position":[[222,4]]},"620":{"position":[[395,3]]},"632":{"position":[[477,4]]},"724":{"position":[[1108,3]]},"749":{"position":[[194,3],[1168,3],[12663,3],[15354,3],[15518,3],[15652,3],[15784,3],[18368,3],[19173,3]]},"796":{"position":[[251,3]]},"805":{"position":[[224,3]]},"806":{"position":[[147,3]]},"831":{"position":[[543,3]]},"849":{"position":[[330,3]]},"890":{"position":[[883,3]]},"913":{"position":[[34,3],[206,3]]},"937":{"position":[[158,3]]},"938":{"position":[[137,3]]},"949":{"position":[[56,3]]},"950":{"position":[[202,3]]},"988":{"position":[[4764,3]]},"1009":{"position":[[315,4]]},"1036":{"position":[[88,3]]},"1081":{"position":[[96,3]]},"1097":{"position":[[533,4],[815,4]]},"1108":{"position":[[152,3]]},"1137":{"position":[[234,3]]},"1191":{"position":[[547,3]]},"1271":{"position":[[988,3]]}},"keywords":{}}],["seed",{"_index":1331,"title":{},"content":{"206":{"position":[[110,4]]}},"keywords":{}}],["seek",{"_index":1433,"title":{},"content":{"241":{"position":[[685,7]]},"295":{"position":[[202,7]]},"318":{"position":[[604,7]]}},"keywords":{}}],["seem",{"_index":2345,"title":{},"content":{"396":{"position":[[1218,5]]}},"keywords":{}}],["seemingli",{"_index":2056,"title":{},"content":{"358":{"position":[[153,9]]}},"keywords":{}}],["seen",{"_index":1863,"title":{},"content":{"304":{"position":[[399,4]]},"412":{"position":[[6546,4]]},"421":{"position":[[963,4]]},"701":{"position":[[200,4],[837,4]]},"839":{"position":[[162,4]]},"1116":{"position":[[54,4]]}},"keywords":{}}],["seen/edit",{"_index":5958,"title":{},"content":{"1105":{"position":[[986,11]]}},"keywords":{}}],["select",{"_index":2136,"title":{},"content":{"373":{"position":[[673,9]]},"525":{"position":[[656,6]]},"705":{"position":[[721,7]]},"749":{"position":[[10528,8]]},"759":{"position":[[1435,11]]},"821":{"position":[[1023,10]]},"829":{"position":[[247,10]]},"1215":{"position":[[333,6],[661,6]]},"1250":{"position":[[96,6]]},"1315":{"position":[[379,6]]},"1321":{"position":[[260,6]]}},"keywords":{}}],["selector",{"_index":804,"title":{},"content":{"52":{"position":[[409,9],[499,9],[646,9]]},"54":{"position":[[157,9]]},"77":{"position":[[232,9]]},"103":{"position":[[272,9]]},"130":{"position":[[512,9]]},"143":{"position":[[452,9],[633,9]]},"234":{"position":[[332,9]]},"276":{"position":[[429,9]]},"398":{"position":[[1048,9],[1210,9],[2348,9]]},"480":{"position":[[731,9]]},"502":{"position":[[938,9]]},"518":{"position":[[405,9]]},"539":{"position":[[409,9],[499,9],[646,9]]},"555":{"position":[[498,9]]},"556":{"position":[[840,9]]},"571":{"position":[[879,9]]},"580":{"position":[[506,9]]},"599":{"position":[[436,9],[526,9],[677,9]]},"662":{"position":[[2710,9],[2798,9]]},"681":{"position":[[424,8],[546,8],[659,8],[708,9],[774,8],[835,8]]},"682":{"position":[[348,9],[405,9],[462,9],[519,9]]},"683":{"position":[[758,9]]},"710":{"position":[[2017,9],[2105,9]]},"749":{"position":[[2681,8]]},"772":{"position":[[1034,9]]},"796":{"position":[[434,9],[859,9],[1152,9]]},"797":{"position":[[271,9]]},"798":{"position":[[566,9]]},"820":{"position":[[561,9],[613,9]]},"825":{"position":[[697,9]]},"829":{"position":[[2413,9],[3329,9]]},"838":{"position":[[2924,9],[3012,9]]},"950":{"position":[[279,9]]},"951":{"position":[[143,9]]},"1055":{"position":[[68,10],[211,9]]},"1056":{"position":[[122,9],[218,9]]},"1059":{"position":[[246,9]]},"1060":{"position":[[114,9]]},"1061":{"position":[[115,9]]},"1062":{"position":[[171,9]]},"1063":{"position":[[129,9],[233,9]]},"1065":{"position":[[229,9],[801,9],[1055,9],[1299,9]]},"1066":{"position":[[372,9]]},"1067":{"position":[[311,9],[806,8],[886,8],[1305,9],[1572,9],[1984,9],[2128,9]]},"1072":{"position":[[2484,9],[2662,9]]},"1102":{"position":[[659,9],[1048,9]]},"1158":{"position":[[698,9]]},"1249":{"position":[[483,9]]},"1252":{"position":[[218,8],[339,9]]}},"keywords":{}}],["self",{"_index":238,"title":{"1095":{"position":[[6,4]]}},"content":{"14":{"position":[[1109,4]]},"174":{"position":[[3046,4]]},"840":{"position":[[566,4]]},"861":{"position":[[42,4],[202,4],[267,4]]},"862":{"position":[[944,4]]},"870":{"position":[[220,4]]},"896":{"position":[[24,4]]},"1124":{"position":[[2060,4]]},"1227":{"position":[[32,4]]},"1265":{"position":[[25,4]]},"1313":{"position":[[77,4]]},"1319":{"position":[[214,4],[384,4]]}},"keywords":{}}],["sell",{"_index":475,"title":{},"content":{"29":{"position":[[114,7]]},"412":{"position":[[2851,4]]}},"keywords":{}}],["semant",{"_index":2186,"title":{},"content":{"390":{"position":[[401,8]]},"689":{"position":[[165,10]]}},"keywords":{}}],["semi",{"_index":1637,"title":{"1192":{"position":[[14,4]]}},"content":{"276":{"position":[[233,4]]},"975":{"position":[[180,4]]},"1192":{"position":[[245,4],[693,4]]}},"keywords":{}}],["send",{"_index":1339,"title":{"616":{"position":[[0,7]]},"1220":{"position":[[0,7]]}},"content":{"208":{"position":[[198,7]]},"255":{"position":[[154,4],[1109,4]]},"392":{"position":[[3431,5],[3731,4]]},"407":{"position":[[117,7]]},"408":{"position":[[2521,4],[3869,4]]},"411":{"position":[[514,5]]},"415":{"position":[[464,7]]},"458":{"position":[[1105,4],[1192,4]]},"460":{"position":[[659,7]]},"461":{"position":[[87,4]]},"463":{"position":[[909,7],[1001,4]]},"464":{"position":[[850,7]]},"466":{"position":[[286,7],[481,7]]},"476":{"position":[[251,5]]},"481":{"position":[[779,4]]},"487":{"position":[[36,7]]},"610":{"position":[[451,5]]},"611":{"position":[[447,4],[753,7]]},"612":{"position":[[339,7],[456,4],[550,7],[601,4],[2174,4]]},"613":{"position":[[216,7]]},"616":{"position":[[43,4],[112,4],[247,7],[403,4],[569,7],[675,4],[1090,7],[1177,4]]},"618":{"position":[[602,4]]},"621":{"position":[[290,4],[561,4]]},"622":{"position":[[191,7]]},"626":{"position":[[528,4]]},"670":{"position":[[111,7]]},"704":{"position":[[569,4]]},"711":{"position":[[600,4]]},"736":{"position":[[218,5],[385,4]]},"780":{"position":[[261,7],[555,7]]},"784":{"position":[[209,4]]},"846":{"position":[[1215,7]]},"849":{"position":[[171,7]]},"875":{"position":[[3583,4],[7890,4]]},"876":{"position":[[247,4]]},"882":{"position":[[16,4],[165,7]]},"885":{"position":[[354,7]]},"886":{"position":[[1501,4],[2204,4],[3033,4],[5097,4]]},"888":{"position":[[872,4]]},"890":{"position":[[367,7]]},"982":{"position":[[408,7]]},"983":{"position":[[443,4]]},"984":{"position":[[233,4]]},"986":{"position":[[1283,4]]},"987":{"position":[[449,7]]},"988":{"position":[[3234,4],[4979,7],[5290,5]]},"990":{"position":[[6,7],[71,4],[654,4]]},"993":{"position":[[244,4]]},"996":{"position":[[336,7]]},"1068":{"position":[[383,4]]},"1102":{"position":[[1221,4]]},"1174":{"position":[[586,4]]},"1218":{"position":[[176,6],[517,4],[864,4]]},"1220":{"position":[[40,4]]},"1230":{"position":[[140,7]]},"1239":{"position":[[388,7]]},"1250":{"position":[[73,4],[228,4]]},"1270":{"position":[[155,7]]},"1276":{"position":[[270,7]]},"1308":{"position":[[328,4]]},"1317":{"position":[[148,5]]}},"keywords":{}}],["send(msg",{"_index":6248,"title":{},"content":{"1218":{"position":[[502,9],[850,10]]}},"keywords":{}}],["sender",{"_index":4451,"title":{},"content":{"751":{"position":[[1249,6]]}},"keywords":{}}],["sendercountri",{"_index":4449,"title":{},"content":{"751":{"position":[[1161,15]]}},"keywords":{}}],["sendev",{"_index":3600,"title":{},"content":{"612":{"position":[[2004,9]]}},"keywords":{}}],["sendevent(messag",{"_index":3609,"title":{},"content":{"612":{"position":[[2335,19]]}},"keywords":{}}],["sens",{"_index":187,"title":{},"content":{"13":{"position":[[88,5],[281,5]]},"399":{"position":[[583,5]]},"402":{"position":[[612,5]]},"453":{"position":[[683,5]]},"454":{"position":[[580,5]]},"462":{"position":[[981,5]]},"614":{"position":[[728,5]]},"617":{"position":[[927,5]]},"682":{"position":[[141,5]]},"703":{"position":[[1098,5]]},"798":{"position":[[736,5]]},"800":{"position":[[50,5]]},"815":{"position":[[333,6]]},"821":{"position":[[210,5],[433,5],[756,5]]},"932":{"position":[[323,5]]},"1066":{"position":[[542,5]]},"1093":{"position":[[120,5]]},"1194":{"position":[[104,5]]},"1213":{"position":[[424,5]]},"1249":{"position":[[136,6]]}},"keywords":{}}],["sensit",{"_index":863,"title":{},"content":{"57":{"position":[[348,9]]},"65":{"position":[[1596,9]]},"95":{"position":[[72,9],[230,9]]},"139":{"position":[[117,9]]},"167":{"position":[[162,9]]},"173":{"position":[[1277,9]]},"195":{"position":[[146,9]]},"218":{"position":[[97,9]]},"290":{"position":[[27,9]]},"291":{"position":[[235,9]]},"310":{"position":[[52,9]]},"343":{"position":[[108,9]]},"377":{"position":[[207,9]]},"396":{"position":[[105,9],[1828,9]]},"410":{"position":[[553,9]]},"479":{"position":[[268,9]]},"482":{"position":[[34,9],[1217,9]]},"483":{"position":[[297,9]]},"506":{"position":[[101,9]]},"526":{"position":[[62,9],[255,9]]},"550":{"position":[[176,9]]},"555":{"position":[[982,9]]},"564":{"position":[[57,9]]},"586":{"position":[[27,9]]},"638":{"position":[[48,9]]},"912":{"position":[[284,9]]}},"keywords":{}}],["sensor",{"_index":3459,"title":{},"content":{"569":{"position":[[677,7]]}},"keywords":{}}],["sent",{"_index":2589,"title":{"609":{"position":[[21,4]]},"612":{"position":[[16,4]]}},"content":{"410":{"position":[[578,4]]},"450":{"position":[[368,4]]},"491":{"position":[[636,4],[1675,4]]},"612":{"position":[[8,4],[392,4]]},"613":{"position":[[322,4]]},"616":{"position":[[542,4]]},"619":{"position":[[268,4]]},"620":{"position":[[49,4]]},"621":{"position":[[196,4]]},"622":{"position":[[209,4]]},"623":{"position":[[179,4]]},"624":{"position":[[129,4]]},"628":{"position":[[109,4]]},"698":{"position":[[1773,4],[1856,4]]},"875":{"position":[[7048,4],[7976,4]]},"886":{"position":[[332,4]]},"988":{"position":[[5049,4]]},"1066":{"position":[[31,4]]}},"keywords":{}}],["sentenc",{"_index":6206,"title":{},"content":{"1208":{"position":[[1125,8]]}},"keywords":{}}],["seo",{"_index":1436,"title":{"243":{"position":[[0,3]]},"244":{"position":[[0,4]]},"245":{"position":[[4,4]]}},"content":{},"keywords":{}}],["separ",{"_index":1141,"title":{},"content":{"145":{"position":[[18,10]]},"172":{"position":[[249,8]]},"328":{"position":[[160,8]]},"392":{"position":[[2055,8],[2583,8]]},"445":{"position":[[2318,8]]},"460":{"position":[[574,8],[843,8]]},"476":{"position":[[91,8]]},"487":{"position":[[46,8],[447,8]]},"801":{"position":[[374,8]]},"829":{"position":[[316,10],[1113,8]]},"1007":{"position":[[276,8]]},"1022":{"position":[[407,8]]},"1072":{"position":[[587,8]]},"1078":{"position":[[423,9],[476,10]]},"1093":{"position":[[308,9]]}},"keywords":{}}],["sequenc",{"_index":3901,"title":{},"content":{"689":{"position":[[403,8]]}},"keywords":{}}],["sequenti",{"_index":2350,"title":{},"content":{"396":{"position":[[1608,10]]}},"keywords":{}}],["seri",{"_index":4523,"title":{},"content":{"767":{"position":[[114,6],[218,6],[319,6],[740,6]]},"768":{"position":[[97,6],[179,6],[276,6],[748,6]]},"769":{"position":[[106,6],[192,6],[293,6],[711,6]]}},"keywords":{}}],["serial",{"_index":2036,"title":{"426":{"position":[[45,14]]}},"content":{"356":{"position":[[342,6]]},"426":{"position":[[124,14]]},"464":{"position":[[937,11]]},"759":{"position":[[879,6]]},"1194":{"position":[[530,9],[603,9],[642,6]]}},"keywords":{}}],["seriou",{"_index":2578,"title":{},"content":{"408":{"position":[[5519,7]]}},"keywords":{}}],["serv",{"_index":1180,"title":{},"content":{"162":{"position":[[64,5]]},"173":{"position":[[57,6]]},"216":{"position":[[25,5]]},"267":{"position":[[1129,6]]},"333":{"position":[[171,5]]},"412":{"position":[[8373,6]]},"432":{"position":[[20,6]]},"441":{"position":[[54,6]]},"461":{"position":[[462,5]]},"479":{"position":[[500,5]]},"502":{"position":[[662,5]]},"624":{"position":[[1512,5]]},"875":{"position":[[740,6]]},"1090":{"position":[[16,5],[211,7]]},"1100":{"position":[[138,6]]},"1123":{"position":[[309,7]]},"1151":{"position":[[157,6]]},"1178":{"position":[[156,6]]},"1210":{"position":[[526,6]]},"1227":{"position":[[382,6]]},"1265":{"position":[[375,6]]},"1320":{"position":[[880,6]]}},"keywords":{}}],["server",{"_index":240,"title":{"69":{"position":[[14,6]]},"100":{"position":[[14,6]]},"132":{"position":[[49,8]]},"163":{"position":[[49,8]]},"190":{"position":[[49,8]]},"202":{"position":[[22,6]]},"288":{"position":[[50,8]]},"337":{"position":[[49,8]]},"477":{"position":[[11,6]]},"491":{"position":[[19,7]]},"525":{"position":[[49,8]]},"582":{"position":[[49,8]]},"609":{"position":[[14,6]]},"612":{"position":[[9,6]]},"623":{"position":[[16,6]]},"708":{"position":[[0,6]]},"861":{"position":[[23,7]]},"874":{"position":[[31,6]]},"877":{"position":[[5,6]]},"885":{"position":[[30,7]]},"892":{"position":[[23,7]]},"893":{"position":[[25,7]]},"902":{"position":[[52,6]]},"906":{"position":[[10,7]]},"986":{"position":[[19,7]]},"1096":{"position":[[5,6]]},"1107":{"position":[[0,6]]},"1108":{"position":[[0,6]]},"1219":{"position":[[23,7]]},"1250":{"position":[[25,8]]},"1317":{"position":[[0,6]]}},"content":{"14":{"position":[[1129,6]]},"23":{"position":[[23,6],[254,6],[285,6]]},"26":{"position":[[193,8]]},"29":{"position":[[197,7]]},"37":{"position":[[64,6]]},"38":{"position":[[312,6]]},"43":{"position":[[160,6]]},"46":{"position":[[344,6],[616,7]]},"65":{"position":[[357,7]]},"66":{"position":[[251,6]]},"67":{"position":[[46,6]]},"69":{"position":[[1,6]]},"70":{"position":[[33,6]]},"82":{"position":[[149,7]]},"87":{"position":[[136,6]]},"91":{"position":[[129,6],[226,7]]},"92":{"position":[[118,6]]},"93":{"position":[[124,7]]},"98":{"position":[[47,6]]},"99":{"position":[[66,6],[136,7]]},"100":{"position":[[1,6]]},"101":{"position":[[44,6]]},"113":{"position":[[226,8]]},"122":{"position":[[225,6]]},"123":{"position":[[73,8]]},"132":{"position":[[55,6],[245,6]]},"133":{"position":[[219,6]]},"135":{"position":[[93,6],[208,7]]},"147":{"position":[[60,8]]},"151":{"position":[[264,7]]},"153":{"position":[[411,8]]},"157":{"position":[[218,6]]},"158":{"position":[[69,8]]},"164":{"position":[[358,7]]},"165":{"position":[[114,8]]},"172":{"position":[[267,6]]},"173":{"position":[[296,6],[1748,7],[2017,6]]},"174":{"position":[[3058,8]]},"181":{"position":[[337,8]]},"183":{"position":[[226,6]]},"184":{"position":[[189,8]]},"190":{"position":[[98,7]]},"191":{"position":[[182,6]]},"192":{"position":[[116,8]]},"202":{"position":[[156,7]]},"208":{"position":[[85,8]]},"209":{"position":[[779,6],[1073,6]]},"210":{"position":[[748,6]]},"217":{"position":[[165,6]]},"220":{"position":[[111,6]]},"224":{"position":[[164,6],[263,6]]},"225":{"position":[[30,6]]},"226":{"position":[[62,6]]},"227":{"position":[[28,6]]},"228":{"position":[[1,6]]},"238":{"position":[[141,8]]},"249":{"position":[[108,6],[475,8]]},"261":{"position":[[39,7],[205,7],[569,6],[1168,6]]},"262":{"position":[[546,6]]},"279":{"position":[[158,8]]},"280":{"position":[[365,6]]},"288":{"position":[[48,7],[302,8]]},"289":{"position":[[140,8],[577,8],[822,7],[1784,7]]},"293":{"position":[[284,7]]},"318":{"position":[[689,7]]},"321":{"position":[[296,7],[323,6]]},"322":{"position":[[263,6]]},"325":{"position":[[132,8]]},"327":{"position":[[268,6]]},"338":{"position":[[186,7]]},"340":{"position":[[56,6],[72,6]]},"357":{"position":[[554,6]]},"359":{"position":[[37,7]]},"360":{"position":[[513,7]]},"365":{"position":[[944,6],[1096,6],[1235,6],[1309,7],[1525,7],[1597,7]]},"367":{"position":[[148,6]]},"369":{"position":[[1089,8]]},"370":{"position":[[199,6],[292,6]]},"375":{"position":[[336,8]]},"381":{"position":[[451,6]]},"384":{"position":[[160,6]]},"399":{"position":[[4,6],[90,8]]},"400":{"position":[[774,6]]},"407":{"position":[[97,7],[576,6]]},"408":{"position":[[2757,6],[5341,7]]},"410":{"position":[[263,6],[597,8],[812,6],[1746,6],[2010,7],[2104,6]]},"411":{"position":[[9,6],[194,6],[581,7],[698,6],[1052,6],[1483,6],[2517,6],[5164,8]]},"412":{"position":[[1067,7],[2013,6],[2211,6],[4303,7],[5234,6],[5293,6],[5803,8],[7771,6],[8322,6],[8354,6],[8852,6],[8870,7],[9069,6],[9561,7],[9768,6],[10428,8],[10829,6],[10939,6],[11155,6],[11216,6],[12159,7],[12474,6],[12966,6],[13312,6],[14128,6]]},"414":{"position":[[206,6],[345,6]]},"415":{"position":[[304,7]]},"416":{"position":[[233,6],[351,6],[482,6]]},"421":{"position":[[688,6]]},"422":{"position":[[195,6]]},"424":{"position":[[466,6]]},"444":{"position":[[655,7]]},"445":{"position":[[714,6]]},"450":{"position":[[404,7]]},"455":{"position":[[229,6]]},"457":{"position":[[179,6]]},"461":{"position":[[99,6],[293,6]]},"474":{"position":[[31,7],[248,6]]},"476":{"position":[[28,6],[244,6]]},"477":{"position":[[67,7],[252,6]]},"481":{"position":[[58,6],[154,6],[755,6],[800,6]]},"483":{"position":[[166,6],[858,6]]},"486":{"position":[[116,6]]},"487":{"position":[[7,6],[152,6],[242,6]]},"489":{"position":[[574,6]]},"490":{"position":[[134,7]]},"491":{"position":[[315,6],[362,6],[629,6],[687,6],[1558,6],[1668,6]]},"495":{"position":[[352,7],[376,6],[508,6],[534,6]]},"496":{"position":[[15,6],[84,6],[638,6]]},"497":{"position":[[354,6],[831,6]]},"504":{"position":[[583,7],[659,8],[861,8],[993,8],[1473,6]]},"514":{"position":[[252,8]]},"517":{"position":[[116,8]]},"525":{"position":[[98,6],[196,6],[492,8]]},"534":{"position":[[597,6],[660,6]]},"556":{"position":[[1676,7]]},"570":{"position":[[803,6]]},"571":{"position":[[571,9]]},"574":{"position":[[420,6],[805,7]]},"575":{"position":[[380,6],[513,6]]},"582":{"position":[[206,7],[668,6],[701,6]]},"584":{"position":[[166,7]]},"594":{"position":[[595,6],[658,6]]},"610":{"position":[[57,6],[151,6],[283,6],[357,6],[420,6],[722,6]]},"611":{"position":[[116,7],[161,7],[778,6],[804,10],[881,9]]},"612":{"position":[[1,6],[57,6],[177,6],[359,7],[385,6],[786,6],[1109,6],[1428,6],[2322,9]]},"613":{"position":[[110,8]]},"614":{"position":[[219,6],[622,6],[660,6],[883,6]]},"616":{"position":[[96,6],[445,6],[535,6],[604,7],[902,6]]},"617":{"position":[[99,6],[591,7],[673,6],[742,6],[1083,6],[2004,6],[2303,6]]},"618":{"position":[[617,7],[662,7]]},"619":{"position":[[147,6],[261,6]]},"620":{"position":[[42,6],[168,6],[360,6]]},"621":{"position":[[239,6],[316,6],[545,6]]},"622":{"position":[[170,6],[370,6],[536,6]]},"623":{"position":[[92,6],[256,6],[496,6],[744,6]]},"624":{"position":[[21,6],[122,6],[440,6],[523,6],[945,6]]},"626":{"position":[[99,6],[196,6],[1193,7]]},"628":{"position":[[102,6]]},"630":{"position":[[72,6],[441,7],[786,6]]},"632":{"position":[[210,7],[312,6],[979,6],[2019,6],[2315,6],[2460,6],[2570,6],[2717,6]]},"634":{"position":[[240,6],[433,6]]},"640":{"position":[[544,6]]},"661":{"position":[[1762,6]]},"696":{"position":[[64,6],[574,6],[1772,7]]},"698":{"position":[[163,7],[732,7],[1706,7],[1785,6]]},"703":{"position":[[1055,6]]},"708":{"position":[[215,6]]},"711":{"position":[[2076,7],[2205,7]]},"723":{"position":[[569,6]]},"736":{"position":[[205,6],[504,7]]},"751":{"position":[[1265,6]]},"756":{"position":[[317,7]]},"772":{"position":[[431,7]]},"775":{"position":[[130,6]]},"778":{"position":[[133,7],[251,6]]},"780":{"position":[[453,7],[730,6]]},"781":{"position":[[371,6],[465,6]]},"782":{"position":[[94,6],[476,7]]},"784":{"position":[[471,6]]},"785":{"position":[[147,7]]},"793":{"position":[[861,6]]},"829":{"position":[[2888,6]]},"837":{"position":[[85,6],[921,7]]},"849":{"position":[[863,6]]},"851":{"position":[[110,6],[278,6]]},"854":{"position":[[1422,6]]},"860":{"position":[[43,6]]},"861":{"position":[[65,7],[1683,6],[1882,7]]},"862":{"position":[[38,7]]},"865":{"position":[[166,6]]},"866":{"position":[[809,8]]},"872":{"position":[[145,6],[186,7],[246,7],[291,6],[519,6],[671,6],[771,7],[1670,6],[2136,7],[3029,6],[3245,6],[3554,7],[3945,8],[4388,7]]},"875":{"position":[[666,6],[699,6],[1530,6],[1762,6],[1870,6],[1970,6],[3013,6],[3614,7],[3789,7],[3908,6],[4144,6],[4897,6],[6772,6],[6854,6],[7041,6],[7124,6],[7904,6],[7969,6],[8927,6]]},"876":{"position":[[100,7],[221,7]]},"878":{"position":[[17,6],[57,6],[245,8],[359,6],[441,7]]},"879":{"position":[[36,6],[323,6]]},"880":{"position":[[67,6]]},"881":{"position":[[128,6],[331,7]]},"882":{"position":[[9,6],[223,6]]},"885":{"position":[[8,6]]},"886":{"position":[[1829,7],[2216,7],[2914,6],[3334,7],[4979,6]]},"888":{"position":[[649,6]]},"889":{"position":[[83,6]]},"890":{"position":[[648,7],[1034,6]]},"892":{"position":[[229,6],[351,6]]},"893":{"position":[[347,6]]},"896":{"position":[[36,6]]},"897":{"position":[[597,8]]},"898":{"position":[[1825,6],[2853,7]]},"901":{"position":[[197,6],[684,6]]},"902":{"position":[[41,6],[339,6],[469,8],[599,6],[849,6]]},"903":{"position":[[70,7],[212,6],[310,6],[727,6]]},"904":{"position":[[2613,6],[2644,6],[2726,6]]},"906":{"position":[[82,6],[116,6],[219,6],[289,6],[450,6],[494,6],[657,6],[794,6],[1078,7]]},"907":{"position":[[73,6]]},"981":{"position":[[22,7]]},"983":{"position":[[105,6],[956,6]]},"984":{"position":[[128,6]]},"985":{"position":[[348,6]]},"987":{"position":[[31,7]]},"988":{"position":[[448,7],[487,6],[2486,7],[3680,6],[5042,6],[5934,7]]},"990":{"position":[[1070,6]]},"996":{"position":[[455,6]]},"1002":{"position":[[972,6]]},"1005":{"position":[[217,6]]},"1006":{"position":[[303,6]]},"1007":{"position":[[478,6]]},"1024":{"position":[[70,7]]},"1080":{"position":[[1053,6]]},"1087":{"position":[[92,6],[124,7]]},"1088":{"position":[[39,7],[105,6],[317,6]]},"1089":{"position":[[30,6]]},"1090":{"position":[[1190,6]]},"1091":{"position":[[19,6]]},"1092":{"position":[[37,7],[74,6],[213,7],[337,6]]},"1093":{"position":[[318,7],[527,7]]},"1094":{"position":[[309,7],[343,6]]},"1095":{"position":[[39,7],[235,7],[348,6]]},"1097":{"position":[[53,6],[90,6],[171,6],[248,7],[322,7],[868,6]]},"1100":{"position":[[343,6],[835,6],[931,6],[993,7]]},"1101":{"position":[[87,6],[150,6],[254,6],[574,6],[732,6]]},"1102":{"position":[[1214,6]]},"1103":{"position":[[17,6],[107,6]]},"1104":{"position":[[67,6]]},"1105":{"position":[[127,7],[274,7],[416,7]]},"1106":{"position":[[328,7]]},"1107":{"position":[[167,7]]},"1108":{"position":[[107,7],[323,6],[518,6],[667,6]]},"1109":{"position":[[58,7]]},"1110":{"position":[[46,6]]},"1112":{"position":[[13,6],[536,6]]},"1123":{"position":[[627,6]]},"1124":{"position":[[1304,6],[1342,6],[2078,7]]},"1133":{"position":[[245,6]]},"1135":{"position":[[189,7]]},"1148":{"position":[[411,6]]},"1149":{"position":[[1272,7]]},"1188":{"position":[[18,7]]},"1191":{"position":[[90,6]]},"1196":{"position":[[162,7]]},"1198":{"position":[[1443,6],[1581,7],[1716,6]]},"1213":{"position":[[487,7]]},"1219":{"position":[[97,7],[451,6],[618,6]]},"1247":{"position":[[271,6],[626,6]]},"1250":{"position":[[61,7],[139,6],[154,6]]},"1295":{"position":[[43,6],[284,6],[355,7],[503,8]]},"1301":{"position":[[360,6]]},"1304":{"position":[[471,7],[669,8],[731,7],[890,6],[1017,7],[1817,6]]},"1307":{"position":[[395,6]]},"1308":{"position":[[145,7],[621,6]]},"1313":{"position":[[8,6],[245,6]]},"1314":{"position":[[327,8],[628,7]]},"1315":{"position":[[818,6]]},"1316":{"position":[[68,7],[2556,8],[2624,6]]},"1317":{"position":[[66,7],[182,7],[198,6]]},"1324":{"position":[[738,8]]}},"keywords":{}}],["server'",{"_index":3552,"title":{},"content":{"610":{"position":[[547,8]]}},"keywords":{}}],["server.addreplicationendpoint",{"_index":4965,"title":{},"content":{"872":{"position":[[3367,31]]},"1100":{"position":[[650,31]]},"1101":{"position":[[462,31]]},"1103":{"position":[[305,31]]},"1105":{"position":[[731,31]]},"1106":{"position":[[669,31]]},"1108":{"position":[[399,31]]}},"keywords":{}}],["server.addrestendpoint",{"_index":5935,"title":{},"content":{"1102":{"position":[[342,24]]}},"keywords":{}}],["server.conflict",{"_index":3172,"title":{},"content":{"491":{"position":[[1304,15]]}},"keywords":{}}],["server.graphql",{"_index":2157,"title":{},"content":{"381":{"position":[[223,14]]}},"keywords":{}}],["server.handl",{"_index":1918,"title":{},"content":{"321":{"position":[[182,13]]}},"keywords":{}}],["server.j",{"_index":6250,"title":{},"content":{"1219":{"position":[[253,9]]}},"keywords":{}}],["server.l",{"_index":1573,"title":{},"content":{"255":{"position":[[185,11]]}},"keywords":{}}],["server.no",{"_index":3410,"title":{},"content":{"559":{"position":[[1442,9]]}},"keywords":{}}],["server.push",{"_index":1338,"title":{},"content":{"208":{"position":[[185,12]]},"255":{"position":[[141,12]]}},"keywords":{}}],["server.start",{"_index":4968,"title":{},"content":{"872":{"position":[[3568,15]]}},"keywords":{}}],["server.t",{"_index":4946,"title":{},"content":{"872":{"position":[[835,9],[1530,9],[2270,9],[3090,9]]},"875":{"position":[[788,9],[2011,9],[4257,9],[7211,9]]},"1101":{"position":[[435,9]]}},"keywords":{}}],["server/blob/master/package.json",{"_index":5922,"title":{},"content":{"1097":{"position":[[569,31]]}},"keywords":{}}],["server/databas",{"_index":3164,"title":{},"content":{"491":{"position":[[206,15]]}},"keywords":{}}],["server/plugins/adapt",{"_index":4962,"title":{},"content":{"872":{"position":[[3206,22]]},"1097":{"position":[[649,22]]}},"keywords":{}}],["server/plugins/cli",{"_index":5940,"title":{},"content":{"1102":{"position":[[888,21]]}},"keywords":{}}],["server/plugins/repl",{"_index":4972,"title":{},"content":{"872":{"position":[[3918,26]]},"878":{"position":[[218,26]]}},"keywords":{}}],["server/plugins/serv",{"_index":4960,"title":{},"content":{"872":{"position":[[3137,23]]},"1097":{"position":[[368,23]]},"1098":{"position":[[208,23]]},"1099":{"position":[[190,23]]}},"keywords":{}}],["serverbasedon",{"_index":6253,"title":{},"content":{"1219":{"position":[[657,13]]}},"keywords":{}}],["serverbasedondatabas",{"_index":6252,"title":{},"content":{"1219":{"position":[[486,21]]},"1220":{"position":[[165,21]]}},"keywords":{}}],["serverdata",{"_index":5647,"title":{},"content":{"1024":{"position":[[433,10],[528,10]]}},"keywords":{}}],["serverdatacollect",{"_index":5645,"title":{},"content":{"1024":{"position":[[277,21]]}},"keywords":{}}],["serverdatacollection.upsert",{"_index":5648,"title":{},"content":{"1024":{"position":[[475,29]]}},"keywords":{}}],["serverdb",{"_index":4954,"title":{},"content":{"872":{"position":[[1738,11]]}},"keywords":{}}],["servergraphql",{"_index":6081,"title":{},"content":{"1149":{"position":[[183,13]]}},"keywords":{}}],["serveronlyfield",{"_index":5968,"title":{},"content":{"1108":{"position":[[39,16],[206,16],[256,16],[530,17],[635,17]]}},"keywords":{}}],["servers.custom",{"_index":2158,"title":{},"content":{"381":{"position":[[336,14]]}},"keywords":{}}],["servers.two",{"_index":5182,"title":{},"content":{"896":{"position":[[100,11]]}},"keywords":{}}],["serverst",{"_index":5176,"title":{},"content":{"892":{"position":[[242,11]]},"906":{"position":[[974,11]]}},"keywords":{}}],["serverstate.clos",{"_index":5178,"title":{},"content":{"892":{"position":[[364,20]]}},"keywords":{}}],["servertimestamp",{"_index":4875,"title":{},"content":{"854":{"position":[[1466,17],[1630,17]]},"857":{"position":[[161,15],[230,15],[404,16],[421,17]]},"858":{"position":[[600,16]]}},"keywords":{}}],["servertimestampfield",{"_index":4332,"title":{},"content":{"749":{"position":[[15152,20]]},"854":{"position":[[1502,20],[1608,21]]}},"keywords":{}}],["server—rxdb",{"_index":3424,"title":{},"content":{"561":{"position":[[92,11]]}},"keywords":{}}],["server’",{"_index":5210,"title":{},"content":{"898":{"position":[[1863,8]]}},"keywords":{}}],["servic",{"_index":423,"title":{"145":{"position":[[12,8]]}},"content":{"26":{"position":[[27,7]]},"36":{"position":[[446,7]]},"39":{"position":[[426,7]]},"51":{"position":[[968,8]]},"145":{"position":[[111,7],[177,7]]},"152":{"position":[[116,9]]},"249":{"position":[[62,8]]},"380":{"position":[[348,7]]},"412":{"position":[[2861,8],[12016,7]]},"417":{"position":[[389,7]]},"418":{"position":[[426,8],[656,8]]},"500":{"position":[[581,7]]},"839":{"position":[[199,8]]},"840":{"position":[[128,7]]},"871":{"position":[[664,10]]},"897":{"position":[[564,7]]},"898":{"position":[[2877,7]]},"1219":{"position":[[178,8]]},"1233":{"position":[[30,7],[52,7]]}},"keywords":{}}],["service"",{"_index":313,"title":{},"content":{"18":{"position":[[361,14]]}},"keywords":{}}],["services"",{"_index":2824,"title":{},"content":{"419":{"position":[[1871,14]]}},"keywords":{}}],["services.if",{"_index":3376,"title":{},"content":{"556":{"position":[[1633,11]]}},"keywords":{}}],["services.react",{"_index":2167,"title":{},"content":{"384":{"position":[[196,14]]}},"keywords":{}}],["servicework",{"_index":3006,"title":{},"content":{"460":{"position":[[298,13]]},"1233":{"position":[[138,14],[172,13]]}},"keywords":{}}],["session",{"_index":1751,"title":{},"content":{"299":{"position":[[541,8]]},"305":{"position":[[338,8]]},"323":{"position":[[626,9]]},"365":{"position":[[361,8],[603,9],[728,9]]},"430":{"position":[[1009,9]]},"436":{"position":[[46,7],[189,8]]},"450":{"position":[[122,7]]},"451":{"position":[[371,8]]},"559":{"position":[[948,8]]},"890":{"position":[[495,7]]}},"keywords":{}}],["sessionstorag",{"_index":2917,"title":{"436":{"position":[[16,15]]}},"content":{"436":{"position":[[95,15],[327,14]]},"451":{"position":[[721,14],[840,14]]}},"keywords":{}}],["set",{"_index":171,"title":{"48":{"position":[[0,3]]},"210":{"position":[[0,7]]},"536":{"position":[[0,3]]},"552":{"position":[[0,7]]},"554":{"position":[[3,3]]},"596":{"position":[[0,3]]},"797":{"position":[[0,3]]},"856":{"position":[[7,3]]},"862":{"position":[[0,7]]},"872":{"position":[[0,7]]},"898":{"position":[[0,7]]},"1002":{"position":[[0,7]]},"1066":{"position":[[0,7]]},"1213":{"position":[[0,7]]},"1230":{"position":[[0,3]]}},"content":{"11":{"position":[[911,8]]},"52":{"position":[[556,5]]},"84":{"position":[[384,7]]},"114":{"position":[[397,7]]},"116":{"position":[[221,3]]},"149":{"position":[[397,7]]},"175":{"position":[[388,7]]},"178":{"position":[[174,9]]},"184":{"position":[[259,7]]},"192":{"position":[[64,7]]},"241":{"position":[[170,3]]},"261":{"position":[[1002,4]]},"284":{"position":[[133,3]]},"287":{"position":[[406,3]]},"298":{"position":[[678,4]]},"301":{"position":[[94,4]]},"303":{"position":[[426,4]]},"310":{"position":[[307,4]]},"314":{"position":[[643,3]]},"329":{"position":[[134,4]]},"333":{"position":[[88,3]]},"336":{"position":[[157,3]]},"342":{"position":[[85,5]]},"346":{"position":[[776,4]]},"347":{"position":[[395,7]]},"353":{"position":[[406,4]]},"361":{"position":[[224,8]]},"362":{"position":[[1466,7]]},"367":{"position":[[896,3]]},"373":{"position":[[170,3],[647,3]]},"376":{"position":[[571,4]]},"392":{"position":[[2414,3],[4953,7]]},"396":{"position":[[901,3]]},"397":{"position":[[1501,3]]},"398":{"position":[[257,3],[1803,3]]},"402":{"position":[[938,7],[1479,3]]},"407":{"position":[[899,3]]},"411":{"position":[[1339,3]]},"412":{"position":[[2412,7],[6957,3]]},"417":{"position":[[142,4]]},"427":{"position":[[56,3]]},"430":{"position":[[1082,6]]},"450":{"position":[[207,8]]},"455":{"position":[[884,7]]},"480":{"position":[[819,3]]},"498":{"position":[[197,7]]},"502":{"position":[[1046,3]]},"511":{"position":[[397,7]]},"518":{"position":[[513,3]]},"523":{"position":[[35,3]]},"531":{"position":[[397,7]]},"536":{"position":[[1,7]]},"538":{"position":[[171,7]]},"539":{"position":[[556,5]]},"542":{"position":[[243,3]]},"554":{"position":[[265,3]]},"555":{"position":[[13,3]]},"559":{"position":[[115,3],[1654,5]]},"560":{"position":[[340,8]]},"561":{"position":[[36,4]]},"566":{"position":[[1427,8]]},"567":{"position":[[228,7]]},"571":{"position":[[850,4],[994,3]]},"575":{"position":[[671,3]]},"579":{"position":[[34,3]]},"591":{"position":[[395,7]]},"596":{"position":[[1,7]]},"598":{"position":[[172,7]]},"599":{"position":[[583,5]]},"612":{"position":[[1062,3],[1458,3],[1692,3]]},"617":{"position":[[1456,7]]},"644":{"position":[[34,3],[235,4]]},"648":{"position":[[20,4],[120,3]]},"653":{"position":[[9,3],[992,3]]},"654":{"position":[[248,7],[407,7]]},"659":{"position":[[1006,9]]},"661":{"position":[[589,3]]},"662":{"position":[[1386,9]]},"674":{"position":[[96,3]]},"678":{"position":[[314,3],[345,5]]},"680":{"position":[[227,3]]},"681":{"position":[[451,4]]},"683":{"position":[[115,4],[307,5],[901,5]]},"684":{"position":[[52,7],[192,5]]},"688":{"position":[[1007,3]]},"696":{"position":[[237,4]]},"701":{"position":[[146,3]]},"709":{"position":[[176,3],[201,4]]},"710":{"position":[[822,3]]},"711":{"position":[[1407,3]]},"717":{"position":[[938,3]]},"719":{"position":[[17,3]]},"720":{"position":[[54,3]]},"721":{"position":[[296,7],[360,3]]},"734":{"position":[[638,3],[817,3]]},"740":{"position":[[400,3]]},"746":{"position":[[212,8],[348,9],[453,8]]},"749":{"position":[[684,3],[2721,3],[3426,3],[3457,8],[5803,3],[5865,3],[10496,3],[14406,3],[16566,3],[19158,3],[20186,3],[20351,3],[20610,3],[20905,4],[21642,3],[22645,3],[22876,3]]},"754":{"position":[[435,3]]},"764":{"position":[[136,3]]},"767":{"position":[[373,3]]},"772":{"position":[[493,7],[1259,3],[1823,3]]},"775":{"position":[[337,3]]},"780":{"position":[[235,7]]},"796":{"position":[[113,4]]},"799":{"position":[[44,3]]},"806":{"position":[[86,3]]},"821":{"position":[[268,11],[889,3]]},"825":{"position":[[222,3],[250,3]]},"826":{"position":[[780,3],[878,3]]},"828":{"position":[[243,3]]},"829":{"position":[[815,7]]},"835":{"position":[[1060,8]]},"838":{"position":[[1480,3],[2366,3]]},"841":{"position":[[954,5],[1349,8]]},"848":{"position":[[940,3]]},"849":{"position":[[466,3],[787,8]]},"854":{"position":[[1445,3]]},"855":{"position":[[175,3],[276,7]]},"857":{"position":[[121,3]]},"861":{"position":[[170,3],[226,3],[2053,4],[2193,3],[2364,8],[2400,3]]},"862":{"position":[[18,3],[84,3],[1451,3]]},"867":{"position":[[170,3],[271,7]]},"870":{"position":[[252,4]]},"871":{"position":[[859,3]]},"872":{"position":[[169,3],[370,3]]},"875":{"position":[[537,8],[578,8],[2972,8],[6071,8]]},"882":{"position":[[313,3]]},"887":{"position":[[533,3]]},"890":{"position":[[302,3]]},"894":{"position":[[168,9]]},"903":{"position":[[650,7]]},"904":{"position":[[2595,3]]},"905":{"position":[[177,3]]},"908":{"position":[[220,3]]},"913":{"position":[[45,3]]},"916":{"position":[[83,3]]},"932":{"position":[[1132,3]]},"963":{"position":[[93,3]]},"964":{"position":[[119,3],[377,3]]},"965":{"position":[[330,3]]},"966":{"position":[[297,7],[338,7],[501,3]]},"982":{"position":[[590,3]]},"986":{"position":[[394,3],[1502,3]]},"987":{"position":[[1020,7]]},"988":{"position":[[677,8],[1486,3],[1830,3],[1920,7],[4815,3]]},"989":{"position":[[135,7],[259,8],[326,4]]},"1002":{"position":[[124,7],[790,7]]},"1007":{"position":[[206,7]]},"1009":{"position":[[109,4]]},"1013":{"position":[[147,3],[720,3]]},"1022":{"position":[[356,3]]},"1041":{"position":[[339,5],[370,4]]},"1043":{"position":[[117,7]]},"1047":{"position":[[112,3]]},"1048":{"position":[[158,3],[220,7],[365,7],[452,5]]},"1051":{"position":[[316,3]]},"1055":{"position":[[90,3]]},"1056":{"position":[[64,4]]},"1057":{"position":[[49,3]]},"1058":{"position":[[58,3]]},"1060":{"position":[[180,3]]},"1067":{"position":[[376,3],[1749,3],[2293,7],[2441,3]]},"1068":{"position":[[72,7]]},"1074":{"position":[[71,9],[1034,3]]},"1078":{"position":[[152,3],[596,3],[905,3]]},"1079":{"position":[[254,3]]},"1080":{"position":[[219,3],[340,3],[530,3]]},"1082":{"position":[[304,3]]},"1083":{"position":[[4,7],[504,3]]},"1084":{"position":[[408,3]]},"1085":{"position":[[1638,3],[1706,4]]},"1088":{"position":[[581,3]]},"1089":{"position":[[194,3]]},"1090":{"position":[[1311,7],[1376,9]]},"1094":{"position":[[557,7]]},"1105":{"position":[[587,4]]},"1107":{"position":[[434,3],[1039,3]]},"1108":{"position":[[56,3],[226,4]]},"1114":{"position":[[133,7]]},"1115":{"position":[[295,3],[835,3]]},"1125":{"position":[[103,3]]},"1126":{"position":[[89,3],[598,8]]},"1130":{"position":[[296,3]]},"1134":{"position":[[395,3]]},"1156":{"position":[[168,4]]},"1164":{"position":[[513,7],[745,3],[832,3]]},"1172":{"position":[[432,3]]},"1174":{"position":[[739,7]]},"1175":{"position":[[36,3]]},"1176":{"position":[[494,7]]},"1185":{"position":[[256,7]]},"1193":{"position":[[113,3]]},"1213":{"position":[[523,3],[748,3]]},"1229":{"position":[[12,7]]},"1230":{"position":[[104,3],[222,3]]},"1236":{"position":[[103,9]]},"1242":{"position":[[108,3]]},"1257":{"position":[[159,3]]},"1268":{"position":[[12,7]]},"1277":{"position":[[450,3]]},"1282":{"position":[[128,3],[1058,7]]},"1284":{"position":[[33,3]]},"1294":{"position":[[2035,3]]},"1297":{"position":[[34,3]]},"1314":{"position":[[649,3]]},"1315":{"position":[[907,4]]},"1316":{"position":[[883,3],[1100,4]]},"1318":{"position":[[645,4]]},"1321":{"position":[[756,3]]}},"keywords":{}}],["set<rxdocument>",{"_index":2393,"title":{},"content":{"398":{"position":[[804,24],[2072,24]]}},"keywords":{}}],["setdatabas",{"_index":4747,"title":{},"content":{"829":{"position":[[1432,12]]}},"keywords":{}}],["setdatabase(db",{"_index":4748,"title":{},"content":{"829":{"position":[[1544,16]]}},"keywords":{}}],["setflutterrxdatabaseconnector",{"_index":1247,"title":{},"content":{"188":{"position":[[604,32],[752,30],[1563,30]]}},"keywords":{}}],["sethead",{"_index":5172,"title":{},"content":{"890":{"position":[[228,14]]}},"keywords":{}}],["sethero",{"_index":3307,"title":{},"content":{"541":{"position":[[268,10]]},"562":{"position":[[1139,10]]}},"keywords":{}}],["setheroes(newhero",{"_index":3310,"title":{},"content":{"541":{"position":[[436,21]]},"562":{"position":[[1334,21]]}},"keywords":{}}],["setinterv",{"_index":3606,"title":{},"content":{"612":{"position":[[2223,14]]},"996":{"position":[[532,14]]}},"keywords":{}}],["setinterval(async",{"_index":4097,"title":{},"content":{"739":{"position":[[585,17]]}},"keywords":{}}],["setitem",{"_index":2867,"title":{},"content":{"425":{"position":[[167,8],[268,7]]},"451":{"position":[[194,8]]}},"keywords":{}}],["setitem('mykey",{"_index":4769,"title":{},"content":{"835":{"position":[[456,16]]}},"keywords":{}}],["setpremiumflag",{"_index":3863,"title":{},"content":{"676":{"position":[[245,16],[302,14],[355,17]]},"958":{"position":[[694,16],[757,14],[810,17]]},"1151":{"position":[[823,16],[879,14],[932,17]]},"1178":{"position":[[820,16],[876,14],[929,17]]}},"keywords":{}}],["sets.corrupt",{"_index":2064,"title":{},"content":{"358":{"position":[[606,15]]}},"keywords":{}}],["setstat",{"_index":1291,"title":{},"content":{"188":{"position":[[3251,11]]}},"keywords":{}}],["settimeout",{"_index":5271,"title":{},"content":{"910":{"position":[[427,13]]}},"keywords":{}}],["settimeout(longpol",{"_index":3562,"title":{},"content":{"610":{"position":[[1329,20]]}},"keywords":{}}],["settimeout(r",{"_index":4532,"title":{},"content":{"767":{"position":[[580,15],[989,15]]},"768":{"position":[[582,15],[991,15]]},"769":{"position":[[539,15],[960,15]]}},"keywords":{}}],["settings_max_concurrent_stream",{"_index":3647,"title":{},"content":{"617":{"position":[[1424,31]]}},"keywords":{}}],["setup",{"_index":1663,"title":{"285":{"position":[[0,5]]},"293":{"position":[[8,5]]},"480":{"position":[[6,5]]},"638":{"position":[[0,5]]},"639":{"position":[[0,5]]},"730":{"position":[[8,5]]},"875":{"position":[[0,6]]}},"content":{"285":{"position":[[285,5]]},"293":{"position":[[175,6]]},"299":{"position":[[1744,7]]},"390":{"position":[[1734,5]]},"392":{"position":[[4871,5]]},"402":{"position":[[823,6]]},"454":{"position":[[607,5]]},"463":{"position":[[52,5],[279,5]]},"477":{"position":[[141,6]]},"522":{"position":[[270,6]]},"556":{"position":[[1461,5]]},"601":{"position":[[347,5]]},"632":{"position":[[1011,5],[2081,5]]},"830":{"position":[[200,5]]},"832":{"position":[[420,5]]},"871":{"position":[[478,6]]},"886":{"position":[[887,5],[2588,5]]},"1007":{"position":[[710,6]]},"1128":{"position":[[8,5]]},"1147":{"position":[[207,7]]},"1156":{"position":[[251,6]]},"1189":{"position":[[61,6]]},"1235":{"position":[[57,5]]}},"keywords":{}}],["setup>",{"_index":3493,"title":{},"content":{"580":{"position":[[289,9]]}},"keywords":{}}],["setup.join",{"_index":5283,"title":{},"content":{"913":{"position":[[229,10]]}},"keywords":{}}],["setuprxdb",{"_index":3425,"title":{},"content":{"562":{"position":[[136,11]]}},"keywords":{}}],["setuprxdbwithsign",{"_index":3432,"title":{},"content":{"563":{"position":[[437,22]]}},"keywords":{}}],["setusernam",{"_index":3389,"title":{},"content":{"559":{"position":[[287,12]]}},"keywords":{}}],["setusername(e.target.valu",{"_index":3398,"title":{},"content":{"559":{"position":[[645,28]]}},"keywords":{}}],["sever",{"_index":479,"title":{},"content":{"29":{"position":[[213,7]]},"37":{"position":[[126,7]]},"47":{"position":[[61,7]]},"65":{"position":[[1847,7]]},"118":{"position":[[304,7]]},"137":{"position":[[13,7]]},"186":{"position":[[182,7]]},"356":{"position":[[46,7]]},"365":{"position":[[67,7]]},"425":{"position":[[124,7]]},"450":{"position":[[190,7],[289,7]]},"453":{"position":[[864,7]]},"535":{"position":[[63,7]]},"595":{"position":[[63,7]]},"836":{"position":[[1222,7]]},"849":{"position":[[398,7]]},"860":{"position":[[304,7]]},"1065":{"position":[[1596,7]]},"1079":{"position":[[448,7]]},"1085":{"position":[[1852,7]]},"1300":{"position":[[930,7]]},"1316":{"position":[[532,7]]}},"keywords":{}}],["sha256",{"_index":5403,"title":{},"content":{"968":{"position":[[382,6]]}},"keywords":{}}],["shape",{"_index":3422,"title":{},"content":{"561":{"position":[[11,6]]},"898":{"position":[[3494,5]]}},"keywords":{}}],["shard",{"_index":1843,"title":{"643":{"position":[[0,8]]},"1221":{"position":[[0,8]]},"1222":{"position":[[10,8]]},"1295":{"position":[[10,9]]}},"content":{"303":{"position":[[995,8]]},"402":{"position":[[2789,8]]},"408":{"position":[[4703,8]]},"469":{"position":[[182,8],[1188,8]]},"643":{"position":[[66,8]]},"793":{"position":[[555,8]]},"870":{"position":[[261,7]]},"871":{"position":[[866,7]]},"1222":{"position":[[68,10],[206,8],[438,8],[559,9],[587,6],[680,5],[758,6],[833,6],[935,7],[953,8],[985,5],[1077,5]]},"1238":{"position":[[150,8],[510,10]]},"1246":{"position":[[959,9],[1068,8],[1134,8],[1190,7]]},"1295":{"position":[[1,8],[211,6],[227,5],[543,9],[797,8],[929,6],[1163,8],[1295,7],[1375,6],[1456,8],[1512,8],[1552,8]]},"1304":{"position":[[2010,8]]}},"keywords":{}}],["shardedrxstorag",{"_index":6263,"title":{},"content":{"1222":{"position":[[235,16],[1440,16]]}},"keywords":{}}],["share",{"_index":432,"title":{"775":{"position":[[0,5]]}},"content":{"26":{"position":[[365,6]]},"174":{"position":[[1891,5]]},"207":{"position":[[307,7]]},"210":{"position":[[124,5]]},"289":{"position":[[972,8],[1988,7]]},"299":{"position":[[334,6]]},"306":{"position":[[292,5]]},"365":{"position":[[1335,8]]},"390":{"position":[[1444,6]]},"411":{"position":[[4208,6],[4420,6]]},"422":{"position":[[226,5]]},"450":{"position":[[263,5],[739,6]]},"458":{"position":[[273,5],[518,5],[597,5]]},"469":{"position":[[983,6]]},"471":{"position":[[1,5]]},"475":{"position":[[93,5]]},"579":{"position":[[838,5]]},"617":{"position":[[177,6],[272,6],[2120,6]]},"644":{"position":[[324,5]]},"775":{"position":[[75,5],[148,5]]},"779":{"position":[[408,5]]},"890":{"position":[[516,6]]},"913":{"position":[[313,5]]},"961":{"position":[[188,5]]},"964":{"position":[[173,7],[286,6]]},"1123":{"position":[[377,6],[398,6]]},"1124":{"position":[[1040,6],[1255,5]]},"1126":{"position":[[813,5],[883,6]]},"1225":{"position":[[111,6]]},"1226":{"position":[[441,6]]},"1227":{"position":[[5,6]]},"1228":{"position":[[155,6]]},"1230":{"position":[[71,6],[342,6]]},"1231":{"position":[[424,6]]},"1233":{"position":[[88,6]]},"1301":{"position":[[700,6]]}},"keywords":{}}],["shared/lik",{"_index":2509,"title":{},"content":{"405":{"position":[[1,11]]}},"keywords":{}}],["shared_prefer",{"_index":1245,"title":{},"content":{"188":{"position":[[382,18]]}},"keywords":{}}],["sharedwork",{"_index":2492,"title":{"1223":{"position":[[0,12]]},"1225":{"position":[[7,12]]},"1229":{"position":[[13,12]]},"1231":{"position":[[17,13]]}},"content":{"402":{"position":[[2824,12]]},"458":{"position":[[1455,12],[1573,12]]},"460":{"position":[[278,12],[365,12],[762,12]]},"721":{"position":[[38,12]]},"757":{"position":[[108,12]]},"793":{"position":[[502,12]]},"801":{"position":[[912,12]]},"1183":{"position":[[277,12],[348,12]]},"1207":{"position":[[426,13]]},"1226":{"position":[[357,12]]},"1227":{"position":[[535,14]]},"1229":{"position":[[94,12]]},"1231":{"position":[[8,12]]},"1232":{"position":[[5,12]]},"1246":{"position":[[342,13],[455,12]]},"1265":{"position":[[529,14]]},"1301":{"position":[[584,13],[600,12],[684,12],[771,12],[904,12],[1086,13]]}},"keywords":{}}],["shed",{"_index":3220,"title":{},"content":{"501":{"position":[[259,5]]}},"keywords":{}}],["shell",{"_index":4940,"title":{},"content":{"872":{"position":[[435,5]]}},"keywords":{}}],["shift",{"_index":2539,"title":{"445":{"position":[[29,5]]}},"content":{"408":{"position":[[1357,5]]},"412":{"position":[[4323,6]]},"416":{"position":[[78,6]]}},"keywords":{}}],["shim",{"_index":95,"title":{},"content":{"7":{"position":[[35,4]]}},"keywords":{}}],["ship",{"_index":2969,"title":{},"content":{"454":{"position":[[359,7]]},"496":{"position":[[495,8]]},"708":{"position":[[189,4],[427,8]]},"898":{"position":[[2904,4]]},"904":{"position":[[1762,7]]},"906":{"position":[[188,5]]},"1210":{"position":[[158,7]]},"1227":{"position":[[140,5]]},"1265":{"position":[[133,5]]},"1270":{"position":[[504,4]]},"1271":{"position":[[106,7]]},"1272":{"position":[[233,5]]},"1275":{"position":[[96,7]]}},"keywords":{}}],["short",{"_index":1166,"title":{},"content":{"153":{"position":[[7,5]]},"301":{"position":[[587,5]]},"322":{"position":[[6,6]]},"354":{"position":[[1403,6]]},"396":{"position":[[465,5]]},"408":{"position":[[1207,6]]},"412":{"position":[[7547,6],[13049,6]]},"480":{"position":[[12,5]]},"514":{"position":[[7,5]]},"570":{"position":[[666,6]]},"575":{"position":[[8,5]]},"698":{"position":[[3053,5]]},"709":{"position":[[235,5]]},"783":{"position":[[42,5]]},"948":{"position":[[70,5]]}},"keywords":{}}],["shortcom",{"_index":4775,"title":{},"content":{"836":{"position":[[1230,12]]}},"keywords":{}}],["shorten",{"_index":1825,"title":{},"content":{"303":{"position":[[336,7]]},"316":{"position":[[427,8]]},"361":{"position":[[360,8]]},"402":{"position":[[96,7],[575,10],[666,9]]},"588":{"position":[[19,8]]}},"keywords":{}}],["shorter",{"_index":1130,"title":{},"content":{"141":{"position":[[145,7]]},"639":{"position":[[151,7]]}},"keywords":{}}],["shortli",{"_index":3685,"title":{},"content":{"626":{"position":[[996,7]]}},"keywords":{}}],["shouldretri",{"_index":5144,"title":{},"content":{"886":{"position":[[4586,14]]}},"keywords":{}}],["show",{"_index":402,"title":{},"content":{"24":{"position":[[472,4]]},"31":{"position":[[207,5]]},"299":{"position":[[1280,7]]},"300":{"position":[[125,5]]},"301":{"position":[[602,5]]},"302":{"position":[[1011,4]]},"400":{"position":[[687,4]]},"408":{"position":[[3110,5]]},"410":{"position":[[1645,4]]},"411":{"position":[[5404,4]]},"412":{"position":[[3614,7],[5085,4]]},"420":{"position":[[416,4]]},"458":{"position":[[319,4]]},"474":{"position":[[68,4]]},"476":{"position":[[57,4]]},"554":{"position":[[250,7]]},"700":{"position":[[590,4]]},"752":{"position":[[289,4],[1333,4]]},"753":{"position":[[177,4]]},"832":{"position":[[307,5]]},"995":{"position":[[725,4]]},"1058":{"position":[[145,4]]},"1207":{"position":[[814,7]]},"1209":{"position":[[412,5]]},"1294":{"position":[[1840,5]]},"1298":{"position":[[418,5]]}},"keywords":{}}],["showcas",{"_index":3212,"title":{},"content":{"498":{"position":[[278,9]]},"543":{"position":[[156,10]]},"603":{"position":[[154,10]]}},"keywords":{}}],["showloadingspinn",{"_index":5514,"title":{},"content":{"995":{"position":[[1820,21]]}},"keywords":{}}],["shown",{"_index":420,"title":{},"content":{"25":{"position":[[295,5]]},"43":{"position":[[370,5]]},"400":{"position":[[127,6]]},"456":{"position":[[97,5]]},"467":{"position":[[442,5]]},"524":{"position":[[958,5]]},"610":{"position":[[1472,5]]},"611":{"position":[[969,5]]},"619":{"position":[[41,5]]},"831":{"position":[[32,5]]},"838":{"position":[[3133,5]]},"861":{"position":[[1146,5]]},"1098":{"position":[[106,5]]},"1099":{"position":[[98,5]]},"1156":{"position":[[217,5]]},"1215":{"position":[[228,5]]},"1271":{"position":[[1665,5]]},"1295":{"position":[[629,5],[758,5]]},"1296":{"position":[[1595,6]]},"1297":{"position":[[388,5]]},"1300":{"position":[[1007,5]]}},"keywords":{}}],["shrimp",{"_index":2843,"title":{},"content":{"420":{"position":[[1293,6]]}},"keywords":{}}],["shrink",{"_index":5918,"title":{},"content":{"1092":{"position":[[652,7]]}},"keywords":{}}],["shut",{"_index":352,"title":{},"content":{"20":{"position":[[131,4]]},"28":{"position":[[508,4]]},"1300":{"position":[[1175,4]]}},"keywords":{}}],["side",{"_index":206,"title":{"69":{"position":[[21,4]]},"100":{"position":[[21,4]]},"271":{"position":[[29,4]]},"278":{"position":[[37,4]]},"294":{"position":[[22,4]]},"501":{"position":[[29,4]]},"708":{"position":[[7,4]]},"1317":{"position":[[7,4]]}},"content":{"14":{"position":[[153,4]]},"16":{"position":[[77,5]]},"19":{"position":[[102,4]]},"20":{"position":[[177,4]]},"21":{"position":[[23,4]]},"22":{"position":[[326,4]]},"23":{"position":[[30,5]]},"38":{"position":[[24,4],[319,5],[384,5]]},"41":{"position":[[329,4]]},"45":{"position":[[52,4]]},"46":{"position":[[685,5]]},"66":{"position":[[258,4]]},"69":{"position":[[8,4]]},"98":{"position":[[54,4]]},"100":{"position":[[8,4]]},"101":{"position":[[51,4]]},"120":{"position":[[18,4]]},"139":{"position":[[153,4]]},"153":{"position":[[49,4]]},"157":{"position":[[183,4]]},"172":{"position":[[41,4]]},"181":{"position":[[18,4]]},"188":{"position":[[1057,4]]},"225":{"position":[[37,4]]},"227":{"position":[[35,4]]},"228":{"position":[[8,4]]},"244":{"position":[[655,4]]},"249":{"position":[[375,4]]},"271":{"position":[[117,4],[226,4]]},"278":{"position":[[71,4]]},"280":{"position":[[40,4]]},"293":{"position":[[47,4]]},"320":{"position":[[225,4]]},"321":{"position":[[516,4]]},"325":{"position":[[18,4]]},"359":{"position":[[78,4]]},"365":{"position":[[951,4]]},"370":{"position":[[206,5],[299,4]]},"384":{"position":[[167,4]]},"399":{"position":[[11,4]]},"400":{"position":[[781,4]]},"402":{"position":[[1470,5]]},"408":{"position":[[4378,4],[5307,4]]},"410":{"position":[[687,4],[2111,4]]},"412":{"position":[[189,5],[4356,5],[4397,4],[8926,4],[9020,5],[10523,4],[10836,6],[14135,4],[14269,5],[14427,4],[14999,4]]},"424":{"position":[[473,4]]},"434":{"position":[[42,4]]},"435":{"position":[[59,4]]},"455":{"position":[[95,4],[212,5],[236,4]]},"457":{"position":[[186,4]]},"464":{"position":[[984,6]]},"478":{"position":[[68,4]]},"495":{"position":[[827,4]]},"496":{"position":[[853,5]]},"501":{"position":[[104,4]]},"502":{"position":[[87,4],[382,5]]},"534":{"position":[[643,5]]},"571":{"position":[[35,4]]},"575":{"position":[[159,4]]},"594":{"position":[[641,5]]},"610":{"position":[[1446,4]]},"612":{"position":[[708,4],[793,4],[1116,4],[1435,5]]},"626":{"position":[[589,4]]},"628":{"position":[[143,4]]},"632":{"position":[[319,4],[2724,4],[2740,4]]},"663":{"position":[[133,4]]},"698":{"position":[[1758,4]]},"699":{"position":[[81,4],[126,5],[776,4]]},"712":{"position":[[152,4]]},"784":{"position":[[588,4],[630,5]]},"829":{"position":[[2895,4]]},"837":{"position":[[307,4]]},"842":{"position":[[267,4]]},"860":{"position":[[256,4],[1049,5]]},"862":{"position":[[70,4]]},"871":{"position":[[192,4],[238,5]]},"872":{"position":[[1677,4],[3633,4]]},"875":{"position":[[673,5],[3595,4]]},"885":{"position":[[15,5]]},"981":{"position":[[30,5],[1103,4],[1255,5]]},"983":{"position":[[455,4]]},"988":{"position":[[3337,4],[4666,4]]},"991":{"position":[[22,4]]},"1007":{"position":[[485,5]]},"1072":{"position":[[147,4],[692,5],[1241,4]]},"1080":{"position":[[1060,5]]},"1088":{"position":[[324,4]]},"1100":{"position":[[842,4],[885,4]]},"1101":{"position":[[191,4]]},"1107":{"position":[[1078,4]]},"1112":{"position":[[249,4]]},"1124":{"position":[[1367,5],[1419,5]]},"1148":{"position":[[418,5]]},"1191":{"position":[[97,4]]},"1196":{"position":[[17,4],[137,4]]},"1198":{"position":[[105,4],[1450,5]]},"1206":{"position":[[528,4]]},"1218":{"position":[[200,5],[878,4]]},"1247":{"position":[[278,5],[633,5]]},"1249":{"position":[[306,4]]},"1250":{"position":[[293,4],[376,4]]},"1295":{"position":[[50,4],[291,4]]},"1305":{"position":[[132,4]]},"1308":{"position":[[302,5]]},"1313":{"position":[[15,5],[252,4]]},"1316":{"position":[[1943,4]]},"1317":{"position":[[26,4]]},"1319":{"position":[[626,4]]},"1321":{"position":[[58,4]]},"1324":{"position":[[63,4]]}},"keywords":{}}],["side.en",{"_index":5196,"title":{},"content":{"898":{"position":[[719,11]]}},"keywords":{}}],["side/offlin",{"_index":2762,"title":{},"content":{"412":{"position":[[13451,12]]}},"keywords":{}}],["sidestep",{"_index":2519,"title":{},"content":{"407":{"position":[[548,8]]}},"keywords":{}}],["side—or",{"_index":2054,"title":{},"content":{"357":{"position":[[561,7]]}},"keywords":{}}],["sign",{"_index":849,"title":{},"content":{"55":{"position":[[1024,4]]},"542":{"position":[[733,4]]},"749":{"position":[[6544,4]]},"826":{"position":[[60,4],[248,5]]},"1117":{"position":[[280,4]]},"1118":{"position":[[24,4]]}},"keywords":{}}],["signal",{"_index":826,"title":{"55":{"position":[[13,8]]},"144":{"position":[[30,7]]},"542":{"position":[[12,8]]},"563":{"position":[[21,7]]},"602":{"position":[[10,8]]},"822":{"position":[[0,7]]},"831":{"position":[[0,8]]},"906":{"position":[[0,9]]},"1118":{"position":[[13,7]]}},"content":{"55":{"position":[[9,7],[142,7],[243,7],[1043,6]]},"144":{"position":[[80,7]]},"261":{"position":[[559,9]]},"494":{"position":[[29,7],[128,7],[230,6],[599,6]]},"540":{"position":[[215,8]]},"542":{"position":[[27,7],[107,7],[267,7],[369,9],[674,7]]},"563":{"position":[[129,8],[411,9],[620,6],[745,7],[853,7],[869,7],[1091,8]]},"566":{"position":[[591,7]]},"567":{"position":[[563,8],[749,7],[819,7]]},"602":{"position":[[52,8],[174,7]]},"614":{"position":[[873,9]]},"804":{"position":[[19,7]]},"825":{"position":[[45,7],[510,6],[985,6],[1070,7]]},"826":{"position":[[380,6],[437,6],[499,6],[538,6],[592,6],[625,6],[688,6],[740,6],[800,6],[838,6],[898,6],[959,6],[1019,6],[1057,6],[1103,6]]},"831":{"position":[[109,8],[295,6]]},"902":{"position":[[681,9]]},"903":{"position":[[300,9]]},"904":{"position":[[2603,9]]},"906":{"position":[[72,9],[106,9],[209,9],[440,9],[484,9],[647,9],[784,9],[1068,9]]},"907":{"position":[[63,9]]},"1117":{"position":[[132,7]]},"1118":{"position":[[82,7],[228,8],[315,7]]}},"keywords":{}}],["signaldb",{"_index":657,"title":{"42":{"position":[[0,9]]}},"content":{"42":{"position":[[1,8],[276,8]]}},"keywords":{}}],["signalingserverurl",{"_index":1368,"title":{},"content":{"210":{"position":[[393,19]]},"261":{"position":[[576,19]]},"904":{"position":[[2742,19]]},"911":{"position":[[720,19]]}},"keywords":{}}],["signatur",{"_index":6365,"title":{},"content":{"1281":{"position":[[205,10]]}},"keywords":{}}],["signific",{"_index":911,"title":{},"content":{"65":{"position":[[449,11]]},"69":{"position":[[42,11]]},"100":{"position":[[80,11]]},"228":{"position":[[49,11]]},"331":{"position":[[128,11]]},"394":{"position":[[1386,11]]},"412":{"position":[[39,11],[7165,11]]},"427":{"position":[[140,11]]},"430":{"position":[[490,11]]},"533":{"position":[[42,11]]},"593":{"position":[[42,11]]},"611":{"position":[[373,11]]},"618":{"position":[[178,11]]},"624":{"position":[[1627,11]]},"821":{"position":[[951,11]]},"1072":{"position":[[2779,11]]},"1296":{"position":[[52,12]]}},"keywords":{}}],["significantli",{"_index":918,"title":{},"content":{"65":{"position":[[843,13]]},"92":{"position":[[137,13]]},"166":{"position":[[259,13]]},"169":{"position":[[147,13]]},"173":{"position":[[1761,13]]},"178":{"position":[[350,13]]},"204":{"position":[[261,13]]},"234":{"position":[[217,13]]},"251":{"position":[[274,13]]},"265":{"position":[[222,13]]},"299":{"position":[[30,13],[1466,14]]},"311":{"position":[[30,13]]},"316":{"position":[[460,13]]},"369":{"position":[[931,13]]},"400":{"position":[[174,13]]},"401":{"position":[[719,13]]},"408":{"position":[[2550,13]]},"411":{"position":[[2440,13]]},"432":{"position":[[367,13]]},"446":{"position":[[1380,13]]},"464":{"position":[[1120,14]]},"621":{"position":[[680,13]]},"623":{"position":[[69,13]]},"641":{"position":[[168,13]]},"800":{"position":[[545,14]]},"801":{"position":[[46,13]]},"1072":{"position":[[374,13]]},"1124":{"position":[[1458,14]]}},"keywords":{}}],["significantly.compress",{"_index":3095,"title":{},"content":{"469":{"position":[[1034,25]]}},"keywords":{}}],["silent",{"_index":1780,"title":{},"content":{"300":{"position":[[717,8]]}},"keywords":{}}],["similar",{"_index":189,"title":{},"content":{"13":{"position":[[102,7]]},"16":{"position":[[160,7]]},"18":{"position":[[104,7]]},"23":{"position":[[465,7]]},"299":{"position":[[747,7],[1033,7]]},"347":{"position":[[620,8]]},"362":{"position":[[1691,8]]},"390":{"position":[[410,11],[715,7],[822,7],[1206,10],[1334,7],[1681,10]]},"393":{"position":[[159,10],[260,11],[284,10]]},"394":{"position":[[214,7],[454,11],[1074,10],[1269,7]]},"396":{"position":[[154,7],[1245,7],[1265,7],[1368,7]]},"398":{"position":[[338,10],[481,10]]},"400":{"position":[[83,10],[144,10]]},"411":{"position":[[3787,7]]},"412":{"position":[[7736,8]]},"455":{"position":[[218,7]]},"462":{"position":[[395,7]]},"465":{"position":[[445,7]]},"470":{"position":[[312,7]]},"570":{"position":[[879,7]]},"621":{"position":[[745,7]]},"659":{"position":[[119,7]]},"693":{"position":[[377,7]]},"704":{"position":[[145,7]]},"705":{"position":[[222,7]]},"711":{"position":[[210,7]]},"801":{"position":[[117,7]]},"802":{"position":[[46,7]]},"835":{"position":[[61,7]]},"861":{"position":[[1833,7]]},"936":{"position":[[99,7]]},"948":{"position":[[332,7]]},"975":{"position":[[75,7]]},"1071":{"position":[[67,7]]},"1112":{"position":[[358,7]]},"1124":{"position":[[569,7]]},"1143":{"position":[[541,8]]},"1212":{"position":[[159,7]]},"1305":{"position":[[446,7]]},"1318":{"position":[[300,7]]},"1321":{"position":[[801,7]]}},"keywords":{}}],["similarli",{"_index":1798,"title":{},"content":{"302":{"position":[[126,9]]},"410":{"position":[[2050,10]]},"411":{"position":[[4679,10]]},"1007":{"position":[[673,9]]}},"keywords":{}}],["simpl",{"_index":440,"title":{"1239":{"position":[[26,6]]}},"content":{"27":{"position":[[180,6]]},"34":{"position":[[91,7]]},"35":{"position":[[81,7]]},"51":{"position":[[54,6]]},"57":{"position":[[8,6]]},"63":{"position":[[114,6]]},"120":{"position":[[222,6]]},"181":{"position":[[122,6]]},"203":{"position":[[58,6]]},"223":{"position":[[168,6]]},"255":{"position":[[58,6]]},"314":{"position":[[7,6]]},"320":{"position":[[19,6]]},"358":{"position":[[163,7]]},"395":{"position":[[423,7]]},"412":{"position":[[3412,6],[12400,6]]},"414":{"position":[[309,6]]},"424":{"position":[[169,6],[249,6]]},"426":{"position":[[42,6]]},"427":{"position":[[484,6]]},"429":{"position":[[547,6]]},"451":{"position":[[114,6]]},"462":{"position":[[205,6]]},"491":{"position":[[576,6],[1631,6]]},"538":{"position":[[184,6]]},"560":{"position":[[23,7],[585,6]]},"567":{"position":[[1153,6]]},"598":{"position":[[185,6]]},"610":{"position":[[1461,7]]},"612":{"position":[[1701,6]]},"659":{"position":[[58,7],[984,6]]},"688":{"position":[[873,6]]},"689":{"position":[[464,6]]},"709":{"position":[[302,6]]},"723":{"position":[[2243,6]]},"772":{"position":[[530,7]]},"784":{"position":[[694,6],[842,6]]},"835":{"position":[[1048,6]]},"838":{"position":[[2239,6]]},"839":{"position":[[334,7]]},"875":{"position":[[144,6]]},"898":{"position":[[1763,6]]},"904":{"position":[[1732,6],[2369,6],[2404,7],[2522,7]]},"906":{"position":[[252,6]]},"910":{"position":[[92,6]]},"981":{"position":[[176,6],[299,6]]},"1074":{"position":[[789,6]]},"1080":{"position":[[868,6]]},"1085":{"position":[[2497,6]]},"1115":{"position":[[67,6]]},"1124":{"position":[[1923,6]]},"1235":{"position":[[50,6]]},"1239":{"position":[[83,6]]},"1272":{"position":[[356,7]]},"1284":{"position":[[373,6]]},"1317":{"position":[[674,6]]}},"keywords":{}}],["simplep",{"_index":4334,"title":{"910":{"position":[[0,10]]}},"content":{"749":{"position":[[15295,10]]}},"keywords":{}}],["simpler",{"_index":1197,"title":{"478":{"position":[[3,7]]}},"content":{"173":{"position":[[420,7]]},"207":{"position":[[350,7]]},"282":{"position":[[307,7]]},"362":{"position":[[758,8]]},"432":{"position":[[62,7]]},"534":{"position":[[494,7]]},"594":{"position":[[492,7]]},"688":{"position":[[284,7]]},"838":{"position":[[526,7]]},"860":{"position":[[810,7]]}},"keywords":{}}],["simplest",{"_index":3188,"title":{},"content":{"496":{"position":[[30,8]]},"1157":{"position":[[517,8]]}},"keywords":{}}],["simpli",{"_index":727,"title":{},"content":{"47":{"position":[[393,6]]},"302":{"position":[[223,6]]},"310":{"position":[[185,6]]},"408":{"position":[[1448,6]]},"409":{"position":[[238,6]]},"412":{"position":[[1617,6],[2580,6],[6779,6]]},"421":{"position":[[668,6]]},"535":{"position":[[350,6]]},"585":{"position":[[8,6]]},"759":{"position":[[1354,6]]},"1189":{"position":[[115,6]]}},"keywords":{}}],["simplic",{"_index":626,"title":{},"content":{"39":{"position":[[486,10]]},"179":{"position":[[282,10]]},"429":{"position":[[242,10]]},"441":{"position":[[114,10]]},"860":{"position":[[1055,10]]},"875":{"position":[[4859,10],[5627,10]]},"1156":{"position":[[1,11]]}},"keywords":{}}],["simplifi",{"_index":973,"title":{"223":{"position":[[0,10]]},"348":{"position":[[41,8]]}},"content":{"77":{"position":[[170,10]]},"79":{"position":[[61,11]]},"89":{"position":[[19,8]]},"96":{"position":[[154,10]]},"104":{"position":[[190,11]]},"132":{"position":[[92,10]]},"158":{"position":[[6,10]]},"165":{"position":[[51,8]]},"170":{"position":[[257,10]]},"173":{"position":[[1039,10],[3167,10]]},"174":{"position":[[367,10],[2810,10]]},"184":{"position":[[233,10]]},"192":{"position":[[40,8]]},"198":{"position":[[192,10]]},"219":{"position":[[273,10]]},"279":{"position":[[110,10]]},"293":{"position":[[114,10]]},"354":{"position":[[409,8]]},"364":{"position":[[794,11]]},"411":{"position":[[1152,10],[1842,10]]},"433":{"position":[[366,8]]},"445":{"position":[[1313,10]]},"515":{"position":[[360,10]]},"518":{"position":[[273,8]]},"523":{"position":[[59,8]]},"560":{"position":[[627,10]]},"576":{"position":[[118,10]]},"585":{"position":[[157,8]]},"591":{"position":[[524,11]]},"860":{"position":[[55,10]]},"1085":{"position":[[3470,10]]},"1094":{"position":[[546,10]]}},"keywords":{}}],["simul",{"_index":1786,"title":{},"content":{"301":{"position":[[470,8],[538,8]]},"346":{"position":[[621,8]]},"453":{"position":[[230,9]]},"590":{"position":[[753,10]]},"614":{"position":[[672,9]]},"749":{"position":[[5760,8]]}},"keywords":{}}],["simultan",{"_index":1115,"title":{},"content":{"134":{"position":[[89,15]]},"267":{"position":[[650,14]]},"328":{"position":[[299,15]]},"411":{"position":[[411,12]]},"446":{"position":[[684,15]]},"566":{"position":[[873,14]]},"582":{"position":[[535,15]]},"617":{"position":[[536,12],[784,14]]},"1307":{"position":[[203,12]]}},"keywords":{}}],["sincer",{"_index":6089,"title":{},"content":{"1151":{"position":[[323,9]]},"1178":{"position":[[322,9]]}},"keywords":{}}],["singl",{"_index":736,"title":{"304":{"position":[[24,6]]},"1048":{"position":[[23,6]]},"1092":{"position":[[0,6]]}},"content":{"47":{"position":[[835,6]]},"116":{"position":[[111,6]]},"177":{"position":[[180,6]]},"188":{"position":[[1676,6]]},"202":{"position":[[390,6]]},"207":{"position":[[379,6]]},"287":{"position":[[29,6]]},"303":{"position":[[64,6],[1299,6]]},"304":{"position":[[357,6]]},"346":{"position":[[380,6]]},"354":{"position":[[351,6]]},"358":{"position":[[50,6],[630,6]]},"362":{"position":[[576,6]]},"367":{"position":[[141,6]]},"376":{"position":[[379,6]]},"381":{"position":[[559,6]]},"386":{"position":[[81,6]]},"393":{"position":[[793,6]]},"395":{"position":[[431,6]]},"401":{"position":[[50,6]]},"404":{"position":[[758,6]]},"411":{"position":[[1300,6],[2037,6],[2138,6]]},"412":{"position":[[1499,6],[1724,6],[4273,6],[5603,6],[5697,6],[12806,6]]},"416":{"position":[[336,6]]},"421":{"position":[[302,6]]},"455":{"position":[[396,6]]},"457":{"position":[[377,6]]},"458":{"position":[[1566,6]]},"463":{"position":[[849,6],[1178,6]]},"464":{"position":[[1075,6]]},"465":{"position":[[80,6]]},"466":{"position":[[443,6]]},"469":{"position":[[383,6]]},"478":{"position":[[232,6]]},"487":{"position":[[78,6]]},"559":{"position":[[1221,6]]},"611":{"position":[[63,7]]},"612":{"position":[[409,6],[560,6]]},"617":{"position":[[601,6],[1239,6],[1320,6],[2098,6]]},"621":{"position":[[83,7]]},"622":{"position":[[662,6]]},"662":{"position":[[188,6]]},"682":{"position":[[64,6],[204,6]]},"696":{"position":[[662,6]]},"698":{"position":[[1691,6],[2415,6]]},"699":{"position":[[834,6]]},"700":{"position":[[38,6]]},"701":{"position":[[643,6],[975,6]]},"710":{"position":[[223,6]]},"724":{"position":[[856,6]]},"754":{"position":[[621,6]]},"781":{"position":[[793,6]]},"783":{"position":[[260,6]]},"785":{"position":[[494,6]]},"795":{"position":[[99,6]]},"826":{"position":[[46,6]]},"838":{"position":[[217,6]]},"849":{"position":[[429,6]]},"875":{"position":[[288,6]]},"886":{"position":[[2926,6]]},"898":{"position":[[2739,6]]},"904":{"position":[[1861,6],[3234,6]]},"941":{"position":[[195,6]]},"944":{"position":[[543,6]]},"950":{"position":[[61,6],[117,6]]},"964":{"position":[[81,6],[404,6],[428,6],[491,6]]},"988":{"position":[[36,6]]},"1007":{"position":[[20,6]]},"1038":{"position":[[17,6]]},"1056":{"position":[[28,6]]},"1074":{"position":[[245,6]]},"1084":{"position":[[145,6]]},"1087":{"position":[[85,6]]},"1091":{"position":[[34,6]]},"1100":{"position":[[160,6]]},"1114":{"position":[[408,6]]},"1116":{"position":[[68,6],[161,6],[367,6]]},"1119":{"position":[[245,6]]},"1124":{"position":[[768,6]]},"1132":{"position":[[292,6]]},"1140":{"position":[[275,6]]},"1161":{"position":[[150,6]]},"1164":{"position":[[239,6]]},"1170":{"position":[[149,6]]},"1180":{"position":[[150,6]]},"1183":{"position":[[430,6]]},"1186":{"position":[[83,6],[215,6]]},"1194":{"position":[[298,6],[381,6],[489,6],[763,6],[988,6]]},"1238":{"position":[[268,6]]},"1295":{"position":[[991,6],[1184,6]]},"1296":{"position":[[678,6],[1514,6]]},"1299":{"position":[[348,6]]},"1304":{"position":[[464,6],[1552,6]]},"1307":{"position":[[266,6]]},"1315":{"position":[[1185,6]]},"1316":{"position":[[2617,6]]},"1317":{"position":[[723,6]]},"1319":{"position":[[441,6]]},"1321":{"position":[[336,6]]},"1323":{"position":[[59,6],[137,6]]},"1324":{"position":[[1002,6]]}},"keywords":{}}],["site",{"_index":1869,"title":{},"content":{"305":{"position":[[213,5]]},"402":{"position":[[2134,5]]},"408":{"position":[[1103,4]]},"412":{"position":[[7940,4],[8128,4]]},"421":{"position":[[228,5],[366,5],[560,5]]},"736":{"position":[[285,5]]},"781":{"position":[[183,5]]},"1140":{"position":[[44,5],[163,5]]}},"keywords":{}}],["situat",{"_index":1787,"title":{},"content":{"301":{"position":[[495,11]]},"430":{"position":[[106,10]]},"497":{"position":[[83,10]]},"612":{"position":[[271,9]]},"1003":{"position":[[86,10]]},"1300":{"position":[[614,11]]}},"keywords":{}}],["six",{"_index":3630,"title":{},"content":{"617":{"position":[[28,3],[153,3],[283,3]]}},"keywords":{}}],["size",{"_index":958,"title":{"69":{"position":[[6,4]]},"100":{"position":[[6,4]]},"228":{"position":[[6,4]]},"297":{"position":[[22,4]]},"303":{"position":[[29,4]]},"304":{"position":[[14,4]]},"461":{"position":[[8,4]]},"782":{"position":[[17,5]]},"1186":{"position":[[6,4]]}},"content":{"69":{"position":[[60,5]]},"100":{"position":[[98,5],[323,6]]},"141":{"position":[[191,5]]},"169":{"position":[[28,4]]},"197":{"position":[[119,4]]},"227":{"position":[[72,5]]},"228":{"position":[[67,5],[134,4],[346,6],[406,4]]},"243":{"position":[[663,4]]},"299":{"position":[[11,4]]},"306":{"position":[[343,4]]},"311":{"position":[[133,4]]},"316":{"position":[[492,5]]},"345":{"position":[[107,4]]},"387":{"position":[[455,6]]},"392":{"position":[[3052,4],[4971,4]]},"401":{"position":[[175,4],[186,4],[714,4]]},"408":{"position":[[1121,6]]},"412":{"position":[[6670,4],[6984,5],[7259,4],[8957,5],[9170,4]]},"430":{"position":[[573,4]]},"454":{"position":[[673,4]]},"461":{"position":[[633,4],[770,4],[951,4],[1006,4],[1256,4],[1438,4],[1513,4]]},"495":{"position":[[788,4]]},"581":{"position":[[548,4]]},"696":{"position":[[756,4],[1997,5]]},"717":{"position":[[364,4]]},"752":{"position":[[801,5]]},"759":{"position":[[756,4]]},"760":{"position":[[752,4]]},"773":{"position":[[809,4]]},"774":{"position":[[958,4]]},"962":{"position":[[300,4]]},"988":{"position":[[2904,5]]},"1125":{"position":[[682,5]]},"1137":{"position":[[154,4]]},"1143":{"position":[[174,4]]},"1167":{"position":[[63,4]]},"1198":{"position":[[629,4]]},"1207":{"position":[[616,4]]},"1208":{"position":[[1698,4]]},"1222":{"position":[[643,4]]},"1235":{"position":[[79,5]]},"1237":{"position":[[246,5]]},"1242":{"position":[[138,5]]},"1282":{"position":[[265,4]]},"1286":{"position":[[184,5]]},"1292":{"position":[[822,5],[880,4],[907,4],[930,4]]},"1294":{"position":[[1934,4],[2047,4]]},"1321":{"position":[[1118,5]]}},"keywords":{}}],["size"",{"_index":1469,"title":{},"content":{"243":{"position":[[768,10]]}},"keywords":{}}],["size.in",{"_index":6279,"title":{},"content":{"1235":{"position":[[248,7]]}},"keywords":{}}],["size=8192",{"_index":4581,"title":{},"content":{"773":{"position":[[885,9]]}},"keywords":{}}],["sizeslow",{"_index":6180,"title":{},"content":{"1200":{"position":[[12,8]]}},"keywords":{}}],["sizewrit",{"_index":4584,"title":{},"content":{"774":{"position":[[988,10]]}},"keywords":{}}],["skeletor",{"_index":4608,"title":{},"content":{"791":{"position":[[441,10],[535,11]]}},"keywords":{}}],["skill",{"_index":1416,"title":{},"content":{"230":{"position":[[239,7]]},"1074":{"position":[[487,6],[607,6]]}},"keywords":{}}],["skip",{"_index":3114,"title":{},"content":{"478":{"position":[[268,4]]},"749":{"position":[[2878,4]]},"759":{"position":[[1364,7]]},"886":{"position":[[3085,4]]},"902":{"position":[[22,8]]},"988":{"position":[[964,7],[3218,7]]},"1067":{"position":[[357,6]]},"1126":{"position":[[588,4]]},"1318":{"position":[[263,4],[784,4]]}},"keywords":{}}],["slash",{"_index":4137,"title":{},"content":{"749":{"position":[[371,5],[6282,5],[16153,5]]}},"keywords":{}}],["slave",{"_index":383,"title":{},"content":{"23":{"position":[[153,5]]},"903":{"position":[[351,5]]}},"keywords":{}}],["slight",{"_index":2390,"title":{},"content":{"398":{"position":[[207,6]]},"875":{"position":[[9411,6]]},"1298":{"position":[[49,6]]}},"keywords":{}}],["slightli",{"_index":3019,"title":{},"content":{"461":{"position":[[883,8]]},"1211":{"position":[[179,8]]},"1295":{"position":[[742,9]]},"1297":{"position":[[458,9]]}},"keywords":{}}],["slogan",{"_index":3948,"title":{},"content":{"699":{"position":[[323,6]]}},"keywords":{}}],["slow",{"_index":391,"title":{"429":{"position":[[16,6]]},"1293":{"position":[[17,4]]}},"content":{"23":{"position":[[374,4]]},"43":{"position":[[382,4]]},"58":{"position":[[93,5],[214,4]]},"309":{"position":[[116,4]]},"311":{"position":[[44,4]]},"354":{"position":[[894,4]]},"358":{"position":[[430,4]]},"396":{"position":[[1640,5]]},"402":{"position":[[1831,5]]},"411":{"position":[[3298,4]]},"412":{"position":[[10506,4],[14248,4]]},"415":{"position":[[411,4]]},"421":{"position":[[386,4],[923,4]]},"427":{"position":[[824,7]]},"430":{"position":[[394,4]]},"432":{"position":[[752,4]]},"442":{"position":[[84,4]]},"464":{"position":[[694,4]]},"469":{"position":[[271,4]]},"470":{"position":[[424,4]]},"486":{"position":[[111,4]]},"491":{"position":[[1006,4]]},"545":{"position":[[95,4],[137,4]]},"605":{"position":[[95,4],[137,4]]},"653":{"position":[[701,6]]},"656":{"position":[[361,4]]},"696":{"position":[[904,4]]},"704":{"position":[[355,4]]},"709":{"position":[[673,5]]},"749":{"position":[[2621,4]]},"793":{"position":[[1321,4]]},"801":{"position":[[229,4]]},"802":{"position":[[234,4]]},"1013":{"position":[[784,4]]},"1093":{"position":[[245,4]]},"1164":{"position":[[1435,4]]},"1191":{"position":[[321,4]]},"1198":{"position":[[532,5]]},"1238":{"position":[[333,4]]},"1276":{"position":[[329,4]]},"1316":{"position":[[3614,4]]}},"keywords":{}}],["slow.indexeddb",{"_index":3099,"title":{},"content":{"470":{"position":[[517,14]]}},"keywords":{}}],["slower",{"_index":940,"title":{},"content":{"66":{"position":[[132,6],[294,6]]},"69":{"position":[[205,6]]},"404":{"position":[[380,6]]},"408":{"position":[[3999,6]]},"412":{"position":[[9754,6]]},"427":{"position":[[330,6]]},"434":{"position":[[190,6]]},"435":{"position":[[281,6]]},"454":{"position":[[458,6]]},"464":{"position":[[578,6],[897,6]]},"467":{"position":[[361,6]]},"703":{"position":[[1134,7],[1156,7]]},"709":{"position":[[870,7]]},"1072":{"position":[[2883,7]]},"1143":{"position":[[402,6]]},"1211":{"position":[[188,6]]},"1222":{"position":[[1266,7]]},"1267":{"position":[[396,6]]},"1270":{"position":[[29,6]]},"1276":{"position":[[205,6]]},"1295":{"position":[[1260,6]]}},"keywords":{}}],["small",{"_index":527,"title":{"464":{"position":[[11,5]]},"465":{"position":[[11,5]]},"696":{"position":[[19,5]]}},"content":{"34":{"position":[[12,6],[282,5]]},"63":{"position":[[48,5]]},"287":{"position":[[426,5]]},"317":{"position":[[69,5]]},"386":{"position":[[75,5]]},"396":{"position":[[336,5],[557,5]]},"401":{"position":[[243,5]]},"411":{"position":[[151,5],[667,5],[1333,5]]},"412":{"position":[[12759,5]]},"424":{"position":[[97,5]]},"429":{"position":[[190,5]]},"432":{"position":[[1432,5]]},"441":{"position":[[167,5]]},"450":{"position":[[66,5]]},"451":{"position":[[321,5]]},"464":{"position":[[31,5],[80,5]]},"555":{"position":[[905,5]]},"559":{"position":[[166,5],[1020,5]]},"560":{"position":[[307,5]]},"566":{"position":[[1412,5]]},"567":{"position":[[985,5]]},"630":{"position":[[798,5]]},"659":{"position":[[720,5]]},"709":{"position":[[195,5]]},"772":{"position":[[2059,5]]},"828":{"position":[[237,5]]},"835":{"position":[[825,5]]},"841":{"position":[[886,5],[1338,5]]},"1156":{"position":[[126,5],[162,5]]},"1157":{"position":[[296,5]]},"1170":{"position":[[191,5]]},"1186":{"position":[[59,5]]},"1192":{"position":[[765,5]]},"1193":{"position":[[107,5]]},"1235":{"position":[[67,5]]},"1242":{"position":[[125,5]]},"1297":{"position":[[529,5]]}},"keywords":{}}],["smaller",{"_index":1029,"title":{},"content":{"100":{"position":[[309,7]]},"228":{"position":[[332,7]]},"357":{"position":[[521,7]]},"402":{"position":[[364,7],[1855,7]]},"643":{"position":[[204,7]]},"717":{"position":[[350,7]]},"796":{"position":[[195,7]]},"1157":{"position":[[450,7]]},"1235":{"position":[[234,7]]}},"keywords":{}}],["smallest",{"_index":2322,"title":{},"content":{"394":{"position":[[1046,9]]},"490":{"position":[[610,8]]},"1137":{"position":[[139,8]]}},"keywords":{}}],["smarter",{"_index":690,"title":{"44":{"position":[[6,7]]}},"content":{},"keywords":{}}],["smartphon",{"_index":2430,"title":{},"content":{"399":{"position":[[312,11]]},"500":{"position":[[788,12]]},"700":{"position":[[869,10]]},"1270":{"position":[[389,11]]}},"keywords":{}}],["smooth",{"_index":1031,"title":{},"content":{"101":{"position":[[260,6]]},"152":{"position":[[326,6]]},"277":{"position":[[209,6]]},"280":{"position":[[418,6]]},"379":{"position":[[306,6]]},"412":{"position":[[11692,6]]},"446":{"position":[[1061,6]]},"504":{"position":[[941,6]]},"642":{"position":[[208,6]]}},"keywords":{}}],["smooth.perform",{"_index":1979,"title":{},"content":{"346":{"position":[[731,18]]}},"keywords":{}}],["smoother",{"_index":909,"title":{},"content":{"65":{"position":[[383,8]]},"87":{"position":[[227,8]]},"411":{"position":[[1811,8]]},"445":{"position":[[1935,8]]},"474":{"position":[[281,8]]},"801":{"position":[[547,8]]}},"keywords":{}}],["smoothli",{"_index":1430,"title":{},"content":{"240":{"position":[[251,8]]},"350":{"position":[[271,8]]},"376":{"position":[[647,9]]},"489":{"position":[[670,8]]},"493":{"position":[[30,8]]}},"keywords":{}}],["snappi",{"_index":1330,"title":{},"content":{"205":{"position":[[411,6]]},"342":{"position":[[160,7]]},"410":{"position":[[299,6]]},"489":{"position":[[523,6]]},"495":{"position":[[27,7]]},"498":{"position":[[569,7]]}},"keywords":{}}],["snappier",{"_index":3241,"title":{},"content":{"507":{"position":[[156,8]]}},"keywords":{}}],["snapshot",{"_index":4808,"title":{},"content":{"841":{"position":[[668,10]]}},"keywords":{}}],["snh",{"_index":4440,"title":{},"content":{"749":{"position":[[24372,3]]}},"keywords":{}}],["snippet",{"_index":1769,"title":{},"content":{"300":{"position":[[111,7]]},"425":{"position":[[236,8]]},"493":{"position":[[315,8]]},"522":{"position":[[242,7]]}},"keywords":{}}],["social",{"_index":3197,"title":{},"content":{"497":{"position":[[52,6]]}},"keywords":{}}],["socket",{"_index":3567,"title":{},"content":{"611":{"position":[[633,6],[1013,6]]},"892":{"position":[[325,9]]},"988":{"position":[[5206,6],[5637,6]]}},"keywords":{}}],["socket.clos",{"_index":5483,"title":{},"content":{"988":{"position":[[5736,15]]}},"keywords":{}}],["socket.io",{"_index":3580,"title":{},"content":{"611":{"position":[[1330,9]]},"906":{"position":[[547,11]]}},"keywords":{}}],["socket.onclos",{"_index":5481,"title":{},"content":{"988":{"position":[[5667,14]]}},"keywords":{}}],["socket.onerror",{"_index":5482,"title":{},"content":{"988":{"position":[[5710,14]]}},"keywords":{}}],["socket.onmessag",{"_index":3573,"title":{},"content":{"611":{"position":[[818,16]]},"988":{"position":[[5542,16]]}},"keywords":{}}],["socket.onopen",{"_index":3569,"title":{},"content":{"611":{"position":[[677,13]]},"988":{"position":[[5752,13]]}},"keywords":{}}],["socket.send('hello",{"_index":3572,"title":{},"content":{"611":{"position":[[785,18]]}},"keywords":{}}],["soft",{"_index":3455,"title":{},"content":{"569":{"position":[[459,4]]},"861":{"position":[[1653,4]]}},"keywords":{}}],["softwar",{"_index":1228,"title":{"406":{"position":[[16,8]]}},"content":{"177":{"position":[[30,8]]},"267":{"position":[[1631,8]]},"407":{"position":[[16,9],[887,9],[921,8]]},"419":{"position":[[1690,9]]},"422":{"position":[[362,8]]},"444":{"position":[[34,8]]},"473":{"position":[[30,8]]},"644":{"position":[[662,8]]},"1320":{"position":[[113,8]]}},"keywords":{}}],["software"",{"_index":2812,"title":{},"content":{"419":{"position":[[1538,14]]}},"keywords":{}}],["software,"",{"_index":2803,"title":{},"content":{"419":{"position":[[682,15]]}},"keywords":{}}],["sole",{"_index":1009,"title":{},"content":{"91":{"position":[[119,6]]},"321":{"position":[[313,6]]},"698":{"position":[[1594,6]]}},"keywords":{}}],["solid",{"_index":3232,"title":{},"content":{"503":{"position":[[193,5]]}},"keywords":{}}],["solut",{"_index":437,"title":{"118":{"position":[[31,9]]},"153":{"position":[[32,9]]},"179":{"position":[[31,9]]},"212":{"position":[[18,8]]},"295":{"position":[[15,9]]},"322":{"position":[[31,9]]},"441":{"position":[[39,9]]},"445":{"position":[[54,10]]},"479":{"position":[[47,9]]},"575":{"position":[[31,9]]},"658":{"position":[[9,9]]},"737":{"position":[[0,9]]},"834":{"position":[[9,9]]}},"content":{"27":{"position":[[21,8]]},"40":{"position":[[731,8]]},"43":{"position":[[67,10]]},"66":{"position":[[203,9],[620,9]]},"83":{"position":[[52,8]]},"102":{"position":[[76,9]]},"117":{"position":[[242,8]]},"118":{"position":[[224,9]]},"148":{"position":[[29,8]]},"153":{"position":[[64,8]]},"161":{"position":[[132,10]]},"170":{"position":[[40,8]]},"173":{"position":[[88,9]]},"174":{"position":[[3027,10]]},"178":{"position":[[100,8]]},"179":{"position":[[35,8]]},"198":{"position":[[46,8]]},"229":{"position":[[121,8]]},"241":{"position":[[729,10]]},"263":{"position":[[520,8]]},"271":{"position":[[29,8]]},"278":{"position":[[46,8]]},"287":{"position":[[44,9]]},"290":{"position":[[139,10]]},"295":{"position":[[145,10]]},"318":{"position":[[167,9]]},"320":{"position":[[339,8]]},"321":{"position":[[475,8]]},"331":{"position":[[106,9],[266,9]]},"350":{"position":[[133,9]]},"351":{"position":[[146,9]]},"354":{"position":[[186,9],[1172,9],[1652,9]]},"357":{"position":[[508,8]]},"368":{"position":[[31,9]]},"371":{"position":[[79,8]]},"372":{"position":[[66,8]]},"373":{"position":[[393,9],[757,10]]},"386":{"position":[[132,10]]},"388":{"position":[[165,9]]},"412":{"position":[[462,9],[887,8],[1210,9],[3657,9],[14597,9]]},"429":{"position":[[134,9]]},"430":{"position":[[635,9],[810,9]]},"432":{"position":[[49,8]]},"436":{"position":[[255,8]]},"437":{"position":[[64,9]]},"441":{"position":[[516,10]]},"445":{"position":[[248,8],[2061,8]]},"447":{"position":[[281,8],[582,8]]},"458":{"position":[[1031,10],[1432,8]]},"476":{"position":[[153,9]]},"513":{"position":[[76,8]]},"520":{"position":[[176,9],[287,8],[448,8]]},"524":{"position":[[994,8]]},"530":{"position":[[169,9]]},"546":{"position":[[77,9]]},"554":{"position":[[82,8]]},"556":{"position":[[91,9]]},"574":{"position":[[676,9]]},"576":{"position":[[385,8]]},"606":{"position":[[77,9]]},"644":{"position":[[407,10]]},"661":{"position":[[1667,8]]},"698":{"position":[[937,8]]},"711":{"position":[[2109,8]]},"737":{"position":[[5,8]]},"834":{"position":[[29,9]]},"835":{"position":[[41,8]]},"836":{"position":[[2006,8],[2235,8],[2487,9]]},"839":{"position":[[29,8],[1194,8]]},"849":{"position":[[406,10]]},"912":{"position":[[260,8]]},"1091":{"position":[[85,9]]},"1147":{"position":[[187,9]]},"1148":{"position":[[33,8]]},"1151":{"position":[[219,9]]},"1178":{"position":[[218,9]]},"1249":{"position":[[264,10]]},"1270":{"position":[[473,8]]},"1305":{"position":[[226,8]]}},"keywords":{}}],["solutions.vendor",{"_index":4800,"title":{},"content":{"839":{"position":[[819,16]]}},"keywords":{}}],["solutions—particularli",{"_index":2015,"title":{},"content":{"354":{"position":[[7,22]]}},"keywords":{}}],["solv",{"_index":1072,"title":{},"content":{"118":{"position":[[389,6]]},"323":{"position":[[647,6]]},"411":{"position":[[4454,6]]},"412":{"position":[[482,5],[3871,5],[15294,6]]},"535":{"position":[[779,6]]},"595":{"position":[[866,6]]},"698":{"position":[[1524,7],[1911,5],[3116,5]]},"737":{"position":[[430,5]]},"1183":{"position":[[257,5]]},"1198":{"position":[[70,6]]},"1301":{"position":[[552,5]]}},"keywords":{}}],["solvabl",{"_index":2776,"title":{},"content":{"412":{"position":[[15304,8]]}},"keywords":{}}],["somehow",{"_index":3057,"title":{},"content":{"464":{"position":[[1265,7]]}},"keywords":{}}],["somekey",{"_index":1809,"title":{},"content":{"302":{"position":[[809,9]]}},"keywords":{}}],["someon",{"_index":2760,"title":{},"content":{"412":{"position":[[13197,7]]},"1316":{"position":[[2783,7]]}},"keywords":{}}],["somet",{"_index":3809,"title":{},"content":{"661":{"position":[[1318,12]]},"836":{"position":[[984,12]]}},"keywords":{}}],["someth",{"_index":2560,"title":{},"content":{"408":{"position":[[3939,9],[4556,9]]},"411":{"position":[[4520,9]]},"412":{"position":[[8101,9],[10375,9],[12982,9],[14317,9]]},"458":{"position":[[448,9]]},"569":{"position":[[1130,9]]},"613":{"position":[[999,9]]},"661":{"position":[[1847,9]]},"704":{"position":[[135,9]]},"709":{"position":[[1300,9]]},"966":{"position":[[134,9]]},"996":{"position":[[228,9]]},"1051":{"position":[[96,9]]},"1135":{"position":[[285,9]]},"1249":{"position":[[92,9]]},"1322":{"position":[[152,9]]}},"keywords":{}}],["sometim",{"_index":1086,"title":{},"content":{"129":{"position":[[148,9]]},"402":{"position":[[565,9]]},"404":{"position":[[362,9]]},"412":{"position":[[3970,9]]},"569":{"position":[[595,9]]},"655":{"position":[[256,9]]},"698":{"position":[[1882,9],[2489,9]]},"775":{"position":[[518,9]]},"797":{"position":[[1,8]]},"806":{"position":[[193,9]]},"1022":{"position":[[1,9]]},"1048":{"position":[[1,9]]},"1066":{"position":[[189,9]]},"1085":{"position":[[2781,9]]},"1185":{"position":[[171,9]]},"1198":{"position":[[954,9]]}},"keywords":{}}],["somevalu",{"_index":3808,"title":{},"content":{"661":{"position":[[1303,9]]},"836":{"position":[[969,9]]}},"keywords":{}}],["somewher",{"_index":6229,"title":{},"content":{"1210":{"position":[[585,9]]}},"keywords":{}}],["soon",{"_index":1926,"title":{},"content":{"326":{"position":[[206,4]]},"379":{"position":[[271,4]]},"570":{"position":[[368,4]]},"634":{"position":[[182,4]]},"701":{"position":[[543,4],[753,4]]},"709":{"position":[[263,4]]},"778":{"position":[[513,4]]},"1009":{"position":[[437,4]]},"1297":{"position":[[276,4]]},"1304":{"position":[[617,4]]},"1316":{"position":[[3818,4]]}},"keywords":{}}],["sooner",{"_index":3960,"title":{},"content":{"702":{"position":[[28,6]]},"1085":{"position":[[2675,7]]},"1319":{"position":[[1,6]]}},"keywords":{}}],["sophist",{"_index":640,"title":{},"content":{"40":{"position":[[473,13]]},"203":{"position":[[137,13]]},"205":{"position":[[184,13]]},"289":{"position":[[56,13]]},"353":{"position":[[111,13]]},"354":{"position":[[742,13]]},"412":{"position":[[14583,13]]},"510":{"position":[[443,13]]},"530":{"position":[[239,13]]},"723":{"position":[[2117,13]]}},"keywords":{}}],["sort",{"_index":341,"title":{},"content":{"19":{"position":[[800,4],[871,5]]},"54":{"position":[[171,5]]},"130":{"position":[[526,5]]},"143":{"position":[[466,5],[647,5]]},"393":{"position":[[1086,4]]},"394":{"position":[[426,7],[1009,7],[1107,7]]},"395":{"position":[[180,4]]},"397":{"position":[[329,7]]},"398":{"position":[[635,7],[1118,5],[1280,5],[1618,6],[2473,5],[2771,6]]},"400":{"position":[[254,4],[282,5],[346,6]]},"402":{"position":[[781,4]]},"580":{"position":[[546,5]]},"723":{"position":[[2369,8]]},"749":{"position":[[4020,6],[4375,4],[4457,7],[4550,4],[4626,4]]},"829":{"position":[[2427,5],[3343,5]]},"885":{"position":[[1634,6]]},"986":{"position":[[220,4],[293,4],[930,6]]},"1056":{"position":[[232,5]]},"1065":{"position":[[1576,4],[1714,4],[1868,4],[1987,7]]},"1069":{"position":[[689,6],[850,6]]},"1079":{"position":[[569,4]]},"1249":{"position":[[532,5]]},"1320":{"position":[[897,6]]}},"keywords":{}}],["sort([['field",{"_index":4192,"title":{},"content":{"749":{"position":[[4419,16]]}},"keywords":{}}],["sort({updateat",{"_index":4996,"title":{},"content":{"875":{"position":[[2535,16]]}},"keywords":{}}],["sortabl",{"_index":2330,"title":{},"content":{"395":{"position":[[326,8]]},"396":{"position":[[1800,8]]},"397":{"position":[[156,8]]},"986":{"position":[[84,8],[1184,8]]},"1085":{"position":[[598,9]]}},"keywords":{}}],["sortbyobjectnumberproperti",{"_index":2305,"title":{},"content":{"394":{"position":[[533,26]]}},"keywords":{}}],["sorted.slice(0",{"_index":2413,"title":{},"content":{"398":{"position":[[1717,15],[2870,15]]}},"keywords":{}}],["sorteddocu",{"_index":5097,"title":{},"content":{"885":{"position":[[1687,15]]}},"keywords":{}}],["sorteddocuments.filter(doc",{"_index":5104,"title":{},"content":{"885":{"position":[[2031,26]]}},"keywords":{}}],["sound",{"_index":6558,"title":{},"content":{"1316":{"position":[[2428,6]]}},"keywords":{}}],["sourc",{"_index":366,"title":{"1024":{"position":[[32,6]]}},"content":{"22":{"position":[[43,6],[105,6]]},"29":{"position":[[379,7],[410,6]]},"38":{"position":[[798,6],[822,6]]},"50":{"position":[[424,7]]},"61":{"position":[[207,7]]},"84":{"position":[[198,6]]},"113":{"position":[[56,6]]},"114":{"position":[[211,6]]},"149":{"position":[[211,6]]},"155":{"position":[[17,6]]},"174":{"position":[[2972,6]]},"175":{"position":[[204,6]]},"177":{"position":[[20,6]]},"198":{"position":[[489,6]]},"255":{"position":[[1775,7]]},"347":{"position":[[211,6]]},"362":{"position":[[1282,6]]},"386":{"position":[[267,6]]},"403":{"position":[[276,6]]},"405":{"position":[[43,6]]},"411":{"position":[[2044,6],[2342,7],[3995,6]]},"412":{"position":[[5610,6]]},"420":{"position":[[968,7]]},"455":{"position":[[449,6]]},"478":{"position":[[239,6]]},"511":{"position":[[211,6]]},"514":{"position":[[47,6]]},"531":{"position":[[211,6]]},"567":{"position":[[469,6]]},"571":{"position":[[357,7]]},"591":{"position":[[211,6]]},"614":{"position":[[49,6]]},"661":{"position":[[508,7]]},"670":{"position":[[423,6]]},"674":{"position":[[253,6]]},"698":{"position":[[2581,9]]},"700":{"position":[[45,6],[73,6]]},"724":{"position":[[669,6]]},"749":{"position":[[9234,6]]},"835":{"position":[[783,7]]},"839":{"position":[[1076,6]]},"840":{"position":[[691,6]]},"860":{"position":[[28,6]]},"904":{"position":[[2494,6]]},"906":{"position":[[1129,6]]},"958":{"position":[[525,6]]},"1020":{"position":[[35,6],[306,6]]},"1028":{"position":[[149,6]]},"1272":{"position":[[374,6]]}},"keywords":{}}],["sourcecod",{"_index":3622,"title":{},"content":{"613":{"position":[[1104,11]]}},"keywords":{}}],["spa",{"_index":1059,"title":{},"content":{"116":{"position":[[136,6]]}},"keywords":{}}],["space",{"_index":944,"title":{},"content":{"66":{"position":[[393,5]]},"81":{"position":[[83,5]]},"111":{"position":[[21,6]]},"236":{"position":[[199,5]]},"298":{"position":[[248,6],[560,6]]},"299":{"position":[[779,5],[1011,6],[1133,5]]},"300":{"position":[[184,5],[366,8],[413,8],[642,6]]},"301":{"position":[[146,5]]},"302":{"position":[[644,5],[966,9]]},"305":{"position":[[250,5]]},"361":{"position":[[430,5]]},"366":{"position":[[330,5]]},"396":{"position":[[278,6]]},"402":{"position":[[2163,6],[2271,5]]},"408":{"position":[[1008,5]]},"412":{"position":[[7816,5]]},"420":{"position":[[1384,5]]},"461":{"position":[[1121,5],[1205,6],[1583,6]]},"528":{"position":[[53,5]]},"588":{"position":[[91,5]]},"660":{"position":[[243,6]]},"696":{"position":[[1077,5],[1346,5],[1712,5]]},"773":{"position":[[803,5],[879,5]]},"780":{"position":[[297,6]]},"796":{"position":[[209,5],[387,5],[683,5],[1103,5]]},"837":{"position":[[526,5]]},"932":{"position":[[268,5]]},"977":{"position":[[64,6]]},"1143":{"position":[[318,5]]}},"keywords":{}}],["span",{"_index":3986,"title":{},"content":{"709":{"position":[[241,4]]}},"keywords":{}}],["spanner",{"_index":2772,"title":{},"content":{"412":{"position":[[14687,9]]},"1324":{"position":[[661,8]]}},"keywords":{}}],["spare",{"_index":5551,"title":{},"content":{"1004":{"position":[[512,6]]}},"keywords":{}}],["sparsiti",{"_index":2425,"title":{},"content":{"398":{"position":[[3354,8]]}},"keywords":{}}],["spawn",{"_index":1242,"title":{},"content":{"188":{"position":[[130,5]]},"392":{"position":[[3701,5]]},"460":{"position":[[469,8],[559,7]]},"463":{"position":[[91,8]]},"872":{"position":[[2993,5]]},"1088":{"position":[[349,5]]}},"keywords":{}}],["spec",{"_index":5174,"title":{},"content":{"890":{"position":[[897,4]]},"1084":{"position":[[265,4]]}},"keywords":{}}],["special",{"_index":2075,"title":{},"content":{"359":{"position":[[127,11]]},"381":{"position":[[439,11]]},"390":{"position":[[24,11]]},"444":{"position":[[22,11]]},"563":{"position":[[163,7]]},"569":{"position":[[324,11]]},"685":{"position":[[40,7]]}},"keywords":{}}],["specif",{"_index":92,"title":{"299":{"position":[[8,8]]},"797":{"position":[[6,8]]},"1066":{"position":[[10,8]]}},"content":{"6":{"position":[[624,8]]},"7":{"position":[[459,8]]},"33":{"position":[[425,8]]},"38":{"position":[[447,8]]},"100":{"position":[[185,12]]},"106":{"position":[[125,8]]},"138":{"position":[[68,8]]},"140":{"position":[[190,8]]},"146":{"position":[[223,8]]},"147":{"position":[[261,8]]},"151":{"position":[[24,9]]},"153":{"position":[[82,12]]},"159":{"position":[[161,8]]},"162":{"position":[[805,8]]},"168":{"position":[[166,8]]},"174":{"position":[[1100,8]]},"189":{"position":[[707,8]]},"194":{"position":[[83,8]]},"196":{"position":[[237,8]]},"222":{"position":[[228,8]]},"228":{"position":[[207,12]]},"235":{"position":[[131,8]]},"260":{"position":[[98,8]]},"356":{"position":[[248,8]]},"369":{"position":[[284,8]]},"393":{"position":[[591,8]]},"402":{"position":[[1128,8]]},"411":{"position":[[1623,8]]},"412":{"position":[[15322,8]]},"427":{"position":[[1008,8]]},"430":{"position":[[249,8]]},"441":{"position":[[484,8]]},"451":{"position":[[67,13]]},"455":{"position":[[403,8],[533,8],[892,8]]},"456":{"position":[[69,8]]},"461":{"position":[[936,8]]},"462":{"position":[[231,8]]},"482":{"position":[[96,8]]},"520":{"position":[[457,12]]},"527":{"position":[[122,8]]},"535":{"position":[[835,8]]},"569":{"position":[[182,8],[1459,8]]},"570":{"position":[[122,8]]},"595":{"position":[[916,8]]},"612":{"position":[[1552,14]]},"617":{"position":[[1658,8]]},"653":{"position":[[15,8]]},"686":{"position":[[833,8]]},"690":{"position":[[131,8]]},"701":{"position":[[699,8]]},"719":{"position":[[30,8]]},"723":{"position":[[2335,8]]},"729":{"position":[[198,8]]},"826":{"position":[[338,8]]},"830":{"position":[[134,8],[168,8]]},"832":{"position":[[399,8]]},"875":{"position":[[66,8]]},"890":{"position":[[209,8]]},"1009":{"position":[[151,8],[374,8]]},"1067":{"position":[[1207,8],[1437,8]]},"1072":{"position":[[1937,8]]},"1101":{"position":[[317,8]]},"1104":{"position":[[40,8]]},"1106":{"position":[[184,8]]},"1132":{"position":[[688,8]]},"1138":{"position":[[481,8]]},"1198":{"position":[[49,8]]},"1201":{"position":[[276,8]]},"1202":{"position":[[237,8]]},"1206":{"position":[[148,8]]}},"keywords":{}}],["specifi",{"_index":2079,"title":{"746":{"position":[[0,7]]}},"content":{"361":{"position":[[17,10]]},"392":{"position":[[1352,9]]},"398":{"position":[[1861,9]]},"482":{"position":[[1149,9]]},"555":{"position":[[65,9]]},"612":{"position":[[1581,10]]},"681":{"position":[[414,7]]},"746":{"position":[[135,7]]},"749":{"position":[[325,9],[19364,9],[19484,9]]},"770":{"position":[[169,7]]},"797":{"position":[[200,7],[310,7]]},"886":{"position":[[1343,9]]},"911":{"position":[[139,7]]},"932":{"position":[[1303,7]]},"938":{"position":[[65,7]]},"987":{"position":[[983,7]]},"1066":{"position":[[275,7]]},"1067":{"position":[[2277,7]]},"1068":{"position":[[56,7]]},"1072":{"position":[[7,7]]},"1103":{"position":[[53,7]]},"1133":{"position":[[557,7]]},"1134":{"position":[[355,7]]},"1229":{"position":[[56,7]]},"1268":{"position":[[56,7]]},"1309":{"position":[[1273,7]]}},"keywords":{}}],["speed",{"_index":1427,"title":{"265":{"position":[[0,5]]}},"content":{"236":{"position":[[277,7]]},"266":{"position":[[441,5]]},"267":{"position":[[880,5],[1249,6]]},"342":{"position":[[48,5]]},"356":{"position":[[282,5]]},"365":{"position":[[750,5]]},"369":{"position":[[731,5]]},"376":{"position":[[492,5]]},"385":{"position":[[100,5]]},"408":{"position":[[2080,5],[2373,5],[3605,6]]},"412":{"position":[[8687,5]]},"418":{"position":[[713,5]]},"430":{"position":[[1109,5]]},"441":{"position":[[129,5]]},"462":{"position":[[602,6]]},"465":{"position":[[453,5]]},"469":{"position":[[73,5]]},"483":{"position":[[1203,6]]},"500":{"position":[[218,6]]},"527":{"position":[[155,5]]},"587":{"position":[[60,5]]},"590":{"position":[[662,5]]},"639":{"position":[[196,8]]},"640":{"position":[[347,5]]},"641":{"position":[[406,5]]},"723":{"position":[[90,5]]},"780":{"position":[[414,5]]},"783":{"position":[[184,6]]},"975":{"position":[[243,5]]},"1080":{"position":[[1107,5]]},"1120":{"position":[[459,5]]},"1137":{"position":[[177,6]]},"1206":{"position":[[580,6]]},"1316":{"position":[[1990,5]]}},"keywords":{}}],["speed.they",{"_index":6540,"title":{},"content":{"1316":{"position":[[455,10]]}},"keywords":{}}],["spend",{"_index":2613,"title":{},"content":{"411":{"position":[[1653,8]]}},"keywords":{}}],["spent",{"_index":2001,"title":{},"content":{"352":{"position":[[164,5]]}},"keywords":{}}],["spin",{"_index":5585,"title":{},"content":{"1009":{"position":[[178,4]]},"1135":{"position":[[172,4]]}},"keywords":{}}],["spinner",{"_index":713,"title":{"474":{"position":[[16,9]]},"778":{"position":[[29,9]]}},"content":{"46":{"position":[[389,9]]},"227":{"position":[[416,8]]},"400":{"position":[[702,8]]},"410":{"position":[[336,9]]},"421":{"position":[[626,8],[762,9]]},"427":{"position":[[1418,7]]},"474":{"position":[[81,9]]},"483":{"position":[[417,9]]},"486":{"position":[[12,9]]},"534":{"position":[[362,9]]},"594":{"position":[[360,9]]},"634":{"position":[[652,7]]},"778":{"position":[[285,8],[494,7]]},"995":{"position":[[740,7],[1806,7]]}},"keywords":{}}],["split",{"_index":2043,"title":{"1089":{"position":[[17,5]]}},"content":{"356":{"position":[[703,6]]},"412":{"position":[[12743,5]]},"643":{"position":[[184,9]]},"1022":{"position":[[88,5]]},"1092":{"position":[[61,5]]},"1120":{"position":[[600,5]]},"1295":{"position":[[190,5],[459,5]]},"1304":{"position":[[637,5]]}},"keywords":{}}],["sport",{"_index":3582,"title":{},"content":{"612":{"position":[[249,6]]},"624":{"position":[[825,6]]}},"keywords":{}}],["spotti",{"_index":3520,"title":{},"content":{"584":{"position":[[268,6]]}},"keywords":{}}],["spread",{"_index":6449,"title":{},"content":{"1295":{"position":[[313,6]]}},"keywords":{}}],["sql",{"_index":417,"title":{"31":{"position":[[7,4]]},"67":{"position":[[4,3]]},"74":{"position":[[48,4]]},"98":{"position":[[4,3]]},"105":{"position":[[48,4]]},"225":{"position":[[4,3]]},"232":{"position":[[38,4]]},"353":{"position":[[23,5]]},"354":{"position":[[15,3]]},"355":{"position":[[28,3]]},"1249":{"position":[[8,3]]},"1250":{"position":[[0,3]]}},"content":{"25":{"position":[[154,3]]},"31":{"position":[[8,3]]},"36":{"position":[[225,3]]},"67":{"position":[[1,3]]},"68":{"position":[[1,3]]},"70":{"position":[[1,3]]},"83":{"position":[[298,3]]},"98":{"position":[[7,3],[167,3]]},"99":{"position":[[1,3]]},"126":{"position":[[215,3]]},"174":{"position":[[735,4]]},"224":{"position":[[71,3]]},"225":{"position":[[7,3],[128,3]]},"226":{"position":[[1,3]]},"227":{"position":[[1,3]]},"228":{"position":[[13,3]]},"229":{"position":[[83,3]]},"232":{"position":[[273,3]]},"281":{"position":[[363,3]]},"351":{"position":[[13,3]]},"353":{"position":[[33,3]]},"354":{"position":[[182,3],[460,3],[653,3],[846,3],[1097,3],[1258,3],[1526,3]]},"356":{"position":[[54,3],[644,4]]},"360":{"position":[[249,4]]},"362":{"position":[[308,3],[464,3]]},"364":{"position":[[648,3]]},"412":{"position":[[13655,3],[14725,3]]},"435":{"position":[[28,3]]},"455":{"position":[[70,3],[194,3]]},"661":{"position":[[13,3],[139,3]]},"705":{"position":[[297,3],[659,3],[1269,3]]},"711":{"position":[[13,3],[191,3],[609,3],[1836,3],[2186,3]]},"836":{"position":[[15,3],[141,3],[921,3]]},"841":{"position":[[124,3],[310,3],[1135,3]]},"1065":{"position":[[340,3]]},"1071":{"position":[[203,3],[290,3]]},"1249":{"position":[[102,3],[143,3],[329,3]]},"1250":{"position":[[1,3],[80,3]]},"1251":{"position":[[1,3]]},"1252":{"position":[[276,3]]},"1257":{"position":[[106,3]]},"1280":{"position":[[15,3],[130,3],[410,5]]},"1282":{"position":[[628,3]]},"1315":{"position":[[340,4],[768,3],[1083,3],[1141,3],[1158,3],[1279,3]]},"1316":{"position":[[711,3],[1512,3],[2552,3],[3390,3]]},"1317":{"position":[[328,3],[422,3]]},"1320":{"position":[[374,3],[714,4]]},"1321":{"position":[[245,3]]},"1322":{"position":[[391,3]]},"1324":{"position":[[16,3],[514,3],[690,3]]}},"keywords":{}}],["sql"",{"_index":1490,"title":{},"content":{"244":{"position":[[441,9]]}},"keywords":{}}],["sql.j",{"_index":488,"title":{"30":{"position":[[0,7]]}},"content":{"30":{"position":[[1,6],[194,6]]},"31":{"position":[[76,7]]},"1324":{"position":[[113,7],[354,6]]}},"keywords":{}}],["sql1",{"_index":4425,"title":{},"content":{"749":{"position":[[23197,4]]}},"keywords":{}}],["sql2",{"_index":4427,"title":{},"content":{"749":{"position":[[23323,4]]}},"keywords":{}}],["sql3",{"_index":4429,"title":{},"content":{"749":{"position":[[23455,4]]}},"keywords":{}}],["sqlite",{"_index":100,"title":{"8":{"position":[[13,7]]},"11":{"position":[[8,7]]},"67":{"position":[[23,6]]},"98":{"position":[[23,6]]},"278":{"position":[[93,7]]},"357":{"position":[[16,7]]},"372":{"position":[[6,6]]},"448":{"position":[[57,6]]},"454":{"position":[[13,7]]},"657":{"position":[[21,7]]},"661":{"position":[[0,7]]},"706":{"position":[[52,7]]},"709":{"position":[[53,6]]},"711":{"position":[[0,6]]},"836":{"position":[[0,7]]},"1269":{"position":[[0,6]]},"1271":{"position":[[10,6]]},"1273":{"position":[[10,6],[42,6]]},"1278":{"position":[[16,7]]},"1279":{"position":[[11,6]]},"1280":{"position":[[17,7]]},"1282":{"position":[[18,6]]}},"content":{"8":{"position":[[18,6],[194,6],[218,6],[270,6],[290,6],[367,6],[847,6],[873,6],[946,7],[1188,8]]},"11":{"position":[[128,6],[190,10],[893,8],[985,6]]},"16":{"position":[[347,7]]},"17":{"position":[[308,6]]},"24":{"position":[[214,7]]},"30":{"position":[[39,6],[225,6],[284,7]]},"36":{"position":[[173,6]]},"43":{"position":[[327,6],[404,6]]},"59":{"position":[[178,7],[268,6],[298,7]]},"67":{"position":[[20,7]]},"69":{"position":[[28,6]]},"98":{"position":[[30,7]]},"186":{"position":[[111,6]]},"189":{"position":[[297,6],[406,6]]},"228":{"position":[[370,6]]},"266":{"position":[[114,7]]},"278":{"position":[[162,7]]},"279":{"position":[[381,7]]},"281":{"position":[[382,7]]},"282":{"position":[[490,7]]},"287":{"position":[[1092,6],[1192,6],[1232,6]]},"314":{"position":[[185,6]]},"318":{"position":[[274,6],[457,6]]},"336":{"position":[[429,6]]},"357":{"position":[[1,6],[106,6],[272,6],[322,6],[608,6],[654,6]]},"372":{"position":[[38,6],[131,7]]},"383":{"position":[[396,6]]},"384":{"position":[[228,6]]},"412":{"position":[[8493,6],[9855,6]]},"444":{"position":[[453,6]]},"454":{"position":[[515,6],[660,6],[1044,6]]},"455":{"position":[[118,7],[442,6],[553,6],[637,7]]},"457":{"position":[[255,6]]},"459":{"position":[[257,6]]},"463":{"position":[[388,6],[726,6],[751,6],[1156,6]]},"464":{"position":[[376,6],[402,6],[639,6]]},"465":{"position":[[237,6],[263,6]]},"466":{"position":[[200,6],[226,6],[385,6]]},"467":{"position":[[175,6],[201,6],[390,6],[462,6]]},"470":{"position":[[299,6]]},"483":{"position":[[1039,6]]},"489":{"position":[[277,7]]},"524":{"position":[[623,6],[687,6],[743,6],[806,6],[1044,7]]},"546":{"position":[[342,6]]},"551":{"position":[[140,6]]},"554":{"position":[[452,6],[706,6]]},"581":{"position":[[433,7]]},"606":{"position":[[332,6]]},"641":{"position":[[345,6]]},"661":{"position":[[1,6],[162,6],[218,6],[316,6],[816,6],[1092,6],[1348,6],[1653,6]]},"662":{"position":[[536,6],[784,6],[837,6],[910,6],[994,6],[1184,6],[1617,7],[1811,6],[1877,6],[2007,8]]},"705":{"position":[[1160,6]]},"710":{"position":[[607,6],[747,6],[2315,6]]},"711":{"position":[[1,6],[251,6],[523,6],[696,7],[821,6],[964,6],[1715,7],[1825,6],[2095,6]]},"714":{"position":[[381,7]]},"749":{"position":[[23227,6],[23353,6],[23485,6]]},"772":{"position":[[1111,6],[1161,6],[1192,6],[1296,6],[1548,8],[1768,6]]},"793":{"position":[[291,6],[1393,6]]},"836":{"position":[[3,6],[164,6],[220,6],[274,6],[415,6],[536,7],[663,8],[717,6],[1068,6],[1147,6],[1179,6],[1357,6],[1652,6],[1809,6],[2214,6]]},"837":{"position":[[1085,6],[1239,6],[1362,6],[1388,6],[1775,8],[2153,7]]},"838":{"position":[[1315,6],[1360,6],[1405,6],[1678,6],[1840,7],[1934,7],[2024,8],[2147,8],[3091,6]]},"841":{"position":[[29,6]]},"1137":{"position":[[113,7]]},"1143":{"position":[[553,7]]},"1191":{"position":[[406,6]]},"1196":{"position":[[89,6]]},"1214":{"position":[[883,6],[916,6]]},"1235":{"position":[[290,6],[350,6],[401,6]]},"1247":{"position":[[4,7],[17,6]]},"1249":{"position":[[117,7]]},"1270":{"position":[[5,6],[122,6],[199,6],[276,6],[338,6],[509,6]]},"1271":{"position":[[31,6],[145,6],[216,7],[614,6],[718,6],[869,6],[1034,6],[1102,6],[1206,8],[1273,6],[1296,6],[1688,6]]},"1272":{"position":[[11,6],[73,6],[151,6],[278,6]]},"1274":{"position":[[128,8],[166,6],[193,8],[443,7],[521,6],[612,6]]},"1275":{"position":[[71,6],[252,8]]},"1276":{"position":[[35,6],[57,6],[87,6],[179,6],[518,8],[560,6],[591,7],[629,6],[711,6],[769,6],[795,6],[811,8]]},"1277":{"position":[[32,6],[92,6],[276,8],[326,8],[616,6],[690,6],[805,8],[821,6],[847,6]]},"1278":{"position":[[18,6],[383,8],[404,6],[422,8],[830,8],[874,8]]},"1279":{"position":[[13,6],[293,6],[442,8],[464,6],[633,6],[830,7],[908,6],[999,6]]},"1280":{"position":[[65,6],[145,6],[224,6],[361,8]]},"1281":{"position":[[175,7]]},"1282":{"position":[[71,6],[322,6],[348,6],[374,6],[442,6],[607,7]]},"1316":{"position":[[3592,6]]},"1320":{"position":[[214,6],[308,7]]},"1324":{"position":[[193,6],[230,6],[367,6]]}},"keywords":{}}],["sqlite"",{"_index":1486,"title":{},"content":{"244":{"position":[[336,12],[1355,12]]}},"keywords":{}}],["sqlite.factory(modul",{"_index":6346,"title":{},"content":{"1276":{"position":[[883,23]]}},"keywords":{}}],["sqlite/dist/wa",{"_index":6343,"title":{},"content":{"1276":{"position":[[754,14]]}},"keywords":{}}],["sqlite3",{"_index":3992,"title":{"1274":{"position":[[15,7]]}},"content":{"711":{"position":[[712,7],[916,7],[1108,7]]},"772":{"position":[[1564,7],[1577,10],[2326,7],[2339,10]]},"1272":{"position":[[438,7]]},"1274":{"position":[[270,7],[283,10]]},"1276":{"position":[[873,7]]},"1280":{"position":[[377,7]]}},"keywords":{}}],["sqlite3.database('/path/to/database/file.db",{"_index":4000,"title":{},"content":{"711":{"position":[[1153,46]]}},"keywords":{}}],["sqlite3in",{"_index":3998,"title":{},"content":{"711":{"position":[[1019,9]]}},"keywords":{}}],["sqlite_error[1",{"_index":6371,"title":{},"content":{"1282":{"position":[[553,17]]}},"keywords":{}}],["sqliteadapt",{"_index":128,"title":{},"content":{"8":{"position":[[960,13]]},"837":{"position":[[1841,13]]}},"keywords":{}}],["sqliteadapterfactori",{"_index":127,"title":{},"content":{"8":{"position":[[890,20]]},"837":{"position":[[1719,20]]}},"keywords":{}}],["sqliteadapterfactory(sqlit",{"_index":129,"title":{},"content":{"8":{"position":[[976,28]]}},"keywords":{}}],["sqliteadapterfactory(websqlit",{"_index":4783,"title":{},"content":{"837":{"position":[[1857,32]]}},"keywords":{}}],["sqlitebas",{"_index":3814,"title":{"1272":{"position":[[0,13]]}},"content":{"662":{"position":[[2199,13]]},"772":{"position":[[1705,13]]},"838":{"position":[[2446,13]]},"1271":{"position":[[829,12],[1340,12],[1447,13]]},"1272":{"position":[[195,12]]},"1274":{"position":[[634,13]]},"1275":{"position":[[400,13]]},"1276":{"position":[[1002,13]]},"1277":{"position":[[539,13],[895,13]]},"1278":{"position":[[548,13],[1000,13]]},"1279":{"position":[[1021,13]]},"1280":{"position":[[511,13]]},"1281":{"position":[[240,13]]},"1282":{"position":[[788,13],[1159,13]]}},"keywords":{}}],["sqlitebasics<any>",{"_index":6366,"title":{},"content":{"1281":{"position":[[254,24]]}},"keywords":{}}],["sqliteconnect",{"_index":3798,"title":{},"content":{"661":{"position":[[925,17]]},"662":{"position":[[1705,16]]},"1279":{"position":[[527,16]]}},"keywords":{}}],["sqliteconnection(capacitorsqlit",{"_index":3805,"title":{},"content":{"661":{"position":[[1105,34]]},"662":{"position":[[1824,34]]},"1279":{"position":[[646,34]]}},"keywords":{}}],["sqlitedbconnect",{"_index":3797,"title":{},"content":{"661":{"position":[[905,19],[1156,18]]}},"keywords":{}}],["sqliteesmfactori",{"_index":6342,"title":{},"content":{"1276":{"position":[[728,16],[847,19]]}},"keywords":{}}],["sqlitefast",{"_index":6022,"title":{},"content":{"1128":{"position":[[26,10]]}},"keywords":{}}],["sqlitemodul",{"_index":6345,"title":{},"content":{"1276":{"position":[[826,12]]}},"keywords":{}}],["sqlitesqlit",{"_index":3971,"title":{},"content":{"703":{"position":[[548,12]]}},"keywords":{}}],["sqlite’",{"_index":2093,"title":{},"content":{"362":{"position":[[396,8]]}},"keywords":{}}],["sqlqueri",{"_index":4006,"title":{},"content":{"711":{"position":[[1527,9]]}},"keywords":{}}],["sqlsql.j",{"_index":6467,"title":{},"content":{"1299":{"position":[[534,9]]}},"keywords":{}}],["sqlsqlite",{"_index":6480,"title":{},"content":{"1302":{"position":[[98,9]]}},"keywords":{}}],["src",{"_index":3839,"title":{},"content":{"670":{"position":[[466,3]]},"1280":{"position":[[159,3]]}},"keywords":{}}],["src/index.t",{"_index":3852,"title":{},"content":{"674":{"position":[[54,17]]}},"keywords":{}}],["sse",{"_index":3167,"title":{},"content":{"491":{"position":[[648,6],[1499,4],[1687,6]]},"612":{"position":[[20,5],[116,4],[670,3],[1548,3],[1708,3]]},"614":{"position":[[941,3]]},"620":{"position":[[61,6]]},"623":{"position":[[783,4]]},"624":{"position":[[141,5],[1582,4]]},"875":{"position":[[7060,5]]}},"keywords":{}}],["ssl",{"_index":3377,"title":{},"content":{"556":{"position":[[1813,3],[1835,3],[1897,3]]}},"keywords":{}}],["sspl",{"_index":5976,"title":{},"content":{"1112":{"position":[[281,6]]}},"keywords":{}}],["stabl",{"_index":2044,"title":{},"content":{"356":{"position":[[755,6]]},"412":{"position":[[8538,6]]},"414":{"position":[[139,6]]}},"keywords":{}}],["stack",{"_index":586,"title":{},"content":{"38":{"position":[[140,7],[398,6]]},"76":{"position":[[118,7]]},"299":{"position":[[1392,5]]},"381":{"position":[[587,6]]},"413":{"position":[[126,6]]},"481":{"position":[[436,6]]},"644":{"position":[[449,6]]},"779":{"position":[[49,5]]}},"keywords":{}}],["stage",{"_index":2573,"title":{},"content":{"408":{"position":[[5279,6]]}},"keywords":{}}],["stale",{"_index":2705,"title":{},"content":{"412":{"position":[[6001,5]]},"476":{"position":[[62,5]]},"483":{"position":[[435,5]]},"1003":{"position":[[134,5]]}},"keywords":{}}],["stand",{"_index":1032,"title":{},"content":{"102":{"position":[[6,6]]},"118":{"position":[[6,6]]},"126":{"position":[[81,6]]},"161":{"position":[[182,6]]},"179":{"position":[[134,6]]},"212":{"position":[[115,6]]},"300":{"position":[[26,6]]},"317":{"position":[[234,6]]},"470":{"position":[[52,5]]},"520":{"position":[[65,6]]},"901":{"position":[[8,6]]},"1304":{"position":[[1273,5]]}},"keywords":{}}],["standalon",{"_index":3651,"title":{},"content":{"617":{"position":[[2348,10]]},"825":{"position":[[725,11]]}},"keywords":{}}],["standard",{"_index":2118,"title":{},"content":{"367":{"position":[[582,15]]},"397":{"position":[[250,15]]},"408":{"position":[[4922,8]]},"455":{"position":[[354,12]]},"510":{"position":[[593,9]]},"513":{"position":[[156,9]]},"612":{"position":[[36,8]]},"614":{"position":[[72,8]]},"841":{"position":[[301,8]]},"901":{"position":[[62,8]]},"912":{"position":[[721,10]]},"1215":{"position":[[435,8]]},"1286":{"position":[[147,8]]}},"keywords":{}}],["standard.websql",{"_index":2974,"title":{},"content":{"455":{"position":[[490,15]]}},"keywords":{}}],["standout",{"_index":1078,"title":{},"content":{"122":{"position":[[12,8]]},"156":{"position":[[12,8]]},"275":{"position":[[15,8]]},"381":{"position":[[3,8]]},"515":{"position":[[15,8]]}},"keywords":{}}],["star",{"_index":885,"title":{},"content":{"61":{"position":[[71,4],[232,4]]},"405":{"position":[[182,4]]},"471":{"position":[[167,4]]},"498":{"position":[[368,4],[418,8]]},"548":{"position":[[123,4]]},"557":{"position":[[254,4]]},"608":{"position":[[123,4]]},"628":{"position":[[269,4]]},"824":{"position":[[404,4]]}},"keywords":{}}],["stare",{"_index":3104,"title":{},"content":{"474":{"position":[[207,5]]}},"keywords":{}}],["starlink",{"_index":4593,"title":{},"content":{"780":{"position":[[274,8]]}},"keywords":{}}],["start",{"_index":886,"title":{"93":{"position":[[27,5]]},"119":{"position":[[8,7]]},"154":{"position":[[8,7]]},"180":{"position":[[8,7]]},"211":{"position":[[19,8]]},"217":{"position":[[30,5]]},"253":{"position":[[16,5]]},"256":{"position":[[8,7]]},"261":{"position":[[9,5]]},"272":{"position":[[8,7]]},"314":{"position":[[6,6]]},"324":{"position":[[8,7]]},"502":{"position":[[8,7]]},"577":{"position":[[8,7]]},"892":{"position":[[0,8]]},"1097":{"position":[[0,8]]}},"content":{"61":{"position":[[140,7]]},"65":{"position":[[1293,5],[1428,5]]},"84":{"position":[[269,7]]},"93":{"position":[[61,5],[262,6]]},"114":{"position":[[282,7]]},"128":{"position":[[262,5]]},"149":{"position":[[282,7]]},"173":{"position":[[1637,5]]},"175":{"position":[[275,7]]},"188":{"position":[[502,6],[1483,5],[2570,5]]},"206":{"position":[[172,5]]},"209":{"position":[[595,5]]},"217":{"position":[[64,5]]},"241":{"position":[[33,7],[202,5]]},"255":{"position":[[935,5]]},"262":{"position":[[63,6]]},"285":{"position":[[9,7],[120,5]]},"318":{"position":[[177,5]]},"347":{"position":[[282,7]]},"362":{"position":[[1353,7]]},"373":{"position":[[33,7],[202,5]]},"388":{"position":[[14,8]]},"392":{"position":[[3292,5]]},"403":{"position":[[291,8]]},"408":{"position":[[3427,6]]},"409":{"position":[[310,5]]},"412":{"position":[[15375,5]]},"421":{"position":[[866,5]]},"454":{"position":[[491,7]]},"463":{"position":[[174,6],[468,5]]},"468":{"position":[[510,5],[604,7]]},"498":{"position":[[10,5],[677,7]]},"511":{"position":[[282,7]]},"531":{"position":[[282,7]]},"591":{"position":[[282,7]]},"647":{"position":[[128,5]]},"653":{"position":[[884,7],[1272,5],[1424,5]]},"663":{"position":[[37,5]]},"666":{"position":[[16,5]]},"667":{"position":[[12,5]]},"700":{"position":[[203,6]]},"703":{"position":[[1685,8]]},"705":{"position":[[3,7]]},"708":{"position":[[266,5]]},"710":{"position":[[985,5]]},"711":{"position":[[514,5]]},"715":{"position":[[245,5],[333,5]]},"716":{"position":[[386,5]]},"723":{"position":[[1906,7]]},"737":{"position":[[335,5]]},"739":{"position":[[126,6]]},"749":{"position":[[4911,5],[8265,5],[11599,5],[17567,5]]},"752":{"position":[[255,5],[731,5],[900,7]]},"757":{"position":[[208,7]]},"776":{"position":[[71,5]]},"793":{"position":[[27,7]]},"796":{"position":[[744,5]]},"816":{"position":[[20,6]]},"824":{"position":[[46,5]]},"829":{"position":[[842,8]]},"840":{"position":[[309,5],[595,7]]},"842":{"position":[[171,5]]},"846":{"position":[[1,5]]},"854":{"position":[[476,5],[499,5]]},"861":{"position":[[817,5],[895,5]]},"862":{"position":[[1086,5]]},"863":{"position":[[98,5]]},"865":{"position":[[142,5]]},"866":{"position":[[55,5],[81,5],[299,8]]},"872":{"position":[[509,5],[2155,5],[2890,5],[3544,5],[4330,5]]},"875":{"position":[[3,5],[161,5],[249,5],[609,5],[682,5]]},"878":{"position":[[86,5]]},"886":{"position":[[3773,5]]},"892":{"position":[[211,5]]},"893":{"position":[[27,7],[175,5]]},"898":{"position":[[3121,5],[3194,5]]},"904":{"position":[[1406,5],[1436,5],[1664,5],[1833,5]]},"988":{"position":[[9,5],[1379,5],[1527,5]]},"995":{"position":[[369,6],[1026,6],[1071,7]]},"1002":{"position":[[39,5],[424,5],[1077,5]]},"1004":{"position":[[124,5]]},"1007":{"position":[[426,5],[900,5]]},"1009":{"position":[[514,5]]},"1028":{"position":[[128,5]]},"1030":{"position":[[189,7]]},"1076":{"position":[[32,8]]},"1097":{"position":[[298,5],[858,5]]},"1101":{"position":[[564,5]]},"1121":{"position":[[218,5]]},"1123":{"position":[[202,5]]},"1147":{"position":[[444,7]]},"1157":{"position":[[46,8]]},"1158":{"position":[[613,7]]},"1195":{"position":[[150,5]]},"1198":{"position":[[8,7]]},"1214":{"position":[[906,6]]},"1222":{"position":[[784,5]]},"1231":{"position":[[207,8],[297,5],[977,5]]},"1242":{"position":[[179,5]]},"1305":{"position":[[616,6]]},"1315":{"position":[[1531,7]]}},"keywords":{}}],["start/stop",{"_index":4899,"title":{},"content":{"861":{"position":[[747,11]]},"872":{"position":[[2865,10]]},"1007":{"position":[[2013,10]]}},"keywords":{}}],["startchunkreplication(chunkid",{"_index":5566,"title":{},"content":{"1007":{"position":[[1229,30]]}},"keywords":{}}],["starter",{"_index":2663,"title":{},"content":{"412":{"position":[[1417,8]]}},"keywords":{}}],["startrxserv",{"_index":5912,"title":{},"content":{"1090":{"position":[[1021,15]]},"1103":{"position":[[201,15]]}},"keywords":{}}],["startrxstorageremotewebsocketserv",{"_index":6251,"title":{},"content":{"1219":{"position":[[338,35],[516,37],[679,37]]},"1220":{"position":[[195,37]]}},"keywords":{}}],["startsignalingserversimplep",{"_index":5264,"title":{},"content":{"906":{"position":[[895,30],[994,32]]}},"keywords":{}}],["startup",{"_index":1205,"title":{},"content":{"173":{"position":[[1801,7]]},"217":{"position":[[179,8]]},"469":{"position":[[776,7]]},"772":{"position":[[2029,8]]},"964":{"position":[[541,7]]},"1192":{"position":[[168,7],[222,8],[317,7]]}},"keywords":{}}],["startwebsocketserv",{"_index":5175,"title":{},"content":{"892":{"position":[[51,20],[262,22]]}},"keywords":{}}],["state",{"_index":18,"title":{"89":{"position":[[46,6]]},"96":{"position":[[27,5]]},"219":{"position":[[19,5]]},"223":{"position":[[35,6]]},"478":{"position":[[50,5]]},"857":{"position":[[66,6]]},"1113":{"position":[[30,5]]},"1116":{"position":[[4,5]]}},"content":{"1":{"position":[[280,6]]},"18":{"position":[[269,5]]},"32":{"position":[[246,5]]},"38":{"position":[[610,6]]},"89":{"position":[[56,5]]},"96":{"position":[[40,5],[93,5],[248,5]]},"117":{"position":[[217,6]]},"173":{"position":[[335,5],[556,5],[2899,6],[3003,5],[3054,5],[3144,5],[3178,5]]},"219":{"position":[[58,5],[180,5]]},"223":{"position":[[22,5],[211,6]]},"233":{"position":[[301,6]]},"237":{"position":[[75,5]]},"251":{"position":[[100,5]]},"346":{"position":[[638,6]]},"360":{"position":[[114,6]]},"407":{"position":[[328,6]]},"410":{"position":[[1906,5]]},"411":{"position":[[1853,5],[1934,6],[1972,5],[2110,5],[2224,5],[2498,5],[2524,5],[2678,5],[4297,6],[4638,5],[4772,6]]},"412":{"position":[[5216,5],[5241,6]]},"415":{"position":[[369,6]]},"424":{"position":[[414,5]]},"458":{"position":[[279,5]]},"478":{"position":[[73,5],[282,5]]},"489":{"position":[[79,5]]},"490":{"position":[[59,5]]},"494":{"position":[[46,5]]},"495":{"position":[[434,6]]},"518":{"position":[[282,5]]},"520":{"position":[[340,5]]},"571":{"position":[[251,6]]},"574":{"position":[[93,5]]},"576":{"position":[[190,5]]},"585":{"position":[[166,5]]},"626":{"position":[[1180,5]]},"634":{"position":[[372,6]]},"662":{"position":[[137,5]]},"666":{"position":[[106,6]]},"681":{"position":[[76,6],[529,6]]},"687":{"position":[[208,7]]},"688":{"position":[[779,6],[1060,5]]},"696":{"position":[[389,6]]},"697":{"position":[[487,5]]},"698":{"position":[[1360,6],[2404,5],[2482,6],[2700,5]]},"699":{"position":[[107,5]]},"700":{"position":[[229,5],[346,6],[611,5],[1111,5]]},"701":{"position":[[92,5]]},"709":{"position":[[554,5]]},"710":{"position":[[1127,5]]},"719":{"position":[[273,5]]},"723":{"position":[[1263,5]]},"731":{"position":[[36,5]]},"749":{"position":[[12585,5],[12650,5]]},"752":{"position":[[308,5],[958,5],[1089,6],[1342,5]]},"753":{"position":[[77,6],[192,5],[401,5]]},"756":{"position":[[102,5]]},"761":{"position":[[165,6]]},"774":{"position":[[1073,5]]},"775":{"position":[[167,5]]},"778":{"position":[[564,5]]},"779":{"position":[[198,5],[298,5],[418,5]]},"780":{"position":[[575,5]]},"783":{"position":[[643,5]]},"784":{"position":[[456,5],[681,5]]},"785":{"position":[[200,5],[264,5],[466,5]]},"826":{"position":[[660,5],[1007,5]]},"828":{"position":[[154,5],[276,5]]},"829":{"position":[[3222,6]]},"837":{"position":[[380,6]]},"838":{"position":[[138,6],[166,5]]},"846":{"position":[[1582,6]]},"855":{"position":[[104,5],[246,6]]},"856":{"position":[[78,6]]},"861":{"position":[[1711,5],[2170,5]]},"862":{"position":[[1494,6],[1582,6]]},"867":{"position":[[104,5],[241,6]]},"872":{"position":[[2687,5]]},"875":{"position":[[4032,5],[4111,5],[5821,5]]},"881":{"position":[[180,5]]},"885":{"position":[[384,5],[418,6]]},"898":{"position":[[4500,6]]},"904":{"position":[[3306,6]]},"973":{"position":[[42,5]]},"977":{"position":[[284,5]]},"982":{"position":[[173,5],[234,5],[266,5],[302,5],[440,5],[467,5],[505,5],[543,5],[579,5]]},"983":{"position":[[15,6],[639,6]]},"984":{"position":[[135,6]]},"986":{"position":[[443,5]]},"987":{"position":[[201,5],[231,5],[312,5],[388,5],[480,5],[615,5],[698,5],[736,5],[799,5],[824,6]]},"988":{"position":[[744,5],[779,6],[2051,5],[3475,6]]},"995":{"position":[[167,6]]},"999":{"position":[[69,6]]},"1004":{"position":[[745,5]]},"1007":{"position":[[297,6]]},"1008":{"position":[[44,5],[92,5]]},"1009":{"position":[[805,7],[1016,5]]},"1020":{"position":[[139,5],[228,6]]},"1044":{"position":[[219,5]]},"1045":{"position":[[26,5]]},"1046":{"position":[[70,5]]},"1049":{"position":[[156,7]]},"1058":{"position":[[159,5]]},"1114":{"position":[[59,5],[266,5],[801,5],[882,6]]},"1115":{"position":[[21,5],[613,5]]},"1116":{"position":[[5,5],[322,5]]},"1117":{"position":[[25,5],[62,5]]},"1119":{"position":[[35,5],[178,5],[221,5]]},"1120":{"position":[[78,5],[193,5],[738,5]]},"1121":{"position":[[13,5],[664,5]]},"1123":{"position":[[409,5]]},"1124":{"position":[[1511,6]]},"1174":{"position":[[187,5]]},"1175":{"position":[[115,5],[216,5],[295,5],[587,5]]},"1180":{"position":[[406,6]]},"1184":{"position":[[230,6]]},"1185":{"position":[[121,5]]},"1192":{"position":[[143,6]]},"1219":{"position":[[242,6]]},"1222":{"position":[[887,6]]},"1271":{"position":[[470,5]]},"1299":{"position":[[307,5]]},"1300":{"position":[[262,5],[476,6],[719,5],[894,6]]},"1301":{"position":[[175,5]]},"1304":{"position":[[213,5]]},"1305":{"position":[[56,5]]},"1307":{"position":[[90,6],[914,6]]},"1308":{"position":[[480,5],[546,5],[588,5]]},"1309":{"position":[[88,6],[1012,5],[1037,5]]},"1314":{"position":[[244,6]]},"1316":{"position":[[269,5],[1240,5],[1459,6]]}},"keywords":{}}],["state.if",{"_index":5439,"title":{},"content":{"982":{"position":[[615,8]]}},"keywords":{}}],["state.overhead",{"_index":3903,"title":{},"content":{"689":{"position":[[445,14]]}},"keywords":{}}],["statement",{"_index":328,"title":{},"content":{"19":{"position":[[376,10]]},"333":{"position":[[264,11]]},"841":{"position":[[314,10]]},"1065":{"position":[[926,9]]},"1176":{"position":[[152,9]]}},"keywords":{}}],["states.revis",{"_index":3191,"title":{},"content":{"496":{"position":[[185,15]]}},"keywords":{}}],["static",{"_index":1040,"title":{"788":{"position":[[0,8]]},"789":{"position":[[4,7]]}},"content":{"105":{"position":[[208,6]]},"232":{"position":[[156,6]]},"281":{"position":[[67,6]]},"329":{"position":[[12,6]]},"421":{"position":[[49,6]]},"687":{"position":[[88,6]]},"749":{"position":[[8146,6],[8238,6],[8352,6],[8459,7]]},"788":{"position":[[1,7]]},"789":{"position":[[8,6],[33,7],[222,8],[469,8]]},"806":{"position":[[70,7]]},"829":{"position":[[2874,6]]},"934":{"position":[[311,8]]},"937":{"position":[[21,8]]},"1210":{"position":[[515,10]]},"1311":{"position":[[1051,8],[1684,6]]}},"keywords":{}}],["statist",{"_index":2828,"title":{},"content":{"420":{"position":[[28,11]]}},"keywords":{}}],["statu",{"_index":917,"title":{},"content":{"65":{"position":[[734,7]]},"632":{"position":[[2820,7]]},"752":{"position":[[1114,7]]},"796":{"position":[[1191,6],[1325,7],[1336,7],[1428,6]]}},"keywords":{}}],["stay",{"_index":410,"title":{},"content":{"24":{"position":[[774,4]]},"61":{"position":[[104,4]]},"130":{"position":[[298,5]]},"201":{"position":[[232,5]]},"263":{"position":[[316,4]]},"286":{"position":[[329,4]]},"328":{"position":[[179,4]]},"410":{"position":[[1507,4]]},"412":{"position":[[8198,4]]},"697":{"position":[[96,4]]},"737":{"position":[[201,5]]},"897":{"position":[[335,5]]},"902":{"position":[[385,5]]},"1150":{"position":[[591,5]]},"1192":{"position":[[648,4],[760,4]]},"1198":{"position":[[2183,5]]}},"keywords":{}}],["steadfast",{"_index":3289,"title":{},"content":{"530":{"position":[[623,9]]}},"keywords":{}}],["steadi",{"_index":3631,"title":{},"content":{"617":{"position":[[92,6]]}},"keywords":{}}],["steadili",{"_index":2774,"title":{},"content":{"412":{"position":[[15112,8]]}},"keywords":{}}],["stefe",{"_index":5680,"title":{},"content":{"1040":{"position":[[418,6]]}},"keywords":{}}],["stem",{"_index":1660,"title":{},"content":{"283":{"position":[[30,5]]}},"keywords":{}}],["step",{"_index":105,"title":{"211":{"position":[[6,5]]},"824":{"position":[[5,6]]}},"content":{"8":{"position":[[124,5]]},"84":{"position":[[354,4],[362,4]]},"114":{"position":[[367,4],[375,4]]},"149":{"position":[[367,4],[375,4]]},"175":{"position":[[358,4],[366,4]]},"241":{"position":[[140,4],[148,4]]},"271":{"position":[[6,5]]},"347":{"position":[[365,4],[373,4]]},"362":{"position":[[1436,4],[1444,4]]},"373":{"position":[[140,4],[148,4]]},"388":{"position":[[42,6]]},"391":{"position":[[15,4]]},"393":{"position":[[66,4]]},"402":{"position":[[633,4]]},"404":{"position":[[698,4]]},"412":{"position":[[3580,4]]},"421":{"position":[[1143,6]]},"466":{"position":[[9,5]]},"498":{"position":[[78,6]]},"501":{"position":[[63,5]]},"511":{"position":[[367,4],[375,4]]},"531":{"position":[[367,4],[375,4]]},"567":{"position":[[360,4],[368,4],[1055,6]]},"591":{"position":[[365,4],[373,4]]},"724":{"position":[[125,4],[329,4],[1505,4]]},"872":{"position":[[203,5],[591,4]]},"912":{"position":[[99,4]]},"1085":{"position":[[3293,6]]},"1087":{"position":[[178,4]]},"1088":{"position":[[57,4]]},"1313":{"position":[[50,5]]}},"keywords":{}}],["steve",{"_index":5682,"title":{},"content":{"1040":{"position":[[471,10],[500,6]]},"1043":{"position":[[90,8],[203,7]]}},"keywords":{}}],["still",{"_index":452,"title":{"428":{"position":[[11,5]]}},"content":{"28":{"position":[[172,5]]},"38":{"position":[[903,5]]},"305":{"position":[[492,5]]},"333":{"position":[[125,5]]},"353":{"position":[[451,5]]},"354":{"position":[[1224,5]]},"357":{"position":[[409,5]]},"360":{"position":[[822,5]]},"362":{"position":[[316,5]]},"398":{"position":[[2991,5]]},"404":{"position":[[571,5]]},"408":{"position":[[3176,5],[5257,5]]},"410":{"position":[[1283,5],[1411,5]]},"411":{"position":[[4920,5]]},"412":{"position":[[1671,5],[8361,5],[10809,5]]},"418":{"position":[[741,5]]},"419":{"position":[[444,5]]},"420":{"position":[[553,5]]},"421":{"position":[[570,5]]},"450":{"position":[[471,5],[704,5]]},"454":{"position":[[442,5]]},"469":{"position":[[795,5]]},"470":{"position":[[58,6]]},"563":{"position":[[1020,5]]},"610":{"position":[[751,5]]},"611":{"position":[[1117,5]]},"621":{"position":[[594,5]]},"648":{"position":[[291,5],[354,5]]},"686":{"position":[[672,5]]},"705":{"position":[[50,5]]},"817":{"position":[[125,5],[239,5]]},"834":{"position":[[137,5]]},"875":{"position":[[2403,5]]},"879":{"position":[[176,5]]},"898":{"position":[[646,5]]},"902":{"position":[[707,5]]},"948":{"position":[[224,5]]},"955":{"position":[[272,5]]},"958":{"position":[[55,5]]},"976":{"position":[[296,5]]},"988":{"position":[[1866,5]]},"1006":{"position":[[207,5]]},"1009":{"position":[[657,5]]},"1030":{"position":[[234,5]]},"1072":{"position":[[307,5],[776,5]]},"1120":{"position":[[383,5]]},"1139":{"position":[[34,5]]},"1145":{"position":[[34,5]]},"1180":{"position":[[343,5]]},"1213":{"position":[[761,5]]},"1231":{"position":[[291,5]]},"1246":{"position":[[1543,5]]},"1271":{"position":[[1704,5]]},"1295":{"position":[[524,5]]},"1304":{"position":[[1279,5]]},"1314":{"position":[[527,5]]}},"keywords":{}}],["stock",{"_index":3677,"title":{},"content":{"624":{"position":[[569,5]]},"626":{"position":[[275,5]]},"699":{"position":[[656,5]]},"1316":{"position":[[845,5]]}},"keywords":{}}],["stolen",{"_index":1880,"title":{},"content":{"310":{"position":[[274,6]]}},"keywords":{}}],["stop",{"_index":2783,"title":{},"content":{"414":{"position":[[284,4]]},"655":{"position":[[220,4]]},"700":{"position":[[678,8]]},"702":{"position":[[338,4]]},"767":{"position":[[617,4]]},"768":{"position":[[619,4]]},"769":{"position":[[576,4]]},"861":{"position":[[808,4],[868,4]]},"881":{"position":[[253,4]]},"892":{"position":[[342,4]]},"893":{"position":[[443,4]]},"904":{"position":[[3539,4],[3586,4]]},"955":{"position":[[93,4]]},"976":{"position":[[69,4]]},"1000":{"position":[[36,8]]},"1007":{"position":[[839,4]]},"1009":{"position":[[485,4]]},"1027":{"position":[[28,5]]},"1058":{"position":[[542,4]]},"1296":{"position":[[182,4]]},"1299":{"position":[[81,4]]}},"keywords":{}}],["stopchunkreplication(chunkid",{"_index":5573,"title":{},"content":{"1007":{"position":[[1804,29]]}},"keywords":{}}],["stopchunkreplication(cid",{"_index":5580,"title":{},"content":{"1007":{"position":[[2246,26]]}},"keywords":{}}],["storag",{"_index":37,"title":{"60":{"position":[[42,9]]},"62":{"position":[[8,7]]},"66":{"position":[[8,7]]},"71":{"position":[[34,8]]},"72":{"position":[[9,7]]},"112":{"position":[[9,7]]},"213":{"position":[[50,7]]},"239":{"position":[[9,7]]},"268":{"position":[[6,7]]},"290":{"position":[[40,8]]},"297":{"position":[[14,7]]},"298":{"position":[[20,7]]},"303":{"position":[[21,7]]},"307":{"position":[[19,7]]},"308":{"position":[[19,9]]},"309":{"position":[[23,8]]},"314":{"position":[[49,8]]},"317":{"position":[[21,7]]},"365":{"position":[[0,7]]},"366":{"position":[[12,7]]},"417":{"position":[[19,7]]},"425":{"position":[[16,7]]},"427":{"position":[[39,8]]},"441":{"position":[[31,7]]},"449":{"position":[[14,7]]},"461":{"position":[[0,7]]},"547":{"position":[[42,9]]},"558":{"position":[[8,7]]},"561":{"position":[[28,8]]},"564":{"position":[[23,7]]},"607":{"position":[[42,9]]},"640":{"position":[[15,8]]},"643":{"position":[[26,9]]},"697":{"position":[[8,7]]},"706":{"position":[[40,7]]},"713":{"position":[[19,7]]},"758":{"position":[[0,7]]},"774":{"position":[[36,8]]},"962":{"position":[[0,8]]},"1090":{"position":[[17,7]]},"1126":{"position":[[17,8]]},"1140":{"position":[[0,7]]},"1143":{"position":[[22,8]]},"1144":{"position":[[25,7]]},"1165":{"position":[[49,8]]},"1190":{"position":[[17,7]]},"1192":{"position":[[30,9]]},"1195":{"position":[[14,8]]},"1196":{"position":[[18,8]]},"1246":{"position":[[0,7]]},"1247":{"position":[[18,9]]},"1270":{"position":[[34,9]]}},"content":{"1":{"position":[[575,8]]},"2":{"position":[[378,8]]},"3":{"position":[[258,8]]},"4":{"position":[[436,8]]},"5":{"position":[[346,8]]},"6":{"position":[[245,8],[541,8],[739,8]]},"7":{"position":[[378,8],[574,8]]},"8":{"position":[[28,8],[1147,8]]},"9":{"position":[[292,8]]},"10":{"position":[[330,8]]},"11":{"position":[[856,8]]},"16":{"position":[[290,7]]},"18":{"position":[[199,7]]},"22":{"position":[[331,7]]},"24":{"position":[[155,7],[565,7]]},"28":{"position":[[201,7],[263,7],[761,7]]},"33":{"position":[[569,7]]},"35":{"position":[[57,7],[136,7],[560,7]]},"39":{"position":[[563,7],[635,7]]},"40":{"position":[[377,7]]},"42":{"position":[[178,7]]},"43":{"position":[[290,7]]},"45":{"position":[[57,7],[163,7]]},"46":{"position":[[136,7]]},"47":{"position":[[1284,7]]},"51":{"position":[[24,7],[102,8],[169,8],[764,8]]},"55":{"position":[[906,8]]},"57":{"position":[[35,8],[413,7]]},"58":{"position":[[230,7],[335,7]]},"59":{"position":[[97,7],[169,8]]},"60":{"position":[[61,7]]},"61":{"position":[[304,7]]},"63":{"position":[[224,7]]},"64":{"position":[[98,8]]},"65":{"position":[[482,7],[1347,8],[1620,7]]},"66":{"position":[[15,8],[195,7],[385,7],[563,7]]},"71":{"position":[[47,7]]},"72":{"position":[[24,7]]},"81":{"position":[[16,7],[75,7]]},"83":{"position":[[79,8],[468,8]]},"84":{"position":[[70,8]]},"95":{"position":[[38,8]]},"111":{"position":[[13,7],[107,7]]},"112":{"position":[[24,7]]},"131":{"position":[[24,7],[82,7],[249,7],[615,7],[750,7],[801,7],[924,7]]},"139":{"position":[[261,7]]},"141":{"position":[[15,7],[183,7]]},"162":{"position":[[23,7],[108,7],[339,7],[438,7],[593,7]]},"167":{"position":[[222,7]]},"169":{"position":[[20,7],[172,7],[307,7]]},"170":{"position":[[524,7]]},"173":{"position":[[80,7],[927,8]]},"174":{"position":[[2464,7],[2561,7],[2634,7]]},"178":{"position":[[92,7]]},"188":{"position":[[325,7],[1082,8]]},"189":{"position":[[22,7],[185,7],[370,7],[418,7],[641,8],[789,7]]},"197":{"position":[[13,7],[182,7]]},"207":{"position":[[237,7]]},"209":{"position":[[278,8]]},"211":{"position":[[250,8]]},"212":{"position":[[679,8]]},"218":{"position":[[38,8]]},"229":{"position":[[148,8]]},"236":{"position":[[78,7],[154,7],[344,8]]},"239":{"position":[[26,7]]},"241":{"position":[[448,7],[721,7]]},"243":{"position":[[559,7],[626,7],[727,7],[826,7],[923,7]]},"244":{"position":[[773,7]]},"249":{"position":[[385,7]]},"254":{"position":[[227,7],[496,7]]},"255":{"position":[[622,8]]},"258":{"position":[[183,8]]},"265":{"position":[[109,7]]},"266":{"position":[[32,7],[76,9],[460,7],[702,8],[851,7],[959,7]]},"267":{"position":[[1320,8]]},"279":{"position":[[82,8]]},"283":{"position":[[209,7]]},"284":{"position":[[223,7]]},"287":{"position":[[36,7],[143,7],[492,8],[560,7],[960,8],[1204,7]]},"290":{"position":[[131,7]]},"294":{"position":[[177,7]]},"295":{"position":[[137,7]]},"298":{"position":[[449,8],[913,7]]},"299":{"position":[[1098,7],[1679,7]]},"300":{"position":[[51,7],[83,7],[162,7],[539,8],[837,7]]},"301":{"position":[[60,7],[487,7],[551,7],[650,7]]},"303":{"position":[[49,7]]},"304":{"position":[[243,7]]},"305":{"position":[[427,7]]},"306":{"position":[[335,7]]},"310":{"position":[[345,7]]},"313":{"position":[[150,7]]},"314":{"position":[[108,8],[192,7],[513,8],[1031,7]]},"315":{"position":[[481,8],[580,8]]},"316":{"position":[[17,7]]},"317":{"position":[[14,7]]},"318":{"position":[[11,7],[281,7],[464,7]]},"321":{"position":[[357,7]]},"334":{"position":[[370,8]]},"336":{"position":[[24,7],[529,7]]},"357":{"position":[[661,8]]},"358":{"position":[[123,8]]},"360":{"position":[[12,7]]},"361":{"position":[[292,7]]},"365":{"position":[[75,7],[153,8],[215,8],[408,8],[536,8],[861,8],[931,8],[993,7],[1034,8]]},"366":{"position":[[13,7],[130,7],[176,7]]},"368":{"position":[[23,7],[83,7],[122,7]]},"369":{"position":[[1359,7],[1376,7],[1548,7]]},"372":{"position":[[58,7],[217,8]]},"373":{"position":[[460,8],[749,7]]},"377":{"position":[[321,7]]},"383":{"position":[[349,7]]},"385":{"position":[[64,7]]},"388":{"position":[[510,7]]},"392":{"position":[[90,7],[382,8],[1228,7]]},"395":{"position":[[122,7]]},"398":{"position":[[2977,7]]},"402":{"position":[[416,7],[1255,8],[1575,7],[2681,8],[2837,9]]},"408":{"position":[[181,7],[266,7],[309,7],[456,7],[1218,7],[1366,7],[1491,7],[3814,7],[4146,7],[4690,7]]},"410":{"position":[[42,7]]},"411":{"position":[[4177,7]]},"412":{"position":[[1116,8],[7297,7],[7365,8],[7647,7],[8071,7],[8514,8],[9093,9],[9967,7]]},"417":{"position":[[169,7]]},"420":{"position":[[347,8]]},"424":{"position":[[478,8]]},"426":{"position":[[103,7]]},"427":{"position":[[727,7],[1496,7]]},"429":{"position":[[126,7],[408,7],[636,7]]},"430":{"position":[[802,7]]},"432":{"position":[[41,7],[303,7],[616,7],[823,7]]},"434":{"position":[[52,8],[379,7]]},"435":{"position":[[69,8]]},"436":{"position":[[116,7]]},"438":{"position":[[367,7]]},"439":{"position":[[283,7],[367,7],[550,7],[578,7],[647,7]]},"441":{"position":[[101,8],[267,7],[585,7]]},"444":{"position":[[75,7]]},"451":{"position":[[407,7]]},"453":{"position":[[798,7]]},"454":{"position":[[812,7]]},"455":{"position":[[100,8]]},"456":{"position":[[159,8]]},"458":{"position":[[474,7],[656,7],[754,7],[1174,8]]},"459":{"position":[[347,7]]},"460":{"position":[[399,7]]},"461":{"position":[[625,7],[998,7],[1248,7],[1426,7],[1505,7]]},"462":{"position":[[46,7],[790,8]]},"469":{"position":[[891,7],[1336,7]]},"470":{"position":[[217,7],[555,7]]},"480":{"position":[[408,8]]},"482":{"position":[[424,7],[521,8],[657,8]]},"483":{"position":[[1046,7]]},"489":{"position":[[172,7],[228,7]]},"491":{"position":[[13,7]]},"495":{"position":[[731,7],[832,8],[892,7]]},"502":{"position":[[343,7]]},"504":{"position":[[481,7]]},"508":{"position":[[62,7]]},"520":{"position":[[211,8],[245,8]]},"522":{"position":[[465,8]]},"524":{"position":[[22,7],[114,7],[319,7],[359,7],[446,8]]},"528":{"position":[[45,7]]},"533":{"position":[[205,7],[301,7]]},"535":{"position":[[1265,8]]},"538":{"position":[[24,7],[111,8],[234,7],[494,8]]},"542":{"position":[[567,8]]},"544":{"position":[[66,8],[388,7]]},"545":{"position":[[235,7]]},"546":{"position":[[69,7],[349,7]]},"547":{"position":[[61,7]]},"551":{"position":[[213,7],[350,8]]},"554":{"position":[[336,7],[424,7],[465,8],[644,7],[719,7],[865,7],[969,8],[1100,8]]},"556":{"position":[[83,7],[154,7]]},"560":{"position":[[147,7]]},"561":{"position":[[143,8]]},"562":{"position":[[202,8]]},"563":{"position":[[522,8]]},"564":{"position":[[27,7],[489,8],[630,8],[1153,8]]},"566":{"position":[[106,7],[794,8]]},"567":{"position":[[47,7],[239,7],[912,7],[1090,7]]},"574":{"position":[[460,7]]},"576":{"position":[[66,7]]},"579":{"position":[[141,7],[379,8]]},"581":{"position":[[24,7],[308,7],[621,7]]},"584":{"position":[[86,8]]},"588":{"position":[[83,7]]},"593":{"position":[[205,7],[301,7]]},"595":{"position":[[1318,8]]},"598":{"position":[[24,7],[111,8],[235,7],[501,8]]},"604":{"position":[[66,8],[322,7]]},"605":{"position":[[235,7]]},"606":{"position":[[69,7],[339,7]]},"607":{"position":[[61,7]]},"632":{"position":[[1263,7],[1330,8]]},"638":{"position":[[373,8],[467,8]]},"639":{"position":[[178,7]]},"640":{"position":[[8,7],[445,7]]},"641":{"position":[[99,7],[155,8],[352,7]]},"643":{"position":[[103,8]]},"653":{"position":[[290,8]]},"660":{"position":[[159,8],[418,8]]},"661":{"position":[[323,7],[363,7],[597,7]]},"662":{"position":[[1884,8],[2045,8],[2164,8]]},"666":{"position":[[359,7],[454,9]]},"680":{"position":[[711,8]]},"693":{"position":[[538,7],[597,7],[925,9],[935,8],[1199,8],[1245,9]]},"696":{"position":[[813,8]]},"697":{"position":[[58,7]]},"698":{"position":[[524,7]]},"703":{"position":[[387,7],[406,7]]},"704":{"position":[[456,7]]},"709":{"position":[[106,7],[906,7]]},"710":{"position":[[431,7],[1733,8]]},"714":{"position":[[1102,7]]},"717":{"position":[[735,7],[833,8],[912,8],[1194,8]]},"718":{"position":[[308,7],[416,8],[697,8]]},"719":{"position":[[224,7]]},"721":{"position":[[453,7]]},"723":{"position":[[1938,7]]},"734":{"position":[[345,8],[519,8]]},"739":{"position":[[322,8]]},"745":{"position":[[77,7],[143,7],[354,7],[424,8],[504,7],[568,8]]},"746":{"position":[[312,8],[596,7]]},"747":{"position":[[129,8]]},"749":{"position":[[756,7],[893,7],[3376,7],[3487,7],[8663,7],[21760,7],[23234,7],[23360,7],[23492,7]]},"756":{"position":[[108,8]]},"759":{"position":[[142,9],[397,8],[544,7]]},"760":{"position":[[243,8],[318,9],[540,7]]},"772":{"position":[[141,7],[205,7],[808,8],[1096,7],[1199,7],[1675,8],[2437,8],[2568,8]]},"773":{"position":[[598,8]]},"774":{"position":[[129,8],[294,7],[363,7],[700,8],[736,8]]},"775":{"position":[[709,7]]},"778":{"position":[[362,7]]},"793":{"position":[[152,8],[393,7],[1013,7]]},"801":{"position":[[17,7]]},"820":{"position":[[279,7],[315,8]]},"825":{"position":[[374,8]]},"829":{"position":[[239,7],[681,8]]},"830":{"position":[[246,7]]},"832":{"position":[[408,7]]},"835":{"position":[[33,7]]},"836":{"position":[[1075,7],[2281,7]]},"837":{"position":[[980,8]]},"838":{"position":[[1629,7],[1685,7],[2416,8]]},"841":{"position":[[990,8]]},"860":{"position":[[106,8],[1018,7]]},"862":{"position":[[572,8]]},"872":{"position":[[1456,8],[1506,7],[1750,8],[4011,8]]},"898":{"position":[[2070,7],[2146,8],[2354,8]]},"904":{"position":[[430,7],[525,8],[751,8]]},"932":{"position":[[871,7],[989,8],[1082,8]]},"960":{"position":[[333,8]]},"961":{"position":[[238,7]]},"962":{"position":[[244,7],[792,8],[1008,8]]},"966":{"position":[[574,8],[692,8]]},"967":{"position":[[159,8],[277,8]]},"977":{"position":[[30,8],[472,8]]},"981":{"position":[[1108,7]]},"1002":{"position":[[921,8]]},"1009":{"position":[[613,7]]},"1013":{"position":[[69,7],[337,8]]},"1067":{"position":[[738,8]]},"1068":{"position":[[203,7]]},"1072":{"position":[[293,8],[1683,7],[1725,7]]},"1085":{"position":[[3524,7]]},"1089":{"position":[[60,7]]},"1090":{"position":[[78,7],[159,8],[411,7],[815,8],[851,8],[1368,7]]},"1095":{"position":[[149,7]]},"1114":{"position":[[106,7],[748,8]]},"1118":{"position":[[678,8]]},"1120":{"position":[[129,7],[437,8],[629,7]]},"1121":{"position":[[488,8]]},"1123":{"position":[[43,8],[384,7],[489,8]]},"1124":{"position":[[151,7],[209,7],[376,7],[634,7]]},"1125":{"position":[[113,7],[325,8]]},"1126":{"position":[[20,8],[45,7],[410,8],[723,8]]},"1130":{"position":[[198,8]]},"1132":{"position":[[143,7],[1116,7],[1364,7]]},"1134":{"position":[[175,8]]},"1137":{"position":[[48,9],[85,8],[292,9]]},"1138":{"position":[[22,7],[319,8]]},"1139":{"position":[[574,8]]},"1140":{"position":[[5,7],[318,7],[358,8],[633,8]]},"1141":{"position":[[85,7],[195,7],[225,7]]},"1143":{"position":[[622,7]]},"1144":{"position":[[20,8],[223,8]]},"1145":{"position":[[563,8]]},"1146":{"position":[[268,8]]},"1148":{"position":[[743,7],[1157,7]]},"1149":{"position":[[891,8],[950,8]]},"1151":{"position":[[211,7],[581,7]]},"1152":{"position":[[87,8]]},"1154":{"position":[[115,7],[626,8],[784,8]]},"1157":{"position":[[100,7]]},"1158":{"position":[[14,8],[231,8]]},"1159":{"position":[[85,7],[417,8]]},"1161":{"position":[[296,8]]},"1162":{"position":[[224,8],[557,7],[738,7]]},"1163":{"position":[[226,8],[348,7],[390,7],[427,8],[577,8]]},"1164":{"position":[[124,7],[161,8],[330,7],[469,8],[579,7],[657,8],[720,8],[1241,8]]},"1165":{"position":[[19,7],[130,8],[190,8],[235,7],[390,8],[768,8],[1106,8]]},"1168":{"position":[[179,8]]},"1172":{"position":[[344,8]]},"1178":{"position":[[210,7],[580,7]]},"1181":{"position":[[290,8],[375,7],[645,7],[826,7]]},"1182":{"position":[[226,8],[348,7],[379,8],[394,7],[431,8],[581,8]]},"1183":{"position":[[26,7],[77,7],[323,7],[555,7]]},"1184":{"position":[[270,7],[308,8],[346,7],[640,7],[677,8],[725,8],[820,8]]},"1185":{"position":[[41,7],[300,7],[366,8]]},"1186":{"position":[[35,7],[258,7],[317,8]]},"1188":{"position":[[396,7]]},"1189":{"position":[[102,8],[442,8]]},"1191":{"position":[[413,8],[619,8]]},"1192":{"position":[[24,8],[261,8],[540,8],[671,8]]},"1194":{"position":[[70,8]]},"1195":{"position":[[47,8],[88,7],[231,7]]},"1196":{"position":[[186,7]]},"1198":{"position":[[621,7],[1245,7],[1838,8]]},"1201":{"position":[[219,8]]},"1206":{"position":[[59,7],[252,8]]},"1209":{"position":[[161,7],[394,9]]},"1210":{"position":[[460,8]]},"1211":{"position":[[715,8]]},"1212":{"position":[[46,7],[246,7],[448,7],[502,7]]},"1213":{"position":[[668,7]]},"1214":{"position":[[527,7],[644,7]]},"1218":{"position":[[12,7],[357,7],[415,10],[532,7],[587,7],[787,8]]},"1219":{"position":[[12,7],[72,7],[729,8],[900,8]]},"1220":{"position":[[12,7],[462,7]]},"1222":{"position":[[384,8],[1431,8]]},"1225":{"position":[[425,8]]},"1226":{"position":[[256,8]]},"1227":{"position":[[734,8]]},"1228":{"position":[[125,7]]},"1229":{"position":[[261,7]]},"1230":{"position":[[261,7]]},"1231":{"position":[[890,8],[1065,8]]},"1235":{"position":[[38,7],[130,7],[480,8]]},"1237":{"position":[[135,8],[858,8],[895,8],[935,8],[982,8]]},"1238":{"position":[[38,8],[159,7],[192,8],[833,8],[882,8],[914,8],[978,8]]},"1239":{"position":[[18,7],[134,7],[202,7],[803,8],[852,8],[888,8]]},"1241":{"position":[[3,7]]},"1242":{"position":[[24,7]]},"1243":{"position":[[127,8]]},"1244":{"position":[[117,8]]},"1245":{"position":[[21,7]]},"1246":{"position":[[98,7],[442,7],[713,7],[907,8],[1198,8],[1339,7],[1446,7]]},"1247":{"position":[[24,7],[171,7],[365,7],[538,7],[731,8]]},"1263":{"position":[[319,8]]},"1264":{"position":[[178,8]]},"1265":{"position":[[722,8]]},"1267":{"position":[[563,7],[658,8],[752,8]]},"1268":{"position":[[424,7],[750,8]]},"1270":{"position":[[12,7],[68,8],[97,7],[283,7]]},"1271":{"position":[[38,7],[152,7],[303,7],[462,7],[621,8],[725,7],[925,7],[1109,7],[1227,7],[1411,7],[1535,7],[1608,8],[1617,7],[1695,8]]},"1272":{"position":[[158,8]]},"1274":{"position":[[359,8]]},"1275":{"position":[[370,8]]},"1276":{"position":[[230,8],[972,8]]},"1277":{"position":[[509,8],[864,7]]},"1278":{"position":[[518,8],[970,8]]},"1279":{"position":[[746,8]]},"1280":{"position":[[481,8]]},"1282":{"position":[[757,7],[1128,7]]},"1286":{"position":[[395,7],[433,8],[538,7]]},"1287":{"position":[[441,7],[483,8],[588,7]]},"1288":{"position":[[401,7],[449,8],[554,7]]},"1292":{"position":[[52,7],[216,7],[280,7],[403,8],[634,7]]},"1296":{"position":[[103,7]]},"1300":{"position":[[580,7]]},"1311":{"position":[[200,8]]},"1324":{"position":[[456,8]]}},"keywords":{}}],["storage"",{"_index":1453,"title":{},"content":{"243":{"position":[[341,13],[1027,13]]},"244":{"position":[[52,13],[116,13],[1154,13]]}},"keywords":{}}],["storage+databasenam",{"_index":4208,"title":{},"content":{"749":{"position":[[5680,20]]}},"keywords":{}}],["storage+nam",{"_index":5398,"title":{},"content":{"967":{"position":[[77,12]]}},"keywords":{}}],["storage."",{"_index":2826,"title":{},"content":{"419":{"position":[[1912,14]]}},"keywords":{}}],["storage.can",{"_index":6154,"title":{},"content":{"1180":{"position":[[296,11]]}},"keywords":{}}],["storage.customrequest",{"_index":6260,"title":{},"content":{"1220":{"position":[[556,23]]}},"keywords":{}}],["storage.decreas",{"_index":6105,"title":{},"content":{"1161":{"position":[[84,17]]},"1180":{"position":[[84,17]]}},"keywords":{}}],["storage.html?console=storag",{"_index":4298,"title":{},"content":{"749":{"position":[[12695,28]]}},"keywords":{}}],["storage.indexeddb",{"_index":3233,"title":{},"content":{"504":{"position":[[158,17]]}},"keywords":{}}],["storage.memori",{"_index":1673,"title":{},"content":{"287":{"position":[[873,14]]}},"keywords":{}}],["storage.opf",{"_index":3234,"title":{},"content":{"504":{"position":[[243,12]]}},"keywords":{}}],["storage.th",{"_index":6112,"title":{},"content":{"1162":{"position":[[849,11]]}},"keywords":{}}],["storageflex",{"_index":3141,"title":{},"content":{"483":{"position":[[236,15]]}},"keywords":{}}],["storageful",{"_index":2434,"title":{},"content":{"400":{"position":[[50,11]]}},"keywords":{}}],["storageinst",{"_index":6144,"title":{},"content":{"1177":{"position":[[234,15]]}},"keywords":{}}],["storageinstance.internals.localst",{"_index":6147,"title":{},"content":{"1177":{"position":[[309,37]]}},"keywords":{}}],["storages.in",{"_index":1570,"title":{},"content":{"254":{"position":[[382,11]]}},"keywords":{}}],["storages.split",{"_index":3096,"title":{},"content":{"469":{"position":[[1129,18]]}},"keywords":{}}],["storagesingl",{"_index":3417,"title":{},"content":{"560":{"position":[[370,13]]}},"keywords":{}}],["storagesqlit",{"_index":3330,"title":{},"content":{"546":{"position":[[232,14]]},"606":{"position":[[232,14]]}},"keywords":{}}],["storageth",{"_index":3302,"title":{},"content":{"538":{"position":[[70,10]]},"598":{"position":[[70,10]]}},"keywords":{}}],["storagewithattachmentscompress",{"_index":5315,"title":{},"content":{"932":{"position":[[914,33],[1091,33]]}},"keywords":{}}],["storagewithkeycompress",{"_index":4083,"title":{},"content":{"734":{"position":[[286,25],[528,25]]}},"keywords":{}}],["store",{"_index":5,"title":{"65":{"position":[[4,5]]},"81":{"position":[[0,7]]},"86":{"position":[[22,5]]},"95":{"position":[[0,5]]},"111":{"position":[[0,7]]},"214":{"position":[[22,5]]},"236":{"position":[[0,7]]},"270":{"position":[[0,7]]},"294":{"position":[[27,6]]},"305":{"position":[[31,6]]},"355":{"position":[[0,7]]},"357":{"position":[[0,7]]},"368":{"position":[[0,5]]},"371":{"position":[[8,5]]},"392":{"position":[[0,7]]},"397":{"position":[[0,7]]},"426":{"position":[[0,7]]},"457":{"position":[[0,7]]},"559":{"position":[[8,7]]},"800":{"position":[[0,5]]},"912":{"position":[[0,7]]},"1122":{"position":[[39,5]]},"1237":{"position":[[0,7]]}},"content":{"1":{"position":[[56,6]]},"3":{"position":[[23,6]]},"5":{"position":[[14,6]]},"6":{"position":[[44,5],[643,5]]},"7":{"position":[[43,5],[478,5]]},"10":{"position":[[26,6]]},"13":{"position":[[172,5]]},"14":{"position":[[489,6],[745,6]]},"16":{"position":[[183,6]]},"17":{"position":[[437,5]]},"24":{"position":[[738,5]]},"30":{"position":[[90,6]]},"31":{"position":[[173,6]]},"35":{"position":[[319,7]]},"36":{"position":[[207,5]]},"45":{"position":[[146,5]]},"47":{"position":[[420,6],[692,7]]},"58":{"position":[[290,5]]},"63":{"position":[[42,5]]},"65":{"position":[[40,7],[150,7],[813,6],[1530,5],[1677,6],[1731,6],[1812,7]]},"66":{"position":[[475,6]]},"86":{"position":[[42,7]]},"87":{"position":[[73,7]]},"88":{"position":[[1,7]]},"93":{"position":[[1,7]]},"95":{"position":[[149,5]]},"97":{"position":[[14,6]]},"110":{"position":[[59,6]]},"111":{"position":[[70,7]]},"117":{"position":[[100,6]]},"122":{"position":[[157,6]]},"131":{"position":[[561,5]]},"133":{"position":[[151,6]]},"139":{"position":[[132,6]]},"152":{"position":[[179,7]]},"173":{"position":[[1225,5],[1327,6],[1675,6]]},"174":{"position":[[2407,5]]},"178":{"position":[[113,7]]},"183":{"position":[[171,6]]},"188":{"position":[[250,5],[3118,5]]},"189":{"position":[[69,5],[519,6]]},"195":{"position":[[101,6]]},"215":{"position":[[26,5]]},"216":{"position":[[67,7]]},"217":{"position":[[1,7]]},"218":{"position":[[277,6]]},"219":{"position":[[151,5]]},"221":{"position":[[81,7]]},"236":{"position":[[29,5]]},"240":{"position":[[43,6]]},"245":{"position":[[149,5]]},"248":{"position":[[105,6]]},"252":{"position":[[131,6]]},"254":{"position":[[307,5]]},"265":{"position":[[152,7]]},"270":{"position":[[1,7],[136,5]]},"273":{"position":[[117,6]]},"274":{"position":[[85,7]]},"291":{"position":[[120,6]]},"292":{"position":[[156,6]]},"294":{"position":[[111,6]]},"302":{"position":[[168,5],[745,5]]},"303":{"position":[[150,5],[412,7],[1154,5]]},"304":{"position":[[144,5]]},"306":{"position":[[66,5]]},"309":{"position":[[136,6]]},"311":{"position":[[138,6]]},"315":{"position":[[877,6]]},"316":{"position":[[514,6]]},"317":{"position":[[51,6]]},"321":{"position":[[57,5]]},"322":{"position":[[175,5]]},"325":{"position":[[43,6]]},"331":{"position":[[77,7]]},"334":{"position":[[129,5]]},"336":{"position":[[349,6]]},"338":{"position":[[65,5]]},"343":{"position":[[41,6]]},"345":{"position":[[91,6]]},"346":{"position":[[107,5]]},"350":{"position":[[19,6],[188,5]]},"352":{"position":[[98,5]]},"353":{"position":[[631,7]]},"356":{"position":[[201,5],[749,5]]},"357":{"position":[[20,7],[256,7],[480,6]]},"358":{"position":[[26,7]]},"360":{"position":[[26,6],[557,6]]},"362":{"position":[[322,5],[552,7]]},"364":{"position":[[297,7],[581,5],[688,6]]},"365":{"position":[[621,6],[1290,6]]},"367":{"position":[[1,7],[533,6]]},"376":{"position":[[239,7]]},"377":{"position":[[1,7]]},"390":{"position":[[59,7]]},"391":{"position":[[909,6]]},"392":{"position":[[4,5],[103,6],[459,6],[505,6],[1163,6],[1389,6],[1775,7],[1886,6],[2037,7],[2457,6],[2566,6]]},"393":{"position":[[18,6]]},"394":{"position":[[41,6],[1450,6]]},"395":{"position":[[46,5]]},"396":{"position":[[1092,6],[1176,5],[1788,6]]},"397":{"position":[[20,5],[1578,6],[2007,5]]},"398":{"position":[[25,6],[3507,5]]},"402":{"position":[[120,7],[2590,5]]},"403":{"position":[[154,6],[406,6]]},"407":{"position":[[166,5]]},"408":{"position":[[621,7],[881,5],[4463,6]]},"410":{"position":[[513,7],[2142,5]]},"411":{"position":[[2151,6],[2753,7]]},"412":{"position":[[2069,7],[2731,5],[7690,7],[13130,6]]},"414":{"position":[[33,5],[410,5]]},"416":{"position":[[42,7]]},"417":{"position":[[252,7]]},"419":{"position":[[798,7]]},"424":{"position":[[91,5],[424,5]]},"425":{"position":[[249,7]]},"426":{"position":[[191,5],[272,7],[365,7]]},"427":{"position":[[501,6],[549,7],[655,7]]},"429":{"position":[[577,7]]},"430":{"position":[[431,7],[604,5]]},"432":{"position":[[206,5],[1264,6]]},"434":{"position":[[153,5]]},"439":{"position":[[130,5]]},"440":{"position":[[148,6],[347,5]]},"442":{"position":[[14,5]]},"444":{"position":[[666,5]]},"445":{"position":[[538,5]]},"450":{"position":[[60,5],[338,6],[433,5]]},"451":{"position":[[128,5],[272,6],[313,7],[420,7]]},"452":{"position":[[111,7]]},"453":{"position":[[95,5],[693,7],[733,5]]},"455":{"position":[[167,5]]},"457":{"position":[[10,5],[66,5],[168,5],[275,5],[441,5]]},"459":{"position":[[43,7],[1183,7]]},"461":{"position":[[68,6],[1332,5]]},"462":{"position":[[691,5],[836,7]]},"463":{"position":[[16,5],[363,5],[628,7],[856,5],[1250,5]]},"464":{"position":[[1321,7]]},"465":{"position":[[18,6]]},"469":{"position":[[361,5],[656,6],[822,6],[1072,7]]},"473":{"position":[[39,6]]},"480":{"position":[[970,5]]},"489":{"position":[[88,6]]},"491":{"position":[[1192,6]]},"495":{"position":[[560,7],[747,7]]},"500":{"position":[[443,5]]},"504":{"position":[[364,7]]},"516":{"position":[[117,7]]},"524":{"position":[[508,6],[605,6]]},"526":{"position":[[136,6]]},"533":{"position":[[34,7],[150,5]]},"534":{"position":[[204,7]]},"535":{"position":[[365,5]]},"545":{"position":[[214,7]]},"551":{"position":[[503,7]]},"555":{"position":[[135,7],[836,6],[970,7]]},"556":{"position":[[269,6],[511,6],[572,5],[1236,5]]},"559":{"position":[[44,7],[1190,5]]},"560":{"position":[[233,5],[441,6]]},"561":{"position":[[155,6]]},"564":{"position":[[117,6],[1060,5]]},"566":{"position":[[64,5],[133,6],[1318,7]]},"574":{"position":[[612,5],[637,6]]},"575":{"position":[[341,6]]},"580":{"position":[[132,5]]},"581":{"position":[[353,6]]},"586":{"position":[[103,6]]},"588":{"position":[[43,6]]},"590":{"position":[[263,6],[295,5]]},"593":{"position":[[34,7],[150,5]]},"594":{"position":[[202,7]]},"595":{"position":[[376,5]]},"605":{"position":[[214,7]]},"630":{"position":[[1014,5]]},"635":{"position":[[377,7]]},"638":{"position":[[6,7]]},"647":{"position":[[274,6]]},"659":{"position":[[91,5],[753,6],[976,7]]},"660":{"position":[[307,6],[396,7]]},"661":{"position":[[1698,5]]},"662":{"position":[[458,5],[564,6],[661,7]]},"680":{"position":[[135,5],[1013,5]]},"685":{"position":[[21,6],[575,5]]},"693":{"position":[[628,5]]},"696":{"position":[[80,6],[994,5],[1417,5],[1586,7],[1921,5],[1962,6],[2041,7]]},"697":{"position":[[14,6],[252,6],[505,6],[553,5]]},"698":{"position":[[2384,7],[2436,5]]},"701":{"position":[[765,5]]},"702":{"position":[[218,6]]},"703":{"position":[[59,5],[287,5],[577,5]]},"709":{"position":[[187,7],[760,7]]},"710":{"position":[[536,6]]},"711":{"position":[[140,6],[2140,5]]},"715":{"position":[[37,5]]},"716":{"position":[[119,7],[327,5]]},"720":{"position":[[4,5]]},"723":{"position":[[442,6],[1997,6]]},"724":{"position":[[579,5]]},"749":{"position":[[6401,5],[14460,5],[21892,5]]},"754":{"position":[[10,5]]},"772":{"position":[[1133,6],[1312,6],[1955,5]]},"773":{"position":[[103,6]]},"775":{"position":[[558,5]]},"779":{"position":[[369,5]]},"784":{"position":[[798,6]]},"785":{"position":[[507,6]]},"786":{"position":[[14,5]]},"821":{"position":[[116,5],[703,5]]},"835":{"position":[[858,6],[1040,7]]},"836":{"position":[[767,6]]},"837":{"position":[[360,5],[750,5],[2066,5]]},"838":{"position":[[1093,7],[1240,6],[3355,5]]},"840":{"position":[[55,6]]},"841":{"position":[[88,6],[161,6],[1332,5],[1408,6]]},"844":{"position":[[181,5],[230,6]]},"846":{"position":[[796,7]]},"856":{"position":[[195,5]]},"865":{"position":[[79,5]]},"866":{"position":[[669,6]]},"898":{"position":[[282,6],[383,6]]},"902":{"position":[[441,7]]},"903":{"position":[[229,6]]},"904":{"position":[[443,6]]},"912":{"position":[[1,7],[318,6]]},"932":{"position":[[212,7],[364,7],[1413,5]]},"962":{"position":[[630,6]]},"977":{"position":[[453,6]]},"988":{"position":[[1872,5]]},"995":{"position":[[1216,5]]},"1002":{"position":[[260,5]]},"1005":{"position":[[209,7]]},"1006":{"position":[[100,7]]},"1007":{"position":[[1084,6]]},"1013":{"position":[[189,5],[421,5],[573,5],[640,5]]},"1028":{"position":[[80,7]]},"1047":{"position":[[102,5]]},"1068":{"position":[[239,6]]},"1072":{"position":[[550,7],[2128,5],[2220,5]]},"1074":{"position":[[381,6],[653,5]]},"1078":{"position":[[310,6]]},"1085":{"position":[[11,5],[48,5],[103,5],[307,5],[477,7],[696,5],[1075,5],[1511,5]]},"1104":{"position":[[770,5]]},"1105":{"position":[[1213,5]]},"1106":{"position":[[310,7]]},"1116":{"position":[[11,6]]},"1121":{"position":[[27,6]]},"1124":{"position":[[481,5],[1656,6],[1698,6],[2048,6]]},"1126":{"position":[[857,6]]},"1140":{"position":[[70,6]]},"1143":{"position":[[247,6]]},"1162":{"position":[[644,7],[690,5]]},"1170":{"position":[[228,7]]},"1171":{"position":[[364,6]]},"1173":{"position":[[53,5]]},"1180":{"position":[[308,5]]},"1181":{"position":[[41,7],[732,7],[778,5]]},"1184":{"position":[[124,5]]},"1186":{"position":[[203,6]]},"1191":{"position":[[233,5],[305,5]]},"1192":{"position":[[289,5]]},"1194":{"position":[[465,6],[739,6],[832,6],[964,6]]},"1198":{"position":[[488,5],[1271,6]]},"1199":{"position":[[81,7]]},"1207":{"position":[[671,5]]},"1222":{"position":[[1181,6]]},"1237":{"position":[[48,5],[234,6]]},"1239":{"position":[[155,5]]},"1241":{"position":[[16,6]]},"1242":{"position":[[32,6]]},"1246":{"position":[[1413,6],[1565,6],[1849,5]]},"1247":{"position":[[574,6]]},"1267":{"position":[[249,5]]},"1271":{"position":[[420,5]]},"1282":{"position":[[81,5],[184,5]]},"1292":{"position":[[412,6]]},"1294":{"position":[[245,6],[342,6],[897,5]]},"1295":{"position":[[125,7],[236,6],[617,7],[923,5],[998,6],[1191,5]]},"1300":{"position":[[975,5]]},"1305":{"position":[[491,6],[917,6],[1048,6]]},"1307":{"position":[[120,6]]},"1319":{"position":[[108,6]]},"1320":{"position":[[785,5]]},"1321":{"position":[[556,5],[763,6]]},"1324":{"position":[[263,5],[479,6]]}},"keywords":{}}],["store.add(hugedata",{"_index":1808,"title":{},"content":{"302":{"position":[[789,19]]}},"keywords":{}}],["store.index('ag",{"_index":6431,"title":{},"content":{"1294":{"position":[[946,16]]}},"keywords":{}}],["store.put(docdata",{"_index":6461,"title":{},"content":{"1296":{"position":[[941,19]]}},"keywords":{}}],["storeattachmentsasbase64str",{"_index":6369,"title":{},"content":{"1282":{"position":[[132,31]]}},"keywords":{}}],["stored/queri",{"_index":4716,"title":{},"content":{"821":{"position":[[658,14]]}},"keywords":{}}],["storedus",{"_index":2880,"title":{},"content":{"426":{"position":[[487,10]]}},"keywords":{}}],["storedusernam",{"_index":2872,"title":{},"content":{"425":{"position":[[361,14]]}},"keywords":{}}],["stores—provid",{"_index":2016,"title":{},"content":{"354":{"position":[[50,14]]}},"keywords":{}}],["straightforward",{"_index":529,"title":{},"content":{"34":{"position":[[116,16]]},"35":{"position":[[522,15]]},"47":{"position":[[644,15]]},"63":{"position":[[19,15]]},"90":{"position":[[77,16]]},"174":{"position":[[2162,16]]},"219":{"position":[[338,15]]},"285":{"position":[[32,15]]},"293":{"position":[[147,15]]},"306":{"position":[[127,15]]},"336":{"position":[[553,16]]},"387":{"position":[[31,15]]},"429":{"position":[[387,15]]},"491":{"position":[[517,15]]},"503":{"position":[[86,15]]},"522":{"position":[[61,16]]},"536":{"position":[[31,16]]},"554":{"position":[[66,15]]},"559":{"position":[[96,15]]},"563":{"position":[[932,15]]},"596":{"position":[[29,16]]},"612":{"position":[[677,16]]},"624":{"position":[[166,15]]},"690":{"position":[[163,16]]},"836":{"position":[[1381,15],[2248,16]]},"903":{"position":[[633,16]]},"906":{"position":[[504,16]]},"1208":{"position":[[24,15]]}},"keywords":{}}],["strang",{"_index":2847,"title":{},"content":{"421":{"position":[[169,7]]},"749":{"position":[[21948,7]]},"1085":{"position":[[264,7],[3130,7]]},"1305":{"position":[[275,7]]}},"keywords":{}}],["strateg",{"_index":1120,"title":{},"content":{"138":{"position":[[211,13]]},"166":{"position":[[182,13]]}},"keywords":{}}],["strategi",{"_index":227,"title":{"147":{"position":[[21,11]]},"496":{"position":[[20,11]]},"751":{"position":[[10,11]]}},"content":{"14":{"position":[[817,8]]},"65":{"position":[[111,8]]},"134":{"position":[[209,10]]},"135":{"position":[[298,11]]},"146":{"position":[[306,10]]},"147":{"position":[[96,10],[286,10]]},"165":{"position":[[249,10]]},"192":{"position":[[169,11]]},"202":{"position":[[431,8]]},"250":{"position":[[58,9]]},"287":{"position":[[239,8]]},"328":{"position":[[220,10]]},"339":{"position":[[81,11]]},"367":{"position":[[316,10]]},"381":{"position":[[409,10]]},"396":{"position":[[841,11]]},"403":{"position":[[367,8]]},"408":{"position":[[2677,10]]},"412":{"position":[[3260,9],[5311,9],[5533,9],[12407,8]]},"473":{"position":[[87,8]]},"501":{"position":[[375,10]]},"525":{"position":[[547,11]]},"567":{"position":[[1098,8]]},"618":{"position":[[444,8]]},"636":{"position":[[297,9]]},"688":{"position":[[858,9]]},"698":{"position":[[456,9],[1430,11],[2544,9],[3296,11]]},"702":{"position":[[637,8]]},"751":{"position":[[391,8],[739,10]]},"757":{"position":[[287,10]]},"860":{"position":[[788,11]]},"899":{"position":[[137,10]]},"1085":{"position":[[3497,11]]},"1149":{"position":[[63,9]]},"1305":{"position":[[173,8]]},"1313":{"position":[[982,11]]},"1321":{"position":[[400,8]]}},"keywords":{}}],["strategy.opf",{"_index":3090,"title":{},"content":{"469":{"position":[[254,13]]}},"keywords":{}}],["stream",{"_index":356,"title":{"140":{"position":[[7,7]]},"168":{"position":[[7,7]]},"196":{"position":[[7,7]]},"344":{"position":[[7,7]]},"509":{"position":[[7,7]]},"529":{"position":[[7,7]]},"585":{"position":[[30,8]]}},"content":{"20":{"position":[[195,7]]},"121":{"position":[[103,7]]},"140":{"position":[[21,8],[133,8],[268,7]]},"156":{"position":[[106,6]]},"168":{"position":[[20,7],[130,8]]},"170":{"position":[[423,8]]},"196":{"position":[[22,8],[99,8]]},"208":{"position":[[278,9]]},"255":{"position":[[259,9]]},"267":{"position":[[537,7]]},"283":{"position":[[341,7]]},"303":{"position":[[240,7]]},"344":{"position":[[12,7]]},"408":{"position":[[2511,6]]},"445":{"position":[[1012,7],[1389,8]]},"464":{"position":[[154,6]]},"491":{"position":[[1703,9]]},"509":{"position":[[24,8]]},"529":{"position":[[48,8]]},"570":{"position":[[772,6]]},"612":{"position":[[1127,6],[1500,6],[1928,8]]},"613":{"position":[[243,8],[468,10]]},"614":{"position":[[325,9]]},"617":{"position":[[1540,7],[2011,6],[2273,6]]},"622":{"position":[[645,7],[738,8]]},"623":{"position":[[714,8]]},"624":{"position":[[599,10]]},"625":{"position":[[25,9]]},"626":{"position":[[123,8],[206,9],[321,6],[888,6]]},"627":{"position":[[81,9]]},"632":{"position":[[415,7]]},"643":{"position":[[223,9]]},"749":{"position":[[15627,7]]},"781":{"position":[[276,7]]},"866":{"position":[[552,6],[583,7]]},"871":{"position":[[124,7]]},"875":{"position":[[6629,6],[7103,6],[7312,8],[7732,7],[8461,8],[9309,7],[9750,8]]},"885":{"position":[[448,6]]},"886":{"position":[[3223,7],[3292,6],[3351,6]]},"888":{"position":[[732,8]]},"921":{"position":[[34,6]]},"932":{"position":[[622,7]]},"941":{"position":[[51,7]]},"970":{"position":[[51,7]]},"988":{"position":[[4723,6],[4793,7],[4832,8],[4899,6],[5352,8]]},"990":{"position":[[702,6]]},"1005":{"position":[[246,8]]},"1198":{"position":[[1926,7]]},"1206":{"position":[[353,10]]}},"keywords":{}}],["streamhero(head",{"_index":5136,"title":{},"content":{"886":{"position":[[3567,19]]}},"keywords":{}}],["streamhuman",{"_index":5078,"title":{},"content":{"885":{"position":[[505,12]]}},"keywords":{}}],["streamhuman(head",{"_index":5089,"title":{},"content":{"885":{"position":[[1348,20]]}},"keywords":{}}],["streamlin",{"_index":986,"title":{},"content":{"80":{"position":[[117,12]]},"89":{"position":[[193,12]]},"112":{"position":[[193,11]]},"161":{"position":[[325,11]]},"279":{"position":[[429,11]]},"283":{"position":[[83,10]]},"362":{"position":[[963,11]]},"369":{"position":[[896,11]]},"387":{"position":[[382,10]]},"485":{"position":[[82,12]]},"521":{"position":[[510,11]]},"802":{"position":[[692,11]]}},"keywords":{}}],["streamnam",{"_index":4927,"title":{},"content":{"866":{"position":[[571,11]]}},"keywords":{}}],["streamquerybuild",{"_index":5139,"title":{},"content":{"886":{"position":[[4205,19]]}},"keywords":{}}],["streamsconflict",{"_index":4934,"title":{},"content":{"870":{"position":[[152,15]]}},"keywords":{}}],["strength",{"_index":799,"title":{},"content":{"52":{"position":[[285,9],[582,9]]},"133":{"position":[[16,9]]},"162":{"position":[[688,9]]},"182":{"position":[[16,9]]},"190":{"position":[[16,9]]},"207":{"position":[[20,9]]},"269":{"position":[[46,9]]},"383":{"position":[[24,9]]},"441":{"position":[[548,9]]},"444":{"position":[[403,9]]},"539":{"position":[[285,9],[582,9]]},"599":{"position":[[312,9],[609,9]]}},"keywords":{}}],["stress",{"_index":3111,"title":{},"content":{"477":{"position":[[227,6]]}},"keywords":{}}],["strict",{"_index":2022,"title":{},"content":{"354":{"position":[[582,6]]},"408":{"position":[[1158,7]]},"841":{"position":[[1281,6]]},"1085":{"position":[[2644,6]]}},"keywords":{}}],["stricter",{"_index":1752,"title":{},"content":{"299":{"position":[[639,9]]},"300":{"position":[[729,8]]}},"keywords":{}}],["strictli",{"_index":2665,"title":{},"content":{"412":{"position":[[1583,8]]}},"keywords":{}}],["string",{"_index":773,"title":{},"content":{"51":{"position":[[415,9],[457,8],[484,8]]},"188":{"position":[[1292,9],[1334,9],[1377,9]]},"209":{"position":[[497,9],[540,8]]},"211":{"position":[[459,9],[504,8]]},"255":{"position":[[841,9],[884,8]]},"259":{"position":[[141,9],[183,8]]},"314":{"position":[[807,8],[836,8]]},"315":{"position":[[783,8],[809,8]]},"316":{"position":[[292,8],[321,8],[352,9]]},"334":{"position":[[693,8],[719,8]]},"367":{"position":[[836,9],[927,9],[1001,9]]},"392":{"position":[[643,9],[684,8],[1609,9],[1679,8],[4078,8]]},"397":{"position":[[199,7],[494,9],[1567,6]]},"412":{"position":[[4955,7]]},"424":{"position":[[221,8]]},"439":{"position":[[624,8]]},"451":{"position":[[484,6]]},"457":{"position":[[156,7],[447,7],[520,6]]},"459":{"position":[[1083,7]]},"460":{"position":[[610,7]]},"480":{"position":[[607,8],[634,8]]},"482":{"position":[[907,8],[939,8]]},"538":{"position":[[716,9],[758,8],[785,8]]},"554":{"position":[[1398,9],[1447,8],[1480,8]]},"560":{"position":[[47,6]]},"562":{"position":[[379,8],[405,8],[432,8]]},"564":{"position":[[836,8],[868,8]]},"566":{"position":[[76,8]]},"579":{"position":[[701,8],[727,8]]},"598":{"position":[[723,9],[765,8],[792,8]]},"632":{"position":[[1591,9],[1634,8]]},"638":{"position":[[675,9],[724,8]]},"639":{"position":[[453,9],[498,8]]},"662":{"position":[[2454,9],[2496,8]]},"680":{"position":[[883,9]]},"696":{"position":[[669,7]]},"717":{"position":[[1492,9],[1536,8]]},"724":{"position":[[814,7],[863,6]]},"734":{"position":[[757,9]]},"746":{"position":[[390,8]]},"749":{"position":[[30,6],[2984,7],[3868,6],[4047,7],[7353,7],[7403,7],[8174,6],[13796,6],[17092,6],[17203,7],[18256,6],[18629,7],[18650,7],[18754,7],[20142,6],[21512,8],[23863,6]]},"751":{"position":[[685,6],[928,6],[1195,8],[1787,6]]},"808":{"position":[[236,8],[312,8],[350,6],[471,6],[608,8],[675,8]]},"812":{"position":[[131,8],[199,9]]},"813":{"position":[[131,8],[198,8]]},"838":{"position":[[2668,9],[2710,8]]},"862":{"position":[[723,9],[765,8]]},"872":{"position":[[631,6],[1948,9],[1995,8],[2025,8],[4178,9],[4225,8],[4255,8]]},"875":{"position":[[1676,6]]},"885":{"position":[[553,8],[572,8],[648,8],[667,8],[738,8],[1317,8]]},"898":{"position":[[233,7],[2528,9],[2575,8],[2605,8]]},"904":{"position":[[930,9],[973,8],[1045,9],[2055,6]]},"917":{"position":[[187,8],[325,8]]},"918":{"position":[[52,6]]},"924":{"position":[[11,6]]},"925":{"position":[[13,6]]},"927":{"position":[[37,7]]},"932":{"position":[[59,7]]},"961":{"position":[[24,6]]},"963":{"position":[[139,6]]},"968":{"position":[[255,6],[309,7],[439,7]]},"1018":{"position":[[765,6],[930,6],[948,6]]},"1022":{"position":[[207,6],[227,6]]},"1065":{"position":[[514,6]]},"1074":{"position":[[199,6]]},"1077":{"position":[[175,7]]},"1078":{"position":[[300,6],[536,9],[632,8],[662,8]]},"1079":{"position":[[128,7],[364,6]]},"1080":{"position":[[159,9],[255,9],[289,6],[376,8],[437,8]]},"1082":{"position":[[244,9],[340,8],[370,8]]},"1083":{"position":[[444,9],[540,8],[570,8]]},"1085":{"position":[[350,6],[546,6]]},"1100":{"position":[[455,6]]},"1103":{"position":[[68,7]]},"1149":{"position":[[1121,9],[1163,8]]},"1158":{"position":[[431,8],[458,8]]},"1171":{"position":[[429,7]]},"1189":{"position":[[260,7],[498,6],[570,7]]},"1208":{"position":[[304,7],[1296,7]]},"1213":{"position":[[66,7],[145,7],[294,7]]},"1250":{"position":[[84,6]]},"1251":{"position":[[8,6]]},"1252":{"position":[[280,7]]},"1281":{"position":[[293,6]]},"1282":{"position":[[221,6]]},"1290":{"position":[[106,9]]},"1291":{"position":[[114,7]]},"1296":{"position":[[685,6],[732,8],[1521,6]]},"1305":{"position":[[525,7],[845,7]]},"1311":{"position":[[467,8],[498,8],[528,8],[705,7]]},"1321":{"position":[[326,7]]}},"keywords":{}}],["string','nul",{"_index":4676,"title":{},"content":{"808":{"position":[[360,17]]}},"keywords":{}}],["string,nul",{"_index":4359,"title":{},"content":{"749":{"position":[[17211,13]]}},"keywords":{}}],["string.fromcharcode(65535",{"_index":6435,"title":{},"content":{"1294":{"position":[[1403,26]]}},"keywords":{}}],["string/number/boolean",{"_index":5209,"title":{},"content":{"898":{"position":[[1776,24]]}},"keywords":{}}],["string/number/integ",{"_index":4393,"title":{},"content":{"749":{"position":[[19931,21]]}},"keywords":{}}],["stringent",{"_index":5281,"title":{},"content":{"912":{"position":[[702,9]]}},"keywords":{}}],["stringifi",{"_index":2884,"title":{},"content":{"427":{"position":[[698,12]]},"462":{"position":[[761,11]]},"559":{"position":[[1196,11]]},"749":{"position":[[3062,11]]}},"keywords":{}}],["strings.mango",{"_index":5792,"title":{},"content":{"1071":{"position":[[207,13]]}},"keywords":{}}],["strings.queri",{"_index":5793,"title":{},"content":{"1071":{"position":[[294,15]]}},"keywords":{}}],["string|blob",{"_index":5289,"title":{},"content":{"917":{"position":[[266,13]]}},"keywords":{}}],["strip",{"_index":2480,"title":{},"content":{"402":{"position":[[234,5]]},"898":{"position":[[1970,6]]}},"keywords":{}}],["strong",{"_index":546,"title":{},"content":{"34":{"position":[[684,6]]},"47":{"position":[[585,6]]},"320":{"position":[[138,6]]},"412":{"position":[[6403,6]]},"1125":{"position":[[387,8],[461,9]]}},"keywords":{}}],["strongli",{"_index":2011,"title":{},"content":{"353":{"position":[[539,8]]},"1123":{"position":[[13,8]]}},"keywords":{}}],["structur",{"_index":695,"title":{},"content":{"45":{"position":[[85,10]]},"47":{"position":[[626,10]]},"57":{"position":[[290,10]]},"64":{"position":[[56,10]]},"73":{"position":[[118,9]]},"117":{"position":[[68,10]]},"126":{"position":[[248,9]]},"174":{"position":[[2279,11]]},"178":{"position":[[200,11]]},"231":{"position":[[72,10]]},"276":{"position":[[238,10]]},"281":{"position":[[242,10]]},"282":{"position":[[235,9],[385,9]]},"321":{"position":[[254,10]]},"351":{"position":[[181,11]]},"352":{"position":[[313,11]]},"354":{"position":[[376,10]]},"361":{"position":[[203,9]]},"364":{"position":[[546,11]]},"369":{"position":[[393,11]]},"382":{"position":[[92,11]]},"392":{"position":[[1253,11]]},"395":{"position":[[314,11]]},"396":{"position":[[364,9]]},"408":{"position":[[438,10],[2106,10]]},"426":{"position":[[210,10]]},"427":{"position":[[412,10],[570,10]]},"430":{"position":[[1049,10]]},"441":{"position":[[350,11]]},"446":{"position":[[917,11]]},"452":{"position":[[136,10]]},"495":{"position":[[706,9]]},"533":{"position":[[65,10]]},"559":{"position":[[1626,10]]},"593":{"position":[[65,10]]},"612":{"position":[[1017,10]]},"636":{"position":[[392,9]]},"749":{"position":[[11926,10]]},"772":{"position":[[2230,10]]},"800":{"position":[[511,9]]},"836":{"position":[[2129,9]]},"841":{"position":[[1364,10]]},"865":{"position":[[105,10]]},"936":{"position":[[60,11]]},"1085":{"position":[[1099,9]]},"1132":{"position":[[434,10],[1494,10]]}},"keywords":{}}],["struggl",{"_index":2735,"title":{},"content":{"412":{"position":[[9398,8]]}},"keywords":{}}],["stuck",{"_index":2893,"title":{},"content":{"427":{"position":[[1431,5]]},"1031":{"position":[[239,5]]}},"keywords":{}}],["stuff",{"_index":1251,"title":{},"content":{"188":{"position":[[866,5]]},"451":{"position":[[618,6]]},"460":{"position":[[920,5]]},"463":{"position":[[148,6]]},"699":{"position":[[18,5]]},"705":{"position":[[978,5]]},"785":{"position":[[122,5]]},"829":{"position":[[797,5]]},"1027":{"position":[[77,6]]}},"keywords":{}}],["stun",{"_index":3625,"title":{},"content":{"614":{"position":[[470,5]]}},"keywords":{}}],["stutter",{"_index":3720,"title":{},"content":{"642":{"position":[[289,10]]}},"keywords":{}}],["style",{"_index":3898,"title":{},"content":{"689":{"position":[[293,5]]},"841":{"position":[[561,5]]},"902":{"position":[[932,5]]}},"keywords":{}}],["style="color",{"_index":6183,"title":{},"content":{"1202":{"position":[[102,18]]}},"keywords":{}}],["sub",{"_index":1987,"title":{},"content":{"350":{"position":[[86,3]]},"496":{"position":[[345,3]]},"562":{"position":[[1292,3]]},"749":{"position":[[22030,3],[22386,3]]},"979":{"position":[[224,3]]},"1085":{"position":[[1112,3]]},"1215":{"position":[[407,3]]}},"keywords":{}}],["sub.unsubscrib",{"_index":3431,"title":{},"content":{"562":{"position":[[1376,18]]},"979":{"position":[[394,18]]}},"keywords":{}}],["sub1.yoursite.com",{"_index":1849,"title":{},"content":{"303":{"position":[[1183,17]]}},"keywords":{}}],["sub2.yoursite.com",{"_index":1851,"title":{},"content":{"303":{"position":[[1225,18]]}},"keywords":{}}],["subdirectori",{"_index":6198,"title":{},"content":{"1208":{"position":[[767,13]]}},"keywords":{}}],["subdomain",{"_index":1844,"title":{},"content":{"303":{"position":[[1025,10]]},"450":{"position":[[297,11]]},"849":{"position":[[536,10]]}},"keywords":{}}],["subfield",{"_index":3418,"title":{},"content":{"560":{"position":[[418,9]]}},"keywords":{}}],["subject",{"_index":4928,"title":{},"content":{"866":{"position":[[621,7],[744,7]]},"875":{"position":[[4325,7],[4427,10],[8048,7],[8097,10],[9467,7],[9516,10]]},"1218":{"position":[[491,10],[839,10]]}},"keywords":{}}],["subject<rxreplicationpullstreamitem<ani",{"_index":5474,"title":{},"content":{"988":{"position":[[5089,46]]}},"keywords":{}}],["subjectprefix",{"_index":4930,"title":{},"content":{"866":{"position":[[770,14]]}},"keywords":{}}],["submit",{"_index":3160,"title":{},"content":{"489":{"position":[[397,10]]}},"keywords":{}}],["suboptim",{"_index":959,"title":{},"content":{"69":{"position":[[149,10]]},"101":{"position":[[73,10]]},"435":{"position":[[316,10]]}},"keywords":{}}],["subresult",{"_index":6441,"title":{},"content":{"1294":{"position":[[1600,10]]}},"keywords":{}}],["subresult.length",{"_index":6445,"title":{},"content":{"1294":{"position":[[1682,17]]}},"keywords":{}}],["subscrib",{"_index":538,"title":{},"content":{"34":{"position":[[450,9],[604,9]]},"47":{"position":[[788,9]]},"53":{"position":[[46,9]]},"121":{"position":[[191,9]]},"130":{"position":[[63,9]]},"136":{"position":[[198,9]]},"140":{"position":[[111,11]]},"143":{"position":[[140,9],[328,11]]},"159":{"position":[[148,9]]},"182":{"position":[[246,9]]},"185":{"position":[[221,11]]},"188":{"position":[[3201,9]]},"252":{"position":[[314,9]]},"323":{"position":[[449,11]]},"326":{"position":[[152,9]]},"329":{"position":[[147,9]]},"335":{"position":[[221,11]]},"346":{"position":[[262,9],[421,9]]},"360":{"position":[[302,9]]},"379":{"position":[[62,9]]},"411":{"position":[[2792,9],[2989,10]]},"458":{"position":[[1534,9]]},"493":{"position":[[127,9],[325,10]]},"515":{"position":[[243,11]]},"529":{"position":[[28,9]]},"541":{"position":[[138,10],[755,10]]},"562":{"position":[[786,9],[907,9]]},"571":{"position":[[755,9],[1268,9]]},"575":{"position":[[273,10]]},"580":{"position":[[118,9],[463,9]]},"600":{"position":[[88,11]]},"601":{"position":[[43,10],[602,9],[736,10]]},"662":{"position":[[120,9]]},"710":{"position":[[193,9]]},"781":{"position":[[763,9]]},"799":{"position":[[138,11]]},"816":{"position":[[176,11]]},"829":{"position":[[2163,9]]},"838":{"position":[[149,9]]},"846":{"position":[[1406,9]]},"890":{"position":[[102,9]]},"898":{"position":[[1431,9]]},"1058":{"position":[[487,13]]},"1117":{"position":[[406,9]]},"1150":{"position":[[387,11]]}},"keywords":{}}],["subscribe((hero",{"_index":1944,"title":{},"content":{"335":{"position":[[292,19]]}},"keywords":{}}],["subscribe((newhero",{"_index":3498,"title":{},"content":{"580":{"position":[[651,22]]}},"keywords":{}}],["subscribe(alivehero",{"_index":3228,"title":{},"content":{"502":{"position":[[1071,22]]},"518":{"position":[[538,22]]},"571":{"position":[[1007,22]]}},"keywords":{}}],["subscribe(alltask",{"_index":3705,"title":{},"content":{"632":{"position":[[1801,19]]}},"keywords":{}}],["subscribe(currentrxdocu",{"_index":5708,"title":{},"content":{"1046":{"position":[[133,28]]}},"keywords":{}}],["subscribe(doc",{"_index":1135,"title":{},"content":{"143":{"position":[[493,17]]}},"keywords":{}}],["subscribe(newnam",{"_index":5674,"title":{},"content":{"1039":{"position":[[220,18],[394,18]]}},"keywords":{}}],["subscribe(result",{"_index":3819,"title":{},"content":{"662":{"position":[[2824,21]]},"710":{"position":[[2131,21]]},"838":{"position":[[3038,21]]}},"keywords":{}}],["subscribe(undonetask",{"_index":3125,"title":{},"content":{"480":{"position":[[831,22]]}},"keywords":{}}],["subscript",{"_index":360,"title":{"143":{"position":[[19,13]]}},"content":{"21":{"position":[[129,12]]},"38":{"position":[[537,13]]},"130":{"position":[[103,12]]},"143":{"position":[[215,12]]},"346":{"position":[[332,14],[361,13]]},"411":{"position":[[2322,15]]},"412":{"position":[[2881,12]]},"490":{"position":[[187,12]]},"541":{"position":[[385,12]]},"542":{"position":[[1026,13]]},"562":{"position":[[1407,12]]},"563":{"position":[[1044,13]]},"590":{"position":[[334,13],[382,12],[407,14],[491,14],[515,13]]},"649":{"position":[[242,12]]},"781":{"position":[[713,13]]},"816":{"position":[[258,13]]},"828":{"position":[[458,14]]},"829":{"position":[[3704,13]]},"860":{"position":[[600,13]]},"863":{"position":[[286,13]]},"875":{"position":[[7387,12]]},"885":{"position":[[485,12],[1256,13],[1333,12]]},"886":{"position":[[3523,13],[4405,12]]},"1017":{"position":[[97,12]]},"1058":{"position":[[392,12]]},"1117":{"position":[[495,12]]}},"keywords":{}}],["subscription.unsubscrib",{"_index":3311,"title":{},"content":{"541":{"position":[[478,27]]},"875":{"position":[[7521,28]]}},"keywords":{}}],["subselect",{"_index":5795,"title":{},"content":{"1072":{"position":[[344,12]]}},"keywords":{}}],["subsequ",{"_index":3110,"title":{},"content":{"477":{"position":[[187,10]]},"495":{"position":[[365,10]]},"723":{"position":[[1741,10]]},"1297":{"position":[[359,10]]}},"keywords":{}}],["subset",{"_index":2717,"title":{},"content":{"412":{"position":[[7083,6]]},"555":{"position":[[911,6]]},"643":{"position":[[212,7]]},"858":{"position":[[36,6]]},"984":{"position":[[160,6]]},"1009":{"position":[[160,7]]},"1296":{"position":[[133,6]]}},"keywords":{}}],["substanti",{"_index":1672,"title":{},"content":{"287":{"position":[[856,11]]},"430":{"position":[[658,11]]},"508":{"position":[[151,11]]},"1151":{"position":[[402,11]]},"1178":{"position":[[401,11]]}},"keywords":{}}],["succe",{"_index":610,"title":{},"content":{"38":{"position":[[1123,7]]},"1305":{"position":[[965,8]]}},"keywords":{}}],["success",{"_index":3196,"title":{},"content":{"496":{"position":[[710,10]]},"497":{"position":[[105,7],[519,7]]},"944":{"position":[[150,7],[310,8]]},"945":{"position":[[91,7],[205,8]]},"947":{"position":[[137,7],[281,8]]},"994":{"position":[[117,10]]}},"keywords":{}}],["successfulli",{"_index":3683,"title":{},"content":{"626":{"position":[[515,12]]},"1297":{"position":[[250,12]]}},"keywords":{}}],["successor",{"_index":221,"title":{},"content":{"14":{"position":[[636,9]]}},"keywords":{}}],["such",{"_index":551,"title":{},"content":{"35":{"position":[[155,4]]},"51":{"position":[[977,4]]},"66":{"position":[[24,4]]},"94":{"position":[[92,4]]},"98":{"position":[[22,4]]},"113":{"position":[[214,4]]},"134":{"position":[[158,4]]},"140":{"position":[[208,4]]},"146":{"position":[[63,4]]},"155":{"position":[[191,4]]},"165":{"position":[[191,4]]},"172":{"position":[[170,4]]},"173":{"position":[[1936,4]]},"174":{"position":[[3038,4]]},"179":{"position":[[114,4]]},"186":{"position":[[103,4]]},"192":{"position":[[181,4]]},"196":{"position":[[162,4]]},"202":{"position":[[256,4]]},"218":{"position":[[119,4]]},"222":{"position":[[109,4]]},"227":{"position":[[352,4]]},"236":{"position":[[178,4]]},"266":{"position":[[95,4]]},"300":{"position":[[676,4]]},"303":{"position":[[168,4]]},"350":{"position":[[143,4]]},"354":{"position":[[496,4]]},"362":{"position":[[933,4]]},"375":{"position":[[159,4],[448,4]]},"377":{"position":[[73,4]]},"381":{"position":[[119,4]]},"382":{"position":[[169,4]]},"390":{"position":[[215,4]]},"392":{"position":[[1265,4]]},"393":{"position":[[205,4]]},"396":{"position":[[1669,4]]},"400":{"position":[[648,4]]},"408":{"position":[[700,4]]},"418":{"position":[[110,4],[383,4]]},"420":{"position":[[1234,4]]},"432":{"position":[[1116,4]]},"444":{"position":[[445,4]]},"446":{"position":[[503,4]]},"450":{"position":[[586,4]]},"520":{"position":[[186,4]]},"525":{"position":[[559,4]]},"529":{"position":[[213,4]]},"550":{"position":[[196,4]]},"551":{"position":[[132,4]]},"569":{"position":[[801,4]]},"613":{"position":[[208,4],[437,4]]},"618":{"position":[[120,4]]},"620":{"position":[[139,4]]},"624":{"position":[[549,4]]},"627":{"position":[[234,4]]},"686":{"position":[[901,4]]},"802":{"position":[[357,4]]},"831":{"position":[[101,4]]},"1282":{"position":[[517,4]]}},"keywords":{}}],["suddenli",{"_index":2849,"title":{},"content":{"421":{"position":[[321,8]]}},"keywords":{}}],["sudoletmein",{"_index":3348,"title":{},"content":{"554":{"position":[[1143,13]]},"717":{"position":[[1231,13]]}},"keywords":{}}],["suffer",{"_index":2441,"title":{},"content":{"400":{"position":[[365,7]]},"622":{"position":[[93,6]]}},"keywords":{}}],["suffic",{"_index":3481,"title":{},"content":{"574":{"position":[[694,7]]}},"keywords":{}}],["suffici",{"_index":6008,"title":{},"content":{"1120":{"position":[[478,11]]},"1300":{"position":[[961,10]]}},"keywords":{}}],["suffix",{"_index":4685,"title":{},"content":{"811":{"position":[[107,6]]},"1085":{"position":[[3713,6]]},"1117":{"position":[[257,8]]}},"keywords":{}}],["suggest",{"_index":1294,"title":{},"content":{"189":{"position":[[492,9]]},"299":{"position":[[1579,7]]},"390":{"position":[[1420,8]]},"444":{"position":[[771,9]]}},"keywords":{}}],["suit",{"_index":21,"title":{},"content":{"1":{"position":[[312,5]]},"34":{"position":[[271,6]]},"73":{"position":[[46,6]]},"126":{"position":[[297,6]]},"131":{"position":[[948,5]]},"162":{"position":[[705,6]]},"225":{"position":[[155,6]]},"254":{"position":[[438,6]]},"262":{"position":[[371,4]]},"266":{"position":[[408,5]]},"267":{"position":[[34,6]]},"281":{"position":[[184,6]]},"285":{"position":[[257,4]]},"288":{"position":[[214,5]]},"325":{"position":[[209,6]]},"418":{"position":[[270,6]]},"436":{"position":[[374,4]]},"489":{"position":[[296,4]]},"524":{"position":[[138,5]]},"688":{"position":[[985,6]]},"829":{"position":[[2863,6]]},"906":{"position":[[708,4]]},"1147":{"position":[[401,5]]},"1159":{"position":[[200,7]]},"1245":{"position":[[37,6]]},"1271":{"position":[[316,6]]}},"keywords":{}}],["suitabl",{"_index":232,"title":{"624":{"position":[[29,12]]}},"content":{"14":{"position":[[893,8]]},"47":{"position":[[325,8]]},"63":{"position":[[200,8]]},"287":{"position":[[578,8]]},"336":{"position":[[209,8]]},"365":{"position":[[380,8],[545,8],[1411,8]]},"393":{"position":[[400,8]]},"430":{"position":[[54,8]]},"446":{"position":[[833,8]]},"451":{"position":[[300,8]]},"524":{"position":[[455,8]]},"528":{"position":[[157,8]]},"533":{"position":[[280,8]]},"593":{"position":[[280,8]]},"623":{"position":[[566,8]]},"624":{"position":[[109,12]]},"640":{"position":[[436,8]]},"659":{"position":[[944,8]]},"711":{"position":[[2227,8]]},"835":{"position":[[1008,8]]},"1198":{"position":[[378,8]]},"1284":{"position":[[406,8]]}},"keywords":{}}],["sum",{"_index":6293,"title":{},"content":{"1250":{"position":[[469,5]]}},"keywords":{}}],["sum(column_nam",{"_index":6292,"title":{},"content":{"1250":{"position":[[103,19]]}},"keywords":{}}],["summar",{"_index":1736,"title":{},"content":{"299":{"position":[[131,10]]}},"keywords":{}}],["summari",{"_index":935,"title":{"83":{"position":[[0,8]]},"841":{"position":[[0,8]]}},"content":{"65":{"position":[[1803,8]]},"412":{"position":[[14919,8]]},"432":{"position":[[1277,7]]}},"keywords":{}}],["supabas",{"_index":362,"title":{"22":{"position":[[0,9]]},"895":{"position":[[0,8]]},"896":{"position":[[25,8]]},"898":{"position":[[18,8]]}},"content":{"22":{"position":[[3,8],[303,8]]},"392":{"position":[[827,8]]},"705":{"position":[[1227,9]]},"793":{"position":[[802,8]]},"896":{"position":[[91,8],[136,8],[235,8]]},"897":{"position":[[10,8],[68,8],[297,8],[367,8]]},"898":{"position":[[75,8],[113,8],[465,9],[1660,8],[2715,8],[2746,8],[3041,8],[3176,8],[3291,10],[3371,9],[3435,10],[4228,8]]},"899":{"position":[[336,8]]},"1284":{"position":[[206,8]]}},"keywords":{}}],["supabase.rxdb",{"_index":6381,"title":{},"content":{"1284":{"position":[[240,13]]}},"keywords":{}}],["supabase/gt",{"_index":2450,"title":{},"content":{"401":{"position":[[230,12]]}},"keywords":{}}],["supabase/supabas",{"_index":5186,"title":{},"content":{"896":{"position":[[347,18]]},"898":{"position":[[42,18],[3003,19]]}},"keywords":{}}],["supabase_realtim",{"_index":5208,"title":{},"content":{"898":{"position":[[1470,17]]}},"keywords":{}}],["superhuman",{"_index":798,"title":{},"content":{"52":{"position":[[273,11]]},"539":{"position":[[273,11]]},"599":{"position":[[300,11]]}},"keywords":{}}],["superior",{"_index":1645,"title":{},"content":{"278":{"position":[[223,8]]},"354":{"position":[[1563,9]]}},"keywords":{}}],["superset",{"_index":1654,"title":{},"content":{"281":{"position":[[23,8]]}},"keywords":{}}],["support",{"_index":297,"title":{"74":{"position":[[28,7]]},"80":{"position":[[19,8]]},"105":{"position":[[28,7]]},"109":{"position":[[19,8]]},"125":{"position":[[10,8]]},"160":{"position":[[10,8]]},"232":{"position":[[18,7]]},"237":{"position":[[19,8]]},"253":{"position":[[22,8]]},"281":{"position":[[28,8]]},"330":{"position":[[10,8]]},"380":{"position":[[14,8]]},"458":{"position":[[10,8]]},"459":{"position":[[9,8]]},"460":{"position":[[10,8]]},"519":{"position":[[10,8]]},"589":{"position":[[10,8]]},"989":{"position":[[10,8]]},"1174":{"position":[[10,8]]},"1183":{"position":[[10,8]]},"1251":{"position":[[11,8]]},"1301":{"position":[[21,8]]},"1322":{"position":[[11,8]]}},"content":{"17":{"position":[[505,7]]},"19":{"position":[[502,7]]},"21":{"position":[[174,7]]},"28":{"position":[[646,9]]},"33":{"position":[[268,7],[328,7],[533,8]]},"36":{"position":[[78,7]]},"39":{"position":[[80,8],[618,8]]},"43":{"position":[[210,8]]},"45":{"position":[[210,8]]},"47":{"position":[[564,8],[1002,7],[1091,7]]},"51":{"position":[[6,8]]},"55":{"position":[[59,8]]},"57":{"position":[[49,9],[189,8]]},"59":{"position":[[155,8]]},"74":{"position":[[31,8]]},"77":{"position":[[8,7]]},"79":{"position":[[24,7]]},"80":{"position":[[38,8]]},"83":{"position":[[141,8]]},"105":{"position":[[121,8]]},"109":{"position":[[15,8]]},"120":{"position":[[318,8]]},"123":{"position":[[24,7]]},"124":{"position":[[48,7]]},"125":{"position":[[30,7]]},"131":{"position":[[6,8],[225,8]]},"132":{"position":[[138,7]]},"135":{"position":[[6,8]]},"139":{"position":[[24,7]]},"141":{"position":[[63,8]]},"144":{"position":[[6,8]]},"160":{"position":[[23,8]]},"162":{"position":[[329,9]]},"174":{"position":[[609,7],[715,7],[792,8],[1791,8],[1833,8]]},"195":{"position":[[43,8]]},"210":{"position":[[50,8]]},"222":{"position":[[200,7]]},"232":{"position":[[115,8],[324,8]]},"235":{"position":[[6,8]]},"237":{"position":[[32,8]]},"241":{"position":[[343,8]]},"254":{"position":[[372,9]]},"261":{"position":[[57,8]]},"263":{"position":[[163,8]]},"280":{"position":[[138,10]]},"287":{"position":[[624,9]]},"289":{"position":[[1404,7]]},"303":{"position":[[299,8]]},"312":{"position":[[48,8]]},"318":{"position":[[24,8]]},"320":{"position":[[155,8]]},"323":{"position":[[524,8]]},"328":{"position":[[6,8]]},"334":{"position":[[497,7]]},"336":{"position":[[6,8],[312,9]]},"343":{"position":[[6,8]]},"354":{"position":[[1208,8]]},"356":{"position":[[108,7]]},"357":{"position":[[340,7]]},"364":{"position":[[233,9]]},"365":{"position":[[1538,8]]},"367":{"position":[[447,8]]},"368":{"position":[[105,8]]},"373":{"position":[[343,8]]},"377":{"position":[[167,7]]},"381":{"position":[[66,8]]},"384":{"position":[[61,8]]},"386":{"position":[[301,8]]},"387":{"position":[[236,8]]},"400":{"position":[[326,8]]},"404":{"position":[[137,9],[280,8]]},"408":{"position":[[1064,8]]},"412":{"position":[[2596,7],[2766,7],[13570,7]]},"419":{"position":[[620,7],[1444,10]]},"422":{"position":[[122,7]]},"426":{"position":[[74,8]]},"432":{"position":[[415,7]]},"437":{"position":[[135,8],[178,7]]},"439":{"position":[[49,7]]},"440":{"position":[[209,7],[468,7]]},"445":{"position":[[2147,8]]},"452":{"position":[[262,7]]},"455":{"position":[[760,9]]},"457":{"position":[[573,7]]},"458":{"position":[[487,7]]},"459":{"position":[[264,7]]},"462":{"position":[[933,7]]},"470":{"position":[[543,7]]},"498":{"position":[[398,7]]},"502":{"position":[[1138,8]]},"504":{"position":[[1305,8]]},"515":{"position":[[40,7]]},"519":{"position":[[132,8]]},"525":{"position":[[515,7]]},"526":{"position":[[88,8]]},"530":{"position":[[394,8]]},"533":{"position":[[240,8]]},"535":{"position":[[557,8],[591,7],[1183,8]]},"542":{"position":[[11,8]]},"546":{"position":[[188,8]]},"551":{"position":[[14,8]]},"556":{"position":[[650,8]]},"563":{"position":[[143,8]]},"566":{"position":[[1241,9],[1264,9],[1356,8]]},"575":{"position":[[540,8]]},"579":{"position":[[506,7]]},"581":{"position":[[6,8]]},"586":{"position":[[55,8]]},"593":{"position":[[240,8]]},"595":{"position":[[584,8],[618,7],[1260,8]]},"606":{"position":[[188,8]]},"613":{"position":[[707,10],[800,7],[934,10]]},"614":{"position":[[287,8]]},"616":{"position":[[561,7]]},"622":{"position":[[579,7]]},"624":{"position":[[719,7],[932,9],[1159,8],[1217,7],[1556,7]]},"631":{"position":[[110,8]]},"634":{"position":[[57,8]]},"638":{"position":[[142,8]]},"640":{"position":[[214,7]]},"641":{"position":[[320,10]]},"659":{"position":[[898,9]]},"689":{"position":[[278,9]]},"709":{"position":[[402,8]]},"723":{"position":[[2069,7],[2420,7],[2529,8]]},"728":{"position":[[91,7]]},"730":{"position":[[263,10]]},"749":{"position":[[23251,7]]},"763":{"position":[[6,8]]},"824":{"position":[[491,7]]},"831":{"position":[[62,8]]},"835":{"position":[[969,9]]},"838":{"position":[[602,7],[801,8],[850,8]]},"840":{"position":[[278,7]]},"845":{"position":[[10,7]]},"863":{"position":[[278,7]]},"870":{"position":[[71,7],[232,7]]},"871":{"position":[[742,9]]},"882":{"position":[[157,7]]},"911":{"position":[[27,7],[130,8]]},"917":{"position":[[421,7],[502,8]]},"932":{"position":[[648,9]]},"962":{"position":[[308,9]]},"968":{"position":[[148,9]]},"981":{"position":[[1197,8],[1280,8],[1503,8]]},"1004":{"position":[[27,9],[105,7]]},"1072":{"position":[[86,7],[626,7],[1190,7],[1627,7],[1758,7],[2057,7]]},"1079":{"position":[[6,8]]},"1088":{"position":[[179,7]]},"1112":{"position":[[526,9]]},"1123":{"position":[[506,8]]},"1124":{"position":[[609,8],[744,8]]},"1132":{"position":[[589,8],[1351,8]]},"1141":{"position":[[242,7]]},"1143":{"position":[[448,8],[610,7]]},"1151":{"position":[[705,8]]},"1162":{"position":[[13,7],[762,7]]},"1165":{"position":[[43,7]]},"1171":{"position":[[13,7]]},"1178":{"position":[[704,8]]},"1181":{"position":[[13,7]]},"1188":{"position":[[178,10]]},"1207":{"position":[[67,9],[169,9],[205,8]]},"1211":{"position":[[259,7],[373,9]]},"1214":{"position":[[136,7]]},"1271":{"position":[[208,7],[397,8],[698,8]]},"1282":{"position":[[1003,7]]},"1288":{"position":[[55,9]]},"1301":{"position":[[971,7]]},"1304":{"position":[[1201,7],[1526,7],[1665,7]]}},"keywords":{}}],["support.rxdb",{"_index":997,"title":{},"content":{"84":{"position":[[240,12]]},"114":{"position":[[253,12]]},"149":{"position":[[253,12]]},"175":{"position":[[246,12]]},"347":{"position":[[253,12]]},"362":{"position":[[1324,12]]},"511":{"position":[[253,12]]},"531":{"position":[[253,12]]},"591":{"position":[[253,12]]}},"keywords":{}}],["supporteddo",{"_index":6159,"title":{},"content":{"1188":{"position":[[116,14]]}},"keywords":{}}],["supportedrxattach",{"_index":6158,"title":{},"content":{"1188":{"position":[[75,22]]}},"keywords":{}}],["supportperform",{"_index":6243,"title":{},"content":{"1216":{"position":[[68,18]]}},"keywords":{}}],["suppos",{"_index":3173,"title":{},"content":{"493":{"position":[[64,7]]},"1006":{"position":[[1,7]]}},"keywords":{}}],["sure",{"_index":1089,"title":{},"content":{"129":{"position":[[456,4]]},"554":{"position":[[1165,4]]},"590":{"position":[[708,4]]},"627":{"position":[[263,4]]},"666":{"position":[[58,4],[251,4]]},"709":{"position":[[967,4]]},"737":{"position":[[89,4]]},"749":{"position":[[5648,4]]},"770":{"position":[[606,4]]},"795":{"position":[[59,4]]},"861":{"position":[[2319,4]]},"872":{"position":[[784,4]]},"884":{"position":[[46,4]]},"886":{"position":[[4706,4]]},"904":{"position":[[34,4]]},"917":{"position":[[457,4]]},"1083":{"position":[[39,4]]},"1097":{"position":[[475,4]]},"1107":{"position":[[1010,4]]},"1124":{"position":[[1115,4]]},"1126":{"position":[[80,4]]},"1164":{"position":[[1398,4]]},"1175":{"position":[[76,4]]},"1184":{"position":[[242,4]]},"1192":{"position":[[733,4]]},"1280":{"position":[[53,4]]}},"keywords":{}}],["surg",{"_index":3244,"title":{},"content":{"510":{"position":[[475,6]]}},"keywords":{}}],["surpass",{"_index":3413,"title":{},"content":{"559":{"position":[[1704,7]]}},"keywords":{}}],["surprisingli",{"_index":2898,"title":{},"content":{"429":{"position":[[79,12]]},"463":{"position":[[868,12]]},"467":{"position":[[400,12]]}},"keywords":{}}],["survey",{"_index":2945,"title":{},"content":{"446":{"position":[[167,6]]}},"keywords":{}}],["surviv",{"_index":2920,"title":{},"content":{"436":{"position":[[201,8]]},"473":{"position":[[113,9]]}},"keywords":{}}],["sustain",{"_index":2836,"title":{},"content":{"420":{"position":[[1017,7]]},"1151":{"position":[[466,15]]},"1178":{"position":[[465,15]]}},"keywords":{}}],["svelt",{"_index":259,"title":{},"content":{"15":{"position":[[338,7]]},"94":{"position":[[131,7]]},"173":{"position":[[2329,7]]},"222":{"position":[[148,7]]}},"keywords":{}}],["swagger",{"_index":2120,"title":{},"content":{"367":{"position":[[660,9]]},"784":{"position":[[122,7]]}},"keywords":{}}],["swap",{"_index":1580,"title":{},"content":{"255":{"position":[[1614,8]]},"369":{"position":[[1346,4]]},"383":{"position":[[325,4]]},"556":{"position":[[1990,8]]},"846":{"position":[[514,7]]},"988":{"position":[[3097,4]]},"1124":{"position":[[185,4],[367,4]]},"1198":{"position":[[1221,4]]}},"keywords":{}}],["swappabl",{"_index":1335,"title":{},"content":{"207":{"position":[[227,9]]},"254":{"position":[[244,9]]},"535":{"position":[[1255,9]]},"595":{"position":[[1308,9]]},"640":{"position":[[25,10]]},"1124":{"position":[[141,9]]}},"keywords":{}}],["swift",{"_index":680,"title":{},"content":{"43":{"position":[[520,5]]},"70":{"position":[[196,5]]},"283":{"position":[[120,5]]}},"keywords":{}}],["swiftli",{"_index":928,"title":{},"content":{"65":{"position":[[1462,8]]},"569":{"position":[[709,7]]},"571":{"position":[[1469,8],[1781,7]]}},"keywords":{}}],["switch",{"_index":397,"title":{},"content":{"24":{"position":[[129,6]]},"249":{"position":[[468,6]]},"314":{"position":[[171,6]]},"330":{"position":[[120,6]]},"402":{"position":[[2077,6]]},"420":{"position":[[651,9]]},"626":{"position":[[823,6],[1004,8]]},"710":{"position":[[2232,6]]},"875":{"position":[[8866,9]]},"887":{"position":[[196,6]]},"981":{"position":[[447,9]]},"984":{"position":[[657,6]]},"988":{"position":[[996,6],[4086,6]]},"1009":{"position":[[450,6]]},"1095":{"position":[[70,6]]},"1143":{"position":[[82,6]]},"1195":{"position":[[213,6]]}},"keywords":{}}],["symbol",{"_index":2819,"title":{},"content":{"419":{"position":[[1749,7]]},"1290":{"position":[[187,6]]},"1291":{"position":[[185,6]]}},"keywords":{}}],["symmetr",{"_index":4019,"title":{},"content":{"716":{"position":[[35,9]]}},"keywords":{}}],["sync",{"_index":315,"title":{"199":{"position":[[59,4]]},"208":{"position":[[11,7]]},"209":{"position":[[13,4]]},"246":{"position":[[42,4]]},"255":{"position":[[16,4]]},"260":{"position":[[0,5]]},"307":{"position":[[58,4]]},"312":{"position":[[13,4]]},"472":{"position":[[42,4]]},"481":{"position":[[12,4]]},"565":{"position":[[8,5]]},"629":{"position":[[42,5]]},"632":{"position":[[10,4]]},"774":{"position":[[29,6]]},"869":{"position":[[63,4]]},"872":{"position":[[39,5]]},"895":{"position":[[64,4]]},"898":{"position":[[27,5]]},"900":{"position":[[35,4]]},"902":{"position":[[16,4]]},"980":{"position":[[16,4]]},"981":{"position":[[24,4]]},"982":{"position":[[4,4]]},"983":{"position":[[4,4]]},"1006":{"position":[[8,4]]},"1008":{"position":[[6,4]]},"1009":{"position":[[8,4]]},"1147":{"position":[[0,4]]},"1148":{"position":[[19,5]]},"1160":{"position":[[7,6]]},"1165":{"position":[[42,6]]}},"content":{"18":{"position":[[440,4]]},"36":{"position":[[357,4]]},"38":{"position":[[29,4]]},"39":{"position":[[131,6],[363,5],[421,4]]},"41":{"position":[[94,7]]},"42":{"position":[[88,5],[348,4]]},"46":{"position":[[214,4]]},"47":{"position":[[1033,5]]},"57":{"position":[[73,4]]},"125":{"position":[[181,4]]},"130":{"position":[[307,4]]},"182":{"position":[[308,4]]},"201":{"position":[[355,7]]},"204":{"position":[[238,4]]},"206":{"position":[[311,4]]},"208":{"position":[[22,4]]},"245":{"position":[[27,4]]},"249":{"position":[[274,8]]},"251":{"position":[[187,7]]},"255":{"position":[[40,4],[315,4]]},"261":{"position":[[16,7],[169,4],[441,4],[964,4],[1090,4]]},"262":{"position":[[114,4],[292,4]]},"263":{"position":[[84,4],[575,4]]},"275":{"position":[[293,4]]},"288":{"position":[[348,5]]},"311":{"position":[[267,7]]},"312":{"position":[[116,4]]},"318":{"position":[[116,7],[677,4]]},"323":{"position":[[610,4]]},"328":{"position":[[187,5]]},"331":{"position":[[192,4]]},"338":{"position":[[173,5]]},"360":{"position":[[409,4],[440,4],[578,4]]},"375":{"position":[[256,4],[803,7]]},"407":{"position":[[234,4],[690,6]]},"408":{"position":[[5477,4]]},"410":{"position":[[1095,4],[1515,4],[2072,4]]},"411":{"position":[[126,5],[141,4],[725,4],[2507,4],[2937,4],[4716,4],[4952,8],[5010,8],[5072,4],[5238,5]]},"412":{"position":[[983,5],[1168,8],[1273,4],[1322,4],[1996,4],[2198,5],[2957,4],[3188,5],[5821,4],[5943,6],[6852,7],[7289,4],[7453,4],[8452,6],[9117,4],[9247,4],[10950,4],[11592,4],[12335,4],[12889,4],[12961,4],[13093,4],[13521,7],[14554,4]]},"414":{"position":[[192,4]]},"415":{"position":[[185,7]]},"419":{"position":[[1135,5]]},"420":{"position":[[690,7],[1582,6]]},"421":{"position":[[817,7]]},"439":{"position":[[455,4]]},"445":{"position":[[690,5]]},"480":{"position":[[151,5]]},"481":{"position":[[13,4],[394,5],[718,6],[840,4]]},"483":{"position":[[506,7]]},"486":{"position":[[333,6]]},"487":{"position":[[129,4],[197,7]]},"489":{"position":[[795,4]]},"491":{"position":[[86,4],[166,4]]},"495":{"position":[[166,7]]},"498":{"position":[[321,8]]},"559":{"position":[[1430,4]]},"561":{"position":[[82,4]]},"562":{"position":[[1736,5],[1761,4]]},"566":{"position":[[1055,4]]},"567":{"position":[[1200,8]]},"572":{"position":[[68,4]]},"574":{"position":[[308,4]]},"575":{"position":[[365,5]]},"626":{"position":[[611,4],[799,4],[926,5],[1065,4],[1156,4]]},"631":{"position":[[378,4]]},"632":{"position":[[2007,4],[2279,5]]},"644":{"position":[[103,7]]},"661":{"position":[[1745,4]]},"696":{"position":[[457,7]]},"705":{"position":[[931,4]]},"710":{"position":[[336,4],[382,4]]},"711":{"position":[[2059,4]]},"793":{"position":[[625,4]]},"836":{"position":[[1847,7],[1942,7]]},"838":{"position":[[587,5],[614,7],[713,4]]},"839":{"position":[[408,4],[492,4],[874,5],[945,4],[1256,7]]},"841":{"position":[[425,4],[645,4],[755,4],[769,4],[817,4],[1526,4]]},"855":{"position":[[316,4]]},"857":{"position":[[542,5]]},"860":{"position":[[568,5]]},"867":{"position":[[311,4]]},"870":{"position":[[199,4]]},"872":{"position":[[2099,4],[2571,6],[3586,4]]},"875":{"position":[[8913,4]]},"896":{"position":[[77,4],[301,4]]},"898":{"position":[[4062,4]]},"902":{"position":[[243,4]]},"903":{"position":[[672,4]]},"905":{"position":[[75,4]]},"913":{"position":[[224,4]]},"981":{"position":[[77,4],[153,4],[393,4],[1381,4]]},"985":{"position":[[657,4]]},"988":{"position":[[758,4],[6059,4]]},"995":{"position":[[635,5],[1234,4],[1389,4],[1460,4],[1498,4],[1543,6],[1732,6]]},"996":{"position":[[101,4]]},"1004":{"position":[[49,4]]},"1006":{"position":[[286,4]]},"1007":{"position":[[980,5]]},"1009":{"position":[[279,4]]},"1033":{"position":[[545,6]]},"1094":{"position":[[245,4]]},"1101":{"position":[[107,4]]},"1121":{"position":[[112,4],[276,4]]},"1124":{"position":[[1901,4]]},"1147":{"position":[[27,4]]},"1148":{"position":[[201,5],[249,4]]},"1149":{"position":[[217,4],[1237,4]]},"1150":{"position":[[600,4]]},"1162":{"position":[[731,6],[868,6],[965,6],[1024,6]]},"1163":{"position":[[160,8],[372,6]]},"1165":{"position":[[12,6],[637,6],[951,6]]},"1198":{"position":[[1741,4]]},"1316":{"position":[[553,6]]},"1320":{"position":[[863,4]]}},"keywords":{}}],["sync"",{"_index":1507,"title":{},"content":{"244":{"position":[[980,10],[1108,10]]}},"keywords":{}}],["sync').pip",{"_index":5518,"title":{},"content":{"995":{"position":[[1932,12]]}},"keywords":{}}],["syncfirestor",{"_index":4331,"title":{},"content":{"749":{"position":[[15136,15]]}},"keywords":{}}],["synchron",{"_index":613,"title":{"132":{"position":[[0,13]]},"135":{"position":[[14,16]]},"147":{"position":[[5,15]]},"163":{"position":[[0,13]]},"190":{"position":[[0,13]]},"337":{"position":[[0,13]]},"340":{"position":[[14,16]]},"525":{"position":[[0,13]]},"582":{"position":[[0,13]]}},"content":{"39":{"position":[[42,15]]},"40":{"position":[[256,15]]},"47":{"position":[[868,16]]},"68":{"position":[[52,16]]},"80":{"position":[[135,16]]},"82":{"position":[[109,15]]},"89":{"position":[[320,12]]},"103":{"position":[[166,15]]},"109":{"position":[[62,15]]},"113":{"position":[[160,15]]},"121":{"position":[[148,16]]},"122":{"position":[[195,12]]},"123":{"position":[[101,11]]},"126":{"position":[[166,15]]},"132":{"position":[[155,16]]},"133":{"position":[[189,12]]},"135":{"position":[[34,16]]},"147":{"position":[[24,15],[270,15]]},"148":{"position":[[143,16]]},"151":{"position":[[228,15]]},"152":{"position":[[298,16]]},"153":{"position":[[375,15]]},"155":{"position":[[285,16]]},"157":{"position":[[192,13],[359,12]]},"158":{"position":[[126,15]]},"161":{"position":[[253,15]]},"164":{"position":[[326,13]]},"165":{"position":[[75,13],[379,15]]},"170":{"position":[[143,12],[328,15]]},"173":{"position":[[385,15]]},"174":{"position":[[411,15],[1901,11]]},"181":{"position":[[292,15]]},"183":{"position":[[201,12]]},"184":{"position":[[135,15],[285,16]]},"190":{"position":[[52,11],[141,15]]},"191":{"position":[[160,12]]},"192":{"position":[[80,15],[153,15],[365,15]]},"198":{"position":[[129,16]]},"208":{"position":[[334,16]]},"210":{"position":[[72,15]]},"211":{"position":[[526,11]]},"223":{"position":[[283,15]]},"233":{"position":[[270,12]]},"235":{"position":[[240,12]]},"237":{"position":[[55,15],[170,16]]},"238":{"position":[[246,12]]},"241":{"position":[[563,16]]},"248":{"position":[[254,12]]},"267":{"position":[[196,15],[371,12],[714,13]]},"274":{"position":[[282,15]]},"279":{"position":[[234,11],[445,15]]},"280":{"position":[[340,15]]},"289":{"position":[[104,15],[540,11],[759,15],[835,15],[1654,15]]},"293":{"position":[[218,15]]},"309":{"position":[[301,12]]},"321":{"position":[[546,15]]},"322":{"position":[[229,11]]},"323":{"position":[[273,12],[367,15]]},"325":{"position":[[87,12]]},"327":{"position":[[238,12]]},"330":{"position":[[62,12]]},"340":{"position":[[105,15]]},"365":{"position":[[1174,15],[1344,16]]},"368":{"position":[[382,16]]},"369":{"position":[[1050,13]]},"373":{"position":[[580,16]]},"375":{"position":[[547,16]]},"380":{"position":[[250,12]]},"381":{"position":[[75,15]]},"408":{"position":[[1724,11]]},"411":{"position":[[1371,15],[2240,13]]},"412":{"position":[[511,16],[533,15]]},"419":{"position":[[510,13]]},"420":{"position":[[793,16]]},"444":{"position":[[700,15],[902,16]]},"445":{"position":[[316,15],[805,16],[865,16],[1145,15]]},"446":{"position":[[284,15],[608,15]]},"447":{"position":[[151,16]]},"475":{"position":[[273,15]]},"491":{"position":[[833,16]]},"501":{"position":[[199,15]]},"502":{"position":[[125,15],[547,15]]},"504":{"position":[[530,13],[619,15],[825,15],[1032,15],[1092,12],[1356,15]]},"514":{"position":[[214,13]]},"516":{"position":[[294,12]]},"517":{"position":[[71,15],[200,15]]},"525":{"position":[[105,16],[456,15],[531,15],[715,15]]},"530":{"position":[[417,16]]},"544":{"position":[[94,11]]},"556":{"position":[[1652,13]]},"559":{"position":[[1072,12]]},"560":{"position":[[89,11]]},"565":{"position":[[45,16]]},"566":{"position":[[658,11]]},"567":{"position":[[321,16]]},"570":{"position":[[302,12]]},"574":{"position":[[782,15]]},"575":{"position":[[466,12]]},"582":{"position":[[187,11],[261,16]]},"589":{"position":[[80,12]]},"604":{"position":[[94,11]]},"630":{"position":[[468,15]]},"631":{"position":[[394,11]]},"836":{"position":[[2325,15]]},"849":{"position":[[27,15],[115,15],[585,16]]},"860":{"position":[[536,12]]},"871":{"position":[[462,15]]},"903":{"position":[[31,15]]},"1132":{"position":[[968,16]]},"1148":{"position":[[90,16]]},"1207":{"position":[[264,11],[510,11]]},"1208":{"position":[[159,13],[278,13],[509,11]]}},"keywords":{}}],["synchronization.conflict",{"_index":3701,"title":{},"content":{"632":{"position":[[443,24]]}},"keywords":{}}],["syncincrement",{"_index":4933,"title":{},"content":{"870":{"position":[[109,15]]}},"keywords":{}}],["syncliv",{"_index":5183,"title":{},"content":{"896":{"position":[[214,8]]}},"keywords":{}}],["synclocaltasks(db",{"_index":3708,"title":{},"content":{"632":{"position":[[2189,18]]}},"keywords":{}}],["synergi",{"_index":4815,"title":{},"content":{"841":{"position":[[1415,7]]}},"keywords":{}}],["syntax",{"_index":274,"title":{"1249":{"position":[[12,7]]}},"content":{"16":{"position":[[258,7]]},"19":{"position":[[305,6]]},"23":{"position":[[458,6]]},"32":{"position":[[144,6]]},"661":{"position":[[202,7]]},"686":{"position":[[279,6]]},"711":{"position":[[236,7]]},"749":{"position":[[4380,9],[4631,9]]},"836":{"position":[[204,7]]},"1041":{"position":[[48,7]]},"1065":{"position":[[364,6]]},"1071":{"position":[[60,6],[133,6]]},"1249":{"position":[[428,6]]},"1251":{"position":[[141,6]]},"1317":{"position":[[426,6]]}},"keywords":{}}],["system",{"_index":395,"title":{"433":{"position":[[5,6]]},"1205":{"position":[[20,6]]},"1215":{"position":[[24,6],[66,6]]}},"content":{"24":{"position":[[103,6]]},"40":{"position":[[681,7]]},"59":{"position":[[66,6]]},"82":{"position":[[77,8]]},"113":{"position":[[111,8]]},"131":{"position":[[423,6],[538,6]]},"134":{"position":[[18,7]]},"162":{"position":[[408,7],[426,6]]},"172":{"position":[[55,6]]},"207":{"position":[[394,7]]},"238":{"position":[[102,8],[276,6]]},"250":{"position":[[369,8]]},"267":{"position":[[308,8]]},"287":{"position":[[710,7]]},"302":{"position":[[592,6]]},"336":{"position":[[268,6]]},"339":{"position":[[224,8]]},"354":{"position":[[569,6],[950,7],[1061,7]]},"364":{"position":[[379,8]]},"369":{"position":[[233,6]]},"372":{"position":[[192,6]]},"375":{"position":[[601,7]]},"390":{"position":[[1926,7]]},"408":{"position":[[1552,6],[1584,6],[4195,7]]},"410":{"position":[[1731,6]]},"411":{"position":[[905,7],[1074,8],[1754,6]]},"412":{"position":[[813,8],[1731,6],[2573,6],[3225,7],[3275,7],[5642,6],[6439,7]]},"418":{"position":[[281,7]]},"433":{"position":[[45,6]]},"444":{"position":[[43,7]]},"453":{"position":[[25,6],[245,7]]},"454":{"position":[[998,7]]},"463":{"position":[[520,6]]},"476":{"position":[[115,6]]},"491":{"position":[[150,6]]},"495":{"position":[[641,8]]},"504":{"position":[[314,6]]},"524":{"position":[[428,6]]},"533":{"position":[[134,6]]},"546":{"position":[[121,6]]},"569":{"position":[[287,8],[346,7],[418,7],[474,7],[1377,7],[1568,7]]},"574":{"position":[[935,7]]},"581":{"position":[[274,6]]},"593":{"position":[[134,6]]},"606":{"position":[[121,6]]},"618":{"position":[[60,7],[218,7]]},"632":{"position":[[649,6]]},"635":{"position":[[518,7]]},"640":{"position":[[189,7]]},"688":{"position":[[205,7]]},"690":{"position":[[202,6]]},"703":{"position":[[199,7]]},"737":{"position":[[366,6]]},"772":{"position":[[87,7]]},"802":{"position":[[69,7],[650,6]]},"831":{"position":[[141,6],[485,6]]},"837":{"position":[[969,6]]},"908":{"position":[[134,6]]},"1094":{"position":[[644,7]]},"1132":{"position":[[411,6],[582,6]]},"1146":{"position":[[29,6]]},"1198":{"position":[[268,7]]},"1206":{"position":[[25,6]]},"1207":{"position":[[53,6]]},"1208":{"position":[[694,7]]},"1209":{"position":[[33,6]]},"1214":{"position":[[21,6]]},"1215":{"position":[[69,6],[115,6],[140,6],[206,7],[272,7],[296,6],[388,6],[428,6]]},"1216":{"position":[[18,6]]},"1244":{"position":[[41,6]]},"1297":{"position":[[343,7]]},"1313":{"position":[[119,6],[406,6],[1042,6]]},"1322":{"position":[[215,8]]}},"keywords":{}}],["system'",{"_index":3653,"title":{},"content":{"618":{"position":[[415,8]]}},"keywords":{}}],["system.then",{"_index":6566,"title":{},"content":{"1317":{"position":[[498,11]]}},"keywords":{}}],["systembrows",{"_index":6242,"title":{},"content":{"1216":{"position":[[54,13]]}},"keywords":{}}],["t",{"_index":4727,"title":{},"content":{"825":{"position":[[815,1]]}},"keywords":{}}],["t.titl",{"_index":4729,"title":{},"content":{"825":{"position":[[848,7]]}},"keywords":{}}],["tab",{"_index":281,"title":{"80":{"position":[[15,3]]},"109":{"position":[[15,3]]},"125":{"position":[[6,3]]},"160":{"position":[[6,3]]},"237":{"position":[[15,3]]},"330":{"position":[[6,3]]},"458":{"position":[[6,3]]},"475":{"position":[[9,3]]},"519":{"position":[[6,3]]},"589":{"position":[[6,3]]},"755":{"position":[[19,3]]},"779":{"position":[[6,3]]},"989":{"position":[[6,3]]},"1174":{"position":[[6,3]]},"1183":{"position":[[6,3]]},"1301":{"position":[[17,3]]}},"content":{"16":{"position":[[522,5]]},"33":{"position":[[264,3]]},"47":{"position":[[864,3],[942,4],[998,3],[1025,4]]},"53":{"position":[[147,5]]},"80":{"position":[[34,3],[111,5]]},"109":{"position":[[30,3],[111,4]]},"120":{"position":[[314,3]]},"125":{"position":[[48,3],[138,5],[197,5],[239,3]]},"160":{"position":[[19,3],[101,5],[153,3],[201,5]]},"174":{"position":[[1787,3],[1829,3],[2013,4]]},"237":{"position":[[28,3],[116,5],[238,4]]},"314":{"position":[[600,3]]},"323":{"position":[[363,3],[520,3],[585,5]]},"325":{"position":[[273,3]]},"328":{"position":[[152,4]]},"330":{"position":[[37,5],[97,5]]},"334":{"position":[[493,3]]},"340":{"position":[[147,4]]},"368":{"position":[[344,5]]},"392":{"position":[[2178,4]]},"410":{"position":[[1535,4]]},"411":{"position":[[2396,5],[3949,3],[4070,4],[4222,4],[4262,4],[4355,4],[4370,3],[4498,3],[4549,4],[4578,3]]},"427":{"position":[[1128,3],[1215,4]]},"436":{"position":[[174,3]]},"451":{"position":[[888,3]]},"458":{"position":[[145,4],[545,5],[624,4],[1134,5],[1221,4],[1520,4]]},"467":{"position":[[615,3]]},"468":{"position":[[715,4]]},"475":{"position":[[54,5],[88,4],[157,3],[234,4]]},"483":{"position":[[103,3]]},"490":{"position":[[314,3],[387,5],[408,3]]},"502":{"position":[[1134,3],[1182,3],[1244,4]]},"519":{"position":[[52,4],[128,3],[182,3],[222,5],[353,5]]},"535":{"position":[[866,3],[900,3],[989,3]]},"541":{"position":[[883,5]]},"548":{"position":[[372,3]]},"559":{"position":[[1339,4]]},"562":{"position":[[1716,4]]},"566":{"position":[[862,4],[897,4]]},"571":{"position":[[417,4]]},"575":{"position":[[495,5],[536,3],[591,4]]},"579":{"position":[[502,3]]},"589":{"position":[[29,4],[148,3]]},"595":{"position":[[941,3],[975,3],[1066,3]]},"600":{"position":[[204,5]]},"601":{"position":[[858,4]]},"608":{"position":[[370,3]]},"617":{"position":[[199,4],[247,5],[1950,4],[2033,3],[2138,5],[2163,4]]},"634":{"position":[[419,5]]},"709":{"position":[[398,3],[524,3]]},"710":{"position":[[1149,5],[2213,4]]},"723":{"position":[[828,5],[895,4],[978,5]]},"736":{"position":[[344,4]]},"737":{"position":[[118,3],[171,3],[253,4],[394,5]]},"739":{"position":[[164,3]]},"740":{"position":[[278,4]]},"742":{"position":[[43,3]]},"743":{"position":[[166,4]]},"749":{"position":[[5775,3],[8853,3]]},"755":{"position":[[97,3],[202,5]]},"779":{"position":[[84,3],[130,4],[188,5],[233,5],[327,5],[436,4]]},"785":{"position":[[612,4]]},"849":{"position":[[247,3]]},"956":{"position":[[130,4],[166,3]]},"979":{"position":[[211,5]]},"981":{"position":[[1499,3],[1556,4]]},"988":{"position":[[1175,5],[1249,5]]},"989":{"position":[[105,4],[194,3],[442,3]]},"995":{"position":[[248,3],[335,3],[384,4],[893,3],[992,3]]},"1003":{"position":[[122,3],[198,3],[264,3]]},"1030":{"position":[[88,4]]},"1088":{"position":[[269,4]]},"1115":{"position":[[656,4]]},"1117":{"position":[[561,4]]},"1120":{"position":[[316,4]]},"1174":{"position":[[89,5],[226,5],[413,5],[429,3],[461,3],[498,4],[579,3],[627,3]]},"1183":{"position":[[248,5],[409,5]]},"1301":{"position":[[121,4],[248,4],[476,5],[805,4],[1190,4],[1295,4],[1321,3],[1620,3]]},"1307":{"position":[[281,4],[303,4]]}},"keywords":{}}],["tab"",{"_index":3983,"title":{},"content":{"707":{"position":[[328,10]]}},"keywords":{}}],["tab'",{"_index":2890,"title":{},"content":{"427":{"position":[[1149,5]]}},"keywords":{}}],["tab.your",{"_index":5506,"title":{},"content":{"995":{"position":[[1041,8]]}},"keywords":{}}],["tabeasi",{"_index":6300,"title":{},"content":{"1258":{"position":[[58,9]]}},"keywords":{}}],["tabl",{"_index":1651,"title":{"394":{"position":[[42,5]]}},"content":{"279":{"position":[[344,6]]},"282":{"position":[[250,6]]},"299":{"position":[[125,5]]},"350":{"position":[[113,5]]},"351":{"position":[[17,6]]},"352":{"position":[[399,7]]},"353":{"position":[[352,5]]},"356":{"position":[[322,5]]},"360":{"position":[[204,6]]},"364":{"position":[[652,5],[733,7]]},"398":{"position":[[120,5]]},"402":{"position":[[1385,5]]},"412":{"position":[[13636,6]]},"463":{"position":[[1185,5],[1368,6]]},"500":{"position":[[403,6]]},"705":{"position":[[700,6],[1057,6]]},"711":{"position":[[1212,5],[1279,5]]},"896":{"position":[[145,6]]},"898":{"position":[[98,6],[144,6],[773,6],[823,6],[899,5],[1396,5],[1492,5],[1669,6],[3185,5]]},"1253":{"position":[[88,7]]},"1282":{"position":[[920,6],[1011,6]]},"1315":{"position":[[83,7],[189,6],[996,6],[1237,6],[1441,5]]},"1318":{"position":[[388,5],[469,5],[1007,5],[1047,7]]},"1319":{"position":[[478,6],[541,5]]},"1323":{"position":[[43,6]]}},"keywords":{}}],["table/collect",{"_index":6448,"title":{},"content":{"1295":{"position":[[154,17],[250,17]]}},"keywords":{}}],["table_a",{"_index":6545,"title":{},"content":{"1316":{"position":[[875,7],[916,7]]}},"keywords":{}}],["table_a.amountinstock",{"_index":6547,"title":{},"content":{"1316":{"position":[[930,21]]}},"keywords":{}}],["table_a.instock",{"_index":6546,"title":{},"content":{"1316":{"position":[[887,15]]}},"keywords":{}}],["tablenam",{"_index":5218,"title":{},"content":{"898":{"position":[[3342,10]]}},"keywords":{}}],["tabs"",{"_index":2633,"title":{},"content":{"411":{"position":[[4667,11]]}},"keywords":{}}],["tabs.th",{"_index":2991,"title":{},"content":{"458":{"position":[[1417,8]]}},"keywords":{}}],["tackl",{"_index":1429,"title":{},"content":{"240":{"position":[[127,7]]}},"keywords":{}}],["tactic",{"_index":1820,"title":{},"content":{"303":{"position":[[121,7]]}},"keywords":{}}],["tailor",{"_index":1150,"title":{},"content":{"147":{"position":[[297,8]]},"271":{"position":[[180,8]]},"287":{"position":[[211,6]]},"412":{"position":[[1355,8]]},"576":{"position":[[394,6]]},"1132":{"position":[[676,8]]}},"keywords":{}}],["take",{"_index":888,"title":{},"content":{"61":{"position":[[424,5]]},"114":{"position":[[652,4]]},"143":{"position":[[197,5]]},"151":{"position":[[49,4]]},"164":{"position":[[313,4]]},"284":{"position":[[193,4]]},"362":{"position":[[779,4]]},"375":{"position":[[172,6]]},"388":{"position":[[433,6]]},"391":{"position":[[324,5]]},"392":{"position":[[2509,5],[3063,5],[3138,4]]},"394":{"position":[[1621,5]]},"399":{"position":[[622,4]]},"400":{"position":[[168,5]]},"401":{"position":[[666,4]]},"404":{"position":[[888,4]]},"408":{"position":[[4592,4]]},"411":{"position":[[5790,5]]},"412":{"position":[[10629,5],[10668,4]]},"446":{"position":[[134,6]]},"463":{"position":[[587,5],[862,5],[1191,5]]},"464":{"position":[[756,4],[1202,5]]},"465":{"position":[[66,5]]},"467":{"position":[[691,5]]},"468":{"position":[[528,5]]},"567":{"position":[[66,4]]},"699":{"position":[[456,5]]},"704":{"position":[[76,5],[218,5]]},"721":{"position":[[182,4]]},"752":{"position":[[215,4],[567,5]]},"810":{"position":[[71,5]]},"824":{"position":[[533,4]]},"1150":{"position":[[497,5]]},"1192":{"position":[[487,4]]},"1246":{"position":[[189,4],[509,4]]},"1301":{"position":[[1396,5]]},"1313":{"position":[[295,6],[568,6]]},"1316":{"position":[[2131,5]]}},"keywords":{}}],["taken",{"_index":2325,"title":{},"content":{"394":{"position":[[1487,5]]},"401":{"position":[[29,5]]}},"keywords":{}}],["talk",{"_index":2507,"title":{},"content":{"404":{"position":[[736,6]]},"422":{"position":[[205,4]]},"569":{"position":[[989,4]]},"570":{"position":[[6,7]]},"1304":{"position":[[6,7]]}},"keywords":{}}],["tanstack",{"_index":4621,"title":{},"content":{"793":{"position":[[1252,8]]}},"keywords":{}}],["tap",{"_index":2135,"title":{},"content":{"373":{"position":[[411,3]]},"504":{"position":[[187,7]]}},"keywords":{}}],["target",{"_index":1216,"title":{},"content":{"174":{"position":[[1138,8]]},"1266":{"position":[[512,7]]}},"keywords":{}}],["task",{"_index":1157,"title":{},"content":{"151":{"position":[[357,4]]},"209":{"position":[[384,6],[410,5],[699,5]]},"255":{"position":[[728,6],[754,5],[1046,5]]},"364":{"position":[[836,6]]},"392":{"position":[[3740,5]]},"408":{"position":[[3706,5]]},"411":{"position":[[619,6]]},"412":{"position":[[10797,5]]},"446":{"position":[[148,4]]},"480":{"position":[[493,6],[519,6],[892,8],[941,5]]},"481":{"position":[[711,6]]},"569":{"position":[[210,5],[1385,4]]},"632":{"position":[[1478,6],[1504,5],[1846,5],[2285,7],[2445,5]]},"634":{"position":[[296,4]]},"653":{"position":[[687,5]]},"765":{"position":[[199,5]]},"801":{"position":[[673,5]]},"860":{"position":[[74,5]]},"904":{"position":[[1207,6]]},"975":{"position":[[195,5],[262,6]]},"1158":{"position":[[317,6],[343,6],[590,5]]},"1175":{"position":[[460,6]]},"1313":{"position":[[848,6]]}},"keywords":{}}],["tasks—databas",{"_index":2100,"title":{},"content":{"362":{"position":[[657,15]]}},"keywords":{}}],["tauri",{"_index":4615,"title":{"1280":{"position":[[11,5]]}},"content":{"793":{"position":[[330,6]]},"1280":{"position":[[9,5],[34,5],[117,5],[218,5],[390,7]]}},"keywords":{}}],["tauri.us",{"_index":6360,"title":{},"content":{"1280":{"position":[[163,9]]}},"keywords":{}}],["team",{"_index":2094,"title":{},"content":{"362":{"position":[[431,6]]},"384":{"position":[[378,5]]},"387":{"position":[[442,5]]},"644":{"position":[[588,6]]},"835":{"position":[[640,4]]},"1133":{"position":[[338,6]]},"1148":{"position":[[64,5]]},"1292":{"position":[[10,4]]}},"keywords":{}}],["technic",{"_index":2586,"title":{},"content":{"409":{"position":[[259,11]]},"419":{"position":[[771,9],[1265,9]]},"624":{"position":[[333,9]]},"699":{"position":[[337,9]]}},"keywords":{}}],["techniqu",{"_index":1119,"title":{"137":{"position":[[27,11]]},"166":{"position":[[27,11]]},"193":{"position":[[27,11]]},"341":{"position":[[27,11]]},"505":{"position":[[27,11]]},"526":{"position":[[27,11]]},"583":{"position":[[27,11]]}},"content":{"137":{"position":[[43,10]]},"146":{"position":[[134,10]]},"148":{"position":[[440,10]]},"169":{"position":[[107,10]]},"193":{"position":[[46,10]]},"194":{"position":[[15,9]]},"198":{"position":[[361,10]]},"376":{"position":[[604,10]]},"402":{"position":[[26,10]]},"408":{"position":[[4776,11]]},"528":{"position":[[89,9]]},"610":{"position":[[132,9]]},"624":{"position":[[1366,10]]},"643":{"position":[[50,10]]},"901":{"position":[[275,10]]},"1009":{"position":[[56,9]]},"1132":{"position":[[1095,10]]},"1295":{"position":[[15,10]]},"1298":{"position":[[366,9]]}},"keywords":{}}],["technolog",{"_index":248,"title":{"615":{"position":[[19,13]]}},"content":{"15":{"position":[[44,12]]},"38":{"position":[[657,12]]},"43":{"position":[[584,13]]},"155":{"position":[[177,13]]},"162":{"position":[[116,13]]},"269":{"position":[[63,12],[193,12]]},"367":{"position":[[629,12]]},"381":{"position":[[576,10]]},"408":{"position":[[53,13],[2646,13]]},"412":{"position":[[219,10],[1632,10]]},"422":{"position":[[51,13],[89,12]]},"435":{"position":[[94,10]]},"445":{"position":[[134,12]]},"459":{"position":[[220,12]]},"462":{"position":[[880,12]]},"463":{"position":[[637,10]]},"464":{"position":[[250,10]]},"465":{"position":[[111,10],[413,12]]},"466":{"position":[[77,10]]},"467":{"position":[[49,10]]},"469":{"position":[[532,12]]},"503":{"position":[[56,12]]},"524":{"position":[[76,11]]},"610":{"position":[[834,12]]},"611":{"position":[[129,10]]},"614":{"position":[[1030,13]]},"620":{"position":[[526,10]]},"624":{"position":[[49,13]]},"625":{"position":[[35,13]]},"627":{"position":[[91,13],[294,10]]},"840":{"position":[[39,10]]},"1320":{"position":[[469,12]]}},"keywords":{}}],["tell",{"_index":3951,"title":{},"content":{"700":{"position":[[631,4]]},"772":{"position":[[580,4]]},"781":{"position":[[362,4]]},"796":{"position":[[773,4]]},"875":{"position":[[9057,4]]},"879":{"position":[[412,4],[491,4]]},"907":{"position":[[80,5]]},"985":{"position":[[297,4]]},"987":{"position":[[275,4]]},"1002":{"position":[[173,4]]},"1176":{"position":[[215,7]]}},"keywords":{}}],["temp",{"_index":4098,"title":{},"content":{"739":{"position":[[620,4],[706,5]]}},"keywords":{}}],["temperatur",{"_index":4084,"title":{},"content":{"736":{"position":[[54,11],[236,11]]},"739":{"position":[[47,11],[433,12]]}},"keywords":{}}],["templat",{"_index":1093,"title":{},"content":{"130":{"position":[[263,9]]},"143":{"position":[[69,10]]},"493":{"position":[[144,9]]},"602":{"position":[[320,8]]},"825":{"position":[[768,9]]}},"keywords":{}}],["temporari",{"_index":1295,"title":{},"content":{"189":{"position":[[611,9]]},"287":{"position":[[931,9]]},"365":{"position":[[200,9],[393,9]]},"436":{"position":[[268,9]]},"504":{"position":[[398,9]]},"749":{"position":[[11036,9],[11179,9]]}},"keywords":{}}],["temporarili",{"_index":5655,"title":{"1033":{"position":[[10,11]]}},"content":{},"keywords":{}}],["ten",{"_index":2535,"title":{},"content":{"408":{"position":[[1025,5]]},"739":{"position":[[75,3]]}},"keywords":{}}],["tend",{"_index":1408,"title":{},"content":{"227":{"position":[[46,4]]},"412":{"position":[[8981,5]]},"435":{"position":[[253,5]]}},"keywords":{}}],["terabyt",{"_index":3935,"title":{},"content":{"696":{"position":[[609,9]]}},"keywords":{}}],["term",{"_index":676,"title":{},"content":{"43":{"position":[[460,5]]},"131":{"position":[[882,4]]},"266":{"position":[[482,4]]},"287":{"position":[[1057,4]]},"407":{"position":[[1132,4]]},"419":{"position":[[1212,4]]},"420":{"position":[[1040,4]]},"723":{"position":[[2163,4]]},"839":{"position":[[1400,4]]}},"keywords":{}}],["term.cross",{"_index":2503,"title":{},"content":{"404":{"position":[[445,10]]}},"keywords":{}}],["termin",{"_index":13,"title":{},"content":{"1":{"position":[[176,11]]},"1162":{"position":[[140,11]]},"1181":{"position":[[206,11]]}},"keywords":{}}],["terminated.al",{"_index":6127,"title":{},"content":{"1171":{"position":[[157,14]]}},"keywords":{}}],["terms.clust",{"_index":2200,"title":{},"content":{"390":{"position":[[1309,17]]}},"keywords":{}}],["terseropt",{"_index":6322,"title":{},"content":{"1266":{"position":[[1005,14]]}},"keywords":{}}],["terserplugin",{"_index":6306,"title":{},"content":{"1266":{"position":[[201,12],[990,14]]}},"keywords":{}}],["test",{"_index":20,"title":{"301":{"position":[[0,7]]},"667":{"position":[[7,6]]},"1159":{"position":[[33,7]]}},"content":{"1":{"position":[[307,4]]},"15":{"position":[[449,8]]},"29":{"position":[[311,7]]},"131":{"position":[[835,7]]},"162":{"position":[[563,7]]},"301":{"position":[[47,4],[183,4]]},"304":{"position":[[387,4]]},"314":{"position":[[34,7]]},"318":{"position":[[235,7]]},"336":{"position":[[382,5]]},"346":{"position":[[538,8],[558,4]]},"386":{"position":[[16,6]]},"392":{"position":[[904,4]]},"394":{"position":[[1591,4]]},"396":{"position":[[814,7]]},"399":{"position":[[494,6]]},"412":{"position":[[10748,7],[11810,8]]},"427":{"position":[[1299,4]]},"455":{"position":[[869,5]]},"461":{"position":[[170,4],[747,4],[1607,6]]},"462":{"position":[[212,5],[455,4],[529,5],[685,5],[812,4]]},"464":{"position":[[11,4],[1346,5]]},"524":{"position":[[554,7]]},"554":{"position":[[348,7],[614,8]]},"581":{"position":[[386,5]]},"620":{"position":[[322,5],[725,7]]},"627":{"position":[[278,4]]},"640":{"position":[[396,5]]},"662":{"position":[[1128,7]]},"666":{"position":[[265,5],[342,5],[433,5]]},"667":{"position":[[70,4],[92,5],[178,4]]},"668":{"position":[[115,4],[366,6],[384,4]]},"670":{"position":[[52,4],[357,4]]},"710":{"position":[[329,6]]},"730":{"position":[[40,6]]},"749":{"position":[[4440,8],[4475,5],[5796,6]]},"773":{"position":[[371,5]]},"798":{"position":[[233,5]]},"820":{"position":[[303,8]]},"821":{"position":[[908,4]]},"836":{"position":[[1207,7]]},"861":{"position":[[2479,8]]},"863":{"position":[[895,7]]},"898":{"position":[[2114,5]]},"966":{"position":[[255,6]]},"996":{"position":[[137,5]]},"1125":{"position":[[661,4]]},"1139":{"position":[[104,6]]},"1145":{"position":[[100,6]]},"1159":{"position":[[180,5],[195,4]]},"1195":{"position":[[200,8]]},"1209":{"position":[[181,5]]},"1216":{"position":[[87,4]]},"1222":{"position":[[724,4]]},"1266":{"position":[[743,5]]},"1271":{"position":[[311,4]]},"1292":{"position":[[134,7]]},"1294":{"position":[[1827,4]]},"1295":{"position":[[783,4]]},"1298":{"position":[[412,5]]}},"keywords":{}}],["test/unit",{"_index":3829,"title":{},"content":{"667":{"position":[[109,9]]}},"keywords":{}}],["test:node:memori",{"_index":3827,"title":{},"content":{"666":{"position":[[319,16]]}},"keywords":{}}],["testabl",{"_index":2943,"title":{},"content":{"445":{"position":[[1637,12]]}},"keywords":{}}],["testdata",{"_index":4714,"title":{},"content":{"820":{"position":[[681,9]]}},"keywords":{}}],["testdocu",{"_index":6442,"title":{},"content":{"1294":{"position":[[1611,14]]}},"keywords":{}}],["text",{"_index":631,"title":{"358":{"position":[[37,4]]}},"content":{"40":{"position":[[129,4]]},"205":{"position":[[222,4]]},"252":{"position":[[221,4]]},"259":{"position":[[169,5]]},"315":{"position":[[795,5],[906,8],[963,4]]},"356":{"position":[[367,5]]},"357":{"position":[[52,4],[185,5]]},"358":{"position":[[387,4]]},"362":{"position":[[599,4]]},"383":{"position":[[187,4],[219,4]]},"390":{"position":[[223,5],[916,5],[1703,5]]},"391":{"position":[[341,4],[805,4]]},"392":{"position":[[489,4],[670,5],[715,7],[4503,4]]},"394":{"position":[[244,5],[312,5]]},"404":{"position":[[650,4]]},"412":{"position":[[3769,4],[10456,4]]},"457":{"position":[[291,4]]},"556":{"position":[[593,4]]},"698":{"position":[[1958,4]]},"754":{"position":[[719,6]]},"898":{"position":[[199,4],[968,4],[1008,4],[1044,4]]},"1023":{"position":[[46,4]]},"1072":{"position":[[2283,4]]},"1284":{"position":[[113,4]]}},"keywords":{}}],["text/ev",{"_index":3590,"title":{},"content":{"612":{"position":[[1489,10],[1916,11]]},"875":{"position":[[7300,11]]}},"keywords":{}}],["text/plain",{"_index":3372,"title":{},"content":{"556":{"position":[[999,14],[1020,13]]},"792":{"position":[[403,12]]},"917":{"position":[[248,14],[309,12]]},"918":{"position":[[180,12]]}},"keywords":{}}],["textdecod",{"_index":6194,"title":{},"content":{"1208":{"position":[[368,11]]}},"keywords":{}}],["textdecoder().decode(readbuff",{"_index":6216,"title":{},"content":{"1208":{"position":[[1437,33]]}},"keywords":{}}],["textencod",{"_index":6193,"title":{},"content":{"1208":{"position":[[352,11]]}},"keywords":{}}],["textencoder().encod",{"_index":6218,"title":{},"content":{"1208":{"position":[[1542,26]]}},"keywords":{}}],["textencoder().encode('hello",{"_index":6208,"title":{},"content":{"1208":{"position":[[1169,27]]}},"keywords":{}}],["textual",{"_index":1824,"title":{},"content":{"303":{"position":[[257,7]]}},"keywords":{}}],["thank",{"_index":2642,"title":{},"content":{"411":{"position":[[5477,6]]},"670":{"position":[[592,5]]},"700":{"position":[[1000,5]]},"1151":{"position":[[668,5]]},"1178":{"position":[[667,5]]}},"keywords":{}}],["that'",{"_index":2426,"title":{},"content":{"398":{"position":[[3415,6]]},"402":{"position":[[338,6]]},"412":{"position":[[8459,6],[14882,6]]}},"keywords":{}}],["that’",{"_index":6096,"title":{},"content":{"1156":{"position":[[354,6]]}},"keywords":{}}],["theft",{"_index":2147,"title":{},"content":{"377":{"position":[[102,5]]}},"keywords":{}}],["them.flex",{"_index":3166,"title":{},"content":{"491":{"position":[[544,13]]}},"keywords":{}}],["themself",{"_index":2115,"title":{},"content":{"366":{"position":[[582,8]]},"1092":{"position":[[278,8]]},"1094":{"position":[[531,9]]},"1095":{"position":[[47,9]]}},"keywords":{}}],["themselv",{"_index":2605,"title":{},"content":{"410":{"position":[[1840,10]]},"698":{"position":[[2011,10]]}},"keywords":{}}],["themthen",{"_index":6567,"title":{},"content":{"1317":{"position":[[610,8]]}},"keywords":{}}],["then(data",{"_index":3556,"title":{},"content":{"610":{"position":[[997,10]]}},"keywords":{}}],["then(json",{"_index":5372,"title":{},"content":{"952":{"position":[[329,10]]},"971":{"position":[[439,10]]}},"keywords":{}}],["then(respons",{"_index":3555,"title":{},"content":{"610":{"position":[[959,14]]},"751":{"position":[[1390,14]]}},"keywords":{}}],["theoret",{"_index":2758,"title":{},"content":{"412":{"position":[[13154,13]]}},"keywords":{}}],["theori",{"_index":418,"title":{},"content":{"25":{"position":[[207,6]]},"459":{"position":[[304,6]]},"616":{"position":[[209,7]]},"617":{"position":[[1577,6]]},"696":{"position":[[251,6]]},"708":{"position":[[171,7]]}},"keywords":{}}],["there'",{"_index":762,"title":{},"content":{"51":{"position":[[135,7]]},"327":{"position":[[171,7]]},"410":{"position":[[100,7]]},"411":{"position":[[4612,7]]},"490":{"position":[[264,7]]},"714":{"position":[[426,7]]},"723":{"position":[[1779,7]]},"1072":{"position":[[861,7]]}},"keywords":{}}],["therebi",{"_index":2590,"title":{},"content":{"410":{"position":[[704,7]]},"588":{"position":[[66,7]]},"624":{"position":[[269,7]]}},"keywords":{}}],["therefor",{"_index":375,"title":{},"content":{"22":{"position":[[366,9]]},"270":{"position":[[206,10]]},"396":{"position":[[1409,9],[1707,10]]},"399":{"position":[[346,10]]},"451":{"position":[[625,9]]},"455":{"position":[[779,9]]},"458":{"position":[[168,9]]},"460":{"position":[[900,9],[1309,9]]},"464":{"position":[[1329,9]]},"468":{"position":[[112,9]]},"569":{"position":[[1414,9]]},"619":{"position":[[241,9]]},"660":{"position":[[250,9]]},"764":{"position":[[256,9]]},"811":{"position":[[67,9]]},"817":{"position":[[71,9]]},"836":{"position":[[812,9]]},"879":{"position":[[281,9]]},"887":{"position":[[99,10]]},"905":{"position":[[156,9]]},"911":{"position":[[185,9]]},"932":{"position":[[301,9]]},"985":{"position":[[533,9]]},"1032":{"position":[[223,9]]},"1067":{"position":[[747,9]]},"1072":{"position":[[409,10],[850,10]]},"1084":{"position":[[197,9]]},"1115":{"position":[[772,9]]},"1191":{"position":[[423,9]]},"1192":{"position":[[374,9]]},"1208":{"position":[[338,9]]},"1210":{"position":[[56,9]]},"1211":{"position":[[100,9]]},"1215":{"position":[[616,9]]},"1251":{"position":[[25,9]]},"1272":{"position":[[90,9]]},"1296":{"position":[[1269,9]]},"1301":{"position":[[451,9]]}},"keywords":{}}],["they'll",{"_index":2857,"title":{},"content":{"421":{"position":[[1023,7]]}},"keywords":{}}],["they'r",{"_index":3162,"title":{},"content":{"489":{"position":[[819,7]]},"1009":{"position":[[296,7]]}},"keywords":{}}],["they'v",{"_index":2856,"title":{},"content":{"421":{"position":[[955,7]]}},"keywords":{}}],["thing",{"_index":482,"title":{"633":{"position":[[0,6]]}},"content":{"29":{"position":[[351,6]]},"396":{"position":[[1253,6],[1292,7]]},"400":{"position":[[630,6]]},"404":{"position":[[81,6]]},"408":{"position":[[1249,5]]},"412":{"position":[[14779,7]]},"457":{"position":[[601,6]]},"463":{"position":[[800,7]]},"464":{"position":[[452,7]]},"465":{"position":[[313,7]]},"466":{"position":[[277,7]]},"467":{"position":[[272,7]]},"570":{"position":[[887,5]]},"623":{"position":[[382,6]]},"698":{"position":[[3004,5]]},"700":{"position":[[1055,7]]},"704":{"position":[[317,6]]},"709":{"position":[[375,5],[638,5]]},"737":{"position":[[535,6]]},"785":{"position":[[57,6],[168,6]]},"862":{"position":[[1554,6]]},"872":{"position":[[2659,6]]},"898":{"position":[[4472,6]]},"1052":{"position":[[472,6]]},"1084":{"position":[[189,7]]},"1085":{"position":[[216,5]]},"1094":{"position":[[420,6]]},"1198":{"position":[[991,6]]},"1215":{"position":[[470,6]]},"1304":{"position":[[1608,5]]},"1320":{"position":[[122,6]]}},"keywords":{}}],["think",{"_index":3448,"title":{},"content":{"569":{"position":[[77,5]]},"612":{"position":[[376,5]]},"703":{"position":[[1644,5]]},"708":{"position":[[56,5]]},"1315":{"position":[[103,5]]}},"keywords":{}}],["thinner",{"_index":2788,"title":{},"content":{"416":{"position":[[406,8]]}},"keywords":{}}],["third",{"_index":1102,"title":{"1247":{"position":[[0,5]]},"1284":{"position":[[0,5]]}},"content":{"131":{"position":[[170,5]]},"412":{"position":[[1594,5]]},"793":{"position":[[1213,5]]},"902":{"position":[[457,5]]},"1102":{"position":[[258,5]]},"1284":{"position":[[0,5]]}},"keywords":{}}],["this.amount",{"_index":1138,"title":{},"content":{"143":{"position":[[586,12]]}},"keywords":{}}],["this.dbservic",{"_index":1097,"title":{},"content":{"130":{"position":[[457,14]]},"143":{"position":[[420,14],[601,14]]}},"keywords":{}}],["this.dbservice.db.heroes.find",{"_index":817,"title":{},"content":{"54":{"position":[[125,31]]}},"keywords":{}}],["this.dbservice.db.todos.find",{"_index":4733,"title":{},"content":{"825":{"position":[[1015,34]]}},"keywords":{}}],["this.find().exec",{"_index":6509,"title":{},"content":{"1311":{"position":[[914,19]]}},"keywords":{}}],["this.firstnam",{"_index":6503,"title":{},"content":{"1311":{"position":[[722,14]]}},"keywords":{}}],["this.hero",{"_index":816,"title":{},"content":{"54":{"position":[[110,12]]},"130":{"position":[[442,12]]}},"keywords":{}}],["this.nam",{"_index":4603,"title":{},"content":{"789":{"position":[[507,10]]},"791":{"position":[[385,9]]},"1311":{"position":[[1335,9]]}},"keywords":{}}],["this.sqlite.createconnect",{"_index":3806,"title":{},"content":{"661":{"position":[[1183,29]]}},"keywords":{}}],["this.your",{"_index":1591,"title":{},"content":{"262":{"position":[[137,9]]}},"keywords":{}}],["thishttps://rxdb.info/rx",{"_index":4205,"title":{},"content":{"749":{"position":[[5456,24]]}},"keywords":{}}],["thor",{"_index":794,"title":{},"content":{"52":{"position":[[215,7],[664,6]]},"539":{"position":[[215,7],[664,6]]},"599":{"position":[[233,7],[695,6]]}},"keywords":{}}],["thordoc",{"_index":3537,"title":{},"content":{"599":{"position":[[641,7]]}},"keywords":{}}],["thordoc.remov",{"_index":3538,"title":{},"content":{"599":{"position":[[721,17]]}},"keywords":{}}],["thoroughli",{"_index":1977,"title":{},"content":{"346":{"position":[[547,10]]},"399":{"position":[[483,10]]}},"keywords":{}}],["those",{"_index":1422,"title":{},"content":{"235":{"position":[[193,5]]},"330":{"position":[[91,5]]},"408":{"position":[[4171,5]]},"412":{"position":[[711,5]]},"421":{"position":[[330,5],[1123,5]]},"432":{"position":[[940,5]]},"445":{"position":[[1090,5]]},"570":{"position":[[574,5]]},"618":{"position":[[128,5]]},"898":{"position":[[4300,5]]},"981":{"position":[[1362,5]]}},"keywords":{}}],["though",{"_index":1846,"title":{},"content":{"303":{"position":[[1065,6]]},"354":{"position":[[1624,7]]},"360":{"position":[[652,6]]},"410":{"position":[[1228,6]]},"412":{"position":[[9696,6]]},"495":{"position":[[858,7]]},"1009":{"position":[[1,6]]},"1133":{"position":[[450,7],[591,6]]},"1157":{"position":[[179,6]]}},"keywords":{}}],["thread",{"_index":2254,"title":{"642":{"position":[[30,7]]},"1211":{"position":[[23,6]]}},"content":{"392":{"position":[[3475,7],[3691,6],[3799,7]]},"408":{"position":[[3911,7]]},"427":{"position":[[311,7]]},"454":{"position":[[895,6]]},"460":{"position":[[105,7],[649,6],[889,6],[953,7],[1219,7],[1387,6]]},"463":{"position":[[691,6],[936,6]]},"464":{"position":[[339,6]]},"465":{"position":[[200,6]]},"466":{"position":[[165,6]]},"467":{"position":[[136,6],[373,6]]},"470":{"position":[[398,6]]},"559":{"position":[[1136,6]]},"642":{"position":[[176,7]]},"721":{"position":[[216,6],[408,7]]},"801":{"position":[[203,7],[424,7],[452,6],[832,9],[980,7]]},"1068":{"position":[[438,7]]},"1089":{"position":[[82,6],[118,6]]},"1157":{"position":[[263,7]]},"1207":{"position":[[398,7],[557,7]]},"1211":{"position":[[156,7],[246,7],[420,6]]},"1213":{"position":[[181,7],[314,6]]},"1230":{"position":[[377,7]]},"1231":{"position":[[327,6],[397,6]]},"1239":{"position":[[230,6],[415,6]]},"1246":{"position":[[147,6]]},"1276":{"position":[[297,6]]}},"keywords":{}}],["thread.j",{"_index":6266,"title":{},"content":{"1226":{"position":[[385,9]]},"1264":{"position":[[295,9]]}},"keywords":{}}],["thread.sqlit",{"_index":3088,"title":{},"content":{"468":{"position":[[424,13]]}},"keywords":{}}],["threador",{"_index":2963,"title":{},"content":{"453":{"position":[[318,8]]}},"keywords":{}}],["three",{"_index":3785,"title":{},"content":{"661":{"position":[[249,5]]},"780":{"position":[[474,5]]},"871":{"position":[[26,5]]},"981":{"position":[[293,5]]}},"keywords":{}}],["threw",{"_index":4340,"title":{},"content":{"749":{"position":[[15501,5],[15635,5],[15767,5]]}},"keywords":{}}],["thrive",{"_index":1681,"title":{},"content":{"289":{"position":[[1501,6]]},"353":{"position":[[245,6]]}},"keywords":{}}],["throttl",{"_index":1146,"title":{},"content":{"146":{"position":[[105,11]]},"462":{"position":[[538,8]]}},"keywords":{}}],["through",{"_index":660,"title":{},"content":{"42":{"position":[[219,7]]},"81":{"position":[[36,7]]},"174":{"position":[[230,7]]},"205":{"position":[[292,7]]},"210":{"position":[[88,7]]},"283":{"position":[[326,7]]},"298":{"position":[[99,7]]},"381":{"position":[[249,7]]},"391":{"position":[[810,7]]},"398":{"position":[[105,7]]},"408":{"position":[[3931,7],[4511,7]]},"411":{"position":[[2409,7]]},"412":{"position":[[9939,7]]},"426":{"position":[[111,7]]},"432":{"position":[[604,7]]},"498":{"position":[[172,7]]},"504":{"position":[[30,7]]},"614":{"position":[[412,7]]},"617":{"position":[[1310,7]]},"662":{"position":[[864,7]]},"703":{"position":[[744,7]]},"709":{"position":[[707,7],[1171,7]]},"723":{"position":[[853,7]]},"836":{"position":[[1599,7]]},"849":{"position":[[43,7]]},"901":{"position":[[345,7]]},"1088":{"position":[[698,7]]},"1150":{"position":[[268,7]]},"1316":{"position":[[3840,7]]}},"keywords":{}}],["throughout",{"_index":1144,"title":{},"content":{"145":{"position":[[285,10]]},"367":{"position":[[383,10]]},"632":{"position":[[2782,11]]}},"keywords":{}}],["throughput",{"_index":1608,"title":{"622":{"position":[[0,11]]}},"content":{"265":{"position":[[918,10]]},"408":{"position":[[2231,10],[3138,10]]},"620":{"position":[[156,11],[769,10]]},"622":{"position":[[29,10],[78,10],[340,10],[438,10],[592,10]]},"641":{"position":[[189,10],[306,10]]}},"keywords":{}}],["throw",{"_index":1796,"title":{"1031":{"position":[[27,6]]}},"content":{"302":{"position":[[95,5]]},"556":{"position":[[482,5]]},"719":{"position":[[160,5]]},"761":{"position":[[272,5]]},"767":{"position":[[687,5]]},"768":{"position":[[697,5]]},"769":{"position":[[658,5]]},"911":{"position":[[104,5]]},"944":{"position":[[532,5]]},"948":{"position":[[506,6]]},"966":{"position":[[193,5],[780,5]]},"1014":{"position":[[58,6]]},"1031":{"position":[[30,6],[209,7]]},"1057":{"position":[[514,5]]},"1067":{"position":[[1144,5],[1374,5]]},"1084":{"position":[[459,5]]},"1085":{"position":[[3218,6]]},"1109":{"position":[[310,5]]},"1305":{"position":[[1091,5]]},"1307":{"position":[[457,5]]}},"keywords":{}}],["throwifmiss",{"_index":4162,"title":{},"content":{"749":{"position":[[2098,14],[2222,15]]}},"keywords":{}}],["thrown",{"_index":5489,"title":{},"content":{"990":{"position":[[952,6]]},"1207":{"position":[[758,6]]}},"keywords":{}}],["thu",{"_index":1581,"title":{},"content":{"255":{"position":[[1788,4]]},"521":{"position":[[576,5]]}},"keywords":{}}],["thunder",{"_index":796,"title":{},"content":{"52":{"position":[[238,8]]},"539":{"position":[[238,8]]},"599":{"position":[[256,8]]}},"keywords":{}}],["ti",{"_index":1303,"title":{},"content":{"202":{"position":[[34,4]]},"207":{"position":[[369,4]]},"902":{"position":[[433,4]]}},"keywords":{}}],["ticker",{"_index":3678,"title":{},"content":{"624":{"position":[[575,8]]},"626":{"position":[[281,7]]}},"keywords":{}}],["tier",{"_index":4937,"title":{},"content":{"871":{"position":[[32,4]]}},"keywords":{}}],["tight",{"_index":575,"title":{},"content":{"36":{"position":[[410,5]]},"1009":{"position":[[824,5]]}},"keywords":{}}],["tighter",{"_index":1725,"title":{},"content":{"298":{"position":[[683,7]]}},"keywords":{}}],["tightli",{"_index":2660,"title":{},"content":{"412":{"position":[[917,7]]},"839":{"position":[[420,7],[976,7]]}},"keywords":{}}],["time",{"_index":301,"title":{"70":{"position":[[15,4]]},"90":{"position":[[14,4]]},"93":{"position":[[33,5]]},"101":{"position":[[15,4]]},"136":{"position":[[5,4]]},"174":{"position":[[42,4]]},"217":{"position":[[36,5]]},"227":{"position":[[15,4]]},"264":{"position":[[50,4]]},"305":{"position":[[11,4]]},"312":{"position":[[8,4]]},"379":{"position":[[5,4]]},"463":{"position":[[15,5]]},"476":{"position":[[8,4]]},"490":{"position":[[5,4]]},"570":{"position":[[5,4]]},"632":{"position":[[5,4]]},"647":{"position":[[4,4]]},"869":{"position":[[43,5]]},"895":{"position":[[44,5]]}},"content":{"17":{"position":[[550,5]]},"23":{"position":[[327,5]]},"34":{"position":[[410,4]]},"35":{"position":[[391,4]]},"39":{"position":[[32,4],[506,4]]},"40":{"position":[[91,4],[492,4]]},"42":{"position":[[83,4]]},"53":{"position":[[122,4]]},"65":{"position":[[754,4],[782,4],[1299,5],[1388,4]]},"68":{"position":[[137,4]]},"69":{"position":[[102,4]]},"77":{"position":[[97,4]]},"83":{"position":[[111,4]]},"89":{"position":[[254,4]]},"90":{"position":[[46,4],[244,4]]},"93":{"position":[[67,5]]},"99":{"position":[[234,4]]},"101":{"position":[[20,4]]},"103":{"position":[[201,4]]},"109":{"position":[[250,4]]},"114":{"position":[[550,4]]},"121":{"position":[[126,4]]},"124":{"position":[[297,5]]},"126":{"position":[[313,4]]},"136":{"position":[[20,4],[167,5],[278,4]]},"140":{"position":[[288,4]]},"148":{"position":[[332,4]]},"151":{"position":[[182,4]]},"155":{"position":[[263,4]]},"156":{"position":[[316,4]]},"158":{"position":[[158,5]]},"162":{"position":[[507,4]]},"165":{"position":[[149,4]]},"168":{"position":[[112,5],[308,4]]},"170":{"position":[[300,4]]},"173":{"position":[[166,4],[375,4],[857,4],[941,4],[1074,4],[1643,5],[1809,4]]},"174":{"position":[[96,4],[406,4],[1974,4]]},"175":{"position":[[563,4]]},"179":{"position":[[413,4]]},"184":{"position":[[275,4]]},"185":{"position":[[285,4]]},"192":{"position":[[355,4]]},"198":{"position":[[119,4]]},"203":{"position":[[384,5]]},"205":{"position":[[274,4]]},"208":{"position":[[329,4]]},"217":{"position":[[70,4]]},"220":{"position":[[214,6],[288,4]]},"227":{"position":[[97,6],[323,6]]},"244":{"position":[[259,4]]},"252":{"position":[[349,5]]},"255":{"position":[[202,5],[1860,4]]},"263":{"position":[[506,4]]},"265":{"position":[[327,4],[897,4]]},"266":{"position":[[1060,6]]},"267":{"position":[[58,4],[137,4],[191,4],[293,4],[416,5],[575,4],[746,4],[846,4],[935,4],[1046,5],[1214,4],[1447,4],[1535,4]]},"275":{"position":[[158,4]]},"281":{"position":[[424,4]]},"282":{"position":[[400,4]]},"283":{"position":[[280,6],[313,4]]},"289":{"position":[[1263,4]]},"301":{"position":[[268,4]]},"305":{"position":[[291,5]]},"312":{"position":[[212,4]]},"316":{"position":[[376,5]]},"318":{"position":[[672,4]]},"321":{"position":[[541,4]]},"322":{"position":[[219,5]]},"323":{"position":[[41,4]]},"325":{"position":[[225,4]]},"328":{"position":[[20,4]]},"330":{"position":[[156,4]]},"335":{"position":[[845,4]]},"340":{"position":[[100,4]]},"342":{"position":[[130,6]]},"352":{"position":[[135,4]]},"353":{"position":[[698,4]]},"367":{"position":[[1025,5]]},"368":{"position":[[365,4]]},"375":{"position":[[373,4]]},"378":{"position":[[166,4]]},"385":{"position":[[136,6]]},"388":{"position":[[454,4]]},"392":{"position":[[5141,4]]},"394":{"position":[[1482,4]]},"400":{"position":[[14,4],[570,4]]},"401":{"position":[[24,4],[141,4],[788,4]]},"408":{"position":[[2591,4]]},"410":{"position":[[427,4],[1624,4]]},"411":{"position":[[1662,4],[2826,5],[3379,5],[3879,4],[4818,5]]},"412":{"position":[[4938,4],[5742,6],[6489,4],[8046,4],[11391,4]]},"418":{"position":[[306,4]]},"419":{"position":[[592,5],[1111,4]]},"420":{"position":[[388,5],[1346,4]]},"421":{"position":[[143,5],[245,4],[444,4]]},"434":{"position":[[184,5]]},"435":{"position":[[275,5]]},"445":{"position":[[306,4],[795,4],[855,4],[1140,4],[2396,4]]},"446":{"position":[[432,4],[483,4],[603,4],[755,5],[1415,4]]},"447":{"position":[[141,4]]},"450":{"position":[[223,4]]},"457":{"position":[[671,5]]},"458":{"position":[[162,5]]},"462":{"position":[[130,6]]},"463":{"position":[[206,4],[552,4],[648,4]]},"464":{"position":[[261,4],[572,5]]},"465":{"position":[[122,4]]},"466":{"position":[[88,4]]},"467":{"position":[[60,4]]},"468":{"position":[[649,5],[725,6]]},"469":{"position":[[784,4],[1029,4]]},"476":{"position":[[105,4],[210,4]]},"480":{"position":[[709,4]]},"483":{"position":[[140,4],[339,4]]},"489":{"position":[[763,5]]},"490":{"position":[[698,4]]},"491":{"position":[[263,5],[828,4],[1531,4]]},"497":{"position":[[18,4]]},"498":{"position":[[316,4]]},"500":{"position":[[547,6]]},"501":{"position":[[189,4]]},"502":{"position":[[115,4],[796,5],[1030,4]]},"504":{"position":[[1140,4]]},"509":{"position":[[80,5]]},"517":{"position":[[195,4]]},"518":{"position":[[497,4]]},"529":{"position":[[140,4]]},"530":{"position":[[412,4]]},"540":{"position":[[69,4]]},"566":{"position":[[404,4]]},"567":{"position":[[116,4]]},"569":{"position":[[91,4],[118,4],[200,5],[413,4],[469,4],[519,4],[646,4],[924,4],[1405,4],[1477,6]]},"571":{"position":[[1068,4],[1844,5]]},"574":{"position":[[275,4]]},"575":{"position":[[234,4]]},"582":{"position":[[256,4]]},"585":{"position":[[127,4]]},"589":{"position":[[122,5]]},"595":{"position":[[855,5]]},"600":{"position":[[69,4]]},"610":{"position":[[829,4]]},"611":{"position":[[258,4]]},"612":{"position":[[326,4],[577,4],[1664,7],[2264,5]]},"613":{"position":[[450,4]]},"614":{"position":[[18,4],[99,4]]},"617":{"position":[[868,5]]},"620":{"position":[[341,5]]},"621":{"position":[[129,4],[504,4]]},"626":{"position":[[238,4]]},"631":{"position":[[79,4]]},"636":{"position":[[6,5]]},"647":{"position":[[71,6],[194,4]]},"653":{"position":[[362,4]]},"654":{"position":[[270,5]]},"656":{"position":[[454,6]]},"660":{"position":[[214,4]]},"670":{"position":[[213,4]]},"679":{"position":[[190,5]]},"681":{"position":[[488,4]]},"691":{"position":[[87,5]]},"698":{"position":[[1088,4]]},"699":{"position":[[606,6],[998,4]]},"700":{"position":[[516,4]]},"702":{"position":[[742,5]]},"709":{"position":[[249,5]]},"723":{"position":[[990,4],[1073,4],[1173,5],[1574,5]]},"736":{"position":[[402,5]]},"739":{"position":[[712,5]]},"740":{"position":[[187,5]]},"746":{"position":[[499,7],[549,6]]},"749":{"position":[[21250,5]]},"752":{"position":[[227,5]]},"759":{"position":[[1070,4]]},"772":{"position":[[109,4]]},"776":{"position":[[380,4]]},"778":{"position":[[434,4]]},"780":{"position":[[85,4]]},"781":{"position":[[158,4]]},"783":{"position":[[48,5],[137,4],[444,4],[511,5],[596,4]]},"785":{"position":[[87,5]]},"796":{"position":[[401,4],[455,5],[481,5],[531,5],[1117,4]]},"799":{"position":[[256,4]]},"800":{"position":[[540,4],[709,4]]},"802":{"position":[[539,4],[794,5],[893,4]]},"806":{"position":[[329,4]]},"816":{"position":[[434,4]]},"820":{"position":[[401,4]]},"821":{"position":[[17,4],[101,5],[192,5],[223,4],[975,4]]},"826":{"position":[[581,4],[789,4],[887,4]]},"836":{"position":[[1474,4],[2308,4]]},"837":{"position":[[392,4],[537,5]]},"838":{"position":[[446,4]]},"839":{"position":[[213,5]]},"841":{"position":[[663,4],[975,4],[1536,4]]},"846":{"position":[[369,4],[887,4]]},"848":{"position":[[926,5]]},"854":{"position":[[1036,4],[1429,4]]},"860":{"position":[[145,4],[563,4],[595,4]]},"898":{"position":[[559,5],[1174,4]]},"901":{"position":[[28,4]]},"902":{"position":[[125,5]]},"903":{"position":[[21,4]]},"904":{"position":[[1069,5]]},"905":{"position":[[70,4]]},"906":{"position":[[391,5]]},"921":{"position":[[93,4]]},"944":{"position":[[118,6]]},"958":{"position":[[241,4],[449,4]]},"964":{"position":[[549,4]]},"975":{"position":[[482,4]]},"981":{"position":[[1648,5]]},"985":{"position":[[596,4]]},"986":{"position":[[113,4],[190,5]]},"987":{"position":[[76,4],[890,5]]},"988":{"position":[[866,4],[951,4],[3304,5],[4633,5]]},"990":{"position":[[105,5]]},"994":{"position":[[151,5]]},"995":{"position":[[1239,4],[1475,4],[1552,5],[1741,5]]},"996":{"position":[[481,4]]},"1002":{"position":[[67,4]]},"1008":{"position":[[159,4]]},"1010":{"position":[[151,5]]},"1030":{"position":[[46,5]]},"1039":{"position":[[115,4]]},"1069":{"position":[[114,5]]},"1085":{"position":[[247,4],[590,4],[906,5],[2580,5]]},"1087":{"position":[[205,4]]},"1114":{"position":[[351,5]]},"1115":{"position":[[631,5]]},"1119":{"position":[[100,4]]},"1124":{"position":[[1453,4]]},"1132":{"position":[[951,4]]},"1135":{"position":[[143,5]]},"1138":{"position":[[470,4]]},"1150":{"position":[[150,5]]},"1161":{"position":[[225,4]]},"1162":{"position":[[600,4]]},"1170":{"position":[[98,4],[253,4]]},"1171":{"position":[[222,4],[334,4]]},"1180":{"position":[[225,4]]},"1181":{"position":[[688,4]]},"1188":{"position":[[428,5]]},"1194":{"position":[[43,4],[125,4],[210,4]]},"1198":{"position":[[658,5],[2015,5]]},"1209":{"position":[[204,5]]},"1238":{"position":[[436,5]]},"1246":{"position":[[1819,5]]},"1251":{"position":[[342,4],[362,5]]},"1292":{"position":[[288,4],[642,4]]},"1295":{"position":[[1020,4]]},"1299":{"position":[[267,4]]},"1300":{"position":[[91,5],[546,5],[695,4],[946,4]]},"1301":{"position":[[138,5],[1407,4],[1554,5]]},"1304":{"position":[[1192,5]]},"1305":{"position":[[114,5]]},"1309":{"position":[[213,5],[277,4],[862,4]]},"1313":{"position":[[822,4]]},"1316":{"position":[[659,4],[1054,4],[2704,4],[2815,4],[3188,4]]},"1319":{"position":[[717,4]]},"1320":{"position":[[923,4]]},"1322":{"position":[[135,4]]},"1324":{"position":[[348,5]]}},"keywords":{}}],["time"",{"_index":5889,"title":{},"content":{"1085":{"position":[[459,10]]}},"keywords":{}}],["time)flex",{"_index":3117,"title":{},"content":{"479":{"position":[[187,13]]}},"keywords":{}}],["time.cli",{"_index":6541,"title":{},"content":{"1316":{"position":[[498,12]]}},"keywords":{}}],["time.th",{"_index":6543,"title":{},"content":{"1316":{"position":[[604,8]]}},"keywords":{}}],["time.to",{"_index":3836,"title":{},"content":{"668":{"position":[[329,7]]}},"keywords":{}}],["timeout",{"_index":456,"title":{},"content":{"28":{"position":[[313,7]]},"610":{"position":[[1216,7]]},"975":{"position":[[436,7],[590,7]]}},"keywords":{}}],["times.dur",{"_index":6561,"title":{},"content":{"1316":{"position":[[2943,12]]}},"keywords":{}}],["times.lack",{"_index":2885,"title":{},"content":{"427":{"position":[[860,10]]}},"keywords":{}}],["times.offlin",{"_index":3693,"title":{},"content":{"630":{"position":[[636,13]]}},"keywords":{}}],["timespan",{"_index":5347,"title":{},"content":{"948":{"position":[[76,9]]},"1194":{"position":[[250,8]]}},"keywords":{}}],["timestamp",{"_index":1889,"title":{},"content":{"314":{"position":[[848,10]]},"367":{"position":[[982,10],[1069,12]]},"495":{"position":[[617,9]]},"496":{"position":[[239,10]]},"639":{"position":[[510,10]]},"688":{"position":[[609,11]]},"854":{"position":[[1218,9]]},"875":{"position":[[1650,9]]},"898":{"position":[[311,9],[1159,9],[1239,9]]},"986":{"position":[[887,9]]},"988":{"position":[[2216,9]]},"990":{"position":[[532,10]]},"991":{"position":[[143,9]]},"1048":{"position":[[174,10],[233,9]]},"1085":{"position":[[3700,9]]},"1104":{"position":[[540,9]]},"1284":{"position":[[302,11]]},"1316":{"position":[[1830,9],[2077,10],[2213,9],[2297,10]]}},"keywords":{}}],["timeui",{"_index":1968,"title":{},"content":{"344":{"position":[[112,6]]}},"keywords":{}}],["tini",{"_index":2526,"title":{},"content":{"408":{"position":[[358,4]]}},"keywords":{}}],["tip",{"_index":1875,"title":{"794":{"position":[[12,4]]}},"content":{"306":{"position":[[298,4]]},"793":{"position":[[1316,4]]}},"keywords":{}}],["titl",{"_index":767,"title":{},"content":{"51":{"position":[[276,6]]},"209":{"position":[[403,6],[525,6]]},"211":{"position":[[364,6]]},"255":{"position":[[747,6],[869,6]]},"259":{"position":[[46,6]]},"314":{"position":[[712,6]]},"315":{"position":[[687,6]]},"316":{"position":[[154,6]]},"334":{"position":[[599,6]]},"480":{"position":[[512,6],[619,6]]},"482":{"position":[[805,6]]},"538":{"position":[[577,6]]},"554":{"position":[[1297,6]]},"562":{"position":[[285,6]]},"564":{"position":[[740,6]]},"579":{"position":[[607,6]]},"598":{"position":[[584,6]]},"632":{"position":[[1497,6],[1619,6]]},"638":{"position":[[578,6]]},"639":{"position":[[338,6]]},"808":{"position":[[137,6]]},"862":{"position":[[631,6]]},"904":{"position":[[836,6],[958,6],[1097,8],[1190,6]]},"1078":{"position":[[211,6]]},"1080":{"position":[[41,6]]},"1158":{"position":[[336,6],[443,6],[516,8],[601,6]]},"1311":{"position":[[294,6]]}},"keywords":{}}],["today",{"_index":2532,"title":{},"content":{"408":{"position":[[850,6],[4619,6]]},"498":{"position":[[685,5]]},"702":{"position":[[879,5]]},"783":{"position":[[191,5]]}},"keywords":{}}],["today'",{"_index":1624,"title":{},"content":{"267":{"position":[[1666,7]]},"289":{"position":[[1511,7]]},"410":{"position":[[1478,7]]}},"keywords":{}}],["todo",{"_index":3987,"title":{},"content":{"709":{"position":[[309,4]]},"825":{"position":[[712,5]]},"904":{"position":[[93,4],[118,4],[817,6],[843,5],[1180,5]]}},"keywords":{}}],["todoslistcompon",{"_index":4730,"title":{},"content":{"825":{"position":[[901,18]]}},"keywords":{}}],["todossign",{"_index":4732,"title":{},"content":{"825":{"position":[[1001,11]]}},"keywords":{}}],["todossignal();"",{"_index":4728,"title":{},"content":{"825":{"position":[[820,20]]}},"keywords":{}}],["togeth",{"_index":368,"title":{},"content":{"22":{"position":[[123,8]]},"188":{"position":[[302,8]]},"404":{"position":[[634,8],[869,8]]},"661":{"position":[[1430,8]]},"668":{"position":[[94,8]]},"685":{"position":[[248,8]]},"701":{"position":[[783,8]]},"711":{"position":[[1927,8]]},"754":{"position":[[30,8]]},"761":{"position":[[124,8]]},"772":{"position":[[1907,8]]},"829":{"position":[[3198,8]]},"1058":{"position":[[108,8]]},"1130":{"position":[[342,8]]},"1238":{"position":[[167,8]]},"1243":{"position":[[104,8]]},"1270":{"position":[[516,8]]},"1305":{"position":[[498,8]]}},"keywords":{}}],["toggl",{"_index":5513,"title":{},"content":{"995":{"position":[[1791,6]]}},"keywords":{}}],["toggleondocumentvis",{"_index":5543,"title":{"1003":{"position":[[0,24]]}},"content":{"1003":{"position":[[409,24]]}},"keywords":{}}],["tojson",{"_index":5614,"title":{"1051":{"position":[[0,9]]}},"content":{"1018":{"position":[[713,8]]},"1052":{"position":[[9,8]]},"1085":{"position":[[1974,8]]}},"keywords":{}}],["token",{"_index":3339,"title":{},"content":{"551":{"position":[[255,6]]},"639":{"position":[[159,7]]},"848":{"position":[[54,5],[446,5],[907,5]]},"1104":{"position":[[739,5]]},"1305":{"position":[[702,6]]}},"keywords":{}}],["token?"",{"_index":1539,"title":{},"content":{"245":{"position":[[164,12]]}},"keywords":{}}],["tokyo",{"_index":6530,"title":{},"content":{"1315":{"position":[[328,6],[416,7]]}},"keywords":{}}],["toler",{"_index":2709,"title":{},"content":{"412":{"position":[[6347,8]]},"421":{"position":[[914,8]]},"569":{"position":[[486,8]]},"1247":{"position":[[707,8]]}},"keywords":{}}],["tomutablejson",{"_index":5720,"title":{"1052":{"position":[[0,16]]}},"content":{"1051":{"position":[[132,15]]}},"keywords":{}}],["took",{"_index":2965,"title":{},"content":{"453":{"position":[[856,4]]}},"keywords":{}}],["tool",{"_index":304,"title":{},"content":{"18":{"position":[[34,5]]},"22":{"position":[[112,5]]},"37":{"position":[[134,5]]},"38":{"position":[[181,6]]},"65":{"position":[[1990,5]]},"116":{"position":[[228,5]]},"143":{"position":[[36,4]]},"151":{"position":[[349,5]]},"159":{"position":[[71,5]]},"177":{"position":[[254,5]]},"232":{"position":[[213,8]]},"254":{"position":[[201,4]]},"267":{"position":[[921,4]]},"286":{"position":[[235,5]]},"301":{"position":[[439,5],[681,5]]},"346":{"position":[[667,5]]},"362":{"position":[[726,5]]},"364":{"position":[[369,5]]},"375":{"position":[[504,5],[634,5]]},"380":{"position":[[356,6]]},"382":{"position":[[309,5]]},"408":{"position":[[4277,8],[4383,7]]},"411":{"position":[[2587,6]]},"412":{"position":[[1831,5],[2754,5],[2912,5],[13240,7],[14471,5],[14808,5],[15217,5]]},"418":{"position":[[151,5]]},"419":{"position":[[111,5],[1036,5]]},"420":{"position":[[227,5],[511,6],[922,7],[1406,5]]},"441":{"position":[[75,4]]},"445":{"position":[[1878,5]]},"446":{"position":[[556,6],[981,5]]},"494":{"position":[[63,6]]},"510":{"position":[[512,4]]},"548":{"position":[[450,4]]},"576":{"position":[[151,5]]},"608":{"position":[[448,4]]},"613":{"position":[[376,4]]},"696":{"position":[[555,4]]},"821":{"position":[[22,5]]},"836":{"position":[[1988,5]]},"1102":{"position":[[94,5],[270,6]]},"1216":{"position":[[92,4]]},"1251":{"position":[[59,7]]},"1282":{"position":[[977,5]]}},"keywords":{}}],["toolkit",{"_index":1153,"title":{},"content":{"148":{"position":[[507,8]]},"318":{"position":[[575,7]]},"388":{"position":[[304,7]]}},"keywords":{}}],["top",{"_index":234,"title":{"1122":{"position":[[17,3]]},"1131":{"position":[[17,3]]},"1299":{"position":[[13,3]]}},"content":{"14":{"position":[[1007,3]]},"29":{"position":[[255,3]]},"120":{"position":[[100,3]]},"131":{"position":[[407,3]]},"155":{"position":[[143,3]]},"161":{"position":[[164,3]]},"162":{"position":[[186,3]]},"181":{"position":[[41,3]]},"318":{"position":[[492,3]]},"322":{"position":[[48,3]]},"353":{"position":[[459,3]]},"387":{"position":[[62,3]]},"394":{"position":[[1293,4]]},"412":{"position":[[1904,3],[2708,3]]},"433":{"position":[[516,3]]},"445":{"position":[[115,3]]},"459":{"position":[[336,3]]},"507":{"position":[[31,3]]},"513":{"position":[[135,3]]},"524":{"position":[[244,3]]},"548":{"position":[[176,3]]},"555":{"position":[[361,3],[598,3]]},"608":{"position":[[176,3]]},"611":{"position":[[1307,3]]},"613":{"position":[[1041,3]]},"625":{"position":[[102,3]]},"703":{"position":[[541,3]]},"705":{"position":[[1153,3],[1356,3]]},"724":{"position":[[375,3]]},"742":{"position":[[77,3]]},"749":{"position":[[2479,3],[17347,3],[17463,3],[18332,3],[21813,3]]},"772":{"position":[[365,3]]},"776":{"position":[[397,3]]},"872":{"position":[[3013,3]]},"875":{"position":[[189,3]]},"898":{"position":[[1753,3]]},"962":{"position":[[15,3]]},"1020":{"position":[[26,3]]},"1084":{"position":[[584,3]]},"1085":{"position":[[858,3],[965,3],[1677,3],[1746,3],[1787,3],[1997,3],[2030,3],[2226,3],[2418,3]]},"1090":{"position":[[286,3]]},"1095":{"position":[[180,3]]},"1100":{"position":[[4,3]]},"1108":{"position":[[603,3]]},"1114":{"position":[[34,3]]},"1117":{"position":[[238,3]]},"1123":{"position":[[674,3],[768,3]]},"1124":{"position":[[534,3],[997,3]]},"1125":{"position":[[770,3]]},"1132":{"position":[[15,3]]},"1165":{"position":[[170,3]]},"1237":{"position":[[289,3]]},"1316":{"position":[[1780,3]]},"1320":{"position":[[643,3],[707,3],[731,3],[766,3]]}},"keywords":{}}],["topic",{"_index":1365,"title":{},"content":{"210":{"position":[[310,6],[322,5],[662,5]]},"261":{"position":[[383,6],[430,5],[1070,5]]},"390":{"position":[[723,6]]},"422":{"position":[[20,5]]},"461":{"position":[[1480,6]]},"567":{"position":[[55,6]]},"904":{"position":[[1543,5],[1908,5],[1963,5],[2049,5],[2099,5],[2250,6]]},"1121":{"position":[[653,6]]},"1324":{"position":[[1085,5]]}},"keywords":{}}],["topic.inc&switch",{"_index":2863,"title":{},"content":{"422":{"position":[[249,21]]}},"keywords":{}}],["tosign",{"_index":830,"title":{},"content":{"55":{"position":[[166,9],[304,8]]},"1118":{"position":[[424,8]]}},"keywords":{}}],["tosignal(ob",{"_index":6004,"title":{},"content":{"1118":{"position":[[584,13]]}},"keywords":{}}],["tosignal(observ",{"_index":841,"title":{},"content":{"55":{"position":[[537,21]]}},"keywords":{}}],["total",{"_index":1710,"title":{},"content":{"298":{"position":[[237,5]]},"300":{"position":[[178,5],[350,5]]},"411":{"position":[[328,5]]},"461":{"position":[[1194,5]]},"696":{"position":[[1335,5],[1986,5]]},"711":{"position":[[2380,7]]},"752":{"position":[[1179,6]]}},"keywords":{}}],["totalspac",{"_index":1772,"title":{},"content":{"300":{"position":[[273,10],[375,12]]}},"keywords":{}}],["touch",{"_index":2129,"title":{},"content":{"369":{"position":[[1459,8]]},"698":{"position":[[2364,8]]}},"keywords":{}}],["toward",{"_index":5277,"title":{},"content":{"912":{"position":[[104,7]]}},"keywords":{}}],["trace",{"_index":3900,"title":{},"content":{"689":{"position":[[393,5]]}},"keywords":{}}],["track",{"_index":972,"title":{"676":{"position":[[12,8]]}},"content":{"75":{"position":[[104,8]]},"106":{"position":[[113,8]]},"129":{"position":[[368,6]]},"174":{"position":[[1088,8]]},"235":{"position":[[66,5]]},"250":{"position":[[249,5]]},"301":{"position":[[311,5]]},"412":{"position":[[2088,8]]},"450":{"position":[[163,9]]},"496":{"position":[[253,5]]},"635":{"position":[[115,6]]},"676":{"position":[[74,8],[118,5]]},"975":{"position":[[110,6]]},"1304":{"position":[[504,5]]}},"keywords":{}}],["traction",{"_index":2522,"title":{"408":{"position":[[27,9]]}},"content":{},"keywords":{}}],["trade",{"_index":2421,"title":{},"content":{"398":{"position":[[3133,5]]},"401":{"position":[[821,5]]},"412":{"position":[[110,5],[3955,5]]},"611":{"position":[[331,7]]},"689":{"position":[[81,5]]},"699":{"position":[[662,7]]},"1162":{"position":[[1148,5]]},"1324":{"position":[[790,5]]}},"keywords":{}}],["tradeoff",{"_index":2389,"title":{"1248":{"position":[[5,9]]}},"content":{"398":{"position":[[195,9]]},"962":{"position":[[267,9]]},"1067":{"position":[[1057,8]]}},"keywords":{}}],["tradit",{"_index":991,"title":{"355":{"position":[[16,11]]},"413":{"position":[[16,11]]}},"content":{"83":{"position":[[286,11]]},"96":{"position":[[81,11]]},"126":{"position":[[203,11]]},"173":{"position":[[284,11]]},"210":{"position":[[729,11]]},"219":{"position":[[46,11]]},"224":{"position":[[59,11]]},"239":{"position":[[196,11]]},"265":{"position":[[255,11],[592,11],[618,11]]},"276":{"position":[[123,11]]},"278":{"position":[[137,11]]},"281":{"position":[[351,11]]},"290":{"position":[[112,11]]},"351":{"position":[[1,11]]},"390":{"position":[[302,11]]},"395":{"position":[[149,11]]},"410":{"position":[[2244,11]]},"411":{"position":[[1062,11]]},"420":{"position":[[499,11],[599,11]]},"477":{"position":[[6,11]]},"515":{"position":[[76,11]]},"520":{"position":[[164,11]]},"567":{"position":[[1009,11]]},"576":{"position":[[13,11]]},"602":{"position":[[193,11]]},"610":{"position":[[211,11]]},"611":{"position":[[402,11]]},"624":{"position":[[243,11]]},"630":{"position":[[6,11]]}},"keywords":{}}],["tradition",{"_index":5249,"title":{},"content":{"903":{"position":[[1,14]]}},"keywords":{}}],["traffic",{"_index":3109,"title":{},"content":{"477":{"position":[[112,7]]},"610":{"position":[[710,7]]},"627":{"position":[[136,7]]},"902":{"position":[[917,7]]}},"keywords":{}}],["train",{"_index":2196,"title":{},"content":{"390":{"position":[[1042,5]]},"391":{"position":[[824,7]]}},"keywords":{}}],["trait",{"_index":1929,"title":{},"content":{"327":{"position":[[30,6]]}},"keywords":{}}],["transact",{"_index":501,"title":{"1258":{"position":[[7,13]]},"1298":{"position":[[9,11]]},"1303":{"position":[[0,13]]},"1304":{"position":[[23,13]]},"1313":{"position":[[0,12]]},"1314":{"position":[[0,12]]}},"content":{"31":{"position":[[302,12]]},"33":{"position":[[146,12]]},"45":{"position":[[219,12]]},"353":{"position":[[125,11]]},"354":{"position":[[1196,11],[1262,11]]},"358":{"position":[[976,13]]},"376":{"position":[[392,11]]},"412":{"position":[[13607,12]]},"459":{"position":[[623,11]]},"497":{"position":[[291,12],[410,12]]},"506":{"position":[[208,13]]},"533":{"position":[[111,13]]},"593":{"position":[[111,13]]},"700":{"position":[[984,12]]},"703":{"position":[[990,12],[1359,12]]},"705":{"position":[[1072,11]]},"793":{"position":[[909,12]]},"802":{"position":[[754,12]]},"863":{"position":[[494,12]]},"875":{"position":[[5670,13],[5753,11]]},"1044":{"position":[[145,13]]},"1072":{"position":[[1313,13]]},"1093":{"position":[[542,12]]},"1258":{"position":[[119,13]]},"1297":{"position":[[87,12],[115,11],[234,11],[535,12],[577,11]]},"1298":{"position":[[28,12],[150,12]]},"1299":{"position":[[12,11],[361,12]]},"1304":{"position":[[20,13],[47,12],[156,11],[307,11],[333,11],[446,12],[528,12],[565,12],[678,11],[807,11],[928,11],[1214,12],[1673,13]]},"1305":{"position":[[17,12]]},"1313":{"position":[[21,12],[148,12],[329,11],[703,11],[785,11]]},"1314":{"position":[[196,12],[267,11]]},"1315":{"position":[[1192,12]]},"1316":{"position":[[3751,12],[3783,12]]},"1324":{"position":[[862,13],[984,12]]}},"keywords":{}}],["transaction.commit",{"_index":6464,"title":{},"content":{"1298":{"position":[[295,20],[318,20]]}},"keywords":{}}],["transaction.objectstore('product",{"_index":2997,"title":{},"content":{"459":{"position":[[697,36]]}},"keywords":{}}],["transaction.y",{"_index":6575,"title":{},"content":{"1323":{"position":[[66,15],[144,15]]}},"keywords":{}}],["transaction_set",{"_index":6429,"title":{},"content":{"1294":{"position":[[868,22]]}},"keywords":{}}],["transfer",{"_index":579,"title":{"983":{"position":[[23,8]]}},"content":{"37":{"position":[[40,8]]},"236":{"position":[[268,8]]},"283":{"position":[[251,8]]},"408":{"position":[[2264,8],[2920,12],[3076,11],[3384,8]]},"411":{"position":[[66,8]]},"412":{"position":[[6194,8],[6279,8]]},"611":{"position":[[268,8]]},"613":{"position":[[185,8]]},"700":{"position":[[797,8]]},"780":{"position":[[393,8]]},"782":{"position":[[366,11]]},"981":{"position":[[890,8]]},"983":{"position":[[26,12]]},"1213":{"position":[[132,12]]},"1214":{"position":[[390,8]]}},"keywords":{}}],["transform",{"_index":1183,"title":{"887":{"position":[[0,12]]}},"content":{"162":{"position":[[388,14]]},"212":{"position":[[304,15]]},"252":{"position":[[251,15]]},"303":{"position":[[480,9]]},"350":{"position":[[344,15]]},"360":{"position":[[145,15]]},"361":{"position":[[488,9]]},"390":{"position":[[969,11],[1112,11]]},"391":{"position":[[350,10]]},"392":{"position":[[846,11]]},"401":{"position":[[110,12]]},"408":{"position":[[5390,15]]},"451":{"position":[[461,12]]},"457":{"position":[[489,9]]},"459":{"position":[[1135,9]]},"483":{"position":[[361,10]]},"501":{"position":[[278,14]]},"561":{"position":[[108,9]]},"602":{"position":[[38,10]]},"630":{"position":[[951,10]]},"636":{"position":[[242,9]]},"724":{"position":[[763,10],[926,12]]},"749":{"position":[[12102,10]]},"751":{"position":[[357,11],[570,10],[981,10],[1672,10]]},"887":{"position":[[167,9]]},"986":{"position":[[608,9]]},"1071":{"position":[[256,9]]},"1085":{"position":[[512,9]]},"1208":{"position":[[1278,9]]},"1319":{"position":[[314,10]]}},"keywords":{}}],["transformations.transact",{"_index":2028,"title":{},"content":{"354":{"position":[[1117,27]]}},"keywords":{}}],["transformers.j",{"_index":2180,"title":{"389":{"position":[[36,15]]}},"content":{"391":{"position":[[134,15]]}},"keywords":{}}],["transient",{"_index":2905,"title":{},"content":{"430":{"position":[[1134,9]]}},"keywords":{}}],["transit",{"_index":1211,"title":{},"content":{"173":{"position":[[2827,10]]},"262":{"position":[[508,10]]},"367":{"position":[[345,11]]},"445":{"position":[[1916,10]]},"502":{"position":[[1310,10]]},"556":{"position":[[1721,8]]}},"keywords":{}}],["translat",{"_index":1316,"title":{},"content":{"204":{"position":[[73,9]]},"828":{"position":[[261,9]]}},"keywords":{}}],["transmiss",{"_index":1048,"title":{},"content":{"108":{"position":[[124,14]]},"621":{"position":[[456,13]]},"624":{"position":[[1263,13]]},"990":{"position":[[352,14]]},"1132":{"position":[[1149,12]]}},"keywords":{}}],["transpar",{"_index":1122,"title":{},"content":{"139":{"position":[[173,13]]},"714":{"position":[[287,11]]},"1151":{"position":[[15,11]]},"1178":{"position":[[15,11]]}},"keywords":{}}],["transpil",{"_index":4067,"title":{},"content":{"728":{"position":[[28,10]]},"1322":{"position":[[60,10]]}},"keywords":{}}],["transport",{"_index":1905,"title":{},"content":{"316":{"position":[[538,9]]},"491":{"position":[[558,10]]}},"keywords":{}}],["travel",{"_index":5238,"title":{},"content":{"902":{"position":[[58,7]]}},"keywords":{}}],["travers",{"_index":5236,"title":{},"content":{"901":{"position":[[265,9]]}},"keywords":{}}],["treat",{"_index":497,"title":{},"content":{"31":{"position":[[140,6]]},"419":{"position":[[340,5]]},"861":{"position":[[2091,5]]}},"keywords":{}}],["treatment",{"_index":6057,"title":{},"content":{"1140":{"position":[[242,9]]}},"keywords":{}}],["tree",{"_index":218,"title":{},"content":{"14":{"position":[[528,4]]},"24":{"position":[[434,4],[766,4]]},"411":{"position":[[3535,5]]},"571":{"position":[[809,4]]},"1092":{"position":[[88,4],[634,4]]},"1093":{"position":[[52,4]]},"1198":{"position":[[507,5]]}},"keywords":{}}],["trend",{"_index":2827,"title":{"420":{"position":[[51,7]]}},"content":{},"keywords":{}}],["tri",{"_index":1697,"title":{"742":{"position":[[0,3]]},"798":{"position":[[0,3]]}},"content":{"296":{"position":[[1,3]]},"302":{"position":[[158,6],[679,3]]},"354":{"position":[[1365,5]]},"358":{"position":[[269,3]]},"388":{"position":[[50,3]]},"393":{"position":[[694,3]]},"402":{"position":[[1837,3]]},"440":{"position":[[250,6]]},"461":{"position":[[1369,5]]},"535":{"position":[[646,6]]},"595":{"position":[[673,6]]},"666":{"position":[[295,3]]},"710":{"position":[[906,3]]},"712":{"position":[[192,3]]},"749":{"position":[[16735,5]]},"798":{"position":[[120,3]]},"816":{"position":[[207,5]]},"836":{"position":[[1047,3]]},"838":{"position":[[1564,3]]},"873":{"position":[[1,3]]},"879":{"position":[[307,5]]},"904":{"position":[[247,3]]},"948":{"position":[[142,5]]},"1007":{"position":[[238,5]]},"1031":{"position":[[146,3]]},"1271":{"position":[[179,3]]}},"keywords":{}}],["trial",{"_index":4426,"title":{},"content":{"749":{"position":[[23206,5],[23332,5],[23464,5]]},"1235":{"position":[[344,5]]},"1271":{"position":[[71,5],[265,5],[1052,5],[1096,5],[1738,5]]},"1282":{"position":[[735,5]]}},"keywords":{}}],["trick",{"_index":1819,"title":{"303":{"position":[[0,6]]}},"content":{"303":{"position":[[1058,6]]}},"keywords":{}}],["tricki",{"_index":3576,"title":{},"content":{"611":{"position":[[1150,7]]}},"keywords":{}}],["trickl",{"_index":3584,"title":{},"content":{"612":{"position":[[527,8]]}},"keywords":{}}],["trigger",{"_index":751,"title":{},"content":{"50":{"position":[[94,7]]},"140":{"position":[[235,10]]},"168":{"position":[[204,7]]},"196":{"position":[[189,10]]},"226":{"position":[[294,7]]},"326":{"position":[[99,7]]},"344":{"position":[[99,7]]},"354":{"position":[[551,9]]},"410":{"position":[[2030,7]]},"427":{"position":[[1336,7]]},"477":{"position":[[41,8]]},"496":{"position":[[797,8]]},"518":{"position":[[335,7]]},"630":{"position":[[49,8]]},"631":{"position":[[269,7]]},"829":{"position":[[2828,7]]},"857":{"position":[[587,8]]},"898":{"position":[[1256,7]]},"996":{"position":[[1,8],[500,7]]},"1177":{"position":[[536,7]]}},"keywords":{}}],["triggerstrigg",{"_index":4519,"title":{},"content":{"765":{"position":[[227,18]]}},"keywords":{}}],["trip",{"_index":1012,"title":{},"content":{"92":{"position":[[131,5]]},"173":{"position":[[2030,6]]},"220":{"position":[[124,5]]},"224":{"position":[[276,5]]},"375":{"position":[[320,5]]},"408":{"position":[[2339,4],[2586,4],[2905,5],[3309,4]]},"410":{"position":[[117,4]]},"411":{"position":[[350,4]]},"415":{"position":[[292,4]]},"574":{"position":[[433,5]]},"630":{"position":[[631,4]]},"902":{"position":[[120,4]]}},"keywords":{}}],["trips.autom",{"_index":3157,"title":{},"content":{"487":{"position":[[255,15]]}},"keywords":{}}],["trivial",{"_index":2099,"title":{},"content":{"362":{"position":[[649,7]]},"559":{"position":[[143,7]]},"668":{"position":[[237,7]]},"1317":{"position":[[128,8]]}},"keywords":{}}],["troublesom",{"_index":3985,"title":{},"content":{"708":{"position":[[501,12]]}},"keywords":{}}],["true",{"_index":124,"title":{"206":{"position":[[3,4]]},"253":{"position":[[3,4]]}},"content":{"8":{"position":[[676,5]]},"55":{"position":[[599,4]]},"209":{"position":[[330,5],[349,4],[1257,4]]},"255":{"position":[[674,5],[693,4],[1559,4]]},"314":{"position":[[577,4]]},"316":{"position":[[204,5],[416,5]]},"334":{"position":[[478,5],[518,4]]},"354":{"position":[[1375,4]]},"391":{"position":[[710,5]]},"408":{"position":[[210,4]]},"412":{"position":[[14538,4]]},"481":{"position":[[819,4]]},"483":{"position":[[92,4]]},"522":{"position":[[589,5],[638,5],[657,5]]},"579":{"position":[[487,5],[527,4]]},"632":{"position":[[2589,5]]},"634":{"position":[[319,5]]},"639":{"position":[[261,4],[387,5]]},"647":{"position":[[320,5],[370,4]]},"648":{"position":[[12,4],[130,4],[167,5],[219,4]]},"649":{"position":[[175,4]]},"653":{"position":[[999,5],[1238,5],[1253,5],[1482,4]]},"678":{"position":[[340,4],[363,4]]},"684":{"position":[[72,5],[210,4]]},"696":{"position":[[1645,4]]},"700":{"position":[[336,5]]},"703":{"position":[[1606,4]]},"720":{"position":[[69,4],[218,4],[229,5]]},"734":{"position":[[629,5],[650,5]]},"739":{"position":[[398,4]]},"746":{"position":[[466,5],[481,5],[556,5],[661,5],[692,5],[717,5],[730,5],[743,5],[755,5],[780,5],[812,5],[827,5],[840,5],[854,4]]},"749":{"position":[[691,4],[2238,4],[14865,4]]},"759":{"position":[[787,4]]},"767":{"position":[[491,6],[887,6]]},"768":{"position":[[483,6],[891,6]]},"769":{"position":[[438,6],[858,6]]},"804":{"position":[[90,5]]},"825":{"position":[[737,5]]},"846":{"position":[[324,4],[413,5]]},"854":{"position":[[1079,5]]},"858":{"position":[[424,4]]},"861":{"position":[[2133,4]]},"866":{"position":[[844,5]]},"872":{"position":[[1123,4],[2634,4],[4588,5]]},"875":{"position":[[8195,4],[9614,4]]},"878":{"position":[[563,4]]},"885":{"position":[[2161,5],[2275,5]]},"886":{"position":[[1980,5],[2028,5],[2046,5]]},"898":{"position":[[3452,5]]},"907":{"position":[[208,4],[357,5]]},"916":{"position":[[230,4],[241,5]]},"934":{"position":[[615,5]]},"939":{"position":[[296,4]]},"957":{"position":[[9,4]]},"960":{"position":[[484,5],[533,5],[552,5]]},"964":{"position":[[140,5]]},"965":{"position":[[347,5]]},"966":{"position":[[324,5],[363,4],[628,4],[746,4]]},"967":{"position":[[213,4],[331,4]]},"971":{"position":[[119,4]]},"978":{"position":[[9,4]]},"986":{"position":[[401,5]]},"988":{"position":[[839,5],[854,5],[1126,5],[1281,5],[1463,5],[1631,4],[1650,5],[5167,5]]},"993":{"position":[[485,4],[622,4]]},"995":{"position":[[203,4],[231,4],[838,4],[866,4]]},"1000":{"position":[[9,4]]},"1001":{"position":[[9,4]]},"1003":{"position":[[434,5]]},"1013":{"position":[[167,4],[390,4],[542,4],[740,4]]},"1045":{"position":[[276,4]]},"1048":{"position":[[503,4],[599,5]]},"1049":{"position":[[251,4]]},"1050":{"position":[[154,4]]},"1051":{"position":[[336,4]]},"1053":{"position":[[9,4]]},"1063":{"position":[[9,4],[208,4]]},"1067":{"position":[[2432,5],[2453,4]]},"1068":{"position":[[96,4]]},"1070":{"position":[[9,4]]},"1074":{"position":[[1374,5],[1545,5],[1924,4]]},"1078":{"position":[[143,5],[164,5]]},"1080":{"position":[[93,5]]},"1083":{"position":[[613,4]]},"1088":{"position":[[588,4]]},"1090":{"position":[[1342,4]]},"1106":{"position":[[636,5]]},"1126":{"position":[[466,4],[550,5],[625,4]]},"1148":{"position":[[1053,4]]},"1164":{"position":[[544,5],[772,5],[817,5],[839,5],[1124,5]]},"1165":{"position":[[435,4]]},"1170":{"position":[[182,4]]},"1171":{"position":[[257,4]]},"1175":{"position":[[63,4]]},"1185":{"position":[[287,5],[360,5]]},"1208":{"position":[[857,5],[988,5]]},"1213":{"position":[[553,5],[721,4]]},"1266":{"position":[[638,5],[968,5]]},"1282":{"position":[[164,4]]},"1294":{"position":[[1433,5],[1716,5]]},"1296":{"position":[[1409,5],[1574,5]]},"1311":{"position":[[385,5]]},"1321":{"position":[[42,4]]}},"keywords":{}}],["true"",{"_index":4210,"title":{},"content":{"749":{"position":[[5830,11],[5892,10]]}},"keywords":{}}],["true/fals",{"_index":5532,"title":{},"content":{"1000":{"position":[[160,10]]},"1001":{"position":[[77,10]]}},"keywords":{}}],["truli",{"_index":1562,"title":{},"content":{"253":{"position":[[128,5]]},"263":{"position":[[172,5]]},"303":{"position":[[1116,5]]},"408":{"position":[[5443,5]]},"411":{"position":[[5218,5]]},"412":{"position":[[10404,5],[14713,5]]},"483":{"position":[[1271,5]]},"491":{"position":[[1520,5]]},"1085":{"position":[[811,5]]}},"keywords":{}}],["truncat",{"_index":6219,"title":{},"content":{"1208":{"position":[[1623,8]]}},"keywords":{}}],["trust",{"_index":2728,"title":{},"content":{"412":{"position":[[8187,7]]},"417":{"position":[[406,5]]},"556":{"position":[[1928,6]]},"697":{"position":[[85,7]]},"897":{"position":[[589,7]]},"898":{"position":[[2845,7]]},"991":{"position":[[47,8]]}},"keywords":{}}],["truth",{"_index":2617,"title":{},"content":{"411":{"position":[[2054,5],[4005,5]]},"412":{"position":[[5620,7]]},"418":{"position":[[821,5]]},"478":{"position":[[249,6]]},"700":{"position":[[55,6],[172,6]]},"705":{"position":[[591,5]]}},"keywords":{}}],["truthi",{"_index":5458,"title":{},"content":{"988":{"position":[[2103,6]]}},"keywords":{}}],["try/catch",{"_index":1800,"title":{},"content":{"302":{"position":[[388,9]]}},"keywords":{}}],["tryout",{"_index":5261,"title":{},"content":{"904":{"position":[[2672,8]]},"906":{"position":[[335,8]]}},"keywords":{}}],["tryouts.in",{"_index":6280,"title":{},"content":{"1235":{"position":[[371,10]]}},"keywords":{}}],["ts",{"_index":1380,"title":{},"content":{"211":{"position":[[307,2]]},"1266":{"position":[[881,6]]}},"keywords":{}}],["tsx",{"_index":6317,"title":{},"content":{"1266":{"position":[[749,10],[872,8]]}},"keywords":{}}],["tune",{"_index":1551,"title":{},"content":{"250":{"position":[[302,4]]},"383":{"position":[[496,4]]},"412":{"position":[[9476,6],[10737,6]]},"644":{"position":[[215,6]]},"1164":{"position":[[38,4]]}},"keywords":{}}],["tunnel",{"_index":3972,"title":{},"content":{"703":{"position":[[728,6]]}},"keywords":{}}],["turn",{"_index":2918,"title":{},"content":{"436":{"position":[[87,4]]},"614":{"position":[[480,4]]},"871":{"position":[[89,4]]}},"keywords":{}}],["turnkey",{"_index":2662,"title":{},"content":{"412":{"position":[[1202,7]]}},"keywords":{}}],["tutori",{"_index":106,"title":{},"content":{"8":{"position":[[140,9]]},"299":{"position":[[1569,9]]},"301":{"position":[[593,8]]},"387":{"position":[[171,10]]},"388":{"position":[[69,8]]},"390":{"position":[[1625,9]]},"393":{"position":[[446,9]]},"402":{"position":[[1940,8]]},"567":{"position":[[373,8]]},"861":{"position":[[81,8],[1190,8]]},"875":{"position":[[5646,9],[7620,9]]},"876":{"position":[[9,8]]}},"keywords":{}}],["tutorial.check",{"_index":3383,"title":{},"content":{"557":{"position":[[196,14]]},"712":{"position":[[67,14]]}},"keywords":{}}],["tutorial.i",{"_index":4587,"title":{},"content":{"776":{"position":[[117,10]]}},"keywords":{}}],["tutorial.if",{"_index":4816,"title":{},"content":{"842":{"position":[[123,11]]}},"keywords":{}}],["tutorial.ther",{"_index":3820,"title":{},"content":{"663":{"position":[[83,14]]},"842":{"position":[[217,14]]}},"keywords":{}}],["tweet",{"_index":2715,"title":{},"content":{"412":{"position":[[6866,5]]},"471":{"position":[[23,5]]}},"keywords":{}}],["tweetlearn",{"_index":3689,"title":{},"content":{"628":{"position":[[80,10]]}},"keywords":{}}],["tweetread",{"_index":2511,"title":{},"content":{"405":{"position":[[29,9]]}},"keywords":{}}],["twice",{"_index":3075,"title":{},"content":{"466":{"position":[[366,5]]},"467":{"position":[[331,5]]}},"keywords":{}}],["twitter",{"_index":2716,"title":{},"content":{"412":{"position":[[6875,7]]}},"keywords":{}}],["two",{"_index":204,"title":{},"content":{"14":{"position":[[129,3]]},"65":{"position":[[1977,3]]},"192":{"position":[[210,3]]},"393":{"position":[[192,3],[758,3],[863,3]]},"398":{"position":[[441,3]]},"408":{"position":[[3030,3]]},"412":{"position":[[822,3],[2244,3],[3097,3],[3128,3],[4553,3],[5891,3],[13881,3]]},"427":{"position":[[1312,3]]},"453":{"position":[[274,3]]},"458":{"position":[[1027,3]]},"525":{"position":[[588,3]]},"538":{"position":[[15,3]]},"540":{"position":[[98,3]]},"554":{"position":[[13,3]]},"582":{"position":[[498,3]]},"598":{"position":[[15,3]]},"617":{"position":[[407,3]]},"624":{"position":[[679,3]]},"626":{"position":[[640,3]]},"691":{"position":[[22,3],[535,3]]},"696":{"position":[[1024,3]]},"698":{"position":[[9,3],[184,3]]},"707":{"position":[[41,3]]},"711":{"position":[[2269,3]]},"717":{"position":[[20,3]]},"774":{"position":[[923,3]]},"775":{"position":[[209,3]]},"817":{"position":[[312,3]]},"828":{"position":[[212,3]]},"837":{"position":[[153,3],[999,3]]},"838":{"position":[[1710,3]]},"860":{"position":[[291,3]]},"870":{"position":[[1,3]]},"872":{"position":[[2187,3]]},"875":{"position":[[2356,3]]},"935":{"position":[[106,3]]},"961":{"position":[[76,3]]},"964":{"position":[[193,3]]},"983":{"position":[[1111,3]]},"984":{"position":[[452,3]]},"986":{"position":[[151,3]]},"1072":{"position":[[2104,3]]},"1080":{"position":[[985,3]]},"1100":{"position":[[203,3]]},"1147":{"position":[[89,3]]},"1214":{"position":[[162,3]]},"1267":{"position":[[746,5]]},"1271":{"position":[[11,3]]},"1292":{"position":[[48,3]]},"1296":{"position":[[709,3]]},"1306":{"position":[[11,3]]},"1309":{"position":[[38,3],[75,3]]},"1315":{"position":[[185,3],[992,3],[1233,3]]}},"keywords":{}}],["tx",{"_index":1804,"title":{},"content":{"302":{"position":[[691,2]]},"1294":{"position":[[807,3]]}},"keywords":{}}],["tx.done",{"_index":1810,"title":{},"content":{"302":{"position":[[825,8]]}},"keywords":{}}],["tx.objectstore('largestor",{"_index":1807,"title":{},"content":{"302":{"position":[[753,29]]}},"keywords":{}}],["tx.objectstore(storenam",{"_index":6430,"title":{},"content":{"1294":{"position":[[905,26]]}},"keywords":{}}],["type",{"_index":630,"title":{"925":{"position":[[0,5]]},"1311":{"position":[[10,6]]}},"content":{"40":{"position":[[52,5],[177,5]]},"47":{"position":[[603,5]]},"51":{"position":[[373,5],[409,5],[451,5],[478,5]]},"74":{"position":[[86,4]]},"105":{"position":[[156,4],[215,7]]},"151":{"position":[[452,5]]},"174":{"position":[[861,6],[915,4]]},"188":{"position":[[1250,5],[1286,5],[1328,5],[1371,5]]},"209":{"position":[[437,5],[491,5],[534,5],[564,5]]},"211":{"position":[[417,5],[453,5],[498,5]]},"232":{"position":[[163,6]]},"255":{"position":[[781,5],[835,5],[878,5],[904,5]]},"259":{"position":[[99,5],[135,5],[177,5]]},"281":{"position":[[74,6],[263,8],[299,4]]},"314":{"position":[[747,5],[801,5],[830,5],[861,5]]},"315":{"position":[[723,5],[777,5],[803,5]]},"316":{"position":[[232,5],[286,5],[315,5],[346,5]]},"334":{"position":[[651,5],[687,5],[713,5],[741,5]]},"356":{"position":[[171,6]]},"360":{"position":[[762,4]]},"361":{"position":[[120,6]]},"367":{"position":[[794,5],[830,5],[921,5],[963,5],[995,5]]},"390":{"position":[[895,5],[1182,5]]},"392":{"position":[[601,5],[637,5],[678,5],[1567,5],[1603,5],[1649,5],[1673,5]]},"393":{"position":[[600,4]]},"397":{"position":[[488,5]]},"411":{"position":[[837,4]]},"412":{"position":[[3712,6]]},"415":{"position":[[101,6]]},"424":{"position":[[261,6]]},"444":{"position":[[348,5]]},"480":{"position":[[547,5],[601,5],[628,5],[654,5]]},"482":{"position":[[847,5],[901,5],[933,5]]},"533":{"position":[[263,6]]},"535":{"position":[[673,4]]},"538":{"position":[[674,5],[710,5],[752,5],[779,5]]},"554":{"position":[[1338,5],[1392,5],[1441,5],[1474,5]]},"556":{"position":[[1014,5]]},"562":{"position":[[319,5],[373,5],[399,5],[426,5]]},"564":{"position":[[776,5],[830,5],[862,5]]},"569":{"position":[[138,4]]},"579":{"position":[[659,5],[695,5],[721,5],[755,5]]},"593":{"position":[[263,6]]},"598":{"position":[[681,5],[717,5],[759,5],[786,5]]},"612":{"position":[[1474,4],[1598,6],[1909,6]]},"617":{"position":[[2382,4]]},"632":{"position":[[1531,5],[1585,5],[1628,5],[1654,5]]},"636":{"position":[[52,6]]},"638":{"position":[[615,5],[669,5],[718,5]]},"639":{"position":[[393,5],[447,5],[492,5],[523,5]]},"662":{"position":[[2394,5],[2448,5],[2490,5],[2515,5]]},"680":{"position":[[841,5],[877,5],[921,5]]},"688":{"position":[[949,6]]},"698":{"position":[[3047,5]]},"711":{"position":[[2364,4]]},"717":{"position":[[1450,5],[1486,5],[1530,5]]},"720":{"position":[[149,5]]},"734":{"position":[[715,5],[751,5]]},"749":{"position":[[17080,4],[17198,4],[18250,5],[19926,4],[20137,4],[20294,4],[20466,4],[20561,4],[20728,4]]},"792":{"position":[[397,5]]},"796":{"position":[[289,6],[1217,4]]},"800":{"position":[[991,5]]},"808":{"position":[[230,5],[306,5],[564,5],[602,5],[631,5],[669,5]]},"812":{"position":[[87,5],[125,5],[153,5],[193,5]]},"813":{"position":[[87,5],[125,5],[154,5],[192,5]]},"818":{"position":[[77,4]]},"838":{"position":[[2608,5],[2662,5],[2704,5],[2729,5]]},"841":{"position":[[73,4],[1215,5]]},"854":{"position":[[931,4]]},"862":{"position":[[681,5],[717,5],[759,5]]},"872":{"position":[[1898,5],[1942,5],[1989,5],[2019,5],[4128,5],[4172,5],[4219,5],[4249,5]]},"875":{"position":[[1549,4],[2786,6],[5550,6],[6339,6],[7293,6]]},"885":{"position":[[620,4],[767,4],[833,4],[1054,4],[1328,4]]},"889":{"position":[[136,4],[224,4],[265,4]]},"898":{"position":[[194,4],[1725,6],[1770,5],[2478,5],[2522,5],[2569,5],[2599,5],[2624,5]]},"904":{"position":[[870,5],[924,5],[967,5],[993,5],[1039,5]]},"916":{"position":[[156,5]]},"917":{"position":[[303,5],[334,4]]},"918":{"position":[[174,5]]},"922":{"position":[[48,4]]},"925":{"position":[[5,4]]},"932":{"position":[[1208,5]]},"941":{"position":[[208,5]]},"948":{"position":[[256,5]]},"988":{"position":[[2634,6]]},"1007":{"position":[[169,6]]},"1018":{"position":[[681,5],[731,4]]},"1057":{"position":[[356,4],[572,4]]},"1072":{"position":[[1946,5]]},"1078":{"position":[[494,5],[530,5],[626,5],[656,5]]},"1079":{"position":[[122,5],[234,5]]},"1080":{"position":[[117,5],[153,5],[249,5],[370,5],[398,5],[431,5],[460,5],[630,5],[654,5],[691,5]]},"1082":{"position":[[202,5],[238,5],[334,5],[364,5],[389,5]]},"1083":{"position":[[402,5],[438,5],[534,5],[564,5],[589,5]]},"1085":{"position":[[1159,5],[2379,8],[2449,4],[2651,6]]},"1100":{"position":[[46,5]]},"1102":{"position":[[607,6],[770,4]]},"1149":{"position":[[1061,5],[1115,5],[1157,5],[1182,5]]},"1158":{"position":[[389,5],[425,5],[452,5],[478,5]]},"1226":{"position":[[668,5]]},"1257":{"position":[[71,4]]},"1264":{"position":[[548,5]]},"1290":{"position":[[100,5]]},"1306":{"position":[[15,5]]},"1311":{"position":[[34,6],[417,5],[461,5],[492,5],[522,5],[547,5]]},"1318":{"position":[[698,5]]},"1322":{"position":[[83,5],[228,7],[380,5],[426,7],[526,4]]}},"keywords":{}}],["type:str",{"_index":4381,"title":{},"content":{"749":{"position":[[18959,11]]}},"keywords":{}}],["type="text"",{"_index":3395,"title":{},"content":{"559":{"position":[[588,21]]}},"keywords":{}}],["typeerror",{"_index":5408,"title":{},"content":{"968":{"position":[[602,10]]},"1213":{"position":[[872,10]]}},"keywords":{}}],["typesaf",{"_index":5740,"title":{},"content":{"1057":{"position":[[415,9]]}},"keywords":{}}],["typescript",{"_index":300,"title":{"74":{"position":[[17,10]]},"105":{"position":[[17,10]]},"232":{"position":[[7,10]]},"281":{"position":[[17,10]]},"1251":{"position":[[0,10]]},"1257":{"position":[[19,11]]},"1310":{"position":[[16,10]]},"1322":{"position":[[0,10]]}},"content":{"17":{"position":[[527,10]]},"34":{"position":[[236,11]]},"47":{"position":[[553,10],[592,10]]},"74":{"position":[[20,10]]},"83":{"position":[[130,10]]},"105":{"position":[[1,10],[110,10]]},"174":{"position":[[704,10],[781,10]]},"188":{"position":[[20,10]]},"232":{"position":[[1,10],[104,10],[313,10]]},"281":{"position":[[1,11],[195,10]]},"445":{"position":[[164,11]]},"535":{"position":[[580,10]]},"595":{"position":[[607,10]]},"711":{"position":[[2353,10]]},"730":{"position":[[184,10]]},"793":{"position":[[72,10]]},"1018":{"position":[[642,11],[895,10]]},"1057":{"position":[[298,10]]},"1071":{"position":[[180,10]]},"1085":{"position":[[2368,10],[2621,10]]},"1251":{"position":[[157,10]]},"1257":{"position":[[41,10]]},"1322":{"position":[[32,10]]}},"keywords":{}}],["typescript"",{"_index":1530,"title":{},"content":{"244":{"position":[[1613,16]]}},"keywords":{}}],["typescript/j",{"_index":654,"title":{},"content":{"41":{"position":[[247,13]]}},"keywords":{}}],["typic",{"_index":636,"title":{"349":{"position":[[29,9]]}},"content":{"40":{"position":[[344,9]]},"99":{"position":[[15,9]]},"203":{"position":[[28,9]]},"226":{"position":[[15,9]]},"228":{"position":[[27,9]]},"265":{"position":[[566,9]]},"298":{"position":[[496,9]]},"299":{"position":[[888,9]]},"302":{"position":[[335,7]]},"303":{"position":[[78,9]]},"305":{"position":[[268,10]]},"336":{"position":[[470,7]]},"357":{"position":[[39,9]]},"358":{"position":[[68,9]]},"408":{"position":[[871,9]]},"410":{"position":[[1588,7]]},"411":{"position":[[56,9]]},"412":{"position":[[8826,9],[10316,7],[11122,9]]},"414":{"position":[[274,9]]},"419":{"position":[[1767,9]]},"427":{"position":[[1477,9]]},"461":{"position":[[1083,9],[1314,9]]},"478":{"position":[[1,7]]},"563":{"position":[[6,9]]},"570":{"position":[[388,9]]},"581":{"position":[[514,9]]},"641":{"position":[[237,9]]},"723":{"position":[[742,9]]},"830":{"position":[[264,9]]},"841":{"position":[[1039,9]]},"1150":{"position":[[223,9]]}},"keywords":{}}],["typo",{"_index":5898,"title":{},"content":{"1085":{"position":[[2504,4]]}},"keywords":{}}],["ubuntu",{"_index":6394,"title":{},"content":{"1292":{"position":[[74,6]]}},"keywords":{}}],["ui",{"_index":544,"title":{"73":{"position":[[42,4]]},"77":{"position":[[54,2]]},"103":{"position":[[54,2]]},"104":{"position":[[42,4]]},"173":{"position":[[21,2]]},"231":{"position":[[27,4]]},"233":{"position":[[33,2]]},"484":{"position":[[23,2]]},"485":{"position":[[26,3]]},"486":{"position":[[39,3]]},"488":{"position":[[20,2]]},"489":{"position":[[46,3]]},"490":{"position":[[10,2]]},"492":{"position":[[11,2]]},"495":{"position":[[24,2]]},"497":{"position":[[38,3]]},"634":{"position":[[11,2]]},"1312":{"position":[[4,2]]}},"content":{"34":{"position":[[645,2]]},"37":{"position":[[74,2]]},"53":{"position":[[81,2]]},"77":{"position":[[181,2]]},"103":{"position":[[71,2]]},"104":{"position":[[64,2],[202,2]]},"106":{"position":[[164,2]]},"124":{"position":[[246,2]]},"129":{"position":[[52,2]]},"130":{"position":[[295,2]]},"140":{"position":[[229,2]]},"146":{"position":[[198,2]]},"173":{"position":[[19,2]]},"174":{"position":[[378,2],[460,4],[573,2],[674,2],[1147,2]]},"175":{"position":[[478,2]]},"177":{"position":[[27,2]]},"182":{"position":[[169,2],[292,2]]},"185":{"position":[[182,2]]},"196":{"position":[[183,2]]},"205":{"position":[[377,2]]},"217":{"position":[[224,2]]},"221":{"position":[[260,3]]},"226":{"position":[[327,3]]},"231":{"position":[[263,2]]},"233":{"position":[[113,2],[221,2]]},"234":{"position":[[136,2]]},"235":{"position":[[185,2]]},"277":{"position":[[123,2]]},"302":{"position":[[1018,2]]},"320":{"position":[[245,2]]},"326":{"position":[[107,2]]},"329":{"position":[[232,3]]},"342":{"position":[[157,2]]},"352":{"position":[[11,3]]},"354":{"position":[[108,2]]},"360":{"position":[[343,2]]},"362":{"position":[[154,2]]},"369":{"position":[[1274,2]]},"379":{"position":[[130,2]]},"410":{"position":[[2038,2]]},"411":{"position":[[2069,3],[2258,2],[2495,2],[3023,2],[3884,3]]},"412":{"position":[[3638,4],[5093,2],[10036,2]]},"415":{"position":[[388,4]]},"420":{"position":[[1351,3]]},"451":{"position":[[683,2]]},"476":{"position":[[319,2]]},"479":{"position":[[168,2]]},"483":{"position":[[344,2]]},"485":{"position":[[12,3]]},"486":{"position":[[198,2]]},"488":{"position":[[37,2]]},"489":{"position":[[48,3],[515,2]]},"490":{"position":[[153,2],[236,2]]},"491":{"position":[[45,3],[891,2]]},"495":{"position":[[18,3],[405,2]]},"497":{"position":[[641,2]]},"498":{"position":[[45,2],[549,3]]},"541":{"position":[[808,2]]},"562":{"position":[[843,2],[962,2],[1755,2]]},"566":{"position":[[549,2]]},"574":{"position":[[297,2]]},"601":{"position":[[789,2]]},"630":{"position":[[599,2]]},"631":{"position":[[277,2]]},"634":{"position":[[80,2],[329,2],[555,2]]},"642":{"position":[[197,2]]},"661":{"position":[[1447,2]]},"662":{"position":[[234,2]]},"698":{"position":[[2118,2]]},"700":{"position":[[624,2],[1141,3]]},"703":{"position":[[1309,2],[1562,2]]},"707":{"position":[[140,2]]},"709":{"position":[[625,3]]},"710":{"position":[[120,2],[2442,3]]},"711":{"position":[[1941,2]]},"778":{"position":[[542,2]]},"781":{"position":[[531,2],[866,2]]},"785":{"position":[[30,2],[399,2],[600,3]]},"801":{"position":[[421,2],[739,2]]},"836":{"position":[[1157,2],[1281,2],[1500,2],[2403,2]]},"838":{"position":[[263,2],[470,2]]},"841":{"position":[[602,2]]},"1058":{"position":[[122,3]]},"1117":{"position":[[487,2]]},"1150":{"position":[[588,2]]},"1313":{"position":[[473,2]]},"1321":{"position":[[171,3]]}},"keywords":{}}],["ui"",{"_index":1440,"title":{},"content":{"243":{"position":[[21,8]]}},"keywords":{}}],["uint8array(writes",{"_index":6212,"title":{},"content":{"1208":{"position":[[1327,22]]}},"keywords":{}}],["ultim",{"_index":1643,"title":{"472":{"position":[[11,8]]}},"content":{"277":{"position":[[308,11]]},"318":{"position":[[566,8]]},"388":{"position":[[232,11]]},"491":{"position":[[67,10]]}},"keywords":{}}],["umd",{"_index":1939,"title":{},"content":{"333":{"position":[[187,3]]}},"keywords":{}}],["un",{"_index":5469,"title":{},"content":{"988":{"position":[[4020,2]]},"1316":{"position":[[550,2]]}},"keywords":{}}],["unauthor",{"_index":1299,"title":{"880":{"position":[[0,14]]}},"content":{"195":{"position":[[180,12]]},"377":{"position":[[111,12]]},"526":{"position":[[178,12]]},"550":{"position":[[37,12]]},"586":{"position":[[154,12]]},"749":{"position":[[16506,12]]},"880":{"position":[[190,13]]},"912":{"position":[[371,12]]}},"keywords":{}}],["unavail",{"_index":1393,"title":{},"content":{"215":{"position":[[256,12]]},"300":{"position":[[848,12]]},"323":{"position":[[238,12]]},"445":{"position":[[650,12]]},"860":{"position":[[437,12]]}},"keywords":{}}],["unavoid",{"_index":3691,"title":{},"content":{"630":{"position":[[131,11]]}},"keywords":{}}],["unbound",{"_index":5896,"title":{},"content":{"1085":{"position":[[2252,10]]}},"keywords":{}}],["uncach",{"_index":4698,"title":{},"content":{"816":{"position":[[150,7],[299,7],[383,7]]},"817":{"position":[[105,8],[217,8]]},"818":{"position":[[237,8]]}},"keywords":{}}],["uncacherxquery(rxqueri",{"_index":4704,"title":{},"content":{"818":{"position":[[268,24]]}},"keywords":{}}],["uncaught",{"_index":4071,"title":{},"content":{"729":{"position":[[91,8]]}},"keywords":{}}],["uncompress",{"_index":1828,"title":{},"content":{"303":{"position":[[522,12]]},"361":{"position":[[519,12]]}},"keywords":{}}],["undefin",{"_index":280,"title":{"887":{"position":[[21,9]]}},"content":{"16":{"position":[[453,9]]},"729":{"position":[[406,9]]},"749":{"position":[[3718,12]]},"829":{"position":[[2096,10]]},"886":{"position":[[1318,10]]},"887":{"position":[[88,10],[215,9],[570,9]]},"898":{"position":[[4399,9]]},"968":{"position":[[639,9]]},"981":{"position":[[1474,9]]},"1018":{"position":[[492,9]]},"1043":{"position":[[104,9],[141,9]]},"1065":{"position":[[702,9]]},"1188":{"position":[[328,9]]},"1202":{"position":[[445,9]]},"1213":{"position":[[909,9]]},"1305":{"position":[[46,9]]}},"keywords":{}}],["undefined/miss",{"_index":5227,"title":{},"content":{"898":{"position":[[4344,19]]}},"keywords":{}}],["under",{"_index":683,"title":{},"content":{"43":{"position":[[611,5]]},"303":{"position":[[1177,5],[1219,5]]},"305":{"position":[[515,5]]},"412":{"position":[[9862,5]]},"490":{"position":[[474,5]]},"545":{"position":[[100,5]]},"566":{"position":[[803,5]]},"571":{"position":[[1575,5]]},"605":{"position":[[100,5]]},"620":{"position":[[197,5]]},"703":{"position":[[1505,5]]}},"keywords":{}}],["underli",{"_index":399,"title":{},"content":{"24":{"position":[[144,10]]},"90":{"position":[[222,10]]},"124":{"position":[[157,10]]},"139":{"position":[[250,10]]},"159":{"position":[[226,10]]},"162":{"position":[[97,10]]},"167":{"position":[[211,10]]},"181":{"position":[[230,10]]},"185":{"position":[[105,10]]},"233":{"position":[[150,10]]},"266":{"position":[[948,10]]},"314":{"position":[[97,10]]},"383":{"position":[[338,10]]},"485":{"position":[[99,10]]},"514":{"position":[[268,10]]},"524":{"position":[[65,10]]},"541":{"position":[[838,10]]},"585":{"position":[[95,10]]},"600":{"position":[[158,10]]},"601":{"position":[[819,10]]},"641":{"position":[[144,10]]},"703":{"position":[[316,10],[376,10]]},"829":{"position":[[2789,10]]},"838":{"position":[[486,10]]},"890":{"position":[[389,10]]},"962":{"position":[[134,10]]},"1124":{"position":[[198,10]]},"1150":{"position":[[614,10]]},"1162":{"position":[[831,10]]},"1165":{"position":[[112,10]]},"1198":{"position":[[1234,10]]},"1246":{"position":[[1435,10]]}},"keywords":{}}],["underpin",{"_index":2805,"title":{},"content":{"419":{"position":[[781,13]]}},"keywords":{}}],["underscor",{"_index":4199,"title":{},"content":{"749":{"position":[[4922,10],[8276,10],[17578,10]]},"811":{"position":[[96,10]]},"863":{"position":[[72,10],[119,12]]}},"keywords":{}}],["underscore_",{"_index":4687,"title":{},"content":{"811":{"position":[[423,11]]}},"keywords":{}}],["understand",{"_index":486,"title":{"427":{"position":[[0,13]]},"444":{"position":[[0,13]]}},"content":{"29":{"position":[[458,10]]},"119":{"position":[[39,10]]},"127":{"position":[[25,13]]},"151":{"position":[[66,10]]},"180":{"position":[[4,10]]},"187":{"position":[[13,10]]},"298":{"position":[[835,13]]},"364":{"position":[[782,11]]},"404":{"position":[[522,10]]},"412":{"position":[[81,10]]},"425":{"position":[[55,10]]},"441":{"position":[[530,13]]},"483":{"position":[[776,13]]},"688":{"position":[[738,11]]},"689":{"position":[[138,13]]},"707":{"position":[[361,10]]},"904":{"position":[[48,10]]},"981":{"position":[[137,11],[224,10],[278,10]]},"1151":{"position":[[263,10],[687,13]]},"1178":{"position":[[262,10],[686,13]]},"1252":{"position":[[255,10]]}},"keywords":{}}],["understood",{"_index":2649,"title":{},"content":{"412":{"position":[[206,10]]},"569":{"position":[[544,10]]}},"keywords":{}}],["undon",{"_index":3127,"title":{},"content":{"480":{"position":[[885,6]]}},"keywords":{}}],["undonetask",{"_index":3128,"title":{},"content":{"480":{"position":[[901,13]]}},"keywords":{}}],["undoubtedli",{"_index":2948,"title":{},"content":{"447":{"position":[[559,11]]}},"keywords":{}}],["unencrypt",{"_index":3361,"title":{},"content":{"555":{"position":[[952,11]]},"714":{"position":[[192,11]]}},"keywords":{}}],["unexpect",{"_index":5897,"title":{},"content":{"1085":{"position":[[2338,10]]}},"keywords":{}}],["unexpectedli",{"_index":6472,"title":{},"content":{"1300":{"position":[[1104,12]]}},"keywords":{}}],["unfamiliar",{"_index":2834,"title":{},"content":{"420":{"position":[[721,11]]}},"keywords":{}}],["unfortun",{"_index":3008,"title":{},"content":{"460":{"position":[[693,13]]},"1301":{"position":[[886,13]]}},"keywords":{}}],["ungracefulli",{"_index":461,"title":{},"content":{"28":{"position":[[458,12]]},"1162":{"position":[[71,12]]},"1171":{"position":[[88,12]]},"1181":{"position":[[137,12]]}},"keywords":{}}],["unidirect",{"_index":3668,"title":{},"content":{"622":{"position":[[355,14],[612,14]]}},"keywords":{}}],["unifi",{"_index":588,"title":{},"content":{"38":{"position":[[279,5]]},"317":{"position":[[287,7]]},"384":{"position":[[333,7]]},"445":{"position":[[2459,7]]},"446":{"position":[[1317,7]]},"517":{"position":[[372,7]]},"589":{"position":[[200,7]]}},"keywords":{}}],["uninstal",{"_index":2732,"title":{},"content":{"412":{"position":[[8580,10]]}},"keywords":{}}],["unintellig",{"_index":5279,"title":{},"content":{"912":{"position":[[444,14]]}},"keywords":{}}],["unintention",{"_index":3686,"title":{},"content":{"627":{"position":[[147,15]]}},"keywords":{}}],["uninterrupt",{"_index":1004,"title":{},"content":{"88":{"position":[[169,13]]},"274":{"position":[[198,13]]},"292":{"position":[[418,13]]},"445":{"position":[[578,13]]}},"keywords":{}}],["uniqu",{"_index":474,"title":{},"content":{"29":{"position":[[107,6]]},"118":{"position":[[312,6]]},"271":{"position":[[196,6]]},"276":{"position":[[354,6]]},"287":{"position":[[738,6]]},"354":{"position":[[518,6]]},"377":{"position":[[41,6]]},"388":{"position":[[210,6]]},"399":{"position":[[134,6]]},"432":{"position":[[581,6]]},"444":{"position":[[161,6]]},"504":{"position":[[502,6]]},"520":{"position":[[87,6]]},"567":{"position":[[1126,6]]},"724":{"position":[[552,6]]},"749":{"position":[[18031,7]]},"875":{"position":[[2340,6]]},"904":{"position":[[2115,6]]},"935":{"position":[[10,8]]},"943":{"position":[[183,10]]},"961":{"position":[[37,8]]},"990":{"position":[[552,6]]},"1008":{"position":[[104,6]]},"1074":{"position":[[173,7]]},"1077":{"position":[[183,7]]},"1294":{"position":[[640,7]]}},"keywords":{}}],["unit",{"_index":1648,"title":{},"content":{"279":{"position":[[204,5]]},"668":{"position":[[110,4],[345,4]]},"749":{"position":[[5791,4]]},"773":{"position":[[366,4]]},"966":{"position":[[250,4]]},"996":{"position":[[132,4]]},"1091":{"position":[[59,5]]},"1139":{"position":[[99,4]]},"1145":{"position":[[95,4]]},"1159":{"position":[[175,4]]},"1313":{"position":[[92,4]]}},"keywords":{}}],["univers",{"_index":1735,"title":{},"content":{"299":{"position":[[95,9]]},"1072":{"position":[[1975,9]]}},"keywords":{}}],["unix",{"_index":4447,"title":{},"content":{"751":{"position":[[695,4],[938,4],[1797,4]]},"875":{"position":[[1645,4]]},"1104":{"position":[[535,4]]}},"keywords":{}}],["unknown",{"_index":2424,"title":{},"content":{"398":{"position":[[3307,7]]},"778":{"position":[[214,7]]},"985":{"position":[[321,7]]},"1085":{"position":[[879,7],[2022,7],[2601,7]]},"1316":{"position":[[409,7],[438,7]]}},"keywords":{}}],["unless",{"_index":78,"title":{},"content":{"5":{"position":[[149,6]]},"412":{"position":[[8841,6]]},"476":{"position":[[73,6]]},"563":{"position":[[1058,6]]}},"keywords":{}}],["unlik",{"_index":1082,"title":{},"content":{"126":{"position":[[196,6]]},"201":{"position":[[1,6]]},"249":{"position":[[1,6]]},"390":{"position":[[295,6]]},"427":{"position":[[423,6]]},"432":{"position":[[262,6]]},"453":{"position":[[535,8]]},"500":{"position":[[225,6]]},"520":{"position":[[157,6]]},"610":{"position":[[204,6]]},"612":{"position":[[97,6]]},"656":{"position":[[108,8]]},"688":{"position":[[956,6]]},"1206":{"position":[[177,6]]}},"keywords":{}}],["unlimit",{"_index":808,"title":{},"content":{"52":{"position":[[571,10]]},"412":{"position":[[7349,9]]},"539":{"position":[[571,10]]},"599":{"position":[[598,10]]}},"keywords":{}}],["unlock",{"_index":1057,"title":{},"content":{"114":{"position":[[470,6]]},"241":{"position":[[405,6]]},"408":{"position":[[1391,8]]},"447":{"position":[[667,6]]},"483":{"position":[[1196,6]]}},"keywords":{}}],["unmaintain",{"_index":266,"title":{},"content":{"15":{"position":[[589,13]]},"28":{"position":[[613,13]]}},"keywords":{}}],["unmanageable.no",{"_index":2061,"title":{},"content":{"358":{"position":[[455,15]]}},"keywords":{}}],["unmount",{"_index":3525,"title":{},"content":{"590":{"position":[[545,7]]},"829":{"position":[[3808,9]]}},"keywords":{}}],["unnecessari",{"_index":1047,"title":{},"content":{"108":{"position":[[107,11]]},"146":{"position":[[186,11]]},"234":{"position":[[188,11]]},"289":{"position":[[421,11]]},"383":{"position":[[564,11]]},"385":{"position":[[306,11]]},"436":{"position":[[57,12]]},"610":{"position":[[690,11]]},"689":{"position":[[554,11]]}},"keywords":{}}],["unpredict",{"_index":2045,"title":{},"content":{"356":{"position":[[792,13]]},"399":{"position":[[219,14]]},"412":{"position":[[10532,13]]},"1304":{"position":[[1463,13]]}},"keywords":{}}],["unreach",{"_index":5245,"title":{},"content":{"902":{"position":[[609,12]]}},"keywords":{}}],["unread",{"_index":3140,"title":{},"content":{"482":{"position":[[1126,10]]},"638":{"position":[[892,10]]}},"keywords":{}}],["unreason",{"_index":1717,"title":{},"content":{"298":{"position":[[421,12]]}},"keywords":{}}],["unreli",{"_index":1079,"title":{},"content":{"122":{"position":[[369,10]]},"133":{"position":[[362,10]]},"289":{"position":[[1876,11]]},"309":{"position":[[102,10]]},"415":{"position":[[419,11]]},"613":{"position":[[273,10]]},"624":{"position":[[1247,10]]}},"keywords":{}}],["unsaf",{"_index":6385,"title":{},"content":{"1287":{"position":[[104,7]]}},"keywords":{}}],["unsent",{"_index":2786,"title":{},"content":{"416":{"position":[[163,6]]}},"keywords":{}}],["unset",{"_index":5843,"title":{},"content":{"1082":{"position":[[91,5]]}},"keywords":{}}],["unstructur",{"_index":216,"title":{},"content":{"14":{"position":[[510,12]]},"276":{"position":[[217,12]]}},"keywords":{}}],["unsubscrib",{"_index":1132,"title":{"143":{"position":[[55,12]]}},"content":{"143":{"position":[[154,11]]}},"keywords":{}}],["unsuit",{"_index":1027,"title":{},"content":{"100":{"position":[[113,10]]},"408":{"position":[[389,10]]},"412":{"position":[[7569,10]]},"427":{"position":[[534,10]]}},"keywords":{}}],["unsync",{"_index":3519,"title":{},"content":{"584":{"position":[[135,8]]}},"keywords":{}}],["unthink",{"_index":2579,"title":{},"content":{"408":{"position":[[5576,11]]}},"keywords":{}}],["until",{"_index":148,"title":{},"content":{"11":{"position":[[245,5],[341,5],[722,5]]},"24":{"position":[[555,5]]},"301":{"position":[[239,5]]},"412":{"position":[[11652,5]]},"451":{"position":[[808,5]]},"461":{"position":[[563,5]]},"463":{"position":[[593,5]]},"610":{"position":[[382,5]]},"626":{"position":[[776,5],[1042,5]]},"698":{"position":[[3153,5]]},"699":{"position":[[488,5]]},"702":{"position":[[322,5]]},"737":{"position":[[214,5]]},"775":{"position":[[57,5]]},"875":{"position":[[8898,5]]},"948":{"position":[[692,5]]},"988":{"position":[[728,5],[1300,5],[6036,5]]},"995":{"position":[[319,5],[607,5],[748,5],[976,5]]},"996":{"position":[[78,5]]},"1007":{"position":[[1113,5]]},"1032":{"position":[[160,5]]},"1164":{"position":[[1157,5]]},"1175":{"position":[[497,5]]},"1194":{"position":[[282,5]]},"1288":{"position":[[65,5]]},"1294":{"position":[[1032,5]]}},"keywords":{}}],["untrack",{"_index":832,"title":{},"content":{"55":{"position":[[251,10],[518,12]]}},"keywords":{}}],["untyp",{"_index":733,"title":{},"content":{"47":{"position":[[677,7]]}},"keywords":{}}],["unus",{"_index":1870,"title":{},"content":{"305":{"position":[[219,6]]},"416":{"position":[[440,8]]}},"keywords":{}}],["unwieldi",{"_index":721,"title":{},"content":{"47":{"position":[[173,8]]},"321":{"position":[[404,8]]},"356":{"position":[[920,9]]}},"keywords":{}}],["up",{"_index":191,"title":{"48":{"position":[[4,2]]},"61":{"position":[[7,3]]},"84":{"position":[[7,3]]},"114":{"position":[[7,3]]},"149":{"position":[[7,3]]},"175":{"position":[[7,3]]},"210":{"position":[[8,2]]},"241":{"position":[[7,3]]},"263":{"position":[[7,3]]},"296":{"position":[[7,3]]},"306":{"position":[[7,3]]},"318":{"position":[[7,3]]},"347":{"position":[[7,3]]},"362":{"position":[[7,3]]},"373":{"position":[[7,3]]},"388":{"position":[[7,3]]},"405":{"position":[[7,3]]},"442":{"position":[[7,3]]},"471":{"position":[[7,3]]},"483":{"position":[[7,3]]},"498":{"position":[[7,3]]},"511":{"position":[[7,3]]},"531":{"position":[[7,3]]},"536":{"position":[[4,2]]},"548":{"position":[[7,3]]},"552":{"position":[[8,2]]},"554":{"position":[[7,2]]},"557":{"position":[[7,3]]},"567":{"position":[[7,3]]},"572":{"position":[[7,3]]},"591":{"position":[[7,3]]},"596":{"position":[[4,2]]},"608":{"position":[[7,3]]},"628":{"position":[[7,3]]},"644":{"position":[[7,3]]},"663":{"position":[[7,3]]},"712":{"position":[[7,3]]},"776":{"position":[[7,2]]},"786":{"position":[[7,3]]},"832":{"position":[[7,3]]},"842":{"position":[[7,3]]},"862":{"position":[[8,2]]},"872":{"position":[[8,2]]},"873":{"position":[[7,3]]},"898":{"position":[[8,2]]},"899":{"position":[[7,3]]},"913":{"position":[[7,3]]},"1089":{"position":[[23,2]]}},"content":{"13":{"position":[[208,2]]},"84":{"position":[[392,2]]},"114":{"position":[[405,2]]},"149":{"position":[[405,2]]},"158":{"position":[[321,2]]},"168":{"position":[[273,2]]},"175":{"position":[[396,2]]},"184":{"position":[[267,2]]},"185":{"position":[[185,2]]},"192":{"position":[[72,2]]},"204":{"position":[[123,2]]},"241":{"position":[[174,2]]},"255":{"position":[[227,3]]},"261":{"position":[[1007,2]]},"267":{"position":[[805,2]]},"284":{"position":[[53,2],[137,2]]},"287":{"position":[[410,2]]},"288":{"position":[[149,2]]},"293":{"position":[[356,2]]},"299":{"position":[[254,2]]},"301":{"position":[[139,2]]},"318":{"position":[[256,2]]},"333":{"position":[[92,2]]},"340":{"position":[[168,2]]},"342":{"position":[[54,2]]},"346":{"position":[[476,2]]},"347":{"position":[[403,2]]},"360":{"position":[[583,2]]},"362":{"position":[[1474,2]]},"373":{"position":[[174,2]]},"376":{"position":[[498,2]]},"392":{"position":[[875,2],[2418,2],[3143,2]]},"393":{"position":[[681,2]]},"394":{"position":[[1664,2]]},"408":{"position":[[984,2],[4086,2]]},"410":{"position":[[1100,2]]},"411":{"position":[[4280,2]]},"412":{"position":[[2420,2],[4280,2],[6074,4],[6990,3]]},"419":{"position":[[1833,2]]},"427":{"position":[[851,2]]},"461":{"position":[[243,2],[509,2],[593,2],[1181,2]]},"468":{"position":[[519,2],[612,2]]},"469":{"position":[[79,2],[525,2],[1153,2]]},"477":{"position":[[83,2]]},"498":{"position":[[205,2]]},"504":{"position":[[1202,2]]},"511":{"position":[[405,2]]},"531":{"position":[[405,2]]},"536":{"position":[[9,2]]},"538":{"position":[[179,2]]},"542":{"position":[[247,2]]},"554":{"position":[[269,2]]},"555":{"position":[[17,2]]},"562":{"position":[[1404,2]]},"567":{"position":[[236,2],[1052,2]]},"579":{"position":[[38,2]]},"587":{"position":[[66,2]]},"590":{"position":[[512,2],[668,2]]},"591":{"position":[[403,2]]},"596":{"position":[[9,2]]},"598":{"position":[[180,2]]},"602":{"position":[[505,2]]},"612":{"position":[[1069,2],[1696,2],[2374,2]]},"617":{"position":[[709,2]]},"632":{"position":[[82,2]]},"639":{"position":[[205,2]]},"644":{"position":[[38,2]]},"660":{"position":[[150,2]]},"662":{"position":[[741,2]]},"696":{"position":[[378,2],[1318,2],[1379,2],[1423,2],[1969,2]]},"697":{"position":[[245,2]]},"709":{"position":[[180,2]]},"710":{"position":[[826,3]]},"711":{"position":[[520,2],[1411,2]]},"723":{"position":[[1223,2]]},"772":{"position":[[501,2],[1263,2],[1827,2]]},"773":{"position":[[409,2]]},"780":{"position":[[243,2]]},"782":{"position":[[262,2],[320,2]]},"786":{"position":[[110,2]]},"799":{"position":[[26,2],[200,2]]},"815":{"position":[[22,2],[91,2]]},"816":{"position":[[36,2]]},"829":{"position":[[823,2],[3772,2]]},"837":{"position":[[518,2]]},"838":{"position":[[1484,3]]},"861":{"position":[[174,3],[230,2],[371,2],[916,2]]},"862":{"position":[[22,2],[88,2]]},"872":{"position":[[173,2]]},"875":{"position":[[5805,2],[8860,2]]},"879":{"position":[[72,2]]},"886":{"position":[[480,2]]},"887":{"position":[[15,2]]},"890":{"position":[[306,3]]},"897":{"position":[[341,2]]},"903":{"position":[[658,2]]},"908":{"position":[[224,3]]},"913":{"position":[[49,2]]},"955":{"position":[[79,2]]},"976":{"position":[[55,2]]},"977":{"position":[[56,2]]},"984":{"position":[[116,2]]},"997":{"position":[[91,3]]},"1007":{"position":[[214,2]]},"1009":{"position":[[183,2],[1060,2]]},"1022":{"position":[[360,2]]},"1030":{"position":[[244,2]]},"1080":{"position":[[1113,2]]},"1089":{"position":[[198,2]]},"1092":{"position":[[67,2],[555,3]]},"1094":{"position":[[565,2]]},"1095":{"position":[[27,2],[105,2]]},"1114":{"position":[[141,2]]},"1124":{"position":[[1138,2]]},"1126":{"position":[[244,2]]},"1135":{"position":[[177,2]]},"1143":{"position":[[182,2]]},"1198":{"position":[[2000,2]]},"1209":{"position":[[195,2],[433,2]]},"1242":{"position":[[112,2]]},"1302":{"position":[[43,2]]},"1311":{"position":[[1823,2]]},"1316":{"position":[[237,2],[1211,2]]},"1317":{"position":[[341,2]]}},"keywords":{}}],["up"",{"_index":5907,"title":{},"content":{"1087":{"position":[[36,8]]}},"keywords":{}}],["up.indexeddb",{"_index":1960,"title":{},"content":{"336":{"position":[[161,12]]}},"keywords":{}}],["updat",{"_index":545,"title":{"53":{"position":[[26,8]]},"77":{"position":[[43,6]]},"103":{"position":[[43,6]]},"136":{"position":[[10,8]]},"233":{"position":[[36,8]]},"335":{"position":[[0,8]]},"490":{"position":[[24,8]]},"540":{"position":[[26,8]]},"600":{"position":[[26,8]]},"1041":{"position":[[0,9]]},"1048":{"position":[[11,6]]},"1059":{"position":[[0,9]]}},"content":{"34":{"position":[[648,8]]},"39":{"position":[[200,7]]},"52":{"position":[[454,6]]},"53":{"position":[[106,7]]},"61":{"position":[[109,8]]},"68":{"position":[[186,7]]},"75":{"position":[[117,8]]},"77":{"position":[[68,6]]},"79":{"position":[[98,7]]},"99":{"position":[[80,7],[244,8]]},"103":{"position":[[74,7]]},"106":{"position":[[167,8]]},"121":{"position":[[131,7]]},"124":{"position":[[141,6]]},"129":{"position":[[45,6]]},"135":{"position":[[60,7]]},"136":{"position":[[25,7],[217,7],[229,6]]},"140":{"position":[[216,8]]},"141":{"position":[[285,8]]},"146":{"position":[[80,8],[201,8]]},"151":{"position":[[192,8]]},"152":{"position":[[285,8]]},"155":{"position":[[273,7]]},"156":{"position":[[140,7]]},"159":{"position":[[205,7]]},"164":{"position":[[208,7]]},"173":{"position":[[171,8],[970,6]]},"174":{"position":[[301,6],[381,7],[1150,8]]},"175":{"position":[[568,8]]},"181":{"position":[[193,7]]},"182":{"position":[[158,6]]},"185":{"position":[[89,6],[290,7]]},"196":{"position":[[170,8]]},"203":{"position":[[38,7]]},"205":{"position":[[284,7],[380,7]]},"208":{"position":[[141,7],[256,8]]},"220":{"position":[[293,7]]},"221":{"position":[[47,7],[249,6]]},"226":{"position":[[193,8],[312,7]]},"233":{"position":[[102,6],[224,7]]},"234":{"position":[[139,7]]},"235":{"position":[[174,6]]},"240":{"position":[[233,7]]},"250":{"position":[[121,6]]},"255":{"position":[[114,7]]},"275":{"position":[[142,7]]},"283":{"position":[[318,7]]},"289":{"position":[[869,7],[1268,7]]},"312":{"position":[[121,7]]},"323":{"position":[[46,7]]},"326":{"position":[[110,8],[183,6]]},"327":{"position":[[149,6],[251,7]]},"329":{"position":[[166,7]]},"330":{"position":[[161,8]]},"339":{"position":[[25,6]]},"344":{"position":[[119,8]]},"346":{"position":[[798,8]]},"357":{"position":[[238,8]]},"358":{"position":[[479,8]]},"360":{"position":[[414,8],[545,7]]},"367":{"position":[[401,8]]},"368":{"position":[[370,7]]},"369":{"position":[[1038,8],[1277,7]]},"375":{"position":[[783,7]]},"376":{"position":[[102,7]]},"379":{"position":[[133,7]]},"386":{"position":[[324,8]]},"403":{"position":[[45,6],[268,7],[395,6]]},"410":{"position":[[1629,7],[1874,7],[2041,8]]},"411":{"position":[[685,8],[1261,7],[2381,8],[2977,7],[3552,7],[3678,7]]},"412":{"position":[[11425,7],[11670,9],[13919,6]]},"415":{"position":[[485,8]]},"418":{"position":[[620,8]]},"421":{"position":[[266,8]]},"445":{"position":[[973,8]]},"446":{"position":[[739,7]]},"455":{"position":[[617,6]]},"461":{"position":[[468,7]]},"475":{"position":[[137,7]]},"476":{"position":[[215,7]]},"479":{"position":[[171,7]]},"481":{"position":[[82,7],[742,7]]},"483":{"position":[[145,8],[347,7]]},"487":{"position":[[117,7]]},"489":{"position":[[134,8],[744,6]]},"490":{"position":[[318,8],[628,7]]},"491":{"position":[[369,7],[459,6],[1736,7]]},"493":{"position":[[379,7]]},"494":{"position":[[242,7],[586,8]]},"496":{"position":[[65,6]]},"497":{"position":[[756,7]]},"498":{"position":[[299,7]]},"500":{"position":[[467,8]]},"502":{"position":[[862,7]]},"509":{"position":[[119,7]]},"515":{"position":[[154,9]]},"516":{"position":[[206,7]]},"518":{"position":[[191,7],[343,7]]},"523":{"position":[[159,6]]},"529":{"position":[[244,8]]},"535":{"position":[[904,7]]},"539":{"position":[[454,6]]},"541":{"position":[[162,8],[795,8]]},"542":{"position":[[965,7]]},"555":{"position":[[618,6],[668,8]]},"562":{"position":[[860,6],[920,7]]},"566":{"position":[[557,7]]},"570":{"position":[[451,8],[580,7]]},"571":{"position":[[220,6],[789,6]]},"574":{"position":[[280,8]]},"575":{"position":[[265,7]]},"580":{"position":[[66,6]]},"582":{"position":[[510,6]]},"585":{"position":[[190,7]]},"590":{"position":[[352,8]]},"595":{"position":[[827,6],[979,7]]},"599":{"position":[[481,6]]},"600":{"position":[[125,7]]},"601":{"position":[[67,8],[776,8]]},"610":{"position":[[670,7],[1618,7]]},"611":{"position":[[581,8]]},"612":{"position":[[64,7],[310,7]]},"618":{"position":[[731,7]]},"621":{"position":[[509,8]]},"623":{"position":[[243,7],[403,7]]},"624":{"position":[[540,8],[832,8]]},"626":{"position":[[266,8],[862,7]]},"630":{"position":[[550,8],[602,7]]},"631":{"position":[[280,7]]},"632":{"position":[[164,7],[368,8],[1716,7],[1852,10],[2437,7]]},"634":{"position":[[286,7],[565,7]]},"678":{"position":[[49,6],[105,6],[135,6]]},"679":{"position":[[348,6]]},"685":{"position":[[399,6],[474,7]]},"688":{"position":[[67,8]]},"689":{"position":[[299,6]]},"691":{"position":[[97,7],[123,7],[617,8]]},"696":{"position":[[1875,6]]},"700":{"position":[[418,6]]},"702":{"position":[[170,6],[455,7],[799,7]]},"703":{"position":[[1554,7]]},"723":{"position":[[1131,7],[1504,7],[1558,7],[1979,7]]},"749":{"position":[[8926,6],[16397,6],[16527,6],[23713,8]]},"754":{"position":[[594,6]]},"757":{"position":[[306,7]]},"781":{"position":[[284,7],[419,7],[481,7],[520,6],[858,7]]},"801":{"position":[[511,7]]},"802":{"position":[[377,8]]},"829":{"position":[[2836,8],[2932,7],[3031,6]]},"836":{"position":[[1484,7],[2406,7]]},"838":{"position":[[473,7]]},"841":{"position":[[610,7]]},"860":{"position":[[685,6]]},"861":{"position":[[2527,6]]},"870":{"position":[[125,7]]},"871":{"position":[[197,7],[405,7]]},"876":{"position":[[473,6],[601,7]]},"879":{"position":[[10,6],[458,8],[510,6]]},"880":{"position":[[177,8],[244,6]]},"881":{"position":[[49,6]]},"885":{"position":[[326,6]]},"896":{"position":[[223,7]]},"898":{"position":[[1218,6],[1296,6]]},"903":{"position":[[103,8]]},"941":{"position":[[227,7]]},"944":{"position":[[397,6]]},"948":{"position":[[533,6]]},"965":{"position":[[167,7]]},"981":{"position":[[840,7],[1368,7]]},"995":{"position":[[1445,6]]},"1004":{"position":[[756,7]]},"1039":{"position":[[159,8]]},"1041":{"position":[[1,7],[41,6],[132,6]]},"1042":{"position":[[1,7]]},"1044":{"position":[[270,6]]},"1048":{"position":[[411,8]]},"1059":{"position":[[9,6],[73,8],[110,6]]},"1106":{"position":[[407,8]]},"1115":{"position":[[427,6]]},"1117":{"position":[[476,6]]},"1132":{"position":[[956,7]]},"1150":{"position":[[64,7]]},"1188":{"position":[[237,6]]},"1198":{"position":[[2145,6]]},"1278":{"position":[[121,6]]},"1314":{"position":[[415,6],[637,6]]},"1316":{"position":[[868,6],[1082,7]]},"1318":{"position":[[189,7],[1182,7]]},"1319":{"position":[[57,6]]},"1320":{"position":[[916,6]]}},"keywords":{}}],["update:appl",{"_index":6474,"title":{},"content":{"1301":{"position":[[1067,12]]}},"keywords":{}}],["update_modified_datetim",{"_index":5205,"title":{},"content":{"898":{"position":[[1264,24]]}},"keywords":{}}],["updateat",{"_index":4994,"title":{},"content":{"875":{"position":[[2318,8],[2386,9],[2449,9],[2483,9],[4924,8]]}},"keywords":{}}],["updatecrdt",{"_index":3882,"title":{},"content":{"682":{"position":[[256,12]]}},"keywords":{}}],["updated/ad",{"_index":5549,"title":{},"content":{"1004":{"position":[[458,13]]}},"keywords":{}}],["updatedat",{"_index":2693,"title":{},"content":{"412":{"position":[[4928,9]]},"875":{"position":[[1660,9],[2137,9],[2277,9],[2466,9],[2500,9],[2669,9],[2716,10],[3192,9],[5408,10]]},"885":{"position":[[581,10],[676,10],[747,10],[1644,9],[2211,9],[2555,10]]},"886":{"position":[[542,10],[713,9],[749,9],[2427,9],[3626,10],[3664,9]]},"888":{"position":[[1159,10]]},"984":{"position":[[429,9]]},"986":{"position":[[1196,10]]},"988":{"position":[[4413,10],[5456,10],[5515,10]]},"991":{"position":[[133,9]]},"1309":{"position":[[852,9]]}},"keywords":{}}],["updatedat+id",{"_index":5449,"title":{},"content":{"986":{"position":[[1299,12]]}},"keywords":{}}],["updates.transpar",{"_index":3895,"title":{},"content":{"688":{"position":[[1017,20]]}},"keywords":{}}],["updates.y",{"_index":3909,"title":{},"content":{"690":{"position":[[393,11]]}},"keywords":{}}],["updates—keep",{"_index":3107,"title":{},"content":{"476":{"position":[[298,15]]}},"keywords":{}}],["upfront",{"_index":2432,"title":{},"content":{"399":{"position":[[501,8]]}},"keywords":{}}],["upgrad",{"_index":1890,"title":{},"content":{"314":{"position":[[929,7]]},"412":{"position":[[11287,9],[11463,7]]},"483":{"position":[[978,7]]},"636":{"position":[[132,7]]},"876":{"position":[[399,9]]},"990":{"position":[[1102,7]]}},"keywords":{}}],["upload",{"_index":3027,"title":{},"content":{"462":{"position":[[636,7]]}},"keywords":{}}],["upon",{"_index":1406,"title":{},"content":{"226":{"position":[[95,4]]},"287":{"position":[[1227,4]]},"480":{"position":[[112,4]]},"631":{"position":[[288,4]]},"636":{"position":[[337,4]]},"751":{"position":[[1,4]]}},"keywords":{}}],["upper",{"_index":2718,"title":{},"content":{"412":{"position":[[7236,5]]},"461":{"position":[[1068,5]]}},"keywords":{}}],["uproot",{"_index":2664,"title":{},"content":{"412":{"position":[[1467,8]]}},"keywords":{}}],["upsert",{"_index":5342,"title":{"946":{"position":[[0,9]]}},"content":{"947":{"position":[[9,8],[98,8]]},"948":{"position":[[19,6],[157,9],[203,6],[297,6],[703,6]]}},"keywords":{}}],["upsertloc",{"_index":5602,"title":{"1015":{"position":[[0,14]]}},"content":{},"keywords":{}}],["upsid",{"_index":2661,"title":{},"content":{"412":{"position":[[1181,6]]}},"keywords":{}}],["url",{"_index":3586,"title":{},"content":{"612":{"position":[[775,3]]},"616":{"position":[[803,3]]},"749":{"position":[[16133,3]]},"846":{"position":[[242,3],[281,4]]},"848":{"position":[[200,5],[607,4],[756,4],[1391,4]]},"851":{"position":[[227,4]]},"852":{"position":[[274,4]]},"872":{"position":[[4543,4]]},"875":{"position":[[3020,3],[7952,3]]},"876":{"position":[[455,5]]},"878":{"position":[[145,3],[380,4],[428,3]]},"879":{"position":[[104,3]]},"886":{"position":[[1061,4],[1091,4],[2693,4],[2723,4],[3880,4],[3910,4],[4036,4],[4579,6]]},"887":{"position":[[343,4]]},"888":{"position":[[484,4]]},"889":{"position":[[533,4]]},"893":{"position":[[402,4]]},"904":{"position":[[2620,4]]},"988":{"position":[[494,3]]},"1100":{"position":[[512,4],[531,4]]},"1101":{"position":[[753,4]]},"1149":{"position":[[1403,3],[1432,4]]},"1219":{"position":[[939,4]]},"1220":{"position":[[502,4]]},"1229":{"position":[[23,3]]},"1268":{"position":[[23,3]]}},"keywords":{}}],["url("worker.js"",{"_index":2265,"title":{},"content":{"392":{"position":[[3936,26]]}},"keywords":{}}],["url('./mi",{"_index":6329,"title":{},"content":{"1268":{"position":[[492,9]]}},"keywords":{}}],["us",{"_index":4,"title":{"46":{"position":[[4,3]]},"47":{"position":[[4,5]]},"87":{"position":[[0,3]]},"96":{"position":[[0,5]]},"127":{"position":[[0,5]]},"130":{"position":[[0,3]]},"142":{"position":[[19,5]]},"143":{"position":[[0,3]]},"144":{"position":[[0,3]]},"145":{"position":[[0,3]]},"171":{"position":[[0,5]]},"187":{"position":[[0,5]]},"202":{"position":[[14,3]]},"249":{"position":[[14,3]]},"267":{"position":[[0,3]]},"284":{"position":[[0,5]]},"286":{"position":[[0,5]]},"332":{"position":[[0,5]]},"346":{"position":[[19,5]]},"372":{"position":[[0,5]]},"375":{"position":[[0,3]]},"420":{"position":[[19,3]]},"423":{"position":[[0,5]]},"428":{"position":[[17,3]]},"430":{"position":[[12,3]]},"431":{"position":[[8,3]]},"446":{"position":[[0,3]]},"497":{"position":[[23,3]]},"503":{"position":[[0,5]]},"522":{"position":[[0,5]]},"523":{"position":[[0,5]]},"534":{"position":[[4,3]]},"535":{"position":[[11,3]]},"563":{"position":[[8,5]]},"590":{"position":[[19,5]]},"594":{"position":[[4,3]]},"595":{"position":[[11,3]]},"601":{"position":[[0,5]]},"602":{"position":[[0,5]]},"624":{"position":[[20,3]]},"655":{"position":[[0,5]]},"687":{"position":[[12,3]]},"717":{"position":[[0,5]]},"718":{"position":[[0,5]]},"723":{"position":[[12,5]]},"724":{"position":[[0,5]]},"736":{"position":[[0,3]]},"745":{"position":[[0,5]]},"747":{"position":[[0,5]]},"765":{"position":[[0,3]]},"795":{"position":[[0,3]]},"802":{"position":[[0,3]]},"818":{"position":[[0,5]]},"857":{"position":[[0,5]]},"860":{"position":[[15,3]]},"904":{"position":[[0,5]]},"1021":{"position":[[0,3]]},"1029":{"position":[[0,5]]},"1089":{"position":[[0,5]]},"1090":{"position":[[0,3]]},"1095":{"position":[[0,3]]},"1098":{"position":[[0,5]]},"1099":{"position":[[0,5]]},"1124":{"position":[[0,3]]},"1125":{"position":[[0,5]]},"1126":{"position":[[0,5]]},"1138":{"position":[[0,5]]},"1144":{"position":[[7,3]]},"1146":{"position":[[0,5]]},"1148":{"position":[[3,3]]},"1149":{"position":[[3,3]]},"1158":{"position":[[7,3]]},"1177":{"position":[[0,5]]},"1182":{"position":[[0,5]]},"1189":{"position":[[0,5]]},"1204":{"position":[[0,5]]},"1210":{"position":[[0,5]]},"1211":{"position":[[0,5]]},"1213":{"position":[[57,4]]},"1222":{"position":[[0,5]]},"1257":{"position":[[10,3]]},"1271":{"position":[[0,5]]},"1273":{"position":[[0,5]]},"1293":{"position":[[34,3]]},"1310":{"position":[[0,5]]},"1311":{"position":[[0,5]]}},"content":{"1":{"position":[[29,3],[189,3]]},"2":{"position":[[24,3]]},"3":{"position":[[59,3]]},"4":{"position":[[51,4],[253,3]]},"5":{"position":[[126,3]]},"6":{"position":[[14,4],[170,4],[618,3]]},"7":{"position":[[14,4],[144,4],[180,3],[453,3]]},"8":{"position":[[1,4],[96,3],[629,5],[696,3]]},"9":{"position":[[1,4],[113,3]]},"11":{"position":[[1,4],[55,4]]},"13":{"position":[[296,3]]},"14":{"position":[[911,3],[999,4]]},"15":{"position":[[354,4]]},"16":{"position":[[477,4]]},"17":{"position":[[135,4],[290,4],[399,4]]},"19":{"position":[[1007,3]]},"21":{"position":[[65,6]]},"24":{"position":[[636,3]]},"25":{"position":[[111,4]]},"26":{"position":[[221,4]]},"27":{"position":[[215,4]]},"28":{"position":[[656,5]]},"29":{"position":[[245,6]]},"30":{"position":[[61,4]]},"33":{"position":[[469,4],[542,5]]},"34":{"position":[[107,4]]},"35":{"position":[[504,6]]},"36":{"position":[[481,3]]},"38":{"position":[[635,4],[768,4],[917,3]]},"39":{"position":[[388,4]]},"42":{"position":[[272,3]]},"43":{"position":[[267,4],[322,4],[653,3]]},"45":{"position":[[296,3]]},"46":{"position":[[170,5]]},"51":{"position":[[73,5]]},"55":{"position":[[150,5],[1002,3]]},"56":{"position":[[171,5]]},"57":{"position":[[441,5]]},"58":{"position":[[37,3],[123,3]]},"59":{"position":[[264,3]]},"63":{"position":[[163,4]]},"65":{"position":[[209,4],[622,3],[1434,5]]},"68":{"position":[[21,3]]},"73":{"position":[[23,4]]},"84":{"position":[[399,5]]},"105":{"position":[[22,4]]},"114":{"position":[[412,5]]},"122":{"position":[[300,6]]},"128":{"position":[[4,3],[114,5],[268,5]]},"129":{"position":[[9,4],[312,5]]},"130":{"position":[[173,3]]},"131":{"position":[[132,4],[824,6]]},"132":{"position":[[252,5]]},"133":{"position":[[294,6]]},"139":{"position":[[58,5]]},"141":{"position":[[231,6]]},"143":{"position":[[83,5]]},"149":{"position":[[412,5]]},"162":{"position":[[554,4],[814,3]]},"165":{"position":[[166,5]]},"173":{"position":[[243,5],[3129,4]]},"175":{"position":[[403,5]]},"177":{"position":[[172,5]]},"185":{"position":[[159,6]]},"188":{"position":[[122,4],[297,4],[411,3],[535,4],[1622,3],[2058,3]]},"189":{"position":[[175,4],[328,4],[600,6]]},"194":{"position":[[25,4]]},"197":{"position":[[132,4]]},"202":{"position":[[295,5]]},"203":{"position":[[178,5]]},"207":{"position":[[122,4]]},"210":{"position":[[16,5]]},"211":{"position":[[539,3]]},"212":{"position":[[14,4],[589,4]]},"215":{"position":[[198,5],[298,6]]},"218":{"position":[[169,5]]},"225":{"position":[[80,4]]},"230":{"position":[[67,5]]},"231":{"position":[[31,5],[182,5]]},"238":{"position":[[126,5]]},"239":{"position":[[173,5]]},"241":{"position":[[46,5]]},"251":{"position":[[232,5]]},"254":{"position":[[351,3]]},"255":{"position":[[1658,5]]},"260":{"position":[[1,3]]},"261":{"position":[[96,5],[525,3]]},"265":{"position":[[30,5]]},"266":{"position":[[867,4],[1003,3],[1082,6]]},"267":{"position":[[90,3],[1452,3]]},"269":{"position":[[183,5]]},"284":{"position":[[146,3]]},"287":{"position":[[126,3],[819,6]]},"298":{"position":[[212,3],[519,3]]},"299":{"position":[[1498,4]]},"300":{"position":[[75,3],[157,4],[408,4]]},"303":{"position":[[137,4],[1244,5]]},"313":{"position":[[108,3]]},"314":{"position":[[72,3]]},"315":{"position":[[128,5]]},"320":{"position":[[130,3]]},"321":{"position":[[440,3]]},"325":{"position":[[277,3]]},"326":{"position":[[8,3]]},"331":{"position":[[39,3]]},"333":{"position":[[131,3]]},"334":{"position":[[159,4]]},"335":{"position":[[69,3],[134,5]]},"336":{"position":[[108,4],[254,4],[424,4]]},"344":{"position":[[1,3]]},"347":{"position":[[410,5]]},"357":{"position":[[637,4]]},"360":{"position":[[259,4]]},"362":{"position":[[1481,5]]},"364":{"position":[[90,4],[125,5]]},"365":{"position":[[1008,5]]},"366":{"position":[[601,4]]},"367":{"position":[[562,4]]},"372":{"position":[[34,3]]},"373":{"position":[[46,5]]},"376":{"position":[[463,5]]},"383":{"position":[[148,5]]},"386":{"position":[[60,3]]},"390":{"position":[[1080,3],[1719,3]]},"391":{"position":[[382,5]]},"392":{"position":[[181,3],[790,3],[862,4],[2213,3],[3212,5],[5028,6]]},"393":{"position":[[464,3]]},"396":{"position":[[660,4],[870,5],[1736,3],[1893,3]]},"398":{"position":[[356,3]]},"399":{"position":[[297,5]]},"400":{"position":[[518,3],[541,4]]},"401":{"position":[[930,3]]},"402":{"position":[[1004,5],[1159,4],[1198,5],[1704,3],[1927,4],[2012,4],[2055,4],[2357,3]]},"403":{"position":[[78,4]]},"405":{"position":[[106,3]]},"408":{"position":[[3334,3],[3342,5],[4677,3],[4758,3],[5229,6]]},"409":{"position":[[74,3]]},"410":{"position":[[1021,5]]},"411":{"position":[[2295,6],[3507,5],[4171,3],[4926,3]]},"412":{"position":[[256,3],[856,3],[1757,3],[2918,3],[3283,3],[3754,5],[3911,5],[4535,4],[4588,4],[4663,4],[5226,3],[6386,3],[7128,3],[7931,4],[9058,4],[10039,4],[12976,5],[13231,4],[14416,3],[14477,3],[14814,3],[15331,3]]},"416":{"position":[[293,4]]},"418":{"position":[[198,3]]},"419":{"position":[[1516,3],[1706,5]]},"420":{"position":[[455,5],[591,4],[1135,5],[1454,3]]},"422":{"position":[[159,3],[381,4]]},"425":{"position":[[262,5],[341,5],[429,5]]},"429":{"position":[[484,4]]},"430":{"position":[[73,3],[1028,5]]},"432":{"position":[[766,3],[1018,5]]},"433":{"position":[[423,5]]},"436":{"position":[[383,3]]},"439":{"position":[[104,3],[305,4],[637,5]]},"440":{"position":[[260,3],[384,3],[430,3]]},"444":{"position":[[417,3]]},"445":{"position":[[985,4]]},"447":{"position":[[546,4]]},"449":{"position":[[75,3]]},"450":{"position":[[113,4]]},"452":{"position":[[189,4],[801,7]]},"453":{"position":[[266,4],[561,3]]},"454":{"position":[[502,3]]},"455":{"position":[[66,3],[188,5],[527,3],[918,5]]},"456":{"position":[[130,5]]},"457":{"position":[[373,3]]},"458":{"position":[[420,5],[683,4],[1066,3],[1311,4],[1381,4],[1447,3]]},"460":{"position":[[259,3],[344,3],[457,3],[741,4],[1073,4],[1178,4]]},"461":{"position":[[1177,3]]},"462":{"position":[[240,3]]},"463":{"position":[[313,5],[1218,5]]},"464":{"position":[[1369,5]]},"468":{"position":[[136,4],[217,3],[320,4],[394,5],[628,4]]},"469":{"position":[[235,3],[950,5]]},"471":{"position":[[91,3]]},"481":{"position":[[6,4]]},"490":{"position":[[495,4]]},"491":{"position":[[1652,3]]},"494":{"position":[[488,3]]},"495":{"position":[[222,4]]},"496":{"position":[[215,3]]},"497":{"position":[[9,3],[272,3]]},"511":{"position":[[412,5]]},"520":{"position":[[415,4]]},"521":{"position":[[1,5],[267,4]]},"524":{"position":[[402,4],[647,4],[679,5],[737,5],[903,5]]},"531":{"position":[[412,5]]},"534":{"position":[[154,5],[311,5]]},"535":{"position":[[1277,3]]},"538":{"position":[[205,5]]},"540":{"position":[[155,5]]},"542":{"position":[[709,5]]},"543":{"position":[[28,5],[234,3]]},"544":{"position":[[396,5]]},"548":{"position":[[14,3],[145,7]]},"551":{"position":[[283,3]]},"554":{"position":[[106,3],[277,5],[317,4],[407,3],[626,3],[687,3]]},"555":{"position":[[803,4]]},"556":{"position":[[218,5],[1097,5],[1366,3],[1559,3]]},"557":{"position":[[14,3],[94,5],[182,3]]},"559":{"position":[[1550,3]]},"560":{"position":[[558,3]]},"562":{"position":[[1606,5]]},"563":{"position":[[650,5]]},"566":{"position":[[770,4]]},"567":{"position":[[898,5]]},"570":{"position":[[737,3]]},"577":{"position":[[37,5]]},"579":{"position":[[115,5]]},"580":{"position":[[186,3]]},"581":{"position":[[155,4],[260,4]]},"590":{"position":[[270,3],[429,5]]},"591":{"position":[[410,5]]},"594":{"position":[[152,5],[309,5]]},"598":{"position":[[206,5]]},"603":{"position":[[28,5],[232,3]]},"604":{"position":[[330,5]]},"608":{"position":[[14,3],[145,7]]},"610":{"position":[[100,4]]},"611":{"position":[[958,3],[1290,3]]},"613":{"position":[[733,3],[972,3],[1066,5]]},"614":{"position":[[554,4],[744,3],[990,5]]},"616":{"position":[[973,4],[1196,3]]},"617":{"position":[[482,3],[705,3],[964,5],[1126,3],[1178,3],[1277,3],[1899,3],[2331,3]]},"618":{"position":[[134,4]]},"619":{"position":[[251,5],[349,4]]},"620":{"position":[[690,3]]},"623":{"position":[[280,4],[337,4]]},"624":{"position":[[100,3],[1326,3],[1591,3]]},"626":{"position":[[635,4],[741,4],[899,4]]},"627":{"position":[[64,5]]},"628":{"position":[[98,3],[193,3]]},"632":{"position":[[1238,5]]},"635":{"position":[[215,4]]},"642":{"position":[[78,5]]},"653":{"position":[[78,3],[1371,4]]},"655":{"position":[[335,3]]},"656":{"position":[[381,3]]},"659":{"position":[[190,3]]},"660":{"position":[[199,3]]},"661":{"position":[[214,3],[424,3],[808,3],[1413,5],[1843,3]]},"662":{"position":[[450,4],[528,3],[936,3],[1091,3],[1176,3]]},"675":{"position":[[117,3]]},"676":{"position":[[6,4],[110,4]]},"678":{"position":[[177,4]]},"679":{"position":[[168,4]]},"680":{"position":[[4,3],[274,3],[995,3]]},"681":{"position":[[228,5],[607,5]]},"682":{"position":[[150,3]]},"683":{"position":[[533,3],[655,3]]},"686":{"position":[[76,4],[161,3],[302,3],[413,4],[499,5],[731,5],[779,3]]},"687":{"position":[[18,3],[227,3],[268,5]]},"688":{"position":[[167,3],[218,3]]},"689":{"position":[[534,5]]},"690":{"position":[[1,3],[233,3]]},"693":{"position":[[4,3],[530,3]]},"696":{"position":[[944,3],[1054,4],[1314,3]]},"697":{"position":[[176,4]]},"698":{"position":[[955,3],[3065,5],[3163,3]]},"700":{"position":[[919,3],[1018,3]]},"703":{"position":[[686,3],[1256,3],[1619,3]]},"705":{"position":[[310,3]]},"707":{"position":[[424,3]]},"708":{"position":[[92,3],[533,3]]},"709":{"position":[[18,4],[890,5],[1184,5],[1232,5],[1296,3]]},"710":{"position":[[110,4],[360,4],[487,3],[739,3],[952,3],[1020,5],[1233,3],[2307,3],[2466,5]]},"711":{"position":[[245,5],[427,3],[704,3],[1910,5]]},"712":{"position":[[14,3],[199,3]]},"714":{"position":[[518,4],[1002,3]]},"716":{"position":[[30,4],[446,3]]},"717":{"position":[[272,4],[380,4],[1046,5]]},"719":{"position":[[216,3]]},"721":{"position":[[12,5],[251,3]]},"723":{"position":[[803,4],[1919,5],[2291,3]]},"724":{"position":[[571,4],[1682,3]]},"728":{"position":[[135,3]]},"729":{"position":[[10,3]]},"730":{"position":[[85,3]]},"736":{"position":[[266,5]]},"737":{"position":[[505,3]]},"746":{"position":[[367,4],[619,4]]},"749":{"position":[[744,4],[881,4],[1031,4],[1780,3],[2125,4],[2874,3],[3207,4],[3575,4],[4258,4],[4390,3],[4641,3],[5046,3],[5656,3],[6133,4],[6881,4],[7233,3],[12065,3],[12782,3],[13670,3],[20022,4],[20158,4],[20323,4],[20481,4],[20582,4],[20750,4],[20921,3],[21773,3],[22607,4],[22762,4],[22853,3],[22948,4],[23793,4]]},"751":{"position":[[762,5]]},"752":{"position":[[1374,3]]},"753":{"position":[[119,3]]},"755":{"position":[[8,3]]},"756":{"position":[[8,3]]},"759":{"position":[[534,5]]},"760":{"position":[[530,5]]},"761":{"position":[[77,3],[256,3]]},"764":{"position":[[276,6]]},"765":{"position":[[16,6]]},"770":{"position":[[67,3],[218,3]]},"772":{"position":[[593,3],[1882,3],[2108,4]]},"773":{"position":[[27,3],[53,3],[340,4],[358,4]]},"774":{"position":[[107,3],[374,5],[411,4]]},"775":{"position":[[1,5],[624,3]]},"776":{"position":[[240,3],[286,4]]},"783":{"position":[[17,4],[250,3],[310,4]]},"785":{"position":[[260,3]]},"789":{"position":[[336,3]]},"791":{"position":[[237,3]]},"795":{"position":[[68,3]]},"796":{"position":[[791,3]]},"797":{"position":[[228,5]]},"798":{"position":[[753,5],[1001,4]]},"799":{"position":[[356,3],[404,3]]},"800":{"position":[[613,4]]},"801":{"position":[[105,3],[893,3]]},"802":{"position":[[594,3]]},"806":{"position":[[731,3]]},"808":{"position":[[463,5]]},"810":{"position":[[41,3]]},"815":{"position":[[284,3]]},"816":{"position":[[418,4]]},"817":{"position":[[164,4]]},"820":{"position":[[234,3],[294,4],[512,3]]},"821":{"position":[[39,3],[160,3],[294,3],[483,3],[555,3],[770,3]]},"824":{"position":[[436,5]]},"825":{"position":[[33,3],[502,3],[1082,4]]},"828":{"position":[[376,4]]},"829":{"position":[[909,3],[1025,5],[2292,3]]},"830":{"position":[[274,5]]},"831":{"position":[[192,5]]},"834":{"position":[[51,4],[102,3],[120,3]]},"835":{"position":[[665,3]]},"836":{"position":[[216,3],[357,5],[388,3],[1141,5],[1260,5]]},"837":{"position":[[290,4],[834,3],[1014,3],[1048,3],[1224,3],[2013,4]]},"838":{"position":[[970,4],[1183,3],[1210,3],[1397,3],[1614,3],[2263,3],[2389,5],[3081,5],[3190,5],[3391,3]]},"839":{"position":[[477,3],[1208,4]]},"840":{"position":[[471,5],[656,3]]},"842":{"position":[[21,5],[109,3]]},"846":{"position":[[1398,4],[1527,4],[1550,4]]},"847":{"position":[[86,5]]},"849":{"position":[[418,3],[563,3],[698,3],[733,3],[777,3]]},"854":{"position":[[1125,3],[1207,4],[1699,3]]},"857":{"position":[[17,4],[569,3]]},"858":{"position":[[113,5],[467,3]]},"861":{"position":[[16,3],[93,3],[1458,3],[2019,3],[2249,4]]},"863":{"position":[[919,3]]},"865":{"position":[[179,3]]},"871":{"position":[[777,3]]},"872":{"position":[[309,5],[429,5],[1489,3],[3048,4]]},"875":{"position":[[1370,4],[1541,3],[1581,4],[1639,3],[1711,4],[4223,4],[4351,4],[5666,3],[6566,4],[6927,3],[7037,3],[7091,4]]},"882":{"position":[[60,4]]},"884":{"position":[[12,3]]},"885":{"position":[[103,4],[1231,4],[2421,3]]},"886":{"position":[[283,3],[1448,5],[1795,4],[4020,3],[5011,3]]},"888":{"position":[[260,3]]},"889":{"position":[[986,4],[1063,3]]},"890":{"position":[[94,4],[416,4]]},"894":{"position":[[4,3],[39,3]]},"897":{"position":[[77,5],[151,5],[235,5],[291,5],[528,3]]},"898":{"position":[[574,3],[2053,3],[2128,3],[2808,3],[2869,3]]},"901":{"position":[[256,4]]},"902":{"position":[[938,3]]},"904":{"position":[[12,3],[1723,4],[2030,3],[2220,3],[2361,3],[2395,4],[2636,3],[2713,3]]},"906":{"position":[[238,4],[427,3],[542,4],[813,4]]},"910":{"position":[[104,4],[162,3]]},"911":{"position":[[289,3],[457,3]]},"912":{"position":[[53,5]]},"916":{"position":[[16,3]]},"917":{"position":[[466,3],[535,5],[558,3]]},"932":{"position":[[565,3]]},"934":{"position":[[547,4],[811,4]]},"935":{"position":[[59,4]]},"936":{"position":[[77,4]]},"942":{"position":[[1,3]]},"943":{"position":[[163,6]]},"944":{"position":[[49,3]]},"945":{"position":[[49,3],[311,3]]},"949":{"position":[[39,3]]},"950":{"position":[[185,3]]},"952":{"position":[[1,3],[127,5]]},"953":{"position":[[47,3]]},"958":{"position":[[356,3]]},"961":{"position":[[115,3],[274,4]]},"962":{"position":[[120,3],[209,3],[228,3],[382,4],[477,3],[526,3],[604,3],[841,3]]},"963":{"position":[[26,3]]},"965":{"position":[[213,4]]},"968":{"position":[[23,3]]},"971":{"position":[[1,3],[239,5]]},"972":{"position":[[46,3]]},"975":{"position":[[167,3]]},"977":{"position":[[39,3],[196,5],[230,6]]},"981":{"position":[[729,3],[1525,4]]},"983":{"position":[[52,3]]},"984":{"position":[[102,4],[463,4]]},"986":{"position":[[4,3],[262,5],[546,4],[1444,4]]},"987":{"position":[[809,3]]},"988":{"position":[[1146,3],[1786,4],[2196,5],[3089,4],[4569,4],[4942,3],[5013,5]]},"989":{"position":[[80,4],[234,4]]},"990":{"position":[[385,3],[614,4],[988,3],[1147,4]]},"991":{"position":[[156,3]]},"992":{"position":[[79,4]]},"995":{"position":[[498,4],[1191,5],[1350,5],[1427,3]]},"996":{"position":[[124,4]]},"999":{"position":[[88,4]]},"1006":{"position":[[143,3]]},"1014":{"position":[[284,3]]},"1020":{"position":[[118,4],[274,4]]},"1021":{"position":[[86,3]]},"1024":{"position":[[86,3]]},"1033":{"position":[[354,5]]},"1040":{"position":[[106,5]]},"1044":{"position":[[113,4],[237,3]]},"1047":{"position":[[207,3]]},"1048":{"position":[[114,6],[130,3]]},"1051":{"position":[[128,3]]},"1052":{"position":[[468,3]]},"1058":{"position":[[103,4]]},"1059":{"position":[[65,3]]},"1064":{"position":[[4,3],[44,3],[264,3]]},"1065":{"position":[[113,3],[157,3],[334,5],[562,5],[908,5]]},"1066":{"position":[[134,5],[303,5],[559,5]]},"1067":{"position":[[118,3],[269,5],[1073,5],[1261,5],[1720,3]]},"1071":{"position":[[39,4],[102,3]]},"1072":{"position":[[2537,3]]},"1074":{"position":[[219,4]]},"1077":{"position":[[74,4]]},"1078":{"position":[[351,4],[442,4],[756,5]]},"1079":{"position":[[181,3]]},"1080":{"position":[[312,4],[502,4],[777,4],[1037,3],[1084,3]]},"1081":{"position":[[4,3]]},"1082":{"position":[[443,4]]},"1084":{"position":[[24,4],[101,4],[219,3],[576,4]]},"1085":{"position":[[668,3],[3509,3]]},"1088":{"position":[[390,3]]},"1089":{"position":[[213,5]]},"1090":{"position":[[61,3],[389,3]]},"1091":{"position":[[135,3]]},"1092":{"position":[[24,3],[386,6]]},"1093":{"position":[[284,5]]},"1094":{"position":[[203,3]]},"1097":{"position":[[401,3]]},"1098":{"position":[[44,3]]},"1099":{"position":[[44,3]]},"1101":{"position":[[172,4]]},"1102":{"position":[[135,3],[821,5]]},"1104":{"position":[[181,4],[443,4],[816,4]]},"1105":{"position":[[53,4],[251,4],[394,3],[447,3],[870,3]]},"1106":{"position":[[55,4],[265,4]]},"1107":{"position":[[153,3],[384,4],[472,3],[976,3]]},"1108":{"position":[[252,3],[354,4],[627,4]]},"1111":{"position":[[89,5]]},"1112":{"position":[[226,3]]},"1114":{"position":[[123,4],[163,3]]},"1115":{"position":[[232,3],[508,4]]},"1117":{"position":[[193,5]]},"1118":{"position":[[120,3],[190,6],[224,3]]},"1120":{"position":[[389,4],[540,3]]},"1121":{"position":[[84,3]]},"1123":{"position":[[660,5]]},"1124":{"position":[[1,5],[96,3],[446,3],[1217,4],[1326,3],[2094,3]]},"1125":{"position":[[4,3],[491,4],[899,3]]},"1126":{"position":[[10,3],[447,3],[768,3]]},"1130":{"position":[[321,3]]},"1132":{"position":[[1,5],[71,5],[170,4]]},"1133":{"position":[[46,4],[360,3],[606,5],[661,3]]},"1134":{"position":[[523,3]]},"1135":{"position":[[75,3],[226,3]]},"1138":{"position":[[4,3],[84,3]]},"1139":{"position":[[155,5]]},"1140":{"position":[[304,3],[375,3]]},"1141":{"position":[[174,3]]},"1143":{"position":[[33,4],[313,4],[343,3]]},"1145":{"position":[[151,5]]},"1146":{"position":[[91,3],[138,3]]},"1147":{"position":[[125,5]]},"1149":{"position":[[81,3],[254,6],[568,5]]},"1151":{"position":[[88,5],[635,3],[762,3]]},"1152":{"position":[[67,3]]},"1154":{"position":[[536,3],[590,3]]},"1157":{"position":[[369,4]]},"1159":{"position":[[107,5],[167,4]]},"1161":{"position":[[206,4]]},"1162":{"position":[[308,4],[1080,5]]},"1163":{"position":[[183,3],[269,5]]},"1164":{"position":[[559,3]]},"1165":{"position":[[160,3],[543,3],[1004,3]]},"1167":{"position":[[14,4]]},"1171":{"position":[[232,4]]},"1172":{"position":[[169,3]]},"1174":{"position":[[10,3],[64,4]]},"1175":{"position":[[6,5]]},"1176":{"position":[[131,4]]},"1177":{"position":[[156,3]]},"1178":{"position":[[88,5],[634,3],[761,3]]},"1180":{"position":[[206,4]]},"1181":{"position":[[395,4]]},"1182":{"position":[[183,3],[269,5]]},"1183":{"position":[[136,3],[223,4],[269,3],[533,3]]},"1184":{"position":[[83,3],[251,3]]},"1188":{"position":[[26,5]]},"1189":{"position":[[94,3],[164,3]]},"1191":{"position":[[398,3],[500,3]]},"1192":{"position":[[561,4],[689,3]]},"1193":{"position":[[189,3],[281,3]]},"1195":{"position":[[126,3]]},"1196":{"position":[[79,5],[170,3]]},"1198":{"position":[[58,3],[1322,3],[1477,3],[1522,3],[1726,5],[1822,3],[2043,5]]},"1202":{"position":[[10,3]]},"1204":{"position":[[157,3]]},"1206":{"position":[[602,3]]},"1207":{"position":[[381,4]]},"1208":{"position":[[43,4],[227,4],[392,5],[576,3]]},"1210":{"position":[[69,3]]},"1211":{"position":[[121,3],[327,4],[395,5]]},"1213":{"position":[[10,3],[62,3],[345,4],[374,5],[778,3]]},"1214":{"position":[[259,3],[342,3],[757,3],[875,3],[966,4]]},"1215":{"position":[[283,3]]},"1219":{"position":[[119,4]]},"1220":{"position":[[32,4]]},"1222":{"position":[[291,3],[348,3],[1049,3]]},"1225":{"position":[[393,3]]},"1226":{"position":[[330,4]]},"1227":{"position":[[194,4],[417,3],[501,4]]},"1228":{"position":[[145,4]]},"1229":{"position":[[144,4]]},"1231":{"position":[[34,5]]},"1233":{"position":[[7,3],[117,3],[164,3]]},"1235":{"position":[[17,3],[106,3],[282,3],[393,3],[459,3]]},"1237":{"position":[[110,3],[256,3],[408,4]]},"1238":{"position":[[142,3],[374,3]]},"1239":{"position":[[111,4],[213,4],[368,3]]},"1241":{"position":[[113,4]]},"1243":{"position":[[63,3]]},"1244":{"position":[[139,4]]},"1245":{"position":[[53,3]]},"1246":{"position":[[700,3],[882,4],[1355,4],[1490,3],[1720,4],[1828,4],[1961,4],[2030,3]]},"1247":{"position":[[67,4],[255,3],[440,3],[610,3]]},"1249":{"position":[[323,5]]},"1250":{"position":[[19,4]]},"1251":{"position":[[119,5],[175,4]]},"1252":{"position":[[4,5]]},"1263":{"position":[[287,3]]},"1264":{"position":[[246,4]]},"1265":{"position":[[187,4],[410,3],[495,4]]},"1266":{"position":[[57,5],[112,4],[787,4]]},"1267":{"position":[[309,3],[550,3]]},"1271":{"position":[[364,5],[502,3],[710,3],[895,4],[917,4],[1251,3],[1318,4]]},"1272":{"position":[[313,5]]},"1274":{"position":[[158,3]]},"1275":{"position":[[44,3]]},"1276":{"position":[[24,3],[116,3],[552,3]]},"1277":{"position":[[110,3],[482,5],[669,3]]},"1278":{"position":[[35,4],[80,3],[154,3],[195,3],[673,3]]},"1279":{"position":[[230,3]]},"1281":{"position":[[70,3]]},"1282":{"position":[[63,4],[370,3],[433,4]]},"1284":{"position":[[134,5],[418,3]]},"1286":{"position":[[66,5]]},"1287":{"position":[[40,3],[175,5],[217,3]]},"1288":{"position":[[128,4]]},"1292":{"position":[[42,5],[515,4]]},"1294":{"position":[[1846,5],[2117,4]]},"1295":{"position":[[35,4],[402,3],[1528,4]]},"1296":{"position":[[493,3],[1189,3],[1602,5],[1725,5],[1857,4]]},"1297":{"position":[[400,5]]},"1299":{"position":[[86,5],[404,4]]},"1300":{"position":[[30,5]]},"1301":{"position":[[89,3],[578,3],[1138,3]]},"1304":{"position":[[2026,5]]},"1307":{"position":[[678,5]]},"1309":{"position":[[167,4],[589,4],[1022,3]]},"1311":{"position":[[48,3],[1412,3],[1637,3],[1678,3]]},"1313":{"position":[[38,4],[502,4],[695,5],[970,5],[1036,3]]},"1314":{"position":[[183,3]]},"1315":{"position":[[355,3],[1135,5]]},"1316":{"position":[[2099,3],[2993,4],[3579,3]]},"1320":{"position":[[4,3],[304,3],[332,3],[485,3]]},"1324":{"position":[[221,4],[566,4]]}},"keywords":{}}],["us/docs/web/api/sharedworker?retiredlocale=d",{"_index":6268,"title":{},"content":{"1226":{"position":[[515,45]]}},"keywords":{}}],["us/docs/web/api/worker/work",{"_index":6302,"title":{},"content":{"1264":{"position":[[418,29]]}},"keywords":{}}],["usabl",{"_index":584,"title":{},"content":{"37":{"position":[[398,6]]},"323":{"position":[[199,6]]},"375":{"position":[[110,6]]},"411":{"position":[[5760,10]]},"421":{"position":[[1007,6]]},"432":{"position":[[1173,9]]},"582":{"position":[[93,7]]},"611":{"position":[[1123,6]]},"613":{"position":[[836,9]]},"617":{"position":[[75,9]]},"749":{"position":[[14210,6]]},"1031":{"position":[[262,7]]},"1040":{"position":[[292,6]]}},"keywords":{}}],["usag",{"_index":581,"title":{"300":{"position":[[32,6]]},"414":{"position":[[25,6]]},"672":{"position":[[0,5]]},"673":{"position":[[0,5]]},"674":{"position":[[0,5]]},"759":{"position":[[0,6]]},"766":{"position":[[0,6]]},"779":{"position":[[10,5]]},"820":{"position":[[0,6]]},"829":{"position":[[0,6]]},"846":{"position":[[0,6]]},"854":{"position":[[0,6]]},"866":{"position":[[0,6]]},"878":{"position":[[0,6]]},"884":{"position":[[0,6]]},"1130":{"position":[[0,6]]},"1134":{"position":[[0,6]]},"1154":{"position":[[0,6]]},"1163":{"position":[[0,6]]},"1172":{"position":[[0,6]]},"1201":{"position":[[0,6]]},"1218":{"position":[[0,6]]},"1219":{"position":[[0,5]]},"1224":{"position":[[0,6]]},"1274":{"position":[[0,5]]},"1275":{"position":[[0,5]]},"1276":{"position":[[0,5]]},"1277":{"position":[[0,5]]},"1278":{"position":[[0,5]]},"1279":{"position":[[0,5]]},"1280":{"position":[[0,5]]}},"content":{"37":{"position":[[282,6]]},"46":{"position":[[645,5]]},"57":{"position":[[435,5]]},"227":{"position":[[40,5]]},"236":{"position":[[205,6]]},"277":{"position":[[297,6]]},"298":{"position":[[42,5]]},"299":{"position":[[362,5]]},"301":{"position":[[35,5],[273,5]]},"306":{"position":[[106,6]]},"314":{"position":[[604,5]]},"315":{"position":[[1143,6]]},"336":{"position":[[202,6]]},"358":{"position":[[731,6]]},"361":{"position":[[300,6]]},"366":{"position":[[530,6]]},"412":{"position":[[9298,5],[10324,6]]},"433":{"position":[[379,5],[636,6]]},"473":{"position":[[231,5]]},"477":{"position":[[95,5],[259,5]]},"523":{"position":[[241,5]]},"559":{"position":[[172,5]]},"560":{"position":[[648,5]]},"563":{"position":[[190,6],[833,5]]},"566":{"position":[[610,5],[1220,5],[1396,5]]},"581":{"position":[[218,5]]},"587":{"position":[[105,6]]},"632":{"position":[[237,5]]},"639":{"position":[[186,5]]},"643":{"position":[[284,5]]},"696":{"position":[[718,6]]},"737":{"position":[[40,5]]},"779":{"position":[[88,5]]},"798":{"position":[[102,6]]},"832":{"position":[[149,5]]},"839":{"position":[[395,6]]},"841":{"position":[[1320,5]]},"886":{"position":[[4639,5]]},"995":{"position":[[554,5],[601,5]]},"1009":{"position":[[853,5]]},"1018":{"position":[[631,5]]},"1088":{"position":[[201,5]]},"1193":{"position":[[240,5]]}},"keywords":{}}],["usageacceler",{"_index":1882,"title":{},"content":{"311":{"position":[[209,17]]}},"keywords":{}}],["usagereact",{"_index":3116,"title":{},"content":{"479":{"position":[[140,13]]}},"keywords":{}}],["usage—brows",{"_index":2074,"title":{},"content":{"359":{"position":[[83,15]]}},"keywords":{}}],["usecas",{"_index":5623,"title":{"1022":{"position":[[0,8]]},"1023":{"position":[[0,8]]},"1024":{"position":[[0,8]]}},"content":{},"keywords":{}}],["usedspac",{"_index":1774,"title":{},"content":{"300":{"position":[[305,9],[422,11]]}},"keywords":{}}],["useeffect",{"_index":3305,"title":{},"content":{"541":{"position":[[191,9],[295,12]]},"559":{"position":[[211,9],[413,12]]},"562":{"position":[[1052,10],[1166,12]]},"829":{"position":[[1257,10],[1459,12]]}},"keywords":{}}],["useful.learn",{"_index":3384,"title":{},"content":{"557":{"position":[[276,12]]}},"keywords":{}}],["useliverxqueri",{"_index":4761,"title":{},"content":{"829":{"position":[[3101,14],[3238,14]]},"832":{"position":[[210,15]]}},"keywords":{}}],["useliverxquery(queri",{"_index":4762,"title":{},"content":{"829":{"position":[[3429,22]]}},"keywords":{}}],["user",{"_index":70,"title":{"97":{"position":[[46,5]]},"352":{"position":[[22,4]]},"410":{"position":[[0,4]]},"486":{"position":[[7,4]]},"782":{"position":[[46,4]]},"1090":{"position":[[32,4]]}},"content":{"4":{"position":[[180,5]]},"19":{"position":[[578,4]]},"35":{"position":[[642,4]]},"37":{"position":[[414,4]]},"39":{"position":[[147,4]]},"46":{"position":[[151,5],[533,4]]},"61":{"position":[[508,4]]},"65":{"position":[[412,4],[557,4],[600,5],[935,4],[994,4],[1418,5],[1928,4],[2108,4]]},"68":{"position":[[201,4]]},"69":{"position":[[160,4],[194,5]]},"70":{"position":[[236,4]]},"73":{"position":[[57,4]]},"77":{"position":[[50,4],[150,4]]},"83":{"position":[[393,4]]},"87":{"position":[[236,4],[271,4]]},"88":{"position":[[108,5],[200,4]]},"89":{"position":[[339,6]]},"90":{"position":[[168,4],[322,4]]},"91":{"position":[[52,6]]},"93":{"position":[[229,4]]},"95":{"position":[[240,4]]},"97":{"position":[[86,5],[110,5]]},"101":{"position":[[267,4]]},"103":{"position":[[221,4]]},"114":{"position":[[582,4]]},"117":{"position":[[156,4],[301,4]]},"125":{"position":[[301,4]]},"136":{"position":[[240,4],[350,4]]},"148":{"position":[[286,4]]},"152":{"position":[[333,4]]},"156":{"position":[[321,4]]},"157":{"position":[[277,5]]},"160":{"position":[[229,4]]},"173":{"position":[[981,4],[1480,5],[1825,5],[2748,5],[2807,5]]},"174":{"position":[[312,4]]},"175":{"position":[[590,4]]},"178":{"position":[[155,4],[405,4]]},"183":{"position":[[283,5]]},"185":{"position":[[322,4]]},"191":{"position":[[296,4]]},"198":{"position":[[449,4]]},"205":{"position":[[418,4]]},"206":{"position":[[188,5]]},"212":{"position":[[27,5],[627,5]]},"215":{"position":[[180,5]]},"216":{"position":[[212,4]]},"217":{"position":[[239,5]]},"218":{"position":[[127,4]]},"221":{"position":[[300,4]]},"237":{"position":[[196,5]]},"250":{"position":[[104,5],[286,4]]},"253":{"position":[[259,4]]},"265":{"position":[[487,4]]},"267":{"position":[[640,5],[1101,6],[1674,6]]},"269":{"position":[[345,4]]},"270":{"position":[[142,4],[189,4]]},"274":{"position":[[187,5]]},"275":{"position":[[109,4],[261,4]]},"277":{"position":[[328,6]]},"280":{"position":[[425,4],[485,5]]},"283":{"position":[[440,4]]},"289":{"position":[[1345,5]]},"292":{"position":[[222,5],[345,4]]},"295":{"position":[[262,6]]},"298":{"position":[[62,4],[444,4],[604,5]]},"299":{"position":[[399,4],[571,4]]},"300":{"position":[[659,5]]},"302":{"position":[[496,4],[953,4]]},"305":{"position":[[55,4],[471,4]]},"310":{"position":[[226,6]]},"312":{"position":[[217,4],[310,4]]},"318":{"position":[[436,4]]},"321":{"position":[[114,4]]},"323":{"position":[[538,4]]},"328":{"position":[[280,5]]},"330":{"position":[[103,5]]},"338":{"position":[[95,5]]},"340":{"position":[[138,5]]},"343":{"position":[[118,4]]},"346":{"position":[[707,4]]},"353":{"position":[[678,4]]},"354":{"position":[[1585,4]]},"361":{"position":[[996,4]]},"362":{"position":[[993,4]]},"369":{"position":[[836,4]]},"375":{"position":[[207,5],[692,5],[946,4]]},"377":{"position":[[17,4],[342,4]]},"380":{"position":[[405,4]]},"385":{"position":[[348,4]]},"386":{"position":[[88,4]]},"388":{"position":[[360,4]]},"394":{"position":[[233,4]]},"399":{"position":[[194,5],[239,5]]},"403":{"position":[[169,5]]},"407":{"position":[[519,6],[606,5],[712,4],[980,6],[1155,4]]},"408":{"position":[[588,4],[683,4],[3243,4]]},"409":{"position":[[289,5]]},"410":{"position":[[409,5],[485,4],[610,5],[1002,5],[1486,5],[2161,4]]},"411":{"position":[[424,5],[604,5],[986,4],[2361,5],[4036,4],[4322,4],[4787,5],[5316,5],[5471,5]]},"412":{"position":[[762,4],[3101,5],[3120,4],[3626,4],[5116,4],[5895,5],[5960,5],[6965,4],[7640,5],[7919,4],[8029,5],[8727,4],[9582,4],[10586,5],[11896,4],[12285,4],[12324,5],[12432,4],[12560,4],[12681,5],[15153,4]]},"414":{"position":[[416,4]]},"415":{"position":[[431,5]]},"416":{"position":[[519,6]]},"417":{"position":[[14,5],[369,5]]},"418":{"position":[[213,5],[568,5]]},"419":{"position":[[383,4]]},"420":{"position":[[1184,5]]},"421":{"position":[[34,5],[780,5],[902,5],[1159,6]]},"424":{"position":[[311,4],[430,4]]},"426":{"position":[[299,4],[375,4],[469,4]]},"427":{"position":[[383,4]]},"439":{"position":[[224,5],[525,4]]},"445":{"position":[[1205,4],[1538,4],[2504,4]]},"446":{"position":[[205,5],[653,5],[1068,4]]},"447":{"position":[[496,4]]},"454":{"position":[[739,5]]},"458":{"position":[[92,4],[345,5],[360,6]]},"461":{"position":[[495,4],[558,4]]},"469":{"position":[[1261,5]]},"473":{"position":[[184,4]]},"474":{"position":[[191,5]]},"475":{"position":[[132,4]]},"477":{"position":[[313,4]]},"481":{"position":[[553,4]]},"482":{"position":[[823,4]]},"483":{"position":[[831,4],[1286,4]]},"485":{"position":[[63,4]]},"486":{"position":[[41,5],[242,5]]},"487":{"position":[[85,4],[475,4]]},"489":{"position":[[346,5],[716,5]]},"491":{"position":[[949,4]]},"495":{"position":[[275,4],[291,5],[466,4]]},"496":{"position":[[560,4]]},"497":{"position":[[492,5]]},"498":{"position":[[590,4],[623,5],[705,5]]},"500":{"position":[[269,4],[645,5]]},"501":{"position":[[400,4]]},"502":{"position":[[466,5],[828,4],[885,5]]},"506":{"position":[[180,4]]},"507":{"position":[[165,4]]},"509":{"position":[[134,4]]},"510":{"position":[[106,4],[606,4],[769,5]]},"514":{"position":[[392,4]]},"516":{"position":[[157,5]]},"517":{"position":[[380,4]]},"519":{"position":[[297,5]]},"524":{"position":[[896,6]]},"526":{"position":[[72,4]]},"530":{"position":[[123,4]]},"534":{"position":[[103,4],[548,4]]},"550":{"position":[[186,4]]},"557":{"position":[[501,6]]},"559":{"position":[[1347,5],[1533,4]]},"560":{"position":[[335,4]]},"564":{"position":[[67,4],[1066,4]]},"565":{"position":[[35,4]]},"567":{"position":[[695,4],[1160,4]]},"569":{"position":[[1201,5]]},"571":{"position":[[270,4],[372,4],[1660,5]]},"574":{"position":[[215,5]]},"582":{"position":[[459,4],[743,4]]},"589":{"position":[[9,5],[208,4]]},"590":{"position":[[841,4]]},"594":{"position":[[101,4],[546,4]]},"617":{"position":[[608,4],[806,6],[1888,5]]},"619":{"position":[[27,6]]},"630":{"position":[[37,4],[189,4],[325,4],[357,4],[527,4],[1028,4]]},"634":{"position":[[194,4],[281,4],[631,4]]},"635":{"position":[[418,5]]},"638":{"position":[[43,4]]},"642":{"position":[[307,4]]},"643":{"position":[[341,4]]},"644":{"position":[[257,4],[710,4]]},"659":{"position":[[1001,4]]},"680":{"position":[[1159,6]]},"686":{"position":[[246,5]]},"687":{"position":[[139,4]]},"688":{"position":[[664,4]]},"690":{"position":[[126,4]]},"691":{"position":[[26,5]]},"696":{"position":[[347,4],[484,4],[1465,4],[1666,6]]},"697":{"position":[[284,4],[563,5]]},"698":{"position":[[21,5],[1947,5],[2005,5],[2137,5],[2772,5]]},"699":{"position":[[889,4]]},"700":{"position":[[198,4],[407,4],[533,4],[640,4]]},"701":{"position":[[113,6],[125,4],[212,5],[360,4],[694,4],[1073,6]]},"702":{"position":[[832,4]]},"703":{"position":[[86,5],[1397,4]]},"707":{"position":[[261,4]]},"711":{"position":[[1285,5],[1341,5]]},"715":{"position":[[233,4]]},"719":{"position":[[438,4]]},"723":{"position":[[313,5],[494,5],[2193,5],[2744,5]]},"752":{"position":[[321,4],[1355,5]]},"753":{"position":[[223,5]]},"759":{"position":[[1169,9],[1235,9],[1265,5]]},"772":{"position":[[950,6]]},"778":{"position":[[36,4],[196,4],[525,4]]},"779":{"position":[[112,4]]},"781":{"position":[[28,6],[167,4]]},"782":{"position":[[30,4],[135,5],[284,4],[397,4]]},"783":{"position":[[453,4],[604,4]]},"785":{"position":[[97,4],[659,5]]},"796":{"position":[[502,5],[697,4],[871,5]]},"798":{"position":[[362,4]]},"801":{"position":[[243,4],[482,4],[576,4]]},"817":{"position":[[149,5]]},"821":{"position":[[719,5],[840,5]]},"835":{"position":[[351,4],[1055,4]]},"839":{"position":[[342,4]]},"841":{"position":[[1344,4]]},"854":{"position":[[1383,4]]},"860":{"position":[[85,4],[861,5]]},"863":{"position":[[903,5]]},"904":{"position":[[2066,5],[2177,5],[2261,5]]},"912":{"position":[[141,4],[556,4],[645,5]]},"964":{"position":[[229,4]]},"977":{"position":[[278,5]]},"981":{"position":[[1309,5]]},"1009":{"position":[[133,4],[268,5],[406,4],[669,5]]},"1030":{"position":[[66,4]]},"1085":{"position":[[2141,4]]},"1088":{"position":[[236,4]]},"1090":{"position":[[48,6]]},"1092":{"position":[[364,6]]},"1093":{"position":[[178,6],[277,6]]},"1104":{"position":[[17,5],[35,4],[761,4],[780,4]]},"1121":{"position":[[130,5],[159,5],[312,5]]},"1123":{"position":[[333,5]]},"1140":{"position":[[149,4]]},"1148":{"position":[[107,4],[313,4]]},"1151":{"position":[[441,5]]},"1178":{"position":[[440,5]]},"1198":{"position":[[892,6],[1212,5]]},"1207":{"position":[[846,5]]},"1215":{"position":[[312,4],[610,5],[630,4]]},"1252":{"position":[[157,4]]},"1294":{"position":[[283,4]]},"1296":{"position":[[266,4]]},"1297":{"position":[[201,4]]},"1301":{"position":[[79,5]]},"1304":{"position":[[1110,5]]},"1313":{"position":[[579,4],[673,4]]},"1314":{"position":[[77,4]]},"1316":{"position":[[84,5],[398,5],[586,5],[613,5],[740,6]]},"1317":{"position":[[227,4],[583,4]]},"1318":{"position":[[228,4]]}},"keywords":{}}],["user'",{"_index":697,"title":{},"content":{"45":{"position":[[184,6]]},"63":{"position":[[77,6]]},"65":{"position":[[1745,6]]},"323":{"position":[[220,6]]},"365":{"position":[[635,6]]},"376":{"position":[[133,6]]},"391":{"position":[[105,6]]},"411":{"position":[[2905,6]]},"412":{"position":[[625,6],[3436,6],[6892,6],[7062,6]]},"419":{"position":[[1016,6]]},"424":{"position":[[137,6]]},"444":{"position":[[494,6]]},"461":{"position":[[1134,6]]},"497":{"position":[[586,6]]},"500":{"position":[[158,6]]},"575":{"position":[[603,6]]},"636":{"position":[[142,6]]}},"keywords":{}}],["user.onlin",{"_index":2784,"title":{},"content":{"415":{"position":[[239,11]]}},"keywords":{}}],["user.us",{"_index":1212,"title":{},"content":{"173":{"position":[[2971,10]]}},"keywords":{}}],["userid",{"_index":4888,"title":{},"content":{"858":{"position":[[361,7]]},"1105":{"position":[[481,6],[580,6]]}},"keywords":{}}],["userinput",{"_index":2306,"title":{},"content":{"394":{"position":[[594,9]]}},"keywords":{}}],["usernam",{"_index":3388,"title":{},"content":{"559":{"position":[[276,10],[497,12]]}},"keywords":{}}],["username"",{"_index":3400,"title":{},"content":{"559":{"position":[[703,14]]}},"keywords":{}}],["username}</p>",{"_index":3402,"title":{},"content":{"559":{"position":[[741,20]]}},"keywords":{}}],["users"",{"_index":4012,"title":{},"content":{"711":{"position":[[1794,13]]}},"keywords":{}}],["users.serv",{"_index":3671,"title":{},"content":{"623":{"position":[[166,12]]}},"keywords":{}}],["userscollect",{"_index":5065,"title":{},"content":{"878":{"position":[[315,16]]},"1101":{"position":[[688,16]]}},"keywords":{}}],["usersecret",{"_index":3138,"title":{},"content":{"482":{"position":[[780,12]]}},"keywords":{}}],["userxcollect",{"_index":3264,"title":{},"content":{"523":{"position":[[254,15]]},"829":{"position":[[1902,15]]},"832":{"position":[[230,17]]}},"keywords":{}}],["userxcollection('charact",{"_index":3266,"title":{},"content":{"523":{"position":[[346,30]]}},"keywords":{}}],["userxcollection('hero",{"_index":4756,"title":{},"content":{"829":{"position":[[1966,26]]}},"keywords":{}}],["userxqueri",{"_index":3265,"title":{},"content":{"523":{"position":[[274,10]]},"829":{"position":[[2300,10],[2326,10]]},"832":{"position":[[198,11]]}},"keywords":{}}],["userxquery(queri",{"_index":3271,"title":{},"content":{"523":{"position":[[514,17]]},"829":{"position":[[2514,18]]}},"keywords":{}}],["user’",{"_index":1719,"title":{},"content":{"298":{"position":[[543,6]]},"300":{"position":[[616,6]]},"302":{"position":[[10,6]]},"407":{"position":[[219,6]]},"559":{"position":[[75,6]]},"902":{"position":[[402,6]]}},"keywords":{}}],["usesign",{"_index":3185,"title":{},"content":{"494":{"position":[[504,10]]}},"keywords":{}}],["usesrxdatabaseinwork",{"_index":4178,"title":{"1213":{"position":[[8,22]]}},"content":{"749":{"position":[[3434,22],[3526,22]]},"1213":{"position":[[527,22],[697,23]]}},"keywords":{}}],["usest",{"_index":3304,"title":{},"content":{"541":{"position":[[181,9],[281,13]]},"559":{"position":[[201,9],[302,11]]},"562":{"position":[[1063,8],[1152,13]]},"829":{"position":[[1268,8],[1447,11]]}},"keywords":{}}],["usual",{"_index":1965,"title":{},"content":{"336":{"position":[[540,7]]},"358":{"position":[[171,7]]},"412":{"position":[[8294,7],[12930,7],[15024,7]]},"432":{"position":[[289,7]]},"495":{"position":[[866,7]]},"560":{"position":[[517,7]]},"561":{"position":[[175,9]]},"829":{"position":[[43,6],[1100,7]]},"898":{"position":[[4430,8]]},"932":{"position":[[1403,5]]},"1157":{"position":[[279,7]]}},"keywords":{}}],["ut1",{"_index":4132,"title":{},"content":{"749":{"position":[[9,3]]}},"keywords":{}}],["ut2",{"_index":4135,"title":{},"content":{"749":{"position":[[97,3]]}},"keywords":{}}],["ut3",{"_index":4139,"title":{},"content":{"749":{"position":[[444,3]]}},"keywords":{}}],["ut4",{"_index":4140,"title":{},"content":{"749":{"position":[[571,3]]}},"keywords":{}}],["ut5",{"_index":4141,"title":{},"content":{"749":{"position":[[662,3]]}},"keywords":{}}],["ut6",{"_index":4142,"title":{},"content":{"749":{"position":[[815,3]]}},"keywords":{}}],["ut7",{"_index":4143,"title":{},"content":{"749":{"position":[[952,3]]}},"keywords":{}}],["ut8",{"_index":4145,"title":{},"content":{"749":{"position":[[1087,3]]}},"keywords":{}}],["util",{"_index":936,"title":{"398":{"position":[[35,11]]}},"content":{"65":{"position":[[2016,7]]},"96":{"position":[[1,9]]},"104":{"position":[[6,8]]},"156":{"position":[[72,8]]},"162":{"position":[[264,8]]},"173":{"position":[[665,8]]},"174":{"position":[[470,8]]},"175":{"position":[[436,9]]},"180":{"position":[[31,8]]},"189":{"position":[[397,8]]},"219":{"position":[[108,9]]},"221":{"position":[[106,9]]},"228":{"position":[[316,11]]},"289":{"position":[[689,9]]},"365":{"position":[[456,8]]},"385":{"position":[[46,7]]},"390":{"position":[[1867,7]]},"392":{"position":[[4890,7]]},"393":{"position":[[321,7],[894,9]]},"402":{"position":[[2173,9]]},"426":{"position":[[142,9]]},"445":{"position":[[1967,9]]},"446":{"position":[[1253,9]]},"452":{"position":[[208,7]]},"469":{"position":[[1224,9]]},"480":{"position":[[1059,7]]},"494":{"position":[[21,7]]},"508":{"position":[[219,12]]},"540":{"position":[[198,9]]},"554":{"position":[[157,8]]},"559":{"position":[[1727,8]]},"571":{"position":[[1723,8]]},"614":{"position":[[440,9]]},"723":{"position":[[43,8]]},"802":{"position":[[1,9]]},"824":{"position":[[609,10]]},"1023":{"position":[[9,7]]},"1087":{"position":[[102,9]]},"1088":{"position":[[4,7]]},"1132":{"position":[[366,9]]},"1149":{"position":[[306,7]]},"1238":{"position":[[13,7]]},"1284":{"position":[[254,5]]},"1294":{"position":[[62,8]]}},"keywords":{}}],["ux",{"_index":2587,"title":{"778":{"position":[[0,2]]}},"content":{"410":{"position":[[19,3],[306,2]]}},"keywords":{}}],["v",{"_index":3503,"title":{},"content":{"580":{"position":[[767,1]]},"601":{"position":[[155,1]]},"602":{"position":[[530,1]]},"861":{"position":[[399,1]]},"887":{"position":[[613,3],[628,2]]},"1115":{"position":[[342,1],[408,1],[416,1],[478,1]]},"1290":{"position":[[126,1]]},"1291":{"position":[[110,3]]}},"keywords":{}}],["v.includ",{"_index":6390,"title":{},"content":{"1290":{"position":[[134,15]]},"1291":{"position":[[131,16]]}},"keywords":{}}],["v1",{"_index":2468,"title":{},"content":{"401":{"position":[[493,2],[530,2]]}},"keywords":{}}],["v14",{"_index":4506,"title":{},"content":{"761":{"position":[[562,4]]}},"keywords":{}}],["v15",{"_index":4504,"title":{},"content":{"761":{"position":[[438,3]]}},"keywords":{}}],["v2",{"_index":2215,"title":{},"content":{"391":{"position":[[413,2],[556,5]]},"401":{"position":[[216,2],[302,2],[341,2],[388,2],[435,2]]},"402":{"position":[[1915,2]]},"1141":{"position":[[264,3]]}},"keywords":{}}],["v2.x.x",{"_index":6034,"title":{},"content":{"1133":{"position":[[194,7]]}},"keywords":{}}],["v6.3.x).due",{"_index":6039,"title":{},"content":{"1133":{"position":[[484,11]]}},"keywords":{}}],["v7.3.x",{"_index":6035,"title":{},"content":{"1133":{"position":[[263,6]]}},"keywords":{}}],["val",{"_index":5991,"title":{},"content":{"1116":{"position":[[339,3],[389,3],[425,3],[477,3],[524,3],[593,3],[644,3]]}},"keywords":{}}],["valid",{"_index":2023,"title":{"367":{"position":[[7,10]]},"382":{"position":[[7,10]]},"764":{"position":[[16,8]]},"907":{"position":[[5,11]]},"1106":{"position":[[7,10]]},"1285":{"position":[[7,10]]},"1286":{"position":[[0,8]]},"1287":{"position":[[0,8]]},"1288":{"position":[[0,8],[20,6]]},"1292":{"position":[[30,11]]},"1317":{"position":[[12,11]]}},"content":{"354":{"position":[[594,10]]},"360":{"position":[[767,11]]},"364":{"position":[[446,8]]},"367":{"position":[[422,10],[476,10],[519,5]]},"491":{"position":[[1048,11]]},"495":{"position":[[383,10]]},"497":{"position":[[361,11],[690,11]]},"556":{"position":[[1425,8],[2003,5]]},"686":{"position":[[916,10]]},"703":{"position":[[274,8]]},"749":{"position":[[597,5],[2311,5],[12904,5],[13204,5],[16293,5],[21795,10],[21915,5],[23983,5],[24302,5]]},"764":{"position":[[28,10],[185,10],[291,8]]},"767":{"position":[[157,10]]},"793":{"position":[[417,10]]},"872":{"position":[[614,5]]},"880":{"position":[[35,5],[55,7]]},"888":{"position":[[183,5]]},"907":{"position":[[216,5]]},"934":{"position":[[151,5]]},"942":{"position":[[73,8]]},"944":{"position":[[577,10]]},"1084":{"position":[[32,8],[251,5]]},"1085":{"position":[[986,11]]},"1104":{"position":[[607,5]]},"1106":{"position":[[12,9],[273,8]]},"1132":{"position":[[486,10]]},"1227":{"position":[[462,5]]},"1237":{"position":[[271,10]]},"1251":{"position":[[112,6],[180,8]]},"1265":{"position":[[456,5]]},"1286":{"position":[[3,10],[42,11],[79,9],[352,10]]},"1287":{"position":[[17,5],[27,8],[62,10],[193,9],[398,10]]},"1288":{"position":[[25,5],[31,10],[95,8],[115,5],[144,5],[161,11],[260,7],[358,10]]},"1289":{"position":[[12,10]]},"1290":{"position":[[116,9]]},"1292":{"position":[[333,9],[687,9],[766,9],[946,9]]},"1317":{"position":[[49,9],[95,10],[315,10],[662,6]]}},"keywords":{}}],["validatepassword",{"_index":4302,"title":{},"content":{"749":{"position":[[12965,17]]}},"keywords":{}}],["validationremov",{"_index":4516,"title":{},"content":{"765":{"position":[[127,18]]}},"keywords":{}}],["validuntil",{"_index":5952,"title":{},"content":{"1104":{"position":[[367,11],[505,10]]}},"keywords":{}}],["valu",{"_index":557,"title":{"1122":{"position":[[33,5]]}},"content":{"35":{"position":[[349,5]]},"45":{"position":[[130,5]]},"63":{"position":[[125,5]]},"317":{"position":[[45,5]]},"356":{"position":[[461,6]]},"369":{"position":[[368,6]]},"390":{"position":[[484,7]]},"395":{"position":[[438,7]]},"396":{"position":[[1206,6],[1454,6]]},"397":{"position":[[32,6],[140,6],[284,6]]},"398":{"position":[[671,6],[3386,5]]},"402":{"position":[[956,7],[1182,5],[1212,5],[1487,5],[1534,5]]},"403":{"position":[[710,7]]},"424":{"position":[[180,5]]},"426":{"position":[[53,5]]},"427":{"position":[[495,5]]},"429":{"position":[[200,5],[558,6]]},"432":{"position":[[225,5],[1258,5],[1442,5]]},"441":{"position":[[177,5]]},"450":{"position":[[86,5],[318,6]]},"451":{"position":[[138,5],[266,5]]},"457":{"position":[[127,6]]},"459":{"position":[[1056,7]]},"468":{"position":[[174,5]]},"494":{"position":[[535,5]]},"533":{"position":[[160,5]]},"551":{"position":[[238,5]]},"559":{"position":[[56,5]]},"560":{"position":[[64,5],[388,5]]},"566":{"position":[[58,5]]},"567":{"position":[[995,5]]},"593":{"position":[[160,5]]},"659":{"position":[[529,6],[564,5]]},"681":{"position":[[358,5]]},"711":{"position":[[1347,6]]},"719":{"position":[[369,5]]},"749":{"position":[[3712,5],[4555,5],[11367,5],[17433,6],[21343,6],[23870,5],[24258,5]]},"764":{"position":[[144,5]]},"772":{"position":[[287,5]]},"804":{"position":[[67,5]]},"808":{"position":[[71,5],[328,6]]},"811":{"position":[[160,7]]},"829":{"position":[[2083,5]]},"831":{"position":[[185,6]]},"835":{"position":[[491,5]]},"837":{"position":[[1531,8]]},"841":{"position":[[82,5]]},"875":{"position":[[4933,6]]},"881":{"position":[[68,6]]},"886":{"position":[[1676,5]]},"887":{"position":[[40,6],[514,6]]},"898":{"position":[[4206,6]]},"950":{"position":[[101,5]]},"951":{"position":[[42,7]]},"986":{"position":[[945,5]]},"988":{"position":[[2032,6],[2094,5],[2164,6]]},"995":{"position":[[1280,5]]},"1039":{"position":[[56,6],[75,5],[168,5]]},"1040":{"position":[[88,6],[225,7]]},"1042":{"position":[[96,6]]},"1048":{"position":[[42,5]]},"1049":{"position":[[17,6]]},"1050":{"position":[[29,5]]},"1058":{"position":[[65,6]]},"1077":{"position":[[124,5]]},"1078":{"position":[[468,7]]},"1082":{"position":[[9,6],[132,7]]},"1107":{"position":[[264,5]]},"1109":{"position":[[133,5]]},"1115":{"position":[[116,5],[161,6],[197,5],[274,6],[299,5],[366,5],[434,5]]},"1123":{"position":[[37,5],[483,5]]},"1124":{"position":[[971,5]]},"1132":{"position":[[825,5]]},"1138":{"position":[[529,5]]},"1151":{"position":[[494,5]]},"1164":{"position":[[1174,5]]},"1177":{"position":[[390,6]]},"1178":{"position":[[493,5]]},"1206":{"position":[[246,5]]},"1222":{"position":[[746,6],[775,5],[824,5]]},"1226":{"position":[[312,5]]},"1246":{"position":[[1869,5]]},"1247":{"position":[[568,5]]},"1264":{"position":[[228,5]]},"1284":{"position":[[322,7]]},"1294":{"position":[[1295,7]]},"1296":{"position":[[1502,6],[1783,6]]},"1320":{"position":[[779,5]]}},"keywords":{}}],["valuabl",{"_index":899,"title":{},"content":{"64":{"position":[[170,8]]},"65":{"position":[[1981,8]]},"148":{"position":[[461,8]]},"267":{"position":[[912,8]]},"276":{"position":[[190,8]]},"370":{"position":[[280,8]]},"441":{"position":[[66,8]]},"526":{"position":[[228,8]]},"802":{"position":[[423,8]]}},"keywords":{}}],["value."",{"_index":4015,"title":{},"content":{"714":{"position":[[659,12]]}},"keywords":{}}],["value={usernam",{"_index":3396,"title":{},"content":{"559":{"position":[[610,16]]}},"keywords":{}}],["valueth",{"_index":5807,"title":{},"content":{"1074":{"position":[[401,8]]}},"keywords":{}}],["var",{"_index":3855,"title":{},"content":{"674":{"position":[[275,3]]},"1039":{"position":[[184,3]]},"1040":{"position":[[174,3],[233,3]]}},"keywords":{}}],["var/run/docker.sock:/var/run/docker.sock",{"_index":4895,"title":{},"content":{"861":{"position":[[577,41]]}},"keywords":{}}],["vari",{"_index":1705,"title":{},"content":{"298":{"position":[[144,4]]},"393":{"position":[[540,4]]},"461":{"position":[[654,6],[875,7]]},"696":{"position":[[1279,5]]},"841":{"position":[[980,6]]}},"keywords":{}}],["variabl",{"_index":1254,"title":{"729":{"position":[[20,9]]},"1202":{"position":[[20,9]]}},"content":{"188":{"position":[[1013,8]]},"299":{"position":[[615,10]]},"402":{"position":[[806,9],[861,9]]},"440":{"position":[[320,9]]},"674":{"position":[[109,8]]},"729":{"position":[[214,8]]},"817":{"position":[[60,10]]},"886":{"position":[[214,9],[811,10],[2458,9],[2535,9],[3698,10]]},"910":{"position":[[45,8]]},"1202":{"position":[[253,8]]},"1267":{"position":[[297,8]]}},"keywords":{}}],["variant",{"_index":3721,"title":{},"content":{"643":{"position":[[142,7]]}},"keywords":{}}],["varieti",{"_index":671,"title":{},"content":{"43":{"position":[[279,7]]},"179":{"position":[[176,7]]},"381":{"position":[[98,7]]},"613":{"position":[[169,7]]}},"keywords":{}}],["variou",{"_index":554,"title":{"72":{"position":[[27,7]]},"112":{"position":[[27,7]]},"492":{"position":[[17,7]]}},"content":{"35":{"position":[[270,7]]},"39":{"position":[[627,7]]},"60":{"position":[[39,7]]},"67":{"position":[[132,7]]},"72":{"position":[[131,7]]},"82":{"position":[[61,7]]},"113":{"position":[[95,7]]},"146":{"position":[[15,7]]},"162":{"position":[[15,7]]},"165":{"position":[[172,7]]},"174":{"position":[[2674,7],[3011,7]]},"192":{"position":[[145,7]]},"238":{"position":[[86,7]]},"267":{"position":[[45,7]]},"269":{"position":[[263,7]]},"280":{"position":[[494,7]]},"286":{"position":[[33,7]]},"288":{"position":[[167,7]]},"365":{"position":[[800,7]]},"368":{"position":[[114,7]]},"390":{"position":[[1174,7]]},"393":{"position":[[114,7]]},"396":{"position":[[1,7]]},"401":{"position":[[74,7]]},"420":{"position":[[1416,7]]},"441":{"position":[[577,7]]},"444":{"position":[[340,7]]},"469":{"position":[[1323,7]]},"479":{"position":[[218,7]]},"481":{"position":[[252,7]]},"483":{"position":[[267,7]]},"500":{"position":[[754,7]]},"502":{"position":[[1329,7]]},"504":{"position":[[42,7]]},"525":{"position":[[523,7]]},"543":{"position":[[226,7]]},"547":{"position":[[39,7]]},"565":{"position":[[100,7]]},"603":{"position":[[224,7]]},"607":{"position":[[39,7]]},"620":{"position":[[203,7]]},"736":{"position":[[94,7]]},"860":{"position":[[1010,7]]},"1072":{"position":[[1675,7]]},"1102":{"position":[[27,7]]},"1209":{"position":[[381,7]]},"1249":{"position":[[247,7]]},"1272":{"position":[[270,7]]}},"keywords":{}}],["vary.synchron",{"_index":6097,"title":{},"content":{"1157":{"position":[[199,16]]}},"keywords":{}}],["vd1",{"_index":4410,"title":{},"content":{"749":{"position":[[22026,3]]}},"keywords":{}}],["vd2",{"_index":4412,"title":{},"content":{"749":{"position":[[22146,3]]}},"keywords":{}}],["vector",{"_index":1501,"title":{"389":{"position":[[6,6]]},"390":{"position":[[10,6]]},"393":{"position":[[10,7]]},"394":{"position":[[14,6]]},"396":{"position":[[0,6]]},"398":{"position":[[14,6]]},"404":{"position":[[44,6]]}},"content":{"244":{"position":[[808,6]]},"252":{"position":[[275,6]]},"390":{"position":[[3,6],[117,8],[375,6],[495,7],[753,6],[834,7],[862,6],[1133,6],[1380,6],[1651,6],[1825,6],[1912,6]]},"391":{"position":[[43,6],[953,6]]},"392":{"position":[[1140,6],[1517,7],[2064,6],[2592,6]]},"393":{"position":[[91,7],[196,8],[498,8],[762,7],[887,6],[1151,7]]},"394":{"position":[[71,6]]},"395":{"position":[[381,6]]},"396":{"position":[[42,7],[1064,8],[1106,6],[1164,7]]},"397":{"position":[[1516,8],[1724,7]]},"398":{"position":[[527,7],[1892,6],[3475,6],[3523,6]]},"400":{"position":[[786,6]]},"401":{"position":[[168,6],[651,6]]},"402":{"position":[[78,6],[263,7],[676,7],[721,7],[2513,6]]},"403":{"position":[[753,8]]},"404":{"position":[[13,6]]},"408":{"position":[[3660,6]]},"412":{"position":[[10876,6]]},"689":{"position":[[184,8]]},"793":{"position":[[1178,6]]}},"keywords":{}}],["vector'",{"_index":2208,"title":{},"content":{"390":{"position":[[1588,8]]}},"keywords":{}}],["vector.j",{"_index":2257,"title":{},"content":{"392":{"position":[[3531,14]]}},"keywords":{}}],["vectorcollect",{"_index":2237,"title":{},"content":{"392":{"position":[[1739,16],[2716,17],[4622,17]]}},"keywords":{}}],["vectorcollection.find",{"_index":2402,"title":{},"content":{"398":{"position":[[1024,23],[1186,23],[2324,23]]}},"keywords":{}}],["vectorcollection.find().exec",{"_index":2312,"title":{},"content":{"394":{"position":[[709,31]]}},"keywords":{}}],["vectorcollection.upsert",{"_index":2248,"title":{},"content":{"392":{"position":[[2884,25]]}},"keywords":{}}],["vectorcollection.upsert(docdata",{"_index":2388,"title":{},"content":{"397":{"position":[[2211,33]]}},"keywords":{}}],["vectorsearchindexrange(searchembed",{"_index":2416,"title":{},"content":{"398":{"position":[[1940,39]]}},"keywords":{}}],["vectorsearchindexsimilarity(searchembed",{"_index":2391,"title":{},"content":{"398":{"position":[[694,44]]}},"keywords":{}}],["vendor",{"_index":236,"title":{},"content":{"14":{"position":[[1065,6]]},"202":{"position":[[397,6]]},"212":{"position":[[369,6]]},"249":{"position":[[333,6]]},"262":{"position":[[485,6],[564,6]]},"381":{"position":[[566,6]]},"412":{"position":[[1372,7],[1606,6],[2492,6]]},"839":{"position":[[1307,6]]},"840":{"position":[[497,6]]},"841":{"position":[[1574,6]]},"1112":{"position":[[311,7]]},"1124":{"position":[[114,6]]}},"keywords":{}}],["verbos",{"_index":2082,"title":{},"content":{"361":{"position":[[262,7]]},"566":{"position":[[318,8]]},"639":{"position":[[126,7]]}},"keywords":{}}],["veri",{"_index":484,"title":{},"content":{"29":{"position":[[440,4]]},"58":{"position":[[172,4]]},"305":{"position":[[574,4]]},"408":{"position":[[245,4],[1297,4]]},"412":{"position":[[15190,4]]},"415":{"position":[[132,4]]},"417":{"position":[[151,4]]},"468":{"position":[[639,4]]},"497":{"position":[[620,4]]},"570":{"position":[[117,4]]},"611":{"position":[[1145,4]]},"613":{"position":[[956,4]]},"721":{"position":[[153,4]]},"752":{"position":[[573,4]]},"797":{"position":[[155,4]]},"798":{"position":[[48,4],[211,4]]},"800":{"position":[[472,4],[477,4]]},"821":{"position":[[531,4]]},"836":{"position":[[1113,4]]},"948":{"position":[[65,4]]},"966":{"position":[[103,4]]},"981":{"position":[[537,4]]},"987":{"position":[[880,4]]},"1009":{"position":[[885,4]]},"1071":{"position":[[321,4]]},"1192":{"position":[[393,4]]},"1195":{"position":[[60,4]]},"1236":{"position":[[32,4]]},"1321":{"position":[[484,4]]}},"keywords":{}}],["verif",{"_index":6463,"title":{},"content":{"1297":{"position":[[370,13]]}},"keywords":{}}],["versatil",{"_index":962,"title":{},"content":{"72":{"position":[[104,9]]},"365":{"position":[[786,9]]},"368":{"position":[[13,9]]},"384":{"position":[[357,11]]},"445":{"position":[[2282,11]]},"447":{"position":[[522,11]]},"500":{"position":[[317,9]]},"1132":{"position":[[449,9]]}},"keywords":{}}],["version",{"_index":271,"title":{"382":{"position":[[22,11]]},"760":{"position":[[35,8]]},"761":{"position":[[8,7]]},"1076":{"position":[[0,8]]},"1145":{"position":[[62,8]]}},"content":{"16":{"position":[[105,7]]},"24":{"position":[[601,7]]},"28":{"position":[[796,7]]},"51":{"position":[[298,8]]},"188":{"position":[[1220,8]]},"209":{"position":[[425,8]]},"211":{"position":[[387,8]]},"250":{"position":[[255,9]]},"255":{"position":[[769,8]]},"259":{"position":[[69,8]]},"267":{"position":[[816,7]]},"295":{"position":[[278,7]]},"299":{"position":[[473,8],[722,8],[939,8],[1234,8],[1548,9]]},"314":{"position":[[735,8]]},"315":{"position":[[65,8],[711,8]]},"316":{"position":[[176,8]]},"334":{"position":[[621,8]]},"367":{"position":[[713,8]]},"382":{"position":[[284,10]]},"391":{"position":[[1013,8]]},"392":{"position":[[571,8],[1537,8]]},"403":{"position":[[336,7],[439,7],[538,7]]},"408":{"position":[[562,8]]},"412":{"position":[[3479,8],[11520,8],[11643,8]]},"450":{"position":[[753,10]]},"452":{"position":[[443,7],[633,7]]},"455":{"position":[[542,7],[560,8],[928,8]]},"457":{"position":[[309,7]]},"460":{"position":[[1112,7]]},"461":{"position":[[900,9]]},"462":{"position":[[345,8]]},"480":{"position":[[535,8]]},"482":{"position":[[835,8]]},"495":{"position":[[630,10]]},"496":{"position":[[607,7],[744,8]]},"538":{"position":[[599,8]]},"554":{"position":[[1326,8]]},"562":{"position":[[307,8]]},"563":{"position":[[753,7]]},"564":{"position":[[764,8]]},"579":{"position":[[629,8]]},"598":{"position":[[606,8]]},"632":{"position":[[1519,8]]},"636":{"position":[[176,7]]},"638":{"position":[[603,8]]},"639":{"position":[[359,8]]},"661":{"position":[[1244,8]]},"662":{"position":[[2382,8]]},"666":{"position":[[98,7]]},"680":{"position":[[811,8]]},"688":{"position":[[437,7]]},"689":{"position":[[176,7]]},"691":{"position":[[539,8]]},"696":{"position":[[1896,8]]},"698":{"position":[[200,8],[283,7],[483,8],[1226,8],[1281,8]]},"711":{"position":[[876,8]]},"717":{"position":[[1420,8]]},"720":{"position":[[137,8]]},"730":{"position":[[238,8]]},"734":{"position":[[685,8]]},"749":{"position":[[9241,7],[10983,7],[11121,7],[12607,8],[17815,7],[23212,7],[23338,7],[23470,7],[23660,8]]},"751":{"position":[[91,7],[233,7],[591,7],[604,7],[1002,7],[1015,7],[1137,9],[1693,7],[1706,7]]},"754":{"position":[[378,8]]},"756":{"position":[[471,9]]},"757":{"position":[[321,9]]},"760":{"position":[[39,8],[444,7]]},"761":{"position":[[116,7],[236,8],[288,7]]},"773":{"position":[[716,9]]},"786":{"position":[[113,7]]},"808":{"position":[[176,8],[532,8]]},"812":{"position":[[75,8]]},"813":{"position":[[75,8]]},"838":{"position":[[2596,8]]},"844":{"position":[[248,8]]},"861":{"position":[[359,7]]},"862":{"position":[[651,8]]},"872":{"position":[[1860,8],[4090,8]]},"876":{"position":[[426,7],[484,7],[622,8]]},"878":{"position":[[467,7]]},"879":{"position":[[130,7],[200,7],[363,8]]},"898":{"position":[[2440,8]]},"904":{"position":[[858,8]]},"916":{"position":[[144,8]]},"932":{"position":[[1196,8]]},"938":{"position":[[112,8]]},"954":{"position":[[59,9]]},"958":{"position":[[532,7]]},"965":{"position":[[406,8]]},"1044":{"position":[[42,7]]},"1074":{"position":[[86,7]]},"1076":{"position":[[5,7],[58,7]]},"1078":{"position":[[199,8]]},"1080":{"position":[[29,8]]},"1082":{"position":[[172,8]]},"1083":{"position":[[372,8]]},"1085":{"position":[[3313,7]]},"1097":{"position":[[522,8]]},"1100":{"position":[[582,7],[854,7],[897,8]]},"1133":{"position":[[289,7],[373,7]]},"1134":{"position":[[217,7],[328,9],[371,8]]},"1149":{"position":[[1049,8]]},"1158":{"position":[[359,8]]},"1162":{"position":[[1002,7],[1051,7]]},"1198":{"position":[[1148,7],[2175,7]]},"1270":{"position":[[345,7]]},"1271":{"position":[[15,8],[77,7],[271,7],[565,7],[1058,7],[1744,8]]},"1275":{"position":[[14,7]]},"1278":{"position":[[93,7],[131,7],[186,8],[645,9]]},"1282":{"position":[[384,7],[596,7],[741,8]]},"1292":{"position":[[107,7]]},"1305":{"position":[[414,7]]},"1311":{"position":[[357,8]]},"1315":{"position":[[772,7]]},"1319":{"position":[[261,7],[341,8]]}},"keywords":{}}],["versions—ensur",{"_index":1312,"title":{},"content":{"203":{"position":[[270,17]]}},"keywords":{}}],["vertic",{"_index":4571,"title":{"1087":{"position":[[0,8]]}},"content":{"772":{"position":[[1408,11]]},"1087":{"position":[[1,8],[141,8]]},"1088":{"position":[[74,10]]}},"keywords":{}}],["vf",{"_index":2973,"title":{},"content":{"454":{"position":[[980,3]]},"463":{"position":[[1243,3]]}},"keywords":{}}],["via",{"_index":319,"title":{"810":{"position":[[0,3]]},"811":{"position":[[0,3]]}},"content":{"19":{"position":[[147,3],[257,3]]},"33":{"position":[[602,3]]},"39":{"position":[[683,3]]},"49":{"position":[[52,3]]},"55":{"position":[[73,3]]},"174":{"position":[[2742,4]]},"188":{"position":[[600,3]]},"250":{"position":[[213,3]]},"289":{"position":[[1600,3]]},"303":{"position":[[220,3]]},"333":{"position":[[25,3],[253,3]]},"336":{"position":[[449,3]]},"357":{"position":[[615,3]]},"381":{"position":[[138,3]]},"411":{"position":[[4412,3],[5086,3]]},"412":{"position":[[2355,3],[3510,3],[7718,4],[8097,3]]},"464":{"position":[[677,3]]},"466":{"position":[[333,3]]},"469":{"position":[[1184,3]]},"504":{"position":[[1276,3]]},"535":{"position":[[1157,3]]},"562":{"position":[[807,3]]},"563":{"position":[[35,3],[157,3]]},"566":{"position":[[565,3]]},"574":{"position":[[647,3]]},"578":{"position":[[54,3]]},"595":{"position":[[1234,3]]},"640":{"position":[[302,3]]},"662":{"position":[[1251,3]]},"680":{"position":[[70,3],[161,3]]},"687":{"position":[[84,3]]},"710":{"position":[[1445,3]]},"743":{"position":[[36,3]]},"749":{"position":[[19162,3]]},"828":{"position":[[47,3]]},"829":{"position":[[997,3]]},"832":{"position":[[194,3]]},"836":{"position":[[501,3]]},"837":{"position":[[1317,3]]},"838":{"position":[[639,3],[1782,3]]},"846":{"position":[[23,3]]},"854":{"position":[[1462,3]]},"863":{"position":[[818,3]]},"870":{"position":[[133,3]]},"890":{"position":[[679,4]]},"896":{"position":[[231,3]]},"903":{"position":[[452,3]]},"911":{"position":[[394,3]]},"984":{"position":[[253,3]]},"985":{"position":[[88,3],[394,3],[679,3]]},"986":{"position":[[1257,3]]},"988":{"position":[[1017,3]]},"1018":{"position":[[430,3]]},"1101":{"position":[[94,3]]},"1102":{"position":[[100,3],[1210,3]]},"1123":{"position":[[122,3]]},"1133":{"position":[[146,3]]},"1150":{"position":[[418,3]]},"1177":{"position":[[208,3]]},"1204":{"position":[[209,3]]},"1276":{"position":[[186,3]]},"1294":{"position":[[2097,3]]}},"keywords":{}}],["viabl",{"_index":2541,"title":{},"content":{"408":{"position":[[1463,6]]},"429":{"position":[[452,6]]},"624":{"position":[[1303,6]]},"698":{"position":[[930,6]]},"708":{"position":[[402,6]]},"1270":{"position":[[466,6]]},"1305":{"position":[[219,6]]}},"keywords":{}}],["video",{"_index":1823,"title":{},"content":{"303":{"position":[[186,7]]},"390":{"position":[[940,7]]},"408":{"position":[[3057,5]]},"614":{"position":[[342,6]]},"861":{"position":[[1160,6]]},"901":{"position":[[128,6]]}},"keywords":{}}],["view",{"_index":915,"title":{},"content":{"65":{"position":[[644,4]]},"412":{"position":[[12701,4]]},"469":{"position":[[1381,4]]},"489":{"position":[[726,5]]},"660":{"position":[[35,5]]},"829":{"position":[[2881,6],[3006,5]]},"1284":{"position":[[330,4]]},"1316":{"position":[[3655,5]]}},"keywords":{}}],["violat",{"_index":3950,"title":{},"content":{"699":{"position":[[985,8]]}},"keywords":{}}],["virtual",{"_index":489,"title":{},"content":{"30":{"position":[[68,7]]},"408":{"position":[[1933,7]]},"454":{"position":[[984,8]]},"463":{"position":[[507,7]]},"491":{"position":[[192,9]]},"617":{"position":[[1362,9]]},"1206":{"position":[[157,7]]},"1211":{"position":[[213,7]]}},"keywords":{}}],["visibl",{"_index":5544,"title":{},"content":{"1003":{"position":[[60,8],[276,7]]},"1215":{"position":[[595,7]]}},"keywords":{}}],["visit",{"_index":995,"title":{},"content":{"84":{"position":[[139,5]]},"114":{"position":[[152,5]]},"149":{"position":[[152,5]]},"175":{"position":[[145,5]]},"347":{"position":[[152,5]]},"362":{"position":[[1223,5]]},"511":{"position":[[152,5]]},"531":{"position":[[152,5]]},"591":{"position":[[152,5]]},"702":{"position":[[837,7]]}},"keywords":{}}],["visitor",{"_index":3641,"title":{},"content":{"617":{"position":[[976,8]]},"736":{"position":[[73,8]]}},"keywords":{}}],["visual",{"_index":1232,"title":{},"content":{"177":{"position":[[293,8]]},"267":{"position":[[1083,14]]},"446":{"position":[[967,13]]},"495":{"position":[[447,6]]},"571":{"position":[[1703,14]]}},"keywords":{}}],["vital",{"_index":1063,"title":{},"content":{"117":{"position":[[18,5]]},"178":{"position":[[18,5]]},"447":{"position":[[25,5]]},"912":{"position":[[531,5]]}},"keywords":{}}],["vite",{"_index":5213,"title":{},"content":{"898":{"position":[[2937,4]]}},"keywords":{}}],["void",{"_index":4129,"title":{},"content":{"747":{"position":[[219,5],[277,5],[344,4]]}},"keywords":{}}],["volum",{"_index":1050,"title":{},"content":{"111":{"position":[[202,8]]},"267":{"position":[[981,7]]},"287":{"position":[[780,7]]},"294":{"position":[[323,7]]},"369":{"position":[[691,7]]},"441":{"position":[[370,6]]},"487":{"position":[[232,6]]},"508":{"position":[[168,8]]},"861":{"position":[[570,6],[623,6]]},"1132":{"position":[[1237,7]]}},"keywords":{}}],["volumes.seamless",{"_index":1208,"title":{},"content":{"173":{"position":[[2144,16]]}},"keywords":{}}],["voxel",{"_index":5554,"title":{},"content":{"1006":{"position":[[42,5]]},"1007":{"position":[[257,7],[536,6],[1325,7]]},"1009":{"position":[[10,5]]}},"keywords":{}}],["vs",{"_index":670,"title":{"68":{"position":[[16,3]]},"99":{"position":[[16,3]]},"126":{"position":[[5,3]]},"161":{"position":[[5,3]]},"186":{"position":[[5,3]]},"226":{"position":[[16,3]]},"317":{"position":[[5,3]]},"331":{"position":[[5,3]]},"358":{"position":[[5,3]]},"413":{"position":[[12,3]]},"419":{"position":[[14,3]]},"432":{"position":[[13,2]]},"434":{"position":[[13,2]]},"435":{"position":[[13,2]]},"436":{"position":[[13,2]]},"448":{"position":[[13,3],[27,3],[39,3],[48,3]]},"520":{"position":[[5,3]]},"560":{"position":[[21,3]]},"566":{"position":[[23,2],[36,2]]},"576":{"position":[[5,3]]},"609":{"position":[[11,2],[33,2],[49,2],[59,2]]},"1143":{"position":[[9,2]]},"1192":{"position":[[11,2]]}},"content":{"43":{"position":[[192,2]]},"243":{"position":[[992,2]]},"244":{"position":[[504,2],[700,2],[1191,2],[1389,2]]},"432":{"position":[[1312,2]]},"793":{"position":[[1349,3],[1363,3],[1375,3],[1384,3]]},"1072":{"position":[[951,3]]}},"keywords":{}}],["vue",{"_index":2002,"title":{"573":{"position":[[24,3]]},"574":{"position":[[4,3]]},"576":{"position":[[15,3]]},"580":{"position":[[0,3]]},"590":{"position":[[33,4]]},"592":{"position":[[22,3]]},"594":{"position":[[21,4]]},"596":{"position":[[15,4]]},"601":{"position":[[28,3]]},"602":{"position":[[6,3]]},"603":{"position":[[0,3]]}},"content":{"352":{"position":[[253,4]]},"574":{"position":[[1,3],[151,3]]},"576":{"position":[[433,3]]},"577":{"position":[[57,3]]},"579":{"position":[[13,3],[83,3],[937,5]]},"580":{"position":[[44,3],[149,3],[219,4],[238,3],[330,6]]},"581":{"position":[[663,3]]},"582":{"position":[[77,3]]},"584":{"position":[[1,3]]},"585":{"position":[[222,3]]},"589":{"position":[[42,3]]},"590":{"position":[[67,3]]},"591":{"position":[[458,4],[514,3],[558,3],[578,3],[621,3],[664,3]]},"594":{"position":[[15,3]]},"595":{"position":[[839,3]]},"596":{"position":[[22,3]]},"598":{"position":[[248,3]]},"600":{"position":[[138,3]]},"601":{"position":[[24,3],[408,6]]},"602":{"position":[[316,3]]},"603":{"position":[[48,3]]},"608":{"position":[[244,3]]},"825":{"position":[[15,3]]}},"keywords":{}}],["vue'",{"_index":3482,"title":{},"content":{"574":{"position":[[918,5]]},"590":{"position":[[229,5],[435,5]]},"602":{"position":[[21,5]]}},"keywords":{}}],["vue.j",{"_index":258,"title":{"286":{"position":[[42,8]]}},"content":{"15":{"position":[[328,6]]},"94":{"position":[[119,7]]},"173":{"position":[[2317,7]]},"222":{"position":[[136,7]]},"286":{"position":[[202,7]]},"749":{"position":[[12038,6]]}},"keywords":{}}],["vuex",{"_index":3486,"title":{},"content":{"576":{"position":[[162,4]]}},"keywords":{}}],["vuex/pinia",{"_index":3480,"title":{},"content":{"574":{"position":[[626,10]]}},"keywords":{}}],["vulner",{"_index":2759,"title":{},"content":{"412":{"position":[[13168,10]]}},"keywords":{}}],["w",{"_index":3997,"title":{},"content":{"711":{"position":[[1017,1]]},"841":{"position":[[1012,2]]}},"keywords":{}}],["wa",{"_index":6339,"title":{},"content":{"1276":{"position":[[32,2],[84,2],[587,3],[750,3],[807,3]]}},"keywords":{}}],["wait",{"_index":147,"title":{},"content":{"11":{"position":[[240,4],[335,5],[717,4]]},"93":{"position":[[84,7]]},"408":{"position":[[2878,7]]},"410":{"position":[[249,7]]},"421":{"position":[[408,4],[675,4]]},"474":{"position":[[239,4]]},"630":{"position":[[617,4]]},"634":{"position":[[231,4]]},"696":{"position":[[356,4]]},"702":{"position":[[317,4]]},"898":{"position":[[4043,4]]},"948":{"position":[[687,4]]},"988":{"position":[[1295,4],[1558,4]]},"1033":{"position":[[710,6]]},"1175":{"position":[[492,4]]},"1298":{"position":[[108,7]]},"1304":{"position":[[844,5]]}},"keywords":{}}],["waitbeforepersist",{"_index":6116,"title":{},"content":{"1164":{"position":[[1501,18]]}},"keywords":{}}],["waitforleadership",{"_index":3759,"title":{"974":{"position":[[0,20]]}},"content":{"653":{"position":[[1463,18]]},"886":{"position":[[2008,17]]},"988":{"position":[[1260,17],[1343,17],[1444,18]]},"989":{"position":[[143,18]]},"995":{"position":[[212,18],[847,18]]}},"keywords":{}}],["wal",{"_index":6069,"title":{},"content":{"1143":{"position":[[527,3]]}},"keywords":{}}],["walk",{"_index":3210,"title":{},"content":{"498":{"position":[[163,4]]}},"keywords":{}}],["want",{"_index":14,"title":{"86":{"position":[[14,4]]},"214":{"position":[[14,4]]}},"content":{"1":{"position":[[217,4],[264,4]]},"260":{"position":[[163,4],[265,4]]},"262":{"position":[[5,4],[477,4]]},"372":{"position":[[26,4]]},"392":{"position":[[2247,4]]},"410":{"position":[[1614,4]]},"412":{"position":[[5367,4],[10902,4]]},"420":{"position":[[1197,4]]},"421":{"position":[[70,6]]},"453":{"position":[[190,4],[553,4]]},"457":{"position":[[58,4]]},"459":{"position":[[407,4]]},"460":{"position":[[47,4],[1359,4]]},"496":{"position":[[420,4]]},"535":{"position":[[357,4]]},"556":{"position":[[1854,4]]},"561":{"position":[[69,4]]},"564":{"position":[[101,4]]},"567":{"position":[[792,4]]},"595":{"position":[[368,4]]},"655":{"position":[[51,4]]},"661":{"position":[[1690,4],[1737,4]]},"667":{"position":[[134,4]]},"676":{"position":[[203,4]]},"681":{"position":[[307,4]]},"690":{"position":[[52,4],[405,4]]},"696":{"position":[[400,4],[540,4]]},"701":{"position":[[555,4],[965,4]]},"702":{"position":[[48,4],[84,4]]},"704":{"position":[[124,4]]},"705":{"position":[[253,4]]},"707":{"position":[[479,4]]},"710":{"position":[[944,4],[2502,4]]},"711":{"position":[[568,4],[2132,4]]},"749":{"position":[[7210,4],[14452,4]]},"752":{"position":[[1325,4]]},"753":{"position":[[169,4]]},"759":{"position":[[14,4]]},"766":{"position":[[135,4]]},"772":{"position":[[1815,4]]},"773":{"position":[[759,4]]},"774":{"position":[[8,4]]},"775":{"position":[[550,4]]},"776":{"position":[[232,4]]},"797":{"position":[[181,4]]},"799":{"position":[[84,4]]},"805":{"position":[[92,4]]},"806":{"position":[[213,4]]},"836":{"position":[[1039,4],[2462,4]]},"837":{"position":[[875,4]]},"838":{"position":[[1606,4],[3230,4]]},"839":{"position":[[469,4],[1287,4]]},"861":{"position":[[2441,4]]},"875":{"position":[[4963,4]]},"876":{"position":[[239,4]]},"879":{"position":[[567,4]]},"893":{"position":[[69,4]]},"904":{"position":[[2022,4]]},"906":{"position":[[618,4]]},"913":{"position":[[305,4]]},"945":{"position":[[10,4]]},"963":{"position":[[18,4]]},"966":{"position":[[266,4]]},"977":{"position":[[244,4]]},"988":{"position":[[2327,4],[3429,4]]},"995":{"position":[[579,4],[1323,4]]},"1006":{"position":[[213,4]]},"1013":{"position":[[181,4],[632,4]]},"1022":{"position":[[15,4],[80,4]]},"1048":{"position":[[15,4],[150,4]]},"1067":{"position":[[1641,4]]},"1068":{"position":[[154,7],[375,4]]},"1080":{"position":[[1076,4]]},"1100":{"position":[[916,4]]},"1112":{"position":[[198,4]]},"1147":{"position":[[432,4]]},"1149":{"position":[[298,4]]},"1151":{"position":[[4,4],[754,4]]},"1172":{"position":[[128,4]]},"1178":{"position":[[4,4],[753,4]]},"1185":{"position":[[191,4]]},"1210":{"position":[[563,4]]},"1212":{"position":[[10,4]]},"1213":{"position":[[451,4]]},"1226":{"position":[[413,4]]},"1230":{"position":[[96,4]]},"1249":{"position":[[47,4]]},"1252":{"position":[[131,4]]},"1264":{"position":[[323,4]]},"1271":{"position":[[887,4]]},"1282":{"position":[[176,4]]},"1287":{"position":[[92,6]]},"1294":{"position":[[265,4]]},"1309":{"position":[[1099,4]]},"1314":{"position":[[10,4]]},"1315":{"position":[[18,4],[285,4]]},"1316":{"position":[[98,4],[1338,5],[3571,4]]},"1318":{"position":[[483,4]]},"1320":{"position":[[241,4],[430,4]]},"1321":{"position":[[142,4]]},"1322":{"position":[[51,4]]}},"keywords":{}}],["warn",{"_index":1090,"title":{"675":{"position":[[21,8]]}},"content":{"129":{"position":[[514,7]]},"299":{"position":[[1071,8]]},"675":{"position":[[165,7]]},"917":{"position":[[386,7]]},"995":{"position":[[175,7],[432,7]]},"1288":{"position":[[1,8]]}},"keywords":{}}],["wasm",{"_index":672,"title":{"448":{"position":[[52,4]]},"454":{"position":[[8,4]]}},"content":{"43":{"position":[[399,4]]},"404":{"position":[[399,4]]},"408":{"position":[[3483,7],[3775,4],[3879,4],[4112,4]]},"454":{"position":[[15,6],[97,4],[342,4],[769,4],[878,4]]},"457":{"position":[[262,4]]},"459":{"position":[[252,4]]},"463":{"position":[[383,4],[415,4],[721,4],[746,4],[1151,4]]},"464":{"position":[[371,4],[397,4],[634,4]]},"465":{"position":[[232,4],[258,4]]},"466":{"position":[[195,4],[221,4],[501,4]]},"467":{"position":[[170,4],[196,4],[457,4]]},"468":{"position":[[438,4]]},"524":{"position":[[813,4]]},"793":{"position":[[1388,4]]},"1137":{"position":[[108,4]]},"1276":{"position":[[307,4]]},"1299":{"position":[[586,4]]}},"keywords":{}}],["wast",{"_index":3835,"title":{},"content":{"668":{"position":[[318,5]]},"736":{"position":[[439,5],[488,6]]}},"keywords":{}}],["watch",{"_index":1579,"title":{},"content":{"255":{"position":[[1572,8]]},"411":{"position":[[3177,8]]},"705":{"position":[[1096,5]]},"1058":{"position":[[547,8]]},"1124":{"position":[[951,5]]}},"keywords":{}}],["watcher",{"_index":3522,"title":{},"content":{"590":{"position":[[274,9]]}},"keywords":{}}],["watermelondb",{"_index":283,"title":{"17":{"position":[[0,13]]}},"content":{"17":{"position":[[3,12],[191,12],[277,12],[358,13],[386,12],[459,12]]},"1316":{"position":[[3448,12],[3502,13]]},"1324":{"position":[[553,12]]}},"keywords":{}}],["way",{"_index":894,"title":{},"content":{"63":{"position":[[35,3]]},"73":{"position":[[111,3]]},"117":{"position":[[93,3]]},"130":{"position":[[56,3]]},"131":{"position":[[683,3]]},"192":{"position":[[193,3],[214,3]]},"250":{"position":[[153,5]]},"270":{"position":[[249,3]]},"285":{"position":[[309,3]]},"289":{"position":[[533,3]]},"298":{"position":[[17,3]]},"301":{"position":[[10,3]]},"306":{"position":[[143,3]]},"340":{"position":[[35,5]]},"395":{"position":[[68,3]]},"396":{"position":[[924,3],[1809,4]]},"397":{"position":[[13,3]]},"398":{"position":[[387,4]]},"402":{"position":[[888,4],[1738,4]]},"409":{"position":[[189,3]]},"412":{"position":[[14023,3]]},"418":{"position":[[846,3]]},"421":{"position":[[208,4]]},"424":{"position":[[398,3]]},"441":{"position":[[655,3]]},"455":{"position":[[160,3]]},"458":{"position":[[497,3],[576,3]]},"468":{"position":[[304,3]]},"469":{"position":[[834,3]]},"470":{"position":[[181,3]]},"525":{"position":[[571,3],[592,3]]},"551":{"position":[[32,4]]},"557":{"position":[[81,3]]},"612":{"position":[[45,3],[154,3]]},"619":{"position":[[300,3]]},"624":{"position":[[683,3]]},"655":{"position":[[110,3]]},"662":{"position":[[270,3]]},"686":{"position":[[203,3]]},"688":{"position":[[95,3],[310,3]]},"693":{"position":[[265,4]]},"696":{"position":[[1691,3],[1927,3]]},"697":{"position":[[368,3],[613,4]]},"698":{"position":[[246,3],[1904,3]]},"700":{"position":[[557,3]]},"701":{"position":[[316,3]]},"705":{"position":[[1299,3]]},"708":{"position":[[409,3],[478,3]]},"709":{"position":[[366,4],[885,4]]},"711":{"position":[[2273,3]]},"714":{"position":[[717,3]]},"736":{"position":[[276,3]]},"770":{"position":[[158,3]]},"773":{"position":[[20,3]]},"783":{"position":[[243,3]]},"784":{"position":[[382,3]]},"829":{"position":[[195,3]]},"830":{"position":[[62,3]]},"836":{"position":[[1397,3]]},"837":{"position":[[157,3]]},"838":{"position":[[299,3],[1175,4]]},"842":{"position":[[8,3]]},"860":{"position":[[1186,3]]},"861":{"position":[[156,3]]},"865":{"position":[[135,3]]},"870":{"position":[[5,3]]},"872":{"position":[[2191,3]]},"875":{"position":[[7096,3]]},"876":{"position":[[517,4]]},"896":{"position":[[112,3]]},"898":{"position":[[626,3]]},"951":{"position":[[61,3]]},"981":{"position":[[204,3]]},"988":{"position":[[4972,3]]},"1022":{"position":[[279,3]]},"1085":{"position":[[1068,3]]},"1089":{"position":[[9,3]]},"1090":{"position":[[9,3]]},"1092":{"position":[[17,3]]},"1093":{"position":[[345,4]]},"1124":{"position":[[944,3]]},"1140":{"position":[[36,3]]},"1143":{"position":[[201,3]]},"1152":{"position":[[105,3]]},"1157":{"position":[[35,3],[526,3]]},"1177":{"position":[[182,3]]},"1204":{"position":[[183,3]]},"1211":{"position":[[195,3]]},"1213":{"position":[[192,3]]},"1247":{"position":[[317,3],[490,3],[677,3]]},"1266":{"position":[[13,3]]},"1294":{"position":[[662,3]]},"1295":{"position":[[452,3]]},"1301":{"position":[[545,3],[1586,3]]},"1304":{"position":[[707,3]]},"1307":{"position":[[824,3]]},"1316":{"position":[[3488,3]]},"1317":{"position":[[377,3]]}},"keywords":{}}],["we'll",{"_index":2351,"title":{},"content":{"396":{"position":[[1887,5]]},"421":{"position":[[1062,5]]}},"keywords":{}}],["we'v",{"_index":900,"title":{},"content":{"65":{"position":[[10,5]]},"462":{"position":[[10,5]]}},"keywords":{}}],["weak",{"_index":2940,"title":{},"content":{"445":{"position":[[642,4]]}},"keywords":{}}],["weatherdb",{"_index":4093,"title":{},"content":{"739":{"position":[[309,12]]}},"keywords":{}}],["web",{"_index":200,"title":{"116":{"position":[[8,3]]},"150":{"position":[[32,3]]},"151":{"position":[[12,3]]},"320":{"position":[[7,3]]},"499":{"position":[[35,3]]},"500":{"position":[[22,3]]},"503":{"position":[[28,3]]},"718":{"position":[[6,3]]}},"content":{"14":{"position":[[70,3]]},"18":{"position":[[65,3]]},"26":{"position":[[290,3]]},"30":{"position":[[53,4]]},"33":{"position":[[486,4]]},"38":{"position":[[94,3]]},"63":{"position":[[84,3]]},"64":{"position":[[204,3]]},"65":{"position":[[124,3],[248,3],[1401,3],[2062,3]]},"68":{"position":[[152,3]]},"69":{"position":[[110,3]]},"70":{"position":[[153,3]]},"73":{"position":[[148,3]]},"76":{"position":[[102,3]]},"83":{"position":[[230,3],[407,3]]},"112":{"position":[[162,3]]},"116":{"position":[[283,3]]},"139":{"position":[[68,3]]},"148":{"position":[[249,3],[369,3]]},"151":{"position":[[90,3],[147,3]]},"153":{"position":[[99,3]]},"161":{"position":[[40,3],[379,3]]},"170":{"position":[[53,3],[549,3]]},"172":{"position":[[180,3]]},"207":{"position":[[109,3]]},"215":{"position":[[332,3]]},"239":{"position":[[208,3]]},"244":{"position":[[264,3],[1074,3]]},"254":{"position":[[99,3]]},"269":{"position":[[59,3],[189,3],[308,4],[432,3]]},"291":{"position":[[481,3]]},"298":{"position":[[393,3]]},"315":{"position":[[89,3]]},"364":{"position":[[63,3]]},"375":{"position":[[902,3]]},"384":{"position":[[120,3]]},"408":{"position":[[227,3],[305,3],[1278,3],[1434,3],[1665,3],[1752,3],[4728,3],[4931,3]]},"411":{"position":[[4479,3]]},"412":{"position":[[8550,3],[15009,3]]},"419":{"position":[[38,3]]},"421":{"position":[[29,4]]},"424":{"position":[[47,3],[73,3]]},"434":{"position":[[96,3],[412,3]]},"441":{"position":[[24,3]]},"445":{"position":[[130,3]]},"450":{"position":[[624,4]]},"451":{"position":[[162,3]]},"453":{"position":[[75,3]]},"454":{"position":[[92,4]]},"455":{"position":[[14,3]]},"457":{"position":[[26,3]]},"458":{"position":[[34,3]]},"460":{"position":[[999,3]]},"461":{"position":[[289,3]]},"468":{"position":[[663,3]]},"470":{"position":[[39,3]]},"483":{"position":[[1072,3]]},"500":{"position":[[13,3],[40,3],[95,3]]},"501":{"position":[[157,3]]},"503":{"position":[[37,3]]},"510":{"position":[[35,3],[76,3]]},"511":{"position":[[457,3]]},"519":{"position":[[1,3]]},"520":{"position":[[207,3]]},"530":{"position":[[571,3]]},"533":{"position":[[321,3]]},"548":{"position":[[465,3]]},"551":{"position":[[465,3]]},"554":{"position":[[177,3]]},"556":{"position":[[1115,3]]},"567":{"position":[[908,3]]},"569":{"position":[[1038,3]]},"584":{"position":[[233,3]]},"593":{"position":[[321,3]]},"608":{"position":[[463,3]]},"613":{"position":[[94,3]]},"614":{"position":[[8,4],[153,3]]},"624":{"position":[[255,3]]},"640":{"position":[[528,4]]},"642":{"position":[[67,3]]},"660":{"position":[[31,3],[41,3]]},"662":{"position":[[385,3]]},"703":{"position":[[19,3]]},"709":{"position":[[39,3],[102,3],[902,3]]},"717":{"position":[[170,3],[216,3]]},"718":{"position":[[32,3],[196,3]]},"778":{"position":[[13,3]]},"783":{"position":[[197,3]]},"784":{"position":[[11,3]]},"801":{"position":[[83,3]]},"901":{"position":[[19,3]]},"1104":{"position":[[735,3]]},"1184":{"position":[[621,3]]},"1206":{"position":[[83,3]]},"1301":{"position":[[30,3]]},"1302":{"position":[[86,4]]},"1322":{"position":[[8,3]]}},"keywords":{}}],["web.major",{"_index":2977,"title":{},"content":{"455":{"position":[[722,9]]}},"keywords":{}}],["webassembl",{"_index":492,"title":{"1276":{"position":[[11,11]]}},"content":{"30":{"position":[[235,11]]},"228":{"position":[[377,11]]},"336":{"position":[[453,13]]},"357":{"position":[[619,12]]},"391":{"position":[[240,12]]},"408":{"position":[[3435,12],[3471,11],[5053,11]]},"454":{"position":[[3,11],[269,11]]},"463":{"position":[[100,11]]},"470":{"position":[[239,11]]},"524":{"position":[[724,12]]},"581":{"position":[[466,11]]},"1276":{"position":[[67,12],[190,11],[658,11]]}},"keywords":{}}],["webgpu",{"_index":2500,"title":{},"content":{"404":{"position":[[117,6],[289,6],[334,6]]},"408":{"position":[[5236,7]]}},"keywords":{}}],["webkit",{"_index":6241,"title":{},"content":{"1216":{"position":[[1,7]]}},"keywords":{}}],["weblock",{"_index":2989,"title":{},"content":{"458":{"position":[[1355,8]]}},"keywords":{}}],["webpack",{"_index":1263,"title":{"674":{"position":[[11,8]]}},"content":{"188":{"position":[[1725,7]]},"333":{"position":[[149,7]]},"729":{"position":[[41,7]]},"730":{"position":[[153,8]]},"910":{"position":[[146,7]]},"1176":{"position":[[40,8],[223,7],[293,7]]},"1202":{"position":[[41,7]]},"1228":{"position":[[49,7]]},"1266":{"position":[[63,8],[84,7],[232,7],[321,7]]}},"keywords":{}}],["webpack.config.j",{"_index":3849,"title":{},"content":{"674":{"position":[[8,18]]},"1176":{"position":[[321,17],[427,17]]},"1266":{"position":[[147,17]]}},"keywords":{}}],["webpack.defineplugin",{"_index":3853,"title":{},"content":{"674":{"position":[[158,22]]}},"keywords":{}}],["webpack.provideplugin",{"_index":5267,"title":{},"content":{"910":{"position":[[243,23]]}},"keywords":{}}],["webpag",{"_index":2607,"title":{},"content":{"410":{"position":[[2256,8]]}},"keywords":{}}],["webrtc",{"_index":1361,"title":{"210":{"position":[[32,7]]},"261":{"position":[[17,6]]},"609":{"position":[[52,6]]},"614":{"position":[[8,8]]},"868":{"position":[[64,6]]},"900":{"position":[[4,6]]},"901":{"position":[[8,8]]},"902":{"position":[[26,6]]},"903":{"position":[[19,6]]},"904":{"position":[[20,6]]},"908":{"position":[[22,6]]},"911":{"position":[[27,6]]}},"content":{"210":{"position":[[96,7],[236,8]]},"212":{"position":[[594,6]]},"261":{"position":[[102,7],[304,8],[661,6]]},"289":{"position":[[1549,6],[1604,6],[1893,6]]},"481":{"position":[[369,6]]},"504":{"position":[[1280,6]]},"614":{"position":[[1,6],[385,6],[533,6],[784,6],[846,6],[996,6]]},"620":{"position":[[435,6]]},"632":{"position":[[786,7]]},"749":{"position":[[16028,6]]},"793":{"position":[[737,6]]},"868":{"position":[[64,6]]},"901":{"position":[[1,6],[249,6],[548,6],[701,6]]},"903":{"position":[[132,6],[456,6]]},"904":{"position":[[63,6],[1278,6],[1395,8],[2331,6],[2877,6],[3176,6]]},"905":{"position":[[5,6]]},"906":{"position":[[43,6],[959,8]]},"911":{"position":[[39,6],[123,6],[237,6],[326,6]]},"912":{"position":[[159,6]]},"913":{"position":[[328,6]]},"1121":{"position":[[191,6],[419,8]]},"1124":{"position":[[2280,7]]}},"keywords":{}}],["webrtc.html",{"_index":1461,"title":{},"content":{"243":{"position":[[527,11]]}},"keywords":{}}],["webrtc.html?console=webrtc",{"_index":4337,"title":{},"content":{"749":{"position":[[15388,26]]}},"keywords":{}}],["webrtcpool",{"_index":1364,"title":{},"content":{"210":{"position":[[251,10]]}},"keywords":{}}],["webrtcpool.error$.subscribe((error",{"_index":1375,"title":{},"content":{"210":{"position":[[540,35]]}},"keywords":{}}],["webserv",{"_index":3680,"title":{},"content":{"624":{"position":[[1107,10]]},"702":{"position":[[347,10]]},"799":{"position":[[382,10]]},"1089":{"position":[[134,9]]},"1210":{"position":[[540,10]]},"1227":{"position":[[398,9],[875,10]]},"1265":{"position":[[391,9],[849,10]]}},"keywords":{}}],["websit",{"_index":444,"title":{},"content":{"27":{"position":[[361,7]]},"458":{"position":[[431,8]]},"475":{"position":[[6,8]]},"617":{"position":[[944,7],[1000,9]]},"656":{"position":[[344,7]]},"697":{"position":[[160,7]]},"702":{"position":[[850,7]]},"736":{"position":[[19,7],[168,7]]},"779":{"position":[[16,8],[142,7]]},"781":{"position":[[6,8],[234,7]]},"783":{"position":[[22,8]]}},"keywords":{}}],["websocket",{"_index":1055,"title":{"609":{"position":[[0,10]]},"611":{"position":[[9,12]]},"891":{"position":[[0,9]]},"892":{"position":[[13,9]]},"893":{"position":[[15,9]]},"911":{"position":[[13,9]]},"1219":{"position":[[13,9]]}},"content":{"113":{"position":[[262,10]]},"165":{"position":[[199,9]]},"174":{"position":[[3092,11]]},"238":{"position":[[175,10]]},"261":{"position":[[674,9]]},"410":{"position":[[1710,9]]},"464":{"position":[[173,9]]},"476":{"position":[[128,12]]},"491":{"position":[[617,11],[1487,11],[1656,11]]},"570":{"position":[[743,9]]},"610":{"position":[[852,11]]},"611":{"position":[[1,10],[350,10],[594,9],[932,9],[1314,10]]},"612":{"position":[[104,11],[1344,11]]},"614":{"position":[[929,11]]},"616":{"position":[[6,10]]},"618":{"position":[[143,10]]},"619":{"position":[[137,9]]},"620":{"position":[[30,11],[423,11]]},"621":{"position":[[1,11],[756,11]]},"622":{"position":[[1,11],[298,11],[695,10]]},"623":{"position":[[1,11],[43,9],[315,10],[768,10]]},"624":{"position":[[630,10],[1568,10]]},"736":{"position":[[184,9],[368,10]]},"781":{"position":[[261,9],[498,9]]},"793":{"position":[[695,9]]},"871":{"position":[[289,9]]},"875":{"position":[[7175,10]]},"885":{"position":[[1277,11]]},"886":{"position":[[4003,9],[4321,10],[4335,9],[4969,9]]},"892":{"position":[[105,11],[219,9]]},"893":{"position":[[160,11]]},"901":{"position":[[560,10],[636,10]]},"904":{"position":[[2965,9],[3023,9]]},"906":{"position":[[563,9]]},"911":{"position":[[50,9],[248,9],[443,9],[579,9],[819,9]]},"988":{"position":[[4948,9]]},"1124":{"position":[[2260,10]]},"1219":{"position":[[87,9],[410,11],[850,11]]}},"keywords":{}}],["websocket"",{"_index":1498,"title":{},"content":{"244":{"position":[[703,15]]}},"keywords":{}}],["websocket('ws://example.com",{"_index":3568,"title":{},"content":{"611":{"position":[[646,30]]}},"keywords":{}}],["websocket('wss://example.com/api/sync/stream",{"_index":5478,"title":{},"content":{"988":{"position":[[5219,47]]}},"keywords":{}}],["websocketconstructor",{"_index":1373,"title":{},"content":{"210":{"position":[[487,21]]},"261":{"position":[[728,21]]},"904":{"position":[[3038,21]]},"911":{"position":[[797,21]]}},"keywords":{}}],["websocketimpl",{"_index":5145,"title":{},"content":{"886":{"position":[[4601,15]]}},"keywords":{}}],["websockets.long",{"_index":3672,"title":{},"content":{"623":{"position":[[436,15]]}},"keywords":{}}],["websql",{"_index":75,"title":{"5":{"position":[[0,7]]},"7":{"position":[[5,7]]},"435":{"position":[[16,7]]},"455":{"position":[[9,7]]},"709":{"position":[[27,6]]}},"content":{"5":{"position":[[40,7],[89,6],[134,6],[219,6],[273,10]]},"7":{"position":[[28,6],[246,6],[305,10]]},"16":{"position":[[322,7]]},"35":{"position":[[174,7]]},"435":{"position":[[1,7],[246,6]]},"455":{"position":[[1,6],[252,6],[339,6],[685,6],[770,7],[826,6]]},"660":{"position":[[83,6]]},"696":{"position":[[845,6],[913,6]]},"709":{"position":[[152,7],[854,6]]},"837":{"position":[[1414,7],[1826,8]]},"1324":{"position":[[104,6],[143,6]]}},"keywords":{}}],["websqlit",{"_index":4782,"title":{},"content":{"837":{"position":[[1791,9]]}},"keywords":{}}],["webstorag",{"_index":2956,"title":{},"content":{"451":{"position":[[56,10]]}},"keywords":{}}],["webtransport",{"_index":3546,"title":{"609":{"position":[[62,12]]},"613":{"position":[[12,12]]}},"content":{"613":{"position":[[1,12],[352,12],[545,12],[657,12],[737,12],[902,12],[1048,13]]},"614":{"position":[[948,13]]},"616":{"position":[[21,12]]},"620":{"position":[[85,12],[446,12],[497,12],[661,12]]},"624":{"position":[[851,13],[1277,12]]},"901":{"position":[[575,13],[650,12]]}},"keywords":{}}],["webwork",{"_index":1028,"title":{"460":{"position":[[0,9]]}},"content":{"100":{"position":[[285,10]]},"227":{"position":[[259,10]]},"392":{"position":[[3218,11],[3232,9],[3822,9]]},"433":{"position":[[352,10]]},"453":{"position":[[332,9]]},"460":{"position":[[267,10],[352,9],[480,9],[749,9],[823,10],[1092,10],[1188,10]]},"463":{"position":[[706,9],[948,9]]},"464":{"position":[[356,9],[872,9]]},"465":{"position":[[217,9]]},"466":{"position":[[181,9],[308,9]]},"467":{"position":[[154,9],[312,9]]},"468":{"position":[[332,9]]},"469":{"position":[[221,10],[1173,10]]},"470":{"position":[[411,9]]},"801":{"position":[[32,9],[347,10],[607,10]]},"1068":{"position":[[346,9]]},"1115":{"position":[[664,11]]},"1117":{"position":[[569,11]]},"1130":{"position":[[360,9]]},"1207":{"position":[[355,10]]},"1210":{"position":[[45,10]]},"1211":{"position":[[89,10]]},"1246":{"position":[[111,9]]},"1266":{"position":[[520,12]]},"1301":{"position":[[623,9]]}},"keywords":{}}],["week",{"_index":2830,"title":{},"content":{"420":{"position":[[142,5],[396,5]]},"702":{"position":[[897,6]]}},"keywords":{}}],["weekli",{"_index":2832,"title":{},"content":{"420":{"position":[[191,6]]}},"keywords":{}}],["well",{"_index":533,"title":{},"content":{"34":{"position":[[266,4]]},"40":{"position":[[186,5]]},"58":{"position":[[23,4]]},"68":{"position":[[118,4]]},"73":{"position":[[41,4]]},"126":{"position":[[292,4]]},"222":{"position":[[178,4]]},"225":{"position":[[150,4]]},"231":{"position":[[95,4]]},"267":{"position":[[29,4]]},"281":{"position":[[179,4],[224,4]]},"289":{"position":[[597,4]]},"303":{"position":[[18,5]]},"325":{"position":[[204,4]]},"354":{"position":[[371,4],[1241,4]]},"362":{"position":[[537,5]]},"369":{"position":[[209,4]]},"394":{"position":[[1427,5]]},"411":{"position":[[3320,5]]},"412":{"position":[[8214,4],[12308,5]]},"418":{"position":[[265,4]]},"546":{"position":[[205,5]]},"606":{"position":[[205,5]]},"641":{"position":[[256,4]]},"829":{"position":[[2858,4]]},"836":{"position":[[1202,4]]},"902":{"position":[[497,4]]},"1313":{"position":[[225,4]]}},"keywords":{}}],["weren't",{"_index":2540,"title":{},"content":{"408":{"position":[[1455,7]]}},"keywords":{}}],["what'",{"_index":2433,"title":{},"content":{"399":{"position":[[631,6]]}},"keywords":{}}],["what.touppercas",{"_index":6504,"title":{},"content":{"1311":{"position":[[754,19]]}},"keywords":{}}],["whatev",{"_index":3189,"title":{},"content":{"496":{"position":[[56,8]]},"1085":{"position":[[619,8]]}},"keywords":{}}],["whatsapp",{"_index":521,"title":{},"content":{"33":{"position":[[477,8]]},"414":{"position":[[24,8]]},"416":{"position":[[100,9]]},"418":{"position":[[134,10]]},"696":{"position":[[435,9]]}},"keywords":{}}],["whenev",{"_index":1170,"title":{},"content":{"156":{"position":[[148,8]]},"159":{"position":[[213,8]]},"168":{"position":[[225,8]]},"196":{"position":[[49,8]]},"233":{"position":[[116,8]]},"253":{"position":[[246,8]]},"322":{"position":[[270,8]]},"323":{"position":[[54,8]]},"329":{"position":[[62,8]]},"344":{"position":[[159,8]]},"411":{"position":[[3242,8]]},"421":{"position":[[635,8]]},"455":{"position":[[589,8]]},"458":{"position":[[1143,8]]},"480":{"position":[[799,8]]},"493":{"position":[[387,8]]},"494":{"position":[[250,8],[562,8]]},"515":{"position":[[255,8]]},"518":{"position":[[216,8]]},"529":{"position":[[75,8]]},"541":{"position":[[825,8]]},"542":{"position":[[973,8]]},"562":{"position":[[1264,8]]},"565":{"position":[[240,8]]},"571":{"position":[[814,8],[966,8]]},"575":{"position":[[295,8]]},"580":{"position":[[617,8]]},"601":{"position":[[806,8]]},"626":{"position":[[932,8]]},"627":{"position":[[193,8]]},"711":{"position":[[555,8]]},"770":{"position":[[21,8]]},"781":{"position":[[869,8]]},"829":{"position":[[3669,8]]},"979":{"position":[[14,8]]},"1007":{"position":[[1958,8]]},"1082":{"position":[[60,8]]},"1148":{"position":[[800,8]]},"1208":{"position":[[146,8]]},"1313":{"position":[[899,8]]},"1317":{"position":[[1,8]]}},"keywords":{}}],["where('ag",{"_index":5354,"title":{},"content":{"949":{"position":[[162,13]]}},"keywords":{}}],["where('ownerid",{"_index":4887,"title":{},"content":{"858":{"position":[[338,16]]}},"keywords":{}}],["wherea",{"_index":1720,"title":{},"content":{"298":{"position":[[567,7]]},"359":{"position":[[45,7]]},"535":{"position":[[483,7]]}},"keywords":{}}],["whereisai/ua",{"_index":2472,"title":{},"content":{"401":{"position":[[510,13]]}},"keywords":{}}],["wherev",{"_index":3123,"title":{},"content":{"479":{"position":[[456,8]]}},"keywords":{}}],["whether",{"_index":1065,"title":{},"content":{"117":{"position":[[134,7]]},"148":{"position":[[303,7]]},"151":{"position":[[303,7]]},"178":{"position":[[142,7]]},"207":{"position":[[83,7]]},"212":{"position":[[541,7]]},"238":{"position":[[111,7]]},"239":{"position":[[92,7]]},"254":{"position":[[73,7]]},"267":{"position":[[1463,7]]},"286":{"position":[[132,7]]},"361":{"position":[[78,7]]},"369":{"position":[[333,7],[989,7]]},"371":{"position":[[112,7]]},"388":{"position":[[387,7]]},"412":{"position":[[2347,7]]},"446":{"position":[[114,7],[929,7]]},"490":{"position":[[75,7]]},"567":{"position":[[1140,7]]},"574":{"position":[[341,7]]},"785":{"position":[[568,7]]},"839":{"position":[[1094,7]]},"1049":{"position":[[37,7]]},"1147":{"position":[[420,7]]}},"keywords":{}}],["whitespac",{"_index":4287,"title":{},"content":{"749":{"position":[[11619,10]]}},"keywords":{}}],["whoami",{"_index":4602,"title":{},"content":{"789":{"position":[[480,7]]},"791":{"position":[[348,7]]}},"keywords":{}}],["whole",{"_index":249,"title":{},"content":{"15":{"position":[[125,5]]},"352":{"position":[[104,5]]},"365":{"position":[[835,5]]},"403":{"position":[[56,5]]},"469":{"position":[[1238,5]]},"501":{"position":[[423,5]]},"612":{"position":[[465,5]]},"647":{"position":[[11,5]]},"764":{"position":[[240,5]]},"775":{"position":[[322,5]]},"783":{"position":[[324,5]]},"784":{"position":[[450,5]]},"800":{"position":[[119,5]]},"826":{"position":[[561,5],[986,5]]},"888":{"position":[[51,5]]},"1077":{"position":[[102,5]]},"1094":{"position":[[638,5]]},"1116":{"position":[[129,5]]},"1124":{"position":[[332,5]]},"1184":{"position":[[359,6]]},"1194":{"position":[[244,5]]},"1198":{"position":[[787,5]]},"1271":{"position":[[456,5]]},"1295":{"position":[[901,5]]},"1300":{"position":[[470,5]]},"1304":{"position":[[1261,5]]},"1316":{"position":[[3071,5],[3676,5]]},"1318":{"position":[[673,5]]}},"keywords":{}}],["whose",{"_index":2676,"title":{},"content":{"412":{"position":[[3194,5]]},"724":{"position":[[690,5],[1560,5]]},"898":{"position":[[1634,5]]}},"keywords":{}}],["wide",{"_index":1038,"title":{},"content":{"105":{"position":[[15,6]]},"162":{"position":[[322,6]]},"177":{"position":[[228,4]]},"189":{"position":[[321,6]]},"267":{"position":[[1428,4]]},"287":{"position":[[593,4]]},"320":{"position":[[96,6]]},"364":{"position":[[226,6]]},"454":{"position":[[169,4]]},"469":{"position":[[12,4]]},"613":{"position":[[700,6],[927,6]]},"624":{"position":[[925,6]]},"788":{"position":[[32,4]]},"790":{"position":[[41,5]]},"792":{"position":[[43,5]]},"904":{"position":[[511,4]]},"1124":{"position":[[55,4],[620,4]]},"1134":{"position":[[314,4]]},"1272":{"position":[[246,4]]}},"keywords":{}}],["widespread",{"_index":3620,"title":{},"content":{"613":{"position":[[612,10]]}},"keywords":{}}],["widget",{"_index":1231,"title":{},"content":{"177":{"position":[[242,7]]}},"keywords":{}}],["wifi",{"_index":5246,"title":{},"content":{"902":{"position":[[780,4]]}},"keywords":{}}],["wiki",{"_index":2231,"title":{},"content":{"392":{"position":[[798,4]]}},"keywords":{}}],["wild",{"_index":2746,"title":{},"content":{"412":{"position":[[11550,5]]}},"keywords":{}}],["wildcard",{"_index":5947,"title":{},"content":{"1103":{"position":[[139,8]]}},"keywords":{}}],["win",{"_index":231,"title":{},"content":{"14":{"position":[[860,4]]},"203":{"position":[[73,4]]},"250":{"position":[[33,4]]},"412":{"position":[[2370,5],[3208,4],[3298,4]]},"432":{"position":[[1344,3]]},"496":{"position":[[22,5],[645,4]]},"635":{"position":[[233,4]]},"688":{"position":[[891,4]]},"698":{"position":[[645,7],[1352,7],[1832,7],[2041,7]]},"1305":{"position":[[168,4]]}},"keywords":{}}],["window",{"_index":1178,"title":{},"content":{"160":{"position":[[270,8]]},"299":{"position":[[806,7]]},"330":{"position":[[127,7]]},"427":{"position":[[1324,7]]},"451":{"position":[[895,6]]},"475":{"position":[[266,6]]},"502":{"position":[[1252,7]]},"519":{"position":[[60,8]]},"729":{"position":[[331,7],[356,7],[364,7]]},"958":{"position":[[27,7]]},"964":{"position":[[262,8],[319,7],[498,6]]},"1202":{"position":[[370,7],[395,7],[403,7]]},"1300":{"position":[[768,6]]}},"keywords":{}}],["window.process",{"_index":5268,"title":{},"content":{"910":{"position":[[378,14]]}},"keywords":{}}],["window.sqliteplugin",{"_index":150,"title":{},"content":{"11":{"position":[[278,21]]}},"keywords":{}}],["windows.handl",{"_index":1222,"title":{},"content":{"174":{"position":[[2021,16]]}},"keywords":{}}],["windows.storag",{"_index":2894,"title":{},"content":{"427":{"position":[[1445,15]]}},"keywords":{}}],["winner",{"_index":3941,"title":{},"content":{"698":{"position":[[571,6],[766,7]]}},"keywords":{}}],["wins"",{"_index":2697,"title":{},"content":{"412":{"position":[[5300,10],[5522,10]]}},"keywords":{}}],["wipe",{"_index":2723,"title":{},"content":{"412":{"position":[[7887,5],[8716,6]]},"977":{"position":[[1,5]]}},"keywords":{}}],["wire",{"_index":374,"title":{},"content":{"22":{"position":[[276,5]]},"585":{"position":[[263,7]]},"700":{"position":[[792,4]]},"871":{"position":[[793,4]]},"1022":{"position":[[59,4]]}},"keywords":{}}],["wish",{"_index":6091,"title":{},"content":{"1151":{"position":[[512,4]]},"1178":{"position":[[511,4]]}},"keywords":{}}],["withcredenti",{"_index":5050,"title":{},"content":{"875":{"position":[[8178,16],[9597,16]]}},"keywords":{}}],["withdist",{"_index":2313,"title":{},"content":{"394":{"position":[[747,12]]}},"keywords":{}}],["withdistance.sort(sortbyobjectnumberproperty('distance')).revers",{"_index":2318,"title":{},"content":{"394":{"position":[[876,68]]}},"keywords":{}}],["withhold",{"_index":1878,"title":{},"content":{"310":{"position":[[192,11]]}},"keywords":{}}],["within",{"_index":291,"title":{},"content":{"17":{"position":[[219,6]]},"65":{"position":[[1060,6]]},"94":{"position":[[224,6]]},"101":{"position":[[217,6]]},"107":{"position":[[164,6]]},"172":{"position":[[90,6],[139,6]]},"173":{"position":[[3224,6]]},"174":{"position":[[1035,6]]},"201":{"position":[[115,6]]},"219":{"position":[[364,6]]},"222":{"position":[[347,6]]},"228":{"position":[[240,6]]},"235":{"position":[[100,6]]},"275":{"position":[[179,6]]},"286":{"position":[[334,6]]},"287":{"position":[[684,6]]},"291":{"position":[[127,6]]},"329":{"position":[[174,6]]},"354":{"position":[[632,6]]},"356":{"position":[[263,6]]},"369":{"position":[[305,6]]},"371":{"position":[[291,6]]},"392":{"position":[[1285,6]]},"397":{"position":[[85,6]]},"398":{"position":[[1852,6]]},"408":{"position":[[1637,6]]},"433":{"position":[[343,6]]},"438":{"position":[[295,6]]},"445":{"position":[[1982,6]]},"446":{"position":[[1268,6]]},"503":{"position":[[237,6]]},"522":{"position":[[193,6]]},"523":{"position":[[84,6]]},"543":{"position":[[39,6]]},"569":{"position":[[780,6]]},"570":{"position":[[398,6]]},"571":{"position":[[1486,6]]},"577":{"position":[[48,6]]},"579":{"position":[[1,6]]},"591":{"position":[[655,6]]},"603":{"position":[[39,6]]},"614":{"position":[[146,6]]},"622":{"position":[[653,6]]},"723":{"position":[[449,6],[1391,6]]},"871":{"position":[[631,6]]},"902":{"position":[[391,6]]},"946":{"position":[[43,6]]},"1072":{"position":[[758,6]]},"1132":{"position":[[1510,6]]},"1151":{"position":[[229,6]]},"1178":{"position":[[228,6]]}},"keywords":{}}],["withmetafield",{"_index":5726,"title":{},"content":{"1051":{"position":[[320,15]]}},"keywords":{}}],["without",{"_index":385,"title":{"711":{"position":[[22,7]]},"778":{"position":[[13,7]]},"1319":{"position":[[10,7]]}},"content":{"23":{"position":[[230,7]]},"27":{"position":[[89,7]]},"29":{"position":[[165,7]]},"131":{"position":[[158,7]]},"162":{"position":[[628,7]]},"164":{"position":[[221,7]]},"183":{"position":[[118,7]]},"185":{"position":[[337,7]]},"210":{"position":[[709,7]]},"212":{"position":[[46,7],[462,7],[642,7]]},"237":{"position":[[243,7]]},"261":{"position":[[188,7]]},"274":{"position":[[145,7]]},"276":{"position":[[88,7]]},"279":{"position":[[279,7]]},"280":{"position":[[261,7]]},"282":{"position":[[405,7]]},"289":{"position":[[413,7]]},"291":{"position":[[278,7]]},"292":{"position":[[269,7]]},"295":{"position":[[226,7]]},"309":{"position":[[197,7]]},"321":{"position":[[265,7]]},"330":{"position":[[135,7]]},"346":{"position":[[591,7]]},"362":{"position":[[96,7]]},"369":{"position":[[707,7]]},"375":{"position":[[117,7]]},"381":{"position":[[532,7]]},"383":{"position":[[440,7]]},"408":{"position":[[675,7],[1325,7],[2870,7]]},"410":{"position":[[1552,7]]},"411":{"position":[[3037,7],[3888,7]]},"412":{"position":[[31,7]]},"414":{"position":[[129,7]]},"415":{"position":[[218,7]]},"419":{"position":[[277,7]]},"424":{"position":[[447,7]]},"430":{"position":[[978,7]]},"433":{"position":[[602,7]]},"445":{"position":[[2070,7]]},"455":{"position":[[692,7]]},"467":{"position":[[231,7]]},"482":{"position":[[1137,7]]},"487":{"position":[[427,7]]},"489":{"position":[[684,7]]},"504":{"position":[[1388,7]]},"534":{"position":[[267,7]]},"542":{"position":[[1000,7]]},"548":{"position":[[263,7]]},"550":{"position":[[148,7]]},"570":{"position":[[599,7]]},"571":{"position":[[258,7]]},"574":{"position":[[246,7]]},"582":{"position":[[106,7]]},"585":{"position":[[237,7]]},"594":{"position":[[265,7]]},"608":{"position":[[261,7]]},"611":{"position":[[186,7]]},"612":{"position":[[331,7]]},"614":{"position":[[190,7]]},"616":{"position":[[484,7]]},"617":{"position":[[2359,8]]},"618":{"position":[[739,7]]},"621":{"position":[[323,7]]},"623":{"position":[[374,7]]},"638":{"position":[[911,7]]},"643":{"position":[[300,7]]},"644":{"position":[[726,7]]},"705":{"position":[[771,7]]},"707":{"position":[[130,7]]},"710":{"position":[[584,7],[1253,7]]},"723":{"position":[[536,7],[930,7],[1281,7]]},"749":{"position":[[5985,7],[6992,7],[7111,7]]},"782":{"position":[[450,7]]},"801":{"position":[[519,7]]},"816":{"position":[[250,7]]},"838":{"position":[[1288,7]]},"875":{"position":[[9169,7]]},"902":{"position":[[193,7]]},"912":{"position":[[459,7]]},"943":{"position":[[194,7]]},"977":{"position":[[163,7],[378,7]]},"981":{"position":[[1438,7]]},"1008":{"position":[[275,7]]},"1065":{"position":[[55,7],[1979,7]]},"1068":{"position":[[211,7]]},"1071":{"position":[[274,7]]},"1072":{"position":[[1579,7]]},"1092":{"position":[[468,7]]},"1093":{"position":[[504,7]]},"1094":{"position":[[596,7]]},"1107":{"position":[[446,7]]},"1120":{"position":[[265,7]]},"1150":{"position":[[630,7]]},"1151":{"position":[[789,7]]},"1164":{"position":[[354,7]]},"1178":{"position":[[786,7]]},"1219":{"position":[[196,7]]},"1252":{"position":[[227,7]]},"1282":{"position":[[293,7],[952,7]]},"1295":{"position":[[1427,7]]},"1297":{"position":[[351,7]]},"1300":{"position":[[136,7]]},"1304":{"position":[[1720,7]]},"1305":{"position":[[9,7]]},"1324":{"position":[[840,7]]}},"keywords":{}}],["withoutrowid",{"_index":6375,"title":{},"content":{"1282":{"position":[[1066,13],[1218,13]]}},"keywords":{}}],["won't",{"_index":750,"title":{},"content":{"50":{"position":[[74,5]]},"357":{"position":[[415,5]]},"421":{"position":[[908,5]]}},"keywords":{}}],["word",{"_index":2192,"title":{},"content":{"390":{"position":[[647,4]]},"396":{"position":[[1316,5]]},"569":{"position":[[45,4]]},"699":{"position":[[249,4]]},"1023":{"position":[[406,5],[520,5],[526,4]]}},"keywords":{}}],["word"",{"_index":5642,"title":{},"content":{"1023":{"position":[[627,10]]}},"keywords":{}}],["words.map(word",{"_index":5641,"title":{},"content":{"1023":{"position":[[474,14]]}},"keywords":{}}],["work",{"_index":46,"title":{"207":{"position":[[3,5]]},"255":{"position":[[21,6]]},"292":{"position":[[0,5]]},"481":{"position":[[17,5]]},"642":{"position":[[11,4]]},"696":{"position":[[8,5]]},"779":{"position":[[21,6]]},"1208":{"position":[[17,6]]},"1254":{"position":[[22,4]]},"1313":{"position":[[20,4]]},"1314":{"position":[[20,4]]}},"content":{"2":{"position":[[275,4]]},"6":{"position":[[434,4]]},"10":{"position":[[208,4]]},"15":{"position":[[226,6]]},"19":{"position":[[317,5]]},"20":{"position":[[264,4]]},"35":{"position":[[247,4]]},"38":{"position":[[117,4],[208,4],[1086,7]]},"47":{"position":[[34,7],[1196,5]]},"50":{"position":[[340,5]]},"58":{"position":[[17,5]]},"94":{"position":[[216,7]]},"104":{"position":[[145,7]]},"122":{"position":[[114,4]]},"129":{"position":[[653,5]]},"130":{"position":[[146,7]]},"138":{"position":[[179,7]]},"141":{"position":[[243,7]]},"147":{"position":[[6,7]]},"157":{"position":[[67,4],[296,7]]},"174":{"position":[[820,7]]},"179":{"position":[[64,4]]},"206":{"position":[[204,7]]},"212":{"position":[[41,4]]},"231":{"position":[[154,5]]},"237":{"position":[[205,4]]},"362":{"position":[[531,5]]},"368":{"position":[[304,4]]},"369":{"position":[[85,7],[965,7]]},"371":{"position":[[27,7],[221,4]]},"372":{"position":[[121,4]]},"380":{"position":[[34,4]]},"390":{"position":[[329,4]]},"392":{"position":[[2151,4]]},"394":{"position":[[89,5]]},"396":{"position":[[1227,4]]},"404":{"position":[[29,5]]},"407":{"position":[[621,7],[1029,4]]},"408":{"position":[[5486,4]]},"410":{"position":[[969,4]]},"411":{"position":[[4587,5],[5558,7]]},"412":{"position":[[4418,5],[6932,5],[9354,5]]},"419":{"position":[[261,4]]},"420":{"position":[[852,4]]},"421":{"position":[[196,6],[791,7]]},"433":{"position":[[276,7]]},"439":{"position":[[379,5]]},"440":{"position":[[35,7],[127,4]]},"445":{"position":[[480,4]]},"446":{"position":[[224,7],[662,4]]},"452":{"position":[[655,8]]},"457":{"position":[[217,5]]},"460":{"position":[[505,4]]},"469":{"position":[[1148,4]]},"493":{"position":[[24,5]]},"498":{"position":[[361,6]]},"556":{"position":[[1761,4]]},"574":{"position":[[233,7]]},"590":{"position":[[732,5]]},"613":{"position":[[573,7],[678,7]]},"614":{"position":[[407,4],[856,5]]},"627":{"position":[[312,5]]},"632":{"position":[[856,4]]},"634":{"position":[[389,5]]},"666":{"position":[[271,4]]},"668":{"position":[[145,5],[411,5]]},"688":{"position":[[541,5],[754,4]]},"696":{"position":[[691,5]]},"697":{"position":[[478,4]]},"698":{"position":[[803,5]]},"704":{"position":[[100,5]]},"705":{"position":[[80,6],[450,5],[1308,4]]},"714":{"position":[[89,4],[351,5]]},"723":{"position":[[913,4]]},"749":{"position":[[1894,4],[6987,4],[7106,4],[8977,4]]},"772":{"position":[[170,4],[2043,5]]},"775":{"position":[[45,5]]},"781":{"position":[[335,5]]},"784":{"position":[[421,5],[743,5]]},"793":{"position":[[903,5]]},"811":{"position":[[139,5]]},"817":{"position":[[245,5]]},"830":{"position":[[48,4]]},"831":{"position":[[492,5]]},"835":{"position":[[55,5]]},"836":{"position":[[1015,4]]},"838":{"position":[[685,4]]},"840":{"position":[[392,5]]},"842":{"position":[[305,4]]},"863":{"position":[[217,5]]},"875":{"position":[[9399,4]]},"882":{"position":[[291,4]]},"884":{"position":[[91,6]]},"893":{"position":[[289,5]]},"901":{"position":[[669,4]]},"904":{"position":[[70,6]]},"906":{"position":[[24,4]]},"908":{"position":[[26,5]]},"913":{"position":[[212,7]]},"948":{"position":[[775,5]]},"956":{"position":[[95,5]]},"962":{"position":[[6,5]]},"975":{"position":[[69,5]]},"981":{"position":[[165,5],[1139,5]]},"982":{"position":[[42,5]]},"988":{"position":[[2186,4]]},"1018":{"position":[[456,5],[538,6],[579,5],[616,5]]},"1065":{"position":[[1923,5]]},"1071":{"position":[[163,4]]},"1088":{"position":[[299,5]]},"1093":{"position":[[235,4],[331,4]]},"1095":{"position":[[172,4]]},"1117":{"position":[[508,5]]},"1133":{"position":[[474,4]]},"1141":{"position":[[98,5],[280,4]]},"1176":{"position":[[174,4]]},"1183":{"position":[[34,6]]},"1191":{"position":[[628,4]]},"1198":{"position":[[191,6],[1767,4]]},"1208":{"position":[[615,4]]},"1229":{"position":[[216,5]]},"1258":{"position":[[10,4],[42,4],[138,5]]},"1259":{"position":[[10,4]]},"1271":{"position":[[1715,4]]},"1272":{"position":[[132,4]]},"1277":{"position":[[632,4]]},"1278":{"position":[[59,5]]},"1282":{"position":[[283,4],[339,5],[721,4]]},"1300":{"position":[[1016,4]]},"1301":{"position":[[501,4],[930,4]]},"1304":{"position":[[1370,4]]},"1305":{"position":[[1,7],[441,4]]},"1313":{"position":[[100,5],[219,5],[889,5]]},"1316":{"position":[[1529,5],[1805,5],[2504,5],[2577,4],[3117,5]]},"1318":{"position":[[764,4],[964,4]]},"1320":{"position":[[529,5]]}},"keywords":{}}],["work"",{"_index":3658,"title":{},"content":{"619":{"position":[[93,11]]}},"keywords":{}}],["work.complex",{"_index":5428,"title":{},"content":{"981":{"position":[[316,12]]}},"keywords":{}}],["workaround",{"_index":2542,"title":{},"content":{"408":{"position":[[2043,12]]},"458":{"position":[[992,10],[1286,10]]},"459":{"position":[[1107,10]]},"617":{"position":[[1140,10]]},"845":{"position":[[168,11]]},"1072":{"position":[[2115,12]]},"1135":{"position":[[263,11]]},"1198":{"position":[[828,11]]},"1315":{"position":[[1558,11]]}},"keywords":{}}],["worker",{"_index":2253,"title":{"721":{"position":[[15,8]]},"801":{"position":[[21,6]]},"1089":{"position":[[6,7]]},"1211":{"position":[[43,7]]},"1213":{"position":[[76,7]]},"1227":{"position":[[10,8]]},"1228":{"position":[[18,7]]},"1262":{"position":[[0,6]]},"1263":{"position":[[7,6]]},"1265":{"position":[[10,8]]},"1266":{"position":[[18,7]]},"1267":{"position":[[4,6]]},"1268":{"position":[[13,6]]}},"content":{"392":{"position":[[3337,6],[3711,6],[3753,6],[3847,7],[4117,6],[4183,6],[5090,6]]},"402":{"position":[[2813,6]]},"408":{"position":[[1756,8],[4732,7]]},"458":{"position":[[1500,7]]},"460":{"position":[[419,7],[549,6]]},"463":{"position":[[476,6]]},"469":{"position":[[990,6]]},"500":{"position":[[589,7]]},"642":{"position":[[71,6],[88,6]]},"693":{"position":[[392,6]]},"721":{"position":[[18,6],[127,7],[255,8],[331,7],[468,6]]},"749":{"position":[[3407,6],[3594,6],[23700,7]]},"757":{"position":[[98,6],[172,8]]},"793":{"position":[[482,6]]},"801":{"position":[[901,6]]},"1068":{"position":[[418,6]]},"1089":{"position":[[75,6]]},"1207":{"position":[[575,7]]},"1210":{"position":[[77,6],[389,8]]},"1211":{"position":[[477,6]]},"1212":{"position":[[92,7],[176,7],[239,6],[433,8]]},"1213":{"position":[[35,7],[162,6],[408,6],[809,7]]},"1225":{"position":[[8,6],[196,8],[375,7]]},"1226":{"position":[[113,8],[640,7]]},"1227":{"position":[[163,6],[523,7],[663,8]]},"1228":{"position":[[71,6],[97,6],[118,6],[162,6]]},"1229":{"position":[[172,6],[254,6]]},"1230":{"position":[[78,7],[349,6]]},"1231":{"position":[[95,7],[412,7],[509,8]]},"1233":{"position":[[38,7],[60,6],[95,7]]},"1238":{"position":[[185,6],[307,6],[586,8]]},"1239":{"position":[[372,7],[425,7],[750,8]]},"1246":{"position":[[4,7],[17,6],[140,6],[361,6],[921,6]]},"1263":{"position":[[82,8],[269,7]]},"1264":{"position":[[107,8],[273,6],[520,7]]},"1265":{"position":[[156,6],[517,7],[651,8]]},"1266":{"position":[[134,8],[553,8]]},"1267":{"position":[[59,6],[166,6],[196,6],[335,6]]},"1268":{"position":[[94,6],[250,6],[390,6],[637,8]]},"1301":{"position":[[828,6]]}},"keywords":{}}],["worker'",{"_index":6288,"title":{},"content":{"1246":{"position":[[246,8],[566,8]]}},"keywords":{}}],["worker('path/to/worker.j",{"_index":6327,"title":{},"content":{"1268":{"position":[[171,27]]}},"keywords":{}}],["worker(new",{"_index":2264,"title":{},"content":{"392":{"position":[[3925,10]]},"1268":{"position":[[481,10]]}},"keywords":{}}],["worker.addeventlistener('messag",{"_index":2278,"title":{},"content":{"392":{"position":[[4432,34]]}},"keywords":{}}],["worker.j",{"_index":2255,"title":{"1212":{"position":[[18,10]]}},"content":{"392":{"position":[[3487,9]]},"1212":{"position":[[127,9],[280,9]]},"1213":{"position":[[577,9]]},"1226":{"position":[[448,9],[593,11]]},"1227":{"position":[[12,9],[468,9],[921,10]]},"1228":{"position":[[19,9]]},"1264":{"position":[[351,9]]},"1265":{"position":[[5,9],[462,9]]},"1266":{"position":[[36,9],[583,11]]}},"keywords":{}}],["worker.postmessag",{"_index":2279,"title":{},"content":{"392":{"position":[[4478,20]]}},"keywords":{}}],["worker.removeeventlistener('messag",{"_index":2277,"title":{},"content":{"392":{"position":[[4378,37]]}},"keywords":{}}],["worker.t",{"_index":6264,"title":{},"content":{"1225":{"position":[[118,9]]},"1231":{"position":[[431,9]]},"1263":{"position":[[4,9]]}},"keywords":{}}],["workerinput",{"_index":6231,"title":{},"content":{"1210":{"position":[[637,12]]},"1226":{"position":[[564,12]]},"1227":{"position":[[889,12]]},"1229":{"position":[[30,12],[235,11]]},"1238":{"position":[[944,12]]},"1264":{"position":[[451,12]]},"1265":{"position":[[863,12]]},"1267":{"position":[[510,12]]},"1268":{"position":[[30,12],[145,12],[455,12]]}},"keywords":{}}],["workeropt",{"_index":6270,"title":{},"content":{"1226":{"position":[[651,14]]},"1264":{"position":[[531,14]]}},"keywords":{}}],["workers[lastworkerid",{"_index":2271,"title":{},"content":{"392":{"position":[[4126,24],[4192,24]]}},"keywords":{}}],["workerstorag",{"_index":6324,"title":{},"content":{"1267":{"position":[[473,13],[667,13],[761,13]]}},"keywords":{}}],["workflow",{"_index":2243,"title":{},"content":{"392":{"position":[[2423,8]]},"408":{"position":[[2785,10]]},"496":{"position":[[478,9]]},"644":{"position":[[765,9]]}},"keywords":{}}],["workload",{"_index":1008,"title":{},"content":{"91":{"position":[[40,8]]},"801":{"position":[[403,8]]}},"keywords":{}}],["world",{"_index":1610,"title":{},"content":{"266":{"position":[[356,7]]},"284":{"position":[[58,5]]},"301":{"position":[[29,5]]},"356":{"position":[[637,6]]},"396":{"position":[[342,6],[563,6]]},"441":{"position":[[8,5]]},"469":{"position":[[1394,5]]},"500":{"position":[[114,7]]},"510":{"position":[[786,6]]},"569":{"position":[[1054,6]]},"699":{"position":[[238,6]]},"798":{"position":[[247,5]]},"839":{"position":[[81,6]]},"1006":{"position":[[63,5],[268,5]]},"1007":{"position":[[326,5]]},"1009":{"position":[[16,5]]},"1123":{"position":[[358,6]]},"1209":{"position":[[329,5]]},"1304":{"position":[[1267,5]]}},"keywords":{}}],["worldwid",{"_index":6010,"title":{},"content":{"1123":{"position":[[104,9],[237,9]]}},"keywords":{}}],["worri",{"_index":1885,"title":{},"content":{"312":{"position":[[289,5]]},"721":{"position":[[284,5]]},"839":{"position":[[1051,5]]},"1084":{"position":[[432,6]]}},"keywords":{}}],["wors",{"_index":2486,"title":{},"content":{"402":{"position":[[1687,5]]},"521":{"position":[[300,5]]}},"keywords":{}}],["worst",{"_index":2749,"title":{},"content":{"412":{"position":[[11824,5]]}},"keywords":{}}],["worth",{"_index":1597,"title":{},"content":{"263":{"position":[[232,5]]},"432":{"position":[[513,5]]},"447":{"position":[[591,5]]}},"keywords":{}}],["wrap",{"_index":1628,"title":{},"content":{"269":{"position":[[215,7]]},"302":{"position":[[358,4]]},"482":{"position":[[415,4]]},"554":{"position":[[849,4]]},"693":{"position":[[416,4]]},"717":{"position":[[508,4],[719,4],[904,7]]},"718":{"position":[[292,4]]},"734":{"position":[[72,4]]},"745":{"position":[[37,7],[88,8],[135,7],[347,4],[496,7]]},"749":{"position":[[24151,7]]},"785":{"position":[[357,4]]},"932":{"position":[[863,7]]},"1031":{"position":[[115,4]]},"1154":{"position":[[25,7],[404,4],[700,7]]},"1163":{"position":[[328,4]]},"1182":{"position":[[328,4]]},"1222":{"position":[[169,4],[1347,7]]},"1225":{"position":[[49,4],[315,4]]},"1246":{"position":[[1158,4]]},"1263":{"position":[[209,4]]},"1270":{"position":[[113,8]]},"1286":{"position":[[343,4]]},"1287":{"position":[[389,4]]},"1288":{"position":[[349,4]]}},"keywords":{}}],["wrappedattachmentscompressionstorag",{"_index":5314,"title":{},"content":{"932":{"position":[[687,36],[950,38]]}},"keywords":{}}],["wrappedkeycompressionstorag",{"_index":4081,"title":{},"content":{"734":{"position":[[134,28],[314,30]]},"1237":{"position":[[577,28],[904,30]]}},"keywords":{}}],["wrappedkeyencryptioncryptojsstorag",{"_index":1894,"title":{},"content":{"315":{"position":[[171,35],[443,37]]},"482":{"position":[[300,35],[483,37]]},"554":{"position":[[525,35],[931,37]]},"564":{"position":[[236,35],[451,37]]},"638":{"position":[[230,35],[335,37]]},"717":{"position":[[558,35],[795,37]]},"1237":{"position":[[654,35],[944,37]]}},"keywords":{}}],["wrappedkeyencryptionwebcryptostorag",{"_index":4025,"title":{},"content":{"718":{"position":[[103,37],[377,38]]},"1184":{"position":[[544,36],[686,38]]}},"keywords":{}}],["wrappedloggerstorag",{"_index":4113,"title":{},"content":{"745":{"position":[[205,20],[401,22]]},"746":{"position":[[241,23],[289,22]]},"747":{"position":[[106,22]]}},"keywords":{}}],["wrappedvalidateajvstorag",{"_index":6283,"title":{},"content":{"1237":{"position":[[506,25],[867,27]]},"1286":{"position":[[200,25],[405,27]]}},"keywords":{}}],["wrappedvalidateismyjsonvalidstorag",{"_index":6387,"title":{},"content":{"1288":{"position":[[183,35],[411,37]]}},"keywords":{}}],["wrappedvalidatezschemastorag",{"_index":6386,"title":{},"content":{"1287":{"position":[[237,29],[451,31]]}},"keywords":{}}],["wrapper",{"_index":370,"title":{"1246":{"position":[[8,7]]}},"content":{"22":{"position":[[190,7]]},"33":{"position":[[28,7]]},"266":{"position":[[782,7],[822,7]]},"432":{"position":[[1024,7]]},"433":{"position":[[431,7]]},"441":{"position":[[418,7]]},"717":{"position":[[469,7]]},"734":{"position":[[33,7]]},"745":{"position":[[17,7]]},"793":{"position":[[401,8]]},"1184":{"position":[[278,7]]},"1198":{"position":[[162,7]]},"1212":{"position":[[54,8]]},"1246":{"position":[[39,7],[383,7],[1270,7],[1310,7],[1672,7],[1712,7]]},"1247":{"position":[[214,7]]},"1279":{"position":[[300,8]]},"1280":{"position":[[231,8]]}},"keywords":{}}],["write",{"_index":230,"title":{"464":{"position":[[17,7]]},"466":{"position":[[9,7]]},"1033":{"position":[[47,7]]},"1115":{"position":[[0,7]]},"1185":{"position":[[6,5]]},"1239":{"position":[[15,6]]}},"content":{"14":{"position":[[854,5]]},"27":{"position":[[107,5]]},"28":{"position":[[340,6]]},"31":{"position":[[104,7]]},"35":{"position":[[219,5]]},"41":{"position":[[276,5]]},"43":{"position":[[442,5]]},"201":{"position":[[294,6]]},"250":{"position":[[27,5]]},"253":{"position":[[176,5]]},"262":{"position":[[282,6]]},"265":{"position":[[656,6]]},"266":{"position":[[886,5]]},"301":{"position":[[164,7]]},"302":{"position":[[368,5],[671,6],[1140,5]]},"304":{"position":[[370,6]]},"358":{"position":[[276,5],[548,5],[647,5],[1063,6]]},"360":{"position":[[191,7]]},"362":{"position":[[717,7]]},"365":{"position":[[281,5]]},"376":{"position":[[335,7],[386,5]]},"380":{"position":[[165,7]]},"386":{"position":[[215,7]]},"392":{"position":[[1964,6]]},"407":{"position":[[138,5]]},"408":{"position":[[2863,6]]},"411":{"position":[[1190,7]]},"412":{"position":[[1265,7],[2364,5],[3292,5],[5516,5],[10125,6],[11326,5],[12944,7]]},"421":{"position":[[1200,6]]},"430":{"position":[[726,5]]},"433":{"position":[[193,5]]},"445":{"position":[[1445,5]]},"453":{"position":[[198,5]]},"458":{"position":[[524,5],[603,5],[1161,5],[1479,6]]},"459":{"position":[[95,7]]},"464":{"position":[[37,7],[489,5],[552,6],[728,6],[787,5],[1232,6]]},"465":{"position":[[468,5]]},"466":{"position":[[450,5]]},"467":{"position":[[573,6],[643,6]]},"469":{"position":[[279,7]]},"474":{"position":[[126,5]]},"477":{"position":[[213,6]]},"481":{"position":[[790,6]]},"489":{"position":[[333,7],[499,5]]},"490":{"position":[[94,6]]},"491":{"position":[[1171,6]]},"496":{"position":[[6,5],[629,5]]},"497":{"position":[[152,6]]},"559":{"position":[[1096,7]]},"566":{"position":[[867,5]]},"630":{"position":[[92,7],[691,5]]},"632":{"position":[[1916,6]]},"634":{"position":[[100,6]]},"635":{"position":[[227,5]]},"642":{"position":[[256,5]]},"647":{"position":[[1,5]]},"648":{"position":[[41,5],[322,6]]},"659":{"position":[[487,5]]},"682":{"position":[[80,6],[173,5],[227,6]]},"685":{"position":[[358,5]]},"686":{"position":[[661,6]]},"687":{"position":[[313,6]]},"688":{"position":[[885,5]]},"690":{"position":[[283,6]]},"696":{"position":[[495,6]]},"698":{"position":[[1095,5],[2309,5]]},"709":{"position":[[490,6],[1133,5]]},"711":{"position":[[584,5]]},"749":{"position":[[6383,5],[8671,5],[16744,5]]},"773":{"position":[[211,5]]},"774":{"position":[[204,6],[225,5],[267,5],[1053,5]]},"775":{"position":[[388,7]]},"785":{"position":[[326,5],[683,6]]},"795":{"position":[[14,5]]},"835":{"position":[[269,6]]},"854":{"position":[[1212,5]]},"857":{"position":[[474,6]]},"863":{"position":[[344,5]]},"875":{"position":[[1422,6],[1613,7],[3600,6],[4009,5],[5189,5],[5837,6],[8013,7]]},"885":{"position":[[200,6],[1121,5]]},"886":{"position":[[3318,6]]},"898":{"position":[[759,6]]},"908":{"position":[[322,5]]},"932":{"position":[[476,5]]},"970":{"position":[[63,5]]},"973":{"position":[[1,6]]},"981":{"position":[[1151,7]]},"982":{"position":[[97,6]]},"983":{"position":[[460,6],[565,5],[779,6],[819,5]]},"986":{"position":[[107,5],[184,5],[881,5],[916,6]]},"987":{"position":[[440,5]]},"988":{"position":[[4754,7]]},"990":{"position":[[153,5],[418,5],[526,5],[559,5]]},"1002":{"position":[[207,6]]},"1004":{"position":[[244,5]]},"1020":{"position":[[324,7],[529,5]]},"1022":{"position":[[381,6]]},"1032":{"position":[[278,7]]},"1033":{"position":[[44,6],[297,5]]},"1065":{"position":[[41,5]]},"1090":{"position":[[114,5],[1148,5],[1251,5]]},"1093":{"position":[[388,6]]},"1094":{"position":[[478,6]]},"1102":{"position":[[1303,5]]},"1106":{"position":[[87,6],[235,6],[518,6]]},"1108":{"position":[[182,6]]},"1115":{"position":[[1,7],[600,5]]},"1119":{"position":[[12,7]]},"1120":{"position":[[149,5],[453,5],[514,5],[606,6]]},"1137":{"position":[[171,5]]},"1143":{"position":[[572,6]]},"1156":{"position":[[142,7]]},"1162":{"position":[[185,6]]},"1164":{"position":[[849,5],[889,6],[971,6],[1045,6],[1144,6]]},"1165":{"position":[[1015,6]]},"1175":{"position":[[132,5]]},"1177":{"position":[[576,5]]},"1181":{"position":[[251,6]]},"1185":{"position":[[206,5]]},"1186":{"position":[[65,5]]},"1188":{"position":[[140,6],[206,6],[282,6]]},"1192":{"position":[[77,5]]},"1194":{"position":[[314,5]]},"1207":{"position":[[300,7]]},"1208":{"position":[[173,5],[292,5],[1117,5],[1474,5]]},"1209":{"position":[[269,6]]},"1211":{"position":[[523,7]]},"1214":{"position":[[800,5]]},"1215":{"position":[[557,6]]},"1239":{"position":[[100,7]]},"1246":{"position":[[1374,5]]},"1249":{"position":[[390,6]]},"1292":{"position":[[469,7]]},"1295":{"position":[[676,5]]},"1296":{"position":[[641,6]]},"1299":{"position":[[205,6],[280,5],[355,5]]},"1300":{"position":[[425,6],[660,5],[736,6]]},"1301":{"position":[[213,5]]},"1304":{"position":[[1330,5],[1559,5],[1709,5],[1760,5]]},"1305":{"position":[[162,5],[185,5],[657,5],[945,5]]},"1307":{"position":[[36,5],[216,6],[308,5],[332,5],[791,5]]},"1308":{"position":[[54,5]]},"1309":{"position":[[239,5]]},"1314":{"position":[[100,5],[212,6]]},"1315":{"position":[[528,5],[1313,5]]},"1316":{"position":[[640,6]]},"1318":{"position":[[28,5]]},"1320":{"position":[[576,6]]},"1322":{"position":[[416,5]]}},"keywords":{}}],["write.indexeddb",{"_index":3053,"title":{},"content":{"464":{"position":[[536,15]]}},"keywords":{}}],["write/read",{"_index":3775,"title":{},"content":{"659":{"position":[[302,10]]}},"keywords":{}}],["writebuff",{"_index":6207,"title":{},"content":{"1208":{"position":[[1151,11],[1524,11]]}},"keywords":{}}],["writeev",{"_index":3736,"title":{"649":{"position":[[0,13]]}},"content":{"649":{"position":[[23,12]]}},"keywords":{}}],["writerow",{"_index":5132,"title":{},"content":{"886":{"position":[[2401,11],[2472,10]]}},"keywords":{}}],["writes",{"_index":6209,"title":{},"content":{"1208":{"position":[[1216,9]]}},"keywords":{}}],["writes.it",{"_index":6065,"title":{},"content":{"1143":{"position":[[237,9]]}},"keywords":{}}],["writes/sec",{"_index":2737,"title":{},"content":{"412":{"position":[[10077,10]]}},"keywords":{}}],["writessqlit",{"_index":6479,"title":{},"content":{"1302":{"position":[[66,12]]}},"keywords":{}}],["written",{"_index":483,"title":{},"content":{"29":{"position":[[425,8]]},"34":{"position":[[225,7]]},"39":{"position":[[437,7]]},"41":{"position":[[236,7],[373,7]]},"188":{"position":[[9,7]]},"358":{"position":[[87,7]]},"489":{"position":[[433,7]]},"647":{"position":[[214,7]]},"649":{"position":[[69,7]]},"650":{"position":[[47,7]]},"661":{"position":[[43,7],[124,7]]},"688":{"position":[[1075,7]]},"698":{"position":[[1167,7]]},"711":{"position":[[43,7],[176,7]]},"723":{"position":[[1092,7]]},"759":{"position":[[1407,8]]},"764":{"position":[[325,7]]},"767":{"position":[[188,7]]},"768":{"position":[[151,7]]},"769":{"position":[[162,7]]},"836":{"position":[[45,7],[126,7]]},"875":{"position":[[3774,7]]},"983":{"position":[[282,7],[360,7]]},"984":{"position":[[342,7]]},"987":{"position":[[640,7]]},"1058":{"position":[[176,7]]},"1084":{"position":[[65,7]]},"1119":{"position":[[50,7],[140,7]]},"1192":{"position":[[95,7]]},"1207":{"position":[[725,8]]},"1251":{"position":[[87,7]]},"1297":{"position":[[318,7]]},"1300":{"position":[[271,7]]},"1304":{"position":[[406,7]]}},"keywords":{}}],["wrong",{"_index":487,"title":{},"content":{"29":{"position":[[483,6]]},"143":{"position":[[401,6]]},"291":{"position":[[218,5]]},"458":{"position":[[458,6]]},"521":{"position":[[272,6]]},"697":{"position":[[626,6]]},"700":{"position":[[445,5]]},"702":{"position":[[440,5]]},"749":{"position":[[16667,5]]},"761":{"position":[[85,5]]},"781":{"position":[[72,5]]},"795":{"position":[[131,5]]},"799":{"position":[[512,5]]},"837":{"position":[[623,5]]},"881":{"position":[[25,5],[421,8]]},"966":{"position":[[144,6]]},"1126":{"position":[[308,5]]},"1198":{"position":[[1066,5]]}},"keywords":{}}],["wrote",{"_index":1761,"title":{},"content":{"299":{"position":[[1357,5]]},"786":{"position":[[95,5]]}},"keywords":{}}],["wrtc",{"_index":1370,"title":{},"content":{"210":{"position":[[443,5]]},"261":{"position":[[684,5]]},"904":{"position":[[2824,4],[2889,5]]},"911":{"position":[[766,5]]}},"keywords":{}}],["ws",{"_index":5137,"title":{},"content":{"886":{"position":[[3953,3],[4462,2]]},"894":{"position":[[12,2]]},"911":{"position":[[465,2],[596,5]]}},"keywords":{}}],["ws://example.com/subscript",{"_index":5138,"title":{},"content":{"886":{"position":[[3957,32]]}},"keywords":{}}],["ws://example.com:8080",{"_index":6256,"title":{},"content":{"1219":{"position":[[944,23]]},"1220":{"position":[[507,23]]}},"keywords":{}}],["ws://localhost:1337/socket",{"_index":5180,"title":{},"content":{"893":{"position":[[407,28]]}},"keywords":{}}],["wsoption",{"_index":5147,"title":{},"content":{"886":{"position":[[4691,9],[4863,10]]}},"keywords":{}}],["wss://example.com:8080",{"_index":5276,"title":{},"content":{"911":{"position":[[740,25]]}},"keywords":{}}],["wss://signaling.rxdb.info",{"_index":1369,"title":{},"content":{"210":{"position":[[413,29]]},"261":{"position":[[596,29]]},"904":{"position":[[2762,29]]}},"keywords":{}}],["x",{"_index":1438,"title":{},"content":{"243":{"position":[[1,1],[30,1],[72,1],[111,1],[151,1],[182,1],[211,1],[277,1],[326,1],[367,1],[397,1],[429,1],[461,1],[540,1],[943,1],[978,1],[1010,1]]},"412":{"position":[[13926,1]]},"849":{"position":[[1046,1]]},"854":{"position":[[1338,3]]},"987":{"position":[[185,1],[678,1]]}},"keywords":{}}],["xenova/al",{"_index":2213,"title":{},"content":{"391":{"position":[[392,10],[534,11]]},"402":{"position":[[1894,10]]}},"keywords":{}}],["xenova/multilingu",{"_index":2474,"title":{},"content":{"401":{"position":[[547,19]]}},"keywords":{}}],["xenova/paraphras",{"_index":2453,"title":{},"content":{"401":{"position":[[260,17]]}},"keywords":{}}],["xhr",{"_index":3549,"title":{},"content":{"610":{"position":[[190,3]]}},"keywords":{}}],["xy",{"_index":6577,"title":{"1324":{"position":[[22,3]]}},"content":{},"keywords":{}}],["y",{"_index":2765,"title":{},"content":{"412":{"position":[[13934,1]]}},"keywords":{}}],["yarn",{"_index":1083,"title":{},"content":{"128":{"position":[[127,4]]},"333":{"position":[[36,5]]},"578":{"position":[[65,5]]}},"keywords":{}}],["ye",{"_index":2740,"title":{},"content":{"412":{"position":[[10308,3]]},"703":{"position":[[1281,4]]},"875":{"position":[[3993,4]]},"1324":{"position":[[1,4]]}},"keywords":{}}],["year",{"_index":442,"title":{},"content":{"27":{"position":[[344,4]]},"118":{"position":[[430,5]]},"323":{"position":[[688,5]]},"402":{"position":[[1960,4],[2438,5]]},"408":{"position":[[1476,5],[5599,5]]},"455":{"position":[[305,5]]},"705":{"position":[[30,5]]},"780":{"position":[[151,6]]},"1198":{"position":[[335,6]]}},"keywords":{}}],["yj",{"_index":629,"title":{"40":{"position":[[0,4]]},"686":{"position":[[24,5]]}},"content":{"40":{"position":[[1,3],[288,3],[362,3],[621,3]]},"412":{"position":[[3832,3]]},"686":{"position":[[127,4],[737,3]]}},"keywords":{}}],["york",{"_index":2307,"title":{},"content":{"394":{"position":[[611,4]]}},"keywords":{}}],["you'd",{"_index":2603,"title":{},"content":{"410":{"position":[[1684,5]]},"412":{"position":[[11116,5]]},"906":{"position":[[612,5]]}},"keywords":{}}],["you'll",{"_index":1940,"title":{},"content":{"333":{"position":[[214,6]]},"412":{"position":[[7433,6],[11049,6]]},"836":{"position":[[2448,6]]},"1151":{"position":[[51,6]]},"1178":{"position":[[51,6]]}},"keywords":{}}],["you'r",{"_index":1151,"title":{},"content":{"148":{"position":[[311,6]]},"202":{"position":[[365,6]]},"207":{"position":[[91,6]]},"238":{"position":[[119,6]]},"239":{"position":[[100,6]]},"255":{"position":[[213,6]]},"286":{"position":[[140,6]]},"346":{"position":[[482,6]]},"369":{"position":[[341,6],[997,6]]},"371":{"position":[[120,6]]},"388":{"position":[[395,6]]},"412":{"position":[[9026,6]]},"498":{"position":[[111,6]]},"556":{"position":[[1645,6]]},"602":{"position":[[4,6]]},"1006":{"position":[[9,6]]}},"keywords":{}}],["you'v",{"_index":1321,"title":{},"content":{"205":{"position":[[4,6]]},"263":{"position":[[4,6]]},"555":{"position":[[6,6]]},"884":{"position":[[51,6]]}},"keywords":{}}],["youngest",{"_index":5735,"title":{},"content":{"1056":{"position":[[167,8]]}},"keywords":{}}],["your_appwrite_collection_id",{"_index":4909,"title":{},"content":{"862":{"position":[[1267,30]]}},"keywords":{}}],["your_appwrite_database_id",{"_index":4907,"title":{},"content":{"862":{"position":[[1224,28]]}},"keywords":{}}],["yourself",{"_index":2197,"title":{},"content":{"390":{"position":[[1059,8]]},"459":{"position":[[426,9]]},"462":{"position":[[463,8]]},"566":{"position":[[459,9]]},"851":{"position":[[172,8]]},"1031":{"position":[[159,8]]}},"keywords":{}}],["yourself.fix",{"_index":6176,"title":{},"content":{"1198":{"position":[[2259,12]]}},"keywords":{}}],["youtub",{"_index":2557,"title":{},"content":{"408":{"position":[[3049,7]]}},"keywords":{}}],["you’ll",{"_index":1861,"title":{},"content":{"304":{"position":[[271,6]]},"560":{"position":[[615,6]]}},"keywords":{}}],["you’r",{"_index":1565,"title":{},"content":{"254":{"position":[[81,6]]},"567":{"position":[[4,6]]}},"keywords":{}}],["you’v",{"_index":2050,"title":{},"content":{"357":{"position":[[306,6]]}},"keywords":{}}],["z",{"_index":2766,"title":{"1287":{"position":[[9,1]]},"1291":{"position":[[0,1]]}},"content":{"412":{"position":[[13941,1]]},"863":{"position":[[55,2],[60,2]]},"1287":{"position":[[181,1],[297,1]]},"1291":{"position":[[53,1]]},"1292":{"position":[[373,1],[731,1],[993,1]]}},"keywords":{}}],["z0",{"_index":5320,"title":{},"content":{"935":{"position":[[241,2]]},"1084":{"position":[[351,2],[366,2]]}},"keywords":{}}],["z][[a",{"_index":5849,"title":{},"content":{"1084":{"position":[[342,5]]}},"keywords":{}}],["z][a",{"_index":5319,"title":{},"content":{"935":{"position":[[236,4]]}},"keywords":{}}],["za",{"_index":5848,"title":{},"content":{"1084":{"position":[[339,2],[348,2],[363,2]]}},"keywords":{}}],["zero",{"_index":709,"title":{"474":{"position":[[3,4]]},"629":{"position":[[0,4]]},"630":{"position":[[4,4]]},"631":{"position":[[18,4]]}},"content":{"46":{"position":[[299,4]]},"254":{"position":[[509,4]]},"410":{"position":[[186,4]]},"486":{"position":[[27,4]]},"534":{"position":[[334,4]]},"594":{"position":[[332,4]]},"630":{"position":[[722,4]]},"632":{"position":[[1960,4]]},"640":{"position":[[479,4]]},"641":{"position":[[52,4]]},"643":{"position":[[328,4]]},"644":{"position":[[394,4],[600,4]]},"654":{"position":[[437,5]]},"723":{"position":[[2799,4]]},"780":{"position":[[762,4]]},"1115":{"position":[[308,4]]}},"keywords":{}}],["zerosync",{"_index":609,"title":{},"content":{"38":{"position":[[1103,8]]}},"keywords":{}}],["zh",{"_index":2462,"title":{},"content":{"401":{"position":[[396,2]]}},"keywords":{}}],["zone",{"_index":749,"title":{},"content":{"50":{"position":[[52,5],[269,4]]},"129":{"position":[[572,4]]},"286":{"position":[[353,4]]},"898":{"position":[[1179,4]]}},"keywords":{}}],["zone.j",{"_index":746,"title":{"50":{"position":[[28,8]]},"129":{"position":[[28,8]]}},"content":{"50":{"position":[[167,8]]},"129":{"position":[[318,8],[327,7],[435,8]]}},"keywords":{}}],["zone.js/plugins/zon",{"_index":760,"title":{},"content":{"50":{"position":[[485,21]]},"129":{"position":[[705,21]]}},"keywords":{}}],["zschemaclass",{"_index":6391,"title":{},"content":{"1291":{"position":[[10,12]]}},"keywords":{}}],["zschemaclass.registerformat('email",{"_index":6392,"title":{},"content":{"1291":{"position":[[64,36]]}},"keywords":{}}]],"pipeline":["stemmer"]} \ No newline at end of file diff --git a/docs/markdown-page/index.html b/docs/markdown-page/index.html deleted file mode 100644 index b5b32513e7f..00000000000 --- a/docs/markdown-page/index.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - -Markdown page example | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/meeting-paid-starter/index.html b/docs/meeting-paid-starter/index.html deleted file mode 100644 index 549b041c849..00000000000 --- a/docs/meeting-paid-starter/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -Meeting - RxDB - JavaScript Database | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/meeting-paid/index.html b/docs/meeting-paid/index.html deleted file mode 100644 index b7c007f3a34..00000000000 --- a/docs/meeting-paid/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -Meeting - RxDB - JavaScript Database | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/meeting/index.html b/docs/meeting/index.html deleted file mode 100644 index e49482e5baf..00000000000 --- a/docs/meeting/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -Meeting - RxDB - JavaScript Database | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/middleware.html b/docs/middleware.html deleted file mode 100644 index 77b945479cb..00000000000 --- a/docs/middleware.html +++ /dev/null @@ -1,232 +0,0 @@ - - - - - -Streamlined RxDB Middleware | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Middleware

    -

    RxDB middleware-hooks (also called pre and post hooks) are functions which are passed control during execution of asynchronous functions. -The hooks are specified on RxCollection-level and help to create a clear what-happens-when-structure of your code.

    -

    Hooks can be defined to run parallel or as series one after another. -Hooks can be synchronous or asynchronous when they return a Promise. -To stop the operation at a specific hook, throw an error.

    -

    List

    -

    RxDB supports the following hooks:

    -
      -
    • preInsert
    • -
    • postInsert
    • -
    • preSave
    • -
    • postSave
    • -
    • preRemove
    • -
    • postRemove
    • -
    • postCreate
    • -
    -

    Why is there no validate-hook?

    -

    Different to mongoose, the validation on document-data is running on the field-level for every change to a document. -This means if you set the value lastName of a RxDocument, then the validation will only run on the changed field, not the whole document. -Therefore it is not useful to have validate-hooks when a document is written to the database.

    -

    Use Cases

    -

    Middleware are useful for atomizing model logic and avoiding nested blocks of async code. -Here are some other ideas:

    -
      -
    • complex validation
    • -
    • removing dependent documents
    • -
    • asynchronous defaults
    • -
    • asynchronous tasks that a certain action triggers
    • -
    • triggering custom events
    • -
    • notifications
    • -
    -

    Usage

    -

    All hooks have the plain data as first parameter, and all but preInsert also have the RxDocument-instance as second parameter. If you want to modify the data in the hook, change attributes of the first parameter.

    -

    All hook functions are also this-bind to the RxCollection-instance.

    -

    Insert

    -

    An insert-hook receives the data-object of the new document.

    -

    lifecycle

    -
      -
    • RxCollection.insert is called
    • -
    • preInsert series-hooks
    • -
    • preInsert parallel-hooks
    • -
    • schema validation runs
    • -
    • new document is written to database
    • -
    • postInsert series-hooks
    • -
    • postInsert parallel-hooks
    • -
    • event is emitted to RxDatabase and RxCollection
    • -
    -

    preInsert

    -
    // series
    -myCollection.preInsert(function(plainData){
    -    // set age to 50 before saving
    -    plainData.age = 50;
    -}, false);
    - 
    -// parallel
    -myCollection.preInsert(function(plainData){
    - 
    -}, true);
    - 
    -// async
    -myCollection.preInsert(function(plainData){
    -  return new Promise(res => setTimeout(res, 100));
    -}, false);
    - 
    -// stop the insert-operation
    -myCollection.preInsert(function(plainData){
    -  throw new Error('stop');
    -}, false);
    -

    postInsert

    -
    // series
    -myCollection.postInsert(function(plainData, rxDocument){
    - 
    -}, false);
    - 
    -// parallel
    -myCollection.postInsert(function(plainData, rxDocument){
    - 
    -}, true);
    - 
    -// async
    -myCollection.postInsert(function(plainData, rxDocument){
    -  return new Promise(res => setTimeout(res, 100));
    -}, false);
    -

    Save

    -

    A save-hook receives the document which is saved.

    -

    lifecycle

    -
      -
    • RxDocument.save is called
    • -
    • preSave series-hooks
    • -
    • preSave parallel-hooks
    • -
    • updated document is written to database
    • -
    • postSave series-hooks
    • -
    • postSave parallel-hooks
    • -
    • event is emitted to RxDatabase and RxCollection
    • -
    -

    preSave

    -
    // series
    -myCollection.preSave(function(plainData, rxDocument){
    -    // modify anyField before saving
    -    plainData.anyField = 'anyValue';
    -}, false);
    - 
    -// parallel
    -myCollection.preSave(function(plainData, rxDocument){
    - 
    -}, true);
    - 
    -// async
    -myCollection.preSave(function(plainData, rxDocument){
    -  return new Promise(res => setTimeout(res, 100));
    -}, false);
    - 
    -// stop the save-operation
    -myCollection.preSave(function(plainData, rxDocument){
    -  throw new Error('stop');
    -}, false);
    -

    postSave

    -
    // series
    -myCollection.postSave(function(plainData, rxDocument){
    - 
    -}, false);
    - 
    -// parallel
    -myCollection.postSave(function(plainData, rxDocument){
    - 
    -}, true);
    - 
    -// async
    -myCollection.postSave(function(plainData, rxDocument){
    -  return new Promise(res => setTimeout(res, 100));
    -}, false);
    -

    Remove

    -

    An remove-hook receives the document which is removed.

    -

    lifecycle

    -
      -
    • RxDocument.remove is called
    • -
    • preRemove series-hooks
    • -
    • preRemove parallel-hooks
    • -
    • deleted document is written to database
    • -
    • postRemove series-hooks
    • -
    • postRemove parallel-hooks
    • -
    • event is emitted to RxDatabase and RxCollection
    • -
    -

    preRemove

    -
    // series
    -myCollection.preRemove(function(plainData, rxDocument){
    - 
    -}, false);
    - 
    -// parallel
    -myCollection.preRemove(function(plainData, rxDocument){
    - 
    -}, true);
    - 
    -// async
    -myCollection.preRemove(function(plainData, rxDocument){
    -  return new Promise(res => setTimeout(res, 100));
    -}, false);
    - 
    -// stop the remove-operation
    -myCollection.preRemove(function(plainData, rxDocument){
    -  throw new Error('stop');
    -}, false);
    -

    postRemove

    -
    // series
    -myCollection.postRemove(function(plainData, rxDocument){
    - 
    -}, false);
    - 
    -// parallel
    -myCollection.postRemove(function(plainData, rxDocument){
    - 
    -}, true);
    - 
    -// async
    -myCollection.postRemove(function(plainData, rxDocument){
    -  return new Promise(res => setTimeout(res, 100));
    -}, false);
    -

    postCreate

    -

    This hook is called whenever a RxDocument is constructed. -You can use postCreate to modify every RxDocument-instance of the collection. -This adds a flexible way to add specify behavior to every document. You can also use it to add custom getter/setter to documents. PostCreate-hooks cannot be asynchronous.

    -
    myCollection.postCreate(function(plainData, rxDocument){
    -    Object.defineProperty(rxDocument, 'myField', {
    -        get: () => 'foobar',
    -    });
    -});
    - 
    -const doc = await myCollection.findOne().exec();
    - 
    -console.log(doc.myField);
    -// 'foobar'
    -
    note

    This hook does not run on already created or cached documents. Make sure to add postCreate-hooks before interacting with the collection.

    - - \ No newline at end of file diff --git a/docs/middleware.md b/docs/middleware.md deleted file mode 100644 index 6fdc25c6d36..00000000000 --- a/docs/middleware.md +++ /dev/null @@ -1,232 +0,0 @@ -# Streamlined RxDB Middleware - -> Enhance your RxDB workflow with pre and post hooks. Quickly add custom validations, triggers, and events to streamline your asynchronous operations. - -# Middleware -RxDB middleware-hooks (also called pre and post hooks) are functions which are passed control during execution of asynchronous functions. -The hooks are specified on RxCollection-level and help to create a clear what-happens-when-structure of your code. - -Hooks can be defined to run **parallel** or as **series** one after another. -Hooks can be **synchronous** or **asynchronous** when they return a `Promise`. -To stop the operation at a specific hook, throw an error. - -## List -RxDB supports the following hooks: -- preInsert -- postInsert -- preSave -- postSave -- preRemove -- postRemove -- postCreate - -### Why is there no validate-hook? -Different to mongoose, the validation on document-data is running on the field-level for every change to a document. -This means if you set the value ```lastName``` of a RxDocument, then the validation will only run on the changed field, not the whole document. -Therefore it is not useful to have validate-hooks when a document is written to the database. - -## Use Cases -Middleware are useful for atomizing model logic and avoiding nested blocks of async code. -Here are some other ideas: - -- complex validation -- removing dependent documents -- asynchronous defaults -- asynchronous tasks that a certain action triggers -- triggering custom events -- notifications - -## Usage -All hooks have the plain data as first parameter, and all but `preInsert` also have the `RxDocument`-instance as second parameter. If you want to modify the data in the hook, change attributes of the first parameter. - -All hook functions are also `this`-bind to the `RxCollection`-instance. - -### Insert -An insert-hook receives the data-object of the new document. - -#### lifecycle -- RxCollection.insert is called -- preInsert series-hooks -- preInsert parallel-hooks -- schema validation runs -- new document is written to database -- postInsert series-hooks -- postInsert parallel-hooks -- event is emitted to RxDatabase and RxCollection - -#### preInsert - -```js -// series -myCollection.preInsert(function(plainData){ - // set age to 50 before saving - plainData.age = 50; -}, false); - -// parallel -myCollection.preInsert(function(plainData){ - -}, true); - -// async -myCollection.preInsert(function(plainData){ - return new Promise(res => setTimeout(res, 100)); -}, false); - -// stop the insert-operation -myCollection.preInsert(function(plainData){ - throw new Error('stop'); -}, false); -``` - -#### postInsert - -```js -// series -myCollection.postInsert(function(plainData, rxDocument){ - -}, false); - -// parallel -myCollection.postInsert(function(plainData, rxDocument){ - -}, true); - -// async -myCollection.postInsert(function(plainData, rxDocument){ - return new Promise(res => setTimeout(res, 100)); -}, false); -``` - -### Save -A save-hook receives the document which is saved. - -#### lifecycle -- RxDocument.save is called -- preSave series-hooks -- preSave parallel-hooks -- updated document is written to database -- postSave series-hooks -- postSave parallel-hooks -- event is emitted to RxDatabase and RxCollection - -#### preSave - -```js -// series -myCollection.preSave(function(plainData, rxDocument){ - // modify anyField before saving - plainData.anyField = 'anyValue'; -}, false); - -// parallel -myCollection.preSave(function(plainData, rxDocument){ - -}, true); - -// async -myCollection.preSave(function(plainData, rxDocument){ - return new Promise(res => setTimeout(res, 100)); -}, false); - -// stop the save-operation -myCollection.preSave(function(plainData, rxDocument){ - throw new Error('stop'); -}, false); -``` - -#### postSave - -```js -// series -myCollection.postSave(function(plainData, rxDocument){ - -}, false); - -// parallel -myCollection.postSave(function(plainData, rxDocument){ - -}, true); - -// async -myCollection.postSave(function(plainData, rxDocument){ - return new Promise(res => setTimeout(res, 100)); -}, false); -``` - -### Remove -An remove-hook receives the document which is removed. - -#### lifecycle -- RxDocument.remove is called -- preRemove series-hooks -- preRemove parallel-hooks -- deleted document is written to database -- postRemove series-hooks -- postRemove parallel-hooks -- event is emitted to RxDatabase and RxCollection - -#### preRemove - -```js -// series -myCollection.preRemove(function(plainData, rxDocument){ - -}, false); - -// parallel -myCollection.preRemove(function(plainData, rxDocument){ - -}, true); - -// async -myCollection.preRemove(function(plainData, rxDocument){ - return new Promise(res => setTimeout(res, 100)); -}, false); - -// stop the remove-operation -myCollection.preRemove(function(plainData, rxDocument){ - throw new Error('stop'); -}, false); -``` - -#### postRemove - -```js -// series -myCollection.postRemove(function(plainData, rxDocument){ - -}, false); - -// parallel -myCollection.postRemove(function(plainData, rxDocument){ - -}, true); - -// async -myCollection.postRemove(function(plainData, rxDocument){ - return new Promise(res => setTimeout(res, 100)); -}, false); -``` - -### postCreate -This hook is called whenever a `RxDocument` is constructed. -You can use `postCreate` to modify every RxDocument-instance of the collection. -This adds a flexible way to add specify behavior to every document. You can also use it to add custom getter/setter to documents. PostCreate-hooks cannot be **asynchronous**. - -```js -myCollection.postCreate(function(plainData, rxDocument){ - Object.defineProperty(rxDocument, 'myField', { - get: () => 'foobar', - }); -}); - -const doc = await myCollection.findOne().exec(); - -console.log(doc.myField); -// 'foobar' -``` - -:::note -This hook does not run on already created or cached documents. Make sure to add `postCreate`-hooks before interacting with the collection. -::: diff --git a/docs/migration-schema.html b/docs/migration-schema.html deleted file mode 100644 index 743324e16f4..00000000000 --- a/docs/migration-schema.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - -Seamless Schema Data Migration with RxDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Migrate Database Data on schema changes

    -

    The RxDB Data Migration Plugin helps developers easily update stored data in their apps when they make changes to the data structure by changing the schema of a RxCollection. This is useful when developers release a new version of the app with a different schema.

    -

    Imagine you have your awesome messenger-app distributed to many users. After a while, you decide that in your new version, you want to change the schema of the messages-collection. Instead of saving the message-date like 2017-02-12T23:03:05+00:00 you want to have the unix-timestamp like 1486940585 to make it easier to compare dates. To accomplish this, you change the schema and increase the version-number and you also change your code where you save the incoming messages. But one problem remains: what happens with the messages which are already stored in the database on the user's device in the old schema?

    -

    With RxDB you can provide migrationStrategies for your collections that automatically (or on call) transform your existing data from older to newer schemas. This assures that the client's data always matches your newest code-version.

    -

    Add the migration plugin

    -

    To enable the data migration, you have to add the migration-schema plugin.

    -
    import { addRxPlugin } from 'rxdb';
    -import { RxDBMigrationSchemaPlugin } from 'rxdb/plugins/migration-schema';
    -addRxPlugin(RxDBMigrationSchemaPlugin);
    -

    Providing strategies

    -

    Upon creation of a collection, you have to provide migrationStrategies when your schema's version-number is greater than 0. To do this, you have to add an object to the migrationStrategies property where a function for every schema-version is assigned. A migrationStrategy is a function which gets the old document-data as a parameter and returns the new, transformed document-data. If the strategy returns null, the document will be removed instead of migrated.

    -
    myDatabase.addCollections({
    -  messages: {
    -    schema: messageSchemaV1,
    -    migrationStrategies: {
    -      // 1 means, this transforms data from version 0 to version 1
    -      1: function(oldDoc){
    -        oldDoc.time = new Date(oldDoc.time).getTime(); // string to unix
    -        return oldDoc;
    -      }
    -    }
    -  }
    -});
    -

    Asynchronous strategies can also be used:

    -
    myDatabase.addCollections({
    -  messages: {
    -    schema: messageSchemaV1,
    -    migrationStrategies: {
    -      1: function(oldDoc){
    -        oldDoc.time = new Date(oldDoc.time).getTime(); // string to unix
    -        return oldDoc;
    -      },
    -      /**
    -       * 2 means, this transforms data from version 1 to version 2
    -       * this returns a promise which resolves with the new document-data
    -       */
    -      2: function(oldDoc){
    -        // in the new schema (version: 2) we defined 'senderCountry' as required field (string)
    -        // so we must get the country of the message-sender from the server
    -        const coordinates = oldDoc.coordinates;
    -        return fetch('http://myserver.com/api/countryByCoordinates/'+coordinates+'/')
    -          .then(response => {
    -            const response = response.json();
    -            oldDoc.senderCountry = response;
    -            return oldDoc;
    -          });
    -      }
    -    }
    -  }
    -});
    -

    you can also filter which documents should be migrated:

    -
    myDatabase.addCollections({
    -  messages: {
    -    schema: messageSchemaV1,
    -    migrationStrategies: {
    -      // 1 means, this transforms data from version 0 to version 1
    -      1: function(oldDoc){
    -        oldDoc.time = new Date(oldDoc.time).getTime(); // string to unix
    -        return oldDoc;
    -      },
    -      /**
    -       * this removes all documents older then 2017-02-12
    -       * they will not appear in the new collection
    -       */
    -      2: function(oldDoc){
    -        if(oldDoc.time < 1486940585) return null;
    -        else return oldDoc;
    -      }
    -    }
    -  }
    -});
    -

    autoMigrate

    -

    By default, the migration automatically happens when the collection is created. Calling RxDatabase.addCollections() returns only when the migration has finished. -If you have lots of data or the migrationStrategies take a long time, it might be better to start the migration 'by hand' and show the migration-state to the user as a loading-bar.

    -
    const messageCol = await myDatabase.addCollections({
    -  messages: {
    -    schema: messageSchemaV1,
    -    autoMigrate: false, // <- migration will not run at creation
    -    migrationStrategies: {
    -      1: async function(oldDoc){
    -        ...
    -        anything that takes very long
    -        ...
    -        return oldDoc;
    -      }
    -    }
    -  }
    -});
    - 
    -// check if migration is needed
    -const needed = await messageCol.migrationNeeded();
    -if(needed === false) {
    -  return;
    -}
    - 
    -// start the migration
    -messageCol.startMigration(10); // 10 is the batch-size, how many docs will run at parallel
    - 
    -const migrationState = messageCol.getMigrationState();
    - 
    -// 'start' the observable
    -migrationState.$.subscribe({
    -    next: state => console.dir(state),
    -    error: error => console.error(error),
    -    complete: () => console.log('done')
    -});
    - 
    -// the emitted states look like this:
    -{
    -    status: 'RUNNING' // oneOf 'RUNNING' | 'DONE' | 'ERROR'
    -    count: {
    -      total: 50,   // amount of documents which must be migrated
    -      handled: 0,  // amount of handled docs
    -      percent: 0   // percentage [0-100]
    -    }
    -}
    -

    If you don't want to show the state to the user, you can also use .migratePromise():

    -
    const migrationPromise = messageCol.migratePromise(10);
    -await migratePromise;
    -

    migrationStates()

    -

    RxDatabase.migrationStates() returns an Observable that emits all migration states of any collection of the database. -Use this when you add collections dynamically and want to show a loading-state of the migrations to the user.

    -
    const allStatesObservable = myDatabase.migrationStates();
    -allStatesObservable.subscribe(allStates => {
    -  allStates.forEach(migrationState => {
    -    console.log(
    -      'migration state of ' +
    -      migrationState.collection.name
    -    );
    -  });
    -});
    -

    Migrating attachments

    -

    When you store RxAttachments together with your document, they can also be changed, added or removed while running the migration. -You can do this by mutating the oldDoc._attachments property.

    -
    import { createBlob } from 'rxdb';
    -const migrationStrategies = {
    -      1: async function(oldDoc){
    -        // do nothing with _attachments to keep all attachments and have them in the new collection version.
    -        return oldDoc;
    -      },
    -      2: async function(oldDoc){
    -        // set _attachments to an empty object to delete all existing ones during the migration.
    -        oldDoc._attachments = {};
    -        return oldDoc;
    -      }
    -      3: async function(oldDoc){
    -        // update the data field of a single attachment to change its data. 
    -        oldDoc._attachments.myFile.data = await createBlob(
    -          'my new text',
    -          oldDoc._attachments.myFile.content_type
    -        );
    -        return oldDoc;
    -      }
    -}
    -

    Migration on multi-tab in browsers

    -

    If you use RxDB in a multiInstance environment, like a browser, it will ensure that exactly one tab is running a migration of a collection. -Also the migrationState.$ events are emitted between browser tabs.

    -

    Migration and Replication

    -

    If you use any of the RxReplication plugins, the migration will also run on the internal replication-state storage. It will migrate all assumedMasterState documents -so that after the migration is done, you do not have to re-run the replication from scratch. -RxDB assumes that you run the exact same migration on the servers and the clients. Notice that the replication pull-checkpoint will not be migrated. Your backend must be compatible with pull-checkpoints of older versions.

    -

    Migration should be run on all database instances

    -

    If you have multiple database instances (for example, if you are running replication inside of a Worker or SharedWorker and have created a database instance inside of the worker), schema migration should be started on all database instances. All instances must know about all migration strategies and any updated schema versions.

    - - \ No newline at end of file diff --git a/docs/migration-schema.md b/docs/migration-schema.md deleted file mode 100644 index 442a6ae5e62..00000000000 --- a/docs/migration-schema.md +++ /dev/null @@ -1,213 +0,0 @@ -# Seamless Schema Data Migration with RxDB - -> Upgrade your RxDB collections without losing data. Learn how to seamlessly migrate schema changes and keep your apps running smoothly. - -# Migrate Database Data on schema changes - -The RxDB Data Migration Plugin helps developers easily update stored data in their apps when they make changes to the data structure by changing the schema of a [RxCollection](./rx-collection.md). This is useful when developers release a new version of the app with a different schema. - -Imagine you have your awesome messenger-app distributed to many users. After a while, you decide that in your new version, you want to change the schema of the messages-collection. Instead of saving the message-date like `2017-02-12T23:03:05+00:00` you want to have the unix-timestamp like `1486940585` to make it easier to compare dates. To accomplish this, you change the schema and **increase the version-number** and you also change your code where you save the incoming messages. But one problem remains: what happens with the messages which are already stored in the database on the user's device in the old schema? - -With RxDB you can provide migrationStrategies for your collections that automatically (or on call) transform your existing data from older to newer schemas. This assures that the client's data always matches your newest code-version. - -# Add the migration plugin - -To enable the data migration, you have to add the `migration-schema` plugin. - -```ts -import { addRxPlugin } from 'rxdb'; -import { RxDBMigrationSchemaPlugin } from 'rxdb/plugins/migration-schema'; -addRxPlugin(RxDBMigrationSchemaPlugin); -``` - -## Providing strategies - -Upon creation of a collection, you have to provide migrationStrategies when your schema's version-number is greater than `0`. To do this, you have to add an object to the `migrationStrategies` property where a function for every schema-version is assigned. A migrationStrategy is a function which gets the old document-data as a parameter and returns the new, transformed document-data. If the strategy returns `null`, the document will be removed instead of migrated. - -```javascript -myDatabase.addCollections({ - messages: { - schema: messageSchemaV1, - migrationStrategies: { - // 1 means, this transforms data from version 0 to version 1 - 1: function(oldDoc){ - oldDoc.time = new Date(oldDoc.time).getTime(); // string to unix - return oldDoc; - } - } - } -}); -``` - -Asynchronous strategies can also be used: - -```javascript -myDatabase.addCollections({ - messages: { - schema: messageSchemaV1, - migrationStrategies: { - 1: function(oldDoc){ - oldDoc.time = new Date(oldDoc.time).getTime(); // string to unix - return oldDoc; - }, - /** - * 2 means, this transforms data from version 1 to version 2 - * this returns a promise which resolves with the new document-data - */ - 2: function(oldDoc){ - // in the new schema (version: 2) we defined 'senderCountry' as required field (string) - // so we must get the country of the message-sender from the server - const coordinates = oldDoc.coordinates; - return fetch('http://myserver.com/api/countryByCoordinates/'+coordinates+'/') - .then(response => { - const response = response.json(); - oldDoc.senderCountry = response; - return oldDoc; - }); - } - } - } -}); -``` - -you can also filter which documents should be migrated: - -```js -myDatabase.addCollections({ - messages: { - schema: messageSchemaV1, - migrationStrategies: { - // 1 means, this transforms data from version 0 to version 1 - 1: function(oldDoc){ - oldDoc.time = new Date(oldDoc.time).getTime(); // string to unix - return oldDoc; - }, - /** - * this removes all documents older then 2017-02-12 - * they will not appear in the new collection - */ - 2: function(oldDoc){ - if(oldDoc.time < 1486940585) return null; - else return oldDoc; - } - } - } -}); -``` - -## autoMigrate - -By default, the migration automatically happens when the collection is created. Calling `RxDatabase.addCollections()` returns only when the migration has finished. -If you have lots of data or the migrationStrategies take a long time, it might be better to start the migration 'by hand' and show the migration-state to the user as a loading-bar. - -```javascript -const messageCol = await myDatabase.addCollections({ - messages: { - schema: messageSchemaV1, - autoMigrate: false, // <- migration will not run at creation - migrationStrategies: { - 1: async function(oldDoc){ - ... - anything that takes very long - ... - return oldDoc; - } - } - } -}); - -// check if migration is needed -const needed = await messageCol.migrationNeeded(); -if(needed === false) { - return; -} - -// start the migration -messageCol.startMigration(10); // 10 is the batch-size, how many docs will run at parallel - -const migrationState = messageCol.getMigrationState(); - -// 'start' the observable -migrationState.$.subscribe({ - next: state => console.dir(state), - error: error => console.error(error), - complete: () => console.log('done') -}); - -// the emitted states look like this: -{ - status: 'RUNNING' // oneOf 'RUNNING' | 'DONE' | 'ERROR' - count: { - total: 50, // amount of documents which must be migrated - handled: 0, // amount of handled docs - percent: 0 // percentage [0-100] - } -} -``` - -If you don't want to show the state to the user, you can also use `.migratePromise()`: - -```js -const migrationPromise = messageCol.migratePromise(10); -await migratePromise; -``` - -## migrationStates() - -`RxDatabase.migrationStates()` returns an `Observable` that emits all migration states of any collection of the database. -Use this when you add collections dynamically and want to show a loading-state of the migrations to the user. - -```js -const allStatesObservable = myDatabase.migrationStates(); -allStatesObservable.subscribe(allStates => { - allStates.forEach(migrationState => { - console.log( - 'migration state of ' + - migrationState.collection.name - ); - }); -}); -``` - -## Migrating attachments - -When you store `RxAttachment`s together with your document, they can also be changed, added or removed while running the migration. -You can do this by mutating the `oldDoc._attachments` property. - -```js -import { createBlob } from 'rxdb'; -const migrationStrategies = { - 1: async function(oldDoc){ - // do nothing with _attachments to keep all attachments and have them in the new collection version. - return oldDoc; - }, - 2: async function(oldDoc){ - // set _attachments to an empty object to delete all existing ones during the migration. - oldDoc._attachments = {}; - return oldDoc; - } - 3: async function(oldDoc){ - // update the data field of a single attachment to change its data. - oldDoc._attachments.myFile.data = await createBlob( - 'my new text', - oldDoc._attachments.myFile.content_type - ); - return oldDoc; - } -} -``` - -## Migration on multi-tab in browsers - -If you use RxDB in a multiInstance environment, like a browser, it will ensure that exactly one tab is running a migration of a collection. -Also the `migrationState.$` events are emitted between browser tabs. - -## Migration and Replication - -If you use any of the [RxReplication](./replication.md) plugins, the migration will also run on the internal replication-state storage. It will migrate all `assumedMasterState` documents -so that after the migration is done, you do not have to re-run the replication from scratch. -RxDB assumes that you run the exact same migration on the servers and the clients. Notice that the replication `pull-checkpoint` will not be migrated. Your backend must be compatible with pull-checkpoints of older versions. - -## Migration should be run on all database instances - -If you have multiple database instances (for example, if you are running replication inside of a [Worker](./rx-storage-worker.md) or [SharedWorker](./rx-storage-shared-worker.md) and have created a database instance inside of the worker), schema migration should be started on all database instances. All instances must know about all migration strategies and any updated schema versions. diff --git a/docs/migration-storage.html b/docs/migration-storage.html deleted file mode 100644 index 15f7a5c6bc9..00000000000 --- a/docs/migration-storage.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - -Migration Storage | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Storage Migration

    -

    The storage migration plugin can be used to migrate all data from one existing RxStorage into another. This is useful when:

    -
      -
    • You want to migrate from one RxStorage to another one.
    • -
    • You want to migrate to a new major RxDB version while keeping the previous saved data. This function only works from the previous major version upwards. Do not use it to migrate like rxdb v9 to v14.
    • -
    -

    The storage migration drops deleted documents and filters them out during the migration.

    -
    Do never change the schema while doing a storage migration

    When you migrate between storages, you might want to change the schema in the same process. You should never do that because it will lead to problems afterwards and might make your database unusable.

    When you also want to change your schema, first run the storage migration and afterwards run a normal schema migration.

    -

    Usage

    -

    Lets say you want to migrate from LocalStorage RxStorage to the IndexedDB RxStorage.

    -
    import { migrateStorage } from 'rxdb/plugins/migration-storage';
    -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb';
    -import { getRxStorageLocalstorage } from 'rxdb-old/plugins/storage-localstorage';
    - 
    -// create the new RxDatabase
    -const db = await createRxDatabase({
    -    name: dbLocation,
    -    storage: getRxStorageIndexedDB(),
    -    multiInstance: false
    -});
    - 
    -await migrateStorage({
    -    database: db as any,
    -    /**
    -     * Name of the old database,
    -     * using the storage migration requires that the
    -     * new database has a different name.
    -     */
    -    oldDatabaseName: 'myOldDatabaseName',
    -    oldStorage: getRxStorageLocalstorage(), // RxStorage of the old database
    -    batchSize: 500, // batch size
    -    parallel: false, // <- true if it should migrate all collections in parallel. False (default) if should migrate in serial
    -    afterMigrateBatch: (input: AfterMigrateBatchHandlerInput) => {
    -        console.log('storage migration: batch processed');
    -    }
    -});
    -
    note

    Only collections that exist in the new database at the time you call migrateStorage() will have their data migrated.

      -
    • If your old database had collections ['users', 'posts', 'comments'] but your new database only defines ['users', 'posts'], then only users and posts data will be migrated.
    • -
    • Any collections missing from the new database will simply be skipped - no data for them will be read or written.
    • -

    This allows you to selectively migrate only certain collections if desired, by choosing which collections to define before invoking migrateStorage().

    -

    Migrate from a previous RxDB major version

    -

    To migrate from a previous RxDB major version, you have to install the 'old' RxDB in the package.json

    -
    {
    -    "dependencies": {
    -        "rxdb-old": "npm:rxdb@14.17.1",
    -    }
    -}
    -

    Then you can run the migration by providing the old storage:

    -
    /* ... */
    -import { migrateStorage } from 'rxdb/plugins/migration-storage';
    -import { getRxStorageLocalstorage } from 'rxdb-old/plugins/storage-localstorage'; // <- import from the old RxDB version
    - 
    -await migrateStorage({
    -    database: db as any,
    -    /**
    -     * Name of the old database,
    -     * using the storage migration requires that the
    -     * new database has a different name.
    -     */
    -    oldDatabaseName: 'myOldDatabaseName',
    -    oldStorage: getRxStorageLocalstorage(), // RxStorage of the old database
    -    batchSize: 500, // batch size
    -    parallel: false,
    -    afterMigrateBatch: (input: AfterMigrateBatchHandlerInput) => {
    -        console.log('storage migration: batch processed');
    -    }
    -});
    -/* ... */
    -

    Disable Version Check on RxDB Premium 👑

    -

    RxDB Premium has a check in place that ensures that you do not accidentally use the wrong RxDB core and 👑 Premium version together which could break your database state. -This can be a problem during migrations where you have multiple versions of RxDB in use and it will throw the error Version mismatch detected. -You can disable that check by importing and running the disableVersionCheck() function from RxDB Premium.

    -
    // RxDB Premium v15 or newer:
    -import {
    -    disableVersionCheck
    -} from 'rxdb-premium-old/plugins/shared';
    -disableVersionCheck();
    - 
    - 
    -// RxDB Premium v14:
    - 
    -// for esm
    -import {
    -    disableVersionCheck
    -} from 'rxdb-premium-old/dist/es/shared/version-check.js';
    -disableVersionCheck();
    - 
    -// for cjs
    -import {
    -    disableVersionCheck
    -} from 'rxdb-premium-old/dist/lib/shared/version-check.js';
    -disableVersionCheck();
    - - \ No newline at end of file diff --git a/docs/migration-storage.md b/docs/migration-storage.md deleted file mode 100644 index cc4b2806abe..00000000000 --- a/docs/migration-storage.md +++ /dev/null @@ -1,127 +0,0 @@ -# Migration Storage - -> Effortlessly migrate your data between storages in RxDB using the Storage Migration plugin. Retain your documents when switching storages or major versions. - -# Storage Migration - -The storage migration plugin can be used to migrate all data from one existing RxStorage into another. This is useful when: - -- You want to migrate from one [RxStorage](./rx-storage.md) to another one. -- You want to migrate to a new major RxDB version while keeping the previous saved data. This function only works from the previous major version upwards. Do not use it to migrate like rxdb v9 to v14. - - -The storage migration **drops deleted documents** and filters them out during the migration. - -:::warning Do never change the schema while doing a storage migration - -When you migrate between storages, you might want to change the schema in the same process. You should never do that because it will lead to problems afterwards and might make your database unusable. - -When you also want to change your schema, first run the storage migration and afterwards run a normal [schema migration](./migration-schema.md). -::: - -## Usage - -Lets say you want to migrate from [LocalStorage RxStorage](./rx-storage-localstorage.md) to the [IndexedDB RxStorage](./rx-storage-indexeddb.md). - -```ts -import { migrateStorage } from 'rxdb/plugins/migration-storage'; -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; -import { getRxStorageLocalstorage } from 'rxdb-old/plugins/storage-localstorage'; - -// create the new RxDatabase -const db = await createRxDatabase({ - name: dbLocation, - storage: getRxStorageIndexedDB(), - multiInstance: false -}); - -await migrateStorage({ - database: db as any, - /** - * Name of the old database, - * using the storage migration requires that the - * new database has a different name. - */ - oldDatabaseName: 'myOldDatabaseName', - oldStorage: getRxStorageLocalstorage(), // RxStorage of the old database - batchSize: 500, // batch size - parallel: false, // <- true if it should migrate all collections in parallel. False (default) if should migrate in serial - afterMigrateBatch: (input: AfterMigrateBatchHandlerInput) => { - console.log('storage migration: batch processed'); - } -}); -``` - -:::note -Only collections that exist in the new database at the time you call migrateStorage() will have their data migrated. - -- If your old database had collections `['users', 'posts', 'comments']` but your new database only defines `['users', 'posts']`, then only users and posts data will be migrated. -- Any collections missing from the new database will simply be skipped - no data for them will be read or written. - -This allows you to selectively migrate only certain collections if desired, by choosing which collections to define before invoking `migrateStorage()`. -::: - -## Migrate from a previous RxDB major version - -To migrate from a previous RxDB major version, you have to install the 'old' RxDB in the `package.json` - -```json -{ - "dependencies": { - "rxdb-old": "npm:rxdb@14.17.1", - } -} -``` - -Then you can run the migration by providing the old storage: - -```ts -/* ... */ -import { migrateStorage } from 'rxdb/plugins/migration-storage'; -import { getRxStorageLocalstorage } from 'rxdb-old/plugins/storage-localstorage'; // <- import from the old RxDB version - -await migrateStorage({ - database: db as any, - /** - * Name of the old database, - * using the storage migration requires that the - * new database has a different name. - */ - oldDatabaseName: 'myOldDatabaseName', - oldStorage: getRxStorageLocalstorage(), // RxStorage of the old database - batchSize: 500, // batch size - parallel: false, - afterMigrateBatch: (input: AfterMigrateBatchHandlerInput) => { - console.log('storage migration: batch processed'); - } -}); -/* ... */ -``` - -## Disable Version Check on [RxDB Premium 👑](/premium/) - -RxDB Premium has a check in place that ensures that you do not accidentally use the wrong RxDB core and 👑 Premium version together which could break your database state. -This can be a problem during migrations where you have multiple versions of RxDB in use and it will throw the error `Version mismatch detected`. -You can disable that check by importing and running the `disableVersionCheck()` function from RxDB Premium. - -```ts -// RxDB Premium v15 or newer: -import { - disableVersionCheck -} from 'rxdb-premium-old/plugins/shared'; -disableVersionCheck(); - -// RxDB Premium v14: - -// for esm -import { - disableVersionCheck -} from 'rxdb-premium-old/dist/es/shared/version-check.js'; -disableVersionCheck(); - -// for cjs -import { - disableVersionCheck -} from 'rxdb-premium-old/dist/lib/shared/version-check.js'; -disableVersionCheck(); -``` diff --git a/docs/newsletter/index.html b/docs/newsletter/index.html deleted file mode 100644 index e2c3f2ed319..00000000000 --- a/docs/newsletter/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -Newsletter - RxDB - JavaScript Database | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/nodejs-database.html b/docs/nodejs-database.html deleted file mode 100644 index 2a899b9f434..00000000000 --- a/docs/nodejs-database.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - -RxDB - The Real-Time Database for Node.js | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Node.js Database

    -

    RxDB is a fast, reactive realtime NoSQL database made for JavaScript applications like Websites, hybrid Apps, Electron-Apps, Progressive Web Apps and Node.js. While RxDB was initially created to be used with UI applications, it has been matured and optimized to make it useful for pure server-side use cases. It can be used as embedded, local database inside of the Node.js JavaScript process, or it can be used similar to a database server that Node.js can connect to. The RxStorage layer makes it possible to switch out the underlying storage engine which makes RxDB a very flexible database that can be optimized for many scenarios.

    -

    Node.js

    -

    Persistent Database

    -

    To get a "normal" database connection where the data is persisted to a file system, the RxDB real time database provides multiple storage implementations that work in Node.js.

    -

    The FoundationDB storage connects to a FoundationDB cluster which itself is just a distributed key-value engine. RxDB adds the NoSQL query-engine, indexes and other features on top of it. -It scales horizontally because you can always add more servers to the FoundationDB cluster to increase the capacity. -Setting up a RxDB database is pretty simple. You import the FoundationDB RxStorage and tell RxDB to use that when calling createRxDatabase:

    -
    import { createRxDatabase } from 'rxdb';
    -import { getRxStorageFoundationDB } from 'rxdb/plugins/storage-foundationdb';
    - 
    -const db = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageFoundationDB({
    -        apiVersion: 620,
    -        clusterFile: '/path/to/fdb.cluster'
    -    })
    -});
    - 
    -// add a collection
    -await db.addCollections({
    -    users: {
    -        schema: mySchema
    -    }
    -});
    - 
    -// run a query
    -const result = await db.users.find({
    -    selector: {
    -        name: 'foobar'
    -    }
    -}).exec();
    - 
    -

    Another alternative storage is the SQLite RxStorage that stores the data inside of a SQLite filebased database. The SQLite storage is faster than FoundationDB and does not require to set up a cluster or anything because SQLite directly stores and reads the data inside of the filesystem. The downside of that is that it only scales vertically.

    -
    import { createRxDatabase } from 'rxdb';
    -import {
    -    getRxStorageSQLite,
    -    getSQLiteBasicsNode
    -} from 'rxdb-premium/plugins/storage-sqlite';
    -import sqlite3 from 'sqlite3';
    -const myRxDatabase = await createRxDatabase({
    -    name: 'path/to/database/file/foobar.db',
    -    storage: getRxStorageSQLite({
    -        sqliteBasics: getSQLiteBasicsNode(sqlite3)
    -    })
    -});
    -

    Because the SQLite RxStorage is not free and you might not want to set up a FoundationDB cluster, there is also the option to use the LokiJS RxStorage together with the filesystem adapter. This will store the data as plain json in a file and load everything into memory on startup. This works great for small prototypes but it is not recommended to be used in production.

    -
    import { createRxDatabase } from 'rxdb';
    -const LokiFsStructuredAdapter = require('lokijs/src/loki-fs-structured-adapter.js');
    -import { getRxStorageLoki } from 'rxdb/plugins/storage-lokijs';
    -import sqlite3 from 'sqlite3';
    -const myRxDatabase = await createRxDatabase({
    -    name: 'path/to/database/file/foobar.db',
    -    storage: getRxStorageLoki({
    -        adapter: new LokiFsStructuredAdapter()
    -    })
    -});
    -

    Here is a performance comparison chart of the different storages (lower is better):

    -

    database performance - Node.js

    -

    RxDB as Node.js In-Memory Database

    -

    One of the easiest way to use RxDB in Node.js is to use the Memory RxStorage. As the name implies, it stores the data directly in-memory of the Node.js JavaScript process. This makes it really fast to read and write data but of course the data is not persisted and will be lost when the nodejs process exits. Often the in-memory option is used when RxDB is used in unit tests because it automatically cleans up everything afterwards.

    -
    import { createRxDatabase } from 'rxdb';
    -import { getRxStorageMemory } from 'rxdb/plugins/storage-memory';
    - 
    -const db = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageMemory()
    -});
    -

    Also notice that the default memory limit of Node.js is 4gb (might change of newer versions) so for bigger datasets you might want to increase the limit with the max-old-space-size flag:

    -
    # increase the Node.js memory limit to 8GB
    -node --max-old-space-size=8192 index.js
    -

    Hybrid In-memory-persistence-synced storage

    -

    If you want to have the performance of an in-memory database but require persistency of the data, you can use the memory-mapped storage. On database creation it will load all data into the memory and on writes it will first write the data into memory and later also write it to the persistent storage in the background. In the following example the FoundationDB storage is used, but any other RxStorage can be used as persistence layer.

    -
    import { createRxDatabase } from 'rxdb';
    -import { getRxStorageFoundationDB } from 'rxdb/plugins/storage-foundationdb';
    -import { getMemoryMappedRxStorage } from 'rxdb-premium/plugins/storage-memory-mapped';
    - 
    -const db = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getMemoryMappedRxStorage({
    -        storage: getRxStorageFoundationDB({
    -            apiVersion: 620,
    -            clusterFile: '/path/to/fdb.cluster'
    -        })
    -    })
    -});
    -

    While this approach gives you a database with great performance and persistent, it has two major downsides:

    -
      -
    • The database size is limited to the memory size
    • -
    • Writes can be lost when the Node.js process exists between a write to the memory state and the background persisting.
    • -
    -

    Share database between microservices with RxDB

    -

    Using a local, embedded database in Node.js works great until you have to share the data with another Node.js process or another server at all. -To share the database state with other instances, RxDB provides two different methods. One is replication and the other is the remote RxStorage. -The replication copies over the whole database set to other instances live-replicates all ongoing writes. This has the benefit of scaling better because each of your microservice will run queries on its own copy of the dataset. -Sometimes however you might not want to store the full dataset on each microservice. Then it is better to use the remote RxStorage and connect it to the "main" database. The remote storage will run all operations the main database and return the result to the calling database.

    -

    Follow up on RxDB+Node.js

    -
    - - \ No newline at end of file diff --git a/docs/nodejs-database.md b/docs/nodejs-database.md deleted file mode 100644 index fd69f9ee4e0..00000000000 --- a/docs/nodejs-database.md +++ /dev/null @@ -1,140 +0,0 @@ -# RxDB - The Real-Time Database for Node.js - -> Discover how RxDB brings flexible, reactive NoSQL to Node.js. Scale effortlessly, persist data, and power your server-side apps with ease. - -# Node.js Database - -[RxDB](https://rxdb.info) is a fast, reactive realtime NoSQL **database** made for **JavaScript** applications like Websites, hybrid Apps, [Electron-Apps](./electron-database.md), Progressive Web Apps and **Node.js**. While RxDB was initially created to be used with UI applications, it has been matured and optimized to make it useful for pure server-side use cases. It can be used as embedded, local database inside of the Node.js JavaScript process, or it can be used similar to a database server that Node.js can connect to. The [RxStorage](./rx-storage.md) layer makes it possible to switch out the underlying storage engine which makes RxDB a very flexible database that can be optimized for many scenarios. - - - -## Persistent Database - -To get a "normal" database connection where the data is persisted to a file system, the RxDB real time database provides multiple [storage implementations](./rx-storage.md) that work in Node.js. - -The [FoundationDB](./rx-storage-foundationdb.md) storage connects to a [FoundationDB](https://github.com/apple/foundationdb) cluster which itself is just a distributed key-value engine. RxDB adds the NoSQL query-engine, indexes and other features on top of it. -It scales horizontally because you can always add more servers to the FoundationDB cluster to increase the capacity. -Setting up a RxDB database is pretty simple. You import the FoundationDB RxStorage and tell RxDB to use that when calling `createRxDatabase`: - -```typescript -import { createRxDatabase } from 'rxdb'; -import { getRxStorageFoundationDB } from 'rxdb/plugins/storage-foundationdb'; - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageFoundationDB({ - apiVersion: 620, - clusterFile: '/path/to/fdb.cluster' - }) -}); - -// add a collection -await db.addCollections({ - users: { - schema: mySchema - } -}); - -// run a query -const result = await db.users.find({ - selector: { - name: 'foobar' - } -}).exec(); - -``` - -Another alternative storage is the [SQLite RxStorage](./rx-storage-sqlite.md) that stores the data inside of a SQLite filebased database. The SQLite storage is faster than FoundationDB and does not require to set up a cluster or anything because SQLite directly stores and reads the data inside of the filesystem. The downside of that is that it only scales vertically. - -```ts -import { createRxDatabase } from 'rxdb'; -import { - getRxStorageSQLite, - getSQLiteBasicsNode -} from 'rxdb-premium/plugins/storage-sqlite'; -import sqlite3 from 'sqlite3'; -const myRxDatabase = await createRxDatabase({ - name: 'path/to/database/file/foobar.db', - storage: getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsNode(sqlite3) - }) -}); -``` - -Because the SQLite RxStorage is not free and you might not want to set up a FoundationDB cluster, there is also the option to use the [LokiJS RxStorage](./rx-storage-lokijs.md) together with the filesystem adapter. This will store the data as plain json in a file and load everything into memory on startup. This works great for small prototypes but it is not recommended to be used in production. - -```ts -import { createRxDatabase } from 'rxdb'; -const LokiFsStructuredAdapter = require('lokijs/src/loki-fs-structured-adapter.js'); -import { getRxStorageLoki } from 'rxdb/plugins/storage-lokijs'; -import sqlite3 from 'sqlite3'; -const myRxDatabase = await createRxDatabase({ - name: 'path/to/database/file/foobar.db', - storage: getRxStorageLoki({ - adapter: new LokiFsStructuredAdapter() - }) -}); -``` - -Here is a performance comparison chart of the different storages (lower is better): - - - -## RxDB as Node.js In-Memory Database - -One of the easiest way to use RxDB in Node.js is to use the [Memory RxStorage](./rx-storage-memory.md). As the name implies, it stores the data directly **in-memory** of the Node.js JavaScript process. This makes it really fast to read and write data but of course the data is not persisted and will be lost when the nodejs process exits. Often the in-memory option is used when RxDB is used in unit tests because it automatically cleans up everything afterwards. - -```ts -import { createRxDatabase } from 'rxdb'; -import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageMemory() -}); -``` - -Also notice that the [default memory limit](https://medium.com/geekculture/node-js-default-memory-settings-3c0fe8a9ba1) of Node.js is 4gb (might change of newer versions) so for bigger datasets you might want to increase the limit with the `max-old-space-size` flag: - -```bash -# increase the Node.js memory limit to 8GB -node --max-old-space-size=8192 index.js -``` - -## Hybrid In-memory-persistence-synced storage - -If you want to have the performance of an **in-memory database** but require persistency of the data, you can use the [memory-mapped storage](./rx-storage-memory-mapped.md). On database creation it will load all data into the memory and on writes it will first write the data into memory and later also write it to the persistent storage in the background. In the following example the FoundationDB storage is used, but any other RxStorage can be used as persistence layer. - -```typescript -import { createRxDatabase } from 'rxdb'; -import { getRxStorageFoundationDB } from 'rxdb/plugins/storage-foundationdb'; -import { getMemoryMappedRxStorage } from 'rxdb-premium/plugins/storage-memory-mapped'; - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getMemoryMappedRxStorage({ - storage: getRxStorageFoundationDB({ - apiVersion: 620, - clusterFile: '/path/to/fdb.cluster' - }) - }) -}); -``` - -While this approach gives you a database with great performance and persistent, it has two major downsides: -- The database size is limited to the memory size -- Writes can be lost when the Node.js process exists between a write to the memory state and the background persisting. - -## Share database between microservices with RxDB - -Using a local, embedded database in Node.js works great until you have to share the data with another Node.js process or another server at all. -To share the database state with other instances, RxDB provides two different methods. One is [replication](./replication.md) and the other is the [remote RxStorage](./rx-storage-remote.md). -The replication copies over the whole database set to other instances live-replicates all ongoing writes. This has the benefit of scaling better because each of your microservice will run queries on its own copy of the dataset. -Sometimes however you might not want to store the full dataset on each microservice. Then it is better to use the remote RxStorage and connect it to the "main" database. The remote storage will run all operations the main database and return the result to the calling database. - -## Follow up on RxDB+Node.js - -- Check out the [RxDB Nodejs example](https://github.com/pubkey/rxdb/tree/master/examples/node). -- If you haven't done yet, you should start learning about RxDB with the [Quickstart Tutorial](./quickstart.md). -- I created [a list of embedded JavaSCript databases](./alternatives.md) that you will help you to pick a database if you do not want to use RxDB. -- Check out the [MongoDB RxStorage](./rx-storage-mongodb.md) that uses MongoDB for the database connection from your Node.js application and runs the RxDB real time database on top of it. diff --git a/docs/nosql-performance-tips.html b/docs/nosql-performance-tips.html deleted file mode 100644 index d3dc8aabd2b..00000000000 --- a/docs/nosql-performance-tips.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - -RxDB NoSQL Performance Tips | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Performance tips for RxDB and other NoSQL databases

    -

    In this guide, you'll find techniques to improve the performance of RxDB operations and queries. Notice that all your performance optimizations should be done with a correct tracking of the metrics, otherwise you might change stuff into the wrong direction.

    -

    Use bulk operations

    -

    When you run write operations on multiple documents, make sure you use bulk operations instead of single document operations.

    -
    // wrong ❌
    -for(const docData of dataAr){
    -    await myCollection.insert(docData);
    -}
    - 
    -// right ✔️
    -await myCollection.bulkInsert(dataAr);
    -

    Help the query planner by adding operators that better restrict the index range

    -

    Often on complex queries, RxDB (and other databases) do not pick the optimal index range when querying a result set. -You can add additional restrictive operators to ensure the query runs over a smaller index space and has a better performance.

    -

    Lets see some examples for different query types.

    -
    /**
    - * Adding a restrictive operator for an $or query
    - * so that it better limits the index space for the time-field.
    - */
    -const orQuery = {
    -    selector: {
    -        $or: [
    -            {
    -                time: { $gt: 1234 },
    -            },
    -            {
    -                time: { $eg: 1234 },
    -                user: { $gt: 'foobar' }
    -            },
    -        ]
    -        time: { $gte: 1234 } // <- add restrictive operator
    -    }
    -}
    - 
    -/**
    - * Adding a restrictive operator for an $regex query
    - * so that it better limits the index space for the user-field.
    - * We know that all matching fields start with 'foo' so we can
    - * tell the query to use that as lower constraint for the index.
    - */
    -const regexQuery = {
    -    selector: {
    -        user: {
    -            $regex: '^foo(.*)0-9$', // a complex regex with a ^ in the beginning
    -            $gte: 'foo' // <- add restrictive operator
    -        }
    -    }
    -}
    - 
    -/**
    - * Adding a restrictive operator for a query on an enum field.
    - * so that it better limits the index space for the time-field.
    - */
    - 
    -const enumQuery = {
    -    selector: {
    -        /**
    -         * Here lets assume our status field has the enum type ['idle', 'in-progress', 'done']
    -         * so our restrictive operator can exclude all documents with 'done' as status.
    -         */
    -        status: {
    -            $in: {
    -                'idle',
    -                'in-progress',
    -            },
    -            $gt: 'done' // <- add restrictive operator on status
    -        }
    -    }
    -}
    -

    Set a specific index

    -

    Sometime the query planner of the database itself has no chance in picking the best index of the possible given indexes. -For queries where performance is very important, you might want to explicitly specify which index must be used.

    -
    const myQuery = myCollection.find({
    -    selector: {
    -        /* ... */
    -    },
    -    // explicitly specify index
    -    index: [
    -        'fieldA',
    -        'fieldB'
    -    ]
    - 
    -});
    -

    Try different ordering of index fields

    -

    The order of the fields in a compound index is very important for performance. When optimizing index usage, you should try out different orders on the index fields and measure which runs faster. For that it is very important to run tests on real-world data where the distribution of the data is the same as in production. -For example when there is a query on a user collection with an age and a gender field, it depends if the index ['gender', 'age'] performance better as ['age', 'gender'] based on the distribution of data:

    -
    const query = myCollection
    -    .findOne({
    -      selector: {
    -        age: {
    -          $gt: 18
    -        },
    -        gender: {
    -          $eq: 'm'
    -        }
    -      },
    -      /**
    -       * Because the developer knows that 50% of the documents are 'male',
    -       * but only 20% are below age 18,
    -       * it makes sense to enforce using the ['gender', 'age'] index to improve performance.
    -       * This could not be known by the query planer which might have chosen ['age', 'gender'] instead.
    -       */
    -      index: ['gender', 'age']
    -    });
    -

    Notice that RxDB has the Query Optimizer Plugin that can be used to automatically find the best indexes.

    -

    Make a Query "hot" to reduce load

    -

    Having a query where the up-to-date result set is needed more than once, you might want to make the query "hot" by permanently subscribing to it. This ensures that the query result is kept up to date by RxDB ant the EventReduce algorithm at any time so that at the moment you need the current results, it has them already.

    -

    For example when you use RxDB at Node.js for a webserver, you should use an outer "hot" query instead of running the same query again on every request to a route.

    -
    // wrong ❌
    -app.get('/list', (req, res) => {
    -    const result = await myCollection.find({/* ... */}).exec();
    -    res.send(JSON.stringify(result));
    -});
    - 
    -// right ✔️
    -const query = myCollection.find({/* ... */});
    -query.subscribe(); // <- make it hot
    - 
    -app.get('/list', (req, res) => {
    -    const result = await query.exec();
    -    res.send(JSON.stringify(result));
    -});
    -

    Store parts of your document data as attachment

    -

    For in-app databases like RxDB, it does not make sense to partially parse the JSON of a document. Instead, always the whole document json is parsed and handled. This has a better performance because JSON.parse() in JavaScript directly calls a C++ binding which can parse really fast compared to a partial parsing in JavaScript itself. Also by always having the full document, RxDB can de-duplicate memory caches of document across multiple queries.

    -

    The downside is that very very big documents with a complex structure can increase query time significantly. Documents fields with complex that are mostly not in use, can be move into an attachment. This would lead RxDB to not fetch the attachment data each time the document is loaded from disc. Instead only when explicitly asked for.

    -
    const myDocument = await myCollection.insert({/* ... */});
    -const attachment = await myDocument.putAttachment(
    -    {
    -        id: 'otherStuff.json',
    -        data: createBlob(JSON.stringify({/* ... */}), 'application/json'),
    -        type: 'application/json'
    -    }
    -);
    -

    Process queries in a worker process

    -

    Moving database storage into a WebWorker can significantly improve performance in web applications that use RxDB or similar NoSQL databases. When database operations are executed in the main JavaScript thread, they can block or slow down the User Interface, especially during heavy or complex data operations. By offloading these operations to a WebWorker, you effectively separate the data processing workload from the UI thread. This means the main thread remains free to handle user interactions and render updates without delay, leading to a smoother and more responsive user experience. Additionally, WebWorkers allow for parallel data processing, which can expedite tasks like querying and indexing. This approach not only enhances UI responsiveness but also optimizes overall application performance by leveraging the multi-threading capabilities of modern browsers. -With RxDB you can use the Worker and SharedWorker plugin to move the query processing away from the main thread.

    -

    Use less plugins and hooks

    -

    Utilizing fewer hooks and plugins in RxDB or similar NoSQL database systems can lead to markedly better performance. Each additional hook or plugin introduces extra layers of processing and potential overhead, which can cumulatively slow down database operations. These extensions often execute additional code or enforce extra checks with each operation, such as insertions, updates, or deletions. While they can provide valuable functionalities or custom behaviors, their overuse can inadvertently increase the complexity and execution time of basic database operations. By minimizing their use and only employing essential hooks and plugins, the system can operate more efficiently. This streamlined approach reduces the computational burden on each transaction, leading to faster response times and a more efficient overall data handling process, especially critical in high-load or real-time applications where performance is paramount.

    - - \ No newline at end of file diff --git a/docs/nosql-performance-tips.md b/docs/nosql-performance-tips.md deleted file mode 100644 index 0a2af288573..00000000000 --- a/docs/nosql-performance-tips.md +++ /dev/null @@ -1,181 +0,0 @@ -# RxDB NoSQL Performance Tips - -> Skyrocket your NoSQL speed with RxDB tips. Learn about bulk writes, optimized queries, and lean plugin usage for peak performance. - -# Performance tips for RxDB and other NoSQL databases - -In this guide, you'll find techniques to improve the performance of RxDB operations and queries. Notice that all your performance optimizations should be done with a correct tracking of the metrics, otherwise you might change stuff into the wrong direction. - -## Use bulk operations - -When you run write operations on multiple documents, make sure you use bulk operations instead of single document operations. - -```ts -// wrong ❌ -for(const docData of dataAr){ - await myCollection.insert(docData); -} - -// right ✔️ -await myCollection.bulkInsert(dataAr); -``` - -## Help the query planner by adding operators that better restrict the index range - -Often on complex queries, RxDB (and other databases) do not pick the optimal index range when querying a result set. -You can add additional restrictive operators to ensure the query runs over a smaller index space and has a better performance. - -Lets see some examples for different query types. - -```ts -/** - * Adding a restrictive operator for an $or query - * so that it better limits the index space for the time-field. - */ -const orQuery = { - selector: { - $or: [ - { - time: { $gt: 1234 }, - }, - { - time: { $eg: 1234 }, - user: { $gt: 'foobar' } - }, - ] - time: { $gte: 1234 } // <- add restrictive operator - } -} - -/** - * Adding a restrictive operator for an $regex query - * so that it better limits the index space for the user-field. - * We know that all matching fields start with 'foo' so we can - * tell the query to use that as lower constraint for the index. - */ -const regexQuery = { - selector: { - user: { - $regex: '^foo(.*)0-9$', // a complex regex with a ^ in the beginning - $gte: 'foo' // <- add restrictive operator - } - } -} - -/** - * Adding a restrictive operator for a query on an enum field. - * so that it better limits the index space for the time-field. - */ - -const enumQuery = { - selector: { - /** - * Here lets assume our status field has the enum type ['idle', 'in-progress', 'done'] - * so our restrictive operator can exclude all documents with 'done' as status. - */ - status: { - $in: { - 'idle', - 'in-progress', - }, - $gt: 'done' // <- add restrictive operator on status - } - } -} -``` - -## Set a specific index - -Sometime the query planner of the database itself has no chance in picking the best index of the possible given indexes. -For queries where performance is very important, you might want to explicitly specify which index must be used. - -```ts -const myQuery = myCollection.find({ - selector: { - /* ... */ - }, - // explicitly specify index - index: [ - 'fieldA', - 'fieldB' - ] - -}); -``` - -## Try different ordering of index fields - -The order of the fields in a compound index is very important for performance. When optimizing index usage, you should try out different orders on the index fields and measure which runs faster. For that it is very important to run tests on real-world data where the distribution of the data is the same as in production. -For example when there is a query on a user collection with an `age` and a `gender` field, it depends if the index `['gender', 'age']` performance better as `['age', 'gender']` based on the distribution of data: - -```ts -const query = myCollection - .findOne({ - selector: { - age: { - $gt: 18 - }, - gender: { - $eq: 'm' - } - }, - /** - * Because the developer knows that 50% of the documents are 'male', - * but only 20% are below age 18, - * it makes sense to enforce using the ['gender', 'age'] index to improve performance. - * This could not be known by the query planer which might have chosen ['age', 'gender'] instead. - */ - index: ['gender', 'age'] - }); -``` - -Notice that RxDB has the [Query Optimizer Plugin](./query-optimizer.md) that can be used to automatically find the best indexes. - -## Make a Query "hot" to reduce load - -Having a query where the up-to-date result set is needed more than once, you might want to make the query "hot" by permanently subscribing to it. This ensures that the query result is kept up to date by RxDB ant the [EventReduce algorithm](https://github.com/pubkey/event-reduce) at any time so that at the moment you need the current results, it has them already. - -For example when you use RxDB at Node.js for a webserver, you should use an outer "hot" query instead of running the same query again on every request to a route. - -```ts -// wrong ❌ -app.get('/list', (req, res) => { - const result = await myCollection.find({/* ... */}).exec(); - res.send(JSON.stringify(result)); -}); - -// right ✔️ -const query = myCollection.find({/* ... */}); -query.subscribe(); // <- make it hot - -app.get('/list', (req, res) => { - const result = await query.exec(); - res.send(JSON.stringify(result)); -}); -``` - -## Store parts of your document data as attachment - -For in-app databases like RxDB, it does not make sense to partially parse the `JSON` of a document. Instead, always the whole document json is parsed and handled. This has a better performance because `JSON.parse()` in JavaScript directly calls a C++ binding which can parse really fast compared to a partial parsing in JavaScript itself. Also by always having the full document, RxDB can de-duplicate memory caches of document across multiple queries. - -The downside is that very very big documents with a complex structure can increase query time significantly. Documents fields with complex that are mostly not in use, can be move into an [attachment](./rx-attachment.md). This would lead RxDB to not fetch the attachment data each time the document is loaded from disc. Instead only when explicitly asked for. - -```ts -const myDocument = await myCollection.insert({/* ... */}); -const attachment = await myDocument.putAttachment( - { - id: 'otherStuff.json', - data: createBlob(JSON.stringify({/* ... */}), 'application/json'), - type: 'application/json' - } -); -``` - -## Process queries in a worker process - -Moving database storage into a WebWorker can significantly improve performance in web applications that use RxDB or similar NoSQL databases. When database operations are executed in the main JavaScript thread, they can block or slow down the User Interface, especially during heavy or complex data operations. By offloading these operations to a WebWorker, you effectively separate the data processing workload from the UI thread. This means the main thread remains free to handle user interactions and render updates without delay, leading to a smoother and more responsive user experience. Additionally, WebWorkers allow for parallel data processing, which can expedite tasks like querying and indexing. This approach not only enhances UI responsiveness but also optimizes overall application performance by leveraging the multi-threading capabilities of modern browsers. -With RxDB you can use the [Worker](./rx-storage-worker.md) and [SharedWorker](./rx-storage-shared-worker.md) plugin to move the query processing away from the main thread. - -## Use less plugins and hooks - -Utilizing fewer [hooks](./middleware.md) and plugins in RxDB or similar NoSQL database systems can lead to markedly better performance. Each additional hook or plugin introduces extra layers of processing and potential overhead, which can cumulatively slow down database operations. These extensions often execute additional code or enforce extra checks with each operation, such as insertions, updates, or deletions. While they can provide valuable functionalities or custom behaviors, their overuse can inadvertently increase the complexity and execution time of basic database operations. By minimizing their use and only employing essential hooks and plugins, the system can operate more efficiently. This streamlined approach reduces the computational burden on each transaction, leading to faster response times and a more efficient overall data handling process, especially critical in high-load or real-time applications where performance is paramount. diff --git a/docs/offline-first.html b/docs/offline-first.html deleted file mode 100644 index 43fbb0d70c3..00000000000 --- a/docs/offline-first.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - -Local First / Offline First | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Local First / Offline First

    -

    Local-First (aka offline first) is a software paradigm where the software stores data locally at the clients device and must work as well offline as it does online. -To implement this, you have to store data at the client side, so that your application can still access it when the internet goes away. -This can be either done with complex caching strategies, or by using an local-first, offline database (like RxDB) that stores the data inside of a local database like IndexedDB and replicates it from and to the backend in the background. This makes the local database, not the server, the gateway for all persistent changes in application state.

    -
    -

    Offline first is not about having no internet connection

    -
    -
    note

    I wrote a follow-up version of offline/first local first about Why Local-First Is the Future and what are Its Limitations

    -

    While in the past, internet connection was an unstable, things are changing especially for mobile devices. -Mobile networks become better and having no internet becomes less common even in remote locations. -So if we did not care about offline first applications in the past, why should we even care now? -In the following I will point out why offline first applications are better, not because they support offline usage, but because of other reasons.

    -
    RxDB
    -

    UX is better without loading spinners

    -

    In 'normal' web applications, most user interactions like fetching, saving or deleting data, correspond to a request to the backend server. This means that each of these interactions require the user to await the unknown latency to and from a remote server while looking at a loading spinner. -In offline-first apps, the operations go directly against the local storage which happens almost instantly. There is no perceptible loading time and so it is not even necessary to implement a loading spinner at all. As soon as the user clicks, the UI represents the new state as if it was already changed in the backend.

    -

    loading spinner not needed

    -

    Multi-tab usage just works

    -

    Many, even big websites like amazon, reddit and stack overflow do not handle multi tab usage correctly. When a user has multiple tabs of the website open and does a login on one of these tabs, the state does not change on the other tabs. -On offline first applications, there is always exactly one state of the data across all tabs. Offline first databases (like RxDB) store the data inside of IndexedDb and share the state between all tabs of the same origin.

    -

    RxDB multi tab

    -

    Latency is more important than bandwidth

    -

    In the past, often the bandwidth was the limiting factor on determining the loading time of an application. -But while bandwidth has improved over the years, latency became the limiting factor. -You can always increase the bandwidth by setting up more cables or sending more Starlink satellites to space. -But reducing the latency is not so easy. It is defined by the physical properties of the transfer medium, the speed of light and the distance to the server. All of these three are hard to optimize.

    -

    Offline first application benefit from that because sending the initial state to the client can be done much faster with more bandwidth. And once the data is there, we do no longer have to care about the latency to the backend server because you can run near zero latency queries locally.

    -

    latency london san franzisco

    -

    Realtime comes for free

    -

    Most websites lie to their users. They do not lie because they display wrong data, but because they display old data that was loaded from the backend at the time the user opened the site. -To overcome this, you could build a realtime website where you create a websocket that streams updates from the backend to the client. This means work. Your client needs to tell the server which page is currently opened and which updates the client is interested to. Then the server can push updates over the websocket and you can update the UI accordingly.

    -

    With offline first applications, you already have a realtime replication with the backend. Most offline first databases provide some concept of changestream or data subscriptions and with RxDB you can even directly subscribe to query results or single fields of documents. This makes it easy to have an always updated UI whenever data on the backend changes.

    -

    realtime ui updates

    -

    Scales with data size, not with the amount of user interaction

    -

    On normal applications, each user interaction can result in multiple requests to the backend server which increase its load. -The more users interact with your application, the more backend resources you have to provide.

    -

    Offline first applications do not scale up with the amount of user actions but instead they scale up with the amount of data. -Once that data is transferred to the client, the user can do as many interactions with it as required without connecting to the server.

    -

    Modern apps have longer runtimes

    -

    In the past you used websites only for a short time. You open it, perform some action and then close it again. This made the first load time the important metric when evaluating page speed. -Today web applications have changed and with it the way we use them. Single page applications are opened once and then used over the whole day. Chat apps, email clients, PWAs and hybrid apps. All of these were made to have long runtimes. -This makes the time for user interactions more important than the initial loading time. Offline first applications benefit from that because there is often no loading time on user actions while loading the initial state to the client is not that relevant.

    -

    You might not need REST

    -

    On normal web applications, you make different requests for each kind of data interaction. -For that you have to define a swagger route, implement a route handler on the backend and create some client code to send or fetch data from that route. The more complex your application becomes, the more REST routes you have to maintain and implement.

    -

    With offline first apps, you have a way to hack around all this cumbersome work. You just replicate the whole state from the server to the client. The replication does not only run once, you have a realtime replication and all changes at one side are automatically there on the other side. On the client, you can access every piece of state with a simple database query. -While this of course only works for amounts of data that the client can load and store, it makes implementing prototypes and simple apps much faster.

    -

    You might not need Redux

    -

    Data is hard, especially for UI applications where many things can happen at the same time. -The user is clicking around. Stuff is loaded from the server. All of these things interact with the global state of the app. -To manage this complexity it is common to use state management libraries like Redux or MobX. With them, you write all this lasagna code to wrap the mutation of data and to make the UI react to all these changes.

    -

    On offline first apps, your global state is already there in a single place stored inside of the local database. -You do not have to care whether this data came from the UI, another tab, the backend or another device of the same user. You can just make writes to the database and fetch data out of it.

    -

    Follow up

    -
    - - \ No newline at end of file diff --git a/docs/offline-first.md b/docs/offline-first.md deleted file mode 100644 index b959b7ad5d9..00000000000 --- a/docs/offline-first.md +++ /dev/null @@ -1,97 +0,0 @@ -# Local First / Offline First - -> Local-First software stores data on client devices for seamless offline and online functionality, enhancing user experience and efficiency. - -# Local First / Offline First - -Local-First (aka offline first) is a software paradigm where the software stores data locally at the clients device and must work as well offline as it does online. -To implement this, you have to store data at the client side, so that your application can still access it when the internet goes away. -This can be either done with complex caching strategies, or by using an local-first, [offline database](./articles/offline-database.md) (like [RxDB](https://rxdb.info)) that stores the data inside of a local database like [IndexedDB](./rx-storage-indexeddb.md) and replicates it from and to the backend in the background. This makes the local database, not the server, the gateway for all persistent changes in application state. - -> **Offline first is not about having no internet connection** - -:::note -I wrote a follow-up version of offline/first local first about [Why Local-First Is the Future and what are Its Limitations](./articles/local-first-future.md) -::: - -While in the past, internet connection was an unstable, things are changing especially for mobile devices. -Mobile networks become better and having no internet becomes less common even in remote locations. -So if we did not care about offline first applications in the past, why should we even care now? -In the following I will point out why offline first applications are better, not because they support offline usage, but because of other reasons. - -
    - - - -
    - -## UX is better without loading spinners - -In 'normal' web applications, most user interactions like fetching, saving or deleting data, correspond to a request to the backend server. This means that each of these interactions require the user to await the unknown latency to and from a remote server while looking at a loading spinner. -In offline-first apps, the operations go directly against the local storage which happens almost instantly. There is no perceptible loading time and so it is not even necessary to implement a loading spinner at all. As soon as the user clicks, the UI represents the new state as if it was already changed in the backend. - - - -## Multi-tab usage just works - -Many, even big websites like amazon, reddit and stack overflow do not handle multi tab usage correctly. When a user has multiple tabs of the website open and does a login on one of these tabs, the state does not change on the other tabs. -On offline first applications, there is always exactly one state of the data across all tabs. Offline first databases (like RxDB) store the data inside of IndexedDb and **share the state** between all tabs of the same origin. - - - -## Latency is more important than bandwidth - -In the past, often the bandwidth was the limiting factor on determining the loading time of an application. -But while bandwidth has improved over the years, latency became the limiting factor. -You can always increase the bandwidth by setting up more cables or sending more Starlink satellites to space. -But reducing the latency is not so easy. It is defined by the physical properties of the transfer medium, the speed of light and the distance to the server. All of these three are hard to optimize. - -Offline first application benefit from that because sending the initial state to the client can be done much faster with more bandwidth. And once the data is there, we do no longer have to care about the latency to the backend server because you can run near [zero](./articles/zero-latency-local-first.md) latency queries locally. - - - -## Realtime comes for free - -Most websites lie to their users. They do not lie because they display wrong data, but because they display **old data** that was loaded from the backend at the time the user opened the site. -To overcome this, you could build a realtime website where you create a websocket that streams updates from the backend to the client. This means work. Your client needs to tell the server which page is currently opened and which updates the client is interested to. Then the server can push updates over the websocket and you can update the UI accordingly. - -With offline first applications, you already have a realtime replication with the backend. Most offline first databases provide some concept of changestream or data subscriptions and with [RxDB](https://github.com/pubkey/rxdb) you can even directly subscribe to query results or single fields of documents. This makes it easy to have an always updated UI whenever data on the backend changes. - - - -## Scales with data size, not with the amount of user interaction - -On normal applications, each user interaction can result in multiple requests to the backend server which increase its load. -The more users interact with your application, the more backend resources you have to provide. - -Offline first applications do not scale up with the amount of user actions but instead they scale up with the amount of data. -Once that data is transferred to the client, the user can do as many interactions with it as required without connecting to the server. - -## Modern apps have longer runtimes - -In the past you used websites only for a short time. You open it, perform some action and then close it again. This made the first load time the important metric when evaluating page speed. -Today web applications have changed and with it the way we use them. Single page applications are opened once and then used over the whole day. Chat apps, email clients, PWAs and hybrid apps. All of these were made to have long runtimes. -This makes the time for user interactions more important than the initial loading time. Offline first applications benefit from that because there is often no loading time on user actions while loading the initial state to the client is not that relevant. - -## You might not need REST - -On normal web applications, you make different requests for each kind of data interaction. -For that you have to define a swagger route, implement a route handler on the backend and create some client code to send or fetch data from that route. The more complex your application becomes, the more REST routes you have to maintain and implement. - -With offline first apps, you have a way to hack around all this cumbersome work. You just replicate the whole state from the server to the client. The replication does not only run once, you have a **realtime replication** and all changes at one side are automatically there on the other side. On the client, you can access every piece of state with a simple database query. -While this of course only works for amounts of data that the client can load and store, it makes implementing prototypes and simple apps much faster. - -## You might not need Redux - -Data is hard, especially for UI applications where many things can happen at the same time. -The user is clicking around. Stuff is loaded from the server. All of these things interact with the global state of the app. -To manage this complexity it is common to use state management libraries like Redux or MobX. With them, you write all this lasagna code to wrap the mutation of data and to make the UI react to all these changes. - -On offline first apps, your global state is already there in a single place stored inside of the local database. -You do not have to care whether this data came from the UI, another tab, the backend or another device of the same user. You can just make writes to the database and fetch data out of it. - -## Follow up - -- Learn how to store and query data with RxDB in the [RxDB Quickstart](./quickstart.md) -- [Downsides of Offline First](./downsides-of-offline-first.md) -- I wrote a follow-up version of offline/first local first about [Why Local-First Is the Future and what are Its Limitations](./articles/local-first-future.md) diff --git a/docs/orm.html b/docs/orm.html deleted file mode 100644 index 64895e72e08..00000000000 --- a/docs/orm.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - -ORM | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Object-Data-Relational-Mapping

    -

    Like mongoose, RxDB has ORM-capabilities which can be used to add specific behavior to documents and collections.

    -

    statics

    -

    Statics are defined collection-wide and can be called on the collection.

    -

    Add statics to a collection

    -

    To add static functions, pass a statics-object when you create your collection. The object contains functions, mapped to their function-names.

    -
    const heroes = await myDatabase.addCollections({
    -  heroes: {
    -    schema: mySchema,
    -    statics: {
    -      scream: function(){
    -          return 'AAAH!!';
    -      }
    -    }
    -  }
    -});
    - 
    -console.log(heroes.scream());
    -// 'AAAH!!'
    -

    You can also use the this-keyword which resolves to the collection:

    -
    const heroes = await myDatabase.addCollections({
    -  heroes: {
    -    schema: mySchema,
    -    statics: {
    -      whoAmI: function(){
    -          return this.name;
    -      }
    -    }
    -  }
    -});
    -console.log(heroes.whoAmI());
    -// 'heroes'
    -

    instance-methods

    -

    Instance-methods are defined collection-wide. They can be called on the RxDocuments of the collection.

    -

    Add instance-methods to a collection

    -
    const heroes = await myDatabase.addCollections({
    -  heroes: {
    -    schema: mySchema,
    -    methods: {
    -      scream: function(){
    -        return 'AAAH!!';
    -      }
    -    }
    -  }
    -});
    -const doc = await heroes.findOne().exec();
    -console.log(doc.scream());
    -// 'AAAH!!'
    -

    Here you can also use the this-keyword:

    -
    const heroes = await myDatabase.addCollections({
    -  heroes: {
    -    schema: mySchema,
    -    methods: {
    -      whoAmI: function(){
    -          return 'I am ' + this.name + '!!';
    -      }
    -    }
    -  }
    -});
    -await heroes.insert({
    -  name: 'Skeletor'
    -});
    -const doc = await heroes.findOne().exec();
    -console.log(doc.whoAmI());
    -// 'I am Skeletor!!'
    -

    attachment-methods

    -

    Attachment-methods are defined collection-wide. They can be called on the RxAttachments of the RxDocuments of the collection.

    -
    const heroes = await myDatabase.addCollections({
    -  heroes: {
    -    schema: mySchema,
    -    attachments: {
    -      scream: function(){
    -          return 'AAAH!!';
    -      }
    -    }
    -  }
    -});
    -const doc = await heroes.findOne().exec();
    -const attachment = await doc.putAttachment({
    -    id: 'cat.txt',
    -    data: 'meow I am a kitty',
    -    type: 'text/plain'
    -});
    -console.log(attachment.scream());
    -// 'AAAH!!'
    - - \ No newline at end of file diff --git a/docs/orm.md b/docs/orm.md deleted file mode 100644 index 0566b45deac..00000000000 --- a/docs/orm.md +++ /dev/null @@ -1,116 +0,0 @@ -# ORM - -> Like [mongoose](http://mongoosejs.com/docs/guide.html#methods), RxDB has ORM-capabilities which can be used to add specific behavior to documents and collections. - -# Object-Data-Relational-Mapping - -Like [mongoose](http://mongoosejs.com/docs/guide.html#methods), RxDB has ORM-capabilities which can be used to add specific behavior to documents and collections. - -## statics - -Statics are defined collection-wide and can be called on the collection. - -### Add statics to a collection - -To add static functions, pass a `statics`-object when you create your collection. The object contains functions, mapped to their function-names. - -```javascript -const heroes = await myDatabase.addCollections({ - heroes: { - schema: mySchema, - statics: { - scream: function(){ - return 'AAAH!!'; - } - } - } -}); - -console.log(heroes.scream()); -// 'AAAH!!' -``` - -You can also use the this-keyword which resolves to the collection: - -```javascript -const heroes = await myDatabase.addCollections({ - heroes: { - schema: mySchema, - statics: { - whoAmI: function(){ - return this.name; - } - } - } -}); -console.log(heroes.whoAmI()); -// 'heroes' -``` - -## instance-methods - -Instance-methods are defined collection-wide. They can be called on the RxDocuments of the collection. - -### Add instance-methods to a collection - -```javascript -const heroes = await myDatabase.addCollections({ - heroes: { - schema: mySchema, - methods: { - scream: function(){ - return 'AAAH!!'; - } - } - } -}); -const doc = await heroes.findOne().exec(); -console.log(doc.scream()); -// 'AAAH!!' -``` - -Here you can also use the this-keyword: - -```javascript -const heroes = await myDatabase.addCollections({ - heroes: { - schema: mySchema, - methods: { - whoAmI: function(){ - return 'I am ' + this.name + '!!'; - } - } - } -}); -await heroes.insert({ - name: 'Skeletor' -}); -const doc = await heroes.findOne().exec(); -console.log(doc.whoAmI()); -// 'I am Skeletor!!' -``` - -## attachment-methods - -Attachment-methods are defined collection-wide. They can be called on the RxAttachments of the RxDocuments of the collection. - -```javascript -const heroes = await myDatabase.addCollections({ - heroes: { - schema: mySchema, - attachments: { - scream: function(){ - return 'AAAH!!'; - } - } - } -}); -const doc = await heroes.findOne().exec(); -const attachment = await doc.putAttachment({ - id: 'cat.txt', - data: 'meow I am a kitty', - type: 'text/plain' -}); -console.log(attachment.scream()); -// 'AAAH!!' -``` diff --git a/docs/overview.html b/docs/overview.html deleted file mode 100644 index f807595df5c..00000000000 --- a/docs/overview.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - -RxDB Docs | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - \ No newline at end of file diff --git a/docs/overview.md b/docs/overview.md deleted file mode 100644 index 9cba9c1b2b4..00000000000 --- a/docs/overview.md +++ /dev/null @@ -1,9 +0,0 @@ -# RxDB Docs - -> RxDB Documentation Overview - -import { Overview } from '@site/src/components/overview'; - -# RxDB Documentation - - diff --git a/docs/plugins.html b/docs/plugins.html deleted file mode 100644 index 185e2a783c9..00000000000 --- a/docs/plugins.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - -Creating Plugins | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Creating Plugins

    -

    Creating your own plugin is very simple. A plugin is basically a javascript-object which overwrites or extends RxDB's internal classes, prototypes, and hooks.

    -

    A basic plugin:

    -
     
    -const myPlugin = {
    -        rxdb: true, // this must be true so rxdb knows that this is a rxdb-plugin
    -        /**
    -         * (optional) init() method
    -         * that is called when the plugin is added to RxDB for the first time.
    -         */
    -        init() {
    -            // import other plugins or initialize stuff
    -        },
    -        /**
    -         * every value in this object can manipulate the prototype of the keynames class
    -         * You can manipulate every prototype in this list:
    -         * @link https://github.com/pubkey/rxdb/blob/master/src/plugin.ts#L22
    -         */
    -        prototypes: {
    -            /**
    -             * add a function to RxCollection so you can call 'myCollection.hello()'
    -             *
    -             * @param {object} prototype of RxCollection
    -             */
    -            RxCollection: (proto) => {
    -                proto.hello = function() {
    -                    return 'world';
    -                };
    -            }
    -        },
    -        /**
    -         * some methods are static and can be overwritten in the overwritable-object
    -         */
    -        overwritable: {
    -            validatePassword: function(password) {
    -                if (password && typeof password !== 'string' || password.length < 10)
    -                    throw new TypeError('password is not valid');
    -            }
    -        },
    -        /**
    -         * you can add hooks to the hook-list
    -         */
    -        hooks: {
    -            /**
    -             * add a `foo` property to each document. You can then call myDocument.foo (='bar')
    -             */
    -            createRxDocument: {
    -                /**
    -                 * You can either add the hook running 'before' or 'after'
    -                 * the hooks of other plugins.
    -                 */
    -                after: function(doc) {
    -                    doc.foo = 'bar';
    -                }
    -            }
    -        }
    -};
    - 
    -// now you can import the plugin into rxdb
    -addRxPlugin(myPlugin);
    -

    Properties

    -

    rxdb

    -

    The rxdb-property signals that this plugin is an rxdb-plugin. The value should always be true.

    -

    prototypes

    -

    The prototypes-property contains a function for each of RxDB's internal prototype that you want to manipulate. Each function gets the prototype-object of the corresponding class as parameter and then can modify it. You can see a list of all available prototypes here

    -

    overwritable

    -

    Some of RxDB's functions are not inside of a class-prototype but are static. You can set and overwrite them with the overwritable-object. You can see a list of all overwritables here.

    -

    hooks

    -

    Sometimes you don't want to overwrite an existing RxDB-method, but extend it. You can do this by adding hooks which will be called each time the code jumps into the hooks corresponding call. You can find a list of all hooks here.

    -

    options

    -

    RxDatabase and RxCollection have an additional options-parameter, which can be filled with any data required be the plugin.

    -
    const collection = myDatabase.addCollections({
    -    foo: {
    -        schema: mySchema,
    -        options: { // anything can be passed into the options
    -            foo: ()=>'bar'
    -        }
    -    }
    -})
    - 
    -// Afterwards you can use these options in your plugin.
    - 
    -collection.options.foo(); // 'bar'
    - - \ No newline at end of file diff --git a/docs/plugins.md b/docs/plugins.md deleted file mode 100644 index ec421a97818..00000000000 --- a/docs/plugins.md +++ /dev/null @@ -1,106 +0,0 @@ -# Creating Plugins - -> Creating your own plugin is very simple. A plugin is basically a javascript-object which overwrites or extends RxDB's internal classes, prototypes, and hooks. - -# Creating Plugins - -Creating your own plugin is very simple. A plugin is basically a javascript-object which overwrites or extends RxDB's internal classes, prototypes, and hooks. - -A basic plugin: - -```javascript - -const myPlugin = { - rxdb: true, // this must be true so rxdb knows that this is a rxdb-plugin - /** - * (optional) init() method - * that is called when the plugin is added to RxDB for the first time. - */ - init() { - // import other plugins or initialize stuff - }, - /** - * every value in this object can manipulate the prototype of the keynames class - * You can manipulate every prototype in this list: - * @link https://github.com/pubkey/rxdb/blob/master/src/plugin.ts#L22 - */ - prototypes: { - /** - * add a function to RxCollection so you can call 'myCollection.hello()' - * - * @param {object} prototype of RxCollection - */ - RxCollection: (proto) => { - proto.hello = function() { - return 'world'; - }; - } - }, - /** - * some methods are static and can be overwritten in the overwritable-object - */ - overwritable: { - validatePassword: function(password) { - if (password && typeof password !== 'string' || password.length < 10) - throw new TypeError('password is not valid'); - } - }, - /** - * you can add hooks to the hook-list - */ - hooks: { - /** - * add a `foo` property to each document. You can then call myDocument.foo (='bar') - */ - createRxDocument: { - /** - * You can either add the hook running 'before' or 'after' - * the hooks of other plugins. - */ - after: function(doc) { - doc.foo = 'bar'; - } - } - } -}; - -// now you can import the plugin into rxdb -addRxPlugin(myPlugin); -``` - -# Properties - -## rxdb - -The `rxdb`-property signals that this plugin is an rxdb-plugin. The value should always be `true`. - -## prototypes - -The `prototypes`-property contains a function for each of RxDB's internal prototype that you want to manipulate. Each function gets the prototype-object of the corresponding class as parameter and then can modify it. You can see a list of all available prototypes [here](https://github.com/pubkey/rxdb/blob/master/src/plugin.ts) - -## overwritable - -Some of RxDB's functions are not inside of a class-prototype but are static. You can set and overwrite them with the `overwritable`-object. You can see a list of all overwritables [here](https://github.com/pubkey/rxdb/blob/master/src/overwritable.ts). - -# hooks - -Sometimes you don't want to overwrite an existing RxDB-method, but extend it. You can do this by adding hooks which will be called each time the code jumps into the hooks corresponding call. You can find a list of all hooks [here](https://github.com/pubkey/rxdb/blob/master/src/hooks.ts). - -# options - -RxDatabase and RxCollection have an additional options-parameter, which can be filled with any data required be the plugin. - -```javascript -const collection = myDatabase.addCollections({ - foo: { - schema: mySchema, - options: { // anything can be passed into the options - foo: ()=>'bar' - } - } -}) - -// Afterwards you can use these options in your plugin. - -collection.options.foo(); // 'bar' -``` diff --git a/docs/population.html b/docs/population.html deleted file mode 100644 index cd7ce121307..00000000000 --- a/docs/population.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - -Populate and Link Docs in RxDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Population

    -

    There are no joins in RxDB but sometimes we still want references to documents in other collections. This is where population comes in. You can specify a relation from one RxDocument to another RxDocument in the same or another RxCollection of the same database. -Then you can get the referenced document with the population-getter.

    -

    This works exactly like population with mongoose.

    -

    Schema with ref

    -

    The ref-keyword in properties describes to which collection the field-value belongs to (has a relationship).

    -
    export const refHuman = {
    -    title: 'human related to other human',
    -    version: 0,
    -    primaryKey: 'name',
    -    properties: {
    -        name: {
    -            type: 'string'
    -        },
    -        bestFriend: {
    -            ref: 'human',     // refers to collection human
    -            type: 'string'    // ref-values must always be string or ['string','null'] (primary of foreign RxDocument) 
    -        }
    -    }
    -};
    -

    You can also have a one-to-many reference by using a string-array.

    -
    export const schemaWithOneToManyReference = {
    -  version: 0,
    -  primaryKey: 'name',
    -  type: 'object',
    -  properties: {
    -    name: {
    -      type: 'string'
    -    },
    -    friends: {
    -      type: 'array',
    -      ref: 'human',
    -      items: {
    -        type: 'string'
    -      }
    -    }
    -  }
    -};
    -

    populate()

    -

    via method

    -

    To get the referred RxDocument, you can use the populate()-method. -It takes the field-path as attribute and returns a Promise which resolves to the foreign document or null if not found.

    -
    await humansCollection.insert({
    -  name: 'Alice',
    -  bestFriend: 'Carol'
    -});
    -await humansCollection.insert({
    -  name: 'Bob',
    -  bestFriend: 'Alice'
    -});
    -const doc = await humansCollection.findOne('Bob').exec();
    -const bestFriend = await doc.populate('bestFriend');
    -console.dir(bestFriend); //> RxDocument[Alice]
    -

    via getter

    -

    You can also get the populated RxDocument with the direct getter. Therefore you have to add an underscore suffix _ to the fieldname. -This works also on nested values.

    -
    await humansCollection.insert({
    -  name: 'Alice',
    -  bestFriend: 'Carol'
    -});
    -await humansCollection.insert({
    -  name: 'Bob',
    -  bestFriend: 'Alice'
    -});
    -const doc = await humansCollection.findOne('Bob').exec();
    -const bestFriend = await doc.bestFriend_; // notice the underscore_
    -console.dir(bestFriend); //> RxDocument[Alice]
    -

    Example with nested reference

    -
    const myCollection = await myDatabase.addCollections({
    -  human: {
    -    schema: {
    -      version: 0,
    -      type: 'object',
    -      properties: {
    -        name: {
    -          type: 'string'
    -        },
    -        family: {
    -          type: 'object',
    -          properties: {
    -            mother: {
    -              type: 'string',
    -              ref: 'human'
    -            }
    -          }
    -        }
    -      }
    -    }
    -  }
    -});
    - 
    -const mother = await myDocument.family.mother_;
    -console.dir(mother); //> RxDocument
    -

    Example with array

    -
    const myCollection = await myDatabase.addCollections({
    -  human: {
    -    schema: {
    -      version: 0,
    -      type: 'object',
    -      properties: {
    -        name: {
    -          type: 'string'
    -        },
    -        friends: {
    -          type: 'array',
    -          ref: 'human',
    -          items: {
    -              type: 'string'
    -          }
    -        }
    -      }
    -    }
    -  } 
    -});
    - 
    -//[insert other humans here]
    - 
    -await myCollection.insert({
    -  name: 'Alice',
    -  friends: [
    -    'Bob',
    -    'Carol',
    -    'Dave'
    -  ]
    -});
    - 
    -const doc = await humansCollection.findOne('Alice').exec();
    -const friends = await myDocument.friends_;
    -console.dir(friends); //> Array.<RxDocument>
    - - \ No newline at end of file diff --git a/docs/population.md b/docs/population.md deleted file mode 100644 index 1a8f098d783..00000000000 --- a/docs/population.md +++ /dev/null @@ -1,161 +0,0 @@ -# Populate and Link Docs in RxDB - -> Learn how to reference and link documents across collections in RxDB. Discover easy population without joins and handle complex relationships. - -# Population - -There are no joins in RxDB but sometimes we still want references to documents in other collections. This is where population comes in. You can specify a relation from one RxDocument to another RxDocument in the same or another RxCollection of the same database. -Then you can get the referenced document with the population-getter. - -This works exactly like population with [mongoose](http://mongoosejs.com/docs/populate.html). - -## Schema with ref - -The `ref`-keyword in properties describes to which collection the field-value belongs to (has a relationship). - -```javascript -export const refHuman = { - title: 'human related to other human', - version: 0, - primaryKey: 'name', - properties: { - name: { - type: 'string' - }, - bestFriend: { - ref: 'human', // refers to collection human - type: 'string' // ref-values must always be string or ['string','null'] (primary of foreign RxDocument) - } - } -}; -``` - -You can also have a one-to-many reference by using a string-array. - -```js -export const schemaWithOneToManyReference = { - version: 0, - primaryKey: 'name', - type: 'object', - properties: { - name: { - type: 'string' - }, - friends: { - type: 'array', - ref: 'human', - items: { - type: 'string' - } - } - } -}; -``` - -## populate() - -### via method -To get the referred RxDocument, you can use the populate()-method. -It takes the field-path as attribute and returns a Promise which resolves to the foreign document or null if not found. - -```javascript -await humansCollection.insert({ - name: 'Alice', - bestFriend: 'Carol' -}); -await humansCollection.insert({ - name: 'Bob', - bestFriend: 'Alice' -}); -const doc = await humansCollection.findOne('Bob').exec(); -const bestFriend = await doc.populate('bestFriend'); -console.dir(bestFriend); //> RxDocument[Alice] -``` - -### via getter -You can also get the populated RxDocument with the direct getter. Therefore you have to add an underscore suffix `_` to the fieldname. -This works also on nested values. - -```javascript -await humansCollection.insert({ - name: 'Alice', - bestFriend: 'Carol' -}); -await humansCollection.insert({ - name: 'Bob', - bestFriend: 'Alice' -}); -const doc = await humansCollection.findOne('Bob').exec(); -const bestFriend = await doc.bestFriend_; // notice the underscore_ -console.dir(bestFriend); //> RxDocument[Alice] -``` - -## Example with nested reference - -```javascript -const myCollection = await myDatabase.addCollections({ - human: { - schema: { - version: 0, - type: 'object', - properties: { - name: { - type: 'string' - }, - family: { - type: 'object', - properties: { - mother: { - type: 'string', - ref: 'human' - } - } - } - } - } - } -}); - -const mother = await myDocument.family.mother_; -console.dir(mother); //> RxDocument -``` - -## Example with array - -```javascript -const myCollection = await myDatabase.addCollections({ - human: { - schema: { - version: 0, - type: 'object', - properties: { - name: { - type: 'string' - }, - friends: { - type: 'array', - ref: 'human', - items: { - type: 'string' - } - } - } - } - } -}); - -//[insert other humans here] - -await myCollection.insert({ - name: 'Alice', - friends: [ - 'Bob', - 'Carol', - 'Dave' - ] -}); - -const doc = await humansCollection.findOne('Alice').exec(); -const friends = await myDocument.friends_; -console.dir(friends); //> Array. -``` diff --git a/docs/premium-submitted/index.html b/docs/premium-submitted/index.html deleted file mode 100644 index 1f5f38fa83b..00000000000 --- a/docs/premium-submitted/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -






    RxDB Premium Form Submitted


    Thank you for submitting the form. You will directly get a confirmation email.
    Please check your spam folder!.
    In the next 24 hours you will get an email with a preview of the license agreement.



    - - \ No newline at end of file diff --git a/docs/premium/index.html b/docs/premium/index.html deleted file mode 100644 index daeffa1607c..00000000000 --- a/docs/premium/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -Premium Plugins - RxDB - JavaScript Database | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxDB Premium

    RxDB's Premium plugins offer advanced features and performance improvements designed for businesses and professionals. They are ideal for commercial or critical projects, providing better performance, a smaller build size, flexible storage engines, secure encryption and other features.

    Price Calculator

    F.A.Q. (click to toggle)

    What is the process for making a purchase?
    • Fill out the Buy now form.
    • You will get a license agreement that you can sign online.
    • You will get an invoice via stripe.com.
    • After payment you get the access token that you can use to add the Premium plugins to your project with these instructions.
    Do I need the Premium Plugins?RxDB Core is open source and many use cases can be implemented with the Open Core part of RxDB. There are many RxStorage options and all core plugins that are required for replication, schema validation, encryption and so on, are totally free. As soon as your application is more than a side project you can consider using the premium plugins as an easy way to improve your applications performance and reduce the build size.
    The main benefit of the Premium Plugins is performance. The Premium RxStorage implementations have a better performance so reading and writing data is much faster especially on low-end devices. You can find a performance comparison here. Also there are additional Premium Plugins that can be used to further optimize the performance of your application like the Query Optimizer or the Sharding plugin.
    Can I get a free trial period?
    • We do not currently offer a free trial. Instead, we encourage you to explore RxDB's open-source core to evaluate the technology before purchasing the Premium Plugins.
    • Access to the Premium Plugins requires a signed licensing agreement, which safeguards both parties but also adds administrative overhead. For this reason, we cannot offer free trials or monthly subscriptions; Premium licenses are provided on an annual basis.
    Can I install/build the premium plugins in my CI?Yes, you can safely install and use the Premium Plugins in your CI without additional payment.
    Which payment methods are accepted?Stripe.com is used as payment processor so most known payment options like credit card, PayPal, SEPA transfer and others are available. A list of all options can be found here.
    Is there any tracking code inside of the premium plugins?No, the premium plugins themself do not contain any tracking code. When you build your application with RxDB and deploy it to production, it will not make requests from your users to any RxDB server.
    Can I add more Premium Packages later if I've already purchased some?Yes! You can upgrade or add additional Premium Packages at any time. When you decide to purchase more, we'll calculate a fair upgrade price, meaning you only pay the difference between your existing purchase and the new package total.
    Your previous payments are fully credited, so you never pay twice for the same plugins.
    Can I get a discount?There are multiple ways to get a discount:
    • Contribute to the RxDB github repository

      If you have made significant contributions to the RxDB github repository, you can apply for a discount depending on your contribution.

    • Get 25% off by writing about how you use RxDB

      On your company/project website, publish an article/blogpost about how you use RxDB in your project. Include how your setup looks like, how you use RxDB in that setup and what problems you had and how did you overcome them. You also need to link to the RxDB website or documentation pages.

    • Be active in the RxDB community

      If you are active in the RxDB community and discord channel by helping others out or creating educational content like videos and tutorials, feel free to apply for a discount.

    • Solve one of the free-premium-tasks

      For private personal projects there is the option to solve one of the Premium Tasks to get a free 2 years access to the Premium Plugins.

    RxDB Premium Plugins Overview

    RxStorage IndexedDB

    A storage for browsers based on IndexedDB. Has the best latency on writes and smallest build size.

    RxStorage OPFS

    Currently the RxStorage with the best data throughput that can be used in the browser. Based on the OPFS File System Access API.

    RxStorage SQLite

    A fast storage based on SQLite for Servers and Hybrid Apps. Can be used with Node.js, Electron, React Native, Capacitor.

    RxStorage SharedWorker

    A RxStorage wrapper to run the storage inside of a SharedWorker which improves the performance by taking CPU load away from the main process. Used in browsers.

    RxStorage Worker

    A RxStorage wrapper to run the storage inside of a Worker which improves the performance by taking CPU load away from the main process.

    RxStorage Sharding

    A wrapper around any other storage that improves performance by applying the sharding technique.

    RxStorage Memory Mapped

    A wrapper around any other storage that creates a mapped in-memory copy which improves performance for the initial page load time and write & read operations.

    Query Optimizer

    A tool to find the best index for a given query. You can use this during build time to find the best index and then use that index during runtime.

    RxStorage Localstorage Meta Optimizer

    A wrapper around any other storage which optimizes the initial page load one by using localstorage for meta key-value document. Only works in browsers.

    WebCrypto Encryption

    A faster and more secure encryption plugin based on the Web Crypto API.

    RxStorage Filesystem Node

    A fast RxStorage based on the Node.js Filesystem.

    Logger

    A logging plugin useful to debug performance problems and for monitoring with Application Performance Monitoring (APM) tools like Bugsnag, Datadog, Elastic, Sentry and others

    RxServer Fastify Adapter

    An adapter to use the RxServer with fastify instead of express. Used to have better performance when serving requests.

    RxServer Koa Adapter

    An adapter to use the RxServer with Koa instead of express. Used to have better performance when serving requests.

    FlexSearch

    A plugin to efficiently run local fulltext search indexing and queries.

    - - \ No newline at end of file diff --git a/docs/query-cache.html b/docs/query-cache.html deleted file mode 100644 index e44cf89975c..00000000000 --- a/docs/query-cache.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - -Efficient RxDB Queries via Query Cache | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    QueryCache

    -

    RxDB uses a QueryCache which optimizes the reuse of queries at runtime. This makes sense especially when RxDB is used in UI-applications where people move for- and backwards on different routes or pages and the same queries are used many times. Because of the event-reduce algorithm cached queries are even valuable for optimization, when changes to the database occur between now and the last execution.

    -

    Cache Replacement Policy

    -

    To not let RxDB fill up all the memory, a cache replacement policy is defined that clears up the cached queries. This is implemented as a function which runs regularly, depending on when queries are created and the database is idle. The default policy should be good enough for most use cases but defining custom ones can also make sense.

    -

    The default policy

    -

    The default policy starts cleaning up queries depending on how much queries are in the cache and how much document data they contain.

    -
      -
    • It will never uncache queries that have subscribers to their results
    • -
    • It tries to always have less than 100 queries without subscriptions in the cache.
    • -
    • It prefers to uncache queries that have never executed and are older than 30 seconds
    • -
    • It prefers to uncache queries that have not been used for longer time
    • -
    -

    Other references to queries

    -

    With JavaScript, it is not possible to count references to variables. Therefore it might happen that an uncached RxQuery is still referenced by the users code and used to get results. This should never be a problem, uncached queries must still work. Creating the same query again however, will result in having two RxQuery instances instead of one.

    -

    Using a custom policy

    -

    A cache replacement policy is a normal JavaScript function according to the type RxCacheReplacementPolicy. -It gets the RxCollection as first parameter and the QueryCache as second. Then it iterates over the cached RxQuery instances and uncaches the desired ones with uncacheRxQuery(rxQuery). When you create your custom policy, you should have a look at the default.

    -

    To apply a custom policy to a RxCollection, add the function as attribute cacheReplacementPolicy.

    -
    const collection = await myDatabase.addCollections({
    -    humans: {
    -        schema: mySchema,
    -        cacheReplacementPolicy: function(){ /* ... */ }
    -    }
    -});
    - - \ No newline at end of file diff --git a/docs/query-cache.md b/docs/query-cache.md deleted file mode 100644 index 147d795b234..00000000000 --- a/docs/query-cache.md +++ /dev/null @@ -1,40 +0,0 @@ -# Efficient RxDB Queries via Query Cache - -> Learn how RxDB's Query Cache boosts performance by reusing queries. Discover its default replacement policy and how to define your own. - -# QueryCache - -RxDB uses a `QueryCache` which optimizes the reuse of queries at runtime. This makes sense especially when RxDB is used in UI-applications where people move for- and backwards on different routes or pages and the same queries are used many times. Because of the [event-reduce algorithm](https://github.com/pubkey/event-reduce) cached queries are even valuable for optimization, when changes to the database occur between now and the last execution. - -## Cache Replacement Policy - -To not let RxDB fill up all the memory, a `cache replacement policy` is defined that clears up the cached queries. This is implemented as a function which runs regularly, depending on when queries are created and the database is idle. The default policy should be good enough for most use cases but defining custom ones can also make sense. - -## The default policy - -The default policy starts cleaning up queries depending on how much queries are in the cache and how much document data they contain. - -* It will never uncache queries that have subscribers to their results -* It tries to always have less than 100 queries without subscriptions in the cache. -* It prefers to uncache queries that have never executed and are older than 30 seconds -* It prefers to uncache queries that have not been used for longer time - -## Other references to queries - -With JavaScript, it is not possible to count references to variables. Therefore it might happen that an uncached `RxQuery` is still referenced by the users code and used to get results. This should never be a problem, uncached queries must still work. Creating the same query again however, will result in having two `RxQuery` instances instead of one. - -## Using a custom policy - -A cache replacement policy is a normal JavaScript function according to the type `RxCacheReplacementPolicy`. -It gets the `RxCollection` as first parameter and the `QueryCache` as second. Then it iterates over the cached `RxQuery` instances and uncaches the desired ones with `uncacheRxQuery(rxQuery)`. When you create your custom policy, you should have a look at the [default](https://github.com/pubkey/rxdb/blob/master/src/query-cache.ts). - -To apply a custom policy to a `RxCollection`, add the function as attribute `cacheReplacementPolicy`. - -```ts -const collection = await myDatabase.addCollections({ - humans: { - schema: mySchema, - cacheReplacementPolicy: function(){ /* ... */ } - } -}); -``` diff --git a/docs/query-optimizer.html b/docs/query-optimizer.html deleted file mode 100644 index d4b443506a1..00000000000 --- a/docs/query-optimizer.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - -Optimize Client-Side Queries with RxDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Query Optimizer

    -

    The query optimizer can be used to determine which index is the best to use for a given query. -Because RxDB is used in client side applications, it cannot do any background checks or measurements to optimize the query plan because that would cause significant performance problems.

    -
    note

    The query optimizer is part of the RxDB Premium 👑 plugin that must be purchased. It is not part of the default RxDB module.

    -

    Usage

    -
    import {
    -    findBestIndex
    -} from 'rxdb-premium/plugins/query-optimizer';
    - 
    -import { 
    -    getRxStorageIndexedDB
    -} from 'rxdb-premium/plugins/indexeddb';
    - 
    -const bestIndexes = await findBestIndex({
    -    schema: myRxJsonSchema,
    -    /**
    -     * In this example we use the IndexedDB RxStorage,
    -     * but any other storage can be used for testing.
    -     */
    -    storage: getRxStorageIndexedDB(),
    -    /**
    -     * Multiple queries can be optimized at the same time
    -     * which decreases the overall runtime.
    -     */
    -    queries: {
    -        /**
    -         * Queries can be mapped by a query id,
    -         * here we use myFirstQuery as query id.
    -         */
    -        myFirstQuery: {
    -            selector: {
    -                age: {
    -                    $gt: 10
    -                }
    -            },
    -        },
    -        mySecondQuery: {
    -            selector: {
    -                age: {
    -                    $gt: 10
    -                },
    -                lastName: {
    -                    $eq: 'Nakamoto'
    -                }
    -            },
    -        }
    -    },
    -    testData: [/** data for the documents. **/]
    -});
    - 
    -

    Important details

    -
      -
    • -

      This is a build time tool. You should use it to find the best indexes for your queries during build time. Then you store these results and you application can use the best indexes during run time.

      -
    • -
    • -

      It makes no sense to run time optimization with a different RxStorage (+settings) that what you use in production. The result of the query optimizer is heavily dependent on the RxStorage and JavaScript runtime. For example it makes no sense to run the optimization in Node.js and then use the optimized indexes in the browser.

      -
    • -
    • -

      It is very important that you use production like testData. Finding the best index heavily depends on data distribution and amount of stored/queried documents. For example if you store and query users with an age field, it makes no sense to just use a random number for the age because in production the age of your users is not equally distributed.

      -
    • -
    • -

      The higher you set runs, the more test cycles will be performed and the more significant will be the time measurements which leads to a better index selection.

      -
    • -
    - - \ No newline at end of file diff --git a/docs/query-optimizer.md b/docs/query-optimizer.md deleted file mode 100644 index 9d14c851172..00000000000 --- a/docs/query-optimizer.md +++ /dev/null @@ -1,72 +0,0 @@ -# Optimize Client-Side Queries with RxDB - -> Harness real-world data to fine-tune queries. The build-time RxDB Optimizer finds the perfect index, boosting query speed in any environment. - -# Query Optimizer - -The query optimizer can be used to determine which index is the best to use for a given query. -Because RxDB is used in client side applications, it cannot do any background checks or measurements to optimize the query plan because that would cause significant performance problems. - -:::note -The query optimizer is part of the [RxDB Premium 👑](/premium/) plugin that must be purchased. It is not part of the default RxDB module. -::: - -## Usage - -```ts -import { - findBestIndex -} from 'rxdb-premium/plugins/query-optimizer'; - -import { - getRxStorageIndexedDB -} from 'rxdb-premium/plugins/indexeddb'; - -const bestIndexes = await findBestIndex({ - schema: myRxJsonSchema, - /** - * In this example we use the IndexedDB RxStorage, - * but any other storage can be used for testing. - */ - storage: getRxStorageIndexedDB(), - /** - * Multiple queries can be optimized at the same time - * which decreases the overall runtime. - */ - queries: { - /** - * Queries can be mapped by a query id, - * here we use myFirstQuery as query id. - */ - myFirstQuery: { - selector: { - age: { - $gt: 10 - } - }, - }, - mySecondQuery: { - selector: { - age: { - $gt: 10 - }, - lastName: { - $eq: 'Nakamoto' - } - }, - } - }, - testData: [/** data for the documents. **/] -}); - -``` - -## Important details - -- This is a build time tool. You should use it to find the best indexes for your queries during **build time**. Then you store these results and you application can use the best indexes during **run time**. - -- It makes no sense to run time optimization with a different `RxStorage` (+settings) that what you use in production. The result of the query optimizer is heavily dependent on the RxStorage and JavaScript runtime. For example it makes no sense to run the optimization in Node.js and then use the optimized indexes in the browser. - -- It is very important that you use **production like** `testData`. Finding the best index heavily depends on data distribution and amount of stored/queried documents. For example if you store and query users with an `age` field, it makes no sense to just use a random number for the age because in production the `age` of your users is not equally distributed. - -- The higher you set `runs`, the more test cycles will be performed and the more **significant** will be the time measurements which leads to a better index selection. diff --git a/docs/quickstart.html b/docs/quickstart.html deleted file mode 100644 index a8f01eb8dda..00000000000 --- a/docs/quickstart.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - -🚀 Quickstart | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -

    RxDB Quickstart

    -

    Welcome to the RxDB Quickstart. Here we'll learn how to create a simple real-time app with the RxDB database that is able to store and query data persistently in a browser and does realtime updates to the UI on changes.

    -
    -
    JavaScript Embedded Database
    -
    -
    1

    Installation

    Install the RxDB library and the RxJS dependency:

    npm install rxdb rxjs
    2

    Pick a Storage

    RxDB is able to run in a wide range of JavaScript runtimes like browsers, mobile apps, desktop and servers. Therefore different storage engines exist that ensure the best performance depending on where RxDB is used.

    Use this for the simplest browser setup and very small datasets. It has a tiny bundle size and works anywhere localStorage is available, but is not optimized for large data or heavy writes.

    import {
    -    getRxStorageLocalstorage
    -} from 'rxdb/plugins/storage-localstorage';
    - 
    -let storage = getRxStorageLocalstorage();
    Which storage should I use?

    RxDB provides a wide range of storages depending on your JavaScript runtime and performance needs.

    3

    Dev-Mode

    When you use RxDB in development, you should always enable the dev-mode plugin, which adds helpful checks and validations, and tells you if you do something wrong.

    import { addRxPlugin } from 'rxdb/plugins/core';
    -import { RxDBDevModePlugin } from 'rxdb/plugins/dev-mode';
    - 
    -addRxPlugin(RxDBDevModePlugin);
    4

    Schema Validation

    Schema validation is required when using dev-mode and recommended (but optional) in production. Wrap your storage with the AJV schema validator to ensure all documents match your schema before being saved.

    import { wrappedValidateAjvStorage } from 'rxdb/plugins/validate-ajv';
    - 
    -storage = wrappedValidateAjvStorage({ storage });
    5

    Create a Database

    A database is the top‑level container in RxDB, responsible for managing collections, coordinating persistence, and providing reactive change streams.

    import { createRxDatabase } from 'rxdb/plugins/core';
    - 
    -const myDatabase = await createRxDatabase({
    -  name: 'mydatabase',
    -  storage: storage
    -});
    6

    Add a Collection

    An RxDatabase contains RxCollections for storing and querying data. A collection is similar to an SQL table, and individual records are stored in the collection as JSON documents. An RxDatabase can have as many collections as you need. -Add a collection with a schema to the database:

    await myDatabase.addCollections({
    -    // name of the collection
    -    todos: {
    -        // we use the JSON-schema standard
    -        schema: {
    -            version: 0,
    -            primaryKey: 'id',
    -            type: 'object',
    -            properties: {
    -                id: {
    -                    type: 'string',
    -                    maxLength: 100 // <- the primary key must have maxLength
    -                },
    -                name: {
    -                    type: 'string'
    -                },
    -                done: {
    -                    type: 'boolean'
    -                },
    -                timestamp: {
    -                    type: 'string',
    -                    format: 'date-time'
    -                }
    -            },
    -            required: ['id', 'name', 'done', 'timestamp']
    -        }
    -    }
    -});
    7

    Insert a document

    Now that we have an RxCollection we can store some documents in it.

    const myDocument = await myDatabase.todos.insert({
    -    id: 'todo1',
    -    name: 'Learn RxDB',
    -    done: false,
    -    timestamp: new Date().toISOString()
    -});
    8

    Run a Query

    Execute a query that returns all found documents once:

    const foundDocuments = await myDatabase.todos.find({
    -    selector: {
    -        done: {
    -            $eq: false
    -        }
    -    }
    -}).exec();
    9

    Update a Document

    In the first found document, set done to true:

    const firstDocument = foundDocuments[0];
    -await firstDocument.patch({
    -    done: true
    -});
    10

    Delete a document

    Delete the document so that it can no longer be found in queries:

    await firstDocument.remove();
    11

    Observe a Query

    Subscribe to data changes so that your UI is always up-to-date with the data stored on disk. RxDB allows you to subscribe to data changes even when the change happens in another part of your application, another browser tab, or during database replication/synchronization:

    const observable = myDatabase.todos.find({
    -    selector: {
    -        done: {
    -            $eq: false
    -        }
    -    }
    -}).$ // get the observable via RxQuery.$;
    -observable.subscribe(notDoneDocs => {
    -    console.log('Currently have ' + notDoneDocs.length + ' things to do');
    -    // -> here you would re-render your app to show the updated document list
    -});
    12

    Observe a Document value

    You can also subscribe to the fields of a single RxDocument. Add the $ sign to the desired field and then subscribe to the returned observable.

    myDocument.done$.subscribe(isDone => {
    -    console.log('done: ' + isDone);
    -});
    13

    Sync the Client

    RxDB has multiple replication plugins to replicate database state with a server.

    import {
    -  replicateHTTP,
    -  pullQueryBuilderFromRxSchema,
    -} from "rxdb/plugins/replication-http";
    - 
    -replicateHTTP({
    -  collection: db.todos,
    -  push: {
    -    handler: async (rows) => {
    -      return fetch("https:/example.com/api/todos/push", {
    -        method: "POST",
    -        headers: { "Content-Type": "application/json" },
    -        body: JSON.stringify(rows),
    -      }).then((res) => res.json());
    -    },
    -  },
    - 
    -  pull: {
    -    handler: async (lastCheckpoint) => {
    -      return fetch(
    -        "https://example.com/api/todos/pull?" +
    -        new URLSearchParams({
    -          checkpoint: JSON.stringify(lastCheckpoint)
    -        }),
    -      ).then((res) => res.json());
    -    },
    -  },
    -});
    -

    Next steps

    -

    You are now ready to dive deeper into RxDB.

    -
      -
    • Start reading the full documentation here.
    • -
    • There is a full implementation of the quickstart guide so you can clone that repository and play with the code.
    • -
    • For frameworks and runtimes like Angular, React Native and others, check out the list of example implementations.
    • -
    • Also please continue reading the documentation, join the community on our Discord chat, and star the GitHub repo.
    • -
    • If you are using RxDB in a production environment and are able to support its continued development, please take a look at the 👑 Premium package which includes additional plugins and utilities.
    • -
    - - \ No newline at end of file diff --git a/docs/quickstart.md b/docs/quickstart.md deleted file mode 100644 index a881d0890da..00000000000 --- a/docs/quickstart.md +++ /dev/null @@ -1,370 +0,0 @@ -# 🚀 Quickstart - -> Learn how to build a realtime app with RxDB. Follow this quickstart for setup, schema creation, data operations, and real-time syncing. - -import {Steps} from '@site/src/components/steps'; -import {TriggerEvent} from '@site/src/components/trigger-event'; -import {Tabs} from '@site/src/components/tabs'; -import {NavbarDropdownSyncList} from '@site/src/components/navbar-dropdowns'; - - - -# RxDB Quickstart - -Welcome to the RxDB Quickstart. Here we'll learn how to create a simple real-time app with the RxDB database that is able to store and query data persistently in a browser and does realtime updates to the UI on changes. - -
    - - - -
    - - - -### Installation -Install the RxDB library and the RxJS dependency: - -```bash -npm install rxdb rxjs -``` - -### Pick a Storage - -RxDB is able to run in a wide range of JavaScript runtimes like browsers, mobile apps, desktop and servers. Therefore different storage engines exist that ensure the best performance depending on where RxDB is used. - - - -#### LocalStorage - -Use this for the simplest browser setup and very small datasets. It has a tiny bundle size and works anywhere [localStorage](./articles/localstorage.md) is available, but is not optimized for large data or heavy writes. - -```ts -import { - getRxStorageLocalstorage -} from 'rxdb/plugins/storage-localstorage'; - -let storage = getRxStorageLocalstorage(); -``` - -#### IndexedDB 👑 - -The premium [IndexedDB storage](./rx-storage-indexeddb.md) is a high-performance, browser-native storage with a smaller bundle and faster startup compared to Dexie-based IndexedDB. Recommended when you have [👑 premium](/premium/) access and care about performance and bundle size. - -```ts -import { - getRxStorageIndexedDB -} from 'rxdb-premium/plugins/storage-indexeddb'; - -let storage = getRxStorageDexie(); -``` - -#### Dexie.js - -[Dexie.js](./rx-storage-dexie.md) is a friendly wrapper around IndexedDB and is a great default for browser apps when you don’t use premium. It’s reliable, works well for medium-sized datasets, and is free to use. - -```ts -import { - getRxStorageDexie -} from 'rxdb/plugins/storage-dexie'; - -let storage = getRxStorageDexie(); -``` - -#### SQLite - -[SQLite](./rx-storage-sqlite.md) is ideal for React Native, Capacitor, Electron, Node.js and other hybrid or native environments. It gives you a fast, durable database on disk. Use the 👑 premium storage for production; a trial version exists for quick experimentation. - -**Premium SQLite (Node.js example)** - -```ts -import { - getRxStorageSQLite, - getSQLiteBasicsNode -} from 'rxdb-premium/plugins/storage-sqlite'; - -// Provide the sqliteBasics adapter for your runtime, e.g. Node.js, React Native, etc. -// For example in Node.js you would derive sqliteBasics from a sqlite3-compatible library: -import sqlite3 from 'sqlite3'; - -const storage = getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsNode(sqlite3) -}); -``` - -**SQLite trial storage (Node.js, free)** - -```ts -import { - getRxStorageSQLiteTrial, - getSQLiteBasicsNodeNative -} from 'rxdb/plugins/storage-sqlite'; -import { DatabaseSync } from 'node:sqlite'; - -const storage = getRxStorageSQLiteTrial({ -sqliteBasics: getSQLiteBasicsNodeNative(DatabaseSync) -}); -``` - -#### And more... - -There are many more storages such as [MongoDB](./rx-storage-mongodb.md), [DenoKV](./rx-storage-denokv.md), [Filesystem](./rx-storage-filesystem-node.md), [Memory](./rx-storage-memory.md), [Memory-Mapped](./rx-storage-memory-mapped.md), [FoundationDB](./rx-storage-foundationdb.md) and more. [Browse the full list of storages](/rx-storage.html). - - - -
    - Which storage should I use? - - RxDB provides a wide range of storages depending on your JavaScript runtime and performance needs. - - In the Browser: Use the LocalStorage storage for simple setup and small build size. For bigger datasets, use either the dexie.js storage (free) or the IndexedDB RxStorage if you have 👑 premium access which is a bit faster and has a smaller build size. - In Electron and ReactNative: Use the SQLite RxStorage if you have 👑 premium access or the trial-SQLite RxStorage for tryouts. - In Capacitor: Use the SQLite RxStorage if you have 👑 premium access, otherwise use the localStorage storage. - - -
    - -### Dev-Mode - -When you use RxDB in development, you should always enable the [dev-mode plugin](./dev-mode.md), which adds helpful checks and validations, and tells you if you do something wrong. - -```ts -import { addRxPlugin } from 'rxdb/plugins/core'; -import { RxDBDevModePlugin } from 'rxdb/plugins/dev-mode'; - -addRxPlugin(RxDBDevModePlugin); -``` - -### Schema Validation - -[Schema validation](./schema-validation.md) is required when using dev-mode and recommended (but optional) in production. Wrap your storage with the AJV schema validator to ensure all documents match your schema before being saved. - -```ts -import { wrappedValidateAjvStorage } from 'rxdb/plugins/validate-ajv'; - -storage = wrappedValidateAjvStorage({ storage }); -``` - -### Create a Database - -A database is the top‑level container in RxDB, responsible for managing collections, coordinating persistence, and providing reactive change streams. - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; - -const myDatabase = await createRxDatabase({ - name: 'mydatabase', - storage: storage -}); -``` - -### Add a Collection - -An RxDatabase contains [RxCollection](./rx-collection.md)s for storing and querying data. A collection is similar to an SQL table, and individual records are stored in the collection as JSON documents. An [RxDatabase](./rx-database.md) can have as many collections as you need. -Add a collection with a [schema](./rx-schema.md) to the database: - -```ts -await myDatabase.addCollections({ - // name of the collection - todos: { - // we use the JSON-schema standard - schema: { - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 // <- the primary key must have maxLength - }, - name: { - type: 'string' - }, - done: { - type: 'boolean' - }, - timestamp: { - type: 'string', - format: 'date-time' - } - }, - required: ['id', 'name', 'done', 'timestamp'] - } - } -}); -``` - -### Insert a document - -Now that we have an RxCollection we can store some [documents](./rx-document.md) in it. - -```ts -const myDocument = await myDatabase.todos.insert({ - id: 'todo1', - name: 'Learn RxDB', - done: false, - timestamp: new Date().toISOString() -}); -``` - -### Run a Query - -Execute a [query](./rx-query.md) that returns all found documents once: - -```ts -const foundDocuments = await myDatabase.todos.find({ - selector: { - done: { - $eq: false - } - } -}).exec(); -``` - -### Update a Document - -In the first found document, set `done` to `true`: - -```ts -const firstDocument = foundDocuments[0]; -await firstDocument.patch({ - done: true -}); -``` - -### Delete a document - -Delete the document so that it can no longer be found in queries: - -```ts -await firstDocument.remove(); -``` - -### Observe a Query - -Subscribe to data changes so that your UI is always up-to-date with the data stored on disk. RxDB allows you to subscribe to data changes even when the change happens in another part of your application, another browser tab, or during database [replication/synchronization](./replication.md): - -```ts -const observable = myDatabase.todos.find({ - selector: { - done: { - $eq: false - } - } -}).$ // get the observable via RxQuery.$; -observable.subscribe(notDoneDocs => { - console.log('Currently have ' + notDoneDocs.length + ' things to do'); - // -> here you would re-render your app to show the updated document list -}); -``` - -### Observe a Document value - -You can also subscribe to the fields of a single RxDocument. Add the `$` sign to the desired field and then subscribe to the returned observable. - -```ts -myDocument.done$.subscribe(isDone => { - console.log('done: ' + isDone); -}); -``` - -### Sync the Client - -RxDB has multiple [replication plugins](./replication.md) to replicate database state with a server. - - - -#### HTTP - -```ts -import { - replicateHTTP, - pullQueryBuilderFromRxSchema, -} from "rxdb/plugins/replication-http"; - -replicateHTTP({ - collection: db.todos, - push: { - handler: async (rows) => { - return fetch("https:/example.com/api/todos/push", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(rows), - }).then((res) => res.json()); - }, - }, - - pull: { - handler: async (lastCheckpoint) => { - return fetch( - "https://example.com/api/todos/pull?" + - new URLSearchParams({ - checkpoint: JSON.stringify(lastCheckpoint) - }), - ).then((res) => res.json()); - }, - }, -}); -``` - -#### GraphQL - -```ts -import { replicateGraphQL } from 'rxdb/plugins/replication-graphql'; - -replicateGraphQL({ - collection: db.todos, - url: 'https://example.com/graphql', - push: { batchSize: 50 }, - pull: { batchSize: 50 } -}); -``` - -#### WebRTC (P2P) - -The easiest way to replicate data between your clients' devices is the [WebRTC replication plugin](./replication-webrtc.md) that replicates data between devices without a centralized server. This makes it easy to try out replication without having to host anything: - -```ts -import { - replicateWebRTC, - getConnectionHandlerSimplePeer -} from 'rxdb/plugins/replication-webrtc'; -replicateWebRTC({ - collection: myDatabase.todos, - connectionHandlerCreator: getConnectionHandlerSimplePeer({}), - topic: '', // <- set any app-specific room id here. - secret: 'mysecret', - pull: {}, - push: {} -}) -``` - -#### CouchDB - -```ts -import { replicateCouchDB } from 'rxdb/plugins/replication-couchdb'; - -replicateCouchDB({ - collection: db.todos, - url: 'http://example.com/todos/', - push: {}, - pull: {} -}); -``` - -#### And more... - -Explore all [replication plugins](/replication.html), including advanced conflict handling and custom protocols. - - - - -
    - -## Next steps - -You are now ready to dive deeper into RxDB. -- Start reading the full documentation [here](./install.md). -- There is a full implementation of the [quickstart guide](https://github.com/pubkey/rxdb-quickstart) so you can clone that repository and play with the code. -- For frameworks and runtimes like Angular, React Native and others, check out the list of [example implementations](https://github.com/pubkey/rxdb/tree/master/examples). -- Also please continue reading the documentation, join the community on our [Discord chat](/chat/), and star the [GitHub repo](https://github.com/pubkey/rxdb). -- If you are using RxDB in a production environment and are able to support its continued development, please take a look at the [👑 Premium package](/premium/) which includes additional plugins and utilities. diff --git a/docs/react-native-database.html b/docs/react-native-database.html deleted file mode 100644 index 9f1c322dfaa..00000000000 --- a/docs/react-native-database.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - -React Native Database - Sync & Store Like a Pro | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    React Native Database

    -

    React Native provides a cross-platform JavaScript runtime that runs on different operating systems like Android, iOS, Windows and others. Mostly it is used to create hybrid Apps that run on mobile devices at Android (Google) and iOS (Apple).

    -

    In difference to the JavaScript runtime of browsers, React Native does not support all HTML5 APIs and so it is not possible to use browser storage possibilities like localstorage, cookies, WebSQL or IndexedDB. -Instead a different storage solution must be chosen that does not come directly with React Native itself but has to be installed as a library or plugin.

    -

    React Native

    -

    Database Solutions for React-Native

    -

    There are multiple database solutions that can be used with React Native. While I would recommend to use RxDB for most use cases, it is still helpful to learn about other alternatives.

    -
    RxDB
    -

    AsyncStorage

    -

    AsyncStorage is a key->value storage solution that works similar to the browsers localstorage API. The big difference is that access to the AsyncStorage is not a blocking operation but instead everything is Promise based. This is a big benefit because long running writes and reads will not block your JavaScript process which would cause a laggy user interface.

    -
    /**
    - * Because it is Promise-based,
    - * you have to 'await' the call to getItem()
    - */
    -await setItem('myKey', 'myValue');
    -const value = await AsyncStorage.getItem('myKey');
    -

    AsyncStorage was originally included in React Native itself. But it was deprecated by the React Native Team which recommends to use a community based package instead. There is a community fork of AsyncStorage that is actively maintained and open source.

    -

    AsyncStorage is fine when only a small amount of data needs to be stored and when no query capabilities besides the key-access are required. Complex queries or features are not supported which makes AsyncStorage not suitable for anything more than storing simple user settings data.

    -

    SQLite

    -

    SQLite

    -

    SQLite is a SQL based relational database written in C that was crafted to be embed inside of applications. Operations are written in the SQL query language and SQLite generally follows the PostgreSQL syntax.

    -

    To use SQLite in React Native, you first have to include the SQLite library itself as a plugin. There a different project out there that can be used, but I would recommend to use the react-native-quick-sqlite project.

    -

    First you have to install the library into your React Native project via npm install react-native-quick-sqlite. -In your code you can then import the library and create a database connection:

    -
    import {open} from 'react-native-quick-sqlite';
    -const db = open('myDb.sqlite');
    -

    Notice that SQLite is a file based database where all data is stored directly in the filesystem of the OS. Therefore to create a connection, you have to provide a filename.

    -

    With the open connection you can then run SQL queries:

    -
    let { rows } = db.execute('SELECT somevalue FROM sometable');
    -

    If that does not work for you, you might want to try the react-native-sqlite-storage project instead which is also very popular.

    -

    Downsides of Using SQLite in UI-Based Apps

    -

    While SQLite is reliable and well-tested, it has several shortcomings when it comes to using it directly in UI-based React Native applications:

    -
      -
    • Lack of Observability: Out of the box, SQLite does not offer a straightforward way to observe queries or document fields. This means that implementing real-time data updates in your UI requires additional layers or libraries.
    • -
    • Bridging Overhead: Each query or data operation must go through the React Native bridge to access the native SQLite module. This can introduce performance bottlenecks or responsiveness issues, especially for large or complex data operations.
    • -
    • No Built-In Replication: SQLite on its own is not designed for syncing data across multiple devices or with a backend. If your app requires multi-device data syncing or offline-first features, additional tools or a custom solution are necessary.
    • -
    • Version Management: Handling schema changes often requires a custom migration process. If your data structure evolves frequently, managing these migrations can be cumbersome.
    • -
    -

    Overall, SQLite can be a good solution for straightforward, local-only data storage where complex real-time features or synchronization are not needed. For more advanced requirements, like reactive UI updates or multi-client data replication, you'll likely want a more feature-rich solution.

    -

    PouchDB

    -

    PouchDB

    -

    PouchDB is a JavaScript NoSQL database that follows the API of the Apache CouchDB server database. -The core feature of PouchDB is the ability to do a two-way replication with any CouchDB compliant endpoint. -While PouchDB is pretty mature, it has some drawbacks that blocks it from being used in a client-side React Native application. For example it has to store all documents states over time which is required to replicate with CouchDB. Also it is not easily possible to fully purge documents and so it will fill up disc space over time. A big problem is also that PouchDB is not really maintained and major bugs like wrong query results are not fixed anymore. The performance of PouchDB is a general bottleneck which is caused by how it has to store and fetch documents while being compliant to CouchDB. The only real reason to use PouchDB in React Native, is when you want to replicate with a CouchDB or Couchbase server.

    -

    Because PouchDB is based on an adapter system for storage, there are two options to use it with React Native:

    - -

    Because the asyncstorage adapter is no longer maintained, it is recommended to use the native-sqlite adapter:

    -

    First you have to install the adapter and other dependencies via npm install pouchdb-adapter-react-native-sqlite react-native-quick-sqlite react-native-quick-websql.

    -

    Then you have to craft a custom PouchDB class that combines these plugins:

    -
    import 'react-native-get-random-values';
    -import PouchDB from 'pouchdb-core';
    -import HttpPouch from 'pouchdb-adapter-http';
    -import replication from 'pouchdb-replication';
    -import mapreduce from 'pouchdb-mapreduce';
    -import SQLiteAdapterFactory from 'pouchdb-adapter-react-native-sqlite';
    -import WebSQLite from 'react-native-quick-websql';
    - 
    -const SQLiteAdapter = SQLiteAdapterFactory(WebSQLite);
    -export default PouchDB.plugin(HttpPouch)
    -  .plugin(replication)
    -  .plugin(mapreduce)
    -  .plugin(SQLiteAdapter);
    -

    This can then be used to create a PouchDB database instance which can store and query documents:

    -
    const db = new PouchDB('mydb.db', {
    -  adapter: 'react-native-sqlite'
    -});
    -

    RxDB

    -
    RxDB
    -

    RxDB is an local-first, NoSQL-database for JavaScript applications. It is reactive which means that you can not only query the current state, but subscribe to all state changes like the result of a query or even a single field of a document. This is great for UI-based realtime applications in a way that makes it easy to develop realtime applications like what you need in React Native.

    -

    Key benefits of RxDB include:

    -
      -
    • Observability and Real-Time Queries: Automatic UI updates when underlying data changes, making it much simpler to build responsive, reactive apps.
    • -
    • Offline-First and Sync: Built-in support for syncing with CouchDB, or via GraphQL replication, allowing your app to work offline and seamlessly sync when online. It is easy to make the RxDB replication compatible with anything that supports HTTP.
    • -
    • Encryption and Data Security: RxDB supports field-level encryption and a robust plugin ecosystem for compression and attachments.
    • -
    • Data Modeling and Ease of Use: Offers a schema-based approach that helps catch invalid data early and ensures consistency.
    • -
    • Performance: Optimized for storing and querying large amounts of data on mobile devices.
    • -
    -

    There are multiple ways to use RxDB in React Native:

    - -

    It is recommended to use the SQLite RxStorage because it has the best performance and is the easiest to set up. However it is part of the 👑 Premium Plugins which must be purchased, so to try out RxDB with React Native, you might want to use the memory storage first. Later you can replace it with the SQLite storage by just changing two lines of configuration.

    -

    First you have to install all dependencies via npm install rxdb rxjs rxdb-premium react-native-quick-sqlite. -Then you can assemble the RxStorage and create a database with it:

    -
    1

    Import RxDB and SQLite

    import {
    -  createRxDatabase
    -} from 'rxdb';
    -import { open } from 'react-native-quick-sqlite';
    import {
    -    getRxStorageSQLiteTrial,
    -    getSQLiteBasicsCapacitor
    -} from 'rxdb/plugins/storage-sqlite';
    2

    Create a database

    const myRxDatabase = await createRxDatabase({
    -    // Instead of a simple name,
    -    // you can use a folder path to determine the database location 
    -    name: 'exampledb',
    -    multiInstance: false, // <- Set this to false when using RxDB in React Native
    -    storage: getRxStorageSQLite({
    -        sqliteBasics: getSQLiteBasicsQuickSQLite(open)
    -    })
    -});
    - 
    3

    Add a Collection

    const collections = await myRxDatabase.addCollections({
    -    humans: {
    -        schema: {
    -            version: 0,
    -            type: 'object',
    -            primaryKey: 'id',
    -            properties: {
    -                id: { type: 'string', maxLength: 100 },
    -                name: { type: 'string' },
    -                age: { type: 'number' }
    -              },
    -            required: ['id', 'name']
    -        }
    -    }
    -});
    4

    Insert a Document

    await collections.humans.insert({id: 'foo', name: 'bar'});
    - 
    5

    Run a Query

    const result = await collections.humans.find({
    -    selector: {
    -        name: 'bar'
    -    }
    -}).exec();
    - 
    6

    Observe a Query

    await collections.humans.find({
    -    selector: {
    -        name: 'bar'
    -    }
    -}).$.subscribe(result => {/* ... */});
    -

    Using the SQLite RxStorage is pretty fast, which is shown in the performance comparison. -To learn more about using RxDB with React Native, you might want to check out this example project.

    -

    Also RxDB provides many other features like encryption or compression. You can even store binary data as attachments or use RxDB as an ORM in React Native.

    -

    Realm

    -

    MongoDB Realm

    -

    Realm is another database solution that is particularly popular in the mobile world. Originally an independent project, Realm is now owned by MongoDB, and has seen deeper integration with MongoDB services over time.

    -

    Pros:

    -
      -
    • Fast, object-based database approach with an easy data model.
    • -
    • Historically known for good performance and a simple, user-friendly API.
    • -
    -

    Downsides:

    -
      -
    • Forced MongoDB Cloud Usage: Realm Sync is now tightly coupled with MongoDB Realm Cloud. If you want to use their full sync or advanced features, you are essentially locked into MongoDB's ecosystem, which can be a downside if you need on-premise or custom hosting.
    • -
    • Missing or Limited Features: While Realm covers many basic needs, some developers find that advanced queries or certain offline-first features are not as robust or flexible as other solutions.
    • -
    • Vendor Lock-In: If you rely heavily on Realm Sync, migrating away from MongoDB's cloud can be difficult because the sync logic and data format are tightly integrated.
    • -
    • Community Concerns: Since the MongoDB acquisition, some worry about Realm's open-source future and whether large changes or new features will remain community-friendly.
    • -
    -

    Although Realm can be a good solution when used purely as a local database, if you plan on syncing data across clients or want to avoid cloud vendor lock-in, you should consider carefully how MongoDB's ownership might affect your long-term plans.

    -

    Firebase / Firestore

    -

    Firebase

    -

    Firestore is a cloud based database technology that stores data on clients devices and replicates it with the Firebase cloud service that is run by google. It has many features like observability and authentication. -The main feature lacking is the non-complete offline first support because clients cannot start the application while being offline because then the authentication does not work. After they are authenticated, being offline is no longer a problem. -Also using firestore creates a vendor lock-in because it is not possible to replicate with a custom self hosted backend.

    -

    To get started with Firestore in React Native, it is recommended to use the React Native Firebase open-source project.

    -

    Summary

    -
    CharacteristicAsyncStorageSQLitePouchDBRxDB RxDBRealmFirestore
    Database TypeKey-value store, no advanced queriesEmbedded SQL engine in a local fileNoSQL doc store, revision-basedNoSQL doc-based (JSON)Object-based (MongoDB-owned)NoSQL doc-based, cloud by Google
    Query ModelgetItem/setItem onlyStandard SQL statementsMap/reduce or basic Mango queriesJSON-based query language, optional indexesObject-level queries, sync with MongoDB RealmDocument queries, limited advanced ops
    ObservabilityNone built-inNo direct reactivityChanges feed from Couch-style backendBuilt-in reactive queries, UI auto-updatesLocal reactivity, or realm sync (cloud)Real-time snapshots, partial offline
    Offline ReplicationNoneNone by defaultCouchDB-compatible syncBuilt-in sync (HTTP, GraphQL, CouchDB, etc.)Realm Cloud sync onlyBasic offline caching, re-auth needed
    PerformanceFine for small keys/valuesGenerally good; bridging overheadOK for mid data sets; can bloat over timeVaries by storage; Dexie/SQLite w/ compression can be fastTypically fast on mobileGood read-heavy perf; can be rate-limited, costly
    Schema HandlingNoneSQL schema, migrations neededNo formal schema, doc-basedOptional JSON-Schema, typed checks, compressionDeclarative schema, migration neededNo strict schema; rules in console mostly
    Usage CasesStore small user settingsLocal structured data, moderate queriesBasic doc store, synergy with CouchDBReactive offline-first for large or dynamic dataLocal object DB, locked to MongoDB realm syncReal-time Google backend, partial offline, vendor lock-in
    -

    Follow up

    -
    - - \ No newline at end of file diff --git a/docs/react-native-database.md b/docs/react-native-database.md deleted file mode 100644 index bd53d128a1b..00000000000 --- a/docs/react-native-database.md +++ /dev/null @@ -1,292 +0,0 @@ -# React Native Database - Sync & Store Like a Pro - -> Discover top React Native local database solutions - AsyncStorage, SQLite, RxDB, and more. Build offline-ready apps for iOS, Android, and Windows with easy sync. - -import {Steps} from '@site/src/components/steps'; -import {Tabs} from '@site/src/components/tabs'; - -# React Native Database - -React Native provides a cross-platform JavaScript runtime that runs on different operating systems like Android, iOS, Windows and others. Mostly it is used to create hybrid Apps that run on mobile devices at Android (Google) and iOS (Apple). - -In difference to the JavaScript runtime of browsers, React Native does not support all HTML5 APIs and so it is not possible to use browser storage possibilities like localstorage, cookies, WebSQL or IndexedDB. -Instead a different storage solution must be chosen that does not come directly with React Native itself but has to be installed as a library or plugin. - - - -## Database Solutions for React-Native - -There are multiple database solutions that can be used with React Native. While I would recommend to use [RxDB](./) for most use cases, it is still helpful to learn about other alternatives. - -
    - - - -
    - -### AsyncStorage - -AsyncStorage is a key->value storage solution that works similar to the browsers [localstorage API](./articles/localstorage.md). The big difference is that access to the AsyncStorage is not a blocking operation but instead everything is `Promise` based. This is a big benefit because long running writes and reads will not block your JavaScript process which would cause a laggy user interface. - -```ts -/** - * Because it is Promise-based, - * you have to 'await' the call to getItem() - */ -await setItem('myKey', 'myValue'); -const value = await AsyncStorage.getItem('myKey'); -``` - -AsyncStorage was originally included in [React Native itself](https://reactnative.dev/docs/asyncstorage). But it was deprecated by the React Native Team which recommends to use a community based package instead. There is a [community fork of AsyncStorage](https://github.com/react-native-async-storage/async-storage) that is actively maintained and open source. - -AsyncStorage is fine when only a small amount of data needs to be stored and when no query capabilities besides the key-access are required. Complex queries or features are not supported which makes AsyncStorage not suitable for anything more than storing simple user settings data. - -### SQLite - - - -SQLite is a SQL based relational database written in C that was crafted to be embed inside of applications. Operations are written in the SQL query language and SQLite generally follows the PostgreSQL syntax. - -To use SQLite in React Native, you first have to include the SQLite library itself as a plugin. There a different project out there that can be used, but I would recommend to use the [react-native-quick-sqlite](https://github.com/ospfranco/react-native-quick-sqlite) project. - -First you have to install the library into your React Native project via `npm install react-native-quick-sqlite`. -In your code you can then import the library and create a database connection: - -```ts -import {open} from 'react-native-quick-sqlite'; -const db = open('myDb.sqlite'); -``` - -Notice that SQLite is a file based database where all data is stored directly in the filesystem of the OS. Therefore to create a connection, you have to provide a filename. - -With the open connection you can then run SQL queries: - -```ts -let { rows } = db.execute('SELECT somevalue FROM sometable'); -``` - -If that does not work for you, you might want to try the [react-native-sqlite-storage](https://github.com/andpor/react-native-sqlite-storage) project instead which is also very popular. - -#### Downsides of Using SQLite in UI-Based Apps - -While SQLite is reliable and well-tested, it has several shortcomings when it comes to using it directly in UI-based React Native applications: - -- **Lack of Observability**: Out of the box, SQLite does not offer a straightforward way to observe queries or document fields. This means that implementing [real-time data updates](./articles/realtime-database.md) in your UI requires additional layers or libraries. -- **Bridging Overhead**: Each query or data operation must go through the React Native bridge to access the native SQLite module. This can introduce performance bottlenecks or responsiveness issues, especially for large or complex data operations. -- **No Built-In Replication**: SQLite on its own is not designed for syncing data across multiple devices or with a backend. If your app requires multi-device data syncing or [offline-first](./offline-first.md) features, additional tools or a custom solution are necessary. -- **Version Management**: Handling schema changes often requires a custom migration process. If your data structure evolves frequently, managing these migrations can be cumbersome. - -Overall, SQLite can be a good solution for straightforward, local-only data storage where complex real-time features or synchronization are not needed. For more advanced requirements, like reactive UI updates or multi-client [data replication](./replication.md), you'll likely want a more feature-rich solution. - -### PouchDB - - - -PouchDB is a JavaScript NoSQL database that follows the API of the [Apache CouchDB](https://couchdb.apache.org/) server database. -The core feature of PouchDB is the ability to do a two-way replication with any CouchDB compliant endpoint. -While PouchDB is pretty mature, it has some drawbacks that blocks it from being used in a client-side React Native application. For example it has to store all documents states over time which is required to replicate with CouchDB. Also it is not easily possible to fully purge documents and so it will fill up disc space over time. A big problem is also that PouchDB is not really maintained and major bugs like wrong query results are not fixed anymore. The performance of PouchDB is a general bottleneck which is caused by how it has to store and fetch documents while being compliant to CouchDB. The only real reason to use [PouchDB](./rx-storage-pouchdb.md) in React Native, is when you want to replicate with a [CouchDB or Couchbase server](./replication-couchdb.md). - -Because PouchDB is based on an [adapter system](./adapters.md) for storage, there are two options to use it with React Native: - -- Either use the [pouchdb-adapter-react-native-sqlite](https://github.com/craftzdog/pouchdb-react-native) adapter -- or the [pouchdb-adapter-asyncstorage](https://github.com/seigel/pouchdb-react-native) adapter. - -Because the `asyncstorage` adapter is no longer maintained, it is recommended to use the `native-sqlite` adapter: - -First you have to install the adapter and other dependencies via `npm install pouchdb-adapter-react-native-sqlite react-native-quick-sqlite react-native-quick-websql`. - -Then you have to craft a custom PouchDB class that combines these plugins: - -```ts -import 'react-native-get-random-values'; -import PouchDB from 'pouchdb-core'; -import HttpPouch from 'pouchdb-adapter-http'; -import replication from 'pouchdb-replication'; -import mapreduce from 'pouchdb-mapreduce'; -import SQLiteAdapterFactory from 'pouchdb-adapter-react-native-sqlite'; -import WebSQLite from 'react-native-quick-websql'; - -const SQLiteAdapter = SQLiteAdapterFactory(WebSQLite); -export default PouchDB.plugin(HttpPouch) - .plugin(replication) - .plugin(mapreduce) - .plugin(SQLiteAdapter); -``` - -This can then be used to create a PouchDB database instance which can store and query documents: - -```ts -const db = new PouchDB('mydb.db', { - adapter: 'react-native-sqlite' -}); -``` - -### RxDB - -
    - - - -
    - -[RxDB](https://rxdb.info/) is an [local-first](./articles/local-first-future.md), NoSQL-database for JavaScript applications. It is reactive which means that you can not only query the current state, but subscribe to all state changes like the result of a [query](./rx-query.md) or even a single field of a [document](./rx-document.md). This is great for UI-based realtime applications in a way that makes it easy to develop realtime applications like what you need in React Native. - -**Key benefits of RxDB include:** - -- Observability and Real-Time Queries: Automatic UI updates when underlying data changes, making it much simpler to build responsive, reactive apps. -- Offline-First and Sync: Built-in support for [syncing with CouchDB](./replication-couchdb.md), or via [GraphQL replication](./replication-graphql.md), allowing your app to work offline and seamlessly sync when online. It is easy to make the RxDB [replication](./replication.md) compatible with anything that [supports HTTP](./replication-http.md). -- Encryption and Data Security: RxDB supports [field-level encryption](./articles//react-native-encryption.md) and a robust plugin ecosystem for [compression](./key-compression.md) and [attachments](./rx-attachment.md). -- Data Modeling and Ease of Use: Offers a schema-based approach that helps catch invalid data early and ensures consistency. -- **Performance**: Optimized for storing and querying large amounts of data on [mobile devices](./articles/mobile-database.md). - -There are multiple ways to use RxDB in React Native: - -- Use the [memory RxStorage](./rx-storage-memory.md) that stores the data inside of the JavaScript memory without persistence -- Use the [SQLite RxStorage](./rx-storage-sqlite.md) with the [react-native-quick-sqlite](https://github.com/ospfranco/react-native-quick-sqlite) plugin. - -It is recommended to use the [SQLite RxStorage](./rx-storage-sqlite.md) because it has the best performance and is the easiest to set up. However it is part of the [👑 Premium Plugins](/premium/) which must be purchased, so to try out RxDB with React Native, you might want to use the memory storage first. Later you can replace it with the SQLite storage by just changing two lines of configuration. - -First you have to install all dependencies via `npm install rxdb rxjs rxdb-premium react-native-quick-sqlite`. -Then you can assemble the RxStorage and create a database with it: - - - -### Import RxDB and SQLite -```ts -import { - createRxDatabase -} from 'rxdb'; -import { open } from 'react-native-quick-sqlite'; -``` - - - -#### RxDB Core - -```ts -import { - getRxStorageSQLiteTrial, - getSQLiteBasicsCapacitor -} from 'rxdb/plugins/storage-sqlite'; -``` - -#### RxDB Premium 👑 - -```ts -import { - getRxStorageSQLite, - getSQLiteBasicsCapacitor -} from 'rxdb-premium/plugins/storage-sqlite'; -``` - - - -### Create a database -```ts -const myRxDatabase = await createRxDatabase({ - // Instead of a simple name, - // you can use a folder path to determine the database location - name: 'exampledb', - multiInstance: false, // <- Set this to false when using RxDB in React Native - storage: getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsQuickSQLite(open) - }) -}); - -``` - -### Add a Collection -```ts -const collections = await myRxDatabase.addCollections({ - humans: { - schema: { - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string', maxLength: 100 }, - name: { type: 'string' }, - age: { type: 'number' } - }, - required: ['id', 'name'] - } - } -}); -``` - -### Insert a Document -```ts -await collections.humans.insert({id: 'foo', name: 'bar'}); - -``` - -### Run a Query -```ts -const result = await collections.humans.find({ - selector: { - name: 'bar' - } -}).exec(); - -``` - -### Observe a Query -```ts -await collections.humans.find({ - selector: { - name: 'bar' - } -}).$.subscribe(result => {/* ... */}); -``` - - -Using the SQLite RxStorage is pretty fast, which is shown in the [performance comparison](./rx-storage.md#performance-comparison). -To learn more about using RxDB with React Native, you might want to check out [this example project](https://github.com/pubkey/rxdb/tree/master/examples/react-native). - -Also RxDB provides many other features like [encryption](./encryption.md) or [compression](./key-compression.md). You can even store binary data as [attachments](./rx-attachment.md) or use RxDB as an [ORM](./orm.md) in React Native. - -### Realm - - - -Realm is another database solution that is particularly popular in the mobile world. Originally an independent project, Realm is now owned by MongoDB, and has seen deeper integration with MongoDB services over time. - -**Pros**: -- Fast, object-based database approach with an easy data model. -- Historically known for good performance and a simple, user-friendly API. - -**Downsides**: -- **Forced MongoDB Cloud Usage**: Realm Sync is now tightly coupled with MongoDB Realm Cloud. If you want to use their full sync or advanced features, you are essentially locked into MongoDB's ecosystem, which can be a downside if you need on-premise or custom hosting. -- **Missing or Limited Features**: While Realm covers many basic needs, some developers find that advanced queries or certain offline-first features are not as robust or flexible as other solutions. -- **Vendor Lock-In**: If you rely heavily on Realm Sync, migrating away from MongoDB's cloud can be difficult because the sync logic and data format are tightly integrated. -- **Community Concerns**: Since the MongoDB acquisition, some worry about Realm's open-source future and whether large changes or new features will remain community-friendly. - -Although Realm can be a good solution when used purely as a local database, if you plan on syncing data across clients or want to avoid cloud vendor lock-in, you should consider carefully how MongoDB's ownership might affect your long-term plans. - -### Firebase / Firestore - - - -Firestore is a cloud based database technology that stores data on clients devices and replicates it with the Firebase cloud service that is run by google. It has many features like observability and authentication. -The main feature lacking is the non-complete offline first support because clients cannot start the application while being offline because then the authentication does not work. After they are authenticated, being offline is no longer a problem. -Also using firestore creates a vendor lock-in because it is not possible to replicate with a custom self hosted backend. - -To get started with Firestore in React Native, it is recommended to use the [React Native Firebase](https://github.com/invertase/react-native-firebase) open-source project. - -### Summary - -| **Characteristic** | **AsyncStorage** | **SQLite** | **PouchDB** | **RxDB** | **Realm** | **Firestore** | -| ----------------------- | ------------------------------------ | --------------------------------------- | ----------------------------------------- | ---------------------------------------------------------- | --------------------------------------------- | --------------------------------------------------------- | -| **Database Type** | Key-value store, no advanced queries | Embedded SQL engine in a local file | NoSQL doc store, revision-based | NoSQL doc-based (JSON) | Object-based (MongoDB-owned) | NoSQL doc-based, cloud by Google | -| **Query Model** | getItem/setItem only | Standard SQL statements | Map/reduce or basic Mango queries | JSON-based query language, optional indexes | Object-level queries, sync with MongoDB Realm | Document queries, limited advanced ops | -| **Observability** | None built-in | No direct reactivity | Changes feed from Couch-style backend | Built-in reactive queries, UI auto-updates | Local reactivity, or realm sync (cloud) | Real-time snapshots, partial offline | -| **Offline Replication** | None | None by default | CouchDB-compatible sync | Built-in sync (HTTP, GraphQL, CouchDB, etc.) | Realm Cloud sync only | Basic offline caching, re-auth needed | -| **Performance** | Fine for small keys/values | Generally good; bridging overhead | OK for mid data sets; can bloat over time | Varies by storage; Dexie/SQLite w/ compression can be fast | Typically fast on mobile | Good read-heavy perf; can be rate-limited, costly | -| **Schema Handling** | None | SQL schema, migrations needed | No formal schema, doc-based | Optional JSON-Schema, typed checks, compression | Declarative schema, migration needed | No strict schema; rules in console mostly | -| **Usage Cases** | Store small user settings | Local structured data, moderate queries | Basic doc store, synergy with CouchDB | Reactive offline-first for large or dynamic data | Local object DB, locked to MongoDB realm sync | Real-time Google backend, partial offline, vendor lock-in | - -## Follow up - -- A good way to learn using RxDB database with React Native is to check out the [RxDB React Native example](https://github.com/pubkey/rxdb/tree/master/examples/react-native) and use that as a tutorial. -- If you haven't done so yet, you should start learning about RxDB with the [Quickstart Tutorial](./quickstart.md). -- There is a followup list of other [client side database alternatives](./alternatives.md) that might work with React Native. diff --git a/docs/react.html b/docs/react.html deleted file mode 100644 index c7550510ffc..00000000000 --- a/docs/react.html +++ /dev/null @@ -1,159 +0,0 @@ - - - - - -React | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    React

    -

    RxDB provides first-class support for both React and React Native via a dedicated React integration. This integration makes it possible to use RxDB inside functional components using React Context and hooks, without manually subscribing to observables or managing cleanup logic.

    -

    The same APIs work in React for the web and in React Native. The only difference between platforms is the storage and environment setup. The React integration itself behaves identically in both.

    -

    General concept

    -

    RxDB is internally reactive and emits changes via RxJS observables. React and React Native, however, are render-driven frameworks that rely on component state and hooks. The RxDB React integration bridges these two models by exposing a small set of hooks that translate RxDB state into React renders.

    -

    Instead of hiding reactivity behind configuration flags, the integration uses explicit hooks. This makes component behavior predictable, avoids accidental subscriptions, and keeps performance characteristics easy to reason about.

    -

    Usage

    -
    1

    Installation

    Install RxDB and React as usual:

    npm install rxdb react react-dom
    2

    Database creation

    Database creation is not part of the React integration itself. RxDB is created in the same way as in non-React applications, including storage selection, plugins, replication, hooks, and schema definitions.

    This separation is intentional. React components should never be responsible for creating or configuring the database. They should only consume it.

    import {
    -    createRxDatabase,
    -    addRxPlugin
    -} from 'rxdb';
    -import {
    -    getRxStorageLocalstorage
    -} from 'rxdb/plugins/storage-localstorage';
    - 
    -async function getDatabase() {
    -    const db = await createRxDatabase({
    -        name: 'heroesreactdb',
    -        storage: getRxStorageLocalstorage()
    -    });
    -    await db.addCollections({
    -        heroes: {
    -            schema: myRxSchema
    -        }
    -    });
    - 
    -    /**
    -     * Do other stuff here
    -     * like setting up middleware
    -     * or starting replication.
    -     */
    - 
    -    return db;
    -}
    3

    Providing the database

    To use RxDB in a React or React Native application, the database instance must be provided via a context. This is done using RxDatabaseProvider.

    The database itself is created outside of React, usually in a separate module. The provider is only responsible for making the database available to components once it has been initialized.

    import React, { useEffect, useState } from 'react';
    -import { RxDatabaseProvider } from 'rxdb/plugins/react';
    -import { getDatabase } from './Database';
    - 
    - 
    -const App = () => {
    -    const [database, setDatabase] = useState();
    - 
    -    useEffect(() => {
    -        const initDb = async () => {
    -            const db = await getDatabase();
    -            setDatabase(db);
    -        };
    -        initDb();
    -    }, []);
    - 
    -    if (database == null) {
    -        return <span>
    -            Loading <a href="https://rxdb.info/react.html">RxDB</a> database...
    -        </span>;
    -    }
    - 
    -    return (
    -        <RxDatabaseProvider database={database}>
    -            {/* your application */}
    -        </RxDatabaseProvider>
    -    );
    -};
    - 
    -export default App;
    4

    Accessing collections

    import { useRxCollection } from 'rxdb/plugins/react';
    - 
    -const collection = useRxCollection('heroes');

    The hook returns the collection once it becomes available. During the initial render, the value may be undefined, so components must handle this case.

    This hook does not subscribe to any data. It only provides access to the collection instance.

    5

    Queries

    To render query results in your component, use the useRxQuery hook.

    import { useRxQuery } from 'rxdb/plugins/react';
    - 
    -const query = {
    -    collection: 'heroes',
    -    query: {
    -        selector: {},
    -        sort: [{ name: 'asc' }]
    -    }
    -};
    - 
    -const HeroCount = () => {
    -    const { results, loading } = useRxQuery(query);
    - 
    -    if (loading) {
    -        return <span>Loading...</span>;
    -    }
    - 
    -    return <span>Total heroes: {results.length}</span>;
    -};

    The query is executed when the component renders. If the component re-renders, the query may be re-executed, but changes in the underlying data will not automatically trigger updates.

    This hook is well suited for static views, server-side rendering, and cases where live updates are not required.

    6

    Live queries

    Most React applications require views that automatically update when the database changes. For this purpose, RxDB provides the useLiveRxQuery hook.

    The hook accepts a query description object and returns the current results together with a loading state.

    import { useLiveRxQuery } from 'rxdb/plugins/react';
    - 
    -const query = {
    -    collection: 'heroes',
    -    query: {
    -        selector: {},
    -        sort: [{ name: 'asc' }]
    -    }
    -};
    - 
    -const HeroList = () => {
    -    const { results, loading } = useLiveRxQuery(query);
    - 
    -    if (loading) {
    -        return <span>Loading...</span>;
    -    }
    - 
    -    return (
    -        <ul>
    -            {results.map(hero => (
    -                <li key={hero.name}>{hero.name}</li>
    -            ))}
    -        </ul>
    -    );
    -};

    The component automatically re-renders whenever the query result changes. Subscriptions are created when the component mounts and are cleaned up automatically when the component unmounts.

    The returned documents are fully reactive RxDB documents and can be modified or removed directly.

    -

    React Native compatibility

    -

    All hooks and providers described on this page work the same way in React Native. The React integration does not rely on any browser-specific APIs.

    -

    The only platform-specific part of a React Native setup is database creation, where a different storage plugin is typically used. Once the database is created, the React integration behaves identically.

    -

    Signals

    -

    In addition to the React hooks shown on this page, RxDB also supports alternative reactivity models such as signals. RxDB's core reactivity system can be configured to expose reactive values using different primitives instead of RxJS observables, which makes it possible to integrate RxDB with signal-based approaches in React or other frameworks. This is an advanced capability and is independent of the React integration described here. For more details about how RxDB's reactivity system works and how custom reactivity can be configured, see the Reactivity documentation.

    -

    Follow Up

    -
      -
    • -

      RxDB includes a full React example application that demonstrates the patterns described on this page, including database creation outside of React, usage of RxDatabaseProvider, and data access via useRxQuery, useLiveRxQuery, and `useRxCollection.

      -
    • -
    • -

      A corresponding React Native example is also available and shows the same integration concepts applied in a mobile environment, with only the platform-specific storage and setup differing.

      -
    • -
    - - \ No newline at end of file diff --git a/docs/react.md b/docs/react.md deleted file mode 100644 index 1198190ee44..00000000000 --- a/docs/react.md +++ /dev/null @@ -1,203 +0,0 @@ -# React - -> import {Tabs} from '@site/src/components/tabs'; -import {Steps} from '@site/src/components/steps'; - -import {Tabs} from '@site/src/components/tabs'; -import {Steps} from '@site/src/components/steps'; - -# React - -RxDB provides first-class support for both React and React Native via a dedicated React integration. This integration makes it possible to use RxDB inside functional components using React Context and hooks, without manually subscribing to observables or managing cleanup logic. - -The same APIs work in **React** for the web and in [React Native](./react-native-database.md). The only difference between platforms is the storage and environment setup. The React integration itself behaves identically in both. - -## General concept - -RxDB is internally reactive and emits changes via RxJS observables. React and React Native, however, are render-driven frameworks that rely on component state and hooks. The RxDB React integration bridges these two models by exposing a small set of hooks that translate RxDB state into React renders. - -Instead of hiding reactivity behind configuration flags, the integration uses explicit hooks. This makes component behavior predictable, avoids accidental subscriptions, and keeps performance characteristics easy to reason about. - -## Usage - - - -### Installation - -Install RxDB and React as usual: - -```bash -npm install rxdb react react-dom -``` - -### Database creation - -Database creation is not part of the React integration itself. RxDB is created in the same way as in non-React applications, including storage selection, plugins, replication, hooks, and schema definitions. - -This separation is intentional. React components should never be responsible for creating or configuring the database. They should only consume it. - -```ts -import { - createRxDatabase, - addRxPlugin -} from 'rxdb'; -import { - getRxStorageLocalstorage -} from 'rxdb/plugins/storage-localstorage'; - -async function getDatabase() { - const db = await createRxDatabase({ - name: 'heroesreactdb', - storage: getRxStorageLocalstorage() - }); - await db.addCollections({ - heroes: { - schema: myRxSchema - } - }); - - /** - * Do other stuff here - * like setting up middleware - * or starting replication. - */ - - return db; -} -``` - -### Providing the database - -To use RxDB in a React or React Native application, the database instance must be provided via a context. This is done using `RxDatabaseProvider`. - -The database itself is created outside of React, usually in a separate module. The provider is only responsible for making the database available to components once it has been initialized. - -```tsx -import React, { useEffect, useState } from 'react'; -import { RxDatabaseProvider } from 'rxdb/plugins/react'; -import { getDatabase } from './Database'; - -const App = () => { - const [database, setDatabase] = useState(); - - useEffect(() => { - const initDb = async () => { - const db = await getDatabase(); - setDatabase(db); - }; - initDb(); - }, []); - - if (database == null) { - return - Loading RxDB database... - ; - } - - return ( - - {/* your application */} - - ); -}; - -export default App; -``` - -### Accessing collections - -```ts -import { useRxCollection } from 'rxdb/plugins/react'; - -const collection = useRxCollection('heroes'); -``` - -The hook returns the collection once it becomes available. During the initial render, the value may be `undefined`, so components must handle this case. - -This hook does not subscribe to any data. It only provides access to the collection instance. - -### Queries - -To render query results in your component, use the `useRxQuery` hook. - -```tsx -import { useRxQuery } from 'rxdb/plugins/react'; - -const query = { - collection: 'heroes', - query: { - selector: {}, - sort: [{ name: 'asc' }] - } -}; - -const HeroCount = () => { - const { results, loading } = useRxQuery(query); - - if (loading) { - return Loading...; - } - - return Total heroes: {results.length}; -}; -``` - -The query is executed when the component renders. If the component re-renders, the query may be re-executed, but changes in the underlying data will not automatically trigger updates. - -This hook is well suited for static views, server-side rendering, and cases where live updates are not required. - -### Live queries - -Most React applications require views that automatically update when the database changes. For this purpose, RxDB provides the `useLiveRxQuery` hook. - -The hook accepts a query description object and returns the current results together with a loading state. - -```tsx -import { useLiveRxQuery } from 'rxdb/plugins/react'; - -const query = { - collection: 'heroes', - query: { - selector: {}, - sort: [{ name: 'asc' }] - } -}; - -const HeroList = () => { - const { results, loading } = useLiveRxQuery(query); - - if (loading) { - return Loading...; - } - - return ( - - {results.map(hero => ( - {hero.name} - ))} - - ); -}; -``` - -The component automatically re-renders whenever the query result changes. Subscriptions are created when the component mounts and are cleaned up automatically when the component unmounts. - -The returned documents are fully reactive RxDB documents and can be modified or removed directly. - - - -## React Native compatibility - -All hooks and providers described on this page work the same way in React Native. The React integration does not rely on any browser-specific APIs. - -The only platform-specific part of a React Native setup is database creation, where a different storage plugin is typically used. Once the database is created, the React integration behaves identically. - -## Signals - -In addition to the React hooks shown on this page, RxDB also supports alternative reactivity models such as [signals](./reactivity.md#react). RxDB's core reactivity system can be configured to expose reactive values using different primitives instead of RxJS observables, which makes it possible to integrate RxDB with signal-based approaches in React or other frameworks. This is an advanced capability and is independent of the React integration described here. For more details about how RxDB's reactivity system works and how custom reactivity can be configured, see the [Reactivity documentation](./reactivity.md). - -## Follow Up - -- RxDB includes a full [React example application](https://github.com/pubkey/rxdb/tree/master/examples/react) that demonstrates the patterns described on this page, including database creation outside of React, usage of `RxDatabaseProvider`, and data access via `useRxQuery`, `useLiveRxQuery`, and `useRxCollection. - -- A corresponding [React Native example](https://github.com/pubkey/rxdb/tree/master/examples/react-native) is also available and shows the same integration concepts applied in a mobile environment, with only the platform-specific storage and setup differing. diff --git a/docs/reactivity.html b/docs/reactivity.html deleted file mode 100644 index 6ed733a39dd..00000000000 --- a/docs/reactivity.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - -Signals & Custom Reactivity with RxDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Signals & Co. - Custom reactivity adapters instead of RxJS Observables

    -

    RxDB internally uses the rxjs library for observables and streams. All functionalities of RxDB like query results or document fields that expose values that change over time return a rxjs Observable that allows you to observe the values and update your UI accordingly depending on the changes to the database state.

    -

    However there are many reasons to use other reactivity libraries that use a different datatype to represent changing values. For example when you use signals in angular or react, the template refs of vue or state libraries like MobX and redux.

    -

    RxDB allows you to pass a custom reactivity factory on RxDatabase creation so that you can easily access values wrapped with your custom datatype in a convenient way.

    -

    Adding a reactivity factory

    -

    In angular we use Angular Signals as custom reactivity objects.

    1

    Import

    import { createReactivityFactory } from 'rxdb/plugins/reactivity-angular';
    -import { Injectable, inject } from '@angular/core';
    2

    Set the reactivity factory

    Set the factory as reactivity option when calling createRxDatabase.

    const database = await createRxDatabase({
    -    name: 'mydb',
    -    storage: getRxStorageLocalstorage(),
    -    reactivity: createReactivityFactory(inject(Injector))
    -});
    - 
    -// add collections/sync etc...
    3

    Use the Signal in an Angular component

    import { Component, inject } from '@angular/core';
    -import { CommonModule } from '@angular/common';
    -import { DbService } from '../db.service';
    - 
    -@Component({
    -  selector: 'app-todos-list',
    -  standalone: true,
    -  imports: [CommonModule],
    -  template: `
    -      <ul>
    -        <li
    -          *ngFor="let t of todosSignal();"
    -        >{{ t.title }}</li>
    -      </ul>
    -  `,
    -})
    -export class TodosListComponent {
    -  private dbService = inject(DbService);
    - 
    -  // RxDB query - Angular Signal
    -  readonly todosSignal = this.dbService.db.todos.find().$$;
    -}
    - 

    An example of how signals are used in angular with RxDB, can be found at the RxDB Angular Example

    -

    Accessing custom reactivity objects

    -

    All observable data in RxDB is marked by the single dollar sign $ like RxCollection.$ for events or RxDocument.myField$ to get the observable for a document field. To make custom reactivity objects distinguable, they are marked with double-dollar signs $$ instead. Here are some example on how to get custom reactivity objects from RxDB specific instances:

    -
    // RxDocument
    - 
    -// get signal that represents the document field 'foobar'
    -const signal = myRxDocument.get$$('foobar');
    - 
    -// same as above
    -const signal = myRxDocument.foobar$$;
    - 
    -// get signal that represents whole document over time
    -const signal = myRxDocument.$$;
    - 
    -// get signal that represents the deleted state of the document
    -const signal = myRxDocument.deleted$$;
    -
    // RxQuery
    - 
    -// get signal that represents the query result set over time
    -const signal = collection.find().$$;
    - 
    -// get signal that represents the query result set over time
    -const signal = collection.findOne().$$;
    -
    // RxLocalDocument
    - 
    -// get signal that represents the whole local document state
    -const signal = myRxLocalDocument.$$;
    - 
    -// get signal that represents the foobar field
    -const signal = myRxLocalDocument.get$$('foobar');
    - - \ No newline at end of file diff --git a/docs/reactivity.md b/docs/reactivity.md deleted file mode 100644 index 30c818922e5..00000000000 --- a/docs/reactivity.md +++ /dev/null @@ -1,227 +0,0 @@ -# Signals & Custom Reactivity with RxDB - -> Level up reactivity with Angular signals, Vue refs, or Preact signals in RxDB. Learn how to integrate custom reactivity to power your dynamic UI. - -import {Tabs} from '@site/src/components/tabs'; -import {Steps} from '@site/src/components/steps'; - -# Signals & Co. - Custom reactivity adapters instead of RxJS Observables - -RxDB internally uses the [rxjs library](https://rxjs.dev/) for observables and streams. All functionalities of RxDB like [query](./rx-query.md#observe) results or [document fields](./rx-document.md#observe) that expose values that change over time return a rxjs `Observable` that allows you to observe the values and update your UI accordingly depending on the changes to the database state. - -However there are many reasons to use other reactivity libraries that use a different datatype to represent changing values. For example when you use **signals** in angular or react, the **template refs** of vue or state libraries like MobX and redux. - -RxDB allows you to pass a custom reactivity factory on [RxDatabase](./rx-database.md) creation so that you can easily access values wrapped with your custom datatype in a convenient way. - -## Adding a reactivity factory - - - -### Angular - -In angular we use [Angular Signals](https://angular.dev/guide/signals) as custom reactivity objects. - - - -#### Import - -```ts -import { createReactivityFactory } from 'rxdb/plugins/reactivity-angular'; -import { Injectable, inject } from '@angular/core'; -``` - -#### Set the reactivity factory - -Set the factory as `reactivity` option when calling `createRxDatabase`. - -```ts -const database = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage(), - reactivity: createReactivityFactory(inject(Injector)) -}); - -// add collections/sync etc... -``` - -#### Use the Signal in an Angular component - -```ts -import { Component, inject } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { DbService } from '../db.service'; - -@Component({ - selector: 'app-todos-list', - standalone: true, - imports: [CommonModule], - template: ` - - {{ t.title }} - - `, -}) -export class TodosListComponent { - private dbService = inject(DbService); - - // RxDB query - Angular Signal - readonly todosSignal = this.dbService.db.todos.find().$$; -} - -``` - - - -An example of how signals are used in angular with RxDB, can be found at the [RxDB Angular Example](https://github.com/pubkey/rxdb/blob/master/examples/angular/src/app/components/heroes-list/heroes-list.component.ts#L46) - -### React - -For React, we use the [Preact Signals](https://preactjs.com/guide/v10/signals/) for custom reactivity. - - - -#### Install Preact Signals - -```bash -npm install @preact/signals-core --save -``` - -#### Import - -```ts -import { - PreactSignalsRxReactivityFactory -} from 'rxdb/plugins/reactivity-preact-signals'; -``` - -#### Set the reactivity factory - -```ts -const database = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage(), - reactivity: PreactSignalsRxReactivityFactory -}); - -// add collections/sync etc... -``` - -#### Use the Signal in a React component - -```tsx -import { useEffect, useState } from 'preact/hooks'; -import { getDatabase } from './db'; - -export function TodosList() { - const [db, setDb] = useState(null); - - useEffect(() => { - getDatabase().then(setDb); - }, []); - - if (!db) return null; - - // RxQuery -> Preact Signal - const todosSignal = db.todos.find().$$; - - return ( - - {todosSignal.value.map((doc: any) => ( - - {doc.title} - - ))} - - ); -} -``` - - - -### Vue - -For Vue, we use the [Vue Shallow Refs](https://vuejs.org/api/reactivity-advanced) for custom reactivity. - - - -#### Import -```ts -import { VueRxReactivityFactory } from 'rxdb/plugins/reactivity-vue'; -``` - -#### Set the reactivity factory - -```ts -const database = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage(), - reactivity: VueRxReactivityFactory -}); - -// add collections/sync etc... -``` - -#### Use the Shallow Ref in a Vue component - -```html - - - -``` - - - - - -## Accessing custom reactivity objects - -All observable data in RxDB is marked by the single dollar sign `$` like `RxCollection.$` for events or `RxDocument.myField$` to get the observable for a document field. To make custom reactivity objects distinguable, they are marked with double-dollar signs `$$` instead. Here are some example on how to get custom reactivity objects from RxDB specific instances: - -```ts -// RxDocument - -// get signal that represents the document field 'foobar' -const signal = myRxDocument.get$$('foobar'); - -// same as above -const signal = myRxDocument.foobar$$; - -// get signal that represents whole document over time -const signal = myRxDocument.$$; - -// get signal that represents the deleted state of the document -const signal = myRxDocument.deleted$$; -``` - -```ts -// RxQuery - -// get signal that represents the query result set over time -const signal = collection.find().$$; - -// get signal that represents the query result set over time -const signal = collection.findOne().$$; -``` - -```ts -// RxLocalDocument - -// get signal that represents the whole local document state -const signal = myRxLocalDocument.$$; - -// get signal that represents the foobar field -const signal = myRxLocalDocument.get$$('foobar'); -``` diff --git a/docs/releases/10.0.0.html b/docs/releases/10.0.0.html deleted file mode 100644 index eba0b3526ff..00000000000 --- a/docs/releases/10.0.0.html +++ /dev/null @@ -1,202 +0,0 @@ - - - - - -RxDB 10.0.0 - Built for the Future | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    10.0.0

    -

    One year after version 9.0.0 we now have RxDB version 10.0.0. -The main goal of version 10 was to change things that make RxDB ready for the future.

    -

    Notice that I use major releases to bundle stuff that breaks the RxDB usage in your project, not to add new features.

    -

    The main thing first

    -

    In the past, RxDB was build around Pouchdb. Before I started making RxDB I tried to solve the problems of my current project with other existing databases out there. I evaluated all of them and then started using Pouchdb and added many features via plugin. Then I realised it will be easier to create a separate project that wraps around Pouchdb, that was RxDB. Back then pouchdb was the most major browser database out there and it was well maintained and had a big community. -But in the last 5 years, things have changed. A big part of the RxDB users do not use couchdb in the backend and do not need the couchdb replication. -Therefore they do not really need the overhead with revision handling that slows down the performance of pouchdb. Also there where many other problems with using pouchdb. It is not actively developed, many bugs are not fixed and no new features get added. Also there are many unsolved problems like how to finally delete document data or how to replicate more than 6 databases at the same time, how to use replication without attachments data, and so on...

    -

    So for this release, I abstracted all parts that we use from pouchdb into the RxStorage interface. RxDB works on top of any implementation of the RxStorage interface. This means it is now possible to use RxDB together with other underlying storages like SQLite, PostgreSQL, Minimongo, MongoDB, and so on, as long as someone writes the RxStorage class for it.

    -

    This means, to create a RxDatabase you have to pass the storage class instead of pouchdb specific settings:

    -
     
    -// import pouchdb specific stuff and add pouchdb adapters
    -import {
    -    addPouchPlugin,
    -    getRxStoragePouch
    -} from 'rxdb/plugins/pouchdb';
    - 
    -// IMPORTANT: Do not use addRxPlugin to add pouchdb adapter, instead use addPouchPlugin
    -addPouchPlugin(require('pouchdb-adapter-memory'));
    - 
    -import {
    -    addRxPlugin,
    -    createRxDatabase,
    -    randomCouchString,
    -} from 'rxdb/plugins/core';
    - 
    -// create the database with the storage creator.
    -const db = await createRxDatabase({
    -    name: 'mydatabase',
    -    storage: getRxStoragePouch('memory'),
    -});
    - 
    -

    To access the internal pouch instance of a collection, you have to go over the storageInstance:

    -
    const pouch = myRxCollection.storageInstance.internals.pouch;
    -

    Other breaking changes

    -

    Primary key is required

    -

    In the past, using a primary key was optional. When no primary key was defined, RxDB filled up the _id field with an uuid-like string which was then used as primary. When I researched on github how people use RxDB, I found out that many use a secondary index for what should be the primary key. -Also having the primary key optional, caused much confusing when using RxDB with typescript.

    -

    So now the primary key MUST be set when creating a schema for RxDB. -Also the primary key is defined with the primaryKey property at the top level of the schema. This ensures that typescript will complain if no primaryKey is defined.

    -
     
    -// when using the type `RxJsonSchema<DocType>` the `DocType` is now required
    -const mySchema: RxJsonSchema<MyDocumentData> = {
    -    version: 0,
    -    primaryKey: 'passportId',
    -    type: 'object',
    -    properties: {
    -        passportId: {
    -            type: 'string'
    -        }
    -    },
    -    // primaryKey is always required
    -    required: ['passportId']
    -}
    - 
    -

    Attachment data must be Blob or Buffer

    -

    In the past, an RxAttachment could be stored with Blob, Buffer and string data. If a string was passed, pouchdb internally transformed the data to a Blob or Buffer, depending on in which environment it is running. -This behavior caused much trouble and weird edge cases because of how the data is transformed from and to string. -So now you can only store Blob or Buffer as attachment data. string is no longer allowed. You can still transform a string to a Blob or Buffer by yourself and then store it.

    -
    import { blobBufferUtil } from 'rxdb';
    - 
    -const attachment = await myDocument.putAttachment(
    -    {
    -        id: 'cat.txt',
    -        data: blobBufferUtil.createBlobBuffer('miau', 'text/plain')
    -        type: 'text/plain'
    -    }
    -);
    - 
    -

    Also putAttachment() now defaults to skipIfSame=true. This means when you write attachment data that already is exactly the same in the database, no write will be done.

    -

    Outgoing data is now readonly and deep-frozen

    -

    RxDB often uses outgoing data also in the internals. For example the result of a query is not only send to the user, but also used inside of RxDB's query-change-detection. To ensure that mutation of the outgoing data is not changing internal stuff, which would cause strange bugs, outgoing data was always deep-cloned before handing it out to the user. This is a common practice on many javascript libraries.

    -

    The problem is that deep-cloning big objects can be very CPU/Memory expensive. So instead of doing a deep-clone, RxDB does now assume that outgoing data is immutable. If the users wants to modify that data, it has to be deep-cloned by the user. -To ensure immutability, RxDB runs a deep-freeze in the dev-mode (about same expensive as deep clone). Also typescript will throw a build-time error because we use ReadonlyArray and readonly to define outgoing data immutable. In production-mode, there will be nothing besides typescript that ensures immutability to have best performance.

    -
    const data = myRxDocument.toJSON();
    -data.foo = bar; // This does NOT work!
    - 
    -// instead clone the data before changing it
    -import { clone } from 'rxjs';
    -const clonedData = clone(data);
    -data.foo = bar; // This works!
    -

    The in-memory plugin does no longer work.

    -

    The in-memory plugin was used to spawn in-memory collections on top of a normal RxCollection. The benefit is to have the data replicated into the memory of the javascript runtime, which allows for faster queries.

    -

    After doing many tests and observations, I found out that the in-memory plugin was slow. Really slow, even slower then just using the indexeddb adapter in the browser. You can reproduce my observations at the event-reduce testpage. Here you can see that random-writes+query are slower on the memory-adapter then on indexeddb. -The reason for this are the big abstraction layers. Pouchdb uses the adapter system. The memory adapter uses the leveldown abstraction layer. Each write/read goes to the memdown module.

    -

    So the in-memory plugin is not working for now. In the future it will be reimplemented in a custom memory based RxStorage class.

    -
    note

    You can of course still use the pouchdb memory adapter as usual. It is not affected by this change.

    -

    What else is a breaking change?

    -
      -
    • Removed the deprecated atomicSet(), use atomicPatch() instead.
    • -
    • Removed the deprecated RxDatabase.collection() use RxDatabase().addCollections() instead.
    • -
    • Removed plugin hook preCreatePouchDb because it is no longer needed.
    • -
    • Removed the watch-for-changes plugin. We now overwrite pouchdbs bulkDocs method to generate events. This is faster and more reliable.
    • -
    • Removed the adapter-check plugin. (The function adapterCheck is move to the pouchdb plugin).
    • -
    • Calling RxDatabase.server() now returns a promise that resolves when the server is started up.
    • -
    • Changed the defaults of PouchDBExpressServerOptions from the server() method, by default we now store logs in the tmp folder and the config is in memory.
    • -
    • Renamed replication-plugin to replication-couchdb to be more consistent in naming like with replication-graphql -
        -
      • For the same reason, renamed RxCollection().sync() to RxCollection().syncCouchDB()
      • -
      -
    • -
    • Renamed the functions of the json import/export plugin to be less confusing. -
        -
      • dump() is now exportJSON()
      • -
      • importDump() is now importJSON()
      • -
      -
    • -
    • RxCollection uses a separate pouchdb instance for local documents, so that they can persist during migrations.
    • -
    • A JsonSchema must have the required array at the top level and it must contain the primary key.
    • -
    -

    New features

    -

    Composite primary key

    -

    You can now use a composite primary key for the schema where you can join different properties of the document data to create a primary key.

    -
    const mySchema = {
    -  keyCompression: true, // set this to true, to enable the keyCompression
    -  version: 0,
    -  title: 'human schema with composite primary',
    -  primaryKey: {
    -      // where should the composed string be stored
    -      key: 'id',
    -      // fields that will be used to create the composed key
    -      fields: [
    -          'firstName',
    -          'lastName'
    -      ],
    -      // separator which is used to concat the fields values.
    -      separator: '|'
    -  }
    -  type: 'object',
    -  properties: {
    -      id: {
    -          type: 'string'
    -      },
    -      firstName: {
    -          type: 'string'
    -      },
    -      lastName: {
    -          type: 'string'
    -      }
    -  },
    -  required: [
    -    'id', 
    -    'firstName',
    -    'lastName'
    -  ]
    -};
    -

    For the future

    -

    With these changes, RxDB is now ready for the future plans:

    -
      -
    • I want to replace the revision handling of documents with conflict resolution strategies that can always directly resolve conflicts instead of maintaining the revision tree.
    • -
    • Implement different implementations for RxStorage. I will first work on a memory based version. I am in good hope that the community will create other implementations depending on their needs.
    • -
    -

    You can help!

    -

    There are many things that can be done by you to improve RxDB:

    -
      -
    • Check the BACKLOG for features that would be great to have.
    • -
    • Check the breaking backlog for breaking changes that must be implemented in the future but where I did not had the time yet.
    • -
    • Check the todos in the code. There are many small improvements that can be done for performance and build size.
    • -
    • Review the code and add tests. I am only a single dude with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors.
    • -
    • Improve the documentation. In the last user survey many users told me that the documentation is not good enough. But I reviewed the docs and could not find clear flaws. The problem is that I am way to deep into RxDB so that I am not able to understand which documentation a newcomer to the project needs. Likely I assume too much knowledge or focus writing about the wrong parts.
    • -
    • Update the example projects many of them are outdated and need updates.
    • -
    -

    Discuss!

    -

    Please discuss here.

    - - \ No newline at end of file diff --git a/docs/releases/10.0.0.md b/docs/releases/10.0.0.md deleted file mode 100644 index 5e1097384ab..00000000000 --- a/docs/releases/10.0.0.md +++ /dev/null @@ -1,210 +0,0 @@ -# RxDB 10.0.0 - Built for the Future - -> Experience faster, future-proof data handling in RxDB 10.0. Explore new storage interfaces, composite keys, and major performance upgrades. - -# 10.0.0 - -One year after version `9.0.0` we now have RxDB version `10.0.0`. -The main goal of version 10 was to change things that make RxDB ready for the future. - -Notice that I use major releases to bundle stuff that breaks the RxDB usage in your project, not to add new features. - -## The main thing first - -In the past, RxDB was build around Pouchdb. Before I started making RxDB I tried to solve the problems of my current project with other existing databases out there. I evaluated all of them and then started using Pouchdb and added many features via plugin. Then I realised it will be easier to create a separate project that wraps around Pouchdb, that was RxDB. Back then pouchdb was the most major browser database out there and it was well maintained and had a big community. -But in the last 5 years, things have changed. A big part of the RxDB users do not use couchdb in the backend and do not need the couchdb replication. -Therefore they do not really need the overhead with revision handling that slows down the performance of pouchdb. Also there where many other problems with using pouchdb. It is not actively developed, many bugs are not fixed and no new features get added. Also there are many unsolved problems like how to finally delete document data or how to replicate more than 6 databases at the same time, how to use replication without attachments data, and so on... - -So for this release, I abstracted all parts that we use from pouchdb into the `RxStorage` interface. RxDB works on top of any implementation of the `RxStorage` interface. This means it is now possible to use RxDB together with other underlying storages like SQLite, PostgreSQL, Minimongo, MongoDB, and so on, as long as someone writes the `RxStorage` class for it. - -This means, to create a `RxDatabase` you have to pass the storage class instead of pouchdb specific settings: - -```ts - -// import pouchdb specific stuff and add pouchdb adapters -import { - addPouchPlugin, - getRxStoragePouch -} from 'rxdb/plugins/pouchdb'; - -// IMPORTANT: Do not use addRxPlugin to add pouchdb adapter, instead use addPouchPlugin -addPouchPlugin(require('pouchdb-adapter-memory')); - -import { - addRxPlugin, - createRxDatabase, - randomCouchString, -} from 'rxdb/plugins/core'; - -// create the database with the storage creator. -const db = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStoragePouch('memory'), -}); - -``` - -To access the internal `pouch` instance of a collection, you have to go over the `storageInstance`: - -```ts -const pouch = myRxCollection.storageInstance.internals.pouch; -``` - -## Other breaking changes - -### Primary key is required -In the past, using a primary key was optional. When no primary key was defined, RxDB filled up the `_id` field with an uuid-like string which was then used as primary. When I researched on github how people use RxDB, I found out that many use a secondary index for what should be the primary key. -Also having the primary key optional, caused much confusing when using RxDB with typescript. - -So now the primary key MUST be set when creating a schema for RxDB. -Also the primary key is defined with the `primaryKey` property at the top level of the schema. This ensures that typescript will complain if no `primaryKey` is defined. - -```ts - -// when using the type `RxJsonSchema` the `DocType` is now required -const mySchema: RxJsonSchema = { - version: 0, - primaryKey: 'passportId', - type: 'object', - properties: { - passportId: { - type: 'string' - } - }, - // primaryKey is always required - required: ['passportId'] -} - -``` - -### Attachment data must be Blob or Buffer - -In the past, an `RxAttachment` could be stored with `Blob`, `Buffer` and `string` data. If a `string` was passed, pouchdb internally transformed the data to a `Blob` or `Buffer`, depending on in which environment it is running. -This behavior caused much trouble and weird edge cases because of how the data is transformed from and to `string`. -So now you can only store `Blob` or `Buffer` as attachment data. `string` is no longer allowed. You can still transform a string to a Blob or Buffer by yourself and then store it. - -```ts -import { blobBufferUtil } from 'rxdb'; - -const attachment = await myDocument.putAttachment( - { - id: 'cat.txt', - data: blobBufferUtil.createBlobBuffer('miau', 'text/plain') - type: 'text/plain' - } -); - -``` - -Also `putAttachment()` now defaults to `skipIfSame=true`. This means when you write attachment data that already is exactly the same in the database, no write will be done. - -### Outgoing data is now readonly and deep-frozen - -RxDB often uses outgoing data also in the internals. For example the result of a query is not only send to the user, but also used inside of RxDB's query-change-detection. To ensure that mutation of the outgoing data is not changing internal stuff, which would cause strange bugs, outgoing data was always deep-cloned before handing it out to the user. This is a common practice on many javascript libraries. - -The problem is that deep-cloning big objects can be very CPU/Memory expensive. So instead of doing a deep-clone, RxDB does now assume that outgoing data is **immutable**. If the users wants to modify that data, it has to be deep-cloned by the user. -To ensure immutability, RxDB runs a [deep-freeze](https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze) in the dev-mode (about same expensive as deep clone). Also typescript will throw a build-time error because we use `ReadonlyArray` and `readonly` to define outgoing data immutable. In production-mode, there will be nothing besides typescript that ensures immutability to have best performance. - -```ts -const data = myRxDocument.toJSON(); -data.foo = bar; // This does NOT work! - -// instead clone the data before changing it -import { clone } from 'rxjs'; -const clonedData = clone(data); -data.foo = bar; // This works! -``` - -### The in-memory plugin does no longer work. - -The in-memory plugin was used to spawn in-memory collections on top of a normal `RxCollection`. The benefit is to have the data replicated into the memory of the javascript runtime, which allows for faster queries. - -After doing many tests and observations, I found out that the in-memory plugin was slow. Really slow, even slower then just using the indexeddb adapter in the browser. You can reproduce my observations at the event-reduce testpage. Here you can see that random-writes+query are slower on the [memory-adapter](https://pubkey.github.io/event-reduce/?tech=pouchdb:memory) then on [indexeddb](https://pubkey.github.io/event-reduce/?tech=pouchdb:indexeddb). -The reason for this are the big abstraction layers. Pouchdb uses the adapter system. The memory adapter uses the [leveldown abstraction layer](https://github.com/Level/levelup). Each write/read goes to the [memdown module](https://github.com/Level/memdown). - -So the in-memory plugin is not working for now. In the future it will be reimplemented in a custom memory based `RxStorage` class. - -:::note -You can of course still use the pouchdb `memory` adapter as usual. It is not affected by this change. -::: - -## What else is a breaking change? - -- Removed the deprecated `atomicSet()`, use `atomicPatch()` instead. -- Removed the deprecated `RxDatabase.collection()` use `RxDatabase().addCollections()` instead. -- Removed plugin hook `preCreatePouchDb` because it is no longer needed. -- Removed the `watch-for-changes` plugin. We now overwrite pouchdbs `bulkDocs` method to generate events. This is faster and more reliable. -- Removed the `adapter-check` plugin. (The function `adapterCheck` is move to the pouchdb plugin). -- Calling `RxDatabase.server()` now returns a promise that resolves when the server is started up. -- Changed the defaults of `PouchDBExpressServerOptions` from the `server()` method, by default we now store logs in the `tmp` folder and the config is in memory. -- Renamed `replication`-plugin to [replication-couchdb](../replication-couchdb.md) to be more consistent in naming like with `replication-graphql` - - For the same reason, renamed `RxCollection().sync()` to `RxCollection().syncCouchDB()` -- Renamed the functions of the json import/export plugin to be less confusing. - - `dump()` is now `exportJSON()` - - `importDump()` is now `importJSON()` -- `RxCollection` uses a separate pouchdb instance for local documents, so that they can persist during migrations. -- A JsonSchema must have the `required` array at the top level and it must contain the primary key. - -## New features - -### Composite primary key - -You can now use a composite primary key for the schema where you can join different properties of the document data to create a primary key. - -```javascript -const mySchema = { - keyCompression: true, // set this to true, to enable the keyCompression - version: 0, - title: 'human schema with composite primary', - primaryKey: { - // where should the composed string be stored - key: 'id', - // fields that will be used to create the composed key - fields: [ - 'firstName', - 'lastName' - ], - // separator which is used to concat the fields values. - separator: '|' - } - type: 'object', - properties: { - id: { - type: 'string' - }, - firstName: { - type: 'string' - }, - lastName: { - type: 'string' - } - }, - required: [ - 'id', - 'firstName', - 'lastName' - ] -}; -``` - -## For the future - -With these changes, RxDB is now ready for the future plans: - -- I want to replace the `revision` handling of documents with conflict resolution strategies that can always directly resolve conflicts instead of maintaining the revision tree. -- Implement different implementations for `RxStorage`. I will first work on a memory based version. I am in good hope that the community will create other implementations depending on their needs. - -## You can help! - -There are many things that can be done by **you** to improve RxDB: - -- Check the [BACKLOG](https://github.com/pubkey/rxdb/blob/master/orga/BACKLOG.md) for features that would be great to have. -- Check the [breaking backlog](https://github.com/pubkey/rxdb/blob/master/orga/before-next-major.md) for breaking changes that must be implemented in the future but where I did not had the time yet. -- Check the [todos](https://github.com/pubkey/rxdb/search?q=todo) in the code. There are many small improvements that can be done for performance and build size. -- Review the code and add tests. I am only a single dude with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors. -- Improve the documentation. In the last user survey many users told me that the documentation is not good enough. But I reviewed the docs and could not find clear flaws. The problem is that I am way to deep into RxDB so that I am not able to understand which documentation a newcomer to the project needs. Likely I assume too much knowledge or focus writing about the wrong parts. -- Update the [example projects](https://github.com/pubkey/rxdb/tree/master/examples) many of them are outdated and need updates. - -## Discuss! - -Please [discuss here](https://github.com/pubkey/rxdb/issues/3279). diff --git a/docs/releases/11.0.0.html b/docs/releases/11.0.0.html deleted file mode 100644 index 922b909ac0a..00000000000 --- a/docs/releases/11.0.0.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - -RxDB 11 - WebWorker Support & More | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    11.0.0

    -

    The last major release was only about 6 month ago. But to further improve RxDB, it was necessary to make some more breaking changes and release the next major version. -In the last version 10.0.0 the storage layer was abstracted in a way to make it possible to not only use PouchDB as storage, but instead we can use different storage engines like the one based on LokiJS or any custom implementation of the RxStorage interface.

    -

    In the new version 11.0.0 the focus is on making it possible to put the RxStorage into a WebWorker to take CPU load from the main process into the worker's process. This can improve the perceived performance of your application, especially when you have to handle many documents or when you need the main process CPU cycles to manage the DOM with your frontend framework.

    -

    Worker plugin

    -

    Performance was always something RxDB had a struggle with. Not because RxDB itself is slow, but because the underlying storage engine (mostly PouchDB) or IndexedDB is slow. This never was a problem for 'normal' applications that have to store some documents. But on big applications with much data, there was a bottleneck.

    -

    With the Worker plugin, you can move the RxStorage out of the main JavaScript process. This makes it pretty easy to utilize more than one CPU core and speed up your application.

    -
    // worker.ts
    -import { wrappedRxStorage } from 'rxdb/plugins/worker';
    -import { getRxStorageLoki } from 'rxdb/plugins/storage-lokijs';
    -wrappedRxStorage({
    -    storage: getRxStorageLoki()
    -});
    -
    // main process
    -import { createRxDatabase } from 'rxdb/plugins/core';
    -import { getRxStorageWorker } from 'rxdb/plugins/worker';
    -const database = await createRxDatabase({
    -    name: 'mydatabase',
    -    storage: getRxStorageWorker(
    -        {
    -            workerInput: 'path/to/worker.js'
    -        }
    -    )
    -});
    -

    The whole documentation about the worker plugin can be found here.

    -

    Transpile async/await to promises instead of generators

    -

    The RxDB source-code is transpiled from TypeScript to es5/es6 JavaScript code via babel. -In the past we transpiled the async and await keywords with the babel plugin plugin-transform-async-to-generator. -Now we use the babel-plugin-transform-async-to-promises plugin instead. -It transpiles async/await into native Promises instead of using JavaScript generators. This has shown to decrease build size by about 10% and also improves the performance.

    -

    Removed deprecated received methods

    -

    In the past there was a typo in all getters and methods that are called received. -This was renamed to received and all mistyped methods have been deprecated. -We now removed all deprecated methods, so you have to use the correctly spelled methods instead. -See #3392

    -

    All internal events are handled as bulks

    -

    All events that are generated from writing to the storage instance are now handled in bulks instead of each event for its own. This has shown to save performance when the events are send over a data layer like a WebWorker or the BroadcastChannel. This change only affects you if you have created custom RxDB plugins.

    -

    RxStorage interface changes

    -

    To make the RxStorage abstraction compatible with Webworkers, we had to do some changes. These will only affect you if you use a custom RxStorage implementation.

    -
      -
    • The non async functions prepareQuery, getSortComparator and getQueryMatcher have been moved out of RxStorageInstance into the statics property of RxStorage. This makes it possible to split the code when using the worker plugin. You only need to load the static methods at the main process, and the whole storage engine is only loaded inside of the worker.
    • -
    • All data communication with the RxStorage now happens only via plain JSON objects. Instead of returning a JavaScript Map or Set, only JSON datatypes are allowed. This makes it easier to properly serialize the data when transferring it over to or from a WebWorker.
    • -
    • Events that are created from a write operation, must be emitted before the write operation resolves. This ensures that RxDB always knows about all events before it runs another operation. So when you do an insert and a query directly after the insert, the query will return the correct results.
    • -
    • The meta data digest and length of attachments is now created by RxDB, not by the RxStorage. #3548
    • -
    • Added the statics hashKey property to identify the used hash function.
    • -
    -

    Removed the no-validate plugin.

    -

    In the past, RxDB required you to add one schema validation plugin. For production, it was useful to not have any schema validation for better performance and a smaller build size. For that, the no-validate plugin could be added which was just a dummy plugin that did no do any validation. To remove this unnecessary complexity, RxDB no longer requires you to add a validation plugin. Therefore the no-validate plugin is now removed as it is no longer needed.

    -

    Other changes

    -
      -
    • The LokiJS RxStorage no longer uses the IdleQueue to determine if the database is idle. Because LokiJS is in-memory, we can just wait for CPU idleness via requestIdleCallback()
    • -
    • Bugfix: Do not throw an error when database is destroyed while a GraphQL replication is running.
    • -
    • Compound primary key migration throws "Value of primary key(s) cannot be changed" #3546
    • -
    • Allow _id as primaryKey #3562 Thanks @SuperKirik
    • -
    • LokiJS: Remote operations do never resolve when remote instance was leader and died.
    • -
    -

    Migration from 10.x.x

    -

    The migration should be pretty easy. Nothing in the datalayer has been changed, so you can use the stored data of v10 together with the new v11 RxDB.

    -

    You can help!

    -

    There are many things that can be done by you to improve RxDB:

    -
      -
    • Check the BACKLOG for features that would be great to have.
    • -
    • Check the breaking backlog for breaking changes that must be implemented in the future but where I did not had the time yet.
    • -
    • Check the todos in the code. There are many small improvements that can be done for performance and build size.
    • -
    • Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors.
    • -
    • Improve the documentation. In the last user survey many users told me that the documentation is not good enough. But I reviewed the docs and could not find clear flaws. The problem is that I am way to deep into RxDB so that I am not able to understand which documentation a newcomer to the project needs. Likely I assume too much knowledge or focus writing about the wrong parts.
    • -
    • Update the example projects many of them are outdated and need updates.
    • -
    -

    Discuss!

    -

    Please discuss here.

    - - \ No newline at end of file diff --git a/docs/releases/11.0.0.md b/docs/releases/11.0.0.md deleted file mode 100644 index 4722772fb91..00000000000 --- a/docs/releases/11.0.0.md +++ /dev/null @@ -1,100 +0,0 @@ -# RxDB 11 - WebWorker Support & More - -> RxDB 11.0 brings Worker-based storage for multi-core performance gains. Explore the major changes and migrate seamlessly to harness new speeds. - -# 11.0.0 - -The last major release was only about [6 month ago](./10.0.0.md). But to further improve RxDB, it was necessary to make some more breaking changes and release the next major version. -In the last version `10.0.0` the storage layer was abstracted in a way to make it possible to not only use PouchDB as storage, but instead we can use different storage engines like the one based on [LokiJS](../rx-storage-lokijs.md) or any custom implementation of the `RxStorage` interface. - -In the new version `11.0.0` the focus is on making it possible to put the RxStorage into a **WebWorker** to take CPU load from the main process into the worker's process. This can improve the perceived performance of your application, especially when you have to handle many documents or when you need the main process CPU cycles to manage the DOM with your frontend framework. - -## Worker plugin - -Performance was always something RxDB had a struggle with. Not because RxDB itself is slow, but because the underlying storage engine (mostly PouchDB) or [IndexedDB is slow](../slow-indexeddb.md). This never was a problem for 'normal' applications that have to store some documents. But on big applications with much data, there was a bottleneck. - -With the Worker plugin, you can move the `RxStorage` out of the main JavaScript process. This makes it pretty easy to utilize more than one CPU core and speed up your application. - -```ts -// worker.ts -import { wrappedRxStorage } from 'rxdb/plugins/worker'; -import { getRxStorageLoki } from 'rxdb/plugins/storage-lokijs'; -wrappedRxStorage({ - storage: getRxStorageLoki() -}); -``` - -```ts -// main process -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageWorker } from 'rxdb/plugins/worker'; -const database = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageWorker( - { - workerInput: 'path/to/worker.js' - } - ) -}); -``` - -The whole documentation about the worker plugin can be found [here](../rx-storage-worker.md). - -## Transpile `async`/`await` to promises instead of generators - -The RxDB source-code is transpiled from TypeScript to es5/es6 JavaScript code via babel. -In the past we transpiled the `async` and `await` keywords with the babel plugin `plugin-transform-async-to-generator`. -Now we use the [babel-plugin-transform-async-to-promises](https://github.com/rpetrich/babel-plugin-transform-async-to-promises) plugin instead. -It transpiles `async`/`await` into native `Promise`s instead of using JavaScript generators. This has shown to decrease build size by about 10% and also improves the performance. - -## Removed deprecated `received` methods - -In the past there was a typo in all getters and methods that are called `received`. -This was renamed to `received` and all mistyped methods have been deprecated. -We now removed all deprecated methods, so you have to use the correctly spelled methods instead. -[See #3392](https://github.com/pubkey/rxdb/pull/3392) - -## All internal events are handled as bulks - -All events that are generated from writing to the storage instance are now handled in bulks instead of each event for its own. This has shown to save performance when the events are send over a data layer like a `WebWorker` or the `BroadcastChannel`. This change only affects you if you have created custom RxDB plugins. - -## RxStorage interface changes - -To make the RxStorage abstraction compatible with Webworkers, we had to do some changes. These will only affect you if you use a custom RxStorage implementation. - -- The non async functions `prepareQuery`, `getSortComparator` and `getQueryMatcher` have been moved out of `RxStorageInstance` into the `statics` property of `RxStorage`. This makes it possible to split the code when using the worker plugin. You only need to load the static methods at the main process, and the whole storage engine is only loaded inside of the worker. -- All data communication with the RxStorage now happens only via plain JSON objects. Instead of returning a JavaScript `Map` or `Set`, only [JSON datatypes](https://www.w3schools.com/js/js_json_datatypes.asp) are allowed. This makes it easier to properly serialize the data when transferring it over to or from a WebWorker. -- Events that are created from a write operation, must be emitted **before** the write operation resolves. This ensures that RxDB always knows about all events before it runs another operation. So when you do an insert and a query directly after the insert, the query will return the correct results. -- The meta data `digest` and `length` of attachments is now created by RxDB, not by the RxStorage. [#3548](https://github.com/pubkey/rxdb/issues/3548) -- Added the statics `hashKey` property to identify the used hash function. - -## Removed the `no-validate` plugin. - -In the past, RxDB required you to add one schema validation plugin. For production, it was useful to not have any schema validation for better performance and a smaller build size. For that, the `no-validate` plugin could be added which was just a dummy plugin that did no do any validation. To remove this unnecessary complexity, RxDB no longer requires you to add a validation plugin. Therefore the no-validate plugin is now removed as it is no longer needed. - -## Other changes - -- The LokiJS RxStorage no longer uses the `IdleQueue` to determine if the database is idle. Because LokiJS is in-memory, we can just wait for CPU idleness via [requestIdleCallback()](https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback) -- Bugfix: Do not throw an error when database is destroyed while a GraphQL replication is running. -- Compound primary key migration throws "Value of primary key(s) cannot be changed" [#3546](https://github.com/pubkey/rxdb/pull/3546) -- Allow `_id` as primaryKey [#3562](https://github.com/pubkey/rxdb/pull/3562) Thanks [@SuperKirik](https://github.com/SuperKirik) -- LokiJS: Remote operations do never resolve when remote instance was leader and died. - -## Migration from `10.x.x` - -The migration should be pretty easy. Nothing in the datalayer has been changed, so you can use the stored data of v10 together with the new v11 RxDB. - -## You can help! - -There are many things that can be done by **you** to improve RxDB: - -- Check the [BACKLOG](https://github.com/pubkey/rxdb/blob/master/orga/BACKLOG.md) for features that would be great to have. -- Check the [breaking backlog](https://github.com/pubkey/rxdb/blob/master/orga/before-next-major.md) for breaking changes that must be implemented in the future but where I did not had the time yet. -- Check the [todos](https://github.com/pubkey/rxdb/search?q=todo) in the code. There are many small improvements that can be done for performance and build size. -- Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors. -- Improve the documentation. In the last user survey many users told me that the documentation is not good enough. But I reviewed the docs and could not find clear flaws. The problem is that I am way to deep into RxDB so that I am not able to understand which documentation a newcomer to the project needs. Likely I assume too much knowledge or focus writing about the wrong parts. -- Update the [example projects](https://github.com/pubkey/rxdb/tree/master/examples) many of them are outdated and need updates. - -## Discuss! - -Please [discuss here](https://github.com/pubkey/rxdb/issues/3555). diff --git a/docs/releases/12.0.0.html b/docs/releases/12.0.0.html deleted file mode 100644 index 20f0be83e6e..00000000000 --- a/docs/releases/12.0.0.html +++ /dev/null @@ -1,200 +0,0 @@ - - - - - -RxDB 12.0.0 - Clean, Lean & Mean | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxDB 12.0.0

    -

    For the last few months, I worked hard on the new RxDB version 12 release. I mostly focused on performance related features and refactored much of the code.

    -

    Removed the core plugin

    -

    In the past, RxDB exported all bundled plugins when doing import from 'rxdb';. -This increased the bundle size, so optionally people could import from 'rxdb/plugins/core'; to create a custom build that only contains the plugin that they really need. -But very often this lead to accidental imports of 'rxdb'. For example, when the code editor auto imported methods. -So now, the default import from 'rxdb'; only exports RxDB core. Every plugin must be imported afterwards if needed.

    -

    Unified the replication primitives and the GraphQL replication plugin

    -

    Most of the GraphQL replication code has been replaced by using the replication primitives plugin internally. -This means many bugs and undefined behavior that was already fixed in the replication primitives, are now also fixed in the GraphQL replication.

    -

    Also, the GraphQL replication now runs push in bulk. This means you either have to update your backend to accept bulk mutations, or set push.batchSize: 1 and transform the array into a single document inside push.queryBuilder().

    -

    Added the cleanup plugin

    -

    To make replication work, and for other reasons, RxDB has to keep deleted documents in storage. -This ensures that when a client is offline, the deletion state is still known and can be replicated with the backend when the client goes online again.

    -

    Keeping too many deleted documents in the storage can slow down queries or fill up too much disk space. -With the cleanup plugin, RxDB will run cleanup cycles that clean up deleted documents when it can be done safely.

    -

    Allow to set a specific index

    -

    By default, the query will be sent to RxStorage, where a query planner will determine which one of the available indexes must be used. -But the query planner cannot know everything and sometimes will not pick the most optimal index. -To improve query performance, you can specify which index must be used, when running the query.

    -
    const queryResults = await myCollection
    -    .find({
    -      selector: {
    -        age: {
    -          $gt: 18
    -        },
    -        gender: {
    -          $eq: 'm'
    -        }
    -      },
    -      /**
    -       * Because the developer knows that 50% of the documents are 'male',
    -       * but only 20% are below age 18,
    -       * it makes sense to enforce using the ['gender', 'age'] index to improve performance.
    -       * This could not be known by the query planner which might have chosen ['age', 'gender'] instead.
    -       */
    -      index: ['gender', 'age']
    -    }).exec();
    -

    Enforce primaryKey in the index

    -

    For various performance optimizations, like the EventReduce algorithm, RxDB needs a deterministic sort order for all query results. -To ensure a deterministic sorting, RxDB now automatically adds the primary key as last sort attribute to every query, if it is not there already. This ensures that all documents that have the same attributes on all query relevant fields, still can be sorted in a deterministic way, not depending on which was written first to the database.

    -

    In the past, this often lead to slow queries, because indexes where not constructed with that in mind. -Now RxDB will add the primaryKey to all indexes that do not contain it already. -If you have any collection with a custom index set, you need to run a migration when updating to RxDB version 12.0.0 so that RxDB can rebuild the indexes.

    -

    Fields that are used in indexes need some meta attributes

    -

    When using a schema with indexes, depending on the field type, you must have set some meta attributes like maxLength or minimum. This is required so that RxDB -is able to know the maximum string representation length of a field, which is needed to craft custom indexes on several RxStorage implementations.

    -
    const schemaWithIndexes = {
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -      id: {
    -          type: 'string',
    -          maxLength: 100 // <- the primary key must set `maxLength`
    -      },
    -      firstName: {
    -          type: 'string',
    -          maxLength: 100 // <- string-fields that are used as an index, must set `maxLength`.
    -      },
    -      active: {
    -          type: 'boolean'
    -      },
    -      balance: {
    -          type: 'number',
    - 
    -          // number fields that are used in an index, must set `minimum`, `maximum` and `multipleOf`
    -          minimum: 0,
    -          maximum: 100000,
    -          multipleOf: '0.01'
    -      }
    -  },
    -  required: [
    -      'active' // <- boolean fields that are used in an index, must be required. 
    -  ],
    -  indexes: [
    -    'firstName',
    -    ['active', 'firstName']
    -  ]
    -};
    -

    Introduce _meta field

    -

    In the past, RxDB used a hacky way to mark documents as being from the remote instance during replication. -This is needed to ensure that pulled documents are not sent to the backend again. -RxDB crafted a specific revision string and stored the data with that string. -This meant that it was not possible to replicate with multiple endpoints at the same time. -From now on, all document data is stored with an _meta field that can contain various flags and other values. -This makes it easier for plugins to remember stuff that belongs to the document.

    -

    In the future, the other meta fields like _rev, _deleted and _attachments will be moved from the root level -to the _meta field. This is not done in release 12.0.0 to ensure that there is a migration path.

    -

    Removed RxStorage RxKeyObjectInstance

    -

    In the past, we stored local documents and internal data in a RxStorageKeyObjectInstance of the RxStorage interface. -In PouchDB, this has a slight performance improvement compared to storing that data in 'normal' documents because it does not have to handle the revision tree. -But this improved performance is only possible because normal document handling on PouchDB is so slow. -For every other RxStorage implementation, it does not really matter if documents are stored in a query-able way or not. Therefore, the whole RxStorageKeyObjectInstance is removed. Instead, RxDB now stores local documents and internal data in normal storage instances. This removes complexity and makes things easier in the future. For example, we could now migrate local documents or query them in plugins.

    -

    Refactor plugin hooks

    -

    In the past, an RxPlugin could add plugins hooks which where always added as last. -This meant that some plugins depended on having the correct order when calling addRxPlugin(). -Now each plugin hook can be either defined as before or after to specify at which position of the current hooks -the new hook must be added.

    -

    Local documents must be activated per RxDatabase/RxCollection

    -

    For better performance, the local document plugin does not create a storage for every database or collection that is created. -Instead, you have to set localDocuments: true when you want to store local documents in the instance.

    -
    // activate local documents on a RxDatabase
    -const myDatabase = await createRxDatabase({
    -    name: 'mydatabase',
    -    storage: getRxStoragePouch('memory'),
    -    localDocuments: true // <- activate this to store local documents in the database
    -});
    - 
    -myDatabase.addCollections({
    -  messages: {
    -    schema: messageSchema,
    -    localDocuments: true // <- activate this to store local documents in the collection
    -  }
    -});
    -

    Added Memory RxStorage

    -

    The Memory RxStorage is based on plain in-memory arrays and objects. It can be used in all environments and is made for performance.

    -

    RxDB Premium 👑

    -

    You can now purchase access to additional RxDB plugins that are part of the RxDB Premium 👑 package.

    -

    If you have sponsored RxDB in the past (before the April 2022), you can get free lifetime access to RxDB Premium 👑 by writing me via Twitter

    -
      -
    • RxStorage IndexedDB a really fast RxStorage implementation based on IndexedDB. Made to be used in browsers.
    • -
    • RxStorage SQLite a really fast RxStorage implementation based on SQLite. Made to be used on Node.js, Electron, React Native, Cordova or Capacitor.
    • -
    • RxStorage Sharding a wrapper around any other RxStorage that improves performance by applying the sharding technique.
    • -
    • migrateRxDBV11ToV12 A plugin that migrates data from any RxDB v11 storage to a new RxDB v12 database. Use this when you upgrade from RxDB 11->12 and you have to keep your database state.
    • -
    -

    Other changes

    -
      -
    • The Dexie.js RxStorage is no longer in beta mode.
    • -
    • Added RxDocument().toMutableJSON()
    • -
    • Added RxCollection().bulkUpsert()
    • -
    • Added optional init() function to RxPlugin.
    • -
    • dev-mode: Add check to ensure all top-level fields in a query are defined in the schema.
    • -
    • Support for array field based indexes like data.[].subfield was removed, as it anyway never really worked.
    • -
    • Refactored the usage of RxCollection.storageInstance to ensure all hooks run properly.
    • -
    • Refactored the encryption plugin so no more plugin specific code is in the RxDB core.
    • -
    • Removed the encrypted export from the json-import-export plugin. This was barely used and made everything more complex. All exports are now non-encrypted. If you need them encrypted, you can still run by encryption after the export is done.
    • -
    • RxPlugin hooks now can be defined as running before or after other plugin hooks.
    • -
    • Attachments are now internally handled as string instead of Blob or Buffer
    • -
    • Fix (replication primitives) only drop pulled documents when a relevant document was changed locally.
    • -
    • Fix dexie.js was not able to query over an index when keyCompression: true
    • -
    -

    Changes to RxStorageInterface:

    -
      -
    • RxStorageInstance must have the RxStorage in the storage property.
    • -
    • The _deleted field is now required for each data interaction with RxStorage.
    • -
    • Removed RxStorageInstance.getChangedDocuments() and added RxStorageInstance.getChangedDocumentsSince() for better performance.
    • -
    • Added doesBroadcastChangestream() to RxStorageStatics
    • -
    • Added withDeleted parameter to RxStorageKeyObjectInstance.findLocalDocumentsById()
    • -
    • Added internal _meta property to stored document data that contains internal document related data like last-write-time and replication checkpoints.
    • -
    -

    You can help!

    -

    There are many things that can be done by you to improve RxDB:

    -
      -
    • Check the BACKLOG for features that would be great to have.
    • -
    • Check the breaking backlog for breaking changes that must be implemented in the future but where I did not have the time yet.
    • -
    • Check the todos in the code. There are many small improvements that can be done for performance and build size.
    • -
    • Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors.
    • -
    • Improve the documentation. In the last user survey, many users told me that the documentation is not good enough. But I reviewed the docs and could not find clear flaws. The problem is that I am way too deep into RxDB so that I am not able to understand which documentation a newcomer to the project needs. Likely I assume too much knowledge or focus writing about the wrong parts.
    • -
    • Update the example projects many of them are outdated and need updates.
    • -
    • Help the next PouchDB release to improve RxDBs performance.
    • -
    - - \ No newline at end of file diff --git a/docs/releases/12.0.0.md b/docs/releases/12.0.0.md deleted file mode 100644 index 1e93483672f..00000000000 --- a/docs/releases/12.0.0.md +++ /dev/null @@ -1,204 +0,0 @@ -# RxDB 12.0.0 - Clean, Lean & Mean - -> Upgrade to RxDB 12.0.0 for blazing-fast queries, streamlined replication, and better index usage. Explore new features and power up your app. - -# [RxDB](https://rxdb.info/) 12.0.0 - -For the last few months, I worked hard on the new RxDB version 12 release. I mostly focused on performance related features and refactored much of the code. - -## Removed the `core` plugin - -In the past, RxDB exported all bundled plugins when doing `import from 'rxdb';`. -This increased the bundle size, so optionally people could `import from 'rxdb/plugins/core';` to create a custom build that only contains the plugin that they really need. -But very often this lead to accidental imports of `'rxdb'`. For example, when the code editor auto imported methods. -So now, the default `import from 'rxdb';` only exports RxDB core. Every plugin must be imported afterwards if needed. - -## Unified the replication primitives and the GraphQL replication plugin - -Most of the GraphQL replication code has been replaced by using the replication primitives plugin internally. -This means many bugs and undefined behavior that was already fixed in the replication primitives, are now also fixed in the GraphQL replication. - -Also, the GraphQL replication now runs `push` in bulk. This means you either have to update your backend to accept bulk mutations, or set `push.batchSize: 1` and transform the array into a single document inside `push.queryBuilder()`. - -## Added the cleanup plugin - -To make replication work, and for other reasons, RxDB has to keep deleted documents in storage. -This ensures that when a client is offline, the deletion state is still known and can be replicated with the backend when the client goes online again. - -Keeping too many deleted documents in the storage can slow down queries or fill up too much disk space. -With the [cleanup plugin](https://rxdb.info/cleanup.html), RxDB will run cleanup cycles that clean up deleted documents when it can be done safely. - -## Allow to set a specific index - -By default, the query will be sent to RxStorage, where a query planner will determine which one of the available indexes must be used. -But the query planner cannot know everything and sometimes will not pick the most optimal index. -To improve query performance, you can specify which index must be used, when running the query. - -```ts -const queryResults = await myCollection - .find({ - selector: { - age: { - $gt: 18 - }, - gender: { - $eq: 'm' - } - }, - /** - * Because the developer knows that 50% of the documents are 'male', - * but only 20% are below age 18, - * it makes sense to enforce using the ['gender', 'age'] index to improve performance. - * This could not be known by the query planner which might have chosen ['age', 'gender'] instead. - */ - index: ['gender', 'age'] - }).exec(); -``` - -## Enforce primaryKey in the index - -For various performance optimizations, like the [EventReduce](https://github.com/pubkey/event-reduce) algorithm, RxDB needs a **deterministic sort order** for all query results. -To ensure a deterministic sorting, RxDB now automatically adds the primary key as last sort attribute to every query, if it is not there already. This ensures that all documents that have the same attributes on all query relevant fields, still can be sorted in a deterministic way, not depending on which was written first to the database. - -In the past, this often lead to slow queries, because indexes where not constructed with that in mind. -Now RxDB will add the `primaryKey` to all indexes that do not contain it already. -If you have any collection with a custom index set, you need to run a [migration](https://rxdb.info/migration-schema.html) when updating to RxDB version `12.0.0` so that RxDB can rebuild the indexes. - -## Fields that are used in indexes need some meta attributes - -When using a schema with indexes, depending on the field type, you must have set some meta attributes like `maxLength` or `minimum`. This is required so that RxDB -is able to know the maximum string representation length of a field, which is needed to craft custom indexes on several `RxStorage` implementations. - -```javascript -const schemaWithIndexes = { - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 // <- the primary key must set `maxLength` - }, - firstName: { - type: 'string', - maxLength: 100 // <- string-fields that are used as an index, must set `maxLength`. - }, - active: { - type: 'boolean' - }, - balance: { - type: 'number', - - // number fields that are used in an index, must set `minimum`, `maximum` and `multipleOf` - minimum: 0, - maximum: 100000, - multipleOf: '0.01' - } - }, - required: [ - 'active' // <- boolean fields that are used in an index, must be required. - ], - indexes: [ - 'firstName', - ['active', 'firstName'] - ] -}; -``` - -## Introduce `_meta` field - -In the past, RxDB used a hacky way to mark documents as being from the remote instance during replication. -This is needed to ensure that pulled documents are not sent to the backend again. -RxDB crafted a specific revision string and stored the data with that string. -This meant that it was not possible to replicate with multiple endpoints at the same time. -From now on, all document data is stored with an `_meta` field that can contain various flags and other values. -This makes it easier for plugins to remember stuff that belongs to the document. - -**In the future**, the other meta fields like `_rev`, `_deleted` and `_attachments` will be moved from the root level -to the `_meta` field. This is **not** done in release `12.0.0` to ensure that there is a migration path. - -## Removed RxStorage RxKeyObjectInstance - -In the past, we stored local documents and internal data in a `RxStorageKeyObjectInstance` of the `RxStorage` interface. -In PouchDB, this has a [slight performance](https://pouchdb.com/guides/local-documents.html#advantages-of-local%E2%80%93docs) improvement compared to storing that data in 'normal' documents because it does not have to handle the revision tree. -But this improved performance is only possible because normal document handling on PouchDB is so slow. -For every other RxStorage implementation, it does not really matter if documents are stored in a query-able way or not. Therefore, the whole `RxStorageKeyObjectInstance` is removed. Instead, RxDB now stores local documents and internal data in normal storage instances. This removes complexity and makes things easier in the future. For example, we could now migrate local documents or query them in plugins. - -## Refactor plugin hooks - -In the past, an `RxPlugin` could add plugins hooks which where always added as last. -This meant that some plugins depended on having the correct order when calling `addRxPlugin()`. -Now each plugin hook can be either defined as `before` or `after` to specify at which position of the current hooks -the new hook must be added. - -## Local documents must be activated per RxDatabase/RxCollection - -For better performance, the local document plugin does not create a storage for every database or collection that is created. -Instead, you have to set `localDocuments: true` when you want to store local documents in the instance. - -```js -// activate local documents on a RxDatabase -const myDatabase = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStoragePouch('memory'), - localDocuments: true // <- activate this to store local documents in the database -}); - -myDatabase.addCollections({ - messages: { - schema: messageSchema, - localDocuments: true // <- activate this to store local documents in the collection - } -}); -``` - -## Added Memory RxStorage - -The [Memory RxStorage](https://rxdb.info/rx-storage-memory.html) is based on plain in-memory arrays and objects. It can be used in all environments and is made for performance. - -## RxDB Premium 👑 - -You can now purchase access to additional RxDB plugins that are part of the [RxDB Premium 👑](/premium/) package. - -**If you have [sponsored](https://github.com/sponsors/pubkey) RxDB in the past (before the April 2022), you can get free lifetime access to RxDB Premium 👑 by writing me via [Twitter](https://twitter.com/rxdbjs)** - -- [RxStorage IndexedDB](https://rxdb.info/rx-storage-indexeddb.html) a really fast [RxStorage](https://rxdb.info/rx-storage.html) implementation based on **IndexedDB**. Made to be used in browsers. -- [RxStorage SQLite](https://rxdb.info/rx-storage-sqlite.html) a really fast [RxStorage](https://rxdb.info/rx-storage.html) implementation based on **SQLite**. Made to be used on **Node.js**, **Electron**, **React Native**, **Cordova** or **Capacitor**. -- [RxStorage Sharding](https://rxdb.info/rx-storage-sharding.html) a wrapper around any other [RxStorage](https://rxdb.info/rx-storage.html) that improves performance by applying the sharding technique. -- **migrateRxDBV11ToV12** A plugin that migrates data from any RxDB v11 storage to a new RxDB v12 database. Use this when you upgrade from RxDB 11->12 and you have to keep your database state. - -## Other changes - -- The Dexie.js RxStorage is no longer in beta mode. -- Added `RxDocument().toMutableJSON()` -- Added `RxCollection().bulkUpsert()` -- Added optional `init()` function to `RxPlugin`. -- dev-mode: Add check to ensure all top-level fields in a query are defined in the schema. -- Support for array field based indexes like `data.[].subfield` was removed, as it anyway never really worked. -- Refactored the usage of RxCollection.storageInstance to ensure all hooks run properly. -- Refactored the encryption plugin so no more plugin specific code is in the RxDB core. -- Removed the encrypted export from the json-import-export plugin. This was barely used and made everything more complex. All exports are now non-encrypted. If you need them encrypted, you can still run by encryption after the export is done. -- RxPlugin hooks now can be defined as running `before` or `after` other plugin hooks. -- Attachments are now internally handled as string instead of `Blob` or `Buffer` -- Fix (replication primitives) only drop pulled documents when a relevant document was changed locally. -- Fix dexie.js was not able to query over an index when `keyCompression: true` - -Changes to `RxStorageInterface`: -- `RxStorageInstance` must have the `RxStorage` in the `storage` property. -- The `_deleted` field is now required for each data interaction with `RxStorage`. -- Removed `RxStorageInstance.getChangedDocuments()` and added `RxStorageInstance.getChangedDocumentsSince()` for better performance. -- Added `doesBroadcastChangestream()` to `RxStorageStatics` -- Added `withDeleted` parameter to `RxStorageKeyObjectInstance.findLocalDocumentsById()` -- Added internal `_meta` property to stored document data that contains internal document related data like last-write-time and replication checkpoints. - -## You can help! - -There are many things that can be done by **you** to improve RxDB: - -- Check the [BACKLOG](https://github.com/pubkey/rxdb/blob/master/orga/BACKLOG.md) for features that would be great to have. -- Check the [breaking backlog](https://github.com/pubkey/rxdb/blob/master/orga/before-next-major.md) for breaking changes that must be implemented in the future but where I did not have the time yet. -- Check the [todos](https://github.com/pubkey/rxdb/search?q=todo) in the code. There are many small improvements that can be done for performance and build size. -- Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors. -- Improve the documentation. In the last user survey, many users told me that the documentation is not good enough. But I reviewed the docs and could not find clear flaws. The problem is that I am way too deep into RxDB so that I am not able to understand which documentation a newcomer to the project needs. Likely I assume too much knowledge or focus writing about the wrong parts. -- Update the [example projects](https://github.com/pubkey/rxdb/tree/master/examples) many of them are outdated and need updates. -- Help the next [PouchDB release](https://github.com/pouchdb/pouchdb/issues/8408) to improve RxDBs performance. diff --git a/docs/releases/13.0.0.html b/docs/releases/13.0.0.html deleted file mode 100644 index 6abbb2ebb25..00000000000 --- a/docs/releases/13.0.0.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - -RxDB 13.0.0 - A New Era of Replication | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    13.0.0

    -

    So in the last major RxDB versions, the focus was set to improvements of the storage engine. This is done. RxDB has now multiple RxStorage implementations, a better query planner and an improved test suite to ensure everything works correct. -This let to huge improvements in write and query performance and decreased the initial pageload of RxDB based applications.

    -

    In the new major version 13.0.0, the focus was set to improvements to the replication protocol. -When I first implemented the GraphQL replication a few years ago, I had a specific use case in mind and designed the whole protocol and replication plugins around that use case.

    -

    But the time has shown, that the old replication protocol is a big downside of RxDB:

    -
      -
    • The replication relied on the backend to solve all conflicts. This was easy to implement into RxDB because the whole responsibility was given away to the person that has to implement a compatible backend.
    • -
    • In each point in time, the replication did either push or pull documents, but never in parallel. This slows done the whole replication process and makes RxDB not usable for the implementation of features like multi-user-real-time-collaboration or when many read- and write operations have to happen in a short timespan.
    • -
    • After each push, a pull had to be run to check if the backend had changed the state to solve a conflict.
    • -
    • The replication protocol did not support attachments and was not designed to ever support them.
    • -
    -

    So in version 13.0.0 I replaced the whole replication plugins with a new replication protocol. The main goals have been:

    -
      -
    • Push- and Pull in parallel.
    • -
    • Use the data in the changestream (optional) to decrease replication latency.
    • -
    • Implement the conflict resolution into RxDB so that the client resolves its own conflicts and does not rely on the backend.
    • -
    • Decrease the complexity for a compatible backend implementation. The new protocol relies on a dumb backend. This will open compatibility with many other use cases like implementing Offline-First in Supabase or using CouchDB but having a faster replication compared to the native CouchDB replication.
    • -
    • Make it possible to use CRDTs instead of a conflict resolution.
    • -
    • Design a the protocol in a way to make it possible to add attachments replication in the future.
    • -
    -

    On the RxDocument level, the replication works like git, where the fork/client contains all new writes and must be merged with the master/server before it can push its new state to the master/server.

    -
    A---B1---C1---X    master/server state
    -     \       /
    -      B1---C2      fork/client state
    -
    -

    For more details, read the documentation about the new RxDB Sync Engine.

    -

    Backends that have been compatible with the previous RxDB versions 12 and older, will not work with the new replication protocol. To learn how to do that, either read the docs or check out the GraphQL example.

    -

    Other breaking changes

    -
      -
    • -

      RENAMED the ajv-validate plugin to validate-ajv to be in equal with the other validation plugins.

      -
    • -
    • -

      The is-my-json-valid validation is no longer supported until this bug is fixed.

      -
    • -
    • -

      REFACTORED the schema validation plugins, they are no longer plugins but now they get wrapped around any other RxStorage.

      -
        -
      • It allows us to run the validation inside of a Worker RxStorage instead of running it in the main JavaScript process.
      • -
      • It allows us to configure which RxDatabase instance must use the validation and which does not. In production it often makes sense to validate user data, but you might not need the validation for data that is only replicated from the backend.
      • -
      -
    • -
    • -

      REFACTORED the key compression plugin, it is no longer a plugin but now a wrapper around any other RxStorage.

      -
        -
      • It allows to run the key-compression inside of a Worker RxStorage instead of running it in the main JavaScript process.
      • -
      -
    • -
    • -

      REFACTORED the encryption plugin, it is no longer a plugin but now a wrapper around any other RxStorage.

      -
        -
      • It allows to run the encryption inside of a Worker RxStorage instead of running it in the main JavaScript process.
      • -
      • It allows do use asynchronous crypto function like WebCrypto
      • -
      -
    • -
    • -

      Store the password hash in the same write request as the database token to improve performance.

      -
    • -
    • -

      REMOVED support for temporary documents see here

      -
    • -
    • -

      REMOVED RxDatabase.broadcastChannel The broadcast channel has been moved out of the RxDatabase and is part of the RxStorage. So it is no longer exposed via RxDatabase.broadcastChannel.

      -
    • -
    • -

      Removed the liveInterval option of the replication plugins. It was an edge case feature with wrong defaults. If you want to run the pull replication on interval, you can send a RESYNC event manually in a loop.

      -
    • -
    • -

      REPLACED RxReplicationPullError and RxReplicationPushError with normal RxError like in the rest of the RxDB code.

      -
    • -
    • -

      REMOVED the option to filter out replication documents with the push/pull modifiers #2552 because this does not work with the new replication protocol.

      -
    • -
    • -

      CHANGE default of replication live to be set to true. Because most people want to do a live replication, not a one time replication.

      -
    • -
    • -

      RENAMED the server plugin is now called server-couchdb and RxDatabase.server() is now RxDatabase.serverCouchDB()

      -
    • -
    • -

      CHANGED Attachment data is now always handled as Blob because Node.js does support Blob since version 18.0.0 so we no longer have to use a Buffer but instead can use Blob for browsers and Node.js

      -
    • -
    • -

      REFACTORED the layout of RxChangeEvent to better match the RxDB requirements and to fix the 'deleted-document-is-modified-but-still-deleted' bug.

      -
    • -
    -

    When used with Node.js, RxDB now requires Node.js version 18.0.0 or higher.

    -

    Other non breaking or internal changes

    -
      -
    • -

      REMOVED many unused plugin hooks because they decreased the performance.

      -
    • -
    • -

      REMOVE RxStorageStatics .hash and .hashKey

      -
    • -
    • -

      CHANGE removed default usage of md5 as default hashing. Use a faster non-cryptographic hash instead.

      -
        -
      • ADD option to pass a custom hash function when calling createRxDatabase.
      • -
      -
    • -
    • -

      CHANGE use Float instead of Int to represent timestamps in GraphQL.

      -
    • -
    • -

      FIXED multiple problems with encoding attachments data. We now use the js-base64 library which properly handles utf-8/binary/ascii transformations.

      -
    • -
    • -

      In the RxDB internal _meta.lwt field, we now use 2 decimals number of the unix timestamp in milliseconds.

      -
    • -
    • -

      ADDED checkpointSchema to the RxStorage.statics interface.

      -
    • -
    -

    New Features

    - -

    Migration to the new version

    -

    Stored data of the previous RxDB versions is not compatible with RxDB 13.0.0. So if you want to keep that data, you have to migrate it in a way. For most use cases you might want to just drop the data from the client and re-sync it again from the backend. To keep the data locally, you might want to use the storage migration plugin.

    - - \ No newline at end of file diff --git a/docs/releases/13.0.0.md b/docs/releases/13.0.0.md deleted file mode 100644 index 6779dc6d082..00000000000 --- a/docs/releases/13.0.0.md +++ /dev/null @@ -1,94 +0,0 @@ -# RxDB 13.0.0 - A New Era of Replication - -> Discover RxDB 13.0's brand-new replication protocol, faster performance, and real-time collaboration for a seamless offline-first experience. - -# 13.0.0 - -So in the last major RxDB versions, the focus was set to **improvements of the storage engine**. This is done. RxDB has now [multiple RxStorage implementations](../rx-storage.md), a better query planner and an improved test suite to ensure everything works correct. -This let to huge improvements in write and query performance and decreased the initial pageload of RxDB based applications. - -In the new major version `13.0.0`, the focus was set to improvements to the **replication protocol**. -When I first implemented the GraphQL replication a few years ago, I had a specific use case in mind and designed the whole protocol and replication plugins around that use case. - -But the time has shown, that the old replication protocol is a big downside of RxDB: - - The replication relied on the backend to solve all **conflicts**. This was easy to implement into RxDB because the whole responsibility was given away to the person that has to implement a compatible backend. - - In each point in time, the replication did either push or pull documents, but **never in parallel**. This slows done the whole replication process and makes RxDB not usable for the implementation of features like **multi-user-real-time-collaboration** or when many read- and write operations have to happen in a short timespan. - - After each `push`, a `pull` had to be run to check if the backend had changed the state to solve a conflict. - - The replication protocol did not support attachments and was not designed to ever support them. - -So in version `13.0.0` I replaced the whole replication plugins with a new replication protocol. The main goals have been: - - Push- and Pull in parallel. - - Use the data in the changestream (optional) to decrease replication latency. - - Implement the conflict resolution into RxDB so that the **client resolves its own conflicts** and does not rely on the backend. - - Decrease the complexity for a compatible backend implementation. The new protocol relies on a *dumb* backend. This will open compatibility with many other use cases like implementing [Offline-First in Supabase](https://github.com/supabase/supabase/discussions/357) or using CouchDB but having a faster replication compared to the native CouchDB replication. - - Make it possible to use [CRDTs](https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type) instead of a conflict resolution. - - Design a the protocol in a way to make it possible to add attachments replication in the future. - -On the RxDocument level, the replication works like git, where the fork/client contains all new writes and must be merged with the master/server before it can push its new state to the master/server. - -``` -A---B1---C1---X master/server state - \ / - B1---C2 fork/client state -``` - -For more details, read the [documentation about the new RxDB Sync Engine](../replication.md). - -Backends that have been compatible with the previous RxDB versions `12` and older, will not work with the new replication protocol. To learn how to do that, either read the [docs](../replication.md) or check out the [GraphQL example](https://github.com/pubkey/rxdb/tree/master/examples/graphql). - -## Other breaking changes - -- RENAMED the `ajv-validate` plugin to `validate-ajv` to be in equal with the other validation plugins. -- The `is-my-json-valid` validation is no longer supported until [this bug](https://github.com/mafintosh/is-my-json-valid/pull/192) is fixed. - -- REFACTORED the [schema validation plugins](https://rxdb.info/schema-validation.html), they are no longer plugins but now they get wrapped around any other RxStorage. - - It allows us to run the validation inside of a [Worker RxStorage](../rx-storage-worker.md) instead of running it in the main JavaScript process. - - It allows us to configure which `RxDatabase` instance must use the validation and which does not. In production it often makes sense to validate user data, but you might not need the validation for data that is only replicated from the backend. - -- REFACTORED the [key compression plugin](../key-compression.md), it is no longer a plugin but now a wrapper around any other RxStorage. - - It allows to run the key-compression inside of a [Worker RxStorage](../rx-storage-worker.md) instead of running it in the main JavaScript process. - -- REFACTORED the encryption plugin, it is no longer a plugin but now a wrapper around any other RxStorage. - - It allows to run the encryption inside of a [Worker RxStorage](../rx-storage-worker.md) instead of running it in the main JavaScript process. - - It allows do use asynchronous crypto function like [WebCrypto](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) -- Store the password hash in the same write request as the database token to improve performance. - -- REMOVED support for temporary documents [see here](https://github.com/pubkey/rxdb/pull/3777#issuecomment-1120669088) - -- REMOVED RxDatabase.broadcastChannel The broadcast channel has been moved out of the RxDatabase and is part of the RxStorage. So it is no longer exposed via `RxDatabase.broadcastChannel`. - -- Removed the `liveInterval` option of the replication plugins. It was an edge case feature with wrong defaults. If you want to run the pull replication on interval, you can send a `RESYNC` event manually in a loop. - -- REPLACED `RxReplicationPullError` and `RxReplicationPushError` with normal `RxError` like in the rest of the RxDB code. -- REMOVED the option to filter out replication documents with the push/pull modifiers [#2552](https://github.com/pubkey/rxdb/issues/2552) because this does not work with the new replication protocol. -- CHANGE default of replication `live` to be set to `true`. Because most people want to do a live replication, not a one time replication. - -- RENAMED the `server` plugin is now called `server-couchdb` and `RxDatabase.server()` is now `RxDatabase.serverCouchDB()` - -- CHANGED Attachment data is now always handled as `Blob` because Node.js does support `Blob` since version 18.0.0 so we no longer have to use a `Buffer` but instead can use Blob for browsers and Node.js - -- REFACTORED the layout of `RxChangeEvent` to better match the RxDB requirements and to fix the 'deleted-document-is-modified-but-still-deleted' bug. - -When used with Node.js, RxDB now requires Node.js version `18.0.0` or higher. - -## Other non breaking or internal changes - -- REMOVED many unused plugin hooks because they decreased the performance. -- REMOVE RxStorageStatics `.hash` and `.hashKey` -- CHANGE removed default usage of `md5` as default hashing. Use a faster non-cryptographic hash instead. - - ADD option to pass a custom hash function when calling `createRxDatabase`. -- CHANGE use `Float` instead of `Int` to represent timestamps in GraphQL. - -- FIXED multiple problems with encoding attachments data. We now use the `js-base64` library which properly handles utf-8/binary/ascii transformations. - -- In the RxDB internal `_meta.lwt` field, we now use 2 decimals number of the unix timestamp in milliseconds. -- ADDED `checkpointSchema` to the `RxStorage.statics` interface. - -## New Features - -- ADDED the [websocket replication plugin](../replication-websocket.md) -- ADDED the [FoundationDB RxStorage](../rx-storage-foundationdb.md) - -## Migration to the new version - -Stored data of the previous RxDB versions is not compatible with RxDB `13.0.0`. So if you want to keep that data, you have to migrate it in a way. For most use cases you might want to just drop the data from the client and re-sync it again from the backend. To keep the data locally, you might want to use the [storage migration plugin](../migration-storage.md). diff --git a/docs/releases/14.0.0.html b/docs/releases/14.0.0.html deleted file mode 100644 index 33d665ea362..00000000000 --- a/docs/releases/14.0.0.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - -RxDB 14.0 - Major Changes & New Features | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    14.0.0

    -

    The release 14.0.0 is used for major refactorings and API changes. -The replication or the storage layer have only been touched marginally.

    -

    Notice that only the major changes are listed here. All minor changes can be found in the changelog.

    -

    Removing deprecated features

    -

    The PouchDB RxStorage was deprecated in 13 and has now finally been removed, see here. -Also the old replication-couchdb plugin was removed. Instead we had the replication-couchdb-new plugin which was now renamed to replication-couchdb.

    -

    API changes

    -

    RxDocument objects are now immutable

    -

    At the previous version of RxDB, RxDocuments mutate themself when they receive ChangeEvents from the database. For example when you have a document where name = 'foo' and some update changes the state to name = 'bar' in the database, then the previous JavaScript object changed its own property to the have doc.name === 'bar'. -This feature was great when you use a RxDocument with some change-detection like in angular or vue templates. You can use document properties directly in the template and all updates will be reflected in the view, without having to use observables or subscriptions.

    -

    However this behavior is also confusing many times. When the state in the database is changed, it is not clear at which exact point of time the objects attribute changes. Also the self mutating behavior created some problem with vue- and react-devtools because of how they clone objects.

    -

    In RxDB v14, all RxDocuments are immutable. When you subscribe to a query and the same document is returned in the results, this will always be a new JavaScript object.

    -

    Also RxDocument.$ now emits RxDocument instances instead of the plain document data.

    -

    Refactor findByIds()

    -

    In the past, the functions findByIds and findByIds$ directly returned the result set. This was confusing, instead they now return a RxQuery object that works exactly like any other database query.

    -
    const results = await myRxCollection.findByIds(['foo', 'bar']).exec();
    -const results$ = await myRxCollection.findByIds(['foo', 'bar']).$;
    -

    Rename to RxDocument update/modify functions

    -

    Related issue #4180.

    -

    In the past the naming of the document mutation methods is confusing. -For example update() works completely different to atomicUpdate() and so on. -The naming of all functions was unified and all methods do now have an incremental and a non-incremental version (previously known as atomic):

    -
      -
    • RENAME atomicUpdate() to incrementalModify()
    • -
    • RENAME atomicPatch() to incrementalPatch()
    • -
    • RENAME atomicUpsert() to incrementalUpsert()
    • -
    • ADD RxDocument().incrementalUpdate()
    • -
    • ADD RxDocument.incrementalRemove()
    • -
    • ADD non-incremental RxDocument methods patch() and modify()
    • -
    -

    Replication is started with a pure function

    -

    In the past, to start a replication, the replication plugin was added to RxDB and a method on the RxCollection was called like myRxCollection.syncGraphQL(). -This caused many problems with tree shaking bailouts and having the correct typings. -So instead of having class method on the RxCollection, the replications are now started like:

    -
    import { replicateCouchDB } from 'rxdb/plugins/replication-couchdb';
    -const replicationState = replicateCouchDB({ /* ... */ });
    -

    Storage plugins are prefixed with storage-

    -

    For better naming, all storage plugins have been prefixed with storage- so the imports have been changed:

    -
    // Instead of 
    -import { getRxStorageDexie } from 'rxdb/plugins/dexie';
    -// it is now
    -import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie';
    -

    Encryption plugin was renamed to encryption-crypto-js

    -

    To make it possible to have alternative encryption plugins, the encryption plugin was renamed to encryption-crypto-js.

    -
    // Instead of 
    -import { wrappedKeyEncryptionStorage } from 'rxdb/plugins/encryption';
    -// it is now
    -import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js';
    -

    Rewrite the worker plugin

    -

    In the past, the worker plugin was based on the threads library. It was completely rewritten and uses the plain JavaScript API together with the remote storage plugin. BUT notice that the worker plugin has moved into the RxDB Premium 👑 package.

    -

    Performance improvements

    -

    Do not use hash for revisions

    -

    In the past, the _rev field of a RxDocument data was filled with a hash of the documents data. This was not the best solution because:

    -
      -
    • Hashing in JavaScript is slow, not running hashes on insert improves performance by about 33%
    • -
    • When 2 clients do the exact same write to the document, it is not clear from comparing the document states because they will have the exact same hash which makes some conflict resolution strategies impossible to implement.
    • -
    -

    Instead we now use just use the RxDatabase.token together with the revision height.

    -

    Batch up incremental operations

    -

    When making multiple writes to different (or the same) document, in the past RxDB made one write call to the storage. When doing fast writes, like when you writhe the current mouse position to a document, the writes could have queued up to the point where the users recognizes performance lag. -In RxDB v14, pending document updates are batched up into single storage writes for better performance.

    -

    Improved tree shaking

    -

    Many changes have been made to improve tree shakability of RxDB which results in smaller bundle sizes and a faster application startup.

    -

    Refactor the document cache

    -

    The whole RxDocument cache was refactored. It now runs based on the WeakRef API and automatically cleans up cached documents that are no longer referenced. This reduces the use memory and makes RxDB more suitable for being used in Node.js on the server side.

    -

    Notice that the WeakRef API is only featured in modern browsers so RxDB will no longer run on ie11.

    -

    No longer transpile some modern JavaScript features

    -

    To reduce the bundle size and improve performance, the following JavaScript features will no longer be transpiled because they are natively supported in modern browsers anyway:

    - -

    All these optimizations together reduced the test-bundle size from 74148 bytes down to 36007 bytes.

    -

    Other changes

    - -

    Bugfixes

    -
      -
    • CHANGE (memory RxStorage) do not clean up database state on closing of the storage, only on remove().
    • -
    • FIX CouchDB replication: Use correct default fetch method.
    • -
    • FIX schema hashing should respect the sort order #4005
    • -
    • FIX replication does not provide a ._rev to the storage write when a conflict is resolved.
    • -
    • FIX(remote storage) ensure caching works properly even on parallel create-calls
    • -
    • FIX(replication) Composite Primary Keys broken on replicated collections #4190
    • -
    • FIX(sqlite) $in Query not working SQLite #4278
    • -
    • FIX CouchDB push is throwing error because of missing revision #4299
    • -
    • ADD dev-mode shows a console.warn() to ensure people do not use it in production.
    • -
    • Remove the usage of Buffer. We now use Blob everywhere.
    • -
    • FIX import of socket.io #4307
    • -
    • FIX Id length limit reached with composite key #4315
    • -
    • FIX $regex query not working on remote storage.
    • -
    • FIX SQLite must store attachments data as Blob instead of base64 string to reduce the database size.
    • -
    • FIX CouchDB replication conflict handling
    • -
    • CHANGE Encryption plugin was renamed to encryption-crypto-js
    • -
    • FIX replication state meta data must also be encrypted.
    • -
    -

    Migration from 13.x.x to 14.0.0

    -

    The way RxDB hashes and normalizes a schema has changed. To migrate stored data between the RxDB versions, therefore you have to increase your schema version by 1 and add a migration strategy.

    -

    For some storages, the stored data of the previous RxDB versions is not compatible with RxDB 14.0.0. So if you want to keep that data, you have to migrate it in a way. For most use cases you might want to just drop the data from the client and re-sync it again from the backend. To keep the data locally, you might want to use the storage migration plugin.

    -

    You can help!

    -

    There are many things that can be done by you to improve RxDB:

    -
      -
    • Check the BACKLOG for features that would be great to have.
    • -
    • Check the breaking backlog for breaking changes that must be implemented in the future but where I did not have the time yet.
    • -
    • Check the todos in the code. There are many small improvements that can be done for performance and build size.
    • -
    • Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors.
    • -
    • Update the example projects many of them are outdated and need updates.
    • -
    - - \ No newline at end of file diff --git a/docs/releases/14.0.0.md b/docs/releases/14.0.0.md deleted file mode 100644 index dd8a0df1ba6..00000000000 --- a/docs/releases/14.0.0.md +++ /dev/null @@ -1,171 +0,0 @@ -# RxDB 14.0 - Major Changes & New Features - -> Discover RxDB 14.0, a major release packed with API changes, improved performance, and streamlined storage, ensuring faster data operations than ever. - -# 14.0.0 - -The release [14.0.0](https://rxdb.info/releases/14.0.0.html) is used for major refactorings and API changes. -The replication or the storage layer have only been touched marginally. - -Notice that only the major changes are listed here. All minor changes can be found in the [changelog](https://github.com/pubkey/rxdb/blob/master/CHANGELOG.md). - -## Removing deprecated features - -The PouchDB RxStorage was deprecated in 13 and has now finally been removed, see [here](../rx-storage-pouchdb.md). -Also the old `replication-couchdb` plugin was removed. Instead we had the `replication-couchdb-new` plugin which was now renamed to `replication-couchdb`. - -## API changes - -### RxDocument objects are now immutable - -At the previous version of RxDB, RxDocuments mutate themself when they receive ChangeEvents from the database. For example when you have a document where `name = 'foo'` and some update changes the state to `name = 'bar'` in the database, then the previous JavaScript object changed its own property to the have `doc.name === 'bar'`. -This feature was great when you use a RxDocument with some change-detection like in angular or vue templates. You can use document properties directly in the template and all updates will be reflected in the view, without having to use observables or subscriptions. - -However this behavior is also confusing many times. When the state in the database is changed, it is not clear at which exact point of time the objects attribute changes. Also the self mutating behavior created some problem with vue- and react-devtools because of how they clone objects. - -In RxDB v14, all RxDocuments are immutable. When you subscribe to a query and the same document is returned in the results, this will always be a new JavaScript object. - -Also `RxDocument.$` now emits `RxDocument` instances instead of the plain document data. - -### Refactor `findByIds()` - -In the past, the functions `findByIds` and `findByIds$` directly returned the result set. This was confusing, instead they now return a `RxQuery` object that works exactly like any other database query. - -```ts -const results = await myRxCollection.findByIds(['foo', 'bar']).exec(); -const results$ = await myRxCollection.findByIds(['foo', 'bar']).$; -``` - -### Rename to RxDocument update/modify functions - -Related issue [#4180](https://github.com/pubkey/rxdb/issues/4180). - -In the past the naming of the document mutation methods is confusing. -For example `update()` works completely different to `atomicUpdate()` and so on. -The naming of all functions was unified and all methods do now have an incremental and a non-incremental version (previously known as `atomic`): -- RENAME `atomicUpdate()` to `incrementalModify()` -- RENAME `atomicPatch()` to `incrementalPatch()` -- RENAME `atomicUpsert()` to `incrementalUpsert()` -- ADD `RxDocument().incrementalUpdate()` -- ADD `RxDocument.incrementalRemove()` -- ADD non-incremental `RxDocument` methods `patch()` and `modify()` - -### Replication is started with a pure function - -In the past, to start a replication, the replication plugin was added to RxDB and a method on the RxCollection was called like `myRxCollection.syncGraphQL()`. -This caused many problems with tree shaking bailouts and having the correct typings. -So instead of having class method on the RxCollection, the replications are now started like: - -```ts -import { replicateCouchDB } from 'rxdb/plugins/replication-couchdb'; -const replicationState = replicateCouchDB({ /* ... */ }); -``` - -### Storage plugins are prefixed with `storage-` - -For better naming, all storage plugins have been prefixed with `storage-` so the imports have been changed: - -```ts -// Instead of -import { getRxStorageDexie } from 'rxdb/plugins/dexie'; -// it is now -import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; -``` - -### Encryption plugin was renamed to `encryption-crypto-js` - -To make it possible to have alternative encryption plugins, the `encryption` plugin was renamed to `encryption-crypto-js`. - -```ts -// Instead of -import { wrappedKeyEncryptionStorage } from 'rxdb/plugins/encryption'; -// it is now -import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; -``` - -### Rewrite the `worker` plugin - -In the past, the [worker plugin](../rx-storage-worker.html) was based on the [threads](https://www.npmjs.com/package/threads) library. It was completely rewritten and uses the plain JavaScript API together with the [remote storage plugin](../rx-storage-remote.md). **BUT** notice that the worker plugin has moved into the [RxDB Premium 👑](/premium/) package. - -## Performance improvements - -### Do not use hash for revisions - -In the past, the `_rev` field of a RxDocument data was filled with a hash of the documents data. This was not the best solution because: -- Hashing in JavaScript is slow, not running hashes on insert improves performance by about 33% -- When 2 clients do the exact same write to the document, it is not clear from comparing the document states because they will have the exact same hash which makes some conflict resolution strategies impossible to implement. - -Instead we now use just use the RxDatabase.token together with the revision height. - -### Batch up incremental operations - -When making multiple writes to different (or the same) document, in the past RxDB made one write call to the storage. When doing fast writes, like when you writhe the current mouse position to a document, the writes could have queued up to the point where the users recognizes performance lag. -In RxDB v14, pending document updates are batched up into single storage writes for better performance. - -### Improved tree shaking - -Many changes have been made to improve [tree shakability](https://webpack.js.org/guides/tree-shaking/) of RxDB which results in smaller bundle sizes and a faster application startup. - -### Refactor the document cache - -The whole RxDocument cache was refactored. It now runs based on the [WeakRef API](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakRef) and automatically cleans up cached documents that are no longer referenced. This reduces the use memory and makes RxDB more suitable for being used in Node.js on the server side. - -Notice that the WeakRef API is only featured in [modern browsers](https://caniuse.com/?search=weakref) so RxDB will no longer run on ie11. - -### No longer transpile some modern JavaScript features - -To reduce the bundle size and improve performance, the following JavaScript features will no longer be transpiled because they are natively supported in modern browsers anyway: - - [async/await](https://caniuse.com/async-functions) - - [Arrow functions](https://caniuse.com/arrow-functions) - - [for...of](https://caniuse.com/?search=for...of) - - [shorthand properties](https://caniuse.com/mdn-javascript_operators_object_initializer_shorthand_property_names) - - [Spread operator](https://caniuse.com/?search=spread%20operator) - - [destructuring](https://caniuse.com/?search=destructuring) - - [default parameters](https://caniuse.com/?search=default%20parameters) - - [object spread](https://caniuse.com/?search=Object%20spread) - -All these optimizations together reduced the [test-bundle](https://github.com/pubkey/rxdb/blob/master/config/bundle-size.js) size from `74148` bytes down to `36007` bytes. - -## Other changes -- ADD `push/pull.initialCheckpoint` to start a replication from a given checkpoint. -- The following plugins are out of beta mode: - - [RxStorage Sharding](../rx-storage-sharding.md) - - [RxStorage Remote](../rx-storage-remote.md) - - [RxStorage FoundationDB](../rx-storage-foundationdb.md) - - [New Replication CouchDB](../replication-couchdb.md) - - [Cleanup Plugin](../cleanup.md) - -## Bugfixes -- CHANGE (memory RxStorage) do not clean up database state on closing of the storage, only on `remove()`. -- FIX CouchDB replication: Use correct default fetch method. -- FIX schema hashing should respect the sort order [#4005](https://github.com/pubkey/rxdb/pull/4005) -- FIX replication does not provide a `._rev` to the storage write when a conflict is resolved. -- FIX(remote storage) ensure caching works properly even on parallel create-calls -- FIX(replication) Composite Primary Keys broken on replicated collections [#4190](https://github.com/pubkey/rxdb/pull/4190) -- FIX(sqlite) $in Query not working SQLite [#4278](https://github.com/pubkey/rxdb/issues/4278) -- FIX CouchDB push is throwing error because of missing revision [#4299](https://github.com/pubkey/rxdb/pull/4299) -- ADD dev-mode shows a `console.warn()` to ensure people do not use it in production. -- Remove the usage of `Buffer`. We now use `Blob` everywhere. -- FIX import of socket.io [#4307](https://github.com/pubkey/rxdb/pull/4307) -- FIX Id length limit reached with composite key [#4315](https://github.com/pubkey/rxdb/issues/4315) -- FIX `$regex` query not working on remote storage. -- FIX SQLite must store attachments data as Blob instead of base64 string to reduce the database size. -- FIX CouchDB replication conflict handling -- CHANGE Encryption plugin was renamed to `encryption-crypto-js` -- FIX replication state meta data must also be encrypted. - -## Migration from 13.x.x to 14.0.0 - -The way RxDB hashes and normalizes a schema has changed. To migrate stored data between the RxDB versions, therefore you have to increase your schema version by `1` and add a migration strategy. - -For some storages, the stored data of the previous RxDB versions is not compatible with RxDB `14.0.0`. So if you want to keep that data, you have to migrate it in a way. For most use cases you might want to just drop the data from the client and re-sync it again from the backend. To keep the data locally, you might want to use the [storage migration plugin](../migration-storage.md). - -## You can help! - -There are many things that can be done by **you** to improve RxDB: - -- Check the [BACKLOG](https://github.com/pubkey/rxdb/blob/master/orga/BACKLOG.md) for features that would be great to have. -- Check the [breaking backlog](https://github.com/pubkey/rxdb/blob/master/orga/before-next-major.md) for breaking changes that must be implemented in the future but where I did not have the time yet. -- Check the [todos](https://github.com/pubkey/rxdb/search?q=todo) in the code. There are many small improvements that can be done for performance and build size. -- Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors. -- Update the [example projects](https://github.com/pubkey/rxdb/tree/master/examples) many of them are outdated and need updates. diff --git a/docs/releases/15.0.0.html b/docs/releases/15.0.0.html deleted file mode 100644 index 88ce7823ae2..00000000000 --- a/docs/releases/15.0.0.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - -RxDB 15.0.0 - Major Migration Overhaul | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    15.0.0

    -

    The release 15.0.0 is used for major refactorings in the migration plugins and performance improvements of the RxStorage implementations.

    -

    LinkedIn

    -

    Stay connected with the latest updates and network with professionals in the RxDB community by following RxDB's official LinkedIn page!

    -

    Performance

    -

    Performance has improved a lot. Much work has been done to reduce the CPU footprint of RxDB so that when writes and reads are performed on the database, the JavaScript process can start updating the UI much faster. -Also there have been a lot of improvements to the IndexedDB RxStorage which now runs in a Write-Ahead Logging (WAL) mode which makes write operations about 4x as fast. -The whole RxStorage interface has been optimized so that it has to run less operations which improves overall performance. Read more

    -

    RxStorage performance - browser

    -

    Replication

    -

    Replication options (like url), are no longer used as replication state identifier. Changing the url without having to restart the replication, is now possible. This is useful if you change your replication url (like path/v3/) on schema changes and you do not want to restart the replication from scratch. You can even swap the replication plugin while still keeping the replication state. The couchdb replication now also requires an replicationIdentifier.

    -

    The replication meta data is now also compressed when the KeyCompression Plugin is used.

    -

    The replication-protocol does now support attachment replication. This clears the path to add the attachment replication to the other RxDB replication plugins.

    -

    Rewrite schema version migration

    -

    The schema migration plugin has been fully rewritten from scratch.

    -

    From now on it internally uses the replication protocol to do a one-time replication from the old collection to the new one. This makes the code more simple and ensures that canceled migrations (when the user closes the browser), can continue from the correct position.

    -

    Replication states from the RxReplication are also migrated together with the normal data. -Previously a migration dropped the replication state which required a new replication of all data from scratch, even if the -client already had the same data as the server. Now the assumedMasterState and checkpoint are also migrated so that -the replication will continue from where it was before the migration has run.

    -

    Also it now handles multi-instance runtimes correctly. If multiple browser tabs are open, only one of them (per RxCollection) will run the migration. -Migration state events are propagated across browser tabs.

    -

    Documents with _deleted: true will also be migrated. This ensures that non-pushed deletes are not dropped during migrations and will -still be replicated if the client goes online again.

    -

    Set eventReduce:true as default

    -

    The EventReduce algorithm is now enabled by default.

    -

    Use crypto.subtle.digest for hashing

    -

    Using crypto.subtle.digest from the native WebCrypto API is much faster, so RxDB now uses that as a default. If the API is not available, like in React-Native, the ohash module is used instead. Also any custom hashFunction can be provided when creating the RxDatabase. The hashFunction must now be async and return a Promise.

    -

    Fix attachment hashing

    -

    Hashing of attachment data to calculate the digest is now done from the RxDB side, not the RxStorage. If you set a custom hashFunction for the database, it will also be used for attachments digest meta data.

    -

    Requires at least typescript version 5.0.0

    -

    We now use export type * from './types'; so RxDB will not work on typescript versions older than 5.0.0.

    -

    Require string based $regex

    -

    Queries with a $regex operator must now be defined as strings, not with RegExp objects. You can still pass RegExp's flags in $options parameter. RegExp are mutable objects, which was dangerous and caused hard-to-debug problems. -Also stringification of the $regex had bad performance but is required to send queries from RxDB to the RxStorage.

    -

    Refactor dexie.js RxStorage

    -

    The dexie.js storage was refactored to add some missing features:

    -
      -
    • Attachment support
    • -
    • Support for boolean indexes
    • -
    -

    RxLocalDocument.$ emits a document instance, not the plain data

    -

    This was changed in v14 for a normal RxDocument.$ which emits RxDocument instances. Same is now also done for local documents.

    -

    Fix return type of .bulkUpsert

    -

    Equal to other bulk operations, bulkUpsert will now return an error and a success array. This allows to filter for validation errors and handle them properly.

    -

    Add dev-mode check for disallowed $ref fields

    -

    RxDB cannot resolve $ref fields in the schema because it would have a negative performance impact. -We now have a dev-mode check to throw a helpful error message if $refs are used in the schema.

    -

    Improve RxDocument property access performance

    -

    We now use the Proxy API instead of defining getters on each nested property. Also fixed #4949

    -

    patternProperties is now allowed on the non-top-level of a schema #4951

    -

    Add deno support

    -

    The RxDB test suite now also runs in the deno runtime. Also there is a DenoKV based RxStorage to use with Deno Deploy.

    -

    Memory RxStorage

    -

    Rewrites of the Memory RxStorage for better performance.

    -
      -
    • Writes are 3x faster
    • -
    • Find-by id is 2x faster
    • -
    -

    Memory-Synced storage no longer supports replication+migration

    -

    The memory-synced storage itself does not support replication and migration. This was allowed in the past, but dangerous so now there is an error that throws. -Instead you should replicate the underlying parent storage. Notice that this is only for the memory-synced storage, NOT for the normal memory storage. There the replication works like before.

    -

    Added Logger Plugin

    -

    I added a logger plugin to detect performance problems and errors.

    -

    Documentation is now served by docusaurus

    -

    In the past we used gitbook which is no longer maintained and had some major issues. Now the documentation of RxDB is rendered and served with docusaurus which has a better design and maintenance.

    -

    Replaced modfijs with mingo package

    -

    In the past, the modifyjs was used for the update plugin. This was replaced with the mingo library which is more up to date and already used in RxDB for the query engine.

    -

    Changes to the RxStorage interface

    -

    We no longer have RxStorage.statics.prepareQuery(). Instead all storages get the same prepared query as input for the .query() method. If a storage requires some transformations, it has to do them by itself before running the query. This change simplifies the whole RxDB code base a lot and the previous assumption of having a better performance by pre-running the query preparation, turned out to be not true because the query planning is quite fast.

    -

    Removed the RxStorage.statics property. This makes configuration easier especially for the remote storage plugins.

    -

    The RxStorage itself will now return _deleted=true documents on the .query() method. This is required for upcoming plugins like the server plugin where it must be able to run queries on deleted documents. -Notice that this is only for the RxStorage itself, RxDB queries will run like normal and NOT contain deleted documents in their results.

    -

    Changed the response type of RxStorageInstance.bulkWrite() from indexed (by id) objects to arrays for better performance.

    -

    Other changes

    -
      -
    • Added RxCollection.cleanup() to manually call the cleanup functions.
    • -
    • Rename send$ to sent$: myRxReplicationState.send$.subscribe works only if the sending is successful. Therefore, it is renamed to sent$, not send$.
    • -
    • We no longer ship dist/rxdb.browserify.js and dist/rxdb.browserify.min.js. If you need these, build them by yourself.
    • -
    • The example project for vanilla javascript was outdated. I removed it to no longer confuse new users.
    • -
    • REPLACE new Date().getTime() with Date.now() which is 2x faster.
    • -
    • Renamed replication-p2p to replication-webrtc. I will add more p2p replication plugins in the future, which are not based on WebRTC.
    • -
    • REMOVED RxChangeEvent.eventId. If you really need a unique ID, you can craft your own one based on the document _rev and primary.
    • -
    • REMOVED RxChangeEvent.startTime and RxChangeEvent.endTime so we do not have to call Date.now() once per write row.
    • -
    • ADDED EventBulk.startTime and EventBulk.endTime.
    • -
    • FIX database.remove() does not work on databases with encrypted fields.
    • -
    • FIX react-native: replaceAll is not a function
    • -
    • FIX Throttle calls to forkInstance on push-replication to not cause memory spikes and lagging UI
    • -
    • FIX PushModifier applied to pre-change legacy document, resulting in old document sent to endpoint #5256
    • -
    • Attachment compression is now using the native Compression Streams API.
    • -
    • FIX #5311 URL.createObjectURL is not a function in a browser plugin environment(background.js)
    • -
    • FIX structuredClone not available in ReactNative #5046
    • -
    • The following things moved out of beta: - -
    • -
    -

    Changes to the 👑 Premium Plugins

    -

    storage-migration plugin moved from premium to open-core

    -

    The storage migration plugin can be used to migrate data between different RxStorage implementation or to migrate data between major RxDB versions. This previously was a 👑 premium plugin, but now it is part of the open-core. Also the params syntax changed a bit read more.

    -

    Changes in pricing

    -

    The pricing of the premium plugins was changed. This makes it cheaper for smaller companies and single individuals.

    -

    Added perpetual license option

    -

    By default you are not allowed to use the premium plugins after the -license has expired and you will no longer be able to install them. But -you can choose the Perpetual license option. With the perpetual -license option, you can still use the plugins even after the license is -expired. But you will no longer get any updates from newer RxDB -versions.

    -

    You can help!

    -

    There are many things that can be done by you to improve RxDB:

    -
      -
    • Check the BACKLOG for features that would be great to have.
    • -
    • Check the breaking backlog for breaking changes that must be implemented in the future but where I did not have the time yet.
    • -
    • Check the todos in the code. There are many small improvements that can be done for performance and build size.
    • -
    • Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors.
    • -
    • Update the example projects some of them are outdated and need updates.
    • -
    - - \ No newline at end of file diff --git a/docs/releases/15.0.0.md b/docs/releases/15.0.0.md deleted file mode 100644 index da74505062a..00000000000 --- a/docs/releases/15.0.0.md +++ /dev/null @@ -1,183 +0,0 @@ -# RxDB 15.0.0 - Major Migration Overhaul - -> Discover RxDB 15.0.0, featuring new migration strategies, replication improvements, and lightning-fast performance to supercharge your app. - -# 15.0.0 - -The release [15.0.0](https://rxdb.info/releases/15.0.0.html) is used for major refactorings in the migration plugins and performance improvements of the RxStorage implementations. - -## LinkedIn - -Stay connected with the latest updates and network with professionals in the RxDB community by following RxDB's [official LinkedIn page](https://www.linkedin.com/company/rxdb)! - -## Performance - -Performance has improved a lot. Much work has been done to reduce the CPU footprint of RxDB so that when writes and reads are performed on the database, the JavaScript process can start updating the UI much faster. -Also there have been a lot of improvements to the [IndexedDB RxStorage](../rx-storage-indexeddb.md) which now runs in a **Write-Ahead Logging (WAL)** mode which makes write operations about 4x as fast. -The whole RxStorage interface has been optimized so that it has to run less operations which improves overall performance. [Read more](../rx-storage-performance.md) - - - - - -## Replication - -Replication options (like url), are no longer used as replication state identifier. Changing the url without having to restart the replication, is now possible. This is useful if you change your replication url (like `path/v3/`) on schema changes and you do not want to restart the replication from scratch. You can even swap the replication plugin while still keeping the replication state. The [couchdb replication](../replication-couchdb.md) now also requires an `replicationIdentifier`. - -The replication meta data is now also compressed when the [KeyCompression Plugin](../key-compression.md) is used. - -The replication-protocol does now support attachment replication. This clears the path to add the attachment replication to the other RxDB replication plugins. - -## Rewrite schema version migration - -The [schema migration plugin](../migration-schema.md) has been fully rewritten from scratch. - -From now on it internally uses the replication protocol to do a one-time replication from the old collection to the new one. This makes the code more simple and ensures that canceled migrations (when the user closes the browser), can continue from the correct position. - -Replication states from the [RxReplication](../replication.md) are also migrated together with the normal data. -Previously a migration dropped the replication state which required a new replication of all data from scratch, even if the -client already had the same data as the server. Now the `assumedMasterState` and `checkpoint` are also migrated so that -the replication will continue from where it was before the migration has run. - -Also it now handles multi-instance runtimes correctly. If multiple browser tabs are open, only one of them (per RxCollection) will run the migration. -Migration state events are propagated across browser tabs. - -Documents with `_deleted: true` will also be migrated. This ensures that non-pushed deletes are not dropped during migrations and will -still be replicated if the client goes online again. - -## Set `eventReduce:true` as default - -The [EventReduce algorithm](https://github.com/pubkey/event-reduce) is now enabled by default. - -## Use `crypto.subtle.digest` for hashing - -Using `crypto.subtle.digest` from the native WebCrypto API is much faster, so RxDB now uses that as a default. If the API is not available, like in React-Native, the [ohash](https://github.com/unjs/ohash) module is used instead. Also any custom `hashFunction` can be provided when creating the [RxDatabase](../rx-database.md). The `hashFunction` must now be async and return a Promise. - -## Fix attachment hashing - -Hashing of attachment data to calculate the `digest` is now done from the RxDB side, not the RxStorage. If you set a custom `hashFunction` for the database, it will also be used for attachments `digest` meta data. - -## Requires at least typescript version 5.0.0 - -We now use `export type * from './types';` so RxDB will not work on typescript versions older than 5.0.0. - -## Require string based `$regex` - -Queries with a `$regex` operator must now be defined as strings, not with `RegExp` objects. You can still pass RegExp's flags in `$options` parameter. `RegExp` are mutable objects, which was dangerous and caused hard-to-debug problems. -Also stringification of the $regex had bad performance but is required to send queries from RxDB to the RxStorage. - -## Refactor dexie.js RxStorage - -The [dexie.js storage](../rx-storage-dexie.md) was refactored to add some missing features: -- [Attachment](../rx-attachment.md) support -- Support for boolean indexes - -## RxLocalDocument.$ emits a document instance, not the plain data - -This was changed in [v14](./14.0.0.md) for a normal RxDocument.$ which emits RxDocument instances. Same is now also done for [local documents](../rx-local-document.md). - -## Fix return type of .bulkUpsert - -Equal to other bulk operations, `bulkUpsert` will now return an `error` and a `success` array. This allows to filter for validation errors and handle them properly. - -## Add dev-mode check for disallowed $ref fields - -RxDB cannot resolve `$ref` fields in the schema because it would have a negative performance impact. -We now have a dev-mode check to throw a helpful error message if $refs are used in the schema. - -## Improve RxDocument property access performance - -We now use the Proxy API instead of defining getters on each nested property. Also fixed [#4949](https://github.com/pubkey/rxdb/pull/4949) - -`patternProperties` is now allowed on the non-top-level of a schema [#4951](https://github.com/pubkey/rxdb/pull/4951) - -## Add deno support - -The RxDB test suite now also runs in the [deno](https://deno.com/) runtime. Also there is a [DenoKV](https://rxdb.info/rx-storage-denokv.html) based RxStorage to use with Deno Deploy. - -## Memory RxStorage - -Rewrites of the [Memory RxStorage](../rx-storage-memory.md) for better performance. -- Writes are 3x faster -- Find-by id is 2x faster - -## Memory-Synced storage no longer supports replication+migration - -The [memory-synced storage](../rx-storage-memory-synced.md) itself does not support replication and migration. This was allowed in the past, but dangerous so now there is an error that throws. -Instead you should replicate the underlying parent storage. Notice that this is only for the [memory-synced storage](../rx-storage-memory-synced.md), NOT for the normal [memory storage](../rx-storage-memory.md). There the replication works like before. - -## Added Logger Plugin - -I added a [logger plugin](../logger.md) to detect performance problems and errors. - -## Documentation is now served by docusaurus - -In the past we used gitbook which is no longer maintained and had some major issues. Now the documentation of RxDB is rendered and served with [docusaurus](https://docusaurus.io/) which has a better design and maintenance. - -## Replaced `modfijs` with `mingo` package - -In the past, the [modifyjs](https://github.com/lgandecki/modifyjs) was used for the `update` plugin. This was replaced with the [mingo library](https://github.com/kofrasa/mingo) which is more up to date and already used in RxDB for the query engine. - -## Changes to the RxStorage interface - -We no longer have `RxStorage.statics.prepareQuery()`. Instead all storages get the same prepared query as input for the `.query()` method. If a storage requires some transformations, it has to do them by itself before running the query. This change simplifies the whole RxDB code base a lot and the previous assumption of having a better performance by pre-running the query preparation, turned out to be not true because the query planning is quite fast. - -Removed the `RxStorage.statics` property. This makes configuration easier especially for the remote storage plugins. - -The RxStorage itself will now return `_deleted=true` documents on the `.query()` method. This is required for upcoming plugins like the server plugin where it must be able to run queries on deleted documents. -Notice that this is only for the RxStorage itself, RxDB queries will run like normal and NOT contain deleted documents in their results. - -Changed the response type of RxStorageInstance.bulkWrite() from indexed (by id) objects to arrays for better performance. - -## Other changes - -- Added `RxCollection.cleanup()` to manually call the [cleanup functions](../cleanup.md). -- Rename send$ to sent$: `myRxReplicationState.send$.subscribe` works only if the sending is successful. Therefore, it is renamed to `sent$`, not `send$`. -- We no longer ship `dist/rxdb.browserify.js` and `dist/rxdb.browserify.min.js`. If you need these, build them by yourself. -- The example project for vanilla javascript was outdated. I removed it to no longer confuse new users. -- REPLACE `new Date().getTime()` with `Date.now()` which is [2x faster](https://stackoverflow.com/questions/12517359/performance-date-now-vs-date-gettime). -- Renamed replication-p2p to replication-webrtc. I will add more p2p replication plugins in the future, which are not based on [WebRTC](../replication-webrtc.md). -- REMOVED `RxChangeEvent.eventId`. If you really need a unique ID, you can craft your own one based on the document `_rev` and `primary`. -- REMOVED `RxChangeEvent.startTime` and `RxChangeEvent.endTime` so we do not have to call `Date.now()` once per write row. -- ADDED `EventBulk.startTime` and `EventBulk.endTime`. -- FIX `database.remove()` does not work on databases with encrypted fields. -- FIX [react-native: replaceAll is not a function](https://github.com/pubkey/rxdb/pull/5187) -- FIX Throttle calls to forkInstance on push-replication to not cause memory spikes and lagging UI -- FIX PushModifier applied to pre-change legacy document, resulting in old document sent to endpoint [#5256](https://github.com/pubkey/rxdb/issues/5256) -- [Attachment compression](../rx-attachment.md#attachment-compression) is now using the native `Compression Streams API`. -- FIX [#5311](https://github.com/pubkey/rxdb/issues/5311) URL.createObjectURL is not a function in a browser plugin environment(background.js) -- FIX `structuredClone` not available in ReactNative [#5046](https://github.com/pubkey/rxdb/issues/5046#issuecomment-1827374498) -- The following things moved out of beta: - - [Firestore replication](../replication-firestore.md) - - [WebRTC replication](../replication-webrtc.md) - - [NATS replication](../replication-nats.md) - - [OPFS RxStorage](../rx-storage-opfs.md) - -## Changes to the 👑 Premium Plugins - -### storage-migration plugin moved from premium to open-core - -The storage migration plugin can be used to migrate data between different RxStorage implementation or to migrate data between major RxDB versions. This previously was a 👑 premium plugin, but now it is part of the open-core. Also the params syntax changed a bit [read more](../migration-storage.md). - -### Changes in pricing - -The pricing of the premium plugins was changed. This makes it cheaper for smaller companies and single individuals. - -### Added perpetual license option - -By default you are not allowed to use the premium plugins after the -license has expired and you will no longer be able to install them. But -you can choose the **Perpetual license** option. With the perpetual -license option, you can still use the plugins even after the license is -expired. But you will no longer get any updates from newer RxDB -versions. - -## You can help! - -There are many things that can be done by **you** to improve RxDB: - -- Check the [BACKLOG](https://github.com/pubkey/rxdb/blob/master/orga/BACKLOG.md) for features that would be great to have. -- Check the [breaking backlog](https://github.com/pubkey/rxdb/blob/master/orga/before-next-major.md) for breaking changes that must be implemented in the future but where I did not have the time yet. -- Check the [todos](https://github.com/pubkey/rxdb/search?q=todo) in the code. There are many small improvements that can be done for performance and build size. -- Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors. -- Update the [example projects](https://github.com/pubkey/rxdb/tree/master/examples) some of them are outdated and need updates. diff --git a/docs/releases/16.0.0.html b/docs/releases/16.0.0.html deleted file mode 100644 index ea16b6d32cc..00000000000 --- a/docs/releases/16.0.0.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - -RxDB 16.0.0 - Efficiency Redefined | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    16.0.0

    -

    The release 16.0.0 is used for major refactorings. We did not change that much, mostly renaming things and fixing confusing implementation details.

    -

    Data stored in the previous version 15 is compatible with the code of the new version 16 for most RxStorage implementation. So migration will be easy. -Only the following RxStorage implementations are required to migrate the data itself with the storage migration plugin:

    -
      -
    • SQLite RxStorage
    • -
    • NodeFilesystem RxStorage
    • -
    • OPFS RxStorage
    • -
    -

    Breaking Changes

    -
      -
    • CHANGE RxServer is no longer in beta mode.
    • -
    • CHANGE Fulltext Search is no longer in beta mode.
    • -
    • CHANGE Custom Reactivity is no longer in beta mode.
    • -
    • CHANGE initialCheckpoint in replications is no longer in beta mode.
    • -
    • CHANGE RxState is no longer in beta mode.
    • -
    • CHANGE MemoryMapped RxStorage is no longer in beta mode.
    • -
    • CHANGE rename randomCouchString() to randomToken()
    • -
    • FIX (GraphQL replication) datapath must be equivalent for pull and push #6019
    • -
    • REMOVE fallback to the ohash package when crypto.subtle does not exist. All modern runtimes (also react-native) now support crypto.subtle, so we do not need that fallback anymore.
    • -
    -

    Removed deprecated LokiJS RxStorage

    -

    The LokiJS RxStorage was deprecated because LokiJS itself is no longer maintained. Therefore it will be removed completely. If you still need that, you can fork the code of it and publish it in an own package and link to it from the third party plugins page.

    -

    Renamed .destroy() to .close()

    -

    Destroy was adapted from PouchDB, but people often think this deletes the written data. close is a better name for that functionality.

    -
      -
    • Also renamed similar functions/attributes: -
        -
      • .destroy() to .close()
      • -
      • .onDestroy() to .onClose()
      • -
      • postDestroyRxCollection to postCloseRxCollection
      • -
      • preDestroyRxDatabase to preCloseRxDatabase
      • -
      -
    • -
    -

    ignoreDuplicate: true on createRxDatabase() must only be allowed in dev-mode.

    -

    The ignoreDuplicate flag is only useful for tests and should never be used in production. We now throw an error if it is set to true in non-dev-mode.

    -

    When dev-mode is enabled, a schema validator must be used.

    -

    Many reported issues come from people storing data that is not valid to their schema. -To fix this, in dev-mode it is now required that at least one schema validator is used.

    -

    Removed the memory-synced storage

    -

    The memory-synced RxStorage was removed in RxDB version 16. Please use the memory-mapped storage instead which has better trade-offs and is easier to configure.

    -

    Split conflict handler functionality into isEqual() and resolve().

    -

    Because the handler is used in so many places it becomes confusing to write a proper conflict handler. -Also having a handler that requires user interaction is only possible by hackingly using the context param. -By splitting the functionalities it is easier to learn where the handlers are used and how to define them properly.

    -

    Full rewrite of the OPFS and Filesystem-Node RxStorages

    -

    The OPFS and Filesystem-Node RxStorage had problems with storing emojis and other special characters inside of indexed fields. -I completely rewrote them and improved performance especially on initial load when a lot of data is stored already and when doing many small writes/reads at the same time on in series.

    -

    Internal Changes

    -
      -
    • CHANGE (internal) migration-storage plugin: Remove catch from cleanup
    • -
    • CHANGE (internal) rename RX_PIPELINE_CHECKPOINT_CONTEXT to rx-pipeline-checkpoint
    • -
    • CHANGE (internal) remove conflictResultionTasks() and resolveConflictResultionTask() from the RxStorage interface.
    • -
    • REMOVED (internal) do not check for duplicate event bulks, all RxStorage implementations must guarantee to not emit the same events twice.
    • -
    • REFACTOR (internal) Only use event-bulks internally and only transform to single emitted events if actually someone has subscribed to the eventstream.
    • -
    -

    Bugfixes

    -
      -
    • Having a lot of documents pulled in the replication could in some cases slow down the database initialization because upstreamInitialSync() did not set a checkpoint and each time checked all documents if they are equal to the master.
    • -
    • If the handler of a RxPipeline throws an error, block the whole pipeline and emit the error to the outside.
    • -
    • Throw error when dexie.js RxStorage is used with optional index fields #6643.
    • -
    • Fix IndexedDB bug: Some people had problems with the IndexedDB RxStorage that opened up collections very slowly. If you had this problem, please try out this new version.
    • -
    • Add check to ensure remote instances are build with the same RxDB version. This is to ensure if you update RxDB and forget to rebuild your workers, it will throw instead of causing strange problems.
    • -
    • When the pulled documents in the replication do not match the schema, do not update the checkpoint.
    • -
    • When the pushed document conflict results in the replication do not match the schema, do not update the checkpoint.
    • -
    -

    Other

    -
      -
    • Added more performance tests
    • -
    • The amount of collections in the open source version has been limited to 16.
    • -
    • Moved RxQuery checks into dev-mode.
    • -
    • RxQuery.remove() now internally does a bulk operation for better performance.
    • -
    • Lazily process bulkWrite() results for less CPU usage.
    • -
    • Only run interval cleanup on the storage of a collection if there actually have been writes to it.
    • -
    • Schema validation errors (code: 422) now include the RxJsonSchema for easier debugging.
    • -
    • Added an interval to prevent browser tab hibernation while a replication is running.
    • -
    -

    You can help!

    -

    There are many things that can be done by you to improve RxDB:

    -
      -
    • Check the BACKLOG for features that would be great to have.
    • -
    • Check the breaking backlog for breaking changes that must be implemented in the future but where I did not have the time yet.
    • -
    • Check the todos in the code. There are many small improvements that can be done for performance and build size.
    • -
    • Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors.
    • -
    • Update the example projects some of them are outdated and need updates.
    • -
    -

    LinkedIn

    -

    Stay connected with the latest updates and network with professionals in the RxDB community by following RxDB's official LinkedIn page!

    - - \ No newline at end of file diff --git a/docs/releases/16.0.0.md b/docs/releases/16.0.0.md deleted file mode 100644 index 2f7dc157c66..00000000000 --- a/docs/releases/16.0.0.md +++ /dev/null @@ -1,101 +0,0 @@ -# RxDB 16.0.0 - Efficiency Redefined - -> Meet RxDB 16.0.0 - major refactorings, improved performance, and easy migrations. Experience a better, faster, and more stable database solution today. - -# 16.0.0 - -The release [16.0.0](https://rxdb.info/releases/16.0.0.html) is used for major refactorings. We did not change that much, mostly renaming things and fixing confusing implementation details. - -Data stored in the previous version `15` is compatible with the code of the new version `16` for most RxStorage implementation. So migration will be easy. -Only the following RxStorage implementations are required to migrate the data itself with the [storage migration plugin](../migration-storage.md): -- SQLite RxStorage -- NodeFilesystem RxStorage -- OPFS RxStorage - -## Breaking Changes -- CHANGE [RxServer](https://rxdb.info/rx-server.html) is no longer in beta mode. -- CHANGE [Fulltext Search](https://rxdb.info/fulltext-search.html) is no longer in beta mode. -- CHANGE [Custom Reactivity](https://rxdb.info/reactivity.html) is no longer in beta mode. -- CHANGE [initialCheckpoint in replications](https://rxdb.info/replication.html) is no longer in beta mode. -- CHANGE [RxState](https://rxdb.info/rx-state.html) is no longer in beta mode. -- CHANGE [MemoryMapped RxStorage](https://rxdb.info/rx-storage-memory-mapped.html) is no longer in beta mode. -- CHANGE rename `randomCouchString()` to `randomToken()` -- FIX (GraphQL replication) datapath must be equivalent for pull and push [#6019](https://github.com/pubkey/rxdb/pull/6019) -- REMOVE fallback to the `ohash` package when `crypto.subtle` does not exist. All modern runtimes (also react-native) now support `crypto.subtle`, so we do not need that fallback anymore. - -### Removed deprecated LokiJS RxStorage - -The [LokiJS RxStorage](https://rxdb.info/rx-storage-lokijs.html) was deprecated because LokiJS itself is no longer maintained. Therefore it will be removed completely. If you still need that, you can fork the code of it and publish it in an own package and link to it from the [third party plugins page](https://rxdb.info/third-party-plugins.html). - -### Renamed `.destroy()` to `.close()` -Destroy was adapted from PouchDB, but people often think this deletes the written data. `close` is a better name for that functionality. -- Also renamed similar functions/attributes: - - `.destroy()` to `.close()` - - `.onDestroy()` to `.onClose()` - - `postDestroyRxCollection` to `postCloseRxCollection` - - `preDestroyRxDatabase` to `preCloseRxDatabase` - -### `ignoreDuplicate: true` on `createRxDatabase()` must only be allowed in dev-mode. -The `ignoreDuplicate` flag is only useful for tests and should never be used in production. We now throw an error if it is set to `true` in non-dev-mode. - -### When dev-mode is enabled, a schema validator must be used. -Many reported issues come from people storing data that is not valid to their schema. -To fix this, in dev-mode it is now required that at least one schema validator is used. - -### Removed the memory-synced storage - -The memory-synced RxStorage was removed in RxDB version 16. Please use the `memory-mapped` storage instead which has better trade-offs and is easier to configure. - -### Split conflict handler functionality into `isEqual()` and `resolve()`. - -Because the handler is used in so many places it becomes confusing to write a proper conflict handler. -Also having a handler that requires user interaction is only possible by hackingly using the context param. -By splitting the functionalities it is easier to learn where the handlers are used and how to define them properly. - -## Full rewrite of the OPFS and Filesystem-Node RxStorages - -The [OPFS](../rx-storage-opfs.md) and [Filesystem-Node](../rx-storage-filesystem-node.md) RxStorage had problems with storing emojis and other special characters inside of indexed fields. -I completely rewrote them and improved performance especially on initial load when a lot of data is stored already and when doing many small writes/reads at the same time on in series. - -## Internal Changes - -- CHANGE (internal) migration-storage plugin: Remove catch from cleanup -- CHANGE (internal) rename RX_PIPELINE_CHECKPOINT_CONTEXT to `rx-pipeline-checkpoint` -- CHANGE (internal) remove `conflictResultionTasks()` and `resolveConflictResultionTask()` from the RxStorage interface. -- REMOVED (internal) do not check for duplicate event bulks, all RxStorage implementations must guarantee to not emit the same events twice. -- REFACTOR (internal) Only use event-bulks internally and only transform to single emitted events if actually someone has subscribed to the eventstream. - -## Bugfixes - -- Having a lot of documents pulled in the replication could in some cases slow down the database initialization because `upstreamInitialSync()` did not set a checkpoint and each time checked all documents if they are equal to the master. -- If the handler of a [RxPipeline](../rx-pipeline.md) throws an error, block the whole pipeline and emit the error to the outside. -- Throw error when dexie.js RxStorage is used with optional index fields [#6643](https://github.com/pubkey/rxdb/pull/6643#issuecomment-2505310082). -- Fix IndexedDB bug: Some people had problems with the IndexedDB RxStorage that opened up collections very slowly. If you had this problem, please try out this new version. -- Add check to ensure remote instances are build with the same RxDB version. This is to ensure if you update RxDB and forget to rebuild your workers, it will throw instead of causing strange problems. -- When the pulled documents in the replication do not match the schema, do not update the checkpoint. -- When the pushed document conflict results in the replication do not match the schema, do not update the checkpoint. - -## Other - -- Added more [performance tests](https://rxdb.info/rx-storage-performance.html) -- The amount of collections in the open source version has been limited to `16`. -- Moved RxQuery checks into dev-mode. -- RxQuery.remove() now internally does a bulk operation for better performance. -- Lazily process bulkWrite() results for less CPU usage. -- Only run interval cleanup on the storage of a collection if there actually have been writes to it. -- Schema validation errors (code: 422) now include the `RxJsonSchema` for easier debugging. -- Added an interval to prevent browser tab hibernation while a replication is running. - -## You can help! - -There are many things that can be done by **you** to improve RxDB: - -- Check the [BACKLOG](https://github.com/pubkey/rxdb/blob/master/orga/BACKLOG.md) for features that would be great to have. -- Check the [breaking backlog](https://github.com/pubkey/rxdb/blob/master/orga/before-next-major.md) for breaking changes that must be implemented in the future but where I did not have the time yet. -- Check the [todos](https://github.com/pubkey/rxdb/search?q=todo) in the code. There are many small improvements that can be done for performance and build size. -- Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors. -- Update the [example projects](https://github.com/pubkey/rxdb/tree/master/examples) some of them are outdated and need updates. - -## LinkedIn - -Stay connected with the latest updates and network with professionals in the RxDB community by following RxDB's [official LinkedIn page](https://www.linkedin.com/company/rxdb)! diff --git a/docs/releases/17.0.0.html b/docs/releases/17.0.0.html deleted file mode 100644 index 94b63797812..00000000000 --- a/docs/releases/17.0.0.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - -RxDB 17.0.0 | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxDB 17.0.0 (beta)

    -

    RxDB 17 focuses on better reactivity, improved debugging, and important storage fixes, while also graduating several long-standing plugins out of beta.

    -

    Most applications can upgrade easily, but users of OPFS and filesystem-based storages must review the migration notes carefully.

    -
    note

    RxDB version 17 is currently in beta. For testing, please install the latest beta version from npm and provide feedback or report issues on GitHub.

    -

    Migration

    -

    RxDB 17 is mostly backward-compatible, but please review the following points before upgrading:

    -

    Storage migration required

    -

    If you use any of the following storages, you must migrate your data using the storage migrator:

    -
      -
    • OPFS RxStorage
    • -
    • Filesystem RxStorage (Node)
    • -
    • IndexedDB RxStorage (if you use attachments)
    • -
    -

    For all other RxStorages, data created with RxDB v16 can be reused directly in RxDB v17.

    -

    Other migration notes

    -
      -
    • The GitHub repository no longer contains prebuilt dist files.
      -Install RxDB from npm or run the build scripts locally.
    • -
    • toggleOnDocumentVisible now defaults to true. #6810
    • -
    • Schema fields marked as final no longer need to be explicitly listed as required.
    • -
    • Some integrations now use optional peer dependencies. You may need to install them manually: -
        -
      • firebase
      • -
      • mongodb
      • -
      • nats
      • -
      -
    • -
    -

    CHANGES

    -

    Features

    - -

    🔁 Reactivity & APIs

    -
      -
    • ADD RxDatabase.collections$ observable for reactive access to collections
    • -
    • ADD support for the JavaScript using keyword to automatically remove databases in tests
    • -
    • ADD new reactivity-angular package
    • -
    • CHANGE moved reactivity-vue and reactivity-preact-signals from premium to core
    • -
    • FIX query results becoming incorrect when changes occur faster than query update #7067
    • -
    -

    🧠 Debugging & Developer Experience

    -
      -
    • ADD context field to all RxDB write errors for easier debugging
    • -
    • ADD improved OPFS RxStorage error logging in devMode, including: -
        -
      • strict TextDecoder mode
      • -
      • detailed decoding error output
      • -
      -
    • -
    • ADD internal WeakRef TypeScript types so users no longer need to enable ES2021.WeakRef
    • -
    • ADD llms.txt for LLM-friendly documentation access
    • -
    • CHANGE toggleOnDocumentVisible now defaults to true #6810
    • -
    -

    🗄️ Storage & Replication Fixes

    -
      -
    • FIX OPFS RxStorage memory and cleanup leaks
    • -
    • FIX memory-mapped storage not purging deleted documents
    • -
    • FIX RxCollection.cleanup() ignoring minimumDeletedTime
    • -
    • FIX short primary key lengths not matching replication schema #7587
    • -
    • FIX retry DenoKV commits when encountering "database is locked" errors
    • -
    • FIX close broadcast channels and leader election after database shutdown, not during
    • -
    • CHANGE: Store data as binary in IndexedDB to use less disc space.
    • -
    • CHANGE: Pull-Only replications no longer store the server metadata on the client.
    • -
    -

    📐 Schema & Index Validation

    -
      -
    • ADD enforce maximum length for indexes and primary keys (maxLength: 2048)
    • -
    • CHANGE final schema fields no longer need to be marked as required
    • -
    -

    ⚙️ Performance & Internal Changes

    -
      -
    • CHANGE replace appendToArray() with Array.concat() for better browser-level optimizations
    • -
    • ADD ensure indexes and primary keys are validated consistently across replication schemas
    • -
    -

    🔌 Plugins Graduating from Beta

    -

    The following plugins are no longer in beta and are now considered production-ready:

    -
      -
    • Replication Appwrite
    • -
    • Replication Supabase
    • -
    • Replication MongoDB
    • -
    • RxStorage MongoDB
    • -
    • RxStorage Filesystem (Node)
    • -
    • RxStorage DenoKV
    • -
    • Attachment replication
    • -
    • CRDT Plugin
    • -
    • RxPipeline
    • -
    -

    You can help!

    -

    There are many things that can be done by you to improve RxDB:

    -
      -
    • Check the BACKLOG for features that would be great to have.
    • -
    • Check the breaking backlog for breaking changes that must be implemented in the future but where I did not have the time yet.
    • -
    • Check the todos in the code. There are many small improvements that can be done for performance and build size.
    • -
    • Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors.
    • -
    • Update the example projects some of them are outdated and need updates.
    • -
    -

    LinkedIn

    -

    Stay connected with the latest updates and network with professionals in the RxDB community by following RxDB's official LinkedIn page!

    - - \ No newline at end of file diff --git a/docs/releases/17.0.0.md b/docs/releases/17.0.0.md deleted file mode 100644 index 543d7023726..00000000000 --- a/docs/releases/17.0.0.md +++ /dev/null @@ -1,168 +0,0 @@ -# RxDB 17.0.0 - -> RxDB 17 introduces improved reactivity APIs, better debugging, breaking storage fixes, and multiple plugins graduating from beta. - -# RxDB 17.0.0 (beta) - -RxDB 17 focuses on **better reactivity**, **improved debugging**, and **important storage fixes**, while also graduating several long-standing plugins out of beta. - -Most applications can upgrade easily, but **users of OPFS and filesystem-based storages must review the migration notes carefully**. - -:::note -RxDB version 17 is currently in **beta**. For testing, please install the latest beta version [from npm](https://www.npmjs.com/package/rxdb?activeTab=versions) and provide feedback or report issues [on GitHub](https://github.com/pubkey/rxdb/issues/7574). -::: - -## Migration - -RxDB 17 is mostly backward-compatible, but please review the following points before upgrading: - -### Storage migration required -If you use any of the following storages, **you must migrate your data** using the [storage migrator](../migration-storage.md): - -- OPFS RxStorage -- Filesystem RxStorage (Node) -- IndexedDB RxStorage (if you use attachments) - -For all other RxStorages, data created with RxDB v16 can be reused directly in RxDB v17. - -### Other migration notes - -- The GitHub repository **no longer contains prebuilt `dist` files**. - Install RxDB from npm or run the build scripts locally. -- `toggleOnDocumentVisible` now defaults to **`true`**. [#6810](https://github.com/pubkey/rxdb/issues/6810) -- Schema fields marked as `final` **no longer need to be explicitly listed as `required`**. -- Some integrations now use **optional peer dependencies**. You may need to install them manually: - - `firebase` - - `mongodb` - - `nats` - -## CHANGES - -### Features - -- Added [react-hooks plugin](../react.md). - -### 🔁 Reactivity & APIs - -- **ADD** `RxDatabase.collections$` observable for reactive access to collections -- **ADD** support for the JavaScript `using` keyword to automatically remove databases in tests -- **ADD** new `reactivity-angular` package -- **CHANGE** moved `reactivity-vue` and `reactivity-preact-signals` from premium to core -- **FIX** query results becoming incorrect when changes occur faster than query update [#7067](https://github.com/pubkey/rxdb/issues/7067) - -### 🧠 Debugging & Developer Experience - -- **ADD** `context` field to all RxDB write errors for easier debugging -- **ADD** improved OPFS RxStorage error logging in `devMode`, including: - - strict `TextDecoder` mode - - detailed decoding error output -- **ADD** internal `WeakRef` TypeScript types so users no longer need to enable `ES2021.WeakRef` -- **ADD** [llms.txt](https://rxdb.info/llms.txt) for LLM-friendly documentation access -- **CHANGE** `toggleOnDocumentVisible` now defaults to `true` [#6810](https://github.com/pubkey/rxdb/issues/6810) - -### 🗄️ Storage & Replication Fixes - -- **FIX** OPFS RxStorage memory and cleanup leaks -- **FIX** memory-mapped storage not purging deleted documents -- **FIX** `RxCollection.cleanup()` ignoring `minimumDeletedTime` -- **FIX** short primary key lengths not matching replication schema [#7587](https://github.com/pubkey/rxdb/issues/7587) -- **FIX** retry DenoKV commits when encountering `"database is locked"` errors -- **FIX** close broadcast channels and leader election **after** database shutdown, not during -- **CHANGE**: Store data as binary in IndexedDB to use less disc space. -- **CHANGE**: Pull-Only replications no longer store the server metadata on the client. - -### 📐 Schema & Index Validation - -- **ADD** enforce maximum length for indexes and primary keys (`maxLength: 2048`) -- **CHANGE** `final` schema fields no longer need to be marked as `required` - -### ⚙️ Performance & Internal Changes - -- **CHANGE** replace `appendToArray()` with `Array.concat()` for better browser-level optimizations -- **ADD** ensure indexes and primary keys are validated consistently across replication schemas - -### 🔌 Plugins Graduating from Beta - -The following plugins are **no longer in beta** and are now considered production-ready: - -- Replication Appwrite -- Replication Supabase -- Replication MongoDB -- RxStorage MongoDB -- RxStorage Filesystem (Node) -- RxStorage DenoKV -- Attachment replication -- CRDT Plugin -- RxPipeline - -## You can help! - -There are many things that can be done by **you** to improve RxDB: - -- Check the [BACKLOG](https://github.com/pubkey/rxdb/blob/master/orga/BACKLOG.md) for features that would be great to have. -- Check the [breaking backlog](https://github.com/pubkey/rxdb/blob/master/orga/before-next-major.md) for breaking changes that must be implemented in the future but where I did not have the time yet. -- Check the [todos](https://github.com/pubkey/rxdb/search?q=todo) in the code. There are many small improvements that can be done for performance and build size. -- Review the code and add tests. I am only a single human with a laptop. My code is not perfect and much small improvements can be done when people review the code and help me to clarify undefined behaviors. -- Update the [example projects](https://github.com/pubkey/rxdb/tree/master/examples) some of them are outdated and need updates. - -## LinkedIn - -Stay connected with the latest updates and network with professionals in the RxDB community by following RxDB's [official LinkedIn page](https://www.linkedin.com/company/rxdb)! - - diff --git a/docs/releases/8.0.0.html b/docs/releases/8.0.0.html deleted file mode 100644 index 00cd490f29c..00000000000 --- a/docs/releases/8.0.0.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - - -Meet RxDB 8.0.0 - New Defaults & Performance | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    8.0.0

    -

    When I created RxDB, two years ago, there where some things that I did not consider and other things that I just decided wrong. -With the breaking version 8.0.0 I rewrote some parts of RxDB and changed the API a bit. The focus laid on better defaults and better performance.

    -

    disableKeyCompression by default

    -

    Because the keyCompression was confusing and most users do not use it, it is now disabled by default. Also the naming was bad, so disableKeyCompression is now renamed to keyCompression which defaults to false.

    -

    collection() now only accepts a RxJsonSchema as schema

    -

    In the past, it was allowed to set an RxSchema or an RxJsonSchema as schema-field when creating a collection. This was confusing and so it is now only allowed to use RxJsonSchema.

    -

    required fields have to be set via array

    -

    In the past it was allowed to set a field as required by setting the boolean value required: true. -This is against the json-schema-standard and will make problems when switching between different schema-validation-plugins. Therefore required fields must now be set via required: ['fieldOne', 'fieldTwo'].

    -

    Setters are only callable on temporary documents

    -

    To be similar to mongoosejs, there was the possibility to set a documents value via myDoc.foo = 'bar' and later call myDoc.save() to persist these changes. -But there was the problem that we have no weak pointers in javascript and therefore we have to store all document-instances in a cache to run change-events on them and make them 'reactive'. To save memory-space, we reuse the same documents when they are used multiple times. This made it hard to determine what happens when multiple parts of an application used the setters at the same time. Also there was an undefined behavior what should happen when a field is changed via setter and also via replication before save() was called.

    -
      -
    • myDoc.age = 50;, myDoc.set('age', 50); and myDoc.save() is no more allowed on non-temporary-documents
    • -
    • Instead, to change document-data, use RxDocument.atomicUpdate() or RxDocument.atomicSet() or RxDocument.update().
    • -
    • The following document-methods no longer exist: synced$, resync()
    • -
    -

    middleware-hooks contain plain json as first parameter and RxDocument as second

    -

    When the middleware-hooks where created, the goal was to work equal then mongoose. But this is not possible because mongoose is more 'static' and its documents never change their attributes. RxDB is a reactive database and when the state on disc changes, the attributes of the document also change. This caused some undefined behavior especially with async middleware-hooks. To solve this, hooks now can only modify the plain data, not the RxDocument itself.

    -
    myCollection.preSave(function(data, rxDocument) {
    -    // to set age to 50 before saving, change the first parameter
    -    data.age = 50;
    -}, false);
    -

    multiInstance is now done via broadcast-channel

    -

    Because the BroadcastChannel-API is not usable in all browsers and also not in NodeJs, multiInstance-communication was hard. The hacky workaround was to use a pseudo-socket and regularly check if an other instance has emitted a RxChangeEvent. -This was expensive because even when the database did nothing, we wasted disk-IO and CPU by handling this.

    -

    To solve this waste, I spend one month creating a module that polyfills the broadcast-channel-api so it works on old browsers, new browsers and even NodeJs. This does not only waste less resources but also has a lower latency. Also the module is used by more projects than RxDB which allows use the fix bugs and improve performance together.

    -

    Set QueryChangeDetection via RxDatabase-option

    -

    In the past, the QueryChangeDetection had to be enabled by importing the QueryChangeDetection and calling a function on it. This was strange and also did not allow to toggle the QueryChangeDetection on specific databases. -Now we set the QueryChangeDetection by adding the boolean field queryChangeDetection: true when creating the database.

    -
    const db = await RxDB.create({
    -  name: 'heroesdb',
    -  adapter: 'idb',
    -  queryChangeDetection: false // <- queryChangeDetection (optional, default: false)
    -});
    -console.dir(db);
    -

    Reuse an RxDocument-prototype per collection instead of adding getters/setters to each document

    -

    Because the fields of an RxDocument are defined dynamically by the schema and we could not use the Proxy-Object because it is not supported in IE11, there was one workaround used: Each time a document is created, all getters and setters where applied on it. This was expensive and now we use a different approach. -Once per collection, a custom RxDocument-prototype and constructor is created and each RxDocument of this collection is created with the constructor. This change is a rewrite internally and should not change anything for RxDB-users. If you use RxDB with vuejs, you might get some problems that can be fixed by upgrading vuejs to the latest version.

    -

    Rewritten the inMemory-plugin

    -

    The inMemory-plugin was written with some wrong estimations. I rewrote it and added much more tests. Also awaitPersistence() can now be used to check if all writes have already been replicated into the parent collection. Also RxCollection.watchForChanges() got split out from the replication-plugin into its own watch-for-changes-plugin because it is used in the inMemory and the replication functionality.

    -

    Some comparisons

    -

    (Tested with node 10.6.0 and the memory-adapter, lower is better)

    -

    Reproduce with npm run build:size and npm run test:performance

    -
    7.7.18.0.0
    Bundle-Size (Webpack+minify+gzip)110 kb101.962 kb
    Spawn 1000 databases with 5 collections each8744 ms9906 ms
    insert 2000 documents8006 ms5781 ms
    find 10.000 documents3202 ms1312 ms
    - - \ No newline at end of file diff --git a/docs/releases/8.0.0.md b/docs/releases/8.0.0.md deleted file mode 100644 index 180edc54e4e..00000000000 --- a/docs/releases/8.0.0.md +++ /dev/null @@ -1,84 +0,0 @@ -# Meet RxDB 8.0.0 - New Defaults & Performance - -> Discover how RxDB 8.0.0 boosts performance, simplifies schema handling, and streamlines reactive data updates for modern apps. - -# 8.0.0 - -When I created RxDB, two years ago, there where some things that I did not consider and other things that I just decided wrong. -With the breaking version `8.0.0` I rewrote some parts of RxDB and changed the API a bit. The focus laid on **better defaults** and **better performance**. - -## disableKeyCompression by default - -Because the keyCompression was confusing and most users do not use it, it is now disabled by default. Also the naming was bad, so `disableKeyCompression` is now renamed to `keyCompression` which defaults to `false`. - -## collection() now only accepts a RxJsonSchema as schema - -In the past, it was allowed to set an `RxSchema` or an `RxJsonSchema` as `schema`-field when creating a collection. This was confusing and so it is now only allowed to use `RxJsonSchema`. - -## required fields have to be set via array - -In the past it was allowed to set a field as required by setting the boolean value `required: true`. -This is against the [json-schema-standard](https://json-schema.org/understanding-json-schema/reference/object.html#required-properties) and will make problems when switching between different schema-validation-plugins. Therefore required fields must now be set via `required: ['fieldOne', 'fieldTwo']`. - -## Setters are only callable on temporary documents - -To be similar to mongoosejs, there was the possibility to set a documents value via `myDoc.foo = 'bar'` and later call `myDoc.save()` to persist these changes. -But there was the problem that we have no weak pointers in javascript and therefore we have to store all document-instances in a cache to run change-events on them and make them 'reactive'. To save memory-space, we reuse the same documents when they are used multiple times. This made it hard to determine what happens when multiple parts of an application used the setters at the same time. Also there was an undefined behavior what should happen when a field is changed via setter and also via replication before `save()` was called. - -- `myDoc.age = 50;`, `myDoc.set('age', 50);` and `myDoc.save()` is no more allowed on non-temporary-documents -- Instead, to change document-data, use `RxDocument.atomicUpdate()` or `RxDocument.atomicSet()` or `RxDocument.update()`. -- The following document-methods no longer exist: `synced$`, `resync()` - -## middleware-hooks contain plain json as first parameter and RxDocument as second - -When the middleware-hooks where created, the goal was to work equal then [mongoose](http://mongoosejs.com/docs/middleware.html). But this is not possible because mongoose is more 'static' and its documents never change their attributes. RxDB is a reactive database and when the state on disc changes, the attributes of the document also change. This caused some undefined behavior especially with async middleware-hooks. To solve this, hooks now can only modify the plain data, not the `RxDocument` itself. - -```javascript -myCollection.preSave(function(data, rxDocument) { - // to set age to 50 before saving, change the first parameter - data.age = 50; -}, false); -``` - -## multiInstance is now done via broadcast-channel - -Because the [BroadcastChannel-API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API) is not usable in all browsers and also not in NodeJs, multiInstance-communication was hard. The hacky workaround was to use a pseudo-socket and regularly check if an other instance has emitted a `RxChangeEvent`. -This was expensive because even when the database did nothing, we wasted disk-IO and CPU by handling this. - -To solve this waste, I spend one month creating [a module that polyfills the broadcast-channel-api](https://github.com/pubkey/broadcast-channel) so it works on old browsers, new browsers and even NodeJs. This does not only waste less resources but also has a lower latency. Also the module is used by more projects than RxDB which allows use the fix bugs and improve performance together. - -## Set QueryChangeDetection via RxDatabase-option - -In the past, the QueryChangeDetection had to be enabled by importing the QueryChangeDetection and calling a function on it. This was strange and also did not allow to toggle the QueryChangeDetection on specific databases. -Now we set the QueryChangeDetection by adding the boolean field `queryChangeDetection: true` when creating the database. - -```javascript -const db = await RxDB.create({ - name: 'heroesdb', - adapter: 'idb', - queryChangeDetection: false // <- queryChangeDetection (optional, default: false) -}); -console.dir(db); -``` - -## Reuse an RxDocument-prototype per collection instead of adding getters/setters to each document - -Because the fields of an `RxDocument` are defined dynamically by the schema and we could not use the `Proxy`-Object because it is not supported in IE11, there was one workaround used: Each time a document is created, all getters and setters where applied on it. This was expensive and now we use a different approach. -Once per collection, a custom RxDocument-prototype and constructor is created and each RxDocument of this collection is created with the constructor. This change is a rewrite internally and should not change anything for RxDB-users. If you use RxDB with vuejs, you might get some problems that can be fixed by upgrading vuejs to the latest version. - -## Rewritten the inMemory-plugin - -The inMemory-plugin was written with some wrong estimations. I rewrote it and added much more tests. Also `awaitPersistence()` can now be used to check if all writes have already been replicated into the parent collection. Also `RxCollection.watchForChanges()` got split out from the `replication`-plugin into its own `watch-for-changes`-plugin because it is used in the inMemory and the replication functionality. - -## Some comparisons - -(Tested with node 10.6.0 and the memory-adapter, lower is better) - -Reproduce with `npm run build:size` and `npm run test:performance` - -| | 7.7.1 | 8.0.0 | -| :-------------------------------------------: | :-----: | ---------- | -| Bundle-Size (Webpack+minify+gzip) | 110 kb | 101.962 kb | -| Spawn 1000 databases with 5 collections each | 8744 ms | 9906 ms | -| insert 2000 documents | 8006 ms | 5781 ms | -| find 10.000 documents | 3202 ms | 1312 ms | diff --git a/docs/releases/9.0.0.html b/docs/releases/9.0.0.html deleted file mode 100644 index 9eb0558a2fc..00000000000 --- a/docs/releases/9.0.0.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - -RxDB 9.0.0 - Faster & Simpler | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    9.0.0

    -

    So I was working hard the past month to prepare everything for the next major release of RxDB. The last major release was 1,5 years ago by the way.

    -

    When I started listing up the planned changes I had big ambitions about basically rewriting everything. But I found out this time has not come yet. There is some work to be done first. So version 9.0.0 was more about fixing all these small things that made improving the codebase difficult. Much has been refactored and moved. Some API-parts have been changed to have a more simple project with a cleaner codebase.

    -

    Notice that I use major releases to bundle stuff that breaks the RxDB usage in your project. By having only few major releases you can be sure that you can upgrade in one big block instead of changing stuff each few months. Big features are released in non-major releases because they mostly can be implemented without side effects.

    -

    Breaking changes

    -

    You have to apply these changes to your codebase when upgrading RxDB.

    -

    All default exports have been removed

    -

    Using default exports and imports can be helpful when you want to write code fast. -But using them also disabled the tree-shaking of your bundler which means you added much code to your bundle that was not even used. To prevent this common behavior, I removed all default exports and renamed functions so that they are more unlikely to clash with other non-RxDB function names.

    -

    Instead of doing

    -
    import RxDB from 'rxdb';
    -RxDB.plugin(/* ... */);
    -await RxDB.create({/* ... */});
    -

    You now do

    -
    import { createRxDatabase, addRxPlugin } from 'rxdb';
    -addRxPlugin(/* ... */);
    -await createRxDatabase({/* ... */});
    -

    Also removeDatabase() is renamed to removeRxDatabase() and plugin() is now addRxPlugin().

    -

    Same goes for all previous default exports of the plugins.

    -

    Indexes are specified at the top level of the schema definition

    -

    related issue

    -

    In the past the indexes of a collection had to be specified at the field level of the schema like

    -
    {
    -    "firstName": {
    -        "type": "string",
    -        "index": true
    -    }
    -}
    -

    This made it complex to list up the index fields which had a bad performance on startup. -To fix this the indexes are now specified at the top level of the schema like

    -
    {
    -    "title": "my schema",
    -    "version": 0,
    -    "type": "object",
    -    "properties": {},
    -    "indexes": [
    -        "firstName",
    -        ["compound", "index"]
    -    ]
    -}
    -

    Encrypted fields at the top level of the schema

    -

    Same as the indexes, encrypted fields are now also defined in the top level like

    -
    {
    -    "title": "my schema",
    -    "version": 0,
    -    "type": "object",
    -    "properties": {},
    -    "encrypted": [
    -        "password"
    -    ]
    -}
    -

    New dev-mode plugin

    -

    In the past we had stuff that is only wanted for development in the two plugins error-messages and schema-check.

    -

    Now we have a single plugin dev-mode that contains all these checks and development helper functions. I also moved many other checks out of the core-module into dev-mode.

    -
    import { RxDBDevModePlugin } from 'rxdb/plugins/dev-mode';
    -addRxPlugin(RxDBDevModePlugin);
    -

    New migration plugin

    -

    The data migration was not used by all users of this project. Often it was easier to just wipe the local data store and let the client sync everything from the server. Because the migration has so much code, it is now in a separate plugin so that you do not have to ship this code to the clients if not necessary.

    -
    import { RxDBMigrationPlugin } from 'rxdb/plugins/migration';
    -addRxPlugin(RxDBMigrationPlugin);
    -

    Rewritten key-compression

    -

    The key-compression logic was fully coded only for RxDB. This was a problem because it was not usable for other stuff and also badly tested. We had a known problem with nested arrays that caused much confusion because some queries did not find the correct documents.

    -

    I now created a npm-package jsonschema-key-compression that has cleaner code, better tests and can also be used for non-RxDB stuff.

    -

    If you used the key-compression in the past and have clients out there with old data, you have to find a way to migrate that data by using the json-import or other solutions depending on your project.

    -

    Rewritten query-change-detection to event-reduce

    -

    One big benefit of having a realtime database is that big performance optimizations can be done when the database knows a query is observed and the updated results are needed continuously. In the past this optimization was done by the internal queryChangeDetection which was a big tree of if-else-statements that hopefully worked. This was also the reason why queryChangeDetection was in beta mode and not enabled by default.

    -

    After months of research and testing I was able to create Event-Reduce: An algorithm to optimize database queries that run multiple times. This JavaScript module contains an algorithm that is able to optimize realtime queries in a way that was not possible before. The algorithm is not RxDB specific and also heavily tested.

    -

    Instead of setting queryChangeDetection when creating a RxDatabase, you now set eventReduce which defaults to true.

    -

    find() and findOne() now accepts the full mango query

    -

    In the past, only the selector of a query could be passed to find() and findOne() if you wanted to also do sort, skip or limit, you had to call additional functions like

    -
    const query = myRxCollection.find({
    -    age: {
    -        $gt: 10
    -    }
    -}).sort('name').skip(5).limit(10);
    -

    Now you can pass the full query to the function call like

    -
    const query = myRxCollection.find({
    -    selector: {
    -        age: {
    -            $gt: 10
    -        }
    -    },
    -    sort: [{name: 'asc'}],
    -    skip: 5,
    -    limit: 10
    -});
    -

    moved query builder to own plugin

    -

    The query builder that allowed to create queries like .where('foo').eq('bar') etc. was not really used by many people. Most of the time it is better to just pass the full query as simple json object. Also the code for the query builder was big and increased the build size much more than its value added. Only some edge-cases where recursive query modification was needed made the query builder useful. If you still want to use the query builder, you have to import the plugin.

    -
    import { RxDBQueryBuilderPlugin } from 'rxdb/plugins/query-builder';
    -addRxPlugin(RxDBQueryBuilderPlugin);
    -

    Refactored RxChangeEvent

    -

    The whole data structure of RxChangeEvent was way more complicated than it had to be. I refactored the whole class to be more simple. If you directly use RxChangeEvent in your project you have to adapt to these changes. Also the stream of RxDatabase().$ will no longer emit the COLLECTION event when a new collection is created.

    -

    Internal hash() is now using a salt

    -

    The internal hash function was used to store hashes of database passwords to compare them and directly throw errors when the wrong password was used with an existing data set. This was dangerous because you could use rainbow tables or even just google the hash to find out the plain password. So now the internal hashing is using a salt to prevent these attacks. If you have used the encryption in the past, you have to migrate your internal schema storage.

    -

    Changed default of RxDocument.toJSON()

    -

    By default RxDocument.toJSON() always returned also the _rev field and the _attachments. This was confusing behavior which is why I changed the default to RxDocument().toJSON(withRevAndAttachments = false)

    -

    Typescript 3.8.0 or newer is required

    -

    Because RxDB and some subdependencies extensively use export type ... you now need typescript 3.8.0 or newer.

    -

    GraphQL replication will run a schema validation of incoming data

    -

    In dev-mode, the GraphQL-replication will run a schema validation of each document that comes from the server before it is saved to the database.

    -

    Internal and other changes

    -

    I refactored much internal stuff and moved much code out of the core into the specific plugins.

    -
      -
    • Renamed RxSchema.jsonID to RxSchema.jsonSchema
    • -
    • Moved remaining stuff of leader-election from core into the plugin
    • -
    • Merged multiple internal databases for metadata into one internalStore
    • -
    • Removed many runtime type checks that now should be covered by typescript in buildtime
    • -
    • The GraphQL replication is now out of beta mode
    • -
    • Removed documentation examples for require() CommonJS loading
    • -
    • Removed RxCollection.docChanges$() because all events are from the docs
    • -
    -

    Help wanted

    -

    RxDB is an open source project an heavily relies on the contribution of its users. There are some things that must be done, but I have no time for them.

    -

    Refactor data-migrator

    -

    The current implementation has some flaws and should be completely rewritten.

    -
      -
    • It does not use pouchdb's bulkDocs which is much faster
    • -
    • It could have been written without rxjs and with less code that is easier to understand
    • -
    • It does not migrate the revisions of documents which causes a problem when replication is used
    • -
    -

    Add e2e tests to the react example

    -

    The react example has no end-to-end tests which is why the CI does not ensure that it works all the time. We should add some basic tests like we did for the other example projects.

    -

    Fix pouchdb bug so we can upgrade pouchdb-find

    -

    There is a bug in pouchdb that prevents the upgrade of pouchdb-find. This is why RxDB relies on an old version of pouchdb-find that also requires different sub-dependencies. This increases the build size a lot because for example we ship multiple version of spark-md5 and others.

    -

    About the future of RxDB

    -

    At the moment RxDB is a realtime database based on pouchdb. In the future I want RxDB to be a wrapper around pull-based databases that also works with other source-dbs like mongoDB or PostgreSQL. As a start I defined the RxStorage interface and created a RxStoragePouchdb class that implements it and contains all pouchdb-specific logic. I want to move every direct storage usage into that interface so that later we can create other implementations of it for other source databases.

    - - \ No newline at end of file diff --git a/docs/releases/9.0.0.md b/docs/releases/9.0.0.md deleted file mode 100644 index 36a10f3f05d..00000000000 --- a/docs/releases/9.0.0.md +++ /dev/null @@ -1,213 +0,0 @@ -# RxDB 9.0.0 - Faster & Simpler - -> Discover RxDB 9.0.0's streamlined plugins, top-level schema definitions, and improved dev-mode. Experience a simpler, faster real-time database. - -# 9.0.0 - -So I was working hard the past month to prepare everything for the next major release of RxDB. The last major release was 1,5 years ago by the way. - -When I started [listing up the planned changes](https://github.com/pubkey/rxdb/issues/1636) I had big ambitions about basically rewriting everything. But I found out this time has not come yet. There is some work to be done first. So version `9.0.0` was more about fixing all these small things that made improving the codebase difficult. Much has been refactored and moved. Some API-parts have been changed to have a more simple project with a cleaner codebase. - -Notice that I use major releases to bundle stuff that breaks the RxDB usage in your project. By having only few major releases you can be sure that you can upgrade in one big block instead of changing stuff each few months. Big features are released in non-major releases because they mostly can be implemented without side effects. - -## Breaking changes - -You have to apply these changes to your codebase when upgrading RxDB. - -### All default exports have been removed - -Using default exports and imports can be helpful when you want to write code fast. -But using them also disabled the tree-shaking of your bundler which means you added much code to your bundle that was not even used. To prevent this common behavior, I removed all default exports and renamed functions so that they are more unlikely to clash with other non-RxDB function names. - -Instead of doing - -```typescript -import RxDB from 'rxdb'; -RxDB.plugin(/* ... */); -await RxDB.create({/* ... */}); -``` - -You now do - -```typescript -import { createRxDatabase, addRxPlugin } from 'rxdb'; -addRxPlugin(/* ... */); -await createRxDatabase({/* ... */}); -``` - -Also `removeDatabase()` is renamed to `removeRxDatabase()` and `plugin()` is now `addRxPlugin()`. - -Same goes for all previous default exports of the plugins. - -### Indexes are specified at the top level of the schema definition - -[related issue](https://github.com/pubkey/rxdb/issues/1655) - -In the past the indexes of a collection had to be specified at the field level of the schema like - -```json -{ - "firstName": { - "type": "string", - "index": true - } -} -``` - -This made it complex to list up the index fields which had a bad performance on startup. -To fix this the indexes are now specified at the top level of the schema like - -```json -{ - "title": "my schema", - "version": 0, - "type": "object", - "properties": {}, - "indexes": [ - "firstName", - ["compound", "index"] - ] -} -``` - -### Encrypted fields at the top level of the schema - -Same as the indexes, encrypted fields are now also defined in the top level like - -```json -{ - "title": "my schema", - "version": 0, - "type": "object", - "properties": {}, - "encrypted": [ - "password" - ] -} -``` - -### New dev-mode plugin - -In the past we had stuff that is only wanted for development in the two plugins `error-messages` and `schema-check`. - -Now we have a single plugin `dev-mode` that contains all these checks and development helper functions. I also moved many other checks out of the core-module into dev-mode. - -```typescript -import { RxDBDevModePlugin } from 'rxdb/plugins/dev-mode'; -addRxPlugin(RxDBDevModePlugin); -``` - -### New migration plugin - -The data migration was not used by all users of this project. Often it was easier to just wipe the local data store and let the client sync everything from the server. Because the migration has so much code, it is now in a separate plugin so that you do not have to ship this code to the clients if not necessary. - -```typescript -import { RxDBMigrationPlugin } from 'rxdb/plugins/migration'; -addRxPlugin(RxDBMigrationPlugin); -``` - -### Rewritten key-compression - -The key-compression logic was fully coded only for RxDB. This was a problem because it was not usable for other stuff and also badly tested. We had a known problem with nested arrays that caused much confusion because some queries did not find the correct documents. - -I now created a npm-package [jsonschema-key-compression](https://github.com/pubkey/jsonschema-key-compression) that has cleaner code, better tests and can also be used for non-RxDB stuff. - -If you used the key-compression in the past and have clients out there with old data, you have to find a way to migrate that data by using the json-import or other solutions depending on your project. - -### Rewritten query-change-detection to event-reduce - -One big benefit of having a [realtime database](../articles/realtime-database.md) is that big performance optimizations can be done when the database knows a query is observed and the updated results are needed continuously. In the past this optimization was done by the internal `queryChangeDetection` which was a big tree of if-else-statements that hopefully worked. This was also the reason why queryChangeDetection was in beta mode and not enabled by default. - -After months of research and testing I was able to create [Event-Reduce: An algorithm to optimize database queries that run multiple times](https://github.com/pubkey/event-reduce). This JavaScript module contains an algorithm that is able to optimize realtime queries in a way that was not possible before. The algorithm is not RxDB specific and also heavily tested. - -Instead of setting `queryChangeDetection` when creating a `RxDatabase`, you now set `eventReduce` which defaults to `true`. - -### find() and findOne() now accepts the full mango query - -In the past, only the selector of a query could be passed to `find()` and `findOne()` if you wanted to also do `sort`, `skip` or `limit`, you had to call additional functions like - -```typescript -const query = myRxCollection.find({ - age: { - $gt: 10 - } -}).sort('name').skip(5).limit(10); -``` - -Now you can pass the full query to the function call like - -```typescript -const query = myRxCollection.find({ - selector: { - age: { - $gt: 10 - } - }, - sort: [{name: 'asc'}], - skip: 5, - limit: 10 -}); -``` - -### moved query builder to own plugin - -The query builder that allowed to create queries like `.where('foo').eq('bar')` etc. was not really used by many people. Most of the time it is better to just pass the full query as simple json object. Also the code for the query builder was big and increased the build size much more than its value added. Only some edge-cases where recursive query modification was needed made the query builder useful. If you still want to use the query builder, you have to import the plugin. - -```typescript -import { RxDBQueryBuilderPlugin } from 'rxdb/plugins/query-builder'; -addRxPlugin(RxDBQueryBuilderPlugin); -``` -### Refactored RxChangeEvent - -The whole data structure of `RxChangeEvent` was way more complicated than it had to be. I refactored the whole class to be more simple. If you directly use `RxChangeEvent` in your project you have to adapt to these changes. Also the stream of `RxDatabase().$` will no longer emit the `COLLECTION` event when a new collection is created. - -### Internal hash() is now using a salt - -The internal hash function was used to store hashes of database passwords to compare them and directly throw errors when the wrong password was used with an existing data set. This was dangerous because you could use rainbow tables or even [just google](https://www.google.com/search?q=e5e9fa1ba31ecd1ae84f75caaa474f3a663f05f4) the hash to find out the plain password. So now the internal hashing is using a salt to prevent these attacks. If you have used the encryption in the past, you have to migrate your internal schema storage. - -### Changed default of RxDocument.toJSON() - -By default `RxDocument.toJSON()` always returned also the `_rev` field and the `_attachments`. This was confusing behavior which is why I changed the default to `RxDocument().toJSON(withRevAndAttachments = false)` - -### Typescript 3.8.0 or newer is required - -Because RxDB and some subdependencies extensively use `export type ...` you now need typescript `3.8.0` or newer. - -### GraphQL replication will run a schema validation of incoming data -In dev-mode, the GraphQL-replication will run a schema validation of each document that comes from the server before it is saved to the database. - -## Internal and other changes - -I refactored much internal stuff and moved much code out of the core into the specific plugins. - -* Renamed `RxSchema.jsonID` to `RxSchema.jsonSchema` -* Moved remaining stuff of leader-election from core into the plugin -* Merged multiple internal databases for metadata into one `internalStore` -* Removed many runtime type checks that now should be covered by typescript in buildtime -* The GraphQL replication is now out of beta mode -* Removed documentation examples for `require()` CommonJS loading -* Removed `RxCollection.docChanges$()` because all events are from the docs - -## Help wanted - -RxDB is an open source project an heavily relies on the contribution of its users. There are some things that must be done, but I have no time for them. - -### Refactor data-migrator - -The current implementation has some flaws and should be completely rewritten. - -* It does not use pouchdb's bulkDocs which is much faster -* It could have been written without rxjs and with less code that is easier to understand -* It does not migrate the revisions of documents which causes a problem when replication is used - -### Add e2e tests to the react example - -The [react example](https://github.com/pubkey/rxdb/tree/master/examples/react) has no end-to-end tests which is why the CI does not ensure that it works all the time. We should add some basic tests like we did for the other example projects. - -### Fix pouchdb bug so we can upgrade pouchdb-find - -There is a [bug in pouchdb](https://github.com/pouchdb/pouchdb/issues/7810) that prevents the upgrade of `pouchdb-find`. This is why RxDB relies on an old version of `pouchdb-find` that also requires different sub-dependencies. This increases the build size a lot because for example we ship multiple version of `spark-md5` and others. - -## About the future of RxDB - -At the moment RxDB is a realtime database based on pouchdb. In the future I want RxDB to be a wrapper around pull-based databases that also works with other source-dbs like mongoDB or PostgreSQL. As a start I defined the `RxStorage` interface and created a `RxStoragePouchdb` class that implements it and contains all pouchdb-specific logic. I want to move every direct storage usage into that interface so that later we can create other implementations of it for other source databases. diff --git a/docs/replication-appwrite.html b/docs/replication-appwrite.html deleted file mode 100644 index 7e164e662bd..00000000000 --- a/docs/replication-appwrite.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - -Appwrite Realtime Sync for Local-First Apps | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxDB Appwrite Replication

    -

    This replication plugin allows you to synchronize documents between RxDB and an Appwrite server. It supports both push and pull replication, live updates via Appwrite's real-time subscriptions, offline-capability and conflict resolution.

    -
    -
    Appwrite in 100 Seconds
    2:35
    Appwrite in 100 Seconds
    -

    Why you should use RxDB with Appwrite?

    -

    Appwrite is a secure, open-source backend server that simplifies backend tasks like user authentication, storage, database management, and real-time APIs.
    -RxDB is a reactive database for the frontend that offers offline-first capabilities and rich client-side data handling.

    -

    Combining the two provides several benefits:

    -
      -
    1. -

      Offline-First: RxDB keeps all data locally, so your application remains fully functional even when the network is unavailable. When connectivity returns, the RxDB ↔ Appwrite replication automatically resolves and synchronizes changes.

      -
    2. -
    3. -

      Real-Time Sync: With Appwrite’s real-time subscriptions and RxDB’s live replication, you can build collaborative features that update across all clients instantaneously.

      -
    4. -
    5. -

      Conflict Handling: RxDB offers flexible conflict resolution strategies, making it simpler to handle concurrent edits across multiple users or devices.

      -
    6. -
    7. -

      Scalable & Secure: Appwrite is built to handle production loads with granular access controls, while RxDB easily scales across various storage backends on the client side.

      -
    8. -
    9. -

      Simplicity & Modularity: RxDB’s plugin-based architecture, combined with Appwrite’s Cloud offering makes it one of the easiest way to build local-first realtime apps that scale.

      -
    10. -
    -
    -
    -
    Client A
    Client B
    Client C
    -

    Preparing the Appwrite Server

    -

    You can either use the appwrite cloud or self-host the Appwrite server. In this tutorial we use the Cloud which is recommended for beginners because it is way easier to set up. You can later decide to self-host if needed.

    -
    1

    Set up an Appwrite Endpoint and Project

    1
    Docker

    Ensure docker and docker-compose is installed and your version are up to date:

    docker-compose -v
    2
    Run the installation script

    The installation script runs inside of a docker container. It will create a docker-compose file and an .env file.

    docker run -it --rm \
    -    --volume /var/run/docker.sock:/var/run/docker.sock \
    -    --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
    -    --entrypoint="install" \
    -    appwrite/appwrite:1.6.1
    3
    Start/Stop

    After the installation is done, you can manually stop and start the appwrite instance with docker compose:

    # stop
    -docker-compose down
    - 
    -# start
    -docker-compose up
    2

    Create an Appwrite Database and Collection

    After creating an Appwrite project you have to create an Appwrite Database and a collection, you can either do this in code with the node-appwrite SDK or in the Appwrite Console as shown in this video:

    Appwrite Database Tutorial
    9:47
    Appwrite Database Tutorial

    3

    Add your documents attributes

    In the appwrite collection, create all attributes of your documents. You have to define all the fields that your document in your RxDB schema knows about. Notice that Appwrite does not allow for nested attributes. So when you use RxDB with Appwrite, you should also not have nested attributes in your RxDB schema.

    4

    Add a deleted attribute

    Appwrite (natively) hard-deletes documents. But for offline-handling RxDB needs soft-deleted documents on the server so that the deletion state can be replicated with other clients.

    In RxDB, _deleted indicates that a document is removed locally and you need a similar field in your Appwrite collection on the Server: You must define a deletedField with any name to mark documents as "deleted" in the remote collection. Mostly you would use a boolean field named deleted (set it to required). The plugin will treat any document with { [deletedField]: true } as deleted and replicate that state to local RxDB.

    5

    Set the Permission on the Appwrite Collection

    Appwrite uses permissions to control data access on the collection level. Make sure that in the Console at Collection -> Settings -> Permissions you have set the permission according to what you want to allow your clients to do. For testing, just enable all of them (Create, Read, Update and Delete).

    -

    Setting up the RxDB - Appwrite Replication

    -

    Now that we have set up the Appwrite server, we can go to the client side code and set up RxDB and the replication:

    -
    1

    Install the Appwrite SDK and RxDB:

    npm install appwrite rxdb
    2

    Import the Appwrite SDK and RxDB

    import {
    -    replicateAppwrite
    -} from 'rxdb/plugins/replication-appwrite';
    -import {
    -    createRxDatabase,
    -    addRxPlugin,
    -    RxCollection
    -} from 'rxdb/plugins/core';
    -import {
    -    getRxStorageLocalstorage
    -} from 'rxdb/plugins/storage-localstorage';
    - 
    -import { Client } from 'appwrite';
    3

    Create a Database with a Collection

    const db = await createRxDatabase({
    -    name: 'mydb',
    -    storage: getRxStorageLocalstorage()
    -});
    -const mySchema = {
    -    title: 'my schema',
    -    version: 0,
    -    primaryKey: 'id',
    -    type: 'object',
    -    properties: {
    -        id: {
    -            type: 'string',
    -            maxLength: 100
    -        },
    -        name: {
    -            type: 'string'
    -        }
    -    },
    -    required: ['id', 'name']
    -};
    -await db.addCollections({
    -    humans: {
    -        schema: mySchema
    -    }
    -});
    -const collection = db.humans;
    4

    Configure the Appwrite Client

    const client = new Client();
    -client.setEndpoint('https://cloud.appwrite.io/v1');
    -client.setProject('YOUR_APPWRITE_PROJECT_ID');
    5

    Start the Replication

    const replicationState = replicateAppwrite({
    -    replicationIdentifier: 'my-appwrite-replication',
    -    client,
    -    databaseId: 'YOUR_APPWRITE_DATABASE_ID',
    -    collectionId: 'YOUR_APPWRITE_COLLECTION_ID',
    -    deletedField: 'deleted', // Field that represents deletion in Appwrite
    -    collection,
    -    pull: {
    -        batchSize: 10,
    -    },
    -    push: {
    -        batchSize: 10
    -    },
    -    /*
    -     * ...
    -     * You can set all other options for RxDB replication states
    -     * like 'live' or 'retryTime'
    -     * ...
    -     */
    -});
    6

    Do other things with the replication state

    The RxAppwriteReplicationState which is returned from replicateAppwrite() allows you to run all functionality of the normal RxReplicationState.

    -

    Appwrite Sync

    -

    Limitations of the Appwrite Replication Plugin

    -
      -
    • Appwrite primary keys only allow for the characters a-z, A-Z, 0-9, and underscore _ (They cannot start with a leading underscore). Also the primary key has a max length of 36 characters.
    • -
    • The Appwrite replication only works on browsers. This is because the Appwrite SDK does not support subscriptions in Node.js.
    • -
    • Appwrite does not allow for bulk write operations so on push one HTTP request will be made per document. Reads run in bulk so this is mostly not a problem.
    • -
    • Appwrite does not allow for transactions or "update-if" calls which can lead to overwriting documents instead of properly handling conflicts when multiple clients edit the same document in parallel. This is not a problem for inserts because "insert-if-not" calls are made.
    • -
    • Nested attributes in Appwrite collections are only possible via experimental relationship attributes, and compatibility with RxDB is not tested. Users opting to use these experimental relationship attributes with RxDB do so at their own risk.
    • -
    - - \ No newline at end of file diff --git a/docs/replication-appwrite.md b/docs/replication-appwrite.md deleted file mode 100644 index 2660a81ceb1..00000000000 --- a/docs/replication-appwrite.md +++ /dev/null @@ -1,247 +0,0 @@ -# Appwrite Realtime Sync for Local-First Apps - -> Sync RxDB with Appwrite for local-first apps. Supports real-time updates, offline mode, conflict resolution, and secure push/pull replication. - -import {Tabs} from '@site/src/components/tabs'; -import {Steps} from '@site/src/components/steps'; -import {VideoBox} from '@site/src/components/video-box'; -import {RxdbMongoDiagramPlain} from '@site/src/components/mongodb-sync'; - -# RxDB Appwrite Replication - -This replication plugin allows you to synchronize documents between RxDB and an Appwrite server. It supports both push and pull replication, live updates via Appwrite's real-time subscriptions, [offline-capability](./offline-first.md) and [conflict resolution](./transactions-conflicts-revisions.md). - -
    - -
    - -## Why you should use RxDB with Appwrite? - -**Appwrite** is a secure, open-source backend server that simplifies backend tasks like user authentication, storage, database management, and real-time APIs. -**RxDB** is a reactive database for the frontend that offers offline-first capabilities and rich client-side data handling. - -Combining the two provides several benefits: - -1. [Offline-First](./offline-first.md): RxDB keeps all data locally, so your application remains fully functional even when the network is unavailable. When connectivity returns, the RxDB ↔ Appwrite replication automatically resolves and synchronizes changes. - -2. **Real-Time Sync**: With Appwrite’s real-time subscriptions and RxDB’s live replication, you can build collaborative features that update across all clients instantaneously. - -3. [Conflict Handling](./transactions-conflicts-revisions.md): RxDB offers flexible conflict resolution strategies, making it simpler to handle concurrent edits across multiple users or devices. - -4. **Scalable & Secure**: Appwrite is built to handle production loads with granular access controls, while RxDB easily scales across various storage backends on the client side. - -5. **Simplicity & Modularity**: RxDB’s plugin-based architecture, combined with Appwrite’s Cloud offering makes it one of the easiest way to build local-first [realtime apps](./articles/realtime-database.md) that scale. - - - -## Preparing the Appwrite Server - -You can either use the appwrite cloud or self-host the Appwrite server. In this tutorial we use the Cloud which is recommended for beginners because it is way easier to set up. You can later decide to self-host if needed. - - - -### Set up an Appwrite Endpoint and Project - - - -#### Self-Hosted - - - -##### Docker - -Ensure docker and docker-compose is installed and your version are up to date: - -```bash -docker-compose -v -``` - -##### Run the installation script - -The installation script runs inside of a docker container. It will create a docker-compose file and an `.env` file. - -```bash -docker run -it --rm \ - --volume /var/run/docker.sock:/var/run/docker.sock \ - --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \ - --entrypoint="install" \ - appwrite/appwrite:1.6.1 -``` - -##### Start/Stop - -After the installation is done, you can manually stop and start the appwrite instance with docker compose: - -```bash -# stop -docker-compose down - -# start -docker-compose up -``` - - - -#### Appwrite Cloud - - - -##### Create a Cloud Account - -Got to the Appwrite Console, create an account and login. - -#### Create a Project - -At the console click the `+ Create Project` button to create a new project. Remember the `project-id` which will be used later. - - - - - -### Create an Appwrite Database and Collection - -After creating an Appwrite project you have to create an Appwrite Database and a collection, you can either do this in code with the node-appwrite SDK or in the Appwrite Console as shown in this video: - -
    - -
    - -### Add your documents attributes - -In the appwrite collection, create all attributes of your documents. You have to define all the fields that your document in your [RxDB schema](./rx-schema.md) knows about. Notice that Appwrite does not allow for nested attributes. So when you use RxDB with Appwrite, you should also not have nested attributes in your RxDB schema. - -### Add a `deleted` attribute - -Appwrite (natively) hard-deletes documents. But for offline-handling RxDB needs soft-deleted documents on the server so that the deletion state can be replicated with other clients. - -In RxDB, `_deleted` indicates that a document is removed locally and you need a similar field in your Appwrite collection on the Server: You must define a deletedField with any name to mark documents as "deleted" in the remote collection. Mostly you would use a boolean field named `deleted` (set it to `required`). The plugin will treat any document with `{ [deletedField]: true }` as deleted and replicate that state to local RxDB. - -### Set the Permission on the Appwrite Collection - -Appwrite uses permissions to control data access on the collection level. Make sure that in the Console at `Collection -> Settings -> Permissions` you have set the permission according to what you want to allow your clients to do. For testing, just enable all of them (Create, Read, Update and Delete). - -
    - -## Setting up the RxDB - Appwrite Replication - -Now that we have set up the Appwrite server, we can go to the client side code and set up RxDB and the replication: - - - -### Install the Appwrite SDK and RxDB: - -```bash -npm install appwrite rxdb -``` - -### Import the Appwrite SDK and RxDB - -```ts -import { - replicateAppwrite -} from 'rxdb/plugins/replication-appwrite'; -import { - createRxDatabase, - addRxPlugin, - RxCollection -} from 'rxdb/plugins/core'; -import { - getRxStorageLocalstorage -} from 'rxdb/plugins/storage-localstorage'; - -import { Client } from 'appwrite'; -``` - -### Create a Database with a Collection - -```ts -const db = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage() -}); -const mySchema = { - title: 'my schema', - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 - }, - name: { - type: 'string' - } - }, - required: ['id', 'name'] -}; -await db.addCollections({ - humans: { - schema: mySchema - } -}); -const collection = db.humans; -``` - -### Configure the Appwrite Client - - - -#### Appwrite Cloud - -```ts -const client = new Client(); -client.setEndpoint('https://cloud.appwrite.io/v1'); -client.setProject('YOUR_APPWRITE_PROJECT_ID'); -``` - -#### Self-Hosted - -```ts -const client = new Client(); -client.setEndpoint('http://localhost/v1'); -client.setProject('YOUR_APPWRITE_PROJECT_ID'); -``` - - - -### Start the Replication - -```ts -const replicationState = replicateAppwrite({ - replicationIdentifier: 'my-appwrite-replication', - client, - databaseId: 'YOUR_APPWRITE_DATABASE_ID', - collectionId: 'YOUR_APPWRITE_COLLECTION_ID', - deletedField: 'deleted', // Field that represents deletion in Appwrite - collection, - pull: { - batchSize: 10, - }, - push: { - batchSize: 10 - }, - /* - * ... - * You can set all other options for RxDB replication states - * like 'live' or 'retryTime' - * ... - */ -}); -``` - -### Do other things with the replication state - -The `RxAppwriteReplicationState` which is returned from `replicateAppwrite()` allows you to run all functionality of the normal [RxReplicationState](./replication.md). - - - - - -## Limitations of the Appwrite Replication Plugin - -- Appwrite primary keys only allow for the characters `a-z`, `A-Z`, `0-9`, and underscore `_` (They cannot start with a leading underscore). Also the primary key has a max length of 36 characters. -- The Appwrite replication **only works on browsers**. This is because the Appwrite SDK does not support subscriptions in Node.js. -- Appwrite does not allow for bulk write operations so on push one HTTP request will be made per document. Reads run in bulk so this is mostly not a problem. -- Appwrite does not allow for transactions or "update-if" calls which can lead to overwriting documents instead of properly handling [conflicts](./transactions-conflicts-revisions.md#conflicts) when multiple clients edit the same document in parallel. This is not a problem for inserts because "insert-if-not" calls are made. -- Nested attributes in Appwrite collections are only possible via experimental relationship attributes, and compatibility with RxDB is not tested. Users opting to use these experimental relationship attributes with RxDB do so at their own risk. diff --git a/docs/replication-couchdb.html b/docs/replication-couchdb.html deleted file mode 100644 index ea5dbf6d012..00000000000 --- a/docs/replication-couchdb.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - -RxDB's CouchDB Replication Plugin | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Replication with CouchDB

    -

    A plugin to replicate between a RxCollection and a CouchDB server.

    -

    This plugins uses the RxDB Sync Engine to replicate with a CouchDB endpoint. This plugin does NOT use the official CouchDB replication protocol because the CouchDB protocol was optimized for server-to-server replication and is not suitable for fast client side applications, mostly because it has to run many HTTP-requests (at least one per document) and also it has to store the whole revision tree of the documents at the client. This makes initial replication and querying very slow.

    -

    Because the way how RxDB handles revisions and documents is very similar to CouchDB, using the RxDB replication with a CouchDB endpoint is pretty straightforward.

    -

    Pros

    -
      -
    • Faster initial replication.
    • -
    • Works with any RxStorage, not just PouchDB.
    • -
    • Easier conflict handling because conflicts are handled during replication and not afterwards.
    • -
    • Does not have to store all document revisions on the client, only stores the newest version.
    • -
    -

    Cons

    -
      -
    • Does not support the replication of attachments.
    • -
    • Like all CouchDB replication plugins, this one is also limited to replicating 6 collections in parallel. Read this for workarounds
    • -
    -

    Usage

    -

    Start the replication via replicateCouchDB().

    -
    import { replicateCouchDB } from 'rxdb/plugins/replication-couchdb';
    - 
    -const replicationState = replicateCouchDB(
    -    {
    -        replicationIdentifier: 'my-couchdb-replication',
    -        collection: myRxCollection,
    -        // url to the CouchDB endpoint (required)
    -        url: 'http://example.com/db/humans',
    -        /**
    -         * true for live replication,
    -        * false for a one-time replication.
    -        * [default=true]
    -        */
    -        live: true,
    -        /**
    -         * A custom fetch() method can be provided
    -         * to add authentication or credentials.
    -         * Can be swapped out dynamically
    -         * by running 'replicationState.fetch = newFetchMethod;'.
    -         * (optional)
    -         */
    -        fetch: myCustomFetchMethod,
    -        pull: {
    -            /**
    -             * Amount of documents to be fetched in one HTTP request
    -             * (optional)
    -             */
    -            batchSize: 60,
    -            /**
    -             * Custom modifier to mutate pulled documents
    -             * before storing them in RxDB.
    -             * (optional)
    -             */
    -            modifier: docData => {/* ... */}, 
    -            /**
    -             * Heartbeat time in milliseconds
    -             * for the long polling of the changestream.
    -             * @link https://docs.couchdb.org/en/3.2.2-docs/api/database/changes.html
    -             * (optional, default=60000)
    -             */
    -            heartbeat: 60000
    -        },
    -        push: {
    -            /**
    -             * How many local changes to process at once.
    -             * (optional)
    -             */
    -            batchSize: 60,
    -            /**
    -             * Custom modifier to mutate documents
    -             * before sending them to the CouchDB endpoint.
    -             * (optional)
    -             */
    -            modifier: docData => {/* ... */} 
    -        }
    -    }
    -);
    -

    When you call replicateCouchDB() it returns a RxCouchDBReplicationState which can be used to subscribe to events, for debugging or other functions. It extends the RxReplicationState so any other method that can be used there can also be used on the CouchDB replication state.

    -

    Conflict handling

    -

    When conflicts appear during replication, the conflictHandler of the RxCollection is used, equal to the other replication plugins. Read more about conflict handling here.

    -

    Auth example

    -

    Lets say for authentication you need to add a bearer token as HTTP header to each request. You can achieve that by crafting a custom fetch() method that add the header field.

    -
     
    -const myCustomFetch = (url, options) => {
    - 
    -    // flat clone the given options to not mutate the input
    -    const optionsWithAuth = Object.assign({}, options);
    -    // ensure the headers property exists
    -    if(!optionsWithAuth.headers) {
    -        optionsWithAuth.headers = {};
    -    }
    -    // add bearer token to headers
    -    optionsWithAuth.headers['Authorization'] ='Basic S0VLU0UhIExFQ0...';
    - 
    -    // call the original fetch function with our custom options.
    -    return fetch(
    -        url,
    -        optionsWithAuth
    -    );
    -};
    - 
    -const replicationState = replicateCouchDB(
    -    {
    -        replicationIdentifier: 'my-couchdb-replication',
    -        collection: myRxCollection,
    -        url: 'http://example.com/db/humans',
    -        /**
    -         * Add the custom fetch function here.
    -         */
    -        fetch: myCustomFetch,
    -        pull: {},
    -        push: {}
    -    }
    -);
    -

    Also when your bearer token changes over time, you can set a new custom fetch method while the replication is running:

    -
    replicationState.fetch = newCustomFetchMethod;
    -

    Also there is a helper method getFetchWithCouchDBAuthorization() to create a fetch handler with authorization:

    -
     
    -import { 
    -    replicateCouchDB,
    -    getFetchWithCouchDBAuthorization
    -} from 'rxdb/plugins/replication-couchdb';
    - 
    -const replicationState = replicateCouchDB(
    -    {
    -        replicationIdentifier: 'my-couchdb-replication',
    -        collection: myRxCollection,
    -        url: 'http://example.com/db/humans',
    -        /**
    -         * Add the custom fetch function here.
    -         */
    -        fetch: getFetchWithCouchDBAuthorization('myUsername', 'myPassword'),
    -        pull: {},
    -        push: {}
    -    }
    -);
    -

    Limitations

    -

    Since CouchDB only allows synchronization through HTTP1.1 long polling requests there is a limitation of 6 active synchronization connections before the browser prevents sending any further request. This limitation is at the level of browser per tab per domain (some browser, especially older ones, might have a different limit, see here).

    -

    Since this limitation is at the browser level there are several solutions:

    -
      -
    • Use only a single database for all entities and set a "type" field for each of the documents
    • -
    • Create multiple subdomains for CouchDB and use a max of 6 active synchronizations (or less) for each
    • -
    • Use a proxy (ex: HAProxy) between the browser and CouchDB and configure it to use HTTP2.0, since HTTP2.0
    • -
    -

    If you use nginx in front of your CouchDB, you can use these settings to enable http2-proxying to prevent the connection limit problem:

    -
    server {
    -    http2 on;
    -    location /db {
    -        rewrite /db/(.*) /$1 break;
    -        proxy_pass http://172.0.0.1:5984;
    -        proxy_redirect off;
    -        proxy_buffering off;
    -        proxy_set_header Host            $host;
    -        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded
    -        proxy_set_header Connection "keep_alive"
    -    }
    -}
    -
    -

    Known problems

    -

    Database missing

    -

    In contrast to PouchDB, this plugin does NOT automatically create missing CouchDB databases. -If your CouchDB server does not have a database yet, you have to create it by yourself by running a PUT request to the database name url:

    -
    // create a 'humans' CouchDB database on the server
    -const remoteDatabaseName = 'humans';
    -await fetch(
    -    'http://example.com/db/' + remoteDatabaseName,
    -    {
    -        method: 'PUT'
    -    }
    -);
    -

    React Native

    -

    React Native does not have a global fetch method. You have to import fetch method with the cross-fetch package:

    -
    import crossFetch from 'cross-fetch';
    -const replicationState = replicateCouchDB(
    -    {
    -        replicationIdentifier: 'my-couchdb-replication',
    -        collection: myRxCollection,
    -        url: 'http://example.com/db/humans',
    -        fetch: crossFetch,
    -        pull: {},
    -        push: {}
    -    }
    -);
    - - \ No newline at end of file diff --git a/docs/replication-couchdb.md b/docs/replication-couchdb.md deleted file mode 100644 index 3991b2042ba..00000000000 --- a/docs/replication-couchdb.md +++ /dev/null @@ -1,223 +0,0 @@ -# RxDB's CouchDB Replication Plugin - -> Replicate your RxDB collections with CouchDB the fast way. Enjoy faster sync, easier conflict handling, and flexible storage using this modern plugin. - -# Replication with CouchDB - -A plugin to replicate between a RxCollection and a CouchDB server. - -This plugins uses the RxDB [Sync Engine](./replication.md) to replicate with a CouchDB endpoint. This plugin **does NOT** use the official [CouchDB replication protocol](https://docs.couchdb.org/en/stable/replication/protocol.html) because the CouchDB protocol was optimized for server-to-server replication and is not suitable for fast client side applications, mostly because it has to run many HTTP-requests (at least one per document) and also it has to store the whole revision tree of the documents at the client. This makes initial replication and querying very slow. - -Because the way how RxDB handles revisions and documents is very similar to CouchDB, using the RxDB replication with a CouchDB endpoint is pretty straightforward. - -## Pros - -- Faster initial replication. -- Works with any [RxStorage](./rx-storage.md), not just PouchDB. -- Easier conflict handling because conflicts are handled during replication and not afterwards. -- Does not have to store all document revisions on the client, only stores the newest version. - -## Cons - -- Does not support the replication of [attachments](./rx-attachment.md). -- Like all CouchDB replication plugins, this one is also limited to replicating 6 collections in parallel. [Read this for workarounds](./replication-couchdb.md#limitations) - -## Usage - -Start the replication via `replicateCouchDB()`. - -```ts -import { replicateCouchDB } from 'rxdb/plugins/replication-couchdb'; - -const replicationState = replicateCouchDB( - { - replicationIdentifier: 'my-couchdb-replication', - collection: myRxCollection, - // url to the CouchDB endpoint (required) - url: 'http://example.com/db/humans', - /** - * true for live replication, - * false for a one-time replication. - * [default=true] - */ - live: true, - /** - * A custom fetch() method can be provided - * to add authentication or credentials. - * Can be swapped out dynamically - * by running 'replicationState.fetch = newFetchMethod;'. - * (optional) - */ - fetch: myCustomFetchMethod, - pull: { - /** - * Amount of documents to be fetched in one HTTP request - * (optional) - */ - batchSize: 60, - /** - * Custom modifier to mutate pulled documents - * before storing them in RxDB. - * (optional) - */ - modifier: docData => {/* ... */}, - /** - * Heartbeat time in milliseconds - * for the long polling of the changestream. - * @link https://docs.couchdb.org/en/3.2.2-docs/api/database/changes.html - * (optional, default=60000) - */ - heartbeat: 60000 - }, - push: { - /** - * How many local changes to process at once. - * (optional) - */ - batchSize: 60, - /** - * Custom modifier to mutate documents - * before sending them to the CouchDB endpoint. - * (optional) - */ - modifier: docData => {/* ... */} - } - } -); -``` - -When you call `replicateCouchDB()` it returns a `RxCouchDBReplicationState` which can be used to subscribe to events, for debugging or other functions. It extends the [RxReplicationState](./replication.md) so any other method that can be used there can also be used on the CouchDB replication state. - -## Conflict handling - -When conflicts appear during replication, the `conflictHandler` of the `RxCollection` is used, equal to the other replication plugins. Read more about conflict handling [here](./replication.md#conflict-handling). - -## Auth example - -Lets say for authentication you need to add a [bearer token](https://swagger.io/docs/specification/authentication/bearer-authentication/) as HTTP header to each request. You can achieve that by crafting a custom `fetch()` method that add the header field. - -```ts - -const myCustomFetch = (url, options) => { - - // flat clone the given options to not mutate the input - const optionsWithAuth = Object.assign({}, options); - // ensure the headers property exists - if(!optionsWithAuth.headers) { - optionsWithAuth.headers = {}; - } - // add bearer token to headers - optionsWithAuth.headers['Authorization'] ='Basic S0VLU0UhIExFQ0...'; - - // call the original fetch function with our custom options. - return fetch( - url, - optionsWithAuth - ); -}; - -const replicationState = replicateCouchDB( - { - replicationIdentifier: 'my-couchdb-replication', - collection: myRxCollection, - url: 'http://example.com/db/humans', - /** - * Add the custom fetch function here. - */ - fetch: myCustomFetch, - pull: {}, - push: {} - } -); -``` - -Also when your bearer token changes over time, you can set a new custom `fetch` method while the replication is running: - -```ts -replicationState.fetch = newCustomFetchMethod; -``` - -Also there is a helper method `getFetchWithCouchDBAuthorization()` to create a fetch handler with authorization: - -```ts - -import { - replicateCouchDB, - getFetchWithCouchDBAuthorization -} from 'rxdb/plugins/replication-couchdb'; - -const replicationState = replicateCouchDB( - { - replicationIdentifier: 'my-couchdb-replication', - collection: myRxCollection, - url: 'http://example.com/db/humans', - /** - * Add the custom fetch function here. - */ - fetch: getFetchWithCouchDBAuthorization('myUsername', 'myPassword'), - pull: {}, - push: {} - } -); -``` - -## Limitations - -Since CouchDB only allows synchronization through HTTP1.1 long polling requests there is a limitation of 6 active synchronization connections before the browser prevents sending any further request. This limitation is at the level of browser per tab per domain (some browser, especially older ones, might have a different limit, [see here](https://docs.pushtechnology.com/cloud/latest/manual/html/designguide/solution/support/connection_limitations.html)). - -Since this limitation is at the **browser** level there are several solutions: - - Use only a single database for all entities and set a "type" field for each of the documents - - Create multiple subdomains for CouchDB and use a max of 6 active synchronizations (or less) for each - - Use a proxy (ex: HAProxy) between the browser and CouchDB and configure it to use HTTP2.0, since HTTP2.0 - -If you use nginx in front of your CouchDB, you can use these settings to enable http2-proxying to prevent the connection limit problem: -``` -server { - http2 on; - location /db { - rewrite /db/(.*) /$1 break; - proxy_pass http://172.0.0.1:5984; - proxy_redirect off; - proxy_buffering off; - proxy_set_header Host $host; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded - proxy_set_header Connection "keep_alive" - } -} -``` - -## Known problems - -### Database missing - -In contrast to PouchDB, this plugin **does NOT** automatically create missing CouchDB databases. -If your CouchDB server does not have a database yet, you have to create it by yourself by running a `PUT` request to the database `name` url: - -```ts -// create a 'humans' CouchDB database on the server -const remoteDatabaseName = 'humans'; -await fetch( - 'http://example.com/db/' + remoteDatabaseName, - { - method: 'PUT' - } -); -``` - -## React Native - -React Native does not have a global `fetch` method. You have to import fetch method with the [cross-fetch](https://www.npmjs.com/package/cross-fetch) package: - -```ts -import crossFetch from 'cross-fetch'; -const replicationState = replicateCouchDB( - { - replicationIdentifier: 'my-couchdb-replication', - collection: myRxCollection, - url: 'http://example.com/db/humans', - fetch: crossFetch, - pull: {}, - push: {} - } -); -``` diff --git a/docs/replication-firestore.html b/docs/replication-firestore.html deleted file mode 100644 index e90c26712c1..00000000000 --- a/docs/replication-firestore.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - -Smooth Firestore Sync for Offline Apps | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Replication with Firestore from Firebase

    -

    With the replication-firestore plugin you can do a two-way realtime replication -between your client side RxDB Database and a Cloud Firestore database that is hosted on the Firebase platform. It will use the RxDB Sync Engine to manage the replication streams, error- and conflict handling.

    -

    Firebase

    -

    Replicating your Firestore state to RxDB can bring multiple benefits compared to using the Firestore directly:

    -
      -
    • It can reduce your cloud fees because your queries run against the local state of the documents without touching a server and writes can be batched up locally and send to the backend in bulks. This is mostly the case for read heavy applications.
    • -
    • You can run complex NoSQL queries on your documents because you are not bound to the Firestore Query handling. You can also use local indexes, compression and encryption and do things like fulltext search, fully locally.
    • -
    • Your application can be truly Offline-First because your data is stored in a client side database. In contrast Firestore by itself only provides options to support offline also which more works like a cache and requires the user to be online at application start to run authentication.
    • -
    • It reduces the vendor lock in because you can switch out the backend server afterwards without having to rebuild big parts of the application. RxDB supports replication plugins with multiple technologies and it is even easy to set up with your custom backend.
    • -
    • You can use sophisticated conflict resolution strategies so you are not bound to the Firestore last-write-wins strategy which is not suitable for many applications.
    • -
    • The initial load time of your application can be decreased because it will do an incremental replication on restarts.
    • -
    -

    Usage

    -
    1

    Install the firebase package

    npm install firebase
    2

    Initialize your Firestore Database

    import * as firebase from 'firebase/app';
    -import {
    -    getFirestore,
    -    collection
    -} from 'firebase/firestore';
    - 
    -const projectId = 'my-project-id';
    -const app = firebase.initializeApp({
    -    projectId,
    -    databaseURL: 'http://localhost:8080?ns=' + projectId,
    -    /* ... */
    -});
    -const firestoreDatabase = getFirestore(app);
    -const firestoreCollection = collection(firestoreDatabase, 'my-collection-name');
    3

    Start the Replication

    Start the replication by calling replicateFirestore() on your RxCollection.

    const replicationState = replicateFirestore({
    -    replicationIdentifier: `https://firestore.googleapis.com/${projectId}`,
    -    collection: myRxCollection,
    -    firestore: {
    -        projectId,
    -        database: firestoreDatabase,
    -        collection: firestoreCollection
    -    },
    -    /**
    -     * (required) Enable push and pull replication with firestore by
    -     * providing an object with optional filter
    -     * for each type of replication desired.
    -     * [default=disabled]
    -     */
    -    pull: {},
    -    push: {},
    -    /**
    -     * Either do a live or a one-time replication
    -     * [default=true]
    -     */
    -    live: true,
    -    /**
    -     * (optional) likely you should just use the default.
    -     *
    -     * In firestore it is not possible to read out
    -     * the internally used write timestamp of a document.
    -     * Even if we could read it out, it is not indexed which
    -     * is required for fetch 'changes-since-x'.
    -     * So instead we have to rely on a custom user defined field
    -     * that contains the server time
    -     * which is set by firestore via serverTimestamp()
    -     * Notice that the serverTimestampField MUST NOT be
    -     * part of the collections RxJsonSchema!
    -     * [default='serverTimestamp']
    -     */
    -    serverTimestampField: 'serverTimestamp'
    -});

    To observe and cancel the replication, you can use any other methods from the ReplicationState like error$, cancel() and awaitInitialReplication().

    -

    Handling deletes

    -

    RxDB requires you to never fully delete documents. This is needed to be able to replicate the deletion state of a document to other instances. The firestore replication will set a boolean _deleted field to all documents to indicate the deletion state. You can change this by setting a different deletedField in the sync options.

    -

    Do not set enableIndexedDbPersistence()

    -

    Firestore has the enableIndexedDbPersistence() feature which caches document states locally to IndexedDB. This is not needed when you replicate your Firestore with RxDB because RxDB itself will store the data locally already.

    -

    Using the replication with an already existing Firestore Database State

    -

    If you have not used RxDB before and you already have documents inside of your Firestore database, you have -to manually set the _deleted field to false and the serverTimestamp to all existing documents.

    -
    import {
    -    getDocs,
    -    query,
    -    serverTimestamp
    -} from 'firebase/firestore';
    -const allDocsResult = await getDocs(query(firestoreCollection));
    -allDocsResult.forEach(doc => {
    -    doc.update({
    -        _deleted: false,
    -        serverTimestamp: serverTimestamp()
    -    })
    -});
    -

    Also notice that if you do writes from non-RxDB applications, you have to keep these fields in sync. It is recommended to use the Firestore triggers to ensure that.

    -

    Filtered Replication

    -

    You might need to replicate only a subset of your collection, either to or from Firestore. You can achieve this using push.filter and pull.filter options.

    -
    const replicationState = replicateFirestore(
    -    {
    -        collection: myRxCollection,
    -        firestore: {
    -            projectId,
    -            database: firestoreDatabase,
    -            collection: firestoreCollection
    -        },
    -        pull: {
    -            filter: [
    -                where('ownerId', '==', userId)
    -            ]
    -        },
    -        push: {
    -            filter: (item) => item.syncEnabled === true
    -        }
    -    }
    -);
    -

    Keep in mind that you can not use inequality operators (<, <=, !=, not-in, >, or >=) in pull.filter since that would cause a conflict with ordering by serverTimestamp.

    - - \ No newline at end of file diff --git a/docs/replication-firestore.md b/docs/replication-firestore.md deleted file mode 100644 index 7471ee50310..00000000000 --- a/docs/replication-firestore.md +++ /dev/null @@ -1,154 +0,0 @@ -# Smooth Firestore Sync for Offline Apps - -> Leverage RxDB to enable real-time, offline-first replication with Firestore. Cut cloud costs, resolve conflicts, and speed up your app. - -import {Steps} from '@site/src/components/steps'; - -# Replication with Firestore from Firebase - -With the `replication-firestore` plugin you can do a two-way realtime replication -between your client side [RxDB](./) Database and a [Cloud Firestore](https://firebase.google.com/docs/firestore) database that is hosted on the Firebase platform. It will use the [RxDB Sync Engine](./replication.md) to manage the replication streams, error- and conflict handling. - - - -Replicating your Firestore state to RxDB can bring multiple benefits compared to using the Firestore directly: -- It can reduce your cloud fees because your queries run against the local state of the documents without touching a server and writes can be batched up locally and send to the backend in bulks. This is mostly the case for read heavy applications. -- You can run complex [NoSQL queries](./why-nosql.md) on your documents because you are not bound to the [Firestore Query](https://firebase.google.com/docs/firestore/query-data/queries) handling. You can also use local indexes, [compression](./key-compression.md) and [encryption](./encryption.md) and do things like fulltext search, fully locally. -- Your application can be truly [Offline-First](./offline-first.md) because your data is stored in a client side database. In contrast Firestore by itself only provides options to support [offline also](https://cloud.google.com/firestore/docs/manage-data/enable-offline) which more works like a cache and requires the user to be online at application start to run authentication. -- It reduces the vendor lock in because you can switch out the backend server afterwards without having to rebuild big parts of the application. RxDB supports replication plugins with multiple technologies and it is even easy to set up with your [custom backend](./replication.md). -- You can use sophisticated [conflict resolution strategies](./replication.md#conflict-handling) so you are not bound to the Firestore [last-write-wins](https://stackoverflow.com/a/47781502/3443137) strategy which is not suitable for many applications. -- The initial load time of your application can be decreased because it will do an incremental replication on restarts. - -## Usage - - - -### Install the firebase package - -```bash -npm install firebase -``` - -### Initialize your Firestore Database - -```ts -import * as firebase from 'firebase/app'; -import { - getFirestore, - collection -} from 'firebase/firestore'; - -const projectId = 'my-project-id'; -const app = firebase.initializeApp({ - projectId, - databaseURL: 'http://localhost:8080?ns=' + projectId, - /* ... */ -}); -const firestoreDatabase = getFirestore(app); -const firestoreCollection = collection(firestoreDatabase, 'my-collection-name'); -``` - -### Start the Replication - -Start the replication by calling `replicateFirestore()` on your [RxCollection](./rx-collection.md). - -```ts -const replicationState = replicateFirestore({ - replicationIdentifier: `https://firestore.googleapis.com/${projectId}`, - collection: myRxCollection, - firestore: { - projectId, - database: firestoreDatabase, - collection: firestoreCollection - }, - /** - * (required) Enable push and pull replication with firestore by - * providing an object with optional filter - * for each type of replication desired. - * [default=disabled] - */ - pull: {}, - push: {}, - /** - * Either do a live or a one-time replication - * [default=true] - */ - live: true, - /** - * (optional) likely you should just use the default. - * - * In firestore it is not possible to read out - * the internally used write timestamp of a document. - * Even if we could read it out, it is not indexed which - * is required for fetch 'changes-since-x'. - * So instead we have to rely on a custom user defined field - * that contains the server time - * which is set by firestore via serverTimestamp() - * Notice that the serverTimestampField MUST NOT be - * part of the collections RxJsonSchema! - * [default='serverTimestamp'] - */ - serverTimestampField: 'serverTimestamp' -}); -``` - -To observe and cancel the replication, you can use any other methods from the [ReplicationState](./replication.md) like `error$`, `cancel()` and `awaitInitialReplication()`. - - - -## Handling deletes - -RxDB requires you to never [fully delete documents](./replication.md#data-layout-on-the-server). This is needed to be able to replicate the deletion state of a document to other instances. The firestore replication will set a boolean `_deleted` field to all documents to indicate the deletion state. You can change this by setting a different `deletedField` in the sync options. - -## Do not set `enableIndexedDbPersistence()` - -Firestore has the `enableIndexedDbPersistence()` feature which caches document states locally to IndexedDB. This is not needed when you replicate your Firestore with RxDB because RxDB itself will store the data locally already. - -## Using the replication with an already existing Firestore Database State - -If you have not used RxDB before and you already have documents inside of your Firestore database, you have -to manually set the `_deleted` field to `false` and the `serverTimestamp` to all existing documents. - -```ts -import { - getDocs, - query, - serverTimestamp -} from 'firebase/firestore'; -const allDocsResult = await getDocs(query(firestoreCollection)); -allDocsResult.forEach(doc => { - doc.update({ - _deleted: false, - serverTimestamp: serverTimestamp() - }) -}); -``` - -Also notice that if you do writes from non-RxDB applications, you have to keep these fields in sync. It is recommended to use the [Firestore triggers](https://firebase.google.com/docs/functions/firestore-events) to ensure that. - -## Filtered Replication - -You might need to replicate only a subset of your collection, either to or from Firestore. You can achieve this using `push.filter` and `pull.filter` options. - -```ts -const replicationState = replicateFirestore( - { - collection: myRxCollection, - firestore: { - projectId, - database: firestoreDatabase, - collection: firestoreCollection - }, - pull: { - filter: [ - where('ownerId', '==', userId) - ] - }, - push: { - filter: (item) => item.syncEnabled === true - } - } -); -``` - -Keep in mind that you can not use inequality operators `(<, <=, !=, not-in, >, or >=)` in `pull.filter` since that would cause a conflict with ordering by `serverTimestamp`. diff --git a/docs/replication-graphql.html b/docs/replication-graphql.html deleted file mode 100644 index 7561e3bcd54..00000000000 --- a/docs/replication-graphql.html +++ /dev/null @@ -1,445 +0,0 @@ - - - - - -GraphQL Replication | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Replication with GraphQL

    -

    The GraphQL replication provides handlers for GraphQL to run replication with GraphQL as the transportation layer.

    -

    The GraphQL replication is mostly used when you already have a backend that exposes a GraphQL API that can be adjusted to serve as a replication endpoint. If you do not already have a GraphQL endpoint, using the HTTP replication is an easier solution.

    -
    note

    To play around, check out the full example of the RxDB GraphQL replication with server and client

    -

    Usage

    -

    Before you use the GraphQL replication, make sure you've learned how the RxDB replication works.

    -

    Creating a compatible GraphQL Server

    -

    At the server-side, there must exist an endpoint which returns newer rows when the last checkpoint is used as input. For example lets say you create a Query pullHuman which returns a list of document writes that happened after the given checkpoint.

    -

    For the push-replication, you also need a Mutation pushHuman which lets RxDB update data of documents by sending the previous document state and the new client document state. -Also for being able to stream all ongoing events, we need a Subscription called streamHuman.

    -
    input HumanInput {
    -    id: ID!,
    -    name: String!,
    -    lastName: String!,
    -    updatedAt: Float!,
    -    deleted: Boolean!
    -}
    -type Human {
    -    id: ID!,
    -    name: String!,
    -    lastName: String!,
    -    updatedAt: Float!,
    -    deleted: Boolean!
    -}
    -input Checkpoint {
    -    id: String!,
    -    updatedAt: Float!
    -}
    -type HumanPullBulk {
    -    documents: [Human]!
    -    checkpoint: Checkpoint
    -}
    - 
    -type Query {
    -    pullHuman(checkpoint: Checkpoint, limit: Int!): HumanPullBulk!
    -}
    - 
    -input HumanInputPushRow {
    -    assumedMasterState: HeroInputPushRowT0AssumedMasterStateT0
    -    newDocumentState: HeroInputPushRowT0NewDocumentStateT0!
    -}
    - 
    -type Mutation {
    -    # Returns a list of all conflicts
    -    # If no document write caused a conflict, return an empty list.
    -    pushHuman(rows: [HumanInputPushRow!]): [Human]
    -}
    - 
    -# headers are used to authenticate the subscriptions
    -# over websockets.
    -input Headers {
    -    AUTH_TOKEN: String!;
    -}
    -type Subscription {
    -    streamHuman(headers: Headers): HumanPullBulk!
    -}
    - 
    -

    The GraphQL resolver for the pullHuman would then look like:

    -
    const rootValue = {
    -    pullHuman: args => {
    -        const minId = args.checkpoint ? args.checkpoint.id : '';
    -        const minUpdatedAt = args.checkpoint ? args.checkpoint.updatedAt : 0;
    - 
    -        // sorted by updatedAt first and the id as second
    -        const sortedDocuments = documents.sort((a, b) => {
    -            if (a.updatedAt > b.updatedAt) return 1;
    -            if (a.updatedAt < b.updatedAt) return -1;
    -            if (a.updatedAt === b.updatedAt) {
    -                if (a.id > b.id) return 1;
    -                if (a.id < b.id) return -1;
    -            else return 0;
    -            }
    -        });
    - 
    -        // only return documents newer than the input document
    -        const filterForMinUpdatedAtAndId = sortedDocuments.filter(doc => {
    -            if (doc.updatedAt < minUpdatedAt) return false;
    -            if (doc.updatedAt > minUpdatedAt) return true;
    -            if (doc.updatedAt === minUpdatedAt) {
    -                // if updatedAt is equal, compare by id
    -                if (doc.id > minId) return true;
    -                else return false;
    -            }
    -        });
    - 
    -        // only return some documents in one batch
    -        const limitedDocs = filterForMinUpdatedAtAndId.slice(0, args.limit);
    - 
    -        // use the last document for the checkpoint
    -        const lastDoc = limitedDocs[limitedDocs.length - 1];
    -        const retCheckpoint = {
    -            id: lastDoc.id,
    -            updatedAt: lastDoc.updatedAt
    -        }
    - 
    -        return {
    -            documents: limitedDocs,
    -            checkpoint: retCheckpoint
    -        }
    - 
    -        return limited;
    -    }
    -}
    -

    For examples for the other resolvers, consult the GraphQL Example Project.

    -

    RxDB Client

    -

    Pull replication

    -

    For the pull-replication, you first need a pullQueryBuilder. This is a function that gets the last replication checkpoint and a limit as input and returns an object with a GraphQL-query and its variables (or a promise that resolves to the same object). RxDB will use the query builder to construct what is later sent to the GraphQL endpoint.

    -
    const pullQueryBuilder = (checkpoint, limit) => {
    -    /**
    -     * The first pull does not have a checkpoint
    -     * so we fill it up with defaults
    -     */
    -    if (!checkpoint) {
    -        checkpoint = {
    -            id: '',
    -            updatedAt: 0
    -        };
    -    }
    -    const query = `query PullHuman($checkpoint: CheckpointInput, $limit: Int!) {
    -        pullHuman(checkpoint: $checkpoint, limit: $limit) {
    -            documents {
    -                id
    -                name
    -                age
    -                updatedAt
    -                deleted
    -            }
    -            checkpoint {
    -                id
    -                updatedAt
    -            }
    -        }
    -    }`;
    -    return {
    -        query,
    -        operationName: 'PullHuman',
    -        variables: {
    -            checkpoint,
    -            limit
    -        }
    -    };
    -};
    -

    With the queryBuilder, you can then setup the pull-replication.

    -
    import { replicateGraphQL } from 'rxdb/plugins/replication-graphql';
    -const replicationState = replicateGraphQL(
    -    {
    -        collection: myRxCollection,
    -        // urls to the GraphQL endpoints
    -        url: {
    -            http: 'http://example.com/graphql'
    -        },
    -        pull: {
    -            queryBuilder: pullQueryBuilder, // the queryBuilder from above
    -            modifier: doc => doc, // (optional) modifies all pulled documents before they are handled by RxDB
    -            dataPath: undefined, // (optional) specifies the object path to access the document(s). Otherwise, the first result of the response data is used.
    -            /**
    -             * Amount of documents that the remote will send in one request.
    -             * If the response contains less than [batchSize] documents,
    -             * RxDB will assume there are no more changes on the backend
    -             * that are not replicated.
    -             * This value is the same as the limit in the pullHuman() schema.
    -             * [default=100]
    -             */
    -            batchSize: 50
    -        },
    -        // headers which will be used in http requests against the server.
    -        headers: {
    -            Authorization: 'Bearer abcde...'
    -        },
    - 
    -        /**
    -         * Options that have been inherited from the RxReplication
    -         */
    -        deletedField: 'deleted',
    -        live: true,
    -        retryTime = 1000 * 5,
    -        waitForLeadership = true,
    -        autoStart = true,
    -    }
    -);
    -

    Push replication

    -

    For the push-replication, you also need a queryBuilder. Here, the builder receives a changed document as input which has to be send to the server. It also returns a GraphQL-Query and its data.

    -
    const pushQueryBuilder = rows => {
    -    const query = `
    -    mutation PushHuman($writeRows: [HumanInputPushRow!]) {
    -        pushHuman(writeRows: $writeRows) {
    -            id
    -            name
    -            age
    -            updatedAt
    -            deleted
    -        }
    -    }
    -    `;
    -    const variables = {
    -        writeRows: rows
    -    };
    -    return {
    -        query,
    -        operationName: 'PushHuman',
    -        variables
    -    };
    -};
    -

    With the queryBuilder, you can then setup the push-replication.

    -
    const replicationState = replicateGraphQL(
    -    {
    -        collection: myRxCollection,
    -        // urls to the GraphQL endpoints
    -        url: {
    -            http: 'http://example.com/graphql'
    -        },
    -        push: {
    -            queryBuilder: pushQueryBuilder, // the queryBuilder from above
    -            /**
    -             * batchSize (optional)
    -             * Amount of document that will be pushed to the server in a single request.
    -             */
    -            batchSize: 5,
    -            /**
    -             * modifier (optional)
    -             * Modifies all pushed documents before they are send to the GraphQL endpoint.
    -             * Returning null will skip the document.
    -             */
    -            modifier: doc => doc
    -        },
    -        headers: {
    -            Authorization: 'Bearer abcde...'
    -        },
    -        pull: {
    -            /* ... */
    -        },
    -        /* ... */
    -    }
    -);
    -

    Pull Stream

    -

    To create a realtime replication, you need to create a pull stream that pulls ongoing writes from the server. -The pull stream gets the headers of the RxReplicationState as input, so that it can be authenticated on the backend.

    -
    const pullStreamQueryBuilder = (headers) => {
    -    const query = `subscription onStream($headers: Headers) {
    -        streamHero(headers: $headers) {
    -            documents {
    -                id,
    -                name,
    -                age,
    -                updatedAt,
    -                deleted
    -            },
    -            checkpoint {
    -                id
    -                updatedAt
    -            }
    -        }
    -    }`;
    -    return {
    -        query,
    -        variables: {
    -            headers
    -        }
    -    };
    -};
    -

    With the pullStreamQueryBuilder you can then start a realtime replication.

    -
    const replicationState = replicateGraphQL(
    -    {
    -        collection: myRxCollection,
    -        // urls to the GraphQL endpoints
    -        url: {
    -            http: 'http://example.com/graphql',
    -            ws: 'ws://example.com/subscriptions' // <- The websocket has to use a different url.
    -        },
    -        push: {
    -            batchSize: 100,
    -            queryBuilder: pushQueryBuilder
    -        },
    -        headers: {
    -            Authorization: 'Bearer abcde...'
    -        },
    -        pull: {
    -            batchSize: 100,
    -            queryBuilder: pullQueryBuilder,
    -            streamQueryBuilder: pullStreamQueryBuilder,
    -            includeWsHeaders: false, // Includes headers as connection parameter to Websocket.
    - 
    -            // Websocket options that can be passed as a parameter to initialize the subscription
    -            // Can be applied anything from the graphql-ws ClientOptions - https://the-guild.dev/graphql/ws/docs/interfaces/client.ClientOptions
    -            // Except these parameters: 'url', 'shouldRetry', 'webSocketImpl' - locked for internal usage
    -            // Note: if you provide connectionParams as a wsOption, make sure it returns any necessary headers (e.g. authorization)
    -            // because providing your own connectionParams prevents headers from being included automatically
    -            wsOptions: { 
    -                retryAttempts: 10,
    -            }
    -        },
    -        deletedField: 'deleted'
    -    }
    -);
    -
    note

    If it is not possible to create a websocket server on your backend, you can use any other method of pull out the ongoing events from the backend and then you can send them into RxReplicationState.emitEvent().

    -

    Transforming null to undefined in optional fields

    -

    GraphQL fills up non-existent optional values with null while RxDB required them to be undefined. -Therefore, if your schema contains optional properties, you have to transform the pulled data to switch out null to undefined

    -
    const replicationState: RxGraphQLReplicationState<RxDocType> = replicateGraphQL(
    -    {
    -        collection: myRxCollection,
    -        url: {/* ... */},
    -        headers: {/* ... */},
    -        push: {/* ... */},
    -        pull: {
    -            queryBuilder: pullQueryBuilder,
    -            modifier: (doc => {
    -                // We have to remove optional non-existent field values
    -                // they are set as null by GraphQL but should be undefined
    -                Object.entries(doc).forEach(([k, v]) => {
    -                    if (v === null) {
    -                        delete doc[k];
    -                    }
    -                });
    -                return doc;
    -            })
    -        },
    -        /* ... */
    -    }
    -);
    -

    pull.responseModifier

    -

    With the pull.responseModifier you can modify the whole response from the GraphQL endpoint before it is processed by RxDB. -For example if your endpoint is not capable of returning a valid checkpoint, but instead only returns the plain document array, you can use the responseModifier to aggregate the checkpoint from the returned documents.

    -
    import {
    - 
    -} from 'rxdb';
    -const replicationState: RxGraphQLReplicationState<RxDocType> = replicateGraphQL(
    -    {
    -        collection: myRxCollection,
    -        url: {/* ... */},
    -        headers: {/* ... */},
    -        push: {/* ... */},
    -        pull: {
    -            responseModifier: async function(
    -                plainResponse, // the exact response that was returned from the server
    -                origin, // either 'handler' if plainResponse came from the pull.handler, or 'stream' if it came from the pull.stream
    -                requestCheckpoint // if origin==='handler', the requestCheckpoint contains the checkpoint that was send to the backend
    -            ) {
    -                /**
    -                 * In this example we aggregate the checkpoint from the documents array
    -                 * that was returned from the graphql endpoint.
    -                 */
    -                const docs = plainResponse;
    -                return {
    -                    documents: docs,
    -                    checkpoint: docs.length === 0 ? requestCheckpoint : {
    -                        name: lastOfArray(docs).name,
    -                        updatedAt: lastOfArray(docs).updatedAt
    -                    }
    -                };
    -            }
    -        },
    -        /* ... */
    -    }
    -);
    -

    push.responseModifier

    -

    It's also possible to modify the response of a push mutation. For example if your server returns more than the just conflicting docs:

    -
    type PushResponse {
    -    conflicts: [Human]
    -    conflictMessages: [ReplicationConflictMessage]
    -}
    - 
    -type Mutation {
    -    # Returns a PushResponse type that contains the conflicts along with other information
    -    pushHuman(rows: [HumanInputPushRow!]): PushResponse!
    -}
    -
    import {} from "rxdb";
    -const replicationState: RxGraphQLReplicationState<RxDocType> = replicateGraphQL(
    -    {
    -        collection: myRxCollection,
    -        url: {/* ... */},
    -        headers: {/* ... */},
    -        push: {
    -            responseModifier: async function (plainResponse) {
    -                /**
    -                 * In this example we aggregate the conflicting documents from a response object
    -                 */
    -                return plainResponse.conflicts;
    -            },
    -        },
    -        pull: {/* ... */},
    -        /* ... */
    -    }
    -);
    -

    Helper Functions

    -

    RxDB provides the helper functions graphQLSchemaFromRxSchema(), pullQueryBuilderFromRxSchema(), pullStreamBuilderFromRxSchema() and pushQueryBuilderFromRxSchema() that can be used to generate handlers and schemas from the RxJsonSchema. To learn how to use them, please inspect the GraphQL Example.

    -

    RxGraphQLReplicationState

    -

    When you call myCollection.syncGraphQL() it returns a RxGraphQLReplicationState which can be used to subscribe to events, for debugging or other functions. It extends the RxReplicationState with some GraphQL specific methods.

    -

    .setHeaders()

    -

    Changes the headers for the replication after it has been set up.

    -
    replicationState.setHeaders({
    -    Authorization: `...`
    -});
    -

    Sending Cookies

    -

    The underlying fetch framework uses a same-origin policy for credentials per default. That means, cookies and session data is only shared if you backend and frontend run on the same domain and port. Pass the credential parameter to include cookies in requests to servers from different origins via:

    -
    replicationState.setCredentials('include');
    -

    or directly pass it in the replicateGraphQL function:

    -
    replicateGraphQL(
    -    {
    -        collection: myRxCollection,
    -        /* ... */
    -        credentials: 'include',
    -        /* ... */
    -    }
    -);
    -

    See the fetch spec for more information about available options.

    -
    note

    To play around, check out the full example of the RxDB GraphQL replication with server and client

    - - \ No newline at end of file diff --git a/docs/replication-graphql.md b/docs/replication-graphql.md deleted file mode 100644 index 1236fb009d6..00000000000 --- a/docs/replication-graphql.md +++ /dev/null @@ -1,499 +0,0 @@ -# GraphQL Replication - -> The GraphQL replication provides handlers for GraphQL to run [replication](./replication.md) with GraphQL as the transportation layer. - -# Replication with GraphQL - -The GraphQL replication provides handlers for GraphQL to run [replication](./replication.md) with GraphQL as the transportation layer. - -The GraphQL replication is mostly used when you already have a backend that exposes a GraphQL API that can be adjusted to serve as a replication endpoint. If you do not already have a GraphQL endpoint, using the [HTTP replication](./replication-http.md) is an easier solution. - -:::note -To play around, check out the full example of the RxDB [GraphQL replication with server and client](https://github.com/pubkey/rxdb/tree/master/examples/graphql) -::: - -## Usage - -Before you use the GraphQL replication, make sure you've learned how the [RxDB replication](./replication.md) works. - -### Creating a compatible GraphQL Server - -At the server-side, there must exist an endpoint which returns newer rows when the last `checkpoint` is used as input. For example lets say you create a `Query` `pullHuman` which returns a list of document writes that happened after the given checkpoint. - -For the push-replication, you also need a `Mutation` `pushHuman` which lets RxDB update data of documents by sending the previous document state and the new client document state. -Also for being able to stream all ongoing events, we need a `Subscription` called `streamHuman`. - -```graphql -input HumanInput { - id: ID!, - name: String!, - lastName: String!, - updatedAt: Float!, - deleted: Boolean! -} -type Human { - id: ID!, - name: String!, - lastName: String!, - updatedAt: Float!, - deleted: Boolean! -} -input Checkpoint { - id: String!, - updatedAt: Float! -} -type HumanPullBulk { - documents: [Human]! - checkpoint: Checkpoint -} - -type Query { - pullHuman(checkpoint: Checkpoint, limit: Int!): HumanPullBulk! -} - -input HumanInputPushRow { - assumedMasterState: HeroInputPushRowT0AssumedMasterStateT0 - newDocumentState: HeroInputPushRowT0NewDocumentStateT0! -} - -type Mutation { - # Returns a list of all conflicts - # If no document write caused a conflict, return an empty list. - pushHuman(rows: [HumanInputPushRow!]): [Human] -} - -# headers are used to authenticate the subscriptions -# over websockets. -input Headers { - AUTH_TOKEN: String!; -} -type Subscription { - streamHuman(headers: Headers): HumanPullBulk! -} - -``` - -The GraphQL resolver for the `pullHuman` would then look like: - -```js -const rootValue = { - pullHuman: args => { - const minId = args.checkpoint ? args.checkpoint.id : ''; - const minUpdatedAt = args.checkpoint ? args.checkpoint.updatedAt : 0; - - // sorted by updatedAt first and the id as second - const sortedDocuments = documents.sort((a, b) => { - if (a.updatedAt > b.updatedAt) return 1; - if (a.updatedAt < b.updatedAt) return -1; - if (a.updatedAt === b.updatedAt) { - if (a.id > b.id) return 1; - if (a.id < b.id) return -1; - else return 0; - } - }); - - // only return documents newer than the input document - const filterForMinUpdatedAtAndId = sortedDocuments.filter(doc => { - if (doc.updatedAt < minUpdatedAt) return false; - if (doc.updatedAt > minUpdatedAt) return true; - if (doc.updatedAt === minUpdatedAt) { - // if updatedAt is equal, compare by id - if (doc.id > minId) return true; - else return false; - } - }); - - // only return some documents in one batch - const limitedDocs = filterForMinUpdatedAtAndId.slice(0, args.limit); - - // use the last document for the checkpoint - const lastDoc = limitedDocs[limitedDocs.length - 1]; - const retCheckpoint = { - id: lastDoc.id, - updatedAt: lastDoc.updatedAt - } - - return { - documents: limitedDocs, - checkpoint: retCheckpoint - } - - return limited; - } -} -``` - -For examples for the other resolvers, consult the [GraphQL Example Project](https://github.com/pubkey/rxdb/blob/master/examples/graphql/server/index.js). - -### RxDB Client - -#### Pull replication - -For the pull-replication, you first need a `pullQueryBuilder`. This is a function that gets the last replication `checkpoint` and a `limit` as input and returns an object with a GraphQL-query and its variables (or a promise that resolves to the same object). RxDB will use the query builder to construct what is later sent to the GraphQL endpoint. - -```js -const pullQueryBuilder = (checkpoint, limit) => { - /** - * The first pull does not have a checkpoint - * so we fill it up with defaults - */ - if (!checkpoint) { - checkpoint = { - id: '', - updatedAt: 0 - }; - } - const query = `query PullHuman($checkpoint: CheckpointInput, $limit: Int!) { - pullHuman(checkpoint: $checkpoint, limit: $limit) { - documents { - id - name - age - updatedAt - deleted - } - checkpoint { - id - updatedAt - } - } - }`; - return { - query, - operationName: 'PullHuman', - variables: { - checkpoint, - limit - } - }; -}; -``` - -With the queryBuilder, you can then setup the pull-replication. - -```js -import { replicateGraphQL } from 'rxdb/plugins/replication-graphql'; -const replicationState = replicateGraphQL( - { - collection: myRxCollection, - // urls to the GraphQL endpoints - url: { - http: 'http://example.com/graphql' - }, - pull: { - queryBuilder: pullQueryBuilder, // the queryBuilder from above - modifier: doc => doc, // (optional) modifies all pulled documents before they are handled by RxDB - dataPath: undefined, // (optional) specifies the object path to access the document(s). Otherwise, the first result of the response data is used. - /** - * Amount of documents that the remote will send in one request. - * If the response contains less than [batchSize] documents, - * RxDB will assume there are no more changes on the backend - * that are not replicated. - * This value is the same as the limit in the pullHuman() schema. - * [default=100] - */ - batchSize: 50 - }, - // headers which will be used in http requests against the server. - headers: { - Authorization: 'Bearer abcde...' - }, - - /** - * Options that have been inherited from the RxReplication - */ - deletedField: 'deleted', - live: true, - retryTime = 1000 * 5, - waitForLeadership = true, - autoStart = true, - } -); -``` - -#### Push replication - -For the push-replication, you also need a `queryBuilder`. Here, the builder receives a changed document as input which has to be send to the server. It also returns a GraphQL-Query and its data. - -```js -const pushQueryBuilder = rows => { - const query = ` - mutation PushHuman($writeRows: [HumanInputPushRow!]) { - pushHuman(writeRows: $writeRows) { - id - name - age - updatedAt - deleted - } - } - `; - const variables = { - writeRows: rows - }; - return { - query, - operationName: 'PushHuman', - variables - }; -}; -``` - -With the queryBuilder, you can then setup the push-replication. - -```js -const replicationState = replicateGraphQL( - { - collection: myRxCollection, - // urls to the GraphQL endpoints - url: { - http: 'http://example.com/graphql' - }, - push: { - queryBuilder: pushQueryBuilder, // the queryBuilder from above - /** - * batchSize (optional) - * Amount of document that will be pushed to the server in a single request. - */ - batchSize: 5, - /** - * modifier (optional) - * Modifies all pushed documents before they are send to the GraphQL endpoint. - * Returning null will skip the document. - */ - modifier: doc => doc - }, - headers: { - Authorization: 'Bearer abcde...' - }, - pull: { - /* ... */ - }, - /* ... */ - } -); -``` - -#### Pull Stream - -To create a **realtime** replication, you need to create a pull stream that pulls ongoing writes from the server. -The pull stream gets the `headers` of the `RxReplicationState` as input, so that it can be authenticated on the backend. - -```js -const pullStreamQueryBuilder = (headers) => { - const query = `subscription onStream($headers: Headers) { - streamHero(headers: $headers) { - documents { - id, - name, - age, - updatedAt, - deleted - }, - checkpoint { - id - updatedAt - } - } - }`; - return { - query, - variables: { - headers - } - }; -}; -``` - -With the `pullStreamQueryBuilder` you can then start a realtime replication. - -```js -const replicationState = replicateGraphQL( - { - collection: myRxCollection, - // urls to the GraphQL endpoints - url: { - http: 'http://example.com/graphql', - ws: 'ws://example.com/subscriptions' // <- The websocket has to use a different url. - }, - push: { - batchSize: 100, - queryBuilder: pushQueryBuilder - }, - headers: { - Authorization: 'Bearer abcde...' - }, - pull: { - batchSize: 100, - queryBuilder: pullQueryBuilder, - streamQueryBuilder: pullStreamQueryBuilder, - includeWsHeaders: false, // Includes headers as connection parameter to Websocket. - - // Websocket options that can be passed as a parameter to initialize the subscription - // Can be applied anything from the graphql-ws ClientOptions - https://the-guild.dev/graphql/ws/docs/interfaces/client.ClientOptions - // Except these parameters: 'url', 'shouldRetry', 'webSocketImpl' - locked for internal usage - // Note: if you provide connectionParams as a wsOption, make sure it returns any necessary headers (e.g. authorization) - // because providing your own connectionParams prevents headers from being included automatically - wsOptions: { - retryAttempts: 10, - } - }, - deletedField: 'deleted' - } -); -``` - -:::note -If it is not possible to create a websocket server on your backend, you can use any other method of pull out the ongoing events from the backend and then you can send them into `RxReplicationState.emitEvent()`. -::: - -### Transforming null to undefined in optional fields - -GraphQL fills up non-existent optional values with `null` while RxDB required them to be `undefined`. -Therefore, if your schema contains optional properties, you have to transform the pulled data to switch out `null` to `undefined` -```js -const replicationState: RxGraphQLReplicationState = replicateGraphQL( - { - collection: myRxCollection, - url: {/* ... */}, - headers: {/* ... */}, - push: {/* ... */}, - pull: { - queryBuilder: pullQueryBuilder, - modifier: (doc => { - // We have to remove optional non-existent field values - // they are set as null by GraphQL but should be undefined - Object.entries(doc).forEach(([k, v]) => { - if (v === null) { - delete doc[k]; - } - }); - return doc; - }) - }, - /* ... */ - } -); -``` - -### pull.responseModifier - -With the `pull.responseModifier` you can modify the whole response from the GraphQL endpoint **before** it is processed by RxDB. -For example if your endpoint is not capable of returning a valid checkpoint, but instead only returns the plain document array, you can use the `responseModifier` to aggregate the checkpoint from the returned documents. - -```ts -import { - -} from 'rxdb'; -const replicationState: RxGraphQLReplicationState = replicateGraphQL( - { - collection: myRxCollection, - url: {/* ... */}, - headers: {/* ... */}, - push: {/* ... */}, - pull: { - responseModifier: async function( - plainResponse, // the exact response that was returned from the server - origin, // either 'handler' if plainResponse came from the pull.handler, or 'stream' if it came from the pull.stream - requestCheckpoint // if origin==='handler', the requestCheckpoint contains the checkpoint that was send to the backend - ) { - /** - * In this example we aggregate the checkpoint from the documents array - * that was returned from the graphql endpoint. - */ - const docs = plainResponse; - return { - documents: docs, - checkpoint: docs.length === 0 ? requestCheckpoint : { - name: lastOfArray(docs).name, - updatedAt: lastOfArray(docs).updatedAt - } - }; - } - }, - /* ... */ - } -); -``` - -### push.responseModifier - -It's also possible to modify the response of a push mutation. For example if your server returns more than the just conflicting docs: - -```graphql -type PushResponse { - conflicts: [Human] - conflictMessages: [ReplicationConflictMessage] -} - -type Mutation { - # Returns a PushResponse type that contains the conflicts along with other information - pushHuman(rows: [HumanInputPushRow!]): PushResponse! -} -``` - -```ts -import {} from "rxdb"; -const replicationState: RxGraphQLReplicationState = replicateGraphQL( - { - collection: myRxCollection, - url: {/* ... */}, - headers: {/* ... */}, - push: { - responseModifier: async function (plainResponse) { - /** - * In this example we aggregate the conflicting documents from a response object - */ - return plainResponse.conflicts; - }, - }, - pull: {/* ... */}, - /* ... */ - } -); -``` - -#### Helper Functions - -RxDB provides the helper functions `graphQLSchemaFromRxSchema()`, `pullQueryBuilderFromRxSchema()`, `pullStreamBuilderFromRxSchema()` and `pushQueryBuilderFromRxSchema()` that can be used to generate handlers and schemas from the `RxJsonSchema`. To learn how to use them, please inspect the [GraphQL Example](https://github.com/pubkey/rxdb/tree/master/examples/graphql). - -### RxGraphQLReplicationState - -When you call `myCollection.syncGraphQL()` it returns a `RxGraphQLReplicationState` which can be used to subscribe to events, for debugging or other functions. It extends the [RxReplicationState](./replication.md) with some GraphQL specific methods. - -#### .setHeaders() - -Changes the headers for the replication after it has been set up. - -```js -replicationState.setHeaders({ - Authorization: `...` -}); -``` - -#### Sending Cookies - -The underlying fetch framework uses a `same-origin` policy for credentials per default. That means, cookies and session data is only shared if you backend and frontend run on the same domain and port. Pass the credential parameter to `include` cookies in requests to servers from different origins via: - -```js -replicationState.setCredentials('include'); -``` - -or directly pass it in the `replicateGraphQL` function: - -```js -replicateGraphQL( - { - collection: myRxCollection, - /* ... */ - credentials: 'include', - /* ... */ - } -); -``` - -See [the fetch spec](https://fetch.spec.whatwg.org/#concept-request-credentials-mode) for more information about available options. - -:::note -To play around, check out the full example of the RxDB [GraphQL replication with server and client](https://github.com/pubkey/rxdb/tree/master/examples/graphql) -::: diff --git a/docs/replication-http.html b/docs/replication-http.html deleted file mode 100644 index be773d646f0..00000000000 --- a/docs/replication-http.html +++ /dev/null @@ -1,237 +0,0 @@ - - - - - -HTTP Replication | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    HTTP Replication from a custom server to RxDB clients

    -

    While RxDB has a range of backend-specific replication plugins (like GraphQL or Firestore), the replication is build in a way to make it very easy to replicate data from a custom server to RxDB clients.

    -

    HTTP replication

    -

    Using HTTP as a transport protocol makes it simple to create a compatible backend on top of your existing infrastructure. For events that must be sent from the server to the client, we can use Server Send Events.

    -

    In this tutorial we will implement a HTTP replication between an RxDB client and a MongoDB express server. You can adapt this for any other backend database technology like PostgreSQL or even a non-Node.js server like go or java.

    -

    To create a compatible server for replication, we will start a server and implement the correct HTTP routes and replication handlers. We need a push-handler, a pull-handler and for the ongoing changes pull.stream we use Server Send Events.

    -

    Setup

    -
    1

    Start the Replication on the RxDB Client

    RxDB does not have a specific HTTP-replication plugin because the replication primitives plugin is simple enough to start a HTTP replication on top of it. -We import the replicateRxCollection function and start the replication from there for a single RxCollection.

    // > client.ts
    -import { replicateRxCollection } from 'rxdb/plugins/replication';
    -const replicationState = await replicateRxCollection({
    -    collection: myRxCollection,
    -    replicationIdentifier: 'my-http-replication',
    -    push: { /* add settings from below */ },
    -    pull: { /* add settings from below */ }
    -});
    2

    Start a Node.js process with Express and MongoDB

    On the server side, we start an express server that has a MongoDB connection and serves the HTTP requests of the client.

    // > server.ts
    -import { MongoClient } from 'mongodb';
    -import express from 'express';
    -const mongoClient = new MongoClient('mongodb://localhost:27017/');
    -const mongoConnection = await mongoClient.connect();
    -const mongoDatabase = mongoConnection.db('myDatabase');
    -const mongoCollection = await mongoDatabase.collection('myDocs');
    - 
    -const app = express();
    -app.use(express.json());
    - 
    -/* ... add routes from below */
    - 
    -app.listen(80, () => {
    -  console.log(`Example app listening on port 80`)
    -});
    3

    Implement the Pull Endpoint

    As first HTTP Endpoint, we need to implement the pull handler. This is used by the RxDB replication to fetch all documents writes that happened after a given checkpoint.

    The checkpoint format is not determined by RxDB, instead the server can use any type of changepoint that can be used to iterate across document writes. Here we will just use a unix timestamp updatedAt and a string id which is the most common used format.

    When the pull endpoint is called, the server responds with an array of document data based on the given checkpoint and a new checkpoint. -Also the server has to respect the batchSize so that RxDB knows when there are no more new documents and the server returns a non-full array.

    // > server.ts
    -import { lastOfArray } from 'rxdb/plugins/core';
    -app.get('/pull', (req, res) => {
    -    const id = req.query.id;
    -    const updatedAt = parseFloat(req.query.updatedAt);
    -    const documents = await mongoCollection.find({
    -            $or: [
    -                /**
    -                 * Notice that we have to compare the updatedAt AND the id field
    -                 * because the updateAt field is not unique and when two documents
    -                 * have the same updateAt, we can still "sort" them by their id.
    -                 */
    -                {
    -                    updateAt: { $gt: updatedAt }
    -                },
    -                {
    -                    updateAt: { $eq: updatedAt }
    -                    id: { $gt: id }
    -                }
    -            ]
    -        })
    -        .sort({updateAt: 1, id: 1})
    -        .limit(parseInt(req.query.batchSize, 10)).toArray();
    -    const newCheckpoint = documents.length === 0 ? { id, updatedAt } : {
    -        id: lastOfArray(documents).id,
    -        updatedAt: lastOfArray(documents).updatedAt
    -    };
    -    res.setHeader('Content-Type', 'application/json');
    -    res.end(JSON.stringify({ documents, checkpoint: newCheckpoint }));
    -});
    4

    Implement the Pull Handler

    On the client we add the pull.handler to the replication setting. The handler request the correct server url and fetches the documents.

    // > client.ts
    -const replicationState = await replicateRxCollection({
    -    /* ... */
    -    pull: {
    -        async handler(checkpointOrNull, batchSize){
    -            const updatedAt = checkpointOrNull ? checkpointOrNull.updatedAt : 0;
    -            const id = checkpointOrNull ? checkpointOrNull.id : '';
    -            const response = await fetch(
    -                `https://localhost/pull?updatedAt=${updatedAt}&id=${id}&limit=${batchSize}`
    -            );
    -            const data = await response.json();
    -            return {
    -                documents: data.documents,
    -                checkpoint: data.checkpoint
    -            };
    -        }
    - 
    -    }
    -    /* ... */
    -});
    5

    Implement the Push Endpoint

    To send client side writes to the server, we have to implement the push.handler. It gets an array of change rows as input and has to return only the conflicting documents that did not have been written to the server. Each change row contains a newDocumentState and an optional assumedMasterState.

    For conflict detection, on the server we first have to detect if the assumedMasterState is correct for each row. If yes, we have to write the new document state to the database, otherwise we have to return the "real" master state in the conflict array.

    The server also creates an event that is emitted to the pullStream$ which is later used in the pull.stream$.

    // > server.ts
    -import { lastOfArray } from 'rxdb/plugins/core';
    -import { Subject } from 'rxjs';
    - 
    -// used in the pull.stream$ below
    -let lastEventId = 0;
    -const pullStream$ = new Subject();
    - 
    -app.get('/push', (req, res) => {
    -    const changeRows = req.body;
    -    const conflicts = [];
    -    const event = {
    -        id: lastEventId++,
    -        documents: [],
    -        checkpoint: null
    -    };
    -    for(const changeRow of changeRows){
    -        const realMasterState = mongoCollection.findOne({id: changeRow.newDocumentState.id});
    -        if(
    -            realMasterState && !changeRow.assumedMasterState ||
    -            (
    -                realMasterState && changeRow.assumedMasterState &&
    -                /*
    -                 * For simplicity we detect conflicts on the server by only compare the updateAt value.
    -                 * In reality you might want to do a more complex check or do a deep-equal comparison.
    -                 */
    -                realMasterState.updatedAt !== changeRow.assumedMasterState.updatedAt
    -            )
    -        ) {
    -            // we have a conflict
    -            conflicts.push(realMasterState);
    -        } else {
    -            // no conflict -> write the document
    -            mongoCollection.updateOne(
    -                {id: changeRow.newDocumentState.id},
    -                changeRow.newDocumentState
    -            );
    -            event.documents.push(changeRow.newDocumentState);
    -            event.checkpoint = { id: changeRow.newDocumentState.id, updatedAt: changeRow.newDocumentState.updatedAt };
    -        }
    -    }
    -    if(event.documents.length > 0){
    -        myPullStream$.next(event);
    -    }
    -    res.setHeader('Content-Type', 'application/json');
    -    res.end(JSON.stringify(conflicts));
    -});
    note

    For simplicity in this tutorial, we do not use transactions. In reality you should run the full push function inside of a MongoDB transaction to ensure that no other process can mix up the document state while the writes are processed. Also you should call batch operations on MongoDB instead of running the operations for each change row.

    6

    Implement the Push Handler

    With the push endpoint in place, we can add a push.handler to the replication settings on the client.

    // > client.ts
    -const replicationState = await replicateRxCollection({
    -    /* ... */
    -    push: {
    -        async handler(changeRows){
    -            const rawResponse = await fetch('https://localhost/push', {
    -                method: 'POST',
    -                headers: {
    -                    'Accept': 'application/json',
    -                    'Content-Type': 'application/json'
    -                },
    -                body: JSON.stringify(changeRows)
    -            });
    -            const conflictsArray = await rawResponse.json();
    -            return conflictsArray;
    -        }
    -    }
    -    /* ... */
    -});
    7

    Implement the pullStream$ Endpoint

    While the normal pull handler is used when the replication is in iteration mode, we also need a stream of ongoing changes when the replication is in event observation mode. This brings the realtime replication to RxDB where changes on the server or on a client will directly get propagated to the other instances.

    On the server we have to implement the pullStream route and emit the events. We use the pullStream$ observable from above to fetch all ongoing events and respond them to the client. Here we use Server-Sent-Events (SSE) which is the most common used way to stream data from the server to the client. Other method also exist like WebSockets or Long-Polling.

    // > server.ts
    -app.get('/pullStream', (req, res) => {
    -    res.writeHead(200, {
    -        'Content-Type': 'text/event-stream',
    -        'Connection': 'keep-alive',
    -        'Cache-Control': 'no-cache'
    -    });
    -    const subscription = pullStream$.subscribe(event => {
    -        res.write('data: ' + JSON.stringify(event) + '\n\n');
    -    });
    -    req.on('close', () => subscription.unsubscribe());
    -});
    note

    How the build the pullStream$ Observable is not part of this tutorial. This heavily depends on your backend and infrastructure. Likely you have to observe the MongoDB event stream.

    8

    Implement the pullStream$ Handler

    From the client we can observe this endpoint and create a pull.stream$ observable that emits all events that are send from the server to the client. -The client connects to an url and receives server-sent-events that contain all ongoing writes.

    // > client.ts
    -import { Subject } from 'rxjs';
    -const myPullStream$ = new Subject();
    -const eventSource = new EventSource(
    -    'http://localhost/pullStream',
    -    { withCredentials: true }
    -);
    -eventSource.onmessage = event => {
    -    const eventData = JSON.parse(event.data);
    -    myPullStream$.next({
    -        documents: eventData.documents,
    -        checkpoint: eventData.checkpoint
    -    });
    -};
    - 
    -const replicationState = await replicateRxCollection({
    -    /* ... */
    -    pull: {
    -        /* ... */
    -        stream$: myPullStream$.asObservable()
    -    }
    -    /* ... */
    -});
    9

    pullStream$ RESYNC flag

    In case the client looses the connection, the EventSource will automatically reconnect but there might have been some changes that have been missed out in the meantime. The replication has to be informed that it might have missed events by emitting a RESYNC flag from the pull.stream$. -The replication will then catch up by switching to the iteration mode until it is in sync with the server again.

    // > client.ts
    -eventSource.onerror = () => myPullStream$.next('RESYNC');

    The purpose of the RESYNC flag is to tell the client that "something might have changed" and then the client can react on that information without having to run operations in an interval.

    If your backend is not capable of emitting the actual documents and checkpoint in the pull stream, you could just map all events to the RESYNC flag. This would make the replication work with a slight performance drawback:

    // > client.ts
    -import { Subject } from 'rxjs';
    -const myPullStream$ = new Subject();
    -const eventSource = new EventSource(
    -    'http://localhost/pullStream',
    -    { withCredentials: true }
    -);
    -eventSource.onmessage = () => myPullStream$.next('RESYNC');
    -const replicationState = await replicateRxCollection({
    -    pull: {
    -        stream$: myPullStream$.asObservable()
    -    }
    -});
    -

    Missing implementation details

    -

    In this tutorial we only covered the basics of doing a HTTP replication between RxDB clients and a server. We did not cover the following aspects of the implementation:

    -
      -
    • Authentication: To authenticate the client on the server, you might want to send authentication headers with the HTTP requests
    • -
    • Skip events on the pull.stream$ for the client that caused the changes to improve performance.
    • -
    • Version upgrades: You should add a version-flag to the endpoint urls. If you then update the version of your endpoints in any way, your old endpoints should emit a Code 426 to outdated clients so that they can updated their client version.
    • -
    - - \ No newline at end of file diff --git a/docs/replication-http.md b/docs/replication-http.md deleted file mode 100644 index 3063e11cb2f..00000000000 --- a/docs/replication-http.md +++ /dev/null @@ -1,314 +0,0 @@ -# HTTP Replication - -> Learn how to establish HTTP replication between RxDB clients and a Node.js Express server for data synchronization. - -import {Steps} from '@site/src/components/steps'; -import {Tabs} from '@site/src/components/tabs'; - -# HTTP Replication from a custom server to RxDB clients - -While RxDB has a range of backend-specific replication plugins (like [GraphQL](./replication-graphql.md) or [Firestore](./replication-firestore.md)), the replication is build in a way to make it very easy to replicate data from a custom server to RxDB clients. - - - -Using **HTTP** as a transport protocol makes it simple to create a compatible backend on top of your existing infrastructure. For events that must be sent from the server to the client, we can use [Server Send Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events). - -In this tutorial we will implement a HTTP replication between an RxDB client and a MongoDB express server. You can adapt this for any other backend database technology like PostgreSQL or even a non-Node.js server like go or java. - -To create a compatible server for replication, we will start a server and implement the correct HTTP routes and replication handlers. We need a push-handler, a pull-handler and for the ongoing changes `pull.stream` we use **Server Send Events**. - -## Setup - - - -### Start the Replication on the RxDB Client - -RxDB does not have a specific HTTP-replication plugin because the [replication primitives plugin](./replication.md) is simple enough to start a HTTP replication on top of it. -We import the `replicateRxCollection` function and start the replication from there for a single [RxCollection](./rx-collection.md). - -```ts -// > client.ts -import { replicateRxCollection } from 'rxdb/plugins/replication'; -const replicationState = await replicateRxCollection({ - collection: myRxCollection, - replicationIdentifier: 'my-http-replication', - push: { /* add settings from below */ }, - pull: { /* add settings from below */ } -}); -``` - -### Start a Node.js process with Express and MongoDB - -On the server side, we start an express server that has a MongoDB connection and serves the HTTP requests of the client. - -```ts -// > server.ts -import { MongoClient } from 'mongodb'; -import express from 'express'; -const mongoClient = new MongoClient('mongodb://localhost:27017/'); -const mongoConnection = await mongoClient.connect(); -const mongoDatabase = mongoConnection.db('myDatabase'); -const mongoCollection = await mongoDatabase.collection('myDocs'); - -const app = express(); -app.use(express.json()); - -/* ... add routes from below */ - -app.listen(80, () => { - console.log(`Example app listening on port 80`) -}); -``` - -### Implement the Pull Endpoint - -As first HTTP Endpoint, we need to implement the pull handler. This is used by the RxDB replication to fetch all documents writes that happened after a given `checkpoint`. - -The `checkpoint` format is not determined by RxDB, instead the server can use any type of changepoint that can be used to iterate across document writes. Here we will just use a unix timestamp `updatedAt` and a string `id` which is the most common used format. - -When the pull endpoint is called, the server responds with an array of document data based on the given checkpoint and a new checkpoint. -Also the server has to respect the batchSize so that RxDB knows when there are no more new documents and the server returns a non-full array. - -```ts -// > server.ts -import { lastOfArray } from 'rxdb/plugins/core'; -app.get('/pull', (req, res) => { - const id = req.query.id; - const updatedAt = parseFloat(req.query.updatedAt); - const documents = await mongoCollection.find({ - $or: [ - /** - * Notice that we have to compare the updatedAt AND the id field - * because the updateAt field is not unique and when two documents - * have the same updateAt, we can still "sort" them by their id. - */ - { - updateAt: { $gt: updatedAt } - }, - { - updateAt: { $eq: updatedAt } - id: { $gt: id } - } - ] - }) - .sort({updateAt: 1, id: 1}) - .limit(parseInt(req.query.batchSize, 10)).toArray(); - const newCheckpoint = documents.length === 0 ? { id, updatedAt } : { - id: lastOfArray(documents).id, - updatedAt: lastOfArray(documents).updatedAt - }; - res.setHeader('Content-Type', 'application/json'); - res.end(JSON.stringify({ documents, checkpoint: newCheckpoint })); -}); -``` - -### Implement the Pull Handler - -On the client we add the `pull.handler` to the replication setting. The handler request the correct server url and fetches the documents. - -```ts -// > client.ts -const replicationState = await replicateRxCollection({ - /* ... */ - pull: { - async handler(checkpointOrNull, batchSize){ - const updatedAt = checkpointOrNull ? checkpointOrNull.updatedAt : 0; - const id = checkpointOrNull ? checkpointOrNull.id : ''; - const response = await fetch( - `https://localhost/pull?updatedAt=${updatedAt}&id=${id}&limit=${batchSize}` - ); - const data = await response.json(); - return { - documents: data.documents, - checkpoint: data.checkpoint - }; - } - - } - /* ... */ -}); -``` - -### Implement the Push Endpoint - -To send client side writes to the server, we have to implement the `push.handler`. It gets an array of change rows as input and has to return only the conflicting documents that did not have been written to the server. Each change row contains a `newDocumentState` and an optional `assumedMasterState`. - -For [conflict detection](./transactions-conflicts-revisions.md), on the server we first have to detect if the `assumedMasterState` is correct for each row. If yes, we have to write the new document state to the database, otherwise we have to return the "real" master state in the conflict array. - -The server also creates an `event` that is emitted to the `pullStream$` which is later used in the [pull.stream$](#pullstream-for-ongoing-changes). - -```ts -// > server.ts -import { lastOfArray } from 'rxdb/plugins/core'; -import { Subject } from 'rxjs'; - -// used in the pull.stream$ below -let lastEventId = 0; -const pullStream$ = new Subject(); - -app.get('/push', (req, res) => { - const changeRows = req.body; - const conflicts = []; - const event = { - id: lastEventId++, - documents: [], - checkpoint: null - }; - for(const changeRow of changeRows){ - const realMasterState = mongoCollection.findOne({id: changeRow.newDocumentState.id}); - if( - realMasterState && !changeRow.assumedMasterState || - ( - realMasterState && changeRow.assumedMasterState && - /* - * For simplicity we detect conflicts on the server by only compare the updateAt value. - * In reality you might want to do a more complex check or do a deep-equal comparison. - */ - realMasterState.updatedAt !== changeRow.assumedMasterState.updatedAt - ) - ) { - // we have a conflict - conflicts.push(realMasterState); - } else { - // no conflict -> write the document - mongoCollection.updateOne( - {id: changeRow.newDocumentState.id}, - changeRow.newDocumentState - ); - event.documents.push(changeRow.newDocumentState); - event.checkpoint = { id: changeRow.newDocumentState.id, updatedAt: changeRow.newDocumentState.updatedAt }; - } - } - if(event.documents.length > 0){ - myPullStream$.next(event); - } - res.setHeader('Content-Type', 'application/json'); - res.end(JSON.stringify(conflicts)); -}); -``` - -:::note -For simplicity in this tutorial, we do not use transactions. In reality you should run the full push function inside of a MongoDB transaction to ensure that no other process can mix up the document state while the writes are processed. Also you should call batch operations on MongoDB instead of running the operations for each change row. -::: - -### Implement the Push Handler - -With the push endpoint in place, we can add a `push.handler` to the replication settings on the client. - -```ts -// > client.ts -const replicationState = await replicateRxCollection({ - /* ... */ - push: { - async handler(changeRows){ - const rawResponse = await fetch('https://localhost/push', { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify(changeRows) - }); - const conflictsArray = await rawResponse.json(); - return conflictsArray; - } - } - /* ... */ -}); -``` - -### Implement the pullStream$ Endpoint - -While the normal pull handler is used when the replication is in [iteration mode](./replication.md#checkpoint-iteration), we also need a stream of ongoing changes when the replication is in [event observation mode](./replication.md#event-observation). This brings the realtime replication to RxDB where changes on the server or on a client will directly get propagated to the other instances. - -On the server we have to implement the `pullStream` route and emit the events. We use the `pullStream$` observable from [above](#push-from-the-client-to-the-server) to fetch all ongoing events and respond them to the client. Here we use Server-Sent-Events (SSE) which is the most common used way to stream data from the server to the client. Other method also exist like [WebSockets or Long-Polling](./articles/websockets-sse-polling-webrtc-webtransport.md). - -```ts -// > server.ts -app.get('/pullStream', (req, res) => { - res.writeHead(200, { - 'Content-Type': 'text/event-stream', - 'Connection': 'keep-alive', - 'Cache-Control': 'no-cache' - }); - const subscription = pullStream$.subscribe(event => { - res.write('data: ' + JSON.stringify(event) + '\n\n'); - }); - req.on('close', () => subscription.unsubscribe()); -}); -``` - -:::note -How the build the `pullStream$` Observable is not part of this tutorial. This heavily depends on your backend and infrastructure. Likely you have to observe the MongoDB event stream. -::: - -### Implement the pullStream$ Handler - -From the client we can observe this endpoint and create a `pull.stream$` observable that emits all events that are send from the server to the client. -The client connects to an url and receives server-sent-events that contain all ongoing writes. - -```ts -// > client.ts -import { Subject } from 'rxjs'; -const myPullStream$ = new Subject(); -const eventSource = new EventSource( - 'http://localhost/pullStream', - { withCredentials: true } -); -eventSource.onmessage = event => { - const eventData = JSON.parse(event.data); - myPullStream$.next({ - documents: eventData.documents, - checkpoint: eventData.checkpoint - }); -}; - -const replicationState = await replicateRxCollection({ - /* ... */ - pull: { - /* ... */ - stream$: myPullStream$.asObservable() - } - /* ... */ -}); -``` - -### pullStream$ RESYNC flag - -In case the client looses the connection, the EventSource will automatically reconnect but there might have been some changes that have been missed out in the meantime. The replication has to be informed that it might have missed events by emitting a `RESYNC` flag from the `pull.stream$`. -The replication will then catch up by switching to the [iteration mode](./replication.md#checkpoint-iteration) until it is in sync with the server again. - -```ts -// > client.ts -eventSource.onerror = () => myPullStream$.next('RESYNC'); -``` - -The purpose of the `RESYNC` flag is to tell the client that "something might have changed" and then the client can react on that information without having to run operations in an interval. - -If your backend is not capable of emitting the actual documents and checkpoint in the pull stream, you could just map all events to the `RESYNC` flag. This would make the replication work with a slight performance drawback: - -```ts -// > client.ts -import { Subject } from 'rxjs'; -const myPullStream$ = new Subject(); -const eventSource = new EventSource( - 'http://localhost/pullStream', - { withCredentials: true } -); -eventSource.onmessage = () => myPullStream$.next('RESYNC'); -const replicationState = await replicateRxCollection({ - pull: { - stream$: myPullStream$.asObservable() - } -}); -``` - - - -## Missing implementation details - -In this tutorial we only covered the basics of doing a HTTP replication between RxDB clients and a server. We did not cover the following aspects of the implementation: - -- Authentication: To authenticate the client on the server, you might want to send authentication headers with the HTTP requests -- Skip events on the `pull.stream$` for the client that caused the changes to improve performance. -- Version upgrades: You should add a version-flag to the endpoint urls. If you then update the version of your endpoints in any way, your old endpoints should emit a `Code 426` to outdated clients so that they can updated their client version. diff --git a/docs/replication-mongodb.html b/docs/replication-mongodb.html deleted file mode 100644 index 5d68f3f3346..00000000000 --- a/docs/replication-mongodb.html +++ /dev/null @@ -1,272 +0,0 @@ - - - - - -MongoDB Realtime Sync Engine for Local-First Apps | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    MongoDB Replication Plugin for RxDB - Real-Time, Offline-First Sync

    -

    MongoDB Sync

    -

    The MongoDB Replication Plugin for RxDB delivers seamless, two-way synchronization between MongoDB and RxDB, enabling real-time updates and offline-first functionality for your applications. Built on MongoDB Change Streams, it supports both Atlas and self-hosted deployments, ensuring your data stays consistent across every device and service.

    -

    Behind the scenes, the plugin is powered by the RxDB Sync Engine, which manages the complexities of real-world data replication for you. It automatically handles conflict detection and resolution, maintains precise checkpoints for incremental updates, and gracefully manages transitions between offline and online states. This means you don't need to manually implement retry logic, reconcile divergent changes, or worry about data loss during connectivity drops, the Sync Engine ensures consistency and reliability in every sync cycle.

    -

    Key Features

    -
      -
    • Two-way replication between MongoDB and RxDB collections
    • -
    • Offline-first support with automatic incremental re-sync
    • -
    • Incremental updates via MongoDB Change Streams
    • -
    • Conflict resolution handled by the RxDB Sync Engine
    • -
    • Atlas and self-hosted support for replica sets and sharded clusters
    • -
    -

    Architecture Overview

    -

    The plugin operates in a three-tier architecture: Clients connect to RxServer, which in turn connects to MongoDB. RxServer streams changes from MongoDB to connected clients and pushes client-side updates back to MongoDB.

    -

    For the client side, RxServer exposes a replication endpoint over WebSocket or HTTP, which your RxDB-powered applications can consume.

    -

    The following diagram illustrates the flow of updates between clients, RxServer, and MongoDB in a live synchronization setup:

    -
    Client A
    RxServer
    MongoDB
    Client B
    Client C
    -
    -
    -
    note

    The MongoDB Replication Plugin is optimized for Node.js environments (e.g., when RxDB runs within RxServer or other backend services). Direct connections from browsers or mobile apps to MongoDB are not supported because MongoDB does not use HTTP as its wire protocol and requires a driver-level connection to a replica set or sharded cluster.

    -

    Setting up the Client-RxServer-MongoDB Sync

    -
    1

    Install the Client Dependencies

    In your JavaScript project, install the RxDB libraries and the MongoDB node.js driver:

    npm install rxdb rxdb-server mongodb --save

    2

    Set up a MongoDB Server

    As first step, you need access to a running MongoDB Server. This can be done by either running a server locally or using the Atlas Cloud. Notice that we need to have a replica set because only on these, the MongoDB changestream can be used.

    If you have installed MongoDB locally, you can start the server with this command:

    mongod --replSet rs0 --bind_ip_all


    After this step you should have a valid connection string that points to a running MongoDB Server like mongodb://localhost:27017/.

    3

    Create a MongoDB Database and Collection

    On your MongoDB server, make sure to create a database and a collection.

    //> server.ts
    - 
    -import { MongoClient } from 'mongodb';
    -const mongoClient = new MongoClient('mongodb://localhost:27017/?directConnection=true');
    -const mongoDatabase = mongoClient.db('my-database');
    -await mongoDatabase.createCollection('my-collection', {
    -  changeStreamPreAndPostImages: { enabled: true }
    -});
    note

    To observe document deletions on the changestream, changeStreamPreAndPostImages must be enabled. This is not required if you have an insert/update-only collection where no documents are deleted ever.

    4

    Create a RxDB Database and Collection

    Now we create an RxDB database and a collection. In this example the memory storage, in production you would use a persistent storage instead.

    //> server.ts
    - 
    -import { createRxDatabase, addRxPlugin } from 'rxdb';
    -import { getRxStorageMemory } from 'rxdb/plugins/storage-memory';
    - 
    -// Create server-side RxDB instance
    -const db = await createRxDatabase({
    -  name: 'serverdb',
    -  storage: getRxStorageMemory()
    -});
    - 
    -// Add your collection schema
    -await db.addCollections({
    -  humans: {
    -    schema: {
    -      version: 0,
    -      primaryKey: 'passportId',
    -      type: 'object',
    -      properties: {
    -        passportId: { type: 'string', maxLength: 100 },
    -        firstName: { type: 'string' },
    -        lastName: { type: 'string' }
    -      },
    -      required: ['passportId', 'firstName', 'lastName']
    -    }
    -  }
    -});
    5

    Sync the Collection with the MongoDB Server

    Now we can start a replication that does a two-way replication between the RxDB Collection and the MongoDB Collection.

    //> server.ts
    - 
    -import { replicateMongoDB } from 'rxdb/plugins/replication-mongodb';
    - 
    -const replicationState = replicateMongoDB({
    -  mongodb: {
    -    collectionName: 'my-collection',
    -    connection: 'mongodb://localhost:27017',
    -    databaseName: 'my-database'
    -  },
    -  collection: db.humans,
    -  replicationIdentifier: 'humans-mongodb-sync',
    -  pull: { batchSize: 50 },
    -  push: { batchSize: 50 },
    -  live: true
    -});
    - 
    You can do many things with the replication state

    The RxMongoDBReplicationState which is returned from replicateMongoDB() allows you to run all functionality of the normal RxReplicationState like observing errors or doing start/stop operations.

    6

    Start a RxServer

    Now that we have a RxDatabase and Collection that is replicated with MongoDB, we can spawn a RxServer on top of it. This server can then be used by client devices to connect.

    //> server.ts
    - 
    -import { createRxServer } from 'rxdb-server/plugins/server';
    -import { RxServerAdapterExpress } from 'rxdb-server/plugins/adapter-express';
    - 
    -const server = await createRxServer({
    -  database: db,
    -  adapter: RxServerAdapterExpress,
    -  port: 8080,
    -  cors: '*'
    -});
    - 
    -const endpoint = server.addReplicationEndpoint({
    -    name: 'humans',
    -    collection: db.humans
    -});
    -console.log('Replication endpoint:', `http://localhost:8080/${endpoint.urlPath}`);
    - 
    -// do not forget to start the server!
    -await server.start();
    7

    Sync a Client with the RxServer

    On the client-side we create the exact same RxDatabase and collection and then replicate it with the replication endpoint of the RxServer.

    //> client.ts
    - 
    -import { createRxDatabase } from 'rxdb';
    -import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie';
    -import { replicateServer } from 'rxdb-server/plugins/replication-server';
    - 
    -const db = await createRxDatabase({
    -  name: 'mydb-client',
    -  storage: getRxStorageDexie()
    -});
    - 
    -await db.addCollections({
    -  humans: {
    -    schema: {
    -      version: 0,  
    -      primaryKey: 'passportId',
    -      type: 'object',
    -      properties: {
    -        passportId: { type: 'string', maxLength: 100 },
    -        firstName: { type: 'string' },
    -        lastName: { type: 'string' }
    -      },
    -      required: ['passportId', 'firstName', 'lastName']
    -    }
    -  }
    -});
    - 
    -// Start replication to the RxServer endpoint printed by the server:
    -// e.g. http://localhost:8080/humans/0
    -const replicationState = replicateServer({
    -  replicationIdentifier: 'humans-rxserver',
    -  collection: db.humans,
    -  url: 'http://localhost:8080/humans/0',
    -  live: true,
    -  pull: { batchSize: 50 },
    -  push: { batchSize: 50 }
    -});
    - 
    -

    Follow Up

    -
    - - \ No newline at end of file diff --git a/docs/replication-mongodb.md b/docs/replication-mongodb.md deleted file mode 100644 index b0a521382be..00000000000 --- a/docs/replication-mongodb.md +++ /dev/null @@ -1,241 +0,0 @@ -# MongoDB Realtime Sync Engine for Local-First Apps - -> Build real-time, offline-capable apps with RxDB + MongoDB replication. Push/pull changes, use change streams, and keep data in sync across devices. - -import {Tabs} from '@site/src/components/tabs'; -import {Steps} from '@site/src/components/steps'; -import {VideoBox} from '@site/src/components/video-box'; -import {RxdbMongoDiagramPlain} from '@site/src/components/mongodb-sync'; - -# MongoDB Replication Plugin for RxDB - Real-Time, Offline-First Sync - - - -The [MongoDB](https://www.mongodb.com/) Replication Plugin for RxDB delivers seamless, two-way synchronization between MongoDB and RxDB, enabling [real-time](./articles/realtime-database.md) updates and [offline-first](./offline-first.md) functionality for your applications. Built on **MongoDB Change Streams**, it supports both Atlas and self-hosted deployments, ensuring your data stays consistent across every device and service. - -Behind the scenes, the plugin is powered by the RxDB [Sync Engine](./replication.md), which manages the complexities of real-world data replication for you. It automatically handles [conflict detection and resolution](./transactions-conflicts-revisions.md), maintains precise checkpoints for incremental updates, and gracefully manages transitions between offline and online states. This means you don't need to manually implement retry logic, reconcile divergent changes, or worry about data loss during connectivity drops, the Sync Engine ensures consistency and reliability in every sync cycle. - -## Key Features - -- **Two-way replication** between MongoDB and RxDB collections -- **Offline-first support** with automatic incremental re-sync -- **Incremental updates** via MongoDB Change Streams -- **Conflict resolution** handled by the RxDB Sync Engine -- **Atlas and self-hosted support** for replica sets and sharded clusters - -## Architecture Overview - -The plugin operates in a three-tier architecture: Clients connect to [RxServer](./rx-server.md), which in turn connects to MongoDB. RxServer streams changes from MongoDB to connected clients and pushes client-side updates back to MongoDB. - -For the client side, RxServer exposes a [replication endpoint](./rx-server.md#replication-endpoint) over WebSocket or HTTP, which your RxDB-powered applications can consume. - -The following diagram illustrates the flow of updates between clients, RxServer, and MongoDB in a live synchronization setup: - - - -:::note -The MongoDB Replication Plugin is optimized for Node.js environments (e.g., when RxDB runs within RxServer or other backend services). Direct connections from browsers or mobile apps to MongoDB are not supported because MongoDB does not use HTTP as its wire protocol and requires a driver-level connection to a replica set or sharded cluster. -::: - -## Setting up the Client-RxServer-MongoDB Sync - - - -### Install the Client Dependencies - -In your JavaScript project, install the RxDB libraries and the MongoDB node.js driver: - -```npm install rxdb rxdb-server mongodb --save``` - -### Set up a MongoDB Server - -As first step, you need access to a running MongoDB Server. This can be done by either running a server locally or using the Atlas Cloud. Notice that we need to have a [replica set](https://www.mongodb.com/docs/manual/tutorial/deploy-replica-set/) because only on these, the MongoDB changestream can be used. - - - -### Shell - -If you have installed MongoDB locally, you can start the server with this command: - -```mongod --replSet rs0 --bind_ip_all``` - -### Docker - -If you have docker installed, you can start a container that runs the MongoDB server: - -```docker run -p 27017:27017 -p 27018:27018 -p 27019:27019 --rm --name rxdb-mongodb mongo:8.0.4 mongod --replSet rs0 --bind_ip_all``` - -### MongoDB Atlas - -Learn here how to create a MongoDB atlas account and how to start a MongoDB cluster that runs in the cloud: - -
    - -
    - -
    - -After this step you should have a valid connection string that points to a running MongoDB Server like `mongodb://localhost:27017/`. - -### Create a MongoDB Database and Collection - -On your MongoDB server, make sure to create a database and a collection. - -```ts -//> server.ts - -import { MongoClient } from 'mongodb'; -const mongoClient = new MongoClient('mongodb://localhost:27017/?directConnection=true'); -const mongoDatabase = mongoClient.db('my-database'); -await mongoDatabase.createCollection('my-collection', { - changeStreamPreAndPostImages: { enabled: true } -}); -``` - -:::note -To observe document deletions on the changestream, `changeStreamPreAndPostImages` must be enabled. This is not required if you have an insert/update-only collection where no documents are deleted ever. -::: - -### Create a RxDB Database and Collection - -Now we create an RxDB [database](./rx-database.md) and a [collection](./rx-collection.md). In this example the [memory storage](./rx-storage-memory.md), in production you would use a [persistent storage](./rx-storage.md) instead. - -```ts -//> server.ts - -import { createRxDatabase, addRxPlugin } from 'rxdb'; -import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; - -// Create server-side RxDB instance -const db = await createRxDatabase({ - name: 'serverdb', - storage: getRxStorageMemory() -}); - -// Add your collection schema -await db.addCollections({ - humans: { - schema: { - version: 0, - primaryKey: 'passportId', - type: 'object', - properties: { - passportId: { type: 'string', maxLength: 100 }, - firstName: { type: 'string' }, - lastName: { type: 'string' } - }, - required: ['passportId', 'firstName', 'lastName'] - } - } -}); -``` - -### Sync the Collection with the MongoDB Server - -Now we can start a [replication](./replication.md) that does a two-way replication between the RxDB Collection and the MongoDB Collection. - -```ts -//> server.ts - -import { replicateMongoDB } from 'rxdb/plugins/replication-mongodb'; - -const replicationState = replicateMongoDB({ - mongodb: { - collectionName: 'my-collection', - connection: 'mongodb://localhost:27017', - databaseName: 'my-database' - }, - collection: db.humans, - replicationIdentifier: 'humans-mongodb-sync', - pull: { batchSize: 50 }, - push: { batchSize: 50 }, - live: true -}); - -``` - -:::note You can do many things with the replication state -The `RxMongoDBReplicationState` which is returned from `replicateMongoDB()` allows you to run all functionality of the normal [RxReplicationState](./replication.md) like observing errors or doing start/stop operations. -::: - -### Start a RxServer - -Now that we have a RxDatabase and Collection that is replicated with MongoDB, we can spawn a [RxServer](./rx-server.md) on top of it. This server can then be used by client devices to connect. - -```ts -//> server.ts - -import { createRxServer } from 'rxdb-server/plugins/server'; -import { RxServerAdapterExpress } from 'rxdb-server/plugins/adapter-express'; - -const server = await createRxServer({ - database: db, - adapter: RxServerAdapterExpress, - port: 8080, - cors: '*' -}); - -const endpoint = server.addReplicationEndpoint({ - name: 'humans', - collection: db.humans -}); -console.log('Replication endpoint:', `http://localhost:8080/${endpoint.urlPath}`); - -// do not forget to start the server! -await server.start(); -``` - -### Sync a Client with the RxServer - -On the client-side we create the exact same RxDatabase and collection and then replicate it with the replication endpoint of the RxServer. - -```ts -//> client.ts - -import { createRxDatabase } from 'rxdb'; -import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; -import { replicateServer } from 'rxdb-server/plugins/replication-server'; - -const db = await createRxDatabase({ - name: 'mydb-client', - storage: getRxStorageDexie() -}); - -await db.addCollections({ - humans: { - schema: { - version: 0, - primaryKey: 'passportId', - type: 'object', - properties: { - passportId: { type: 'string', maxLength: 100 }, - firstName: { type: 'string' }, - lastName: { type: 'string' } - }, - required: ['passportId', 'firstName', 'lastName'] - } - } -}); - -// Start replication to the RxServer endpoint printed by the server: -// e.g. http://localhost:8080/humans/0 -const replicationState = replicateServer({ - replicationIdentifier: 'humans-rxserver', - collection: db.humans, - url: 'http://localhost:8080/humans/0', - live: true, - pull: { batchSize: 50 }, - push: { batchSize: 50 } -}); - -``` - -
    - -## Follow Up - -- Try it out with the [RxDB-MongoDB example repository](https://github.com/pubkey/rxdb-mongodb-sync-example) -- Read [From Local to Global: Scalable Edge Apps with RxDB + MongoDB](https://www.mongodb.com/company/blog/innovation/from-local-global-scalable-edge-apps-rxdb) -- [Replication API Reference](./replication.md) -- [RxServer Documentation](./rx-server.md) -- Join our [Discord Forum](./chat) for questions and feedback diff --git a/docs/replication-nats.html b/docs/replication-nats.html deleted file mode 100644 index d52b947f1bd..00000000000 --- a/docs/replication-nats.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - -RxDB & NATS - Realtime Sync | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Replication with NATS

    -

    With this RxDB plugin you can run a two-way realtime replication with a NATS server.

    -

    The replication itself uses the RxDB Sync Engine which handles conflicts, errors and retries. -On the client side the official NATS npm package is used to connect to the NATS server.

    -

    NATS is a messaging system that by itself does not have a validation or granulary access control build in. -Therefore it is not recommended to directly replicate the NATS server with an untrusted RxDB client application. Instead you should replicated from NATS to your Node.js server side RxDB database.

    -

    Precondition

    -

    For the replication endpoint the NATS cluster must have enabled JetStream and store all message data as structured JSON.

    -

    The easiest way to start a compatible NATS server is to use the official docker image:

    -

    docker run --rm --name rxdb-nats -p 4222:4222 nats:2.9.17 -js

    -

    Usage

    -
    1

    Install the nats package

    npm install nats --save
    2

    Start the Replication

    To start the replication, import the replicateNats() method from the RxDB plugin and call it with the collection -that must be replicated. -The replication runs per RxCollection, you can replicate multiple RxCollections by starting a new replication for each of them.

    import {
    -    replicateNats
    -} from 'rxdb/plugins/replication-nats';
    - 
    -const replicationState = replicateNats({
    -    collection: myRxCollection,
    -    replicationIdentifier: 'my-nats-replication-collection-A',
    -    // in NATS, each stream need a name
    -    streamName: 'stream-for-replication-A',
    -    /**
    -     * The subject prefix determines how the documents are stored in NATS.
    -     * For example the document with id 'alice'
    -     * will have the subject 'foobar.alice'
    -     */
    -    subjectPrefix: 'foobar',
    -    connection: { servers: 'localhost:4222' },
    -    live: true,
    -    pull: {
    -        batchSize: 30
    -    },
    -    push: {
    -        batchSize: 30
    -    }
    -});
    -

    Handling deletes

    -

    RxDB requires you to never fully delete documents. This is needed to be able to replicate the deletion state of a document to other instances. The NATS replication will set a boolean _deleted field to all documents to indicate the deletion state. You can change this by setting a different deletedField in the sync options.

    - - \ No newline at end of file diff --git a/docs/replication-nats.md b/docs/replication-nats.md deleted file mode 100644 index cd709c23002..00000000000 --- a/docs/replication-nats.md +++ /dev/null @@ -1,72 +0,0 @@ -# RxDB & NATS - Realtime Sync - -> Seamlessly sync your RxDB data with NATS for real-time, two-way replication. Handle conflicts, errors, and retries with ease. - -import {Steps} from '@site/src/components/steps'; - -# Replication with NATS - -With this RxDB plugin you can run a two-way realtime replication with a [NATS](https://nats.io/) server. - -The replication itself uses the [RxDB Sync Engine](./replication.md) which handles conflicts, errors and retries. -On the client side the official [NATS npm package](https://www.npmjs.com/package/nats) is used to connect to the NATS server. - -NATS is a messaging system that by itself does not have a validation or granulary access control build in. -Therefore it is not recommended to directly replicate the NATS server with an untrusted RxDB client application. Instead you should replicated from NATS to your Node.js server side RxDB database. - -## Precondition - -For the replication endpoint the NATS cluster must have enabled [JetStream](https://docs.nats.io/nats-concepts/jetstream) and store all message data as [structured JSON](https://docs.nats.io/using-nats/developer/sending/structure). - -The easiest way to start a compatible NATS server is to use the official docker image: - -```docker run --rm --name rxdb-nats -p 4222:4222 nats:2.9.17 -js``` - -## Usage - - - -### Install the nats package - -```bash -npm install nats --save -``` - -### Start the Replication - -To start the replication, import the `replicateNats()` method from the RxDB plugin and call it with the collection -that must be replicated. -The replication runs *per RxCollection*, you can replicate multiple RxCollections by starting a new replication for each of them. - -```typescript -import { - replicateNats -} from 'rxdb/plugins/replication-nats'; - -const replicationState = replicateNats({ - collection: myRxCollection, - replicationIdentifier: 'my-nats-replication-collection-A', - // in NATS, each stream need a name - streamName: 'stream-for-replication-A', - /** - * The subject prefix determines how the documents are stored in NATS. - * For example the document with id 'alice' - * will have the subject 'foobar.alice' - */ - subjectPrefix: 'foobar', - connection: { servers: 'localhost:4222' }, - live: true, - pull: { - batchSize: 30 - }, - push: { - batchSize: 30 - } -}); -``` - - - -## Handling deletes - -RxDB requires you to never [fully delete documents](./replication.md#data-layout-on-the-server). This is needed to be able to replicate the deletion state of a document to other instances. The NATS replication will set a boolean `_deleted` field to all documents to indicate the deletion state. You can change this by setting a different `deletedField` in the sync options. diff --git a/docs/replication-p2p.html b/docs/replication-p2p.html deleted file mode 100644 index 97f27a2e685..00000000000 --- a/docs/replication-p2p.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - -Seamless P2P Data Sync | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    The RxDB Plugin replication-p2p has been renamed to replication-webrtc

    -

    The new documentation page has been moved to here

    -
    - - \ No newline at end of file diff --git a/docs/replication-p2p.md b/docs/replication-p2p.md deleted file mode 100644 index 5aa5f85f3a0..00000000000 --- a/docs/replication-p2p.md +++ /dev/null @@ -1,9 +0,0 @@ -# Seamless P2P Data Sync - -> Discover how replication-webrtc ensures secure P2P data sync and real-time collaboration with RxDB. Explore the future of offline-first apps! - -# The RxDB Plugin `replication-p2p` has been renamed to `replication-webrtc` - -The new documentation page has been moved to [here](./replication-webrtc.md) - - diff --git a/docs/replication-server.html b/docs/replication-server.html deleted file mode 100644 index d0e3cee6a3f..00000000000 --- a/docs/replication-server.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - -RxDB Server Replication | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxDB Server Replication

    -

    The Server Replication Plugin connects to the replication endpoint of an RxDB Server Replication Endpoint and replicates data between the client and the server.

    -

    Usage

    -

    The replication server plugin is imported from the rxdb-server npm package. Then you start the replication with a given collection and endpoint url by calling replicateServer().

    -
    import { replicateServer } from 'rxdb-server/plugins/replication-server';
    - 
    -const replicationState = await replicateServer({
    -    collection: usersCollection,
    -    replicationIdentifier: 'my-server-replication',
    -    url: 'http://localhost:80/users/0', // endpoint url with the servers collection schema version at the end
    -    headers: {
    -        Authorization: 'Bearer S0VLU0UhI...'
    -    },
    -    push: {},
    -    pull: {},
    -    live: true
    -});
    -

    outdatedClient$

    -

    When you update your schema at the server and run a migration, you end up with a different replication url that has a new schema version number at the end. -Your clients might still be running an old version of your application that will no longer be compatible with the endpoint. Therefore when the client tries to call a server endpoint with an outdated schema version, the outdatedClient$ observable emits to tell your client that the application must be updated. With that event you can tell the client to update the application. -On browser application you might want to just reload the page on that event:

    -
    replicationState.outdatedClient$.subscribe(() => {
    -    location.reload();
    -});
    -

    unauthorized$

    -

    When you clients auth data is not valid (or no longer valid), the server will no longer accept any requests from you client and inform the client that the auth headers must be updated. -The unauthorized$ observable will emit and expects you to update the headers accordingly so that following requests will be accepted again.

    -
    replicationState.unauthorized$.subscribe(() => {
    -    replicationState.setHeaders({
    -        Authorization: 'Bearer S0VLU0UhI...'
    -    });
    -});
    -

    forbidden$

    -

    When you client behaves wrong in any case, like update non-allowed values or changing documents that it is not allowed to, -the server will drop the connection and the replication state will emit on the forbidden$ observable. -It will also automatically stop the replication so that your client does not accidentally DOS attack the server.

    -
    replicationState.forbidden$.subscribe(() => {
    -    console.log('Client is behaving wrong');
    -});
    -

    Custom EventSource implementation

    -

    For the server send events, the eventsource npm package is used instead of the native EventSource API. We need this because the native browser API does not support sending headers with the request which is required by the server to parse the auth data.

    -

    If the eventsource package does not work for you, you can set an own implementation when creating the replication.

    -
    const replicationState = await replicateServer({
    -    /* ... */
    -    eventSource: MyEventSourceConstructor
    -    /* ... */
    -});
    - - \ No newline at end of file diff --git a/docs/replication-server.md b/docs/replication-server.md deleted file mode 100644 index 2fe634582f5..00000000000 --- a/docs/replication-server.md +++ /dev/null @@ -1,78 +0,0 @@ -# RxDB Server Replication - -> The *Server Replication Plugin* connects to the replication endpoint of an [RxDB Server Replication Endpoint](./rx-server.md#replication-endpoint) and replicates data between the client and the server. - -# RxDB Server Replication - -The *Server Replication Plugin* connects to the replication endpoint of an [RxDB Server Replication Endpoint](./rx-server.md#replication-endpoint) and replicates data between the client and the server. - -## Usage - -The replication server plugin is imported from the `rxdb-server` npm package. Then you start the replication with a given collection and endpoint url by calling `replicateServer()`. - -```ts -import { replicateServer } from 'rxdb-server/plugins/replication-server'; - -const replicationState = await replicateServer({ - collection: usersCollection, - replicationIdentifier: 'my-server-replication', - url: 'http://localhost:80/users/0', // endpoint url with the servers collection schema version at the end - headers: { - Authorization: 'Bearer S0VLU0UhI...' - }, - push: {}, - pull: {}, - live: true -}); -``` - -## outdatedClient$ - -When you update your schema at the server and run a migration, you end up with a different replication url that has a new schema version number at the end. -Your clients might still be running an old version of your application that will no longer be compatible with the endpoint. Therefore when the client tries to call a server endpoint with an outdated schema version, the `outdatedClient$` observable emits to tell your client that the application must be updated. With that event you can tell the client to update the application. -On browser application you might want to just reload the page on that event: - -```ts -replicationState.outdatedClient$.subscribe(() => { - location.reload(); -}); -``` - -## unauthorized$ - -When you clients auth data is not valid (or no longer valid), the server will no longer accept any requests from you client and inform the client that the auth headers must be updated. -The `unauthorized$` observable will emit and expects you to update the headers accordingly so that following requests will be accepted again. - -```ts -replicationState.unauthorized$.subscribe(() => { - replicationState.setHeaders({ - Authorization: 'Bearer S0VLU0UhI...' - }); -}); -``` - -## forbidden$ - -When you client behaves wrong in any case, like update non-allowed values or changing documents that it is not allowed to, -the server will drop the connection and the replication state will emit on the `forbidden$` observable. -It will also automatically stop the replication so that your client does not accidentally DOS attack the server. - -```ts -replicationState.forbidden$.subscribe(() => { - console.log('Client is behaving wrong'); -}); -``` - -## Custom EventSource implementation - -For the server send events, the [eventsource](https://github.com/EventSource/eventsource) npm package is used instead of the native `EventSource` API. We need this because the native browser API does not support sending headers with the request which is required by the server to parse the auth data. - -If the eventsource package does not work for you, you can set an own implementation when creating the replication. - -```ts -const replicationState = await replicateServer({ - /* ... */ - eventSource: MyEventSourceConstructor - /* ... */ -}); -``` diff --git a/docs/replication-supabase.html b/docs/replication-supabase.html deleted file mode 100644 index 4146e93a9c9..00000000000 --- a/docs/replication-supabase.html +++ /dev/null @@ -1,264 +0,0 @@ - - - - - -Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync

    -

    Supabase

    -

    The Supabase Replication Plugin for RxDB delivers seamless, two-way synchronization between your RxDB collections and a Supabase (Postgres) table. It uses PostgREST for pull/push and Supabase Realtime (logical replication) to stream live updates, so your data stays consistent across devices with first-class local-first, offline-ready support.

    -

    Under the hood, the plugin is powered by the RxDB Sync Engine. It handles checkpointed incremental pulls, robust retry logic, and conflict detection/resolution for you. You focus on features—RxDB takes care of sync.

    -
    Supabase in 100 Seconds
    2:36
    Supabase in 100 Seconds
    -

    Key Features of the RxDB-Supabase Plugin

    -
      -
    • Cloud Only Backend: No self-hosted server required. Client devices directly sync with the Supabase Servers.
    • -
    • Two-way replication between Supabase tables and RxDB collections
    • -
    • Offline-first with resumable, incremental sync
    • -
    • Live updates via Supabase Realtime channels
    • -
    • Conflict resolution handled by the RxDB Sync Engine
    • -
    • Works in browsers and Node.js with @supabase/supabase-js
    • -
    -

    Architecture Overview

    -
    Client A
    Supabase
    Client B
    Client C
    -
    -

    Clients connect directly to Supabase using the official JS client. The plugin:

    -
      -
    • Pulls documents over PostgREST using a checkpoint (modified, id) and deterministic ordering.
    • -
    • Pushes inserts/updates using optimistic concurrency guards.
    • -
    • Streams new changes using Supabase Realtime so live replication stays up to date.
    • -
    -
    note

    Because Supabase exposes Postgres over HTTP/WebSocket, you can safely replicate from browsers and mobile apps. Protect your data with Row Level Security (RLS) policies; use the anon key on clients and the service role key only on trusted servers.

    -

    Setting up RxDB ↔ Supabase Sync

    -
    1

    Install Dependencies

    npm install rxdb @supabase/supabase-js
    2

    Create a Supabase Project & Table

    In your supabase project, create a new table. Ensure that:

      -
    • The primary key must have the type text (Primary keys must always be strings in RxDB)
    • -
    • You have an modified field which stores the last modification timestamp of a row (default is _modified)
    • -
    • You have a boolean field which stores if a row should is "deleted". You should not hard-delete rows in Supabase, because clients would miss the deletion if they haven't been online at the deletion time. Instead, use a deleted boolean to mark rows as deleted. This way all clients can still pull the deletion, and RxDB will hide the complexity on the client side.
    • -
    • Enable the realtime observation of writes to the table.
    • -

    Here is an example for a "human" table:

    create extension if not exists moddatetime schema extensions;
    - 
    -create table "public"."humans" (
    -    "passportId" text primary key,
    -    "firstName" text not null,
    -    "lastName" text not null,
    -    "age" integer,
    - 
    -    "_deleted" boolean DEFAULT false NOT NULL,
    -    "_modified" timestamp with time zone DEFAULT now() NOT NULL
    -);
    - 
    --- auto-update the _modified timestamp
    -CREATE TRIGGER update_modified_datetime BEFORE UPDATE ON public.humans FOR EACH ROW
    -EXECUTE FUNCTION extensions.moddatetime('_modified');
    - 
    --- add a table to the publication so we can subscribe to changes
    -alter publication supabase_realtime add table "public"."humans";
    3

    Create an RxDB Database & Collection

    Create a normal RxDB database, then add a collection whose schema mirrors your Supabase table. The primary key must match (same column name and type), and fields should be top-level simple types (string/number/boolean). You don’t need to model server internals: the plugin maps the server’s _deleted flag to doc._deleted automatically, and _modified is optional in your schema (the plugin strips it on push and will include it on pull only if you define it). For browsers use a persistent storage like Localstorage or IndexedDB. For tests you can use the in-memory storage.

    // client
    -import { createRxDatabase } from 'rxdb/plugins/core';
    -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
    - 
    -export const db = await createRxDatabase({
    -  name: 'mydb',
    -  storage: getRxStorageLocalstorage()
    -});
    - 
    -await db.addCollections({
    -  humans: {
    -    schema: {
    -      version: 0,
    -      primaryKey: 'passportId',
    -      type: 'object',
    -      properties: {
    -        passportId: { type: 'string', maxLength: 100 },
    -        firstName:   { type: 'string' },
    -        lastName:    { type: 'string' },
    -        age: { type: 'number' }
    -      },
    -      required: ['passportId', 'firstName', 'lastName']
    -    }
    -  }
    -});
    4

    Create the Supabase Client

    Make a single Supabase client and reuse it across your app. In the browser, use the anon key (RLS-protected). On trusted servers you may use the service role key—but never ship that to clients.

    //> client
    - 
    -import { createClient } from '@supabase/supabase-js';
    - 
    -export const supabase = createClient(
    -  'https://xyzcompany.supabase.co',
    -  'eyJhbGciOi...'
    -);
    5

    Start Replication

    Connect your RxDB collection to the Supabase table to start the replication.

    //> client
    - 
    -import { replicateSupabase } from 'rxdb/plugins/replication-supabase';
    - 
    -const replication = replicateSupabase({
    -  tableName: 'humans',
    -  client: supabase,
    -  collection: db.humans,
    -  replicationIdentifier: 'humans-supabase',
    -  live: true,
    -  pull: {
    -    batchSize: 50,
    -    // optional: shape incoming docs
    -    modifier: (doc) => {
    -      // map nullable age-field
    -      if (!doc.age) delete doc.age;
    -      return doc;
    -    }
    -    // optional: customize the pull query before fetching
    -    queryBuilder: ({ query }) => {
    -      // Add filters, joins, or other PostgREST query modifiers
    -      // This runs before checkpoint filtering and ordering
    -      return query.eq("status", "active");
    -    },
    -  },
    -  push: {
    -    batchSize: 50
    -  },
    -  // optional overrides if your column names differ:
    -  // modifiedField: '_modified',
    -  // deletedField: '_deleted'
    -});
    - 
    -// (optional) observe errors and wait for the first sync barrier
    -replication.error$.subscribe(err => console.error('[replication]', err));
    -await replication.awaitInitialReplication();
    Nullable values must be mapped

    Supabase returns null for nullable columns, but in RxDB you often model those fields as optional (i.e., they can be undefined/missing). To avoid schema errors, map nullundefined in the pull.modifier (usually by deleting the key).

    6

    Do other things with the replication state

    The RxSupabaseReplicationState which is returned from replicateSupabase() allows you to run all functionality of the normal RxReplicationState.

    -

    Follow Up

    -
    - - \ No newline at end of file diff --git a/docs/replication-supabase.md b/docs/replication-supabase.md deleted file mode 100644 index ee4ed0eb41a..00000000000 --- a/docs/replication-supabase.md +++ /dev/null @@ -1,227 +0,0 @@ -# Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync - -> Build real-time, offline-capable apps with RxDB + Supabase. Push/pull changes via PostgREST, stream updates with Realtime, and keep data in sync across devices. - -import {Tabs} from '@site/src/components/tabs'; -import {Steps} from '@site/src/components/steps'; -import {VideoBox} from '@site/src/components/video-box'; -import {RxdbMongoDiagramPlain} from '@site/src/components/mongodb-sync'; - -# Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync - - - -The **Supabase Replication Plugin** for RxDB delivers seamless, two-way synchronization between your RxDB collections and a Supabase (Postgres) table. It uses **PostgREST** for pull/push and **Supabase Realtime** (logical replication) to stream live updates, so your data stays consistent across devices with first-class [local-first](./articles/local-first-future.md), offline-ready support. - -Under the hood, the plugin is powered by the RxDB [Sync Engine](./replication.md). It handles checkpointed incremental pulls, robust retry logic, and [conflict detection/resolution](./transactions-conflicts-revisions.md) for you. You focus on features—RxDB takes care of sync. - -
    - -
    - -## Key Features of the RxDB-Supabase Plugin - -- **Cloud Only Backend**: No self-hosted server required. Client devices directly sync with the Supabase Servers. -- **Two-way replication** between Supabase tables and RxDB [collections](./rx-collection.md) -- **Offline-first** with resumable, incremental sync -- **Live updates** via Supabase Realtime channels -- **Conflict resolution** handled by the [RxDB Sync Engine](./replication.md) -- **Works in browsers and Node.js** with `@supabase/supabase-js` - -## Architecture Overview - - - -Clients connect **directly to Supabase** using the official JS client. The plugin: - -- **Pulls** documents over PostgREST using a checkpoint `(modified, id)` and deterministic ordering. -- **Pushes** inserts/updates using optimistic concurrency guards. -- **Streams** new changes using Supabase Realtime so live replication stays up to date. - -:::note -Because Supabase exposes Postgres over **HTTP/WebSocket**, you can safely replicate from browsers and mobile apps. Protect your data with **Row Level Security (RLS)** policies; use the **anon** key on clients and the **service role** key only on trusted servers. -::: - -## Setting up RxDB ↔ Supabase Sync - - - -### Install Dependencies - -```bash -npm install rxdb @supabase/supabase-js -``` - -### Create a Supabase Project & Table - -In your supabase project, create a new table. Ensure that: -- The primary key must have the type text (Primary keys must always be strings in RxDB) -- You have an modified field which stores the last modification timestamp of a row (default is `_modified`) -- You have a boolean field which stores if a row should is "deleted". You should not hard-delete rows in Supabase, because clients would miss the deletion if they haven't been online at the deletion time. Instead, use a deleted `boolean` to mark rows as deleted. This way all clients can still pull the deletion, and RxDB will hide the complexity on the client side. -- Enable the realtime observation of writes to the table. - -Here is an example for a "human" table: - -```sql -create extension if not exists moddatetime schema extensions; - -create table "public"."humans" ( - "passportId" text primary key, - "firstName" text not null, - "lastName" text not null, - "age" integer, - - "_deleted" boolean DEFAULT false NOT NULL, - "_modified" timestamp with time zone DEFAULT now() NOT NULL -); - --- auto-update the _modified timestamp -CREATE TRIGGER update_modified_datetime BEFORE UPDATE ON public.humans FOR EACH ROW -EXECUTE FUNCTION extensions.moddatetime('_modified'); - --- add a table to the publication so we can subscribe to changes -alter publication supabase_realtime add table "public"."humans"; -``` - -### Create an RxDB Database & Collection - -Create a normal RxDB database, then add a collection whose **schema mirrors your Supabase table**. The **primary key must match** (same column name and type), and fields should be **top-level simple types** (string/number/boolean). You don’t need to model server internals: the plugin maps the server’s \_deleted flag to doc.\_deleted automatically, and \_modified is optional in your schema (the plugin strips it on push and will include it on pull only if you define it). For browsers use a persistent storage like Localstorage or IndexedDB. For tests you can use the [in-memory storage](./rx-storage-memory.md). - -```ts -// client -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -export const db = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage() -}); - -await db.addCollections({ - humans: { - schema: { - version: 0, - primaryKey: 'passportId', - type: 'object', - properties: { - passportId: { type: 'string', maxLength: 100 }, - firstName: { type: 'string' }, - lastName: { type: 'string' }, - age: { type: 'number' } - }, - required: ['passportId', 'firstName', 'lastName'] - } - } -}); -``` - -### Create the Supabase Client - -Make a single Supabase client and reuse it across your app. In the browser, use the anon key (RLS-protected). On trusted servers you may use the service role key—but never ship that to clients. - - - -#### Production - -```ts -//> client - -import { createClient } from '@supabase/supabase-js'; - -export const supabase = createClient( - 'https://xyzcompany.supabase.co', - 'eyJhbGciOi...' -); -``` - -#### Vite - -```ts -//> client - -import { createClient } from '@supabase/supabase-js'; - -export const supabase = createClient( - import.meta.env.VITE_SUPABASE_URL!, // e.g. https://xyzcompany.supabase.co - import.meta.env.VITE_SUPABASE_ANON_KEY! // anon key for browsers - // optional options object here -); -``` - -#### Local Development - -```ts -//> client - -import { createClient } from '@supabase/supabase-js'; - -export const supabase = createClient( - 'http://127.0.0.1:54321', - 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' -); -``` - - - -### Start Replication - -Connect your RxDB collection to the Supabase table to start the replication. - -```ts -//> client - -import { replicateSupabase } from 'rxdb/plugins/replication-supabase'; - -const replication = replicateSupabase({ - tableName: 'humans', - client: supabase, - collection: db.humans, - replicationIdentifier: 'humans-supabase', - live: true, - pull: { - batchSize: 50, - // optional: shape incoming docs - modifier: (doc) => { - // map nullable age-field - if (!doc.age) delete doc.age; - return doc; - } - // optional: customize the pull query before fetching - queryBuilder: ({ query }) => { - // Add filters, joins, or other PostgREST query modifiers - // This runs before checkpoint filtering and ordering - return query.eq("status", "active"); - }, - }, - push: { - batchSize: 50 - }, - // optional overrides if your column names differ: - // modifiedField: '_modified', - // deletedField: '_deleted' -}); - -// (optional) observe errors and wait for the first sync barrier -replication.error$.subscribe(err => console.error('[replication]', err)); -await replication.awaitInitialReplication(); -``` - -:::note Nullable values must be mapped -Supabase returns `null` for nullable columns, but in RxDB you often model those fields as optional (i.e., they can be undefined/missing). To avoid schema errors, map `null` → `undefined` in the `pull.modifier` (usually by deleting the key). -::: - -### Do other things with the replication state - -The `RxSupabaseReplicationState` which is returned from `replicateSupabase()` allows you to run all functionality of the normal [RxReplicationState](./replication.md). - - - -## Follow Up - -- **Replication API Reference:** Learn the core concepts and lifecycle hooks — [Replication](./replication.md) -- **Offline-First Guide:** Caching, retries, and conflict strategies — [Local-First](./articles/local-first-future.md) -- **Supabase Essentials:** - - Row Level Security (RLS) — https://supabase.com/docs/guides/auth/row-level-security - - Realtime — https://supabase.com/docs/guides/realtime - - Local dev with the Supabase CLI — https://supabase.com/docs/guides/cli -- **Community:** Questions or feedback? Join our Discord — [Chat](./chat) diff --git a/docs/replication-webrtc.html b/docs/replication-webrtc.html deleted file mode 100644 index bbfe8b70682..00000000000 --- a/docs/replication-webrtc.html +++ /dev/null @@ -1,212 +0,0 @@ - - - - - -WebRTC P2P Replication with RxDB - Sync Browsers and Devices | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript

    -

    WebRTC P2P data connections are revolutionizing real-time web and mobile development by eliminating central servers in scenarios where clients can communicate directly. With the RxDB Sync Engine, you can sync your local database state across multiple browsers or devices via WebRTC P2P (Peer-to-Peer) connections, ensuring scalable, secure, and low-latency data flows without traditional server bottlenecks.

    -

    What is WebRTC?

    -

    WebRTC stands for Web Real-Time Communication. It is an open standard that enables browsers and native apps to exchange audio, video, or arbitrary data directly between peers, bypassing a central server after the initial connection is established. WebRTC uses NAT traversal techniques like ICE (Interactive Connectivity Establishment) to punch through firewalls and establish direct links. This peer-to-peer nature drastically reduces latency while maintaining high security and end-to-end encryption capabilities.

    -

    For a deeper look at comparing WebRTC with WebSockets and WebTransport, you can read our comprehensive overview. While WebSockets or WebTransport often work in client-server contexts, WebRTC offers direct peer-to-peer connections ideal for fully decentralized data flows.

    -
    WebRTC
    -

    Benefits of P2P Sync with WebRTC Compared to Client-Server Architecture

    -
      -
    1. Reduced Latency - By skipping a central server hop, data travels directly from one client to another, minimizing round-trip times and improving responsiveness.
    2. -
    3. Scalability - New peers can join without overloading a central infrastructure. The sync overhead increases linearly with the number of connections rather than requiring a massive server cluster.
    4. -
    5. Privacy & Ownership - Data stays within the user’s devices, avoiding risks tied to storing data on third-party servers. This design aligns well with local-first or "zero-latency" apps.
    6. -
    7. Resilience - In some scenarios, if the central server is unreachable, P2P connections remain operational (assuming a functioning signaling path). Apps can still replicate data among local networks like when they are in the same Wifi or LAN.
    8. -
    9. Cost Savings - Reducing the reliance on a high-bandwidth server can cut hosting and bandwidth expenses, particularly in high-traffic or IoT-style use cases.
    10. -
    -
    JavaScript Embedded Database
    -

    Peer-to-Peer (P2P) WebRTC Replication with the RxDB JavaScript Database

    -

    Traditionally, real-time data synchronization depends on centralized servers to manage and distribute updates. In contrast, RxDB’s WebRTC P2P replication allows data to flow directly among clients, removing the server as a data store. This approach is live and fully decentralized, requiring only a signaling server for initial discovery:

    -
      -
    • No master-slave concept - each peer hosts its own local RxDB.
    • -
    • Clients (browsers, devices) connect to each other via WebRTC data channels.
    • -
    • The RxDB replication protocol then handles pushing/pulling document changes across peers.
    • -
    -

    Because RxDB is a NoSQL database and the replication protocol is straightforward, setting up robust P2P sync is far easier than orchestrating a complex client-server database architecture.

    -

    Using RxDB with the WebRTC Replication Plugin

    -

    Before you use this plugin, make sure that you understand how WebRTC works. Here we build a todo-app that replicates todo-entries between clients:

    -
    JavaScript Embedded Database
    -

    You can find a fully build example of this at the RxDB Quickstart Repository which you can also try out online.

    -

    Four you create the database and then you can configure the replication:

    -
    1

    Create the Database and Collection

    Here we create a database with the localstorage based storage that stores data inside of the LocalStorage API in a browser. RxDB has a wide range of storages for other JavaScript runtimes.

    import { createRxDatabase } from 'rxdb/plugins/core';
    -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
    -const db = await createRxDatabase({
    -  name: 'myTodoDB',
    -  storage: getRxStorageLocalstorage()
    -});
    - 
    -await db.addCollections({
    -  todos: {
    -    schema: {
    -      title: 'todo schema',
    -      version: 0,
    -      type: 'object',
    -      primaryKey: 'id',
    -      properties: {
    -        id:      { type: 'string', maxLength: 100 },
    -        title:   { type: 'string' },
    -        done:    { type: 'boolean', default: false },
    -        created: { type: 'string', format: 'date-time' }
    -      },
    -      required: ['id', 'title', 'done']
    -    }
    -  }
    -});
    - 
    -// insert an example document
    -await db.todos.insert({
    -  id: 'todo-1',
    -  title: 'P2P demo task',
    -  done: false,
    -  created: new Date().toISOString()
    -});
    2

    Import the WebRTC replication plugin

    import {
    -  replicateWebRTC,
    -  getConnectionHandlerSimplePeer
    -} from 'rxdb/plugins/replication-webrtc';
    3

    Start the P2P replication

    To start the replication you have to call replicateWebRTC on the collection.

    As options you have to provide a topic and a connection handler function that implements the P2PConnectionHandlerCreator interface. As default you should start with the getConnectionHandlerSimplePeer method which uses the simple-peer library and comes shipped with RxDB.

    const replicationPool = await replicateWebRTC(
    -    {
    -        // Start the replication for a single collection
    -        collection: db.todos,
    - 
    -        // The topic is like a 'room-name'. All clients with the same topic
    -        // will replicate with each other. In most cases you want to use
    -        // a different topic string per user. Also you should prefix the topic with
    -        // a unique identifier for your app, to ensure you do not let your users connect
    -        // with other apps that also use the RxDB P2P Replication.
    -        topic: 'my-users-pool',
    -        /**
    -         * You need a collection handler to be able to create WebRTC connections.
    -         * Here we use the simple peer handler which uses the 'simple-peer' npm library.
    -         * To learn how to create a custom connection handler, read the source code,
    -         * it is pretty simple.
    -         */
    -        connectionHandlerCreator: getConnectionHandlerSimplePeer({
    -            // Set the signaling server url.
    -            // You can use the server provided by RxDB for tryouts,
    -            // but in production you should use your own server instead.
    -            signalingServerUrl: 'wss://signaling.rxdb.info/',
    - 
    -            // only in Node.js, we need the wrtc library
    -            // because Node.js does not contain the WebRTC API.
    -            wrtc: require('node-datachannel/polyfill'),
    - 
    -            // only in Node.js, we need the WebSocket library
    -            // because Node.js does not contain the WebSocket API.
    -            webSocketConstructor: require('ws').WebSocket
    -        }),
    -        pull: {},
    -        push: {}
    -    }
    -);

    Notice that in difference to the other replication plugins, the WebRTC replication returns a replicationPool instead of a single RxReplicationState. The replicationPool contains all replication states of the connected peers in the P2P network.

    4

    Observe Errors

    To ensure we log out potential errors, observe the error$ observable of the pool.

    replicationPool.error$.subscribe(err => console.error('WebRTC Error:', err));
    5

    Stop the Replication

    You can also dynamically stop the replication.

    replicationPool.cancel();
    -

    Live replications

    -

    The WebRTC replication is always live because there can not be a one-time sync when it is always possible to have new Peers that join the connection pool. Therefore you cannot set the live: false option like in the other replication plugins.

    -

    Signaling Server

    -

    For P2P replication to work with the RxDB WebRTC Replication Plugin, a signaling server is required. The signaling server helps peers discover each other and establish connections.

    -

    RxDB ships with a default signaling server that can be used with the simple-peer connection handler. This server is made for demonstration purposes and tryouts. It is not reliable and might be offline at any time. -In production you must always use your own signaling server instead!

    -

    Creating a basic signaling server is straightforward. The provided example uses 'socket.io' for WebSocket communication. However, in production, you'd want to create a more robust signaling server with authentication and additional logic to suit your application's needs.

    -

    Here is a quick example implementation of a signaling server that can be used with the connection handler from getConnectionHandlerSimplePeer():

    -
    import {
    -    startSignalingServerSimplePeer
    -} from 'rxdb/plugins/replication-webrtc';
    - 
    -const serverState = await startSignalingServerSimplePeer({
    -    port: 8080 // <- port
    -});
    -

    For custom signaling servers with more complex logic, you can check the source code of the default one.

    -

    Peer Validation

    -

    By default the replication will replicate with every peer the signaling server tells them about. -You can prevent invalid peers from replication by passing a custom isPeerValid() function that either returns true on valid peers and false on invalid peers.

    -
    const replicationPool = await replicateWebRTC(
    -    {
    -        /* ... */
    -        isPeerValid: async (peer) => {
    -            return true;
    -        }
    -        pull: {},
    -        push: {}
    -        /* ... */
    -    }
    -);
    -

    Conflict detection in WebRTC replication

    -

    RxDB's conflict handling works by detecting and resolving conflicts that may arise when multiple clients in a decentralized database system attempt to modify the same data concurrently. -A custom conflict handler can be set up, which is a plain JavaScript function. The conflict handler is run on each replicated document write and resolves the conflict if required. Find out more about RxDB conflict handling here

    -

    Known problems

    -

    SimplePeer requires to have process.nextTick()

    -

    In the browser you might not have a process variable or process.nextTick() method. But the simple peer uses that so you have to polyfill it.

    -

    In webpack you can use the process/browser package to polyfill it:

    -
    const plugins = [
    -    /* ... */
    -    new webpack.ProvidePlugin({
    -        process: 'process/browser',
    -    })
    -    /* ... */
    -];
    -

    In angular or other libraries you can add the polyfill manually:

    -
    window.process = {
    -    nextTick: (fn, ...args) => setTimeout(() => fn(...args)),
    -};
    - 
    -

    Polyfill the WebSocket and WebRTC API in Node.js

    -

    While all modern browsers support the WebRTC and WebSocket APIs, they is missing in Node.js which will throw the error No WebRTC support: Specify opts.wrtc option in this environment. Therefore you have to polyfill it with a compatible WebRTC and WebSocket polyfill. It is recommended to use the node-datachannel package for WebRTC which does not come with RxDB but has to be installed before via npm install node-datachannel --save. -For the Websocket API use the ws package that is included into RxDB.

    -
    import nodeDatachannelPolyfill from 'node-datachannel/polyfill';
    -import { WebSocket } from 'ws';
    -const replicationPool = await replicateWebRTC(
    -    {
    -        /* ... */
    -        connectionHandlerCreator: getConnectionHandlerSimplePeer({
    -            signalingServerUrl: 'wss://example.com:8080',
    -            wrtc: nodeDatachannelPolyfill,
    -            webSocketConstructor: WebSocket
    -        }),
    -        pull: {},
    -        push: {}
    -        /* ... */
    -    }
    -);
    -

    Storing replicated data encrypted on client device

    -

    Storing replicated data encrypted on client devices using the RxDB Encryption Plugin is a pivotal step towards bolstering data security and user privacy. -The WebRTC replication plugin seamlessly integrates with the RxDB encryption plugins, providing a robust solution for encrypting sensitive information before it's stored locally. By doing so, it ensures that even if unauthorized access to the device occurs, the data remains protected and unintelligible without the encryption key (or password). This approach is particularly vital in scenarios where user-generated content or confidential data is replicated across devices, as it empowers users with control over their own data while adhering to stringent security standards. Read more about the encryption plugins here.

    -

    Follow Up

    -
    - - \ No newline at end of file diff --git a/docs/replication-webrtc.md b/docs/replication-webrtc.md deleted file mode 100644 index 8d90bb07cd9..00000000000 --- a/docs/replication-webrtc.md +++ /dev/null @@ -1,284 +0,0 @@ -# WebRTC P2P Replication with RxDB - Sync Browsers and Devices - -> Learn to set up peer-to-peer WebRTC replication with RxDB. Bypass central servers and enjoy secure, low-latency data sync across all clients. - -import {Steps} from '@site/src/components/steps'; - -# P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript - -WebRTC P2P data connections are revolutionizing real-time web and mobile development by **eliminating central servers** in scenarios where clients can communicate directly. With the **RxDB** [Sync Engine](./replication.md), you can sync your local database state across multiple browsers or devices via **WebRTC P2P (Peer-to-Peer)** connections, ensuring scalable, secure, and **low-latency** data flows without traditional server bottlenecks. - -## What is WebRTC? - -[WebRTC](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API) stands for Web [Real-Time](./articles/realtime-database.md) Communication. It is an open standard that enables browsers and native apps to exchange audio, video, or **arbitrary data** directly between peers, bypassing a central server after the initial connection is established. WebRTC uses NAT traversal techniques like [ICE](https://developer.liveswitch.io/liveswitch-server/guides/what-are-stun-turn-and-ice.html) (Interactive Connectivity Establishment) to punch through firewalls and establish direct links. This peer-to-peer nature drastically reduces latency while maintaining **high security** and **end-to-end encryption** capabilities. - -For a deeper look at comparing WebRTC with **WebSockets** and **WebTransport**, you can read our [comprehensive overview](./articles/websockets-sse-polling-webrtc-webtransport.md). While WebSockets or WebTransport often work in client-server contexts, WebRTC offers direct peer-to-peer connections ideal for fully decentralized data flows. - -
    - - - -
    - -## Benefits of P2P Sync with WebRTC Compared to Client-Server Architecture - -1. **Reduced Latency** - By skipping a central server hop, data travels directly from one client to another, minimizing round-trip times and improving responsiveness. -2. **Scalability** - New peers can join without overloading a central infrastructure. The sync overhead increases linearly with the number of connections rather than requiring a massive server cluster. -3. **Privacy & Ownership** - Data stays within the user’s devices, avoiding risks tied to storing data on third-party servers. This design aligns well with [local-first](./articles/local-first-future.md) or "[zero-latency](./articles/zero-latency-local-first.md)" apps. -4. **Resilience** - In some scenarios, if the central server is unreachable, P2P connections remain operational (assuming a functioning signaling path). Apps can still replicate data among local networks like when they are in the same Wifi or LAN. -5. **Cost Savings** - Reducing the reliance on a high-bandwidth server can cut hosting and bandwidth expenses, particularly in high-traffic or IoT-style use cases. - -
    - - - -
    - -## Peer-to-Peer (P2P) WebRTC Replication with the RxDB JavaScript Database - -Traditionally, real-time data synchronization depends on **centralized servers** to manage and distribute updates. In contrast, RxDB’s WebRTC P2P replication allows data to flow **directly** among clients, removing the server as a data store. This approach is **live** and **fully decentralized**, requiring only a [signaling server](#signaling-server) for initial discovery: - -- **No master-slave** concept - each peer hosts its own local RxDB. -- Clients ([browsers](./articles/browser-database.md), devices) connect to each other via WebRTC data channels. -- The [RxDB replication protocol](./replication.md) then handles pushing/pulling document changes across peers. - -Because RxDB is a NoSQL database and the replication protocol is straightforward, setting up robust P2P sync is far **easier** than orchestrating a complex client-server database architecture. - -## Using RxDB with the WebRTC Replication Plugin - -Before you use this plugin, make sure that you understand how [WebRTC works](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API). Here we build a todo-app that replicates todo-entries between clients: - -
    - - - -
    - -You can find a fully build example of this at the [RxDB Quickstart Repository](https://github.com/pubkey/rxdb-quickstart) which you can also [try out online](https://pubkey.github.io/rxdb-quickstart/). - -Four you create the [database](./rx-database.md) and then you can configure the replication: - - - -### Create the Database and Collection - -Here we create a database with the [localstorage](./rx-storage-localstorage.md) based storage that stores data inside of the [LocalStorage API](./articles/localstorage.md) in a browser. RxDB has a wide [range of storages](./rx-storage.md) for other JavaScript runtimes. - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -const db = await createRxDatabase({ - name: 'myTodoDB', - storage: getRxStorageLocalstorage() -}); - -await db.addCollections({ - todos: { - schema: { - title: 'todo schema', - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string', maxLength: 100 }, - title: { type: 'string' }, - done: { type: 'boolean', default: false }, - created: { type: 'string', format: 'date-time' } - }, - required: ['id', 'title', 'done'] - } - } -}); - -// insert an example document -await db.todos.insert({ - id: 'todo-1', - title: 'P2P demo task', - done: false, - created: new Date().toISOString() -}); -``` - -### Import the WebRTC replication plugin - -```ts -import { - replicateWebRTC, - getConnectionHandlerSimplePeer -} from 'rxdb/plugins/replication-webrtc'; -``` - -### Start the P2P replication - -To start the replication you have to call `replicateWebRTC` on the [collection](./rx-collection.md). - -As options you have to provide a `topic` and a connection handler function that implements the `P2PConnectionHandlerCreator` interface. As default you should start with the `getConnectionHandlerSimplePeer` method which uses the [simple-peer](https://github.com/feross/simple-peer) library and comes shipped with RxDB. - -```ts -const replicationPool = await replicateWebRTC( - { - // Start the replication for a single collection - collection: db.todos, - - // The topic is like a 'room-name'. All clients with the same topic - // will replicate with each other. In most cases you want to use - // a different topic string per user. Also you should prefix the topic with - // a unique identifier for your app, to ensure you do not let your users connect - // with other apps that also use the RxDB P2P Replication. - topic: 'my-users-pool', - /** - * You need a collection handler to be able to create WebRTC connections. - * Here we use the simple peer handler which uses the 'simple-peer' npm library. - * To learn how to create a custom connection handler, read the source code, - * it is pretty simple. - */ - connectionHandlerCreator: getConnectionHandlerSimplePeer({ - // Set the signaling server url. - // You can use the server provided by RxDB for tryouts, - // but in production you should use your own server instead. - signalingServerUrl: 'wss://signaling.rxdb.info/', - - // only in Node.js, we need the wrtc library - // because Node.js does not contain the WebRTC API. - wrtc: require('node-datachannel/polyfill'), - - // only in Node.js, we need the WebSocket library - // because Node.js does not contain the WebSocket API. - webSocketConstructor: require('ws').WebSocket - }), - pull: {}, - push: {} - } -); -``` - -Notice that in difference to the other [replication plugins](./replication.md), the WebRTC replication returns a `replicationPool` instead of a single `RxReplicationState`. The `replicationPool` contains all replication states of the connected peers in the P2P network. - -### Observe Errors - -To ensure we log out potential errors, observe the `error$` observable of the pool. - -```ts -replicationPool.error$.subscribe(err => console.error('WebRTC Error:', err)); -``` - -### Stop the Replication - -You can also dynamically stop the replication. -```ts -replicationPool.cancel(); -``` - - -## Live replications - -The WebRTC replication is **always live** because there can not be a one-time sync when it is always possible to have new Peers that join the connection pool. Therefore you cannot set the `live: false` option like in the other replication plugins. - -## Signaling Server - -For P2P replication to work with the RxDB WebRTC Replication Plugin, a [signaling server](https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Signaling_and_video_calling) is required. The signaling server helps peers discover each other and establish connections. - -RxDB ships with a default signaling server that can be used with the simple-peer connection handler. This server is made for demonstration purposes and tryouts. It is not reliable and might be offline at any time. -In production you must always use your own signaling server instead! - -Creating a basic signaling server is straightforward. The provided example uses 'socket.io' for WebSocket communication. However, in production, you'd want to create a more robust signaling server with authentication and additional logic to suit your application's needs. - -Here is a quick example implementation of a signaling server that can be used with the connection handler from `getConnectionHandlerSimplePeer()`: - -```ts -import { - startSignalingServerSimplePeer -} from 'rxdb/plugins/replication-webrtc'; - -const serverState = await startSignalingServerSimplePeer({ - port: 8080 // <- port -}); -``` - -For custom signaling servers with more complex logic, you can check the [source code of the default one](https://github.com/pubkey/rxdb/blob/master/src/plugins/replication-webrtc/signaling-server.ts). - -## Peer Validation - -By default the replication will replicate with every peer the signaling server tells them about. -You can prevent invalid peers from replication by passing a custom `isPeerValid()` function that either returns `true` on valid peers and `false` on invalid peers. - -```ts -const replicationPool = await replicateWebRTC( - { - /* ... */ - isPeerValid: async (peer) => { - return true; - } - pull: {}, - push: {} - /* ... */ - } -); -``` - -## Conflict detection in WebRTC replication - -RxDB's conflict handling works by detecting and resolving conflicts that may arise when multiple clients in a decentralized database system attempt to modify the same data concurrently. -A **custom conflict handler** can be set up, which is a plain JavaScript function. The conflict handler is run on each replicated document write and resolves the conflict if required. [Find out more about RxDB conflict handling here](https://rxdb.info/transactions-conflicts-revisions.html) - -## Known problems - -### SimplePeer requires to have `process.nextTick()` - -In the browser you might not have a process variable or process.nextTick() method. But the [simple peer](https://github.com/feross/simple-peer) uses that so you have to polyfill it. - -In webpack you can use the `process/browser` package to polyfill it: - -```js -const plugins = [ - /* ... */ - new webpack.ProvidePlugin({ - process: 'process/browser', - }) - /* ... */ -]; -``` - -In angular or other libraries you can add the polyfill manually: - -```js -window.process = { - nextTick: (fn, ...args) => setTimeout(() => fn(...args)), -}; - -``` - -### Polyfill the WebSocket and WebRTC API in Node.js - -While all modern browsers support the WebRTC and WebSocket APIs, they is missing in Node.js which will throw the error `No WebRTC support: Specify opts.wrtc option in this environment`. Therefore you have to polyfill it with a compatible WebRTC and WebSocket polyfill. It is recommended to use the [node-datachannel package](https://github.com/murat-dogan/node-datachannel/tree/master/src/polyfill) for WebRTC which **does not** come with RxDB but has to be installed before via `npm install node-datachannel --save`. -For the Websocket API use the `ws` package that is included into RxDB. - -```ts -import nodeDatachannelPolyfill from 'node-datachannel/polyfill'; -import { WebSocket } from 'ws'; -const replicationPool = await replicateWebRTC( - { - /* ... */ - connectionHandlerCreator: getConnectionHandlerSimplePeer({ - signalingServerUrl: 'wss://example.com:8080', - wrtc: nodeDatachannelPolyfill, - webSocketConstructor: WebSocket - }), - pull: {}, - push: {} - /* ... */ - } -); -``` - -## Storing replicated data encrypted on client device - -Storing replicated data encrypted on client devices using the RxDB Encryption Plugin is a pivotal step towards bolstering **data security** and **user privacy**. -The WebRTC replication plugin seamlessly integrates with the [RxDB encryption plugins](./encryption.md), providing a robust solution for encrypting sensitive information before it's stored locally. By doing so, it ensures that even if unauthorized access to the device occurs, the data remains protected and unintelligible without the encryption key (or password). This approach is particularly vital in scenarios where user-generated content or confidential data is replicated across devices, as it empowers users with control over their own data while adhering to stringent security standards. [Read more about the encryption plugins here](./encryption.md). - -## Follow Up - -- **Check out the [RxDB Quickstart](./quickstart.md)** to see how to set up your first RxDB database. -- **Explore advanced features** like [Custom Conflict Handling](./transactions-conflicts-revisions.md) or [Offline-First Performance](./rx-storage-performance.md). -- **Try an example** at [RxDB Quickstart GitHub](https://github.com/pubkey/rxdb-quickstart) to see a working P2P Sync setup. -- **Join the RxDB Community** on [GitHub](/code/) or [Discord](/chat/) if you have questions or want to share your P2P WebRTC experiences. diff --git a/docs/replication-websocket.html b/docs/replication-websocket.html deleted file mode 100644 index a5d4e5de18a..00000000000 --- a/docs/replication-websocket.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - -Websocket Replication | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Websocket Replication

    -

    With the websocket replication plugin, you can spawn a websocket server from a RxDB database in Node.js and replicate with it.

    -
    note

    The websocket replication plugin does not have any concept for authentication or permission handling. It is designed to create an easy server-to-server replication. It is not made for client-server replication. Make a pull request if you need that feature.

    -

    Starting the Websocket Server

    -
    import { createRxDatabase } from 'rxdb';
    -import {
    -    startWebsocketServer
    -} from 'rxdb/plugins/replication-websocket';
    - 
    -// create a RxDatabase like normal
    -const myDatabase = await createRxDatabase({/* ... */});
    - 
    -// start a websocket server
    -const serverState = await startWebsocketServer({
    -    database: myDatabase,
    -    port: 1337,
    -    path: '/socket'
    -});
    - 
    -// stop the server
    -await serverState.close();
    -

    Connect to the Websocket Server

    -

    The replication has to be started once for each collection that you want to replicate.

    -
    import {
    -    replicateWithWebsocketServer
    -} from 'rxdb/plugins/replication-websocket';
    - 
    -// start the replication
    -const replicationState = await replicateWithWebsocketServer({
    -    /**
    -     * To make the replication work,
    -     * the client collection name must be equal
    -     * to the server collection name.
    -     */
    -    collection: myRxCollection,
    -    url: 'ws://localhost:1337/socket'
    -});
    - 
    -// stop the replication
    -await replicationState.cancel();
    -

    Customize

    -

    We use the ws npm library, so you can use all optional configuration provided by it. -This is especially important to improve performance by opting in of some optional settings.

    - - \ No newline at end of file diff --git a/docs/replication-websocket.md b/docs/replication-websocket.md deleted file mode 100644 index 3f7e3bb0e85..00000000000 --- a/docs/replication-websocket.md +++ /dev/null @@ -1,62 +0,0 @@ -# Websocket Replication - -> With the websocket replication plugin, you can spawn a websocket server from a RxDB database in Node.js and replicate with it. - -# Websocket Replication - -With the websocket replication plugin, you can spawn a websocket server from a RxDB database in Node.js and replicate with it. - -:::note -The websocket replication plugin does not have any concept for authentication or permission handling. It is designed to create an easy **server-to-server** replication. It is **not** made for client-server replication. Make a pull request if you need that feature. -::: - -## Starting the Websocket Server - -```ts -import { createRxDatabase } from 'rxdb'; -import { - startWebsocketServer -} from 'rxdb/plugins/replication-websocket'; - -// create a RxDatabase like normal -const myDatabase = await createRxDatabase({/* ... */}); - -// start a websocket server -const serverState = await startWebsocketServer({ - database: myDatabase, - port: 1337, - path: '/socket' -}); - -// stop the server -await serverState.close(); -``` - -## Connect to the Websocket Server - -The replication has to be started once for each collection that you want to replicate. - -```ts -import { - replicateWithWebsocketServer -} from 'rxdb/plugins/replication-websocket'; - -// start the replication -const replicationState = await replicateWithWebsocketServer({ - /** - * To make the replication work, - * the client collection name must be equal - * to the server collection name. - */ - collection: myRxCollection, - url: 'ws://localhost:1337/socket' -}); - -// stop the replication -await replicationState.cancel(); -``` - -## Customize - -We use the [ws](https://www.npmjs.com/package/ws) npm library, so you can use all optional configuration provided by it. -This is especially important to improve performance by opting in of some optional settings. diff --git a/docs/replication.html b/docs/replication.html deleted file mode 100644 index a73cb684090..00000000000 --- a/docs/replication.html +++ /dev/null @@ -1,559 +0,0 @@ - - - - - -⚙️ RxDB realtime Sync Engine for Local-First Apps | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxDB's realtime Sync Engine for Local-First Apps

    -

    The RxDB Sync Engine provides the ability to sync the database state in realtime between the clients and the server.

    -

    The backend server does not have to be a RxDB instance; you can build a replication with any infrastructure. -For example you can replicate with a custom GraphQL endpoint or a HTTP server on top of a PostgreSQL or MongoDB database.

    -

    The replication is made to support the Local-First paradigm, so that when the client goes offline, the RxDB database can still read and write locally and will continue the replication when the client goes online again.

    -

    Design Decisions of the Sync Engine

    -

    In contrast to other (server-side) database replication protocols, the RxDB Sync Engine was designed with these goals in mind:

    -
      -
    • Easy to Understand: The sync engine works in a simple "git-like" way that is easy to understand for an average developer. You only have to understand how three simple endpoints work.
    • -
    • Complex Parts are in RxDB, not in the Backend: The complex parts of the Sync Engine, like conflict handling or offline-online switches, are implemented inside of RxDB itself. This makes creating a compatible backend very easy.
    • -
    • Compatible with any Backend: Because the complex parts are in RxDB, the backend can be "dump" which makes the protocol compatible to almost every backend. No matter if you use PostgreSQL, MongoDB or anything else.
    • -
    • Performance is optimized for Client Devices and Browsers: By grouping updates and fetches into batches, it is faster to transfer and easier to compress. Client devices and browsers can also process this data faster, for example running JSON.parse() on a chunk of data is faster than calling it once per row. Same goes for how client side storage like IndexedDB or OPFS works where writing data in bulks is faster.
    • -
    • Offline-First Support: By incorporating conflict handling at the client side, the protocol fully supports offline-first apps. Users can continue making changes while offline, and those updates will sync seamlessly once a connection is reestablished - all without risking data loss or having undefined behavior.
    • -
    • Multi-Tab Support: When RxDB is used in a browser and multiple tabs of the same application are opened, only exactly one runs the replication at any given time. This reduces client- and backend resources.
    • -
    -

    The Sync Engine on the document level

    -

    On the RxDocument level, the replication works like git, where the fork/client contains all new writes and must be merged with the master/server before it can push its new state to the master/server.

    -
    A---B-----------D   master/server state
    -     \         /
    -      B---C---D     fork/client state
    -
    -
      -
    • The client pulls the latest state B from the master.
    • -
    • The client does some changes C+D.
    • -
    • The client pushes these changes to the master by sending the latest known master state B and the new client state D of the document.
    • -
    • If the master state is equal to the latest master B state of the client, the new client state D is set as the latest master state.
    • -
    • If the master also had changes and so the latest master change is different then the one that the client assumes, we have a conflict that has to be resolved on the client.
    • -
    -

    The Sync Engine on the transfer level

    -

    When document states are transferred, all handlers use batches of documents for better performance. -The server must implement the following methods to be compatible with the replication:

    -
      -
    • pullHandler Get the last checkpoint (or null) as input. Returns all documents that have been written after the given checkpoint. Also returns the checkpoint of the latest written returned document.
    • -
    • pushHandler a method that can be called by the client to send client side writes to the master. It gets an array with the assumedMasterState and the newForkState of each document write as input. It must return an array that contains the master document states of all conflicts. If there are no conflicts, it must return an empty array.
    • -
    • pullStream an observable that emits batches of all master writes and the latest checkpoint of the write batches.
    • -
    -
            +--------+                             +--------+ 
    -        |        | pullHandler()               |        |
    -        |        |--------------------->       |        | 
    -        |        |                             |        | 
    -        |        |                             |        |
    -        | Client | pushHandler()               | Server |
    -        |        |--------------------->       |        | 
    -        |        |                             |        |
    -        |        |   pullStream$               |        | 
    -        |        |   <-------------------------|        | 
    -        +--------+                             +--------+
    -
    -

    The replication runs in two different modes:

    -

    Checkpoint iteration

    -

    On first initial replication, or when the client comes online again, a checkpoint based iteration is used to catch up with the server state. -A checkpoint is a subset of the fields of the last pulled document. When the checkpoint is send to the backend via pullHandler(), the backend must be able to respond with all documents that have been written after the given checkpoint. -For example if your documents contain an id and an updatedAt field, these two can be used as checkpoint.

    -

    When the checkpoint iteration reaches the last checkpoint, where the backend returns an empty array because there are no newer documents, the replication will automatically switch to the event observation mode.

    -

    Event observation

    -

    While the client is connected to the backend, the events from the backend are observed via pullStream$ and persisted to the client.

    -

    If your backend for any reason is not able to provide a full pullStream$ that contains all events and the checkpoint, you can instead only emit RESYNC events that tell RxDB that anything unknown has changed on the server and it should run the pull replication via checkpoint iteration.

    -

    When the client goes offline and online again, it might happen that the pullStream$ has missed out some events. Therefore the pullStream$ should also emit a RESYNC event each time the client reconnects, so that the client can become in sync with the backend via the checkpoint iteration mode.

    -

    Data layout on the server

    -

    To use the replication you first have to ensure that:

    -
      -
    • -

      documents are deterministic sortable by their last write time

      -

      deterministic means that even if two documents have the same last write time, they have a predictable sort order. -This is most often ensured by using the primaryKey as second sort parameter as part of the checkpoint.

      -
    • -
    • -

      documents are never deleted, instead the _deleted field is set to true.

      -

      This is needed so that the deletion state of a document exists in the database and can be replicated with other instances. If your backend uses a different field to mark deleted documents, you have to transform the data in the push/pull handlers or with the modifiers.

      -
    • -
    -

    For example if your documents look like this:

    -
    const docData = {
    -    "id": "foobar",
    -    "name": "Alice",
    -    "lastName": "Wilson",
    -    /**
    -     * Contains the last write timestamp
    -     * so all documents writes can be sorted by that value
    -     * when they are fetched from the remote instance.
    -     */
    -    "updatedAt": 1564483474,
    -    /**
    -     * Instead of physically deleting documents,
    -     * a deleted document gets replicated.
    -     */
    -    "_deleted": false
    -}
    -

    Then your data is always sortable by updatedAt. This ensures that when RxDB fetches 'new' changes via pullHandler(), it can send the latest updatedAt+id checkpoint to the remote endpoint and then receive all newer documents.

    -

    By default, the field is _deleted. If your remote endpoint uses a different field to mark deleted documents, you can set the deletedField in the replication options which will automatically map the field on all pull and push requests.

    -

    Conflict handling

    -

    When multiple clients (or the server) modify the same document at the same time (or when they are offline), it can happen that a conflict arises during the replication.

    -
    A---B1---C1---X    master/server state
    -     \       /
    -      B1---C2      fork/client state
    -
    -

    In the case above, the client would tell the master to move the document state from B1 to C2 by calling pushHandler(). But because the actual master state is C1 and not B1, the master would reject the write by sending back the actual master state C1. -RxDB resolves all conflicts on the client so it would call the conflict handler of the RxCollection and create a new document state D that can then be written to the master.

    -
    A---B1---C1---X---D    master/server state
    -     \       / \ /
    -      B1---C2---D      fork/client state
    -
    -

    The default conflict handler will always drop the fork state and use the master state. This ensures that clients that are offline for a very long time, do not accidentally overwrite other peoples changes when they go online again. -You can specify a custom conflict handler by setting the property conflictHandler when calling addCollection().

    -

    Learn how to create a custom conflict handler.

    -

    replicateRxCollection()

    -

    You can start the replication of a single RxCollection by calling replicateRxCollection() like in the following:

    -
    import { replicateRxCollection } from 'rxdb/plugins/replication';
    -import {
    -    lastOfArray
    -} from 'rxdb';
    -const replicationState = await replicateRxCollection({
    -    collection: myRxCollection,
    -    /**
    -     * An id for the replication to identify it
    -     * and so that RxDB is able to resume the replication on app reload.
    -     * If you replicate with a remote server, it is recommended to put the
    -     * server url into the replicationIdentifier.
    -     */
    -    replicationIdentifier: 'my-rest-replication-to-https://example.com/api/sync',
    -    /**
    -     * By default it will do an ongoing realtime replication.
    -     * By settings live: false the replication will run once until the local state
    -     * is in sync with the remote state, then it will cancel itself.
    -     * (optional), default is true.
    -     */
    -    live: true,
    -    /**
    -     * Time in milliseconds after when a failed backend request
    -     * has to be retried.
    -     * This time will be skipped if a offline->online switch is detected
    -     * via navigator.onLine
    -     * (optional), default is 5 seconds.
    -     */
    -    retryTime: 5 * 1000,
    -    /**
    -     * When multiInstance is true, like when you use RxDB in multiple browser tabs,
    -     * the replication should always run in only one of the open browser tabs.
    -     * If waitForLeadership is true, it will wait until the current instance is leader.
    -     * If waitForLeadership is false, it will start replicating, even if it is not leader.
    -     * [default=true]
    -     */
    -    waitForLeadership: true,
    -    /**
    -     * If this is set to false,
    -     * the replication will not start automatically
    -     * but will wait for replicationState.start() being called.
    -     * (optional), default is true
    -     */
    -    autoStart: true,
    - 
    -    /**
    -     * Custom deleted field, the boolean property of the document data that
    -     * marks a document as being deleted.
    -     * If your backend uses a different fieldname then '_deleted', set the fieldname here.
    -     * RxDB will still store the documents internally with '_deleted', setting this field
    -     * only maps the data on the data layer.
    -     * 
    -     * If a custom deleted field contains a non-boolean value, the deleted state
    -     * of the documents depends on if the value is truthy or not. So instead of providing a boolean * * deleted value, you could also work with using a 'deletedAt' timestamp instead.
    -     * 
    -     * [default='_deleted']
    -     */
    -    deletedField: 'deleted',
    - 
    -    /**
    -     * Optional,
    -     * only needed when you want to replicate local changes to the remote instance.
    -     */
    -    push: {
    -        /**
    -         * Push handler
    -         */
    -        async handler(docs) {
    -            /**
    -             * Push the local documents to a remote REST server.
    -             */
    -            const rawResponse = await fetch('https://example.com/api/sync/push', {
    -                method: 'POST',
    -                headers: {
    -                    'Accept': 'application/json',
    -                    'Content-Type': 'application/json'
    -                },
    -                body: JSON.stringify({ docs })
    -            });
    -            /**
    -             * Contains an array with all conflicts that appeared during this push.
    -             * If there were no conflicts, return an empty array.
    -             */
    -            const response = await rawResponse.json();
    -            return response;
    -        },
    -        /**
    -         * Batch size, optional
    -         * Defines how many documents will be given to the push handler at once.
    -         */
    -        batchSize: 5,
    -        /**
    -         * Modifies all documents before they are given to the push handler.
    -         * Can be used to swap out a custom deleted flag instead of the '_deleted' field.
    -         * If the push modifier return null, the document will be skipped and not send to the remote.
    -         * Notice that the modifier can be called multiple times and should not contain any side effects.
    -         * (optional)
    -         */
    -        modifier: d => d
    -    },
    -    /**
    -     * Optional,
    -     * only needed when you want to replicate remote changes to the local state.
    -     */
    -    pull: {
    -        /**
    -         * Pull handler
    -         */
    -        async handler(lastCheckpoint, batchSize) {
    -            const minTimestamp = lastCheckpoint ? lastCheckpoint.updatedAt : 0;
    -            /**
    -             * In this example we replicate with a remote REST server
    -             */
    -            const response = await fetch(
    -                `https://example.com/api/sync/?minUpdatedAt=${minTimestamp}&limit=${batchSize}`
    -            );
    -            const documentsFromRemote = await response.json();
    -            return {
    -                /**
    -                 * Contains the pulled documents from the remote.
    -                 * Not that if documentsFromRemote.length < batchSize,
    -                 * then RxDB assumes that there are no more un-replicated documents
    -                 * on the backend, so the replication will switch to 'Event observation' mode.
    -                 */
    -                documents: documentsFromRemote,
    -                /**
    -                 * The last checkpoint of the returned documents.
    -                 * On the next call to the pull handler,
    -                 * this checkpoint will be passed as 'lastCheckpoint'
    -                 */
    -                checkpoint: documentsFromRemote.length === 0 ? lastCheckpoint : {
    -                    id: lastOfArray(documentsFromRemote).id,
    -                    updatedAt: lastOfArray(documentsFromRemote).updatedAt
    -                }
    -            };
    -        },
    -        batchSize: 10,
    -        /**
    -         * Modifies all documents after they have been pulled
    -         * but before they are used by RxDB.
    -         * Notice that the modifier can be called multiple times and should not contain any side effects.
    -         * (optional)
    -         */
    -        modifier: d => d,
    -        /**
    -         * Stream of the backend document writes.
    -         * See below.
    -         * You only need a stream$ when you have set live=true
    -         */
    -        stream$: pullStream$.asObservable()
    -    },
    -});
    - 
    - 
    -/**
    - * Creating the pull stream for realtime replication.
    - * Here we use a websocket but any other way of sending data to the client can be used,
    - * like long polling or server-sent events.
    - */
    -const pullStream$ = new Subject<RxReplicationPullStreamItem<any, any>>();
    -let firstOpen = true;
    -function connectSocket() {
    -    const socket = new WebSocket('wss://example.com/api/sync/stream');
    -    /**
    -     * When the backend sends a new batch of documents+checkpoint,
    -     * emit it into the stream$.
    -     * 
    -     * event.data must look like this
    -     * {
    -     *     documents: [
    -     *        {
    -     *            id: 'foobar',
    -     *            _deleted: false,
    -     *            updatedAt: 1234
    -     *        }
    -     *     ],
    -     *     checkpoint: {
    -     *         id: 'foobar',
    -     *         updatedAt: 1234
    -     *     }
    -     * }
    -     */
    -    socket.onmessage = event => pullStream$.next(event.data);
    -    /**
    -     * Automatically reconnect the socket on close and error.
    -     */
    -    socket.onclose = () => connectSocket();
    -    socket.onerror = () => socket.close();
    - 
    -    socket.onopen = () => {
    -        if(firstOpen) {
    -            firstOpen = false;
    -        } else {
    -            /**
    -             * When the client is offline and goes online again,
    -             * it might have missed out events that happened on the server.
    -             * So we have to emit a RESYNC so that the replication goes
    -             * into 'Checkpoint iteration' mode until the client is in sync
    -             * and then it will go back into 'Event observation' mode again.
    -             */
    -            pullStream$.next('RESYNC');
    -        }
    -    }
    -}
    - 
    -

    Multi Tab support

    -

    For better performance, the replication runs only in one instance when RxDB is used in multiple browser tabs or Node.js processes. -By setting waitForLeadership: false you can enforce that each tab runs its own replication cycles. -If used in a multi instance setting, so when at database creation multiInstance: false was not set, -you need to import the leader election plugin so that RxDB can know how many instances exist and which browser tab should run the replication.

    -

    Error handling

    -

    When sending a document to the remote fails for any reason, RxDB will send it again in a later point in time. -This happens for all errors. The document write could have already reached the remote instance and be processed, while only the answering fails. -The remote instance must be designed to handle this properly and to not crash on duplicate data transmissions. -Depending on your use case, it might be ok to just write the duplicate document data again. -But for a more resilient error handling you could compare the last write timestamps or add a unique write id field to the document. This field can then be used to detect duplicates and ignore re-send data.

    -

    Also the replication has an .error$ stream that emits all RxError objects that arise during replication. -Notice that these errors contain an inner .parameters.errors field that contains the original error. Also they contain a .parameters.direction field that indicates if the error was thrown during pull or push. You can use these to properly handle errors. For example when the client is outdated, the server might respond with a 426 Upgrade Required error code that can then be used to force a page reload.

    -
    replicationState.error$.subscribe((error) => {
    -    if(
    -        error.parameters.errors &&
    -        error.parameters.errors[0] &&
    -        error.parameters.errors[0].code === 426
    -    ) {
    -        // client is outdated -> enforce a page reload
    -        location.reload();
    -    }
    -});
    -

    Security

    -

    Be aware that client side clocks can never be trusted. When you have a client-backend replication, the backend should overwrite the updatedAt timestamp or use another field, when it receives the change from the client.

    -

    RxReplicationState

    -

    The function replicateRxCollection() returns a RxReplicationState that can be used to manage and observe the replication.

    -

    Observable

    -

    To observe the replication, the RxReplicationState has some Observable properties:

    -
    // emits each document that was received from the remote
    -myRxReplicationState.received$.subscribe(doc => console.dir(doc));
    - 
    -// emits each document that was send to the remote
    -myRxReplicationState.sent$.subscribe(doc => console.dir(doc));
    - 
    -// emits all errors that happen when running the push- & pull-handlers.
    -myRxReplicationState.error$.subscribe(error => console.dir(error));
    - 
    -// emits true when the replication was canceled, false when not.
    -myRxReplicationState.canceled$.subscribe(bool => console.dir(bool));
    - 
    -// emits true when a replication cycle is running, false when not.
    -myRxReplicationState.active$.subscribe(bool => console.dir(bool));
    -

    awaitInitialReplication()

    -

    With awaitInitialReplication() you can await the initial replication that is done when a full replication cycle was successful finished for the first time. The returned promise will never resolve if you cancel the replication before the initial replication can be done.

    -
    await myRxReplicationState.awaitInitialReplication();
    -

    awaitInSync()

    -

    Returns a Promise that resolves when:

    -
      -
    • awaitInitialReplication() has emitted.
    • -
    • All local data is replicated with the remote.
    • -
    • No replication cycle is running or in retry-state.
    • -
    -
    warning

    When multiInstance: true and waitForLeadership: true and another tab is already running the replication, awaitInSync() will not resolve until the other tab is closed and the replication starts in this tab.

    await myRxReplicationState.awaitInSync();
    -
    warning

    awaitInitialReplication() and awaitInSync() should not be used to block the application

    A common mistake in RxDB usage is when developers want to block the app usage until the application is in sync. -Often they just await the promise of awaitInitialReplication() or awaitInSync() and show a loading spinner until they resolve. This is dangerous and should not be done because:

      -
    • When multiInstance: true and waitForLeadership: true (default) and another tab is already running the replication, awaitInitialReplication() will not resolve until the other tab is closed and the replication starts in this tab.
    • -
    • Your app can no longer be started when the device is offline because there the awaitInitialReplication() will never resolve and the app cannot be used.
    • -

    Instead you should store the last in-sync time in a local document and observe its value on all instances.

    For example if you want to block clients from using the app if they have not been in sync for the last 24 hours, you could use this code:

     
    -// update last-in-sync-flag each time replication is in sync
    -await myCollection.insertLocal('last-in-sync', { time: 0 }).catch(); // ensure flag exists
    -myReplicationState.active$.pipe(
    -    mergeMap(async() => {
    -        await myReplicationState.awaitInSync();
    -        await myCollection.upsertLocal('last-in-sync', { time: Date.now() })
    -    })
    -);
    - 
    -// observe the flag and toggle loading spinner
    -await showLoadingSpinner();
    -const oneDay = 1000 * 60 * 60 * 24;
    -await firstValueFrom(
    -    myCollection.getLocal$('last-in-sync').pipe(
    -        filter(d => d.get('time') > (Date.now() - oneDay))
    -    )
    -);
    -await hideLoadingSpinner();
    -

    reSync()

    -

    Triggers a RESYNC cycle where the replication goes into checkpoint iteration until the client is in sync with the backend. Used in unit tests or when no proper pull.stream$ can be implemented so that the client only knows that something has been changed but not what.

    -
    myRxReplicationState.reSync();
    -

    If your backend is not capable of sending events to the client at all, you could run reSync() in an interval so that the client will automatically fetch server changes after some time at least.

    -
    // trigger RESYNC each 10 seconds.
    -setInterval(() => myRxReplicationState.reSync(), 10 * 1000);
    -

    cancel()

    -

    Cancels the replication. Returns a promise that resolved when everything has been cleaned up.

    -
    await myRxReplicationState.cancel();
    -

    pause()

    -

    Pauses a running replication. The replication can later be resumed with RxReplicationState.start().

    -
    await myRxReplicationState.pause();
    -await myRxReplicationState.start(); // restart
    -

    remove()

    -

    Cancels the replication and deletes the metadata of the replication state. This can be used to restart the replication "from scratch". Calling .remove() will only delete the replication metadata, it will NOT delete the documents from the collection of the replication.

    -
    await myRxReplicationState.remove();
    -

    isStopped()

    -

    Returns true if the replication is stopped. This can be if a non-live replication is finished or a replication got canceled.

    -
    replicationState.isStopped(); // true/false
    -

    isPaused()

    -

    Returns true if the replication is paused.

    -
    replicationState.isPaused(); // true/false
    -

    Setting a custom initialCheckpoint

    -

    By default, the push replication will start from the beginning of time and push all documents from there to the remote. -By setting a custom push.initialCheckpoint, you can tell the replication to only push writes that are newer than the given checkpoint.

    -
    // store the latest checkpoint of a collection
    -let lastLocalCheckpoint: any;
    -myCollection.checkpoint$.subscribe(checkpoint => lastLocalCheckpoint = checkpoint);
    - 
    -// start the replication but only push documents that are newer than the lastLocalCheckpoint
    -const replicationState = replicateRxCollection({
    -    collection: myCollection,
    -    replicationIdentifier: 'my-custom-replication-with-init-checkpoint',
    -    /* ... */
    -    push: {
    -        handler: /* ... */,
    -        initialCheckpoint: lastLocalCheckpoint
    -    }
    -});
    -

    The same can be done for the other direction by setting a pull.initialCheckpoint. Notice that here we need the remote checkpoint from the backend instead of the one from the RxDB storage.

    -
    // get the last pull checkpoint from the server
    -const lastRemoteCheckpoint = await (await fetch('http://example.com/pull-checkpoint')).json();
    - 
    -// start the replication but only pull documents that are newer than the lastRemoteCheckpoint
    -const replicationState = replicateRxCollection({
    -    collection: myCollection,
    -    replicationIdentifier: 'my-custom-replication-with-init-checkpoint',
    -    /* ... */
    -    pull: {
    -        handler: /* ... */,
    -        initialCheckpoint: lastRemoteCheckpoint
    -    }
    -});
    -

    toggleOnDocumentVisible

    -

    Ensures replication continues running when the document is visible. This helps avoid situations where the leader-elected tab becomes stale or is hibernated by the browser to save battery.
    -When the tab becomes hidden, replication is automatically paused; when the tab becomes visible again (or the instance becomes leader), replication resumes.

    -

    Default: true

    -
    const replicationState = replicateRxCollection({
    -    toggleOnDocumentVisible: true,
    -    /* ... */
    -});
    -

    Attachment replication

    -

    Attachment replication is supported in the RxDB Sync Engine itself. However not all replication plugins support it. -If you start the replication with a collection which has enabled RxAttachments attachments data will be added to all push- and write data.

    -

    The pushed documents will contain an _attachments object which contains:

    -
      -
    • The attachment meta data (id, length, digest) of all non-attachments
    • -
    • The full attachment data of all attachments that have been updated/added from the client.
    • -
    • Deleted attachments are spared out in the pushed document.
    • -
    -

    With this data, the backend can decide onto which attachments must be deleted, added or overwritten.

    -

    Accordingly, the pulled document must contain the same data, if the backend has a new document state with updated attachments.

    -

    Pull-Only Replication

    -

    With the replication protocol it is possible to do pull only replications where data is pulled from a backend but not pushed from the client. RxDB implements some performance optimizations for these like not storing server metadata on pull only streams.

    -

    Partial Sync with RxDB

    -

    Suppose you're building a Minecraft-like voxel game where the world can expand in every direction. Storing the entire map locally for offline use is impossible because the dataset could be massive. Yet you still want a local-first design so players can edit the game world offline and sync back to the server later.

    -

    Idea: One Collection, Multiple Replications

    -

    You might define a single RxDB collection called db.voxels, where each document represents a block or "voxel" (with fields like id, chunkId, coordinates, and type). With RxDB you can, instead of setting up one replication that tries to fetch all voxels, you create separate replication states for each chunk of the world the player is currently near.

    -

    When the player enters a particular chunk (say chunk-123), you start a replication dedicated to that chunk. On the server side, you have endpoints to pull only that chunk's voxels (e.g., GET /api/voxels/pull?chunkId=123) and push local changes back (e.g., POST /api/voxels/push?chunkId=123). RxDB handles them similarly to any other offline-first setup, but each replication is filtered to only that chunk's data.

    -

    When the player leaves chunk-123 and no longer needs it, you stop that replication. If the player moves to chunk-124, you start a new replication for chunk 124. This ensures the game only downloads and syncs data relevant to the player's immediate location. Meanwhile, all edits made offline remain safely stored in the local database until a network connection is available.

    -
    const activeReplications = {}; // chunkId -> replicationState
    - 
    -function startChunkReplication(chunkId) {
    -  if (activeReplications[chunkId]) return;
    -  const replicationId = 'voxels-chunk-' + chunkId;
    - 
    -  const replicationState = replicateRxCollection({
    -    collection: db.voxels,
    -    replicationIdentifier: replicationId,
    -    pull: {
    -      async handler(checkpoint, limit) {
    -        const res = await fetch(
    -          `/api/voxels/pull?chunkId=${chunkId}&cp=${checkpoint}&limit=${limit}`
    -        );
    -        /* ... */
    -      }
    -    },
    -    push: {
    -      async handler(changedDocs) {
    -        const res = await fetch(`/api/voxels/push?chunkId=${chunkId}`);
    -        /* ... */
    -      }
    -    }
    -  });
    -  activeReplications[chunkId] = replicationState;
    -}
    - 
    -function stopChunkReplication(chunkId) {
    -  const rep = await activeReplications[chunkId];
    -  if (rep) {
    -    rep.cancel();
    -    delete activeReplications[chunkId];
    -  }
    -}
    - 
    -// Called whenever the player's location changes; 
    -// dynamically start/stop replication for nearby chunks.
    -function onPlayerMove(neighboringChunkIds) {
    -  neighboringChunkIds.forEach(startChunkReplication);
    -  Object.keys(activeReplications).forEach(cid => {
    -    if (!neighboringChunkIds.includes(cid)) {
    -      stopChunkReplication(cid);
    -    }
    -  });
    -}
    -

    Diffy-Sync when Revisiting a Chunk

    -

    An added benefit of this multi-replication-state design is checkpointing. Each replication state has a unique "replication identifier," so the next time the player returns to chunk-123, the local database knows what it already has and only fetches the differences without the need to re-download the entire chunk.

    -

    Partial Sync in a Local-First Business Application

    -

    Though a voxel world is an intuitive example, the same technique applies in enterprise scenarios where data sets are large but each user only needs a specific subset. You could spin up a new replication for each "permission group" or "region," so users only sync the records they're allowed to see. Or in a CRM, the replication might be filtered by the specific accounts or projects a user is currently handling. As soon as they switch to a different project, you stop the old replication and start one for the new scope.

    -

    This chunk-based or scope-based replication pattern keeps your local storage lean, reduces network overhead, and still gives users the offline, instant-feedback experience that local-first apps are known for. By dynamically creating (and canceling) replication states, you retain tight control over bandwidth usage and make the infinite (or very large) feasible. In a production app you would also "flag" the entities (with a pull.modifier) by which replication state they came from, so that you can clean up the parts that you no longer need. -->

    -

    FAQ

    -
    I have infinite loops in my replication, how to debug?

    When you have infinite loops in your replication or random re-runs of http requests after some time, the reason is likely that your pull-handler -is crashing. The debug this, add a log to the error$ handler to debug it. myRxReplicationState.error$.subscribe(err => console.log('error$', err)).

    - - \ No newline at end of file diff --git a/docs/replication.md b/docs/replication.md deleted file mode 100644 index 98e12b25a1d..00000000000 --- a/docs/replication.md +++ /dev/null @@ -1,679 +0,0 @@ -# ⚙️ RxDB realtime Sync Engine for Local-First Apps - -> Replicate data in real-time with RxDB's offline-first Sync Engine. Learn about efficient syncing, conflict resolution, and advanced multi-tab support. - -# RxDB's realtime Sync Engine for Local-First Apps - -The RxDB Sync Engine provides the ability to sync the database state in **realtime** between the clients and the server. - -The backend server does not have to be a RxDB instance; you can build a replication with **any infrastructure**. -For example you can replicate with a [custom GraphQL endpoint](./replication-graphql.md) or a [HTTP server](./replication-http.md) on top of a PostgreSQL or MongoDB database. - -The replication is made to support the [Local-First](./articles/local-first-future.md) paradigm, so that when the client goes [offline](./offline-first.md), the RxDB [database](./rx-database.md) can still read and write [locally](./articles/local-database.md) and will continue the replication when the client goes online again. - -## Design Decisions of the Sync Engine - -In contrast to other (server-side) database replication protocols, the RxDB Sync Engine was designed with these goals in mind: - -- **Easy to Understand**: The sync engine works in a simple "git-like" way that is easy to understand for an average developer. You only have to understand how three simple endpoints work. -- **Complex Parts are in RxDB, not in the Backend**: The complex parts of the Sync Engine, like [conflict handling](./transactions-conflicts-revisions.md) or offline-online switches, are implemented inside of RxDB itself. This makes creating a compatible backend very easy. -- **Compatible with any Backend**: Because the complex parts are in RxDB, the backend can be "dump" which makes the protocol compatible to almost every backend. No matter if you use PostgreSQL, MongoDB or anything else. -- **Performance is optimized for Client Devices and Browsers**: By grouping updates and fetches into batches, it is faster to transfer and easier to compress. Client devices and browsers can also process this data faster, for example running `JSON.parse()` on a chunk of data is faster than calling it once per row. Same goes for how client side storage like [IndexedDB](./rx-storage-indexeddb.md) or [OPFS](./rx-storage-opfs.md) works where writing data in bulks is faster. -- **Offline-First Support**: By incorporating conflict handling at the client side, the protocol fully supports [offline-first apps](./offline-first.md). Users can continue making changes while offline, and those updates will sync seamlessly once a connection is reestablished - all without risking data loss or having undefined behavior. -- **Multi-Tab Support**: When RxDB is used in a browser and multiple tabs of the same application are opened, only exactly one runs the replication at any given time. This reduces client- and backend resources. - -## The Sync Engine on the document level - -On the RxDocument level, the replication works like git, where the fork/client contains all new writes and must be merged with the master/server before it can push its new state to the master/server. - -``` -A---B-----------D master/server state - \ / - B---C---D fork/client state -``` - -- The client pulls the latest state `B` from the master. -- The client does some changes `C+D`. -- The client pushes these changes to the master by sending the latest known master state `B` and the new client state `D` of the document. -- If the master state is equal to the latest master `B` state of the client, the new client state `D` is set as the latest master state. -- If the master also had changes and so the latest master change is different then the one that the client assumes, we have a conflict that has to be resolved on the client. - -## The Sync Engine on the transfer level - -When document states are transferred, all handlers use batches of documents for better performance. -The server **must** implement the following methods to be compatible with the replication: - -- **pullHandler** Get the last checkpoint (or null) as input. Returns all documents that have been written **after** the given checkpoint. Also returns the checkpoint of the latest written returned document. -- **pushHandler** a method that can be called by the client to send client side writes to the master. It gets an array with the `assumedMasterState` and the `newForkState` of each document write as input. It must return an array that contains the master document states of all conflicts. If there are no conflicts, it must return an empty array. -- **pullStream** an observable that emits batches of all master writes and the latest checkpoint of the write batches. - -``` - +--------+ +--------+ - | | pullHandler() | | - | |---------------------> | | - | | | | - | | | | - | Client | pushHandler() | Server | - | |---------------------> | | - | | | | - | | pullStream$ | | - | | <-------------------------| | - +--------+ +--------+ -``` - -The replication runs in two **different modes**: - -### Checkpoint iteration - -On first initial replication, or when the client comes online again, a checkpoint based iteration is used to catch up with the server state. -A checkpoint is a subset of the fields of the last pulled document. When the checkpoint is send to the backend via `pullHandler()`, the backend must be able to respond with all documents that have been written **after** the given checkpoint. -For example if your documents contain an `id` and an `updatedAt` field, these two can be used as checkpoint. - -When the checkpoint iteration reaches the last checkpoint, where the backend returns an empty array because there are no newer documents, the replication will automatically switch to the `event observation` mode. - -### Event observation - -While the client is connected to the backend, the events from the backend are observed via `pullStream$` and persisted to the client. - -If your backend for any reason is not able to provide a full `pullStream$` that contains all events and the checkpoint, you can instead only emit `RESYNC` events that tell RxDB that anything unknown has changed on the server and it should run the pull replication via [checkpoint iteration](#checkpoint-iteration). - -When the client goes offline and online again, it might happen that the `pullStream$` has missed out some events. Therefore the `pullStream$` should also emit a `RESYNC` event each time the client reconnects, so that the client can become in sync with the backend via the [checkpoint iteration](#checkpoint-iteration) mode. - -## Data layout on the server - -To use the replication you first have to ensure that: -- **documents are deterministic sortable by their last write time** - - *deterministic* means that even if two documents have the same *last write time*, they have a predictable sort order. - This is most often ensured by using the *primaryKey* as second sort parameter as part of the checkpoint. - -- **documents are never deleted, instead the `_deleted` field is set to `true`.** - - This is needed so that the deletion state of a document exists in the database and can be replicated with other instances. If your backend uses a different field to mark deleted documents, you have to transform the data in the push/pull handlers or with the modifiers. - -For example if your documents look like this: - -```ts -const docData = { - "id": "foobar", - "name": "Alice", - "lastName": "Wilson", - /** - * Contains the last write timestamp - * so all documents writes can be sorted by that value - * when they are fetched from the remote instance. - */ - "updatedAt": 1564483474, - /** - * Instead of physically deleting documents, - * a deleted document gets replicated. - */ - "_deleted": false -} -``` - -Then your data is always sortable by `updatedAt`. This ensures that when RxDB fetches 'new' changes via `pullHandler()`, it can send the latest `updatedAt+id` checkpoint to the remote endpoint and then receive all newer documents. - -By default, the field is `_deleted`. If your remote endpoint uses a different field to mark deleted documents, you can set the `deletedField` in the replication options which will automatically map the field on all pull and push requests. - -## Conflict handling - -When multiple clients (or the server) modify the same document at the same time (or when they are offline), it can happen that a conflict arises during the replication. - -``` -A---B1---C1---X master/server state - \ / - B1---C2 fork/client state -``` - -In the case above, the client would tell the master to move the document state from `B1` to `C2` by calling `pushHandler()`. But because the actual master state is `C1` and not `B1`, the master would reject the write by sending back the actual master state `C1`. -**RxDB resolves all conflicts on the client** so it would call the conflict handler of the `RxCollection` and create a new document state `D` that can then be written to the master. - -``` -A---B1---C1---X---D master/server state - \ / \ / - B1---C2---D fork/client state -``` - -The default conflict handler will always drop the fork state and use the master state. This ensures that clients that are offline for a very long time, do not accidentally overwrite other peoples changes when they go online again. -You can specify a custom conflict handler by setting the property `conflictHandler` when calling `addCollection()`. - -Learn how to create a [custom conflict handler](./transactions-conflicts-revisions.md#custom-conflict-handler). - -## replicateRxCollection() - -You can start the replication of a single `RxCollection` by calling `replicateRxCollection()` like in the following: - -```ts -import { replicateRxCollection } from 'rxdb/plugins/replication'; -import { - lastOfArray -} from 'rxdb'; -const replicationState = await replicateRxCollection({ - collection: myRxCollection, - /** - * An id for the replication to identify it - * and so that RxDB is able to resume the replication on app reload. - * If you replicate with a remote server, it is recommended to put the - * server url into the replicationIdentifier. - */ - replicationIdentifier: 'my-rest-replication-to-https://example.com/api/sync', - /** - * By default it will do an ongoing realtime replication. - * By settings live: false the replication will run once until the local state - * is in sync with the remote state, then it will cancel itself. - * (optional), default is true. - */ - live: true, - /** - * Time in milliseconds after when a failed backend request - * has to be retried. - * This time will be skipped if a offline->online switch is detected - * via navigator.onLine - * (optional), default is 5 seconds. - */ - retryTime: 5 * 1000, - /** - * When multiInstance is true, like when you use RxDB in multiple browser tabs, - * the replication should always run in only one of the open browser tabs. - * If waitForLeadership is true, it will wait until the current instance is leader. - * If waitForLeadership is false, it will start replicating, even if it is not leader. - * [default=true] - */ - waitForLeadership: true, - /** - * If this is set to false, - * the replication will not start automatically - * but will wait for replicationState.start() being called. - * (optional), default is true - */ - autoStart: true, - - /** - * Custom deleted field, the boolean property of the document data that - * marks a document as being deleted. - * If your backend uses a different fieldname then '_deleted', set the fieldname here. - * RxDB will still store the documents internally with '_deleted', setting this field - * only maps the data on the data layer. - * - * If a custom deleted field contains a non-boolean value, the deleted state - * of the documents depends on if the value is truthy or not. So instead of providing a boolean * * deleted value, you could also work with using a 'deletedAt' timestamp instead. - * - * [default='_deleted'] - */ - deletedField: 'deleted', - - /** - * Optional, - * only needed when you want to replicate local changes to the remote instance. - */ - push: { - /** - * Push handler - */ - async handler(docs) { - /** - * Push the local documents to a remote REST server. - */ - const rawResponse = await fetch('https://example.com/api/sync/push', { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ docs }) - }); - /** - * Contains an array with all conflicts that appeared during this push. - * If there were no conflicts, return an empty array. - */ - const response = await rawResponse.json(); - return response; - }, - /** - * Batch size, optional - * Defines how many documents will be given to the push handler at once. - */ - batchSize: 5, - /** - * Modifies all documents before they are given to the push handler. - * Can be used to swap out a custom deleted flag instead of the '_deleted' field. - * If the push modifier return null, the document will be skipped and not send to the remote. - * Notice that the modifier can be called multiple times and should not contain any side effects. - * (optional) - */ - modifier: d => d - }, - /** - * Optional, - * only needed when you want to replicate remote changes to the local state. - */ - pull: { - /** - * Pull handler - */ - async handler(lastCheckpoint, batchSize) { - const minTimestamp = lastCheckpoint ? lastCheckpoint.updatedAt : 0; - /** - * In this example we replicate with a remote REST server - */ - const response = await fetch( - `https://example.com/api/sync/?minUpdatedAt=${minTimestamp}&limit=${batchSize}` - ); - const documentsFromRemote = await response.json(); - return { - /** - * Contains the pulled documents from the remote. - * Not that if documentsFromRemote.length < batchSize, - * then RxDB assumes that there are no more un-replicated documents - * on the backend, so the replication will switch to 'Event observation' mode. - */ - documents: documentsFromRemote, - /** - * The last checkpoint of the returned documents. - * On the next call to the pull handler, - * this checkpoint will be passed as 'lastCheckpoint' - */ - checkpoint: documentsFromRemote.length === 0 ? lastCheckpoint : { - id: lastOfArray(documentsFromRemote).id, - updatedAt: lastOfArray(documentsFromRemote).updatedAt - } - }; - }, - batchSize: 10, - /** - * Modifies all documents after they have been pulled - * but before they are used by RxDB. - * Notice that the modifier can be called multiple times and should not contain any side effects. - * (optional) - */ - modifier: d => d, - /** - * Stream of the backend document writes. - * See below. - * You only need a stream$ when you have set live=true - */ - stream$: pullStream$.asObservable() - }, -}); - -/** - * Creating the pull stream for realtime replication. - * Here we use a websocket but any other way of sending data to the client can be used, - * like long polling or server-sent events. - */ -const pullStream$ = new Subject>(); -let firstOpen = true; -function connectSocket() { - const socket = new WebSocket('wss://example.com/api/sync/stream'); - /** - * When the backend sends a new batch of documents+checkpoint, - * emit it into the stream$. - * - * event.data must look like this - * { - * documents: [ - * { - * id: 'foobar', - * _deleted: false, - * updatedAt: 1234 - * } - * ], - * checkpoint: { - * id: 'foobar', - * updatedAt: 1234 - * } - * } - */ - socket.onmessage = event => pullStream$.next(event.data); - /** - * Automatically reconnect the socket on close and error. - */ - socket.onclose = () => connectSocket(); - socket.onerror = () => socket.close(); - - socket.onopen = () => { - if(firstOpen) { - firstOpen = false; - } else { - /** - * When the client is offline and goes online again, - * it might have missed out events that happened on the server. - * So we have to emit a RESYNC so that the replication goes - * into 'Checkpoint iteration' mode until the client is in sync - * and then it will go back into 'Event observation' mode again. - */ - pullStream$.next('RESYNC'); - } - } -} - -``` - -## Multi Tab support - -For better performance, the replication runs only in one instance when RxDB is used in multiple browser tabs or Node.js processes. -By setting `waitForLeadership: false` you can enforce that each tab runs its own replication cycles. -If used in a multi instance setting, so when at database creation `multiInstance: false` was not set, -you need to import the [leader election plugin](./leader-election.md) so that RxDB can know how many instances exist and which browser tab should run the replication. - -## Error handling - -When sending a document to the remote fails for any reason, RxDB will send it again in a later point in time. -This happens for **all** errors. The document write could have already reached the remote instance and be processed, while only the answering fails. -The remote instance must be designed to handle this properly and to not crash on duplicate data transmissions. -Depending on your use case, it might be ok to just write the duplicate document data again. -But for a more resilient error handling you could compare the last write timestamps or add a unique write id field to the document. This field can then be used to detect duplicates and ignore re-send data. - -Also the replication has an `.error$` stream that emits all `RxError` objects that arise during replication. -Notice that these errors contain an inner `.parameters.errors` field that contains the original error. Also they contain a `.parameters.direction` field that indicates if the error was thrown during `pull` or `push`. You can use these to properly handle errors. For example when the client is outdated, the server might respond with a `426 Upgrade Required` error code that can then be used to force a page reload. - -```ts -replicationState.error$.subscribe((error) => { - if( - error.parameters.errors && - error.parameters.errors[0] && - error.parameters.errors[0].code === 426 - ) { - // client is outdated -> enforce a page reload - location.reload(); - } -}); -``` - -## Security - -Be aware that client side clocks can never be trusted. When you have a client-backend replication, the backend should overwrite the `updatedAt` timestamp or use another field, when it receives the change from the client. - -## RxReplicationState - -The function `replicateRxCollection()` returns a `RxReplicationState` that can be used to manage and observe the replication. - -### Observable - -To observe the replication, the `RxReplicationState` has some `Observable` properties: - -```ts -// emits each document that was received from the remote -myRxReplicationState.received$.subscribe(doc => console.dir(doc)); - -// emits each document that was send to the remote -myRxReplicationState.sent$.subscribe(doc => console.dir(doc)); - -// emits all errors that happen when running the push- & pull-handlers. -myRxReplicationState.error$.subscribe(error => console.dir(error)); - -// emits true when the replication was canceled, false when not. -myRxReplicationState.canceled$.subscribe(bool => console.dir(bool)); - -// emits true when a replication cycle is running, false when not. -myRxReplicationState.active$.subscribe(bool => console.dir(bool)); -``` - -### awaitInitialReplication() - -With `awaitInitialReplication()` you can await the initial replication that is done when a full replication cycle was successful finished for the first time. The returned promise will never resolve if you cancel the replication before the initial replication can be done. - -```ts -await myRxReplicationState.awaitInitialReplication(); -``` - -### awaitInSync() - -Returns a `Promise` that resolves when: -- `awaitInitialReplication()` has emitted. -- All local data is replicated with the remote. -- No replication cycle is running or in retry-state. - -:::warning -When `multiInstance: true` and `waitForLeadership: true` and another tab is already running the replication, `awaitInSync()` will not resolve until the other tab is closed and the replication starts in this tab. - -```ts -await myRxReplicationState.awaitInSync(); -``` -::: - -:::warning - -#### `awaitInitialReplication()` and `awaitInSync()` should not be used to block the application - -A common mistake in RxDB usage is when developers want to block the app usage until the application is in sync. -Often they just `await` the promise of `awaitInitialReplication()` or `awaitInSync()` and show a loading spinner until they resolve. This is dangerous and should not be done because: -- When `multiInstance: true` and `waitForLeadership: true (default)` and another tab is already running the replication, `awaitInitialReplication()` will not resolve until the other tab is closed and the replication starts in this tab. -- Your app can no longer be started when the device is offline because there the `awaitInitialReplication()` will never resolve and the app cannot be used. - -Instead you should store the last in-sync time in a [local document](./rx-local-document.md) and observe its value on all instances. - -For example if you want to block clients from using the app if they have not been in sync for the last 24 hours, you could use this code: -```ts - -// update last-in-sync-flag each time replication is in sync -await myCollection.insertLocal('last-in-sync', { time: 0 }).catch(); // ensure flag exists -myReplicationState.active$.pipe( - mergeMap(async() => { - await myReplicationState.awaitInSync(); - await myCollection.upsertLocal('last-in-sync', { time: Date.now() }) - }) -); - -// observe the flag and toggle loading spinner -await showLoadingSpinner(); -const oneDay = 1000 * 60 * 60 * 24; -await firstValueFrom( - myCollection.getLocal$('last-in-sync').pipe( - filter(d => d.get('time') > (Date.now() - oneDay)) - ) -); -await hideLoadingSpinner(); -``` - -::: - -### reSync() - -Triggers a `RESYNC` cycle where the replication goes into [checkpoint iteration](#checkpoint-iteration) until the client is in sync with the backend. Used in unit tests or when no proper `pull.stream$` can be implemented so that the client only knows that something has been changed but not what. - -```ts -myRxReplicationState.reSync(); -``` - -If your backend is not capable of sending events to the client at all, you could run `reSync()` in an interval so that the client will automatically fetch server changes after some time at least. - -```ts -// trigger RESYNC each 10 seconds. -setInterval(() => myRxReplicationState.reSync(), 10 * 1000); -``` - -### cancel() - -Cancels the replication. Returns a promise that resolved when everything has been cleaned up. - -```ts -await myRxReplicationState.cancel(); -``` - -### pause() - -Pauses a running replication. The replication can later be resumed with `RxReplicationState.start()`. - -```ts -await myRxReplicationState.pause(); -await myRxReplicationState.start(); // restart -``` - -### remove() - -Cancels the replication and deletes the metadata of the replication state. This can be used to restart the replication "from scratch". Calling `.remove()` will only delete the replication metadata, it will NOT delete the documents from the collection of the replication. - -```ts -await myRxReplicationState.remove(); -``` - -### isStopped() - -Returns `true` if the replication is stopped. This can be if a non-live replication is finished or a replication got canceled. - -```js -replicationState.isStopped(); // true/false -``` - -### isPaused() - -Returns `true` if the replication is paused. - -```js -replicationState.isPaused(); // true/false -``` - -### Setting a custom initialCheckpoint - -By default, the push replication will start from the beginning of time and push all documents from there to the remote. -By setting a custom `push.initialCheckpoint`, you can tell the replication to only push writes that are newer than the given checkpoint. - -```ts -// store the latest checkpoint of a collection -let lastLocalCheckpoint: any; -myCollection.checkpoint$.subscribe(checkpoint => lastLocalCheckpoint = checkpoint); - -// start the replication but only push documents that are newer than the lastLocalCheckpoint -const replicationState = replicateRxCollection({ - collection: myCollection, - replicationIdentifier: 'my-custom-replication-with-init-checkpoint', - /* ... */ - push: { - handler: /* ... */, - initialCheckpoint: lastLocalCheckpoint - } -}); -``` - -The same can be done for the other direction by setting a `pull.initialCheckpoint`. Notice that here we need the remote checkpoint from the backend instead of the one from the RxDB storage. - -```ts -// get the last pull checkpoint from the server -const lastRemoteCheckpoint = await (await fetch('http://example.com/pull-checkpoint')).json(); - -// start the replication but only pull documents that are newer than the lastRemoteCheckpoint -const replicationState = replicateRxCollection({ - collection: myCollection, - replicationIdentifier: 'my-custom-replication-with-init-checkpoint', - /* ... */ - pull: { - handler: /* ... */, - initialCheckpoint: lastRemoteCheckpoint - } -}); -``` - -### toggleOnDocumentVisible - -Ensures replication continues running when the document is `visible`. This helps avoid situations where the leader-elected tab becomes stale or is hibernated by the browser to save battery. -When the tab becomes hidden, replication is automatically paused; when the tab becomes visible again (or the instance becomes leader), replication resumes. - -**Default:** `true` - -```ts -const replicationState = replicateRxCollection({ - toggleOnDocumentVisible: true, - /* ... */ -}); -``` - -## Attachment replication - -Attachment replication is supported in the RxDB Sync Engine itself. However not all replication plugins support it. -If you start the replication with a collection which has [enabled RxAttachments](./rx-attachment.md) attachments data will be added to all push- and write data. - -The pushed documents will contain an `_attachments` object which contains: - -- The attachment meta data (id, length, digest) of all non-attachments -- The full attachment data of all attachments that have been updated/added from the client. -- Deleted attachments are spared out in the pushed document. - -With this data, the backend can decide onto which attachments must be deleted, added or overwritten. - -Accordingly, the pulled document must contain the same data, if the backend has a new document state with updated attachments. - -## Pull-Only Replication - -With the replication protocol it is possible to do pull only replications where data is pulled from a backend but not pushed from the client. RxDB implements some performance optimizations for these like not storing server metadata on pull only streams. - -## Partial Sync with RxDB - -Suppose you're building a Minecraft-like voxel game where the world can expand in every direction. Storing the entire map locally for offline use is impossible because the dataset could be massive. Yet you still want a local-first design so players can edit the game world offline and sync back to the server later. - -### Idea: One Collection, Multiple Replications - -You might define a single RxDB collection called `db.voxels`, where each document represents a block or "voxel" (with fields like id, chunkId, coordinates, and type). With RxDB you can, instead of setting up _one_ replication that tries to fetch _all_ voxels, you create **separate replication states** for each _chunk_ of the world the player is currently near. - -When the player enters a particular chunk (say `chunk-123`), you **start a replication** dedicated to that chunk. On the server side, you have endpoints to **pull** only that chunk's voxels (e.g., GET `/api/voxels/pull?chunkId=123`) and **push** local changes back (e.g., POST `/api/voxels/push?chunkId=123`). RxDB handles them similarly to any other offline-first setup, but each replication is filtered to only that chunk's data. - -When the player leaves `chunk-123` and no longer needs it, you **stop** that replication. If the player moves to `chunk-124`, you start a new replication for chunk 124. This ensures the game only downloads and syncs data relevant to the player's immediate location. Meanwhile, all edits made offline remain safely stored in the local database until a network connection is available. - -```ts -const activeReplications = {}; // chunkId -> replicationState - -function startChunkReplication(chunkId) { - if (activeReplications[chunkId]) return; - const replicationId = 'voxels-chunk-' + chunkId; - - const replicationState = replicateRxCollection({ - collection: db.voxels, - replicationIdentifier: replicationId, - pull: { - async handler(checkpoint, limit) { - const res = await fetch( - `/api/voxels/pull?chunkId=${chunkId}&cp=${checkpoint}&limit=${limit}` - ); - /* ... */ - } - }, - push: { - async handler(changedDocs) { - const res = await fetch(`/api/voxels/push?chunkId=${chunkId}`); - /* ... */ - } - } - }); - activeReplications[chunkId] = replicationState; -} - -function stopChunkReplication(chunkId) { - const rep = await activeReplications[chunkId]; - if (rep) { - rep.cancel(); - delete activeReplications[chunkId]; - } -} - -// Called whenever the player's location changes; -// dynamically start/stop replication for nearby chunks. -function onPlayerMove(neighboringChunkIds) { - neighboringChunkIds.forEach(startChunkReplication); - Object.keys(activeReplications).forEach(cid => { - if (!neighboringChunkIds.includes(cid)) { - stopChunkReplication(cid); - } - }); -} -``` - -### Diffy-Sync when Revisiting a Chunk - -An added benefit of this multi-replication-state design is checkpointing. Each replication state has a unique "replication identifier," so the next time the player returns to `chunk-123`, the local database knows what it already has and only fetches the differences without the need to re-download the entire chunk. - -### Partial Sync in a Local-First Business Application - -Though a voxel world is an intuitive example, the same technique applies in enterprise scenarios where data sets are large but each user only needs a specific subset. You could spin up a new replication for each "permission group" or "region," so users only sync the records they're allowed to see. Or in a CRM, the replication might be filtered by the specific accounts or projects a user is currently handling. As soon as they switch to a different project, you stop the old replication and start one for the new scope. - -This **chunk-based** or **scope-based** replication pattern keeps your local storage lean, reduces network overhead, and still gives users the offline, instant-feedback experience that local-first apps are known for. By dynamically creating (and canceling) replication states, you retain tight control over bandwidth usage and make the infinite (or very large) feasible. In a production app you would also "flag" the entities (with a `pull.modifier`) by which replication state they came from, so that you can clean up the parts that you no longer need. --> - -## FAQ - -
    - I have infinite loops in my replication, how to debug? - - When you have infinite loops in your replication or random re-runs of http requests after some time, the reason is likely that your pull-handler - is crashing. The debug this, add a log to the error$ handler to debug it. `myRxReplicationState.error$.subscribe(err => console.log('error$', err))`. - -
    diff --git a/docs/rx-attachment.html b/docs/rx-attachment.html deleted file mode 100644 index 0c6605a02d0..00000000000 --- a/docs/rx-attachment.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - -Attachments | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Attachments

    -

    Attachments are binary data files that can be attachment to an RxDocument, like a file that is attached to an email.

    -

    Using attachments instead of adding the data to the normal document, ensures that you still have a good performance when querying and writing documents, even when a big amount of data, like an image file has to be stored.

    -
      -
    • You can store string, binary files, images and whatever you want side by side with your documents.
    • -
    • Deleted documents automatically loose all their attachments data.
    • -
    • Not all replication plugins support the replication of attachments.
    • -
    • Attachments can be stored encrypted.
    • -
    -

    Internally, attachments in RxDB are stored and handled similar to how CouchDB, PouchDB does it.

    -

    Add the attachments plugin

    -

    To enable the attachments, you have to add the attachments plugin.

    -
    import { addRxPlugin } from 'rxdb';
    -import { RxDBAttachmentsPlugin } from 'rxdb/plugins/attachments';
    -addRxPlugin(RxDBAttachmentsPlugin);
    -

    Enable attachments in the schema

    -

    Before you can use attachments, you have to ensure that the attachments-object is set in the schema of your RxCollection.

    -
     
    -const mySchema = {
    -    version: 0,
    -    type: 'object',
    -    properties: {
    -        // .
    -        // .
    -        // .
    -    },
    -    attachments: {
    -        encrypted: true // if true, the attachment-data will be encrypted with the db-password
    -    }
    -};
    - 
    -const myCollection = await myDatabase.addCollections({
    -    humans: {
    -        schema: mySchema
    -    }
    -});
    -

    putAttachment()

    -

    Adds an attachment to a RxDocument. Returns a Promise with the new attachment.

    -
    import { createBlob } from 'rxdb';
    - 
    -const attachment = await myDocument.putAttachment(
    -    {
    -        id: 'cat.txt',     // (string) name of the attachment
    -        data: createBlob('meowmeow', 'text/plain'),   // (string|Blob) data of the attachment
    -        type: 'text/plain'    // (string) type of the attachment-data like 'image/jpeg'
    -    }
    -);
    -
    warning

    Expo/React-Native does not support the Blob API natively. Make sure you use your own polyfill that properly supports blob.arrayBuffer() when using RxAttachments or use the putAttachmentBase64() and getDataBase64() so that you do not have to create blobs.

    -

    putAttachmentBase64()

    -

    Same as putAttachment() but accepts a plain base64 string instead of a Blob.

    -
    const attachment = await doc.putAttachmentBase64({
    -    id: 'cat.txt',
    -    length: 4,
    -    data: 'bWVvdw==',
    -    type: 'text/plain'
    -});
    -

    getAttachment()

    -

    Returns an RxAttachment by its id. Returns null when the attachment does not exist.

    -
    const attachment = myDocument.getAttachment('cat.jpg');
    -

    allAttachments()

    -

    Returns an array of all attachments of the RxDocument.

    -
    const attachments = myDocument.allAttachments();
    -

    allAttachments$

    -

    Gets an Observable which emits a stream of all attachments from the document. Re-emits each time an attachment gets added or removed from the RxDocument.

    -
    const all = [];
    -myDocument.allAttachments$.subscribe(
    -    attachments => all = attachments
    -);
    -

    RxAttachment

    -

    The attachments of RxDB are represented by the type RxAttachment which has the following attributes/methods.

    -

    doc

    -

    The RxDocument which the attachment is assigned to.

    -

    id

    -

    The id as string of the attachment.

    -

    type

    -

    The type as string of the attachment.

    -

    length

    -

    The length of the data of the attachment as number.

    -

    digest

    -

    The hash of the attachments data as string.

    -
    note

    The digest is NOT calculated by RxDB, instead it is calculated by the RxStorage. The only guarantee is that the digest will change when the attachments data changes.

    -

    rev

    -

    The revision-number of the attachment as number.

    -

    remove()

    -

    Removes the attachment. Returns a Promise that resolves when done.

    -
    const attachment = myDocument.getAttachment('cat.jpg');
    -await attachment.remove();
    -

    getData()

    -

    Returns a Promise which resolves the attachment's data as Blob. (async)

    -
    const attachment = myDocument.getAttachment('cat.jpg');
    -const blob = await attachment.getData(); // Blob
    -

    getDataBase64()

    -

    Returns a Promise which resolves the attachment's data as base64 string.

    -
    const attachment = myDocument.getAttachment('cat.jpg');
    -const base64Database = await attachment.getDataBase64(); // 'bWVvdw=='
    -

    getStringData()

    -

    Returns a Promise which resolves the attachment's data as string.

    -
    const attachment = await myDocument.getAttachment('cat.jpg');
    -const data = await attachment.getStringData(); // 'meow'
    -

    Attachment compression

    -

    Storing many attachments can be a problem when the disc space of the device is exceeded. -Therefore it can make sense to compress the attachments before storing them in the RxStorage. -With the attachments-compression plugin you can compress the attachments data on write and decompress it on reads. -This happens internally and will now change on how you use the api. The compression is run with the Compression Streams API which is only supported on newer browsers.

    -
    import {
    -    wrappedAttachmentsCompressionStorage
    -} from 'rxdb/plugins/attachments-compression';
    - 
    -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb';
    - 
    -// create a wrapped storage with attachment-compression.
    -const storageWithAttachmentsCompression = wrappedAttachmentsCompressionStorage({
    -    storage: getRxStorageIndexedDB()
    -});
    - 
    -const db = await createRxDatabase({
    -    name: 'mydatabase',
    -    storage: storageWithAttachmentsCompression
    -});
    - 
    - 
    -// set the compression mode at the schema level
    -const mySchema = {
    -    version: 0,
    -    type: 'object',
    -    properties: {
    -        // .
    -        // .
    -        // .
    -    },
    -    attachments: {
    -        compression: 'deflate'  // <- Specify the compression mode here. OneOf ['deflate', 'gzip']
    -    }
    -};
    - 
    -/* ... create your collections as usual and store attachments in them. */
    - 
    - - \ No newline at end of file diff --git a/docs/rx-attachment.md b/docs/rx-attachment.md deleted file mode 100644 index 09e3742bf77..00000000000 --- a/docs/rx-attachment.md +++ /dev/null @@ -1,222 +0,0 @@ -# Attachments - -> Learn how to store and manage binary data like images or files in RxDB using attachments. Discover features, performance benefits, encryption, compression, and usage examples with code. - -# Attachments - -Attachments are binary data files that can be attachment to an `RxDocument`, like a file that is attached to an email. - -Using attachments instead of adding the data to the normal document, ensures that you still have a good **performance** when querying and writing documents, even when a big amount of data, like an image file has to be stored. - -- You can store string, binary files, images and whatever you want side by side with your documents. -- Deleted documents automatically loose all their attachments data. -- Not all replication plugins support the replication of attachments. -- Attachments can be stored [encrypted](./encryption.md). - -Internally, attachments in RxDB are stored and handled similar to how [CouchDB, PouchDB](https://pouchdb.com/guides/attachments.html#how-attachments-are-stored) does it. - -## Add the attachments plugin - -To enable the attachments, you have to add the `attachments` plugin. - -```ts -import { addRxPlugin } from 'rxdb'; -import { RxDBAttachmentsPlugin } from 'rxdb/plugins/attachments'; -addRxPlugin(RxDBAttachmentsPlugin); -``` - -## Enable attachments in the schema - -Before you can use attachments, you have to ensure that the attachments-object is set in the schema of your `RxCollection`. - -```javascript - -const mySchema = { - version: 0, - type: 'object', - properties: { - // . - // . - // . - }, - attachments: { - encrypted: true // if true, the attachment-data will be encrypted with the db-password - } -}; - -const myCollection = await myDatabase.addCollections({ - humans: { - schema: mySchema - } -}); -``` - -## putAttachment() - -Adds an attachment to a `RxDocument`. Returns a Promise with the new attachment. - -```javascript -import { createBlob } from 'rxdb'; - -const attachment = await myDocument.putAttachment( - { - id: 'cat.txt', // (string) name of the attachment - data: createBlob('meowmeow', 'text/plain'), // (string|Blob) data of the attachment - type: 'text/plain' // (string) type of the attachment-data like 'image/jpeg' - } -); -``` - -:::warning -Expo/React-Native does not support the `Blob` API natively. Make sure you use your own polyfill that properly supports `blob.arrayBuffer()` when using RxAttachments or use the `putAttachmentBase64()` and `getDataBase64()` so that you do not have to create blobs. -::: - -## putAttachmentBase64() - -Same as `putAttachment()` but accepts a plain base64 string instead of a `Blob`. - -```ts -const attachment = await doc.putAttachmentBase64({ - id: 'cat.txt', - length: 4, - data: 'bWVvdw==', - type: 'text/plain' -}); -``` - -## getAttachment() - -Returns an `RxAttachment` by its id. Returns `null` when the attachment does not exist. - -```javascript -const attachment = myDocument.getAttachment('cat.jpg'); -``` - -## allAttachments() - -Returns an array of all attachments of the `RxDocument`. - -```javascript -const attachments = myDocument.allAttachments(); -``` - -## allAttachments$ - -Gets an Observable which emits a stream of all attachments from the document. Re-emits each time an attachment gets added or removed from the RxDocument. - -```javascript -const all = []; -myDocument.allAttachments$.subscribe( - attachments => all = attachments -); -``` - -## RxAttachment - -The attachments of RxDB are represented by the type `RxAttachment` which has the following attributes/methods. - -### doc - -The `RxDocument` which the attachment is assigned to. - -### id - -The id as `string` of the attachment. - -### type - -The type as `string` of the attachment. - -### length - -The length of the data of the attachment as `number`. - -### digest - -The hash of the attachments data as `string`. - -:::note -The digest is NOT calculated by RxDB, instead it is calculated by the RxStorage. The only guarantee is that the digest will change when the attachments data changes. -::: - -### rev - -The revision-number of the attachment as `number`. - -### remove() - -Removes the attachment. Returns a Promise that resolves when done. - -```javascript -const attachment = myDocument.getAttachment('cat.jpg'); -await attachment.remove(); -``` - -## getData() - -Returns a Promise which resolves the attachment's data as `Blob`. (async) - -```javascript -const attachment = myDocument.getAttachment('cat.jpg'); -const blob = await attachment.getData(); // Blob -``` - -## getDataBase64() - -Returns a Promise which resolves the attachment's data as **base64** `string`. - -```javascript -const attachment = myDocument.getAttachment('cat.jpg'); -const base64Database = await attachment.getDataBase64(); // 'bWVvdw==' -``` - -## getStringData() - -Returns a Promise which resolves the attachment's data as `string`. - -```javascript -const attachment = await myDocument.getAttachment('cat.jpg'); -const data = await attachment.getStringData(); // 'meow' -``` - -# Attachment compression - -Storing many attachments can be a problem when the disc space of the device is exceeded. -Therefore it can make sense to compress the attachments before storing them in the [RxStorage](./rx-storage.md). -With the `attachments-compression` plugin you can compress the attachments data on write and decompress it on reads. -This happens internally and will now change on how you use the api. The compression is run with the [Compression Streams API](https://developer.mozilla.org/en-US/docs/Web/API/Compression_Streams_API) which is only supported on [newer browsers](https://caniuse.com/?search=compressionstream). - -```ts -import { - wrappedAttachmentsCompressionStorage -} from 'rxdb/plugins/attachments-compression'; - -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; - -// create a wrapped storage with attachment-compression. -const storageWithAttachmentsCompression = wrappedAttachmentsCompressionStorage({ - storage: getRxStorageIndexedDB() -}); - -const db = await createRxDatabase({ - name: 'mydatabase', - storage: storageWithAttachmentsCompression -}); - -// set the compression mode at the schema level -const mySchema = { - version: 0, - type: 'object', - properties: { - // . - // . - // . - }, - attachments: { - compression: 'deflate' // <- Specify the compression mode here. OneOf ['deflate', 'gzip'] - } -}; - -/* ... create your collections as usual and store attachments in them. */ - -``` diff --git a/docs/rx-collection.html b/docs/rx-collection.html deleted file mode 100644 index a787039f2a0..00000000000 --- a/docs/rx-collection.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - -Master Data - Create and Manage RxCollections | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxCollection

    -

    A collection stores documents of the same type.

    -

    Creating a Collection

    -

    To create one or more collections you need a RxDatabase object which has the .addCollections()-method. Every collection needs a collection name and a valid RxJsonSchema. Other attributes are optional.

    -
    const myCollections = await myDatabase.addCollections({
    -  // key = collectionName
    -  humans: {
    -    schema: mySchema,
    -    statics: {},                          // (optional) ORM-functions for this collection
    -    methods: {},                          // (optional) ORM-functions for documents
    -    attachments: {},                      // (optional) ORM-functions for attachments
    -    options: {},                          // (optional) Custom parameters that might be used in plugins
    -    migrationStrategies: {},              // (optional)
    -    autoMigrate: true,                    // (optional) [default=true]
    -    cacheReplacementPolicy: function(){}, // (optional) custom cache replacement policy
    -    conflictHandler: function(){}         // (optional) a custom conflict handler can be used
    -  },
    -  // you can create multiple collections at once
    -  animals: {
    -    // ...
    -  }
    -});
    -

    name

    -

    The name uniquely identifies the collection and should be used to refine the collection in the database. Two different collections in the same database can never have the same name. Collection names must match the following regex: ^[a-z][a-z0-9]*$.

    -

    schema

    -

    The schema defines how the documents of the collection are structured. RxDB uses a schema format, similar to JSON schema. Read more about the RxDB schema format here.

    -

    ORM-functions

    -

    With the parameters statics, methods and attachments, you can define ORM-functions that are applied to each of these objects that belong to this collection. See ORM/DRM.

    -

    Migration

    -

    With the parameters migrationStrategies and autoMigrate you can specify how migration between different schema-versions should be done. See Migration.

    -

    Get a collection from the database

    -

    To get an existing collection from the database, call the collection name directly on the database:

    -
    // newly created collection
    -const collections = await db.addCollections({
    -  heroes: {
    -    schema: mySchema
    -  }
    -});
    -const collection2 = db.heroes;
    -console.log(collections.heroes === collection2); //> true
    -

    Functions

    -

    Observe $

    -

    Calling this will return an rxjs-Observable which streams every change to data of this collection.

    -
    myCollection.$.subscribe(changeEvent => console.dir(changeEvent));
    - 
    -// you can also observe single event-types with insert$ update$ remove$
    -myCollection.insert$.subscribe(changeEvent => console.dir(changeEvent));
    -myCollection.update$.subscribe(changeEvent => console.dir(changeEvent));
    -myCollection.remove$.subscribe(changeEvent => console.dir(changeEvent));
    - 
    -

    insert()

    -

    Use this to insert new documents into the database. The collection will validate the schema and automatically encrypt any encrypted fields. Returns the new RxDocument.

    -
    const doc = await myCollection.insert({
    -  name: 'foo',
    -  lastname: 'bar'
    -});
    -

    insertIfNotExists()

    -

    The insertIfNotExists() method attempts to insert a new document into the collection only if a document with the same primary key does not already exist. This is useful for ensuring uniqueness without having to manually check for existing records before inserting or handling conflicts.

    -

    Returns either the newly added RxDocument or the previous existing document.

    -
    const doc = await myCollection.insertIfNotExists({
    -  name: 'foo',
    -  lastname: 'bar'
    -});
    -

    bulkInsert()

    -

    When you have to insert many documents at once, use bulk insert. This is much faster than calling .insert() multiple times. -Returns an object with a success- and error-array.

    -
    const result = await myCollection.bulkInsert([{
    -  name: 'foo1',
    -  lastname: 'bar1'
    -},
    -{
    -  name: 'foo2',
    -  lastname: 'bar2'
    -}]);
    - 
    -// > {
    -//   success: [RxDocument, RxDocument],
    -//   error: []
    -// }
    -
    note

    bulkInsert will not fail on update conflicts and you cannot expect that on failure the other documents are not inserted. Also the call to bulkInsert() it will not throw if a single document errors because of validation errors. Instead it will return the error in the .error property of the returned object.

    -

    bulkRemove()

    -

    When you want to remove many documents at once, use bulk remove. Returns an object with a success- and error-array.

    -
    const result = await myCollection.bulkRemove([
    -  'primary1',
    -  'primary2'
    -]);
    - 
    -// > {
    -//   success: [RxDocument, RxDocument],
    -//   error: []
    -// }
    -

    Instead of providing the document ids, you can also use the RxDocument instances. This can have better performance if your code knows them already at the moment of removing them:

    -
    const result = await myCollection.bulkRemove([
    -  myRxDocument1,
    -  myRxDocument2,
    -  /* ... */
    -]);
    -

    upsert()

    -

    Inserts the document if it does not exist within the collection, otherwise it will overwrite it. Returns the new or overwritten RxDocument.

    -
    const doc = await myCollection.upsert({
    -  name: 'foo',
    -  lastname: 'bar2'
    -});
    -

    bulkUpsert()

    -

    Same as upsert() but runs over multiple documents. Improves performance compared to running many upsert() calls. -Returns an error and a success array.

    -
    const docs = await myCollection.bulkUpsert([
    -  {
    -    name: 'foo',
    -    lastname: 'bar2'
    -  },
    -  {
    -    name: 'bar',
    -    lastname: 'foo2'
    -  }
    -]);
    -/**
    - * {
    - *   success: [RxDocument, RxDocument]
    - *   error: [],
    - * }
    - */
    -

    incrementalUpsert()

    -

    When you run many upsert operations on the same RxDocument in a very short timespan, you might get a 409 Conflict error. -This means that you tried to run a .upsert() on the document, while the previous upsert operation was still running. -To prevent these types of errors, you can run incremental upsert operations. -The behavior is similar to RxDocument.incrementalModify.

    -
    const docData = {
    -    name: 'Bob', // primary
    -    lastName: 'Kelso'
    -};
    - 
    -myCollection.upsert(docData);
    -myCollection.upsert(docData);
    -// -> throws because of parallel update to the same document
    - 
    -myCollection.incrementalUpsert(docData);
    -myCollection.incrementalUpsert(docData);
    -myCollection.incrementalUpsert(docData);
    - 
    -// wait until last upsert finished
    -await myCollection.incrementalUpsert(docData);
    -// -> works
    -

    find()

    -

    To find documents in your collection, use this method. See RxQuery.find().

    -
    // find all that are older than 18
    -const olderDocuments = await myCollection
    -    .find()
    -    .where('age')
    -    .gt(18)
    -    .exec(); // execute
    -

    findOne()

    -

    This does basically what find() does, but it returns only a single document. You can pass a primary value to find a single document more easily.

    -

    To find documents in your collection, use this method. See RxQuery.find().

    -
    // get document with name:foobar
    -myCollection.findOne({
    -  selector: {
    -    name: 'foo'
    -  }
    -}).exec().then(doc => console.dir(doc));
    - 
    -// get document by primary, functionally identical to above query
    -myCollection.findOne('foo')
    -  .exec().then(doc => console.dir(doc));
    -

    findByIds()

    -

    Find many documents by their id (primary value). This has a way better performance than running multiple findOne() or a find() with a big $or selector.

    -

    Returns a Map where the primary key of the document is mapped to the document. Documents that do not exist or are deleted, will not be inside of the returned Map.

    -
    const ids = [
    -  'alice',
    -  'bob',
    -  /* ... */
    -];
    -const docsMap = await myCollection.findByIds(ids);
    - 
    -console.dir(docsMap); // Map(2)
    -
    note

    The Map returned by findByIds is not guaranteed to return elements in the same order as the list of ids passed to it.

    -

    exportJSON()

    -

    Use this function to create a json export from every document in the collection.

    -

    Before exportJSON() and importJSON() can be used, you have to add the json-dump plugin.

    -
    import { addRxPlugin } from 'rxdb';
    -import { RxDBJsonDumpPlugin } from 'rxdb/plugins/json-dump';
    -addRxPlugin(RxDBJsonDumpPlugin);
    -
    myCollection.exportJSON()
    -  .then(json => console.dir(json));
    -

    importJSON()

    -

    To import the json dump into your collection, use this function.

    -
    // import the dump to the database
    -myCollection.importJSON(json)
    -  .then(() => console.log('done'));
    -

    Note that importing will fire events for each inserted document.

    -

    remove()

    -

    Removes all known data of the collection and its previous versions. -This removes the documents, the schemas, and older schemaVersions.

    -
    await myCollection.remove();
    -// collection is now removed and can be re-created
    -

    close()

    -

    Removes the collection's object instance from the RxDatabase. This is to free up memory and stop all observers and replications. It will not delete the collections data. When you create the collection again with database.addCollections(), the newly added collection will still have all data.

    -
    await myCollection.close();
    -

    onClose / onRemove()

    -

    With these you can add a function that is run when the collection was closed or removed. -This works even across multiple browser tabs so you can detect when another tab removes the collection -and you application can behave accordingly.

    -
    await myCollection.onClose(() => console.log('I am closed'));
    -await myCollection.onRemove(() => console.log('I am removed'));
    -

    isRxCollection

    -

    Returns true if the given object is an instance of RxCollection. Returns false if not.

    -
    const is = isRxCollection(myObj);
    -

    FAQ

    -
    When I reload the browser window, will my collections still be in the database?

    No, the javascript instance of the collections will not automatically load into the database on page reloads. -You have to call the addCollections() method each time you create your database. This will create the JavaScript object instance of the RxCollection so that you can use it in the RxDatabase. The persisted data will be automatically in your RxCollection each time you create it.

    -
    How to remove the limit of 16 collections?

    In the open-source version of RxDB, the amount of RxCollections that can exist in parallel is limited to 16. -To remove this limit, you can purchase the Premium Plugins and call the setPremiumFlag() function before creating a database:

    import { setPremiumFlag } from 'rxdb-premium/plugins/shared';
    -setPremiumFlag();
    - - \ No newline at end of file diff --git a/docs/rx-collection.md b/docs/rx-collection.md deleted file mode 100644 index c5e000db159..00000000000 --- a/docs/rx-collection.md +++ /dev/null @@ -1,333 +0,0 @@ -# Master Data - Create and Manage RxCollections - -> Discover how to create, manage, and migrate documents in RxCollections. Harness real-time data flows, secure encryption, and powerful performance in RxDB. - -# RxCollection -A collection stores documents of the same type. - -## Creating a Collection -To create one or more collections you need a RxDatabase object which has the `.addCollections()`-method. Every collection needs a collection name and a valid `RxJsonSchema`. Other attributes are optional. - -```js -const myCollections = await myDatabase.addCollections({ - // key = collectionName - humans: { - schema: mySchema, - statics: {}, // (optional) ORM-functions for this collection - methods: {}, // (optional) ORM-functions for documents - attachments: {}, // (optional) ORM-functions for attachments - options: {}, // (optional) Custom parameters that might be used in plugins - migrationStrategies: {}, // (optional) - autoMigrate: true, // (optional) [default=true] - cacheReplacementPolicy: function(){}, // (optional) custom cache replacement policy - conflictHandler: function(){} // (optional) a custom conflict handler can be used - }, - // you can create multiple collections at once - animals: { - // ... - } -}); -``` - -### name - -The name uniquely identifies the collection and should be used to refine the collection in the database. Two different collections in the same database can never have the same name. Collection names must match the following regex: `^[a-z][a-z0-9]*$`. - -### schema - -The schema defines how the documents of the collection are structured. RxDB uses a schema format, similar to [JSON schema](https://json-schema.org/). Read more about the RxDB schema format [here](./rx-schema.md). - -### ORM-functions -With the parameters `statics`, `methods` and `attachments`, you can define ORM-functions that are applied to each of these objects that belong to this collection. See [ORM/DRM](./orm.md). - -### Migration -With the parameters `migrationStrategies` and `autoMigrate` you can specify how migration between different schema-versions should be done. [See Migration](./migration-schema.md). - -## Get a collection from the database -To get an existing collection from the database, call the collection name directly on the database: - -```javascript -// newly created collection -const collections = await db.addCollections({ - heroes: { - schema: mySchema - } -}); -const collection2 = db.heroes; -console.log(collections.heroes === collection2); //> true -``` - -## Functions - -### Observe $ -Calling this will return an [rxjs-Observable](https://rxjs.dev/guide/observable) which streams every change to data of this collection. - -```js -myCollection.$.subscribe(changeEvent => console.dir(changeEvent)); - -// you can also observe single event-types with insert$ update$ remove$ -myCollection.insert$.subscribe(changeEvent => console.dir(changeEvent)); -myCollection.update$.subscribe(changeEvent => console.dir(changeEvent)); -myCollection.remove$.subscribe(changeEvent => console.dir(changeEvent)); - -``` - -### insert() -Use this to insert new documents into the database. The collection will validate the schema and automatically encrypt any encrypted fields. Returns the new RxDocument. - -```js -const doc = await myCollection.insert({ - name: 'foo', - lastname: 'bar' -}); -``` - -### insertIfNotExists() - -The insertIfNotExists() method attempts to insert a new document into the collection only if a document with the same primary key does not already exist. This is useful for ensuring uniqueness without having to manually check for existing records before inserting or handling [conflicts](./transactions-conflicts-revisions.md). - -Returns either the newly added [RxDocument](./rx-document.md) or the previous existing document. - -```js -const doc = await myCollection.insertIfNotExists({ - name: 'foo', - lastname: 'bar' -}); -``` - -### bulkInsert() - -When you have to insert many documents at once, use bulk insert. This is much faster than calling `.insert()` multiple times. -Returns an object with a `success`- and `error`-array. - -```js -const result = await myCollection.bulkInsert([{ - name: 'foo1', - lastname: 'bar1' -}, -{ - name: 'foo2', - lastname: 'bar2' -}]); - -// > { -// success: [RxDocument, RxDocument], -// error: [] -// } -``` - -:::note -`bulkInsert` will not fail on update conflicts and you cannot expect that on failure the other documents are not inserted. Also the call to `bulkInsert()` it will not throw if a single document errors because of validation errors. Instead it will return the error in the `.error` property of the returned object. -::: - -### bulkRemove() - -When you want to remove many documents at once, use bulk remove. Returns an object with a `success`- and `error`-array. - -```js -const result = await myCollection.bulkRemove([ - 'primary1', - 'primary2' -]); - -// > { -// success: [RxDocument, RxDocument], -// error: [] -// } -``` - -Instead of providing the document ids, you can also use the [RxDocument](./rx-document.md) instances. This can have better performance if your code knows them already at the moment of removing them: -```js -const result = await myCollection.bulkRemove([ - myRxDocument1, - myRxDocument2, - /* ... */ -]); -``` - -### upsert() -Inserts the document if it does not exist within the collection, otherwise it will overwrite it. Returns the new or overwritten RxDocument. -```js -const doc = await myCollection.upsert({ - name: 'foo', - lastname: 'bar2' -}); -``` - -### bulkUpsert() -Same as `upsert()` but runs over multiple documents. Improves performance compared to running many `upsert()` calls. -Returns an `error` and a `success` array. - -```js -const docs = await myCollection.bulkUpsert([ - { - name: 'foo', - lastname: 'bar2' - }, - { - name: 'bar', - lastname: 'foo2' - } -]); -/** - * { - * success: [RxDocument, RxDocument] - * error: [], - * } - */ -``` - -### incrementalUpsert() - -When you run many upsert operations on the same RxDocument in a very short timespan, you might get a `409 Conflict` error. -This means that you tried to run a `.upsert()` on the document, while the previous upsert operation was still running. -To prevent these types of errors, you can run incremental upsert operations. -The behavior is similar to [RxDocument.incrementalModify](./rx-document.md#incrementalModify). - -```js -const docData = { - name: 'Bob', // primary - lastName: 'Kelso' -}; - -myCollection.upsert(docData); -myCollection.upsert(docData); -// -> throws because of parallel update to the same document - -myCollection.incrementalUpsert(docData); -myCollection.incrementalUpsert(docData); -myCollection.incrementalUpsert(docData); - -// wait until last upsert finished -await myCollection.incrementalUpsert(docData); -// -> works -``` - -### find() -To find documents in your collection, use this method. [See RxQuery.find()](./rx-query.md#find). - -```js -// find all that are older than 18 -const olderDocuments = await myCollection - .find() - .where('age') - .gt(18) - .exec(); // execute -``` - -### findOne() -This does basically what find() does, but it returns only a single document. You can pass a primary value to find a single document more easily. - -To find documents in your collection, use this method. [See RxQuery.find()](./rx-query.md#findOne). - -```js -// get document with name:foobar -myCollection.findOne({ - selector: { - name: 'foo' - } -}).exec().then(doc => console.dir(doc)); - -// get document by primary, functionally identical to above query -myCollection.findOne('foo') - .exec().then(doc => console.dir(doc)); -``` - -### findByIds() - -Find many documents by their id (primary value). This has a way better performance than running multiple `findOne()` or a `find()` with a big `$or` selector. - -Returns a `Map` where the primary key of the document is mapped to the document. Documents that do not exist or are deleted, will not be inside of the returned Map. - -```js -const ids = [ - 'alice', - 'bob', - /* ... */ -]; -const docsMap = await myCollection.findByIds(ids); - -console.dir(docsMap); // Map(2) -``` - -:::note -The `Map` returned by `findByIds` is not guaranteed to return elements in the same order as the list of ids passed to it. -::: - -### exportJSON() -Use this function to create a json export from every document in the collection. - -Before `exportJSON()` and `importJSON()` can be used, you have to add the `json-dump` plugin. - -```javascript -import { addRxPlugin } from 'rxdb'; -import { RxDBJsonDumpPlugin } from 'rxdb/plugins/json-dump'; -addRxPlugin(RxDBJsonDumpPlugin); -``` - -```js -myCollection.exportJSON() - .then(json => console.dir(json)); -``` - -### importJSON() -To import the json dump into your collection, use this function. -```js -// import the dump to the database -myCollection.importJSON(json) - .then(() => console.log('done')); -``` -Note that importing will fire events for each inserted document. - -### remove() - -Removes all known data of the collection and its previous versions. -This removes the documents, the schemas, and older schemaVersions. - -```js -await myCollection.remove(); -// collection is now removed and can be re-created -``` - -### close() -Removes the collection's object instance from the [RxDatabase](./rx-database.md). This is to free up memory and stop all observers and replications. It will not delete the collections data. When you create the collection again with `database.addCollections()`, the newly added collection will still have all data. -```js -await myCollection.close(); -``` - -### onClose / onRemove() -With these you can add a function that is run when the collection was closed or removed. -This works even across multiple browser tabs so you can detect when another tab removes the collection -and you application can behave accordingly. - -```js -await myCollection.onClose(() => console.log('I am closed')); -await myCollection.onRemove(() => console.log('I am removed')); -``` - -### isRxCollection -Returns true if the given object is an instance of RxCollection. Returns false if not. -```js -const is = isRxCollection(myObj); -``` - -## FAQ - -
    - When I reload the browser window, will my collections still be in the database? - - No, the javascript instance of the collections will not automatically load into the database on page reloads. - You have to call the `addCollections()` method each time you create your database. This will create the JavaScript object instance of the RxCollection so that you can use it in the RxDatabase. The persisted data will be automatically in your RxCollection each time you create it. - -
    -
    - How to remove the limit of 16 collections? - - In the open-source version of RxDB, the amount of RxCollections that can exist in parallel is limited to `16`. - To remove this limit, you can purchase the [Premium Plugins](/premium/) and call the `setPremiumFlag()` function before creating a database: - ```ts - import { setPremiumFlag } from 'rxdb-premium/plugins/shared'; - setPremiumFlag(); - ``` - -
    diff --git a/docs/rx-database.html b/docs/rx-database.html deleted file mode 100644 index fc176fd442e..00000000000 --- a/docs/rx-database.html +++ /dev/null @@ -1,207 +0,0 @@ - - - - - -RxDatabase - The Core of Your Realtime Data | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxDatabase

    -

    A RxDatabase-Object contains your collections and handles the synchronization of change-events.

    -

    Creation

    -

    The database is created by the asynchronous .createRxDatabase() function of the core RxDB module. It has the following parameters:

    -
    import { createRxDatabase } from 'rxdb/plugins/core';
    -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
    - 
    -const db = await createRxDatabase({
    -  name: 'heroesdb',                   // <- name
    -  storage: getRxStorageLocalstorage(),       // <- RxStorage
    - 
    -  /* Optional parameters: */
    -  password: 'myPassword',             // <- password (optional)
    -  multiInstance: true,                // <- multiInstance (optional, default: true)
    -  eventReduce: true,                  // <- eventReduce (optional, default: false)
    -  cleanupPolicy: {}                   // <- custom cleanup policy (optional) 
    -});
    -

    name

    -

    The database-name is a string which uniquely identifies the database. When two RxDatabases have the same name and use the same RxStorage, their data can be assumed as equal and they will share events between each other. -Depending on the storage or adapter this can also be used to define the filesystem folder of your data.

    -

    storage

    -

    RxDB works on top of an implementation of the RxStorage interface. This interface is an abstraction that allows you to use different underlying databases that actually handle the documents. Depending on your use case you might use a different storage with different tradeoffs in performance, bundle size or supported runtimes.

    -

    There are many RxStorage implementations that can be used depending on the JavaScript environment and performance requirements. -For example you can use the LocalStorage RxStorage in the browser or use the MongoDB RxStorage in Node.js.

    - -
     
    -// use the LocalStroage that stores data in the browser.
    -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
    - 
    -const db = await createRxDatabase({
    -  name: 'mydatabase',
    -  storage: getRxStorageLocalstorage()
    -});
    - 
    - 
    -// ...or use the MongoDB RxStorage in Node.js.
    -import { getRxStorageMongoDB } from 'rxdb/plugins/storage-mongodb';
    - 
    -const dbMongo = await createRxDatabase({
    -  name: 'mydatabase',
    -  storage: getRxStorageMongoDB({
    -    connection: 'mongodb://localhost:27017,localhost:27018,localhost:27019'
    -  })
    -});
    -

    password

    -

    (optional) -If you want to use encrypted fields in the collections of a database, you have to set a password for it. The password must be a string with at least 12 characters.

    -

    Read more about encryption here.

    -

    multiInstance

    -

    (optional=true) -When you create more than one instance of the same database in a single javascript-runtime, you should set multiInstance to true. This will enable the event sharing between the two instances. For example when the user has opened multiple browser windows, events will be shared between them so that both windows react to the same changes. -multiInstance should be set to false when you have single-instances like a single Node.js-process, a react-native-app, a cordova-app or a single-window electron app which can decrease the startup time because no instance coordination has to be done.

    -

    eventReduce

    -

    (optional=false)

    -

    One big benefit of having a realtime database is that big performance optimizations can be done when the database knows a query is observed and the updated results are needed continuously. RxDB uses the EventReduce Algorithm to optimize observer or recurring queries.

    -

    For better performance, you should always set eventReduce: true. This will also be the default in the next major RxDB version.

    -

    ignoreDuplicate

    -

    (optional=false) -If you create multiple RxDatabase-instances with the same name and same adapter, it's very likely that you have done something wrong. -To prevent this common mistake, RxDB will throw an error when you do this. -In some rare cases like unit-tests, you want to do this intentional by setting ignoreDuplicate to true. Because setting ignoreDuplicate: true in production will decrease the performance by having multiple instances of the same database, ignoreDuplicate is only allowed to be set in dev-mode.

    -
    const db1 = await createRxDatabase({
    -  name: 'heroesdb',
    -  storage: getRxStorageLocalstorage(),
    -  ignoreDuplicate: true
    -});
    -const db2 = await createRxDatabase({
    -  name: 'heroesdb',
    -  storage: getRxStorageLocalstorage(),
    -  ignoreDuplicate: true // this create-call will not throw because you explicitly allow it
    -});
    -

    closeDuplicates

    -

    (optional=false)

    -

    Closes all other RxDatabases instances that have the same storage+name combination.

    -
    const db1 = await createRxDatabase({
    -  name: 'heroesdb',
    -  storage: getRxStorageLocalstorage(),
    -  closeDuplicates: true
    -});
    -const db2 = await createRxDatabase({
    -  name: 'heroesdb',
    -  storage: getRxStorageLocalstorage(),
    -  closeDuplicates: true // this create-call will close db1
    -});
    - 
    -// db1 is now closed.
    -

    hashFunction

    -

    By default, RxDB will use crypto.subtle.digest('SHA-256', data) for hashing. If you need a different hash function or the crypto.subtle API is not supported in your JavaScript runtime, you can provide an own hash function instead. A hash function gets a string as input and returns a Promise that resolves a string.

    -
    // example hash function that runs in plain JavaScript
    -import { sha256 } from 'ohash';
    -function myOwnHashFunction(input: string) {
    -    return Promise.resolve(sha256(input));
    -}
    -const db = await createRxDatabase({
    -  hashFunction: myOwnHashFunction
    -  /* ... */
    -});
    -

    If you get the error message TypeError: Cannot read properties of undefined (reading 'digest') this likely means that you are neither running on localhost nor on https which is why your browser might not allow access to crypto.subtle.digest.

    -

    Methods

    -

    Observe with $

    -

    Calling this will return an rxjs-Observable which streams all write events of the RxDatabase.

    -
    myDb.$.subscribe(changeEvent => console.dir(changeEvent));
    -

    exportJSON()

    -

    Use this function to create a json-export from every piece of data in every collection of this database. You can pass true as a parameter to decrypt the encrypted data-fields of your document.

    -

    Before exportJSON() and importJSON() can be used, you have to add the json-dump plugin.

    -
    import { addRxPlugin } from 'rxdb';
    -import { RxDBJsonDumpPlugin } from 'rxdb/plugins/json-dump';
    -addRxPlugin(RxDBJsonDumpPlugin);
    -
    myDatabase.exportJSON()
    -  .then(json => console.dir(json));
    -

    importJSON()

    -

    To import the json-dumps into your database, use this function.

    -
    // import the dump to the database
    -emptyDatabase.importJSON(json)
    -  .then(() => console.log('done'));
    -

    backup()

    -

    Writes the current (or ongoing) database state to the filesystem. Read more

    -

    waitForLeadership()

    -

    Returns a Promise which resolves when the RxDatabase becomes elected leader.

    -

    requestIdlePromise()

    -

    Returns a promise which resolves when the database is in idle. This works similar to requestIdleCallback but tracks the idle-ness of the database instead of the CPU. -Use this for semi-important tasks like cleanups which should not affect the speed of important tasks.

    -
     
    -myDatabase.requestIdlePromise().then(() => {
    -    // this will run at the moment the database has nothing else to do
    -    myCollection.customCleanupFunction();
    -});
    - 
    -// with timeout
    -myDatabase.requestIdlePromise(1000 /* time in ms */).then(() => {
    -    // this will run at the moment the database has nothing else to do
    -    // or the timeout has passed
    -    myCollection.customCleanupFunction();
    -});
    - 
    -

    close()

    -

    Closes the databases object-instance. This is to free up memory and stop all observers and replications. -Returns a Promise that resolves when the database is closed. -Closing a database will not remove the databases data. When you create the database again with createRxDatabase(), all data will still be there.

    -
    await myDatabase.close();
    -

    remove()

    -

    Wipes all documents from the storage. Use this to free up disc space.

    -
    await myDatabase.remove();
    -// database instance is now gone
    -

    You can also clear a database without removing its instance by using removeRxDatabase(). This is useful if you want to migrate data or reset the users state by renaming the database. Then you can remove the previous data with removeRxDatabase() without creating a RxDatabase first. Notice that this will only remove the -stored data on the storage. It will not clear the cache of any RxDatabase instances.

    -
    import { removeRxDatabase } from 'rxdb';
    -removeRxDatabase('mydatabasename', 'localstorage');
    -

    isRxDatabase

    -

    Returns true if the given object is an instance of RxDatabase. Returns false if not.

    -
    import { isRxDatabase } from 'rxdb';
    -const is = isRxDatabase(myObj);
    -

    collections$

    -

    Emits events whenever a RxCollection is added or removed to the instance of the RxDatabase. Notice that this only emits the JavaScript instance of the RxCollection class, it does not emit events across browser tabs.

    -
    const sub = myDatabase.collections$.subscribe(event => {
    -  console.dir(event);
    -});
    - 
    -await myDatabase.addCollections({
    -  heroes: {
    -    schema: mySchema
    -  }
    -});
    - 
    -// -> emits the event
    - 
    -sub.unsubscribe();
    - - \ No newline at end of file diff --git a/docs/rx-database.md b/docs/rx-database.md deleted file mode 100644 index 1b65198b6fe..00000000000 --- a/docs/rx-database.md +++ /dev/null @@ -1,248 +0,0 @@ -# RxDatabase - The Core of Your Realtime Data - -> Get started with RxDatabase and integrate multiple storages. Learn to create, encrypt, and optimize your realtime database today. - -# RxDatabase - -A RxDatabase-Object contains your collections and handles the synchronization of change-events. - -## Creation - -The database is created by the asynchronous `.createRxDatabase()` function of the core RxDB module. It has the following parameters: - -```javascript -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -const db = await createRxDatabase({ - name: 'heroesdb', // <- name - storage: getRxStorageLocalstorage(), // <- RxStorage - - /* Optional parameters: */ - password: 'myPassword', // <- password (optional) - multiInstance: true, // <- multiInstance (optional, default: true) - eventReduce: true, // <- eventReduce (optional, default: false) - cleanupPolicy: {} // <- custom cleanup policy (optional) -}); -``` - -### name - -The database-name is a string which uniquely identifies the database. When two RxDatabases have the same name and use the same `RxStorage`, their data can be assumed as equal and they will share events between each other. -Depending on the storage or adapter this can also be used to define the filesystem folder of your data. - -### storage - -RxDB works on top of an implementation of the [RxStorage](./rx-storage.md) interface. This interface is an abstraction that allows you to use different underlying databases that actually handle the documents. Depending on your use case you might use a different `storage` with different tradeoffs in performance, bundle size or supported runtimes. - -There are many `RxStorage` implementations that can be used depending on the JavaScript environment and performance requirements. -For example you can use the [LocalStorage RxStorage](./rx-storage-localstorage.md) in the browser or use the [MongoDB RxStorage](./rx-storage-mongodb.md) in Node.js. - -- [List of RxStorage implementations](./rx-storage.md) - -```javascript - -// use the LocalStroage that stores data in the browser. -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -const db = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageLocalstorage() -}); - -// ...or use the MongoDB RxStorage in Node.js. -import { getRxStorageMongoDB } from 'rxdb/plugins/storage-mongodb'; - -const dbMongo = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageMongoDB({ - connection: 'mongodb://localhost:27017,localhost:27018,localhost:27019' - }) -}); -``` - -### password -`(optional)` -If you want to use encrypted fields in the collections of a database, you have to set a password for it. The password must be a string with at least 12 characters. - -[Read more about encryption here](./encryption.md). - -### multiInstance -`(optional=true)` -When you create more than one instance of the same database in a single javascript-runtime, you should set `multiInstance` to ```true```. This will enable the event sharing between the two instances. For example when the user has opened multiple browser windows, events will be shared between them so that both windows react to the same changes. -`multiInstance` should be set to `false` when you have single-instances like a single Node.js-process, a react-native-app, a cordova-app or a single-window [electron](./electron-database.md) app which can decrease the startup time because no instance coordination has to be done. - -### eventReduce -`(optional=false)` - -One big benefit of having a realtime database is that big performance optimizations can be done when the database knows a query is observed and the updated results are needed continuously. RxDB uses the [EventReduce Algorithm](https://github.com/pubkey/event-reduce) to optimize observer or recurring queries. - -For better performance, you should always set `eventReduce: true`. This will also be the default in the next major RxDB version. - -### ignoreDuplicate -`(optional=false)` -If you create multiple RxDatabase-instances with the same name and same adapter, it's very likely that you have done something wrong. -To prevent this common mistake, RxDB will throw an error when you do this. -In some rare cases like unit-tests, you want to do this intentional by setting `ignoreDuplicate` to `true`. Because setting `ignoreDuplicate: true` in production will decrease the performance by having multiple instances of the same database, `ignoreDuplicate` is only allowed to be set in [dev-mode](./dev-mode.md). - -```js -const db1 = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage(), - ignoreDuplicate: true -}); -const db2 = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage(), - ignoreDuplicate: true // this create-call will not throw because you explicitly allow it -}); -``` - -### closeDuplicates -`(optional=false)` - -Closes all other RxDatabases instances that have the same storage+name combination. - -```js -const db1 = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage(), - closeDuplicates: true -}); -const db2 = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage(), - closeDuplicates: true // this create-call will close db1 -}); - -// db1 is now closed. -``` - -### hashFunction - -By default, RxDB will use `crypto.subtle.digest('SHA-256', data)` for hashing. If you need a different hash function or the `crypto.subtle` API is not supported in your JavaScript runtime, you can provide an own hash function instead. A hash function gets a string as input and returns a `Promise` that resolves a string. - -```ts -// example hash function that runs in plain JavaScript -import { sha256 } from 'ohash'; -function myOwnHashFunction(input: string) { - return Promise.resolve(sha256(input)); -} -const db = await createRxDatabase({ - hashFunction: myOwnHashFunction - /* ... */ -}); -``` - -If you get the error message `TypeError: Cannot read properties of undefined (reading 'digest')` this likely means that you are neither running on `localhost` nor on `https` which is why your browser might not allow access to `crypto.subtle.digest`. - -## Methods - -### Observe with $ -Calling this will return an [rxjs-Observable](http://reactivex.io/documentation/observable.html) which streams all write events of the `RxDatabase`. - -```javascript -myDb.$.subscribe(changeEvent => console.dir(changeEvent)); -``` - -### exportJSON() -Use this function to create a json-export from every piece of data in every collection of this database. You can pass `true` as a parameter to decrypt the encrypted data-fields of your document. - -Before `exportJSON()` and `importJSON()` can be used, you have to add the `json-dump` plugin. - -```javascript -import { addRxPlugin } from 'rxdb'; -import { RxDBJsonDumpPlugin } from 'rxdb/plugins/json-dump'; -addRxPlugin(RxDBJsonDumpPlugin); -``` - -```javascript -myDatabase.exportJSON() - .then(json => console.dir(json)); -``` - -### importJSON() -To import the json-dumps into your database, use this function. - -```javascript -// import the dump to the database -emptyDatabase.importJSON(json) - .then(() => console.log('done')); -``` - -### backup() - -Writes the current (or ongoing) database state to the filesystem. [Read more](./backup.md) - -### waitForLeadership() -Returns a Promise which resolves when the RxDatabase becomes [elected leader](./leader-election.md). - -### requestIdlePromise() -Returns a promise which resolves when the database is in idle. This works similar to [requestIdleCallback](https://developer.mozilla.org/de/docs/Web/API/Window/requestIdleCallback) but tracks the idle-ness of the database instead of the CPU. -Use this for semi-important tasks like cleanups which should not affect the speed of important tasks. - -```javascript - -myDatabase.requestIdlePromise().then(() => { - // this will run at the moment the database has nothing else to do - myCollection.customCleanupFunction(); -}); - -// with timeout -myDatabase.requestIdlePromise(1000 /* time in ms */).then(() => { - // this will run at the moment the database has nothing else to do - // or the timeout has passed - myCollection.customCleanupFunction(); -}); - -``` - -### close() -Closes the databases object-instance. This is to free up memory and stop all observers and replications. -Returns a `Promise` that resolves when the database is closed. -Closing a database will not remove the databases data. When you create the database again with `createRxDatabase()`, all data will still be there. -```javascript -await myDatabase.close(); -``` - -### remove() -Wipes all documents from the storage. Use this to free up disc space. - -```javascript -await myDatabase.remove(); -// database instance is now gone -``` - -You can also clear a database without removing its instance by using `removeRxDatabase()`. This is useful if you want to migrate data or reset the users state by renaming the database. Then you can remove the previous data with `removeRxDatabase()` without creating a RxDatabase first. Notice that this will only remove the -stored data on the storage. It will not clear the cache of any [RxDatabase](./rx-database.md) instances. -```javascript -import { removeRxDatabase } from 'rxdb'; -removeRxDatabase('mydatabasename', 'localstorage'); -``` - -### isRxDatabase -Returns true if the given object is an instance of RxDatabase. Returns false if not. -```javascript -import { isRxDatabase } from 'rxdb'; -const is = isRxDatabase(myObj); -``` - -### collections$ - -Emits events whenever a [RxCollection](./rx-collection.md) is added or removed to the instance of the RxDatabase. Notice that this only emits the JavaScript instance of the RxCollection class, it does not emit events across browser tabs. - -```javascript -const sub = myDatabase.collections$.subscribe(event => { - console.dir(event); -}); - -await myDatabase.addCollections({ - heroes: { - schema: mySchema - } -}); - -// -> emits the event - -sub.unsubscribe(); -``` diff --git a/docs/rx-document.html b/docs/rx-document.html deleted file mode 100644 index 59447ef6d6c..00000000000 --- a/docs/rx-document.html +++ /dev/null @@ -1,233 +0,0 @@ - - - - - -RxDocument | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxDocument

    -

    A RxDocument is a object which represents the data of a single JSON document is stored in a collection. It can be compared to a single record in a relational database table. You get an RxDocument either as return on inserts/updates, or as result-set of queries.

    -

    RxDB works on RxDocuments instead of plain JSON data to have more convenient operations on the documents. Also Documents that are fetched multiple times by different queries or operations are automatically de-duplicated by RxDB in memory.

    -

    insert

    -

    To insert a document into a collection, you have to call the collection's .insert()-function.

    -
    await myCollection.insert({
    -  name: 'foo',
    -  lastname: 'bar'
    -});
    -

    find

    -

    To find documents in a collection, you have to call the collection's .find()-function. See RxQuery.

    -
    const docs = await myCollection.find().exec(); // <- find all documents
    -

    Functions

    -

    get()

    -

    This will get a single field of the document. If the field is encrypted, it will be automatically decrypted before returning.

    -
    const name = myDocument.get('name'); // returns the name
    -// OR
    -const name = myDocument.name;
    -

    get$()

    -

    This function returns an observable of the given paths-value. -The current value of this path will be emitted each time the document changes.

    -
    // get the live-updating value of 'name'
    -var isName;
    -myDocument.get$('name')
    -  .subscribe(newName => {
    -    isName = newName;
    -  });
    - 
    -await myDocument.incrementalPatch({name: 'foobar2'});
    -console.dir(isName); // isName is now 'foobar2'
    - 
    -// OR
    - 
    -myDocument.name$
    -  .subscribe(newName => {
    -    isName = newName;
    -  });
    - 
    -

    proxy-get

    -

    All properties of a RxDocument are assigned as getters so you can also directly access values instead of using the get()-function.

    -
      // Identical to myDocument.get('name');
    -  var name = myDocument.name;
    -  // Can also get nested values.
    -  var nestedValue = myDocument.whatever.nestedfield;
    - 
    -  // Also usable with observables:
    -  myDocument.firstName$.subscribe(newName => console.log('name is: ' + newName));
    -  // > 'name is: Stefe'
    -  await myDocument.incrementalPatch({firstName: 'Steve'});
    -  // > 'name is: Steve'
    -

    update()

    -

    Updates the document based on the mongo-update-syntax, based on the mingo library.

    -
     
    -/**
    - * If not done before, you have to add the update plugin.
    - */
    -import { addRxPlugin } from 'rxdb';
    -import { RxDBUpdatePlugin } from 'rxdb/plugins/update';
    -addRxPlugin(RxDBUpdatePlugin);
    - 
    -await myDocument.update({
    -    $inc: {
    -        age: 1 // increases age by 1
    -    },
    -    $set: {
    -        firstName: 'foobar' // sets firstName to foobar
    -    }
    -});
    -

    modify()

    -

    Updates a documents data based on a function that mutates the current data and returns the new value.

    -
     
    -const changeFunction = (oldData) => {
    -    oldData.age = oldData.age + 1;
    -    oldData.name = 'foooobarNew';
    -    return oldData;
    -}
    -await myDocument.modify(changeFunction);
    -console.log(myDocument.name); // 'foooobarNew'
    -

    patch()

    -

    Overwrites the given attributes over the documents data.

    -
    await myDocument.patch({
    -  name: 'Steve',
    -  age: undefined // setting an attribute to undefined will remove it
    -});
    -console.log(myDocument.name); // 'Steve'
    -

    Prevent conflicts with the incremental methods

    -

    Making a normal change to the non-latest version of a RxDocument will lead to a 409 CONFLICT error because RxDB -uses revision checks instead of transactions.

    -

    To make a change to a document, no matter what the current state is, you can use the incremental methods:

    -
    // update
    -await myDocument.incrementalUpdate({
    -    $inc: {
    -        age: 1 // increases age by 1
    -    }
    -});
    - 
    -// modify
    -await myDocument.incrementalModify(docData => {
    -  docData.age = docData.age + 1;
    -  return docData;
    -});
    - 
    -// patch
    -await myDocument.incrementalPatch({
    -  age: 100
    -});
    - 
    -// remove
    -await myDocument.incrementalRemove({
    -  age: 100
    -});
    -

    getLatest()

    -

    Returns the latest known state of the RxDocument.

    -
    const myDocument = await myCollection.findOne('foobar').exec();
    -const docAfterEdit = await myDocument.incrementalPatch({
    -  age: 10
    -});
    -const latestDoc = myDocument.getLatest();
    -console.log(docAfterEdit === latestDoc); // > true
    -

    Observe $

    -

    Calling this will return an RxJS-Observable which the current newest state of the RxDocument.

    -
    // get all changeEvents
    -myDocument.$
    -  .subscribe(currentRxDocument => console.dir(currentRxDocument));
    -

    remove()

    -

    This removes the document from the collection. Notice that this will not purge the document from the store but set _deleted:true so that it will be no longer returned on queries. -To fully purge a document, use the cleanup plugin.

    -
    myDocument.remove();
    -

    Remove and update in a single atomic operation

    -

    Sometimes you want to change a documents value and also remove it in the same operation. For example this can be useful when you use replication and want to set a deletedAt timestamp. Then you might have to ensure that setting this timestamp and deleting the document happens in the same atomic operation.

    -

    To do this the modifying operations of a document accept setting the _deleted field. For example:

    -
     
    -// update() and remove()
    -await doc.update({
    -  $set: {
    -    deletedAt: new Date().getTime(),
    -    _deleted: true
    -  }
    -});
    - 
    -// modify() and remove()
    -await doc.modify(data => {
    -  data.age = 1;
    -  data._deleted = true;
    -  return data;
    -});
    -

    deleted$

    -

    Emits a boolean value, depending on whether the RxDocument is deleted or not.

    -
    let lastState = null;
    -myDocument.deleted$.subscribe(state => lastState = state);
    - 
    -console.log(lastState);
    -// false
    - 
    -await myDocument.remove();
    - 
    -console.log(lastState);
    -// true
    -

    get deleted

    -

    A getter to get the current value of deleted$.

    -
    console.log(myDocument.deleted);
    -// false
    - 
    -await myDocument.remove();
    - 
    -console.log(myDocument.deleted);
    -// true
    -

    toJSON()

    -

    Returns the document's data as plain json object. This will return an immutable object. To get something that can be modified, use toMutableJSON() instead.

    -
    const json = myDocument.toJSON();
    -console.dir(json);
    -/* { passportId: 'h1rg9ugdd30o',
    -  firstName: 'Carolina',
    -  lastName: 'Gibson',
    -  age: 33 ...
    -*/
    -

    You can also set withMetaFields: true to get additional meta fields like the revision, attachments or the deleted flag.

    -
    const json = myDocument.toJSON(true);
    -console.dir(json);
    -/* { passportId: 'h1rg9ugdd30o',
    -  firstName: 'Carolina',
    -  lastName: 'Gibson',
    -  _deleted: false,
    -  _attachments: { ... },
    -  _rev: '1-aklsdjfhaklsdjhf...'
    -*/
    -

    toMutableJSON()

    -

    Same as toJSON() but returns a deep cloned object that can be mutated afterwards. -Remember that deep cloning is performance expensive and should only be done when necessary.

    -
    const json = myDocument.toMutableJSON();
    -json.firstName = 'Alice'; // The returned document can be mutated
    -
    All methods of RxDocument are bound to the instance

    When you get a method from a RxDocument, the method is automatically bound to the documents instance. This means you do not have to use things like myMethod.bind(myDocument) like you would do in jsx.

    -

    isRxDocument

    -

    Returns true if the given object is an instance of RxDocument. Returns false if not.

    -
    const is = isRxDocument(myObj);
    - - \ No newline at end of file diff --git a/docs/rx-document.md b/docs/rx-document.md deleted file mode 100644 index 4dff291d006..00000000000 --- a/docs/rx-document.md +++ /dev/null @@ -1,283 +0,0 @@ -# RxDocument - -> Master RxDB's RxDocument - Insert, find, update, remove, and more for streamlined data handling in modern apps. - -# RxDocument -A RxDocument is a object which represents the data of a single JSON document is stored in a collection. It can be compared to a single record in a relational database table. You get an `RxDocument` either as return on inserts/updates, or as result-set of [queries](./rx-query.md). - -RxDB works on RxDocuments instead of plain JSON data to have more convenient operations on the documents. Also Documents that are fetched multiple times by different queries or operations are automatically de-duplicated by RxDB in memory. - -## insert -To insert a document into a collection, you have to call the collection's .insert()-function. -```js -await myCollection.insert({ - name: 'foo', - lastname: 'bar' -}); -``` - -## find -To find documents in a collection, you have to call the collection's .find()-function. [See RxQuery](./rx-query.md). -```js -const docs = await myCollection.find().exec(); // <- find all documents -``` - -## Functions - -### get() -This will get a single field of the document. If the field is encrypted, it will be automatically decrypted before returning. - -```js -const name = myDocument.get('name'); // returns the name -// OR -const name = myDocument.name; -``` - -### get$() -This function returns an observable of the given paths-value. -The current value of this path will be emitted each time the document changes. -```js -// get the live-updating value of 'name' -var isName; -myDocument.get$('name') - .subscribe(newName => { - isName = newName; - }); - -await myDocument.incrementalPatch({name: 'foobar2'}); -console.dir(isName); // isName is now 'foobar2' - -// OR - -myDocument.name$ - .subscribe(newName => { - isName = newName; - }); - -``` - -### proxy-get -All properties of a `RxDocument` are assigned as getters so you can also directly access values instead of using the get()-function. - -```js - // Identical to myDocument.get('name'); - var name = myDocument.name; - // Can also get nested values. - var nestedValue = myDocument.whatever.nestedfield; - - // Also usable with observables: - myDocument.firstName$.subscribe(newName => console.log('name is: ' + newName)); - // > 'name is: Stefe' - await myDocument.incrementalPatch({firstName: 'Steve'}); - // > 'name is: Steve' -``` - -### update() -Updates the document based on the [mongo-update-syntax](https://docs.mongodb.com/manual/reference/operator/update-field/), based on the [mingo library](https://github.com/kofrasa/mingo#updating-documents). - -```js - -/** - * If not done before, you have to add the update plugin. - */ -import { addRxPlugin } from 'rxdb'; -import { RxDBUpdatePlugin } from 'rxdb/plugins/update'; -addRxPlugin(RxDBUpdatePlugin); - -await myDocument.update({ - $inc: { - age: 1 // increases age by 1 - }, - $set: { - firstName: 'foobar' // sets firstName to foobar - } -}); -``` - -### modify() -Updates a documents data based on a function that mutates the current data and returns the new value. - -```js - -const changeFunction = (oldData) => { - oldData.age = oldData.age + 1; - oldData.name = 'foooobarNew'; - return oldData; -} -await myDocument.modify(changeFunction); -console.log(myDocument.name); // 'foooobarNew' -``` - -### patch() - -Overwrites the given attributes over the documents data. - -```js -await myDocument.patch({ - name: 'Steve', - age: undefined // setting an attribute to undefined will remove it -}); -console.log(myDocument.name); // 'Steve' -``` - -### Prevent conflicts with the incremental methods - -Making a normal change to the non-latest version of a `RxDocument` will lead to a `409 CONFLICT` error because RxDB -uses [revision checks](./transactions-conflicts-revisions.md) instead of transactions. - -To make a change to a document, no matter what the current state is, you can use the `incremental` methods: - -```js -// update -await myDocument.incrementalUpdate({ - $inc: { - age: 1 // increases age by 1 - } -}); - -// modify -await myDocument.incrementalModify(docData => { - docData.age = docData.age + 1; - return docData; -}); - -// patch -await myDocument.incrementalPatch({ - age: 100 -}); - -// remove -await myDocument.incrementalRemove({ - age: 100 -}); -``` - -### getLatest() - -Returns the latest known state of the `RxDocument`. - -```js -const myDocument = await myCollection.findOne('foobar').exec(); -const docAfterEdit = await myDocument.incrementalPatch({ - age: 10 -}); -const latestDoc = myDocument.getLatest(); -console.log(docAfterEdit === latestDoc); // > true -``` - -### Observe $ -Calling this will return an [RxJS-Observable](https://rxjs.dev/guide/observable) which the current newest state of the RxDocument. - -```js -// get all changeEvents -myDocument.$ - .subscribe(currentRxDocument => console.dir(currentRxDocument)); -``` - -### remove() -This removes the document from the collection. Notice that this will not purge the document from the store but set `_deleted:true` so that it will be no longer returned on queries. -To fully purge a document, use the [cleanup plugin](./cleanup.md). -```js -myDocument.remove(); -``` - -### Remove and update in a single atomic operation - -Sometimes you want to change a documents value and also remove it in the same operation. For example this can be useful when you use [replication](./replication.md) and want to set a `deletedAt` timestamp. Then you might have to ensure that setting this timestamp and deleting the document happens in the same atomic operation. - -To do this the modifying operations of a document accept setting the `_deleted` field. For example: - -```ts - -// update() and remove() -await doc.update({ - $set: { - deletedAt: new Date().getTime(), - _deleted: true - } -}); - -// modify() and remove() -await doc.modify(data => { - data.age = 1; - data._deleted = true; - return data; -}); -``` - -### deleted$ -Emits a boolean value, depending on whether the RxDocument is deleted or not. - -```js -let lastState = null; -myDocument.deleted$.subscribe(state => lastState = state); - -console.log(lastState); -// false - -await myDocument.remove(); - -console.log(lastState); -// true -``` - -### get deleted -A getter to get the current value of `deleted$`. - -```js -console.log(myDocument.deleted); -// false - -await myDocument.remove(); - -console.log(myDocument.deleted); -// true -``` - -### toJSON() - -Returns the document's data as plain json object. This will return an **immutable** object. To get something that can be modified, use `toMutableJSON()` instead. - -```js -const json = myDocument.toJSON(); -console.dir(json); -/* { passportId: 'h1rg9ugdd30o', - firstName: 'Carolina', - lastName: 'Gibson', - age: 33 ... -*/ -``` - -You can also set `withMetaFields: true` to get additional meta fields like the revision, attachments or the deleted flag. - -```js -const json = myDocument.toJSON(true); -console.dir(json); -/* { passportId: 'h1rg9ugdd30o', - firstName: 'Carolina', - lastName: 'Gibson', - _deleted: false, - _attachments: { ... }, - _rev: '1-aklsdjfhaklsdjhf...' -*/ -``` - -### toMutableJSON() - -Same as `toJSON()` but returns a deep cloned object that can be mutated afterwards. -Remember that deep cloning is performance expensive and should only be done when necessary. - -```js -const json = myDocument.toMutableJSON(); -json.firstName = 'Alice'; // The returned document can be mutated -``` - -:::note All methods of RxDocument are bound to the instance -When you get a method from a `RxDocument`, the method is automatically bound to the documents instance. This means you do not have to use things like `myMethod.bind(myDocument)` like you would do in jsx. -::: - -### isRxDocument -Returns true if the given object is an instance of RxDocument. Returns false if not. -```js -const is = isRxDocument(myObj); -``` diff --git a/docs/rx-local-document.html b/docs/rx-local-document.html deleted file mode 100644 index 97fca8ea5c3..00000000000 --- a/docs/rx-local-document.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - -Master Local Documents in RxDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Local Documents

    -

    Local documents are a special class of documents which are used to store local metadata. -They come in handy when you want to store settings or additional data next to your documents.

    -
      -
    • Local Documents can exist on a RxDatabase or RxCollection.
    • -
    • Local Document do not have to match the collections schema.
    • -
    • Local Documents do not get replicated.
    • -
    • Local Documents will not be found on queries.
    • -
    • Local Documents can not have attachments.
    • -
    • Local Documents will not get handled by the migration-schema.
    • -
    • The id of a local document has the maxLength of 128 characters.
    • -
    -
    note

    While local documents can be very useful, in many cases the RxState API is more convenient.

    -

    Add the local documents plugin

    -

    To enable the local documents, you have to add the local-documents plugin.

    -
    import { addRxPlugin } from 'rxdb';
    -import { RxDBLocalDocumentsPlugin } from 'rxdb/plugins/local-documents';
    -addRxPlugin(RxDBLocalDocumentsPlugin);
    -

    Activate the plugin for a RxDatabase or RxCollection

    -

    For better performance, the local document plugin does not create a storage for every database or collection that is created. -Instead you have to set localDocuments: true when you want to store local documents in the instance.

    -
    // activate local documents on a RxDatabase
    -const myDatabase = await createRxDatabase({
    -    name: 'mydatabase',
    -    storage: getRxStorageLocalstorage(),
    -    localDocuments: true // <- activate this to store local documents in the database
    -});
    - 
    -myDatabase.addCollections({
    -  messages: {
    -    schema: messageSchema,
    -    localDocuments: true // <- activate this to store local documents in the collection
    -  }
    -});
    -
    note

    If you want to store local documents in a RxCollection but NOT in the RxDatabase, you MUST NOT set localDocuments: true in the RxDatabase because it will only slow down the initial database creation.

    -

    insertLocal()

    -

    Creates a local document for the database or collection. Throws if a local document with the same id already exists. Returns a Promise which resolves the new RxLocalDocument.

    -
    const localDoc = await myCollection.insertLocal(
    -    'foobar',   // id
    -    {           // data
    -        foo: 'bar'
    -    }
    -);
    - 
    -// you can also use local-documents on a database
    -const localDoc = await myDatabase.insertLocal(
    -    'foobar',   // id
    -    {           // data
    -        foo: 'bar'
    -    }
    -);
    -

    upsertLocal()

    -

    Creates a local document for the database or collection if not exists. Overwrites the if exists. Returns a Promise which resolves the RxLocalDocument.

    -
    const localDoc = await myCollection.upsertLocal(
    -    'foobar',   // id
    -    {           // data
    -        foo: 'bar'
    -    }
    -);
    -

    getLocal()

    -

    Find a RxLocalDocument by its id. Returns a Promise which resolves the RxLocalDocument or null if not exists.

    -
    const localDoc = await myCollection.getLocal('foobar');
    -

    getLocal$()

    -

    Like getLocal() but returns an Observable that emits the document or null if not exists.

    -
    const subscription = myCollection.getLocal$('foobar').subscribe(documentOrNull => {
    -    console.dir(documentOrNull); // > RxLocalDocument or null
    -});
    -

    RxLocalDocument

    -

    A RxLocalDocument behaves like a normal RxDocument.

    -
    const localDoc = await myCollection.getLocal('foobar');
    - 
    -// access data
    -const foo = localDoc.get('foo');
    - 
    -// change data
    -localDoc.set('foo', 'bar2');
    -await localDoc.save();
    - 
    -// observe data
    -localDoc.get$('foo').subscribe(value => { /* .. */ });
    - 
    -// remove it
    -await localDoc.remove();
    -
    note

    Because the local document does not have a schema, accessing the documents data-fields via pseudo-proxy will not work.

    -
    const foo = localDoc.foo; // undefined
    -const foo = localDoc.get('foo'); // works!
    - 
    -localDoc.foo = 'bar'; // does not work!
    -localDoc.set('foo', 'bar'); // works
    -

    For the usage with typescript, you can have access to the typed data of the document over toJSON()

    -
    declare type MyLocalDocumentType = {
    -  foo: string
    -}
    -const localDoc = await myCollection.upsertLocal<MyLocalDocumentType>(
    -    'foobar',   // id
    -    {           // data
    -        foo: 'bar'
    -    }
    -);
    - 
    -// typescript will know that foo is a string
    -const foo: string = localDoc.toJSON().foo;
    - - \ No newline at end of file diff --git a/docs/rx-local-document.md b/docs/rx-local-document.md deleted file mode 100644 index f4bb364eb56..00000000000 --- a/docs/rx-local-document.md +++ /dev/null @@ -1,157 +0,0 @@ -# Master Local Documents in RxDB - -> Effortlessly store custom metadata and app settings in RxDB. Learn how Local Documents keep data flexible, secure, and easy to manage. - -# Local Documents - -Local documents are a special class of documents which are used to store local metadata. -They come in handy when you want to store settings or additional data next to your documents. - -- Local Documents can exist on a [RxDatabase](./rx-database.md) or [RxCollection](./rx-collection.md). -- Local Document do not have to match the collections schema. -- Local Documents do not get replicated. -- Local Documents will not be found on queries. -- Local Documents can not have attachments. -- Local Documents will not get handled by the [migration-schema](./migration-schema.md). -- The id of a local document has the `maxLength` of `128` characters. - -:::note -While local documents can be very useful, in many cases the [RxState](./rx-state.md) API is more convenient. -::: - -## Add the local documents plugin - -To enable the local documents, you have to add the `local-documents` plugin. - -```ts -import { addRxPlugin } from 'rxdb'; -import { RxDBLocalDocumentsPlugin } from 'rxdb/plugins/local-documents'; -addRxPlugin(RxDBLocalDocumentsPlugin); -``` - -## Activate the plugin for a RxDatabase or RxCollection - -For better performance, the local document plugin does not create a storage for every database or collection that is created. -Instead you have to set `localDocuments: true` when you want to store local documents in the instance. - -```js -// activate local documents on a RxDatabase -const myDatabase = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageLocalstorage(), - localDocuments: true // <- activate this to store local documents in the database -}); - -myDatabase.addCollections({ - messages: { - schema: messageSchema, - localDocuments: true // <- activate this to store local documents in the collection - } -}); -``` - -:::note -If you want to store local documents in a `RxCollection` but **NOT** in the `RxDatabase`, you **MUST NOT** set `localDocuments: true` in the `RxDatabase` because it will only slow down the initial database creation. -::: - -## insertLocal() - -Creates a local document for the database or collection. Throws if a local document with the same id already exists. Returns a Promise which resolves the new `RxLocalDocument`. - -```javascript -const localDoc = await myCollection.insertLocal( - 'foobar', // id - { // data - foo: 'bar' - } -); - -// you can also use local-documents on a database -const localDoc = await myDatabase.insertLocal( - 'foobar', // id - { // data - foo: 'bar' - } -); -``` - -## upsertLocal() - -Creates a local document for the database or collection if not exists. Overwrites the if exists. Returns a Promise which resolves the `RxLocalDocument`. - -```javascript -const localDoc = await myCollection.upsertLocal( - 'foobar', // id - { // data - foo: 'bar' - } -); -``` - -## getLocal() - -Find a `RxLocalDocument` by its id. Returns a Promise which resolves the `RxLocalDocument` or `null` if not exists. - -```javascript -const localDoc = await myCollection.getLocal('foobar'); -``` - -## getLocal$() - -Like `getLocal()` but returns an `Observable` that emits the document or `null` if not exists. - -```javascript -const subscription = myCollection.getLocal$('foobar').subscribe(documentOrNull => { - console.dir(documentOrNull); // > RxLocalDocument or null -}); -``` - -## RxLocalDocument - -A `RxLocalDocument` behaves like a normal `RxDocument`. - -```javascript -const localDoc = await myCollection.getLocal('foobar'); - -// access data -const foo = localDoc.get('foo'); - -// change data -localDoc.set('foo', 'bar2'); -await localDoc.save(); - -// observe data -localDoc.get$('foo').subscribe(value => { /* .. */ }); - -// remove it -await localDoc.remove(); -``` - -:::note -Because the local document does not have a schema, accessing the documents data-fields via pseudo-proxy will not work. -::: - -```javascript -const foo = localDoc.foo; // undefined -const foo = localDoc.get('foo'); // works! - -localDoc.foo = 'bar'; // does not work! -localDoc.set('foo', 'bar'); // works -``` - -For the usage with typescript, you can have access to the typed data of the document over `toJSON()` - -```ts -declare type MyLocalDocumentType = { - foo: string -} -const localDoc = await myCollection.upsertLocal( - 'foobar', // id - { // data - foo: 'bar' - } -); - -// typescript will know that foo is a string -const foo: string = localDoc.toJSON().foo; -``` diff --git a/docs/rx-pipeline.html b/docs/rx-pipeline.html deleted file mode 100644 index d518c47133c..00000000000 --- a/docs/rx-pipeline.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - -RxPipeline - Automate Data Flows in RxDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxPipeline

    -

    The RxPipeline plugin enables you to run operations depending on writes to a collection. -Whenever a write happens on the source collection of a pipeline, a handler is called to process the writes and run operations on another collection.

    -

    You could have a similar behavior by observing the collection stream and process data on emits:

    -
    mySourceCollection.$.subscribe(event => {/* ...process...*/});
    -

    While this could work in some cases, it causes many problems that are fixed by using the pipeline plugin instead:

    -
      -
    • In an RxPipeline, only the Leading Instance runs the operations. For example when you have multiple browser tabs open, only one will run the processing and when that tab is closed, another tab will become elected leader and continue the pipeline processing.
    • -
    • On sudden stops and restarts of the JavaScript process, the processing will continue at the correct checkpoint and not miss out any documents even on unexpected crashes.
    • -
    • Reads/Writes on the destination collection are halted while the pipeline is processing. This ensures your queries only return fully processed documents and no partial results. So when you run a query to the destination collection directly after a write to the source collection, you can be sure your query results are up to date and the pipeline has already been run at the moment the query resolved:
    • -
    -
    await mySourceCollection.insert({/* ... */});
    - 
    -/**
    - * Because our pipeline blocks reads to the destination,
    - * we know that the result array contains data created
    - * on top of the previously inserted documents.
    - */
    -const result = myDestinationCollection.find().exec();
    -

    Creating a RxPipeline

    -

    Pipelines are created on top of a source RxCollection and have another RxCollection as destination. An identifier is used to identify the state of the pipeline so that different pipelines have a different processing checkpoint state. A plain JavaScript function handler is used to process the data of the source collection writes.

    -
    const pipeline = await mySourceCollection.addPipeline({
    -    identifier: 'my-pipeline',
    -    destination: myDestinationCollection,
    -    handler: async (docs) => {
    -        /**
    -         * Here you can process the documents and write to
    -         * the destination collection.
    -         */
    -        for (const doc of docs) {
    -            await myDestinationCollection.insert({
    -                id: doc.primary,
    -                category: doc.category
    -            });
    -        }
    -    }
    -});
    -

    Use Cases for RxPipeline

    -

    The RxPipeline is a handy building block for different features and plugins. You can use it to aggregate data or restructure local data.

    -

    UseCase: Re-Index data that comes from replication

    -

    Sometimes you want to replicate atomic documents over the wire but locally you want to split these documents for better indexing. For example you replicate email documents that have multiple receivers in a string-array. While string-arrays cannot be indexed, locally you need a way to query for all emails of a given receiver. -To handle this case you can set up a RxPipeline that writes the mapping into a separate collection:

    -
    const pipeline = await emailCollection.addPipeline({
    -    identifier: 'map-email-receivers',
    -    destination: emailByReceiverCollection,
    -    handler: async (docs) => {
    -        for (const doc of docs) {
    -            // remove previous mapping
    -            await emailByReceiverCollection.find({emailId: doc.primary}).remove();
    -            // add new mapping
    -            if(!doc.deleted) {
    -                await emailByReceiverCollection.bulkInsert(
    -                    doc.receivers.map(receiver => ({
    -                        emailId: doc.primary,
    -                        receiver: receiver
    -                    }))
    -                );
    -            }
    -        }
    -    }
    -});
    -

    With this you can efficiently query for "all emails that a person received" by running:

    -
    const mailIds = await emailByReceiverCollection.find({
    -    receiver: 'foobar@example.com'
    -}).exec();
    - -

    You can utilize the pipeline plugin to index text data for efficient fulltext search.

    -
    const pipeline = await emailCollection.addPipeline({
    -    identifier: 'email-fulltext-search',
    -    destination: mailByWordCollection,
    -    handler: async (docs) => {
    -        for (const doc of docs) {
    -            // remove previous mapping
    -            await mailByWordCollection.find({emailId: doc.primary}).remove();
    -            // add new mapping
    -            if(!doc.deleted) {
    -                const words = doc.text.split(' ');
    -                await mailByWordCollection.bulkInsert(
    -                    words.map(word => ({
    -                        emailId: doc.primary,
    -                        word: word
    -                    }))
    -                );
    -            }
    -        }
    -    }
    -});
    -

    With this you can efficiently query for "all emails that contain a given word" by running:

    -
    const mailIds = await emailByReceiverCollection.find({word: 'foobar'}).exec();
    -

    UseCase: Download data based on source documents

    -

    When you have to fetch data for each document of a collection from a server, you can use the pipeline to ensure all documents have their data downloaded and no document is missed.

    -
    const pipeline = await emailCollection.addPipeline({
    -    identifier: 'download-data',
    -    destination: serverDataCollection,
    -    handler: async (docs) => {
    -        for (const doc of docs) {
    -            const response = await fetch('https://example.com/doc/' + doc.primary);
    -            const serverData = await response.json();
    -            await serverDataCollection.upsert({
    -                id: doc.primary,
    -                data: serverData
    -            });
    -        }
    -    }
    -});
    -

    RxPipeline methods

    -

    awaitIdle()

    -

    You can await the idleness of a pipeline with await myRxPipeline.awaitIdle(). This will await a promise that resolves when the pipeline has processed all documents and is not running anymore.

    -

    close()

    -

    await myRxPipeline.close() stops the pipeline so that it is no longer doing stuff. This is automatically called when the RxCollection or RxDatabase of the pipeline is closed.

    -

    remove()

    -

    await myRxPipeline.remove() removes the pipeline and all metadata which it has stored. Recreating the pipeline afterwards will start processing all source documents from scratch.

    -

    Using RxPipeline correctly

    -

    Pipeline handlers must be idempotent

    -

    Because a JavaScript process can exit at any time, like when the user closes a browser tab, the pipeline handler function must be idempotent. This means when it only runs partially and is started again with the same input, it should still end up in the correct result.

    -

    Pipeline handlers must not throw

    -

    Pipeline handlers must never throw. If you run operations inside of the handler that might cause errors, you must wrap the handler's code with a try-catch by yourself and also handle retries. If your handler throws, your pipeline will be stuck and no longer be usable, which should never happen.

    -

    Be careful when doing http requests in the handler

    -

    When you run http requests inside of your handler, you no longer have an offline first application because reads to the destination collection will be blocked until all handlers have finished. When your client is offline, therefore the collection will be blocked for reads and writes.

    -

    Pipelines temporarily block external reads and writes

    -

    While a pipeline is running, all reads and writes to its destination collection are blocked. This guarantees that queries never observe partially processed data, but it also means that pipelines can block each other if they interact incorrectly.

    -

    Problems occur when multiple pipelines:

    -
      -
    • read or write across the same collections, or
    • -
    • wait for each other using awaitIdle() from inside a pipeline handler.
    • -
    -
    // Example of a deadlock
    - 
    -// Pipeline A: files → files (reads folders)
    -const pipelineA = await db.files.addPipeline({
    -  identifier: 'file-path-sync',
    -  destination: db.files,
    -  handler: async (docs) => {
    -    const folders = await folders.find().exec(); // can block
    -    /* ... */
    -  }
    -});
    - 
    -// Pipeline B: files → folders (waits for A)
    -await db.folders.addPipeline({
    -  identifier: 'file-count',
    -  destination: db.folders,
    -  handler: async () => {
    -    await pipelineA.awaitIdle(); // ❌ may deadlock
    -    /* ... */
    -  }
    -});
    -

    To prevent deadlocks, consider:

    -
      -
    • Never call awaitIdle() inside a pipeline handler.
    • -
    • Avoid circular dependencies between pipelines.
    • -
    • Prefer one-directional data flow.
    • -
    - - \ No newline at end of file diff --git a/docs/rx-pipeline.md b/docs/rx-pipeline.md deleted file mode 100644 index 5dc089771f1..00000000000 --- a/docs/rx-pipeline.md +++ /dev/null @@ -1,213 +0,0 @@ -# RxPipeline - Automate Data Flows in RxDB - -> Discover how RxPipeline automates your data workflows. Seamlessly process writes, manage leader election, and ensure crash-safe operations in RxDB. - -# RxPipeline - -The RxPipeline plugin enables you to run operations depending on writes to a collection. -Whenever a write happens on the source collection of a pipeline, a handler is called to process the writes and run operations on another collection. - -You could have a similar behavior by observing the collection stream and process data on emits: - -```ts -mySourceCollection.$.subscribe(event => {/* ...process...*/}); -``` - -While this could work in some cases, it causes many problems that are fixed by using the pipeline plugin instead: -- In an RxPipeline, only the [Leading Instance](./leader-election.md) runs the operations. For example when you have multiple browser tabs open, only one will run the processing and when that tab is closed, another tab will become elected leader and continue the pipeline processing. -- On sudden stops and restarts of the JavaScript process, the processing will continue at the correct checkpoint and not miss out any documents even on unexpected crashes. -- Reads/Writes on the destination collection are halted while the pipeline is processing. This ensures your queries only return fully processed documents and no partial results. So when you run a query to the destination collection directly after a write to the source collection, you can be sure your query results are up to date and the pipeline has already been run at the moment the query resolved: - -```ts -await mySourceCollection.insert({/* ... */}); - -/** - * Because our pipeline blocks reads to the destination, - * we know that the result array contains data created - * on top of the previously inserted documents. - */ -const result = myDestinationCollection.find().exec(); -``` - -## Creating a RxPipeline - -Pipelines are created on top of a source [RxCollection](./rx-collection.md) and have another `RxCollection` as destination. An identifier is used to identify the state of the pipeline so that different pipelines have a different processing checkpoint state. A plain JavaScript function `handler` is used to process the data of the source collection writes. - -```ts -const pipeline = await mySourceCollection.addPipeline({ - identifier: 'my-pipeline', - destination: myDestinationCollection, - handler: async (docs) => { - /** - * Here you can process the documents and write to - * the destination collection. - */ - for (const doc of docs) { - await myDestinationCollection.insert({ - id: doc.primary, - category: doc.category - }); - } - } -}); -``` - -## Use Cases for RxPipeline - -The RxPipeline is a handy building block for different features and plugins. You can use it to aggregate data or restructure local data. - -### UseCase: Re-Index data that comes from replication - -Sometimes you want to [replicate](./replication.md) atomic documents over the wire but locally you want to split these documents for better indexing. For example you replicate email documents that have multiple receivers in a string-array. While string-arrays cannot be indexed, locally you need a way to query for all emails of a given receiver. -To handle this case you can set up a RxPipeline that writes the mapping into a separate collection: - -```ts -const pipeline = await emailCollection.addPipeline({ - identifier: 'map-email-receivers', - destination: emailByReceiverCollection, - handler: async (docs) => { - for (const doc of docs) { - // remove previous mapping - await emailByReceiverCollection.find({emailId: doc.primary}).remove(); - // add new mapping - if(!doc.deleted) { - await emailByReceiverCollection.bulkInsert( - doc.receivers.map(receiver => ({ - emailId: doc.primary, - receiver: receiver - })) - ); - } - } - } -}); -``` - -With this you can efficiently query for "all emails that a person received" by running: - -```ts -const mailIds = await emailByReceiverCollection.find({ - receiver: 'foobar@example.com' -}).exec(); -``` - -### UseCase: Fulltext Search - -You can utilize the pipeline plugin to index text data for efficient fulltext search. - -```ts -const pipeline = await emailCollection.addPipeline({ - identifier: 'email-fulltext-search', - destination: mailByWordCollection, - handler: async (docs) => { - for (const doc of docs) { - // remove previous mapping - await mailByWordCollection.find({emailId: doc.primary}).remove(); - // add new mapping - if(!doc.deleted) { - const words = doc.text.split(' '); - await mailByWordCollection.bulkInsert( - words.map(word => ({ - emailId: doc.primary, - word: word - })) - ); - } - } - } -}); -``` - -With this you can efficiently query for "all emails that contain a given word" by running: - -```ts -const mailIds = await emailByReceiverCollection.find({word: 'foobar'}).exec(); -``` - -### UseCase: Download data based on source documents - -When you have to fetch data for each document of a collection from a server, you can use the pipeline to ensure all documents have their data downloaded and no document is missed. - -```ts -const pipeline = await emailCollection.addPipeline({ - identifier: 'download-data', - destination: serverDataCollection, - handler: async (docs) => { - for (const doc of docs) { - const response = await fetch('https://example.com/doc/' + doc.primary); - const serverData = await response.json(); - await serverDataCollection.upsert({ - id: doc.primary, - data: serverData - }); - } - } -}); -``` - -## RxPipeline methods - -### awaitIdle() - -You can await the idleness of a pipeline with `await myRxPipeline.awaitIdle()`. This will await a promise that resolves when the pipeline has processed all documents and is not running anymore. - -### close() - -`await myRxPipeline.close()` stops the pipeline so that it is no longer doing stuff. This is automatically called when the RxCollection or RxDatabase of the pipeline is closed. - -### remove() - -`await myRxPipeline.remove()` removes the pipeline and all metadata which it has stored. Recreating the pipeline afterwards will start processing all source documents from scratch. - -## Using RxPipeline correctly - -### Pipeline handlers must be idempotent - -Because a JavaScript process can exit at any time, like when the user closes a browser tab, the pipeline handler function must be idempotent. This means when it only runs partially and is started again with the same input, it should still end up in the correct result. - -### Pipeline handlers must not throw - -Pipeline handlers must never throw. If you run operations inside of the handler that might cause errors, you must wrap the handler's code with a `try-catch` by yourself and also handle retries. If your handler throws, your pipeline will be stuck and no longer be usable, which should never happen. - -### Be careful when doing http requests in the handler - -When you run http requests inside of your handler, you no longer have an [offline first](./offline-first.md) application because reads to the destination collection will be blocked until all handlers have finished. When your client is offline, therefore the collection will be blocked for reads and writes. - -### Pipelines temporarily block external reads and writes - -While a pipeline is running, **all reads and writes to its destination collection are blocked**. This guarantees that queries never observe partially processed data, but it also means that pipelines can block each other if they interact incorrectly. - -Problems occur when multiple pipelines: - -- read or write across the same collections, or -- wait for each other using `awaitIdle()` from inside a pipeline handler. - -```ts -// Example of a deadlock - -// Pipeline A: files → files (reads folders) -const pipelineA = await db.files.addPipeline({ - identifier: 'file-path-sync', - destination: db.files, - handler: async (docs) => { - const folders = await folders.find().exec(); // can block - /* ... */ - } -}); - -// Pipeline B: files → folders (waits for A) -await db.folders.addPipeline({ - identifier: 'file-count', - destination: db.folders, - handler: async () => { - await pipelineA.awaitIdle(); // ❌ may deadlock - /* ... */ - } -}); -``` - -To prevent deadlocks, consider: - -- Never call `awaitIdle()` inside a pipeline handler. -- Avoid circular dependencies between pipelines. -- Prefer one-directional data flow. diff --git a/docs/rx-query.html b/docs/rx-query.html deleted file mode 100644 index b22cd1ab8aa..00000000000 --- a/docs/rx-query.html +++ /dev/null @@ -1,390 +0,0 @@ - - - - - -RxQuery | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxQuery

    -

    To find documents inside of an RxCollection, RxDB uses the RxQuery interface that handles all query operations: it serves as the main interface for fetching documents, relies on a MongoDB-like Mango Query Syntax, and provides three types of queries: find(), findOne() and count(). By caching and de-duplicating results, RxQuery ensures efficient in-memory handling, and when queries are observed or re-run, the EventReduce algorithm speeds up updates for a fast real-time experience and queries that run more than once.

    -

    find()

    -

    To create a basic RxQuery, call .find() on a collection and insert selectors. The result-set of normal queries is an array with documents.

    -
    // find all that are older then 18
    -const query = myCollection
    -    .find({
    -      selector: {
    -        age: {
    -          $gt: 18
    -        }
    -      }
    -    });
    -

    findOne()

    -

    A findOne-query has only a single RxDocument or null as result-set.

    -
    // find alice
    -const query = myCollection
    -    .findOne({
    -      selector: {
    -        name: 'alice'
    -      }
    -    });
    -
    // find the youngest one
    -const query = myCollection
    -    .findOne({
    -      selector: {},
    -      sort: [
    -        {age: 'asc'}
    -      ]
    -    });
    -
    // find one document by the primary key
    -const query = myCollection.findOne('foobar');
    -

    exec()

    -

    Returns a Promise that resolves with the result-set of the query.

    -
    const query = myCollection.find();
    -const results = await query.exec();
    -console.dir(results); // > [RxDocument,RxDocument,RxDocument..]
    -

    On .findOne() queries, you can call .exec(true) to ensure your document exists and to make TypeScript handling easier:

    -
    // docOrUndefined can be the type RxDocument or null which then has to be handled to be typesafe.
    -const docOrUndefined = await myCollection.findOne().exec();
    - 
    -// with .exec(true), it will throw if the document cannot be found and always have the type RxDocument
    -const doc = await myCollection.findOne().exec(true);
    -

    Observe $

    -

    An BehaviorSubject see that always has the current result-set as value. -This is extremely helpful when used together with UIs that should always show the same state as what is written in the database.

    -
    const query = myCollection.find();
    -const querySub = query.$.subscribe(results => {
    -    console.log('got results: ' + results.length);
    -});
    -// > 'got results: 5'   // BehaviorSubjects emit on subscription
    - 
    -await myCollection.insert({/* ... */}); // insert one
    -// > 'got results: 6'   // $.subscribe() was called again with the new results
    - 
    -// stop watching this query
    -querySub.unsubscribe()
    -

    update()

    -

    Runs an update on every RxDocument of the query-result.

    -
     
    -// to use the update() method, you need to add the update plugin.
    -import { RxDBUpdatePlugin } from 'rxdb/plugins/update';
    -addRxPlugin(RxDBUpdatePlugin);
    - 
    -const query = myCollection.find({
    -  selector: {
    -    age: {
    -      $gt: 18
    -    }
    -  }
    -});
    -await query.update({
    -    $inc: {
    -        age: 1 // increases age of every found document by 1
    -    }
    -});
    -

    patch() / incrementalPatch()

    -

    Runs the RxDocument.patch() function on every RxDocument of the query result.

    -
    const query = myCollection.find({
    -  selector: {
    -    age: {
    -      $gt: 18
    -    }
    -  }
    -});
    -await query.patch({
    -  age: 12 // set the age of every found to 12
    -});
    -

    modify() / incrementalModify()

    -

    Runs the RxDocument.modify() function on every RxDocument of the query result.

    -
    const query = myCollection.find({
    -  selector: {
    -    age: {
    -      $gt: 18
    -    }
    -  }
    -});
    -await query.modify((docData) => {
    -  docData.age = docData.age + 1; // increases age of every found document by 1
    -  return docData;
    -});
    -

    remove() / incrementalRemove()

    -

    Deletes all found documents. Returns a promise which resolves to the deleted documents.

    -
    // All documents where the age is less than 18
    -const query = myCollection.find({
    -  selector: {
    -    age: {
    -      $lt: 18
    -    }
    -  }
    -});
    -// Remove the documents from the collection
    -const removedDocs = await query.remove();
    -

    doesDocumentDataMatch()

    -

    Returns true if the given document data matches the query.

    -
    const documentData = {
    -  id: 'foobar',
    -  age: 19
    -};
    - 
    -myCollection.find({
    -  selector: {
    -    age: {
    -      $gt: 18
    -    }
    -  }
    -}).doesDocumentDataMatch(documentData); // > true
    - 
    -myCollection.find({
    -  selector: {
    -    age: {
    -      $gt: 20
    -    }
    -  }
    -}).doesDocumentDataMatch(documentData); // > false
    -

    Query Builder Plugin

    -

    To use chained query methods, you can also use the query-builder plugin.

    -
    // add the query builder plugin
    -import { addRxPlugin } from 'rxdb';
    -import { RxDBQueryBuilderPlugin } from 'rxdb/plugins/query-builder';
    -addRxPlugin(RxDBQueryBuilderPlugin);
    - 
    -// now you can use chained query methods
    - 
    -const query = myCollection.find().where('age').gt(18);
    -const result = await query.exec();
    -

    Query Examples

    -

    Here some examples to fast learn how to write queries without reading the docs.

    - -
    // directly pass search-object
    -myCollection.find({
    -  selector: {
    -    name: { $eq: 'foo' }
    -  }
    -})
    -.exec().then(documents => console.dir(documents));
    - 
    -/*
    - * find by using sql equivalent '%like%' syntax
    - * This example will fe: match 'foo' but also 'fifoo' or 'foofa' or 'fifoofa'
    - * Notice that in RxDB queries, a regex is represented as a $regex string with the $options parameter for flags.
    - * Using a RegExp instance is not allowed because they are not JSON.stringify()-able and also
    - * RegExp instances are mutable which could cause undefined behavior when the RegExp is mutated
    - * after the query was parsed.
    - */
    -myCollection.find({
    -  selector: {
    -    name: { $regex: '.*foo.*' }
    -  }
    -})
    -.exec().then(documents => console.dir(documents));
    - 
    -// find using a composite statement eg: $or
    -// This example checks where name is either foo or if name is not existent on the document
    -myCollection.find({
    -  selector: { $or: [ { name: { $eq: 'foo' } }, { name: { $exists: false } }] }
    -})
    -.exec().then(documents => console.dir(documents));
    - 
    -// do a case insensitive search
    -// This example will match 'foo' or 'FOO' or 'FoO' etc...
    -myCollection.find({
    -  selector: { name: { $regex: '^foo$', $options: 'i' } }
    -})
    -.exec().then(documents => console.dir(documents));
    - 
    -// chained queries
    -myCollection.find().where('name').eq('foo')
    -.exec().then(documents => console.dir(documents));
    -
    RxDB will always append the primary key to the sort parameters

    For several performance optimizations, like the EventReduce algorithm, RxDB expects all queries to return a deterministic sort order that does not depend on the insert order of the documents. To ensure a deterministic ordering, RxDB will always append the primary key as last sort parameter to all queries and to all indexes. -This works in contrast to most other databases where a query without sorting would return the documents in the order in which they had been inserted to the database.

    -

    Setting a specific index

    -

    By default, the query will be sent to the RxStorage, where a query planner will determine which one of the available indexes must be used. -But the query planner cannot know everything and sometimes will not pick the most optimal index. -To improve query performance, you can specify which index must be used, when running the query.

    -
    const query = myCollection
    -    .findOne({
    -      selector: {
    -        age: {
    -          $gt: 18
    -        },
    -        gender: {
    -          $eq: 'm'
    -        }
    -      },
    -      /**
    -       * Because the developer knows that 50% of the documents are 'male',
    -       * but only 20% are below age 18,
    -       * it makes sense to enforce using the ['gender', 'age'] index to improve performance.
    -       * This could not be known by the query planer which might have chosen ['age', 'gender'] instead.
    -       */
    -      index: ['gender', 'age']
    -    });
    -

    Count

    -

    When you only need the amount of documents that match a query, but you do not need the document data itself, you can use a count query for better performance. -The performance difference compared to a normal query differs depending on which RxStorage implementation is used.

    -
    const query = myCollection.count({
    -  selector: {
    -    age: {
    -      $gt: 18
    -    }
    -  }
    -  // 'limit' and 'skip' MUST NOT be set for count queries.
    -});
    - 
    -// get the count result once
    -const matchingAmount = await query.exec(); // > number
    - 
    -// observe the result
    -query.$.subscribe(amount => {
    -  console.log('Currently has ' + amount + ' documents');
    -});
    -
    note

    Count queries have a better performance than normal queries because they do not have to fetch the full document data out of the storage. Therefore it is not possible to run a count() query with a selector that requires to fetch and compare the document data. So if your query selector does not fully match an index of the schema, it is not allowed to run it. These queries would have no performance benefit compared to normal queries but have the tradeoff of not using the fetched document data for caching.

    -
    /**
    - * The following will throw an error because
    - * the count operation cannot run on any specific index range
    - * because the $regex operator is used.
    - */
    -const query = myCollection.count({
    -  selector: {
    -    age: {
    -      $regex: 'foobar'
    -    }
    -  }
    -});
    - 
    -/**
    - * The following will throw an error because
    - * the count operation cannot run on any specific index range
    - * because there is no ['age' ,'otherNumber'] index
    - * defined in the schema.
    - */
    -const query = myCollection.count({
    -  selector: {
    -    age: {
    -      $gt: 20
    -    },
    -    otherNumber: {
    -      $gt: 10
    -    }
    -  }
    -});
    -

    If you want to count these kinds of queries, you should do a normal query instead and use the length of the result set as counter. This has the same performance as running a non-fully-indexed count which has to fetch all document data from the database and run a query matcher.

    -
    // get count manually once
    -const resultSet = await myCollection.find({
    -  selector: {
    -    age: {
    -      $regex: 'foobar'
    -    }
    -  }
    -}).exec();
    -const count = resultSet.length;
    - 
    -// observe count manually
    -const count$ = myCollection.find({
    -  selector: {
    -    age: {
    -      $regex: 'foobar'
    -    }
    -  }
    -}).$.pipe(
    -  map(result => result.length)
    -);
    - 
    -/**
    - * To allow non-fully-indexed count queries,
    - * you can also specify that by setting allowSlowCount=true
    - * when creating the database.
    - */
    -const database = await createRxDatabase({
    -    name: 'mydatabase',
    -    allowSlowCount: true, // set this to true [default=false]
    -    /* ... */
    -});
    -

    allowSlowCount

    -

    To allow non-fully-indexed count queries, you can also specify that by setting allowSlowCount: true when creating the database. -Doing this is mostly not wanted, because it would run the counting on the storage without having the document stored in the RxDB document cache. -This is only recommended if the RxStorage is running remotely like in a WebWorker and you not always want to send the document-data between the worker and the main thread. In this case you might only need the count-result instead to save performance.

    -

    RxQuery's are immutable

    -

    Because RxDB is a reactive database, we can do heavy performance-optimisation on query-results which change over time. To be able to do this, RxQuery's have to be immutable. -This means, when you have a RxQuery and run a .where() on it, the original RxQuery-Object is not changed. Instead the where-function returns a new RxQuery-Object with the changed where-field. Keep this in mind if you create RxQuery's and change them afterwards.

    -

    Example:

    -
    const queryObject = myCollection.find().where('age').gt(18);
    -// Creates a new RxQuery object, does not modify previous one
    -queryObject.sort('name');
    -const results = await queryObject.exec();
    -console.dir(results); // result-documents are not sorted by name
    - 
    -const queryObjectSort = queryObject.sort('name');
    -const results = await queryObjectSort.exec();
    -console.dir(results); // result-documents are now sorted
    -

    isRxQuery

    -

    Returns true if the given object is an instance of RxQuery. Returns false if not.

    -
    const is = isRxQuery(myObj);
    -

    Design Decisions

    -

    Like most other noSQL-Databases, RxDB uses the mango-query-syntax similar to MongoDB and others.

    -
      -
    • We use the JSON based Mango Query Syntax because: -
        -
      • Mango Queries work better with TypeScript compared to SQL strings.
      • -
      • Mango Queries are composable and easy to transform by code without joining SQL strings.
      • -
      • Queries can be run very fast and efficient with only a minimal query planer to plan the best indexes and operations.
      • -
      • NoSQL queries can be optimized with the EventReduce algorithm to improve performance of observed and cached queries.
      • -
      -
    • -
    -

    FAQ

    -
    Can I specify which document fields are returned by an RxDB query?

    No, RxDB does not support partial document retrieval. Because RxDB is a client-side database with limited memory, it caches and de-duplicates entire documents across multiple queries. Even if you only need a few fields, most storages must still fetch the entire JSON data, so subselecting fields would not significantly improve performance. Therefore, RxDB always returns full documents. If you only need certain fields, you can filter them out in your application code or consider storing just the necessary data in a separate collection.

    -
    Why doesn't RxDB support aggregations on queries?

    RxDB runs entirely on the client side. Any "aggregation" or data processing you might do within RxDB would still happen in the same JavaScript environment as your application code. Therefore, there's no real performance advantage or difference between doing the aggregation in RxDB vs. doing it in your own code after fetching the data. As a result, RxDB doesn't provide built-in aggregation methods. Instead, just query the documents you need and perform any calculations directly in your app's code.

    -
    Why does RxDB not support cross-collection queries?

    RxDB is a client-side database and does not provide built-in cross-collection queries or transactions. Instead, you can execute multiple queries in your JavaScript code and combine their results as needed. Because everything runs in the same environment, this approach offers the same performance you would get if cross-collection queries were built in - without the added complexity.

    -
    Why Doesn't RxDB Support Case-Insensitive Search?

    RxDB relies on various storage engines as its backend, and these storage engines generally do not support case-insensitive search natively, like IndexedDB or FoundationDB. This limitation arises from the design of these engines, which prioritize efficiency and flexibility for specific types of queries rather than universal features like case-insensitivity. Although RxDB does not offer built-in support for case-insensitive search, there are two common workarounds:

      -
    • Store Data in a Meta-Field for Lowercase Search: To enable case-insensitive search, you can store an additional field in your documents where the relevant text data is preprocessed and saved in lowercase.
    • -
    const document = {
    -  name: 'John Doe',
    -  nameLowercase: 'john doe' // Meta-field
    -};
    -await myCollection.insert(document);
    - 
    -const query = myCollection.find({
    -  selector: {
    -    nameLowercase: { $eq: 'john doe' }
    -  }
    -});
      -
    • Use a Regex Query: Regular expressions can perform case-insensitive searches. For example:
    • -
    const query = myCollection.find({
    -  selector: {
    -    name: { $regex: '^john doe$', $options: 'i' } // Case-insensitive regex
    -  }
    -});

    However, this method has a significant downside: regex queries often cannot leverage indexes efficiently. As a result, they may be slower, especially for large datasets.

    - - \ No newline at end of file diff --git a/docs/rx-query.md b/docs/rx-query.md deleted file mode 100644 index c555d191767..00000000000 --- a/docs/rx-query.md +++ /dev/null @@ -1,472 +0,0 @@ -# RxQuery - -> Master RxQuery in RxDB - find, update, remove documents using Mango syntax, chained queries, real-time observations, indexing, and more. - -# RxQuery - -To find documents inside of an [RxCollection](./rx-collection.md), RxDB uses the RxQuery interface that handles all query operations: it serves as the main interface for fetching documents, relies on a MongoDB-like [Mango Query Syntax](https://github.com/cloudant/mango), and provides three types of queries: [find()](#find), [findOne()](#findone) and [count()](#count). By caching and de-duplicating results, RxQuery ensures efficient in-memory handling, and when queries are observed or re-run, the [EventReduce algorithm](https://github.com/pubkey/event-reduce) speeds up updates for a fast real-time experience and queries that run more than once. - -## find() -To create a basic `RxQuery`, call `.find()` on a collection and insert selectors. The result-set of normal queries is an array with documents. - -```js -// find all that are older then 18 -const query = myCollection - .find({ - selector: { - age: { - $gt: 18 - } - } - }); -``` - -## findOne() -A findOne-query has only a single `RxDocument` or `null` as result-set. - -```js -// find alice -const query = myCollection - .findOne({ - selector: { - name: 'alice' - } - }); -``` - -```js -// find the youngest one -const query = myCollection - .findOne({ - selector: {}, - sort: [ - {age: 'asc'} - ] - }); -``` - -```js -// find one document by the primary key -const query = myCollection.findOne('foobar'); -``` -## exec() -Returns a `Promise` that resolves with the result-set of the query. - -```js -const query = myCollection.find(); -const results = await query.exec(); -console.dir(results); // > [RxDocument,RxDocument,RxDocument..] -``` - -On `.findOne()` queries, you can call `.exec(true)` to ensure your document exists and to make TypeScript handling easier: - -```ts -// docOrUndefined can be the type RxDocument or null which then has to be handled to be typesafe. -const docOrUndefined = await myCollection.findOne().exec(); - -// with .exec(true), it will throw if the document cannot be found and always have the type RxDocument -const doc = await myCollection.findOne().exec(true); -``` - -## Observe $ -An `BehaviorSubject` [see](https://medium.com/@luukgruijs/understanding-rxjs-behaviorsubject-replaysubject-and-asyncsubject-8cc061f1cfc0) that always has the current result-set as value. -This is extremely helpful when used together with UIs that should always show the same state as what is written in the database. - -```js -const query = myCollection.find(); -const querySub = query.$.subscribe(results => { - console.log('got results: ' + results.length); -}); -// > 'got results: 5' // BehaviorSubjects emit on subscription - -await myCollection.insert({/* ... */}); // insert one -// > 'got results: 6' // $.subscribe() was called again with the new results - -// stop watching this query -querySub.unsubscribe() -``` - -## update() -Runs an [update](./rx-document.md#update) on every RxDocument of the query-result. - -```js - -// to use the update() method, you need to add the update plugin. -import { RxDBUpdatePlugin } from 'rxdb/plugins/update'; -addRxPlugin(RxDBUpdatePlugin); - -const query = myCollection.find({ - selector: { - age: { - $gt: 18 - } - } -}); -await query.update({ - $inc: { - age: 1 // increases age of every found document by 1 - } -}); -``` - -## patch() / incrementalPatch() - -Runs the [RxDocument.patch()](./rx-document.md#patch) function on every RxDocument of the query result. - -```js -const query = myCollection.find({ - selector: { - age: { - $gt: 18 - } - } -}); -await query.patch({ - age: 12 // set the age of every found to 12 -}); -``` - -## modify() / incrementalModify() - -Runs the [RxDocument.modify()](./rx-document.md#modify) function on every RxDocument of the query result. - -```js -const query = myCollection.find({ - selector: { - age: { - $gt: 18 - } - } -}); -await query.modify((docData) => { - docData.age = docData.age + 1; // increases age of every found document by 1 - return docData; -}); -``` - -## remove() / incrementalRemove() - -Deletes all found documents. Returns a promise which resolves to the deleted documents. - -```javascript -// All documents where the age is less than 18 -const query = myCollection.find({ - selector: { - age: { - $lt: 18 - } - } -}); -// Remove the documents from the collection -const removedDocs = await query.remove(); -``` - -## doesDocumentDataMatch() -Returns `true` if the given document data matches the query. - -```js -const documentData = { - id: 'foobar', - age: 19 -}; - -myCollection.find({ - selector: { - age: { - $gt: 18 - } - } -}).doesDocumentDataMatch(documentData); // > true - -myCollection.find({ - selector: { - age: { - $gt: 20 - } - } -}).doesDocumentDataMatch(documentData); // > false -``` - -## Query Builder Plugin - -To use chained query methods, you can also use the `query-builder` plugin. - -```ts -// add the query builder plugin -import { addRxPlugin } from 'rxdb'; -import { RxDBQueryBuilderPlugin } from 'rxdb/plugins/query-builder'; -addRxPlugin(RxDBQueryBuilderPlugin); - -// now you can use chained query methods - -const query = myCollection.find().where('age').gt(18); -const result = await query.exec(); -``` - -## Query Examples -Here some examples to fast learn how to write queries without reading the docs. -- [Pouch-find-docs](https://github.com/pouchdb/pouchdb/blob/master/packages/node_modules/pouchdb-find/README.md) - learn how to use mango-queries -- [mquery-docs](https://github.com/aheckmann/mquery/blob/master/README.md) - learn how to use chained-queries - -```js -// directly pass search-object -myCollection.find({ - selector: { - name: { $eq: 'foo' } - } -}) -.exec().then(documents => console.dir(documents)); - -/* - * find by using sql equivalent '%like%' syntax - * This example will fe: match 'foo' but also 'fifoo' or 'foofa' or 'fifoofa' - * Notice that in RxDB queries, a regex is represented as a $regex string with the $options parameter for flags. - * Using a RegExp instance is not allowed because they are not JSON.stringify()-able and also - * RegExp instances are mutable which could cause undefined behavior when the RegExp is mutated - * after the query was parsed. - */ -myCollection.find({ - selector: { - name: { $regex: '.*foo.*' } - } -}) -.exec().then(documents => console.dir(documents)); - -// find using a composite statement eg: $or -// This example checks where name is either foo or if name is not existent on the document -myCollection.find({ - selector: { $or: [ { name: { $eq: 'foo' } }, { name: { $exists: false } }] } -}) -.exec().then(documents => console.dir(documents)); - -// do a case insensitive search -// This example will match 'foo' or 'FOO' or 'FoO' etc... -myCollection.find({ - selector: { name: { $regex: '^foo$', $options: 'i' } } -}) -.exec().then(documents => console.dir(documents)); - -// chained queries -myCollection.find().where('name').eq('foo') -.exec().then(documents => console.dir(documents)); -``` - -:::note RxDB will always append the primary key to the sort parameters -For several performance optimizations, like the [EventReduce algorithm](https://github.com/pubkey/event-reduce), RxDB expects all queries to return a deterministic sort order that does not depend on the insert order of the documents. To ensure a deterministic ordering, RxDB will always append the primary key as last sort parameter to all queries and to all indexes. -This works in contrast to most other databases where a query without sorting would return the documents in the order in which they had been inserted to the database. -::: - -## Setting a specific index - -By default, the query will be sent to the RxStorage, where a query planner will determine which one of the available indexes must be used. -But the query planner cannot know everything and sometimes will not pick the most optimal index. -To improve query performance, you can specify which index must be used, when running the query. - -```ts -const query = myCollection - .findOne({ - selector: { - age: { - $gt: 18 - }, - gender: { - $eq: 'm' - } - }, - /** - * Because the developer knows that 50% of the documents are 'male', - * but only 20% are below age 18, - * it makes sense to enforce using the ['gender', 'age'] index to improve performance. - * This could not be known by the query planer which might have chosen ['age', 'gender'] instead. - */ - index: ['gender', 'age'] - }); -``` - -## Count - -When you only need the amount of documents that match a query, but you do not need the document data itself, you can use a count query for **better performance**. -The performance difference compared to a normal query differs depending on which [RxStorage](./rx-storage.md) implementation is used. - -```ts -const query = myCollection.count({ - selector: { - age: { - $gt: 18 - } - } - // 'limit' and 'skip' MUST NOT be set for count queries. -}); - -// get the count result once -const matchingAmount = await query.exec(); // > number - -// observe the result -query.$.subscribe(amount => { - console.log('Currently has ' + amount + ' documents'); -}); -``` - -:::note -Count queries have a better performance than normal queries because they do not have to fetch the full document data out of the storage. Therefore it is **not** possible to run a `count()` query with a selector that requires to fetch and compare the document data. So if your query selector **does not** fully match an index of the schema, it is not allowed to run it. These queries would have no performance benefit compared to normal queries but have the tradeoff of not using the fetched document data for caching. -::: - -```ts -/** - * The following will throw an error because - * the count operation cannot run on any specific index range - * because the $regex operator is used. - */ -const query = myCollection.count({ - selector: { - age: { - $regex: 'foobar' - } - } -}); - -/** - * The following will throw an error because - * the count operation cannot run on any specific index range - * because there is no ['age' ,'otherNumber'] index - * defined in the schema. - */ -const query = myCollection.count({ - selector: { - age: { - $gt: 20 - }, - otherNumber: { - $gt: 10 - } - } -}); -``` - -If you want to count these kinds of queries, you should do a normal query instead and use the length of the result set as counter. This has the same performance as running a non-fully-indexed count which has to fetch all document data from the database and run a query matcher. - -```ts -// get count manually once -const resultSet = await myCollection.find({ - selector: { - age: { - $regex: 'foobar' - } - } -}).exec(); -const count = resultSet.length; - -// observe count manually -const count$ = myCollection.find({ - selector: { - age: { - $regex: 'foobar' - } - } -}).$.pipe( - map(result => result.length) -); - -/** - * To allow non-fully-indexed count queries, - * you can also specify that by setting allowSlowCount=true - * when creating the database. - */ -const database = await createRxDatabase({ - name: 'mydatabase', - allowSlowCount: true, // set this to true [default=false] - /* ... */ -}); -``` - -### `allowSlowCount` -To allow non-fully-indexed count queries, you can also specify that by setting `allowSlowCount: true` when creating the database. -Doing this is mostly not wanted, because it would run the counting on the storage without having the document stored in the RxDB document cache. -This is only recommended if the RxStorage is running remotely like in a WebWorker and you not always want to send the document-data between the worker and the main thread. In this case you might only need the count-result instead to save performance. - -## RxQuery's are immutable -Because RxDB is a reactive database, we can do heavy performance-optimisation on query-results which change over time. To be able to do this, RxQuery's have to be immutable. -This means, when you have a `RxQuery` and run a `.where()` on it, the original RxQuery-Object is not changed. Instead the where-function returns a new `RxQuery`-Object with the changed where-field. Keep this in mind if you create RxQuery's and change them afterwards. - -Example: - -```javascript -const queryObject = myCollection.find().where('age').gt(18); -// Creates a new RxQuery object, does not modify previous one -queryObject.sort('name'); -const results = await queryObject.exec(); -console.dir(results); // result-documents are not sorted by name - -const queryObjectSort = queryObject.sort('name'); -const results = await queryObjectSort.exec(); -console.dir(results); // result-documents are now sorted -``` - -### isRxQuery -Returns true if the given object is an instance of RxQuery. Returns false if not. -```js -const is = isRxQuery(myObj); -``` - -## Design Decisions - -Like most other noSQL-Databases, RxDB uses the [mango-query-syntax](https://github.com/cloudant/mango) similar to MongoDB and others. - -- We use the JSON based Mango Query Syntax because: - - Mango Queries work better with TypeScript compared to SQL strings. - - Mango Queries are composable and easy to transform by code without joining SQL strings. - - Queries can be run very fast and efficient with only a minimal query planer to plan the best indexes and operations. - - NoSQL queries can be optimized with the [EventReduce](https://github.com/pubkey/event-reduce) algorithm to improve performance of observed and cached queries. - -## FAQ - -
    - Can I specify which document fields are returned by an RxDB query? - - No, RxDB does not support partial document retrieval. Because RxDB is a client-side database with limited memory, it caches and de-duplicates entire documents across multiple queries. Even if you only need a few fields, most storages must still fetch the entire JSON data, so subselecting fields would not significantly improve performance. Therefore, RxDB always returns full documents. If you only need certain fields, you can filter them out in your application code or consider storing just the necessary data in a separate collection. - -
    - -
    - Why doesn't RxDB support aggregations on queries? - - RxDB runs entirely on the client side. Any "aggregation" or data processing you might do within RxDB would still happen in the same JavaScript environment as your application code. Therefore, there's no real performance advantage or difference between doing the aggregation in RxDB vs. doing it in your own code after fetching the data. As a result, RxDB doesn't provide built-in aggregation methods. Instead, just query the documents you need and perform any calculations directly in your app's code. - -
    - -
    - Why does RxDB not support cross-collection queries? - - RxDB is a client-side database and does not provide built-in cross-collection queries or transactions. Instead, you can execute multiple queries in your JavaScript code and combine their results as needed. Because everything runs in the same environment, this approach offers the same performance you would get if cross-collection queries were built in - without the added complexity. - -
    - -
    - Why Doesn't RxDB Support Case-Insensitive Search? - - RxDB relies on various storage engines as its backend, and these storage engines generally do not support case-insensitive search natively, like [IndexedDB](./rx-storage-indexeddb.md) or [FoundationDB](./rx-storage-foundationdb.md). This limitation arises from the design of these engines, which prioritize efficiency and flexibility for specific types of queries rather than universal features like case-insensitivity. Although RxDB does not offer built-in support for case-insensitive search, there are two common workarounds: - - **Store Data in a Meta-Field for Lowercase Search**: To enable case-insensitive search, you can store an additional field in your documents where the relevant text data is preprocessed and saved in lowercase. -```ts -const document = { - name: 'John Doe', - nameLowercase: 'john doe' // Meta-field -}; -await myCollection.insert(document); - -const query = myCollection.find({ - selector: { - nameLowercase: { $eq: 'john doe' } - } -}); -``` - - **Use a Regex Query**: Regular expressions can perform case-insensitive searches. For example: -```ts -const query = myCollection.find({ - selector: { - name: { $regex: '^john doe$', $options: 'i' } // Case-insensitive regex - } -}); -``` -However, this method has a significant downside: regex queries often cannot leverage indexes efficiently. As a result, they may be slower, especially for large datasets. - -
    diff --git a/docs/rx-schema.html b/docs/rx-schema.html deleted file mode 100644 index 10a6454ebed..00000000000 --- a/docs/rx-schema.html +++ /dev/null @@ -1,384 +0,0 @@ - - - - - -Design Perfect Schemas in RxDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxSchema

    -

    Schemas define the structure of the documents of a collection. Which field should be used as primary, which fields should be used as indexes and what should be encrypted. Every collection has its own schema. With RxDB, schemas are defined with the jsonschema-standard which you might know from other projects.

    -

    Example

    -

    In this example-schema we define a hero-collection with the following settings:

    -
      -
    • the version-number of the schema is 0
    • -
    • the name-property is the primaryKey. This means its a unique, indexed, required string which can be used to definitely find a single document.
    • -
    • the color-field is required for every document
    • -
    • the healthpoints-field must be a number between 0 and 100
    • -
    • the secret-field stores an encrypted value
    • -
    • the birthyear-field is final which means it is required and cannot be changed
    • -
    • the skills-attribute must be an array with objects which contain the name and the damage-attribute. There is a maximum of 5 skills per hero.
    • -
    • Allows adding attachments and store them encrypted
    • -
    -
      {
    -    "title": "hero schema",
    -    "version": 0,
    -    "description": "describes a simple hero",
    -    "primaryKey": "name",
    -    "type": "object",
    -    "properties": {
    -        "name": {
    -            "type": "string",
    -            "maxLength": 100 // <- the primary key must have set maxLength
    -        },
    -        "color": {
    -            "type": "string"
    -        },
    -        "healthpoints": {
    -            "type": "number",
    -            "minimum": 0,
    -            "maximum": 100
    -        },
    -        "secret": {
    -            "type": "string"
    -        },
    -        "birthyear": {
    -            "type": "number",
    -            "final": true,
    -            "minimum": 1900,
    -            "maximum": 2050
    -        },
    -        "skills": {
    -            "type": "array",
    -            "maxItems": 5,
    -            "uniqueItems": true,
    -            "items": {
    -                "type": "object",
    -                "properties": {
    -                    "name": {
    -                        "type": "string"
    -                    },
    -                    "damage": {
    -                        "type": "number"
    -                    }
    -                }
    -            }
    -        }
    -    },
    -    "required": [
    -        "name",
    -        "color"
    -    ],
    -    "encrypted": ["secret"],
    -    "attachments": {
    -        "encrypted": true
    -    }
    -  }
    -

    Create a collection with the schema

    -
    await myDatabase.addCollections({
    -    heroes: {
    -        schema: myHeroSchema
    -    }
    -});
    -console.dir(myDatabase.heroes.name);
    -// heroes
    -

    version

    -

    The version field is a number, starting with 0. -When the version is greater than 0, you have to provide the migrationStrategies to create a collection with this schema.

    -

    primaryKey

    -

    The primaryKey field contains the fieldname of the property that will be used as primary key for the whole collection. -The value of the primary key of the document must be a string, unique, final and is required.

    -

    composite primary key

    -

    You can define a composite primary key which gets composed from multiple properties of the document data.

    -
    const mySchema = {
    -  keyCompression: true, // set this to true, to enable the keyCompression
    -  version: 0,
    -  title: 'human schema with composite primary',
    -  primaryKey: {
    -      // where should the composed string be stored
    -      key: 'id',
    -      // fields that will be used to create the composed key
    -      fields: [
    -          'firstName',
    -          'lastName'
    -      ],
    -      // separator which is used to concat the fields values.
    -      separator: '|'
    -  },
    -  type: 'object',
    -  properties: {
    -      id: {
    -          type: 'string',
    -          maxLength: 100 // <- the primary key must have set maxLength
    -      },
    -      firstName: {
    -          type: 'string'
    -      },
    -      lastName: {
    -          type: 'string'
    -      }
    -  },
    -  required: [
    -    'id', 
    -    'firstName',
    -    'lastName'
    -  ]
    -};
    -

    You can then find a document by using the relevant parts to create the composite primaryKey:

    -
     
    -// inserting with composite primary
    -await myRxCollection.insert({
    -    // id, <- do not set the id, it will be filled by RxDB
    -    firstName: 'foo',
    -    lastName: 'bar'
    -});
    - 
    -// find by composite primary
    -const id = myRxCollection.schema.getPrimaryOfDocumentData({
    -    firstName: 'foo',
    -    lastName: 'bar'
    -});
    -const myRxDocument = myRxCollection.findOne(id).exec();
    - 
    -

    Indexes

    -

    RxDB supports secondary indexes which are defined at the schema-level of the collection.

    -

    Index is only allowed on field types string, integer and number. Some RxStorages allow to use boolean fields as index.

    -

    Depending on the field type, you must have set some meta attributes like maxLength or minimum. This is required so that RxDB -is able to know the maximum string representation length of a field, which is needed to craft custom indexes on several RxStorage implementations.

    -
    note

    RxDB will always append the primaryKey to all indexes to ensure a deterministic sort order of query results. You do not have to add the primaryKey to any index.

    -

    Index-example

    -
    const schemaWithIndexes = {
    -  version: 0,
    -  title: 'human schema with indexes',
    -  keyCompression: true,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -      id: {
    -          type: 'string',
    -          maxLength: 100 // <- the primary key must have set maxLength
    -      },
    -      firstName: {
    -          type: 'string',
    -          maxLength: 100 // <- string-fields that are used as an index, must have set maxLength.
    -      },
    -      lastName: {
    -          type: 'string'
    -      },
    -      active: {
    -          type: 'boolean'
    -      },
    -      familyName: {
    -          type: 'string'
    -      },
    -      balance: {
    -          type: 'number',
    - 
    -          // number fields that are used in an index, must have set minimum, maximum and multipleOf
    -          minimum: 0,
    -          maximum: 100000,
    -          multipleOf: 0.01
    -      },
    -      creditCards: {
    -          type: 'array',
    -          items: {
    -              type: 'object',
    -              properties: {
    -                    cvc: {
    -                        type: 'number'
    -                    }
    -              }
    -          } 
    -      }
    -  },
    -  required: [
    -      'id',
    -      'active' // <- boolean fields that are used in an index, must be required. 
    -  ],
    -  indexes: [
    -    'firstName', // <- this will create a simple index for the `firstName` field
    -    ['active', 'firstName'], // <- this will create a compound-index for these two fields
    -    'active'
    -  ]
    -};
    -

    internalIndexes

    -

    When you use RxDB on the server-side, you might want to use internalIndexes to speed up internal queries. Read more

    -

    attachments

    -

    To use attachments in the collection, you have to add the attachments-attribute to the schema. See RxAttachment.

    -

    default

    -

    Default values can only be defined for first-level fields. -Whenever you insert a document unset fields will be filled with default-values.

    -
    const schemaWithDefaultAge = {
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -      id: {
    -          type: 'string',
    -          maxLength: 100 // <- the primary key must have set maxLength
    -      },
    -      firstName: {
    -          type: 'string'
    -      },
    -      lastName: {
    -          type: 'string'
    -      },
    -      age: {
    -          type: 'integer',
    -          default: 20       // <- default will be used
    -      }
    -  },
    -  required: ['id']
    -};
    -

    final

    -

    By setting a field to final, you make sure it cannot be modified later. Final fields are always required. -Final fields cannot be observed because they will not change.

    -

    Advantages:

    -
      -
    • With final fields you can ensure that no-one accidentally modifies the data.
    • -
    • When you enable the eventReduce algorithm, some performance-improvements are done.
    • -
    -
    const schemaWithFinalAge = {
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -      id: {
    -          type: 'string',
    -          maxLength: 100 // <- the primary key must have set maxLength
    -      },
    -      firstName: {
    -          type: 'string'
    -      },
    -      lastName: {
    -          type: 'string'
    -      },
    -      age: {
    -          type: 'integer',
    -          final: true
    -      }
    -  },
    -  required: ['id']
    -};
    -

    Non allowed properties

    -

    The schema is not only used to validate objects before they are written into the database, but also used to map getters to observe and populate single fieldnames, keycompression and other things. Therefore you can not use every schema which would be valid for the spec of json-schema.org. -For example, fieldnames must match the regex ^[a-zA-Z][[a-zA-Z0-9_]*]?[a-zA-Z0-9]$ and additionalProperties is always set to false. But don't worry, RxDB will instantly throw an error when you pass an invalid schema into it.

    -

    Also the following class properties of RxDocument cannot be used as top level fields because they would clash when the RxDocument property is accessed:

    -
    [
    -    "collection",
    -    "_data",
    -    "_propertyCache",
    -    "isInstanceOfRxDocument",
    -    "primaryPath",
    -    "primary",
    -    "revision",
    -    "deleted$",
    -    "deleted$$",
    -    "deleted",
    -    "getLatest",
    -    "$",
    -    "$$",
    -    "get$",
    -    "get$$",
    -    "populate",
    -    "get",
    -    "toJSON",
    -    "toMutableJSON",
    -    "update",
    -    "incrementalUpdate",
    -    "updateCRDT",
    -    "putAttachment",
    -    "putAttachmentBase64",
    -    "getAttachment",
    -    "allAttachments",
    -    "allAttachments$",
    -    "modify",
    -    "incrementalModify",
    -    "patch",
    -    "incrementalPatch",
    -    "_saveData",
    -    "remove",
    -    "incrementalRemove",
    -    "close",
    -    "deleted",
    -    "synced"
    -]
    -

    FAQ

    -
    How can I store a Date?

    With RxDB you can only store plain JSON data inside of a document. You cannot store a JavaScript new Date() instance directly. This is for performance reasons and because Date() is a mutable thing where changing it at any time might cause strange problem that are hard to debug.

    To store a date in RxDB, you have to define a string field with a format attribute:

    {
    -   "type": "string",
    -   "format": "date-time"
    -}

    When storing the data you have to first transform your Date object into a string Date.toISOString(). -Because the date-time is sortable, you can do whatever query operations on that field and even use it as an index.

    -
    How to store schemaless data?

    By design, RxDB requires that every collection has a schema. This means you cannot create a truly "schema-less" collection where top-level fields are unknown at schema creation time. RxDB must know about all fields of a document at the top level to perform validation, index creation, and other internal optimizations. -However, there is a way to store data of arbitrary structure at sub-fields. To do this, define a property with type: "object" in your schema. For example:

    {
    -    "version": 0,
    -    "primaryKey": "id",
    -    "type": "object",
    -    "properties": {
    -        "id": {
    -            "type": "string",
    -            "maxLength": 100
    -        },
    -        "myDynamicData": {
    -            "type": "object"
    -            // Here you can store any JSON data
    -            // because it's an open object.
    -        }
    -    },
    -    "required": ["id"]
    -}
    -
    Why does RxDB automatically set additionalProperties: false at the top level

    RxDB automatically sets additionalProperties: false at the top level of a schema to ensure that all top-level fields are known in advance. This design choice offers several benefits:

      -
    • -

      Prevents collisions with RxDocument class properties: -RxDB documents have built-in class methods (e.g., .toJSON, .save) at the top level. By forbidding unknown top-level properties, we avoid accidental naming collisions with these built-in methods.

      -
    • -
    • -

      Avoids conflicts with user-defined ORM functions: -Developers can add custom ORM methods to RxDocuments. If top-level properties were unbounded, a property name could accidentally conflict with a method name, leading to unexpected behavior.

      -
    • -
    • -

      Improves TypeScript typings: -If RxDB didn't know about all top-level fields, the document type would effectively become any. That means a simple typo like myDocument.toJOSN() would only be caught at runtime, not at build time. By disallowing unknown properties, TypeScript can provide strict typing and catch errors sooner.

      -
    • -
    -
    Can't change the schema of a collection

    When you make changes to the schema of a collection, you sometimes can get an error like -Error: addCollections(): another instance created this collection with a different schema.

    This means you have created a collection before and added document-data to it. -When you now just change the schema, it is likely that the new schema does not match the saved documents inside of the collection. -This would cause strange bugs and would be hard to debug, so RxDB check's if your schema has changed and throws an error.

    To change the schema in production-mode, do the following steps:

      -
    • Increase the version by 1
    • -
    • Add the appropriate migrationStrategies so the saved data will be modified to match the new schema
    • -

    In development-mode, the schema-change can be simplified by one of these strategies:

      -
    • Use the memory-storage so your db resets on restart and your schema is not saved permanently
    • -
    • Call removeRxDatabase('mydatabasename', RxStorage); before creating a new RxDatabase-instance
    • -
    • Add a timestamp as suffix to the database-name to create a new one each run like name: 'heroesDB' + new Date().getTime()
    • -
    - - \ No newline at end of file diff --git a/docs/rx-schema.md b/docs/rx-schema.md deleted file mode 100644 index 3902ee779f2..00000000000 --- a/docs/rx-schema.md +++ /dev/null @@ -1,434 +0,0 @@ -# Design Perfect Schemas in RxDB - -> Learn how to define, secure, and validate your data in RxDB. Master primary keys, indexes, encryption, and more with the RxSchema approach. - -# RxSchema - -Schemas define the structure of the documents of a collection. Which field should be used as primary, which fields should be used as indexes and what should be encrypted. Every collection has its own schema. With RxDB, schemas are defined with the [jsonschema](https://json-schema.org/blog/posts/rxdb-case-study)-standard which you might know from other projects. - -## Example - -In this example-schema we define a hero-collection with the following settings: - -- the version-number of the schema is 0 -- the name-property is the **primaryKey**. This means its a unique, indexed, required `string` which can be used to definitely find a single document. -- the color-field is required for every document -- the healthpoints-field must be a number between 0 and 100 -- the secret-field stores an encrypted value -- the birthyear-field is final which means it is required and cannot be changed -- the skills-attribute must be an array with objects which contain the name and the damage-attribute. There is a maximum of 5 skills per hero. -- Allows adding attachments and store them encrypted - -```json - { - "title": "hero schema", - "version": 0, - "description": "describes a simple hero", - "primaryKey": "name", - "type": "object", - "properties": { - "name": { - "type": "string", - "maxLength": 100 // <- the primary key must have set maxLength - }, - "color": { - "type": "string" - }, - "healthpoints": { - "type": "number", - "minimum": 0, - "maximum": 100 - }, - "secret": { - "type": "string" - }, - "birthyear": { - "type": "number", - "final": true, - "minimum": 1900, - "maximum": 2050 - }, - "skills": { - "type": "array", - "maxItems": 5, - "uniqueItems": true, - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "damage": { - "type": "number" - } - } - } - } - }, - "required": [ - "name", - "color" - ], - "encrypted": ["secret"], - "attachments": { - "encrypted": true - } - } -``` - -## Create a collection with the schema - -```javascript -await myDatabase.addCollections({ - heroes: { - schema: myHeroSchema - } -}); -console.dir(myDatabase.heroes.name); -// heroes -``` - -## version -The `version` field is a number, starting with `0`. -When the version is greater than 0, you have to provide the migrationStrategies to create a collection with this schema. - -## primaryKey - -The `primaryKey` field contains the fieldname of the property that will be used as primary key for the whole collection. -The value of the primary key of the document must be a `string`, unique, final and is required. - -### composite primary key - -You can define a composite primary key which gets composed from multiple properties of the document data. - -```javascript -const mySchema = { - keyCompression: true, // set this to true, to enable the keyCompression - version: 0, - title: 'human schema with composite primary', - primaryKey: { - // where should the composed string be stored - key: 'id', - // fields that will be used to create the composed key - fields: [ - 'firstName', - 'lastName' - ], - // separator which is used to concat the fields values. - separator: '|' - }, - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 // <- the primary key must have set maxLength - }, - firstName: { - type: 'string' - }, - lastName: { - type: 'string' - } - }, - required: [ - 'id', - 'firstName', - 'lastName' - ] -}; -``` - -You can then find a document by using the relevant parts to create the composite primaryKey: - -```ts - -// inserting with composite primary -await myRxCollection.insert({ - // id, <- do not set the id, it will be filled by RxDB - firstName: 'foo', - lastName: 'bar' -}); - -// find by composite primary -const id = myRxCollection.schema.getPrimaryOfDocumentData({ - firstName: 'foo', - lastName: 'bar' -}); -const myRxDocument = myRxCollection.findOne(id).exec(); - -``` - -## Indexes -RxDB supports secondary indexes which are defined at the schema-level of the collection. - -Index is only allowed on field types `string`, `integer` and `number`. Some RxStorages allow to use `boolean` fields as index. - -Depending on the field type, you must have set some meta attributes like `maxLength` or `minimum`. This is required so that RxDB -is able to know the maximum string representation length of a field, which is needed to craft custom indexes on several `RxStorage` implementations. - -:::note -RxDB will always append the `primaryKey` to all indexes to ensure a deterministic sort order of query results. You do not have to add the `primaryKey` to any index. -::: - -### Index-example - -```javascript -const schemaWithIndexes = { - version: 0, - title: 'human schema with indexes', - keyCompression: true, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 // <- the primary key must have set maxLength - }, - firstName: { - type: 'string', - maxLength: 100 // <- string-fields that are used as an index, must have set maxLength. - }, - lastName: { - type: 'string' - }, - active: { - type: 'boolean' - }, - familyName: { - type: 'string' - }, - balance: { - type: 'number', - - // number fields that are used in an index, must have set minimum, maximum and multipleOf - minimum: 0, - maximum: 100000, - multipleOf: 0.01 - }, - creditCards: { - type: 'array', - items: { - type: 'object', - properties: { - cvc: { - type: 'number' - } - } - } - } - }, - required: [ - 'id', - 'active' // <- boolean fields that are used in an index, must be required. - ], - indexes: [ - 'firstName', // <- this will create a simple index for the `firstName` field - ['active', 'firstName'], // <- this will create a compound-index for these two fields - 'active' - ] -}; -``` - -# internalIndexes - -When you use RxDB on the server-side, you might want to use internalIndexes to speed up internal queries. [Read more](./rx-server.md#server-only-indexes) - -## attachments -To use attachments in the collection, you have to add the `attachments`-attribute to the schema. [See RxAttachment](./rx-attachment.md). - -## default -Default values can only be defined for first-level fields. -Whenever you insert a document unset fields will be filled with default-values. - -```javascript -const schemaWithDefaultAge = { - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 // <- the primary key must have set maxLength - }, - firstName: { - type: 'string' - }, - lastName: { - type: 'string' - }, - age: { - type: 'integer', - default: 20 // <- default will be used - } - }, - required: ['id'] -}; -``` - -## final -By setting a field to `final`, you make sure it cannot be modified later. Final fields are always required. -Final fields cannot be observed because they will not change. - -Advantages: - -- With final fields you can ensure that no-one accidentally modifies the data. -- When you enable the `eventReduce` algorithm, some performance-improvements are done. - -```javascript -const schemaWithFinalAge = { - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { - type: 'string', - maxLength: 100 // <- the primary key must have set maxLength - }, - firstName: { - type: 'string' - }, - lastName: { - type: 'string' - }, - age: { - type: 'integer', - final: true - } - }, - required: ['id'] -}; -``` - -## Non allowed properties - -The schema is not only used to validate objects before they are written into the database, but also used to map getters to observe and populate single fieldnames, keycompression and other things. Therefore you can not use every schema which would be valid for the spec of [json-schema.org](http://json-schema.org/). -For example, fieldnames must match the regex `^[a-zA-Z][[a-zA-Z0-9_]*]?[a-zA-Z0-9]$` and `additionalProperties` is always set to `false`. But don't worry, RxDB will instantly throw an error when you pass an invalid schema into it. - -Also the following class properties of `RxDocument` cannot be used as top level fields because they would clash when the RxDocument property is accessed: -```json -[ - "collection", - "_data", - "_propertyCache", - "isInstanceOfRxDocument", - "primaryPath", - "primary", - "revision", - "deleted$", - "deleted$$", - "deleted", - "getLatest", - "$", - "$$", - "get$", - "get$$", - "populate", - "get", - "toJSON", - "toMutableJSON", - "update", - "incrementalUpdate", - "updateCRDT", - "putAttachment", - "putAttachmentBase64", - "getAttachment", - "allAttachments", - "allAttachments$", - "modify", - "incrementalModify", - "patch", - "incrementalPatch", - "_saveData", - "remove", - "incrementalRemove", - "close", - "deleted", - "synced" -] -``` - -## FAQ - -
    - How can I store a Date? - - With RxDB you can only store plain JSON data inside of a document. You cannot store a JavaScript `new Date()` instance directly. This is for performance reasons and because `Date()` is a mutable thing where changing it at any time might cause strange problem that are hard to debug. - - To store a date in RxDB, you have to define a string field with a `format` attribute: - ```json - { - "type": "string", - "format": "date-time" - } - ``` - - When storing the data you have to first transform your `Date` object into a string `Date.toISOString()`. - Because the `date-time` is sortable, you can do whatever query operations on that field and even use it as an index. - -
    - -
    - How to store schemaless data? - - By design, RxDB requires that every collection has a schema. This means you cannot create a truly "schema-less" collection where top-level fields are unknown at schema creation time. RxDB must know about all fields of a document at the top level to perform validation, index creation, and other internal optimizations. - However, there is a way to store data of arbitrary structure at sub-fields. To do this, define a property with `type: "object"` in your schema. For example: - ```ts - { - "version": 0, - "primaryKey": "id", - "type": "object", - "properties": { - "id": { - "type": "string", - "maxLength": 100 - }, - "myDynamicData": { - "type": "object" - // Here you can store any JSON data - // because it's an open object. - } - }, - "required": ["id"] - } - ``` - -
    - -
    - Why does RxDB automatically set `additionalProperties: false` at the top level - - RxDB automatically sets `additionalProperties: false` at the top level of a schema to ensure that all top-level fields are known in advance. This design choice offers several benefits: - -- Prevents collisions with RxDocument class properties: -RxDB documents have built-in class methods (e.g., .toJSON, .save) at the top level. By forbidding unknown top-level properties, we avoid accidental naming collisions with these built-in methods. - -- Avoids conflicts with user-defined ORM functions: -Developers can add custom [ORM methods](./orm.md) to RxDocuments. If top-level properties were unbounded, a property name could accidentally conflict with a method name, leading to unexpected behavior. - -- Improves TypeScript typings: -If RxDB didn't know about all top-level fields, the document type would effectively become `any`. That means a simple typo like `myDocument.toJOSN()` would only be caught at runtime, not at build time. By disallowing unknown properties, TypeScript can provide strict typing and catch errors sooner. - -
    - -
    - Can't change the schema of a collection - - When you make changes to the schema of a collection, you sometimes can get an error like -`Error: addCollections(): another instance created this collection with a different schema`. - -This means you have created a collection before and added document-data to it. -When you now just change the schema, it is likely that the new schema does not match the saved documents inside of the collection. -This would cause strange bugs and would be hard to debug, so RxDB check's if your schema has changed and throws an error. - -To change the schema in **production**-mode, do the following steps: - -- Increase the `version` by 1 -- Add the appropriate [migrationStrategies](https://pubkey.github.io/rxdb/migration-schema.html) so the saved data will be modified to match the new schema - -In **development**-mode, the schema-change can be simplified by **one of these** strategies: - -- Use the memory-storage so your db resets on restart and your schema is not saved permanently -- Call `removeRxDatabase('mydatabasename', RxStorage);` before creating a new RxDatabase-instance -- Add a timestamp as suffix to the database-name to create a new one each run like `name: 'heroesDB' + new Date().getTime()` - -
    diff --git a/docs/rx-server-scaling.html b/docs/rx-server-scaling.html deleted file mode 100644 index aaa8269ec4f..00000000000 --- a/docs/rx-server-scaling.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - -RxServer Scaling - Vertical or Horizontal | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Scaling the RxServer

    -

    The RxDB Server run in JavaScript and JavaScript runs on a single process on the operating system. This can make the CPU performance limit to be the main bottleneck when serving requests to your users. To mitigate that problem, there are a wide range of methods to scale up the server so that it can serve more requests at the same time faster.

    -

    Vertical Scaling

    -

    Vertical Scaling aka "scaling up" has the goal to get more power out of a single server by utilizing more of the servers compute. Vertical scaling should be the first step when you decide it is time to scale.

    -

    Run multiple JavaScript processes

    -

    To utilize more compute power of your server, the first step is to scale vertically by running the RxDB server on multiple processes in parallel. -RxDB itself is already build to support multiInstance-usage on the client, like when the user has opened multiple browser tabs at once. The same method works also on the server side in Node.js. You can spawn multiple JavaScript processes that use the same RxDatabase and the instances will automatically communicate with each other and distribute their data and events with the BroadcastChannel. -By default the multiInstance param is set to true when calling createRxDatabase(), so you do not have to change anything. To make all processes accessible through the same endpoint, you can put a load-balancer like nginx in front of them.

    -

    Using workers to split up the load

    -

    Another way to increases the server capacity is to put the storage into a Worker thread so that the "main" thread with the webserver can handle more requests. This might be easier to set up compared to using multiple JavaScript processes and a load balancer.

    -

    Use an in-memory storage at the user facing level

    -

    Another way to serve more requests to your end users, is to use an in-memory storage that has the best read- and write performance. It outperforms persistent storages by a factor of 10x. -So instead of directly serving requests from the persistence layer, you add an in-memory layer on top of that. You could either do a replication from your memory database to the persistent one, or you use the memory mapped storage which has this build in.

    -
    import { getRxStorageMemory } from 'rxdb/plugins/storage-memory';
    -import { replicateRxCollection } from 'rxdb/plugins/replication';
    -import { getRxStorageFilesystemNode } from 'rxdb-premium/plugins/storage-filesystem-node';
    -import { getMemoryMappedRxStorage } from 'rxdb-premium/plugins/storage-memory-mapped';
    -const myRxDatabase = await createRxDatabase({
    -    name: 'mydb',
    -    storage: getMemoryMappedRxStorage({
    -        storage: getRxStorageFilesystemNode({
    -            basePath: path.join(__dirname, 'my-database-folder')
    -        })
    -    })
    -});
    -await myDatabase.addCollections({/* ... */});
    - 
    -const myServer = await startRxServer({
    -    database: myRxDatabase,
    -    port: 443
    -});
    -

    But notice that you have to check your persistence requirements. When a write happens to the memory layer and the server crashes while it has not persisted, in rare cases the write operation might get lost. You can remove that risk by setting awaitWritePersistence: true on the memory mapped storage settings.

    -

    Horizontal Scaling

    -

    To scale the RxDB Server above a single physical hardware unit, there are different solutions where the decision depends on the exact use case.

    -

    Single Datastore with multiple branches

    -

    The most common way to use multiple servers with RxDB is to split up the server into a tree with a root "datastore" and multiple "branches". The datastore contains the persisted data and only servers as a replication endpoint for the branches. The branches themself will replicate data to and from the datastore and server requests to the end users. -This is mostly useful on read-heavy applications because reads will directly run on the branches without ever reaching the main datastore and you can always add more branches to scale up. Even adding additional layers of "datastores" is possible so the tree can grow (or shrink) with the demand.

    -

    Server Scaling Tree

    -

    Moving the branches to "the edge"

    -

    Instead of running the "branches" of the tree on the same physical location as the datastore, it often makes sense to move the branches into a datacenter near the end users. Because the RxDB replication algorithm is made to work with slow and even partially offline users, using it for physically separated servers will work the same way. Latency is not that important because writes and reads will not decrease performance by blocking each other and the replication can run in the background without blocking other servers during transaction.

    -

    Replicate Databases for Microservices

    -

    If your application is build with a microservice architecture and your microservices are also build in Node.js, you can scale the database horizontally by moving the database into the microservices and use the RxDB replication to do a realtime sync between the microservices and a main "datastore" server. The "datastore" server would then only handle the replication requests or do some additional things like logging or backups. The compute for reads and writes will then mainly be done on the microservices themself. This simplifies setting up more and more microservices without decreasing the performance of the whole system.

    -

    Use a self-scaling RxStorage

    -

    An alternative to scaling up the RxDB servers themself, you can also switch to a RxStorage which scales up internally. For example the FoundationDB storage or MongoDB can work on top of a cluster that can increase load by adding more servers to itself. With that you can always add more Node.js RxDB processes that connect to the same cluster and server requests from it.

    - - \ No newline at end of file diff --git a/docs/rx-server-scaling.md b/docs/rx-server-scaling.md deleted file mode 100644 index a8a5bfd15b6..00000000000 --- a/docs/rx-server-scaling.md +++ /dev/null @@ -1,70 +0,0 @@ -# RxServer Scaling - Vertical or Horizontal - -> Discover vertical and horizontal techniques to boost RxServer. Learn multiple processes, worker threads, and replication for limitless performance. - -# Scaling the RxServer - -The [RxDB Server](./rx-server.md) run in JavaScript and JavaScript runs on a single process on the operating system. This can make the CPU performance limit to be the main bottleneck when serving requests to your users. To mitigate that problem, there are a wide range of methods to scale up the server so that it can serve more requests at the same time faster. - -## Vertical Scaling - -Vertical Scaling aka "scaling up" has the goal to get more power out of a single server by utilizing more of the servers compute. Vertical scaling should be the first step when you decide it is time to scale. - -### Run multiple JavaScript processes -To utilize more compute power of your server, the first step is to scale vertically by running the RxDB server on **multiple processes** in parallel. -RxDB itself is already build to support multiInstance-usage on the client, like when the user has opened multiple browser tabs at once. The same method works also on the server side in Node.js. You can spawn multiple JavaScript processes that use the same [RxDatabase](./rx-database.md) and the instances will automatically communicate with each other and distribute their data and events with the [BroadcastChannel](https://github.com/pubkey/broadcast-channel). -By default the [multiInstance param](./rx-database.md#multiinstance) is set to `true` when calling `createRxDatabase()`, so you do not have to change anything. To make all processes accessible through the same endpoint, you can put a load-balancer like [nginx](https://nginx.org/en/docs/http/load_balancing.html) in front of them. - -### Using workers to split up the load - -Another way to increases the server capacity is to put the storage into a [Worker thread](./rx-storage-worker.md) so that the "main" thread with the webserver can handle more requests. This might be easier to set up compared to using multiple JavaScript processes and a load balancer. - -### Use an in-memory storage at the user facing level - -Another way to serve more requests to your end users, is to use an [in-memory](./rx-storage-memory.md) storage that has the [best](./rx-storage-performance.md) read- and write performance. It outperforms persistent storages by a factor of 10x. -So instead of directly serving requests from the persistence layer, you add an in-memory layer on top of that. You could either do a [replication](./replication.md) from your memory database to the persistent one, or you use the [memory mapped](./rx-storage-memory-mapped.md) storage which has this build in. - -```ts -import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; -import { replicateRxCollection } from 'rxdb/plugins/replication'; -import { getRxStorageFilesystemNode } from 'rxdb-premium/plugins/storage-filesystem-node'; -import { getMemoryMappedRxStorage } from 'rxdb-premium/plugins/storage-memory-mapped'; -const myRxDatabase = await createRxDatabase({ - name: 'mydb', - storage: getMemoryMappedRxStorage({ - storage: getRxStorageFilesystemNode({ - basePath: path.join(__dirname, 'my-database-folder') - }) - }) -}); -await myDatabase.addCollections({/* ... */}); - -const myServer = await startRxServer({ - database: myRxDatabase, - port: 443 -}); -``` - -But notice that you have to check your persistence requirements. When a write happens to the memory layer and the server crashes while it has not persisted, in rare cases the write operation might get lost. You can remove that risk by setting `awaitWritePersistence: true` on the [memory mapped storage](./rx-storage-memory-mapped.md) settings. - -## Horizontal Scaling - -To scale the RxDB Server above a single physical hardware unit, there are different solutions where the decision depends on the exact use case. - -### Single Datastore with multiple branches -The most common way to use multiple servers with RxDB is to split up the server into a tree with a root "datastore" and multiple "branches". The datastore contains the persisted data and only servers as a replication endpoint for the branches. The branches themself will replicate data to and from the datastore and server requests to the end users. -This is mostly useful on read-heavy applications because reads will directly run on the branches without ever reaching the main datastore and you can always add more branches to **scale up**. Even adding additional layers of "datastores" is possible so the tree can grow (or shrink) with the demand. - - - -### Moving the branches to "the edge" - -Instead of running the "branches" of the tree on the same physical location as the datastore, it often makes sense to move the branches into a datacenter near the end users. Because the RxDB [replication algorithm](./replication.md) is made to work with slow and even partially offline users, using it for physically separated servers will work the same way. Latency is not that important because writes and reads will not decrease performance by blocking each other and the replication can run in the background without blocking other servers during transaction. - -### Replicate Databases for Microservices - -If your application is build with a [microservice architecture](https://en.wikipedia.org/wiki/Microservices) and your microservices are also build in Node.js, you can scale the database horizontally by moving the database into the microservices and use the [RxDB replication](./replication.md) to do a realtime sync between the microservices and a main "datastore" server. The "datastore" server would then only handle the replication requests or do some additional things like logging or [backups](./backup.md). The compute for reads and writes will then mainly be done on the microservices themself. This simplifies setting up more and more microservices without decreasing the performance of the whole system. - -### Use a self-scaling RxStorage - -An alternative to scaling up the RxDB servers themself, you can also switch to a [RxStorage](./rx-storage.md) which scales up internally. For example the [FoundationDB storage](./rx-storage-foundationdb.md) or [MongoDB](./rx-storage-mongodb.md) can work on top of a cluster that can increase load by adding more servers to itself. With that you can always add more Node.js RxDB processes that connect to the same cluster and server requests from it. diff --git a/docs/rx-server.html b/docs/rx-server.html deleted file mode 100644 index 1a50cddf4d2..00000000000 --- a/docs/rx-server.html +++ /dev/null @@ -1,247 +0,0 @@ - - - - - -RxDB Server - Deploy Your Data | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxDB Server

    -

    The RxDB Server Plugin makes it possible to spawn a server on top of a RxDB database that offers multiple types of endpoints for various usages. It can spawn basic CRUD REST endpoints or even realtime replication endpoints that can be used by the client devices to replicate data. The RxServer plugin is designed to be used in Node.js but you can also use it in Deno, Bun or the Electron "main" process. You can use it either as a standalone server or add it on top of an existing http server (like express) in nodejs.

    -

    Starting a RxServer

    -

    To create an RxServer, you have to install the rxdb-server package with npm install rxdb-server --save and then you can import the createRxServer() function and create a server on a given RxDatabase and adapter.

    -

    After adding the endpoints to the server, do not forget to call myServer.start() to start the actually http-server.

    -
    import { createRxServer } from 'rxdb-server/plugins/server';
    - 
    -/**
    - * We use the express adapter which is the one that comes with RxDB core
    - * Make sure you have express installed in the correct version!
    - * @see https://github.com/pubkey/rxdb-server/blob/master/package.json
    - */
    -import { RxServerAdapterExpress } from 'rxdb-server/plugins/adapter-express';
    - 
    -const myServer = await createRxServer({
    -    database: myRxDatabase,
    -    adapter: RxServerAdapterExpress,
    -    port: 443
    -});
    - 
    -// add endpoints here (see below)
    - 
    -// after adding the endpoints, start the server
    -await myServer.start();
    -

    Using RxServer with Fastify

    -

    There is also a RxDB Premium 👑 adapter to use the RxServer with Fastify instead of express. Fastify has shown to have better performance and in general is more modern.

    -
    import { createRxServer } from 'rxdb-server/plugins/server';
    -import { RxServerAdapterFastify } from 'rxdb-premium/plugins/server-adapter-fastify';
    - 
    -const myServer = await createRxServer({
    -    database: myRxDatabase,
    -    adapter: RxServerAdapterFastify,
    -    port: 443
    -});
    -await myServer.start();
    -

    Using RxServer with Koa

    -

    There is also a RxDB Premium 👑 adapter to use the RxServer with Koa instead of express. Koa has shown to have better performance compared to express.

    -
    import { createRxServer } from 'rxdb-server/plugins/server';
    -import { RxServerAdapterKoa } from 'rxdb-premium/plugins/server-adapter-koa';
    - 
    -const myServer = await createRxServer({
    -    database: myRxDatabase,
    -    adapter: RxServerAdapterKoa,
    -    port: 443
    -});
    -await myServer.start();
    -

    RxServer Endpoints

    -

    On top of the RxServer you can add different types of endpoints. An endpoint is always connected to exactly one RxCollection and it only serves data from that single collection.

    -

    For now there are only two endpoints implemented, the replication endpoint and the REST endpoint. Others will be added in the future.

    -

    An endpoint is added to the server by calling the add endpoint method like myRxServer.addReplicationEndpoint(). Each needs a different name string as input which will define the resulting endpoint url.

    -

    The endpoint urls is a combination of the given name and schema version of the collection, like /my-endpoint/0.

    -
    const myEndpoint = server.addReplicationEndpoint({
    -    name: 'my-endpoint',
    -    collection: myServerCollection
    -});
    - 
    -console.log(myEndpoint.urlPath) // > 'my-endpoint/0'
    -

    Notice that it is not required that the server side schema version is equal to the client side schema version. You might want to change server schemas more often and then only do a migration on the server, not on the clients.

    -

    Replication Endpoint

    -

    The replication endpoint allows clients that connect to it to replicate data with the server via the RxDB Sync Engine. There is also the Replication Server plugin that is used on the client side to connect to the endpoint.

    -

    The endpoint is added to the server with the addReplicationEndpoint() method. It requires a specific collection and the endpoint will only provided replication for documents inside of that collection.

    -
    // > server.ts
    -const endpoint = server.addReplicationEndpoint({
    -    name: 'my-endpoint',
    -    collection: myServerCollection
    -});
    -

    Then you can start the Server Replication on the client:

    -
    // > client.ts
    -const replicationState = await replicateServer({
    -    collection: usersCollection,
    -    replicationIdentifier: 'my-server-replication',
    -    url: 'http://localhost:80/my-endpoint/0',
    -    push: {},
    -    pull: {}
    -});
    -

    REST endpoint

    -

    The REST endpoint exposes various methods to access the data from the RxServer with non-RxDB tools via plain HTTP operations. You can use it to connect apps that are programmed in different programming languages than JavaScript or to access data from other third party tools.

    -

    Creating a REST endpoint on a RxServer:

    -
    const endpoint = await server.addRestEndpoint({
    -    name: 'my-endpoint',
    -    collection: myServerCollection
    -});
    -
    // plain http request with fetch
    -const request = await fetch('http://localhost:80/' + endpoint.urlPath + '/query', {
    -    method: 'POST',
    -    headers: {
    -        'Accept': 'application/json',
    -        'Content-Type': 'application/json'
    -    },
    -    body: JSON.stringify({ selector: {} })
    -});
    -const response = await request.json();
    -

    There is also the client-rest plugin that provides type-save interactions with the REST endpoint:

    -
    // using the client (optional)
    -import { createRestClient } from 'rxdb-server/plugins/client-rest';
    -const client = createRestClient('http://localhost:80/' + endpoint.urlPath, {/* headers */});
    -const response = await client.query({ selector: {} });
    -

    The REST endpoint exposes the following paths:

    -
      -
    • query [POST]: Fetch the results of a NoSQL query.
    • -
    • query/observe [GET]: Observe a query's results via Server Send Events.
    • -
    • get [POST]: Fetch multiple documents by their primary key.
    • -
    • set [POST]: Write multiple documents at once.
    • -
    • delete [POST]: Delete multiple documents by their primary key.
    • -
    -

    CORS

    -

    When creating a server or adding endpoints, you can specify a CORS string. -Endpoint cors always overwrite server cors. The default is the wildcard * which allows all requests.

    -
    const myServer = await startRxServer({
    -    database: myRxDatabase,
    -    cors: 'http://example.com'
    -    port: 443
    -});
    -const endpoint = await server.addReplicationEndpoint({
    -    name: 'my-endpoint',
    -    collection: myServerCollection,
    -    cors: 'http://example.com'
    -});
    -

    Auth handler

    -

    To authenticate users and to make user-specific data available on server requests, an authHandler must be provided that parses the headers and returns the actual auth data that is used to authenticate the client and in the queryModifier and changeValidator.

    -

    An auth handler gets the given headers object as input and returns the auth data in the format { data: {}, validUntil: 1706579817126}. -The data field can contain any data that can be used afterwards in the queryModifier and changeValidator. -The validUntil field contains the unix timestamp in milliseconds at which the authentication is no longer valid and the client will get disconnected.

    -

    For example your authHandler could get the Authorization header and parse the JSON web token to identify the user and store the user id in the data field for later use.

    -

    Query modifier

    -

    The query modifier is a JavaScript function that is used to restrict which documents a client can fetch or replicate from the server. -It gets the auth data and the actual NoSQL query as input parameter and returns a modified NoSQL query that is then used internally by the server. -You can pass a different query modifier to each endpoint so that you can have different endpoints for different use cases on the same server.

    -

    For example you could use a query modifier that get the userId from the auth data and then restricts the query to only return documents that have the same userId set.

    -
    function myQueryModifier(authData, query) {
    -    query.selector.userId = { $eq: authData.data.userid };
    -    return query;
    -}
    - 
    -const endpoint = await server.addReplicationEndpoint({
    -    name: 'my-endpoint',
    -    collection: myServerCollection,
    -    queryModifier: myQueryModifier
    -});
    -

    The RxServer will use the queryModifier at many places internally to determine which queries to run or if a document is allowed to be seen/edited by a client.

    -
    note

    For performance reasons the queryModifier and changeValidator MUST NOT be async and return a promise. If you need async data to run them, you should gather that data in the RxServerAuthHandler and store it in the auth data to access it later.

    -

    Change validator

    -

    The change validator is a JavaScript function that is used to restrict which document writes are allowed to be done by a client. -For example you could restrict clients to only change specific document fields or to not do any document writes at all. -It can also be used to validate change document data before storing it at the server.

    -

    In this example we restrict clients from doing inserts and only allow updates. For that we check if the change contains an assumedMasterState property and return false to block the write.

    -
     
    -function myChangeValidator(authData, change) {
    -    if(change.assumedMasterState) {
    -        return false;
    -    } else {
    -        return true;
    -    }
    -}
    - 
    -const endpoint = await server.addReplicationEndpoint({
    -    name: 'my-endpoint',
    -    collection: myServerCollection,
    -    changeValidator: myChangeValidator
    -});
    -

    Server-only indexes

    -

    Normal RxDB schema indexes get the _deleted field prepended because all RxQueries automatically only search for documents with _deleted=false. -When you use RxDB on a server, this might not be optimal because there can be the need to query for documents where the value of _deleted does not matter. Mostly this is required in the pull.stream$ of a replication when a queryModifier is used to add an additional field to the query.

    -

    To set indexes without _deleted, you can use the internalIndexes field of the schema like the following:

    -
      {
    -    "version": 0,
    -    "primaryKey": "id",
    -    "type": "object",
    -    "properties": {
    -        "id": {
    -            "type": "string",
    -            "maxLength": 100
    -        },
    -        "name": {
    -            "type": "string",
    -            "maxLength": 100
    -        }
    -    },
    -    "internalIndexes": [
    -        ["name", "id"]
    -    ]
    -}
    -
    note

    Indexes come with a performance burden. You should only use the indexes you need and make sure you do not accidentally set the internalIndexes in your client side RxCollections.

    -

    Server-only fields

    -

    All endpoints can be created with the serverOnlyFields set which defines some fields to only exist on the server, not on the clients. Clients will not see that fields and cannot do writes where one of the serverOnlyFields is set. -Notice that when you use serverOnlyFields you likely need to have a different schema on the server than the schema that is used on the clients.

    -
    const endpoint = await server.addReplicationEndpoint({
    -    name: 'my-endpoint',
    -    collection: col,
    -    // here the field 'my-secretss' is defined to be server-only
    -    serverOnlyFields: ['my-secrets']
    -});
    -
    note

    For performance reasons, only top-level fields can be used as serverOnlyFields. Otherwise the server would have to deep-clone all document data which is too expensive.

    -

    Readonly fields

    -

    When you have fields that should only be modified by the server, but not by the client, you can ensure that by comparing the fields value in the changeValidator.

    -
     
    -const myChangeValidator = function(authData, change){
    -    if(change.newDocumentState.myReadonlyField !== change.assumedMasterState.myReadonlyField){
    -        throw new Error('myReadonlyField is readonly');
    -    }
    -}
    -

    $regex queries not allowed

    -

    $regex queries are not allowed to run at the server to prevent ReDos Attacks.

    -

    Conflict handling

    -

    To detect and handle conflicts, the conflict handler from the endpoints RxCollection is used.

    -

    FAQ

    -
    Why are the server plugins in a different github repo and npm package?

    The RxServer and its other plugins are in a different github repository because:

    • It has too many dependencies that you do not want to install if you only use RxDB at the client side

    • It has a different license (SSPL) to prevent large cloud vendors from "stealing" the revenue, similar to MongoDB's license.

    -
    Why can't endpoints be added dynamically?

    After RxServer.start() is called, you can no longer add endpoints. This is because many of the supported -server libraries do not allow dynamic routing for performance and security reasons.

    - - \ No newline at end of file diff --git a/docs/rx-server.md b/docs/rx-server.md deleted file mode 100644 index 2047f6c4a38..00000000000 --- a/docs/rx-server.md +++ /dev/null @@ -1,332 +0,0 @@ -# RxDB Server - Deploy Your Data - -> Launch a secure, high-performance server on top of your RxDB database. Enable REST, replication endpoints, and seamless data syncing with RxServer. - -# RxDB Server - -The RxDB Server Plugin makes it possible to spawn a server on top of a RxDB database that offers multiple types of endpoints for various usages. It can spawn basic CRUD REST endpoints or even realtime replication endpoints that can be used by the client devices to replicate data. The RxServer plugin is designed to be used in Node.js but you can also use it in Deno, Bun or the [Electron](./electron-database.md) "main" process. You can use it either as a **standalone server** or add it on top of an **existing http server** (like express) in nodejs. - -## Starting a RxServer - -To create an `RxServer`, you have to install the `rxdb-server` package with `npm install rxdb-server --save` and then you can import the `createRxServer()` function and create a server on a given [RxDatabase](./rx-database.md) and adapter. - -After adding the endpoints to the server, do not forget to call `myServer.start()` to start the actually http-server. - -```ts -import { createRxServer } from 'rxdb-server/plugins/server'; - -/** - * We use the express adapter which is the one that comes with RxDB core - * Make sure you have express installed in the correct version! - * @see https://github.com/pubkey/rxdb-server/blob/master/package.json - */ -import { RxServerAdapterExpress } from 'rxdb-server/plugins/adapter-express'; - -const myServer = await createRxServer({ - database: myRxDatabase, - adapter: RxServerAdapterExpress, - port: 443 -}); - -// add endpoints here (see below) - -// after adding the endpoints, start the server -await myServer.start(); -``` - -### Using RxServer with Fastify - -There is also a [RxDB Premium 👑](/premium/) adapter to use the RxServer with [Fastify](https://fastify.dev/) instead of express. Fastify has shown to have better performance and in general is more modern. - -```ts -import { createRxServer } from 'rxdb-server/plugins/server'; -import { RxServerAdapterFastify } from 'rxdb-premium/plugins/server-adapter-fastify'; - -const myServer = await createRxServer({ - database: myRxDatabase, - adapter: RxServerAdapterFastify, - port: 443 -}); -await myServer.start(); -``` - -### Using RxServer with Koa - -There is also a [RxDB Premium 👑](/premium/) adapter to use the RxServer with [Koa](https://koajs.com/) instead of express. Koa has shown to have better performance compared to express. - -```ts -import { createRxServer } from 'rxdb-server/plugins/server'; -import { RxServerAdapterKoa } from 'rxdb-premium/plugins/server-adapter-koa'; - -const myServer = await createRxServer({ - database: myRxDatabase, - adapter: RxServerAdapterKoa, - port: 443 -}); -await myServer.start(); -``` - -## RxServer Endpoints - -On top of the RxServer you can add different types of **endpoints**. An endpoint is always connected to exactly one [RxCollection](./rx-collection.md) and it only serves data from that single collection. - -For now there are only two endpoints implemented, the [replication endpoint](#replication-endpoint) and the [REST endpoint](#rest-endpoint). Others will be added in the future. - -An endpoint is added to the server by calling the add endpoint method like `myRxServer.addReplicationEndpoint()`. Each needs a different `name` string as input which will define the resulting endpoint url. - -The endpoint urls is a combination of the given `name` and schema `version` of the collection, like `/my-endpoint/0`. - -```ts -const myEndpoint = server.addReplicationEndpoint({ - name: 'my-endpoint', - collection: myServerCollection -}); - -console.log(myEndpoint.urlPath) // > 'my-endpoint/0' -``` - -Notice that it is **not required** that the server side schema version is equal to the client side schema version. You might want to change server schemas more often and then only do a [migration](./migration-schema.md) on the server, not on the clients. - -## Replication Endpoint - -The replication endpoint allows clients that connect to it to replicate data with the server via the [RxDB Sync Engine](./replication.md). There is also the [Replication Server](./replication-server.md) plugin that is used on the client side to connect to the endpoint. - -The endpoint is added to the server with the `addReplicationEndpoint()` method. It requires a specific collection and the endpoint will only provided replication for documents inside of that collection. - -```ts -// > server.ts -const endpoint = server.addReplicationEndpoint({ - name: 'my-endpoint', - collection: myServerCollection -}); -``` - -Then you can start the [Server Replication](./replication-server.md) on the client: -```ts -// > client.ts -const replicationState = await replicateServer({ - collection: usersCollection, - replicationIdentifier: 'my-server-replication', - url: 'http://localhost:80/my-endpoint/0', - push: {}, - pull: {} -}); -``` - -## REST endpoint - -The REST endpoint exposes various methods to access the data from the RxServer with non-RxDB tools via plain HTTP operations. You can use it to connect apps that are programmed in different programming languages than JavaScript or to access data from other third party tools. - -Creating a REST endpoint on a RxServer: -```ts -const endpoint = await server.addRestEndpoint({ - name: 'my-endpoint', - collection: myServerCollection -}); -``` - -```ts -// plain http request with fetch -const request = await fetch('http://localhost:80/' + endpoint.urlPath + '/query', { - method: 'POST', - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ selector: {} }) -}); -const response = await request.json(); -``` - -There is also the `client-rest` plugin that provides type-save interactions with the REST endpoint: - -```ts -// using the client (optional) -import { createRestClient } from 'rxdb-server/plugins/client-rest'; -const client = createRestClient('http://localhost:80/' + endpoint.urlPath, {/* headers */}); -const response = await client.query({ selector: {} }); -``` - -The REST endpoint exposes the following paths: - -- **query [POST]**: Fetch the results of a NoSQL query. -- **query/observe [GET]**: Observe a query's results via [Server Send Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events). -- **get [POST]**: Fetch multiple documents by their primary key. -- **set [POST]**: Write multiple documents at once. -- **delete [POST]**: Delete multiple documents by their primary key. - -## CORS - -When creating a server or adding endpoints, you can specify a [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) string. -Endpoint cors always overwrite server cors. The default is the wildcard `*` which allows all requests. - -```ts -const myServer = await startRxServer({ - database: myRxDatabase, - cors: 'http://example.com' - port: 443 -}); -const endpoint = await server.addReplicationEndpoint({ - name: 'my-endpoint', - collection: myServerCollection, - cors: 'http://example.com' -}); -``` - -## Auth handler - -To authenticate users and to make user-specific data available on server requests, an `authHandler` must be provided that parses the headers and returns the actual auth data that is used to authenticate the client and in the [queryModifier](#query-modifier) and [changeValidator](#change-validator). - -An auth handler gets the given headers object as input and returns the auth data in the format `{ data: {}, validUntil: 1706579817126}`. -The `data` field can contain any data that can be used afterwards in the queryModifier and changeValidator. -The `validUntil` field contains the unix timestamp in milliseconds at which the authentication is no longer valid and the client will get disconnected. - -For example your authHandler could get the `Authorization` header and parse the [JSON web token](https://jwt.io/) to identify the user and store the user id in the `data` field for later use. - -## Query modifier - -The query modifier is a JavaScript function that is used to restrict which documents a client can fetch or replicate from the server. -It gets the auth data and the actual NoSQL query as input parameter and returns a modified NoSQL query that is then used internally by the server. -You can pass a different query modifier to each endpoint so that you can have different endpoints for different use cases on the same server. - -For example you could use a query modifier that get the `userId` from the auth data and then restricts the query to only return documents that have the same `userId` set. - -```ts -function myQueryModifier(authData, query) { - query.selector.userId = { $eq: authData.data.userid }; - return query; -} - -const endpoint = await server.addReplicationEndpoint({ - name: 'my-endpoint', - collection: myServerCollection, - queryModifier: myQueryModifier -}); -``` - -The RxServer will use the queryModifier at many places internally to determine which queries to run or if a document is allowed to be seen/edited by a client. - -:::note -For performance reasons the `queryModifier` and `changeValidator` **MUST NOT** be `async` and return a promise. If you need async data to run them, you should gather that data in the `RxServerAuthHandler` and store it in the auth data to access it later. -::: - -## Change validator - -The change validator is a JavaScript function that is used to restrict which document writes are allowed to be done by a client. -For example you could restrict clients to only change specific document fields or to not do any document writes at all. -It can also be used to validate change document data before storing it at the server. - -In this example we restrict clients from doing inserts and only allow updates. For that we check if the change contains an `assumedMasterState` property and return false to block the write. - -```ts - -function myChangeValidator(authData, change) { - if(change.assumedMasterState) { - return false; - } else { - return true; - } -} - -const endpoint = await server.addReplicationEndpoint({ - name: 'my-endpoint', - collection: myServerCollection, - changeValidator: myChangeValidator -}); -``` - -## Server-only indexes - -Normal RxDB schema indexes get the `_deleted` field prepended because all [RxQueries](./rx-query.md) automatically only search for documents with `_deleted=false`. -When you use RxDB on a server, this might not be optimal because there can be the need to query for documents where the value of `_deleted` does not matter. Mostly this is required in the [pull.stream$](./replication.md#checkpoint-iteration) of a replication when a [queryModifier](#query-modifier) is used to add an additional field to the query. - -To set indexes without `_deleted`, you can use the `internalIndexes` field of the schema like the following: - -```json - { - "version": 0, - "primaryKey": "id", - "type": "object", - "properties": { - "id": { - "type": "string", - "maxLength": 100 - }, - "name": { - "type": "string", - "maxLength": 100 - } - }, - "internalIndexes": [ - ["name", "id"] - ] -} -``` - -:::note -Indexes come with a performance burden. You should only use the indexes you need and make sure you **do not** accidentally set the `internalIndexes` in your client side [RxCollections](./rx-collection.md). -::: - -## Server-only fields - -All endpoints can be created with the `serverOnlyFields` set which defines some fields to only exist on the server, not on the clients. Clients will not see that fields and cannot do writes where one of the `serverOnlyFields` is set. -Notice that when you use `serverOnlyFields` you likely need to have a different schema on the server than the schema that is used on the clients. - -```ts -const endpoint = await server.addReplicationEndpoint({ - name: 'my-endpoint', - collection: col, - // here the field 'my-secretss' is defined to be server-only - serverOnlyFields: ['my-secrets'] -}); -``` - -:::note -For performance reasons, only top-level fields can be used as `serverOnlyFields`. Otherwise the server would have to deep-clone all document data which is too expensive. -::: - -## Readonly fields - -When you have fields that should only be modified by the server, but not by the client, you can ensure that by comparing the fields value in the [changeValidator](#change-validator). - -```ts - -const myChangeValidator = function(authData, change){ - if(change.newDocumentState.myReadonlyField !== change.assumedMasterState.myReadonlyField){ - throw new Error('myReadonlyField is readonly'); - } -} -``` - -## $regex queries not allowed - -`$regex` queries are not allowed to run at the server to prevent [ReDos Attacks](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS). - -## Conflict handling - -To [detect and handle conflicts](./replication.md#conflict-handling), the conflict handler from the endpoints RxCollection is used. - -## FAQ - -
    - Why are the server plugins in a different github repo and npm package? - - The RxServer and its other plugins are in a different github repository because: - - - It has too many dependencies that you do not want to install if you only use RxDB at the client side - - - It has a different license (SSPL) to prevent large cloud vendors from "stealing" the revenue, similar to MongoDB's license. - - - -
    - -
    - Why can't endpoints be added dynamically? - - After `RxServer.start()` is called, you can no longer add endpoints. This is because many of the supported - server libraries do not allow dynamic routing for performance and security reasons. - -
    diff --git a/docs/rx-state.html b/docs/rx-state.html deleted file mode 100644 index 792cd3521bc..00000000000 --- a/docs/rx-state.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - -RxState - Reactive Persistent State with RxDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxState - Reactive Persistent State with RxDB

    -

    RxState is a flexible state library build on top of the RxDB Database. While RxDB stores similar documents inside of collections, RxState can store any complex JSON data without having a predefined schema.

    -

    The state is automatically persisted through RxDB and states changes are propagated between browser tabs. Even setting up replication is simple by using the RxDB Replication feature.

    -

    Creating a RxState

    -

    A RxState instance is created on top of a RxDatabase. The state will automatically be persisted with the storage that was used when setting up the RxDatabase. To use it you first have to import the RxDBStatePlugin and add it to RxDB with addRxPlugin(). -To create a state call the addState() method on the database instance. Calling addState multiple times will automatically de-duplicated and only create a single RxState object.

    -
    import { createRxDatabase, addRxPlugin } from 'rxdb';
    -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
    - 
    -// first add the RxState plugin to RxDB
    -import { RxDBStatePlugin } from 'rxdb/plugins/state';
    -addRxPlugin(RxDBStatePlugin);
    - 
    -const database = await createRxDatabase({
    -  name: 'heroesdb',
    -  storage: getRxStorageLocalstorage(),
    -});
    - 
    -// create a state instance
    -const myState = await database.addState();
    - 
    -// you can also create states with a given namespace
    -const myChildState = await database.addState('myNamepsace');
    -

    Writing data and Persistence

    -

    Writing data to the state happen by a so called modifier. It is a simple JavaScript function that gets the current value as input and returns the new, modified value.

    -

    For example to increase the value of myField by one, you would use a modifier that increases the current value:

    -
    // initially set value to zero
    -await myState.set('myField', v => 0);
    - 
    -// increase value by one
    -await myState.set('myField', v => v + 1);
    - 
    -// update value to be 42
    -await myState.set('myField', v => 42);
    -

    The modifier is used instead of a direct assignment to ensure correct behavior when other JavaScript realms write to the state at the same time, like other browser tabs or webworkers. On conflicts, the modifier will just be run again to ensure deterministic and correct behavior. Therefore mutation is async, you have to await the call to the set function when you care about the moment when the change actually happened.

    -

    Get State Data

    -

    The state stored inside of a RxState instance can be seen as a big single JSON object that contains all data. -You can fetch the whole object or partially get a single properties or nested ones. -Fetching data can either happen with the .get() method or by accessing the field directly like myRxState.myField.

    -
    // get root state data
    -const val = myState.get();
    - 
    -// get single property
    -const val = myState.get('myField');
    -const val = myState.myField;
    - 
    -// get nested property
    -const val = myState.get('myField.childfield');
    -const val = myState.myField.childfield;
    - 
    -// get nested array property
    -const val = myState.get('myArrayField[0].foobar');
    -const val = myState.myArrayField[0].foobar;
    -

    Observability

    -

    Instead of fetching the state once, you can also observe the state with either rxjs observables or custom reactivity handlers like signals or hooks.

    -

    Rxjs observables can be created by either using the .get$() method or by accessing the top level property suffixed with a dollar sign like myState.myField$.

    -
    const observable = myState.get$('myField');
    -const observable = myState.myField$;
    - 
    -// then you can subscribe to that observable
    -observable.subscribe(newValue => {
    -    // update the UI
    -});
    -

    Subscription works across multiple JavaScript realms like browser tabs or Webworkers.

    -

    RxState with signals and hooks

    -

    With the double-dollar sign you can also access custom reactivity instances like signals or hooks. These are easier to use compared to rxjs, depending on which JavaScript framework you are using.

    -

    For example in angular to use signals, you would first add a reactivity factory to your database and then access the signals of the RxState:

    -
    import { RxReactivityFactory, createRxDatabase } from 'rxdb/plugins/core';
    -import { toSignal } from '@angular/core/rxjs-interop';
    -const reactivityFactory: RxReactivityFactory<ReactivityType> = {
    -    fromObservable(obs, initialValue) {
    -        return toSignal(obs, { initialValue });
    -    }
    -};
    -const database = await createRxDatabase({
    -    name: 'mydb',
    -    storage: getRxStorageLocalstorage(),
    -    reactivity: reactivityFactory
    -});
    -const myState = await database.addState();
    - 
    -const mySignal = myState.get$$('myField');
    -const mySignal = myState.myField$$;
    -

    Cleanup RxState operations

    -

    For faster writes, changes to the state are only written as list of operations to disc. After some time you might have too -many operations written which would delay the initial state creation. To automatically merge the state operations into a single operation and clear the old operations, you should add the Cleanup Plugin before creating the RxDatabase:

    -
    import { addRxPlugin } from 'rxdb';
    -import { RxDBCleanupPlugin } from 'rxdb/plugins/cleanup';
    -addRxPlugin(RxDBCleanupPlugin);
    -

    Correctness over Performance

    -

    RxState is optimized for correctness, not for performance. Compared to other state libraries, RxState directly persists data to storage and ensures write conflicts are handled properly. Other state libraries are handles mainly in-memory and lazily persist to disc without caring about conflicts or multiple browser tabs which can cause problems and hard to reproduce bugs.

    -

    RxState still uses RxDB which has a range of great performing storages so the write speed is more than sufficient. Also to further improve write performance you can use more RxState instances (with an different namespace) to split writes across multiple storage instances.

    -

    Reads happen directly in-memory which makes RxState read performance comparable to other state libraries.

    -

    RxState Replication

    -

    Because the state data is stored inside of an internal RxCollection you can easily use the RxDB Replication to sync data between users or devices of the same user.

    -

    For example with the P2P WebRTC replication you can start the replication on the collection and automatically sync the RxState operations between users directly:

    -
    import {
    -    replicateWebRTC,
    -    getConnectionHandlerSimplePeer
    -} from 'rxdb/plugins/replication-webrtc';
    - 
    -const database = await createRxDatabase({
    -  name: 'heroesdb',
    -  storage: getRxStorageLocalstorage(),
    -});
    - 
    -const myState = await database.addState();
    - 
    -const replicationPool = await replicateWebRTC(
    -    {
    -        collection: myState.collection,
    -        topic: 'my-state-replication-pool',
    -        connectionHandlerCreator: getConnectionHandlerSimplePeer({}),
    -        pull: {},
    -        push: {}
    -    }
    -);
    - - \ No newline at end of file diff --git a/docs/rx-state.md b/docs/rx-state.md deleted file mode 100644 index 6890667c6c6..00000000000 --- a/docs/rx-state.md +++ /dev/null @@ -1,166 +0,0 @@ -# RxState - Reactive Persistent State with RxDB - -> Get real-time, persistent state without the hassle. RxState integrates easily with signals and hooks, ensuring smooth updates across tabs and devices. - -# RxState - Reactive Persistent State with RxDB - -RxState is a flexible state library build on top of the [RxDB Database](https://rxdb.info/). While RxDB stores similar documents inside of collections, RxState can store any complex JSON data without having a predefined schema. - -The state is automatically persisted through RxDB and states changes are propagated between browser tabs. Even setting up replication is simple by using the RxDB [Replication feature](./replication.md). - -## Creating a RxState - -A `RxState` instance is created on top of a [RxDatabase](./rx-database.md). The state will automatically be persisted with the [storage](./rx-storage.md) that was used when setting up the RxDatabase. To use it you first have to import the `RxDBStatePlugin` and add it to RxDB with `addRxPlugin()`. -To create a state call the `addState()` method on the database instance. Calling `addState` multiple times will automatically de-duplicated and only create a single RxState object. - -```javascript -import { createRxDatabase, addRxPlugin } from 'rxdb'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -// first add the RxState plugin to RxDB -import { RxDBStatePlugin } from 'rxdb/plugins/state'; -addRxPlugin(RxDBStatePlugin); - -const database = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage(), -}); - -// create a state instance -const myState = await database.addState(); - -// you can also create states with a given namespace -const myChildState = await database.addState('myNamepsace'); -``` - -## Writing data and Persistence - -Writing data to the state happen by a so called `modifier`. It is a simple JavaScript function that gets the current value as input and returns the new, modified value. - -For example to increase the value of `myField` by one, you would use a modifier that increases the current value: -```ts -// initially set value to zero -await myState.set('myField', v => 0); - -// increase value by one -await myState.set('myField', v => v + 1); - -// update value to be 42 -await myState.set('myField', v => 42); -``` - -The modifier is used instead of a direct assignment to ensure correct behavior when other JavaScript realms write to the state at the same time, like other browser tabs or webworkers. On conflicts, the modifier will just be run again to ensure deterministic and correct behavior. Therefore mutation is `async`, you have to `await` the call to the set function when you care about the moment when the change actually happened. - -## Get State Data - -The state stored inside of a RxState instance can be seen as a big single JSON object that contains all data. -You can fetch the whole object or partially get a single properties or nested ones. -Fetching data can either happen with the `.get()` method or by accessing the field directly like `myRxState.myField`. - -```ts -// get root state data -const val = myState.get(); - -// get single property -const val = myState.get('myField'); -const val = myState.myField; - -// get nested property -const val = myState.get('myField.childfield'); -const val = myState.myField.childfield; - -// get nested array property -const val = myState.get('myArrayField[0].foobar'); -const val = myState.myArrayField[0].foobar; -``` - -## Observability - -Instead of fetching the state once, you can also observe the state with either rxjs observables or [custom reactivity handlers](#rxstate-with-signals-and-hooks) like signals or hooks. - -Rxjs observables can be created by either using the `.get$()` method or by accessing the top level property suffixed with a dollar sign like `myState.myField$`. - -```ts -const observable = myState.get$('myField'); -const observable = myState.myField$; - -// then you can subscribe to that observable -observable.subscribe(newValue => { - // update the UI -}); -``` -Subscription works across multiple JavaScript realms like browser tabs or Webworkers. - -## RxState with signals and hooks - -With the double-dollar sign you can also access [custom reactivity](./reactivity.md) instances like signals or hooks. These are easier to use compared to rxjs, depending on which JavaScript framework you are using. - -For example in angular to use signals, you would first add a reactivity factory to your database and then access the signals of the RxState: - -```ts -import { RxReactivityFactory, createRxDatabase } from 'rxdb/plugins/core'; -import { toSignal } from '@angular/core/rxjs-interop'; -const reactivityFactory: RxReactivityFactory = { - fromObservable(obs, initialValue) { - return toSignal(obs, { initialValue }); - } -}; -const database = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage(), - reactivity: reactivityFactory -}); -const myState = await database.addState(); - -const mySignal = myState.get$$('myField'); -const mySignal = myState.myField$$; -``` - -## Cleanup RxState operations - -For faster writes, changes to the state are only written as list of operations to disc. After some time you might have too -many operations written which would delay the initial state creation. To automatically merge the state operations into a single operation and clear the old operations, you should add the [Cleanup Plugin](./cleanup.md) before creating the [RxDatabase](./rx-database.md): - -```ts -import { addRxPlugin } from 'rxdb'; -import { RxDBCleanupPlugin } from 'rxdb/plugins/cleanup'; -addRxPlugin(RxDBCleanupPlugin); -``` - -## Correctness over Performance - -RxState is optimized for correctness, not for performance. Compared to other state libraries, RxState directly persists data to storage and ensures write conflicts are handled properly. Other state libraries are handles mainly in-memory and lazily persist to disc without caring about conflicts or multiple browser tabs which can cause problems and hard to reproduce bugs. - -RxState still uses RxDB which has a range of [great performing storages](./rx-storage-performance.md) so the write speed is more than sufficient. Also to further improve write performance you can use more RxState instances (with an different namespace) to split writes across multiple storage instances. - -Reads happen directly in-memory which makes RxState read performance comparable to other state libraries. - -## RxState Replication - -Because the state data is stored inside of an internal [RxCollection](./rx-collection.md) you can easily use the [RxDB Replication](./replication.md) to sync data between users or devices of the same user. - -For example with the [P2P WebRTC replication](./replication-webrtc.md) you can start the replication on the collection and automatically sync the RxState operations between users directly: - -```ts -import { - replicateWebRTC, - getConnectionHandlerSimplePeer -} from 'rxdb/plugins/replication-webrtc'; - -const database = await createRxDatabase({ - name: 'heroesdb', - storage: getRxStorageLocalstorage(), -}); - -const myState = await database.addState(); - -const replicationPool = await replicateWebRTC( - { - collection: myState.collection, - topic: 'my-state-replication-pool', - connectionHandlerCreator: getConnectionHandlerSimplePeer({}), - pull: {}, - push: {} - } -); -``` diff --git a/docs/rx-storage-denokv.html b/docs/rx-storage-denokv.html deleted file mode 100644 index 373811f60bc..00000000000 --- a/docs/rx-storage-denokv.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - -DenoKV RxStorage | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxDB Database on top of Deno Key Value Store

    -

    With the DenoKV RxStorage layer for RxDB, you can run a fully featured NoSQL database on top of the DenoKV API. -This gives you the benefits and features of the RxDB JavaScript Database, combined with the global availability and distribution features of the DenoKV.

    -

    DenoKV Database

    -

    What is DenoKV

    -

    DenoKV is a strongly consistent key-value storage, globally replicated for low-latency reads across 35 worldwide regions via Deno Deploy. -When you release your Deno application on Deno Deploy, it will start a instance on each of the 35 worldwide regions. This edge deployment guarantees minimal latency when serving requests to end users devices around the world. DenoKV is a shared storage which shares its state across all instances. -But, because DenoKV is "only" a Key-Value storage, it only supports basic CRUD operations on datasets and indexes. Complex features like queries, encryption, compression or client-server replication, are missing. Using RxDB on top of DenoKV fills this gap and makes it easy to build realtime offline-first application on top of Deno backend.

    -

    Use cases

    -

    Using RxDB-DenoKV instead of plain DenoKV, can have a wide range of benefits depending on your use case.

    -
      -
    • -

      Reduce vendor lock-in: RxDB has a swappable storage layer which allows you to swap out the underlying storage of your database. If you ever decide to move away from DenoDeploy or Deno at all, you do not have to refactor your whole application and instead just swap the storage plugin. For example if you decide migrate to Node.js, you can use the FoundationDB RxStorage and store your data there. DenoKV is also implemented on top of FoundationDB so you can get similar performance. Alternatively RxDB supports a wide range of storage plugins you can decide from.

      -
    • -
    • -

      Add reactiveness: DenoKV is a plain request-response datastore. While it supports observation of single rows by id, it does not allow to observe row-ranges or events. This makes it hard to impossible to build realtime applications with it because polling would be the only way to watch ranges of key-value pairs. With RxDB on top of DenoKV, changes to the database are shared between DenoDeploy instances so when you observe a query you can be sure that it is always up to date, no matter which instance has changed the document. Internally RxDB uses the Deno BroadcastChannel API to share events between instances.

      -
    • -
    • -

      Reuse Client and Server Code: When you use RxDB on the server and on the client side, many parts of your code can be reused on both sides which decreases development time significantly.

      -
    • -
    • -

      Replicate from DenoKV to a local RxDB state: Instead of running all operations against the global DenoKV, you can run a realtime-replication between a DenoKV-RxDatabase and a locally stored dataset or maybe even an in-memory stored one. This improves query performance and can reduce your Deno Deploy cloud costs because less operations run against the DenoKV, they only locally instead.

      -
    • -
    • -

      Replicate with other backends: The RxDB Sync Engine is pretty simple and allows you to easily build a replication with any backend architecture. For example if you already have your data stored in a self-hosted MySQL server, you can use RxDB to do a realtime replication of that data into a DenoKV RxDatabase instance. RxDB also has many plugins for replication with backend/protocols like GraphQL, Websocket, CouchDB, WebRTC, Firestore and NATS.

      -
    • -
    -

    DenoKV replication

    -

    Using the DenoKV RxStorage

    -

    To use the DenoKV RxStorage with RxDB, you import the getRxStorageDenoKV function from the plugin and set it as storage when calling createRxDatabase

    -
     
    -import { createRxDatabase } from 'rxdb';
    -import { getRxStorageDenoKV } from 'rxdb/plugins/storage-denokv';
    - 
    -const myRxDatabase = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageDenoKV({
    -      /**
    -       * Consistency level, either 'strong' or 'eventual'
    -       * (Optional) default='strong'
    -       */
    -      consistencyLevel: 'strong',
    -      /**
    -       * Path which is used in the first argument of Deno.openKv(settings.openKvPath)
    -       * (Optional) default=''
    -       */
    -      openKvPath: './foobar',
    -      /**
    -       * Some operations have to run in batches,
    -       * you can test different batch sizes to improve performance.
    -       * (Optional) default=100
    -       */
    -      batchSize: number
    -    })
    -});
    - 
    -

    On top of that RxDatabase you can then create your collections and run operations. Follow the quickstart to learn more about how to use RxDB.

    -

    Using non-DenoKV storages in Deno

    -

    When you use other storages than the DenoKV storage inside of a Deno app, make sure you set multiInstance: false when creating the database. Also you should only run one process per Deno-Deploy instance. This ensures your events are not mixed up by the BroadcastChannel across instances which would lead to wrong behavior.

    -
    // DenoKV based database
    -const db = await createRxDatabase({
    -  name: 'denokvdatabase',
    -  storage: getRxStorageDenoKV(),
    -  /**
    -   * Use multiInstance: true so that the Deno Broadcast Channel
    -   * emits event across DenoDeploy instances
    -   * (true is also the default, so you can skip this setting)
    -   */
    -  multiInstance: true
    -});
    - 
    -// Non-DenoKV based database
    -const db = await createRxDatabase({
    -  name: 'denokvdatabase',
    -  storage: getRxStorageFilesystemNode(),
    -  /**
    -   * Use multiInstance: false so that it does not share events
    -   * across instances because the stored data is anyway not shared
    -   * between them.
    -   */
    -  multiInstance: false
    -});
    - - \ No newline at end of file diff --git a/docs/rx-storage-denokv.md b/docs/rx-storage-denokv.md deleted file mode 100644 index d6ed67327ea..00000000000 --- a/docs/rx-storage-denokv.md +++ /dev/null @@ -1,98 +0,0 @@ -# DenoKV RxStorage - -> With the DenoKV [RxStorage](./rx-storage.md) layer for [RxDB](https://rxdb.info), you can run a fully featured **NoSQL database** on top of the [DenoKV API](https://docs.deno.com/kv/manual). -This gives you the benefits and features of the RxDB JavaScript Database, combined with the global availability and distribution features of the DenoKV. - -# RxDB Database on top of Deno Key Value Store - -With the DenoKV [RxStorage](./rx-storage.md) layer for [RxDB](https://rxdb.info), you can run a fully featured **NoSQL database** on top of the [DenoKV API](https://docs.deno.com/kv/manual). -This gives you the benefits and features of the RxDB JavaScript Database, combined with the global availability and distribution features of the DenoKV. - - - -## What is DenoKV - -[DenoKV](https://deno.com/kv) is a strongly consistent key-value storage, globally replicated for low-latency reads across 35 worldwide regions via [Deno Deploy](https://deno.com/deploy). -When you release your Deno application on Deno Deploy, it will start a instance on each of the [35 worldwide regions](https://docs.deno.com/deploy/manual/regions). This edge deployment guarantees minimal latency when serving requests to end users devices around the world. DenoKV is a shared storage which shares its state across all instances. -But, because DenoKV is "only" a **Key-Value storage**, it only supports basic CRUD operations on datasets and indexes. Complex features like queries, encryption, compression or client-server replication, are missing. Using RxDB on top of DenoKV fills this gap and makes it easy to build realtime [offline-first](./offline-first.md) application on top of Deno backend. - -## Use cases - -Using RxDB-DenoKV instead of plain DenoKV, can have a wide range of benefits depending on your use case. - -- **Reduce vendor lock-in**: RxDB has a swappable [storage layer](./rx-storage.md) which allows you to swap out the underlying storage of your database. If you ever decide to move away from DenoDeploy or Deno at all, you do not have to refactor your whole application and instead just **swap the storage plugin**. For example if you decide migrate to Node.js, you can use the [FoundationDB RxStorage](./rx-storage-foundationdb.md) and store your data there. DenoKV is also implemented on top of FoundationDB so you can get similar performance. Alternatively RxDB supports a wide range of [storage plugins](./rx-storage.md) you can decide from. - -- **Add reactiveness**: DenoKV is a plain request-response datastore. While it supports observation of single rows by id, it does not allow to observe row-ranges or events. This makes it hard to impossible to build realtime applications with it because polling would be the only way to watch ranges of key-value pairs. With RxDB on top of DenoKV, changes to the database are **shared between DenoDeploy instances** so when you **observe a [query](./rx-query.md)** you can be sure that it is always up to date, no matter which instance has changed the document. Internally RxDB uses the [Deno BroadcastChannel API](https://docs.deno.com/deploy/api/runtime-broadcast-channel) to share events between instances. - -- **Reuse Client and Server Code**: When you use RxDB on the server and on the client side, many parts of your code can be reused on both sides which decreases development time significantly. - -- **Replicate from DenoKV to a local RxDB state**: Instead of running all operations against the global DenoKV, you can run a [realtime-replication](./replication.md) between a DenoKV-RxDatabase and a [locally stored dataset](./rx-storage-filesystem-node.md) or maybe even an [in-memory](./rx-storage-memory.md) stored one. This improves **query performance** and can **reduce your Deno Deploy cloud costs** because less operations run against the DenoKV, they only locally instead. - -- **Replicate with other backends**: The RxDB [Sync Engine](./replication.md) is pretty simple and allows you to easily build a replication with any backend architecture. For example if you already have your data stored in a self-hosted MySQL server, you can use RxDB to do a realtime replication of that data into a DenoKV RxDatabase instance. RxDB also has many plugins for replication with backend/protocols like [GraphQL](./replication-graphql.md), [Websocket](./replication-websocket.md), [CouchDB](./replication-couchdb.md), [WebRTC](./replication-webrtc.md), [Firestore](./replication-firestore.md) and [NATS](./replication-nats.md). - - - -## Using the DenoKV RxStorage - -To use the DenoKV RxStorage with RxDB, you import the `getRxStorageDenoKV` function from the plugin and set it as storage when calling [createRxDatabase](./rx-database.md#creation) - -```ts - -import { createRxDatabase } from 'rxdb'; -import { getRxStorageDenoKV } from 'rxdb/plugins/storage-denokv'; - -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageDenoKV({ - /** - * Consistency level, either 'strong' or 'eventual' - * (Optional) default='strong' - */ - consistencyLevel: 'strong', - /** - * Path which is used in the first argument of Deno.openKv(settings.openKvPath) - * (Optional) default='' - */ - openKvPath: './foobar', - /** - * Some operations have to run in batches, - * you can test different batch sizes to improve performance. - * (Optional) default=100 - */ - batchSize: number - }) -}); - -``` - -On top of that [RxDatabase](./rx-database.md) you can then create your collections and run operations. Follow the [quickstart](./quickstart.md) to learn more about how to use RxDB. - -## Using non-DenoKV storages in Deno - -When you use other storages than the DenoKV storage inside of a Deno app, make sure you set `multiInstance: false` when creating the database. Also you should only run one process per Deno-Deploy instance. This ensures your events are not mixed up by the [BroadcastChannel](https://docs.deno.com/deploy/api/runtime-broadcast-channel) across instances which would lead to wrong behavior. - -```ts -// DenoKV based database -const db = await createRxDatabase({ - name: 'denokvdatabase', - storage: getRxStorageDenoKV(), - /** - * Use multiInstance: true so that the Deno Broadcast Channel - * emits event across DenoDeploy instances - * (true is also the default, so you can skip this setting) - */ - multiInstance: true -}); - -// Non-DenoKV based database -const db = await createRxDatabase({ - name: 'denokvdatabase', - storage: getRxStorageFilesystemNode(), - /** - * Use multiInstance: false so that it does not share events - * across instances because the stored data is anyway not shared - * between them. - */ - multiInstance: false -}); -``` diff --git a/docs/rx-storage-dexie.html b/docs/rx-storage-dexie.html deleted file mode 100644 index 335bea39f80..00000000000 --- a/docs/rx-storage-dexie.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - -RxDB Dexie.js Database - Fast, Reactive, Sync with Any Backend | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxStorage Dexie.js

    -

    To store the data inside of and RxDB Database in IndexedDB in the browser, you can use the Dexie.js based RxStorage. Dexie.js is a minimal wrapper around IndexedDB and the Dexie.js RxStorage wraps that again to use it for an RxDB database in the browser. For side projects and prototypes that run in a browser, you should use the dexie RxStorage as a default.

    -

    Dexie.js vs IndexedDB Storage

    -

    While Dexie.js RxStorage can be used for free, most professional projects should switch to our premium IndexedDB RxStorage 👑 in production:

    -
      -
    • It is faster and reduces build size by up to 36%.
    • -
    • It has a way better performance on reads and writes.
    • -
    • It stores attachments data as binary instead of base64 which reduces used space by 33%.
    • -
    • It does not use a Batched Cursor or custom indexes which makes queries slower compared to the IndexedDB RxStorage.
    • -
    • It supports non-required indexes which is not possible with Dexie.js.
    • -
    • It runs in a WAL-like mode (similar to SQLite) for faster writes and improved responsiveness.
    • -
    • It support the Storage Buckets API
    • -
    -

    How to use Dexie.js as a Storage for RxDB

    -
    1

    Import the Dexie Storage

    import { createRxDatabase } from 'rxdb/plugins/core';
    -import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie';
    2

    Create a Database

    const db = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageDexie()
    -});
    -

    Overwrite/Polyfill the native IndexedDB API with an in-memory version

    -

    Node.js has no IndexedDB API. To still run the Dexie RxStorage in Node.js, for example to run unit tests, you have to polyfill it. -You can do that by using the fake-indexeddb module and pass it to the getRxStorageDexie() function.

    -
    import { createRxDatabase } from 'rxdb/plugins/core';
    -import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie';
    - 
    -//> npm install fake-indexeddb --save
    -const fakeIndexedDB = require('fake-indexeddb');
    -const fakeIDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange');
    - 
    -const db = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageDexie({
    -        indexedDB: fakeIndexedDB,
    -        IDBKeyRange: fakeIDBKeyRange
    -    })
    -});
    - 
    -

    Using Dexie Addons

    -

    Dexie.js has its own plugin system with many plugins for encryption, replication or other use cases. With the Dexie.js RxStorage you can use the same plugins by passing them to the getRxStorageDexie() function.

    -
    const db = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageDexie({
    -        addons: [ /* Your Dexie.js plugins */ ]
    -    })
    -});
    -

    Sync Dexie.js with your Backend in RxDB

    -

    Having your local data in sync with a remote backend is a key feature of RxDB. Here are two approaches to achieve this when using the Dexie.js RxStorage:

    -
      -
    • Dexie Cloud provides a managed solution: For quick setups, letting you rely on its Cloud backend and conflict resolution.
    • -
    • RxDB's replication: Offers full control over your backend, data flow, and conflict handling.
    • -
    -

    Choose the approach that best suits your needs - whether you want to get started quickly with Dexie Cloud or require the adaptability and autonomy of RxDB's native replication.

    -

    A. Use Dexie Cloud Sync

    -

    Dexie Cloud is an official SaaS solution provided by the Dexie team. It offers automatic synchronization, user management, and conflict resolution out of the box. The primary benefits are:

    -
      -
    • Automatic Sync: Dexie Cloud keeps your local IndexedDB in sync with its cloud-based backend.
    • -
    • User Authentication: Built-in user management (auth, roles, permissions).
    • -
    • Conflict Resolution: Automated resolution logic on the server side.
    • -
    -
    1

    Install the Dexie Cloud Addon

    npm install dexie-cloud-addon
    2

    Import RxDB and dexie-cloud

    import { createRxDatabase } from 'rxdb/plugins/core';
    -import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie';
    -import dexieCloud from 'dexie-cloud-addon';
    3

    Create a Dexie based RxStorage with the Cloud Plugin

    const storage = getRxStorageDexie({
    -  addons: [dexieCloud],
    -  /*
    -   * Whenever a new dexie database instance is created,
    -   * this method will be called.
    -   */
    -  async onCreate(dexieDatabase, dexieDatabaseName) {
    -    await dexieDatabase.cloud.configure({
    -        databaseUrl: "https://<yourdatabase>.dexie.cloud",
    -        requireAuth: true // optional
    -    });
    -  }
    -});
    4

    Create an RxDB Database

    const db = await createRxDatabase({
    -  name: 'mydb',
    -  storage
    -});
    -

    B. Use the RxDB Replication

    -

    For full flexibility over your backend or conflict resolution strategy, you can use one of RxDB's many replication plugins like

    -
      -
    • CouchDB Replication Plugin: Replicate with a CouchDB Server
    • -
    • GraphQL Replication Plugin: Sync data with any GraphQL endpoint. Useful when you have a custom schema or you want to utilize GraphQL's powerful query features.
    • -
    • Custom Replication with REST APIs: Implement your own replication by building a pull/push handler that communicates with any RESTful backend.
    • -
    -

    Below is an example of replicating an RxDB collection with a CouchDB backend using RxDB's CouchDB replication plugin:

    -
    1

    Import the RxDB with dexie and the CouchDB plugin

    import { replicateCouchDB } from 'rxdb/plugins/replication-couchdb';
    -import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie';
    -import { createRxDatabase } from 'rxdb/plugins/core';
    2

    Create an RxDB Database with the Dexie Storage

    const db = await createRxDatabase({
    -  name: 'mydb',
    -  storage: getRxStorageDexie()
    -});
    3

    Add a Collection

    await db.addCollections({
    -    humans: {
    -        schema: {
    -            version: 0,
    -            type: 'object',
    -            primaryKey: 'id',
    -            properties: {
    -                id: { type: 'string', maxLength: 100 },
    -                name: { type: 'string' },
    -                age: { type: 'number' }
    -              },
    -            required: ['id', 'name']
    -        }
    -    }
    -});
    4

    Sync the Collection with a CouchDB Server

    const replicationState = replicateCouchDB({
    -  replicationIdentifier: 'my-couchdb-replication',
    -  collection: db.humans,
    -  // The URL to your CouchDB endpoint
    -  url: 'http://example.com/db/humans'
    -});
    -

    liveQuery - Realtime Queries

    -

    Dexie.js offers a feature called liveQuery which automatically updates query results as data changes, allowing you to react to these changes in real-time. However, because RxDB intrinsically provides reactive queries, you typically do not need to enable live queries through Dexie. Once you have created your database and collections with RxDB, any query you perform can be observed by subscribing to it, for example via collection.find().$.subscribe(results => { /*... */ }). This means RxDB takes care of listening for changes and automatically emitting new results - ensuring your UI stays in sync with the underlying data without requiring extra plugins or manual polling.

    -

    Disabling the non-premium console log

    -

    We want to be transparent with our community, and you'll notice a console message when using the free Dexie.js based RxStorage implementation. This message serves to inform you about the availability of faster storage solutions within our 👑 Premium Plugins. We understand that this might be a minor inconvenience, and we sincerely apologize for that. However, maintaining and improving RxDB requires substantial resources, and our premium users help us ensure its sustainability. If you find value in RxDB and wish to remove this message, we encourage you to explore our premium storage options, which are optimized for professional use and production environments. Thank you for your understanding and support.

    -

    If you already have premium access and want to use the Dexie.js RxStorage without the log, you can call the setPremiumFlag() function to disable the log.

    -
    import { setPremiumFlag } from 'rxdb-premium/plugins/shared';
    -setPremiumFlag();
    -

    Performance comparison with other RxStorage plugins

    -

    The performance of the Dexie.js RxStorage is good enough for most use cases but other storages can have way better performance metrics:

    -

    RxStorage performance - browser Dexie.js

    - - \ No newline at end of file diff --git a/docs/rx-storage-dexie.md b/docs/rx-storage-dexie.md deleted file mode 100644 index 0d3eb6e0f85..00000000000 --- a/docs/rx-storage-dexie.md +++ /dev/null @@ -1,216 +0,0 @@ -# RxDB Dexie.js Database - Fast, Reactive, Sync with Any Backend - -> Use Dexie.js to power RxDB in the browser. Enjoy quick setup, Dexie addons, and reliable storage for small apps or prototypes. - -import {Steps} from '@site/src/components/steps'; - -# RxStorage Dexie.js - -To store the data inside of and RxDB Database in IndexedDB in the [browser](./articles/browser-database.md), you can use the [Dexie.js](https://github.com/dexie/Dexie.js) based [RxStorage](./rx-storage.md). Dexie.js is a minimal wrapper around IndexedDB and the Dexie.js RxStorage wraps that again to use it for an RxDB database in the browser. For side projects and prototypes that run in a browser, you should use the dexie RxStorage as a default. - -## Dexie.js vs IndexedDB Storage - -While Dexie.js [RxStorage](./rx-storage.md) can be used for free, most professional projects should switch to our **premium [IndexedDB RxStorage](./rx-storage-indexeddb.md) 👑** in production: - -- It is faster and reduces build size by up to **36%**. -- It has a way [better performance](./rx-storage-performance.md) on reads and writes. -- It stores attachments data as binary instead of base64 which reduces used space by 33%. -- It does not use a [Batched Cursor](./slow-indexeddb.md#batched-cursor) or [custom indexes](./slow-indexeddb.md#custom-indexes) which makes queries slower compared to the [IndexedDB RxStorage](./rx-storage-indexeddb.md). -- It supports **non-required indexes** which is [not possible](https://github.com/pubkey/rxdb/pull/6643#issuecomment-2505310082) with Dexie.js. -- It runs in a **WAL-like mode** (similar to SQLite) for faster writes and improved responsiveness. -- It support the [Storage Buckets API](./rx-storage-indexeddb.md#storage-buckets) - -## How to use Dexie.js as a Storage for RxDB - - - -### Import the Dexie Storage -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; -``` - -### Create a Database -```ts -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageDexie() -}); -``` - - -## Overwrite/Polyfill the native IndexedDB API with an in-memory version - -Node.js has no IndexedDB API. To still run the Dexie `RxStorage` in Node.js, for example to run unit tests, you have to polyfill it. -You can do that by using the [fake-indexeddb](https://github.com/dumbmatter/fakeIndexedDB) module and pass it to the `getRxStorageDexie()` function. - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; - -//> npm install fake-indexeddb --save -const fakeIndexedDB = require('fake-indexeddb'); -const fakeIDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange'); - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageDexie({ - indexedDB: fakeIndexedDB, - IDBKeyRange: fakeIDBKeyRange - }) -}); - -``` - -## Using Dexie Addons - -Dexie.js has its own plugin system with [many plugins](https://dexie.org/docs/DerivedWork#known-addons) for encryption, replication or other use cases. With the Dexie.js `RxStorage` you can use the same plugins by passing them to the `getRxStorageDexie()` function. - -```ts -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageDexie({ - addons: [ /* Your Dexie.js plugins */ ] - }) -}); -``` - -## Sync Dexie.js with your Backend in RxDB - -Having your local data in sync with a remote backend is a key feature of RxDB. Here are two approaches to achieve this when using the Dexie.js RxStorage: - -* **Dexie Cloud** provides a **managed solution**: For quick setups, letting you rely on its Cloud backend and conflict resolution. -* [RxDB's replication](./replication.md): Offers **full control** over your backend, data flow, and [conflict handling](./transactions-conflicts-revisions.md). - -Choose the approach that best suits your needs - whether you want to get started quickly with Dexie Cloud or require the adaptability and autonomy of RxDB's native replication. - -### A. Use Dexie Cloud Sync - -**Dexie Cloud** is an official SaaS solution provided by the Dexie team. It offers automatic synchronization, user management, and conflict resolution out of the box. The primary benefits are: - -- **Automatic Sync**: Dexie Cloud keeps your local IndexedDB in sync with its cloud-based backend. -- **User Authentication**: Built-in user management (auth, roles, permissions). -- **Conflict Resolution**: Automated resolution logic on the server side. - - - -#### Install the Dexie Cloud Addon - -```bash -npm install dexie-cloud-addon -``` - -#### Import RxDB and dexie-cloud -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; -import dexieCloud from 'dexie-cloud-addon'; -``` - -#### Create a Dexie based RxStorage with the Cloud Plugin - -```ts -const storage = getRxStorageDexie({ - addons: [dexieCloud], - /* - * Whenever a new dexie database instance is created, - * this method will be called. - */ - async onCreate(dexieDatabase, dexieDatabaseName) { - await dexieDatabase.cloud.configure({ - databaseUrl: "https://.dexie.cloud", - requireAuth: true // optional - }); - } -}); -``` - -#### Create an RxDB Database - -```ts -const db = await createRxDatabase({ - name: 'mydb', - storage -}); -``` - - -### B. Use the RxDB Replication - -For **full flexibility** over your backend or conflict resolution strategy, you can use one of **RxDB's many replication plugins** like - -- [CouchDB Replication](./replication-couchdb.md) Plugin: Replicate with a CouchDB Server -- [GraphQL Replication](./replication-graphql.md) Plugin: Sync data with any GraphQL endpoint. Useful when you have a custom schema or you want to utilize GraphQL's powerful query features. -- [Custom Replication with REST APIs](./replication-http.md): Implement your own replication by building a pull/push handler that communicates with any RESTful backend. - -Below is an example of replicating an RxDB collection with a CouchDB backend using RxDB's CouchDB replication plugin: - - - -#### Import the RxDB with dexie and the CouchDB plugin -```ts -import { replicateCouchDB } from 'rxdb/plugins/replication-couchdb'; -import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; -import { createRxDatabase } from 'rxdb/plugins/core'; -``` - -#### Create an RxDB Database with the Dexie Storage - -```ts -const db = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageDexie() -}); -``` - -#### Add a Collection - -```ts -await db.addCollections({ - humans: { - schema: { - version: 0, - type: 'object', - primaryKey: 'id', - properties: { - id: { type: 'string', maxLength: 100 }, - name: { type: 'string' }, - age: { type: 'number' } - }, - required: ['id', 'name'] - } - } -}); -``` - -#### Sync the Collection with a CouchDB Server - -```ts -const replicationState = replicateCouchDB({ - replicationIdentifier: 'my-couchdb-replication', - collection: db.humans, - // The URL to your CouchDB endpoint - url: 'http://example.com/db/humans' -}); -``` - - - -## liveQuery - Realtime Queries - -Dexie.js offers a feature called `liveQuery` which automatically updates query results as data changes, allowing you to react to these changes in real-time. However, because RxDB intrinsically provides [reactive queries](./rx-query.md#observe), you typically do **not** need to enable live queries through Dexie. Once you have created your database and collections with RxDB, any query you perform can be observed by subscribing to it, for example via `collection.find().$.subscribe(results => { /*... */ })`. This means RxDB takes care of listening for changes and automatically emitting new results - ensuring your UI stays in sync with the underlying data without requiring extra plugins or manual polling. - -## Disabling the non-premium console log - -We want to be transparent with our community, and you'll notice a console message when using the free Dexie.js based RxStorage implementation. This message serves to inform you about the availability of faster storage solutions within our [👑 Premium Plugins](/premium/). We understand that this might be a minor inconvenience, and we sincerely apologize for that. However, maintaining and improving RxDB requires substantial resources, and our premium users help us ensure its sustainability. If you find value in RxDB and wish to remove this message, we encourage you to explore our premium storage options, which are optimized for professional use and production environments. Thank you for your understanding and support. - -If you already have premium access and want to use the Dexie.js [RxStorage](./rx-storage.md) without the log, you can call the `setPremiumFlag()` function to disable the log. - -```js -import { setPremiumFlag } from 'rxdb-premium/plugins/shared'; -setPremiumFlag(); -``` - -## Performance comparison with other RxStorage plugins - -The performance of the Dexie.js RxStorage is good enough for most use cases but other storages can have way better performance metrics: diff --git a/docs/rx-storage-filesystem-node.html b/docs/rx-storage-filesystem-node.html deleted file mode 100644 index 8909015bb13..00000000000 --- a/docs/rx-storage-filesystem-node.html +++ /dev/null @@ -1,72 +0,0 @@ - - - - - -Blazing-Fast Node Filesystem Storage | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Filesystem Node RxStorage

    -

    The Filesystem Node RxStorage for RxDB is built on top of the Node.js Filesystem API. -It stores data in plain json/txt files like any "normal" database does. It is a bit faster compared to the SQLite storage and its setup is less complex. -Using the same database folder in parallel with multiple Node.js processes is supported when you set multiInstance: true while creating the RxDatabase.

    -

    Pros

    - -

    Cons

    - -

    RxStorage performance - Node.js

    -

    Usage

    -
    import {
    -    createRxDatabase
    -} from 'rxdb';
    -import {
    -    getRxStorageFilesystemNode
    -} from 'rxdb-premium/plugins/storage-filesystem-node';
    - 
    -const myRxDatabase = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageFilesystemNode({
    -        basePath: path.join(__dirname, 'my-database-folder'),
    -        /**
    -         * Set inWorker=true if you use this RxStorage
    -         * together with the WebWorker plugin.
    -         */
    -        inWorker: false
    -    })
    -});
    -/* ... */
    - - \ No newline at end of file diff --git a/docs/rx-storage-filesystem-node.md b/docs/rx-storage-filesystem-node.md deleted file mode 100644 index 2a2e0341645..00000000000 --- a/docs/rx-storage-filesystem-node.md +++ /dev/null @@ -1,44 +0,0 @@ -# Blazing-Fast Node Filesystem Storage - -> Get up and running quickly with RxDB's Filesystem Node RxStorage. Store data in JSON, embrace multi-instance support, and enjoy a simpler database. - -# Filesystem Node RxStorage - -The Filesystem Node [RxStorage](./rx-storage.md) for RxDB is built on top of the [Node.js Filesystem API](https://nodejs.org/api/fs.html). -It stores data in plain json/txt files like any "normal" database does. It is a bit faster compared to the [SQLite storage](./rx-storage-sqlite.md) and its setup is less complex. -Using the same database folder in parallel with multiple Node.js processes is supported when you set `multiInstance: true` while creating the [RxDatabase](./rx-database.md). - -### Pros - -- Easier setup compared to [SQLite](./rx-storage-sqlite.md) -- [Fast](./rx-storage-performance.md) - -### Cons - -- It is part of the [RxDB Premium 👑](/premium/) plugin that must be purchased. - - - -## Usage - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageFilesystemNode -} from 'rxdb-premium/plugins/storage-filesystem-node'; - -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageFilesystemNode({ - basePath: path.join(__dirname, 'my-database-folder'), - /** - * Set inWorker=true if you use this RxStorage - * together with the WebWorker plugin. - */ - inWorker: false - }) -}); -/* ... */ -``` diff --git a/docs/rx-storage-foundationdb.html b/docs/rx-storage-foundationdb.html deleted file mode 100644 index 40501f928e5..00000000000 --- a/docs/rx-storage-foundationdb.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - -RxDB on FoundationDB - Performance at Scale | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxDB Database on top of FoundationDB

    -

    FoundationDB is a distributed key-value store designed to handle large volumes of structured data across clusters of computers while maintaining high levels of performance, scalability, and fault tolerance. While FoundationDB itself only can store and query key-value pairs, it lacks more advanced features like complex queries, encryption and replication.

    -

    With the FoundationDB based RxStorage of RxDB you can combine the benefits of FoundationDB while having a fully featured, high performance NoSQL database.

    -

    Features of RxDB+FoundationDB

    -

    Using RxDB on top of FoundationDB, gives you many benefits compare to using the plain FoundationDB API:

    -
      -
    • Indexes: In RxDB with a FoundationDB storage layer, indexes are used to optimize query performance, allowing for fast and efficient data retrieval even in large datasets. You can define single and compound indexes with the RxDB schema.
    • -
    • Schema Based Data Model: Utilizing a jsonschema based data model, the system offers a highly structured and versatile approach to organizing and validating data, ensuring consistency and clarity in database interactions.
    • -
    • Complex Queries: The system supports complex NoSQL queries, allowing for advanced data manipulation and retrieval, tailored to specific needs and intricate data relationships. For example you can do $regex or $or queries which is hardy possible with the plain key-value access of FoundationDB.
    • -
    • Observable Queries & Documents: RxDB's observable queries and documents feature ensures real-time updates and synchronization, providing dynamic and responsive data interactions in applications.
    • -
    • Compression: RxDB employs data compression techniques to reduce storage requirements and enhance transmission efficiency, making it more cost-effective and faster, especially for large volumes of data. You can compress the NoSQL document data, but also the binary attachments data.
    • -
    • Attachments: RxDB supports the storage and management of attachments which allowing for the seamless inclusion of binary data like images or documents alongside structured data within the database.
    • -
    -

    Installation

    -
      -
    • Install the FoundationDB client cli which is used to communicate with the FoundationDB cluster.
    • -
    • Install the FoundationDB node bindings npm module via npm install foundationdb. This will install v2.x.x, which is only compatible with FoundationDB server and client v7.3.x (which is the only version currently maintained by the FoundationDB team). If you need to use an older version (e.g. 7.1.x or 6.3.x), you should run npm install foundationdb@1.1.4 (though this might only work with v6.3.x).
    • -
    • Due to an outstanding bug in node foundationdb, you will need to specify an apiVersion of 720 even though you are using 730. When this PR is merged, you will be able to use 730.
    • -
    -

    Usage

    -
    import {
    -    createRxDatabase
    -} from 'rxdb';
    -import {
    -    getRxStorageFoundationDB
    -} from 'rxdb/plugins/storage-foundationdb';
    - 
    -const db = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageFoundationDB({
    -        /**
    -         * Version of the API of the FoundationDB cluster..
    -         * FoundationDB is backwards compatible across a wide range of versions,
    -         * so you have to specify the api version.
    -         * If in doubt, set it to 720.
    -         */
    -        apiVersion: 720,
    -        /**
    -         * Path to the FoundationDB cluster file.
    -         * (optional)
    -         * If in doubt, leave this empty to use the default location.
    -         */
    -        clusterFile: '/path/to/fdb.cluster',
    -        /**
    -         * Amount of documents to be fetched in batch requests.
    -         * You can change this to improve performance depending on
    -         * your database access patterns.
    -         * (optional)
    -         * [default=50]
    -         */
    -        batchSize: 50
    -    })
    -});
    -

    Multi Instance

    -

    Because FoundationDB does not offer a changestream, it is not possible to use the same cluster from more than one Node.js process at the same time. For example you cannot spin up multiple servers with RxDB databases that all use the same cluster. There might be workarounds to create something like a FoundationDB changestream and you can make a Pull Request if you need that feature.

    - - \ No newline at end of file diff --git a/docs/rx-storage-foundationdb.md b/docs/rx-storage-foundationdb.md deleted file mode 100644 index f766315ae4c..00000000000 --- a/docs/rx-storage-foundationdb.md +++ /dev/null @@ -1,68 +0,0 @@ -# RxDB on FoundationDB - Performance at Scale - -> Combine FoundationDB's reliability with RxDB's indexing and schema validation. Build scalable apps with faster queries and real-time data. - -# RxDB Database on top of FoundationDB - -[FoundationDB](https://www.foundationdb.org/) is a distributed key-value store designed to handle large volumes of structured data across clusters of computers while maintaining high levels of performance, scalability, and fault tolerance. While FoundationDB itself only can store and query key-value pairs, it lacks more advanced features like complex queries, encryption and replication. - -With the FoundationDB based [RxStorage](./rx-storage.md) of [RxDB](https://rxdb.info/) you can combine the benefits of FoundationDB while having a fully featured, high performance NoSQL database. - -## Features of RxDB+FoundationDB - -Using RxDB on top of FoundationDB, gives you many benefits compare to using the plain FoundationDB API: - -- **Indexes**: In RxDB with a FoundationDB storage layer, indexes are used to optimize query performance, allowing for fast and efficient data retrieval even in large datasets. You can define single and compound indexes with the [RxDB schema](./rx-schema.md). -- **Schema Based Data Model**: Utilizing a [jsonschema](./rx-schema.md) based data model, the system offers a highly structured and versatile approach to organizing and [validating data](./schema-validation.md), ensuring consistency and clarity in database interactions. -- **Complex Queries**: The system supports complex [NoSQL queries](./rx-query.md), allowing for advanced data manipulation and retrieval, tailored to specific needs and intricate data relationships. For example you can do `$regex` or `$or` queries which is hardy possible with the plain key-value access of FoundationDB. -- **Observable Queries & Documents**: RxDB's observable queries and documents feature ensures real-time updates and synchronization, providing dynamic and responsive data interactions in applications. -- **Compression**: RxDB employs data [compression techniques](./key-compression.md) to reduce storage requirements and enhance transmission efficiency, making it more cost-effective and faster, especially for large volumes of data. You can compress the [NoSQL document](./key-compression.md) data, but also the [binary attachments](./rx-attachment.md#attachment-compression) data. -- **Attachments**: RxDB supports the storage and management of [attachments](./rx-attachment.md) which allowing for the seamless inclusion of binary data like images or documents alongside structured data within the database. - -## Installation - -- Install the [FoundationDB client cli](https://apple.github.io/foundationdb/getting-started-linux.html) which is used to communicate with the FoundationDB cluster. -- Install the [FoundationDB node bindings npm module](https://www.npmjs.com/package/foundationdb) via `npm install foundationdb`. This will install `v2.x.x`, which is only compatible with FoundationDB server and client `v7.3.x` (which is the only version currently maintained by the FoundationDB team). If you need to use an older version (e.g. `7.1.x` or `6.3.x`), you should run `npm install foundationdb@1.1.4` (though this might only work with `v6.3.x`). -- Due to an outstanding bug in node foundationdb, you will need to specify an `apiVersion` of `720` even though you are using `730`. When [this PR](https://github.com/josephg/node-foundationdb/pull/86) is merged, you will be able to use `730`. - -## Usage - -```typescript -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageFoundationDB -} from 'rxdb/plugins/storage-foundationdb'; - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageFoundationDB({ - /** - * Version of the API of the FoundationDB cluster.. - * FoundationDB is backwards compatible across a wide range of versions, - * so you have to specify the api version. - * If in doubt, set it to 720. - */ - apiVersion: 720, - /** - * Path to the FoundationDB cluster file. - * (optional) - * If in doubt, leave this empty to use the default location. - */ - clusterFile: '/path/to/fdb.cluster', - /** - * Amount of documents to be fetched in batch requests. - * You can change this to improve performance depending on - * your database access patterns. - * (optional) - * [default=50] - */ - batchSize: 50 - }) -}); -``` - -## Multi Instance - -Because FoundationDB does not offer a [changestream](https://forums.foundationdb.org/t/streaming-data-out-of-foundationdb/683/2), it is not possible to use the same cluster from more than one Node.js process at the same time. For example you cannot spin up multiple servers with RxDB databases that all use the same cluster. There might be workarounds to create something like a FoundationDB changestream and you can make a Pull Request if you need that feature. diff --git a/docs/rx-storage-indexeddb.html b/docs/rx-storage-indexeddb.html deleted file mode 100644 index aa2ab0aeccc..00000000000 --- a/docs/rx-storage-indexeddb.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - -Instant Performance with IndexedDB RxStorage | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    IndexedDB RxStorage

    -

    The IndexedDB RxStorage is based on plain IndexedDB and can be used in browsers, electron or hybrid apps. -Compared to other browser based storages, the IndexedDB storage has the smallest write- and read latency, the fastest initial page load -and the smallest build size. Only for big datasets (more than 10k documents), the OPFS storage is better suited.

    -

    While the IndexedDB API itself can be very slow, the IndexedDB storage uses many tricks and performance optimizations, some of which are described here. For example it uses custom index strings instead of the native IndexedDB indexes, batches cursor for faster bulk reads and many other improvements. The IndexedDB storage also operates on Write-ahead logging similar to SQLite, to improve write latency while still ensuring consistency on writes.

    -

    IndexedDB performance comparison

    -

    Here is some performance comparison with other storages. Compared to the non-memory storages like OPFS and WASM SQLite. IndexedDB has the smallest build size and fastest write speed. Only OPFS is faster on queries over big datasets. See performance comparison page for a comparison with all storages.

    -

    IndexedDB performance

    -

    Using the IndexedDB RxStorage

    -

    To use the indexedDB storage you import it from the RxDB Premium 👑 npm module and use getRxStorageIndexedDB() when creating the RxDatabase.

    -
    import {
    -    createRxDatabase
    -} from 'rxdb';
    -import {
    -    getRxStorageIndexedDB
    -} from 'rxdb-premium/plugins/storage-indexeddb';
    - 
    -const db = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageIndexedDB({
    -        /**
    -         * For better performance, queries run with a batched cursor.
    -         * You can change the batchSize to optimize the query time
    -         * for specific queries.
    -         * You should only change this value when you are also doing performance measurements.
    -         * [default=300]
    -         */
    -        batchSize: 300
    -    })
    -});
    -

    Overwrite/Polyfill the native IndexedDB

    -

    Node.js has no IndexedDB API. To still run the IndexedDB RxStorage in Node.js, for example to run unit tests, you have to polyfill it. -You can do that by using the fake-indexeddb module and pass it to the getRxStorageIndexedDB() function.

    -
    import { createRxDatabase } from 'rxdb';
    -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb';
    - 
    -//> npm install fake-indexeddb --save
    -const fakeIndexedDB = require('fake-indexeddb');
    -const fakeIDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange');
    - 
    -const db = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageIndexedDB({
    -        indexedDB: fakeIndexedDB,
    -        IDBKeyRange: fakeIDBKeyRange
    -    })
    -});
    - 
    -

    Storage Buckets

    -

    The Storage Buckets API provides a way for sites to organize locally stored data into groupings called "storage buckets". This allows the user agent or sites to manage and delete buckets independently rather than applying the same treatment to all the data from a single origin. Read More

    -

    To use different storage buckets with the RxDB IndexedDB Storage, you can use a function instead of a plain object when providing the indexedDB attribute:

    -
    import { createRxDatabase } from 'rxdb';
    -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb';
    - 
    -const db = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageIndexedDB({
    -        indexedDB: async(params) => {
    -            const myStorageBucket = await navigator.storageBuckets.open('myApp-' + params.databaseName);
    -            return myStorageBucket.indexedDB;
    -        },
    -        IDBKeyRange
    -    })
    -});
    -

    Limitations of the IndexedDB RxStorage

    -
      -
    • It is part of the RxDB Premium 👑 plugin that must be purchased. If you just need a storage that works in the browser and you do not have to care about performance, you can use the LocalStorage storage instead.
    • -
    • The IndexedDB storage requires support for IndexedDB v2, it does not work on Internet Explorer.
    • -
    - - \ No newline at end of file diff --git a/docs/rx-storage-indexeddb.md b/docs/rx-storage-indexeddb.md deleted file mode 100644 index 6c0ec90a4cf..00000000000 --- a/docs/rx-storage-indexeddb.md +++ /dev/null @@ -1,94 +0,0 @@ -# Instant Performance with IndexedDB RxStorage - -> Choose IndexedDB RxStorage for unmatched speed and minimal build size. Perfect for fast-performing apps that demand reliable, lightweight data solutions. - -# IndexedDB RxStorage - -The IndexedDB [RxStorage](./rx-storage.md) is based on plain IndexedDB and can be used in browsers, [electron](./electron-database.md) or hybrid apps. -Compared to other browser based storages, the IndexedDB storage has the smallest write- and read latency, the fastest initial page load -and the smallest build size. Only for big datasets (more than 10k documents), the [OPFS storage](./rx-storage-opfs.md) is better suited. - -While the IndexedDB API itself can be very slow, the IndexedDB storage uses many tricks and performance optimizations, some of which are described [here](./slow-indexeddb.md). For example it uses custom index strings instead of the native IndexedDB indexes, batches cursor for faster bulk reads and many other improvements. The IndexedDB storage also operates on [Write-ahead logging](https://en.wikipedia.org/wiki/Write-ahead_logging) similar to SQLite, to improve write latency while still ensuring consistency on writes. - -## IndexedDB performance comparison - -Here is some performance comparison with other storages. Compared to the non-memory storages like [OPFS](./rx-storage-opfs.md) and [WASM SQLite](./rx-storage-sqlite.md). IndexedDB has the smallest build size and fastest write speed. Only OPFS is faster on queries over big datasets. See [performance comparison](./rx-storage-performance.md) page for a comparison with all storages. - - - -## Using the IndexedDB RxStorage - -To use the indexedDB storage you import it from the [RxDB Premium 👑](/premium/) npm module and use `getRxStorageIndexedDB()` when creating the [RxDatabase](./rx-database.md). - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageIndexedDB -} from 'rxdb-premium/plugins/storage-indexeddb'; - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageIndexedDB({ - /** - * For better performance, queries run with a batched cursor. - * You can change the batchSize to optimize the query time - * for specific queries. - * You should only change this value when you are also doing performance measurements. - * [default=300] - */ - batchSize: 300 - }) -}); -``` - -## Overwrite/Polyfill the native IndexedDB - -Node.js has no IndexedDB API. To still run the IndexedDB `RxStorage` in Node.js, for example to run unit tests, you have to polyfill it. -You can do that by using the [fake-indexeddb](https://github.com/dumbmatter/fakeIndexedDB) module and pass it to the `getRxStorageIndexedDB()` function. - -```ts -import { createRxDatabase } from 'rxdb'; -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; - -//> npm install fake-indexeddb --save -const fakeIndexedDB = require('fake-indexeddb'); -const fakeIDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange'); - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageIndexedDB({ - indexedDB: fakeIndexedDB, - IDBKeyRange: fakeIDBKeyRange - }) -}); - -``` - -## Storage Buckets - -The [Storage Buckets API](https://wicg.github.io/storage-buckets/) provides a way for sites to organize locally stored data into groupings called "storage buckets". This allows the user agent or sites to manage and delete buckets independently rather than applying the same treatment to all the data from a single origin. [Read More](https://developer.chrome.com/docs/web-platform/storage-buckets?hl=en) - -To use different storage buckets with the RxDB IndexedDB Storage, you can use a function instead of a plain object when providing the `indexedDB` attribute: - -```ts -import { createRxDatabase } from 'rxdb'; -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageIndexedDB({ - indexedDB: async(params) => { - const myStorageBucket = await navigator.storageBuckets.open('myApp-' + params.databaseName); - return myStorageBucket.indexedDB; - }, - IDBKeyRange - }) -}); -``` - -## Limitations of the IndexedDB RxStorage - -- It is part of the [RxDB Premium 👑](/premium/) plugin that must be purchased. If you just need a storage that works in the browser and you do not have to care about performance, you can use the [LocalStorage storage](./rx-storage-localstorage.md) instead. -- The IndexedDB storage requires support for [IndexedDB v2](https://caniuse.com/indexeddb2), it does not work on Internet Explorer. diff --git a/docs/rx-storage-localstorage-meta-optimizer.html b/docs/rx-storage-localstorage-meta-optimizer.html deleted file mode 100644 index 27b25370bb6..00000000000 --- a/docs/rx-storage-localstorage-meta-optimizer.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - -Fastest RxDB Starts - Localstorage Meta Optimizer | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxStorage Localstorage Meta Optimizer

    -

    The RxStorage Localstorage Meta Optimizer is a wrapper around any other RxStorage. The wrapper uses the original RxStorage for normal collection documents. But to optimize the initial page load time, it uses localstorage to store the plain key-value metadata that RxDB needs to create databases and collections. This plugin can only be used in browsers.

    -

    Depending on your database usage and the collection amount, this can save about 200 milliseconds on the initial pageload. It is recommended to use this when you create more than 4 RxCollections.

    -
    Premium

    This plugin is part of RxDB Premium 👑. It is not part of the default RxDB module.

    -

    Usage

    -

    The meta optimizer gets wrapped around any other RxStorage. It will than automatically detect if an RxDB internal storage instance is created, and replace that with a localstorage based instance.

    -
    import {
    -    getLocalstorageMetaOptimizerRxStorage
    -} from 'rxdb-premium/plugins/storage-localstorage-meta-optimizer';
    - 
    -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb';
    - 
    - 
    -/**
    - * First wrap the original RxStorage with the optimizer.
    - */
    -const optimizedRxStorage = getLocalstorageMetaOptimizerRxStorage({
    - 
    -    /**
    -     * Here we use the IndexedDB RxStorage,
    -     * it is also possible to use any other RxStorage instead.
    -     */
    -    storage: getRxStorageIndexedDB()
    -});
    - 
    -/**
    - * Create the RxDatabase with the wrapped RxStorage. 
    - */
    -const database = await createRxDatabase({
    -    name: 'mydatabase',
    -    storage: optimizedRxStorage
    -});
    - 
    - - \ No newline at end of file diff --git a/docs/rx-storage-localstorage-meta-optimizer.md b/docs/rx-storage-localstorage-meta-optimizer.md deleted file mode 100644 index 4c781c3d2e1..00000000000 --- a/docs/rx-storage-localstorage-meta-optimizer.md +++ /dev/null @@ -1,46 +0,0 @@ -# Fastest RxDB Starts - Localstorage Meta Optimizer - -> Wrap any RxStorage with localStorage metadata to slash initial load by up to 200ms. Unlock speed with this must-have RxDB Premium plugin. - -# RxStorage Localstorage Meta Optimizer - -The [RxStorage](./rx-storage.md) Localstorage Meta Optimizer is a wrapper around any other RxStorage. The wrapper uses the original RxStorage for normal collection documents. But to optimize the initial page load time, it uses [localstorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage?retiredLocale=de) to store the plain key-value metadata that RxDB needs to create databases and collections. This plugin can only be used in browsers. - -Depending on your database usage and the collection amount, this can save about 200 milliseconds on the initial pageload. It is recommended to use this when you create more than 4 RxCollections. - -:::note Premium -This plugin is part of [RxDB Premium 👑](/premium/). It is not part of the default RxDB module. -::: - -## Usage - -The meta optimizer gets wrapped around any other RxStorage. It will than automatically detect if an RxDB internal storage instance is created, and replace that with a [localstorage](./articles/localstorage.md) based instance. - -```ts -import { - getLocalstorageMetaOptimizerRxStorage -} from 'rxdb-premium/plugins/storage-localstorage-meta-optimizer'; - -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; - -/** - * First wrap the original RxStorage with the optimizer. - */ -const optimizedRxStorage = getLocalstorageMetaOptimizerRxStorage({ - - /** - * Here we use the IndexedDB RxStorage, - * it is also possible to use any other RxStorage instead. - */ - storage: getRxStorageIndexedDB() -}); - -/** - * Create the RxDatabase with the wrapped RxStorage. - */ -const database = await createRxDatabase({ - name: 'mydatabase', - storage: optimizedRxStorage -}); - -``` diff --git a/docs/rx-storage-localstorage.html b/docs/rx-storage-localstorage.html deleted file mode 100644 index 772f2b24d49..00000000000 --- a/docs/rx-storage-localstorage.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - -RxDB LocalStorage - The Easiest Way to Persist Data in Your Web App | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxStorage LocalStorage

    -

    RxDB can persist data in various ways. One of the simplest methods is using the browser’s built-in LocalStorage. This storage engine allows you to store and retrieve RxDB documents directly from the browser without needing additional plugins or libraries.

    -
    -

    Recommended Default for using RxDB in the Browser

    -

    We highly recommend using LocalStorage for a quick and easy RxDB setup, especially when you want a minimal project configuration. For professional projects, the IndexedDB RxStorage is recommended in most cases.

    -
    -

    Key Benefits

    -
      -
    1. Simplicity: No complicated configurations or external dependencies - LocalStorage is already built into the browser.
    2. -
    3. Fast for small Datasets: Writing and Reading small sets of data from localStorage is really fast as shown in these benchmarks.
    4. -
    5. Ease of Setup: Just import the plugin, import it, and pass getRxStorageLocalstorage() into createRxDatabase(). That’s it!
    6. -
    -

    Limitations

    -

    While LocalStorage is the easiest way to get started, it does come with some constraints:

    -
      -
    1. Limited Storage Capacity: Browsers often limit LocalStorage to around 5 MB per domain, though exact limits vary.
    2. -
    3. Synchronous Access: LocalStorage operations block the main thread. This is usually fine for small amounts of data but can cause performance bottlenecks with heavier use.
    4. -
    -

    Despite these limitations, LocalStorage remains a great default option for smaller projects, prototypes, or cases where you need the absolute simplest way to persist data in the browser.

    -

    How to use the LocalStorage RxStorage with RxDB

    -
    1

    Import the Storage

    import { createRxDatabase } from 'rxdb/plugins/core';
    -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
    2

    Create a Database

    const db = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageLocalstorage()
    -});
    3

    Add a Collection

    await db.addCollections({
    -  tasks: {
    -    schema: {
    -      title: 'tasks schema',
    -      version: 0,
    -      primaryKey: 'id',
    -      type: 'object',
    -      properties: {
    -        id: { type: 'string' },
    -        title: { type: 'string' },
    -        done: { type: 'boolean' }
    -      },
    -      required: ['id', 'title', 'done']
    -    }
    -  }
    -});
    4

    Insert a document

    await db.tasks.insert({ id: 'task-01', title: 'Get started with RxDB' });
    5

    Query documents

    const nonDoneTasks = await db.tasks.find({
    -    selector: {
    -        done: {
    -            $eq: false
    -        }
    -    }
    -}).exec();
    -

    Mocking the LocalStorage API for testing in Node.js

    -

    While the localStorage API only exists in browsers, your can the LocalStorage based storage in Node.js by using the mock that comes with RxDB. -This is intended to be used in unit tests or other test suites:

    -
    import { createRxDatabase } from 'rxdb/plugins/core';
    -import {
    -    getRxStorageLocalstorage,
    -    getLocalStorageMock
    -} from 'rxdb/plugins/storage-localstorage';
    - 
    -const db = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageLocalstorage({
    -        localStorage: getLocalStorageMock()
    -    })
    -});
    - 
    - - \ No newline at end of file diff --git a/docs/rx-storage-localstorage.md b/docs/rx-storage-localstorage.md deleted file mode 100644 index 64613d4de65..00000000000 --- a/docs/rx-storage-localstorage.md +++ /dev/null @@ -1,107 +0,0 @@ -# RxDB LocalStorage - The Easiest Way to Persist Data in Your Web App - -> Discover how to quickly set up RxDB's LocalStorage-based storage as the recommended default. Learn its benefits, limitations, and why it’s perfect for demos, prototypes, and lightweight applications. - -import {Steps} from '@site/src/components/steps'; - -# RxStorage LocalStorage - -RxDB can persist data in various ways. One of the simplest methods is using the browser’s built-in [LocalStorage](./articles/localstorage.md). This storage engine allows you to store and retrieve RxDB documents directly from the browser without needing additional plugins or libraries. - -> **Recommended Default for using RxDB in the Browser** -> -> We highly recommend using LocalStorage for a quick and easy RxDB setup, especially when you want a minimal project configuration. For professional projects, the [IndexedDB RxStorage](./rx-storage-indexeddb.md) is recommended in most cases. - -## Key Benefits - -1. **Simplicity**: No complicated configurations or external dependencies - LocalStorage is already built into the browser. -2. **Fast for small Datasets**: Writing and Reading small sets of data from localStorage is really fast as shown in [these benchmarks](./articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.md#performance-comparison). -4. **Ease of Setup**: Just import the plugin, import it, and pass `getRxStorageLocalstorage()` into `createRxDatabase()`. That’s it! - -## Limitations - -While LocalStorage is the easiest way to get started, it does come with some constraints: - -1. **Limited Storage Capacity**: Browsers often limit LocalStorage to around [5 MB per domain](./articles/localstorage.md#understanding-the-limitations-of-local-storage), though exact limits vary. -2. **Synchronous Access**: LocalStorage operations block the main thread. This is usually fine for small amounts of data but can cause performance bottlenecks with heavier use. - -Despite these limitations, LocalStorage remains a great default option for smaller projects, prototypes, or cases where you need the absolute simplest way to persist data in the browser. - -## How to use the LocalStorage RxStorage with RxDB - - - -### Import the Storage -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -``` - -### Create a Database -```ts -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageLocalstorage() -}); -``` - -### Add a Collection - -```ts -await db.addCollections({ - tasks: { - schema: { - title: 'tasks schema', - version: 0, - primaryKey: 'id', - type: 'object', - properties: { - id: { type: 'string' }, - title: { type: 'string' }, - done: { type: 'boolean' } - }, - required: ['id', 'title', 'done'] - } - } -}); -``` - -### Insert a document - -```ts -await db.tasks.insert({ id: 'task-01', title: 'Get started with RxDB' }); -``` - -### Query documents -```ts -const nonDoneTasks = await db.tasks.find({ - selector: { - done: { - $eq: false - } - } -}).exec(); -``` - - - -## Mocking the LocalStorage API for testing in Node.js - -While the `localStorage` API only exists in browsers, your can the LocalStorage based storage in Node.js by using the mock that comes with RxDB. -This is intended to be used in unit tests or other test suites: - -```ts -import { createRxDatabase } from 'rxdb/plugins/core'; -import { - getRxStorageLocalstorage, - getLocalStorageMock -} from 'rxdb/plugins/storage-localstorage'; - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageLocalstorage({ - localStorage: getLocalStorageMock() - }) -}); - -``` diff --git a/docs/rx-storage-lokijs.html b/docs/rx-storage-lokijs.html deleted file mode 100644 index 182b8ea7056..00000000000 --- a/docs/rx-storage-lokijs.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - -Empower RxDB with the LokiJS RxStorage | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxStorage LokiJS

    -

    The LokiJS RxStorage is based on LokiJS which is an in-memory database that processes all data in memory and only saves to disc when the app is closed or an interval is reached. This makes it very fast but you have the possibility to lose seemingly persisted writes when the JavaScript process ends before the persistence loop has been done.

    -
    LokiJS was removed in RxDB version 16

    The LokiJS project itself is no longer in development or maintained and therefore the lokijs RxStorage is removed. There are known bugs like having wrong query results of losing data. LokiJS bugs that occur outside of the RxDB layer will not be fixed and the LokiJS RxStorage was removed in RxDB version 16. Using LokiJS as storage is no longer possible. In production it is recommended to use another RxStorage instead. For browsers better use the IndexedDB storage. For fast lazy persistence in memory data (similar to how lokijs works) you can use the Memory Mapped storage. If you really need the lokijs RxStorage, you can fork the open-source code from the previous RxDB version.

    -

    Pros

    -
      -
    • Queries can run faster because all data is processed in memory.
    • -
    • It has a much faster initial load time because it loads all data from IndexedDB in a single request. But this is only true for small datasets. If much data must is stored, the initial load time can be higher than on other RxStorage implementations.
    • -
    -

    Cons

    -
      -
    • It does not support attachments.
    • -
    • Data can be lost when the JavaScript process is killed ungracefully like when the browser crashes or the power of the PC is terminated.
    • -
    • All data must fit into the memory.
    • -
    • Slow initialisation time when used with multiInstance: true because it has to await the leader election process.
    • -
    • Slow initialisation time when really much data is stored inside of the database because it has to parse a big JSON string.
    • -
    -

    Usage

    -
    import {
    -    createRxDatabase
    -} from 'rxdb';
    -import {
    -    getRxStorageLoki
    -} from 'rxdb/plugins/storage-lokijs';
    - 
    -// in the browser, we want to persist data in IndexedDB, so we use the indexeddb adapter.
    -const LokiIncrementalIndexedDBAdapter = require('lokijs/src/incremental-indexeddb-adapter');
    - 
    -const db = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageLoki({
    -        adapter: new LokiIncrementalIndexedDBAdapter(),
    -        /* 
    -         * Do not set lokiJS persistence options like autoload and autosave,
    -         * RxDB will pick proper defaults based on the given adapter
    -         */
    -    })
    -});
    -

    Adapters

    -

    LokiJS is based on adapters that determine where to store persistent data. For LokiJS there are adapters for IndexedDB, AWS S3, the NodeJS filesystem or NativeScript. -Find more about the possible adapters at the LokiJS docs. For react native there is also the loki-async-reference-adapter.

    -

    Multi-Tab support

    -

    When you use plain LokiJS, you cannot build an app that can be used in multiple browser tabs. The reason is that LokiJS loads data in bulk and then only regularly persists the in-memory state to disc. When opened in multiple tabs, it would happen that the LokiJS instances overwrite each other and data is lost. -With the RxDB LokiJS-plugin, this problem is fixed with the LeaderElection module. Between all open tabs, a leading tab is elected and only in this tab a database is created. All other tabs do not run queries against their own database, but instead call the leading tab to send and retrieve data. When the leading tab is closed, a new leader is elected that reopens the database and processes queries. You can disable this by setting multiInstance: false when creating the RxDatabase.

    -

    Autosave and autoload

    -

    When using plain LokiJS, you could set the autosave option to true to make sure that LokiJS persists the database state after each write into the persistence adapter. Same goes to autoload which loads the persisted state on database creation. -But RxDB knows better when to persist the database state and when to load it, so it has its own autosave logic. This will ensure that running the persistence handler does not affect the performance of more important tasks. Instead RxDB will always wait until the database is idle and then runs the persistence handler. -A load of the persisted state is done on database or collection creation and it is ensured that multiple load calls do not run in parallel and interfere with each other or with saveDatabase() calls.

    -

    Known problems

    -

    When you bundle the LokiJS Plugin with webpack, you might get the error Cannot find module "fs". This is because LokiJS uses a require('fs') statement that cannot work in the browser. -You can fix that by telling webpack to not resolve the fs module with the following block in your webpack config:

    -
    // in your webpack.config.js
    -{
    -    /* ... */
    -    resolve: {
    -        fallback: {
    -            fs: false
    -        }
    -    }
    -    /* ... */
    -}
    - 
    -// Or if you do not have a webpack.config.js like you do with angular,
    -// you might fix it by setting the browser field in the package.json
    -{
    -  /* ... */
    -  "browser": {
    -    "fs": false
    -  }
    -  /* ... */
    -}
    - 
    -

    Using the internal LokiJS database

    -

    For custom operations, you can access the internal LokiJS database. -This is dangerous because you might do changes that are not compatible with RxDB. -Only use this when there is no way to achieve your goals via the RxDB API.

    -
     
    -const storageInstance = myRxCollection.storageInstance;
    -const localState = await storageInstance.internals.localState;
    -localState.collection.insert({
    -    key: 'foo',
    -    value: 'bar',
    -    _deleted: false,
    -    _attachments: {},
    -    _rev: '1-62080c42d471e3d2625e49dcca3b8e3e',
    -    _meta: {
    -        lwt: new Date().getTime()
    -    }
    -});
    - 
    -// manually trigger the save queue because we did a write to the internal loki db. 
    -await localState.databaseState.saveQueue.addWrite();
    -

    Disabling the non-premium console log

    -

    We want to be transparent with our community, and you'll notice a console message when using the free Loki.js based RxStorage implementation. This message serves to inform you about the availability of faster storage solutions within our 👑 Premium Plugins. We understand that this might be a minor inconvenience, and we sincerely apologize for that. However, maintaining and improving RxDB requires substantial resources, and our premium users help us ensure its sustainability. If you find value in RxDB and wish to remove this message, we encourage you to explore our premium storage options, which are optimized for professional use and production environments. Thank you for your understanding and support.

    -

    If you already have premium access and want to use the LokiJS RxStorage without the log, you can call the setPremiumFlag() function to disable the log.

    -
    import { setPremiumFlag } from 'rxdb-premium/plugins/shared';
    -setPremiumFlag();
    - - \ No newline at end of file diff --git a/docs/rx-storage-memory-mapped.html b/docs/rx-storage-memory-mapped.html deleted file mode 100644 index 72dee5d5fad..00000000000 --- a/docs/rx-storage-memory-mapped.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - -Blazing-Fast Memory Mapped RxStorage | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Memory Mapped RxStorage

    -

    The memory mapped RxStorage is a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance is kept persistent with a given underlying storage.

    -

    Pros

    -
      -
    • Improves read/write performance because these operations run against the in-memory storage.
    • -
    • Decreases initial page load because it load all data in a single bulk request. It even detects if the database is used for the first time and then it does not have to await the creation of the persistent storage.
    • -
    • Can store encrypted data on disc while still being able to run queries on the non-encrypted in-memory state.
    • -
    -

    Cons

    -
      -
    • It does not support attachments because storing big attachments data in-memory should not be done.
    • -
    • When the JavaScript process is killed ungracefully like when the browser crashes or the power of the PC is terminated, it might happen that some memory writes are not persisted to the parent storage. This can be prevented with the awaitWritePersistence flag.
    • -
    • The memory-mapped storage can only be used if all data fits into the memory of the JavaScript process. This is normally not a problem because a browser has much memory these days and plain JSON document data is not that big.
    • -
    • Because it has to await an initial data loading from the parent storage into the memory, initial page load time can increase when much data is already stored. This is likely not a problem when you store less than 10k documents.
    • -
    • The memory-mapped storage is part of RxDB Premium 👑. It is not part of the default RxDB core module.
    • -
    -

    Using the Memory-Mapped RxStorage

    -
     
    -import {
    -    getRxStorageIndexedDB
    -} from 'rxdb-premium/plugins/storage-indexeddb';
    -import {
    -    getMemoryMappedRxStorage
    -} from 'rxdb-premium/plugins/storage-memory-mapped';
    - 
    -/**
    - * Here we use the IndexedDB RxStorage as persistence storage.
    - * Any other RxStorage can also be used.
    - */
    -const parentStorage = getRxStorageIndexedDB();
    - 
    -// wrap the persistent storage with the memory-mapped storage.
    -const storage = getMemoryMappedRxStorage({
    -    storage: parentStorage
    -});
    - 
    -// create the RxDatabase like you would do with any other RxStorage
    -const db = await createRxDatabase({
    -    name: 'myDatabase,
    -    storage,
    -});
    -/** ... **/
    -

    Multi-Tab Support

    -

    By how the memory-mapped storage works, it is not possible to have the same storage open in multiple JavaScript processes. So when you use this in a browser application, you can not open multiple databases when the app is used in multiple browser tabs. -To solve this, use the SharedWorker Plugin so that the memory-mapped storage runs inside of a SharedWorker exactly once and is then reused for all browser tabs.

    -

    If you have a single JavaScript process, like in a React Native app, you do not have to care about this and can just use the memory-mapped storage in the main process.

    -

    Encryption of the persistent data

    -

    Normally RxDB is not capable of running queries on encrypted fields. But when you use the memory-mapped RxStorage, you can store the document data encrypted on disc, while being able to run queries on the not encrypted in-memory state. Make sure you use the encryption storage wrapper around the persistent storage, NOT around the memory-mapped storage as a whole.

    -
     
    -import {
    -    getRxStorageIndexedDB
    -} from 'rxdb-premium/plugins/storage-indexeddb';
    -import {
    -    getMemoryMappedRxStorage
    -} from 'rxdb-premium/plugins/storage-memory-mapped';
    -import { wrappedKeyEncryptionWebCryptoStorage } from 'rxdb-premium/plugins/encryption-web-crypto';
    - 
    -const storage = getMemoryMappedRxStorage({
    -    storage: wrappedKeyEncryptionWebCryptoStorage({
    -        storage: getRxStorageIndexedDB()
    -    })
    -});
    - 
    -const db = await createRxDatabase({
    -    name: 'myDatabase,
    -    storage,
    -});
    -/** ... **/
    -

    Await Write Persistence

    -

    Running operations on the memory-mapped storage by default returns directly when the operation has run on the in-memory state and then persist changes in the background. -Sometimes you might want to ensure write operations is persisted, you can do this by setting awaitWritePersistence: true.

    -
    const storage = getMemoryMappedRxStorage({
    -    awaitWritePersistence: true,
    -    storage: getRxStorageIndexedDB()
    -});
    -

    Block Size Limit

    -

    During cleanup, the memory-mapped storage will merge many small write-blocks into single big blocks for better initial load performance. -The blockSizeLimit defines the maximum of how many documents get stored in a single block. The default is 10000.

    -
    const storage = getMemoryMappedRxStorage({
    -    blockSizeLimit: 1000,
    -    storage: getRxStorageIndexedDB()
    -});
    - - \ No newline at end of file diff --git a/docs/rx-storage-memory-mapped.md b/docs/rx-storage-memory-mapped.md deleted file mode 100644 index 781ddec7e6d..00000000000 --- a/docs/rx-storage-memory-mapped.md +++ /dev/null @@ -1,108 +0,0 @@ -# Blazing-Fast Memory Mapped RxStorage - -> Boost your app's performance with Memory Mapped RxStorage. Query and write in-memory while seamlessly persisting data to your chosen storage. - -# Memory Mapped RxStorage - -The memory mapped [RxStorage](./rx-storage.md) is a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance is kept persistent with a given underlying storage. - -## Pros - -- Improves read/write performance because these operations run against the in-memory storage. -- Decreases initial page load because it load all data in a single bulk request. It even detects if the database is used for the first time and then it does not have to await the creation of the persistent storage. -- Can store encrypted data on disc while still being able to run queries on the non-encrypted in-memory state. - -## Cons - -- It does not support attachments because storing big attachments data in-memory should not be done. -- When the JavaScript process is killed ungracefully like when the browser crashes or the power of the PC is terminated, it might happen that some memory writes are not persisted to the parent storage. This can be prevented with the `awaitWritePersistence` flag. -- The memory-mapped storage can only be used if all data fits into the memory of the JavaScript process. This is normally not a problem because a browser has much memory these days and plain JSON document data is not that big. -- Because it has to await an initial data loading from the parent storage into the memory, initial page load time can increase when much data is already stored. This is likely not a problem when you store less than `10k` documents. -- The `memory-mapped` storage is part of [RxDB Premium 👑](/premium/). It is not part of the default RxDB core module. - -## Using the Memory-Mapped RxStorage - -```ts - -import { - getRxStorageIndexedDB -} from 'rxdb-premium/plugins/storage-indexeddb'; -import { - getMemoryMappedRxStorage -} from 'rxdb-premium/plugins/storage-memory-mapped'; - -/** - * Here we use the IndexedDB RxStorage as persistence storage. - * Any other RxStorage can also be used. - */ -const parentStorage = getRxStorageIndexedDB(); - -// wrap the persistent storage with the memory-mapped storage. -const storage = getMemoryMappedRxStorage({ - storage: parentStorage -}); - -// create the RxDatabase like you would do with any other RxStorage -const db = await createRxDatabase({ - name: 'myDatabase, - storage, -}); -/** ... **/ -``` - -## Multi-Tab Support - -By how the memory-mapped storage works, it is not possible to have the same storage open in multiple JavaScript processes. So when you use this in a browser application, you can not open multiple databases when the app is used in multiple browser tabs. -To solve this, use the [SharedWorker Plugin](./rx-storage-shared-worker.md) so that the memory-mapped storage runs inside of a SharedWorker exactly once and is then reused for all browser tabs. - -If you have a single JavaScript process, like in a React Native app, you do not have to care about this and can just use the memory-mapped storage in the main process. - -## Encryption of the persistent data - -Normally RxDB is not capable of running queries on encrypted fields. But when you use the memory-mapped RxStorage, you can store the document data encrypted on disc, while being able to run queries on the not encrypted in-memory state. Make sure you use the encryption storage wrapper around the persistent storage, **NOT** around the memory-mapped storage as a whole. - -```ts - -import { - getRxStorageIndexedDB -} from 'rxdb-premium/plugins/storage-indexeddb'; -import { - getMemoryMappedRxStorage -} from 'rxdb-premium/plugins/storage-memory-mapped'; -import { wrappedKeyEncryptionWebCryptoStorage } from 'rxdb-premium/plugins/encryption-web-crypto'; - -const storage = getMemoryMappedRxStorage({ - storage: wrappedKeyEncryptionWebCryptoStorage({ - storage: getRxStorageIndexedDB() - }) -}); - -const db = await createRxDatabase({ - name: 'myDatabase, - storage, -}); -/** ... **/ -``` - -## Await Write Persistence -Running operations on the memory-mapped storage by default returns directly when the operation has run on the in-memory state and then persist changes in the background. -Sometimes you might want to ensure write operations is persisted, you can do this by setting `awaitWritePersistence: true`. - -```ts -const storage = getMemoryMappedRxStorage({ - awaitWritePersistence: true, - storage: getRxStorageIndexedDB() -}); -``` - -## Block Size Limit - -During cleanup, the memory-mapped storage will merge many small write-blocks into single big blocks for better initial load performance. -The `blockSizeLimit` defines the maximum of how many documents get stored in a single block. The default is `10000`. - -```ts -const storage = getMemoryMappedRxStorage({ - blockSizeLimit: 1000, - storage: getRxStorageIndexedDB() -}); -``` diff --git a/docs/rx-storage-memory-synced.html b/docs/rx-storage-memory-synced.html deleted file mode 100644 index f023b3d1842..00000000000 --- a/docs/rx-storage-memory-synced.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - - -Instant Performance with Memory Synced RxStorage | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Memory Synced RxStorage

    -

    The memory synced RxStorage is a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance is replicated with the underlying storage for persistence. -The main reason to use this is to improve initial page load and query/write times. This is mostly useful in browser based applications.

    -

    Pros

    -
      -
    • Improves read/write performance because these operations run against the in-memory storage.
    • -
    • Decreases initial page load because it load all data in a single bulk request. It even detects if the database is used for the first time and then it does not have to await the creation of the persistent storage.
    • -
    -

    Cons

    -
      -
    • It does not support attachments.
    • -
    • When the JavaScript process is killed ungracefully like when the browser crashes or the power of the PC is terminated, it might happen that some memory writes are not persisted to the parent storage. This can be prevented with the awaitWritePersistence flag.
    • -
    • This can only be used if all data fits into the memory of the JavaScript process. This is normally not a problem because a browser has much memory these days and plain json document data is not that big.
    • -
    • Because it has to await an initial replication from the parent storage into the memory, initial page load time can increase when much data is already stored. This is likely not a problem when you store less than 10k documents.
    • -
    • The memory-synced storage itself does not support replication and migration. Instead you have to replicate the underlying parent storage.
    • -
    • The memory-synced plugin is part of RxDB Premium 👑. It is not part of the default RxDB module.
    • -
    -
    The memory-synced RxStorage was removed in RxDB version 16

    The memory-synced was removed in RxDB version 16. Instead consider using the newer and better memory-mapped RxStorage which has better trade-offs and is easier to configure.

    -

    Usage

    -
     
    -import {
    -    getRxStorageIndexedDB
    -} from 'rxdb-premium/plugins/storage-indexeddb';
    -import {
    -    getMemorySyncedRxStorage
    -} from 'rxdb-premium/plugins/storage-memory-synced';
    - 
    -/**
    - * Here we use the IndexedDB RxStorage as persistence storage.
    - * Any other RxStorage can also be used.
    - */
    -const parentStorage = getRxStorageIndexedDB();
    - 
    -// wrap the persistent storage with the memory synced one.
    -const storage = getMemorySyncedRxStorage({
    -    storage: parentStorage
    -});
    - 
    -// create the RxDatabase like you would do with any other RxStorage
    -const db = await createRxDatabase({
    -    name: 'myDatabase,
    -    storage,
    -});
    -/** ... **/
    - 
    -

    Options

    -

    Some options can be provided to fine tune the performance and behavior.

    -
     
    -import {
    -    requestIdlePromise
    -} from 'rxdb';
    - 
    -const storage = getMemorySyncedRxStorage({
    -    storage: parentStorage,
    - 
    -    /**
    -     * Defines how many document
    -     * get replicated in a single batch.
    -     * [default=50]
    -     * 
    -     * (optional)
    -     */
    -    batchSize: 50,
    - 
    -    /**
    -     * By default, the parent storage will be created without indexes for a faster page load.
    -     * Indexes are not needed because the queries will anyway run on the memory storage.
    -     * You can disable this behavior by setting keepIndexesOnParent to true.
    -     * If you use the same parent storage for multiple RxDatabase instances where one is not
    -     * a asynced-memory storage, you will get the error: 'schema not equal to existing storage'
    -     * if you do not set keepIndexesOnParent to true.
    -     * 
    -     * (optional)
    -     */
    -    keepIndexesOnParent: true,
    - 
    -    /**
    -     * If set to true, all write operations will resolve AFTER the writes
    -     * have been persisted from the memory to the parentStorage.
    -     * This ensures writes are not lost even if the JavaScript process exits
    -     * between memory writes and the persistence interval.
    -     * default=false
    -     */
    -    awaitWritePersistence: true,
    - 
    -    /**
    -     * After a write, await until the return value of this method resolves
    -     * before replicating with the master storage.
    -     * 
    -     * By returning requestIdlePromise() we can ensure that the CPU is idle
    -     * and no other, more important operation is running. By doing so we can be sure
    -     * that the replication does not slow down any rendering of the browser process.
    -     * 
    -     * (optional)
    -     */
    -    waitBeforePersist: () => requestIdlePromise();
    -});
    -

    Replication and Migration with the memory-synced storage

    -

    The memory-synced storage itself does not support replication and migration. Instead you have to replicate the underlying parent storage. -For example when you use it on top of an IndexedDB storage, you have to run replication on that storage instead by creating a different RxDatabase.

    -
    const parentStorage = getRxStorageIndexedDB();
    - 
    -const memorySyncedStorage = getMemorySyncedRxStorage({
    -    storage: parentStorage,
    -    keepIndexesOnParent: true
    -});
    - 
    -const databaseName = 'mydata';
    - 
    -/**
    - * Create a parent database with the same name+collections
    - * and use it for replication and migration.
    - * The parent database must be created BEFORE the memory-synced database
    - * to ensure migration has already been run.
    - */
    -const parentDatabase = await createRxDatabase({
    -    name: databaseName,
    -    storage: parentStorage
    -});
    -await parentDatabase.addCollections(/* ... */);
    - 
    -replicateRxCollection({
    -    collection: parentDatabase.myCollection,
    -    /* ... */
    -});
    - 
    - 
    -/**
    - * Create an equal memory-synced database with the same name+collections
    - * and use it for writes and queries.
    - */
    -const memoryDatabase = await createRxDatabase({
    -    name: databaseName,
    -    storage: memorySyncedStorage
    -});
    -await memoryDatabase.addCollections(/* ... */);
    - - \ No newline at end of file diff --git a/docs/rx-storage-memory-synced.md b/docs/rx-storage-memory-synced.md deleted file mode 100644 index 628a1a126b1..00000000000 --- a/docs/rx-storage-memory-synced.md +++ /dev/null @@ -1,158 +0,0 @@ -# Instant Performance with Memory Synced RxStorage - -> Accelerate RxDB with in-memory storage replicated to disk. Enjoy instant queries, faster loads, and unstoppable performance for your web apps. - -# Memory Synced RxStorage - -The memory synced [RxStorage](./rx-storage.md) is a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance is replicated with the underlying storage for persistence. -The main reason to use this is to improve initial page load and query/write times. This is mostly useful in browser based applications. - -## Pros - -- Improves read/write performance because these operations run against the in-memory storage. -- Decreases initial page load because it load all data in a single bulk request. It even detects if the database is used for the first time and then it does not have to await the creation of the persistent storage. - -## Cons - -- It does not support attachments. -- When the JavaScript process is killed ungracefully like when the browser crashes or the power of the PC is terminated, it might happen that some memory writes are not persisted to the parent storage. This can be prevented with the `awaitWritePersistence` flag. -- This can only be used if all data fits into the memory of the JavaScript process. This is normally not a problem because a browser has much memory these days and plain json document data is not that big. -- Because it has to await an initial replication from the parent storage into the memory, initial page load time can increase when much data is already stored. This is likely not a problem when you store less than `10k` documents. -- The memory-synced storage itself does not support replication and migration. Instead you have to replicate the underlying parent storage. -- The `memory-synced` plugin is part of [RxDB Premium 👑](/premium/). It is not part of the default RxDB module. - -:::note The memory-synced RxStorage was removed in RxDB version 16 - -The `memory-synced` was removed in RxDB version 16. Instead consider using the newer and better [memory-mapped RxStorage](./rx-storage-memory-mapped.md) which has better trade-offs and is easier to configure. -::: - -## Usage - -```ts - -import { - getRxStorageIndexedDB -} from 'rxdb-premium/plugins/storage-indexeddb'; -import { - getMemorySyncedRxStorage -} from 'rxdb-premium/plugins/storage-memory-synced'; - -/** - * Here we use the IndexedDB RxStorage as persistence storage. - * Any other RxStorage can also be used. - */ -const parentStorage = getRxStorageIndexedDB(); - -// wrap the persistent storage with the memory synced one. -const storage = getMemorySyncedRxStorage({ - storage: parentStorage -}); - -// create the RxDatabase like you would do with any other RxStorage -const db = await createRxDatabase({ - name: 'myDatabase, - storage, -}); -/** ... **/ - -``` - -## Options - -Some options can be provided to fine tune the performance and behavior. - -```ts - -import { - requestIdlePromise -} from 'rxdb'; - -const storage = getMemorySyncedRxStorage({ - storage: parentStorage, - - /** - * Defines how many document - * get replicated in a single batch. - * [default=50] - * - * (optional) - */ - batchSize: 50, - - /** - * By default, the parent storage will be created without indexes for a faster page load. - * Indexes are not needed because the queries will anyway run on the memory storage. - * You can disable this behavior by setting keepIndexesOnParent to true. - * If you use the same parent storage for multiple RxDatabase instances where one is not - * a asynced-memory storage, you will get the error: 'schema not equal to existing storage' - * if you do not set keepIndexesOnParent to true. - * - * (optional) - */ - keepIndexesOnParent: true, - - /** - * If set to true, all write operations will resolve AFTER the writes - * have been persisted from the memory to the parentStorage. - * This ensures writes are not lost even if the JavaScript process exits - * between memory writes and the persistence interval. - * default=false - */ - awaitWritePersistence: true, - - /** - * After a write, await until the return value of this method resolves - * before replicating with the master storage. - * - * By returning requestIdlePromise() we can ensure that the CPU is idle - * and no other, more important operation is running. By doing so we can be sure - * that the replication does not slow down any rendering of the browser process. - * - * (optional) - */ - waitBeforePersist: () => requestIdlePromise(); -}); -``` - -## Replication and Migration with the memory-synced storage - -The memory-synced storage itself does not support replication and migration. Instead you have to replicate the underlying parent storage. -For example when you use it on top of an [IndexedDB storage](./rx-storage-indexeddb.md), you have to run replication on that storage instead by creating a different [RxDatabase](./rx-database.md). - -```js -const parentStorage = getRxStorageIndexedDB(); - -const memorySyncedStorage = getMemorySyncedRxStorage({ - storage: parentStorage, - keepIndexesOnParent: true -}); - -const databaseName = 'mydata'; - -/** - * Create a parent database with the same name+collections - * and use it for replication and migration. - * The parent database must be created BEFORE the memory-synced database - * to ensure migration has already been run. - */ -const parentDatabase = await createRxDatabase({ - name: databaseName, - storage: parentStorage -}); -await parentDatabase.addCollections(/* ... */); - -replicateRxCollection({ - collection: parentDatabase.myCollection, - /* ... */ -}); - -/** - * Create an equal memory-synced database with the same name+collections - * and use it for writes and queries. - */ -const memoryDatabase = await createRxDatabase({ - name: databaseName, - storage: memorySyncedStorage -}); -await memoryDatabase.addCollections(/* ... */); -``` diff --git a/docs/rx-storage-memory.html b/docs/rx-storage-memory.html deleted file mode 100644 index 27afa9c23b3..00000000000 --- a/docs/rx-storage-memory.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - -Lightning-Fast Memory Storage for RxDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Memory RxStorage

    -

    The Memory RxStorage is based on plain in memory arrays and objects. It can be used in all environments and is made for performance. -Use this storage when you need a really fast database like in your unit tests or when you use RxDB with server side rendering.

    -

    Pros

    -
      -
    • Really fast. Uses binary search on all operations.
    • -
    • Small build size
    • -
    -

    Cons

    -
      -
    • No persistence
    • -
    -
    import {
    -    createRxDatabase
    -} from 'rxdb';
    -import {
    -    getRxStorageMemory
    -} from 'rxdb/plugins/storage-memory';
    - 
    -const db = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageMemory()
    -});
    - - \ No newline at end of file diff --git a/docs/rx-storage-memory.md b/docs/rx-storage-memory.md deleted file mode 100644 index 9999b02976c..00000000000 --- a/docs/rx-storage-memory.md +++ /dev/null @@ -1,40 +0,0 @@ -# Lightning-Fast Memory Storage for RxDB - -> Use Memory RxStorage for a high-performance, JavaScript in-memory database. Built for speed, making it perfect for unit tests and rapid prototyping. - -# Memory RxStorage - - - -The Memory `RxStorage` is based on plain in memory arrays and objects. It can be used in all environments and is made for performance. -Use this storage when you need a really fast database like in your unit tests or when you use RxDB with server side rendering. - -### Pros - -- Really fast. Uses binary search on all operations. -- Small build size - -### Cons - -- No persistence - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageMemory -} from 'rxdb/plugins/storage-memory'; - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageMemory() -}); -``` diff --git a/docs/rx-storage-mongodb.html b/docs/rx-storage-mongodb.html deleted file mode 100644 index d68a6f16d2a..00000000000 --- a/docs/rx-storage-mongodb.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - -Unlock MongoDB Power with RxDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    MongoDB RxStorage

    -

    RxDB MongoDB RxStorage is an RxDB RxStorage that allows you to use MongoDB as the underlying storage engine for your RxDB database. With this you can take advantage of MongoDB's features and scalability while benefiting from RxDB's real-time data synchronization capabilities.

    -

    MongoDB storage

    -

    The storage is made to work with any plain MongoDB Server, MongoDB Replica Set, Sharded MongoDB Cluster or Atlas Cloud Database.

    -

    Limitations of the MongoDB RxStorage

    -
      -
    • Multiple Node.js servers using the same MongoDB database is currently not supported
    • -
    • RxAttachments are currently not supported
    • -
    • Doing non-RxDB writes on the MongoDB database is not supported. RxDB expects all writes to come from RxDB which update the required metadata. Doing non-RxDB writes can confuse the RxDatabase and lead to undefined behavior. But you can perform read-queries on the MongoDB storage from the outside at any time.
    • -
    -

    Using the MongoDB RxStorage

    -
    1

    Install the mongodb package

    npm install mongodb --save
    2

    Setups the MongoDB RxStorage

    To use the storage, you simply import the getRxStorageMongoDB method and use that when creating the RxDatabase. The connection parameter contains the MongoDB connection string.

    import {
    -    createRxDatabase
    -} from 'rxdb';
    -import {
    -    getRxStorageMongoDB
    -} from 'rxdb/plugins/storage-mongodb';
    - 
    -const myRxDatabase = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageMongoDB({
    -        /**
    -         * MongoDB connection string
    -         * @link https://www.mongodb.com/docs/manual/reference/connection-string/
    -         */
    -        connection: 'mongodb://localhost:27017,localhost:27018,localhost:27019'
    -    })
    -});
    - - \ No newline at end of file diff --git a/docs/rx-storage-mongodb.md b/docs/rx-storage-mongodb.md deleted file mode 100644 index c5da0f10102..00000000000 --- a/docs/rx-storage-mongodb.md +++ /dev/null @@ -1,54 +0,0 @@ -# Unlock MongoDB Power with RxDB - -> Combine RxDB's real-time sync with MongoDB's scalability. Harness the MongoDB RxStorage to seamlessly expand your database capabilities. - -import {Steps} from '@site/src/components/steps'; - -# MongoDB RxStorage - -RxDB MongoDB RxStorage is an RxDB [RxStorage](./rx-storage.md) that allows you to use [MongoDB](https://www.mongodb.com/) as the underlying storage engine for your RxDB database. With this you can take advantage of MongoDB's features and scalability while benefiting from RxDB's real-time data synchronization capabilities. - - - -The storage is made to work with any plain MongoDB Server, [MongoDB Replica Set](https://www.mongodb.com/docs/manual/tutorial/deploy-replica-set/), [Sharded MongoDB Cluster](https://www.mongodb.com/docs/manual/sharding/) or [Atlas Cloud Database](https://www.mongodb.com/atlas/database). - -## Limitations of the MongoDB RxStorage -- Multiple Node.js servers using the same MongoDB database is currently not supported -- [RxAttachments](./rx-attachment.md) are currently not supported -- Doing non-RxDB writes on the MongoDB database is not supported. RxDB expects all writes to come from RxDB which update the required metadata. Doing non-RxDB writes can confuse the RxDatabase and lead to undefined behavior. But you can perform read-queries on the MongoDB storage from the outside at any time. - -## Using the MongoDB RxStorage - - - -### Install the mongodb package - -```bash -npm install mongodb --save -``` - -### Setups the MongoDB RxStorage - -To use the storage, you simply import the `getRxStorageMongoDB` method and use that when creating the [RxDatabase](./rx-database.md). The `connection` parameter contains the [MongoDB connection string](https://www.mongodb.com/docs/manual/reference/connection-string/). - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageMongoDB -} from 'rxdb/plugins/storage-mongodb'; - -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageMongoDB({ - /** - * MongoDB connection string - * @link https://www.mongodb.com/docs/manual/reference/connection-string/ - */ - connection: 'mongodb://localhost:27017,localhost:27018,localhost:27019' - }) -}); -``` - - diff --git a/docs/rx-storage-opfs.html b/docs/rx-storage-opfs.html deleted file mode 100644 index 8ad9e63f7a4..00000000000 --- a/docs/rx-storage-opfs.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - -Supercharged OPFS Database with RxDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage

    -

    With the RxDB OPFS storage you can build a fully featured database on top of the Origin Private File System (OPFS) browser API. Compared to other storage solutions, it has a way better performance.

    -

    What is OPFS

    -

    The Origin Private File System (OPFS) is a native browser storage API that allows web applications to manage files in a private, sandboxed, origin-specific virtual filesystem. Unlike IndexedDB and LocalStorage, which are optimized as object/key-value storage, OPFS provides more granular control for file operations, enabling byte-by-byte access, file streaming, and even low-level manipulations. -OPFS is ideal for applications requiring high-performance file operations (3x-4x faster compared to IndexedDB) inside of a client-side application, offering advantages like improved speed, more efficient use of resources, and enhanced security and privacy features.

    -

    OPFS limitations

    -

    From the beginning of 2023, the Origin Private File System API is supported by all modern browsers like Safari, Chrome, Edge and Firefox. Only Internet Explorer is not supported and likely will never get support.

    -

    It is important to know that the most performant synchronous methods like read() and write() of the OPFS API are only available inside of a WebWorker. -They cannot be used in the main thread, an iFrame or even a SharedWorker. -The OPFS createSyncAccessHandle() method that gives you access to the synchronous methods is not exposed in the main thread, only in a Worker.

    -

    While there is no concrete data size limit defined by the API, browsers will refuse to store more data at some point. -If no more data can be written, a QuotaExceededError is thrown which should be handled by the application, like showing an error message to the user.

    -

    How the OPFS API works

    -

    The OPFS API is pretty straightforward to use. First you get the root filesystem. Then you can create files and directories on that. Notice that whenever you synchronously write to, or read from a file, an ArrayBuffer must be used that contains the data. It is not possible to synchronously write plain strings or objects into the file. Therefore the TextEncoder and TextDecoder API must be used.

    -

    Also notice that some of the methods of FileSystemSyncAccessHandle have been asynchronous in the past, but are synchronous since Chromium 108. To make it less confusing, we just use await in front of them, so it will work in both cases.

    -
    // Access the root directory of the origin's private file system.
    -const root = await navigator.storage.getDirectory();
    - 
    -// Create a subdirectory.
    -const diaryDirectory = await root.getDirectoryHandle('subfolder', {
    -  create: true,
    -});
    - 
    -// Create a new file named 'example.txt'.
    -const fileHandle = await diaryDirectory.getFileHandle('example.txt', {
    -  create: true,
    -});
    - 
    -// Create a FileSystemSyncAccessHandle on the file.
    -const accessHandle = await fileHandle.createSyncAccessHandle();
    - 
    -// Write a sentence to the file.
    -let writeBuffer = new TextEncoder().encode('Hello from RxDB');
    -const writeSize = accessHandle.write(writeBuffer);
    - 
    -// Read file and transform data to string.
    -const readBuffer = new Uint8Array(writeSize);
    -const readSize = accessHandle.read(readBuffer, { at: 0 });
    -const contentAsString = new TextDecoder().decode(readBuffer);
    - 
    -// Write an exclamation mark to the end of the file.
    -writeBuffer = new TextEncoder().encode('!');
    -accessHandle.write(writeBuffer, { at: readSize });
    - 
    -// Truncate file to 10 bytes.
    -await accessHandle.truncate(10);
    - 
    -// Get the new size of the file.
    -const fileSize = await accessHandle.getSize();
    - 
    -// Persist changes to disk.
    -await accessHandle.flush();
    - 
    -// Always close FileSystemSyncAccessHandle if done, so others can open the file again.
    -await accessHandle.close();
    -

    A more detailed description of the OPFS API can be found on MDN.

    -

    OPFS performance

    -

    Because the Origin Private File System API provides low-level access to binary files, it is much faster compared to IndexedDB or localStorage. According to the storage performance test, OPFS is up to 2x times faster on plain inserts when a new file is created on each write. Reads are even faster.

    -

    A good comparison about real world scenarios, are the performance results of the various RxDB storages. Here it shows that reads are up to 4x faster compared to IndexedDB, even with complex queries:

    -

    RxStorage performance - browser

    -

    Using OPFS as RxStorage in RxDB

    -

    The OPFS RxStorage itself must run inside a WebWorker. Therefore we use the Worker RxStorage and let it point to the prebuild opfs.worker.js file that comes shipped with RxDB Premium 👑.

    -

    Notice that the OPFS RxStorage is part of the RxDB Premium 👑 plugin that must be purchased.

    -
    import {
    -    createRxDatabase
    -} from 'rxdb';
    -import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker';
    - 
    -const database = await createRxDatabase({
    -    name: 'mydatabase',
    -    storage: getRxStorageWorker(
    -        {
    -            /**
    -             * This file must be statically served from a webserver.
    -             * You might want to first copy it somewhere outside of
    -             * your node_modules folder.
    -             */
    -            workerInput: 'node_modules/rxdb-premium/dist/workers/opfs.worker.js'
    -        }
    -    )
    -});
    -

    Using OPFS in the main thread instead of a worker

    -

    The createSyncAccessHandle method from the Filesystem API is only available inside of a Webworker. Therefore you cannot use getRxStorageOPFS() in the main thread. But there is a slightly slower way to access the virtual filesystem from the main thread. RxDB support the getRxStorageOPFSMainThread() for that. Notice that this uses the createWritable function which is not supported in safari.

    -

    Using OPFS from the main thread can have benefits because not having to cross the worker bridge can reduce latence in reads and writes.

    -
    import { createRxDatabase } from 'rxdb';
    -import { getRxStorageOPFSMainThread } from 'rxdb-premium/plugins/storage-opfs';
    - 
    -const database = await createRxDatabase({
    -    name: 'mydatabase',
    -    storage: getRxStorageOPFSMainThread()
    -});
    -

    Building a custom worker.js

    -

    When you want to run additional plugins like storage wrappers or replication inside of the worker, you have to build your own worker.js file. You can do that similar to other workers by calling exposeWorkerRxStorage like described in the worker storage plugin.

    -
    // inside of the worker.js file
    -import { getRxStorageOPFS } from 'rxdb-premium/plugins/storage-opfs';
    -import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker';
    - 
    -const storage = getRxStorageOPFS();
    -exposeWorkerRxStorage({
    -    storage
    -});
    -

    Setting usesRxDatabaseInWorker when a RxDatabase is also used inside of the worker

    -

    When you use the OPFS inside of a worker, it will internally use strings to represent operation results. This has the benefit that transferring strings from the worker to the main thread, is way faster compared to complex json objects. The getRxStorageWorker() will automatically decode these strings on the main thread so that the data can be used by the RxDatabase.

    -

    But using a RxDatabase inside of your worker can make sense for example when you want to move the replication with a server. To enable this, you have to set usesRxDatabaseInWorker to true:

    -
    // inside of the worker.js file
    -import { getRxStorageOPFS } from 'rxdb-premium/plugins/storage-opfs';
    -const storage = getRxStorageOPFS({
    -  usesRxDatabaseInWorker: true
    -});
    -

    If you forget to set this and still create and use a RxDatabase inside of the worker, you might get the error messageorUncaught (in promise) TypeError: Cannot read properties of undefined (reading 'length')`.

    -

    OPFS in Electron, React-Native or Capacitor.js

    -

    Origin Private File System is a browser API that is only accessible in browsers. Other JavaScript like React-Native or Node.js, do not support it.

    -

    Electron has two JavaScript contexts: the browser (chromium) context and the Node.js context. While you could use the OPFS API in the browser context, it is not recommended. Instead you should use the Filesystem API of Node.js and then only transfer the relevant data with the ipcRenderer. With RxDB that is pretty easy to configure:

    -
      -
    • In the main.js, expose the Node Filesystem storage with the exposeIpcMainRxStorage() that comes with the electron plugin
    • -
    • In the browser context, access the main storage with the getRxStorageIpcRenderer() method.
    • -
    -

    React Native (and Expo) does not have an OPFS API. You could use the ReactNative Filesystem to directly write data. But to get a fully featured database like RxDB it is easier to use the SQLite RxStorage which starts an SQLite database inside of the ReactNative app and uses that to do the database operations.

    -

    Capacitor.js is able to access the OPFS API.

    -

    Difference between File System Access API and Origin Private File System (OPFS)

    -

    Often developers are confused with the differences between the File System Access API and the Origin Private File System (OPFS).

    -
      -
    • The File System Access API provides access to the files on the device file system, like the ones shown in the file explorer of the operating system. To use the File System API, the user has to actively select the files from a filepicker.
    • -
    • Origin Private File System (OPFS) is a sub-part of the File System Standard and it only describes the things you can do with the filesystem root from navigator.storage.getDirectory(). OPFS writes to a sandboxed filesystem, not visible to the user. Therefore the user does not have to actively select or allow the data access.
    • -
    -

    Learn more about OPFS:

    -
    - - \ No newline at end of file diff --git a/docs/rx-storage-opfs.md b/docs/rx-storage-opfs.md deleted file mode 100644 index cc06f54ab0d..00000000000 --- a/docs/rx-storage-opfs.md +++ /dev/null @@ -1,181 +0,0 @@ -# Supercharged OPFS Database with RxDB - -> Discover how to harness the Origin Private File System with RxDB's OPFS RxStorage for unrivaled performance and security in client-side data storage. - -# Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage - -With the [RxDB](https://rxdb.info/) OPFS storage you can build a fully featured database on top of the [Origin Private File System](https://web.dev/opfs) (OPFS) browser API. Compared to other storage solutions, it has a way better performance. - -## What is OPFS - -The **Origin Private File System (OPFS)** is a native browser storage API that allows web applications to manage files in a private, sandboxed, **origin-specific virtual filesystem**. Unlike [IndexedDB](./rx-storage-indexeddb.md) and [LocalStorage](./articles/localstorage.md), which are optimized as object/key-value storage, OPFS provides more granular control for file operations, enabling byte-by-byte access, file streaming, and even low-level manipulations. -OPFS is ideal for applications requiring **high-performance** file operations (**3x-4x faster compared to IndexedDB**) inside of a client-side application, offering advantages like improved speed, more efficient use of resources, and enhanced security and privacy features. - -### OPFS limitations - -From the beginning of 2023, the Origin Private File System API is supported by [all modern browsers](https://caniuse.com/native-filesystem-api) like Safari, Chrome, Edge and Firefox. Only Internet Explorer is not supported and likely will never get support. - -It is important to know that the most performant synchronous methods like [`read()`](https://developer.mozilla.org/en-US/docs/Web/API/FileSystemSyncAccessHandle/read) and [`write()`](https://developer.mozilla.org/en-US/docs/Web/API/FileSystemSyncAccessHandle/write) of the OPFS API are **only available inside of a [WebWorker](./rx-storage-worker.md)**. -They cannot be used in the main thread, an iFrame or even a [SharedWorker](./rx-storage-shared-worker.md). -The OPFS [`createSyncAccessHandle()`](https://developer.mozilla.org/en-US/docs/Web/API/FileSystemFileHandle/createSyncAccessHandle) method that gives you access to the synchronous methods is not exposed in the main thread, only in a Worker. - -While there is no concrete **data size limit** defined by the API, browsers will refuse to store more [data at some point](./articles/indexeddb-max-storage-limit.md). -If no more data can be written, a `QuotaExceededError` is thrown which should be handled by the application, like showing an error message to the user. - -## How the OPFS API works - -The OPFS API is pretty straightforward to use. First you get the root filesystem. Then you can create files and directories on that. Notice that whenever you _synchronously_ write to, or read from a file, an `ArrayBuffer` must be used that contains the data. It is not possible to synchronously write plain strings or objects into the file. Therefore the `TextEncoder` and `TextDecoder` API must be used. - -Also notice that some of the methods of `FileSystemSyncAccessHandle` [have been asynchronous](https://developer.chrome.com/blog/sync-methods-for-accesshandles) in the past, but are synchronous since Chromium 108. To make it less confusing, we just use `await` in front of them, so it will work in both cases. - -```ts -// Access the root directory of the origin's private file system. -const root = await navigator.storage.getDirectory(); - -// Create a subdirectory. -const diaryDirectory = await root.getDirectoryHandle('subfolder', { - create: true, -}); - -// Create a new file named 'example.txt'. -const fileHandle = await diaryDirectory.getFileHandle('example.txt', { - create: true, -}); - -// Create a FileSystemSyncAccessHandle on the file. -const accessHandle = await fileHandle.createSyncAccessHandle(); - -// Write a sentence to the file. -let writeBuffer = new TextEncoder().encode('Hello from RxDB'); -const writeSize = accessHandle.write(writeBuffer); - -// Read file and transform data to string. -const readBuffer = new Uint8Array(writeSize); -const readSize = accessHandle.read(readBuffer, { at: 0 }); -const contentAsString = new TextDecoder().decode(readBuffer); - -// Write an exclamation mark to the end of the file. -writeBuffer = new TextEncoder().encode('!'); -accessHandle.write(writeBuffer, { at: readSize }); - -// Truncate file to 10 bytes. -await accessHandle.truncate(10); - -// Get the new size of the file. -const fileSize = await accessHandle.getSize(); - -// Persist changes to disk. -await accessHandle.flush(); - -// Always close FileSystemSyncAccessHandle if done, so others can open the file again. -await accessHandle.close(); -``` - -A more detailed description of the OPFS API can be found [on MDN](https://developer.mozilla.org/en-US/docs/Web/API/File_System_API/Origin_private_file_system). - -## OPFS performance - -Because the Origin Private File System API provides low-level access to binary files, it is much faster compared to [IndexedDB](./slow-indexeddb.md) or [localStorage](./articles/localstorage.md). According to the [storage performance test](https://pubkey.github.io/client-side-databases/database-comparison/index.html), OPFS is up to 2x times faster on plain inserts when a new file is created on each write. Reads are even faster. - -A good comparison about real world scenarios, are the [performance results](./rx-storage-performance.md) of the various RxDB storages. Here it shows that reads are up to 4x faster compared to IndexedDB, even with complex queries: - - - -## Using OPFS as RxStorage in RxDB - -The OPFS [RxStorage](./rx-storage.md) itself must run inside a WebWorker. Therefore we use the [Worker RxStorage](./rx-storage-worker.md) and let it point to the prebuild `opfs.worker.js` file that comes shipped with RxDB Premium 👑. - -Notice that the OPFS RxStorage is part of the [RxDB Premium 👑](/premium/) plugin that must be purchased. - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker'; - -const database = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageWorker( - { - /** - * This file must be statically served from a webserver. - * You might want to first copy it somewhere outside of - * your node_modules folder. - */ - workerInput: 'node_modules/rxdb-premium/dist/workers/opfs.worker.js' - } - ) -}); -``` - -## Using OPFS in the main thread instead of a worker - -The `createSyncAccessHandle` method from the Filesystem API is only available inside of a Webworker. Therefore you cannot use `getRxStorageOPFS()` in the main thread. But there is a slightly slower way to access the virtual filesystem from the main thread. RxDB support the `getRxStorageOPFSMainThread()` for that. Notice that this uses the [createWritable](https://developer.mozilla.org/en-US/docs/Web/API/FileSystemFileHandle/createWritable) function which is not supported in safari. - -Using OPFS from the main thread can have benefits because not having to cross the worker bridge can reduce latence in reads and writes. - -```ts -import { createRxDatabase } from 'rxdb'; -import { getRxStorageOPFSMainThread } from 'rxdb-premium/plugins/storage-opfs'; - -const database = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageOPFSMainThread() -}); -``` - -## Building a custom `worker.js` - -When you want to run additional plugins like storage wrappers or replication **inside** of the worker, you have to build your own `worker.js` file. You can do that similar to other workers by calling `exposeWorkerRxStorage` like described in the [worker storage plugin](./rx-storage-worker.md). - -```ts -// inside of the worker.js file -import { getRxStorageOPFS } from 'rxdb-premium/plugins/storage-opfs'; -import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; - -const storage = getRxStorageOPFS(); -exposeWorkerRxStorage({ - storage -}); -``` - -## Setting `usesRxDatabaseInWorker` when a RxDatabase is also used inside of the worker - -When you use the OPFS inside of a worker, it will internally use strings to represent operation results. This has the benefit that transferring strings from the worker to the main thread, is way faster compared to complex json objects. The `getRxStorageWorker()` will automatically decode these strings on the main thread so that the data can be used by the RxDatabase. - -But using a RxDatabase **inside** of your worker can make sense for example when you want to move the [replication](./replication.md) with a server. To enable this, you have to set `usesRxDatabaseInWorker` to `true`: - -```ts -// inside of the worker.js file -import { getRxStorageOPFS } from 'rxdb-premium/plugins/storage-opfs'; -const storage = getRxStorageOPFS({ - usesRxDatabaseInWorker: true -}); -``` - -If you forget to set this and still create and use a [RxDatabase](./rx-database.md) inside of the worker, you might get the error message` or `Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'length')`. - -## OPFS in Electron, React-Native or Capacitor.js - -Origin Private File System is a browser API that is only accessible in browsers. Other JavaScript like React-Native or Node.js, do not support it. - -**Electron** has two JavaScript contexts: the browser (chromium) context and the Node.js context. While you could use the OPFS API in the browser context, it is not recommended. Instead you should use the Filesystem API of Node.js and then only transfer the relevant data with the [ipcRenderer](https://www.electronjs.org/de/docs/latest/api/ipc-renderer). With RxDB that is pretty easy to configure: -- In the `main.js`, expose the [Node Filesystem](./rx-storage-filesystem-node.md) storage with the `exposeIpcMainRxStorage()` that comes with the [electron plugin](./electron.md) -- In the browser context, access the main storage with the `getRxStorageIpcRenderer()` method. - -**React Native** (and Expo) does not have an OPFS API. You could use the ReactNative Filesystem to directly write data. But to get a fully featured database like RxDB it is easier to use the [SQLite RxStorage](./rx-storage-sqlite.md) which starts an SQLite database inside of the ReactNative app and uses that to do the database operations. - -**Capacitor.js** is able to access the OPFS API. - -## Difference between `File System Access API` and `Origin Private File System (OPFS)` - -Often developers are confused with the differences between the `File System Access API` and the `Origin Private File System (OPFS)`. - -- The `File System Access API` provides access to the files on the device file system, like the ones shown in the file explorer of the operating system. To use the File System API, the user has to actively select the files from a filepicker. -- `Origin Private File System (OPFS)` is a sub-part of the `File System Standard` and it only describes the things you can do with the filesystem root from `navigator.storage.getDirectory()`. OPFS writes to a **sandboxed** filesystem, not visible to the user. Therefore the user does not have to actively select or allow the data access. - -## Learn more about OPFS: - -- [WebKit: The File System API with Origin Private File System](https://webkit.org/blog/12257/the-file-system-access-api-with-origin-private-file-system/) -- [Browser Support](https://caniuse.com/native-filesystem-api) -- [Performance Test Tool](https://pubkey.github.io/client-side-databases/database-comparison/index.html) diff --git a/docs/rx-storage-performance.html b/docs/rx-storage-performance.html deleted file mode 100644 index 5d1dd410a81..00000000000 --- a/docs/rx-storage-performance.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - -📈 Discover RxDB Storage Benchmarks | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    📈 Discover RxDB Storage Benchmarks

    RxStorage Performance comparison

    -

    A big difference in the RxStorage implementations is the performance. In difference to a server side database, RxDB is bound to the limits of the JavaScript runtime and depending on the runtime, there are different possibilities to store and fetch data. For example in the browser it is only possible to store data in a slow IndexedDB or OPFS instead of a filesystem while on React-Native you can use the SQLite storage.

    -

    Therefore the performance can be completely different depending on where you use RxDB and what you do with it. Here you can see some performance measurements and descriptions on how the different storages work and how their performance is different.

    -

    Persistent vs Semi-Persistent storages

    -

    The "normal" storages are always persistent. This means each RxDB write is directly written to disc and all queries run on the disc state. This means a good startup performance because nothing has to be done on startup.

    -

    In contrast, semi-persistent storages like memory mapped store all data in memory on startup and only save to disc occasionally (or on exit). Therefore it has a very fast read/write performance, but loading all data into memory on the first page load can take longer for big amounts of documents. Also these storages can only be used when all data fits into the memory at least once. In general it is recommended to stay on the persistent storages and only use semi-persistent ones, when you know for sure that the dataset will stay small (less than 2k documents).

    -

    Performance comparison

    -

    In the following you can find some performance measurements and comparisons. Notice that these are only a small set of possible RxDB operations. If performance is really relevant for your use case, you should do your own measurements with usage-patterns that are equal to how you use RxDB in production.

    -

    Measurements

    -

    Here the following metrics are measured:

    -
      -
    • time-to-first-insert: Many storages run lazy, so it makes no sense to compare the time which is required to create a database with collections. Instead we measure the time-to-first-insert which is the whole timespan from database creation until the first single document write is done.
    • -
    • insert documents (bulk): Insert 500 documents with a single bulk-insert operation.
    • -
    • find documents by id (bulk): Here we fetch 100% of the stored documents with a single findByIds() call.
    • -
    • insert documents (serial): Insert 50 documents, one after each other.
    • -
    • find documents by id (serial): Here we find 50 documents in serial with one findByIds() call per document.
    • -
    • find documents by query: Here we fetch 100% of the stored documents with a single find() call.
    • -
    • find documents by query: Here we fetch all of the stored documents with a 4 find() calls that run in parallel. Each fetching 25% of the documents.
    • -
    • count documents: Counts 100% of the stored documents with a single count() call. Here we measure 4 runs at once to have a higher number that is easier to compare.
    • -
    -

    Browser based Storages Performance Comparison

    -

    The performance patterns of the browser based storages are very diverse. The IndexedDB storage is recommended for mostly all use cases so you should start with that one. Later you can do performance testings and switch to another storage like OPFS or memory-mapped.

    -

    RxStorage performance - browser

    -

    Node/Native based Storages Performance Comparison

    -

    For most client-side native applications (react-native, electron, capacitor), using the SQLite RxStorage is recommended. For non-client side applications like a server, use the MongoDB storage instead.

    -

    RxStorage performance - Node.js

    - - \ No newline at end of file diff --git a/docs/rx-storage-performance.md b/docs/rx-storage-performance.md deleted file mode 100644 index 53ddfd44516..00000000000 --- a/docs/rx-storage-performance.md +++ /dev/null @@ -1,42 +0,0 @@ -# 📈 Discover RxDB Storage Benchmarks - -> Explore real-world benchmarks comparing RxDB's persistent and semi-persistent storages. Discover which storage option delivers the fastest performance. - -## RxStorage Performance comparison - -A big difference in the RxStorage implementations is the **performance**. In difference to a server side database, RxDB is bound to the limits of the JavaScript runtime and depending on the runtime, there are different possibilities to store and fetch data. For example in the browser it is only possible to store data in a [slow IndexedDB](./slow-indexeddb.md) or OPFS instead of a filesystem while on React-Native you can use the [SQLite storage](./rx-storage-sqlite.md). - -Therefore the performance can be completely different depending on where you use RxDB and what you do with it. Here you can see some performance measurements and descriptions on how the different [storages](./rx-storage.md) work and how their performance is different. - -## Persistent vs Semi-Persistent storages - -The "normal" storages are always persistent. This means each RxDB write is directly written to disc and all queries run on the disc state. This means a good startup performance because nothing has to be done on startup. - -In contrast, semi-persistent storages like [memory mapped](./rx-storage-memory-mapped.md) store all data in memory on startup and only save to disc occasionally (or on exit). Therefore it has a very fast read/write performance, but loading all data into memory on the first page load can take longer for big amounts of documents. Also these storages can only be used when all data fits into the memory at least once. In general it is recommended to stay on the persistent storages and only use semi-persistent ones, when you know for sure that the dataset will stay small (less than 2k documents). - -## Performance comparison - -In the following you can find some performance measurements and comparisons. Notice that these are only a small set of possible RxDB operations. If performance is really relevant for your use case, you should do your own measurements with usage-patterns that are equal to how you use RxDB in production. - -### Measurements - -Here the following metrics are measured: - -- time-to-first-insert: Many storages run lazy, so it makes no sense to compare the time which is required to create a database with collections. Instead we measure the **time-to-first-insert** which is the whole timespan from database creation until the first single document write is done. -- insert documents (bulk): Insert 500 documents with a single bulk-insert operation. -- find documents by id (bulk): Here we fetch 100% of the stored documents with a single `findByIds()` call. -- insert documents (serial): Insert 50 documents, one after each other. -- find documents by id (serial): Here we find 50 documents in serial with one `findByIds()` call per document. -- find documents by query: Here we fetch 100% of the stored documents with a single `find()` call. -- find documents by query: Here we fetch all of the stored documents with a 4 `find()` calls that run in parallel. Each fetching 25% of the documents. -- count documents: Counts 100% of the stored documents with a single `count()` call. Here we measure 4 runs at once to have a higher number that is easier to compare. - -## Browser based Storages Performance Comparison - -The performance patterns of the browser based storages are very diverse. The [IndexedDB storage](./rx-storage-indexeddb.md) is recommended for mostly all use cases so you should start with that one. Later you can do performance testings and switch to another storage like [OPFS](./rx-storage-opfs.md) or [memory-mapped](./rx-storage-memory-mapped.md). - - - -## Node/Native based Storages Performance Comparison - -For most client-side native applications ([react-native](./react-native-database.md), [electron](./electron-database.md), [capacitor](./capacitor-database.md)), using the [SQLite RxStorage](./rx-storage-sqlite.md) is recommended. For non-client side applications like a server, use the [MongoDB storage](./rx-storage-mongodb.md) instead. diff --git a/docs/rx-storage-pouchdb.html b/docs/rx-storage-pouchdb.html deleted file mode 100644 index 0e340a1b0ce..00000000000 --- a/docs/rx-storage-pouchdb.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - -PouchDB RxStorage - Migrate for Better Performance | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxStorage PouchDB

    -

    The PouchDB RxStorage is based on the PouchDB database. It is the most battle proven RxStorage and has a big ecosystem of adapters. PouchDB does a lot of overhead to enable CouchDB replication which makes the PouchDB RxStorage one of the slowest.

    -
    warning

    The PouchDB RxStorage is removed from RxDB and can no longer be used in new projects. You should switch to a different RxStorage.

    -

    Why is the PouchDB RxStorage deprecated?

    -

    When I started developing RxDB in 2016, I had a specific use case to solve. -Because there was no client-side database out there that fitted, I created -RxDB as a wrapper around PouchDB. This worked great and all the PouchDB features -like the query engine, the adapter system, CouchDB-replication and so on, came for free. -But over the years, it became clear that PouchDB is not suitable for many applications, -mostly because of its performance: To be compliant to CouchDB, PouchDB has to store all -revision trees of documents which slows down queries. Also purging these document revisions is not possible -so the database storage size will only increase over time. -Another problem was that many issues in PouchDB have never been fixed, but only closed by the issue-bot like this one. The whole PouchDB RxStorage code was full of workarounds and monkey patches to resolve -these issues for RxDB users. Many these patches decreased performance even further. Sometimes it was not possible to fix things from the outside, for example queries with $gt operators return the wrong documents which is a no-go for a production database -and hard to debug.

    -

    In version 10.0.0 RxDB introduced the RxStorage layer which -allows users to swap out the underlying storage engine where RxDB stores and queries documents from. -This allowed to use alternatives from PouchDB, for example the IndexedDB RxStorage in browsers -or even the FoundationDB RxStorage on the server side. -There where not many use cases left where it was a good choice to use the PouchDB RxStorage. Only replicating with a -CouchDB server, was only possible with PouchDB. But this has also changed. RxDB has a plugin that allows -to replicate clients with any CouchDB server by using the RxDB Sync Engine. This plugins work with any RxStorage so that it is not necessary to use the PouchDB storage. -Removing PouchDB allows RxDB to add many awaited features like filtered change streams for easier replication and permission handling. It will also free up development time.

    -

    If you are currently using the PouchDB RxStorage, you have these options:

    -
      -
    • Migrate to another RxStorage (recommended)
    • -
    • Never update RxDB to the next major version (stay on older 14.0.0)
    • -
    • Fork the PouchDB RxStorage and maintain the plugin by yourself.
    • -
    • Fix all the PouchDB problems so that we can add PouchDB to the RxDB Core again.
    • -
    -

    Pros

    -
      -
    • Most battle proven RxStorage
    • -
    • Supports replication with a CouchDB endpoint
    • -
    • Support storing attachments
    • -
    • Big ecosystem of adapters
    • -
    -

    Cons

    -
      -
    • Big bundle size
    • -
    • Slow performance because of revision handling overhead
    • -
    -

    Usage

    -
    import { createRxDatabase } from 'rxdb';
    -import { getRxStoragePouch, addPouchPlugin } from 'rxdb/plugins/pouchdb';
    - 
    -addPouchPlugin(require('pouchdb-adapter-idb'));
    - 
    -const db = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStoragePouch(
    -        'idb',
    -        {
    -            /**
    -             * other pouchdb specific options
    -             * @link https://pouchdb.com/api.html#create_database
    -             */
    -        }
    -    )
    -});
    -

    Polyfill the global variable

    -

    When you use RxDB with angular or other webpack based frameworks, you might get the error:

    -
    <span style="color: red;">Uncaught ReferenceError: global is not defined</span>
    -

    This is because pouchdb assumes a nodejs-specific global variable that is not added to browser runtimes by some bundlers. -You have to add them by your own, like we do here.

    -
    (window as any).global = window;
    -(window as any).process = {
    -    env: { DEBUG: undefined },
    -};
    -

    Adapters

    -

    PouchDB has many adapters for all JavaScript runtimes.

    -

    Using the internal PouchDB Database

    -

    For custom operations, you can access the internal PouchDB database. -This is dangerous because you might do changes that are not compatible with RxDB. -Only use this when there is no way to achieve your goals via the RxDB API.

    -
    import {
    -    getPouchDBOfRxCollection
    -} from 'rxdb/plugins/pouchdb';
    - 
    -const pouch = getPouchDBOfRxCollection(myRxCollection);
    - - \ No newline at end of file diff --git a/docs/rx-storage-pouchdb.md b/docs/rx-storage-pouchdb.md deleted file mode 100644 index 647a56278fc..00000000000 --- a/docs/rx-storage-pouchdb.md +++ /dev/null @@ -1,106 +0,0 @@ -# PouchDB RxStorage - Migrate for Better Performance - -> Discover why PouchDB RxStorage is deprecated in RxDB. Learn its legacy, performance drawbacks, and how to upgrade to a faster solution. - -# RxStorage PouchDB - -The PouchDB RxStorage is based on the [PouchDB](https://github.com/pouchdb/pouchdb) database. It is the most battle proven RxStorage and has a big ecosystem of adapters. PouchDB does a lot of overhead to enable CouchDB replication which makes the PouchDB RxStorage one of the slowest. - -:::warning -The PouchDB RxStorage is removed from RxDB and can no longer be used in new projects. You should switch to a different [RxStorage](./rx-storage.md). -::: - -## Why is the PouchDB RxStorage deprecated? -When I started developing RxDB in 2016, I had a specific use case to solve. -Because there was no client-side database out there that fitted, I created -RxDB as a wrapper around PouchDB. This worked great and all the PouchDB features -like the query engine, the adapter system, CouchDB-replication and so on, came for free. -But over the years, it became clear that PouchDB is not suitable for many applications, -mostly because of its performance: To be compliant to CouchDB, PouchDB has to store all -revision trees of documents which slows down queries. Also purging these document revisions [is not possible](https://github.com/pouchdb/pouchdb/issues/802) -so the database storage size will only increase over time. -Another problem was that many issues in PouchDB have never been fixed, but only closed by the issue-bot like [this one](https://github.com/pouchdb/pouchdb/issues/6454). The whole PouchDB RxStorage code was full of [workarounds and monkey patches](https://github.com/pubkey/rxdb/blob/285c3cf6008b3cc83bd9b9946118a621434f0cff/src/plugins/pouchdb/pouch-statics.ts#L181) to resolve -these issues for RxDB users. Many these patches decreased performance even further. Sometimes it was not possible to fix things from the outside, for example queries with `$gt` operators return [the wrong documents](https://github.com/pouchdb/pouchdb/pull/8471) which is a no-go for a production database -and hard to debug. - -In version [10.0.0](./releases/10.0.0.md) RxDB introduced the [RxStorage](./rx-storage.md) layer which -allows users to swap out the underlying storage engine where RxDB stores and queries documents from. -This allowed to use alternatives from PouchDB, for example the [IndexedDB RxStorage](./rx-storage-indexeddb.md) in browsers -or even the [FoundationDB RxStorage](./rx-storage-foundationdb.md) on the server side. -There where not many use cases left where it was a good choice to use the PouchDB RxStorage. Only replicating with a -CouchDB server, was only possible with PouchDB. But this has also changed. RxDB has [a plugin](./replication-couchdb.md) that allows -to replicate clients with any CouchDB server by using the [RxDB Sync Engine](./replication.md). This plugins work with any RxStorage so that it is not necessary to use the PouchDB storage. -Removing PouchDB allows RxDB to add many awaited features like filtered change streams for easier replication and permission handling. It will also free up development time. - -If you are currently using the PouchDB RxStorage, you have these options: - -- Migrate to another [RxStorage](./rx-storage.md) (recommended) -- Never update RxDB to the next major version (stay on older 14.0.0) -- Fork the [PouchDB RxStorage](./rx-storage-pouchdb.md) and maintain the plugin by yourself. -- Fix all the [PouchDB problems](https://github.com/pouchdb/pouchdb/issues?q=author%3Apubkey) so that we can add PouchDB to the RxDB Core again. - -## Pros - - Most battle proven RxStorage - - Supports replication with a CouchDB endpoint - - Support storing [attachments](./rx-attachment.md) - - Big ecosystem of adapters - -## Cons - - Big bundle size - - Slow performance because of revision handling overhead - -## Usage - -```ts -import { createRxDatabase } from 'rxdb'; -import { getRxStoragePouch, addPouchPlugin } from 'rxdb/plugins/pouchdb'; - -addPouchPlugin(require('pouchdb-adapter-idb')); - -const db = await createRxDatabase({ - name: 'exampledb', - storage: getRxStoragePouch( - 'idb', - { - /** - * other pouchdb specific options - * @link https://pouchdb.com/api.html#create_database - */ - } - ) -}); -``` - -## Polyfill the `global` variable - -When you use RxDB with **angular** or other **webpack** based frameworks, you might get the error: -```html -Uncaught ReferenceError: global is not defined -``` -This is because pouchdb assumes a nodejs-specific `global` variable that is not added to browser runtimes by some bundlers. -You have to add them by your own, like we do [here](https://github.com/pubkey/rxdb/blob/master/examples/angular/src/polyfills.ts). - -```ts -(window as any).global = window; -(window as any).process = { - env: { DEBUG: undefined }, -}; -``` - -## Adapters - -[PouchDB has many adapters for all JavaScript runtimes](./adapters.md). - -## Using the internal PouchDB Database - -For custom operations, you can access the internal PouchDB database. -This is dangerous because you might do changes that are not compatible with RxDB. -Only use this when there is no way to achieve your goals via the RxDB API. - -```javascript -import { - getPouchDBOfRxCollection -} from 'rxdb/plugins/pouchdb'; - -const pouch = getPouchDBOfRxCollection(myRxCollection); -``` diff --git a/docs/rx-storage-remote.html b/docs/rx-storage-remote.html deleted file mode 100644 index e7e73062728..00000000000 --- a/docs/rx-storage-remote.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - -Remote RxStorage | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Remote RxStorage

    -

    The Remote RxStorage is made to use a remote storage and communicate with it over an asynchronous message channel. -The remote part could be on another JavaScript process or even on a different host machine. -The remote storage plugin is used in many RxDB plugins like the worker or the electron plugin.

    -

    Usage

    -

    The remote storage communicates over a message channel which has to implement the messageChannelCreator function which returns an object that has a messages$ observable and a send() function on both sides and a close() function that closes the RemoteMessageChannel.

    -
    // on the client
    -import { getRxStorageRemote } from 'rxdb/plugins/storage-remote';
    -const storage = getRxStorageRemote({
    -    identifier: 'my-id',
    -    mode: 'storage',
    -    messageChannelCreator: () => Promise.resolve({
    -        messages$: new Subject(),
    -        send(msg) {
    -            // send to remote storage
    -        }
    -    })
    -});
    -const myDb = await createRxDatabase({
    -    storage
    -});
    - 
    -// on the remote
    -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
    -import { exposeRxStorageRemote } from 'rxdb/plugins/storage-remote';
    -exposeRxStorageRemote({
    -    storage: getRxStorageLocalstorage(),
    -    messages$: new Subject(),
    -    send(msg){
    -        // send to other side
    -    }
    -});
    -

    Usage with a Websocket server

    -

    The remote storage plugin contains helper functions to create a remote storage over a WebSocket server. -This is often used in Node.js to give one microservice access to another services database without having to replicate the full database state.

    -
    // server.js
    -import { getRxStorageMemory } from 'rxdb/plugins/storage-memory';
    -import { startRxStorageRemoteWebsocketServer } from 'rxdb/plugins/storage-remote-websocket';
    - 
    -// either you can create the server based on a RxDatabase
    -const serverBasedOnDatabase = await startRxStorageRemoteWebsocketServer({
    -    port: 8080,
    -    database: myRxDatabase
    -});
    - 
    -// or you can create the server based on a pure RxStorage
    -const serverBasedOn = await startRxStorageRemoteWebsocketServer({
    -    port: 8080,
    -    storage: getRxStorageMemory()
    -});
    -
    // client.js
    - 
    -import { getRxStorageRemoteWebsocket } from 'rxdb/plugins/storage-remote-websocket';
    -const myDb = await createRxDatabase({
    -    storage: getRxStorageRemoteWebsocket({
    -        url: 'ws://example.com:8080'
    -    })
    -});
    -

    Sending custom messages

    -

    The remote storage can also be used to send custom messages to and from the remote instance.

    -

    One the remote you have to define a customRequestHandler like:

    -
    const serverBasedOnDatabase = await startRxStorageRemoteWebsocketServer({
    -    port: 8080,
    -    database: myRxDatabase,
    -    async customRequestHandler(msg){
    -        // here you can return any JSON object as an 'answer'
    -        return {
    -            foo: 'bar'
    -        };
    -    } 
    -});
    -

    On the client instance you can then call the customRequest() method:

    -
    const storage = getRxStorageRemoteWebsocket({
    -    url: 'ws://example.com:8080'
    -});
    -const answer = await storage.customRequest({ bar: 'foo' });
    -console.dir(answer); // > { foo: 'bar' }
    - - \ No newline at end of file diff --git a/docs/rx-storage-remote.md b/docs/rx-storage-remote.md deleted file mode 100644 index 71e94b1ea73..00000000000 --- a/docs/rx-storage-remote.md +++ /dev/null @@ -1,107 +0,0 @@ -# Remote RxStorage - -> The Remote [RxStorage](./rx-storage.md) is made to use a remote storage and communicate with it over an asynchronous message channel. -The remote part could be on another JavaScript process or even on a different host machine. -The remote storage plugin is used in many RxDB plugins like the [worker](./rx-storage-worker.md) or the [electron](./electron.md) plugin. - -# Remote RxStorage - -The Remote [RxStorage](./rx-storage.md) is made to use a remote storage and communicate with it over an asynchronous message channel. -The remote part could be on another JavaScript process or even on a different host machine. -The remote storage plugin is used in many RxDB plugins like the [worker](./rx-storage-worker.md) or the [electron](./electron.md) plugin. - -## Usage - -The remote storage communicates over a message channel which has to implement the `messageChannelCreator` function which returns an object that has a `messages$` observable and a `send()` function on both sides and a `close()` function that closes the RemoteMessageChannel. - -```ts -// on the client -import { getRxStorageRemote } from 'rxdb/plugins/storage-remote'; -const storage = getRxStorageRemote({ - identifier: 'my-id', - mode: 'storage', - messageChannelCreator: () => Promise.resolve({ - messages$: new Subject(), - send(msg) { - // send to remote storage - } - }) -}); -const myDb = await createRxDatabase({ - storage -}); - -// on the remote -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; -import { exposeRxStorageRemote } from 'rxdb/plugins/storage-remote'; -exposeRxStorageRemote({ - storage: getRxStorageLocalstorage(), - messages$: new Subject(), - send(msg){ - // send to other side - } -}); -``` - -## Usage with a Websocket server - -The remote storage plugin contains helper functions to create a remote storage over a WebSocket server. -This is often used in Node.js to give one microservice access to another services database **without** having to replicate the full database state. - -```ts -// server.js -import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; -import { startRxStorageRemoteWebsocketServer } from 'rxdb/plugins/storage-remote-websocket'; - -// either you can create the server based on a RxDatabase -const serverBasedOnDatabase = await startRxStorageRemoteWebsocketServer({ - port: 8080, - database: myRxDatabase -}); - -// or you can create the server based on a pure RxStorage -const serverBasedOn = await startRxStorageRemoteWebsocketServer({ - port: 8080, - storage: getRxStorageMemory() -}); -``` - -```ts -// client.js - -import { getRxStorageRemoteWebsocket } from 'rxdb/plugins/storage-remote-websocket'; -const myDb = await createRxDatabase({ - storage: getRxStorageRemoteWebsocket({ - url: 'ws://example.com:8080' - }) -}); -``` - -## Sending custom messages - -The remote storage can also be used to send custom messages to and from the remote instance. - -One the remote you have to define a `customRequestHandler` like: - -```ts -const serverBasedOnDatabase = await startRxStorageRemoteWebsocketServer({ - port: 8080, - database: myRxDatabase, - async customRequestHandler(msg){ - // here you can return any JSON object as an 'answer' - return { - foo: 'bar' - }; - } -}); -``` - -On the client instance you can then call the `customRequest()` method: - -```ts -const storage = getRxStorageRemoteWebsocket({ - url: 'ws://example.com:8080' -}); -const answer = await storage.customRequest({ bar: 'foo' }); -console.dir(answer); // > { foo: 'bar' } -``` diff --git a/docs/rx-storage-sharding.html b/docs/rx-storage-sharding.html deleted file mode 100644 index c90f95a76d3..00000000000 --- a/docs/rx-storage-sharding.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - -Sharding RxStorage 👑 | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Sharding RxStorage

    -

    With the sharding plugin, you can improve the write and query times of some RxStorage implementations. -For example on slow IndexedDB, a performance gain of 30-50% on reads, and 25% on writes can be achieved by using multiple IndexedDB Stores instead of putting all documents into the same store.

    -

    The sharding plugin works as a wrapper around any other RxStorage. The sharding plugin will automatically create multiple shards per storage instance and it will merge and split read and write calls to it.

    -
    Premium

    The sharding plugin is part of RxDB Premium 👑. It is not part of the default RxDB module.

    -

    Using the sharding plugin

    -
    import {
    -    getRxStorageSharding
    -} from 'rxdb-premium/plugins/storage-sharding';
    - 
    -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
    - 
    - 
    -/**
    - * First wrap the original RxStorage with the sharding RxStorage.
    - */
    -const shardedRxStorage = getRxStorageSharding({
    - 
    -    /**
    -     * Here we use the localStorage RxStorage,
    -     * it is also possible to use any other RxStorage instead.
    -     */
    -    storage: getRxStorageLocalstorage()
    -});
    - 
    - 
    -/**
    - * Add the sharding options to your schema.
    - * Changing these options will require a data migration.
    - */
    -const mySchema = {
    -    /* ... */
    -    sharding: {
    -        /**
    -         * Amount of shards per RxStorage instance.
    -         * Depending on your data size and query patterns, the optimal shard amount may differ.
    -         * Do a performance test to optimize that value.
    -         * 10 Shards is a good value to start with.
    -         * 
    -         * IMPORTANT: Changing the value of shards is not possible on a already existing database state,
    -         * you will loose access to  your data.
    -         */
    -        shards: 10,
    -        /**
    -         * Sharding mode,
    -         * you can either shard by collection or by database.
    -         * For most cases you should use 'collection' which will shard on the collection level.
    -         * For example with the IndexedDB RxStorage, it will then create multiple stores per IndexedDB database
    -         * and not multiple IndexedDB databases, which would be slower.
    -         */
    -        mode: 'collection'
    -    }
    -    /* ... */
    -}
    - 
    - 
    -/**
    - * Create the RxDatabase with the wrapped RxStorage. 
    - */
    -const database = await createRxDatabase({
    -    name: 'mydatabase',
    -    storage: shardedRxStorage
    -});
    - 
    - - \ No newline at end of file diff --git a/docs/rx-storage-sharding.md b/docs/rx-storage-sharding.md deleted file mode 100644 index 0c926627457..00000000000 --- a/docs/rx-storage-sharding.md +++ /dev/null @@ -1,75 +0,0 @@ -# Sharding RxStorage 👑 - -> With the sharding plugin, you can improve the write and query times of **some** `RxStorage` implementations. -For example on [slow IndexedDB](./slow-indexeddb.md), a performance gain of **30-50% on reads**, and **25% on writes** can be achieved by using multiple IndexedDB Stores instead of putting all documents into the same store. - -# Sharding RxStorage - -With the sharding plugin, you can improve the write and query times of **some** `RxStorage` implementations. -For example on [slow IndexedDB](./slow-indexeddb.md), a performance gain of **30-50% on reads**, and **25% on writes** can be achieved by using multiple IndexedDB Stores instead of putting all documents into the same store. - -The sharding plugin works as a wrapper around any other `RxStorage`. The sharding plugin will automatically create multiple shards per storage instance and it will merge and split read and write calls to it. - -:::note Premium -The sharding plugin is part of [RxDB Premium 👑](/premium/). It is not part of the default RxDB module. -::: - -## Using the sharding plugin - -```ts -import { - getRxStorageSharding -} from 'rxdb-premium/plugins/storage-sharding'; - -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -/** - * First wrap the original RxStorage with the sharding RxStorage. - */ -const shardedRxStorage = getRxStorageSharding({ - - /** - * Here we use the localStorage RxStorage, - * it is also possible to use any other RxStorage instead. - */ - storage: getRxStorageLocalstorage() -}); - -/** - * Add the sharding options to your schema. - * Changing these options will require a data migration. - */ -const mySchema = { - /* ... */ - sharding: { - /** - * Amount of shards per RxStorage instance. - * Depending on your data size and query patterns, the optimal shard amount may differ. - * Do a performance test to optimize that value. - * 10 Shards is a good value to start with. - * - * IMPORTANT: Changing the value of shards is not possible on a already existing database state, - * you will loose access to your data. - */ - shards: 10, - /** - * Sharding mode, - * you can either shard by collection or by database. - * For most cases you should use 'collection' which will shard on the collection level. - * For example with the IndexedDB RxStorage, it will then create multiple stores per IndexedDB database - * and not multiple IndexedDB databases, which would be slower. - */ - mode: 'collection' - } - /* ... */ -} - -/** - * Create the RxDatabase with the wrapped RxStorage. - */ -const database = await createRxDatabase({ - name: 'mydatabase', - storage: shardedRxStorage -}); - -``` diff --git a/docs/rx-storage-shared-worker.html b/docs/rx-storage-shared-worker.html deleted file mode 100644 index cb050a490a9..00000000000 --- a/docs/rx-storage-shared-worker.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - -Boost Performance with SharedWorker RxStorage | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    SharedWorker RxStorage

    -

    The SharedWorker RxStorage uses the SharedWorker API to run the storage inside of a separate JavaScript process in browsers. Compared to a normal WebWorker, the SharedWorker is created exactly once, even when there are multiple browser tabs opened. Because of having exactly one worker, multiple performance optimizations can be done because the storage itself does not have to handle multiple opened database connections.

    -
    Premium

    This plugin is part of RxDB Premium 👑. It is not part of the default RxDB module.

    -

    Usage

    -

    On the SharedWorker process

    -

    In the worker process JavaScript file, you have wrap the original RxStorage with getRxStorageIndexedDB().

    -
    // shared-worker.ts
    - 
    -import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker';
    -import { 
    -    getRxStorageIndexedDB
    -} from 'rxdb-premium/plugins/indexeddb';
    - 
    -exposeWorkerRxStorage({
    -    /**
    -     * You can wrap any implementation of the RxStorage interface
    -     * into a worker.
    -     * Here we use the IndexedDB RxStorage.
    -     */
    -    storage: getRxStorageIndexedDB()
    -});
    -

    On the main process

    -
    import {
    -    createRxDatabase
    -} from 'rxdb';
    -import { getRxStorageSharedWorker } from 'rxdb-premium/plugins/storage-worker';
    -import { getRxStorageIndexedDB } from 'rxdb/plugins/storage-indexeddb';
    - 
    - 
    -const database = await createRxDatabase({
    -    name: 'mydatabase',
    -    storage: getRxStorageSharedWorker(
    -        {
    -            /**
    -             * Contains any value that can be used as parameter
    -             * to the SharedWorker constructor of thread.js
    -             * Most likely you want to put the path to the shared-worker.js file in here.
    -             * 
    -             * @link https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker?retiredLocale=de
    -             */
    -            workerInput: 'path/to/shared-worker.js',
    -            /**
    -             * (Optional) options
    -             * for the worker.
    -             */
    -            workerOptions: {
    -                type: 'module',
    -                credentials: 'omit'
    -            }
    -        }
    -    )
    -});
    -

    Pre-build workers

    -

    The shared-worker.js must be a self containing JavaScript file that contains all dependencies in a bundle. -To make it easier for you, RxDB ships with pre-bundles worker files that are ready to use. -You can find them in the folder node_modules/rxdb-premium/dist/workers after you have installed the RxDB Premium 👑 Plugin. From there you can copy them to a location where it can be served from the webserver and then use their path to create the RxDatabase

    -

    Any valid worker.js JavaScript file can be used both, for normal Workers and SharedWorkers.

    -
    import {
    -    createRxDatabase
    -} from 'rxdb';
    -import { getRxStorageSharedWorker } from 'rxdb-premium/plugins/storage-worker';
    -const database = await createRxDatabase({
    -    name: 'mydatabase',
    -    storage: getRxStorageSharedWorker(
    -        {
    -            /**
    -             * Path to where the copied file from node_modules/rxdb-premium/dist/workers
    -             * is reachable from the webserver.
    -             */
    -            workerInput: '/indexeddb.shared-worker.js'
    -        }
    -    )
    -});
    -

    Building a custom worker

    -

    To build a custom worker.js file, check out the webpack config at the worker documentation. Any worker file form the worker storage can also be used in a shared worker because exposeWorkerRxStorage detects where it runs and exposes the correct messaging endpoints.

    -

    Passing in a SharedWorker instance

    -

    Instead of setting an url as workerInput, you can also specify a function that returns a new SharedWorker instance when called. This is mostly used when you have a custom worker file and dynamically import it. -This works equal to the workerInput of the Worker Storage

    -

    Set multiInstance: false

    -

    When you know that you only ever create your RxDatabase inside of the shared worker, you might want to set multiInstance: false to prevent sending change events across JavaScript realms and to improve performance. Do not set this when you also create the same storage on another realm, like when you have the same RxDatabase once inside the shared worker and once on the main thread.

    -

    Replication with SharedWorker

    -

    When a SharedWorker RxStorage is used, it is recommended to run the replication inside of the worker. This is the best option for performance. You can do that by opening another RxDatabase inside of it and starting the replication there. If you are not concerned about performance, you can still start replication on the main thread instead. But you should never run replication on both the main thread and the worker.

    -
    // shared-worker.ts
    - 
    -import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker';
    -import { 
    -    getRxStorageIndexedDB
    -} from 'rxdb-premium/plugins/storage-indexeddb';
    -import {
    -    createRxDatabase,
    -    addRxPlugin
    -} from 'rxdb';
    -import {
    -    RxDBReplicationGraphQLPlugin
    -} from 'rxdb/plugins/replication-graphql';
    -addRxPlugin(RxDBReplicationGraphQLPlugin);
    - 
    -const baseStorage = getRxStorageIndexedDB();
    - 
    -// first expose the RxStorage to the outside
    -exposeWorkerRxStorage({
    -    storage: baseStorage
    -});
    - 
    -/**
    - * Then create a normal RxDatabase and RxCollections
    - * and start the replication.
    - */
    -const database = await createRxDatabase({
    -    name: 'mydatabase',
    -    storage: baseStorage
    -});
    -await db.addCollections({
    -    humans: {/* ... */}
    -});
    -const replicationState = db.humans.syncGraphQL({/* ... */});
    -

    Limitations

    - -

    FAQ

    -
    Can I use this plugin with a Service Worker?

    No. A Service Worker is not the same as a Shared Worker. While you can use RxDB inside of a ServiceWorker, you cannot use the ServiceWorker as a RxStorage that gets accessed by an outside RxDatabase instance.

    - - \ No newline at end of file diff --git a/docs/rx-storage-shared-worker.md b/docs/rx-storage-shared-worker.md deleted file mode 100644 index d76335f2861..00000000000 --- a/docs/rx-storage-shared-worker.md +++ /dev/null @@ -1,163 +0,0 @@ -# Boost Performance with SharedWorker RxStorage - -> Tap into single-instance storage with RxDB's SharedWorker. Improve efficiency, cut duplication, and keep your app lightning-fast across tabs. - -# SharedWorker RxStorage - -The SharedWorker [RxStorage](./rx-storage.md) uses the [SharedWorker API](https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker) to run the storage inside of a separate JavaScript process **in browsers**. Compared to a normal [WebWorker](./rx-storage-worker.md), the SharedWorker is created exactly once, even when there are multiple browser tabs opened. Because of having exactly one worker, multiple performance optimizations can be done because the storage itself does not have to handle multiple opened database connections. - -:::note Premium -This plugin is part of [RxDB Premium 👑](/premium/). It is not part of the default RxDB module. -::: - -## Usage - -### On the SharedWorker process - -In the worker process JavaScript file, you have wrap the original RxStorage with `getRxStorageIndexedDB()`. - -```ts -// shared-worker.ts - -import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; -import { - getRxStorageIndexedDB -} from 'rxdb-premium/plugins/indexeddb'; - -exposeWorkerRxStorage({ - /** - * You can wrap any implementation of the RxStorage interface - * into a worker. - * Here we use the IndexedDB RxStorage. - */ - storage: getRxStorageIndexedDB() -}); -``` - -### On the main process - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { getRxStorageSharedWorker } from 'rxdb-premium/plugins/storage-worker'; -import { getRxStorageIndexedDB } from 'rxdb/plugins/storage-indexeddb'; - -const database = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageSharedWorker( - { - /** - * Contains any value that can be used as parameter - * to the SharedWorker constructor of thread.js - * Most likely you want to put the path to the shared-worker.js file in here. - * - * @link https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker?retiredLocale=de - */ - workerInput: 'path/to/shared-worker.js', - /** - * (Optional) options - * for the worker. - */ - workerOptions: { - type: 'module', - credentials: 'omit' - } - } - ) -}); -``` - -## Pre-build workers - -The `shared-worker.js` must be a self containing JavaScript file that contains all dependencies in a bundle. -To make it easier for you, RxDB ships with pre-bundles worker files that are ready to use. -You can find them in the folder `node_modules/rxdb-premium/dist/workers` after you have installed the [RxDB Premium 👑 Plugin](/premium/). From there you can copy them to a location where it can be served from the webserver and then use their path to create the `RxDatabase` - -Any valid `worker.js` JavaScript file can be used both, for normal Workers and SharedWorkers. - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { getRxStorageSharedWorker } from 'rxdb-premium/plugins/storage-worker'; -const database = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageSharedWorker( - { - /** - * Path to where the copied file from node_modules/rxdb-premium/dist/workers - * is reachable from the webserver. - */ - workerInput: '/indexeddb.shared-worker.js' - } - ) -}); -``` - -## Building a custom worker - -To build a custom `worker.js` file, check out the webpack config at the [worker](./rx-storage-worker.md#building-a-custom-worker) documentation. Any worker file form the worker storage can also be used in a shared worker because `exposeWorkerRxStorage` detects where it runs and exposes the correct messaging endpoints. - -## Passing in a SharedWorker instance - -Instead of setting an url as `workerInput`, you can also specify a function that returns a new `SharedWorker` instance when called. This is mostly used when you have a custom worker file and dynamically import it. -This works equal to the [workerInput of the Worker Storage](./rx-storage-worker.md#passing-in-a-worker-instance) - -## Set multiInstance: false - -When you know that you only ever create your RxDatabase inside of the shared worker, you might want to set `multiInstance: false` to prevent sending change events across JavaScript realms and to improve performance. Do not set this when you also create the same storage on another realm, like when you have the same RxDatabase once inside the shared worker and once on the main thread. - -## Replication with SharedWorker - -When a SharedWorker RxStorage is used, it is recommended to run the replication **inside** of the worker. This is the best option for performance. You can do that by opening another [RxDatabase](./rx-database.md) inside of it and starting the replication there. If you are not concerned about performance, you can still start replication on the main thread instead. But you should never run replication on both the main thread **and** the worker. - -```ts -// shared-worker.ts - -import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; -import { - getRxStorageIndexedDB -} from 'rxdb-premium/plugins/storage-indexeddb'; -import { - createRxDatabase, - addRxPlugin -} from 'rxdb'; -import { - RxDBReplicationGraphQLPlugin -} from 'rxdb/plugins/replication-graphql'; -addRxPlugin(RxDBReplicationGraphQLPlugin); - -const baseStorage = getRxStorageIndexedDB(); - -// first expose the RxStorage to the outside -exposeWorkerRxStorage({ - storage: baseStorage -}); - -/** - * Then create a normal RxDatabase and RxCollections - * and start the replication. - */ -const database = await createRxDatabase({ - name: 'mydatabase', - storage: baseStorage -}); -await db.addCollections({ - humans: {/* ... */} -}); -const replicationState = db.humans.syncGraphQL({/* ... */}); -``` - -### Limitations - -- The SharedWorker API is [not available in some mobile browser](https://caniuse.com/sharedworkers) - -### FAQ - -
    - Can I use this plugin with a Service Worker? - - No. A Service Worker is not the same as a Shared Worker. While you can use RxDB inside of a ServiceWorker, you cannot use the ServiceWorker as a RxStorage that gets accessed by an outside RxDatabase instance. - -
    diff --git a/docs/rx-storage-sqlite.html b/docs/rx-storage-sqlite.html deleted file mode 100644 index 8bda0a47715..00000000000 --- a/docs/rx-storage-sqlite.html +++ /dev/null @@ -1,318 +0,0 @@ - - - - - -RxDB SQLite RxStorage for Hybrid Apps | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    SQLite RxStorage

    -

    This RxStorage is based on SQLite and is made to work with Node.js, Electron, React Native and Capacitor or SQLite via webassembly in the browser. It can be used with different so called sqliteBasics adapters to account for the differences in the various SQLite bundles and libraries that exist.

    -

    SQLite is a natural fit for RxDB because most platforms - Android, iOS, Node.js, and beyond - already ship with a built-in SQLite engine, delivering robust performance and minimal setup overhead. Its proven reliability, having powered countless applications over the years, ensures a battle-tested foundation for local data. By placing RxDB on top of SQLite, you gain advanced features suited for building interactive, offline-capable UI apps: real-time queries, reactive state updates, conflict handling, data encryption, and straightforward schema management. This combination offers a unified NoSQL-like experience without sacrificing the speed and broad availability that SQLite brings.

    -

    Performance comparison with other storages

    -

    The SQLite storage is a bit slower compared to other Node.js based storages like the Filesystem Storage because wrapping SQLite has a bit of overhead and sending data from the JavaScript process to SQLite and backwards increases the latency. However for most hybrid apps the SQLite storage is the best option because it can leverage the SQLite version that comes already installed on the smartphones OS (iOS and android). Also for desktop electron apps it can be a viable solution because it is easy to ship SQLite together inside of the electron bundle.

    -

    SQLite performance - Node.js

    -

    Using the SQLite RxStorage

    -

    There are two versions of the SQLite storage available for RxDB:

    -
      -
    • -

      The trial version which comes directly shipped with RxDB Core. It contains an SQLite storage that allows you to try out RxDB on devices that support SQLite, like React Native or Electron. While the trial version does pass the full RxDB storage test-suite, it is not made for production. It is not using indexes, has no attachment support, is limited to store 300 documents and fetches the whole storage state to run queries in memory. Use it for evaluation and prototypes only!

      -
    • -
    • -

      The RxDB Premium 👑 version which contains the full production-ready SQLite storage. It contains a full load of performance optimizations and full query support. To use the SQLite storage you have to import getRxStorageSQLite from the RxDB Premium 👑 package and then add the correct sqliteBasics adapter depending on which sqlite module you want to use. This can then be used as storage when creating the RxDatabase. In the following you can see some examples for some of the most common SQLite packages.

      -
    • -
    -
    // Import the Trial SQLite Storage
    -import {
    -    getRxStorageSQLiteTrial,
    -    getSQLiteBasicsNodeNative
    -} from 'rxdb/plugins/storage-sqlite';
    - 
    -// Create a Storage for it, here we use the nodejs-native SQLite module
    -// other SQLite modules can be used with a different sqliteBasics adapter
    -import { DatabaseSync } from 'node:sqlite';
    -const storage = getRxStorageSQLiteTrial({
    -    sqliteBasics: getSQLiteBasicsNodeNative(DatabaseSync)
    -});
    - 
    -// Create a Database with the Storage
    -const myRxDatabase = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: storage
    -});
    -

    In the following, all examples are shown with the premium SQLite storage. Still they work the same with the trial version.

    -

    SQLiteBasics

    -

    Different SQLite libraries have different APIs to create and access the SQLite database. Therefore the library must be massaged to work with the RxDB SQlite storage. This is done in a so called SQLiteBasics interface. RxDB directly ships with a wide range of these for various SQLite libraries that are commonly used. Also creating your own one is pretty simple, check the source code of the existing ones for that.

    -

    For example for the sqlite3 npm library we have the getSQLiteBasicsNode() implementation. For node:sqlite we have the getSQLiteBasicsNodeNative() implementation and so on..

    -

    Using the SQLite RxStorage with different SQLite libraries

    -

    Usage with the sqlite3 npm package

    -
    import {
    -    createRxDatabase
    -} from 'rxdb';
    -import {
    -    getRxStorageSQLite,
    -    getSQLiteBasicsNode
    -} from 'rxdb-premium/plugins/storage-sqlite';
    - 
    -/**
    - * In Node.js, we use the SQLite database
    - * from the 'sqlite' npm module.
    - * @link https://www.npmjs.com/package/sqlite3
    - */
    -import sqlite3 from 'sqlite3';
    - 
    -const myRxDatabase = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageSQLite({
    -        /**
    -         * Different runtimes have different interfaces to SQLite.
    -         * For example in node.js we have a callback API,
    -         * while in capacitor sqlite we have Promises.
    -         * So we need a helper object that is capable of doing the basic
    -         * sqlite operations.
    -         */
    -        sqliteBasics: getSQLiteBasicsNode(sqlite3)
    -    })
    -});
    -

    Usage with the node:sqlite package

    -

    With Node.js version 22 and newer, you can use the "native" sqlite module that comes shipped with Node.js.

    -
    import { createRxDatabase } from 'rxdb';
    -import {
    -    getRxStorageSQLite,
    -    getSQLiteBasicsNodeNative
    -} from 'rxdb-premium/plugins/storage-sqlite';
    -import { DatabaseSync } from 'node:sqlite';
    -const myRxDatabase = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageSQLite({
    -        sqliteBasics: getSQLiteBasicsNodeNative(DatabaseSync)
    -    })
    -});
    -

    Usage with Webassembly in the Browser

    -

    In the browser you can use the wa-sqlite package to run sQLite in Webassembly. The wa-sqlite module also allows to use persistence with IndexedDB or OPFS. Notice that in general SQLite via Webassembly is slower compared to other storages like IndexedDB or OPFS because sending data from the main thread to wasm and backwards is slow in the browser. Have a look the performance comparison.

    -
    import {
    -    createRxDatabase
    -} from 'rxdb';
    -import {
    -    getRxStorageSQLite,
    -    getSQLiteBasicsWasm
    -} from 'rxdb-premium/plugins/storage-sqlite';
    - 
    -/**
    - * In the Browser, we use the SQLite database
    - * from the 'wa-sqlite' npm module. This contains the SQLite library
    - * compiled to Webassembly
    - * @link https://www.npmjs.com/package/wa-sqlite
    - */
    -import SQLiteESMFactory from 'wa-sqlite/dist/wa-sqlite-async.mjs';
    -import SQLite from 'wa-sqlite';
    -const sqliteModule = await SQLiteESMFactory();
    -const sqlite3 = SQLite.Factory(module);
    - 
    -const myRxDatabase = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageSQLite({
    -        sqliteBasics: getSQLiteBasicsWasm(sqlite3)
    -    })
    -});
    -

    Usage with React Native

    -
      -
    1. Install the react-native-quick-sqlite npm module
    2. -
    3. Import getSQLiteBasicsQuickSQLite from the SQLite plugin and use it to create a RxDatabase:
    4. -
    -
    import {
    -    createRxDatabase
    -} from 'rxdb';
    -import {
    -    getRxStorageSQLite,
    -    getSQLiteBasicsQuickSQLite
    -} from 'rxdb-premium/plugins/storage-sqlite';
    -import { open } from 'react-native-quick-sqlite';
    - 
    -// create database
    -const myRxDatabase = await createRxDatabase({
    -    name: 'exampledb',
    -    multiInstance: false, // <- Set multiInstance to false when using RxDB in React Native
    -    storage: getRxStorageSQLite({
    -        sqliteBasics: getSQLiteBasicsQuickSQLite(open)
    -    })
    -});
    -

    If react-native-quick-sqlite does not work for you, as alternative you can use the react-native-sqlite-2 library instead:

    -
    import {
    -    getRxStorageSQLite,
    -    getSQLiteBasicsWebSQL
    -} from 'rxdb-premium/plugins/storage-sqlite';
    -import SQLite from 'react-native-sqlite-2';
    -const storage = getRxStorageSQLite({
    -  sqliteBasics: getSQLiteBasicsWebSQL(SQLite.openDatabase)
    -});
    -

    Usage with Expo SQLite

    -

    Notice that expo-sqlite cannot be used on android (but it works on iOS) if you use Expo SDK version 50 or older. Please update to Version 50 or newer to use it.

    -

    In the latest expo SDK version, use the getSQLiteBasicsExpoSQLiteAsync() method:

    -
    import {
    -    createRxDatabase
    -} from 'rxdb';
    -import {
    -    getRxStorageSQLite,
    -    getSQLiteBasicsExpoSQLiteAsync
    -} from 'rxdb-premium/plugins/storage-sqlite';
    -import * as SQLite from 'expo-sqlite';
    - 
    -const myRxDatabase = await createRxDatabase({
    -    name: 'exampledb',
    -    multiInstance: false,
    -    storage: getRxStorageSQLite({
    -        sqliteBasics: getSQLiteBasicsExpoSQLiteAsync(SQLite.openDatabaseAsync)
    -    })
    -});
    -

    In older Expo SDK versions, you might have to use the non-async API:

    -
    import {
    -    createRxDatabase
    -} from 'rxdb';
    -import {
    -    getRxStorageSQLite,
    -    getSQLiteBasicsExpoSQLite
    -} from 'rxdb-premium/plugins/storage-sqlite';
    -import { openDatabase } from 'expo-sqlite';
    - 
    -const myRxDatabase = await createRxDatabase({
    -    name: 'exampledb',
    -    multiInstance: false,
    -    storage: getRxStorageSQLite({
    -        sqliteBasics: getSQLiteBasicsExpoSQLite(openDatabase)
    -    })
    -});
    -

    Usage with SQLite Capacitor

    -
      -
    1. Install the sqlite capacitor npm module
    2. -
    3. Add the iOS database location to your capacitor config
    4. -
    -
    {
    -    "plugins": {
    -        "CapacitorSQLite": {
    -            "iosDatabaseLocation": "Library/CapacitorDatabase"
    -        }
    -    }
    -}
    -
      -
    1. Use the function getSQLiteBasicsCapacitor to get the capacitor sqlite wrapper.
    2. -
    -
    import {
    -    createRxDatabase
    -} from 'rxdb';
    -import {
    -    getRxStorageSQLite,
    -    getSQLiteBasicsCapacitor
    -} from 'rxdb-premium/plugins/storage-sqlite';
    - 
    -/**
    - * Import SQLite from the capacitor plugin.
    - */
    -import {
    -    CapacitorSQLite,
    -    SQLiteConnection
    -} from '@capacitor-community/sqlite';
    -import { Capacitor } from '@capacitor/core';
    - 
    -const sqlite = new SQLiteConnection(CapacitorSQLite);
    - 
    -const myRxDatabase = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageSQLite({
    -        /**
    -         * Different runtimes have different interfaces to SQLite.
    -         * For example in node.js we have a callback API,
    -         * while in capacitor sqlite we have Promises.
    -         * So we need a helper object that is capable of doing the basic
    -         * sqlite operations.
    -         */
    -        sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor)
    -    })
    -});
    -

    Usage with Tauri SQLite

    -
      -
    1. Add the Tauri SQL plugin to your Tauri project.
    2. -
    3. Make sure to add sqlite as your database engine by running cargo add tauri-plugin-sql --features sqlite inside src-tauri.
    4. -
    5. Use the getSQLiteBasicsTauri function to get the Tauri SQLite wrapper.
    6. -
    -
    import {
    -    createRxDatabase
    -} from 'rxdb';
    -import {
    -    getRxStorageSQLite,
    -    getSQLiteBasicsTauri
    -} from 'rxdb/plugins/storage-sqlite';
    -import sqlite3 from '@tauri-apps/plugin-sql';
    - 
    -const myRxDatabase = await createRxDatabase({
    -    name: 'exampledb',
    -    storage: getRxStorageSQLite({
    -        sqliteBasics: getSQLiteBasicsTauri(sqlite3)
    -    })
    -});
    -

    Database Connection

    -

    If you need to access the database connection for any reason you can use getDatabaseConnection to do so:

    -
    import { getDatabaseConnection } from 'rxdb-premium/plugins/storage-sqlite'
    -

    It has the following signature:

    -
    getDatabaseConnection(
    -    sqliteBasics: SQLiteBasics<any>,
    -    databaseName: string
    -): Promise<SQLiteDatabaseClass>;
    -

    Known Problems of SQLite in JavaScript apps

    -
      -
    • -

      Some JavaScript runtimes do not contain a Buffer API which is used by SQLite to store binary attachments data as BLOB. You can set storeAttachmentsAsBase64String: true if you want to store the attachments data as base64 string instead. This increases the database size but makes it work even without having a Buffer.

      -
    • -
    • -

      The SQlite RxStorage works on SQLite libraries that use SQLite in version 3.38.0 (2022-02-22) or newer, because it uses the SQLite JSON methods like JSON_EXTRACT. If you get an error like [Error: no such function: JSON_EXTRACT (code 1 SQLITE_ERROR[1]), you might have a too old version of SQLite.

      -
    • -
    • -

      To debug all SQL operations, you can pass a log function to getRxStorageSQLite() like this. This does not work with the trial version:

      -
    • -
    -
    const storage = getRxStorageSQLite({
    -    sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor),
    -    // pass log function
    -    log: console.log.bind(console)
    -});
    -
      -
    • By default, all tables will be created with the WITHOUT ROWID flag. Some tools like drizzle do not support tables with that option. You can disable it by setting withoutRowId: false when calling getRxStorageSQLite():
    • -
    -
    const storage = getRxStorageSQLite({
    -    sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor),
    -    withoutRowId: false
    -});
    - -
    - - \ No newline at end of file diff --git a/docs/rx-storage-sqlite.md b/docs/rx-storage-sqlite.md deleted file mode 100644 index f8679ee4a83..00000000000 --- a/docs/rx-storage-sqlite.md +++ /dev/null @@ -1,373 +0,0 @@ -# RxDB SQLite RxStorage for Hybrid Apps - -> Unlock seamless persistence with SQLite RxStorage. Explore usage in hybrid apps, compare performance, and leverage advanced features like attachments. - -import {Steps} from '@site/src/components/steps'; -import {Tabs} from '@site/src/components/tabs'; - -# SQLite RxStorage - -This [RxStorage](./rx-storage.md) is based on [SQLite](https://www.sqlite.org/index.html) and is made to work with **Node.js**, [Electron](./electron-database.md), [React Native](./react-native-database.md) and [Capacitor](./capacitor-database.md) or SQLite via webassembly in the browser. It can be used with different so called `sqliteBasics` adapters to account for the differences in the various SQLite bundles and libraries that exist. - -SQLite is a natural fit for RxDB because most platforms - Android, iOS, Node.js, and beyond - already ship with a built-in SQLite engine, delivering robust performance and minimal setup overhead. Its proven reliability, having powered countless applications over the years, ensures a battle-tested foundation for local data. By placing RxDB on top of SQLite, you gain advanced features suited for building interactive, offline-capable UI apps: [real-time queries](./rx-query.md#observe), reactive state updates, [conflict handling](./transactions-conflicts-revisions.md), [data encryption](./encryption.md), and straightforward [schema management](./rx-schema.md). This combination offers a unified NoSQL-like experience without sacrificing the speed and broad availability that SQLite brings. - -## Performance comparison with other storages - -The SQLite storage is a bit slower compared to other Node.js based storages like the [Filesystem Storage](./rx-storage-filesystem-node.md) because wrapping SQLite has a bit of overhead and sending data from the JavaScript process to SQLite and backwards increases the latency. However for most hybrid apps the SQLite storage is the best option because it can leverage the SQLite version that comes already installed on the smartphones OS (iOS and android). Also for desktop electron apps it can be a viable solution because it is easy to ship SQLite together inside of the electron bundle. - - - -## Using the SQLite RxStorage - -There are two versions of the SQLite storage available for RxDB: - -- The **trial version** which comes directly shipped with RxDB Core. It contains an SQLite storage that allows you to try out RxDB on devices that support SQLite, like React Native or Electron. While the trial version does pass the full RxDB storage test-suite, it is not made for production. It is not using indexes, has no attachment support, is limited to store 300 documents and fetches the whole storage state to run queries in memory. **Use it for evaluation and prototypes only!** - -- The **[RxDB Premium 👑](/premium/) version** which contains the full production-ready SQLite storage. It contains a full load of performance optimizations and full query support. To use the SQLite storage you have to import `getRxStorageSQLite` from the [RxDB Premium 👑](/premium/) package and then add the correct `sqliteBasics` adapter depending on which sqlite module you want to use. This can then be used as storage when creating the [RxDatabase](./rx-database.md). In the following you can see some examples for some of the most common SQLite packages. - - - -## Trial Version -```ts -// Import the Trial SQLite Storage -import { - getRxStorageSQLiteTrial, - getSQLiteBasicsNodeNative -} from 'rxdb/plugins/storage-sqlite'; - -// Create a Storage for it, here we use the nodejs-native SQLite module -// other SQLite modules can be used with a different sqliteBasics adapter -import { DatabaseSync } from 'node:sqlite'; -const storage = getRxStorageSQLiteTrial({ - sqliteBasics: getSQLiteBasicsNodeNative(DatabaseSync) -}); - -// Create a Database with the Storage -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: storage -}); -``` - -## RxDB Premium 👑 - -```ts -// Import the SQLite Storage from the premium plugins. -import { - getRxStorageSQLite, - getSQLiteBasicsNodeNative -} from 'rxdb-premium/plugins/storage-sqlite'; - -// Create a Storage for it, here we use the nodejs-native SQLite module -// other SQLite modules can be used with a different sqliteBasics adapter -import { DatabaseSync } from 'node:sqlite'; -const storage = getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsNodeNative(DatabaseSync) -}); - -// Create a Database with the Storage -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: storage -}); -``` - - - -In the following, all examples are shown with the premium SQLite storage. Still they work the same with the trial version. - -## SQLiteBasics - -Different SQLite libraries have different APIs to create and access the SQLite database. Therefore the library must be massaged to work with the RxDB SQlite storage. This is done in a so called `SQLiteBasics` interface. RxDB directly ships with a wide range of these for various SQLite libraries that are commonly used. Also creating your own one is pretty simple, check the source code of the existing ones for that. - -For example for the `sqlite3` npm library we have the `getSQLiteBasicsNode()` implementation. For `node:sqlite` we have the `getSQLiteBasicsNodeNative()` implementation and so on.. - -## Using the SQLite RxStorage with different SQLite libraries - -### Usage with the **sqlite3 npm package** - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageSQLite, - getSQLiteBasicsNode -} from 'rxdb-premium/plugins/storage-sqlite'; - -/** - * In Node.js, we use the SQLite database - * from the 'sqlite' npm module. - * @link https://www.npmjs.com/package/sqlite3 - */ -import sqlite3 from 'sqlite3'; - -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageSQLite({ - /** - * Different runtimes have different interfaces to SQLite. - * For example in node.js we have a callback API, - * while in capacitor sqlite we have Promises. - * So we need a helper object that is capable of doing the basic - * sqlite operations. - */ - sqliteBasics: getSQLiteBasicsNode(sqlite3) - }) -}); -``` - -### Usage with the **node:sqlite** package - -With Node.js version 22 and newer, you can use the "native" [sqlite module](https://nodejs.org/api/sqlite.html) that comes shipped with Node.js. - -```ts -import { createRxDatabase } from 'rxdb'; -import { - getRxStorageSQLite, - getSQLiteBasicsNodeNative -} from 'rxdb-premium/plugins/storage-sqlite'; -import { DatabaseSync } from 'node:sqlite'; -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsNodeNative(DatabaseSync) - }) -}); -``` - -### Usage with Webassembly in the Browser - -In the browser you can use the [wa-sqlite](https://github.com/rhashimoto/wa-sqlite) package to run sQLite in Webassembly. The wa-sqlite module also allows to use persistence with IndexedDB or OPFS. Notice that in general SQLite via Webassembly is slower compared to other storages like [IndexedDB](./rx-storage-indexeddb.md) or [OPFS](./rx-storage-opfs.md) because sending data from the main thread to wasm and backwards is slow in the browser. Have a look the [performance comparison](./rx-storage-performance.md). - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageSQLite, - getSQLiteBasicsWasm -} from 'rxdb-premium/plugins/storage-sqlite'; - -/** - * In the Browser, we use the SQLite database - * from the 'wa-sqlite' npm module. This contains the SQLite library - * compiled to Webassembly - * @link https://www.npmjs.com/package/wa-sqlite - */ -import SQLiteESMFactory from 'wa-sqlite/dist/wa-sqlite-async.mjs'; -import SQLite from 'wa-sqlite'; -const sqliteModule = await SQLiteESMFactory(); -const sqlite3 = SQLite.Factory(module); - -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsWasm(sqlite3) - }) -}); -``` - -### Usage with **React Native** - -1. Install the [react-native-quick-sqlite npm module](https://www.npmjs.com/package/react-native-quick-sqlite) -2. Import `getSQLiteBasicsQuickSQLite` from the SQLite plugin and use it to create a [RxDatabase](./rx-database.md): - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageSQLite, - getSQLiteBasicsQuickSQLite -} from 'rxdb-premium/plugins/storage-sqlite'; -import { open } from 'react-native-quick-sqlite'; - -// create database -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - multiInstance: false, // <- Set multiInstance to false when using RxDB in React Native - storage: getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsQuickSQLite(open) - }) -}); -``` - -If `react-native-quick-sqlite` does not work for you, as alternative you can use the [react-native-sqlite-2](https://www.npmjs.com/package/react-native-sqlite-2) library instead: - -```ts -import { - getRxStorageSQLite, - getSQLiteBasicsWebSQL -} from 'rxdb-premium/plugins/storage-sqlite'; -import SQLite from 'react-native-sqlite-2'; -const storage = getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsWebSQL(SQLite.openDatabase) -}); -``` - -### Usage with **Expo SQLite** - -Notice that [expo-sqlite](https://www.npmjs.com/package/expo-sqlite) cannot be used on android (but it works on iOS) if you use Expo SDK version 50 or older. Please update to Version 50 or newer to use it. - -In the latest expo SDK version, use the `getSQLiteBasicsExpoSQLiteAsync()` method: - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageSQLite, - getSQLiteBasicsExpoSQLiteAsync -} from 'rxdb-premium/plugins/storage-sqlite'; -import * as SQLite from 'expo-sqlite'; - -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - multiInstance: false, - storage: getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsExpoSQLiteAsync(SQLite.openDatabaseAsync) - }) -}); -``` - -In older Expo SDK versions, you might have to use the non-async API: - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageSQLite, - getSQLiteBasicsExpoSQLite -} from 'rxdb-premium/plugins/storage-sqlite'; -import { openDatabase } from 'expo-sqlite'; - -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - multiInstance: false, - storage: getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsExpoSQLite(openDatabase) - }) -}); -``` - -### Usage with **SQLite Capacitor** - -1. Install the [sqlite capacitor npm module](https://github.com/capacitor-community/sqlite) -2. Add the iOS database location to your capacitor config - -```json -{ - "plugins": { - "CapacitorSQLite": { - "iosDatabaseLocation": "Library/CapacitorDatabase" - } - } -} -``` - -3. Use the function `getSQLiteBasicsCapacitor` to get the capacitor sqlite wrapper. - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageSQLite, - getSQLiteBasicsCapacitor -} from 'rxdb-premium/plugins/storage-sqlite'; - -/** - * Import SQLite from the capacitor plugin. - */ -import { - CapacitorSQLite, - SQLiteConnection -} from '@capacitor-community/sqlite'; -import { Capacitor } from '@capacitor/core'; - -const sqlite = new SQLiteConnection(CapacitorSQLite); - -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageSQLite({ - /** - * Different runtimes have different interfaces to SQLite. - * For example in node.js we have a callback API, - * while in capacitor sqlite we have Promises. - * So we need a helper object that is capable of doing the basic - * sqlite operations. - */ - sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor) - }) -}); -``` - -### Usage with Tauri SQLite - -1. Add the [Tauri SQL plugin](https://tauri.app/plugin/sql/#setup) to your Tauri project. -2. Make sure to add `sqlite` as your database engine by running `cargo add tauri-plugin-sql --features sqlite` inside `src-tauri`. -3. Use the `getSQLiteBasicsTauri` function to get the Tauri SQLite wrapper. - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { - getRxStorageSQLite, - getSQLiteBasicsTauri -} from 'rxdb/plugins/storage-sqlite'; -import sqlite3 from '@tauri-apps/plugin-sql'; - -const myRxDatabase = await createRxDatabase({ - name: 'exampledb', - storage: getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsTauri(sqlite3) - }) -}); -``` - -## Database Connection - -If you need to access the database connection for any reason you can use `getDatabaseConnection` to do so: - -```ts -import { getDatabaseConnection } from 'rxdb-premium/plugins/storage-sqlite' -``` - -It has the following signature: - -```ts -getDatabaseConnection( - sqliteBasics: SQLiteBasics, - databaseName: string -): Promise; -``` - -## Known Problems of SQLite in JavaScript apps - -- Some JavaScript runtimes do not contain a `Buffer` API which is used by SQLite to store binary attachments data as `BLOB`. You can set `storeAttachmentsAsBase64String: true` if you want to store the attachments data as base64 string instead. This increases the database size but makes it work even without having a `Buffer`. - -- The SQlite RxStorage works on SQLite libraries that use SQLite in version `3.38.0 (2022-02-22)` or newer, because it uses the [SQLite JSON](https://www.sqlite.org/json1.html) methods like `JSON_EXTRACT`. If you get an error like `[Error: no such function: JSON_EXTRACT (code 1 SQLITE_ERROR[1])`, you might have a too old version of SQLite. - -- To debug all SQL operations, you can pass a log function to `getRxStorageSQLite()` like this. This does not work with the trial version: -```ts -const storage = getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor), - // pass log function - log: console.log.bind(console) -}); -``` - -- By default, all tables will be created with the `WITHOUT ROWID` flag. Some tools like drizzle do not support tables with that option. You can disable it by setting `withoutRowId: false` when calling `getRxStorageSQLite()`: - -```ts -const storage = getRxStorageSQLite({ - sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor), - withoutRowId: false -}); -``` - -## Related -- [React Native Databases](./react-native-database.md) diff --git a/docs/rx-storage-worker.html b/docs/rx-storage-worker.html deleted file mode 100644 index c543031e517..00000000000 --- a/docs/rx-storage-worker.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - -Turbocharge RxDB with Worker RxStorage | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Worker RxStorage

    -

    With the worker plugin, you can put the RxStorage of your database inside of a WebWorker (in browsers) or a Worker Thread (in node.js). By doing so, you can take CPU load from the main process and move it into the worker's process which can improve the perceived performance of your application. Notice that for browsers, it is recommend to use the SharedWorker instead to get a better performance.

    -
    Premium

    This plugin is part of RxDB Premium 👑. It is not part of the default RxDB module.

    -

    On the worker process

    -
    // worker.ts
    - 
    -import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker';
    -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb';
    - 
    -exposeWorkerRxStorage({
    -    /**
    -     * You can wrap any implementation of the RxStorage interface
    -     * into a worker.
    -     * Here we use the IndexedDB RxStorage.
    -     */
    -    storage: getRxStorageIndexedDB()
    -});
    -

    On the main process

    -
    import {
    -    createRxDatabase
    -} from 'rxdb';
    -import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker';
    - 
    -const database = await createRxDatabase({
    -    name: 'mydatabase',
    -    storage: getRxStorageWorker(
    -        {
    -            /**
    -             * Contains any value that can be used as parameter
    -             * to the Worker constructor of thread.js
    -             * Most likely you want to put the path to the worker.js file in here.
    -             * 
    -             * @link https://developer.mozilla.org/en-US/docs/Web/API/Worker/Worker
    -             */
    -            workerInput: 'path/to/worker.js',
    -            /**
    -             * (Optional) options
    -             * for the worker.
    -             */
    -            workerOptions: {
    -                type: 'module',
    -                credentials: 'omit'
    -            }
    -        }
    -    )
    -});
    -

    Pre-build workers

    -

    The worker.js must be a self containing JavaScript file that contains all dependencies in a bundle. -To make it easier for you, RxDB ships with pre-bundles worker files that are ready to use. -You can find them in the folder node_modules/rxdb-premium/dist/workers after you have installed the RxDB Premium 👑 Plugin. From there you can copy them to a location where it can be served from the webserver and then use their path to create the RxDatabase.

    -

    Any valid worker.js JavaScript file can be used both, for normal Workers and SharedWorkers.

    -
    import {
    -    createRxDatabase
    -} from 'rxdb';
    -import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker';
    -const database = await createRxDatabase({
    -    name: 'mydatabase',
    -    storage: getRxStorageWorker(
    -        {
    -            /**
    -             * Path to where the copied file from node_modules/rxdb/dist/workers
    -             * is reachable from the webserver.
    -             */
    -            workerInput: '/indexeddb.worker.js'
    -        }
    -    )
    -});
    -

    Building a custom worker

    -

    The easiest way to bundle a custom worker.js file is by using webpack. Here is the webpack-config that is also used for the prebuild workers:

    -
    // webpack.config.js
    -const path = require('path');
    -const TerserPlugin = require('terser-webpack-plugin');
    -const projectRootPath = path.resolve(
    -    __dirname,
    -    '../../' // path from webpack-config to the root folder of the repo
    -);
    -const babelConfig = require(path.join(projectRootPath, 'babel.config'));
    -const baseDir = './dist/workers/'; // output path
    -module.exports = {
    -    target: 'webworker',
    -    entry: {
    -        'my-custom-worker': baseDir + 'my-custom-worker.js',
    -    },
    -    output: {
    -        filename: '[name].js',
    -        clean: true,
    -        path: path.resolve(
    -            projectRootPath,
    -            'dist/workers'
    -        ),
    -    },
    -    mode: 'production',
    -    module: {
    -        rules: [
    -            {
    -                test: /\.tsx?$/,
    -                exclude: /(node_modules)/,
    -                use: {
    -                    loader: 'babel-loader',
    -                    options: babelConfig
    -                }
    -            }
    -        ],
    -    },
    -    resolve: {
    -        extensions: ['.tsx', '.ts', '.js', '.mjs', '.mts']
    -    },
    -    optimization: {
    -        moduleIds: 'deterministic',
    -        minimize: true,
    -        minimizer: [new TerserPlugin({
    -            terserOptions: {
    -                format: {
    -                    comments: false,
    -                },
    -            },
    -            extractComments: false,
    -        })],
    -    }
    -};
    -

    One worker per database

    -

    Each call to getRxStorageWorker() will create a different worker instance so that when you have more than one RxDatabase, each database will have its own JavaScript worker process.

    -

    To reuse the worker instance in more than one RxDatabase, you can store the output of getRxStorageWorker() into a variable an use that one. Reusing the worker can decrease the initial page load, but you might get slower database operations.

    -
    // Call getRxStorageWorker() exactly once
    -const workerStorage = getRxStorageWorker({
    -    workerInput: 'path/to/worker.js'
    -});
    - 
    -// use the same storage for both databases.
    -const databaseOne = await createRxDatabase({
    -    name: 'database-one',
    -    storage: workerStorage
    -});
    -const databaseTwo = await createRxDatabase({
    -    name: 'database-two',
    -    storage: workerStorage
    -});
    - 
    -

    Passing in a Worker instance

    -

    Instead of setting an url as workerInput, you can also specify a function that returns a new Worker instance when called.

    -
    getRxStorageWorker({
    -    workerInput: () => new Worker('path/to/worker.js')
    -})
    -

    This can be helpful for environments where the worker is build dynamically by the bundler. For example in angular you would create a my-custom.worker.ts file that contains a custom build worker and then import it.

    -
    const storage = getRxStorageWorker({
    -    workerInput: () => new Worker(new URL('./my-custom.worker', import.meta.url)),
    -});
    -
    //> my-custom.worker.ts
    -import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker';
    -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb';
    - 
    -exposeWorkerRxStorage({
    -    storage: getRxStorageIndexedDB()
    -});
    - - \ No newline at end of file diff --git a/docs/rx-storage-worker.md b/docs/rx-storage-worker.md deleted file mode 100644 index 6bad75fc615..00000000000 --- a/docs/rx-storage-worker.md +++ /dev/null @@ -1,199 +0,0 @@ -# Turbocharge RxDB with Worker RxStorage - -> Offload RxDB queries to WebWorkers or Worker Threads, freeing the main thread and boosting performance. Experience smoother apps with Worker RxStorage. - -# Worker RxStorage - -With the worker plugin, you can put the `RxStorage` of your database inside of a WebWorker (in browsers) or a Worker Thread (in node.js). By doing so, you can take CPU load from the main process and move it into the worker's process which can improve the perceived performance of your application. Notice that for browsers, it is recommend to use the [SharedWorker](./rx-storage-shared-worker.md) instead to get a better performance. - -:::note Premium -This plugin is part of [RxDB Premium 👑](/premium/). It is not part of the default RxDB module. -::: - -## On the worker process - -```ts -// worker.ts - -import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; - -exposeWorkerRxStorage({ - /** - * You can wrap any implementation of the RxStorage interface - * into a worker. - * Here we use the IndexedDB RxStorage. - */ - storage: getRxStorageIndexedDB() -}); -``` - -## On the main process - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker'; - -const database = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageWorker( - { - /** - * Contains any value that can be used as parameter - * to the Worker constructor of thread.js - * Most likely you want to put the path to the worker.js file in here. - * - * @link https://developer.mozilla.org/en-US/docs/Web/API/Worker/Worker - */ - workerInput: 'path/to/worker.js', - /** - * (Optional) options - * for the worker. - */ - workerOptions: { - type: 'module', - credentials: 'omit' - } - } - ) -}); -``` - -## Pre-build workers - -The `worker.js` must be a self containing JavaScript file that contains all dependencies in a bundle. -To make it easier for you, RxDB ships with pre-bundles worker files that are ready to use. -You can find them in the folder `node_modules/rxdb-premium/dist/workers` after you have installed the [RxDB Premium 👑 Plugin](/premium/). From there you can copy them to a location where it can be served from the webserver and then use their path to create the `RxDatabase`. - -Any valid `worker.js` JavaScript file can be used both, for normal Workers and SharedWorkers. - -```ts -import { - createRxDatabase -} from 'rxdb'; -import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker'; -const database = await createRxDatabase({ - name: 'mydatabase', - storage: getRxStorageWorker( - { - /** - * Path to where the copied file from node_modules/rxdb/dist/workers - * is reachable from the webserver. - */ - workerInput: '/indexeddb.worker.js' - } - ) -}); -``` - -## Building a custom worker - -The easiest way to bundle a custom `worker.js` file is by using webpack. Here is the webpack-config that is also used for the prebuild workers: - -```ts -// webpack.config.js -const path = require('path'); -const TerserPlugin = require('terser-webpack-plugin'); -const projectRootPath = path.resolve( - __dirname, - '../../' // path from webpack-config to the root folder of the repo -); -const babelConfig = require(path.join(projectRootPath, 'babel.config')); -const baseDir = './dist/workers/'; // output path -module.exports = { - target: 'webworker', - entry: { - 'my-custom-worker': baseDir + 'my-custom-worker.js', - }, - output: { - filename: '[name].js', - clean: true, - path: path.resolve( - projectRootPath, - 'dist/workers' - ), - }, - mode: 'production', - module: { - rules: [ - { - test: /\.tsx?$/, - exclude: /(node_modules)/, - use: { - loader: 'babel-loader', - options: babelConfig - } - } - ], - }, - resolve: { - extensions: ['.tsx', '.ts', '.js', '.mjs', '.mts'] - }, - optimization: { - moduleIds: 'deterministic', - minimize: true, - minimizer: [new TerserPlugin({ - terserOptions: { - format: { - comments: false, - }, - }, - extractComments: false, - })], - } -}; -``` - -## One worker per database - -Each call to `getRxStorageWorker()` will create a different worker instance so that when you have more than one `RxDatabase`, each database will have its own JavaScript worker process. - -To reuse the worker instance in more than one `RxDatabase`, you can store the output of `getRxStorageWorker()` into a variable an use that one. Reusing the worker can decrease the initial page load, but you might get slower database operations. - -```ts -// Call getRxStorageWorker() exactly once -const workerStorage = getRxStorageWorker({ - workerInput: 'path/to/worker.js' -}); - -// use the same storage for both databases. -const databaseOne = await createRxDatabase({ - name: 'database-one', - storage: workerStorage -}); -const databaseTwo = await createRxDatabase({ - name: 'database-two', - storage: workerStorage -}); - -``` - -## Passing in a Worker instance - -Instead of setting an url as `workerInput`, you can also specify a function that returns a new `Worker` instance when called. - -```ts -getRxStorageWorker({ - workerInput: () => new Worker('path/to/worker.js') -}) -``` - -This can be helpful for environments where the worker is build dynamically by the bundler. For example in angular you would create a `my-custom.worker.ts` file that contains a custom build worker and then import it. - -```ts -const storage = getRxStorageWorker({ - workerInput: () => new Worker(new URL('./my-custom.worker', import.meta.url)), -}); -``` - -```ts -//> my-custom.worker.ts -import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; - -exposeWorkerRxStorage({ - storage: getRxStorageIndexedDB() -}); -``` diff --git a/docs/rx-storage.html b/docs/rx-storage.html deleted file mode 100644 index d73ff97c3c4..00000000000 --- a/docs/rx-storage.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - -⚙️ RxStorage Layer - Choose the Perfect RxDB Storage for Every Use Case | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxStorage

    -

    RxDB is not a self contained database. Instead the data is stored in an implementation of the RxStorage interface. This allows you to switch out the underlying data layer, depending on the JavaScript environment and performance requirements. For example you can use the SQLite storage for a capacitor app or you can use the LocalStorage RxStorage to store data in localstorage in a browser based application. There are also storages for other JavaScript runtimes like Node.js, React-Native, NativeScript and more.

    -

    Quick Recommendations

    - -

    Configuration Examples

    -

    The RxStorage layer of RxDB is very flexible. Here are some examples on how to configure more complex settings:

    -

    Storing much data in a browser securely

    -

    Lets say you build a browser app that needs to store a big amount of data as secure as possible. Here we can use a combination of the storages (encryption, IndexedDB, compression, schema-checks) that increase security and reduce the stored data size.

    -

    We use the schema-validation on the top level to ensure schema-errors are clearly readable and do not contain encrypted/compressed data. The encryption is used inside of the compression because encryption of compressed data is more efficient.

    -
    import { wrappedValidateAjvStorage } from 'rxdb/plugins/validate-ajv';
    -import { wrappedKeyCompressionStorage } from 'rxdb/plugins/key-compression';
    -import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js';
    -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb';
    - 
    -const myDatabase = await createRxDatabase({
    -    storage: wrappedValidateAjvStorage({
    -        storage: wrappedKeyCompressionStorage({
    -            storage: wrappedKeyEncryptionCryptoJsStorage({
    -                storage: getRxStorageIndexedDB()
    -            })
    -        })
    -    })
    -});
    -

    High query Load

    -

    Also we can utilize a combination of storages to create a database that is optimized to run complex queries on the data really fast. Here we use the sharding storage together with the worker storage. This allows to run queries in parallel multithreading instead of a single JavaScript process. Because the worker initialization can slow down the initial page load, we also use the localstorage-meta-optimizer to improve initialization time.

    -
    import { getRxStorageSharding } from 'rxdb-premium/plugins/storage-sharding';
    -import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker';
    -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb';
    -import { getLocalstorageMetaOptimizerRxStorage } from 'rxdb-premium/plugins/storage-localstorage-meta-optimizer';
    - 
    -const myDatabase = await createRxDatabase({
    -    storage: getLocalstorageMetaOptimizerRxStorage({
    -        storage: getRxStorageSharding({
    -            storage: getRxStorageWorker({
    -                workerInput: 'path/to/worker.js',
    -                storage: getRxStorageIndexedDB()
    -            })
    -        })
    -    })
    -});
    -

    Low Latency on Writes and Simple Reads

    -

    Here we create a storage configuration that is optimized to have a low latency on simple reads and writes. It uses the memory-mapped storage to fetch and store data in memory. For persistence the OPFS storage is used in the main thread which has lower latency for fetching big chunks of data when at initialization the data is loaded from disc into memory. We do not use workers because sending data from the main thread to workers and backwards would increase the latency.

    -
    import { getLocalstorageMetaOptimizerRxStorage } from 'rxdb-premium/plugins/storage-localstorage-meta-optimizer';
    -import { getMemoryMappedRxStorage } from 'rxdb-premium/plugins/storage-memory-mapped';
    -import { getRxStorageOPFSMainThread } from 'rxdb-premium/plugins/storage-worker';
    - 
    - 
    -const myDatabase = await createRxDatabase({
    -    storage: getLocalstorageMetaOptimizerRxStorage({
    -        storage: getMemoryMappedRxStorage({
    -            storage: getRxStorageOPFSMainThread()
    -        })
    -    })
    -});
    -

    All RxStorage Implementations List

    -

    Memory

    -

    A storage that stores the data in as plain data in the memory of the JavaScript process. Really fast and can be used in all environments. Read more

    -

    LocalStorage

    -

    The localstroage based storage stores the data inside of a browsers localStorage API. It is the easiest to set up and has a small bundle size. If you are new to RxDB, you should start with the LocalStorage RxStorage. Read more

    -

    👑 IndexedDB

    -

    The IndexedDB RxStorage is based on plain IndexedDB. For most use cases, this has the best performance together with the OPFS storage. Read more

    -

    👑 OPFS

    -

    The OPFS RxStorage is based on the File System Access API. This has the best performance of all other non-in-memory storage, when RxDB is used inside of a browser. Read more

    -

    👑 Filesystem Node

    -

    The Filesystem Node storage is best suited when you use RxDB in a Node.js process or with electron.js. Read more

    -

    Storage Wrapper Plugins

    -

    👑 Worker

    -

    The worker RxStorage is a wrapper around any other RxStorage which allows to run the storage in a WebWorker (in browsers) or a Worker Thread (in Node.js). By doing so, you can take CPU load from the main process and move it into the worker's process which can improve the perceived performance of your application. Read more

    -

    👑 SharedWorker

    -

    The worker RxStorage is a wrapper around any other RxStorage which allows to run the storage in a SharedWorker (only in browsers). By doing so, you can take CPU load from the main process and move it into the worker's process which can improve the perceived performance of your application. Read more

    -

    Remote

    -

    The Remote RxStorage is made to use a remote storage and communicate with it over an asynchronous message channel. The remote part could be on another JavaScript process or even on a different host machine. Mostly used internally in other storages like Worker or Electron-ipc. Read more

    -

    👑 Sharding

    -

    On some RxStorage implementations (like IndexedDB), a huge performance improvement can be done by sharding the documents into multiple database instances. With the sharding plugin you can wrap any other RxStorage into a sharded storage. Read more

    -

    👑 Memory Mapped

    -

    The memory-mapped RxStorage is a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance stores its data in an underlying storage for persistence. -The main reason to use this is to improve query/write performance while still having the data stored on disc. Read more

    -

    👑 Localstorage Meta Optimizer

    -

    The RxStorage Localstorage Meta Optimizer is a wrapper around any other RxStorage. The wrapper uses the original RxStorage for normal collection documents. But to optimize the initial page load time, it uses localstorage to store the plain key-value metadata that RxDB needs to create databases and collections. This plugin can only be used in browsers. Read more

    -

    Electron IpcRenderer & IpcMain

    -

    To use RxDB in electron, it is recommended to run the RxStorage in the main process and the RxDatabase in the renderer processes. With the rxdb electron plugin you can create a remote RxStorage and consume it from the renderer process. Read more

    -

    Third Party based Storages

    -

    👑 SQLite

    -

    The SQLite storage has great performance when RxDB is used on Node.js, Electron, React Native, Cordova or Capacitor. Read more

    -

    Dexie.js

    -

    The Dexie.js based storage is based on the Dexie.js IndexedDB wrapper library. Read more

    -

    MongoDB

    -

    To use RxDB on the server side, the MongoDB RxStorage provides a way of having a secure, scalable and performant storage based on the popular MongoDB NoSQL database Read more

    -

    DenoKV

    -

    To use RxDB in Deno. The DenoKV RxStorage provides a way of having a secure, scalable and performant storage based on the Deno Key Value Store. Read more

    -

    FoundationDB

    -

    To use RxDB on the server side, the FoundationDB RxStorage provides a way of having a secure, fault-tolerant and performant storage. Read more

    - - \ No newline at end of file diff --git a/docs/rx-storage.md b/docs/rx-storage.md deleted file mode 100644 index a97309fc308..00000000000 --- a/docs/rx-storage.md +++ /dev/null @@ -1,154 +0,0 @@ -# ⚙️ RxStorage Layer - Choose the Perfect RxDB Storage for Every Use Case - -> Discover how RxDB's modular RxStorage lets you swap engines and unlock top performance, no matter the environment or use case. - -# RxStorage - -RxDB is not a self contained database. Instead the data is stored in an implementation of the [RxStorage interface](https://github.com/pubkey/rxdb/blob/master/src/types/rx-storage.interface.d.ts). This allows you to **switch out** the underlying data layer, depending on the JavaScript environment and performance requirements. For example you can use the SQLite storage for a capacitor app or you can use the LocalStorage RxStorage to store data in localstorage in a browser based application. There are also storages for other JavaScript runtimes like Node.js, React-Native, NativeScript and more. - -## Quick Recommendations - -- In the Browser: Use the [LocalStorage](./rx-storage-localstorage.md) storage for simple setup and small build size. For bigger datasets, use either the [dexie.js storage](./rx-storage-dexie.md) (free) or the [IndexedDB RxStorage](./rx-storage-indexeddb.md) if you have [👑 premium access](/premium/) which is a bit faster and has a smaller build size. -- In [Electron](./electron-database.md) and [ReactNative](./react-native-database.md): Use the [SQLite RxStorage](./rx-storage-sqlite.md) if you have [👑 premium access](/premium/) or the [trial-SQLite RxStorage](./rx-storage-sqlite.md) for tryouts. -- In Capacitor: Use the [SQLite RxStorage](./rx-storage-sqlite.md) if you have [👑 premium access](/premium/), otherwise use the [localStorage](./rx-storage-localstorage.md) storage. - -## Configuration Examples - -The RxStorage layer of RxDB is very flexible. Here are some examples on how to configure more complex settings: - -### Storing much data in a browser securely - -Lets say you build a browser app that needs to store a big amount of data as secure as possible. Here we can use a combination of the storages (encryption, IndexedDB, compression, schema-checks) that increase security and reduce the stored data size. - -We use the schema-validation on the top level to ensure schema-errors are clearly readable and do not contain [encrypted](./encryption.md)/[compressed](./key-compression.md) data. The encryption is used inside of the compression because encryption of compressed data is more efficient. - -```ts -import { wrappedValidateAjvStorage } from 'rxdb/plugins/validate-ajv'; -import { wrappedKeyCompressionStorage } from 'rxdb/plugins/key-compression'; -import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; - -const myDatabase = await createRxDatabase({ - storage: wrappedValidateAjvStorage({ - storage: wrappedKeyCompressionStorage({ - storage: wrappedKeyEncryptionCryptoJsStorage({ - storage: getRxStorageIndexedDB() - }) - }) - }) -}); -``` - -### High query Load - -Also we can utilize a combination of storages to create a database that is optimized to run complex queries on the data really fast. Here we use the sharding storage together with the worker storage. This allows to run queries in parallel multithreading instead of a single JavaScript process. Because the worker initialization can slow down the initial page load, we also use the [localstorage-meta-optimizer](./rx-storage-localstorage-meta-optimizer.md) to improve initialization time. - -```ts -import { getRxStorageSharding } from 'rxdb-premium/plugins/storage-sharding'; -import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker'; -import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; -import { getLocalstorageMetaOptimizerRxStorage } from 'rxdb-premium/plugins/storage-localstorage-meta-optimizer'; - -const myDatabase = await createRxDatabase({ - storage: getLocalstorageMetaOptimizerRxStorage({ - storage: getRxStorageSharding({ - storage: getRxStorageWorker({ - workerInput: 'path/to/worker.js', - storage: getRxStorageIndexedDB() - }) - }) - }) -}); -``` - -### Low Latency on Writes and Simple Reads - -Here we create a storage configuration that is optimized to have a low latency on simple reads and writes. It uses the memory-mapped storage to fetch and store data in memory. For persistence the OPFS storage is used in the main thread which has lower latency for fetching big chunks of data when at initialization the data is loaded from disc into memory. We do not use workers because sending data from the main thread to workers and backwards would increase the latency. - -```ts -import { getLocalstorageMetaOptimizerRxStorage } from 'rxdb-premium/plugins/storage-localstorage-meta-optimizer'; -import { getMemoryMappedRxStorage } from 'rxdb-premium/plugins/storage-memory-mapped'; -import { getRxStorageOPFSMainThread } from 'rxdb-premium/plugins/storage-worker'; - -const myDatabase = await createRxDatabase({ - storage: getLocalstorageMetaOptimizerRxStorage({ - storage: getMemoryMappedRxStorage({ - storage: getRxStorageOPFSMainThread() - }) - }) -}); -``` - -## All RxStorage Implementations List - -### Memory - -A storage that stores the data in as plain data in the memory of the JavaScript process. Really fast and can be used in all environments. [Read more](./rx-storage-memory.md) - -### LocalStorage - -The localstroage based storage stores the data inside of a browsers [localStorage API](./articles/localstorage.md). It is the easiest to set up and has a small bundle size. **If you are new to RxDB, you should start with the LocalStorage RxStorage**. [Read more](./rx-storage-localstorage.md) - -### 👑 IndexedDB - -The IndexedDB `RxStorage` is based on plain IndexedDB. For most use cases, this has the best performance together with the OPFS storage. [Read more](./rx-storage-indexeddb.md) - -### 👑 OPFS - -The OPFS `RxStorage` is based on the File System Access API. This has the best performance of all other non-in-memory storage, when RxDB is used inside of a browser. [Read more](./rx-storage-opfs.md) - -### 👑 Filesystem Node - -The Filesystem Node storage is best suited when you use RxDB in a Node.js process or with [electron.js](./electron.md). [Read more](./rx-storage-filesystem-node.md) - -### Storage Wrapper Plugins - -#### 👑 Worker - -The worker RxStorage is a wrapper around any other RxStorage which allows to run the storage in a WebWorker (in browsers) or a Worker Thread (in Node.js). By doing so, you can take CPU load from the main process and move it into the worker's process which can improve the perceived performance of your application. [Read more](./rx-storage-worker.md) - -#### 👑 SharedWorker - -The worker RxStorage is a wrapper around any other RxStorage which allows to run the storage in a SharedWorker (only in browsers). By doing so, you can take CPU load from the main process and move it into the worker's process which can improve the perceived performance of your application. [Read more](./rx-storage-shared-worker.md) - -#### Remote -The Remote RxStorage is made to use a remote storage and communicate with it over an asynchronous message channel. The remote part could be on another JavaScript process or even on a different host machine. Mostly used internally in other storages like Worker or Electron-ipc. [Read more](./rx-storage-remote.md) - -#### 👑 Sharding - -On some `RxStorage` implementations (like IndexedDB), a huge performance improvement can be done by sharding the documents into multiple database instances. With the sharding plugin you can wrap any other `RxStorage` into a sharded storage. [Read more](./rx-storage-sharding.md) - -#### 👑 Memory Mapped - -The memory-mapped [RxStorage](./rx-storage.md) is a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance stores its data in an underlying storage for persistence. -The main reason to use this is to improve query/write performance while still having the data stored on disc. [Read more](./rx-storage-memory-mapped.md) - -#### 👑 Localstorage Meta Optimizer - -The [RxStorage](./rx-storage.md) Localstorage Meta Optimizer is a wrapper around any other RxStorage. The wrapper uses the original RxStorage for normal collection documents. But to optimize the initial page load time, it uses [localstorage](./articles/localstorage.md) to store the plain key-value metadata that RxDB needs to create databases and collections. This plugin can only be used in browsers. [Read more](./rx-storage-localstorage-meta-optimizer.md) - -#### Electron IpcRenderer & IpcMain - -To use RxDB in [electron](./electron-database.md), it is recommended to run the RxStorage in the main process and the RxDatabase in the renderer processes. With the rxdb electron plugin you can create a remote RxStorage and consume it from the renderer process. [Read more](./electron.md) - -### Third Party based Storages - -#### 👑 SQLite - -The SQLite storage has great performance when RxDB is used on **Node.js**, **Electron**, **React Native**, **Cordova** or **Capacitor**. [Read more](./rx-storage-sqlite.md) - -#### Dexie.js - -The Dexie.js based storage is based on the Dexie.js IndexedDB wrapper library. [Read more](./rx-storage-dexie.md) - -#### MongoDB - -To use RxDB on the server side, the MongoDB RxStorage provides a way of having a secure, scalable and performant storage based on the popular MongoDB NoSQL database [Read more](./rx-storage-mongodb.md) - -#### DenoKV - -To use RxDB in Deno. The DenoKV RxStorage provides a way of having a secure, scalable and performant storage based on the Deno Key Value Store. [Read more](./rx-storage-denokv.md) - -#### FoundationDB - -To use RxDB on the server side, the FoundationDB RxStorage provides a way of having a secure, fault-tolerant and performant storage. [Read more](./rx-storage-foundationdb.md) diff --git a/docs/rxdb-tradeoffs.html b/docs/rxdb-tradeoffs.html deleted file mode 100644 index 54232da763a..00000000000 --- a/docs/rxdb-tradeoffs.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - -RxDB Tradeoffs - Why NoSQL Triumphs on the Client | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    RxDB Tradeoffs

    -

    RxDB is client-side, offline first Database for JavaScript applications. -While RxDB could be used on the server side, most people use it on the client side together with an UI based application. -Therefore RxDB was optimized for client side applications and had to take completely different tradeoffs than what a server side database would do.

    -

    Why not SQL syntax

    -

    When you ask people which database they would want for browsers, the most answer I hear is something SQL based like SQLite. -This makes sense, SQL is a query language that most developers had learned in school/university and it is reusable across various database solutions. -But for RxDB (and other client side databases), using SQL is not a good option and instead it operates on document writes and the JSON based Mango-query syntax for querying.

    -
    // A Mango Query
    -const query = {
    -    selector: {
    -        age: {
    -            $gt: 10
    -        },
    -        lastName: 'foo'
    -    },
    -    sort: [{ age: 'asc' }]
    -};
    -

    SQL is made for database servers

    -

    SQL is made to be used to run operations against a database server. You send a SQL string like SELECT SUM(column_name)... to the database server and the server then runs all operations required to calculate the result and only send back that result. -This saves performance on the application side and ensures that the application itself is not blocked.

    -

    But RxDB is a client-side database that runs inside of the application. There is no performance difference if the SUM() query is run inside of the database or at the application level where a Array.reduce() call calculates the result.

    -

    Typescript support

    -

    SQL is string based and therefore you need additional IDE tooling to ensure that your written database code is valid. -Using the Mango Query syntax instead, TypeScript can be used validate the queries and to autocomplete code and knows which fields do exist and which do not. By doing so, the correctness of queries can be ensured at compile-time instead of run-time.

    -

    TypeScript Query Validation

    -

    Composeable queries

    -

    By using JSON based Mango Queries, it is easy to compose queries in plain JavaScript. -For example if you have any given query and want to add the condition user MUST BE 'foobar', you can just add the condition to the selector without having to parse and understand a complex SQL string.

    -
    query.selector.user = 'foobar';
    -

    Even merging the selectors of multiple queries is not a problem:

    -
    queryA.selector = {
    -    $and: [
    -        queryA.selector,
    -        queryB.selector
    -    ]
    -};
    -

    Why Document based (NoSQL)

    -

    Like other NoSQL databases, RxDB operates data on document level. It has no concept of tables, rows and columns. Instead we have collections, documents and fields.

    -

    Javascript is made to work with objects

    -

    Caching

    -

    EventReduce

    -

    Easier to use with typescript

    -

    Because of the document based approach, TypeScript can know the exact type of the query response while a SQL query could return anything from a number over a set of rows or a complex construct.

    -

    Why no transactions

    -
      -
    • Does not work with offline-first
    • -
    • Does not work with multi-tab
    • -
    • Easier conflict handling on document level
    • -
    -

    -- Instead of transactions, rxdb works with revisions

    -

    Why no relations

    -
      -
    • Does not work with easy replication
    • -
    -

    Why is a schema required

    -
      -
    • migration of data on clients is hard
    • -
    • Why jsonschema
    • -
    -

    - - \ No newline at end of file diff --git a/docs/rxdb-tradeoffs.md b/docs/rxdb-tradeoffs.md deleted file mode 100644 index 021b0a7b0f4..00000000000 --- a/docs/rxdb-tradeoffs.md +++ /dev/null @@ -1,94 +0,0 @@ -# RxDB Tradeoffs - Why NoSQL Triumphs on the Client - -> Uncover RxDB's approach to modern database needs. From JSON-based queries to conflict handling without transactions, learn RxDB's unique tradeoffs. - -# RxDB Tradeoffs - -[RxDB](https://rxdb.info) is client-side, [offline first](./offline-first.md) Database for JavaScript applications. -While RxDB could be used on the server side, most people use it on the client side together with an UI based application. -Therefore RxDB was optimized for client side applications and had to take completely different tradeoffs than what a server side database would do. - -## Why not SQL syntax - -When you ask people which database they would want for browsers, the most answer I hear is *something SQL based like SQLite*. -This makes sense, SQL is a query language that most developers had learned in school/university and it is reusable across various database solutions. -But for RxDB (and other client side databases), using SQL is not a good option and instead it operates on document writes and the JSON based **Mango-query** syntax for querying. - -```ts -// A Mango Query -const query = { - selector: { - age: { - $gt: 10 - }, - lastName: 'foo' - }, - sort: [{ age: 'asc' }] -}; -``` - -### SQL is made for database servers - -SQL is made to be used to run operations against a database server. You send a SQL string like ```SELECT SUM(column_name)...``` to the database server and the server then runs all operations required to calculate the result and only send back that result. -This saves performance on the application side and ensures that the application itself is not blocked. - -But RxDB is a client-side database that runs **inside** of the application. There is no performance difference if the `SUM()` query is run inside of the database or at the application level where a `Array.reduce()` call calculates the result. - -### Typescript support - -SQL is `string` based and therefore you need additional IDE tooling to ensure that your written database code is valid. -Using the Mango Query syntax instead, TypeScript can be used validate the queries and to autocomplete code and knows which fields do exist and which do not. By doing so, the correctness of queries can be ensured at compile-time instead of run-time. - - - -### Composeable queries - -By using JSON based Mango Queries, it is easy to compose queries in plain JavaScript. -For example if you have any given query and want to add the condition `user MUST BE 'foobar'`, you can just add the condition to the selector without having to parse and understand a complex SQL string. - -```ts -query.selector.user = 'foobar'; -``` - -Even merging the selectors of multiple queries is not a problem: - -```ts -queryA.selector = { - $and: [ - queryA.selector, - queryB.selector - ] -}; -``` - -## Why Document based (NoSQL) - -Like other NoSQL databases, RxDB operates data on document level. It has no concept of tables, rows and columns. Instead we have collections, documents and fields. - -### Javascript is made to work with objects -### Caching - -### EventReduce - -### Easier to use with typescript - -Because of the document based approach, TypeScript can know the exact type of the query response while a SQL query could return anything from a number over a set of rows or a complex construct. - -## Why no transactions - -- Does not work with offline-first -- Does not work with multi-tab -- Easier conflict handling on document level - --- Instead of transactions, rxdb works with revisions - -## Why no relations - -- Does not work with easy replication - -## Why is a schema required - -- migration of data on clients is hard -- Why jsonschema - -## diff --git a/docs/schema-validation.html b/docs/schema-validation.html deleted file mode 100644 index 7c524573722..00000000000 --- a/docs/schema-validation.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - -Schema Validation | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Schema validation

    -

    RxDB has multiple validation implementations that can be used to ensure that your document data is always matching the provided JSON -schema of your RxCollection.

    -

    The schema validation is not a plugin but comes in as a wrapper around any other RxStorage and it will then validate all data that is written into that storage. This is required for multiple reasons:

    -
      -
    • It allows us to run the validation inside of a Worker RxStorage instead of running it in the main JavaScript process.
    • -
    • It allows us to configure which RxDatabase instance must use the validation and which does not. In production it often makes sense to validate user data, but you might not need the validation for data that is only replicated from the backend.
    • -
    -
    warning

    Schema validation can be CPU expensive and increases your build size. You should always use a schema validation in development mode. For most use cases, you should not use a validation in production for better performance.

    -

    When no validation is used, any document data can be saved but there might be undefined behavior when saving data that does not comply to the schema of a RxCollection.

    -

    RxDB has different implementations to validate data, each of them is based on a different JSON Schema library. In this example we use the LocalStorage RxStorage, but you can wrap the validation around any other RxStorage.

    -

    validate-ajv

    -

    A validation-module that does the schema-validation. This one is using ajv as validator which is a bit faster. Better compliant to the jsonschema-standard but also has a bigger build-size.

    -
    import { wrappedValidateAjvStorage } from 'rxdb/plugins/validate-ajv';
    -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
    - 
    -// wrap the validation around the main RxStorage
    -const storage = wrappedValidateAjvStorage({
    -    storage: getRxStorageLocalstorage()
    -});
    - 
    -const db = await createRxDatabase({
    -    name: randomCouchString(10),
    -    storage
    -});
    -

    validate-z-schema

    -

    Both is-my-json-valid and validate-ajv use eval() to perform validation which might not be wanted when 'unsafe-eval' is not allowed in Content Security Policies. This one is using z-schema as validator which doesn't use eval.

    -
    import { wrappedValidateZSchemaStorage } from 'rxdb/plugins/validate-z-schema';
    -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
    - 
    -// wrap the validation around the main RxStorage
    -const storage = wrappedValidateZSchemaStorage({
    -    storage: getRxStorageLocalstorage()
    -});
    - 
    -const db = await createRxDatabase({
    -    name: randomCouchString(10),
    -    storage
    -});
    -

    validate-is-my-json-valid

    -

    WARNING: The is-my-json-valid validation is no longer supported until this bug is fixed.

    -

    The validate-is-my-json-valid plugin uses is-my-json-valid for schema validation.

    -
    import { wrappedValidateIsMyJsonValidStorage } from 'rxdb/plugins/validate-is-my-json-valid';
    -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage';
    - 
    -// wrap the validation around the main RxStorage
    -const storage = wrappedValidateIsMyJsonValidStorage({
    -    storage: getRxStorageLocalstorage()
    -});
    - 
    -const db = await createRxDatabase({
    -    name: randomCouchString(10),
    -    storage
    -});
    -

    Custom Formats

    -

    The schema validators provide methods to add custom formats like a email format. -You have to add these formats before you create your database.

    -

    Ajv Custom Format

    -
    import { getAjv } from 'rxdb/plugins/validate-ajv';
    -const ajv = getAjv();
    -ajv.addFormat('email', {
    -    type: 'string',
    -    validate: v => v.includes('@') // ensure email fields contain the @ symbol
    -});
    -

    Z-Schema Custom Format

    -
    import { ZSchemaClass } from 'rxdb/plugins/validate-z-schema';
    -ZSchemaClass.registerFormat('email', function (v: string) {
    -    return v.includes('@'); // ensure email fields contain the @ symbol
    -});
    -

    Performance comparison of the validators

    -

    The RxDB team ran performance benchmarks using two storage options on an Ubuntu 24.04 machine with Chrome version 131.0.6778.85. The testing machine has 32 core 13th Gen Intel(R) Core(TM) i9-13900HX CPU.

    -

    IndexedDB Storage (based on the IndexedDB API in the browser):

    -
    IndexedDB StorageTime to First insertInsert 3000 documents
    no validator68 ms213 ms
    ajv67 ms216 ms
    z-schema71 ms230 ms
    -

    Memory Storage: stores everything in memory for extremely fast reads and writes, with no persistence by default. Often used with the RxDB memory-mapped plugin that processes data in memory an later persists to disc in background:

    -
    Memory StorageTime to First insertInsert 3000 documents
    no validator1.15 ms0.8 ms
    ajv3.05 ms2.7 ms
    z-schema0.9 ms18 ms
    -

    Including a validator library also increases your JavaScript bundle size. Here's how it breaks down (minified + gzip):

    -
    Build Size (minified+gzip)Build Size (IndexedDB)Build Size (memory)
    no validator73103 B39976 B
    ajv106135 B72773 B
    z-schema125186 B91882 B
    - - \ No newline at end of file diff --git a/docs/schema-validation.md b/docs/schema-validation.md deleted file mode 100644 index f0b214eee40..00000000000 --- a/docs/schema-validation.md +++ /dev/null @@ -1,133 +0,0 @@ -# Schema Validation - -> RxDB has multiple validation implementations that can be used to ensure that your document data is always matching the provided JSON -schema of your `RxCollection`. - -# Schema validation - -RxDB has multiple validation implementations that can be used to ensure that your document data is always matching the provided JSON -schema of your `RxCollection`. - -The schema validation is **not a plugin** but comes in as a wrapper around any other `RxStorage` and it will then validate all data that is written into that storage. This is required for multiple reasons: -- It allows us to run the validation inside of a [Worker RxStorage](./rx-storage-worker.md) instead of running it in the main JavaScript process. -- It allows us to configure which `RxDatabase` instance must use the validation and which does not. In production it often makes sense to validate user data, but you might not need the validation for data that is only replicated from the backend. - -:::warning -Schema validation can be **CPU expensive** and increases your build size. You should always use a schema validation in development mode. For most use cases, you **should not** use a validation in production for better performance. -::: - -When no validation is used, any document data can be saved but there might be **undefined behavior** when saving data that does not comply to the schema of a `RxCollection`. - -RxDB has different implementations to validate data, each of them is based on a different [JSON Schema library](https://json-schema.org/tools). In this example we use the [LocalStorage RxStorage](./rx-storage-localstorage.md), but you can wrap the validation around **any other** [RxStorage](./rx-storage.md). - -### validate-ajv - -A validation-module that does the schema-validation. This one is using [ajv](https://github.com/epoberezkin/ajv) as validator which is a bit faster. Better compliant to the jsonschema-standard but also has a bigger build-size. - -```javascript -import { wrappedValidateAjvStorage } from 'rxdb/plugins/validate-ajv'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -// wrap the validation around the main RxStorage -const storage = wrappedValidateAjvStorage({ - storage: getRxStorageLocalstorage() -}); - -const db = await createRxDatabase({ - name: randomCouchString(10), - storage -}); -``` - -### validate-z-schema - -Both `is-my-json-valid` and `validate-ajv` use `eval()` to perform validation which might not be wanted when `'unsafe-eval'` is not allowed in Content Security Policies. This one is using [z-schema](https://github.com/zaggino/z-schema) as validator which doesn't use `eval`. - -```javascript -import { wrappedValidateZSchemaStorage } from 'rxdb/plugins/validate-z-schema'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -// wrap the validation around the main RxStorage -const storage = wrappedValidateZSchemaStorage({ - storage: getRxStorageLocalstorage() -}); - -const db = await createRxDatabase({ - name: randomCouchString(10), - storage -}); -``` - -### validate-is-my-json-valid - -**WARNING**: The `is-my-json-valid` validation is no longer supported until [this bug](https://github.com/mafintosh/is-my-json-valid/pull/192) is fixed. - -The `validate-is-my-json-valid` plugin uses [is-my-json-valid](https://www.npmjs.com/package/is-my-json-valid) for schema validation. - -```javascript -import { wrappedValidateIsMyJsonValidStorage } from 'rxdb/plugins/validate-is-my-json-valid'; -import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; - -// wrap the validation around the main RxStorage -const storage = wrappedValidateIsMyJsonValidStorage({ - storage: getRxStorageLocalstorage() -}); - -const db = await createRxDatabase({ - name: randomCouchString(10), - storage -}); -``` - -## Custom Formats - -The schema validators provide methods to add custom formats like a `email` format. -You have to add these formats **before** you create your database. - -### Ajv Custom Format - -```ts -import { getAjv } from 'rxdb/plugins/validate-ajv'; -const ajv = getAjv(); -ajv.addFormat('email', { - type: 'string', - validate: v => v.includes('@') // ensure email fields contain the @ symbol -}); -``` - -### Z-Schema Custom Format - -```ts -import { ZSchemaClass } from 'rxdb/plugins/validate-z-schema'; -ZSchemaClass.registerFormat('email', function (v: string) { - return v.includes('@'); // ensure email fields contain the @ symbol -}); -``` - -## Performance comparison of the validators - -The RxDB team ran performance benchmarks using two storage options on an Ubuntu 24.04 machine with Chrome version `131.0.6778.85`. The testing machine has 32 core `13th Gen Intel(R) Core(TM) i9-13900HX` CPU. - -IndexedDB Storage (based on the IndexedDB API in the browser): - -| **IndexedDB Storage** | Time to First insert | Insert 3000 documents | -| ----------------- | :------------------: | --------------------: | -| no validator | 68 ms | 213 ms | -| ajv | 67 ms | 216 ms | -| z-schema | 71 ms | 230 ms | - -Memory Storage: stores everything in memory for extremely fast reads and writes, with no persistence by default. Often used with the RxDB memory-mapped plugin that processes data in memory an later persists to disc in background: - -| **Memory Storage** | Time to First insert | Insert 3000 documents | -| ------------------ | :------------------: | --------------------: | -| no validator | 1.15 ms | 0.8 ms | -| ajv | 3.05 ms | 2.7 ms | -| z-schema | 0.9 ms | 18 ms | - -Including a validator library also increases your JavaScript bundle size. Here's how it breaks down (minified + gzip): - -| **Build Size** (minified+gzip) | Build Size (IndexedDB) | Build Size (memory) | -| ------------------------------ | :----------------: | ------------------: | -| no validator | 73103 B | 39976 B | -| ajv | 106135 B | 72773 B | -| z-schema | 125186 B | 91882 B | diff --git a/docs/search-doc-1769435561373.json b/docs/search-doc-1769435561373.json deleted file mode 100644 index bd3a87f577b..00000000000 --- a/docs/search-doc-1769435561373.json +++ /dev/null @@ -1 +0,0 @@ -{"searchDocs":[{"title":"PouchDB Adapters","type":0,"sectionRef":"#","url":"/adapters.html","content":"","keywords":"","version":"Next"},{"title":"Memory​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#memory","content":" In any environment, you can use the memory-adapter. It stores the data in the javascript runtime memory. This means it is not persistent and the data is lost when the process terminates. Use this adapter when: You want to have really good performanceYou do not want persistent state, for example in your test suite import { createRxDatabase } from 'rxdb' import { getRxStoragePouch } from 'rxdb/plugins/pouchdb'; // npm install pouchdb-adapter-memory --save addPouchPlugin(require('pouchdb-adapter-memory')); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch('memory') }); ","version":"Next","tagName":"h2"},{"title":"Memdown​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#memdown","content":" With RxDB you can also use adapters that implement abstract-leveldown like the memdown-adapter. // npm install memdown --save // npm install pouchdb-adapter-leveldb --save addPouchPlugin(require('pouchdb-adapter-leveldb')); // leveldown adapters need the leveldb plugin to work const memdown = require('memdown'); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch(memdown) // the full leveldown-module }); Browser ","version":"Next","tagName":"h2"},{"title":"IndexedDB​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#indexeddb","content":" The IndexedDB adapter stores the data inside of IndexedDB use this in browsers environments as default. // npm install pouchdb-adapter-idb --save addPouchPlugin(require('pouchdb-adapter-idb')); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch('idb') }); ","version":"Next","tagName":"h2"},{"title":"IndexedDB​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#indexeddb-1","content":" A reimplementation of the indexeddb adapter which uses native secondary indexes. Should have a much better performance but can behave different on some edge cases. note Multiple users have reported problems with this adapter. It is not recommended to use this adapter. // npm install pouchdb-adapter-indexeddb --save addPouchPlugin(require('pouchdb-adapter-indexeddb')); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch('indexeddb') }); ","version":"Next","tagName":"h2"},{"title":"Websql​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#websql","content":" This adapter stores the data inside of websql. It has a different performance behavior. Websql is deprecated. You should not use the websql adapter unless you have a really good reason. // npm install pouchdb-adapter-websql --save addPouchPlugin(require('pouchdb-adapter-websql')); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch('websql') }); NodeJS ","version":"Next","tagName":"h2"},{"title":"leveldown​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#leveldown","content":" This adapter uses a LevelDB C++ binding to store that data on the filesystem. It has the best performance compared to other filesystem adapters. This adapter can not be used when multiple nodejs-processes access the same filesystem folders for storage. // npm install leveldown --save // npm install pouchdb-adapter-leveldb --save addPouchPlugin(require('pouchdb-adapter-leveldb')); // leveldown adapters need the leveldb plugin to work const leveldown = require('leveldown'); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch(leveldown) // the full leveldown-module }); // or use a specific folder to store the data const database = await createRxDatabase({ name: '/root/user/project/mydatabase', storage: getRxStoragePouch(leveldown) // the full leveldown-module }); ","version":"Next","tagName":"h2"},{"title":"Node-Websql​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#node-websql","content":" This adapter uses the node-websql-shim to store data on the filesystem. Its advantages are that it does not need a leveldb build and it can be used when multiple nodejs-processes use the same database-files. // npm install pouchdb-adapter-node-websql --save addPouchPlugin(require('pouchdb-adapter-node-websql')); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch('websql') // the name of your adapter }); // or use a specific folder to store the data const database = await createRxDatabase({ name: '/root/user/project/mydatabase', storage: getRxStoragePouch('websql') // the name of your adapter }); React-Native ","version":"Next","tagName":"h2"},{"title":"react-native-sqlite​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#react-native-sqlite","content":" Uses ReactNative SQLite as storage. Claims to be much faster than the asyncstorage adapter. To use it, you have to do some steps from this tutorial. First install pouchdb-adapter-react-native-sqlite and react-native-sqlite-2. npm install pouchdb-adapter-react-native-sqlite react-native-sqlite-2 Then you have to link the library. react-native link react-native-sqlite-2 You also have to add some polyfills which are need but not included in react-native. npm install base-64 events import { decode, encode } from 'base-64' if (!global.btoa) { global.btoa = encode; } if (!global.atob) { global.atob = decode; } // Avoid using node dependent modules process.browser = true; Then you can use it inside of your code. import { createRxDatabase } from 'rxdb'; import { addPouchPlugin, getRxStoragePouch } from 'rxdb/plugins/pouchdb'; import SQLite from 'react-native-sqlite-2' import SQLiteAdapterFactory from 'pouchdb-adapter-react-native-sqlite' const SQLiteAdapter = SQLiteAdapterFactory(SQLite) addPouchPlugin(SQLiteAdapter); addPouchPlugin(require('pouchdb-adapter-http')); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch('react-native-sqlite') // the name of your adapter }); ","version":"Next","tagName":"h2"},{"title":"asyncstorage​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#asyncstorage","content":" Uses react-native's asyncstorage. note There are known problems with this adapter and it is not recommended to use it. // npm install pouchdb-adapter-asyncstorage --save addPouchPlugin(require('pouchdb-adapter-asyncstorage')); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch('node-asyncstorage') // the name of your adapter }); ","version":"Next","tagName":"h2"},{"title":"asyncstorage-down​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#asyncstorage-down","content":" A leveldown adapter that stores on asyncstorage. // npm install pouchdb-adapter-asyncstorage-down --save addPouchPlugin(require('pouchdb-adapter-leveldb')); // leveldown adapters need the leveldb plugin to work const asyncstorageDown = require('asyncstorage-down'); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch(asyncstorageDown) // the full leveldown-module }); Cordova / Phonegap / Capacitor ","version":"Next","tagName":"h2"},{"title":"cordova-sqlite​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#cordova-sqlite","content":" Uses cordova's global cordova.sqlitePlugin. It can be used with cordova and capacitor. // npm install pouchdb-adapter-cordova-sqlite --save addPouchPlugin(require('pouchdb-adapter-cordova-sqlite')); /** * In capacitor/cordova you have to wait until all plugins are loaded and 'window.sqlitePlugin' * can be accessed. * This function waits until document deviceready is called which ensures that everything is loaded. * @link https://cordova.apache.org/docs/de/latest/cordova/events/events.deviceready.html */ export function awaitCapacitorDeviceReady(): Promise<void> { return new Promise(res => { document.addEventListener('deviceready', () => { res(); }); }); } async function getDatabase(){ // first wait until the deviceready event is fired await awaitCapacitorDeviceReady(); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch( 'cordova-sqlite', // pouch settings are passed as second parameter { // for ios devices, the cordova-sqlite adapter needs to know where to save the data. iosDatabaseLocation: 'Library' } ) }); } ","version":"Next","tagName":"h2"},{"title":"Alternatives for realtime offline-first JavaScript applications","type":0,"sectionRef":"#","url":"/alternatives.html","content":"","keywords":"","version":"Next"},{"title":"Alternatives to RxDB​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#alternatives-to-rxdb","content":" RxDB is an observable, replicating, local first, JavaScript database. So it makes only sense to list similar projects as alternatives, not just any database or JavaScript store library. However, I will list up some projects that RxDB is often compared with, even if it only makes sense for some use cases. Here are the alternatives to RxDB: ","version":"Next","tagName":"h2"},{"title":"Firebase​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#firebase","content":" Firebase is a platform developed by Google for creating mobile and web applications. Firebase has many features and products, two of which are client side databases. The Realtime Database and the Cloud Firestore. Firebase - Realtime Database​ The firebase realtime database was the first database in firestore. It has to be mentioned that in this context, "realtime" means "realtime replication", not "realtime computing". The firebase realtime database stores data as a big unstructured JSON tree that is replicated between clients and the backend. Firebase - Cloud Firestore​ The firestore is the successor to the realtime database. The big difference is that it behaves more like a 'normal' database that stores data as documents inside of collections. The conflict resolution strategy of firestore is always last-write-wins which might or might not be suitable for your use case. The biggest difference to RxDB is that firebase products are only able to be used on top of the Firebase cloud hosted backend, which creates a vendor lock-in. RxDB can replicate with any self hosted CouchDB server or custom GraphQL endpoints. You can even replicate Firestore to RxDB with the Firestore Replication Plugin. ","version":"Next","tagName":"h3"},{"title":"Meteor​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#meteor","content":" Meteor (since 2012) is one of the oldest technologies for JavaScript realtime applications. Meteor is not a library but a whole framework with its own package manager, database management and replication. Because of how it works, it has proven to be hard to integrate it with other modern JavaScript frameworks like angular, vue.js or svelte. Meteor uses MongoDB in the backend and can replicate with a Minimongo database in the frontend. While testing, it has proven to be impossible to make a meteor app offline first capable. There are some projects that might do this, but all are unmaintained. ","version":"Next","tagName":"h3"},{"title":"Minimongo​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#minimongo","content":" Forked in Jan 2014 from meteorJSs' minimongo package, Minimongo is a client-side, in-memory, JavaScript version of MongoDB with backend replication over HTTP. Similar to MongoDB, it stores data in documents inside of collections and also has the same query syntax. Minimongo has different storage adapters for IndexedDB, WebSQL, LocalStorage and SQLite. Compared to RxDB, Minimongo has no concept of revisions or conflict handling, which might lead to undefined behavior when used with replication or in multiple browser tabs. Minimongo has no observable queries or changestream. ","version":"Next","tagName":"h3"},{"title":"WatermelonDB​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#watermelondb","content":" WatermelonDB is a reactive & asynchronous JavaScript database. While originally made for React and React Native, it can also be used with other JavaScript frameworks. The main goal of WatermelonDB is performance within an application with lots of data. In React Native, WatermelonDB uses the provided SQLite database. Also there is an Expo plugin for WatermelonDB. In a browser, WatermelonDB uses the LokiJS in-memory database to store and query data. WatermelonDB is one of the rare projects that support both Flow and Typescript at the same time. ","version":"Next","tagName":"h3"},{"title":"AWS Amplify​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#aws-amplify","content":" AWS Amplify is a collection of tools and libraries to develop web- and mobile frontend applications. Similar to firebase, it provides everything needed like authentication, analytics, a REST API, storage and so on. Everything hosted in the AWS Cloud, even when they state that "AWS Amplify is designed to be open and pluggable for any custom backend or service". For realtime replication, AWS Amplify can connect to an AWS App-Sync GraphQL endpoint. ","version":"Next","tagName":"h3"},{"title":"AWS Datastore​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#aws-datastore","content":" Since December 2019 the Amplify library includes the AWS Datastore which is a document-based, client side database that is able to replicate data via AWS AppSync in the background. The main difference to other projects is the complex project configuration via the amplify cli and the bit confusing query syntax that works over functions. Complex Queries with multiple OR/AND statements are not possible which might change in the future. Local development is hard because the AWS AppSync mock does not support realtime replication. It also is not really offline-first because a user login is always required. // An AWS datastore OR query const posts = await DataStore.query(Post, c => c.or( c => c.rating("gt", 4).status("eq", PostStatus.PUBLISHED) )); // An AWS datastore SORT query const posts = await DataStore.query(Post, Predicates.ALL, { sort: s => s.rating(SortDirection.ASCENDING).title(SortDirection.DESCENDING) }); The biggest difference to RxDB is that you have to use the AWS cloud backends. This might not be a problem if your data is at AWS anyway. ","version":"Next","tagName":"h3"},{"title":"RethinkDB​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#rethinkdb","content":" RethinkDB is a backend database that pushed dynamic JSON data to the client in realtime. It was founded in 2009 and the company shut down in 2016. Rethink db is not a client side database, it streams data from the backend to the client which of course does not work while offline. ","version":"Next","tagName":"h3"},{"title":"Horizon​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#horizon","content":" Horizon is the client side library for RethinkDB which provides useful functions like authentication, permission management and subscription to a RethinkDB backend. Offline support never made it to horizon. ","version":"Next","tagName":"h3"},{"title":"Supabase​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#supabase","content":" Supabase labels itself as "an open source Firebase alternative". It is a collection of open source tools that together mimic many Firebase features, most of them by providing a wrapper around a PostgreSQL database. While it has realtime queries that run over the wire, like with RethinkDB, Supabase has no client-side storage or replication feature and therefore is not offline first. ","version":"Next","tagName":"h3"},{"title":"CouchDB​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#couchdb","content":" Apache CouchDB is a server-side, document-oriented database that is mostly known for its multi-master replication feature. Instead of having a master-slave replication, with CouchDB you can run replication in any constellation without having a master server as bottleneck where the server even can go off- and online at any time. This comes with the drawback of having a slow replication with much network overhead. CouchDB has a changestream and a query syntax similar to MongoDB. ","version":"Next","tagName":"h3"},{"title":"PouchDB​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#pouchdb","content":" PouchDB is a JavaScript database that is compatible with most of the CouchDB API. It has an adapter system that allows you to switch out the underlying storage layer. There are many adapters like for IndexedDB, SQLite, the Filesystem and so on. The main benefit is to be able to replicate data with any CouchDB compatible endpoint. Because of the CouchDB compatibility, PouchDB has to do a lot of overhead in handling the revision tree of document, which is why it can show bad performance for bigger datasets. RxDB was originally build around PouchDB until the storage layer was abstracted out in version 10.0.0 so it now allows to use different RxStorage implementations. PouchDB has some performance issues because of how it has to store the document revision tree to stay compatible with the CouchDB API. ","version":"Next","tagName":"h3"},{"title":"Couchbase​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#couchbase","content":" Couchbase (originally known as Membase) is another NoSQL document database made for realtime applications. It uses the N1QL query language which is more SQL like compared to other NoSQL query languages. In theory you can achieve replication of a Couchbase with a PouchDB database, but this has shown to be not that easy. ","version":"Next","tagName":"h3"},{"title":"Cloudant​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#cloudant","content":" Cloudant is a cloud-based service that is based on CouchDB and has mostly the same features. It was originally designed for cloud computing where data can automatically be distributed between servers. But it can also be used to replicate with frontend PouchDB instances to create scalable web applications. It was bought by IBM in 2014 and since 2018 the Cloudant Shared Plan is retired and migrated to IBM Cloud. ","version":"Next","tagName":"h3"},{"title":"Hoodie​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#hoodie","content":" Hoodie is a backend solution that enables offline-first JavaScript frontend development without having to write backend code. Its main goal is to abstract away configuration into simple calls to the Hoodie API. It uses CouchDB in the backend and PouchDB in the frontend to enable offline-first capabilities. The last commit for hoodie was one year ago and the website (hood.ie) is offline which indicates it is not an active project anymore. ","version":"Next","tagName":"h3"},{"title":"LokiJS​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#lokijs","content":" LokiJS is a JavaScript embeddable, in-memory database. And because everything is handled in-memory, LokiJS has awesome performance when mutating or querying data. You can still persist to a permanent storage (IndexedDB, Filesystem etc.) with one of the provided storage adapters. The persistence happens after a timeout is reached after a write, or before the JavaScript process exits. This also means you could loose data when the JavaScript process exits ungracefully like when the power of the device is shut down or the browser crashes. While the project is not that active anymore, it is more finished than unmaintained. In the past, RxDB supported using LokiJS as RxStorage but because the LokiJS is not maintained anymore and had too many issues, this storage option was removed in RxDB version 16. ","version":"Next","tagName":"h3"},{"title":"Gundb​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#gundb","content":" GUN is a JavaScript graph database. While having many features, the decentralized replication is the main unique selling point. You can replicate data Peer-to-Peer without any centralized backend server. GUN has several other features that are useful on top of that, like encryption and authentication. While testing it was really hard to get basic things running. GUN is open source, but because of how the source code is written, it is very difficult to understand what is going wrong. ","version":"Next","tagName":"h3"},{"title":"sql.js​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#sqljs","content":" sql.js is a javascript library to run SQLite on the web. It uses a virtual database file stored in memory and does not have any persistence. All data is lost once the JavaScript process exits. sql.js is created by compiling SQLite to WebAssembly so it has about the same features as SQLite. For older browsers there is a JavaScript fallback. ","version":"Next","tagName":"h3"},{"title":"absurd-sQL​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#absurd-sql","content":" Absurd-sql is a project that implements an IndexedDB-based persistence for sql.js. Instead of directly writing data into the IndexedDB, it treats IndexedDB like a disk and stores data in blocks there which shows to have a much better performance, mostly because of how performance expensive IndexedDB transactions are. ","version":"Next","tagName":"h3"},{"title":"NeDB​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#nedb","content":" NeDB was a embedded persistent or in-memory database for Node.js, nw.js, Electron and browsers. It is document-oriented and had the same query syntax as MongoDB. Like LokiJS it has persistence adapters for IndexedDB etc. to persist the database state on the disc. The last commit to NeDB was in 2016. ","version":"Next","tagName":"h3"},{"title":"Dexie.js​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#dexiejs","content":" Dexie.js is a minimalistic wrapper for IndexedDB. While providing a better API than plain IndexedDB, Dexie also improves performance by batching transactions and other optimizations. It also adds additional non-IndexedDB features like observable queries or multi tab support or react hooks. Compared to RxDB, Dexie.js does not support complex (MongoDB-like) queries and requires a lot of fiddling when a document range of a specific index must be fetched. Dexie.js is used by Whatsapp Web, Microsoft To Do and Github Desktop. RxDB supports using Dexie.js as Database storage which enhances IndexedDB via dexie with RxDB features like MongoDB-like queries etc. ","version":"Next","tagName":"h3"},{"title":"LowDB​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#lowdb","content":" LowDB is a small, local JSON database powered by the Lodash library. It is designed to be simple, easy to use, and straightforward. LowDB allows you to perform native JavaScript queries and persist data in a flat JSON file. Written in TypeScript, it's particularly well-suited for small projects, prototyping, or when you need a lightweight, file-based database. As an alternative to LowDB, RxDB offers real-time reactivity, allowing developers to subscribe to database changes, a feature not natively available in LowDB. Additionally, RxDB provides robust query capabilities, including the ability to subscribe to query results for automatic UI updates. These features make RxDB a strong alternative to LowDB for more complex and dynamic applications. ","version":"Next","tagName":"h3"},{"title":"localForage​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#localforage","content":" localForage is a popular JavaScript library for offline storage that provides a simple, promise-based API. It abstracts over different storage mechanisms such as IndexedDB, WebSQL, or localStorage, making it easier to write code once and have it work seamlessly across various browsers. While localForage is great for storing data locally in a key-value manner, it doesn't provide the real-time reactive queries, conflict handling, or revision-based replication that RxDB does. This makes localForage a useful choice for straightforward caching or persistent storage needs, but not ideal for advanced offline-first scenarios requiring multi-user collaboration or complex querying. ","version":"Next","tagName":"h3"},{"title":"MongoDB Realm​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#mongodb-realm","content":" Originally Realm was a mobile database for Android and iOS. Later they added support for other languages and runtimes, also for JavaScript. It was meant as replacement for SQLite but is more like an object store than a full SQL database. In 2019 MongoDB bought Realm and changed the projects focus. Now Realm is made for replication with the MongoDB Realm Sync based on the MongoDB Atlas Cloud platform. This tight coupling to the MongoDB cloud service is a big downside for most use cases. ","version":"Next","tagName":"h3"},{"title":"Apollo​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#apollo","content":" The Apollo GraphQL platform is made to transfer data between a server to UI applications over GraphQL endpoints. It contains several tools like GraphQL clients in different languages or libraries to create GraphQL endpoints. While it is has different caching features for offline usage, compared to RxDB it is not fully offline first because caching alone does not mean your application is fully usable when the user is offline. ","version":"Next","tagName":"h3"},{"title":"Replicache​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#replicache","content":" Replicache is a client-side sync framework for building realtime, collaborative, local-first web apps. It claims to work with most backend stacks. In contrast to other local first tools, replicache does not work like a local database. Instead it runs on so called mutators that unify behavior on the client and server side. So instead of implementing and calling REST routes on both sides of your stack, you will implement mutators that define a specific delta behavior based on the input data. To observe data in replicache, there are subscriptions that notify your frontend application about changes to the state. Replicache can be used in most frontend technologies like browsers, React/Remix, NextJS/Vercel and React Native. While Replicache can be installed and used from npm, the Replicache source code is not open source and the Replicache github repo does not allow you to inspect or debug it. Still you can use replicache for in non-commercial projects, or for companies with < $200k revenue (ARR) and < $500k in funding. (2024: Replicache will be free and Rocicorp are working on a new Zerosync product to succeed Replicache and Reflect.) ","version":"Next","tagName":"h3"},{"title":"InstantDB​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#instantdb","content":" InstantDB is designed for real-time data synchronization with built-in offline support, allowing changes to be queued locally and synced when the user reconnects. While it offers seamless optimistic updates and rollback capabilities, its offline-first design is not as mature or comprehensive as RxDB's - the offline data is more of a cache, not a full-database sync. The query language used is Datalog, and the backend sync service is written in Clojure. InstantDB is focused more on simplicity and real-time collaboration, with fewer customization options for storage or conflict resolution compared to RxDB, which supports various storage adapters and advanced conflict handling via CRDTs. ","version":"Next","tagName":"h3"},{"title":"Yjs​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#yjs","content":" Yjs is a CRDT-based (Conflict-free Replicated Data Type) library focused on enabling real-time collaboration - particularly for text editing, although it can handle other data types as well. While it provides powerful conflict resolution and peer-to-peer synchronization out of the box, Yjs itself is not a full-fledged database. Instead, you typically combine Yjs with other storage or networking layers to achieve a local-first architecture. This flexibility allows for sophisticated real-time features, but also means you must handle indexing, queries, and persistence on your own if you need them. Compared to RxDB, Yjs does not offer built-in replication adapters or a query system, so developers who require a more complete solution for conflict resolution, data persistence, and offline-first capabilities may find RxDB more convenient. ","version":"Next","tagName":"h3"},{"title":"ElectricSQL​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#electricsql","content":" 2024: ElectricSQL is being rewritten in a new Electric-Next branch, which focuses on partial syncing of ("shapes", which makes is basically a NoSQL like document database) of data from a remote Postgres DB to a local clients written in TypeScript/JS or Elixir. The write path is not yet implemented, neither is client-side reactivity. The ElectricSQL backend is written in Elixir. ","version":"Next","tagName":"h3"},{"title":"SignalDB​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#signaldb","content":" SignalDB provides a reactive, in-memory local-lirst JavaScript database with real-time sync, bit it doesn't offer the same level of multi-client replication or flexibility with storage backends that RxDB provides, and through a RxDB persistence adapters you can actually use SignalDB for the front-end reactivity while relying on RxDB for backend sync and persistence. ","version":"Next","tagName":"h3"},{"title":"PowerSync​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#powersync","content":" PowerSync is a "framework" for implementing local-first solutions. It centralizes business logic and conflict resolution on a central, authoritative server (PostgreSQL or MongoDB), vs RxDB that also supports custom backends. Both RxDB and PowerSync can be used with a variety of storage backends, but PowerSync uses SQLite as the front-end database which has shown to be slow because the WASM-SQLite abstraction increases read and write latency. In terms of client SDKs, PowerSync offers Flutter, Kotlin, and Swift in addition to JS/TypeScript. PowerSync offers man client technologies, PowerSync is under a license that restricts commercial use that competes with PowerSync and the JourneyApps Platform. Read further Offline First Database Comparison ","version":"Next","tagName":"h3"},{"title":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","type":0,"sectionRef":"#","url":"/articles/angular-indexeddb.html","content":"","keywords":"","version":"Next"},{"title":"What Is IndexedDB?​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#what-is-indexeddb","content":" IndexedDB is a low-level JavaScript API for client-side storage of large amounts of structured data. It allows you to create key-value or object store-based data storage right in the user's browser. IndexedDB supports transactions and indexing but lacks a robust query API and can be complex to use due to its callback-based nature. ","version":"Next","tagName":"h2"},{"title":"Why Use IndexedDB in Angular​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#why-use-indexeddb-in-angular","content":" Offline-First/Local-First: If your app needs to function with limited or no internet connectivity, IndexedDB provides a reliable local storage layer. Users can continue using the application offline, and data can sync when the connection is restored. Performance: Local data access comes with near-zero latency, removing the need for constant server requests and eliminating most loading spinners. Easier to Implement: By replicating all necessary data to the client once, you avoid implementing numerous backend endpoints for each user interaction. Scalability: Local data queries remove processing load from your servers and reduce bandwidth usage by handling queries on the client side. ","version":"Next","tagName":"h2"},{"title":"Why Using Plain IndexedDB is a Problem​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#why-using-plain-indexeddb-is-a-problem","content":" Despite the advantages, directly working with IndexedDB has several drawbacks: Callback-Based: IndexedDB was originally designed around a callback-based API, which can be unwieldy compared to modern Promise or RxJS-based flows. Difficult to Implement: IndexedDB is often described as a "low-level" API. It's more suitable for library authors rather than application developers who simply need a robust local store. Rudimentary Query API: Complex or dynamic queries are cumbersome with IndexedDB's basic get/put approach and limited indexes. TypeScript Support: Maintaining strong TypeScript types for all document structures is not straightforward with IndexedDB's untyped object stores. No Observable API: IndexedDB cannot directly emit live data changes. With RxDB, you can subscribe to changes on a collection or even a single document field. Cross-Tab Synchronization: Handling concurrent data changes across multiple browser tabs is difficult in IndexedDB. RxDB has built-in multi-tab support that keeps all tabs in sync. Advanced Features Missing: IndexedDB lacks built-in support for encryption, compression, or other advanced data management features. Browser-Only: IndexedDB works in the browser but not in environments like React Native or Electron. RxDB offers storage adapters to seamlessly reuse the same code on different platforms. ","version":"Next","tagName":"h2"},{"title":"Set Up RxDB in Angular​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#set-up-rxdb-in-angular","content":" ","version":"Next","tagName":"h2"},{"title":"Installing RxDB​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#installing-rxdb","content":" You can install RxDB into your Angular application via npm: npm install rxdb --save ","version":"Next","tagName":"h3"},{"title":"Patch Change Detection with zone.js​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#patch-change-detection-with-zonejs","content":" RxDB creates RxJS observables outside of Angular's zone, meaning Angular won't automatically trigger change detection when new data arrives. You must patch RxJS with zone.js: //> app.component.ts /** * IMPORTANT: RxDB creates rxjs observables outside of Angular's zone * So you have to import the rxjs patch to ensure change detection works correctly. * @link https://www.bennadel.com/blog/3448-binding-rxjs-observable-sources-outside-of-the-ngzone-in-angular-6-0-2.htm */ import 'zone.js/plugins/zone-patch-rxjs'; ","version":"Next","tagName":"h3"},{"title":"Create a Database and Collections​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#create-a-database-and-collections","content":" RxDB supports multiple storage options. The free and simple approach is using the localstorage-based storage. For higher performance, there's a premium plain IndexedDB storage. import { createRxDatabase } from 'rxdb/plugins/core'; // Define your schema const heroSchema = { title: 'hero schema', version: 0, description: 'Describes a hero in your app', primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 }, name: { type: 'string' }, power: { type: 'string' } }, required: ['id', 'name'] }; Localstorage IndexedDB import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; export async function initDB() { // Create a database const db = await createRxDatabase({ name: 'heroesdb', // the name of the database storage: getRxStorageLocalstorage() }); // Add collections await db.addCollections({ heroes: { schema: heroSchema } }); return db; } It's recommended to encapsulate database creation logic in an Angular service, such as in a DatabaseService. A full example is available in RxDB's Angular example. ","version":"Next","tagName":"h3"},{"title":"CRUD Operations​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#crud-operations","content":" Once your database is initialized, you can perform all CRUD operations: // insert await db.heroes.insert({ name: 'Iron Man', power: 'Genius-level intellect' }); // bulk insert await db.heroes.bulkInsert([ { name: 'Thor', power: 'God of Thunder' }, { name: 'Hulk', power: 'Superhuman Strength' } ]); // find and findOne const heroes = await db.heroes.find().exec(); const ironMan = await db.heroes.findOne({ selector: { name: 'Iron Man' } }).exec(); // update const doc = await db.heroes.findOne({ selector: { name: 'Hulk' } }).exec(); await doc.update({ $set: { power: 'Unlimited Strength' } }); // delete const doc = await db.heroes.findOne({ selector: { name: 'Thor' } }).exec(); await doc.remove(); ","version":"Next","tagName":"h3"},{"title":"Reactive Queries and Live Updates​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#reactive-queries-and-live-updates","content":" A key benefit of RxDB is reactivity. You can subscribe to changes and have your UI automatically reflect updates in real time even across browser tabs. ","version":"Next","tagName":"h2"},{"title":"With RxJS Observables and Async Pipes​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#with-rxjs-observables-and-async-pipes","content":" In Angular, you can display this data with the AsyncPipe: constructor(private dbService: DatabaseService) { this.heroes$ = this.dbService.db.heroes.find({ selector: {}, sort: [{ name: 'asc' }] }).$; } <ul> <li *ngFor="let hero of heroes$ | async"> {{ hero.name }} </li> </ul> ","version":"Next","tagName":"h3"},{"title":"With Angular Signals​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#with-angular-signals","content":" Angular Signals are a newer approach for reactivity. RxDB supports them via a custom reactivity factory. You can convert RxJS Observables to Signals using Angular's toSignal: import { RxReactivityFactory } from 'rxdb/plugins/core'; import { Signal, untracked, Injector } from '@angular/core'; import { toSignal } from '@angular/core/rxjs-interop'; export function createReactivityFactory(injector: Injector): RxReactivityFactory<Signal<any>> { return { fromObservable(observable$, initialValue) { return untracked(() => toSignal(observable$, { initialValue, injector, rejectErrors: true }) ); } }; } Pass this factory when creating your RxDatabase: import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; import { inject, Injector } from '@angular/core'; const database = await createRxDatabase({ name: 'mydb', storage: getRxStorageLocalstorage(), reactivity: createReactivityFactory(inject(Injector)) }); Use the double-dollar sign ($$) to get a Signal instead of an Observable: const heroesSignal = database.heroes.find().$$; <ul> <li *ngFor="let hero of heroesSignal()"> {{ hero.name }} </li> </ul> ","version":"Next","tagName":"h3"},{"title":"Angular IndexedDB Example with RxDB​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#angular-indexeddb-example-with-rxdb","content":" A comprehensive example of RxDB in an Angular application is available in the RxDB GitHub repository. It demonstrates database creation, queries, and Angular integration using best practices. ","version":"Next","tagName":"h2"},{"title":"Advanced RxDB Features​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#advanced-rxdb-features","content":" Beyond simple CRUD and local data storage, RxDB supports: Replication: Sync your local data with a remote database. Learn more at RxDB Replication. Data Migration on Schema Changes: RxDB supports automatic or manual schema migrations to manage backward-compatibility and evolve your data structure. See RxDB Migration. Encryption: Easily encrypt sensitive data at rest. See RxDB Encryption. Compression: Reduce storage and bandwidth usage using key compression. Learn more at RxDB Key Compression. ","version":"Next","tagName":"h2"},{"title":"Limitations of IndexedDB​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#limitations-of-indexeddb","content":" While IndexedDB works well for many use cases, it does have a few constraints: Potentially Slow: While adequate for most use cases, IndexedDB performance can degrade for very large datasets. More details at RxDB Slow IndexedDB. Storage Limits: Browsers may cap the amount of data you can store in IndexedDB. For more info, see Local Storage Limits of IndexedDB. ","version":"Next","tagName":"h2"},{"title":"Alternatives to IndexedDB​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#alternatives-to-indexeddb","content":" Depending on your needs, you might explore: Origin Private File System (OPFS): A newer browser storage mechanism that can offer better performance. RxDB supports OPFS storage. SQLite: When building a mobile or hybrid app (e.g., with Capacitor or Ionic), you can use SQLite locally. See RxDB with SQLite. ","version":"Next","tagName":"h2"},{"title":"Performance comparison with other browser storages​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#performance-comparison-with-other-browser-storages","content":" Here is a performance overview of the various browser based storage implementation of RxDB: ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#follow-up","content":" Continue your deep dive into RxDB with official quickstart guides and star the repository on GitHub to stay updated. RxDB Quickstart: Get started quickly with the RxDB Quickstart. RxDB GitHub: Explore the source, open issues, and star ⭐ the project at RxDB GitHub Repo. By combining IndexedDB's local storage with RxDB's powerful features, you can build performant, robust, and offline-capable Angular applications. RxDB takes care of the lower-level complexities, letting you focus on delivering a great user experience-online or off. ","version":"Next","tagName":"h2"},{"title":"Browser Storage - RxDB as a Database for Browsers","type":0,"sectionRef":"#","url":"/articles/browser-storage.html","content":"","keywords":"","version":"Next"},{"title":"Localstorage​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#localstorage","content":" Localstorage is a straightforward way to store small amounts of data in the user's web browser. It operates on a simple key-value basis and is relatively easy to use. While it has limitations, it is suitable for basic data storage requirements. ","version":"Next","tagName":"h3"},{"title":"IndexedDB​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#indexeddb","content":" IndexedDB, on the other hand, offers a more robust and structured approach to browser-based data storage. It can handle larger datasets and complex queries, making it a valuable choice for more advanced web applications. ","version":"Next","tagName":"h3"},{"title":"Why Store Data in the Browser​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#why-store-data-in-the-browser","content":" Now that we've explored the methods of storing data in the browser, let's delve into why this is a beneficial strategy for web developers: Caching: Storing data in the browser allows you to cache frequently used information. This means that your web application can access essential data more quickly because it doesn't need to repeatedly fetch it from a server. This results in a smoother and more responsive user experience. Offline Access: One significant advantage of browser storage is that data becomes portable and remains accessible even when the user is offline. This feature ensures that users can continue to use your application, view their saved information, and make changes, irrespective of their internet connection status. Faster Real-time Applications: For real-time applications, having data stored locally in the browser significantly enhances performance. Local data allows your application to respond faster to user interactions, creating a more seamless and responsive user interface. Low Latency Queries: When you run queries locally within the browser, you minimize the latency associated with network requests. This results in near-instant access to data, which is particularly crucial for applications that require rapid data retrieval. Faster Initial Application Start Time: By preloading essential data into browser storage, you can reduce the initial load time of your web application. Users can start using your application more swiftly, which is essential for making a positive first impression. Store Local Data with Encryption: For applications that deal with sensitive data, browser storage allows you to implement encryption to secure the stored information. This ensures that even if data is stored on the user's device, it remains confidential and protected. In summary, storing data in the browser offers several advantages, including improved performance, offline access, and enhanced user experiences. Localstorage and IndexedDB are two valuable tools that developers can utilize to leverage these benefits and create web applications that are more responsive and user-friendly. ","version":"Next","tagName":"h2"},{"title":"Browser Storage Limitations​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#browser-storage-limitations","content":" While browser storage, such as Localstorage and IndexedDB, offers many advantages, it's important to be aware of its limitations: Slower Performance Compared to Native Databases: Browser-based storage solutions can't match the performance of native server-side databases. They may experience slower data retrieval and processing, especially for large datasets or complex operations. Storage Space Limitations: Browsers impose restrictions on the amount of data that can be stored locally. This limitation can be problematic for applications with extensive data storage requirements, potentially necessitating creative solutions to manage data effectively. ","version":"Next","tagName":"h2"},{"title":"Why SQL Databases Like SQLite Aren't a Good Fit for the Browser​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#why-sql-databases-like-sqlite-arent-a-good-fit-for-the-browser","content":" SQL databases like SQLite, while powerful in server environments, may not be the best choice for browser-based applications due to various reasons: ","version":"Next","tagName":"h2"},{"title":"Push/Pull Based vs. Reactive​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#pushpull-based-vs-reactive","content":" SQL databases often use a push/pull model for data synchronization. This approach is less reactive and may not align well with the real-time nature of web applications, where immediate updates to the user interface are crucial. ","version":"Next","tagName":"h3"},{"title":"Build Size of Server-Side Databases​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#build-size-of-server-side-databases","content":" Server-side databases like SQLite have a significant build size, which can increase the initial load time of web applications. This can result in a suboptimal user experience, particularly for users with slower internet connections. ","version":"Next","tagName":"h3"},{"title":"Initialization Time and Performance​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#initialization-time-and-performance","content":" SQL databases are optimized for server environments, and their initialization processes and performance characteristics may not align with the needs of web applications. They might not offer the swift performance required for seamless user interactions. ","version":"Next","tagName":"h3"},{"title":"Why RxDB Is a Good Fit as Browser Storage​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#why-rxdb-is-a-good-fit-as-browser-storage","content":" RxDB is an excellent choice for browser-based storage due to its numerous features and advantages: ","version":"Next","tagName":"h2"},{"title":"Flexible Storage Layer for Various Platforms​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#flexible-storage-layer-for-various-platforms","content":" RxDB offers a flexible storage layer that can seamlessly integrate with different platforms, making it versatile and adaptable to various application needs. ","version":"Next","tagName":"h3"},{"title":"NoSQL JSON Documents Are a Better Fit for UIs​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#nosql-json-documents-are-a-better-fit-for-uis","content":" NoSQL JSON documents, used by RxDB, are well-suited for user interfaces. They provide a natural and efficient way to structure and display data in web applications. ","version":"Next","tagName":"h3"},{"title":"NoSQL Has Better TypeScript Support Compared to SQL​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#nosql-has-better-typescript-support-compared-to-sql","content":" RxDB boasts robust TypeScript support, which is beneficial for developers who prefer type safety and code predictability in their projects. ","version":"Next","tagName":"h3"},{"title":"Observable Document Fields​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#observable-document-fields","content":" RxDB enables developers to observe individual document fields, offering fine-grained control over data tracking and updates. ","version":"Next","tagName":"h3"},{"title":"Made in JavaScript, Optimized for JavaScript Applications​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#made-in-javascript-optimized-for-javascript-applications","content":" Being built in JavaScript and optimized for JavaScript applications, RxDB seamlessly integrates into web development stacks, minimizing compatibility issues. ","version":"Next","tagName":"h3"},{"title":"Observable Queries (rxjs) to Automatically Update the UI on Changes​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#observable-queries-rxjs-to-automatically-update-the-ui-on-changes","content":" RxDB's support for Observable Queries allows the user interface to update automatically in real-time when data changes. This reactivity enhances the user experience and simplifies UI development. const query = myCollection.find({ selector: { age: { $gt: 21 } } }); const querySub = query.$.subscribe(results => { console.log('got results: ' + results.length); }); ","version":"Next","tagName":"h3"},{"title":"Optimized Observed Queries with the EventReduce Algorithm​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#optimized-observed-queries-with-the-eventreduce-algorithm","content":" RxDB's EventReduce Algorithm ensures efficient data handling and rendering, improving overall performance and responsiveness. ","version":"Next","tagName":"h3"},{"title":"Handling of Schema Changes​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#handling-of-schema-changes","content":" RxDB provides built-in support for handling schema changes, simplifying database management when updates are required. ","version":"Next","tagName":"h3"},{"title":"Built-In Multi-Tab Support​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#built-in-multi-tab-support","content":" For applications requiring multi-tab support, RxDB natively handles data consistency across different browser tabs, streamlining data synchronization. ","version":"Next","tagName":"h3"},{"title":"Storing Documents Compressed​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#storing-documents-compressed","content":" Efficient data storage is achieved through document compression, reducing storage space requirements and enhancing overall performance. ","version":"Next","tagName":"h3"},{"title":"Replication Algorithm for Compatibility with Any Backend​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#replication-algorithm-for-compatibility-with-any-backend","content":" RxDB's Replication Algorithm facilitates compatibility with various backend systems, ensuring seamless data synchronization between the browser and server. ","version":"Next","tagName":"h3"},{"title":"Summary​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#summary","content":" In conclusion, RxDB is a powerful and feature-rich solution for browser-based storage. Its adaptability, real-time capabilities, TypeScript support, and optimization for JavaScript applications make it an ideal choice for modern web development projects, addressing the limitations of traditional SQL databases in the browser. Developers can harness RxDB to create efficient, responsive, and user-friendly web applications that leverage the full potential of browser storage. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#follow-up","content":" To explore more about RxDB and leverage its capabilities for browser storage, check out the following resources: RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects. ","version":"Next","tagName":"h2"},{"title":"RxDB: The benefits of Browser Databases","type":0,"sectionRef":"#","url":"/articles/browser-database.html","content":"","keywords":"","version":"Next"},{"title":"Why you might want to store data in the browser​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#why-you-might-want-to-store-data-in-the-browser","content":" There are compelling reasons to consider storing data in the browser: ","version":"Next","tagName":"h2"},{"title":"Use the database for caching​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#use-the-database-for-caching","content":" By leveraging a browser database, you can harness the power of caching. Storing frequently accessed data locally enables you to reduce server requests and greatly improve application performance. Caching provides a faster and smoother user experience, enhancing overall user satisfaction. ","version":"Next","tagName":"h3"},{"title":"Data is offline accessible​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#data-is-offline-accessible","content":" Storing data in the browser allows for offline accessibility. Regardless of an active internet connection, users can access and interact with the application, ensuring uninterrupted productivity and user engagement. ","version":"Next","tagName":"h3"},{"title":"Easier implementation of replicating database state​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#easier-implementation-of-replicating-database-state","content":" Browser databases simplify the replication of database state across multiple devices or instances of the application. Compared to complex REST routes, replicating data becomes easier and more streamlined. This capability enables the development of real-time and collaborative applications, where changes are seamlessly synchronized among users. ","version":"Next","tagName":"h3"},{"title":"Building real-time applications is easier with local data​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#building-real-time-applications-is-easier-with-local-data","content":" With a local browser database, building real-time applications becomes more straightforward. The availability of local data allows for reactive data flows and dynamic user interfaces that instantly reflect changes in the underlying data. Real-time features can be seamlessly implemented, providing a rich and interactive user experience. ","version":"Next","tagName":"h3"},{"title":"Browser databases can scale better​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#browser-databases-can-scale-better","content":" Browser databases distribute the query workload to users' devices, allowing queries to run locally instead of relying solely on server resources. This decentralized approach improves scalability by reducing the burden on the server, resulting in a more efficient and responsive application. ","version":"Next","tagName":"h3"},{"title":"Running queries locally has low latency​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#running-queries-locally-has-low-latency","content":" Browser databases offer the advantage of running queries locally, resulting in low latency. Eliminating the need for server round-trips significantly improves query performance, ensuring faster data retrieval and a more responsive application. ","version":"Next","tagName":"h3"},{"title":"Faster initial application start time​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#faster-initial-application-start-time","content":" Storing data in the browser reduces the initial application start time. Instead of waiting for data to be fetched from the server, the application can leverage the local database, resulting in faster initialization and improved user satisfaction right from the start. ","version":"Next","tagName":"h3"},{"title":"Easier integration with JavaScript frameworks​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#easier-integration-with-javascript-frameworks","content":" Browser databases, including RxDB, seamlessly integrate with popular JavaScript frameworks such as Angular, React.js, Vue.js, and Svelte. This integration allows developers to leverage the power of a database while working within the familiar environment of their preferred framework, enhancing productivity and ease of development. ","version":"Next","tagName":"h3"},{"title":"Store local data with encryption​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#store-local-data-with-encryption","content":" Security is a crucial aspect of data storage, especially when handling sensitive information. Browser databases, like RxDB, offer the capability to store local data with encryption, ensuring the confidentiality and protection of sensitive user data. ","version":"Next","tagName":"h3"},{"title":"Using a local database for state management​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#using-a-local-database-for-state-management","content":" Utilizing a local browser database for state management eliminates the need for traditional state management libraries like Redux or NgRx. This approach simplifies the application's architecture by leveraging the database's capabilities to handle state-related operations efficiently. ","version":"Next","tagName":"h3"},{"title":"Data is portable and always accessible by the user​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#data-is-portable-and-always-accessible-by-the-user","content":" When data is stored in the browser, it becomes portable and always accessible by the user. This ensures that users have control and ownership of their data, enhancing data privacy and accessibility. ","version":"Next","tagName":"h3"},{"title":"Why SQL databases like SQLite are not a good fit for the browser​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#why-sql-databases-like-sqlite-are-not-a-good-fit-for-the-browser","content":" While SQL databases, such as SQLite, excel in server-side scenarios, they are not always the optimal choice for browser-based applications. Here are some reasons why SQL databases may not be the best fit for the browser: ","version":"Next","tagName":"h2"},{"title":"Push/Pull based vs. reactive​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#pushpull-based-vs-reactive","content":" SQL databases typically rely on a push/pull mechanism, where the server pushes updates to the client or the client pulls data from the server. This approach is not inherently reactive and requires additional effort to implement real-time data updates. In contrast, browser databases like RxDB provide built-in reactive mechanisms, allowing the application to react to data changes seamlessly. ","version":"Next","tagName":"h3"},{"title":"Build size of server-side databases​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#build-size-of-server-side-databases","content":" Server-side databases, designed to handle large-scale applications, often have significant build sizes that are unsuitable for browser applications. In contrast, browser databases are specifically optimized for browser environments and leverage browser APIs like IndexedDB, OPFS, and Webworker, resulting in smaller build sizes. ","version":"Next","tagName":"h3"},{"title":"Initialization time and performance​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#initialization-time-and-performance","content":" The initialization time and performance of server-side databases can be suboptimal in browser applications. Browser databases, on the other hand, are designed to provide fast initialization and efficient performance within the browser environment, ensuring a smooth user experience. ","version":"Next","tagName":"h3"},{"title":"Why RxDB is a good fit for the browser​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#why-rxdb-is-a-good-fit-for-the-browser","content":" RxDB stands out as an excellent choice for implementing a browser database solution. Here's why RxDB is a perfect fit for browser applications: ","version":"Next","tagName":"h2"},{"title":"Observable Queries (rxjs) to automatically update the UI on changes​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#observable-queries-rxjs-to-automatically-update-the-ui-on-changes","content":" RxDB provides Observable Queries, powered by RxJS, enabling automatic UI updates when data changes occur. This reactive approach eliminates the need for manual data synchronization and ensures a real-time and responsive user interface. const query = myCollection.find({ selector: { age: { $gt: 21 } } }); const querySub = query.$.subscribe(results => { console.log('got results: ' + results.length); }); ","version":"Next","tagName":"h3"},{"title":"NoSQL JSON documents are a better fit for UIs​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#nosql-json-documents-are-a-better-fit-for-uis","content":" RxDB utilizes NoSQL JSON documents, which align naturally with UI development in JavaScript. JavaScript's native handling of JSON objects makes working with NoSQL documents more intuitive, simplifying UI-related operations. ","version":"Next","tagName":"h3"},{"title":"NoSQL has better TypeScript support compared to SQL​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#nosql-has-better-typescript-support-compared-to-sql","content":" TypeScript is widely used in modern JavaScript development. NoSQL databases, including RxDB, offer excellent TypeScript support, making it easier to build type-safe applications and leverage the benefits of static typing. ","version":"Next","tagName":"h3"},{"title":"Observable document fields​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#observable-document-fields","content":" RxDB allows observing individual document fields, providing granular reactivity. This feature enables efficient tracking of specific data changes and fine-grained UI updates, optimizing performance and responsiveness. ","version":"Next","tagName":"h3"},{"title":"Made in JavaScript, optimized for JavaScript applications​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#made-in-javascript-optimized-for-javascript-applications","content":" RxDB is built entirely in JavaScript, optimized for JavaScript applications. This ensures seamless integration with JavaScript codebases and maximizes performance within the browser environment. ","version":"Next","tagName":"h3"},{"title":"Optimized observed queries with the EventReduce Algorithm​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#optimized-observed-queries-with-the-eventreduce-algorithm","content":" RxDB employs the EventReduce Algorithm to optimize observed queries. This algorithm intelligently reduces unnecessary data transmissions, resulting in efficient query execution and improved performance. ","version":"Next","tagName":"h3"},{"title":"Built-in multi-tab support​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#built-in-multi-tab-support","content":" RxDB natively supports multi-tab applications, allowing data synchronization and replication across different tabs or instances of the same application. This feature ensures consistent data across the application and enhances collaboration and real-time experiences. ","version":"Next","tagName":"h3"},{"title":"Handling of schema changes​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#handling-of-schema-changes","content":" RxDB excels in handling schema changes, even when data is stored on multiple client devices. It provides mechanisms to handle schema migrations seamlessly, ensuring data integrity and compatibility as the application evolves. ","version":"Next","tagName":"h3"},{"title":"Storing documents compressed​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#storing-documents-compressed","content":" To optimize storage space, RxDB allows the compression of documents. Storing compressed documents reduces storage requirements and improves overall performance, especially in scenarios with large data volumes. ","version":"Next","tagName":"h3"},{"title":"Flexible storage layer for various platforms​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#flexible-storage-layer-for-various-platforms","content":" RxDB offers a flexible storage layer, enabling code reuse across different platforms, including Electron.js, React Native, hybrid apps (e.g., Capacitor.js), and web browsers. This flexibility streamlines development efforts and ensures consistent data management across multiple platforms. ","version":"Next","tagName":"h3"},{"title":"Replication Algorithm for compatibility with any backend​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#replication-algorithm-for-compatibility-with-any-backend","content":" RxDB incorporates a Replication Algorithm that is open-source and can be made compatible with various backend systems. This compatibility allows seamless data synchronization with different backend architectures, such as own servers, Firebase, CouchDB, NATS or WebSocket. ","version":"Next","tagName":"h3"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#follow-up","content":" To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects. RxDB empowers developers to unlock the power of browser databases, enabling efficient data management, real-time applications, and enhanced user experiences. By leveraging RxDB's features and benefits, you can take your browser-based applications to the next level of performance, scalability, and responsiveness. ","version":"Next","tagName":"h2"},{"title":"RxDB as a Database in an Angular Application","type":0,"sectionRef":"#","url":"/articles/angular-database.html","content":"","keywords":"","version":"Next"},{"title":"Angular Web Applications​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#angular-web-applications","content":" Angular is a powerful JavaScript framework developed and maintained by Google. It enables developers to build single-page applications (SPAs) with a modular and component-based approach. Angular provides a comprehensive set of tools and features for creating dynamic and responsive web applications. ","version":"Next","tagName":"h2"},{"title":"Importance of Databases in Angular Applications​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#importance-of-databases-in-angular-applications","content":" Databases play a vital role in Angular applications by providing a structured and efficient way to store, retrieve, and manage data. Whether it's handling user authentication, caching data, or persisting application state, a robust database solution is essential for ensuring optimal performance and user experience. ","version":"Next","tagName":"h2"},{"title":"Introducing RxDB as a Database Solution​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#introducing-rxdb-as-a-database-solution","content":" RxDB stands for Reactive Database and is built on the principles of reactive programming. It combines the best features of NoSQL databases with the power of reactive programming to provide a scalable and efficient database solution. RxDB offers seamless integration with Angular applications and brings several unique features that make it an attractive choice for developers. 3:45 This solved a problem I've had in Angular for years ","version":"Next","tagName":"h2"},{"title":"Getting Started with RxDB​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#getting-started-with-rxdb","content":" To begin our journey with RxDB, let's understand its key concepts and features. ","version":"Next","tagName":"h2"},{"title":"What is RxDB?​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#what-is-rxdb","content":" RxDB is a client-side database that follows the principles of reactive programming. It is built on top of IndexedDB, the native browser database, and leverages the RxJS library for reactive data handling. RxDB provides a simple and intuitive API for managing data and offers features like data replication, multi-tab support, and efficient query handling. ","version":"Next","tagName":"h3"},{"title":"Reactive Data Handling​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#reactive-data-handling","content":" At the core of RxDB is the concept of reactive data handling. RxDB leverages observables and reactive streams to enable real-time updates and data synchronization. With RxDB, you can easily subscribe to data changes and react to them in a reactive and efficient manner. ","version":"Next","tagName":"h3"},{"title":"Offline-First Approach​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#offline-first-approach","content":" One of the standout features of RxDB is its offline-first approach. It allows you to build applications that can work seamlessly in offline scenarios. RxDB stores data locally and automatically synchronizes changes with the server when the network becomes available. This capability is particularly useful for applications that need to function in low-connectivity or unreliable network environments. ","version":"Next","tagName":"h3"},{"title":"Data Replication​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#data-replication","content":" RxDB provides built-in support for data replication between clients and servers. This means you can synchronize data across multiple devices or instances of your application effortlessly. RxDB handles conflict resolution and ensures that data remains consistent across all connected clients. ","version":"Next","tagName":"h3"},{"title":"Observable Queries​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#observable-queries","content":" RxDB offers a powerful querying mechanism with support for observable queries. This allows you to create dynamic queries that automatically update when the underlying data changes. By leveraging RxDB's observable queries, you can build reactive UI components that respond to data changes in real-time. ","version":"Next","tagName":"h3"},{"title":"Multi-Tab Support​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#multi-tab-support","content":" RxDB provides out-of-the-box support for multi-tab scenarios. This means that if your Angular application is running in multiple browser tabs, RxDB automatically keeps the data in sync across all tabs. It ensures that changes made in one tab are immediately reflected in others, providing a seamless user experience. ","version":"Next","tagName":"h3"},{"title":"RxDB vs. Other Angular Database Options​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#rxdb-vs-other-angular-database-options","content":" While there are other database options available for Angular applications, RxDB stands out with its reactive programming model, offline-first approach, and built-in synchronization capabilities. Unlike traditional SQL databases, RxDB's NoSQL-like structure and observables-based API make it well-suited for real-time applications and complex data scenarios. ","version":"Next","tagName":"h3"},{"title":"Using RxDB in an Angular Application​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#using-rxdb-in-an-angular-application","content":" Now that we have a good understanding of RxDB and its features, let's explore how to integrate it into an Angular application. ","version":"Next","tagName":"h2"},{"title":"Installing RxDB in an Angular App​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#installing-rxdb-in-an-angular-app","content":" To use RxDB in an Angular application, we first need to install the necessary dependencies. You can install RxDB using npm or yarn by running the following command: npm install rxdb --save Once installed, you can import RxDB into your Angular application and start using its API to create and manage databases. ","version":"Next","tagName":"h3"},{"title":"Patch Change Detection with zone.js​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#patch-change-detection-with-zonejs","content":" Angular uses change detection to detect and update UI elements when data changes. However, RxDB's data handling is based on observables, which can sometimes bypass Angular's change detection mechanism. To ensure that changes made in RxDB are detected by Angular, we need to patch the change detection mechanism using zone.js. Zone.js is a library that intercepts and tracks asynchronous operations, including observables. By patching zone.js, we can make sure that Angular is aware of changes happening in RxDB. warning RxDB creates rxjs observables outside of angulars zone So you have to import the rxjs patch to ensure the angular change detection works correctly.link //> app.component.ts import 'zone.js/plugins/zone-patch-rxjs'; ","version":"Next","tagName":"h3"},{"title":"Use the Angular async pipe to observe an RxDB Query​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#use-the-angular-async-pipe-to-observe-an-rxdb-query","content":" Angular provides the async pipe, which is a convenient way to subscribe to observables and handle the subscription lifecycle automatically. When working with RxDB, you can use the async pipe to observe an RxDB query and bind the results directly to your Angular template. This ensures that the UI stays in sync with the data changes emitted by the RxDB query. constructor( private dbService: DatabaseService, private dialog: MatDialog ) { this.heroes$ = this.dbService .db.hero // collection .find({ // query selector: {}, sort: [{ name: 'asc' }] }) .$; } <ul *ngFor="let hero of heroes$ | async as heroes;"> <li>{{hero.name}}</li> </ul> ","version":"Next","tagName":"h3"},{"title":"Different RxStorage layers for RxDB​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#different-rxstorage-layers-for-rxdb","content":" RxDB supports multiple storage layers for persisting data. Some of the available storage options include: LocalStorage RxStorage: Uses the LocalStorage API without any third party plugins.IndexedDB RxStorage: RxDB directly supports IndexedDB as a storage layer. IndexedDB is a low-level browser database that offers good performance and reliability.OPFS RxStorage: The OPFS RxStorage for RxDB is built on top of the File System Access API which is available in all modern browsers. It provides an API to access a sandboxed private file system to persistently store and retrieve data. Compared to other persistent storage options in the browser (like IndexedDB), the OPFS API has a way better performance.Memory RxStorage: In addition to persistent storage options, RxDB also provides a memory-based storage layer. This is useful for testing or scenarios where you don't need long-term data persistence. You can choose the storage layer that best suits your application's requirements and configure RxDB accordingly. ","version":"Next","tagName":"h3"},{"title":"Synchronizing Data with RxDB between Clients and Servers​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#synchronizing-data-with-rxdb-between-clients-and-servers","content":" Data replication between an Angular application and a server is a common requirement. RxDB simplifies this process and provides built-in support for data synchronization. Let's explore how to replicate data between an Angular application and a server using RxDB. ","version":"Next","tagName":"h2"},{"title":"Offline-First Approach​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#offline-first-approach-1","content":" One of the key strengths of RxDB is its offline-first approach. It allows Angular applications to function seamlessly even in offline scenarios. RxDB stores data locally and automatically synchronizes changes with the server when the network becomes available. This capability is particularly useful for applications that need to operate in low-connectivity or unreliable network environments. ","version":"Next","tagName":"h3"},{"title":"Conflict Resolution​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#conflict-resolution","content":" In a distributed system, conflicts can arise when multiple clients modify the same data simultaneously. RxDB offers conflict resolution mechanisms to handle such scenarios. You can define conflict resolution strategies based on your application's requirements. RxDB provides hooks and events to detect conflicts and resolve them in a consistent manner. ","version":"Next","tagName":"h3"},{"title":"Bidirectional Synchronization​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#bidirectional-synchronization","content":" RxDB supports bidirectional data synchronization, allowing updates from both the client and server to be replicated seamlessly. This ensures that data remains consistent across all connected clients and the server. RxDB handles conflicts and resolves them based on the defined conflict resolution strategies. ","version":"Next","tagName":"h3"},{"title":"Real-Time Updates​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#real-time-updates","content":" RxDB provides real-time updates by leveraging reactive programming principles. Changes made to the data are automatically propagated to all connected clients in real-time. Angular applications can subscribe to these updates and update the user interface accordingly. This real-time capability enables collaborative features and enhances the overall user experience. ","version":"Next","tagName":"h3"},{"title":"Advanced RxDB Features and Techniques​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#advanced-rxdb-features-and-techniques","content":" RxDB offers several advanced features and techniques that can further enhance your Angular application. ","version":"Next","tagName":"h2"},{"title":"Indexing and Performance Optimization​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#indexing-and-performance-optimization","content":" To improve query performance, RxDB allows you to define indexes on specific fields of your documents. Indexing enables faster data retrieval and query execution, especially when working with large datasets. By strategically creating indexes, you can optimize the performance of your Angular application. ","version":"Next","tagName":"h3"},{"title":"Encryption of Local Data​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#encryption-of-local-data","content":" RxDB provides built-in support for encrypting local data using the Web Crypto API. With encryption, you can protect sensitive data stored in the client-side database. RxDB transparently encrypts the data, ensuring that it remains secure even if the underlying storage is compromised. ","version":"Next","tagName":"h3"},{"title":"Change Streams and Event Handling​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#change-streams-and-event-handling","content":" RxDB exposes change streams, which allow you to listen for data changes at a database or collection level. By subscribing to change streams, you can react to data modifications and perform specific actions, such as updating the UI or triggering notifications. Change streams enable real-time event handling in your Angular application. ","version":"Next","tagName":"h3"},{"title":"JSON Key Compression​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#json-key-compression","content":" To reduce the storage footprint and improve performance, RxDB supports JSON key compression. With key compression, RxDB replaces long keys with shorter aliases, reducing the overall storage size. This optimization is particularly useful when working with large datasets or frequently updating data. ","version":"Next","tagName":"h3"},{"title":"Best Practices for Using RxDB in Angular Applications​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#best-practices-for-using-rxdb-in-angular-applications","content":" To make the most of RxDB in your Angular application, consider the following best practices: ","version":"Next","tagName":"h2"},{"title":"Use Async Pipe for Subscriptions so you do not have to unsubscribe​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#use-async-pipe-for-subscriptions-so-you-do-not-have-to-unsubscribe","content":" Angular's async pipe is a powerful tool for handling observables in templates. By using the async pipe, you can avoid the need to manually subscribe and unsubscribe from RxDB observables. Angular takes care of the subscription lifecycle, ensuring that resources are released when they are no longer needed. Instead of manually subscribing to Observables, you should always prefer the async pipe. // WRONG: let amount; this.dbService .db.hero .find({ selector: {}, sort: [{ name: 'asc' }] }) .$.subscribe(docs => { amount = 0; docs.forEach(d => amount = d.points); }); // RIGHT: this.amount$ = this.dbService .db.hero .find({ selector: {}, sort: [{ name: 'asc' }] }) .$.pipe( map(docs => { let amount = 0; docs.forEach(d => amount = d.points); return amount; }) ); ","version":"Next","tagName":"h3"},{"title":"Use custom reactivity to have signals instead of rxjs observables​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#use-custom-reactivity-to-have-signals-instead-of-rxjs-observables","content":" RxDB supports adding custom reactivity factories that allow you to get angular signals out of the database instead of rxjs observables. read more. ","version":"Next","tagName":"h3"},{"title":"Use Angular Services for Database creation​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#use-angular-services-for-database-creation","content":" To ensure proper separation of concerns and maintain a clean codebase, it is recommended to create an Angular service responsible for managing the RxDB database instance. This service can handle database creation, initialization, and provide methods for interacting with the database throughout your application. ","version":"Next","tagName":"h3"},{"title":"Efficient Data Handling​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#efficient-data-handling","content":" RxDB provides various mechanisms for efficient data handling, such as batching updates, debouncing, and throttling. Leveraging these techniques can help optimize performance and reduce unnecessary UI updates. Consider the specific data handling requirements of your application and choose the appropriate strategies provided by RxDB. ","version":"Next","tagName":"h3"},{"title":"Data Synchronization Strategies​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#data-synchronization-strategies","content":" When working with data synchronization between clients and servers, it's important to consider strategies for conflict resolution and handling network failures. RxDB provides plugins and hooks that allow you to customize the replication behavior and implement specific synchronization strategies tailored to your application's needs. ","version":"Next","tagName":"h3"},{"title":"Conclusion​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#conclusion","content":" RxDB is a powerful database solution for Angular applications, offering reactive data handling, offline-first capabilities, and seamless data synchronization. By integrating RxDB into your Angular application, you can build responsive and scalable web applications that provide a rich user experience. Whether you're building real-time collaborative apps, progressive web applications, or offline-capable applications, RxDB's features and techniques make it a valuable addition to your Angular development toolkit. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#follow-up","content":" To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects.RxDB Angular Example at GitHub ","version":"Next","tagName":"h2"},{"title":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","type":0,"sectionRef":"#","url":"/articles/data-base.html","content":"","keywords":"","version":"Next"},{"title":"Overview of Web Applications that can benefit from RxDB​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#overview-of-web-applications-that-can-benefit-from-rxdb","content":" Before diving into the specifics of RxDB, let's take a moment to understand the scope of web applications that can leverage its capabilities. Any web application that requires real-time data updates, offline functionality, and synchronization between clients and servers can greatly benefit from RxDB. Whether it's a collaborative document editing tool, a task management app, or a chat application, RxDB offers a robust foundation for building these types of applications. ","version":"Next","tagName":"h2"},{"title":"Importance of data bases in Mobile Applications​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#importance-of-data-bases-in-mobile-applications","content":" Mobile applications have become an integral part of our lives, providing us with instant access to information and services. Behind the scenes, data bases play a pivotal role in storing and managing the data that powers these applications. data bases enable efficient data retrieval, updates, and synchronization, ensuring a smooth user experience even in challenging network conditions. ","version":"Next","tagName":"h2"},{"title":"Introducing RxDB as a data base Solution​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#introducing-rxdb-as-a-data-base-solution","content":" RxDB, short for Reactive data base, is a client-side data base solution designed specifically for web and mobile applications. Built on the principles of reactive programming, RxDB brings the power of observables and event-driven architecture to data management. With RxDB, developers can create applications that are responsive, offline-ready, and capable of seamless data synchronization between clients and servers. ","version":"Next","tagName":"h2"},{"title":"Getting Started with RxDB​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#getting-started-with-rxdb","content":" ","version":"Next","tagName":"h2"},{"title":"What is RxDB?​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#what-is-rxdb","content":" RxDB is an open-source JavaScript data base that leverages reactive programming and provides a seamless API for handling data. It is built on top of existing popular data base technologies, such as IndexedDB, and adds a layer of reactive features to enable real-time data updates and synchronization. ","version":"Next","tagName":"h3"},{"title":"Reactive Data Handling​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#reactive-data-handling","content":" One of the standout features of RxDB is its reactive data handling. It utilizes observables to provide a stream of data that automatically updates whenever a change occurs. This reactive approach allows developers to build applications that respond instantly to data changes, ensuring a highly interactive and real-time user experience. ","version":"Next","tagName":"h3"},{"title":"Offline-First Approach​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#offline-first-approach","content":" RxDB embraces an offline-first approach, enabling applications to work seamlessly even when there is no internet connectivity. It achieves this by caching data locally on the client-side and synchronizing it with the server when the connection is available. This ensures that users can continue working with the application and have their data automatically synchronized when they come back online. ","version":"Next","tagName":"h3"},{"title":"Data Replication​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#data-replication","content":" RxDB simplifies the process of data replication between clients and servers. It provides replication plugins that handle the synchronization of data in real-time. These plugins allow applications to keep data consistent across multiple clients, enabling collaborative features and ensuring that each client has the most up-to-date information. ","version":"Next","tagName":"h3"},{"title":"Observable Queries​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#observable-queries","content":" RxDB introduces the concept of observable queries, which are powerful tools for efficiently querying data. With observable queries, developers can subscribe to specific data queries and receive automatic updates whenever the underlying data changes. This eliminates the need for manual polling and ensures that applications always have access to the latest data. ","version":"Next","tagName":"h3"},{"title":"Multi-Tab support​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#multi-tab-support","content":" RxDB offers multi-tab support, allowing applications to function seamlessly across multiple browser tabs. This feature ensures that data changes in one tab are immediately reflected in all other open tabs, enabling a consistent user experience across different browser windows. ","version":"Next","tagName":"h3"},{"title":"RxDB vs. Other data base Options​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#rxdb-vs-other-data-base-options","content":" When considering data base options for web applications, developers often encounter choices like IndexedDB, OPFS, and Memory-based solutions. RxDB, while built on top of IndexedDB, stands out due to its reactive data handling capabilities and advanced synchronization features. Compared to other options, RxDB offers a more streamlined and powerful approach to managing data in web applications. ","version":"Next","tagName":"h3"},{"title":"Different RxStorage layers for RxDB​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#different-rxstorage-layers-for-rxdb","content":" RxDB provides various storage layers, known as RxStorage, that serve as interfaces to different underlying storage technologies. These layers include: LocalStorage RxStorage: Built on top of the browsers localStorage API.IndexedDB RxStorage: This layer directly utilizes IndexedDB as its backend, providing a robust and widely supported storage option.OPFS RxStorage: OPFS (Operational Transformation File System) is a file system-like storage layer that allows for efficient conflict resolution and real-time collaboration.Memory RxStorage: Primarily used for testing and development, this storage layer keeps data in memory without persisting it to disk. Each RxStorage layer has its strengths and is suited for different scenarios, enabling developers to choose the most appropriate option for their specific use case. ","version":"Next","tagName":"h3"},{"title":"Synchronizing Data with RxDB between Clients and Servers​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#synchronizing-data-with-rxdb-between-clients-and-servers","content":" ","version":"Next","tagName":"h2"},{"title":"Offline-First Approach​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#offline-first-approach-1","content":" As mentioned earlier, RxDB adopts an offline-first approach, allowing applications to function seamlessly in disconnected environments. By caching data locally, applications can continue to operate and make updates even without an internet connection. Once the connection is restored, RxDB's replication plugins take care of synchronizing the data with the server, ensuring consistency across all clients. ","version":"Next","tagName":"h3"},{"title":"RxDB Replication Plugins​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#rxdb-replication-plugins","content":" RxDB provides a range of replication plugins that simplify the process of synchronizing data between clients and servers. These plugins enable real-time replication using various protocols, such as WebSocket or HTTP, and handle conflict resolution strategies to ensure data integrity. By leveraging these replication plugins, developers can easily implement robust and scalable synchronization capabilities in their applications. ","version":"Next","tagName":"h3"},{"title":"Advanced RxDB Features and Techniques​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#advanced-rxdb-features-and-techniques","content":" Indexing and Performance Optimization To achieve optimal performance, RxDB offers indexing capabilities. Indexing allows for efficient data retrieval and faster query execution. By strategically defining indexes on frequently accessed fields, developers can significantly enhance the overall performance of their RxDB-powered applications. ","version":"Next","tagName":"h3"},{"title":"Encryption of Local Data​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#encryption-of-local-data","content":" In scenarios where data security is paramount, RxDB provides options for encrypting local data. By encrypting the data base contents, developers can ensure that sensitive information remains secure even if the underlying storage is compromised. RxDB integrates seamlessly with encryption libraries, making it easy to implement end-to-end encryption in applications. ","version":"Next","tagName":"h3"},{"title":"Change Streams and Event Handling​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#change-streams-and-event-handling","content":" RxDB offers change streams and event handling mechanisms, enabling developers to react to data changes in real-time. With change streams, applications can listen to specific collections or documents and trigger custom logic whenever a change occurs. This capability opens up possibilities for building real-time collaboration features, notifications, or other reactive behaviors. ","version":"Next","tagName":"h3"},{"title":"JSON Key Compression​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#json-key-compression","content":" In scenarios where storage size is a concern, RxDB provides JSON key compression. By applying compression techniques to JSON keys, developers can significantly reduce the storage footprint of their data bases. This feature is particularly beneficial for applications dealing with large datasets or limited storage capacities. ","version":"Next","tagName":"h3"},{"title":"Conclusion​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#conclusion","content":" RxDB provides an exceptional data base solution for web and mobile applications, empowering developers to create reactive, offline-ready, and synchronized applications. With its reactive data handling, offline-first approach, and replication plugins, RxDB simplifies the challenges of building real-time applications with data synchronization requirements. By embracing advanced features like indexing, encryption, change streams, and JSON key compression, developers can optimize performance, enhance security, and reduce storage requirements. As web and mobile applications continue to evolve, RxDB proves to be a reliable and powerful ","version":"Next","tagName":"h2"},{"title":"Using RxDB as an Embedded Database","type":0,"sectionRef":"#","url":"/articles/embedded-database.html","content":"","keywords":"","version":"Next"},{"title":"What is an Embedded Database?​","type":1,"pageTitle":"Using RxDB as an Embedded Database","url":"/articles/embedded-database.html#what-is-an-embedded-database","content":" An embedded database refers to a client-side database system that is integrated directly within an application. It is designed to operate within the client environment, such as a web browser or a mobile app. This approach eliminates the need for a separate database server and allows the database to run locally on the client device. ","version":"Next","tagName":"h2"},{"title":"Embedded Database in UI Applications​","type":1,"pageTitle":"Using RxDB as an Embedded Database","url":"/articles/embedded-database.html#embedded-database-in-ui-applications","content":" In the context of UI applications, an embedded database serves as a local data storage solution. It enables applications to efficiently manage data, facilitate real-time updates, and enhance performance. Let's explore some of the benefits of using an embedded database compared to a traditional server database: Replicating database state becomes easier: Implementing real-time data synchronization and replication is simpler with an embedded database compared to complex REST routes. The embedded nature allows for efficient replication of the database state across multiple instances of the application.Use the database for caching: An embedded database can be utilized for caching frequently accessed data. This caching mechanism enhances performance and reduces the need for repeated network requests, resulting in faster data retrieval.Building real-time applications is easier with local data: By leveraging local data storage, real-time applications can easily update the user interface in response to data changes. This approach simplifies the development of real-time features and enhances the responsiveness of the application.Store local data with encryption: Embedded databases, like RxDB, offer the ability to store local data with encryption. This ensures that sensitive information remains protected even when stored locally on the client device.Data is offline accessible: With an embedded database, data remains accessible even when the application is offline. Users can continue to interact with the application and access their data seamlessly, irrespective of their internet connectivity.Faster initial application start time: Since the data is already stored locally, there is no need for initial data fetching from a remote server. This significantly reduces the application's startup time and allows users to engage with the application more quickly.Improved scalability with local queries: Embedded databases, such as RxDB, perform queries locally on the client device instead of relying on server round-trips. This reduces latency and enhances scalability, particularly when dealing with large datasets or high query volumes.Seamless integration with JavaScript frameworks: Embedded databases, including RxDB, integrate seamlessly with popular JavaScript frameworks like Angular, React.js, Vue.js, and Svelte. This compatibility allows developers to leverage the capabilities of these frameworks while benefiting from embedded database functionality.Running queries locally has low latency: With an embedded database, queries are executed locally on the client device, resulting in minimal latency. This improves the overall performance and responsiveness of the application.Data is portable and always accessible by the user: Embedded databases enable data portability, allowing users to seamlessly transition between devices while maintaining their data and application state. This ensures that data is always accessible and available to the user.Using a local database for state management: Instead of relying on additional state management libraries like Redux or NgRx, an embedded database can be used for local state management. This simplifies state management and ensures data consistency within the application. ","version":"Next","tagName":"h2"},{"title":"Why RxDB as an Embedded Database for Real-time Applications​","type":1,"pageTitle":"Using RxDB as an Embedded Database","url":"/articles/embedded-database.html#why-rxdb-as-an-embedded-database-for-real-time-applications","content":" RxDB is a JavaScript-based embedded database that offers numerous advantages for building real-time applications. Let's explore why RxDB is a compelling choice: Observable Queries (RxJS): RxDB leverages the power of Observables through RxJS, enabling developers to create queries that automatically update the user interface on data changes. This reactive approach simplifies UI updates and ensures real-time synchronization of data.NoSQL JSON Documents for UIs: RxDB utilizes NoSQL (JSON) documents as its data model, aligning seamlessly with the requirements of modern UI development. JavaScript's native support for JSON objects makes NoSQL documents a natural fit for UI-driven applications.Better TypeScript Support Compared to SQL: RxDB's NoSQL approach provides excellent TypeScript support. The flexibility of working with JSON objects enables robust typing and enhanced development experiences, ensuring type safety and reducing runtime errors.Observable Document Fields: RxDB allows developers to observe individual fields within documents. This granularity enables efficient tracking of specific data changes and facilitates targeted UI updates, enhancing performance and responsiveness.Made in JavaScript, Optimized for JavaScript Applications: Being built entirely in JavaScript, RxDB is optimized for JavaScript applications. It leverages JavaScript's capabilities and integrates seamlessly with JavaScript frameworks and libraries, making it a natural choice for JavaScript developers.Optimized Observed Queries with the EventReduce Algorithm: RxDB incorporates the EventReduce algorithm to optimize observed queries. This algorithm reduces the number of emitted events during query execution, resulting in enhanced query performance and reduced overhead.Built-in Multi-tab Support: RxDB provides built-in multi-tab support, allowing multiple instances of an application to share and synchronize data seamlessly. This feature enables collaborative and real-time scenarios across multiple browser tabs or windows.Handling of Schema Changes across Multiple Client Devices: With RxDB, handling schema changes across multiple client devices becomes straightforward. RxDB's schema migration capabilities ensure that applications can seamlessly adapt to evolving data structures, providing a consistent experience across different devices.Storing Documents Compressed: RxDB offers the ability to store documents in a compressed format. This reduces the storage footprint and improves performance, especially when dealing with large datasets.Flexible Storage Layer and Cross-platform Compatibility: RxDB provides a flexible storage layer that can be reused across various platforms, including Electron.js, React Native, hybrid apps (via Capacitor.js), and browsers. This cross-platform compatibility simplifies development and enables code reuse across different environments.Replication Algorithm for Backend Compatibility: RxDB's replication algorithm is open-source and can be made compatible with various backend solutions, such as self-hosted servers, Firebase, CouchDB, NATS, WebSockets, and more. This flexibility allows developers to choose their preferred backend infrastructure while benefiting from RxDB's embedded database capabilities. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"Using RxDB as an Embedded Database","url":"/articles/embedded-database.html#follow-up","content":" To further explore RxDB and leverage its capabilities as an embedded database, the following resources can be helpful: RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects. By utilizing RxDB as an embedded database in UI applications, developers can harness the power of efficient data management, real-time updates, and enhanced user experiences. RxDB's features and benefits make it a compelling choice for building modern, responsive, and scalable applications. ","version":"Next","tagName":"h2"},{"title":"RxDB as a Database in a Flutter Application","type":0,"sectionRef":"#","url":"/articles/flutter-database.html","content":"","keywords":"","version":"Next"},{"title":"Overview of Flutter Mobile Applications​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#overview-of-flutter-mobile-applications","content":" Flutter is an open-source UI software development kit created by Google that allows developers to build high-performance mobile applications for iOS and Android platforms using a single codebase. Flutter's framework provides a wide range of widgets and tools that enable developers to create visually appealing and responsive applications. ","version":"Next","tagName":"h3"},{"title":"Importance of Databases in Flutter Applications​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#importance-of-databases-in-flutter-applications","content":" Databases play a vital role in Flutter applications by providing a persistent and reliable storage solution for storing and retrieving data. Whether it's user profiles, app settings, or complex data structures, a database helps in efficiently managing and organizing the application's data. Choosing the right database for a Flutter application can significantly impact the performance, scalability, and user experience of the app. ","version":"Next","tagName":"h3"},{"title":"Introducing RxDB as a Database Solution​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#introducing-rxdb-as-a-database-solution","content":" RxDB is a powerful NoSQL database solution that is designed to work seamlessly with JavaScript-based frameworks, such as Flutter. It stands for Reactive Database and offers a variety of features that make it an excellent choice for building Flutter applications. RxDB combines the simplicity of JavaScript's document-based database model with the reactive programming paradigm, enabling developers to build real-time and offline-first applications with ease. ","version":"Next","tagName":"h3"},{"title":"Getting Started with RxDB​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#getting-started-with-rxdb","content":" To understand how RxDB can be utilized in a Flutter application, let's explore its core features and advantages. ","version":"Next","tagName":"h2"},{"title":"What is RxDB?​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#what-is-rxdb","content":" RxDB is a client-side database built on top of IndexedDB, which is a low-level browser-based database API. It provides a simple and intuitive API for performing CRUD operations (Create, Read, Update, Delete) on documents. RxDB's underlying architecture allows for efficient handling of data synchronization between multiple clients and servers. ","version":"Next","tagName":"h3"},{"title":"Reactive Data Handling​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#reactive-data-handling","content":" One of the key strengths of RxDB is its reactive data handling. It leverages the power of Observables, a concept from reactive programming, to automatically update the UI in response to data changes. With RxDB, developers can define queries and subscribe to their results, ensuring that the UI is always in sync with the database. ","version":"Next","tagName":"h3"},{"title":"Offline-First Approach​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#offline-first-approach","content":" RxDB follows an offline-first approach, making it ideal for building Flutter applications that need to function even without an internet connection. It allows data to be stored locally and seamlessly synchronizes it with the server when a connection is available. This ensures that users can access and interact with their data regardless of network availability. ","version":"Next","tagName":"h3"},{"title":"Data Replication​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#data-replication","content":" Data replication is a critical aspect of building distributed applications. RxDB provides robust replication capabilities that enable synchronization of data between different clients and servers. With its replication plugins, RxDB simplifies the process of setting up real-time data synchronization, ensuring consistency across all connected devices. ","version":"Next","tagName":"h3"},{"title":"Observable Queries​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#observable-queries","content":" RxDB introduces the concept of observable queries, which are queries that automatically update when the underlying data changes. This feature is particularly useful for keeping the UI up to date with the latest data. By subscribing to an observable query, developers can receive real-time updates and reflect them in the user interface without manual intervention. ","version":"Next","tagName":"h3"},{"title":"RxDB vs. Other Flutter Database Options​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#rxdb-vs-other-flutter-database-options","content":" When considering database options for Flutter applications, developers often come across alternatives such as SQLite or LokiJS. While these databases have their merits, RxDB offers several advantages over them. RxDB's seamless integration with Flutter, its offline-first approach, reactive data handling, and built-in data replication make it a compelling choice for building feature-rich and scalable Flutter applications. ","version":"Next","tagName":"h3"},{"title":"Using RxDB in a Flutter Application​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#using-rxdb-in-a-flutter-application","content":" Now that we understand the core features of RxDB, let's explore how to integrate it into a Flutter application. ","version":"Next","tagName":"h2"},{"title":"How RxDB can run in Flutter​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#how-rxdb-can-run-in-flutter","content":" RxDB is written in TypeScript and compiled to JavaScript. To run it in a Flutter application, the flutter_qjs library is used to spawn a QuickJS JavaScript runtime. RxDB itself runs in that runtime and communicates with the flutter dart runtime. To store data persistent, the LokiJS RxStorage is used together with a custom storage adapter that persists the database inside of the shared_preferences data. To use RxDB, you have to create a compatible JavaScript file that creates your RxDatabase and starts some connectors which are used by Flutter to communicate with the JavaScript RxDB database via setFlutterRxDatabaseConnector(). import { createRxDatabase } from 'rxdb'; import { getRxStorageLoki } from 'rxdb/plugins/storage-lokijs'; import { setFlutterRxDatabaseConnector, getLokijsAdapterFlutter } from 'rxdb/plugins/flutter'; // do all database creation stuff in this method. async function createDB(databaseName) { // create the RxDatabase const db = await createRxDatabase({ // the database.name is variable so we can change it on the flutter side name: databaseName, storage: getRxStorageLoki({ adapter: getLokijsAdapterFlutter() }), multiInstance: false }); await db.addCollections({ heroes: { schema: { version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 }, name: { type: 'string', maxLength: 100 }, color: { type: 'string', maxLength: 30 } }, indexes: ['name'], required: ['id', 'name', 'color'] } } }); return db; } // start the connector so that flutter can communicate with the JavaScript process setFlutterRxDatabaseConnector( createDB ); Before you can use the JavaScript code, you have to bundle it into a single .js file. In this example we do that with webpack in a npm script here which bundles everything into the javascript/dist/index.js file. To allow Flutter to access that file during runtime, add it to the assets inside of your pubspec.yaml: flutter: assets: - javascript/dist/index.js Also you need to install RxDB in your flutter part of the application. First you have to use the rxdb dart package as a flutter dependency. Currently the package is not published at the dart pub.dev. Instead you have to install it from the local filesystem inside of your RxDB npm installation. # inside of pubspec.yaml dependencies: rxdb: path: path/to/your/node_modules/rxdb/src/plugins/flutter/dart Afterwards you can import the rxdb library in your dart code and connect to the JavaScript process from there. For reference, check out the lib/main.dart file. import 'package:rxdb/rxdb.dart'; // start the javascript process and connect to the database RxDatabase database = await getRxDatabase("javascript/dist/index.js", databaseName); // get a collection RxCollection collection = database.getCollection('heroes'); // insert a document RxDocument document = await collection.insert({ "id": "zflutter-${DateTime.now()}", "name": nameController.text, "color": colorController.text }); // create a query RxQuery<RxHeroDocType> query = RxDatabaseState.collection.find(); // create list to store query results List<RxDocument<RxHeroDocType>> documents = []; // subscribe to a query query.$().listen((results) { setState(() { documents = results; }); }); ","version":"Next","tagName":"h2"},{"title":"Different RxStorage layers for RxDB​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#different-rxstorage-layers-for-rxdb","content":" RxDB offers multiple storage options, known as RxStorage layers, to store data locally. These options include: LokiJS RxStorage: LokiJS is an in-memory database that can be used as a storage layer for RxDB. It provides fast and efficient in-memory data management capabilities.SQLite RxStorage: SQLite is a popular and widely used embedded database that offers robust storage capabilities. RxDB utilizes SQLite as a storage layer to persist data on the device.Memory RxStorage: As the name suggests, Memory RxStorage stores data in memory. While this option does not provide persistence, it can be useful for temporary or cache-based data storage. By choosing the appropriate RxStorage layer based on the specific requirements of the application, developers can optimize performance and storage efficiency. ","version":"Next","tagName":"h3"},{"title":"Synchronizing Data with RxDB between Clients and Servers​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#synchronizing-data-with-rxdb-between-clients-and-servers","content":" One of the key strengths of RxDB is its ability to synchronize data between multiple clients and servers seamlessly. Let's explore how this synchronization can be achieved. ","version":"Next","tagName":"h2"},{"title":"Offline-First Approach​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#offline-first-approach-1","content":" RxDB's offline-first approach ensures that data can be accessed and modified even when there is no internet connection. Changes made offline are automatically synchronized with the server once a connection is reestablished. This ensures data consistency across all devices, providing a seamless user experience. ","version":"Next","tagName":"h3"},{"title":"RxDB Replication Plugins​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#rxdb-replication-plugins","content":" RxDB provides replication plugins that simplify the process of setting up data synchronization between clients and servers. These plugins offer various synchronization strategies, such as one-way replication, two-way replication, and conflict resolution mechanisms. By configuring the appropriate replication plugin, developers can easily establish real-time data synchronization in their Flutter applications. ","version":"Next","tagName":"h3"},{"title":"Advanced RxDB Features and Techniques​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#advanced-rxdb-features-and-techniques","content":" RxDB offers a range of advanced features and techniques that enhance its functionality and performance. Let's explore a few of these features: ","version":"Next","tagName":"h2"},{"title":"Indexing and Performance Optimization​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#indexing-and-performance-optimization","content":" Indexing is a technique used to optimize query performance by creating indexes on specific fields. RxDB allows developers to define indexes on document fields, improving the efficiency of queries and data retrieval. ","version":"Next","tagName":"h3"},{"title":"Encryption of Local Data​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#encryption-of-local-data","content":" To ensure data privacy and security, RxDB supports encryption of local data. By encrypting the data stored on the device, developers can protect sensitive information and prevent unauthorized access. ","version":"Next","tagName":"h3"},{"title":"Change Streams and Event Handling​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#change-streams-and-event-handling","content":" RxDB provides change streams, which emit events whenever data changes occur. By leveraging change streams, developers can implement custom event handling logic, such as updating the UI or triggering background processes, in response to specific data changes. ","version":"Next","tagName":"h3"},{"title":"JSON Key Compression​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#json-key-compression","content":" To minimize storage requirements and optimize performance, RxDB offers JSON key compression. This feature reduces the size of keys used in the database, resulting in more efficient storage and improved query performance. ","version":"Next","tagName":"h3"},{"title":"Conclusion​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#conclusion","content":" RxDB offers a powerful and flexible database solution for Flutter applications. With its offline-first approach, real-time data synchronization, and reactive data handling capabilities, RxDB simplifies the development of feature-rich and scalable Flutter applications. By integrating RxDB into your Flutter projects, you can leverage its advanced features and techniques to build responsive and data-driven applications that provide an exceptional user experience. note You can find the source code for an example RxDB Flutter Application at the github repo ","version":"Next","tagName":"h2"},{"title":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","type":0,"sectionRef":"#","url":"/articles/firebase-realtime-database-alternative.html","content":"","keywords":"","version":"Next"},{"title":"Why RxDB Is an Excellent Firebase Realtime Database Alternative​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#why-rxdb-is-an-excellent-firebase-realtime-database-alternative","content":" ","version":"Next","tagName":"h2"},{"title":"1. Complete Offline-First Experience​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#1-complete-offline-first-experience","content":" Unlike Firebase Realtime Database, which relies on central infrastructure to process data, RxDB is fully embedded within your client application (including browsers, Node.js, Electron, and React Native). This design means your app stays completely functional offline, since all data reads and writes happen locally. When connectivity is restored, RxDB's syncing framework automatically reconciles local changes with your remote backend. ","version":"Next","tagName":"h3"},{"title":"2. Freedom to Use Any Server or Cloud​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#2-freedom-to-use-any-server-or-cloud","content":" While Firebase Realtime Database ties you into Google's ecosystem, RxDB allows you to choose any hosting environment. You can: Host your data on your own servers or private cloud.Integrate with relational databases like PostgreSQL or other NoSQL options such as CouchDB.Build custom endpoints using REST, GraphQL, or any other protocol. This flexibility ensures you're not locked into a single vendor and can adapt your backend strategy as your project evolves. ","version":"Next","tagName":"h3"},{"title":"3. Advanced Conflict Handling​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#3-advanced-conflict-handling","content":" Firebase Realtime Database typically updates data with a simple last-in-wins approach. RxDB, on the other hand, lets you implement more sophisticated conflict resolution logic. Using revisions and conflict handlers, RxDB can merge concurrent edits or preserve multiple versions—ensuring your application remains consistent even when multiple clients modify the same data at the same time. ","version":"Next","tagName":"h3"},{"title":"4. Lower Cloud Costs for Read-Heavy Apps​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#4-lower-cloud-costs-for-read-heavy-apps","content":" When you rely on Firebase Realtime Database, each query or listener can translate into ongoing reads, potentially running up your monthly bill. With RxDB, all queries are performed locally. Your app only communicates with the backend to sync document changes, significantly reducing bandwidth and hosting expenses for applications that frequently read data. ","version":"Next","tagName":"h3"},{"title":"5. Powerful Local Queries​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#5-powerful-local-queries","content":" If you've hit Firebase Realtime Database's querying limits, RxDB offers a far more robust approach to data retrieval. You can: Define custom indexes for faster local lookups.Perform sophisticated filters, joins, or full-text searches right on the client.Subscribe to real-time data updates through RxDB's reactive query engine. Because these operations happen locally, your UI updates instantly, providing a snappy user experience. ","version":"Next","tagName":"h3"},{"title":"6. True Offline Initialization​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#6-true-offline-initialization","content":" While Firebase offers some offline caching, it often requires an initial connection for authentication or to seed local data. RxDB, however, is built to handle an offline-start scenario. Users can begin working with the application immediately, regardless of connectivity, and any modifications they make will sync once the network is available again. ","version":"Next","tagName":"h3"},{"title":"7. Works Everywhere JavaScript Runs​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#7-works-everywhere-javascript-runs","content":" One of RxDB's core strengths is its ability to run in any JavaScript environment. Whether you're building a web app that uses IndexedDB in the browser, an Electron desktop program, or a React Native mobile application, RxDB's swappable storage adapts to your runtime of choice. This consistency makes code-sharing and cross-platform development far simpler than being tied to a single backend system. ","version":"Next","tagName":"h3"},{"title":"How RxDB's Syncing Mechanism Operates​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#how-rxdbs-syncing-mechanism-operates","content":" RxDB employs its own Sync Engine to manage data flow between your client and remote servers. Replication revolves around: Pull: Retrieving updated or newly created documents from the server.Push: Sending local changes to the backend for persistence.Live Updates: Continuously streaming changes to and from the backend for real-time synchronization. ","version":"Next","tagName":"h2"},{"title":"Sample Code: Sync RxDB With a Custom Endpoint​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#sample-code-sync-rxdb-with-a-custom-endpoint","content":" import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; import { replicateRxCollection } from 'rxdb/plugins/replication'; async function initDB() { const db = await createRxDatabase({ name: 'localdb', storage: getRxStorageLocalstorage(), multiInstance: true, eventReduce: true }); await db.addCollections({ tasks: { schema: { title: 'task schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string', maxLength: 100 }, title: { type: 'string' }, complete: { type: 'boolean' } } } } }); // Start a custom replication replicateRxCollection({ collection: db.tasks, replicationIdentifier: 'custom-tasks-api', push: { handler: async (docs) => { // post local changes to your server const resp = await fetch('https://yourapi.com/tasks/push', { method: 'POST', body: JSON.stringify({ changes: docs }) }); return await resp.json(); // return conflicting documents if any } }, pull: { handler: async (lastCheckpoint, batchSize) => { // fetch new/updated items from your server const response = await fetch( `https://yourapi.com/tasks/pull?checkpoint=${JSON.stringify( lastCheckpoint )}&limit=${batchSize}` ); return await response.json(); } }, live: true }); return db; } ","version":"Next","tagName":"h2"},{"title":"Setting Up P2P Replication Over WebRTC​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#setting-up-p2p-replication-over-webrtc","content":" In addition to using a centralized backend, RxDB supports peer-to-peer synchronization through WebRTC, enabling devices to share data directly. import { replicateWebRTC, getConnectionHandlerSimplePeer } from 'rxdb/plugins/replication-webrtc'; const webrtcPool = await replicateWebRTC({ collection: db.tasks, topic: 'p2p-topic-123', connectionHandlerCreator: getConnectionHandlerSimplePeer({ signalingServerUrl: 'wss://signaling.rxdb.info/', wrtc: require('node-datachannel/polyfill'), webSocketConstructor: require('ws').WebSocket }) }); webrtcPool.error$.subscribe((error) => { console.error('P2P error:', error); }); Here, any client that joins the same topic communicates changes to other peers, all without requiring a traditional client-server model. ","version":"Next","tagName":"h3"},{"title":"Quick Steps to Get Started​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#quick-steps-to-get-started","content":" Install RxDB npm install rxdb rxjs Create a Local Database import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'myLocalDB', storage: getRxStorageLocalstorage() }); Add a Collection ts Kopieren await db.addCollections({ notes: { schema: { title: 'notes schema', version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLenght: 100 }, content: { type: 'string' } } } } }); Synchronize Use one of the Replication Plugins to connect with your preferred backend. ","version":"Next","tagName":"h2"},{"title":"Is RxDB the Right Solution for You?​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#is-rxdb-the-right-solution-for-you","content":" Long Offline Use: If your users need to work without an internet connection, RxDB's built-in offline-first design stands out compared to Firebase Realtime Database's partial offline approach.Custom or Complex Queries: RxDB lets you perform your queries locally, define indexing, and handle even complex transformations locally - no extra call to an external API.Avoid Vendor Lock-In: If you anticipate needing to move or adapt your backend later, you can do so without rewriting how your client manages its data.Peer-to-Peer Collaboration: Whether you need quick demos or real production use, WebRTC replication can link your users directly without central coordination of data storage. ","version":"Next","tagName":"h3"},{"title":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","type":0,"sectionRef":"#","url":"/articles/frontend-database.html","content":"","keywords":"","version":"Next"},{"title":"Why you might want to store data in the frontend​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#why-you-might-want-to-store-data-in-the-frontend","content":" ","version":"Next","tagName":"h2"},{"title":"Offline accessibility​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#offline-accessibility","content":" One compelling reason to store data in the frontend is to enable offline accessibility. By leveraging a frontend database, applications can cache essential data locally, allowing users to continue using the application even when an internet connection is unavailable. This feature is particularly useful for mobile applications or web apps with limited or intermittent connectivity. ","version":"Next","tagName":"h3"},{"title":"Caching​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#caching","content":" Frontend databases also serve as efficient caching mechanisms. By storing frequently accessed data locally, applications can minimize network requests and reduce latency, resulting in faster and more responsive user experiences. Caching is particularly beneficial for applications that heavily rely on remote data or perform computationally intensive operations. ","version":"Next","tagName":"h3"},{"title":"Decreased initial application start time​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#decreased-initial-application-start-time","content":" Storing data in the frontend decreases the initial application start time because the data is already present locally. By eliminating the need to fetch data from a server during startup, applications can quickly render the UI and provide users with an immediate interactive experience. This is especially advantageous for applications with large datasets or complex data retrieval processes. ","version":"Next","tagName":"h3"},{"title":"Password encryption for local data​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#password-encryption-for-local-data","content":" Security is a crucial aspect of data storage. With a front end database, developers can encrypt sensitive local data, such as user credentials or personal information, using encryption algorithms. This ensures that even if the device is compromised, the data remains securely stored and protected. ","version":"Next","tagName":"h3"},{"title":"Local database for state management​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#local-database-for-state-management","content":" Frontend databases provide an alternative to traditional state management libraries like Redux or NgRx. By utilizing a local database, developers can store and manage application state directly in the frontend, eliminating the need for additional libraries. This approach simplifies the codebase, reduces complexity, and provides a more straightforward data flow within the application. ","version":"Next","tagName":"h3"},{"title":"Low-latency local queries​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#low-latency-local-queries","content":" Frontend databases enable low-latency queries that run entirely on the client's device. Instead of relying on server round-trips for each query, the database executes queries locally, resulting in faster response times. This is particularly beneficial for applications that require real-time updates or frequent data retrieval. ","version":"Next","tagName":"h3"},{"title":"Building realtime applications with local data​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#building-realtime-applications-with-local-data","content":" Realtime applications often require immediate updates based on data changes. By storing data locally and utilizing a frontend database, developers can build realtime applications more easily. The database can observe data changes and automatically update the UI, providing a seamless and responsive user experience. ","version":"Next","tagName":"h3"},{"title":"Easier integration with JavaScript frameworks​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#easier-integration-with-javascript-frameworks","content":" Frontend databases, including RxDB, are designed to integrate seamlessly with popular JavaScript frameworks such as Angular, React.js, Vue.js, and Svelte. These databases offer well-defined APIs and support that align with the specific requirements of these frameworks, enabling developers to leverage the full potential of the frontend database within their preferred development environment. ","version":"Next","tagName":"h3"},{"title":"Simplified replication of database state​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#simplified-replication-of-database-state","content":" Replicating database state between the frontend and backend can be challenging, especially when dealing with complex REST routes. Frontend databases, however, provide simple mechanisms for replicating database state. They offer intuitive replication algorithms that facilitate data synchronization between the frontend and backend, reducing the complexity and potential pitfalls associated with complex REST-based replication. ","version":"Next","tagName":"h3"},{"title":"Improved scalability​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#improved-scalability","content":" Frontend databases offer improved scalability compared to traditional SQL databases. By leveraging the computational capabilities of client devices, the burden on server resources is reduced. Queries and operations are performed locally, minimizing the need for server round-trips and enabling applications to scale more efficiently. ","version":"Next","tagName":"h3"},{"title":"Why SQL databases are not a good fit for the front end of an application​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#why-sql-databases-are-not-a-good-fit-for-the-front-end-of-an-application","content":" While SQL databases excel in server-side scenarios, they pose limitations when used on the frontend. Here are some reasons why SQL databases are not well-suited for frontend applications: ","version":"Next","tagName":"h2"},{"title":"Push/Pull based vs. reactive​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#pushpull-based-vs-reactive","content":" SQL databases typically rely on a push/pull model, where the server pushes data to the client upon request. This approach is not inherently reactive, as it requires explicit requests for data updates. In contrast, frontend applications often require reactive data flows, where changes in data trigger automatic updates in the UI. Frontend databases, like RxDB, provide reactive capabilities that seamlessly integrate with the dynamic nature of frontend development. ","version":"Next","tagName":"h3"},{"title":"Initialization time and performance​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#initialization-time-and-performance","content":" SQL databases designed for server-side usage tend to have larger build sizes and initialization times, making them less efficient for browser-based applications. Frontend databases, on the other hand, directly leverage browser APIs like IndexedDB, OPFS, and WebWorker, resulting in leaner builds and faster initialization times. Often the queries are such fast, that it is not even necessary to implement a loading spinner. ","version":"Next","tagName":"h3"},{"title":"Build size considerations​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#build-size-considerations","content":" Server-side SQL databases typically come with a significant build size, which can be impractical for browser applications where code size optimization is crucial. Frontend databases, on the other hand, are specifically designed to operate within the constraints of browser environments, ensuring efficient resource utilization and smaller build sizes. For example the SQLite Webassembly file alone has a size of over 0.8 Megabyte with an additional 0.2 Megabyte in JavaScript code for connection. ","version":"Next","tagName":"h3"},{"title":"Why RxDB is a good fit for the frontend​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#why-rxdb-is-a-good-fit-for-the-frontend","content":" RxDB is a powerful frontend JavaScript database that addresses the limitations of SQL databases and provides an optimal solution for frontend data storage. Let's explore why RxDB is an excellent fit for frontend applications: ","version":"Next","tagName":"h2"},{"title":"Made in JavaScript, optimized for JavaScript applications​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#made-in-javascript-optimized-for-javascript-applications","content":" RxDB is designed and optimized for JavaScript applications. Built using JavaScript itself, RxDB offers seamless integration with JavaScript frameworks and libraries, allowing developers to leverage their existing JavaScript knowledge and skills. ","version":"Next","tagName":"h3"},{"title":"NoSQL (JSON) documents for UIs​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#nosql-json-documents-for-uis","content":" RxDB adopts a NoSQL approach, using JSON documents as its primary data structure. This aligns well with the JavaScript ecosystem, as JavaScript natively works with JSON objects. By using NoSQL documents, RxDB provides a more natural and intuitive data model for UI-centric applications. ","version":"Next","tagName":"h3"},{"title":"Better TypeScript support compared to SQL​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#better-typescript-support-compared-to-sql","content":" TypeScript has become increasingly popular for building frontend applications. RxDB provides excellent TypeScript support, allowing developers to leverage static typing and benefit from enhanced code quality and tooling. This is particularly advantageous when compared to SQL databases, which often have limited TypeScript support. ","version":"Next","tagName":"h3"},{"title":"Observable Queries for automatic UI updates​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#observable-queries-for-automatic-ui-updates","content":" RxDB introduces the concept of observable queries, powered by RxJS. Observable queries automatically update the UI whenever there are changes in the underlying data. This reactive approach eliminates the need for manual UI updates and ensures that the frontend remains synchronized with the database state. ","version":"Next","tagName":"h3"},{"title":"Optimized observed queries with the EventReduce Algorithm​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#optimized-observed-queries-with-the-eventreduce-algorithm","content":" RxDB optimizes observed queries with its EventReduce Algorithm. This algorithm intelligently reduces redundant events and ensures that UI updates are performed efficiently. By minimizing unnecessary re-renders, RxDB significantly improves performance and responsiveness in frontend applications. const query = myCollection.find({ selector: { age: { $gt: 21 } } }); const querySub = query.$.subscribe(results => { console.log('got results: ' + results.length); }); ","version":"Next","tagName":"h3"},{"title":"Observable document fields​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#observable-document-fields","content":" RxDB supports observable document fields, enabling developers to track changes at a granular level within documents. By observing specific fields, developers can reactively update the UI when those fields change, ensuring a responsive and synchronized frontend interface. myDocument.firstName$.subscribe(newName => console.log('name is: ' + newName)); ","version":"Next","tagName":"h3"},{"title":"Storing Documents Compressed​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#storing-documents-compressed","content":" RxDB provides the option to store documents in a compressed format, reducing storage requirements and improving overall database performance. Compressed storage offers benefits such as reduced disk space usage, faster data read/write operations, and improved network transfer speeds, making it an essential feature for efficient frontend data storage. ","version":"Next","tagName":"h3"},{"title":"Built-in Multi-tab support​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#built-in-multi-tab-support","content":" RxDB offers built-in multi-tab support, allowing data synchronization and state management across multiple browser tabs. This feature ensures consistent data access and synchronization, enabling users to work seamlessly across different tabs without conflicts or data inconsistencies. ","version":"Next","tagName":"h3"},{"title":"Replication Algorithm can be made compatible with any backend​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#replication-algorithm-can-be-made-compatible-with-any-backend","content":" RxDB's realtime replication algorithm is designed to be flexible and compatible with various backend systems. Whether you're using your own servers, Firebase, CouchDB, NATS, WebSocket, or any other backend, RxDB can be seamlessly integrated and synchronized with the backend system of your choice. ","version":"Next","tagName":"h3"},{"title":"Flexible storage layer for code reuse​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#flexible-storage-layer-for-code-reuse","content":" RxDB provides a flexible storage layer that enables code reuse across different platforms. Whether you're building applications with Electron.js, React Native, hybrid apps using Capacitor.js, or traditional web browsers, RxDB allows you to reuse the same codebase and leverage the power of a frontend database across different environments. ","version":"Next","tagName":"h3"},{"title":"Handling schema changes in distributed environments​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#handling-schema-changes-in-distributed-environments","content":" In distributed environments where data is stored on multiple client devices, handling schema changes can be challenging. RxDB tackles this challenge by providing robust mechanisms for handling schema changes. It ensures that schema updates propagate smoothly across devices, maintaining data integrity and enabling seamless schema evolution. ","version":"Next","tagName":"h3"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#follow-up","content":" To further explore RxDB and get started with using it in your frontend applications, consider the following resources: RxDB Quickstart: A step-by-step guide to quickly set up RxDB in your project and start leveraging its features.RxDB GitHub Repository: The official repository for RxDB, where you can find the code, examples, and community support. By adopting RxDB as your frontend database, you can unlock the full potential of frontend data storage and empower your applications with offline accessibility, caching, improved performance, and seamless data synchronization. RxDB's JavaScript-centric approach and powerful features make it an ideal choice for frontend developers seeking efficient and scalable data storage solutions. ","version":"Next","tagName":"h2"},{"title":"ideas for articles","type":0,"sectionRef":"#","url":"/articles/ideas","content":"","keywords":"","version":"Next"},{"title":"Seo keywords:​","type":1,"pageTitle":"ideas for articles","url":"/articles/ideas#seo-keywords","content":" X- "optimistic ui" X- "local database" (rddt done) X- "react-native encryption" X- "vue database" (rddt done) X- "jquery database" X- "vue indexeddb" X- "firebase realtime database alternative" (rddt done) X- "firestore alternative" (rddt done) X- "ionic storage" (rddt done) X- "local database" X- "offline database" X- "zero local first" X- "webrtc p2p" - 390 http://localhost:3000/replication-webrtc.html X- "indexeddb storage limit" - 590 https://rxdb.info/articles/indexeddb-max-storage-limit.htmlX- "indexeddb size limit" - 260 https://rxdb.info/articles/indexeddb-max-storage-limit.htmlX- "indexeddb max size" - 590 https://rxdb.info/articles/indexeddb-max-storage-limit.htmlX- "indexeddb limits" - 170 https://rxdb.info/articles/indexeddb-max-storage-limit.html X- "json based database" X- "json vs database" X- "reactjs storage" ","version":"Next","tagName":"h2"},{"title":"Seo​","type":1,"pageTitle":"ideas for articles","url":"/articles/ideas#seo","content":" "supabase alternative" "store local storage" "react localstorage" "react-native storage" "supabase offline" - 260 "store array in localstorage", "localStorage array of objects" "real time web apps" - 170 "reactive database" - 210 "electron sqlite" "in browser database" - 90 "offline first app" - 260 "react native sql" - 110 "sqlite electron" "localstorage vs indexeddb" "react native nosql database" - 30 "indexeddb library" - 260 "indexeddb encryption" - 90 "client side database" - 140 "webtransport vs websocket" "local first development" - 210 "local storage examples" "local vector database" - 590 "mobile app database" - 590 "web based database" "livequery" - 210 "expo database" - 390 "database sync" - 8100 "p2p database" - 170 "reactive app" - 260 "offline web app" - 320 "offline sync" - 320 "react native encrypted storage" - 1000 "firestore vs firebase" - 1300 "ionic alternatives" - 480 "react native backend" - 720 "react native alternative" - 1000 "react native sqlite" - 1900 "flutter vs react native" - 5400 "react native redux" - 3600 "redux alternative" - 1300 "Awesome local first" - 10 "tauri database" - 170 "sqlite javascript" - 2900 "sqlite typescript" - 260 "sync engine" - 390 "indexeddb alternative" - 70 ","version":"Next","tagName":"h2"},{"title":"Non Seo​","type":1,"pageTitle":"ideas for articles","url":"/articles/ideas#non-seo","content":" "Local-First Partial Sync with RxDB""why the indexeddb API is almost perfekt""how to do auth with RxDB""Where to store that JWT token?" ","version":"Next","tagName":"h2"},{"title":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","type":0,"sectionRef":"#","url":"/articles/firestore-alternative.html","content":"","keywords":"","version":"Next"},{"title":"What Makes RxDB a Great Firestore Alternative?​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#what-makes-rxdb-a-great-firestore-alternative","content":" Firestore is convenient for many projects, but it does lock you into Google's ecosystem. Below are some of the key advantages you gain by choosing RxDB: ","version":"Next","tagName":"h2"},{"title":"1. Fully Offline-First​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#1-fully-offline-first","content":" RxDB runs directly in your client application (browser, Node.js, Electron, React Native, etc.). Data is stored locally, so your application remains fully functional even when offline. When the device returns online, RxDB's flexible replication protocol synchronizes your local changes with any remote endpoint. ","version":"Next","tagName":"h3"},{"title":"2. Freedom to Use Any Backend​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#2-freedom-to-use-any-backend","content":" Unlike Firestore, RxDB doesn't require a proprietary hosting service. You can: Host your data on your own server (Node.js, Go, Python, etc.).Use existing databases like PostgreSQL, CouchDB, or MongoDB with custom endpoints.Implement a custom GraphQL or REST-based API for syncing. This backend-agnostic approach protects you from vendor lock-in. Your application's client-side data storage remains consistent; only your replication logic (or plugin) changes if you switch servers. ","version":"Next","tagName":"h3"},{"title":"3. Advanced Conflict Resolution​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#3-advanced-conflict-resolution","content":" Firestore enforces a last-write-wins conflict resolution strategy. This might cause issues if multiple users or devices update the same data in complex ways. RxDB lets you: Implement custom conflict resolution via revisions.Store partial merges, track versions, or preserve multiple user edits.Fine-tune how your data merges to ensure consistency across distributed systems. ","version":"Next","tagName":"h3"},{"title":"4. Reduced Cloud Costs​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#4-reduced-cloud-costs","content":" Firestore queries often count as billable reads. With RxDB, queries run locally against your local state - no repeated network calls or extra charges. You pay only for the data actually synced, not every read. For read-heavy apps, using RxDB as a Firestore alternative can significantly reduce costs. ","version":"Next","tagName":"h3"},{"title":"5. No Limits on Query Features​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#5-no-limits-on-query-features","content":" Firestore's query engine is limited by certain constraints (e.g., no advanced joins, limited indexing). With RxDB: NoSQL data is stored locally, and you can define any indexes you need.Perform complex queries, run full-text search, or do aggregated transformations or even vector search.Use RxDB's reactivity to subscribe to query results in real time. ","version":"Next","tagName":"h3"},{"title":"6. True Offline-Start Support​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#6-true-offline-start-support","content":" While Firestore does have offline caching, it often requires an online check at app initialization for authentication. RxDB is truly offline-first; you can launch the app and write data even if the device never goes online initially. It's ready whenever the user is. ","version":"Next","tagName":"h3"},{"title":"7. Cross-Platform: Any JavaScript Runtime​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#7-cross-platform-any-javascript-runtime","content":" RxDB is designed to run in any environment that can execute JavaScript. Whether you’re building a web app in the browser, an Electron desktop application, a React Native mobile app, or a command-line tool with Node.js, RxDB’s storage layer is swappable to fit your runtime’s capabilities. In the browser, store data in IndexedDB or OPFS.In Node.js, use LevelDB or other supported storages.In React Native, pick from a range of adapters suited for mobile devices.In Electron, rely on fast local storage with zero changes to your application code. ","version":"Next","tagName":"h3"},{"title":"How Does RxDB's Sync Work?​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#how-does-rxdbs-sync-work","content":" RxDB replication is powered by its own Sync Engine. This simple yet robust protocol enables: Pull: Fetch new or updated documents from the server.Push: Send local changes back to the server.Live Real-Time: Once you're caught up, you can opt for event-based streaming instead of continuous polling. Code Example: Sync RxDB with a Custom Backend import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; import { replicateRxCollection } from 'rxdb/plugins/replication'; async function initDB() { const db = await createRxDatabase({ name: 'mydb', storage: getRxStorageLocalstorage(), multiInstance: true, eventReduce: true }); await db.addCollections({ tasks: { schema: { title: 'task schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string', maxLength: 100 }, title: { type: 'string' }, done: { type: 'boolean' } } } } }); // Start a custom REST-based replication replicateRxCollection({ collection: db.tasks, replicationIdentifier: 'my-tasks-rest-api', push: { handler: async (documents) => { // Send docs to your REST endpoint const res = await fetch('https://myapi.com/push', { method: 'POST', body: JSON.stringify({ docs: documents }) }); // Return conflicts if any return await res.json(); } }, pull: { handler: async (lastCheckpoint, batchSize) => { // Fetch from your REST endpoint const res = await fetch(`https://myapi.com/pull?checkpoint=${JSON.stringify(lastCheckpoint)}&limit=${batchSize}`); return await res.json(); } }, live: true // keep watching for changes }); return db; } By swapping out the handler implementations or using an official plugin (e.g., GraphQL, CouchDB, Firestore replication, etc.), you can adapt to any backend or data source. RxDB thus becomes a flexible alternative to Firestore while maintaining real-time capabilities. ","version":"Next","tagName":"h2"},{"title":"Getting Started with RxDB as a Firestore Alternative​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#getting-started-with-rxdb-as-a-firestore-alternative","content":" ","version":"Next","tagName":"h2"},{"title":"Install RxDB:​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#install-rxdb","content":" npm install rxdb rxjs ","version":"Next","tagName":"h3"},{"title":"Create a Database:​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#create-a-database","content":" import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'mydb', storage: getRxStorageLocalstorage() }); ","version":"Next","tagName":"h3"},{"title":"Define Collections:​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#define-collections","content":" await db.addCollections({ items: { schema: { title: 'items schema', version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 }, text: { type: 'string' } } } } }); ","version":"Next","tagName":"h3"},{"title":"Sync​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#sync","content":" Use a Replication Plugin to connect with a custom backend or existing database. For a Firestore-specific approach, RxDB Firestore Replication also exists if you want to combine local indexing and advanced queries with a Cloud Firestore backend. But if you really want to replace Firestore entirely - just point RxDB to your new backend. ","version":"Next","tagName":"h3"},{"title":"Example: Start a WebRTC P2P Replication​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#example-start-a-webrtc-p2p-replication","content":" In addition to syncing with a central server, RxDB also supports pure peer-to-peer replication using WebRTC. This can be invaluable for scenarios where clients need to sync data directly without a master server. import { replicateWebRTC, getConnectionHandlerSimplePeer } from 'rxdb/plugins/replication-webrtc'; const replicationPool = await replicateWebRTC({ collection: db.tasks, topic: 'my-p2p-room', // Clients with the same topic will sync with each other. connectionHandlerCreator: getConnectionHandlerSimplePeer({ // Use your own or the official RxDB signaling server signalingServerUrl: 'wss://signaling.rxdb.info/', // Node.js requires a polyfill for WebRTC & WebSocket wrtc: require('node-datachannel/polyfill'), webSocketConstructor: require('ws').WebSocket }), pull: {}, // optional pull config push: {} // optional push config }); // The replicationPool manages all connected peers replicationPool.error$.subscribe(err => { console.error('P2P Sync Error:', err); }); This example sets up a live P2P replication where any new peers joining the same topic automatically sync local data with each other, eliminating the need for a dedicated central server for the actual data exchange. ","version":"Next","tagName":"h3"},{"title":"Is RxDB Right for Your Project?​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#is-rxdb-right-for-your-project","content":" You want offline-first: If you need an offline-first app that starts offline, RxDB's local database approach and sync protocol excel at this.Your project is read-heavy: Reading from Firestore for every query can get expensive. With RxDB, reads are free and local; you only pay for writes or sync overhead.You need advanced queries: Firestore's query constraints may not suit complex data. With RxDB, you can define your own indexing logic or run arbitrary queries locally.You want no vendor lock-in: Easily transition from Firestore to your own server or another vendor - just change the replication layer. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#follow-up","content":" If you've been searching for a Firestore alternative that gives you the freedom to sync your data with any backend, offers robust offline-first capabilities, and supports truly customizable conflict resolution and queries, RxDB is worth exploring. You can adopt it seamlessly, ensure local reads, reduce costs, and stay in complete control of your data layer. Ready to dive in? Check out the RxDB Quickstart Guide, join our Discord community, and experience how RxDB can be the perfect local-first, real-time database solution for your next project. More resources: RxDB Sync EngineFirestore Replication PluginCustom Conflict ResolutionRxDB GitHub Repository ","version":"Next","tagName":"h2"},{"title":"RxDB as In-memory NoSQL Database: Empowering Real-Time Applications","type":0,"sectionRef":"#","url":"/articles/in-memory-nosql-database.html","content":"","keywords":"","version":"Next"},{"title":"Speed and Performance Benefits​","type":1,"pageTitle":"RxDB as In-memory NoSQL Database: Empowering Real-Time Applications","url":"/articles/in-memory-nosql-database.html#speed-and-performance-benefits","content":" One of the key advantages of using RxDB as an in-memory NoSQL database is its ability to leverage in-memory storage for faster database operations. By storing data directly in memory, database operations can be performed significantly faster compared to traditional disk-based databases. This is especially important for real-time applications where every millisecond counts. With RxDB, developers can achieve near-instantaneous data access and manipulation, enabling highly responsive user experiences. Additionally, RxDB eliminates disk I/O bottlenecks that are typically associated with traditional databases. In traditional databases, disk reads and writes can become a bottleneck as the amount of data grows. In contrast, an in-memory database like RxDB keeps the entire dataset in RAM, eliminating disk access overhead. This makes it an excellent choice for applications dealing with real-time analytics, high-throughput data processing, and caching. ","version":"Next","tagName":"h2"},{"title":"Persistence Options​","type":1,"pageTitle":"RxDB as In-memory NoSQL Database: Empowering Real-Time Applications","url":"/articles/in-memory-nosql-database.html#persistence-options","content":" While RxDB offers an in-memory storage adapter, it also offers persistence storages. Adapters such as IndexedDB, SQLite, and OPFS enable developers to persist data locally in the browser, making applications accessible even when offline. This hybrid approach combines the benefits of in-memory performance with data durability, providing the best of both worlds. Developers can choose the adapter that best suits their needs, balancing the speed of in-memory storage with the long-term data persistence required for certain applications. import { createRxDatabase } from 'rxdb'; import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageMemory() }); Also the memory mapped RxStorage exists as a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance is replicated with the underlying storage for persistence. The main reason to use this is to improve initial page load and query/write times. This is mostly useful in browser based applications. ","version":"Next","tagName":"h2"},{"title":"Use Cases for RxDB​","type":1,"pageTitle":"RxDB as In-memory NoSQL Database: Empowering Real-Time Applications","url":"/articles/in-memory-nosql-database.html#use-cases-for-rxdb","content":" RxDB's capabilities make it well-suited for various real-time applications. Some notable use cases include: Chat Applications and Real-Time Messaging: RxDB's in-memory performance and real-time synchronization capabilities make it an excellent choice for building chat applications and real-time messaging systems. Developers can ensure that messages are delivered and synchronized across multiple clients in real-time, providing a seamless and responsive chat experience. Collaborative Document Editors: RxDB's ability to handle data streams and propagate changes in real-time makes it ideal for collaborative document editing. Multiple users can simultaneously edit a document, and their changes are instantly synchronized, allowing for real-time collaboration and ensuring that everyone has the most up-to-date version of the document. Real-Time Analytics Dashboards: RxDB's speed and scalability make it a valuable tool for real-time analytics dashboards. It can handle high volumes of data and perform complex analytics operations in real-time, providing instant insights and visualizations to users. In conclusion, RxDB serves as a powerful in-memory NoSQL database that empowers developers to build real-time applications with exceptional speed, flexibility, and scalability. Its ability to leverage in-memory storage, eliminate disk I/O bottlenecks, and provide persistence options make it an attractive choice for a wide range of real-time use cases. Whether it's chat applications, collaborative document editors, or real-time analytics dashboards, RxDB provides the foundation for building responsive and interactive software that meets the demands of today's users. ","version":"Next","tagName":"h2"},{"title":"Ionic Storage - RxDB as database for hybrid apps","type":0,"sectionRef":"#","url":"/articles/ionic-database.html","content":"","keywords":"","version":"Next"},{"title":"What are Ionic Hybrid Apps?​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#what-are-ionic-hybrid-apps","content":" Ionic (aka Ionic 2 ) hybrid apps combine the strengths of web technologies (HTML, CSS, JavaScript) with native app development to deliver cross-platform applications. They are built using web technologies and then wrapped in a native container to be deployed on various platforms like iOS, Android, and the web. These apps provide a consistent user experience across devices while benefiting from the efficiency and familiarity of web development. ","version":"Next","tagName":"h2"},{"title":"Storing and Querying Data in an Ionic App​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#storing-and-querying-data-in-an-ionic-app","content":" Storing and querying data is a fundamental aspect of any application, including hybrid apps. These apps often need to operate offline, store user-generated content, and provide responsive user interfaces. Therefore, having a reliable and efficient way to manage data on the client's device is crucial. ","version":"Next","tagName":"h2"},{"title":"Introducing RxDB as a Client-Side Database for Ionic Apps​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#introducing-rxdb-as-a-client-side-database-for-ionic-apps","content":" RxDB steps in as a powerful solution to address the data management needs of ionic hybrid apps. It's a NoSQL client-side database that offers exceptional performance and features tailored to the unique requirements of client-side applications. Let's delve into the key features of RxDB that make it a great fit for these apps. ","version":"Next","tagName":"h2"},{"title":"Getting Started with RxDB​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#getting-started-with-rxdb","content":" ","version":"Next","tagName":"h3"},{"title":"What is RxDB?​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#what-is-rxdb","content":" At its core, RxDB is a NoSQL database that operates with a local-first approach. This means that your app's data is stored and processed primarily on the client's device, reducing the dependency on constant network connectivity. By doing so, RxDB ensures your app remains responsive and functional, even when offline. ","version":"Next","tagName":"h3"},{"title":"Local-First Approach​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#local-first-approach","content":" The local-first approach adopted by RxDB is a game-changer for hybrid applications. Storing data locally allows your app to function seamlessly without an internet connection, providing users with uninterrupted access to their data. When connectivity is restored, RxDB handles the synchronization of data, ensuring that any changes made offline are appropriately propagated. ","version":"Next","tagName":"h3"},{"title":"Observable Queries​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#observable-queries","content":" One of RxDB's standout features is its implementation of observable queries. This concept allows your app's user interface to be dynamically updated in real time as data changes within the database. RxDB's observables create a bridge between your database and user interface, keeping them in sync effortlessly. ","version":"Next","tagName":"h3"},{"title":"NoSQL Query Engine​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#nosql-query-engine","content":" RxDB's NoSQL query engine empowers you to perform powerful queries on your app's data, without the constraints imposed by traditional relational databases. This flexibility is particularly valuable when dealing with unstructured or semi-structured data. With the NoSQL query engine, you can retrieve, filter, and manipulate data according to your app's unique requirements. const foundDocuments = await myDatabase.todos.find({ selector: { done: { $eq: false } } }).exec(); ","version":"Next","tagName":"h3"},{"title":"Great Observe Performance with EventReduce​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#great-observe-performance-with-eventreduce","content":" RxDB introduces a concept called EventReduce, which optimizes the observation process. Instead of overwhelming your app's UI with every data change, EventReduce filters and batches these changes to provide a smooth and efficient experience. This leads to enhanced app performance, lower resource usage, and ultimately, happier users. ","version":"Next","tagName":"h3"},{"title":"Why NoSQL is a Better Fit for Client-Side Applications Compared to relational databases like SQLite​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#why-nosql-is-a-better-fit-for-client-side-applications-compared-to-relational-databases-like-sqlite","content":" When it comes to choosing the right database solution for your client-side applications, NoSQL RxDB presents compelling advantages over traditional options like SQLite. Let's delve into the key reasons why NoSQL RxDB is a superior fit for your ionic hybrid app development. ","version":"Next","tagName":"h2"},{"title":"Easier Document-Based Replication​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#easier-document-based-replication","content":" NoSQL databases, like RxDB, inherently embrace a document-based approach to data storage. This design choice simplifies data replication between clients and servers. With documents representing discrete units of data, you can easily synchronize individual pieces of information without the complexity that can arise when dealing with rows and tables in a relational database like SQLite. This document-centric replication model streamlines the synchronization process and ensures that your app's data remains consistent across devices. ","version":"Next","tagName":"h3"},{"title":"Offline Capable​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#offline-capable","content":" One of the defining features of client-side applications is the ability to function even when offline. NoSQL RxDB excels in this area by supporting a local-first approach. Data is cached on the client's device, enabling the app to remain fully functional even without an internet connection. As connectivity is restored, RxDB handles data synchronization with the server seamlessly. This offline capability ensures a smooth user experience, critical for ionic hybrid apps catering to users in various network conditions. ","version":"Next","tagName":"h3"},{"title":"NoSQL Has Better TypeScript Support​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#nosql-has-better-typescript-support","content":" TypeScript, a popular superset of JavaScript, is renowned for its static typing and enhanced developer experience. NoSQL databases like RxDB are inherently flexible, making them well-suited for TypeScript integration. With well-defined data structures and clear typings, NoSQL RxDB offers improved type safety and easier development when compared to traditional SQL databases like SQLite. This results in reduced debugging time and increased code reliability. ","version":"Next","tagName":"h3"},{"title":"Easier Schema Migration with NoSQL Documents​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#easier-schema-migration-with-nosql-documents","content":" Schema changes are a common occurrence in application development, and dealing with them can be challenging. NoSQL databases, including RxDB, are more forgiving in this aspect. Since documents in NoSQL databases don't enforce a rigid structure like tables in relational databases, schema changes are often simpler to manage. This flexibility makes it easier to evolve your app's data structure over time without the need for complex migration scripts, a notable advantage when compared to SQLite. ","version":"Next","tagName":"h3"},{"title":"Great Performance​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#great-performance","content":" RxDB's excellent performance stems from its advanced indexing capabilities, which streamline data retrieval and ensure swift query execution. Additionally, the JSON key compression employed by RxDB minimizes storage overhead, enabling efficient data transfer and quicker loading times. The incorporation of real-time updates through change streams and the EventReduce mechanism further enhances RxDB's performance, delivering a responsive user experience even as data changes are propagated seamlessly. ","version":"Next","tagName":"h2"},{"title":"Using RxDB in an Ionic Hybrid App​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#using-rxdb-in-an-ionic-hybrid-app","content":" RxDB's integration into your ionic hybrid app opens up a world of possibilities for efficient data management. Let's explore how to set up RxDB, use it with popular JavaScript frameworks, and take advantage of its diverse storage options. ","version":"Next","tagName":"h2"},{"title":"Setup RxDB​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#setup-rxdb","content":" Getting started with RxDB is a straightforward process. By including the RxDB library in your project, you can quickly start harnessing its capabilities. Begin by installing the RxDB package from the npm registry. Then, configure your database instance to suit your app's needs. This setup process paves the way for seamless data management in your ionic hybrid app. For a full instruction, follow the RxDB Quickstart. ","version":"Next","tagName":"h3"},{"title":"Using RxDB in Frameworks (React, Angular, Vue.js)​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#using-rxdb-in-frameworks-react-angular-vuejs","content":" RxDB seamlessly integrates with various JavaScript frameworks, ensuring compatibility with your preferred development environment. Whether you're building your ionic hybrid app with React, Angular, or Vue.js, RxDB offers bindings and tools that enable you to leverage its features effortlessly. This compatibility allows you to stay within the comfort zone of your chosen framework while benefiting from RxDB's powerful data management capabilities. ","version":"Next","tagName":"h3"},{"title":"Different RxStorage Layers for RxDB​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#different-rxstorage-layers-for-rxdb","content":" RxDB doesn't limit you to a single storage solution. Instead, it provides a range of RxStorage layers to accommodate diverse use cases. These storage layers offer flexibility and customization, enabling you to tailor your data management strategy to match your app's requirements. Let's explore some of the available RxStorage options: LocalStorage RxStorage: Based on the browsers localStorage. Easy to set up and fast for small datasets.IndexedDB RxStorage: Leveraging the native browser storage, IndexedDB RxStorage offers reliable data persistence. This storage option is suitable for a wide range of scenarios and is supported by most modern browsers.OPFS RxStorage: Operating within the browser's file system, OPFS RxStorage is a unique choice that can handle larger data volumes efficiently. It's particularly useful for applications that require substantial data storage.Memory RxStorage: Memory RxStorage is perfect for temporary or cache-like data storage. It keeps data in memory, which can result in rapid data access but doesn't provide long-term persistence.SQLite RxStorage: SQLite is the goto database for mobile applications. It is build in on android and iOS devices. The SQLite RxDB storage layer is build upon SQLite and offers the best performance on hybrid apps, like ionic. ","version":"Next","tagName":"h3"},{"title":"Replication of Data with RxDB between Clients and Servers​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#replication-of-data-with-rxdb-between-clients-and-servers","content":" Efficient data replication between clients and servers is the backbone of modern application development, ensuring that data remains consistent and up-to-date across various devices and platforms. RxDB provides a suite of replication methods that facilitate seamless communication between clients and servers, ensuring that your data is always in sync. ","version":"Next","tagName":"h2"},{"title":"RxDB Replication Algorithm​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#rxdb-replication-algorithm","content":" At the heart of RxDB's replication capabilities lies a sophisticated algorithm designed to manage data synchronization between clients and servers. This algorithm intelligently handles data changes, conflict resolution, and network connectivity fluctuations, resulting in reliable and efficient data replication. With the RxDB replication algorithm, your application can maintain data consistency across devices without unnecessary complexities. CouchDB Replication: RxDB's integration with CouchDB replication presents a powerful way to synchronize data between clients and servers. CouchDB, a well-established NoSQL database, excels at distributed and decentralized data scenarios. By utilizing RxDB's CouchDB replication, you can establish bidirectional synchronization between your RxDB-powered client and a CouchDB server. This synchronization ensures that data updates made on either end are seamlessly propagated to the other, facilitating collaboration and data sharing. Firestore Replication: Firestore, Google's cloud-hosted NoSQL database, offers another avenue for data replication in RxDB. With Firestore replication, you can establish a connection between your RxDB-powered app and Firestore's cloud infrastructure. This integration provides real-time updates to data across multiple instances of your application, ensuring that users always have access to the latest information. RxDB's support for Firestore replication empowers you to build dynamic and responsive applications that thrive in today's fast-paced digital landscape. WebRTC Replication: Peer-to-peer (P2P) replication via WebRTC introduces a cutting-edge approach to data synchronization in RxDB. P2P replication allows devices to communicate directly with each other, bypassing the need for a central server. This method proves invaluable in scenarios where network connectivity is limited or unreliable. With WebRTC replication, devices can exchange data directly, enabling collaboration and information sharing even in challenging network conditions. ","version":"Next","tagName":"h3"},{"title":"RxDB as an Alternative for Ionic Secure Storage​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#rxdb-as-an-alternative-for-ionic-secure-storage","content":" When it comes to securing sensitive data in your Ionic applications, RxDB emerges as a powerful alternative to traditional secure storage solutions. Let's delve into why RxDB is an exceptional choice for safeguarding your data while providing additional benefits. ","version":"Next","tagName":"h2"},{"title":"RxDB On-Device Encryption Plugin​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#rxdb-on-device-encryption-plugin","content":" RxDB offers an on-device encryption plugin, adding an extra layer of security to your app's data. This means that data stored within the RxDB database can be encrypted, ensuring that even if the device falls into the wrong hands, the sensitive information remains inaccessible without the proper decryption key. This level of data protection is crucial for applications that deal with personal or confidential information. Encryption runs either with AES on crypto-js or with the Web Crypto API which is faster and more secure. ","version":"Next","tagName":"h3"},{"title":"Works Offline​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#works-offline","content":" Security should never compromise functionality. RxDB excels in this area by allowing your application to operate seamlessly even when offline. The locally stored encrypted data remains accessible and functional, enabling users to interact with the app's features even without an active internet connection. This offline capability ensures that user data is secure, while the app continues to deliver a responsive and uninterrupted experience. ","version":"Next","tagName":"h3"},{"title":"Easy-to-Setup Replication with Your Backend​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#easy-to-setup-replication-with-your-backend","content":" Ensuring data consistency between your client-side application and backend is a key concern for developers. RxDB simplifies this process with its straightforward replication setup. You can effortlessly configure data synchronization between your local RxDB instance and your backend server. This replication capability ensures that encrypted data remains up-to-date and aligned with the central database, enhancing data integrity and security. ","version":"Next","tagName":"h3"},{"title":"Compression of Client-Side Stored Data​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#compression-of-client-side-stored-data","content":" In addition to security and offline capabilities, RxDB also offers data compression. This means that the data stored on the client's device is efficiently compressed, reducing storage requirements and improving overall app performance. This compression ensures that your app remains responsive and efficient, even as data volumes grow. ","version":"Next","tagName":"h3"},{"title":"Cost-Effective Solution​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#cost-effective-solution","content":" In addition to its security features, RxDB offers cost-effective benefits. RxDB is priced more affordably compared to some other secure storage solutions, making it an attractive option for developers seeking robust security without breaking the bank. For many users, the free version of RxDB provides ample features to meet their application's security and data management needs. ","version":"Next","tagName":"h3"},{"title":"Follow Up​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#follow-up","content":" Try out the RxDB ionic example projectTry out the RxDB QuickstartJoin the RxDB Chat ","version":"Next","tagName":"h2"},{"title":"IndexedDB Max Storage Size Limit","type":0,"sectionRef":"#","url":"/articles/indexeddb-max-storage-limit.html","content":"","keywords":"","version":"Next"},{"title":"Why IndexedDB Has a Storage Limit​","type":1,"pageTitle":"IndexedDB Max Storage Size Limit","url":"/articles/indexeddb-max-storage-limit.html#why-indexeddb-has-a-storage-limit","content":" Browsers need a way to curb runaway disk usage and safeguard user resources. This is accomplished through quota management policies, which can vary among Chrome, Firefox, Safari, Edge, and others. Some browsers use a percentage of your total disk space, while others rely on a fixed maximum or dynamic approach per origin. These policies are designed to prevent malicious or poorly optimized web pages from consuming an unreasonable amount of user storage. Chrome (and Chromium-based browsers) typically allow you to use a percentage of the user’s free disk space, whereas Firefox historically prompts users to allow more than 5 MB in mobile or 50 MB in desktop. Safari often sets tighter maximum caps, especially on iOS devices. Edge aligns closely with Chrome’s rules but can also include enterprise or corporate policy overrides. Understanding these default or dynamic limits prepares you to plan your app’s storage needs appropriately. ","version":"Next","tagName":"h2"},{"title":"Browser-Specific IndexedDB Limits​","type":1,"pageTitle":"IndexedDB Max Storage Size Limit","url":"/articles/indexeddb-max-storage-limit.html#browser-specific-indexeddb-limits","content":" IndexedDB size quotas differ significantly across browsers and platforms. While there isn’t a universal rule, the following table summarizes approximate limits and any notes or caveats you should be aware of: Browser\tApprox. Limit\tNotesChrome/Chromium\tUp to ~80% of free disk, per origin cap\tOften cited as 60 GB on a 100 GB drive. Shared pool approach. Quota usage can prompt partial or extended user approvals. Firefox\t~2 GB (desktop) or ~5 MB initial for mobile\tOlder versions asked permission at 50 MB for desktop. Ephemeral/incognito sessions may require repeated user prompts. Safari (iOS)\t~1 GB per origin (variable)\tHistorically stricter. iOS devices limit quotas further. Behavior can differ between iOS Safari versions or iPadOS. Edge\tSimilar to Chrome’s 80% of free space\tCan be influenced by Windows enterprise policies. Generally aligned with Chromium approach. iOS Safari\tTypically 1 GB, can be less on older iOS\tEarly iOS versions were known for more aggressive quotas and data eviction on low space. Android Chrome\tSimilar to desktop Chrome\tMay exhibit warnings in especially low-storage devices. The same 80% free space logic generally applies. Historically, these limits have evolved. For instance, older Firefox versions included dom.indexedDB.warningQuota, showing a 50 MB prompt on desktop or a 5 MB prompt on mobile—many developers wrote about these notifications on Stack Overflow. Since around 2015, Firefox has changed its quota approach significantly. Likewise, Safari used to limit data more aggressively on older iOS versions. Some older tutorials suggest comparing IndexedDB to localStorage, but modern browsers allow far larger and more flexible storage with IndexedDB than the old localStorage or cookie-based setups. ","version":"Next","tagName":"h2"},{"title":"Checking Your Current IndexedDB Usage​","type":1,"pageTitle":"IndexedDB Max Storage Size Limit","url":"/articles/indexeddb-max-storage-limit.html#checking-your-current-indexeddb-usage","content":" To assess where your app stands relative to these storage limits, you can use the Storage Estimation API. The snippet below shows how to estimate both your used storage and the total space allocated to your origin: const quota = await navigator.storage.estimate(); const totalSpace = quota.quota; const usedSpace = quota.usage; console.log('Approx total allocated space:', totalSpace); console.log('Approx used space:', usedSpace); Some browsers (all modern ones) also provide a navigator.storage.persist() method to request persistent storage, preventing the browser from automatically clearing your data if the user’s device runs low on space. Note that users might deny such requests, or the request might fail silently on stricter environments. Always handle these outcomes gracefully and design your app to degrade if persistent storage is unavailable. ","version":"Next","tagName":"h2"},{"title":"Testing Your App’s IndexedDB Quotas​","type":1,"pageTitle":"IndexedDB Max Storage Size Limit","url":"/articles/indexeddb-max-storage-limit.html#testing-your-apps-indexeddb-quotas","content":" The best way to handle real-world usage is to test for low storage conditions and large data sets in different environments. You can fill up the space manually by writing repetitive test data or running scripts that bulk-insert documents until an error occurs. Real-time usage monitors or dashboards can keep track of your navigator.storage.estimate() results, letting you see how close you are to the max limit in production. Developer tools in Chrome or Firefox can simulate limited storage situations, which is crucial for QA: 0:42 Simulate low storage quota with DevTools This short tutorial shows how you can artificially reduce available storage in Google Chrome’s dev tools to see how your app behaves when nearing or exceeding the quota. ","version":"Next","tagName":"h2"},{"title":"Handling Errors When Limits Are Reached​","type":1,"pageTitle":"IndexedDB Max Storage Size Limit","url":"/articles/indexeddb-max-storage-limit.html#handling-errors-when-limits-are-reached","content":" When the user’s device is too full or your app exceeds the allotted quota, most browsers will throw a QuotaExceededError (or similarly named exception) when trying to store additional data. Often, the request to IndexedDB simply fails with an error event. Handling this gracefully is essential to avoid crashes or data corruption. A typical approach is to wrap your write operations in try/catch blocks or in onsuccess / onerror event callbacks. If you detect a quota error, you can prompt the user to clear out old items or reduce the scope of offline data. Some apps implement a fallback system that removes less critical documents to free space and then retries the write. try { const tx = db.transaction('largeStore', 'readwrite'); const store = tx.objectStore('largeStore'); await store.add(hugeData, someKey); await tx.done; } catch (error) { if (error.name === 'QuotaExceededError') { console.warn('IndexedDB quota exceeded. Cleanup or prompt user to free space.'); // Optionally remove older data or show a UI hint: // removeOldDocuments(); // displayStorageFullDialog(); } else { // handle other errors console.error('IndexedDB write error:', error); } } ","version":"Next","tagName":"h2"},{"title":"Tricks to Exceed the Storage Size Limitation​","type":1,"pageTitle":"IndexedDB Max Storage Size Limit","url":"/articles/indexeddb-max-storage-limit.html#tricks-to-exceed-the-storage-size-limitation","content":" Even if you plan well, your app might need more storage than a single origin typically allows. There are a few advanced tactics you can use: If you store binary data such as images or videos, consider compressing them via the Compression Streams API. For textual or JSON data, a library like RxDB supports built-in key-compression to shorten field names or entire documents. This can be extremely helpful when storing large sets of objects: // Example: How key-compression can transform your documents internally const uncompressed = { "firstName": "Corrine", "lastName": "Ziemann", "shoppingCartItems": [ { "productNumber": 29857, "amount": 1 }, { "productNumber": 53409, "amount": 6 } ] }; const compressed = { "|e": "Corrine", "|g": "Ziemann", "|i": [ { "|h": 29857, "|b": 1 }, { "|h": 53409, "|b": 6 } ] }; Sharding data across multiple subdomains or iframes is another trick, though it complicates communication. When you need truly massive offline data, you might store part of the data under sub1.yoursite.com and another chunk under sub2.yoursite.com, using postMessage() to coordinate. This can circumvent single-origin limitations, but it introduces extra complexity. Another effective method is to let data expire automatically—perhaps older records are removed if they haven’t been accessed for a certain period. ","version":"Next","tagName":"h2"},{"title":"IndexedDB Max Size of a Single Object​","type":1,"pageTitle":"IndexedDB Max Storage Size Limit","url":"/articles/indexeddb-max-storage-limit.html#indexeddb-max-size-of-a-single-object","content":" There is no explicit cap on how large an individual object or record in IndexedDB can be, other than the overall disk quota. If you attempt to store one extremely large object, you will eventually hit browser memory constraints or the global storage quota. In practice, you’ll encounter out-of-memory issues in JavaScript before IndexedDB itself refuses a single large write. A helpful test can be seen in this JSFiddle experiment where you see browsers can crash when creating massive in-memory objects. ","version":"Next","tagName":"h2"},{"title":"Is There a Time Limit for Data Stored in IndexedDB?​","type":1,"pageTitle":"IndexedDB Max Storage Size Limit","url":"/articles/indexeddb-max-storage-limit.html#is-there-a-time-limit-for-data-stored-in-indexeddb","content":" IndexedDB data can remain indefinitely as long as the user does not clear the browser’s data or the origin does not run afoul of automated eviction policies (e.g., Safari or Android might remove large caches for sites unused over a long period when space is needed). Typically, there is no “time limit,” but ephemeral modes or incognito sessions have their own rules. If you rely on permanent offline data, request persistent storage and handle the possibility that the user or the OS could still remove your data under extreme conditions. Especially Safari is known to be very fast in deleting local data. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"IndexedDB Max Storage Size Limit","url":"/articles/indexeddb-max-storage-limit.html#follow-up","content":" Learn more by checking the IndexedDB official docs, which detail store design, error handling, and quota usage. If you need a straightforward way to manage large offline data with compression and conflict resolution, explore the RxDB Quickstart. You can also join the community on GitHub to share tips on overcoming the IndexedDB max storage size limit in production environments. ","version":"Next","tagName":"h2"},{"title":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","type":0,"sectionRef":"#","url":"/articles/ionic-storage.html","content":"","keywords":"","version":"Next"},{"title":"Why RxDB for Ionic Storage?​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#why-rxdb-for-ionic-storage","content":" ","version":"Next","tagName":"h2"},{"title":"1. Offline-Ready NoSQL Storage​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#1-offline-ready-nosql-storage","content":" Offline functionality is crucial for modern mobile applications, particularly when devices encounter unreliable or slow networks. RxDB stores all data locally so your Ionic app can run seamlessly without needing a continuous internet connection. When a network is available again, RxDB automatically synchronizes changes with your backend - no extra code required. ","version":"Next","tagName":"h3"},{"title":"2. Powerful Encryption​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#2-powerful-encryption","content":" Securing on-device data is paramount when handling sensitive information. RxDB includes encryption plugins that let you: Encrypt data fields at rest with AESInvalidate data access by simply withholding the passwordKeep your users' data confidential, even if the device is stolen This built-in encryption sets RxDB apart from many other Ionic storage options that lack integrated security. ","version":"Next","tagName":"h3"},{"title":"3. Built-In Data Compression​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#3-built-in-data-compression","content":" Large or repetitive data can significantly slow down devices with minimal memory. RxDB's key-compression feature decreases document size stored on the device, improving overall performance by: Reducing disk usageAccelerating queriesMinimizing network overhead when syncing ","version":"Next","tagName":"h3"},{"title":"4. Real-Time Sync & Conflict Handling​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#4-real-time-sync--conflict-handling","content":" In addition to functioning fully offline, RxDB supports advanced replication options. Your Ionic app can instantly sync updates with any backend (CouchDB, Firestore, GraphQL, or custom REST), maintaining a real-time user experience. Plus, RxDB handles conflicts gracefully - meaning less worry about clashing user edits. ","version":"Next","tagName":"h3"},{"title":"5. Easy to Adopt and Extend​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#5-easy-to-adopt-and-extend","content":" RxDB runs with a NoSQL approach and integrates seamlessly into Ionic Angular or other frameworks you might use with Ionic. You can extend or replace storage backends, add encryption, or build advanced offline-first features with minimal overhead. ","version":"Next","tagName":"h3"},{"title":"Quick Start: Implementing RxDB with LocalSTorage Storage​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#quick-start-implementing-rxdb-with-localstorage-storage","content":" For a simple proof-of-concept or testing environment in Ionic, you can use localstorage as your underlying storage. Later, if you need better native performance, you can switch to the SQLite storage offered by the RxDB Premium plugins. Install RxDB npm install rxdb rxjs Initialize the Database import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; async function initDB() { const db = await createRxDatabase({ name: 'myionicdb', storage: getRxStorageLocalstorage(), multiInstance: false // or true if you plan multi-tab usage // Note: If you need encryption, set `password` here }); await db.addCollections({ notes: { schema: { title: 'notes schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string' }, content: { type: 'string' }, timestamp: { type: 'number' } }, required: ['id'] } } }); return db; } Ready to Upgrade Later? When you need the best performance on mobile devices, purchase the RxDB PremiumSQLite Storage and replace getRxStorageLocalstorage() with getRxStorageSQLite() - your app logic remains largely the same. You only have to change the configuration. ","version":"Next","tagName":"h2"},{"title":"Encryption Example​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#encryption-example","content":" To secure local data, add the crypto-js encryption plugin (free version) or the premium web-crypto plugin. Below is an example using the free crypto-js plugin: import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; import { createRxDatabase } from 'rxdb/plugins/core'; async function initEncryptedDB() { const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ storage: getRxStorageLocalstorage() }); const db = await createRxDatabase({ name: 'secureIonicDB', storage: encryptedStorage, password: 'myS3cretP4ssw0rd' }); await db.addCollections({ secrets: { schema: { title: 'secret schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string' }, text: { type: 'string' } }, required: ['id'], // all fields in this array will be stored encrypted: encrypted: ['text'] } } }); return db; } With encryption enabled: text is automatically encrypted at rest.Queries on encrypted fields are not directly possible (since data is encrypted), but once a document is loaded, RxDB decrypts it for normal usage. ","version":"Next","tagName":"h2"},{"title":"Compression Example​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#compression-example","content":" To minimize the storage footprint, RxDB offers a key-compression feature. You can enable it in your schema: await db.addCollections({ logs: { schema: { title: 'logs schema', version: 0, keyCompression: true, // enable compression type: 'object', primaryKey: 'id', properties: { id: { type: 'string' }, message: { type: 'string' }, createdAt: { type: 'string', format: 'date-time' } } } } }); With keyCompression: true, RxDB shortens field names internally, significantly reducing document size. This helps both stored data and network transport during replication. ","version":"Next","tagName":"h2"},{"title":"RxDB vs. Other Ionic Storage Options​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#rxdb-vs-other-ionic-storage-options","content":" Ionic Native Storage or Capacitor-based key-value stores may handle small amounts of data but lack advanced features like: Complex queriesFull NoSQL document modelOffline-firstsyncEncryption & key compression out of the boxRxDB stands out by delivering all these capabilities in a unified library. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#follow-up","content":" For Ionic storage that supports offline-first operations, built-in encryption, optional data compression, and live syncing with any backend, RxDB provides a powerful solution. Start quickly with localstorage for local development and testing - then scale up to the premium SQLite storage for optimal performance on production mobile devices. Ready to learn more? Explore the RxDB Quickstart GuideCheck out RxDB Encryption to protect user dataLearn about SQLite Storage in RxDB Premium for top performance on mobile.Join our community on the RxDB Chat RxDB - The ultimate toolkit for Ionic developers seeking offline-first, secure, and compressed local data, with real-time sync to any server. ","version":"Next","tagName":"h2"},{"title":"RxDB as a Database in a jQuery Application","type":0,"sectionRef":"#","url":"/articles/jquery-database.html","content":"","keywords":"","version":"Next"},{"title":"jQuery Web Applications​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#jquery-web-applications","content":" jQuery provides a simple API for DOM manipulation, event handling, and AJAX calls. It has been widely adopted due to its ease of use and strong community support. Many projects continue to rely on jQuery for handling client-side functionality, UI interactions, and animations. As these applications evolve, the need for a robust database solution that can manage data locally (and offline) becomes increasingly important. ","version":"Next","tagName":"h2"},{"title":"Importance of Databases in jQuery Applications​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#importance-of-databases-in-jquery-applications","content":" Modern, data-driven jQuery applications often need to: Store and retrieve data locally for quick and responsive user experiences.Synchronize data between clients or with a central server.Handle offline scenarios seamlessly.Handle large or complex data structures without repeatedly hitting the server. Relying solely on server endpoints or basic browser storage (like localStorage) can quickly become unwieldy for larger or more complex use cases. Enter RxDB, a dedicated solution that manages data on the client side while offering real-time synchronization and offline-first capabilities. ","version":"Next","tagName":"h2"},{"title":"Introducing RxDB as a Database Solution​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#introducing-rxdb-as-a-database-solution","content":" RxDB (short for Reactive Database) is built on top of IndexedDB and leverages RxJS to provide a modern, reactive approach to handling data in the browser. With RxDB, you can store documents locally, query them in real-time, and synchronize changes with a remote server whenever an internet connection is available. ","version":"Next","tagName":"h2"},{"title":"Key Features​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#key-features","content":" Reactive Data Handling: RxDB emits real-time updates whenever your data changes, allowing you to instantly reflect these changes in the DOM with jQuery.Offline-First Approach: Keep your application usable even when the user's network is unavailable. Data is automatically synchronized once connectivity is restored.Data Replication: Enable multi-device or multi-tab synchronization with minimal effort.Observable Queries: Reduce code complexity by subscribing to queries instead of constantly polling for changes.Multi-Tab Support: If a user opens your jQuery application in multiple tabs, RxDB keeps data in sync across all sessions. 3:45 This solved a problem I've had in Angular for years ","version":"Next","tagName":"h3"},{"title":"Getting Started with RxDB​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#getting-started-with-rxdb","content":" ","version":"Next","tagName":"h2"},{"title":"What is RxDB?​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#what-is-rxdb","content":" RxDB is a client-side NoSQL database that stores data in the browser (or node.js) and synchronizes changes with other instances or servers. Its design embraces reactive programming principles, making it well-suited for real-time applications, offline scenarios, and multi-tab use cases. ","version":"Next","tagName":"h3"},{"title":"Reactive Data Handling​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#reactive-data-handling","content":" RxDB's use of observables enables an event-driven architecture where data mutations automatically trigger UI updates. In a jQuery application, you can subscribe to these changes and update DOM elements as soon as data changes occur - no need for manual refresh or complicated change detection logic. ","version":"Next","tagName":"h3"},{"title":"Offline-First Approach​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#offline-first-approach","content":" One of RxDB's distinguishing traits is its emphasis on offline-first design. This means your jQuery application continues to function, display, and update data even when there's no network connection. When connectivity is restored, RxDB synchronizes updates with the server or other peers, ensuring consistency across all instances. ","version":"Next","tagName":"h3"},{"title":"Data Replication​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#data-replication","content":" RxDB supports real-time data replication with different backends. By enabling replication, you ensure that multiple clients - be they multiple browser tabs or separate devices - stay in sync. RxDB's conflict resolution strategies help keep the data consistent even when multiple users make changes simultaneously. ","version":"Next","tagName":"h3"},{"title":"Observable Queries​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#observable-queries","content":" Instead of static queries, RxDB provides observable queries. Whenever data relevant to a query changes, RxDB re-emits the new result set. You can subscribe to these updates within your jQuery code and instantly reflect them in the UI. ","version":"Next","tagName":"h3"},{"title":"Multi-Tab Support​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#multi-tab-support","content":" Running your jQuery app in multiple tabs? RxDB automatically synchronizes changes between those tabs. Users can freely switch windows without missing real-time updates. ","version":"Next","tagName":"h3"},{"title":"RxDB vs. Other jQuery Database Options​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#rxdb-vs-other-jquery-database-options","content":" Historically, jQuery developers might use localStorage or raw IndexedDB for storing data. However, these solutions can require significant boilerplate, lack reactivity, and offer no built-in sync or conflict resolution. RxDB fills these gaps with an out-of-the-box solution, abstracting away low-level database complexities and providing an event-driven, offline-capable approach. ","version":"Next","tagName":"h3"},{"title":"Using RxDB in a jQuery Application​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#using-rxdb-in-a-jquery-application","content":" ","version":"Next","tagName":"h2"},{"title":"Installing RxDB​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#installing-rxdb","content":" Install RxDB (and rxjs) via npm or yarn: npm install rxdb rxjs If your project isn't set up with a build process, you can still use bundlers like Webpack or Rollup, or serve RxDB as a UMD bundle. Once included, you'll have access to RxDB globally or via import statements. ","version":"Next","tagName":"h3"},{"title":"Creating and Configuring a Database​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#creating-and-configuring-a-database","content":" Below is a minimal example of how to create an RxDB instance and collection. You can call this when your page initializes, then store the db object for later use: import { createRxDatabase } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; async function initDatabase() { const db = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage(), password: 'myPassword', // optional encryption password multiInstance: true, // multi-tab support eventReduce: true // optimizes event handling }); await db.addCollections({ hero: { schema: { title: 'hero schema', version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string' }, name: { type: 'string' }, points: { type: 'number' } } } } }); return db; } ","version":"Next","tagName":"h2"},{"title":"Updating the DOM with jQuery​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#updating-the-dom-with-jquery","content":" Once you have your RxDB instance, you can query data reactively and use jQuery to manipulate the DOM: // Example: Displaying heroes using jQuery $(document).ready(async function () { const db = await initDatabase(); // Subscribing to all hero documents db.hero .find() .$ // the observable .subscribe((heroes) => { // Clear the list $('#heroList').empty(); // Append each hero to the DOM heroes.forEach((hero) => { $('#heroList').append(` <li> <strong>${hero.name}</strong> - Points: ${hero.points} </li> `); }); }); // Example of adding a new hero $('#addHeroBtn').on('click', async () => { const heroName = $('#heroName').val(); const heroPoints = parseInt($('#heroPoints').val(), 10); await db.hero.insert({ id: Date.now().toString(), name: heroName, points: heroPoints }); }); }); With this approach, any time data in the hero collection changes - like when a new hero is added - your jQuery code re-renders the list of heroes automatically. ","version":"Next","tagName":"h2"},{"title":"Different RxStorage layers for RxDB​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#different-rxstorage-layers-for-rxdb","content":" RxDB supports multiple storage backends (RxStorage layers). Some popular ones: LocalStorage.js RxStorage: Uses the browsers localstorage. Fast and easy to set up.IndexedDB RxStorage: Direct IndexedDB usage, suitable for modern browsers.OPFS RxStorage: Uses the File System Access API for better performance in supported browsers.Memory RxStorage: Stores data in memory, handy for tests or ephemeral data.SQLite RxStorage: Uses SQLite (potentially via WebAssembly). In typical browser-based scenarios, localstorage or IndexedDB storage is usually more straightforward. ","version":"Next","tagName":"h2"},{"title":"Synchronizing Data with RxDB between Clients and Servers​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#synchronizing-data-with-rxdb-between-clients-and-servers","content":" ","version":"Next","tagName":"h2"},{"title":"Offline-First Approach​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#offline-first-approach-1","content":" RxDB's offline-first approach allows your jQuery application to store and query data locally. Users can continue interacting, even offline. When connectivity returns, RxDB syncs to the server. ","version":"Next","tagName":"h3"},{"title":"Conflict Resolution​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#conflict-resolution","content":" Should multiple clients update the same document, RxDB offers conflict handling strategies. You decide how to resolve conflicts - like keeping the latest edit or merging changes - ensuring data integrity across distributed systems. ","version":"Next","tagName":"h3"},{"title":"Bidirectional Synchronization​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#bidirectional-synchronization","content":" With RxDB, data changes flow both ways: from client to server and from server to client. This real-time synchronization ensures that all users or tabs see consistent, up-to-date data. ","version":"Next","tagName":"h3"},{"title":"Advanced RxDB Features and Techniques​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#advanced-rxdb-features-and-techniques","content":" ","version":"Next","tagName":"h2"},{"title":"Indexing and Performance Optimization​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#indexing-and-performance-optimization","content":" Create indexes on frequently queried fields to speed up performance. For large data sets, indexing can drastically improve query times, keeping your jQuery UI snappy. ","version":"Next","tagName":"h3"},{"title":"Encryption of Local Data​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#encryption-of-local-data","content":" RxDB supports encryption to secure data stored in the browser. This is crucial if your application handles sensitive user information. ","version":"Next","tagName":"h3"},{"title":"Change Streams and Event Handling​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#change-streams-and-event-handling","content":" Use change streams to listen for data modifications at the database or collection level. This can trigger real-timeUI updates, notifications, or custom logic whenever the data changes. ","version":"Next","tagName":"h3"},{"title":"JSON Key Compression​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#json-key-compression","content":" If your data model has large or repetitive field names, JSON key compression can minimize stored document size and potentially boost performance. ","version":"Next","tagName":"h3"},{"title":"Best Practices for Using RxDB in jQuery Applications​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#best-practices-for-using-rxdb-in-jquery-applications","content":" Centralize Your Database: Initialize and configure RxDB in one place. Expose the instance where needed or store it globally to avoid re-creating it on every script.Leverage Observables: Instead of polling or manually refreshing data, rely on RxDB's reactivity. Subscribe to queries and let RxDB inform you when data changes.Handle Subscriptions: If you create subscriptions in a single-page context, ensure you don't re-subscribe endlessly or create memory leaks. Clean them up if you're navigating away or removing DOM elements.Offline Testing: Thoroughly test how your jQuery app behaves without a network connection. Simulate offline states in your browser's dev tools or with flight mode to ensure the user experience remains smooth.Performance Profiling: For large data sets or frequent data updates, add indexes and carefully measure query performance. Optimize only where needed. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#follow-up","content":" To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects.RxDB Examples: Browse official examples to see RxDB in action and learn best practices you can apply to your own project - even if jQuery isn't explicitly featured, the patterns are similar. ","version":"Next","tagName":"h2"},{"title":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","type":0,"sectionRef":"#","url":"/articles/json-based-database.html","content":"","keywords":"","version":"Next"},{"title":"Why JSON-Based Databases Are Typically NoSQL​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#why-json-based-databases-are-typically-nosql","content":" ","version":"Next","tagName":"h2"},{"title":"Document-Oriented by Nature​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#document-oriented-by-nature","content":" When your data is stored as JSON, each record or document can hold nested arrays and sub-objects with no forced table schema. NoSQL solutions such as MongoDB, CouchDB, Firebase, and RxDB store and retrieve these documents in their “raw” JSON form. This model integrates smoothly with how front-end applications already handle data, minimizing transformations and improving developer productivity. ","version":"Next","tagName":"h3"},{"title":"Flexible, Schema-Agnostic​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#flexible-schema-agnostic","content":" Traditional SQL tables enforce rigid column definitions and demand explicit schema migrations when you add or rename a field. By contrast, NoSQL solutions accept more dynamic data structures, allowing changes on the fly. This means a front-end developer can add a new field to a JSON object—perhaps for a new feature—without the friction of redefining or migrating a database schema. While this is possible, it is often not recommended. ","version":"Next","tagName":"h3"},{"title":"Aligned With Evolving User Interfaces​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#aligned-with-evolving-user-interfaces","content":" As modern UIs frequently manipulate deeply nested or changing data, developers find it easier to store whole objects directly, saving time that might otherwise be spent performing complex joins or normalizing data. For instance, frameworks like React, Vue, or Angular are inherently comfortable with nested JSON structures, which map more directly to NoSQL’s “document” approach than to relational tables. ","version":"Next","tagName":"h3"},{"title":"Is NoSQL “Better” Than SQL?​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#is-nosql-better-than-sql","content":" It depends on your application. SQL remains exceptional for complex aggregations, enforced relationships, and sophisticated transaction handling. But NoSQL is often more intuitive and easier to maintain for “document-first” applications that: Thrive on flexible or rapidly evolving data models.Rely on hierarchical or nested JSON objects.Avoid multi-table joins.Require easy horizontal scaling for large sets of documents. Relational databases are still a top choice for many enterprise back-ends, especially when advanced analytics or strongly enforced referential integrity is needed. But if your application is predominantly storing and manipulating JSON documents (e.g., user profiles, real-time chat logs, embedded items), a JSON-based or document-oriented approach can greatly reduce friction during development. ","version":"Next","tagName":"h2"},{"title":"When to Prefer SQL Instead of JSON/NoSQL​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#when-to-prefer-sql-instead-of-jsonnosql","content":" NoSQL solutions—particularly JSON-based document stores—provide a natural fit for flexible, nested data in UI-heavy applications. However, certain scenarios may benefit more from a SQL solution: Complex Relationships: If your data demands intricate joins across multiple entities (e.g., many-to-many relationships that can’t easily be embedded in a single document), a well-structured relational schema can simplify queries.Strong Integrity and Constraints: SQL excels at enforcing constraints such as foreign keys, unique constraints, and advanced triggers. If your system needs strict data validation and complex business logic within the database, SQL might prove more robust.High-End Analytical Queries: Relational databases can handle sophisticated aggregations, groupings, and joins more efficiently. If your app frequently runs advanced SQL queries, a NoSQL approach may complicate or slow down analytics.Legacy Integration: Many enterprise systems are built around existing relational schemas. A purely NoSQL approach might mean rewriting or bridging systems that are heavily reliant on SQL constraints and transformations.Transaction Handling: While many NoSQL solutions have improved transaction support, it can still lag behind well-established SQL transaction models. If ACID properties and multi-operation atomicity are paramount, you might prefer a tried-and-true relational engine. In short, if you prioritize advanced relational queries, robust constraints, or complex business rules at the database level, SQL remains a powerful, and possibly superior, choice. For user-centric, fast-evolving JSON data, though, NoSQL or JSON-based solutions often reduce the friction of frequent schema changes. ","version":"Next","tagName":"h2"},{"title":"Storing JSON in Traditional SQL Databases​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#storing-json-in-traditional-sql-databases","content":" ","version":"Next","tagName":"h2"},{"title":"JSON Columns in PostgreSQL or MySQL​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#json-columns-in-postgresql-or-mysql","content":" To accommodate the demand for flexible data, several SQL engines (notably PostgreSQL and MySQL) introduced support for JSON columns. PostgreSQL offers the JSON and JSONB types, enabling developers to store raw JSON in a column. You can also index specific paths within the JSON to speed lookups on nested fields: CREATE TABLE products ( id SERIAL PRIMARY KEY, name TEXT, details JSONB ); -- Insert a record with JSON data INSERT INTO products (name, details) VALUES ('Laptop', '{"brand": "BrandX", "features": ["Touchscreen", "SSD"]}'); Although this approach merges the best of both worlds (SQL queries + flexible JSON fields), it can also create a “split personality” in your schema. You might store stable data in normal columns, while unpredictable or nested details live inside a JSONB field. Some projects flourish with this hybrid design, others find it a bit unwieldy. ","version":"Next","tagName":"h3"},{"title":"Storing JSON in SQLite​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#storing-json-in-sqlite","content":" SQLite also allows storing JSON data, typically as text columns, but with some additional features since SQLite 3.9 (2015) including the JSON1 extension. This extension can parse JSON text, perform queries on JSON fields, and do partial updates. However, storing JSON in SQLite does require you to ensure you’ve compiled SQLite with JSON1 support or to rely on a library that bundles it. While possible, you still won't get quite the same schema-agnostic ease as a full document store, but it’s a pragmatic solution for smaller or embedded needs on the server side—or occasionally in the browser if you run SQLite via WebAssembly. RxDB uses this in its SQLite storage. ","version":"Next","tagName":"h2"},{"title":"JSON vs. Database - Why a Plain JSON Text File is a Problem​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#json-vs-database---why-a-plain-json-text-file-is-a-problem","content":" Some developers consider storing everything in a single JSON file, typically read and written directly from disk or local storage. This approach, while seemingly simple, usually does not scale. Key issues include: No Concurrency: If multiple parts of the application try to write to the same JSON file, you risk overwriting changes.No Indexes: Finding or filtering items in large JSON text requires scanning everything. This is slow and quickly becomes unmanageable.No Partial Updates: You often reload the entire file, modify it in memory, then write it back, which is highly inefficient for large data sets.Corruption Risk: A single corrupted write or partial save might break the entire JSON file, losing all data.High Memory Usage: The entire file may need to be parsed into memory, even if you only need a fraction of the data. Databases—relational or NoSQL—solve these issues by handling concurrency, enabling partial reads/writes, establishing indexes, and ensuring transactional integrity so you don’t lose everything if the process is interrupted mid-write. ","version":"Next","tagName":"h2"},{"title":"RxDB: A JSON-Focused Database for JavaScript Apps​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#rxdb-a-json-focused-database-for-javascript-apps","content":" Many NoSQL databases operate on the server, whereas RxDB is built for client-side usage—browsers, mobile apps, or Node.js. It specializes in JSON documents and embraces an offline-first philosophy. ","version":"Next","tagName":"h2"},{"title":"Key Characteristics​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#key-characteristics","content":" Local JSON Storage RxDB stores each record as a JSON document, closely matching how front-end frameworks handle state. This eliminates complex transformations or manual JSON parsing before writing to a table. Reactive Queries Instead of complex SQL, RxDB uses JSON-based query definitions. You can subscribe to query results, letting your UI automatically refresh when data changes locally or from remote sync updates: Offline-First Sync Built-in replication plugins push/pull changes to or from a remote server. If your app is offline, updates get stored locally, then sync up seamlessly once a connection is available. Optional JSON-Schema Though it’s a document database, RxDB encourages you to define a JSON-based schema for clarity, indexing, and type validation. This helps maintain data consistency while still allowing a measure of flexibility for new fields. ","version":"Next","tagName":"h3"},{"title":"Advanced JSON Features in RxDB​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#advanced-json-features-in-rxdb","content":" JSON-Schema: By specifying a JSON-Schema, you can define which fields exist, whether they are required, and their data types. This is invaluable for catching malformed documents early and imposing mild structure in a NoSQL setting. JSON Key-Compression: Large, verbose field names can bloat storage usage. RxDB’s optional key-compression plugin automatically shortens field names in your JSON documents internally, reducing disk space and bandwidth: // Example: how key-compression can transform your documents const uncompressed = { "firstName": "Corrine", "lastName": "Ziemann", "shoppingCartItems": [ { "productNumber": 29857, "amount": 1 }, { "productNumber": 53409, "amount": 6 } ] }; const compressed = { "|e": "Corrine", "|g": "Ziemann", "|i": [ { "|h": 29857, "|b": 1 }, { "|h": 53409, "|b": 6 } ] }; The user sees no difference in their code—RxDB automatically decompresses data on read—but the overhead is drastically reduced behind the scenes. ","version":"Next","tagName":"h3"},{"title":"Follow Up​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#follow-up","content":" JSON-based databases naturally align with NoSQL because they accommodate evolving, nested data without rigid schemas. This makes them appealing for many UI-centric or offline-first applications where flexible documents and agile development cycles matter more than heavy relational queries or constraints. SQL can still store JSON—whether in PostgreSQL’s JSONB columns, MySQL’s JSON fields, or SQLite’s JSON1 extension. For some teams, a hybrid approach pairing SQL for relational data with JSON columns for more flexible fields works well. However, storing everything in a single monolithic JSON text file is rarely advisable for anything beyond trivial tasks—databases excel at concurrency, indexing, and partial writes. Tools like RxDB provide an even simpler, local-first take on JSON documents—particularly for JavaScript projects. With offline replication, reactive queries, optional JSON-Schema, and advanced optimizations such as key-compression, RxDB streamlines building dynamic, user-facing features while preserving the core benefits of a robust document database. To explore more about RxDB and its capabilities for browser database development, check out the following resources: RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects.RxDB Examples: Browse official examples to see RxDB in action and learn best practices you can apply to your own project - even if jQuery isn't explicitly featured, the patterns are similar. ","version":"Next","tagName":"h2"},{"title":"RxDB - JSON Database for JavaScript","type":0,"sectionRef":"#","url":"/articles/json-database.html","content":"","keywords":"","version":"Next"},{"title":"Why Choose a JSON Database?​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#why-choose-a-json-database","content":" JavaScript Friendliness: JavaScript, a prevalent language for web development, naturally uses JSON for data representation. Using a JSON database aligns seamlessly with JavaScript's native data format. Compatibility: JSON is widely supported across different programming languages and platforms. Storing data in JSON format ensures compatibility with a broad range of tools and systems. All modern programming ecosystems have packages to parse, validate and process JSON data. Flexibility: JSON documents can accommodate complex and nested data structures, allowing developers to store data in a more intuitive and hierarchical manner compared to SQL table rows. Nested data can be just stored in-document instead of having related tables. Human-Readable: JSON is easy to read and understand, simplifying debugging and data inspection tasks. ","version":"Next","tagName":"h2"},{"title":"Storage and Access Options for JSON Documents​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#storage-and-access-options-for-json-documents","content":" When incorporating JSON documents into your application, you have several storage and access options to consider: Local In-App Database with In-Memory Storage: Ideal for lightweight applications or temporary data storage, this option keeps data in memory, ensuring fast read and write operations. However, data is not persistet beyond the current application session, making it suitable for temporary data storage. With RxDB, the memory RxStorage can be utilized to create an in-memory database. Local In-App Database with Persistent Storage: Suitable for applications requiring data retention across sessions. Data is stored on the user's device or inside of the Node.js application, offering persistence between application sessions. It balances speed and data retention, making it versatile for various applications. With RxDB, a whole range of persistent storages is available. As example, for browser there is the IndexedDB storage. For server side applications, the Node.js Filesystem storage can be used. There are many more storages for React-Native, Flutter, Capacitors.js and others. Server Database Connected to the Application: For applications requiring data synchronization and accessibility from multiple processes, a server-based database is the preferred choice. Data is stored on a remote server, facilitating data sharing, synchronization, and accessibility across multiple processes. It's suitable for scenarios requiring centralized data management and enhanced security and backup capabilities on the server. RxDB supports the FoundationDB and MongoDB as a remote database server. ","version":"Next","tagName":"h2"},{"title":"Compression Storage for JSON Documents​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#compression-storage-for-json-documents","content":" Compression storage for JSON documents is made effortless with RxDB's key-compression plugin. This feature enables the efficient storage of compressed document data, reducing storage requirements while maintaining data integrity. Queries on compressed documents remain seamless, ensuring that your application benefits from both space-saving advantages and optimal query performance, making RxDB a compelling choice for managing JSON data efficiently. The compression happens inside of the RxDatabase and does not affect the API usage. The only limitation is that encrypted fields themself cannot be used inside a query. ","version":"Next","tagName":"h2"},{"title":"Schema Validation and Data Migration on Schema Changes​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#schema-validation-and-data-migration-on-schema-changes","content":" Storing JSON documents inside of a database in an application, can cause a problem when the format of the data changes. Instead of having a single server where the data must be migrated, many client devices are out there that have to run a migration. When your application's schema evolves, RxDB provides migration strategies to facilitate the transition, ensuring data consistency throughout schema updates. JSONSchema Validation Plugins: RxDB supports multiple JSONSchema validation plugins, guaranteeing that only valid data is stored in the database. RxDB uses the JsonSchema standardization that you might know from other technologies like OpenAPI (aka Swagger). // RxDB Schema example const mySchema = { version: 0, primaryKey: 'id', // <- define the primary key for your documents type: 'object', properties: { id: { type: 'string', maxLength: 100 // <- the primary key must have set maxLength }, name: { type: 'string', maxLength: 100 }, done: { type: 'boolean' }, timestamp: { type: 'string', format: 'date-time' } }, required: ['id', 'name', 'done', 'timestamp'] } ","version":"Next","tagName":"h2"},{"title":"Store JSON with RxDB in Browser Applications​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#store-json-with-rxdb-in-browser-applications","content":" RxDB offers versatile storage solutions for browser-based applications: Multiple Storage Plugins: RxDB supports various storage backends, including IndexedDB, localstorage and In-Memory, catering to a range of browser environments. Observable Queries: With RxDB, you can create observable queries that work seamlessly across multiple browser tabs, providing real-time updates and synchronization. ","version":"Next","tagName":"h2"},{"title":"RxDB JSON Database Performance​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#rxdb-json-database-performance","content":" Certainly! Let's delve deeper into the performance aspects of RxDB when it comes to working with JSON data. Efficient Querying: RxDB is engineered for rapid and efficient querying of JSON data. It employs a well-optimized indexing system that allows for lightning-fast retrieval of specific data points within your JSON documents. Whether you're fetching individual values or complex nested structures, RxDB's query performance is designed to keep your application responsive, even when dealing with large datasets. Scalability: As your application grows and your JSON dataset expands, RxDB scales gracefully. Its performance remains consistent, enabling you to handle increasingly larger volumes of data without compromising on speed or responsiveness. This scalability is essential for applications that need to accommodate growing user bases and evolving data needs. Reduced Latency: RxDB's streamlined data access mechanisms significantly reduce latency when working with JSON data. Whether you're reading from the database, making updates, or synchronizing data between clients and servers, RxDB's optimized operations help minimize the delays often associated with data access. Observed queries are optimized with the EventReduce algorithm to provide nearly-instand UI updates on data changes. RxStorage Layer: Because RxDB allows you to swap out the storage layer. A storage with the most optimal performance can be chosen for each runtime while not touching other database code. Depending on the access patterns, you can pick exactly the storage that is best: ","version":"Next","tagName":"h2"},{"title":"RxDB in Node.js​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#rxdb-in-nodejs","content":" Node.js developers can also benefit from RxDB's capabilities. By integrating RxDB into your Node.js applications, you can harness the power of a NoSQL JSON db to efficiently manage your data on the server-side. RxDB's flexibility, performance, and essential features are equally valuable in server-side development. Read more about RxDB+Node.js. ","version":"Next","tagName":"h2"},{"title":"RxDB to store JSON documents in React Native​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#rxdb-to-store-json-documents-in-react-native","content":" For mobile app developers working with React Native, RxDB offers a convenient solution for handling JSON data. Whether you're building Android or iOS applications, RxDB's compatibility with JavaScript and its ability to work with JSON documents make it a natural choice for data management within your React Native apps. Read more about RxDB+React-Native. ","version":"Next","tagName":"h2"},{"title":"Using SQLite as a JSON Database​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#using-sqlite-as-a-json-database","content":" In some cases, you might want to use SQLite as a backend storage solution for your JSON data. RxDB can be configured to work with SQLite, providing the benefits of both a relational database system and JSON document storage. This hybrid approach can be advantageous when dealing with complex data relationships while retaining the flexibility of JSON data representation. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#follow-up","content":" To further explore RxDB and get started with using it in your frontend applications, consider the following resources: RxDB Quickstart: A step-by-step guide to quickly set up RxDB in your project and start leveraging its features.RxDB GitHub Repository: The official repository for RxDB, where you can find the code, examples, and community support. By embracing RxDB as your JSON database solution, you can tap into the extensive capabilities of JSON data storage. This empowers your applications with offline accessibility, caching, enhanced performance, and effortless data synchronization. RxDB's focus on JavaScript and its robust feature set render it the perfect selection for frontend developers in pursuit of efficient and scalable data storage solutions. ","version":"Next","tagName":"h2"},{"title":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","type":0,"sectionRef":"#","url":"/articles/local-database.html","content":"","keywords":"","version":"Next"},{"title":"Use Cases of Local Databases​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#use-cases-of-local-databases","content":" Local databases are particularly beneficial for: Offline Functionality: Essential for apps that must remain usable without a consistent internet connection, such as note-taking apps or offline-first CRMs. Users can continue adding and editing data, then sync changes once they reconnect.Low Latency: By reducing round-trips to remote servers, local databases enable real-time responsiveness. This feature is critical for interactive applications such as gaming platforms, data dashboards, or analytics tools that need near-instant feedback.Data Synchronization: Many modern applications - like chat systems or collaborative editing tools - require continuous data exchange between multiple users or devices. Local databases can handle intermittent connectivity gracefully, queuing updates locally and syncing them when possible. In addition, local databases are increasingly integral to Progressive Web Apps (PWAs), offering a native app-like user experience that is fast and available, even when offline. ","version":"Next","tagName":"h3"},{"title":"Performance Optimization​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#performance-optimization","content":" The primary performance benefit of a local database is its proximity to the application: queries and updates happen directly on the user's device, eliminating the overhead of multiple network hops. Common optimizations include: Caching: Storing frequently accessed data in memory or on disk to minimize expensive operations.Batching Writes: Grouping database operations into a single write transaction to reduce overhead and lock contention.Efficient Indexing: Using appropriate indexes to speed up queries, especially important for applications that handle large data sets or frequent lookups. These techniques ensure that local databases run smoothly, even on lower-powered or mobile devices. ","version":"Next","tagName":"h3"},{"title":"Security and Encryption​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#security-and-encryption","content":" Storing data on user devices introduces unique security considerations, such as the risk of physical theft or unauthorized access. Consequently, many local databases support encryption options to safeguard sensitive information. Developers can implement additional security measures like device-level encryption, secure storage plugins, and user authentication to further protect data from prying eyes. ","version":"Next","tagName":"h3"},{"title":"Why RxDB is Optimized for JavaScript Applications​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#why-rxdb-is-optimized-for-javascript-applications","content":" RxDB (Reactive Database) is an offline-first, NoSQL database designed to meet the needs of modern JavaScript applications. Built with a focus on reactivity and real-time data handling, RxDB excels in scenarios where low-latency, offline availability, and scalability are essential. ","version":"Next","tagName":"h2"},{"title":"Real-Time Reactivity​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#real-time-reactivity","content":" At the core of RxDB is reactive programming, allowing you to subscribe to changes in your data collections and receive immediate UI updates when records change - no manual polling or refetching required. For instance, a chat application can display incoming messages as soon as they arrive, maintaining a smooth and responsive experience. ","version":"Next","tagName":"h3"},{"title":"Offline-First Support​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#offline-first-support","content":" RxDB's primary design goal is to work seamlessly in offline environments. Even if your device loses internet connectivity, RxDB enables you to continue reading and writing data. Once the connection is restored, all pending changes are automatically synchronized with your backend. This offline-first approach is ideal for productivity apps, field service tools, and other scenarios where reliability and user autonomy are paramount. ","version":"Next","tagName":"h3"},{"title":"Flexible Data Replication​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#flexible-data-replication","content":" A standout feature of RxDB is its bi-directional replication. It supports synchronization with a variety of backends, such as: CouchDB: Via the CouchDB replication, facilitating easy integration with any Couch-compatible server.GraphQL Endpoints: Through community plugins, developers can replicate JSON documents to and from GraphQL servers.Custom Backends: RxDB provides hooks to build custom replication strategies for proprietary or specialized server APIs. This flexibility ensures that RxDB fits into diverse architectures without locking you into a single vendor or technology stack. ","version":"Next","tagName":"h3"},{"title":"Schema Validation and Versioning​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#schema-validation-and-versioning","content":" Rather than relying on implicit data models, RxDB leverages JSON schema to define document structures. This approach promotes data consistency by enforcing constraints such as required fields and acceptable data formats. As your application grows and changes, RxDB's built-in schema versioning and migration tools help you evolve your database schema safely, minimizing risks of data corruption or loss. ","version":"Next","tagName":"h3"},{"title":"Rich Plugin Ecosystem​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#rich-plugin-ecosystem","content":" One of RxDB's greatest strengths is its pluggable architecture, allowing you to add functionality as needed: Encryption: Secure your data at rest using advanced encryption plugins.Full-Text Search: Integrate powerful text search capabilities for applications that require quick and flexible query options.Storage Adapters: Swap out the underlying storage layer (e.g., IndexedDB in the browser, SQLite in React Native, or a custom engine) without rewriting your application logic. You can fine-tune RxDB to your exact needs, avoiding the performance overhead of unnecessary features. ","version":"Next","tagName":"h3"},{"title":"Multi-Platform Compatibility​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#multi-platform-compatibility","content":" RxDB is a perfect fit for cross-platform development, as it supports numerous environments: Browsers (IndexedDB): For web and PWA projects.Node.js: Ideal for server-side rendering or background services.React Native: Leverage SQLite or other adapters for mobile app development.Electron: Create offline-capable desktop apps with a unified codebase. This versatility empowers teams to reuse application logic across multiple platforms while maintaining a consistent data model. ","version":"Next","tagName":"h3"},{"title":"Performance Optimization​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#performance-optimization-1","content":" With lazy loading of data and the ability to utilize efficient storage engines, RxDB delivers high-speed operations and quick response times. By minimizing disk I/O and leveraging indexes effectively, RxDB ensures that even large-scale applications remain performant. Its reactive nature also helps avoid unnecessary re-renders, improving the end-user experience. ","version":"Next","tagName":"h3"},{"title":"Proven Reliability​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#proven-reliability","content":" RxDB is battle-tested in production environments, handling use cases from small single-user applications to large-scale enterprise solutions. Its robust replication mechanism resolves conflicts, manages concurrent writes, and ensures data integrity. The active open-source community provides ongoing support, documentation updates, and feature improvements. ","version":"Next","tagName":"h3"},{"title":"Developer-Friendly Features​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#developer-friendly-features","content":" For developers, RxDB offers: Straightforward APIs: Built on top of familiar JavaScript paradigms like promises and observables.Excellent Documentation: Detailed guides, tutorials, and references for every major feature.Rich Community Support: Benefit from an active ecosystem of contributors creating plugins, answering questions, and maintaining core libraries. These qualities streamline development, making RxDB an appealing choice for teams of all sizes. ","version":"Next","tagName":"h3"},{"title":"Follow Up​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#follow-up","content":" Ready to get started? Here are some next steps: Try the Quickstart Tutorial and build a basic project to see RxDB in action.Compare RxDB with other local database solutions to determine the best fit for your unique requirements. Ultimately, RxDB is more than just a database - it's a robust, reactive toolkit that empowers you to build fast, resilient, and user-centric applications. Whether you're creating an offline-first note-taking app or a real-time collaborative platform, RxDB can handle your local storage needs with ease and flexibility. ","version":"Next","tagName":"h2"},{"title":"Local Vector Database with RxDB and transformers.js in JavaScript","type":0,"sectionRef":"#","url":"/articles/javascript-vector-database.html","content":"","keywords":"","version":"Next"},{"title":"What is a Vector Database?​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#what-is-a-vector-database","content":" A vector database is a specialized database optimized for storing and querying data in the form of high-dimensional vectors, often referred to as embeddings. These embeddings are numerical representations of data, such as text, images, or audio, created by machine learning models like MiniLM. Unlike traditional databases that work with exact matches on predefined fields, vector databases focus on semantic similarity, allowing you to query data based on meaning rather than exact values. A vector, or embedding, is essentially an array of numbers, like [0.56, 0.12, -0.34, -0.90]. For example, instead of asking "Which document has the word 'database'?", you can query "Which documents discuss similar topics to this one?" The vector database compares embeddings and returns results based on how similar the vectors are to each other. Vector databases handle multiple types of data beyond text, including images, videos, and audio files, all transformed into embeddings for efficient querying. Mostly you would not train a model by yourself and instead use one of the public available transformer models. Vector databases are highly effective in various types of applications: Similarity Search: Finds the closest matches to a query, even when the query doesn't contain the exact terms.Clustering: Groups similar items based on the proximity of their vector representations.Recommendations: Suggests items based on shared characteristics.Anomaly Detection: Identifies outliers that differ from the norm.Classification: Assigns categories to data based on its vector's nearest neighbors. In this tutorial, we will build a vector database designed as a Similarity Search for text. For other use cases, the setup can be adapted accordingly. This flexibility is why RxDB doesn't provide a dedicated vector-database plugin, but rather offers utility functions to help you build your own vector search system. ","version":"Next","tagName":"h2"},{"title":"Generating Embeddings Locally in a Browser​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#generating-embeddings-locally-in-a-browser","content":" For the first step to build a local-first vector database we need to compute embeddings directly on the user's device. This is where transformers.js from huggingface comes in, allowing us to run machine learning models in the browser with WebAssembly. Below is an implementation of a getEmbeddingFromText() function, which takes a piece of text and transforms it into an embedding using the Xenova/all-MiniLM-L6-v2 model: import { pipeline } from "@xenova/transformers"; const pipePromise = pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2'); async function getEmbeddingFromText(text) { const pipe = await pipePromise; const output = await pipe(text, { pooling: "mean", normalize: true, }); return Array.from(output.data); } This function creates an embedding by running the text through a pre-trained model and returning it in the form of an array of numbers, which can then be stored and further processed locally. note Vector embeddings from different machine learning models or versions are not compatible with each other. When you change your model, you have to recreate all embeddings for your data. ","version":"Next","tagName":"h2"},{"title":"Storing the Embeddings in RxDB​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#storing-the-embeddings-in-rxdb","content":" To store the embeddings, first we have to create our RxDB Database with the localstorage storage that stores data in the browsers localstorage. For more advanced projects, you can use any other RxStorage. import { createRxDatabase } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageLocalstorage() }); Then we add a items collection that stores our documents with the text field that stores the content. await db.addCollections({ items: { schema: { version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 20 }, text: { type: 'string' } }, required: ['id', 'text'] } } }); const itemsCollection = db.items; In our example repo, we use the Wiki Embeddings dataset from supabase which was transformed and used to fill up the items collection with test data. const imported = await itemsCollection.count().exec(); const response = await fetch('./files/items.json'); const items = await response.json(); const insertResult = await itemsCollection.bulkInsert( items ); Also we need a vector collection that stores our embeddings. RxDB, as a NoSQL database, allows for the storage of flexible data structures, such as embeddings, within documents. To achieve this, we need to define a schema that specifies how the embeddings will be stored alongside each document. The schema includes fields for an id and the embedding array itself. await db.addCollections({ vector: { schema: { version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 20 }, embedding: { type: 'array', items: { type: 'string' } } }, required: ['id', 'embedding'] } } }); const vectorCollection = db.vector; When storing documents in the database, we need to ensure that the embeddings for these documents are generated and stored automatically. This requires a handler that runs during every document write, calling the machine learning model to generate the embeddings and storing them in a separate vector collection. Since our app runs in a browser, it's essential to avoid duplicate work when multiple browser tabs are open and ensure efficient use of resources. Furthermore, we want the app to resume processing documents from where it left off if it's closed or interrupted. To achieve this, RxDB provides a pipeline plugin, which allows us to set up a workflow that processes items and stores their embeddings. In our example, a pipeline takes batches of 10 documents, generates embeddings, and stores them in a separate vector collection. const pipeline = await itemsCollection.addPipeline({ identifier: 'my-embeddings-pipeline', destination: vectorCollection, batchSize: 10, handler: async (docs) => { await Promise.all(docs.map(async(doc) => { const embedding = await getVectorFromText(doc.text); await vectorCollection.upsert({ id: doc.primary, embedding }); })); } }); However, processing data locally presents performance challenges. Running the handler with a batch size of 10 takes around 2-4 seconds per batch, meaning processing 10k documents would take up to an hour. To improve performance, we can do parallel processing using WebWorkers. A WebWorker runs on a different JavaScript process and we can start and run many of them in parallel. Our worker listens for messages and performance the embedding generation on each request. It then sends the result embedding back to the main thread. // worker.js import { getVectorFromText } from './vector.js'; onmessage = async (e) => { const embedding = await getVectorFromText(e.data.text); postMessage({ id: e.data.id, embedding }); }; On the main thread we spawn one worker per core and send the tasks to the worker instead of processing them on the main thread. // create one WebWorker per core const workers = new Array(navigator.hardwareConcurrency) .fill(0) .map(() => new Worker(new URL("worker.js", import.meta.url))); let lastWorkerId = 0; let lastId = 0; export async function getVectorFromTextWithWorker(text: string): Promise<number[]> { let worker = workers[lastWorkerId++]; if(!worker) { lastWorkerId = 0; worker = workers[lastWorkerId++]; } const id = (lastId++) + ''; return new Promise<number[]>(res => { const listener = (ev: any) => { if (ev.data.id === id) { res(ev.data.embedding); worker.removeEventListener('message', listener); } }; worker.addEventListener('message', listener); worker.postMessage({ id, text }); }); } const pipeline = await itemsCollection.addPipeline({ identifier: 'my-embeddings-pipeline', destination: vectorCollection, batchSize: navigator.hardwareConcurrency, // one per CPU core handler: async (docs) => { await Promise.all(docs.map(async (doc, i) => { const embedding = await getVectorFromTextWithWorker(doc.body); /* ... */ }); } }); This setup allows us to utilize the full hardware capacity of the client's machine. By setting the batch size to match the number of logical processors available (using the navigator.hardwareConcurrency API) and running one worker per processor, we can reduce the processing time for 10k embeddings to about 5 minutes on my developer laptop with 32 CPU cores. ","version":"Next","tagName":"h2"},{"title":"Comparing Vectors by calculating the distance​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#comparing-vectors-by-calculating-the-distance","content":" Now that we have stored our embeddings in the database, the next step is to compare these vectors to each other. Various methods are available to measure the similarity or difference between two vectors, such as Euclidean distance, Manhattan distance, Cosine similarity, and Jaccard similarity (and more). RxDB provides utility functions for each of these methods, making it easy to choose the most suitable method for your application. In this tutorial, we will use Euclidean distance to compare vectors. However, the ideal algorithm may vary depending on your data's distribution and the specific type of query you are performing. To find the optimal method for your app, it is up to you to try out all of these and compare the results. Each method gets two vectors as input and returns a single number. Here's how to calculate the Euclidean distance between two embeddings with the vector utilities from RxDB: import { euclideanDistance } from 'rxdb/plugins/vector'; const distance = euclideanDistance(embedding1, embedding2); console.log(distance); // 25.20443 With this we can sort multiple embeddings by how good they match our search query vector. ","version":"Next","tagName":"h2"},{"title":"Searching the Vector database with a full table scan​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#searching-the-vector-database-with-a-full-table-scan","content":" To find out if our embeddings have been stored correctly and that our vector comparison works as should, let's run a basic query to ensure everything functions as expected. In this query, we aim to find documents similar to a given user input text. The process involves calculating the embedding from the input text, fetching all documents, calculating the distance between their embeddings and the query embedding, and then sorting them based on their similarity. import { euclideanDistance } from 'rxdb/plugins/vector'; import { sortByObjectNumberProperty } from 'rxdb/plugins/core'; const userInput = 'new york people'; const queryVector = await getEmbeddingFromText(userInput); const candidates = await vectorCollection.find().exec(); const withDistance = candidates.map(doc => ({ doc, distance: euclideanDistance(queryVector, doc.embedding) })); const queryResult = withDistance.sort(sortByObjectNumberProperty('distance')).reverse(); console.dir(queryResult); note For distance-based comparisons, sorting should be in ascending order (smallest first), while for similarity-based algorithms, the sorting should be in descending order (largest first). If we inspect the results, we can see that the documents returned are ordered by relevance, with the most similar document at the top: note This demo page can be run online here. However our full-scan method presents a significant challenge: it does not scale well. As the number of stored documents increases, the time taken to fetch and compare embeddings grows proportionally. For example, retrieving embeddings from our test dataset of 10k documents takes around 700 milliseconds. If we scale up to 100k documents, this delay would rise to approximately 7 seconds, making the search process inefficient for larger datasets. ","version":"Next","tagName":"h2"},{"title":"Indexing the Embeddings for Better Performance​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#indexing-the-embeddings-for-better-performance","content":" To address the scalability issue, we need to store embeddings in a way that allows us to avoid fetching all of them from storage during a query. In traditional databases, you can sort documents by an index field, allowing efficient queries that retrieve only the necessary documents. An index organizes data in a structured, sortable manner, much like a phone book. However, with vector embeddings we are not dealing with simple, single values. Instead, we have large lists of numbers, which makes indexing more complex because we have more than one dimension. ","version":"Next","tagName":"h2"},{"title":"Vector Indexing Methods​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#vector-indexing-methods","content":" Various methods exist for indexing these vectors to improve query efficiency and performance: Locality Sensitive Hashing (LSH): LSH hashes data so that similar items are likely to fall into the same bucket, optimizing approximate nearest neighbor searches in high-dimensional spaces by reducing the number of comparisons.Hierarchical Small World: HSW is a graph structure designed for efficient navigation, allowing quick jumps across the graph while maintaining short paths between nodes, forming the basis for HNSW's optimization.Hierarchical Navigable Small Worlds (HNSW): HNSW builds a hierarchical graph for fast approximate nearest neighbor search. It uses multiple layers where higher layers represent fewer, more connected nodes, improving search efficiency in large datasets​.Distance to samples: While testing different indexing strategies, I found out that using the distance to a sample set of items is a good way to index embeddings. You pick like 5 random items of your data and get the embeddings for them out of the model. These are your 5 index vectors. For each embedding stored in the vector database, we calculate the distance to our 5 index vectors and store that number as an index value. This seems to work good because similar things have similar distances to other things. For example the words "shoe" and "socks" have a similar distance to "boat" and therefore should have roughly the same index value. When building local-first applications, performance is often a challenge, especially in JavaScript. With IndexedDB, certain operations, like many sequential get by id calls, are slow, while bulk operations, such as get by index range, are fast. Therefore, it's essential to use an indexing method that allows embeddings to be stored in a sortable way, like Locality Sensitive Hashing or Distance to Samples. In this article, we'll use Distance to Samples, because for me it provides the best default behavior for the sample dataset. ","version":"Next","tagName":"h3"},{"title":"Storing indexed embeddings in RxDB​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#storing-indexed-embeddings-in-rxdb","content":" The optimal way to store index values alongside embeddings in RxDB is to place them within the same RxCollection. To ensure that the index values are both sortable and precise, we convert them into strings with a fixed length of 10 characters. This standardization helps in managing values with many decimals and ensures proper sorting in the database. Here's is our schema example schema where each document contains an embedding and corresponding index fields: const indexSchema = { type: 'string', maxLength: 10 }; const schema = { "version": 0, "primaryKey": "id", "type": "object", "properties": { "id": { "type": "string", "maxLength": 100 }, "embedding": { "type": "array", "items": { "type": "number" } }, // index fields "idx0": indexSchema, "idx1": indexSchema, "idx2": indexSchema, "idx3": indexSchema, "idx4": indexSchema }, "required": [ "id", "embedding", "idx0", "idx1", "idx2", "idx3", "idx4" ], "indexes": [ "idx0", "idx1", "idx2", "idx3", "idx4" ] } To populate these index fields, we modify the RxPipeline handler accordingly to the Distance to samples method. We calculate the distance between the document's embedding and our set of 5 index vectors. The calculated distances are converted to string and stored in the appropriate index fields: import { euclideanDistance } from 'rxdb/plugins/vector'; const sampleVectors: number[][] = [/* the index vectors */]; const pipeline = await itemsCollection.addPipeline({ handler: async (docs) => { await Promise.all(docs.map(async(doc) => { const embedding = await getEmbedding(doc.text); const docData = { id: doc.primary, embedding }; // calculate the distance to all samples and store them in the index fields new Array(5).fill(0).map((_, idx) => { const indexValue = euclideanDistance(sampleVectors[idx], embedding); docData['idx' + idx] = indexNrToString(indexValue); }); await vectorCollection.upsert(docData); })); } }); ","version":"Next","tagName":"h3"},{"title":"Searching the Vector database with utilization of the indexes​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#searching-the-vector-database-with-utilization-of-the-indexes","content":" Once our embeddings are stored in an indexed format, we can perform searches much more efficiently than through a full table scan. While this indexing method boosts performance, it comes with a tradeoff: a slight loss in precision, meaning that the result set may not always be the optimal one. However, this is generally acceptable for similarity search use cases. There are multiple ways to leverage indexes for faster queries. Here are two effective methods: Query for Index Similarity in Both Directions: For each index vector, calculate the distance to the search embedding and fetch all relevant embeddings in both directions (sorted before and after) from that value. async function vectorSearchIndexSimilarity(searchEmbedding: number[]) { const docsPerIndexSide = 100; const candidates = new Set<RxDocument>(); await Promise.all( new Array(5).fill(0).map(async (_, i) => { const distanceToIndex = euclideanDistance(sampleVectors[i], searchEmbedding); const [docsBefore, docsAfter] = await Promise.all([ vectorCollection.find({ selector: { ['idx' + i]: { $lt: indexNrToString(distanceToIndex) } }, sort: [{ ['idx' + i]: 'desc' }], limit: docsPerIndexSide }).exec(), vectorCollection.find({ selector: { ['idx' + i]: { $gt: indexNrToString(distanceToIndex) } }, sort: [{ ['idx' + i]: 'asc' }], limit: docsPerIndexSide }).exec() ]); docsBefore.map(d => candidates.add(d)); docsAfter.map(d => candidates.add(d)); }) ); const docsWithDistance = Array.from(candidates).map(doc => { const distance = euclideanDistance((doc as any).embedding, searchEmbedding); return { distance, doc }; }); const sorted = docsWithDistance.sort(sortByObjectNumberProperty('distance')).reverse(); return { result: sorted.slice(0, 10), docReads }; } Query for an Index Range with a Defined Distance: Set an indexDistance and retrieve all embeddings within a specified range from the index vector to the search embedding. async function vectorSearchIndexRange(searchEmbedding: number[]) { await pipeline.awaitIdle(); const indexDistance = 0.003; const candidates = new Set<RxDocument>(); let docReads = 0; await Promise.all( new Array(5).fill(0).map(async (_, i) => { const distanceToIndex = euclideanDistance(sampleVectors[i], searchEmbedding); const range = distanceToIndex * indexDistance; const docs = await vectorCollection.find({ selector: { ['idx' + i]: { $gt: indexNrToString(distanceToIndex - range), $lt: indexNrToString(distanceToIndex + range) } }, sort: [{ ['idx' + i]: 'asc' }], }).exec(); docs.map(d => candidates.add(d)); docReads = docReads + docs.length; }) ); const docsWithDistance = Array.from(candidates).map(doc => { const distance = euclideanDistance((doc as any).embedding, searchEmbedding); return { distance, doc }; }); const sorted = docsWithDistance.sort(sortByObjectNumberProperty('distance')).reverse(); return { result: sorted.slice(0, 10), docReads }; }; Both methods allow you to limit the number of embeddings fetched from storage while still ensuring a reasonably precise search result. However, they differ in how many embeddings are read and how precise the results are, with trade-offs between performance and accuracy. The first method has a known embedding read amount of docsPerIndexSide * 2 * [amount of indexes]. The second method reads out an unknown amount of embeddings, depending on the sparsity of the dataset and the value of indexDistance. And that's it for the implementation. We now have a local first vector database that is able to store and query vector data. ","version":"Next","tagName":"h2"},{"title":"Performance benchmarks​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#performance-benchmarks","content":" In server-side databases, performance can be improved by scaling hardware or adding more servers. However, local-first apps face the unique challenge that the hardware is determined by the end user, making performance unpredictable. Some users may have high-end gaming PCs, while others might be using outdated smartphones in power-saving mode. Therefore, when building a local-first app that processes more than a few documents, performance becomes a critical factor and should be thoroughly tested upfront. Let's run performance benchmarks on my high-end gaming PC to give you a sense of how long different operations take and what's achievable. ","version":"Next","tagName":"h2"},{"title":"Performance of the Query Methods​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#performance-of-the-query-methods","content":" Query Method\tTime in milliseconds\tDocs read from storageFull Scan\t765\t10000 Index Similarity\t1647\t934 Index Range\t88\t2187 As shown, the index similarity query method takes significantly longer compared to others. This is due to the need for descending sort orders in some queries sort: [{ ['idx' + i]: 'desc' }]. While RxDB supports descending sorts, performance suffers because IndexedDB does not efficiently handle reverse indexed bulk operations. As a result, the index range method performs much better for this use case and should be used instead. With its query time of only 88 milliseconds it is fast enough for all most things and likely such fast that you do not even need to show a loading spinner. Also it is faster compared to fetching the query result from a server-side vector database over the internet. ","version":"Next","tagName":"h3"},{"title":"Performance of the Models​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#performance-of-the-models","content":" Let's also look at the time taken to calculate a single embedding across various models from the huggingface transformers list: Model Name\tTime per Embedding in (ms)\tVector Size\tModel Size (MB)Xenova/all-MiniLM-L6-v2\t173\t384\t23 Supabase/gte-small\t341\t384\t34 Xenova/paraphrase-multilingual-mpnet-base-v2\t1000\t768\t279 jinaai/jina-embeddings-v2-base-de\t1291\t768\t162 jinaai/jina-embeddings-v2-base-zh\t1437\t768\t162 jinaai/jina-embeddings-v2-base-code\t1769\t768\t162 mixedbread-ai/mxbai-embed-large-v1\t3359\t1024\t337 WhereIsAI/UAE-Large-V1\t3499\t1024\t337 Xenova/multilingual-e5-large\t4215\t1024\t562 From these benchmarks, it's evident that models with larger vector outputs take longer to process. Additionally, the model size significantly affects performance, with larger models requiring more time to compute embeddings. This trade-off between model complexity and performance must be considered when choosing the right model for your use case. ","version":"Next","tagName":"h3"},{"title":"Potential Performance Optimizations​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#potential-performance-optimizations","content":" There are multiple other techniques to improve the performance of your local vector database: Shorten embeddings: The storing and retrieval of embeddings can be improved by "shortening" the embedding. To do that, you just strip away numbers from your vector. For example [0.56, 0.12, -0.34, 0.78, -0.90] becomes [0.56, 0.12]. That's it, you now have a smaller embedding that is faster to read out of the storage and calculating distances is faster because it has to process less numbers. The downside is that you loose precision in your search results. Sometimes shortening the embeddings makes more sense as a pre-query step where you first compare the shortened vectors and later fetch the "real" vectors for the 10 most matching documents to improve their sort order. Optimize the variables in our Setup: In this examples we picked our variables in a non-optimal way. You can get huge performance improvements by setting different values: We picked 5 indexes for the embeddings. Using less indexes improves your query performance with the cost of less good results.For queries that search by fetching a specific embedding distance we used the indexDistance value of 0.003. Using a lower value means we read less document from the storage. This is faster but reduces the precision of the results which means we will get a less optimal result compared to a full table scan.For queries that search by fetching a given amount of documents per index side, we set the value docsPerIndexSide to 100. Increasing this value means you fetch more data from the storage but also get a better precision in the search results. Decreasing it can improve query performance with worse precision. Use faster models: There are many ways to improve performance of machine learning models. If your embedding calculation is too slow, try other models. Smaller mostly means faster. The model Xenova/all-MiniLM-L6-v2 which is used in this tutorial is about 1 year old. There exist better, more modern models to use. Huggingface makes these convenient to use. You only have to switch out the model name with any other model from that site. Narrow down the search space: By utilizing other "normal" filter operators to your query, you can narrow down the search space and optimize performance. For example in an email search you could additionally use a operator that limits the results to all emails that are not older than one year. Dimensionality Reduction with an autoencoder: An autoencoder encodes vector data with minimal loss which can improve the performance by having to store and compare less numbers in an embedding. Different RxDB Plugins: RxDB has different storages and plugins that can improve the performance like the IndexedDB RxStorage, the OPFS RxStorage, the sharding plugin and the Worker and SharedWorker storages. ","version":"Next","tagName":"h2"},{"title":"Migrating Data on Model/Index Changes​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#migrating-data-on-modelindex-changes","content":" When you change the index parameter or even update the whole model which was used to create the embeddings, you have to migrate the data that is already stored on your users devices. RxDB offers the Schema Migration Plugin for that. When the app is reloaded and the updated source code is started, RxDB detects changes in your schema version and runs the migration strategy accordingly. So to update the stored data, increase the schema version and define a handler: const schemaV1 = { "version": 1, // <- increase schema version by 1 "primaryKey": "id", "properties": { /* ... */ }, /* ... */ }; In the migration handler we recreate the new embeddings and index values. await myDatabase.addCollections({ vectors: { schema: schemaV1, migrationStrategies: { 1: function(docData){ const embedding = await getEmbedding(docData.body); new Array(5).fill(0).map((_, idx) => { docData['idx' + idx] = euclideanDistance(mySampleVectors[idx], embedding); }); return docData; }, } } }); ","version":"Next","tagName":"h2"},{"title":"Possible Future Improvements to Local-First Vector Databases​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#possible-future-improvements-to-local-first-vector-databases","content":" For now our vector database works and we are good to go. However there are some things to consider for the future: WebGPU is not fully supported yet. When this changes, creating embeddings in the browser have the potential to become faster. You can check if your current chrome supports WebGPU by opening chrome://gpu/. Notice that WebGPU has been reported to sometimes be even slower compared to WASM but likely it will be faster in the long term.Cross-Modal AI Models: While progress is being made, AI models that can understand and integrate multiple modalities are still in development. For example you could query for an image together with a text prompt to get a more detailed output.Multi-Step queries: In this article we only talked about having a single query as input and an ordered list of outputs. But there is big potential in chaining models or queries together where you take the results of one query and input them into a different model with different embeddings or outputs. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#follow-up","content":" Shared/Like my announcement tweetRead the source code that belongs to this article at githubLearn how to use RxDB with the RxDB QuickstartCheck out the RxDB github repo and leave a star ⭐ ","version":"Next","tagName":"h2"},{"title":"Why Local-First Software Is the Future and what are its Limitations","type":0,"sectionRef":"#","url":"/articles/local-first-future.html","content":"","keywords":"","version":"Next"},{"title":"What is the Local-First Paradigm​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#what-is-the-local-first-paradigm","content":" In local-first software, the primary copy of your data lives on the client rather than a remote server. Rather than sending each read or write over the network, you store and manipulate data in a local database on the user’s device. Sync then happens in the background, ensuring all devices eventually converge to a consistent state. This approach is increasingly popular because it leads to instant app responses (no network delay for most operations), genuine offline capability, and more direct data ownership for users. Local-first apps also sidestep outages and if the server or internet goes down, users can keep working with their local data. When connectivity returns, everything syncs. This makes the user experience more resilient and gives them control of their data, which is especially appealing when privacy concerns or limited connectivity are key factors. Local-First software: A set of principles for software that enables both collaboration and ownership for users. Local-first ideals include the ability to work offline and collaborate across multiple devices, while also improving the security, privacy, long-term preservation, and user control of data. –Ink&Switch, 2019 ","version":"Next","tagName":"h2"},{"title":"Why Local-First is Gaining Traction​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#why-local-first-is-gaining-traction","content":" The push for local-first is driven by a few key new technological capabilities that previously restricted client devices from running heavy local-first computing: Relaxed Browser Storage Limits: In the past, true local-first web apps were not very feasible due to storage limitations in browsers. Early web storage options like cookies or localStorage had tiny limits (~5-10MB) and were unsuitable for complex data. Even IndexedDB, the structured client storage introduced over a decade ago, had restrictive quotas on many browsers: For example, older Firefox versions would prompt the user if more than 50MB was being stored. Mobile browsers often capped IndexedDB to 5MB without user permission. Such limits made it impractical to cache large application datasets on the client. However, modern browsers have dramatically increased these limits. Today, IndexedDB can typically store hundreds of megabytes to multiple gigabytes of data, depending on device capacity. Chrome allows up to ~80% of free disk space per origin (tens of GB on a desktop), Firefox now supports on the order of gigabytes per site (10% of disk size), and even Safari (historically strict) permits around 1GB per origin on iOS. In short, the storage quotas of 5-50MB are a thing of the past and modern web apps can cache very large datasets locally without hitting a ceiling. This shift in storage capabilities has unlocked new possibilities for local-first web apps that simply weren't viable a few years ago. New Storage APIs (OPFS): The new Browser API Origin Private File System (OPFS), part of the File System Access API, enables near-native file I/O from within a browser. It allows web apps to manage file handles securely and perform fast, synchronous reads/writes in Web Workers. This is a huge deal for local-first computing because it makes it feasible to embed robust database engines directly in the browser, persisting data to real files on a virtual filesystem. With OPFS, you can avoid some of the performance overhead that comes with IndexedDB-based workarounds, providing a near-native speed experience for file-structured data. Bandwidth Has Grown, But Latency Is Capped: Internet infrastructure has rapidly expanded to provide higher throughput making it possible to transfer large amounts of data more quickly. However, latency (i.e., round-trip delay) is constrained by the speed of light and other physical limitations in fiber, satellite links, and routing. We can always build out bigger "pipes" to stream or send bulk data, but we can't significantly reduce the base round-trip time for each request. This is a physical limit, not a technological one. Local-first strategies mitigate this fundamental latency limit by avoiding excessive client-server calls in interactive workflows, once data is on the client, it's instantly available for reads and writes without waiting on a network round-trip. Imagine, transferring around 100,000 "average" JSON documents might only consume about the same bandwidth as two frames of a 4K YouTube video which can be transferred in milliseconds. This shows just how far raw data throughput has come. Yet each request still has a 100-200ms latency or more, which becomes noticeable in user interactions. Local-first mitigates this by minimizing round-trip calls during active use and using the available bandwidth to directly transfer most of the data on the first app start. WebAssembly: Another advancement is WebAssembly (WASM), which allows developers to compile low-level languages (C, C++, Rust) for execution in the browser at near-native speed. This means database engines, search algorithms, vector databases, and other performance-heavy tasks can run right on the client. However, a key limitation is that WASM cannot directly access persistent storage APIs in the browser. Instead, all data must be send from WASM to JavaScript (or the main thread) and then go through something like IndexedDB or OPFS. This extra indirection is slower compared to plain JavaScript->storage calls. Looking ahead, there might come up future APIs that allow WASM to interface with persistent storage directly, and if those land, local-first systems could see another major boost in performance. Improvements in Local-First Tooling: A major factor fueling the rise of local-first architectures is the dramatic leap in client-side tooling and performance. For instance, consider a local-first email client that stores one million messages. In 2014, searching through that many documents, especially with something like early PouchDB, could take minutes in a browser. Today, with advanced offline databases like RxDB, you can use the OPFS storage with sharding across multiple web workers (one per CPU) and use memory-mapped techniques. The result is a regex search of one million of these email documents in around 120 milliseconds - all in JavaScript, running inside a standard web browser, on a mobile phone. Better yet, this performance ceiling is likely to keep rising. Newer browser features and WebAssembly optimizations could enable even faster indexing and query operations, closing the gap with native desktop clients. I even experimented with GPU-accelarated queries (using WebGPU) which, while still in experimental stage, might deliver client-side performance that outperforms servers which do not have a graphics card. These transformations highlight why local-first has become truly practical: not only can you sync and work offline, but you can handle serious data loads with performance that would have been unthinkable just a few years ago. ","version":"Next","tagName":"h2"},{"title":"What you can expect from a Local First App​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#what-you-can-expect-from-a-local-first-app","content":" Jevons' Paradox says that making a resource cheaper or more efficient to use often leads to greater overall consumption. Originally about coal, it applies to the local-first paradigm in a way where we require apps to have more features, simply because it is technically possible, the app users and developers start to expect them: ","version":"Next","tagName":"h2"},{"title":"User Experience Benefits​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#user-experience-benefits","content":" Performance & UX: Running from local storage means low latency and instantaneous interactions. There's no round-trip delay for most operations. Local-first apps aim to provide near-zero latency responses by querying a local database instead of waiting for a server response​. This results in a snappy UX (often no need for loading spinners) because data reads/writes happen immediately on-device. Modern users expect real-time feedback, and local-first delivers that by default. User Control & Privacy: Storing data locally can limit how much sensitive information is sent off to remote servers. End users have greater control over their data, and the app can implement client-side encryption, thereby reducing the risk of mass data breaches. Its even possible to only replicated encrypted data with a server so that the backend does not know about the data at all and just acts as a backup/replication endpoint. Offline Resilience: Obviously, being able to work offline is a major benefit. Users can continue using the app with no internet (or flaky connectivity), and their changes sync up once online. This is increasingly important not just for remote areas, but for any app that needs to be available 24/7. Even though mobile networks have improved, connectivity can still drop; local-first ensures the app doesn't grind to a halt. The app "stores data locally at the client so that it can still access it when the internet goes away." Realtime Apps: Today's users expect data to stay in sync across browser tabs and devices without constant page reloads. In a typical cloud app, if you want real-time updates (say to show that a friend edited a document), you'd need to implement a websocket or polling system for the server to push changes to clients, which is complex. Local-first architectures naturally lend themselves to realtime-by-default updates because the application state lives in a local database that can be observed for changes. Any edits (local or incoming from the server) immediately trigger UI updates. Similarly, background sync mechanisms ensure that new server-side data flows into the local store and into the user interface right away, no need to hit F5 to fetch the latest changes like on a traditional webpage. ","version":"Next","tagName":"h3"},{"title":"Developer Experience Benefits​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#developer-experience-benefits","content":" Reduced Server Load: Because local-first architectures typically transfer large chunks of data once (e.g., during an initial sync) and then sync only small diffs (delta changes) afterward, the server does not have to handle repeated requests for the same dataset. This bulk-first, diff-later approach drastically decreases the total number of round-trip requests to the backend. In scenarios where hundreds of simultaneous users each require continuous data access, an offline-ready client that only periodically sends or receives changes can scale more efficiently, freeing your servers to handle more users or other tasks. Instead of being bombarded with frequent small queries and updates, the server focuses on periodic sync operations, which can be more easily optimized or batched. It Scales with Data, Not Load. In fact for most type of apps, most of the data itself rarely changes. Imagine a CRM system, how often does the data of a customer really change compared to how of a user open the customer-overview page which would load data from a server in traditional systems? Less Need for Custom API Endpoints: A local-first architecture often simplifies backend design. Instead of writing extensive REST routes for each client operation (create, read, update, delete, etc.), you can build a single replication endpoint or a small set of endpoints to handle data synchronization for each entity. The client manages local data, merges edits, and pushes/pulls changes with the server automatically. This not only reduces boilerplate code on the backend but also frees developers to focus on business logic and domain-specific concerns rather than spending time creating and maintaining dozens of narrowly scoped endpoints. As a result, the overall system can be easier to scale and maintain, delivering a smoother developer experience. Simplified State Management in Frontend: Because the local database holds the authoritative state, you might rely less on complex state management libraries (Redux, MobX, etc.). The DB becomes a single source of truth for your UI. In an offline-first app, your global state is already there in a single place stored inside of the local database, so you don't need as many in-memory state layers to synchronize​. The UI can directly bind to the database (using queries or reactive subscriptions). All sources of changes (user input, remote updates, other tabs) funnel through the database. This can significantly reduce the "glue code" to keep UI state in sync with server state because the local DB does that for you. With Local-First tools, "you might not need Redux" because the reactive DB fulfills that role​ of state management already. Observable Queries: One of the big advantages of storing data locally is the ability to subscribe to data changes in real time, often called observable queries. When the data changes - either from the user's actions or from a remote sync - the local database automatically updates the subscribed query results, and the UI can redraw without a manual refresh. This reactive pattern can make apps feel much more live and responsive. In the beginnings this was mostly done by watching a changes feed (like in PouchDB) and re-running queries whenever data changed. However, this early approach was slow and didn't scale well, because the entire query had to be recalculated each time. Later, RxDB introduced the EventReduce Algorithm, which merges incoming document changes into an existing query result by using a big binary decision tree. With this, updated query results can be "calculated" on the CPU instead of re-running them over the database. This makes query updates almost instantaneous and scales better as your data grows. Nowadays, many local databases have added similar features: for example, dexie.js introduced liveQuery, letting developers build real-time UIs without repeatedly scanning the entire dataset. Better Multi-Tab and Multi-Device Consistency: Because the source of truth is on the client, if the user has the app open in multiple tabs or even multiple devices, each has a full copy of the data. In browsers, many offline databases use a storage like IndexedDB that is shared across tabs of the same origin. This means all tabs see the same up-to-date local state. For example, if a user logs in or adds data in one tab, the other tab can automatically reflect that change via the shared local DB and events​. This solves a common issue in web apps where one tab doesn't know that something changed in another tab. With local-first, multi-tab just works by default because there's "exactly one state of the data across all tabs". Similarly, on multiple devices, once sync runs, each device eventually converges to the same state. If your users have to press F5 all the time, your app is broken! Potential for P2P and Decentralization: While most current local-first apps still use a central backend for syncing, the paradigm opens the door to peer-to-peer data syncing. Because each device has the full data, devices could sync directly via LAN or other P2P channels for collaboration, reducing reliance on central servers. There are experimental frameworks that allow truly decentralized sync. This is a more advanced benefit, but it aligns with the ethos of giving users more control and reducing dependence on any one cloud provider. These advantages show why developers are excited about local-first. You get happier users thanks to a fast, offline-capable app, and you can differentiate your product by working in scenarios where others fail (e.g. poor connectivity). Companies like Google, Amazon, etc., invest heavily in reducing latency and adding offline modes for a reason: it improves retention and usability. Local-first design takes that to the extreme by default. ","version":"Next","tagName":"h3"},{"title":"Challenges and Limitations of Local-First​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#challenges-and-limitations-of-local-first","content":" However, this approach is not without significant challenges. It's important to understand the drawbacks and trade-offs before deciding to go all-in on local-first. Let's examine the flip side. You fully understood a technology when you know when not to use it –Daniel, 2024 Critics of local-first approaches often point out these challenges. Here's a comprehensive list of cons, criticisms, and obstacles associated with local-first development and proposed solutions on how to solve these obstacles: Data Synchronization: Data synchronization is arguably the hardest part of local-first development, because when every user's device can be offline for extended periods, data inevitably diverges. Ensuring those changes propagate and reconcile with minimal user headaches is a major challenge in distributed systems. Two main approaches have emerged: Use a bundled frontend+backend solution where the backend is tightly coupled to the client SDK and knows exactly how to handle sync. A common example is Firestore (part of the Firebase ecosystem) where Google's servers and client libraries collectively manage storage, change detection, conflict resolution, and syncing. The upside is you have a turnkey solution, developers can focus on features rather than writing sync logic. The downside is lock-in, because the sync protocol is proprietary and tailored to that vendor. In many organizations, this is a non-starter: existing company infrastructure can't be uprooted or replaced just for a single offline-capable app. This lock-in issue can arise even if the backend is not strictly a third-party vendor but simply another technology like PostgreSQL, because it still forces you to consolidate all your data into a single system that you might not use otherwise. Custom Replication with Your Own Endpoints: Alternatively, tools like RxDB allow you to implement your own replication endpoints on top of your existing infrastructure. This is the approach relies on a lightweight, git-like Sync Engine. The server remains relatively "dumb," focusing on storing revisions, tracking changes, and marking conflicts, while the client library does the actual conflict resolution. During sync, if the server detects a conflict (e.g., two offline edits to the same document), it notifies the client, which then decides how to merge them, whether via last-write-wins, a custom merge function, or a CRDT. Setting up custom endpoints does require more development effort, but you avoid vendor lock-in and can integrate seamlessly with your existing database(s). Your system simply needs to support incrementally fetching changes (pull) and accepting local modifications (push), which can be layered on top of nearly any data store or architecture. Tools which support "any backend" are of course harder to monetize because they cannot sell SaaS services or a Cloud Subscription which is why most tools use a fixed backend instead of an open Sync Engine. Conflict Resolution: When multiple offline edits happen on the same data, you inevitably get merge conflicts. For example, if two users (or the same user on two devices) both edit the same document offline, when both sync, whose changes win? Local-first systems need a conflict resolution strategy. Some systems use last-write-wins (firestore) or deterministic revision hashing to pick a "winner" (as in CouchDB/PouchDB)​. This is simple but may drop one user's changes. Other approaches keep both versions and merge them either via an implement "merge-function" or require a manual merge step (e.g., like git conflicts or showing the user a diff UI). More advanced solutions involve CRDTs (Conflict-free Replicated Data Types) which mathematically merge changes (used for rich text collaboration, for instance). Libraries like Automerge or Yjs implement CRDTs to "magically solve conflicts". But in practice, using CRDTs is also complex and has its own trade-offs and sometimes not even possible like when you need additional data from another instance for a "correct" merge. No matter which route, handling conflicts adds complexity to your app logic or infrastructure. In cloud-based (online-first) apps, you avoid this because everyone is always editing the single up-to-date copy on the server. Local-first shifts that burden to the client side. Here is an example on how a client-side merge functions works in RxDB: import { deepEqual } from 'rxdb/plugins/utils'; export const myConflictHandler = { /** * isEqual() is used to detect if two documents are * equal. This is used internally to detect conflicts. */ isEqual(a, b) { /** * isEqual() is used to detect conflicts or to detect if a * document has to be pushed to the remote. * If the documents are deep equal, * we have no conflict. * Because deepEqual is CPU expensive, * on your custom conflict handler you might only * check some properties, like the updatedAt time or revision-strings * for better performance. */ return deepEqual(a, b); }, /** * resolve() a conflict. This can be async so * you could even show an UI element to let your user * resolve the conflict manually. */ async resolve(i) { /** * In this example we drop the local state and use the server-state. * This basically implements a "first-on-server-wins" strategy. * * In your custom conflict handler you could want to merge properties * of the i.realMasterState, i.assumedMasterState and i.newDocumentState * or return i.newDocumentState to have a "last-write-wins" strategy. */ return i.realMasterState; } }; Eventual Consistency (No Single Source of Truth): A local-first system is eventually consistent by nature. There is no single authoritative copy of the data at all times. Instead you have one per device (and maybe one on the server), and they sync to become consistent eventually. This means at any given moment, two users might not see the same data if one hasn't synced recently. Users could even make decisions based on stale data. In many applications this is acceptable (the data will catch up), but for some scenarios it's problematic. For instance, an offline-first banking app that lets you initiate a money transfer offline could be dangerous if the account balance was out-of-date or if the transfer needs immediate consistency. Essentially, not all apps can tolerate eventual consistency. If your use case demands strong consistency (e.g., inventory systems where overselling is a big issue, or real-time collaborative editing where every keystroke must be seen by others instantly), a purely local-first approach might need augmentation or may not fit. Initial Data Load and Data Size Limits: Local-first requires pulling data down to the client. If your dataset is huge (gigabytes), it's simply not feasible to download everything to every client. For example, syncing every tweet on Twitter to every user's phone is impossible. Local-first works best when the data set per user is reasonably sized (up to 2 Gigabytes). In practice, you often limit the data to just that user's own data or a subset relevant to them. Even then, on first use the app might need to download a significant chunk of data to initialize the local database. There is a upper bound on dataset size beyond which the initial sync or storage needs become impractical. You cannot assume unlimited local storage. If your data is too large, local-first will either fail or you'll need to only sync partial data (and then handle what happens if the needed data isn't present locally). In short, local-first is unsuitable for massive datasets or data that cannot be partitioned per user. Storage Persistence (Browser Limitations): Storing data in the browser (via IndexedDB or similar) is not as durable as on a server disk. Browsers may evict data to save space (especially on mobile devices). For instance, Safari notoriously wipes out IndexedDB data if the user hasn't used the site in ~7 days. Other browsers have their own eviction policies for offline data. Also, users can at any time clear their browser storage (intentionally or via something like "Clear site data"). This means the local data cannot be 100% trusted to stay forever. A well-behaved local-first app needs to be able to recover if local data is lost, usually by pulling from the server again​. Essentially, the server still often serves as a backup. But if your app had any purely local data (not intended to sync), that's at risk. Mobile apps (with SQLite or filesystem storage) are a bit more stable than web browsers, but even there, uninstalls or certain OS actions can remove local data. This is a challenge: How to cache data offline for speed while ensuring if it's wiped, the user doesn't lose everything important. Cloud-only apps by contrast keep data in the cloud so it's typically safe unless the server fails (and servers are easier to backup reliably). Complex Client-Side Logic & Increased App Size: A local-first app tends to be more complex on the client side. You're essentially putting what used to be server responsibilities (storage, query engine, sync logic) into the frontend. This can increase the size of your frontend bundle (including a database library, possibly CRDT or sync code, etc.). It also increases memory and CPU usage on the client, as the browser/phone is doing more work. Low-end devices or older phones might struggle if the app is not optimized. Developers need to consider performance tuning for the local database (indexing, query efficiency) just like they would on a server. So while the user gains benefits, the app developer has to manage this complexity. Performance Constraints in JavaScript: Even though devices are fast, a local JS database is generally slower than a server DB on robust hardware. There are many layers (JS -> IndexedDB -> possibly SQLite under the hood) that add overhead​. For example, inserting a record might go through the DB library, the storage engine, the browser's implementation, down to disk. For most UI uses this is fine (you don't need 10k writes/sec in a to-do app, you need maybe a few writes per second at most). But if your app does heavy data processing, the browser might become a bottleneck. The key question is "Is it fast enough?". Often the answer is yes for typical usage, but developers must be mindful of not doing something on the client that truly requires big iron servers. For instance, full-text indexing of a million documents might be too slow in a client-side DB. Unpredictable performance is also a factor: Different users have different devices. A query that takes 50ms on a high-end desktop might take 500ms on a low-end phone in battery saving mode. So performance tuning and testing across devices is needed, and some heavy tasks might still belong on the server side​. For example if you build a local vector database you might want to create the embeddings on the server and sync them instead of creating them on the client. Client Database Migrations: As your app evolves, you'll change data models or add new fields. In a cloud-first app, you'd typically run a migration on the server database. In a local-first app, you have not only the server DB (if any) but also every client's local database to consider. Upgrading the schema means you need to write migration logic that runs on each client, perhaps the next time they launch the app after an update. Clients may be offline or not upgrade the app immediately, so you could have different versions of the schema in the wild. This complicates data handling (the sync protocol might need to handle multiple schema versions until everyone is updated). Providing a smooth migration path for local data is doable (many libraries provide migration facilities), but it requires careful testing. In a worst case, a failed migration on a client could brick the app for that user or force a full resync. This is a much bigger headache than just migrating a centralized DB at midnight while your service is in maintenance mode. 🌃 Security and Access Control: In cloud-based apps, enforcing data security (who can see what) is done on the server. The client only gets the data it's authorized to get. In a local-first scenario, you often need to partition data per user on the backend as well, to ensure users only sync down their own data (or data they have permission for). One simple strategy is to give each user their own database or dataset on the server and only replicate that. For example, CouchDB allows creating one database per user and replication can be scoped to that DB which makes permission handling easy. But if you ever need to query across users (say an admin view or aggregate analytics), having data split into many small DBs becomes a pain. The alternative is a single backend database with a fine-grained access control, and the client asks to sync only certain documents/fields. That usually means writing a custom sync server or using something like GraphQL with resolvers that respect permissions. In short, implementing auth and permissions in sync adds complexity. Also, any data stored on the client is theoretically vulnerable to extraction (if someone compromises the device or uses dev tools). You can encrypt local databases to prevent extraction after the server "revokes" the decryption password to mitigate the data extraction risk. Relational Data and Complex Queries: Most client-side/offline databases are NoSQL/document oriented for flexibility in syncing and easy conflict handling. They may not support complex join queries or ACID transactions across multiple tables like a full SQL database would. This is partly because replicating a full relational model is much harder (maintaining referential integrity, etc., when data is partial on a client) or not even logically possible. For example if you have two offline clients running a complex UPDATE X WHERE Y FROM Z INNER JOIN Alice INNER JOIN Bob query and then they go online, you have no easy way of handling these conflicts. If your app has heavy relational data requirements or relies on complex server-side queries (aggregations, multi-join reports), you might find the local database either cannot do it or is too slow to do it client-side. The lack of robust relational querying is something to plan for and you might need to adjust your data model to be more document-oriented or use client-side libraries to run joins in memory. Most tools use NoSQL because it makes replication easy and implementing true relational sync would require extremely sophisticated solutions and even needing an atomic clock for full consistency across nodes (like google spanner). So, if your app truly needs SQL power on the client, local-first might complicate things. In Local-First, most tools use NoSQL because it makes replication and conflict handling easy. That's a long list of challenges! In summary, local-first approaches introduce distributed data issues on the client side that web developers usually didn't have to deal with. Despite these challenges, the local-first movement is steadily growing because the benefits to user experience and data control are very compelling and modern tools are emerging to mitigate a lot of these difficulties. All of these are solved or solvable for your specific use-case, just keep them in mind before you start architecting your local-first app. ","version":"Next","tagName":"h2"},{"title":"Local-First vs. Traditional Online-First Approaches​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#local-first-vs-traditional-online-first-approaches","content":" So now that you know the pros and cons about Local-First. Lets directly compare it to your previous "online-first" stack: ","version":"Next","tagName":"h2"},{"title":"Connectivity and Offline Usage​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#connectivity-and-offline-usage","content":" Local-first: Apps like WhatsApp store messages locally on your device, letting you read past messages and even compose new ones without a stable network connection. Once online, the messages sync with the server and other participants.Online-first: Purely cloud-based apps typically stop functioning (beyond simple caching) when the network or server goes down. They rely on a constant connection to fetch or store user data. ","version":"Next","tagName":"h3"},{"title":"Latency and Performance​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#latency-and-performance","content":" Local-first: Because data operations happen on the device, you see near-instant interactions (e.g., typing and reading chats feels very responsive, as the messages are on your phone). Syncing occurs in the background without delaying the user.Online-first: Most interactions involve a round-trip to the server, adding network latency and potentially requiring loading states or fallback UIs. If the network is slow or unreliable, users can experience delays when sending or receiving updates. ","version":"Next","tagName":"h3"},{"title":"Complexity and Conflict Resolution​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#complexity-and-conflict-resolution","content":" Local-first: Much of the complexity like storing data or handling conflicts, shifts to the client. WhatsApp, for instance, caches all messages locally and queues unsent messages offline. Once reconnected, it must reconcile with the server and other devices, especially if the same account is used on multiple platforms.Online-first: A single central server manages data and concurrency, so clients remain thinner. However, the app becomes unusable if connectivity is lost, and any server downtime directly impacts all users. ","version":"Next","tagName":"h3"},{"title":"Data Ownership and Storage Limits​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#data-ownership-and-storage-limits","content":" Local-first: Users hold a complete copy of data on their own device, retaining control and quick access. This can raise challenges when data sets are very large; phone storage might be insufficient, or backups may be harder to guarantee.Online-first: Storing all data in the cloud scales more easily, and providers often manage backups automatically. On the downside, users depend on the service and must trust it to protect their data. ","version":"Next","tagName":"h3"},{"title":"When to Choose Which​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#when-to-choose-which","content":" Local-first: Particularly helpful for scenarios where offline operation and immediate responsiveness matter, such as chat apps (like WhatsApp), field tools in low-connectivity environments, or any use case where users can't rely on being online 24/7.Online-first: Well-suited for systems that demand real-time central control or massive data aggregation with minimal offline needs, such as large-scale analytics platforms or services where guaranteed immediate global consistency is essential.Hybrid: In reality, most modern apps often blend these approaches, giving users partial offline capabilities (caching, queued updates) alongside a robust central service. This hybrid method offers the benefits of local speed and resilience, while still leveraging cloud infrastructure for collaboration and global reach. But a truth local-first app is way more than just a cache. ","version":"Next","tagName":"h3"},{"title":"Offline-First vs. Local-First​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#offline-first-vs-local-first","content":" In the early days of offline-capable web apps (around 2014), the common phrase was "Offline-First". Tools like PouchDB popularized the notion that developers should assume devices are often offline or have flaky connections, so apps must continue to work seamlessly without a network. The guiding principle was "apps should treat being online as optional." If a user has no internet access, the application's core features still function, saving or queuing data locally, and automatically synchronizing once connectivity is restored. 4:18 What is Offline First? Over time, this focus on offline support evolved into the broader concept of "Local-First Software," (see Ink&Switch) emphasizing not just offline operation but also the technical underpinnings of storing data locally in the client application. While offline-first is primarily about resilience to network loss, local-first highlights ownership, privacy, and performance benefits of keeping the primary data on the user's device. Most tools these days extended the original offline-first concepts, adding real-time reactivity, custom sync, and more nuances like conflict resolution or encryption. However, the term "local-first" can be confusing to non-technical audiences because many people (especially in the US) associate "local first" with community-oriented movements that encourage buying from nearby businesses or supporting local initiatives. To reduce ambiguity, it may be clearer to use "local first software" or "local first development" in your documentation and marketing materials. When creating branding or logos around local-first software, avoid using the "Google Maps Pin" as a symbol. This icon typically implies geolocation or physical locality further mixing up the notion of "location-based services" with "on-device data storage." ","version":"Next","tagName":"h2"},{"title":"Do People Actually Use Local-First or Is It Just a Trend?​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#do-people-actually-use-local-first-or-is-it-just-a-trend","content":" If we look at npm download statistics, we see that PouchDB - one of the oldest libraries for local-first apps - has about 53k downloads each week, and RxDB - a newer library - has about 22k weekly downloads. Other local-first tools often have even fewer downloads. In comparison, a popular library like react-query, which does not focus on local storage, is downloaded about 1.6 million times a week. These numbers show that local-first libraries, while used, are not as common as some of the more traditional tools. One reason is that local-first is still a new idea. Many developers are used to traditional "online-first" approaches, so switching to a local database and then syncing changes later can feel unfamiliar. Developers must learn different patterns, deal with offline synchronization, and handle possible conflicts. That extra work can be a barrier to adoption which might change in the future as tooling improves. While most of RxDB is open source, there are also premium plugins that help sustain RxDB as a long-term project. Because people purchase these plugins, we gains insights into how developers are using local-first features: About half of these users mainly want offline functionality for cases such as farming equipment, mining, construction, or even a shrimp farm app.The other half focus on faster, real-time UIs for to-do or reading apps, a space launch planning tool, and various dashboard apps. This range of use cases highlights both the resilience offline mode can offer and the performance boost that local databases can provide when synced in the background. ","version":"Next","tagName":"h2"},{"title":"Why Local-First Is the Future​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#why-local-first-is-the-future","content":" Early in the history of the web, users expected static pages. If you wanted to see new content, you reloaded the page. That was normal at the time, and nobody found it strange because everything worked that way. Then, as more sites added real-time features - auto-updating feeds, live notifications, single-page apps - suddenly those older "reload-only" sites began to feel slow or outdated. Why wait for a manual refresh when real-time data was possible and readily available? The same pattern is happening with local-first apps. Right now, most sites are still built around network availability. We see loading spinners whenever data is fetched, and we simply wait for the server response. As local-first experiences become commonplace - removing spinners, letting users keep working when offline, and syncing in the background - everything else will start to feel frustratingly behind. Users won't tolerate slow or blocked interactions if they've seen apps that respond instantly and remain usable offline. They'll expect that as the default and we'll likely see growing pressure on developers to eliminate those extra loading steps. For many users, the experience of immediate local writes will become not just a perk, but an expectation! ","version":"Next","tagName":"h2"},{"title":"See also​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#see-also","content":" Discuss this topic on HackerNewsLocal-First Technologies: A list of databases and technologies (besides RxDB) that support offline-first or local-first use cases.Discord: Join our Discord server to talk with people and share ideas about this topic.Inc&Switch: The "original" paper about Local-First from 2019 where the naming of local-first Software was first used and described.Learn how to build a local-first Application with RxDB. ","version":"Next","tagName":"h2"},{"title":"Using localStorage in Modern Applications: A Comprehensive Guide","type":0,"sectionRef":"#","url":"/articles/localstorage.html","content":"","keywords":"","version":"Next"},{"title":"What is the localStorage API?​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#what-is-the-localstorage-api","content":" The localStorage API is a built-in feature of web browsers that enables web developers to store small amounts of data persistently on a user's device. It operates on a simple key-value basis, allowing developers to save strings, numbers, and other simple data types. This data remains available even after the user closes the browser or navigates away from the page. The API provides a convenient way to maintain state and store user preferences without relying on server-side storage. ","version":"Next","tagName":"h2"},{"title":"Exploring local storage Methods: A Practical Example​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#exploring-local-storage-methods-a-practical-example","content":" Let's dive into some hands-on code examples to better understand how to leverage the power of localStorage. The API offers several methods for interaction, including setItem, getItem, removeItem, and clear. Consider the following code snippet: // Storing data using setItem localStorage.setItem('username', 'john_doe'); // Retrieving data using getItem const storedUsername = localStorage.getItem('username'); // Removing data using removeItem localStorage.removeItem('username'); // Clearing all data localStorage.clear(); ","version":"Next","tagName":"h2"},{"title":"Storing Complex Data in JavaScript with JSON Serialization​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#storing-complex-data-in-javascript-with-json-serialization","content":" While js localStorage excels at handling simple key-value pairs, it also supports more intricate data storage through JSON serialization. By utilizing JSON.stringify and JSON.parse, you can store and retrieve structured data like objects and arrays. Here's an example of storing a document: const user = { name: 'Alice', age: 30, email: 'alice@example.com' }; // Storing a user object localStorage.setItem('user', JSON.stringify(user)); // Retrieving and parsing the user object const storedUser = JSON.parse(localStorage.getItem('user')); ","version":"Next","tagName":"h2"},{"title":"Understanding the Limitations of local storage​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#understanding-the-limitations-of-local-storage","content":" Despite its convenience, localStorage does come with a set of limitations that developers should be aware of: Non-Async Blocking API: One significant drawback is that js localStorage operates as a non-async blocking API. This means that any operations performed on localStorage can potentially block the main thread, leading to slower application performance and a less responsive user experience.Limited Data Structure: Unlike more advanced databases, localStorage is limited to a simple key-value store. This restriction makes it unsuitable for storing complex data structures or managing relationships between data elements.Stringification Overhead: Storing JSON data in localStorage requires stringifying the data before storage and parsing it when retrieved. This process introduces performance overhead, potentially slowing down operations by up to 10 times.Lack of Indexing: localStorage lacks indexing capabilities, making it challenging to perform efficient searches or iterate over data based on specific criteria. This limitation can hinder applications that rely on complex data retrieval.Tab Blocking: In a multi-tab environment, one tab's localStorage operations can impact the performance of other tabs by monopolizing CPU resources. You can reproduce this behavior by opening this test file in two browser windows and trigger localstorage inserts in one of them. You will observe that the indication spinner will stuck in both windows.Storage Limit: Browsers typically impose a storage limit of around 5 MiB for each origin's localStorage. ","version":"Next","tagName":"h2"},{"title":"Reasons to Still Use localStorage​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#reasons-to-still-use-localstorage","content":" ","version":"Next","tagName":"h2"},{"title":"Is localStorage Slow?​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#is-localstorage-slow","content":" Contrary to concerns about performance, the localStorage API in JavaScript is surprisingly fast when compared to alternative storage solutions like IndexedDB or OPFS. It excels in handling small key-value assignments efficiently. Due to its simplicity and direct integration with browsers, accessing and modifying localStorage data incur minimal overhead. For scenarios where quick and straightforward data storage is required, localStorage remains a viable option. For example RxDB uses localStorage in the localStorage meta optimizer to manage simple key values pairs while storing the "normal" documents inside of another storage like IndexedDB. ","version":"Next","tagName":"h3"},{"title":"When Not to Use localStorage​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#when-not-to-use-localstorage","content":" While localStorage offers convenience, it may not be suitable for every use case. Consider the following situations where alternatives might be more appropriate: Data Must Be Queryable: If your application relies heavily on querying data based on specific criteria, localStorage might not provide the necessary querying capabilities. Complex data retrieval might lead to inefficient code and slow performance.Big JSON Documents: Storing large JSON documents in localStorage can consume a significant amount of memory and degrade performance. It's essential to assess the size of the data you intend to store and consider more robust solutions for handling substantial datasets.Many Read/Write Operations: Excessive read and write operations on localStorage can lead to performance bottlenecks. Other storage solutions might offer better performance and scalability for applications that require frequent data manipulation.Lack of Persistence: If your application can function without persistent data across sessions, consider using in-memory data structures like new Map() or new Set(). These options offer speed and efficiency for transient data. ","version":"Next","tagName":"h2"},{"title":"What to use instead of the localStorage API in JavaScript​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#what-to-use-instead-of-the-localstorage-api-in-javascript","content":" ","version":"Next","tagName":"h2"},{"title":"localStorage vs IndexedDB​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#localstorage-vs-indexeddb","content":" While localStorage serves as a reliable storage solution for simpler data needs, it's essential to explore alternatives like IndexedDB when dealing with more complex requirements. IndexedDB is designed to store not only key-value pairs but also JSON documents. Unlike localStorage, which usually has a storage limit of around 5-10MB per domain, IndexedDB can handle significantly larger datasets. IndexDB with its support for indexing facilitates efficient querying, making range queries possible. However, it's worth noting that IndexedDB lacks observability, which is a feature unique to localStorage through the storage event. Also, complex queries can pose a challenge with IndexedDB, and while its performance is acceptable, IndexedDB can be too slow for some use cases. // localStorage can observe changes with the storage event. // This feature is missing in IndexedDB addEventListener("storage", (event) => {}); For those looking to harness the full power of IndexedDB with added capabilities, using wrapper libraries like RxDB is recommended. These libraries augment IndexedDB with features such as complex queries and observability, enhancing its usability for modern applications by providing a real database instead of only a key-value store. In summary when you compare IndexedDB vs localStorage, IndexedDB will win at any case where much data is handled while localStorage has better performance on small key-value datasets. ","version":"Next","tagName":"h3"},{"title":"File System API (OPFS)​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#file-system-api-opfs","content":" Another intriguing option is the OPFS (File System API). This API provides direct access to an origin-based, sandboxed filesystem which is highly optimized for performance and offers in-place write access to its content. OPFS offers impressive performance benefits. However, working with the OPFS API can be complex, and it's only accessible within a WebWorker. To simplify its usage and extend its capabilities, consider using a wrapper library like RxDB's OPFS RxStorage, which builds a comprehensive database on top of the OPFS API. This abstraction allows you to harness the power of the OPFS API without the intricacies of direct usage. ","version":"Next","tagName":"h3"},{"title":"localStorage vs Cookies​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#localstorage-vs-cookies","content":" Cookies, once a primary method of client-side data storage, have fallen out of favor in modern web development due to their limitations. While they can store data, they are about 100 times slower when compared to the localStorage API. Additionally, cookies are included in the HTTP header, which can impact network performance. As a result, cookies are not recommended for data storage purposes in contemporary web applications. ","version":"Next","tagName":"h3"},{"title":"localStorage vs WebSQL​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#localstorage-vs-websql","content":" WebSQL, despite offering a SQL-based interface for client-side data storage, is a deprecated technology and should be avoided. Its API has been phased out of modern browsers, and it lacks the robustness of alternatives like IndexedDB. Moreover, WebSQL tends to be around 10 times slower than IndexedDB, making it a suboptimal choice for applications that demand efficient data manipulation and retrieval. ","version":"Next","tagName":"h3"},{"title":"localStorage vs sessionStorage​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#localstorage-vs-sessionstorage","content":" In scenarios where data persistence beyond a session is unnecessary, developers often turn to sessionStorage. This storage mechanism retains data only for the duration of a tab or browser session. It survives page reloads and restores, providing a handy solution for temporary data needs. However, it's important to note that sessionStorage is limited in scope and may not suit all use cases. ","version":"Next","tagName":"h3"},{"title":"AsyncStorage for React Native​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#asyncstorage-for-react-native","content":" For React Native developers, the AsyncStorage API is the go-to solution, mirroring the behavior of localStorage but with asynchronous support. Since not all JavaScript runtimes support localStorage, AsyncStorage offers a seamless alternative for data persistence in React Native applications. ","version":"Next","tagName":"h3"},{"title":"node-localstorage for Node.js​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#node-localstorage-for-nodejs","content":" Because native localStorage is absent in the Node.js JavaScript runtime, you will get the error ReferenceError: localStorage is not defined in Node.js or node based runtimes like Next.js. The node-localstorage npm package bridges the gap. This package replicates the browser's localStorage API within the Node.js environment, ensuring consistent and compatible data storage capabilities. ","version":"Next","tagName":"h3"},{"title":"localStorage in browser extensions​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#localstorage-in-browser-extensions","content":" While browser extensions for chrome and firefox support the localStorage API, it is not recommended to use it in that context to store extension-related data. The browser will clear the data in many scenarios like when the users clear their browsing history. Instead the Extension Storage API should be used for browser extensions. In contrast to localStorage, the storage API works async and all operations return a Promise. Also it provides automatic sync to replicate data between all instances of that browser that the user is logged into. The storage API is even able to storage JSON-ifiable objects instead of plain strings. // Using the storage API in chrome await chrome.storage.local.set({ foobar: {nr: 1} }); const result = await chrome.storage.local.get('foobar'); console.log(result.foobar); // {nr: 1} ","version":"Next","tagName":"h2"},{"title":"localStorage in Deno and Bun​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#localstorage-in-deno-and-bun","content":" The Deno JavaScript runtime has a working localStorage API so running localStorage.setItem() and the other methods, will just work and the locally stored data is persisted across multiple runs. Bun does not support the localStorage JavaScript API. Trying to use localStorage will error with ReferenceError: Can't find variable: localStorage. To store data locally in Bun, you could use the bun:sqlite module instead or directly use a in-JavaScript database with Bun support like RxDB. ","version":"Next","tagName":"h2"},{"title":"Conclusion: Choosing the Right Storage Solution​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#conclusion-choosing-the-right-storage-solution","content":" In the world of modern web development, localStorage serves as a valuable tool for lightweight data storage. Its simplicity and speed make it an excellent choice for small key-value assignments. However, as application complexity grows, developers must assess their storage needs carefully. For scenarios that demand advanced querying, complex data structures, or high-volume operations, alternatives like IndexedDB, wrapper libraries with additional features like RxDB, or platform-specific APIs offer more robust solutions. By understanding the strengths and limitations of various storage options, developers can make informed decisions that pave the way for efficient and scalable applications. ","version":"Next","tagName":"h2"},{"title":"Follow up​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#follow-up","content":" Learn how to store and query data with RxDB in the RxDB QuickstartWhy IndexedDB is slow and how to fix itRxStorage performance comparison ","version":"Next","tagName":"h2"},{"title":"Mobile Database - RxDB as Database for Mobile Applications","type":0,"sectionRef":"#","url":"/articles/mobile-database.html","content":"","keywords":"","version":"Next"},{"title":"Understanding Mobile Databases​","type":1,"pageTitle":"Mobile Database - RxDB as Database for Mobile Applications","url":"/articles/mobile-database.html#understanding-mobile-databases","content":" Mobile databases are specialized software systems designed to handle data storage and management for mobile applications. These databases are optimized for the unique requirements of mobile environments, which often include limited device resources, fluctuations in network connectivity, and the need for offline functionality. There are various types of mobile databases available, each with its own strengths and use cases. Local databases, such as SQLite and Realm, reside directly on the user's device, providing offline capabilities and faster data access. Cloud-based databases, like Firebase Realtime Database and Amazon DynamoDB, rely on remote servers to store and retrieve data, enabling synchronization across multiple devices. Hybrid databases, as the name suggests, combine the benefits of both local and cloud-based approaches, offering a balance between offline functionality and data synchronization. ","version":"Next","tagName":"h2"},{"title":"Introducing RxDB: A Paradigm Shift in Mobile Database Solutions​","type":1,"pageTitle":"Mobile Database - RxDB as Database for Mobile Applications","url":"/articles/mobile-database.html#introducing-rxdb-a-paradigm-shift-in-mobile-database-solutions","content":" RxDB, also known as Reactive Database, has emerged as a game-changer in the realm of mobile databases. Built on top of popular web technologies like JavaScript, TypeScript, and RxJS (Reactive Extensions for JavaScript), RxDB provides an elegant solution for seamless offline-first capabilities and real-time data synchronization in mobile applications. Benefits of RxDB for Hybrid App Development Offline-First Approach: One of the major advantages of RxDB is its ability to work in an offline mode. It allows mobile applications to store and access data locally, ensuring uninterrupted functionality even when the network connection is weak or unavailable. The database automatically syncs the data with the server once the connection is reestablished, guaranteeing data consistency. Real-Time Data Synchronization: RxDB leverages the power of real-time data synchronization, making it an excellent choice for applications that require collaborative features or live updates. It uses the concept of change streams to detect modifications made to the database and instantly propagates those changes across connected devices. This real-time synchronization enables seamless collaboration and enhances user experience. Reactive Programming Paradigm: RxDB embraces the principles of reactive programming, which simplifies the development process by handling asynchronous events and data streams. By leveraging RxJS observables, developers can write concise, declarative code that reacts to changes in data, ensuring a highly responsive user experience. The reactive programming paradigm enhances code maintainability, scalability, and testability. Easy Integration with Hybrid App Frameworks: RxDB seamlessly integrates with popular hybrid app development frameworks like React Native and Capacitor. This compatibility allows developers to leverage the existing ecosystem and tools of these frameworks, making the transition to RxDB smoother and more efficient. By utilizing RxDB within these frameworks, developers can harness the power of a robust database solution without sacrificing the advantages of hybrid app development. Cross-Platform Support: RxDB enables developers to build cross-platform mobile applications that run seamlessly on both iOS and Android devices. This versatility eliminates the need for separate database implementations for different platforms, saving development time and effort. With RxDB, developers can focus on building a unified codebase and delivering a consistent user experience across platforms. ","version":"Next","tagName":"h2"},{"title":"Use Cases for RxDB in Hybrid App Development​","type":1,"pageTitle":"Mobile Database - RxDB as Database for Mobile Applications","url":"/articles/mobile-database.html#use-cases-for-rxdb-in-hybrid-app-development","content":" Offline-First Applications: RxDB is an ideal choice for applications that heavily rely on offline functionality. Whether it's a note-taking app, a task manager, or a survey application, RxDB ensures that users can continue working even when connectivity is compromised. The seamless synchronization capabilities of RxDB ensure that changes made offline are automatically propagated once the device reconnects to the internet. Real-Time Collaboration: Applications that require real-time collaboration, such as messaging platforms or collaborative editing tools, can greatly benefit from RxDB. The real-time synchronization capabilities enable multiple users to work on the same data simultaneously, ensuring that everyone sees the latest updates in real-time. Data-Intensive Applications: RxDB's performance and scalability make it suitable for data-intensive applications that handle large datasets or complex data structures. Whether it's a media-rich app, a data visualization tool, or an analytics platform, RxDB can handle the heavy lifting and provide a smooth user experience. Cross-Platform Applications: Hybrid app frameworks like React Native and Capacitor have gained popularity due to their ability to build cross-platform applications. By utilizing RxDB within these frameworks, developers can create a unified codebase that runs seamlessly on both iOS and Android, significantly reducing development time and effort. ","version":"Next","tagName":"h2"},{"title":"Conclusion​","type":1,"pageTitle":"Mobile Database - RxDB as Database for Mobile Applications","url":"/articles/mobile-database.html#conclusion","content":" Mobile databases play a vital role in the performance and functionality of mobile applications. RxDB, with its offline-first approach, real-time data synchronization, and seamless integration with hybrid app development frameworks like React Native and Capacitor, offers a robust solution for managing data in mobile apps. By leveraging the power of reactive programming, RxDB empowers developers to build highly responsive, scalable, and cross-platform applications that deliver an exceptional user experience. With its versatility and ease of use, RxDB is undoubtedly a database solution worth considering for hybrid app development. Embrace the power of RxDB and unlock the full potential of your mobile applications. ","version":"Next","tagName":"h2"},{"title":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","type":0,"sectionRef":"#","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html","content":"","keywords":"","version":"Next"},{"title":"The available Storage APIs in a modern Browser​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#the-available-storage-apis-in-a-modern-browser","content":" First lets have a brief overview of the different APIs, their intentional use case and history: ","version":"Next","tagName":"h2"},{"title":"What are Cookies​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#what-are-cookies","content":" Cookies were first introduced by netscape in 1994. Cookies store small pieces of key-value data that are mainly used for session management, personalization, and tracking. Cookies can have several security settings like a time-to-live or the domain attribute to share the cookies between several subdomains. Cookies values are not only stored at the client but also sent with every http request to the server. This means we cannot store much data in a cookie but it is still interesting how good cookie access performance compared to the other methods. Especially because cookies are such an important base feature of the web, many performance optimizations have been done and even these days there is still progress being made like the Shared Memory Versioning by chromium or the asynchronous CookieStore API. ","version":"Next","tagName":"h3"},{"title":"What is LocalStorage​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#what-is-localstorage","content":" The localStorage API was first proposed as part of the WebStorage specification in 2009. LocalStorage provides a simple API to store key-value pairs inside of a web browser. It has the methods setItem, getItem, removeItem and clear which is all you need from a key-value store. LocalStorage is only suitable for storing small amounts of data that need to persist across sessions and it is limited by a 5MB storage cap. Storing complex data is only possible by transforming it into a string for example with JSON.stringify(). The API is not asynchronous which means if fully blocks your JavaScript process while doing stuff. Therefore running heavy operations on it might block your UI from rendering. There is also the SessionStorage API. The key difference is that localStorage data persists indefinitely until explicitly cleared, while sessionStorage data is cleared when the browser tab or window is closed. ","version":"Next","tagName":"h3"},{"title":"What is IndexedDB​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#what-is-indexeddb","content":" IndexedDB was first introduced as "Indexed Database API" in 2015. IndexedDB is a low-level API for storing large amounts of structured JSON data. While the API is a bit hard to use, IndexedDB can utilize indexes and asynchronous operations. It lacks support for complex queries and only allows to iterate over the indexes which makes it more like a base layer for other libraries then a fully fledged database. In 2018, IndexedDB version 2.0 was introduced. This added some major improvements. Most noticeable the getAll() method which improves performance dramatically when fetching bulks of JSON documents. IndexedDB version 3.0 is in the workings which contains many improvements. Most important the addition of Promise based calls that makes modern JS features like async/await more useful. ","version":"Next","tagName":"h3"},{"title":"What is OPFS​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#what-is-opfs","content":" The Origin Private File System (OPFS) is a relatively new API that allows web applications to store large files directly in the browser. It is designed for data-intensive applications that want to write and read binary data in a simulated file system. OPFS can be used in two modes: Either asynchronous on the main threadOr in a WebWorker with the faster, asynchronous access with the createSyncAccessHandle() method. Because only binary data can be processed, OPFS is made to be a base filesystem for library developers. You will unlikely directly want to use the OPFS in your code when you build a "normal" application because it is too complex. That would only make sense for storing plain files like images, not to store and query JSON data efficiently. I have build a OPFS based storage for RxDB with proper indexing and querying and it took me several months. ","version":"Next","tagName":"h3"},{"title":"What is WASM SQLite​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#what-is-wasm-sqlite","content":" WebAssembly (Wasm) is a binary format that allows high-performance code execution on the web. Wasm was added to major browsers over the course of 2017 which opened a wide range of opportunities on what to run inside of a browser. You can compile native libraries to WebAssembly and just run them on the client with just a few adjustments. WASM code can be shipped to browser apps and generally runs much faster compared to JavaScript, but still about 10% slower then native. Many people started to use compiled SQLite as a database inside of the browser which is why it makes sense to also compare this setup to the native APIs. The compiled byte code of SQLite has a size of about 938.9 kB which must be downloaded and parsed by the users on the first page load. WASM cannot directly access any persistent storage API in the browser. Instead it requires data to flow from WASM to the main-thread and then can be put into one of the browser APIs. This is done with so called VFS (virtual file system) adapters that handle data access from SQLite to anything else. ","version":"Next","tagName":"h3"},{"title":"What was WebSQL​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#what-was-websql","content":" WebSQL was a web API introduced in 2009 that allowed browsers to use SQL databases for client-side storage, based on SQLite. The idea was to give developers a way to store and query data using SQL on the client side, similar to server-side databases. WebSQL has been removed from browsers in the current years for multiple good reasons: WebSQL was not standardized and having an API based on a single specific implementation in form of the SQLite source code is hard to ever make it to a standard.WebSQL required browsers to use a specific version of SQLite (version 3.6.19) which means whenever there would be any update or bugfix to SQLite, it would not be possible to add that to WebSQL without possible breaking the web.Major browsers like firefox never supported WebSQL. Therefore in the following we will just ignore WebSQL even if it would be possible to run tests on in by setting specific browser flags or using old versions of chromium. ","version":"Next","tagName":"h3"},{"title":"Feature Comparison​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#feature-comparison","content":" Now that you know the basic concepts of the APIs, lets compare some specific features that have shown to be important for people using RxDB and browser based storages in general. ","version":"Next","tagName":"h2"},{"title":"Storing complex JSON Documents​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#storing-complex-json-documents","content":" When you store data in a web application, most often you want to store complex JSON documents and not only "normal" values like the integers and strings you store in a server side database. Only IndexedDB works with JSON objects natively.With SQLite WASM you can store JSON in a text column since version 3.38.0 (2022-02-22) and even run deep queries on it and use single attributes as indexes. Every of the other APIs can only store strings or binary data. Of course you can transform any JSON object to a string with JSON.stringify() but not having the JSON support in the API can make things complex when running queries and running JSON.stringify() many times can cause performance problems. ","version":"Next","tagName":"h3"},{"title":"Multi-Tab Support​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#multi-tab-support","content":" A big difference when building a Web App compared to Electron or React-Native, is that the user will open and close the app in multiple browser tabs at the same time. Therefore you have not only one JavaScript process running, but many of them can exist and might have to share state changes between each other to not show outdated data to the user. If your users' muscle memory puts the left hand on the F5 key while using your website, you did something wrong! Not all storage APIs support a way to automatically share write events between tabs. Only localstorage has a way to automatically share write events between tabs by the API itself with the storage-event which can be used to observe changes. // localStorage can observe changes with the storage event. // This feature is missing in IndexedDB and others addEventListener("storage", (event) => {}); There was the experimental IndexedDB observers API for chrome, but the proposal repository has been archived. To workaround this problem, there are two solutions: The first option is to use the BroadcastChannel API which can send messages across browser tabs. So whenever you do a write to the storage, you also send a notification to other tabs to inform them about these changes. This is the most common workaround which is also used by RxDB. Notice that there is also the WebLocks API which can be used to have mutexes across browser tabs.The other solution is to use the SharedWorker and do all writes inside of the worker. All browser tabs can then subscribe to messages from that single SharedWorker and know about changes. ","version":"Next","tagName":"h3"},{"title":"Indexing Support​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#indexing-support","content":" The big difference between a database and storing data in a plain file, is that a database is writing data in a format that allows running operations over indexes to facilitate fast performant queries. From our list of technologies only IndexedDB and WASM SQLite support for indexing out of the box. In theory you can build indexes on top of any storage like localstorage or OPFS but you likely should not want to do that by yourself. In IndexedDB for example, we can fetch a bulk of documents by a given index range: // find all products with a price between 10 and 50 const keyRange = IDBKeyRange.bound(10, 50); const transaction = db.transaction('products', 'readonly'); const objectStore = transaction.objectStore('products'); const index = objectStore.index('priceIndex'); const request = index.getAll(keyRange); const result = await new Promise((res, rej) => { request.onsuccess = (event) => res(event.target.result); request.onerror = (event) => rej(event); }); Notice that IndexedDB has the limitation of not having indexes on boolean values. You can only index strings and numbers. To workaround that you have to transform boolean to numbers and backwards when storing the data. ","version":"Next","tagName":"h3"},{"title":"WebWorker Support​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#webworker-support","content":" When running heavy data operations, you might want to move the processing away from the JavaScript main thread. This ensures that our app keeps being responsive and fast while the processing can run in parallel in the background. In a browser you can either use the WebWorker, SharedWorker or the ServiceWorker API to do that. In RxDB you can use the WebWorker or SharedWorker plugins to move your storage inside of a worker. The most common API for that use case is spawning a WebWorker and doing most work on that second JavaScript process. The worker is spawned from a separate JavaScript file (or base64 string) and communicates with the main thread by sending data with postMessage(). Unfortunately LocalStorage and Cookiescannot be used in WebWorker or SharedWorker because of the design and security constraints. WebWorkers run in a separate global context from the main browser thread and therefore cannot do stuff that might impact the main thread. They have no direct access to certain web APIs, like the DOM, localStorage, or cookies. Everything else can be used from inside a WebWorker. The fast version of OPFS with the createSyncAccessHandle method can onlybe used in a WebWorker, and not on the main thread. This is because all the operations of the returned AccessHandle are not async and therefore block the JavaScript process, so you do want to do that on the main thread and block everything. ","version":"Next","tagName":"h3"},{"title":"Storage Size Limits​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#storage-size-limits","content":" Cookies are limited to about 4 KB of data in RFC-6265. Because the stored cookies are send to the server with every HTTP request, this limitation is reasonable. You can test your browsers cookie limits here. Notice that you should never fill up the full 4 KB of your cookies because your web server will not accept too long headers and reject the requests with HTTP ERROR 431 - Request header fields too large. Once you have reached that point you can not even serve updated JavaScript to your user to clean up the cookies and you will have locked out that user until the cookies get cleaned up manually. LocalStorage has a storage size limitation that varies depending on the browser, but generally ranges from 4 MB to 10 MB per origin. You can test your localStorage size limit here. Chrome/Chromium/Edge: 5 MB per domainFirefox: 10 MB per domainSafari: 4-5 MB per domain (varies slightly between versions) IndexedDB does not have a specific fixed size limitation like localStorage. The maximum storage size for IndexedDB depends on the browser implementation. The upper limit is typically based on the available disc space on the user's device. In chromium browsers it can use up to 80% of total disk space. You can get an estimation about the storage size limit by calling await navigator.storage.estimate(). Typically you can store gigabytes of data which can be tried out here. Notice that we have a full article about storage max size limits of IndexedDB that covers this topic. OPFS has the same storage size limitation as IndexedDB. Its limit depends on the available disc space. This can also be tested here. ","version":"Next","tagName":"h2"},{"title":"Performance Comparison​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#performance-comparison","content":" Now that we've reviewed the features of each storage method, let's dive into performance comparisons, focusing on initialization times, read/write latencies, and bulk operations. Notice that we only run simple tests and for your specific use case in your application the results might differ. Also we only compare performance in google chrome (version 128.0.6613.137). Firefox and Safari have similar but not equal performance patterns. You can run the test by yourself on your own machine from this github repository. For all tests we throttle the network to behave like the average german internet speed. (download: 135,900 kbit/s, upload: 28,400 kbit/s, latency: 125ms). Also all tests store an "average" JSON object that might be required to be stringified depending on the storage. We also only test the performance of storing documents by id because some of the technologies (cookies, OPFS and localstorage) do not support indexed range operations so it makes no sense to compare the performance of these. ","version":"Next","tagName":"h2"},{"title":"Initialization Time​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#initialization-time","content":" Before you can store any data, many APIs require a setup process like creating databases, spawning WebAssembly processes or downloading additional stuff. To ensure your app starts fast, the initialization time is important. The APIs of localStorage and Cookies do not have any setup process and can be directly used. IndexedDB requires to open a database and a store inside of it. WASM SQLite needs to download a WASM file and process it. OPFS needs to download and start a worker file and initialize the virtual file system directory. Here are the time measurements from how long it takes until the first bit of data can be stored: Technology\tTime in MillisecondsIndexedDB\t46 OPFS Main Thread\t23 OPFS WebWorker\t26.8 WASM SQLite (memory)\t504 WASM SQLite (IndexedDB)\t535 Here we can notice a few things: Opening a new IndexedDB database with a single store takes surprisingly longThe latency overhead of sending data from the main thread to a WebWorker OPFS is about 4 milliseconds. Here we only send minimal data to init the OPFS file handler. It will be interesting if that latency increases when more data is processed.Downloading and parsing WASM SQLite and creating a single table takes about half a second. Using also the IndexedDB VFS to store data persistently adds additional 31 milliseconds. Reloading the page with enabled caching and already prepared tables is a bit faster with 420 milliseconds (memory). ","version":"Next","tagName":"h3"},{"title":"Latency of small Writes​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#latency-of-small-writes","content":" Next lets test the latency of small writes. This is important when you do many small data changes that happen independent from each other. Like when you stream data from a websocket or persist pseudo randomly happening events like mouse movements. Technology\tTime in MillisecondsCookies\t0.058 LocalStorage\t0.017 IndexedDB\t0.17 OPFS Main Thread\t1.46 OPFS WebWorker\t1.54 WASM SQLite (memory)\t0.17 WASM SQLite (IndexedDB)\t3.17 Here we can notice a few things: LocalStorage has the lowest write latency with only 0.017 milliseconds per write.IndexedDB writes are about 10 times slower compared to localStorage.Sending the data to the WASM SQLite process and letting it persist via IndexedDB is slow with over 3 milliseconds per write. The OPFS operations take about 1.5 milliseconds to write the JSON data into one document per file. We can see the sending the data to a webworker first is a bit slower which comes from the overhead of serializing and deserializing the data on both sides. If we would not create on OPFS file per document but instead append everything to a single file, the performance pattern changes significantly. Then the faster file handle from the createSyncAccessHandle() only takes about 1 millisecond per write. But this would require to somehow remember at which position the each document is stored. Therefore in our tests we will continue using one file per document. ","version":"Next","tagName":"h3"},{"title":"Latency of small Reads​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#latency-of-small-reads","content":" Now that we have stored some documents, lets measure how long it takes to read single documents by their id. Technology\tTime in MillisecondsCookies\t0.132 LocalStorage\t0.0052 IndexedDB\t0.1 OPFS Main Thread\t1.28 OPFS WebWorker\t1.41 WASM SQLite (memory)\t0.45 WASM SQLite (IndexedDB)\t2.93 Here we can notice a few things: LocalStorage reads are really really fast with only 0.0052 milliseconds per read.The other technologies perform reads in a similar speed to their write latency. ","version":"Next","tagName":"h3"},{"title":"Big Bulk Writes​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#big-bulk-writes","content":" As next step, lets do some big bulk operations with 200 documents at once. Technology\tTime in MillisecondsCookies\t20.6 LocalStorage\t5.79 IndexedDB\t13.41 OPFS Main Thread\t280 OPFS WebWorker\t104 WASM SQLite (memory)\t19.1 WASM SQLite (IndexedDB)\t37.12 Here we can notice a few things: Sending the data to a WebWorker and running it via the faster OPFS API is about twice as fast.WASM SQLite performs better on bulk operations compared to its single write latency. This is because sending the data to WASM and backwards is faster if it is done all at once instead of once per document. ","version":"Next","tagName":"h3"},{"title":"Big Bulk Reads​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#big-bulk-reads","content":" Now lets read 100 documents in a bulk request. Technology\tTime in MillisecondsCookies\t6.34 LocalStorage\t0.39 IndexedDB\t4.99 OPFS Main Thread\t54.79 OPFS WebWorker\t25.61 WASM SQLite (memory)\t3.59 WASM SQLite (IndexedDB)\t5.84 (35ms without cache) Here we can notice a few things: Reading many files in the OPFS webworker is about twice as fast compared to the slower main thread mode.WASM SQLite is surprisingly fast. Further inspection has shown that the WASM SQLite process keeps the documents in memory cached which improves the latency when we do reads directly after writes on the same data. When the browser tab is reloaded between the writes and the reads, finding the 100 documents takes about 35 milliseconds instead. ","version":"Next","tagName":"h3"},{"title":"Performance Conclusions​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#performance-conclusions","content":" LocalStorage is really fast but remember that is has some downsides: It blocks the main JavaScript process and therefore should not be used for big bulk operations.Only Key-Value assignments are possible, you cannot use it efficiently when you need to do index based range queries on your data. OPFS is way faster when used in the WebWorker with the createSyncAccessHandle() method compare to using it directly in the main thread.SQLite WASM can be fast but you have to initially download the full binary and start it up which takes about half a second. This might not be relevant at all if your app is started up once and the used for a very long time. But for web-apps that are opened and closed in many browser tabs many times, this might be a problem. ","version":"Next","tagName":"h2"},{"title":"Possible Improvements​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#possible-improvements","content":" There is a wide range of possible improvements and performance hacks to speed up the operations. For IndexedDB I have made a list of performance hacks here. For example you can do sharding between multiple database and webworkers or use a custom index strategy.OPFS is slow in writing one file per document. But you do not have to do that and instead you can store everything at a single file like a normal database would do. This improves performance dramatically like it was done with the RxDB OPFS RxStorage.You can mix up the technologies to optimize for multiple scenarios at once. For example in RxDB there is the localstorage meta optimizer which stores initial metadata in localstorage and "normal" documents inside of IndexedDB. This improves the initial startup time while still having the documents stored in a way to query them efficiently.There is the memory-mapped storage plugin in RxDB which maps data directly to memory. Using this in combination with a shared worker can improve pageloads and query time significantly.Compressing data before storing it might improve the performance for some of the storages.Splitting work up between multiple WebWorkers via sharding can improve performance by utilizing the whole capacity of your users device. Here you can see the performance comparison of various RxDB storage implementations which gives a better view of real world performance: ","version":"Next","tagName":"h2"},{"title":"Future Improvements​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#future-improvements","content":" You are reading this in 2024, but the web does not stand still. There is a good chance that browser get enhanced to allow faster and better data operations. Currently there is no way to directly access a persistent storage from inside a WebAssembly process. If this changes in the future, running SQLite (or a similar database) in a browser might be the best option.Sending data between the main thread and a WebWorker is slow but might be improved in the future. There is a good article about why postMessage() is slow.IndexedDB lately got support for storage buckets (chrome only) which might improve performance. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#follow-up","content":" Share my announcement tweet -->Reproduce the benchmarks at the github repoLearn how to use RxDB with the RxDB QuickstartCheck out the RxDB github repo and leave a star ⭐ ","version":"Next","tagName":"h2"},{"title":"RxDB – The Ultimate Offline Database with Sync and Encryption","type":0,"sectionRef":"#","url":"/articles/offline-database.html","content":"","keywords":"","version":"Next"},{"title":"Why Choose an Offline Database?​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#why-choose-an-offline-database","content":" Offline-first or local-first software stores data directly on the client device. This strategy isn’t just about surviving network outages; it also makes your application faster, more user-friendly, and better at handling multiple usage scenarios. ","version":"Next","tagName":"h2"},{"title":"1. Zero Loading Spinners​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#1-zero-loading-spinners","content":" Applications that call remote servers for every request inevitably show loading spinners. With an offline database, read and write operations happen locally—providing near-instant feedback. Users no longer stare at progress indicators or wait for server responses, resulting in a smoother and more fluid experience. ","version":"Next","tagName":"h3"},{"title":"2. Multi-Tab Consistency​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#2-multi-tab-consistency","content":" Many websites mishandle data across multiple browser tabs. In an offline database, all tabs share the same local datastore. If the user updates data in one tab (like completing a to-do item), changes instantly reflect in every other tab. This removes complex multi-window synchronization problems. ","version":"Next","tagName":"h3"},{"title":"3. Real-Time Data Feeds​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#3-real-time-data-feeds","content":" Apps that rely on a purely server-driven approach often show stale data unless they add a separate real-time push system (like websockets). Local-first solutions with built-in replication essentially get real-time updates “for free.” Once the server sends any changes, your local offline database updates—keeping your UI live and accurate. ","version":"Next","tagName":"h3"},{"title":"4. Reduced Server Load​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#4-reduced-server-load","content":" In a traditional app, every interaction triggers a request to the server, scaling up resource usage quickly as traffic grows. Offline-first setups replicate data to the client once, and subsequent local reads or writes do not stress the backend. Your server usage grows with the amount of data—rather than every user action—leading to more efficient scaling. ","version":"Next","tagName":"h3"},{"title":"5. Simpler Development: Fewer Endpoints, No Extra State Library​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#5-simpler-development-fewer-endpoints-no-extra-state-library","content":" Typical apps require numerous REST endpoints and possibly a client-side state manager (like Redux) to handle data flow. If you adopt an offline database, you can replicate nearly everything to the client. The local DB becomes your single source of truth, and you may skip advanced state libraries altogether. ","version":"Next","tagName":"h3"},{"title":"Introducing RxDB – A Powerful Offline Database Solution​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#introducing-rxdb--a-powerful-offline-database-solution","content":" RxDB (Reactive Database) is a NoSQL JavaScript database that lives entirely in your client environment. It’s optimized for: Offline-first usageReactive queries (your UI updates in real time)Flexible replication with various backendsField-level encryption to protect sensitive data You can run RxDB in: Browsers (IndexedDB, OPFS)Mobile hybrid apps (Ionic, Capacitor)Native modules (React Native)Desktop environments (Electron)Node.jsServers or Scripts Wherever your JavaScript executes, RxDB can serve as a robust offline database. ","version":"Next","tagName":"h2"},{"title":"Quick Setup Example​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#quick-setup-example","content":" Below is a short demo of how to create an RxDB database, add a collection, and observe a query. You can expand upon this to enable encryption or full sync. import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; async function initDB() { // Create a local offline database const db = await createRxDatabase({ name: 'myOfflineDB', storage: getRxStorageLocalstorage() }); // Add collections await db.addCollections({ tasks: { schema: { title: 'tasks schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string' }, title: { type: 'string' }, done: { type: 'boolean' } } } } }); // Observe changes in real time db.tasks .find({ selector: { done: false } }) .$ // returns an observable that emits whenever the result set changes .subscribe(undoneTasks => { console.log('Currently undone tasks:', undoneTasks); }); return db; } Now the tasks collection is ready to store data offline. You could also replicate it to a backend, encrypt certain fields, or utilize more advanced features like conflict resolution. ","version":"Next","tagName":"h2"},{"title":"How Offline Sync Works in RxDB​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#how-offline-sync-works-in-rxdb","content":" RxDB uses a Sync Engine that pushes local changes to the server and pulls remote updates back down. This ensures local data is always fresh and that the server has the latest offline edits once the device reconnects. Multiple Plugins exist to handle various backends or replication methods: CouchDB or PouchDBGoogle FirestoreGraphQL endpointsREST / HTTPWebSocket or WebRTC (for peer-to-peer sync) You pick the plugin that fits your stack, and RxDB handles everything from conflict detection to event emission, allowing you to focus on building your user-facing features. import { replicateRxCollection } from 'rxdb/plugins/replication'; replicateRxCollection({ collection: db.tasks, replicationIdentifier: 'tasks-sync', pull: { /* fetch updates from server */ }, push: { /* send local writes to server */ }, live: true // keep them in sync constantly }); ","version":"Next","tagName":"h2"},{"title":"Securing Your Offline Database with Encryption​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#securing-your-offline-database-with-encryption","content":" Local data can be a risk if it’s sensitive or personal. RxDB offers encryption plugins to keep specific document fields secure at rest. Encryption Example​ import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; async function initSecureDB() { // Wrap the storage with crypto-js encryption const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ storage: getRxStorageLocalstorage() }); // Create database with a password const db = await createRxDatabase({ name: 'secureOfflineDB', storage: encryptedStorage, password: 'myTopSecretPassword' }); // Define an encrypted collection await db.addCollections({ userSecrets: { schema: { title: 'encrypted user data', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string' }, secretData: { type: 'string' } }, required: ['id'], encrypted: ['secretData'] // field is encrypted at rest } } }); return db; } When the device is off or the database file is extracted, secretData remains unreadable without the specified password. This ensures only authorized parties can access sensitive fields, even in offline scenarios. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#follow-up","content":" Integrating an offline database approach into your app delivers near-instant interactions, true multi-tab data consistency, automatic real-time updates, and reduced server dependencies. By choosing RxDB, you gain: Offline-first local storageFlexible replication to various backendsEncryption of sensitive fieldsReactive queries for real-time UI updates RxDB transforms how you build and scale apps—no more loading spinners, no more stale data, no more complicated offline handling. Everything is local, synced, and secured. Continue your learning path: Explore the RxDB EcosystemDive into additional features like Compression or advanced Conflict Handling to optimize your offline database. Learn More About Offline-FirstRead our Offline First documentation for a deeper understanding of why local-first architectures improve user experience and reduce server load. Join the CommunityHave questions or feedback? Connect with us on the RxDB Chat or open an issue on GitHub. Upgrade to PremiumIf you need high-performance features—like SQLite storage for mobile or the Web Crypto-based encryption plugin—consider our premium offerings. By adopting an offline database approach with RxDB, you unlock speed, reliability, and security for your applications—leading to a truly seamless user experience. ","version":"Next","tagName":"h2"},{"title":"Building an Optimistic UI with RxDB","type":0,"sectionRef":"#","url":"/articles/optimistic-ui.html","content":"","keywords":"","version":"Next"},{"title":"Benefits of an Optimistic UI​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#benefits-of-an-optimistic-ui","content":" Optimistic UIs offer a host of advantages, from improving the user experience to streamlining the underlying infrastructure. Below are some key reasons why an optimistic approach can revolutionize your application's performance and scalability. ","version":"Next","tagName":"h2"},{"title":"Better User Experience with Optimistic UI​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#better-user-experience-with-optimistic-ui","content":" No loading spinners, near-zero latency: Users perceive their actions as instant. Any actual network delays or slow server operations can be handled behind the scenes.Offline capability: Optimistic UI pairs perfectly with offline-first apps. Users can continue to interact with the application even when offline, and changes will be synced automatically once the network is available again. ","version":"Next","tagName":"h3"},{"title":"Better Scaling and Easier to Implement​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#better-scaling-and-easier-to-implement","content":" Fewer server endpoints: Instead of sending a separate HTTP request for every single user interaction, you can batch updates and sync them in bulk.Less server load: By handling changes locally and syncing in batches, you reduce the volume of server round-trips.Automated error handling: If a request fails or a document is in conflict, RxDB's replication mechanism can seamlessly retry and resolve conflicts in the background, without requiring a separate endpoint or manual user intervention. ","version":"Next","tagName":"h3"},{"title":"Building Optimistic UI Apps with RxDB​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#building-optimistic-ui-apps-with-rxdb","content":" Now that we know what an optimistic UI is, lets build one with RxDB. ","version":"Next","tagName":"h2"},{"title":"Local Database: The Backbone of an Optimistic UI​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#local-database-the-backbone-of-an-optimistic-ui","content":" A local database is the heart of an Optimistic UI. With RxDB, all application state is stored locally, ensuring seamless and instant updates. You can choose from multiple storage backends based on your runtime - check out RxDB Storage Options to see which engines (IndexedDB, SQLite, or custom) suit your environment best. Instant Writes: When users perform an action (like clicking a button or submitting a form), the changes are written directly to the local RxDB database. This immediate local write makes the UI feel snappy and removes the dependency on instantaneous server responses. Offline-First: Because data is managed locally, your app continues to operate smoothly even without an internet connection. Users can view, create, and update data at any time, assured that changes will sync automatically once they're back online. ","version":"Next","tagName":"h3"},{"title":"Real-Time UI Changes on Updates​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#real-time-ui-changes-on-updates","content":" RxDB's core is built around observables that react to any state changes - whether from local writes or incoming replication from the server. Automatic UI refresh: Any query or document subscription in RxDB automatically notifies your UI layer when data changes. There's no need to manually poll or refetch.Cross-tab updates: If you have the same RxDB database open in multiple browser tabs, changes in one tab instantly propagate to the others. Event-Reduce Algorithm: Under the hood, RxDB uses the event-reduce algorithm to minimize overhead. Instead of re-running expensive queries, RxDB calculates the smallest possible updates needed to keep query results accurate - further boosting real-time performance. ","version":"Next","tagName":"h3"},{"title":"Replication with a Server​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#replication-with-a-server","content":" While local storage is key to an Optimistic UI, most applications ultimately need to sync with a remote back end. RxDB offers a powerful replication system that can sync your local data with virtually any server/database in the background: Incremental and real-time: RxDB continuously pushes local changes to the server when a network is available and fetches server updates as they happen.Conflict resolution: If changes happen offline or multiple clients update the same data, RxDB detects conflicts and makes it straightforward to resolve them.Flexible transport: Beyond simple HTTP polling, you can incorporate WebSockets, Server-Sent Events (SSE), or other protocols for instant, server-confirmed changes broadcast to all connected clients. See this guide to learn more. By combining local-first data handling with real-time synchronization, RxDB delivers most of what an Optimistic UI needs - right out of the box. The result is a seamless user experience where interactions never feel blocked by slow networks, and any conflicts or final validations are quietly handled in the background. Handling Offline Changes and Conflicts​ Offline-first approach: All writes are initially stored in the local database. When connectivity returns, RxDB's replication automatically pushes changes to the server.Conflict resolution: If multiple clients edit the same documents while offline, conflicts are automatically detected and can be resolved gracefully (more on conflicts below). WebSockets, SSE, or Beyond​ For truly real-time communication - where server-confirmed changes instantly reach all clients - you can go beyond simple HTTP polling. Use WebSockets, Server-Sent Events (SSE), or other streaming protocols to broadcast updates the moment they occur. This pattern excels in scenarios like chats, collaborative editors, or dynamic dashboards. To learn more about these protocols and their integration with RxDB, check out this guide. ","version":"Next","tagName":"h3"},{"title":"Optimistic UI in Various Frameworks​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#optimistic-ui-in-various-frameworks","content":" ","version":"Next","tagName":"h2"},{"title":"Angular Example​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#angular-example","content":" Angular's async pipe works smoothly with RxDB's observables. Suppose you have a myCollection of documents, you can directly subscribe in the template: <ul *ngIf="(myCollection.find().$ | async) as docs"> <li *ngFor="let doc of docs"> {{ doc.name }} </li> </ul> This snippet: Subscribes to myCollection.find().$, which emits live updates whenever documents in the collection change.Passes the emitted array of documents into docs.Renders each document in a list item, instantly reflecting any changes. ","version":"Next","tagName":"h3"},{"title":"React Example​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#react-example","content":" In React, you can utilize signals or other state management tools. For instance, if we have an RxDB extension that exposes a signal: import React from 'react'; function MyComponent({ myCollection }) { // .find().$$ provides a signal that updates whenever data changes const docsSignal = myCollection.find().$$; return ( <ul> {docs.map((doc) => ( <li key={doc.id}>{doc.name}</li> ))} </ul> ); } export default MyComponent; When you call docsSignal.value or use a hook like useSignal, it pulls the latest value from the RxDB query. Whenever the collection updates, the signal emits the new data, and React re-renders the component instantly. ","version":"Next","tagName":"h3"},{"title":"Downsides of Optimistic UI Apps​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#downsides-of-optimistic-ui-apps","content":" While Optimistic UIs feel snappy, there are some caveats: Conflict Resolution: With an optimistic approach, multiple offline devices might edit the same data. When syncing back, conflicts occur that must be merged. RxDB uses revisions to detect and handle these conflicts. User Confusion: Users may see changes that haven't yet been confirmed by the server. If a subsequent server validation fails, the UI must revert to a previous state. Clear visual feedback or user notifications help reduce confusion. Server Compatibility: The server must be capable of storing and returning revision metadata (for instance, a timestamp or versioning system). Check out RxDB's replication docs for details on how to structure your back end. Storage Limits: Storing data in the client has practical size limits. IndexedDB or other client-side storages have constraints (though usually quite large). See storage comparisons. ","version":"Next","tagName":"h2"},{"title":"Conflict Resolution Strategies​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#conflict-resolution-strategies","content":" Last Write to Server Wins: A simplest-possible method: whatever update reaches the server last overrides previous data. Good for non-critical data like “like" counts or ephemeral states.Revision-Based Merges: Use revision numbers or timestamps to track concurrent edits. Merge them intelligently by combining fields or choosing the latest sub-document changes. This is ideal for collaborative apps where you don't want to overwrite entire records.User Prompts: In certain workflows (e.g., shipping forms, e-commerce checkout), you may need to notify the user about conflicts and let them choose which version to keep.First Write to Server Wins (RxDB Default): RxDB's default approach is to let the first successful push define the latest version. Any incoming push with an outdated revision triggers a conflict that must be resolved on the client side. Learn more at here. ","version":"Next","tagName":"h2"},{"title":"When (and When Not) to Use Optimistic UI​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#when-and-when-not-to-use-optimistic-ui","content":" When to Use Real-time interactions like chat apps, social feeds, or “Likes." Situations where high success rates of operations are expected (most writes don't fail).Apps that need an offline-first approach or handle intermittent connectivity gracefully. When Not to Use Large, complex transactions with high failure rates.Scenarios requiring heavy server validations or approvals (for example, financial transactions with complex rules).Workflows where immediate feedback could mislead users about an operation's success probability. Assessing Risk Consider the likelihood that a user's action might fail. If it's very low, optimistic UI is often best.If frequent failures or complex validations occur, consider a hybrid approach: partial optimistic updates for some actions, while more critical operations rely on immediate server confirmation. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#follow-up","content":" Ready to start building your own Optimistic UI with RxDB? Here are some next steps: Do the RxDB QuickstartIf you're brand new to RxDB, the quickstart guide will walk you through installation and setting up your first project. Check Out the Demo AppA live RxDB Quickstart Demo showcases optimistic updates and real-time syncing. Explore the code to see how it works. Star the GitHub RepoShow your support for RxDB by starring the RxDB GitHub Repository. By combining RxDB's powerful offline-first capabilities with the principles of an Optimistic UI, you can deliver snappy, near-instant user interactions that keep your users engaged - no matter the network conditions. Get started today and give your users the experience they deserve! ","version":"Next","tagName":"h2"},{"title":"RxDB as a Database for Progressive Web Apps (PWA)","type":0,"sectionRef":"#","url":"/articles/progressive-web-app-database.html","content":"","keywords":"","version":"Next"},{"title":"What is a Progressive Web App​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#what-is-a-progressive-web-app","content":" Progressive Web Apps are the future of web development, seamlessly combining the best of both web and mobile app worlds. They can be easily installed on the user's home screen, function offline, and load at lightning speed. Unlike hybrid apps, PWAs offer a consistent user experience across platforms, making them a versatile choice for modern applications. PWAs bring a plethora of advantages to the table. They eliminate the hassle of app store installations and updates, reduce dependency on network connectivity, and prioritize fast loading times. By harnessing the power of service workers and intelligent caching mechanisms, PWAs ensure users can access content even in offline mode. Furthermore, PWAs are device-agnostic, seamlessly adapting to various devices, from desktops to smartphones. ","version":"Next","tagName":"h2"},{"title":"Introducing RxDB as a Client-Side Database for PWAs​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#introducing-rxdb-as-a-client-side-database-for-pwas","content":" At the heart of PWAs lies efficient data management, and RxDB steps in as a reliable ally. As a client-side NoSQL database, RxDB seamlessly integrates into web applications, offering real-time data synchronization and manipulation capabilities. This article sheds light on the transformative potential of RxDB as it collaborates harmoniously with PWAs, enabling local-first strategies and elevating user interactions to a whole new level. ","version":"Next","tagName":"h2"},{"title":"Getting Started with RxDB​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#getting-started-with-rxdb","content":" RxDB emerges as a reactive, schema-based NoSQL database crafted explicitly for client-side applications. Its real-time data synchronization and responsiveness align seamlessly with the dynamic demands of modern PWAs. Local-First Approach​ The cornerstone of RxDB's philosophy is the local-first approach, empowering PWAs to prioritize data storage and manipulation on the client side. This paradigm ensures that PWAs remain functional even when offline, allowing users to access and interact with data seamlessly. RxDB bridges any gaps in data synchronization once network connectivity is restored. Observable Queries​ Observable queries (aka Live-Queries) serve as the engine of RxDB's dynamic capabilities. By leveraging these queries, PWAs can monitor and respond to data changes in real time. The result is an engaging user interface with instantaneous updates that captivate users and keep them engaged. await db.heroes.find({ selector: { healthpoints: { $gt: 0 } } }) .$ // the $ returns an observable that emits each time the result set of the query changes .subscribe(aliveHeroes => console.dir(aliveHeroes)); Multi-Tab Support​ RxDB extends its prowess to multi-tab scenarios, guaranteeing data consistency across different tabs or windows of the same PWA. This feature promotes a seamless transition between various sections of the application, while minimizing data conflicts. ","version":"Next","tagName":"h3"},{"title":"Using RxDB in a Progressive Web App​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#using-rxdb-in-a-progressive-web-app","content":" Integrating RxDB into a Progressive Web App, driven by technologies like React, is a straightforward process. By configuring RxDB and installing the necessary packages, developers establish a solid foundation for robust data management within their PWA. ","version":"Next","tagName":"h3"},{"title":"Exploring Different RxStorage Layers​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#exploring-different-rxstorage-layers","content":" RxDB caters to diverse needs through its various RxStorage layers: localstorage RxStorage: Leveraging the capabilities of the browsers localstorage API for storage.IndexedDB RxStorage: Tapping into the browser's IndexedDB for efficient data storage.OPFS RxStorage: Interfacing with the Offline-First Persistence System for seamless persistence.Memory RxStorage: Storing data in memory, ideal for temporary data requirements. This flexibility empowers developers to optimize data storage based on the unique needs of their PWA. Synchronizing Data with RxDB between PWA Clients and Servers To facilitate seamless data synchronization between PWA clients and servers, RxDB offers a range of replication options: RxDB Replication Algorithm: RxDB introduces its own replication algorithm, enabling efficient and reliable data synchronization between clients and servers. CouchDB Replication: Leveraging its roots in CouchDB, RxDB facilitates smooth data replication between clients and CouchDB servers, ensuring data consistency and synchronization across devices. Firestore Replication: RxDB synchronizes data with Google Firestore, a real-time cloud-hosted NoSQL database. This integration guarantees up-to-date data across different instances of the PWA. Peer-to-Peer (P2P) via WebRTC Replication: RxDB supports P2P replication, facilitating direct data synchronization between clients without intermediaries. This decentralized approach is invaluable in scenarios where server infrastructure is limited. ","version":"Next","tagName":"h2"},{"title":"Advanced RxDB Features and Techniques​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#advanced-rxdb-features-and-techniques","content":" ","version":"Next","tagName":"h2"},{"title":"Encryption of Local Data​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#encryption-of-local-data","content":" RxDB empowers PWAs with the ability to encrypt local data, enhancing data security and safeguarding sensitive information. This feature is indispensable for applications handling user credentials, financial transactions, and other confidential data. ","version":"Next","tagName":"h3"},{"title":"Indexing and Performance Optimization​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#indexing-and-performance-optimization","content":" Performance optimization is a top priority for PWAs. RxDB addresses this concern by offering indexing options that expedite data retrieval, resulting in a snappier user interface and heightened responsiveness. ","version":"Next","tagName":"h3"},{"title":"JSON Key Compression​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#json-key-compression","content":" RxDB introduces JSON key compression, a feature that reduces storage requirements. This optimization is particularly beneficial for PWAs dealing with substantial data volumes, enhancing overall efficiency and resource utilization. ","version":"Next","tagName":"h3"},{"title":"Change Streams and Event Handling​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#change-streams-and-event-handling","content":" RxDB introduces change streams, enabling PWAs to react to data changes in real time. This capability empowers dynamic updates to the user interface, promoting interactivity and engagement. ","version":"Next","tagName":"h3"},{"title":"Conclusion​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#conclusion","content":" In the ever-evolving landscape of web application development, Progressive Web Apps continue to redefine user experiences. RxDB emerges as a pivotal player, seamlessly integrating with PWAs and enhancing their capabilities. With features like the local-first approach, observable queries, replication mechanisms, and advanced encryption, RxDB empowers developers to create responsive, offline-capable, and data-driven PWAs. As the demand for sophisticated PWAs continues to surge, RxDB remains an indispensable tool for developers aiming to push the boundaries of innovation and redefine the standards of user engagement. By embracing RxDB, developers ensure their PWAs remain at the forefront of the digital revolution, offering seamless and immersive experiences to users around the world. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#follow-up","content":" To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects.RxDB Progressive Web App in Angular Example ","version":"Next","tagName":"h2"},{"title":"RxDB as a Database for React Applications","type":0,"sectionRef":"#","url":"/articles/react-database.html","content":"","keywords":"","version":"Next"},{"title":"Introducing RxDB as a JavaScript Database​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#introducing-rxdb-as-a-javascript-database","content":" RxDB, a powerful JavaScript database, has garnered attention as an optimal solution for managing data in React applications. Built on top of the IndexedDB standard, RxDB combines the principles of reactive programming with database management. Its core features include reactive data handling, offline-first capabilities, and robust data replication. ","version":"Next","tagName":"h2"},{"title":"What is RxDB?​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#what-is-rxdb","content":" RxDB, short for Reactive Database, is an open-source JavaScript database that seamlessly integrates reactive programming with database operations. It offers a comprehensive API for performing database actions and synchronizing data across clients and servers. RxDB's underlying philosophy revolves around observables, allowing developers to reactively manage data changes and create dynamic user interfaces. ","version":"Next","tagName":"h2"},{"title":"Reactive Data Handling​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#reactive-data-handling","content":" One of RxDB's standout features is its support for reactive data handling. Traditional databases often require manual intervention for data fetching and updating, leading to complex and error-prone code. RxDB, however, automatically notifies subscribers whenever data changes occur, eliminating the need for explicit data manipulation. This reactive approach simplifies code and enhances the responsiveness of React components. ","version":"Next","tagName":"h3"},{"title":"Local-First Approach​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#local-first-approach","content":" RxDB embraces a local-first methodology, enabling applications to function seamlessly even in offline scenarios. By storing data locally, RxDB ensures that users can interact with the application and make updates regardless of internet connectivity. Once the connection is reestablished, RxDB synchronizes the local changes with the remote database, maintaining data consistency across devices. ","version":"Next","tagName":"h3"},{"title":"Data Replication​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#data-replication","content":" Data replication is a cornerstone of modern applications that require synchronization between multiple clients and servers. RxDB provides robust data replication mechanisms that facilitate real-time synchronization between different instances of the database. This ensures that changes made on one client are promptly propagated to others, contributing to a cohesive and unified user experience. ","version":"Next","tagName":"h3"},{"title":"Observable Queries​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#observable-queries","content":" RxDB extends the concept of observables beyond data changes. It introduces observable queries, allowing developers to observe the results of database queries. This feature enables automatic updates to query results whenever relevant data changes occur. Observable queries simplify state management by eliminating the need to manually trigger updates in response to changing data. await db.heroes.find({ selector: { healthpoints: { $gt: 0 } } }) .$ // the $ returns an observable that emits each time the result set of the query changes .subscribe(aliveHeroes => console.dir(aliveHeroes)); ","version":"Next","tagName":"h3"},{"title":"Multi-Tab Support​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#multi-tab-support","content":" Web applications often operate in multiple browser tabs or windows. RxDB accommodates this scenario by offering built-in multi-tab support. It ensures that data changes made in one tab are efficiently propagated to other tabs, maintaining data consistency and providing a seamless experience for users interacting with the application across different tabs. ","version":"Next","tagName":"h3"},{"title":"RxDB vs. Other React Database Options​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#rxdb-vs-other-react-database-options","content":" While considering database options for React applications, RxDB stands out due to its unique combination of reactive programming and database capabilities. Unlike traditional solutions such as IndexedDB or Web Storage, which provide basic data storage, RxDB offers a dedicated database solution with advanced features. Additionally, while state management libraries like Redux and MobX can be adapted for database use, RxDB provides an integrated solution specifically designed for handling data. ","version":"Next","tagName":"h3"},{"title":"IndexedDB in React and the Advantage of RxDB​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#indexeddb-in-react-and-the-advantage-of-rxdb","content":" Using IndexedDB directly in React can be challenging due to its low-level, callback-based API which doesn't align neatly with modern React's Promise and async/await patterns. This intricacy often leads to bulky and complex implementations for developers. Also, when used wrong, IndexedDB can have a worse performance profile then it could have. In contrast, RxDB, with the IndexedDB RxStorage and the LocalStorage RxStorage, abstracts these complexities, integrating reactive programming and providing a more streamlined experience for data management in React applications. Thus, RxDB offers a more intuitive approach, eliminating much of the manual overhead required with IndexedDB. ","version":"Next","tagName":"h3"},{"title":"Using RxDB in a React Application​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#using-rxdb-in-a-react-application","content":" The process of integrating RxDB into a React application is straightforward. Begin by installing RxDB as a dependency:npm install rxdb rxjsOnce installed, RxDB can be imported and initialized within your React components. The following code snippet illustrates a basic setup: import { createRxDatabase } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'heroesdb', // <- name storage: getRxStorageLocalstorage(), // <- RxStorage password: 'myPassword', // <- password (optional) multiInstance: true, // <- multiInstance (optional, default: true) eventReduce: true, // <- eventReduce (optional, default: false) cleanupPolicy: {} // <- custom cleanup policy (optional) }); ","version":"Next","tagName":"h3"},{"title":"Using RxDB React Hooks​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#using-rxdb-react-hooks","content":" The rxdb-hooks package provides a set of React hooks that simplify data management within components. These hooks leverage RxDB's reactivity to automatically update components when data changes occur. The following example demonstrates the usage of the useRxCollection and useRxQuery hooks to query and observe a collection: const collection = useRxCollection('characters'); const query = collection.find().where('affiliation').equals('Jedi'); const { result: characters, isFetching, fetchMore, isExhausted, } = useRxQuery(query, { pageSize: 5, pagination: 'Infinite', }); if (isFetching) { return 'Loading...'; } return ( <CharacterList> {characters.map((character, index) => ( <Character character={character} key={index} /> ))} {!isExhausted && <button onClick={fetchMore}>load more</button>} </CharacterList> ); ","version":"Next","tagName":"h3"},{"title":"Different RxStorage Layers for RxDB​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#different-rxstorage-layers-for-rxdb","content":" RxDB offers multiple storage layers, each backed by a different underlying technology. Developers can choose the storage layer that best suits their application's requirements. Some available options include: LocalStorage RxStorage: Built on top of the browsers localstorage API.IndexedDB RxStorage: The default RxDB storage layer, providing efficient data storage in modern browsers.OPFS RxStorage: Uses the Operational File System (OPFS) for storage, suitable for Electron applications.Memory RxStorage: Stores data in memory, primarily intended for testing and development purposes.SQLite RxStorage: Stores data in an SQLite database. Can be used in a browser with react by using a SQLite database that was compiled to WebAssembly. Using SQLite in react might not be the best idea, because a compiled SQLite wasm file is about one megabyte of code that has to be loaded and rendered by your users. Using native browser APIs like IndexedDB and OPFS have shown to be a more optimal database solution for browser based react apps compared to SQLite. ","version":"Next","tagName":"h3"},{"title":"Synchronizing Data with RxDB between Clients and Servers​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#synchronizing-data-with-rxdb-between-clients-and-servers","content":" The offline-first approach is a fundamental principle of RxDB's design. When dealing with client-server synchronization, RxDB ensures that changes made offline are captured and propagated to the server once connectivity is reestablished. This mechanism guarantees that data remains consistent across different client instances, even when operating in an occasionally connected environment. RxDB offers a range of replication plugins that facilitate data synchronization between clients and servers. These plugins support various synchronization strategies, such as one-way replication, two-way replication, and custom conflict resolution. Developers can select the appropriate plugin based on their application's synchronization requirements. ","version":"Next","tagName":"h3"},{"title":"Advanced RxDB Features and Techniques​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#advanced-rxdb-features-and-techniques","content":" Encryption of Local Data Security is paramount when handling sensitive user data. RxDB supports data encryption, ensuring that locally stored information remains protected from unauthorized access. This feature is particularly valuable when dealing with sensitive data in offline scenarios. ","version":"Next","tagName":"h3"},{"title":"Indexing and Performance Optimization​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#indexing-and-performance-optimization","content":" Efficient indexing is critical for achieving optimal database performance. RxDB provides mechanisms to define indexes on specific fields, enhancing query speed and reducing the computational overhead of data retrieval. ","version":"Next","tagName":"h3"},{"title":"JSON Key Compression​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#json-key-compression","content":" RxDB employs JSON key compression to reduce storage space and improve performance. This technique minimizes the memory footprint of the database, making it suitable for applications with limited resources. ","version":"Next","tagName":"h3"},{"title":"Change Streams and Event Handling​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#change-streams-and-event-handling","content":" RxDB enables developers to subscribe to change streams, which emit events whenever data changes occur. This functionality facilitates real-time event handling and provides opportunities for implementing features such as notifications and live updates. ","version":"Next","tagName":"h3"},{"title":"Conclusion​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#conclusion","content":" In the realm of React application development, efficient data management is pivotal to delivering a seamless and engaging user experience. RxDB emerges as a compelling solution, seamlessly integrating reactive programming principles with sophisticated database capabilities. By adopting RxDB, React developers can harness its powerful features, including reactive data handling, offline-first support, and real-time synchronization. With RxDB as a foundational pillar, React applications can excel in responsiveness, scalability, and data integrity. As the landscape of web development continues to evolve, RxDB remains a steadfast companion for creating robust and dynamic React applications. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#follow-up","content":" To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects.RxDB React Example at GitHub ","version":"Next","tagName":"h2"},{"title":"IndexedDB Database in React Apps - The Power of RxDB","type":0,"sectionRef":"#","url":"/articles/react-indexeddb.html","content":"","keywords":"","version":"Next"},{"title":"What is IndexedDB?​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#what-is-indexeddb","content":" IndexedDB is a low-level API for storing significant amounts of structured data in the browser. It provides a transactional database system that can store key-value pairs, complex objects, and more. This storage engine is asynchronous and supports advanced data types, making it suitable for offline storage and complex web applications. ","version":"Next","tagName":"h2"},{"title":"Why Use IndexedDB in React​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#why-use-indexeddb-in-react","content":" When building React applications, IndexedDB can play a crucial role in enhancing both performance and user experience. Here are some reasons to consider using IndexedDB: Offline-First / Local-First: By storing data locally, your application remains functional even without an internet connection.Performance: Using local data means zero latency and no loading spinners, as data doesn't need to be fetched over a network.Easier Implementation: Replicating all data to the client once is often simpler than implementing multiple endpoints for each user interaction.Scalability: Local data reduces server load because queries run on the client side, decreasing server bandwidth and processing requirements. ","version":"Next","tagName":"h2"},{"title":"Why To Not Use Plain IndexedDB​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#why-to-not-use-plain-indexeddb","content":" While IndexedDB itself is powerful, its native API comes with several drawbacks for everyday application developers: Callback-Based API: IndexedDB was designed with callbacks rather than modern Promises, making asynchronous code more cumbersome.Complexity: IndexedDB is low-level, intended for library developers rather than for app developers who simply want to store data.Basic Query API: Its rudimentary query capabilities limit how you can efficiently perform complex queries, whereas libraries like RxDB offer more advanced query features.TypeScript Support: Ensuring good TypeScript support with IndexedDB is challenging, especially when trying to enforce document type consistency.Lack of Observable API: IndexedDB doesn't provide an observable API out of the box. RxDB solves this by enabling you to observe query results or specific document fields.Cross-Tab Communication: Managing cross-tab updates in plain IndexedDB is difficult. RxDB handles this seamlessly-changes in one tab automatically affect observed data in others.Missing Advanced Features: Features like encryption or compression aren't built into IndexedDB, but they are available via RxDB.Limited Platform Support: IndexedDB exists only in the browser. In contrast, RxDB offers swappable storages to use the same code in React Native, Capacitor, or Electron. ","version":"Next","tagName":"h2"},{"title":"Set up RxDB in React​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#set-up-rxdb-in-react","content":" Setting up RxDB with React is straightforward. It abstracts IndexedDB complexities and adds a layer of powerful features over it. ","version":"Next","tagName":"h2"},{"title":"Installing RxDB​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#installing-rxdb","content":" First, install RxDB and RxJS from npm: npm install rxdb rxjs --save``` ","version":"Next","tagName":"h3"},{"title":"Create a Database and Collections​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#create-a-database-and-collections","content":" RxDB provides two main storage options: The free localstorage-based storageThe premium plain IndexedDB-based storage, offering faster performance Below is an example of setting up a simple RxDB database using the localstorage-based storage in a React app: import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; // create a database const db = await createRxDatabase({ name: 'heroesdb', // the name of the database storage: getRxStorageLocalstorage() }); // Define your schema const heroSchema = { title: 'hero schema', version: 0, description: 'Describes a hero in your app', primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 }, name: { type: 'string' }, power: { type: 'string' } }, required: ['id', 'name'] }; // add collections await db.addCollections({ heroes: { schema: heroSchema } }); ","version":"Next","tagName":"h3"},{"title":"CRUD Operations​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#crud-operations","content":" Once your database is initialized, you can perform all CRUD operations: // insert await db.heroes.insert({ name: 'Iron Man', power: 'Genius-level intellect' }); // bulk insert await db.heroes.bulkInsert([ { name: 'Thor', power: 'God of Thunder' }, { name: 'Hulk', power: 'Superhuman Strength' } ]); // find and findOne const heroes = await db.heroes.find().exec(); const ironMan = await db.heroes.findOne({ selector: { name: 'Iron Man' } }).exec(); // update const doc = await db.heroes.findOne({ selector: { name: 'Hulk' } }).exec(); await doc.update({ $set: { power: 'Unlimited Strength' } }); // delete const doc = await db.heroes.findOne({ selector: { name: 'Thor' } }).exec(); await doc.remove(); ","version":"Next","tagName":"h3"},{"title":"Reactive Queries and Live Updates​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#reactive-queries-and-live-updates","content":" RxDB excels in providing reactive data capabilities, ideal for real-time applications. There are two main approaches to achieving live queries with RxDB: using RxJS Observables with React Hooks or utilizing Preact Signals. ","version":"Next","tagName":"h2"},{"title":"With RxJS Observables and React Hooks​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#with-rxjs-observables-and-react-hooks","content":" RxDB integrates seamlessly with RxJS Observables, allowing you to build reactive components. Here's an example of a React component that subscribes to live data updates: import { useState, useEffect } from 'react'; function HeroList({ collection }) { const [heroes, setHeroes] = useState([]); useEffect(() => { // create an observable query const query = collection.find(); const subscription = query.$.subscribe(newHeroes => { setHeroes(newHeroes); }); return () => subscription.unsubscribe(); }, [collection]); return ( <div> <h2>Hero List</h2> <ul> {heroes.map(hero => ( <li key={hero.id}> <strong>{hero.name}</strong> - {hero.power} </li> ))} </ul> </div> ); } This component subscribes to the collection's changes, updating the UI automatically whenever the underlying data changes, even across browser tabs. ","version":"Next","tagName":"h3"},{"title":"With Preact Signals​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#with-preact-signals","content":" RxDB also supports Preact Signals for reactivity, which can be integrated into React applications. Preact Signals offer a modern, fine-grained reactivity model. First, install the necessary package: npm install @preact/signals-core --save Set up RxDB with Preact Signals reactivity: import { PreactSignalsRxReactivityFactory } from 'rxdb/plugins/reactivity-preact-signals'; import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const database = await createRxDatabase({ name: 'mydb', storage: getRxStorageLocalstorage(), reactivity: PreactSignalsRxReactivityFactory }); Now, you can obtain signals directly from RxDB queries using the double-dollar sign ($$): function HeroList({ collection }) { const heroes = collection.find().$$; return ( <ul> {heroes.map(hero => ( <li key={hero.id}>{hero.name}</li> ))} </ul> ); } This approach provides automatic updates whenever the data changes, without needing to manage subscriptions manually. ","version":"Next","tagName":"h3"},{"title":"React IndexedDB Example with RxDB​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#react-indexeddb-example-with-rxdb","content":" A comprehensive example of using RxDB within a React application can be found in the RxDB GitHub repository. This repository contains sample applications, showcasing best practices and demonstrating how to integrate RxDB for various use cases. ","version":"Next","tagName":"h2"},{"title":"Advanced RxDB Features​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#advanced-rxdb-features","content":" RxDB offers many advanced features that extend beyond basic data storage: RxDB Replication: Synchronize local data with remote databases seamlessly. Learn more: RxDB ReplicationData Migration: Handle schema changes gracefully with automatic data migrations. See: Data migrationEncryption: Secure your data with built-in encryption capabilities. Explore: EncryptionCompression: Optimize storage using key compression. Details: Compression ","version":"Next","tagName":"h2"},{"title":"Limitations of IndexedDB​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#limitations-of-indexeddb","content":" While IndexedDB is powerful, it has some inherent limitations: Performance: IndexedDB can be slow under certain conditions. Read more: Slow IndexedDBStorage Limits: Browsers impose limits on how much data can be stored. See: Browser storage limits ","version":"Next","tagName":"h2"},{"title":"Alternatives to IndexedDB​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#alternatives-to-indexeddb","content":" Depending on your application's requirements, there are alternative storage solutions to consider: Origin Private File System (OPFS): A newer API that can offer better performance. RxDB supports OPFS as well. More info: RxDB OPFS StorageSQLite: Ideal for React applications on Capacitor or Ionic, offering native performance. Explore: RxDB SQLite Storage ","version":"Next","tagName":"h2"},{"title":"Performance comparison with other browser storages​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#performance-comparison-with-other-browser-storages","content":" Here is a performance overview of the various browser based storage implementation of RxDB: ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#follow-up","content":" Learn how to use RxDB with the RxDB Quickstart for a guided introduction.Check out the RxDB GitHub repository and leave a star ⭐ if you find it useful. By leveraging RxDB on top of IndexedDB, you can create highly responsive, offline-capable React applications without dealing with the low-level complexities of IndexedDB directly. With reactive queries, seamless cross-tab communication, and powerful advanced features, RxDB becomes an invaluable tool in modern web development. ","version":"Next","tagName":"h2"},{"title":"React Native Encryption and Encrypted Database/Storage","type":0,"sectionRef":"#","url":"/articles/react-native-encryption.html","content":"","keywords":"","version":"Next"},{"title":"🔒 Why Encryption Matters​","type":1,"pageTitle":"React Native Encryption and Encrypted Database/Storage","url":"/articles/react-native-encryption.html#-why-encryption-matters","content":" Encryption ensures that, even if an unauthorized party obtains physical access to your device or intercepts data, they cannot read the information without the encryption key. Sensitive user data such as credentials, personal information, or financial details should always be encrypted. Proper encryption practices reduce the risk of data breaches and help your application remain compliant with regulations like GDPR or HIPAA. ","version":"Next","tagName":"h2"},{"title":"React Native Encryption Overview​","type":1,"pageTitle":"React Native Encryption and Encrypted Database/Storage","url":"/articles/react-native-encryption.html#react-native-encryption-overview","content":" React Native supports multiple ways to secure local data: Encrypted DatabasesUse databases with built-in encryption capabilities, such as SQLite with encryption layers or RxDB with its encryption plugin. Secure Storage LibrariesFor key-value data (like tokens or secrets), you can use libraries like react-native-keychain or react-native-encrypted-storage. Custom EncryptionIf you need more fine-grained control, you can integrate libraries like crypto-js or the Web Crypto API to encrypt data before storing it in a database or file. ","version":"Next","tagName":"h2"},{"title":"Setting Up Encryption in RxDB for React Native​","type":1,"pageTitle":"React Native Encryption and Encrypted Database/Storage","url":"/articles/react-native-encryption.html#setting-up-encryption-in-rxdb-for-react-native","content":" ","version":"Next","tagName":"h2"},{"title":"1. Install RxDB and Required Plugins​","type":1,"pageTitle":"React Native Encryption and Encrypted Database/Storage","url":"/articles/react-native-encryption.html#1-install-rxdb-and-required-plugins","content":" Install RxDB and the encryption plugin(s) you need. For the CryptoJS plugin: npm install rxdb npm install crypto-js ","version":"Next","tagName":"h3"},{"title":"2. Set Up Your RxDB Database with Encryption​","type":1,"pageTitle":"React Native Encryption and Encrypted Database/Storage","url":"/articles/react-native-encryption.html#2-set-up-your-rxdb-database-with-encryption","content":" RxDB offers two encryption plugins: CryptoJS Plugin: A free and straightforward solution for most basic use cases.Web Crypto Plugin: A premium plugin that utilizes the native Web Crypto API for better performance and security. Below is an example showing how to set up RxDB using the CryptoJS plugin. This example uses the in-memory storage for testing purposes. In a real production scenario, you would use a persistent storage adapter, mostly the SQLite-based storage. import { createRxDatabase } from 'rxdb'; import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; /* * For testing, we use the in-memory storage of RxDB. * In production you would use the persistent SQLite based storage instead. */ import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; async function initEncryptedDatabase() { // Wrap the normal storage with the encryption plugin const encryptedMemoryStorage = wrappedKeyEncryptionCryptoJsStorage({ storage: getRxStorageMemory() }); // Create an encrypted database const db = await createRxDatabase({ name: 'myEncryptedDatabase', storage: encryptedMemoryStorage, password: 'sudoLetMeIn' // Make sure not to hardcode in production }); // Define a schema and create a collection await db.addCollections({ secureData: { schema: { title: 'secure data schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string', maxLength: 100 }, normalField: { type: 'string' }, secretField: { type: 'string' } }, required: ['id', 'normalField', 'secretField'] } } }); return db; } ","version":"Next","tagName":"h3"},{"title":"3. Inserting and Querying Encrypted Data​","type":1,"pageTitle":"React Native Encryption and Encrypted Database/Storage","url":"/articles/react-native-encryption.html#3-inserting-and-querying-encrypted-data","content":" Once you've set up the database with encryption, data in fields specified by your schema will be encrypted automatically before it is stored, and decrypted when queried. (async () => { const db = await initEncryptedDatabase(); // Insert encrypted data const doc = await db.secureData.insert({ id: 'mySecretId', normalField: 'foobar', secretField: 'This is top secret data' }); // Query encrypted data by its primary key or non-encrypted fields const fetchedDoc = await db.secureData.findOne({ selector: { normalField: 'foobar' } }).exec(true); console.log(fetchedDoc.secretField); // 'This is top secret data' // Update data await fetchedDoc.patch({ secretField: 'Updated secret data' }); })(); Note: You can only query directly by non-encrypted fields or primary keys. Encrypted fields cannot be used in queries because they are stored as ciphertext in the database. A common approach is to have a small subset of fields that need to be queried unencrypted while storing any sensitive data in encrypted fields. ","version":"Next","tagName":"h3"},{"title":"Best Practices for React Native Encryption​","type":1,"pageTitle":"React Native Encryption and Encrypted Database/Storage","url":"/articles/react-native-encryption.html#best-practices-for-react-native-encryption","content":" Secure Password Handling Avoid hardcoding passwords or encryption keys.Use secure storage solutions like React Native Keychain or react-native-encrypted-storage to fetch the database password at runtime: // Example: using react-native-keychain to securely retrieve a stored password import * as Keychain from 'react-native-keychain'; async function getDatabasePassword() { const credentials = await Keychain.getGenericPassword(); if (credentials) { return credentials.password; } throw new Error('No password stored in Keychain'); } Encrypt Attachments: If you need to store files (images, text files, etc.), consider encrypting attachments. RxDB supports attachments that can be encrypted automatically, ensuring your files are protected: import { createBlob } from 'rxdb/plugins/core'; const doc = await await db.secureData.findOne({ selector: { normalField: 'foobar' } }).exec(true); const attachment = await doc.putAttachment({ id: 'encryptedFile.txt', data: createBlob('Sensitive content', 'text/plain'), type: 'text/plain', }); Optimize Performance If performance is critical, consider using the premium Web Crypto plugin, which leverages native APIs for faster encryption and decryption.If big chunks of data are encrypted, store them in attachments instead of document fields. Attachments will only be decrypted on explicit fetches, not during queries. Use DevMode in Development: RxDB's DevMode Plugin can help validate your schema and encryption setup during development. Disable it in production for performance reasons. Secure Communication: Use HTTPS to secure network communication between the app and any backend services.If you're synchronizing data to a server, ensure the data is also encrypted in transit. RxDB's replication plugins can work with secure endpoints to keep data consistent. SSL Pinning: Consider SSL Pinning if you want to prevent man-in-the-middle attacks. SSL Pinning ensures the device trusts only the pinned certificate, preventing attackers from swapping out valid certificates with their own. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"React Native Encryption and Encrypted Database/Storage","url":"/articles/react-native-encryption.html#follow-up","content":" Learn how to use RxDB with the RxDB Quickstart for a guided introduction.A good way to learn using RxDB database with React Native is to check out the RxDB React Native example and use that as a tutorial.Check out the RxDB GitHub repository and leave a star ⭐ if you find it useful.Learn more about the RxDB encryption plugins. By following these best practices and leveraging RxDB's powerful encryption plugins, you can build secure, performant, and robust React Native applications that keep your users' data safe. ","version":"Next","tagName":"h2"},{"title":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","type":0,"sectionRef":"#","url":"/articles/reactjs-storage.html","content":"","keywords":"","version":"Next"},{"title":"Part 1: Storing Data in ReactJS with LocalStorage​","type":1,"pageTitle":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","url":"/articles/reactjs-storage.html#part-1-storing-data-in-reactjs-with-localstorage","content":" localStorage is a built-in browser API for storing key-value pairs in the user’s browser. It’s straightforward to set and get items—ideal for trivial preferences or small usage data. import React, { useState, useEffect } from 'react'; function LocalStorageExample() { const [username, setUsername] = useState(() => { const saved = localStorage.getItem('username'); return saved ? JSON.parse(saved) : ''; }); useEffect(() => { localStorage.setItem('username', JSON.stringify(username)); }, [username]); return ( <div> <h2>ReactJS LocalStorage Demo</h2> <input type="text" value={username} onChange={e => setUsername(e.target.value)} placeholder="Enter your username" /> <p>Stored: {username}</p> </div> ); } export default LocalStorageExample; Pros of localStorage in ReactJS: Easy to implement quickly for minimal dataBuilt-in to the browser—no extra libsPersistent across sessions Downsides of localStorageWhile localStorage is convenient for small amounts of data, it has certain limitations: Synchronous: Reading or writing localStorage can block the main thread if data is large.No advanced queries: You only store stringified objects by a single key. Searching or filtering requires manually scanning everything.No concurrency or offline logic: If multiple tabs or users need to manipulate the same data, localStorage doesn’t handle concurrency or sync with a server.No indexing: You can’t perform partial lookups or advanced matching. For “remember user preference” use cases, localStorage is excellent. But if your app grows complex—needing structured data, large data sets, or offline-first features—you might quickly surpass localStorage’s utility. ","version":"Next","tagName":"h2"},{"title":"Part 2: LocalStorage vs. IndexedDB​","type":1,"pageTitle":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","url":"/articles/reactjs-storage.html#part-2-localstorage-vs-indexeddb","content":" While localStorage is simple, it’s limited to string-based key-value lookups and can be synchronous for all reads/writes. For more robust ReactJS storage needs, browsers also provide IndexedDB—a low-level, asynchronous API that can store larger amounts of JSON data with indexing. LocalStorage: Good for small amounts of data (like user settings or flags)String-only storageSingle key-value access, no searching by subfields IndexedDB: Stores large JSON objects, able to index by multiple fieldsAsynchronous and usually more scalableMore complicated to use directly (i.e., not as simple as .getItem())RxDB, as you’ll see, simplifies IndexedDB usage in ReactJS by adding a more intuitive layer for queries, reactivity, and advanced capabilities like encryption. ","version":"Next","tagName":"h2"},{"title":"Part 3: Moving Beyond Basic Storage: RxDB for ReactJS​","type":1,"pageTitle":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","url":"/articles/reactjs-storage.html#part-3-moving-beyond-basic-storage-rxdb-for-reactjs","content":" When data shapes get complex—large sets of nested documents, or you want offline sync to a server—RxDB can transform your approach to ReactJS storage. It stores documents in (usually) IndexedDB or alternative backends but offers a reactive, NoSQL-based interface. ","version":"Next","tagName":"h2"},{"title":"RxDB Quick Example (Observables)​","type":1,"pageTitle":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","url":"/articles/reactjs-storage.html#rxdb-quick-example-observables","content":" import { createRxDatabase } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; (async function setUpRxDB() { const db = await createRxDatabase({ name: 'heroDB', storage: getRxStorageLocalstorage(), multiInstance: false }); const heroSchema = { title: 'hero schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string' }, name: { type: 'string' }, power: { type: 'string' } }, required: ['id', 'name'] }; await db.addCollections({ heroes: { schema: heroSchema } }); // Insert a doc await db.heroes.insert({ id: '1', name: 'AlphaHero', power: 'Lightning' }); // Query docs once const allHeroes = await db.heroes.find().exec(); console.log('Heroes: ', allHeroes); })(); Reactive Queries: In a React component, you can subscribe to a query via RxDB’s $ property, letting your UI automatically update when data changes. React components can subscribe to updates from .find() queries, letting the UI automatically reflect changes—perfect for dynamic offline-first apps. import React, { useEffect, useState } from 'react'; function HeroList({ collection }) { const [heroes, setHeroes] = useState([]); useEffect(() => { const query = collection.find(); // query.$ is an RxJS Observable that emits whenever data changes const sub = query.$.subscribe(newHeroes => { setHeroes(newHeroes); }); return () => sub.unsubscribe(); // clean up subscription }, [collection]); return ( <ul> {heroes.map(hero => ( <li key={hero.id}> {hero.name} - Power: {hero.power} </li> ))} </ul> ); } export default HeroList; By using these reactive queries, your React app knows exactly when data changes locally (or from another browser tab) or from remote sync, keeping your UI in sync effortlessly. ","version":"Next","tagName":"h3"},{"title":"Part 4: Using Preact Signals Instead of Observables​","type":1,"pageTitle":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","url":"/articles/reactjs-storage.html#part-4-using-preact-signals-instead-of-observables","content":" RxDB typically exposes reactivity via RxJS observables. However, some developers prefer newer reactivity approaches like Preact Signals. RxDB supports them via a special plugin or advanced usage: import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; import { PreactSignalsRxReactivityFactory } from 'rxdb/plugins/reactivity-preact-signals'; (async function setUpRxDBWithSignals() { const db = await createRxDatabase({ name: 'heroDB_signals', storage: getRxStorageLocalstorage(), reactivity: PreactSignalsRxReactivityFactory }); // Create a signal-based query instead of using Observables: const collection = db.heroes; const heroesSignal = collection.find().$$; // signals version // Now you can reference heroesSignal() in Preact or React with adapter usage })(); Preact Signals rely on signals instead of Observables. Some developers find them more straightforward to adopt, especially for fine-grained reactivity. In ReactJS, you might still prefer RxJS-based subscriptions unless you add bridging code for signals. ","version":"Next","tagName":"h2"},{"title":"Part 5: Encrypting the Storage with RxDB​","type":1,"pageTitle":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","url":"/articles/reactjs-storage.html#part-5-encrypting-the-storage-with-rxdb","content":" For more advanced ReactJS storage needs—especially when sensitive user data is involved - you might want to encrypt stored documents at rest. RxDB provides a robust encryption plugin: import { createRxDatabase } from 'rxdb'; import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; (async function secureSetup() { const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ storage: getRxStorageLocalstorage() }); // Provide a password for encryption const db = await createRxDatabase({ name: 'secureReactStorage', storage: encryptedStorage, password: 'MyStrongPassword123' }); await db.addCollections({ secrets: { schema: { title: 'secret schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string' }, secretInfo: { type: 'string' } }, required: ['id'], encrypted: ['secretInfo'] // field to encrypt } } }); })(); All data in the marked encrypted fields is automatically encrypted at rest. This is crucial if you store user credentials, private messages, or other personal data in your ReactJS application storage. ","version":"Next","tagName":"h2"},{"title":"Offline Sync​","type":1,"pageTitle":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","url":"/articles/reactjs-storage.html#offline-sync","content":" If you need multi-device or multi-user data synchronization, RxDB provides replication plugins for various endpoints (HTTP, GraphQL, CouchDB, Firestore, etc.). Your local offline changes can then merge automatically with a remote database whenever internet connectivity is restored. ","version":"Next","tagName":"h2"},{"title":"Overview: localStorage vs IndexedDB vs RxDB​","type":1,"pageTitle":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","url":"/articles/reactjs-storage.html#overview-localstorage-vs-indexeddb-vs-rxdb","content":" Characteristic\tlocalStorage\tIndexedDB\tRxDBData Model\tKey-value store (only strings)\tLow-level, JSON-like storage engine with object stores and indexes\tNoSQL JSON documents with optional JSON-Schema Query Capabilities\tBasic get/set by key; manual parse for more complex searches\tIndex-based queries, but API is fairly verbose; lacks a high-level query language\tJSON-based queries, optional indexes, real-time reactivity Observability\tNone. Must re-fetch data yourself.\tNone natively. Must implement eventing or manual re-check.\tBuilt-in reactivity. UI auto-updates via Observables or Preact signals Large Data Usage\tNot recommended for large data (blocking, synchronous calls)\tBetter for large amounts of data, asynchronous reads/writes\tScales for medium to large data. Uses IndexedDB or other storages under the hood Concurrency\tMinimal. Overwrites if multiple tabs write simultaneously\tMultiple tabs can open the same DB, but must handle concurrency logic carefully\tMulti-instance concurrency with built-in conflict resolution plugins if needed Offline Sync\tNone. Purely local.\tNone out of the box. Must be implemented manually\tBuilt-in replication to remote endpoints (HTTP, GraphQL, CouchDB, etc.) for offline-first usage Encryption\tNot supported natively\tNot supported natively; must encrypt data manually before storing\tEncryption plugins available. Supports field-level encryption at rest Usage\tGreat for small flags or settings ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","url":"/articles/reactjs-storage.html#follow-up","content":" If you’re looking to dive deeper into ReactJS storage topics and take full advantage of RxDB’s offline-first, real-time capabilities, here are some recommended resources: RxDB Official Documentation Explore detailed guides on setting up storage adapters, defining JSON schemas, handling conflicts, and enabling offline synchronization. RxDB Quickstart Get a step-by-step tutorial to create your first RxDB-based application in minutes. RxDB GitHub Repository See the source code, open issues, and browse community-driven examples that integrate ReactJS, Preact Signals, and advanced features like encryption. RxDB Encryption Plugins Learn how to encrypt fields in your collections, protecting user data and meeting compliance requirements. Preact Signals React Integration (Example) If you want to combine React with signals-based reactivity, check out example code and bridging approaches. MDN: Using the Web Storage API Refresh on localStorage basics, including best practices for small key-value data in traditional React apps. With these follow-up steps, you can refine your reactjs storage strategy to meet your app’s unique needs, whether it’s simple user preferences or robust offline data syncing. ","version":"Next","tagName":"h2"},{"title":"What is a realtime database?","type":0,"sectionRef":"#","url":"/articles/realtime-database.html","content":"","keywords":"","version":"Next"},{"title":"Realtime as in realtime computing​","type":1,"pageTitle":"What is a realtime database?","url":"/articles/realtime-database.html#realtime-as-in-realtime-computing","content":" When "normal" developers hear the word "realtime", they think of Real-time computing (RTC). Real-time computing is a type of computer processing that guarantees specific response times for tasks or events, crucial in applications like industrial control, automotive systems, and aerospace. It relies on specialized operating systems (RTOS) to ensure predictability and low latency. Hard real-time systems must never miss deadlines, while soft real-time systems can tolerate occasional delays. Real-time responses are often understood to be in the order of milliseconds, and sometimes microseconds. Consider the role of real-time computing in car airbags: sensors detect collision force, swiftly process the data, and immediately decide to deploy the airbags within milliseconds. Such rapid action is imperative for safeguarding passengers. Hence, the controlling chip must guarantee a certain response time - it must operate in "realtime". But when people talk about realtime databases, especially in the web-development world, they almost never mean realtime, as in realtime computing, they mean something else. In fact, with any programming language that run on end users devices, it is not even possible to built a "real" realtime database. A program, like a JavaScript (browser or Node.js) process, can be halted by the operating systems task manager at any time and therefore it will never be able to guarantee specific response times. To build a realtime computing database, you would need a realtime capable operating system. ","version":"Next","tagName":"h2"},{"title":"Real time Database as in realtime replication​","type":1,"pageTitle":"What is a realtime database?","url":"/articles/realtime-database.html#real-time-database-as-in-realtime-replication","content":" When talking about realtime databases, most people refer to realtime, as in realtime replication. Often they mean a very specific product which is the Firebase Realtime Database (not the Firestore). In the context of the Firebase Realtime Database, "realtime" means that data changes are synchronized and delivered to all connected clients or devices as soon as they occur, typically within milliseconds. This means that when any client updates, adds, or removes data in the database, all other clients that are connected to the same database instance receive those updates instantly, without the need for manual polling or frequent HTTP requests. In short, when replicating data between databases, instead of polling, we use a websocket connection to live-stream all changes between the server and the clients, this is labeled as "realtime database". A similar thing can be done with RxDB and the RxDB Replication Plugins. ","version":"Next","tagName":"h2"},{"title":"Realtime as in realtime applications​","type":1,"pageTitle":"What is a realtime database?","url":"/articles/realtime-database.html#realtime-as-in-realtime-applications","content":" In the context of realtime client-side applications, "realtime" refers to the immediate or near-instantaneous processing and response to events or data inputs. When data changes, the application must directly update to reflect the new data state, without any user interaction or delay. Notice that the change to the data could have come from any source, like a user action, an operation in another browser tab, or even an operation from another device that has been replicated to the client. In contrast to push-pull based databases (e.g., MySQL or MongoDB servers), a realtime database contains features which make it easy to build realtime applications. For example with RxDB you can not only fetch query results once, but instead you can subscribe to a query and directly update the HTML dom tree whenever the query has a new result set: await db.heroes.find({ selector: { healthpoints: { $gt: 0 } } }) .$ // The $ returns an observable that emits whenever the query's result set changes. .subscribe(aliveHeroes => { // Refresh the HTML list each time there are new query results. const newContent = aliveHeroes.map(doc => '<li>' + doc.name + '</li>'); document.getElementById('#myList').innerHTML = newContent; }); // You can even subscribe to any RxDB document's fields. myDocument.firstName$.subscribe(newName => console.log('name is: ' + newName)); A competent realtime application is engineered to offer feedback or results swiftly, ideally within milliseconds to microseconds. Ideally, a data modification should be processed in under 16 milliseconds (since 1 second divided by 60 frames equals 16.66ms) to ensure users don't perceive any lag from input to visualization. RxDB utilizes the EventReduce algorithm to manage changes more swiftly than 16ms. However, it can never assure fixed response times as a "realtime computing database" would. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"What is a realtime database?","url":"/articles/realtime-database.html#follow-up","content":" Dive into the RxDB QuickstartDiscover more about the RxDB realtime Sync EngineJoin the conversation at RxDB Chat ","version":"Next","tagName":"h2"},{"title":"RxDB as a Database in a Vue Application","type":0,"sectionRef":"#","url":"/articles/vue-database.html","content":"","keywords":"","version":"Next"},{"title":"Why Vue Applications Need a Database​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#why-vue-applications-need-a-database","content":" Vue is renowned for its lightweight core and flexible architecture centered around reactive state management and reusable components. However, modern Vue applications often require: Offline Capabilities: Allowing users to continue working even without internet access.Real-Time Updates: Keeping UI data in sync with changes as they occur, whether locally or from other connected clients.Improved Performance: Reducing server round trips and leveraging local storage for faster data operations.Scalable Data Handling: Managing increasingly large datasets or complex queries right in the browser. While you can store data in Vuex/Pinia stores or via direct AJAX calls, these solutions may not suffice when your application demands a full-featured offline-first database or complex synchronization with a server. RxDB addresses these needs with a dedicated, reactive, browser-based database that pairs seamlessly with Vue's reactivity system. ","version":"Next","tagName":"h2"},{"title":"Introducing RxDB as a Database Solution​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#introducing-rxdb-as-a-database-solution","content":" RxDB - short for Reactive Database - is built on the principle of combining NoSQL database capabilities with reactive programming. It runs inside your client-side environment (browser, Node.js, or mobile devices) and provides: Real-Time Reactivity: Automatically updates subscribed components whenever data changes.Offline-First Approach: Stores data locally and syncs with the server when online connectivity is restored.Data Replication: Effortlessly keeps data synchronized across multiple tabs, devices, or server instances.Multi-Tab Support: Seamlessly propagates changes to all open tabs in the user's browser.Observable Queries: Automatically refresh the result set when documents in your queried collection change. ","version":"Next","tagName":"h2"},{"title":"RxDB vs. Other Vue Database Options​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#rxdb-vs-other-vue-database-options","content":" Compared to traditional approaches - like raw IndexedDB or local storage - RxDB adds a powerful, reactive layer that simplifies your data flow. While tools like Vuex or Pinia are great for state management, they are not fully fledged databases with features like replication, conflict resolution, and offline persistence. RxDB bridges the gap by providing an integrated data handling solution tailor-made for modern, data-intensive Vue applications. ","version":"Next","tagName":"h3"},{"title":"Getting Started with RxDB​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#getting-started-with-rxdb","content":" Let's break down the essentials for using RxDB within a Vue application. ","version":"Next","tagName":"h2"},{"title":"Installation​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#installation","content":" You can install RxDB (and RxJS, which it depends on) via npm or yarn: npm install rxdb rxjs ","version":"Next","tagName":"h3"},{"title":"Creating and Configuring Your Database​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#creating-and-configuring-your-database","content":" Within your Vue project, you can set up an RxDB instance in a dedicated file or a Vue plugin. Below is an example using Localstorage as the storage engine: // db.js import { createRxDatabase } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; export async function initDatabase() { const db = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage(), password: 'myPassword', // optional encryption password multiInstance: true, // multi-tab support eventReduce: true // optimize event handling }); await db.addCollections({ hero: { schema: { title: 'hero schema', version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string' }, name: { type: 'string' }, healthpoints: { type: 'number' } } } } }); return db; } After creating the RxDB instance, you can share it across your application (for example, by providing it in a plugin or a global property in Vue). ","version":"Next","tagName":"h2"},{"title":"Vue Reactivity and RxDB Observables​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#vue-reactivity-and-rxdb-observables","content":" RxDB queries return RxJS observables (.$). Vue can automatically update components when data changes if you manually subscribe and store results in Vue refs/reactive objects, or if you use RxDB's custom reactivity for Vue. Example with Vue 3 Composition API: // HeroList.vue <script setup> import { ref, onMounted } from 'vue'; import { initDatabase } from '@/db'; const heroes = ref([]); let db; onMounted(async () => { db = await initDatabase(); // Subscribe to an RxDB query db.hero .find({ selector: { healthpoints: { $gt: 0 } }, sort: [{ name: 'asc' }] }) .$ // the dot-$ is an observable that emits whenever the query results change .subscribe((newHeroes) => { heroes.value = newHeroes; }); }); </script> <template> <ul> <li v-for="hero in heroes" :key="hero.id"> {{ hero.name }} - HP: {{ hero.healthpoints }} </li> </ul> </template> ","version":"Next","tagName":"h2"},{"title":"Different RxStorage Layers for RxDB​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#different-rxstorage-layers-for-rxdb","content":" RxDB supports multiple storage backends - called "RxStorage layers" - giving you flexibility in how data is persisted: LocalStorage RxStorage: Uses the browsers localstorage API.IndexedDB RxStorage: Direct usage of native IndexedDB.OPFS RxStorage: Uses the File System Access API for even faster storage in modern browsers.Memory RxStorage: Stores data in memory, ideal for tests or ephemeral data.SQLite RxStorage: Runs SQLite, which can be compiled to WebAssembly for the browser. While possible, it typically carries a larger bundle size compared to native browser APIs like IndexedDB or OPFS. Choose the storage option that best aligns with your Vue application's requirements for performance, persistence, and platform compatibility. ","version":"Next","tagName":"h2"},{"title":"Synchronizing Data with RxDB between Clients and Servers​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#synchronizing-data-with-rxdb-between-clients-and-servers","content":" RxDB champions an offline-first approach: data is kept locally so that your Vue app remains usable, even without internet. When connectivity is restored, RxDB ensures your local changes synchronize to the server, resolving conflicts as necessary. Real-Time Synchronization: With RxDB's replication plugins, any local change can be instantly pushed to a remote endpoint while pulling down remote changes to ensure consistency.Conflict Resolution: In multi-user scenarios, conflicts may arise if two clients update the same document simultaneously. RxDB provides hooks to handle and resolve these gracefully.Scalable Architecture: By reducing reliance on continuous server requests, you can lighten server load and deliver a more responsive user experience. ","version":"Next","tagName":"h2"},{"title":"Advanced RxDB Features and Techniques​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#advanced-rxdb-features-and-techniques","content":" ","version":"Next","tagName":"h2"},{"title":"Offline-First Approach​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#offline-first-approach","content":" Vue applications can seamlessly function offline by leveraging RxDB's local database storage. The moment the network is restored, all unsynced data is pushed to the server. This capability is particularly beneficial for Progressive Web Apps (PWAs) and scenarios with spotty connectivity. ","version":"Next","tagName":"h3"},{"title":"Observable Queries and Change Streams​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#observable-queries-and-change-streams","content":" Beyond simply returning data, RxDB queries emit observables that respond to any change in the underlying documents. This real-time approach can drastically simplify state management, since updates flow directly into your Vue components without additional manual wiring. ","version":"Next","tagName":"h3"},{"title":"Encryption of Local Data​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#encryption-of-local-data","content":" For applications handling sensitive information, RxDB supports encryption of local data. Your data is stored securely in the browser, protecting it from unauthorized access. ","version":"Next","tagName":"h3"},{"title":"Indexing and Performance Optimization​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#indexing-and-performance-optimization","content":" By defining indexes on frequently searched fields, you can speed up queries and reduce overall resource usage. This is crucial for larger datasets where performance might otherwise degrade. ","version":"Next","tagName":"h3"},{"title":"JSON Key Compression​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#json-key-compression","content":" This optimization shortens field names in stored JSON documents, thereby reducing storage space and potentially improving performance for read/write operations. ","version":"Next","tagName":"h3"},{"title":"Multi-Tab Support​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#multi-tab-support","content":" If your users open multiple tabs of your Vue application, RxDB ensures data is synchronized across all instances in real time. Changes made in one tab are immediately reflected in others, creating a unified user experience. ","version":"Next","tagName":"h3"},{"title":"Best Practices for Using RxDB in Vue​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#best-practices-for-using-rxdb-in-vue","content":" Here are some recommendations to get the most out of RxDB in your Vue projects: Centralize Database Creation: Initialize and configure RxDB in a dedicated file or plugin, ensuring only one database instance is created.Leverage Vue's Composition API or a Global Store: Use watchers, refs, or a store like Pinia to neatly manage data subscriptions and updates, preventing scattered subscription logic.Async Subscriptions: Prefer using Vue's lifecycle hooks and the Composition API to manage subscriptions. Clean up subscriptions when components unmount or no longer need the data.Optimize Queries and Indexes: Only query the data you need, and define indexes to speed up lookups.Test Offline Scenarios: Make sure your offline logic works as expected by simulating network disconnections and reconnections.Plan Conflict Resolution: For multi-user apps, decide how to merge concurrent changes to prevent data inconsistencies. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#follow-up","content":" To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects.RxDB Reactivity for Vue: Discover how RxDB observables can directly produce Vue refs, simplifying integration with your Vue components.RxDB Vue Example at GitHub: Explore an official Vue example to see RxDB in action within a Vue application.RxDB Examples: Browse even more official examples to learn best practices you can apply to your own projects. ","version":"Next","tagName":"h2"},{"title":"IndexedDB Database in Vue Apps - The Power of RxDB","type":0,"sectionRef":"#","url":"/articles/vue-indexeddb.html","content":"","keywords":"","version":"Next"},{"title":"What is IndexedDB?​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#what-is-indexeddb","content":" IndexedDB is a low-level API for storing significant amounts of structured data in the browser. It provides a transactional database system that can store key-value pairs, complex objects, and more. This storage engine is asynchronous and supports advanced data types, making it suitable for offline storage and complex web applications. ","version":"Next","tagName":"h2"},{"title":"Why Use IndexedDB in Vue​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#why-use-indexeddb-in-vue","content":" When building Vue applications, IndexedDB can play a crucial role in enhancing both performance and user experience. Here are some reasons to consider using IndexedDB: Offline-First / Local-First: By storing data locally, your application remains functional even without an internet connection.Performance: Using local data means zero latency and no loading spinners, as data doesn't need to be fetched over a network.Easier Implementation: Replicating all data to the client once is often simpler than implementing multiple endpoints for each user interaction.Scalability: Local data reduces server load because queries run on the client side, decreasing server bandwidth and processing requirements. ","version":"Next","tagName":"h2"},{"title":"Why To Not Use Plain IndexedDB​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#why-to-not-use-plain-indexeddb","content":" While IndexedDB itself is powerful, its native API comes with several drawbacks for everyday application developers: Callback-Based API: IndexedDB was originally designed around callbacks rather than modern Promises, making asynchronous code more cumbersome.Complexity: IndexedDB is low-level, intended for library developers rather than for app developers who just want to store and query data easily.Basic Query API: Its rudimentary query capabilities limit how you can efficiently perform complex queries. Libraries like RxDB offer more advanced querying and indexing.TypeScript Support: Ensuring good TypeScript support with IndexedDB is challenging, especially when trying to maintain schema consistency.Lack of Observable API: IndexedDB doesn't provide an observable API out of the box, making it hard to automatically update your Vue app in real time. RxDB solves this by enabling you to observe queries or specific documents.Cross-Tab Communication: Managing cross-tab updates in plain IndexedDB is difficult. RxDB handles this seamlessly - changes in one tab automatically affect observed data in others.Missing Advanced Features: Features like encryption or compression aren't built into IndexedDB, but they are available via RxDB.Limited Platform Support: IndexedDB is browser-only. RxDB offers swappable storages so you can reuse the same data layer code in mobile or desktop environments. ","version":"Next","tagName":"h2"},{"title":"Set up RxDB in Vue​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#set-up-rxdb-in-vue","content":" Setting up RxDB with Vue is straightforward. It abstracts IndexedDB complexities and adds a layer of powerful features over it. ","version":"Next","tagName":"h2"},{"title":"Installing RxDB​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#installing-rxdb","content":" First, install RxDB (and RxJS) from npm: npm install rxdb rxjs --save ","version":"Next","tagName":"h3"},{"title":"Create a Database and Collections​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#create-a-database-and-collections","content":" RxDB provides two main storage options: The free LocalStorage-based storageThe premium plain IndexedDB-based storage, offering faster performance Below is an example of setting up a simple RxDB database using the localstorage-based storage in a Vue app: // db.ts import { createRxDatabase } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; export async function initDB() { const db = await createRxDatabase({ name: 'heroesdb', // the name of the database storage: getRxStorageLocalstorage() }); // Define your schema const heroSchema = { title: 'hero schema', version: 0, description: 'Describes a hero in your app', primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 }, name: { type: 'string' }, power: { type: 'string' } }, required: ['id', 'name'] }; // add collections await db.addCollections({ heroes: { schema: heroSchema } }); return db; } ","version":"Next","tagName":"h3"},{"title":"CRUD Operations​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#crud-operations","content":" Once your database is initialized, you can perform all CRUD operations: // insert await db.heroes.insert({ id: '1', name: 'Iron Man', power: 'Genius-level intellect' }); // bulk insert await db.heroes.bulkInsert([ { id: '2', name: 'Thor', power: 'God of Thunder' }, { id: '3', name: 'Hulk', power: 'Superhuman Strength' } ]); // find and findOne const heroes = await db.heroes.find().exec(); const ironMan = await db.heroes.findOne({ selector: { name: 'Iron Man' } }).exec(); // update const doc = await db.heroes.findOne({ selector: { name: 'Hulk' } }).exec(); await doc.update({ $set: { power: 'Unlimited Strength' } }); // delete const thorDoc = await db.heroes.findOne({ selector: { name: 'Thor' } }).exec(); await thorDoc.remove(); ","version":"Next","tagName":"h3"},{"title":"Reactive Queries and Live Updates​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#reactive-queries-and-live-updates","content":" RxDB excels in providing reactive data capabilities, ideal for real-time applications. Subscribing to queries automatically updates your Vue components when underlying data changes - even across browser tabs. ","version":"Next","tagName":"h2"},{"title":"Using RxJS Observables with Vue 3 Composition API​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#using-rxjs-observables-with-vue-3-composition-api","content":" Here's an example of a Vue component that subscribes to live data updates: <template> <div> <h2>Hero List</h2> <ul> <li v-for="hero in heroes" :key="hero.id"> <strong>{{ hero.name }}</strong> - {{ hero.power }} </li> </ul> </div> </template> <script setup lang="ts"> import { ref, onMounted } from 'vue'; import { initDB } from '@/db'; const heroes = ref<any[]>([]); onMounted(async () => { const db = await initDB(); // create an observable query const query = db.heroes.find(); // subscribe to the query query.$.subscribe((newHeroes: any[]) => { heroes.value = newHeroes; }); }); </script> This component subscribes to the collection's changes, updating the UI automatically whenever the underlying data changes in any browser tab. ","version":"Next","tagName":"h3"},{"title":"Using Vue Signals​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#using-vue-signals","content":" If you're exploring Vue's reactivity transforms or signals, RxDB also offers custom reactivity factories (premium plugins are required). This allows queries to emit data as signals instead of traditional Observables. const heroesSignal = db.heroes.find().$$; // $$ indicates a reactive result With this, in your Vue template or script, you can directly read from heroesSignal() <template> <div> <h2>Hero List</h2> <ul> <!-- we read heroesSignal.value which is always up to date --> <li v-for="hero in heroesSignal.value" :key="hero.id"> <strong>{{ hero.name }}</strong> - {{ hero.power }} </li> </ul> </div> </template> ","version":"Next","tagName":"h3"},{"title":"Vue IndexedDB Example with RxDB​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#vue-indexeddb-example-with-rxdb","content":" A comprehensive example of using RxDB within a Vue application can be found in the RxDB GitHub repository. This repository contains sample applications, showcasing best practices and demonstrating how to integrate RxDB for various use cases. ","version":"Next","tagName":"h2"},{"title":"Advanced RxDB Features​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#advanced-rxdb-features","content":" RxDB offers many advanced features that extend beyond basic data storage: RxDB Replication: Synchronize local data with remote databases seamlessly. Data Migration: Handle schema changes gracefully with automatic data migrations. Encryption: Secure your data with built-in encryption capabilities. Compression: Optimize storage using key compression. ","version":"Next","tagName":"h2"},{"title":"Limitations of IndexedDB​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#limitations-of-indexeddb","content":" While IndexedDB is powerful, it has some inherent limitations: Performance: IndexedDB can be slow under certain conditions. Read more: Slow IndexedDBStorage Limits: Browsers impose limits on how much data can be stored. See: Browser storage limits. ","version":"Next","tagName":"h2"},{"title":"Alternatives to IndexedDB​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#alternatives-to-indexeddb","content":" Depending on your application's requirements, there are alternative storage solutions to consider: Origin Private File System (OPFS): A newer API that can offer better performance. RxDB supports OPFS as well. More info: RxDB OPFS StorageSQLite: Ideal for hybrid frameworks or Capacitor, offering native performance. Explore: RxDB SQLite Storage ","version":"Next","tagName":"h2"},{"title":"Performance Comparison with Other Browser Storages​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#performance-comparison-with-other-browser-storages","content":" Here is a performance overview of the various browser-based storage implementations of RxDB: ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#follow-up","content":" Learn how to use RxDB with the RxDB Quickstart for a guided introduction.Check out the RxDB GitHub repository and leave a star ⭐ if you find it useful. By leveraging RxDB on top of IndexedDB, you can create highly responsive, offline-capable Vue applications without dealing with the low-level complexities of IndexedDB directly. With reactive queries, seamless cross-tab communication, and powerful advanced features, RxDB becomes an invaluable tool in modern web development. ","version":"Next","tagName":"h2"},{"title":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","type":0,"sectionRef":"#","url":"/articles/websockets-sse-polling-webrtc-webtransport.html","content":"","keywords":"","version":"Next"},{"title":"What is Long Polling?​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#what-is-long-polling","content":" Long polling was the first "hack" to enable a server-client messaging method that can be used in browsers over HTTP. The technique emulates server push communications with normal XHR requests. Unlike traditional polling, where the client repeatedly requests data from the server at regular intervals, long polling establishes a connection to the server that remains open until new data is available. Once the server has new information, it sends the response to the client, and the connection is closed. Immediately after receiving the server's response, the client initiates a new request, and the process repeats. This method allows for more immediate data updates and reduces unnecessary network traffic and server load. However, it can still introduce delays in communication and is less efficient than other real-time technologies like WebSockets. // long-polling in a JavaScript client function longPoll() { fetch('http://example.com/poll') .then(response => response.json()) .then(data => { console.log("Received data:", data); longPoll(); // Immediately establish a new long polling request }) .catch(error => { /** * Errors can appear in normal conditions when a * connection timeout is reached or when the client goes offline. * On errors we just restart the polling after some delay. */ setTimeout(longPoll, 10000); }); } longPoll(); // Initiate the long polling Implementing long-polling on the client side is pretty simple, as shown in the code above. However on the backend there can be multiple difficulties to ensure the client receives all events and does not miss out updates when the client is currently reconnecting. ","version":"Next","tagName":"h3"},{"title":"What are WebSockets?​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#what-are-websockets","content":" WebSockets provide a full-duplex communication channel over a single, long-lived connection between the client and server. This technology enables browsers and servers to exchange data without the overhead of HTTP request-response cycles, facilitating real-time data transfer for applications like live chat, gaming, or financial trading platforms. WebSockets represent a significant advancement over traditional HTTP by allowing both parties to send data independently once the connection is established, making it ideal for scenarios that require low latency and high-frequency updates. // WebSocket in a JavaScript client const socket = new WebSocket('ws://example.com'); socket.onopen = function(event) { console.log('Connection established'); // Sending a message to the server socket.send('Hello Server!'); }; socket.onmessage = function(event) { console.log('Message from server:', event.data); }; While the basics of the WebSocket API are easy to use it has shown to be rather complex in production. A socket can loose connection and must be re-created accordingly. Especially detecting if a connection is still usable or not, can be very tricky. Mostly you would add a ping-and-pong heartbeat to ensure that the open connection is not closed. This complexity is why most people use a library on top of WebSockets like Socket.IO which handles all these cases and even provides fallbacks to long-polling if required. ","version":"Next","tagName":"h3"},{"title":"What are Server-Sent-Events?​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#what-are-server-sent-events","content":" Server-Sent Events (SSE) provide a standard way to push server updates to the client over HTTP. Unlike WebSockets, SSEs are designed exclusively for one-way communication from server to client, making them ideal for scenarios like live news feeds, sports scores, or any situation where the client needs to be updated in real time without sending data to the server. You can think of Server-Sent-Events as a single HTTP request where the backend does not send the whole body at once, but instead keeps the connection open and trickles the answer by sending a single line each time an event has to be send to the client. Creating a connection for receiving events with SSE is straightforward. On the client side in a browser, you initialize an EventSource instance with the URL of the server-side script that generates the events. Listening for messages involves attaching event handlers directly to the EventSource instance. The API distinguishes between generic message events and named events, allowing for more structured communication. Here's how you can set it up in JavaScript: // Connecting to the server-side event stream const evtSource = new EventSource("https://example.com/events"); // Handling generic message events evtSource.onmessage = event => { console.log('got message: ' + event.data); }; In difference to WebSockets, an EventSource will automatically reconnect on connection loss. On the server side, your script must set the Content-Type header to text/event-stream and format each message according to the SSE specification. This includes specifying event types, data payloads, and optional fields like event ID and retry timing. Here's how you can set up a simple SSE endpoint in a Node.js Express app: import express from 'express'; const app = express(); const PORT = process.env.PORT || 3000; app.get('/events', (req, res) => { res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', }); const sendEvent = (data) => { // all message lines must be prefixed with 'data: ' const formattedData = `data: ${JSON.stringify(data)}\\n\\n`; res.write(formattedData); }; // Send an event every 2 seconds const intervalId = setInterval(() => { const message = { time: new Date().toTimeString(), message: 'Hello from the server!', }; sendEvent(message); }, 2000); // Clean up when the connection is closed req.on('close', () => { clearInterval(intervalId); res.end(); }); }); app.listen(PORT, () => console.log(`Server running on http://localhost:${PORT}`)); ","version":"Next","tagName":"h3"},{"title":"What is the WebTransport API?​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#what-is-the-webtransport-api","content":" WebTransport is a cutting-edge API designed for efficient, low-latency communication between web clients and servers. It leverages the HTTP/3 QUIC protocol to enable a variety of data transfer capabilities, such as sending data over multiple streams, in both reliable and unreliable manners, and even allowing data to be sent out of order. This makes WebTransport a powerful tool for applications requiring high-performance networking, such as real-time gaming, live streaming, and collaborative platforms. However, it's important to note that WebTransport is currently a working draft and has not yet achieved widespread adoption. As of now (March 2024), WebTransport is in a Working Draft and not widely supported. You cannot yet use WebTransport in the Safari browser and there is also no native support in Node.js. This limits its usability across different platforms and environments. Even when WebTransport will become widely supported, its API is very complex to use and likely it would be something where people build libraries on top of WebTransport, not using it directly in an application's sourcecode. ","version":"Next","tagName":"h3"},{"title":"What is WebRTC?​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#what-is-webrtc","content":" WebRTC (Web Real-Time Communication) is an open-source project and API standard that enables real-time communication (RTC) capabilities directly within web browsers and mobile applications without the need for complex server infrastructure or the installation of additional plugins. It supports peer-to-peer connections for streaming audio, video, and data exchange between browsers. WebRTC is designed to work through NATs and firewalls, utilizing protocols like ICE, STUN, and TURN to establish a connection between peers. While WebRTC is made to be used for client-client interactions, it could also be leveraged for server-client communication where the server just simulated being also a client. This approach only makes sense for niche use cases which is why in the following WebRTC will be ignored as an option. The problem is that for WebRTC to work, you need a signaling-server anyway which would then again run over websockets, SSE or WebTransport. This defeats the purpose of using WebRTC as a replacement for these technologies. ","version":"Next","tagName":"h3"},{"title":"Limitations of the technologies​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#limitations-of-the-technologies","content":" ","version":"Next","tagName":"h2"},{"title":"Sending Data in both directions​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#sending-data-in-both-directions","content":" Only WebSockets and WebTransport allow to send data in both directions so that you can receive server-data and send client-data over the same connection. While it would also be possible with Long-Polling in theory, it is not recommended because sending "new" data to an existing long-polling connection would require to do an additional http-request anyway. So instead of doing that you can send data directly from the client to the server with an additional http-request without interrupting the long-polling connection. Server-Sent-Events do not support sending any additional data to the server. You can only do the initial request, and even there you cannot send POST-like data in the http-body by default with the native EventSource API. Instead you have to put all data inside of the url parameters which is considered a bad practice for security because credentials might leak into server logs, proxies and caches. To fix this problem, RxDB for example uses the eventsource polyfill instead of the native EventSource API. This library adds additional functionality like sending custom http headers. Also there is this library from microsoft which allows to send body data and use POST requests instead of GET. ","version":"Next","tagName":"h3"},{"title":"6-Requests per Domain Limit​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#6-requests-per-domain-limit","content":" Most modern browsers allow six connections per domain () which limits the usability of all steady server-to-client messaging methods. The limitation of six connections is even shared across browser tabs so when you open the same page in multiple tabs, they would have to shared the six-connection-pool with each other. This limitation is part of the HTTP/1.1-RFC (which even defines a lower number of only two connections). Quote From RFC 2616 - Section 8.1.4: "Clients that use persistent connections SHOULD limit the number of simultaneous connections that they maintain to a given server. A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy. A proxy SHOULD use up to 2*N connections to another server or proxy, where N is the number of simultaneously active users. These guidelines are intended to improve HTTP response times and avoid congestion." While that policy makes sense to prevent website owners from using their visitors to D-DOS other websites, it can be a big problem when multiple connections are required to handle server-client communication for legitimate use cases. To workaround the limitation you have to use HTTP/2 or HTTP/3 with which the browser will only open a single connection per domain and then use multiplexing to run all data through a single connection. While this gives you a virtually infinity amount of parallel connections, there is a SETTINGS_MAX_CONCURRENT_STREAMS setting which limits the actually connections amount. The default is 100 concurrent streams for most configurations. In theory the connection limit could also be increased by the browser, at least for specific APIs like EventSource, but the issues have been marked as "won't fix" by chromium and firefox. Lower the amount of connections in Browser Apps When you build a browser application, you have to assume that your users will use the app not only once, but in multiple browser tabs in parallel. By default you likely will open one server-stream-connection per tab which is often not necessary at all. Instead you open only a single connection and shared it between tabs, no matter how many tabs are open. RxDB does that with the LeaderElection from the broadcast-channel npm package to only have one stream of replication between server and clients. You can use that package standalone (without RxDB) for any type of application. ","version":"Next","tagName":"h3"},{"title":"Connections are not kept open on mobile apps​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#connections-are-not-kept-open-on-mobile-apps","content":" In the context of mobile applications running on operating systems like Android and iOS, maintaining open connections, such as those used for WebSockets and the others, poses a significant challenge. Mobile operating systems are designed to automatically move applications into the background after a certain period of inactivity, effectively closing any open connections. This behavior is a part of the operating system's resource management strategy to conserve battery and optimize performance. As a result, developers often rely on mobile push notifications as an efficient and reliable method to send data from servers to clients. Push notifications allow servers to alert the application of new data, prompting an action or update, without the need for a persistent open connection. ","version":"Next","tagName":"h3"},{"title":"Proxies and Firewalls​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#proxies-and-firewalls","content":" From consulting many RxDB users, it was shown that in enterprise environments (aka "at work") it is often hard to implement a WebSocket server into the infrastructure because many proxies and firewalls block non-HTTP connections. Therefore using the Server-Sent-Events provides and easier way of enterprise integration. Also long-polling uses only plain HTTP-requests and might be an option. ","version":"Next","tagName":"h3"},{"title":"Performance Comparison​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#performance-comparison","content":" Comparing the performance of WebSockets, Server-Sent Events (SSE), Long-Polling and WebTransport directly involves evaluating key aspects such as latency, throughput, server load, and scalability under various conditions. First lets look at the raw numbers. A good performance comparison can be found in this repo which tests the messages times in a Go Lang server implementation. Here we can see that the performance of WebSockets, WebRTC and WebTransport are comparable: note Remember that WebTransport is a pretty new technology based on the also new HTTP/3 protocol. In the future (after March 2024) there might be more performance optimizations. Also WebTransport is optimized to use less power which metric is not tested. Lets also compare the Latency, the throughput and the scalability: ","version":"Next","tagName":"h2"},{"title":"Latency​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#latency","content":" WebSockets: Offers the lowest latency due to its full-duplex communication over a single, persistent connection. Ideal for real-time applications where immediate data exchange is critical.Server-Sent Events: Also provides low latency for server-to-client communication but cannot natively send messages back to the server without additional HTTP requests.Long-Polling: Incurs higher latency as it relies on establishing new HTTP connections for each data transmission, making it less efficient for real-time updates. Also it can occur that the server wants to send an event when the client is still in the process of opening a new connection. In these cases the latency would be significantly larger.WebTransport: Promises to offer low latency similar to WebSockets, with the added benefits of leveraging the HTTP/3 protocol for more efficient multiplexing and congestion control. ","version":"Next","tagName":"h3"},{"title":"Throughput​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#throughput","content":" WebSockets: Capable of high throughput due to its persistent connection, but throughput can suffer from backpressure where the client cannot process data as fast as the server is capable of sending it.Server-Sent Events: Efficient for broadcasting messages to many clients with less overhead than WebSockets, leading to potentially higher throughput for unidirectional server-to-client communication.Long-Polling: Generally offers lower throughput due to the overhead of frequently opening and closing connections, which consumes more server resources.WebTransport: Expected to support high throughput for both unidirectional and bidirectional streams within a single connection, outperforming WebSockets in scenarios requiring multiple streams. ","version":"Next","tagName":"h3"},{"title":"Scalability and Server Load​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#scalability-and-server-load","content":" WebSockets: Maintaining a large number of WebSocket connections can significantly increase server load, potentially affecting scalability for applications with many users.Server-Sent Events: More scalable for scenarios that primarily require updates from server to client, as it uses less connection overhead than WebSockets because it uses "normal" HTTP request without things like protocol updates that have to be run with WebSockets.Long-Polling: The least scalable due to the high server load generated by frequent connection establishment, making it suitable only as a fallback mechanism.WebTransport: Designed to be highly scalable, benefiting from HTTP/3's efficiency in handling connections and streams, potentially reducing server load compared to WebSockets and SSE. ","version":"Next","tagName":"h3"},{"title":"Recommendations and Use-Case Suitability​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#recommendations-and-use-case-suitability","content":" In the landscape of server-client communication technologies, each has its distinct advantages and use case suitability. Server-Sent Events (SSE) emerge as the most straightforward option to implement, leveraging the same HTTP/S protocols as traditional web requests, thereby circumventing corporate firewall restrictions and other technical problems that can appear with other protocols. They are easily integrated into Node.js and other server frameworks, making them an ideal choice for applications requiring frequent server-to-client updates, such as news feeds, stock tickers, and live event streaming. On the other hand, WebSockets excel in scenarios demanding ongoing, two-way communication. Their ability to support continuous interaction makes them the prime choice for browser games, chat applications, and live sports updates. However, WebTransport, despite its potential, faces adoption challenges. It is not widely supported by server frameworks including Node.js and lacks compatibility with safari. Moreover, its reliance on HTTP/3 further limits its immediate applicability because many WebServers like nginx only have experimental HTTP/3 support. While promising for future applications with its support for both reliable and unreliable data transmission, WebTransport is not yet a viable option for most use cases. Long-Polling, once a common technique, is now largely outdated due to its inefficiency and the high overhead of repeatedly establishing new HTTP connections. Although it may serve as a fallback in environments lacking support for WebSockets or SSE, its use is generally discouraged due to significant performance limitations. ","version":"Next","tagName":"h2"},{"title":"Known Problems​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#known-problems","content":" For all of the realtime streaming technologies, there are known problems. When you build anything on top of them, keep these in mind. ","version":"Next","tagName":"h2"},{"title":"A client can miss out events when reconnecting​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#a-client-can-miss-out-events-when-reconnecting","content":" When a client is connecting, reconnecting or offline, it can miss out events that happened on the server but could not be streamed to the client. This missed out events are not relevant when the server is streaming the full content each time anyway, like on a live updating stock ticker. But when the backend is made to stream partial results, you have to account for missed out events. Fixing that on the backend scales pretty bad because the backend would have to remember for each client which events have been successfully send already. Instead this should be implemented with client side logic. The RxDB Sync Engine for example uses two modes of operation for that. One is the checkpoint iteration mode where normal http requests are used to iterate over backend data, until the client is in sync again. Then it can switch to event observation mode where updates from the realtime-stream are used to keep the client in sync. Whenever a client disconnects or has any error, the replication shortly switches to checkpoint iteration mode until the client is in sync again. This method accounts for missed out events and ensures that clients can always sync to the exact equal state of the server. ","version":"Next","tagName":"h3"},{"title":"Company firewalls can cause problems​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#company-firewalls-can-cause-problems","content":" There are many known problems with company infrastructure when using any of the streaming technologies. Proxies and firewall can block traffic or unintentionally break requests and responses. Whenever you implement a realtime app in such an infrastructure, make sure you first test out if the technology itself works for you. ","version":"Next","tagName":"h3"},{"title":"Follow Up​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#follow-up","content":" Check out the hackernews discussion of this articleShared/Like my announcement tweetLearn how to use Server-Sent-Events to replicate a client side RxDB database with your backend.Learn how to use RxDB with the RxDB QuickstartCheck out the RxDB github repo and leave a star ⭐ ","version":"Next","tagName":"h2"},{"title":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","type":0,"sectionRef":"#","url":"/articles/zero-latency-local-first.html","content":"","keywords":"","version":"Next"},{"title":"Why Zero Latency with a Local First Approach?​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#why-zero-latency-with-a-local-first-approach","content":" In a traditional architecture, each user action triggers requests to a server for reads or writes. Despite network optimizations, unavoidable latencies can delay responses and disrupt the user flow. By contrast, a local first model maintains data in the client's environment (browser, mobile, desktop), drastically reducing user-perceived delays. Once the user re-connects or resumes activity online, changes propagate automatically to the server, eliminating manual synchronization overhead. Instant Responsiveness: Because user actions (queries, updates, etc.) happen against a local datastore, UI updates do not wait on round-trip times.Offline Operation: Apps can continue to read and write data, even when there is zero connectivity.Reduced Backend Load: Instead of flooding the server with small requests, replication can combine and push or pull changes in batches.Simplified Caching: Instead of implementing multi-layer caching, local first transforms your data layer into a reliable, quickly accessible store for all user actions. ","version":"Next","tagName":"h2"},{"title":"RxDB: Your Key to Zero-Latency Local First Apps​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#rxdb-your-key-to-zero-latency-local-first-apps","content":" RxDB is a JavaScript-based NoSQL database designed for offline-first and real-time replication scenarios. It supports a range of environments - browsers (IndexedDB or OPFS), mobile (Ionic, React Native), Electron, Node.js - and is built around: Reactive Queries that trigger UI updates upon data changesSchema-based NoSQL Documents for flexible but robust data modelsAdvanced Sync Engine: to synchronize with diverse backendsEncryption for secure data at restCompression to reduce local and network overhead ","version":"Next","tagName":"h2"},{"title":"Real-Time Sync and Offline-First​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#real-time-sync-and-offline-first","content":" RxDB's replication logic revolves around pulling down remote changes and pushing up local modifications. It maintains a checkpoint-based mechanism, so only new or updated documents flow between the client and server, reducing bandwidth usage and latency. This ensures: Live Data: Queries automatically reflect server-side changes once they arrive locally.Background Updates: No manual polling needed; replication streams or intervals handle synchronization.Conflict Handling (see below) ensures data merges gracefully when multiple clients edit the same document offline. Multiple Replication Plugins and Approaches​ RxDB's flexible replication system lets you connect to different backends or even peer-to-peer networks. There are official plugins for CouchDB, Firestore, GraphQL, WebRTC, and more. Many developers create a custom HTTP replication to work with their existing REST-based backend, ensuring a painless integration that doesn't require adopting an entirely new server infrastructure. Example Setup of a local database​ import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; async function initZeroLocalDB() { // Create a local RxDB instance using localstorage-based storage const db = await createRxDatabase({ name: 'myZeroLocalDB', storage: getRxStorageLocalstorage(), // optional: password for encryption if needed }); // Define one or more collections await db.addCollections({ tasks: { schema: { title: 'task schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string', maxLength: 100 }, title: { type: 'string' }, done: { type: 'boolean' } } } } }); // Reactive query - automatically updates on local or remote changes db.tasks .find() .$ // returns an RxJS Observable .subscribe(allTasks => { console.log('All tasks updated:', allTasks); }); return db; } When offline, reads and writes to db.tasks happen locally with near-zero delay. Once connectivity resumes, changes sync to the server automatically (if replication is configured). Example Setup of the replication​ import { replicateRxCollection } from 'rxdb/plugins/replication'; async function syncLocalTasks(db) { replicateRxCollection({ collection: db.tasks, replicationIdentifier: 'sync-tasks', // Define how to pull server documents and push local documents pull: { handler: async (lastCheckpoint, batchSize) => { // logic to retrieve updated tasks from the server since lastCheckpoint }, }, push: { handler: async (docs) => { // logic to post local changes to the server }, }, live: true, // continuously replicate retryTime: 5000, // retry on errors or disconnections }); } This replication seamlessly merges server-side and client-side changes. Your app remains responsive throughout, regardless of the network status. ","version":"Next","tagName":"h3"},{"title":"Things you should also know about​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#things-you-should-also-know-about","content":" ","version":"Next","tagName":"h2"},{"title":"Optimistic UI on Local Data Changes​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#optimistic-ui-on-local-data-changes","content":" A local first approach, especially with RxDB, naturally supports an optimistic UI pattern. Because writes occur on the client, you can instantly reflect changes in the interface as soon as the user performs an action - no need to wait for server confirmation. For example, when a user updates a task document to done: true, the UI can re-render immediately with that new state. This even works across multiple browser tabs. If a server conflict arises later during replication, RxDB's conflict handling logic determines which changes to keep, and the UI can be updated accordingly. This is far more efficient than blocking the user or displaying a spinner while the backend processes the request. ","version":"Next","tagName":"h3"},{"title":"Conflict Handling​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#conflict-handling","content":" In local first models, conflicts emerge if multiple devices or clients edit the same document while offline. RxDB tracks document revisions so you can detect collisions and merge them effectively. By default, RxDB uses a last-write-wins approach, but developers can override it with a custom conflict handler. This provides fine-grained control - like merging partial fields, storing revision histories, or prompting users for resolution. Proper conflict handling keeps distributed data consistent across your entire system. ","version":"Next","tagName":"h3"},{"title":"Schema Migrations​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#schema-migrations","content":" Over time, apps evolve - new fields, changed field types, or altered indexes. RxDB allows incremental schema migrations so you can upgrade a user's local data from one schema version to another. You might, for instance, rename a property or transform data formats. Once you define your migration strategy, RxDB automatically applies it upon app initialization, ensuring the local database's structure aligns with your latest codebase. ","version":"Next","tagName":"h3"},{"title":"Advanced Features​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#advanced-features","content":" ","version":"Next","tagName":"h2"},{"title":"Setup Encryption​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#setup-encryption","content":" When storing data locally, you may handle user-sensitive information like PII (Personal Identifiable Information) or financial details. RxDB supports on-device encryption to protect fields. For example, you can define: import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ storage: getRxStorageLocalstorage() }); const db = await createRxDatabase({ name: 'secureDB', storage: encryptedStorage, password: 'myEncryptionPassword' }); await db.addCollections({ secrets: { schema: { title: 'secrets schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string', maxLength: 100 }, secretField: { type: 'string' } }, required: ['id'], encrypted: ['secretField'] // define which fields to encrypt } } }); Then mark fields as encrypted in the schema. This ensures data is unreadable on disk without the correct password. ","version":"Next","tagName":"h3"},{"title":"Setup Compression​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#setup-compression","content":" Local data can expand quickly, especially for large documents or repeated key names. RxDB's key compression feature replaces verbose field names with shorter tokens, decreasing storage usage and speeding up replication. You enable it by adding keyCompression: true to your collection schema: await db.addCollections({ logs: { schema: { title: 'log schema', version: 0, keyCompression: true, type: 'object', primaryKey: 'id', properties: { id: { type: 'string'. maxLength: 100 }, message: { type: 'string' }, timestamp: { type: 'number' } } } } }); ","version":"Next","tagName":"h3"},{"title":"Different RxDB Storages Depending on the Runtime​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#different-rxdb-storages-depending-on-the-runtime","content":" RxDB's storage layer is swappable, so you can pick the optimal adapter for each environment. Some common choices include: IndexedDB in modern browsers (default).OPFS (Origin Private File System) in browsers that support it for potentially better performance.SQLite for mobile or desktop environments via the premium plugin, offering native-like speed on Android, iOS, or Electron.In-Memory for tests or ephemeral data. By choosing a suitable storage layer, you can adapt your zero-latency local first design to any runtime - web, mobile, or server-like contexts in Node.js. ","version":"Next","tagName":"h2"},{"title":"Performance Considerations​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#performance-considerations","content":" Performant local data operations are crucial for a zero-latency experience. According to the RxDB storage performance overview, differences in underlying storages can significantly impact throughput and latency. For instance, IndexedDB typically performs well across modern browsers, OPFS offers improved throughput in supporting browsers, and SQLite storage (a premium plugin) often delivers near-native speed for mobile or desktop. ","version":"Next","tagName":"h2"},{"title":"Offloading Work from the Main Thread​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#offloading-work-from-the-main-thread","content":" In a browser environment, you can move database operations into a Web Worker using the Worker RxStorage plugin. This approach lets you keep heavy data processing off the main thread, ensuring the UI remains smooth and responsive. Complex queries or large write operations no longer cause stuttering in the user interface. ","version":"Next","tagName":"h3"},{"title":"Sharding or Memory-Mapped Storages​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#sharding-or-memory-mapped-storages","content":" For large datasets or high concurrency, advanced techniques like sharding collections across multiple storages or leveraging a memory-mapped variant can further boost performance. By splitting data into smaller subsets or streaming it only as needed, you can scale to handle complex usage scenarios without compromising on the zero-latency user experience. ","version":"Next","tagName":"h3"},{"title":"Follow Up​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#follow-up","content":" Dive into the RxDB Quickstart to set up your own local first database.Explore Replication Plugins for syncing with platforms like CouchDB, Firestore, or GraphQL.Check out Advanced Conflict Handling and Performance Tuning for big data sets or complex multi-user interactions.Join the RxDB Community on GitHub and Discord to share insights, file issues, and learn from other developers building zero-latency solutions. By integrating RxDB into your stack, you achieve millisecond interactions, full offline capabilities, secure data at rest, and minimal overhead for large or distributed teams. This zero-latency local first architecture is the future of modern software - delivering a fluid, always-available user experience without overcomplicating the developer workflow. ","version":"Next","tagName":"h2"},{"title":"📥 Backup Plugin","type":0,"sectionRef":"#","url":"/backup.html","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"📥 Backup Plugin","url":"/backup.html#installation","content":" import { addRxPlugin } from 'rxdb'; import { RxDBBackupPlugin } from 'rxdb/plugins/backup'; addRxPlugin(RxDBBackupPlugin); ","version":"Next","tagName":"h2"},{"title":"one-time backup​","type":1,"pageTitle":"📥 Backup Plugin","url":"/backup.html#one-time-backup","content":" Write the whole database to the filesystem once. When called multiple times, it will continue from the last checkpoint and not start all over again. const backupOptions = { // if false, a one-time backup will be written live: false, // the folder where the backup will be stored directory: '/my-backup-folder/', // if true, attachments will also be saved attachments: true } const backupState = myDatabase.backup(backupOptions); await backupState.awaitInitialBackup(); // call again to run from the last checkpoint const backupState2 = myDatabase.backup(backupOptions); await backupState2.awaitInitialBackup(); ","version":"Next","tagName":"h2"},{"title":"live backup​","type":1,"pageTitle":"📥 Backup Plugin","url":"/backup.html#live-backup","content":" When live: true is set, the backup will write all ongoing changes to the backup directory. const backupOptions = { // set live: true to have an ongoing backup live: true, directory: '/my-backup-folder/', attachments: true } const backupState = myDatabase.backup(backupOptions); // you can still await the initial backup write, but further changes will still be processed. await backupState.awaitInitialBackup(); ","version":"Next","tagName":"h2"},{"title":"writeEvents$​","type":1,"pageTitle":"📥 Backup Plugin","url":"/backup.html#writeevents","content":" You can listen to the writeEvents$ Observable to get notified about written backup files. const backupOptions = { live: false, directory: '/my-backup-folder/', attachments: true } const backupState = myDatabase.backup(backupOptions); const subscription = backupState.writeEvents$.subscribe(writeEvent => console.dir(writeEvent)); /* > { collectionName: 'humans', documentId: 'foobar', files: [ '/my-backup-folder/foobar/document.json' ], deleted: false } */ ","version":"Next","tagName":"h2"},{"title":"Limitations​","type":1,"pageTitle":"📥 Backup Plugin","url":"/backup.html#limitations","content":" It is currently not possible to import from a written backup. If you need this functionality, please make a pull request. ","version":"Next","tagName":"h2"},{"title":"🧹 Cleanup","type":0,"sectionRef":"#","url":"/cleanup.html","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"🧹 Cleanup","url":"/cleanup.html#installation","content":" import { addRxPlugin } from 'rxdb'; import { RxDBCleanupPlugin } from 'rxdb/plugins/cleanup'; addRxPlugin(RxDBCleanupPlugin); ","version":"Next","tagName":"h2"},{"title":"Create a database with cleanup options​","type":1,"pageTitle":"🧹 Cleanup","url":"/cleanup.html#create-a-database-with-cleanup-options","content":" You can set a specific cleanup policy when a RxDatabase is created. For most use cases, the defaults should be ok. import { createRxDatabase } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage(), cleanupPolicy: { /** * The minimum time in milliseconds for how long * a document has to be deleted before it is * purged by the cleanup. * [default=one month] */ minimumDeletedTime: 1000 * 60 * 60 * 24 * 31, // one month, /** * The minimum amount of that that the RxCollection must have existed. * This ensures that at the initial page load, more important * tasks are not slowed down because a cleanup process is running. * [default=60 seconds] */ minimumCollectionAge: 1000 * 60, // 60 seconds /** * After the initial cleanup is done, * a new cleanup is started after [runEach] milliseconds * [default=5 minutes] */ runEach: 1000 * 60 * 5, // 5 minutes /** * If set to true, * RxDB will await all running replications * to not have a replication cycle running. * This ensures we do not remove deleted documents * when they might not have already been replicated. * [default=true] */ awaitReplicationsInSync: true, /** * If true, it will only start the cleanup * when the current instance is also the leader. * This ensures that when RxDB is used in multiInstance mode, * only one instance will start the cleanup. * [default=true] */ waitForLeadership: true } }); ","version":"Next","tagName":"h2"},{"title":"Calling cleanup manually​","type":1,"pageTitle":"🧹 Cleanup","url":"/cleanup.html#calling-cleanup-manually","content":" You can manually run a cleanup per collection by calling RxCollection.cleanup(). /** * Manually run the cleanup with the * minimumDeletedTime from the cleanupPolicy. */ await myRxCollection.cleanup(); /** * Overwrite the minimumDeletedTime * be setting it explicitly (time in milliseconds) */ await myRxCollection.cleanup(1000); /** * Purge all deleted documents no * matter when they where deleted * by setting minimumDeletedTime to zero. */ await myRxCollection.cleanup(0); ","version":"Next","tagName":"h2"},{"title":"Using the cleanup plugin to empty a collection​","type":1,"pageTitle":"🧹 Cleanup","url":"/cleanup.html#using-the-cleanup-plugin-to-empty-a-collection","content":" When you have a collection with documents and you want to empty it by purging all documents, the recommended way is to call myRxCollection.remove(). However, this will destroy the JavaScript class of the collection and stop all listeners and observables. Sometimes the better option might be to manually delete all documents and then use the cleanup plugin to purge the deleted documents: // delete all documents await myRxCollection.find().remove(); // purge all deleted documents await myRxCollection.cleanup(0); ","version":"Next","tagName":"h2"},{"title":"FAQ​","type":1,"pageTitle":"🧹 Cleanup","url":"/cleanup.html#faq","content":" When does the cleanup run The cleanup cycles are optimized to run only when the database is idle and it is unlikely that another database interaction performance will be decreased in the meantime. For example, by default, the cleanup does not run in the first 60 seconds of the creation of a collection to ensure the initial page load of your website does not slow down. Also, we use mechanisms like the requestIdleCallback() API to improve the correct timing of the cleanup cycle. ","version":"Next","tagName":"h2"},{"title":"Capacitor Database - SQLite, RxDB and others","type":0,"sectionRef":"#","url":"/capacitor-database.html","content":"","keywords":"","version":"Next"},{"title":"Database Solutions for Capacitor​","type":1,"pageTitle":"Capacitor Database - SQLite, RxDB and others","url":"/capacitor-database.html#database-solutions-for-capacitor","content":" ","version":"Next","tagName":"h2"},{"title":"Preferences API​","type":1,"pageTitle":"Capacitor Database - SQLite, RxDB and others","url":"/capacitor-database.html#preferences-api","content":" Capacitor comes with a native Preferences API which is a simple, persistent key->value store for lightweight data, similar to the browsers localstorage or React Native AsyncStorage. To use it, you first have to install it from npm npm install @capacitor/preferences and then you can import it and write/read data. Notice that all calls to the preferences API are asynchronous so they return a Promise that must be await-ed. import { Preferences } from '@capacitor/preferences'; // write await Preferences.set({ key: 'foo', value: 'baar', }); // read const { value } = await Preferences.get({ key: 'foo' }); // > 'bar' // delete await Preferences.remove({ key: 'foo' }); The preferences API is good when only a small amount of data needs to be stored and when no query capabilities besides the key access are required. Complex queries or other features like indexes or replication are not supported which makes the preferences API not suitable for anything more than storing simple data like user settings. ","version":"Next","tagName":"h3"},{"title":"Localstorage/IndexedDB/WebSQL​","type":1,"pageTitle":"Capacitor Database - SQLite, RxDB and others","url":"/capacitor-database.html#localstorageindexeddbwebsql","content":" Since Capacitor apps run in a web view, Web APIs like IndexedDB, Localstorage and WebSQL are available. But the default browser behavior is to clean up these storages regularly when they are not in use for a long time or the device is low on space. Therefore you cannot 100% rely on the persistence of the stored data and your application needs to expect that the data will be lost eventually. Storing data in these storages can be done in browsers, because there is no other option. But in Capacitor iOS and Android, you should not rely on these. ","version":"Next","tagName":"h3"},{"title":"SQLite​","type":1,"pageTitle":"Capacitor Database - SQLite, RxDB and others","url":"/capacitor-database.html#sqlite","content":" SQLite is a SQL based relational database written in C that was crafted to be embed inside of applications. Operations are written in the SQL query language and SQLite generally follows the PostgreSQL syntax. To use SQLite in Capacitor, there are three options: The @capacitor-community/sqlite packageThe cordova-sqlite-storage packageThe non-free IonicSecure Storage which comes at 999$ per month. It is recommended to use the @capacitor-community/sqlite because it has the best maintenance and is open source. Install it first npm install --save @capacitor-community/sqlite and then set the storage location for iOS apps: { "plugins": { "CapacitorSQLite": { "iosDatabaseLocation": "Library/CapacitorDatabase" } } } Now you can create a database connection and use the SQLite database. import { Capacitor } from '@capacitor/core'; import { CapacitorSQLite, SQLiteDBConnection, SQLiteConnection, capSQLiteSet, capSQLiteChanges, capSQLiteValues, capEchoResult, capSQLiteResult, capNCDatabasePathResult } from '@capacitor-community/sqlite'; const sqlite = new SQLiteConnection(CapacitorSQLite); const database: SQLiteDBConnection = await this.sqlite.createConnection( databaseName, encrypted, mode, version, readOnly ); let { rows } = database.query('SELECT somevalue FROM sometable'); The downside of SQLite is that it is lacking many features that are handful when using a database together with an UI based application like your Capacitor app. For example it is not possible to observe queries or document fields. Also there is no realtime replication feature, you can only import json files. This makes SQLite a good solution when you just want to store data on the client, but when you want to sync data with a server or other clients or create big complex realtime applications, you have to use something else. ","version":"Next","tagName":"h3"},{"title":"RxDB​","type":1,"pageTitle":"Capacitor Database - SQLite, RxDB and others","url":"/capacitor-database.html#rxdb","content":" RxDB is an local first, NoSQL database for JavaScript Applications like hybrid apps. Because it is reactive, you can subscribe to all state changes like the result of a query or even a single field of a document. This is great for UI-based realtime applications in a way that makes it easy to develop realtime applications like what you need in Capacitor. Because RxDB is made for Web applications, most of the available RxStorage plugins can be used to store and query data in a Capacitor app. However it is recommended to use the SQLite RxStorage because it stores the data on the filesystem of the device, not in the JavaScript runtime (like IndexedDB). Storing data on the filesystem ensures it is persistent and will not be cleaned up by any process. Also the performance of SQLite is much faster compared to IndexedDB, because SQLite does not have to go through a browsers permission layers. For the SQLite binding you should use the @capacitor-community/sqlite package. Because the SQLite RxStorage is part of the 👑 Premium Plugins which must be purchased, it is recommended to use the LocalStorage RxStorage while testing and prototyping your Capacitor app. To use the SQLite RxStorage in Capacitor you have to install all dependencies via npm install rxdb rxjs rxdb-premium @capacitor-community/sqlite. For iOS apps you should add a database location in your Capacitor settings: { "plugins": { "CapacitorSQLite": { "iosDatabaseLocation": "Library/CapacitorDatabase" } } } Then you can assemble the RxStorage and create a database with it: 1 Import RxDB and SQLite​ import { createRxDatabase } from 'rxdb/plugins/core'; import { CapacitorSQLite, SQLiteConnection } from '@capacitor-community/sqlite'; import { Capacitor } from '@capacitor/core'; const sqlite = new SQLiteConnection(CapacitorSQLite); 2 Import the RxDB SQLite Storage​ RxDB Core RxDB Premium 👑 import { getRxStorageSQLiteTrial, getSQLiteBasicsCapacitor } from 'rxdb/plugins/storage-sqlite'; 3 Create a Database with the Storage​ RxDB Core RxDB Premium 👑 // create database const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: getRxStorageSQLiteTrial({ sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor) }) }); 4 Add a Collection​ // create collections const collections = await myRxDatabase.addCollections({ humans: { schema: { version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string', maxLength: 100 }, name: { type: 'string' }, age: { type: 'number' } }, required: ['id', 'name'] } } }); 5 Insert a Document​ await collections.humans.insert({id: 'foo', name: 'bar'}); 6 Run a Query​ const result = await collections.humans.find({ selector: { name: 'bar' } }).exec(); 7 Observe a Query​ await collections.humans.find({ selector: { name: 'bar' } }).$.subscribe(result => {/* ... */}); ","version":"Next","tagName":"h3"},{"title":"Follow up​","type":1,"pageTitle":"Capacitor Database - SQLite, RxDB and others","url":"/capacitor-database.html#follow-up","content":" If you haven't done yet, you should start learning about RxDB with the Quickstart Tutorial.There is a followup list of other client side database alternatives. ","version":"Next","tagName":"h2"},{"title":"Data Migration","type":0,"sectionRef":"#","url":"/data-migration.html","content":"Data Migration This documentation page has been moved to here","keywords":"","version":"Next"},{"title":"Contribution","type":0,"sectionRef":"#","url":"/contribution.html","content":"","keywords":"","version":"Next"},{"title":"Requirements​","type":1,"pageTitle":"Contribution","url":"/contribution.html#requirements","content":" Before you can start developing, do the following: Make sure you have installed nodejs with the version stated in the .nvmrcClone the repository git clone https://github.com/pubkey/rxdb.gitInstall the dependencies cd rxdb && npm installMake sure that the tests work for you. At first, try it out with npm run test:node:memory which tests the memory storage in node. In the package.json you can find more scripts to run the tests with different storages. ","version":"Next","tagName":"h2"},{"title":"Adding tests​","type":1,"pageTitle":"Contribution","url":"/contribution.html#adding-tests","content":" Before you start creating a bugfix or a feature, you should create a test to reproduce it. Tests are in the test/unit-folder. If you want to reproduce a bug, you can modify the test in this file. ","version":"Next","tagName":"h2"},{"title":"Making a PR​","type":1,"pageTitle":"Contribution","url":"/contribution.html#making-a-pr","content":" If you make a pull-request, ensure the following: Every feature or bugfix must be committed together with a unit-test which ensures everything works as expected.Do not commit build-files (anything in the dist-folder)Before you add non-trivial changes, create an issue to discuss if this will be merged and you don't waste your time.To run the unit and integration-tests, do npm run test and ensure everything works as expected ","version":"Next","tagName":"h2"},{"title":"Getting help​","type":1,"pageTitle":"Contribution","url":"/contribution.html#getting-help","content":" If you need help with your contribution, ask at discord. ","version":"Next","tagName":"h2"},{"title":"No-Go​","type":1,"pageTitle":"Contribution","url":"/contribution.html#no-go","content":" When reporting a bug, you need to make a PR with a test case that runs in the CI and reproduces your problem. Sending a link with a repo does not help the maintainer because installing random peoples projects is time consuming and dangerous. Also the maintainer will never go on a bug hunt based on your plain description. Either you report the bug with a test case, or the maintainer will likely not help you. Docs The source of the documentation is at the docs-src-folder. To read the docs locally, run npm run docs:install && npm run docs:serve and open http://localhost:4000/ Thank you for contributing! ","version":"Next","tagName":"h2"},{"title":"Dev Mode","type":0,"sectionRef":"#","url":"/dev-mode.html","content":"","keywords":"","version":"Next"},{"title":"Usage with Node.js​","type":1,"pageTitle":"Dev Mode","url":"/dev-mode.html#usage-with-nodejs","content":" async function createDb() { if (process.env.NODE_ENV !== "production") { await import('rxdb/plugins/dev-mode').then( module => addRxPlugin(module.RxDBDevModePlugin) ); } const db = createRxDatabase( /* ... */ ); } ","version":"Next","tagName":"h2"},{"title":"Usage with Angular​","type":1,"pageTitle":"Dev Mode","url":"/dev-mode.html#usage-with-angular","content":" import { isDevMode } from '@angular/core'; async function createDb() { if (isDevMode()){ await import('rxdb/plugins/dev-mode').then( module => addRxPlugin(module.RxDBDevModePlugin) ); } const db = createRxDatabase( /* ... */ ); // ... } ","version":"Next","tagName":"h2"},{"title":"Usage with webpack​","type":1,"pageTitle":"Dev Mode","url":"/dev-mode.html#usage-with-webpack","content":" In the webpack.config.js: module.exports = { entry: './src/index.ts', /* ... */ plugins: [ // set a global variable that can be accessed during runtime new webpack.DefinePlugin({ MODE: JSON.stringify("production") }) ] /* ... */ }; In your source code: declare var MODE: 'production' | 'development'; async function createDb() { if (MODE === 'development') { await import('rxdb/plugins/dev-mode').then( module => addRxPlugin(module.RxDBDevModePlugin) ); } const db = createRxDatabase( /* ... */ ); // ... } ","version":"Next","tagName":"h2"},{"title":"Disable the dev-mode warning​","type":1,"pageTitle":"Dev Mode","url":"/dev-mode.html#disable-the-dev-mode-warning","content":" When the dev-mode is enabled, it will print a console.warn() message to the console so that you do not accidentally use the dev-mode in production. To disable this warning you can call the disableWarnings() function. import { disableWarnings } from 'rxdb/plugins/dev-mode'; disableWarnings(); ","version":"Next","tagName":"h2"},{"title":"Disable the tracking iframe​","type":1,"pageTitle":"Dev Mode","url":"/dev-mode.html#disable-the-tracking-iframe","content":" When used in localhost and in the browser, the dev-mode plugin can add a tracking iframe to the DOM. This is used to track the effectiveness of marketing efforts of RxDB. If you have premium access and want to disable this iframe, you can call setPremiumFlag() before creating the database. import { setPremiumFlag } from 'rxdb-premium/plugins/shared'; setPremiumFlag(); ","version":"Next","tagName":"h2"},{"title":"RxDB CRDT Plugin","type":0,"sectionRef":"#","url":"/crdt.html","content":"","keywords":"","version":"Next"},{"title":"RxDB CRDT operations​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#rxdb-crdt-operations","content":" In RxDB, a CRDT operation is defined with NoSQL update operators, like you might know them from MongoDB update operations or the RxDB update plugin. To run the operators, RxDB uses the mingo library. A CRDT operator example: const myCRDTOperation = { // increment the points field by +1 $inc: { points: 1 }, // set the modified field to true $set: { modified: true } }; ","version":"Next","tagName":"h2"},{"title":"Operators​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#operators","content":" At the moment, not all possible operators are implemented in mingo, if you need additional ones, you should make a pull request there. The following operators can be used at this point in time: $min$max$inc$set$unset$push$addToSet$pop$pullAll$rename For the exact definition on how each operator behaves, check out the MongoDB documentation on update operators. ","version":"Next","tagName":"h3"},{"title":"Installation​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#installation","content":" To use CRDTs with RxDB, you need the following: Add the CRDT plugin via addRxPlugin.Add a field to your schema that defines where to store the CRDT operations via getCRDTSchemaPart()Set the crdt options in your schema.Do NOT set a custom conflict handler, the plugin will use its own one. // import the relevant parts from the CRDT plugin import { getCRDTSchemaPart, RxDBcrdtPlugin } from 'rxdb/plugins/crdt'; // add the CRDT plugin to RxDB import { addRxPlugin } from 'rxdb'; addRxPlugin(RxDBcrdtPlugin); // create a database import { createRxDatabase } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const myDatabase = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage() }); // create a schema with the CRDT options const mySchema = { version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 }, points: { type: 'number', maximum: 100, minimum: 0 }, crdts: getCRDTSchemaPart() // use this field to store the CRDT operations }, required: ['id', 'points'], crdt: { // CRDT options field: 'crdts' } } // add a collection await db.addCollections({ users: { schema: mySchema } }); // insert a document const myDocument = await db.users.insert({id: 'alice', points: 0}); // run a CRDT operation that increments the 'points' by one await myDocument.updateCRDT({ ifMatch: { $inc: { points: 1 } } }); ","version":"Next","tagName":"h2"},{"title":"Conditional CRDT operations​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#conditional-crdt-operations","content":" By default, all CRDTs operations will be run to build the current document state. But in many cases, more granular operations are required to better reflect the desired business logic. For these cases, conditional CRDTs can be used. For example if you have a field points with a maximum of 100, you might want to only run the $inc operation, if the points value is less than 100. In an conditional CRDT, you can specify a selector and the operation sets ifMatch and ifNotMatch. At each time the CRDT is applied to the document state, first the selector will run and evaluate which operations path must be used. await myDocument.updateCRDT({ // only if the selector matches, the ifMatch operation will run selector: { age: { $lt: 100 } }, // an operation that runs if the selector matches ifMatch: { $inc: { points: 1 } }, // if the selector does NOT match, you could run a different operation instead ifNotMatch: { // ... } }); ","version":"Next","tagName":"h2"},{"title":"Running multiples operations at once​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#running-multiples-operations-at-once","content":" By default, one CRDT operation is applied to the document in a single database write. To represent more complex logic chains, it might make sense to use multiple CRDTs and write them at once inside of a single atomic document write. For these cases, the updateCRDT() method allows to pass an array of operations. await myDocument.updateCRDT([ { selector: { /** ... **/ }, ifMatch: { /** ... **/ } }, { selector: { /** ... **/ }, ifMatch: { /** ... **/ } }, { selector: { /** ... **/ }, ifMatch: { /** ... **/ } }, { selector: { /** ... **/ }, ifMatch: { /** ... **/ } } ]); ","version":"Next","tagName":"h2"},{"title":"CRDTs on inserts​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#crdts-on-inserts","content":" When CRDTs are enabled with the plugin, all insert operations are automatically mapped as CRDT operation with the $set operator. // Calling RxCollection.insert() await myRxCollection.insert({ id: 'foo' points: 1 }); // is exactly equal to calling insertCRDT() await myRxCollection.insertCRDT({ ifMatch: { $set: { id: 'foo' points: 1 } } }); When the same document is inserted in multiple client instances and then replicated, a conflict will emerge and the insert-CRDTs will overwrite each other in a deterministic order. You can use insertCRDT() to make conditional insert operations with any logic. To check for the previous existence of a document, use the $exists query operation on the primary key of the document. await myRxCollection.insertCRDT({ selector: { // only run if the document did not exist before. id: { $exists: false } }, ifMatch: { // if the document did not exist, insert it $set: { id: 'foo' points: 1 } }, ifNotMatch: { // if document existed already, increment the points by +1 $inc: { points: 1 } } }); ","version":"Next","tagName":"h2"},{"title":"Deleting documents​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#deleting-documents","content":" You can delete a document with a CRDT operation by setting _deleted to true. Calling RxDocument.remove() will do exactly the same when CRDTs are activated. await doc.updateCRDT({ ifMatch: { $set: { _deleted: true } } }); // OR await doc.remove(); ","version":"Next","tagName":"h2"},{"title":"CRDTs with replication​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#crdts-with-replication","content":" CRDT operations are stored inside of a special field besides your 'normal' document fields. When replicating document data with the RxDB replication or the CouchDB replication or even any custom replication, the CRDT operations must be replicated together with the document data as if they would be 'normal' a document property. When any instances makes a write to the document, it is required to update the CRDT operations accordingly. For example if your custom backend updates a document, it must also do that by adding a CRDT operation. In dev-mode RxDB will refuse to store any document data where the document properties do not match the result of the CRDT operations. ","version":"Next","tagName":"h2"},{"title":"Why not automerge.js or yjs?​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#why-not-automergejs-or-yjs","content":" There are already CRDT libraries out there that have been considered to be used with RxDB. The biggest ones are automerge and yjs. The decision was made to not use these but instead go for a more NoSQL way of designing the CRDT format because: Users do not have to learn a new syntax but instead can use the NoSQL query operations which they already know to manipulate the JSON data of a document.RxDB is often used to replicate data with any custom backend on an already existing infrastructure. Using NoSQL operators instead of binary data in CRDTs, makes it easy to implement the exact same logic on these backends so that the backend can also do document writes and still be compliant to the RxDB CRDT plugin. So instead of using YJS or Automerge with a database, you can use RxDB with the CRDT plugin to have a more database specific CRDT approach. This gives you additional features for free such as schema validation or data migration. ","version":"Next","tagName":"h2"},{"title":"When to not use CRDTs​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#when-to-not-use-crdts","content":" CRDT can only be use when your business logic allows to represent document changes via static json operators. If you can have cases where user interaction is required to correctly merge conflicting document states, you cannot use CRDTs for that. Also when CRDTs are used, it is no longer allowed to do non-CRDT writes to the document properties. ","version":"Next","tagName":"h2"},{"title":"CRDT Alternative​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#crdt-alternative","content":" While the CRDT plugin can automatically merge concurrent document updates, it is not the only way to resolve conflicts in RxDB. An alternative approach to CRDT is to use RxDB's built-in conflict handling system. Why use conflict handlers instead of CRDT? Conflict handlers offer a simpler and more flexible way to manage data conflicts. Instead of encoding changes as CRDT operations, you define how RxDB should decide which document version "wins" with plain JavaScript code. This approach is easier to reason about because it works directly with your domain logic. For example, you can compare timestamps, prioritize certain fields, or even involve user interaction to resolve conflicts. Conflict handlers are: Easier to understand: you work with plain document states instead of CRDT operations.Fully customizable: you can define any merge strategy, from simple last-write-wins to complex rule-based logic.Compatible with all data types: unlike CRDTs, which are best suited for numeric or set-based updates.Transparent: you always know which state is being written and why. ","version":"Next","tagName":"h2"},{"title":"Downsides of CRDTs​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#downsides-of-crdts","content":" CRDTs are powerful for automatic conflict-free merging, but they also come with trade-offs: Higher conceptual complexity: CRDTs require understanding of operation semantics, version vectors, and merge determinism.Limited flexibility: you can only express changes that fit the supported JSON-style update operators.Difficult debugging: when merges don't behave as expected, it can be hard to trace the sequence of CRDT operations that led to a state.Overhead for simple cases: if your data rarely conflicts or needs human oversight, using CRDTs can add unnecessary complexity. ","version":"Next","tagName":"h3"},{"title":"When to choose conflict handlers​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#when-to-choose-conflict-handlers","content":" Use conflict handlers as CRDT alternative if: You want full control over merge logic.Your data model includes contextual or user-specific decisions.You prefer a straightforward, rule-based resolution system over automatic merges. Use CRDTs if: Your app performs frequent offline writes that can be merged deterministically.Your data can be represented as additive, numeric, or array-based updates.You want minimal manual intervention during replication. Both methods are first-class citizens in RxDB. CRDTs focus on automatic, deterministic merging, while conflict handlers emphasize clarity, flexibility, and control. ","version":"Next","tagName":"h3"},{"title":"Example: merging different fields with conflict handlers instead of CRDT​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#example-merging-different-fields-with-conflict-handlers-instead-of-crdt","content":" For example, imagine two users edit different fields of the same document at the same time. One updates a name, the other updates a score. A custom conflict handler can merge both changes so no data is lost: const mergeFieldsHandler = { isEqual: (a, b) => JSON.stringify(a) === JSON.stringify(b), resolve: (input) => { return { ...input.realMasterState, name: input.newDocumentState.name ?? input.realMasterState.name, score: Math.max(input.newDocumentState.score, input.realMasterState.score) }; } }; In this example, if the two versions change different properties, the final merged document includes both updates. This kind of logic is often easier to reason about than designing equivalent CRDT operations. ","version":"Next","tagName":"h3"},{"title":"Electron Plugin","type":0,"sectionRef":"#","url":"/electron.html","content":"","keywords":"","version":"Next"},{"title":"RxStorage Electron IpcRenderer & IpcMain​","type":1,"pageTitle":"Electron Plugin","url":"/electron.html#rxstorage-electron-ipcrenderer--ipcmain","content":" To use RxDB in electron, it is recommended to run the RxStorage in the main process and the RxDatabase in the renderer processes. With the rxdb electron plugin you can create a remote RxStorage and consume it from the renderer process. To do this in a convenient way, the RxDB electron plugin provides the helper functions exposeIpcMainRxStorage and getRxStorageIpcRenderer. Similar to the Worker RxStorage, these wrap any other RxStorage once in the main process and once in each renderer process. In the renderer you can then use the storage to create a RxDatabase which communicates with the storage of the main process to store and query data. note nodeIntegration must be enabled in Electron. // main.js const { exposeIpcMainRxStorage } = require('rxdb/plugins/electron'); const { getRxStorageMemory } = require('rxdb/plugins/storage-memory'); app.on('ready', async function () { exposeIpcMainRxStorage({ key: 'main-storage', storage: getRxStorageMemory(), ipcMain: electron.ipcMain }); }); // renderer.js const { getRxStorageIpcRenderer } = require('rxdb/plugins/electron'); const { getRxStorageMemory } = require('rxdb/plugins/storage-memory'); const db = await createRxDatabase({ name, storage: getRxStorageIpcRenderer({ key: 'main-storage', ipcRenderer: electron.ipcRenderer }) }); /* ... */ ","version":"Next","tagName":"h2"},{"title":"Related​","type":1,"pageTitle":"Electron Plugin","url":"/electron.html#related","content":" Comparison of Electron Databases ","version":"Next","tagName":"h2"},{"title":"Downsides of Local First / Offline First","type":0,"sectionRef":"#","url":"/downsides-of-offline-first.html","content":"","keywords":"","version":"Next"},{"title":"It only works with small datasets​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#it-only-works-with-small-datasets","content":" Making data available offline means it must be loaded from the server and then stored at the clients device. You need to load the full dataset on the first pageload and on every ongoing load you need to download the new changes to that set. While in theory you could download in infinite amount of data, in practice you have a limit how long the user can wait before having an up-to-date state. You want to display chat messages like Whatsapp? No problem. Syncing all the messages a user could write, can be done with a few HTTP requests. Want to make a tool that displays server logs? Good luck downloading terabytes of data to the client just to search for a single string. This will not work. Besides the network usage, there is another limit for the size of your data. In browsers you have some options for storage: Cookies, Localstorage, WebSQL and IndexedDB. Because Cookies and Localstorage is slow and WebSQL is deprecated, you will use IndexedDB. The limit of how much data you can store in IndexedDB depends on two factors: Which browser is used and how much disc space is left on the device. You can assume that at least a couple of hundred megabytes are available at least. The maximum is potentially hundreds of gigabytes or more, but the browser implementations vary. Chrome allows the browser to use up to 60% of the total disc space per origin. Firefox allows up to 50%. But on safari you can only store up to 1GB and the browser will prompt the user on each additional 200MB increment. The problem is, that you have no chance to really predict how much data can be stored. So you have to make assumptions that are hopefully true for all of your users. Also, you have no way to increase that space like you would add another hard drive to your backend server. Once your clients reach the limit, you likely have to rewrite big parts of your applications. UPDATE (2023): Newer versions of browsers can store way more data, for example firefox stores up to 10% of the total disk size. For an overview about how much can be stored, read this guide ","version":"Next","tagName":"h2"},{"title":"Browser storage is not really persistent​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#browser-storage-is-not-really-persistent","content":" When data is stored inside IndexedDB or one of the other storage APIs, it cannot be trusted to stay there forever. Apple for example deletes the data when the website was not used in the last 7 days. The other browsers also have logic to clean up the stored data, and in the end the user itself could be the one that deletes the browsers local data. The most common way to handle this, is to replicate everything from the backend to the client again. Of course, this does not work for state that is not stored at the backend. So if you assume you can store the users private data inside the browser in a secure way, you are wrong. ","version":"Next","tagName":"h2"},{"title":"There can be conflicts​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#there-can-be-conflicts","content":" Imagine two of your users modify the same JSON document, while both are offline. After they go online again, their clients replicate the modified document to the server. Now you have two conflicting versions of the same document, and you need a way to determine how the correct new version of that document should look like. This process is called conflict resolution. The default in many offline first databases is a deterministic conflict resolution strategy. Both conflicting versions of the document are kept in the storage and when you query for the document, a winner is determined by comparing the hashes of the document and only the winning document is returned. Because the comparison is deterministic, all clients and servers will always pick the same winner. This kind of resolution only works when it is not that important that one of the document changes gets dropped. Because conflicts are rare, this might be a viable solution for some use cases. A better resolution can be applied by listening to the changestream of the database. The changestream emits an event each time a write happens to the database. The event contains information about the written document and also a flag if there is a conflicting version. For each event with a conflict, you fetch all versions for that document and create a new document that contains the winning state. With that you can implement pretty complex conflict resolution strategies, but you have to manually code it for each collection of documents. Instead of the solving conflict once at every client, it can be made a bit easier by solely relying on the backend. This can be done when all of your clients replicate with the same single backend server. With RxDB's Graphql Replication each client side change is sent to the server where conflicts can be resolved and the winning document can be sent back to the clients. Sometimes there is no way to solve a conflict with code. If your users edit text based documents or images, often only the users themselves can decide how the winning revision has to look. For these cases, you have to implement complex UI parts where the users can inspect the conflict and manage its resolution. You do not have to handle conflicts if they cannot happen in the first place. You can achieve that by designing a write only database where existing documents cannot be touched. Instead of storing the current state in a single document, you store all the events that lead to the current state. Sometimes called the "everything is a delta" strategy, others would call it Event Sourcing. Like an accountant that does not need an eraser, you append all changes and afterwards aggregate the current state at the client. // create one new document for each change to the users balance {id: new Date().toJSON(), change: 100} // balance increased by $100 {id: new Date().toJSON(), change: -50} // balance decreased by $50 {id: new Date().toJSON(), change: 200} // balance increased by $200 There is this thing called conflict-free replicated data type, short CRDT. Using a CRDT library like automerge will magically solve all of your conflict problems. Until you use it in production where you observe that implementing CRDTs has basically the same complexity as implementing conflict resolution strategies. ","version":"Next","tagName":"h2"},{"title":"Realtime is a lie​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#realtime-is-a-lie","content":" So you replicate stuff between the clients and your backend. Each change on one side directly changes the state of the other sides in realtime. But this "realtime" is not the same as in realtime computing. In the offline first world, the word realtime was introduced by firebase and is more meant as a marketing slogan than a technical description. There is an internet between your backend and your clients and everything you do on one machine takes at least once the latency until it can affect anything on the other machines. You have to keep this in mind when you develop anything where the timing is important, like a multiplayer game or a stock trading app. Even when you run a query against the local database, there is no "real" realtime. Client side databases run on JavaScript and JavaScript runs on a single CPU that might be partially blocked because the user is running some background processes. So you can never guarantee a response deadline which violates the time constraint of realtime computing. ","version":"Next","tagName":"h2"},{"title":"Eventual consistency​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#eventual-consistency","content":" An offline first app does not have a single source of truth. There is a source on the backend, one on the own client, and also each other client has its own definition of truth. At the moment your user starts the app, the local state is hopefully already replicated with the backend and all other clients. But this does not have to be true, the states can have converged and you have to plan for that. The user could update a document based on wrong assumptions because it was not fully replicated at that point in time because the user is offline. A good way to handle this problem is to show the replication state in the UI and tell the user when the replication is running, stopped, paused or finished. And some data is just too important to be "eventual consistent". Create a wire transfer in your online banking app while you are offline. You keep the smartphone laying at your night desk and when you use again in the next morning, it goes online and replicates the transaction. No thank you, do not use offline first for these kinds of things, or at least you have to display the replication state of each document in the UI. ","version":"Next","tagName":"h2"},{"title":"Permissions and authentication​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#permissions-and-authentication","content":" Every offline first app that goes beyond a prototype, does likely not have the same global state for all of its users. Each user has a different set of documents that are allowed to be replicated or seen by the user. So you need some kind of authentication and permission handling to divide the documents. The easy way is to just create one database for each user on the backend and only allow to replicate that one. Creating that many databases is not really a problem with for example CouchDB, and it makes permission handling easy. But as soon as you want to query all of your data in the backend, it will bite back. Your data is not at a single place, it is distributed between all of the user specific databases. This becomes even more complex as soon as you store information together with the documents that is not allowed to be seen by outsiders. You not only have to decide which documents to replicate, but also which fields of them. So what you really want is a single datastore in the backend and then replicate only the allowed document parts to each of the users. This always requires you to implement your custom replication endpoint like what you do with RxDBs GraphQL Replication. ","version":"Next","tagName":"h2"},{"title":"You have to migrate the client database​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#you-have-to-migrate-the-client-database","content":" While developing your app, sooner or later you want to change the data layout. You want to add some new fields to documents or change the format of them. So you have to update the database schema and also migrate the stored documents. With 'normal' applications, this is already hard enough and often dangerous. You wait until midnight, stop the webserver, make a database backup, deploy the new schema and then you hope that nothing goes wrong while it updates that many documents. With offline first applications, it is even more fun. You do not only have to migrate your local backend database, you also have to provide a migration strategy for all of these client databases out there. And you also cannot migrate everything at the same time. The clients can only migrate when the new code was updated from the appstore or the user visited your website again. This could be today or in a few weeks. ","version":"Next","tagName":"h2"},{"title":"Performance is not native​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#performance-is-not-native","content":" When you create a web based offline first app, you cannot store data directly on the users filesystem. In fact there are many layers between your JavaScript code and the filesystem of the operation system. Let's say you insert a document in RxDB: You call the RxDB API to validate and store the dataRxDB calls the underlying RxStorage, for example PouchDB.Pouchdb calls its underlying storage adapterThe storage adapter calls IndexedDBThe browser runs its internal handling of the IndexedDB APIIn most browsers IndexedDB is implemented on top of SQLiteSQLite calls the OS to store the data in the filesystem All these layers are abstractions. They are not build for exactly that one use case, so you lose some performance to tunnel the data through the layer itself, and you also lose some performance because the abstraction does not exactly provide the functions that are needed by the layer above and it will overfetch data. You will not find a benchmark comparison between how many transactions per second you can run on the browser compared to a server based database. Because it makes no sense to compare them. Browsers are slower, JavaScript is slower. Is it fast enough? What you really care about is "Is it fast enough?". For most use cases, the answer is yes. Offline first apps are UI based and you do not need to process a million transactions per second, because your user will not click the save button that often. "Fast enough" means that the data is processed in under 16 milliseconds so that you can render the updated UI in the next frame. This is of course not true for all use cases, so you better think about the performance limit before starting with the implementation. ","version":"Next","tagName":"h2"},{"title":"Nothing is predictable​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#nothing-is-predictable","content":" You have a PostgreSQL database and run a query over 1000ths of rows, which takes 200 milliseconds. Works great, so you now want to do something similar at the client device in your offline first app. How long does it take? You cannot know because people have different devices, and even equal devices have different things running in the background that slow the CPUs. So you cannot predict performance and as described above, you cannot even predict the storage limit. So if your app does heavy data analytics, you might better run everything on the backend and just send the results to the client. ","version":"Next","tagName":"h2"},{"title":"There is no relational data​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#there-is-no-relational-data","content":" I started creating RxDB many years ago and while still maintaining it, I often worked with all these other offline first databases out there. RxDB and all of these other ones, are based on some kind of document databases similar to NoSQL. Often people want to have a relational database like the SQL one they use at the backend. So why are there no real relations in offline first databases? I could answer with these arguments like how JavaScript works better with document based data, how performance is better when having no joins or even how NoSQL queries are more composable. But the truth is, everything is NoSQL because it makes replication easy. An SQL query that mutates data in different tables based on some selects and joins, cannot be partially replicated without breaking the client. You have foreign keys that point to other rows and if these rows are not replicated yet, you have a problem. To implement a robust Sync Engine for relational data, you need some stuff like a reliable atomic clock and you have to block queries over multiple tables while a transaction replicated. Watch this guy implementing offline first replication on top of SQLite or read this discussion about implementing offline first in supabase. So creating replication for an SQL offline first database is way more work than just adding some network protocols on top of PostgreSQL. It might not even be possible for clients that have no reliable clock. ","version":"Next","tagName":"h2"},{"title":"Electron Database - RxDB with different storage for SQLite, Filesystem and In-Memory","type":0,"sectionRef":"#","url":"/electron-database.html","content":"","keywords":"","version":"Next"},{"title":"Databases for Electron​","type":1,"pageTitle":"Electron Database - RxDB with different storage for SQLite, Filesystem and In-Memory","url":"/electron-database.html#databases-for-electron","content":" An Electron runtime can be divided into two parts: The "main" process which is a Node.js JavaScript process that runs without a UI in the background.One or multiple "renderer" processes that consist of a Chrome browser engine and runs the user interface. Each renderer process represents one "browser tab". This is important to understand because choosing the right database depends on your use case and on which of these JavaScript runtimes you want to keep the data. ","version":"Next","tagName":"h2"},{"title":"Server Side Databases in Electron.js​","type":1,"pageTitle":"Electron Database - RxDB with different storage for SQLite, Filesystem and In-Memory","url":"/electron-database.html#server-side-databases-in-electronjs","content":" Because Electron runs on a desktop computer, you might think that it should be possible to use a common "server" database like MySQL, PostgreSQL or MongoDB. In theory, you could ship the correct database server binaries with your electron application and start a process on the client's device that exposes a port to the database that can be consumed by Electron. In practice, this is not a viable way to go because shipping the correct binaries and opening ports is way to complicated and troublesome. Instead you should use a database that can be bundled and run inside of Electron, either in the main or in the renderer process. ","version":"Next","tagName":"h3"},{"title":"Localstorage / IndexedDB / WebSQL as alternatives to SQLite in Electron​","type":1,"pageTitle":"Electron Database - RxDB with different storage for SQLite, Filesystem and In-Memory","url":"/electron-database.html#localstorage--indexeddb--websql-as-alternatives-to-sqlite-in-electron","content":" Because Electron uses a common Chrome web browser in the renderer process, you can access the common Web Storage APIs like Localstorage, IndexedDB and WebSQL. This is easy to set up and storing small sets of data can be achieved in a short span of time. But as soon as your application goes beyond a simple todo-app, there are multiple obstacles that come in your way. One thing is the bad multi-tab support. If you have more than one renderer process, it becomes hard to manage database writes between them. Each browser tab could modify the database state while the others do not know of the changes and keep an outdated UI. Another thing is performance. IndexedDB is slow, mostly because it has to go through layers of browser security and abstractions. Storing and querying a lot of data might become your performance bottleneck. Localstorage and WebSQL are even slower, by the way. Using these Web Storage APIs is generally only recommended when you know for sure that there will be always only one rendering process and performance is not that relevant. The main reason for that is the security- and abstraction layers that write- and read operations have to go through when using the browsers IndexedDB API. So instead of using IndexedDB in Electron in the renderer process, you should use something that runs in the "main" process in Node.js like the Filesystem RxStorage or the In Memory RxStorage. ","version":"Next","tagName":"h3"},{"title":"RxDB​","type":1,"pageTitle":"Electron Database - RxDB with different storage for SQLite, Filesystem and In-Memory","url":"/electron-database.html#rxdb","content":" RxDB is a NoSQL database for JavaScript applications. It has many features that come in handy when RxDB is used with UI based applications like your Electron app. For example, it is able to subscribe to query results of single fields of documents. It has encryption and compression features and most important it has a battle tested Sync Engine that can be used to do a realtime sync with your backend. Because of the flexible storage layer of RxDB, there are many options on how to use it with Electron: The memory RxStorage that stores the data inside of the JavaScript memory without persistenceThe SQLite RxStorageThe IndexedDB RxStorageThe LocalStorage RxStorageThe Dexie.js RxStorageThe Node.js Filesystem It is recommended to use the SQLite RxStorage because it has the best performance and is the easiest to set up. However it is part of the 👑 Premium Plugins which must be purchased, so to try out RxDB with Electron, you might want to use one of the other options. To start with RxDB, I would recommend using the LocalStorage RxStorage in the renderer processes. Because RxDB is able to broadcast the database state between browser tabs, having multiple renderer processes is not a problem like it would be when you use plain IndexedDB without RxDB. In production, you would always run the RxStorage in the main process with the RxStorage Electron IpcRenderer & IpcMain plugins. First, you have to install all dependencies via npm install rxdb rxjs. Then you can assemble the RxStorage and create a database with it: import { createRxDatabase } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; // create database const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageLocalstorage() }); // create collections const collections = await myRxDatabase.addCollections({ humans: { /* ... */ } }); // insert document await collections.humans.insert({id: 'foo', name: 'bar'}); // run a query const result = await collections.humans.find({ selector: { name: 'bar' } }).exec(); // observe a query await collections.humans.find({ selector: { name: 'bar' } }).$.subscribe(result => {/* ... */}); For better performance in the renderer tab, you can later switch to the IndexedDB RxStorage. But in production, it is recommended to use the SQLite RxStorage or the Filesystem RxStorage in the main process so that database operations do not block the rendering of the UI. To learn more about using RxDB with Electron, you might want to check out this example project. ","version":"Next","tagName":"h3"},{"title":"SQLite in Electron.js without RxDB​","type":1,"pageTitle":"Electron Database - RxDB with different storage for SQLite, Filesystem and In-Memory","url":"/electron-database.html#sqlite-in-electronjs-without-rxdb","content":" SQLite is a SQL based relational database written in the C programming language that was crafted to be embedded inside of applications and stores data locally. Operations are written in the SQL query language similar to the PostgreSQL syntax. Using SQLite in Electron is not possible in the renderer process, only in the main process. To communicate data operations between your main and your renderer processes, you have to use either @electron/remote (not recommended) or the ipcRenderer (recommended). So you start up SQLite in your main process and whenever you want to read or write data, you send the SQL queries to the main process and retrieve the result back as JSON data. To install SQLite, use the SQLite3 package which is a native Node.js module. You also need the @electron/rebuild package to rebuild the SQLite module against the currently installed Electron version. Install them with npm install sqlite3 @electron/rebuild. Then you can rebuild SQLite with ./node_modules/.bin/electron-rebuild -f -w sqlite3In the JavaScript code of your main process you can now create a database: const sqlite3 = require('sqlite3'); const db = new sqlite3.Database('/path/to/database/file.db'); // create a table and insert a row db.serialize(() => { db.run("CREATE TABLE Users (name, lastName)"); db.run("INSERT INTO Users VALUES (?, ?)", ['foo', 'bar']); }); Also you have to set up the ipcRenderer so that message from the renderer process are handled: ipcMain.handle('db-query', async (event, sqlQuery) => { return new Promise(res => { db.all(sqlQuery, (err, rows) => { res(rows); }); }); }); In your renderer process, you can now call the ipcHandler and fetch data from SQLite: const rows = await ipcRenderer.invoke('db-query', "SELECT * FROM Users"); The downside of SQLite (or SQL in general) is that it is lacking many features that are handful when using a database together with UI based applications. It is not possible to observe queries or document fields and there is no replication method to sync data with a server. This makes SQLite a good solution when you just want to store data on the client or process expensive SQL queries on the server, but it is not suitable for more complex operations like two-way replication, encryption, compression and so on. Also developer helpers like TypeScript type safety are totally out of reach. ","version":"Next","tagName":"h3"},{"title":"Follow up​","type":1,"pageTitle":"Electron Database - RxDB with different storage for SQLite, Filesystem and In-Memory","url":"/electron-database.html#follow-up","content":" Learn how to use RxDB as database in electron with the Quickstart Tutorial.Check out the RxDB Electron exampleThere is a followup list of other client side database alternatives that you can try to use with Electron. ","version":"Next","tagName":"h2"},{"title":"🔒 Encrypted Local Storage with RxDB","type":0,"sectionRef":"#","url":"/encryption.html","content":"","keywords":"","version":"Next"},{"title":"Querying encrypted data​","type":1,"pageTitle":"🔒 Encrypted Local Storage with RxDB","url":"/encryption.html#querying-encrypted-data","content":" RxDB handles the encryption and decryption of data internally. This means that when you work with a RxDocument, you can access the properties of the document just like you would with normal, unencrypted data. RxDB automatically decrypts the data for you when you retrieve it, making it transparent to your application code. This means the encryption works with all RxStorage like SQLite, IndexedDB, OPFS and so on. However, there's a limitation when it comes to querying encrypted fields. Encrypted fields cannot be used as operators in queries. This means you cannot perform queries like "find all documents where the encrypted field equals a certain value." RxDB does not expose the encrypted data in a way that allows direct querying based on the encrypted content. To filter or search for documents based on the contents of encrypted fields, you would need to first decrypt the data and then perform the query, which might not be efficient or practical in some cases. You could however use the memory mapped RxStorage to replicate the encrypted documents into a non-encrypted in-memory storage and then query them like normal. ","version":"Next","tagName":"h2"},{"title":"Password handling​","type":1,"pageTitle":"🔒 Encrypted Local Storage with RxDB","url":"/encryption.html#password-handling","content":" RxDB does not define how you should store or retrieve the encryption password. It only requires you to provide the password on database creation which grants you flexibility in how you manage encryption passwords. You could ask the user on app-start to insert the password, or you can retrieve the password from your backend on app start (or revoke access by no longer providing the password). ","version":"Next","tagName":"h2"},{"title":"Asymmetric encryption​","type":1,"pageTitle":"🔒 Encrypted Local Storage with RxDB","url":"/encryption.html#asymmetric-encryption","content":" The encryption plugin itself uses symmetric encryption with a password to guarantee best performance when reading and storing data. It is not able to do Asymmetric encryption by itself. If you need Asymmetric encryption with a private/publicKey, it is recommended to encrypted the password itself with the asymmetric keys and store the encrypted password beside the other data. On app-start you can decrypt the password with the private key and use the decrypted password in the RxDB encryption plugin ","version":"Next","tagName":"h2"},{"title":"Using the RxDB Encryption Plugins​","type":1,"pageTitle":"🔒 Encrypted Local Storage with RxDB","url":"/encryption.html#using-the-rxdb-encryption-plugins","content":" RxDB currently has two plugins for encryption: The free encryption-crypto-js plugin that is based on the AES algorithm of the crypto-js libraryThe 👑 premiumencryption-web-crypto plugin that is based on the native Web Crypto API which makes it faster and more secure to use. Document inserts are about 10x faster compared to crypto-js and it has a smaller build size because it uses the browsers API instead of bundling an npm module. An RxDB encryption plugin is a wrapper around any other RxStorage. 1 Wrap your RxStorage with the encryption​ import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; // wrap the normal storage with the encryption plugin const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ storage: getRxStorageLocalstorage() }); 2 Create a RxDatabase with the wrapped storage​ Also you have to set a password when creating the database. The format of the password depends on which encryption plugin is used. import { createRxDatabase } from 'rxdb/plugins/core'; // create an encrypted database const db = await createRxDatabase({ name: 'mydatabase', storage: encryptedStorage, password: 'sudoLetMeIn' }); 3 Create an RxCollection with an encrypted property​ To define a field as being encrypted, you have to add it to the encrypted fields list in the schema. const schema = { version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 }, secret: { type: 'string' }, }, required: ['id'] encrypted: ['secret'] }; await db.addCollections({ myDocuments: { schema } }) ","version":"Next","tagName":"h2"},{"title":"Using Web-Crypto API​","type":1,"pageTitle":"🔒 Encrypted Local Storage with RxDB","url":"/encryption.html#using-web-crypto-api","content":" For professionals, we have the web-crypto👑 premium plugin which is faster and more secure: import { wrappedKeyEncryptionWebCryptoStorage, createPassword } from 'rxdb-premium/plugins/encryption-web-crypto'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; // wrap the normal storage with the encryption plugin const encryptedIndexedDbStorage = wrappedKeyEncryptionWebCryptoStorage({ storage: getRxStorageIndexedDB() }); const myPasswordObject = { // Algorithm can be oneOf: 'AES-CTR' | 'AES-CBC' | 'AES-GCM' algorithm: 'AES-CTR', password: 'myRandomPasswordWithMin8Length' }; // create an encrypted database const db = await createRxDatabase({ name: 'mydatabase', storage: encryptedIndexedDbStorage, password: myPasswordObject }); /* ... */ ","version":"Next","tagName":"h2"},{"title":"Changing the password​","type":1,"pageTitle":"🔒 Encrypted Local Storage with RxDB","url":"/encryption.html#changing-the-password","content":" The password is set database specific and it is not possible to change the password of a database. Opening an existing database with a different password will throw an error. To change the password you can either: Use the storage migration plugin to migrate the database state into a new database.Store a randomly created meta-password in a different RxDatabase as a value of a local document. Encrypt the meta password with the actual user password and read it out before creating the actual database. ","version":"Next","tagName":"h2"},{"title":"Encrypted attachments​","type":1,"pageTitle":"🔒 Encrypted Local Storage with RxDB","url":"/encryption.html#encrypted-attachments","content":" To store the attachments data encrypted, you have to set encrypted: true in the attachments property of the schema. const mySchema = { version: 0, type: 'object', properties: { /* ... */ }, attachments: { encrypted: true // if true, the attachment-data will be encrypted with the db-password } }; ","version":"Next","tagName":"h2"},{"title":"Encryption and workers​","type":1,"pageTitle":"🔒 Encrypted Local Storage with RxDB","url":"/encryption.html#encryption-and-workers","content":" If you are using Worker RxStorage or SharedWorker RxStorage with encryption, it's recommended to run encryption inside of the worker. Encryption can be very cpu intensive and would take away CPU-power from the main thread which is the main reason to use workers. You do not need to worry about setting the password inside of the worker. The password will be set when calling createRxDatabase from the main thread, and will be passed internally to the storage in the worker automatically. ","version":"Next","tagName":"h2"},{"title":"Fulltext Search","type":0,"sectionRef":"#","url":"/fulltext-search.html","content":"","keywords":"","version":"Next"},{"title":"Benefits of using a local fulltext search​","type":1,"pageTitle":"Fulltext Search","url":"/fulltext-search.html#benefits-of-using-a-local-fulltext-search","content":" Efficient Search and Indexing The plugin utilizes the FlexSearch library, known for its speed and memory efficiency. This ensures that search operations are performed quickly, even with large datasets. The search engine can handle multi-field queries, partial matching, and complex search operations, providing users with highly relevant results. Local Data Indexing With the plugin, all search operations are performed on the local data stored within the RxDB collections. This means that users can execute fulltext search queries without the need for an external server or database, which is especially beneficial for offline-first applications. The local indexing ensures that search queries are executed quickly, reducing the latency typically associated with remote database queries. Also when used in multiple browser tabs, it is ensured that through Leader Election, only exactly one tabs is doing the work of indexing without having an overhead in the other browser tabs. Real-time Indexing The plugin integrates seamlessly with RxDB's reactive nature. Every time a document is written to an RxCollection, an indexer updates the fulltext search index in real-time. This ensures that search results are always up-to-date, reflecting the most current state of the data without requiring manual reindexing. Persistent indexing The fulltext search index is efficiently persisted within the RxCollection, ensuring that the index remains intact across app restarts. When documents are added or updated in the collection, the index is incrementally updated in real-time, meaning only the changes are processed rather than reindexing the entire dataset. This incremental approach not only optimizes performance but also ensures that subsequent app launches are quick, as there's no need to reindex all the data from scratch, making the search feature both reliable and fast from the moment the app starts. When using an encrypted storage the index itself and incremental updates to it are stored fully encrypted and are only decrypted in-memory. Complex Query Support The FlexSearch-based plugin allows for sophisticated search queries, including multi-term and contextual searches. Users can perform complex searches that go beyond simple keyword matching, enabling more advanced use cases like searching for documents with specific phrases, relevance-based sorting, or even phonetic matching. Offline-First Support and Privacy As RxDB is designed with offline-first applications in mind, the fulltext search plugin supports this paradigm by ensuring that all search operations can be performed offline. This is crucial for applications that need to function in environments with intermittent or no internet connectivity, offering users a consistent and reliable search experience with zero latency. ","version":"Next","tagName":"h2"},{"title":"Using the RxDB Fulltext Search​","type":1,"pageTitle":"Fulltext Search","url":"/fulltext-search.html#using-the-rxdb-fulltext-search","content":" The flexsearch search is a RxDB Premium Package 👑 which must be purchased and imported from the rxdb-premium npm package. Step 1: Add the RxDBFlexSearchPlugin to RxDB. import { RxDBFlexSearchPlugin } from 'rxdb-premium/plugins/flexsearch'; import { addRxPlugin } from 'rxdb/plugins/core'; addRxPlugin(RxDBFlexSearchPlugin); Step 2: Create a RxFulltextSearch instance on top of a collection with the addFulltextSearch() function. import { addFulltextSearch } from 'rxdb-premium/plugins/flexsearch'; const flexSearch = await addFulltextSearch({ // unique identifier. Used to store metadata and continue indexing on restarts/reloads. identifier: 'my-search', // The source collection on whose documents the search is based on collection: myRxCollection, /** * Transforms the document data to a given searchable string. * This can be done by returning a single string property of the document * or even by concatenating and transforming multiple fields like: * doc => doc.firstName + ' ' + doc.lastName */ docToString: doc => doc.firstName, /** * (Optional) * Amount of documents to index at once. * See https://rxdb.info/rx-pipeline.html */ batchSize: number; /** * (Optional) * lazy: Initialize the in memory fulltext index at the first search query. * instant: Directly initialize so that the index is already there on the first query. * Default: 'instant' */ initialization: 'instant', /** * (Optional) * @link https://github.com/nextapps-de/flexsearch#index-options */ indexOptions: {}, }); Step 3: Run a search operation: // find all documents whose searchstring contains "foobar" const foundDocuments = await flexSearch.find('foobar'); /** * You can also use search options as second parameter * @link https://github.com/nextapps-de/flexsearch#search-options */ const foundDocuments = await flexSearch.find('foobar', { limit: 10 }); ","version":"Next","tagName":"h2"},{"title":"Install RxDB","type":0,"sectionRef":"#","url":"/install.html","content":"","keywords":"","version":"Next"},{"title":"npm​","type":1,"pageTitle":"Install RxDB","url":"/install.html#npm","content":" To install the latest release of rxdb and its dependencies and save it to your package.json, run: npm i rxdb --save ","version":"Next","tagName":"h2"},{"title":"peer-dependency​","type":1,"pageTitle":"Install RxDB","url":"/install.html#peer-dependency","content":" You also need to install the peer-dependency rxjs if you have not installed it before. npm i rxjs --save ","version":"Next","tagName":"h2"},{"title":"polyfills​","type":1,"pageTitle":"Install RxDB","url":"/install.html#polyfills","content":" RxDB is coded with es8 and transpiled to es5. This means you have to install polyfills to support older browsers. For example you can use the babel-polyfills with: npm i @babel/polyfill --save If you need polyfills, you have to import them in your code. import '@babel/polyfill'; ","version":"Next","tagName":"h2"},{"title":"Polyfill the global variable​","type":1,"pageTitle":"Install RxDB","url":"/install.html#polyfill-the-global-variable","content":" When you use RxDB with angular or other webpack based frameworks, you might get the error Uncaught ReferenceError: global is not defined. This is because some dependencies of RxDB assume a Node.js-specific global variable that is not added to browser runtimes by some bundlers. You have to add them by your own, like we do here. (window as any).global = window; (window as any).process = { env: { DEBUG: undefined }, }; ","version":"Next","tagName":"h2"},{"title":"Project Setup and Configuration​","type":1,"pageTitle":"Install RxDB","url":"/install.html#project-setup-and-configuration","content":" In the examples folder you can find CI tested projects for different frameworks and use cases, while in the /config folder base configuration files for Webpack, Rollup, Mocha, Karma, Typescript are exposed. Consult package.json for the versions of the packages supported. ","version":"Next","tagName":"h2"},{"title":"Installing the latest RxDB build​","type":1,"pageTitle":"Install RxDB","url":"/install.html#installing-the-latest-rxdb-build","content":" If you need the latest development state of RxDB, add it as git-dependency into your package.json. "dependencies": { "rxdb": "git+https://git@github.com/pubkey/rxdb.git#commitHash" } Replace commitHash with the hash of the latest build-commit. ","version":"Next","tagName":"h2"},{"title":"Import​","type":1,"pageTitle":"Install RxDB","url":"/install.html#import","content":" To import rxdb, add this to your JavaScript file to import the default bundle that contains the RxDB core: import { createRxDatabase, /* ... */ } from 'rxdb'; ","version":"Next","tagName":"h2"},{"title":"Key Compression","type":0,"sectionRef":"#","url":"/key-compression.html","content":"","keywords":"","version":"Next"},{"title":"Enable key compression​","type":1,"pageTitle":"Key Compression","url":"/key-compression.html#enable-key-compression","content":" The key compression plugin is a wrapper around any other RxStorage. 1 Wrap your RxStorage with the key compression plugin​ import { wrappedKeyCompressionStorage } from 'rxdb/plugins/key-compression'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const storageWithKeyCompression = wrappedKeyCompressionStorage({ storage: getRxStorageLocalstorage() }); 2 Create an RxDatabase​ import { createRxDatabase } from 'rxdb/plugins/core'; const db = await createRxDatabase({ name: 'mydatabase', storage: storageWithKeyCompression }); 3 Create a compressed RxCollection​ const mySchema = { keyCompression: true, // set this to true, to enable the keyCompression version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 // <- the primary key must have set maxLength } /* ... */ } }; await db.addCollections({ docs: { schema: mySchema } }); ","version":"Next","tagName":"h2"},{"title":"Leader-Election","type":0,"sectionRef":"#","url":"/leader-election.html","content":"","keywords":"","version":"Next"},{"title":"Use-case-example​","type":1,"pageTitle":"Leader-Election","url":"/leader-election.html#use-case-example","content":" Imagine we have a website which displays the current temperature of the visitors location in various charts, numbers or heatmaps. To always display the live-data, the website opens a websocket to our API-Server which sends the current temperature every 10 seconds. Using the way most sites are currently build, we can now open it in 5 browser-tabs and it will open 5 websockets which send data 6*5=30 times per minute. This will not only waste the power of your clients device, but also wastes your api-servers resources by opening redundant connections. ","version":"Next","tagName":"h2"},{"title":"Solution​","type":1,"pageTitle":"Leader-Election","url":"/leader-election.html#solution","content":" The solution to this redundancy is the usage of a leader-election-algorithm which makes sure that always exactly one tab is managing the remote-data-access. The managing tab is the elected leader and stays leader until it is closed. No matter how many tabs are opened or closed, there must be always exactly one leader. You could now start implementing a messaging-system between your browser-tabs, hand out which one is leader, solve conflicts and reassign a new leader when the old one 'dies'. Or just use RxDB which does all these things for you. ","version":"Next","tagName":"h2"},{"title":"Add the leader election plugin​","type":1,"pageTitle":"Leader-Election","url":"/leader-election.html#add-the-leader-election-plugin","content":" To enable the leader election, you have to add the leader-election plugin. import { addRxPlugin } from 'rxdb'; import { RxDBLeaderElectionPlugin } from 'rxdb/plugins/leader-election'; addRxPlugin(RxDBLeaderElectionPlugin); ","version":"Next","tagName":"h2"},{"title":"Code-example​","type":1,"pageTitle":"Leader-Election","url":"/leader-election.html#code-example","content":" To make it easy, here is an example where the temperature is pulled every ten seconds and saved to a collection. The pulling starts at the moment where the opened tab becomes the leader. import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'weatherDB', storage: getRxStorageLocalstorage(), password: 'myPassword', multiInstance: true }); await db.addCollections({ temperature: { schema: mySchema } }); db.waitForLeadership() .then(() => { console.log('Long lives the king!'); // <- runs when db becomes leader setInterval(async () => { const temp = await fetch('https://example.com/api/temp/'); db.temperature.insert({ degrees: temp, time: new Date().getTime() }); }, 1000 * 10); }); ","version":"Next","tagName":"h2"},{"title":"Handle Duplicate Leaders​","type":1,"pageTitle":"Leader-Election","url":"/leader-election.html#handle-duplicate-leaders","content":" On rare occasions, it can happen that more than one leader is elected. This can happen when the CPU is on 100% or for any other reason the JavaScript process is fully blocked for a long time. For most cases this is not really problem because on duplicate leaders, both browser tabs replicate with the same backend anyways. To handle the duplicate leader event, you can access the leader elector and set a handler: import { getLeaderElectorByBroadcastChannel } from 'rxdb/plugins/leader-election'; const leaderElector = getLeaderElectorByBroadcastChannel(broadcastChannel); leaderElector.onduplicate = async () => { // Duplicate leader detected -> reload the page. location.reload(); } ","version":"Next","tagName":"h2"},{"title":"Live-Example​","type":1,"pageTitle":"Leader-Election","url":"/leader-election.html#live-example","content":" In this example the leader is marked with the crown ♛ ","version":"Next","tagName":"h2"},{"title":"Try it out​","type":1,"pageTitle":"Leader-Election","url":"/leader-election.html#try-it-out","content":" Run the angular-example where the leading tab is marked with a crown on the top-right-corner. ","version":"Next","tagName":"h2"},{"title":"Notice​","type":1,"pageTitle":"Leader-Election","url":"/leader-election.html#notice","content":" The leader election is implemented via the broadcast-channel module. The leader is elected between different processes on the same javascript-runtime. Like multiple tabs in the same browser or multiple NodeJs-processes on the same machine. It will not run between different replicated instances. ","version":"Next","tagName":"h2"},{"title":"RxDB Logger Plugin","type":0,"sectionRef":"#","url":"/logger.html","content":"","keywords":"","version":"Next"},{"title":"Using the logger plugin​","type":1,"pageTitle":"RxDB Logger Plugin","url":"/logger.html#using-the-logger-plugin","content":" The logger is a wrapper that can be wrapped around any RxStorage. Once your storage is wrapped, you can create your database with the wrapped storage and the logging will automatically happen. import { wrappedLoggerStorage } from 'rxdb-premium/plugins/logger'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; // wrap a storage with the logger const loggingStorage = wrappedLoggerStorage({ storage: getRxStorageIndexedDB({}) }); // create your database with the wrapped storage const db = await createRxDatabase({ name: 'mydatabase', storage: loggingStorage }); // create collections etc... ","version":"Next","tagName":"h2"},{"title":"Specify what to be logged​","type":1,"pageTitle":"RxDB Logger Plugin","url":"/logger.html#specify-what-to-be-logged","content":" By default, the plugin will log all operations and it will also run a console.time()/console.timeEnd() around each operation. You can specify what to log so that your logs are less noisy. For this you provide a settings object when calling wrappedLoggerStorage(). const loggingStorage = wrappedLoggerStorage({ storage: getRxStorageIndexedDB({}), settings: { // can used to prefix all log strings, default='' prefix: 'my-prefix', /** * Be default, all settings are true. */ // if true, it will log timings with console.time() and console.timeEnd() times: true, // if false, it will not log meta storage instances like used in replication metaStorageInstances: true, // operations bulkWrite: true, findDocumentsById: true, query: true, count: true, info: true, getAttachmentData: true, getChangedDocumentsSince: true, cleanup: true, close: true, remove: true } }); ","version":"Next","tagName":"h2"},{"title":"Using custom logging functions​","type":1,"pageTitle":"RxDB Logger Plugin","url":"/logger.html#using-custom-logging-functions","content":" With the logger plugin you can also run custom log functions for all operations. const loggingStorage = wrappedLoggerStorage({ storage: getRxStorageIndexedDB({}), onOperationStart: (operationsName, logId, args) => void, onOperationEnd: (operationsName, logId, args) => void, onOperationError: (operationsName, logId, args, error) => void }); ","version":"Next","tagName":"h2"},{"title":"RxDB Error Messages","type":0,"sectionRef":"#","url":"/errors.html","content":"","keywords":"","version":"Next"},{"title":"All RxDB error messages​","type":1,"pageTitle":"RxDB Error Messages","url":"/errors.html#all-rxdb-error-messages","content":" Code: UT1 Given name is no string or empty Search In CodeSearch In IssuesSearch In Chat Code: UT2 Collection- and database-names must match the regex to be compatible with couchdb databases. See https://neighbourhood.ie/blog/2020/10/13/everything-you-need-to-know-about-couchdb-database-names/ info: if your database-name specifies a folder, the name must contain the slash-char '/' or '\\' Search In CodeSearch In IssuesSearch In Chat Code: UT3 Replication-direction must either be push or pull or both. But not none Search In CodeSearch In IssuesSearch In Chat Code: UT4 Given leveldown is no valid adapter Search In CodeSearch In IssuesSearch In Chat Code: UT5 KeyCompression is set to true in the schema but no key-compression handler is used in the storage Search In CodeSearch In IssuesSearch In Chat Code: UT6 Schema contains encrypted fields but no encryption handler is used in the storage Search In CodeSearch In IssuesSearch In Chat Code: UT7 Attachments.compression is enabled but no attachment-compression plugin is used Search In CodeSearch In IssuesSearch In Chat Code: UT8 Crypto.subtle.digest is not available in your runtime. For expo/react-native see https://discord.com/channels/969553741705539624/1341392686267109458/1343639513850843217 Search In CodeSearch In IssuesSearch In Chat Code: PL1 Given plugin is not RxDB plugin. Search In CodeSearch In IssuesSearch In Chat Code: PL3 A plugin with the same name was already added but it was not the exact same JavaScript object Search In CodeSearch In IssuesSearch In Chat Code: P2 BulkWrite() cannot be called with an empty array Search In CodeSearch In IssuesSearch In Chat Code: QU1 RxQuery._execOverDatabase(): op not known Search In CodeSearch In IssuesSearch In Chat Code: QU4 RxQuery.regex(): You cannot use .regex() on the primary field Search In CodeSearch In IssuesSearch In Chat Code: QU5 RxQuery.sort(): does not work because key is not defined in the schema Search In CodeSearch In IssuesSearch In Chat Code: QU6 RxQuery.limit(): cannot be called on .findOne() Search In CodeSearch In IssuesSearch In Chat Code: QU9 ThrowIfMissing can only be used in findOne queries Search In CodeSearch In IssuesSearch In Chat Code: QU10 Result empty and throwIfMissing: true Search In CodeSearch In IssuesSearch In Chat Code: QU11 RxQuery: no valid query params given Search In CodeSearch In IssuesSearch In Chat Code: QU12 Given index is not in schema Search In CodeSearch In IssuesSearch In Chat Code: QU13 A top level field of the query is not included in the schema Search In CodeSearch In IssuesSearch In Chat Code: QU14 Running a count() query in slow mode is now allowed. Either run a count() query with a selector that fully matches an index or set allowSlowCount=true when calling the createRxDatabase Search In CodeSearch In IssuesSearch In Chat Code: QU15 For count queries it is not allowed to use skip or limit Search In CodeSearch In IssuesSearch In Chat Code: QU16 $regex queries must be defined by a string, not an RegExp instance. This is because RegExp objects cannot be JSON stringified and also they are mutable which would be dangerous Search In CodeSearch In IssuesSearch In Chat Code: QU17 Chained queries cannot be used on findByIds() RxQuery instances Search In CodeSearch In IssuesSearch In Chat Code: QU18 Malformed query result data. This likely happens because you create a OPFS-storage RxDatabase inside of a worker but did not set the usesRxDatabaseInWorker setting. https://rxdb.info/rx-storage-opfs.html?console=opfs#setting-usesrxdatabaseinworker-when-a-rxdatabase-is-also-used-inside-of-the-worker Search In CodeSearch In IssuesSearch In Chat Code: QU19 Queries must not contain fields or properties with the value `undefined`: https://github.com/pubkey/rxdb/issues/6792#issuecomment-2624555824 Search In CodeSearch In IssuesSearch In Chat Code: MQ1 Path must be a string or object Search In CodeSearch In IssuesSearch In Chat Code: MQ2 Invalid argument Search In CodeSearch In IssuesSearch In Chat Code: MQ3 Invalid sort() argument. Must be a string, object, or array Search In CodeSearch In IssuesSearch In Chat Code: MQ4 Invalid argument. Expected instanceof mquery or plain object Search In CodeSearch In IssuesSearch In Chat Code: MQ5 Method must be used after where() when called with these arguments Search In CodeSearch In IssuesSearch In Chat Code: MQ6 Can't mix sort syntaxes. Use either array or object | .sort([['field', 1], ['test', -1]]) | .sort({ field: 1, test: -1 }) Search In CodeSearch In IssuesSearch In Chat Code: MQ7 Invalid sort value Search In CodeSearch In IssuesSearch In Chat Code: MQ8 Can't mix sort syntaxes. Use either array or object Search In CodeSearch In IssuesSearch In Chat Code: DB1 RxDocument.prepare(): another instance on this adapter has a different password Search In CodeSearch In IssuesSearch In Chat Code: DB2 RxDatabase.addCollections(): collection-names cannot start with underscore _ Search In CodeSearch In IssuesSearch In Chat Code: DB3 RxDatabase.addCollections(): collection already exists. use myDatabase[collectionName] to get it Search In CodeSearch In IssuesSearch In Chat Code: DB4 RxDatabase.addCollections(): schema is missing Search In CodeSearch In IssuesSearch In Chat Code: DB5 RxDatabase.addCollections(): collection-name not allowed Search In CodeSearch In IssuesSearch In Chat Code: DB6 RxDatabase.addCollections(): another instance created this collection with a different schema. Read thishttps://rxdb.info/rx-schema.html?console=qa#faq Search In CodeSearch In IssuesSearch In Chat Code: DB8 CreateRxDatabase(): A RxDatabase with the same name and adapter already exists. Make sure to use this combination of storage+databaseName only once If you have the duplicate database on purpose to simulate multi-tab behavior in unit tests, set "ignoreDuplicate: true". As alternative you can set "closeDuplicates: true" like if this happens in your react projects with hot reload that reloads the code without reloading the process. Search In CodeSearch In IssuesSearch In Chat Code: DB9 IgnoreDuplicate is only allowed in dev-mode and must never be used in production Search In CodeSearch In IssuesSearch In Chat Code: DB11 CreateRxDatabase(): Invalid db-name, folder-paths must not have an ending slash Search In CodeSearch In IssuesSearch In Chat Code: DB12 RxDatabase.addCollections(): could not write to internal store Search In CodeSearch In IssuesSearch In Chat Code: DB13 CreateRxDatabase(): Invalid db-name or collection name, name contains the dollar sign Search In CodeSearch In IssuesSearch In Chat Code: DB14 No custom reactivity factory added on database creation Search In CodeSearch In IssuesSearch In Chat Code: COL1 RxDocument.insert() You cannot insert an existing document Search In CodeSearch In IssuesSearch In Chat Code: COL2 RxCollection.insert() fieldName ._id can only be used as primaryKey Search In CodeSearch In IssuesSearch In Chat Code: COL3 RxCollection.upsert() does not work without primary Search In CodeSearch In IssuesSearch In Chat Code: COL4 RxCollection.incrementalUpsert() does not work without primary Search In CodeSearch In IssuesSearch In Chat Code: COL5 RxCollection.find() if you want to search by _id, use .findOne(_id) Search In CodeSearch In IssuesSearch In Chat Code: COL6 RxCollection.findOne() needs a queryObject or string. Notice that in RxDB, primary keys must be strings and cannot be numbers. Search In CodeSearch In IssuesSearch In Chat Code: COL7 Hook must be a function Search In CodeSearch In IssuesSearch In Chat Code: COL8 Hooks-when not known Search In CodeSearch In IssuesSearch In Chat Code: COL9 RxCollection.addHook() hook-name not known Search In CodeSearch In IssuesSearch In Chat Code: COL10 RxCollection .postCreate-hooks cannot be async Search In CodeSearch In IssuesSearch In Chat Code: COL11 MigrationStrategies must be an object Search In CodeSearch In IssuesSearch In Chat Code: COL12 A migrationStrategy is missing or too much Search In CodeSearch In IssuesSearch In Chat Code: COL13 MigrationStrategy must be a function Search In CodeSearch In IssuesSearch In Chat Code: COL14 Given static method-name is not a string Search In CodeSearch In IssuesSearch In Chat Code: COL15 Static method-names cannot start with underscore _ Search In CodeSearch In IssuesSearch In Chat Code: COL16 Given static method is not a function Search In CodeSearch In IssuesSearch In Chat Code: COL17 RxCollection.ORM: statics-name not allowed Search In CodeSearch In IssuesSearch In Chat Code: COL18 Collection-method not allowed because fieldname is in the schema Search In CodeSearch In IssuesSearch In Chat Code: COL20 Storage write error Search In CodeSearch In IssuesSearch In Chat Code: COL21 The RxCollection is closed or removed already, either from this JavaScript realm or from another, like a browser tab Search In CodeSearch In IssuesSearch In Chat Code: CONFLICT Document update conflict. When changing a document you must work on the previous revision Search In CodeSearch In IssuesSearch In Chat Code: COL22 .bulkInsert() and .bulkUpsert() cannot be run with multiple documents that have the same primary key Search In CodeSearch In IssuesSearch In Chat Code: COL23 In the open-source version of RxDB, the amount of collections that can exist in parallel is limited to 16. If you already purchased the premium access, you can remove this limit: https://rxdb.info/rx-collection.html?console=limit#faq Search In CodeSearch In IssuesSearch In Chat Code: DOC1 RxDocument.get$ cannot get observable of in-array fields because order cannot be guessed Search In CodeSearch In IssuesSearch In Chat Code: DOC2 Cannot observe primary path Search In CodeSearch In IssuesSearch In Chat Code: DOC3 Final fields cannot be observed Search In CodeSearch In IssuesSearch In Chat Code: DOC4 RxDocument.get$ cannot observe a non-existed field Search In CodeSearch In IssuesSearch In Chat Code: DOC5 RxDocument.populate() cannot populate a non-existed field Search In CodeSearch In IssuesSearch In Chat Code: DOC6 RxDocument.populate() cannot populate because path has no ref Search In CodeSearch In IssuesSearch In Chat Code: DOC7 RxDocument.populate() ref-collection not in database Search In CodeSearch In IssuesSearch In Chat Code: DOC8 RxDocument.set(): primary-key cannot be modified Search In CodeSearch In IssuesSearch In Chat Code: DOC9 Final fields cannot be modified Search In CodeSearch In IssuesSearch In Chat Code: DOC10 RxDocument.set(): cannot set childpath when rootPath not selected Search In CodeSearch In IssuesSearch In Chat Code: DOC11 RxDocument.save(): can't save deleted document Search In CodeSearch In IssuesSearch In Chat Code: DOC13 RxDocument.remove(): Document is already deleted Search In CodeSearch In IssuesSearch In Chat Code: DOC14 RxDocument.close() does not exist Search In CodeSearch In IssuesSearch In Chat Code: DOC15 Query cannot be an array Search In CodeSearch In IssuesSearch In Chat Code: DOC16 Since version 8.0.0 RxDocument.set() can only be called on temporary RxDocuments Search In CodeSearch In IssuesSearch In Chat Code: DOC17 Since version 8.0.0 RxDocument.save() can only be called on non-temporary documents Search In CodeSearch In IssuesSearch In Chat Code: DOC18 Document property for composed primary key is missing Search In CodeSearch In IssuesSearch In Chat Code: DOC19 Value of primary key(s) cannot be changed Search In CodeSearch In IssuesSearch In Chat Code: DOC20 PrimaryKey missing Search In CodeSearch In IssuesSearch In Chat Code: DOC21 PrimaryKey must be equal to PrimaryKey.trim(). It cannot start or end with a whitespace Search In CodeSearch In IssuesSearch In Chat Code: DOC22 PrimaryKey must not contain a linebreak Search In CodeSearch In IssuesSearch In Chat Code: DOC23 PrimaryKey must not contain a double-quote ["] Search In CodeSearch In IssuesSearch In Chat Code: DOC24 Given document data could not be structured cloned. This happens if you pass non-plain-json data into it, like a Date() object or a Function. In vue.js this happens if you use ref() on the document data which transforms it into a Proxy object. Search In CodeSearch In IssuesSearch In Chat Code: DM1 Migrate() Migration has already run Search In CodeSearch In IssuesSearch In Chat Code: DM2 Migration of document failed final document does not match final schema Search In CodeSearch In IssuesSearch In Chat Code: DM3 Migration already running Search In CodeSearch In IssuesSearch In Chat Code: DM4 Migration errored Search In CodeSearch In IssuesSearch In Chat Code: DM5 Cannot open database state with newer RxDB version. You have to migrate your database state first. See https://rxdb.info/migration-storage.html?console=storage Search In CodeSearch In IssuesSearch In Chat Code: AT1 To use attachments, please define this in your schema Search In CodeSearch In IssuesSearch In Chat Code: EN1 Password is not valid Search In CodeSearch In IssuesSearch In Chat Code: EN2 ValidatePassword: min-length of password not complied Search In CodeSearch In IssuesSearch In Chat Code: EN3 Schema contains encrypted properties but no password is given Search In CodeSearch In IssuesSearch In Chat Code: EN4 Password not valid Search In CodeSearch In IssuesSearch In Chat Code: JD1 You must create the collections before you can import their data Search In CodeSearch In IssuesSearch In Chat Code: JD2 RxCollection.importJSON(): the imported json relies on a different schema Search In CodeSearch In IssuesSearch In Chat Code: JD3 RxCollection.importJSON(): json.passwordHash does not match the own Search In CodeSearch In IssuesSearch In Chat Code: LD1 RxDocument.allAttachments$ can't use attachments on local documents Search In CodeSearch In IssuesSearch In Chat Code: LD2 RxDocument.get(): objPath must be a string Search In CodeSearch In IssuesSearch In Chat Code: LD3 RxDocument.get$ cannot get observable of in-array fields because order cannot be guessed Search In CodeSearch In IssuesSearch In Chat Code: LD4 Cannot observe primary path Search In CodeSearch In IssuesSearch In Chat Code: LD5 RxDocument.set() id cannot be modified Search In CodeSearch In IssuesSearch In Chat Code: LD6 LocalDocument: Function is not usable on local documents Search In CodeSearch In IssuesSearch In Chat Code: LD7 Local document already exists Search In CodeSearch In IssuesSearch In Chat Code: LD8 LocalDocuments not activated. Set localDocuments=true on creation, when you want to store local documents on the RxDatabase or RxCollection. Search In CodeSearch In IssuesSearch In Chat Code: RC1 Replication: already added Search In CodeSearch In IssuesSearch In Chat Code: RC2 ReplicateCouchDB() query must be from the same RxCollection Search In CodeSearch In IssuesSearch In Chat Code: RC4 RxCouchDBReplicationState.awaitInitialReplication() cannot await initial replication when live: true Search In CodeSearch In IssuesSearch In Chat Code: RC5 RxCouchDBReplicationState.awaitInitialReplication() cannot await initial replication if multiInstance because the replication might run on another instance Search In CodeSearch In IssuesSearch In Chat Code: RC6 SyncFirestore() serverTimestampField MUST NOT be part of the collections schema and MUST NOT be nested. Search In CodeSearch In IssuesSearch In Chat Code: RC7 SimplePeer requires to have process.nextTick() polyfilled, see https://rxdb.info/replication-webrtc.html?console=webrtc Search In CodeSearch In IssuesSearch In Chat Code: RC_PULL RxReplication pull handler threw an error - see .errors for more details Search In CodeSearch In IssuesSearch In Chat Code: RC_STREAM RxReplication pull stream$ threw an error - see .errors for more details Search In CodeSearch In IssuesSearch In Chat Code: RC_PUSH RxReplication push handler threw an error - see .errors for more details Search In CodeSearch In IssuesSearch In Chat Code: RC_PUSH_NO_AR RxReplication push handler did not return an array with the conflicts Search In CodeSearch In IssuesSearch In Chat Code: RC_WEBRTC_PEER RxReplication WebRTC Peer has error Search In CodeSearch In IssuesSearch In Chat Code: RC_COUCHDB_1 ReplicateCouchDB() url must end with a slash like 'https://example.com/mydatabase/' Search In CodeSearch In IssuesSearch In Chat Code: RC_COUCHDB_2 ReplicateCouchDB() did not get valid result with rows. Search In CodeSearch In IssuesSearch In Chat Code: RC_OUTDATED Outdated client, update required. Replication was canceled Search In CodeSearch In IssuesSearch In Chat Code: RC_UNAUTHORIZED Unauthorized client, update the replicationState.headers to set correct auth data Search In CodeSearch In IssuesSearch In Chat Code: RC_FORBIDDEN Client behaves wrong so the replication was canceled. Mostly happens if the client tries to write data that it is not allowed to Search In CodeSearch In IssuesSearch In Chat Code: SC1 Fieldnames do not match the regex Search In CodeSearch In IssuesSearch In Chat Code: SC2 SchemaCheck: name 'item' reserved for array-fields Search In CodeSearch In IssuesSearch In Chat Code: SC3 SchemaCheck: fieldname has a ref-array but items-type is not string Search In CodeSearch In IssuesSearch In Chat Code: SC4 SchemaCheck: fieldname has a ref but is not type string, [string,null] or array<string> Search In CodeSearch In IssuesSearch In Chat Code: SC6 SchemaCheck: primary can only be defined at top-level Search In CodeSearch In IssuesSearch In Chat Code: SC7 SchemaCheck: default-values can only be defined at top-level Search In CodeSearch In IssuesSearch In Chat Code: SC8 SchemaCheck: first level-fields cannot start with underscore _ Search In CodeSearch In IssuesSearch In Chat Code: SC10 SchemaCheck: schema defines ._rev, this will be done automatically Search In CodeSearch In IssuesSearch In Chat Code: SC11 SchemaCheck: schema needs a number >=0 as version Search In CodeSearch In IssuesSearch In Chat Code: SC13 SchemaCheck: primary is always index, do not declare it as index Search In CodeSearch In IssuesSearch In Chat Code: SC14 SchemaCheck: primary is always unique, do not declare it as index Search In CodeSearch In IssuesSearch In Chat Code: SC15 SchemaCheck: primary cannot be encrypted Search In CodeSearch In IssuesSearch In Chat Code: SC16 SchemaCheck: primary must have type: string Search In CodeSearch In IssuesSearch In Chat Code: SC17 SchemaCheck: top-level fieldname is not allowed. See https://rxdb.info/rx-schema.html?console=toplevel#non-allowed-properties Search In CodeSearch In IssuesSearch In Chat Code: SC18 SchemaCheck: indexes must be an array Search In CodeSearch In IssuesSearch In Chat Code: SC19 SchemaCheck: indexes must contain strings or arrays of strings Search In CodeSearch In IssuesSearch In Chat Code: SC20 SchemaCheck: indexes.array must contain strings Search In CodeSearch In IssuesSearch In Chat Code: SC21 SchemaCheck: given index is not defined in schema Search In CodeSearch In IssuesSearch In Chat Code: SC22 SchemaCheck: given indexKey is not type:string Search In CodeSearch In IssuesSearch In Chat Code: SC23 SchemaCheck: fieldname is not allowed Search In CodeSearch In IssuesSearch In Chat Code: SC24 SchemaCheck: required fields must be set via array. See https://spacetelescope.github.io/understanding-json-schema/reference/object.html#required Search In CodeSearch In IssuesSearch In Chat Code: SC25 SchemaCheck: compoundIndexes needs to be specified in the indexes field Search In CodeSearch In IssuesSearch In Chat Code: SC26 SchemaCheck: indexes needs to be specified at collection schema level Search In CodeSearch In IssuesSearch In Chat Code: SC28 SchemaCheck: encrypted fields is not defined in the schema Search In CodeSearch In IssuesSearch In Chat Code: SC29 SchemaCheck: missing object key 'properties' Search In CodeSearch In IssuesSearch In Chat Code: SC30 SchemaCheck: primaryKey is required Search In CodeSearch In IssuesSearch In Chat Code: SC32 SchemaCheck: primary field must have the type string/number/integer Search In CodeSearch In IssuesSearch In Chat Code: SC33 SchemaCheck: used primary key is not a property in the schema Search In CodeSearch In IssuesSearch In Chat Code: SC34 Fields of type string that are used in an index, must have set the maxLength attribute in the schema Search In CodeSearch In IssuesSearch In Chat Code: SC35 Fields of type number/integer that are used in an index, must have set the multipleOf attribute in the schema Search In CodeSearch In IssuesSearch In Chat Code: SC36 A field of this type cannot be used as index Search In CodeSearch In IssuesSearch In Chat Code: SC37 Fields of type number that are used in an index, must have set the minimum and maximum attribute in the schema Search In CodeSearch In IssuesSearch In Chat Code: SC38 Fields of type boolean that are used in an index, must be required in the schema Search In CodeSearch In IssuesSearch In Chat Code: SC39 The primary key must have the maxLength attribute set. Ensure you use the dev-mode plugin when developing with RxDB. Search In CodeSearch In IssuesSearch In Chat Code: SC40 $ref fields in the schema are not allowed. RxDB cannot resolve related schemas because it would have a negative performance impact.It would have to run http requests on runtime. $ref fields should be resolved during build time. Search In CodeSearch In IssuesSearch In Chat Code: SC41 Minimum, maximum and maxLength values for indexes must be real numbers, not Infinity or -Infinity Search In CodeSearch In IssuesSearch In Chat Code: SC42 Primary key and also indexed fields which are strings, must have a maxLength that is <= 2048. Notice that having a big maxLength can negatively affect the performance. Only set it as big as it has to be. Search In CodeSearch In IssuesSearch In Chat Code: DVM1 When dev-mode is enabled, your storage must use one of the schema validators at the top level. This is because most problems people have with RxDB is because they store data that is not valid to the schema which causes strange bugs and problems. Search In CodeSearch In IssuesSearch In Chat Code: VD1 Sub-schema not found, does the schemaPath exists in your schema? Search In CodeSearch In IssuesSearch In Chat Code: VD2 Object does not match schema Search In CodeSearch In IssuesSearch In Chat Code: S1 You cannot create collections after calling RxDatabase.server() Search In CodeSearch In IssuesSearch In Chat Code: GQL1 GraphQL replication: cannot find sub schema by key Search In CodeSearch In IssuesSearch In Chat Code: GQL3 GraphQL replication: pull returns more documents then batchSize Search In CodeSearch In IssuesSearch In Chat Code: CRDT1 CRDT operations cannot be used because the crdt options are not set in the schema. Search In CodeSearch In IssuesSearch In Chat Code: CRDT2 RxDocument.incrementalModify() cannot be used when CRDTs are activated. Search In CodeSearch In IssuesSearch In Chat Code: CRDT3 To use CRDTs you MUST NOT set a conflictHandler because the default CRDT conflict handler must be used Search In CodeSearch In IssuesSearch In Chat Code: DXE1 Non-required index fields are not possible with the dexie.js RxStorage: https://github.com/pubkey/rxdb/pull/6643#issuecomment-2505310082 Search In CodeSearch In IssuesSearch In Chat Code: SQL1 The trial version of the SQLite storage does not support attachments. Search In CodeSearch In IssuesSearch In Chat Code: SQL2 The trial version of the SQLite storage is limited to contain 300 documents Search In CodeSearch In IssuesSearch In Chat Code: SQL3 The trial version of the SQLite storage is limited to running 500 operations Search In CodeSearch In IssuesSearch In Chat Code: RM1 Cannot communicate with a remote that was build on a different RxDB version. Did you forget to rebuild your workers when updating RxDB? Search In CodeSearch In IssuesSearch In Chat Code: MG1 If _id is used as primaryKey, all documents in the MongoDB instance must have a string-value as _id, not an ObjectId or number Search In CodeSearch In IssuesSearch In Chat Code: R1 You must provide a valid RxDatabase to the the RxDatabaseProvider Search In CodeSearch In IssuesSearch In Chat Code: R2 Could not find database in context, please ensure the component is wrapped in a <RxDatabaseProvider> Search In CodeSearch In IssuesSearch In Chat Code: R3 The provided value for the collection parameter is not a valid RxCollection Search In CodeSearch In IssuesSearch In Chat Code: SNH This should never happen Search In CodeSearch In IssuesSearch In Chat ","version":"Next","tagName":"h2"},{"title":"Migrate Database Data on schema changes","type":0,"sectionRef":"#","url":"/migration-schema.html","content":"","keywords":"","version":"Next"},{"title":"Providing strategies​","type":1,"pageTitle":"Migrate Database Data on schema changes","url":"/migration-schema.html#providing-strategies","content":" Upon creation of a collection, you have to provide migrationStrategies when your schema's version-number is greater than 0. To do this, you have to add an object to the migrationStrategies property where a function for every schema-version is assigned. A migrationStrategy is a function which gets the old document-data as a parameter and returns the new, transformed document-data. If the strategy returns null, the document will be removed instead of migrated. myDatabase.addCollections({ messages: { schema: messageSchemaV1, migrationStrategies: { // 1 means, this transforms data from version 0 to version 1 1: function(oldDoc){ oldDoc.time = new Date(oldDoc.time).getTime(); // string to unix return oldDoc; } } } }); Asynchronous strategies can also be used: myDatabase.addCollections({ messages: { schema: messageSchemaV1, migrationStrategies: { 1: function(oldDoc){ oldDoc.time = new Date(oldDoc.time).getTime(); // string to unix return oldDoc; }, /** * 2 means, this transforms data from version 1 to version 2 * this returns a promise which resolves with the new document-data */ 2: function(oldDoc){ // in the new schema (version: 2) we defined 'senderCountry' as required field (string) // so we must get the country of the message-sender from the server const coordinates = oldDoc.coordinates; return fetch('http://myserver.com/api/countryByCoordinates/'+coordinates+'/') .then(response => { const response = response.json(); oldDoc.senderCountry = response; return oldDoc; }); } } } }); you can also filter which documents should be migrated: myDatabase.addCollections({ messages: { schema: messageSchemaV1, migrationStrategies: { // 1 means, this transforms data from version 0 to version 1 1: function(oldDoc){ oldDoc.time = new Date(oldDoc.time).getTime(); // string to unix return oldDoc; }, /** * this removes all documents older then 2017-02-12 * they will not appear in the new collection */ 2: function(oldDoc){ if(oldDoc.time < 1486940585) return null; else return oldDoc; } } } }); ","version":"Next","tagName":"h2"},{"title":"autoMigrate​","type":1,"pageTitle":"Migrate Database Data on schema changes","url":"/migration-schema.html#automigrate","content":" By default, the migration automatically happens when the collection is created. Calling RxDatabase.addCollections() returns only when the migration has finished. If you have lots of data or the migrationStrategies take a long time, it might be better to start the migration 'by hand' and show the migration-state to the user as a loading-bar. const messageCol = await myDatabase.addCollections({ messages: { schema: messageSchemaV1, autoMigrate: false, // <- migration will not run at creation migrationStrategies: { 1: async function(oldDoc){ ... anything that takes very long ... return oldDoc; } } } }); // check if migration is needed const needed = await messageCol.migrationNeeded(); if(needed === false) { return; } // start the migration messageCol.startMigration(10); // 10 is the batch-size, how many docs will run at parallel const migrationState = messageCol.getMigrationState(); // 'start' the observable migrationState.$.subscribe({ next: state => console.dir(state), error: error => console.error(error), complete: () => console.log('done') }); // the emitted states look like this: { status: 'RUNNING' // oneOf 'RUNNING' | 'DONE' | 'ERROR' count: { total: 50, // amount of documents which must be migrated handled: 0, // amount of handled docs percent: 0 // percentage [0-100] } } If you don't want to show the state to the user, you can also use .migratePromise(): const migrationPromise = messageCol.migratePromise(10); await migratePromise; ","version":"Next","tagName":"h2"},{"title":"migrationStates()​","type":1,"pageTitle":"Migrate Database Data on schema changes","url":"/migration-schema.html#migrationstates","content":" RxDatabase.migrationStates() returns an Observable that emits all migration states of any collection of the database. Use this when you add collections dynamically and want to show a loading-state of the migrations to the user. const allStatesObservable = myDatabase.migrationStates(); allStatesObservable.subscribe(allStates => { allStates.forEach(migrationState => { console.log( 'migration state of ' + migrationState.collection.name ); }); }); ","version":"Next","tagName":"h2"},{"title":"Migrating attachments​","type":1,"pageTitle":"Migrate Database Data on schema changes","url":"/migration-schema.html#migrating-attachments","content":" When you store RxAttachments together with your document, they can also be changed, added or removed while running the migration. You can do this by mutating the oldDoc._attachments property. import { createBlob } from 'rxdb'; const migrationStrategies = { 1: async function(oldDoc){ // do nothing with _attachments to keep all attachments and have them in the new collection version. return oldDoc; }, 2: async function(oldDoc){ // set _attachments to an empty object to delete all existing ones during the migration. oldDoc._attachments = {}; return oldDoc; } 3: async function(oldDoc){ // update the data field of a single attachment to change its data. oldDoc._attachments.myFile.data = await createBlob( 'my new text', oldDoc._attachments.myFile.content_type ); return oldDoc; } } ","version":"Next","tagName":"h2"},{"title":"Migration on multi-tab in browsers​","type":1,"pageTitle":"Migrate Database Data on schema changes","url":"/migration-schema.html#migration-on-multi-tab-in-browsers","content":" If you use RxDB in a multiInstance environment, like a browser, it will ensure that exactly one tab is running a migration of a collection. Also the migrationState.$ events are emitted between browser tabs. ","version":"Next","tagName":"h2"},{"title":"Migration and Replication​","type":1,"pageTitle":"Migrate Database Data on schema changes","url":"/migration-schema.html#migration-and-replication","content":" If you use any of the RxReplication plugins, the migration will also run on the internal replication-state storage. It will migrate all assumedMasterState documents so that after the migration is done, you do not have to re-run the replication from scratch. RxDB assumes that you run the exact same migration on the servers and the clients. Notice that the replication pull-checkpoint will not be migrated. Your backend must be compatible with pull-checkpoints of older versions. ","version":"Next","tagName":"h2"},{"title":"Migration should be run on all database instances​","type":1,"pageTitle":"Migrate Database Data on schema changes","url":"/migration-schema.html#migration-should-be-run-on-all-database-instances","content":" If you have multiple database instances (for example, if you are running replication inside of a Worker or SharedWorker and have created a database instance inside of the worker), schema migration should be started on all database instances. All instances must know about all migration strategies and any updated schema versions. ","version":"Next","tagName":"h2"},{"title":"Storage Migration","type":0,"sectionRef":"#","url":"/migration-storage.html","content":"","keywords":"","version":"Next"},{"title":"Usage​","type":1,"pageTitle":"Storage Migration","url":"/migration-storage.html#usage","content":" Lets say you want to migrate from LocalStorage RxStorage to the IndexedDB RxStorage. import { migrateStorage } from 'rxdb/plugins/migration-storage'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; import { getRxStorageLocalstorage } from 'rxdb-old/plugins/storage-localstorage'; // create the new RxDatabase const db = await createRxDatabase({ name: dbLocation, storage: getRxStorageIndexedDB(), multiInstance: false }); await migrateStorage({ database: db as any, /** * Name of the old database, * using the storage migration requires that the * new database has a different name. */ oldDatabaseName: 'myOldDatabaseName', oldStorage: getRxStorageLocalstorage(), // RxStorage of the old database batchSize: 500, // batch size parallel: false, // <- true if it should migrate all collections in parallel. False (default) if should migrate in serial afterMigrateBatch: (input: AfterMigrateBatchHandlerInput) => { console.log('storage migration: batch processed'); } }); note Only collections that exist in the new database at the time you call migrateStorage() will have their data migrated. If your old database had collections ['users', 'posts', 'comments'] but your new database only defines ['users', 'posts'], then only users and posts data will be migrated.Any collections missing from the new database will simply be skipped - no data for them will be read or written. This allows you to selectively migrate only certain collections if desired, by choosing which collections to define before invoking migrateStorage(). ","version":"Next","tagName":"h2"},{"title":"Migrate from a previous RxDB major version​","type":1,"pageTitle":"Storage Migration","url":"/migration-storage.html#migrate-from-a-previous-rxdb-major-version","content":" To migrate from a previous RxDB major version, you have to install the 'old' RxDB in the package.json { "dependencies": { "rxdb-old": "npm:rxdb@14.17.1", } } Then you can run the migration by providing the old storage: /* ... */ import { migrateStorage } from 'rxdb/plugins/migration-storage'; import { getRxStorageLocalstorage } from 'rxdb-old/plugins/storage-localstorage'; // <- import from the old RxDB version await migrateStorage({ database: db as any, /** * Name of the old database, * using the storage migration requires that the * new database has a different name. */ oldDatabaseName: 'myOldDatabaseName', oldStorage: getRxStorageLocalstorage(), // RxStorage of the old database batchSize: 500, // batch size parallel: false, afterMigrateBatch: (input: AfterMigrateBatchHandlerInput) => { console.log('storage migration: batch processed'); } }); /* ... */ ","version":"Next","tagName":"h2"},{"title":"Disable Version Check on RxDB Premium 👑​","type":1,"pageTitle":"Storage Migration","url":"/migration-storage.html#disable-version-check-on-rxdb-premium-","content":" RxDB Premium has a check in place that ensures that you do not accidentally use the wrong RxDB core and 👑 Premium version together which could break your database state. This can be a problem during migrations where you have multiple versions of RxDB in use and it will throw the error Version mismatch detected. You can disable that check by importing and running the disableVersionCheck() function from RxDB Premium. // RxDB Premium v15 or newer: import { disableVersionCheck } from 'rxdb-premium-old/plugins/shared'; disableVersionCheck(); // RxDB Premium v14: // for esm import { disableVersionCheck } from 'rxdb-premium-old/dist/es/shared/version-check.js'; disableVersionCheck(); // for cjs import { disableVersionCheck } from 'rxdb-premium-old/dist/lib/shared/version-check.js'; disableVersionCheck(); ","version":"Next","tagName":"h2"},{"title":"Middleware","type":0,"sectionRef":"#","url":"/middleware.html","content":"","keywords":"","version":"Next"},{"title":"List​","type":1,"pageTitle":"Middleware","url":"/middleware.html#list","content":" RxDB supports the following hooks: preInsertpostInsertpreSavepostSavepreRemovepostRemovepostCreate ","version":"Next","tagName":"h2"},{"title":"Why is there no validate-hook?​","type":1,"pageTitle":"Middleware","url":"/middleware.html#why-is-there-no-validate-hook","content":" Different to mongoose, the validation on document-data is running on the field-level for every change to a document. This means if you set the value lastName of a RxDocument, then the validation will only run on the changed field, not the whole document. Therefore it is not useful to have validate-hooks when a document is written to the database. ","version":"Next","tagName":"h3"},{"title":"Use Cases​","type":1,"pageTitle":"Middleware","url":"/middleware.html#use-cases","content":" Middleware are useful for atomizing model logic and avoiding nested blocks of async code. Here are some other ideas: complex validationremoving dependent documentsasynchronous defaultsasynchronous tasks that a certain action triggerstriggering custom eventsnotifications ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Middleware","url":"/middleware.html#usage","content":" All hooks have the plain data as first parameter, and all but preInsert also have the RxDocument-instance as second parameter. If you want to modify the data in the hook, change attributes of the first parameter. All hook functions are also this-bind to the RxCollection-instance. ","version":"Next","tagName":"h2"},{"title":"Insert​","type":1,"pageTitle":"Middleware","url":"/middleware.html#insert","content":" An insert-hook receives the data-object of the new document. lifecycle​ RxCollection.insert is calledpreInsert series-hookspreInsert parallel-hooksschema validation runsnew document is written to databasepostInsert series-hookspostInsert parallel-hooksevent is emitted to RxDatabase and RxCollection preInsert​ // series myCollection.preInsert(function(plainData){ // set age to 50 before saving plainData.age = 50; }, false); // parallel myCollection.preInsert(function(plainData){ }, true); // async myCollection.preInsert(function(plainData){ return new Promise(res => setTimeout(res, 100)); }, false); // stop the insert-operation myCollection.preInsert(function(plainData){ throw new Error('stop'); }, false); postInsert​ // series myCollection.postInsert(function(plainData, rxDocument){ }, false); // parallel myCollection.postInsert(function(plainData, rxDocument){ }, true); // async myCollection.postInsert(function(plainData, rxDocument){ return new Promise(res => setTimeout(res, 100)); }, false); ","version":"Next","tagName":"h3"},{"title":"Save​","type":1,"pageTitle":"Middleware","url":"/middleware.html#save","content":" A save-hook receives the document which is saved. lifecycle​ RxDocument.save is calledpreSave series-hookspreSave parallel-hooksupdated document is written to databasepostSave series-hookspostSave parallel-hooksevent is emitted to RxDatabase and RxCollection preSave​ // series myCollection.preSave(function(plainData, rxDocument){ // modify anyField before saving plainData.anyField = 'anyValue'; }, false); // parallel myCollection.preSave(function(plainData, rxDocument){ }, true); // async myCollection.preSave(function(plainData, rxDocument){ return new Promise(res => setTimeout(res, 100)); }, false); // stop the save-operation myCollection.preSave(function(plainData, rxDocument){ throw new Error('stop'); }, false); postSave​ // series myCollection.postSave(function(plainData, rxDocument){ }, false); // parallel myCollection.postSave(function(plainData, rxDocument){ }, true); // async myCollection.postSave(function(plainData, rxDocument){ return new Promise(res => setTimeout(res, 100)); }, false); ","version":"Next","tagName":"h3"},{"title":"Remove​","type":1,"pageTitle":"Middleware","url":"/middleware.html#remove","content":" An remove-hook receives the document which is removed. lifecycle​ RxDocument.remove is calledpreRemove series-hookspreRemove parallel-hooksdeleted document is written to databasepostRemove series-hookspostRemove parallel-hooksevent is emitted to RxDatabase and RxCollection preRemove​ // series myCollection.preRemove(function(plainData, rxDocument){ }, false); // parallel myCollection.preRemove(function(plainData, rxDocument){ }, true); // async myCollection.preRemove(function(plainData, rxDocument){ return new Promise(res => setTimeout(res, 100)); }, false); // stop the remove-operation myCollection.preRemove(function(plainData, rxDocument){ throw new Error('stop'); }, false); postRemove​ // series myCollection.postRemove(function(plainData, rxDocument){ }, false); // parallel myCollection.postRemove(function(plainData, rxDocument){ }, true); // async myCollection.postRemove(function(plainData, rxDocument){ return new Promise(res => setTimeout(res, 100)); }, false); ","version":"Next","tagName":"h3"},{"title":"postCreate​","type":1,"pageTitle":"Middleware","url":"/middleware.html#postcreate","content":" This hook is called whenever a RxDocument is constructed. You can use postCreate to modify every RxDocument-instance of the collection. This adds a flexible way to add specify behavior to every document. You can also use it to add custom getter/setter to documents. PostCreate-hooks cannot be asynchronous. myCollection.postCreate(function(plainData, rxDocument){ Object.defineProperty(rxDocument, 'myField', { get: () => 'foobar', }); }); const doc = await myCollection.findOne().exec(); console.log(doc.myField); // 'foobar' note This hook does not run on already created or cached documents. Make sure to add postCreate-hooks before interacting with the collection. ","version":"Next","tagName":"h3"},{"title":"Node.js Database","type":0,"sectionRef":"#","url":"/nodejs-database.html","content":"","keywords":"","version":"Next"},{"title":"Persistent Database​","type":1,"pageTitle":"Node.js Database","url":"/nodejs-database.html#persistent-database","content":" To get a "normal" database connection where the data is persisted to a file system, the RxDB real time database provides multiple storage implementations that work in Node.js. The FoundationDB storage connects to a FoundationDB cluster which itself is just a distributed key-value engine. RxDB adds the NoSQL query-engine, indexes and other features on top of it. It scales horizontally because you can always add more servers to the FoundationDB cluster to increase the capacity. Setting up a RxDB database is pretty simple. You import the FoundationDB RxStorage and tell RxDB to use that when calling createRxDatabase: import { createRxDatabase } from 'rxdb'; import { getRxStorageFoundationDB } from 'rxdb/plugins/storage-foundationdb'; const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageFoundationDB({ apiVersion: 620, clusterFile: '/path/to/fdb.cluster' }) }); // add a collection await db.addCollections({ users: { schema: mySchema } }); // run a query const result = await db.users.find({ selector: { name: 'foobar' } }).exec(); Another alternative storage is the SQLite RxStorage that stores the data inside of a SQLite filebased database. The SQLite storage is faster than FoundationDB and does not require to set up a cluster or anything because SQLite directly stores and reads the data inside of the filesystem. The downside of that is that it only scales vertically. import { createRxDatabase } from 'rxdb'; import { getRxStorageSQLite, getSQLiteBasicsNode } from 'rxdb-premium/plugins/storage-sqlite'; import sqlite3 from 'sqlite3'; const myRxDatabase = await createRxDatabase({ name: 'path/to/database/file/foobar.db', storage: getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsNode(sqlite3) }) }); Because the SQLite RxStorage is not free and you might not want to set up a FoundationDB cluster, there is also the option to use the LokiJS RxStorage together with the filesystem adapter. This will store the data as plain json in a file and load everything into memory on startup. This works great for small prototypes but it is not recommended to be used in production. import { createRxDatabase } from 'rxdb'; const LokiFsStructuredAdapter = require('lokijs/src/loki-fs-structured-adapter.js'); import { getRxStorageLoki } from 'rxdb/plugins/storage-lokijs'; import sqlite3 from 'sqlite3'; const myRxDatabase = await createRxDatabase({ name: 'path/to/database/file/foobar.db', storage: getRxStorageLoki({ adapter: new LokiFsStructuredAdapter() }) }); Here is a performance comparison chart of the different storages (lower is better): ","version":"Next","tagName":"h2"},{"title":"RxDB as Node.js In-Memory Database​","type":1,"pageTitle":"Node.js Database","url":"/nodejs-database.html#rxdb-as-nodejs-in-memory-database","content":" One of the easiest way to use RxDB in Node.js is to use the Memory RxStorage. As the name implies, it stores the data directly in-memory of the Node.js JavaScript process. This makes it really fast to read and write data but of course the data is not persisted and will be lost when the nodejs process exits. Often the in-memory option is used when RxDB is used in unit tests because it automatically cleans up everything afterwards. import { createRxDatabase } from 'rxdb'; import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageMemory() }); Also notice that the default memory limit of Node.js is 4gb (might change of newer versions) so for bigger datasets you might want to increase the limit with the max-old-space-size flag: # increase the Node.js memory limit to 8GB node --max-old-space-size=8192 index.js ","version":"Next","tagName":"h2"},{"title":"Hybrid In-memory-persistence-synced storage​","type":1,"pageTitle":"Node.js Database","url":"/nodejs-database.html#hybrid-in-memory-persistence-synced-storage","content":" If you want to have the performance of an in-memory database but require persistency of the data, you can use the memory-mapped storage. On database creation it will load all data into the memory and on writes it will first write the data into memory and later also write it to the persistent storage in the background. In the following example the FoundationDB storage is used, but any other RxStorage can be used as persistence layer. import { createRxDatabase } from 'rxdb'; import { getRxStorageFoundationDB } from 'rxdb/plugins/storage-foundationdb'; import { getMemoryMappedRxStorage } from 'rxdb-premium/plugins/storage-memory-mapped'; const db = await createRxDatabase({ name: 'exampledb', storage: getMemoryMappedRxStorage({ storage: getRxStorageFoundationDB({ apiVersion: 620, clusterFile: '/path/to/fdb.cluster' }) }) }); While this approach gives you a database with great performance and persistent, it has two major downsides: The database size is limited to the memory sizeWrites can be lost when the Node.js process exists between a write to the memory state and the background persisting. ","version":"Next","tagName":"h2"},{"title":"Share database between microservices with RxDB​","type":1,"pageTitle":"Node.js Database","url":"/nodejs-database.html#share-database-between-microservices-with-rxdb","content":" Using a local, embedded database in Node.js works great until you have to share the data with another Node.js process or another server at all. To share the database state with other instances, RxDB provides two different methods. One is replication and the other is the remote RxStorage. The replication copies over the whole database set to other instances live-replicates all ongoing writes. This has the benefit of scaling better because each of your microservice will run queries on its own copy of the dataset. Sometimes however you might not want to store the full dataset on each microservice. Then it is better to use the remote RxStorage and connect it to the "main" database. The remote storage will run all operations the main database and return the result to the calling database. ","version":"Next","tagName":"h2"},{"title":"Follow up on RxDB+Node.js​","type":1,"pageTitle":"Node.js Database","url":"/nodejs-database.html#follow-up-on-rxdbnodejs","content":" Check out the RxDB Nodejs example.If you haven't done yet, you should start learning about RxDB with the Quickstart Tutorial.I created a list of embedded JavaSCript databases that you will help you to pick a database if you do not want to use RxDB.Check out the MongoDB RxStorage that uses MongoDB for the database connection from your Node.js application and runs the RxDB real time database on top of it. ","version":"Next","tagName":"h2"},{"title":"Local First / Offline First","type":0,"sectionRef":"#","url":"/offline-first.html","content":"","keywords":"","version":"Next"},{"title":"UX is better without loading spinners​","type":1,"pageTitle":"Local First / Offline First","url":"/offline-first.html#ux-is-better-without-loading-spinners","content":" In 'normal' web applications, most user interactions like fetching, saving or deleting data, correspond to a request to the backend server. This means that each of these interactions require the user to await the unknown latency to and from a remote server while looking at a loading spinner. In offline-first apps, the operations go directly against the local storage which happens almost instantly. There is no perceptible loading time and so it is not even necessary to implement a loading spinner at all. As soon as the user clicks, the UI represents the new state as if it was already changed in the backend. ","version":"Next","tagName":"h2"},{"title":"Multi-tab usage just works​","type":1,"pageTitle":"Local First / Offline First","url":"/offline-first.html#multi-tab-usage-just-works","content":" Many, even big websites like amazon, reddit and stack overflow do not handle multi tab usage correctly. When a user has multiple tabs of the website open and does a login on one of these tabs, the state does not change on the other tabs. On offline first applications, there is always exactly one state of the data across all tabs. Offline first databases (like RxDB) store the data inside of IndexedDb and share the state between all tabs of the same origin. ","version":"Next","tagName":"h2"},{"title":"Latency is more important than bandwidth​","type":1,"pageTitle":"Local First / Offline First","url":"/offline-first.html#latency-is-more-important-than-bandwidth","content":" In the past, often the bandwidth was the limiting factor on determining the loading time of an application. But while bandwidth has improved over the years, latency became the limiting factor. You can always increase the bandwidth by setting up more cables or sending more Starlink satellites to space. But reducing the latency is not so easy. It is defined by the physical properties of the transfer medium, the speed of light and the distance to the server. All of these three are hard to optimize. Offline first application benefit from that because sending the initial state to the client can be done much faster with more bandwidth. And once the data is there, we do no longer have to care about the latency to the backend server because you can run near zero latency queries locally. ","version":"Next","tagName":"h2"},{"title":"Realtime comes for free​","type":1,"pageTitle":"Local First / Offline First","url":"/offline-first.html#realtime-comes-for-free","content":" Most websites lie to their users. They do not lie because they display wrong data, but because they display old data that was loaded from the backend at the time the user opened the site. To overcome this, you could build a realtime website where you create a websocket that streams updates from the backend to the client. This means work. Your client needs to tell the server which page is currently opened and which updates the client is interested to. Then the server can push updates over the websocket and you can update the UI accordingly. With offline first applications, you already have a realtime replication with the backend. Most offline first databases provide some concept of changestream or data subscriptions and with RxDB you can even directly subscribe to query results or single fields of documents. This makes it easy to have an always updated UI whenever data on the backend changes. ","version":"Next","tagName":"h2"},{"title":"Scales with data size, not with the amount of user interaction​","type":1,"pageTitle":"Local First / Offline First","url":"/offline-first.html#scales-with-data-size-not-with-the-amount-of-user-interaction","content":" On normal applications, each user interaction can result in multiple requests to the backend server which increase its load. The more users interact with your application, the more backend resources you have to provide. Offline first applications do not scale up with the amount of user actions but instead they scale up with the amount of data. Once that data is transferred to the client, the user can do as many interactions with it as required without connecting to the server. ","version":"Next","tagName":"h2"},{"title":"Modern apps have longer runtimes​","type":1,"pageTitle":"Local First / Offline First","url":"/offline-first.html#modern-apps-have-longer-runtimes","content":" In the past you used websites only for a short time. You open it, perform some action and then close it again. This made the first load time the important metric when evaluating page speed. Today web applications have changed and with it the way we use them. Single page applications are opened once and then used over the whole day. Chat apps, email clients, PWAs and hybrid apps. All of these were made to have long runtimes. This makes the time for user interactions more important than the initial loading time. Offline first applications benefit from that because there is often no loading time on user actions while loading the initial state to the client is not that relevant. ","version":"Next","tagName":"h2"},{"title":"You might not need REST​","type":1,"pageTitle":"Local First / Offline First","url":"/offline-first.html#you-might-not-need-rest","content":" On normal web applications, you make different requests for each kind of data interaction. For that you have to define a swagger route, implement a route handler on the backend and create some client code to send or fetch data from that route. The more complex your application becomes, the more REST routes you have to maintain and implement. With offline first apps, you have a way to hack around all this cumbersome work. You just replicate the whole state from the server to the client. The replication does not only run once, you have a realtime replication and all changes at one side are automatically there on the other side. On the client, you can access every piece of state with a simple database query. While this of course only works for amounts of data that the client can load and store, it makes implementing prototypes and simple apps much faster. ","version":"Next","tagName":"h2"},{"title":"You might not need Redux​","type":1,"pageTitle":"Local First / Offline First","url":"/offline-first.html#you-might-not-need-redux","content":" Data is hard, especially for UI applications where many things can happen at the same time. The user is clicking around. Stuff is loaded from the server. All of these things interact with the global state of the app. To manage this complexity it is common to use state management libraries like Redux or MobX. With them, you write all this lasagna code to wrap the mutation of data and to make the UI react to all these changes. On offline first apps, your global state is already there in a single place stored inside of the local database. You do not have to care whether this data came from the UI, another tab, the backend or another device of the same user. You can just make writes to the database and fetch data out of it. ","version":"Next","tagName":"h2"},{"title":"Follow up​","type":1,"pageTitle":"Local First / Offline First","url":"/offline-first.html#follow-up","content":" Learn how to store and query data with RxDB in the RxDB QuickstartDownsides of Offline FirstI wrote a follow-up version of offline/first local first about Why Local-First Is the Future and what are Its Limitations ","version":"Next","tagName":"h2"},{"title":"Object-Data-Relational-Mapping","type":0,"sectionRef":"#","url":"/orm.html","content":"","keywords":"","version":"Next"},{"title":"statics​","type":1,"pageTitle":"Object-Data-Relational-Mapping","url":"/orm.html#statics","content":" Statics are defined collection-wide and can be called on the collection. ","version":"Next","tagName":"h2"},{"title":"Add statics to a collection​","type":1,"pageTitle":"Object-Data-Relational-Mapping","url":"/orm.html#add-statics-to-a-collection","content":" To add static functions, pass a statics-object when you create your collection. The object contains functions, mapped to their function-names. const heroes = await myDatabase.addCollections({ heroes: { schema: mySchema, statics: { scream: function(){ return 'AAAH!!'; } } } }); console.log(heroes.scream()); // 'AAAH!!' You can also use the this-keyword which resolves to the collection: const heroes = await myDatabase.addCollections({ heroes: { schema: mySchema, statics: { whoAmI: function(){ return this.name; } } } }); console.log(heroes.whoAmI()); // 'heroes' ","version":"Next","tagName":"h3"},{"title":"instance-methods​","type":1,"pageTitle":"Object-Data-Relational-Mapping","url":"/orm.html#instance-methods","content":" Instance-methods are defined collection-wide. They can be called on the RxDocuments of the collection. ","version":"Next","tagName":"h2"},{"title":"Add instance-methods to a collection​","type":1,"pageTitle":"Object-Data-Relational-Mapping","url":"/orm.html#add-instance-methods-to-a-collection","content":" const heroes = await myDatabase.addCollections({ heroes: { schema: mySchema, methods: { scream: function(){ return 'AAAH!!'; } } } }); const doc = await heroes.findOne().exec(); console.log(doc.scream()); // 'AAAH!!' Here you can also use the this-keyword: const heroes = await myDatabase.addCollections({ heroes: { schema: mySchema, methods: { whoAmI: function(){ return 'I am ' + this.name + '!!'; } } } }); await heroes.insert({ name: 'Skeletor' }); const doc = await heroes.findOne().exec(); console.log(doc.whoAmI()); // 'I am Skeletor!!' ","version":"Next","tagName":"h3"},{"title":"attachment-methods​","type":1,"pageTitle":"Object-Data-Relational-Mapping","url":"/orm.html#attachment-methods","content":" Attachment-methods are defined collection-wide. They can be called on the RxAttachments of the RxDocuments of the collection. const heroes = await myDatabase.addCollections({ heroes: { schema: mySchema, attachments: { scream: function(){ return 'AAAH!!'; } } } }); const doc = await heroes.findOne().exec(); const attachment = await doc.putAttachment({ id: 'cat.txt', data: 'meow I am a kitty', type: 'text/plain' }); console.log(attachment.scream()); // 'AAAH!!' ","version":"Next","tagName":"h2"},{"title":"RxDB Documentation","type":0,"sectionRef":"#","url":"/overview.html","content":"RxDB Documentation Getting Started Overview Quickstart Install Dev-mode Typescript Core Entities RxDatabase RxSchema RxCollection RxDocument RxQuery 💾 Storages RxStorage Overview LocalStorage (Browser) IndexedDB 👑 (Browser, Capacitor) OPFS 👑 (Browser) Memory Filesystem Node 👑 (Node.js) SQLite (Capacitor, React-Native, Expo, Tauri, Electron, Node.js) Dexie.js MongoDB DenoKV FoundationDB Storage Wrappers Schema Validation Encryption Key Compression Logger 👑 Remote RxStorage Worker RxStorage 👑 SharedWorker RxStorage 👑 Memory Mapped RxStorage 👑 Sharding 👑 Localstorage Meta Optimizer 👑 Electron 🔄 Replication ⚙️ Sync Engine HTTP Replication RxServer Replication GraphQL Replication WebSocket Replication CouchDB Replication WebRTC P2P Replication Firestore Replication MongoDB Replication Supabase Replication NATS Replication Appwrite Replication Server RxServer RxServer Scaling How RxDB works Transactions Conflicts Revisions Query Cache Creating Plugins Errors Advanced Features Schema Migration Storage Migration Attachments RxPipelines Custom Reactivity RxState Local Documents Cleanup Backup Leader Election Middleware CRDT Population ORM Fulltext Search 👑 Vector Database Query Optimizer 👑 Third Party Plugins Integrations React TanStack DB Performance RxStorage Performance NoSQL Performance Tips Slow IndexedDB LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite Releases 17.0.0 16.0.0 15.0.0 14.0.0 13.0.0 12.0.0 11.0.0 10.0.0 9.0.0 8.0.0 Contact Consulting Discord LinkedIn","keywords":"","version":"Next"},{"title":"Performance tips for RxDB and other NoSQL databases","type":0,"sectionRef":"#","url":"/nosql-performance-tips.html","content":"","keywords":"","version":"Next"},{"title":"Use bulk operations​","type":1,"pageTitle":"Performance tips for RxDB and other NoSQL databases","url":"/nosql-performance-tips.html#use-bulk-operations","content":" When you run write operations on multiple documents, make sure you use bulk operations instead of single document operations. // wrong ❌ for(const docData of dataAr){ await myCollection.insert(docData); } // right ✔️ await myCollection.bulkInsert(dataAr); ","version":"Next","tagName":"h2"},{"title":"Help the query planner by adding operators that better restrict the index range​","type":1,"pageTitle":"Performance tips for RxDB and other NoSQL databases","url":"/nosql-performance-tips.html#help-the-query-planner-by-adding-operators-that-better-restrict-the-index-range","content":" Often on complex queries, RxDB (and other databases) do not pick the optimal index range when querying a result set. You can add additional restrictive operators to ensure the query runs over a smaller index space and has a better performance. Lets see some examples for different query types. /** * Adding a restrictive operator for an $or query * so that it better limits the index space for the time-field. */ const orQuery = { selector: { $or: [ { time: { $gt: 1234 }, }, { time: { $eg: 1234 }, user: { $gt: 'foobar' } }, ] time: { $gte: 1234 } // <- add restrictive operator } } /** * Adding a restrictive operator for an $regex query * so that it better limits the index space for the user-field. * We know that all matching fields start with 'foo' so we can * tell the query to use that as lower constraint for the index. */ const regexQuery = { selector: { user: { $regex: '^foo(.*)0-9$', // a complex regex with a ^ in the beginning $gte: 'foo' // <- add restrictive operator } } } /** * Adding a restrictive operator for a query on an enum field. * so that it better limits the index space for the time-field. */ const enumQuery = { selector: { /** * Here lets assume our status field has the enum type ['idle', 'in-progress', 'done'] * so our restrictive operator can exclude all documents with 'done' as status. */ status: { $in: { 'idle', 'in-progress', }, $gt: 'done' // <- add restrictive operator on status } } } ","version":"Next","tagName":"h2"},{"title":"Set a specific index​","type":1,"pageTitle":"Performance tips for RxDB and other NoSQL databases","url":"/nosql-performance-tips.html#set-a-specific-index","content":" Sometime the query planner of the database itself has no chance in picking the best index of the possible given indexes. For queries where performance is very important, you might want to explicitly specify which index must be used. const myQuery = myCollection.find({ selector: { /* ... */ }, // explicitly specify index index: [ 'fieldA', 'fieldB' ] }); ","version":"Next","tagName":"h2"},{"title":"Try different ordering of index fields​","type":1,"pageTitle":"Performance tips for RxDB and other NoSQL databases","url":"/nosql-performance-tips.html#try-different-ordering-of-index-fields","content":" The order of the fields in a compound index is very important for performance. When optimizing index usage, you should try out different orders on the index fields and measure which runs faster. For that it is very important to run tests on real-world data where the distribution of the data is the same as in production. For example when there is a query on a user collection with an age and a gender field, it depends if the index ['gender', 'age'] performance better as ['age', 'gender'] based on the distribution of data: const query = myCollection .findOne({ selector: { age: { $gt: 18 }, gender: { $eq: 'm' } }, /** * Because the developer knows that 50% of the documents are 'male', * but only 20% are below age 18, * it makes sense to enforce using the ['gender', 'age'] index to improve performance. * This could not be known by the query planer which might have chosen ['age', 'gender'] instead. */ index: ['gender', 'age'] }); Notice that RxDB has the Query Optimizer Plugin that can be used to automatically find the best indexes. ","version":"Next","tagName":"h2"},{"title":"Make a Query \"hot\" to reduce load​","type":1,"pageTitle":"Performance tips for RxDB and other NoSQL databases","url":"/nosql-performance-tips.html#make-a-query-hot-to-reduce-load","content":" Having a query where the up-to-date result set is needed more than once, you might want to make the query "hot" by permanently subscribing to it. This ensures that the query result is kept up to date by RxDB ant the EventReduce algorithm at any time so that at the moment you need the current results, it has them already. For example when you use RxDB at Node.js for a webserver, you should use an outer "hot" query instead of running the same query again on every request to a route. // wrong ❌ app.get('/list', (req, res) => { const result = await myCollection.find({/* ... */}).exec(); res.send(JSON.stringify(result)); }); // right ✔️ const query = myCollection.find({/* ... */}); query.subscribe(); // <- make it hot app.get('/list', (req, res) => { const result = await query.exec(); res.send(JSON.stringify(result)); }); ","version":"Next","tagName":"h2"},{"title":"Store parts of your document data as attachment​","type":1,"pageTitle":"Performance tips for RxDB and other NoSQL databases","url":"/nosql-performance-tips.html#store-parts-of-your-document-data-as-attachment","content":" For in-app databases like RxDB, it does not make sense to partially parse the JSON of a document. Instead, always the whole document json is parsed and handled. This has a better performance because JSON.parse() in JavaScript directly calls a C++ binding which can parse really fast compared to a partial parsing in JavaScript itself. Also by always having the full document, RxDB can de-duplicate memory caches of document across multiple queries. The downside is that very very big documents with a complex structure can increase query time significantly. Documents fields with complex that are mostly not in use, can be move into an attachment. This would lead RxDB to not fetch the attachment data each time the document is loaded from disc. Instead only when explicitly asked for. const myDocument = await myCollection.insert({/* ... */}); const attachment = await myDocument.putAttachment( { id: 'otherStuff.json', data: createBlob(JSON.stringify({/* ... */}), 'application/json'), type: 'application/json' } ); ","version":"Next","tagName":"h2"},{"title":"Process queries in a worker process​","type":1,"pageTitle":"Performance tips for RxDB and other NoSQL databases","url":"/nosql-performance-tips.html#process-queries-in-a-worker-process","content":" Moving database storage into a WebWorker can significantly improve performance in web applications that use RxDB or similar NoSQL databases. When database operations are executed in the main JavaScript thread, they can block or slow down the User Interface, especially during heavy or complex data operations. By offloading these operations to a WebWorker, you effectively separate the data processing workload from the UI thread. This means the main thread remains free to handle user interactions and render updates without delay, leading to a smoother and more responsive user experience. Additionally, WebWorkers allow for parallel data processing, which can expedite tasks like querying and indexing. This approach not only enhances UI responsiveness but also optimizes overall application performance by leveraging the multi-threading capabilities of modern browsers. With RxDB you can use the Worker and SharedWorker plugin to move the query processing away from the main thread. ","version":"Next","tagName":"h2"},{"title":"Use less plugins and hooks​","type":1,"pageTitle":"Performance tips for RxDB and other NoSQL databases","url":"/nosql-performance-tips.html#use-less-plugins-and-hooks","content":" Utilizing fewer hooks and plugins in RxDB or similar NoSQL database systems can lead to markedly better performance. Each additional hook or plugin introduces extra layers of processing and potential overhead, which can cumulatively slow down database operations. These extensions often execute additional code or enforce extra checks with each operation, such as insertions, updates, or deletions. While they can provide valuable functionalities or custom behaviors, their overuse can inadvertently increase the complexity and execution time of basic database operations. By minimizing their use and only employing essential hooks and plugins, the system can operate more efficiently. This streamlined approach reduces the computational burden on each transaction, leading to faster response times and a more efficient overall data handling process, especially critical in high-load or real-time applications where performance is paramount. ","version":"Next","tagName":"h2"},{"title":"Creating Plugins","type":0,"sectionRef":"#","url":"/plugins.html","content":"","keywords":"","version":"Next"},{"title":"rxdb​","type":1,"pageTitle":"Creating Plugins","url":"/plugins.html#rxdb","content":" The rxdb-property signals that this plugin is an rxdb-plugin. The value should always be true. ","version":"Next","tagName":"h2"},{"title":"prototypes​","type":1,"pageTitle":"Creating Plugins","url":"/plugins.html#prototypes","content":" The prototypes-property contains a function for each of RxDB's internal prototype that you want to manipulate. Each function gets the prototype-object of the corresponding class as parameter and then can modify it. You can see a list of all available prototypes here ","version":"Next","tagName":"h2"},{"title":"overwritable​","type":1,"pageTitle":"Creating Plugins","url":"/plugins.html#overwritable","content":" Some of RxDB's functions are not inside of a class-prototype but are static. You can set and overwrite them with the overwritable-object. You can see a list of all overwritables here. hooks Sometimes you don't want to overwrite an existing RxDB-method, but extend it. You can do this by adding hooks which will be called each time the code jumps into the hooks corresponding call. You can find a list of all hooks here. options RxDatabase and RxCollection have an additional options-parameter, which can be filled with any data required be the plugin. const collection = myDatabase.addCollections({ foo: { schema: mySchema, options: { // anything can be passed into the options foo: ()=>'bar' } } }) // Afterwards you can use these options in your plugin. collection.options.foo(); // 'bar' ","version":"Next","tagName":"h2"},{"title":"Population","type":0,"sectionRef":"#","url":"/population.html","content":"","keywords":"","version":"Next"},{"title":"Schema with ref​","type":1,"pageTitle":"Population","url":"/population.html#schema-with-ref","content":" The ref-keyword in properties describes to which collection the field-value belongs to (has a relationship). export const refHuman = { title: 'human related to other human', version: 0, primaryKey: 'name', properties: { name: { type: 'string' }, bestFriend: { ref: 'human', // refers to collection human type: 'string' // ref-values must always be string or ['string','null'] (primary of foreign RxDocument) } } }; You can also have a one-to-many reference by using a string-array. export const schemaWithOneToManyReference = { version: 0, primaryKey: 'name', type: 'object', properties: { name: { type: 'string' }, friends: { type: 'array', ref: 'human', items: { type: 'string' } } } }; ","version":"Next","tagName":"h2"},{"title":"populate()​","type":1,"pageTitle":"Population","url":"/population.html#populate","content":" ","version":"Next","tagName":"h2"},{"title":"via method​","type":1,"pageTitle":"Population","url":"/population.html#via-method","content":" To get the referred RxDocument, you can use the populate()-method. It takes the field-path as attribute and returns a Promise which resolves to the foreign document or null if not found. await humansCollection.insert({ name: 'Alice', bestFriend: 'Carol' }); await humansCollection.insert({ name: 'Bob', bestFriend: 'Alice' }); const doc = await humansCollection.findOne('Bob').exec(); const bestFriend = await doc.populate('bestFriend'); console.dir(bestFriend); //> RxDocument[Alice] ","version":"Next","tagName":"h3"},{"title":"via getter​","type":1,"pageTitle":"Population","url":"/population.html#via-getter","content":" You can also get the populated RxDocument with the direct getter. Therefore you have to add an underscore suffix _ to the fieldname. This works also on nested values. await humansCollection.insert({ name: 'Alice', bestFriend: 'Carol' }); await humansCollection.insert({ name: 'Bob', bestFriend: 'Alice' }); const doc = await humansCollection.findOne('Bob').exec(); const bestFriend = await doc.bestFriend_; // notice the underscore_ console.dir(bestFriend); //> RxDocument[Alice] ","version":"Next","tagName":"h3"},{"title":"Example with nested reference​","type":1,"pageTitle":"Population","url":"/population.html#example-with-nested-reference","content":" const myCollection = await myDatabase.addCollections({ human: { schema: { version: 0, type: 'object', properties: { name: { type: 'string' }, family: { type: 'object', properties: { mother: { type: 'string', ref: 'human' } } } } } } }); const mother = await myDocument.family.mother_; console.dir(mother); //> RxDocument ","version":"Next","tagName":"h2"},{"title":"Example with array​","type":1,"pageTitle":"Population","url":"/population.html#example-with-array","content":" const myCollection = await myDatabase.addCollections({ human: { schema: { version: 0, type: 'object', properties: { name: { type: 'string' }, friends: { type: 'array', ref: 'human', items: { type: 'string' } } } } } }); //[insert other humans here] await myCollection.insert({ name: 'Alice', friends: [ 'Bob', 'Carol', 'Dave' ] }); const doc = await humansCollection.findOne('Alice').exec(); const friends = await myDocument.friends_; console.dir(friends); //> Array.<RxDocument> ","version":"Next","tagName":"h2"},{"title":"QueryCache","type":0,"sectionRef":"#","url":"/query-cache.html","content":"","keywords":"","version":"Next"},{"title":"Cache Replacement Policy​","type":1,"pageTitle":"QueryCache","url":"/query-cache.html#cache-replacement-policy","content":" To not let RxDB fill up all the memory, a cache replacement policy is defined that clears up the cached queries. This is implemented as a function which runs regularly, depending on when queries are created and the database is idle. The default policy should be good enough for most use cases but defining custom ones can also make sense. ","version":"Next","tagName":"h2"},{"title":"The default policy​","type":1,"pageTitle":"QueryCache","url":"/query-cache.html#the-default-policy","content":" The default policy starts cleaning up queries depending on how much queries are in the cache and how much document data they contain. It will never uncache queries that have subscribers to their resultsIt tries to always have less than 100 queries without subscriptions in the cache.It prefers to uncache queries that have never executed and are older than 30 secondsIt prefers to uncache queries that have not been used for longer time ","version":"Next","tagName":"h2"},{"title":"Other references to queries​","type":1,"pageTitle":"QueryCache","url":"/query-cache.html#other-references-to-queries","content":" With JavaScript, it is not possible to count references to variables. Therefore it might happen that an uncached RxQuery is still referenced by the users code and used to get results. This should never be a problem, uncached queries must still work. Creating the same query again however, will result in having two RxQuery instances instead of one. ","version":"Next","tagName":"h2"},{"title":"Using a custom policy​","type":1,"pageTitle":"QueryCache","url":"/query-cache.html#using-a-custom-policy","content":" A cache replacement policy is a normal JavaScript function according to the type RxCacheReplacementPolicy. It gets the RxCollection as first parameter and the QueryCache as second. Then it iterates over the cached RxQuery instances and uncaches the desired ones with uncacheRxQuery(rxQuery). When you create your custom policy, you should have a look at the default. To apply a custom policy to a RxCollection, add the function as attribute cacheReplacementPolicy. const collection = await myDatabase.addCollections({ humans: { schema: mySchema, cacheReplacementPolicy: function(){ /* ... */ } } }); ","version":"Next","tagName":"h2"},{"title":"Query Optimizer","type":0,"sectionRef":"#","url":"/query-optimizer.html","content":"","keywords":"","version":"Next"},{"title":"Usage​","type":1,"pageTitle":"Query Optimizer","url":"/query-optimizer.html#usage","content":" import { findBestIndex } from 'rxdb-premium/plugins/query-optimizer'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/indexeddb'; const bestIndexes = await findBestIndex({ schema: myRxJsonSchema, /** * In this example we use the IndexedDB RxStorage, * but any other storage can be used for testing. */ storage: getRxStorageIndexedDB(), /** * Multiple queries can be optimized at the same time * which decreases the overall runtime. */ queries: { /** * Queries can be mapped by a query id, * here we use myFirstQuery as query id. */ myFirstQuery: { selector: { age: { $gt: 10 } }, }, mySecondQuery: { selector: { age: { $gt: 10 }, lastName: { $eq: 'Nakamoto' } }, } }, testData: [/** data for the documents. **/] }); ","version":"Next","tagName":"h2"},{"title":"Important details​","type":1,"pageTitle":"Query Optimizer","url":"/query-optimizer.html#important-details","content":" This is a build time tool. You should use it to find the best indexes for your queries during build time. Then you store these results and you application can use the best indexes during run time. It makes no sense to run time optimization with a different RxStorage (+settings) that what you use in production. The result of the query optimizer is heavily dependent on the RxStorage and JavaScript runtime. For example it makes no sense to run the optimization in Node.js and then use the optimized indexes in the browser. It is very important that you use production liketestData. Finding the best index heavily depends on data distribution and amount of stored/queried documents. For example if you store and query users with an age field, it makes no sense to just use a random number for the age because in production the age of your users is not equally distributed. The higher you set runs, the more test cycles will be performed and the more significant will be the time measurements which leads to a better index selection. ","version":"Next","tagName":"h2"},{"title":"Signals & Co. - Custom reactivity adapters instead of RxJS Observables","type":0,"sectionRef":"#","url":"/reactivity.html","content":"","keywords":"","version":"Next"},{"title":"RxDB Quickstart","type":0,"sectionRef":"#","url":"/quickstart.html","content":"","keywords":"","version":"Next"},{"title":"Next steps​","type":1,"pageTitle":"RxDB Quickstart","url":"/quickstart.html#next-steps","content":" You are now ready to dive deeper into RxDB. Start reading the full documentation here.There is a full implementation of the quickstart guide so you can clone that repository and play with the code.For frameworks and runtimes like Angular, React Native and others, check out the list of example implementations.Also please continue reading the documentation, join the community on our Discord chat, and star the GitHub repo.If you are using RxDB in a production environment and are able to support its continued development, please take a look at the 👑 Premium package which includes additional plugins and utilities. ","version":"Next","tagName":"h2"},{"title":"Adding a reactivity factory​","type":1,"pageTitle":"Signals & Co. - Custom reactivity adapters instead of RxJS Observables","url":"/reactivity.html#adding-a-reactivity-factory","content":" Angular React Vue In angular we use Angular Signals as custom reactivity objects. 1 Import​ import { createReactivityFactory } from 'rxdb/plugins/reactivity-angular'; import { Injectable, inject } from '@angular/core'; 2 Set the reactivity factory​ Set the factory as reactivity option when calling createRxDatabase. const database = await createRxDatabase({ name: 'mydb', storage: getRxStorageLocalstorage(), reactivity: createReactivityFactory(inject(Injector)) }); // add collections/sync etc... 3 Use the Signal in an Angular component​ import { Component, inject } from '@angular/core'; import { CommonModule } from '@angular/common'; import { DbService } from '../db.service'; @Component({ selector: 'app-todos-list', standalone: true, imports: [CommonModule], template: ` <ul> <li *ngFor="let t of todosSignal();" >{{ t.title }}</li> </ul> `, }) export class TodosListComponent { private dbService = inject(DbService); // RxDB query - Angular Signal readonly todosSignal = this.dbService.db.todos.find().$$; } An example of how signals are used in angular with RxDB, can be found at the RxDB Angular Example ","version":"Next","tagName":"h2"},{"title":"Accessing custom reactivity objects​","type":1,"pageTitle":"Signals & Co. - Custom reactivity adapters instead of RxJS Observables","url":"/reactivity.html#accessing-custom-reactivity-objects","content":" All observable data in RxDB is marked by the single dollar sign $ like RxCollection.$ for events or RxDocument.myField$ to get the observable for a document field. To make custom reactivity objects distinguable, they are marked with double-dollar signs $$ instead. Here are some example on how to get custom reactivity objects from RxDB specific instances: // RxDocument // get signal that represents the document field 'foobar' const signal = myRxDocument.get$$('foobar'); // same as above const signal = myRxDocument.foobar$$; // get signal that represents whole document over time const signal = myRxDocument.$$; // get signal that represents the deleted state of the document const signal = myRxDocument.deleted$$; // RxQuery // get signal that represents the query result set over time const signal = collection.find().$$; // get signal that represents the query result set over time const signal = collection.findOne().$$; // RxLocalDocument // get signal that represents the whole local document state const signal = myRxLocalDocument.$$; // get signal that represents the foobar field const signal = myRxLocalDocument.get$$('foobar'); ","version":"Next","tagName":"h2"},{"title":"React","type":0,"sectionRef":"#","url":"/react.html","content":"","keywords":"","version":"Next"},{"title":"General concept​","type":1,"pageTitle":"React","url":"/react.html#general-concept","content":" RxDB is internally reactive and emits changes via RxJS observables. React and React Native, however, are render-driven frameworks that rely on component state and hooks. The RxDB React integration bridges these two models by exposing a small set of hooks that translate RxDB state into React renders. Instead of hiding reactivity behind configuration flags, the integration uses explicit hooks. This makes component behavior predictable, avoids accidental subscriptions, and keeps performance characteristics easy to reason about. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"React","url":"/react.html#usage","content":" 1 Installation​ Install RxDB and React as usual: npm install rxdb react react-dom 2 Database creation​ Database creation is not part of the React integration itself. RxDB is created in the same way as in non-React applications, including storage selection, plugins, replication, hooks, and schema definitions. This separation is intentional. React components should never be responsible for creating or configuring the database. They should only consume it. import { createRxDatabase, addRxPlugin } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; async function getDatabase() { const db = await createRxDatabase({ name: 'heroesreactdb', storage: getRxStorageLocalstorage() }); await db.addCollections({ heroes: { schema: myRxSchema } }); /** * Do other stuff here * like setting up middleware * or starting replication. */ return db; } 3 Providing the database​ To use RxDB in a React or React Native application, the database instance must be provided via a context. This is done using RxDatabaseProvider. The database itself is created outside of React, usually in a separate module. The provider is only responsible for making the database available to components once it has been initialized. import React, { useEffect, useState } from 'react'; import { RxDatabaseProvider } from 'rxdb/plugins/react'; import { getDatabase } from './Database'; const App = () => { const [database, setDatabase] = useState(); useEffect(() => { const initDb = async () => { const db = await getDatabase(); setDatabase(db); }; initDb(); }, []); if (database == null) { return <span> Loading <a href="https://rxdb.info/react.html">RxDB</a> database... </span>; } return ( <RxDatabaseProvider database={database}> {/* your application */} </RxDatabaseProvider> ); }; export default App; 4 Accessing collections​ import { useRxCollection } from 'rxdb/plugins/react'; const collection = useRxCollection('heroes'); The hook returns the collection once it becomes available. During the initial render, the value may be undefined, so components must handle this case. This hook does not subscribe to any data. It only provides access to the collection instance. 5 Queries​ To render query results in your component, use the useRxQuery hook. import { useRxQuery } from 'rxdb/plugins/react'; const query = { collection: 'heroes', query: { selector: {}, sort: [{ name: 'asc' }] } }; const HeroCount = () => { const { results, loading } = useRxQuery(query); if (loading) { return <span>Loading...</span>; } return <span>Total heroes: {results.length}</span>; }; The query is executed when the component renders. If the component re-renders, the query may be re-executed, but changes in the underlying data will not automatically trigger updates. This hook is well suited for static views, server-side rendering, and cases where live updates are not required. 6 Live queries​ Most React applications require views that automatically update when the database changes. For this purpose, RxDB provides the useLiveRxQuery hook. The hook accepts a query description object and returns the current results together with a loading state. import { useLiveRxQuery } from 'rxdb/plugins/react'; const query = { collection: 'heroes', query: { selector: {}, sort: [{ name: 'asc' }] } }; const HeroList = () => { const { results, loading } = useLiveRxQuery(query); if (loading) { return <span>Loading...</span>; } return ( <ul> {results.map(hero => ( <li key={hero.name}>{hero.name}</li> ))} </ul> ); }; The component automatically re-renders whenever the query result changes. Subscriptions are created when the component mounts and are cleaned up automatically when the component unmounts. The returned documents are fully reactive RxDB documents and can be modified or removed directly. ","version":"Next","tagName":"h2"},{"title":"React Native compatibility​","type":1,"pageTitle":"React","url":"/react.html#react-native-compatibility","content":" All hooks and providers described on this page work the same way in React Native. The React integration does not rely on any browser-specific APIs. The only platform-specific part of a React Native setup is database creation, where a different storage plugin is typically used. Once the database is created, the React integration behaves identically. ","version":"Next","tagName":"h2"},{"title":"Signals​","type":1,"pageTitle":"React","url":"/react.html#signals","content":" In addition to the React hooks shown on this page, RxDB also supports alternative reactivity models such as signals. RxDB's core reactivity system can be configured to expose reactive values using different primitives instead of RxJS observables, which makes it possible to integrate RxDB with signal-based approaches in React or other frameworks. This is an advanced capability and is independent of the React integration described here. For more details about how RxDB's reactivity system works and how custom reactivity can be configured, see the Reactivity documentation. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"React","url":"/react.html#follow-up","content":" RxDB includes a full React example application that demonstrates the patterns described on this page, including database creation outside of React, usage of RxDatabaseProvider, and data access via useRxQuery, useLiveRxQuery, and `useRxCollection. A corresponding React Native example is also available and shows the same integration concepts applied in a mobile environment, with only the platform-specific storage and setup differing. ","version":"Next","tagName":"h2"},{"title":"React Native Database","type":0,"sectionRef":"#","url":"/react-native-database.html","content":"","keywords":"","version":"Next"},{"title":"Database Solutions for React-Native​","type":1,"pageTitle":"React Native Database","url":"/react-native-database.html#database-solutions-for-react-native","content":" There are multiple database solutions that can be used with React Native. While I would recommend to use RxDB for most use cases, it is still helpful to learn about other alternatives. ","version":"Next","tagName":"h2"},{"title":"AsyncStorage​","type":1,"pageTitle":"React Native Database","url":"/react-native-database.html#asyncstorage","content":" AsyncStorage is a key->value storage solution that works similar to the browsers localstorage API. The big difference is that access to the AsyncStorage is not a blocking operation but instead everything is Promise based. This is a big benefit because long running writes and reads will not block your JavaScript process which would cause a laggy user interface. /** * Because it is Promise-based, * you have to 'await' the call to getItem() */ await setItem('myKey', 'myValue'); const value = await AsyncStorage.getItem('myKey'); AsyncStorage was originally included in React Native itself. But it was deprecated by the React Native Team which recommends to use a community based package instead. There is a community fork of AsyncStorage that is actively maintained and open source. AsyncStorage is fine when only a small amount of data needs to be stored and when no query capabilities besides the key-access are required. Complex queries or features are not supported which makes AsyncStorage not suitable for anything more than storing simple user settings data. ","version":"Next","tagName":"h3"},{"title":"SQLite​","type":1,"pageTitle":"React Native Database","url":"/react-native-database.html#sqlite","content":" SQLite is a SQL based relational database written in C that was crafted to be embed inside of applications. Operations are written in the SQL query language and SQLite generally follows the PostgreSQL syntax. To use SQLite in React Native, you first have to include the SQLite library itself as a plugin. There a different project out there that can be used, but I would recommend to use the react-native-quick-sqlite project. First you have to install the library into your React Native project via npm install react-native-quick-sqlite. In your code you can then import the library and create a database connection: import {open} from 'react-native-quick-sqlite'; const db = open('myDb.sqlite'); Notice that SQLite is a file based database where all data is stored directly in the filesystem of the OS. Therefore to create a connection, you have to provide a filename. With the open connection you can then run SQL queries: let { rows } = db.execute('SELECT somevalue FROM sometable'); If that does not work for you, you might want to try the react-native-sqlite-storage project instead which is also very popular. Downsides of Using SQLite in UI-Based Apps​ While SQLite is reliable and well-tested, it has several shortcomings when it comes to using it directly in UI-based React Native applications: Lack of Observability: Out of the box, SQLite does not offer a straightforward way to observe queries or document fields. This means that implementing real-time data updates in your UI requires additional layers or libraries.Bridging Overhead: Each query or data operation must go through the React Native bridge to access the native SQLite module. This can introduce performance bottlenecks or responsiveness issues, especially for large or complex data operations.No Built-In Replication: SQLite on its own is not designed for syncing data across multiple devices or with a backend. If your app requires multi-device data syncing or offline-first features, additional tools or a custom solution are necessary.Version Management: Handling schema changes often requires a custom migration process. If your data structure evolves frequently, managing these migrations can be cumbersome. Overall, SQLite can be a good solution for straightforward, local-only data storage where complex real-time features or synchronization are not needed. For more advanced requirements, like reactive UI updates or multi-client data replication, you'll likely want a more feature-rich solution. ","version":"Next","tagName":"h3"},{"title":"PouchDB​","type":1,"pageTitle":"React Native Database","url":"/react-native-database.html#pouchdb","content":" PouchDB is a JavaScript NoSQL database that follows the API of the Apache CouchDB server database. The core feature of PouchDB is the ability to do a two-way replication with any CouchDB compliant endpoint. While PouchDB is pretty mature, it has some drawbacks that blocks it from being used in a client-side React Native application. For example it has to store all documents states over time which is required to replicate with CouchDB. Also it is not easily possible to fully purge documents and so it will fill up disc space over time. A big problem is also that PouchDB is not really maintained and major bugs like wrong query results are not fixed anymore. The performance of PouchDB is a general bottleneck which is caused by how it has to store and fetch documents while being compliant to CouchDB. The only real reason to use PouchDB in React Native, is when you want to replicate with a CouchDB or Couchbase server. Because PouchDB is based on an adapter system for storage, there are two options to use it with React Native: Either use the pouchdb-adapter-react-native-sqlite adapteror the pouchdb-adapter-asyncstorage adapter. Because the asyncstorage adapter is no longer maintained, it is recommended to use the native-sqlite adapter: First you have to install the adapter and other dependencies via npm install pouchdb-adapter-react-native-sqlite react-native-quick-sqlite react-native-quick-websql. Then you have to craft a custom PouchDB class that combines these plugins: import 'react-native-get-random-values'; import PouchDB from 'pouchdb-core'; import HttpPouch from 'pouchdb-adapter-http'; import replication from 'pouchdb-replication'; import mapreduce from 'pouchdb-mapreduce'; import SQLiteAdapterFactory from 'pouchdb-adapter-react-native-sqlite'; import WebSQLite from 'react-native-quick-websql'; const SQLiteAdapter = SQLiteAdapterFactory(WebSQLite); export default PouchDB.plugin(HttpPouch) .plugin(replication) .plugin(mapreduce) .plugin(SQLiteAdapter); This can then be used to create a PouchDB database instance which can store and query documents: const db = new PouchDB('mydb.db', { adapter: 'react-native-sqlite' }); ","version":"Next","tagName":"h3"},{"title":"RxDB​","type":1,"pageTitle":"React Native Database","url":"/react-native-database.html#rxdb","content":" RxDB is an local-first, NoSQL-database for JavaScript applications. It is reactive which means that you can not only query the current state, but subscribe to all state changes like the result of a query or even a single field of a document. This is great for UI-based realtime applications in a way that makes it easy to develop realtime applications like what you need in React Native. Key benefits of RxDB include: Observability and Real-Time Queries: Automatic UI updates when underlying data changes, making it much simpler to build responsive, reactive apps.Offline-First and Sync: Built-in support for syncing with CouchDB, or via GraphQL replication, allowing your app to work offline and seamlessly sync when online. It is easy to make the RxDB replication compatible with anything that supports HTTP.Encryption and Data Security: RxDB supports field-level encryption and a robust plugin ecosystem for compression and attachments.Data Modeling and Ease of Use: Offers a schema-based approach that helps catch invalid data early and ensures consistency.Performance: Optimized for storing and querying large amounts of data on mobile devices. There are multiple ways to use RxDB in React Native: Use the memory RxStorage that stores the data inside of the JavaScript memory without persistenceUse the SQLite RxStorage with the react-native-quick-sqlite plugin. It is recommended to use the SQLite RxStorage because it has the best performance and is the easiest to set up. However it is part of the 👑 Premium Plugins which must be purchased, so to try out RxDB with React Native, you might want to use the memory storage first. Later you can replace it with the SQLite storage by just changing two lines of configuration. First you have to install all dependencies via npm install rxdb rxjs rxdb-premium react-native-quick-sqlite. Then you can assemble the RxStorage and create a database with it: 1 Import RxDB and SQLite​ import { createRxDatabase } from 'rxdb'; import { open } from 'react-native-quick-sqlite'; RxDB Core RxDB Premium 👑 import { getRxStorageSQLiteTrial, getSQLiteBasicsCapacitor } from 'rxdb/plugins/storage-sqlite'; 2 Create a database​ const myRxDatabase = await createRxDatabase({ // Instead of a simple name, // you can use a folder path to determine the database location name: 'exampledb', multiInstance: false, // <- Set this to false when using RxDB in React Native storage: getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsQuickSQLite(open) }) }); 3 Add a Collection​ const collections = await myRxDatabase.addCollections({ humans: { schema: { version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string', maxLength: 100 }, name: { type: 'string' }, age: { type: 'number' } }, required: ['id', 'name'] } } }); 4 Insert a Document​ await collections.humans.insert({id: 'foo', name: 'bar'}); 5 Run a Query​ const result = await collections.humans.find({ selector: { name: 'bar' } }).exec(); 6 Observe a Query​ await collections.humans.find({ selector: { name: 'bar' } }).$.subscribe(result => {/* ... */}); Using the SQLite RxStorage is pretty fast, which is shown in the performance comparison. To learn more about using RxDB with React Native, you might want to check out this example project. Also RxDB provides many other features like encryption or compression. You can even store binary data as attachments or use RxDB as an ORM in React Native. ","version":"Next","tagName":"h3"},{"title":"Realm​","type":1,"pageTitle":"React Native Database","url":"/react-native-database.html#realm","content":" Realm is another database solution that is particularly popular in the mobile world. Originally an independent project, Realm is now owned by MongoDB, and has seen deeper integration with MongoDB services over time. Pros: Fast, object-based database approach with an easy data model.Historically known for good performance and a simple, user-friendly API. Downsides: Forced MongoDB Cloud Usage: Realm Sync is now tightly coupled with MongoDB Realm Cloud. If you want to use their full sync or advanced features, you are essentially locked into MongoDB's ecosystem, which can be a downside if you need on-premise or custom hosting.Missing or Limited Features: While Realm covers many basic needs, some developers find that advanced queries or certain offline-first features are not as robust or flexible as other solutions.Vendor Lock-In: If you rely heavily on Realm Sync, migrating away from MongoDB's cloud can be difficult because the sync logic and data format are tightly integrated.Community Concerns: Since the MongoDB acquisition, some worry about Realm's open-source future and whether large changes or new features will remain community-friendly. Although Realm can be a good solution when used purely as a local database, if you plan on syncing data across clients or want to avoid cloud vendor lock-in, you should consider carefully how MongoDB's ownership might affect your long-term plans. ","version":"Next","tagName":"h3"},{"title":"Firebase / Firestore​","type":1,"pageTitle":"React Native Database","url":"/react-native-database.html#firebase--firestore","content":" Firestore is a cloud based database technology that stores data on clients devices and replicates it with the Firebase cloud service that is run by google. It has many features like observability and authentication. The main feature lacking is the non-complete offline first support because clients cannot start the application while being offline because then the authentication does not work. After they are authenticated, being offline is no longer a problem. Also using firestore creates a vendor lock-in because it is not possible to replicate with a custom self hosted backend. To get started with Firestore in React Native, it is recommended to use the React Native Firebase open-source project. ","version":"Next","tagName":"h3"},{"title":"Summary​","type":1,"pageTitle":"React Native Database","url":"/react-native-database.html#summary","content":" Characteristic\tAsyncStorage\tSQLite\tPouchDB\tRxDB\tRealm\tFirestoreDatabase Type\tKey-value store, no advanced queries\tEmbedded SQL engine in a local file\tNoSQL doc store, revision-based\tNoSQL doc-based (JSON)\tObject-based (MongoDB-owned)\tNoSQL doc-based, cloud by Google Query Model\tgetItem/setItem only\tStandard SQL statements\tMap/reduce or basic Mango queries\tJSON-based query language, optional indexes\tObject-level queries, sync with MongoDB Realm\tDocument queries, limited advanced ops Observability\tNone built-in\tNo direct reactivity\tChanges feed from Couch-style backend\tBuilt-in reactive queries, UI auto-updates\tLocal reactivity, or realm sync (cloud)\tReal-time snapshots, partial offline Offline Replication\tNone\tNone by default\tCouchDB-compatible sync\tBuilt-in sync (HTTP, GraphQL, CouchDB, etc.)\tRealm Cloud sync only\tBasic offline caching, re-auth needed Performance\tFine for small keys/values\tGenerally good; bridging overhead\tOK for mid data sets; can bloat over time\tVaries by storage; Dexie/SQLite w/ compression can be fast\tTypically fast on mobile\tGood read-heavy perf; can be rate-limited, costly Schema Handling\tNone\tSQL schema, migrations needed\tNo formal schema, doc-based\tOptional JSON-Schema, typed checks, compression\tDeclarative schema, migration needed\tNo strict schema; rules in console mostly Usage Cases\tStore small user settings\tLocal structured data, moderate queries\tBasic doc store, synergy with CouchDB\tReactive offline-first for large or dynamic data\tLocal object DB, locked to MongoDB realm sync\tReal-time Google backend, partial offline, vendor lock-in ","version":"Next","tagName":"h3"},{"title":"Follow up​","type":1,"pageTitle":"React Native Database","url":"/react-native-database.html#follow-up","content":" A good way to learn using RxDB database with React Native is to check out the RxDB React Native example and use that as a tutorial.If you haven't done so yet, you should start learning about RxDB with the Quickstart Tutorial.There is a followup list of other client side database alternatives that might work with React Native. ","version":"Next","tagName":"h2"},{"title":"Replication with CouchDB","type":0,"sectionRef":"#","url":"/replication-couchdb.html","content":"","keywords":"","version":"Next"},{"title":"Pros​","type":1,"pageTitle":"Replication with CouchDB","url":"/replication-couchdb.html#pros","content":" Faster initial replication.Works with any RxStorage, not just PouchDB.Easier conflict handling because conflicts are handled during replication and not afterwards.Does not have to store all document revisions on the client, only stores the newest version. ","version":"Next","tagName":"h2"},{"title":"Cons​","type":1,"pageTitle":"Replication with CouchDB","url":"/replication-couchdb.html#cons","content":" Does not support the replication of attachments.Like all CouchDB replication plugins, this one is also limited to replicating 6 collections in parallel. Read this for workarounds ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Replication with CouchDB","url":"/replication-couchdb.html#usage","content":" Start the replication via replicateCouchDB(). import { replicateCouchDB } from 'rxdb/plugins/replication-couchdb'; const replicationState = replicateCouchDB( { replicationIdentifier: 'my-couchdb-replication', collection: myRxCollection, // url to the CouchDB endpoint (required) url: 'http://example.com/db/humans', /** * true for live replication, * false for a one-time replication. * [default=true] */ live: true, /** * A custom fetch() method can be provided * to add authentication or credentials. * Can be swapped out dynamically * by running 'replicationState.fetch = newFetchMethod;'. * (optional) */ fetch: myCustomFetchMethod, pull: { /** * Amount of documents to be fetched in one HTTP request * (optional) */ batchSize: 60, /** * Custom modifier to mutate pulled documents * before storing them in RxDB. * (optional) */ modifier: docData => {/* ... */}, /** * Heartbeat time in milliseconds * for the long polling of the changestream. * @link https://docs.couchdb.org/en/3.2.2-docs/api/database/changes.html * (optional, default=60000) */ heartbeat: 60000 }, push: { /** * How many local changes to process at once. * (optional) */ batchSize: 60, /** * Custom modifier to mutate documents * before sending them to the CouchDB endpoint. * (optional) */ modifier: docData => {/* ... */} } } ); When you call replicateCouchDB() it returns a RxCouchDBReplicationState which can be used to subscribe to events, for debugging or other functions. It extends the RxReplicationState so any other method that can be used there can also be used on the CouchDB replication state. ","version":"Next","tagName":"h2"},{"title":"Conflict handling​","type":1,"pageTitle":"Replication with CouchDB","url":"/replication-couchdb.html#conflict-handling","content":" When conflicts appear during replication, the conflictHandler of the RxCollection is used, equal to the other replication plugins. Read more about conflict handling here. ","version":"Next","tagName":"h2"},{"title":"Auth example​","type":1,"pageTitle":"Replication with CouchDB","url":"/replication-couchdb.html#auth-example","content":" Lets say for authentication you need to add a bearer token as HTTP header to each request. You can achieve that by crafting a custom fetch() method that add the header field. const myCustomFetch = (url, options) => { // flat clone the given options to not mutate the input const optionsWithAuth = Object.assign({}, options); // ensure the headers property exists if(!optionsWithAuth.headers) { optionsWithAuth.headers = {}; } // add bearer token to headers optionsWithAuth.headers['Authorization'] ='Basic S0VLU0UhIExFQ0...'; // call the original fetch function with our custom options. return fetch( url, optionsWithAuth ); }; const replicationState = replicateCouchDB( { replicationIdentifier: 'my-couchdb-replication', collection: myRxCollection, url: 'http://example.com/db/humans', /** * Add the custom fetch function here. */ fetch: myCustomFetch, pull: {}, push: {} } ); Also when your bearer token changes over time, you can set a new custom fetch method while the replication is running: replicationState.fetch = newCustomFetchMethod; Also there is a helper method getFetchWithCouchDBAuthorization() to create a fetch handler with authorization: import { replicateCouchDB, getFetchWithCouchDBAuthorization } from 'rxdb/plugins/replication-couchdb'; const replicationState = replicateCouchDB( { replicationIdentifier: 'my-couchdb-replication', collection: myRxCollection, url: 'http://example.com/db/humans', /** * Add the custom fetch function here. */ fetch: getFetchWithCouchDBAuthorization('myUsername', 'myPassword'), pull: {}, push: {} } ); ","version":"Next","tagName":"h2"},{"title":"Limitations​","type":1,"pageTitle":"Replication with CouchDB","url":"/replication-couchdb.html#limitations","content":" Since CouchDB only allows synchronization through HTTP1.1 long polling requests there is a limitation of 6 active synchronization connections before the browser prevents sending any further request. This limitation is at the level of browser per tab per domain (some browser, especially older ones, might have a different limit, see here). Since this limitation is at the browser level there are several solutions: Use only a single database for all entities and set a "type" field for each of the documentsCreate multiple subdomains for CouchDB and use a max of 6 active synchronizations (or less) for eachUse a proxy (ex: HAProxy) between the browser and CouchDB and configure it to use HTTP2.0, since HTTP2.0 If you use nginx in front of your CouchDB, you can use these settings to enable http2-proxying to prevent the connection limit problem: server { http2 on; location /db { rewrite /db/(.*) /$1 break; proxy_pass http://172.0.0.1:5984; proxy_redirect off; proxy_buffering off; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded proxy_set_header Connection "keep_alive" } } ","version":"Next","tagName":"h2"},{"title":"Known problems​","type":1,"pageTitle":"Replication with CouchDB","url":"/replication-couchdb.html#known-problems","content":" ","version":"Next","tagName":"h2"},{"title":"Database missing​","type":1,"pageTitle":"Replication with CouchDB","url":"/replication-couchdb.html#database-missing","content":" In contrast to PouchDB, this plugin does NOT automatically create missing CouchDB databases. If your CouchDB server does not have a database yet, you have to create it by yourself by running a PUT request to the database name url: // create a 'humans' CouchDB database on the server const remoteDatabaseName = 'humans'; await fetch( 'http://example.com/db/' + remoteDatabaseName, { method: 'PUT' } ); ","version":"Next","tagName":"h3"},{"title":"React Native​","type":1,"pageTitle":"Replication with CouchDB","url":"/replication-couchdb.html#react-native","content":" React Native does not have a global fetch method. You have to import fetch method with the cross-fetch package: import crossFetch from 'cross-fetch'; const replicationState = replicateCouchDB( { replicationIdentifier: 'my-couchdb-replication', collection: myRxCollection, url: 'http://example.com/db/humans', fetch: crossFetch, pull: {}, push: {} } ); ","version":"Next","tagName":"h2"},{"title":"Replication with Firestore from Firebase","type":0,"sectionRef":"#","url":"/replication-firestore.html","content":"","keywords":"","version":"Next"},{"title":"Usage​","type":1,"pageTitle":"Replication with Firestore from Firebase","url":"/replication-firestore.html#usage","content":" 1 Install the firebase package​ npm install firebase 2 Initialize your Firestore Database​ import * as firebase from 'firebase/app'; import { getFirestore, collection } from 'firebase/firestore'; const projectId = 'my-project-id'; const app = firebase.initializeApp({ projectId, databaseURL: 'http://localhost:8080?ns=' + projectId, /* ... */ }); const firestoreDatabase = getFirestore(app); const firestoreCollection = collection(firestoreDatabase, 'my-collection-name'); 3 Start the Replication​ Start the replication by calling replicateFirestore() on your RxCollection. const replicationState = replicateFirestore({ replicationIdentifier: `https://firestore.googleapis.com/${projectId}`, collection: myRxCollection, firestore: { projectId, database: firestoreDatabase, collection: firestoreCollection }, /** * (required) Enable push and pull replication with firestore by * providing an object with optional filter * for each type of replication desired. * [default=disabled] */ pull: {}, push: {}, /** * Either do a live or a one-time replication * [default=true] */ live: true, /** * (optional) likely you should just use the default. * * In firestore it is not possible to read out * the internally used write timestamp of a document. * Even if we could read it out, it is not indexed which * is required for fetch 'changes-since-x'. * So instead we have to rely on a custom user defined field * that contains the server time * which is set by firestore via serverTimestamp() * Notice that the serverTimestampField MUST NOT be * part of the collections RxJsonSchema! * [default='serverTimestamp'] */ serverTimestampField: 'serverTimestamp' }); To observe and cancel the replication, you can use any other methods from the ReplicationState like error$, cancel() and awaitInitialReplication(). ","version":"Next","tagName":"h2"},{"title":"Handling deletes​","type":1,"pageTitle":"Replication with Firestore from Firebase","url":"/replication-firestore.html#handling-deletes","content":" RxDB requires you to never fully delete documents. This is needed to be able to replicate the deletion state of a document to other instances. The firestore replication will set a boolean _deleted field to all documents to indicate the deletion state. You can change this by setting a different deletedField in the sync options. ","version":"Next","tagName":"h2"},{"title":"Do not set enableIndexedDbPersistence()​","type":1,"pageTitle":"Replication with Firestore from Firebase","url":"/replication-firestore.html#do-not-set-enableindexeddbpersistence","content":" Firestore has the enableIndexedDbPersistence() feature which caches document states locally to IndexedDB. This is not needed when you replicate your Firestore with RxDB because RxDB itself will store the data locally already. ","version":"Next","tagName":"h2"},{"title":"Using the replication with an already existing Firestore Database State​","type":1,"pageTitle":"Replication with Firestore from Firebase","url":"/replication-firestore.html#using-the-replication-with-an-already-existing-firestore-database-state","content":" If you have not used RxDB before and you already have documents inside of your Firestore database, you have to manually set the _deleted field to false and the serverTimestamp to all existing documents. import { getDocs, query, serverTimestamp } from 'firebase/firestore'; const allDocsResult = await getDocs(query(firestoreCollection)); allDocsResult.forEach(doc => { doc.update({ _deleted: false, serverTimestamp: serverTimestamp() }) }); Also notice that if you do writes from non-RxDB applications, you have to keep these fields in sync. It is recommended to use the Firestore triggers to ensure that. ","version":"Next","tagName":"h2"},{"title":"Filtered Replication​","type":1,"pageTitle":"Replication with Firestore from Firebase","url":"/replication-firestore.html#filtered-replication","content":" You might need to replicate only a subset of your collection, either to or from Firestore. You can achieve this using push.filter and pull.filter options. const replicationState = replicateFirestore( { collection: myRxCollection, firestore: { projectId, database: firestoreDatabase, collection: firestoreCollection }, pull: { filter: [ where('ownerId', '==', userId) ] }, push: { filter: (item) => item.syncEnabled === true } } ); Keep in mind that you can not use inequality operators (<, <=, !=, not-in, >, or >=) in pull.filter since that would cause a conflict with ordering by serverTimestamp. ","version":"Next","tagName":"h2"},{"title":"RxDB Appwrite Replication","type":0,"sectionRef":"#","url":"/replication-appwrite.html","content":"","keywords":"","version":"Next"},{"title":"Why you should use RxDB with Appwrite?​","type":1,"pageTitle":"RxDB Appwrite Replication","url":"/replication-appwrite.html#why-you-should-use-rxdb-with-appwrite","content":" Appwrite is a secure, open-source backend server that simplifies backend tasks like user authentication, storage, database management, and real-time APIs. RxDB is a reactive database for the frontend that offers offline-first capabilities and rich client-side data handling. Combining the two provides several benefits: Offline-First: RxDB keeps all data locally, so your application remains fully functional even when the network is unavailable. When connectivity returns, the RxDB ↔ Appwrite replication automatically resolves and synchronizes changes. Real-Time Sync: With Appwrite’s real-time subscriptions and RxDB’s live replication, you can build collaborative features that update across all clients instantaneously. Conflict Handling: RxDB offers flexible conflict resolution strategies, making it simpler to handle concurrent edits across multiple users or devices. Scalable & Secure: Appwrite is built to handle production loads with granular access controls, while RxDB easily scales across various storage backends on the client side. Simplicity & Modularity: RxDB’s plugin-based architecture, combined with Appwrite’s Cloud offering makes it one of the easiest way to build local-first realtime apps that scale. Client A Client B Client C ","version":"Next","tagName":"h2"},{"title":"Preparing the Appwrite Server​","type":1,"pageTitle":"RxDB Appwrite Replication","url":"/replication-appwrite.html#preparing-the-appwrite-server","content":" You can either use the appwrite cloud or self-host the Appwrite server. In this tutorial we use the Cloud which is recommended for beginners because it is way easier to set up. You can later decide to self-host if needed. 1 Set up an Appwrite Endpoint and Project​ Self-Hosted Appwrite Cloud 1 Docker​ Ensure docker and docker-compose is installed and your version are up to date: docker-compose -v 2 Run the installation script​ The installation script runs inside of a docker container. It will create a docker-compose file and an .env file. docker run -it --rm \\ --volume /var/run/docker.sock:/var/run/docker.sock \\ --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \\ --entrypoint="install" \\ appwrite/appwrite:1.6.1 3 Start/Stop​ After the installation is done, you can manually stop and start the appwrite instance with docker compose: # stop docker-compose down # start docker-compose up 2 Create an Appwrite Database and Collection​ After creating an Appwrite project you have to create an Appwrite Database and a collection, you can either do this in code with the node-appwrite SDK or in the Appwrite Console as shown in this video: 9:47 Appwrite Database Tutorial 3 Add your documents attributes​ In the appwrite collection, create all attributes of your documents. You have to define all the fields that your document in your RxDB schema knows about. Notice that Appwrite does not allow for nested attributes. So when you use RxDB with Appwrite, you should also not have nested attributes in your RxDB schema. 4 Add a deleted attribute​ Appwrite (natively) hard-deletes documents. But for offline-handling RxDB needs soft-deleted documents on the server so that the deletion state can be replicated with other clients. In RxDB, _deleted indicates that a document is removed locally and you need a similar field in your Appwrite collection on the Server: You must define a deletedField with any name to mark documents as "deleted" in the remote collection. Mostly you would use a boolean field named deleted (set it to required). The plugin will treat any document with { [deletedField]: true } as deleted and replicate that state to local RxDB. 5 Set the Permission on the Appwrite Collection​ Appwrite uses permissions to control data access on the collection level. Make sure that in the Console at Collection -> Settings -> Permissions you have set the permission according to what you want to allow your clients to do. For testing, just enable all of them (Create, Read, Update and Delete). ","version":"Next","tagName":"h2"},{"title":"Setting up the RxDB - Appwrite Replication​","type":1,"pageTitle":"RxDB Appwrite Replication","url":"/replication-appwrite.html#setting-up-the-rxdb---appwrite-replication","content":" Now that we have set up the Appwrite server, we can go to the client side code and set up RxDB and the replication: 1 Install the Appwrite SDK and RxDB:​ npm install appwrite rxdb 2 Import the Appwrite SDK and RxDB​ import { replicateAppwrite } from 'rxdb/plugins/replication-appwrite'; import { createRxDatabase, addRxPlugin, RxCollection } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; import { Client } from 'appwrite'; 3 Create a Database with a Collection​ const db = await createRxDatabase({ name: 'mydb', storage: getRxStorageLocalstorage() }); const mySchema = { title: 'my schema', version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 }, name: { type: 'string' } }, required: ['id', 'name'] }; await db.addCollections({ humans: { schema: mySchema } }); const collection = db.humans; 4 Configure the Appwrite Client​ Appwrite Cloud Self-Hosted const client = new Client(); client.setEndpoint('https://cloud.appwrite.io/v1'); client.setProject('YOUR_APPWRITE_PROJECT_ID'); 5 Start the Replication​ const replicationState = replicateAppwrite({ replicationIdentifier: 'my-appwrite-replication', client, databaseId: 'YOUR_APPWRITE_DATABASE_ID', collectionId: 'YOUR_APPWRITE_COLLECTION_ID', deletedField: 'deleted', // Field that represents deletion in Appwrite collection, pull: { batchSize: 10, }, push: { batchSize: 10 }, /* * ... * You can set all other options for RxDB replication states * like 'live' or 'retryTime' * ... */ }); 6 Do other things with the replication state​ The RxAppwriteReplicationState which is returned from replicateAppwrite() allows you to run all functionality of the normal RxReplicationState. ","version":"Next","tagName":"h2"},{"title":"Limitations of the Appwrite Replication Plugin​","type":1,"pageTitle":"RxDB Appwrite Replication","url":"/replication-appwrite.html#limitations-of-the-appwrite-replication-plugin","content":" Appwrite primary keys only allow for the characters a-z, A-Z, 0-9, and underscore _ (They cannot start with a leading underscore). Also the primary key has a max length of 36 characters.The Appwrite replication only works on browsers. This is because the Appwrite SDK does not support subscriptions in Node.js.Appwrite does not allow for bulk write operations so on push one HTTP request will be made per document. Reads run in bulk so this is mostly not a problem.Appwrite does not allow for transactions or "update-if" calls which can lead to overwriting documents instead of properly handling conflicts when multiple clients edit the same document in parallel. This is not a problem for inserts because "insert-if-not" calls are made.Nested attributes in Appwrite collections are only possible via experimental relationship attributes, and compatibility with RxDB is not tested. Users opting to use these experimental relationship attributes with RxDB do so at their own risk. ","version":"Next","tagName":"h2"},{"title":"Replication with NATS","type":0,"sectionRef":"#","url":"/replication-nats.html","content":"","keywords":"","version":"Next"},{"title":"Precondition​","type":1,"pageTitle":"Replication with NATS","url":"/replication-nats.html#precondition","content":" For the replication endpoint the NATS cluster must have enabled JetStream and store all message data as structured JSON. The easiest way to start a compatible NATS server is to use the official docker image: docker run --rm --name rxdb-nats -p 4222:4222 nats:2.9.17 -js ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Replication with NATS","url":"/replication-nats.html#usage","content":" 1 Install the nats package​ npm install nats --save 2 Start the Replication​ To start the replication, import the replicateNats() method from the RxDB plugin and call it with the collection that must be replicated. The replication runs per RxCollection, you can replicate multiple RxCollections by starting a new replication for each of them. import { replicateNats } from 'rxdb/plugins/replication-nats'; const replicationState = replicateNats({ collection: myRxCollection, replicationIdentifier: 'my-nats-replication-collection-A', // in NATS, each stream need a name streamName: 'stream-for-replication-A', /** * The subject prefix determines how the documents are stored in NATS. * For example the document with id 'alice' * will have the subject 'foobar.alice' */ subjectPrefix: 'foobar', connection: { servers: 'localhost:4222' }, live: true, pull: { batchSize: 30 }, push: { batchSize: 30 } }); ","version":"Next","tagName":"h2"},{"title":"Handling deletes​","type":1,"pageTitle":"Replication with NATS","url":"/replication-nats.html#handling-deletes","content":" RxDB requires you to never fully delete documents. This is needed to be able to replicate the deletion state of a document to other instances. The NATS replication will set a boolean _deleted field to all documents to indicate the deletion state. You can change this by setting a different deletedField in the sync options. ","version":"Next","tagName":"h2"},{"title":"The RxDB Plugin replication-p2p has been renamed to replication-webrtc","type":0,"sectionRef":"#","url":"/replication-p2p.html","content":"The RxDB Plugin replication-p2p has been renamed to replication-webrtc The new documentation page has been moved to here","keywords":"","version":"Next"},{"title":"MongoDB Replication Plugin for RxDB - Real-Time, Offline-First Sync","type":0,"sectionRef":"#","url":"/replication-mongodb.html","content":"","keywords":"","version":"Next"},{"title":"Key Features​","type":1,"pageTitle":"MongoDB Replication Plugin for RxDB - Real-Time, Offline-First Sync","url":"/replication-mongodb.html#key-features","content":" Two-way replication between MongoDB and RxDB collectionsOffline-first support with automatic incremental re-syncIncremental updates via MongoDB Change StreamsConflict resolution handled by the RxDB Sync EngineAtlas and self-hosted support for replica sets and sharded clusters ","version":"Next","tagName":"h2"},{"title":"Architecture Overview​","type":1,"pageTitle":"MongoDB Replication Plugin for RxDB - Real-Time, Offline-First Sync","url":"/replication-mongodb.html#architecture-overview","content":" The plugin operates in a three-tier architecture: Clients connect to RxServer, which in turn connects to MongoDB. RxServer streams changes from MongoDB to connected clients and pushes client-side updates back to MongoDB. For the client side, RxServer exposes a replication endpoint over WebSocket or HTTP, which your RxDB-powered applications can consume. The following diagram illustrates the flow of updates between clients, RxServer, and MongoDB in a live synchronization setup: Client A RxServer MongoDB Client B Client C note The MongoDB Replication Plugin is optimized for Node.js environments (e.g., when RxDB runs within RxServer or other backend services). Direct connections from browsers or mobile apps to MongoDB are not supported because MongoDB does not use HTTP as its wire protocol and requires a driver-level connection to a replica set or sharded cluster. ","version":"Next","tagName":"h2"},{"title":"Setting up the Client-RxServer-MongoDB Sync​","type":1,"pageTitle":"MongoDB Replication Plugin for RxDB - Real-Time, Offline-First Sync","url":"/replication-mongodb.html#setting-up-the-client-rxserver-mongodb-sync","content":" 1 Install the Client Dependencies​ In your JavaScript project, install the RxDB libraries and the MongoDB node.js driver: npm install rxdb rxdb-server mongodb --save 2 Set up a MongoDB Server​ As first step, you need access to a running MongoDB Server. This can be done by either running a server locally or using the Atlas Cloud. Notice that we need to have a replica set because only on these, the MongoDB changestream can be used. Shell Docker MongoDB Atlas If you have installed MongoDB locally, you can start the server with this command: mongod --replSet rs0 --bind_ip_all After this step you should have a valid connection string that points to a running MongoDB Server like mongodb://localhost:27017/. 3 Create a MongoDB Database and Collection​ On your MongoDB server, make sure to create a database and a collection. //> server.ts import { MongoClient } from 'mongodb'; const mongoClient = new MongoClient('mongodb://localhost:27017/?directConnection=true'); const mongoDatabase = mongoClient.db('my-database'); await mongoDatabase.createCollection('my-collection', { changeStreamPreAndPostImages: { enabled: true } }); note To observe document deletions on the changestream, changeStreamPreAndPostImages must be enabled. This is not required if you have an insert/update-only collection where no documents are deleted ever. 4 Create a RxDB Database and Collection​ Now we create an RxDB database and a collection. In this example the memory storage, in production you would use a persistent storage instead. //> server.ts import { createRxDatabase, addRxPlugin } from 'rxdb'; import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; // Create server-side RxDB instance const db = await createRxDatabase({ name: 'serverdb', storage: getRxStorageMemory() }); // Add your collection schema await db.addCollections({ humans: { schema: { version: 0, primaryKey: 'passportId', type: 'object', properties: { passportId: { type: 'string', maxLength: 100 }, firstName: { type: 'string' }, lastName: { type: 'string' } }, required: ['passportId', 'firstName', 'lastName'] } } }); 5 Sync the Collection with the MongoDB Server​ Now we can start a replication that does a two-way replication between the RxDB Collection and the MongoDB Collection. //> server.ts import { replicateMongoDB } from 'rxdb/plugins/replication-mongodb'; const replicationState = replicateMongoDB({ mongodb: { collectionName: 'my-collection', connection: 'mongodb://localhost:27017', databaseName: 'my-database' }, collection: db.humans, replicationIdentifier: 'humans-mongodb-sync', pull: { batchSize: 50 }, push: { batchSize: 50 }, live: true }); You can do many things with the replication state The RxMongoDBReplicationState which is returned from replicateMongoDB() allows you to run all functionality of the normal RxReplicationState like observing errors or doing start/stop operations. 6 Start a RxServer​ Now that we have a RxDatabase and Collection that is replicated with MongoDB, we can spawn a RxServer on top of it. This server can then be used by client devices to connect. //> server.ts import { createRxServer } from 'rxdb-server/plugins/server'; import { RxServerAdapterExpress } from 'rxdb-server/plugins/adapter-express'; const server = await createRxServer({ database: db, adapter: RxServerAdapterExpress, port: 8080, cors: '*' }); const endpoint = server.addReplicationEndpoint({ name: 'humans', collection: db.humans }); console.log('Replication endpoint:', `http://localhost:8080/${endpoint.urlPath}`); // do not forget to start the server! await server.start(); 7 Sync a Client with the RxServer​ On the client-side we create the exact same RxDatabase and collection and then replicate it with the replication endpoint of the RxServer. //> client.ts import { createRxDatabase } from 'rxdb'; import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; import { replicateServer } from 'rxdb-server/plugins/replication-server'; const db = await createRxDatabase({ name: 'mydb-client', storage: getRxStorageDexie() }); await db.addCollections({ humans: { schema: { version: 0, primaryKey: 'passportId', type: 'object', properties: { passportId: { type: 'string', maxLength: 100 }, firstName: { type: 'string' }, lastName: { type: 'string' } }, required: ['passportId', 'firstName', 'lastName'] } } }); // Start replication to the RxServer endpoint printed by the server: // e.g. http://localhost:8080/humans/0 const replicationState = replicateServer({ replicationIdentifier: 'humans-rxserver', collection: db.humans, url: 'http://localhost:8080/humans/0', live: true, pull: { batchSize: 50 }, push: { batchSize: 50 } }); ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"MongoDB Replication Plugin for RxDB - Real-Time, Offline-First Sync","url":"/replication-mongodb.html#follow-up","content":" Try it out with the RxDB-MongoDB example repositoryRead From Local to Global: Scalable Edge Apps with RxDB + MongoDBReplication API ReferenceRxServer DocumentationJoin our Discord Forum for questions and feedback ","version":"Next","tagName":"h2"},{"title":"HTTP Replication from a custom server to RxDB clients","type":0,"sectionRef":"#","url":"/replication-http.html","content":"","keywords":"","version":"Next"},{"title":"Setup​","type":1,"pageTitle":"HTTP Replication from a custom server to RxDB clients","url":"/replication-http.html#setup","content":" 1 Start the Replication on the RxDB Client​ RxDB does not have a specific HTTP-replication plugin because the replication primitives plugin is simple enough to start a HTTP replication on top of it. We import the replicateRxCollection function and start the replication from there for a single RxCollection. // > client.ts import { replicateRxCollection } from 'rxdb/plugins/replication'; const replicationState = await replicateRxCollection({ collection: myRxCollection, replicationIdentifier: 'my-http-replication', push: { /* add settings from below */ }, pull: { /* add settings from below */ } }); 2 Start a Node.js process with Express and MongoDB​ On the server side, we start an express server that has a MongoDB connection and serves the HTTP requests of the client. // > server.ts import { MongoClient } from 'mongodb'; import express from 'express'; const mongoClient = new MongoClient('mongodb://localhost:27017/'); const mongoConnection = await mongoClient.connect(); const mongoDatabase = mongoConnection.db('myDatabase'); const mongoCollection = await mongoDatabase.collection('myDocs'); const app = express(); app.use(express.json()); /* ... add routes from below */ app.listen(80, () => { console.log(`Example app listening on port 80`) }); 3 Implement the Pull Endpoint​ As first HTTP Endpoint, we need to implement the pull handler. This is used by the RxDB replication to fetch all documents writes that happened after a given checkpoint. The checkpoint format is not determined by RxDB, instead the server can use any type of changepoint that can be used to iterate across document writes. Here we will just use a unix timestamp updatedAt and a string id which is the most common used format. When the pull endpoint is called, the server responds with an array of document data based on the given checkpoint and a new checkpoint. Also the server has to respect the batchSize so that RxDB knows when there are no more new documents and the server returns a non-full array. // > server.ts import { lastOfArray } from 'rxdb/plugins/core'; app.get('/pull', (req, res) => { const id = req.query.id; const updatedAt = parseFloat(req.query.updatedAt); const documents = await mongoCollection.find({ $or: [ /** * Notice that we have to compare the updatedAt AND the id field * because the updateAt field is not unique and when two documents * have the same updateAt, we can still "sort" them by their id. */ { updateAt: { $gt: updatedAt } }, { updateAt: { $eq: updatedAt } id: { $gt: id } } ] }) .sort({updateAt: 1, id: 1}) .limit(parseInt(req.query.batchSize, 10)).toArray(); const newCheckpoint = documents.length === 0 ? { id, updatedAt } : { id: lastOfArray(documents).id, updatedAt: lastOfArray(documents).updatedAt }; res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify({ documents, checkpoint: newCheckpoint })); }); 4 Implement the Pull Handler​ On the client we add the pull.handler to the replication setting. The handler request the correct server url and fetches the documents. // > client.ts const replicationState = await replicateRxCollection({ /* ... */ pull: { async handler(checkpointOrNull, batchSize){ const updatedAt = checkpointOrNull ? checkpointOrNull.updatedAt : 0; const id = checkpointOrNull ? checkpointOrNull.id : ''; const response = await fetch( `https://localhost/pull?updatedAt=${updatedAt}&id=${id}&limit=${batchSize}` ); const data = await response.json(); return { documents: data.documents, checkpoint: data.checkpoint }; } } /* ... */ }); 5 Implement the Push Endpoint​ To send client side writes to the server, we have to implement the push.handler. It gets an array of change rows as input and has to return only the conflicting documents that did not have been written to the server. Each change row contains a newDocumentState and an optional assumedMasterState. For conflict detection, on the server we first have to detect if the assumedMasterState is correct for each row. If yes, we have to write the new document state to the database, otherwise we have to return the "real" master state in the conflict array. The server also creates an event that is emitted to the pullStream$ which is later used in the pull.stream$. // > server.ts import { lastOfArray } from 'rxdb/plugins/core'; import { Subject } from 'rxjs'; // used in the pull.stream$ below let lastEventId = 0; const pullStream$ = new Subject(); app.get('/push', (req, res) => { const changeRows = req.body; const conflicts = []; const event = { id: lastEventId++, documents: [], checkpoint: null }; for(const changeRow of changeRows){ const realMasterState = mongoCollection.findOne({id: changeRow.newDocumentState.id}); if( realMasterState && !changeRow.assumedMasterState || ( realMasterState && changeRow.assumedMasterState && /* * For simplicity we detect conflicts on the server by only compare the updateAt value. * In reality you might want to do a more complex check or do a deep-equal comparison. */ realMasterState.updatedAt !== changeRow.assumedMasterState.updatedAt ) ) { // we have a conflict conflicts.push(realMasterState); } else { // no conflict -> write the document mongoCollection.updateOne( {id: changeRow.newDocumentState.id}, changeRow.newDocumentState ); event.documents.push(changeRow.newDocumentState); event.checkpoint = { id: changeRow.newDocumentState.id, updatedAt: changeRow.newDocumentState.updatedAt }; } } if(event.documents.length > 0){ myPullStream$.next(event); } res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify(conflicts)); }); note For simplicity in this tutorial, we do not use transactions. In reality you should run the full push function inside of a MongoDB transaction to ensure that no other process can mix up the document state while the writes are processed. Also you should call batch operations on MongoDB instead of running the operations for each change row. 6 Implement the Push Handler​ With the push endpoint in place, we can add a push.handler to the replication settings on the client. // > client.ts const replicationState = await replicateRxCollection({ /* ... */ push: { async handler(changeRows){ const rawResponse = await fetch('https://localhost/push', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify(changeRows) }); const conflictsArray = await rawResponse.json(); return conflictsArray; } } /* ... */ }); 7 Implement the pullStream$ Endpoint​ While the normal pull handler is used when the replication is in iteration mode, we also need a stream of ongoing changes when the replication is in event observation mode. This brings the realtime replication to RxDB where changes on the server or on a client will directly get propagated to the other instances. On the server we have to implement the pullStream route and emit the events. We use the pullStream$ observable from above to fetch all ongoing events and respond them to the client. Here we use Server-Sent-Events (SSE) which is the most common used way to stream data from the server to the client. Other method also exist like WebSockets or Long-Polling. // > server.ts app.get('/pullStream', (req, res) => { res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Connection': 'keep-alive', 'Cache-Control': 'no-cache' }); const subscription = pullStream$.subscribe(event => { res.write('data: ' + JSON.stringify(event) + '\\n\\n'); }); req.on('close', () => subscription.unsubscribe()); }); note How the build the pullStream$ Observable is not part of this tutorial. This heavily depends on your backend and infrastructure. Likely you have to observe the MongoDB event stream. 8 Implement the pullStream$ Handler​ From the client we can observe this endpoint and create a pull.stream$ observable that emits all events that are send from the server to the client. The client connects to an url and receives server-sent-events that contain all ongoing writes. // > client.ts import { Subject } from 'rxjs'; const myPullStream$ = new Subject(); const eventSource = new EventSource( 'http://localhost/pullStream', { withCredentials: true } ); eventSource.onmessage = event => { const eventData = JSON.parse(event.data); myPullStream$.next({ documents: eventData.documents, checkpoint: eventData.checkpoint }); }; const replicationState = await replicateRxCollection({ /* ... */ pull: { /* ... */ stream$: myPullStream$.asObservable() } /* ... */ }); 9 pullStream$ RESYNC flag​ In case the client looses the connection, the EventSource will automatically reconnect but there might have been some changes that have been missed out in the meantime. The replication has to be informed that it might have missed events by emitting a RESYNC flag from the pull.stream$. The replication will then catch up by switching to the iteration mode until it is in sync with the server again. // > client.ts eventSource.onerror = () => myPullStream$.next('RESYNC'); The purpose of the RESYNC flag is to tell the client that "something might have changed" and then the client can react on that information without having to run operations in an interval. If your backend is not capable of emitting the actual documents and checkpoint in the pull stream, you could just map all events to the RESYNC flag. This would make the replication work with a slight performance drawback: // > client.ts import { Subject } from 'rxjs'; const myPullStream$ = new Subject(); const eventSource = new EventSource( 'http://localhost/pullStream', { withCredentials: true } ); eventSource.onmessage = () => myPullStream$.next('RESYNC'); const replicationState = await replicateRxCollection({ pull: { stream$: myPullStream$.asObservable() } }); ","version":"Next","tagName":"h2"},{"title":"Missing implementation details​","type":1,"pageTitle":"HTTP Replication from a custom server to RxDB clients","url":"/replication-http.html#missing-implementation-details","content":" In this tutorial we only covered the basics of doing a HTTP replication between RxDB clients and a server. We did not cover the following aspects of the implementation: Authentication: To authenticate the client on the server, you might want to send authentication headers with the HTTP requestsSkip events on the pull.stream$ for the client that caused the changes to improve performance.Version upgrades: You should add a version-flag to the endpoint urls. If you then update the version of your endpoints in any way, your old endpoints should emit a Code 426 to outdated clients so that they can updated their client version. ","version":"Next","tagName":"h2"},{"title":"RxDB Server Replication","type":0,"sectionRef":"#","url":"/replication-server.html","content":"","keywords":"","version":"Next"},{"title":"Usage​","type":1,"pageTitle":"RxDB Server Replication","url":"/replication-server.html#usage","content":" The replication server plugin is imported from the rxdb-server npm package. Then you start the replication with a given collection and endpoint url by calling replicateServer(). import { replicateServer } from 'rxdb-server/plugins/replication-server'; const replicationState = await replicateServer({ collection: usersCollection, replicationIdentifier: 'my-server-replication', url: 'http://localhost:80/users/0', // endpoint url with the servers collection schema version at the end headers: { Authorization: 'Bearer S0VLU0UhI...' }, push: {}, pull: {}, live: true }); ","version":"Next","tagName":"h2"},{"title":"outdatedClient$​","type":1,"pageTitle":"RxDB Server Replication","url":"/replication-server.html#outdatedclient","content":" When you update your schema at the server and run a migration, you end up with a different replication url that has a new schema version number at the end. Your clients might still be running an old version of your application that will no longer be compatible with the endpoint. Therefore when the client tries to call a server endpoint with an outdated schema version, the outdatedClient$ observable emits to tell your client that the application must be updated. With that event you can tell the client to update the application. On browser application you might want to just reload the page on that event: replicationState.outdatedClient$.subscribe(() => { location.reload(); }); ","version":"Next","tagName":"h2"},{"title":"unauthorized$​","type":1,"pageTitle":"RxDB Server Replication","url":"/replication-server.html#unauthorized","content":" When you clients auth data is not valid (or no longer valid), the server will no longer accept any requests from you client and inform the client that the auth headers must be updated. The unauthorized$ observable will emit and expects you to update the headers accordingly so that following requests will be accepted again. replicationState.unauthorized$.subscribe(() => { replicationState.setHeaders({ Authorization: 'Bearer S0VLU0UhI...' }); }); ","version":"Next","tagName":"h2"},{"title":"forbidden$​","type":1,"pageTitle":"RxDB Server Replication","url":"/replication-server.html#forbidden","content":" When you client behaves wrong in any case, like update non-allowed values or changing documents that it is not allowed to, the server will drop the connection and the replication state will emit on the forbidden$ observable. It will also automatically stop the replication so that your client does not accidentally DOS attack the server. replicationState.forbidden$.subscribe(() => { console.log('Client is behaving wrong'); }); ","version":"Next","tagName":"h2"},{"title":"Custom EventSource implementation​","type":1,"pageTitle":"RxDB Server Replication","url":"/replication-server.html#custom-eventsource-implementation","content":" For the server send events, the eventsource npm package is used instead of the native EventSource API. We need this because the native browser API does not support sending headers with the request which is required by the server to parse the auth data. If the eventsource package does not work for you, you can set an own implementation when creating the replication. const replicationState = await replicateServer({ /* ... */ eventSource: MyEventSourceConstructor /* ... */ }); ","version":"Next","tagName":"h2"},{"title":"Replication with GraphQL","type":0,"sectionRef":"#","url":"/replication-graphql.html","content":"","keywords":"","version":"Next"},{"title":"Usage​","type":1,"pageTitle":"Replication with GraphQL","url":"/replication-graphql.html#usage","content":" Before you use the GraphQL replication, make sure you've learned how the RxDB replication works. ","version":"Next","tagName":"h2"},{"title":"Creating a compatible GraphQL Server​","type":1,"pageTitle":"Replication with GraphQL","url":"/replication-graphql.html#creating-a-compatible-graphql-server","content":" At the server-side, there must exist an endpoint which returns newer rows when the last checkpoint is used as input. For example lets say you create a QuerypullHuman which returns a list of document writes that happened after the given checkpoint. For the push-replication, you also need a MutationpushHuman which lets RxDB update data of documents by sending the previous document state and the new client document state. Also for being able to stream all ongoing events, we need a Subscription called streamHuman. input HumanInput { id: ID!, name: String!, lastName: String!, updatedAt: Float!, deleted: Boolean! } type Human { id: ID!, name: String!, lastName: String!, updatedAt: Float!, deleted: Boolean! } input Checkpoint { id: String!, updatedAt: Float! } type HumanPullBulk { documents: [Human]! checkpoint: Checkpoint } type Query { pullHuman(checkpoint: Checkpoint, limit: Int!): HumanPullBulk! } input HumanInputPushRow { assumedMasterState: HeroInputPushRowT0AssumedMasterStateT0 newDocumentState: HeroInputPushRowT0NewDocumentStateT0! } type Mutation { # Returns a list of all conflicts # If no document write caused a conflict, return an empty list. pushHuman(rows: [HumanInputPushRow!]): [Human] } # headers are used to authenticate the subscriptions # over websockets. input Headers { AUTH_TOKEN: String!; } type Subscription { streamHuman(headers: Headers): HumanPullBulk! } The GraphQL resolver for the pullHuman would then look like: const rootValue = { pullHuman: args => { const minId = args.checkpoint ? args.checkpoint.id : ''; const minUpdatedAt = args.checkpoint ? args.checkpoint.updatedAt : 0; // sorted by updatedAt first and the id as second const sortedDocuments = documents.sort((a, b) => { if (a.updatedAt > b.updatedAt) return 1; if (a.updatedAt < b.updatedAt) return -1; if (a.updatedAt === b.updatedAt) { if (a.id > b.id) return 1; if (a.id < b.id) return -1; else return 0; } }); // only return documents newer than the input document const filterForMinUpdatedAtAndId = sortedDocuments.filter(doc => { if (doc.updatedAt < minUpdatedAt) return false; if (doc.updatedAt > minUpdatedAt) return true; if (doc.updatedAt === minUpdatedAt) { // if updatedAt is equal, compare by id if (doc.id > minId) return true; else return false; } }); // only return some documents in one batch const limitedDocs = filterForMinUpdatedAtAndId.slice(0, args.limit); // use the last document for the checkpoint const lastDoc = limitedDocs[limitedDocs.length - 1]; const retCheckpoint = { id: lastDoc.id, updatedAt: lastDoc.updatedAt } return { documents: limitedDocs, checkpoint: retCheckpoint } return limited; } } For examples for the other resolvers, consult the GraphQL Example Project. ","version":"Next","tagName":"h3"},{"title":"RxDB Client​","type":1,"pageTitle":"Replication with GraphQL","url":"/replication-graphql.html#rxdb-client","content":" Pull replication​ For the pull-replication, you first need a pullQueryBuilder. This is a function that gets the last replication checkpoint and a limit as input and returns an object with a GraphQL-query and its variables (or a promise that resolves to the same object). RxDB will use the query builder to construct what is later sent to the GraphQL endpoint. const pullQueryBuilder = (checkpoint, limit) => { /** * The first pull does not have a checkpoint * so we fill it up with defaults */ if (!checkpoint) { checkpoint = { id: '', updatedAt: 0 }; } const query = `query PullHuman($checkpoint: CheckpointInput, $limit: Int!) { pullHuman(checkpoint: $checkpoint, limit: $limit) { documents { id name age updatedAt deleted } checkpoint { id updatedAt } } }`; return { query, operationName: 'PullHuman', variables: { checkpoint, limit } }; }; With the queryBuilder, you can then setup the pull-replication. import { replicateGraphQL } from 'rxdb/plugins/replication-graphql'; const replicationState = replicateGraphQL( { collection: myRxCollection, // urls to the GraphQL endpoints url: { http: 'http://example.com/graphql' }, pull: { queryBuilder: pullQueryBuilder, // the queryBuilder from above modifier: doc => doc, // (optional) modifies all pulled documents before they are handled by RxDB dataPath: undefined, // (optional) specifies the object path to access the document(s). Otherwise, the first result of the response data is used. /** * Amount of documents that the remote will send in one request. * If the response contains less than [batchSize] documents, * RxDB will assume there are no more changes on the backend * that are not replicated. * This value is the same as the limit in the pullHuman() schema. * [default=100] */ batchSize: 50 }, // headers which will be used in http requests against the server. headers: { Authorization: 'Bearer abcde...' }, /** * Options that have been inherited from the RxReplication */ deletedField: 'deleted', live: true, retryTime = 1000 * 5, waitForLeadership = true, autoStart = true, } ); Push replication​ For the push-replication, you also need a queryBuilder. Here, the builder receives a changed document as input which has to be send to the server. It also returns a GraphQL-Query and its data. const pushQueryBuilder = rows => { const query = ` mutation PushHuman($writeRows: [HumanInputPushRow!]) { pushHuman(writeRows: $writeRows) { id name age updatedAt deleted } } `; const variables = { writeRows: rows }; return { query, operationName: 'PushHuman', variables }; }; With the queryBuilder, you can then setup the push-replication. const replicationState = replicateGraphQL( { collection: myRxCollection, // urls to the GraphQL endpoints url: { http: 'http://example.com/graphql' }, push: { queryBuilder: pushQueryBuilder, // the queryBuilder from above /** * batchSize (optional) * Amount of document that will be pushed to the server in a single request. */ batchSize: 5, /** * modifier (optional) * Modifies all pushed documents before they are send to the GraphQL endpoint. * Returning null will skip the document. */ modifier: doc => doc }, headers: { Authorization: 'Bearer abcde...' }, pull: { /* ... */ }, /* ... */ } ); Pull Stream​ To create a realtime replication, you need to create a pull stream that pulls ongoing writes from the server. The pull stream gets the headers of the RxReplicationState as input, so that it can be authenticated on the backend. const pullStreamQueryBuilder = (headers) => { const query = `subscription onStream($headers: Headers) { streamHero(headers: $headers) { documents { id, name, age, updatedAt, deleted }, checkpoint { id updatedAt } } }`; return { query, variables: { headers } }; }; With the pullStreamQueryBuilder you can then start a realtime replication. const replicationState = replicateGraphQL( { collection: myRxCollection, // urls to the GraphQL endpoints url: { http: 'http://example.com/graphql', ws: 'ws://example.com/subscriptions' // <- The websocket has to use a different url. }, push: { batchSize: 100, queryBuilder: pushQueryBuilder }, headers: { Authorization: 'Bearer abcde...' }, pull: { batchSize: 100, queryBuilder: pullQueryBuilder, streamQueryBuilder: pullStreamQueryBuilder, includeWsHeaders: false, // Includes headers as connection parameter to Websocket. // Websocket options that can be passed as a parameter to initialize the subscription // Can be applied anything from the graphql-ws ClientOptions - https://the-guild.dev/graphql/ws/docs/interfaces/client.ClientOptions // Except these parameters: 'url', 'shouldRetry', 'webSocketImpl' - locked for internal usage // Note: if you provide connectionParams as a wsOption, make sure it returns any necessary headers (e.g. authorization) // because providing your own connectionParams prevents headers from being included automatically wsOptions: { retryAttempts: 10, } }, deletedField: 'deleted' } ); note If it is not possible to create a websocket server on your backend, you can use any other method of pull out the ongoing events from the backend and then you can send them into RxReplicationState.emitEvent(). ","version":"Next","tagName":"h3"},{"title":"Transforming null to undefined in optional fields​","type":1,"pageTitle":"Replication with GraphQL","url":"/replication-graphql.html#transforming-null-to-undefined-in-optional-fields","content":" GraphQL fills up non-existent optional values with null while RxDB required them to be undefined. Therefore, if your schema contains optional properties, you have to transform the pulled data to switch out null to undefined const replicationState: RxGraphQLReplicationState<RxDocType> = replicateGraphQL( { collection: myRxCollection, url: {/* ... */}, headers: {/* ... */}, push: {/* ... */}, pull: { queryBuilder: pullQueryBuilder, modifier: (doc => { // We have to remove optional non-existent field values // they are set as null by GraphQL but should be undefined Object.entries(doc).forEach(([k, v]) => { if (v === null) { delete doc[k]; } }); return doc; }) }, /* ... */ } ); ","version":"Next","tagName":"h3"},{"title":"pull.responseModifier​","type":1,"pageTitle":"Replication with GraphQL","url":"/replication-graphql.html#pullresponsemodifier","content":" With the pull.responseModifier you can modify the whole response from the GraphQL endpoint before it is processed by RxDB. For example if your endpoint is not capable of returning a valid checkpoint, but instead only returns the plain document array, you can use the responseModifier to aggregate the checkpoint from the returned documents. import { } from 'rxdb'; const replicationState: RxGraphQLReplicationState<RxDocType> = replicateGraphQL( { collection: myRxCollection, url: {/* ... */}, headers: {/* ... */}, push: {/* ... */}, pull: { responseModifier: async function( plainResponse, // the exact response that was returned from the server origin, // either 'handler' if plainResponse came from the pull.handler, or 'stream' if it came from the pull.stream requestCheckpoint // if origin==='handler', the requestCheckpoint contains the checkpoint that was send to the backend ) { /** * In this example we aggregate the checkpoint from the documents array * that was returned from the graphql endpoint. */ const docs = plainResponse; return { documents: docs, checkpoint: docs.length === 0 ? requestCheckpoint : { name: lastOfArray(docs).name, updatedAt: lastOfArray(docs).updatedAt } }; } }, /* ... */ } ); ","version":"Next","tagName":"h3"},{"title":"push.responseModifier​","type":1,"pageTitle":"Replication with GraphQL","url":"/replication-graphql.html#pushresponsemodifier","content":" It's also possible to modify the response of a push mutation. For example if your server returns more than the just conflicting docs: type PushResponse { conflicts: [Human] conflictMessages: [ReplicationConflictMessage] } type Mutation { # Returns a PushResponse type that contains the conflicts along with other information pushHuman(rows: [HumanInputPushRow!]): PushResponse! } import {} from "rxdb"; const replicationState: RxGraphQLReplicationState<RxDocType> = replicateGraphQL( { collection: myRxCollection, url: {/* ... */}, headers: {/* ... */}, push: { responseModifier: async function (plainResponse) { /** * In this example we aggregate the conflicting documents from a response object */ return plainResponse.conflicts; }, }, pull: {/* ... */}, /* ... */ } ); Helper Functions​ RxDB provides the helper functions graphQLSchemaFromRxSchema(), pullQueryBuilderFromRxSchema(), pullStreamBuilderFromRxSchema() and pushQueryBuilderFromRxSchema() that can be used to generate handlers and schemas from the RxJsonSchema. To learn how to use them, please inspect the GraphQL Example. ","version":"Next","tagName":"h3"},{"title":"RxGraphQLReplicationState​","type":1,"pageTitle":"Replication with GraphQL","url":"/replication-graphql.html#rxgraphqlreplicationstate","content":" When you call myCollection.syncGraphQL() it returns a RxGraphQLReplicationState which can be used to subscribe to events, for debugging or other functions. It extends the RxReplicationState with some GraphQL specific methods. .setHeaders()​ Changes the headers for the replication after it has been set up. replicationState.setHeaders({ Authorization: `...` }); Sending Cookies​ The underlying fetch framework uses a same-origin policy for credentials per default. That means, cookies and session data is only shared if you backend and frontend run on the same domain and port. Pass the credential parameter to include cookies in requests to servers from different origins via: replicationState.setCredentials('include'); or directly pass it in the replicateGraphQL function: replicateGraphQL( { collection: myRxCollection, /* ... */ credentials: 'include', /* ... */ } ); See the fetch spec for more information about available options. note To play around, check out the full example of the RxDB GraphQL replication with server and client ","version":"Next","tagName":"h3"},{"title":"Websocket Replication","type":0,"sectionRef":"#","url":"/replication-websocket.html","content":"","keywords":"","version":"Next"},{"title":"Starting the Websocket Server​","type":1,"pageTitle":"Websocket Replication","url":"/replication-websocket.html#starting-the-websocket-server","content":" import { createRxDatabase } from 'rxdb'; import { startWebsocketServer } from 'rxdb/plugins/replication-websocket'; // create a RxDatabase like normal const myDatabase = await createRxDatabase({/* ... */}); // start a websocket server const serverState = await startWebsocketServer({ database: myDatabase, port: 1337, path: '/socket' }); // stop the server await serverState.close(); ","version":"Next","tagName":"h2"},{"title":"Connect to the Websocket Server​","type":1,"pageTitle":"Websocket Replication","url":"/replication-websocket.html#connect-to-the-websocket-server","content":" The replication has to be started once for each collection that you want to replicate. import { replicateWithWebsocketServer } from 'rxdb/plugins/replication-websocket'; // start the replication const replicationState = await replicateWithWebsocketServer({ /** * To make the replication work, * the client collection name must be equal * to the server collection name. */ collection: myRxCollection, url: 'ws://localhost:1337/socket' }); // stop the replication await replicationState.cancel(); ","version":"Next","tagName":"h2"},{"title":"Customize​","type":1,"pageTitle":"Websocket Replication","url":"/replication-websocket.html#customize","content":" We use the ws npm library, so you can use all optional configuration provided by it. This is especially important to improve performance by opting in of some optional settings. ","version":"Next","tagName":"h2"},{"title":"Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync","type":0,"sectionRef":"#","url":"/replication-supabase.html","content":"","keywords":"","version":"Next"},{"title":"Key Features of the RxDB-Supabase Plugin​","type":1,"pageTitle":"Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync","url":"/replication-supabase.html#key-features-of-the-rxdb-supabase-plugin","content":" Cloud Only Backend: No self-hosted server required. Client devices directly sync with the Supabase Servers.Two-way replication between Supabase tables and RxDB collectionsOffline-first with resumable, incremental syncLive updates via Supabase Realtime channelsConflict resolution handled by the RxDB Sync EngineWorks in browsers and Node.js with @supabase/supabase-js ","version":"Next","tagName":"h2"},{"title":"Architecture Overview​","type":1,"pageTitle":"Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync","url":"/replication-supabase.html#architecture-overview","content":" Client A Supabase Client B Client C Clients connect directly to Supabase using the official JS client. The plugin: Pulls documents over PostgREST using a checkpoint (modified, id) and deterministic ordering.Pushes inserts/updates using optimistic concurrency guards.Streams new changes using Supabase Realtime so live replication stays up to date. note Because Supabase exposes Postgres over HTTP/WebSocket, you can safely replicate from browsers and mobile apps. Protect your data with Row Level Security (RLS) policies; use the anon key on clients and the service role key only on trusted servers. ","version":"Next","tagName":"h2"},{"title":"Setting up RxDB ↔ Supabase Sync​","type":1,"pageTitle":"Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync","url":"/replication-supabase.html#setting-up-rxdb--supabase-sync","content":" 1 Install Dependencies​ npm install rxdb @supabase/supabase-js 2 Create a Supabase Project & Table​ In your supabase project, create a new table. Ensure that: The primary key must have the type text (Primary keys must always be strings in RxDB)You have an modified field which stores the last modification timestamp of a row (default is _modified)You have a boolean field which stores if a row should is "deleted". You should not hard-delete rows in Supabase, because clients would miss the deletion if they haven't been online at the deletion time. Instead, use a deleted boolean to mark rows as deleted. This way all clients can still pull the deletion, and RxDB will hide the complexity on the client side.Enable the realtime observation of writes to the table. Here is an example for a "human" table: create extension if not exists moddatetime schema extensions; create table "public"."humans" ( "passportId" text primary key, "firstName" text not null, "lastName" text not null, "age" integer, "_deleted" boolean DEFAULT false NOT NULL, "_modified" timestamp with time zone DEFAULT now() NOT NULL ); -- auto-update the _modified timestamp CREATE TRIGGER update_modified_datetime BEFORE UPDATE ON public.humans FOR EACH ROW EXECUTE FUNCTION extensions.moddatetime('_modified'); -- add a table to the publication so we can subscribe to changes alter publication supabase_realtime add table "public"."humans"; 3 Create an RxDB Database & Collection​ Create a normal RxDB database, then add a collection whose schema mirrors your Supabase table. The primary key must match (same column name and type), and fields should be top-level simple types (string/number/boolean). You don’t need to model server internals: the plugin maps the server’s _deleted flag to doc._deleted automatically, and _modified is optional in your schema (the plugin strips it on push and will include it on pull only if you define it). For browsers use a persistent storage like Localstorage or IndexedDB. For tests you can use the in-memory storage. // client import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; export const db = await createRxDatabase({ name: 'mydb', storage: getRxStorageLocalstorage() }); await db.addCollections({ humans: { schema: { version: 0, primaryKey: 'passportId', type: 'object', properties: { passportId: { type: 'string', maxLength: 100 }, firstName: { type: 'string' }, lastName: { type: 'string' }, age: { type: 'number' } }, required: ['passportId', 'firstName', 'lastName'] } } }); 4 Create the Supabase Client​ Make a single Supabase client and reuse it across your app. In the browser, use the anon key (RLS-protected). On trusted servers you may use the service role key—but never ship that to clients. Production Vite Local Development //> client import { createClient } from '@supabase/supabase-js'; export const supabase = createClient( 'https://xyzcompany.supabase.co', 'eyJhbGciOi...' ); 5 Start Replication​ Connect your RxDB collection to the Supabase table to start the replication. //> client import { replicateSupabase } from 'rxdb/plugins/replication-supabase'; const replication = replicateSupabase({ tableName: 'humans', client: supabase, collection: db.humans, replicationIdentifier: 'humans-supabase', live: true, pull: { batchSize: 50, // optional: shape incoming docs modifier: (doc) => { // map nullable age-field if (!doc.age) delete doc.age; return doc; } // optional: customize the pull query before fetching queryBuilder: ({ query }) => { // Add filters, joins, or other PostgREST query modifiers // This runs before checkpoint filtering and ordering return query.eq("status", "active"); }, }, push: { batchSize: 50 }, // optional overrides if your column names differ: // modifiedField: '_modified', // deletedField: '_deleted' }); // (optional) observe errors and wait for the first sync barrier replication.error$.subscribe(err => console.error('[replication]', err)); await replication.awaitInitialReplication(); Nullable values must be mapped Supabase returns null for nullable columns, but in RxDB you often model those fields as optional (i.e., they can be undefined/missing). To avoid schema errors, map null → undefined in the pull.modifier (usually by deleting the key). 6 Do other things with the replication state​ The RxSupabaseReplicationState which is returned from replicateSupabase() allows you to run all functionality of the normal RxReplicationState. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync","url":"/replication-supabase.html#follow-up","content":" Replication API Reference: Learn the core concepts and lifecycle hooks — ReplicationOffline-First Guide: Caching, retries, and conflict strategies — Local-FirstSupabase Essentials: Row Level Security (RLS) — https://supabase.com/docs/guides/auth/row-level-securityRealtime — https://supabase.com/docs/guides/realtimeLocal dev with the Supabase CLI — https://supabase.com/docs/guides/cli Community: Questions or feedback? Join our Discord — Chat ","version":"Next","tagName":"h2"},{"title":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","type":0,"sectionRef":"#","url":"/replication-webrtc.html","content":"","keywords":"","version":"Next"},{"title":"What is WebRTC?​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#what-is-webrtc","content":" WebRTC stands for Web Real-Time Communication. It is an open standard that enables browsers and native apps to exchange audio, video, or arbitrary data directly between peers, bypassing a central server after the initial connection is established. WebRTC uses NAT traversal techniques like ICE (Interactive Connectivity Establishment) to punch through firewalls and establish direct links. This peer-to-peer nature drastically reduces latency while maintaining high security and end-to-end encryption capabilities. For a deeper look at comparing WebRTC with WebSockets and WebTransport, you can read our comprehensive overview. While WebSockets or WebTransport often work in client-server contexts, WebRTC offers direct peer-to-peer connections ideal for fully decentralized data flows. ","version":"Next","tagName":"h2"},{"title":"Benefits of P2P Sync with WebRTC Compared to Client-Server Architecture​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#benefits-of-p2p-sync-with-webrtc-compared-to-client-server-architecture","content":" Reduced Latency - By skipping a central server hop, data travels directly from one client to another, minimizing round-trip times and improving responsiveness.Scalability - New peers can join without overloading a central infrastructure. The sync overhead increases linearly with the number of connections rather than requiring a massive server cluster.Privacy & Ownership - Data stays within the user’s devices, avoiding risks tied to storing data on third-party servers. This design aligns well with local-first or "zero-latency" apps.Resilience - In some scenarios, if the central server is unreachable, P2P connections remain operational (assuming a functioning signaling path). Apps can still replicate data among local networks like when they are in the same Wifi or LAN.Cost Savings - Reducing the reliance on a high-bandwidth server can cut hosting and bandwidth expenses, particularly in high-traffic or IoT-style use cases. ","version":"Next","tagName":"h2"},{"title":"Peer-to-Peer (P2P) WebRTC Replication with the RxDB JavaScript Database​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#peer-to-peer-p2p-webrtc-replication-with-the-rxdb-javascript-database","content":" Traditionally, real-time data synchronization depends on centralized servers to manage and distribute updates. In contrast, RxDB’s WebRTC P2P replication allows data to flow directly among clients, removing the server as a data store. This approach is live and fully decentralized, requiring only a signaling server for initial discovery: No master-slave concept - each peer hosts its own local RxDB.Clients (browsers, devices) connect to each other via WebRTC data channels.The RxDB replication protocol then handles pushing/pulling document changes across peers. Because RxDB is a NoSQL database and the replication protocol is straightforward, setting up robust P2P sync is far easier than orchestrating a complex client-server database architecture. ","version":"Next","tagName":"h2"},{"title":"Using RxDB with the WebRTC Replication Plugin​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#using-rxdb-with-the-webrtc-replication-plugin","content":" Before you use this plugin, make sure that you understand how WebRTC works. Here we build a todo-app that replicates todo-entries between clients: You can find a fully build example of this at the RxDB Quickstart Repository which you can also try out online. Four you create the database and then you can configure the replication: 1 Create the Database and Collection​ Here we create a database with the localstorage based storage that stores data inside of the LocalStorage API in a browser. RxDB has a wide range of storages for other JavaScript runtimes. import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'myTodoDB', storage: getRxStorageLocalstorage() }); await db.addCollections({ todos: { schema: { title: 'todo schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string', maxLength: 100 }, title: { type: 'string' }, done: { type: 'boolean', default: false }, created: { type: 'string', format: 'date-time' } }, required: ['id', 'title', 'done'] } } }); // insert an example document await db.todos.insert({ id: 'todo-1', title: 'P2P demo task', done: false, created: new Date().toISOString() }); 2 Import the WebRTC replication plugin​ import { replicateWebRTC, getConnectionHandlerSimplePeer } from 'rxdb/plugins/replication-webrtc'; 3 Start the P2P replication​ To start the replication you have to call replicateWebRTC on the collection. As options you have to provide a topic and a connection handler function that implements the P2PConnectionHandlerCreator interface. As default you should start with the getConnectionHandlerSimplePeer method which uses the simple-peer library and comes shipped with RxDB. const replicationPool = await replicateWebRTC( { // Start the replication for a single collection collection: db.todos, // The topic is like a 'room-name'. All clients with the same topic // will replicate with each other. In most cases you want to use // a different topic string per user. Also you should prefix the topic with // a unique identifier for your app, to ensure you do not let your users connect // with other apps that also use the RxDB P2P Replication. topic: 'my-users-pool', /** * You need a collection handler to be able to create WebRTC connections. * Here we use the simple peer handler which uses the 'simple-peer' npm library. * To learn how to create a custom connection handler, read the source code, * it is pretty simple. */ connectionHandlerCreator: getConnectionHandlerSimplePeer({ // Set the signaling server url. // You can use the server provided by RxDB for tryouts, // but in production you should use your own server instead. signalingServerUrl: 'wss://signaling.rxdb.info/', // only in Node.js, we need the wrtc library // because Node.js does not contain the WebRTC API. wrtc: require('node-datachannel/polyfill'), // only in Node.js, we need the WebSocket library // because Node.js does not contain the WebSocket API. webSocketConstructor: require('ws').WebSocket }), pull: {}, push: {} } ); Notice that in difference to the other replication plugins, the WebRTC replication returns a replicationPool instead of a single RxReplicationState. The replicationPool contains all replication states of the connected peers in the P2P network. 4 Observe Errors​ To ensure we log out potential errors, observe the error$ observable of the pool. replicationPool.error$.subscribe(err => console.error('WebRTC Error:', err)); 5 Stop the Replication​ You can also dynamically stop the replication. replicationPool.cancel(); ","version":"Next","tagName":"h2"},{"title":"Live replications​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#live-replications","content":" The WebRTC replication is always live because there can not be a one-time sync when it is always possible to have new Peers that join the connection pool. Therefore you cannot set the live: false option like in the other replication plugins. ","version":"Next","tagName":"h2"},{"title":"Signaling Server​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#signaling-server","content":" For P2P replication to work with the RxDB WebRTC Replication Plugin, a signaling server is required. The signaling server helps peers discover each other and establish connections. RxDB ships with a default signaling server that can be used with the simple-peer connection handler. This server is made for demonstration purposes and tryouts. It is not reliable and might be offline at any time. In production you must always use your own signaling server instead! Creating a basic signaling server is straightforward. The provided example uses 'socket.io' for WebSocket communication. However, in production, you'd want to create a more robust signaling server with authentication and additional logic to suit your application's needs. Here is a quick example implementation of a signaling server that can be used with the connection handler from getConnectionHandlerSimplePeer(): import { startSignalingServerSimplePeer } from 'rxdb/plugins/replication-webrtc'; const serverState = await startSignalingServerSimplePeer({ port: 8080 // <- port }); For custom signaling servers with more complex logic, you can check the source code of the default one. ","version":"Next","tagName":"h2"},{"title":"Peer Validation​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#peer-validation","content":" By default the replication will replicate with every peer the signaling server tells them about. You can prevent invalid peers from replication by passing a custom isPeerValid() function that either returns true on valid peers and false on invalid peers. const replicationPool = await replicateWebRTC( { /* ... */ isPeerValid: async (peer) => { return true; } pull: {}, push: {} /* ... */ } ); ","version":"Next","tagName":"h2"},{"title":"Conflict detection in WebRTC replication​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#conflict-detection-in-webrtc-replication","content":" RxDB's conflict handling works by detecting and resolving conflicts that may arise when multiple clients in a decentralized database system attempt to modify the same data concurrently. A custom conflict handler can be set up, which is a plain JavaScript function. The conflict handler is run on each replicated document write and resolves the conflict if required. Find out more about RxDB conflict handling here ","version":"Next","tagName":"h2"},{"title":"Known problems​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#known-problems","content":" ","version":"Next","tagName":"h2"},{"title":"SimplePeer requires to have process.nextTick()​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#simplepeer-requires-to-have-processnexttick","content":" In the browser you might not have a process variable or process.nextTick() method. But the simple peer uses that so you have to polyfill it. In webpack you can use the process/browser package to polyfill it: const plugins = [ /* ... */ new webpack.ProvidePlugin({ process: 'process/browser', }) /* ... */ ]; In angular or other libraries you can add the polyfill manually: window.process = { nextTick: (fn, ...args) => setTimeout(() => fn(...args)), }; ","version":"Next","tagName":"h3"},{"title":"Polyfill the WebSocket and WebRTC API in Node.js​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#polyfill-the-websocket-and-webrtc-api-in-nodejs","content":" While all modern browsers support the WebRTC and WebSocket APIs, they is missing in Node.js which will throw the error No WebRTC support: Specify opts.wrtc option in this environment. Therefore you have to polyfill it with a compatible WebRTC and WebSocket polyfill. It is recommended to use the node-datachannel package for WebRTC which does not come with RxDB but has to be installed before via npm install node-datachannel --save. For the Websocket API use the ws package that is included into RxDB. import nodeDatachannelPolyfill from 'node-datachannel/polyfill'; import { WebSocket } from 'ws'; const replicationPool = await replicateWebRTC( { /* ... */ connectionHandlerCreator: getConnectionHandlerSimplePeer({ signalingServerUrl: 'wss://example.com:8080', wrtc: nodeDatachannelPolyfill, webSocketConstructor: WebSocket }), pull: {}, push: {} /* ... */ } ); ","version":"Next","tagName":"h3"},{"title":"Storing replicated data encrypted on client device​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#storing-replicated-data-encrypted-on-client-device","content":" Storing replicated data encrypted on client devices using the RxDB Encryption Plugin is a pivotal step towards bolstering data security and user privacy. The WebRTC replication plugin seamlessly integrates with the RxDB encryption plugins, providing a robust solution for encrypting sensitive information before it's stored locally. By doing so, it ensures that even if unauthorized access to the device occurs, the data remains protected and unintelligible without the encryption key (or password). This approach is particularly vital in scenarios where user-generated content or confidential data is replicated across devices, as it empowers users with control over their own data while adhering to stringent security standards. Read more about the encryption plugins here. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#follow-up","content":" Check out the RxDB Quickstart to see how to set up your first RxDB database.Explore advanced features like Custom Conflict Handling or Offline-First Performance.Try an example at RxDB Quickstart GitHub to see a working P2P Sync setup.Join the RxDB Community on GitHub or Discord if you have questions or want to share your P2P WebRTC experiences. ","version":"Next","tagName":"h2"},{"title":"Attachments","type":0,"sectionRef":"#","url":"/rx-attachment.html","content":"","keywords":"","version":"Next"},{"title":"Add the attachments plugin​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#add-the-attachments-plugin","content":" To enable the attachments, you have to add the attachments plugin. import { addRxPlugin } from 'rxdb'; import { RxDBAttachmentsPlugin } from 'rxdb/plugins/attachments'; addRxPlugin(RxDBAttachmentsPlugin); ","version":"Next","tagName":"h2"},{"title":"Enable attachments in the schema​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#enable-attachments-in-the-schema","content":" Before you can use attachments, you have to ensure that the attachments-object is set in the schema of your RxCollection. const mySchema = { version: 0, type: 'object', properties: { // . // . // . }, attachments: { encrypted: true // if true, the attachment-data will be encrypted with the db-password } }; const myCollection = await myDatabase.addCollections({ humans: { schema: mySchema } }); ","version":"Next","tagName":"h2"},{"title":"putAttachment()​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#putattachment","content":" Adds an attachment to a RxDocument. Returns a Promise with the new attachment. import { createBlob } from 'rxdb'; const attachment = await myDocument.putAttachment( { id: 'cat.txt', // (string) name of the attachment data: createBlob('meowmeow', 'text/plain'), // (string|Blob) data of the attachment type: 'text/plain' // (string) type of the attachment-data like 'image/jpeg' } ); warning Expo/React-Native does not support the Blob API natively. Make sure you use your own polyfill that properly supports blob.arrayBuffer() when using RxAttachments or use the putAttachmentBase64() and getDataBase64() so that you do not have to create blobs. ","version":"Next","tagName":"h2"},{"title":"putAttachmentBase64()​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#putattachmentbase64","content":" Same as putAttachment() but accepts a plain base64 string instead of a Blob. const attachment = await doc.putAttachmentBase64({ id: 'cat.txt', length: 4, data: 'bWVvdw==', type: 'text/plain' }); ","version":"Next","tagName":"h2"},{"title":"getAttachment()​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#getattachment","content":" Returns an RxAttachment by its id. Returns null when the attachment does not exist. const attachment = myDocument.getAttachment('cat.jpg'); ","version":"Next","tagName":"h2"},{"title":"allAttachments()​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#allattachments","content":" Returns an array of all attachments of the RxDocument. const attachments = myDocument.allAttachments(); ","version":"Next","tagName":"h2"},{"title":"allAttachments$​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#allattachments-1","content":" Gets an Observable which emits a stream of all attachments from the document. Re-emits each time an attachment gets added or removed from the RxDocument. const all = []; myDocument.allAttachments$.subscribe( attachments => all = attachments ); ","version":"Next","tagName":"h2"},{"title":"RxAttachment​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#rxattachment","content":" The attachments of RxDB are represented by the type RxAttachment which has the following attributes/methods. ","version":"Next","tagName":"h2"},{"title":"doc​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#doc","content":" The RxDocument which the attachment is assigned to. ","version":"Next","tagName":"h3"},{"title":"id​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#id","content":" The id as string of the attachment. ","version":"Next","tagName":"h3"},{"title":"type​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#type","content":" The type as string of the attachment. ","version":"Next","tagName":"h3"},{"title":"length​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#length","content":" The length of the data of the attachment as number. ","version":"Next","tagName":"h3"},{"title":"digest​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#digest","content":" The hash of the attachments data as string. note The digest is NOT calculated by RxDB, instead it is calculated by the RxStorage. The only guarantee is that the digest will change when the attachments data changes. ","version":"Next","tagName":"h3"},{"title":"rev​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#rev","content":" The revision-number of the attachment as number. ","version":"Next","tagName":"h3"},{"title":"remove()​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#remove","content":" Removes the attachment. Returns a Promise that resolves when done. const attachment = myDocument.getAttachment('cat.jpg'); await attachment.remove(); ","version":"Next","tagName":"h3"},{"title":"getData()​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#getdata","content":" Returns a Promise which resolves the attachment's data as Blob. (async) const attachment = myDocument.getAttachment('cat.jpg'); const blob = await attachment.getData(); // Blob ","version":"Next","tagName":"h2"},{"title":"getDataBase64()​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#getdatabase64","content":" Returns a Promise which resolves the attachment's data as base64string. const attachment = myDocument.getAttachment('cat.jpg'); const base64Database = await attachment.getDataBase64(); // 'bWVvdw==' ","version":"Next","tagName":"h2"},{"title":"getStringData()​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#getstringdata","content":" Returns a Promise which resolves the attachment's data as string. const attachment = await myDocument.getAttachment('cat.jpg'); const data = await attachment.getStringData(); // 'meow' Attachment compression Storing many attachments can be a problem when the disc space of the device is exceeded. Therefore it can make sense to compress the attachments before storing them in the RxStorage. With the attachments-compression plugin you can compress the attachments data on write and decompress it on reads. This happens internally and will now change on how you use the api. The compression is run with the Compression Streams API which is only supported on newer browsers. import { wrappedAttachmentsCompressionStorage } from 'rxdb/plugins/attachments-compression'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; // create a wrapped storage with attachment-compression. const storageWithAttachmentsCompression = wrappedAttachmentsCompressionStorage({ storage: getRxStorageIndexedDB() }); const db = await createRxDatabase({ name: 'mydatabase', storage: storageWithAttachmentsCompression }); // set the compression mode at the schema level const mySchema = { version: 0, type: 'object', properties: { // . // . // . }, attachments: { compression: 'deflate' // <- Specify the compression mode here. OneOf ['deflate', 'gzip'] } }; /* ... create your collections as usual and store attachments in them. */ ","version":"Next","tagName":"h2"},{"title":"RxCollection","type":0,"sectionRef":"#","url":"/rx-collection.html","content":"","keywords":"","version":"Next"},{"title":"Creating a Collection​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#creating-a-collection","content":" To create one or more collections you need a RxDatabase object which has the .addCollections()-method. Every collection needs a collection name and a valid RxJsonSchema. Other attributes are optional. const myCollections = await myDatabase.addCollections({ // key = collectionName humans: { schema: mySchema, statics: {}, // (optional) ORM-functions for this collection methods: {}, // (optional) ORM-functions for documents attachments: {}, // (optional) ORM-functions for attachments options: {}, // (optional) Custom parameters that might be used in plugins migrationStrategies: {}, // (optional) autoMigrate: true, // (optional) [default=true] cacheReplacementPolicy: function(){}, // (optional) custom cache replacement policy conflictHandler: function(){} // (optional) a custom conflict handler can be used }, // you can create multiple collections at once animals: { // ... } }); ","version":"Next","tagName":"h2"},{"title":"name​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#name","content":" The name uniquely identifies the collection and should be used to refine the collection in the database. Two different collections in the same database can never have the same name. Collection names must match the following regex: ^[a-z][a-z0-9]*$. ","version":"Next","tagName":"h3"},{"title":"schema​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#schema","content":" The schema defines how the documents of the collection are structured. RxDB uses a schema format, similar to JSON schema. Read more about the RxDB schema format here. ","version":"Next","tagName":"h3"},{"title":"ORM-functions​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#orm-functions","content":" With the parameters statics, methods and attachments, you can define ORM-functions that are applied to each of these objects that belong to this collection. See ORM/DRM. ","version":"Next","tagName":"h3"},{"title":"Migration​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#migration","content":" With the parameters migrationStrategies and autoMigrate you can specify how migration between different schema-versions should be done. See Migration. ","version":"Next","tagName":"h3"},{"title":"Get a collection from the database​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#get-a-collection-from-the-database","content":" To get an existing collection from the database, call the collection name directly on the database: // newly created collection const collections = await db.addCollections({ heroes: { schema: mySchema } }); const collection2 = db.heroes; console.log(collections.heroes === collection2); //> true ","version":"Next","tagName":"h2"},{"title":"Functions​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#functions","content":" ","version":"Next","tagName":"h2"},{"title":"Observe $​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#observe-","content":" Calling this will return an rxjs-Observable which streams every change to data of this collection. myCollection.$.subscribe(changeEvent => console.dir(changeEvent)); // you can also observe single event-types with insert$ update$ remove$ myCollection.insert$.subscribe(changeEvent => console.dir(changeEvent)); myCollection.update$.subscribe(changeEvent => console.dir(changeEvent)); myCollection.remove$.subscribe(changeEvent => console.dir(changeEvent)); ","version":"Next","tagName":"h3"},{"title":"insert()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#insert","content":" Use this to insert new documents into the database. The collection will validate the schema and automatically encrypt any encrypted fields. Returns the new RxDocument. const doc = await myCollection.insert({ name: 'foo', lastname: 'bar' }); ","version":"Next","tagName":"h3"},{"title":"insertIfNotExists()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#insertifnotexists","content":" The insertIfNotExists() method attempts to insert a new document into the collection only if a document with the same primary key does not already exist. This is useful for ensuring uniqueness without having to manually check for existing records before inserting or handling conflicts. Returns either the newly added RxDocument or the previous existing document. const doc = await myCollection.insertIfNotExists({ name: 'foo', lastname: 'bar' }); ","version":"Next","tagName":"h3"},{"title":"bulkInsert()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#bulkinsert","content":" When you have to insert many documents at once, use bulk insert. This is much faster than calling .insert() multiple times. Returns an object with a success- and error-array. const result = await myCollection.bulkInsert([{ name: 'foo1', lastname: 'bar1' }, { name: 'foo2', lastname: 'bar2' }]); // > { // success: [RxDocument, RxDocument], // error: [] // } note bulkInsert will not fail on update conflicts and you cannot expect that on failure the other documents are not inserted. Also the call to bulkInsert() it will not throw if a single document errors because of validation errors. Instead it will return the error in the .error property of the returned object. ","version":"Next","tagName":"h3"},{"title":"bulkRemove()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#bulkremove","content":" When you want to remove many documents at once, use bulk remove. Returns an object with a success- and error-array. const result = await myCollection.bulkRemove([ 'primary1', 'primary2' ]); // > { // success: [RxDocument, RxDocument], // error: [] // } Instead of providing the document ids, you can also use the RxDocument instances. This can have better performance if your code knows them already at the moment of removing them: const result = await myCollection.bulkRemove([ myRxDocument1, myRxDocument2, /* ... */ ]); ","version":"Next","tagName":"h3"},{"title":"upsert()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#upsert","content":" Inserts the document if it does not exist within the collection, otherwise it will overwrite it. Returns the new or overwritten RxDocument. const doc = await myCollection.upsert({ name: 'foo', lastname: 'bar2' }); ","version":"Next","tagName":"h3"},{"title":"bulkUpsert()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#bulkupsert","content":" Same as upsert() but runs over multiple documents. Improves performance compared to running many upsert() calls. Returns an error and a success array. const docs = await myCollection.bulkUpsert([ { name: 'foo', lastname: 'bar2' }, { name: 'bar', lastname: 'foo2' } ]); /** * { * success: [RxDocument, RxDocument] * error: [], * } */ ","version":"Next","tagName":"h3"},{"title":"incrementalUpsert()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#incrementalupsert","content":" When you run many upsert operations on the same RxDocument in a very short timespan, you might get a 409 Conflict error. This means that you tried to run a .upsert() on the document, while the previous upsert operation was still running. To prevent these types of errors, you can run incremental upsert operations. The behavior is similar to RxDocument.incrementalModify. const docData = { name: 'Bob', // primary lastName: 'Kelso' }; myCollection.upsert(docData); myCollection.upsert(docData); // -> throws because of parallel update to the same document myCollection.incrementalUpsert(docData); myCollection.incrementalUpsert(docData); myCollection.incrementalUpsert(docData); // wait until last upsert finished await myCollection.incrementalUpsert(docData); // -> works ","version":"Next","tagName":"h3"},{"title":"find()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#find","content":" To find documents in your collection, use this method. See RxQuery.find(). // find all that are older than 18 const olderDocuments = await myCollection .find() .where('age') .gt(18) .exec(); // execute ","version":"Next","tagName":"h3"},{"title":"findOne()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#findone","content":" This does basically what find() does, but it returns only a single document. You can pass a primary value to find a single document more easily. To find documents in your collection, use this method. See RxQuery.find(). // get document with name:foobar myCollection.findOne({ selector: { name: 'foo' } }).exec().then(doc => console.dir(doc)); // get document by primary, functionally identical to above query myCollection.findOne('foo') .exec().then(doc => console.dir(doc)); ","version":"Next","tagName":"h3"},{"title":"findByIds()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#findbyids","content":" Find many documents by their id (primary value). This has a way better performance than running multiple findOne() or a find() with a big $or selector. Returns a Map where the primary key of the document is mapped to the document. Documents that do not exist or are deleted, will not be inside of the returned Map. const ids = [ 'alice', 'bob', /* ... */ ]; const docsMap = await myCollection.findByIds(ids); console.dir(docsMap); // Map(2) note The Map returned by findByIds is not guaranteed to return elements in the same order as the list of ids passed to it. ","version":"Next","tagName":"h3"},{"title":"exportJSON()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#exportjson","content":" Use this function to create a json export from every document in the collection. Before exportJSON() and importJSON() can be used, you have to add the json-dump plugin. import { addRxPlugin } from 'rxdb'; import { RxDBJsonDumpPlugin } from 'rxdb/plugins/json-dump'; addRxPlugin(RxDBJsonDumpPlugin); myCollection.exportJSON() .then(json => console.dir(json)); ","version":"Next","tagName":"h3"},{"title":"importJSON()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#importjson","content":" To import the json dump into your collection, use this function. // import the dump to the database myCollection.importJSON(json) .then(() => console.log('done')); Note that importing will fire events for each inserted document. ","version":"Next","tagName":"h3"},{"title":"remove()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#remove","content":" Removes all known data of the collection and its previous versions. This removes the documents, the schemas, and older schemaVersions. await myCollection.remove(); // collection is now removed and can be re-created ","version":"Next","tagName":"h3"},{"title":"close()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#close","content":" Removes the collection's object instance from the RxDatabase. This is to free up memory and stop all observers and replications. It will not delete the collections data. When you create the collection again with database.addCollections(), the newly added collection will still have all data. await myCollection.close(); ","version":"Next","tagName":"h3"},{"title":"onClose / onRemove()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#onclose--onremove","content":" With these you can add a function that is run when the collection was closed or removed. This works even across multiple browser tabs so you can detect when another tab removes the collection and you application can behave accordingly. await myCollection.onClose(() => console.log('I am closed')); await myCollection.onRemove(() => console.log('I am removed')); ","version":"Next","tagName":"h3"},{"title":"isRxCollection​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#isrxcollection","content":" Returns true if the given object is an instance of RxCollection. Returns false if not. const is = isRxCollection(myObj); ","version":"Next","tagName":"h3"},{"title":"FAQ​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#faq","content":" When I reload the browser window, will my collections still be in the database? No, the javascript instance of the collections will not automatically load into the database on page reloads. You have to call the addCollections() method each time you create your database. This will create the JavaScript object instance of the RxCollection so that you can use it in the RxDatabase. The persisted data will be automatically in your RxCollection each time you create it. How to remove the limit of 16 collections? In the open-source version of RxDB, the amount of RxCollections that can exist in parallel is limited to 16. To remove this limit, you can purchase the Premium Plugins and call the setPremiumFlag() function before creating a database: import { setPremiumFlag } from 'rxdb-premium/plugins/shared'; setPremiumFlag(); ","version":"Next","tagName":"h2"},{"title":"RxDatabase","type":0,"sectionRef":"#","url":"/rx-database.html","content":"","keywords":"","version":"Next"},{"title":"Creation​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#creation","content":" The database is created by the asynchronous .createRxDatabase() function of the core RxDB module. It has the following parameters: import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'heroesdb', // <- name storage: getRxStorageLocalstorage(), // <- RxStorage /* Optional parameters: */ password: 'myPassword', // <- password (optional) multiInstance: true, // <- multiInstance (optional, default: true) eventReduce: true, // <- eventReduce (optional, default: false) cleanupPolicy: {} // <- custom cleanup policy (optional) }); ","version":"Next","tagName":"h2"},{"title":"name​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#name","content":" The database-name is a string which uniquely identifies the database. When two RxDatabases have the same name and use the same RxStorage, their data can be assumed as equal and they will share events between each other. Depending on the storage or adapter this can also be used to define the filesystem folder of your data. ","version":"Next","tagName":"h3"},{"title":"storage​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#storage","content":" RxDB works on top of an implementation of the RxStorage interface. This interface is an abstraction that allows you to use different underlying databases that actually handle the documents. Depending on your use case you might use a different storage with different tradeoffs in performance, bundle size or supported runtimes. There are many RxStorage implementations that can be used depending on the JavaScript environment and performance requirements. For example you can use the LocalStorage RxStorage in the browser or use the MongoDB RxStorage in Node.js. List of RxStorage implementations // use the LocalStroage that stores data in the browser. import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageLocalstorage() }); // ...or use the MongoDB RxStorage in Node.js. import { getRxStorageMongoDB } from 'rxdb/plugins/storage-mongodb'; const dbMongo = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageMongoDB({ connection: 'mongodb://localhost:27017,localhost:27018,localhost:27019' }) }); ","version":"Next","tagName":"h3"},{"title":"password​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#password","content":" (optional)If you want to use encrypted fields in the collections of a database, you have to set a password for it. The password must be a string with at least 12 characters. Read more about encryption here. ","version":"Next","tagName":"h3"},{"title":"multiInstance​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#multiinstance","content":" (optional=true)When you create more than one instance of the same database in a single javascript-runtime, you should set multiInstance to true. This will enable the event sharing between the two instances. For example when the user has opened multiple browser windows, events will be shared between them so that both windows react to the same changes.multiInstance should be set to false when you have single-instances like a single Node.js-process, a react-native-app, a cordova-app or a single-window electron app which can decrease the startup time because no instance coordination has to be done. ","version":"Next","tagName":"h3"},{"title":"eventReduce​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#eventreduce","content":" (optional=false) One big benefit of having a realtime database is that big performance optimizations can be done when the database knows a query is observed and the updated results are needed continuously. RxDB uses the EventReduce Algorithm to optimize observer or recurring queries. For better performance, you should always set eventReduce: true. This will also be the default in the next major RxDB version. ","version":"Next","tagName":"h3"},{"title":"ignoreDuplicate​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#ignoreduplicate","content":" (optional=false)If you create multiple RxDatabase-instances with the same name and same adapter, it's very likely that you have done something wrong. To prevent this common mistake, RxDB will throw an error when you do this. In some rare cases like unit-tests, you want to do this intentional by setting ignoreDuplicate to true. Because setting ignoreDuplicate: true in production will decrease the performance by having multiple instances of the same database, ignoreDuplicate is only allowed to be set in dev-mode. const db1 = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage(), ignoreDuplicate: true }); const db2 = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage(), ignoreDuplicate: true // this create-call will not throw because you explicitly allow it }); ","version":"Next","tagName":"h3"},{"title":"closeDuplicates​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#closeduplicates","content":" (optional=false) Closes all other RxDatabases instances that have the same storage+name combination. const db1 = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage(), closeDuplicates: true }); const db2 = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage(), closeDuplicates: true // this create-call will close db1 }); // db1 is now closed. ","version":"Next","tagName":"h3"},{"title":"hashFunction​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#hashfunction","content":" By default, RxDB will use crypto.subtle.digest('SHA-256', data) for hashing. If you need a different hash function or the crypto.subtle API is not supported in your JavaScript runtime, you can provide an own hash function instead. A hash function gets a string as input and returns a Promise that resolves a string. // example hash function that runs in plain JavaScript import { sha256 } from 'ohash'; function myOwnHashFunction(input: string) { return Promise.resolve(sha256(input)); } const db = await createRxDatabase({ hashFunction: myOwnHashFunction /* ... */ }); If you get the error message TypeError: Cannot read properties of undefined (reading 'digest') this likely means that you are neither running on localhost nor on https which is why your browser might not allow access to crypto.subtle.digest. ","version":"Next","tagName":"h3"},{"title":"Methods​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#methods","content":" ","version":"Next","tagName":"h2"},{"title":"Observe with $​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#observe-with-","content":" Calling this will return an rxjs-Observable which streams all write events of the RxDatabase. myDb.$.subscribe(changeEvent => console.dir(changeEvent)); ","version":"Next","tagName":"h3"},{"title":"exportJSON()​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#exportjson","content":" Use this function to create a json-export from every piece of data in every collection of this database. You can pass true as a parameter to decrypt the encrypted data-fields of your document. Before exportJSON() and importJSON() can be used, you have to add the json-dump plugin. import { addRxPlugin } from 'rxdb'; import { RxDBJsonDumpPlugin } from 'rxdb/plugins/json-dump'; addRxPlugin(RxDBJsonDumpPlugin); myDatabase.exportJSON() .then(json => console.dir(json)); ","version":"Next","tagName":"h3"},{"title":"importJSON()​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#importjson","content":" To import the json-dumps into your database, use this function. // import the dump to the database emptyDatabase.importJSON(json) .then(() => console.log('done')); ","version":"Next","tagName":"h3"},{"title":"backup()​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#backup","content":" Writes the current (or ongoing) database state to the filesystem. Read more ","version":"Next","tagName":"h3"},{"title":"waitForLeadership()​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#waitforleadership","content":" Returns a Promise which resolves when the RxDatabase becomes elected leader. ","version":"Next","tagName":"h3"},{"title":"requestIdlePromise()​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#requestidlepromise","content":" Returns a promise which resolves when the database is in idle. This works similar to requestIdleCallback but tracks the idle-ness of the database instead of the CPU. Use this for semi-important tasks like cleanups which should not affect the speed of important tasks. myDatabase.requestIdlePromise().then(() => { // this will run at the moment the database has nothing else to do myCollection.customCleanupFunction(); }); // with timeout myDatabase.requestIdlePromise(1000 /* time in ms */).then(() => { // this will run at the moment the database has nothing else to do // or the timeout has passed myCollection.customCleanupFunction(); }); ","version":"Next","tagName":"h3"},{"title":"close()​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#close","content":" Closes the databases object-instance. This is to free up memory and stop all observers and replications. Returns a Promise that resolves when the database is closed. Closing a database will not remove the databases data. When you create the database again with createRxDatabase(), all data will still be there. await myDatabase.close(); ","version":"Next","tagName":"h3"},{"title":"remove()​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#remove","content":" Wipes all documents from the storage. Use this to free up disc space. await myDatabase.remove(); // database instance is now gone You can also clear a database without removing its instance by using removeRxDatabase(). This is useful if you want to migrate data or reset the users state by renaming the database. Then you can remove the previous data with removeRxDatabase() without creating a RxDatabase first. Notice that this will only remove the stored data on the storage. It will not clear the cache of any RxDatabase instances. import { removeRxDatabase } from 'rxdb'; removeRxDatabase('mydatabasename', 'localstorage'); ","version":"Next","tagName":"h3"},{"title":"isRxDatabase​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#isrxdatabase","content":" Returns true if the given object is an instance of RxDatabase. Returns false if not. import { isRxDatabase } from 'rxdb'; const is = isRxDatabase(myObj); ","version":"Next","tagName":"h3"},{"title":"collections$​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#collections","content":" Emits events whenever a RxCollection is added or removed to the instance of the RxDatabase. Notice that this only emits the JavaScript instance of the RxCollection class, it does not emit events across browser tabs. const sub = myDatabase.collections$.subscribe(event => { console.dir(event); }); await myDatabase.addCollections({ heroes: { schema: mySchema } }); // -> emits the event sub.unsubscribe(); ","version":"Next","tagName":"h3"},{"title":"RxDB's realtime Sync Engine for Local-First Apps","type":0,"sectionRef":"#","url":"/replication.html","content":"","keywords":"","version":"Next"},{"title":"Design Decisions of the Sync Engine​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#design-decisions-of-the-sync-engine","content":" In contrast to other (server-side) database replication protocols, the RxDB Sync Engine was designed with these goals in mind: Easy to Understand: The sync engine works in a simple "git-like" way that is easy to understand for an average developer. You only have to understand how three simple endpoints work.Complex Parts are in RxDB, not in the Backend: The complex parts of the Sync Engine, like conflict handling or offline-online switches, are implemented inside of RxDB itself. This makes creating a compatible backend very easy.Compatible with any Backend: Because the complex parts are in RxDB, the backend can be "dump" which makes the protocol compatible to almost every backend. No matter if you use PostgreSQL, MongoDB or anything else.Performance is optimized for Client Devices and Browsers: By grouping updates and fetches into batches, it is faster to transfer and easier to compress. Client devices and browsers can also process this data faster, for example running JSON.parse() on a chunk of data is faster than calling it once per row. Same goes for how client side storage like IndexedDB or OPFS works where writing data in bulks is faster.Offline-First Support: By incorporating conflict handling at the client side, the protocol fully supports offline-first apps. Users can continue making changes while offline, and those updates will sync seamlessly once a connection is reestablished - all without risking data loss or having undefined behavior.Multi-Tab Support: When RxDB is used in a browser and multiple tabs of the same application are opened, only exactly one runs the replication at any given time. This reduces client- and backend resources. ","version":"Next","tagName":"h2"},{"title":"The Sync Engine on the document level​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#the-sync-engine-on-the-document-level","content":" On the RxDocument level, the replication works like git, where the fork/client contains all new writes and must be merged with the master/server before it can push its new state to the master/server. A---B-----------D master/server state \\ / B---C---D fork/client state The client pulls the latest state B from the master.The client does some changes C+D.The client pushes these changes to the master by sending the latest known master state B and the new client state D of the document.If the master state is equal to the latest master B state of the client, the new client state D is set as the latest master state.If the master also had changes and so the latest master change is different then the one that the client assumes, we have a conflict that has to be resolved on the client. ","version":"Next","tagName":"h2"},{"title":"The Sync Engine on the transfer level​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#the-sync-engine-on-the-transfer-level","content":" When document states are transferred, all handlers use batches of documents for better performance. The server must implement the following methods to be compatible with the replication: pullHandler Get the last checkpoint (or null) as input. Returns all documents that have been written after the given checkpoint. Also returns the checkpoint of the latest written returned document.pushHandler a method that can be called by the client to send client side writes to the master. It gets an array with the assumedMasterState and the newForkState of each document write as input. It must return an array that contains the master document states of all conflicts. If there are no conflicts, it must return an empty array.pullStream an observable that emits batches of all master writes and the latest checkpoint of the write batches. +--------+ +--------+ | | pullHandler() | | | |---------------------> | | | | | | | | | | | Client | pushHandler() | Server | | |---------------------> | | | | | | | | pullStream$ | | | | <-------------------------| | +--------+ +--------+ The replication runs in two different modes: ","version":"Next","tagName":"h2"},{"title":"Checkpoint iteration​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#checkpoint-iteration","content":" On first initial replication, or when the client comes online again, a checkpoint based iteration is used to catch up with the server state. A checkpoint is a subset of the fields of the last pulled document. When the checkpoint is send to the backend via pullHandler(), the backend must be able to respond with all documents that have been written after the given checkpoint. For example if your documents contain an id and an updatedAt field, these two can be used as checkpoint. When the checkpoint iteration reaches the last checkpoint, where the backend returns an empty array because there are no newer documents, the replication will automatically switch to the event observation mode. ","version":"Next","tagName":"h3"},{"title":"Event observation​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#event-observation","content":" While the client is connected to the backend, the events from the backend are observed via pullStream$ and persisted to the client. If your backend for any reason is not able to provide a full pullStream$ that contains all events and the checkpoint, you can instead only emit RESYNC events that tell RxDB that anything unknown has changed on the server and it should run the pull replication via checkpoint iteration. When the client goes offline and online again, it might happen that the pullStream$ has missed out some events. Therefore the pullStream$ should also emit a RESYNC event each time the client reconnects, so that the client can become in sync with the backend via the checkpoint iteration mode. ","version":"Next","tagName":"h3"},{"title":"Data layout on the server​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#data-layout-on-the-server","content":" To use the replication you first have to ensure that: documents are deterministic sortable by their last write time deterministic means that even if two documents have the same last write time, they have a predictable sort order. This is most often ensured by using the primaryKey as second sort parameter as part of the checkpoint. documents are never deleted, instead the _deleted field is set to true. This is needed so that the deletion state of a document exists in the database and can be replicated with other instances. If your backend uses a different field to mark deleted documents, you have to transform the data in the push/pull handlers or with the modifiers. For example if your documents look like this: const docData = { "id": "foobar", "name": "Alice", "lastName": "Wilson", /** * Contains the last write timestamp * so all documents writes can be sorted by that value * when they are fetched from the remote instance. */ "updatedAt": 1564483474, /** * Instead of physically deleting documents, * a deleted document gets replicated. */ "_deleted": false } Then your data is always sortable by updatedAt. This ensures that when RxDB fetches 'new' changes via pullHandler(), it can send the latest updatedAt+id checkpoint to the remote endpoint and then receive all newer documents. By default, the field is _deleted. If your remote endpoint uses a different field to mark deleted documents, you can set the deletedField in the replication options which will automatically map the field on all pull and push requests. ","version":"Next","tagName":"h2"},{"title":"Conflict handling​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#conflict-handling","content":" When multiple clients (or the server) modify the same document at the same time (or when they are offline), it can happen that a conflict arises during the replication. A---B1---C1---X master/server state \\ / B1---C2 fork/client state In the case above, the client would tell the master to move the document state from B1 to C2 by calling pushHandler(). But because the actual master state is C1 and not B1, the master would reject the write by sending back the actual master state C1.RxDB resolves all conflicts on the client so it would call the conflict handler of the RxCollection and create a new document state D that can then be written to the master. A---B1---C1---X---D master/server state \\ / \\ / B1---C2---D fork/client state The default conflict handler will always drop the fork state and use the master state. This ensures that clients that are offline for a very long time, do not accidentally overwrite other peoples changes when they go online again. You can specify a custom conflict handler by setting the property conflictHandler when calling addCollection(). Learn how to create a custom conflict handler. ","version":"Next","tagName":"h2"},{"title":"replicateRxCollection()​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#replicaterxcollection","content":" You can start the replication of a single RxCollection by calling replicateRxCollection() like in the following: import { replicateRxCollection } from 'rxdb/plugins/replication'; import { lastOfArray } from 'rxdb'; const replicationState = await replicateRxCollection({ collection: myRxCollection, /** * An id for the replication to identify it * and so that RxDB is able to resume the replication on app reload. * If you replicate with a remote server, it is recommended to put the * server url into the replicationIdentifier. */ replicationIdentifier: 'my-rest-replication-to-https://example.com/api/sync', /** * By default it will do an ongoing realtime replication. * By settings live: false the replication will run once until the local state * is in sync with the remote state, then it will cancel itself. * (optional), default is true. */ live: true, /** * Time in milliseconds after when a failed backend request * has to be retried. * This time will be skipped if a offline->online switch is detected * via navigator.onLine * (optional), default is 5 seconds. */ retryTime: 5 * 1000, /** * When multiInstance is true, like when you use RxDB in multiple browser tabs, * the replication should always run in only one of the open browser tabs. * If waitForLeadership is true, it will wait until the current instance is leader. * If waitForLeadership is false, it will start replicating, even if it is not leader. * [default=true] */ waitForLeadership: true, /** * If this is set to false, * the replication will not start automatically * but will wait for replicationState.start() being called. * (optional), default is true */ autoStart: true, /** * Custom deleted field, the boolean property of the document data that * marks a document as being deleted. * If your backend uses a different fieldname then '_deleted', set the fieldname here. * RxDB will still store the documents internally with '_deleted', setting this field * only maps the data on the data layer. * * If a custom deleted field contains a non-boolean value, the deleted state * of the documents depends on if the value is truthy or not. So instead of providing a boolean * * deleted value, you could also work with using a 'deletedAt' timestamp instead. * * [default='_deleted'] */ deletedField: 'deleted', /** * Optional, * only needed when you want to replicate local changes to the remote instance. */ push: { /** * Push handler */ async handler(docs) { /** * Push the local documents to a remote REST server. */ const rawResponse = await fetch('https://example.com/api/sync/push', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify({ docs }) }); /** * Contains an array with all conflicts that appeared during this push. * If there were no conflicts, return an empty array. */ const response = await rawResponse.json(); return response; }, /** * Batch size, optional * Defines how many documents will be given to the push handler at once. */ batchSize: 5, /** * Modifies all documents before they are given to the push handler. * Can be used to swap out a custom deleted flag instead of the '_deleted' field. * If the push modifier return null, the document will be skipped and not send to the remote. * Notice that the modifier can be called multiple times and should not contain any side effects. * (optional) */ modifier: d => d }, /** * Optional, * only needed when you want to replicate remote changes to the local state. */ pull: { /** * Pull handler */ async handler(lastCheckpoint, batchSize) { const minTimestamp = lastCheckpoint ? lastCheckpoint.updatedAt : 0; /** * In this example we replicate with a remote REST server */ const response = await fetch( `https://example.com/api/sync/?minUpdatedAt=${minTimestamp}&limit=${batchSize}` ); const documentsFromRemote = await response.json(); return { /** * Contains the pulled documents from the remote. * Not that if documentsFromRemote.length < batchSize, * then RxDB assumes that there are no more un-replicated documents * on the backend, so the replication will switch to 'Event observation' mode. */ documents: documentsFromRemote, /** * The last checkpoint of the returned documents. * On the next call to the pull handler, * this checkpoint will be passed as 'lastCheckpoint' */ checkpoint: documentsFromRemote.length === 0 ? lastCheckpoint : { id: lastOfArray(documentsFromRemote).id, updatedAt: lastOfArray(documentsFromRemote).updatedAt } }; }, batchSize: 10, /** * Modifies all documents after they have been pulled * but before they are used by RxDB. * Notice that the modifier can be called multiple times and should not contain any side effects. * (optional) */ modifier: d => d, /** * Stream of the backend document writes. * See below. * You only need a stream$ when you have set live=true */ stream$: pullStream$.asObservable() }, }); /** * Creating the pull stream for realtime replication. * Here we use a websocket but any other way of sending data to the client can be used, * like long polling or server-sent events. */ const pullStream$ = new Subject<RxReplicationPullStreamItem<any, any>>(); let firstOpen = true; function connectSocket() { const socket = new WebSocket('wss://example.com/api/sync/stream'); /** * When the backend sends a new batch of documents+checkpoint, * emit it into the stream$. * * event.data must look like this * { * documents: [ * { * id: 'foobar', * _deleted: false, * updatedAt: 1234 * } * ], * checkpoint: { * id: 'foobar', * updatedAt: 1234 * } * } */ socket.onmessage = event => pullStream$.next(event.data); /** * Automatically reconnect the socket on close and error. */ socket.onclose = () => connectSocket(); socket.onerror = () => socket.close(); socket.onopen = () => { if(firstOpen) { firstOpen = false; } else { /** * When the client is offline and goes online again, * it might have missed out events that happened on the server. * So we have to emit a RESYNC so that the replication goes * into 'Checkpoint iteration' mode until the client is in sync * and then it will go back into 'Event observation' mode again. */ pullStream$.next('RESYNC'); } } } ","version":"Next","tagName":"h2"},{"title":"Multi Tab support​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#multi-tab-support","content":" For better performance, the replication runs only in one instance when RxDB is used in multiple browser tabs or Node.js processes. By setting waitForLeadership: false you can enforce that each tab runs its own replication cycles. If used in a multi instance setting, so when at database creation multiInstance: false was not set, you need to import the leader election plugin so that RxDB can know how many instances exist and which browser tab should run the replication. ","version":"Next","tagName":"h2"},{"title":"Error handling​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#error-handling","content":" When sending a document to the remote fails for any reason, RxDB will send it again in a later point in time. This happens for all errors. The document write could have already reached the remote instance and be processed, while only the answering fails. The remote instance must be designed to handle this properly and to not crash on duplicate data transmissions. Depending on your use case, it might be ok to just write the duplicate document data again. But for a more resilient error handling you could compare the last write timestamps or add a unique write id field to the document. This field can then be used to detect duplicates and ignore re-send data. Also the replication has an .error$ stream that emits all RxError objects that arise during replication. Notice that these errors contain an inner .parameters.errors field that contains the original error. Also they contain a .parameters.direction field that indicates if the error was thrown during pull or push. You can use these to properly handle errors. For example when the client is outdated, the server might respond with a 426 Upgrade Required error code that can then be used to force a page reload. replicationState.error$.subscribe((error) => { if( error.parameters.errors && error.parameters.errors[0] && error.parameters.errors[0].code === 426 ) { // client is outdated -> enforce a page reload location.reload(); } }); ","version":"Next","tagName":"h2"},{"title":"Security​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#security","content":" Be aware that client side clocks can never be trusted. When you have a client-backend replication, the backend should overwrite the updatedAt timestamp or use another field, when it receives the change from the client. ","version":"Next","tagName":"h2"},{"title":"RxReplicationState​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#rxreplicationstate","content":" The function replicateRxCollection() returns a RxReplicationState that can be used to manage and observe the replication. ","version":"Next","tagName":"h2"},{"title":"Observable​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#observable","content":" To observe the replication, the RxReplicationState has some Observable properties: // emits each document that was received from the remote myRxReplicationState.received$.subscribe(doc => console.dir(doc)); // emits each document that was send to the remote myRxReplicationState.sent$.subscribe(doc => console.dir(doc)); // emits all errors that happen when running the push- & pull-handlers. myRxReplicationState.error$.subscribe(error => console.dir(error)); // emits true when the replication was canceled, false when not. myRxReplicationState.canceled$.subscribe(bool => console.dir(bool)); // emits true when a replication cycle is running, false when not. myRxReplicationState.active$.subscribe(bool => console.dir(bool)); ","version":"Next","tagName":"h3"},{"title":"awaitInitialReplication()​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#awaitinitialreplication","content":" With awaitInitialReplication() you can await the initial replication that is done when a full replication cycle was successful finished for the first time. The returned promise will never resolve if you cancel the replication before the initial replication can be done. await myRxReplicationState.awaitInitialReplication(); ","version":"Next","tagName":"h3"},{"title":"awaitInSync()​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#awaitinsync","content":" Returns a Promise that resolves when: awaitInitialReplication() has emitted.All local data is replicated with the remote.No replication cycle is running or in retry-state. warning When multiInstance: true and waitForLeadership: true and another tab is already running the replication, awaitInSync() will not resolve until the other tab is closed and the replication starts in this tab. await myRxReplicationState.awaitInSync(); warning awaitInitialReplication() and awaitInSync() should not be used to block the application​ A common mistake in RxDB usage is when developers want to block the app usage until the application is in sync. Often they just await the promise of awaitInitialReplication() or awaitInSync() and show a loading spinner until they resolve. This is dangerous and should not be done because: When multiInstance: true and waitForLeadership: true (default) and another tab is already running the replication, awaitInitialReplication() will not resolve until the other tab is closed and the replication starts in this tab.Your app can no longer be started when the device is offline because there the awaitInitialReplication() will never resolve and the app cannot be used. Instead you should store the last in-sync time in a local document and observe its value on all instances. For example if you want to block clients from using the app if they have not been in sync for the last 24 hours, you could use this code: // update last-in-sync-flag each time replication is in sync await myCollection.insertLocal('last-in-sync', { time: 0 }).catch(); // ensure flag exists myReplicationState.active$.pipe( mergeMap(async() => { await myReplicationState.awaitInSync(); await myCollection.upsertLocal('last-in-sync', { time: Date.now() }) }) ); // observe the flag and toggle loading spinner await showLoadingSpinner(); const oneDay = 1000 * 60 * 60 * 24; await firstValueFrom( myCollection.getLocal$('last-in-sync').pipe( filter(d => d.get('time') > (Date.now() - oneDay)) ) ); await hideLoadingSpinner(); ","version":"Next","tagName":"h3"},{"title":"reSync()​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#resync","content":" Triggers a RESYNC cycle where the replication goes into checkpoint iteration until the client is in sync with the backend. Used in unit tests or when no proper pull.stream$ can be implemented so that the client only knows that something has been changed but not what. myRxReplicationState.reSync(); If your backend is not capable of sending events to the client at all, you could run reSync() in an interval so that the client will automatically fetch server changes after some time at least. // trigger RESYNC each 10 seconds. setInterval(() => myRxReplicationState.reSync(), 10 * 1000); ","version":"Next","tagName":"h3"},{"title":"cancel()​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#cancel","content":" Cancels the replication. Returns a promise that resolved when everything has been cleaned up. await myRxReplicationState.cancel(); ","version":"Next","tagName":"h3"},{"title":"pause()​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#pause","content":" Pauses a running replication. The replication can later be resumed with RxReplicationState.start(). await myRxReplicationState.pause(); await myRxReplicationState.start(); // restart ","version":"Next","tagName":"h3"},{"title":"remove()​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#remove","content":" Cancels the replication and deletes the metadata of the replication state. This can be used to restart the replication "from scratch". Calling .remove() will only delete the replication metadata, it will NOT delete the documents from the collection of the replication. await myRxReplicationState.remove(); ","version":"Next","tagName":"h3"},{"title":"isStopped()​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#isstopped","content":" Returns true if the replication is stopped. This can be if a non-live replication is finished or a replication got canceled. replicationState.isStopped(); // true/false ","version":"Next","tagName":"h3"},{"title":"isPaused()​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#ispaused","content":" Returns true if the replication is paused. replicationState.isPaused(); // true/false ","version":"Next","tagName":"h3"},{"title":"Setting a custom initialCheckpoint​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#setting-a-custom-initialcheckpoint","content":" By default, the push replication will start from the beginning of time and push all documents from there to the remote. By setting a custom push.initialCheckpoint, you can tell the replication to only push writes that are newer than the given checkpoint. // store the latest checkpoint of a collection let lastLocalCheckpoint: any; myCollection.checkpoint$.subscribe(checkpoint => lastLocalCheckpoint = checkpoint); // start the replication but only push documents that are newer than the lastLocalCheckpoint const replicationState = replicateRxCollection({ collection: myCollection, replicationIdentifier: 'my-custom-replication-with-init-checkpoint', /* ... */ push: { handler: /* ... */, initialCheckpoint: lastLocalCheckpoint } }); The same can be done for the other direction by setting a pull.initialCheckpoint. Notice that here we need the remote checkpoint from the backend instead of the one from the RxDB storage. // get the last pull checkpoint from the server const lastRemoteCheckpoint = await (await fetch('http://example.com/pull-checkpoint')).json(); // start the replication but only pull documents that are newer than the lastRemoteCheckpoint const replicationState = replicateRxCollection({ collection: myCollection, replicationIdentifier: 'my-custom-replication-with-init-checkpoint', /* ... */ pull: { handler: /* ... */, initialCheckpoint: lastRemoteCheckpoint } }); ","version":"Next","tagName":"h3"},{"title":"toggleOnDocumentVisible​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#toggleondocumentvisible","content":" Ensures replication continues running when the document is visible. This helps avoid situations where the leader-elected tab becomes stale or is hibernated by the browser to save battery. When the tab becomes hidden, replication is automatically paused; when the tab becomes visible again (or the instance becomes leader), replication resumes. Default:true const replicationState = replicateRxCollection({ toggleOnDocumentVisible: true, /* ... */ }); ","version":"Next","tagName":"h3"},{"title":"Attachment replication​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#attachment-replication","content":" Attachment replication is supported in the RxDB Sync Engine itself. However not all replication plugins support it. If you start the replication with a collection which has enabled RxAttachments attachments data will be added to all push- and write data. The pushed documents will contain an _attachments object which contains: The attachment meta data (id, length, digest) of all non-attachmentsThe full attachment data of all attachments that have been updated/added from the client.Deleted attachments are spared out in the pushed document. With this data, the backend can decide onto which attachments must be deleted, added or overwritten. Accordingly, the pulled document must contain the same data, if the backend has a new document state with updated attachments. ","version":"Next","tagName":"h2"},{"title":"Pull-Only Replication​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#pull-only-replication","content":" With the replication protocol it is possible to do pull only replications where data is pulled from a backend but not pushed from the client. RxDB implements some performance optimizations for these like not storing server metadata on pull only streams. ","version":"Next","tagName":"h2"},{"title":"Partial Sync with RxDB​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#partial-sync-with-rxdb","content":" Suppose you're building a Minecraft-like voxel game where the world can expand in every direction. Storing the entire map locally for offline use is impossible because the dataset could be massive. Yet you still want a local-first design so players can edit the game world offline and sync back to the server later. ","version":"Next","tagName":"h2"},{"title":"Idea: One Collection, Multiple Replications​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#idea-one-collection-multiple-replications","content":" You might define a single RxDB collection called db.voxels, where each document represents a block or "voxel" (with fields like id, chunkId, coordinates, and type). With RxDB you can, instead of setting up one replication that tries to fetch all voxels, you create separate replication states for each chunk of the world the player is currently near. When the player enters a particular chunk (say chunk-123), you start a replication dedicated to that chunk. On the server side, you have endpoints to pull only that chunk's voxels (e.g., GET /api/voxels/pull?chunkId=123) and push local changes back (e.g., POST /api/voxels/push?chunkId=123). RxDB handles them similarly to any other offline-first setup, but each replication is filtered to only that chunk's data. When the player leaves chunk-123 and no longer needs it, you stop that replication. If the player moves to chunk-124, you start a new replication for chunk 124. This ensures the game only downloads and syncs data relevant to the player's immediate location. Meanwhile, all edits made offline remain safely stored in the local database until a network connection is available. const activeReplications = {}; // chunkId -> replicationState function startChunkReplication(chunkId) { if (activeReplications[chunkId]) return; const replicationId = 'voxels-chunk-' + chunkId; const replicationState = replicateRxCollection({ collection: db.voxels, replicationIdentifier: replicationId, pull: { async handler(checkpoint, limit) { const res = await fetch( `/api/voxels/pull?chunkId=${chunkId}&cp=${checkpoint}&limit=${limit}` ); /* ... */ } }, push: { async handler(changedDocs) { const res = await fetch(`/api/voxels/push?chunkId=${chunkId}`); /* ... */ } } }); activeReplications[chunkId] = replicationState; } function stopChunkReplication(chunkId) { const rep = await activeReplications[chunkId]; if (rep) { rep.cancel(); delete activeReplications[chunkId]; } } // Called whenever the player's location changes; // dynamically start/stop replication for nearby chunks. function onPlayerMove(neighboringChunkIds) { neighboringChunkIds.forEach(startChunkReplication); Object.keys(activeReplications).forEach(cid => { if (!neighboringChunkIds.includes(cid)) { stopChunkReplication(cid); } }); } ","version":"Next","tagName":"h3"},{"title":"Diffy-Sync when Revisiting a Chunk​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#diffy-sync-when-revisiting-a-chunk","content":" An added benefit of this multi-replication-state design is checkpointing. Each replication state has a unique "replication identifier," so the next time the player returns to chunk-123, the local database knows what it already has and only fetches the differences without the need to re-download the entire chunk. ","version":"Next","tagName":"h3"},{"title":"Partial Sync in a Local-First Business Application​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#partial-sync-in-a-local-first-business-application","content":" Though a voxel world is an intuitive example, the same technique applies in enterprise scenarios where data sets are large but each user only needs a specific subset. You could spin up a new replication for each "permission group" or "region," so users only sync the records they're allowed to see. Or in a CRM, the replication might be filtered by the specific accounts or projects a user is currently handling. As soon as they switch to a different project, you stop the old replication and start one for the new scope. This chunk-based or scope-based replication pattern keeps your local storage lean, reduces network overhead, and still gives users the offline, instant-feedback experience that local-first apps are known for. By dynamically creating (and canceling) replication states, you retain tight control over bandwidth usage and make the infinite (or very large) feasible. In a production app you would also "flag" the entities (with a pull.modifier) by which replication state they came from, so that you can clean up the parts that you no longer need. --> ","version":"Next","tagName":"h3"},{"title":"FAQ​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#faq","content":" I have infinite loops in my replication, how to debug? When you have infinite loops in your replication or random re-runs of http requests after some time, the reason is likely that your pull-handler is crashing. The debug this, add a log to the error$ handler to debug it. myRxReplicationState.error$.subscribe(err => console.log('error$', err)). ","version":"Next","tagName":"h2"},{"title":"Local Documents","type":0,"sectionRef":"#","url":"/rx-local-document.html","content":"","keywords":"","version":"Next"},{"title":"Add the local documents plugin​","type":1,"pageTitle":"Local Documents","url":"/rx-local-document.html#add-the-local-documents-plugin","content":" To enable the local documents, you have to add the local-documents plugin. import { addRxPlugin } from 'rxdb'; import { RxDBLocalDocumentsPlugin } from 'rxdb/plugins/local-documents'; addRxPlugin(RxDBLocalDocumentsPlugin); ","version":"Next","tagName":"h2"},{"title":"Activate the plugin for a RxDatabase or RxCollection​","type":1,"pageTitle":"Local Documents","url":"/rx-local-document.html#activate-the-plugin-for-a-rxdatabase-or-rxcollection","content":" For better performance, the local document plugin does not create a storage for every database or collection that is created. Instead you have to set localDocuments: true when you want to store local documents in the instance. // activate local documents on a RxDatabase const myDatabase = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageLocalstorage(), localDocuments: true // <- activate this to store local documents in the database }); myDatabase.addCollections({ messages: { schema: messageSchema, localDocuments: true // <- activate this to store local documents in the collection } }); note If you want to store local documents in a RxCollection but NOT in the RxDatabase, you MUST NOT set localDocuments: true in the RxDatabase because it will only slow down the initial database creation. ","version":"Next","tagName":"h2"},{"title":"insertLocal()​","type":1,"pageTitle":"Local Documents","url":"/rx-local-document.html#insertlocal","content":" Creates a local document for the database or collection. Throws if a local document with the same id already exists. Returns a Promise which resolves the new RxLocalDocument. const localDoc = await myCollection.insertLocal( 'foobar', // id { // data foo: 'bar' } ); // you can also use local-documents on a database const localDoc = await myDatabase.insertLocal( 'foobar', // id { // data foo: 'bar' } ); ","version":"Next","tagName":"h2"},{"title":"upsertLocal()​","type":1,"pageTitle":"Local Documents","url":"/rx-local-document.html#upsertlocal","content":" Creates a local document for the database or collection if not exists. Overwrites the if exists. Returns a Promise which resolves the RxLocalDocument. const localDoc = await myCollection.upsertLocal( 'foobar', // id { // data foo: 'bar' } ); ","version":"Next","tagName":"h2"},{"title":"getLocal()​","type":1,"pageTitle":"Local Documents","url":"/rx-local-document.html#getlocal","content":" Find a RxLocalDocument by its id. Returns a Promise which resolves the RxLocalDocument or null if not exists. const localDoc = await myCollection.getLocal('foobar'); ","version":"Next","tagName":"h2"},{"title":"getLocal$()​","type":1,"pageTitle":"Local Documents","url":"/rx-local-document.html#getlocal-1","content":" Like getLocal() but returns an Observable that emits the document or null if not exists. const subscription = myCollection.getLocal$('foobar').subscribe(documentOrNull => { console.dir(documentOrNull); // > RxLocalDocument or null }); ","version":"Next","tagName":"h2"},{"title":"RxLocalDocument​","type":1,"pageTitle":"Local Documents","url":"/rx-local-document.html#rxlocaldocument","content":" A RxLocalDocument behaves like a normal RxDocument. const localDoc = await myCollection.getLocal('foobar'); // access data const foo = localDoc.get('foo'); // change data localDoc.set('foo', 'bar2'); await localDoc.save(); // observe data localDoc.get$('foo').subscribe(value => { /* .. */ }); // remove it await localDoc.remove(); note Because the local document does not have a schema, accessing the documents data-fields via pseudo-proxy will not work. const foo = localDoc.foo; // undefined const foo = localDoc.get('foo'); // works! localDoc.foo = 'bar'; // does not work! localDoc.set('foo', 'bar'); // works For the usage with typescript, you can have access to the typed data of the document over toJSON() declare type MyLocalDocumentType = { foo: string } const localDoc = await myCollection.upsertLocal<MyLocalDocumentType>( 'foobar', // id { // data foo: 'bar' } ); // typescript will know that foo is a string const foo: string = localDoc.toJSON().foo; ","version":"Next","tagName":"h2"},{"title":"RxPipeline","type":0,"sectionRef":"#","url":"/rx-pipeline.html","content":"","keywords":"","version":"Next"},{"title":"Creating a RxPipeline​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#creating-a-rxpipeline","content":" Pipelines are created on top of a source RxCollection and have another RxCollection as destination. An identifier is used to identify the state of the pipeline so that different pipelines have a different processing checkpoint state. A plain JavaScript function handler is used to process the data of the source collection writes. const pipeline = await mySourceCollection.addPipeline({ identifier: 'my-pipeline', destination: myDestinationCollection, handler: async (docs) => { /** * Here you can process the documents and write to * the destination collection. */ for (const doc of docs) { await myDestinationCollection.insert({ id: doc.primary, category: doc.category }); } } }); ","version":"Next","tagName":"h2"},{"title":"Use Cases for RxPipeline​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#use-cases-for-rxpipeline","content":" The RxPipeline is a handy building block for different features and plugins. You can use it to aggregate data or restructure local data. ","version":"Next","tagName":"h2"},{"title":"UseCase: Re-Index data that comes from replication​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#usecase-re-index-data-that-comes-from-replication","content":" Sometimes you want to replicate atomic documents over the wire but locally you want to split these documents for better indexing. For example you replicate email documents that have multiple receivers in a string-array. While string-arrays cannot be indexed, locally you need a way to query for all emails of a given receiver. To handle this case you can set up a RxPipeline that writes the mapping into a separate collection: const pipeline = await emailCollection.addPipeline({ identifier: 'map-email-receivers', destination: emailByReceiverCollection, handler: async (docs) => { for (const doc of docs) { // remove previous mapping await emailByReceiverCollection.find({emailId: doc.primary}).remove(); // add new mapping if(!doc.deleted) { await emailByReceiverCollection.bulkInsert( doc.receivers.map(receiver => ({ emailId: doc.primary, receiver: receiver })) ); } } } }); With this you can efficiently query for "all emails that a person received" by running: const mailIds = await emailByReceiverCollection.find({ receiver: 'foobar@example.com' }).exec(); ","version":"Next","tagName":"h3"},{"title":"UseCase: Fulltext Search​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#usecase-fulltext-search","content":" You can utilize the pipeline plugin to index text data for efficient fulltext search. const pipeline = await emailCollection.addPipeline({ identifier: 'email-fulltext-search', destination: mailByWordCollection, handler: async (docs) => { for (const doc of docs) { // remove previous mapping await mailByWordCollection.find({emailId: doc.primary}).remove(); // add new mapping if(!doc.deleted) { const words = doc.text.split(' '); await mailByWordCollection.bulkInsert( words.map(word => ({ emailId: doc.primary, word: word })) ); } } } }); With this you can efficiently query for "all emails that contain a given word" by running: const mailIds = await emailByReceiverCollection.find({word: 'foobar'}).exec(); ","version":"Next","tagName":"h3"},{"title":"UseCase: Download data based on source documents​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#usecase-download-data-based-on-source-documents","content":" When you have to fetch data for each document of a collection from a server, you can use the pipeline to ensure all documents have their data downloaded and no document is missed. const pipeline = await emailCollection.addPipeline({ identifier: 'download-data', destination: serverDataCollection, handler: async (docs) => { for (const doc of docs) { const response = await fetch('https://example.com/doc/' + doc.primary); const serverData = await response.json(); await serverDataCollection.upsert({ id: doc.primary, data: serverData }); } } }); ","version":"Next","tagName":"h3"},{"title":"RxPipeline methods​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#rxpipeline-methods","content":" ","version":"Next","tagName":"h2"},{"title":"awaitIdle()​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#awaitidle","content":" You can await the idleness of a pipeline with await myRxPipeline.awaitIdle(). This will await a promise that resolves when the pipeline has processed all documents and is not running anymore. ","version":"Next","tagName":"h3"},{"title":"close()​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#close","content":" await myRxPipeline.close() stops the pipeline so that it is no longer doing stuff. This is automatically called when the RxCollection or RxDatabase of the pipeline is closed. ","version":"Next","tagName":"h3"},{"title":"remove()​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#remove","content":" await myRxPipeline.remove() removes the pipeline and all metadata which it has stored. Recreating the pipeline afterwards will start processing all source documents from scratch. ","version":"Next","tagName":"h3"},{"title":"Using RxPipeline correctly​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#using-rxpipeline-correctly","content":" ","version":"Next","tagName":"h2"},{"title":"Pipeline handlers must be idempotent​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#pipeline-handlers-must-be-idempotent","content":" Because a JavaScript process can exit at any time, like when the user closes a browser tab, the pipeline handler function must be idempotent. This means when it only runs partially and is started again with the same input, it should still end up in the correct result. ","version":"Next","tagName":"h3"},{"title":"Pipeline handlers must not throw​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#pipeline-handlers-must-not-throw","content":" Pipeline handlers must never throw. If you run operations inside of the handler that might cause errors, you must wrap the handler's code with a try-catch by yourself and also handle retries. If your handler throws, your pipeline will be stuck and no longer be usable, which should never happen. ","version":"Next","tagName":"h3"},{"title":"Be careful when doing http requests in the handler​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#be-careful-when-doing-http-requests-in-the-handler","content":" When you run http requests inside of your handler, you no longer have an offline first application because reads to the destination collection will be blocked until all handlers have finished. When your client is offline, therefore the collection will be blocked for reads and writes. ","version":"Next","tagName":"h3"},{"title":"Pipelines temporarily block external reads and writes​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#pipelines-temporarily-block-external-reads-and-writes","content":" While a pipeline is running, all reads and writes to its destination collection are blocked. This guarantees that queries never observe partially processed data, but it also means that pipelines can block each other if they interact incorrectly. Problems occur when multiple pipelines: read or write across the same collections, orwait for each other using awaitIdle() from inside a pipeline handler. // Example of a deadlock // Pipeline A: files → files (reads folders) const pipelineA = await db.files.addPipeline({ identifier: 'file-path-sync', destination: db.files, handler: async (docs) => { const folders = await folders.find().exec(); // can block /* ... */ } }); // Pipeline B: files → folders (waits for A) await db.folders.addPipeline({ identifier: 'file-count', destination: db.folders, handler: async () => { await pipelineA.awaitIdle(); // ❌ may deadlock /* ... */ } }); To prevent deadlocks, consider: Never call awaitIdle() inside a pipeline handler.Avoid circular dependencies between pipelines.Prefer one-directional data flow. ","version":"Next","tagName":"h3"},{"title":"RxDocument","type":0,"sectionRef":"#","url":"/rx-document.html","content":"","keywords":"","version":"Next"},{"title":"insert​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#insert","content":" To insert a document into a collection, you have to call the collection's .insert()-function. await myCollection.insert({ name: 'foo', lastname: 'bar' }); ","version":"Next","tagName":"h2"},{"title":"find​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#find","content":" To find documents in a collection, you have to call the collection's .find()-function. See RxQuery. const docs = await myCollection.find().exec(); // <- find all documents ","version":"Next","tagName":"h2"},{"title":"Functions​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#functions","content":" ","version":"Next","tagName":"h2"},{"title":"get()​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#get","content":" This will get a single field of the document. If the field is encrypted, it will be automatically decrypted before returning. const name = myDocument.get('name'); // returns the name // OR const name = myDocument.name; ","version":"Next","tagName":"h3"},{"title":"get$()​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#get-1","content":" This function returns an observable of the given paths-value. The current value of this path will be emitted each time the document changes. // get the live-updating value of 'name' var isName; myDocument.get$('name') .subscribe(newName => { isName = newName; }); await myDocument.incrementalPatch({name: 'foobar2'}); console.dir(isName); // isName is now 'foobar2' // OR myDocument.name$ .subscribe(newName => { isName = newName; }); ","version":"Next","tagName":"h3"},{"title":"proxy-get​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#proxy-get","content":" All properties of a RxDocument are assigned as getters so you can also directly access values instead of using the get()-function. // Identical to myDocument.get('name'); var name = myDocument.name; // Can also get nested values. var nestedValue = myDocument.whatever.nestedfield; // Also usable with observables: myDocument.firstName$.subscribe(newName => console.log('name is: ' + newName)); // > 'name is: Stefe' await myDocument.incrementalPatch({firstName: 'Steve'}); // > 'name is: Steve' ","version":"Next","tagName":"h3"},{"title":"update()​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#update","content":" Updates the document based on the mongo-update-syntax, based on the mingo library. /** * If not done before, you have to add the update plugin. */ import { addRxPlugin } from 'rxdb'; import { RxDBUpdatePlugin } from 'rxdb/plugins/update'; addRxPlugin(RxDBUpdatePlugin); await myDocument.update({ $inc: { age: 1 // increases age by 1 }, $set: { firstName: 'foobar' // sets firstName to foobar } }); ","version":"Next","tagName":"h3"},{"title":"modify()​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#modify","content":" Updates a documents data based on a function that mutates the current data and returns the new value. const changeFunction = (oldData) => { oldData.age = oldData.age + 1; oldData.name = 'foooobarNew'; return oldData; } await myDocument.modify(changeFunction); console.log(myDocument.name); // 'foooobarNew' ","version":"Next","tagName":"h3"},{"title":"patch()​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#patch","content":" Overwrites the given attributes over the documents data. await myDocument.patch({ name: 'Steve', age: undefined // setting an attribute to undefined will remove it }); console.log(myDocument.name); // 'Steve' ","version":"Next","tagName":"h3"},{"title":"Prevent conflicts with the incremental methods​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#prevent-conflicts-with-the-incremental-methods","content":" Making a normal change to the non-latest version of a RxDocument will lead to a 409 CONFLICT error because RxDB uses revision checks instead of transactions. To make a change to a document, no matter what the current state is, you can use the incremental methods: // update await myDocument.incrementalUpdate({ $inc: { age: 1 // increases age by 1 } }); // modify await myDocument.incrementalModify(docData => { docData.age = docData.age + 1; return docData; }); // patch await myDocument.incrementalPatch({ age: 100 }); // remove await myDocument.incrementalRemove({ age: 100 }); ","version":"Next","tagName":"h3"},{"title":"getLatest()​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#getlatest","content":" Returns the latest known state of the RxDocument. const myDocument = await myCollection.findOne('foobar').exec(); const docAfterEdit = await myDocument.incrementalPatch({ age: 10 }); const latestDoc = myDocument.getLatest(); console.log(docAfterEdit === latestDoc); // > true ","version":"Next","tagName":"h3"},{"title":"Observe $​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#observe-","content":" Calling this will return an RxJS-Observable which the current newest state of the RxDocument. // get all changeEvents myDocument.$ .subscribe(currentRxDocument => console.dir(currentRxDocument)); ","version":"Next","tagName":"h3"},{"title":"remove()​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#remove","content":" This removes the document from the collection. Notice that this will not purge the document from the store but set _deleted:true so that it will be no longer returned on queries. To fully purge a document, use the cleanup plugin. myDocument.remove(); ","version":"Next","tagName":"h3"},{"title":"Remove and update in a single atomic operation​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#remove-and-update-in-a-single-atomic-operation","content":" Sometimes you want to change a documents value and also remove it in the same operation. For example this can be useful when you use replication and want to set a deletedAt timestamp. Then you might have to ensure that setting this timestamp and deleting the document happens in the same atomic operation. To do this the modifying operations of a document accept setting the _deleted field. For example: // update() and remove() await doc.update({ $set: { deletedAt: new Date().getTime(), _deleted: true } }); // modify() and remove() await doc.modify(data => { data.age = 1; data._deleted = true; return data; }); ","version":"Next","tagName":"h3"},{"title":"deleted$​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#deleted","content":" Emits a boolean value, depending on whether the RxDocument is deleted or not. let lastState = null; myDocument.deleted$.subscribe(state => lastState = state); console.log(lastState); // false await myDocument.remove(); console.log(lastState); // true ","version":"Next","tagName":"h3"},{"title":"get deleted​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#get-deleted","content":" A getter to get the current value of deleted$. console.log(myDocument.deleted); // false await myDocument.remove(); console.log(myDocument.deleted); // true ","version":"Next","tagName":"h3"},{"title":"toJSON()​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#tojson","content":" Returns the document's data as plain json object. This will return an immutable object. To get something that can be modified, use toMutableJSON() instead. const json = myDocument.toJSON(); console.dir(json); /* { passportId: 'h1rg9ugdd30o', firstName: 'Carolina', lastName: 'Gibson', age: 33 ... */ You can also set withMetaFields: true to get additional meta fields like the revision, attachments or the deleted flag. const json = myDocument.toJSON(true); console.dir(json); /* { passportId: 'h1rg9ugdd30o', firstName: 'Carolina', lastName: 'Gibson', _deleted: false, _attachments: { ... }, _rev: '1-aklsdjfhaklsdjhf...' */ ","version":"Next","tagName":"h3"},{"title":"toMutableJSON()​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#tomutablejson","content":" Same as toJSON() but returns a deep cloned object that can be mutated afterwards. Remember that deep cloning is performance expensive and should only be done when necessary. const json = myDocument.toMutableJSON(); json.firstName = 'Alice'; // The returned document can be mutated All methods of RxDocument are bound to the instance When you get a method from a RxDocument, the method is automatically bound to the documents instance. This means you do not have to use things like myMethod.bind(myDocument) like you would do in jsx. ","version":"Next","tagName":"h3"},{"title":"isRxDocument​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#isrxdocument","content":" Returns true if the given object is an instance of RxDocument. Returns false if not. const is = isRxDocument(myObj); ","version":"Next","tagName":"h3"},{"title":"RxQuery","type":0,"sectionRef":"#","url":"/rx-query.html","content":"","keywords":"","version":"Next"},{"title":"find()​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#find","content":" To create a basic RxQuery, call .find() on a collection and insert selectors. The result-set of normal queries is an array with documents. // find all that are older then 18 const query = myCollection .find({ selector: { age: { $gt: 18 } } }); ","version":"Next","tagName":"h2"},{"title":"findOne()​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#findone","content":" A findOne-query has only a single RxDocument or null as result-set. // find alice const query = myCollection .findOne({ selector: { name: 'alice' } }); // find the youngest one const query = myCollection .findOne({ selector: {}, sort: [ {age: 'asc'} ] }); // find one document by the primary key const query = myCollection.findOne('foobar'); ","version":"Next","tagName":"h2"},{"title":"exec()​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#exec","content":" Returns a Promise that resolves with the result-set of the query. const query = myCollection.find(); const results = await query.exec(); console.dir(results); // > [RxDocument,RxDocument,RxDocument..] On .findOne() queries, you can call .exec(true) to ensure your document exists and to make TypeScript handling easier: // docOrUndefined can be the type RxDocument or null which then has to be handled to be typesafe. const docOrUndefined = await myCollection.findOne().exec(); // with .exec(true), it will throw if the document cannot be found and always have the type RxDocument const doc = await myCollection.findOne().exec(true); ","version":"Next","tagName":"h2"},{"title":"Observe $​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#observe-","content":" An BehaviorSubjectsee that always has the current result-set as value. This is extremely helpful when used together with UIs that should always show the same state as what is written in the database. const query = myCollection.find(); const querySub = query.$.subscribe(results => { console.log('got results: ' + results.length); }); // > 'got results: 5' // BehaviorSubjects emit on subscription await myCollection.insert({/* ... */}); // insert one // > 'got results: 6' // $.subscribe() was called again with the new results // stop watching this query querySub.unsubscribe() ","version":"Next","tagName":"h2"},{"title":"update()​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#update","content":" Runs an update on every RxDocument of the query-result. // to use the update() method, you need to add the update plugin. import { RxDBUpdatePlugin } from 'rxdb/plugins/update'; addRxPlugin(RxDBUpdatePlugin); const query = myCollection.find({ selector: { age: { $gt: 18 } } }); await query.update({ $inc: { age: 1 // increases age of every found document by 1 } }); ","version":"Next","tagName":"h2"},{"title":"patch() / incrementalPatch()​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#patch--incrementalpatch","content":" Runs the RxDocument.patch() function on every RxDocument of the query result. const query = myCollection.find({ selector: { age: { $gt: 18 } } }); await query.patch({ age: 12 // set the age of every found to 12 }); ","version":"Next","tagName":"h2"},{"title":"modify() / incrementalModify()​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#modify--incrementalmodify","content":" Runs the RxDocument.modify() function on every RxDocument of the query result. const query = myCollection.find({ selector: { age: { $gt: 18 } } }); await query.modify((docData) => { docData.age = docData.age + 1; // increases age of every found document by 1 return docData; }); ","version":"Next","tagName":"h2"},{"title":"remove() / incrementalRemove()​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#remove--incrementalremove","content":" Deletes all found documents. Returns a promise which resolves to the deleted documents. // All documents where the age is less than 18 const query = myCollection.find({ selector: { age: { $lt: 18 } } }); // Remove the documents from the collection const removedDocs = await query.remove(); ","version":"Next","tagName":"h2"},{"title":"doesDocumentDataMatch()​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#doesdocumentdatamatch","content":" Returns true if the given document data matches the query. const documentData = { id: 'foobar', age: 19 }; myCollection.find({ selector: { age: { $gt: 18 } } }).doesDocumentDataMatch(documentData); // > true myCollection.find({ selector: { age: { $gt: 20 } } }).doesDocumentDataMatch(documentData); // > false ","version":"Next","tagName":"h2"},{"title":"Query Builder Plugin​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#query-builder-plugin","content":" To use chained query methods, you can also use the query-builder plugin. // add the query builder plugin import { addRxPlugin } from 'rxdb'; import { RxDBQueryBuilderPlugin } from 'rxdb/plugins/query-builder'; addRxPlugin(RxDBQueryBuilderPlugin); // now you can use chained query methods const query = myCollection.find().where('age').gt(18); const result = await query.exec(); ","version":"Next","tagName":"h2"},{"title":"Query Examples​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#query-examples","content":" Here some examples to fast learn how to write queries without reading the docs. Pouch-find-docs - learn how to use mango-queriesmquery-docs - learn how to use chained-queries // directly pass search-object myCollection.find({ selector: { name: { $eq: 'foo' } } }) .exec().then(documents => console.dir(documents)); /* * find by using sql equivalent '%like%' syntax * This example will fe: match 'foo' but also 'fifoo' or 'foofa' or 'fifoofa' * Notice that in RxDB queries, a regex is represented as a $regex string with the $options parameter for flags. * Using a RegExp instance is not allowed because they are not JSON.stringify()-able and also * RegExp instances are mutable which could cause undefined behavior when the RegExp is mutated * after the query was parsed. */ myCollection.find({ selector: { name: { $regex: '.*foo.*' } } }) .exec().then(documents => console.dir(documents)); // find using a composite statement eg: $or // This example checks where name is either foo or if name is not existent on the document myCollection.find({ selector: { $or: [ { name: { $eq: 'foo' } }, { name: { $exists: false } }] } }) .exec().then(documents => console.dir(documents)); // do a case insensitive search // This example will match 'foo' or 'FOO' or 'FoO' etc... myCollection.find({ selector: { name: { $regex: '^foo$', $options: 'i' } } }) .exec().then(documents => console.dir(documents)); // chained queries myCollection.find().where('name').eq('foo') .exec().then(documents => console.dir(documents)); RxDB will always append the primary key to the sort parameters For several performance optimizations, like the EventReduce algorithm, RxDB expects all queries to return a deterministic sort order that does not depend on the insert order of the documents. To ensure a deterministic ordering, RxDB will always append the primary key as last sort parameter to all queries and to all indexes. This works in contrast to most other databases where a query without sorting would return the documents in the order in which they had been inserted to the database. ","version":"Next","tagName":"h2"},{"title":"Setting a specific index​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#setting-a-specific-index","content":" By default, the query will be sent to the RxStorage, where a query planner will determine which one of the available indexes must be used. But the query planner cannot know everything and sometimes will not pick the most optimal index. To improve query performance, you can specify which index must be used, when running the query. const query = myCollection .findOne({ selector: { age: { $gt: 18 }, gender: { $eq: 'm' } }, /** * Because the developer knows that 50% of the documents are 'male', * but only 20% are below age 18, * it makes sense to enforce using the ['gender', 'age'] index to improve performance. * This could not be known by the query planer which might have chosen ['age', 'gender'] instead. */ index: ['gender', 'age'] }); ","version":"Next","tagName":"h2"},{"title":"Count​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#count","content":" When you only need the amount of documents that match a query, but you do not need the document data itself, you can use a count query for better performance. The performance difference compared to a normal query differs depending on which RxStorage implementation is used. const query = myCollection.count({ selector: { age: { $gt: 18 } } // 'limit' and 'skip' MUST NOT be set for count queries. }); // get the count result once const matchingAmount = await query.exec(); // > number // observe the result query.$.subscribe(amount => { console.log('Currently has ' + amount + ' documents'); }); note Count queries have a better performance than normal queries because they do not have to fetch the full document data out of the storage. Therefore it is not possible to run a count() query with a selector that requires to fetch and compare the document data. So if your query selector does not fully match an index of the schema, it is not allowed to run it. These queries would have no performance benefit compared to normal queries but have the tradeoff of not using the fetched document data for caching. /** * The following will throw an error because * the count operation cannot run on any specific index range * because the $regex operator is used. */ const query = myCollection.count({ selector: { age: { $regex: 'foobar' } } }); /** * The following will throw an error because * the count operation cannot run on any specific index range * because there is no ['age' ,'otherNumber'] index * defined in the schema. */ const query = myCollection.count({ selector: { age: { $gt: 20 }, otherNumber: { $gt: 10 } } }); If you want to count these kinds of queries, you should do a normal query instead and use the length of the result set as counter. This has the same performance as running a non-fully-indexed count which has to fetch all document data from the database and run a query matcher. // get count manually once const resultSet = await myCollection.find({ selector: { age: { $regex: 'foobar' } } }).exec(); const count = resultSet.length; // observe count manually const count$ = myCollection.find({ selector: { age: { $regex: 'foobar' } } }).$.pipe( map(result => result.length) ); /** * To allow non-fully-indexed count queries, * you can also specify that by setting allowSlowCount=true * when creating the database. */ const database = await createRxDatabase({ name: 'mydatabase', allowSlowCount: true, // set this to true [default=false] /* ... */ }); ","version":"Next","tagName":"h2"},{"title":"allowSlowCount​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#allowslowcount","content":" To allow non-fully-indexed count queries, you can also specify that by setting allowSlowCount: true when creating the database. Doing this is mostly not wanted, because it would run the counting on the storage without having the document stored in the RxDB document cache. This is only recommended if the RxStorage is running remotely like in a WebWorker and you not always want to send the document-data between the worker and the main thread. In this case you might only need the count-result instead to save performance. ","version":"Next","tagName":"h3"},{"title":"RxQuery's are immutable​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#rxquerys-are-immutable","content":" Because RxDB is a reactive database, we can do heavy performance-optimisation on query-results which change over time. To be able to do this, RxQuery's have to be immutable. This means, when you have a RxQuery and run a .where() on it, the original RxQuery-Object is not changed. Instead the where-function returns a new RxQuery-Object with the changed where-field. Keep this in mind if you create RxQuery's and change them afterwards. Example: const queryObject = myCollection.find().where('age').gt(18); // Creates a new RxQuery object, does not modify previous one queryObject.sort('name'); const results = await queryObject.exec(); console.dir(results); // result-documents are not sorted by name const queryObjectSort = queryObject.sort('name'); const results = await queryObjectSort.exec(); console.dir(results); // result-documents are now sorted ","version":"Next","tagName":"h2"},{"title":"isRxQuery​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#isrxquery","content":" Returns true if the given object is an instance of RxQuery. Returns false if not. const is = isRxQuery(myObj); ","version":"Next","tagName":"h3"},{"title":"Design Decisions​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#design-decisions","content":" Like most other noSQL-Databases, RxDB uses the mango-query-syntax similar to MongoDB and others. We use the JSON based Mango Query Syntax because: Mango Queries work better with TypeScript compared to SQL strings.Mango Queries are composable and easy to transform by code without joining SQL strings.Queries can be run very fast and efficient with only a minimal query planer to plan the best indexes and operations.NoSQL queries can be optimized with the EventReduce algorithm to improve performance of observed and cached queries. ","version":"Next","tagName":"h2"},{"title":"FAQ​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#faq","content":" Can I specify which document fields are returned by an RxDB query? No, RxDB does not support partial document retrieval. Because RxDB is a client-side database with limited memory, it caches and de-duplicates entire documents across multiple queries. Even if you only need a few fields, most storages must still fetch the entire JSON data, so subselecting fields would not significantly improve performance. Therefore, RxDB always returns full documents. If you only need certain fields, you can filter them out in your application code or consider storing just the necessary data in a separate collection. Why doesn't RxDB support aggregations on queries? RxDB runs entirely on the client side. Any "aggregation" or data processing you might do within RxDB would still happen in the same JavaScript environment as your application code. Therefore, there's no real performance advantage or difference between doing the aggregation in RxDB vs. doing it in your own code after fetching the data. As a result, RxDB doesn't provide built-in aggregation methods. Instead, just query the documents you need and perform any calculations directly in your app's code. Why does RxDB not support cross-collection queries? RxDB is a client-side database and does not provide built-in cross-collection queries or transactions. Instead, you can execute multiple queries in your JavaScript code and combine their results as needed. Because everything runs in the same environment, this approach offers the same performance you would get if cross-collection queries were built in - without the added complexity. Why Doesn't RxDB Support Case-Insensitive Search? RxDB relies on various storage engines as its backend, and these storage engines generally do not support case-insensitive search natively, like IndexedDB or FoundationDB. This limitation arises from the design of these engines, which prioritize efficiency and flexibility for specific types of queries rather than universal features like case-insensitivity. Although RxDB does not offer built-in support for case-insensitive search, there are two common workarounds: Store Data in a Meta-Field for Lowercase Search: To enable case-insensitive search, you can store an additional field in your documents where the relevant text data is preprocessed and saved in lowercase. const document = { name: 'John Doe', nameLowercase: 'john doe' // Meta-field }; await myCollection.insert(document); const query = myCollection.find({ selector: { nameLowercase: { $eq: 'john doe' } } }); Use a Regex Query: Regular expressions can perform case-insensitive searches. For example: const query = myCollection.find({ selector: { name: { $regex: '^john doe$', $options: 'i' } // Case-insensitive regex } }); However, this method has a significant downside: regex queries often cannot leverage indexes efficiently. As a result, they may be slower, especially for large datasets. ","version":"Next","tagName":"h2"},{"title":"RxSchema","type":0,"sectionRef":"#","url":"/rx-schema.html","content":"","keywords":"","version":"Next"},{"title":"Example​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#example","content":" In this example-schema we define a hero-collection with the following settings: the version-number of the schema is 0the name-property is the primaryKey. This means its a unique, indexed, required string which can be used to definitely find a single document.the color-field is required for every documentthe healthpoints-field must be a number between 0 and 100the secret-field stores an encrypted valuethe birthyear-field is final which means it is required and cannot be changedthe skills-attribute must be an array with objects which contain the name and the damage-attribute. There is a maximum of 5 skills per hero.Allows adding attachments and store them encrypted { "title": "hero schema", "version": 0, "description": "describes a simple hero", "primaryKey": "name", "type": "object", "properties": { "name": { "type": "string", "maxLength": 100 // <- the primary key must have set maxLength }, "color": { "type": "string" }, "healthpoints": { "type": "number", "minimum": 0, "maximum": 100 }, "secret": { "type": "string" }, "birthyear": { "type": "number", "final": true, "minimum": 1900, "maximum": 2050 }, "skills": { "type": "array", "maxItems": 5, "uniqueItems": true, "items": { "type": "object", "properties": { "name": { "type": "string" }, "damage": { "type": "number" } } } } }, "required": [ "name", "color" ], "encrypted": ["secret"], "attachments": { "encrypted": true } } ","version":"Next","tagName":"h2"},{"title":"Create a collection with the schema​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#create-a-collection-with-the-schema","content":" await myDatabase.addCollections({ heroes: { schema: myHeroSchema } }); console.dir(myDatabase.heroes.name); // heroes ","version":"Next","tagName":"h2"},{"title":"version​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#version","content":" The version field is a number, starting with 0. When the version is greater than 0, you have to provide the migrationStrategies to create a collection with this schema. ","version":"Next","tagName":"h2"},{"title":"primaryKey​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#primarykey","content":" The primaryKey field contains the fieldname of the property that will be used as primary key for the whole collection. The value of the primary key of the document must be a string, unique, final and is required. ","version":"Next","tagName":"h2"},{"title":"composite primary key​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#composite-primary-key","content":" You can define a composite primary key which gets composed from multiple properties of the document data. const mySchema = { keyCompression: true, // set this to true, to enable the keyCompression version: 0, title: 'human schema with composite primary', primaryKey: { // where should the composed string be stored key: 'id', // fields that will be used to create the composed key fields: [ 'firstName', 'lastName' ], // separator which is used to concat the fields values. separator: '|' }, type: 'object', properties: { id: { type: 'string', maxLength: 100 // <- the primary key must have set maxLength }, firstName: { type: 'string' }, lastName: { type: 'string' } }, required: [ 'id', 'firstName', 'lastName' ] }; You can then find a document by using the relevant parts to create the composite primaryKey: // inserting with composite primary await myRxCollection.insert({ // id, <- do not set the id, it will be filled by RxDB firstName: 'foo', lastName: 'bar' }); // find by composite primary const id = myRxCollection.schema.getPrimaryOfDocumentData({ firstName: 'foo', lastName: 'bar' }); const myRxDocument = myRxCollection.findOne(id).exec(); ","version":"Next","tagName":"h3"},{"title":"Indexes​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#indexes","content":" RxDB supports secondary indexes which are defined at the schema-level of the collection. Index is only allowed on field types string, integer and number. Some RxStorages allow to use boolean fields as index. Depending on the field type, you must have set some meta attributes like maxLength or minimum. This is required so that RxDB is able to know the maximum string representation length of a field, which is needed to craft custom indexes on several RxStorage implementations. note RxDB will always append the primaryKey to all indexes to ensure a deterministic sort order of query results. You do not have to add the primaryKey to any index. ","version":"Next","tagName":"h2"},{"title":"Index-example​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#index-example","content":" const schemaWithIndexes = { version: 0, title: 'human schema with indexes', keyCompression: true, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 // <- the primary key must have set maxLength }, firstName: { type: 'string', maxLength: 100 // <- string-fields that are used as an index, must have set maxLength. }, lastName: { type: 'string' }, active: { type: 'boolean' }, familyName: { type: 'string' }, balance: { type: 'number', // number fields that are used in an index, must have set minimum, maximum and multipleOf minimum: 0, maximum: 100000, multipleOf: 0.01 }, creditCards: { type: 'array', items: { type: 'object', properties: { cvc: { type: 'number' } } } } }, required: [ 'id', 'active' // <- boolean fields that are used in an index, must be required. ], indexes: [ 'firstName', // <- this will create a simple index for the `firstName` field ['active', 'firstName'], // <- this will create a compound-index for these two fields 'active' ] }; internalIndexes When you use RxDB on the server-side, you might want to use internalIndexes to speed up internal queries. Read more ","version":"Next","tagName":"h3"},{"title":"attachments​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#attachments","content":" To use attachments in the collection, you have to add the attachments-attribute to the schema. See RxAttachment. ","version":"Next","tagName":"h2"},{"title":"default​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#default","content":" Default values can only be defined for first-level fields. Whenever you insert a document unset fields will be filled with default-values. const schemaWithDefaultAge = { version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 // <- the primary key must have set maxLength }, firstName: { type: 'string' }, lastName: { type: 'string' }, age: { type: 'integer', default: 20 // <- default will be used } }, required: ['id'] }; ","version":"Next","tagName":"h2"},{"title":"final​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#final","content":" By setting a field to final, you make sure it cannot be modified later. Final fields are always required. Final fields cannot be observed because they will not change. Advantages: With final fields you can ensure that no-one accidentally modifies the data.When you enable the eventReduce algorithm, some performance-improvements are done. const schemaWithFinalAge = { version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 // <- the primary key must have set maxLength }, firstName: { type: 'string' }, lastName: { type: 'string' }, age: { type: 'integer', final: true } }, required: ['id'] }; ","version":"Next","tagName":"h2"},{"title":"Non allowed properties​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#non-allowed-properties","content":" The schema is not only used to validate objects before they are written into the database, but also used to map getters to observe and populate single fieldnames, keycompression and other things. Therefore you can not use every schema which would be valid for the spec of json-schema.org. For example, fieldnames must match the regex ^[a-zA-Z][[a-zA-Z0-9_]*]?[a-zA-Z0-9]$ and additionalProperties is always set to false. But don't worry, RxDB will instantly throw an error when you pass an invalid schema into it. Also the following class properties of RxDocument cannot be used as top level fields because they would clash when the RxDocument property is accessed: [ "collection", "_data", "_propertyCache", "isInstanceOfRxDocument", "primaryPath", "primary", "revision", "deleted$", "deleted$$", "deleted", "getLatest", "$", "$$", "get$", "get$$", "populate", "get", "toJSON", "toMutableJSON", "update", "incrementalUpdate", "updateCRDT", "putAttachment", "putAttachmentBase64", "getAttachment", "allAttachments", "allAttachments$", "modify", "incrementalModify", "patch", "incrementalPatch", "_saveData", "remove", "incrementalRemove", "close", "deleted", "synced" ] ","version":"Next","tagName":"h2"},{"title":"FAQ​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#faq","content":" How can I store a Date? With RxDB you can only store plain JSON data inside of a document. You cannot store a JavaScript new Date() instance directly. This is for performance reasons and because Date() is a mutable thing where changing it at any time might cause strange problem that are hard to debug. To store a date in RxDB, you have to define a string field with a format attribute: { "type": "string", "format": "date-time" } When storing the data you have to first transform your Date object into a string Date.toISOString(). Because the date-time is sortable, you can do whatever query operations on that field and even use it as an index. How to store schemaless data? By design, RxDB requires that every collection has a schema. This means you cannot create a truly "schema-less" collection where top-level fields are unknown at schema creation time. RxDB must know about all fields of a document at the top level to perform validation, index creation, and other internal optimizations. However, there is a way to store data of arbitrary structure at sub-fields. To do this, define a property with type: "object" in your schema. For example: { "version": 0, "primaryKey": "id", "type": "object", "properties": { "id": { "type": "string", "maxLength": 100 }, "myDynamicData": { "type": "object" // Here you can store any JSON data // because it's an open object. } }, "required": ["id"] } Why does RxDB automatically set additionalProperties: false at the top level RxDB automatically sets additionalProperties: false at the top level of a schema to ensure that all top-level fields are known in advance. This design choice offers several benefits: Prevents collisions with RxDocument class properties: RxDB documents have built-in class methods (e.g., .toJSON, .save) at the top level. By forbidding unknown top-level properties, we avoid accidental naming collisions with these built-in methods. Avoids conflicts with user-defined ORM functions: Developers can add custom ORM methods to RxDocuments. If top-level properties were unbounded, a property name could accidentally conflict with a method name, leading to unexpected behavior. Improves TypeScript typings: If RxDB didn't know about all top-level fields, the document type would effectively become any. That means a simple typo like myDocument.toJOSN() would only be caught at runtime, not at build time. By disallowing unknown properties, TypeScript can provide strict typing and catch errors sooner. Can't change the schema of a collection When you make changes to the schema of a collection, you sometimes can get an error likeError: addCollections(): another instance created this collection with a different schema. This means you have created a collection before and added document-data to it. When you now just change the schema, it is likely that the new schema does not match the saved documents inside of the collection. This would cause strange bugs and would be hard to debug, so RxDB check's if your schema has changed and throws an error. To change the schema in production-mode, do the following steps: Increase the version by 1Add the appropriate migrationStrategies so the saved data will be modified to match the new schema In development-mode, the schema-change can be simplified by one of these strategies: Use the memory-storage so your db resets on restart and your schema is not saved permanentlyCall removeRxDatabase('mydatabasename', RxStorage); before creating a new RxDatabase-instanceAdd a timestamp as suffix to the database-name to create a new one each run like name: 'heroesDB' + new Date().getTime() ","version":"Next","tagName":"h2"},{"title":"Scaling the RxServer","type":0,"sectionRef":"#","url":"/rx-server-scaling.html","content":"","keywords":"","version":"Next"},{"title":"Vertical Scaling​","type":1,"pageTitle":"Scaling the RxServer","url":"/rx-server-scaling.html#vertical-scaling","content":" Vertical Scaling aka "scaling up" has the goal to get more power out of a single server by utilizing more of the servers compute. Vertical scaling should be the first step when you decide it is time to scale. ","version":"Next","tagName":"h2"},{"title":"Run multiple JavaScript processes​","type":1,"pageTitle":"Scaling the RxServer","url":"/rx-server-scaling.html#run-multiple-javascript-processes","content":" To utilize more compute power of your server, the first step is to scale vertically by running the RxDB server on multiple processes in parallel. RxDB itself is already build to support multiInstance-usage on the client, like when the user has opened multiple browser tabs at once. The same method works also on the server side in Node.js. You can spawn multiple JavaScript processes that use the same RxDatabase and the instances will automatically communicate with each other and distribute their data and events with the BroadcastChannel. By default the multiInstance param is set to true when calling createRxDatabase(), so you do not have to change anything. To make all processes accessible through the same endpoint, you can put a load-balancer like nginx in front of them. ","version":"Next","tagName":"h3"},{"title":"Using workers to split up the load​","type":1,"pageTitle":"Scaling the RxServer","url":"/rx-server-scaling.html#using-workers-to-split-up-the-load","content":" Another way to increases the server capacity is to put the storage into a Worker thread so that the "main" thread with the webserver can handle more requests. This might be easier to set up compared to using multiple JavaScript processes and a load balancer. ","version":"Next","tagName":"h3"},{"title":"Use an in-memory storage at the user facing level​","type":1,"pageTitle":"Scaling the RxServer","url":"/rx-server-scaling.html#use-an-in-memory-storage-at-the-user-facing-level","content":" Another way to serve more requests to your end users, is to use an in-memory storage that has the best read- and write performance. It outperforms persistent storages by a factor of 10x. So instead of directly serving requests from the persistence layer, you add an in-memory layer on top of that. You could either do a replication from your memory database to the persistent one, or you use the memory mapped storage which has this build in. import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; import { replicateRxCollection } from 'rxdb/plugins/replication'; import { getRxStorageFilesystemNode } from 'rxdb-premium/plugins/storage-filesystem-node'; import { getMemoryMappedRxStorage } from 'rxdb-premium/plugins/storage-memory-mapped'; const myRxDatabase = await createRxDatabase({ name: 'mydb', storage: getMemoryMappedRxStorage({ storage: getRxStorageFilesystemNode({ basePath: path.join(__dirname, 'my-database-folder') }) }) }); await myDatabase.addCollections({/* ... */}); const myServer = await startRxServer({ database: myRxDatabase, port: 443 }); But notice that you have to check your persistence requirements. When a write happens to the memory layer and the server crashes while it has not persisted, in rare cases the write operation might get lost. You can remove that risk by setting awaitWritePersistence: true on the memory mapped storage settings. ","version":"Next","tagName":"h3"},{"title":"Horizontal Scaling​","type":1,"pageTitle":"Scaling the RxServer","url":"/rx-server-scaling.html#horizontal-scaling","content":" To scale the RxDB Server above a single physical hardware unit, there are different solutions where the decision depends on the exact use case. ","version":"Next","tagName":"h2"},{"title":"Single Datastore with multiple branches​","type":1,"pageTitle":"Scaling the RxServer","url":"/rx-server-scaling.html#single-datastore-with-multiple-branches","content":" The most common way to use multiple servers with RxDB is to split up the server into a tree with a root "datastore" and multiple "branches". The datastore contains the persisted data and only servers as a replication endpoint for the branches. The branches themself will replicate data to and from the datastore and server requests to the end users. This is mostly useful on read-heavy applications because reads will directly run on the branches without ever reaching the main datastore and you can always add more branches to scale up. Even adding additional layers of "datastores" is possible so the tree can grow (or shrink) with the demand. ","version":"Next","tagName":"h3"},{"title":"Moving the branches to \"the edge\"​","type":1,"pageTitle":"Scaling the RxServer","url":"/rx-server-scaling.html#moving-the-branches-to-the-edge","content":" Instead of running the "branches" of the tree on the same physical location as the datastore, it often makes sense to move the branches into a datacenter near the end users. Because the RxDB replication algorithm is made to work with slow and even partially offline users, using it for physically separated servers will work the same way. Latency is not that important because writes and reads will not decrease performance by blocking each other and the replication can run in the background without blocking other servers during transaction. ","version":"Next","tagName":"h3"},{"title":"Replicate Databases for Microservices​","type":1,"pageTitle":"Scaling the RxServer","url":"/rx-server-scaling.html#replicate-databases-for-microservices","content":" If your application is build with a microservice architecture and your microservices are also build in Node.js, you can scale the database horizontally by moving the database into the microservices and use the RxDB replication to do a realtime sync between the microservices and a main "datastore" server. The "datastore" server would then only handle the replication requests or do some additional things like logging or backups. The compute for reads and writes will then mainly be done on the microservices themself. This simplifies setting up more and more microservices without decreasing the performance of the whole system. ","version":"Next","tagName":"h3"},{"title":"Use a self-scaling RxStorage​","type":1,"pageTitle":"Scaling the RxServer","url":"/rx-server-scaling.html#use-a-self-scaling-rxstorage","content":" An alternative to scaling up the RxDB servers themself, you can also switch to a RxStorage which scales up internally. For example the FoundationDB storage or MongoDB can work on top of a cluster that can increase load by adding more servers to itself. With that you can always add more Node.js RxDB processes that connect to the same cluster and server requests from it. ","version":"Next","tagName":"h3"},{"title":"RxDB Server","type":0,"sectionRef":"#","url":"/rx-server.html","content":"","keywords":"","version":"Next"},{"title":"Starting a RxServer​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#starting-a-rxserver","content":" To create an RxServer, you have to install the rxdb-server package with npm install rxdb-server --save and then you can import the createRxServer() function and create a server on a given RxDatabase and adapter. After adding the endpoints to the server, do not forget to call myServer.start() to start the actually http-server. import { createRxServer } from 'rxdb-server/plugins/server'; /** * We use the express adapter which is the one that comes with RxDB core * Make sure you have express installed in the correct version! * @see https://github.com/pubkey/rxdb-server/blob/master/package.json */ import { RxServerAdapterExpress } from 'rxdb-server/plugins/adapter-express'; const myServer = await createRxServer({ database: myRxDatabase, adapter: RxServerAdapterExpress, port: 443 }); // add endpoints here (see below) // after adding the endpoints, start the server await myServer.start(); ","version":"Next","tagName":"h2"},{"title":"Using RxServer with Fastify​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#using-rxserver-with-fastify","content":" There is also a RxDB Premium 👑 adapter to use the RxServer with Fastify instead of express. Fastify has shown to have better performance and in general is more modern. import { createRxServer } from 'rxdb-server/plugins/server'; import { RxServerAdapterFastify } from 'rxdb-premium/plugins/server-adapter-fastify'; const myServer = await createRxServer({ database: myRxDatabase, adapter: RxServerAdapterFastify, port: 443 }); await myServer.start(); ","version":"Next","tagName":"h3"},{"title":"Using RxServer with Koa​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#using-rxserver-with-koa","content":" There is also a RxDB Premium 👑 adapter to use the RxServer with Koa instead of express. Koa has shown to have better performance compared to express. import { createRxServer } from 'rxdb-server/plugins/server'; import { RxServerAdapterKoa } from 'rxdb-premium/plugins/server-adapter-koa'; const myServer = await createRxServer({ database: myRxDatabase, adapter: RxServerAdapterKoa, port: 443 }); await myServer.start(); ","version":"Next","tagName":"h3"},{"title":"RxServer Endpoints​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#rxserver-endpoints","content":" On top of the RxServer you can add different types of endpoints. An endpoint is always connected to exactly one RxCollection and it only serves data from that single collection. For now there are only two endpoints implemented, the replication endpoint and the REST endpoint. Others will be added in the future. An endpoint is added to the server by calling the add endpoint method like myRxServer.addReplicationEndpoint(). Each needs a different name string as input which will define the resulting endpoint url. The endpoint urls is a combination of the given name and schema version of the collection, like /my-endpoint/0. const myEndpoint = server.addReplicationEndpoint({ name: 'my-endpoint', collection: myServerCollection }); console.log(myEndpoint.urlPath) // > 'my-endpoint/0' Notice that it is not required that the server side schema version is equal to the client side schema version. You might want to change server schemas more often and then only do a migration on the server, not on the clients. ","version":"Next","tagName":"h2"},{"title":"Replication Endpoint​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#replication-endpoint","content":" The replication endpoint allows clients that connect to it to replicate data with the server via the RxDB Sync Engine. There is also the Replication Server plugin that is used on the client side to connect to the endpoint. The endpoint is added to the server with the addReplicationEndpoint() method. It requires a specific collection and the endpoint will only provided replication for documents inside of that collection. // > server.ts const endpoint = server.addReplicationEndpoint({ name: 'my-endpoint', collection: myServerCollection }); Then you can start the Server Replication on the client: // > client.ts const replicationState = await replicateServer({ collection: usersCollection, replicationIdentifier: 'my-server-replication', url: 'http://localhost:80/my-endpoint/0', push: {}, pull: {} }); ","version":"Next","tagName":"h2"},{"title":"REST endpoint​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#rest-endpoint","content":" The REST endpoint exposes various methods to access the data from the RxServer with non-RxDB tools via plain HTTP operations. You can use it to connect apps that are programmed in different programming languages than JavaScript or to access data from other third party tools. Creating a REST endpoint on a RxServer: const endpoint = await server.addRestEndpoint({ name: 'my-endpoint', collection: myServerCollection }); // plain http request with fetch const request = await fetch('http://localhost:80/' + endpoint.urlPath + '/query', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify({ selector: {} }) }); const response = await request.json(); There is also the client-rest plugin that provides type-save interactions with the REST endpoint: // using the client (optional) import { createRestClient } from 'rxdb-server/plugins/client-rest'; const client = createRestClient('http://localhost:80/' + endpoint.urlPath, {/* headers */}); const response = await client.query({ selector: {} }); The REST endpoint exposes the following paths: query [POST]: Fetch the results of a NoSQL query.query/observe [GET]: Observe a query's results via Server Send Events.get [POST]: Fetch multiple documents by their primary key.set [POST]: Write multiple documents at once.delete [POST]: Delete multiple documents by their primary key. ","version":"Next","tagName":"h2"},{"title":"CORS​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#cors","content":" When creating a server or adding endpoints, you can specify a CORS string. Endpoint cors always overwrite server cors. The default is the wildcard * which allows all requests. const myServer = await startRxServer({ database: myRxDatabase, cors: 'http://example.com' port: 443 }); const endpoint = await server.addReplicationEndpoint({ name: 'my-endpoint', collection: myServerCollection, cors: 'http://example.com' }); ","version":"Next","tagName":"h2"},{"title":"Auth handler​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#auth-handler","content":" To authenticate users and to make user-specific data available on server requests, an authHandler must be provided that parses the headers and returns the actual auth data that is used to authenticate the client and in the queryModifier and changeValidator. An auth handler gets the given headers object as input and returns the auth data in the format { data: {}, validUntil: 1706579817126}. The data field can contain any data that can be used afterwards in the queryModifier and changeValidator. The validUntil field contains the unix timestamp in milliseconds at which the authentication is no longer valid and the client will get disconnected. For example your authHandler could get the Authorization header and parse the JSON web token to identify the user and store the user id in the data field for later use. ","version":"Next","tagName":"h2"},{"title":"Query modifier​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#query-modifier","content":" The query modifier is a JavaScript function that is used to restrict which documents a client can fetch or replicate from the server. It gets the auth data and the actual NoSQL query as input parameter and returns a modified NoSQL query that is then used internally by the server. You can pass a different query modifier to each endpoint so that you can have different endpoints for different use cases on the same server. For example you could use a query modifier that get the userId from the auth data and then restricts the query to only return documents that have the same userId set. function myQueryModifier(authData, query) { query.selector.userId = { $eq: authData.data.userid }; return query; } const endpoint = await server.addReplicationEndpoint({ name: 'my-endpoint', collection: myServerCollection, queryModifier: myQueryModifier }); The RxServer will use the queryModifier at many places internally to determine which queries to run or if a document is allowed to be seen/edited by a client. note For performance reasons the queryModifier and changeValidatorMUST NOT be async and return a promise. If you need async data to run them, you should gather that data in the RxServerAuthHandler and store it in the auth data to access it later. ","version":"Next","tagName":"h2"},{"title":"Change validator​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#change-validator","content":" The change validator is a JavaScript function that is used to restrict which document writes are allowed to be done by a client. For example you could restrict clients to only change specific document fields or to not do any document writes at all. It can also be used to validate change document data before storing it at the server. In this example we restrict clients from doing inserts and only allow updates. For that we check if the change contains an assumedMasterState property and return false to block the write. function myChangeValidator(authData, change) { if(change.assumedMasterState) { return false; } else { return true; } } const endpoint = await server.addReplicationEndpoint({ name: 'my-endpoint', collection: myServerCollection, changeValidator: myChangeValidator }); ","version":"Next","tagName":"h2"},{"title":"Server-only indexes​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#server-only-indexes","content":" Normal RxDB schema indexes get the _deleted field prepended because all RxQueries automatically only search for documents with _deleted=false. When you use RxDB on a server, this might not be optimal because there can be the need to query for documents where the value of _deleted does not matter. Mostly this is required in the pull.stream$ of a replication when a queryModifier is used to add an additional field to the query. To set indexes without _deleted, you can use the internalIndexes field of the schema like the following: { "version": 0, "primaryKey": "id", "type": "object", "properties": { "id": { "type": "string", "maxLength": 100 }, "name": { "type": "string", "maxLength": 100 } }, "internalIndexes": [ ["name", "id"] ] } note Indexes come with a performance burden. You should only use the indexes you need and make sure you do not accidentally set the internalIndexes in your client side RxCollections. ","version":"Next","tagName":"h2"},{"title":"Server-only fields​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#server-only-fields","content":" All endpoints can be created with the serverOnlyFields set which defines some fields to only exist on the server, not on the clients. Clients will not see that fields and cannot do writes where one of the serverOnlyFields is set. Notice that when you use serverOnlyFields you likely need to have a different schema on the server than the schema that is used on the clients. const endpoint = await server.addReplicationEndpoint({ name: 'my-endpoint', collection: col, // here the field 'my-secretss' is defined to be server-only serverOnlyFields: ['my-secrets'] }); note For performance reasons, only top-level fields can be used as serverOnlyFields. Otherwise the server would have to deep-clone all document data which is too expensive. ","version":"Next","tagName":"h2"},{"title":"Readonly fields​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#readonly-fields","content":" When you have fields that should only be modified by the server, but not by the client, you can ensure that by comparing the fields value in the changeValidator. const myChangeValidator = function(authData, change){ if(change.newDocumentState.myReadonlyField !== change.assumedMasterState.myReadonlyField){ throw new Error('myReadonlyField is readonly'); } } ","version":"Next","tagName":"h2"},{"title":"$regex queries not allowed​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#regex-queries-not-allowed","content":" $regex queries are not allowed to run at the server to prevent ReDos Attacks. ","version":"Next","tagName":"h2"},{"title":"Conflict handling​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#conflict-handling","content":" To detect and handle conflicts, the conflict handler from the endpoints RxCollection is used. ","version":"Next","tagName":"h2"},{"title":"FAQ​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#faq","content":" Why are the server plugins in a different github repo and npm package? The RxServer and its other plugins are in a different github repository because: It has too many dependencies that you do not want to install if you only use RxDB at the client side It has a different license (SSPL) to prevent large cloud vendors from "stealing" the revenue, similar to MongoDB's license. Why can't endpoints be added dynamically? After RxServer.start() is called, you can no longer add endpoints. This is because many of the supported server libraries do not allow dynamic routing for performance and security reasons. ","version":"Next","tagName":"h2"},{"title":"RxState - Reactive Persistent State with RxDB","type":0,"sectionRef":"#","url":"/rx-state.html","content":"","keywords":"","version":"Next"},{"title":"Creating a RxState​","type":1,"pageTitle":"RxState - Reactive Persistent State with RxDB","url":"/rx-state.html#creating-a-rxstate","content":" A RxState instance is created on top of a RxDatabase. The state will automatically be persisted with the storage that was used when setting up the RxDatabase. To use it you first have to import the RxDBStatePlugin and add it to RxDB with addRxPlugin(). To create a state call the addState() method on the database instance. Calling addState multiple times will automatically de-duplicated and only create a single RxState object. import { createRxDatabase, addRxPlugin } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; // first add the RxState plugin to RxDB import { RxDBStatePlugin } from 'rxdb/plugins/state'; addRxPlugin(RxDBStatePlugin); const database = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage(), }); // create a state instance const myState = await database.addState(); // you can also create states with a given namespace const myChildState = await database.addState('myNamepsace'); ","version":"Next","tagName":"h2"},{"title":"Writing data and Persistence​","type":1,"pageTitle":"RxState - Reactive Persistent State with RxDB","url":"/rx-state.html#writing-data-and-persistence","content":" Writing data to the state happen by a so called modifier. It is a simple JavaScript function that gets the current value as input and returns the new, modified value. For example to increase the value of myField by one, you would use a modifier that increases the current value: // initially set value to zero await myState.set('myField', v => 0); // increase value by one await myState.set('myField', v => v + 1); // update value to be 42 await myState.set('myField', v => 42); The modifier is used instead of a direct assignment to ensure correct behavior when other JavaScript realms write to the state at the same time, like other browser tabs or webworkers. On conflicts, the modifier will just be run again to ensure deterministic and correct behavior. Therefore mutation is async, you have to await the call to the set function when you care about the moment when the change actually happened. ","version":"Next","tagName":"h2"},{"title":"Get State Data​","type":1,"pageTitle":"RxState - Reactive Persistent State with RxDB","url":"/rx-state.html#get-state-data","content":" The state stored inside of a RxState instance can be seen as a big single JSON object that contains all data. You can fetch the whole object or partially get a single properties or nested ones. Fetching data can either happen with the .get() method or by accessing the field directly like myRxState.myField. // get root state data const val = myState.get(); // get single property const val = myState.get('myField'); const val = myState.myField; // get nested property const val = myState.get('myField.childfield'); const val = myState.myField.childfield; // get nested array property const val = myState.get('myArrayField[0].foobar'); const val = myState.myArrayField[0].foobar; ","version":"Next","tagName":"h2"},{"title":"Observability​","type":1,"pageTitle":"RxState - Reactive Persistent State with RxDB","url":"/rx-state.html#observability","content":" Instead of fetching the state once, you can also observe the state with either rxjs observables or custom reactivity handlers like signals or hooks. Rxjs observables can be created by either using the .get$() method or by accessing the top level property suffixed with a dollar sign like myState.myField$. const observable = myState.get$('myField'); const observable = myState.myField$; // then you can subscribe to that observable observable.subscribe(newValue => { // update the UI }); Subscription works across multiple JavaScript realms like browser tabs or Webworkers. ","version":"Next","tagName":"h2"},{"title":"RxState with signals and hooks​","type":1,"pageTitle":"RxState - Reactive Persistent State with RxDB","url":"/rx-state.html#rxstate-with-signals-and-hooks","content":" With the double-dollar sign you can also access custom reactivity instances like signals or hooks. These are easier to use compared to rxjs, depending on which JavaScript framework you are using. For example in angular to use signals, you would first add a reactivity factory to your database and then access the signals of the RxState: import { RxReactivityFactory, createRxDatabase } from 'rxdb/plugins/core'; import { toSignal } from '@angular/core/rxjs-interop'; const reactivityFactory: RxReactivityFactory<ReactivityType> = { fromObservable(obs, initialValue) { return toSignal(obs, { initialValue }); } }; const database = await createRxDatabase({ name: 'mydb', storage: getRxStorageLocalstorage(), reactivity: reactivityFactory }); const myState = await database.addState(); const mySignal = myState.get$$('myField'); const mySignal = myState.myField$$; ","version":"Next","tagName":"h2"},{"title":"Cleanup RxState operations​","type":1,"pageTitle":"RxState - Reactive Persistent State with RxDB","url":"/rx-state.html#cleanup-rxstate-operations","content":" For faster writes, changes to the state are only written as list of operations to disc. After some time you might have too many operations written which would delay the initial state creation. To automatically merge the state operations into a single operation and clear the old operations, you should add the Cleanup Plugin before creating the RxDatabase: import { addRxPlugin } from 'rxdb'; import { RxDBCleanupPlugin } from 'rxdb/plugins/cleanup'; addRxPlugin(RxDBCleanupPlugin); ","version":"Next","tagName":"h2"},{"title":"Correctness over Performance​","type":1,"pageTitle":"RxState - Reactive Persistent State with RxDB","url":"/rx-state.html#correctness-over-performance","content":" RxState is optimized for correctness, not for performance. Compared to other state libraries, RxState directly persists data to storage and ensures write conflicts are handled properly. Other state libraries are handles mainly in-memory and lazily persist to disc without caring about conflicts or multiple browser tabs which can cause problems and hard to reproduce bugs. RxState still uses RxDB which has a range of great performing storages so the write speed is more than sufficient. Also to further improve write performance you can use more RxState instances (with an different namespace) to split writes across multiple storage instances. Reads happen directly in-memory which makes RxState read performance comparable to other state libraries. ","version":"Next","tagName":"h2"},{"title":"RxState Replication​","type":1,"pageTitle":"RxState - Reactive Persistent State with RxDB","url":"/rx-state.html#rxstate-replication","content":" Because the state data is stored inside of an internal RxCollection you can easily use the RxDB Replication to sync data between users or devices of the same user. For example with the P2P WebRTC replication you can start the replication on the collection and automatically sync the RxState operations between users directly: import { replicateWebRTC, getConnectionHandlerSimplePeer } from 'rxdb/plugins/replication-webrtc'; const database = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage(), }); const myState = await database.addState(); const replicationPool = await replicateWebRTC( { collection: myState.collection, topic: 'my-state-replication-pool', connectionHandlerCreator: getConnectionHandlerSimplePeer({}), pull: {}, push: {} } ); ","version":"Next","tagName":"h2"},{"title":"RxDB Database on top of Deno Key Value Store","type":0,"sectionRef":"#","url":"/rx-storage-denokv.html","content":"","keywords":"","version":"Next"},{"title":"What is DenoKV​","type":1,"pageTitle":"RxDB Database on top of Deno Key Value Store","url":"/rx-storage-denokv.html#what-is-denokv","content":" DenoKV is a strongly consistent key-value storage, globally replicated for low-latency reads across 35 worldwide regions via Deno Deploy. When you release your Deno application on Deno Deploy, it will start a instance on each of the 35 worldwide regions. This edge deployment guarantees minimal latency when serving requests to end users devices around the world. DenoKV is a shared storage which shares its state across all instances. But, because DenoKV is "only" a Key-Value storage, it only supports basic CRUD operations on datasets and indexes. Complex features like queries, encryption, compression or client-server replication, are missing. Using RxDB on top of DenoKV fills this gap and makes it easy to build realtime offline-first application on top of Deno backend. ","version":"Next","tagName":"h2"},{"title":"Use cases​","type":1,"pageTitle":"RxDB Database on top of Deno Key Value Store","url":"/rx-storage-denokv.html#use-cases","content":" Using RxDB-DenoKV instead of plain DenoKV, can have a wide range of benefits depending on your use case. Reduce vendor lock-in: RxDB has a swappable storage layer which allows you to swap out the underlying storage of your database. If you ever decide to move away from DenoDeploy or Deno at all, you do not have to refactor your whole application and instead just swap the storage plugin. For example if you decide migrate to Node.js, you can use the FoundationDB RxStorage and store your data there. DenoKV is also implemented on top of FoundationDB so you can get similar performance. Alternatively RxDB supports a wide range of storage plugins you can decide from. Add reactiveness: DenoKV is a plain request-response datastore. While it supports observation of single rows by id, it does not allow to observe row-ranges or events. This makes it hard to impossible to build realtime applications with it because polling would be the only way to watch ranges of key-value pairs. With RxDB on top of DenoKV, changes to the database are shared between DenoDeploy instances so when you observe a query you can be sure that it is always up to date, no matter which instance has changed the document. Internally RxDB uses the Deno BroadcastChannel API to share events between instances. Reuse Client and Server Code: When you use RxDB on the server and on the client side, many parts of your code can be reused on both sides which decreases development time significantly. Replicate from DenoKV to a local RxDB state: Instead of running all operations against the global DenoKV, you can run a realtime-replication between a DenoKV-RxDatabase and a locally stored dataset or maybe even an in-memory stored one. This improves query performance and can reduce your Deno Deploy cloud costs because less operations run against the DenoKV, they only locally instead. Replicate with other backends: The RxDB Sync Engine is pretty simple and allows you to easily build a replication with any backend architecture. For example if you already have your data stored in a self-hosted MySQL server, you can use RxDB to do a realtime replication of that data into a DenoKV RxDatabase instance. RxDB also has many plugins for replication with backend/protocols like GraphQL, Websocket, CouchDB, WebRTC, Firestore and NATS. ","version":"Next","tagName":"h2"},{"title":"Using the DenoKV RxStorage​","type":1,"pageTitle":"RxDB Database on top of Deno Key Value Store","url":"/rx-storage-denokv.html#using-the-denokv-rxstorage","content":" To use the DenoKV RxStorage with RxDB, you import the getRxStorageDenoKV function from the plugin and set it as storage when calling createRxDatabase import { createRxDatabase } from 'rxdb'; import { getRxStorageDenoKV } from 'rxdb/plugins/storage-denokv'; const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: getRxStorageDenoKV({ /** * Consistency level, either 'strong' or 'eventual' * (Optional) default='strong' */ consistencyLevel: 'strong', /** * Path which is used in the first argument of Deno.openKv(settings.openKvPath) * (Optional) default='' */ openKvPath: './foobar', /** * Some operations have to run in batches, * you can test different batch sizes to improve performance. * (Optional) default=100 */ batchSize: number }) }); On top of that RxDatabase you can then create your collections and run operations. Follow the quickstart to learn more about how to use RxDB. ","version":"Next","tagName":"h2"},{"title":"Using non-DenoKV storages in Deno​","type":1,"pageTitle":"RxDB Database on top of Deno Key Value Store","url":"/rx-storage-denokv.html#using-non-denokv-storages-in-deno","content":" When you use other storages than the DenoKV storage inside of a Deno app, make sure you set multiInstance: false when creating the database. Also you should only run one process per Deno-Deploy instance. This ensures your events are not mixed up by the BroadcastChannel across instances which would lead to wrong behavior. // DenoKV based database const db = await createRxDatabase({ name: 'denokvdatabase', storage: getRxStorageDenoKV(), /** * Use multiInstance: true so that the Deno Broadcast Channel * emits event across DenoDeploy instances * (true is also the default, so you can skip this setting) */ multiInstance: true }); // Non-DenoKV based database const db = await createRxDatabase({ name: 'denokvdatabase', storage: getRxStorageFilesystemNode(), /** * Use multiInstance: false so that it does not share events * across instances because the stored data is anyway not shared * between them. */ multiInstance: false }); ","version":"Next","tagName":"h2"},{"title":"Filesystem Node RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-filesystem-node.html","content":"","keywords":"","version":"Next"},{"title":"Pros​","type":1,"pageTitle":"Filesystem Node RxStorage","url":"/rx-storage-filesystem-node.html#pros","content":" Easier setup compared to SQLiteFast ","version":"Next","tagName":"h3"},{"title":"Cons​","type":1,"pageTitle":"Filesystem Node RxStorage","url":"/rx-storage-filesystem-node.html#cons","content":" It is part of the RxDB Premium 👑 plugin that must be purchased. ","version":"Next","tagName":"h3"},{"title":"Usage​","type":1,"pageTitle":"Filesystem Node RxStorage","url":"/rx-storage-filesystem-node.html#usage","content":" import { createRxDatabase } from 'rxdb'; import { getRxStorageFilesystemNode } from 'rxdb-premium/plugins/storage-filesystem-node'; const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: getRxStorageFilesystemNode({ basePath: path.join(__dirname, 'my-database-folder'), /** * Set inWorker=true if you use this RxStorage * together with the WebWorker plugin. */ inWorker: false }) }); /* ... */ ","version":"Next","tagName":"h2"},{"title":"RxDB Database on top of FoundationDB","type":0,"sectionRef":"#","url":"/rx-storage-foundationdb.html","content":"","keywords":"","version":"Next"},{"title":"Features of RxDB+FoundationDB​","type":1,"pageTitle":"RxDB Database on top of FoundationDB","url":"/rx-storage-foundationdb.html#features-of-rxdbfoundationdb","content":" Using RxDB on top of FoundationDB, gives you many benefits compare to using the plain FoundationDB API: Indexes: In RxDB with a FoundationDB storage layer, indexes are used to optimize query performance, allowing for fast and efficient data retrieval even in large datasets. You can define single and compound indexes with the RxDB schema.Schema Based Data Model: Utilizing a jsonschema based data model, the system offers a highly structured and versatile approach to organizing and validating data, ensuring consistency and clarity in database interactions.Complex Queries: The system supports complex NoSQL queries, allowing for advanced data manipulation and retrieval, tailored to specific needs and intricate data relationships. For example you can do $regex or $or queries which is hardy possible with the plain key-value access of FoundationDB.Observable Queries & Documents: RxDB's observable queries and documents feature ensures real-time updates and synchronization, providing dynamic and responsive data interactions in applications.Compression: RxDB employs data compression techniques to reduce storage requirements and enhance transmission efficiency, making it more cost-effective and faster, especially for large volumes of data. You can compress the NoSQL document data, but also the binary attachments data.Attachments: RxDB supports the storage and management of attachments which allowing for the seamless inclusion of binary data like images or documents alongside structured data within the database. ","version":"Next","tagName":"h2"},{"title":"Installation​","type":1,"pageTitle":"RxDB Database on top of FoundationDB","url":"/rx-storage-foundationdb.html#installation","content":" Install the FoundationDB client cli which is used to communicate with the FoundationDB cluster.Install the FoundationDB node bindings npm module via npm install foundationdb. This will install v2.x.x, which is only compatible with FoundationDB server and client v7.3.x (which is the only version currently maintained by the FoundationDB team). If you need to use an older version (e.g. 7.1.x or 6.3.x), you should run npm install foundationdb@1.1.4 (though this might only work with v6.3.x).Due to an outstanding bug in node foundationdb, you will need to specify an apiVersion of 720 even though you are using 730. When this PR is merged, you will be able to use 730. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"RxDB Database on top of FoundationDB","url":"/rx-storage-foundationdb.html#usage","content":" import { createRxDatabase } from 'rxdb'; import { getRxStorageFoundationDB } from 'rxdb/plugins/storage-foundationdb'; const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageFoundationDB({ /** * Version of the API of the FoundationDB cluster.. * FoundationDB is backwards compatible across a wide range of versions, * so you have to specify the api version. * If in doubt, set it to 720. */ apiVersion: 720, /** * Path to the FoundationDB cluster file. * (optional) * If in doubt, leave this empty to use the default location. */ clusterFile: '/path/to/fdb.cluster', /** * Amount of documents to be fetched in batch requests. * You can change this to improve performance depending on * your database access patterns. * (optional) * [default=50] */ batchSize: 50 }) }); ","version":"Next","tagName":"h2"},{"title":"Multi Instance​","type":1,"pageTitle":"RxDB Database on top of FoundationDB","url":"/rx-storage-foundationdb.html#multi-instance","content":" Because FoundationDB does not offer a changestream, it is not possible to use the same cluster from more than one Node.js process at the same time. For example you cannot spin up multiple servers with RxDB databases that all use the same cluster. There might be workarounds to create something like a FoundationDB changestream and you can make a Pull Request if you need that feature. ","version":"Next","tagName":"h2"},{"title":"IndexedDB RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-indexeddb.html","content":"","keywords":"","version":"Next"},{"title":"IndexedDB performance comparison​","type":1,"pageTitle":"IndexedDB RxStorage","url":"/rx-storage-indexeddb.html#indexeddb-performance-comparison","content":" Here is some performance comparison with other storages. Compared to the non-memory storages like OPFS and WASM SQLite. IndexedDB has the smallest build size and fastest write speed. Only OPFS is faster on queries over big datasets. See performance comparison page for a comparison with all storages. ","version":"Next","tagName":"h2"},{"title":"Using the IndexedDB RxStorage​","type":1,"pageTitle":"IndexedDB RxStorage","url":"/rx-storage-indexeddb.html#using-the-indexeddb-rxstorage","content":" To use the indexedDB storage you import it from the RxDB Premium 👑 npm module and use getRxStorageIndexedDB() when creating the RxDatabase. import { createRxDatabase } from 'rxdb'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageIndexedDB({ /** * For better performance, queries run with a batched cursor. * You can change the batchSize to optimize the query time * for specific queries. * You should only change this value when you are also doing performance measurements. * [default=300] */ batchSize: 300 }) }); ","version":"Next","tagName":"h2"},{"title":"Overwrite/Polyfill the native IndexedDB​","type":1,"pageTitle":"IndexedDB RxStorage","url":"/rx-storage-indexeddb.html#overwritepolyfill-the-native-indexeddb","content":" Node.js has no IndexedDB API. To still run the IndexedDB RxStorage in Node.js, for example to run unit tests, you have to polyfill it. You can do that by using the fake-indexeddb module and pass it to the getRxStorageIndexedDB() function. import { createRxDatabase } from 'rxdb'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; //> npm install fake-indexeddb --save const fakeIndexedDB = require('fake-indexeddb'); const fakeIDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange'); const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageIndexedDB({ indexedDB: fakeIndexedDB, IDBKeyRange: fakeIDBKeyRange }) }); ","version":"Next","tagName":"h2"},{"title":"Storage Buckets​","type":1,"pageTitle":"IndexedDB RxStorage","url":"/rx-storage-indexeddb.html#storage-buckets","content":" The Storage Buckets API provides a way for sites to organize locally stored data into groupings called "storage buckets". This allows the user agent or sites to manage and delete buckets independently rather than applying the same treatment to all the data from a single origin. Read More To use different storage buckets with the RxDB IndexedDB Storage, you can use a function instead of a plain object when providing the indexedDB attribute: import { createRxDatabase } from 'rxdb'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageIndexedDB({ indexedDB: async(params) => { const myStorageBucket = await navigator.storageBuckets.open('myApp-' + params.databaseName); return myStorageBucket.indexedDB; }, IDBKeyRange }) }); ","version":"Next","tagName":"h2"},{"title":"Limitations of the IndexedDB RxStorage​","type":1,"pageTitle":"IndexedDB RxStorage","url":"/rx-storage-indexeddb.html#limitations-of-the-indexeddb-rxstorage","content":" It is part of the RxDB Premium 👑 plugin that must be purchased. If you just need a storage that works in the browser and you do not have to care about performance, you can use the LocalStorage storage instead.The IndexedDB storage requires support for IndexedDB v2, it does not work on Internet Explorer. ","version":"Next","tagName":"h2"},{"title":"RxStorage Dexie.js","type":0,"sectionRef":"#","url":"/rx-storage-dexie.html","content":"","keywords":"","version":"Next"},{"title":"Dexie.js vs IndexedDB Storage​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#dexiejs-vs-indexeddb-storage","content":" While Dexie.js RxStorage can be used for free, most professional projects should switch to our premium IndexedDB RxStorage 👑 in production: It is faster and reduces build size by up to 36%.It has a way better performance on reads and writes.It stores attachments data as binary instead of base64 which reduces used space by 33%.It does not use a Batched Cursor or custom indexes which makes queries slower compared to the IndexedDB RxStorage.It supports non-required indexes which is not possible with Dexie.js.It runs in a WAL-like mode (similar to SQLite) for faster writes and improved responsiveness.It support the Storage Buckets API ","version":"Next","tagName":"h2"},{"title":"How to use Dexie.js as a Storage for RxDB​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#how-to-use-dexiejs-as-a-storage-for-rxdb","content":" 1 Import the Dexie Storage​ import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; 2 Create a Database​ const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageDexie() }); ","version":"Next","tagName":"h2"},{"title":"Overwrite/Polyfill the native IndexedDB API with an in-memory version​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#overwritepolyfill-the-native-indexeddb-api-with-an-in-memory-version","content":" Node.js has no IndexedDB API. To still run the Dexie RxStorage in Node.js, for example to run unit tests, you have to polyfill it. You can do that by using the fake-indexeddb module and pass it to the getRxStorageDexie() function. import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; //> npm install fake-indexeddb --save const fakeIndexedDB = require('fake-indexeddb'); const fakeIDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange'); const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageDexie({ indexedDB: fakeIndexedDB, IDBKeyRange: fakeIDBKeyRange }) }); ","version":"Next","tagName":"h2"},{"title":"Using Dexie Addons​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#using-dexie-addons","content":" Dexie.js has its own plugin system with many plugins for encryption, replication or other use cases. With the Dexie.js RxStorage you can use the same plugins by passing them to the getRxStorageDexie() function. const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageDexie({ addons: [ /* Your Dexie.js plugins */ ] }) }); ","version":"Next","tagName":"h2"},{"title":"Sync Dexie.js with your Backend in RxDB​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#sync-dexiejs-with-your-backend-in-rxdb","content":" Having your local data in sync with a remote backend is a key feature of RxDB. Here are two approaches to achieve this when using the Dexie.js RxStorage: Dexie Cloud provides a managed solution: For quick setups, letting you rely on its Cloud backend and conflict resolution.RxDB's replication: Offers full control over your backend, data flow, and conflict handling. Choose the approach that best suits your needs - whether you want to get started quickly with Dexie Cloud or require the adaptability and autonomy of RxDB's native replication. ","version":"Next","tagName":"h2"},{"title":"A. Use Dexie Cloud Sync​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#a-use-dexie-cloud-sync","content":" Dexie Cloud is an official SaaS solution provided by the Dexie team. It offers automatic synchronization, user management, and conflict resolution out of the box. The primary benefits are: Automatic Sync: Dexie Cloud keeps your local IndexedDB in sync with its cloud-based backend.User Authentication: Built-in user management (auth, roles, permissions).Conflict Resolution: Automated resolution logic on the server side. 1 Install the Dexie Cloud Addon​ npm install dexie-cloud-addon 2 Import RxDB and dexie-cloud​ import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; import dexieCloud from 'dexie-cloud-addon'; 3 Create a Dexie based RxStorage with the Cloud Plugin​ const storage = getRxStorageDexie({ addons: [dexieCloud], /* * Whenever a new dexie database instance is created, * this method will be called. */ async onCreate(dexieDatabase, dexieDatabaseName) { await dexieDatabase.cloud.configure({ databaseUrl: "https://<yourdatabase>.dexie.cloud", requireAuth: true // optional }); } }); 4 Create an RxDB Database​ const db = await createRxDatabase({ name: 'mydb', storage }); ","version":"Next","tagName":"h3"},{"title":"B. Use the RxDB Replication​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#b-use-the-rxdb-replication","content":" For full flexibility over your backend or conflict resolution strategy, you can use one of RxDB's many replication plugins like CouchDB Replication Plugin: Replicate with a CouchDB ServerGraphQL Replication Plugin: Sync data with any GraphQL endpoint. Useful when you have a custom schema or you want to utilize GraphQL's powerful query features.Custom Replication with REST APIs: Implement your own replication by building a pull/push handler that communicates with any RESTful backend. Below is an example of replicating an RxDB collection with a CouchDB backend using RxDB's CouchDB replication plugin: 1 Import the RxDB with dexie and the CouchDB plugin​ import { replicateCouchDB } from 'rxdb/plugins/replication-couchdb'; import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; import { createRxDatabase } from 'rxdb/plugins/core'; 2 Create an RxDB Database with the Dexie Storage​ const db = await createRxDatabase({ name: 'mydb', storage: getRxStorageDexie() }); 3 Add a Collection​ await db.addCollections({ humans: { schema: { version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string', maxLength: 100 }, name: { type: 'string' }, age: { type: 'number' } }, required: ['id', 'name'] } } }); 4 Sync the Collection with a CouchDB Server​ const replicationState = replicateCouchDB({ replicationIdentifier: 'my-couchdb-replication', collection: db.humans, // The URL to your CouchDB endpoint url: 'http://example.com/db/humans' }); ","version":"Next","tagName":"h3"},{"title":"liveQuery - Realtime Queries​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#livequery---realtime-queries","content":" Dexie.js offers a feature called liveQuery which automatically updates query results as data changes, allowing you to react to these changes in real-time. However, because RxDB intrinsically provides reactive queries, you typically do not need to enable live queries through Dexie. Once you have created your database and collections with RxDB, any query you perform can be observed by subscribing to it, for example via collection.find().$.subscribe(results => { /*... */ }). This means RxDB takes care of listening for changes and automatically emitting new results - ensuring your UI stays in sync with the underlying data without requiring extra plugins or manual polling. ","version":"Next","tagName":"h2"},{"title":"Disabling the non-premium console log​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#disabling-the-non-premium-console-log","content":" We want to be transparent with our community, and you'll notice a console message when using the free Dexie.js based RxStorage implementation. This message serves to inform you about the availability of faster storage solutions within our 👑 Premium Plugins. We understand that this might be a minor inconvenience, and we sincerely apologize for that. However, maintaining and improving RxDB requires substantial resources, and our premium users help us ensure its sustainability. If you find value in RxDB and wish to remove this message, we encourage you to explore our premium storage options, which are optimized for professional use and production environments. Thank you for your understanding and support. If you already have premium access and want to use the Dexie.js RxStorage without the log, you can call the setPremiumFlag() function to disable the log. import { setPremiumFlag } from 'rxdb-premium/plugins/shared'; setPremiumFlag(); ","version":"Next","tagName":"h2"},{"title":"Performance comparison with other RxStorage plugins​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#performance-comparison-with-other-rxstorage-plugins","content":" The performance of the Dexie.js RxStorage is good enough for most use cases but other storages can have way better performance metrics: ","version":"Next","tagName":"h2"},{"title":"RxStorage Localstorage Meta Optimizer","type":0,"sectionRef":"#","url":"/rx-storage-localstorage-meta-optimizer.html","content":"","keywords":"","version":"Next"},{"title":"Usage​","type":1,"pageTitle":"RxStorage Localstorage Meta Optimizer","url":"/rx-storage-localstorage-meta-optimizer.html#usage","content":" The meta optimizer gets wrapped around any other RxStorage. It will than automatically detect if an RxDB internal storage instance is created, and replace that with a localstorage based instance. import { getLocalstorageMetaOptimizerRxStorage } from 'rxdb-premium/plugins/storage-localstorage-meta-optimizer'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; /** * First wrap the original RxStorage with the optimizer. */ const optimizedRxStorage = getLocalstorageMetaOptimizerRxStorage({ /** * Here we use the IndexedDB RxStorage, * it is also possible to use any other RxStorage instead. */ storage: getRxStorageIndexedDB() }); /** * Create the RxDatabase with the wrapped RxStorage. */ const database = await createRxDatabase({ name: 'mydatabase', storage: optimizedRxStorage }); ","version":"Next","tagName":"h2"},{"title":"RxStorage LocalStorage","type":0,"sectionRef":"#","url":"/rx-storage-localstorage.html","content":"","keywords":"","version":"Next"},{"title":"Key Benefits​","type":1,"pageTitle":"RxStorage LocalStorage","url":"/rx-storage-localstorage.html#key-benefits","content":" Simplicity: No complicated configurations or external dependencies - LocalStorage is already built into the browser.Fast for small Datasets: Writing and Reading small sets of data from localStorage is really fast as shown in these benchmarks.Ease of Setup: Just import the plugin, import it, and pass getRxStorageLocalstorage() into createRxDatabase(). That’s it! ","version":"Next","tagName":"h2"},{"title":"Limitations​","type":1,"pageTitle":"RxStorage LocalStorage","url":"/rx-storage-localstorage.html#limitations","content":" While LocalStorage is the easiest way to get started, it does come with some constraints: Limited Storage Capacity: Browsers often limit LocalStorage to around 5 MB per domain, though exact limits vary.Synchronous Access: LocalStorage operations block the main thread. This is usually fine for small amounts of data but can cause performance bottlenecks with heavier use. Despite these limitations, LocalStorage remains a great default option for smaller projects, prototypes, or cases where you need the absolute simplest way to persist data in the browser. ","version":"Next","tagName":"h2"},{"title":"How to use the LocalStorage RxStorage with RxDB​","type":1,"pageTitle":"RxStorage LocalStorage","url":"/rx-storage-localstorage.html#how-to-use-the-localstorage-rxstorage-with-rxdb","content":" 1 Import the Storage​ import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; 2 Create a Database​ const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageLocalstorage() }); 3 Add a Collection​ await db.addCollections({ tasks: { schema: { title: 'tasks schema', version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string' }, title: { type: 'string' }, done: { type: 'boolean' } }, required: ['id', 'title', 'done'] } } }); 4 Insert a document​ await db.tasks.insert({ id: 'task-01', title: 'Get started with RxDB' }); 5 Query documents​ const nonDoneTasks = await db.tasks.find({ selector: { done: { $eq: false } } }).exec(); ","version":"Next","tagName":"h2"},{"title":"Mocking the LocalStorage API for testing in Node.js​","type":1,"pageTitle":"RxStorage LocalStorage","url":"/rx-storage-localstorage.html#mocking-the-localstorage-api-for-testing-in-nodejs","content":" While the localStorage API only exists in browsers, your can the LocalStorage based storage in Node.js by using the mock that comes with RxDB. This is intended to be used in unit tests or other test suites: import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage, getLocalStorageMock } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageLocalstorage({ localStorage: getLocalStorageMock() }) }); ","version":"Next","tagName":"h2"},{"title":"Memory Synced RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-memory-synced.html","content":"","keywords":"","version":"Next"},{"title":"Pros​","type":1,"pageTitle":"Memory Synced RxStorage","url":"/rx-storage-memory-synced.html#pros","content":" Improves read/write performance because these operations run against the in-memory storage.Decreases initial page load because it load all data in a single bulk request. It even detects if the database is used for the first time and then it does not have to await the creation of the persistent storage. ","version":"Next","tagName":"h2"},{"title":"Cons​","type":1,"pageTitle":"Memory Synced RxStorage","url":"/rx-storage-memory-synced.html#cons","content":" It does not support attachments.When the JavaScript process is killed ungracefully like when the browser crashes or the power of the PC is terminated, it might happen that some memory writes are not persisted to the parent storage. This can be prevented with the awaitWritePersistence flag.This can only be used if all data fits into the memory of the JavaScript process. This is normally not a problem because a browser has much memory these days and plain json document data is not that big.Because it has to await an initial replication from the parent storage into the memory, initial page load time can increase when much data is already stored. This is likely not a problem when you store less than 10k documents.The memory-synced storage itself does not support replication and migration. Instead you have to replicate the underlying parent storage.The memory-synced plugin is part of RxDB Premium 👑. It is not part of the default RxDB module. The memory-synced RxStorage was removed in RxDB version 16 The memory-synced was removed in RxDB version 16. Instead consider using the newer and better memory-mapped RxStorage which has better trade-offs and is easier to configure. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Memory Synced RxStorage","url":"/rx-storage-memory-synced.html#usage","content":" import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; import { getMemorySyncedRxStorage } from 'rxdb-premium/plugins/storage-memory-synced'; /** * Here we use the IndexedDB RxStorage as persistence storage. * Any other RxStorage can also be used. */ const parentStorage = getRxStorageIndexedDB(); // wrap the persistent storage with the memory synced one. const storage = getMemorySyncedRxStorage({ storage: parentStorage }); // create the RxDatabase like you would do with any other RxStorage const db = await createRxDatabase({ name: 'myDatabase, storage, }); /** ... **/ ","version":"Next","tagName":"h2"},{"title":"Options​","type":1,"pageTitle":"Memory Synced RxStorage","url":"/rx-storage-memory-synced.html#options","content":" Some options can be provided to fine tune the performance and behavior. import { requestIdlePromise } from 'rxdb'; const storage = getMemorySyncedRxStorage({ storage: parentStorage, /** * Defines how many document * get replicated in a single batch. * [default=50] * * (optional) */ batchSize: 50, /** * By default, the parent storage will be created without indexes for a faster page load. * Indexes are not needed because the queries will anyway run on the memory storage. * You can disable this behavior by setting keepIndexesOnParent to true. * If you use the same parent storage for multiple RxDatabase instances where one is not * a asynced-memory storage, you will get the error: 'schema not equal to existing storage' * if you do not set keepIndexesOnParent to true. * * (optional) */ keepIndexesOnParent: true, /** * If set to true, all write operations will resolve AFTER the writes * have been persisted from the memory to the parentStorage. * This ensures writes are not lost even if the JavaScript process exits * between memory writes and the persistence interval. * default=false */ awaitWritePersistence: true, /** * After a write, await until the return value of this method resolves * before replicating with the master storage. * * By returning requestIdlePromise() we can ensure that the CPU is idle * and no other, more important operation is running. By doing so we can be sure * that the replication does not slow down any rendering of the browser process. * * (optional) */ waitBeforePersist: () => requestIdlePromise(); }); ","version":"Next","tagName":"h2"},{"title":"Replication and Migration with the memory-synced storage​","type":1,"pageTitle":"Memory Synced RxStorage","url":"/rx-storage-memory-synced.html#replication-and-migration-with-the-memory-synced-storage","content":" The memory-synced storage itself does not support replication and migration. Instead you have to replicate the underlying parent storage. For example when you use it on top of an IndexedDB storage, you have to run replication on that storage instead by creating a different RxDatabase. const parentStorage = getRxStorageIndexedDB(); const memorySyncedStorage = getMemorySyncedRxStorage({ storage: parentStorage, keepIndexesOnParent: true }); const databaseName = 'mydata'; /** * Create a parent database with the same name+collections * and use it for replication and migration. * The parent database must be created BEFORE the memory-synced database * to ensure migration has already been run. */ const parentDatabase = await createRxDatabase({ name: databaseName, storage: parentStorage }); await parentDatabase.addCollections(/* ... */); replicateRxCollection({ collection: parentDatabase.myCollection, /* ... */ }); /** * Create an equal memory-synced database with the same name+collections * and use it for writes and queries. */ const memoryDatabase = await createRxDatabase({ name: databaseName, storage: memorySyncedStorage }); await memoryDatabase.addCollections(/* ... */); ","version":"Next","tagName":"h2"},{"title":"Memory RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-memory.html","content":"","keywords":"","version":"Next"},{"title":"Pros​","type":1,"pageTitle":"Memory RxStorage","url":"/rx-storage-memory.html#pros","content":" Really fast. Uses binary search on all operations.Small build size ","version":"Next","tagName":"h3"},{"title":"Cons​","type":1,"pageTitle":"Memory RxStorage","url":"/rx-storage-memory.html#cons","content":" No persistence import { createRxDatabase } from 'rxdb'; import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageMemory() }); ","version":"Next","tagName":"h3"},{"title":"RxStorage LokiJS","type":0,"sectionRef":"#","url":"/rx-storage-lokijs.html","content":"","keywords":"","version":"Next"},{"title":"Pros​","type":1,"pageTitle":"RxStorage LokiJS","url":"/rx-storage-lokijs.html#pros","content":" Queries can run faster because all data is processed in memory.It has a much faster initial load time because it loads all data from IndexedDB in a single request. But this is only true for small datasets. If much data must is stored, the initial load time can be higher than on other RxStorage implementations. ","version":"Next","tagName":"h3"},{"title":"Cons​","type":1,"pageTitle":"RxStorage LokiJS","url":"/rx-storage-lokijs.html#cons","content":" It does not support attachments.Data can be lost when the JavaScript process is killed ungracefully like when the browser crashes or the power of the PC is terminated.All data must fit into the memory.Slow initialisation time when used with multiInstance: true because it has to await the leader election process.Slow initialisation time when really much data is stored inside of the database because it has to parse a big JSON string. ","version":"Next","tagName":"h3"},{"title":"Usage​","type":1,"pageTitle":"RxStorage LokiJS","url":"/rx-storage-lokijs.html#usage","content":" import { createRxDatabase } from 'rxdb'; import { getRxStorageLoki } from 'rxdb/plugins/storage-lokijs'; // in the browser, we want to persist data in IndexedDB, so we use the indexeddb adapter. const LokiIncrementalIndexedDBAdapter = require('lokijs/src/incremental-indexeddb-adapter'); const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageLoki({ adapter: new LokiIncrementalIndexedDBAdapter(), /* * Do not set lokiJS persistence options like autoload and autosave, * RxDB will pick proper defaults based on the given adapter */ }) }); ","version":"Next","tagName":"h2"},{"title":"Adapters​","type":1,"pageTitle":"RxStorage LokiJS","url":"/rx-storage-lokijs.html#adapters","content":" LokiJS is based on adapters that determine where to store persistent data. For LokiJS there are adapters for IndexedDB, AWS S3, the NodeJS filesystem or NativeScript. Find more about the possible adapters at the LokiJS docs. For react native there is also the loki-async-reference-adapter. ","version":"Next","tagName":"h2"},{"title":"Multi-Tab support​","type":1,"pageTitle":"RxStorage LokiJS","url":"/rx-storage-lokijs.html#multi-tab-support","content":" When you use plain LokiJS, you cannot build an app that can be used in multiple browser tabs. The reason is that LokiJS loads data in bulk and then only regularly persists the in-memory state to disc. When opened in multiple tabs, it would happen that the LokiJS instances overwrite each other and data is lost. With the RxDB LokiJS-plugin, this problem is fixed with the LeaderElection module. Between all open tabs, a leading tab is elected and only in this tab a database is created. All other tabs do not run queries against their own database, but instead call the leading tab to send and retrieve data. When the leading tab is closed, a new leader is elected that reopens the database and processes queries. You can disable this by setting multiInstance: false when creating the RxDatabase. ","version":"Next","tagName":"h2"},{"title":"Autosave and autoload​","type":1,"pageTitle":"RxStorage LokiJS","url":"/rx-storage-lokijs.html#autosave-and-autoload","content":" When using plain LokiJS, you could set the autosave option to true to make sure that LokiJS persists the database state after each write into the persistence adapter. Same goes to autoload which loads the persisted state on database creation. But RxDB knows better when to persist the database state and when to load it, so it has its own autosave logic. This will ensure that running the persistence handler does not affect the performance of more important tasks. Instead RxDB will always wait until the database is idle and then runs the persistence handler. A load of the persisted state is done on database or collection creation and it is ensured that multiple load calls do not run in parallel and interfere with each other or with saveDatabase() calls. ","version":"Next","tagName":"h2"},{"title":"Known problems​","type":1,"pageTitle":"RxStorage LokiJS","url":"/rx-storage-lokijs.html#known-problems","content":" When you bundle the LokiJS Plugin with webpack, you might get the error Cannot find module "fs". This is because LokiJS uses a require('fs') statement that cannot work in the browser. You can fix that by telling webpack to not resolve the fs module with the following block in your webpack config: // in your webpack.config.js { /* ... */ resolve: { fallback: { fs: false } } /* ... */ } // Or if you do not have a webpack.config.js like you do with angular, // you might fix it by setting the browser field in the package.json { /* ... */ "browser": { "fs": false } /* ... */ } ","version":"Next","tagName":"h2"},{"title":"Using the internal LokiJS database​","type":1,"pageTitle":"RxStorage LokiJS","url":"/rx-storage-lokijs.html#using-the-internal-lokijs-database","content":" For custom operations, you can access the internal LokiJS database. This is dangerous because you might do changes that are not compatible with RxDB. Only use this when there is no way to achieve your goals via the RxDB API. const storageInstance = myRxCollection.storageInstance; const localState = await storageInstance.internals.localState; localState.collection.insert({ key: 'foo', value: 'bar', _deleted: false, _attachments: {}, _rev: '1-62080c42d471e3d2625e49dcca3b8e3e', _meta: { lwt: new Date().getTime() } }); // manually trigger the save queue because we did a write to the internal loki db. await localState.databaseState.saveQueue.addWrite(); ","version":"Next","tagName":"h2"},{"title":"Disabling the non-premium console log​","type":1,"pageTitle":"RxStorage LokiJS","url":"/rx-storage-lokijs.html#disabling-the-non-premium-console-log","content":" We want to be transparent with our community, and you'll notice a console message when using the free Loki.js based RxStorage implementation. This message serves to inform you about the availability of faster storage solutions within our 👑 Premium Plugins. We understand that this might be a minor inconvenience, and we sincerely apologize for that. However, maintaining and improving RxDB requires substantial resources, and our premium users help us ensure its sustainability. If you find value in RxDB and wish to remove this message, we encourage you to explore our premium storage options, which are optimized for professional use and production environments. Thank you for your understanding and support. If you already have premium access and want to use the LokiJS RxStorage without the log, you can call the setPremiumFlag() function to disable the log. import { setPremiumFlag } from 'rxdb-premium/plugins/shared'; setPremiumFlag(); ","version":"Next","tagName":"h2"},{"title":"Memory Mapped RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-memory-mapped.html","content":"","keywords":"","version":"Next"},{"title":"Pros​","type":1,"pageTitle":"Memory Mapped RxStorage","url":"/rx-storage-memory-mapped.html#pros","content":" Improves read/write performance because these operations run against the in-memory storage.Decreases initial page load because it load all data in a single bulk request. It even detects if the database is used for the first time and then it does not have to await the creation of the persistent storage.Can store encrypted data on disc while still being able to run queries on the non-encrypted in-memory state. ","version":"Next","tagName":"h2"},{"title":"Cons​","type":1,"pageTitle":"Memory Mapped RxStorage","url":"/rx-storage-memory-mapped.html#cons","content":" It does not support attachments because storing big attachments data in-memory should not be done.When the JavaScript process is killed ungracefully like when the browser crashes or the power of the PC is terminated, it might happen that some memory writes are not persisted to the parent storage. This can be prevented with the awaitWritePersistence flag.The memory-mapped storage can only be used if all data fits into the memory of the JavaScript process. This is normally not a problem because a browser has much memory these days and plain JSON document data is not that big.Because it has to await an initial data loading from the parent storage into the memory, initial page load time can increase when much data is already stored. This is likely not a problem when you store less than 10k documents.The memory-mapped storage is part of RxDB Premium 👑. It is not part of the default RxDB core module. ","version":"Next","tagName":"h2"},{"title":"Using the Memory-Mapped RxStorage​","type":1,"pageTitle":"Memory Mapped RxStorage","url":"/rx-storage-memory-mapped.html#using-the-memory-mapped-rxstorage","content":" import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; import { getMemoryMappedRxStorage } from 'rxdb-premium/plugins/storage-memory-mapped'; /** * Here we use the IndexedDB RxStorage as persistence storage. * Any other RxStorage can also be used. */ const parentStorage = getRxStorageIndexedDB(); // wrap the persistent storage with the memory-mapped storage. const storage = getMemoryMappedRxStorage({ storage: parentStorage }); // create the RxDatabase like you would do with any other RxStorage const db = await createRxDatabase({ name: 'myDatabase, storage, }); /** ... **/ ","version":"Next","tagName":"h2"},{"title":"Multi-Tab Support​","type":1,"pageTitle":"Memory Mapped RxStorage","url":"/rx-storage-memory-mapped.html#multi-tab-support","content":" By how the memory-mapped storage works, it is not possible to have the same storage open in multiple JavaScript processes. So when you use this in a browser application, you can not open multiple databases when the app is used in multiple browser tabs. To solve this, use the SharedWorker Plugin so that the memory-mapped storage runs inside of a SharedWorker exactly once and is then reused for all browser tabs. If you have a single JavaScript process, like in a React Native app, you do not have to care about this and can just use the memory-mapped storage in the main process. ","version":"Next","tagName":"h2"},{"title":"Encryption of the persistent data​","type":1,"pageTitle":"Memory Mapped RxStorage","url":"/rx-storage-memory-mapped.html#encryption-of-the-persistent-data","content":" Normally RxDB is not capable of running queries on encrypted fields. But when you use the memory-mapped RxStorage, you can store the document data encrypted on disc, while being able to run queries on the not encrypted in-memory state. Make sure you use the encryption storage wrapper around the persistent storage, NOT around the memory-mapped storage as a whole. import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; import { getMemoryMappedRxStorage } from 'rxdb-premium/plugins/storage-memory-mapped'; import { wrappedKeyEncryptionWebCryptoStorage } from 'rxdb-premium/plugins/encryption-web-crypto'; const storage = getMemoryMappedRxStorage({ storage: wrappedKeyEncryptionWebCryptoStorage({ storage: getRxStorageIndexedDB() }) }); const db = await createRxDatabase({ name: 'myDatabase, storage, }); /** ... **/ ","version":"Next","tagName":"h2"},{"title":"Await Write Persistence​","type":1,"pageTitle":"Memory Mapped RxStorage","url":"/rx-storage-memory-mapped.html#await-write-persistence","content":" Running operations on the memory-mapped storage by default returns directly when the operation has run on the in-memory state and then persist changes in the background. Sometimes you might want to ensure write operations is persisted, you can do this by setting awaitWritePersistence: true. const storage = getMemoryMappedRxStorage({ awaitWritePersistence: true, storage: getRxStorageIndexedDB() }); ","version":"Next","tagName":"h2"},{"title":"Block Size Limit​","type":1,"pageTitle":"Memory Mapped RxStorage","url":"/rx-storage-memory-mapped.html#block-size-limit","content":" During cleanup, the memory-mapped storage will merge many small write-blocks into single big blocks for better initial load performance. The blockSizeLimit defines the maximum of how many documents get stored in a single block. The default is 10000. const storage = getMemoryMappedRxStorage({ blockSizeLimit: 1000, storage: getRxStorageIndexedDB() }); ","version":"Next","tagName":"h2"},{"title":"MongoDB RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-mongodb.html","content":"","keywords":"","version":"Next"},{"title":"Limitations of the MongoDB RxStorage​","type":1,"pageTitle":"MongoDB RxStorage","url":"/rx-storage-mongodb.html#limitations-of-the-mongodb-rxstorage","content":" Multiple Node.js servers using the same MongoDB database is currently not supportedRxAttachments are currently not supportedDoing non-RxDB writes on the MongoDB database is not supported. RxDB expects all writes to come from RxDB which update the required metadata. Doing non-RxDB writes can confuse the RxDatabase and lead to undefined behavior. But you can perform read-queries on the MongoDB storage from the outside at any time. ","version":"Next","tagName":"h2"},{"title":"Using the MongoDB RxStorage​","type":1,"pageTitle":"MongoDB RxStorage","url":"/rx-storage-mongodb.html#using-the-mongodb-rxstorage","content":" 1 Install the mongodb package​ npm install mongodb --save 2 Setups the MongoDB RxStorage​ To use the storage, you simply import the getRxStorageMongoDB method and use that when creating the RxDatabase. The connection parameter contains the MongoDB connection string. import { createRxDatabase } from 'rxdb'; import { getRxStorageMongoDB } from 'rxdb/plugins/storage-mongodb'; const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: getRxStorageMongoDB({ /** * MongoDB connection string * @link https://www.mongodb.com/docs/manual/reference/connection-string/ */ connection: 'mongodb://localhost:27017,localhost:27018,localhost:27019' }) }); ","version":"Next","tagName":"h2"},{"title":"📈 Discover RxDB Storage Benchmarks","type":0,"sectionRef":"#","url":"/rx-storage-performance.html","content":"","keywords":"","version":"Next"},{"title":"RxStorage Performance comparison​","type":1,"pageTitle":"📈 Discover RxDB Storage Benchmarks","url":"/rx-storage-performance.html#rxstorage-performance-comparison","content":" A big difference in the RxStorage implementations is the performance. In difference to a server side database, RxDB is bound to the limits of the JavaScript runtime and depending on the runtime, there are different possibilities to store and fetch data. For example in the browser it is only possible to store data in a slow IndexedDB or OPFS instead of a filesystem while on React-Native you can use the SQLite storage. Therefore the performance can be completely different depending on where you use RxDB and what you do with it. Here you can see some performance measurements and descriptions on how the different storages work and how their performance is different. ","version":"Next","tagName":"h2"},{"title":"Persistent vs Semi-Persistent storages​","type":1,"pageTitle":"📈 Discover RxDB Storage Benchmarks","url":"/rx-storage-performance.html#persistent-vs-semi-persistent-storages","content":" The "normal" storages are always persistent. This means each RxDB write is directly written to disc and all queries run on the disc state. This means a good startup performance because nothing has to be done on startup. In contrast, semi-persistent storages like memory mapped store all data in memory on startup and only save to disc occasionally (or on exit). Therefore it has a very fast read/write performance, but loading all data into memory on the first page load can take longer for big amounts of documents. Also these storages can only be used when all data fits into the memory at least once. In general it is recommended to stay on the persistent storages and only use semi-persistent ones, when you know for sure that the dataset will stay small (less than 2k documents). ","version":"Next","tagName":"h2"},{"title":"Performance comparison​","type":1,"pageTitle":"📈 Discover RxDB Storage Benchmarks","url":"/rx-storage-performance.html#performance-comparison","content":" In the following you can find some performance measurements and comparisons. Notice that these are only a small set of possible RxDB operations. If performance is really relevant for your use case, you should do your own measurements with usage-patterns that are equal to how you use RxDB in production. ","version":"Next","tagName":"h2"},{"title":"Measurements​","type":1,"pageTitle":"📈 Discover RxDB Storage Benchmarks","url":"/rx-storage-performance.html#measurements","content":" Here the following metrics are measured: time-to-first-insert: Many storages run lazy, so it makes no sense to compare the time which is required to create a database with collections. Instead we measure the time-to-first-insert which is the whole timespan from database creation until the first single document write is done.insert documents (bulk): Insert 500 documents with a single bulk-insert operation.find documents by id (bulk): Here we fetch 100% of the stored documents with a single findByIds() call.insert documents (serial): Insert 50 documents, one after each other.find documents by id (serial): Here we find 50 documents in serial with one findByIds() call per document.find documents by query: Here we fetch 100% of the stored documents with a single find() call.find documents by query: Here we fetch all of the stored documents with a 4 find() calls that run in parallel. Each fetching 25% of the documents.count documents: Counts 100% of the stored documents with a single count() call. Here we measure 4 runs at once to have a higher number that is easier to compare. ","version":"Next","tagName":"h3"},{"title":"Browser based Storages Performance Comparison​","type":1,"pageTitle":"📈 Discover RxDB Storage Benchmarks","url":"/rx-storage-performance.html#browser-based-storages-performance-comparison","content":" The performance patterns of the browser based storages are very diverse. The IndexedDB storage is recommended for mostly all use cases so you should start with that one. Later you can do performance testings and switch to another storage like OPFS or memory-mapped. ","version":"Next","tagName":"h2"},{"title":"Node/Native based Storages Performance Comparison​","type":1,"pageTitle":"📈 Discover RxDB Storage Benchmarks","url":"/rx-storage-performance.html#nodenative-based-storages-performance-comparison","content":" For most client-side native applications (react-native, electron, capacitor), using the SQLite RxStorage is recommended. For non-client side applications like a server, use the MongoDB storage instead. ","version":"Next","tagName":"h2"},{"title":"RxStorage PouchDB","type":0,"sectionRef":"#","url":"/rx-storage-pouchdb.html","content":"","keywords":"","version":"Next"},{"title":"Why is the PouchDB RxStorage deprecated?​","type":1,"pageTitle":"RxStorage PouchDB","url":"/rx-storage-pouchdb.html#why-is-the-pouchdb-rxstorage-deprecated","content":" When I started developing RxDB in 2016, I had a specific use case to solve. Because there was no client-side database out there that fitted, I created RxDB as a wrapper around PouchDB. This worked great and all the PouchDB features like the query engine, the adapter system, CouchDB-replication and so on, came for free. But over the years, it became clear that PouchDB is not suitable for many applications, mostly because of its performance: To be compliant to CouchDB, PouchDB has to store all revision trees of documents which slows down queries. Also purging these document revisions is not possibleso the database storage size will only increase over time. Another problem was that many issues in PouchDB have never been fixed, but only closed by the issue-bot like this one. The whole PouchDB RxStorage code was full of workarounds and monkey patches to resolve these issues for RxDB users. Many these patches decreased performance even further. Sometimes it was not possible to fix things from the outside, for example queries with $gt operators return the wrong documents which is a no-go for a production database and hard to debug. In version 10.0.0 RxDB introduced the RxStorage layer which allows users to swap out the underlying storage engine where RxDB stores and queries documents from. This allowed to use alternatives from PouchDB, for example the IndexedDB RxStorage in browsers or even the FoundationDB RxStorage on the server side. There where not many use cases left where it was a good choice to use the PouchDB RxStorage. Only replicating with a CouchDB server, was only possible with PouchDB. But this has also changed. RxDB has a plugin that allows to replicate clients with any CouchDB server by using the RxDB Sync Engine. This plugins work with any RxStorage so that it is not necessary to use the PouchDB storage. Removing PouchDB allows RxDB to add many awaited features like filtered change streams for easier replication and permission handling. It will also free up development time. If you are currently using the PouchDB RxStorage, you have these options: Migrate to another RxStorage (recommended)Never update RxDB to the next major version (stay on older 14.0.0)Fork the PouchDB RxStorage and maintain the plugin by yourself.Fix all the PouchDB problems so that we can add PouchDB to the RxDB Core again. ","version":"Next","tagName":"h2"},{"title":"Pros​","type":1,"pageTitle":"RxStorage PouchDB","url":"/rx-storage-pouchdb.html#pros","content":" Most battle proven RxStorageSupports replication with a CouchDB endpointSupport storing attachmentsBig ecosystem of adapters ","version":"Next","tagName":"h2"},{"title":"Cons​","type":1,"pageTitle":"RxStorage PouchDB","url":"/rx-storage-pouchdb.html#cons","content":" Big bundle sizeSlow performance because of revision handling overhead ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"RxStorage PouchDB","url":"/rx-storage-pouchdb.html#usage","content":" import { createRxDatabase } from 'rxdb'; import { getRxStoragePouch, addPouchPlugin } from 'rxdb/plugins/pouchdb'; addPouchPlugin(require('pouchdb-adapter-idb')); const db = await createRxDatabase({ name: 'exampledb', storage: getRxStoragePouch( 'idb', { /** * other pouchdb specific options * @link https://pouchdb.com/api.html#create_database */ } ) }); ","version":"Next","tagName":"h2"},{"title":"Polyfill the global variable​","type":1,"pageTitle":"RxStorage PouchDB","url":"/rx-storage-pouchdb.html#polyfill-the-global-variable","content":" When you use RxDB with angular or other webpack based frameworks, you might get the error: <span style="color: red;">Uncaught ReferenceError: global is not defined</span> This is because pouchdb assumes a nodejs-specific global variable that is not added to browser runtimes by some bundlers. You have to add them by your own, like we do here. (window as any).global = window; (window as any).process = { env: { DEBUG: undefined }, }; ","version":"Next","tagName":"h2"},{"title":"Adapters​","type":1,"pageTitle":"RxStorage PouchDB","url":"/rx-storage-pouchdb.html#adapters","content":" PouchDB has many adapters for all JavaScript runtimes. ","version":"Next","tagName":"h2"},{"title":"Using the internal PouchDB Database​","type":1,"pageTitle":"RxStorage PouchDB","url":"/rx-storage-pouchdb.html#using-the-internal-pouchdb-database","content":" For custom operations, you can access the internal PouchDB database. This is dangerous because you might do changes that are not compatible with RxDB. Only use this when there is no way to achieve your goals via the RxDB API. import { getPouchDBOfRxCollection } from 'rxdb/plugins/pouchdb'; const pouch = getPouchDBOfRxCollection(myRxCollection); ","version":"Next","tagName":"h2"},{"title":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-opfs.html","content":"","keywords":"","version":"Next"},{"title":"What is OPFS​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#what-is-opfs","content":" The Origin Private File System (OPFS) is a native browser storage API that allows web applications to manage files in a private, sandboxed, origin-specific virtual filesystem. Unlike IndexedDB and LocalStorage, which are optimized as object/key-value storage, OPFS provides more granular control for file operations, enabling byte-by-byte access, file streaming, and even low-level manipulations. OPFS is ideal for applications requiring high-performance file operations (3x-4x faster compared to IndexedDB) inside of a client-side application, offering advantages like improved speed, more efficient use of resources, and enhanced security and privacy features. ","version":"Next","tagName":"h2"},{"title":"OPFS limitations​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#opfs-limitations","content":" From the beginning of 2023, the Origin Private File System API is supported by all modern browsers like Safari, Chrome, Edge and Firefox. Only Internet Explorer is not supported and likely will never get support. It is important to know that the most performant synchronous methods like read() and write() of the OPFS API are only available inside of a WebWorker. They cannot be used in the main thread, an iFrame or even a SharedWorker. The OPFS createSyncAccessHandle() method that gives you access to the synchronous methods is not exposed in the main thread, only in a Worker. While there is no concrete data size limit defined by the API, browsers will refuse to store more data at some point. If no more data can be written, a QuotaExceededError is thrown which should be handled by the application, like showing an error message to the user. ","version":"Next","tagName":"h3"},{"title":"How the OPFS API works​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#how-the-opfs-api-works","content":" The OPFS API is pretty straightforward to use. First you get the root filesystem. Then you can create files and directories on that. Notice that whenever you synchronously write to, or read from a file, an ArrayBuffer must be used that contains the data. It is not possible to synchronously write plain strings or objects into the file. Therefore the TextEncoder and TextDecoder API must be used. Also notice that some of the methods of FileSystemSyncAccessHandlehave been asynchronous in the past, but are synchronous since Chromium 108. To make it less confusing, we just use await in front of them, so it will work in both cases. // Access the root directory of the origin's private file system. const root = await navigator.storage.getDirectory(); // Create a subdirectory. const diaryDirectory = await root.getDirectoryHandle('subfolder', { create: true, }); // Create a new file named 'example.txt'. const fileHandle = await diaryDirectory.getFileHandle('example.txt', { create: true, }); // Create a FileSystemSyncAccessHandle on the file. const accessHandle = await fileHandle.createSyncAccessHandle(); // Write a sentence to the file. let writeBuffer = new TextEncoder().encode('Hello from RxDB'); const writeSize = accessHandle.write(writeBuffer); // Read file and transform data to string. const readBuffer = new Uint8Array(writeSize); const readSize = accessHandle.read(readBuffer, { at: 0 }); const contentAsString = new TextDecoder().decode(readBuffer); // Write an exclamation mark to the end of the file. writeBuffer = new TextEncoder().encode('!'); accessHandle.write(writeBuffer, { at: readSize }); // Truncate file to 10 bytes. await accessHandle.truncate(10); // Get the new size of the file. const fileSize = await accessHandle.getSize(); // Persist changes to disk. await accessHandle.flush(); // Always close FileSystemSyncAccessHandle if done, so others can open the file again. await accessHandle.close(); A more detailed description of the OPFS API can be found on MDN. ","version":"Next","tagName":"h2"},{"title":"OPFS performance​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#opfs-performance","content":" Because the Origin Private File System API provides low-level access to binary files, it is much faster compared to IndexedDB or localStorage. According to the storage performance test, OPFS is up to 2x times faster on plain inserts when a new file is created on each write. Reads are even faster. A good comparison about real world scenarios, are the performance results of the various RxDB storages. Here it shows that reads are up to 4x faster compared to IndexedDB, even with complex queries: ","version":"Next","tagName":"h2"},{"title":"Using OPFS as RxStorage in RxDB​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#using-opfs-as-rxstorage-in-rxdb","content":" The OPFS RxStorage itself must run inside a WebWorker. Therefore we use the Worker RxStorage and let it point to the prebuild opfs.worker.js file that comes shipped with RxDB Premium 👑. Notice that the OPFS RxStorage is part of the RxDB Premium 👑 plugin that must be purchased. import { createRxDatabase } from 'rxdb'; import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker'; const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageWorker( { /** * This file must be statically served from a webserver. * You might want to first copy it somewhere outside of * your node_modules folder. */ workerInput: 'node_modules/rxdb-premium/dist/workers/opfs.worker.js' } ) }); ","version":"Next","tagName":"h2"},{"title":"Using OPFS in the main thread instead of a worker​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#using-opfs-in-the-main-thread-instead-of-a-worker","content":" The createSyncAccessHandle method from the Filesystem API is only available inside of a Webworker. Therefore you cannot use getRxStorageOPFS() in the main thread. But there is a slightly slower way to access the virtual filesystem from the main thread. RxDB support the getRxStorageOPFSMainThread() for that. Notice that this uses the createWritable function which is not supported in safari. Using OPFS from the main thread can have benefits because not having to cross the worker bridge can reduce latence in reads and writes. import { createRxDatabase } from 'rxdb'; import { getRxStorageOPFSMainThread } from 'rxdb-premium/plugins/storage-opfs'; const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageOPFSMainThread() }); ","version":"Next","tagName":"h2"},{"title":"Building a custom worker.js​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#building-a-custom-workerjs","content":" When you want to run additional plugins like storage wrappers or replication inside of the worker, you have to build your own worker.js file. You can do that similar to other workers by calling exposeWorkerRxStorage like described in the worker storage plugin. // inside of the worker.js file import { getRxStorageOPFS } from 'rxdb-premium/plugins/storage-opfs'; import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; const storage = getRxStorageOPFS(); exposeWorkerRxStorage({ storage }); ","version":"Next","tagName":"h2"},{"title":"Setting usesRxDatabaseInWorker when a RxDatabase is also used inside of the worker​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#setting-usesrxdatabaseinworker-when-a-rxdatabase-is-also-used-inside-of-the-worker","content":" When you use the OPFS inside of a worker, it will internally use strings to represent operation results. This has the benefit that transferring strings from the worker to the main thread, is way faster compared to complex json objects. The getRxStorageWorker() will automatically decode these strings on the main thread so that the data can be used by the RxDatabase. But using a RxDatabase inside of your worker can make sense for example when you want to move the replication with a server. To enable this, you have to set usesRxDatabaseInWorker to true: // inside of the worker.js file import { getRxStorageOPFS } from 'rxdb-premium/plugins/storage-opfs'; const storage = getRxStorageOPFS({ usesRxDatabaseInWorker: true }); If you forget to set this and still create and use a RxDatabase inside of the worker, you might get the error messageorUncaught (in promise) TypeError: Cannot read properties of undefined (reading 'length')`. ","version":"Next","tagName":"h2"},{"title":"OPFS in Electron, React-Native or Capacitor.js​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#opfs-in-electron-react-native-or-capacitorjs","content":" Origin Private File System is a browser API that is only accessible in browsers. Other JavaScript like React-Native or Node.js, do not support it. Electron has two JavaScript contexts: the browser (chromium) context and the Node.js context. While you could use the OPFS API in the browser context, it is not recommended. Instead you should use the Filesystem API of Node.js and then only transfer the relevant data with the ipcRenderer. With RxDB that is pretty easy to configure: In the main.js, expose the Node Filesystem storage with the exposeIpcMainRxStorage() that comes with the electron pluginIn the browser context, access the main storage with the getRxStorageIpcRenderer() method. React Native (and Expo) does not have an OPFS API. You could use the ReactNative Filesystem to directly write data. But to get a fully featured database like RxDB it is easier to use the SQLite RxStorage which starts an SQLite database inside of the ReactNative app and uses that to do the database operations. Capacitor.js is able to access the OPFS API. ","version":"Next","tagName":"h2"},{"title":"Difference between File System Access API and Origin Private File System (OPFS)​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#difference-between-file-system-access-api-and-origin-private-file-system-opfs","content":" Often developers are confused with the differences between the File System Access API and the Origin Private File System (OPFS). The File System Access API provides access to the files on the device file system, like the ones shown in the file explorer of the operating system. To use the File System API, the user has to actively select the files from a filepicker.Origin Private File System (OPFS) is a sub-part of the File System Standard and it only describes the things you can do with the filesystem root from navigator.storage.getDirectory(). OPFS writes to a sandboxed filesystem, not visible to the user. Therefore the user does not have to actively select or allow the data access. ","version":"Next","tagName":"h2"},{"title":"Learn more about OPFS:​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#learn-more-about-opfs","content":" WebKit: The File System API with Origin Private File SystemBrowser SupportPerformance Test Tool ","version":"Next","tagName":"h2"},{"title":"Remote RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-remote.html","content":"","keywords":"","version":"Next"},{"title":"Usage​","type":1,"pageTitle":"Remote RxStorage","url":"/rx-storage-remote.html#usage","content":" The remote storage communicates over a message channel which has to implement the messageChannelCreator function which returns an object that has a messages$ observable and a send() function on both sides and a close() function that closes the RemoteMessageChannel. // on the client import { getRxStorageRemote } from 'rxdb/plugins/storage-remote'; const storage = getRxStorageRemote({ identifier: 'my-id', mode: 'storage', messageChannelCreator: () => Promise.resolve({ messages$: new Subject(), send(msg) { // send to remote storage } }) }); const myDb = await createRxDatabase({ storage }); // on the remote import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; import { exposeRxStorageRemote } from 'rxdb/plugins/storage-remote'; exposeRxStorageRemote({ storage: getRxStorageLocalstorage(), messages$: new Subject(), send(msg){ // send to other side } }); ","version":"Next","tagName":"h2"},{"title":"Usage with a Websocket server​","type":1,"pageTitle":"Remote RxStorage","url":"/rx-storage-remote.html#usage-with-a-websocket-server","content":" The remote storage plugin contains helper functions to create a remote storage over a WebSocket server. This is often used in Node.js to give one microservice access to another services database without having to replicate the full database state. // server.js import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; import { startRxStorageRemoteWebsocketServer } from 'rxdb/plugins/storage-remote-websocket'; // either you can create the server based on a RxDatabase const serverBasedOnDatabase = await startRxStorageRemoteWebsocketServer({ port: 8080, database: myRxDatabase }); // or you can create the server based on a pure RxStorage const serverBasedOn = await startRxStorageRemoteWebsocketServer({ port: 8080, storage: getRxStorageMemory() }); // client.js import { getRxStorageRemoteWebsocket } from 'rxdb/plugins/storage-remote-websocket'; const myDb = await createRxDatabase({ storage: getRxStorageRemoteWebsocket({ url: 'ws://example.com:8080' }) }); ","version":"Next","tagName":"h2"},{"title":"Sending custom messages​","type":1,"pageTitle":"Remote RxStorage","url":"/rx-storage-remote.html#sending-custom-messages","content":" The remote storage can also be used to send custom messages to and from the remote instance. One the remote you have to define a customRequestHandler like: const serverBasedOnDatabase = await startRxStorageRemoteWebsocketServer({ port: 8080, database: myRxDatabase, async customRequestHandler(msg){ // here you can return any JSON object as an 'answer' return { foo: 'bar' }; } }); On the client instance you can then call the customRequest() method: const storage = getRxStorageRemoteWebsocket({ url: 'ws://example.com:8080' }); const answer = await storage.customRequest({ bar: 'foo' }); console.dir(answer); // > { foo: 'bar' } ","version":"Next","tagName":"h2"},{"title":"Sharding RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-sharding.html","content":"","keywords":"","version":"Next"},{"title":"Using the sharding plugin​","type":1,"pageTitle":"Sharding RxStorage","url":"/rx-storage-sharding.html#using-the-sharding-plugin","content":" import { getRxStorageSharding } from 'rxdb-premium/plugins/storage-sharding'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; /** * First wrap the original RxStorage with the sharding RxStorage. */ const shardedRxStorage = getRxStorageSharding({ /** * Here we use the localStorage RxStorage, * it is also possible to use any other RxStorage instead. */ storage: getRxStorageLocalstorage() }); /** * Add the sharding options to your schema. * Changing these options will require a data migration. */ const mySchema = { /* ... */ sharding: { /** * Amount of shards per RxStorage instance. * Depending on your data size and query patterns, the optimal shard amount may differ. * Do a performance test to optimize that value. * 10 Shards is a good value to start with. * * IMPORTANT: Changing the value of shards is not possible on a already existing database state, * you will loose access to your data. */ shards: 10, /** * Sharding mode, * you can either shard by collection or by database. * For most cases you should use 'collection' which will shard on the collection level. * For example with the IndexedDB RxStorage, it will then create multiple stores per IndexedDB database * and not multiple IndexedDB databases, which would be slower. */ mode: 'collection' } /* ... */ } /** * Create the RxDatabase with the wrapped RxStorage. */ const database = await createRxDatabase({ name: 'mydatabase', storage: shardedRxStorage }); ","version":"Next","tagName":"h2"},{"title":"SharedWorker RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-shared-worker.html","content":"","keywords":"","version":"Next"},{"title":"Usage​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#usage","content":" ","version":"Next","tagName":"h2"},{"title":"On the SharedWorker process​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#on-the-sharedworker-process","content":" In the worker process JavaScript file, you have wrap the original RxStorage with getRxStorageIndexedDB(). // shared-worker.ts import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/indexeddb'; exposeWorkerRxStorage({ /** * You can wrap any implementation of the RxStorage interface * into a worker. * Here we use the IndexedDB RxStorage. */ storage: getRxStorageIndexedDB() }); ","version":"Next","tagName":"h3"},{"title":"On the main process​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#on-the-main-process","content":" import { createRxDatabase } from 'rxdb'; import { getRxStorageSharedWorker } from 'rxdb-premium/plugins/storage-worker'; import { getRxStorageIndexedDB } from 'rxdb/plugins/storage-indexeddb'; const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageSharedWorker( { /** * Contains any value that can be used as parameter * to the SharedWorker constructor of thread.js * Most likely you want to put the path to the shared-worker.js file in here. * * @link https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker?retiredLocale=de */ workerInput: 'path/to/shared-worker.js', /** * (Optional) options * for the worker. */ workerOptions: { type: 'module', credentials: 'omit' } } ) }); ","version":"Next","tagName":"h3"},{"title":"Pre-build workers​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#pre-build-workers","content":" The shared-worker.js must be a self containing JavaScript file that contains all dependencies in a bundle. To make it easier for you, RxDB ships with pre-bundles worker files that are ready to use. You can find them in the folder node_modules/rxdb-premium/dist/workers after you have installed the RxDB Premium 👑 Plugin. From there you can copy them to a location where it can be served from the webserver and then use their path to create the RxDatabase Any valid worker.js JavaScript file can be used both, for normal Workers and SharedWorkers. import { createRxDatabase } from 'rxdb'; import { getRxStorageSharedWorker } from 'rxdb-premium/plugins/storage-worker'; const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageSharedWorker( { /** * Path to where the copied file from node_modules/rxdb-premium/dist/workers * is reachable from the webserver. */ workerInput: '/indexeddb.shared-worker.js' } ) }); ","version":"Next","tagName":"h2"},{"title":"Building a custom worker​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#building-a-custom-worker","content":" To build a custom worker.js file, check out the webpack config at the worker documentation. Any worker file form the worker storage can also be used in a shared worker because exposeWorkerRxStorage detects where it runs and exposes the correct messaging endpoints. ","version":"Next","tagName":"h2"},{"title":"Passing in a SharedWorker instance​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#passing-in-a-sharedworker-instance","content":" Instead of setting an url as workerInput, you can also specify a function that returns a new SharedWorker instance when called. This is mostly used when you have a custom worker file and dynamically import it. This works equal to the workerInput of the Worker Storage ","version":"Next","tagName":"h2"},{"title":"Set multiInstance: false​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#set-multiinstance-false","content":" When you know that you only ever create your RxDatabase inside of the shared worker, you might want to set multiInstance: false to prevent sending change events across JavaScript realms and to improve performance. Do not set this when you also create the same storage on another realm, like when you have the same RxDatabase once inside the shared worker and once on the main thread. ","version":"Next","tagName":"h2"},{"title":"Replication with SharedWorker​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#replication-with-sharedworker","content":" When a SharedWorker RxStorage is used, it is recommended to run the replication inside of the worker. This is the best option for performance. You can do that by opening another RxDatabase inside of it and starting the replication there. If you are not concerned about performance, you can still start replication on the main thread instead. But you should never run replication on both the main thread and the worker. // shared-worker.ts import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; import { createRxDatabase, addRxPlugin } from 'rxdb'; import { RxDBReplicationGraphQLPlugin } from 'rxdb/plugins/replication-graphql'; addRxPlugin(RxDBReplicationGraphQLPlugin); const baseStorage = getRxStorageIndexedDB(); // first expose the RxStorage to the outside exposeWorkerRxStorage({ storage: baseStorage }); /** * Then create a normal RxDatabase and RxCollections * and start the replication. */ const database = await createRxDatabase({ name: 'mydatabase', storage: baseStorage }); await db.addCollections({ humans: {/* ... */} }); const replicationState = db.humans.syncGraphQL({/* ... */}); ","version":"Next","tagName":"h2"},{"title":"Limitations​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#limitations","content":" The SharedWorker API is not available in some mobile browser ","version":"Next","tagName":"h3"},{"title":"FAQ​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#faq","content":" Can I use this plugin with a Service Worker? No. A Service Worker is not the same as a Shared Worker. While you can use RxDB inside of a ServiceWorker, you cannot use the ServiceWorker as a RxStorage that gets accessed by an outside RxDatabase instance. ","version":"Next","tagName":"h3"},{"title":"RxStorage","type":0,"sectionRef":"#","url":"/rx-storage.html","content":"","keywords":"","version":"Next"},{"title":"Quick Recommendations​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#quick-recommendations","content":" In the Browser: Use the LocalStorage storage for simple setup and small build size. For bigger datasets, use either the dexie.js storage (free) or the IndexedDB RxStorage if you have 👑 premium access which is a bit faster and has a smaller build size.In Electron and ReactNative: Use the SQLite RxStorage if you have 👑 premium access or the trial-SQLite RxStorage for tryouts.In Capacitor: Use the SQLite RxStorage if you have 👑 premium access, otherwise use the localStorage storage. ","version":"Next","tagName":"h2"},{"title":"Configuration Examples​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#configuration-examples","content":" The RxStorage layer of RxDB is very flexible. Here are some examples on how to configure more complex settings: ","version":"Next","tagName":"h2"},{"title":"Storing much data in a browser securely​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#storing-much-data-in-a-browser-securely","content":" Lets say you build a browser app that needs to store a big amount of data as secure as possible. Here we can use a combination of the storages (encryption, IndexedDB, compression, schema-checks) that increase security and reduce the stored data size. We use the schema-validation on the top level to ensure schema-errors are clearly readable and do not contain encrypted/compressed data. The encryption is used inside of the compression because encryption of compressed data is more efficient. import { wrappedValidateAjvStorage } from 'rxdb/plugins/validate-ajv'; import { wrappedKeyCompressionStorage } from 'rxdb/plugins/key-compression'; import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; const myDatabase = await createRxDatabase({ storage: wrappedValidateAjvStorage({ storage: wrappedKeyCompressionStorage({ storage: wrappedKeyEncryptionCryptoJsStorage({ storage: getRxStorageIndexedDB() }) }) }) }); ","version":"Next","tagName":"h3"},{"title":"High query Load​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#high-query-load","content":" Also we can utilize a combination of storages to create a database that is optimized to run complex queries on the data really fast. Here we use the sharding storage together with the worker storage. This allows to run queries in parallel multithreading instead of a single JavaScript process. Because the worker initialization can slow down the initial page load, we also use the localstorage-meta-optimizer to improve initialization time. import { getRxStorageSharding } from 'rxdb-premium/plugins/storage-sharding'; import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; import { getLocalstorageMetaOptimizerRxStorage } from 'rxdb-premium/plugins/storage-localstorage-meta-optimizer'; const myDatabase = await createRxDatabase({ storage: getLocalstorageMetaOptimizerRxStorage({ storage: getRxStorageSharding({ storage: getRxStorageWorker({ workerInput: 'path/to/worker.js', storage: getRxStorageIndexedDB() }) }) }) }); ","version":"Next","tagName":"h3"},{"title":"Low Latency on Writes and Simple Reads​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#low-latency-on-writes-and-simple-reads","content":" Here we create a storage configuration that is optimized to have a low latency on simple reads and writes. It uses the memory-mapped storage to fetch and store data in memory. For persistence the OPFS storage is used in the main thread which has lower latency for fetching big chunks of data when at initialization the data is loaded from disc into memory. We do not use workers because sending data from the main thread to workers and backwards would increase the latency. import { getLocalstorageMetaOptimizerRxStorage } from 'rxdb-premium/plugins/storage-localstorage-meta-optimizer'; import { getMemoryMappedRxStorage } from 'rxdb-premium/plugins/storage-memory-mapped'; import { getRxStorageOPFSMainThread } from 'rxdb-premium/plugins/storage-worker'; const myDatabase = await createRxDatabase({ storage: getLocalstorageMetaOptimizerRxStorage({ storage: getMemoryMappedRxStorage({ storage: getRxStorageOPFSMainThread() }) }) }); ","version":"Next","tagName":"h3"},{"title":"All RxStorage Implementations List​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#all-rxstorage-implementations-list","content":" ","version":"Next","tagName":"h2"},{"title":"Memory​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#memory","content":" A storage that stores the data in as plain data in the memory of the JavaScript process. Really fast and can be used in all environments. Read more ","version":"Next","tagName":"h3"},{"title":"LocalStorage​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#localstorage","content":" The localstroage based storage stores the data inside of a browsers localStorage API. It is the easiest to set up and has a small bundle size. If you are new to RxDB, you should start with the LocalStorage RxStorage. Read more ","version":"Next","tagName":"h3"},{"title":"👑 IndexedDB​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#-indexeddb","content":" The IndexedDB RxStorage is based on plain IndexedDB. For most use cases, this has the best performance together with the OPFS storage. Read more ","version":"Next","tagName":"h3"},{"title":"👑 OPFS​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#-opfs","content":" The OPFS RxStorage is based on the File System Access API. This has the best performance of all other non-in-memory storage, when RxDB is used inside of a browser. Read more ","version":"Next","tagName":"h3"},{"title":"👑 Filesystem Node​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#-filesystem-node","content":" The Filesystem Node storage is best suited when you use RxDB in a Node.js process or with electron.js. Read more ","version":"Next","tagName":"h3"},{"title":"Storage Wrapper Plugins​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#storage-wrapper-plugins","content":" 👑 Worker​ The worker RxStorage is a wrapper around any other RxStorage which allows to run the storage in a WebWorker (in browsers) or a Worker Thread (in Node.js). By doing so, you can take CPU load from the main process and move it into the worker's process which can improve the perceived performance of your application. Read more 👑 SharedWorker​ The worker RxStorage is a wrapper around any other RxStorage which allows to run the storage in a SharedWorker (only in browsers). By doing so, you can take CPU load from the main process and move it into the worker's process which can improve the perceived performance of your application. Read more Remote​ The Remote RxStorage is made to use a remote storage and communicate with it over an asynchronous message channel. The remote part could be on another JavaScript process or even on a different host machine. Mostly used internally in other storages like Worker or Electron-ipc. Read more 👑 Sharding​ On some RxStorage implementations (like IndexedDB), a huge performance improvement can be done by sharding the documents into multiple database instances. With the sharding plugin you can wrap any other RxStorage into a sharded storage. Read more 👑 Memory Mapped​ The memory-mapped RxStorage is a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance stores its data in an underlying storage for persistence. The main reason to use this is to improve query/write performance while still having the data stored on disc. Read more 👑 Localstorage Meta Optimizer​ The RxStorage Localstorage Meta Optimizer is a wrapper around any other RxStorage. The wrapper uses the original RxStorage for normal collection documents. But to optimize the initial page load time, it uses localstorage to store the plain key-value metadata that RxDB needs to create databases and collections. This plugin can only be used in browsers. Read more Electron IpcRenderer & IpcMain​ To use RxDB in electron, it is recommended to run the RxStorage in the main process and the RxDatabase in the renderer processes. With the rxdb electron plugin you can create a remote RxStorage and consume it from the renderer process. Read more ","version":"Next","tagName":"h3"},{"title":"Third Party based Storages​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#third-party-based-storages","content":" 👑 SQLite​ The SQLite storage has great performance when RxDB is used on Node.js, Electron, React Native, Cordova or Capacitor. Read more Dexie.js​ The Dexie.js based storage is based on the Dexie.js IndexedDB wrapper library. Read more MongoDB​ To use RxDB on the server side, the MongoDB RxStorage provides a way of having a secure, scalable and performant storage based on the popular MongoDB NoSQL database Read more DenoKV​ To use RxDB in Deno. The DenoKV RxStorage provides a way of having a secure, scalable and performant storage based on the Deno Key Value Store. Read more FoundationDB​ To use RxDB on the server side, the FoundationDB RxStorage provides a way of having a secure, fault-tolerant and performant storage. Read more ","version":"Next","tagName":"h3"},{"title":"RxDB Tradeoffs","type":0,"sectionRef":"#","url":"/rxdb-tradeoffs.html","content":"","keywords":"","version":"Next"},{"title":"Why not SQL syntax​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#why-not-sql-syntax","content":" When you ask people which database they would want for browsers, the most answer I hear is something SQL based like SQLite. This makes sense, SQL is a query language that most developers had learned in school/university and it is reusable across various database solutions. But for RxDB (and other client side databases), using SQL is not a good option and instead it operates on document writes and the JSON based Mango-query syntax for querying. // A Mango Query const query = { selector: { age: { $gt: 10 }, lastName: 'foo' }, sort: [{ age: 'asc' }] }; ","version":"Next","tagName":"h2"},{"title":"SQL is made for database servers​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#sql-is-made-for-database-servers","content":" SQL is made to be used to run operations against a database server. You send a SQL string like SELECT SUM(column_name)... to the database server and the server then runs all operations required to calculate the result and only send back that result. This saves performance on the application side and ensures that the application itself is not blocked. But RxDB is a client-side database that runs inside of the application. There is no performance difference if the SUM() query is run inside of the database or at the application level where a Array.reduce() call calculates the result. ","version":"Next","tagName":"h3"},{"title":"Typescript support​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#typescript-support","content":" SQL is string based and therefore you need additional IDE tooling to ensure that your written database code is valid. Using the Mango Query syntax instead, TypeScript can be used validate the queries and to autocomplete code and knows which fields do exist and which do not. By doing so, the correctness of queries can be ensured at compile-time instead of run-time. ","version":"Next","tagName":"h3"},{"title":"Composeable queries​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#composeable-queries","content":" By using JSON based Mango Queries, it is easy to compose queries in plain JavaScript. For example if you have any given query and want to add the condition user MUST BE 'foobar', you can just add the condition to the selector without having to parse and understand a complex SQL string. query.selector.user = 'foobar'; Even merging the selectors of multiple queries is not a problem: queryA.selector = { $and: [ queryA.selector, queryB.selector ] }; ","version":"Next","tagName":"h3"},{"title":"Why Document based (NoSQL)​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#why-document-based-nosql","content":" Like other NoSQL databases, RxDB operates data on document level. It has no concept of tables, rows and columns. Instead we have collections, documents and fields. ","version":"Next","tagName":"h2"},{"title":"Javascript is made to work with objects​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#javascript-is-made-to-work-with-objects","content":" ","version":"Next","tagName":"h3"},{"title":"Caching​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#caching","content":" ","version":"Next","tagName":"h3"},{"title":"EventReduce​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#eventreduce","content":" ","version":"Next","tagName":"h3"},{"title":"Easier to use with typescript​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#easier-to-use-with-typescript","content":" Because of the document based approach, TypeScript can know the exact type of the query response while a SQL query could return anything from a number over a set of rows or a complex construct. ","version":"Next","tagName":"h3"},{"title":"Why no transactions​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#why-no-transactions","content":" Does not work with offline-firstDoes not work with multi-tabEasier conflict handling on document level -- Instead of transactions, rxdb works with revisions ","version":"Next","tagName":"h2"},{"title":"Why no relations​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#why-no-relations","content":" Does not work with easy replication ","version":"Next","tagName":"h2"},{"title":"Why is a schema required​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#why-is-a-schema-required","content":" migration of data on clients is hardWhy jsonschema ","version":"Next","tagName":"h2"},{"title":"","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html##","content":"","version":"Next","tagName":"h2"},{"title":"Worker RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-worker.html","content":"","keywords":"","version":"Next"},{"title":"On the worker process​","type":1,"pageTitle":"Worker RxStorage","url":"/rx-storage-worker.html#on-the-worker-process","content":" // worker.ts import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; exposeWorkerRxStorage({ /** * You can wrap any implementation of the RxStorage interface * into a worker. * Here we use the IndexedDB RxStorage. */ storage: getRxStorageIndexedDB() }); ","version":"Next","tagName":"h2"},{"title":"On the main process​","type":1,"pageTitle":"Worker RxStorage","url":"/rx-storage-worker.html#on-the-main-process","content":" import { createRxDatabase } from 'rxdb'; import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker'; const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageWorker( { /** * Contains any value that can be used as parameter * to the Worker constructor of thread.js * Most likely you want to put the path to the worker.js file in here. * * @link https://developer.mozilla.org/en-US/docs/Web/API/Worker/Worker */ workerInput: 'path/to/worker.js', /** * (Optional) options * for the worker. */ workerOptions: { type: 'module', credentials: 'omit' } } ) }); ","version":"Next","tagName":"h2"},{"title":"Pre-build workers​","type":1,"pageTitle":"Worker RxStorage","url":"/rx-storage-worker.html#pre-build-workers","content":" The worker.js must be a self containing JavaScript file that contains all dependencies in a bundle. To make it easier for you, RxDB ships with pre-bundles worker files that are ready to use. You can find them in the folder node_modules/rxdb-premium/dist/workers after you have installed the RxDB Premium 👑 Plugin. From there you can copy them to a location where it can be served from the webserver and then use their path to create the RxDatabase. Any valid worker.js JavaScript file can be used both, for normal Workers and SharedWorkers. import { createRxDatabase } from 'rxdb'; import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker'; const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageWorker( { /** * Path to where the copied file from node_modules/rxdb/dist/workers * is reachable from the webserver. */ workerInput: '/indexeddb.worker.js' } ) }); ","version":"Next","tagName":"h2"},{"title":"Building a custom worker​","type":1,"pageTitle":"Worker RxStorage","url":"/rx-storage-worker.html#building-a-custom-worker","content":" The easiest way to bundle a custom worker.js file is by using webpack. Here is the webpack-config that is also used for the prebuild workers: // webpack.config.js const path = require('path'); const TerserPlugin = require('terser-webpack-plugin'); const projectRootPath = path.resolve( __dirname, '../../' // path from webpack-config to the root folder of the repo ); const babelConfig = require(path.join(projectRootPath, 'babel.config')); const baseDir = './dist/workers/'; // output path module.exports = { target: 'webworker', entry: { 'my-custom-worker': baseDir + 'my-custom-worker.js', }, output: { filename: '[name].js', clean: true, path: path.resolve( projectRootPath, 'dist/workers' ), }, mode: 'production', module: { rules: [ { test: /\\.tsx?$/, exclude: /(node_modules)/, use: { loader: 'babel-loader', options: babelConfig } } ], }, resolve: { extensions: ['.tsx', '.ts', '.js', '.mjs', '.mts'] }, optimization: { moduleIds: 'deterministic', minimize: true, minimizer: [new TerserPlugin({ terserOptions: { format: { comments: false, }, }, extractComments: false, })], } }; ","version":"Next","tagName":"h2"},{"title":"One worker per database​","type":1,"pageTitle":"Worker RxStorage","url":"/rx-storage-worker.html#one-worker-per-database","content":" Each call to getRxStorageWorker() will create a different worker instance so that when you have more than one RxDatabase, each database will have its own JavaScript worker process. To reuse the worker instance in more than one RxDatabase, you can store the output of getRxStorageWorker() into a variable an use that one. Reusing the worker can decrease the initial page load, but you might get slower database operations. // Call getRxStorageWorker() exactly once const workerStorage = getRxStorageWorker({ workerInput: 'path/to/worker.js' }); // use the same storage for both databases. const databaseOne = await createRxDatabase({ name: 'database-one', storage: workerStorage }); const databaseTwo = await createRxDatabase({ name: 'database-two', storage: workerStorage }); ","version":"Next","tagName":"h2"},{"title":"Passing in a Worker instance​","type":1,"pageTitle":"Worker RxStorage","url":"/rx-storage-worker.html#passing-in-a-worker-instance","content":" Instead of setting an url as workerInput, you can also specify a function that returns a new Worker instance when called. getRxStorageWorker({ workerInput: () => new Worker('path/to/worker.js') }) This can be helpful for environments where the worker is build dynamically by the bundler. For example in angular you would create a my-custom.worker.ts file that contains a custom build worker and then import it. const storage = getRxStorageWorker({ workerInput: () => new Worker(new URL('./my-custom.worker', import.meta.url)), }); //> my-custom.worker.ts import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; exposeWorkerRxStorage({ storage: getRxStorageIndexedDB() }); ","version":"Next","tagName":"h2"},{"title":"SQLite RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-sqlite.html","content":"","keywords":"","version":"Next"},{"title":"Performance comparison with other storages​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#performance-comparison-with-other-storages","content":" The SQLite storage is a bit slower compared to other Node.js based storages like the Filesystem Storage because wrapping SQLite has a bit of overhead and sending data from the JavaScript process to SQLite and backwards increases the latency. However for most hybrid apps the SQLite storage is the best option because it can leverage the SQLite version that comes already installed on the smartphones OS (iOS and android). Also for desktop electron apps it can be a viable solution because it is easy to ship SQLite together inside of the electron bundle. ","version":"Next","tagName":"h2"},{"title":"Using the SQLite RxStorage​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#using-the-sqlite-rxstorage","content":" There are two versions of the SQLite storage available for RxDB: The trial version which comes directly shipped with RxDB Core. It contains an SQLite storage that allows you to try out RxDB on devices that support SQLite, like React Native or Electron. While the trial version does pass the full RxDB storage test-suite, it is not made for production. It is not using indexes, has no attachment support, is limited to store 300 documents and fetches the whole storage state to run queries in memory. Use it for evaluation and prototypes only! The RxDB Premium 👑 version which contains the full production-ready SQLite storage. It contains a full load of performance optimizations and full query support. To use the SQLite storage you have to import getRxStorageSQLite from the RxDB Premium 👑 package and then add the correct sqliteBasics adapter depending on which sqlite module you want to use. This can then be used as storage when creating the RxDatabase. In the following you can see some examples for some of the most common SQLite packages. Trial Version RxDB Premium 👑 // Import the Trial SQLite Storage import { getRxStorageSQLiteTrial, getSQLiteBasicsNodeNative } from 'rxdb/plugins/storage-sqlite'; // Create a Storage for it, here we use the nodejs-native SQLite module // other SQLite modules can be used with a different sqliteBasics adapter import { DatabaseSync } from 'node:sqlite'; const storage = getRxStorageSQLiteTrial({ sqliteBasics: getSQLiteBasicsNodeNative(DatabaseSync) }); // Create a Database with the Storage const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: storage }); In the following, all examples are shown with the premium SQLite storage. Still they work the same with the trial version. ","version":"Next","tagName":"h2"},{"title":"SQLiteBasics​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#sqlitebasics","content":" Different SQLite libraries have different APIs to create and access the SQLite database. Therefore the library must be massaged to work with the RxDB SQlite storage. This is done in a so called SQLiteBasics interface. RxDB directly ships with a wide range of these for various SQLite libraries that are commonly used. Also creating your own one is pretty simple, check the source code of the existing ones for that. For example for the sqlite3 npm library we have the getSQLiteBasicsNode() implementation. For node:sqlite we have the getSQLiteBasicsNodeNative() implementation and so on.. ","version":"Next","tagName":"h2"},{"title":"Using the SQLite RxStorage with different SQLite libraries​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#using-the-sqlite-rxstorage-with-different-sqlite-libraries","content":" ","version":"Next","tagName":"h2"},{"title":"Usage with the sqlite3 npm package​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#usage-with-the-sqlite3-npm-package","content":" import { createRxDatabase } from 'rxdb'; import { getRxStorageSQLite, getSQLiteBasicsNode } from 'rxdb-premium/plugins/storage-sqlite'; /** * In Node.js, we use the SQLite database * from the 'sqlite' npm module. * @link https://www.npmjs.com/package/sqlite3 */ import sqlite3 from 'sqlite3'; const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: getRxStorageSQLite({ /** * Different runtimes have different interfaces to SQLite. * For example in node.js we have a callback API, * while in capacitor sqlite we have Promises. * So we need a helper object that is capable of doing the basic * sqlite operations. */ sqliteBasics: getSQLiteBasicsNode(sqlite3) }) }); ","version":"Next","tagName":"h3"},{"title":"Usage with the node:sqlite package​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#usage-with-the-node-package","content":" With Node.js version 22 and newer, you can use the "native" sqlite module that comes shipped with Node.js. import { createRxDatabase } from 'rxdb'; import { getRxStorageSQLite, getSQLiteBasicsNodeNative } from 'rxdb-premium/plugins/storage-sqlite'; import { DatabaseSync } from 'node:sqlite'; const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsNodeNative(DatabaseSync) }) }); ","version":"Next","tagName":"h3"},{"title":"Usage with Webassembly in the Browser​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#usage-with-webassembly-in-the-browser","content":" In the browser you can use the wa-sqlite package to run sQLite in Webassembly. The wa-sqlite module also allows to use persistence with IndexedDB or OPFS. Notice that in general SQLite via Webassembly is slower compared to other storages like IndexedDB or OPFS because sending data from the main thread to wasm and backwards is slow in the browser. Have a look the performance comparison. import { createRxDatabase } from 'rxdb'; import { getRxStorageSQLite, getSQLiteBasicsWasm } from 'rxdb-premium/plugins/storage-sqlite'; /** * In the Browser, we use the SQLite database * from the 'wa-sqlite' npm module. This contains the SQLite library * compiled to Webassembly * @link https://www.npmjs.com/package/wa-sqlite */ import SQLiteESMFactory from 'wa-sqlite/dist/wa-sqlite-async.mjs'; import SQLite from 'wa-sqlite'; const sqliteModule = await SQLiteESMFactory(); const sqlite3 = SQLite.Factory(module); const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsWasm(sqlite3) }) }); ","version":"Next","tagName":"h3"},{"title":"Usage with React Native​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#usage-with-react-native","content":" Install the react-native-quick-sqlite npm moduleImport getSQLiteBasicsQuickSQLite from the SQLite plugin and use it to create a RxDatabase: import { createRxDatabase } from 'rxdb'; import { getRxStorageSQLite, getSQLiteBasicsQuickSQLite } from 'rxdb-premium/plugins/storage-sqlite'; import { open } from 'react-native-quick-sqlite'; // create database const myRxDatabase = await createRxDatabase({ name: 'exampledb', multiInstance: false, // <- Set multiInstance to false when using RxDB in React Native storage: getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsQuickSQLite(open) }) }); If react-native-quick-sqlite does not work for you, as alternative you can use the react-native-sqlite-2 library instead: import { getRxStorageSQLite, getSQLiteBasicsWebSQL } from 'rxdb-premium/plugins/storage-sqlite'; import SQLite from 'react-native-sqlite-2'; const storage = getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsWebSQL(SQLite.openDatabase) }); ","version":"Next","tagName":"h3"},{"title":"Usage with Expo SQLite​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#usage-with-expo-sqlite","content":" Notice that expo-sqlite cannot be used on android (but it works on iOS) if you use Expo SDK version 50 or older. Please update to Version 50 or newer to use it. In the latest expo SDK version, use the getSQLiteBasicsExpoSQLiteAsync() method: import { createRxDatabase } from 'rxdb'; import { getRxStorageSQLite, getSQLiteBasicsExpoSQLiteAsync } from 'rxdb-premium/plugins/storage-sqlite'; import * as SQLite from 'expo-sqlite'; const myRxDatabase = await createRxDatabase({ name: 'exampledb', multiInstance: false, storage: getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsExpoSQLiteAsync(SQLite.openDatabaseAsync) }) }); In older Expo SDK versions, you might have to use the non-async API: import { createRxDatabase } from 'rxdb'; import { getRxStorageSQLite, getSQLiteBasicsExpoSQLite } from 'rxdb-premium/plugins/storage-sqlite'; import { openDatabase } from 'expo-sqlite'; const myRxDatabase = await createRxDatabase({ name: 'exampledb', multiInstance: false, storage: getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsExpoSQLite(openDatabase) }) }); ","version":"Next","tagName":"h3"},{"title":"Usage with SQLite Capacitor​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#usage-with-sqlite-capacitor","content":" Install the sqlite capacitor npm moduleAdd the iOS database location to your capacitor config { "plugins": { "CapacitorSQLite": { "iosDatabaseLocation": "Library/CapacitorDatabase" } } } Use the function getSQLiteBasicsCapacitor to get the capacitor sqlite wrapper. import { createRxDatabase } from 'rxdb'; import { getRxStorageSQLite, getSQLiteBasicsCapacitor } from 'rxdb-premium/plugins/storage-sqlite'; /** * Import SQLite from the capacitor plugin. */ import { CapacitorSQLite, SQLiteConnection } from '@capacitor-community/sqlite'; import { Capacitor } from '@capacitor/core'; const sqlite = new SQLiteConnection(CapacitorSQLite); const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: getRxStorageSQLite({ /** * Different runtimes have different interfaces to SQLite. * For example in node.js we have a callback API, * while in capacitor sqlite we have Promises. * So we need a helper object that is capable of doing the basic * sqlite operations. */ sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor) }) }); ","version":"Next","tagName":"h3"},{"title":"Usage with Tauri SQLite​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#usage-with-tauri-sqlite","content":" Add the Tauri SQL plugin to your Tauri project.Make sure to add sqlite as your database engine by running cargo add tauri-plugin-sql --features sqlite inside src-tauri.Use the getSQLiteBasicsTauri function to get the Tauri SQLite wrapper. import { createRxDatabase } from 'rxdb'; import { getRxStorageSQLite, getSQLiteBasicsTauri } from 'rxdb/plugins/storage-sqlite'; import sqlite3 from '@tauri-apps/plugin-sql'; const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsTauri(sqlite3) }) }); ","version":"Next","tagName":"h3"},{"title":"Database Connection​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#database-connection","content":" If you need to access the database connection for any reason you can use getDatabaseConnection to do so: import { getDatabaseConnection } from 'rxdb-premium/plugins/storage-sqlite' It has the following signature: getDatabaseConnection( sqliteBasics: SQLiteBasics<any>, databaseName: string ): Promise<SQLiteDatabaseClass>; ","version":"Next","tagName":"h2"},{"title":"Known Problems of SQLite in JavaScript apps​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#known-problems-of-sqlite-in-javascript-apps","content":" Some JavaScript runtimes do not contain a Buffer API which is used by SQLite to store binary attachments data as BLOB. You can set storeAttachmentsAsBase64String: true if you want to store the attachments data as base64 string instead. This increases the database size but makes it work even without having a Buffer. The SQlite RxStorage works on SQLite libraries that use SQLite in version 3.38.0 (2022-02-22) or newer, because it uses the SQLite JSON methods like JSON_EXTRACT. If you get an error like [Error: no such function: JSON_EXTRACT (code 1 SQLITE_ERROR[1]), you might have a too old version of SQLite. To debug all SQL operations, you can pass a log function to getRxStorageSQLite() like this. This does not work with the trial version: const storage = getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor), // pass log function log: console.log.bind(console) }); By default, all tables will be created with the WITHOUT ROWID flag. Some tools like drizzle do not support tables with that option. You can disable it by setting withoutRowId: false when calling getRxStorageSQLite(): const storage = getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor), withoutRowId: false }); ","version":"Next","tagName":"h2"},{"title":"Related​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#related","content":" React Native Databases ","version":"Next","tagName":"h2"},{"title":"Third Party Plugins","type":0,"sectionRef":"#","url":"/third-party-plugins.html","content":"Third Party Plugins rxdb-hooks A set of hooks to integrate RxDB into react applications.rxdb-flexsearch The full text search for RxDB using FlexSearch.rxdb-orion Enables replication with Laravel Orion.rxdb-supabase Enables replication with Supabase.rxdb-utils Additional features for RxDB like models, timestamps, default values, view and more.loki-async-reference-adapter Simple async adapter for LokiJS, suitable to use RxDB's Lokijs RxStorage with React Native.","keywords":"","version":"Next"},{"title":"Schema validation","type":0,"sectionRef":"#","url":"/schema-validation.html","content":"","keywords":"","version":"Next"},{"title":"validate-ajv​","type":1,"pageTitle":"Schema validation","url":"/schema-validation.html#validate-ajv","content":" A validation-module that does the schema-validation. This one is using ajv as validator which is a bit faster. Better compliant to the jsonschema-standard but also has a bigger build-size. import { wrappedValidateAjvStorage } from 'rxdb/plugins/validate-ajv'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; // wrap the validation around the main RxStorage const storage = wrappedValidateAjvStorage({ storage: getRxStorageLocalstorage() }); const db = await createRxDatabase({ name: randomCouchString(10), storage }); ","version":"Next","tagName":"h3"},{"title":"validate-z-schema​","type":1,"pageTitle":"Schema validation","url":"/schema-validation.html#validate-z-schema","content":" Both is-my-json-valid and validate-ajv use eval() to perform validation which might not be wanted when 'unsafe-eval' is not allowed in Content Security Policies. This one is using z-schema as validator which doesn't use eval. import { wrappedValidateZSchemaStorage } from 'rxdb/plugins/validate-z-schema'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; // wrap the validation around the main RxStorage const storage = wrappedValidateZSchemaStorage({ storage: getRxStorageLocalstorage() }); const db = await createRxDatabase({ name: randomCouchString(10), storage }); ","version":"Next","tagName":"h3"},{"title":"validate-is-my-json-valid​","type":1,"pageTitle":"Schema validation","url":"/schema-validation.html#validate-is-my-json-valid","content":" WARNING: The is-my-json-valid validation is no longer supported until this bug is fixed. The validate-is-my-json-valid plugin uses is-my-json-valid for schema validation. import { wrappedValidateIsMyJsonValidStorage } from 'rxdb/plugins/validate-is-my-json-valid'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; // wrap the validation around the main RxStorage const storage = wrappedValidateIsMyJsonValidStorage({ storage: getRxStorageLocalstorage() }); const db = await createRxDatabase({ name: randomCouchString(10), storage }); ","version":"Next","tagName":"h3"},{"title":"Custom Formats​","type":1,"pageTitle":"Schema validation","url":"/schema-validation.html#custom-formats","content":" The schema validators provide methods to add custom formats like a email format. You have to add these formats before you create your database. ","version":"Next","tagName":"h2"},{"title":"Ajv Custom Format​","type":1,"pageTitle":"Schema validation","url":"/schema-validation.html#ajv-custom-format","content":" import { getAjv } from 'rxdb/plugins/validate-ajv'; const ajv = getAjv(); ajv.addFormat('email', { type: 'string', validate: v => v.includes('@') // ensure email fields contain the @ symbol }); ","version":"Next","tagName":"h3"},{"title":"Z-Schema Custom Format​","type":1,"pageTitle":"Schema validation","url":"/schema-validation.html#z-schema-custom-format","content":" import { ZSchemaClass } from 'rxdb/plugins/validate-z-schema'; ZSchemaClass.registerFormat('email', function (v: string) { return v.includes('@'); // ensure email fields contain the @ symbol }); ","version":"Next","tagName":"h3"},{"title":"Performance comparison of the validators​","type":1,"pageTitle":"Schema validation","url":"/schema-validation.html#performance-comparison-of-the-validators","content":" The RxDB team ran performance benchmarks using two storage options on an Ubuntu 24.04 machine with Chrome version 131.0.6778.85. The testing machine has 32 core 13th Gen Intel(R) Core(TM) i9-13900HX CPU. IndexedDB Storage (based on the IndexedDB API in the browser): IndexedDB Storage\tTime to First insert\tInsert 3000 documentsno validator\t68 ms\t213 ms ajv\t67 ms\t216 ms z-schema\t71 ms\t230 ms Memory Storage: stores everything in memory for extremely fast reads and writes, with no persistence by default. Often used with the RxDB memory-mapped plugin that processes data in memory an later persists to disc in background: Memory Storage\tTime to First insert\tInsert 3000 documentsno validator\t1.15 ms\t0.8 ms ajv\t3.05 ms\t2.7 ms z-schema\t0.9 ms\t18 ms Including a validator library also increases your JavaScript bundle size. Here's how it breaks down (minified + gzip): Build Size (minified+gzip)\tBuild Size (IndexedDB)\tBuild Size (memory)no validator\t73103 B\t39976 B ajv\t106135 B\t72773 B z-schema\t125186 B\t91882 B ","version":"Next","tagName":"h2"},{"title":"Why IndexedDB is slow and what to use instead","type":0,"sectionRef":"#","url":"/slow-indexeddb.html","content":"","keywords":"","version":"Next"},{"title":"Batched Cursor​","type":1,"pageTitle":"Why IndexedDB is slow and what to use instead","url":"/slow-indexeddb.html#batched-cursor","content":" With IndexedDB 2.0, new methods were introduced which can be utilized to improve performance. With the getAll() method, a faster alternative to the old openCursor() can be created which improves performance when reading data from the IndexedDB store. Lets say we want to query all user documents that have an age greater than 25 out of the store. To implement a fast batched cursor that only needs calls to getAll() and not to getAllKeys(), we first need to create an age index that contains the primary id as last field. myIndexedDBObjectStore.createIndex( 'age-index', [ 'age', 'id' ] ); This is required because the age field is not unique, and we need a way to checkpoint the last returned batch so we can continue from there in the next call to getAll(). const maxAge = 25; let result = []; const tx: IDBTransaction = db.transaction([storeName], 'readonly', TRANSACTION_SETTINGS); const store = tx.objectStore(storeName); const index = store.index('age-index'); let lastDoc; let done = false; /** * Run the batched cursor until all results are retrieved * or the end of the index is reached. */ while (done === false) { await new Promise((res, rej) => { const range = IDBKeyRange.bound( /** * If we have a previous document as checkpoint, * we have to continue from it's age and id values. */ [ lastDoc ? lastDoc.age : -Infinity, lastDoc ? lastDoc.id : -Infinity, ], [ maxAge + 0.00000001, String.fromCharCode(65535) ], true, false ); const openCursorRequest = index.getAll(range, batchSize); openCursorRequest.onerror = err => rej(err); openCursorRequest.onsuccess = e => { const subResult: TestDocument[] = e.target.result; lastDoc = lastOfArray(subResult); if (subResult.length === 0) { done = true; } else { result = result.concat(subResult); } res(); }; }); } console.dir(result); As the performance test results show, using a batched cursor can give a huge improvement. Interestingly choosing a high batch size is important. When you known that all results of a given IDBKeyRange are needed, you should not set a batch size at all and just directly query all documents via getAll(). RxDB uses batched cursors in the IndexedDB RxStorage. ","version":"Next","tagName":"h2"},{"title":"IndexedDB Sharding​","type":1,"pageTitle":"Why IndexedDB is slow and what to use instead","url":"/slow-indexeddb.html#indexeddb-sharding","content":" Sharding is a technique, normally used in server side databases, where the database is partitioned horizontally. Instead of storing all documents at one table/collection, the documents are split into so called shards and each shard is stored on one table/collection. This is done in server side architectures to spread the load between multiple physical servers which increases scalability. When you use IndexedDB in a browser, there is of course no way to split the load between the client and other servers. But you can still benefit from sharding. Partitioning the documents horizontally into multiple IndexedDB stores, has shown to have a big performance improvement in write- and read operations while only increasing initial pageload slightly. As shown in the performance test results, sharding should always be done by IDBObjectStore and not by database. Running a batched cursor over the whole dataset with 10 store shards in parallel is about 28% faster then running it over a single store. Initialization time increases minimal from 9 to 17 milliseconds. Getting a quarter of the dataset by batched iterating over an index, is even 43% faster with sharding then when a single store is queried. As downside, getting 10k documents by their id is slower when it has to run over the shards. Also it can be much effort to recombined the results from the different shards into the required query result. When a query without a limit is done, the sharding method might cause a data load huge overhead. Sharding can be used with RxDB with the Sharding Plugin. ","version":"Next","tagName":"h2"},{"title":"Custom Indexes​","type":1,"pageTitle":"Why IndexedDB is slow and what to use instead","url":"/slow-indexeddb.html#custom-indexes","content":" Indexes improve the query performance of IndexedDB significant. Instead of fetching all data from the storage when you search for a subset of it, you can iterate over the index and stop iterating when all relevant data has been found. For example to query for all user documents that have an age greater than 25, you would create an age+id index. To be able to run a batched cursor over the index, we always need our primary key (id) as the last index field. Instead of doing this, you can use a custom index which can improve the performance. The custom index runs over a helper field ageIdCustomIndex which is added to each document on write. Our index now only contains a single string field instead of two (age-number and id-string). // On document insert add the ageIdCustomIndex field. const idMaxLength = 20; // must be known to craft a custom index docData.ageIdCustomIndex = docData.age + docData.id.padStart(idMaxLength, ' '); store.put(docData); // ... // normal index myIndexedDBObjectStore.createIndex( 'age-index', [ 'age', 'id' ] ); // custom index myIndexedDBObjectStore.createIndex( 'age-index-custom', [ 'ageIdCustomIndex' ] ); To iterate over the index, you also use a custom crafted keyrange, depending on the last batched cursor checkpoint. Therefore the maxLength of id must be known. // keyrange for normal index const range = IDBKeyRange.bound( [25, ''], [Infinity, Infinity], true, false ); // keyrange for custom index const range = IDBKeyRange.bound( // combine both values to a single string 25 + ''.padStart(idMaxLength, ' '), Infinity, true, false ); As shown, using a custom index can further improve the performance of running a batched cursor by about 10%. Another big benefit of using custom indexes, is that you can also encode boolean values in them, which cannot be done with normal IndexedDB indexes. RxDB uses custom indexes in the IndexedDB RxStorage. ","version":"Next","tagName":"h2"},{"title":"Relaxed durability​","type":1,"pageTitle":"Why IndexedDB is slow and what to use instead","url":"/slow-indexeddb.html#relaxed-durability","content":" Chromium based browsers allow to set durability to relaxed when creating an IndexedDB transaction. Which runs the transaction in a less secure durability mode, which can improve the performance. The user agent may consider that the transaction has successfully committed as soon as all outstanding changes have been written to the operating system, without subsequent verification. As shown here, using the relaxed durability mode can improve performance slightly. The best performance improvement could be measured when many small transactions have to be run. Less, bigger transaction do not benefit that much. ","version":"Next","tagName":"h2"},{"title":"Explicit transaction commits​","type":1,"pageTitle":"Why IndexedDB is slow and what to use instead","url":"/slow-indexeddb.html#explicit-transaction-commits","content":" By explicitly committing a transaction, another slight performance improvement can be achieved. Instead of waiting for the browser to commit an open transaction, we call the commit() method to explicitly close it. // .commit() is not available on all browsers, so first check if it exists. if (transaction.commit) { transaction.commit() } The improvement of this technique is minimal, but observable as these tests show. ","version":"Next","tagName":"h2"},{"title":"In-Memory on top of IndexedDB​","type":1,"pageTitle":"Why IndexedDB is slow and what to use instead","url":"/slow-indexeddb.html#in-memory-on-top-of-indexeddb","content":" To prevent transaction handling and to fix the performance problems, we need to stop using IndexedDB as a database. Instead all data is loaded into the memory on the initial page load. Here all reads and writes happen in memory which is about 100x faster. Only some time after a write occurred, the memory state is persisted into IndexedDB with a single write transaction. In this scenario IndexedDB is used as a filesystem, not as a database. There are some libraries that already do that: LokiJS with the IndexedDB AdapterAbsurd-SQLSQL.js with the empscripten Filesystem APIDuckDB Wasm ","version":"Next","tagName":"h2"},{"title":"In-Memory: Persistence​","type":1,"pageTitle":"Why IndexedDB is slow and what to use instead","url":"/slow-indexeddb.html#in-memory-persistence","content":" One downside of not directly using IndexedDB, is that your data is not persistent all the time. And when the JavaScript process exists without having persisted to IndexedDB, data can be lost. To prevent this from happening, we have to ensure that the in-memory state is written down to the disc. One point is make persisting as fast as possible. LokiJS for example has the incremental-indexeddb-adapter which only saves new writes to the disc instead of persisting the whole state. Another point is to run the persisting at the correct point in time. For example the RxDB LokiJS storage persists in the following situations: When the database is idle and no write or query is running. In that time we can persist the state if any new writes appeared before.When the window fires the beforeunload event we can assume that the JavaScript process is exited any moment and we have to persist the state. After beforeunload there are several seconds time which are sufficient to store all new changes. This has shown to work quite reliable. The only missing event that can happen is when the browser exists unexpectedly like when it crashes or when the power of the computer is shut of. ","version":"Next","tagName":"h3"},{"title":"In-Memory: Multi Tab Support​","type":1,"pageTitle":"Why IndexedDB is slow and what to use instead","url":"/slow-indexeddb.html#in-memory-multi-tab-support","content":" One big difference between a web application and a 'normal' app, is that your users can use the app in multiple browser tabs at the same time. But when you have all database state in memory and only periodically write it to disc, multiple browser tabs could overwrite each other and you would loose data. This might not be a problem when you rely on a client-server replication, because the lost data might already be replicated with the backend and therefore with the other tabs. But this would not work when the client is offline. The ideal way to solve that problem, is to use a SharedWorker. A SharedWorker is like a WebWorker that runs its own JavaScript process only that the SharedWorker is shared between multiple contexts. You could create the database in the SharedWorker and then all browser tabs could request the Worker for data instead of having their own database. But unfortunately the SharedWorker API does not work in all browsers. Safari dropped its support and InternetExplorer or Android Chrome, never adopted it. Also it cannot be polyfilled. UPDATE:Apple added SharedWorkers back in Safari 142 Instead, we could use the BroadcastChannel API to communicate between tabs and then apply a leader election between them. The leader election ensures that, no matter how many tabs are open, always one tab is the Leader. The disadvantage is that the leader election process takes some time on the initial page load (about 150 milliseconds). Also the leader election can break when a JavaScript process is fully blocked for a longer time. When this happens, a good way is to just reload the browser tab to restart the election process. ","version":"Next","tagName":"h3"},{"title":"Further read​","type":1,"pageTitle":"Why IndexedDB is slow and what to use instead","url":"/slow-indexeddb.html#further-read","content":" Offline First Database ComparisonSpeeding up IndexedDB reads and writesSQLITE ON THE WEB: ABSURD-SQLSQLite in a PWA with FileSystemAccessAPIResponse to this article by Oren Eini ","version":"Next","tagName":"h2"},{"title":"Transactions, Conflicts and Revisions","type":0,"sectionRef":"#","url":"/transactions-conflicts-revisions.html","content":"","keywords":"","version":"Next"},{"title":"Why RxDB does not have transactions​","type":1,"pageTitle":"Transactions, Conflicts and Revisions","url":"/transactions-conflicts-revisions.html#why-rxdb-does-not-have-transactions","content":" When talking about transactions, we mean ACID transactions that guarantee the properties of atomicity, consistency, isolation and durability. With an ACID transaction you can mutate data dependent on the current state of the database. It is ensured that no other database operations happen in between your transaction and after the transaction has finished, it is guaranteed that the new data is actually written to the disc. To implement ACID transactions on a single server, the database has to keep track on who is running transactions and then schedule these transactions so that they can run in isolation. As soon as you have to split your database on multiple servers, transaction handling becomes way more difficult. The servers have to communicate with each other to find a consensus about which transaction can run and which has to wait. Network connections might break, or one server might complete its part of the transaction and then be required to roll back its changes because of an error on another server. But with RxDB you have multiple clients that can go randomly online or offline. The users can have different devices and the clock of these devices can go off by any time. To support ACID transactions here, RxDB would have to make the whole world stand still for all clients, while one client is doing a write operation. And even that can only work when all clients are online. Implementing that might be possible, but at the cost of an unpredictable amount of performance loss and not being able to support offline-first. A single write operation to a document is the only atomic thing you can do in RxDB. The benefits of not having to support transactions: Clients can read and write data without blocking each other.Clients can write data while being offline and then replicate with a server when they are online again, called offline-first.Creating a compatible backend for the replication is easy so that RxDB can replicate with any existing infrastructure.Optimizations like Sharding can be used. ","version":"Next","tagName":"h2"},{"title":"Revisions​","type":1,"pageTitle":"Transactions, Conflicts and Revisions","url":"/transactions-conflicts-revisions.html#revisions","content":" Working without transactions leads to having undefined state when doing multiple database operations at the same time. Most client side databases rely on a last-write-wins strategy on write operations. This might be a viable solution for some cases, but often this leads to strange problems that are hard to debug. Instead, to ensure that the behavior of RxDB is always predictable, RxDB relies on revisions for version control. Revisions work similar to Lamport Clocks. Each document is stored together with its revision string, that looks like 1-9dcca3b8e1a and consists of: The revision height, a number that starts with 1 and is increased with each write to that document.The database instance token. An operation to the RxDB data layer does not only contain the new document data, but also the previous document data with its revision string. If the previous revision matches the revision that is currently stored in the database, the write operation can succeed. If the previous revision is different than the revision that is currently stored in the database, the operation will throw a 409 CONFLICT error. ","version":"Next","tagName":"h2"},{"title":"Conflicts​","type":1,"pageTitle":"Transactions, Conflicts and Revisions","url":"/transactions-conflicts-revisions.html#conflicts","content":" There are two types of conflicts in RxDB, the local conflict and the replication conflict. ","version":"Next","tagName":"h2"},{"title":"Local conflicts​","type":1,"pageTitle":"Transactions, Conflicts and Revisions","url":"/transactions-conflicts-revisions.html#local-conflicts","content":" A local conflict can happen when a write operation assumes a different previous document state, than what is currently stored in the database. This can happen when multiple parts of your application do simultaneous writes to the same document. This can happen on a single browser tab, or when multiple tabs write at once or when a write appears while the document gets replicated from a remote server replication. When a local conflict appears, RxDB will throw a 409 CONFLICT error. The calling code must then handle the error properly, depending on the application logic. Instead of handling local conflicts, in most cases it is easier to ensure that they cannot happen, by using incremental database operations like incrementalModify(), incrementalPatch() or incrementalUpsert(). These write operations have a built-in way to handle conflicts by re-applying the mutation functions to the conflicting document state. ","version":"Next","tagName":"h3"},{"title":"Replication conflicts​","type":1,"pageTitle":"Transactions, Conflicts and Revisions","url":"/transactions-conflicts-revisions.html#replication-conflicts","content":" A replication conflict appears when multiple clients write to the same documents at once and these documents are then replicated to the backend server. When you replicate with the Graphql replication and the replication primitives, RxDB assumes that conflicts are detected and resolved at the client side. When a document is send to the backend and the backend detected a conflict (by comparing revisions or other properties), the backend will respond with the actual document state so that the client can compare this with the local document state and create a new, resolved document state that is then pushed to the server again. You can read more about the replication conflicts here. ","version":"Next","tagName":"h2"},{"title":"Custom conflict handler​","type":1,"pageTitle":"Transactions, Conflicts and Revisions","url":"/transactions-conflicts-revisions.html#custom-conflict-handler","content":" A conflict handler is an object with two JavaScript functions: Detect if two document states are equalSolve existing conflicts Because the conflict handler also is used for conflict detection, it will run many times on pull-, push- and write operations of RxDB. Most of the time it will detect that there is no conflict and then return. Lets have a look at the default conflict handler of RxDB to learn how to create a custom one: import { deepEqual } from 'rxdb/plugins/utils'; export const defaultConflictHandler: RxConflictHandler<any> = { isEqual(a, b) { /** * isEqual() is used to detect conflicts or to detect if a * document has to be pushed to the remote. * If the documents are deep equal, * we have no conflict. * Because deepEqual is CPU expensive, on your custom conflict handler you might only * check some properties, like the updatedAt time or revisions * for better performance. */ return deepEqual(a, b); }, resolve(i) { /** * The default conflict handler will always * drop the fork state and use the master state instead. * * In your custom conflict handler you likely want to merge properties * of the realMasterState and the newDocumentState instead. */ return i.realMasterState; } }; To overwrite the default conflict handler, you have to specify a custom conflictHandler property when creating a collection with addCollections(). const myCollections = await myDatabase.addCollections({ // key = collectionName humans: { schema: mySchema, conflictHandler: myCustomConflictHandler } }); ","version":"Next","tagName":"h2"},{"title":"Using RxDB with TypeScript","type":0,"sectionRef":"#","url":"/tutorials/typescript.html","content":"","keywords":"","version":"Next"},{"title":"Using the types​","type":1,"pageTitle":"Using RxDB with TypeScript","url":"/tutorials/typescript.html#using-the-types","content":" Now that we have declare all our types, we can use them. /** * create database and collections */ const myDatabase: MyDatabase = await createRxDatabase<MyDatabaseCollections>({ name: 'mydb', storage: getRxStorageLocalstorage() }); const heroSchema: RxJsonSchema<HeroDocType> = { title: 'human schema', description: 'describes a human being', version: 0, keyCompression: true, primaryKey: 'passportId', type: 'object', properties: { passportId: { type: 'string' }, firstName: { type: 'string' }, lastName: { type: 'string' }, age: { type: 'integer' } }, required: ['passportId', 'firstName', 'lastName'] }; const heroDocMethods: HeroDocMethods = { scream: function(this: HeroDocument, what: string) { return this.firstName + ' screams: ' + what.toUpperCase(); } }; const heroCollectionMethods: HeroCollectionMethods = { countAllDocuments: async function(this: HeroCollection) { const allDocs = await this.find().exec(); return allDocs.length; } }; await myDatabase.addCollections({ heroes: { schema: heroSchema, methods: heroDocMethods, statics: heroCollectionMethods } }); // add a postInsert-hook myDatabase.heroes.postInsert( function myPostInsertHook( this: HeroCollection, // own collection is bound to the scope docData: HeroDocType, // documents data doc: HeroDocument // RxDocument ) { console.log('insert to ' + this.name + '-collection: ' + doc.firstName); }, false // not async ); /** * use the database */ // insert a document const hero: HeroDocument = await myDatabase.heroes.insert({ passportId: 'myId', firstName: 'piotr', lastName: 'potter', age: 5 }); // access a property console.log(hero.firstName); // use a orm method hero.scream('AAH!'); // use a static orm method from the collection const amount: number = await myDatabase.heroes.countAllDocuments(); console.log(amount); /** * clean up */ myDatabase.close(); ","version":"Next","tagName":"h2"},{"title":"Why UI applications need NoSQL","type":0,"sectionRef":"#","url":"/why-nosql.html","content":"","keywords":"","version":"Next"},{"title":"Transactions do not work with humans involved​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#transactions-do-not-work-with-humans-involved","content":" On the server side, transactions are used to run steps of logic inside of a self contained unit of work. The database system ensures that multiple transactions do not run in parallel or interfere with each other. This works well because on the server side you can predict how longer everything takes. It can be ensured that one transaction does not block everything else for too long which would make the system not responding anymore to other requests. When you build a UI based application that is used by a real human, you can no longer predict how long anything takes. The user clicks the edit button and expects to not have anyone else change the document while the user is in edit mode. Using a transaction to ensure nothing is changed in between, is not an option because the transaction could be open for a long time and other background tasks, like replication, would no longer work. So whenever a human is involved, this kind of logic has to be implemented using other strategies. Most NoSQL databases like RxDB or CouchDB use a system based on revision and conflicts to handle these. ","version":"Next","tagName":"h2"},{"title":"Transactions do not work with offline-first​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#transactions-do-not-work-with-offline-first","content":" When you want to build an offline-first application, it is assumed that the user can also read and write data, even when the device has lost the connection to the backend. You could use database transactions on writes to the client's database state, but enforcing a transaction boundary across other instances like clients or servers, is not possible when there is no connection. On the client you could run an update query where all color: red rows are changed to color: blue, but this would not guarantee that there will still be other red documents when the client goes online again and restarts the replication with the server. UPDATE docs SET docs.color = 'red' WHERE docs.color = 'blue'; ","version":"Next","tagName":"h2"},{"title":"Relational queries in NoSQL​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#relational-queries-in-nosql","content":" What most people want from a relational database, is to run queries over multiple tables. Some people think that they cannot do that with NoSQL, so let me explain. Let's say you have two tables with customers and cities where each city has an id and each customer has a city_id. You want to get every customer that resides in Tokyo. With SQL, you would use a query like this: SELECT * FROM city WHERE city.name = 'Tokyo' LEFT JOIN customer ON customer.city_id = city.id; With NoSQL you can just do the same, but you have to write it manually: const cityDocument = await db.cities.findOne().where('name').equals('Tokyo').exec(); const customerDocuments = await db.customers.find().where('city_id').equals(cityDocument.id).exec(); So what are the differences? The SQL version would run faster on a remote database server because it would aggregate all data there and return only the customers as result set. But when you have a local database, it is not really a difference. Querying the two tables by hand would have about the same performance as a JavaScript implementation of SQL that is running locally. The main benefit from using SQL is, that the SQL query runs inside of a single transaction. When a change to one of our two tables happens, while our query runs, the SQL database will ensure that the write does not affect the result of the query. This could happen with NoSQL, while you retrieve the city document, the customer table gets changed and your result is not correct for the dataset that was there when you started the querying. As a workaround, you could observe the database for changes and if a change happened in between, you have to re-run everything. ","version":"Next","tagName":"h2"},{"title":"Reliable replication​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#reliable-replication","content":" In an offline first app, your data is replicated from your backend servers to your users and you want it to be reliable. The replication is reliable when, no matter what happens, every online client is able to run a replication and end up with the exact same database state as any other client. Implementing a reliable replication protocol is hard because of the circumstances of your app: Your users have unknown devices.They have an unknown internet speed.They can go offline or online at any time.Clients can be offline for a several days with un-synced changes.You can have many users at the same time.The users can do many database writes at the same time to the same entities. Now lets say you have a SQL database and one of your users, called Alice, runs a query that mutates some rows, based on a condition. # mark all items out of stock as inStock=FALSE UPDATE Table_A SET Table_A.inStock = FALSE FROM Table_A WHERE Table_A.amountInStock = 0 At first, the query runs on the local database of Alice and everything is fine. But at the same time Bob, the other client, updates a row and sets amountInStock from 0 to 1. Now Bob's client replicates the changes from Alice and runs them. Bob will end up with a different database state than Alice because on one of the rows, the WHERE condition was not met. This is not what we want, so our replication protocol should be able to fix it. For that it has to reduce all mutations into a deterministic state. Let me loosely describe how "many" SQL replications work: Instead of just running all replicated queries, we remember a list of all past queries. When a new query comes in that happened before our last query, we roll back the previous queries, run the new query, and then re-execute our own queries on top of that. For that to work, all queries need a timestamp so we can order them correctly. But you cannot rely on the clock that is running at the client. Client side clocks drift, they can run in a different speed or even a malicious client modifies the clock on purpose. So instead of a normal timestamp, we have to use a Hybrid Logical Clock that takes a client generated id and the number of the clients query into account. Our timestamp will then look like 2021-10-04T15:29.40.273Z-0000-eede1195b7d94dd5. These timestamps can be brought into a deterministic order and each client can run the replicated queries in the same order. While this sounds easy and realizable, we have some problems: This kind of replication works great when you replicate between multiple SQL servers. It does not work great when you replicate between a single server and many clients. As mentioned above, clients can be offline for a long time which could require us to do many and heavy rollbacks on each client when someone comes back after a long time and replicates the change.We have many clients where many changes can appear and our database would have to roll back many times.During the rollback, the database cannot be used for read queries.It is required that each client downloads and keeps the whole query history. With NoSQL, replication works different. A new client downloads all current documents and each time a document changes, that document is downloaded again. Instead of replicating the query that leads to a data change, we just replicate the changed data itself. Of course, we could do the same with SQL and just replicate the affected rows of a query, like WatermelonDB does it. This was a clever way to go for WatermelonDB, because it was initially made for React Native and did want to use the fast SQLite instead of the slow AsyncStorage. But in a more general view, it defeats the whole purpose of having a replicating relational database because you have transactions locally, but these transactions become meaningless as soon as the data goes through the replication layer. ","version":"Next","tagName":"h2"},{"title":"Server side validation​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#server-side-validation","content":" Whenever there is client-side input, it must be validated on the server. On a NoSQL database, validating a changed document is trivial. The client sends the changed document to the server, and the server can then check if the user was allowed to modify that one document and if the applied changes are ok. Safely validating a SQL query is up to impossible. You first need a way to parse the query with all this complex SQL syntax and keywords.You have to ensure that the query does not DOS your system.Then you check which rows would be affected when running the query and if the user was allowed to change themThen you check if the mutation to that rows are valid. For simple queries like an insert/update/delete to a single row, this might be doable. But a query with 4 LEFT JOIN will be hard. ","version":"Next","tagName":"h2"},{"title":"Event optimization​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#event-optimization","content":" With NoSQL databases, each write event always affects exactly one document. This makes it easy to optimize the processing of events at the client. For example instead of handling multiple updates to the same document, when the user comes online again, you could skip everything but the last event. Similar to that you can optimize observable query results. When you query the customers table you get a query result of 10 customers. Now a new customer is added to the table and you want to know how the new query results look like. You could analyze the event and now you know that you only have to add the new customer to the previous results set, instead of running the whole query again. These types of optimizations can be run with all NoSQL queries and even work with limit and skip operators. In RxDB this all happens in the background with the EventReduce algorithm that calculates new query results on incoming changes. These optimizations do not really work with relational data. A change to one table could affect a query to any other tables. and you could not just calculate the new results based on the event. You would always have to re-run the full query to get the updated results. ","version":"Next","tagName":"h2"},{"title":"Migration without relations​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#migration-without-relations","content":" Sooner or later you change the layout of your data. You update the schema and you also have to migrate the stored rows/documents. In NoSQL this is often not a big deal because all of your documents are modeled as self containing piece of data. There is an old version of the document and you have a function that transforms it into the new version. With relational data, nothing is self-contained. The relevant data for the migration of a single row could be inside any other table. So when changing the schema, it will be important which table to migrate first and how to orchestrate the migration or relations. On client side applications, this is even harder because the client can close the application at any time and the migration must be able to continue. ","version":"Next","tagName":"h2"},{"title":"Everything can be downgraded to NoSQL​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#everything-can-be-downgraded-to-nosql","content":" To use an offline first database in the frontend, you have to make it compatible with your backend APIs. Making software things compatible often means you have to find the lowest common denominator. When you have SQLite in the frontend and want to replicate it with the backend, the backend also has to use SQLite. You cannot even use PostgreSQL because it has a different SQL dialect and some queries might fail. But you do not want to let the frontend dictate which technologies to use in the backend just to make replication work. With NoSQL, you just have documents and writes to these documents. You can build a document based layer on top of everything by removing functionality. It can be built on top of SQL, but also on top of a graph database or even on top of a key-value store like levelDB or FoundationDB. With that document layer you can build a Sync Engine that serves documents sorted by the last update time and there you have a realtime replication. ","version":"Next","tagName":"h2"},{"title":"Caching query results​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#caching-query-results","content":" Memory is limited and this is especially true for client side applications where you never know how much free RAM the device really has. You want to have a fast realtime UI, so your database must be able to cache query results. When you run a SQL query like SELECT .. the result of it can be anything. An array, a number, a string, a single row, it depends on how the query goes on. So the caching strategy can only be to keep the result in memory, once for each query. This scales very bad because the more queries you run, the more results you have to store in memory. When you make a query to a NoSQL collection, you always know how the result will look like. It is a list of documents, based on the collection's schema (if you have one). The result set is stored in memory, but because you get similar documents for different queries to the same collection, we can de-duplicated the documents. So when multiple queries return the same document, we only have it in the cache once and each query caches point to the same memory object. So no matter how many queries you make, your cache maximum is the collection size. ","version":"Next","tagName":"h2"},{"title":"TypeScript support​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#typescript-support","content":" Modern web apps are build with TypeScript and you want the transpiler to know the types of your query result so it can give you build time errors when something does not match. This is quite easy on document based systems. The typings of for each document of a collection can be generated from the schema, and all queries to that collection will always return the given document type. With SQL you have to manually write the typings for each query by hand because it can contain all these aggregate functions that affect the type of the query's result. ","version":"Next","tagName":"h2"},{"title":"What you lose with NoSQL​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#what-you-lose-with-nosql","content":" You can not run relational queries across tables inside a single transaction.You can not mutate documents based on a WHERE clause, in a single transaction.You need to resolve replication conflicts on a per-document basis. ","version":"Next","tagName":"h2"},{"title":"But there is database XY​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#but-there-is-database-xy","content":" Yes, there are SQL databases out there that run on the client side or have replication, but not both. WebSQL / sql.js: In the past there was WebSQL in the browser. It was a direct mapping to SQLite because all browsers used the SQLite implementation. You could store relational data in it, but there was no concept of replication at any point in time. sql.js is an SQLite complied to JavaScript. It has not replication and it has (for now) no persistent storage, everything is stored in memory.WatermelonDB is a SQL databases that runs in the client. WatermelonDB uses a document-based replication that is not able to replicate relational queries.Cockroach / Spanner/ PostgreSQL etc. are SQL databases with replication. But they run on servers, not on clients, so they can make different trade offs. Further read Cockroach Labs: Living Without Atomic Clocks Transactions, Conflicts and Revisions in RxDB Why MongoDB, Cassandra, HBase, DynamoDB, and Riak will only let you perform transactions on a single data item Make a PR to this file if you have more interesting links to that topic ","version":"Next","tagName":"h2"}],"options":{"excludeRoutes":["blog","releases"],"id":"default"}} \ No newline at end of file diff --git a/docs/search-doc.json b/docs/search-doc.json deleted file mode 100644 index bd3a87f577b..00000000000 --- a/docs/search-doc.json +++ /dev/null @@ -1 +0,0 @@ -{"searchDocs":[{"title":"PouchDB Adapters","type":0,"sectionRef":"#","url":"/adapters.html","content":"","keywords":"","version":"Next"},{"title":"Memory​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#memory","content":" In any environment, you can use the memory-adapter. It stores the data in the javascript runtime memory. This means it is not persistent and the data is lost when the process terminates. Use this adapter when: You want to have really good performanceYou do not want persistent state, for example in your test suite import { createRxDatabase } from 'rxdb' import { getRxStoragePouch } from 'rxdb/plugins/pouchdb'; // npm install pouchdb-adapter-memory --save addPouchPlugin(require('pouchdb-adapter-memory')); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch('memory') }); ","version":"Next","tagName":"h2"},{"title":"Memdown​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#memdown","content":" With RxDB you can also use adapters that implement abstract-leveldown like the memdown-adapter. // npm install memdown --save // npm install pouchdb-adapter-leveldb --save addPouchPlugin(require('pouchdb-adapter-leveldb')); // leveldown adapters need the leveldb plugin to work const memdown = require('memdown'); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch(memdown) // the full leveldown-module }); Browser ","version":"Next","tagName":"h2"},{"title":"IndexedDB​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#indexeddb","content":" The IndexedDB adapter stores the data inside of IndexedDB use this in browsers environments as default. // npm install pouchdb-adapter-idb --save addPouchPlugin(require('pouchdb-adapter-idb')); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch('idb') }); ","version":"Next","tagName":"h2"},{"title":"IndexedDB​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#indexeddb-1","content":" A reimplementation of the indexeddb adapter which uses native secondary indexes. Should have a much better performance but can behave different on some edge cases. note Multiple users have reported problems with this adapter. It is not recommended to use this adapter. // npm install pouchdb-adapter-indexeddb --save addPouchPlugin(require('pouchdb-adapter-indexeddb')); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch('indexeddb') }); ","version":"Next","tagName":"h2"},{"title":"Websql​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#websql","content":" This adapter stores the data inside of websql. It has a different performance behavior. Websql is deprecated. You should not use the websql adapter unless you have a really good reason. // npm install pouchdb-adapter-websql --save addPouchPlugin(require('pouchdb-adapter-websql')); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch('websql') }); NodeJS ","version":"Next","tagName":"h2"},{"title":"leveldown​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#leveldown","content":" This adapter uses a LevelDB C++ binding to store that data on the filesystem. It has the best performance compared to other filesystem adapters. This adapter can not be used when multiple nodejs-processes access the same filesystem folders for storage. // npm install leveldown --save // npm install pouchdb-adapter-leveldb --save addPouchPlugin(require('pouchdb-adapter-leveldb')); // leveldown adapters need the leveldb plugin to work const leveldown = require('leveldown'); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch(leveldown) // the full leveldown-module }); // or use a specific folder to store the data const database = await createRxDatabase({ name: '/root/user/project/mydatabase', storage: getRxStoragePouch(leveldown) // the full leveldown-module }); ","version":"Next","tagName":"h2"},{"title":"Node-Websql​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#node-websql","content":" This adapter uses the node-websql-shim to store data on the filesystem. Its advantages are that it does not need a leveldb build and it can be used when multiple nodejs-processes use the same database-files. // npm install pouchdb-adapter-node-websql --save addPouchPlugin(require('pouchdb-adapter-node-websql')); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch('websql') // the name of your adapter }); // or use a specific folder to store the data const database = await createRxDatabase({ name: '/root/user/project/mydatabase', storage: getRxStoragePouch('websql') // the name of your adapter }); React-Native ","version":"Next","tagName":"h2"},{"title":"react-native-sqlite​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#react-native-sqlite","content":" Uses ReactNative SQLite as storage. Claims to be much faster than the asyncstorage adapter. To use it, you have to do some steps from this tutorial. First install pouchdb-adapter-react-native-sqlite and react-native-sqlite-2. npm install pouchdb-adapter-react-native-sqlite react-native-sqlite-2 Then you have to link the library. react-native link react-native-sqlite-2 You also have to add some polyfills which are need but not included in react-native. npm install base-64 events import { decode, encode } from 'base-64' if (!global.btoa) { global.btoa = encode; } if (!global.atob) { global.atob = decode; } // Avoid using node dependent modules process.browser = true; Then you can use it inside of your code. import { createRxDatabase } from 'rxdb'; import { addPouchPlugin, getRxStoragePouch } from 'rxdb/plugins/pouchdb'; import SQLite from 'react-native-sqlite-2' import SQLiteAdapterFactory from 'pouchdb-adapter-react-native-sqlite' const SQLiteAdapter = SQLiteAdapterFactory(SQLite) addPouchPlugin(SQLiteAdapter); addPouchPlugin(require('pouchdb-adapter-http')); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch('react-native-sqlite') // the name of your adapter }); ","version":"Next","tagName":"h2"},{"title":"asyncstorage​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#asyncstorage","content":" Uses react-native's asyncstorage. note There are known problems with this adapter and it is not recommended to use it. // npm install pouchdb-adapter-asyncstorage --save addPouchPlugin(require('pouchdb-adapter-asyncstorage')); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch('node-asyncstorage') // the name of your adapter }); ","version":"Next","tagName":"h2"},{"title":"asyncstorage-down​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#asyncstorage-down","content":" A leveldown adapter that stores on asyncstorage. // npm install pouchdb-adapter-asyncstorage-down --save addPouchPlugin(require('pouchdb-adapter-leveldb')); // leveldown adapters need the leveldb plugin to work const asyncstorageDown = require('asyncstorage-down'); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch(asyncstorageDown) // the full leveldown-module }); Cordova / Phonegap / Capacitor ","version":"Next","tagName":"h2"},{"title":"cordova-sqlite​","type":1,"pageTitle":"PouchDB Adapters","url":"/adapters.html#cordova-sqlite","content":" Uses cordova's global cordova.sqlitePlugin. It can be used with cordova and capacitor. // npm install pouchdb-adapter-cordova-sqlite --save addPouchPlugin(require('pouchdb-adapter-cordova-sqlite')); /** * In capacitor/cordova you have to wait until all plugins are loaded and 'window.sqlitePlugin' * can be accessed. * This function waits until document deviceready is called which ensures that everything is loaded. * @link https://cordova.apache.org/docs/de/latest/cordova/events/events.deviceready.html */ export function awaitCapacitorDeviceReady(): Promise<void> { return new Promise(res => { document.addEventListener('deviceready', () => { res(); }); }); } async function getDatabase(){ // first wait until the deviceready event is fired await awaitCapacitorDeviceReady(); const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStoragePouch( 'cordova-sqlite', // pouch settings are passed as second parameter { // for ios devices, the cordova-sqlite adapter needs to know where to save the data. iosDatabaseLocation: 'Library' } ) }); } ","version":"Next","tagName":"h2"},{"title":"Alternatives for realtime offline-first JavaScript applications","type":0,"sectionRef":"#","url":"/alternatives.html","content":"","keywords":"","version":"Next"},{"title":"Alternatives to RxDB​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#alternatives-to-rxdb","content":" RxDB is an observable, replicating, local first, JavaScript database. So it makes only sense to list similar projects as alternatives, not just any database or JavaScript store library. However, I will list up some projects that RxDB is often compared with, even if it only makes sense for some use cases. Here are the alternatives to RxDB: ","version":"Next","tagName":"h2"},{"title":"Firebase​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#firebase","content":" Firebase is a platform developed by Google for creating mobile and web applications. Firebase has many features and products, two of which are client side databases. The Realtime Database and the Cloud Firestore. Firebase - Realtime Database​ The firebase realtime database was the first database in firestore. It has to be mentioned that in this context, "realtime" means "realtime replication", not "realtime computing". The firebase realtime database stores data as a big unstructured JSON tree that is replicated between clients and the backend. Firebase - Cloud Firestore​ The firestore is the successor to the realtime database. The big difference is that it behaves more like a 'normal' database that stores data as documents inside of collections. The conflict resolution strategy of firestore is always last-write-wins which might or might not be suitable for your use case. The biggest difference to RxDB is that firebase products are only able to be used on top of the Firebase cloud hosted backend, which creates a vendor lock-in. RxDB can replicate with any self hosted CouchDB server or custom GraphQL endpoints. You can even replicate Firestore to RxDB with the Firestore Replication Plugin. ","version":"Next","tagName":"h3"},{"title":"Meteor​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#meteor","content":" Meteor (since 2012) is one of the oldest technologies for JavaScript realtime applications. Meteor is not a library but a whole framework with its own package manager, database management and replication. Because of how it works, it has proven to be hard to integrate it with other modern JavaScript frameworks like angular, vue.js or svelte. Meteor uses MongoDB in the backend and can replicate with a Minimongo database in the frontend. While testing, it has proven to be impossible to make a meteor app offline first capable. There are some projects that might do this, but all are unmaintained. ","version":"Next","tagName":"h3"},{"title":"Minimongo​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#minimongo","content":" Forked in Jan 2014 from meteorJSs' minimongo package, Minimongo is a client-side, in-memory, JavaScript version of MongoDB with backend replication over HTTP. Similar to MongoDB, it stores data in documents inside of collections and also has the same query syntax. Minimongo has different storage adapters for IndexedDB, WebSQL, LocalStorage and SQLite. Compared to RxDB, Minimongo has no concept of revisions or conflict handling, which might lead to undefined behavior when used with replication or in multiple browser tabs. Minimongo has no observable queries or changestream. ","version":"Next","tagName":"h3"},{"title":"WatermelonDB​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#watermelondb","content":" WatermelonDB is a reactive & asynchronous JavaScript database. While originally made for React and React Native, it can also be used with other JavaScript frameworks. The main goal of WatermelonDB is performance within an application with lots of data. In React Native, WatermelonDB uses the provided SQLite database. Also there is an Expo plugin for WatermelonDB. In a browser, WatermelonDB uses the LokiJS in-memory database to store and query data. WatermelonDB is one of the rare projects that support both Flow and Typescript at the same time. ","version":"Next","tagName":"h3"},{"title":"AWS Amplify​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#aws-amplify","content":" AWS Amplify is a collection of tools and libraries to develop web- and mobile frontend applications. Similar to firebase, it provides everything needed like authentication, analytics, a REST API, storage and so on. Everything hosted in the AWS Cloud, even when they state that "AWS Amplify is designed to be open and pluggable for any custom backend or service". For realtime replication, AWS Amplify can connect to an AWS App-Sync GraphQL endpoint. ","version":"Next","tagName":"h3"},{"title":"AWS Datastore​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#aws-datastore","content":" Since December 2019 the Amplify library includes the AWS Datastore which is a document-based, client side database that is able to replicate data via AWS AppSync in the background. The main difference to other projects is the complex project configuration via the amplify cli and the bit confusing query syntax that works over functions. Complex Queries with multiple OR/AND statements are not possible which might change in the future. Local development is hard because the AWS AppSync mock does not support realtime replication. It also is not really offline-first because a user login is always required. // An AWS datastore OR query const posts = await DataStore.query(Post, c => c.or( c => c.rating("gt", 4).status("eq", PostStatus.PUBLISHED) )); // An AWS datastore SORT query const posts = await DataStore.query(Post, Predicates.ALL, { sort: s => s.rating(SortDirection.ASCENDING).title(SortDirection.DESCENDING) }); The biggest difference to RxDB is that you have to use the AWS cloud backends. This might not be a problem if your data is at AWS anyway. ","version":"Next","tagName":"h3"},{"title":"RethinkDB​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#rethinkdb","content":" RethinkDB is a backend database that pushed dynamic JSON data to the client in realtime. It was founded in 2009 and the company shut down in 2016. Rethink db is not a client side database, it streams data from the backend to the client which of course does not work while offline. ","version":"Next","tagName":"h3"},{"title":"Horizon​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#horizon","content":" Horizon is the client side library for RethinkDB which provides useful functions like authentication, permission management and subscription to a RethinkDB backend. Offline support never made it to horizon. ","version":"Next","tagName":"h3"},{"title":"Supabase​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#supabase","content":" Supabase labels itself as "an open source Firebase alternative". It is a collection of open source tools that together mimic many Firebase features, most of them by providing a wrapper around a PostgreSQL database. While it has realtime queries that run over the wire, like with RethinkDB, Supabase has no client-side storage or replication feature and therefore is not offline first. ","version":"Next","tagName":"h3"},{"title":"CouchDB​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#couchdb","content":" Apache CouchDB is a server-side, document-oriented database that is mostly known for its multi-master replication feature. Instead of having a master-slave replication, with CouchDB you can run replication in any constellation without having a master server as bottleneck where the server even can go off- and online at any time. This comes with the drawback of having a slow replication with much network overhead. CouchDB has a changestream and a query syntax similar to MongoDB. ","version":"Next","tagName":"h3"},{"title":"PouchDB​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#pouchdb","content":" PouchDB is a JavaScript database that is compatible with most of the CouchDB API. It has an adapter system that allows you to switch out the underlying storage layer. There are many adapters like for IndexedDB, SQLite, the Filesystem and so on. The main benefit is to be able to replicate data with any CouchDB compatible endpoint. Because of the CouchDB compatibility, PouchDB has to do a lot of overhead in handling the revision tree of document, which is why it can show bad performance for bigger datasets. RxDB was originally build around PouchDB until the storage layer was abstracted out in version 10.0.0 so it now allows to use different RxStorage implementations. PouchDB has some performance issues because of how it has to store the document revision tree to stay compatible with the CouchDB API. ","version":"Next","tagName":"h3"},{"title":"Couchbase​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#couchbase","content":" Couchbase (originally known as Membase) is another NoSQL document database made for realtime applications. It uses the N1QL query language which is more SQL like compared to other NoSQL query languages. In theory you can achieve replication of a Couchbase with a PouchDB database, but this has shown to be not that easy. ","version":"Next","tagName":"h3"},{"title":"Cloudant​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#cloudant","content":" Cloudant is a cloud-based service that is based on CouchDB and has mostly the same features. It was originally designed for cloud computing where data can automatically be distributed between servers. But it can also be used to replicate with frontend PouchDB instances to create scalable web applications. It was bought by IBM in 2014 and since 2018 the Cloudant Shared Plan is retired and migrated to IBM Cloud. ","version":"Next","tagName":"h3"},{"title":"Hoodie​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#hoodie","content":" Hoodie is a backend solution that enables offline-first JavaScript frontend development without having to write backend code. Its main goal is to abstract away configuration into simple calls to the Hoodie API. It uses CouchDB in the backend and PouchDB in the frontend to enable offline-first capabilities. The last commit for hoodie was one year ago and the website (hood.ie) is offline which indicates it is not an active project anymore. ","version":"Next","tagName":"h3"},{"title":"LokiJS​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#lokijs","content":" LokiJS is a JavaScript embeddable, in-memory database. And because everything is handled in-memory, LokiJS has awesome performance when mutating or querying data. You can still persist to a permanent storage (IndexedDB, Filesystem etc.) with one of the provided storage adapters. The persistence happens after a timeout is reached after a write, or before the JavaScript process exits. This also means you could loose data when the JavaScript process exits ungracefully like when the power of the device is shut down or the browser crashes. While the project is not that active anymore, it is more finished than unmaintained. In the past, RxDB supported using LokiJS as RxStorage but because the LokiJS is not maintained anymore and had too many issues, this storage option was removed in RxDB version 16. ","version":"Next","tagName":"h3"},{"title":"Gundb​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#gundb","content":" GUN is a JavaScript graph database. While having many features, the decentralized replication is the main unique selling point. You can replicate data Peer-to-Peer without any centralized backend server. GUN has several other features that are useful on top of that, like encryption and authentication. While testing it was really hard to get basic things running. GUN is open source, but because of how the source code is written, it is very difficult to understand what is going wrong. ","version":"Next","tagName":"h3"},{"title":"sql.js​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#sqljs","content":" sql.js is a javascript library to run SQLite on the web. It uses a virtual database file stored in memory and does not have any persistence. All data is lost once the JavaScript process exits. sql.js is created by compiling SQLite to WebAssembly so it has about the same features as SQLite. For older browsers there is a JavaScript fallback. ","version":"Next","tagName":"h3"},{"title":"absurd-sQL​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#absurd-sql","content":" Absurd-sql is a project that implements an IndexedDB-based persistence for sql.js. Instead of directly writing data into the IndexedDB, it treats IndexedDB like a disk and stores data in blocks there which shows to have a much better performance, mostly because of how performance expensive IndexedDB transactions are. ","version":"Next","tagName":"h3"},{"title":"NeDB​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#nedb","content":" NeDB was a embedded persistent or in-memory database for Node.js, nw.js, Electron and browsers. It is document-oriented and had the same query syntax as MongoDB. Like LokiJS it has persistence adapters for IndexedDB etc. to persist the database state on the disc. The last commit to NeDB was in 2016. ","version":"Next","tagName":"h3"},{"title":"Dexie.js​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#dexiejs","content":" Dexie.js is a minimalistic wrapper for IndexedDB. While providing a better API than plain IndexedDB, Dexie also improves performance by batching transactions and other optimizations. It also adds additional non-IndexedDB features like observable queries or multi tab support or react hooks. Compared to RxDB, Dexie.js does not support complex (MongoDB-like) queries and requires a lot of fiddling when a document range of a specific index must be fetched. Dexie.js is used by Whatsapp Web, Microsoft To Do and Github Desktop. RxDB supports using Dexie.js as Database storage which enhances IndexedDB via dexie with RxDB features like MongoDB-like queries etc. ","version":"Next","tagName":"h3"},{"title":"LowDB​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#lowdb","content":" LowDB is a small, local JSON database powered by the Lodash library. It is designed to be simple, easy to use, and straightforward. LowDB allows you to perform native JavaScript queries and persist data in a flat JSON file. Written in TypeScript, it's particularly well-suited for small projects, prototyping, or when you need a lightweight, file-based database. As an alternative to LowDB, RxDB offers real-time reactivity, allowing developers to subscribe to database changes, a feature not natively available in LowDB. Additionally, RxDB provides robust query capabilities, including the ability to subscribe to query results for automatic UI updates. These features make RxDB a strong alternative to LowDB for more complex and dynamic applications. ","version":"Next","tagName":"h3"},{"title":"localForage​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#localforage","content":" localForage is a popular JavaScript library for offline storage that provides a simple, promise-based API. It abstracts over different storage mechanisms such as IndexedDB, WebSQL, or localStorage, making it easier to write code once and have it work seamlessly across various browsers. While localForage is great for storing data locally in a key-value manner, it doesn't provide the real-time reactive queries, conflict handling, or revision-based replication that RxDB does. This makes localForage a useful choice for straightforward caching or persistent storage needs, but not ideal for advanced offline-first scenarios requiring multi-user collaboration or complex querying. ","version":"Next","tagName":"h3"},{"title":"MongoDB Realm​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#mongodb-realm","content":" Originally Realm was a mobile database for Android and iOS. Later they added support for other languages and runtimes, also for JavaScript. It was meant as replacement for SQLite but is more like an object store than a full SQL database. In 2019 MongoDB bought Realm and changed the projects focus. Now Realm is made for replication with the MongoDB Realm Sync based on the MongoDB Atlas Cloud platform. This tight coupling to the MongoDB cloud service is a big downside for most use cases. ","version":"Next","tagName":"h3"},{"title":"Apollo​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#apollo","content":" The Apollo GraphQL platform is made to transfer data between a server to UI applications over GraphQL endpoints. It contains several tools like GraphQL clients in different languages or libraries to create GraphQL endpoints. While it is has different caching features for offline usage, compared to RxDB it is not fully offline first because caching alone does not mean your application is fully usable when the user is offline. ","version":"Next","tagName":"h3"},{"title":"Replicache​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#replicache","content":" Replicache is a client-side sync framework for building realtime, collaborative, local-first web apps. It claims to work with most backend stacks. In contrast to other local first tools, replicache does not work like a local database. Instead it runs on so called mutators that unify behavior on the client and server side. So instead of implementing and calling REST routes on both sides of your stack, you will implement mutators that define a specific delta behavior based on the input data. To observe data in replicache, there are subscriptions that notify your frontend application about changes to the state. Replicache can be used in most frontend technologies like browsers, React/Remix, NextJS/Vercel and React Native. While Replicache can be installed and used from npm, the Replicache source code is not open source and the Replicache github repo does not allow you to inspect or debug it. Still you can use replicache for in non-commercial projects, or for companies with < $200k revenue (ARR) and < $500k in funding. (2024: Replicache will be free and Rocicorp are working on a new Zerosync product to succeed Replicache and Reflect.) ","version":"Next","tagName":"h3"},{"title":"InstantDB​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#instantdb","content":" InstantDB is designed for real-time data synchronization with built-in offline support, allowing changes to be queued locally and synced when the user reconnects. While it offers seamless optimistic updates and rollback capabilities, its offline-first design is not as mature or comprehensive as RxDB's - the offline data is more of a cache, not a full-database sync. The query language used is Datalog, and the backend sync service is written in Clojure. InstantDB is focused more on simplicity and real-time collaboration, with fewer customization options for storage or conflict resolution compared to RxDB, which supports various storage adapters and advanced conflict handling via CRDTs. ","version":"Next","tagName":"h3"},{"title":"Yjs​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#yjs","content":" Yjs is a CRDT-based (Conflict-free Replicated Data Type) library focused on enabling real-time collaboration - particularly for text editing, although it can handle other data types as well. While it provides powerful conflict resolution and peer-to-peer synchronization out of the box, Yjs itself is not a full-fledged database. Instead, you typically combine Yjs with other storage or networking layers to achieve a local-first architecture. This flexibility allows for sophisticated real-time features, but also means you must handle indexing, queries, and persistence on your own if you need them. Compared to RxDB, Yjs does not offer built-in replication adapters or a query system, so developers who require a more complete solution for conflict resolution, data persistence, and offline-first capabilities may find RxDB more convenient. ","version":"Next","tagName":"h3"},{"title":"ElectricSQL​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#electricsql","content":" 2024: ElectricSQL is being rewritten in a new Electric-Next branch, which focuses on partial syncing of ("shapes", which makes is basically a NoSQL like document database) of data from a remote Postgres DB to a local clients written in TypeScript/JS or Elixir. The write path is not yet implemented, neither is client-side reactivity. The ElectricSQL backend is written in Elixir. ","version":"Next","tagName":"h3"},{"title":"SignalDB​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#signaldb","content":" SignalDB provides a reactive, in-memory local-lirst JavaScript database with real-time sync, bit it doesn't offer the same level of multi-client replication or flexibility with storage backends that RxDB provides, and through a RxDB persistence adapters you can actually use SignalDB for the front-end reactivity while relying on RxDB for backend sync and persistence. ","version":"Next","tagName":"h3"},{"title":"PowerSync​","type":1,"pageTitle":"Alternatives for realtime offline-first JavaScript applications","url":"/alternatives.html#powersync","content":" PowerSync is a "framework" for implementing local-first solutions. It centralizes business logic and conflict resolution on a central, authoritative server (PostgreSQL or MongoDB), vs RxDB that also supports custom backends. Both RxDB and PowerSync can be used with a variety of storage backends, but PowerSync uses SQLite as the front-end database which has shown to be slow because the WASM-SQLite abstraction increases read and write latency. In terms of client SDKs, PowerSync offers Flutter, Kotlin, and Swift in addition to JS/TypeScript. PowerSync offers man client technologies, PowerSync is under a license that restricts commercial use that competes with PowerSync and the JourneyApps Platform. Read further Offline First Database Comparison ","version":"Next","tagName":"h3"},{"title":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","type":0,"sectionRef":"#","url":"/articles/angular-indexeddb.html","content":"","keywords":"","version":"Next"},{"title":"What Is IndexedDB?​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#what-is-indexeddb","content":" IndexedDB is a low-level JavaScript API for client-side storage of large amounts of structured data. It allows you to create key-value or object store-based data storage right in the user's browser. IndexedDB supports transactions and indexing but lacks a robust query API and can be complex to use due to its callback-based nature. ","version":"Next","tagName":"h2"},{"title":"Why Use IndexedDB in Angular​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#why-use-indexeddb-in-angular","content":" Offline-First/Local-First: If your app needs to function with limited or no internet connectivity, IndexedDB provides a reliable local storage layer. Users can continue using the application offline, and data can sync when the connection is restored. Performance: Local data access comes with near-zero latency, removing the need for constant server requests and eliminating most loading spinners. Easier to Implement: By replicating all necessary data to the client once, you avoid implementing numerous backend endpoints for each user interaction. Scalability: Local data queries remove processing load from your servers and reduce bandwidth usage by handling queries on the client side. ","version":"Next","tagName":"h2"},{"title":"Why Using Plain IndexedDB is a Problem​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#why-using-plain-indexeddb-is-a-problem","content":" Despite the advantages, directly working with IndexedDB has several drawbacks: Callback-Based: IndexedDB was originally designed around a callback-based API, which can be unwieldy compared to modern Promise or RxJS-based flows. Difficult to Implement: IndexedDB is often described as a "low-level" API. It's more suitable for library authors rather than application developers who simply need a robust local store. Rudimentary Query API: Complex or dynamic queries are cumbersome with IndexedDB's basic get/put approach and limited indexes. TypeScript Support: Maintaining strong TypeScript types for all document structures is not straightforward with IndexedDB's untyped object stores. No Observable API: IndexedDB cannot directly emit live data changes. With RxDB, you can subscribe to changes on a collection or even a single document field. Cross-Tab Synchronization: Handling concurrent data changes across multiple browser tabs is difficult in IndexedDB. RxDB has built-in multi-tab support that keeps all tabs in sync. Advanced Features Missing: IndexedDB lacks built-in support for encryption, compression, or other advanced data management features. Browser-Only: IndexedDB works in the browser but not in environments like React Native or Electron. RxDB offers storage adapters to seamlessly reuse the same code on different platforms. ","version":"Next","tagName":"h2"},{"title":"Set Up RxDB in Angular​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#set-up-rxdb-in-angular","content":" ","version":"Next","tagName":"h2"},{"title":"Installing RxDB​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#installing-rxdb","content":" You can install RxDB into your Angular application via npm: npm install rxdb --save ","version":"Next","tagName":"h3"},{"title":"Patch Change Detection with zone.js​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#patch-change-detection-with-zonejs","content":" RxDB creates RxJS observables outside of Angular's zone, meaning Angular won't automatically trigger change detection when new data arrives. You must patch RxJS with zone.js: //> app.component.ts /** * IMPORTANT: RxDB creates rxjs observables outside of Angular's zone * So you have to import the rxjs patch to ensure change detection works correctly. * @link https://www.bennadel.com/blog/3448-binding-rxjs-observable-sources-outside-of-the-ngzone-in-angular-6-0-2.htm */ import 'zone.js/plugins/zone-patch-rxjs'; ","version":"Next","tagName":"h3"},{"title":"Create a Database and Collections​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#create-a-database-and-collections","content":" RxDB supports multiple storage options. The free and simple approach is using the localstorage-based storage. For higher performance, there's a premium plain IndexedDB storage. import { createRxDatabase } from 'rxdb/plugins/core'; // Define your schema const heroSchema = { title: 'hero schema', version: 0, description: 'Describes a hero in your app', primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 }, name: { type: 'string' }, power: { type: 'string' } }, required: ['id', 'name'] }; Localstorage IndexedDB import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; export async function initDB() { // Create a database const db = await createRxDatabase({ name: 'heroesdb', // the name of the database storage: getRxStorageLocalstorage() }); // Add collections await db.addCollections({ heroes: { schema: heroSchema } }); return db; } It's recommended to encapsulate database creation logic in an Angular service, such as in a DatabaseService. A full example is available in RxDB's Angular example. ","version":"Next","tagName":"h3"},{"title":"CRUD Operations​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#crud-operations","content":" Once your database is initialized, you can perform all CRUD operations: // insert await db.heroes.insert({ name: 'Iron Man', power: 'Genius-level intellect' }); // bulk insert await db.heroes.bulkInsert([ { name: 'Thor', power: 'God of Thunder' }, { name: 'Hulk', power: 'Superhuman Strength' } ]); // find and findOne const heroes = await db.heroes.find().exec(); const ironMan = await db.heroes.findOne({ selector: { name: 'Iron Man' } }).exec(); // update const doc = await db.heroes.findOne({ selector: { name: 'Hulk' } }).exec(); await doc.update({ $set: { power: 'Unlimited Strength' } }); // delete const doc = await db.heroes.findOne({ selector: { name: 'Thor' } }).exec(); await doc.remove(); ","version":"Next","tagName":"h3"},{"title":"Reactive Queries and Live Updates​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#reactive-queries-and-live-updates","content":" A key benefit of RxDB is reactivity. You can subscribe to changes and have your UI automatically reflect updates in real time even across browser tabs. ","version":"Next","tagName":"h2"},{"title":"With RxJS Observables and Async Pipes​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#with-rxjs-observables-and-async-pipes","content":" In Angular, you can display this data with the AsyncPipe: constructor(private dbService: DatabaseService) { this.heroes$ = this.dbService.db.heroes.find({ selector: {}, sort: [{ name: 'asc' }] }).$; } <ul> <li *ngFor="let hero of heroes$ | async"> {{ hero.name }} </li> </ul> ","version":"Next","tagName":"h3"},{"title":"With Angular Signals​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#with-angular-signals","content":" Angular Signals are a newer approach for reactivity. RxDB supports them via a custom reactivity factory. You can convert RxJS Observables to Signals using Angular's toSignal: import { RxReactivityFactory } from 'rxdb/plugins/core'; import { Signal, untracked, Injector } from '@angular/core'; import { toSignal } from '@angular/core/rxjs-interop'; export function createReactivityFactory(injector: Injector): RxReactivityFactory<Signal<any>> { return { fromObservable(observable$, initialValue) { return untracked(() => toSignal(observable$, { initialValue, injector, rejectErrors: true }) ); } }; } Pass this factory when creating your RxDatabase: import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; import { inject, Injector } from '@angular/core'; const database = await createRxDatabase({ name: 'mydb', storage: getRxStorageLocalstorage(), reactivity: createReactivityFactory(inject(Injector)) }); Use the double-dollar sign ($$) to get a Signal instead of an Observable: const heroesSignal = database.heroes.find().$$; <ul> <li *ngFor="let hero of heroesSignal()"> {{ hero.name }} </li> </ul> ","version":"Next","tagName":"h3"},{"title":"Angular IndexedDB Example with RxDB​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#angular-indexeddb-example-with-rxdb","content":" A comprehensive example of RxDB in an Angular application is available in the RxDB GitHub repository. It demonstrates database creation, queries, and Angular integration using best practices. ","version":"Next","tagName":"h2"},{"title":"Advanced RxDB Features​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#advanced-rxdb-features","content":" Beyond simple CRUD and local data storage, RxDB supports: Replication: Sync your local data with a remote database. Learn more at RxDB Replication. Data Migration on Schema Changes: RxDB supports automatic or manual schema migrations to manage backward-compatibility and evolve your data structure. See RxDB Migration. Encryption: Easily encrypt sensitive data at rest. See RxDB Encryption. Compression: Reduce storage and bandwidth usage using key compression. Learn more at RxDB Key Compression. ","version":"Next","tagName":"h2"},{"title":"Limitations of IndexedDB​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#limitations-of-indexeddb","content":" While IndexedDB works well for many use cases, it does have a few constraints: Potentially Slow: While adequate for most use cases, IndexedDB performance can degrade for very large datasets. More details at RxDB Slow IndexedDB. Storage Limits: Browsers may cap the amount of data you can store in IndexedDB. For more info, see Local Storage Limits of IndexedDB. ","version":"Next","tagName":"h2"},{"title":"Alternatives to IndexedDB​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#alternatives-to-indexeddb","content":" Depending on your needs, you might explore: Origin Private File System (OPFS): A newer browser storage mechanism that can offer better performance. RxDB supports OPFS storage. SQLite: When building a mobile or hybrid app (e.g., with Capacitor or Ionic), you can use SQLite locally. See RxDB with SQLite. ","version":"Next","tagName":"h2"},{"title":"Performance comparison with other browser storages​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#performance-comparison-with-other-browser-storages","content":" Here is a performance overview of the various browser based storage implementation of RxDB: ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"Build Smarter Offline-First Angular Apps: How RxDB Beats IndexedDB Alone","url":"/articles/angular-indexeddb.html#follow-up","content":" Continue your deep dive into RxDB with official quickstart guides and star the repository on GitHub to stay updated. RxDB Quickstart: Get started quickly with the RxDB Quickstart. RxDB GitHub: Explore the source, open issues, and star ⭐ the project at RxDB GitHub Repo. By combining IndexedDB's local storage with RxDB's powerful features, you can build performant, robust, and offline-capable Angular applications. RxDB takes care of the lower-level complexities, letting you focus on delivering a great user experience-online or off. ","version":"Next","tagName":"h2"},{"title":"Browser Storage - RxDB as a Database for Browsers","type":0,"sectionRef":"#","url":"/articles/browser-storage.html","content":"","keywords":"","version":"Next"},{"title":"Localstorage​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#localstorage","content":" Localstorage is a straightforward way to store small amounts of data in the user's web browser. It operates on a simple key-value basis and is relatively easy to use. While it has limitations, it is suitable for basic data storage requirements. ","version":"Next","tagName":"h3"},{"title":"IndexedDB​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#indexeddb","content":" IndexedDB, on the other hand, offers a more robust and structured approach to browser-based data storage. It can handle larger datasets and complex queries, making it a valuable choice for more advanced web applications. ","version":"Next","tagName":"h3"},{"title":"Why Store Data in the Browser​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#why-store-data-in-the-browser","content":" Now that we've explored the methods of storing data in the browser, let's delve into why this is a beneficial strategy for web developers: Caching: Storing data in the browser allows you to cache frequently used information. This means that your web application can access essential data more quickly because it doesn't need to repeatedly fetch it from a server. This results in a smoother and more responsive user experience. Offline Access: One significant advantage of browser storage is that data becomes portable and remains accessible even when the user is offline. This feature ensures that users can continue to use your application, view their saved information, and make changes, irrespective of their internet connection status. Faster Real-time Applications: For real-time applications, having data stored locally in the browser significantly enhances performance. Local data allows your application to respond faster to user interactions, creating a more seamless and responsive user interface. Low Latency Queries: When you run queries locally within the browser, you minimize the latency associated with network requests. This results in near-instant access to data, which is particularly crucial for applications that require rapid data retrieval. Faster Initial Application Start Time: By preloading essential data into browser storage, you can reduce the initial load time of your web application. Users can start using your application more swiftly, which is essential for making a positive first impression. Store Local Data with Encryption: For applications that deal with sensitive data, browser storage allows you to implement encryption to secure the stored information. This ensures that even if data is stored on the user's device, it remains confidential and protected. In summary, storing data in the browser offers several advantages, including improved performance, offline access, and enhanced user experiences. Localstorage and IndexedDB are two valuable tools that developers can utilize to leverage these benefits and create web applications that are more responsive and user-friendly. ","version":"Next","tagName":"h2"},{"title":"Browser Storage Limitations​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#browser-storage-limitations","content":" While browser storage, such as Localstorage and IndexedDB, offers many advantages, it's important to be aware of its limitations: Slower Performance Compared to Native Databases: Browser-based storage solutions can't match the performance of native server-side databases. They may experience slower data retrieval and processing, especially for large datasets or complex operations. Storage Space Limitations: Browsers impose restrictions on the amount of data that can be stored locally. This limitation can be problematic for applications with extensive data storage requirements, potentially necessitating creative solutions to manage data effectively. ","version":"Next","tagName":"h2"},{"title":"Why SQL Databases Like SQLite Aren't a Good Fit for the Browser​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#why-sql-databases-like-sqlite-arent-a-good-fit-for-the-browser","content":" SQL databases like SQLite, while powerful in server environments, may not be the best choice for browser-based applications due to various reasons: ","version":"Next","tagName":"h2"},{"title":"Push/Pull Based vs. Reactive​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#pushpull-based-vs-reactive","content":" SQL databases often use a push/pull model for data synchronization. This approach is less reactive and may not align well with the real-time nature of web applications, where immediate updates to the user interface are crucial. ","version":"Next","tagName":"h3"},{"title":"Build Size of Server-Side Databases​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#build-size-of-server-side-databases","content":" Server-side databases like SQLite have a significant build size, which can increase the initial load time of web applications. This can result in a suboptimal user experience, particularly for users with slower internet connections. ","version":"Next","tagName":"h3"},{"title":"Initialization Time and Performance​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#initialization-time-and-performance","content":" SQL databases are optimized for server environments, and their initialization processes and performance characteristics may not align with the needs of web applications. They might not offer the swift performance required for seamless user interactions. ","version":"Next","tagName":"h3"},{"title":"Why RxDB Is a Good Fit as Browser Storage​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#why-rxdb-is-a-good-fit-as-browser-storage","content":" RxDB is an excellent choice for browser-based storage due to its numerous features and advantages: ","version":"Next","tagName":"h2"},{"title":"Flexible Storage Layer for Various Platforms​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#flexible-storage-layer-for-various-platforms","content":" RxDB offers a flexible storage layer that can seamlessly integrate with different platforms, making it versatile and adaptable to various application needs. ","version":"Next","tagName":"h3"},{"title":"NoSQL JSON Documents Are a Better Fit for UIs​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#nosql-json-documents-are-a-better-fit-for-uis","content":" NoSQL JSON documents, used by RxDB, are well-suited for user interfaces. They provide a natural and efficient way to structure and display data in web applications. ","version":"Next","tagName":"h3"},{"title":"NoSQL Has Better TypeScript Support Compared to SQL​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#nosql-has-better-typescript-support-compared-to-sql","content":" RxDB boasts robust TypeScript support, which is beneficial for developers who prefer type safety and code predictability in their projects. ","version":"Next","tagName":"h3"},{"title":"Observable Document Fields​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#observable-document-fields","content":" RxDB enables developers to observe individual document fields, offering fine-grained control over data tracking and updates. ","version":"Next","tagName":"h3"},{"title":"Made in JavaScript, Optimized for JavaScript Applications​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#made-in-javascript-optimized-for-javascript-applications","content":" Being built in JavaScript and optimized for JavaScript applications, RxDB seamlessly integrates into web development stacks, minimizing compatibility issues. ","version":"Next","tagName":"h3"},{"title":"Observable Queries (rxjs) to Automatically Update the UI on Changes​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#observable-queries-rxjs-to-automatically-update-the-ui-on-changes","content":" RxDB's support for Observable Queries allows the user interface to update automatically in real-time when data changes. This reactivity enhances the user experience and simplifies UI development. const query = myCollection.find({ selector: { age: { $gt: 21 } } }); const querySub = query.$.subscribe(results => { console.log('got results: ' + results.length); }); ","version":"Next","tagName":"h3"},{"title":"Optimized Observed Queries with the EventReduce Algorithm​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#optimized-observed-queries-with-the-eventreduce-algorithm","content":" RxDB's EventReduce Algorithm ensures efficient data handling and rendering, improving overall performance and responsiveness. ","version":"Next","tagName":"h3"},{"title":"Handling of Schema Changes​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#handling-of-schema-changes","content":" RxDB provides built-in support for handling schema changes, simplifying database management when updates are required. ","version":"Next","tagName":"h3"},{"title":"Built-In Multi-Tab Support​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#built-in-multi-tab-support","content":" For applications requiring multi-tab support, RxDB natively handles data consistency across different browser tabs, streamlining data synchronization. ","version":"Next","tagName":"h3"},{"title":"Storing Documents Compressed​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#storing-documents-compressed","content":" Efficient data storage is achieved through document compression, reducing storage space requirements and enhancing overall performance. ","version":"Next","tagName":"h3"},{"title":"Replication Algorithm for Compatibility with Any Backend​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#replication-algorithm-for-compatibility-with-any-backend","content":" RxDB's Replication Algorithm facilitates compatibility with various backend systems, ensuring seamless data synchronization between the browser and server. ","version":"Next","tagName":"h3"},{"title":"Summary​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#summary","content":" In conclusion, RxDB is a powerful and feature-rich solution for browser-based storage. Its adaptability, real-time capabilities, TypeScript support, and optimization for JavaScript applications make it an ideal choice for modern web development projects, addressing the limitations of traditional SQL databases in the browser. Developers can harness RxDB to create efficient, responsive, and user-friendly web applications that leverage the full potential of browser storage. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"Browser Storage - RxDB as a Database for Browsers","url":"/articles/browser-storage.html#follow-up","content":" To explore more about RxDB and leverage its capabilities for browser storage, check out the following resources: RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects. ","version":"Next","tagName":"h2"},{"title":"RxDB: The benefits of Browser Databases","type":0,"sectionRef":"#","url":"/articles/browser-database.html","content":"","keywords":"","version":"Next"},{"title":"Why you might want to store data in the browser​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#why-you-might-want-to-store-data-in-the-browser","content":" There are compelling reasons to consider storing data in the browser: ","version":"Next","tagName":"h2"},{"title":"Use the database for caching​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#use-the-database-for-caching","content":" By leveraging a browser database, you can harness the power of caching. Storing frequently accessed data locally enables you to reduce server requests and greatly improve application performance. Caching provides a faster and smoother user experience, enhancing overall user satisfaction. ","version":"Next","tagName":"h3"},{"title":"Data is offline accessible​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#data-is-offline-accessible","content":" Storing data in the browser allows for offline accessibility. Regardless of an active internet connection, users can access and interact with the application, ensuring uninterrupted productivity and user engagement. ","version":"Next","tagName":"h3"},{"title":"Easier implementation of replicating database state​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#easier-implementation-of-replicating-database-state","content":" Browser databases simplify the replication of database state across multiple devices or instances of the application. Compared to complex REST routes, replicating data becomes easier and more streamlined. This capability enables the development of real-time and collaborative applications, where changes are seamlessly synchronized among users. ","version":"Next","tagName":"h3"},{"title":"Building real-time applications is easier with local data​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#building-real-time-applications-is-easier-with-local-data","content":" With a local browser database, building real-time applications becomes more straightforward. The availability of local data allows for reactive data flows and dynamic user interfaces that instantly reflect changes in the underlying data. Real-time features can be seamlessly implemented, providing a rich and interactive user experience. ","version":"Next","tagName":"h3"},{"title":"Browser databases can scale better​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#browser-databases-can-scale-better","content":" Browser databases distribute the query workload to users' devices, allowing queries to run locally instead of relying solely on server resources. This decentralized approach improves scalability by reducing the burden on the server, resulting in a more efficient and responsive application. ","version":"Next","tagName":"h3"},{"title":"Running queries locally has low latency​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#running-queries-locally-has-low-latency","content":" Browser databases offer the advantage of running queries locally, resulting in low latency. Eliminating the need for server round-trips significantly improves query performance, ensuring faster data retrieval and a more responsive application. ","version":"Next","tagName":"h3"},{"title":"Faster initial application start time​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#faster-initial-application-start-time","content":" Storing data in the browser reduces the initial application start time. Instead of waiting for data to be fetched from the server, the application can leverage the local database, resulting in faster initialization and improved user satisfaction right from the start. ","version":"Next","tagName":"h3"},{"title":"Easier integration with JavaScript frameworks​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#easier-integration-with-javascript-frameworks","content":" Browser databases, including RxDB, seamlessly integrate with popular JavaScript frameworks such as Angular, React.js, Vue.js, and Svelte. This integration allows developers to leverage the power of a database while working within the familiar environment of their preferred framework, enhancing productivity and ease of development. ","version":"Next","tagName":"h3"},{"title":"Store local data with encryption​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#store-local-data-with-encryption","content":" Security is a crucial aspect of data storage, especially when handling sensitive information. Browser databases, like RxDB, offer the capability to store local data with encryption, ensuring the confidentiality and protection of sensitive user data. ","version":"Next","tagName":"h3"},{"title":"Using a local database for state management​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#using-a-local-database-for-state-management","content":" Utilizing a local browser database for state management eliminates the need for traditional state management libraries like Redux or NgRx. This approach simplifies the application's architecture by leveraging the database's capabilities to handle state-related operations efficiently. ","version":"Next","tagName":"h3"},{"title":"Data is portable and always accessible by the user​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#data-is-portable-and-always-accessible-by-the-user","content":" When data is stored in the browser, it becomes portable and always accessible by the user. This ensures that users have control and ownership of their data, enhancing data privacy and accessibility. ","version":"Next","tagName":"h3"},{"title":"Why SQL databases like SQLite are not a good fit for the browser​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#why-sql-databases-like-sqlite-are-not-a-good-fit-for-the-browser","content":" While SQL databases, such as SQLite, excel in server-side scenarios, they are not always the optimal choice for browser-based applications. Here are some reasons why SQL databases may not be the best fit for the browser: ","version":"Next","tagName":"h2"},{"title":"Push/Pull based vs. reactive​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#pushpull-based-vs-reactive","content":" SQL databases typically rely on a push/pull mechanism, where the server pushes updates to the client or the client pulls data from the server. This approach is not inherently reactive and requires additional effort to implement real-time data updates. In contrast, browser databases like RxDB provide built-in reactive mechanisms, allowing the application to react to data changes seamlessly. ","version":"Next","tagName":"h3"},{"title":"Build size of server-side databases​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#build-size-of-server-side-databases","content":" Server-side databases, designed to handle large-scale applications, often have significant build sizes that are unsuitable for browser applications. In contrast, browser databases are specifically optimized for browser environments and leverage browser APIs like IndexedDB, OPFS, and Webworker, resulting in smaller build sizes. ","version":"Next","tagName":"h3"},{"title":"Initialization time and performance​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#initialization-time-and-performance","content":" The initialization time and performance of server-side databases can be suboptimal in browser applications. Browser databases, on the other hand, are designed to provide fast initialization and efficient performance within the browser environment, ensuring a smooth user experience. ","version":"Next","tagName":"h3"},{"title":"Why RxDB is a good fit for the browser​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#why-rxdb-is-a-good-fit-for-the-browser","content":" RxDB stands out as an excellent choice for implementing a browser database solution. Here's why RxDB is a perfect fit for browser applications: ","version":"Next","tagName":"h2"},{"title":"Observable Queries (rxjs) to automatically update the UI on changes​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#observable-queries-rxjs-to-automatically-update-the-ui-on-changes","content":" RxDB provides Observable Queries, powered by RxJS, enabling automatic UI updates when data changes occur. This reactive approach eliminates the need for manual data synchronization and ensures a real-time and responsive user interface. const query = myCollection.find({ selector: { age: { $gt: 21 } } }); const querySub = query.$.subscribe(results => { console.log('got results: ' + results.length); }); ","version":"Next","tagName":"h3"},{"title":"NoSQL JSON documents are a better fit for UIs​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#nosql-json-documents-are-a-better-fit-for-uis","content":" RxDB utilizes NoSQL JSON documents, which align naturally with UI development in JavaScript. JavaScript's native handling of JSON objects makes working with NoSQL documents more intuitive, simplifying UI-related operations. ","version":"Next","tagName":"h3"},{"title":"NoSQL has better TypeScript support compared to SQL​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#nosql-has-better-typescript-support-compared-to-sql","content":" TypeScript is widely used in modern JavaScript development. NoSQL databases, including RxDB, offer excellent TypeScript support, making it easier to build type-safe applications and leverage the benefits of static typing. ","version":"Next","tagName":"h3"},{"title":"Observable document fields​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#observable-document-fields","content":" RxDB allows observing individual document fields, providing granular reactivity. This feature enables efficient tracking of specific data changes and fine-grained UI updates, optimizing performance and responsiveness. ","version":"Next","tagName":"h3"},{"title":"Made in JavaScript, optimized for JavaScript applications​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#made-in-javascript-optimized-for-javascript-applications","content":" RxDB is built entirely in JavaScript, optimized for JavaScript applications. This ensures seamless integration with JavaScript codebases and maximizes performance within the browser environment. ","version":"Next","tagName":"h3"},{"title":"Optimized observed queries with the EventReduce Algorithm​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#optimized-observed-queries-with-the-eventreduce-algorithm","content":" RxDB employs the EventReduce Algorithm to optimize observed queries. This algorithm intelligently reduces unnecessary data transmissions, resulting in efficient query execution and improved performance. ","version":"Next","tagName":"h3"},{"title":"Built-in multi-tab support​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#built-in-multi-tab-support","content":" RxDB natively supports multi-tab applications, allowing data synchronization and replication across different tabs or instances of the same application. This feature ensures consistent data across the application and enhances collaboration and real-time experiences. ","version":"Next","tagName":"h3"},{"title":"Handling of schema changes​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#handling-of-schema-changes","content":" RxDB excels in handling schema changes, even when data is stored on multiple client devices. It provides mechanisms to handle schema migrations seamlessly, ensuring data integrity and compatibility as the application evolves. ","version":"Next","tagName":"h3"},{"title":"Storing documents compressed​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#storing-documents-compressed","content":" To optimize storage space, RxDB allows the compression of documents. Storing compressed documents reduces storage requirements and improves overall performance, especially in scenarios with large data volumes. ","version":"Next","tagName":"h3"},{"title":"Flexible storage layer for various platforms​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#flexible-storage-layer-for-various-platforms","content":" RxDB offers a flexible storage layer, enabling code reuse across different platforms, including Electron.js, React Native, hybrid apps (e.g., Capacitor.js), and web browsers. This flexibility streamlines development efforts and ensures consistent data management across multiple platforms. ","version":"Next","tagName":"h3"},{"title":"Replication Algorithm for compatibility with any backend​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#replication-algorithm-for-compatibility-with-any-backend","content":" RxDB incorporates a Replication Algorithm that is open-source and can be made compatible with various backend systems. This compatibility allows seamless data synchronization with different backend architectures, such as own servers, Firebase, CouchDB, NATS or WebSocket. ","version":"Next","tagName":"h3"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB: The benefits of Browser Databases","url":"/articles/browser-database.html#follow-up","content":" To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects. RxDB empowers developers to unlock the power of browser databases, enabling efficient data management, real-time applications, and enhanced user experiences. By leveraging RxDB's features and benefits, you can take your browser-based applications to the next level of performance, scalability, and responsiveness. ","version":"Next","tagName":"h2"},{"title":"RxDB as a Database in an Angular Application","type":0,"sectionRef":"#","url":"/articles/angular-database.html","content":"","keywords":"","version":"Next"},{"title":"Angular Web Applications​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#angular-web-applications","content":" Angular is a powerful JavaScript framework developed and maintained by Google. It enables developers to build single-page applications (SPAs) with a modular and component-based approach. Angular provides a comprehensive set of tools and features for creating dynamic and responsive web applications. ","version":"Next","tagName":"h2"},{"title":"Importance of Databases in Angular Applications​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#importance-of-databases-in-angular-applications","content":" Databases play a vital role in Angular applications by providing a structured and efficient way to store, retrieve, and manage data. Whether it's handling user authentication, caching data, or persisting application state, a robust database solution is essential for ensuring optimal performance and user experience. ","version":"Next","tagName":"h2"},{"title":"Introducing RxDB as a Database Solution​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#introducing-rxdb-as-a-database-solution","content":" RxDB stands for Reactive Database and is built on the principles of reactive programming. It combines the best features of NoSQL databases with the power of reactive programming to provide a scalable and efficient database solution. RxDB offers seamless integration with Angular applications and brings several unique features that make it an attractive choice for developers. 3:45 This solved a problem I've had in Angular for years ","version":"Next","tagName":"h2"},{"title":"Getting Started with RxDB​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#getting-started-with-rxdb","content":" To begin our journey with RxDB, let's understand its key concepts and features. ","version":"Next","tagName":"h2"},{"title":"What is RxDB?​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#what-is-rxdb","content":" RxDB is a client-side database that follows the principles of reactive programming. It is built on top of IndexedDB, the native browser database, and leverages the RxJS library for reactive data handling. RxDB provides a simple and intuitive API for managing data and offers features like data replication, multi-tab support, and efficient query handling. ","version":"Next","tagName":"h3"},{"title":"Reactive Data Handling​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#reactive-data-handling","content":" At the core of RxDB is the concept of reactive data handling. RxDB leverages observables and reactive streams to enable real-time updates and data synchronization. With RxDB, you can easily subscribe to data changes and react to them in a reactive and efficient manner. ","version":"Next","tagName":"h3"},{"title":"Offline-First Approach​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#offline-first-approach","content":" One of the standout features of RxDB is its offline-first approach. It allows you to build applications that can work seamlessly in offline scenarios. RxDB stores data locally and automatically synchronizes changes with the server when the network becomes available. This capability is particularly useful for applications that need to function in low-connectivity or unreliable network environments. ","version":"Next","tagName":"h3"},{"title":"Data Replication​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#data-replication","content":" RxDB provides built-in support for data replication between clients and servers. This means you can synchronize data across multiple devices or instances of your application effortlessly. RxDB handles conflict resolution and ensures that data remains consistent across all connected clients. ","version":"Next","tagName":"h3"},{"title":"Observable Queries​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#observable-queries","content":" RxDB offers a powerful querying mechanism with support for observable queries. This allows you to create dynamic queries that automatically update when the underlying data changes. By leveraging RxDB's observable queries, you can build reactive UI components that respond to data changes in real-time. ","version":"Next","tagName":"h3"},{"title":"Multi-Tab Support​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#multi-tab-support","content":" RxDB provides out-of-the-box support for multi-tab scenarios. This means that if your Angular application is running in multiple browser tabs, RxDB automatically keeps the data in sync across all tabs. It ensures that changes made in one tab are immediately reflected in others, providing a seamless user experience. ","version":"Next","tagName":"h3"},{"title":"RxDB vs. Other Angular Database Options​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#rxdb-vs-other-angular-database-options","content":" While there are other database options available for Angular applications, RxDB stands out with its reactive programming model, offline-first approach, and built-in synchronization capabilities. Unlike traditional SQL databases, RxDB's NoSQL-like structure and observables-based API make it well-suited for real-time applications and complex data scenarios. ","version":"Next","tagName":"h3"},{"title":"Using RxDB in an Angular Application​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#using-rxdb-in-an-angular-application","content":" Now that we have a good understanding of RxDB and its features, let's explore how to integrate it into an Angular application. ","version":"Next","tagName":"h2"},{"title":"Installing RxDB in an Angular App​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#installing-rxdb-in-an-angular-app","content":" To use RxDB in an Angular application, we first need to install the necessary dependencies. You can install RxDB using npm or yarn by running the following command: npm install rxdb --save Once installed, you can import RxDB into your Angular application and start using its API to create and manage databases. ","version":"Next","tagName":"h3"},{"title":"Patch Change Detection with zone.js​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#patch-change-detection-with-zonejs","content":" Angular uses change detection to detect and update UI elements when data changes. However, RxDB's data handling is based on observables, which can sometimes bypass Angular's change detection mechanism. To ensure that changes made in RxDB are detected by Angular, we need to patch the change detection mechanism using zone.js. Zone.js is a library that intercepts and tracks asynchronous operations, including observables. By patching zone.js, we can make sure that Angular is aware of changes happening in RxDB. warning RxDB creates rxjs observables outside of angulars zone So you have to import the rxjs patch to ensure the angular change detection works correctly.link //> app.component.ts import 'zone.js/plugins/zone-patch-rxjs'; ","version":"Next","tagName":"h3"},{"title":"Use the Angular async pipe to observe an RxDB Query​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#use-the-angular-async-pipe-to-observe-an-rxdb-query","content":" Angular provides the async pipe, which is a convenient way to subscribe to observables and handle the subscription lifecycle automatically. When working with RxDB, you can use the async pipe to observe an RxDB query and bind the results directly to your Angular template. This ensures that the UI stays in sync with the data changes emitted by the RxDB query. constructor( private dbService: DatabaseService, private dialog: MatDialog ) { this.heroes$ = this.dbService .db.hero // collection .find({ // query selector: {}, sort: [{ name: 'asc' }] }) .$; } <ul *ngFor="let hero of heroes$ | async as heroes;"> <li>{{hero.name}}</li> </ul> ","version":"Next","tagName":"h3"},{"title":"Different RxStorage layers for RxDB​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#different-rxstorage-layers-for-rxdb","content":" RxDB supports multiple storage layers for persisting data. Some of the available storage options include: LocalStorage RxStorage: Uses the LocalStorage API without any third party plugins.IndexedDB RxStorage: RxDB directly supports IndexedDB as a storage layer. IndexedDB is a low-level browser database that offers good performance and reliability.OPFS RxStorage: The OPFS RxStorage for RxDB is built on top of the File System Access API which is available in all modern browsers. It provides an API to access a sandboxed private file system to persistently store and retrieve data. Compared to other persistent storage options in the browser (like IndexedDB), the OPFS API has a way better performance.Memory RxStorage: In addition to persistent storage options, RxDB also provides a memory-based storage layer. This is useful for testing or scenarios where you don't need long-term data persistence. You can choose the storage layer that best suits your application's requirements and configure RxDB accordingly. ","version":"Next","tagName":"h3"},{"title":"Synchronizing Data with RxDB between Clients and Servers​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#synchronizing-data-with-rxdb-between-clients-and-servers","content":" Data replication between an Angular application and a server is a common requirement. RxDB simplifies this process and provides built-in support for data synchronization. Let's explore how to replicate data between an Angular application and a server using RxDB. ","version":"Next","tagName":"h2"},{"title":"Offline-First Approach​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#offline-first-approach-1","content":" One of the key strengths of RxDB is its offline-first approach. It allows Angular applications to function seamlessly even in offline scenarios. RxDB stores data locally and automatically synchronizes changes with the server when the network becomes available. This capability is particularly useful for applications that need to operate in low-connectivity or unreliable network environments. ","version":"Next","tagName":"h3"},{"title":"Conflict Resolution​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#conflict-resolution","content":" In a distributed system, conflicts can arise when multiple clients modify the same data simultaneously. RxDB offers conflict resolution mechanisms to handle such scenarios. You can define conflict resolution strategies based on your application's requirements. RxDB provides hooks and events to detect conflicts and resolve them in a consistent manner. ","version":"Next","tagName":"h3"},{"title":"Bidirectional Synchronization​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#bidirectional-synchronization","content":" RxDB supports bidirectional data synchronization, allowing updates from both the client and server to be replicated seamlessly. This ensures that data remains consistent across all connected clients and the server. RxDB handles conflicts and resolves them based on the defined conflict resolution strategies. ","version":"Next","tagName":"h3"},{"title":"Real-Time Updates​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#real-time-updates","content":" RxDB provides real-time updates by leveraging reactive programming principles. Changes made to the data are automatically propagated to all connected clients in real-time. Angular applications can subscribe to these updates and update the user interface accordingly. This real-time capability enables collaborative features and enhances the overall user experience. ","version":"Next","tagName":"h3"},{"title":"Advanced RxDB Features and Techniques​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#advanced-rxdb-features-and-techniques","content":" RxDB offers several advanced features and techniques that can further enhance your Angular application. ","version":"Next","tagName":"h2"},{"title":"Indexing and Performance Optimization​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#indexing-and-performance-optimization","content":" To improve query performance, RxDB allows you to define indexes on specific fields of your documents. Indexing enables faster data retrieval and query execution, especially when working with large datasets. By strategically creating indexes, you can optimize the performance of your Angular application. ","version":"Next","tagName":"h3"},{"title":"Encryption of Local Data​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#encryption-of-local-data","content":" RxDB provides built-in support for encrypting local data using the Web Crypto API. With encryption, you can protect sensitive data stored in the client-side database. RxDB transparently encrypts the data, ensuring that it remains secure even if the underlying storage is compromised. ","version":"Next","tagName":"h3"},{"title":"Change Streams and Event Handling​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#change-streams-and-event-handling","content":" RxDB exposes change streams, which allow you to listen for data changes at a database or collection level. By subscribing to change streams, you can react to data modifications and perform specific actions, such as updating the UI or triggering notifications. Change streams enable real-time event handling in your Angular application. ","version":"Next","tagName":"h3"},{"title":"JSON Key Compression​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#json-key-compression","content":" To reduce the storage footprint and improve performance, RxDB supports JSON key compression. With key compression, RxDB replaces long keys with shorter aliases, reducing the overall storage size. This optimization is particularly useful when working with large datasets or frequently updating data. ","version":"Next","tagName":"h3"},{"title":"Best Practices for Using RxDB in Angular Applications​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#best-practices-for-using-rxdb-in-angular-applications","content":" To make the most of RxDB in your Angular application, consider the following best practices: ","version":"Next","tagName":"h2"},{"title":"Use Async Pipe for Subscriptions so you do not have to unsubscribe​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#use-async-pipe-for-subscriptions-so-you-do-not-have-to-unsubscribe","content":" Angular's async pipe is a powerful tool for handling observables in templates. By using the async pipe, you can avoid the need to manually subscribe and unsubscribe from RxDB observables. Angular takes care of the subscription lifecycle, ensuring that resources are released when they are no longer needed. Instead of manually subscribing to Observables, you should always prefer the async pipe. // WRONG: let amount; this.dbService .db.hero .find({ selector: {}, sort: [{ name: 'asc' }] }) .$.subscribe(docs => { amount = 0; docs.forEach(d => amount = d.points); }); // RIGHT: this.amount$ = this.dbService .db.hero .find({ selector: {}, sort: [{ name: 'asc' }] }) .$.pipe( map(docs => { let amount = 0; docs.forEach(d => amount = d.points); return amount; }) ); ","version":"Next","tagName":"h3"},{"title":"Use custom reactivity to have signals instead of rxjs observables​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#use-custom-reactivity-to-have-signals-instead-of-rxjs-observables","content":" RxDB supports adding custom reactivity factories that allow you to get angular signals out of the database instead of rxjs observables. read more. ","version":"Next","tagName":"h3"},{"title":"Use Angular Services for Database creation​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#use-angular-services-for-database-creation","content":" To ensure proper separation of concerns and maintain a clean codebase, it is recommended to create an Angular service responsible for managing the RxDB database instance. This service can handle database creation, initialization, and provide methods for interacting with the database throughout your application. ","version":"Next","tagName":"h3"},{"title":"Efficient Data Handling​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#efficient-data-handling","content":" RxDB provides various mechanisms for efficient data handling, such as batching updates, debouncing, and throttling. Leveraging these techniques can help optimize performance and reduce unnecessary UI updates. Consider the specific data handling requirements of your application and choose the appropriate strategies provided by RxDB. ","version":"Next","tagName":"h3"},{"title":"Data Synchronization Strategies​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#data-synchronization-strategies","content":" When working with data synchronization between clients and servers, it's important to consider strategies for conflict resolution and handling network failures. RxDB provides plugins and hooks that allow you to customize the replication behavior and implement specific synchronization strategies tailored to your application's needs. ","version":"Next","tagName":"h3"},{"title":"Conclusion​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#conclusion","content":" RxDB is a powerful database solution for Angular applications, offering reactive data handling, offline-first capabilities, and seamless data synchronization. By integrating RxDB into your Angular application, you can build responsive and scalable web applications that provide a rich user experience. Whether you're building real-time collaborative apps, progressive web applications, or offline-capable applications, RxDB's features and techniques make it a valuable addition to your Angular development toolkit. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB as a Database in an Angular Application","url":"/articles/angular-database.html#follow-up","content":" To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects.RxDB Angular Example at GitHub ","version":"Next","tagName":"h2"},{"title":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","type":0,"sectionRef":"#","url":"/articles/data-base.html","content":"","keywords":"","version":"Next"},{"title":"Overview of Web Applications that can benefit from RxDB​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#overview-of-web-applications-that-can-benefit-from-rxdb","content":" Before diving into the specifics of RxDB, let's take a moment to understand the scope of web applications that can leverage its capabilities. Any web application that requires real-time data updates, offline functionality, and synchronization between clients and servers can greatly benefit from RxDB. Whether it's a collaborative document editing tool, a task management app, or a chat application, RxDB offers a robust foundation for building these types of applications. ","version":"Next","tagName":"h2"},{"title":"Importance of data bases in Mobile Applications​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#importance-of-data-bases-in-mobile-applications","content":" Mobile applications have become an integral part of our lives, providing us with instant access to information and services. Behind the scenes, data bases play a pivotal role in storing and managing the data that powers these applications. data bases enable efficient data retrieval, updates, and synchronization, ensuring a smooth user experience even in challenging network conditions. ","version":"Next","tagName":"h2"},{"title":"Introducing RxDB as a data base Solution​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#introducing-rxdb-as-a-data-base-solution","content":" RxDB, short for Reactive data base, is a client-side data base solution designed specifically for web and mobile applications. Built on the principles of reactive programming, RxDB brings the power of observables and event-driven architecture to data management. With RxDB, developers can create applications that are responsive, offline-ready, and capable of seamless data synchronization between clients and servers. ","version":"Next","tagName":"h2"},{"title":"Getting Started with RxDB​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#getting-started-with-rxdb","content":" ","version":"Next","tagName":"h2"},{"title":"What is RxDB?​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#what-is-rxdb","content":" RxDB is an open-source JavaScript data base that leverages reactive programming and provides a seamless API for handling data. It is built on top of existing popular data base technologies, such as IndexedDB, and adds a layer of reactive features to enable real-time data updates and synchronization. ","version":"Next","tagName":"h3"},{"title":"Reactive Data Handling​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#reactive-data-handling","content":" One of the standout features of RxDB is its reactive data handling. It utilizes observables to provide a stream of data that automatically updates whenever a change occurs. This reactive approach allows developers to build applications that respond instantly to data changes, ensuring a highly interactive and real-time user experience. ","version":"Next","tagName":"h3"},{"title":"Offline-First Approach​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#offline-first-approach","content":" RxDB embraces an offline-first approach, enabling applications to work seamlessly even when there is no internet connectivity. It achieves this by caching data locally on the client-side and synchronizing it with the server when the connection is available. This ensures that users can continue working with the application and have their data automatically synchronized when they come back online. ","version":"Next","tagName":"h3"},{"title":"Data Replication​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#data-replication","content":" RxDB simplifies the process of data replication between clients and servers. It provides replication plugins that handle the synchronization of data in real-time. These plugins allow applications to keep data consistent across multiple clients, enabling collaborative features and ensuring that each client has the most up-to-date information. ","version":"Next","tagName":"h3"},{"title":"Observable Queries​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#observable-queries","content":" RxDB introduces the concept of observable queries, which are powerful tools for efficiently querying data. With observable queries, developers can subscribe to specific data queries and receive automatic updates whenever the underlying data changes. This eliminates the need for manual polling and ensures that applications always have access to the latest data. ","version":"Next","tagName":"h3"},{"title":"Multi-Tab support​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#multi-tab-support","content":" RxDB offers multi-tab support, allowing applications to function seamlessly across multiple browser tabs. This feature ensures that data changes in one tab are immediately reflected in all other open tabs, enabling a consistent user experience across different browser windows. ","version":"Next","tagName":"h3"},{"title":"RxDB vs. Other data base Options​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#rxdb-vs-other-data-base-options","content":" When considering data base options for web applications, developers often encounter choices like IndexedDB, OPFS, and Memory-based solutions. RxDB, while built on top of IndexedDB, stands out due to its reactive data handling capabilities and advanced synchronization features. Compared to other options, RxDB offers a more streamlined and powerful approach to managing data in web applications. ","version":"Next","tagName":"h3"},{"title":"Different RxStorage layers for RxDB​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#different-rxstorage-layers-for-rxdb","content":" RxDB provides various storage layers, known as RxStorage, that serve as interfaces to different underlying storage technologies. These layers include: LocalStorage RxStorage: Built on top of the browsers localStorage API.IndexedDB RxStorage: This layer directly utilizes IndexedDB as its backend, providing a robust and widely supported storage option.OPFS RxStorage: OPFS (Operational Transformation File System) is a file system-like storage layer that allows for efficient conflict resolution and real-time collaboration.Memory RxStorage: Primarily used for testing and development, this storage layer keeps data in memory without persisting it to disk. Each RxStorage layer has its strengths and is suited for different scenarios, enabling developers to choose the most appropriate option for their specific use case. ","version":"Next","tagName":"h3"},{"title":"Synchronizing Data with RxDB between Clients and Servers​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#synchronizing-data-with-rxdb-between-clients-and-servers","content":" ","version":"Next","tagName":"h2"},{"title":"Offline-First Approach​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#offline-first-approach-1","content":" As mentioned earlier, RxDB adopts an offline-first approach, allowing applications to function seamlessly in disconnected environments. By caching data locally, applications can continue to operate and make updates even without an internet connection. Once the connection is restored, RxDB's replication plugins take care of synchronizing the data with the server, ensuring consistency across all clients. ","version":"Next","tagName":"h3"},{"title":"RxDB Replication Plugins​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#rxdb-replication-plugins","content":" RxDB provides a range of replication plugins that simplify the process of synchronizing data between clients and servers. These plugins enable real-time replication using various protocols, such as WebSocket or HTTP, and handle conflict resolution strategies to ensure data integrity. By leveraging these replication plugins, developers can easily implement robust and scalable synchronization capabilities in their applications. ","version":"Next","tagName":"h3"},{"title":"Advanced RxDB Features and Techniques​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#advanced-rxdb-features-and-techniques","content":" Indexing and Performance Optimization To achieve optimal performance, RxDB offers indexing capabilities. Indexing allows for efficient data retrieval and faster query execution. By strategically defining indexes on frequently accessed fields, developers can significantly enhance the overall performance of their RxDB-powered applications. ","version":"Next","tagName":"h3"},{"title":"Encryption of Local Data​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#encryption-of-local-data","content":" In scenarios where data security is paramount, RxDB provides options for encrypting local data. By encrypting the data base contents, developers can ensure that sensitive information remains secure even if the underlying storage is compromised. RxDB integrates seamlessly with encryption libraries, making it easy to implement end-to-end encryption in applications. ","version":"Next","tagName":"h3"},{"title":"Change Streams and Event Handling​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#change-streams-and-event-handling","content":" RxDB offers change streams and event handling mechanisms, enabling developers to react to data changes in real-time. With change streams, applications can listen to specific collections or documents and trigger custom logic whenever a change occurs. This capability opens up possibilities for building real-time collaboration features, notifications, or other reactive behaviors. ","version":"Next","tagName":"h3"},{"title":"JSON Key Compression​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#json-key-compression","content":" In scenarios where storage size is a concern, RxDB provides JSON key compression. By applying compression techniques to JSON keys, developers can significantly reduce the storage footprint of their data bases. This feature is particularly beneficial for applications dealing with large datasets or limited storage capacities. ","version":"Next","tagName":"h3"},{"title":"Conclusion​","type":1,"pageTitle":"RxDB as a data base: Empowering Web Applications with Reactive Data Handling","url":"/articles/data-base.html#conclusion","content":" RxDB provides an exceptional data base solution for web and mobile applications, empowering developers to create reactive, offline-ready, and synchronized applications. With its reactive data handling, offline-first approach, and replication plugins, RxDB simplifies the challenges of building real-time applications with data synchronization requirements. By embracing advanced features like indexing, encryption, change streams, and JSON key compression, developers can optimize performance, enhance security, and reduce storage requirements. As web and mobile applications continue to evolve, RxDB proves to be a reliable and powerful ","version":"Next","tagName":"h2"},{"title":"Using RxDB as an Embedded Database","type":0,"sectionRef":"#","url":"/articles/embedded-database.html","content":"","keywords":"","version":"Next"},{"title":"What is an Embedded Database?​","type":1,"pageTitle":"Using RxDB as an Embedded Database","url":"/articles/embedded-database.html#what-is-an-embedded-database","content":" An embedded database refers to a client-side database system that is integrated directly within an application. It is designed to operate within the client environment, such as a web browser or a mobile app. This approach eliminates the need for a separate database server and allows the database to run locally on the client device. ","version":"Next","tagName":"h2"},{"title":"Embedded Database in UI Applications​","type":1,"pageTitle":"Using RxDB as an Embedded Database","url":"/articles/embedded-database.html#embedded-database-in-ui-applications","content":" In the context of UI applications, an embedded database serves as a local data storage solution. It enables applications to efficiently manage data, facilitate real-time updates, and enhance performance. Let's explore some of the benefits of using an embedded database compared to a traditional server database: Replicating database state becomes easier: Implementing real-time data synchronization and replication is simpler with an embedded database compared to complex REST routes. The embedded nature allows for efficient replication of the database state across multiple instances of the application.Use the database for caching: An embedded database can be utilized for caching frequently accessed data. This caching mechanism enhances performance and reduces the need for repeated network requests, resulting in faster data retrieval.Building real-time applications is easier with local data: By leveraging local data storage, real-time applications can easily update the user interface in response to data changes. This approach simplifies the development of real-time features and enhances the responsiveness of the application.Store local data with encryption: Embedded databases, like RxDB, offer the ability to store local data with encryption. This ensures that sensitive information remains protected even when stored locally on the client device.Data is offline accessible: With an embedded database, data remains accessible even when the application is offline. Users can continue to interact with the application and access their data seamlessly, irrespective of their internet connectivity.Faster initial application start time: Since the data is already stored locally, there is no need for initial data fetching from a remote server. This significantly reduces the application's startup time and allows users to engage with the application more quickly.Improved scalability with local queries: Embedded databases, such as RxDB, perform queries locally on the client device instead of relying on server round-trips. This reduces latency and enhances scalability, particularly when dealing with large datasets or high query volumes.Seamless integration with JavaScript frameworks: Embedded databases, including RxDB, integrate seamlessly with popular JavaScript frameworks like Angular, React.js, Vue.js, and Svelte. This compatibility allows developers to leverage the capabilities of these frameworks while benefiting from embedded database functionality.Running queries locally has low latency: With an embedded database, queries are executed locally on the client device, resulting in minimal latency. This improves the overall performance and responsiveness of the application.Data is portable and always accessible by the user: Embedded databases enable data portability, allowing users to seamlessly transition between devices while maintaining their data and application state. This ensures that data is always accessible and available to the user.Using a local database for state management: Instead of relying on additional state management libraries like Redux or NgRx, an embedded database can be used for local state management. This simplifies state management and ensures data consistency within the application. ","version":"Next","tagName":"h2"},{"title":"Why RxDB as an Embedded Database for Real-time Applications​","type":1,"pageTitle":"Using RxDB as an Embedded Database","url":"/articles/embedded-database.html#why-rxdb-as-an-embedded-database-for-real-time-applications","content":" RxDB is a JavaScript-based embedded database that offers numerous advantages for building real-time applications. Let's explore why RxDB is a compelling choice: Observable Queries (RxJS): RxDB leverages the power of Observables through RxJS, enabling developers to create queries that automatically update the user interface on data changes. This reactive approach simplifies UI updates and ensures real-time synchronization of data.NoSQL JSON Documents for UIs: RxDB utilizes NoSQL (JSON) documents as its data model, aligning seamlessly with the requirements of modern UI development. JavaScript's native support for JSON objects makes NoSQL documents a natural fit for UI-driven applications.Better TypeScript Support Compared to SQL: RxDB's NoSQL approach provides excellent TypeScript support. The flexibility of working with JSON objects enables robust typing and enhanced development experiences, ensuring type safety and reducing runtime errors.Observable Document Fields: RxDB allows developers to observe individual fields within documents. This granularity enables efficient tracking of specific data changes and facilitates targeted UI updates, enhancing performance and responsiveness.Made in JavaScript, Optimized for JavaScript Applications: Being built entirely in JavaScript, RxDB is optimized for JavaScript applications. It leverages JavaScript's capabilities and integrates seamlessly with JavaScript frameworks and libraries, making it a natural choice for JavaScript developers.Optimized Observed Queries with the EventReduce Algorithm: RxDB incorporates the EventReduce algorithm to optimize observed queries. This algorithm reduces the number of emitted events during query execution, resulting in enhanced query performance and reduced overhead.Built-in Multi-tab Support: RxDB provides built-in multi-tab support, allowing multiple instances of an application to share and synchronize data seamlessly. This feature enables collaborative and real-time scenarios across multiple browser tabs or windows.Handling of Schema Changes across Multiple Client Devices: With RxDB, handling schema changes across multiple client devices becomes straightforward. RxDB's schema migration capabilities ensure that applications can seamlessly adapt to evolving data structures, providing a consistent experience across different devices.Storing Documents Compressed: RxDB offers the ability to store documents in a compressed format. This reduces the storage footprint and improves performance, especially when dealing with large datasets.Flexible Storage Layer and Cross-platform Compatibility: RxDB provides a flexible storage layer that can be reused across various platforms, including Electron.js, React Native, hybrid apps (via Capacitor.js), and browsers. This cross-platform compatibility simplifies development and enables code reuse across different environments.Replication Algorithm for Backend Compatibility: RxDB's replication algorithm is open-source and can be made compatible with various backend solutions, such as self-hosted servers, Firebase, CouchDB, NATS, WebSockets, and more. This flexibility allows developers to choose their preferred backend infrastructure while benefiting from RxDB's embedded database capabilities. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"Using RxDB as an Embedded Database","url":"/articles/embedded-database.html#follow-up","content":" To further explore RxDB and leverage its capabilities as an embedded database, the following resources can be helpful: RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects. By utilizing RxDB as an embedded database in UI applications, developers can harness the power of efficient data management, real-time updates, and enhanced user experiences. RxDB's features and benefits make it a compelling choice for building modern, responsive, and scalable applications. ","version":"Next","tagName":"h2"},{"title":"RxDB as a Database in a Flutter Application","type":0,"sectionRef":"#","url":"/articles/flutter-database.html","content":"","keywords":"","version":"Next"},{"title":"Overview of Flutter Mobile Applications​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#overview-of-flutter-mobile-applications","content":" Flutter is an open-source UI software development kit created by Google that allows developers to build high-performance mobile applications for iOS and Android platforms using a single codebase. Flutter's framework provides a wide range of widgets and tools that enable developers to create visually appealing and responsive applications. ","version":"Next","tagName":"h3"},{"title":"Importance of Databases in Flutter Applications​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#importance-of-databases-in-flutter-applications","content":" Databases play a vital role in Flutter applications by providing a persistent and reliable storage solution for storing and retrieving data. Whether it's user profiles, app settings, or complex data structures, a database helps in efficiently managing and organizing the application's data. Choosing the right database for a Flutter application can significantly impact the performance, scalability, and user experience of the app. ","version":"Next","tagName":"h3"},{"title":"Introducing RxDB as a Database Solution​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#introducing-rxdb-as-a-database-solution","content":" RxDB is a powerful NoSQL database solution that is designed to work seamlessly with JavaScript-based frameworks, such as Flutter. It stands for Reactive Database and offers a variety of features that make it an excellent choice for building Flutter applications. RxDB combines the simplicity of JavaScript's document-based database model with the reactive programming paradigm, enabling developers to build real-time and offline-first applications with ease. ","version":"Next","tagName":"h3"},{"title":"Getting Started with RxDB​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#getting-started-with-rxdb","content":" To understand how RxDB can be utilized in a Flutter application, let's explore its core features and advantages. ","version":"Next","tagName":"h2"},{"title":"What is RxDB?​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#what-is-rxdb","content":" RxDB is a client-side database built on top of IndexedDB, which is a low-level browser-based database API. It provides a simple and intuitive API for performing CRUD operations (Create, Read, Update, Delete) on documents. RxDB's underlying architecture allows for efficient handling of data synchronization between multiple clients and servers. ","version":"Next","tagName":"h3"},{"title":"Reactive Data Handling​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#reactive-data-handling","content":" One of the key strengths of RxDB is its reactive data handling. It leverages the power of Observables, a concept from reactive programming, to automatically update the UI in response to data changes. With RxDB, developers can define queries and subscribe to their results, ensuring that the UI is always in sync with the database. ","version":"Next","tagName":"h3"},{"title":"Offline-First Approach​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#offline-first-approach","content":" RxDB follows an offline-first approach, making it ideal for building Flutter applications that need to function even without an internet connection. It allows data to be stored locally and seamlessly synchronizes it with the server when a connection is available. This ensures that users can access and interact with their data regardless of network availability. ","version":"Next","tagName":"h3"},{"title":"Data Replication​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#data-replication","content":" Data replication is a critical aspect of building distributed applications. RxDB provides robust replication capabilities that enable synchronization of data between different clients and servers. With its replication plugins, RxDB simplifies the process of setting up real-time data synchronization, ensuring consistency across all connected devices. ","version":"Next","tagName":"h3"},{"title":"Observable Queries​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#observable-queries","content":" RxDB introduces the concept of observable queries, which are queries that automatically update when the underlying data changes. This feature is particularly useful for keeping the UI up to date with the latest data. By subscribing to an observable query, developers can receive real-time updates and reflect them in the user interface without manual intervention. ","version":"Next","tagName":"h3"},{"title":"RxDB vs. Other Flutter Database Options​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#rxdb-vs-other-flutter-database-options","content":" When considering database options for Flutter applications, developers often come across alternatives such as SQLite or LokiJS. While these databases have their merits, RxDB offers several advantages over them. RxDB's seamless integration with Flutter, its offline-first approach, reactive data handling, and built-in data replication make it a compelling choice for building feature-rich and scalable Flutter applications. ","version":"Next","tagName":"h3"},{"title":"Using RxDB in a Flutter Application​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#using-rxdb-in-a-flutter-application","content":" Now that we understand the core features of RxDB, let's explore how to integrate it into a Flutter application. ","version":"Next","tagName":"h2"},{"title":"How RxDB can run in Flutter​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#how-rxdb-can-run-in-flutter","content":" RxDB is written in TypeScript and compiled to JavaScript. To run it in a Flutter application, the flutter_qjs library is used to spawn a QuickJS JavaScript runtime. RxDB itself runs in that runtime and communicates with the flutter dart runtime. To store data persistent, the LokiJS RxStorage is used together with a custom storage adapter that persists the database inside of the shared_preferences data. To use RxDB, you have to create a compatible JavaScript file that creates your RxDatabase and starts some connectors which are used by Flutter to communicate with the JavaScript RxDB database via setFlutterRxDatabaseConnector(). import { createRxDatabase } from 'rxdb'; import { getRxStorageLoki } from 'rxdb/plugins/storage-lokijs'; import { setFlutterRxDatabaseConnector, getLokijsAdapterFlutter } from 'rxdb/plugins/flutter'; // do all database creation stuff in this method. async function createDB(databaseName) { // create the RxDatabase const db = await createRxDatabase({ // the database.name is variable so we can change it on the flutter side name: databaseName, storage: getRxStorageLoki({ adapter: getLokijsAdapterFlutter() }), multiInstance: false }); await db.addCollections({ heroes: { schema: { version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 }, name: { type: 'string', maxLength: 100 }, color: { type: 'string', maxLength: 30 } }, indexes: ['name'], required: ['id', 'name', 'color'] } } }); return db; } // start the connector so that flutter can communicate with the JavaScript process setFlutterRxDatabaseConnector( createDB ); Before you can use the JavaScript code, you have to bundle it into a single .js file. In this example we do that with webpack in a npm script here which bundles everything into the javascript/dist/index.js file. To allow Flutter to access that file during runtime, add it to the assets inside of your pubspec.yaml: flutter: assets: - javascript/dist/index.js Also you need to install RxDB in your flutter part of the application. First you have to use the rxdb dart package as a flutter dependency. Currently the package is not published at the dart pub.dev. Instead you have to install it from the local filesystem inside of your RxDB npm installation. # inside of pubspec.yaml dependencies: rxdb: path: path/to/your/node_modules/rxdb/src/plugins/flutter/dart Afterwards you can import the rxdb library in your dart code and connect to the JavaScript process from there. For reference, check out the lib/main.dart file. import 'package:rxdb/rxdb.dart'; // start the javascript process and connect to the database RxDatabase database = await getRxDatabase("javascript/dist/index.js", databaseName); // get a collection RxCollection collection = database.getCollection('heroes'); // insert a document RxDocument document = await collection.insert({ "id": "zflutter-${DateTime.now()}", "name": nameController.text, "color": colorController.text }); // create a query RxQuery<RxHeroDocType> query = RxDatabaseState.collection.find(); // create list to store query results List<RxDocument<RxHeroDocType>> documents = []; // subscribe to a query query.$().listen((results) { setState(() { documents = results; }); }); ","version":"Next","tagName":"h2"},{"title":"Different RxStorage layers for RxDB​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#different-rxstorage-layers-for-rxdb","content":" RxDB offers multiple storage options, known as RxStorage layers, to store data locally. These options include: LokiJS RxStorage: LokiJS is an in-memory database that can be used as a storage layer for RxDB. It provides fast and efficient in-memory data management capabilities.SQLite RxStorage: SQLite is a popular and widely used embedded database that offers robust storage capabilities. RxDB utilizes SQLite as a storage layer to persist data on the device.Memory RxStorage: As the name suggests, Memory RxStorage stores data in memory. While this option does not provide persistence, it can be useful for temporary or cache-based data storage. By choosing the appropriate RxStorage layer based on the specific requirements of the application, developers can optimize performance and storage efficiency. ","version":"Next","tagName":"h3"},{"title":"Synchronizing Data with RxDB between Clients and Servers​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#synchronizing-data-with-rxdb-between-clients-and-servers","content":" One of the key strengths of RxDB is its ability to synchronize data between multiple clients and servers seamlessly. Let's explore how this synchronization can be achieved. ","version":"Next","tagName":"h2"},{"title":"Offline-First Approach​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#offline-first-approach-1","content":" RxDB's offline-first approach ensures that data can be accessed and modified even when there is no internet connection. Changes made offline are automatically synchronized with the server once a connection is reestablished. This ensures data consistency across all devices, providing a seamless user experience. ","version":"Next","tagName":"h3"},{"title":"RxDB Replication Plugins​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#rxdb-replication-plugins","content":" RxDB provides replication plugins that simplify the process of setting up data synchronization between clients and servers. These plugins offer various synchronization strategies, such as one-way replication, two-way replication, and conflict resolution mechanisms. By configuring the appropriate replication plugin, developers can easily establish real-time data synchronization in their Flutter applications. ","version":"Next","tagName":"h3"},{"title":"Advanced RxDB Features and Techniques​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#advanced-rxdb-features-and-techniques","content":" RxDB offers a range of advanced features and techniques that enhance its functionality and performance. Let's explore a few of these features: ","version":"Next","tagName":"h2"},{"title":"Indexing and Performance Optimization​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#indexing-and-performance-optimization","content":" Indexing is a technique used to optimize query performance by creating indexes on specific fields. RxDB allows developers to define indexes on document fields, improving the efficiency of queries and data retrieval. ","version":"Next","tagName":"h3"},{"title":"Encryption of Local Data​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#encryption-of-local-data","content":" To ensure data privacy and security, RxDB supports encryption of local data. By encrypting the data stored on the device, developers can protect sensitive information and prevent unauthorized access. ","version":"Next","tagName":"h3"},{"title":"Change Streams and Event Handling​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#change-streams-and-event-handling","content":" RxDB provides change streams, which emit events whenever data changes occur. By leveraging change streams, developers can implement custom event handling logic, such as updating the UI or triggering background processes, in response to specific data changes. ","version":"Next","tagName":"h3"},{"title":"JSON Key Compression​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#json-key-compression","content":" To minimize storage requirements and optimize performance, RxDB offers JSON key compression. This feature reduces the size of keys used in the database, resulting in more efficient storage and improved query performance. ","version":"Next","tagName":"h3"},{"title":"Conclusion​","type":1,"pageTitle":"RxDB as a Database in a Flutter Application","url":"/articles/flutter-database.html#conclusion","content":" RxDB offers a powerful and flexible database solution for Flutter applications. With its offline-first approach, real-time data synchronization, and reactive data handling capabilities, RxDB simplifies the development of feature-rich and scalable Flutter applications. By integrating RxDB into your Flutter projects, you can leverage its advanced features and techniques to build responsive and data-driven applications that provide an exceptional user experience. note You can find the source code for an example RxDB Flutter Application at the github repo ","version":"Next","tagName":"h2"},{"title":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","type":0,"sectionRef":"#","url":"/articles/firebase-realtime-database-alternative.html","content":"","keywords":"","version":"Next"},{"title":"Why RxDB Is an Excellent Firebase Realtime Database Alternative​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#why-rxdb-is-an-excellent-firebase-realtime-database-alternative","content":" ","version":"Next","tagName":"h2"},{"title":"1. Complete Offline-First Experience​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#1-complete-offline-first-experience","content":" Unlike Firebase Realtime Database, which relies on central infrastructure to process data, RxDB is fully embedded within your client application (including browsers, Node.js, Electron, and React Native). This design means your app stays completely functional offline, since all data reads and writes happen locally. When connectivity is restored, RxDB's syncing framework automatically reconciles local changes with your remote backend. ","version":"Next","tagName":"h3"},{"title":"2. Freedom to Use Any Server or Cloud​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#2-freedom-to-use-any-server-or-cloud","content":" While Firebase Realtime Database ties you into Google's ecosystem, RxDB allows you to choose any hosting environment. You can: Host your data on your own servers or private cloud.Integrate with relational databases like PostgreSQL or other NoSQL options such as CouchDB.Build custom endpoints using REST, GraphQL, or any other protocol. This flexibility ensures you're not locked into a single vendor and can adapt your backend strategy as your project evolves. ","version":"Next","tagName":"h3"},{"title":"3. Advanced Conflict Handling​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#3-advanced-conflict-handling","content":" Firebase Realtime Database typically updates data with a simple last-in-wins approach. RxDB, on the other hand, lets you implement more sophisticated conflict resolution logic. Using revisions and conflict handlers, RxDB can merge concurrent edits or preserve multiple versions—ensuring your application remains consistent even when multiple clients modify the same data at the same time. ","version":"Next","tagName":"h3"},{"title":"4. Lower Cloud Costs for Read-Heavy Apps​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#4-lower-cloud-costs-for-read-heavy-apps","content":" When you rely on Firebase Realtime Database, each query or listener can translate into ongoing reads, potentially running up your monthly bill. With RxDB, all queries are performed locally. Your app only communicates with the backend to sync document changes, significantly reducing bandwidth and hosting expenses for applications that frequently read data. ","version":"Next","tagName":"h3"},{"title":"5. Powerful Local Queries​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#5-powerful-local-queries","content":" If you've hit Firebase Realtime Database's querying limits, RxDB offers a far more robust approach to data retrieval. You can: Define custom indexes for faster local lookups.Perform sophisticated filters, joins, or full-text searches right on the client.Subscribe to real-time data updates through RxDB's reactive query engine. Because these operations happen locally, your UI updates instantly, providing a snappy user experience. ","version":"Next","tagName":"h3"},{"title":"6. True Offline Initialization​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#6-true-offline-initialization","content":" While Firebase offers some offline caching, it often requires an initial connection for authentication or to seed local data. RxDB, however, is built to handle an offline-start scenario. Users can begin working with the application immediately, regardless of connectivity, and any modifications they make will sync once the network is available again. ","version":"Next","tagName":"h3"},{"title":"7. Works Everywhere JavaScript Runs​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#7-works-everywhere-javascript-runs","content":" One of RxDB's core strengths is its ability to run in any JavaScript environment. Whether you're building a web app that uses IndexedDB in the browser, an Electron desktop program, or a React Native mobile application, RxDB's swappable storage adapts to your runtime of choice. This consistency makes code-sharing and cross-platform development far simpler than being tied to a single backend system. ","version":"Next","tagName":"h3"},{"title":"How RxDB's Syncing Mechanism Operates​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#how-rxdbs-syncing-mechanism-operates","content":" RxDB employs its own Sync Engine to manage data flow between your client and remote servers. Replication revolves around: Pull: Retrieving updated or newly created documents from the server.Push: Sending local changes to the backend for persistence.Live Updates: Continuously streaming changes to and from the backend for real-time synchronization. ","version":"Next","tagName":"h2"},{"title":"Sample Code: Sync RxDB With a Custom Endpoint​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#sample-code-sync-rxdb-with-a-custom-endpoint","content":" import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; import { replicateRxCollection } from 'rxdb/plugins/replication'; async function initDB() { const db = await createRxDatabase({ name: 'localdb', storage: getRxStorageLocalstorage(), multiInstance: true, eventReduce: true }); await db.addCollections({ tasks: { schema: { title: 'task schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string', maxLength: 100 }, title: { type: 'string' }, complete: { type: 'boolean' } } } } }); // Start a custom replication replicateRxCollection({ collection: db.tasks, replicationIdentifier: 'custom-tasks-api', push: { handler: async (docs) => { // post local changes to your server const resp = await fetch('https://yourapi.com/tasks/push', { method: 'POST', body: JSON.stringify({ changes: docs }) }); return await resp.json(); // return conflicting documents if any } }, pull: { handler: async (lastCheckpoint, batchSize) => { // fetch new/updated items from your server const response = await fetch( `https://yourapi.com/tasks/pull?checkpoint=${JSON.stringify( lastCheckpoint )}&limit=${batchSize}` ); return await response.json(); } }, live: true }); return db; } ","version":"Next","tagName":"h2"},{"title":"Setting Up P2P Replication Over WebRTC​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#setting-up-p2p-replication-over-webrtc","content":" In addition to using a centralized backend, RxDB supports peer-to-peer synchronization through WebRTC, enabling devices to share data directly. import { replicateWebRTC, getConnectionHandlerSimplePeer } from 'rxdb/plugins/replication-webrtc'; const webrtcPool = await replicateWebRTC({ collection: db.tasks, topic: 'p2p-topic-123', connectionHandlerCreator: getConnectionHandlerSimplePeer({ signalingServerUrl: 'wss://signaling.rxdb.info/', wrtc: require('node-datachannel/polyfill'), webSocketConstructor: require('ws').WebSocket }) }); webrtcPool.error$.subscribe((error) => { console.error('P2P error:', error); }); Here, any client that joins the same topic communicates changes to other peers, all without requiring a traditional client-server model. ","version":"Next","tagName":"h3"},{"title":"Quick Steps to Get Started​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#quick-steps-to-get-started","content":" Install RxDB npm install rxdb rxjs Create a Local Database import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'myLocalDB', storage: getRxStorageLocalstorage() }); Add a Collection ts Kopieren await db.addCollections({ notes: { schema: { title: 'notes schema', version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLenght: 100 }, content: { type: 'string' } } } } }); Synchronize Use one of the Replication Plugins to connect with your preferred backend. ","version":"Next","tagName":"h2"},{"title":"Is RxDB the Right Solution for You?​","type":1,"pageTitle":"RxDB - The Firebase Realtime Database Alternative That Can Sync With Your Own Backend","url":"/articles/firebase-realtime-database-alternative.html#is-rxdb-the-right-solution-for-you","content":" Long Offline Use: If your users need to work without an internet connection, RxDB's built-in offline-first design stands out compared to Firebase Realtime Database's partial offline approach.Custom or Complex Queries: RxDB lets you perform your queries locally, define indexing, and handle even complex transformations locally - no extra call to an external API.Avoid Vendor Lock-In: If you anticipate needing to move or adapt your backend later, you can do so without rewriting how your client manages its data.Peer-to-Peer Collaboration: Whether you need quick demos or real production use, WebRTC replication can link your users directly without central coordination of data storage. ","version":"Next","tagName":"h3"},{"title":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","type":0,"sectionRef":"#","url":"/articles/frontend-database.html","content":"","keywords":"","version":"Next"},{"title":"Why you might want to store data in the frontend​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#why-you-might-want-to-store-data-in-the-frontend","content":" ","version":"Next","tagName":"h2"},{"title":"Offline accessibility​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#offline-accessibility","content":" One compelling reason to store data in the frontend is to enable offline accessibility. By leveraging a frontend database, applications can cache essential data locally, allowing users to continue using the application even when an internet connection is unavailable. This feature is particularly useful for mobile applications or web apps with limited or intermittent connectivity. ","version":"Next","tagName":"h3"},{"title":"Caching​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#caching","content":" Frontend databases also serve as efficient caching mechanisms. By storing frequently accessed data locally, applications can minimize network requests and reduce latency, resulting in faster and more responsive user experiences. Caching is particularly beneficial for applications that heavily rely on remote data or perform computationally intensive operations. ","version":"Next","tagName":"h3"},{"title":"Decreased initial application start time​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#decreased-initial-application-start-time","content":" Storing data in the frontend decreases the initial application start time because the data is already present locally. By eliminating the need to fetch data from a server during startup, applications can quickly render the UI and provide users with an immediate interactive experience. This is especially advantageous for applications with large datasets or complex data retrieval processes. ","version":"Next","tagName":"h3"},{"title":"Password encryption for local data​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#password-encryption-for-local-data","content":" Security is a crucial aspect of data storage. With a front end database, developers can encrypt sensitive local data, such as user credentials or personal information, using encryption algorithms. This ensures that even if the device is compromised, the data remains securely stored and protected. ","version":"Next","tagName":"h3"},{"title":"Local database for state management​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#local-database-for-state-management","content":" Frontend databases provide an alternative to traditional state management libraries like Redux or NgRx. By utilizing a local database, developers can store and manage application state directly in the frontend, eliminating the need for additional libraries. This approach simplifies the codebase, reduces complexity, and provides a more straightforward data flow within the application. ","version":"Next","tagName":"h3"},{"title":"Low-latency local queries​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#low-latency-local-queries","content":" Frontend databases enable low-latency queries that run entirely on the client's device. Instead of relying on server round-trips for each query, the database executes queries locally, resulting in faster response times. This is particularly beneficial for applications that require real-time updates or frequent data retrieval. ","version":"Next","tagName":"h3"},{"title":"Building realtime applications with local data​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#building-realtime-applications-with-local-data","content":" Realtime applications often require immediate updates based on data changes. By storing data locally and utilizing a frontend database, developers can build realtime applications more easily. The database can observe data changes and automatically update the UI, providing a seamless and responsive user experience. ","version":"Next","tagName":"h3"},{"title":"Easier integration with JavaScript frameworks​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#easier-integration-with-javascript-frameworks","content":" Frontend databases, including RxDB, are designed to integrate seamlessly with popular JavaScript frameworks such as Angular, React.js, Vue.js, and Svelte. These databases offer well-defined APIs and support that align with the specific requirements of these frameworks, enabling developers to leverage the full potential of the frontend database within their preferred development environment. ","version":"Next","tagName":"h3"},{"title":"Simplified replication of database state​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#simplified-replication-of-database-state","content":" Replicating database state between the frontend and backend can be challenging, especially when dealing with complex REST routes. Frontend databases, however, provide simple mechanisms for replicating database state. They offer intuitive replication algorithms that facilitate data synchronization between the frontend and backend, reducing the complexity and potential pitfalls associated with complex REST-based replication. ","version":"Next","tagName":"h3"},{"title":"Improved scalability​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#improved-scalability","content":" Frontend databases offer improved scalability compared to traditional SQL databases. By leveraging the computational capabilities of client devices, the burden on server resources is reduced. Queries and operations are performed locally, minimizing the need for server round-trips and enabling applications to scale more efficiently. ","version":"Next","tagName":"h3"},{"title":"Why SQL databases are not a good fit for the front end of an application​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#why-sql-databases-are-not-a-good-fit-for-the-front-end-of-an-application","content":" While SQL databases excel in server-side scenarios, they pose limitations when used on the frontend. Here are some reasons why SQL databases are not well-suited for frontend applications: ","version":"Next","tagName":"h2"},{"title":"Push/Pull based vs. reactive​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#pushpull-based-vs-reactive","content":" SQL databases typically rely on a push/pull model, where the server pushes data to the client upon request. This approach is not inherently reactive, as it requires explicit requests for data updates. In contrast, frontend applications often require reactive data flows, where changes in data trigger automatic updates in the UI. Frontend databases, like RxDB, provide reactive capabilities that seamlessly integrate with the dynamic nature of frontend development. ","version":"Next","tagName":"h3"},{"title":"Initialization time and performance​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#initialization-time-and-performance","content":" SQL databases designed for server-side usage tend to have larger build sizes and initialization times, making them less efficient for browser-based applications. Frontend databases, on the other hand, directly leverage browser APIs like IndexedDB, OPFS, and WebWorker, resulting in leaner builds and faster initialization times. Often the queries are such fast, that it is not even necessary to implement a loading spinner. ","version":"Next","tagName":"h3"},{"title":"Build size considerations​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#build-size-considerations","content":" Server-side SQL databases typically come with a significant build size, which can be impractical for browser applications where code size optimization is crucial. Frontend databases, on the other hand, are specifically designed to operate within the constraints of browser environments, ensuring efficient resource utilization and smaller build sizes. For example the SQLite Webassembly file alone has a size of over 0.8 Megabyte with an additional 0.2 Megabyte in JavaScript code for connection. ","version":"Next","tagName":"h3"},{"title":"Why RxDB is a good fit for the frontend​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#why-rxdb-is-a-good-fit-for-the-frontend","content":" RxDB is a powerful frontend JavaScript database that addresses the limitations of SQL databases and provides an optimal solution for frontend data storage. Let's explore why RxDB is an excellent fit for frontend applications: ","version":"Next","tagName":"h2"},{"title":"Made in JavaScript, optimized for JavaScript applications​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#made-in-javascript-optimized-for-javascript-applications","content":" RxDB is designed and optimized for JavaScript applications. Built using JavaScript itself, RxDB offers seamless integration with JavaScript frameworks and libraries, allowing developers to leverage their existing JavaScript knowledge and skills. ","version":"Next","tagName":"h3"},{"title":"NoSQL (JSON) documents for UIs​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#nosql-json-documents-for-uis","content":" RxDB adopts a NoSQL approach, using JSON documents as its primary data structure. This aligns well with the JavaScript ecosystem, as JavaScript natively works with JSON objects. By using NoSQL documents, RxDB provides a more natural and intuitive data model for UI-centric applications. ","version":"Next","tagName":"h3"},{"title":"Better TypeScript support compared to SQL​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#better-typescript-support-compared-to-sql","content":" TypeScript has become increasingly popular for building frontend applications. RxDB provides excellent TypeScript support, allowing developers to leverage static typing and benefit from enhanced code quality and tooling. This is particularly advantageous when compared to SQL databases, which often have limited TypeScript support. ","version":"Next","tagName":"h3"},{"title":"Observable Queries for automatic UI updates​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#observable-queries-for-automatic-ui-updates","content":" RxDB introduces the concept of observable queries, powered by RxJS. Observable queries automatically update the UI whenever there are changes in the underlying data. This reactive approach eliminates the need for manual UI updates and ensures that the frontend remains synchronized with the database state. ","version":"Next","tagName":"h3"},{"title":"Optimized observed queries with the EventReduce Algorithm​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#optimized-observed-queries-with-the-eventreduce-algorithm","content":" RxDB optimizes observed queries with its EventReduce Algorithm. This algorithm intelligently reduces redundant events and ensures that UI updates are performed efficiently. By minimizing unnecessary re-renders, RxDB significantly improves performance and responsiveness in frontend applications. const query = myCollection.find({ selector: { age: { $gt: 21 } } }); const querySub = query.$.subscribe(results => { console.log('got results: ' + results.length); }); ","version":"Next","tagName":"h3"},{"title":"Observable document fields​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#observable-document-fields","content":" RxDB supports observable document fields, enabling developers to track changes at a granular level within documents. By observing specific fields, developers can reactively update the UI when those fields change, ensuring a responsive and synchronized frontend interface. myDocument.firstName$.subscribe(newName => console.log('name is: ' + newName)); ","version":"Next","tagName":"h3"},{"title":"Storing Documents Compressed​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#storing-documents-compressed","content":" RxDB provides the option to store documents in a compressed format, reducing storage requirements and improving overall database performance. Compressed storage offers benefits such as reduced disk space usage, faster data read/write operations, and improved network transfer speeds, making it an essential feature for efficient frontend data storage. ","version":"Next","tagName":"h3"},{"title":"Built-in Multi-tab support​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#built-in-multi-tab-support","content":" RxDB offers built-in multi-tab support, allowing data synchronization and state management across multiple browser tabs. This feature ensures consistent data access and synchronization, enabling users to work seamlessly across different tabs without conflicts or data inconsistencies. ","version":"Next","tagName":"h3"},{"title":"Replication Algorithm can be made compatible with any backend​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#replication-algorithm-can-be-made-compatible-with-any-backend","content":" RxDB's realtime replication algorithm is designed to be flexible and compatible with various backend systems. Whether you're using your own servers, Firebase, CouchDB, NATS, WebSocket, or any other backend, RxDB can be seamlessly integrated and synchronized with the backend system of your choice. ","version":"Next","tagName":"h3"},{"title":"Flexible storage layer for code reuse​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#flexible-storage-layer-for-code-reuse","content":" RxDB provides a flexible storage layer that enables code reuse across different platforms. Whether you're building applications with Electron.js, React Native, hybrid apps using Capacitor.js, or traditional web browsers, RxDB allows you to reuse the same codebase and leverage the power of a frontend database across different environments. ","version":"Next","tagName":"h3"},{"title":"Handling schema changes in distributed environments​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#handling-schema-changes-in-distributed-environments","content":" In distributed environments where data is stored on multiple client devices, handling schema changes can be challenging. RxDB tackles this challenge by providing robust mechanisms for handling schema changes. It ensures that schema updates propagate smoothly across devices, maintaining data integrity and enabling seamless schema evolution. ","version":"Next","tagName":"h3"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB JavaScript Frontend Database: Efficient Data Storage in Frontend Applications","url":"/articles/frontend-database.html#follow-up","content":" To further explore RxDB and get started with using it in your frontend applications, consider the following resources: RxDB Quickstart: A step-by-step guide to quickly set up RxDB in your project and start leveraging its features.RxDB GitHub Repository: The official repository for RxDB, where you can find the code, examples, and community support. By adopting RxDB as your frontend database, you can unlock the full potential of frontend data storage and empower your applications with offline accessibility, caching, improved performance, and seamless data synchronization. RxDB's JavaScript-centric approach and powerful features make it an ideal choice for frontend developers seeking efficient and scalable data storage solutions. ","version":"Next","tagName":"h2"},{"title":"ideas for articles","type":0,"sectionRef":"#","url":"/articles/ideas","content":"","keywords":"","version":"Next"},{"title":"Seo keywords:​","type":1,"pageTitle":"ideas for articles","url":"/articles/ideas#seo-keywords","content":" X- "optimistic ui" X- "local database" (rddt done) X- "react-native encryption" X- "vue database" (rddt done) X- "jquery database" X- "vue indexeddb" X- "firebase realtime database alternative" (rddt done) X- "firestore alternative" (rddt done) X- "ionic storage" (rddt done) X- "local database" X- "offline database" X- "zero local first" X- "webrtc p2p" - 390 http://localhost:3000/replication-webrtc.html X- "indexeddb storage limit" - 590 https://rxdb.info/articles/indexeddb-max-storage-limit.htmlX- "indexeddb size limit" - 260 https://rxdb.info/articles/indexeddb-max-storage-limit.htmlX- "indexeddb max size" - 590 https://rxdb.info/articles/indexeddb-max-storage-limit.htmlX- "indexeddb limits" - 170 https://rxdb.info/articles/indexeddb-max-storage-limit.html X- "json based database" X- "json vs database" X- "reactjs storage" ","version":"Next","tagName":"h2"},{"title":"Seo​","type":1,"pageTitle":"ideas for articles","url":"/articles/ideas#seo","content":" "supabase alternative" "store local storage" "react localstorage" "react-native storage" "supabase offline" - 260 "store array in localstorage", "localStorage array of objects" "real time web apps" - 170 "reactive database" - 210 "electron sqlite" "in browser database" - 90 "offline first app" - 260 "react native sql" - 110 "sqlite electron" "localstorage vs indexeddb" "react native nosql database" - 30 "indexeddb library" - 260 "indexeddb encryption" - 90 "client side database" - 140 "webtransport vs websocket" "local first development" - 210 "local storage examples" "local vector database" - 590 "mobile app database" - 590 "web based database" "livequery" - 210 "expo database" - 390 "database sync" - 8100 "p2p database" - 170 "reactive app" - 260 "offline web app" - 320 "offline sync" - 320 "react native encrypted storage" - 1000 "firestore vs firebase" - 1300 "ionic alternatives" - 480 "react native backend" - 720 "react native alternative" - 1000 "react native sqlite" - 1900 "flutter vs react native" - 5400 "react native redux" - 3600 "redux alternative" - 1300 "Awesome local first" - 10 "tauri database" - 170 "sqlite javascript" - 2900 "sqlite typescript" - 260 "sync engine" - 390 "indexeddb alternative" - 70 ","version":"Next","tagName":"h2"},{"title":"Non Seo​","type":1,"pageTitle":"ideas for articles","url":"/articles/ideas#non-seo","content":" "Local-First Partial Sync with RxDB""why the indexeddb API is almost perfekt""how to do auth with RxDB""Where to store that JWT token?" ","version":"Next","tagName":"h2"},{"title":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","type":0,"sectionRef":"#","url":"/articles/firestore-alternative.html","content":"","keywords":"","version":"Next"},{"title":"What Makes RxDB a Great Firestore Alternative?​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#what-makes-rxdb-a-great-firestore-alternative","content":" Firestore is convenient for many projects, but it does lock you into Google's ecosystem. Below are some of the key advantages you gain by choosing RxDB: ","version":"Next","tagName":"h2"},{"title":"1. Fully Offline-First​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#1-fully-offline-first","content":" RxDB runs directly in your client application (browser, Node.js, Electron, React Native, etc.). Data is stored locally, so your application remains fully functional even when offline. When the device returns online, RxDB's flexible replication protocol synchronizes your local changes with any remote endpoint. ","version":"Next","tagName":"h3"},{"title":"2. Freedom to Use Any Backend​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#2-freedom-to-use-any-backend","content":" Unlike Firestore, RxDB doesn't require a proprietary hosting service. You can: Host your data on your own server (Node.js, Go, Python, etc.).Use existing databases like PostgreSQL, CouchDB, or MongoDB with custom endpoints.Implement a custom GraphQL or REST-based API for syncing. This backend-agnostic approach protects you from vendor lock-in. Your application's client-side data storage remains consistent; only your replication logic (or plugin) changes if you switch servers. ","version":"Next","tagName":"h3"},{"title":"3. Advanced Conflict Resolution​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#3-advanced-conflict-resolution","content":" Firestore enforces a last-write-wins conflict resolution strategy. This might cause issues if multiple users or devices update the same data in complex ways. RxDB lets you: Implement custom conflict resolution via revisions.Store partial merges, track versions, or preserve multiple user edits.Fine-tune how your data merges to ensure consistency across distributed systems. ","version":"Next","tagName":"h3"},{"title":"4. Reduced Cloud Costs​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#4-reduced-cloud-costs","content":" Firestore queries often count as billable reads. With RxDB, queries run locally against your local state - no repeated network calls or extra charges. You pay only for the data actually synced, not every read. For read-heavy apps, using RxDB as a Firestore alternative can significantly reduce costs. ","version":"Next","tagName":"h3"},{"title":"5. No Limits on Query Features​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#5-no-limits-on-query-features","content":" Firestore's query engine is limited by certain constraints (e.g., no advanced joins, limited indexing). With RxDB: NoSQL data is stored locally, and you can define any indexes you need.Perform complex queries, run full-text search, or do aggregated transformations or even vector search.Use RxDB's reactivity to subscribe to query results in real time. ","version":"Next","tagName":"h3"},{"title":"6. True Offline-Start Support​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#6-true-offline-start-support","content":" While Firestore does have offline caching, it often requires an online check at app initialization for authentication. RxDB is truly offline-first; you can launch the app and write data even if the device never goes online initially. It's ready whenever the user is. ","version":"Next","tagName":"h3"},{"title":"7. Cross-Platform: Any JavaScript Runtime​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#7-cross-platform-any-javascript-runtime","content":" RxDB is designed to run in any environment that can execute JavaScript. Whether you’re building a web app in the browser, an Electron desktop application, a React Native mobile app, or a command-line tool with Node.js, RxDB’s storage layer is swappable to fit your runtime’s capabilities. In the browser, store data in IndexedDB or OPFS.In Node.js, use LevelDB or other supported storages.In React Native, pick from a range of adapters suited for mobile devices.In Electron, rely on fast local storage with zero changes to your application code. ","version":"Next","tagName":"h3"},{"title":"How Does RxDB's Sync Work?​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#how-does-rxdbs-sync-work","content":" RxDB replication is powered by its own Sync Engine. This simple yet robust protocol enables: Pull: Fetch new or updated documents from the server.Push: Send local changes back to the server.Live Real-Time: Once you're caught up, you can opt for event-based streaming instead of continuous polling. Code Example: Sync RxDB with a Custom Backend import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; import { replicateRxCollection } from 'rxdb/plugins/replication'; async function initDB() { const db = await createRxDatabase({ name: 'mydb', storage: getRxStorageLocalstorage(), multiInstance: true, eventReduce: true }); await db.addCollections({ tasks: { schema: { title: 'task schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string', maxLength: 100 }, title: { type: 'string' }, done: { type: 'boolean' } } } } }); // Start a custom REST-based replication replicateRxCollection({ collection: db.tasks, replicationIdentifier: 'my-tasks-rest-api', push: { handler: async (documents) => { // Send docs to your REST endpoint const res = await fetch('https://myapi.com/push', { method: 'POST', body: JSON.stringify({ docs: documents }) }); // Return conflicts if any return await res.json(); } }, pull: { handler: async (lastCheckpoint, batchSize) => { // Fetch from your REST endpoint const res = await fetch(`https://myapi.com/pull?checkpoint=${JSON.stringify(lastCheckpoint)}&limit=${batchSize}`); return await res.json(); } }, live: true // keep watching for changes }); return db; } By swapping out the handler implementations or using an official plugin (e.g., GraphQL, CouchDB, Firestore replication, etc.), you can adapt to any backend or data source. RxDB thus becomes a flexible alternative to Firestore while maintaining real-time capabilities. ","version":"Next","tagName":"h2"},{"title":"Getting Started with RxDB as a Firestore Alternative​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#getting-started-with-rxdb-as-a-firestore-alternative","content":" ","version":"Next","tagName":"h2"},{"title":"Install RxDB:​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#install-rxdb","content":" npm install rxdb rxjs ","version":"Next","tagName":"h3"},{"title":"Create a Database:​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#create-a-database","content":" import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'mydb', storage: getRxStorageLocalstorage() }); ","version":"Next","tagName":"h3"},{"title":"Define Collections:​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#define-collections","content":" await db.addCollections({ items: { schema: { title: 'items schema', version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 }, text: { type: 'string' } } } } }); ","version":"Next","tagName":"h3"},{"title":"Sync​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#sync","content":" Use a Replication Plugin to connect with a custom backend or existing database. For a Firestore-specific approach, RxDB Firestore Replication also exists if you want to combine local indexing and advanced queries with a Cloud Firestore backend. But if you really want to replace Firestore entirely - just point RxDB to your new backend. ","version":"Next","tagName":"h3"},{"title":"Example: Start a WebRTC P2P Replication​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#example-start-a-webrtc-p2p-replication","content":" In addition to syncing with a central server, RxDB also supports pure peer-to-peer replication using WebRTC. This can be invaluable for scenarios where clients need to sync data directly without a master server. import { replicateWebRTC, getConnectionHandlerSimplePeer } from 'rxdb/plugins/replication-webrtc'; const replicationPool = await replicateWebRTC({ collection: db.tasks, topic: 'my-p2p-room', // Clients with the same topic will sync with each other. connectionHandlerCreator: getConnectionHandlerSimplePeer({ // Use your own or the official RxDB signaling server signalingServerUrl: 'wss://signaling.rxdb.info/', // Node.js requires a polyfill for WebRTC & WebSocket wrtc: require('node-datachannel/polyfill'), webSocketConstructor: require('ws').WebSocket }), pull: {}, // optional pull config push: {} // optional push config }); // The replicationPool manages all connected peers replicationPool.error$.subscribe(err => { console.error('P2P Sync Error:', err); }); This example sets up a live P2P replication where any new peers joining the same topic automatically sync local data with each other, eliminating the need for a dedicated central server for the actual data exchange. ","version":"Next","tagName":"h3"},{"title":"Is RxDB Right for Your Project?​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#is-rxdb-right-for-your-project","content":" You want offline-first: If you need an offline-first app that starts offline, RxDB's local database approach and sync protocol excel at this.Your project is read-heavy: Reading from Firestore for every query can get expensive. With RxDB, reads are free and local; you only pay for writes or sync overhead.You need advanced queries: Firestore's query constraints may not suit complex data. With RxDB, you can define your own indexing logic or run arbitrary queries locally.You want no vendor lock-in: Easily transition from Firestore to your own server or another vendor - just change the replication layer. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB - The Firestore Alternative That Can Sync with Your Own Backend","url":"/articles/firestore-alternative.html#follow-up","content":" If you've been searching for a Firestore alternative that gives you the freedom to sync your data with any backend, offers robust offline-first capabilities, and supports truly customizable conflict resolution and queries, RxDB is worth exploring. You can adopt it seamlessly, ensure local reads, reduce costs, and stay in complete control of your data layer. Ready to dive in? Check out the RxDB Quickstart Guide, join our Discord community, and experience how RxDB can be the perfect local-first, real-time database solution for your next project. More resources: RxDB Sync EngineFirestore Replication PluginCustom Conflict ResolutionRxDB GitHub Repository ","version":"Next","tagName":"h2"},{"title":"RxDB as In-memory NoSQL Database: Empowering Real-Time Applications","type":0,"sectionRef":"#","url":"/articles/in-memory-nosql-database.html","content":"","keywords":"","version":"Next"},{"title":"Speed and Performance Benefits​","type":1,"pageTitle":"RxDB as In-memory NoSQL Database: Empowering Real-Time Applications","url":"/articles/in-memory-nosql-database.html#speed-and-performance-benefits","content":" One of the key advantages of using RxDB as an in-memory NoSQL database is its ability to leverage in-memory storage for faster database operations. By storing data directly in memory, database operations can be performed significantly faster compared to traditional disk-based databases. This is especially important for real-time applications where every millisecond counts. With RxDB, developers can achieve near-instantaneous data access and manipulation, enabling highly responsive user experiences. Additionally, RxDB eliminates disk I/O bottlenecks that are typically associated with traditional databases. In traditional databases, disk reads and writes can become a bottleneck as the amount of data grows. In contrast, an in-memory database like RxDB keeps the entire dataset in RAM, eliminating disk access overhead. This makes it an excellent choice for applications dealing with real-time analytics, high-throughput data processing, and caching. ","version":"Next","tagName":"h2"},{"title":"Persistence Options​","type":1,"pageTitle":"RxDB as In-memory NoSQL Database: Empowering Real-Time Applications","url":"/articles/in-memory-nosql-database.html#persistence-options","content":" While RxDB offers an in-memory storage adapter, it also offers persistence storages. Adapters such as IndexedDB, SQLite, and OPFS enable developers to persist data locally in the browser, making applications accessible even when offline. This hybrid approach combines the benefits of in-memory performance with data durability, providing the best of both worlds. Developers can choose the adapter that best suits their needs, balancing the speed of in-memory storage with the long-term data persistence required for certain applications. import { createRxDatabase } from 'rxdb'; import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageMemory() }); Also the memory mapped RxStorage exists as a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance is replicated with the underlying storage for persistence. The main reason to use this is to improve initial page load and query/write times. This is mostly useful in browser based applications. ","version":"Next","tagName":"h2"},{"title":"Use Cases for RxDB​","type":1,"pageTitle":"RxDB as In-memory NoSQL Database: Empowering Real-Time Applications","url":"/articles/in-memory-nosql-database.html#use-cases-for-rxdb","content":" RxDB's capabilities make it well-suited for various real-time applications. Some notable use cases include: Chat Applications and Real-Time Messaging: RxDB's in-memory performance and real-time synchronization capabilities make it an excellent choice for building chat applications and real-time messaging systems. Developers can ensure that messages are delivered and synchronized across multiple clients in real-time, providing a seamless and responsive chat experience. Collaborative Document Editors: RxDB's ability to handle data streams and propagate changes in real-time makes it ideal for collaborative document editing. Multiple users can simultaneously edit a document, and their changes are instantly synchronized, allowing for real-time collaboration and ensuring that everyone has the most up-to-date version of the document. Real-Time Analytics Dashboards: RxDB's speed and scalability make it a valuable tool for real-time analytics dashboards. It can handle high volumes of data and perform complex analytics operations in real-time, providing instant insights and visualizations to users. In conclusion, RxDB serves as a powerful in-memory NoSQL database that empowers developers to build real-time applications with exceptional speed, flexibility, and scalability. Its ability to leverage in-memory storage, eliminate disk I/O bottlenecks, and provide persistence options make it an attractive choice for a wide range of real-time use cases. Whether it's chat applications, collaborative document editors, or real-time analytics dashboards, RxDB provides the foundation for building responsive and interactive software that meets the demands of today's users. ","version":"Next","tagName":"h2"},{"title":"Ionic Storage - RxDB as database for hybrid apps","type":0,"sectionRef":"#","url":"/articles/ionic-database.html","content":"","keywords":"","version":"Next"},{"title":"What are Ionic Hybrid Apps?​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#what-are-ionic-hybrid-apps","content":" Ionic (aka Ionic 2 ) hybrid apps combine the strengths of web technologies (HTML, CSS, JavaScript) with native app development to deliver cross-platform applications. They are built using web technologies and then wrapped in a native container to be deployed on various platforms like iOS, Android, and the web. These apps provide a consistent user experience across devices while benefiting from the efficiency and familiarity of web development. ","version":"Next","tagName":"h2"},{"title":"Storing and Querying Data in an Ionic App​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#storing-and-querying-data-in-an-ionic-app","content":" Storing and querying data is a fundamental aspect of any application, including hybrid apps. These apps often need to operate offline, store user-generated content, and provide responsive user interfaces. Therefore, having a reliable and efficient way to manage data on the client's device is crucial. ","version":"Next","tagName":"h2"},{"title":"Introducing RxDB as a Client-Side Database for Ionic Apps​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#introducing-rxdb-as-a-client-side-database-for-ionic-apps","content":" RxDB steps in as a powerful solution to address the data management needs of ionic hybrid apps. It's a NoSQL client-side database that offers exceptional performance and features tailored to the unique requirements of client-side applications. Let's delve into the key features of RxDB that make it a great fit for these apps. ","version":"Next","tagName":"h2"},{"title":"Getting Started with RxDB​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#getting-started-with-rxdb","content":" ","version":"Next","tagName":"h3"},{"title":"What is RxDB?​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#what-is-rxdb","content":" At its core, RxDB is a NoSQL database that operates with a local-first approach. This means that your app's data is stored and processed primarily on the client's device, reducing the dependency on constant network connectivity. By doing so, RxDB ensures your app remains responsive and functional, even when offline. ","version":"Next","tagName":"h3"},{"title":"Local-First Approach​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#local-first-approach","content":" The local-first approach adopted by RxDB is a game-changer for hybrid applications. Storing data locally allows your app to function seamlessly without an internet connection, providing users with uninterrupted access to their data. When connectivity is restored, RxDB handles the synchronization of data, ensuring that any changes made offline are appropriately propagated. ","version":"Next","tagName":"h3"},{"title":"Observable Queries​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#observable-queries","content":" One of RxDB's standout features is its implementation of observable queries. This concept allows your app's user interface to be dynamically updated in real time as data changes within the database. RxDB's observables create a bridge between your database and user interface, keeping them in sync effortlessly. ","version":"Next","tagName":"h3"},{"title":"NoSQL Query Engine​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#nosql-query-engine","content":" RxDB's NoSQL query engine empowers you to perform powerful queries on your app's data, without the constraints imposed by traditional relational databases. This flexibility is particularly valuable when dealing with unstructured or semi-structured data. With the NoSQL query engine, you can retrieve, filter, and manipulate data according to your app's unique requirements. const foundDocuments = await myDatabase.todos.find({ selector: { done: { $eq: false } } }).exec(); ","version":"Next","tagName":"h3"},{"title":"Great Observe Performance with EventReduce​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#great-observe-performance-with-eventreduce","content":" RxDB introduces a concept called EventReduce, which optimizes the observation process. Instead of overwhelming your app's UI with every data change, EventReduce filters and batches these changes to provide a smooth and efficient experience. This leads to enhanced app performance, lower resource usage, and ultimately, happier users. ","version":"Next","tagName":"h3"},{"title":"Why NoSQL is a Better Fit for Client-Side Applications Compared to relational databases like SQLite​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#why-nosql-is-a-better-fit-for-client-side-applications-compared-to-relational-databases-like-sqlite","content":" When it comes to choosing the right database solution for your client-side applications, NoSQL RxDB presents compelling advantages over traditional options like SQLite. Let's delve into the key reasons why NoSQL RxDB is a superior fit for your ionic hybrid app development. ","version":"Next","tagName":"h2"},{"title":"Easier Document-Based Replication​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#easier-document-based-replication","content":" NoSQL databases, like RxDB, inherently embrace a document-based approach to data storage. This design choice simplifies data replication between clients and servers. With documents representing discrete units of data, you can easily synchronize individual pieces of information without the complexity that can arise when dealing with rows and tables in a relational database like SQLite. This document-centric replication model streamlines the synchronization process and ensures that your app's data remains consistent across devices. ","version":"Next","tagName":"h3"},{"title":"Offline Capable​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#offline-capable","content":" One of the defining features of client-side applications is the ability to function even when offline. NoSQL RxDB excels in this area by supporting a local-first approach. Data is cached on the client's device, enabling the app to remain fully functional even without an internet connection. As connectivity is restored, RxDB handles data synchronization with the server seamlessly. This offline capability ensures a smooth user experience, critical for ionic hybrid apps catering to users in various network conditions. ","version":"Next","tagName":"h3"},{"title":"NoSQL Has Better TypeScript Support​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#nosql-has-better-typescript-support","content":" TypeScript, a popular superset of JavaScript, is renowned for its static typing and enhanced developer experience. NoSQL databases like RxDB are inherently flexible, making them well-suited for TypeScript integration. With well-defined data structures and clear typings, NoSQL RxDB offers improved type safety and easier development when compared to traditional SQL databases like SQLite. This results in reduced debugging time and increased code reliability. ","version":"Next","tagName":"h3"},{"title":"Easier Schema Migration with NoSQL Documents​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#easier-schema-migration-with-nosql-documents","content":" Schema changes are a common occurrence in application development, and dealing with them can be challenging. NoSQL databases, including RxDB, are more forgiving in this aspect. Since documents in NoSQL databases don't enforce a rigid structure like tables in relational databases, schema changes are often simpler to manage. This flexibility makes it easier to evolve your app's data structure over time without the need for complex migration scripts, a notable advantage when compared to SQLite. ","version":"Next","tagName":"h3"},{"title":"Great Performance​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#great-performance","content":" RxDB's excellent performance stems from its advanced indexing capabilities, which streamline data retrieval and ensure swift query execution. Additionally, the JSON key compression employed by RxDB minimizes storage overhead, enabling efficient data transfer and quicker loading times. The incorporation of real-time updates through change streams and the EventReduce mechanism further enhances RxDB's performance, delivering a responsive user experience even as data changes are propagated seamlessly. ","version":"Next","tagName":"h2"},{"title":"Using RxDB in an Ionic Hybrid App​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#using-rxdb-in-an-ionic-hybrid-app","content":" RxDB's integration into your ionic hybrid app opens up a world of possibilities for efficient data management. Let's explore how to set up RxDB, use it with popular JavaScript frameworks, and take advantage of its diverse storage options. ","version":"Next","tagName":"h2"},{"title":"Setup RxDB​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#setup-rxdb","content":" Getting started with RxDB is a straightforward process. By including the RxDB library in your project, you can quickly start harnessing its capabilities. Begin by installing the RxDB package from the npm registry. Then, configure your database instance to suit your app's needs. This setup process paves the way for seamless data management in your ionic hybrid app. For a full instruction, follow the RxDB Quickstart. ","version":"Next","tagName":"h3"},{"title":"Using RxDB in Frameworks (React, Angular, Vue.js)​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#using-rxdb-in-frameworks-react-angular-vuejs","content":" RxDB seamlessly integrates with various JavaScript frameworks, ensuring compatibility with your preferred development environment. Whether you're building your ionic hybrid app with React, Angular, or Vue.js, RxDB offers bindings and tools that enable you to leverage its features effortlessly. This compatibility allows you to stay within the comfort zone of your chosen framework while benefiting from RxDB's powerful data management capabilities. ","version":"Next","tagName":"h3"},{"title":"Different RxStorage Layers for RxDB​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#different-rxstorage-layers-for-rxdb","content":" RxDB doesn't limit you to a single storage solution. Instead, it provides a range of RxStorage layers to accommodate diverse use cases. These storage layers offer flexibility and customization, enabling you to tailor your data management strategy to match your app's requirements. Let's explore some of the available RxStorage options: LocalStorage RxStorage: Based on the browsers localStorage. Easy to set up and fast for small datasets.IndexedDB RxStorage: Leveraging the native browser storage, IndexedDB RxStorage offers reliable data persistence. This storage option is suitable for a wide range of scenarios and is supported by most modern browsers.OPFS RxStorage: Operating within the browser's file system, OPFS RxStorage is a unique choice that can handle larger data volumes efficiently. It's particularly useful for applications that require substantial data storage.Memory RxStorage: Memory RxStorage is perfect for temporary or cache-like data storage. It keeps data in memory, which can result in rapid data access but doesn't provide long-term persistence.SQLite RxStorage: SQLite is the goto database for mobile applications. It is build in on android and iOS devices. The SQLite RxDB storage layer is build upon SQLite and offers the best performance on hybrid apps, like ionic. ","version":"Next","tagName":"h3"},{"title":"Replication of Data with RxDB between Clients and Servers​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#replication-of-data-with-rxdb-between-clients-and-servers","content":" Efficient data replication between clients and servers is the backbone of modern application development, ensuring that data remains consistent and up-to-date across various devices and platforms. RxDB provides a suite of replication methods that facilitate seamless communication between clients and servers, ensuring that your data is always in sync. ","version":"Next","tagName":"h2"},{"title":"RxDB Replication Algorithm​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#rxdb-replication-algorithm","content":" At the heart of RxDB's replication capabilities lies a sophisticated algorithm designed to manage data synchronization between clients and servers. This algorithm intelligently handles data changes, conflict resolution, and network connectivity fluctuations, resulting in reliable and efficient data replication. With the RxDB replication algorithm, your application can maintain data consistency across devices without unnecessary complexities. CouchDB Replication: RxDB's integration with CouchDB replication presents a powerful way to synchronize data between clients and servers. CouchDB, a well-established NoSQL database, excels at distributed and decentralized data scenarios. By utilizing RxDB's CouchDB replication, you can establish bidirectional synchronization between your RxDB-powered client and a CouchDB server. This synchronization ensures that data updates made on either end are seamlessly propagated to the other, facilitating collaboration and data sharing. Firestore Replication: Firestore, Google's cloud-hosted NoSQL database, offers another avenue for data replication in RxDB. With Firestore replication, you can establish a connection between your RxDB-powered app and Firestore's cloud infrastructure. This integration provides real-time updates to data across multiple instances of your application, ensuring that users always have access to the latest information. RxDB's support for Firestore replication empowers you to build dynamic and responsive applications that thrive in today's fast-paced digital landscape. WebRTC Replication: Peer-to-peer (P2P) replication via WebRTC introduces a cutting-edge approach to data synchronization in RxDB. P2P replication allows devices to communicate directly with each other, bypassing the need for a central server. This method proves invaluable in scenarios where network connectivity is limited or unreliable. With WebRTC replication, devices can exchange data directly, enabling collaboration and information sharing even in challenging network conditions. ","version":"Next","tagName":"h3"},{"title":"RxDB as an Alternative for Ionic Secure Storage​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#rxdb-as-an-alternative-for-ionic-secure-storage","content":" When it comes to securing sensitive data in your Ionic applications, RxDB emerges as a powerful alternative to traditional secure storage solutions. Let's delve into why RxDB is an exceptional choice for safeguarding your data while providing additional benefits. ","version":"Next","tagName":"h2"},{"title":"RxDB On-Device Encryption Plugin​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#rxdb-on-device-encryption-plugin","content":" RxDB offers an on-device encryption plugin, adding an extra layer of security to your app's data. This means that data stored within the RxDB database can be encrypted, ensuring that even if the device falls into the wrong hands, the sensitive information remains inaccessible without the proper decryption key. This level of data protection is crucial for applications that deal with personal or confidential information. Encryption runs either with AES on crypto-js or with the Web Crypto API which is faster and more secure. ","version":"Next","tagName":"h3"},{"title":"Works Offline​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#works-offline","content":" Security should never compromise functionality. RxDB excels in this area by allowing your application to operate seamlessly even when offline. The locally stored encrypted data remains accessible and functional, enabling users to interact with the app's features even without an active internet connection. This offline capability ensures that user data is secure, while the app continues to deliver a responsive and uninterrupted experience. ","version":"Next","tagName":"h3"},{"title":"Easy-to-Setup Replication with Your Backend​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#easy-to-setup-replication-with-your-backend","content":" Ensuring data consistency between your client-side application and backend is a key concern for developers. RxDB simplifies this process with its straightforward replication setup. You can effortlessly configure data synchronization between your local RxDB instance and your backend server. This replication capability ensures that encrypted data remains up-to-date and aligned with the central database, enhancing data integrity and security. ","version":"Next","tagName":"h3"},{"title":"Compression of Client-Side Stored Data​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#compression-of-client-side-stored-data","content":" In addition to security and offline capabilities, RxDB also offers data compression. This means that the data stored on the client's device is efficiently compressed, reducing storage requirements and improving overall app performance. This compression ensures that your app remains responsive and efficient, even as data volumes grow. ","version":"Next","tagName":"h3"},{"title":"Cost-Effective Solution​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#cost-effective-solution","content":" In addition to its security features, RxDB offers cost-effective benefits. RxDB is priced more affordably compared to some other secure storage solutions, making it an attractive option for developers seeking robust security without breaking the bank. For many users, the free version of RxDB provides ample features to meet their application's security and data management needs. ","version":"Next","tagName":"h3"},{"title":"Follow Up​","type":1,"pageTitle":"Ionic Storage - RxDB as database for hybrid apps","url":"/articles/ionic-database.html#follow-up","content":" Try out the RxDB ionic example projectTry out the RxDB QuickstartJoin the RxDB Chat ","version":"Next","tagName":"h2"},{"title":"IndexedDB Max Storage Size Limit","type":0,"sectionRef":"#","url":"/articles/indexeddb-max-storage-limit.html","content":"","keywords":"","version":"Next"},{"title":"Why IndexedDB Has a Storage Limit​","type":1,"pageTitle":"IndexedDB Max Storage Size Limit","url":"/articles/indexeddb-max-storage-limit.html#why-indexeddb-has-a-storage-limit","content":" Browsers need a way to curb runaway disk usage and safeguard user resources. This is accomplished through quota management policies, which can vary among Chrome, Firefox, Safari, Edge, and others. Some browsers use a percentage of your total disk space, while others rely on a fixed maximum or dynamic approach per origin. These policies are designed to prevent malicious or poorly optimized web pages from consuming an unreasonable amount of user storage. Chrome (and Chromium-based browsers) typically allow you to use a percentage of the user’s free disk space, whereas Firefox historically prompts users to allow more than 5 MB in mobile or 50 MB in desktop. Safari often sets tighter maximum caps, especially on iOS devices. Edge aligns closely with Chrome’s rules but can also include enterprise or corporate policy overrides. Understanding these default or dynamic limits prepares you to plan your app’s storage needs appropriately. ","version":"Next","tagName":"h2"},{"title":"Browser-Specific IndexedDB Limits​","type":1,"pageTitle":"IndexedDB Max Storage Size Limit","url":"/articles/indexeddb-max-storage-limit.html#browser-specific-indexeddb-limits","content":" IndexedDB size quotas differ significantly across browsers and platforms. While there isn’t a universal rule, the following table summarizes approximate limits and any notes or caveats you should be aware of: Browser\tApprox. Limit\tNotesChrome/Chromium\tUp to ~80% of free disk, per origin cap\tOften cited as 60 GB on a 100 GB drive. Shared pool approach. Quota usage can prompt partial or extended user approvals. Firefox\t~2 GB (desktop) or ~5 MB initial for mobile\tOlder versions asked permission at 50 MB for desktop. Ephemeral/incognito sessions may require repeated user prompts. Safari (iOS)\t~1 GB per origin (variable)\tHistorically stricter. iOS devices limit quotas further. Behavior can differ between iOS Safari versions or iPadOS. Edge\tSimilar to Chrome’s 80% of free space\tCan be influenced by Windows enterprise policies. Generally aligned with Chromium approach. iOS Safari\tTypically 1 GB, can be less on older iOS\tEarly iOS versions were known for more aggressive quotas and data eviction on low space. Android Chrome\tSimilar to desktop Chrome\tMay exhibit warnings in especially low-storage devices. The same 80% free space logic generally applies. Historically, these limits have evolved. For instance, older Firefox versions included dom.indexedDB.warningQuota, showing a 50 MB prompt on desktop or a 5 MB prompt on mobile—many developers wrote about these notifications on Stack Overflow. Since around 2015, Firefox has changed its quota approach significantly. Likewise, Safari used to limit data more aggressively on older iOS versions. Some older tutorials suggest comparing IndexedDB to localStorage, but modern browsers allow far larger and more flexible storage with IndexedDB than the old localStorage or cookie-based setups. ","version":"Next","tagName":"h2"},{"title":"Checking Your Current IndexedDB Usage​","type":1,"pageTitle":"IndexedDB Max Storage Size Limit","url":"/articles/indexeddb-max-storage-limit.html#checking-your-current-indexeddb-usage","content":" To assess where your app stands relative to these storage limits, you can use the Storage Estimation API. The snippet below shows how to estimate both your used storage and the total space allocated to your origin: const quota = await navigator.storage.estimate(); const totalSpace = quota.quota; const usedSpace = quota.usage; console.log('Approx total allocated space:', totalSpace); console.log('Approx used space:', usedSpace); Some browsers (all modern ones) also provide a navigator.storage.persist() method to request persistent storage, preventing the browser from automatically clearing your data if the user’s device runs low on space. Note that users might deny such requests, or the request might fail silently on stricter environments. Always handle these outcomes gracefully and design your app to degrade if persistent storage is unavailable. ","version":"Next","tagName":"h2"},{"title":"Testing Your App’s IndexedDB Quotas​","type":1,"pageTitle":"IndexedDB Max Storage Size Limit","url":"/articles/indexeddb-max-storage-limit.html#testing-your-apps-indexeddb-quotas","content":" The best way to handle real-world usage is to test for low storage conditions and large data sets in different environments. You can fill up the space manually by writing repetitive test data or running scripts that bulk-insert documents until an error occurs. Real-time usage monitors or dashboards can keep track of your navigator.storage.estimate() results, letting you see how close you are to the max limit in production. Developer tools in Chrome or Firefox can simulate limited storage situations, which is crucial for QA: 0:42 Simulate low storage quota with DevTools This short tutorial shows how you can artificially reduce available storage in Google Chrome’s dev tools to see how your app behaves when nearing or exceeding the quota. ","version":"Next","tagName":"h2"},{"title":"Handling Errors When Limits Are Reached​","type":1,"pageTitle":"IndexedDB Max Storage Size Limit","url":"/articles/indexeddb-max-storage-limit.html#handling-errors-when-limits-are-reached","content":" When the user’s device is too full or your app exceeds the allotted quota, most browsers will throw a QuotaExceededError (or similarly named exception) when trying to store additional data. Often, the request to IndexedDB simply fails with an error event. Handling this gracefully is essential to avoid crashes or data corruption. A typical approach is to wrap your write operations in try/catch blocks or in onsuccess / onerror event callbacks. If you detect a quota error, you can prompt the user to clear out old items or reduce the scope of offline data. Some apps implement a fallback system that removes less critical documents to free space and then retries the write. try { const tx = db.transaction('largeStore', 'readwrite'); const store = tx.objectStore('largeStore'); await store.add(hugeData, someKey); await tx.done; } catch (error) { if (error.name === 'QuotaExceededError') { console.warn('IndexedDB quota exceeded. Cleanup or prompt user to free space.'); // Optionally remove older data or show a UI hint: // removeOldDocuments(); // displayStorageFullDialog(); } else { // handle other errors console.error('IndexedDB write error:', error); } } ","version":"Next","tagName":"h2"},{"title":"Tricks to Exceed the Storage Size Limitation​","type":1,"pageTitle":"IndexedDB Max Storage Size Limit","url":"/articles/indexeddb-max-storage-limit.html#tricks-to-exceed-the-storage-size-limitation","content":" Even if you plan well, your app might need more storage than a single origin typically allows. There are a few advanced tactics you can use: If you store binary data such as images or videos, consider compressing them via the Compression Streams API. For textual or JSON data, a library like RxDB supports built-in key-compression to shorten field names or entire documents. This can be extremely helpful when storing large sets of objects: // Example: How key-compression can transform your documents internally const uncompressed = { "firstName": "Corrine", "lastName": "Ziemann", "shoppingCartItems": [ { "productNumber": 29857, "amount": 1 }, { "productNumber": 53409, "amount": 6 } ] }; const compressed = { "|e": "Corrine", "|g": "Ziemann", "|i": [ { "|h": 29857, "|b": 1 }, { "|h": 53409, "|b": 6 } ] }; Sharding data across multiple subdomains or iframes is another trick, though it complicates communication. When you need truly massive offline data, you might store part of the data under sub1.yoursite.com and another chunk under sub2.yoursite.com, using postMessage() to coordinate. This can circumvent single-origin limitations, but it introduces extra complexity. Another effective method is to let data expire automatically—perhaps older records are removed if they haven’t been accessed for a certain period. ","version":"Next","tagName":"h2"},{"title":"IndexedDB Max Size of a Single Object​","type":1,"pageTitle":"IndexedDB Max Storage Size Limit","url":"/articles/indexeddb-max-storage-limit.html#indexeddb-max-size-of-a-single-object","content":" There is no explicit cap on how large an individual object or record in IndexedDB can be, other than the overall disk quota. If you attempt to store one extremely large object, you will eventually hit browser memory constraints or the global storage quota. In practice, you’ll encounter out-of-memory issues in JavaScript before IndexedDB itself refuses a single large write. A helpful test can be seen in this JSFiddle experiment where you see browsers can crash when creating massive in-memory objects. ","version":"Next","tagName":"h2"},{"title":"Is There a Time Limit for Data Stored in IndexedDB?​","type":1,"pageTitle":"IndexedDB Max Storage Size Limit","url":"/articles/indexeddb-max-storage-limit.html#is-there-a-time-limit-for-data-stored-in-indexeddb","content":" IndexedDB data can remain indefinitely as long as the user does not clear the browser’s data or the origin does not run afoul of automated eviction policies (e.g., Safari or Android might remove large caches for sites unused over a long period when space is needed). Typically, there is no “time limit,” but ephemeral modes or incognito sessions have their own rules. If you rely on permanent offline data, request persistent storage and handle the possibility that the user or the OS could still remove your data under extreme conditions. Especially Safari is known to be very fast in deleting local data. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"IndexedDB Max Storage Size Limit","url":"/articles/indexeddb-max-storage-limit.html#follow-up","content":" Learn more by checking the IndexedDB official docs, which detail store design, error handling, and quota usage. If you need a straightforward way to manage large offline data with compression and conflict resolution, explore the RxDB Quickstart. You can also join the community on GitHub to share tips on overcoming the IndexedDB max storage size limit in production environments. ","version":"Next","tagName":"h2"},{"title":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","type":0,"sectionRef":"#","url":"/articles/ionic-storage.html","content":"","keywords":"","version":"Next"},{"title":"Why RxDB for Ionic Storage?​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#why-rxdb-for-ionic-storage","content":" ","version":"Next","tagName":"h2"},{"title":"1. Offline-Ready NoSQL Storage​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#1-offline-ready-nosql-storage","content":" Offline functionality is crucial for modern mobile applications, particularly when devices encounter unreliable or slow networks. RxDB stores all data locally so your Ionic app can run seamlessly without needing a continuous internet connection. When a network is available again, RxDB automatically synchronizes changes with your backend - no extra code required. ","version":"Next","tagName":"h3"},{"title":"2. Powerful Encryption​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#2-powerful-encryption","content":" Securing on-device data is paramount when handling sensitive information. RxDB includes encryption plugins that let you: Encrypt data fields at rest with AESInvalidate data access by simply withholding the passwordKeep your users' data confidential, even if the device is stolen This built-in encryption sets RxDB apart from many other Ionic storage options that lack integrated security. ","version":"Next","tagName":"h3"},{"title":"3. Built-In Data Compression​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#3-built-in-data-compression","content":" Large or repetitive data can significantly slow down devices with minimal memory. RxDB's key-compression feature decreases document size stored on the device, improving overall performance by: Reducing disk usageAccelerating queriesMinimizing network overhead when syncing ","version":"Next","tagName":"h3"},{"title":"4. Real-Time Sync & Conflict Handling​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#4-real-time-sync--conflict-handling","content":" In addition to functioning fully offline, RxDB supports advanced replication options. Your Ionic app can instantly sync updates with any backend (CouchDB, Firestore, GraphQL, or custom REST), maintaining a real-time user experience. Plus, RxDB handles conflicts gracefully - meaning less worry about clashing user edits. ","version":"Next","tagName":"h3"},{"title":"5. Easy to Adopt and Extend​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#5-easy-to-adopt-and-extend","content":" RxDB runs with a NoSQL approach and integrates seamlessly into Ionic Angular or other frameworks you might use with Ionic. You can extend or replace storage backends, add encryption, or build advanced offline-first features with minimal overhead. ","version":"Next","tagName":"h3"},{"title":"Quick Start: Implementing RxDB with LocalSTorage Storage​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#quick-start-implementing-rxdb-with-localstorage-storage","content":" For a simple proof-of-concept or testing environment in Ionic, you can use localstorage as your underlying storage. Later, if you need better native performance, you can switch to the SQLite storage offered by the RxDB Premium plugins. Install RxDB npm install rxdb rxjs Initialize the Database import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; async function initDB() { const db = await createRxDatabase({ name: 'myionicdb', storage: getRxStorageLocalstorage(), multiInstance: false // or true if you plan multi-tab usage // Note: If you need encryption, set `password` here }); await db.addCollections({ notes: { schema: { title: 'notes schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string' }, content: { type: 'string' }, timestamp: { type: 'number' } }, required: ['id'] } } }); return db; } Ready to Upgrade Later? When you need the best performance on mobile devices, purchase the RxDB PremiumSQLite Storage and replace getRxStorageLocalstorage() with getRxStorageSQLite() - your app logic remains largely the same. You only have to change the configuration. ","version":"Next","tagName":"h2"},{"title":"Encryption Example​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#encryption-example","content":" To secure local data, add the crypto-js encryption plugin (free version) or the premium web-crypto plugin. Below is an example using the free crypto-js plugin: import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; import { createRxDatabase } from 'rxdb/plugins/core'; async function initEncryptedDB() { const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ storage: getRxStorageLocalstorage() }); const db = await createRxDatabase({ name: 'secureIonicDB', storage: encryptedStorage, password: 'myS3cretP4ssw0rd' }); await db.addCollections({ secrets: { schema: { title: 'secret schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string' }, text: { type: 'string' } }, required: ['id'], // all fields in this array will be stored encrypted: encrypted: ['text'] } } }); return db; } With encryption enabled: text is automatically encrypted at rest.Queries on encrypted fields are not directly possible (since data is encrypted), but once a document is loaded, RxDB decrypts it for normal usage. ","version":"Next","tagName":"h2"},{"title":"Compression Example​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#compression-example","content":" To minimize the storage footprint, RxDB offers a key-compression feature. You can enable it in your schema: await db.addCollections({ logs: { schema: { title: 'logs schema', version: 0, keyCompression: true, // enable compression type: 'object', primaryKey: 'id', properties: { id: { type: 'string' }, message: { type: 'string' }, createdAt: { type: 'string', format: 'date-time' } } } } }); With keyCompression: true, RxDB shortens field names internally, significantly reducing document size. This helps both stored data and network transport during replication. ","version":"Next","tagName":"h2"},{"title":"RxDB vs. Other Ionic Storage Options​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#rxdb-vs-other-ionic-storage-options","content":" Ionic Native Storage or Capacitor-based key-value stores may handle small amounts of data but lack advanced features like: Complex queriesFull NoSQL document modelOffline-firstsyncEncryption & key compression out of the boxRxDB stands out by delivering all these capabilities in a unified library. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB - Local Ionic Storage with Encryption, Compression & Sync","url":"/articles/ionic-storage.html#follow-up","content":" For Ionic storage that supports offline-first operations, built-in encryption, optional data compression, and live syncing with any backend, RxDB provides a powerful solution. Start quickly with localstorage for local development and testing - then scale up to the premium SQLite storage for optimal performance on production mobile devices. Ready to learn more? Explore the RxDB Quickstart GuideCheck out RxDB Encryption to protect user dataLearn about SQLite Storage in RxDB Premium for top performance on mobile.Join our community on the RxDB Chat RxDB - The ultimate toolkit for Ionic developers seeking offline-first, secure, and compressed local data, with real-time sync to any server. ","version":"Next","tagName":"h2"},{"title":"RxDB as a Database in a jQuery Application","type":0,"sectionRef":"#","url":"/articles/jquery-database.html","content":"","keywords":"","version":"Next"},{"title":"jQuery Web Applications​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#jquery-web-applications","content":" jQuery provides a simple API for DOM manipulation, event handling, and AJAX calls. It has been widely adopted due to its ease of use and strong community support. Many projects continue to rely on jQuery for handling client-side functionality, UI interactions, and animations. As these applications evolve, the need for a robust database solution that can manage data locally (and offline) becomes increasingly important. ","version":"Next","tagName":"h2"},{"title":"Importance of Databases in jQuery Applications​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#importance-of-databases-in-jquery-applications","content":" Modern, data-driven jQuery applications often need to: Store and retrieve data locally for quick and responsive user experiences.Synchronize data between clients or with a central server.Handle offline scenarios seamlessly.Handle large or complex data structures without repeatedly hitting the server. Relying solely on server endpoints or basic browser storage (like localStorage) can quickly become unwieldy for larger or more complex use cases. Enter RxDB, a dedicated solution that manages data on the client side while offering real-time synchronization and offline-first capabilities. ","version":"Next","tagName":"h2"},{"title":"Introducing RxDB as a Database Solution​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#introducing-rxdb-as-a-database-solution","content":" RxDB (short for Reactive Database) is built on top of IndexedDB and leverages RxJS to provide a modern, reactive approach to handling data in the browser. With RxDB, you can store documents locally, query them in real-time, and synchronize changes with a remote server whenever an internet connection is available. ","version":"Next","tagName":"h2"},{"title":"Key Features​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#key-features","content":" Reactive Data Handling: RxDB emits real-time updates whenever your data changes, allowing you to instantly reflect these changes in the DOM with jQuery.Offline-First Approach: Keep your application usable even when the user's network is unavailable. Data is automatically synchronized once connectivity is restored.Data Replication: Enable multi-device or multi-tab synchronization with minimal effort.Observable Queries: Reduce code complexity by subscribing to queries instead of constantly polling for changes.Multi-Tab Support: If a user opens your jQuery application in multiple tabs, RxDB keeps data in sync across all sessions. 3:45 This solved a problem I've had in Angular for years ","version":"Next","tagName":"h3"},{"title":"Getting Started with RxDB​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#getting-started-with-rxdb","content":" ","version":"Next","tagName":"h2"},{"title":"What is RxDB?​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#what-is-rxdb","content":" RxDB is a client-side NoSQL database that stores data in the browser (or node.js) and synchronizes changes with other instances or servers. Its design embraces reactive programming principles, making it well-suited for real-time applications, offline scenarios, and multi-tab use cases. ","version":"Next","tagName":"h3"},{"title":"Reactive Data Handling​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#reactive-data-handling","content":" RxDB's use of observables enables an event-driven architecture where data mutations automatically trigger UI updates. In a jQuery application, you can subscribe to these changes and update DOM elements as soon as data changes occur - no need for manual refresh or complicated change detection logic. ","version":"Next","tagName":"h3"},{"title":"Offline-First Approach​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#offline-first-approach","content":" One of RxDB's distinguishing traits is its emphasis on offline-first design. This means your jQuery application continues to function, display, and update data even when there's no network connection. When connectivity is restored, RxDB synchronizes updates with the server or other peers, ensuring consistency across all instances. ","version":"Next","tagName":"h3"},{"title":"Data Replication​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#data-replication","content":" RxDB supports real-time data replication with different backends. By enabling replication, you ensure that multiple clients - be they multiple browser tabs or separate devices - stay in sync. RxDB's conflict resolution strategies help keep the data consistent even when multiple users make changes simultaneously. ","version":"Next","tagName":"h3"},{"title":"Observable Queries​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#observable-queries","content":" Instead of static queries, RxDB provides observable queries. Whenever data relevant to a query changes, RxDB re-emits the new result set. You can subscribe to these updates within your jQuery code and instantly reflect them in the UI. ","version":"Next","tagName":"h3"},{"title":"Multi-Tab Support​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#multi-tab-support","content":" Running your jQuery app in multiple tabs? RxDB automatically synchronizes changes between those tabs. Users can freely switch windows without missing real-time updates. ","version":"Next","tagName":"h3"},{"title":"RxDB vs. Other jQuery Database Options​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#rxdb-vs-other-jquery-database-options","content":" Historically, jQuery developers might use localStorage or raw IndexedDB for storing data. However, these solutions can require significant boilerplate, lack reactivity, and offer no built-in sync or conflict resolution. RxDB fills these gaps with an out-of-the-box solution, abstracting away low-level database complexities and providing an event-driven, offline-capable approach. ","version":"Next","tagName":"h3"},{"title":"Using RxDB in a jQuery Application​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#using-rxdb-in-a-jquery-application","content":" ","version":"Next","tagName":"h2"},{"title":"Installing RxDB​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#installing-rxdb","content":" Install RxDB (and rxjs) via npm or yarn: npm install rxdb rxjs If your project isn't set up with a build process, you can still use bundlers like Webpack or Rollup, or serve RxDB as a UMD bundle. Once included, you'll have access to RxDB globally or via import statements. ","version":"Next","tagName":"h3"},{"title":"Creating and Configuring a Database​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#creating-and-configuring-a-database","content":" Below is a minimal example of how to create an RxDB instance and collection. You can call this when your page initializes, then store the db object for later use: import { createRxDatabase } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; async function initDatabase() { const db = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage(), password: 'myPassword', // optional encryption password multiInstance: true, // multi-tab support eventReduce: true // optimizes event handling }); await db.addCollections({ hero: { schema: { title: 'hero schema', version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string' }, name: { type: 'string' }, points: { type: 'number' } } } } }); return db; } ","version":"Next","tagName":"h2"},{"title":"Updating the DOM with jQuery​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#updating-the-dom-with-jquery","content":" Once you have your RxDB instance, you can query data reactively and use jQuery to manipulate the DOM: // Example: Displaying heroes using jQuery $(document).ready(async function () { const db = await initDatabase(); // Subscribing to all hero documents db.hero .find() .$ // the observable .subscribe((heroes) => { // Clear the list $('#heroList').empty(); // Append each hero to the DOM heroes.forEach((hero) => { $('#heroList').append(` <li> <strong>${hero.name}</strong> - Points: ${hero.points} </li> `); }); }); // Example of adding a new hero $('#addHeroBtn').on('click', async () => { const heroName = $('#heroName').val(); const heroPoints = parseInt($('#heroPoints').val(), 10); await db.hero.insert({ id: Date.now().toString(), name: heroName, points: heroPoints }); }); }); With this approach, any time data in the hero collection changes - like when a new hero is added - your jQuery code re-renders the list of heroes automatically. ","version":"Next","tagName":"h2"},{"title":"Different RxStorage layers for RxDB​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#different-rxstorage-layers-for-rxdb","content":" RxDB supports multiple storage backends (RxStorage layers). Some popular ones: LocalStorage.js RxStorage: Uses the browsers localstorage. Fast and easy to set up.IndexedDB RxStorage: Direct IndexedDB usage, suitable for modern browsers.OPFS RxStorage: Uses the File System Access API for better performance in supported browsers.Memory RxStorage: Stores data in memory, handy for tests or ephemeral data.SQLite RxStorage: Uses SQLite (potentially via WebAssembly). In typical browser-based scenarios, localstorage or IndexedDB storage is usually more straightforward. ","version":"Next","tagName":"h2"},{"title":"Synchronizing Data with RxDB between Clients and Servers​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#synchronizing-data-with-rxdb-between-clients-and-servers","content":" ","version":"Next","tagName":"h2"},{"title":"Offline-First Approach​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#offline-first-approach-1","content":" RxDB's offline-first approach allows your jQuery application to store and query data locally. Users can continue interacting, even offline. When connectivity returns, RxDB syncs to the server. ","version":"Next","tagName":"h3"},{"title":"Conflict Resolution​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#conflict-resolution","content":" Should multiple clients update the same document, RxDB offers conflict handling strategies. You decide how to resolve conflicts - like keeping the latest edit or merging changes - ensuring data integrity across distributed systems. ","version":"Next","tagName":"h3"},{"title":"Bidirectional Synchronization​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#bidirectional-synchronization","content":" With RxDB, data changes flow both ways: from client to server and from server to client. This real-time synchronization ensures that all users or tabs see consistent, up-to-date data. ","version":"Next","tagName":"h3"},{"title":"Advanced RxDB Features and Techniques​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#advanced-rxdb-features-and-techniques","content":" ","version":"Next","tagName":"h2"},{"title":"Indexing and Performance Optimization​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#indexing-and-performance-optimization","content":" Create indexes on frequently queried fields to speed up performance. For large data sets, indexing can drastically improve query times, keeping your jQuery UI snappy. ","version":"Next","tagName":"h3"},{"title":"Encryption of Local Data​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#encryption-of-local-data","content":" RxDB supports encryption to secure data stored in the browser. This is crucial if your application handles sensitive user information. ","version":"Next","tagName":"h3"},{"title":"Change Streams and Event Handling​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#change-streams-and-event-handling","content":" Use change streams to listen for data modifications at the database or collection level. This can trigger real-timeUI updates, notifications, or custom logic whenever the data changes. ","version":"Next","tagName":"h3"},{"title":"JSON Key Compression​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#json-key-compression","content":" If your data model has large or repetitive field names, JSON key compression can minimize stored document size and potentially boost performance. ","version":"Next","tagName":"h3"},{"title":"Best Practices for Using RxDB in jQuery Applications​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#best-practices-for-using-rxdb-in-jquery-applications","content":" Centralize Your Database: Initialize and configure RxDB in one place. Expose the instance where needed or store it globally to avoid re-creating it on every script.Leverage Observables: Instead of polling or manually refreshing data, rely on RxDB's reactivity. Subscribe to queries and let RxDB inform you when data changes.Handle Subscriptions: If you create subscriptions in a single-page context, ensure you don't re-subscribe endlessly or create memory leaks. Clean them up if you're navigating away or removing DOM elements.Offline Testing: Thoroughly test how your jQuery app behaves without a network connection. Simulate offline states in your browser's dev tools or with flight mode to ensure the user experience remains smooth.Performance Profiling: For large data sets or frequent data updates, add indexes and carefully measure query performance. Optimize only where needed. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB as a Database in a jQuery Application","url":"/articles/jquery-database.html#follow-up","content":" To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects.RxDB Examples: Browse official examples to see RxDB in action and learn best practices you can apply to your own project - even if jQuery isn't explicitly featured, the patterns are similar. ","version":"Next","tagName":"h2"},{"title":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","type":0,"sectionRef":"#","url":"/articles/json-based-database.html","content":"","keywords":"","version":"Next"},{"title":"Why JSON-Based Databases Are Typically NoSQL​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#why-json-based-databases-are-typically-nosql","content":" ","version":"Next","tagName":"h2"},{"title":"Document-Oriented by Nature​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#document-oriented-by-nature","content":" When your data is stored as JSON, each record or document can hold nested arrays and sub-objects with no forced table schema. NoSQL solutions such as MongoDB, CouchDB, Firebase, and RxDB store and retrieve these documents in their “raw” JSON form. This model integrates smoothly with how front-end applications already handle data, minimizing transformations and improving developer productivity. ","version":"Next","tagName":"h3"},{"title":"Flexible, Schema-Agnostic​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#flexible-schema-agnostic","content":" Traditional SQL tables enforce rigid column definitions and demand explicit schema migrations when you add or rename a field. By contrast, NoSQL solutions accept more dynamic data structures, allowing changes on the fly. This means a front-end developer can add a new field to a JSON object—perhaps for a new feature—without the friction of redefining or migrating a database schema. While this is possible, it is often not recommended. ","version":"Next","tagName":"h3"},{"title":"Aligned With Evolving User Interfaces​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#aligned-with-evolving-user-interfaces","content":" As modern UIs frequently manipulate deeply nested or changing data, developers find it easier to store whole objects directly, saving time that might otherwise be spent performing complex joins or normalizing data. For instance, frameworks like React, Vue, or Angular are inherently comfortable with nested JSON structures, which map more directly to NoSQL’s “document” approach than to relational tables. ","version":"Next","tagName":"h3"},{"title":"Is NoSQL “Better” Than SQL?​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#is-nosql-better-than-sql","content":" It depends on your application. SQL remains exceptional for complex aggregations, enforced relationships, and sophisticated transaction handling. But NoSQL is often more intuitive and easier to maintain for “document-first” applications that: Thrive on flexible or rapidly evolving data models.Rely on hierarchical or nested JSON objects.Avoid multi-table joins.Require easy horizontal scaling for large sets of documents. Relational databases are still a top choice for many enterprise back-ends, especially when advanced analytics or strongly enforced referential integrity is needed. But if your application is predominantly storing and manipulating JSON documents (e.g., user profiles, real-time chat logs, embedded items), a JSON-based or document-oriented approach can greatly reduce friction during development. ","version":"Next","tagName":"h2"},{"title":"When to Prefer SQL Instead of JSON/NoSQL​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#when-to-prefer-sql-instead-of-jsonnosql","content":" NoSQL solutions—particularly JSON-based document stores—provide a natural fit for flexible, nested data in UI-heavy applications. However, certain scenarios may benefit more from a SQL solution: Complex Relationships: If your data demands intricate joins across multiple entities (e.g., many-to-many relationships that can’t easily be embedded in a single document), a well-structured relational schema can simplify queries.Strong Integrity and Constraints: SQL excels at enforcing constraints such as foreign keys, unique constraints, and advanced triggers. If your system needs strict data validation and complex business logic within the database, SQL might prove more robust.High-End Analytical Queries: Relational databases can handle sophisticated aggregations, groupings, and joins more efficiently. If your app frequently runs advanced SQL queries, a NoSQL approach may complicate or slow down analytics.Legacy Integration: Many enterprise systems are built around existing relational schemas. A purely NoSQL approach might mean rewriting or bridging systems that are heavily reliant on SQL constraints and transformations.Transaction Handling: While many NoSQL solutions have improved transaction support, it can still lag behind well-established SQL transaction models. If ACID properties and multi-operation atomicity are paramount, you might prefer a tried-and-true relational engine. In short, if you prioritize advanced relational queries, robust constraints, or complex business rules at the database level, SQL remains a powerful, and possibly superior, choice. For user-centric, fast-evolving JSON data, though, NoSQL or JSON-based solutions often reduce the friction of frequent schema changes. ","version":"Next","tagName":"h2"},{"title":"Storing JSON in Traditional SQL Databases​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#storing-json-in-traditional-sql-databases","content":" ","version":"Next","tagName":"h2"},{"title":"JSON Columns in PostgreSQL or MySQL​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#json-columns-in-postgresql-or-mysql","content":" To accommodate the demand for flexible data, several SQL engines (notably PostgreSQL and MySQL) introduced support for JSON columns. PostgreSQL offers the JSON and JSONB types, enabling developers to store raw JSON in a column. You can also index specific paths within the JSON to speed lookups on nested fields: CREATE TABLE products ( id SERIAL PRIMARY KEY, name TEXT, details JSONB ); -- Insert a record with JSON data INSERT INTO products (name, details) VALUES ('Laptop', '{"brand": "BrandX", "features": ["Touchscreen", "SSD"]}'); Although this approach merges the best of both worlds (SQL queries + flexible JSON fields), it can also create a “split personality” in your schema. You might store stable data in normal columns, while unpredictable or nested details live inside a JSONB field. Some projects flourish with this hybrid design, others find it a bit unwieldy. ","version":"Next","tagName":"h3"},{"title":"Storing JSON in SQLite​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#storing-json-in-sqlite","content":" SQLite also allows storing JSON data, typically as text columns, but with some additional features since SQLite 3.9 (2015) including the JSON1 extension. This extension can parse JSON text, perform queries on JSON fields, and do partial updates. However, storing JSON in SQLite does require you to ensure you’ve compiled SQLite with JSON1 support or to rely on a library that bundles it. While possible, you still won't get quite the same schema-agnostic ease as a full document store, but it’s a pragmatic solution for smaller or embedded needs on the server side—or occasionally in the browser if you run SQLite via WebAssembly. RxDB uses this in its SQLite storage. ","version":"Next","tagName":"h2"},{"title":"JSON vs. Database - Why a Plain JSON Text File is a Problem​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#json-vs-database---why-a-plain-json-text-file-is-a-problem","content":" Some developers consider storing everything in a single JSON file, typically read and written directly from disk or local storage. This approach, while seemingly simple, usually does not scale. Key issues include: No Concurrency: If multiple parts of the application try to write to the same JSON file, you risk overwriting changes.No Indexes: Finding or filtering items in large JSON text requires scanning everything. This is slow and quickly becomes unmanageable.No Partial Updates: You often reload the entire file, modify it in memory, then write it back, which is highly inefficient for large data sets.Corruption Risk: A single corrupted write or partial save might break the entire JSON file, losing all data.High Memory Usage: The entire file may need to be parsed into memory, even if you only need a fraction of the data. Databases—relational or NoSQL—solve these issues by handling concurrency, enabling partial reads/writes, establishing indexes, and ensuring transactional integrity so you don’t lose everything if the process is interrupted mid-write. ","version":"Next","tagName":"h2"},{"title":"RxDB: A JSON-Focused Database for JavaScript Apps​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#rxdb-a-json-focused-database-for-javascript-apps","content":" Many NoSQL databases operate on the server, whereas RxDB is built for client-side usage—browsers, mobile apps, or Node.js. It specializes in JSON documents and embraces an offline-first philosophy. ","version":"Next","tagName":"h2"},{"title":"Key Characteristics​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#key-characteristics","content":" Local JSON Storage RxDB stores each record as a JSON document, closely matching how front-end frameworks handle state. This eliminates complex transformations or manual JSON parsing before writing to a table. Reactive Queries Instead of complex SQL, RxDB uses JSON-based query definitions. You can subscribe to query results, letting your UI automatically refresh when data changes locally or from remote sync updates: Offline-First Sync Built-in replication plugins push/pull changes to or from a remote server. If your app is offline, updates get stored locally, then sync up seamlessly once a connection is available. Optional JSON-Schema Though it’s a document database, RxDB encourages you to define a JSON-based schema for clarity, indexing, and type validation. This helps maintain data consistency while still allowing a measure of flexibility for new fields. ","version":"Next","tagName":"h3"},{"title":"Advanced JSON Features in RxDB​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#advanced-json-features-in-rxdb","content":" JSON-Schema: By specifying a JSON-Schema, you can define which fields exist, whether they are required, and their data types. This is invaluable for catching malformed documents early and imposing mild structure in a NoSQL setting. JSON Key-Compression: Large, verbose field names can bloat storage usage. RxDB’s optional key-compression plugin automatically shortens field names in your JSON documents internally, reducing disk space and bandwidth: // Example: how key-compression can transform your documents const uncompressed = { "firstName": "Corrine", "lastName": "Ziemann", "shoppingCartItems": [ { "productNumber": 29857, "amount": 1 }, { "productNumber": 53409, "amount": 6 } ] }; const compressed = { "|e": "Corrine", "|g": "Ziemann", "|i": [ { "|h": 29857, "|b": 1 }, { "|h": 53409, "|b": 6 } ] }; The user sees no difference in their code—RxDB automatically decompresses data on read—but the overhead is drastically reduced behind the scenes. ","version":"Next","tagName":"h3"},{"title":"Follow Up​","type":1,"pageTitle":"JSON-Based Databases: Why NoSQL and RxDB Simplify App Development","url":"/articles/json-based-database.html#follow-up","content":" JSON-based databases naturally align with NoSQL because they accommodate evolving, nested data without rigid schemas. This makes them appealing for many UI-centric or offline-first applications where flexible documents and agile development cycles matter more than heavy relational queries or constraints. SQL can still store JSON—whether in PostgreSQL’s JSONB columns, MySQL’s JSON fields, or SQLite’s JSON1 extension. For some teams, a hybrid approach pairing SQL for relational data with JSON columns for more flexible fields works well. However, storing everything in a single monolithic JSON text file is rarely advisable for anything beyond trivial tasks—databases excel at concurrency, indexing, and partial writes. Tools like RxDB provide an even simpler, local-first take on JSON documents—particularly for JavaScript projects. With offline replication, reactive queries, optional JSON-Schema, and advanced optimizations such as key-compression, RxDB streamlines building dynamic, user-facing features while preserving the core benefits of a robust document database. To explore more about RxDB and its capabilities for browser database development, check out the following resources: RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects.RxDB Examples: Browse official examples to see RxDB in action and learn best practices you can apply to your own project - even if jQuery isn't explicitly featured, the patterns are similar. ","version":"Next","tagName":"h2"},{"title":"RxDB - JSON Database for JavaScript","type":0,"sectionRef":"#","url":"/articles/json-database.html","content":"","keywords":"","version":"Next"},{"title":"Why Choose a JSON Database?​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#why-choose-a-json-database","content":" JavaScript Friendliness: JavaScript, a prevalent language for web development, naturally uses JSON for data representation. Using a JSON database aligns seamlessly with JavaScript's native data format. Compatibility: JSON is widely supported across different programming languages and platforms. Storing data in JSON format ensures compatibility with a broad range of tools and systems. All modern programming ecosystems have packages to parse, validate and process JSON data. Flexibility: JSON documents can accommodate complex and nested data structures, allowing developers to store data in a more intuitive and hierarchical manner compared to SQL table rows. Nested data can be just stored in-document instead of having related tables. Human-Readable: JSON is easy to read and understand, simplifying debugging and data inspection tasks. ","version":"Next","tagName":"h2"},{"title":"Storage and Access Options for JSON Documents​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#storage-and-access-options-for-json-documents","content":" When incorporating JSON documents into your application, you have several storage and access options to consider: Local In-App Database with In-Memory Storage: Ideal for lightweight applications or temporary data storage, this option keeps data in memory, ensuring fast read and write operations. However, data is not persistet beyond the current application session, making it suitable for temporary data storage. With RxDB, the memory RxStorage can be utilized to create an in-memory database. Local In-App Database with Persistent Storage: Suitable for applications requiring data retention across sessions. Data is stored on the user's device or inside of the Node.js application, offering persistence between application sessions. It balances speed and data retention, making it versatile for various applications. With RxDB, a whole range of persistent storages is available. As example, for browser there is the IndexedDB storage. For server side applications, the Node.js Filesystem storage can be used. There are many more storages for React-Native, Flutter, Capacitors.js and others. Server Database Connected to the Application: For applications requiring data synchronization and accessibility from multiple processes, a server-based database is the preferred choice. Data is stored on a remote server, facilitating data sharing, synchronization, and accessibility across multiple processes. It's suitable for scenarios requiring centralized data management and enhanced security and backup capabilities on the server. RxDB supports the FoundationDB and MongoDB as a remote database server. ","version":"Next","tagName":"h2"},{"title":"Compression Storage for JSON Documents​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#compression-storage-for-json-documents","content":" Compression storage for JSON documents is made effortless with RxDB's key-compression plugin. This feature enables the efficient storage of compressed document data, reducing storage requirements while maintaining data integrity. Queries on compressed documents remain seamless, ensuring that your application benefits from both space-saving advantages and optimal query performance, making RxDB a compelling choice for managing JSON data efficiently. The compression happens inside of the RxDatabase and does not affect the API usage. The only limitation is that encrypted fields themself cannot be used inside a query. ","version":"Next","tagName":"h2"},{"title":"Schema Validation and Data Migration on Schema Changes​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#schema-validation-and-data-migration-on-schema-changes","content":" Storing JSON documents inside of a database in an application, can cause a problem when the format of the data changes. Instead of having a single server where the data must be migrated, many client devices are out there that have to run a migration. When your application's schema evolves, RxDB provides migration strategies to facilitate the transition, ensuring data consistency throughout schema updates. JSONSchema Validation Plugins: RxDB supports multiple JSONSchema validation plugins, guaranteeing that only valid data is stored in the database. RxDB uses the JsonSchema standardization that you might know from other technologies like OpenAPI (aka Swagger). // RxDB Schema example const mySchema = { version: 0, primaryKey: 'id', // <- define the primary key for your documents type: 'object', properties: { id: { type: 'string', maxLength: 100 // <- the primary key must have set maxLength }, name: { type: 'string', maxLength: 100 }, done: { type: 'boolean' }, timestamp: { type: 'string', format: 'date-time' } }, required: ['id', 'name', 'done', 'timestamp'] } ","version":"Next","tagName":"h2"},{"title":"Store JSON with RxDB in Browser Applications​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#store-json-with-rxdb-in-browser-applications","content":" RxDB offers versatile storage solutions for browser-based applications: Multiple Storage Plugins: RxDB supports various storage backends, including IndexedDB, localstorage and In-Memory, catering to a range of browser environments. Observable Queries: With RxDB, you can create observable queries that work seamlessly across multiple browser tabs, providing real-time updates and synchronization. ","version":"Next","tagName":"h2"},{"title":"RxDB JSON Database Performance​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#rxdb-json-database-performance","content":" Certainly! Let's delve deeper into the performance aspects of RxDB when it comes to working with JSON data. Efficient Querying: RxDB is engineered for rapid and efficient querying of JSON data. It employs a well-optimized indexing system that allows for lightning-fast retrieval of specific data points within your JSON documents. Whether you're fetching individual values or complex nested structures, RxDB's query performance is designed to keep your application responsive, even when dealing with large datasets. Scalability: As your application grows and your JSON dataset expands, RxDB scales gracefully. Its performance remains consistent, enabling you to handle increasingly larger volumes of data without compromising on speed or responsiveness. This scalability is essential for applications that need to accommodate growing user bases and evolving data needs. Reduced Latency: RxDB's streamlined data access mechanisms significantly reduce latency when working with JSON data. Whether you're reading from the database, making updates, or synchronizing data between clients and servers, RxDB's optimized operations help minimize the delays often associated with data access. Observed queries are optimized with the EventReduce algorithm to provide nearly-instand UI updates on data changes. RxStorage Layer: Because RxDB allows you to swap out the storage layer. A storage with the most optimal performance can be chosen for each runtime while not touching other database code. Depending on the access patterns, you can pick exactly the storage that is best: ","version":"Next","tagName":"h2"},{"title":"RxDB in Node.js​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#rxdb-in-nodejs","content":" Node.js developers can also benefit from RxDB's capabilities. By integrating RxDB into your Node.js applications, you can harness the power of a NoSQL JSON db to efficiently manage your data on the server-side. RxDB's flexibility, performance, and essential features are equally valuable in server-side development. Read more about RxDB+Node.js. ","version":"Next","tagName":"h2"},{"title":"RxDB to store JSON documents in React Native​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#rxdb-to-store-json-documents-in-react-native","content":" For mobile app developers working with React Native, RxDB offers a convenient solution for handling JSON data. Whether you're building Android or iOS applications, RxDB's compatibility with JavaScript and its ability to work with JSON documents make it a natural choice for data management within your React Native apps. Read more about RxDB+React-Native. ","version":"Next","tagName":"h2"},{"title":"Using SQLite as a JSON Database​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#using-sqlite-as-a-json-database","content":" In some cases, you might want to use SQLite as a backend storage solution for your JSON data. RxDB can be configured to work with SQLite, providing the benefits of both a relational database system and JSON document storage. This hybrid approach can be advantageous when dealing with complex data relationships while retaining the flexibility of JSON data representation. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB - JSON Database for JavaScript","url":"/articles/json-database.html#follow-up","content":" To further explore RxDB and get started with using it in your frontend applications, consider the following resources: RxDB Quickstart: A step-by-step guide to quickly set up RxDB in your project and start leveraging its features.RxDB GitHub Repository: The official repository for RxDB, where you can find the code, examples, and community support. By embracing RxDB as your JSON database solution, you can tap into the extensive capabilities of JSON data storage. This empowers your applications with offline accessibility, caching, enhanced performance, and effortless data synchronization. RxDB's focus on JavaScript and its robust feature set render it the perfect selection for frontend developers in pursuit of efficient and scalable data storage solutions. ","version":"Next","tagName":"h2"},{"title":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","type":0,"sectionRef":"#","url":"/articles/local-database.html","content":"","keywords":"","version":"Next"},{"title":"Use Cases of Local Databases​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#use-cases-of-local-databases","content":" Local databases are particularly beneficial for: Offline Functionality: Essential for apps that must remain usable without a consistent internet connection, such as note-taking apps or offline-first CRMs. Users can continue adding and editing data, then sync changes once they reconnect.Low Latency: By reducing round-trips to remote servers, local databases enable real-time responsiveness. This feature is critical for interactive applications such as gaming platforms, data dashboards, or analytics tools that need near-instant feedback.Data Synchronization: Many modern applications - like chat systems or collaborative editing tools - require continuous data exchange between multiple users or devices. Local databases can handle intermittent connectivity gracefully, queuing updates locally and syncing them when possible. In addition, local databases are increasingly integral to Progressive Web Apps (PWAs), offering a native app-like user experience that is fast and available, even when offline. ","version":"Next","tagName":"h3"},{"title":"Performance Optimization​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#performance-optimization","content":" The primary performance benefit of a local database is its proximity to the application: queries and updates happen directly on the user's device, eliminating the overhead of multiple network hops. Common optimizations include: Caching: Storing frequently accessed data in memory or on disk to minimize expensive operations.Batching Writes: Grouping database operations into a single write transaction to reduce overhead and lock contention.Efficient Indexing: Using appropriate indexes to speed up queries, especially important for applications that handle large data sets or frequent lookups. These techniques ensure that local databases run smoothly, even on lower-powered or mobile devices. ","version":"Next","tagName":"h3"},{"title":"Security and Encryption​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#security-and-encryption","content":" Storing data on user devices introduces unique security considerations, such as the risk of physical theft or unauthorized access. Consequently, many local databases support encryption options to safeguard sensitive information. Developers can implement additional security measures like device-level encryption, secure storage plugins, and user authentication to further protect data from prying eyes. ","version":"Next","tagName":"h3"},{"title":"Why RxDB is Optimized for JavaScript Applications​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#why-rxdb-is-optimized-for-javascript-applications","content":" RxDB (Reactive Database) is an offline-first, NoSQL database designed to meet the needs of modern JavaScript applications. Built with a focus on reactivity and real-time data handling, RxDB excels in scenarios where low-latency, offline availability, and scalability are essential. ","version":"Next","tagName":"h2"},{"title":"Real-Time Reactivity​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#real-time-reactivity","content":" At the core of RxDB is reactive programming, allowing you to subscribe to changes in your data collections and receive immediate UI updates when records change - no manual polling or refetching required. For instance, a chat application can display incoming messages as soon as they arrive, maintaining a smooth and responsive experience. ","version":"Next","tagName":"h3"},{"title":"Offline-First Support​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#offline-first-support","content":" RxDB's primary design goal is to work seamlessly in offline environments. Even if your device loses internet connectivity, RxDB enables you to continue reading and writing data. Once the connection is restored, all pending changes are automatically synchronized with your backend. This offline-first approach is ideal for productivity apps, field service tools, and other scenarios where reliability and user autonomy are paramount. ","version":"Next","tagName":"h3"},{"title":"Flexible Data Replication​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#flexible-data-replication","content":" A standout feature of RxDB is its bi-directional replication. It supports synchronization with a variety of backends, such as: CouchDB: Via the CouchDB replication, facilitating easy integration with any Couch-compatible server.GraphQL Endpoints: Through community plugins, developers can replicate JSON documents to and from GraphQL servers.Custom Backends: RxDB provides hooks to build custom replication strategies for proprietary or specialized server APIs. This flexibility ensures that RxDB fits into diverse architectures without locking you into a single vendor or technology stack. ","version":"Next","tagName":"h3"},{"title":"Schema Validation and Versioning​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#schema-validation-and-versioning","content":" Rather than relying on implicit data models, RxDB leverages JSON schema to define document structures. This approach promotes data consistency by enforcing constraints such as required fields and acceptable data formats. As your application grows and changes, RxDB's built-in schema versioning and migration tools help you evolve your database schema safely, minimizing risks of data corruption or loss. ","version":"Next","tagName":"h3"},{"title":"Rich Plugin Ecosystem​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#rich-plugin-ecosystem","content":" One of RxDB's greatest strengths is its pluggable architecture, allowing you to add functionality as needed: Encryption: Secure your data at rest using advanced encryption plugins.Full-Text Search: Integrate powerful text search capabilities for applications that require quick and flexible query options.Storage Adapters: Swap out the underlying storage layer (e.g., IndexedDB in the browser, SQLite in React Native, or a custom engine) without rewriting your application logic. You can fine-tune RxDB to your exact needs, avoiding the performance overhead of unnecessary features. ","version":"Next","tagName":"h3"},{"title":"Multi-Platform Compatibility​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#multi-platform-compatibility","content":" RxDB is a perfect fit for cross-platform development, as it supports numerous environments: Browsers (IndexedDB): For web and PWA projects.Node.js: Ideal for server-side rendering or background services.React Native: Leverage SQLite or other adapters for mobile app development.Electron: Create offline-capable desktop apps with a unified codebase. This versatility empowers teams to reuse application logic across multiple platforms while maintaining a consistent data model. ","version":"Next","tagName":"h3"},{"title":"Performance Optimization​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#performance-optimization-1","content":" With lazy loading of data and the ability to utilize efficient storage engines, RxDB delivers high-speed operations and quick response times. By minimizing disk I/O and leveraging indexes effectively, RxDB ensures that even large-scale applications remain performant. Its reactive nature also helps avoid unnecessary re-renders, improving the end-user experience. ","version":"Next","tagName":"h3"},{"title":"Proven Reliability​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#proven-reliability","content":" RxDB is battle-tested in production environments, handling use cases from small single-user applications to large-scale enterprise solutions. Its robust replication mechanism resolves conflicts, manages concurrent writes, and ensures data integrity. The active open-source community provides ongoing support, documentation updates, and feature improvements. ","version":"Next","tagName":"h3"},{"title":"Developer-Friendly Features​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#developer-friendly-features","content":" For developers, RxDB offers: Straightforward APIs: Built on top of familiar JavaScript paradigms like promises and observables.Excellent Documentation: Detailed guides, tutorials, and references for every major feature.Rich Community Support: Benefit from an active ecosystem of contributors creating plugins, answering questions, and maintaining core libraries. These qualities streamline development, making RxDB an appealing choice for teams of all sizes. ","version":"Next","tagName":"h3"},{"title":"Follow Up​","type":1,"pageTitle":"What is a Local Database and Why RxDB is the Best Local Database for JavaScript Applications","url":"/articles/local-database.html#follow-up","content":" Ready to get started? Here are some next steps: Try the Quickstart Tutorial and build a basic project to see RxDB in action.Compare RxDB with other local database solutions to determine the best fit for your unique requirements. Ultimately, RxDB is more than just a database - it's a robust, reactive toolkit that empowers you to build fast, resilient, and user-centric applications. Whether you're creating an offline-first note-taking app or a real-time collaborative platform, RxDB can handle your local storage needs with ease and flexibility. ","version":"Next","tagName":"h2"},{"title":"Local Vector Database with RxDB and transformers.js in JavaScript","type":0,"sectionRef":"#","url":"/articles/javascript-vector-database.html","content":"","keywords":"","version":"Next"},{"title":"What is a Vector Database?​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#what-is-a-vector-database","content":" A vector database is a specialized database optimized for storing and querying data in the form of high-dimensional vectors, often referred to as embeddings. These embeddings are numerical representations of data, such as text, images, or audio, created by machine learning models like MiniLM. Unlike traditional databases that work with exact matches on predefined fields, vector databases focus on semantic similarity, allowing you to query data based on meaning rather than exact values. A vector, or embedding, is essentially an array of numbers, like [0.56, 0.12, -0.34, -0.90]. For example, instead of asking "Which document has the word 'database'?", you can query "Which documents discuss similar topics to this one?" The vector database compares embeddings and returns results based on how similar the vectors are to each other. Vector databases handle multiple types of data beyond text, including images, videos, and audio files, all transformed into embeddings for efficient querying. Mostly you would not train a model by yourself and instead use one of the public available transformer models. Vector databases are highly effective in various types of applications: Similarity Search: Finds the closest matches to a query, even when the query doesn't contain the exact terms.Clustering: Groups similar items based on the proximity of their vector representations.Recommendations: Suggests items based on shared characteristics.Anomaly Detection: Identifies outliers that differ from the norm.Classification: Assigns categories to data based on its vector's nearest neighbors. In this tutorial, we will build a vector database designed as a Similarity Search for text. For other use cases, the setup can be adapted accordingly. This flexibility is why RxDB doesn't provide a dedicated vector-database plugin, but rather offers utility functions to help you build your own vector search system. ","version":"Next","tagName":"h2"},{"title":"Generating Embeddings Locally in a Browser​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#generating-embeddings-locally-in-a-browser","content":" For the first step to build a local-first vector database we need to compute embeddings directly on the user's device. This is where transformers.js from huggingface comes in, allowing us to run machine learning models in the browser with WebAssembly. Below is an implementation of a getEmbeddingFromText() function, which takes a piece of text and transforms it into an embedding using the Xenova/all-MiniLM-L6-v2 model: import { pipeline } from "@xenova/transformers"; const pipePromise = pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2'); async function getEmbeddingFromText(text) { const pipe = await pipePromise; const output = await pipe(text, { pooling: "mean", normalize: true, }); return Array.from(output.data); } This function creates an embedding by running the text through a pre-trained model and returning it in the form of an array of numbers, which can then be stored and further processed locally. note Vector embeddings from different machine learning models or versions are not compatible with each other. When you change your model, you have to recreate all embeddings for your data. ","version":"Next","tagName":"h2"},{"title":"Storing the Embeddings in RxDB​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#storing-the-embeddings-in-rxdb","content":" To store the embeddings, first we have to create our RxDB Database with the localstorage storage that stores data in the browsers localstorage. For more advanced projects, you can use any other RxStorage. import { createRxDatabase } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageLocalstorage() }); Then we add a items collection that stores our documents with the text field that stores the content. await db.addCollections({ items: { schema: { version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 20 }, text: { type: 'string' } }, required: ['id', 'text'] } } }); const itemsCollection = db.items; In our example repo, we use the Wiki Embeddings dataset from supabase which was transformed and used to fill up the items collection with test data. const imported = await itemsCollection.count().exec(); const response = await fetch('./files/items.json'); const items = await response.json(); const insertResult = await itemsCollection.bulkInsert( items ); Also we need a vector collection that stores our embeddings. RxDB, as a NoSQL database, allows for the storage of flexible data structures, such as embeddings, within documents. To achieve this, we need to define a schema that specifies how the embeddings will be stored alongside each document. The schema includes fields for an id and the embedding array itself. await db.addCollections({ vector: { schema: { version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 20 }, embedding: { type: 'array', items: { type: 'string' } } }, required: ['id', 'embedding'] } } }); const vectorCollection = db.vector; When storing documents in the database, we need to ensure that the embeddings for these documents are generated and stored automatically. This requires a handler that runs during every document write, calling the machine learning model to generate the embeddings and storing them in a separate vector collection. Since our app runs in a browser, it's essential to avoid duplicate work when multiple browser tabs are open and ensure efficient use of resources. Furthermore, we want the app to resume processing documents from where it left off if it's closed or interrupted. To achieve this, RxDB provides a pipeline plugin, which allows us to set up a workflow that processes items and stores their embeddings. In our example, a pipeline takes batches of 10 documents, generates embeddings, and stores them in a separate vector collection. const pipeline = await itemsCollection.addPipeline({ identifier: 'my-embeddings-pipeline', destination: vectorCollection, batchSize: 10, handler: async (docs) => { await Promise.all(docs.map(async(doc) => { const embedding = await getVectorFromText(doc.text); await vectorCollection.upsert({ id: doc.primary, embedding }); })); } }); However, processing data locally presents performance challenges. Running the handler with a batch size of 10 takes around 2-4 seconds per batch, meaning processing 10k documents would take up to an hour. To improve performance, we can do parallel processing using WebWorkers. A WebWorker runs on a different JavaScript process and we can start and run many of them in parallel. Our worker listens for messages and performance the embedding generation on each request. It then sends the result embedding back to the main thread. // worker.js import { getVectorFromText } from './vector.js'; onmessage = async (e) => { const embedding = await getVectorFromText(e.data.text); postMessage({ id: e.data.id, embedding }); }; On the main thread we spawn one worker per core and send the tasks to the worker instead of processing them on the main thread. // create one WebWorker per core const workers = new Array(navigator.hardwareConcurrency) .fill(0) .map(() => new Worker(new URL("worker.js", import.meta.url))); let lastWorkerId = 0; let lastId = 0; export async function getVectorFromTextWithWorker(text: string): Promise<number[]> { let worker = workers[lastWorkerId++]; if(!worker) { lastWorkerId = 0; worker = workers[lastWorkerId++]; } const id = (lastId++) + ''; return new Promise<number[]>(res => { const listener = (ev: any) => { if (ev.data.id === id) { res(ev.data.embedding); worker.removeEventListener('message', listener); } }; worker.addEventListener('message', listener); worker.postMessage({ id, text }); }); } const pipeline = await itemsCollection.addPipeline({ identifier: 'my-embeddings-pipeline', destination: vectorCollection, batchSize: navigator.hardwareConcurrency, // one per CPU core handler: async (docs) => { await Promise.all(docs.map(async (doc, i) => { const embedding = await getVectorFromTextWithWorker(doc.body); /* ... */ }); } }); This setup allows us to utilize the full hardware capacity of the client's machine. By setting the batch size to match the number of logical processors available (using the navigator.hardwareConcurrency API) and running one worker per processor, we can reduce the processing time for 10k embeddings to about 5 minutes on my developer laptop with 32 CPU cores. ","version":"Next","tagName":"h2"},{"title":"Comparing Vectors by calculating the distance​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#comparing-vectors-by-calculating-the-distance","content":" Now that we have stored our embeddings in the database, the next step is to compare these vectors to each other. Various methods are available to measure the similarity or difference between two vectors, such as Euclidean distance, Manhattan distance, Cosine similarity, and Jaccard similarity (and more). RxDB provides utility functions for each of these methods, making it easy to choose the most suitable method for your application. In this tutorial, we will use Euclidean distance to compare vectors. However, the ideal algorithm may vary depending on your data's distribution and the specific type of query you are performing. To find the optimal method for your app, it is up to you to try out all of these and compare the results. Each method gets two vectors as input and returns a single number. Here's how to calculate the Euclidean distance between two embeddings with the vector utilities from RxDB: import { euclideanDistance } from 'rxdb/plugins/vector'; const distance = euclideanDistance(embedding1, embedding2); console.log(distance); // 25.20443 With this we can sort multiple embeddings by how good they match our search query vector. ","version":"Next","tagName":"h2"},{"title":"Searching the Vector database with a full table scan​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#searching-the-vector-database-with-a-full-table-scan","content":" To find out if our embeddings have been stored correctly and that our vector comparison works as should, let's run a basic query to ensure everything functions as expected. In this query, we aim to find documents similar to a given user input text. The process involves calculating the embedding from the input text, fetching all documents, calculating the distance between their embeddings and the query embedding, and then sorting them based on their similarity. import { euclideanDistance } from 'rxdb/plugins/vector'; import { sortByObjectNumberProperty } from 'rxdb/plugins/core'; const userInput = 'new york people'; const queryVector = await getEmbeddingFromText(userInput); const candidates = await vectorCollection.find().exec(); const withDistance = candidates.map(doc => ({ doc, distance: euclideanDistance(queryVector, doc.embedding) })); const queryResult = withDistance.sort(sortByObjectNumberProperty('distance')).reverse(); console.dir(queryResult); note For distance-based comparisons, sorting should be in ascending order (smallest first), while for similarity-based algorithms, the sorting should be in descending order (largest first). If we inspect the results, we can see that the documents returned are ordered by relevance, with the most similar document at the top: note This demo page can be run online here. However our full-scan method presents a significant challenge: it does not scale well. As the number of stored documents increases, the time taken to fetch and compare embeddings grows proportionally. For example, retrieving embeddings from our test dataset of 10k documents takes around 700 milliseconds. If we scale up to 100k documents, this delay would rise to approximately 7 seconds, making the search process inefficient for larger datasets. ","version":"Next","tagName":"h2"},{"title":"Indexing the Embeddings for Better Performance​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#indexing-the-embeddings-for-better-performance","content":" To address the scalability issue, we need to store embeddings in a way that allows us to avoid fetching all of them from storage during a query. In traditional databases, you can sort documents by an index field, allowing efficient queries that retrieve only the necessary documents. An index organizes data in a structured, sortable manner, much like a phone book. However, with vector embeddings we are not dealing with simple, single values. Instead, we have large lists of numbers, which makes indexing more complex because we have more than one dimension. ","version":"Next","tagName":"h2"},{"title":"Vector Indexing Methods​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#vector-indexing-methods","content":" Various methods exist for indexing these vectors to improve query efficiency and performance: Locality Sensitive Hashing (LSH): LSH hashes data so that similar items are likely to fall into the same bucket, optimizing approximate nearest neighbor searches in high-dimensional spaces by reducing the number of comparisons.Hierarchical Small World: HSW is a graph structure designed for efficient navigation, allowing quick jumps across the graph while maintaining short paths between nodes, forming the basis for HNSW's optimization.Hierarchical Navigable Small Worlds (HNSW): HNSW builds a hierarchical graph for fast approximate nearest neighbor search. It uses multiple layers where higher layers represent fewer, more connected nodes, improving search efficiency in large datasets​.Distance to samples: While testing different indexing strategies, I found out that using the distance to a sample set of items is a good way to index embeddings. You pick like 5 random items of your data and get the embeddings for them out of the model. These are your 5 index vectors. For each embedding stored in the vector database, we calculate the distance to our 5 index vectors and store that number as an index value. This seems to work good because similar things have similar distances to other things. For example the words "shoe" and "socks" have a similar distance to "boat" and therefore should have roughly the same index value. When building local-first applications, performance is often a challenge, especially in JavaScript. With IndexedDB, certain operations, like many sequential get by id calls, are slow, while bulk operations, such as get by index range, are fast. Therefore, it's essential to use an indexing method that allows embeddings to be stored in a sortable way, like Locality Sensitive Hashing or Distance to Samples. In this article, we'll use Distance to Samples, because for me it provides the best default behavior for the sample dataset. ","version":"Next","tagName":"h3"},{"title":"Storing indexed embeddings in RxDB​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#storing-indexed-embeddings-in-rxdb","content":" The optimal way to store index values alongside embeddings in RxDB is to place them within the same RxCollection. To ensure that the index values are both sortable and precise, we convert them into strings with a fixed length of 10 characters. This standardization helps in managing values with many decimals and ensures proper sorting in the database. Here's is our schema example schema where each document contains an embedding and corresponding index fields: const indexSchema = { type: 'string', maxLength: 10 }; const schema = { "version": 0, "primaryKey": "id", "type": "object", "properties": { "id": { "type": "string", "maxLength": 100 }, "embedding": { "type": "array", "items": { "type": "number" } }, // index fields "idx0": indexSchema, "idx1": indexSchema, "idx2": indexSchema, "idx3": indexSchema, "idx4": indexSchema }, "required": [ "id", "embedding", "idx0", "idx1", "idx2", "idx3", "idx4" ], "indexes": [ "idx0", "idx1", "idx2", "idx3", "idx4" ] } To populate these index fields, we modify the RxPipeline handler accordingly to the Distance to samples method. We calculate the distance between the document's embedding and our set of 5 index vectors. The calculated distances are converted to string and stored in the appropriate index fields: import { euclideanDistance } from 'rxdb/plugins/vector'; const sampleVectors: number[][] = [/* the index vectors */]; const pipeline = await itemsCollection.addPipeline({ handler: async (docs) => { await Promise.all(docs.map(async(doc) => { const embedding = await getEmbedding(doc.text); const docData = { id: doc.primary, embedding }; // calculate the distance to all samples and store them in the index fields new Array(5).fill(0).map((_, idx) => { const indexValue = euclideanDistance(sampleVectors[idx], embedding); docData['idx' + idx] = indexNrToString(indexValue); }); await vectorCollection.upsert(docData); })); } }); ","version":"Next","tagName":"h3"},{"title":"Searching the Vector database with utilization of the indexes​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#searching-the-vector-database-with-utilization-of-the-indexes","content":" Once our embeddings are stored in an indexed format, we can perform searches much more efficiently than through a full table scan. While this indexing method boosts performance, it comes with a tradeoff: a slight loss in precision, meaning that the result set may not always be the optimal one. However, this is generally acceptable for similarity search use cases. There are multiple ways to leverage indexes for faster queries. Here are two effective methods: Query for Index Similarity in Both Directions: For each index vector, calculate the distance to the search embedding and fetch all relevant embeddings in both directions (sorted before and after) from that value. async function vectorSearchIndexSimilarity(searchEmbedding: number[]) { const docsPerIndexSide = 100; const candidates = new Set<RxDocument>(); await Promise.all( new Array(5).fill(0).map(async (_, i) => { const distanceToIndex = euclideanDistance(sampleVectors[i], searchEmbedding); const [docsBefore, docsAfter] = await Promise.all([ vectorCollection.find({ selector: { ['idx' + i]: { $lt: indexNrToString(distanceToIndex) } }, sort: [{ ['idx' + i]: 'desc' }], limit: docsPerIndexSide }).exec(), vectorCollection.find({ selector: { ['idx' + i]: { $gt: indexNrToString(distanceToIndex) } }, sort: [{ ['idx' + i]: 'asc' }], limit: docsPerIndexSide }).exec() ]); docsBefore.map(d => candidates.add(d)); docsAfter.map(d => candidates.add(d)); }) ); const docsWithDistance = Array.from(candidates).map(doc => { const distance = euclideanDistance((doc as any).embedding, searchEmbedding); return { distance, doc }; }); const sorted = docsWithDistance.sort(sortByObjectNumberProperty('distance')).reverse(); return { result: sorted.slice(0, 10), docReads }; } Query for an Index Range with a Defined Distance: Set an indexDistance and retrieve all embeddings within a specified range from the index vector to the search embedding. async function vectorSearchIndexRange(searchEmbedding: number[]) { await pipeline.awaitIdle(); const indexDistance = 0.003; const candidates = new Set<RxDocument>(); let docReads = 0; await Promise.all( new Array(5).fill(0).map(async (_, i) => { const distanceToIndex = euclideanDistance(sampleVectors[i], searchEmbedding); const range = distanceToIndex * indexDistance; const docs = await vectorCollection.find({ selector: { ['idx' + i]: { $gt: indexNrToString(distanceToIndex - range), $lt: indexNrToString(distanceToIndex + range) } }, sort: [{ ['idx' + i]: 'asc' }], }).exec(); docs.map(d => candidates.add(d)); docReads = docReads + docs.length; }) ); const docsWithDistance = Array.from(candidates).map(doc => { const distance = euclideanDistance((doc as any).embedding, searchEmbedding); return { distance, doc }; }); const sorted = docsWithDistance.sort(sortByObjectNumberProperty('distance')).reverse(); return { result: sorted.slice(0, 10), docReads }; }; Both methods allow you to limit the number of embeddings fetched from storage while still ensuring a reasonably precise search result. However, they differ in how many embeddings are read and how precise the results are, with trade-offs between performance and accuracy. The first method has a known embedding read amount of docsPerIndexSide * 2 * [amount of indexes]. The second method reads out an unknown amount of embeddings, depending on the sparsity of the dataset and the value of indexDistance. And that's it for the implementation. We now have a local first vector database that is able to store and query vector data. ","version":"Next","tagName":"h2"},{"title":"Performance benchmarks​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#performance-benchmarks","content":" In server-side databases, performance can be improved by scaling hardware or adding more servers. However, local-first apps face the unique challenge that the hardware is determined by the end user, making performance unpredictable. Some users may have high-end gaming PCs, while others might be using outdated smartphones in power-saving mode. Therefore, when building a local-first app that processes more than a few documents, performance becomes a critical factor and should be thoroughly tested upfront. Let's run performance benchmarks on my high-end gaming PC to give you a sense of how long different operations take and what's achievable. ","version":"Next","tagName":"h2"},{"title":"Performance of the Query Methods​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#performance-of-the-query-methods","content":" Query Method\tTime in milliseconds\tDocs read from storageFull Scan\t765\t10000 Index Similarity\t1647\t934 Index Range\t88\t2187 As shown, the index similarity query method takes significantly longer compared to others. This is due to the need for descending sort orders in some queries sort: [{ ['idx' + i]: 'desc' }]. While RxDB supports descending sorts, performance suffers because IndexedDB does not efficiently handle reverse indexed bulk operations. As a result, the index range method performs much better for this use case and should be used instead. With its query time of only 88 milliseconds it is fast enough for all most things and likely such fast that you do not even need to show a loading spinner. Also it is faster compared to fetching the query result from a server-side vector database over the internet. ","version":"Next","tagName":"h3"},{"title":"Performance of the Models​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#performance-of-the-models","content":" Let's also look at the time taken to calculate a single embedding across various models from the huggingface transformers list: Model Name\tTime per Embedding in (ms)\tVector Size\tModel Size (MB)Xenova/all-MiniLM-L6-v2\t173\t384\t23 Supabase/gte-small\t341\t384\t34 Xenova/paraphrase-multilingual-mpnet-base-v2\t1000\t768\t279 jinaai/jina-embeddings-v2-base-de\t1291\t768\t162 jinaai/jina-embeddings-v2-base-zh\t1437\t768\t162 jinaai/jina-embeddings-v2-base-code\t1769\t768\t162 mixedbread-ai/mxbai-embed-large-v1\t3359\t1024\t337 WhereIsAI/UAE-Large-V1\t3499\t1024\t337 Xenova/multilingual-e5-large\t4215\t1024\t562 From these benchmarks, it's evident that models with larger vector outputs take longer to process. Additionally, the model size significantly affects performance, with larger models requiring more time to compute embeddings. This trade-off between model complexity and performance must be considered when choosing the right model for your use case. ","version":"Next","tagName":"h3"},{"title":"Potential Performance Optimizations​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#potential-performance-optimizations","content":" There are multiple other techniques to improve the performance of your local vector database: Shorten embeddings: The storing and retrieval of embeddings can be improved by "shortening" the embedding. To do that, you just strip away numbers from your vector. For example [0.56, 0.12, -0.34, 0.78, -0.90] becomes [0.56, 0.12]. That's it, you now have a smaller embedding that is faster to read out of the storage and calculating distances is faster because it has to process less numbers. The downside is that you loose precision in your search results. Sometimes shortening the embeddings makes more sense as a pre-query step where you first compare the shortened vectors and later fetch the "real" vectors for the 10 most matching documents to improve their sort order. Optimize the variables in our Setup: In this examples we picked our variables in a non-optimal way. You can get huge performance improvements by setting different values: We picked 5 indexes for the embeddings. Using less indexes improves your query performance with the cost of less good results.For queries that search by fetching a specific embedding distance we used the indexDistance value of 0.003. Using a lower value means we read less document from the storage. This is faster but reduces the precision of the results which means we will get a less optimal result compared to a full table scan.For queries that search by fetching a given amount of documents per index side, we set the value docsPerIndexSide to 100. Increasing this value means you fetch more data from the storage but also get a better precision in the search results. Decreasing it can improve query performance with worse precision. Use faster models: There are many ways to improve performance of machine learning models. If your embedding calculation is too slow, try other models. Smaller mostly means faster. The model Xenova/all-MiniLM-L6-v2 which is used in this tutorial is about 1 year old. There exist better, more modern models to use. Huggingface makes these convenient to use. You only have to switch out the model name with any other model from that site. Narrow down the search space: By utilizing other "normal" filter operators to your query, you can narrow down the search space and optimize performance. For example in an email search you could additionally use a operator that limits the results to all emails that are not older than one year. Dimensionality Reduction with an autoencoder: An autoencoder encodes vector data with minimal loss which can improve the performance by having to store and compare less numbers in an embedding. Different RxDB Plugins: RxDB has different storages and plugins that can improve the performance like the IndexedDB RxStorage, the OPFS RxStorage, the sharding plugin and the Worker and SharedWorker storages. ","version":"Next","tagName":"h2"},{"title":"Migrating Data on Model/Index Changes​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#migrating-data-on-modelindex-changes","content":" When you change the index parameter or even update the whole model which was used to create the embeddings, you have to migrate the data that is already stored on your users devices. RxDB offers the Schema Migration Plugin for that. When the app is reloaded and the updated source code is started, RxDB detects changes in your schema version and runs the migration strategy accordingly. So to update the stored data, increase the schema version and define a handler: const schemaV1 = { "version": 1, // <- increase schema version by 1 "primaryKey": "id", "properties": { /* ... */ }, /* ... */ }; In the migration handler we recreate the new embeddings and index values. await myDatabase.addCollections({ vectors: { schema: schemaV1, migrationStrategies: { 1: function(docData){ const embedding = await getEmbedding(docData.body); new Array(5).fill(0).map((_, idx) => { docData['idx' + idx] = euclideanDistance(mySampleVectors[idx], embedding); }); return docData; }, } } }); ","version":"Next","tagName":"h2"},{"title":"Possible Future Improvements to Local-First Vector Databases​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#possible-future-improvements-to-local-first-vector-databases","content":" For now our vector database works and we are good to go. However there are some things to consider for the future: WebGPU is not fully supported yet. When this changes, creating embeddings in the browser have the potential to become faster. You can check if your current chrome supports WebGPU by opening chrome://gpu/. Notice that WebGPU has been reported to sometimes be even slower compared to WASM but likely it will be faster in the long term.Cross-Modal AI Models: While progress is being made, AI models that can understand and integrate multiple modalities are still in development. For example you could query for an image together with a text prompt to get a more detailed output.Multi-Step queries: In this article we only talked about having a single query as input and an ordered list of outputs. But there is big potential in chaining models or queries together where you take the results of one query and input them into a different model with different embeddings or outputs. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"Local Vector Database with RxDB and transformers.js in JavaScript","url":"/articles/javascript-vector-database.html#follow-up","content":" Shared/Like my announcement tweetRead the source code that belongs to this article at githubLearn how to use RxDB with the RxDB QuickstartCheck out the RxDB github repo and leave a star ⭐ ","version":"Next","tagName":"h2"},{"title":"Why Local-First Software Is the Future and what are its Limitations","type":0,"sectionRef":"#","url":"/articles/local-first-future.html","content":"","keywords":"","version":"Next"},{"title":"What is the Local-First Paradigm​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#what-is-the-local-first-paradigm","content":" In local-first software, the primary copy of your data lives on the client rather than a remote server. Rather than sending each read or write over the network, you store and manipulate data in a local database on the user’s device. Sync then happens in the background, ensuring all devices eventually converge to a consistent state. This approach is increasingly popular because it leads to instant app responses (no network delay for most operations), genuine offline capability, and more direct data ownership for users. Local-first apps also sidestep outages and if the server or internet goes down, users can keep working with their local data. When connectivity returns, everything syncs. This makes the user experience more resilient and gives them control of their data, which is especially appealing when privacy concerns or limited connectivity are key factors. Local-First software: A set of principles for software that enables both collaboration and ownership for users. Local-first ideals include the ability to work offline and collaborate across multiple devices, while also improving the security, privacy, long-term preservation, and user control of data. –Ink&Switch, 2019 ","version":"Next","tagName":"h2"},{"title":"Why Local-First is Gaining Traction​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#why-local-first-is-gaining-traction","content":" The push for local-first is driven by a few key new technological capabilities that previously restricted client devices from running heavy local-first computing: Relaxed Browser Storage Limits: In the past, true local-first web apps were not very feasible due to storage limitations in browsers. Early web storage options like cookies or localStorage had tiny limits (~5-10MB) and were unsuitable for complex data. Even IndexedDB, the structured client storage introduced over a decade ago, had restrictive quotas on many browsers: For example, older Firefox versions would prompt the user if more than 50MB was being stored. Mobile browsers often capped IndexedDB to 5MB without user permission. Such limits made it impractical to cache large application datasets on the client. However, modern browsers have dramatically increased these limits. Today, IndexedDB can typically store hundreds of megabytes to multiple gigabytes of data, depending on device capacity. Chrome allows up to ~80% of free disk space per origin (tens of GB on a desktop), Firefox now supports on the order of gigabytes per site (10% of disk size), and even Safari (historically strict) permits around 1GB per origin on iOS. In short, the storage quotas of 5-50MB are a thing of the past and modern web apps can cache very large datasets locally without hitting a ceiling. This shift in storage capabilities has unlocked new possibilities for local-first web apps that simply weren't viable a few years ago. New Storage APIs (OPFS): The new Browser API Origin Private File System (OPFS), part of the File System Access API, enables near-native file I/O from within a browser. It allows web apps to manage file handles securely and perform fast, synchronous reads/writes in Web Workers. This is a huge deal for local-first computing because it makes it feasible to embed robust database engines directly in the browser, persisting data to real files on a virtual filesystem. With OPFS, you can avoid some of the performance overhead that comes with IndexedDB-based workarounds, providing a near-native speed experience for file-structured data. Bandwidth Has Grown, But Latency Is Capped: Internet infrastructure has rapidly expanded to provide higher throughput making it possible to transfer large amounts of data more quickly. However, latency (i.e., round-trip delay) is constrained by the speed of light and other physical limitations in fiber, satellite links, and routing. We can always build out bigger "pipes" to stream or send bulk data, but we can't significantly reduce the base round-trip time for each request. This is a physical limit, not a technological one. Local-first strategies mitigate this fundamental latency limit by avoiding excessive client-server calls in interactive workflows, once data is on the client, it's instantly available for reads and writes without waiting on a network round-trip. Imagine, transferring around 100,000 "average" JSON documents might only consume about the same bandwidth as two frames of a 4K YouTube video which can be transferred in milliseconds. This shows just how far raw data throughput has come. Yet each request still has a 100-200ms latency or more, which becomes noticeable in user interactions. Local-first mitigates this by minimizing round-trip calls during active use and using the available bandwidth to directly transfer most of the data on the first app start. WebAssembly: Another advancement is WebAssembly (WASM), which allows developers to compile low-level languages (C, C++, Rust) for execution in the browser at near-native speed. This means database engines, search algorithms, vector databases, and other performance-heavy tasks can run right on the client. However, a key limitation is that WASM cannot directly access persistent storage APIs in the browser. Instead, all data must be send from WASM to JavaScript (or the main thread) and then go through something like IndexedDB or OPFS. This extra indirection is slower compared to plain JavaScript->storage calls. Looking ahead, there might come up future APIs that allow WASM to interface with persistent storage directly, and if those land, local-first systems could see another major boost in performance. Improvements in Local-First Tooling: A major factor fueling the rise of local-first architectures is the dramatic leap in client-side tooling and performance. For instance, consider a local-first email client that stores one million messages. In 2014, searching through that many documents, especially with something like early PouchDB, could take minutes in a browser. Today, with advanced offline databases like RxDB, you can use the OPFS storage with sharding across multiple web workers (one per CPU) and use memory-mapped techniques. The result is a regex search of one million of these email documents in around 120 milliseconds - all in JavaScript, running inside a standard web browser, on a mobile phone. Better yet, this performance ceiling is likely to keep rising. Newer browser features and WebAssembly optimizations could enable even faster indexing and query operations, closing the gap with native desktop clients. I even experimented with GPU-accelarated queries (using WebGPU) which, while still in experimental stage, might deliver client-side performance that outperforms servers which do not have a graphics card. These transformations highlight why local-first has become truly practical: not only can you sync and work offline, but you can handle serious data loads with performance that would have been unthinkable just a few years ago. ","version":"Next","tagName":"h2"},{"title":"What you can expect from a Local First App​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#what-you-can-expect-from-a-local-first-app","content":" Jevons' Paradox says that making a resource cheaper or more efficient to use often leads to greater overall consumption. Originally about coal, it applies to the local-first paradigm in a way where we require apps to have more features, simply because it is technically possible, the app users and developers start to expect them: ","version":"Next","tagName":"h2"},{"title":"User Experience Benefits​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#user-experience-benefits","content":" Performance & UX: Running from local storage means low latency and instantaneous interactions. There's no round-trip delay for most operations. Local-first apps aim to provide near-zero latency responses by querying a local database instead of waiting for a server response​. This results in a snappy UX (often no need for loading spinners) because data reads/writes happen immediately on-device. Modern users expect real-time feedback, and local-first delivers that by default. User Control & Privacy: Storing data locally can limit how much sensitive information is sent off to remote servers. End users have greater control over their data, and the app can implement client-side encryption, thereby reducing the risk of mass data breaches. Its even possible to only replicated encrypted data with a server so that the backend does not know about the data at all and just acts as a backup/replication endpoint. Offline Resilience: Obviously, being able to work offline is a major benefit. Users can continue using the app with no internet (or flaky connectivity), and their changes sync up once online. This is increasingly important not just for remote areas, but for any app that needs to be available 24/7. Even though mobile networks have improved, connectivity can still drop; local-first ensures the app doesn't grind to a halt. The app "stores data locally at the client so that it can still access it when the internet goes away." Realtime Apps: Today's users expect data to stay in sync across browser tabs and devices without constant page reloads. In a typical cloud app, if you want real-time updates (say to show that a friend edited a document), you'd need to implement a websocket or polling system for the server to push changes to clients, which is complex. Local-first architectures naturally lend themselves to realtime-by-default updates because the application state lives in a local database that can be observed for changes. Any edits (local or incoming from the server) immediately trigger UI updates. Similarly, background sync mechanisms ensure that new server-side data flows into the local store and into the user interface right away, no need to hit F5 to fetch the latest changes like on a traditional webpage. ","version":"Next","tagName":"h3"},{"title":"Developer Experience Benefits​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#developer-experience-benefits","content":" Reduced Server Load: Because local-first architectures typically transfer large chunks of data once (e.g., during an initial sync) and then sync only small diffs (delta changes) afterward, the server does not have to handle repeated requests for the same dataset. This bulk-first, diff-later approach drastically decreases the total number of round-trip requests to the backend. In scenarios where hundreds of simultaneous users each require continuous data access, an offline-ready client that only periodically sends or receives changes can scale more efficiently, freeing your servers to handle more users or other tasks. Instead of being bombarded with frequent small queries and updates, the server focuses on periodic sync operations, which can be more easily optimized or batched. It Scales with Data, Not Load. In fact for most type of apps, most of the data itself rarely changes. Imagine a CRM system, how often does the data of a customer really change compared to how of a user open the customer-overview page which would load data from a server in traditional systems? Less Need for Custom API Endpoints: A local-first architecture often simplifies backend design. Instead of writing extensive REST routes for each client operation (create, read, update, delete, etc.), you can build a single replication endpoint or a small set of endpoints to handle data synchronization for each entity. The client manages local data, merges edits, and pushes/pulls changes with the server automatically. This not only reduces boilerplate code on the backend but also frees developers to focus on business logic and domain-specific concerns rather than spending time creating and maintaining dozens of narrowly scoped endpoints. As a result, the overall system can be easier to scale and maintain, delivering a smoother developer experience. Simplified State Management in Frontend: Because the local database holds the authoritative state, you might rely less on complex state management libraries (Redux, MobX, etc.). The DB becomes a single source of truth for your UI. In an offline-first app, your global state is already there in a single place stored inside of the local database, so you don't need as many in-memory state layers to synchronize​. The UI can directly bind to the database (using queries or reactive subscriptions). All sources of changes (user input, remote updates, other tabs) funnel through the database. This can significantly reduce the "glue code" to keep UI state in sync with server state because the local DB does that for you. With Local-First tools, "you might not need Redux" because the reactive DB fulfills that role​ of state management already. Observable Queries: One of the big advantages of storing data locally is the ability to subscribe to data changes in real time, often called observable queries. When the data changes - either from the user's actions or from a remote sync - the local database automatically updates the subscribed query results, and the UI can redraw without a manual refresh. This reactive pattern can make apps feel much more live and responsive. In the beginnings this was mostly done by watching a changes feed (like in PouchDB) and re-running queries whenever data changed. However, this early approach was slow and didn't scale well, because the entire query had to be recalculated each time. Later, RxDB introduced the EventReduce Algorithm, which merges incoming document changes into an existing query result by using a big binary decision tree. With this, updated query results can be "calculated" on the CPU instead of re-running them over the database. This makes query updates almost instantaneous and scales better as your data grows. Nowadays, many local databases have added similar features: for example, dexie.js introduced liveQuery, letting developers build real-time UIs without repeatedly scanning the entire dataset. Better Multi-Tab and Multi-Device Consistency: Because the source of truth is on the client, if the user has the app open in multiple tabs or even multiple devices, each has a full copy of the data. In browsers, many offline databases use a storage like IndexedDB that is shared across tabs of the same origin. This means all tabs see the same up-to-date local state. For example, if a user logs in or adds data in one tab, the other tab can automatically reflect that change via the shared local DB and events​. This solves a common issue in web apps where one tab doesn't know that something changed in another tab. With local-first, multi-tab just works by default because there's "exactly one state of the data across all tabs". Similarly, on multiple devices, once sync runs, each device eventually converges to the same state. If your users have to press F5 all the time, your app is broken! Potential for P2P and Decentralization: While most current local-first apps still use a central backend for syncing, the paradigm opens the door to peer-to-peer data syncing. Because each device has the full data, devices could sync directly via LAN or other P2P channels for collaboration, reducing reliance on central servers. There are experimental frameworks that allow truly decentralized sync. This is a more advanced benefit, but it aligns with the ethos of giving users more control and reducing dependence on any one cloud provider. These advantages show why developers are excited about local-first. You get happier users thanks to a fast, offline-capable app, and you can differentiate your product by working in scenarios where others fail (e.g. poor connectivity). Companies like Google, Amazon, etc., invest heavily in reducing latency and adding offline modes for a reason: it improves retention and usability. Local-first design takes that to the extreme by default. ","version":"Next","tagName":"h3"},{"title":"Challenges and Limitations of Local-First​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#challenges-and-limitations-of-local-first","content":" However, this approach is not without significant challenges. It's important to understand the drawbacks and trade-offs before deciding to go all-in on local-first. Let's examine the flip side. You fully understood a technology when you know when not to use it –Daniel, 2024 Critics of local-first approaches often point out these challenges. Here's a comprehensive list of cons, criticisms, and obstacles associated with local-first development and proposed solutions on how to solve these obstacles: Data Synchronization: Data synchronization is arguably the hardest part of local-first development, because when every user's device can be offline for extended periods, data inevitably diverges. Ensuring those changes propagate and reconcile with minimal user headaches is a major challenge in distributed systems. Two main approaches have emerged: Use a bundled frontend+backend solution where the backend is tightly coupled to the client SDK and knows exactly how to handle sync. A common example is Firestore (part of the Firebase ecosystem) where Google's servers and client libraries collectively manage storage, change detection, conflict resolution, and syncing. The upside is you have a turnkey solution, developers can focus on features rather than writing sync logic. The downside is lock-in, because the sync protocol is proprietary and tailored to that vendor. In many organizations, this is a non-starter: existing company infrastructure can't be uprooted or replaced just for a single offline-capable app. This lock-in issue can arise even if the backend is not strictly a third-party vendor but simply another technology like PostgreSQL, because it still forces you to consolidate all your data into a single system that you might not use otherwise. Custom Replication with Your Own Endpoints: Alternatively, tools like RxDB allow you to implement your own replication endpoints on top of your existing infrastructure. This is the approach relies on a lightweight, git-like Sync Engine. The server remains relatively "dumb," focusing on storing revisions, tracking changes, and marking conflicts, while the client library does the actual conflict resolution. During sync, if the server detects a conflict (e.g., two offline edits to the same document), it notifies the client, which then decides how to merge them, whether via last-write-wins, a custom merge function, or a CRDT. Setting up custom endpoints does require more development effort, but you avoid vendor lock-in and can integrate seamlessly with your existing database(s). Your system simply needs to support incrementally fetching changes (pull) and accepting local modifications (push), which can be layered on top of nearly any data store or architecture. Tools which support "any backend" are of course harder to monetize because they cannot sell SaaS services or a Cloud Subscription which is why most tools use a fixed backend instead of an open Sync Engine. Conflict Resolution: When multiple offline edits happen on the same data, you inevitably get merge conflicts. For example, if two users (or the same user on two devices) both edit the same document offline, when both sync, whose changes win? Local-first systems need a conflict resolution strategy. Some systems use last-write-wins (firestore) or deterministic revision hashing to pick a "winner" (as in CouchDB/PouchDB)​. This is simple but may drop one user's changes. Other approaches keep both versions and merge them either via an implement "merge-function" or require a manual merge step (e.g., like git conflicts or showing the user a diff UI). More advanced solutions involve CRDTs (Conflict-free Replicated Data Types) which mathematically merge changes (used for rich text collaboration, for instance). Libraries like Automerge or Yjs implement CRDTs to "magically solve conflicts". But in practice, using CRDTs is also complex and has its own trade-offs and sometimes not even possible like when you need additional data from another instance for a "correct" merge. No matter which route, handling conflicts adds complexity to your app logic or infrastructure. In cloud-based (online-first) apps, you avoid this because everyone is always editing the single up-to-date copy on the server. Local-first shifts that burden to the client side. Here is an example on how a client-side merge functions works in RxDB: import { deepEqual } from 'rxdb/plugins/utils'; export const myConflictHandler = { /** * isEqual() is used to detect if two documents are * equal. This is used internally to detect conflicts. */ isEqual(a, b) { /** * isEqual() is used to detect conflicts or to detect if a * document has to be pushed to the remote. * If the documents are deep equal, * we have no conflict. * Because deepEqual is CPU expensive, * on your custom conflict handler you might only * check some properties, like the updatedAt time or revision-strings * for better performance. */ return deepEqual(a, b); }, /** * resolve() a conflict. This can be async so * you could even show an UI element to let your user * resolve the conflict manually. */ async resolve(i) { /** * In this example we drop the local state and use the server-state. * This basically implements a "first-on-server-wins" strategy. * * In your custom conflict handler you could want to merge properties * of the i.realMasterState, i.assumedMasterState and i.newDocumentState * or return i.newDocumentState to have a "last-write-wins" strategy. */ return i.realMasterState; } }; Eventual Consistency (No Single Source of Truth): A local-first system is eventually consistent by nature. There is no single authoritative copy of the data at all times. Instead you have one per device (and maybe one on the server), and they sync to become consistent eventually. This means at any given moment, two users might not see the same data if one hasn't synced recently. Users could even make decisions based on stale data. In many applications this is acceptable (the data will catch up), but for some scenarios it's problematic. For instance, an offline-first banking app that lets you initiate a money transfer offline could be dangerous if the account balance was out-of-date or if the transfer needs immediate consistency. Essentially, not all apps can tolerate eventual consistency. If your use case demands strong consistency (e.g., inventory systems where overselling is a big issue, or real-time collaborative editing where every keystroke must be seen by others instantly), a purely local-first approach might need augmentation or may not fit. Initial Data Load and Data Size Limits: Local-first requires pulling data down to the client. If your dataset is huge (gigabytes), it's simply not feasible to download everything to every client. For example, syncing every tweet on Twitter to every user's phone is impossible. Local-first works best when the data set per user is reasonably sized (up to 2 Gigabytes). In practice, you often limit the data to just that user's own data or a subset relevant to them. Even then, on first use the app might need to download a significant chunk of data to initialize the local database. There is a upper bound on dataset size beyond which the initial sync or storage needs become impractical. You cannot assume unlimited local storage. If your data is too large, local-first will either fail or you'll need to only sync partial data (and then handle what happens if the needed data isn't present locally). In short, local-first is unsuitable for massive datasets or data that cannot be partitioned per user. Storage Persistence (Browser Limitations): Storing data in the browser (via IndexedDB or similar) is not as durable as on a server disk. Browsers may evict data to save space (especially on mobile devices). For instance, Safari notoriously wipes out IndexedDB data if the user hasn't used the site in ~7 days. Other browsers have their own eviction policies for offline data. Also, users can at any time clear their browser storage (intentionally or via something like "Clear site data"). This means the local data cannot be 100% trusted to stay forever. A well-behaved local-first app needs to be able to recover if local data is lost, usually by pulling from the server again​. Essentially, the server still often serves as a backup. But if your app had any purely local data (not intended to sync), that's at risk. Mobile apps (with SQLite or filesystem storage) are a bit more stable than web browsers, but even there, uninstalls or certain OS actions can remove local data. This is a challenge: How to cache data offline for speed while ensuring if it's wiped, the user doesn't lose everything important. Cloud-only apps by contrast keep data in the cloud so it's typically safe unless the server fails (and servers are easier to backup reliably). Complex Client-Side Logic & Increased App Size: A local-first app tends to be more complex on the client side. You're essentially putting what used to be server responsibilities (storage, query engine, sync logic) into the frontend. This can increase the size of your frontend bundle (including a database library, possibly CRDT or sync code, etc.). It also increases memory and CPU usage on the client, as the browser/phone is doing more work. Low-end devices or older phones might struggle if the app is not optimized. Developers need to consider performance tuning for the local database (indexing, query efficiency) just like they would on a server. So while the user gains benefits, the app developer has to manage this complexity. Performance Constraints in JavaScript: Even though devices are fast, a local JS database is generally slower than a server DB on robust hardware. There are many layers (JS -> IndexedDB -> possibly SQLite under the hood) that add overhead​. For example, inserting a record might go through the DB library, the storage engine, the browser's implementation, down to disk. For most UI uses this is fine (you don't need 10k writes/sec in a to-do app, you need maybe a few writes per second at most). But if your app does heavy data processing, the browser might become a bottleneck. The key question is "Is it fast enough?". Often the answer is yes for typical usage, but developers must be mindful of not doing something on the client that truly requires big iron servers. For instance, full-text indexing of a million documents might be too slow in a client-side DB. Unpredictable performance is also a factor: Different users have different devices. A query that takes 50ms on a high-end desktop might take 500ms on a low-end phone in battery saving mode. So performance tuning and testing across devices is needed, and some heavy tasks might still belong on the server side​. For example if you build a local vector database you might want to create the embeddings on the server and sync them instead of creating them on the client. Client Database Migrations: As your app evolves, you'll change data models or add new fields. In a cloud-first app, you'd typically run a migration on the server database. In a local-first app, you have not only the server DB (if any) but also every client's local database to consider. Upgrading the schema means you need to write migration logic that runs on each client, perhaps the next time they launch the app after an update. Clients may be offline or not upgrade the app immediately, so you could have different versions of the schema in the wild. This complicates data handling (the sync protocol might need to handle multiple schema versions until everyone is updated). Providing a smooth migration path for local data is doable (many libraries provide migration facilities), but it requires careful testing. In a worst case, a failed migration on a client could brick the app for that user or force a full resync. This is a much bigger headache than just migrating a centralized DB at midnight while your service is in maintenance mode. 🌃 Security and Access Control: In cloud-based apps, enforcing data security (who can see what) is done on the server. The client only gets the data it's authorized to get. In a local-first scenario, you often need to partition data per user on the backend as well, to ensure users only sync down their own data (or data they have permission for). One simple strategy is to give each user their own database or dataset on the server and only replicate that. For example, CouchDB allows creating one database per user and replication can be scoped to that DB which makes permission handling easy. But if you ever need to query across users (say an admin view or aggregate analytics), having data split into many small DBs becomes a pain. The alternative is a single backend database with a fine-grained access control, and the client asks to sync only certain documents/fields. That usually means writing a custom sync server or using something like GraphQL with resolvers that respect permissions. In short, implementing auth and permissions in sync adds complexity. Also, any data stored on the client is theoretically vulnerable to extraction (if someone compromises the device or uses dev tools). You can encrypt local databases to prevent extraction after the server "revokes" the decryption password to mitigate the data extraction risk. Relational Data and Complex Queries: Most client-side/offline databases are NoSQL/document oriented for flexibility in syncing and easy conflict handling. They may not support complex join queries or ACID transactions across multiple tables like a full SQL database would. This is partly because replicating a full relational model is much harder (maintaining referential integrity, etc., when data is partial on a client) or not even logically possible. For example if you have two offline clients running a complex UPDATE X WHERE Y FROM Z INNER JOIN Alice INNER JOIN Bob query and then they go online, you have no easy way of handling these conflicts. If your app has heavy relational data requirements or relies on complex server-side queries (aggregations, multi-join reports), you might find the local database either cannot do it or is too slow to do it client-side. The lack of robust relational querying is something to plan for and you might need to adjust your data model to be more document-oriented or use client-side libraries to run joins in memory. Most tools use NoSQL because it makes replication easy and implementing true relational sync would require extremely sophisticated solutions and even needing an atomic clock for full consistency across nodes (like google spanner). So, if your app truly needs SQL power on the client, local-first might complicate things. In Local-First, most tools use NoSQL because it makes replication and conflict handling easy. That's a long list of challenges! In summary, local-first approaches introduce distributed data issues on the client side that web developers usually didn't have to deal with. Despite these challenges, the local-first movement is steadily growing because the benefits to user experience and data control are very compelling and modern tools are emerging to mitigate a lot of these difficulties. All of these are solved or solvable for your specific use-case, just keep them in mind before you start architecting your local-first app. ","version":"Next","tagName":"h2"},{"title":"Local-First vs. Traditional Online-First Approaches​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#local-first-vs-traditional-online-first-approaches","content":" So now that you know the pros and cons about Local-First. Lets directly compare it to your previous "online-first" stack: ","version":"Next","tagName":"h2"},{"title":"Connectivity and Offline Usage​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#connectivity-and-offline-usage","content":" Local-first: Apps like WhatsApp store messages locally on your device, letting you read past messages and even compose new ones without a stable network connection. Once online, the messages sync with the server and other participants.Online-first: Purely cloud-based apps typically stop functioning (beyond simple caching) when the network or server goes down. They rely on a constant connection to fetch or store user data. ","version":"Next","tagName":"h3"},{"title":"Latency and Performance​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#latency-and-performance","content":" Local-first: Because data operations happen on the device, you see near-instant interactions (e.g., typing and reading chats feels very responsive, as the messages are on your phone). Syncing occurs in the background without delaying the user.Online-first: Most interactions involve a round-trip to the server, adding network latency and potentially requiring loading states or fallback UIs. If the network is slow or unreliable, users can experience delays when sending or receiving updates. ","version":"Next","tagName":"h3"},{"title":"Complexity and Conflict Resolution​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#complexity-and-conflict-resolution","content":" Local-first: Much of the complexity like storing data or handling conflicts, shifts to the client. WhatsApp, for instance, caches all messages locally and queues unsent messages offline. Once reconnected, it must reconcile with the server and other devices, especially if the same account is used on multiple platforms.Online-first: A single central server manages data and concurrency, so clients remain thinner. However, the app becomes unusable if connectivity is lost, and any server downtime directly impacts all users. ","version":"Next","tagName":"h3"},{"title":"Data Ownership and Storage Limits​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#data-ownership-and-storage-limits","content":" Local-first: Users hold a complete copy of data on their own device, retaining control and quick access. This can raise challenges when data sets are very large; phone storage might be insufficient, or backups may be harder to guarantee.Online-first: Storing all data in the cloud scales more easily, and providers often manage backups automatically. On the downside, users depend on the service and must trust it to protect their data. ","version":"Next","tagName":"h3"},{"title":"When to Choose Which​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#when-to-choose-which","content":" Local-first: Particularly helpful for scenarios where offline operation and immediate responsiveness matter, such as chat apps (like WhatsApp), field tools in low-connectivity environments, or any use case where users can't rely on being online 24/7.Online-first: Well-suited for systems that demand real-time central control or massive data aggregation with minimal offline needs, such as large-scale analytics platforms or services where guaranteed immediate global consistency is essential.Hybrid: In reality, most modern apps often blend these approaches, giving users partial offline capabilities (caching, queued updates) alongside a robust central service. This hybrid method offers the benefits of local speed and resilience, while still leveraging cloud infrastructure for collaboration and global reach. But a truth local-first app is way more than just a cache. ","version":"Next","tagName":"h3"},{"title":"Offline-First vs. Local-First​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#offline-first-vs-local-first","content":" In the early days of offline-capable web apps (around 2014), the common phrase was "Offline-First". Tools like PouchDB popularized the notion that developers should assume devices are often offline or have flaky connections, so apps must continue to work seamlessly without a network. The guiding principle was "apps should treat being online as optional." If a user has no internet access, the application's core features still function, saving or queuing data locally, and automatically synchronizing once connectivity is restored. 4:18 What is Offline First? Over time, this focus on offline support evolved into the broader concept of "Local-First Software," (see Ink&Switch) emphasizing not just offline operation but also the technical underpinnings of storing data locally in the client application. While offline-first is primarily about resilience to network loss, local-first highlights ownership, privacy, and performance benefits of keeping the primary data on the user's device. Most tools these days extended the original offline-first concepts, adding real-time reactivity, custom sync, and more nuances like conflict resolution or encryption. However, the term "local-first" can be confusing to non-technical audiences because many people (especially in the US) associate "local first" with community-oriented movements that encourage buying from nearby businesses or supporting local initiatives. To reduce ambiguity, it may be clearer to use "local first software" or "local first development" in your documentation and marketing materials. When creating branding or logos around local-first software, avoid using the "Google Maps Pin" as a symbol. This icon typically implies geolocation or physical locality further mixing up the notion of "location-based services" with "on-device data storage." ","version":"Next","tagName":"h2"},{"title":"Do People Actually Use Local-First or Is It Just a Trend?​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#do-people-actually-use-local-first-or-is-it-just-a-trend","content":" If we look at npm download statistics, we see that PouchDB - one of the oldest libraries for local-first apps - has about 53k downloads each week, and RxDB - a newer library - has about 22k weekly downloads. Other local-first tools often have even fewer downloads. In comparison, a popular library like react-query, which does not focus on local storage, is downloaded about 1.6 million times a week. These numbers show that local-first libraries, while used, are not as common as some of the more traditional tools. One reason is that local-first is still a new idea. Many developers are used to traditional "online-first" approaches, so switching to a local database and then syncing changes later can feel unfamiliar. Developers must learn different patterns, deal with offline synchronization, and handle possible conflicts. That extra work can be a barrier to adoption which might change in the future as tooling improves. While most of RxDB is open source, there are also premium plugins that help sustain RxDB as a long-term project. Because people purchase these plugins, we gains insights into how developers are using local-first features: About half of these users mainly want offline functionality for cases such as farming equipment, mining, construction, or even a shrimp farm app.The other half focus on faster, real-time UIs for to-do or reading apps, a space launch planning tool, and various dashboard apps. This range of use cases highlights both the resilience offline mode can offer and the performance boost that local databases can provide when synced in the background. ","version":"Next","tagName":"h2"},{"title":"Why Local-First Is the Future​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#why-local-first-is-the-future","content":" Early in the history of the web, users expected static pages. If you wanted to see new content, you reloaded the page. That was normal at the time, and nobody found it strange because everything worked that way. Then, as more sites added real-time features - auto-updating feeds, live notifications, single-page apps - suddenly those older "reload-only" sites began to feel slow or outdated. Why wait for a manual refresh when real-time data was possible and readily available? The same pattern is happening with local-first apps. Right now, most sites are still built around network availability. We see loading spinners whenever data is fetched, and we simply wait for the server response. As local-first experiences become commonplace - removing spinners, letting users keep working when offline, and syncing in the background - everything else will start to feel frustratingly behind. Users won't tolerate slow or blocked interactions if they've seen apps that respond instantly and remain usable offline. They'll expect that as the default and we'll likely see growing pressure on developers to eliminate those extra loading steps. For many users, the experience of immediate local writes will become not just a perk, but an expectation! ","version":"Next","tagName":"h2"},{"title":"See also​","type":1,"pageTitle":"Why Local-First Software Is the Future and what are its Limitations","url":"/articles/local-first-future.html#see-also","content":" Discuss this topic on HackerNewsLocal-First Technologies: A list of databases and technologies (besides RxDB) that support offline-first or local-first use cases.Discord: Join our Discord server to talk with people and share ideas about this topic.Inc&Switch: The "original" paper about Local-First from 2019 where the naming of local-first Software was first used and described.Learn how to build a local-first Application with RxDB. ","version":"Next","tagName":"h2"},{"title":"Using localStorage in Modern Applications: A Comprehensive Guide","type":0,"sectionRef":"#","url":"/articles/localstorage.html","content":"","keywords":"","version":"Next"},{"title":"What is the localStorage API?​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#what-is-the-localstorage-api","content":" The localStorage API is a built-in feature of web browsers that enables web developers to store small amounts of data persistently on a user's device. It operates on a simple key-value basis, allowing developers to save strings, numbers, and other simple data types. This data remains available even after the user closes the browser or navigates away from the page. The API provides a convenient way to maintain state and store user preferences without relying on server-side storage. ","version":"Next","tagName":"h2"},{"title":"Exploring local storage Methods: A Practical Example​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#exploring-local-storage-methods-a-practical-example","content":" Let's dive into some hands-on code examples to better understand how to leverage the power of localStorage. The API offers several methods for interaction, including setItem, getItem, removeItem, and clear. Consider the following code snippet: // Storing data using setItem localStorage.setItem('username', 'john_doe'); // Retrieving data using getItem const storedUsername = localStorage.getItem('username'); // Removing data using removeItem localStorage.removeItem('username'); // Clearing all data localStorage.clear(); ","version":"Next","tagName":"h2"},{"title":"Storing Complex Data in JavaScript with JSON Serialization​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#storing-complex-data-in-javascript-with-json-serialization","content":" While js localStorage excels at handling simple key-value pairs, it also supports more intricate data storage through JSON serialization. By utilizing JSON.stringify and JSON.parse, you can store and retrieve structured data like objects and arrays. Here's an example of storing a document: const user = { name: 'Alice', age: 30, email: 'alice@example.com' }; // Storing a user object localStorage.setItem('user', JSON.stringify(user)); // Retrieving and parsing the user object const storedUser = JSON.parse(localStorage.getItem('user')); ","version":"Next","tagName":"h2"},{"title":"Understanding the Limitations of local storage​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#understanding-the-limitations-of-local-storage","content":" Despite its convenience, localStorage does come with a set of limitations that developers should be aware of: Non-Async Blocking API: One significant drawback is that js localStorage operates as a non-async blocking API. This means that any operations performed on localStorage can potentially block the main thread, leading to slower application performance and a less responsive user experience.Limited Data Structure: Unlike more advanced databases, localStorage is limited to a simple key-value store. This restriction makes it unsuitable for storing complex data structures or managing relationships between data elements.Stringification Overhead: Storing JSON data in localStorage requires stringifying the data before storage and parsing it when retrieved. This process introduces performance overhead, potentially slowing down operations by up to 10 times.Lack of Indexing: localStorage lacks indexing capabilities, making it challenging to perform efficient searches or iterate over data based on specific criteria. This limitation can hinder applications that rely on complex data retrieval.Tab Blocking: In a multi-tab environment, one tab's localStorage operations can impact the performance of other tabs by monopolizing CPU resources. You can reproduce this behavior by opening this test file in two browser windows and trigger localstorage inserts in one of them. You will observe that the indication spinner will stuck in both windows.Storage Limit: Browsers typically impose a storage limit of around 5 MiB for each origin's localStorage. ","version":"Next","tagName":"h2"},{"title":"Reasons to Still Use localStorage​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#reasons-to-still-use-localstorage","content":" ","version":"Next","tagName":"h2"},{"title":"Is localStorage Slow?​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#is-localstorage-slow","content":" Contrary to concerns about performance, the localStorage API in JavaScript is surprisingly fast when compared to alternative storage solutions like IndexedDB or OPFS. It excels in handling small key-value assignments efficiently. Due to its simplicity and direct integration with browsers, accessing and modifying localStorage data incur minimal overhead. For scenarios where quick and straightforward data storage is required, localStorage remains a viable option. For example RxDB uses localStorage in the localStorage meta optimizer to manage simple key values pairs while storing the "normal" documents inside of another storage like IndexedDB. ","version":"Next","tagName":"h3"},{"title":"When Not to Use localStorage​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#when-not-to-use-localstorage","content":" While localStorage offers convenience, it may not be suitable for every use case. Consider the following situations where alternatives might be more appropriate: Data Must Be Queryable: If your application relies heavily on querying data based on specific criteria, localStorage might not provide the necessary querying capabilities. Complex data retrieval might lead to inefficient code and slow performance.Big JSON Documents: Storing large JSON documents in localStorage can consume a significant amount of memory and degrade performance. It's essential to assess the size of the data you intend to store and consider more robust solutions for handling substantial datasets.Many Read/Write Operations: Excessive read and write operations on localStorage can lead to performance bottlenecks. Other storage solutions might offer better performance and scalability for applications that require frequent data manipulation.Lack of Persistence: If your application can function without persistent data across sessions, consider using in-memory data structures like new Map() or new Set(). These options offer speed and efficiency for transient data. ","version":"Next","tagName":"h2"},{"title":"What to use instead of the localStorage API in JavaScript​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#what-to-use-instead-of-the-localstorage-api-in-javascript","content":" ","version":"Next","tagName":"h2"},{"title":"localStorage vs IndexedDB​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#localstorage-vs-indexeddb","content":" While localStorage serves as a reliable storage solution for simpler data needs, it's essential to explore alternatives like IndexedDB when dealing with more complex requirements. IndexedDB is designed to store not only key-value pairs but also JSON documents. Unlike localStorage, which usually has a storage limit of around 5-10MB per domain, IndexedDB can handle significantly larger datasets. IndexDB with its support for indexing facilitates efficient querying, making range queries possible. However, it's worth noting that IndexedDB lacks observability, which is a feature unique to localStorage through the storage event. Also, complex queries can pose a challenge with IndexedDB, and while its performance is acceptable, IndexedDB can be too slow for some use cases. // localStorage can observe changes with the storage event. // This feature is missing in IndexedDB addEventListener("storage", (event) => {}); For those looking to harness the full power of IndexedDB with added capabilities, using wrapper libraries like RxDB is recommended. These libraries augment IndexedDB with features such as complex queries and observability, enhancing its usability for modern applications by providing a real database instead of only a key-value store. In summary when you compare IndexedDB vs localStorage, IndexedDB will win at any case where much data is handled while localStorage has better performance on small key-value datasets. ","version":"Next","tagName":"h3"},{"title":"File System API (OPFS)​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#file-system-api-opfs","content":" Another intriguing option is the OPFS (File System API). This API provides direct access to an origin-based, sandboxed filesystem which is highly optimized for performance and offers in-place write access to its content. OPFS offers impressive performance benefits. However, working with the OPFS API can be complex, and it's only accessible within a WebWorker. To simplify its usage and extend its capabilities, consider using a wrapper library like RxDB's OPFS RxStorage, which builds a comprehensive database on top of the OPFS API. This abstraction allows you to harness the power of the OPFS API without the intricacies of direct usage. ","version":"Next","tagName":"h3"},{"title":"localStorage vs Cookies​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#localstorage-vs-cookies","content":" Cookies, once a primary method of client-side data storage, have fallen out of favor in modern web development due to their limitations. While they can store data, they are about 100 times slower when compared to the localStorage API. Additionally, cookies are included in the HTTP header, which can impact network performance. As a result, cookies are not recommended for data storage purposes in contemporary web applications. ","version":"Next","tagName":"h3"},{"title":"localStorage vs WebSQL​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#localstorage-vs-websql","content":" WebSQL, despite offering a SQL-based interface for client-side data storage, is a deprecated technology and should be avoided. Its API has been phased out of modern browsers, and it lacks the robustness of alternatives like IndexedDB. Moreover, WebSQL tends to be around 10 times slower than IndexedDB, making it a suboptimal choice for applications that demand efficient data manipulation and retrieval. ","version":"Next","tagName":"h3"},{"title":"localStorage vs sessionStorage​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#localstorage-vs-sessionstorage","content":" In scenarios where data persistence beyond a session is unnecessary, developers often turn to sessionStorage. This storage mechanism retains data only for the duration of a tab or browser session. It survives page reloads and restores, providing a handy solution for temporary data needs. However, it's important to note that sessionStorage is limited in scope and may not suit all use cases. ","version":"Next","tagName":"h3"},{"title":"AsyncStorage for React Native​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#asyncstorage-for-react-native","content":" For React Native developers, the AsyncStorage API is the go-to solution, mirroring the behavior of localStorage but with asynchronous support. Since not all JavaScript runtimes support localStorage, AsyncStorage offers a seamless alternative for data persistence in React Native applications. ","version":"Next","tagName":"h3"},{"title":"node-localstorage for Node.js​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#node-localstorage-for-nodejs","content":" Because native localStorage is absent in the Node.js JavaScript runtime, you will get the error ReferenceError: localStorage is not defined in Node.js or node based runtimes like Next.js. The node-localstorage npm package bridges the gap. This package replicates the browser's localStorage API within the Node.js environment, ensuring consistent and compatible data storage capabilities. ","version":"Next","tagName":"h3"},{"title":"localStorage in browser extensions​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#localstorage-in-browser-extensions","content":" While browser extensions for chrome and firefox support the localStorage API, it is not recommended to use it in that context to store extension-related data. The browser will clear the data in many scenarios like when the users clear their browsing history. Instead the Extension Storage API should be used for browser extensions. In contrast to localStorage, the storage API works async and all operations return a Promise. Also it provides automatic sync to replicate data between all instances of that browser that the user is logged into. The storage API is even able to storage JSON-ifiable objects instead of plain strings. // Using the storage API in chrome await chrome.storage.local.set({ foobar: {nr: 1} }); const result = await chrome.storage.local.get('foobar'); console.log(result.foobar); // {nr: 1} ","version":"Next","tagName":"h2"},{"title":"localStorage in Deno and Bun​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#localstorage-in-deno-and-bun","content":" The Deno JavaScript runtime has a working localStorage API so running localStorage.setItem() and the other methods, will just work and the locally stored data is persisted across multiple runs. Bun does not support the localStorage JavaScript API. Trying to use localStorage will error with ReferenceError: Can't find variable: localStorage. To store data locally in Bun, you could use the bun:sqlite module instead or directly use a in-JavaScript database with Bun support like RxDB. ","version":"Next","tagName":"h2"},{"title":"Conclusion: Choosing the Right Storage Solution​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#conclusion-choosing-the-right-storage-solution","content":" In the world of modern web development, localStorage serves as a valuable tool for lightweight data storage. Its simplicity and speed make it an excellent choice for small key-value assignments. However, as application complexity grows, developers must assess their storage needs carefully. For scenarios that demand advanced querying, complex data structures, or high-volume operations, alternatives like IndexedDB, wrapper libraries with additional features like RxDB, or platform-specific APIs offer more robust solutions. By understanding the strengths and limitations of various storage options, developers can make informed decisions that pave the way for efficient and scalable applications. ","version":"Next","tagName":"h2"},{"title":"Follow up​","type":1,"pageTitle":"Using localStorage in Modern Applications: A Comprehensive Guide","url":"/articles/localstorage.html#follow-up","content":" Learn how to store and query data with RxDB in the RxDB QuickstartWhy IndexedDB is slow and how to fix itRxStorage performance comparison ","version":"Next","tagName":"h2"},{"title":"Mobile Database - RxDB as Database for Mobile Applications","type":0,"sectionRef":"#","url":"/articles/mobile-database.html","content":"","keywords":"","version":"Next"},{"title":"Understanding Mobile Databases​","type":1,"pageTitle":"Mobile Database - RxDB as Database for Mobile Applications","url":"/articles/mobile-database.html#understanding-mobile-databases","content":" Mobile databases are specialized software systems designed to handle data storage and management for mobile applications. These databases are optimized for the unique requirements of mobile environments, which often include limited device resources, fluctuations in network connectivity, and the need for offline functionality. There are various types of mobile databases available, each with its own strengths and use cases. Local databases, such as SQLite and Realm, reside directly on the user's device, providing offline capabilities and faster data access. Cloud-based databases, like Firebase Realtime Database and Amazon DynamoDB, rely on remote servers to store and retrieve data, enabling synchronization across multiple devices. Hybrid databases, as the name suggests, combine the benefits of both local and cloud-based approaches, offering a balance between offline functionality and data synchronization. ","version":"Next","tagName":"h2"},{"title":"Introducing RxDB: A Paradigm Shift in Mobile Database Solutions​","type":1,"pageTitle":"Mobile Database - RxDB as Database for Mobile Applications","url":"/articles/mobile-database.html#introducing-rxdb-a-paradigm-shift-in-mobile-database-solutions","content":" RxDB, also known as Reactive Database, has emerged as a game-changer in the realm of mobile databases. Built on top of popular web technologies like JavaScript, TypeScript, and RxJS (Reactive Extensions for JavaScript), RxDB provides an elegant solution for seamless offline-first capabilities and real-time data synchronization in mobile applications. Benefits of RxDB for Hybrid App Development Offline-First Approach: One of the major advantages of RxDB is its ability to work in an offline mode. It allows mobile applications to store and access data locally, ensuring uninterrupted functionality even when the network connection is weak or unavailable. The database automatically syncs the data with the server once the connection is reestablished, guaranteeing data consistency. Real-Time Data Synchronization: RxDB leverages the power of real-time data synchronization, making it an excellent choice for applications that require collaborative features or live updates. It uses the concept of change streams to detect modifications made to the database and instantly propagates those changes across connected devices. This real-time synchronization enables seamless collaboration and enhances user experience. Reactive Programming Paradigm: RxDB embraces the principles of reactive programming, which simplifies the development process by handling asynchronous events and data streams. By leveraging RxJS observables, developers can write concise, declarative code that reacts to changes in data, ensuring a highly responsive user experience. The reactive programming paradigm enhances code maintainability, scalability, and testability. Easy Integration with Hybrid App Frameworks: RxDB seamlessly integrates with popular hybrid app development frameworks like React Native and Capacitor. This compatibility allows developers to leverage the existing ecosystem and tools of these frameworks, making the transition to RxDB smoother and more efficient. By utilizing RxDB within these frameworks, developers can harness the power of a robust database solution without sacrificing the advantages of hybrid app development. Cross-Platform Support: RxDB enables developers to build cross-platform mobile applications that run seamlessly on both iOS and Android devices. This versatility eliminates the need for separate database implementations for different platforms, saving development time and effort. With RxDB, developers can focus on building a unified codebase and delivering a consistent user experience across platforms. ","version":"Next","tagName":"h2"},{"title":"Use Cases for RxDB in Hybrid App Development​","type":1,"pageTitle":"Mobile Database - RxDB as Database for Mobile Applications","url":"/articles/mobile-database.html#use-cases-for-rxdb-in-hybrid-app-development","content":" Offline-First Applications: RxDB is an ideal choice for applications that heavily rely on offline functionality. Whether it's a note-taking app, a task manager, or a survey application, RxDB ensures that users can continue working even when connectivity is compromised. The seamless synchronization capabilities of RxDB ensure that changes made offline are automatically propagated once the device reconnects to the internet. Real-Time Collaboration: Applications that require real-time collaboration, such as messaging platforms or collaborative editing tools, can greatly benefit from RxDB. The real-time synchronization capabilities enable multiple users to work on the same data simultaneously, ensuring that everyone sees the latest updates in real-time. Data-Intensive Applications: RxDB's performance and scalability make it suitable for data-intensive applications that handle large datasets or complex data structures. Whether it's a media-rich app, a data visualization tool, or an analytics platform, RxDB can handle the heavy lifting and provide a smooth user experience. Cross-Platform Applications: Hybrid app frameworks like React Native and Capacitor have gained popularity due to their ability to build cross-platform applications. By utilizing RxDB within these frameworks, developers can create a unified codebase that runs seamlessly on both iOS and Android, significantly reducing development time and effort. ","version":"Next","tagName":"h2"},{"title":"Conclusion​","type":1,"pageTitle":"Mobile Database - RxDB as Database for Mobile Applications","url":"/articles/mobile-database.html#conclusion","content":" Mobile databases play a vital role in the performance and functionality of mobile applications. RxDB, with its offline-first approach, real-time data synchronization, and seamless integration with hybrid app development frameworks like React Native and Capacitor, offers a robust solution for managing data in mobile apps. By leveraging the power of reactive programming, RxDB empowers developers to build highly responsive, scalable, and cross-platform applications that deliver an exceptional user experience. With its versatility and ease of use, RxDB is undoubtedly a database solution worth considering for hybrid app development. Embrace the power of RxDB and unlock the full potential of your mobile applications. ","version":"Next","tagName":"h2"},{"title":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","type":0,"sectionRef":"#","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html","content":"","keywords":"","version":"Next"},{"title":"The available Storage APIs in a modern Browser​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#the-available-storage-apis-in-a-modern-browser","content":" First lets have a brief overview of the different APIs, their intentional use case and history: ","version":"Next","tagName":"h2"},{"title":"What are Cookies​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#what-are-cookies","content":" Cookies were first introduced by netscape in 1994. Cookies store small pieces of key-value data that are mainly used for session management, personalization, and tracking. Cookies can have several security settings like a time-to-live or the domain attribute to share the cookies between several subdomains. Cookies values are not only stored at the client but also sent with every http request to the server. This means we cannot store much data in a cookie but it is still interesting how good cookie access performance compared to the other methods. Especially because cookies are such an important base feature of the web, many performance optimizations have been done and even these days there is still progress being made like the Shared Memory Versioning by chromium or the asynchronous CookieStore API. ","version":"Next","tagName":"h3"},{"title":"What is LocalStorage​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#what-is-localstorage","content":" The localStorage API was first proposed as part of the WebStorage specification in 2009. LocalStorage provides a simple API to store key-value pairs inside of a web browser. It has the methods setItem, getItem, removeItem and clear which is all you need from a key-value store. LocalStorage is only suitable for storing small amounts of data that need to persist across sessions and it is limited by a 5MB storage cap. Storing complex data is only possible by transforming it into a string for example with JSON.stringify(). The API is not asynchronous which means if fully blocks your JavaScript process while doing stuff. Therefore running heavy operations on it might block your UI from rendering. There is also the SessionStorage API. The key difference is that localStorage data persists indefinitely until explicitly cleared, while sessionStorage data is cleared when the browser tab or window is closed. ","version":"Next","tagName":"h3"},{"title":"What is IndexedDB​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#what-is-indexeddb","content":" IndexedDB was first introduced as "Indexed Database API" in 2015. IndexedDB is a low-level API for storing large amounts of structured JSON data. While the API is a bit hard to use, IndexedDB can utilize indexes and asynchronous operations. It lacks support for complex queries and only allows to iterate over the indexes which makes it more like a base layer for other libraries then a fully fledged database. In 2018, IndexedDB version 2.0 was introduced. This added some major improvements. Most noticeable the getAll() method which improves performance dramatically when fetching bulks of JSON documents. IndexedDB version 3.0 is in the workings which contains many improvements. Most important the addition of Promise based calls that makes modern JS features like async/await more useful. ","version":"Next","tagName":"h3"},{"title":"What is OPFS​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#what-is-opfs","content":" The Origin Private File System (OPFS) is a relatively new API that allows web applications to store large files directly in the browser. It is designed for data-intensive applications that want to write and read binary data in a simulated file system. OPFS can be used in two modes: Either asynchronous on the main threadOr in a WebWorker with the faster, asynchronous access with the createSyncAccessHandle() method. Because only binary data can be processed, OPFS is made to be a base filesystem for library developers. You will unlikely directly want to use the OPFS in your code when you build a "normal" application because it is too complex. That would only make sense for storing plain files like images, not to store and query JSON data efficiently. I have build a OPFS based storage for RxDB with proper indexing and querying and it took me several months. ","version":"Next","tagName":"h3"},{"title":"What is WASM SQLite​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#what-is-wasm-sqlite","content":" WebAssembly (Wasm) is a binary format that allows high-performance code execution on the web. Wasm was added to major browsers over the course of 2017 which opened a wide range of opportunities on what to run inside of a browser. You can compile native libraries to WebAssembly and just run them on the client with just a few adjustments. WASM code can be shipped to browser apps and generally runs much faster compared to JavaScript, but still about 10% slower then native. Many people started to use compiled SQLite as a database inside of the browser which is why it makes sense to also compare this setup to the native APIs. The compiled byte code of SQLite has a size of about 938.9 kB which must be downloaded and parsed by the users on the first page load. WASM cannot directly access any persistent storage API in the browser. Instead it requires data to flow from WASM to the main-thread and then can be put into one of the browser APIs. This is done with so called VFS (virtual file system) adapters that handle data access from SQLite to anything else. ","version":"Next","tagName":"h3"},{"title":"What was WebSQL​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#what-was-websql","content":" WebSQL was a web API introduced in 2009 that allowed browsers to use SQL databases for client-side storage, based on SQLite. The idea was to give developers a way to store and query data using SQL on the client side, similar to server-side databases. WebSQL has been removed from browsers in the current years for multiple good reasons: WebSQL was not standardized and having an API based on a single specific implementation in form of the SQLite source code is hard to ever make it to a standard.WebSQL required browsers to use a specific version of SQLite (version 3.6.19) which means whenever there would be any update or bugfix to SQLite, it would not be possible to add that to WebSQL without possible breaking the web.Major browsers like firefox never supported WebSQL. Therefore in the following we will just ignore WebSQL even if it would be possible to run tests on in by setting specific browser flags or using old versions of chromium. ","version":"Next","tagName":"h3"},{"title":"Feature Comparison​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#feature-comparison","content":" Now that you know the basic concepts of the APIs, lets compare some specific features that have shown to be important for people using RxDB and browser based storages in general. ","version":"Next","tagName":"h2"},{"title":"Storing complex JSON Documents​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#storing-complex-json-documents","content":" When you store data in a web application, most often you want to store complex JSON documents and not only "normal" values like the integers and strings you store in a server side database. Only IndexedDB works with JSON objects natively.With SQLite WASM you can store JSON in a text column since version 3.38.0 (2022-02-22) and even run deep queries on it and use single attributes as indexes. Every of the other APIs can only store strings or binary data. Of course you can transform any JSON object to a string with JSON.stringify() but not having the JSON support in the API can make things complex when running queries and running JSON.stringify() many times can cause performance problems. ","version":"Next","tagName":"h3"},{"title":"Multi-Tab Support​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#multi-tab-support","content":" A big difference when building a Web App compared to Electron or React-Native, is that the user will open and close the app in multiple browser tabs at the same time. Therefore you have not only one JavaScript process running, but many of them can exist and might have to share state changes between each other to not show outdated data to the user. If your users' muscle memory puts the left hand on the F5 key while using your website, you did something wrong! Not all storage APIs support a way to automatically share write events between tabs. Only localstorage has a way to automatically share write events between tabs by the API itself with the storage-event which can be used to observe changes. // localStorage can observe changes with the storage event. // This feature is missing in IndexedDB and others addEventListener("storage", (event) => {}); There was the experimental IndexedDB observers API for chrome, but the proposal repository has been archived. To workaround this problem, there are two solutions: The first option is to use the BroadcastChannel API which can send messages across browser tabs. So whenever you do a write to the storage, you also send a notification to other tabs to inform them about these changes. This is the most common workaround which is also used by RxDB. Notice that there is also the WebLocks API which can be used to have mutexes across browser tabs.The other solution is to use the SharedWorker and do all writes inside of the worker. All browser tabs can then subscribe to messages from that single SharedWorker and know about changes. ","version":"Next","tagName":"h3"},{"title":"Indexing Support​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#indexing-support","content":" The big difference between a database and storing data in a plain file, is that a database is writing data in a format that allows running operations over indexes to facilitate fast performant queries. From our list of technologies only IndexedDB and WASM SQLite support for indexing out of the box. In theory you can build indexes on top of any storage like localstorage or OPFS but you likely should not want to do that by yourself. In IndexedDB for example, we can fetch a bulk of documents by a given index range: // find all products with a price between 10 and 50 const keyRange = IDBKeyRange.bound(10, 50); const transaction = db.transaction('products', 'readonly'); const objectStore = transaction.objectStore('products'); const index = objectStore.index('priceIndex'); const request = index.getAll(keyRange); const result = await new Promise((res, rej) => { request.onsuccess = (event) => res(event.target.result); request.onerror = (event) => rej(event); }); Notice that IndexedDB has the limitation of not having indexes on boolean values. You can only index strings and numbers. To workaround that you have to transform boolean to numbers and backwards when storing the data. ","version":"Next","tagName":"h3"},{"title":"WebWorker Support​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#webworker-support","content":" When running heavy data operations, you might want to move the processing away from the JavaScript main thread. This ensures that our app keeps being responsive and fast while the processing can run in parallel in the background. In a browser you can either use the WebWorker, SharedWorker or the ServiceWorker API to do that. In RxDB you can use the WebWorker or SharedWorker plugins to move your storage inside of a worker. The most common API for that use case is spawning a WebWorker and doing most work on that second JavaScript process. The worker is spawned from a separate JavaScript file (or base64 string) and communicates with the main thread by sending data with postMessage(). Unfortunately LocalStorage and Cookiescannot be used in WebWorker or SharedWorker because of the design and security constraints. WebWorkers run in a separate global context from the main browser thread and therefore cannot do stuff that might impact the main thread. They have no direct access to certain web APIs, like the DOM, localStorage, or cookies. Everything else can be used from inside a WebWorker. The fast version of OPFS with the createSyncAccessHandle method can onlybe used in a WebWorker, and not on the main thread. This is because all the operations of the returned AccessHandle are not async and therefore block the JavaScript process, so you do want to do that on the main thread and block everything. ","version":"Next","tagName":"h3"},{"title":"Storage Size Limits​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#storage-size-limits","content":" Cookies are limited to about 4 KB of data in RFC-6265. Because the stored cookies are send to the server with every HTTP request, this limitation is reasonable. You can test your browsers cookie limits here. Notice that you should never fill up the full 4 KB of your cookies because your web server will not accept too long headers and reject the requests with HTTP ERROR 431 - Request header fields too large. Once you have reached that point you can not even serve updated JavaScript to your user to clean up the cookies and you will have locked out that user until the cookies get cleaned up manually. LocalStorage has a storage size limitation that varies depending on the browser, but generally ranges from 4 MB to 10 MB per origin. You can test your localStorage size limit here. Chrome/Chromium/Edge: 5 MB per domainFirefox: 10 MB per domainSafari: 4-5 MB per domain (varies slightly between versions) IndexedDB does not have a specific fixed size limitation like localStorage. The maximum storage size for IndexedDB depends on the browser implementation. The upper limit is typically based on the available disc space on the user's device. In chromium browsers it can use up to 80% of total disk space. You can get an estimation about the storage size limit by calling await navigator.storage.estimate(). Typically you can store gigabytes of data which can be tried out here. Notice that we have a full article about storage max size limits of IndexedDB that covers this topic. OPFS has the same storage size limitation as IndexedDB. Its limit depends on the available disc space. This can also be tested here. ","version":"Next","tagName":"h2"},{"title":"Performance Comparison​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#performance-comparison","content":" Now that we've reviewed the features of each storage method, let's dive into performance comparisons, focusing on initialization times, read/write latencies, and bulk operations. Notice that we only run simple tests and for your specific use case in your application the results might differ. Also we only compare performance in google chrome (version 128.0.6613.137). Firefox and Safari have similar but not equal performance patterns. You can run the test by yourself on your own machine from this github repository. For all tests we throttle the network to behave like the average german internet speed. (download: 135,900 kbit/s, upload: 28,400 kbit/s, latency: 125ms). Also all tests store an "average" JSON object that might be required to be stringified depending on the storage. We also only test the performance of storing documents by id because some of the technologies (cookies, OPFS and localstorage) do not support indexed range operations so it makes no sense to compare the performance of these. ","version":"Next","tagName":"h2"},{"title":"Initialization Time​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#initialization-time","content":" Before you can store any data, many APIs require a setup process like creating databases, spawning WebAssembly processes or downloading additional stuff. To ensure your app starts fast, the initialization time is important. The APIs of localStorage and Cookies do not have any setup process and can be directly used. IndexedDB requires to open a database and a store inside of it. WASM SQLite needs to download a WASM file and process it. OPFS needs to download and start a worker file and initialize the virtual file system directory. Here are the time measurements from how long it takes until the first bit of data can be stored: Technology\tTime in MillisecondsIndexedDB\t46 OPFS Main Thread\t23 OPFS WebWorker\t26.8 WASM SQLite (memory)\t504 WASM SQLite (IndexedDB)\t535 Here we can notice a few things: Opening a new IndexedDB database with a single store takes surprisingly longThe latency overhead of sending data from the main thread to a WebWorker OPFS is about 4 milliseconds. Here we only send minimal data to init the OPFS file handler. It will be interesting if that latency increases when more data is processed.Downloading and parsing WASM SQLite and creating a single table takes about half a second. Using also the IndexedDB VFS to store data persistently adds additional 31 milliseconds. Reloading the page with enabled caching and already prepared tables is a bit faster with 420 milliseconds (memory). ","version":"Next","tagName":"h3"},{"title":"Latency of small Writes​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#latency-of-small-writes","content":" Next lets test the latency of small writes. This is important when you do many small data changes that happen independent from each other. Like when you stream data from a websocket or persist pseudo randomly happening events like mouse movements. Technology\tTime in MillisecondsCookies\t0.058 LocalStorage\t0.017 IndexedDB\t0.17 OPFS Main Thread\t1.46 OPFS WebWorker\t1.54 WASM SQLite (memory)\t0.17 WASM SQLite (IndexedDB)\t3.17 Here we can notice a few things: LocalStorage has the lowest write latency with only 0.017 milliseconds per write.IndexedDB writes are about 10 times slower compared to localStorage.Sending the data to the WASM SQLite process and letting it persist via IndexedDB is slow with over 3 milliseconds per write. The OPFS operations take about 1.5 milliseconds to write the JSON data into one document per file. We can see the sending the data to a webworker first is a bit slower which comes from the overhead of serializing and deserializing the data on both sides. If we would not create on OPFS file per document but instead append everything to a single file, the performance pattern changes significantly. Then the faster file handle from the createSyncAccessHandle() only takes about 1 millisecond per write. But this would require to somehow remember at which position the each document is stored. Therefore in our tests we will continue using one file per document. ","version":"Next","tagName":"h3"},{"title":"Latency of small Reads​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#latency-of-small-reads","content":" Now that we have stored some documents, lets measure how long it takes to read single documents by their id. Technology\tTime in MillisecondsCookies\t0.132 LocalStorage\t0.0052 IndexedDB\t0.1 OPFS Main Thread\t1.28 OPFS WebWorker\t1.41 WASM SQLite (memory)\t0.45 WASM SQLite (IndexedDB)\t2.93 Here we can notice a few things: LocalStorage reads are really really fast with only 0.0052 milliseconds per read.The other technologies perform reads in a similar speed to their write latency. ","version":"Next","tagName":"h3"},{"title":"Big Bulk Writes​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#big-bulk-writes","content":" As next step, lets do some big bulk operations with 200 documents at once. Technology\tTime in MillisecondsCookies\t20.6 LocalStorage\t5.79 IndexedDB\t13.41 OPFS Main Thread\t280 OPFS WebWorker\t104 WASM SQLite (memory)\t19.1 WASM SQLite (IndexedDB)\t37.12 Here we can notice a few things: Sending the data to a WebWorker and running it via the faster OPFS API is about twice as fast.WASM SQLite performs better on bulk operations compared to its single write latency. This is because sending the data to WASM and backwards is faster if it is done all at once instead of once per document. ","version":"Next","tagName":"h3"},{"title":"Big Bulk Reads​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#big-bulk-reads","content":" Now lets read 100 documents in a bulk request. Technology\tTime in MillisecondsCookies\t6.34 LocalStorage\t0.39 IndexedDB\t4.99 OPFS Main Thread\t54.79 OPFS WebWorker\t25.61 WASM SQLite (memory)\t3.59 WASM SQLite (IndexedDB)\t5.84 (35ms without cache) Here we can notice a few things: Reading many files in the OPFS webworker is about twice as fast compared to the slower main thread mode.WASM SQLite is surprisingly fast. Further inspection has shown that the WASM SQLite process keeps the documents in memory cached which improves the latency when we do reads directly after writes on the same data. When the browser tab is reloaded between the writes and the reads, finding the 100 documents takes about 35 milliseconds instead. ","version":"Next","tagName":"h3"},{"title":"Performance Conclusions​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#performance-conclusions","content":" LocalStorage is really fast but remember that is has some downsides: It blocks the main JavaScript process and therefore should not be used for big bulk operations.Only Key-Value assignments are possible, you cannot use it efficiently when you need to do index based range queries on your data. OPFS is way faster when used in the WebWorker with the createSyncAccessHandle() method compare to using it directly in the main thread.SQLite WASM can be fast but you have to initially download the full binary and start it up which takes about half a second. This might not be relevant at all if your app is started up once and the used for a very long time. But for web-apps that are opened and closed in many browser tabs many times, this might be a problem. ","version":"Next","tagName":"h2"},{"title":"Possible Improvements​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#possible-improvements","content":" There is a wide range of possible improvements and performance hacks to speed up the operations. For IndexedDB I have made a list of performance hacks here. For example you can do sharding between multiple database and webworkers or use a custom index strategy.OPFS is slow in writing one file per document. But you do not have to do that and instead you can store everything at a single file like a normal database would do. This improves performance dramatically like it was done with the RxDB OPFS RxStorage.You can mix up the technologies to optimize for multiple scenarios at once. For example in RxDB there is the localstorage meta optimizer which stores initial metadata in localstorage and "normal" documents inside of IndexedDB. This improves the initial startup time while still having the documents stored in a way to query them efficiently.There is the memory-mapped storage plugin in RxDB which maps data directly to memory. Using this in combination with a shared worker can improve pageloads and query time significantly.Compressing data before storing it might improve the performance for some of the storages.Splitting work up between multiple WebWorkers via sharding can improve performance by utilizing the whole capacity of your users device. Here you can see the performance comparison of various RxDB storage implementations which gives a better view of real world performance: ","version":"Next","tagName":"h2"},{"title":"Future Improvements​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#future-improvements","content":" You are reading this in 2024, but the web does not stand still. There is a good chance that browser get enhanced to allow faster and better data operations. Currently there is no way to directly access a persistent storage from inside a WebAssembly process. If this changes in the future, running SQLite (or a similar database) in a browser might be the best option.Sending data between the main thread and a WebWorker is slow but might be improved in the future. There is a good article about why postMessage() is slow.IndexedDB lately got support for storage buckets (chrome only) which might improve performance. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite","url":"/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.html#follow-up","content":" Share my announcement tweet -->Reproduce the benchmarks at the github repoLearn how to use RxDB with the RxDB QuickstartCheck out the RxDB github repo and leave a star ⭐ ","version":"Next","tagName":"h2"},{"title":"RxDB – The Ultimate Offline Database with Sync and Encryption","type":0,"sectionRef":"#","url":"/articles/offline-database.html","content":"","keywords":"","version":"Next"},{"title":"Why Choose an Offline Database?​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#why-choose-an-offline-database","content":" Offline-first or local-first software stores data directly on the client device. This strategy isn’t just about surviving network outages; it also makes your application faster, more user-friendly, and better at handling multiple usage scenarios. ","version":"Next","tagName":"h2"},{"title":"1. Zero Loading Spinners​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#1-zero-loading-spinners","content":" Applications that call remote servers for every request inevitably show loading spinners. With an offline database, read and write operations happen locally—providing near-instant feedback. Users no longer stare at progress indicators or wait for server responses, resulting in a smoother and more fluid experience. ","version":"Next","tagName":"h3"},{"title":"2. Multi-Tab Consistency​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#2-multi-tab-consistency","content":" Many websites mishandle data across multiple browser tabs. In an offline database, all tabs share the same local datastore. If the user updates data in one tab (like completing a to-do item), changes instantly reflect in every other tab. This removes complex multi-window synchronization problems. ","version":"Next","tagName":"h3"},{"title":"3. Real-Time Data Feeds​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#3-real-time-data-feeds","content":" Apps that rely on a purely server-driven approach often show stale data unless they add a separate real-time push system (like websockets). Local-first solutions with built-in replication essentially get real-time updates “for free.” Once the server sends any changes, your local offline database updates—keeping your UI live and accurate. ","version":"Next","tagName":"h3"},{"title":"4. Reduced Server Load​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#4-reduced-server-load","content":" In a traditional app, every interaction triggers a request to the server, scaling up resource usage quickly as traffic grows. Offline-first setups replicate data to the client once, and subsequent local reads or writes do not stress the backend. Your server usage grows with the amount of data—rather than every user action—leading to more efficient scaling. ","version":"Next","tagName":"h3"},{"title":"5. Simpler Development: Fewer Endpoints, No Extra State Library​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#5-simpler-development-fewer-endpoints-no-extra-state-library","content":" Typical apps require numerous REST endpoints and possibly a client-side state manager (like Redux) to handle data flow. If you adopt an offline database, you can replicate nearly everything to the client. The local DB becomes your single source of truth, and you may skip advanced state libraries altogether. ","version":"Next","tagName":"h3"},{"title":"Introducing RxDB – A Powerful Offline Database Solution​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#introducing-rxdb--a-powerful-offline-database-solution","content":" RxDB (Reactive Database) is a NoSQL JavaScript database that lives entirely in your client environment. It’s optimized for: Offline-first usageReactive queries (your UI updates in real time)Flexible replication with various backendsField-level encryption to protect sensitive data You can run RxDB in: Browsers (IndexedDB, OPFS)Mobile hybrid apps (Ionic, Capacitor)Native modules (React Native)Desktop environments (Electron)Node.jsServers or Scripts Wherever your JavaScript executes, RxDB can serve as a robust offline database. ","version":"Next","tagName":"h2"},{"title":"Quick Setup Example​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#quick-setup-example","content":" Below is a short demo of how to create an RxDB database, add a collection, and observe a query. You can expand upon this to enable encryption or full sync. import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; async function initDB() { // Create a local offline database const db = await createRxDatabase({ name: 'myOfflineDB', storage: getRxStorageLocalstorage() }); // Add collections await db.addCollections({ tasks: { schema: { title: 'tasks schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string' }, title: { type: 'string' }, done: { type: 'boolean' } } } } }); // Observe changes in real time db.tasks .find({ selector: { done: false } }) .$ // returns an observable that emits whenever the result set changes .subscribe(undoneTasks => { console.log('Currently undone tasks:', undoneTasks); }); return db; } Now the tasks collection is ready to store data offline. You could also replicate it to a backend, encrypt certain fields, or utilize more advanced features like conflict resolution. ","version":"Next","tagName":"h2"},{"title":"How Offline Sync Works in RxDB​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#how-offline-sync-works-in-rxdb","content":" RxDB uses a Sync Engine that pushes local changes to the server and pulls remote updates back down. This ensures local data is always fresh and that the server has the latest offline edits once the device reconnects. Multiple Plugins exist to handle various backends or replication methods: CouchDB or PouchDBGoogle FirestoreGraphQL endpointsREST / HTTPWebSocket or WebRTC (for peer-to-peer sync) You pick the plugin that fits your stack, and RxDB handles everything from conflict detection to event emission, allowing you to focus on building your user-facing features. import { replicateRxCollection } from 'rxdb/plugins/replication'; replicateRxCollection({ collection: db.tasks, replicationIdentifier: 'tasks-sync', pull: { /* fetch updates from server */ }, push: { /* send local writes to server */ }, live: true // keep them in sync constantly }); ","version":"Next","tagName":"h2"},{"title":"Securing Your Offline Database with Encryption​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#securing-your-offline-database-with-encryption","content":" Local data can be a risk if it’s sensitive or personal. RxDB offers encryption plugins to keep specific document fields secure at rest. Encryption Example​ import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; async function initSecureDB() { // Wrap the storage with crypto-js encryption const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ storage: getRxStorageLocalstorage() }); // Create database with a password const db = await createRxDatabase({ name: 'secureOfflineDB', storage: encryptedStorage, password: 'myTopSecretPassword' }); // Define an encrypted collection await db.addCollections({ userSecrets: { schema: { title: 'encrypted user data', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string' }, secretData: { type: 'string' } }, required: ['id'], encrypted: ['secretData'] // field is encrypted at rest } } }); return db; } When the device is off or the database file is extracted, secretData remains unreadable without the specified password. This ensures only authorized parties can access sensitive fields, even in offline scenarios. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB – The Ultimate Offline Database with Sync and Encryption","url":"/articles/offline-database.html#follow-up","content":" Integrating an offline database approach into your app delivers near-instant interactions, true multi-tab data consistency, automatic real-time updates, and reduced server dependencies. By choosing RxDB, you gain: Offline-first local storageFlexible replication to various backendsEncryption of sensitive fieldsReactive queries for real-time UI updates RxDB transforms how you build and scale apps—no more loading spinners, no more stale data, no more complicated offline handling. Everything is local, synced, and secured. Continue your learning path: Explore the RxDB EcosystemDive into additional features like Compression or advanced Conflict Handling to optimize your offline database. Learn More About Offline-FirstRead our Offline First documentation for a deeper understanding of why local-first architectures improve user experience and reduce server load. Join the CommunityHave questions or feedback? Connect with us on the RxDB Chat or open an issue on GitHub. Upgrade to PremiumIf you need high-performance features—like SQLite storage for mobile or the Web Crypto-based encryption plugin—consider our premium offerings. By adopting an offline database approach with RxDB, you unlock speed, reliability, and security for your applications—leading to a truly seamless user experience. ","version":"Next","tagName":"h2"},{"title":"Building an Optimistic UI with RxDB","type":0,"sectionRef":"#","url":"/articles/optimistic-ui.html","content":"","keywords":"","version":"Next"},{"title":"Benefits of an Optimistic UI​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#benefits-of-an-optimistic-ui","content":" Optimistic UIs offer a host of advantages, from improving the user experience to streamlining the underlying infrastructure. Below are some key reasons why an optimistic approach can revolutionize your application's performance and scalability. ","version":"Next","tagName":"h2"},{"title":"Better User Experience with Optimistic UI​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#better-user-experience-with-optimistic-ui","content":" No loading spinners, near-zero latency: Users perceive their actions as instant. Any actual network delays or slow server operations can be handled behind the scenes.Offline capability: Optimistic UI pairs perfectly with offline-first apps. Users can continue to interact with the application even when offline, and changes will be synced automatically once the network is available again. ","version":"Next","tagName":"h3"},{"title":"Better Scaling and Easier to Implement​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#better-scaling-and-easier-to-implement","content":" Fewer server endpoints: Instead of sending a separate HTTP request for every single user interaction, you can batch updates and sync them in bulk.Less server load: By handling changes locally and syncing in batches, you reduce the volume of server round-trips.Automated error handling: If a request fails or a document is in conflict, RxDB's replication mechanism can seamlessly retry and resolve conflicts in the background, without requiring a separate endpoint or manual user intervention. ","version":"Next","tagName":"h3"},{"title":"Building Optimistic UI Apps with RxDB​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#building-optimistic-ui-apps-with-rxdb","content":" Now that we know what an optimistic UI is, lets build one with RxDB. ","version":"Next","tagName":"h2"},{"title":"Local Database: The Backbone of an Optimistic UI​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#local-database-the-backbone-of-an-optimistic-ui","content":" A local database is the heart of an Optimistic UI. With RxDB, all application state is stored locally, ensuring seamless and instant updates. You can choose from multiple storage backends based on your runtime - check out RxDB Storage Options to see which engines (IndexedDB, SQLite, or custom) suit your environment best. Instant Writes: When users perform an action (like clicking a button or submitting a form), the changes are written directly to the local RxDB database. This immediate local write makes the UI feel snappy and removes the dependency on instantaneous server responses. Offline-First: Because data is managed locally, your app continues to operate smoothly even without an internet connection. Users can view, create, and update data at any time, assured that changes will sync automatically once they're back online. ","version":"Next","tagName":"h3"},{"title":"Real-Time UI Changes on Updates​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#real-time-ui-changes-on-updates","content":" RxDB's core is built around observables that react to any state changes - whether from local writes or incoming replication from the server. Automatic UI refresh: Any query or document subscription in RxDB automatically notifies your UI layer when data changes. There's no need to manually poll or refetch.Cross-tab updates: If you have the same RxDB database open in multiple browser tabs, changes in one tab instantly propagate to the others. Event-Reduce Algorithm: Under the hood, RxDB uses the event-reduce algorithm to minimize overhead. Instead of re-running expensive queries, RxDB calculates the smallest possible updates needed to keep query results accurate - further boosting real-time performance. ","version":"Next","tagName":"h3"},{"title":"Replication with a Server​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#replication-with-a-server","content":" While local storage is key to an Optimistic UI, most applications ultimately need to sync with a remote back end. RxDB offers a powerful replication system that can sync your local data with virtually any server/database in the background: Incremental and real-time: RxDB continuously pushes local changes to the server when a network is available and fetches server updates as they happen.Conflict resolution: If changes happen offline or multiple clients update the same data, RxDB detects conflicts and makes it straightforward to resolve them.Flexible transport: Beyond simple HTTP polling, you can incorporate WebSockets, Server-Sent Events (SSE), or other protocols for instant, server-confirmed changes broadcast to all connected clients. See this guide to learn more. By combining local-first data handling with real-time synchronization, RxDB delivers most of what an Optimistic UI needs - right out of the box. The result is a seamless user experience where interactions never feel blocked by slow networks, and any conflicts or final validations are quietly handled in the background. Handling Offline Changes and Conflicts​ Offline-first approach: All writes are initially stored in the local database. When connectivity returns, RxDB's replication automatically pushes changes to the server.Conflict resolution: If multiple clients edit the same documents while offline, conflicts are automatically detected and can be resolved gracefully (more on conflicts below). WebSockets, SSE, or Beyond​ For truly real-time communication - where server-confirmed changes instantly reach all clients - you can go beyond simple HTTP polling. Use WebSockets, Server-Sent Events (SSE), or other streaming protocols to broadcast updates the moment they occur. This pattern excels in scenarios like chats, collaborative editors, or dynamic dashboards. To learn more about these protocols and their integration with RxDB, check out this guide. ","version":"Next","tagName":"h3"},{"title":"Optimistic UI in Various Frameworks​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#optimistic-ui-in-various-frameworks","content":" ","version":"Next","tagName":"h2"},{"title":"Angular Example​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#angular-example","content":" Angular's async pipe works smoothly with RxDB's observables. Suppose you have a myCollection of documents, you can directly subscribe in the template: <ul *ngIf="(myCollection.find().$ | async) as docs"> <li *ngFor="let doc of docs"> {{ doc.name }} </li> </ul> This snippet: Subscribes to myCollection.find().$, which emits live updates whenever documents in the collection change.Passes the emitted array of documents into docs.Renders each document in a list item, instantly reflecting any changes. ","version":"Next","tagName":"h3"},{"title":"React Example​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#react-example","content":" In React, you can utilize signals or other state management tools. For instance, if we have an RxDB extension that exposes a signal: import React from 'react'; function MyComponent({ myCollection }) { // .find().$$ provides a signal that updates whenever data changes const docsSignal = myCollection.find().$$; return ( <ul> {docs.map((doc) => ( <li key={doc.id}>{doc.name}</li> ))} </ul> ); } export default MyComponent; When you call docsSignal.value or use a hook like useSignal, it pulls the latest value from the RxDB query. Whenever the collection updates, the signal emits the new data, and React re-renders the component instantly. ","version":"Next","tagName":"h3"},{"title":"Downsides of Optimistic UI Apps​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#downsides-of-optimistic-ui-apps","content":" While Optimistic UIs feel snappy, there are some caveats: Conflict Resolution: With an optimistic approach, multiple offline devices might edit the same data. When syncing back, conflicts occur that must be merged. RxDB uses revisions to detect and handle these conflicts. User Confusion: Users may see changes that haven't yet been confirmed by the server. If a subsequent server validation fails, the UI must revert to a previous state. Clear visual feedback or user notifications help reduce confusion. Server Compatibility: The server must be capable of storing and returning revision metadata (for instance, a timestamp or versioning system). Check out RxDB's replication docs for details on how to structure your back end. Storage Limits: Storing data in the client has practical size limits. IndexedDB or other client-side storages have constraints (though usually quite large). See storage comparisons. ","version":"Next","tagName":"h2"},{"title":"Conflict Resolution Strategies​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#conflict-resolution-strategies","content":" Last Write to Server Wins: A simplest-possible method: whatever update reaches the server last overrides previous data. Good for non-critical data like “like" counts or ephemeral states.Revision-Based Merges: Use revision numbers or timestamps to track concurrent edits. Merge them intelligently by combining fields or choosing the latest sub-document changes. This is ideal for collaborative apps where you don't want to overwrite entire records.User Prompts: In certain workflows (e.g., shipping forms, e-commerce checkout), you may need to notify the user about conflicts and let them choose which version to keep.First Write to Server Wins (RxDB Default): RxDB's default approach is to let the first successful push define the latest version. Any incoming push with an outdated revision triggers a conflict that must be resolved on the client side. Learn more at here. ","version":"Next","tagName":"h2"},{"title":"When (and When Not) to Use Optimistic UI​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#when-and-when-not-to-use-optimistic-ui","content":" When to Use Real-time interactions like chat apps, social feeds, or “Likes." Situations where high success rates of operations are expected (most writes don't fail).Apps that need an offline-first approach or handle intermittent connectivity gracefully. When Not to Use Large, complex transactions with high failure rates.Scenarios requiring heavy server validations or approvals (for example, financial transactions with complex rules).Workflows where immediate feedback could mislead users about an operation's success probability. Assessing Risk Consider the likelihood that a user's action might fail. If it's very low, optimistic UI is often best.If frequent failures or complex validations occur, consider a hybrid approach: partial optimistic updates for some actions, while more critical operations rely on immediate server confirmation. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"Building an Optimistic UI with RxDB","url":"/articles/optimistic-ui.html#follow-up","content":" Ready to start building your own Optimistic UI with RxDB? Here are some next steps: Do the RxDB QuickstartIf you're brand new to RxDB, the quickstart guide will walk you through installation and setting up your first project. Check Out the Demo AppA live RxDB Quickstart Demo showcases optimistic updates and real-time syncing. Explore the code to see how it works. Star the GitHub RepoShow your support for RxDB by starring the RxDB GitHub Repository. By combining RxDB's powerful offline-first capabilities with the principles of an Optimistic UI, you can deliver snappy, near-instant user interactions that keep your users engaged - no matter the network conditions. Get started today and give your users the experience they deserve! ","version":"Next","tagName":"h2"},{"title":"RxDB as a Database for Progressive Web Apps (PWA)","type":0,"sectionRef":"#","url":"/articles/progressive-web-app-database.html","content":"","keywords":"","version":"Next"},{"title":"What is a Progressive Web App​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#what-is-a-progressive-web-app","content":" Progressive Web Apps are the future of web development, seamlessly combining the best of both web and mobile app worlds. They can be easily installed on the user's home screen, function offline, and load at lightning speed. Unlike hybrid apps, PWAs offer a consistent user experience across platforms, making them a versatile choice for modern applications. PWAs bring a plethora of advantages to the table. They eliminate the hassle of app store installations and updates, reduce dependency on network connectivity, and prioritize fast loading times. By harnessing the power of service workers and intelligent caching mechanisms, PWAs ensure users can access content even in offline mode. Furthermore, PWAs are device-agnostic, seamlessly adapting to various devices, from desktops to smartphones. ","version":"Next","tagName":"h2"},{"title":"Introducing RxDB as a Client-Side Database for PWAs​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#introducing-rxdb-as-a-client-side-database-for-pwas","content":" At the heart of PWAs lies efficient data management, and RxDB steps in as a reliable ally. As a client-side NoSQL database, RxDB seamlessly integrates into web applications, offering real-time data synchronization and manipulation capabilities. This article sheds light on the transformative potential of RxDB as it collaborates harmoniously with PWAs, enabling local-first strategies and elevating user interactions to a whole new level. ","version":"Next","tagName":"h2"},{"title":"Getting Started with RxDB​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#getting-started-with-rxdb","content":" RxDB emerges as a reactive, schema-based NoSQL database crafted explicitly for client-side applications. Its real-time data synchronization and responsiveness align seamlessly with the dynamic demands of modern PWAs. Local-First Approach​ The cornerstone of RxDB's philosophy is the local-first approach, empowering PWAs to prioritize data storage and manipulation on the client side. This paradigm ensures that PWAs remain functional even when offline, allowing users to access and interact with data seamlessly. RxDB bridges any gaps in data synchronization once network connectivity is restored. Observable Queries​ Observable queries (aka Live-Queries) serve as the engine of RxDB's dynamic capabilities. By leveraging these queries, PWAs can monitor and respond to data changes in real time. The result is an engaging user interface with instantaneous updates that captivate users and keep them engaged. await db.heroes.find({ selector: { healthpoints: { $gt: 0 } } }) .$ // the $ returns an observable that emits each time the result set of the query changes .subscribe(aliveHeroes => console.dir(aliveHeroes)); Multi-Tab Support​ RxDB extends its prowess to multi-tab scenarios, guaranteeing data consistency across different tabs or windows of the same PWA. This feature promotes a seamless transition between various sections of the application, while minimizing data conflicts. ","version":"Next","tagName":"h3"},{"title":"Using RxDB in a Progressive Web App​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#using-rxdb-in-a-progressive-web-app","content":" Integrating RxDB into a Progressive Web App, driven by technologies like React, is a straightforward process. By configuring RxDB and installing the necessary packages, developers establish a solid foundation for robust data management within their PWA. ","version":"Next","tagName":"h3"},{"title":"Exploring Different RxStorage Layers​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#exploring-different-rxstorage-layers","content":" RxDB caters to diverse needs through its various RxStorage layers: localstorage RxStorage: Leveraging the capabilities of the browsers localstorage API for storage.IndexedDB RxStorage: Tapping into the browser's IndexedDB for efficient data storage.OPFS RxStorage: Interfacing with the Offline-First Persistence System for seamless persistence.Memory RxStorage: Storing data in memory, ideal for temporary data requirements. This flexibility empowers developers to optimize data storage based on the unique needs of their PWA. Synchronizing Data with RxDB between PWA Clients and Servers To facilitate seamless data synchronization between PWA clients and servers, RxDB offers a range of replication options: RxDB Replication Algorithm: RxDB introduces its own replication algorithm, enabling efficient and reliable data synchronization between clients and servers. CouchDB Replication: Leveraging its roots in CouchDB, RxDB facilitates smooth data replication between clients and CouchDB servers, ensuring data consistency and synchronization across devices. Firestore Replication: RxDB synchronizes data with Google Firestore, a real-time cloud-hosted NoSQL database. This integration guarantees up-to-date data across different instances of the PWA. Peer-to-Peer (P2P) via WebRTC Replication: RxDB supports P2P replication, facilitating direct data synchronization between clients without intermediaries. This decentralized approach is invaluable in scenarios where server infrastructure is limited. ","version":"Next","tagName":"h2"},{"title":"Advanced RxDB Features and Techniques​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#advanced-rxdb-features-and-techniques","content":" ","version":"Next","tagName":"h2"},{"title":"Encryption of Local Data​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#encryption-of-local-data","content":" RxDB empowers PWAs with the ability to encrypt local data, enhancing data security and safeguarding sensitive information. This feature is indispensable for applications handling user credentials, financial transactions, and other confidential data. ","version":"Next","tagName":"h3"},{"title":"Indexing and Performance Optimization​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#indexing-and-performance-optimization","content":" Performance optimization is a top priority for PWAs. RxDB addresses this concern by offering indexing options that expedite data retrieval, resulting in a snappier user interface and heightened responsiveness. ","version":"Next","tagName":"h3"},{"title":"JSON Key Compression​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#json-key-compression","content":" RxDB introduces JSON key compression, a feature that reduces storage requirements. This optimization is particularly beneficial for PWAs dealing with substantial data volumes, enhancing overall efficiency and resource utilization. ","version":"Next","tagName":"h3"},{"title":"Change Streams and Event Handling​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#change-streams-and-event-handling","content":" RxDB introduces change streams, enabling PWAs to react to data changes in real time. This capability empowers dynamic updates to the user interface, promoting interactivity and engagement. ","version":"Next","tagName":"h3"},{"title":"Conclusion​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#conclusion","content":" In the ever-evolving landscape of web application development, Progressive Web Apps continue to redefine user experiences. RxDB emerges as a pivotal player, seamlessly integrating with PWAs and enhancing their capabilities. With features like the local-first approach, observable queries, replication mechanisms, and advanced encryption, RxDB empowers developers to create responsive, offline-capable, and data-driven PWAs. As the demand for sophisticated PWAs continues to surge, RxDB remains an indispensable tool for developers aiming to push the boundaries of innovation and redefine the standards of user engagement. By embracing RxDB, developers ensure their PWAs remain at the forefront of the digital revolution, offering seamless and immersive experiences to users around the world. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB as a Database for Progressive Web Apps (PWA)","url":"/articles/progressive-web-app-database.html#follow-up","content":" To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects.RxDB Progressive Web App in Angular Example ","version":"Next","tagName":"h2"},{"title":"RxDB as a Database for React Applications","type":0,"sectionRef":"#","url":"/articles/react-database.html","content":"","keywords":"","version":"Next"},{"title":"Introducing RxDB as a JavaScript Database​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#introducing-rxdb-as-a-javascript-database","content":" RxDB, a powerful JavaScript database, has garnered attention as an optimal solution for managing data in React applications. Built on top of the IndexedDB standard, RxDB combines the principles of reactive programming with database management. Its core features include reactive data handling, offline-first capabilities, and robust data replication. ","version":"Next","tagName":"h2"},{"title":"What is RxDB?​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#what-is-rxdb","content":" RxDB, short for Reactive Database, is an open-source JavaScript database that seamlessly integrates reactive programming with database operations. It offers a comprehensive API for performing database actions and synchronizing data across clients and servers. RxDB's underlying philosophy revolves around observables, allowing developers to reactively manage data changes and create dynamic user interfaces. ","version":"Next","tagName":"h2"},{"title":"Reactive Data Handling​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#reactive-data-handling","content":" One of RxDB's standout features is its support for reactive data handling. Traditional databases often require manual intervention for data fetching and updating, leading to complex and error-prone code. RxDB, however, automatically notifies subscribers whenever data changes occur, eliminating the need for explicit data manipulation. This reactive approach simplifies code and enhances the responsiveness of React components. ","version":"Next","tagName":"h3"},{"title":"Local-First Approach​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#local-first-approach","content":" RxDB embraces a local-first methodology, enabling applications to function seamlessly even in offline scenarios. By storing data locally, RxDB ensures that users can interact with the application and make updates regardless of internet connectivity. Once the connection is reestablished, RxDB synchronizes the local changes with the remote database, maintaining data consistency across devices. ","version":"Next","tagName":"h3"},{"title":"Data Replication​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#data-replication","content":" Data replication is a cornerstone of modern applications that require synchronization between multiple clients and servers. RxDB provides robust data replication mechanisms that facilitate real-time synchronization between different instances of the database. This ensures that changes made on one client are promptly propagated to others, contributing to a cohesive and unified user experience. ","version":"Next","tagName":"h3"},{"title":"Observable Queries​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#observable-queries","content":" RxDB extends the concept of observables beyond data changes. It introduces observable queries, allowing developers to observe the results of database queries. This feature enables automatic updates to query results whenever relevant data changes occur. Observable queries simplify state management by eliminating the need to manually trigger updates in response to changing data. await db.heroes.find({ selector: { healthpoints: { $gt: 0 } } }) .$ // the $ returns an observable that emits each time the result set of the query changes .subscribe(aliveHeroes => console.dir(aliveHeroes)); ","version":"Next","tagName":"h3"},{"title":"Multi-Tab Support​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#multi-tab-support","content":" Web applications often operate in multiple browser tabs or windows. RxDB accommodates this scenario by offering built-in multi-tab support. It ensures that data changes made in one tab are efficiently propagated to other tabs, maintaining data consistency and providing a seamless experience for users interacting with the application across different tabs. ","version":"Next","tagName":"h3"},{"title":"RxDB vs. Other React Database Options​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#rxdb-vs-other-react-database-options","content":" While considering database options for React applications, RxDB stands out due to its unique combination of reactive programming and database capabilities. Unlike traditional solutions such as IndexedDB or Web Storage, which provide basic data storage, RxDB offers a dedicated database solution with advanced features. Additionally, while state management libraries like Redux and MobX can be adapted for database use, RxDB provides an integrated solution specifically designed for handling data. ","version":"Next","tagName":"h3"},{"title":"IndexedDB in React and the Advantage of RxDB​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#indexeddb-in-react-and-the-advantage-of-rxdb","content":" Using IndexedDB directly in React can be challenging due to its low-level, callback-based API which doesn't align neatly with modern React's Promise and async/await patterns. This intricacy often leads to bulky and complex implementations for developers. Also, when used wrong, IndexedDB can have a worse performance profile then it could have. In contrast, RxDB, with the IndexedDB RxStorage and the LocalStorage RxStorage, abstracts these complexities, integrating reactive programming and providing a more streamlined experience for data management in React applications. Thus, RxDB offers a more intuitive approach, eliminating much of the manual overhead required with IndexedDB. ","version":"Next","tagName":"h3"},{"title":"Using RxDB in a React Application​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#using-rxdb-in-a-react-application","content":" The process of integrating RxDB into a React application is straightforward. Begin by installing RxDB as a dependency:npm install rxdb rxjsOnce installed, RxDB can be imported and initialized within your React components. The following code snippet illustrates a basic setup: import { createRxDatabase } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'heroesdb', // <- name storage: getRxStorageLocalstorage(), // <- RxStorage password: 'myPassword', // <- password (optional) multiInstance: true, // <- multiInstance (optional, default: true) eventReduce: true, // <- eventReduce (optional, default: false) cleanupPolicy: {} // <- custom cleanup policy (optional) }); ","version":"Next","tagName":"h3"},{"title":"Using RxDB React Hooks​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#using-rxdb-react-hooks","content":" The rxdb-hooks package provides a set of React hooks that simplify data management within components. These hooks leverage RxDB's reactivity to automatically update components when data changes occur. The following example demonstrates the usage of the useRxCollection and useRxQuery hooks to query and observe a collection: const collection = useRxCollection('characters'); const query = collection.find().where('affiliation').equals('Jedi'); const { result: characters, isFetching, fetchMore, isExhausted, } = useRxQuery(query, { pageSize: 5, pagination: 'Infinite', }); if (isFetching) { return 'Loading...'; } return ( <CharacterList> {characters.map((character, index) => ( <Character character={character} key={index} /> ))} {!isExhausted && <button onClick={fetchMore}>load more</button>} </CharacterList> ); ","version":"Next","tagName":"h3"},{"title":"Different RxStorage Layers for RxDB​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#different-rxstorage-layers-for-rxdb","content":" RxDB offers multiple storage layers, each backed by a different underlying technology. Developers can choose the storage layer that best suits their application's requirements. Some available options include: LocalStorage RxStorage: Built on top of the browsers localstorage API.IndexedDB RxStorage: The default RxDB storage layer, providing efficient data storage in modern browsers.OPFS RxStorage: Uses the Operational File System (OPFS) for storage, suitable for Electron applications.Memory RxStorage: Stores data in memory, primarily intended for testing and development purposes.SQLite RxStorage: Stores data in an SQLite database. Can be used in a browser with react by using a SQLite database that was compiled to WebAssembly. Using SQLite in react might not be the best idea, because a compiled SQLite wasm file is about one megabyte of code that has to be loaded and rendered by your users. Using native browser APIs like IndexedDB and OPFS have shown to be a more optimal database solution for browser based react apps compared to SQLite. ","version":"Next","tagName":"h3"},{"title":"Synchronizing Data with RxDB between Clients and Servers​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#synchronizing-data-with-rxdb-between-clients-and-servers","content":" The offline-first approach is a fundamental principle of RxDB's design. When dealing with client-server synchronization, RxDB ensures that changes made offline are captured and propagated to the server once connectivity is reestablished. This mechanism guarantees that data remains consistent across different client instances, even when operating in an occasionally connected environment. RxDB offers a range of replication plugins that facilitate data synchronization between clients and servers. These plugins support various synchronization strategies, such as one-way replication, two-way replication, and custom conflict resolution. Developers can select the appropriate plugin based on their application's synchronization requirements. ","version":"Next","tagName":"h3"},{"title":"Advanced RxDB Features and Techniques​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#advanced-rxdb-features-and-techniques","content":" Encryption of Local Data Security is paramount when handling sensitive user data. RxDB supports data encryption, ensuring that locally stored information remains protected from unauthorized access. This feature is particularly valuable when dealing with sensitive data in offline scenarios. ","version":"Next","tagName":"h3"},{"title":"Indexing and Performance Optimization​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#indexing-and-performance-optimization","content":" Efficient indexing is critical for achieving optimal database performance. RxDB provides mechanisms to define indexes on specific fields, enhancing query speed and reducing the computational overhead of data retrieval. ","version":"Next","tagName":"h3"},{"title":"JSON Key Compression​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#json-key-compression","content":" RxDB employs JSON key compression to reduce storage space and improve performance. This technique minimizes the memory footprint of the database, making it suitable for applications with limited resources. ","version":"Next","tagName":"h3"},{"title":"Change Streams and Event Handling​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#change-streams-and-event-handling","content":" RxDB enables developers to subscribe to change streams, which emit events whenever data changes occur. This functionality facilitates real-time event handling and provides opportunities for implementing features such as notifications and live updates. ","version":"Next","tagName":"h3"},{"title":"Conclusion​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#conclusion","content":" In the realm of React application development, efficient data management is pivotal to delivering a seamless and engaging user experience. RxDB emerges as a compelling solution, seamlessly integrating reactive programming principles with sophisticated database capabilities. By adopting RxDB, React developers can harness its powerful features, including reactive data handling, offline-first support, and real-time synchronization. With RxDB as a foundational pillar, React applications can excel in responsiveness, scalability, and data integrity. As the landscape of web development continues to evolve, RxDB remains a steadfast companion for creating robust and dynamic React applications. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB as a Database for React Applications","url":"/articles/react-database.html#follow-up","content":" To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which provides step-by-step instructions for setting up and using RxDB in your projects.RxDB React Example at GitHub ","version":"Next","tagName":"h2"},{"title":"IndexedDB Database in React Apps - The Power of RxDB","type":0,"sectionRef":"#","url":"/articles/react-indexeddb.html","content":"","keywords":"","version":"Next"},{"title":"What is IndexedDB?​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#what-is-indexeddb","content":" IndexedDB is a low-level API for storing significant amounts of structured data in the browser. It provides a transactional database system that can store key-value pairs, complex objects, and more. This storage engine is asynchronous and supports advanced data types, making it suitable for offline storage and complex web applications. ","version":"Next","tagName":"h2"},{"title":"Why Use IndexedDB in React​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#why-use-indexeddb-in-react","content":" When building React applications, IndexedDB can play a crucial role in enhancing both performance and user experience. Here are some reasons to consider using IndexedDB: Offline-First / Local-First: By storing data locally, your application remains functional even without an internet connection.Performance: Using local data means zero latency and no loading spinners, as data doesn't need to be fetched over a network.Easier Implementation: Replicating all data to the client once is often simpler than implementing multiple endpoints for each user interaction.Scalability: Local data reduces server load because queries run on the client side, decreasing server bandwidth and processing requirements. ","version":"Next","tagName":"h2"},{"title":"Why To Not Use Plain IndexedDB​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#why-to-not-use-plain-indexeddb","content":" While IndexedDB itself is powerful, its native API comes with several drawbacks for everyday application developers: Callback-Based API: IndexedDB was designed with callbacks rather than modern Promises, making asynchronous code more cumbersome.Complexity: IndexedDB is low-level, intended for library developers rather than for app developers who simply want to store data.Basic Query API: Its rudimentary query capabilities limit how you can efficiently perform complex queries, whereas libraries like RxDB offer more advanced query features.TypeScript Support: Ensuring good TypeScript support with IndexedDB is challenging, especially when trying to enforce document type consistency.Lack of Observable API: IndexedDB doesn't provide an observable API out of the box. RxDB solves this by enabling you to observe query results or specific document fields.Cross-Tab Communication: Managing cross-tab updates in plain IndexedDB is difficult. RxDB handles this seamlessly-changes in one tab automatically affect observed data in others.Missing Advanced Features: Features like encryption or compression aren't built into IndexedDB, but they are available via RxDB.Limited Platform Support: IndexedDB exists only in the browser. In contrast, RxDB offers swappable storages to use the same code in React Native, Capacitor, or Electron. ","version":"Next","tagName":"h2"},{"title":"Set up RxDB in React​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#set-up-rxdb-in-react","content":" Setting up RxDB with React is straightforward. It abstracts IndexedDB complexities and adds a layer of powerful features over it. ","version":"Next","tagName":"h2"},{"title":"Installing RxDB​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#installing-rxdb","content":" First, install RxDB and RxJS from npm: npm install rxdb rxjs --save``` ","version":"Next","tagName":"h3"},{"title":"Create a Database and Collections​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#create-a-database-and-collections","content":" RxDB provides two main storage options: The free localstorage-based storageThe premium plain IndexedDB-based storage, offering faster performance Below is an example of setting up a simple RxDB database using the localstorage-based storage in a React app: import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; // create a database const db = await createRxDatabase({ name: 'heroesdb', // the name of the database storage: getRxStorageLocalstorage() }); // Define your schema const heroSchema = { title: 'hero schema', version: 0, description: 'Describes a hero in your app', primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 }, name: { type: 'string' }, power: { type: 'string' } }, required: ['id', 'name'] }; // add collections await db.addCollections({ heroes: { schema: heroSchema } }); ","version":"Next","tagName":"h3"},{"title":"CRUD Operations​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#crud-operations","content":" Once your database is initialized, you can perform all CRUD operations: // insert await db.heroes.insert({ name: 'Iron Man', power: 'Genius-level intellect' }); // bulk insert await db.heroes.bulkInsert([ { name: 'Thor', power: 'God of Thunder' }, { name: 'Hulk', power: 'Superhuman Strength' } ]); // find and findOne const heroes = await db.heroes.find().exec(); const ironMan = await db.heroes.findOne({ selector: { name: 'Iron Man' } }).exec(); // update const doc = await db.heroes.findOne({ selector: { name: 'Hulk' } }).exec(); await doc.update({ $set: { power: 'Unlimited Strength' } }); // delete const doc = await db.heroes.findOne({ selector: { name: 'Thor' } }).exec(); await doc.remove(); ","version":"Next","tagName":"h3"},{"title":"Reactive Queries and Live Updates​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#reactive-queries-and-live-updates","content":" RxDB excels in providing reactive data capabilities, ideal for real-time applications. There are two main approaches to achieving live queries with RxDB: using RxJS Observables with React Hooks or utilizing Preact Signals. ","version":"Next","tagName":"h2"},{"title":"With RxJS Observables and React Hooks​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#with-rxjs-observables-and-react-hooks","content":" RxDB integrates seamlessly with RxJS Observables, allowing you to build reactive components. Here's an example of a React component that subscribes to live data updates: import { useState, useEffect } from 'react'; function HeroList({ collection }) { const [heroes, setHeroes] = useState([]); useEffect(() => { // create an observable query const query = collection.find(); const subscription = query.$.subscribe(newHeroes => { setHeroes(newHeroes); }); return () => subscription.unsubscribe(); }, [collection]); return ( <div> <h2>Hero List</h2> <ul> {heroes.map(hero => ( <li key={hero.id}> <strong>{hero.name}</strong> - {hero.power} </li> ))} </ul> </div> ); } This component subscribes to the collection's changes, updating the UI automatically whenever the underlying data changes, even across browser tabs. ","version":"Next","tagName":"h3"},{"title":"With Preact Signals​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#with-preact-signals","content":" RxDB also supports Preact Signals for reactivity, which can be integrated into React applications. Preact Signals offer a modern, fine-grained reactivity model. First, install the necessary package: npm install @preact/signals-core --save Set up RxDB with Preact Signals reactivity: import { PreactSignalsRxReactivityFactory } from 'rxdb/plugins/reactivity-preact-signals'; import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const database = await createRxDatabase({ name: 'mydb', storage: getRxStorageLocalstorage(), reactivity: PreactSignalsRxReactivityFactory }); Now, you can obtain signals directly from RxDB queries using the double-dollar sign ($$): function HeroList({ collection }) { const heroes = collection.find().$$; return ( <ul> {heroes.map(hero => ( <li key={hero.id}>{hero.name}</li> ))} </ul> ); } This approach provides automatic updates whenever the data changes, without needing to manage subscriptions manually. ","version":"Next","tagName":"h3"},{"title":"React IndexedDB Example with RxDB​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#react-indexeddb-example-with-rxdb","content":" A comprehensive example of using RxDB within a React application can be found in the RxDB GitHub repository. This repository contains sample applications, showcasing best practices and demonstrating how to integrate RxDB for various use cases. ","version":"Next","tagName":"h2"},{"title":"Advanced RxDB Features​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#advanced-rxdb-features","content":" RxDB offers many advanced features that extend beyond basic data storage: RxDB Replication: Synchronize local data with remote databases seamlessly. Learn more: RxDB ReplicationData Migration: Handle schema changes gracefully with automatic data migrations. See: Data migrationEncryption: Secure your data with built-in encryption capabilities. Explore: EncryptionCompression: Optimize storage using key compression. Details: Compression ","version":"Next","tagName":"h2"},{"title":"Limitations of IndexedDB​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#limitations-of-indexeddb","content":" While IndexedDB is powerful, it has some inherent limitations: Performance: IndexedDB can be slow under certain conditions. Read more: Slow IndexedDBStorage Limits: Browsers impose limits on how much data can be stored. See: Browser storage limits ","version":"Next","tagName":"h2"},{"title":"Alternatives to IndexedDB​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#alternatives-to-indexeddb","content":" Depending on your application's requirements, there are alternative storage solutions to consider: Origin Private File System (OPFS): A newer API that can offer better performance. RxDB supports OPFS as well. More info: RxDB OPFS StorageSQLite: Ideal for React applications on Capacitor or Ionic, offering native performance. Explore: RxDB SQLite Storage ","version":"Next","tagName":"h2"},{"title":"Performance comparison with other browser storages​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#performance-comparison-with-other-browser-storages","content":" Here is a performance overview of the various browser based storage implementation of RxDB: ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"IndexedDB Database in React Apps - The Power of RxDB","url":"/articles/react-indexeddb.html#follow-up","content":" Learn how to use RxDB with the RxDB Quickstart for a guided introduction.Check out the RxDB GitHub repository and leave a star ⭐ if you find it useful. By leveraging RxDB on top of IndexedDB, you can create highly responsive, offline-capable React applications without dealing with the low-level complexities of IndexedDB directly. With reactive queries, seamless cross-tab communication, and powerful advanced features, RxDB becomes an invaluable tool in modern web development. ","version":"Next","tagName":"h2"},{"title":"React Native Encryption and Encrypted Database/Storage","type":0,"sectionRef":"#","url":"/articles/react-native-encryption.html","content":"","keywords":"","version":"Next"},{"title":"🔒 Why Encryption Matters​","type":1,"pageTitle":"React Native Encryption and Encrypted Database/Storage","url":"/articles/react-native-encryption.html#-why-encryption-matters","content":" Encryption ensures that, even if an unauthorized party obtains physical access to your device or intercepts data, they cannot read the information without the encryption key. Sensitive user data such as credentials, personal information, or financial details should always be encrypted. Proper encryption practices reduce the risk of data breaches and help your application remain compliant with regulations like GDPR or HIPAA. ","version":"Next","tagName":"h2"},{"title":"React Native Encryption Overview​","type":1,"pageTitle":"React Native Encryption and Encrypted Database/Storage","url":"/articles/react-native-encryption.html#react-native-encryption-overview","content":" React Native supports multiple ways to secure local data: Encrypted DatabasesUse databases with built-in encryption capabilities, such as SQLite with encryption layers or RxDB with its encryption plugin. Secure Storage LibrariesFor key-value data (like tokens or secrets), you can use libraries like react-native-keychain or react-native-encrypted-storage. Custom EncryptionIf you need more fine-grained control, you can integrate libraries like crypto-js or the Web Crypto API to encrypt data before storing it in a database or file. ","version":"Next","tagName":"h2"},{"title":"Setting Up Encryption in RxDB for React Native​","type":1,"pageTitle":"React Native Encryption and Encrypted Database/Storage","url":"/articles/react-native-encryption.html#setting-up-encryption-in-rxdb-for-react-native","content":" ","version":"Next","tagName":"h2"},{"title":"1. Install RxDB and Required Plugins​","type":1,"pageTitle":"React Native Encryption and Encrypted Database/Storage","url":"/articles/react-native-encryption.html#1-install-rxdb-and-required-plugins","content":" Install RxDB and the encryption plugin(s) you need. For the CryptoJS plugin: npm install rxdb npm install crypto-js ","version":"Next","tagName":"h3"},{"title":"2. Set Up Your RxDB Database with Encryption​","type":1,"pageTitle":"React Native Encryption and Encrypted Database/Storage","url":"/articles/react-native-encryption.html#2-set-up-your-rxdb-database-with-encryption","content":" RxDB offers two encryption plugins: CryptoJS Plugin: A free and straightforward solution for most basic use cases.Web Crypto Plugin: A premium plugin that utilizes the native Web Crypto API for better performance and security. Below is an example showing how to set up RxDB using the CryptoJS plugin. This example uses the in-memory storage for testing purposes. In a real production scenario, you would use a persistent storage adapter, mostly the SQLite-based storage. import { createRxDatabase } from 'rxdb'; import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; /* * For testing, we use the in-memory storage of RxDB. * In production you would use the persistent SQLite based storage instead. */ import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; async function initEncryptedDatabase() { // Wrap the normal storage with the encryption plugin const encryptedMemoryStorage = wrappedKeyEncryptionCryptoJsStorage({ storage: getRxStorageMemory() }); // Create an encrypted database const db = await createRxDatabase({ name: 'myEncryptedDatabase', storage: encryptedMemoryStorage, password: 'sudoLetMeIn' // Make sure not to hardcode in production }); // Define a schema and create a collection await db.addCollections({ secureData: { schema: { title: 'secure data schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string', maxLength: 100 }, normalField: { type: 'string' }, secretField: { type: 'string' } }, required: ['id', 'normalField', 'secretField'] } } }); return db; } ","version":"Next","tagName":"h3"},{"title":"3. Inserting and Querying Encrypted Data​","type":1,"pageTitle":"React Native Encryption and Encrypted Database/Storage","url":"/articles/react-native-encryption.html#3-inserting-and-querying-encrypted-data","content":" Once you've set up the database with encryption, data in fields specified by your schema will be encrypted automatically before it is stored, and decrypted when queried. (async () => { const db = await initEncryptedDatabase(); // Insert encrypted data const doc = await db.secureData.insert({ id: 'mySecretId', normalField: 'foobar', secretField: 'This is top secret data' }); // Query encrypted data by its primary key or non-encrypted fields const fetchedDoc = await db.secureData.findOne({ selector: { normalField: 'foobar' } }).exec(true); console.log(fetchedDoc.secretField); // 'This is top secret data' // Update data await fetchedDoc.patch({ secretField: 'Updated secret data' }); })(); Note: You can only query directly by non-encrypted fields or primary keys. Encrypted fields cannot be used in queries because they are stored as ciphertext in the database. A common approach is to have a small subset of fields that need to be queried unencrypted while storing any sensitive data in encrypted fields. ","version":"Next","tagName":"h3"},{"title":"Best Practices for React Native Encryption​","type":1,"pageTitle":"React Native Encryption and Encrypted Database/Storage","url":"/articles/react-native-encryption.html#best-practices-for-react-native-encryption","content":" Secure Password Handling Avoid hardcoding passwords or encryption keys.Use secure storage solutions like React Native Keychain or react-native-encrypted-storage to fetch the database password at runtime: // Example: using react-native-keychain to securely retrieve a stored password import * as Keychain from 'react-native-keychain'; async function getDatabasePassword() { const credentials = await Keychain.getGenericPassword(); if (credentials) { return credentials.password; } throw new Error('No password stored in Keychain'); } Encrypt Attachments: If you need to store files (images, text files, etc.), consider encrypting attachments. RxDB supports attachments that can be encrypted automatically, ensuring your files are protected: import { createBlob } from 'rxdb/plugins/core'; const doc = await await db.secureData.findOne({ selector: { normalField: 'foobar' } }).exec(true); const attachment = await doc.putAttachment({ id: 'encryptedFile.txt', data: createBlob('Sensitive content', 'text/plain'), type: 'text/plain', }); Optimize Performance If performance is critical, consider using the premium Web Crypto plugin, which leverages native APIs for faster encryption and decryption.If big chunks of data are encrypted, store them in attachments instead of document fields. Attachments will only be decrypted on explicit fetches, not during queries. Use DevMode in Development: RxDB's DevMode Plugin can help validate your schema and encryption setup during development. Disable it in production for performance reasons. Secure Communication: Use HTTPS to secure network communication between the app and any backend services.If you're synchronizing data to a server, ensure the data is also encrypted in transit. RxDB's replication plugins can work with secure endpoints to keep data consistent. SSL Pinning: Consider SSL Pinning if you want to prevent man-in-the-middle attacks. SSL Pinning ensures the device trusts only the pinned certificate, preventing attackers from swapping out valid certificates with their own. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"React Native Encryption and Encrypted Database/Storage","url":"/articles/react-native-encryption.html#follow-up","content":" Learn how to use RxDB with the RxDB Quickstart for a guided introduction.A good way to learn using RxDB database with React Native is to check out the RxDB React Native example and use that as a tutorial.Check out the RxDB GitHub repository and leave a star ⭐ if you find it useful.Learn more about the RxDB encryption plugins. By following these best practices and leveraging RxDB's powerful encryption plugins, you can build secure, performant, and robust React Native applications that keep your users' data safe. ","version":"Next","tagName":"h2"},{"title":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","type":0,"sectionRef":"#","url":"/articles/reactjs-storage.html","content":"","keywords":"","version":"Next"},{"title":"Part 1: Storing Data in ReactJS with LocalStorage​","type":1,"pageTitle":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","url":"/articles/reactjs-storage.html#part-1-storing-data-in-reactjs-with-localstorage","content":" localStorage is a built-in browser API for storing key-value pairs in the user’s browser. It’s straightforward to set and get items—ideal for trivial preferences or small usage data. import React, { useState, useEffect } from 'react'; function LocalStorageExample() { const [username, setUsername] = useState(() => { const saved = localStorage.getItem('username'); return saved ? JSON.parse(saved) : ''; }); useEffect(() => { localStorage.setItem('username', JSON.stringify(username)); }, [username]); return ( <div> <h2>ReactJS LocalStorage Demo</h2> <input type="text" value={username} onChange={e => setUsername(e.target.value)} placeholder="Enter your username" /> <p>Stored: {username}</p> </div> ); } export default LocalStorageExample; Pros of localStorage in ReactJS: Easy to implement quickly for minimal dataBuilt-in to the browser—no extra libsPersistent across sessions Downsides of localStorageWhile localStorage is convenient for small amounts of data, it has certain limitations: Synchronous: Reading or writing localStorage can block the main thread if data is large.No advanced queries: You only store stringified objects by a single key. Searching or filtering requires manually scanning everything.No concurrency or offline logic: If multiple tabs or users need to manipulate the same data, localStorage doesn’t handle concurrency or sync with a server.No indexing: You can’t perform partial lookups or advanced matching. For “remember user preference” use cases, localStorage is excellent. But if your app grows complex—needing structured data, large data sets, or offline-first features—you might quickly surpass localStorage’s utility. ","version":"Next","tagName":"h2"},{"title":"Part 2: LocalStorage vs. IndexedDB​","type":1,"pageTitle":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","url":"/articles/reactjs-storage.html#part-2-localstorage-vs-indexeddb","content":" While localStorage is simple, it’s limited to string-based key-value lookups and can be synchronous for all reads/writes. For more robust ReactJS storage needs, browsers also provide IndexedDB—a low-level, asynchronous API that can store larger amounts of JSON data with indexing. LocalStorage: Good for small amounts of data (like user settings or flags)String-only storageSingle key-value access, no searching by subfields IndexedDB: Stores large JSON objects, able to index by multiple fieldsAsynchronous and usually more scalableMore complicated to use directly (i.e., not as simple as .getItem())RxDB, as you’ll see, simplifies IndexedDB usage in ReactJS by adding a more intuitive layer for queries, reactivity, and advanced capabilities like encryption. ","version":"Next","tagName":"h2"},{"title":"Part 3: Moving Beyond Basic Storage: RxDB for ReactJS​","type":1,"pageTitle":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","url":"/articles/reactjs-storage.html#part-3-moving-beyond-basic-storage-rxdb-for-reactjs","content":" When data shapes get complex—large sets of nested documents, or you want offline sync to a server—RxDB can transform your approach to ReactJS storage. It stores documents in (usually) IndexedDB or alternative backends but offers a reactive, NoSQL-based interface. ","version":"Next","tagName":"h2"},{"title":"RxDB Quick Example (Observables)​","type":1,"pageTitle":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","url":"/articles/reactjs-storage.html#rxdb-quick-example-observables","content":" import { createRxDatabase } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; (async function setUpRxDB() { const db = await createRxDatabase({ name: 'heroDB', storage: getRxStorageLocalstorage(), multiInstance: false }); const heroSchema = { title: 'hero schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string' }, name: { type: 'string' }, power: { type: 'string' } }, required: ['id', 'name'] }; await db.addCollections({ heroes: { schema: heroSchema } }); // Insert a doc await db.heroes.insert({ id: '1', name: 'AlphaHero', power: 'Lightning' }); // Query docs once const allHeroes = await db.heroes.find().exec(); console.log('Heroes: ', allHeroes); })(); Reactive Queries: In a React component, you can subscribe to a query via RxDB’s $ property, letting your UI automatically update when data changes. React components can subscribe to updates from .find() queries, letting the UI automatically reflect changes—perfect for dynamic offline-first apps. import React, { useEffect, useState } from 'react'; function HeroList({ collection }) { const [heroes, setHeroes] = useState([]); useEffect(() => { const query = collection.find(); // query.$ is an RxJS Observable that emits whenever data changes const sub = query.$.subscribe(newHeroes => { setHeroes(newHeroes); }); return () => sub.unsubscribe(); // clean up subscription }, [collection]); return ( <ul> {heroes.map(hero => ( <li key={hero.id}> {hero.name} - Power: {hero.power} </li> ))} </ul> ); } export default HeroList; By using these reactive queries, your React app knows exactly when data changes locally (or from another browser tab) or from remote sync, keeping your UI in sync effortlessly. ","version":"Next","tagName":"h3"},{"title":"Part 4: Using Preact Signals Instead of Observables​","type":1,"pageTitle":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","url":"/articles/reactjs-storage.html#part-4-using-preact-signals-instead-of-observables","content":" RxDB typically exposes reactivity via RxJS observables. However, some developers prefer newer reactivity approaches like Preact Signals. RxDB supports them via a special plugin or advanced usage: import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; import { PreactSignalsRxReactivityFactory } from 'rxdb/plugins/reactivity-preact-signals'; (async function setUpRxDBWithSignals() { const db = await createRxDatabase({ name: 'heroDB_signals', storage: getRxStorageLocalstorage(), reactivity: PreactSignalsRxReactivityFactory }); // Create a signal-based query instead of using Observables: const collection = db.heroes; const heroesSignal = collection.find().$$; // signals version // Now you can reference heroesSignal() in Preact or React with adapter usage })(); Preact Signals rely on signals instead of Observables. Some developers find them more straightforward to adopt, especially for fine-grained reactivity. In ReactJS, you might still prefer RxJS-based subscriptions unless you add bridging code for signals. ","version":"Next","tagName":"h2"},{"title":"Part 5: Encrypting the Storage with RxDB​","type":1,"pageTitle":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","url":"/articles/reactjs-storage.html#part-5-encrypting-the-storage-with-rxdb","content":" For more advanced ReactJS storage needs—especially when sensitive user data is involved - you might want to encrypt stored documents at rest. RxDB provides a robust encryption plugin: import { createRxDatabase } from 'rxdb'; import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; (async function secureSetup() { const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ storage: getRxStorageLocalstorage() }); // Provide a password for encryption const db = await createRxDatabase({ name: 'secureReactStorage', storage: encryptedStorage, password: 'MyStrongPassword123' }); await db.addCollections({ secrets: { schema: { title: 'secret schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string' }, secretInfo: { type: 'string' } }, required: ['id'], encrypted: ['secretInfo'] // field to encrypt } } }); })(); All data in the marked encrypted fields is automatically encrypted at rest. This is crucial if you store user credentials, private messages, or other personal data in your ReactJS application storage. ","version":"Next","tagName":"h2"},{"title":"Offline Sync​","type":1,"pageTitle":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","url":"/articles/reactjs-storage.html#offline-sync","content":" If you need multi-device or multi-user data synchronization, RxDB provides replication plugins for various endpoints (HTTP, GraphQL, CouchDB, Firestore, etc.). Your local offline changes can then merge automatically with a remote database whenever internet connectivity is restored. ","version":"Next","tagName":"h2"},{"title":"Overview: localStorage vs IndexedDB vs RxDB​","type":1,"pageTitle":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","url":"/articles/reactjs-storage.html#overview-localstorage-vs-indexeddb-vs-rxdb","content":" Characteristic\tlocalStorage\tIndexedDB\tRxDBData Model\tKey-value store (only strings)\tLow-level, JSON-like storage engine with object stores and indexes\tNoSQL JSON documents with optional JSON-Schema Query Capabilities\tBasic get/set by key; manual parse for more complex searches\tIndex-based queries, but API is fairly verbose; lacks a high-level query language\tJSON-based queries, optional indexes, real-time reactivity Observability\tNone. Must re-fetch data yourself.\tNone natively. Must implement eventing or manual re-check.\tBuilt-in reactivity. UI auto-updates via Observables or Preact signals Large Data Usage\tNot recommended for large data (blocking, synchronous calls)\tBetter for large amounts of data, asynchronous reads/writes\tScales for medium to large data. Uses IndexedDB or other storages under the hood Concurrency\tMinimal. Overwrites if multiple tabs write simultaneously\tMultiple tabs can open the same DB, but must handle concurrency logic carefully\tMulti-instance concurrency with built-in conflict resolution plugins if needed Offline Sync\tNone. Purely local.\tNone out of the box. Must be implemented manually\tBuilt-in replication to remote endpoints (HTTP, GraphQL, CouchDB, etc.) for offline-first usage Encryption\tNot supported natively\tNot supported natively; must encrypt data manually before storing\tEncryption plugins available. Supports field-level encryption at rest Usage\tGreat for small flags or settings ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"ReactJS Storage – From Basic LocalStorage to Advanced Offline Apps with RxDB","url":"/articles/reactjs-storage.html#follow-up","content":" If you’re looking to dive deeper into ReactJS storage topics and take full advantage of RxDB’s offline-first, real-time capabilities, here are some recommended resources: RxDB Official Documentation Explore detailed guides on setting up storage adapters, defining JSON schemas, handling conflicts, and enabling offline synchronization. RxDB Quickstart Get a step-by-step tutorial to create your first RxDB-based application in minutes. RxDB GitHub Repository See the source code, open issues, and browse community-driven examples that integrate ReactJS, Preact Signals, and advanced features like encryption. RxDB Encryption Plugins Learn how to encrypt fields in your collections, protecting user data and meeting compliance requirements. Preact Signals React Integration (Example) If you want to combine React with signals-based reactivity, check out example code and bridging approaches. MDN: Using the Web Storage API Refresh on localStorage basics, including best practices for small key-value data in traditional React apps. With these follow-up steps, you can refine your reactjs storage strategy to meet your app’s unique needs, whether it’s simple user preferences or robust offline data syncing. ","version":"Next","tagName":"h2"},{"title":"What is a realtime database?","type":0,"sectionRef":"#","url":"/articles/realtime-database.html","content":"","keywords":"","version":"Next"},{"title":"Realtime as in realtime computing​","type":1,"pageTitle":"What is a realtime database?","url":"/articles/realtime-database.html#realtime-as-in-realtime-computing","content":" When "normal" developers hear the word "realtime", they think of Real-time computing (RTC). Real-time computing is a type of computer processing that guarantees specific response times for tasks or events, crucial in applications like industrial control, automotive systems, and aerospace. It relies on specialized operating systems (RTOS) to ensure predictability and low latency. Hard real-time systems must never miss deadlines, while soft real-time systems can tolerate occasional delays. Real-time responses are often understood to be in the order of milliseconds, and sometimes microseconds. Consider the role of real-time computing in car airbags: sensors detect collision force, swiftly process the data, and immediately decide to deploy the airbags within milliseconds. Such rapid action is imperative for safeguarding passengers. Hence, the controlling chip must guarantee a certain response time - it must operate in "realtime". But when people talk about realtime databases, especially in the web-development world, they almost never mean realtime, as in realtime computing, they mean something else. In fact, with any programming language that run on end users devices, it is not even possible to built a "real" realtime database. A program, like a JavaScript (browser or Node.js) process, can be halted by the operating systems task manager at any time and therefore it will never be able to guarantee specific response times. To build a realtime computing database, you would need a realtime capable operating system. ","version":"Next","tagName":"h2"},{"title":"Real time Database as in realtime replication​","type":1,"pageTitle":"What is a realtime database?","url":"/articles/realtime-database.html#real-time-database-as-in-realtime-replication","content":" When talking about realtime databases, most people refer to realtime, as in realtime replication. Often they mean a very specific product which is the Firebase Realtime Database (not the Firestore). In the context of the Firebase Realtime Database, "realtime" means that data changes are synchronized and delivered to all connected clients or devices as soon as they occur, typically within milliseconds. This means that when any client updates, adds, or removes data in the database, all other clients that are connected to the same database instance receive those updates instantly, without the need for manual polling or frequent HTTP requests. In short, when replicating data between databases, instead of polling, we use a websocket connection to live-stream all changes between the server and the clients, this is labeled as "realtime database". A similar thing can be done with RxDB and the RxDB Replication Plugins. ","version":"Next","tagName":"h2"},{"title":"Realtime as in realtime applications​","type":1,"pageTitle":"What is a realtime database?","url":"/articles/realtime-database.html#realtime-as-in-realtime-applications","content":" In the context of realtime client-side applications, "realtime" refers to the immediate or near-instantaneous processing and response to events or data inputs. When data changes, the application must directly update to reflect the new data state, without any user interaction or delay. Notice that the change to the data could have come from any source, like a user action, an operation in another browser tab, or even an operation from another device that has been replicated to the client. In contrast to push-pull based databases (e.g., MySQL or MongoDB servers), a realtime database contains features which make it easy to build realtime applications. For example with RxDB you can not only fetch query results once, but instead you can subscribe to a query and directly update the HTML dom tree whenever the query has a new result set: await db.heroes.find({ selector: { healthpoints: { $gt: 0 } } }) .$ // The $ returns an observable that emits whenever the query's result set changes. .subscribe(aliveHeroes => { // Refresh the HTML list each time there are new query results. const newContent = aliveHeroes.map(doc => '<li>' + doc.name + '</li>'); document.getElementById('#myList').innerHTML = newContent; }); // You can even subscribe to any RxDB document's fields. myDocument.firstName$.subscribe(newName => console.log('name is: ' + newName)); A competent realtime application is engineered to offer feedback or results swiftly, ideally within milliseconds to microseconds. Ideally, a data modification should be processed in under 16 milliseconds (since 1 second divided by 60 frames equals 16.66ms) to ensure users don't perceive any lag from input to visualization. RxDB utilizes the EventReduce algorithm to manage changes more swiftly than 16ms. However, it can never assure fixed response times as a "realtime computing database" would. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"What is a realtime database?","url":"/articles/realtime-database.html#follow-up","content":" Dive into the RxDB QuickstartDiscover more about the RxDB realtime Sync EngineJoin the conversation at RxDB Chat ","version":"Next","tagName":"h2"},{"title":"RxDB as a Database in a Vue Application","type":0,"sectionRef":"#","url":"/articles/vue-database.html","content":"","keywords":"","version":"Next"},{"title":"Why Vue Applications Need a Database​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#why-vue-applications-need-a-database","content":" Vue is renowned for its lightweight core and flexible architecture centered around reactive state management and reusable components. However, modern Vue applications often require: Offline Capabilities: Allowing users to continue working even without internet access.Real-Time Updates: Keeping UI data in sync with changes as they occur, whether locally or from other connected clients.Improved Performance: Reducing server round trips and leveraging local storage for faster data operations.Scalable Data Handling: Managing increasingly large datasets or complex queries right in the browser. While you can store data in Vuex/Pinia stores or via direct AJAX calls, these solutions may not suffice when your application demands a full-featured offline-first database or complex synchronization with a server. RxDB addresses these needs with a dedicated, reactive, browser-based database that pairs seamlessly with Vue's reactivity system. ","version":"Next","tagName":"h2"},{"title":"Introducing RxDB as a Database Solution​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#introducing-rxdb-as-a-database-solution","content":" RxDB - short for Reactive Database - is built on the principle of combining NoSQL database capabilities with reactive programming. It runs inside your client-side environment (browser, Node.js, or mobile devices) and provides: Real-Time Reactivity: Automatically updates subscribed components whenever data changes.Offline-First Approach: Stores data locally and syncs with the server when online connectivity is restored.Data Replication: Effortlessly keeps data synchronized across multiple tabs, devices, or server instances.Multi-Tab Support: Seamlessly propagates changes to all open tabs in the user's browser.Observable Queries: Automatically refresh the result set when documents in your queried collection change. ","version":"Next","tagName":"h2"},{"title":"RxDB vs. Other Vue Database Options​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#rxdb-vs-other-vue-database-options","content":" Compared to traditional approaches - like raw IndexedDB or local storage - RxDB adds a powerful, reactive layer that simplifies your data flow. While tools like Vuex or Pinia are great for state management, they are not fully fledged databases with features like replication, conflict resolution, and offline persistence. RxDB bridges the gap by providing an integrated data handling solution tailor-made for modern, data-intensive Vue applications. ","version":"Next","tagName":"h3"},{"title":"Getting Started with RxDB​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#getting-started-with-rxdb","content":" Let's break down the essentials for using RxDB within a Vue application. ","version":"Next","tagName":"h2"},{"title":"Installation​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#installation","content":" You can install RxDB (and RxJS, which it depends on) via npm or yarn: npm install rxdb rxjs ","version":"Next","tagName":"h3"},{"title":"Creating and Configuring Your Database​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#creating-and-configuring-your-database","content":" Within your Vue project, you can set up an RxDB instance in a dedicated file or a Vue plugin. Below is an example using Localstorage as the storage engine: // db.js import { createRxDatabase } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; export async function initDatabase() { const db = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage(), password: 'myPassword', // optional encryption password multiInstance: true, // multi-tab support eventReduce: true // optimize event handling }); await db.addCollections({ hero: { schema: { title: 'hero schema', version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string' }, name: { type: 'string' }, healthpoints: { type: 'number' } } } } }); return db; } After creating the RxDB instance, you can share it across your application (for example, by providing it in a plugin or a global property in Vue). ","version":"Next","tagName":"h2"},{"title":"Vue Reactivity and RxDB Observables​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#vue-reactivity-and-rxdb-observables","content":" RxDB queries return RxJS observables (.$). Vue can automatically update components when data changes if you manually subscribe and store results in Vue refs/reactive objects, or if you use RxDB's custom reactivity for Vue. Example with Vue 3 Composition API: // HeroList.vue <script setup> import { ref, onMounted } from 'vue'; import { initDatabase } from '@/db'; const heroes = ref([]); let db; onMounted(async () => { db = await initDatabase(); // Subscribe to an RxDB query db.hero .find({ selector: { healthpoints: { $gt: 0 } }, sort: [{ name: 'asc' }] }) .$ // the dot-$ is an observable that emits whenever the query results change .subscribe((newHeroes) => { heroes.value = newHeroes; }); }); </script> <template> <ul> <li v-for="hero in heroes" :key="hero.id"> {{ hero.name }} - HP: {{ hero.healthpoints }} </li> </ul> </template> ","version":"Next","tagName":"h2"},{"title":"Different RxStorage Layers for RxDB​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#different-rxstorage-layers-for-rxdb","content":" RxDB supports multiple storage backends - called "RxStorage layers" - giving you flexibility in how data is persisted: LocalStorage RxStorage: Uses the browsers localstorage API.IndexedDB RxStorage: Direct usage of native IndexedDB.OPFS RxStorage: Uses the File System Access API for even faster storage in modern browsers.Memory RxStorage: Stores data in memory, ideal for tests or ephemeral data.SQLite RxStorage: Runs SQLite, which can be compiled to WebAssembly for the browser. While possible, it typically carries a larger bundle size compared to native browser APIs like IndexedDB or OPFS. Choose the storage option that best aligns with your Vue application's requirements for performance, persistence, and platform compatibility. ","version":"Next","tagName":"h2"},{"title":"Synchronizing Data with RxDB between Clients and Servers​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#synchronizing-data-with-rxdb-between-clients-and-servers","content":" RxDB champions an offline-first approach: data is kept locally so that your Vue app remains usable, even without internet. When connectivity is restored, RxDB ensures your local changes synchronize to the server, resolving conflicts as necessary. Real-Time Synchronization: With RxDB's replication plugins, any local change can be instantly pushed to a remote endpoint while pulling down remote changes to ensure consistency.Conflict Resolution: In multi-user scenarios, conflicts may arise if two clients update the same document simultaneously. RxDB provides hooks to handle and resolve these gracefully.Scalable Architecture: By reducing reliance on continuous server requests, you can lighten server load and deliver a more responsive user experience. ","version":"Next","tagName":"h2"},{"title":"Advanced RxDB Features and Techniques​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#advanced-rxdb-features-and-techniques","content":" ","version":"Next","tagName":"h2"},{"title":"Offline-First Approach​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#offline-first-approach","content":" Vue applications can seamlessly function offline by leveraging RxDB's local database storage. The moment the network is restored, all unsynced data is pushed to the server. This capability is particularly beneficial for Progressive Web Apps (PWAs) and scenarios with spotty connectivity. ","version":"Next","tagName":"h3"},{"title":"Observable Queries and Change Streams​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#observable-queries-and-change-streams","content":" Beyond simply returning data, RxDB queries emit observables that respond to any change in the underlying documents. This real-time approach can drastically simplify state management, since updates flow directly into your Vue components without additional manual wiring. ","version":"Next","tagName":"h3"},{"title":"Encryption of Local Data​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#encryption-of-local-data","content":" For applications handling sensitive information, RxDB supports encryption of local data. Your data is stored securely in the browser, protecting it from unauthorized access. ","version":"Next","tagName":"h3"},{"title":"Indexing and Performance Optimization​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#indexing-and-performance-optimization","content":" By defining indexes on frequently searched fields, you can speed up queries and reduce overall resource usage. This is crucial for larger datasets where performance might otherwise degrade. ","version":"Next","tagName":"h3"},{"title":"JSON Key Compression​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#json-key-compression","content":" This optimization shortens field names in stored JSON documents, thereby reducing storage space and potentially improving performance for read/write operations. ","version":"Next","tagName":"h3"},{"title":"Multi-Tab Support​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#multi-tab-support","content":" If your users open multiple tabs of your Vue application, RxDB ensures data is synchronized across all instances in real time. Changes made in one tab are immediately reflected in others, creating a unified user experience. ","version":"Next","tagName":"h3"},{"title":"Best Practices for Using RxDB in Vue​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#best-practices-for-using-rxdb-in-vue","content":" Here are some recommendations to get the most out of RxDB in your Vue projects: Centralize Database Creation: Initialize and configure RxDB in a dedicated file or plugin, ensuring only one database instance is created.Leverage Vue's Composition API or a Global Store: Use watchers, refs, or a store like Pinia to neatly manage data subscriptions and updates, preventing scattered subscription logic.Async Subscriptions: Prefer using Vue's lifecycle hooks and the Composition API to manage subscriptions. Clean up subscriptions when components unmount or no longer need the data.Optimize Queries and Indexes: Only query the data you need, and define indexes to speed up lookups.Test Offline Scenarios: Make sure your offline logic works as expected by simulating network disconnections and reconnections.Plan Conflict Resolution: For multi-user apps, decide how to merge concurrent changes to prevent data inconsistencies. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"RxDB as a Database in a Vue Application","url":"/articles/vue-database.html#follow-up","content":" To explore more about RxDB and leverage its capabilities for browser database development, check out the following resources: RxDB GitHub Repository: Visit the official GitHub repository of RxDB to access the source code, documentation, and community support.RxDB Quickstart: Get started quickly with RxDB by following the provided quickstart guide, which offers step-by-step instructions for setting up and using RxDB in your projects.RxDB Reactivity for Vue: Discover how RxDB observables can directly produce Vue refs, simplifying integration with your Vue components.RxDB Vue Example at GitHub: Explore an official Vue example to see RxDB in action within a Vue application.RxDB Examples: Browse even more official examples to learn best practices you can apply to your own projects. ","version":"Next","tagName":"h2"},{"title":"IndexedDB Database in Vue Apps - The Power of RxDB","type":0,"sectionRef":"#","url":"/articles/vue-indexeddb.html","content":"","keywords":"","version":"Next"},{"title":"What is IndexedDB?​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#what-is-indexeddb","content":" IndexedDB is a low-level API for storing significant amounts of structured data in the browser. It provides a transactional database system that can store key-value pairs, complex objects, and more. This storage engine is asynchronous and supports advanced data types, making it suitable for offline storage and complex web applications. ","version":"Next","tagName":"h2"},{"title":"Why Use IndexedDB in Vue​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#why-use-indexeddb-in-vue","content":" When building Vue applications, IndexedDB can play a crucial role in enhancing both performance and user experience. Here are some reasons to consider using IndexedDB: Offline-First / Local-First: By storing data locally, your application remains functional even without an internet connection.Performance: Using local data means zero latency and no loading spinners, as data doesn't need to be fetched over a network.Easier Implementation: Replicating all data to the client once is often simpler than implementing multiple endpoints for each user interaction.Scalability: Local data reduces server load because queries run on the client side, decreasing server bandwidth and processing requirements. ","version":"Next","tagName":"h2"},{"title":"Why To Not Use Plain IndexedDB​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#why-to-not-use-plain-indexeddb","content":" While IndexedDB itself is powerful, its native API comes with several drawbacks for everyday application developers: Callback-Based API: IndexedDB was originally designed around callbacks rather than modern Promises, making asynchronous code more cumbersome.Complexity: IndexedDB is low-level, intended for library developers rather than for app developers who just want to store and query data easily.Basic Query API: Its rudimentary query capabilities limit how you can efficiently perform complex queries. Libraries like RxDB offer more advanced querying and indexing.TypeScript Support: Ensuring good TypeScript support with IndexedDB is challenging, especially when trying to maintain schema consistency.Lack of Observable API: IndexedDB doesn't provide an observable API out of the box, making it hard to automatically update your Vue app in real time. RxDB solves this by enabling you to observe queries or specific documents.Cross-Tab Communication: Managing cross-tab updates in plain IndexedDB is difficult. RxDB handles this seamlessly - changes in one tab automatically affect observed data in others.Missing Advanced Features: Features like encryption or compression aren't built into IndexedDB, but they are available via RxDB.Limited Platform Support: IndexedDB is browser-only. RxDB offers swappable storages so you can reuse the same data layer code in mobile or desktop environments. ","version":"Next","tagName":"h2"},{"title":"Set up RxDB in Vue​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#set-up-rxdb-in-vue","content":" Setting up RxDB with Vue is straightforward. It abstracts IndexedDB complexities and adds a layer of powerful features over it. ","version":"Next","tagName":"h2"},{"title":"Installing RxDB​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#installing-rxdb","content":" First, install RxDB (and RxJS) from npm: npm install rxdb rxjs --save ","version":"Next","tagName":"h3"},{"title":"Create a Database and Collections​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#create-a-database-and-collections","content":" RxDB provides two main storage options: The free LocalStorage-based storageThe premium plain IndexedDB-based storage, offering faster performance Below is an example of setting up a simple RxDB database using the localstorage-based storage in a Vue app: // db.ts import { createRxDatabase } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; export async function initDB() { const db = await createRxDatabase({ name: 'heroesdb', // the name of the database storage: getRxStorageLocalstorage() }); // Define your schema const heroSchema = { title: 'hero schema', version: 0, description: 'Describes a hero in your app', primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 }, name: { type: 'string' }, power: { type: 'string' } }, required: ['id', 'name'] }; // add collections await db.addCollections({ heroes: { schema: heroSchema } }); return db; } ","version":"Next","tagName":"h3"},{"title":"CRUD Operations​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#crud-operations","content":" Once your database is initialized, you can perform all CRUD operations: // insert await db.heroes.insert({ id: '1', name: 'Iron Man', power: 'Genius-level intellect' }); // bulk insert await db.heroes.bulkInsert([ { id: '2', name: 'Thor', power: 'God of Thunder' }, { id: '3', name: 'Hulk', power: 'Superhuman Strength' } ]); // find and findOne const heroes = await db.heroes.find().exec(); const ironMan = await db.heroes.findOne({ selector: { name: 'Iron Man' } }).exec(); // update const doc = await db.heroes.findOne({ selector: { name: 'Hulk' } }).exec(); await doc.update({ $set: { power: 'Unlimited Strength' } }); // delete const thorDoc = await db.heroes.findOne({ selector: { name: 'Thor' } }).exec(); await thorDoc.remove(); ","version":"Next","tagName":"h3"},{"title":"Reactive Queries and Live Updates​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#reactive-queries-and-live-updates","content":" RxDB excels in providing reactive data capabilities, ideal for real-time applications. Subscribing to queries automatically updates your Vue components when underlying data changes - even across browser tabs. ","version":"Next","tagName":"h2"},{"title":"Using RxJS Observables with Vue 3 Composition API​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#using-rxjs-observables-with-vue-3-composition-api","content":" Here's an example of a Vue component that subscribes to live data updates: <template> <div> <h2>Hero List</h2> <ul> <li v-for="hero in heroes" :key="hero.id"> <strong>{{ hero.name }}</strong> - {{ hero.power }} </li> </ul> </div> </template> <script setup lang="ts"> import { ref, onMounted } from 'vue'; import { initDB } from '@/db'; const heroes = ref<any[]>([]); onMounted(async () => { const db = await initDB(); // create an observable query const query = db.heroes.find(); // subscribe to the query query.$.subscribe((newHeroes: any[]) => { heroes.value = newHeroes; }); }); </script> This component subscribes to the collection's changes, updating the UI automatically whenever the underlying data changes in any browser tab. ","version":"Next","tagName":"h3"},{"title":"Using Vue Signals​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#using-vue-signals","content":" If you're exploring Vue's reactivity transforms or signals, RxDB also offers custom reactivity factories (premium plugins are required). This allows queries to emit data as signals instead of traditional Observables. const heroesSignal = db.heroes.find().$$; // $$ indicates a reactive result With this, in your Vue template or script, you can directly read from heroesSignal() <template> <div> <h2>Hero List</h2> <ul> <!-- we read heroesSignal.value which is always up to date --> <li v-for="hero in heroesSignal.value" :key="hero.id"> <strong>{{ hero.name }}</strong> - {{ hero.power }} </li> </ul> </div> </template> ","version":"Next","tagName":"h3"},{"title":"Vue IndexedDB Example with RxDB​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#vue-indexeddb-example-with-rxdb","content":" A comprehensive example of using RxDB within a Vue application can be found in the RxDB GitHub repository. This repository contains sample applications, showcasing best practices and demonstrating how to integrate RxDB for various use cases. ","version":"Next","tagName":"h2"},{"title":"Advanced RxDB Features​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#advanced-rxdb-features","content":" RxDB offers many advanced features that extend beyond basic data storage: RxDB Replication: Synchronize local data with remote databases seamlessly. Data Migration: Handle schema changes gracefully with automatic data migrations. Encryption: Secure your data with built-in encryption capabilities. Compression: Optimize storage using key compression. ","version":"Next","tagName":"h2"},{"title":"Limitations of IndexedDB​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#limitations-of-indexeddb","content":" While IndexedDB is powerful, it has some inherent limitations: Performance: IndexedDB can be slow under certain conditions. Read more: Slow IndexedDBStorage Limits: Browsers impose limits on how much data can be stored. See: Browser storage limits. ","version":"Next","tagName":"h2"},{"title":"Alternatives to IndexedDB​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#alternatives-to-indexeddb","content":" Depending on your application's requirements, there are alternative storage solutions to consider: Origin Private File System (OPFS): A newer API that can offer better performance. RxDB supports OPFS as well. More info: RxDB OPFS StorageSQLite: Ideal for hybrid frameworks or Capacitor, offering native performance. Explore: RxDB SQLite Storage ","version":"Next","tagName":"h2"},{"title":"Performance Comparison with Other Browser Storages​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#performance-comparison-with-other-browser-storages","content":" Here is a performance overview of the various browser-based storage implementations of RxDB: ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"IndexedDB Database in Vue Apps - The Power of RxDB","url":"/articles/vue-indexeddb.html#follow-up","content":" Learn how to use RxDB with the RxDB Quickstart for a guided introduction.Check out the RxDB GitHub repository and leave a star ⭐ if you find it useful. By leveraging RxDB on top of IndexedDB, you can create highly responsive, offline-capable Vue applications without dealing with the low-level complexities of IndexedDB directly. With reactive queries, seamless cross-tab communication, and powerful advanced features, RxDB becomes an invaluable tool in modern web development. ","version":"Next","tagName":"h2"},{"title":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","type":0,"sectionRef":"#","url":"/articles/websockets-sse-polling-webrtc-webtransport.html","content":"","keywords":"","version":"Next"},{"title":"What is Long Polling?​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#what-is-long-polling","content":" Long polling was the first "hack" to enable a server-client messaging method that can be used in browsers over HTTP. The technique emulates server push communications with normal XHR requests. Unlike traditional polling, where the client repeatedly requests data from the server at regular intervals, long polling establishes a connection to the server that remains open until new data is available. Once the server has new information, it sends the response to the client, and the connection is closed. Immediately after receiving the server's response, the client initiates a new request, and the process repeats. This method allows for more immediate data updates and reduces unnecessary network traffic and server load. However, it can still introduce delays in communication and is less efficient than other real-time technologies like WebSockets. // long-polling in a JavaScript client function longPoll() { fetch('http://example.com/poll') .then(response => response.json()) .then(data => { console.log("Received data:", data); longPoll(); // Immediately establish a new long polling request }) .catch(error => { /** * Errors can appear in normal conditions when a * connection timeout is reached or when the client goes offline. * On errors we just restart the polling after some delay. */ setTimeout(longPoll, 10000); }); } longPoll(); // Initiate the long polling Implementing long-polling on the client side is pretty simple, as shown in the code above. However on the backend there can be multiple difficulties to ensure the client receives all events and does not miss out updates when the client is currently reconnecting. ","version":"Next","tagName":"h3"},{"title":"What are WebSockets?​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#what-are-websockets","content":" WebSockets provide a full-duplex communication channel over a single, long-lived connection between the client and server. This technology enables browsers and servers to exchange data without the overhead of HTTP request-response cycles, facilitating real-time data transfer for applications like live chat, gaming, or financial trading platforms. WebSockets represent a significant advancement over traditional HTTP by allowing both parties to send data independently once the connection is established, making it ideal for scenarios that require low latency and high-frequency updates. // WebSocket in a JavaScript client const socket = new WebSocket('ws://example.com'); socket.onopen = function(event) { console.log('Connection established'); // Sending a message to the server socket.send('Hello Server!'); }; socket.onmessage = function(event) { console.log('Message from server:', event.data); }; While the basics of the WebSocket API are easy to use it has shown to be rather complex in production. A socket can loose connection and must be re-created accordingly. Especially detecting if a connection is still usable or not, can be very tricky. Mostly you would add a ping-and-pong heartbeat to ensure that the open connection is not closed. This complexity is why most people use a library on top of WebSockets like Socket.IO which handles all these cases and even provides fallbacks to long-polling if required. ","version":"Next","tagName":"h3"},{"title":"What are Server-Sent-Events?​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#what-are-server-sent-events","content":" Server-Sent Events (SSE) provide a standard way to push server updates to the client over HTTP. Unlike WebSockets, SSEs are designed exclusively for one-way communication from server to client, making them ideal for scenarios like live news feeds, sports scores, or any situation where the client needs to be updated in real time without sending data to the server. You can think of Server-Sent-Events as a single HTTP request where the backend does not send the whole body at once, but instead keeps the connection open and trickles the answer by sending a single line each time an event has to be send to the client. Creating a connection for receiving events with SSE is straightforward. On the client side in a browser, you initialize an EventSource instance with the URL of the server-side script that generates the events. Listening for messages involves attaching event handlers directly to the EventSource instance. The API distinguishes between generic message events and named events, allowing for more structured communication. Here's how you can set it up in JavaScript: // Connecting to the server-side event stream const evtSource = new EventSource("https://example.com/events"); // Handling generic message events evtSource.onmessage = event => { console.log('got message: ' + event.data); }; In difference to WebSockets, an EventSource will automatically reconnect on connection loss. On the server side, your script must set the Content-Type header to text/event-stream and format each message according to the SSE specification. This includes specifying event types, data payloads, and optional fields like event ID and retry timing. Here's how you can set up a simple SSE endpoint in a Node.js Express app: import express from 'express'; const app = express(); const PORT = process.env.PORT || 3000; app.get('/events', (req, res) => { res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', }); const sendEvent = (data) => { // all message lines must be prefixed with 'data: ' const formattedData = `data: ${JSON.stringify(data)}\\n\\n`; res.write(formattedData); }; // Send an event every 2 seconds const intervalId = setInterval(() => { const message = { time: new Date().toTimeString(), message: 'Hello from the server!', }; sendEvent(message); }, 2000); // Clean up when the connection is closed req.on('close', () => { clearInterval(intervalId); res.end(); }); }); app.listen(PORT, () => console.log(`Server running on http://localhost:${PORT}`)); ","version":"Next","tagName":"h3"},{"title":"What is the WebTransport API?​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#what-is-the-webtransport-api","content":" WebTransport is a cutting-edge API designed for efficient, low-latency communication between web clients and servers. It leverages the HTTP/3 QUIC protocol to enable a variety of data transfer capabilities, such as sending data over multiple streams, in both reliable and unreliable manners, and even allowing data to be sent out of order. This makes WebTransport a powerful tool for applications requiring high-performance networking, such as real-time gaming, live streaming, and collaborative platforms. However, it's important to note that WebTransport is currently a working draft and has not yet achieved widespread adoption. As of now (March 2024), WebTransport is in a Working Draft and not widely supported. You cannot yet use WebTransport in the Safari browser and there is also no native support in Node.js. This limits its usability across different platforms and environments. Even when WebTransport will become widely supported, its API is very complex to use and likely it would be something where people build libraries on top of WebTransport, not using it directly in an application's sourcecode. ","version":"Next","tagName":"h3"},{"title":"What is WebRTC?​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#what-is-webrtc","content":" WebRTC (Web Real-Time Communication) is an open-source project and API standard that enables real-time communication (RTC) capabilities directly within web browsers and mobile applications without the need for complex server infrastructure or the installation of additional plugins. It supports peer-to-peer connections for streaming audio, video, and data exchange between browsers. WebRTC is designed to work through NATs and firewalls, utilizing protocols like ICE, STUN, and TURN to establish a connection between peers. While WebRTC is made to be used for client-client interactions, it could also be leveraged for server-client communication where the server just simulated being also a client. This approach only makes sense for niche use cases which is why in the following WebRTC will be ignored as an option. The problem is that for WebRTC to work, you need a signaling-server anyway which would then again run over websockets, SSE or WebTransport. This defeats the purpose of using WebRTC as a replacement for these technologies. ","version":"Next","tagName":"h3"},{"title":"Limitations of the technologies​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#limitations-of-the-technologies","content":" ","version":"Next","tagName":"h2"},{"title":"Sending Data in both directions​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#sending-data-in-both-directions","content":" Only WebSockets and WebTransport allow to send data in both directions so that you can receive server-data and send client-data over the same connection. While it would also be possible with Long-Polling in theory, it is not recommended because sending "new" data to an existing long-polling connection would require to do an additional http-request anyway. So instead of doing that you can send data directly from the client to the server with an additional http-request without interrupting the long-polling connection. Server-Sent-Events do not support sending any additional data to the server. You can only do the initial request, and even there you cannot send POST-like data in the http-body by default with the native EventSource API. Instead you have to put all data inside of the url parameters which is considered a bad practice for security because credentials might leak into server logs, proxies and caches. To fix this problem, RxDB for example uses the eventsource polyfill instead of the native EventSource API. This library adds additional functionality like sending custom http headers. Also there is this library from microsoft which allows to send body data and use POST requests instead of GET. ","version":"Next","tagName":"h3"},{"title":"6-Requests per Domain Limit​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#6-requests-per-domain-limit","content":" Most modern browsers allow six connections per domain () which limits the usability of all steady server-to-client messaging methods. The limitation of six connections is even shared across browser tabs so when you open the same page in multiple tabs, they would have to shared the six-connection-pool with each other. This limitation is part of the HTTP/1.1-RFC (which even defines a lower number of only two connections). Quote From RFC 2616 - Section 8.1.4: "Clients that use persistent connections SHOULD limit the number of simultaneous connections that they maintain to a given server. A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy. A proxy SHOULD use up to 2*N connections to another server or proxy, where N is the number of simultaneously active users. These guidelines are intended to improve HTTP response times and avoid congestion." While that policy makes sense to prevent website owners from using their visitors to D-DOS other websites, it can be a big problem when multiple connections are required to handle server-client communication for legitimate use cases. To workaround the limitation you have to use HTTP/2 or HTTP/3 with which the browser will only open a single connection per domain and then use multiplexing to run all data through a single connection. While this gives you a virtually infinity amount of parallel connections, there is a SETTINGS_MAX_CONCURRENT_STREAMS setting which limits the actually connections amount. The default is 100 concurrent streams for most configurations. In theory the connection limit could also be increased by the browser, at least for specific APIs like EventSource, but the issues have been marked as "won't fix" by chromium and firefox. Lower the amount of connections in Browser Apps When you build a browser application, you have to assume that your users will use the app not only once, but in multiple browser tabs in parallel. By default you likely will open one server-stream-connection per tab which is often not necessary at all. Instead you open only a single connection and shared it between tabs, no matter how many tabs are open. RxDB does that with the LeaderElection from the broadcast-channel npm package to only have one stream of replication between server and clients. You can use that package standalone (without RxDB) for any type of application. ","version":"Next","tagName":"h3"},{"title":"Connections are not kept open on mobile apps​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#connections-are-not-kept-open-on-mobile-apps","content":" In the context of mobile applications running on operating systems like Android and iOS, maintaining open connections, such as those used for WebSockets and the others, poses a significant challenge. Mobile operating systems are designed to automatically move applications into the background after a certain period of inactivity, effectively closing any open connections. This behavior is a part of the operating system's resource management strategy to conserve battery and optimize performance. As a result, developers often rely on mobile push notifications as an efficient and reliable method to send data from servers to clients. Push notifications allow servers to alert the application of new data, prompting an action or update, without the need for a persistent open connection. ","version":"Next","tagName":"h3"},{"title":"Proxies and Firewalls​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#proxies-and-firewalls","content":" From consulting many RxDB users, it was shown that in enterprise environments (aka "at work") it is often hard to implement a WebSocket server into the infrastructure because many proxies and firewalls block non-HTTP connections. Therefore using the Server-Sent-Events provides and easier way of enterprise integration. Also long-polling uses only plain HTTP-requests and might be an option. ","version":"Next","tagName":"h3"},{"title":"Performance Comparison​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#performance-comparison","content":" Comparing the performance of WebSockets, Server-Sent Events (SSE), Long-Polling and WebTransport directly involves evaluating key aspects such as latency, throughput, server load, and scalability under various conditions. First lets look at the raw numbers. A good performance comparison can be found in this repo which tests the messages times in a Go Lang server implementation. Here we can see that the performance of WebSockets, WebRTC and WebTransport are comparable: note Remember that WebTransport is a pretty new technology based on the also new HTTP/3 protocol. In the future (after March 2024) there might be more performance optimizations. Also WebTransport is optimized to use less power which metric is not tested. Lets also compare the Latency, the throughput and the scalability: ","version":"Next","tagName":"h2"},{"title":"Latency​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#latency","content":" WebSockets: Offers the lowest latency due to its full-duplex communication over a single, persistent connection. Ideal for real-time applications where immediate data exchange is critical.Server-Sent Events: Also provides low latency for server-to-client communication but cannot natively send messages back to the server without additional HTTP requests.Long-Polling: Incurs higher latency as it relies on establishing new HTTP connections for each data transmission, making it less efficient for real-time updates. Also it can occur that the server wants to send an event when the client is still in the process of opening a new connection. In these cases the latency would be significantly larger.WebTransport: Promises to offer low latency similar to WebSockets, with the added benefits of leveraging the HTTP/3 protocol for more efficient multiplexing and congestion control. ","version":"Next","tagName":"h3"},{"title":"Throughput​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#throughput","content":" WebSockets: Capable of high throughput due to its persistent connection, but throughput can suffer from backpressure where the client cannot process data as fast as the server is capable of sending it.Server-Sent Events: Efficient for broadcasting messages to many clients with less overhead than WebSockets, leading to potentially higher throughput for unidirectional server-to-client communication.Long-Polling: Generally offers lower throughput due to the overhead of frequently opening and closing connections, which consumes more server resources.WebTransport: Expected to support high throughput for both unidirectional and bidirectional streams within a single connection, outperforming WebSockets in scenarios requiring multiple streams. ","version":"Next","tagName":"h3"},{"title":"Scalability and Server Load​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#scalability-and-server-load","content":" WebSockets: Maintaining a large number of WebSocket connections can significantly increase server load, potentially affecting scalability for applications with many users.Server-Sent Events: More scalable for scenarios that primarily require updates from server to client, as it uses less connection overhead than WebSockets because it uses "normal" HTTP request without things like protocol updates that have to be run with WebSockets.Long-Polling: The least scalable due to the high server load generated by frequent connection establishment, making it suitable only as a fallback mechanism.WebTransport: Designed to be highly scalable, benefiting from HTTP/3's efficiency in handling connections and streams, potentially reducing server load compared to WebSockets and SSE. ","version":"Next","tagName":"h3"},{"title":"Recommendations and Use-Case Suitability​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#recommendations-and-use-case-suitability","content":" In the landscape of server-client communication technologies, each has its distinct advantages and use case suitability. Server-Sent Events (SSE) emerge as the most straightforward option to implement, leveraging the same HTTP/S protocols as traditional web requests, thereby circumventing corporate firewall restrictions and other technical problems that can appear with other protocols. They are easily integrated into Node.js and other server frameworks, making them an ideal choice for applications requiring frequent server-to-client updates, such as news feeds, stock tickers, and live event streaming. On the other hand, WebSockets excel in scenarios demanding ongoing, two-way communication. Their ability to support continuous interaction makes them the prime choice for browser games, chat applications, and live sports updates. However, WebTransport, despite its potential, faces adoption challenges. It is not widely supported by server frameworks including Node.js and lacks compatibility with safari. Moreover, its reliance on HTTP/3 further limits its immediate applicability because many WebServers like nginx only have experimental HTTP/3 support. While promising for future applications with its support for both reliable and unreliable data transmission, WebTransport is not yet a viable option for most use cases. Long-Polling, once a common technique, is now largely outdated due to its inefficiency and the high overhead of repeatedly establishing new HTTP connections. Although it may serve as a fallback in environments lacking support for WebSockets or SSE, its use is generally discouraged due to significant performance limitations. ","version":"Next","tagName":"h2"},{"title":"Known Problems​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#known-problems","content":" For all of the realtime streaming technologies, there are known problems. When you build anything on top of them, keep these in mind. ","version":"Next","tagName":"h2"},{"title":"A client can miss out events when reconnecting​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#a-client-can-miss-out-events-when-reconnecting","content":" When a client is connecting, reconnecting or offline, it can miss out events that happened on the server but could not be streamed to the client. This missed out events are not relevant when the server is streaming the full content each time anyway, like on a live updating stock ticker. But when the backend is made to stream partial results, you have to account for missed out events. Fixing that on the backend scales pretty bad because the backend would have to remember for each client which events have been successfully send already. Instead this should be implemented with client side logic. The RxDB Sync Engine for example uses two modes of operation for that. One is the checkpoint iteration mode where normal http requests are used to iterate over backend data, until the client is in sync again. Then it can switch to event observation mode where updates from the realtime-stream are used to keep the client in sync. Whenever a client disconnects or has any error, the replication shortly switches to checkpoint iteration mode until the client is in sync again. This method accounts for missed out events and ensures that clients can always sync to the exact equal state of the server. ","version":"Next","tagName":"h3"},{"title":"Company firewalls can cause problems​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#company-firewalls-can-cause-problems","content":" There are many known problems with company infrastructure when using any of the streaming technologies. Proxies and firewall can block traffic or unintentionally break requests and responses. Whenever you implement a realtime app in such an infrastructure, make sure you first test out if the technology itself works for you. ","version":"Next","tagName":"h3"},{"title":"Follow Up​","type":1,"pageTitle":"WebSockets vs Server-Sent-Events vs Long-Polling vs WebRTC vs WebTransport","url":"/articles/websockets-sse-polling-webrtc-webtransport.html#follow-up","content":" Check out the hackernews discussion of this articleShared/Like my announcement tweetLearn how to use Server-Sent-Events to replicate a client side RxDB database with your backend.Learn how to use RxDB with the RxDB QuickstartCheck out the RxDB github repo and leave a star ⭐ ","version":"Next","tagName":"h2"},{"title":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","type":0,"sectionRef":"#","url":"/articles/zero-latency-local-first.html","content":"","keywords":"","version":"Next"},{"title":"Why Zero Latency with a Local First Approach?​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#why-zero-latency-with-a-local-first-approach","content":" In a traditional architecture, each user action triggers requests to a server for reads or writes. Despite network optimizations, unavoidable latencies can delay responses and disrupt the user flow. By contrast, a local first model maintains data in the client's environment (browser, mobile, desktop), drastically reducing user-perceived delays. Once the user re-connects or resumes activity online, changes propagate automatically to the server, eliminating manual synchronization overhead. Instant Responsiveness: Because user actions (queries, updates, etc.) happen against a local datastore, UI updates do not wait on round-trip times.Offline Operation: Apps can continue to read and write data, even when there is zero connectivity.Reduced Backend Load: Instead of flooding the server with small requests, replication can combine and push or pull changes in batches.Simplified Caching: Instead of implementing multi-layer caching, local first transforms your data layer into a reliable, quickly accessible store for all user actions. ","version":"Next","tagName":"h2"},{"title":"RxDB: Your Key to Zero-Latency Local First Apps​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#rxdb-your-key-to-zero-latency-local-first-apps","content":" RxDB is a JavaScript-based NoSQL database designed for offline-first and real-time replication scenarios. It supports a range of environments - browsers (IndexedDB or OPFS), mobile (Ionic, React Native), Electron, Node.js - and is built around: Reactive Queries that trigger UI updates upon data changesSchema-based NoSQL Documents for flexible but robust data modelsAdvanced Sync Engine: to synchronize with diverse backendsEncryption for secure data at restCompression to reduce local and network overhead ","version":"Next","tagName":"h2"},{"title":"Real-Time Sync and Offline-First​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#real-time-sync-and-offline-first","content":" RxDB's replication logic revolves around pulling down remote changes and pushing up local modifications. It maintains a checkpoint-based mechanism, so only new or updated documents flow between the client and server, reducing bandwidth usage and latency. This ensures: Live Data: Queries automatically reflect server-side changes once they arrive locally.Background Updates: No manual polling needed; replication streams or intervals handle synchronization.Conflict Handling (see below) ensures data merges gracefully when multiple clients edit the same document offline. Multiple Replication Plugins and Approaches​ RxDB's flexible replication system lets you connect to different backends or even peer-to-peer networks. There are official plugins for CouchDB, Firestore, GraphQL, WebRTC, and more. Many developers create a custom HTTP replication to work with their existing REST-based backend, ensuring a painless integration that doesn't require adopting an entirely new server infrastructure. Example Setup of a local database​ import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; async function initZeroLocalDB() { // Create a local RxDB instance using localstorage-based storage const db = await createRxDatabase({ name: 'myZeroLocalDB', storage: getRxStorageLocalstorage(), // optional: password for encryption if needed }); // Define one or more collections await db.addCollections({ tasks: { schema: { title: 'task schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string', maxLength: 100 }, title: { type: 'string' }, done: { type: 'boolean' } } } } }); // Reactive query - automatically updates on local or remote changes db.tasks .find() .$ // returns an RxJS Observable .subscribe(allTasks => { console.log('All tasks updated:', allTasks); }); return db; } When offline, reads and writes to db.tasks happen locally with near-zero delay. Once connectivity resumes, changes sync to the server automatically (if replication is configured). Example Setup of the replication​ import { replicateRxCollection } from 'rxdb/plugins/replication'; async function syncLocalTasks(db) { replicateRxCollection({ collection: db.tasks, replicationIdentifier: 'sync-tasks', // Define how to pull server documents and push local documents pull: { handler: async (lastCheckpoint, batchSize) => { // logic to retrieve updated tasks from the server since lastCheckpoint }, }, push: { handler: async (docs) => { // logic to post local changes to the server }, }, live: true, // continuously replicate retryTime: 5000, // retry on errors or disconnections }); } This replication seamlessly merges server-side and client-side changes. Your app remains responsive throughout, regardless of the network status. ","version":"Next","tagName":"h3"},{"title":"Things you should also know about​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#things-you-should-also-know-about","content":" ","version":"Next","tagName":"h2"},{"title":"Optimistic UI on Local Data Changes​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#optimistic-ui-on-local-data-changes","content":" A local first approach, especially with RxDB, naturally supports an optimistic UI pattern. Because writes occur on the client, you can instantly reflect changes in the interface as soon as the user performs an action - no need to wait for server confirmation. For example, when a user updates a task document to done: true, the UI can re-render immediately with that new state. This even works across multiple browser tabs. If a server conflict arises later during replication, RxDB's conflict handling logic determines which changes to keep, and the UI can be updated accordingly. This is far more efficient than blocking the user or displaying a spinner while the backend processes the request. ","version":"Next","tagName":"h3"},{"title":"Conflict Handling​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#conflict-handling","content":" In local first models, conflicts emerge if multiple devices or clients edit the same document while offline. RxDB tracks document revisions so you can detect collisions and merge them effectively. By default, RxDB uses a last-write-wins approach, but developers can override it with a custom conflict handler. This provides fine-grained control - like merging partial fields, storing revision histories, or prompting users for resolution. Proper conflict handling keeps distributed data consistent across your entire system. ","version":"Next","tagName":"h3"},{"title":"Schema Migrations​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#schema-migrations","content":" Over time, apps evolve - new fields, changed field types, or altered indexes. RxDB allows incremental schema migrations so you can upgrade a user's local data from one schema version to another. You might, for instance, rename a property or transform data formats. Once you define your migration strategy, RxDB automatically applies it upon app initialization, ensuring the local database's structure aligns with your latest codebase. ","version":"Next","tagName":"h3"},{"title":"Advanced Features​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#advanced-features","content":" ","version":"Next","tagName":"h2"},{"title":"Setup Encryption​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#setup-encryption","content":" When storing data locally, you may handle user-sensitive information like PII (Personal Identifiable Information) or financial details. RxDB supports on-device encryption to protect fields. For example, you can define: import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ storage: getRxStorageLocalstorage() }); const db = await createRxDatabase({ name: 'secureDB', storage: encryptedStorage, password: 'myEncryptionPassword' }); await db.addCollections({ secrets: { schema: { title: 'secrets schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string', maxLength: 100 }, secretField: { type: 'string' } }, required: ['id'], encrypted: ['secretField'] // define which fields to encrypt } } }); Then mark fields as encrypted in the schema. This ensures data is unreadable on disk without the correct password. ","version":"Next","tagName":"h3"},{"title":"Setup Compression​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#setup-compression","content":" Local data can expand quickly, especially for large documents or repeated key names. RxDB's key compression feature replaces verbose field names with shorter tokens, decreasing storage usage and speeding up replication. You enable it by adding keyCompression: true to your collection schema: await db.addCollections({ logs: { schema: { title: 'log schema', version: 0, keyCompression: true, type: 'object', primaryKey: 'id', properties: { id: { type: 'string'. maxLength: 100 }, message: { type: 'string' }, timestamp: { type: 'number' } } } } }); ","version":"Next","tagName":"h3"},{"title":"Different RxDB Storages Depending on the Runtime​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#different-rxdb-storages-depending-on-the-runtime","content":" RxDB's storage layer is swappable, so you can pick the optimal adapter for each environment. Some common choices include: IndexedDB in modern browsers (default).OPFS (Origin Private File System) in browsers that support it for potentially better performance.SQLite for mobile or desktop environments via the premium plugin, offering native-like speed on Android, iOS, or Electron.In-Memory for tests or ephemeral data. By choosing a suitable storage layer, you can adapt your zero-latency local first design to any runtime - web, mobile, or server-like contexts in Node.js. ","version":"Next","tagName":"h2"},{"title":"Performance Considerations​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#performance-considerations","content":" Performant local data operations are crucial for a zero-latency experience. According to the RxDB storage performance overview, differences in underlying storages can significantly impact throughput and latency. For instance, IndexedDB typically performs well across modern browsers, OPFS offers improved throughput in supporting browsers, and SQLite storage (a premium plugin) often delivers near-native speed for mobile or desktop. ","version":"Next","tagName":"h2"},{"title":"Offloading Work from the Main Thread​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#offloading-work-from-the-main-thread","content":" In a browser environment, you can move database operations into a Web Worker using the Worker RxStorage plugin. This approach lets you keep heavy data processing off the main thread, ensuring the UI remains smooth and responsive. Complex queries or large write operations no longer cause stuttering in the user interface. ","version":"Next","tagName":"h3"},{"title":"Sharding or Memory-Mapped Storages​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#sharding-or-memory-mapped-storages","content":" For large datasets or high concurrency, advanced techniques like sharding collections across multiple storages or leveraging a memory-mapped variant can further boost performance. By splitting data into smaller subsets or streaming it only as needed, you can scale to handle complex usage scenarios without compromising on the zero-latency user experience. ","version":"Next","tagName":"h3"},{"title":"Follow Up​","type":1,"pageTitle":"Zero Latency Local First Apps with RxDB – Sync, Encryption and Compression","url":"/articles/zero-latency-local-first.html#follow-up","content":" Dive into the RxDB Quickstart to set up your own local first database.Explore Replication Plugins for syncing with platforms like CouchDB, Firestore, or GraphQL.Check out Advanced Conflict Handling and Performance Tuning for big data sets or complex multi-user interactions.Join the RxDB Community on GitHub and Discord to share insights, file issues, and learn from other developers building zero-latency solutions. By integrating RxDB into your stack, you achieve millisecond interactions, full offline capabilities, secure data at rest, and minimal overhead for large or distributed teams. This zero-latency local first architecture is the future of modern software - delivering a fluid, always-available user experience without overcomplicating the developer workflow. ","version":"Next","tagName":"h2"},{"title":"📥 Backup Plugin","type":0,"sectionRef":"#","url":"/backup.html","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"📥 Backup Plugin","url":"/backup.html#installation","content":" import { addRxPlugin } from 'rxdb'; import { RxDBBackupPlugin } from 'rxdb/plugins/backup'; addRxPlugin(RxDBBackupPlugin); ","version":"Next","tagName":"h2"},{"title":"one-time backup​","type":1,"pageTitle":"📥 Backup Plugin","url":"/backup.html#one-time-backup","content":" Write the whole database to the filesystem once. When called multiple times, it will continue from the last checkpoint and not start all over again. const backupOptions = { // if false, a one-time backup will be written live: false, // the folder where the backup will be stored directory: '/my-backup-folder/', // if true, attachments will also be saved attachments: true } const backupState = myDatabase.backup(backupOptions); await backupState.awaitInitialBackup(); // call again to run from the last checkpoint const backupState2 = myDatabase.backup(backupOptions); await backupState2.awaitInitialBackup(); ","version":"Next","tagName":"h2"},{"title":"live backup​","type":1,"pageTitle":"📥 Backup Plugin","url":"/backup.html#live-backup","content":" When live: true is set, the backup will write all ongoing changes to the backup directory. const backupOptions = { // set live: true to have an ongoing backup live: true, directory: '/my-backup-folder/', attachments: true } const backupState = myDatabase.backup(backupOptions); // you can still await the initial backup write, but further changes will still be processed. await backupState.awaitInitialBackup(); ","version":"Next","tagName":"h2"},{"title":"writeEvents$​","type":1,"pageTitle":"📥 Backup Plugin","url":"/backup.html#writeevents","content":" You can listen to the writeEvents$ Observable to get notified about written backup files. const backupOptions = { live: false, directory: '/my-backup-folder/', attachments: true } const backupState = myDatabase.backup(backupOptions); const subscription = backupState.writeEvents$.subscribe(writeEvent => console.dir(writeEvent)); /* > { collectionName: 'humans', documentId: 'foobar', files: [ '/my-backup-folder/foobar/document.json' ], deleted: false } */ ","version":"Next","tagName":"h2"},{"title":"Limitations​","type":1,"pageTitle":"📥 Backup Plugin","url":"/backup.html#limitations","content":" It is currently not possible to import from a written backup. If you need this functionality, please make a pull request. ","version":"Next","tagName":"h2"},{"title":"🧹 Cleanup","type":0,"sectionRef":"#","url":"/cleanup.html","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"🧹 Cleanup","url":"/cleanup.html#installation","content":" import { addRxPlugin } from 'rxdb'; import { RxDBCleanupPlugin } from 'rxdb/plugins/cleanup'; addRxPlugin(RxDBCleanupPlugin); ","version":"Next","tagName":"h2"},{"title":"Create a database with cleanup options​","type":1,"pageTitle":"🧹 Cleanup","url":"/cleanup.html#create-a-database-with-cleanup-options","content":" You can set a specific cleanup policy when a RxDatabase is created. For most use cases, the defaults should be ok. import { createRxDatabase } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage(), cleanupPolicy: { /** * The minimum time in milliseconds for how long * a document has to be deleted before it is * purged by the cleanup. * [default=one month] */ minimumDeletedTime: 1000 * 60 * 60 * 24 * 31, // one month, /** * The minimum amount of that that the RxCollection must have existed. * This ensures that at the initial page load, more important * tasks are not slowed down because a cleanup process is running. * [default=60 seconds] */ minimumCollectionAge: 1000 * 60, // 60 seconds /** * After the initial cleanup is done, * a new cleanup is started after [runEach] milliseconds * [default=5 minutes] */ runEach: 1000 * 60 * 5, // 5 minutes /** * If set to true, * RxDB will await all running replications * to not have a replication cycle running. * This ensures we do not remove deleted documents * when they might not have already been replicated. * [default=true] */ awaitReplicationsInSync: true, /** * If true, it will only start the cleanup * when the current instance is also the leader. * This ensures that when RxDB is used in multiInstance mode, * only one instance will start the cleanup. * [default=true] */ waitForLeadership: true } }); ","version":"Next","tagName":"h2"},{"title":"Calling cleanup manually​","type":1,"pageTitle":"🧹 Cleanup","url":"/cleanup.html#calling-cleanup-manually","content":" You can manually run a cleanup per collection by calling RxCollection.cleanup(). /** * Manually run the cleanup with the * minimumDeletedTime from the cleanupPolicy. */ await myRxCollection.cleanup(); /** * Overwrite the minimumDeletedTime * be setting it explicitly (time in milliseconds) */ await myRxCollection.cleanup(1000); /** * Purge all deleted documents no * matter when they where deleted * by setting minimumDeletedTime to zero. */ await myRxCollection.cleanup(0); ","version":"Next","tagName":"h2"},{"title":"Using the cleanup plugin to empty a collection​","type":1,"pageTitle":"🧹 Cleanup","url":"/cleanup.html#using-the-cleanup-plugin-to-empty-a-collection","content":" When you have a collection with documents and you want to empty it by purging all documents, the recommended way is to call myRxCollection.remove(). However, this will destroy the JavaScript class of the collection and stop all listeners and observables. Sometimes the better option might be to manually delete all documents and then use the cleanup plugin to purge the deleted documents: // delete all documents await myRxCollection.find().remove(); // purge all deleted documents await myRxCollection.cleanup(0); ","version":"Next","tagName":"h2"},{"title":"FAQ​","type":1,"pageTitle":"🧹 Cleanup","url":"/cleanup.html#faq","content":" When does the cleanup run The cleanup cycles are optimized to run only when the database is idle and it is unlikely that another database interaction performance will be decreased in the meantime. For example, by default, the cleanup does not run in the first 60 seconds of the creation of a collection to ensure the initial page load of your website does not slow down. Also, we use mechanisms like the requestIdleCallback() API to improve the correct timing of the cleanup cycle. ","version":"Next","tagName":"h2"},{"title":"Capacitor Database - SQLite, RxDB and others","type":0,"sectionRef":"#","url":"/capacitor-database.html","content":"","keywords":"","version":"Next"},{"title":"Database Solutions for Capacitor​","type":1,"pageTitle":"Capacitor Database - SQLite, RxDB and others","url":"/capacitor-database.html#database-solutions-for-capacitor","content":" ","version":"Next","tagName":"h2"},{"title":"Preferences API​","type":1,"pageTitle":"Capacitor Database - SQLite, RxDB and others","url":"/capacitor-database.html#preferences-api","content":" Capacitor comes with a native Preferences API which is a simple, persistent key->value store for lightweight data, similar to the browsers localstorage or React Native AsyncStorage. To use it, you first have to install it from npm npm install @capacitor/preferences and then you can import it and write/read data. Notice that all calls to the preferences API are asynchronous so they return a Promise that must be await-ed. import { Preferences } from '@capacitor/preferences'; // write await Preferences.set({ key: 'foo', value: 'baar', }); // read const { value } = await Preferences.get({ key: 'foo' }); // > 'bar' // delete await Preferences.remove({ key: 'foo' }); The preferences API is good when only a small amount of data needs to be stored and when no query capabilities besides the key access are required. Complex queries or other features like indexes or replication are not supported which makes the preferences API not suitable for anything more than storing simple data like user settings. ","version":"Next","tagName":"h3"},{"title":"Localstorage/IndexedDB/WebSQL​","type":1,"pageTitle":"Capacitor Database - SQLite, RxDB and others","url":"/capacitor-database.html#localstorageindexeddbwebsql","content":" Since Capacitor apps run in a web view, Web APIs like IndexedDB, Localstorage and WebSQL are available. But the default browser behavior is to clean up these storages regularly when they are not in use for a long time or the device is low on space. Therefore you cannot 100% rely on the persistence of the stored data and your application needs to expect that the data will be lost eventually. Storing data in these storages can be done in browsers, because there is no other option. But in Capacitor iOS and Android, you should not rely on these. ","version":"Next","tagName":"h3"},{"title":"SQLite​","type":1,"pageTitle":"Capacitor Database - SQLite, RxDB and others","url":"/capacitor-database.html#sqlite","content":" SQLite is a SQL based relational database written in C that was crafted to be embed inside of applications. Operations are written in the SQL query language and SQLite generally follows the PostgreSQL syntax. To use SQLite in Capacitor, there are three options: The @capacitor-community/sqlite packageThe cordova-sqlite-storage packageThe non-free IonicSecure Storage which comes at 999$ per month. It is recommended to use the @capacitor-community/sqlite because it has the best maintenance and is open source. Install it first npm install --save @capacitor-community/sqlite and then set the storage location for iOS apps: { "plugins": { "CapacitorSQLite": { "iosDatabaseLocation": "Library/CapacitorDatabase" } } } Now you can create a database connection and use the SQLite database. import { Capacitor } from '@capacitor/core'; import { CapacitorSQLite, SQLiteDBConnection, SQLiteConnection, capSQLiteSet, capSQLiteChanges, capSQLiteValues, capEchoResult, capSQLiteResult, capNCDatabasePathResult } from '@capacitor-community/sqlite'; const sqlite = new SQLiteConnection(CapacitorSQLite); const database: SQLiteDBConnection = await this.sqlite.createConnection( databaseName, encrypted, mode, version, readOnly ); let { rows } = database.query('SELECT somevalue FROM sometable'); The downside of SQLite is that it is lacking many features that are handful when using a database together with an UI based application like your Capacitor app. For example it is not possible to observe queries or document fields. Also there is no realtime replication feature, you can only import json files. This makes SQLite a good solution when you just want to store data on the client, but when you want to sync data with a server or other clients or create big complex realtime applications, you have to use something else. ","version":"Next","tagName":"h3"},{"title":"RxDB​","type":1,"pageTitle":"Capacitor Database - SQLite, RxDB and others","url":"/capacitor-database.html#rxdb","content":" RxDB is an local first, NoSQL database for JavaScript Applications like hybrid apps. Because it is reactive, you can subscribe to all state changes like the result of a query or even a single field of a document. This is great for UI-based realtime applications in a way that makes it easy to develop realtime applications like what you need in Capacitor. Because RxDB is made for Web applications, most of the available RxStorage plugins can be used to store and query data in a Capacitor app. However it is recommended to use the SQLite RxStorage because it stores the data on the filesystem of the device, not in the JavaScript runtime (like IndexedDB). Storing data on the filesystem ensures it is persistent and will not be cleaned up by any process. Also the performance of SQLite is much faster compared to IndexedDB, because SQLite does not have to go through a browsers permission layers. For the SQLite binding you should use the @capacitor-community/sqlite package. Because the SQLite RxStorage is part of the 👑 Premium Plugins which must be purchased, it is recommended to use the LocalStorage RxStorage while testing and prototyping your Capacitor app. To use the SQLite RxStorage in Capacitor you have to install all dependencies via npm install rxdb rxjs rxdb-premium @capacitor-community/sqlite. For iOS apps you should add a database location in your Capacitor settings: { "plugins": { "CapacitorSQLite": { "iosDatabaseLocation": "Library/CapacitorDatabase" } } } Then you can assemble the RxStorage and create a database with it: 1 Import RxDB and SQLite​ import { createRxDatabase } from 'rxdb/plugins/core'; import { CapacitorSQLite, SQLiteConnection } from '@capacitor-community/sqlite'; import { Capacitor } from '@capacitor/core'; const sqlite = new SQLiteConnection(CapacitorSQLite); 2 Import the RxDB SQLite Storage​ RxDB Core RxDB Premium 👑 import { getRxStorageSQLiteTrial, getSQLiteBasicsCapacitor } from 'rxdb/plugins/storage-sqlite'; 3 Create a Database with the Storage​ RxDB Core RxDB Premium 👑 // create database const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: getRxStorageSQLiteTrial({ sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor) }) }); 4 Add a Collection​ // create collections const collections = await myRxDatabase.addCollections({ humans: { schema: { version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string', maxLength: 100 }, name: { type: 'string' }, age: { type: 'number' } }, required: ['id', 'name'] } } }); 5 Insert a Document​ await collections.humans.insert({id: 'foo', name: 'bar'}); 6 Run a Query​ const result = await collections.humans.find({ selector: { name: 'bar' } }).exec(); 7 Observe a Query​ await collections.humans.find({ selector: { name: 'bar' } }).$.subscribe(result => {/* ... */}); ","version":"Next","tagName":"h3"},{"title":"Follow up​","type":1,"pageTitle":"Capacitor Database - SQLite, RxDB and others","url":"/capacitor-database.html#follow-up","content":" If you haven't done yet, you should start learning about RxDB with the Quickstart Tutorial.There is a followup list of other client side database alternatives. ","version":"Next","tagName":"h2"},{"title":"Data Migration","type":0,"sectionRef":"#","url":"/data-migration.html","content":"Data Migration This documentation page has been moved to here","keywords":"","version":"Next"},{"title":"Contribution","type":0,"sectionRef":"#","url":"/contribution.html","content":"","keywords":"","version":"Next"},{"title":"Requirements​","type":1,"pageTitle":"Contribution","url":"/contribution.html#requirements","content":" Before you can start developing, do the following: Make sure you have installed nodejs with the version stated in the .nvmrcClone the repository git clone https://github.com/pubkey/rxdb.gitInstall the dependencies cd rxdb && npm installMake sure that the tests work for you. At first, try it out with npm run test:node:memory which tests the memory storage in node. In the package.json you can find more scripts to run the tests with different storages. ","version":"Next","tagName":"h2"},{"title":"Adding tests​","type":1,"pageTitle":"Contribution","url":"/contribution.html#adding-tests","content":" Before you start creating a bugfix or a feature, you should create a test to reproduce it. Tests are in the test/unit-folder. If you want to reproduce a bug, you can modify the test in this file. ","version":"Next","tagName":"h2"},{"title":"Making a PR​","type":1,"pageTitle":"Contribution","url":"/contribution.html#making-a-pr","content":" If you make a pull-request, ensure the following: Every feature or bugfix must be committed together with a unit-test which ensures everything works as expected.Do not commit build-files (anything in the dist-folder)Before you add non-trivial changes, create an issue to discuss if this will be merged and you don't waste your time.To run the unit and integration-tests, do npm run test and ensure everything works as expected ","version":"Next","tagName":"h2"},{"title":"Getting help​","type":1,"pageTitle":"Contribution","url":"/contribution.html#getting-help","content":" If you need help with your contribution, ask at discord. ","version":"Next","tagName":"h2"},{"title":"No-Go​","type":1,"pageTitle":"Contribution","url":"/contribution.html#no-go","content":" When reporting a bug, you need to make a PR with a test case that runs in the CI and reproduces your problem. Sending a link with a repo does not help the maintainer because installing random peoples projects is time consuming and dangerous. Also the maintainer will never go on a bug hunt based on your plain description. Either you report the bug with a test case, or the maintainer will likely not help you. Docs The source of the documentation is at the docs-src-folder. To read the docs locally, run npm run docs:install && npm run docs:serve and open http://localhost:4000/ Thank you for contributing! ","version":"Next","tagName":"h2"},{"title":"Dev Mode","type":0,"sectionRef":"#","url":"/dev-mode.html","content":"","keywords":"","version":"Next"},{"title":"Usage with Node.js​","type":1,"pageTitle":"Dev Mode","url":"/dev-mode.html#usage-with-nodejs","content":" async function createDb() { if (process.env.NODE_ENV !== "production") { await import('rxdb/plugins/dev-mode').then( module => addRxPlugin(module.RxDBDevModePlugin) ); } const db = createRxDatabase( /* ... */ ); } ","version":"Next","tagName":"h2"},{"title":"Usage with Angular​","type":1,"pageTitle":"Dev Mode","url":"/dev-mode.html#usage-with-angular","content":" import { isDevMode } from '@angular/core'; async function createDb() { if (isDevMode()){ await import('rxdb/plugins/dev-mode').then( module => addRxPlugin(module.RxDBDevModePlugin) ); } const db = createRxDatabase( /* ... */ ); // ... } ","version":"Next","tagName":"h2"},{"title":"Usage with webpack​","type":1,"pageTitle":"Dev Mode","url":"/dev-mode.html#usage-with-webpack","content":" In the webpack.config.js: module.exports = { entry: './src/index.ts', /* ... */ plugins: [ // set a global variable that can be accessed during runtime new webpack.DefinePlugin({ MODE: JSON.stringify("production") }) ] /* ... */ }; In your source code: declare var MODE: 'production' | 'development'; async function createDb() { if (MODE === 'development') { await import('rxdb/plugins/dev-mode').then( module => addRxPlugin(module.RxDBDevModePlugin) ); } const db = createRxDatabase( /* ... */ ); // ... } ","version":"Next","tagName":"h2"},{"title":"Disable the dev-mode warning​","type":1,"pageTitle":"Dev Mode","url":"/dev-mode.html#disable-the-dev-mode-warning","content":" When the dev-mode is enabled, it will print a console.warn() message to the console so that you do not accidentally use the dev-mode in production. To disable this warning you can call the disableWarnings() function. import { disableWarnings } from 'rxdb/plugins/dev-mode'; disableWarnings(); ","version":"Next","tagName":"h2"},{"title":"Disable the tracking iframe​","type":1,"pageTitle":"Dev Mode","url":"/dev-mode.html#disable-the-tracking-iframe","content":" When used in localhost and in the browser, the dev-mode plugin can add a tracking iframe to the DOM. This is used to track the effectiveness of marketing efforts of RxDB. If you have premium access and want to disable this iframe, you can call setPremiumFlag() before creating the database. import { setPremiumFlag } from 'rxdb-premium/plugins/shared'; setPremiumFlag(); ","version":"Next","tagName":"h2"},{"title":"RxDB CRDT Plugin","type":0,"sectionRef":"#","url":"/crdt.html","content":"","keywords":"","version":"Next"},{"title":"RxDB CRDT operations​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#rxdb-crdt-operations","content":" In RxDB, a CRDT operation is defined with NoSQL update operators, like you might know them from MongoDB update operations or the RxDB update plugin. To run the operators, RxDB uses the mingo library. A CRDT operator example: const myCRDTOperation = { // increment the points field by +1 $inc: { points: 1 }, // set the modified field to true $set: { modified: true } }; ","version":"Next","tagName":"h2"},{"title":"Operators​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#operators","content":" At the moment, not all possible operators are implemented in mingo, if you need additional ones, you should make a pull request there. The following operators can be used at this point in time: $min$max$inc$set$unset$push$addToSet$pop$pullAll$rename For the exact definition on how each operator behaves, check out the MongoDB documentation on update operators. ","version":"Next","tagName":"h3"},{"title":"Installation​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#installation","content":" To use CRDTs with RxDB, you need the following: Add the CRDT plugin via addRxPlugin.Add a field to your schema that defines where to store the CRDT operations via getCRDTSchemaPart()Set the crdt options in your schema.Do NOT set a custom conflict handler, the plugin will use its own one. // import the relevant parts from the CRDT plugin import { getCRDTSchemaPart, RxDBcrdtPlugin } from 'rxdb/plugins/crdt'; // add the CRDT plugin to RxDB import { addRxPlugin } from 'rxdb'; addRxPlugin(RxDBcrdtPlugin); // create a database import { createRxDatabase } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const myDatabase = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage() }); // create a schema with the CRDT options const mySchema = { version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 }, points: { type: 'number', maximum: 100, minimum: 0 }, crdts: getCRDTSchemaPart() // use this field to store the CRDT operations }, required: ['id', 'points'], crdt: { // CRDT options field: 'crdts' } } // add a collection await db.addCollections({ users: { schema: mySchema } }); // insert a document const myDocument = await db.users.insert({id: 'alice', points: 0}); // run a CRDT operation that increments the 'points' by one await myDocument.updateCRDT({ ifMatch: { $inc: { points: 1 } } }); ","version":"Next","tagName":"h2"},{"title":"Conditional CRDT operations​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#conditional-crdt-operations","content":" By default, all CRDTs operations will be run to build the current document state. But in many cases, more granular operations are required to better reflect the desired business logic. For these cases, conditional CRDTs can be used. For example if you have a field points with a maximum of 100, you might want to only run the $inc operation, if the points value is less than 100. In an conditional CRDT, you can specify a selector and the operation sets ifMatch and ifNotMatch. At each time the CRDT is applied to the document state, first the selector will run and evaluate which operations path must be used. await myDocument.updateCRDT({ // only if the selector matches, the ifMatch operation will run selector: { age: { $lt: 100 } }, // an operation that runs if the selector matches ifMatch: { $inc: { points: 1 } }, // if the selector does NOT match, you could run a different operation instead ifNotMatch: { // ... } }); ","version":"Next","tagName":"h2"},{"title":"Running multiples operations at once​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#running-multiples-operations-at-once","content":" By default, one CRDT operation is applied to the document in a single database write. To represent more complex logic chains, it might make sense to use multiple CRDTs and write them at once inside of a single atomic document write. For these cases, the updateCRDT() method allows to pass an array of operations. await myDocument.updateCRDT([ { selector: { /** ... **/ }, ifMatch: { /** ... **/ } }, { selector: { /** ... **/ }, ifMatch: { /** ... **/ } }, { selector: { /** ... **/ }, ifMatch: { /** ... **/ } }, { selector: { /** ... **/ }, ifMatch: { /** ... **/ } } ]); ","version":"Next","tagName":"h2"},{"title":"CRDTs on inserts​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#crdts-on-inserts","content":" When CRDTs are enabled with the plugin, all insert operations are automatically mapped as CRDT operation with the $set operator. // Calling RxCollection.insert() await myRxCollection.insert({ id: 'foo' points: 1 }); // is exactly equal to calling insertCRDT() await myRxCollection.insertCRDT({ ifMatch: { $set: { id: 'foo' points: 1 } } }); When the same document is inserted in multiple client instances and then replicated, a conflict will emerge and the insert-CRDTs will overwrite each other in a deterministic order. You can use insertCRDT() to make conditional insert operations with any logic. To check for the previous existence of a document, use the $exists query operation on the primary key of the document. await myRxCollection.insertCRDT({ selector: { // only run if the document did not exist before. id: { $exists: false } }, ifMatch: { // if the document did not exist, insert it $set: { id: 'foo' points: 1 } }, ifNotMatch: { // if document existed already, increment the points by +1 $inc: { points: 1 } } }); ","version":"Next","tagName":"h2"},{"title":"Deleting documents​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#deleting-documents","content":" You can delete a document with a CRDT operation by setting _deleted to true. Calling RxDocument.remove() will do exactly the same when CRDTs are activated. await doc.updateCRDT({ ifMatch: { $set: { _deleted: true } } }); // OR await doc.remove(); ","version":"Next","tagName":"h2"},{"title":"CRDTs with replication​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#crdts-with-replication","content":" CRDT operations are stored inside of a special field besides your 'normal' document fields. When replicating document data with the RxDB replication or the CouchDB replication or even any custom replication, the CRDT operations must be replicated together with the document data as if they would be 'normal' a document property. When any instances makes a write to the document, it is required to update the CRDT operations accordingly. For example if your custom backend updates a document, it must also do that by adding a CRDT operation. In dev-mode RxDB will refuse to store any document data where the document properties do not match the result of the CRDT operations. ","version":"Next","tagName":"h2"},{"title":"Why not automerge.js or yjs?​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#why-not-automergejs-or-yjs","content":" There are already CRDT libraries out there that have been considered to be used with RxDB. The biggest ones are automerge and yjs. The decision was made to not use these but instead go for a more NoSQL way of designing the CRDT format because: Users do not have to learn a new syntax but instead can use the NoSQL query operations which they already know to manipulate the JSON data of a document.RxDB is often used to replicate data with any custom backend on an already existing infrastructure. Using NoSQL operators instead of binary data in CRDTs, makes it easy to implement the exact same logic on these backends so that the backend can also do document writes and still be compliant to the RxDB CRDT plugin. So instead of using YJS or Automerge with a database, you can use RxDB with the CRDT plugin to have a more database specific CRDT approach. This gives you additional features for free such as schema validation or data migration. ","version":"Next","tagName":"h2"},{"title":"When to not use CRDTs​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#when-to-not-use-crdts","content":" CRDT can only be use when your business logic allows to represent document changes via static json operators. If you can have cases where user interaction is required to correctly merge conflicting document states, you cannot use CRDTs for that. Also when CRDTs are used, it is no longer allowed to do non-CRDT writes to the document properties. ","version":"Next","tagName":"h2"},{"title":"CRDT Alternative​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#crdt-alternative","content":" While the CRDT plugin can automatically merge concurrent document updates, it is not the only way to resolve conflicts in RxDB. An alternative approach to CRDT is to use RxDB's built-in conflict handling system. Why use conflict handlers instead of CRDT? Conflict handlers offer a simpler and more flexible way to manage data conflicts. Instead of encoding changes as CRDT operations, you define how RxDB should decide which document version "wins" with plain JavaScript code. This approach is easier to reason about because it works directly with your domain logic. For example, you can compare timestamps, prioritize certain fields, or even involve user interaction to resolve conflicts. Conflict handlers are: Easier to understand: you work with plain document states instead of CRDT operations.Fully customizable: you can define any merge strategy, from simple last-write-wins to complex rule-based logic.Compatible with all data types: unlike CRDTs, which are best suited for numeric or set-based updates.Transparent: you always know which state is being written and why. ","version":"Next","tagName":"h2"},{"title":"Downsides of CRDTs​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#downsides-of-crdts","content":" CRDTs are powerful for automatic conflict-free merging, but they also come with trade-offs: Higher conceptual complexity: CRDTs require understanding of operation semantics, version vectors, and merge determinism.Limited flexibility: you can only express changes that fit the supported JSON-style update operators.Difficult debugging: when merges don't behave as expected, it can be hard to trace the sequence of CRDT operations that led to a state.Overhead for simple cases: if your data rarely conflicts or needs human oversight, using CRDTs can add unnecessary complexity. ","version":"Next","tagName":"h3"},{"title":"When to choose conflict handlers​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#when-to-choose-conflict-handlers","content":" Use conflict handlers as CRDT alternative if: You want full control over merge logic.Your data model includes contextual or user-specific decisions.You prefer a straightforward, rule-based resolution system over automatic merges. Use CRDTs if: Your app performs frequent offline writes that can be merged deterministically.Your data can be represented as additive, numeric, or array-based updates.You want minimal manual intervention during replication. Both methods are first-class citizens in RxDB. CRDTs focus on automatic, deterministic merging, while conflict handlers emphasize clarity, flexibility, and control. ","version":"Next","tagName":"h3"},{"title":"Example: merging different fields with conflict handlers instead of CRDT​","type":1,"pageTitle":"RxDB CRDT Plugin","url":"/crdt.html#example-merging-different-fields-with-conflict-handlers-instead-of-crdt","content":" For example, imagine two users edit different fields of the same document at the same time. One updates a name, the other updates a score. A custom conflict handler can merge both changes so no data is lost: const mergeFieldsHandler = { isEqual: (a, b) => JSON.stringify(a) === JSON.stringify(b), resolve: (input) => { return { ...input.realMasterState, name: input.newDocumentState.name ?? input.realMasterState.name, score: Math.max(input.newDocumentState.score, input.realMasterState.score) }; } }; In this example, if the two versions change different properties, the final merged document includes both updates. This kind of logic is often easier to reason about than designing equivalent CRDT operations. ","version":"Next","tagName":"h3"},{"title":"Electron Plugin","type":0,"sectionRef":"#","url":"/electron.html","content":"","keywords":"","version":"Next"},{"title":"RxStorage Electron IpcRenderer & IpcMain​","type":1,"pageTitle":"Electron Plugin","url":"/electron.html#rxstorage-electron-ipcrenderer--ipcmain","content":" To use RxDB in electron, it is recommended to run the RxStorage in the main process and the RxDatabase in the renderer processes. With the rxdb electron plugin you can create a remote RxStorage and consume it from the renderer process. To do this in a convenient way, the RxDB electron plugin provides the helper functions exposeIpcMainRxStorage and getRxStorageIpcRenderer. Similar to the Worker RxStorage, these wrap any other RxStorage once in the main process and once in each renderer process. In the renderer you can then use the storage to create a RxDatabase which communicates with the storage of the main process to store and query data. note nodeIntegration must be enabled in Electron. // main.js const { exposeIpcMainRxStorage } = require('rxdb/plugins/electron'); const { getRxStorageMemory } = require('rxdb/plugins/storage-memory'); app.on('ready', async function () { exposeIpcMainRxStorage({ key: 'main-storage', storage: getRxStorageMemory(), ipcMain: electron.ipcMain }); }); // renderer.js const { getRxStorageIpcRenderer } = require('rxdb/plugins/electron'); const { getRxStorageMemory } = require('rxdb/plugins/storage-memory'); const db = await createRxDatabase({ name, storage: getRxStorageIpcRenderer({ key: 'main-storage', ipcRenderer: electron.ipcRenderer }) }); /* ... */ ","version":"Next","tagName":"h2"},{"title":"Related​","type":1,"pageTitle":"Electron Plugin","url":"/electron.html#related","content":" Comparison of Electron Databases ","version":"Next","tagName":"h2"},{"title":"Downsides of Local First / Offline First","type":0,"sectionRef":"#","url":"/downsides-of-offline-first.html","content":"","keywords":"","version":"Next"},{"title":"It only works with small datasets​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#it-only-works-with-small-datasets","content":" Making data available offline means it must be loaded from the server and then stored at the clients device. You need to load the full dataset on the first pageload and on every ongoing load you need to download the new changes to that set. While in theory you could download in infinite amount of data, in practice you have a limit how long the user can wait before having an up-to-date state. You want to display chat messages like Whatsapp? No problem. Syncing all the messages a user could write, can be done with a few HTTP requests. Want to make a tool that displays server logs? Good luck downloading terabytes of data to the client just to search for a single string. This will not work. Besides the network usage, there is another limit for the size of your data. In browsers you have some options for storage: Cookies, Localstorage, WebSQL and IndexedDB. Because Cookies and Localstorage is slow and WebSQL is deprecated, you will use IndexedDB. The limit of how much data you can store in IndexedDB depends on two factors: Which browser is used and how much disc space is left on the device. You can assume that at least a couple of hundred megabytes are available at least. The maximum is potentially hundreds of gigabytes or more, but the browser implementations vary. Chrome allows the browser to use up to 60% of the total disc space per origin. Firefox allows up to 50%. But on safari you can only store up to 1GB and the browser will prompt the user on each additional 200MB increment. The problem is, that you have no chance to really predict how much data can be stored. So you have to make assumptions that are hopefully true for all of your users. Also, you have no way to increase that space like you would add another hard drive to your backend server. Once your clients reach the limit, you likely have to rewrite big parts of your applications. UPDATE (2023): Newer versions of browsers can store way more data, for example firefox stores up to 10% of the total disk size. For an overview about how much can be stored, read this guide ","version":"Next","tagName":"h2"},{"title":"Browser storage is not really persistent​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#browser-storage-is-not-really-persistent","content":" When data is stored inside IndexedDB or one of the other storage APIs, it cannot be trusted to stay there forever. Apple for example deletes the data when the website was not used in the last 7 days. The other browsers also have logic to clean up the stored data, and in the end the user itself could be the one that deletes the browsers local data. The most common way to handle this, is to replicate everything from the backend to the client again. Of course, this does not work for state that is not stored at the backend. So if you assume you can store the users private data inside the browser in a secure way, you are wrong. ","version":"Next","tagName":"h2"},{"title":"There can be conflicts​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#there-can-be-conflicts","content":" Imagine two of your users modify the same JSON document, while both are offline. After they go online again, their clients replicate the modified document to the server. Now you have two conflicting versions of the same document, and you need a way to determine how the correct new version of that document should look like. This process is called conflict resolution. The default in many offline first databases is a deterministic conflict resolution strategy. Both conflicting versions of the document are kept in the storage and when you query for the document, a winner is determined by comparing the hashes of the document and only the winning document is returned. Because the comparison is deterministic, all clients and servers will always pick the same winner. This kind of resolution only works when it is not that important that one of the document changes gets dropped. Because conflicts are rare, this might be a viable solution for some use cases. A better resolution can be applied by listening to the changestream of the database. The changestream emits an event each time a write happens to the database. The event contains information about the written document and also a flag if there is a conflicting version. For each event with a conflict, you fetch all versions for that document and create a new document that contains the winning state. With that you can implement pretty complex conflict resolution strategies, but you have to manually code it for each collection of documents. Instead of the solving conflict once at every client, it can be made a bit easier by solely relying on the backend. This can be done when all of your clients replicate with the same single backend server. With RxDB's Graphql Replication each client side change is sent to the server where conflicts can be resolved and the winning document can be sent back to the clients. Sometimes there is no way to solve a conflict with code. If your users edit text based documents or images, often only the users themselves can decide how the winning revision has to look. For these cases, you have to implement complex UI parts where the users can inspect the conflict and manage its resolution. You do not have to handle conflicts if they cannot happen in the first place. You can achieve that by designing a write only database where existing documents cannot be touched. Instead of storing the current state in a single document, you store all the events that lead to the current state. Sometimes called the "everything is a delta" strategy, others would call it Event Sourcing. Like an accountant that does not need an eraser, you append all changes and afterwards aggregate the current state at the client. // create one new document for each change to the users balance {id: new Date().toJSON(), change: 100} // balance increased by $100 {id: new Date().toJSON(), change: -50} // balance decreased by $50 {id: new Date().toJSON(), change: 200} // balance increased by $200 There is this thing called conflict-free replicated data type, short CRDT. Using a CRDT library like automerge will magically solve all of your conflict problems. Until you use it in production where you observe that implementing CRDTs has basically the same complexity as implementing conflict resolution strategies. ","version":"Next","tagName":"h2"},{"title":"Realtime is a lie​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#realtime-is-a-lie","content":" So you replicate stuff between the clients and your backend. Each change on one side directly changes the state of the other sides in realtime. But this "realtime" is not the same as in realtime computing. In the offline first world, the word realtime was introduced by firebase and is more meant as a marketing slogan than a technical description. There is an internet between your backend and your clients and everything you do on one machine takes at least once the latency until it can affect anything on the other machines. You have to keep this in mind when you develop anything where the timing is important, like a multiplayer game or a stock trading app. Even when you run a query against the local database, there is no "real" realtime. Client side databases run on JavaScript and JavaScript runs on a single CPU that might be partially blocked because the user is running some background processes. So you can never guarantee a response deadline which violates the time constraint of realtime computing. ","version":"Next","tagName":"h2"},{"title":"Eventual consistency​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#eventual-consistency","content":" An offline first app does not have a single source of truth. There is a source on the backend, one on the own client, and also each other client has its own definition of truth. At the moment your user starts the app, the local state is hopefully already replicated with the backend and all other clients. But this does not have to be true, the states can have converged and you have to plan for that. The user could update a document based on wrong assumptions because it was not fully replicated at that point in time because the user is offline. A good way to handle this problem is to show the replication state in the UI and tell the user when the replication is running, stopped, paused or finished. And some data is just too important to be "eventual consistent". Create a wire transfer in your online banking app while you are offline. You keep the smartphone laying at your night desk and when you use again in the next morning, it goes online and replicates the transaction. No thank you, do not use offline first for these kinds of things, or at least you have to display the replication state of each document in the UI. ","version":"Next","tagName":"h2"},{"title":"Permissions and authentication​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#permissions-and-authentication","content":" Every offline first app that goes beyond a prototype, does likely not have the same global state for all of its users. Each user has a different set of documents that are allowed to be replicated or seen by the user. So you need some kind of authentication and permission handling to divide the documents. The easy way is to just create one database for each user on the backend and only allow to replicate that one. Creating that many databases is not really a problem with for example CouchDB, and it makes permission handling easy. But as soon as you want to query all of your data in the backend, it will bite back. Your data is not at a single place, it is distributed between all of the user specific databases. This becomes even more complex as soon as you store information together with the documents that is not allowed to be seen by outsiders. You not only have to decide which documents to replicate, but also which fields of them. So what you really want is a single datastore in the backend and then replicate only the allowed document parts to each of the users. This always requires you to implement your custom replication endpoint like what you do with RxDBs GraphQL Replication. ","version":"Next","tagName":"h2"},{"title":"You have to migrate the client database​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#you-have-to-migrate-the-client-database","content":" While developing your app, sooner or later you want to change the data layout. You want to add some new fields to documents or change the format of them. So you have to update the database schema and also migrate the stored documents. With 'normal' applications, this is already hard enough and often dangerous. You wait until midnight, stop the webserver, make a database backup, deploy the new schema and then you hope that nothing goes wrong while it updates that many documents. With offline first applications, it is even more fun. You do not only have to migrate your local backend database, you also have to provide a migration strategy for all of these client databases out there. And you also cannot migrate everything at the same time. The clients can only migrate when the new code was updated from the appstore or the user visited your website again. This could be today or in a few weeks. ","version":"Next","tagName":"h2"},{"title":"Performance is not native​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#performance-is-not-native","content":" When you create a web based offline first app, you cannot store data directly on the users filesystem. In fact there are many layers between your JavaScript code and the filesystem of the operation system. Let's say you insert a document in RxDB: You call the RxDB API to validate and store the dataRxDB calls the underlying RxStorage, for example PouchDB.Pouchdb calls its underlying storage adapterThe storage adapter calls IndexedDBThe browser runs its internal handling of the IndexedDB APIIn most browsers IndexedDB is implemented on top of SQLiteSQLite calls the OS to store the data in the filesystem All these layers are abstractions. They are not build for exactly that one use case, so you lose some performance to tunnel the data through the layer itself, and you also lose some performance because the abstraction does not exactly provide the functions that are needed by the layer above and it will overfetch data. You will not find a benchmark comparison between how many transactions per second you can run on the browser compared to a server based database. Because it makes no sense to compare them. Browsers are slower, JavaScript is slower. Is it fast enough? What you really care about is "Is it fast enough?". For most use cases, the answer is yes. Offline first apps are UI based and you do not need to process a million transactions per second, because your user will not click the save button that often. "Fast enough" means that the data is processed in under 16 milliseconds so that you can render the updated UI in the next frame. This is of course not true for all use cases, so you better think about the performance limit before starting with the implementation. ","version":"Next","tagName":"h2"},{"title":"Nothing is predictable​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#nothing-is-predictable","content":" You have a PostgreSQL database and run a query over 1000ths of rows, which takes 200 milliseconds. Works great, so you now want to do something similar at the client device in your offline first app. How long does it take? You cannot know because people have different devices, and even equal devices have different things running in the background that slow the CPUs. So you cannot predict performance and as described above, you cannot even predict the storage limit. So if your app does heavy data analytics, you might better run everything on the backend and just send the results to the client. ","version":"Next","tagName":"h2"},{"title":"There is no relational data​","type":1,"pageTitle":"Downsides of Local First / Offline First","url":"/downsides-of-offline-first.html#there-is-no-relational-data","content":" I started creating RxDB many years ago and while still maintaining it, I often worked with all these other offline first databases out there. RxDB and all of these other ones, are based on some kind of document databases similar to NoSQL. Often people want to have a relational database like the SQL one they use at the backend. So why are there no real relations in offline first databases? I could answer with these arguments like how JavaScript works better with document based data, how performance is better when having no joins or even how NoSQL queries are more composable. But the truth is, everything is NoSQL because it makes replication easy. An SQL query that mutates data in different tables based on some selects and joins, cannot be partially replicated without breaking the client. You have foreign keys that point to other rows and if these rows are not replicated yet, you have a problem. To implement a robust Sync Engine for relational data, you need some stuff like a reliable atomic clock and you have to block queries over multiple tables while a transaction replicated. Watch this guy implementing offline first replication on top of SQLite or read this discussion about implementing offline first in supabase. So creating replication for an SQL offline first database is way more work than just adding some network protocols on top of PostgreSQL. It might not even be possible for clients that have no reliable clock. ","version":"Next","tagName":"h2"},{"title":"Electron Database - RxDB with different storage for SQLite, Filesystem and In-Memory","type":0,"sectionRef":"#","url":"/electron-database.html","content":"","keywords":"","version":"Next"},{"title":"Databases for Electron​","type":1,"pageTitle":"Electron Database - RxDB with different storage for SQLite, Filesystem and In-Memory","url":"/electron-database.html#databases-for-electron","content":" An Electron runtime can be divided into two parts: The "main" process which is a Node.js JavaScript process that runs without a UI in the background.One or multiple "renderer" processes that consist of a Chrome browser engine and runs the user interface. Each renderer process represents one "browser tab". This is important to understand because choosing the right database depends on your use case and on which of these JavaScript runtimes you want to keep the data. ","version":"Next","tagName":"h2"},{"title":"Server Side Databases in Electron.js​","type":1,"pageTitle":"Electron Database - RxDB with different storage for SQLite, Filesystem and In-Memory","url":"/electron-database.html#server-side-databases-in-electronjs","content":" Because Electron runs on a desktop computer, you might think that it should be possible to use a common "server" database like MySQL, PostgreSQL or MongoDB. In theory, you could ship the correct database server binaries with your electron application and start a process on the client's device that exposes a port to the database that can be consumed by Electron. In practice, this is not a viable way to go because shipping the correct binaries and opening ports is way to complicated and troublesome. Instead you should use a database that can be bundled and run inside of Electron, either in the main or in the renderer process. ","version":"Next","tagName":"h3"},{"title":"Localstorage / IndexedDB / WebSQL as alternatives to SQLite in Electron​","type":1,"pageTitle":"Electron Database - RxDB with different storage for SQLite, Filesystem and In-Memory","url":"/electron-database.html#localstorage--indexeddb--websql-as-alternatives-to-sqlite-in-electron","content":" Because Electron uses a common Chrome web browser in the renderer process, you can access the common Web Storage APIs like Localstorage, IndexedDB and WebSQL. This is easy to set up and storing small sets of data can be achieved in a short span of time. But as soon as your application goes beyond a simple todo-app, there are multiple obstacles that come in your way. One thing is the bad multi-tab support. If you have more than one renderer process, it becomes hard to manage database writes between them. Each browser tab could modify the database state while the others do not know of the changes and keep an outdated UI. Another thing is performance. IndexedDB is slow, mostly because it has to go through layers of browser security and abstractions. Storing and querying a lot of data might become your performance bottleneck. Localstorage and WebSQL are even slower, by the way. Using these Web Storage APIs is generally only recommended when you know for sure that there will be always only one rendering process and performance is not that relevant. The main reason for that is the security- and abstraction layers that write- and read operations have to go through when using the browsers IndexedDB API. So instead of using IndexedDB in Electron in the renderer process, you should use something that runs in the "main" process in Node.js like the Filesystem RxStorage or the In Memory RxStorage. ","version":"Next","tagName":"h3"},{"title":"RxDB​","type":1,"pageTitle":"Electron Database - RxDB with different storage for SQLite, Filesystem and In-Memory","url":"/electron-database.html#rxdb","content":" RxDB is a NoSQL database for JavaScript applications. It has many features that come in handy when RxDB is used with UI based applications like your Electron app. For example, it is able to subscribe to query results of single fields of documents. It has encryption and compression features and most important it has a battle tested Sync Engine that can be used to do a realtime sync with your backend. Because of the flexible storage layer of RxDB, there are many options on how to use it with Electron: The memory RxStorage that stores the data inside of the JavaScript memory without persistenceThe SQLite RxStorageThe IndexedDB RxStorageThe LocalStorage RxStorageThe Dexie.js RxStorageThe Node.js Filesystem It is recommended to use the SQLite RxStorage because it has the best performance and is the easiest to set up. However it is part of the 👑 Premium Plugins which must be purchased, so to try out RxDB with Electron, you might want to use one of the other options. To start with RxDB, I would recommend using the LocalStorage RxStorage in the renderer processes. Because RxDB is able to broadcast the database state between browser tabs, having multiple renderer processes is not a problem like it would be when you use plain IndexedDB without RxDB. In production, you would always run the RxStorage in the main process with the RxStorage Electron IpcRenderer & IpcMain plugins. First, you have to install all dependencies via npm install rxdb rxjs. Then you can assemble the RxStorage and create a database with it: import { createRxDatabase } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; // create database const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageLocalstorage() }); // create collections const collections = await myRxDatabase.addCollections({ humans: { /* ... */ } }); // insert document await collections.humans.insert({id: 'foo', name: 'bar'}); // run a query const result = await collections.humans.find({ selector: { name: 'bar' } }).exec(); // observe a query await collections.humans.find({ selector: { name: 'bar' } }).$.subscribe(result => {/* ... */}); For better performance in the renderer tab, you can later switch to the IndexedDB RxStorage. But in production, it is recommended to use the SQLite RxStorage or the Filesystem RxStorage in the main process so that database operations do not block the rendering of the UI. To learn more about using RxDB with Electron, you might want to check out this example project. ","version":"Next","tagName":"h3"},{"title":"SQLite in Electron.js without RxDB​","type":1,"pageTitle":"Electron Database - RxDB with different storage for SQLite, Filesystem and In-Memory","url":"/electron-database.html#sqlite-in-electronjs-without-rxdb","content":" SQLite is a SQL based relational database written in the C programming language that was crafted to be embedded inside of applications and stores data locally. Operations are written in the SQL query language similar to the PostgreSQL syntax. Using SQLite in Electron is not possible in the renderer process, only in the main process. To communicate data operations between your main and your renderer processes, you have to use either @electron/remote (not recommended) or the ipcRenderer (recommended). So you start up SQLite in your main process and whenever you want to read or write data, you send the SQL queries to the main process and retrieve the result back as JSON data. To install SQLite, use the SQLite3 package which is a native Node.js module. You also need the @electron/rebuild package to rebuild the SQLite module against the currently installed Electron version. Install them with npm install sqlite3 @electron/rebuild. Then you can rebuild SQLite with ./node_modules/.bin/electron-rebuild -f -w sqlite3In the JavaScript code of your main process you can now create a database: const sqlite3 = require('sqlite3'); const db = new sqlite3.Database('/path/to/database/file.db'); // create a table and insert a row db.serialize(() => { db.run("CREATE TABLE Users (name, lastName)"); db.run("INSERT INTO Users VALUES (?, ?)", ['foo', 'bar']); }); Also you have to set up the ipcRenderer so that message from the renderer process are handled: ipcMain.handle('db-query', async (event, sqlQuery) => { return new Promise(res => { db.all(sqlQuery, (err, rows) => { res(rows); }); }); }); In your renderer process, you can now call the ipcHandler and fetch data from SQLite: const rows = await ipcRenderer.invoke('db-query', "SELECT * FROM Users"); The downside of SQLite (or SQL in general) is that it is lacking many features that are handful when using a database together with UI based applications. It is not possible to observe queries or document fields and there is no replication method to sync data with a server. This makes SQLite a good solution when you just want to store data on the client or process expensive SQL queries on the server, but it is not suitable for more complex operations like two-way replication, encryption, compression and so on. Also developer helpers like TypeScript type safety are totally out of reach. ","version":"Next","tagName":"h3"},{"title":"Follow up​","type":1,"pageTitle":"Electron Database - RxDB with different storage for SQLite, Filesystem and In-Memory","url":"/electron-database.html#follow-up","content":" Learn how to use RxDB as database in electron with the Quickstart Tutorial.Check out the RxDB Electron exampleThere is a followup list of other client side database alternatives that you can try to use with Electron. ","version":"Next","tagName":"h2"},{"title":"🔒 Encrypted Local Storage with RxDB","type":0,"sectionRef":"#","url":"/encryption.html","content":"","keywords":"","version":"Next"},{"title":"Querying encrypted data​","type":1,"pageTitle":"🔒 Encrypted Local Storage with RxDB","url":"/encryption.html#querying-encrypted-data","content":" RxDB handles the encryption and decryption of data internally. This means that when you work with a RxDocument, you can access the properties of the document just like you would with normal, unencrypted data. RxDB automatically decrypts the data for you when you retrieve it, making it transparent to your application code. This means the encryption works with all RxStorage like SQLite, IndexedDB, OPFS and so on. However, there's a limitation when it comes to querying encrypted fields. Encrypted fields cannot be used as operators in queries. This means you cannot perform queries like "find all documents where the encrypted field equals a certain value." RxDB does not expose the encrypted data in a way that allows direct querying based on the encrypted content. To filter or search for documents based on the contents of encrypted fields, you would need to first decrypt the data and then perform the query, which might not be efficient or practical in some cases. You could however use the memory mapped RxStorage to replicate the encrypted documents into a non-encrypted in-memory storage and then query them like normal. ","version":"Next","tagName":"h2"},{"title":"Password handling​","type":1,"pageTitle":"🔒 Encrypted Local Storage with RxDB","url":"/encryption.html#password-handling","content":" RxDB does not define how you should store or retrieve the encryption password. It only requires you to provide the password on database creation which grants you flexibility in how you manage encryption passwords. You could ask the user on app-start to insert the password, or you can retrieve the password from your backend on app start (or revoke access by no longer providing the password). ","version":"Next","tagName":"h2"},{"title":"Asymmetric encryption​","type":1,"pageTitle":"🔒 Encrypted Local Storage with RxDB","url":"/encryption.html#asymmetric-encryption","content":" The encryption plugin itself uses symmetric encryption with a password to guarantee best performance when reading and storing data. It is not able to do Asymmetric encryption by itself. If you need Asymmetric encryption with a private/publicKey, it is recommended to encrypted the password itself with the asymmetric keys and store the encrypted password beside the other data. On app-start you can decrypt the password with the private key and use the decrypted password in the RxDB encryption plugin ","version":"Next","tagName":"h2"},{"title":"Using the RxDB Encryption Plugins​","type":1,"pageTitle":"🔒 Encrypted Local Storage with RxDB","url":"/encryption.html#using-the-rxdb-encryption-plugins","content":" RxDB currently has two plugins for encryption: The free encryption-crypto-js plugin that is based on the AES algorithm of the crypto-js libraryThe 👑 premiumencryption-web-crypto plugin that is based on the native Web Crypto API which makes it faster and more secure to use. Document inserts are about 10x faster compared to crypto-js and it has a smaller build size because it uses the browsers API instead of bundling an npm module. An RxDB encryption plugin is a wrapper around any other RxStorage. 1 Wrap your RxStorage with the encryption​ import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; // wrap the normal storage with the encryption plugin const encryptedStorage = wrappedKeyEncryptionCryptoJsStorage({ storage: getRxStorageLocalstorage() }); 2 Create a RxDatabase with the wrapped storage​ Also you have to set a password when creating the database. The format of the password depends on which encryption plugin is used. import { createRxDatabase } from 'rxdb/plugins/core'; // create an encrypted database const db = await createRxDatabase({ name: 'mydatabase', storage: encryptedStorage, password: 'sudoLetMeIn' }); 3 Create an RxCollection with an encrypted property​ To define a field as being encrypted, you have to add it to the encrypted fields list in the schema. const schema = { version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 }, secret: { type: 'string' }, }, required: ['id'] encrypted: ['secret'] }; await db.addCollections({ myDocuments: { schema } }) ","version":"Next","tagName":"h2"},{"title":"Using Web-Crypto API​","type":1,"pageTitle":"🔒 Encrypted Local Storage with RxDB","url":"/encryption.html#using-web-crypto-api","content":" For professionals, we have the web-crypto👑 premium plugin which is faster and more secure: import { wrappedKeyEncryptionWebCryptoStorage, createPassword } from 'rxdb-premium/plugins/encryption-web-crypto'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; // wrap the normal storage with the encryption plugin const encryptedIndexedDbStorage = wrappedKeyEncryptionWebCryptoStorage({ storage: getRxStorageIndexedDB() }); const myPasswordObject = { // Algorithm can be oneOf: 'AES-CTR' | 'AES-CBC' | 'AES-GCM' algorithm: 'AES-CTR', password: 'myRandomPasswordWithMin8Length' }; // create an encrypted database const db = await createRxDatabase({ name: 'mydatabase', storage: encryptedIndexedDbStorage, password: myPasswordObject }); /* ... */ ","version":"Next","tagName":"h2"},{"title":"Changing the password​","type":1,"pageTitle":"🔒 Encrypted Local Storage with RxDB","url":"/encryption.html#changing-the-password","content":" The password is set database specific and it is not possible to change the password of a database. Opening an existing database with a different password will throw an error. To change the password you can either: Use the storage migration plugin to migrate the database state into a new database.Store a randomly created meta-password in a different RxDatabase as a value of a local document. Encrypt the meta password with the actual user password and read it out before creating the actual database. ","version":"Next","tagName":"h2"},{"title":"Encrypted attachments​","type":1,"pageTitle":"🔒 Encrypted Local Storage with RxDB","url":"/encryption.html#encrypted-attachments","content":" To store the attachments data encrypted, you have to set encrypted: true in the attachments property of the schema. const mySchema = { version: 0, type: 'object', properties: { /* ... */ }, attachments: { encrypted: true // if true, the attachment-data will be encrypted with the db-password } }; ","version":"Next","tagName":"h2"},{"title":"Encryption and workers​","type":1,"pageTitle":"🔒 Encrypted Local Storage with RxDB","url":"/encryption.html#encryption-and-workers","content":" If you are using Worker RxStorage or SharedWorker RxStorage with encryption, it's recommended to run encryption inside of the worker. Encryption can be very cpu intensive and would take away CPU-power from the main thread which is the main reason to use workers. You do not need to worry about setting the password inside of the worker. The password will be set when calling createRxDatabase from the main thread, and will be passed internally to the storage in the worker automatically. ","version":"Next","tagName":"h2"},{"title":"Fulltext Search","type":0,"sectionRef":"#","url":"/fulltext-search.html","content":"","keywords":"","version":"Next"},{"title":"Benefits of using a local fulltext search​","type":1,"pageTitle":"Fulltext Search","url":"/fulltext-search.html#benefits-of-using-a-local-fulltext-search","content":" Efficient Search and Indexing The plugin utilizes the FlexSearch library, known for its speed and memory efficiency. This ensures that search operations are performed quickly, even with large datasets. The search engine can handle multi-field queries, partial matching, and complex search operations, providing users with highly relevant results. Local Data Indexing With the plugin, all search operations are performed on the local data stored within the RxDB collections. This means that users can execute fulltext search queries without the need for an external server or database, which is especially beneficial for offline-first applications. The local indexing ensures that search queries are executed quickly, reducing the latency typically associated with remote database queries. Also when used in multiple browser tabs, it is ensured that through Leader Election, only exactly one tabs is doing the work of indexing without having an overhead in the other browser tabs. Real-time Indexing The plugin integrates seamlessly with RxDB's reactive nature. Every time a document is written to an RxCollection, an indexer updates the fulltext search index in real-time. This ensures that search results are always up-to-date, reflecting the most current state of the data without requiring manual reindexing. Persistent indexing The fulltext search index is efficiently persisted within the RxCollection, ensuring that the index remains intact across app restarts. When documents are added or updated in the collection, the index is incrementally updated in real-time, meaning only the changes are processed rather than reindexing the entire dataset. This incremental approach not only optimizes performance but also ensures that subsequent app launches are quick, as there's no need to reindex all the data from scratch, making the search feature both reliable and fast from the moment the app starts. When using an encrypted storage the index itself and incremental updates to it are stored fully encrypted and are only decrypted in-memory. Complex Query Support The FlexSearch-based plugin allows for sophisticated search queries, including multi-term and contextual searches. Users can perform complex searches that go beyond simple keyword matching, enabling more advanced use cases like searching for documents with specific phrases, relevance-based sorting, or even phonetic matching. Offline-First Support and Privacy As RxDB is designed with offline-first applications in mind, the fulltext search plugin supports this paradigm by ensuring that all search operations can be performed offline. This is crucial for applications that need to function in environments with intermittent or no internet connectivity, offering users a consistent and reliable search experience with zero latency. ","version":"Next","tagName":"h2"},{"title":"Using the RxDB Fulltext Search​","type":1,"pageTitle":"Fulltext Search","url":"/fulltext-search.html#using-the-rxdb-fulltext-search","content":" The flexsearch search is a RxDB Premium Package 👑 which must be purchased and imported from the rxdb-premium npm package. Step 1: Add the RxDBFlexSearchPlugin to RxDB. import { RxDBFlexSearchPlugin } from 'rxdb-premium/plugins/flexsearch'; import { addRxPlugin } from 'rxdb/plugins/core'; addRxPlugin(RxDBFlexSearchPlugin); Step 2: Create a RxFulltextSearch instance on top of a collection with the addFulltextSearch() function. import { addFulltextSearch } from 'rxdb-premium/plugins/flexsearch'; const flexSearch = await addFulltextSearch({ // unique identifier. Used to store metadata and continue indexing on restarts/reloads. identifier: 'my-search', // The source collection on whose documents the search is based on collection: myRxCollection, /** * Transforms the document data to a given searchable string. * This can be done by returning a single string property of the document * or even by concatenating and transforming multiple fields like: * doc => doc.firstName + ' ' + doc.lastName */ docToString: doc => doc.firstName, /** * (Optional) * Amount of documents to index at once. * See https://rxdb.info/rx-pipeline.html */ batchSize: number; /** * (Optional) * lazy: Initialize the in memory fulltext index at the first search query. * instant: Directly initialize so that the index is already there on the first query. * Default: 'instant' */ initialization: 'instant', /** * (Optional) * @link https://github.com/nextapps-de/flexsearch#index-options */ indexOptions: {}, }); Step 3: Run a search operation: // find all documents whose searchstring contains "foobar" const foundDocuments = await flexSearch.find('foobar'); /** * You can also use search options as second parameter * @link https://github.com/nextapps-de/flexsearch#search-options */ const foundDocuments = await flexSearch.find('foobar', { limit: 10 }); ","version":"Next","tagName":"h2"},{"title":"Install RxDB","type":0,"sectionRef":"#","url":"/install.html","content":"","keywords":"","version":"Next"},{"title":"npm​","type":1,"pageTitle":"Install RxDB","url":"/install.html#npm","content":" To install the latest release of rxdb and its dependencies and save it to your package.json, run: npm i rxdb --save ","version":"Next","tagName":"h2"},{"title":"peer-dependency​","type":1,"pageTitle":"Install RxDB","url":"/install.html#peer-dependency","content":" You also need to install the peer-dependency rxjs if you have not installed it before. npm i rxjs --save ","version":"Next","tagName":"h2"},{"title":"polyfills​","type":1,"pageTitle":"Install RxDB","url":"/install.html#polyfills","content":" RxDB is coded with es8 and transpiled to es5. This means you have to install polyfills to support older browsers. For example you can use the babel-polyfills with: npm i @babel/polyfill --save If you need polyfills, you have to import them in your code. import '@babel/polyfill'; ","version":"Next","tagName":"h2"},{"title":"Polyfill the global variable​","type":1,"pageTitle":"Install RxDB","url":"/install.html#polyfill-the-global-variable","content":" When you use RxDB with angular or other webpack based frameworks, you might get the error Uncaught ReferenceError: global is not defined. This is because some dependencies of RxDB assume a Node.js-specific global variable that is not added to browser runtimes by some bundlers. You have to add them by your own, like we do here. (window as any).global = window; (window as any).process = { env: { DEBUG: undefined }, }; ","version":"Next","tagName":"h2"},{"title":"Project Setup and Configuration​","type":1,"pageTitle":"Install RxDB","url":"/install.html#project-setup-and-configuration","content":" In the examples folder you can find CI tested projects for different frameworks and use cases, while in the /config folder base configuration files for Webpack, Rollup, Mocha, Karma, Typescript are exposed. Consult package.json for the versions of the packages supported. ","version":"Next","tagName":"h2"},{"title":"Installing the latest RxDB build​","type":1,"pageTitle":"Install RxDB","url":"/install.html#installing-the-latest-rxdb-build","content":" If you need the latest development state of RxDB, add it as git-dependency into your package.json. "dependencies": { "rxdb": "git+https://git@github.com/pubkey/rxdb.git#commitHash" } Replace commitHash with the hash of the latest build-commit. ","version":"Next","tagName":"h2"},{"title":"Import​","type":1,"pageTitle":"Install RxDB","url":"/install.html#import","content":" To import rxdb, add this to your JavaScript file to import the default bundle that contains the RxDB core: import { createRxDatabase, /* ... */ } from 'rxdb'; ","version":"Next","tagName":"h2"},{"title":"Key Compression","type":0,"sectionRef":"#","url":"/key-compression.html","content":"","keywords":"","version":"Next"},{"title":"Enable key compression​","type":1,"pageTitle":"Key Compression","url":"/key-compression.html#enable-key-compression","content":" The key compression plugin is a wrapper around any other RxStorage. 1 Wrap your RxStorage with the key compression plugin​ import { wrappedKeyCompressionStorage } from 'rxdb/plugins/key-compression'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const storageWithKeyCompression = wrappedKeyCompressionStorage({ storage: getRxStorageLocalstorage() }); 2 Create an RxDatabase​ import { createRxDatabase } from 'rxdb/plugins/core'; const db = await createRxDatabase({ name: 'mydatabase', storage: storageWithKeyCompression }); 3 Create a compressed RxCollection​ const mySchema = { keyCompression: true, // set this to true, to enable the keyCompression version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 // <- the primary key must have set maxLength } /* ... */ } }; await db.addCollections({ docs: { schema: mySchema } }); ","version":"Next","tagName":"h2"},{"title":"Leader-Election","type":0,"sectionRef":"#","url":"/leader-election.html","content":"","keywords":"","version":"Next"},{"title":"Use-case-example​","type":1,"pageTitle":"Leader-Election","url":"/leader-election.html#use-case-example","content":" Imagine we have a website which displays the current temperature of the visitors location in various charts, numbers or heatmaps. To always display the live-data, the website opens a websocket to our API-Server which sends the current temperature every 10 seconds. Using the way most sites are currently build, we can now open it in 5 browser-tabs and it will open 5 websockets which send data 6*5=30 times per minute. This will not only waste the power of your clients device, but also wastes your api-servers resources by opening redundant connections. ","version":"Next","tagName":"h2"},{"title":"Solution​","type":1,"pageTitle":"Leader-Election","url":"/leader-election.html#solution","content":" The solution to this redundancy is the usage of a leader-election-algorithm which makes sure that always exactly one tab is managing the remote-data-access. The managing tab is the elected leader and stays leader until it is closed. No matter how many tabs are opened or closed, there must be always exactly one leader. You could now start implementing a messaging-system between your browser-tabs, hand out which one is leader, solve conflicts and reassign a new leader when the old one 'dies'. Or just use RxDB which does all these things for you. ","version":"Next","tagName":"h2"},{"title":"Add the leader election plugin​","type":1,"pageTitle":"Leader-Election","url":"/leader-election.html#add-the-leader-election-plugin","content":" To enable the leader election, you have to add the leader-election plugin. import { addRxPlugin } from 'rxdb'; import { RxDBLeaderElectionPlugin } from 'rxdb/plugins/leader-election'; addRxPlugin(RxDBLeaderElectionPlugin); ","version":"Next","tagName":"h2"},{"title":"Code-example​","type":1,"pageTitle":"Leader-Election","url":"/leader-election.html#code-example","content":" To make it easy, here is an example where the temperature is pulled every ten seconds and saved to a collection. The pulling starts at the moment where the opened tab becomes the leader. import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'weatherDB', storage: getRxStorageLocalstorage(), password: 'myPassword', multiInstance: true }); await db.addCollections({ temperature: { schema: mySchema } }); db.waitForLeadership() .then(() => { console.log('Long lives the king!'); // <- runs when db becomes leader setInterval(async () => { const temp = await fetch('https://example.com/api/temp/'); db.temperature.insert({ degrees: temp, time: new Date().getTime() }); }, 1000 * 10); }); ","version":"Next","tagName":"h2"},{"title":"Handle Duplicate Leaders​","type":1,"pageTitle":"Leader-Election","url":"/leader-election.html#handle-duplicate-leaders","content":" On rare occasions, it can happen that more than one leader is elected. This can happen when the CPU is on 100% or for any other reason the JavaScript process is fully blocked for a long time. For most cases this is not really problem because on duplicate leaders, both browser tabs replicate with the same backend anyways. To handle the duplicate leader event, you can access the leader elector and set a handler: import { getLeaderElectorByBroadcastChannel } from 'rxdb/plugins/leader-election'; const leaderElector = getLeaderElectorByBroadcastChannel(broadcastChannel); leaderElector.onduplicate = async () => { // Duplicate leader detected -> reload the page. location.reload(); } ","version":"Next","tagName":"h2"},{"title":"Live-Example​","type":1,"pageTitle":"Leader-Election","url":"/leader-election.html#live-example","content":" In this example the leader is marked with the crown ♛ ","version":"Next","tagName":"h2"},{"title":"Try it out​","type":1,"pageTitle":"Leader-Election","url":"/leader-election.html#try-it-out","content":" Run the angular-example where the leading tab is marked with a crown on the top-right-corner. ","version":"Next","tagName":"h2"},{"title":"Notice​","type":1,"pageTitle":"Leader-Election","url":"/leader-election.html#notice","content":" The leader election is implemented via the broadcast-channel module. The leader is elected between different processes on the same javascript-runtime. Like multiple tabs in the same browser or multiple NodeJs-processes on the same machine. It will not run between different replicated instances. ","version":"Next","tagName":"h2"},{"title":"RxDB Logger Plugin","type":0,"sectionRef":"#","url":"/logger.html","content":"","keywords":"","version":"Next"},{"title":"Using the logger plugin​","type":1,"pageTitle":"RxDB Logger Plugin","url":"/logger.html#using-the-logger-plugin","content":" The logger is a wrapper that can be wrapped around any RxStorage. Once your storage is wrapped, you can create your database with the wrapped storage and the logging will automatically happen. import { wrappedLoggerStorage } from 'rxdb-premium/plugins/logger'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; // wrap a storage with the logger const loggingStorage = wrappedLoggerStorage({ storage: getRxStorageIndexedDB({}) }); // create your database with the wrapped storage const db = await createRxDatabase({ name: 'mydatabase', storage: loggingStorage }); // create collections etc... ","version":"Next","tagName":"h2"},{"title":"Specify what to be logged​","type":1,"pageTitle":"RxDB Logger Plugin","url":"/logger.html#specify-what-to-be-logged","content":" By default, the plugin will log all operations and it will also run a console.time()/console.timeEnd() around each operation. You can specify what to log so that your logs are less noisy. For this you provide a settings object when calling wrappedLoggerStorage(). const loggingStorage = wrappedLoggerStorage({ storage: getRxStorageIndexedDB({}), settings: { // can used to prefix all log strings, default='' prefix: 'my-prefix', /** * Be default, all settings are true. */ // if true, it will log timings with console.time() and console.timeEnd() times: true, // if false, it will not log meta storage instances like used in replication metaStorageInstances: true, // operations bulkWrite: true, findDocumentsById: true, query: true, count: true, info: true, getAttachmentData: true, getChangedDocumentsSince: true, cleanup: true, close: true, remove: true } }); ","version":"Next","tagName":"h2"},{"title":"Using custom logging functions​","type":1,"pageTitle":"RxDB Logger Plugin","url":"/logger.html#using-custom-logging-functions","content":" With the logger plugin you can also run custom log functions for all operations. const loggingStorage = wrappedLoggerStorage({ storage: getRxStorageIndexedDB({}), onOperationStart: (operationsName, logId, args) => void, onOperationEnd: (operationsName, logId, args) => void, onOperationError: (operationsName, logId, args, error) => void }); ","version":"Next","tagName":"h2"},{"title":"RxDB Error Messages","type":0,"sectionRef":"#","url":"/errors.html","content":"","keywords":"","version":"Next"},{"title":"All RxDB error messages​","type":1,"pageTitle":"RxDB Error Messages","url":"/errors.html#all-rxdb-error-messages","content":" Code: UT1 Given name is no string or empty Search In CodeSearch In IssuesSearch In Chat Code: UT2 Collection- and database-names must match the regex to be compatible with couchdb databases. See https://neighbourhood.ie/blog/2020/10/13/everything-you-need-to-know-about-couchdb-database-names/ info: if your database-name specifies a folder, the name must contain the slash-char '/' or '\\' Search In CodeSearch In IssuesSearch In Chat Code: UT3 Replication-direction must either be push or pull or both. But not none Search In CodeSearch In IssuesSearch In Chat Code: UT4 Given leveldown is no valid adapter Search In CodeSearch In IssuesSearch In Chat Code: UT5 KeyCompression is set to true in the schema but no key-compression handler is used in the storage Search In CodeSearch In IssuesSearch In Chat Code: UT6 Schema contains encrypted fields but no encryption handler is used in the storage Search In CodeSearch In IssuesSearch In Chat Code: UT7 Attachments.compression is enabled but no attachment-compression plugin is used Search In CodeSearch In IssuesSearch In Chat Code: UT8 Crypto.subtle.digest is not available in your runtime. For expo/react-native see https://discord.com/channels/969553741705539624/1341392686267109458/1343639513850843217 Search In CodeSearch In IssuesSearch In Chat Code: PL1 Given plugin is not RxDB plugin. Search In CodeSearch In IssuesSearch In Chat Code: PL3 A plugin with the same name was already added but it was not the exact same JavaScript object Search In CodeSearch In IssuesSearch In Chat Code: P2 BulkWrite() cannot be called with an empty array Search In CodeSearch In IssuesSearch In Chat Code: QU1 RxQuery._execOverDatabase(): op not known Search In CodeSearch In IssuesSearch In Chat Code: QU4 RxQuery.regex(): You cannot use .regex() on the primary field Search In CodeSearch In IssuesSearch In Chat Code: QU5 RxQuery.sort(): does not work because key is not defined in the schema Search In CodeSearch In IssuesSearch In Chat Code: QU6 RxQuery.limit(): cannot be called on .findOne() Search In CodeSearch In IssuesSearch In Chat Code: QU9 ThrowIfMissing can only be used in findOne queries Search In CodeSearch In IssuesSearch In Chat Code: QU10 Result empty and throwIfMissing: true Search In CodeSearch In IssuesSearch In Chat Code: QU11 RxQuery: no valid query params given Search In CodeSearch In IssuesSearch In Chat Code: QU12 Given index is not in schema Search In CodeSearch In IssuesSearch In Chat Code: QU13 A top level field of the query is not included in the schema Search In CodeSearch In IssuesSearch In Chat Code: QU14 Running a count() query in slow mode is now allowed. Either run a count() query with a selector that fully matches an index or set allowSlowCount=true when calling the createRxDatabase Search In CodeSearch In IssuesSearch In Chat Code: QU15 For count queries it is not allowed to use skip or limit Search In CodeSearch In IssuesSearch In Chat Code: QU16 $regex queries must be defined by a string, not an RegExp instance. This is because RegExp objects cannot be JSON stringified and also they are mutable which would be dangerous Search In CodeSearch In IssuesSearch In Chat Code: QU17 Chained queries cannot be used on findByIds() RxQuery instances Search In CodeSearch In IssuesSearch In Chat Code: QU18 Malformed query result data. This likely happens because you create a OPFS-storage RxDatabase inside of a worker but did not set the usesRxDatabaseInWorker setting. https://rxdb.info/rx-storage-opfs.html?console=opfs#setting-usesrxdatabaseinworker-when-a-rxdatabase-is-also-used-inside-of-the-worker Search In CodeSearch In IssuesSearch In Chat Code: QU19 Queries must not contain fields or properties with the value `undefined`: https://github.com/pubkey/rxdb/issues/6792#issuecomment-2624555824 Search In CodeSearch In IssuesSearch In Chat Code: MQ1 Path must be a string or object Search In CodeSearch In IssuesSearch In Chat Code: MQ2 Invalid argument Search In CodeSearch In IssuesSearch In Chat Code: MQ3 Invalid sort() argument. Must be a string, object, or array Search In CodeSearch In IssuesSearch In Chat Code: MQ4 Invalid argument. Expected instanceof mquery or plain object Search In CodeSearch In IssuesSearch In Chat Code: MQ5 Method must be used after where() when called with these arguments Search In CodeSearch In IssuesSearch In Chat Code: MQ6 Can't mix sort syntaxes. Use either array or object | .sort([['field', 1], ['test', -1]]) | .sort({ field: 1, test: -1 }) Search In CodeSearch In IssuesSearch In Chat Code: MQ7 Invalid sort value Search In CodeSearch In IssuesSearch In Chat Code: MQ8 Can't mix sort syntaxes. Use either array or object Search In CodeSearch In IssuesSearch In Chat Code: DB1 RxDocument.prepare(): another instance on this adapter has a different password Search In CodeSearch In IssuesSearch In Chat Code: DB2 RxDatabase.addCollections(): collection-names cannot start with underscore _ Search In CodeSearch In IssuesSearch In Chat Code: DB3 RxDatabase.addCollections(): collection already exists. use myDatabase[collectionName] to get it Search In CodeSearch In IssuesSearch In Chat Code: DB4 RxDatabase.addCollections(): schema is missing Search In CodeSearch In IssuesSearch In Chat Code: DB5 RxDatabase.addCollections(): collection-name not allowed Search In CodeSearch In IssuesSearch In Chat Code: DB6 RxDatabase.addCollections(): another instance created this collection with a different schema. Read thishttps://rxdb.info/rx-schema.html?console=qa#faq Search In CodeSearch In IssuesSearch In Chat Code: DB8 CreateRxDatabase(): A RxDatabase with the same name and adapter already exists. Make sure to use this combination of storage+databaseName only once If you have the duplicate database on purpose to simulate multi-tab behavior in unit tests, set "ignoreDuplicate: true". As alternative you can set "closeDuplicates: true" like if this happens in your react projects with hot reload that reloads the code without reloading the process. Search In CodeSearch In IssuesSearch In Chat Code: DB9 IgnoreDuplicate is only allowed in dev-mode and must never be used in production Search In CodeSearch In IssuesSearch In Chat Code: DB11 CreateRxDatabase(): Invalid db-name, folder-paths must not have an ending slash Search In CodeSearch In IssuesSearch In Chat Code: DB12 RxDatabase.addCollections(): could not write to internal store Search In CodeSearch In IssuesSearch In Chat Code: DB13 CreateRxDatabase(): Invalid db-name or collection name, name contains the dollar sign Search In CodeSearch In IssuesSearch In Chat Code: DB14 No custom reactivity factory added on database creation Search In CodeSearch In IssuesSearch In Chat Code: COL1 RxDocument.insert() You cannot insert an existing document Search In CodeSearch In IssuesSearch In Chat Code: COL2 RxCollection.insert() fieldName ._id can only be used as primaryKey Search In CodeSearch In IssuesSearch In Chat Code: COL3 RxCollection.upsert() does not work without primary Search In CodeSearch In IssuesSearch In Chat Code: COL4 RxCollection.incrementalUpsert() does not work without primary Search In CodeSearch In IssuesSearch In Chat Code: COL5 RxCollection.find() if you want to search by _id, use .findOne(_id) Search In CodeSearch In IssuesSearch In Chat Code: COL6 RxCollection.findOne() needs a queryObject or string. Notice that in RxDB, primary keys must be strings and cannot be numbers. Search In CodeSearch In IssuesSearch In Chat Code: COL7 Hook must be a function Search In CodeSearch In IssuesSearch In Chat Code: COL8 Hooks-when not known Search In CodeSearch In IssuesSearch In Chat Code: COL9 RxCollection.addHook() hook-name not known Search In CodeSearch In IssuesSearch In Chat Code: COL10 RxCollection .postCreate-hooks cannot be async Search In CodeSearch In IssuesSearch In Chat Code: COL11 MigrationStrategies must be an object Search In CodeSearch In IssuesSearch In Chat Code: COL12 A migrationStrategy is missing or too much Search In CodeSearch In IssuesSearch In Chat Code: COL13 MigrationStrategy must be a function Search In CodeSearch In IssuesSearch In Chat Code: COL14 Given static method-name is not a string Search In CodeSearch In IssuesSearch In Chat Code: COL15 Static method-names cannot start with underscore _ Search In CodeSearch In IssuesSearch In Chat Code: COL16 Given static method is not a function Search In CodeSearch In IssuesSearch In Chat Code: COL17 RxCollection.ORM: statics-name not allowed Search In CodeSearch In IssuesSearch In Chat Code: COL18 Collection-method not allowed because fieldname is in the schema Search In CodeSearch In IssuesSearch In Chat Code: COL20 Storage write error Search In CodeSearch In IssuesSearch In Chat Code: COL21 The RxCollection is closed or removed already, either from this JavaScript realm or from another, like a browser tab Search In CodeSearch In IssuesSearch In Chat Code: CONFLICT Document update conflict. When changing a document you must work on the previous revision Search In CodeSearch In IssuesSearch In Chat Code: COL22 .bulkInsert() and .bulkUpsert() cannot be run with multiple documents that have the same primary key Search In CodeSearch In IssuesSearch In Chat Code: COL23 In the open-source version of RxDB, the amount of collections that can exist in parallel is limited to 16. If you already purchased the premium access, you can remove this limit: https://rxdb.info/rx-collection.html?console=limit#faq Search In CodeSearch In IssuesSearch In Chat Code: DOC1 RxDocument.get$ cannot get observable of in-array fields because order cannot be guessed Search In CodeSearch In IssuesSearch In Chat Code: DOC2 Cannot observe primary path Search In CodeSearch In IssuesSearch In Chat Code: DOC3 Final fields cannot be observed Search In CodeSearch In IssuesSearch In Chat Code: DOC4 RxDocument.get$ cannot observe a non-existed field Search In CodeSearch In IssuesSearch In Chat Code: DOC5 RxDocument.populate() cannot populate a non-existed field Search In CodeSearch In IssuesSearch In Chat Code: DOC6 RxDocument.populate() cannot populate because path has no ref Search In CodeSearch In IssuesSearch In Chat Code: DOC7 RxDocument.populate() ref-collection not in database Search In CodeSearch In IssuesSearch In Chat Code: DOC8 RxDocument.set(): primary-key cannot be modified Search In CodeSearch In IssuesSearch In Chat Code: DOC9 Final fields cannot be modified Search In CodeSearch In IssuesSearch In Chat Code: DOC10 RxDocument.set(): cannot set childpath when rootPath not selected Search In CodeSearch In IssuesSearch In Chat Code: DOC11 RxDocument.save(): can't save deleted document Search In CodeSearch In IssuesSearch In Chat Code: DOC13 RxDocument.remove(): Document is already deleted Search In CodeSearch In IssuesSearch In Chat Code: DOC14 RxDocument.close() does not exist Search In CodeSearch In IssuesSearch In Chat Code: DOC15 Query cannot be an array Search In CodeSearch In IssuesSearch In Chat Code: DOC16 Since version 8.0.0 RxDocument.set() can only be called on temporary RxDocuments Search In CodeSearch In IssuesSearch In Chat Code: DOC17 Since version 8.0.0 RxDocument.save() can only be called on non-temporary documents Search In CodeSearch In IssuesSearch In Chat Code: DOC18 Document property for composed primary key is missing Search In CodeSearch In IssuesSearch In Chat Code: DOC19 Value of primary key(s) cannot be changed Search In CodeSearch In IssuesSearch In Chat Code: DOC20 PrimaryKey missing Search In CodeSearch In IssuesSearch In Chat Code: DOC21 PrimaryKey must be equal to PrimaryKey.trim(). It cannot start or end with a whitespace Search In CodeSearch In IssuesSearch In Chat Code: DOC22 PrimaryKey must not contain a linebreak Search In CodeSearch In IssuesSearch In Chat Code: DOC23 PrimaryKey must not contain a double-quote ["] Search In CodeSearch In IssuesSearch In Chat Code: DOC24 Given document data could not be structured cloned. This happens if you pass non-plain-json data into it, like a Date() object or a Function. In vue.js this happens if you use ref() on the document data which transforms it into a Proxy object. Search In CodeSearch In IssuesSearch In Chat Code: DM1 Migrate() Migration has already run Search In CodeSearch In IssuesSearch In Chat Code: DM2 Migration of document failed final document does not match final schema Search In CodeSearch In IssuesSearch In Chat Code: DM3 Migration already running Search In CodeSearch In IssuesSearch In Chat Code: DM4 Migration errored Search In CodeSearch In IssuesSearch In Chat Code: DM5 Cannot open database state with newer RxDB version. You have to migrate your database state first. See https://rxdb.info/migration-storage.html?console=storage Search In CodeSearch In IssuesSearch In Chat Code: AT1 To use attachments, please define this in your schema Search In CodeSearch In IssuesSearch In Chat Code: EN1 Password is not valid Search In CodeSearch In IssuesSearch In Chat Code: EN2 ValidatePassword: min-length of password not complied Search In CodeSearch In IssuesSearch In Chat Code: EN3 Schema contains encrypted properties but no password is given Search In CodeSearch In IssuesSearch In Chat Code: EN4 Password not valid Search In CodeSearch In IssuesSearch In Chat Code: JD1 You must create the collections before you can import their data Search In CodeSearch In IssuesSearch In Chat Code: JD2 RxCollection.importJSON(): the imported json relies on a different schema Search In CodeSearch In IssuesSearch In Chat Code: JD3 RxCollection.importJSON(): json.passwordHash does not match the own Search In CodeSearch In IssuesSearch In Chat Code: LD1 RxDocument.allAttachments$ can't use attachments on local documents Search In CodeSearch In IssuesSearch In Chat Code: LD2 RxDocument.get(): objPath must be a string Search In CodeSearch In IssuesSearch In Chat Code: LD3 RxDocument.get$ cannot get observable of in-array fields because order cannot be guessed Search In CodeSearch In IssuesSearch In Chat Code: LD4 Cannot observe primary path Search In CodeSearch In IssuesSearch In Chat Code: LD5 RxDocument.set() id cannot be modified Search In CodeSearch In IssuesSearch In Chat Code: LD6 LocalDocument: Function is not usable on local documents Search In CodeSearch In IssuesSearch In Chat Code: LD7 Local document already exists Search In CodeSearch In IssuesSearch In Chat Code: LD8 LocalDocuments not activated. Set localDocuments=true on creation, when you want to store local documents on the RxDatabase or RxCollection. Search In CodeSearch In IssuesSearch In Chat Code: RC1 Replication: already added Search In CodeSearch In IssuesSearch In Chat Code: RC2 ReplicateCouchDB() query must be from the same RxCollection Search In CodeSearch In IssuesSearch In Chat Code: RC4 RxCouchDBReplicationState.awaitInitialReplication() cannot await initial replication when live: true Search In CodeSearch In IssuesSearch In Chat Code: RC5 RxCouchDBReplicationState.awaitInitialReplication() cannot await initial replication if multiInstance because the replication might run on another instance Search In CodeSearch In IssuesSearch In Chat Code: RC6 SyncFirestore() serverTimestampField MUST NOT be part of the collections schema and MUST NOT be nested. Search In CodeSearch In IssuesSearch In Chat Code: RC7 SimplePeer requires to have process.nextTick() polyfilled, see https://rxdb.info/replication-webrtc.html?console=webrtc Search In CodeSearch In IssuesSearch In Chat Code: RC_PULL RxReplication pull handler threw an error - see .errors for more details Search In CodeSearch In IssuesSearch In Chat Code: RC_STREAM RxReplication pull stream$ threw an error - see .errors for more details Search In CodeSearch In IssuesSearch In Chat Code: RC_PUSH RxReplication push handler threw an error - see .errors for more details Search In CodeSearch In IssuesSearch In Chat Code: RC_PUSH_NO_AR RxReplication push handler did not return an array with the conflicts Search In CodeSearch In IssuesSearch In Chat Code: RC_WEBRTC_PEER RxReplication WebRTC Peer has error Search In CodeSearch In IssuesSearch In Chat Code: RC_COUCHDB_1 ReplicateCouchDB() url must end with a slash like 'https://example.com/mydatabase/' Search In CodeSearch In IssuesSearch In Chat Code: RC_COUCHDB_2 ReplicateCouchDB() did not get valid result with rows. Search In CodeSearch In IssuesSearch In Chat Code: RC_OUTDATED Outdated client, update required. Replication was canceled Search In CodeSearch In IssuesSearch In Chat Code: RC_UNAUTHORIZED Unauthorized client, update the replicationState.headers to set correct auth data Search In CodeSearch In IssuesSearch In Chat Code: RC_FORBIDDEN Client behaves wrong so the replication was canceled. Mostly happens if the client tries to write data that it is not allowed to Search In CodeSearch In IssuesSearch In Chat Code: SC1 Fieldnames do not match the regex Search In CodeSearch In IssuesSearch In Chat Code: SC2 SchemaCheck: name 'item' reserved for array-fields Search In CodeSearch In IssuesSearch In Chat Code: SC3 SchemaCheck: fieldname has a ref-array but items-type is not string Search In CodeSearch In IssuesSearch In Chat Code: SC4 SchemaCheck: fieldname has a ref but is not type string, [string,null] or array<string> Search In CodeSearch In IssuesSearch In Chat Code: SC6 SchemaCheck: primary can only be defined at top-level Search In CodeSearch In IssuesSearch In Chat Code: SC7 SchemaCheck: default-values can only be defined at top-level Search In CodeSearch In IssuesSearch In Chat Code: SC8 SchemaCheck: first level-fields cannot start with underscore _ Search In CodeSearch In IssuesSearch In Chat Code: SC10 SchemaCheck: schema defines ._rev, this will be done automatically Search In CodeSearch In IssuesSearch In Chat Code: SC11 SchemaCheck: schema needs a number >=0 as version Search In CodeSearch In IssuesSearch In Chat Code: SC13 SchemaCheck: primary is always index, do not declare it as index Search In CodeSearch In IssuesSearch In Chat Code: SC14 SchemaCheck: primary is always unique, do not declare it as index Search In CodeSearch In IssuesSearch In Chat Code: SC15 SchemaCheck: primary cannot be encrypted Search In CodeSearch In IssuesSearch In Chat Code: SC16 SchemaCheck: primary must have type: string Search In CodeSearch In IssuesSearch In Chat Code: SC17 SchemaCheck: top-level fieldname is not allowed. See https://rxdb.info/rx-schema.html?console=toplevel#non-allowed-properties Search In CodeSearch In IssuesSearch In Chat Code: SC18 SchemaCheck: indexes must be an array Search In CodeSearch In IssuesSearch In Chat Code: SC19 SchemaCheck: indexes must contain strings or arrays of strings Search In CodeSearch In IssuesSearch In Chat Code: SC20 SchemaCheck: indexes.array must contain strings Search In CodeSearch In IssuesSearch In Chat Code: SC21 SchemaCheck: given index is not defined in schema Search In CodeSearch In IssuesSearch In Chat Code: SC22 SchemaCheck: given indexKey is not type:string Search In CodeSearch In IssuesSearch In Chat Code: SC23 SchemaCheck: fieldname is not allowed Search In CodeSearch In IssuesSearch In Chat Code: SC24 SchemaCheck: required fields must be set via array. See https://spacetelescope.github.io/understanding-json-schema/reference/object.html#required Search In CodeSearch In IssuesSearch In Chat Code: SC25 SchemaCheck: compoundIndexes needs to be specified in the indexes field Search In CodeSearch In IssuesSearch In Chat Code: SC26 SchemaCheck: indexes needs to be specified at collection schema level Search In CodeSearch In IssuesSearch In Chat Code: SC28 SchemaCheck: encrypted fields is not defined in the schema Search In CodeSearch In IssuesSearch In Chat Code: SC29 SchemaCheck: missing object key 'properties' Search In CodeSearch In IssuesSearch In Chat Code: SC30 SchemaCheck: primaryKey is required Search In CodeSearch In IssuesSearch In Chat Code: SC32 SchemaCheck: primary field must have the type string/number/integer Search In CodeSearch In IssuesSearch In Chat Code: SC33 SchemaCheck: used primary key is not a property in the schema Search In CodeSearch In IssuesSearch In Chat Code: SC34 Fields of type string that are used in an index, must have set the maxLength attribute in the schema Search In CodeSearch In IssuesSearch In Chat Code: SC35 Fields of type number/integer that are used in an index, must have set the multipleOf attribute in the schema Search In CodeSearch In IssuesSearch In Chat Code: SC36 A field of this type cannot be used as index Search In CodeSearch In IssuesSearch In Chat Code: SC37 Fields of type number that are used in an index, must have set the minimum and maximum attribute in the schema Search In CodeSearch In IssuesSearch In Chat Code: SC38 Fields of type boolean that are used in an index, must be required in the schema Search In CodeSearch In IssuesSearch In Chat Code: SC39 The primary key must have the maxLength attribute set. Ensure you use the dev-mode plugin when developing with RxDB. Search In CodeSearch In IssuesSearch In Chat Code: SC40 $ref fields in the schema are not allowed. RxDB cannot resolve related schemas because it would have a negative performance impact.It would have to run http requests on runtime. $ref fields should be resolved during build time. Search In CodeSearch In IssuesSearch In Chat Code: SC41 Minimum, maximum and maxLength values for indexes must be real numbers, not Infinity or -Infinity Search In CodeSearch In IssuesSearch In Chat Code: SC42 Primary key and also indexed fields which are strings, must have a maxLength that is <= 2048. Notice that having a big maxLength can negatively affect the performance. Only set it as big as it has to be. Search In CodeSearch In IssuesSearch In Chat Code: DVM1 When dev-mode is enabled, your storage must use one of the schema validators at the top level. This is because most problems people have with RxDB is because they store data that is not valid to the schema which causes strange bugs and problems. Search In CodeSearch In IssuesSearch In Chat Code: VD1 Sub-schema not found, does the schemaPath exists in your schema? Search In CodeSearch In IssuesSearch In Chat Code: VD2 Object does not match schema Search In CodeSearch In IssuesSearch In Chat Code: S1 You cannot create collections after calling RxDatabase.server() Search In CodeSearch In IssuesSearch In Chat Code: GQL1 GraphQL replication: cannot find sub schema by key Search In CodeSearch In IssuesSearch In Chat Code: GQL3 GraphQL replication: pull returns more documents then batchSize Search In CodeSearch In IssuesSearch In Chat Code: CRDT1 CRDT operations cannot be used because the crdt options are not set in the schema. Search In CodeSearch In IssuesSearch In Chat Code: CRDT2 RxDocument.incrementalModify() cannot be used when CRDTs are activated. Search In CodeSearch In IssuesSearch In Chat Code: CRDT3 To use CRDTs you MUST NOT set a conflictHandler because the default CRDT conflict handler must be used Search In CodeSearch In IssuesSearch In Chat Code: DXE1 Non-required index fields are not possible with the dexie.js RxStorage: https://github.com/pubkey/rxdb/pull/6643#issuecomment-2505310082 Search In CodeSearch In IssuesSearch In Chat Code: SQL1 The trial version of the SQLite storage does not support attachments. Search In CodeSearch In IssuesSearch In Chat Code: SQL2 The trial version of the SQLite storage is limited to contain 300 documents Search In CodeSearch In IssuesSearch In Chat Code: SQL3 The trial version of the SQLite storage is limited to running 500 operations Search In CodeSearch In IssuesSearch In Chat Code: RM1 Cannot communicate with a remote that was build on a different RxDB version. Did you forget to rebuild your workers when updating RxDB? Search In CodeSearch In IssuesSearch In Chat Code: MG1 If _id is used as primaryKey, all documents in the MongoDB instance must have a string-value as _id, not an ObjectId or number Search In CodeSearch In IssuesSearch In Chat Code: R1 You must provide a valid RxDatabase to the the RxDatabaseProvider Search In CodeSearch In IssuesSearch In Chat Code: R2 Could not find database in context, please ensure the component is wrapped in a <RxDatabaseProvider> Search In CodeSearch In IssuesSearch In Chat Code: R3 The provided value for the collection parameter is not a valid RxCollection Search In CodeSearch In IssuesSearch In Chat Code: SNH This should never happen Search In CodeSearch In IssuesSearch In Chat ","version":"Next","tagName":"h2"},{"title":"Migrate Database Data on schema changes","type":0,"sectionRef":"#","url":"/migration-schema.html","content":"","keywords":"","version":"Next"},{"title":"Providing strategies​","type":1,"pageTitle":"Migrate Database Data on schema changes","url":"/migration-schema.html#providing-strategies","content":" Upon creation of a collection, you have to provide migrationStrategies when your schema's version-number is greater than 0. To do this, you have to add an object to the migrationStrategies property where a function for every schema-version is assigned. A migrationStrategy is a function which gets the old document-data as a parameter and returns the new, transformed document-data. If the strategy returns null, the document will be removed instead of migrated. myDatabase.addCollections({ messages: { schema: messageSchemaV1, migrationStrategies: { // 1 means, this transforms data from version 0 to version 1 1: function(oldDoc){ oldDoc.time = new Date(oldDoc.time).getTime(); // string to unix return oldDoc; } } } }); Asynchronous strategies can also be used: myDatabase.addCollections({ messages: { schema: messageSchemaV1, migrationStrategies: { 1: function(oldDoc){ oldDoc.time = new Date(oldDoc.time).getTime(); // string to unix return oldDoc; }, /** * 2 means, this transforms data from version 1 to version 2 * this returns a promise which resolves with the new document-data */ 2: function(oldDoc){ // in the new schema (version: 2) we defined 'senderCountry' as required field (string) // so we must get the country of the message-sender from the server const coordinates = oldDoc.coordinates; return fetch('http://myserver.com/api/countryByCoordinates/'+coordinates+'/') .then(response => { const response = response.json(); oldDoc.senderCountry = response; return oldDoc; }); } } } }); you can also filter which documents should be migrated: myDatabase.addCollections({ messages: { schema: messageSchemaV1, migrationStrategies: { // 1 means, this transforms data from version 0 to version 1 1: function(oldDoc){ oldDoc.time = new Date(oldDoc.time).getTime(); // string to unix return oldDoc; }, /** * this removes all documents older then 2017-02-12 * they will not appear in the new collection */ 2: function(oldDoc){ if(oldDoc.time < 1486940585) return null; else return oldDoc; } } } }); ","version":"Next","tagName":"h2"},{"title":"autoMigrate​","type":1,"pageTitle":"Migrate Database Data on schema changes","url":"/migration-schema.html#automigrate","content":" By default, the migration automatically happens when the collection is created. Calling RxDatabase.addCollections() returns only when the migration has finished. If you have lots of data or the migrationStrategies take a long time, it might be better to start the migration 'by hand' and show the migration-state to the user as a loading-bar. const messageCol = await myDatabase.addCollections({ messages: { schema: messageSchemaV1, autoMigrate: false, // <- migration will not run at creation migrationStrategies: { 1: async function(oldDoc){ ... anything that takes very long ... return oldDoc; } } } }); // check if migration is needed const needed = await messageCol.migrationNeeded(); if(needed === false) { return; } // start the migration messageCol.startMigration(10); // 10 is the batch-size, how many docs will run at parallel const migrationState = messageCol.getMigrationState(); // 'start' the observable migrationState.$.subscribe({ next: state => console.dir(state), error: error => console.error(error), complete: () => console.log('done') }); // the emitted states look like this: { status: 'RUNNING' // oneOf 'RUNNING' | 'DONE' | 'ERROR' count: { total: 50, // amount of documents which must be migrated handled: 0, // amount of handled docs percent: 0 // percentage [0-100] } } If you don't want to show the state to the user, you can also use .migratePromise(): const migrationPromise = messageCol.migratePromise(10); await migratePromise; ","version":"Next","tagName":"h2"},{"title":"migrationStates()​","type":1,"pageTitle":"Migrate Database Data on schema changes","url":"/migration-schema.html#migrationstates","content":" RxDatabase.migrationStates() returns an Observable that emits all migration states of any collection of the database. Use this when you add collections dynamically and want to show a loading-state of the migrations to the user. const allStatesObservable = myDatabase.migrationStates(); allStatesObservable.subscribe(allStates => { allStates.forEach(migrationState => { console.log( 'migration state of ' + migrationState.collection.name ); }); }); ","version":"Next","tagName":"h2"},{"title":"Migrating attachments​","type":1,"pageTitle":"Migrate Database Data on schema changes","url":"/migration-schema.html#migrating-attachments","content":" When you store RxAttachments together with your document, they can also be changed, added or removed while running the migration. You can do this by mutating the oldDoc._attachments property. import { createBlob } from 'rxdb'; const migrationStrategies = { 1: async function(oldDoc){ // do nothing with _attachments to keep all attachments and have them in the new collection version. return oldDoc; }, 2: async function(oldDoc){ // set _attachments to an empty object to delete all existing ones during the migration. oldDoc._attachments = {}; return oldDoc; } 3: async function(oldDoc){ // update the data field of a single attachment to change its data. oldDoc._attachments.myFile.data = await createBlob( 'my new text', oldDoc._attachments.myFile.content_type ); return oldDoc; } } ","version":"Next","tagName":"h2"},{"title":"Migration on multi-tab in browsers​","type":1,"pageTitle":"Migrate Database Data on schema changes","url":"/migration-schema.html#migration-on-multi-tab-in-browsers","content":" If you use RxDB in a multiInstance environment, like a browser, it will ensure that exactly one tab is running a migration of a collection. Also the migrationState.$ events are emitted between browser tabs. ","version":"Next","tagName":"h2"},{"title":"Migration and Replication​","type":1,"pageTitle":"Migrate Database Data on schema changes","url":"/migration-schema.html#migration-and-replication","content":" If you use any of the RxReplication plugins, the migration will also run on the internal replication-state storage. It will migrate all assumedMasterState documents so that after the migration is done, you do not have to re-run the replication from scratch. RxDB assumes that you run the exact same migration on the servers and the clients. Notice that the replication pull-checkpoint will not be migrated. Your backend must be compatible with pull-checkpoints of older versions. ","version":"Next","tagName":"h2"},{"title":"Migration should be run on all database instances​","type":1,"pageTitle":"Migrate Database Data on schema changes","url":"/migration-schema.html#migration-should-be-run-on-all-database-instances","content":" If you have multiple database instances (for example, if you are running replication inside of a Worker or SharedWorker and have created a database instance inside of the worker), schema migration should be started on all database instances. All instances must know about all migration strategies and any updated schema versions. ","version":"Next","tagName":"h2"},{"title":"Storage Migration","type":0,"sectionRef":"#","url":"/migration-storage.html","content":"","keywords":"","version":"Next"},{"title":"Usage​","type":1,"pageTitle":"Storage Migration","url":"/migration-storage.html#usage","content":" Lets say you want to migrate from LocalStorage RxStorage to the IndexedDB RxStorage. import { migrateStorage } from 'rxdb/plugins/migration-storage'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; import { getRxStorageLocalstorage } from 'rxdb-old/plugins/storage-localstorage'; // create the new RxDatabase const db = await createRxDatabase({ name: dbLocation, storage: getRxStorageIndexedDB(), multiInstance: false }); await migrateStorage({ database: db as any, /** * Name of the old database, * using the storage migration requires that the * new database has a different name. */ oldDatabaseName: 'myOldDatabaseName', oldStorage: getRxStorageLocalstorage(), // RxStorage of the old database batchSize: 500, // batch size parallel: false, // <- true if it should migrate all collections in parallel. False (default) if should migrate in serial afterMigrateBatch: (input: AfterMigrateBatchHandlerInput) => { console.log('storage migration: batch processed'); } }); note Only collections that exist in the new database at the time you call migrateStorage() will have their data migrated. If your old database had collections ['users', 'posts', 'comments'] but your new database only defines ['users', 'posts'], then only users and posts data will be migrated.Any collections missing from the new database will simply be skipped - no data for them will be read or written. This allows you to selectively migrate only certain collections if desired, by choosing which collections to define before invoking migrateStorage(). ","version":"Next","tagName":"h2"},{"title":"Migrate from a previous RxDB major version​","type":1,"pageTitle":"Storage Migration","url":"/migration-storage.html#migrate-from-a-previous-rxdb-major-version","content":" To migrate from a previous RxDB major version, you have to install the 'old' RxDB in the package.json { "dependencies": { "rxdb-old": "npm:rxdb@14.17.1", } } Then you can run the migration by providing the old storage: /* ... */ import { migrateStorage } from 'rxdb/plugins/migration-storage'; import { getRxStorageLocalstorage } from 'rxdb-old/plugins/storage-localstorage'; // <- import from the old RxDB version await migrateStorage({ database: db as any, /** * Name of the old database, * using the storage migration requires that the * new database has a different name. */ oldDatabaseName: 'myOldDatabaseName', oldStorage: getRxStorageLocalstorage(), // RxStorage of the old database batchSize: 500, // batch size parallel: false, afterMigrateBatch: (input: AfterMigrateBatchHandlerInput) => { console.log('storage migration: batch processed'); } }); /* ... */ ","version":"Next","tagName":"h2"},{"title":"Disable Version Check on RxDB Premium 👑​","type":1,"pageTitle":"Storage Migration","url":"/migration-storage.html#disable-version-check-on-rxdb-premium-","content":" RxDB Premium has a check in place that ensures that you do not accidentally use the wrong RxDB core and 👑 Premium version together which could break your database state. This can be a problem during migrations where you have multiple versions of RxDB in use and it will throw the error Version mismatch detected. You can disable that check by importing and running the disableVersionCheck() function from RxDB Premium. // RxDB Premium v15 or newer: import { disableVersionCheck } from 'rxdb-premium-old/plugins/shared'; disableVersionCheck(); // RxDB Premium v14: // for esm import { disableVersionCheck } from 'rxdb-premium-old/dist/es/shared/version-check.js'; disableVersionCheck(); // for cjs import { disableVersionCheck } from 'rxdb-premium-old/dist/lib/shared/version-check.js'; disableVersionCheck(); ","version":"Next","tagName":"h2"},{"title":"Middleware","type":0,"sectionRef":"#","url":"/middleware.html","content":"","keywords":"","version":"Next"},{"title":"List​","type":1,"pageTitle":"Middleware","url":"/middleware.html#list","content":" RxDB supports the following hooks: preInsertpostInsertpreSavepostSavepreRemovepostRemovepostCreate ","version":"Next","tagName":"h2"},{"title":"Why is there no validate-hook?​","type":1,"pageTitle":"Middleware","url":"/middleware.html#why-is-there-no-validate-hook","content":" Different to mongoose, the validation on document-data is running on the field-level for every change to a document. This means if you set the value lastName of a RxDocument, then the validation will only run on the changed field, not the whole document. Therefore it is not useful to have validate-hooks when a document is written to the database. ","version":"Next","tagName":"h3"},{"title":"Use Cases​","type":1,"pageTitle":"Middleware","url":"/middleware.html#use-cases","content":" Middleware are useful for atomizing model logic and avoiding nested blocks of async code. Here are some other ideas: complex validationremoving dependent documentsasynchronous defaultsasynchronous tasks that a certain action triggerstriggering custom eventsnotifications ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Middleware","url":"/middleware.html#usage","content":" All hooks have the plain data as first parameter, and all but preInsert also have the RxDocument-instance as second parameter. If you want to modify the data in the hook, change attributes of the first parameter. All hook functions are also this-bind to the RxCollection-instance. ","version":"Next","tagName":"h2"},{"title":"Insert​","type":1,"pageTitle":"Middleware","url":"/middleware.html#insert","content":" An insert-hook receives the data-object of the new document. lifecycle​ RxCollection.insert is calledpreInsert series-hookspreInsert parallel-hooksschema validation runsnew document is written to databasepostInsert series-hookspostInsert parallel-hooksevent is emitted to RxDatabase and RxCollection preInsert​ // series myCollection.preInsert(function(plainData){ // set age to 50 before saving plainData.age = 50; }, false); // parallel myCollection.preInsert(function(plainData){ }, true); // async myCollection.preInsert(function(plainData){ return new Promise(res => setTimeout(res, 100)); }, false); // stop the insert-operation myCollection.preInsert(function(plainData){ throw new Error('stop'); }, false); postInsert​ // series myCollection.postInsert(function(plainData, rxDocument){ }, false); // parallel myCollection.postInsert(function(plainData, rxDocument){ }, true); // async myCollection.postInsert(function(plainData, rxDocument){ return new Promise(res => setTimeout(res, 100)); }, false); ","version":"Next","tagName":"h3"},{"title":"Save​","type":1,"pageTitle":"Middleware","url":"/middleware.html#save","content":" A save-hook receives the document which is saved. lifecycle​ RxDocument.save is calledpreSave series-hookspreSave parallel-hooksupdated document is written to databasepostSave series-hookspostSave parallel-hooksevent is emitted to RxDatabase and RxCollection preSave​ // series myCollection.preSave(function(plainData, rxDocument){ // modify anyField before saving plainData.anyField = 'anyValue'; }, false); // parallel myCollection.preSave(function(plainData, rxDocument){ }, true); // async myCollection.preSave(function(plainData, rxDocument){ return new Promise(res => setTimeout(res, 100)); }, false); // stop the save-operation myCollection.preSave(function(plainData, rxDocument){ throw new Error('stop'); }, false); postSave​ // series myCollection.postSave(function(plainData, rxDocument){ }, false); // parallel myCollection.postSave(function(plainData, rxDocument){ }, true); // async myCollection.postSave(function(plainData, rxDocument){ return new Promise(res => setTimeout(res, 100)); }, false); ","version":"Next","tagName":"h3"},{"title":"Remove​","type":1,"pageTitle":"Middleware","url":"/middleware.html#remove","content":" An remove-hook receives the document which is removed. lifecycle​ RxDocument.remove is calledpreRemove series-hookspreRemove parallel-hooksdeleted document is written to databasepostRemove series-hookspostRemove parallel-hooksevent is emitted to RxDatabase and RxCollection preRemove​ // series myCollection.preRemove(function(plainData, rxDocument){ }, false); // parallel myCollection.preRemove(function(plainData, rxDocument){ }, true); // async myCollection.preRemove(function(plainData, rxDocument){ return new Promise(res => setTimeout(res, 100)); }, false); // stop the remove-operation myCollection.preRemove(function(plainData, rxDocument){ throw new Error('stop'); }, false); postRemove​ // series myCollection.postRemove(function(plainData, rxDocument){ }, false); // parallel myCollection.postRemove(function(plainData, rxDocument){ }, true); // async myCollection.postRemove(function(plainData, rxDocument){ return new Promise(res => setTimeout(res, 100)); }, false); ","version":"Next","tagName":"h3"},{"title":"postCreate​","type":1,"pageTitle":"Middleware","url":"/middleware.html#postcreate","content":" This hook is called whenever a RxDocument is constructed. You can use postCreate to modify every RxDocument-instance of the collection. This adds a flexible way to add specify behavior to every document. You can also use it to add custom getter/setter to documents. PostCreate-hooks cannot be asynchronous. myCollection.postCreate(function(plainData, rxDocument){ Object.defineProperty(rxDocument, 'myField', { get: () => 'foobar', }); }); const doc = await myCollection.findOne().exec(); console.log(doc.myField); // 'foobar' note This hook does not run on already created or cached documents. Make sure to add postCreate-hooks before interacting with the collection. ","version":"Next","tagName":"h3"},{"title":"Node.js Database","type":0,"sectionRef":"#","url":"/nodejs-database.html","content":"","keywords":"","version":"Next"},{"title":"Persistent Database​","type":1,"pageTitle":"Node.js Database","url":"/nodejs-database.html#persistent-database","content":" To get a "normal" database connection where the data is persisted to a file system, the RxDB real time database provides multiple storage implementations that work in Node.js. The FoundationDB storage connects to a FoundationDB cluster which itself is just a distributed key-value engine. RxDB adds the NoSQL query-engine, indexes and other features on top of it. It scales horizontally because you can always add more servers to the FoundationDB cluster to increase the capacity. Setting up a RxDB database is pretty simple. You import the FoundationDB RxStorage and tell RxDB to use that when calling createRxDatabase: import { createRxDatabase } from 'rxdb'; import { getRxStorageFoundationDB } from 'rxdb/plugins/storage-foundationdb'; const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageFoundationDB({ apiVersion: 620, clusterFile: '/path/to/fdb.cluster' }) }); // add a collection await db.addCollections({ users: { schema: mySchema } }); // run a query const result = await db.users.find({ selector: { name: 'foobar' } }).exec(); Another alternative storage is the SQLite RxStorage that stores the data inside of a SQLite filebased database. The SQLite storage is faster than FoundationDB and does not require to set up a cluster or anything because SQLite directly stores and reads the data inside of the filesystem. The downside of that is that it only scales vertically. import { createRxDatabase } from 'rxdb'; import { getRxStorageSQLite, getSQLiteBasicsNode } from 'rxdb-premium/plugins/storage-sqlite'; import sqlite3 from 'sqlite3'; const myRxDatabase = await createRxDatabase({ name: 'path/to/database/file/foobar.db', storage: getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsNode(sqlite3) }) }); Because the SQLite RxStorage is not free and you might not want to set up a FoundationDB cluster, there is also the option to use the LokiJS RxStorage together with the filesystem adapter. This will store the data as plain json in a file and load everything into memory on startup. This works great for small prototypes but it is not recommended to be used in production. import { createRxDatabase } from 'rxdb'; const LokiFsStructuredAdapter = require('lokijs/src/loki-fs-structured-adapter.js'); import { getRxStorageLoki } from 'rxdb/plugins/storage-lokijs'; import sqlite3 from 'sqlite3'; const myRxDatabase = await createRxDatabase({ name: 'path/to/database/file/foobar.db', storage: getRxStorageLoki({ adapter: new LokiFsStructuredAdapter() }) }); Here is a performance comparison chart of the different storages (lower is better): ","version":"Next","tagName":"h2"},{"title":"RxDB as Node.js In-Memory Database​","type":1,"pageTitle":"Node.js Database","url":"/nodejs-database.html#rxdb-as-nodejs-in-memory-database","content":" One of the easiest way to use RxDB in Node.js is to use the Memory RxStorage. As the name implies, it stores the data directly in-memory of the Node.js JavaScript process. This makes it really fast to read and write data but of course the data is not persisted and will be lost when the nodejs process exits. Often the in-memory option is used when RxDB is used in unit tests because it automatically cleans up everything afterwards. import { createRxDatabase } from 'rxdb'; import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageMemory() }); Also notice that the default memory limit of Node.js is 4gb (might change of newer versions) so for bigger datasets you might want to increase the limit with the max-old-space-size flag: # increase the Node.js memory limit to 8GB node --max-old-space-size=8192 index.js ","version":"Next","tagName":"h2"},{"title":"Hybrid In-memory-persistence-synced storage​","type":1,"pageTitle":"Node.js Database","url":"/nodejs-database.html#hybrid-in-memory-persistence-synced-storage","content":" If you want to have the performance of an in-memory database but require persistency of the data, you can use the memory-mapped storage. On database creation it will load all data into the memory and on writes it will first write the data into memory and later also write it to the persistent storage in the background. In the following example the FoundationDB storage is used, but any other RxStorage can be used as persistence layer. import { createRxDatabase } from 'rxdb'; import { getRxStorageFoundationDB } from 'rxdb/plugins/storage-foundationdb'; import { getMemoryMappedRxStorage } from 'rxdb-premium/plugins/storage-memory-mapped'; const db = await createRxDatabase({ name: 'exampledb', storage: getMemoryMappedRxStorage({ storage: getRxStorageFoundationDB({ apiVersion: 620, clusterFile: '/path/to/fdb.cluster' }) }) }); While this approach gives you a database with great performance and persistent, it has two major downsides: The database size is limited to the memory sizeWrites can be lost when the Node.js process exists between a write to the memory state and the background persisting. ","version":"Next","tagName":"h2"},{"title":"Share database between microservices with RxDB​","type":1,"pageTitle":"Node.js Database","url":"/nodejs-database.html#share-database-between-microservices-with-rxdb","content":" Using a local, embedded database in Node.js works great until you have to share the data with another Node.js process or another server at all. To share the database state with other instances, RxDB provides two different methods. One is replication and the other is the remote RxStorage. The replication copies over the whole database set to other instances live-replicates all ongoing writes. This has the benefit of scaling better because each of your microservice will run queries on its own copy of the dataset. Sometimes however you might not want to store the full dataset on each microservice. Then it is better to use the remote RxStorage and connect it to the "main" database. The remote storage will run all operations the main database and return the result to the calling database. ","version":"Next","tagName":"h2"},{"title":"Follow up on RxDB+Node.js​","type":1,"pageTitle":"Node.js Database","url":"/nodejs-database.html#follow-up-on-rxdbnodejs","content":" Check out the RxDB Nodejs example.If you haven't done yet, you should start learning about RxDB with the Quickstart Tutorial.I created a list of embedded JavaSCript databases that you will help you to pick a database if you do not want to use RxDB.Check out the MongoDB RxStorage that uses MongoDB for the database connection from your Node.js application and runs the RxDB real time database on top of it. ","version":"Next","tagName":"h2"},{"title":"Local First / Offline First","type":0,"sectionRef":"#","url":"/offline-first.html","content":"","keywords":"","version":"Next"},{"title":"UX is better without loading spinners​","type":1,"pageTitle":"Local First / Offline First","url":"/offline-first.html#ux-is-better-without-loading-spinners","content":" In 'normal' web applications, most user interactions like fetching, saving or deleting data, correspond to a request to the backend server. This means that each of these interactions require the user to await the unknown latency to and from a remote server while looking at a loading spinner. In offline-first apps, the operations go directly against the local storage which happens almost instantly. There is no perceptible loading time and so it is not even necessary to implement a loading spinner at all. As soon as the user clicks, the UI represents the new state as if it was already changed in the backend. ","version":"Next","tagName":"h2"},{"title":"Multi-tab usage just works​","type":1,"pageTitle":"Local First / Offline First","url":"/offline-first.html#multi-tab-usage-just-works","content":" Many, even big websites like amazon, reddit and stack overflow do not handle multi tab usage correctly. When a user has multiple tabs of the website open and does a login on one of these tabs, the state does not change on the other tabs. On offline first applications, there is always exactly one state of the data across all tabs. Offline first databases (like RxDB) store the data inside of IndexedDb and share the state between all tabs of the same origin. ","version":"Next","tagName":"h2"},{"title":"Latency is more important than bandwidth​","type":1,"pageTitle":"Local First / Offline First","url":"/offline-first.html#latency-is-more-important-than-bandwidth","content":" In the past, often the bandwidth was the limiting factor on determining the loading time of an application. But while bandwidth has improved over the years, latency became the limiting factor. You can always increase the bandwidth by setting up more cables or sending more Starlink satellites to space. But reducing the latency is not so easy. It is defined by the physical properties of the transfer medium, the speed of light and the distance to the server. All of these three are hard to optimize. Offline first application benefit from that because sending the initial state to the client can be done much faster with more bandwidth. And once the data is there, we do no longer have to care about the latency to the backend server because you can run near zero latency queries locally. ","version":"Next","tagName":"h2"},{"title":"Realtime comes for free​","type":1,"pageTitle":"Local First / Offline First","url":"/offline-first.html#realtime-comes-for-free","content":" Most websites lie to their users. They do not lie because they display wrong data, but because they display old data that was loaded from the backend at the time the user opened the site. To overcome this, you could build a realtime website where you create a websocket that streams updates from the backend to the client. This means work. Your client needs to tell the server which page is currently opened and which updates the client is interested to. Then the server can push updates over the websocket and you can update the UI accordingly. With offline first applications, you already have a realtime replication with the backend. Most offline first databases provide some concept of changestream or data subscriptions and with RxDB you can even directly subscribe to query results or single fields of documents. This makes it easy to have an always updated UI whenever data on the backend changes. ","version":"Next","tagName":"h2"},{"title":"Scales with data size, not with the amount of user interaction​","type":1,"pageTitle":"Local First / Offline First","url":"/offline-first.html#scales-with-data-size-not-with-the-amount-of-user-interaction","content":" On normal applications, each user interaction can result in multiple requests to the backend server which increase its load. The more users interact with your application, the more backend resources you have to provide. Offline first applications do not scale up with the amount of user actions but instead they scale up with the amount of data. Once that data is transferred to the client, the user can do as many interactions with it as required without connecting to the server. ","version":"Next","tagName":"h2"},{"title":"Modern apps have longer runtimes​","type":1,"pageTitle":"Local First / Offline First","url":"/offline-first.html#modern-apps-have-longer-runtimes","content":" In the past you used websites only for a short time. You open it, perform some action and then close it again. This made the first load time the important metric when evaluating page speed. Today web applications have changed and with it the way we use them. Single page applications are opened once and then used over the whole day. Chat apps, email clients, PWAs and hybrid apps. All of these were made to have long runtimes. This makes the time for user interactions more important than the initial loading time. Offline first applications benefit from that because there is often no loading time on user actions while loading the initial state to the client is not that relevant. ","version":"Next","tagName":"h2"},{"title":"You might not need REST​","type":1,"pageTitle":"Local First / Offline First","url":"/offline-first.html#you-might-not-need-rest","content":" On normal web applications, you make different requests for each kind of data interaction. For that you have to define a swagger route, implement a route handler on the backend and create some client code to send or fetch data from that route. The more complex your application becomes, the more REST routes you have to maintain and implement. With offline first apps, you have a way to hack around all this cumbersome work. You just replicate the whole state from the server to the client. The replication does not only run once, you have a realtime replication and all changes at one side are automatically there on the other side. On the client, you can access every piece of state with a simple database query. While this of course only works for amounts of data that the client can load and store, it makes implementing prototypes and simple apps much faster. ","version":"Next","tagName":"h2"},{"title":"You might not need Redux​","type":1,"pageTitle":"Local First / Offline First","url":"/offline-first.html#you-might-not-need-redux","content":" Data is hard, especially for UI applications where many things can happen at the same time. The user is clicking around. Stuff is loaded from the server. All of these things interact with the global state of the app. To manage this complexity it is common to use state management libraries like Redux or MobX. With them, you write all this lasagna code to wrap the mutation of data and to make the UI react to all these changes. On offline first apps, your global state is already there in a single place stored inside of the local database. You do not have to care whether this data came from the UI, another tab, the backend or another device of the same user. You can just make writes to the database and fetch data out of it. ","version":"Next","tagName":"h2"},{"title":"Follow up​","type":1,"pageTitle":"Local First / Offline First","url":"/offline-first.html#follow-up","content":" Learn how to store and query data with RxDB in the RxDB QuickstartDownsides of Offline FirstI wrote a follow-up version of offline/first local first about Why Local-First Is the Future and what are Its Limitations ","version":"Next","tagName":"h2"},{"title":"Object-Data-Relational-Mapping","type":0,"sectionRef":"#","url":"/orm.html","content":"","keywords":"","version":"Next"},{"title":"statics​","type":1,"pageTitle":"Object-Data-Relational-Mapping","url":"/orm.html#statics","content":" Statics are defined collection-wide and can be called on the collection. ","version":"Next","tagName":"h2"},{"title":"Add statics to a collection​","type":1,"pageTitle":"Object-Data-Relational-Mapping","url":"/orm.html#add-statics-to-a-collection","content":" To add static functions, pass a statics-object when you create your collection. The object contains functions, mapped to their function-names. const heroes = await myDatabase.addCollections({ heroes: { schema: mySchema, statics: { scream: function(){ return 'AAAH!!'; } } } }); console.log(heroes.scream()); // 'AAAH!!' You can also use the this-keyword which resolves to the collection: const heroes = await myDatabase.addCollections({ heroes: { schema: mySchema, statics: { whoAmI: function(){ return this.name; } } } }); console.log(heroes.whoAmI()); // 'heroes' ","version":"Next","tagName":"h3"},{"title":"instance-methods​","type":1,"pageTitle":"Object-Data-Relational-Mapping","url":"/orm.html#instance-methods","content":" Instance-methods are defined collection-wide. They can be called on the RxDocuments of the collection. ","version":"Next","tagName":"h2"},{"title":"Add instance-methods to a collection​","type":1,"pageTitle":"Object-Data-Relational-Mapping","url":"/orm.html#add-instance-methods-to-a-collection","content":" const heroes = await myDatabase.addCollections({ heroes: { schema: mySchema, methods: { scream: function(){ return 'AAAH!!'; } } } }); const doc = await heroes.findOne().exec(); console.log(doc.scream()); // 'AAAH!!' Here you can also use the this-keyword: const heroes = await myDatabase.addCollections({ heroes: { schema: mySchema, methods: { whoAmI: function(){ return 'I am ' + this.name + '!!'; } } } }); await heroes.insert({ name: 'Skeletor' }); const doc = await heroes.findOne().exec(); console.log(doc.whoAmI()); // 'I am Skeletor!!' ","version":"Next","tagName":"h3"},{"title":"attachment-methods​","type":1,"pageTitle":"Object-Data-Relational-Mapping","url":"/orm.html#attachment-methods","content":" Attachment-methods are defined collection-wide. They can be called on the RxAttachments of the RxDocuments of the collection. const heroes = await myDatabase.addCollections({ heroes: { schema: mySchema, attachments: { scream: function(){ return 'AAAH!!'; } } } }); const doc = await heroes.findOne().exec(); const attachment = await doc.putAttachment({ id: 'cat.txt', data: 'meow I am a kitty', type: 'text/plain' }); console.log(attachment.scream()); // 'AAAH!!' ","version":"Next","tagName":"h2"},{"title":"RxDB Documentation","type":0,"sectionRef":"#","url":"/overview.html","content":"RxDB Documentation Getting Started Overview Quickstart Install Dev-mode Typescript Core Entities RxDatabase RxSchema RxCollection RxDocument RxQuery 💾 Storages RxStorage Overview LocalStorage (Browser) IndexedDB 👑 (Browser, Capacitor) OPFS 👑 (Browser) Memory Filesystem Node 👑 (Node.js) SQLite (Capacitor, React-Native, Expo, Tauri, Electron, Node.js) Dexie.js MongoDB DenoKV FoundationDB Storage Wrappers Schema Validation Encryption Key Compression Logger 👑 Remote RxStorage Worker RxStorage 👑 SharedWorker RxStorage 👑 Memory Mapped RxStorage 👑 Sharding 👑 Localstorage Meta Optimizer 👑 Electron 🔄 Replication ⚙️ Sync Engine HTTP Replication RxServer Replication GraphQL Replication WebSocket Replication CouchDB Replication WebRTC P2P Replication Firestore Replication MongoDB Replication Supabase Replication NATS Replication Appwrite Replication Server RxServer RxServer Scaling How RxDB works Transactions Conflicts Revisions Query Cache Creating Plugins Errors Advanced Features Schema Migration Storage Migration Attachments RxPipelines Custom Reactivity RxState Local Documents Cleanup Backup Leader Election Middleware CRDT Population ORM Fulltext Search 👑 Vector Database Query Optimizer 👑 Third Party Plugins Integrations React TanStack DB Performance RxStorage Performance NoSQL Performance Tips Slow IndexedDB LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite Releases 17.0.0 16.0.0 15.0.0 14.0.0 13.0.0 12.0.0 11.0.0 10.0.0 9.0.0 8.0.0 Contact Consulting Discord LinkedIn","keywords":"","version":"Next"},{"title":"Performance tips for RxDB and other NoSQL databases","type":0,"sectionRef":"#","url":"/nosql-performance-tips.html","content":"","keywords":"","version":"Next"},{"title":"Use bulk operations​","type":1,"pageTitle":"Performance tips for RxDB and other NoSQL databases","url":"/nosql-performance-tips.html#use-bulk-operations","content":" When you run write operations on multiple documents, make sure you use bulk operations instead of single document operations. // wrong ❌ for(const docData of dataAr){ await myCollection.insert(docData); } // right ✔️ await myCollection.bulkInsert(dataAr); ","version":"Next","tagName":"h2"},{"title":"Help the query planner by adding operators that better restrict the index range​","type":1,"pageTitle":"Performance tips for RxDB and other NoSQL databases","url":"/nosql-performance-tips.html#help-the-query-planner-by-adding-operators-that-better-restrict-the-index-range","content":" Often on complex queries, RxDB (and other databases) do not pick the optimal index range when querying a result set. You can add additional restrictive operators to ensure the query runs over a smaller index space and has a better performance. Lets see some examples for different query types. /** * Adding a restrictive operator for an $or query * so that it better limits the index space for the time-field. */ const orQuery = { selector: { $or: [ { time: { $gt: 1234 }, }, { time: { $eg: 1234 }, user: { $gt: 'foobar' } }, ] time: { $gte: 1234 } // <- add restrictive operator } } /** * Adding a restrictive operator for an $regex query * so that it better limits the index space for the user-field. * We know that all matching fields start with 'foo' so we can * tell the query to use that as lower constraint for the index. */ const regexQuery = { selector: { user: { $regex: '^foo(.*)0-9$', // a complex regex with a ^ in the beginning $gte: 'foo' // <- add restrictive operator } } } /** * Adding a restrictive operator for a query on an enum field. * so that it better limits the index space for the time-field. */ const enumQuery = { selector: { /** * Here lets assume our status field has the enum type ['idle', 'in-progress', 'done'] * so our restrictive operator can exclude all documents with 'done' as status. */ status: { $in: { 'idle', 'in-progress', }, $gt: 'done' // <- add restrictive operator on status } } } ","version":"Next","tagName":"h2"},{"title":"Set a specific index​","type":1,"pageTitle":"Performance tips for RxDB and other NoSQL databases","url":"/nosql-performance-tips.html#set-a-specific-index","content":" Sometime the query planner of the database itself has no chance in picking the best index of the possible given indexes. For queries where performance is very important, you might want to explicitly specify which index must be used. const myQuery = myCollection.find({ selector: { /* ... */ }, // explicitly specify index index: [ 'fieldA', 'fieldB' ] }); ","version":"Next","tagName":"h2"},{"title":"Try different ordering of index fields​","type":1,"pageTitle":"Performance tips for RxDB and other NoSQL databases","url":"/nosql-performance-tips.html#try-different-ordering-of-index-fields","content":" The order of the fields in a compound index is very important for performance. When optimizing index usage, you should try out different orders on the index fields and measure which runs faster. For that it is very important to run tests on real-world data where the distribution of the data is the same as in production. For example when there is a query on a user collection with an age and a gender field, it depends if the index ['gender', 'age'] performance better as ['age', 'gender'] based on the distribution of data: const query = myCollection .findOne({ selector: { age: { $gt: 18 }, gender: { $eq: 'm' } }, /** * Because the developer knows that 50% of the documents are 'male', * but only 20% are below age 18, * it makes sense to enforce using the ['gender', 'age'] index to improve performance. * This could not be known by the query planer which might have chosen ['age', 'gender'] instead. */ index: ['gender', 'age'] }); Notice that RxDB has the Query Optimizer Plugin that can be used to automatically find the best indexes. ","version":"Next","tagName":"h2"},{"title":"Make a Query \"hot\" to reduce load​","type":1,"pageTitle":"Performance tips for RxDB and other NoSQL databases","url":"/nosql-performance-tips.html#make-a-query-hot-to-reduce-load","content":" Having a query where the up-to-date result set is needed more than once, you might want to make the query "hot" by permanently subscribing to it. This ensures that the query result is kept up to date by RxDB ant the EventReduce algorithm at any time so that at the moment you need the current results, it has them already. For example when you use RxDB at Node.js for a webserver, you should use an outer "hot" query instead of running the same query again on every request to a route. // wrong ❌ app.get('/list', (req, res) => { const result = await myCollection.find({/* ... */}).exec(); res.send(JSON.stringify(result)); }); // right ✔️ const query = myCollection.find({/* ... */}); query.subscribe(); // <- make it hot app.get('/list', (req, res) => { const result = await query.exec(); res.send(JSON.stringify(result)); }); ","version":"Next","tagName":"h2"},{"title":"Store parts of your document data as attachment​","type":1,"pageTitle":"Performance tips for RxDB and other NoSQL databases","url":"/nosql-performance-tips.html#store-parts-of-your-document-data-as-attachment","content":" For in-app databases like RxDB, it does not make sense to partially parse the JSON of a document. Instead, always the whole document json is parsed and handled. This has a better performance because JSON.parse() in JavaScript directly calls a C++ binding which can parse really fast compared to a partial parsing in JavaScript itself. Also by always having the full document, RxDB can de-duplicate memory caches of document across multiple queries. The downside is that very very big documents with a complex structure can increase query time significantly. Documents fields with complex that are mostly not in use, can be move into an attachment. This would lead RxDB to not fetch the attachment data each time the document is loaded from disc. Instead only when explicitly asked for. const myDocument = await myCollection.insert({/* ... */}); const attachment = await myDocument.putAttachment( { id: 'otherStuff.json', data: createBlob(JSON.stringify({/* ... */}), 'application/json'), type: 'application/json' } ); ","version":"Next","tagName":"h2"},{"title":"Process queries in a worker process​","type":1,"pageTitle":"Performance tips for RxDB and other NoSQL databases","url":"/nosql-performance-tips.html#process-queries-in-a-worker-process","content":" Moving database storage into a WebWorker can significantly improve performance in web applications that use RxDB or similar NoSQL databases. When database operations are executed in the main JavaScript thread, they can block or slow down the User Interface, especially during heavy or complex data operations. By offloading these operations to a WebWorker, you effectively separate the data processing workload from the UI thread. This means the main thread remains free to handle user interactions and render updates without delay, leading to a smoother and more responsive user experience. Additionally, WebWorkers allow for parallel data processing, which can expedite tasks like querying and indexing. This approach not only enhances UI responsiveness but also optimizes overall application performance by leveraging the multi-threading capabilities of modern browsers. With RxDB you can use the Worker and SharedWorker plugin to move the query processing away from the main thread. ","version":"Next","tagName":"h2"},{"title":"Use less plugins and hooks​","type":1,"pageTitle":"Performance tips for RxDB and other NoSQL databases","url":"/nosql-performance-tips.html#use-less-plugins-and-hooks","content":" Utilizing fewer hooks and plugins in RxDB or similar NoSQL database systems can lead to markedly better performance. Each additional hook or plugin introduces extra layers of processing and potential overhead, which can cumulatively slow down database operations. These extensions often execute additional code or enforce extra checks with each operation, such as insertions, updates, or deletions. While they can provide valuable functionalities or custom behaviors, their overuse can inadvertently increase the complexity and execution time of basic database operations. By minimizing their use and only employing essential hooks and plugins, the system can operate more efficiently. This streamlined approach reduces the computational burden on each transaction, leading to faster response times and a more efficient overall data handling process, especially critical in high-load or real-time applications where performance is paramount. ","version":"Next","tagName":"h2"},{"title":"Creating Plugins","type":0,"sectionRef":"#","url":"/plugins.html","content":"","keywords":"","version":"Next"},{"title":"rxdb​","type":1,"pageTitle":"Creating Plugins","url":"/plugins.html#rxdb","content":" The rxdb-property signals that this plugin is an rxdb-plugin. The value should always be true. ","version":"Next","tagName":"h2"},{"title":"prototypes​","type":1,"pageTitle":"Creating Plugins","url":"/plugins.html#prototypes","content":" The prototypes-property contains a function for each of RxDB's internal prototype that you want to manipulate. Each function gets the prototype-object of the corresponding class as parameter and then can modify it. You can see a list of all available prototypes here ","version":"Next","tagName":"h2"},{"title":"overwritable​","type":1,"pageTitle":"Creating Plugins","url":"/plugins.html#overwritable","content":" Some of RxDB's functions are not inside of a class-prototype but are static. You can set and overwrite them with the overwritable-object. You can see a list of all overwritables here. hooks Sometimes you don't want to overwrite an existing RxDB-method, but extend it. You can do this by adding hooks which will be called each time the code jumps into the hooks corresponding call. You can find a list of all hooks here. options RxDatabase and RxCollection have an additional options-parameter, which can be filled with any data required be the plugin. const collection = myDatabase.addCollections({ foo: { schema: mySchema, options: { // anything can be passed into the options foo: ()=>'bar' } } }) // Afterwards you can use these options in your plugin. collection.options.foo(); // 'bar' ","version":"Next","tagName":"h2"},{"title":"Population","type":0,"sectionRef":"#","url":"/population.html","content":"","keywords":"","version":"Next"},{"title":"Schema with ref​","type":1,"pageTitle":"Population","url":"/population.html#schema-with-ref","content":" The ref-keyword in properties describes to which collection the field-value belongs to (has a relationship). export const refHuman = { title: 'human related to other human', version: 0, primaryKey: 'name', properties: { name: { type: 'string' }, bestFriend: { ref: 'human', // refers to collection human type: 'string' // ref-values must always be string or ['string','null'] (primary of foreign RxDocument) } } }; You can also have a one-to-many reference by using a string-array. export const schemaWithOneToManyReference = { version: 0, primaryKey: 'name', type: 'object', properties: { name: { type: 'string' }, friends: { type: 'array', ref: 'human', items: { type: 'string' } } } }; ","version":"Next","tagName":"h2"},{"title":"populate()​","type":1,"pageTitle":"Population","url":"/population.html#populate","content":" ","version":"Next","tagName":"h2"},{"title":"via method​","type":1,"pageTitle":"Population","url":"/population.html#via-method","content":" To get the referred RxDocument, you can use the populate()-method. It takes the field-path as attribute and returns a Promise which resolves to the foreign document or null if not found. await humansCollection.insert({ name: 'Alice', bestFriend: 'Carol' }); await humansCollection.insert({ name: 'Bob', bestFriend: 'Alice' }); const doc = await humansCollection.findOne('Bob').exec(); const bestFriend = await doc.populate('bestFriend'); console.dir(bestFriend); //> RxDocument[Alice] ","version":"Next","tagName":"h3"},{"title":"via getter​","type":1,"pageTitle":"Population","url":"/population.html#via-getter","content":" You can also get the populated RxDocument with the direct getter. Therefore you have to add an underscore suffix _ to the fieldname. This works also on nested values. await humansCollection.insert({ name: 'Alice', bestFriend: 'Carol' }); await humansCollection.insert({ name: 'Bob', bestFriend: 'Alice' }); const doc = await humansCollection.findOne('Bob').exec(); const bestFriend = await doc.bestFriend_; // notice the underscore_ console.dir(bestFriend); //> RxDocument[Alice] ","version":"Next","tagName":"h3"},{"title":"Example with nested reference​","type":1,"pageTitle":"Population","url":"/population.html#example-with-nested-reference","content":" const myCollection = await myDatabase.addCollections({ human: { schema: { version: 0, type: 'object', properties: { name: { type: 'string' }, family: { type: 'object', properties: { mother: { type: 'string', ref: 'human' } } } } } } }); const mother = await myDocument.family.mother_; console.dir(mother); //> RxDocument ","version":"Next","tagName":"h2"},{"title":"Example with array​","type":1,"pageTitle":"Population","url":"/population.html#example-with-array","content":" const myCollection = await myDatabase.addCollections({ human: { schema: { version: 0, type: 'object', properties: { name: { type: 'string' }, friends: { type: 'array', ref: 'human', items: { type: 'string' } } } } } }); //[insert other humans here] await myCollection.insert({ name: 'Alice', friends: [ 'Bob', 'Carol', 'Dave' ] }); const doc = await humansCollection.findOne('Alice').exec(); const friends = await myDocument.friends_; console.dir(friends); //> Array.<RxDocument> ","version":"Next","tagName":"h2"},{"title":"QueryCache","type":0,"sectionRef":"#","url":"/query-cache.html","content":"","keywords":"","version":"Next"},{"title":"Cache Replacement Policy​","type":1,"pageTitle":"QueryCache","url":"/query-cache.html#cache-replacement-policy","content":" To not let RxDB fill up all the memory, a cache replacement policy is defined that clears up the cached queries. This is implemented as a function which runs regularly, depending on when queries are created and the database is idle. The default policy should be good enough for most use cases but defining custom ones can also make sense. ","version":"Next","tagName":"h2"},{"title":"The default policy​","type":1,"pageTitle":"QueryCache","url":"/query-cache.html#the-default-policy","content":" The default policy starts cleaning up queries depending on how much queries are in the cache and how much document data they contain. It will never uncache queries that have subscribers to their resultsIt tries to always have less than 100 queries without subscriptions in the cache.It prefers to uncache queries that have never executed and are older than 30 secondsIt prefers to uncache queries that have not been used for longer time ","version":"Next","tagName":"h2"},{"title":"Other references to queries​","type":1,"pageTitle":"QueryCache","url":"/query-cache.html#other-references-to-queries","content":" With JavaScript, it is not possible to count references to variables. Therefore it might happen that an uncached RxQuery is still referenced by the users code and used to get results. This should never be a problem, uncached queries must still work. Creating the same query again however, will result in having two RxQuery instances instead of one. ","version":"Next","tagName":"h2"},{"title":"Using a custom policy​","type":1,"pageTitle":"QueryCache","url":"/query-cache.html#using-a-custom-policy","content":" A cache replacement policy is a normal JavaScript function according to the type RxCacheReplacementPolicy. It gets the RxCollection as first parameter and the QueryCache as second. Then it iterates over the cached RxQuery instances and uncaches the desired ones with uncacheRxQuery(rxQuery). When you create your custom policy, you should have a look at the default. To apply a custom policy to a RxCollection, add the function as attribute cacheReplacementPolicy. const collection = await myDatabase.addCollections({ humans: { schema: mySchema, cacheReplacementPolicy: function(){ /* ... */ } } }); ","version":"Next","tagName":"h2"},{"title":"Query Optimizer","type":0,"sectionRef":"#","url":"/query-optimizer.html","content":"","keywords":"","version":"Next"},{"title":"Usage​","type":1,"pageTitle":"Query Optimizer","url":"/query-optimizer.html#usage","content":" import { findBestIndex } from 'rxdb-premium/plugins/query-optimizer'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/indexeddb'; const bestIndexes = await findBestIndex({ schema: myRxJsonSchema, /** * In this example we use the IndexedDB RxStorage, * but any other storage can be used for testing. */ storage: getRxStorageIndexedDB(), /** * Multiple queries can be optimized at the same time * which decreases the overall runtime. */ queries: { /** * Queries can be mapped by a query id, * here we use myFirstQuery as query id. */ myFirstQuery: { selector: { age: { $gt: 10 } }, }, mySecondQuery: { selector: { age: { $gt: 10 }, lastName: { $eq: 'Nakamoto' } }, } }, testData: [/** data for the documents. **/] }); ","version":"Next","tagName":"h2"},{"title":"Important details​","type":1,"pageTitle":"Query Optimizer","url":"/query-optimizer.html#important-details","content":" This is a build time tool. You should use it to find the best indexes for your queries during build time. Then you store these results and you application can use the best indexes during run time. It makes no sense to run time optimization with a different RxStorage (+settings) that what you use in production. The result of the query optimizer is heavily dependent on the RxStorage and JavaScript runtime. For example it makes no sense to run the optimization in Node.js and then use the optimized indexes in the browser. It is very important that you use production liketestData. Finding the best index heavily depends on data distribution and amount of stored/queried documents. For example if you store and query users with an age field, it makes no sense to just use a random number for the age because in production the age of your users is not equally distributed. The higher you set runs, the more test cycles will be performed and the more significant will be the time measurements which leads to a better index selection. ","version":"Next","tagName":"h2"},{"title":"Signals & Co. - Custom reactivity adapters instead of RxJS Observables","type":0,"sectionRef":"#","url":"/reactivity.html","content":"","keywords":"","version":"Next"},{"title":"RxDB Quickstart","type":0,"sectionRef":"#","url":"/quickstart.html","content":"","keywords":"","version":"Next"},{"title":"Next steps​","type":1,"pageTitle":"RxDB Quickstart","url":"/quickstart.html#next-steps","content":" You are now ready to dive deeper into RxDB. Start reading the full documentation here.There is a full implementation of the quickstart guide so you can clone that repository and play with the code.For frameworks and runtimes like Angular, React Native and others, check out the list of example implementations.Also please continue reading the documentation, join the community on our Discord chat, and star the GitHub repo.If you are using RxDB in a production environment and are able to support its continued development, please take a look at the 👑 Premium package which includes additional plugins and utilities. ","version":"Next","tagName":"h2"},{"title":"Adding a reactivity factory​","type":1,"pageTitle":"Signals & Co. - Custom reactivity adapters instead of RxJS Observables","url":"/reactivity.html#adding-a-reactivity-factory","content":" Angular React Vue In angular we use Angular Signals as custom reactivity objects. 1 Import​ import { createReactivityFactory } from 'rxdb/plugins/reactivity-angular'; import { Injectable, inject } from '@angular/core'; 2 Set the reactivity factory​ Set the factory as reactivity option when calling createRxDatabase. const database = await createRxDatabase({ name: 'mydb', storage: getRxStorageLocalstorage(), reactivity: createReactivityFactory(inject(Injector)) }); // add collections/sync etc... 3 Use the Signal in an Angular component​ import { Component, inject } from '@angular/core'; import { CommonModule } from '@angular/common'; import { DbService } from '../db.service'; @Component({ selector: 'app-todos-list', standalone: true, imports: [CommonModule], template: ` <ul> <li *ngFor="let t of todosSignal();" >{{ t.title }}</li> </ul> `, }) export class TodosListComponent { private dbService = inject(DbService); // RxDB query - Angular Signal readonly todosSignal = this.dbService.db.todos.find().$$; } An example of how signals are used in angular with RxDB, can be found at the RxDB Angular Example ","version":"Next","tagName":"h2"},{"title":"Accessing custom reactivity objects​","type":1,"pageTitle":"Signals & Co. - Custom reactivity adapters instead of RxJS Observables","url":"/reactivity.html#accessing-custom-reactivity-objects","content":" All observable data in RxDB is marked by the single dollar sign $ like RxCollection.$ for events or RxDocument.myField$ to get the observable for a document field. To make custom reactivity objects distinguable, they are marked with double-dollar signs $$ instead. Here are some example on how to get custom reactivity objects from RxDB specific instances: // RxDocument // get signal that represents the document field 'foobar' const signal = myRxDocument.get$$('foobar'); // same as above const signal = myRxDocument.foobar$$; // get signal that represents whole document over time const signal = myRxDocument.$$; // get signal that represents the deleted state of the document const signal = myRxDocument.deleted$$; // RxQuery // get signal that represents the query result set over time const signal = collection.find().$$; // get signal that represents the query result set over time const signal = collection.findOne().$$; // RxLocalDocument // get signal that represents the whole local document state const signal = myRxLocalDocument.$$; // get signal that represents the foobar field const signal = myRxLocalDocument.get$$('foobar'); ","version":"Next","tagName":"h2"},{"title":"React","type":0,"sectionRef":"#","url":"/react.html","content":"","keywords":"","version":"Next"},{"title":"General concept​","type":1,"pageTitle":"React","url":"/react.html#general-concept","content":" RxDB is internally reactive and emits changes via RxJS observables. React and React Native, however, are render-driven frameworks that rely on component state and hooks. The RxDB React integration bridges these two models by exposing a small set of hooks that translate RxDB state into React renders. Instead of hiding reactivity behind configuration flags, the integration uses explicit hooks. This makes component behavior predictable, avoids accidental subscriptions, and keeps performance characteristics easy to reason about. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"React","url":"/react.html#usage","content":" 1 Installation​ Install RxDB and React as usual: npm install rxdb react react-dom 2 Database creation​ Database creation is not part of the React integration itself. RxDB is created in the same way as in non-React applications, including storage selection, plugins, replication, hooks, and schema definitions. This separation is intentional. React components should never be responsible for creating or configuring the database. They should only consume it. import { createRxDatabase, addRxPlugin } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; async function getDatabase() { const db = await createRxDatabase({ name: 'heroesreactdb', storage: getRxStorageLocalstorage() }); await db.addCollections({ heroes: { schema: myRxSchema } }); /** * Do other stuff here * like setting up middleware * or starting replication. */ return db; } 3 Providing the database​ To use RxDB in a React or React Native application, the database instance must be provided via a context. This is done using RxDatabaseProvider. The database itself is created outside of React, usually in a separate module. The provider is only responsible for making the database available to components once it has been initialized. import React, { useEffect, useState } from 'react'; import { RxDatabaseProvider } from 'rxdb/plugins/react'; import { getDatabase } from './Database'; const App = () => { const [database, setDatabase] = useState(); useEffect(() => { const initDb = async () => { const db = await getDatabase(); setDatabase(db); }; initDb(); }, []); if (database == null) { return <span> Loading <a href="https://rxdb.info/react.html">RxDB</a> database... </span>; } return ( <RxDatabaseProvider database={database}> {/* your application */} </RxDatabaseProvider> ); }; export default App; 4 Accessing collections​ import { useRxCollection } from 'rxdb/plugins/react'; const collection = useRxCollection('heroes'); The hook returns the collection once it becomes available. During the initial render, the value may be undefined, so components must handle this case. This hook does not subscribe to any data. It only provides access to the collection instance. 5 Queries​ To render query results in your component, use the useRxQuery hook. import { useRxQuery } from 'rxdb/plugins/react'; const query = { collection: 'heroes', query: { selector: {}, sort: [{ name: 'asc' }] } }; const HeroCount = () => { const { results, loading } = useRxQuery(query); if (loading) { return <span>Loading...</span>; } return <span>Total heroes: {results.length}</span>; }; The query is executed when the component renders. If the component re-renders, the query may be re-executed, but changes in the underlying data will not automatically trigger updates. This hook is well suited for static views, server-side rendering, and cases where live updates are not required. 6 Live queries​ Most React applications require views that automatically update when the database changes. For this purpose, RxDB provides the useLiveRxQuery hook. The hook accepts a query description object and returns the current results together with a loading state. import { useLiveRxQuery } from 'rxdb/plugins/react'; const query = { collection: 'heroes', query: { selector: {}, sort: [{ name: 'asc' }] } }; const HeroList = () => { const { results, loading } = useLiveRxQuery(query); if (loading) { return <span>Loading...</span>; } return ( <ul> {results.map(hero => ( <li key={hero.name}>{hero.name}</li> ))} </ul> ); }; The component automatically re-renders whenever the query result changes. Subscriptions are created when the component mounts and are cleaned up automatically when the component unmounts. The returned documents are fully reactive RxDB documents and can be modified or removed directly. ","version":"Next","tagName":"h2"},{"title":"React Native compatibility​","type":1,"pageTitle":"React","url":"/react.html#react-native-compatibility","content":" All hooks and providers described on this page work the same way in React Native. The React integration does not rely on any browser-specific APIs. The only platform-specific part of a React Native setup is database creation, where a different storage plugin is typically used. Once the database is created, the React integration behaves identically. ","version":"Next","tagName":"h2"},{"title":"Signals​","type":1,"pageTitle":"React","url":"/react.html#signals","content":" In addition to the React hooks shown on this page, RxDB also supports alternative reactivity models such as signals. RxDB's core reactivity system can be configured to expose reactive values using different primitives instead of RxJS observables, which makes it possible to integrate RxDB with signal-based approaches in React or other frameworks. This is an advanced capability and is independent of the React integration described here. For more details about how RxDB's reactivity system works and how custom reactivity can be configured, see the Reactivity documentation. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"React","url":"/react.html#follow-up","content":" RxDB includes a full React example application that demonstrates the patterns described on this page, including database creation outside of React, usage of RxDatabaseProvider, and data access via useRxQuery, useLiveRxQuery, and `useRxCollection. A corresponding React Native example is also available and shows the same integration concepts applied in a mobile environment, with only the platform-specific storage and setup differing. ","version":"Next","tagName":"h2"},{"title":"React Native Database","type":0,"sectionRef":"#","url":"/react-native-database.html","content":"","keywords":"","version":"Next"},{"title":"Database Solutions for React-Native​","type":1,"pageTitle":"React Native Database","url":"/react-native-database.html#database-solutions-for-react-native","content":" There are multiple database solutions that can be used with React Native. While I would recommend to use RxDB for most use cases, it is still helpful to learn about other alternatives. ","version":"Next","tagName":"h2"},{"title":"AsyncStorage​","type":1,"pageTitle":"React Native Database","url":"/react-native-database.html#asyncstorage","content":" AsyncStorage is a key->value storage solution that works similar to the browsers localstorage API. The big difference is that access to the AsyncStorage is not a blocking operation but instead everything is Promise based. This is a big benefit because long running writes and reads will not block your JavaScript process which would cause a laggy user interface. /** * Because it is Promise-based, * you have to 'await' the call to getItem() */ await setItem('myKey', 'myValue'); const value = await AsyncStorage.getItem('myKey'); AsyncStorage was originally included in React Native itself. But it was deprecated by the React Native Team which recommends to use a community based package instead. There is a community fork of AsyncStorage that is actively maintained and open source. AsyncStorage is fine when only a small amount of data needs to be stored and when no query capabilities besides the key-access are required. Complex queries or features are not supported which makes AsyncStorage not suitable for anything more than storing simple user settings data. ","version":"Next","tagName":"h3"},{"title":"SQLite​","type":1,"pageTitle":"React Native Database","url":"/react-native-database.html#sqlite","content":" SQLite is a SQL based relational database written in C that was crafted to be embed inside of applications. Operations are written in the SQL query language and SQLite generally follows the PostgreSQL syntax. To use SQLite in React Native, you first have to include the SQLite library itself as a plugin. There a different project out there that can be used, but I would recommend to use the react-native-quick-sqlite project. First you have to install the library into your React Native project via npm install react-native-quick-sqlite. In your code you can then import the library and create a database connection: import {open} from 'react-native-quick-sqlite'; const db = open('myDb.sqlite'); Notice that SQLite is a file based database where all data is stored directly in the filesystem of the OS. Therefore to create a connection, you have to provide a filename. With the open connection you can then run SQL queries: let { rows } = db.execute('SELECT somevalue FROM sometable'); If that does not work for you, you might want to try the react-native-sqlite-storage project instead which is also very popular. Downsides of Using SQLite in UI-Based Apps​ While SQLite is reliable and well-tested, it has several shortcomings when it comes to using it directly in UI-based React Native applications: Lack of Observability: Out of the box, SQLite does not offer a straightforward way to observe queries or document fields. This means that implementing real-time data updates in your UI requires additional layers or libraries.Bridging Overhead: Each query or data operation must go through the React Native bridge to access the native SQLite module. This can introduce performance bottlenecks or responsiveness issues, especially for large or complex data operations.No Built-In Replication: SQLite on its own is not designed for syncing data across multiple devices or with a backend. If your app requires multi-device data syncing or offline-first features, additional tools or a custom solution are necessary.Version Management: Handling schema changes often requires a custom migration process. If your data structure evolves frequently, managing these migrations can be cumbersome. Overall, SQLite can be a good solution for straightforward, local-only data storage where complex real-time features or synchronization are not needed. For more advanced requirements, like reactive UI updates or multi-client data replication, you'll likely want a more feature-rich solution. ","version":"Next","tagName":"h3"},{"title":"PouchDB​","type":1,"pageTitle":"React Native Database","url":"/react-native-database.html#pouchdb","content":" PouchDB is a JavaScript NoSQL database that follows the API of the Apache CouchDB server database. The core feature of PouchDB is the ability to do a two-way replication with any CouchDB compliant endpoint. While PouchDB is pretty mature, it has some drawbacks that blocks it from being used in a client-side React Native application. For example it has to store all documents states over time which is required to replicate with CouchDB. Also it is not easily possible to fully purge documents and so it will fill up disc space over time. A big problem is also that PouchDB is not really maintained and major bugs like wrong query results are not fixed anymore. The performance of PouchDB is a general bottleneck which is caused by how it has to store and fetch documents while being compliant to CouchDB. The only real reason to use PouchDB in React Native, is when you want to replicate with a CouchDB or Couchbase server. Because PouchDB is based on an adapter system for storage, there are two options to use it with React Native: Either use the pouchdb-adapter-react-native-sqlite adapteror the pouchdb-adapter-asyncstorage adapter. Because the asyncstorage adapter is no longer maintained, it is recommended to use the native-sqlite adapter: First you have to install the adapter and other dependencies via npm install pouchdb-adapter-react-native-sqlite react-native-quick-sqlite react-native-quick-websql. Then you have to craft a custom PouchDB class that combines these plugins: import 'react-native-get-random-values'; import PouchDB from 'pouchdb-core'; import HttpPouch from 'pouchdb-adapter-http'; import replication from 'pouchdb-replication'; import mapreduce from 'pouchdb-mapreduce'; import SQLiteAdapterFactory from 'pouchdb-adapter-react-native-sqlite'; import WebSQLite from 'react-native-quick-websql'; const SQLiteAdapter = SQLiteAdapterFactory(WebSQLite); export default PouchDB.plugin(HttpPouch) .plugin(replication) .plugin(mapreduce) .plugin(SQLiteAdapter); This can then be used to create a PouchDB database instance which can store and query documents: const db = new PouchDB('mydb.db', { adapter: 'react-native-sqlite' }); ","version":"Next","tagName":"h3"},{"title":"RxDB​","type":1,"pageTitle":"React Native Database","url":"/react-native-database.html#rxdb","content":" RxDB is an local-first, NoSQL-database for JavaScript applications. It is reactive which means that you can not only query the current state, but subscribe to all state changes like the result of a query or even a single field of a document. This is great for UI-based realtime applications in a way that makes it easy to develop realtime applications like what you need in React Native. Key benefits of RxDB include: Observability and Real-Time Queries: Automatic UI updates when underlying data changes, making it much simpler to build responsive, reactive apps.Offline-First and Sync: Built-in support for syncing with CouchDB, or via GraphQL replication, allowing your app to work offline and seamlessly sync when online. It is easy to make the RxDB replication compatible with anything that supports HTTP.Encryption and Data Security: RxDB supports field-level encryption and a robust plugin ecosystem for compression and attachments.Data Modeling and Ease of Use: Offers a schema-based approach that helps catch invalid data early and ensures consistency.Performance: Optimized for storing and querying large amounts of data on mobile devices. There are multiple ways to use RxDB in React Native: Use the memory RxStorage that stores the data inside of the JavaScript memory without persistenceUse the SQLite RxStorage with the react-native-quick-sqlite plugin. It is recommended to use the SQLite RxStorage because it has the best performance and is the easiest to set up. However it is part of the 👑 Premium Plugins which must be purchased, so to try out RxDB with React Native, you might want to use the memory storage first. Later you can replace it with the SQLite storage by just changing two lines of configuration. First you have to install all dependencies via npm install rxdb rxjs rxdb-premium react-native-quick-sqlite. Then you can assemble the RxStorage and create a database with it: 1 Import RxDB and SQLite​ import { createRxDatabase } from 'rxdb'; import { open } from 'react-native-quick-sqlite'; RxDB Core RxDB Premium 👑 import { getRxStorageSQLiteTrial, getSQLiteBasicsCapacitor } from 'rxdb/plugins/storage-sqlite'; 2 Create a database​ const myRxDatabase = await createRxDatabase({ // Instead of a simple name, // you can use a folder path to determine the database location name: 'exampledb', multiInstance: false, // <- Set this to false when using RxDB in React Native storage: getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsQuickSQLite(open) }) }); 3 Add a Collection​ const collections = await myRxDatabase.addCollections({ humans: { schema: { version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string', maxLength: 100 }, name: { type: 'string' }, age: { type: 'number' } }, required: ['id', 'name'] } } }); 4 Insert a Document​ await collections.humans.insert({id: 'foo', name: 'bar'}); 5 Run a Query​ const result = await collections.humans.find({ selector: { name: 'bar' } }).exec(); 6 Observe a Query​ await collections.humans.find({ selector: { name: 'bar' } }).$.subscribe(result => {/* ... */}); Using the SQLite RxStorage is pretty fast, which is shown in the performance comparison. To learn more about using RxDB with React Native, you might want to check out this example project. Also RxDB provides many other features like encryption or compression. You can even store binary data as attachments or use RxDB as an ORM in React Native. ","version":"Next","tagName":"h3"},{"title":"Realm​","type":1,"pageTitle":"React Native Database","url":"/react-native-database.html#realm","content":" Realm is another database solution that is particularly popular in the mobile world. Originally an independent project, Realm is now owned by MongoDB, and has seen deeper integration with MongoDB services over time. Pros: Fast, object-based database approach with an easy data model.Historically known for good performance and a simple, user-friendly API. Downsides: Forced MongoDB Cloud Usage: Realm Sync is now tightly coupled with MongoDB Realm Cloud. If you want to use their full sync or advanced features, you are essentially locked into MongoDB's ecosystem, which can be a downside if you need on-premise or custom hosting.Missing or Limited Features: While Realm covers many basic needs, some developers find that advanced queries or certain offline-first features are not as robust or flexible as other solutions.Vendor Lock-In: If you rely heavily on Realm Sync, migrating away from MongoDB's cloud can be difficult because the sync logic and data format are tightly integrated.Community Concerns: Since the MongoDB acquisition, some worry about Realm's open-source future and whether large changes or new features will remain community-friendly. Although Realm can be a good solution when used purely as a local database, if you plan on syncing data across clients or want to avoid cloud vendor lock-in, you should consider carefully how MongoDB's ownership might affect your long-term plans. ","version":"Next","tagName":"h3"},{"title":"Firebase / Firestore​","type":1,"pageTitle":"React Native Database","url":"/react-native-database.html#firebase--firestore","content":" Firestore is a cloud based database technology that stores data on clients devices and replicates it with the Firebase cloud service that is run by google. It has many features like observability and authentication. The main feature lacking is the non-complete offline first support because clients cannot start the application while being offline because then the authentication does not work. After they are authenticated, being offline is no longer a problem. Also using firestore creates a vendor lock-in because it is not possible to replicate with a custom self hosted backend. To get started with Firestore in React Native, it is recommended to use the React Native Firebase open-source project. ","version":"Next","tagName":"h3"},{"title":"Summary​","type":1,"pageTitle":"React Native Database","url":"/react-native-database.html#summary","content":" Characteristic\tAsyncStorage\tSQLite\tPouchDB\tRxDB\tRealm\tFirestoreDatabase Type\tKey-value store, no advanced queries\tEmbedded SQL engine in a local file\tNoSQL doc store, revision-based\tNoSQL doc-based (JSON)\tObject-based (MongoDB-owned)\tNoSQL doc-based, cloud by Google Query Model\tgetItem/setItem only\tStandard SQL statements\tMap/reduce or basic Mango queries\tJSON-based query language, optional indexes\tObject-level queries, sync with MongoDB Realm\tDocument queries, limited advanced ops Observability\tNone built-in\tNo direct reactivity\tChanges feed from Couch-style backend\tBuilt-in reactive queries, UI auto-updates\tLocal reactivity, or realm sync (cloud)\tReal-time snapshots, partial offline Offline Replication\tNone\tNone by default\tCouchDB-compatible sync\tBuilt-in sync (HTTP, GraphQL, CouchDB, etc.)\tRealm Cloud sync only\tBasic offline caching, re-auth needed Performance\tFine for small keys/values\tGenerally good; bridging overhead\tOK for mid data sets; can bloat over time\tVaries by storage; Dexie/SQLite w/ compression can be fast\tTypically fast on mobile\tGood read-heavy perf; can be rate-limited, costly Schema Handling\tNone\tSQL schema, migrations needed\tNo formal schema, doc-based\tOptional JSON-Schema, typed checks, compression\tDeclarative schema, migration needed\tNo strict schema; rules in console mostly Usage Cases\tStore small user settings\tLocal structured data, moderate queries\tBasic doc store, synergy with CouchDB\tReactive offline-first for large or dynamic data\tLocal object DB, locked to MongoDB realm sync\tReal-time Google backend, partial offline, vendor lock-in ","version":"Next","tagName":"h3"},{"title":"Follow up​","type":1,"pageTitle":"React Native Database","url":"/react-native-database.html#follow-up","content":" A good way to learn using RxDB database with React Native is to check out the RxDB React Native example and use that as a tutorial.If you haven't done so yet, you should start learning about RxDB with the Quickstart Tutorial.There is a followup list of other client side database alternatives that might work with React Native. ","version":"Next","tagName":"h2"},{"title":"Replication with CouchDB","type":0,"sectionRef":"#","url":"/replication-couchdb.html","content":"","keywords":"","version":"Next"},{"title":"Pros​","type":1,"pageTitle":"Replication with CouchDB","url":"/replication-couchdb.html#pros","content":" Faster initial replication.Works with any RxStorage, not just PouchDB.Easier conflict handling because conflicts are handled during replication and not afterwards.Does not have to store all document revisions on the client, only stores the newest version. ","version":"Next","tagName":"h2"},{"title":"Cons​","type":1,"pageTitle":"Replication with CouchDB","url":"/replication-couchdb.html#cons","content":" Does not support the replication of attachments.Like all CouchDB replication plugins, this one is also limited to replicating 6 collections in parallel. Read this for workarounds ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Replication with CouchDB","url":"/replication-couchdb.html#usage","content":" Start the replication via replicateCouchDB(). import { replicateCouchDB } from 'rxdb/plugins/replication-couchdb'; const replicationState = replicateCouchDB( { replicationIdentifier: 'my-couchdb-replication', collection: myRxCollection, // url to the CouchDB endpoint (required) url: 'http://example.com/db/humans', /** * true for live replication, * false for a one-time replication. * [default=true] */ live: true, /** * A custom fetch() method can be provided * to add authentication or credentials. * Can be swapped out dynamically * by running 'replicationState.fetch = newFetchMethod;'. * (optional) */ fetch: myCustomFetchMethod, pull: { /** * Amount of documents to be fetched in one HTTP request * (optional) */ batchSize: 60, /** * Custom modifier to mutate pulled documents * before storing them in RxDB. * (optional) */ modifier: docData => {/* ... */}, /** * Heartbeat time in milliseconds * for the long polling of the changestream. * @link https://docs.couchdb.org/en/3.2.2-docs/api/database/changes.html * (optional, default=60000) */ heartbeat: 60000 }, push: { /** * How many local changes to process at once. * (optional) */ batchSize: 60, /** * Custom modifier to mutate documents * before sending them to the CouchDB endpoint. * (optional) */ modifier: docData => {/* ... */} } } ); When you call replicateCouchDB() it returns a RxCouchDBReplicationState which can be used to subscribe to events, for debugging or other functions. It extends the RxReplicationState so any other method that can be used there can also be used on the CouchDB replication state. ","version":"Next","tagName":"h2"},{"title":"Conflict handling​","type":1,"pageTitle":"Replication with CouchDB","url":"/replication-couchdb.html#conflict-handling","content":" When conflicts appear during replication, the conflictHandler of the RxCollection is used, equal to the other replication plugins. Read more about conflict handling here. ","version":"Next","tagName":"h2"},{"title":"Auth example​","type":1,"pageTitle":"Replication with CouchDB","url":"/replication-couchdb.html#auth-example","content":" Lets say for authentication you need to add a bearer token as HTTP header to each request. You can achieve that by crafting a custom fetch() method that add the header field. const myCustomFetch = (url, options) => { // flat clone the given options to not mutate the input const optionsWithAuth = Object.assign({}, options); // ensure the headers property exists if(!optionsWithAuth.headers) { optionsWithAuth.headers = {}; } // add bearer token to headers optionsWithAuth.headers['Authorization'] ='Basic S0VLU0UhIExFQ0...'; // call the original fetch function with our custom options. return fetch( url, optionsWithAuth ); }; const replicationState = replicateCouchDB( { replicationIdentifier: 'my-couchdb-replication', collection: myRxCollection, url: 'http://example.com/db/humans', /** * Add the custom fetch function here. */ fetch: myCustomFetch, pull: {}, push: {} } ); Also when your bearer token changes over time, you can set a new custom fetch method while the replication is running: replicationState.fetch = newCustomFetchMethod; Also there is a helper method getFetchWithCouchDBAuthorization() to create a fetch handler with authorization: import { replicateCouchDB, getFetchWithCouchDBAuthorization } from 'rxdb/plugins/replication-couchdb'; const replicationState = replicateCouchDB( { replicationIdentifier: 'my-couchdb-replication', collection: myRxCollection, url: 'http://example.com/db/humans', /** * Add the custom fetch function here. */ fetch: getFetchWithCouchDBAuthorization('myUsername', 'myPassword'), pull: {}, push: {} } ); ","version":"Next","tagName":"h2"},{"title":"Limitations​","type":1,"pageTitle":"Replication with CouchDB","url":"/replication-couchdb.html#limitations","content":" Since CouchDB only allows synchronization through HTTP1.1 long polling requests there is a limitation of 6 active synchronization connections before the browser prevents sending any further request. This limitation is at the level of browser per tab per domain (some browser, especially older ones, might have a different limit, see here). Since this limitation is at the browser level there are several solutions: Use only a single database for all entities and set a "type" field for each of the documentsCreate multiple subdomains for CouchDB and use a max of 6 active synchronizations (or less) for eachUse a proxy (ex: HAProxy) between the browser and CouchDB and configure it to use HTTP2.0, since HTTP2.0 If you use nginx in front of your CouchDB, you can use these settings to enable http2-proxying to prevent the connection limit problem: server { http2 on; location /db { rewrite /db/(.*) /$1 break; proxy_pass http://172.0.0.1:5984; proxy_redirect off; proxy_buffering off; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded proxy_set_header Connection "keep_alive" } } ","version":"Next","tagName":"h2"},{"title":"Known problems​","type":1,"pageTitle":"Replication with CouchDB","url":"/replication-couchdb.html#known-problems","content":" ","version":"Next","tagName":"h2"},{"title":"Database missing​","type":1,"pageTitle":"Replication with CouchDB","url":"/replication-couchdb.html#database-missing","content":" In contrast to PouchDB, this plugin does NOT automatically create missing CouchDB databases. If your CouchDB server does not have a database yet, you have to create it by yourself by running a PUT request to the database name url: // create a 'humans' CouchDB database on the server const remoteDatabaseName = 'humans'; await fetch( 'http://example.com/db/' + remoteDatabaseName, { method: 'PUT' } ); ","version":"Next","tagName":"h3"},{"title":"React Native​","type":1,"pageTitle":"Replication with CouchDB","url":"/replication-couchdb.html#react-native","content":" React Native does not have a global fetch method. You have to import fetch method with the cross-fetch package: import crossFetch from 'cross-fetch'; const replicationState = replicateCouchDB( { replicationIdentifier: 'my-couchdb-replication', collection: myRxCollection, url: 'http://example.com/db/humans', fetch: crossFetch, pull: {}, push: {} } ); ","version":"Next","tagName":"h2"},{"title":"Replication with Firestore from Firebase","type":0,"sectionRef":"#","url":"/replication-firestore.html","content":"","keywords":"","version":"Next"},{"title":"Usage​","type":1,"pageTitle":"Replication with Firestore from Firebase","url":"/replication-firestore.html#usage","content":" 1 Install the firebase package​ npm install firebase 2 Initialize your Firestore Database​ import * as firebase from 'firebase/app'; import { getFirestore, collection } from 'firebase/firestore'; const projectId = 'my-project-id'; const app = firebase.initializeApp({ projectId, databaseURL: 'http://localhost:8080?ns=' + projectId, /* ... */ }); const firestoreDatabase = getFirestore(app); const firestoreCollection = collection(firestoreDatabase, 'my-collection-name'); 3 Start the Replication​ Start the replication by calling replicateFirestore() on your RxCollection. const replicationState = replicateFirestore({ replicationIdentifier: `https://firestore.googleapis.com/${projectId}`, collection: myRxCollection, firestore: { projectId, database: firestoreDatabase, collection: firestoreCollection }, /** * (required) Enable push and pull replication with firestore by * providing an object with optional filter * for each type of replication desired. * [default=disabled] */ pull: {}, push: {}, /** * Either do a live or a one-time replication * [default=true] */ live: true, /** * (optional) likely you should just use the default. * * In firestore it is not possible to read out * the internally used write timestamp of a document. * Even if we could read it out, it is not indexed which * is required for fetch 'changes-since-x'. * So instead we have to rely on a custom user defined field * that contains the server time * which is set by firestore via serverTimestamp() * Notice that the serverTimestampField MUST NOT be * part of the collections RxJsonSchema! * [default='serverTimestamp'] */ serverTimestampField: 'serverTimestamp' }); To observe and cancel the replication, you can use any other methods from the ReplicationState like error$, cancel() and awaitInitialReplication(). ","version":"Next","tagName":"h2"},{"title":"Handling deletes​","type":1,"pageTitle":"Replication with Firestore from Firebase","url":"/replication-firestore.html#handling-deletes","content":" RxDB requires you to never fully delete documents. This is needed to be able to replicate the deletion state of a document to other instances. The firestore replication will set a boolean _deleted field to all documents to indicate the deletion state. You can change this by setting a different deletedField in the sync options. ","version":"Next","tagName":"h2"},{"title":"Do not set enableIndexedDbPersistence()​","type":1,"pageTitle":"Replication with Firestore from Firebase","url":"/replication-firestore.html#do-not-set-enableindexeddbpersistence","content":" Firestore has the enableIndexedDbPersistence() feature which caches document states locally to IndexedDB. This is not needed when you replicate your Firestore with RxDB because RxDB itself will store the data locally already. ","version":"Next","tagName":"h2"},{"title":"Using the replication with an already existing Firestore Database State​","type":1,"pageTitle":"Replication with Firestore from Firebase","url":"/replication-firestore.html#using-the-replication-with-an-already-existing-firestore-database-state","content":" If you have not used RxDB before and you already have documents inside of your Firestore database, you have to manually set the _deleted field to false and the serverTimestamp to all existing documents. import { getDocs, query, serverTimestamp } from 'firebase/firestore'; const allDocsResult = await getDocs(query(firestoreCollection)); allDocsResult.forEach(doc => { doc.update({ _deleted: false, serverTimestamp: serverTimestamp() }) }); Also notice that if you do writes from non-RxDB applications, you have to keep these fields in sync. It is recommended to use the Firestore triggers to ensure that. ","version":"Next","tagName":"h2"},{"title":"Filtered Replication​","type":1,"pageTitle":"Replication with Firestore from Firebase","url":"/replication-firestore.html#filtered-replication","content":" You might need to replicate only a subset of your collection, either to or from Firestore. You can achieve this using push.filter and pull.filter options. const replicationState = replicateFirestore( { collection: myRxCollection, firestore: { projectId, database: firestoreDatabase, collection: firestoreCollection }, pull: { filter: [ where('ownerId', '==', userId) ] }, push: { filter: (item) => item.syncEnabled === true } } ); Keep in mind that you can not use inequality operators (<, <=, !=, not-in, >, or >=) in pull.filter since that would cause a conflict with ordering by serverTimestamp. ","version":"Next","tagName":"h2"},{"title":"RxDB Appwrite Replication","type":0,"sectionRef":"#","url":"/replication-appwrite.html","content":"","keywords":"","version":"Next"},{"title":"Why you should use RxDB with Appwrite?​","type":1,"pageTitle":"RxDB Appwrite Replication","url":"/replication-appwrite.html#why-you-should-use-rxdb-with-appwrite","content":" Appwrite is a secure, open-source backend server that simplifies backend tasks like user authentication, storage, database management, and real-time APIs. RxDB is a reactive database for the frontend that offers offline-first capabilities and rich client-side data handling. Combining the two provides several benefits: Offline-First: RxDB keeps all data locally, so your application remains fully functional even when the network is unavailable. When connectivity returns, the RxDB ↔ Appwrite replication automatically resolves and synchronizes changes. Real-Time Sync: With Appwrite’s real-time subscriptions and RxDB’s live replication, you can build collaborative features that update across all clients instantaneously. Conflict Handling: RxDB offers flexible conflict resolution strategies, making it simpler to handle concurrent edits across multiple users or devices. Scalable & Secure: Appwrite is built to handle production loads with granular access controls, while RxDB easily scales across various storage backends on the client side. Simplicity & Modularity: RxDB’s plugin-based architecture, combined with Appwrite’s Cloud offering makes it one of the easiest way to build local-first realtime apps that scale. Client A Client B Client C ","version":"Next","tagName":"h2"},{"title":"Preparing the Appwrite Server​","type":1,"pageTitle":"RxDB Appwrite Replication","url":"/replication-appwrite.html#preparing-the-appwrite-server","content":" You can either use the appwrite cloud or self-host the Appwrite server. In this tutorial we use the Cloud which is recommended for beginners because it is way easier to set up. You can later decide to self-host if needed. 1 Set up an Appwrite Endpoint and Project​ Self-Hosted Appwrite Cloud 1 Docker​ Ensure docker and docker-compose is installed and your version are up to date: docker-compose -v 2 Run the installation script​ The installation script runs inside of a docker container. It will create a docker-compose file and an .env file. docker run -it --rm \\ --volume /var/run/docker.sock:/var/run/docker.sock \\ --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \\ --entrypoint="install" \\ appwrite/appwrite:1.6.1 3 Start/Stop​ After the installation is done, you can manually stop and start the appwrite instance with docker compose: # stop docker-compose down # start docker-compose up 2 Create an Appwrite Database and Collection​ After creating an Appwrite project you have to create an Appwrite Database and a collection, you can either do this in code with the node-appwrite SDK or in the Appwrite Console as shown in this video: 9:47 Appwrite Database Tutorial 3 Add your documents attributes​ In the appwrite collection, create all attributes of your documents. You have to define all the fields that your document in your RxDB schema knows about. Notice that Appwrite does not allow for nested attributes. So when you use RxDB with Appwrite, you should also not have nested attributes in your RxDB schema. 4 Add a deleted attribute​ Appwrite (natively) hard-deletes documents. But for offline-handling RxDB needs soft-deleted documents on the server so that the deletion state can be replicated with other clients. In RxDB, _deleted indicates that a document is removed locally and you need a similar field in your Appwrite collection on the Server: You must define a deletedField with any name to mark documents as "deleted" in the remote collection. Mostly you would use a boolean field named deleted (set it to required). The plugin will treat any document with { [deletedField]: true } as deleted and replicate that state to local RxDB. 5 Set the Permission on the Appwrite Collection​ Appwrite uses permissions to control data access on the collection level. Make sure that in the Console at Collection -> Settings -> Permissions you have set the permission according to what you want to allow your clients to do. For testing, just enable all of them (Create, Read, Update and Delete). ","version":"Next","tagName":"h2"},{"title":"Setting up the RxDB - Appwrite Replication​","type":1,"pageTitle":"RxDB Appwrite Replication","url":"/replication-appwrite.html#setting-up-the-rxdb---appwrite-replication","content":" Now that we have set up the Appwrite server, we can go to the client side code and set up RxDB and the replication: 1 Install the Appwrite SDK and RxDB:​ npm install appwrite rxdb 2 Import the Appwrite SDK and RxDB​ import { replicateAppwrite } from 'rxdb/plugins/replication-appwrite'; import { createRxDatabase, addRxPlugin, RxCollection } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; import { Client } from 'appwrite'; 3 Create a Database with a Collection​ const db = await createRxDatabase({ name: 'mydb', storage: getRxStorageLocalstorage() }); const mySchema = { title: 'my schema', version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 }, name: { type: 'string' } }, required: ['id', 'name'] }; await db.addCollections({ humans: { schema: mySchema } }); const collection = db.humans; 4 Configure the Appwrite Client​ Appwrite Cloud Self-Hosted const client = new Client(); client.setEndpoint('https://cloud.appwrite.io/v1'); client.setProject('YOUR_APPWRITE_PROJECT_ID'); 5 Start the Replication​ const replicationState = replicateAppwrite({ replicationIdentifier: 'my-appwrite-replication', client, databaseId: 'YOUR_APPWRITE_DATABASE_ID', collectionId: 'YOUR_APPWRITE_COLLECTION_ID', deletedField: 'deleted', // Field that represents deletion in Appwrite collection, pull: { batchSize: 10, }, push: { batchSize: 10 }, /* * ... * You can set all other options for RxDB replication states * like 'live' or 'retryTime' * ... */ }); 6 Do other things with the replication state​ The RxAppwriteReplicationState which is returned from replicateAppwrite() allows you to run all functionality of the normal RxReplicationState. ","version":"Next","tagName":"h2"},{"title":"Limitations of the Appwrite Replication Plugin​","type":1,"pageTitle":"RxDB Appwrite Replication","url":"/replication-appwrite.html#limitations-of-the-appwrite-replication-plugin","content":" Appwrite primary keys only allow for the characters a-z, A-Z, 0-9, and underscore _ (They cannot start with a leading underscore). Also the primary key has a max length of 36 characters.The Appwrite replication only works on browsers. This is because the Appwrite SDK does not support subscriptions in Node.js.Appwrite does not allow for bulk write operations so on push one HTTP request will be made per document. Reads run in bulk so this is mostly not a problem.Appwrite does not allow for transactions or "update-if" calls which can lead to overwriting documents instead of properly handling conflicts when multiple clients edit the same document in parallel. This is not a problem for inserts because "insert-if-not" calls are made.Nested attributes in Appwrite collections are only possible via experimental relationship attributes, and compatibility with RxDB is not tested. Users opting to use these experimental relationship attributes with RxDB do so at their own risk. ","version":"Next","tagName":"h2"},{"title":"Replication with NATS","type":0,"sectionRef":"#","url":"/replication-nats.html","content":"","keywords":"","version":"Next"},{"title":"Precondition​","type":1,"pageTitle":"Replication with NATS","url":"/replication-nats.html#precondition","content":" For the replication endpoint the NATS cluster must have enabled JetStream and store all message data as structured JSON. The easiest way to start a compatible NATS server is to use the official docker image: docker run --rm --name rxdb-nats -p 4222:4222 nats:2.9.17 -js ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Replication with NATS","url":"/replication-nats.html#usage","content":" 1 Install the nats package​ npm install nats --save 2 Start the Replication​ To start the replication, import the replicateNats() method from the RxDB plugin and call it with the collection that must be replicated. The replication runs per RxCollection, you can replicate multiple RxCollections by starting a new replication for each of them. import { replicateNats } from 'rxdb/plugins/replication-nats'; const replicationState = replicateNats({ collection: myRxCollection, replicationIdentifier: 'my-nats-replication-collection-A', // in NATS, each stream need a name streamName: 'stream-for-replication-A', /** * The subject prefix determines how the documents are stored in NATS. * For example the document with id 'alice' * will have the subject 'foobar.alice' */ subjectPrefix: 'foobar', connection: { servers: 'localhost:4222' }, live: true, pull: { batchSize: 30 }, push: { batchSize: 30 } }); ","version":"Next","tagName":"h2"},{"title":"Handling deletes​","type":1,"pageTitle":"Replication with NATS","url":"/replication-nats.html#handling-deletes","content":" RxDB requires you to never fully delete documents. This is needed to be able to replicate the deletion state of a document to other instances. The NATS replication will set a boolean _deleted field to all documents to indicate the deletion state. You can change this by setting a different deletedField in the sync options. ","version":"Next","tagName":"h2"},{"title":"The RxDB Plugin replication-p2p has been renamed to replication-webrtc","type":0,"sectionRef":"#","url":"/replication-p2p.html","content":"The RxDB Plugin replication-p2p has been renamed to replication-webrtc The new documentation page has been moved to here","keywords":"","version":"Next"},{"title":"MongoDB Replication Plugin for RxDB - Real-Time, Offline-First Sync","type":0,"sectionRef":"#","url":"/replication-mongodb.html","content":"","keywords":"","version":"Next"},{"title":"Key Features​","type":1,"pageTitle":"MongoDB Replication Plugin for RxDB - Real-Time, Offline-First Sync","url":"/replication-mongodb.html#key-features","content":" Two-way replication between MongoDB and RxDB collectionsOffline-first support with automatic incremental re-syncIncremental updates via MongoDB Change StreamsConflict resolution handled by the RxDB Sync EngineAtlas and self-hosted support for replica sets and sharded clusters ","version":"Next","tagName":"h2"},{"title":"Architecture Overview​","type":1,"pageTitle":"MongoDB Replication Plugin for RxDB - Real-Time, Offline-First Sync","url":"/replication-mongodb.html#architecture-overview","content":" The plugin operates in a three-tier architecture: Clients connect to RxServer, which in turn connects to MongoDB. RxServer streams changes from MongoDB to connected clients and pushes client-side updates back to MongoDB. For the client side, RxServer exposes a replication endpoint over WebSocket or HTTP, which your RxDB-powered applications can consume. The following diagram illustrates the flow of updates between clients, RxServer, and MongoDB in a live synchronization setup: Client A RxServer MongoDB Client B Client C note The MongoDB Replication Plugin is optimized for Node.js environments (e.g., when RxDB runs within RxServer or other backend services). Direct connections from browsers or mobile apps to MongoDB are not supported because MongoDB does not use HTTP as its wire protocol and requires a driver-level connection to a replica set or sharded cluster. ","version":"Next","tagName":"h2"},{"title":"Setting up the Client-RxServer-MongoDB Sync​","type":1,"pageTitle":"MongoDB Replication Plugin for RxDB - Real-Time, Offline-First Sync","url":"/replication-mongodb.html#setting-up-the-client-rxserver-mongodb-sync","content":" 1 Install the Client Dependencies​ In your JavaScript project, install the RxDB libraries and the MongoDB node.js driver: npm install rxdb rxdb-server mongodb --save 2 Set up a MongoDB Server​ As first step, you need access to a running MongoDB Server. This can be done by either running a server locally or using the Atlas Cloud. Notice that we need to have a replica set because only on these, the MongoDB changestream can be used. Shell Docker MongoDB Atlas If you have installed MongoDB locally, you can start the server with this command: mongod --replSet rs0 --bind_ip_all After this step you should have a valid connection string that points to a running MongoDB Server like mongodb://localhost:27017/. 3 Create a MongoDB Database and Collection​ On your MongoDB server, make sure to create a database and a collection. //> server.ts import { MongoClient } from 'mongodb'; const mongoClient = new MongoClient('mongodb://localhost:27017/?directConnection=true'); const mongoDatabase = mongoClient.db('my-database'); await mongoDatabase.createCollection('my-collection', { changeStreamPreAndPostImages: { enabled: true } }); note To observe document deletions on the changestream, changeStreamPreAndPostImages must be enabled. This is not required if you have an insert/update-only collection where no documents are deleted ever. 4 Create a RxDB Database and Collection​ Now we create an RxDB database and a collection. In this example the memory storage, in production you would use a persistent storage instead. //> server.ts import { createRxDatabase, addRxPlugin } from 'rxdb'; import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; // Create server-side RxDB instance const db = await createRxDatabase({ name: 'serverdb', storage: getRxStorageMemory() }); // Add your collection schema await db.addCollections({ humans: { schema: { version: 0, primaryKey: 'passportId', type: 'object', properties: { passportId: { type: 'string', maxLength: 100 }, firstName: { type: 'string' }, lastName: { type: 'string' } }, required: ['passportId', 'firstName', 'lastName'] } } }); 5 Sync the Collection with the MongoDB Server​ Now we can start a replication that does a two-way replication between the RxDB Collection and the MongoDB Collection. //> server.ts import { replicateMongoDB } from 'rxdb/plugins/replication-mongodb'; const replicationState = replicateMongoDB({ mongodb: { collectionName: 'my-collection', connection: 'mongodb://localhost:27017', databaseName: 'my-database' }, collection: db.humans, replicationIdentifier: 'humans-mongodb-sync', pull: { batchSize: 50 }, push: { batchSize: 50 }, live: true }); You can do many things with the replication state The RxMongoDBReplicationState which is returned from replicateMongoDB() allows you to run all functionality of the normal RxReplicationState like observing errors or doing start/stop operations. 6 Start a RxServer​ Now that we have a RxDatabase and Collection that is replicated with MongoDB, we can spawn a RxServer on top of it. This server can then be used by client devices to connect. //> server.ts import { createRxServer } from 'rxdb-server/plugins/server'; import { RxServerAdapterExpress } from 'rxdb-server/plugins/adapter-express'; const server = await createRxServer({ database: db, adapter: RxServerAdapterExpress, port: 8080, cors: '*' }); const endpoint = server.addReplicationEndpoint({ name: 'humans', collection: db.humans }); console.log('Replication endpoint:', `http://localhost:8080/${endpoint.urlPath}`); // do not forget to start the server! await server.start(); 7 Sync a Client with the RxServer​ On the client-side we create the exact same RxDatabase and collection and then replicate it with the replication endpoint of the RxServer. //> client.ts import { createRxDatabase } from 'rxdb'; import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; import { replicateServer } from 'rxdb-server/plugins/replication-server'; const db = await createRxDatabase({ name: 'mydb-client', storage: getRxStorageDexie() }); await db.addCollections({ humans: { schema: { version: 0, primaryKey: 'passportId', type: 'object', properties: { passportId: { type: 'string', maxLength: 100 }, firstName: { type: 'string' }, lastName: { type: 'string' } }, required: ['passportId', 'firstName', 'lastName'] } } }); // Start replication to the RxServer endpoint printed by the server: // e.g. http://localhost:8080/humans/0 const replicationState = replicateServer({ replicationIdentifier: 'humans-rxserver', collection: db.humans, url: 'http://localhost:8080/humans/0', live: true, pull: { batchSize: 50 }, push: { batchSize: 50 } }); ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"MongoDB Replication Plugin for RxDB - Real-Time, Offline-First Sync","url":"/replication-mongodb.html#follow-up","content":" Try it out with the RxDB-MongoDB example repositoryRead From Local to Global: Scalable Edge Apps with RxDB + MongoDBReplication API ReferenceRxServer DocumentationJoin our Discord Forum for questions and feedback ","version":"Next","tagName":"h2"},{"title":"HTTP Replication from a custom server to RxDB clients","type":0,"sectionRef":"#","url":"/replication-http.html","content":"","keywords":"","version":"Next"},{"title":"Setup​","type":1,"pageTitle":"HTTP Replication from a custom server to RxDB clients","url":"/replication-http.html#setup","content":" 1 Start the Replication on the RxDB Client​ RxDB does not have a specific HTTP-replication plugin because the replication primitives plugin is simple enough to start a HTTP replication on top of it. We import the replicateRxCollection function and start the replication from there for a single RxCollection. // > client.ts import { replicateRxCollection } from 'rxdb/plugins/replication'; const replicationState = await replicateRxCollection({ collection: myRxCollection, replicationIdentifier: 'my-http-replication', push: { /* add settings from below */ }, pull: { /* add settings from below */ } }); 2 Start a Node.js process with Express and MongoDB​ On the server side, we start an express server that has a MongoDB connection and serves the HTTP requests of the client. // > server.ts import { MongoClient } from 'mongodb'; import express from 'express'; const mongoClient = new MongoClient('mongodb://localhost:27017/'); const mongoConnection = await mongoClient.connect(); const mongoDatabase = mongoConnection.db('myDatabase'); const mongoCollection = await mongoDatabase.collection('myDocs'); const app = express(); app.use(express.json()); /* ... add routes from below */ app.listen(80, () => { console.log(`Example app listening on port 80`) }); 3 Implement the Pull Endpoint​ As first HTTP Endpoint, we need to implement the pull handler. This is used by the RxDB replication to fetch all documents writes that happened after a given checkpoint. The checkpoint format is not determined by RxDB, instead the server can use any type of changepoint that can be used to iterate across document writes. Here we will just use a unix timestamp updatedAt and a string id which is the most common used format. When the pull endpoint is called, the server responds with an array of document data based on the given checkpoint and a new checkpoint. Also the server has to respect the batchSize so that RxDB knows when there are no more new documents and the server returns a non-full array. // > server.ts import { lastOfArray } from 'rxdb/plugins/core'; app.get('/pull', (req, res) => { const id = req.query.id; const updatedAt = parseFloat(req.query.updatedAt); const documents = await mongoCollection.find({ $or: [ /** * Notice that we have to compare the updatedAt AND the id field * because the updateAt field is not unique and when two documents * have the same updateAt, we can still "sort" them by their id. */ { updateAt: { $gt: updatedAt } }, { updateAt: { $eq: updatedAt } id: { $gt: id } } ] }) .sort({updateAt: 1, id: 1}) .limit(parseInt(req.query.batchSize, 10)).toArray(); const newCheckpoint = documents.length === 0 ? { id, updatedAt } : { id: lastOfArray(documents).id, updatedAt: lastOfArray(documents).updatedAt }; res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify({ documents, checkpoint: newCheckpoint })); }); 4 Implement the Pull Handler​ On the client we add the pull.handler to the replication setting. The handler request the correct server url and fetches the documents. // > client.ts const replicationState = await replicateRxCollection({ /* ... */ pull: { async handler(checkpointOrNull, batchSize){ const updatedAt = checkpointOrNull ? checkpointOrNull.updatedAt : 0; const id = checkpointOrNull ? checkpointOrNull.id : ''; const response = await fetch( `https://localhost/pull?updatedAt=${updatedAt}&id=${id}&limit=${batchSize}` ); const data = await response.json(); return { documents: data.documents, checkpoint: data.checkpoint }; } } /* ... */ }); 5 Implement the Push Endpoint​ To send client side writes to the server, we have to implement the push.handler. It gets an array of change rows as input and has to return only the conflicting documents that did not have been written to the server. Each change row contains a newDocumentState and an optional assumedMasterState. For conflict detection, on the server we first have to detect if the assumedMasterState is correct for each row. If yes, we have to write the new document state to the database, otherwise we have to return the "real" master state in the conflict array. The server also creates an event that is emitted to the pullStream$ which is later used in the pull.stream$. // > server.ts import { lastOfArray } from 'rxdb/plugins/core'; import { Subject } from 'rxjs'; // used in the pull.stream$ below let lastEventId = 0; const pullStream$ = new Subject(); app.get('/push', (req, res) => { const changeRows = req.body; const conflicts = []; const event = { id: lastEventId++, documents: [], checkpoint: null }; for(const changeRow of changeRows){ const realMasterState = mongoCollection.findOne({id: changeRow.newDocumentState.id}); if( realMasterState && !changeRow.assumedMasterState || ( realMasterState && changeRow.assumedMasterState && /* * For simplicity we detect conflicts on the server by only compare the updateAt value. * In reality you might want to do a more complex check or do a deep-equal comparison. */ realMasterState.updatedAt !== changeRow.assumedMasterState.updatedAt ) ) { // we have a conflict conflicts.push(realMasterState); } else { // no conflict -> write the document mongoCollection.updateOne( {id: changeRow.newDocumentState.id}, changeRow.newDocumentState ); event.documents.push(changeRow.newDocumentState); event.checkpoint = { id: changeRow.newDocumentState.id, updatedAt: changeRow.newDocumentState.updatedAt }; } } if(event.documents.length > 0){ myPullStream$.next(event); } res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify(conflicts)); }); note For simplicity in this tutorial, we do not use transactions. In reality you should run the full push function inside of a MongoDB transaction to ensure that no other process can mix up the document state while the writes are processed. Also you should call batch operations on MongoDB instead of running the operations for each change row. 6 Implement the Push Handler​ With the push endpoint in place, we can add a push.handler to the replication settings on the client. // > client.ts const replicationState = await replicateRxCollection({ /* ... */ push: { async handler(changeRows){ const rawResponse = await fetch('https://localhost/push', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify(changeRows) }); const conflictsArray = await rawResponse.json(); return conflictsArray; } } /* ... */ }); 7 Implement the pullStream$ Endpoint​ While the normal pull handler is used when the replication is in iteration mode, we also need a stream of ongoing changes when the replication is in event observation mode. This brings the realtime replication to RxDB where changes on the server or on a client will directly get propagated to the other instances. On the server we have to implement the pullStream route and emit the events. We use the pullStream$ observable from above to fetch all ongoing events and respond them to the client. Here we use Server-Sent-Events (SSE) which is the most common used way to stream data from the server to the client. Other method also exist like WebSockets or Long-Polling. // > server.ts app.get('/pullStream', (req, res) => { res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Connection': 'keep-alive', 'Cache-Control': 'no-cache' }); const subscription = pullStream$.subscribe(event => { res.write('data: ' + JSON.stringify(event) + '\\n\\n'); }); req.on('close', () => subscription.unsubscribe()); }); note How the build the pullStream$ Observable is not part of this tutorial. This heavily depends on your backend and infrastructure. Likely you have to observe the MongoDB event stream. 8 Implement the pullStream$ Handler​ From the client we can observe this endpoint and create a pull.stream$ observable that emits all events that are send from the server to the client. The client connects to an url and receives server-sent-events that contain all ongoing writes. // > client.ts import { Subject } from 'rxjs'; const myPullStream$ = new Subject(); const eventSource = new EventSource( 'http://localhost/pullStream', { withCredentials: true } ); eventSource.onmessage = event => { const eventData = JSON.parse(event.data); myPullStream$.next({ documents: eventData.documents, checkpoint: eventData.checkpoint }); }; const replicationState = await replicateRxCollection({ /* ... */ pull: { /* ... */ stream$: myPullStream$.asObservable() } /* ... */ }); 9 pullStream$ RESYNC flag​ In case the client looses the connection, the EventSource will automatically reconnect but there might have been some changes that have been missed out in the meantime. The replication has to be informed that it might have missed events by emitting a RESYNC flag from the pull.stream$. The replication will then catch up by switching to the iteration mode until it is in sync with the server again. // > client.ts eventSource.onerror = () => myPullStream$.next('RESYNC'); The purpose of the RESYNC flag is to tell the client that "something might have changed" and then the client can react on that information without having to run operations in an interval. If your backend is not capable of emitting the actual documents and checkpoint in the pull stream, you could just map all events to the RESYNC flag. This would make the replication work with a slight performance drawback: // > client.ts import { Subject } from 'rxjs'; const myPullStream$ = new Subject(); const eventSource = new EventSource( 'http://localhost/pullStream', { withCredentials: true } ); eventSource.onmessage = () => myPullStream$.next('RESYNC'); const replicationState = await replicateRxCollection({ pull: { stream$: myPullStream$.asObservable() } }); ","version":"Next","tagName":"h2"},{"title":"Missing implementation details​","type":1,"pageTitle":"HTTP Replication from a custom server to RxDB clients","url":"/replication-http.html#missing-implementation-details","content":" In this tutorial we only covered the basics of doing a HTTP replication between RxDB clients and a server. We did not cover the following aspects of the implementation: Authentication: To authenticate the client on the server, you might want to send authentication headers with the HTTP requestsSkip events on the pull.stream$ for the client that caused the changes to improve performance.Version upgrades: You should add a version-flag to the endpoint urls. If you then update the version of your endpoints in any way, your old endpoints should emit a Code 426 to outdated clients so that they can updated their client version. ","version":"Next","tagName":"h2"},{"title":"RxDB Server Replication","type":0,"sectionRef":"#","url":"/replication-server.html","content":"","keywords":"","version":"Next"},{"title":"Usage​","type":1,"pageTitle":"RxDB Server Replication","url":"/replication-server.html#usage","content":" The replication server plugin is imported from the rxdb-server npm package. Then you start the replication with a given collection and endpoint url by calling replicateServer(). import { replicateServer } from 'rxdb-server/plugins/replication-server'; const replicationState = await replicateServer({ collection: usersCollection, replicationIdentifier: 'my-server-replication', url: 'http://localhost:80/users/0', // endpoint url with the servers collection schema version at the end headers: { Authorization: 'Bearer S0VLU0UhI...' }, push: {}, pull: {}, live: true }); ","version":"Next","tagName":"h2"},{"title":"outdatedClient$​","type":1,"pageTitle":"RxDB Server Replication","url":"/replication-server.html#outdatedclient","content":" When you update your schema at the server and run a migration, you end up with a different replication url that has a new schema version number at the end. Your clients might still be running an old version of your application that will no longer be compatible with the endpoint. Therefore when the client tries to call a server endpoint with an outdated schema version, the outdatedClient$ observable emits to tell your client that the application must be updated. With that event you can tell the client to update the application. On browser application you might want to just reload the page on that event: replicationState.outdatedClient$.subscribe(() => { location.reload(); }); ","version":"Next","tagName":"h2"},{"title":"unauthorized$​","type":1,"pageTitle":"RxDB Server Replication","url":"/replication-server.html#unauthorized","content":" When you clients auth data is not valid (or no longer valid), the server will no longer accept any requests from you client and inform the client that the auth headers must be updated. The unauthorized$ observable will emit and expects you to update the headers accordingly so that following requests will be accepted again. replicationState.unauthorized$.subscribe(() => { replicationState.setHeaders({ Authorization: 'Bearer S0VLU0UhI...' }); }); ","version":"Next","tagName":"h2"},{"title":"forbidden$​","type":1,"pageTitle":"RxDB Server Replication","url":"/replication-server.html#forbidden","content":" When you client behaves wrong in any case, like update non-allowed values or changing documents that it is not allowed to, the server will drop the connection and the replication state will emit on the forbidden$ observable. It will also automatically stop the replication so that your client does not accidentally DOS attack the server. replicationState.forbidden$.subscribe(() => { console.log('Client is behaving wrong'); }); ","version":"Next","tagName":"h2"},{"title":"Custom EventSource implementation​","type":1,"pageTitle":"RxDB Server Replication","url":"/replication-server.html#custom-eventsource-implementation","content":" For the server send events, the eventsource npm package is used instead of the native EventSource API. We need this because the native browser API does not support sending headers with the request which is required by the server to parse the auth data. If the eventsource package does not work for you, you can set an own implementation when creating the replication. const replicationState = await replicateServer({ /* ... */ eventSource: MyEventSourceConstructor /* ... */ }); ","version":"Next","tagName":"h2"},{"title":"Replication with GraphQL","type":0,"sectionRef":"#","url":"/replication-graphql.html","content":"","keywords":"","version":"Next"},{"title":"Usage​","type":1,"pageTitle":"Replication with GraphQL","url":"/replication-graphql.html#usage","content":" Before you use the GraphQL replication, make sure you've learned how the RxDB replication works. ","version":"Next","tagName":"h2"},{"title":"Creating a compatible GraphQL Server​","type":1,"pageTitle":"Replication with GraphQL","url":"/replication-graphql.html#creating-a-compatible-graphql-server","content":" At the server-side, there must exist an endpoint which returns newer rows when the last checkpoint is used as input. For example lets say you create a QuerypullHuman which returns a list of document writes that happened after the given checkpoint. For the push-replication, you also need a MutationpushHuman which lets RxDB update data of documents by sending the previous document state and the new client document state. Also for being able to stream all ongoing events, we need a Subscription called streamHuman. input HumanInput { id: ID!, name: String!, lastName: String!, updatedAt: Float!, deleted: Boolean! } type Human { id: ID!, name: String!, lastName: String!, updatedAt: Float!, deleted: Boolean! } input Checkpoint { id: String!, updatedAt: Float! } type HumanPullBulk { documents: [Human]! checkpoint: Checkpoint } type Query { pullHuman(checkpoint: Checkpoint, limit: Int!): HumanPullBulk! } input HumanInputPushRow { assumedMasterState: HeroInputPushRowT0AssumedMasterStateT0 newDocumentState: HeroInputPushRowT0NewDocumentStateT0! } type Mutation { # Returns a list of all conflicts # If no document write caused a conflict, return an empty list. pushHuman(rows: [HumanInputPushRow!]): [Human] } # headers are used to authenticate the subscriptions # over websockets. input Headers { AUTH_TOKEN: String!; } type Subscription { streamHuman(headers: Headers): HumanPullBulk! } The GraphQL resolver for the pullHuman would then look like: const rootValue = { pullHuman: args => { const minId = args.checkpoint ? args.checkpoint.id : ''; const minUpdatedAt = args.checkpoint ? args.checkpoint.updatedAt : 0; // sorted by updatedAt first and the id as second const sortedDocuments = documents.sort((a, b) => { if (a.updatedAt > b.updatedAt) return 1; if (a.updatedAt < b.updatedAt) return -1; if (a.updatedAt === b.updatedAt) { if (a.id > b.id) return 1; if (a.id < b.id) return -1; else return 0; } }); // only return documents newer than the input document const filterForMinUpdatedAtAndId = sortedDocuments.filter(doc => { if (doc.updatedAt < minUpdatedAt) return false; if (doc.updatedAt > minUpdatedAt) return true; if (doc.updatedAt === minUpdatedAt) { // if updatedAt is equal, compare by id if (doc.id > minId) return true; else return false; } }); // only return some documents in one batch const limitedDocs = filterForMinUpdatedAtAndId.slice(0, args.limit); // use the last document for the checkpoint const lastDoc = limitedDocs[limitedDocs.length - 1]; const retCheckpoint = { id: lastDoc.id, updatedAt: lastDoc.updatedAt } return { documents: limitedDocs, checkpoint: retCheckpoint } return limited; } } For examples for the other resolvers, consult the GraphQL Example Project. ","version":"Next","tagName":"h3"},{"title":"RxDB Client​","type":1,"pageTitle":"Replication with GraphQL","url":"/replication-graphql.html#rxdb-client","content":" Pull replication​ For the pull-replication, you first need a pullQueryBuilder. This is a function that gets the last replication checkpoint and a limit as input and returns an object with a GraphQL-query and its variables (or a promise that resolves to the same object). RxDB will use the query builder to construct what is later sent to the GraphQL endpoint. const pullQueryBuilder = (checkpoint, limit) => { /** * The first pull does not have a checkpoint * so we fill it up with defaults */ if (!checkpoint) { checkpoint = { id: '', updatedAt: 0 }; } const query = `query PullHuman($checkpoint: CheckpointInput, $limit: Int!) { pullHuman(checkpoint: $checkpoint, limit: $limit) { documents { id name age updatedAt deleted } checkpoint { id updatedAt } } }`; return { query, operationName: 'PullHuman', variables: { checkpoint, limit } }; }; With the queryBuilder, you can then setup the pull-replication. import { replicateGraphQL } from 'rxdb/plugins/replication-graphql'; const replicationState = replicateGraphQL( { collection: myRxCollection, // urls to the GraphQL endpoints url: { http: 'http://example.com/graphql' }, pull: { queryBuilder: pullQueryBuilder, // the queryBuilder from above modifier: doc => doc, // (optional) modifies all pulled documents before they are handled by RxDB dataPath: undefined, // (optional) specifies the object path to access the document(s). Otherwise, the first result of the response data is used. /** * Amount of documents that the remote will send in one request. * If the response contains less than [batchSize] documents, * RxDB will assume there are no more changes on the backend * that are not replicated. * This value is the same as the limit in the pullHuman() schema. * [default=100] */ batchSize: 50 }, // headers which will be used in http requests against the server. headers: { Authorization: 'Bearer abcde...' }, /** * Options that have been inherited from the RxReplication */ deletedField: 'deleted', live: true, retryTime = 1000 * 5, waitForLeadership = true, autoStart = true, } ); Push replication​ For the push-replication, you also need a queryBuilder. Here, the builder receives a changed document as input which has to be send to the server. It also returns a GraphQL-Query and its data. const pushQueryBuilder = rows => { const query = ` mutation PushHuman($writeRows: [HumanInputPushRow!]) { pushHuman(writeRows: $writeRows) { id name age updatedAt deleted } } `; const variables = { writeRows: rows }; return { query, operationName: 'PushHuman', variables }; }; With the queryBuilder, you can then setup the push-replication. const replicationState = replicateGraphQL( { collection: myRxCollection, // urls to the GraphQL endpoints url: { http: 'http://example.com/graphql' }, push: { queryBuilder: pushQueryBuilder, // the queryBuilder from above /** * batchSize (optional) * Amount of document that will be pushed to the server in a single request. */ batchSize: 5, /** * modifier (optional) * Modifies all pushed documents before they are send to the GraphQL endpoint. * Returning null will skip the document. */ modifier: doc => doc }, headers: { Authorization: 'Bearer abcde...' }, pull: { /* ... */ }, /* ... */ } ); Pull Stream​ To create a realtime replication, you need to create a pull stream that pulls ongoing writes from the server. The pull stream gets the headers of the RxReplicationState as input, so that it can be authenticated on the backend. const pullStreamQueryBuilder = (headers) => { const query = `subscription onStream($headers: Headers) { streamHero(headers: $headers) { documents { id, name, age, updatedAt, deleted }, checkpoint { id updatedAt } } }`; return { query, variables: { headers } }; }; With the pullStreamQueryBuilder you can then start a realtime replication. const replicationState = replicateGraphQL( { collection: myRxCollection, // urls to the GraphQL endpoints url: { http: 'http://example.com/graphql', ws: 'ws://example.com/subscriptions' // <- The websocket has to use a different url. }, push: { batchSize: 100, queryBuilder: pushQueryBuilder }, headers: { Authorization: 'Bearer abcde...' }, pull: { batchSize: 100, queryBuilder: pullQueryBuilder, streamQueryBuilder: pullStreamQueryBuilder, includeWsHeaders: false, // Includes headers as connection parameter to Websocket. // Websocket options that can be passed as a parameter to initialize the subscription // Can be applied anything from the graphql-ws ClientOptions - https://the-guild.dev/graphql/ws/docs/interfaces/client.ClientOptions // Except these parameters: 'url', 'shouldRetry', 'webSocketImpl' - locked for internal usage // Note: if you provide connectionParams as a wsOption, make sure it returns any necessary headers (e.g. authorization) // because providing your own connectionParams prevents headers from being included automatically wsOptions: { retryAttempts: 10, } }, deletedField: 'deleted' } ); note If it is not possible to create a websocket server on your backend, you can use any other method of pull out the ongoing events from the backend and then you can send them into RxReplicationState.emitEvent(). ","version":"Next","tagName":"h3"},{"title":"Transforming null to undefined in optional fields​","type":1,"pageTitle":"Replication with GraphQL","url":"/replication-graphql.html#transforming-null-to-undefined-in-optional-fields","content":" GraphQL fills up non-existent optional values with null while RxDB required them to be undefined. Therefore, if your schema contains optional properties, you have to transform the pulled data to switch out null to undefined const replicationState: RxGraphQLReplicationState<RxDocType> = replicateGraphQL( { collection: myRxCollection, url: {/* ... */}, headers: {/* ... */}, push: {/* ... */}, pull: { queryBuilder: pullQueryBuilder, modifier: (doc => { // We have to remove optional non-existent field values // they are set as null by GraphQL but should be undefined Object.entries(doc).forEach(([k, v]) => { if (v === null) { delete doc[k]; } }); return doc; }) }, /* ... */ } ); ","version":"Next","tagName":"h3"},{"title":"pull.responseModifier​","type":1,"pageTitle":"Replication with GraphQL","url":"/replication-graphql.html#pullresponsemodifier","content":" With the pull.responseModifier you can modify the whole response from the GraphQL endpoint before it is processed by RxDB. For example if your endpoint is not capable of returning a valid checkpoint, but instead only returns the plain document array, you can use the responseModifier to aggregate the checkpoint from the returned documents. import { } from 'rxdb'; const replicationState: RxGraphQLReplicationState<RxDocType> = replicateGraphQL( { collection: myRxCollection, url: {/* ... */}, headers: {/* ... */}, push: {/* ... */}, pull: { responseModifier: async function( plainResponse, // the exact response that was returned from the server origin, // either 'handler' if plainResponse came from the pull.handler, or 'stream' if it came from the pull.stream requestCheckpoint // if origin==='handler', the requestCheckpoint contains the checkpoint that was send to the backend ) { /** * In this example we aggregate the checkpoint from the documents array * that was returned from the graphql endpoint. */ const docs = plainResponse; return { documents: docs, checkpoint: docs.length === 0 ? requestCheckpoint : { name: lastOfArray(docs).name, updatedAt: lastOfArray(docs).updatedAt } }; } }, /* ... */ } ); ","version":"Next","tagName":"h3"},{"title":"push.responseModifier​","type":1,"pageTitle":"Replication with GraphQL","url":"/replication-graphql.html#pushresponsemodifier","content":" It's also possible to modify the response of a push mutation. For example if your server returns more than the just conflicting docs: type PushResponse { conflicts: [Human] conflictMessages: [ReplicationConflictMessage] } type Mutation { # Returns a PushResponse type that contains the conflicts along with other information pushHuman(rows: [HumanInputPushRow!]): PushResponse! } import {} from "rxdb"; const replicationState: RxGraphQLReplicationState<RxDocType> = replicateGraphQL( { collection: myRxCollection, url: {/* ... */}, headers: {/* ... */}, push: { responseModifier: async function (plainResponse) { /** * In this example we aggregate the conflicting documents from a response object */ return plainResponse.conflicts; }, }, pull: {/* ... */}, /* ... */ } ); Helper Functions​ RxDB provides the helper functions graphQLSchemaFromRxSchema(), pullQueryBuilderFromRxSchema(), pullStreamBuilderFromRxSchema() and pushQueryBuilderFromRxSchema() that can be used to generate handlers and schemas from the RxJsonSchema. To learn how to use them, please inspect the GraphQL Example. ","version":"Next","tagName":"h3"},{"title":"RxGraphQLReplicationState​","type":1,"pageTitle":"Replication with GraphQL","url":"/replication-graphql.html#rxgraphqlreplicationstate","content":" When you call myCollection.syncGraphQL() it returns a RxGraphQLReplicationState which can be used to subscribe to events, for debugging or other functions. It extends the RxReplicationState with some GraphQL specific methods. .setHeaders()​ Changes the headers for the replication after it has been set up. replicationState.setHeaders({ Authorization: `...` }); Sending Cookies​ The underlying fetch framework uses a same-origin policy for credentials per default. That means, cookies and session data is only shared if you backend and frontend run on the same domain and port. Pass the credential parameter to include cookies in requests to servers from different origins via: replicationState.setCredentials('include'); or directly pass it in the replicateGraphQL function: replicateGraphQL( { collection: myRxCollection, /* ... */ credentials: 'include', /* ... */ } ); See the fetch spec for more information about available options. note To play around, check out the full example of the RxDB GraphQL replication with server and client ","version":"Next","tagName":"h3"},{"title":"Websocket Replication","type":0,"sectionRef":"#","url":"/replication-websocket.html","content":"","keywords":"","version":"Next"},{"title":"Starting the Websocket Server​","type":1,"pageTitle":"Websocket Replication","url":"/replication-websocket.html#starting-the-websocket-server","content":" import { createRxDatabase } from 'rxdb'; import { startWebsocketServer } from 'rxdb/plugins/replication-websocket'; // create a RxDatabase like normal const myDatabase = await createRxDatabase({/* ... */}); // start a websocket server const serverState = await startWebsocketServer({ database: myDatabase, port: 1337, path: '/socket' }); // stop the server await serverState.close(); ","version":"Next","tagName":"h2"},{"title":"Connect to the Websocket Server​","type":1,"pageTitle":"Websocket Replication","url":"/replication-websocket.html#connect-to-the-websocket-server","content":" The replication has to be started once for each collection that you want to replicate. import { replicateWithWebsocketServer } from 'rxdb/plugins/replication-websocket'; // start the replication const replicationState = await replicateWithWebsocketServer({ /** * To make the replication work, * the client collection name must be equal * to the server collection name. */ collection: myRxCollection, url: 'ws://localhost:1337/socket' }); // stop the replication await replicationState.cancel(); ","version":"Next","tagName":"h2"},{"title":"Customize​","type":1,"pageTitle":"Websocket Replication","url":"/replication-websocket.html#customize","content":" We use the ws npm library, so you can use all optional configuration provided by it. This is especially important to improve performance by opting in of some optional settings. ","version":"Next","tagName":"h2"},{"title":"Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync","type":0,"sectionRef":"#","url":"/replication-supabase.html","content":"","keywords":"","version":"Next"},{"title":"Key Features of the RxDB-Supabase Plugin​","type":1,"pageTitle":"Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync","url":"/replication-supabase.html#key-features-of-the-rxdb-supabase-plugin","content":" Cloud Only Backend: No self-hosted server required. Client devices directly sync with the Supabase Servers.Two-way replication between Supabase tables and RxDB collectionsOffline-first with resumable, incremental syncLive updates via Supabase Realtime channelsConflict resolution handled by the RxDB Sync EngineWorks in browsers and Node.js with @supabase/supabase-js ","version":"Next","tagName":"h2"},{"title":"Architecture Overview​","type":1,"pageTitle":"Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync","url":"/replication-supabase.html#architecture-overview","content":" Client A Supabase Client B Client C Clients connect directly to Supabase using the official JS client. The plugin: Pulls documents over PostgREST using a checkpoint (modified, id) and deterministic ordering.Pushes inserts/updates using optimistic concurrency guards.Streams new changes using Supabase Realtime so live replication stays up to date. note Because Supabase exposes Postgres over HTTP/WebSocket, you can safely replicate from browsers and mobile apps. Protect your data with Row Level Security (RLS) policies; use the anon key on clients and the service role key only on trusted servers. ","version":"Next","tagName":"h2"},{"title":"Setting up RxDB ↔ Supabase Sync​","type":1,"pageTitle":"Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync","url":"/replication-supabase.html#setting-up-rxdb--supabase-sync","content":" 1 Install Dependencies​ npm install rxdb @supabase/supabase-js 2 Create a Supabase Project & Table​ In your supabase project, create a new table. Ensure that: The primary key must have the type text (Primary keys must always be strings in RxDB)You have an modified field which stores the last modification timestamp of a row (default is _modified)You have a boolean field which stores if a row should is "deleted". You should not hard-delete rows in Supabase, because clients would miss the deletion if they haven't been online at the deletion time. Instead, use a deleted boolean to mark rows as deleted. This way all clients can still pull the deletion, and RxDB will hide the complexity on the client side.Enable the realtime observation of writes to the table. Here is an example for a "human" table: create extension if not exists moddatetime schema extensions; create table "public"."humans" ( "passportId" text primary key, "firstName" text not null, "lastName" text not null, "age" integer, "_deleted" boolean DEFAULT false NOT NULL, "_modified" timestamp with time zone DEFAULT now() NOT NULL ); -- auto-update the _modified timestamp CREATE TRIGGER update_modified_datetime BEFORE UPDATE ON public.humans FOR EACH ROW EXECUTE FUNCTION extensions.moddatetime('_modified'); -- add a table to the publication so we can subscribe to changes alter publication supabase_realtime add table "public"."humans"; 3 Create an RxDB Database & Collection​ Create a normal RxDB database, then add a collection whose schema mirrors your Supabase table. The primary key must match (same column name and type), and fields should be top-level simple types (string/number/boolean). You don’t need to model server internals: the plugin maps the server’s _deleted flag to doc._deleted automatically, and _modified is optional in your schema (the plugin strips it on push and will include it on pull only if you define it). For browsers use a persistent storage like Localstorage or IndexedDB. For tests you can use the in-memory storage. // client import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; export const db = await createRxDatabase({ name: 'mydb', storage: getRxStorageLocalstorage() }); await db.addCollections({ humans: { schema: { version: 0, primaryKey: 'passportId', type: 'object', properties: { passportId: { type: 'string', maxLength: 100 }, firstName: { type: 'string' }, lastName: { type: 'string' }, age: { type: 'number' } }, required: ['passportId', 'firstName', 'lastName'] } } }); 4 Create the Supabase Client​ Make a single Supabase client and reuse it across your app. In the browser, use the anon key (RLS-protected). On trusted servers you may use the service role key—but never ship that to clients. Production Vite Local Development //> client import { createClient } from '@supabase/supabase-js'; export const supabase = createClient( 'https://xyzcompany.supabase.co', 'eyJhbGciOi...' ); 5 Start Replication​ Connect your RxDB collection to the Supabase table to start the replication. //> client import { replicateSupabase } from 'rxdb/plugins/replication-supabase'; const replication = replicateSupabase({ tableName: 'humans', client: supabase, collection: db.humans, replicationIdentifier: 'humans-supabase', live: true, pull: { batchSize: 50, // optional: shape incoming docs modifier: (doc) => { // map nullable age-field if (!doc.age) delete doc.age; return doc; } // optional: customize the pull query before fetching queryBuilder: ({ query }) => { // Add filters, joins, or other PostgREST query modifiers // This runs before checkpoint filtering and ordering return query.eq("status", "active"); }, }, push: { batchSize: 50 }, // optional overrides if your column names differ: // modifiedField: '_modified', // deletedField: '_deleted' }); // (optional) observe errors and wait for the first sync barrier replication.error$.subscribe(err => console.error('[replication]', err)); await replication.awaitInitialReplication(); Nullable values must be mapped Supabase returns null for nullable columns, but in RxDB you often model those fields as optional (i.e., they can be undefined/missing). To avoid schema errors, map null → undefined in the pull.modifier (usually by deleting the key). 6 Do other things with the replication state​ The RxSupabaseReplicationState which is returned from replicateSupabase() allows you to run all functionality of the normal RxReplicationState. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"Supabase Replication Plugin for RxDB - Real-Time, Offline-First Sync","url":"/replication-supabase.html#follow-up","content":" Replication API Reference: Learn the core concepts and lifecycle hooks — ReplicationOffline-First Guide: Caching, retries, and conflict strategies — Local-FirstSupabase Essentials: Row Level Security (RLS) — https://supabase.com/docs/guides/auth/row-level-securityRealtime — https://supabase.com/docs/guides/realtimeLocal dev with the Supabase CLI — https://supabase.com/docs/guides/cli Community: Questions or feedback? Join our Discord — Chat ","version":"Next","tagName":"h2"},{"title":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","type":0,"sectionRef":"#","url":"/replication-webrtc.html","content":"","keywords":"","version":"Next"},{"title":"What is WebRTC?​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#what-is-webrtc","content":" WebRTC stands for Web Real-Time Communication. It is an open standard that enables browsers and native apps to exchange audio, video, or arbitrary data directly between peers, bypassing a central server after the initial connection is established. WebRTC uses NAT traversal techniques like ICE (Interactive Connectivity Establishment) to punch through firewalls and establish direct links. This peer-to-peer nature drastically reduces latency while maintaining high security and end-to-end encryption capabilities. For a deeper look at comparing WebRTC with WebSockets and WebTransport, you can read our comprehensive overview. While WebSockets or WebTransport often work in client-server contexts, WebRTC offers direct peer-to-peer connections ideal for fully decentralized data flows. ","version":"Next","tagName":"h2"},{"title":"Benefits of P2P Sync with WebRTC Compared to Client-Server Architecture​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#benefits-of-p2p-sync-with-webrtc-compared-to-client-server-architecture","content":" Reduced Latency - By skipping a central server hop, data travels directly from one client to another, minimizing round-trip times and improving responsiveness.Scalability - New peers can join without overloading a central infrastructure. The sync overhead increases linearly with the number of connections rather than requiring a massive server cluster.Privacy & Ownership - Data stays within the user’s devices, avoiding risks tied to storing data on third-party servers. This design aligns well with local-first or "zero-latency" apps.Resilience - In some scenarios, if the central server is unreachable, P2P connections remain operational (assuming a functioning signaling path). Apps can still replicate data among local networks like when they are in the same Wifi or LAN.Cost Savings - Reducing the reliance on a high-bandwidth server can cut hosting and bandwidth expenses, particularly in high-traffic or IoT-style use cases. ","version":"Next","tagName":"h2"},{"title":"Peer-to-Peer (P2P) WebRTC Replication with the RxDB JavaScript Database​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#peer-to-peer-p2p-webrtc-replication-with-the-rxdb-javascript-database","content":" Traditionally, real-time data synchronization depends on centralized servers to manage and distribute updates. In contrast, RxDB’s WebRTC P2P replication allows data to flow directly among clients, removing the server as a data store. This approach is live and fully decentralized, requiring only a signaling server for initial discovery: No master-slave concept - each peer hosts its own local RxDB.Clients (browsers, devices) connect to each other via WebRTC data channels.The RxDB replication protocol then handles pushing/pulling document changes across peers. Because RxDB is a NoSQL database and the replication protocol is straightforward, setting up robust P2P sync is far easier than orchestrating a complex client-server database architecture. ","version":"Next","tagName":"h2"},{"title":"Using RxDB with the WebRTC Replication Plugin​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#using-rxdb-with-the-webrtc-replication-plugin","content":" Before you use this plugin, make sure that you understand how WebRTC works. Here we build a todo-app that replicates todo-entries between clients: You can find a fully build example of this at the RxDB Quickstart Repository which you can also try out online. Four you create the database and then you can configure the replication: 1 Create the Database and Collection​ Here we create a database with the localstorage based storage that stores data inside of the LocalStorage API in a browser. RxDB has a wide range of storages for other JavaScript runtimes. import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'myTodoDB', storage: getRxStorageLocalstorage() }); await db.addCollections({ todos: { schema: { title: 'todo schema', version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string', maxLength: 100 }, title: { type: 'string' }, done: { type: 'boolean', default: false }, created: { type: 'string', format: 'date-time' } }, required: ['id', 'title', 'done'] } } }); // insert an example document await db.todos.insert({ id: 'todo-1', title: 'P2P demo task', done: false, created: new Date().toISOString() }); 2 Import the WebRTC replication plugin​ import { replicateWebRTC, getConnectionHandlerSimplePeer } from 'rxdb/plugins/replication-webrtc'; 3 Start the P2P replication​ To start the replication you have to call replicateWebRTC on the collection. As options you have to provide a topic and a connection handler function that implements the P2PConnectionHandlerCreator interface. As default you should start with the getConnectionHandlerSimplePeer method which uses the simple-peer library and comes shipped with RxDB. const replicationPool = await replicateWebRTC( { // Start the replication for a single collection collection: db.todos, // The topic is like a 'room-name'. All clients with the same topic // will replicate with each other. In most cases you want to use // a different topic string per user. Also you should prefix the topic with // a unique identifier for your app, to ensure you do not let your users connect // with other apps that also use the RxDB P2P Replication. topic: 'my-users-pool', /** * You need a collection handler to be able to create WebRTC connections. * Here we use the simple peer handler which uses the 'simple-peer' npm library. * To learn how to create a custom connection handler, read the source code, * it is pretty simple. */ connectionHandlerCreator: getConnectionHandlerSimplePeer({ // Set the signaling server url. // You can use the server provided by RxDB for tryouts, // but in production you should use your own server instead. signalingServerUrl: 'wss://signaling.rxdb.info/', // only in Node.js, we need the wrtc library // because Node.js does not contain the WebRTC API. wrtc: require('node-datachannel/polyfill'), // only in Node.js, we need the WebSocket library // because Node.js does not contain the WebSocket API. webSocketConstructor: require('ws').WebSocket }), pull: {}, push: {} } ); Notice that in difference to the other replication plugins, the WebRTC replication returns a replicationPool instead of a single RxReplicationState. The replicationPool contains all replication states of the connected peers in the P2P network. 4 Observe Errors​ To ensure we log out potential errors, observe the error$ observable of the pool. replicationPool.error$.subscribe(err => console.error('WebRTC Error:', err)); 5 Stop the Replication​ You can also dynamically stop the replication. replicationPool.cancel(); ","version":"Next","tagName":"h2"},{"title":"Live replications​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#live-replications","content":" The WebRTC replication is always live because there can not be a one-time sync when it is always possible to have new Peers that join the connection pool. Therefore you cannot set the live: false option like in the other replication plugins. ","version":"Next","tagName":"h2"},{"title":"Signaling Server​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#signaling-server","content":" For P2P replication to work with the RxDB WebRTC Replication Plugin, a signaling server is required. The signaling server helps peers discover each other and establish connections. RxDB ships with a default signaling server that can be used with the simple-peer connection handler. This server is made for demonstration purposes and tryouts. It is not reliable and might be offline at any time. In production you must always use your own signaling server instead! Creating a basic signaling server is straightforward. The provided example uses 'socket.io' for WebSocket communication. However, in production, you'd want to create a more robust signaling server with authentication and additional logic to suit your application's needs. Here is a quick example implementation of a signaling server that can be used with the connection handler from getConnectionHandlerSimplePeer(): import { startSignalingServerSimplePeer } from 'rxdb/plugins/replication-webrtc'; const serverState = await startSignalingServerSimplePeer({ port: 8080 // <- port }); For custom signaling servers with more complex logic, you can check the source code of the default one. ","version":"Next","tagName":"h2"},{"title":"Peer Validation​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#peer-validation","content":" By default the replication will replicate with every peer the signaling server tells them about. You can prevent invalid peers from replication by passing a custom isPeerValid() function that either returns true on valid peers and false on invalid peers. const replicationPool = await replicateWebRTC( { /* ... */ isPeerValid: async (peer) => { return true; } pull: {}, push: {} /* ... */ } ); ","version":"Next","tagName":"h2"},{"title":"Conflict detection in WebRTC replication​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#conflict-detection-in-webrtc-replication","content":" RxDB's conflict handling works by detecting and resolving conflicts that may arise when multiple clients in a decentralized database system attempt to modify the same data concurrently. A custom conflict handler can be set up, which is a plain JavaScript function. The conflict handler is run on each replicated document write and resolves the conflict if required. Find out more about RxDB conflict handling here ","version":"Next","tagName":"h2"},{"title":"Known problems​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#known-problems","content":" ","version":"Next","tagName":"h2"},{"title":"SimplePeer requires to have process.nextTick()​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#simplepeer-requires-to-have-processnexttick","content":" In the browser you might not have a process variable or process.nextTick() method. But the simple peer uses that so you have to polyfill it. In webpack you can use the process/browser package to polyfill it: const plugins = [ /* ... */ new webpack.ProvidePlugin({ process: 'process/browser', }) /* ... */ ]; In angular or other libraries you can add the polyfill manually: window.process = { nextTick: (fn, ...args) => setTimeout(() => fn(...args)), }; ","version":"Next","tagName":"h3"},{"title":"Polyfill the WebSocket and WebRTC API in Node.js​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#polyfill-the-websocket-and-webrtc-api-in-nodejs","content":" While all modern browsers support the WebRTC and WebSocket APIs, they is missing in Node.js which will throw the error No WebRTC support: Specify opts.wrtc option in this environment. Therefore you have to polyfill it with a compatible WebRTC and WebSocket polyfill. It is recommended to use the node-datachannel package for WebRTC which does not come with RxDB but has to be installed before via npm install node-datachannel --save. For the Websocket API use the ws package that is included into RxDB. import nodeDatachannelPolyfill from 'node-datachannel/polyfill'; import { WebSocket } from 'ws'; const replicationPool = await replicateWebRTC( { /* ... */ connectionHandlerCreator: getConnectionHandlerSimplePeer({ signalingServerUrl: 'wss://example.com:8080', wrtc: nodeDatachannelPolyfill, webSocketConstructor: WebSocket }), pull: {}, push: {} /* ... */ } ); ","version":"Next","tagName":"h3"},{"title":"Storing replicated data encrypted on client device​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#storing-replicated-data-encrypted-on-client-device","content":" Storing replicated data encrypted on client devices using the RxDB Encryption Plugin is a pivotal step towards bolstering data security and user privacy. The WebRTC replication plugin seamlessly integrates with the RxDB encryption plugins, providing a robust solution for encrypting sensitive information before it's stored locally. By doing so, it ensures that even if unauthorized access to the device occurs, the data remains protected and unintelligible without the encryption key (or password). This approach is particularly vital in scenarios where user-generated content or confidential data is replicated across devices, as it empowers users with control over their own data while adhering to stringent security standards. Read more about the encryption plugins here. ","version":"Next","tagName":"h2"},{"title":"Follow Up​","type":1,"pageTitle":"P2P WebRTC Replication with RxDB - Sync Data between Browsers and Devices in JavaScript","url":"/replication-webrtc.html#follow-up","content":" Check out the RxDB Quickstart to see how to set up your first RxDB database.Explore advanced features like Custom Conflict Handling or Offline-First Performance.Try an example at RxDB Quickstart GitHub to see a working P2P Sync setup.Join the RxDB Community on GitHub or Discord if you have questions or want to share your P2P WebRTC experiences. ","version":"Next","tagName":"h2"},{"title":"Attachments","type":0,"sectionRef":"#","url":"/rx-attachment.html","content":"","keywords":"","version":"Next"},{"title":"Add the attachments plugin​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#add-the-attachments-plugin","content":" To enable the attachments, you have to add the attachments plugin. import { addRxPlugin } from 'rxdb'; import { RxDBAttachmentsPlugin } from 'rxdb/plugins/attachments'; addRxPlugin(RxDBAttachmentsPlugin); ","version":"Next","tagName":"h2"},{"title":"Enable attachments in the schema​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#enable-attachments-in-the-schema","content":" Before you can use attachments, you have to ensure that the attachments-object is set in the schema of your RxCollection. const mySchema = { version: 0, type: 'object', properties: { // . // . // . }, attachments: { encrypted: true // if true, the attachment-data will be encrypted with the db-password } }; const myCollection = await myDatabase.addCollections({ humans: { schema: mySchema } }); ","version":"Next","tagName":"h2"},{"title":"putAttachment()​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#putattachment","content":" Adds an attachment to a RxDocument. Returns a Promise with the new attachment. import { createBlob } from 'rxdb'; const attachment = await myDocument.putAttachment( { id: 'cat.txt', // (string) name of the attachment data: createBlob('meowmeow', 'text/plain'), // (string|Blob) data of the attachment type: 'text/plain' // (string) type of the attachment-data like 'image/jpeg' } ); warning Expo/React-Native does not support the Blob API natively. Make sure you use your own polyfill that properly supports blob.arrayBuffer() when using RxAttachments or use the putAttachmentBase64() and getDataBase64() so that you do not have to create blobs. ","version":"Next","tagName":"h2"},{"title":"putAttachmentBase64()​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#putattachmentbase64","content":" Same as putAttachment() but accepts a plain base64 string instead of a Blob. const attachment = await doc.putAttachmentBase64({ id: 'cat.txt', length: 4, data: 'bWVvdw==', type: 'text/plain' }); ","version":"Next","tagName":"h2"},{"title":"getAttachment()​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#getattachment","content":" Returns an RxAttachment by its id. Returns null when the attachment does not exist. const attachment = myDocument.getAttachment('cat.jpg'); ","version":"Next","tagName":"h2"},{"title":"allAttachments()​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#allattachments","content":" Returns an array of all attachments of the RxDocument. const attachments = myDocument.allAttachments(); ","version":"Next","tagName":"h2"},{"title":"allAttachments$​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#allattachments-1","content":" Gets an Observable which emits a stream of all attachments from the document. Re-emits each time an attachment gets added or removed from the RxDocument. const all = []; myDocument.allAttachments$.subscribe( attachments => all = attachments ); ","version":"Next","tagName":"h2"},{"title":"RxAttachment​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#rxattachment","content":" The attachments of RxDB are represented by the type RxAttachment which has the following attributes/methods. ","version":"Next","tagName":"h2"},{"title":"doc​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#doc","content":" The RxDocument which the attachment is assigned to. ","version":"Next","tagName":"h3"},{"title":"id​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#id","content":" The id as string of the attachment. ","version":"Next","tagName":"h3"},{"title":"type​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#type","content":" The type as string of the attachment. ","version":"Next","tagName":"h3"},{"title":"length​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#length","content":" The length of the data of the attachment as number. ","version":"Next","tagName":"h3"},{"title":"digest​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#digest","content":" The hash of the attachments data as string. note The digest is NOT calculated by RxDB, instead it is calculated by the RxStorage. The only guarantee is that the digest will change when the attachments data changes. ","version":"Next","tagName":"h3"},{"title":"rev​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#rev","content":" The revision-number of the attachment as number. ","version":"Next","tagName":"h3"},{"title":"remove()​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#remove","content":" Removes the attachment. Returns a Promise that resolves when done. const attachment = myDocument.getAttachment('cat.jpg'); await attachment.remove(); ","version":"Next","tagName":"h3"},{"title":"getData()​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#getdata","content":" Returns a Promise which resolves the attachment's data as Blob. (async) const attachment = myDocument.getAttachment('cat.jpg'); const blob = await attachment.getData(); // Blob ","version":"Next","tagName":"h2"},{"title":"getDataBase64()​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#getdatabase64","content":" Returns a Promise which resolves the attachment's data as base64string. const attachment = myDocument.getAttachment('cat.jpg'); const base64Database = await attachment.getDataBase64(); // 'bWVvdw==' ","version":"Next","tagName":"h2"},{"title":"getStringData()​","type":1,"pageTitle":"Attachments","url":"/rx-attachment.html#getstringdata","content":" Returns a Promise which resolves the attachment's data as string. const attachment = await myDocument.getAttachment('cat.jpg'); const data = await attachment.getStringData(); // 'meow' Attachment compression Storing many attachments can be a problem when the disc space of the device is exceeded. Therefore it can make sense to compress the attachments before storing them in the RxStorage. With the attachments-compression plugin you can compress the attachments data on write and decompress it on reads. This happens internally and will now change on how you use the api. The compression is run with the Compression Streams API which is only supported on newer browsers. import { wrappedAttachmentsCompressionStorage } from 'rxdb/plugins/attachments-compression'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; // create a wrapped storage with attachment-compression. const storageWithAttachmentsCompression = wrappedAttachmentsCompressionStorage({ storage: getRxStorageIndexedDB() }); const db = await createRxDatabase({ name: 'mydatabase', storage: storageWithAttachmentsCompression }); // set the compression mode at the schema level const mySchema = { version: 0, type: 'object', properties: { // . // . // . }, attachments: { compression: 'deflate' // <- Specify the compression mode here. OneOf ['deflate', 'gzip'] } }; /* ... create your collections as usual and store attachments in them. */ ","version":"Next","tagName":"h2"},{"title":"RxCollection","type":0,"sectionRef":"#","url":"/rx-collection.html","content":"","keywords":"","version":"Next"},{"title":"Creating a Collection​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#creating-a-collection","content":" To create one or more collections you need a RxDatabase object which has the .addCollections()-method. Every collection needs a collection name and a valid RxJsonSchema. Other attributes are optional. const myCollections = await myDatabase.addCollections({ // key = collectionName humans: { schema: mySchema, statics: {}, // (optional) ORM-functions for this collection methods: {}, // (optional) ORM-functions for documents attachments: {}, // (optional) ORM-functions for attachments options: {}, // (optional) Custom parameters that might be used in plugins migrationStrategies: {}, // (optional) autoMigrate: true, // (optional) [default=true] cacheReplacementPolicy: function(){}, // (optional) custom cache replacement policy conflictHandler: function(){} // (optional) a custom conflict handler can be used }, // you can create multiple collections at once animals: { // ... } }); ","version":"Next","tagName":"h2"},{"title":"name​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#name","content":" The name uniquely identifies the collection and should be used to refine the collection in the database. Two different collections in the same database can never have the same name. Collection names must match the following regex: ^[a-z][a-z0-9]*$. ","version":"Next","tagName":"h3"},{"title":"schema​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#schema","content":" The schema defines how the documents of the collection are structured. RxDB uses a schema format, similar to JSON schema. Read more about the RxDB schema format here. ","version":"Next","tagName":"h3"},{"title":"ORM-functions​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#orm-functions","content":" With the parameters statics, methods and attachments, you can define ORM-functions that are applied to each of these objects that belong to this collection. See ORM/DRM. ","version":"Next","tagName":"h3"},{"title":"Migration​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#migration","content":" With the parameters migrationStrategies and autoMigrate you can specify how migration between different schema-versions should be done. See Migration. ","version":"Next","tagName":"h3"},{"title":"Get a collection from the database​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#get-a-collection-from-the-database","content":" To get an existing collection from the database, call the collection name directly on the database: // newly created collection const collections = await db.addCollections({ heroes: { schema: mySchema } }); const collection2 = db.heroes; console.log(collections.heroes === collection2); //> true ","version":"Next","tagName":"h2"},{"title":"Functions​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#functions","content":" ","version":"Next","tagName":"h2"},{"title":"Observe $​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#observe-","content":" Calling this will return an rxjs-Observable which streams every change to data of this collection. myCollection.$.subscribe(changeEvent => console.dir(changeEvent)); // you can also observe single event-types with insert$ update$ remove$ myCollection.insert$.subscribe(changeEvent => console.dir(changeEvent)); myCollection.update$.subscribe(changeEvent => console.dir(changeEvent)); myCollection.remove$.subscribe(changeEvent => console.dir(changeEvent)); ","version":"Next","tagName":"h3"},{"title":"insert()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#insert","content":" Use this to insert new documents into the database. The collection will validate the schema and automatically encrypt any encrypted fields. Returns the new RxDocument. const doc = await myCollection.insert({ name: 'foo', lastname: 'bar' }); ","version":"Next","tagName":"h3"},{"title":"insertIfNotExists()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#insertifnotexists","content":" The insertIfNotExists() method attempts to insert a new document into the collection only if a document with the same primary key does not already exist. This is useful for ensuring uniqueness without having to manually check for existing records before inserting or handling conflicts. Returns either the newly added RxDocument or the previous existing document. const doc = await myCollection.insertIfNotExists({ name: 'foo', lastname: 'bar' }); ","version":"Next","tagName":"h3"},{"title":"bulkInsert()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#bulkinsert","content":" When you have to insert many documents at once, use bulk insert. This is much faster than calling .insert() multiple times. Returns an object with a success- and error-array. const result = await myCollection.bulkInsert([{ name: 'foo1', lastname: 'bar1' }, { name: 'foo2', lastname: 'bar2' }]); // > { // success: [RxDocument, RxDocument], // error: [] // } note bulkInsert will not fail on update conflicts and you cannot expect that on failure the other documents are not inserted. Also the call to bulkInsert() it will not throw if a single document errors because of validation errors. Instead it will return the error in the .error property of the returned object. ","version":"Next","tagName":"h3"},{"title":"bulkRemove()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#bulkremove","content":" When you want to remove many documents at once, use bulk remove. Returns an object with a success- and error-array. const result = await myCollection.bulkRemove([ 'primary1', 'primary2' ]); // > { // success: [RxDocument, RxDocument], // error: [] // } Instead of providing the document ids, you can also use the RxDocument instances. This can have better performance if your code knows them already at the moment of removing them: const result = await myCollection.bulkRemove([ myRxDocument1, myRxDocument2, /* ... */ ]); ","version":"Next","tagName":"h3"},{"title":"upsert()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#upsert","content":" Inserts the document if it does not exist within the collection, otherwise it will overwrite it. Returns the new or overwritten RxDocument. const doc = await myCollection.upsert({ name: 'foo', lastname: 'bar2' }); ","version":"Next","tagName":"h3"},{"title":"bulkUpsert()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#bulkupsert","content":" Same as upsert() but runs over multiple documents. Improves performance compared to running many upsert() calls. Returns an error and a success array. const docs = await myCollection.bulkUpsert([ { name: 'foo', lastname: 'bar2' }, { name: 'bar', lastname: 'foo2' } ]); /** * { * success: [RxDocument, RxDocument] * error: [], * } */ ","version":"Next","tagName":"h3"},{"title":"incrementalUpsert()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#incrementalupsert","content":" When you run many upsert operations on the same RxDocument in a very short timespan, you might get a 409 Conflict error. This means that you tried to run a .upsert() on the document, while the previous upsert operation was still running. To prevent these types of errors, you can run incremental upsert operations. The behavior is similar to RxDocument.incrementalModify. const docData = { name: 'Bob', // primary lastName: 'Kelso' }; myCollection.upsert(docData); myCollection.upsert(docData); // -> throws because of parallel update to the same document myCollection.incrementalUpsert(docData); myCollection.incrementalUpsert(docData); myCollection.incrementalUpsert(docData); // wait until last upsert finished await myCollection.incrementalUpsert(docData); // -> works ","version":"Next","tagName":"h3"},{"title":"find()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#find","content":" To find documents in your collection, use this method. See RxQuery.find(). // find all that are older than 18 const olderDocuments = await myCollection .find() .where('age') .gt(18) .exec(); // execute ","version":"Next","tagName":"h3"},{"title":"findOne()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#findone","content":" This does basically what find() does, but it returns only a single document. You can pass a primary value to find a single document more easily. To find documents in your collection, use this method. See RxQuery.find(). // get document with name:foobar myCollection.findOne({ selector: { name: 'foo' } }).exec().then(doc => console.dir(doc)); // get document by primary, functionally identical to above query myCollection.findOne('foo') .exec().then(doc => console.dir(doc)); ","version":"Next","tagName":"h3"},{"title":"findByIds()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#findbyids","content":" Find many documents by their id (primary value). This has a way better performance than running multiple findOne() or a find() with a big $or selector. Returns a Map where the primary key of the document is mapped to the document. Documents that do not exist or are deleted, will not be inside of the returned Map. const ids = [ 'alice', 'bob', /* ... */ ]; const docsMap = await myCollection.findByIds(ids); console.dir(docsMap); // Map(2) note The Map returned by findByIds is not guaranteed to return elements in the same order as the list of ids passed to it. ","version":"Next","tagName":"h3"},{"title":"exportJSON()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#exportjson","content":" Use this function to create a json export from every document in the collection. Before exportJSON() and importJSON() can be used, you have to add the json-dump plugin. import { addRxPlugin } from 'rxdb'; import { RxDBJsonDumpPlugin } from 'rxdb/plugins/json-dump'; addRxPlugin(RxDBJsonDumpPlugin); myCollection.exportJSON() .then(json => console.dir(json)); ","version":"Next","tagName":"h3"},{"title":"importJSON()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#importjson","content":" To import the json dump into your collection, use this function. // import the dump to the database myCollection.importJSON(json) .then(() => console.log('done')); Note that importing will fire events for each inserted document. ","version":"Next","tagName":"h3"},{"title":"remove()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#remove","content":" Removes all known data of the collection and its previous versions. This removes the documents, the schemas, and older schemaVersions. await myCollection.remove(); // collection is now removed and can be re-created ","version":"Next","tagName":"h3"},{"title":"close()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#close","content":" Removes the collection's object instance from the RxDatabase. This is to free up memory and stop all observers and replications. It will not delete the collections data. When you create the collection again with database.addCollections(), the newly added collection will still have all data. await myCollection.close(); ","version":"Next","tagName":"h3"},{"title":"onClose / onRemove()​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#onclose--onremove","content":" With these you can add a function that is run when the collection was closed or removed. This works even across multiple browser tabs so you can detect when another tab removes the collection and you application can behave accordingly. await myCollection.onClose(() => console.log('I am closed')); await myCollection.onRemove(() => console.log('I am removed')); ","version":"Next","tagName":"h3"},{"title":"isRxCollection​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#isrxcollection","content":" Returns true if the given object is an instance of RxCollection. Returns false if not. const is = isRxCollection(myObj); ","version":"Next","tagName":"h3"},{"title":"FAQ​","type":1,"pageTitle":"RxCollection","url":"/rx-collection.html#faq","content":" When I reload the browser window, will my collections still be in the database? No, the javascript instance of the collections will not automatically load into the database on page reloads. You have to call the addCollections() method each time you create your database. This will create the JavaScript object instance of the RxCollection so that you can use it in the RxDatabase. The persisted data will be automatically in your RxCollection each time you create it. How to remove the limit of 16 collections? In the open-source version of RxDB, the amount of RxCollections that can exist in parallel is limited to 16. To remove this limit, you can purchase the Premium Plugins and call the setPremiumFlag() function before creating a database: import { setPremiumFlag } from 'rxdb-premium/plugins/shared'; setPremiumFlag(); ","version":"Next","tagName":"h2"},{"title":"RxDatabase","type":0,"sectionRef":"#","url":"/rx-database.html","content":"","keywords":"","version":"Next"},{"title":"Creation​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#creation","content":" The database is created by the asynchronous .createRxDatabase() function of the core RxDB module. It has the following parameters: import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'heroesdb', // <- name storage: getRxStorageLocalstorage(), // <- RxStorage /* Optional parameters: */ password: 'myPassword', // <- password (optional) multiInstance: true, // <- multiInstance (optional, default: true) eventReduce: true, // <- eventReduce (optional, default: false) cleanupPolicy: {} // <- custom cleanup policy (optional) }); ","version":"Next","tagName":"h2"},{"title":"name​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#name","content":" The database-name is a string which uniquely identifies the database. When two RxDatabases have the same name and use the same RxStorage, their data can be assumed as equal and they will share events between each other. Depending on the storage or adapter this can also be used to define the filesystem folder of your data. ","version":"Next","tagName":"h3"},{"title":"storage​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#storage","content":" RxDB works on top of an implementation of the RxStorage interface. This interface is an abstraction that allows you to use different underlying databases that actually handle the documents. Depending on your use case you might use a different storage with different tradeoffs in performance, bundle size or supported runtimes. There are many RxStorage implementations that can be used depending on the JavaScript environment and performance requirements. For example you can use the LocalStorage RxStorage in the browser or use the MongoDB RxStorage in Node.js. List of RxStorage implementations // use the LocalStroage that stores data in the browser. import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageLocalstorage() }); // ...or use the MongoDB RxStorage in Node.js. import { getRxStorageMongoDB } from 'rxdb/plugins/storage-mongodb'; const dbMongo = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageMongoDB({ connection: 'mongodb://localhost:27017,localhost:27018,localhost:27019' }) }); ","version":"Next","tagName":"h3"},{"title":"password​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#password","content":" (optional)If you want to use encrypted fields in the collections of a database, you have to set a password for it. The password must be a string with at least 12 characters. Read more about encryption here. ","version":"Next","tagName":"h3"},{"title":"multiInstance​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#multiinstance","content":" (optional=true)When you create more than one instance of the same database in a single javascript-runtime, you should set multiInstance to true. This will enable the event sharing between the two instances. For example when the user has opened multiple browser windows, events will be shared between them so that both windows react to the same changes.multiInstance should be set to false when you have single-instances like a single Node.js-process, a react-native-app, a cordova-app or a single-window electron app which can decrease the startup time because no instance coordination has to be done. ","version":"Next","tagName":"h3"},{"title":"eventReduce​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#eventreduce","content":" (optional=false) One big benefit of having a realtime database is that big performance optimizations can be done when the database knows a query is observed and the updated results are needed continuously. RxDB uses the EventReduce Algorithm to optimize observer or recurring queries. For better performance, you should always set eventReduce: true. This will also be the default in the next major RxDB version. ","version":"Next","tagName":"h3"},{"title":"ignoreDuplicate​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#ignoreduplicate","content":" (optional=false)If you create multiple RxDatabase-instances with the same name and same adapter, it's very likely that you have done something wrong. To prevent this common mistake, RxDB will throw an error when you do this. In some rare cases like unit-tests, you want to do this intentional by setting ignoreDuplicate to true. Because setting ignoreDuplicate: true in production will decrease the performance by having multiple instances of the same database, ignoreDuplicate is only allowed to be set in dev-mode. const db1 = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage(), ignoreDuplicate: true }); const db2 = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage(), ignoreDuplicate: true // this create-call will not throw because you explicitly allow it }); ","version":"Next","tagName":"h3"},{"title":"closeDuplicates​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#closeduplicates","content":" (optional=false) Closes all other RxDatabases instances that have the same storage+name combination. const db1 = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage(), closeDuplicates: true }); const db2 = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage(), closeDuplicates: true // this create-call will close db1 }); // db1 is now closed. ","version":"Next","tagName":"h3"},{"title":"hashFunction​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#hashfunction","content":" By default, RxDB will use crypto.subtle.digest('SHA-256', data) for hashing. If you need a different hash function or the crypto.subtle API is not supported in your JavaScript runtime, you can provide an own hash function instead. A hash function gets a string as input and returns a Promise that resolves a string. // example hash function that runs in plain JavaScript import { sha256 } from 'ohash'; function myOwnHashFunction(input: string) { return Promise.resolve(sha256(input)); } const db = await createRxDatabase({ hashFunction: myOwnHashFunction /* ... */ }); If you get the error message TypeError: Cannot read properties of undefined (reading 'digest') this likely means that you are neither running on localhost nor on https which is why your browser might not allow access to crypto.subtle.digest. ","version":"Next","tagName":"h3"},{"title":"Methods​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#methods","content":" ","version":"Next","tagName":"h2"},{"title":"Observe with $​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#observe-with-","content":" Calling this will return an rxjs-Observable which streams all write events of the RxDatabase. myDb.$.subscribe(changeEvent => console.dir(changeEvent)); ","version":"Next","tagName":"h3"},{"title":"exportJSON()​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#exportjson","content":" Use this function to create a json-export from every piece of data in every collection of this database. You can pass true as a parameter to decrypt the encrypted data-fields of your document. Before exportJSON() and importJSON() can be used, you have to add the json-dump plugin. import { addRxPlugin } from 'rxdb'; import { RxDBJsonDumpPlugin } from 'rxdb/plugins/json-dump'; addRxPlugin(RxDBJsonDumpPlugin); myDatabase.exportJSON() .then(json => console.dir(json)); ","version":"Next","tagName":"h3"},{"title":"importJSON()​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#importjson","content":" To import the json-dumps into your database, use this function. // import the dump to the database emptyDatabase.importJSON(json) .then(() => console.log('done')); ","version":"Next","tagName":"h3"},{"title":"backup()​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#backup","content":" Writes the current (or ongoing) database state to the filesystem. Read more ","version":"Next","tagName":"h3"},{"title":"waitForLeadership()​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#waitforleadership","content":" Returns a Promise which resolves when the RxDatabase becomes elected leader. ","version":"Next","tagName":"h3"},{"title":"requestIdlePromise()​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#requestidlepromise","content":" Returns a promise which resolves when the database is in idle. This works similar to requestIdleCallback but tracks the idle-ness of the database instead of the CPU. Use this for semi-important tasks like cleanups which should not affect the speed of important tasks. myDatabase.requestIdlePromise().then(() => { // this will run at the moment the database has nothing else to do myCollection.customCleanupFunction(); }); // with timeout myDatabase.requestIdlePromise(1000 /* time in ms */).then(() => { // this will run at the moment the database has nothing else to do // or the timeout has passed myCollection.customCleanupFunction(); }); ","version":"Next","tagName":"h3"},{"title":"close()​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#close","content":" Closes the databases object-instance. This is to free up memory and stop all observers and replications. Returns a Promise that resolves when the database is closed. Closing a database will not remove the databases data. When you create the database again with createRxDatabase(), all data will still be there. await myDatabase.close(); ","version":"Next","tagName":"h3"},{"title":"remove()​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#remove","content":" Wipes all documents from the storage. Use this to free up disc space. await myDatabase.remove(); // database instance is now gone You can also clear a database without removing its instance by using removeRxDatabase(). This is useful if you want to migrate data or reset the users state by renaming the database. Then you can remove the previous data with removeRxDatabase() without creating a RxDatabase first. Notice that this will only remove the stored data on the storage. It will not clear the cache of any RxDatabase instances. import { removeRxDatabase } from 'rxdb'; removeRxDatabase('mydatabasename', 'localstorage'); ","version":"Next","tagName":"h3"},{"title":"isRxDatabase​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#isrxdatabase","content":" Returns true if the given object is an instance of RxDatabase. Returns false if not. import { isRxDatabase } from 'rxdb'; const is = isRxDatabase(myObj); ","version":"Next","tagName":"h3"},{"title":"collections$​","type":1,"pageTitle":"RxDatabase","url":"/rx-database.html#collections","content":" Emits events whenever a RxCollection is added or removed to the instance of the RxDatabase. Notice that this only emits the JavaScript instance of the RxCollection class, it does not emit events across browser tabs. const sub = myDatabase.collections$.subscribe(event => { console.dir(event); }); await myDatabase.addCollections({ heroes: { schema: mySchema } }); // -> emits the event sub.unsubscribe(); ","version":"Next","tagName":"h3"},{"title":"RxDB's realtime Sync Engine for Local-First Apps","type":0,"sectionRef":"#","url":"/replication.html","content":"","keywords":"","version":"Next"},{"title":"Design Decisions of the Sync Engine​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#design-decisions-of-the-sync-engine","content":" In contrast to other (server-side) database replication protocols, the RxDB Sync Engine was designed with these goals in mind: Easy to Understand: The sync engine works in a simple "git-like" way that is easy to understand for an average developer. You only have to understand how three simple endpoints work.Complex Parts are in RxDB, not in the Backend: The complex parts of the Sync Engine, like conflict handling or offline-online switches, are implemented inside of RxDB itself. This makes creating a compatible backend very easy.Compatible with any Backend: Because the complex parts are in RxDB, the backend can be "dump" which makes the protocol compatible to almost every backend. No matter if you use PostgreSQL, MongoDB or anything else.Performance is optimized for Client Devices and Browsers: By grouping updates and fetches into batches, it is faster to transfer and easier to compress. Client devices and browsers can also process this data faster, for example running JSON.parse() on a chunk of data is faster than calling it once per row. Same goes for how client side storage like IndexedDB or OPFS works where writing data in bulks is faster.Offline-First Support: By incorporating conflict handling at the client side, the protocol fully supports offline-first apps. Users can continue making changes while offline, and those updates will sync seamlessly once a connection is reestablished - all without risking data loss or having undefined behavior.Multi-Tab Support: When RxDB is used in a browser and multiple tabs of the same application are opened, only exactly one runs the replication at any given time. This reduces client- and backend resources. ","version":"Next","tagName":"h2"},{"title":"The Sync Engine on the document level​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#the-sync-engine-on-the-document-level","content":" On the RxDocument level, the replication works like git, where the fork/client contains all new writes and must be merged with the master/server before it can push its new state to the master/server. A---B-----------D master/server state \\ / B---C---D fork/client state The client pulls the latest state B from the master.The client does some changes C+D.The client pushes these changes to the master by sending the latest known master state B and the new client state D of the document.If the master state is equal to the latest master B state of the client, the new client state D is set as the latest master state.If the master also had changes and so the latest master change is different then the one that the client assumes, we have a conflict that has to be resolved on the client. ","version":"Next","tagName":"h2"},{"title":"The Sync Engine on the transfer level​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#the-sync-engine-on-the-transfer-level","content":" When document states are transferred, all handlers use batches of documents for better performance. The server must implement the following methods to be compatible with the replication: pullHandler Get the last checkpoint (or null) as input. Returns all documents that have been written after the given checkpoint. Also returns the checkpoint of the latest written returned document.pushHandler a method that can be called by the client to send client side writes to the master. It gets an array with the assumedMasterState and the newForkState of each document write as input. It must return an array that contains the master document states of all conflicts. If there are no conflicts, it must return an empty array.pullStream an observable that emits batches of all master writes and the latest checkpoint of the write batches. +--------+ +--------+ | | pullHandler() | | | |---------------------> | | | | | | | | | | | Client | pushHandler() | Server | | |---------------------> | | | | | | | | pullStream$ | | | | <-------------------------| | +--------+ +--------+ The replication runs in two different modes: ","version":"Next","tagName":"h2"},{"title":"Checkpoint iteration​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#checkpoint-iteration","content":" On first initial replication, or when the client comes online again, a checkpoint based iteration is used to catch up with the server state. A checkpoint is a subset of the fields of the last pulled document. When the checkpoint is send to the backend via pullHandler(), the backend must be able to respond with all documents that have been written after the given checkpoint. For example if your documents contain an id and an updatedAt field, these two can be used as checkpoint. When the checkpoint iteration reaches the last checkpoint, where the backend returns an empty array because there are no newer documents, the replication will automatically switch to the event observation mode. ","version":"Next","tagName":"h3"},{"title":"Event observation​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#event-observation","content":" While the client is connected to the backend, the events from the backend are observed via pullStream$ and persisted to the client. If your backend for any reason is not able to provide a full pullStream$ that contains all events and the checkpoint, you can instead only emit RESYNC events that tell RxDB that anything unknown has changed on the server and it should run the pull replication via checkpoint iteration. When the client goes offline and online again, it might happen that the pullStream$ has missed out some events. Therefore the pullStream$ should also emit a RESYNC event each time the client reconnects, so that the client can become in sync with the backend via the checkpoint iteration mode. ","version":"Next","tagName":"h3"},{"title":"Data layout on the server​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#data-layout-on-the-server","content":" To use the replication you first have to ensure that: documents are deterministic sortable by their last write time deterministic means that even if two documents have the same last write time, they have a predictable sort order. This is most often ensured by using the primaryKey as second sort parameter as part of the checkpoint. documents are never deleted, instead the _deleted field is set to true. This is needed so that the deletion state of a document exists in the database and can be replicated with other instances. If your backend uses a different field to mark deleted documents, you have to transform the data in the push/pull handlers or with the modifiers. For example if your documents look like this: const docData = { "id": "foobar", "name": "Alice", "lastName": "Wilson", /** * Contains the last write timestamp * so all documents writes can be sorted by that value * when they are fetched from the remote instance. */ "updatedAt": 1564483474, /** * Instead of physically deleting documents, * a deleted document gets replicated. */ "_deleted": false } Then your data is always sortable by updatedAt. This ensures that when RxDB fetches 'new' changes via pullHandler(), it can send the latest updatedAt+id checkpoint to the remote endpoint and then receive all newer documents. By default, the field is _deleted. If your remote endpoint uses a different field to mark deleted documents, you can set the deletedField in the replication options which will automatically map the field on all pull and push requests. ","version":"Next","tagName":"h2"},{"title":"Conflict handling​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#conflict-handling","content":" When multiple clients (or the server) modify the same document at the same time (or when they are offline), it can happen that a conflict arises during the replication. A---B1---C1---X master/server state \\ / B1---C2 fork/client state In the case above, the client would tell the master to move the document state from B1 to C2 by calling pushHandler(). But because the actual master state is C1 and not B1, the master would reject the write by sending back the actual master state C1.RxDB resolves all conflicts on the client so it would call the conflict handler of the RxCollection and create a new document state D that can then be written to the master. A---B1---C1---X---D master/server state \\ / \\ / B1---C2---D fork/client state The default conflict handler will always drop the fork state and use the master state. This ensures that clients that are offline for a very long time, do not accidentally overwrite other peoples changes when they go online again. You can specify a custom conflict handler by setting the property conflictHandler when calling addCollection(). Learn how to create a custom conflict handler. ","version":"Next","tagName":"h2"},{"title":"replicateRxCollection()​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#replicaterxcollection","content":" You can start the replication of a single RxCollection by calling replicateRxCollection() like in the following: import { replicateRxCollection } from 'rxdb/plugins/replication'; import { lastOfArray } from 'rxdb'; const replicationState = await replicateRxCollection({ collection: myRxCollection, /** * An id for the replication to identify it * and so that RxDB is able to resume the replication on app reload. * If you replicate with a remote server, it is recommended to put the * server url into the replicationIdentifier. */ replicationIdentifier: 'my-rest-replication-to-https://example.com/api/sync', /** * By default it will do an ongoing realtime replication. * By settings live: false the replication will run once until the local state * is in sync with the remote state, then it will cancel itself. * (optional), default is true. */ live: true, /** * Time in milliseconds after when a failed backend request * has to be retried. * This time will be skipped if a offline->online switch is detected * via navigator.onLine * (optional), default is 5 seconds. */ retryTime: 5 * 1000, /** * When multiInstance is true, like when you use RxDB in multiple browser tabs, * the replication should always run in only one of the open browser tabs. * If waitForLeadership is true, it will wait until the current instance is leader. * If waitForLeadership is false, it will start replicating, even if it is not leader. * [default=true] */ waitForLeadership: true, /** * If this is set to false, * the replication will not start automatically * but will wait for replicationState.start() being called. * (optional), default is true */ autoStart: true, /** * Custom deleted field, the boolean property of the document data that * marks a document as being deleted. * If your backend uses a different fieldname then '_deleted', set the fieldname here. * RxDB will still store the documents internally with '_deleted', setting this field * only maps the data on the data layer. * * If a custom deleted field contains a non-boolean value, the deleted state * of the documents depends on if the value is truthy or not. So instead of providing a boolean * * deleted value, you could also work with using a 'deletedAt' timestamp instead. * * [default='_deleted'] */ deletedField: 'deleted', /** * Optional, * only needed when you want to replicate local changes to the remote instance. */ push: { /** * Push handler */ async handler(docs) { /** * Push the local documents to a remote REST server. */ const rawResponse = await fetch('https://example.com/api/sync/push', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify({ docs }) }); /** * Contains an array with all conflicts that appeared during this push. * If there were no conflicts, return an empty array. */ const response = await rawResponse.json(); return response; }, /** * Batch size, optional * Defines how many documents will be given to the push handler at once. */ batchSize: 5, /** * Modifies all documents before they are given to the push handler. * Can be used to swap out a custom deleted flag instead of the '_deleted' field. * If the push modifier return null, the document will be skipped and not send to the remote. * Notice that the modifier can be called multiple times and should not contain any side effects. * (optional) */ modifier: d => d }, /** * Optional, * only needed when you want to replicate remote changes to the local state. */ pull: { /** * Pull handler */ async handler(lastCheckpoint, batchSize) { const minTimestamp = lastCheckpoint ? lastCheckpoint.updatedAt : 0; /** * In this example we replicate with a remote REST server */ const response = await fetch( `https://example.com/api/sync/?minUpdatedAt=${minTimestamp}&limit=${batchSize}` ); const documentsFromRemote = await response.json(); return { /** * Contains the pulled documents from the remote. * Not that if documentsFromRemote.length < batchSize, * then RxDB assumes that there are no more un-replicated documents * on the backend, so the replication will switch to 'Event observation' mode. */ documents: documentsFromRemote, /** * The last checkpoint of the returned documents. * On the next call to the pull handler, * this checkpoint will be passed as 'lastCheckpoint' */ checkpoint: documentsFromRemote.length === 0 ? lastCheckpoint : { id: lastOfArray(documentsFromRemote).id, updatedAt: lastOfArray(documentsFromRemote).updatedAt } }; }, batchSize: 10, /** * Modifies all documents after they have been pulled * but before they are used by RxDB. * Notice that the modifier can be called multiple times and should not contain any side effects. * (optional) */ modifier: d => d, /** * Stream of the backend document writes. * See below. * You only need a stream$ when you have set live=true */ stream$: pullStream$.asObservable() }, }); /** * Creating the pull stream for realtime replication. * Here we use a websocket but any other way of sending data to the client can be used, * like long polling or server-sent events. */ const pullStream$ = new Subject<RxReplicationPullStreamItem<any, any>>(); let firstOpen = true; function connectSocket() { const socket = new WebSocket('wss://example.com/api/sync/stream'); /** * When the backend sends a new batch of documents+checkpoint, * emit it into the stream$. * * event.data must look like this * { * documents: [ * { * id: 'foobar', * _deleted: false, * updatedAt: 1234 * } * ], * checkpoint: { * id: 'foobar', * updatedAt: 1234 * } * } */ socket.onmessage = event => pullStream$.next(event.data); /** * Automatically reconnect the socket on close and error. */ socket.onclose = () => connectSocket(); socket.onerror = () => socket.close(); socket.onopen = () => { if(firstOpen) { firstOpen = false; } else { /** * When the client is offline and goes online again, * it might have missed out events that happened on the server. * So we have to emit a RESYNC so that the replication goes * into 'Checkpoint iteration' mode until the client is in sync * and then it will go back into 'Event observation' mode again. */ pullStream$.next('RESYNC'); } } } ","version":"Next","tagName":"h2"},{"title":"Multi Tab support​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#multi-tab-support","content":" For better performance, the replication runs only in one instance when RxDB is used in multiple browser tabs or Node.js processes. By setting waitForLeadership: false you can enforce that each tab runs its own replication cycles. If used in a multi instance setting, so when at database creation multiInstance: false was not set, you need to import the leader election plugin so that RxDB can know how many instances exist and which browser tab should run the replication. ","version":"Next","tagName":"h2"},{"title":"Error handling​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#error-handling","content":" When sending a document to the remote fails for any reason, RxDB will send it again in a later point in time. This happens for all errors. The document write could have already reached the remote instance and be processed, while only the answering fails. The remote instance must be designed to handle this properly and to not crash on duplicate data transmissions. Depending on your use case, it might be ok to just write the duplicate document data again. But for a more resilient error handling you could compare the last write timestamps or add a unique write id field to the document. This field can then be used to detect duplicates and ignore re-send data. Also the replication has an .error$ stream that emits all RxError objects that arise during replication. Notice that these errors contain an inner .parameters.errors field that contains the original error. Also they contain a .parameters.direction field that indicates if the error was thrown during pull or push. You can use these to properly handle errors. For example when the client is outdated, the server might respond with a 426 Upgrade Required error code that can then be used to force a page reload. replicationState.error$.subscribe((error) => { if( error.parameters.errors && error.parameters.errors[0] && error.parameters.errors[0].code === 426 ) { // client is outdated -> enforce a page reload location.reload(); } }); ","version":"Next","tagName":"h2"},{"title":"Security​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#security","content":" Be aware that client side clocks can never be trusted. When you have a client-backend replication, the backend should overwrite the updatedAt timestamp or use another field, when it receives the change from the client. ","version":"Next","tagName":"h2"},{"title":"RxReplicationState​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#rxreplicationstate","content":" The function replicateRxCollection() returns a RxReplicationState that can be used to manage and observe the replication. ","version":"Next","tagName":"h2"},{"title":"Observable​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#observable","content":" To observe the replication, the RxReplicationState has some Observable properties: // emits each document that was received from the remote myRxReplicationState.received$.subscribe(doc => console.dir(doc)); // emits each document that was send to the remote myRxReplicationState.sent$.subscribe(doc => console.dir(doc)); // emits all errors that happen when running the push- & pull-handlers. myRxReplicationState.error$.subscribe(error => console.dir(error)); // emits true when the replication was canceled, false when not. myRxReplicationState.canceled$.subscribe(bool => console.dir(bool)); // emits true when a replication cycle is running, false when not. myRxReplicationState.active$.subscribe(bool => console.dir(bool)); ","version":"Next","tagName":"h3"},{"title":"awaitInitialReplication()​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#awaitinitialreplication","content":" With awaitInitialReplication() you can await the initial replication that is done when a full replication cycle was successful finished for the first time. The returned promise will never resolve if you cancel the replication before the initial replication can be done. await myRxReplicationState.awaitInitialReplication(); ","version":"Next","tagName":"h3"},{"title":"awaitInSync()​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#awaitinsync","content":" Returns a Promise that resolves when: awaitInitialReplication() has emitted.All local data is replicated with the remote.No replication cycle is running or in retry-state. warning When multiInstance: true and waitForLeadership: true and another tab is already running the replication, awaitInSync() will not resolve until the other tab is closed and the replication starts in this tab. await myRxReplicationState.awaitInSync(); warning awaitInitialReplication() and awaitInSync() should not be used to block the application​ A common mistake in RxDB usage is when developers want to block the app usage until the application is in sync. Often they just await the promise of awaitInitialReplication() or awaitInSync() and show a loading spinner until they resolve. This is dangerous and should not be done because: When multiInstance: true and waitForLeadership: true (default) and another tab is already running the replication, awaitInitialReplication() will not resolve until the other tab is closed and the replication starts in this tab.Your app can no longer be started when the device is offline because there the awaitInitialReplication() will never resolve and the app cannot be used. Instead you should store the last in-sync time in a local document and observe its value on all instances. For example if you want to block clients from using the app if they have not been in sync for the last 24 hours, you could use this code: // update last-in-sync-flag each time replication is in sync await myCollection.insertLocal('last-in-sync', { time: 0 }).catch(); // ensure flag exists myReplicationState.active$.pipe( mergeMap(async() => { await myReplicationState.awaitInSync(); await myCollection.upsertLocal('last-in-sync', { time: Date.now() }) }) ); // observe the flag and toggle loading spinner await showLoadingSpinner(); const oneDay = 1000 * 60 * 60 * 24; await firstValueFrom( myCollection.getLocal$('last-in-sync').pipe( filter(d => d.get('time') > (Date.now() - oneDay)) ) ); await hideLoadingSpinner(); ","version":"Next","tagName":"h3"},{"title":"reSync()​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#resync","content":" Triggers a RESYNC cycle where the replication goes into checkpoint iteration until the client is in sync with the backend. Used in unit tests or when no proper pull.stream$ can be implemented so that the client only knows that something has been changed but not what. myRxReplicationState.reSync(); If your backend is not capable of sending events to the client at all, you could run reSync() in an interval so that the client will automatically fetch server changes after some time at least. // trigger RESYNC each 10 seconds. setInterval(() => myRxReplicationState.reSync(), 10 * 1000); ","version":"Next","tagName":"h3"},{"title":"cancel()​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#cancel","content":" Cancels the replication. Returns a promise that resolved when everything has been cleaned up. await myRxReplicationState.cancel(); ","version":"Next","tagName":"h3"},{"title":"pause()​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#pause","content":" Pauses a running replication. The replication can later be resumed with RxReplicationState.start(). await myRxReplicationState.pause(); await myRxReplicationState.start(); // restart ","version":"Next","tagName":"h3"},{"title":"remove()​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#remove","content":" Cancels the replication and deletes the metadata of the replication state. This can be used to restart the replication "from scratch". Calling .remove() will only delete the replication metadata, it will NOT delete the documents from the collection of the replication. await myRxReplicationState.remove(); ","version":"Next","tagName":"h3"},{"title":"isStopped()​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#isstopped","content":" Returns true if the replication is stopped. This can be if a non-live replication is finished or a replication got canceled. replicationState.isStopped(); // true/false ","version":"Next","tagName":"h3"},{"title":"isPaused()​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#ispaused","content":" Returns true if the replication is paused. replicationState.isPaused(); // true/false ","version":"Next","tagName":"h3"},{"title":"Setting a custom initialCheckpoint​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#setting-a-custom-initialcheckpoint","content":" By default, the push replication will start from the beginning of time and push all documents from there to the remote. By setting a custom push.initialCheckpoint, you can tell the replication to only push writes that are newer than the given checkpoint. // store the latest checkpoint of a collection let lastLocalCheckpoint: any; myCollection.checkpoint$.subscribe(checkpoint => lastLocalCheckpoint = checkpoint); // start the replication but only push documents that are newer than the lastLocalCheckpoint const replicationState = replicateRxCollection({ collection: myCollection, replicationIdentifier: 'my-custom-replication-with-init-checkpoint', /* ... */ push: { handler: /* ... */, initialCheckpoint: lastLocalCheckpoint } }); The same can be done for the other direction by setting a pull.initialCheckpoint. Notice that here we need the remote checkpoint from the backend instead of the one from the RxDB storage. // get the last pull checkpoint from the server const lastRemoteCheckpoint = await (await fetch('http://example.com/pull-checkpoint')).json(); // start the replication but only pull documents that are newer than the lastRemoteCheckpoint const replicationState = replicateRxCollection({ collection: myCollection, replicationIdentifier: 'my-custom-replication-with-init-checkpoint', /* ... */ pull: { handler: /* ... */, initialCheckpoint: lastRemoteCheckpoint } }); ","version":"Next","tagName":"h3"},{"title":"toggleOnDocumentVisible​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#toggleondocumentvisible","content":" Ensures replication continues running when the document is visible. This helps avoid situations where the leader-elected tab becomes stale or is hibernated by the browser to save battery. When the tab becomes hidden, replication is automatically paused; when the tab becomes visible again (or the instance becomes leader), replication resumes. Default:true const replicationState = replicateRxCollection({ toggleOnDocumentVisible: true, /* ... */ }); ","version":"Next","tagName":"h3"},{"title":"Attachment replication​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#attachment-replication","content":" Attachment replication is supported in the RxDB Sync Engine itself. However not all replication plugins support it. If you start the replication with a collection which has enabled RxAttachments attachments data will be added to all push- and write data. The pushed documents will contain an _attachments object which contains: The attachment meta data (id, length, digest) of all non-attachmentsThe full attachment data of all attachments that have been updated/added from the client.Deleted attachments are spared out in the pushed document. With this data, the backend can decide onto which attachments must be deleted, added or overwritten. Accordingly, the pulled document must contain the same data, if the backend has a new document state with updated attachments. ","version":"Next","tagName":"h2"},{"title":"Pull-Only Replication​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#pull-only-replication","content":" With the replication protocol it is possible to do pull only replications where data is pulled from a backend but not pushed from the client. RxDB implements some performance optimizations for these like not storing server metadata on pull only streams. ","version":"Next","tagName":"h2"},{"title":"Partial Sync with RxDB​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#partial-sync-with-rxdb","content":" Suppose you're building a Minecraft-like voxel game where the world can expand in every direction. Storing the entire map locally for offline use is impossible because the dataset could be massive. Yet you still want a local-first design so players can edit the game world offline and sync back to the server later. ","version":"Next","tagName":"h2"},{"title":"Idea: One Collection, Multiple Replications​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#idea-one-collection-multiple-replications","content":" You might define a single RxDB collection called db.voxels, where each document represents a block or "voxel" (with fields like id, chunkId, coordinates, and type). With RxDB you can, instead of setting up one replication that tries to fetch all voxels, you create separate replication states for each chunk of the world the player is currently near. When the player enters a particular chunk (say chunk-123), you start a replication dedicated to that chunk. On the server side, you have endpoints to pull only that chunk's voxels (e.g., GET /api/voxels/pull?chunkId=123) and push local changes back (e.g., POST /api/voxels/push?chunkId=123). RxDB handles them similarly to any other offline-first setup, but each replication is filtered to only that chunk's data. When the player leaves chunk-123 and no longer needs it, you stop that replication. If the player moves to chunk-124, you start a new replication for chunk 124. This ensures the game only downloads and syncs data relevant to the player's immediate location. Meanwhile, all edits made offline remain safely stored in the local database until a network connection is available. const activeReplications = {}; // chunkId -> replicationState function startChunkReplication(chunkId) { if (activeReplications[chunkId]) return; const replicationId = 'voxels-chunk-' + chunkId; const replicationState = replicateRxCollection({ collection: db.voxels, replicationIdentifier: replicationId, pull: { async handler(checkpoint, limit) { const res = await fetch( `/api/voxels/pull?chunkId=${chunkId}&cp=${checkpoint}&limit=${limit}` ); /* ... */ } }, push: { async handler(changedDocs) { const res = await fetch(`/api/voxels/push?chunkId=${chunkId}`); /* ... */ } } }); activeReplications[chunkId] = replicationState; } function stopChunkReplication(chunkId) { const rep = await activeReplications[chunkId]; if (rep) { rep.cancel(); delete activeReplications[chunkId]; } } // Called whenever the player's location changes; // dynamically start/stop replication for nearby chunks. function onPlayerMove(neighboringChunkIds) { neighboringChunkIds.forEach(startChunkReplication); Object.keys(activeReplications).forEach(cid => { if (!neighboringChunkIds.includes(cid)) { stopChunkReplication(cid); } }); } ","version":"Next","tagName":"h3"},{"title":"Diffy-Sync when Revisiting a Chunk​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#diffy-sync-when-revisiting-a-chunk","content":" An added benefit of this multi-replication-state design is checkpointing. Each replication state has a unique "replication identifier," so the next time the player returns to chunk-123, the local database knows what it already has and only fetches the differences without the need to re-download the entire chunk. ","version":"Next","tagName":"h3"},{"title":"Partial Sync in a Local-First Business Application​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#partial-sync-in-a-local-first-business-application","content":" Though a voxel world is an intuitive example, the same technique applies in enterprise scenarios where data sets are large but each user only needs a specific subset. You could spin up a new replication for each "permission group" or "region," so users only sync the records they're allowed to see. Or in a CRM, the replication might be filtered by the specific accounts or projects a user is currently handling. As soon as they switch to a different project, you stop the old replication and start one for the new scope. This chunk-based or scope-based replication pattern keeps your local storage lean, reduces network overhead, and still gives users the offline, instant-feedback experience that local-first apps are known for. By dynamically creating (and canceling) replication states, you retain tight control over bandwidth usage and make the infinite (or very large) feasible. In a production app you would also "flag" the entities (with a pull.modifier) by which replication state they came from, so that you can clean up the parts that you no longer need. --> ","version":"Next","tagName":"h3"},{"title":"FAQ​","type":1,"pageTitle":"RxDB's realtime Sync Engine for Local-First Apps","url":"/replication.html#faq","content":" I have infinite loops in my replication, how to debug? When you have infinite loops in your replication or random re-runs of http requests after some time, the reason is likely that your pull-handler is crashing. The debug this, add a log to the error$ handler to debug it. myRxReplicationState.error$.subscribe(err => console.log('error$', err)). ","version":"Next","tagName":"h2"},{"title":"Local Documents","type":0,"sectionRef":"#","url":"/rx-local-document.html","content":"","keywords":"","version":"Next"},{"title":"Add the local documents plugin​","type":1,"pageTitle":"Local Documents","url":"/rx-local-document.html#add-the-local-documents-plugin","content":" To enable the local documents, you have to add the local-documents plugin. import { addRxPlugin } from 'rxdb'; import { RxDBLocalDocumentsPlugin } from 'rxdb/plugins/local-documents'; addRxPlugin(RxDBLocalDocumentsPlugin); ","version":"Next","tagName":"h2"},{"title":"Activate the plugin for a RxDatabase or RxCollection​","type":1,"pageTitle":"Local Documents","url":"/rx-local-document.html#activate-the-plugin-for-a-rxdatabase-or-rxcollection","content":" For better performance, the local document plugin does not create a storage for every database or collection that is created. Instead you have to set localDocuments: true when you want to store local documents in the instance. // activate local documents on a RxDatabase const myDatabase = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageLocalstorage(), localDocuments: true // <- activate this to store local documents in the database }); myDatabase.addCollections({ messages: { schema: messageSchema, localDocuments: true // <- activate this to store local documents in the collection } }); note If you want to store local documents in a RxCollection but NOT in the RxDatabase, you MUST NOT set localDocuments: true in the RxDatabase because it will only slow down the initial database creation. ","version":"Next","tagName":"h2"},{"title":"insertLocal()​","type":1,"pageTitle":"Local Documents","url":"/rx-local-document.html#insertlocal","content":" Creates a local document for the database or collection. Throws if a local document with the same id already exists. Returns a Promise which resolves the new RxLocalDocument. const localDoc = await myCollection.insertLocal( 'foobar', // id { // data foo: 'bar' } ); // you can also use local-documents on a database const localDoc = await myDatabase.insertLocal( 'foobar', // id { // data foo: 'bar' } ); ","version":"Next","tagName":"h2"},{"title":"upsertLocal()​","type":1,"pageTitle":"Local Documents","url":"/rx-local-document.html#upsertlocal","content":" Creates a local document for the database or collection if not exists. Overwrites the if exists. Returns a Promise which resolves the RxLocalDocument. const localDoc = await myCollection.upsertLocal( 'foobar', // id { // data foo: 'bar' } ); ","version":"Next","tagName":"h2"},{"title":"getLocal()​","type":1,"pageTitle":"Local Documents","url":"/rx-local-document.html#getlocal","content":" Find a RxLocalDocument by its id. Returns a Promise which resolves the RxLocalDocument or null if not exists. const localDoc = await myCollection.getLocal('foobar'); ","version":"Next","tagName":"h2"},{"title":"getLocal$()​","type":1,"pageTitle":"Local Documents","url":"/rx-local-document.html#getlocal-1","content":" Like getLocal() but returns an Observable that emits the document or null if not exists. const subscription = myCollection.getLocal$('foobar').subscribe(documentOrNull => { console.dir(documentOrNull); // > RxLocalDocument or null }); ","version":"Next","tagName":"h2"},{"title":"RxLocalDocument​","type":1,"pageTitle":"Local Documents","url":"/rx-local-document.html#rxlocaldocument","content":" A RxLocalDocument behaves like a normal RxDocument. const localDoc = await myCollection.getLocal('foobar'); // access data const foo = localDoc.get('foo'); // change data localDoc.set('foo', 'bar2'); await localDoc.save(); // observe data localDoc.get$('foo').subscribe(value => { /* .. */ }); // remove it await localDoc.remove(); note Because the local document does not have a schema, accessing the documents data-fields via pseudo-proxy will not work. const foo = localDoc.foo; // undefined const foo = localDoc.get('foo'); // works! localDoc.foo = 'bar'; // does not work! localDoc.set('foo', 'bar'); // works For the usage with typescript, you can have access to the typed data of the document over toJSON() declare type MyLocalDocumentType = { foo: string } const localDoc = await myCollection.upsertLocal<MyLocalDocumentType>( 'foobar', // id { // data foo: 'bar' } ); // typescript will know that foo is a string const foo: string = localDoc.toJSON().foo; ","version":"Next","tagName":"h2"},{"title":"RxPipeline","type":0,"sectionRef":"#","url":"/rx-pipeline.html","content":"","keywords":"","version":"Next"},{"title":"Creating a RxPipeline​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#creating-a-rxpipeline","content":" Pipelines are created on top of a source RxCollection and have another RxCollection as destination. An identifier is used to identify the state of the pipeline so that different pipelines have a different processing checkpoint state. A plain JavaScript function handler is used to process the data of the source collection writes. const pipeline = await mySourceCollection.addPipeline({ identifier: 'my-pipeline', destination: myDestinationCollection, handler: async (docs) => { /** * Here you can process the documents and write to * the destination collection. */ for (const doc of docs) { await myDestinationCollection.insert({ id: doc.primary, category: doc.category }); } } }); ","version":"Next","tagName":"h2"},{"title":"Use Cases for RxPipeline​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#use-cases-for-rxpipeline","content":" The RxPipeline is a handy building block for different features and plugins. You can use it to aggregate data or restructure local data. ","version":"Next","tagName":"h2"},{"title":"UseCase: Re-Index data that comes from replication​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#usecase-re-index-data-that-comes-from-replication","content":" Sometimes you want to replicate atomic documents over the wire but locally you want to split these documents for better indexing. For example you replicate email documents that have multiple receivers in a string-array. While string-arrays cannot be indexed, locally you need a way to query for all emails of a given receiver. To handle this case you can set up a RxPipeline that writes the mapping into a separate collection: const pipeline = await emailCollection.addPipeline({ identifier: 'map-email-receivers', destination: emailByReceiverCollection, handler: async (docs) => { for (const doc of docs) { // remove previous mapping await emailByReceiverCollection.find({emailId: doc.primary}).remove(); // add new mapping if(!doc.deleted) { await emailByReceiverCollection.bulkInsert( doc.receivers.map(receiver => ({ emailId: doc.primary, receiver: receiver })) ); } } } }); With this you can efficiently query for "all emails that a person received" by running: const mailIds = await emailByReceiverCollection.find({ receiver: 'foobar@example.com' }).exec(); ","version":"Next","tagName":"h3"},{"title":"UseCase: Fulltext Search​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#usecase-fulltext-search","content":" You can utilize the pipeline plugin to index text data for efficient fulltext search. const pipeline = await emailCollection.addPipeline({ identifier: 'email-fulltext-search', destination: mailByWordCollection, handler: async (docs) => { for (const doc of docs) { // remove previous mapping await mailByWordCollection.find({emailId: doc.primary}).remove(); // add new mapping if(!doc.deleted) { const words = doc.text.split(' '); await mailByWordCollection.bulkInsert( words.map(word => ({ emailId: doc.primary, word: word })) ); } } } }); With this you can efficiently query for "all emails that contain a given word" by running: const mailIds = await emailByReceiverCollection.find({word: 'foobar'}).exec(); ","version":"Next","tagName":"h3"},{"title":"UseCase: Download data based on source documents​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#usecase-download-data-based-on-source-documents","content":" When you have to fetch data for each document of a collection from a server, you can use the pipeline to ensure all documents have their data downloaded and no document is missed. const pipeline = await emailCollection.addPipeline({ identifier: 'download-data', destination: serverDataCollection, handler: async (docs) => { for (const doc of docs) { const response = await fetch('https://example.com/doc/' + doc.primary); const serverData = await response.json(); await serverDataCollection.upsert({ id: doc.primary, data: serverData }); } } }); ","version":"Next","tagName":"h3"},{"title":"RxPipeline methods​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#rxpipeline-methods","content":" ","version":"Next","tagName":"h2"},{"title":"awaitIdle()​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#awaitidle","content":" You can await the idleness of a pipeline with await myRxPipeline.awaitIdle(). This will await a promise that resolves when the pipeline has processed all documents and is not running anymore. ","version":"Next","tagName":"h3"},{"title":"close()​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#close","content":" await myRxPipeline.close() stops the pipeline so that it is no longer doing stuff. This is automatically called when the RxCollection or RxDatabase of the pipeline is closed. ","version":"Next","tagName":"h3"},{"title":"remove()​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#remove","content":" await myRxPipeline.remove() removes the pipeline and all metadata which it has stored. Recreating the pipeline afterwards will start processing all source documents from scratch. ","version":"Next","tagName":"h3"},{"title":"Using RxPipeline correctly​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#using-rxpipeline-correctly","content":" ","version":"Next","tagName":"h2"},{"title":"Pipeline handlers must be idempotent​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#pipeline-handlers-must-be-idempotent","content":" Because a JavaScript process can exit at any time, like when the user closes a browser tab, the pipeline handler function must be idempotent. This means when it only runs partially and is started again with the same input, it should still end up in the correct result. ","version":"Next","tagName":"h3"},{"title":"Pipeline handlers must not throw​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#pipeline-handlers-must-not-throw","content":" Pipeline handlers must never throw. If you run operations inside of the handler that might cause errors, you must wrap the handler's code with a try-catch by yourself and also handle retries. If your handler throws, your pipeline will be stuck and no longer be usable, which should never happen. ","version":"Next","tagName":"h3"},{"title":"Be careful when doing http requests in the handler​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#be-careful-when-doing-http-requests-in-the-handler","content":" When you run http requests inside of your handler, you no longer have an offline first application because reads to the destination collection will be blocked until all handlers have finished. When your client is offline, therefore the collection will be blocked for reads and writes. ","version":"Next","tagName":"h3"},{"title":"Pipelines temporarily block external reads and writes​","type":1,"pageTitle":"RxPipeline","url":"/rx-pipeline.html#pipelines-temporarily-block-external-reads-and-writes","content":" While a pipeline is running, all reads and writes to its destination collection are blocked. This guarantees that queries never observe partially processed data, but it also means that pipelines can block each other if they interact incorrectly. Problems occur when multiple pipelines: read or write across the same collections, orwait for each other using awaitIdle() from inside a pipeline handler. // Example of a deadlock // Pipeline A: files → files (reads folders) const pipelineA = await db.files.addPipeline({ identifier: 'file-path-sync', destination: db.files, handler: async (docs) => { const folders = await folders.find().exec(); // can block /* ... */ } }); // Pipeline B: files → folders (waits for A) await db.folders.addPipeline({ identifier: 'file-count', destination: db.folders, handler: async () => { await pipelineA.awaitIdle(); // ❌ may deadlock /* ... */ } }); To prevent deadlocks, consider: Never call awaitIdle() inside a pipeline handler.Avoid circular dependencies between pipelines.Prefer one-directional data flow. ","version":"Next","tagName":"h3"},{"title":"RxDocument","type":0,"sectionRef":"#","url":"/rx-document.html","content":"","keywords":"","version":"Next"},{"title":"insert​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#insert","content":" To insert a document into a collection, you have to call the collection's .insert()-function. await myCollection.insert({ name: 'foo', lastname: 'bar' }); ","version":"Next","tagName":"h2"},{"title":"find​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#find","content":" To find documents in a collection, you have to call the collection's .find()-function. See RxQuery. const docs = await myCollection.find().exec(); // <- find all documents ","version":"Next","tagName":"h2"},{"title":"Functions​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#functions","content":" ","version":"Next","tagName":"h2"},{"title":"get()​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#get","content":" This will get a single field of the document. If the field is encrypted, it will be automatically decrypted before returning. const name = myDocument.get('name'); // returns the name // OR const name = myDocument.name; ","version":"Next","tagName":"h3"},{"title":"get$()​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#get-1","content":" This function returns an observable of the given paths-value. The current value of this path will be emitted each time the document changes. // get the live-updating value of 'name' var isName; myDocument.get$('name') .subscribe(newName => { isName = newName; }); await myDocument.incrementalPatch({name: 'foobar2'}); console.dir(isName); // isName is now 'foobar2' // OR myDocument.name$ .subscribe(newName => { isName = newName; }); ","version":"Next","tagName":"h3"},{"title":"proxy-get​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#proxy-get","content":" All properties of a RxDocument are assigned as getters so you can also directly access values instead of using the get()-function. // Identical to myDocument.get('name'); var name = myDocument.name; // Can also get nested values. var nestedValue = myDocument.whatever.nestedfield; // Also usable with observables: myDocument.firstName$.subscribe(newName => console.log('name is: ' + newName)); // > 'name is: Stefe' await myDocument.incrementalPatch({firstName: 'Steve'}); // > 'name is: Steve' ","version":"Next","tagName":"h3"},{"title":"update()​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#update","content":" Updates the document based on the mongo-update-syntax, based on the mingo library. /** * If not done before, you have to add the update plugin. */ import { addRxPlugin } from 'rxdb'; import { RxDBUpdatePlugin } from 'rxdb/plugins/update'; addRxPlugin(RxDBUpdatePlugin); await myDocument.update({ $inc: { age: 1 // increases age by 1 }, $set: { firstName: 'foobar' // sets firstName to foobar } }); ","version":"Next","tagName":"h3"},{"title":"modify()​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#modify","content":" Updates a documents data based on a function that mutates the current data and returns the new value. const changeFunction = (oldData) => { oldData.age = oldData.age + 1; oldData.name = 'foooobarNew'; return oldData; } await myDocument.modify(changeFunction); console.log(myDocument.name); // 'foooobarNew' ","version":"Next","tagName":"h3"},{"title":"patch()​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#patch","content":" Overwrites the given attributes over the documents data. await myDocument.patch({ name: 'Steve', age: undefined // setting an attribute to undefined will remove it }); console.log(myDocument.name); // 'Steve' ","version":"Next","tagName":"h3"},{"title":"Prevent conflicts with the incremental methods​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#prevent-conflicts-with-the-incremental-methods","content":" Making a normal change to the non-latest version of a RxDocument will lead to a 409 CONFLICT error because RxDB uses revision checks instead of transactions. To make a change to a document, no matter what the current state is, you can use the incremental methods: // update await myDocument.incrementalUpdate({ $inc: { age: 1 // increases age by 1 } }); // modify await myDocument.incrementalModify(docData => { docData.age = docData.age + 1; return docData; }); // patch await myDocument.incrementalPatch({ age: 100 }); // remove await myDocument.incrementalRemove({ age: 100 }); ","version":"Next","tagName":"h3"},{"title":"getLatest()​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#getlatest","content":" Returns the latest known state of the RxDocument. const myDocument = await myCollection.findOne('foobar').exec(); const docAfterEdit = await myDocument.incrementalPatch({ age: 10 }); const latestDoc = myDocument.getLatest(); console.log(docAfterEdit === latestDoc); // > true ","version":"Next","tagName":"h3"},{"title":"Observe $​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#observe-","content":" Calling this will return an RxJS-Observable which the current newest state of the RxDocument. // get all changeEvents myDocument.$ .subscribe(currentRxDocument => console.dir(currentRxDocument)); ","version":"Next","tagName":"h3"},{"title":"remove()​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#remove","content":" This removes the document from the collection. Notice that this will not purge the document from the store but set _deleted:true so that it will be no longer returned on queries. To fully purge a document, use the cleanup plugin. myDocument.remove(); ","version":"Next","tagName":"h3"},{"title":"Remove and update in a single atomic operation​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#remove-and-update-in-a-single-atomic-operation","content":" Sometimes you want to change a documents value and also remove it in the same operation. For example this can be useful when you use replication and want to set a deletedAt timestamp. Then you might have to ensure that setting this timestamp and deleting the document happens in the same atomic operation. To do this the modifying operations of a document accept setting the _deleted field. For example: // update() and remove() await doc.update({ $set: { deletedAt: new Date().getTime(), _deleted: true } }); // modify() and remove() await doc.modify(data => { data.age = 1; data._deleted = true; return data; }); ","version":"Next","tagName":"h3"},{"title":"deleted$​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#deleted","content":" Emits a boolean value, depending on whether the RxDocument is deleted or not. let lastState = null; myDocument.deleted$.subscribe(state => lastState = state); console.log(lastState); // false await myDocument.remove(); console.log(lastState); // true ","version":"Next","tagName":"h3"},{"title":"get deleted​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#get-deleted","content":" A getter to get the current value of deleted$. console.log(myDocument.deleted); // false await myDocument.remove(); console.log(myDocument.deleted); // true ","version":"Next","tagName":"h3"},{"title":"toJSON()​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#tojson","content":" Returns the document's data as plain json object. This will return an immutable object. To get something that can be modified, use toMutableJSON() instead. const json = myDocument.toJSON(); console.dir(json); /* { passportId: 'h1rg9ugdd30o', firstName: 'Carolina', lastName: 'Gibson', age: 33 ... */ You can also set withMetaFields: true to get additional meta fields like the revision, attachments or the deleted flag. const json = myDocument.toJSON(true); console.dir(json); /* { passportId: 'h1rg9ugdd30o', firstName: 'Carolina', lastName: 'Gibson', _deleted: false, _attachments: { ... }, _rev: '1-aklsdjfhaklsdjhf...' */ ","version":"Next","tagName":"h3"},{"title":"toMutableJSON()​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#tomutablejson","content":" Same as toJSON() but returns a deep cloned object that can be mutated afterwards. Remember that deep cloning is performance expensive and should only be done when necessary. const json = myDocument.toMutableJSON(); json.firstName = 'Alice'; // The returned document can be mutated All methods of RxDocument are bound to the instance When you get a method from a RxDocument, the method is automatically bound to the documents instance. This means you do not have to use things like myMethod.bind(myDocument) like you would do in jsx. ","version":"Next","tagName":"h3"},{"title":"isRxDocument​","type":1,"pageTitle":"RxDocument","url":"/rx-document.html#isrxdocument","content":" Returns true if the given object is an instance of RxDocument. Returns false if not. const is = isRxDocument(myObj); ","version":"Next","tagName":"h3"},{"title":"RxQuery","type":0,"sectionRef":"#","url":"/rx-query.html","content":"","keywords":"","version":"Next"},{"title":"find()​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#find","content":" To create a basic RxQuery, call .find() on a collection and insert selectors. The result-set of normal queries is an array with documents. // find all that are older then 18 const query = myCollection .find({ selector: { age: { $gt: 18 } } }); ","version":"Next","tagName":"h2"},{"title":"findOne()​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#findone","content":" A findOne-query has only a single RxDocument or null as result-set. // find alice const query = myCollection .findOne({ selector: { name: 'alice' } }); // find the youngest one const query = myCollection .findOne({ selector: {}, sort: [ {age: 'asc'} ] }); // find one document by the primary key const query = myCollection.findOne('foobar'); ","version":"Next","tagName":"h2"},{"title":"exec()​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#exec","content":" Returns a Promise that resolves with the result-set of the query. const query = myCollection.find(); const results = await query.exec(); console.dir(results); // > [RxDocument,RxDocument,RxDocument..] On .findOne() queries, you can call .exec(true) to ensure your document exists and to make TypeScript handling easier: // docOrUndefined can be the type RxDocument or null which then has to be handled to be typesafe. const docOrUndefined = await myCollection.findOne().exec(); // with .exec(true), it will throw if the document cannot be found and always have the type RxDocument const doc = await myCollection.findOne().exec(true); ","version":"Next","tagName":"h2"},{"title":"Observe $​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#observe-","content":" An BehaviorSubjectsee that always has the current result-set as value. This is extremely helpful when used together with UIs that should always show the same state as what is written in the database. const query = myCollection.find(); const querySub = query.$.subscribe(results => { console.log('got results: ' + results.length); }); // > 'got results: 5' // BehaviorSubjects emit on subscription await myCollection.insert({/* ... */}); // insert one // > 'got results: 6' // $.subscribe() was called again with the new results // stop watching this query querySub.unsubscribe() ","version":"Next","tagName":"h2"},{"title":"update()​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#update","content":" Runs an update on every RxDocument of the query-result. // to use the update() method, you need to add the update plugin. import { RxDBUpdatePlugin } from 'rxdb/plugins/update'; addRxPlugin(RxDBUpdatePlugin); const query = myCollection.find({ selector: { age: { $gt: 18 } } }); await query.update({ $inc: { age: 1 // increases age of every found document by 1 } }); ","version":"Next","tagName":"h2"},{"title":"patch() / incrementalPatch()​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#patch--incrementalpatch","content":" Runs the RxDocument.patch() function on every RxDocument of the query result. const query = myCollection.find({ selector: { age: { $gt: 18 } } }); await query.patch({ age: 12 // set the age of every found to 12 }); ","version":"Next","tagName":"h2"},{"title":"modify() / incrementalModify()​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#modify--incrementalmodify","content":" Runs the RxDocument.modify() function on every RxDocument of the query result. const query = myCollection.find({ selector: { age: { $gt: 18 } } }); await query.modify((docData) => { docData.age = docData.age + 1; // increases age of every found document by 1 return docData; }); ","version":"Next","tagName":"h2"},{"title":"remove() / incrementalRemove()​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#remove--incrementalremove","content":" Deletes all found documents. Returns a promise which resolves to the deleted documents. // All documents where the age is less than 18 const query = myCollection.find({ selector: { age: { $lt: 18 } } }); // Remove the documents from the collection const removedDocs = await query.remove(); ","version":"Next","tagName":"h2"},{"title":"doesDocumentDataMatch()​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#doesdocumentdatamatch","content":" Returns true if the given document data matches the query. const documentData = { id: 'foobar', age: 19 }; myCollection.find({ selector: { age: { $gt: 18 } } }).doesDocumentDataMatch(documentData); // > true myCollection.find({ selector: { age: { $gt: 20 } } }).doesDocumentDataMatch(documentData); // > false ","version":"Next","tagName":"h2"},{"title":"Query Builder Plugin​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#query-builder-plugin","content":" To use chained query methods, you can also use the query-builder plugin. // add the query builder plugin import { addRxPlugin } from 'rxdb'; import { RxDBQueryBuilderPlugin } from 'rxdb/plugins/query-builder'; addRxPlugin(RxDBQueryBuilderPlugin); // now you can use chained query methods const query = myCollection.find().where('age').gt(18); const result = await query.exec(); ","version":"Next","tagName":"h2"},{"title":"Query Examples​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#query-examples","content":" Here some examples to fast learn how to write queries without reading the docs. Pouch-find-docs - learn how to use mango-queriesmquery-docs - learn how to use chained-queries // directly pass search-object myCollection.find({ selector: { name: { $eq: 'foo' } } }) .exec().then(documents => console.dir(documents)); /* * find by using sql equivalent '%like%' syntax * This example will fe: match 'foo' but also 'fifoo' or 'foofa' or 'fifoofa' * Notice that in RxDB queries, a regex is represented as a $regex string with the $options parameter for flags. * Using a RegExp instance is not allowed because they are not JSON.stringify()-able and also * RegExp instances are mutable which could cause undefined behavior when the RegExp is mutated * after the query was parsed. */ myCollection.find({ selector: { name: { $regex: '.*foo.*' } } }) .exec().then(documents => console.dir(documents)); // find using a composite statement eg: $or // This example checks where name is either foo or if name is not existent on the document myCollection.find({ selector: { $or: [ { name: { $eq: 'foo' } }, { name: { $exists: false } }] } }) .exec().then(documents => console.dir(documents)); // do a case insensitive search // This example will match 'foo' or 'FOO' or 'FoO' etc... myCollection.find({ selector: { name: { $regex: '^foo$', $options: 'i' } } }) .exec().then(documents => console.dir(documents)); // chained queries myCollection.find().where('name').eq('foo') .exec().then(documents => console.dir(documents)); RxDB will always append the primary key to the sort parameters For several performance optimizations, like the EventReduce algorithm, RxDB expects all queries to return a deterministic sort order that does not depend on the insert order of the documents. To ensure a deterministic ordering, RxDB will always append the primary key as last sort parameter to all queries and to all indexes. This works in contrast to most other databases where a query without sorting would return the documents in the order in which they had been inserted to the database. ","version":"Next","tagName":"h2"},{"title":"Setting a specific index​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#setting-a-specific-index","content":" By default, the query will be sent to the RxStorage, where a query planner will determine which one of the available indexes must be used. But the query planner cannot know everything and sometimes will not pick the most optimal index. To improve query performance, you can specify which index must be used, when running the query. const query = myCollection .findOne({ selector: { age: { $gt: 18 }, gender: { $eq: 'm' } }, /** * Because the developer knows that 50% of the documents are 'male', * but only 20% are below age 18, * it makes sense to enforce using the ['gender', 'age'] index to improve performance. * This could not be known by the query planer which might have chosen ['age', 'gender'] instead. */ index: ['gender', 'age'] }); ","version":"Next","tagName":"h2"},{"title":"Count​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#count","content":" When you only need the amount of documents that match a query, but you do not need the document data itself, you can use a count query for better performance. The performance difference compared to a normal query differs depending on which RxStorage implementation is used. const query = myCollection.count({ selector: { age: { $gt: 18 } } // 'limit' and 'skip' MUST NOT be set for count queries. }); // get the count result once const matchingAmount = await query.exec(); // > number // observe the result query.$.subscribe(amount => { console.log('Currently has ' + amount + ' documents'); }); note Count queries have a better performance than normal queries because they do not have to fetch the full document data out of the storage. Therefore it is not possible to run a count() query with a selector that requires to fetch and compare the document data. So if your query selector does not fully match an index of the schema, it is not allowed to run it. These queries would have no performance benefit compared to normal queries but have the tradeoff of not using the fetched document data for caching. /** * The following will throw an error because * the count operation cannot run on any specific index range * because the $regex operator is used. */ const query = myCollection.count({ selector: { age: { $regex: 'foobar' } } }); /** * The following will throw an error because * the count operation cannot run on any specific index range * because there is no ['age' ,'otherNumber'] index * defined in the schema. */ const query = myCollection.count({ selector: { age: { $gt: 20 }, otherNumber: { $gt: 10 } } }); If you want to count these kinds of queries, you should do a normal query instead and use the length of the result set as counter. This has the same performance as running a non-fully-indexed count which has to fetch all document data from the database and run a query matcher. // get count manually once const resultSet = await myCollection.find({ selector: { age: { $regex: 'foobar' } } }).exec(); const count = resultSet.length; // observe count manually const count$ = myCollection.find({ selector: { age: { $regex: 'foobar' } } }).$.pipe( map(result => result.length) ); /** * To allow non-fully-indexed count queries, * you can also specify that by setting allowSlowCount=true * when creating the database. */ const database = await createRxDatabase({ name: 'mydatabase', allowSlowCount: true, // set this to true [default=false] /* ... */ }); ","version":"Next","tagName":"h2"},{"title":"allowSlowCount​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#allowslowcount","content":" To allow non-fully-indexed count queries, you can also specify that by setting allowSlowCount: true when creating the database. Doing this is mostly not wanted, because it would run the counting on the storage without having the document stored in the RxDB document cache. This is only recommended if the RxStorage is running remotely like in a WebWorker and you not always want to send the document-data between the worker and the main thread. In this case you might only need the count-result instead to save performance. ","version":"Next","tagName":"h3"},{"title":"RxQuery's are immutable​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#rxquerys-are-immutable","content":" Because RxDB is a reactive database, we can do heavy performance-optimisation on query-results which change over time. To be able to do this, RxQuery's have to be immutable. This means, when you have a RxQuery and run a .where() on it, the original RxQuery-Object is not changed. Instead the where-function returns a new RxQuery-Object with the changed where-field. Keep this in mind if you create RxQuery's and change them afterwards. Example: const queryObject = myCollection.find().where('age').gt(18); // Creates a new RxQuery object, does not modify previous one queryObject.sort('name'); const results = await queryObject.exec(); console.dir(results); // result-documents are not sorted by name const queryObjectSort = queryObject.sort('name'); const results = await queryObjectSort.exec(); console.dir(results); // result-documents are now sorted ","version":"Next","tagName":"h2"},{"title":"isRxQuery​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#isrxquery","content":" Returns true if the given object is an instance of RxQuery. Returns false if not. const is = isRxQuery(myObj); ","version":"Next","tagName":"h3"},{"title":"Design Decisions​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#design-decisions","content":" Like most other noSQL-Databases, RxDB uses the mango-query-syntax similar to MongoDB and others. We use the JSON based Mango Query Syntax because: Mango Queries work better with TypeScript compared to SQL strings.Mango Queries are composable and easy to transform by code without joining SQL strings.Queries can be run very fast and efficient with only a minimal query planer to plan the best indexes and operations.NoSQL queries can be optimized with the EventReduce algorithm to improve performance of observed and cached queries. ","version":"Next","tagName":"h2"},{"title":"FAQ​","type":1,"pageTitle":"RxQuery","url":"/rx-query.html#faq","content":" Can I specify which document fields are returned by an RxDB query? No, RxDB does not support partial document retrieval. Because RxDB is a client-side database with limited memory, it caches and de-duplicates entire documents across multiple queries. Even if you only need a few fields, most storages must still fetch the entire JSON data, so subselecting fields would not significantly improve performance. Therefore, RxDB always returns full documents. If you only need certain fields, you can filter them out in your application code or consider storing just the necessary data in a separate collection. Why doesn't RxDB support aggregations on queries? RxDB runs entirely on the client side. Any "aggregation" or data processing you might do within RxDB would still happen in the same JavaScript environment as your application code. Therefore, there's no real performance advantage or difference between doing the aggregation in RxDB vs. doing it in your own code after fetching the data. As a result, RxDB doesn't provide built-in aggregation methods. Instead, just query the documents you need and perform any calculations directly in your app's code. Why does RxDB not support cross-collection queries? RxDB is a client-side database and does not provide built-in cross-collection queries or transactions. Instead, you can execute multiple queries in your JavaScript code and combine their results as needed. Because everything runs in the same environment, this approach offers the same performance you would get if cross-collection queries were built in - without the added complexity. Why Doesn't RxDB Support Case-Insensitive Search? RxDB relies on various storage engines as its backend, and these storage engines generally do not support case-insensitive search natively, like IndexedDB or FoundationDB. This limitation arises from the design of these engines, which prioritize efficiency and flexibility for specific types of queries rather than universal features like case-insensitivity. Although RxDB does not offer built-in support for case-insensitive search, there are two common workarounds: Store Data in a Meta-Field for Lowercase Search: To enable case-insensitive search, you can store an additional field in your documents where the relevant text data is preprocessed and saved in lowercase. const document = { name: 'John Doe', nameLowercase: 'john doe' // Meta-field }; await myCollection.insert(document); const query = myCollection.find({ selector: { nameLowercase: { $eq: 'john doe' } } }); Use a Regex Query: Regular expressions can perform case-insensitive searches. For example: const query = myCollection.find({ selector: { name: { $regex: '^john doe$', $options: 'i' } // Case-insensitive regex } }); However, this method has a significant downside: regex queries often cannot leverage indexes efficiently. As a result, they may be slower, especially for large datasets. ","version":"Next","tagName":"h2"},{"title":"RxSchema","type":0,"sectionRef":"#","url":"/rx-schema.html","content":"","keywords":"","version":"Next"},{"title":"Example​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#example","content":" In this example-schema we define a hero-collection with the following settings: the version-number of the schema is 0the name-property is the primaryKey. This means its a unique, indexed, required string which can be used to definitely find a single document.the color-field is required for every documentthe healthpoints-field must be a number between 0 and 100the secret-field stores an encrypted valuethe birthyear-field is final which means it is required and cannot be changedthe skills-attribute must be an array with objects which contain the name and the damage-attribute. There is a maximum of 5 skills per hero.Allows adding attachments and store them encrypted { "title": "hero schema", "version": 0, "description": "describes a simple hero", "primaryKey": "name", "type": "object", "properties": { "name": { "type": "string", "maxLength": 100 // <- the primary key must have set maxLength }, "color": { "type": "string" }, "healthpoints": { "type": "number", "minimum": 0, "maximum": 100 }, "secret": { "type": "string" }, "birthyear": { "type": "number", "final": true, "minimum": 1900, "maximum": 2050 }, "skills": { "type": "array", "maxItems": 5, "uniqueItems": true, "items": { "type": "object", "properties": { "name": { "type": "string" }, "damage": { "type": "number" } } } } }, "required": [ "name", "color" ], "encrypted": ["secret"], "attachments": { "encrypted": true } } ","version":"Next","tagName":"h2"},{"title":"Create a collection with the schema​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#create-a-collection-with-the-schema","content":" await myDatabase.addCollections({ heroes: { schema: myHeroSchema } }); console.dir(myDatabase.heroes.name); // heroes ","version":"Next","tagName":"h2"},{"title":"version​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#version","content":" The version field is a number, starting with 0. When the version is greater than 0, you have to provide the migrationStrategies to create a collection with this schema. ","version":"Next","tagName":"h2"},{"title":"primaryKey​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#primarykey","content":" The primaryKey field contains the fieldname of the property that will be used as primary key for the whole collection. The value of the primary key of the document must be a string, unique, final and is required. ","version":"Next","tagName":"h2"},{"title":"composite primary key​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#composite-primary-key","content":" You can define a composite primary key which gets composed from multiple properties of the document data. const mySchema = { keyCompression: true, // set this to true, to enable the keyCompression version: 0, title: 'human schema with composite primary', primaryKey: { // where should the composed string be stored key: 'id', // fields that will be used to create the composed key fields: [ 'firstName', 'lastName' ], // separator which is used to concat the fields values. separator: '|' }, type: 'object', properties: { id: { type: 'string', maxLength: 100 // <- the primary key must have set maxLength }, firstName: { type: 'string' }, lastName: { type: 'string' } }, required: [ 'id', 'firstName', 'lastName' ] }; You can then find a document by using the relevant parts to create the composite primaryKey: // inserting with composite primary await myRxCollection.insert({ // id, <- do not set the id, it will be filled by RxDB firstName: 'foo', lastName: 'bar' }); // find by composite primary const id = myRxCollection.schema.getPrimaryOfDocumentData({ firstName: 'foo', lastName: 'bar' }); const myRxDocument = myRxCollection.findOne(id).exec(); ","version":"Next","tagName":"h3"},{"title":"Indexes​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#indexes","content":" RxDB supports secondary indexes which are defined at the schema-level of the collection. Index is only allowed on field types string, integer and number. Some RxStorages allow to use boolean fields as index. Depending on the field type, you must have set some meta attributes like maxLength or minimum. This is required so that RxDB is able to know the maximum string representation length of a field, which is needed to craft custom indexes on several RxStorage implementations. note RxDB will always append the primaryKey to all indexes to ensure a deterministic sort order of query results. You do not have to add the primaryKey to any index. ","version":"Next","tagName":"h2"},{"title":"Index-example​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#index-example","content":" const schemaWithIndexes = { version: 0, title: 'human schema with indexes', keyCompression: true, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 // <- the primary key must have set maxLength }, firstName: { type: 'string', maxLength: 100 // <- string-fields that are used as an index, must have set maxLength. }, lastName: { type: 'string' }, active: { type: 'boolean' }, familyName: { type: 'string' }, balance: { type: 'number', // number fields that are used in an index, must have set minimum, maximum and multipleOf minimum: 0, maximum: 100000, multipleOf: 0.01 }, creditCards: { type: 'array', items: { type: 'object', properties: { cvc: { type: 'number' } } } } }, required: [ 'id', 'active' // <- boolean fields that are used in an index, must be required. ], indexes: [ 'firstName', // <- this will create a simple index for the `firstName` field ['active', 'firstName'], // <- this will create a compound-index for these two fields 'active' ] }; internalIndexes When you use RxDB on the server-side, you might want to use internalIndexes to speed up internal queries. Read more ","version":"Next","tagName":"h3"},{"title":"attachments​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#attachments","content":" To use attachments in the collection, you have to add the attachments-attribute to the schema. See RxAttachment. ","version":"Next","tagName":"h2"},{"title":"default​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#default","content":" Default values can only be defined for first-level fields. Whenever you insert a document unset fields will be filled with default-values. const schemaWithDefaultAge = { version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 // <- the primary key must have set maxLength }, firstName: { type: 'string' }, lastName: { type: 'string' }, age: { type: 'integer', default: 20 // <- default will be used } }, required: ['id'] }; ","version":"Next","tagName":"h2"},{"title":"final​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#final","content":" By setting a field to final, you make sure it cannot be modified later. Final fields are always required. Final fields cannot be observed because they will not change. Advantages: With final fields you can ensure that no-one accidentally modifies the data.When you enable the eventReduce algorithm, some performance-improvements are done. const schemaWithFinalAge = { version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string', maxLength: 100 // <- the primary key must have set maxLength }, firstName: { type: 'string' }, lastName: { type: 'string' }, age: { type: 'integer', final: true } }, required: ['id'] }; ","version":"Next","tagName":"h2"},{"title":"Non allowed properties​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#non-allowed-properties","content":" The schema is not only used to validate objects before they are written into the database, but also used to map getters to observe and populate single fieldnames, keycompression and other things. Therefore you can not use every schema which would be valid for the spec of json-schema.org. For example, fieldnames must match the regex ^[a-zA-Z][[a-zA-Z0-9_]*]?[a-zA-Z0-9]$ and additionalProperties is always set to false. But don't worry, RxDB will instantly throw an error when you pass an invalid schema into it. Also the following class properties of RxDocument cannot be used as top level fields because they would clash when the RxDocument property is accessed: [ "collection", "_data", "_propertyCache", "isInstanceOfRxDocument", "primaryPath", "primary", "revision", "deleted$", "deleted$$", "deleted", "getLatest", "$", "$$", "get$", "get$$", "populate", "get", "toJSON", "toMutableJSON", "update", "incrementalUpdate", "updateCRDT", "putAttachment", "putAttachmentBase64", "getAttachment", "allAttachments", "allAttachments$", "modify", "incrementalModify", "patch", "incrementalPatch", "_saveData", "remove", "incrementalRemove", "close", "deleted", "synced" ] ","version":"Next","tagName":"h2"},{"title":"FAQ​","type":1,"pageTitle":"RxSchema","url":"/rx-schema.html#faq","content":" How can I store a Date? With RxDB you can only store plain JSON data inside of a document. You cannot store a JavaScript new Date() instance directly. This is for performance reasons and because Date() is a mutable thing where changing it at any time might cause strange problem that are hard to debug. To store a date in RxDB, you have to define a string field with a format attribute: { "type": "string", "format": "date-time" } When storing the data you have to first transform your Date object into a string Date.toISOString(). Because the date-time is sortable, you can do whatever query operations on that field and even use it as an index. How to store schemaless data? By design, RxDB requires that every collection has a schema. This means you cannot create a truly "schema-less" collection where top-level fields are unknown at schema creation time. RxDB must know about all fields of a document at the top level to perform validation, index creation, and other internal optimizations. However, there is a way to store data of arbitrary structure at sub-fields. To do this, define a property with type: "object" in your schema. For example: { "version": 0, "primaryKey": "id", "type": "object", "properties": { "id": { "type": "string", "maxLength": 100 }, "myDynamicData": { "type": "object" // Here you can store any JSON data // because it's an open object. } }, "required": ["id"] } Why does RxDB automatically set additionalProperties: false at the top level RxDB automatically sets additionalProperties: false at the top level of a schema to ensure that all top-level fields are known in advance. This design choice offers several benefits: Prevents collisions with RxDocument class properties: RxDB documents have built-in class methods (e.g., .toJSON, .save) at the top level. By forbidding unknown top-level properties, we avoid accidental naming collisions with these built-in methods. Avoids conflicts with user-defined ORM functions: Developers can add custom ORM methods to RxDocuments. If top-level properties were unbounded, a property name could accidentally conflict with a method name, leading to unexpected behavior. Improves TypeScript typings: If RxDB didn't know about all top-level fields, the document type would effectively become any. That means a simple typo like myDocument.toJOSN() would only be caught at runtime, not at build time. By disallowing unknown properties, TypeScript can provide strict typing and catch errors sooner. Can't change the schema of a collection When you make changes to the schema of a collection, you sometimes can get an error likeError: addCollections(): another instance created this collection with a different schema. This means you have created a collection before and added document-data to it. When you now just change the schema, it is likely that the new schema does not match the saved documents inside of the collection. This would cause strange bugs and would be hard to debug, so RxDB check's if your schema has changed and throws an error. To change the schema in production-mode, do the following steps: Increase the version by 1Add the appropriate migrationStrategies so the saved data will be modified to match the new schema In development-mode, the schema-change can be simplified by one of these strategies: Use the memory-storage so your db resets on restart and your schema is not saved permanentlyCall removeRxDatabase('mydatabasename', RxStorage); before creating a new RxDatabase-instanceAdd a timestamp as suffix to the database-name to create a new one each run like name: 'heroesDB' + new Date().getTime() ","version":"Next","tagName":"h2"},{"title":"Scaling the RxServer","type":0,"sectionRef":"#","url":"/rx-server-scaling.html","content":"","keywords":"","version":"Next"},{"title":"Vertical Scaling​","type":1,"pageTitle":"Scaling the RxServer","url":"/rx-server-scaling.html#vertical-scaling","content":" Vertical Scaling aka "scaling up" has the goal to get more power out of a single server by utilizing more of the servers compute. Vertical scaling should be the first step when you decide it is time to scale. ","version":"Next","tagName":"h2"},{"title":"Run multiple JavaScript processes​","type":1,"pageTitle":"Scaling the RxServer","url":"/rx-server-scaling.html#run-multiple-javascript-processes","content":" To utilize more compute power of your server, the first step is to scale vertically by running the RxDB server on multiple processes in parallel. RxDB itself is already build to support multiInstance-usage on the client, like when the user has opened multiple browser tabs at once. The same method works also on the server side in Node.js. You can spawn multiple JavaScript processes that use the same RxDatabase and the instances will automatically communicate with each other and distribute their data and events with the BroadcastChannel. By default the multiInstance param is set to true when calling createRxDatabase(), so you do not have to change anything. To make all processes accessible through the same endpoint, you can put a load-balancer like nginx in front of them. ","version":"Next","tagName":"h3"},{"title":"Using workers to split up the load​","type":1,"pageTitle":"Scaling the RxServer","url":"/rx-server-scaling.html#using-workers-to-split-up-the-load","content":" Another way to increases the server capacity is to put the storage into a Worker thread so that the "main" thread with the webserver can handle more requests. This might be easier to set up compared to using multiple JavaScript processes and a load balancer. ","version":"Next","tagName":"h3"},{"title":"Use an in-memory storage at the user facing level​","type":1,"pageTitle":"Scaling the RxServer","url":"/rx-server-scaling.html#use-an-in-memory-storage-at-the-user-facing-level","content":" Another way to serve more requests to your end users, is to use an in-memory storage that has the best read- and write performance. It outperforms persistent storages by a factor of 10x. So instead of directly serving requests from the persistence layer, you add an in-memory layer on top of that. You could either do a replication from your memory database to the persistent one, or you use the memory mapped storage which has this build in. import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; import { replicateRxCollection } from 'rxdb/plugins/replication'; import { getRxStorageFilesystemNode } from 'rxdb-premium/plugins/storage-filesystem-node'; import { getMemoryMappedRxStorage } from 'rxdb-premium/plugins/storage-memory-mapped'; const myRxDatabase = await createRxDatabase({ name: 'mydb', storage: getMemoryMappedRxStorage({ storage: getRxStorageFilesystemNode({ basePath: path.join(__dirname, 'my-database-folder') }) }) }); await myDatabase.addCollections({/* ... */}); const myServer = await startRxServer({ database: myRxDatabase, port: 443 }); But notice that you have to check your persistence requirements. When a write happens to the memory layer and the server crashes while it has not persisted, in rare cases the write operation might get lost. You can remove that risk by setting awaitWritePersistence: true on the memory mapped storage settings. ","version":"Next","tagName":"h3"},{"title":"Horizontal Scaling​","type":1,"pageTitle":"Scaling the RxServer","url":"/rx-server-scaling.html#horizontal-scaling","content":" To scale the RxDB Server above a single physical hardware unit, there are different solutions where the decision depends on the exact use case. ","version":"Next","tagName":"h2"},{"title":"Single Datastore with multiple branches​","type":1,"pageTitle":"Scaling the RxServer","url":"/rx-server-scaling.html#single-datastore-with-multiple-branches","content":" The most common way to use multiple servers with RxDB is to split up the server into a tree with a root "datastore" and multiple "branches". The datastore contains the persisted data and only servers as a replication endpoint for the branches. The branches themself will replicate data to and from the datastore and server requests to the end users. This is mostly useful on read-heavy applications because reads will directly run on the branches without ever reaching the main datastore and you can always add more branches to scale up. Even adding additional layers of "datastores" is possible so the tree can grow (or shrink) with the demand. ","version":"Next","tagName":"h3"},{"title":"Moving the branches to \"the edge\"​","type":1,"pageTitle":"Scaling the RxServer","url":"/rx-server-scaling.html#moving-the-branches-to-the-edge","content":" Instead of running the "branches" of the tree on the same physical location as the datastore, it often makes sense to move the branches into a datacenter near the end users. Because the RxDB replication algorithm is made to work with slow and even partially offline users, using it for physically separated servers will work the same way. Latency is not that important because writes and reads will not decrease performance by blocking each other and the replication can run in the background without blocking other servers during transaction. ","version":"Next","tagName":"h3"},{"title":"Replicate Databases for Microservices​","type":1,"pageTitle":"Scaling the RxServer","url":"/rx-server-scaling.html#replicate-databases-for-microservices","content":" If your application is build with a microservice architecture and your microservices are also build in Node.js, you can scale the database horizontally by moving the database into the microservices and use the RxDB replication to do a realtime sync between the microservices and a main "datastore" server. The "datastore" server would then only handle the replication requests or do some additional things like logging or backups. The compute for reads and writes will then mainly be done on the microservices themself. This simplifies setting up more and more microservices without decreasing the performance of the whole system. ","version":"Next","tagName":"h3"},{"title":"Use a self-scaling RxStorage​","type":1,"pageTitle":"Scaling the RxServer","url":"/rx-server-scaling.html#use-a-self-scaling-rxstorage","content":" An alternative to scaling up the RxDB servers themself, you can also switch to a RxStorage which scales up internally. For example the FoundationDB storage or MongoDB can work on top of a cluster that can increase load by adding more servers to itself. With that you can always add more Node.js RxDB processes that connect to the same cluster and server requests from it. ","version":"Next","tagName":"h3"},{"title":"RxDB Server","type":0,"sectionRef":"#","url":"/rx-server.html","content":"","keywords":"","version":"Next"},{"title":"Starting a RxServer​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#starting-a-rxserver","content":" To create an RxServer, you have to install the rxdb-server package with npm install rxdb-server --save and then you can import the createRxServer() function and create a server on a given RxDatabase and adapter. After adding the endpoints to the server, do not forget to call myServer.start() to start the actually http-server. import { createRxServer } from 'rxdb-server/plugins/server'; /** * We use the express adapter which is the one that comes with RxDB core * Make sure you have express installed in the correct version! * @see https://github.com/pubkey/rxdb-server/blob/master/package.json */ import { RxServerAdapterExpress } from 'rxdb-server/plugins/adapter-express'; const myServer = await createRxServer({ database: myRxDatabase, adapter: RxServerAdapterExpress, port: 443 }); // add endpoints here (see below) // after adding the endpoints, start the server await myServer.start(); ","version":"Next","tagName":"h2"},{"title":"Using RxServer with Fastify​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#using-rxserver-with-fastify","content":" There is also a RxDB Premium 👑 adapter to use the RxServer with Fastify instead of express. Fastify has shown to have better performance and in general is more modern. import { createRxServer } from 'rxdb-server/plugins/server'; import { RxServerAdapterFastify } from 'rxdb-premium/plugins/server-adapter-fastify'; const myServer = await createRxServer({ database: myRxDatabase, adapter: RxServerAdapterFastify, port: 443 }); await myServer.start(); ","version":"Next","tagName":"h3"},{"title":"Using RxServer with Koa​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#using-rxserver-with-koa","content":" There is also a RxDB Premium 👑 adapter to use the RxServer with Koa instead of express. Koa has shown to have better performance compared to express. import { createRxServer } from 'rxdb-server/plugins/server'; import { RxServerAdapterKoa } from 'rxdb-premium/plugins/server-adapter-koa'; const myServer = await createRxServer({ database: myRxDatabase, adapter: RxServerAdapterKoa, port: 443 }); await myServer.start(); ","version":"Next","tagName":"h3"},{"title":"RxServer Endpoints​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#rxserver-endpoints","content":" On top of the RxServer you can add different types of endpoints. An endpoint is always connected to exactly one RxCollection and it only serves data from that single collection. For now there are only two endpoints implemented, the replication endpoint and the REST endpoint. Others will be added in the future. An endpoint is added to the server by calling the add endpoint method like myRxServer.addReplicationEndpoint(). Each needs a different name string as input which will define the resulting endpoint url. The endpoint urls is a combination of the given name and schema version of the collection, like /my-endpoint/0. const myEndpoint = server.addReplicationEndpoint({ name: 'my-endpoint', collection: myServerCollection }); console.log(myEndpoint.urlPath) // > 'my-endpoint/0' Notice that it is not required that the server side schema version is equal to the client side schema version. You might want to change server schemas more often and then only do a migration on the server, not on the clients. ","version":"Next","tagName":"h2"},{"title":"Replication Endpoint​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#replication-endpoint","content":" The replication endpoint allows clients that connect to it to replicate data with the server via the RxDB Sync Engine. There is also the Replication Server plugin that is used on the client side to connect to the endpoint. The endpoint is added to the server with the addReplicationEndpoint() method. It requires a specific collection and the endpoint will only provided replication for documents inside of that collection. // > server.ts const endpoint = server.addReplicationEndpoint({ name: 'my-endpoint', collection: myServerCollection }); Then you can start the Server Replication on the client: // > client.ts const replicationState = await replicateServer({ collection: usersCollection, replicationIdentifier: 'my-server-replication', url: 'http://localhost:80/my-endpoint/0', push: {}, pull: {} }); ","version":"Next","tagName":"h2"},{"title":"REST endpoint​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#rest-endpoint","content":" The REST endpoint exposes various methods to access the data from the RxServer with non-RxDB tools via plain HTTP operations. You can use it to connect apps that are programmed in different programming languages than JavaScript or to access data from other third party tools. Creating a REST endpoint on a RxServer: const endpoint = await server.addRestEndpoint({ name: 'my-endpoint', collection: myServerCollection }); // plain http request with fetch const request = await fetch('http://localhost:80/' + endpoint.urlPath + '/query', { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify({ selector: {} }) }); const response = await request.json(); There is also the client-rest plugin that provides type-save interactions with the REST endpoint: // using the client (optional) import { createRestClient } from 'rxdb-server/plugins/client-rest'; const client = createRestClient('http://localhost:80/' + endpoint.urlPath, {/* headers */}); const response = await client.query({ selector: {} }); The REST endpoint exposes the following paths: query [POST]: Fetch the results of a NoSQL query.query/observe [GET]: Observe a query's results via Server Send Events.get [POST]: Fetch multiple documents by their primary key.set [POST]: Write multiple documents at once.delete [POST]: Delete multiple documents by their primary key. ","version":"Next","tagName":"h2"},{"title":"CORS​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#cors","content":" When creating a server or adding endpoints, you can specify a CORS string. Endpoint cors always overwrite server cors. The default is the wildcard * which allows all requests. const myServer = await startRxServer({ database: myRxDatabase, cors: 'http://example.com' port: 443 }); const endpoint = await server.addReplicationEndpoint({ name: 'my-endpoint', collection: myServerCollection, cors: 'http://example.com' }); ","version":"Next","tagName":"h2"},{"title":"Auth handler​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#auth-handler","content":" To authenticate users and to make user-specific data available on server requests, an authHandler must be provided that parses the headers and returns the actual auth data that is used to authenticate the client and in the queryModifier and changeValidator. An auth handler gets the given headers object as input and returns the auth data in the format { data: {}, validUntil: 1706579817126}. The data field can contain any data that can be used afterwards in the queryModifier and changeValidator. The validUntil field contains the unix timestamp in milliseconds at which the authentication is no longer valid and the client will get disconnected. For example your authHandler could get the Authorization header and parse the JSON web token to identify the user and store the user id in the data field for later use. ","version":"Next","tagName":"h2"},{"title":"Query modifier​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#query-modifier","content":" The query modifier is a JavaScript function that is used to restrict which documents a client can fetch or replicate from the server. It gets the auth data and the actual NoSQL query as input parameter and returns a modified NoSQL query that is then used internally by the server. You can pass a different query modifier to each endpoint so that you can have different endpoints for different use cases on the same server. For example you could use a query modifier that get the userId from the auth data and then restricts the query to only return documents that have the same userId set. function myQueryModifier(authData, query) { query.selector.userId = { $eq: authData.data.userid }; return query; } const endpoint = await server.addReplicationEndpoint({ name: 'my-endpoint', collection: myServerCollection, queryModifier: myQueryModifier }); The RxServer will use the queryModifier at many places internally to determine which queries to run or if a document is allowed to be seen/edited by a client. note For performance reasons the queryModifier and changeValidatorMUST NOT be async and return a promise. If you need async data to run them, you should gather that data in the RxServerAuthHandler and store it in the auth data to access it later. ","version":"Next","tagName":"h2"},{"title":"Change validator​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#change-validator","content":" The change validator is a JavaScript function that is used to restrict which document writes are allowed to be done by a client. For example you could restrict clients to only change specific document fields or to not do any document writes at all. It can also be used to validate change document data before storing it at the server. In this example we restrict clients from doing inserts and only allow updates. For that we check if the change contains an assumedMasterState property and return false to block the write. function myChangeValidator(authData, change) { if(change.assumedMasterState) { return false; } else { return true; } } const endpoint = await server.addReplicationEndpoint({ name: 'my-endpoint', collection: myServerCollection, changeValidator: myChangeValidator }); ","version":"Next","tagName":"h2"},{"title":"Server-only indexes​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#server-only-indexes","content":" Normal RxDB schema indexes get the _deleted field prepended because all RxQueries automatically only search for documents with _deleted=false. When you use RxDB on a server, this might not be optimal because there can be the need to query for documents where the value of _deleted does not matter. Mostly this is required in the pull.stream$ of a replication when a queryModifier is used to add an additional field to the query. To set indexes without _deleted, you can use the internalIndexes field of the schema like the following: { "version": 0, "primaryKey": "id", "type": "object", "properties": { "id": { "type": "string", "maxLength": 100 }, "name": { "type": "string", "maxLength": 100 } }, "internalIndexes": [ ["name", "id"] ] } note Indexes come with a performance burden. You should only use the indexes you need and make sure you do not accidentally set the internalIndexes in your client side RxCollections. ","version":"Next","tagName":"h2"},{"title":"Server-only fields​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#server-only-fields","content":" All endpoints can be created with the serverOnlyFields set which defines some fields to only exist on the server, not on the clients. Clients will not see that fields and cannot do writes where one of the serverOnlyFields is set. Notice that when you use serverOnlyFields you likely need to have a different schema on the server than the schema that is used on the clients. const endpoint = await server.addReplicationEndpoint({ name: 'my-endpoint', collection: col, // here the field 'my-secretss' is defined to be server-only serverOnlyFields: ['my-secrets'] }); note For performance reasons, only top-level fields can be used as serverOnlyFields. Otherwise the server would have to deep-clone all document data which is too expensive. ","version":"Next","tagName":"h2"},{"title":"Readonly fields​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#readonly-fields","content":" When you have fields that should only be modified by the server, but not by the client, you can ensure that by comparing the fields value in the changeValidator. const myChangeValidator = function(authData, change){ if(change.newDocumentState.myReadonlyField !== change.assumedMasterState.myReadonlyField){ throw new Error('myReadonlyField is readonly'); } } ","version":"Next","tagName":"h2"},{"title":"$regex queries not allowed​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#regex-queries-not-allowed","content":" $regex queries are not allowed to run at the server to prevent ReDos Attacks. ","version":"Next","tagName":"h2"},{"title":"Conflict handling​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#conflict-handling","content":" To detect and handle conflicts, the conflict handler from the endpoints RxCollection is used. ","version":"Next","tagName":"h2"},{"title":"FAQ​","type":1,"pageTitle":"RxDB Server","url":"/rx-server.html#faq","content":" Why are the server plugins in a different github repo and npm package? The RxServer and its other plugins are in a different github repository because: It has too many dependencies that you do not want to install if you only use RxDB at the client side It has a different license (SSPL) to prevent large cloud vendors from "stealing" the revenue, similar to MongoDB's license. Why can't endpoints be added dynamically? After RxServer.start() is called, you can no longer add endpoints. This is because many of the supported server libraries do not allow dynamic routing for performance and security reasons. ","version":"Next","tagName":"h2"},{"title":"RxState - Reactive Persistent State with RxDB","type":0,"sectionRef":"#","url":"/rx-state.html","content":"","keywords":"","version":"Next"},{"title":"Creating a RxState​","type":1,"pageTitle":"RxState - Reactive Persistent State with RxDB","url":"/rx-state.html#creating-a-rxstate","content":" A RxState instance is created on top of a RxDatabase. The state will automatically be persisted with the storage that was used when setting up the RxDatabase. To use it you first have to import the RxDBStatePlugin and add it to RxDB with addRxPlugin(). To create a state call the addState() method on the database instance. Calling addState multiple times will automatically de-duplicated and only create a single RxState object. import { createRxDatabase, addRxPlugin } from 'rxdb'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; // first add the RxState plugin to RxDB import { RxDBStatePlugin } from 'rxdb/plugins/state'; addRxPlugin(RxDBStatePlugin); const database = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage(), }); // create a state instance const myState = await database.addState(); // you can also create states with a given namespace const myChildState = await database.addState('myNamepsace'); ","version":"Next","tagName":"h2"},{"title":"Writing data and Persistence​","type":1,"pageTitle":"RxState - Reactive Persistent State with RxDB","url":"/rx-state.html#writing-data-and-persistence","content":" Writing data to the state happen by a so called modifier. It is a simple JavaScript function that gets the current value as input and returns the new, modified value. For example to increase the value of myField by one, you would use a modifier that increases the current value: // initially set value to zero await myState.set('myField', v => 0); // increase value by one await myState.set('myField', v => v + 1); // update value to be 42 await myState.set('myField', v => 42); The modifier is used instead of a direct assignment to ensure correct behavior when other JavaScript realms write to the state at the same time, like other browser tabs or webworkers. On conflicts, the modifier will just be run again to ensure deterministic and correct behavior. Therefore mutation is async, you have to await the call to the set function when you care about the moment when the change actually happened. ","version":"Next","tagName":"h2"},{"title":"Get State Data​","type":1,"pageTitle":"RxState - Reactive Persistent State with RxDB","url":"/rx-state.html#get-state-data","content":" The state stored inside of a RxState instance can be seen as a big single JSON object that contains all data. You can fetch the whole object or partially get a single properties or nested ones. Fetching data can either happen with the .get() method or by accessing the field directly like myRxState.myField. // get root state data const val = myState.get(); // get single property const val = myState.get('myField'); const val = myState.myField; // get nested property const val = myState.get('myField.childfield'); const val = myState.myField.childfield; // get nested array property const val = myState.get('myArrayField[0].foobar'); const val = myState.myArrayField[0].foobar; ","version":"Next","tagName":"h2"},{"title":"Observability​","type":1,"pageTitle":"RxState - Reactive Persistent State with RxDB","url":"/rx-state.html#observability","content":" Instead of fetching the state once, you can also observe the state with either rxjs observables or custom reactivity handlers like signals or hooks. Rxjs observables can be created by either using the .get$() method or by accessing the top level property suffixed with a dollar sign like myState.myField$. const observable = myState.get$('myField'); const observable = myState.myField$; // then you can subscribe to that observable observable.subscribe(newValue => { // update the UI }); Subscription works across multiple JavaScript realms like browser tabs or Webworkers. ","version":"Next","tagName":"h2"},{"title":"RxState with signals and hooks​","type":1,"pageTitle":"RxState - Reactive Persistent State with RxDB","url":"/rx-state.html#rxstate-with-signals-and-hooks","content":" With the double-dollar sign you can also access custom reactivity instances like signals or hooks. These are easier to use compared to rxjs, depending on which JavaScript framework you are using. For example in angular to use signals, you would first add a reactivity factory to your database and then access the signals of the RxState: import { RxReactivityFactory, createRxDatabase } from 'rxdb/plugins/core'; import { toSignal } from '@angular/core/rxjs-interop'; const reactivityFactory: RxReactivityFactory<ReactivityType> = { fromObservable(obs, initialValue) { return toSignal(obs, { initialValue }); } }; const database = await createRxDatabase({ name: 'mydb', storage: getRxStorageLocalstorage(), reactivity: reactivityFactory }); const myState = await database.addState(); const mySignal = myState.get$$('myField'); const mySignal = myState.myField$$; ","version":"Next","tagName":"h2"},{"title":"Cleanup RxState operations​","type":1,"pageTitle":"RxState - Reactive Persistent State with RxDB","url":"/rx-state.html#cleanup-rxstate-operations","content":" For faster writes, changes to the state are only written as list of operations to disc. After some time you might have too many operations written which would delay the initial state creation. To automatically merge the state operations into a single operation and clear the old operations, you should add the Cleanup Plugin before creating the RxDatabase: import { addRxPlugin } from 'rxdb'; import { RxDBCleanupPlugin } from 'rxdb/plugins/cleanup'; addRxPlugin(RxDBCleanupPlugin); ","version":"Next","tagName":"h2"},{"title":"Correctness over Performance​","type":1,"pageTitle":"RxState - Reactive Persistent State with RxDB","url":"/rx-state.html#correctness-over-performance","content":" RxState is optimized for correctness, not for performance. Compared to other state libraries, RxState directly persists data to storage and ensures write conflicts are handled properly. Other state libraries are handles mainly in-memory and lazily persist to disc without caring about conflicts or multiple browser tabs which can cause problems and hard to reproduce bugs. RxState still uses RxDB which has a range of great performing storages so the write speed is more than sufficient. Also to further improve write performance you can use more RxState instances (with an different namespace) to split writes across multiple storage instances. Reads happen directly in-memory which makes RxState read performance comparable to other state libraries. ","version":"Next","tagName":"h2"},{"title":"RxState Replication​","type":1,"pageTitle":"RxState - Reactive Persistent State with RxDB","url":"/rx-state.html#rxstate-replication","content":" Because the state data is stored inside of an internal RxCollection you can easily use the RxDB Replication to sync data between users or devices of the same user. For example with the P2P WebRTC replication you can start the replication on the collection and automatically sync the RxState operations between users directly: import { replicateWebRTC, getConnectionHandlerSimplePeer } from 'rxdb/plugins/replication-webrtc'; const database = await createRxDatabase({ name: 'heroesdb', storage: getRxStorageLocalstorage(), }); const myState = await database.addState(); const replicationPool = await replicateWebRTC( { collection: myState.collection, topic: 'my-state-replication-pool', connectionHandlerCreator: getConnectionHandlerSimplePeer({}), pull: {}, push: {} } ); ","version":"Next","tagName":"h2"},{"title":"RxDB Database on top of Deno Key Value Store","type":0,"sectionRef":"#","url":"/rx-storage-denokv.html","content":"","keywords":"","version":"Next"},{"title":"What is DenoKV​","type":1,"pageTitle":"RxDB Database on top of Deno Key Value Store","url":"/rx-storage-denokv.html#what-is-denokv","content":" DenoKV is a strongly consistent key-value storage, globally replicated for low-latency reads across 35 worldwide regions via Deno Deploy. When you release your Deno application on Deno Deploy, it will start a instance on each of the 35 worldwide regions. This edge deployment guarantees minimal latency when serving requests to end users devices around the world. DenoKV is a shared storage which shares its state across all instances. But, because DenoKV is "only" a Key-Value storage, it only supports basic CRUD operations on datasets and indexes. Complex features like queries, encryption, compression or client-server replication, are missing. Using RxDB on top of DenoKV fills this gap and makes it easy to build realtime offline-first application on top of Deno backend. ","version":"Next","tagName":"h2"},{"title":"Use cases​","type":1,"pageTitle":"RxDB Database on top of Deno Key Value Store","url":"/rx-storage-denokv.html#use-cases","content":" Using RxDB-DenoKV instead of plain DenoKV, can have a wide range of benefits depending on your use case. Reduce vendor lock-in: RxDB has a swappable storage layer which allows you to swap out the underlying storage of your database. If you ever decide to move away from DenoDeploy or Deno at all, you do not have to refactor your whole application and instead just swap the storage plugin. For example if you decide migrate to Node.js, you can use the FoundationDB RxStorage and store your data there. DenoKV is also implemented on top of FoundationDB so you can get similar performance. Alternatively RxDB supports a wide range of storage plugins you can decide from. Add reactiveness: DenoKV is a plain request-response datastore. While it supports observation of single rows by id, it does not allow to observe row-ranges or events. This makes it hard to impossible to build realtime applications with it because polling would be the only way to watch ranges of key-value pairs. With RxDB on top of DenoKV, changes to the database are shared between DenoDeploy instances so when you observe a query you can be sure that it is always up to date, no matter which instance has changed the document. Internally RxDB uses the Deno BroadcastChannel API to share events between instances. Reuse Client and Server Code: When you use RxDB on the server and on the client side, many parts of your code can be reused on both sides which decreases development time significantly. Replicate from DenoKV to a local RxDB state: Instead of running all operations against the global DenoKV, you can run a realtime-replication between a DenoKV-RxDatabase and a locally stored dataset or maybe even an in-memory stored one. This improves query performance and can reduce your Deno Deploy cloud costs because less operations run against the DenoKV, they only locally instead. Replicate with other backends: The RxDB Sync Engine is pretty simple and allows you to easily build a replication with any backend architecture. For example if you already have your data stored in a self-hosted MySQL server, you can use RxDB to do a realtime replication of that data into a DenoKV RxDatabase instance. RxDB also has many plugins for replication with backend/protocols like GraphQL, Websocket, CouchDB, WebRTC, Firestore and NATS. ","version":"Next","tagName":"h2"},{"title":"Using the DenoKV RxStorage​","type":1,"pageTitle":"RxDB Database on top of Deno Key Value Store","url":"/rx-storage-denokv.html#using-the-denokv-rxstorage","content":" To use the DenoKV RxStorage with RxDB, you import the getRxStorageDenoKV function from the plugin and set it as storage when calling createRxDatabase import { createRxDatabase } from 'rxdb'; import { getRxStorageDenoKV } from 'rxdb/plugins/storage-denokv'; const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: getRxStorageDenoKV({ /** * Consistency level, either 'strong' or 'eventual' * (Optional) default='strong' */ consistencyLevel: 'strong', /** * Path which is used in the first argument of Deno.openKv(settings.openKvPath) * (Optional) default='' */ openKvPath: './foobar', /** * Some operations have to run in batches, * you can test different batch sizes to improve performance. * (Optional) default=100 */ batchSize: number }) }); On top of that RxDatabase you can then create your collections and run operations. Follow the quickstart to learn more about how to use RxDB. ","version":"Next","tagName":"h2"},{"title":"Using non-DenoKV storages in Deno​","type":1,"pageTitle":"RxDB Database on top of Deno Key Value Store","url":"/rx-storage-denokv.html#using-non-denokv-storages-in-deno","content":" When you use other storages than the DenoKV storage inside of a Deno app, make sure you set multiInstance: false when creating the database. Also you should only run one process per Deno-Deploy instance. This ensures your events are not mixed up by the BroadcastChannel across instances which would lead to wrong behavior. // DenoKV based database const db = await createRxDatabase({ name: 'denokvdatabase', storage: getRxStorageDenoKV(), /** * Use multiInstance: true so that the Deno Broadcast Channel * emits event across DenoDeploy instances * (true is also the default, so you can skip this setting) */ multiInstance: true }); // Non-DenoKV based database const db = await createRxDatabase({ name: 'denokvdatabase', storage: getRxStorageFilesystemNode(), /** * Use multiInstance: false so that it does not share events * across instances because the stored data is anyway not shared * between them. */ multiInstance: false }); ","version":"Next","tagName":"h2"},{"title":"Filesystem Node RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-filesystem-node.html","content":"","keywords":"","version":"Next"},{"title":"Pros​","type":1,"pageTitle":"Filesystem Node RxStorage","url":"/rx-storage-filesystem-node.html#pros","content":" Easier setup compared to SQLiteFast ","version":"Next","tagName":"h3"},{"title":"Cons​","type":1,"pageTitle":"Filesystem Node RxStorage","url":"/rx-storage-filesystem-node.html#cons","content":" It is part of the RxDB Premium 👑 plugin that must be purchased. ","version":"Next","tagName":"h3"},{"title":"Usage​","type":1,"pageTitle":"Filesystem Node RxStorage","url":"/rx-storage-filesystem-node.html#usage","content":" import { createRxDatabase } from 'rxdb'; import { getRxStorageFilesystemNode } from 'rxdb-premium/plugins/storage-filesystem-node'; const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: getRxStorageFilesystemNode({ basePath: path.join(__dirname, 'my-database-folder'), /** * Set inWorker=true if you use this RxStorage * together with the WebWorker plugin. */ inWorker: false }) }); /* ... */ ","version":"Next","tagName":"h2"},{"title":"RxDB Database on top of FoundationDB","type":0,"sectionRef":"#","url":"/rx-storage-foundationdb.html","content":"","keywords":"","version":"Next"},{"title":"Features of RxDB+FoundationDB​","type":1,"pageTitle":"RxDB Database on top of FoundationDB","url":"/rx-storage-foundationdb.html#features-of-rxdbfoundationdb","content":" Using RxDB on top of FoundationDB, gives you many benefits compare to using the plain FoundationDB API: Indexes: In RxDB with a FoundationDB storage layer, indexes are used to optimize query performance, allowing for fast and efficient data retrieval even in large datasets. You can define single and compound indexes with the RxDB schema.Schema Based Data Model: Utilizing a jsonschema based data model, the system offers a highly structured and versatile approach to organizing and validating data, ensuring consistency and clarity in database interactions.Complex Queries: The system supports complex NoSQL queries, allowing for advanced data manipulation and retrieval, tailored to specific needs and intricate data relationships. For example you can do $regex or $or queries which is hardy possible with the plain key-value access of FoundationDB.Observable Queries & Documents: RxDB's observable queries and documents feature ensures real-time updates and synchronization, providing dynamic and responsive data interactions in applications.Compression: RxDB employs data compression techniques to reduce storage requirements and enhance transmission efficiency, making it more cost-effective and faster, especially for large volumes of data. You can compress the NoSQL document data, but also the binary attachments data.Attachments: RxDB supports the storage and management of attachments which allowing for the seamless inclusion of binary data like images or documents alongside structured data within the database. ","version":"Next","tagName":"h2"},{"title":"Installation​","type":1,"pageTitle":"RxDB Database on top of FoundationDB","url":"/rx-storage-foundationdb.html#installation","content":" Install the FoundationDB client cli which is used to communicate with the FoundationDB cluster.Install the FoundationDB node bindings npm module via npm install foundationdb. This will install v2.x.x, which is only compatible with FoundationDB server and client v7.3.x (which is the only version currently maintained by the FoundationDB team). If you need to use an older version (e.g. 7.1.x or 6.3.x), you should run npm install foundationdb@1.1.4 (though this might only work with v6.3.x).Due to an outstanding bug in node foundationdb, you will need to specify an apiVersion of 720 even though you are using 730. When this PR is merged, you will be able to use 730. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"RxDB Database on top of FoundationDB","url":"/rx-storage-foundationdb.html#usage","content":" import { createRxDatabase } from 'rxdb'; import { getRxStorageFoundationDB } from 'rxdb/plugins/storage-foundationdb'; const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageFoundationDB({ /** * Version of the API of the FoundationDB cluster.. * FoundationDB is backwards compatible across a wide range of versions, * so you have to specify the api version. * If in doubt, set it to 720. */ apiVersion: 720, /** * Path to the FoundationDB cluster file. * (optional) * If in doubt, leave this empty to use the default location. */ clusterFile: '/path/to/fdb.cluster', /** * Amount of documents to be fetched in batch requests. * You can change this to improve performance depending on * your database access patterns. * (optional) * [default=50] */ batchSize: 50 }) }); ","version":"Next","tagName":"h2"},{"title":"Multi Instance​","type":1,"pageTitle":"RxDB Database on top of FoundationDB","url":"/rx-storage-foundationdb.html#multi-instance","content":" Because FoundationDB does not offer a changestream, it is not possible to use the same cluster from more than one Node.js process at the same time. For example you cannot spin up multiple servers with RxDB databases that all use the same cluster. There might be workarounds to create something like a FoundationDB changestream and you can make a Pull Request if you need that feature. ","version":"Next","tagName":"h2"},{"title":"IndexedDB RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-indexeddb.html","content":"","keywords":"","version":"Next"},{"title":"IndexedDB performance comparison​","type":1,"pageTitle":"IndexedDB RxStorage","url":"/rx-storage-indexeddb.html#indexeddb-performance-comparison","content":" Here is some performance comparison with other storages. Compared to the non-memory storages like OPFS and WASM SQLite. IndexedDB has the smallest build size and fastest write speed. Only OPFS is faster on queries over big datasets. See performance comparison page for a comparison with all storages. ","version":"Next","tagName":"h2"},{"title":"Using the IndexedDB RxStorage​","type":1,"pageTitle":"IndexedDB RxStorage","url":"/rx-storage-indexeddb.html#using-the-indexeddb-rxstorage","content":" To use the indexedDB storage you import it from the RxDB Premium 👑 npm module and use getRxStorageIndexedDB() when creating the RxDatabase. import { createRxDatabase } from 'rxdb'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageIndexedDB({ /** * For better performance, queries run with a batched cursor. * You can change the batchSize to optimize the query time * for specific queries. * You should only change this value when you are also doing performance measurements. * [default=300] */ batchSize: 300 }) }); ","version":"Next","tagName":"h2"},{"title":"Overwrite/Polyfill the native IndexedDB​","type":1,"pageTitle":"IndexedDB RxStorage","url":"/rx-storage-indexeddb.html#overwritepolyfill-the-native-indexeddb","content":" Node.js has no IndexedDB API. To still run the IndexedDB RxStorage in Node.js, for example to run unit tests, you have to polyfill it. You can do that by using the fake-indexeddb module and pass it to the getRxStorageIndexedDB() function. import { createRxDatabase } from 'rxdb'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; //> npm install fake-indexeddb --save const fakeIndexedDB = require('fake-indexeddb'); const fakeIDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange'); const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageIndexedDB({ indexedDB: fakeIndexedDB, IDBKeyRange: fakeIDBKeyRange }) }); ","version":"Next","tagName":"h2"},{"title":"Storage Buckets​","type":1,"pageTitle":"IndexedDB RxStorage","url":"/rx-storage-indexeddb.html#storage-buckets","content":" The Storage Buckets API provides a way for sites to organize locally stored data into groupings called "storage buckets". This allows the user agent or sites to manage and delete buckets independently rather than applying the same treatment to all the data from a single origin. Read More To use different storage buckets with the RxDB IndexedDB Storage, you can use a function instead of a plain object when providing the indexedDB attribute: import { createRxDatabase } from 'rxdb'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageIndexedDB({ indexedDB: async(params) => { const myStorageBucket = await navigator.storageBuckets.open('myApp-' + params.databaseName); return myStorageBucket.indexedDB; }, IDBKeyRange }) }); ","version":"Next","tagName":"h2"},{"title":"Limitations of the IndexedDB RxStorage​","type":1,"pageTitle":"IndexedDB RxStorage","url":"/rx-storage-indexeddb.html#limitations-of-the-indexeddb-rxstorage","content":" It is part of the RxDB Premium 👑 plugin that must be purchased. If you just need a storage that works in the browser and you do not have to care about performance, you can use the LocalStorage storage instead.The IndexedDB storage requires support for IndexedDB v2, it does not work on Internet Explorer. ","version":"Next","tagName":"h2"},{"title":"RxStorage Dexie.js","type":0,"sectionRef":"#","url":"/rx-storage-dexie.html","content":"","keywords":"","version":"Next"},{"title":"Dexie.js vs IndexedDB Storage​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#dexiejs-vs-indexeddb-storage","content":" While Dexie.js RxStorage can be used for free, most professional projects should switch to our premium IndexedDB RxStorage 👑 in production: It is faster and reduces build size by up to 36%.It has a way better performance on reads and writes.It stores attachments data as binary instead of base64 which reduces used space by 33%.It does not use a Batched Cursor or custom indexes which makes queries slower compared to the IndexedDB RxStorage.It supports non-required indexes which is not possible with Dexie.js.It runs in a WAL-like mode (similar to SQLite) for faster writes and improved responsiveness.It support the Storage Buckets API ","version":"Next","tagName":"h2"},{"title":"How to use Dexie.js as a Storage for RxDB​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#how-to-use-dexiejs-as-a-storage-for-rxdb","content":" 1 Import the Dexie Storage​ import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; 2 Create a Database​ const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageDexie() }); ","version":"Next","tagName":"h2"},{"title":"Overwrite/Polyfill the native IndexedDB API with an in-memory version​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#overwritepolyfill-the-native-indexeddb-api-with-an-in-memory-version","content":" Node.js has no IndexedDB API. To still run the Dexie RxStorage in Node.js, for example to run unit tests, you have to polyfill it. You can do that by using the fake-indexeddb module and pass it to the getRxStorageDexie() function. import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; //> npm install fake-indexeddb --save const fakeIndexedDB = require('fake-indexeddb'); const fakeIDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange'); const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageDexie({ indexedDB: fakeIndexedDB, IDBKeyRange: fakeIDBKeyRange }) }); ","version":"Next","tagName":"h2"},{"title":"Using Dexie Addons​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#using-dexie-addons","content":" Dexie.js has its own plugin system with many plugins for encryption, replication or other use cases. With the Dexie.js RxStorage you can use the same plugins by passing them to the getRxStorageDexie() function. const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageDexie({ addons: [ /* Your Dexie.js plugins */ ] }) }); ","version":"Next","tagName":"h2"},{"title":"Sync Dexie.js with your Backend in RxDB​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#sync-dexiejs-with-your-backend-in-rxdb","content":" Having your local data in sync with a remote backend is a key feature of RxDB. Here are two approaches to achieve this when using the Dexie.js RxStorage: Dexie Cloud provides a managed solution: For quick setups, letting you rely on its Cloud backend and conflict resolution.RxDB's replication: Offers full control over your backend, data flow, and conflict handling. Choose the approach that best suits your needs - whether you want to get started quickly with Dexie Cloud or require the adaptability and autonomy of RxDB's native replication. ","version":"Next","tagName":"h2"},{"title":"A. Use Dexie Cloud Sync​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#a-use-dexie-cloud-sync","content":" Dexie Cloud is an official SaaS solution provided by the Dexie team. It offers automatic synchronization, user management, and conflict resolution out of the box. The primary benefits are: Automatic Sync: Dexie Cloud keeps your local IndexedDB in sync with its cloud-based backend.User Authentication: Built-in user management (auth, roles, permissions).Conflict Resolution: Automated resolution logic on the server side. 1 Install the Dexie Cloud Addon​ npm install dexie-cloud-addon 2 Import RxDB and dexie-cloud​ import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; import dexieCloud from 'dexie-cloud-addon'; 3 Create a Dexie based RxStorage with the Cloud Plugin​ const storage = getRxStorageDexie({ addons: [dexieCloud], /* * Whenever a new dexie database instance is created, * this method will be called. */ async onCreate(dexieDatabase, dexieDatabaseName) { await dexieDatabase.cloud.configure({ databaseUrl: "https://<yourdatabase>.dexie.cloud", requireAuth: true // optional }); } }); 4 Create an RxDB Database​ const db = await createRxDatabase({ name: 'mydb', storage }); ","version":"Next","tagName":"h3"},{"title":"B. Use the RxDB Replication​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#b-use-the-rxdb-replication","content":" For full flexibility over your backend or conflict resolution strategy, you can use one of RxDB's many replication plugins like CouchDB Replication Plugin: Replicate with a CouchDB ServerGraphQL Replication Plugin: Sync data with any GraphQL endpoint. Useful when you have a custom schema or you want to utilize GraphQL's powerful query features.Custom Replication with REST APIs: Implement your own replication by building a pull/push handler that communicates with any RESTful backend. Below is an example of replicating an RxDB collection with a CouchDB backend using RxDB's CouchDB replication plugin: 1 Import the RxDB with dexie and the CouchDB plugin​ import { replicateCouchDB } from 'rxdb/plugins/replication-couchdb'; import { getRxStorageDexie } from 'rxdb/plugins/storage-dexie'; import { createRxDatabase } from 'rxdb/plugins/core'; 2 Create an RxDB Database with the Dexie Storage​ const db = await createRxDatabase({ name: 'mydb', storage: getRxStorageDexie() }); 3 Add a Collection​ await db.addCollections({ humans: { schema: { version: 0, type: 'object', primaryKey: 'id', properties: { id: { type: 'string', maxLength: 100 }, name: { type: 'string' }, age: { type: 'number' } }, required: ['id', 'name'] } } }); 4 Sync the Collection with a CouchDB Server​ const replicationState = replicateCouchDB({ replicationIdentifier: 'my-couchdb-replication', collection: db.humans, // The URL to your CouchDB endpoint url: 'http://example.com/db/humans' }); ","version":"Next","tagName":"h3"},{"title":"liveQuery - Realtime Queries​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#livequery---realtime-queries","content":" Dexie.js offers a feature called liveQuery which automatically updates query results as data changes, allowing you to react to these changes in real-time. However, because RxDB intrinsically provides reactive queries, you typically do not need to enable live queries through Dexie. Once you have created your database and collections with RxDB, any query you perform can be observed by subscribing to it, for example via collection.find().$.subscribe(results => { /*... */ }). This means RxDB takes care of listening for changes and automatically emitting new results - ensuring your UI stays in sync with the underlying data without requiring extra plugins or manual polling. ","version":"Next","tagName":"h2"},{"title":"Disabling the non-premium console log​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#disabling-the-non-premium-console-log","content":" We want to be transparent with our community, and you'll notice a console message when using the free Dexie.js based RxStorage implementation. This message serves to inform you about the availability of faster storage solutions within our 👑 Premium Plugins. We understand that this might be a minor inconvenience, and we sincerely apologize for that. However, maintaining and improving RxDB requires substantial resources, and our premium users help us ensure its sustainability. If you find value in RxDB and wish to remove this message, we encourage you to explore our premium storage options, which are optimized for professional use and production environments. Thank you for your understanding and support. If you already have premium access and want to use the Dexie.js RxStorage without the log, you can call the setPremiumFlag() function to disable the log. import { setPremiumFlag } from 'rxdb-premium/plugins/shared'; setPremiumFlag(); ","version":"Next","tagName":"h2"},{"title":"Performance comparison with other RxStorage plugins​","type":1,"pageTitle":"RxStorage Dexie.js","url":"/rx-storage-dexie.html#performance-comparison-with-other-rxstorage-plugins","content":" The performance of the Dexie.js RxStorage is good enough for most use cases but other storages can have way better performance metrics: ","version":"Next","tagName":"h2"},{"title":"RxStorage Localstorage Meta Optimizer","type":0,"sectionRef":"#","url":"/rx-storage-localstorage-meta-optimizer.html","content":"","keywords":"","version":"Next"},{"title":"Usage​","type":1,"pageTitle":"RxStorage Localstorage Meta Optimizer","url":"/rx-storage-localstorage-meta-optimizer.html#usage","content":" The meta optimizer gets wrapped around any other RxStorage. It will than automatically detect if an RxDB internal storage instance is created, and replace that with a localstorage based instance. import { getLocalstorageMetaOptimizerRxStorage } from 'rxdb-premium/plugins/storage-localstorage-meta-optimizer'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; /** * First wrap the original RxStorage with the optimizer. */ const optimizedRxStorage = getLocalstorageMetaOptimizerRxStorage({ /** * Here we use the IndexedDB RxStorage, * it is also possible to use any other RxStorage instead. */ storage: getRxStorageIndexedDB() }); /** * Create the RxDatabase with the wrapped RxStorage. */ const database = await createRxDatabase({ name: 'mydatabase', storage: optimizedRxStorage }); ","version":"Next","tagName":"h2"},{"title":"RxStorage LocalStorage","type":0,"sectionRef":"#","url":"/rx-storage-localstorage.html","content":"","keywords":"","version":"Next"},{"title":"Key Benefits​","type":1,"pageTitle":"RxStorage LocalStorage","url":"/rx-storage-localstorage.html#key-benefits","content":" Simplicity: No complicated configurations or external dependencies - LocalStorage is already built into the browser.Fast for small Datasets: Writing and Reading small sets of data from localStorage is really fast as shown in these benchmarks.Ease of Setup: Just import the plugin, import it, and pass getRxStorageLocalstorage() into createRxDatabase(). That’s it! ","version":"Next","tagName":"h2"},{"title":"Limitations​","type":1,"pageTitle":"RxStorage LocalStorage","url":"/rx-storage-localstorage.html#limitations","content":" While LocalStorage is the easiest way to get started, it does come with some constraints: Limited Storage Capacity: Browsers often limit LocalStorage to around 5 MB per domain, though exact limits vary.Synchronous Access: LocalStorage operations block the main thread. This is usually fine for small amounts of data but can cause performance bottlenecks with heavier use. Despite these limitations, LocalStorage remains a great default option for smaller projects, prototypes, or cases where you need the absolute simplest way to persist data in the browser. ","version":"Next","tagName":"h2"},{"title":"How to use the LocalStorage RxStorage with RxDB​","type":1,"pageTitle":"RxStorage LocalStorage","url":"/rx-storage-localstorage.html#how-to-use-the-localstorage-rxstorage-with-rxdb","content":" 1 Import the Storage​ import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; 2 Create a Database​ const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageLocalstorage() }); 3 Add a Collection​ await db.addCollections({ tasks: { schema: { title: 'tasks schema', version: 0, primaryKey: 'id', type: 'object', properties: { id: { type: 'string' }, title: { type: 'string' }, done: { type: 'boolean' } }, required: ['id', 'title', 'done'] } } }); 4 Insert a document​ await db.tasks.insert({ id: 'task-01', title: 'Get started with RxDB' }); 5 Query documents​ const nonDoneTasks = await db.tasks.find({ selector: { done: { $eq: false } } }).exec(); ","version":"Next","tagName":"h2"},{"title":"Mocking the LocalStorage API for testing in Node.js​","type":1,"pageTitle":"RxStorage LocalStorage","url":"/rx-storage-localstorage.html#mocking-the-localstorage-api-for-testing-in-nodejs","content":" While the localStorage API only exists in browsers, your can the LocalStorage based storage in Node.js by using the mock that comes with RxDB. This is intended to be used in unit tests or other test suites: import { createRxDatabase } from 'rxdb/plugins/core'; import { getRxStorageLocalstorage, getLocalStorageMock } from 'rxdb/plugins/storage-localstorage'; const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageLocalstorage({ localStorage: getLocalStorageMock() }) }); ","version":"Next","tagName":"h2"},{"title":"Memory Synced RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-memory-synced.html","content":"","keywords":"","version":"Next"},{"title":"Pros​","type":1,"pageTitle":"Memory Synced RxStorage","url":"/rx-storage-memory-synced.html#pros","content":" Improves read/write performance because these operations run against the in-memory storage.Decreases initial page load because it load all data in a single bulk request. It even detects if the database is used for the first time and then it does not have to await the creation of the persistent storage. ","version":"Next","tagName":"h2"},{"title":"Cons​","type":1,"pageTitle":"Memory Synced RxStorage","url":"/rx-storage-memory-synced.html#cons","content":" It does not support attachments.When the JavaScript process is killed ungracefully like when the browser crashes or the power of the PC is terminated, it might happen that some memory writes are not persisted to the parent storage. This can be prevented with the awaitWritePersistence flag.This can only be used if all data fits into the memory of the JavaScript process. This is normally not a problem because a browser has much memory these days and plain json document data is not that big.Because it has to await an initial replication from the parent storage into the memory, initial page load time can increase when much data is already stored. This is likely not a problem when you store less than 10k documents.The memory-synced storage itself does not support replication and migration. Instead you have to replicate the underlying parent storage.The memory-synced plugin is part of RxDB Premium 👑. It is not part of the default RxDB module. The memory-synced RxStorage was removed in RxDB version 16 The memory-synced was removed in RxDB version 16. Instead consider using the newer and better memory-mapped RxStorage which has better trade-offs and is easier to configure. ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"Memory Synced RxStorage","url":"/rx-storage-memory-synced.html#usage","content":" import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; import { getMemorySyncedRxStorage } from 'rxdb-premium/plugins/storage-memory-synced'; /** * Here we use the IndexedDB RxStorage as persistence storage. * Any other RxStorage can also be used. */ const parentStorage = getRxStorageIndexedDB(); // wrap the persistent storage with the memory synced one. const storage = getMemorySyncedRxStorage({ storage: parentStorage }); // create the RxDatabase like you would do with any other RxStorage const db = await createRxDatabase({ name: 'myDatabase, storage, }); /** ... **/ ","version":"Next","tagName":"h2"},{"title":"Options​","type":1,"pageTitle":"Memory Synced RxStorage","url":"/rx-storage-memory-synced.html#options","content":" Some options can be provided to fine tune the performance and behavior. import { requestIdlePromise } from 'rxdb'; const storage = getMemorySyncedRxStorage({ storage: parentStorage, /** * Defines how many document * get replicated in a single batch. * [default=50] * * (optional) */ batchSize: 50, /** * By default, the parent storage will be created without indexes for a faster page load. * Indexes are not needed because the queries will anyway run on the memory storage. * You can disable this behavior by setting keepIndexesOnParent to true. * If you use the same parent storage for multiple RxDatabase instances where one is not * a asynced-memory storage, you will get the error: 'schema not equal to existing storage' * if you do not set keepIndexesOnParent to true. * * (optional) */ keepIndexesOnParent: true, /** * If set to true, all write operations will resolve AFTER the writes * have been persisted from the memory to the parentStorage. * This ensures writes are not lost even if the JavaScript process exits * between memory writes and the persistence interval. * default=false */ awaitWritePersistence: true, /** * After a write, await until the return value of this method resolves * before replicating with the master storage. * * By returning requestIdlePromise() we can ensure that the CPU is idle * and no other, more important operation is running. By doing so we can be sure * that the replication does not slow down any rendering of the browser process. * * (optional) */ waitBeforePersist: () => requestIdlePromise(); }); ","version":"Next","tagName":"h2"},{"title":"Replication and Migration with the memory-synced storage​","type":1,"pageTitle":"Memory Synced RxStorage","url":"/rx-storage-memory-synced.html#replication-and-migration-with-the-memory-synced-storage","content":" The memory-synced storage itself does not support replication and migration. Instead you have to replicate the underlying parent storage. For example when you use it on top of an IndexedDB storage, you have to run replication on that storage instead by creating a different RxDatabase. const parentStorage = getRxStorageIndexedDB(); const memorySyncedStorage = getMemorySyncedRxStorage({ storage: parentStorage, keepIndexesOnParent: true }); const databaseName = 'mydata'; /** * Create a parent database with the same name+collections * and use it for replication and migration. * The parent database must be created BEFORE the memory-synced database * to ensure migration has already been run. */ const parentDatabase = await createRxDatabase({ name: databaseName, storage: parentStorage }); await parentDatabase.addCollections(/* ... */); replicateRxCollection({ collection: parentDatabase.myCollection, /* ... */ }); /** * Create an equal memory-synced database with the same name+collections * and use it for writes and queries. */ const memoryDatabase = await createRxDatabase({ name: databaseName, storage: memorySyncedStorage }); await memoryDatabase.addCollections(/* ... */); ","version":"Next","tagName":"h2"},{"title":"Memory RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-memory.html","content":"","keywords":"","version":"Next"},{"title":"Pros​","type":1,"pageTitle":"Memory RxStorage","url":"/rx-storage-memory.html#pros","content":" Really fast. Uses binary search on all operations.Small build size ","version":"Next","tagName":"h3"},{"title":"Cons​","type":1,"pageTitle":"Memory RxStorage","url":"/rx-storage-memory.html#cons","content":" No persistence import { createRxDatabase } from 'rxdb'; import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageMemory() }); ","version":"Next","tagName":"h3"},{"title":"RxStorage LokiJS","type":0,"sectionRef":"#","url":"/rx-storage-lokijs.html","content":"","keywords":"","version":"Next"},{"title":"Pros​","type":1,"pageTitle":"RxStorage LokiJS","url":"/rx-storage-lokijs.html#pros","content":" Queries can run faster because all data is processed in memory.It has a much faster initial load time because it loads all data from IndexedDB in a single request. But this is only true for small datasets. If much data must is stored, the initial load time can be higher than on other RxStorage implementations. ","version":"Next","tagName":"h3"},{"title":"Cons​","type":1,"pageTitle":"RxStorage LokiJS","url":"/rx-storage-lokijs.html#cons","content":" It does not support attachments.Data can be lost when the JavaScript process is killed ungracefully like when the browser crashes or the power of the PC is terminated.All data must fit into the memory.Slow initialisation time when used with multiInstance: true because it has to await the leader election process.Slow initialisation time when really much data is stored inside of the database because it has to parse a big JSON string. ","version":"Next","tagName":"h3"},{"title":"Usage​","type":1,"pageTitle":"RxStorage LokiJS","url":"/rx-storage-lokijs.html#usage","content":" import { createRxDatabase } from 'rxdb'; import { getRxStorageLoki } from 'rxdb/plugins/storage-lokijs'; // in the browser, we want to persist data in IndexedDB, so we use the indexeddb adapter. const LokiIncrementalIndexedDBAdapter = require('lokijs/src/incremental-indexeddb-adapter'); const db = await createRxDatabase({ name: 'exampledb', storage: getRxStorageLoki({ adapter: new LokiIncrementalIndexedDBAdapter(), /* * Do not set lokiJS persistence options like autoload and autosave, * RxDB will pick proper defaults based on the given adapter */ }) }); ","version":"Next","tagName":"h2"},{"title":"Adapters​","type":1,"pageTitle":"RxStorage LokiJS","url":"/rx-storage-lokijs.html#adapters","content":" LokiJS is based on adapters that determine where to store persistent data. For LokiJS there are adapters for IndexedDB, AWS S3, the NodeJS filesystem or NativeScript. Find more about the possible adapters at the LokiJS docs. For react native there is also the loki-async-reference-adapter. ","version":"Next","tagName":"h2"},{"title":"Multi-Tab support​","type":1,"pageTitle":"RxStorage LokiJS","url":"/rx-storage-lokijs.html#multi-tab-support","content":" When you use plain LokiJS, you cannot build an app that can be used in multiple browser tabs. The reason is that LokiJS loads data in bulk and then only regularly persists the in-memory state to disc. When opened in multiple tabs, it would happen that the LokiJS instances overwrite each other and data is lost. With the RxDB LokiJS-plugin, this problem is fixed with the LeaderElection module. Between all open tabs, a leading tab is elected and only in this tab a database is created. All other tabs do not run queries against their own database, but instead call the leading tab to send and retrieve data. When the leading tab is closed, a new leader is elected that reopens the database and processes queries. You can disable this by setting multiInstance: false when creating the RxDatabase. ","version":"Next","tagName":"h2"},{"title":"Autosave and autoload​","type":1,"pageTitle":"RxStorage LokiJS","url":"/rx-storage-lokijs.html#autosave-and-autoload","content":" When using plain LokiJS, you could set the autosave option to true to make sure that LokiJS persists the database state after each write into the persistence adapter. Same goes to autoload which loads the persisted state on database creation. But RxDB knows better when to persist the database state and when to load it, so it has its own autosave logic. This will ensure that running the persistence handler does not affect the performance of more important tasks. Instead RxDB will always wait until the database is idle and then runs the persistence handler. A load of the persisted state is done on database or collection creation and it is ensured that multiple load calls do not run in parallel and interfere with each other or with saveDatabase() calls. ","version":"Next","tagName":"h2"},{"title":"Known problems​","type":1,"pageTitle":"RxStorage LokiJS","url":"/rx-storage-lokijs.html#known-problems","content":" When you bundle the LokiJS Plugin with webpack, you might get the error Cannot find module "fs". This is because LokiJS uses a require('fs') statement that cannot work in the browser. You can fix that by telling webpack to not resolve the fs module with the following block in your webpack config: // in your webpack.config.js { /* ... */ resolve: { fallback: { fs: false } } /* ... */ } // Or if you do not have a webpack.config.js like you do with angular, // you might fix it by setting the browser field in the package.json { /* ... */ "browser": { "fs": false } /* ... */ } ","version":"Next","tagName":"h2"},{"title":"Using the internal LokiJS database​","type":1,"pageTitle":"RxStorage LokiJS","url":"/rx-storage-lokijs.html#using-the-internal-lokijs-database","content":" For custom operations, you can access the internal LokiJS database. This is dangerous because you might do changes that are not compatible with RxDB. Only use this when there is no way to achieve your goals via the RxDB API. const storageInstance = myRxCollection.storageInstance; const localState = await storageInstance.internals.localState; localState.collection.insert({ key: 'foo', value: 'bar', _deleted: false, _attachments: {}, _rev: '1-62080c42d471e3d2625e49dcca3b8e3e', _meta: { lwt: new Date().getTime() } }); // manually trigger the save queue because we did a write to the internal loki db. await localState.databaseState.saveQueue.addWrite(); ","version":"Next","tagName":"h2"},{"title":"Disabling the non-premium console log​","type":1,"pageTitle":"RxStorage LokiJS","url":"/rx-storage-lokijs.html#disabling-the-non-premium-console-log","content":" We want to be transparent with our community, and you'll notice a console message when using the free Loki.js based RxStorage implementation. This message serves to inform you about the availability of faster storage solutions within our 👑 Premium Plugins. We understand that this might be a minor inconvenience, and we sincerely apologize for that. However, maintaining and improving RxDB requires substantial resources, and our premium users help us ensure its sustainability. If you find value in RxDB and wish to remove this message, we encourage you to explore our premium storage options, which are optimized for professional use and production environments. Thank you for your understanding and support. If you already have premium access and want to use the LokiJS RxStorage without the log, you can call the setPremiumFlag() function to disable the log. import { setPremiumFlag } from 'rxdb-premium/plugins/shared'; setPremiumFlag(); ","version":"Next","tagName":"h2"},{"title":"Memory Mapped RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-memory-mapped.html","content":"","keywords":"","version":"Next"},{"title":"Pros​","type":1,"pageTitle":"Memory Mapped RxStorage","url":"/rx-storage-memory-mapped.html#pros","content":" Improves read/write performance because these operations run against the in-memory storage.Decreases initial page load because it load all data in a single bulk request. It even detects if the database is used for the first time and then it does not have to await the creation of the persistent storage.Can store encrypted data on disc while still being able to run queries on the non-encrypted in-memory state. ","version":"Next","tagName":"h2"},{"title":"Cons​","type":1,"pageTitle":"Memory Mapped RxStorage","url":"/rx-storage-memory-mapped.html#cons","content":" It does not support attachments because storing big attachments data in-memory should not be done.When the JavaScript process is killed ungracefully like when the browser crashes or the power of the PC is terminated, it might happen that some memory writes are not persisted to the parent storage. This can be prevented with the awaitWritePersistence flag.The memory-mapped storage can only be used if all data fits into the memory of the JavaScript process. This is normally not a problem because a browser has much memory these days and plain JSON document data is not that big.Because it has to await an initial data loading from the parent storage into the memory, initial page load time can increase when much data is already stored. This is likely not a problem when you store less than 10k documents.The memory-mapped storage is part of RxDB Premium 👑. It is not part of the default RxDB core module. ","version":"Next","tagName":"h2"},{"title":"Using the Memory-Mapped RxStorage​","type":1,"pageTitle":"Memory Mapped RxStorage","url":"/rx-storage-memory-mapped.html#using-the-memory-mapped-rxstorage","content":" import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; import { getMemoryMappedRxStorage } from 'rxdb-premium/plugins/storage-memory-mapped'; /** * Here we use the IndexedDB RxStorage as persistence storage. * Any other RxStorage can also be used. */ const parentStorage = getRxStorageIndexedDB(); // wrap the persistent storage with the memory-mapped storage. const storage = getMemoryMappedRxStorage({ storage: parentStorage }); // create the RxDatabase like you would do with any other RxStorage const db = await createRxDatabase({ name: 'myDatabase, storage, }); /** ... **/ ","version":"Next","tagName":"h2"},{"title":"Multi-Tab Support​","type":1,"pageTitle":"Memory Mapped RxStorage","url":"/rx-storage-memory-mapped.html#multi-tab-support","content":" By how the memory-mapped storage works, it is not possible to have the same storage open in multiple JavaScript processes. So when you use this in a browser application, you can not open multiple databases when the app is used in multiple browser tabs. To solve this, use the SharedWorker Plugin so that the memory-mapped storage runs inside of a SharedWorker exactly once and is then reused for all browser tabs. If you have a single JavaScript process, like in a React Native app, you do not have to care about this and can just use the memory-mapped storage in the main process. ","version":"Next","tagName":"h2"},{"title":"Encryption of the persistent data​","type":1,"pageTitle":"Memory Mapped RxStorage","url":"/rx-storage-memory-mapped.html#encryption-of-the-persistent-data","content":" Normally RxDB is not capable of running queries on encrypted fields. But when you use the memory-mapped RxStorage, you can store the document data encrypted on disc, while being able to run queries on the not encrypted in-memory state. Make sure you use the encryption storage wrapper around the persistent storage, NOT around the memory-mapped storage as a whole. import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; import { getMemoryMappedRxStorage } from 'rxdb-premium/plugins/storage-memory-mapped'; import { wrappedKeyEncryptionWebCryptoStorage } from 'rxdb-premium/plugins/encryption-web-crypto'; const storage = getMemoryMappedRxStorage({ storage: wrappedKeyEncryptionWebCryptoStorage({ storage: getRxStorageIndexedDB() }) }); const db = await createRxDatabase({ name: 'myDatabase, storage, }); /** ... **/ ","version":"Next","tagName":"h2"},{"title":"Await Write Persistence​","type":1,"pageTitle":"Memory Mapped RxStorage","url":"/rx-storage-memory-mapped.html#await-write-persistence","content":" Running operations on the memory-mapped storage by default returns directly when the operation has run on the in-memory state and then persist changes in the background. Sometimes you might want to ensure write operations is persisted, you can do this by setting awaitWritePersistence: true. const storage = getMemoryMappedRxStorage({ awaitWritePersistence: true, storage: getRxStorageIndexedDB() }); ","version":"Next","tagName":"h2"},{"title":"Block Size Limit​","type":1,"pageTitle":"Memory Mapped RxStorage","url":"/rx-storage-memory-mapped.html#block-size-limit","content":" During cleanup, the memory-mapped storage will merge many small write-blocks into single big blocks for better initial load performance. The blockSizeLimit defines the maximum of how many documents get stored in a single block. The default is 10000. const storage = getMemoryMappedRxStorage({ blockSizeLimit: 1000, storage: getRxStorageIndexedDB() }); ","version":"Next","tagName":"h2"},{"title":"MongoDB RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-mongodb.html","content":"","keywords":"","version":"Next"},{"title":"Limitations of the MongoDB RxStorage​","type":1,"pageTitle":"MongoDB RxStorage","url":"/rx-storage-mongodb.html#limitations-of-the-mongodb-rxstorage","content":" Multiple Node.js servers using the same MongoDB database is currently not supportedRxAttachments are currently not supportedDoing non-RxDB writes on the MongoDB database is not supported. RxDB expects all writes to come from RxDB which update the required metadata. Doing non-RxDB writes can confuse the RxDatabase and lead to undefined behavior. But you can perform read-queries on the MongoDB storage from the outside at any time. ","version":"Next","tagName":"h2"},{"title":"Using the MongoDB RxStorage​","type":1,"pageTitle":"MongoDB RxStorage","url":"/rx-storage-mongodb.html#using-the-mongodb-rxstorage","content":" 1 Install the mongodb package​ npm install mongodb --save 2 Setups the MongoDB RxStorage​ To use the storage, you simply import the getRxStorageMongoDB method and use that when creating the RxDatabase. The connection parameter contains the MongoDB connection string. import { createRxDatabase } from 'rxdb'; import { getRxStorageMongoDB } from 'rxdb/plugins/storage-mongodb'; const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: getRxStorageMongoDB({ /** * MongoDB connection string * @link https://www.mongodb.com/docs/manual/reference/connection-string/ */ connection: 'mongodb://localhost:27017,localhost:27018,localhost:27019' }) }); ","version":"Next","tagName":"h2"},{"title":"📈 Discover RxDB Storage Benchmarks","type":0,"sectionRef":"#","url":"/rx-storage-performance.html","content":"","keywords":"","version":"Next"},{"title":"RxStorage Performance comparison​","type":1,"pageTitle":"📈 Discover RxDB Storage Benchmarks","url":"/rx-storage-performance.html#rxstorage-performance-comparison","content":" A big difference in the RxStorage implementations is the performance. In difference to a server side database, RxDB is bound to the limits of the JavaScript runtime and depending on the runtime, there are different possibilities to store and fetch data. For example in the browser it is only possible to store data in a slow IndexedDB or OPFS instead of a filesystem while on React-Native you can use the SQLite storage. Therefore the performance can be completely different depending on where you use RxDB and what you do with it. Here you can see some performance measurements and descriptions on how the different storages work and how their performance is different. ","version":"Next","tagName":"h2"},{"title":"Persistent vs Semi-Persistent storages​","type":1,"pageTitle":"📈 Discover RxDB Storage Benchmarks","url":"/rx-storage-performance.html#persistent-vs-semi-persistent-storages","content":" The "normal" storages are always persistent. This means each RxDB write is directly written to disc and all queries run on the disc state. This means a good startup performance because nothing has to be done on startup. In contrast, semi-persistent storages like memory mapped store all data in memory on startup and only save to disc occasionally (or on exit). Therefore it has a very fast read/write performance, but loading all data into memory on the first page load can take longer for big amounts of documents. Also these storages can only be used when all data fits into the memory at least once. In general it is recommended to stay on the persistent storages and only use semi-persistent ones, when you know for sure that the dataset will stay small (less than 2k documents). ","version":"Next","tagName":"h2"},{"title":"Performance comparison​","type":1,"pageTitle":"📈 Discover RxDB Storage Benchmarks","url":"/rx-storage-performance.html#performance-comparison","content":" In the following you can find some performance measurements and comparisons. Notice that these are only a small set of possible RxDB operations. If performance is really relevant for your use case, you should do your own measurements with usage-patterns that are equal to how you use RxDB in production. ","version":"Next","tagName":"h2"},{"title":"Measurements​","type":1,"pageTitle":"📈 Discover RxDB Storage Benchmarks","url":"/rx-storage-performance.html#measurements","content":" Here the following metrics are measured: time-to-first-insert: Many storages run lazy, so it makes no sense to compare the time which is required to create a database with collections. Instead we measure the time-to-first-insert which is the whole timespan from database creation until the first single document write is done.insert documents (bulk): Insert 500 documents with a single bulk-insert operation.find documents by id (bulk): Here we fetch 100% of the stored documents with a single findByIds() call.insert documents (serial): Insert 50 documents, one after each other.find documents by id (serial): Here we find 50 documents in serial with one findByIds() call per document.find documents by query: Here we fetch 100% of the stored documents with a single find() call.find documents by query: Here we fetch all of the stored documents with a 4 find() calls that run in parallel. Each fetching 25% of the documents.count documents: Counts 100% of the stored documents with a single count() call. Here we measure 4 runs at once to have a higher number that is easier to compare. ","version":"Next","tagName":"h3"},{"title":"Browser based Storages Performance Comparison​","type":1,"pageTitle":"📈 Discover RxDB Storage Benchmarks","url":"/rx-storage-performance.html#browser-based-storages-performance-comparison","content":" The performance patterns of the browser based storages are very diverse. The IndexedDB storage is recommended for mostly all use cases so you should start with that one. Later you can do performance testings and switch to another storage like OPFS or memory-mapped. ","version":"Next","tagName":"h2"},{"title":"Node/Native based Storages Performance Comparison​","type":1,"pageTitle":"📈 Discover RxDB Storage Benchmarks","url":"/rx-storage-performance.html#nodenative-based-storages-performance-comparison","content":" For most client-side native applications (react-native, electron, capacitor), using the SQLite RxStorage is recommended. For non-client side applications like a server, use the MongoDB storage instead. ","version":"Next","tagName":"h2"},{"title":"RxStorage PouchDB","type":0,"sectionRef":"#","url":"/rx-storage-pouchdb.html","content":"","keywords":"","version":"Next"},{"title":"Why is the PouchDB RxStorage deprecated?​","type":1,"pageTitle":"RxStorage PouchDB","url":"/rx-storage-pouchdb.html#why-is-the-pouchdb-rxstorage-deprecated","content":" When I started developing RxDB in 2016, I had a specific use case to solve. Because there was no client-side database out there that fitted, I created RxDB as a wrapper around PouchDB. This worked great and all the PouchDB features like the query engine, the adapter system, CouchDB-replication and so on, came for free. But over the years, it became clear that PouchDB is not suitable for many applications, mostly because of its performance: To be compliant to CouchDB, PouchDB has to store all revision trees of documents which slows down queries. Also purging these document revisions is not possibleso the database storage size will only increase over time. Another problem was that many issues in PouchDB have never been fixed, but only closed by the issue-bot like this one. The whole PouchDB RxStorage code was full of workarounds and monkey patches to resolve these issues for RxDB users. Many these patches decreased performance even further. Sometimes it was not possible to fix things from the outside, for example queries with $gt operators return the wrong documents which is a no-go for a production database and hard to debug. In version 10.0.0 RxDB introduced the RxStorage layer which allows users to swap out the underlying storage engine where RxDB stores and queries documents from. This allowed to use alternatives from PouchDB, for example the IndexedDB RxStorage in browsers or even the FoundationDB RxStorage on the server side. There where not many use cases left where it was a good choice to use the PouchDB RxStorage. Only replicating with a CouchDB server, was only possible with PouchDB. But this has also changed. RxDB has a plugin that allows to replicate clients with any CouchDB server by using the RxDB Sync Engine. This plugins work with any RxStorage so that it is not necessary to use the PouchDB storage. Removing PouchDB allows RxDB to add many awaited features like filtered change streams for easier replication and permission handling. It will also free up development time. If you are currently using the PouchDB RxStorage, you have these options: Migrate to another RxStorage (recommended)Never update RxDB to the next major version (stay on older 14.0.0)Fork the PouchDB RxStorage and maintain the plugin by yourself.Fix all the PouchDB problems so that we can add PouchDB to the RxDB Core again. ","version":"Next","tagName":"h2"},{"title":"Pros​","type":1,"pageTitle":"RxStorage PouchDB","url":"/rx-storage-pouchdb.html#pros","content":" Most battle proven RxStorageSupports replication with a CouchDB endpointSupport storing attachmentsBig ecosystem of adapters ","version":"Next","tagName":"h2"},{"title":"Cons​","type":1,"pageTitle":"RxStorage PouchDB","url":"/rx-storage-pouchdb.html#cons","content":" Big bundle sizeSlow performance because of revision handling overhead ","version":"Next","tagName":"h2"},{"title":"Usage​","type":1,"pageTitle":"RxStorage PouchDB","url":"/rx-storage-pouchdb.html#usage","content":" import { createRxDatabase } from 'rxdb'; import { getRxStoragePouch, addPouchPlugin } from 'rxdb/plugins/pouchdb'; addPouchPlugin(require('pouchdb-adapter-idb')); const db = await createRxDatabase({ name: 'exampledb', storage: getRxStoragePouch( 'idb', { /** * other pouchdb specific options * @link https://pouchdb.com/api.html#create_database */ } ) }); ","version":"Next","tagName":"h2"},{"title":"Polyfill the global variable​","type":1,"pageTitle":"RxStorage PouchDB","url":"/rx-storage-pouchdb.html#polyfill-the-global-variable","content":" When you use RxDB with angular or other webpack based frameworks, you might get the error: <span style="color: red;">Uncaught ReferenceError: global is not defined</span> This is because pouchdb assumes a nodejs-specific global variable that is not added to browser runtimes by some bundlers. You have to add them by your own, like we do here. (window as any).global = window; (window as any).process = { env: { DEBUG: undefined }, }; ","version":"Next","tagName":"h2"},{"title":"Adapters​","type":1,"pageTitle":"RxStorage PouchDB","url":"/rx-storage-pouchdb.html#adapters","content":" PouchDB has many adapters for all JavaScript runtimes. ","version":"Next","tagName":"h2"},{"title":"Using the internal PouchDB Database​","type":1,"pageTitle":"RxStorage PouchDB","url":"/rx-storage-pouchdb.html#using-the-internal-pouchdb-database","content":" For custom operations, you can access the internal PouchDB database. This is dangerous because you might do changes that are not compatible with RxDB. Only use this when there is no way to achieve your goals via the RxDB API. import { getPouchDBOfRxCollection } from 'rxdb/plugins/pouchdb'; const pouch = getPouchDBOfRxCollection(myRxCollection); ","version":"Next","tagName":"h2"},{"title":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-opfs.html","content":"","keywords":"","version":"Next"},{"title":"What is OPFS​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#what-is-opfs","content":" The Origin Private File System (OPFS) is a native browser storage API that allows web applications to manage files in a private, sandboxed, origin-specific virtual filesystem. Unlike IndexedDB and LocalStorage, which are optimized as object/key-value storage, OPFS provides more granular control for file operations, enabling byte-by-byte access, file streaming, and even low-level manipulations. OPFS is ideal for applications requiring high-performance file operations (3x-4x faster compared to IndexedDB) inside of a client-side application, offering advantages like improved speed, more efficient use of resources, and enhanced security and privacy features. ","version":"Next","tagName":"h2"},{"title":"OPFS limitations​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#opfs-limitations","content":" From the beginning of 2023, the Origin Private File System API is supported by all modern browsers like Safari, Chrome, Edge and Firefox. Only Internet Explorer is not supported and likely will never get support. It is important to know that the most performant synchronous methods like read() and write() of the OPFS API are only available inside of a WebWorker. They cannot be used in the main thread, an iFrame or even a SharedWorker. The OPFS createSyncAccessHandle() method that gives you access to the synchronous methods is not exposed in the main thread, only in a Worker. While there is no concrete data size limit defined by the API, browsers will refuse to store more data at some point. If no more data can be written, a QuotaExceededError is thrown which should be handled by the application, like showing an error message to the user. ","version":"Next","tagName":"h3"},{"title":"How the OPFS API works​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#how-the-opfs-api-works","content":" The OPFS API is pretty straightforward to use. First you get the root filesystem. Then you can create files and directories on that. Notice that whenever you synchronously write to, or read from a file, an ArrayBuffer must be used that contains the data. It is not possible to synchronously write plain strings or objects into the file. Therefore the TextEncoder and TextDecoder API must be used. Also notice that some of the methods of FileSystemSyncAccessHandlehave been asynchronous in the past, but are synchronous since Chromium 108. To make it less confusing, we just use await in front of them, so it will work in both cases. // Access the root directory of the origin's private file system. const root = await navigator.storage.getDirectory(); // Create a subdirectory. const diaryDirectory = await root.getDirectoryHandle('subfolder', { create: true, }); // Create a new file named 'example.txt'. const fileHandle = await diaryDirectory.getFileHandle('example.txt', { create: true, }); // Create a FileSystemSyncAccessHandle on the file. const accessHandle = await fileHandle.createSyncAccessHandle(); // Write a sentence to the file. let writeBuffer = new TextEncoder().encode('Hello from RxDB'); const writeSize = accessHandle.write(writeBuffer); // Read file and transform data to string. const readBuffer = new Uint8Array(writeSize); const readSize = accessHandle.read(readBuffer, { at: 0 }); const contentAsString = new TextDecoder().decode(readBuffer); // Write an exclamation mark to the end of the file. writeBuffer = new TextEncoder().encode('!'); accessHandle.write(writeBuffer, { at: readSize }); // Truncate file to 10 bytes. await accessHandle.truncate(10); // Get the new size of the file. const fileSize = await accessHandle.getSize(); // Persist changes to disk. await accessHandle.flush(); // Always close FileSystemSyncAccessHandle if done, so others can open the file again. await accessHandle.close(); A more detailed description of the OPFS API can be found on MDN. ","version":"Next","tagName":"h2"},{"title":"OPFS performance​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#opfs-performance","content":" Because the Origin Private File System API provides low-level access to binary files, it is much faster compared to IndexedDB or localStorage. According to the storage performance test, OPFS is up to 2x times faster on plain inserts when a new file is created on each write. Reads are even faster. A good comparison about real world scenarios, are the performance results of the various RxDB storages. Here it shows that reads are up to 4x faster compared to IndexedDB, even with complex queries: ","version":"Next","tagName":"h2"},{"title":"Using OPFS as RxStorage in RxDB​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#using-opfs-as-rxstorage-in-rxdb","content":" The OPFS RxStorage itself must run inside a WebWorker. Therefore we use the Worker RxStorage and let it point to the prebuild opfs.worker.js file that comes shipped with RxDB Premium 👑. Notice that the OPFS RxStorage is part of the RxDB Premium 👑 plugin that must be purchased. import { createRxDatabase } from 'rxdb'; import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker'; const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageWorker( { /** * This file must be statically served from a webserver. * You might want to first copy it somewhere outside of * your node_modules folder. */ workerInput: 'node_modules/rxdb-premium/dist/workers/opfs.worker.js' } ) }); ","version":"Next","tagName":"h2"},{"title":"Using OPFS in the main thread instead of a worker​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#using-opfs-in-the-main-thread-instead-of-a-worker","content":" The createSyncAccessHandle method from the Filesystem API is only available inside of a Webworker. Therefore you cannot use getRxStorageOPFS() in the main thread. But there is a slightly slower way to access the virtual filesystem from the main thread. RxDB support the getRxStorageOPFSMainThread() for that. Notice that this uses the createWritable function which is not supported in safari. Using OPFS from the main thread can have benefits because not having to cross the worker bridge can reduce latence in reads and writes. import { createRxDatabase } from 'rxdb'; import { getRxStorageOPFSMainThread } from 'rxdb-premium/plugins/storage-opfs'; const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageOPFSMainThread() }); ","version":"Next","tagName":"h2"},{"title":"Building a custom worker.js​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#building-a-custom-workerjs","content":" When you want to run additional plugins like storage wrappers or replication inside of the worker, you have to build your own worker.js file. You can do that similar to other workers by calling exposeWorkerRxStorage like described in the worker storage plugin. // inside of the worker.js file import { getRxStorageOPFS } from 'rxdb-premium/plugins/storage-opfs'; import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; const storage = getRxStorageOPFS(); exposeWorkerRxStorage({ storage }); ","version":"Next","tagName":"h2"},{"title":"Setting usesRxDatabaseInWorker when a RxDatabase is also used inside of the worker​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#setting-usesrxdatabaseinworker-when-a-rxdatabase-is-also-used-inside-of-the-worker","content":" When you use the OPFS inside of a worker, it will internally use strings to represent operation results. This has the benefit that transferring strings from the worker to the main thread, is way faster compared to complex json objects. The getRxStorageWorker() will automatically decode these strings on the main thread so that the data can be used by the RxDatabase. But using a RxDatabase inside of your worker can make sense for example when you want to move the replication with a server. To enable this, you have to set usesRxDatabaseInWorker to true: // inside of the worker.js file import { getRxStorageOPFS } from 'rxdb-premium/plugins/storage-opfs'; const storage = getRxStorageOPFS({ usesRxDatabaseInWorker: true }); If you forget to set this and still create and use a RxDatabase inside of the worker, you might get the error messageorUncaught (in promise) TypeError: Cannot read properties of undefined (reading 'length')`. ","version":"Next","tagName":"h2"},{"title":"OPFS in Electron, React-Native or Capacitor.js​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#opfs-in-electron-react-native-or-capacitorjs","content":" Origin Private File System is a browser API that is only accessible in browsers. Other JavaScript like React-Native or Node.js, do not support it. Electron has two JavaScript contexts: the browser (chromium) context and the Node.js context. While you could use the OPFS API in the browser context, it is not recommended. Instead you should use the Filesystem API of Node.js and then only transfer the relevant data with the ipcRenderer. With RxDB that is pretty easy to configure: In the main.js, expose the Node Filesystem storage with the exposeIpcMainRxStorage() that comes with the electron pluginIn the browser context, access the main storage with the getRxStorageIpcRenderer() method. React Native (and Expo) does not have an OPFS API. You could use the ReactNative Filesystem to directly write data. But to get a fully featured database like RxDB it is easier to use the SQLite RxStorage which starts an SQLite database inside of the ReactNative app and uses that to do the database operations. Capacitor.js is able to access the OPFS API. ","version":"Next","tagName":"h2"},{"title":"Difference between File System Access API and Origin Private File System (OPFS)​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#difference-between-file-system-access-api-and-origin-private-file-system-opfs","content":" Often developers are confused with the differences between the File System Access API and the Origin Private File System (OPFS). The File System Access API provides access to the files on the device file system, like the ones shown in the file explorer of the operating system. To use the File System API, the user has to actively select the files from a filepicker.Origin Private File System (OPFS) is a sub-part of the File System Standard and it only describes the things you can do with the filesystem root from navigator.storage.getDirectory(). OPFS writes to a sandboxed filesystem, not visible to the user. Therefore the user does not have to actively select or allow the data access. ","version":"Next","tagName":"h2"},{"title":"Learn more about OPFS:​","type":1,"pageTitle":"Origin Private File System (OPFS) Database with the RxDB OPFS-RxStorage","url":"/rx-storage-opfs.html#learn-more-about-opfs","content":" WebKit: The File System API with Origin Private File SystemBrowser SupportPerformance Test Tool ","version":"Next","tagName":"h2"},{"title":"Remote RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-remote.html","content":"","keywords":"","version":"Next"},{"title":"Usage​","type":1,"pageTitle":"Remote RxStorage","url":"/rx-storage-remote.html#usage","content":" The remote storage communicates over a message channel which has to implement the messageChannelCreator function which returns an object that has a messages$ observable and a send() function on both sides and a close() function that closes the RemoteMessageChannel. // on the client import { getRxStorageRemote } from 'rxdb/plugins/storage-remote'; const storage = getRxStorageRemote({ identifier: 'my-id', mode: 'storage', messageChannelCreator: () => Promise.resolve({ messages$: new Subject(), send(msg) { // send to remote storage } }) }); const myDb = await createRxDatabase({ storage }); // on the remote import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; import { exposeRxStorageRemote } from 'rxdb/plugins/storage-remote'; exposeRxStorageRemote({ storage: getRxStorageLocalstorage(), messages$: new Subject(), send(msg){ // send to other side } }); ","version":"Next","tagName":"h2"},{"title":"Usage with a Websocket server​","type":1,"pageTitle":"Remote RxStorage","url":"/rx-storage-remote.html#usage-with-a-websocket-server","content":" The remote storage plugin contains helper functions to create a remote storage over a WebSocket server. This is often used in Node.js to give one microservice access to another services database without having to replicate the full database state. // server.js import { getRxStorageMemory } from 'rxdb/plugins/storage-memory'; import { startRxStorageRemoteWebsocketServer } from 'rxdb/plugins/storage-remote-websocket'; // either you can create the server based on a RxDatabase const serverBasedOnDatabase = await startRxStorageRemoteWebsocketServer({ port: 8080, database: myRxDatabase }); // or you can create the server based on a pure RxStorage const serverBasedOn = await startRxStorageRemoteWebsocketServer({ port: 8080, storage: getRxStorageMemory() }); // client.js import { getRxStorageRemoteWebsocket } from 'rxdb/plugins/storage-remote-websocket'; const myDb = await createRxDatabase({ storage: getRxStorageRemoteWebsocket({ url: 'ws://example.com:8080' }) }); ","version":"Next","tagName":"h2"},{"title":"Sending custom messages​","type":1,"pageTitle":"Remote RxStorage","url":"/rx-storage-remote.html#sending-custom-messages","content":" The remote storage can also be used to send custom messages to and from the remote instance. One the remote you have to define a customRequestHandler like: const serverBasedOnDatabase = await startRxStorageRemoteWebsocketServer({ port: 8080, database: myRxDatabase, async customRequestHandler(msg){ // here you can return any JSON object as an 'answer' return { foo: 'bar' }; } }); On the client instance you can then call the customRequest() method: const storage = getRxStorageRemoteWebsocket({ url: 'ws://example.com:8080' }); const answer = await storage.customRequest({ bar: 'foo' }); console.dir(answer); // > { foo: 'bar' } ","version":"Next","tagName":"h2"},{"title":"Sharding RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-sharding.html","content":"","keywords":"","version":"Next"},{"title":"Using the sharding plugin​","type":1,"pageTitle":"Sharding RxStorage","url":"/rx-storage-sharding.html#using-the-sharding-plugin","content":" import { getRxStorageSharding } from 'rxdb-premium/plugins/storage-sharding'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; /** * First wrap the original RxStorage with the sharding RxStorage. */ const shardedRxStorage = getRxStorageSharding({ /** * Here we use the localStorage RxStorage, * it is also possible to use any other RxStorage instead. */ storage: getRxStorageLocalstorage() }); /** * Add the sharding options to your schema. * Changing these options will require a data migration. */ const mySchema = { /* ... */ sharding: { /** * Amount of shards per RxStorage instance. * Depending on your data size and query patterns, the optimal shard amount may differ. * Do a performance test to optimize that value. * 10 Shards is a good value to start with. * * IMPORTANT: Changing the value of shards is not possible on a already existing database state, * you will loose access to your data. */ shards: 10, /** * Sharding mode, * you can either shard by collection or by database. * For most cases you should use 'collection' which will shard on the collection level. * For example with the IndexedDB RxStorage, it will then create multiple stores per IndexedDB database * and not multiple IndexedDB databases, which would be slower. */ mode: 'collection' } /* ... */ } /** * Create the RxDatabase with the wrapped RxStorage. */ const database = await createRxDatabase({ name: 'mydatabase', storage: shardedRxStorage }); ","version":"Next","tagName":"h2"},{"title":"SharedWorker RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-shared-worker.html","content":"","keywords":"","version":"Next"},{"title":"Usage​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#usage","content":" ","version":"Next","tagName":"h2"},{"title":"On the SharedWorker process​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#on-the-sharedworker-process","content":" In the worker process JavaScript file, you have wrap the original RxStorage with getRxStorageIndexedDB(). // shared-worker.ts import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/indexeddb'; exposeWorkerRxStorage({ /** * You can wrap any implementation of the RxStorage interface * into a worker. * Here we use the IndexedDB RxStorage. */ storage: getRxStorageIndexedDB() }); ","version":"Next","tagName":"h3"},{"title":"On the main process​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#on-the-main-process","content":" import { createRxDatabase } from 'rxdb'; import { getRxStorageSharedWorker } from 'rxdb-premium/plugins/storage-worker'; import { getRxStorageIndexedDB } from 'rxdb/plugins/storage-indexeddb'; const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageSharedWorker( { /** * Contains any value that can be used as parameter * to the SharedWorker constructor of thread.js * Most likely you want to put the path to the shared-worker.js file in here. * * @link https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker?retiredLocale=de */ workerInput: 'path/to/shared-worker.js', /** * (Optional) options * for the worker. */ workerOptions: { type: 'module', credentials: 'omit' } } ) }); ","version":"Next","tagName":"h3"},{"title":"Pre-build workers​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#pre-build-workers","content":" The shared-worker.js must be a self containing JavaScript file that contains all dependencies in a bundle. To make it easier for you, RxDB ships with pre-bundles worker files that are ready to use. You can find them in the folder node_modules/rxdb-premium/dist/workers after you have installed the RxDB Premium 👑 Plugin. From there you can copy them to a location where it can be served from the webserver and then use their path to create the RxDatabase Any valid worker.js JavaScript file can be used both, for normal Workers and SharedWorkers. import { createRxDatabase } from 'rxdb'; import { getRxStorageSharedWorker } from 'rxdb-premium/plugins/storage-worker'; const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageSharedWorker( { /** * Path to where the copied file from node_modules/rxdb-premium/dist/workers * is reachable from the webserver. */ workerInput: '/indexeddb.shared-worker.js' } ) }); ","version":"Next","tagName":"h2"},{"title":"Building a custom worker​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#building-a-custom-worker","content":" To build a custom worker.js file, check out the webpack config at the worker documentation. Any worker file form the worker storage can also be used in a shared worker because exposeWorkerRxStorage detects where it runs and exposes the correct messaging endpoints. ","version":"Next","tagName":"h2"},{"title":"Passing in a SharedWorker instance​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#passing-in-a-sharedworker-instance","content":" Instead of setting an url as workerInput, you can also specify a function that returns a new SharedWorker instance when called. This is mostly used when you have a custom worker file and dynamically import it. This works equal to the workerInput of the Worker Storage ","version":"Next","tagName":"h2"},{"title":"Set multiInstance: false​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#set-multiinstance-false","content":" When you know that you only ever create your RxDatabase inside of the shared worker, you might want to set multiInstance: false to prevent sending change events across JavaScript realms and to improve performance. Do not set this when you also create the same storage on another realm, like when you have the same RxDatabase once inside the shared worker and once on the main thread. ","version":"Next","tagName":"h2"},{"title":"Replication with SharedWorker​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#replication-with-sharedworker","content":" When a SharedWorker RxStorage is used, it is recommended to run the replication inside of the worker. This is the best option for performance. You can do that by opening another RxDatabase inside of it and starting the replication there. If you are not concerned about performance, you can still start replication on the main thread instead. But you should never run replication on both the main thread and the worker. // shared-worker.ts import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; import { createRxDatabase, addRxPlugin } from 'rxdb'; import { RxDBReplicationGraphQLPlugin } from 'rxdb/plugins/replication-graphql'; addRxPlugin(RxDBReplicationGraphQLPlugin); const baseStorage = getRxStorageIndexedDB(); // first expose the RxStorage to the outside exposeWorkerRxStorage({ storage: baseStorage }); /** * Then create a normal RxDatabase and RxCollections * and start the replication. */ const database = await createRxDatabase({ name: 'mydatabase', storage: baseStorage }); await db.addCollections({ humans: {/* ... */} }); const replicationState = db.humans.syncGraphQL({/* ... */}); ","version":"Next","tagName":"h2"},{"title":"Limitations​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#limitations","content":" The SharedWorker API is not available in some mobile browser ","version":"Next","tagName":"h3"},{"title":"FAQ​","type":1,"pageTitle":"SharedWorker RxStorage","url":"/rx-storage-shared-worker.html#faq","content":" Can I use this plugin with a Service Worker? No. A Service Worker is not the same as a Shared Worker. While you can use RxDB inside of a ServiceWorker, you cannot use the ServiceWorker as a RxStorage that gets accessed by an outside RxDatabase instance. ","version":"Next","tagName":"h3"},{"title":"RxStorage","type":0,"sectionRef":"#","url":"/rx-storage.html","content":"","keywords":"","version":"Next"},{"title":"Quick Recommendations​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#quick-recommendations","content":" In the Browser: Use the LocalStorage storage for simple setup and small build size. For bigger datasets, use either the dexie.js storage (free) or the IndexedDB RxStorage if you have 👑 premium access which is a bit faster and has a smaller build size.In Electron and ReactNative: Use the SQLite RxStorage if you have 👑 premium access or the trial-SQLite RxStorage for tryouts.In Capacitor: Use the SQLite RxStorage if you have 👑 premium access, otherwise use the localStorage storage. ","version":"Next","tagName":"h2"},{"title":"Configuration Examples​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#configuration-examples","content":" The RxStorage layer of RxDB is very flexible. Here are some examples on how to configure more complex settings: ","version":"Next","tagName":"h2"},{"title":"Storing much data in a browser securely​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#storing-much-data-in-a-browser-securely","content":" Lets say you build a browser app that needs to store a big amount of data as secure as possible. Here we can use a combination of the storages (encryption, IndexedDB, compression, schema-checks) that increase security and reduce the stored data size. We use the schema-validation on the top level to ensure schema-errors are clearly readable and do not contain encrypted/compressed data. The encryption is used inside of the compression because encryption of compressed data is more efficient. import { wrappedValidateAjvStorage } from 'rxdb/plugins/validate-ajv'; import { wrappedKeyCompressionStorage } from 'rxdb/plugins/key-compression'; import { wrappedKeyEncryptionCryptoJsStorage } from 'rxdb/plugins/encryption-crypto-js'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; const myDatabase = await createRxDatabase({ storage: wrappedValidateAjvStorage({ storage: wrappedKeyCompressionStorage({ storage: wrappedKeyEncryptionCryptoJsStorage({ storage: getRxStorageIndexedDB() }) }) }) }); ","version":"Next","tagName":"h3"},{"title":"High query Load​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#high-query-load","content":" Also we can utilize a combination of storages to create a database that is optimized to run complex queries on the data really fast. Here we use the sharding storage together with the worker storage. This allows to run queries in parallel multithreading instead of a single JavaScript process. Because the worker initialization can slow down the initial page load, we also use the localstorage-meta-optimizer to improve initialization time. import { getRxStorageSharding } from 'rxdb-premium/plugins/storage-sharding'; import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; import { getLocalstorageMetaOptimizerRxStorage } from 'rxdb-premium/plugins/storage-localstorage-meta-optimizer'; const myDatabase = await createRxDatabase({ storage: getLocalstorageMetaOptimizerRxStorage({ storage: getRxStorageSharding({ storage: getRxStorageWorker({ workerInput: 'path/to/worker.js', storage: getRxStorageIndexedDB() }) }) }) }); ","version":"Next","tagName":"h3"},{"title":"Low Latency on Writes and Simple Reads​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#low-latency-on-writes-and-simple-reads","content":" Here we create a storage configuration that is optimized to have a low latency on simple reads and writes. It uses the memory-mapped storage to fetch and store data in memory. For persistence the OPFS storage is used in the main thread which has lower latency for fetching big chunks of data when at initialization the data is loaded from disc into memory. We do not use workers because sending data from the main thread to workers and backwards would increase the latency. import { getLocalstorageMetaOptimizerRxStorage } from 'rxdb-premium/plugins/storage-localstorage-meta-optimizer'; import { getMemoryMappedRxStorage } from 'rxdb-premium/plugins/storage-memory-mapped'; import { getRxStorageOPFSMainThread } from 'rxdb-premium/plugins/storage-worker'; const myDatabase = await createRxDatabase({ storage: getLocalstorageMetaOptimizerRxStorage({ storage: getMemoryMappedRxStorage({ storage: getRxStorageOPFSMainThread() }) }) }); ","version":"Next","tagName":"h3"},{"title":"All RxStorage Implementations List​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#all-rxstorage-implementations-list","content":" ","version":"Next","tagName":"h2"},{"title":"Memory​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#memory","content":" A storage that stores the data in as plain data in the memory of the JavaScript process. Really fast and can be used in all environments. Read more ","version":"Next","tagName":"h3"},{"title":"LocalStorage​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#localstorage","content":" The localstroage based storage stores the data inside of a browsers localStorage API. It is the easiest to set up and has a small bundle size. If you are new to RxDB, you should start with the LocalStorage RxStorage. Read more ","version":"Next","tagName":"h3"},{"title":"👑 IndexedDB​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#-indexeddb","content":" The IndexedDB RxStorage is based on plain IndexedDB. For most use cases, this has the best performance together with the OPFS storage. Read more ","version":"Next","tagName":"h3"},{"title":"👑 OPFS​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#-opfs","content":" The OPFS RxStorage is based on the File System Access API. This has the best performance of all other non-in-memory storage, when RxDB is used inside of a browser. Read more ","version":"Next","tagName":"h3"},{"title":"👑 Filesystem Node​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#-filesystem-node","content":" The Filesystem Node storage is best suited when you use RxDB in a Node.js process or with electron.js. Read more ","version":"Next","tagName":"h3"},{"title":"Storage Wrapper Plugins​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#storage-wrapper-plugins","content":" 👑 Worker​ The worker RxStorage is a wrapper around any other RxStorage which allows to run the storage in a WebWorker (in browsers) or a Worker Thread (in Node.js). By doing so, you can take CPU load from the main process and move it into the worker's process which can improve the perceived performance of your application. Read more 👑 SharedWorker​ The worker RxStorage is a wrapper around any other RxStorage which allows to run the storage in a SharedWorker (only in browsers). By doing so, you can take CPU load from the main process and move it into the worker's process which can improve the perceived performance of your application. Read more Remote​ The Remote RxStorage is made to use a remote storage and communicate with it over an asynchronous message channel. The remote part could be on another JavaScript process or even on a different host machine. Mostly used internally in other storages like Worker or Electron-ipc. Read more 👑 Sharding​ On some RxStorage implementations (like IndexedDB), a huge performance improvement can be done by sharding the documents into multiple database instances. With the sharding plugin you can wrap any other RxStorage into a sharded storage. Read more 👑 Memory Mapped​ The memory-mapped RxStorage is a wrapper around any other RxStorage. The wrapper creates an in-memory storage that is used for query and write operations. This memory instance stores its data in an underlying storage for persistence. The main reason to use this is to improve query/write performance while still having the data stored on disc. Read more 👑 Localstorage Meta Optimizer​ The RxStorage Localstorage Meta Optimizer is a wrapper around any other RxStorage. The wrapper uses the original RxStorage for normal collection documents. But to optimize the initial page load time, it uses localstorage to store the plain key-value metadata that RxDB needs to create databases and collections. This plugin can only be used in browsers. Read more Electron IpcRenderer & IpcMain​ To use RxDB in electron, it is recommended to run the RxStorage in the main process and the RxDatabase in the renderer processes. With the rxdb electron plugin you can create a remote RxStorage and consume it from the renderer process. Read more ","version":"Next","tagName":"h3"},{"title":"Third Party based Storages​","type":1,"pageTitle":"RxStorage","url":"/rx-storage.html#third-party-based-storages","content":" 👑 SQLite​ The SQLite storage has great performance when RxDB is used on Node.js, Electron, React Native, Cordova or Capacitor. Read more Dexie.js​ The Dexie.js based storage is based on the Dexie.js IndexedDB wrapper library. Read more MongoDB​ To use RxDB on the server side, the MongoDB RxStorage provides a way of having a secure, scalable and performant storage based on the popular MongoDB NoSQL database Read more DenoKV​ To use RxDB in Deno. The DenoKV RxStorage provides a way of having a secure, scalable and performant storage based on the Deno Key Value Store. Read more FoundationDB​ To use RxDB on the server side, the FoundationDB RxStorage provides a way of having a secure, fault-tolerant and performant storage. Read more ","version":"Next","tagName":"h3"},{"title":"RxDB Tradeoffs","type":0,"sectionRef":"#","url":"/rxdb-tradeoffs.html","content":"","keywords":"","version":"Next"},{"title":"Why not SQL syntax​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#why-not-sql-syntax","content":" When you ask people which database they would want for browsers, the most answer I hear is something SQL based like SQLite. This makes sense, SQL is a query language that most developers had learned in school/university and it is reusable across various database solutions. But for RxDB (and other client side databases), using SQL is not a good option and instead it operates on document writes and the JSON based Mango-query syntax for querying. // A Mango Query const query = { selector: { age: { $gt: 10 }, lastName: 'foo' }, sort: [{ age: 'asc' }] }; ","version":"Next","tagName":"h2"},{"title":"SQL is made for database servers​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#sql-is-made-for-database-servers","content":" SQL is made to be used to run operations against a database server. You send a SQL string like SELECT SUM(column_name)... to the database server and the server then runs all operations required to calculate the result and only send back that result. This saves performance on the application side and ensures that the application itself is not blocked. But RxDB is a client-side database that runs inside of the application. There is no performance difference if the SUM() query is run inside of the database or at the application level where a Array.reduce() call calculates the result. ","version":"Next","tagName":"h3"},{"title":"Typescript support​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#typescript-support","content":" SQL is string based and therefore you need additional IDE tooling to ensure that your written database code is valid. Using the Mango Query syntax instead, TypeScript can be used validate the queries and to autocomplete code and knows which fields do exist and which do not. By doing so, the correctness of queries can be ensured at compile-time instead of run-time. ","version":"Next","tagName":"h3"},{"title":"Composeable queries​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#composeable-queries","content":" By using JSON based Mango Queries, it is easy to compose queries in plain JavaScript. For example if you have any given query and want to add the condition user MUST BE 'foobar', you can just add the condition to the selector without having to parse and understand a complex SQL string. query.selector.user = 'foobar'; Even merging the selectors of multiple queries is not a problem: queryA.selector = { $and: [ queryA.selector, queryB.selector ] }; ","version":"Next","tagName":"h3"},{"title":"Why Document based (NoSQL)​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#why-document-based-nosql","content":" Like other NoSQL databases, RxDB operates data on document level. It has no concept of tables, rows and columns. Instead we have collections, documents and fields. ","version":"Next","tagName":"h2"},{"title":"Javascript is made to work with objects​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#javascript-is-made-to-work-with-objects","content":" ","version":"Next","tagName":"h3"},{"title":"Caching​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#caching","content":" ","version":"Next","tagName":"h3"},{"title":"EventReduce​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#eventreduce","content":" ","version":"Next","tagName":"h3"},{"title":"Easier to use with typescript​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#easier-to-use-with-typescript","content":" Because of the document based approach, TypeScript can know the exact type of the query response while a SQL query could return anything from a number over a set of rows or a complex construct. ","version":"Next","tagName":"h3"},{"title":"Why no transactions​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#why-no-transactions","content":" Does not work with offline-firstDoes not work with multi-tabEasier conflict handling on document level -- Instead of transactions, rxdb works with revisions ","version":"Next","tagName":"h2"},{"title":"Why no relations​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#why-no-relations","content":" Does not work with easy replication ","version":"Next","tagName":"h2"},{"title":"Why is a schema required​","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html#why-is-a-schema-required","content":" migration of data on clients is hardWhy jsonschema ","version":"Next","tagName":"h2"},{"title":"","type":1,"pageTitle":"RxDB Tradeoffs","url":"/rxdb-tradeoffs.html##","content":"","version":"Next","tagName":"h2"},{"title":"Worker RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-worker.html","content":"","keywords":"","version":"Next"},{"title":"On the worker process​","type":1,"pageTitle":"Worker RxStorage","url":"/rx-storage-worker.html#on-the-worker-process","content":" // worker.ts import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; exposeWorkerRxStorage({ /** * You can wrap any implementation of the RxStorage interface * into a worker. * Here we use the IndexedDB RxStorage. */ storage: getRxStorageIndexedDB() }); ","version":"Next","tagName":"h2"},{"title":"On the main process​","type":1,"pageTitle":"Worker RxStorage","url":"/rx-storage-worker.html#on-the-main-process","content":" import { createRxDatabase } from 'rxdb'; import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker'; const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageWorker( { /** * Contains any value that can be used as parameter * to the Worker constructor of thread.js * Most likely you want to put the path to the worker.js file in here. * * @link https://developer.mozilla.org/en-US/docs/Web/API/Worker/Worker */ workerInput: 'path/to/worker.js', /** * (Optional) options * for the worker. */ workerOptions: { type: 'module', credentials: 'omit' } } ) }); ","version":"Next","tagName":"h2"},{"title":"Pre-build workers​","type":1,"pageTitle":"Worker RxStorage","url":"/rx-storage-worker.html#pre-build-workers","content":" The worker.js must be a self containing JavaScript file that contains all dependencies in a bundle. To make it easier for you, RxDB ships with pre-bundles worker files that are ready to use. You can find them in the folder node_modules/rxdb-premium/dist/workers after you have installed the RxDB Premium 👑 Plugin. From there you can copy them to a location where it can be served from the webserver and then use their path to create the RxDatabase. Any valid worker.js JavaScript file can be used both, for normal Workers and SharedWorkers. import { createRxDatabase } from 'rxdb'; import { getRxStorageWorker } from 'rxdb-premium/plugins/storage-worker'; const database = await createRxDatabase({ name: 'mydatabase', storage: getRxStorageWorker( { /** * Path to where the copied file from node_modules/rxdb/dist/workers * is reachable from the webserver. */ workerInput: '/indexeddb.worker.js' } ) }); ","version":"Next","tagName":"h2"},{"title":"Building a custom worker​","type":1,"pageTitle":"Worker RxStorage","url":"/rx-storage-worker.html#building-a-custom-worker","content":" The easiest way to bundle a custom worker.js file is by using webpack. Here is the webpack-config that is also used for the prebuild workers: // webpack.config.js const path = require('path'); const TerserPlugin = require('terser-webpack-plugin'); const projectRootPath = path.resolve( __dirname, '../../' // path from webpack-config to the root folder of the repo ); const babelConfig = require(path.join(projectRootPath, 'babel.config')); const baseDir = './dist/workers/'; // output path module.exports = { target: 'webworker', entry: { 'my-custom-worker': baseDir + 'my-custom-worker.js', }, output: { filename: '[name].js', clean: true, path: path.resolve( projectRootPath, 'dist/workers' ), }, mode: 'production', module: { rules: [ { test: /\\.tsx?$/, exclude: /(node_modules)/, use: { loader: 'babel-loader', options: babelConfig } } ], }, resolve: { extensions: ['.tsx', '.ts', '.js', '.mjs', '.mts'] }, optimization: { moduleIds: 'deterministic', minimize: true, minimizer: [new TerserPlugin({ terserOptions: { format: { comments: false, }, }, extractComments: false, })], } }; ","version":"Next","tagName":"h2"},{"title":"One worker per database​","type":1,"pageTitle":"Worker RxStorage","url":"/rx-storage-worker.html#one-worker-per-database","content":" Each call to getRxStorageWorker() will create a different worker instance so that when you have more than one RxDatabase, each database will have its own JavaScript worker process. To reuse the worker instance in more than one RxDatabase, you can store the output of getRxStorageWorker() into a variable an use that one. Reusing the worker can decrease the initial page load, but you might get slower database operations. // Call getRxStorageWorker() exactly once const workerStorage = getRxStorageWorker({ workerInput: 'path/to/worker.js' }); // use the same storage for both databases. const databaseOne = await createRxDatabase({ name: 'database-one', storage: workerStorage }); const databaseTwo = await createRxDatabase({ name: 'database-two', storage: workerStorage }); ","version":"Next","tagName":"h2"},{"title":"Passing in a Worker instance​","type":1,"pageTitle":"Worker RxStorage","url":"/rx-storage-worker.html#passing-in-a-worker-instance","content":" Instead of setting an url as workerInput, you can also specify a function that returns a new Worker instance when called. getRxStorageWorker({ workerInput: () => new Worker('path/to/worker.js') }) This can be helpful for environments where the worker is build dynamically by the bundler. For example in angular you would create a my-custom.worker.ts file that contains a custom build worker and then import it. const storage = getRxStorageWorker({ workerInput: () => new Worker(new URL('./my-custom.worker', import.meta.url)), }); //> my-custom.worker.ts import { exposeWorkerRxStorage } from 'rxdb-premium/plugins/storage-worker'; import { getRxStorageIndexedDB } from 'rxdb-premium/plugins/storage-indexeddb'; exposeWorkerRxStorage({ storage: getRxStorageIndexedDB() }); ","version":"Next","tagName":"h2"},{"title":"SQLite RxStorage","type":0,"sectionRef":"#","url":"/rx-storage-sqlite.html","content":"","keywords":"","version":"Next"},{"title":"Performance comparison with other storages​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#performance-comparison-with-other-storages","content":" The SQLite storage is a bit slower compared to other Node.js based storages like the Filesystem Storage because wrapping SQLite has a bit of overhead and sending data from the JavaScript process to SQLite and backwards increases the latency. However for most hybrid apps the SQLite storage is the best option because it can leverage the SQLite version that comes already installed on the smartphones OS (iOS and android). Also for desktop electron apps it can be a viable solution because it is easy to ship SQLite together inside of the electron bundle. ","version":"Next","tagName":"h2"},{"title":"Using the SQLite RxStorage​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#using-the-sqlite-rxstorage","content":" There are two versions of the SQLite storage available for RxDB: The trial version which comes directly shipped with RxDB Core. It contains an SQLite storage that allows you to try out RxDB on devices that support SQLite, like React Native or Electron. While the trial version does pass the full RxDB storage test-suite, it is not made for production. It is not using indexes, has no attachment support, is limited to store 300 documents and fetches the whole storage state to run queries in memory. Use it for evaluation and prototypes only! The RxDB Premium 👑 version which contains the full production-ready SQLite storage. It contains a full load of performance optimizations and full query support. To use the SQLite storage you have to import getRxStorageSQLite from the RxDB Premium 👑 package and then add the correct sqliteBasics adapter depending on which sqlite module you want to use. This can then be used as storage when creating the RxDatabase. In the following you can see some examples for some of the most common SQLite packages. Trial Version RxDB Premium 👑 // Import the Trial SQLite Storage import { getRxStorageSQLiteTrial, getSQLiteBasicsNodeNative } from 'rxdb/plugins/storage-sqlite'; // Create a Storage for it, here we use the nodejs-native SQLite module // other SQLite modules can be used with a different sqliteBasics adapter import { DatabaseSync } from 'node:sqlite'; const storage = getRxStorageSQLiteTrial({ sqliteBasics: getSQLiteBasicsNodeNative(DatabaseSync) }); // Create a Database with the Storage const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: storage }); In the following, all examples are shown with the premium SQLite storage. Still they work the same with the trial version. ","version":"Next","tagName":"h2"},{"title":"SQLiteBasics​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#sqlitebasics","content":" Different SQLite libraries have different APIs to create and access the SQLite database. Therefore the library must be massaged to work with the RxDB SQlite storage. This is done in a so called SQLiteBasics interface. RxDB directly ships with a wide range of these for various SQLite libraries that are commonly used. Also creating your own one is pretty simple, check the source code of the existing ones for that. For example for the sqlite3 npm library we have the getSQLiteBasicsNode() implementation. For node:sqlite we have the getSQLiteBasicsNodeNative() implementation and so on.. ","version":"Next","tagName":"h2"},{"title":"Using the SQLite RxStorage with different SQLite libraries​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#using-the-sqlite-rxstorage-with-different-sqlite-libraries","content":" ","version":"Next","tagName":"h2"},{"title":"Usage with the sqlite3 npm package​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#usage-with-the-sqlite3-npm-package","content":" import { createRxDatabase } from 'rxdb'; import { getRxStorageSQLite, getSQLiteBasicsNode } from 'rxdb-premium/plugins/storage-sqlite'; /** * In Node.js, we use the SQLite database * from the 'sqlite' npm module. * @link https://www.npmjs.com/package/sqlite3 */ import sqlite3 from 'sqlite3'; const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: getRxStorageSQLite({ /** * Different runtimes have different interfaces to SQLite. * For example in node.js we have a callback API, * while in capacitor sqlite we have Promises. * So we need a helper object that is capable of doing the basic * sqlite operations. */ sqliteBasics: getSQLiteBasicsNode(sqlite3) }) }); ","version":"Next","tagName":"h3"},{"title":"Usage with the node:sqlite package​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#usage-with-the-node-package","content":" With Node.js version 22 and newer, you can use the "native" sqlite module that comes shipped with Node.js. import { createRxDatabase } from 'rxdb'; import { getRxStorageSQLite, getSQLiteBasicsNodeNative } from 'rxdb-premium/plugins/storage-sqlite'; import { DatabaseSync } from 'node:sqlite'; const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsNodeNative(DatabaseSync) }) }); ","version":"Next","tagName":"h3"},{"title":"Usage with Webassembly in the Browser​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#usage-with-webassembly-in-the-browser","content":" In the browser you can use the wa-sqlite package to run sQLite in Webassembly. The wa-sqlite module also allows to use persistence with IndexedDB or OPFS. Notice that in general SQLite via Webassembly is slower compared to other storages like IndexedDB or OPFS because sending data from the main thread to wasm and backwards is slow in the browser. Have a look the performance comparison. import { createRxDatabase } from 'rxdb'; import { getRxStorageSQLite, getSQLiteBasicsWasm } from 'rxdb-premium/plugins/storage-sqlite'; /** * In the Browser, we use the SQLite database * from the 'wa-sqlite' npm module. This contains the SQLite library * compiled to Webassembly * @link https://www.npmjs.com/package/wa-sqlite */ import SQLiteESMFactory from 'wa-sqlite/dist/wa-sqlite-async.mjs'; import SQLite from 'wa-sqlite'; const sqliteModule = await SQLiteESMFactory(); const sqlite3 = SQLite.Factory(module); const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsWasm(sqlite3) }) }); ","version":"Next","tagName":"h3"},{"title":"Usage with React Native​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#usage-with-react-native","content":" Install the react-native-quick-sqlite npm moduleImport getSQLiteBasicsQuickSQLite from the SQLite plugin and use it to create a RxDatabase: import { createRxDatabase } from 'rxdb'; import { getRxStorageSQLite, getSQLiteBasicsQuickSQLite } from 'rxdb-premium/plugins/storage-sqlite'; import { open } from 'react-native-quick-sqlite'; // create database const myRxDatabase = await createRxDatabase({ name: 'exampledb', multiInstance: false, // <- Set multiInstance to false when using RxDB in React Native storage: getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsQuickSQLite(open) }) }); If react-native-quick-sqlite does not work for you, as alternative you can use the react-native-sqlite-2 library instead: import { getRxStorageSQLite, getSQLiteBasicsWebSQL } from 'rxdb-premium/plugins/storage-sqlite'; import SQLite from 'react-native-sqlite-2'; const storage = getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsWebSQL(SQLite.openDatabase) }); ","version":"Next","tagName":"h3"},{"title":"Usage with Expo SQLite​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#usage-with-expo-sqlite","content":" Notice that expo-sqlite cannot be used on android (but it works on iOS) if you use Expo SDK version 50 or older. Please update to Version 50 or newer to use it. In the latest expo SDK version, use the getSQLiteBasicsExpoSQLiteAsync() method: import { createRxDatabase } from 'rxdb'; import { getRxStorageSQLite, getSQLiteBasicsExpoSQLiteAsync } from 'rxdb-premium/plugins/storage-sqlite'; import * as SQLite from 'expo-sqlite'; const myRxDatabase = await createRxDatabase({ name: 'exampledb', multiInstance: false, storage: getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsExpoSQLiteAsync(SQLite.openDatabaseAsync) }) }); In older Expo SDK versions, you might have to use the non-async API: import { createRxDatabase } from 'rxdb'; import { getRxStorageSQLite, getSQLiteBasicsExpoSQLite } from 'rxdb-premium/plugins/storage-sqlite'; import { openDatabase } from 'expo-sqlite'; const myRxDatabase = await createRxDatabase({ name: 'exampledb', multiInstance: false, storage: getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsExpoSQLite(openDatabase) }) }); ","version":"Next","tagName":"h3"},{"title":"Usage with SQLite Capacitor​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#usage-with-sqlite-capacitor","content":" Install the sqlite capacitor npm moduleAdd the iOS database location to your capacitor config { "plugins": { "CapacitorSQLite": { "iosDatabaseLocation": "Library/CapacitorDatabase" } } } Use the function getSQLiteBasicsCapacitor to get the capacitor sqlite wrapper. import { createRxDatabase } from 'rxdb'; import { getRxStorageSQLite, getSQLiteBasicsCapacitor } from 'rxdb-premium/plugins/storage-sqlite'; /** * Import SQLite from the capacitor plugin. */ import { CapacitorSQLite, SQLiteConnection } from '@capacitor-community/sqlite'; import { Capacitor } from '@capacitor/core'; const sqlite = new SQLiteConnection(CapacitorSQLite); const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: getRxStorageSQLite({ /** * Different runtimes have different interfaces to SQLite. * For example in node.js we have a callback API, * while in capacitor sqlite we have Promises. * So we need a helper object that is capable of doing the basic * sqlite operations. */ sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor) }) }); ","version":"Next","tagName":"h3"},{"title":"Usage with Tauri SQLite​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#usage-with-tauri-sqlite","content":" Add the Tauri SQL plugin to your Tauri project.Make sure to add sqlite as your database engine by running cargo add tauri-plugin-sql --features sqlite inside src-tauri.Use the getSQLiteBasicsTauri function to get the Tauri SQLite wrapper. import { createRxDatabase } from 'rxdb'; import { getRxStorageSQLite, getSQLiteBasicsTauri } from 'rxdb/plugins/storage-sqlite'; import sqlite3 from '@tauri-apps/plugin-sql'; const myRxDatabase = await createRxDatabase({ name: 'exampledb', storage: getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsTauri(sqlite3) }) }); ","version":"Next","tagName":"h3"},{"title":"Database Connection​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#database-connection","content":" If you need to access the database connection for any reason you can use getDatabaseConnection to do so: import { getDatabaseConnection } from 'rxdb-premium/plugins/storage-sqlite' It has the following signature: getDatabaseConnection( sqliteBasics: SQLiteBasics<any>, databaseName: string ): Promise<SQLiteDatabaseClass>; ","version":"Next","tagName":"h2"},{"title":"Known Problems of SQLite in JavaScript apps​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#known-problems-of-sqlite-in-javascript-apps","content":" Some JavaScript runtimes do not contain a Buffer API which is used by SQLite to store binary attachments data as BLOB. You can set storeAttachmentsAsBase64String: true if you want to store the attachments data as base64 string instead. This increases the database size but makes it work even without having a Buffer. The SQlite RxStorage works on SQLite libraries that use SQLite in version 3.38.0 (2022-02-22) or newer, because it uses the SQLite JSON methods like JSON_EXTRACT. If you get an error like [Error: no such function: JSON_EXTRACT (code 1 SQLITE_ERROR[1]), you might have a too old version of SQLite. To debug all SQL operations, you can pass a log function to getRxStorageSQLite() like this. This does not work with the trial version: const storage = getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor), // pass log function log: console.log.bind(console) }); By default, all tables will be created with the WITHOUT ROWID flag. Some tools like drizzle do not support tables with that option. You can disable it by setting withoutRowId: false when calling getRxStorageSQLite(): const storage = getRxStorageSQLite({ sqliteBasics: getSQLiteBasicsCapacitor(sqlite, Capacitor), withoutRowId: false }); ","version":"Next","tagName":"h2"},{"title":"Related​","type":1,"pageTitle":"SQLite RxStorage","url":"/rx-storage-sqlite.html#related","content":" React Native Databases ","version":"Next","tagName":"h2"},{"title":"Third Party Plugins","type":0,"sectionRef":"#","url":"/third-party-plugins.html","content":"Third Party Plugins rxdb-hooks A set of hooks to integrate RxDB into react applications.rxdb-flexsearch The full text search for RxDB using FlexSearch.rxdb-orion Enables replication with Laravel Orion.rxdb-supabase Enables replication with Supabase.rxdb-utils Additional features for RxDB like models, timestamps, default values, view and more.loki-async-reference-adapter Simple async adapter for LokiJS, suitable to use RxDB's Lokijs RxStorage with React Native.","keywords":"","version":"Next"},{"title":"Schema validation","type":0,"sectionRef":"#","url":"/schema-validation.html","content":"","keywords":"","version":"Next"},{"title":"validate-ajv​","type":1,"pageTitle":"Schema validation","url":"/schema-validation.html#validate-ajv","content":" A validation-module that does the schema-validation. This one is using ajv as validator which is a bit faster. Better compliant to the jsonschema-standard but also has a bigger build-size. import { wrappedValidateAjvStorage } from 'rxdb/plugins/validate-ajv'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; // wrap the validation around the main RxStorage const storage = wrappedValidateAjvStorage({ storage: getRxStorageLocalstorage() }); const db = await createRxDatabase({ name: randomCouchString(10), storage }); ","version":"Next","tagName":"h3"},{"title":"validate-z-schema​","type":1,"pageTitle":"Schema validation","url":"/schema-validation.html#validate-z-schema","content":" Both is-my-json-valid and validate-ajv use eval() to perform validation which might not be wanted when 'unsafe-eval' is not allowed in Content Security Policies. This one is using z-schema as validator which doesn't use eval. import { wrappedValidateZSchemaStorage } from 'rxdb/plugins/validate-z-schema'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; // wrap the validation around the main RxStorage const storage = wrappedValidateZSchemaStorage({ storage: getRxStorageLocalstorage() }); const db = await createRxDatabase({ name: randomCouchString(10), storage }); ","version":"Next","tagName":"h3"},{"title":"validate-is-my-json-valid​","type":1,"pageTitle":"Schema validation","url":"/schema-validation.html#validate-is-my-json-valid","content":" WARNING: The is-my-json-valid validation is no longer supported until this bug is fixed. The validate-is-my-json-valid plugin uses is-my-json-valid for schema validation. import { wrappedValidateIsMyJsonValidStorage } from 'rxdb/plugins/validate-is-my-json-valid'; import { getRxStorageLocalstorage } from 'rxdb/plugins/storage-localstorage'; // wrap the validation around the main RxStorage const storage = wrappedValidateIsMyJsonValidStorage({ storage: getRxStorageLocalstorage() }); const db = await createRxDatabase({ name: randomCouchString(10), storage }); ","version":"Next","tagName":"h3"},{"title":"Custom Formats​","type":1,"pageTitle":"Schema validation","url":"/schema-validation.html#custom-formats","content":" The schema validators provide methods to add custom formats like a email format. You have to add these formats before you create your database. ","version":"Next","tagName":"h2"},{"title":"Ajv Custom Format​","type":1,"pageTitle":"Schema validation","url":"/schema-validation.html#ajv-custom-format","content":" import { getAjv } from 'rxdb/plugins/validate-ajv'; const ajv = getAjv(); ajv.addFormat('email', { type: 'string', validate: v => v.includes('@') // ensure email fields contain the @ symbol }); ","version":"Next","tagName":"h3"},{"title":"Z-Schema Custom Format​","type":1,"pageTitle":"Schema validation","url":"/schema-validation.html#z-schema-custom-format","content":" import { ZSchemaClass } from 'rxdb/plugins/validate-z-schema'; ZSchemaClass.registerFormat('email', function (v: string) { return v.includes('@'); // ensure email fields contain the @ symbol }); ","version":"Next","tagName":"h3"},{"title":"Performance comparison of the validators​","type":1,"pageTitle":"Schema validation","url":"/schema-validation.html#performance-comparison-of-the-validators","content":" The RxDB team ran performance benchmarks using two storage options on an Ubuntu 24.04 machine with Chrome version 131.0.6778.85. The testing machine has 32 core 13th Gen Intel(R) Core(TM) i9-13900HX CPU. IndexedDB Storage (based on the IndexedDB API in the browser): IndexedDB Storage\tTime to First insert\tInsert 3000 documentsno validator\t68 ms\t213 ms ajv\t67 ms\t216 ms z-schema\t71 ms\t230 ms Memory Storage: stores everything in memory for extremely fast reads and writes, with no persistence by default. Often used with the RxDB memory-mapped plugin that processes data in memory an later persists to disc in background: Memory Storage\tTime to First insert\tInsert 3000 documentsno validator\t1.15 ms\t0.8 ms ajv\t3.05 ms\t2.7 ms z-schema\t0.9 ms\t18 ms Including a validator library also increases your JavaScript bundle size. Here's how it breaks down (minified + gzip): Build Size (minified+gzip)\tBuild Size (IndexedDB)\tBuild Size (memory)no validator\t73103 B\t39976 B ajv\t106135 B\t72773 B z-schema\t125186 B\t91882 B ","version":"Next","tagName":"h2"},{"title":"Why IndexedDB is slow and what to use instead","type":0,"sectionRef":"#","url":"/slow-indexeddb.html","content":"","keywords":"","version":"Next"},{"title":"Batched Cursor​","type":1,"pageTitle":"Why IndexedDB is slow and what to use instead","url":"/slow-indexeddb.html#batched-cursor","content":" With IndexedDB 2.0, new methods were introduced which can be utilized to improve performance. With the getAll() method, a faster alternative to the old openCursor() can be created which improves performance when reading data from the IndexedDB store. Lets say we want to query all user documents that have an age greater than 25 out of the store. To implement a fast batched cursor that only needs calls to getAll() and not to getAllKeys(), we first need to create an age index that contains the primary id as last field. myIndexedDBObjectStore.createIndex( 'age-index', [ 'age', 'id' ] ); This is required because the age field is not unique, and we need a way to checkpoint the last returned batch so we can continue from there in the next call to getAll(). const maxAge = 25; let result = []; const tx: IDBTransaction = db.transaction([storeName], 'readonly', TRANSACTION_SETTINGS); const store = tx.objectStore(storeName); const index = store.index('age-index'); let lastDoc; let done = false; /** * Run the batched cursor until all results are retrieved * or the end of the index is reached. */ while (done === false) { await new Promise((res, rej) => { const range = IDBKeyRange.bound( /** * If we have a previous document as checkpoint, * we have to continue from it's age and id values. */ [ lastDoc ? lastDoc.age : -Infinity, lastDoc ? lastDoc.id : -Infinity, ], [ maxAge + 0.00000001, String.fromCharCode(65535) ], true, false ); const openCursorRequest = index.getAll(range, batchSize); openCursorRequest.onerror = err => rej(err); openCursorRequest.onsuccess = e => { const subResult: TestDocument[] = e.target.result; lastDoc = lastOfArray(subResult); if (subResult.length === 0) { done = true; } else { result = result.concat(subResult); } res(); }; }); } console.dir(result); As the performance test results show, using a batched cursor can give a huge improvement. Interestingly choosing a high batch size is important. When you known that all results of a given IDBKeyRange are needed, you should not set a batch size at all and just directly query all documents via getAll(). RxDB uses batched cursors in the IndexedDB RxStorage. ","version":"Next","tagName":"h2"},{"title":"IndexedDB Sharding​","type":1,"pageTitle":"Why IndexedDB is slow and what to use instead","url":"/slow-indexeddb.html#indexeddb-sharding","content":" Sharding is a technique, normally used in server side databases, where the database is partitioned horizontally. Instead of storing all documents at one table/collection, the documents are split into so called shards and each shard is stored on one table/collection. This is done in server side architectures to spread the load between multiple physical servers which increases scalability. When you use IndexedDB in a browser, there is of course no way to split the load between the client and other servers. But you can still benefit from sharding. Partitioning the documents horizontally into multiple IndexedDB stores, has shown to have a big performance improvement in write- and read operations while only increasing initial pageload slightly. As shown in the performance test results, sharding should always be done by IDBObjectStore and not by database. Running a batched cursor over the whole dataset with 10 store shards in parallel is about 28% faster then running it over a single store. Initialization time increases minimal from 9 to 17 milliseconds. Getting a quarter of the dataset by batched iterating over an index, is even 43% faster with sharding then when a single store is queried. As downside, getting 10k documents by their id is slower when it has to run over the shards. Also it can be much effort to recombined the results from the different shards into the required query result. When a query without a limit is done, the sharding method might cause a data load huge overhead. Sharding can be used with RxDB with the Sharding Plugin. ","version":"Next","tagName":"h2"},{"title":"Custom Indexes​","type":1,"pageTitle":"Why IndexedDB is slow and what to use instead","url":"/slow-indexeddb.html#custom-indexes","content":" Indexes improve the query performance of IndexedDB significant. Instead of fetching all data from the storage when you search for a subset of it, you can iterate over the index and stop iterating when all relevant data has been found. For example to query for all user documents that have an age greater than 25, you would create an age+id index. To be able to run a batched cursor over the index, we always need our primary key (id) as the last index field. Instead of doing this, you can use a custom index which can improve the performance. The custom index runs over a helper field ageIdCustomIndex which is added to each document on write. Our index now only contains a single string field instead of two (age-number and id-string). // On document insert add the ageIdCustomIndex field. const idMaxLength = 20; // must be known to craft a custom index docData.ageIdCustomIndex = docData.age + docData.id.padStart(idMaxLength, ' '); store.put(docData); // ... // normal index myIndexedDBObjectStore.createIndex( 'age-index', [ 'age', 'id' ] ); // custom index myIndexedDBObjectStore.createIndex( 'age-index-custom', [ 'ageIdCustomIndex' ] ); To iterate over the index, you also use a custom crafted keyrange, depending on the last batched cursor checkpoint. Therefore the maxLength of id must be known. // keyrange for normal index const range = IDBKeyRange.bound( [25, ''], [Infinity, Infinity], true, false ); // keyrange for custom index const range = IDBKeyRange.bound( // combine both values to a single string 25 + ''.padStart(idMaxLength, ' '), Infinity, true, false ); As shown, using a custom index can further improve the performance of running a batched cursor by about 10%. Another big benefit of using custom indexes, is that you can also encode boolean values in them, which cannot be done with normal IndexedDB indexes. RxDB uses custom indexes in the IndexedDB RxStorage. ","version":"Next","tagName":"h2"},{"title":"Relaxed durability​","type":1,"pageTitle":"Why IndexedDB is slow and what to use instead","url":"/slow-indexeddb.html#relaxed-durability","content":" Chromium based browsers allow to set durability to relaxed when creating an IndexedDB transaction. Which runs the transaction in a less secure durability mode, which can improve the performance. The user agent may consider that the transaction has successfully committed as soon as all outstanding changes have been written to the operating system, without subsequent verification. As shown here, using the relaxed durability mode can improve performance slightly. The best performance improvement could be measured when many small transactions have to be run. Less, bigger transaction do not benefit that much. ","version":"Next","tagName":"h2"},{"title":"Explicit transaction commits​","type":1,"pageTitle":"Why IndexedDB is slow and what to use instead","url":"/slow-indexeddb.html#explicit-transaction-commits","content":" By explicitly committing a transaction, another slight performance improvement can be achieved. Instead of waiting for the browser to commit an open transaction, we call the commit() method to explicitly close it. // .commit() is not available on all browsers, so first check if it exists. if (transaction.commit) { transaction.commit() } The improvement of this technique is minimal, but observable as these tests show. ","version":"Next","tagName":"h2"},{"title":"In-Memory on top of IndexedDB​","type":1,"pageTitle":"Why IndexedDB is slow and what to use instead","url":"/slow-indexeddb.html#in-memory-on-top-of-indexeddb","content":" To prevent transaction handling and to fix the performance problems, we need to stop using IndexedDB as a database. Instead all data is loaded into the memory on the initial page load. Here all reads and writes happen in memory which is about 100x faster. Only some time after a write occurred, the memory state is persisted into IndexedDB with a single write transaction. In this scenario IndexedDB is used as a filesystem, not as a database. There are some libraries that already do that: LokiJS with the IndexedDB AdapterAbsurd-SQLSQL.js with the empscripten Filesystem APIDuckDB Wasm ","version":"Next","tagName":"h2"},{"title":"In-Memory: Persistence​","type":1,"pageTitle":"Why IndexedDB is slow and what to use instead","url":"/slow-indexeddb.html#in-memory-persistence","content":" One downside of not directly using IndexedDB, is that your data is not persistent all the time. And when the JavaScript process exists without having persisted to IndexedDB, data can be lost. To prevent this from happening, we have to ensure that the in-memory state is written down to the disc. One point is make persisting as fast as possible. LokiJS for example has the incremental-indexeddb-adapter which only saves new writes to the disc instead of persisting the whole state. Another point is to run the persisting at the correct point in time. For example the RxDB LokiJS storage persists in the following situations: When the database is idle and no write or query is running. In that time we can persist the state if any new writes appeared before.When the window fires the beforeunload event we can assume that the JavaScript process is exited any moment and we have to persist the state. After beforeunload there are several seconds time which are sufficient to store all new changes. This has shown to work quite reliable. The only missing event that can happen is when the browser exists unexpectedly like when it crashes or when the power of the computer is shut of. ","version":"Next","tagName":"h3"},{"title":"In-Memory: Multi Tab Support​","type":1,"pageTitle":"Why IndexedDB is slow and what to use instead","url":"/slow-indexeddb.html#in-memory-multi-tab-support","content":" One big difference between a web application and a 'normal' app, is that your users can use the app in multiple browser tabs at the same time. But when you have all database state in memory and only periodically write it to disc, multiple browser tabs could overwrite each other and you would loose data. This might not be a problem when you rely on a client-server replication, because the lost data might already be replicated with the backend and therefore with the other tabs. But this would not work when the client is offline. The ideal way to solve that problem, is to use a SharedWorker. A SharedWorker is like a WebWorker that runs its own JavaScript process only that the SharedWorker is shared between multiple contexts. You could create the database in the SharedWorker and then all browser tabs could request the Worker for data instead of having their own database. But unfortunately the SharedWorker API does not work in all browsers. Safari dropped its support and InternetExplorer or Android Chrome, never adopted it. Also it cannot be polyfilled. UPDATE:Apple added SharedWorkers back in Safari 142 Instead, we could use the BroadcastChannel API to communicate between tabs and then apply a leader election between them. The leader election ensures that, no matter how many tabs are open, always one tab is the Leader. The disadvantage is that the leader election process takes some time on the initial page load (about 150 milliseconds). Also the leader election can break when a JavaScript process is fully blocked for a longer time. When this happens, a good way is to just reload the browser tab to restart the election process. ","version":"Next","tagName":"h3"},{"title":"Further read​","type":1,"pageTitle":"Why IndexedDB is slow and what to use instead","url":"/slow-indexeddb.html#further-read","content":" Offline First Database ComparisonSpeeding up IndexedDB reads and writesSQLITE ON THE WEB: ABSURD-SQLSQLite in a PWA with FileSystemAccessAPIResponse to this article by Oren Eini ","version":"Next","tagName":"h2"},{"title":"Transactions, Conflicts and Revisions","type":0,"sectionRef":"#","url":"/transactions-conflicts-revisions.html","content":"","keywords":"","version":"Next"},{"title":"Why RxDB does not have transactions​","type":1,"pageTitle":"Transactions, Conflicts and Revisions","url":"/transactions-conflicts-revisions.html#why-rxdb-does-not-have-transactions","content":" When talking about transactions, we mean ACID transactions that guarantee the properties of atomicity, consistency, isolation and durability. With an ACID transaction you can mutate data dependent on the current state of the database. It is ensured that no other database operations happen in between your transaction and after the transaction has finished, it is guaranteed that the new data is actually written to the disc. To implement ACID transactions on a single server, the database has to keep track on who is running transactions and then schedule these transactions so that they can run in isolation. As soon as you have to split your database on multiple servers, transaction handling becomes way more difficult. The servers have to communicate with each other to find a consensus about which transaction can run and which has to wait. Network connections might break, or one server might complete its part of the transaction and then be required to roll back its changes because of an error on another server. But with RxDB you have multiple clients that can go randomly online or offline. The users can have different devices and the clock of these devices can go off by any time. To support ACID transactions here, RxDB would have to make the whole world stand still for all clients, while one client is doing a write operation. And even that can only work when all clients are online. Implementing that might be possible, but at the cost of an unpredictable amount of performance loss and not being able to support offline-first. A single write operation to a document is the only atomic thing you can do in RxDB. The benefits of not having to support transactions: Clients can read and write data without blocking each other.Clients can write data while being offline and then replicate with a server when they are online again, called offline-first.Creating a compatible backend for the replication is easy so that RxDB can replicate with any existing infrastructure.Optimizations like Sharding can be used. ","version":"Next","tagName":"h2"},{"title":"Revisions​","type":1,"pageTitle":"Transactions, Conflicts and Revisions","url":"/transactions-conflicts-revisions.html#revisions","content":" Working without transactions leads to having undefined state when doing multiple database operations at the same time. Most client side databases rely on a last-write-wins strategy on write operations. This might be a viable solution for some cases, but often this leads to strange problems that are hard to debug. Instead, to ensure that the behavior of RxDB is always predictable, RxDB relies on revisions for version control. Revisions work similar to Lamport Clocks. Each document is stored together with its revision string, that looks like 1-9dcca3b8e1a and consists of: The revision height, a number that starts with 1 and is increased with each write to that document.The database instance token. An operation to the RxDB data layer does not only contain the new document data, but also the previous document data with its revision string. If the previous revision matches the revision that is currently stored in the database, the write operation can succeed. If the previous revision is different than the revision that is currently stored in the database, the operation will throw a 409 CONFLICT error. ","version":"Next","tagName":"h2"},{"title":"Conflicts​","type":1,"pageTitle":"Transactions, Conflicts and Revisions","url":"/transactions-conflicts-revisions.html#conflicts","content":" There are two types of conflicts in RxDB, the local conflict and the replication conflict. ","version":"Next","tagName":"h2"},{"title":"Local conflicts​","type":1,"pageTitle":"Transactions, Conflicts and Revisions","url":"/transactions-conflicts-revisions.html#local-conflicts","content":" A local conflict can happen when a write operation assumes a different previous document state, than what is currently stored in the database. This can happen when multiple parts of your application do simultaneous writes to the same document. This can happen on a single browser tab, or when multiple tabs write at once or when a write appears while the document gets replicated from a remote server replication. When a local conflict appears, RxDB will throw a 409 CONFLICT error. The calling code must then handle the error properly, depending on the application logic. Instead of handling local conflicts, in most cases it is easier to ensure that they cannot happen, by using incremental database operations like incrementalModify(), incrementalPatch() or incrementalUpsert(). These write operations have a built-in way to handle conflicts by re-applying the mutation functions to the conflicting document state. ","version":"Next","tagName":"h3"},{"title":"Replication conflicts​","type":1,"pageTitle":"Transactions, Conflicts and Revisions","url":"/transactions-conflicts-revisions.html#replication-conflicts","content":" A replication conflict appears when multiple clients write to the same documents at once and these documents are then replicated to the backend server. When you replicate with the Graphql replication and the replication primitives, RxDB assumes that conflicts are detected and resolved at the client side. When a document is send to the backend and the backend detected a conflict (by comparing revisions or other properties), the backend will respond with the actual document state so that the client can compare this with the local document state and create a new, resolved document state that is then pushed to the server again. You can read more about the replication conflicts here. ","version":"Next","tagName":"h2"},{"title":"Custom conflict handler​","type":1,"pageTitle":"Transactions, Conflicts and Revisions","url":"/transactions-conflicts-revisions.html#custom-conflict-handler","content":" A conflict handler is an object with two JavaScript functions: Detect if two document states are equalSolve existing conflicts Because the conflict handler also is used for conflict detection, it will run many times on pull-, push- and write operations of RxDB. Most of the time it will detect that there is no conflict and then return. Lets have a look at the default conflict handler of RxDB to learn how to create a custom one: import { deepEqual } from 'rxdb/plugins/utils'; export const defaultConflictHandler: RxConflictHandler<any> = { isEqual(a, b) { /** * isEqual() is used to detect conflicts or to detect if a * document has to be pushed to the remote. * If the documents are deep equal, * we have no conflict. * Because deepEqual is CPU expensive, on your custom conflict handler you might only * check some properties, like the updatedAt time or revisions * for better performance. */ return deepEqual(a, b); }, resolve(i) { /** * The default conflict handler will always * drop the fork state and use the master state instead. * * In your custom conflict handler you likely want to merge properties * of the realMasterState and the newDocumentState instead. */ return i.realMasterState; } }; To overwrite the default conflict handler, you have to specify a custom conflictHandler property when creating a collection with addCollections(). const myCollections = await myDatabase.addCollections({ // key = collectionName humans: { schema: mySchema, conflictHandler: myCustomConflictHandler } }); ","version":"Next","tagName":"h2"},{"title":"Using RxDB with TypeScript","type":0,"sectionRef":"#","url":"/tutorials/typescript.html","content":"","keywords":"","version":"Next"},{"title":"Using the types​","type":1,"pageTitle":"Using RxDB with TypeScript","url":"/tutorials/typescript.html#using-the-types","content":" Now that we have declare all our types, we can use them. /** * create database and collections */ const myDatabase: MyDatabase = await createRxDatabase<MyDatabaseCollections>({ name: 'mydb', storage: getRxStorageLocalstorage() }); const heroSchema: RxJsonSchema<HeroDocType> = { title: 'human schema', description: 'describes a human being', version: 0, keyCompression: true, primaryKey: 'passportId', type: 'object', properties: { passportId: { type: 'string' }, firstName: { type: 'string' }, lastName: { type: 'string' }, age: { type: 'integer' } }, required: ['passportId', 'firstName', 'lastName'] }; const heroDocMethods: HeroDocMethods = { scream: function(this: HeroDocument, what: string) { return this.firstName + ' screams: ' + what.toUpperCase(); } }; const heroCollectionMethods: HeroCollectionMethods = { countAllDocuments: async function(this: HeroCollection) { const allDocs = await this.find().exec(); return allDocs.length; } }; await myDatabase.addCollections({ heroes: { schema: heroSchema, methods: heroDocMethods, statics: heroCollectionMethods } }); // add a postInsert-hook myDatabase.heroes.postInsert( function myPostInsertHook( this: HeroCollection, // own collection is bound to the scope docData: HeroDocType, // documents data doc: HeroDocument // RxDocument ) { console.log('insert to ' + this.name + '-collection: ' + doc.firstName); }, false // not async ); /** * use the database */ // insert a document const hero: HeroDocument = await myDatabase.heroes.insert({ passportId: 'myId', firstName: 'piotr', lastName: 'potter', age: 5 }); // access a property console.log(hero.firstName); // use a orm method hero.scream('AAH!'); // use a static orm method from the collection const amount: number = await myDatabase.heroes.countAllDocuments(); console.log(amount); /** * clean up */ myDatabase.close(); ","version":"Next","tagName":"h2"},{"title":"Why UI applications need NoSQL","type":0,"sectionRef":"#","url":"/why-nosql.html","content":"","keywords":"","version":"Next"},{"title":"Transactions do not work with humans involved​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#transactions-do-not-work-with-humans-involved","content":" On the server side, transactions are used to run steps of logic inside of a self contained unit of work. The database system ensures that multiple transactions do not run in parallel or interfere with each other. This works well because on the server side you can predict how longer everything takes. It can be ensured that one transaction does not block everything else for too long which would make the system not responding anymore to other requests. When you build a UI based application that is used by a real human, you can no longer predict how long anything takes. The user clicks the edit button and expects to not have anyone else change the document while the user is in edit mode. Using a transaction to ensure nothing is changed in between, is not an option because the transaction could be open for a long time and other background tasks, like replication, would no longer work. So whenever a human is involved, this kind of logic has to be implemented using other strategies. Most NoSQL databases like RxDB or CouchDB use a system based on revision and conflicts to handle these. ","version":"Next","tagName":"h2"},{"title":"Transactions do not work with offline-first​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#transactions-do-not-work-with-offline-first","content":" When you want to build an offline-first application, it is assumed that the user can also read and write data, even when the device has lost the connection to the backend. You could use database transactions on writes to the client's database state, but enforcing a transaction boundary across other instances like clients or servers, is not possible when there is no connection. On the client you could run an update query where all color: red rows are changed to color: blue, but this would not guarantee that there will still be other red documents when the client goes online again and restarts the replication with the server. UPDATE docs SET docs.color = 'red' WHERE docs.color = 'blue'; ","version":"Next","tagName":"h2"},{"title":"Relational queries in NoSQL​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#relational-queries-in-nosql","content":" What most people want from a relational database, is to run queries over multiple tables. Some people think that they cannot do that with NoSQL, so let me explain. Let's say you have two tables with customers and cities where each city has an id and each customer has a city_id. You want to get every customer that resides in Tokyo. With SQL, you would use a query like this: SELECT * FROM city WHERE city.name = 'Tokyo' LEFT JOIN customer ON customer.city_id = city.id; With NoSQL you can just do the same, but you have to write it manually: const cityDocument = await db.cities.findOne().where('name').equals('Tokyo').exec(); const customerDocuments = await db.customers.find().where('city_id').equals(cityDocument.id).exec(); So what are the differences? The SQL version would run faster on a remote database server because it would aggregate all data there and return only the customers as result set. But when you have a local database, it is not really a difference. Querying the two tables by hand would have about the same performance as a JavaScript implementation of SQL that is running locally. The main benefit from using SQL is, that the SQL query runs inside of a single transaction. When a change to one of our two tables happens, while our query runs, the SQL database will ensure that the write does not affect the result of the query. This could happen with NoSQL, while you retrieve the city document, the customer table gets changed and your result is not correct for the dataset that was there when you started the querying. As a workaround, you could observe the database for changes and if a change happened in between, you have to re-run everything. ","version":"Next","tagName":"h2"},{"title":"Reliable replication​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#reliable-replication","content":" In an offline first app, your data is replicated from your backend servers to your users and you want it to be reliable. The replication is reliable when, no matter what happens, every online client is able to run a replication and end up with the exact same database state as any other client. Implementing a reliable replication protocol is hard because of the circumstances of your app: Your users have unknown devices.They have an unknown internet speed.They can go offline or online at any time.Clients can be offline for a several days with un-synced changes.You can have many users at the same time.The users can do many database writes at the same time to the same entities. Now lets say you have a SQL database and one of your users, called Alice, runs a query that mutates some rows, based on a condition. # mark all items out of stock as inStock=FALSE UPDATE Table_A SET Table_A.inStock = FALSE FROM Table_A WHERE Table_A.amountInStock = 0 At first, the query runs on the local database of Alice and everything is fine. But at the same time Bob, the other client, updates a row and sets amountInStock from 0 to 1. Now Bob's client replicates the changes from Alice and runs them. Bob will end up with a different database state than Alice because on one of the rows, the WHERE condition was not met. This is not what we want, so our replication protocol should be able to fix it. For that it has to reduce all mutations into a deterministic state. Let me loosely describe how "many" SQL replications work: Instead of just running all replicated queries, we remember a list of all past queries. When a new query comes in that happened before our last query, we roll back the previous queries, run the new query, and then re-execute our own queries on top of that. For that to work, all queries need a timestamp so we can order them correctly. But you cannot rely on the clock that is running at the client. Client side clocks drift, they can run in a different speed or even a malicious client modifies the clock on purpose. So instead of a normal timestamp, we have to use a Hybrid Logical Clock that takes a client generated id and the number of the clients query into account. Our timestamp will then look like 2021-10-04T15:29.40.273Z-0000-eede1195b7d94dd5. These timestamps can be brought into a deterministic order and each client can run the replicated queries in the same order. While this sounds easy and realizable, we have some problems: This kind of replication works great when you replicate between multiple SQL servers. It does not work great when you replicate between a single server and many clients. As mentioned above, clients can be offline for a long time which could require us to do many and heavy rollbacks on each client when someone comes back after a long time and replicates the change.We have many clients where many changes can appear and our database would have to roll back many times.During the rollback, the database cannot be used for read queries.It is required that each client downloads and keeps the whole query history. With NoSQL, replication works different. A new client downloads all current documents and each time a document changes, that document is downloaded again. Instead of replicating the query that leads to a data change, we just replicate the changed data itself. Of course, we could do the same with SQL and just replicate the affected rows of a query, like WatermelonDB does it. This was a clever way to go for WatermelonDB, because it was initially made for React Native and did want to use the fast SQLite instead of the slow AsyncStorage. But in a more general view, it defeats the whole purpose of having a replicating relational database because you have transactions locally, but these transactions become meaningless as soon as the data goes through the replication layer. ","version":"Next","tagName":"h2"},{"title":"Server side validation​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#server-side-validation","content":" Whenever there is client-side input, it must be validated on the server. On a NoSQL database, validating a changed document is trivial. The client sends the changed document to the server, and the server can then check if the user was allowed to modify that one document and if the applied changes are ok. Safely validating a SQL query is up to impossible. You first need a way to parse the query with all this complex SQL syntax and keywords.You have to ensure that the query does not DOS your system.Then you check which rows would be affected when running the query and if the user was allowed to change themThen you check if the mutation to that rows are valid. For simple queries like an insert/update/delete to a single row, this might be doable. But a query with 4 LEFT JOIN will be hard. ","version":"Next","tagName":"h2"},{"title":"Event optimization​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#event-optimization","content":" With NoSQL databases, each write event always affects exactly one document. This makes it easy to optimize the processing of events at the client. For example instead of handling multiple updates to the same document, when the user comes online again, you could skip everything but the last event. Similar to that you can optimize observable query results. When you query the customers table you get a query result of 10 customers. Now a new customer is added to the table and you want to know how the new query results look like. You could analyze the event and now you know that you only have to add the new customer to the previous results set, instead of running the whole query again. These types of optimizations can be run with all NoSQL queries and even work with limit and skip operators. In RxDB this all happens in the background with the EventReduce algorithm that calculates new query results on incoming changes. These optimizations do not really work with relational data. A change to one table could affect a query to any other tables. and you could not just calculate the new results based on the event. You would always have to re-run the full query to get the updated results. ","version":"Next","tagName":"h2"},{"title":"Migration without relations​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#migration-without-relations","content":" Sooner or later you change the layout of your data. You update the schema and you also have to migrate the stored rows/documents. In NoSQL this is often not a big deal because all of your documents are modeled as self containing piece of data. There is an old version of the document and you have a function that transforms it into the new version. With relational data, nothing is self-contained. The relevant data for the migration of a single row could be inside any other table. So when changing the schema, it will be important which table to migrate first and how to orchestrate the migration or relations. On client side applications, this is even harder because the client can close the application at any time and the migration must be able to continue. ","version":"Next","tagName":"h2"},{"title":"Everything can be downgraded to NoSQL​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#everything-can-be-downgraded-to-nosql","content":" To use an offline first database in the frontend, you have to make it compatible with your backend APIs. Making software things compatible often means you have to find the lowest common denominator. When you have SQLite in the frontend and want to replicate it with the backend, the backend also has to use SQLite. You cannot even use PostgreSQL because it has a different SQL dialect and some queries might fail. But you do not want to let the frontend dictate which technologies to use in the backend just to make replication work. With NoSQL, you just have documents and writes to these documents. You can build a document based layer on top of everything by removing functionality. It can be built on top of SQL, but also on top of a graph database or even on top of a key-value store like levelDB or FoundationDB. With that document layer you can build a Sync Engine that serves documents sorted by the last update time and there you have a realtime replication. ","version":"Next","tagName":"h2"},{"title":"Caching query results​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#caching-query-results","content":" Memory is limited and this is especially true for client side applications where you never know how much free RAM the device really has. You want to have a fast realtime UI, so your database must be able to cache query results. When you run a SQL query like SELECT .. the result of it can be anything. An array, a number, a string, a single row, it depends on how the query goes on. So the caching strategy can only be to keep the result in memory, once for each query. This scales very bad because the more queries you run, the more results you have to store in memory. When you make a query to a NoSQL collection, you always know how the result will look like. It is a list of documents, based on the collection's schema (if you have one). The result set is stored in memory, but because you get similar documents for different queries to the same collection, we can de-duplicated the documents. So when multiple queries return the same document, we only have it in the cache once and each query caches point to the same memory object. So no matter how many queries you make, your cache maximum is the collection size. ","version":"Next","tagName":"h2"},{"title":"TypeScript support​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#typescript-support","content":" Modern web apps are build with TypeScript and you want the transpiler to know the types of your query result so it can give you build time errors when something does not match. This is quite easy on document based systems. The typings of for each document of a collection can be generated from the schema, and all queries to that collection will always return the given document type. With SQL you have to manually write the typings for each query by hand because it can contain all these aggregate functions that affect the type of the query's result. ","version":"Next","tagName":"h2"},{"title":"What you lose with NoSQL​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#what-you-lose-with-nosql","content":" You can not run relational queries across tables inside a single transaction.You can not mutate documents based on a WHERE clause, in a single transaction.You need to resolve replication conflicts on a per-document basis. ","version":"Next","tagName":"h2"},{"title":"But there is database XY​","type":1,"pageTitle":"Why UI applications need NoSQL","url":"/why-nosql.html#but-there-is-database-xy","content":" Yes, there are SQL databases out there that run on the client side or have replication, but not both. WebSQL / sql.js: In the past there was WebSQL in the browser. It was a direct mapping to SQLite because all browsers used the SQLite implementation. You could store relational data in it, but there was no concept of replication at any point in time. sql.js is an SQLite complied to JavaScript. It has not replication and it has (for now) no persistent storage, everything is stored in memory.WatermelonDB is a SQL databases that runs in the client. WatermelonDB uses a document-based replication that is not able to replicate relational queries.Cockroach / Spanner/ PostgreSQL etc. are SQL databases with replication. But they run on servers, not on clients, so they can make different trade offs. Further read Cockroach Labs: Living Without Atomic Clocks Transactions, Conflicts and Revisions in RxDB Why MongoDB, Cassandra, HBase, DynamoDB, and Riak will only let you perform transactions on a single data item Make a PR to this file if you have more interesting links to that topic ","version":"Next","tagName":"h2"}],"options":{"excludeRoutes":["blog","releases"],"id":"default"}} \ No newline at end of file diff --git a/docs/sem/angular-database/index.html b/docs/sem/angular-database/index.html deleted file mode 100644 index 5cfb471affc..00000000000 --- a/docs/sem/angular-database/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -The local Database for Angular Apps | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    The local Database for Angular Apps

    The easiest way to store and sync Data in Angular

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between Angular clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the Angular client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your Angular app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/browser-database/index.html b/docs/sem/browser-database/index.html deleted file mode 100644 index b0d2fff1d8e..00000000000 --- a/docs/sem/browser-database/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -The local Database for Browsers | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    The easiest way to store and sync Data in a Browser

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between Browser clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the Browser client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your Browser app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/capacitor-database/index.html b/docs/sem/capacitor-database/index.html deleted file mode 100644 index 5082fc295d4..00000000000 --- a/docs/sem/capacitor-database/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -Capacitor Database | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Capacitor Database

    The easiest way to store and sync Data in Capacitor

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between Capacitor clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the Capacitor client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your Capacitor app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/electron-database/index.html b/docs/sem/electron-database/index.html deleted file mode 100644 index a32b3b7884a..00000000000 --- a/docs/sem/electron-database/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -Local Electron Database | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Local Electron Database

    The easiest way to store and sync Data in Electron

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between Electron clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the Electron client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your Electron app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/expo-database/index.html b/docs/sem/expo-database/index.html deleted file mode 100644 index dcefb5d1794..00000000000 --- a/docs/sem/expo-database/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -The local Database for Expo | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    The local Database for Expo

    The easiest way to store and sync Data in Expo

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between Expo clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the Expo client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your Expo app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/firestore-alternative/index.html b/docs/sem/firestore-alternative/index.html deleted file mode 100644 index e6b13884e9e..00000000000 --- a/docs/sem/firestore-alternative/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -The Open Source alternative for Firestore | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    The Open Source alternative for Firestore

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/gads/index.html b/docs/sem/gads/index.html deleted file mode 100644 index 8903b07af73..00000000000 --- a/docs/sem/gads/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -The local Database for Apps | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    The easiest way to store and sync Data inside of your App

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/indexeddb-database-2/index.html b/docs/sem/indexeddb-database-2/index.html deleted file mode 100644 index 2a7f4b4b898..00000000000 --- a/docs/sem/indexeddb-database-2/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -The best Database on top of IndexedDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    The easiest way to store and sync Data in IndexedDB

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between Browser clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the Browser client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your Browser app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/indexeddb-database/index.html b/docs/sem/indexeddb-database/index.html deleted file mode 100644 index 2cce731b45d..00000000000 --- a/docs/sem/indexeddb-database/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -The best Database on top of IndexedDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    The easiest way to store and sync Data in IndexedDB

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between Browser clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the Browser client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your Browser app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/ionic-database/index.html b/docs/sem/ionic-database/index.html deleted file mode 100644 index 05b75bdadea..00000000000 --- a/docs/sem/ionic-database/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -The local Database for Ionic Apps | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    The local Database for Ionic Apps

    The easiest way to store and sync Data in Ionic

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between Ionic clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the Ionic client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your Ionic app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/localstorage-database/index.html b/docs/sem/localstorage-database/index.html deleted file mode 100644 index d25bbb93c0d..00000000000 --- a/docs/sem/localstorage-database/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -The best Database on top of localstorage | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    The easiest way to store and sync Data in LocalStorage

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between Browser clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the Browser client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your Browser app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/nedb-alternative/index.html b/docs/sem/nedb-alternative/index.html deleted file mode 100644 index e090d7ce53a..00000000000 --- a/docs/sem/nedb-alternative/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -The modern alternative for NeDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    The modern alternative for NeDB

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between Browser clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the Browser client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your Browser app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/nodejs-database/index.html b/docs/sem/nodejs-database/index.html deleted file mode 100644 index ff7a370f017..00000000000 --- a/docs/sem/nodejs-database/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -The local Database for Node.js | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    The easiest way to store and sync Data in Node.js

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between Node.js clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the Node.js client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your Node.js app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/nosql-database/index.html b/docs/sem/nosql-database/index.html deleted file mode 100644 index 73067bd12ea..00000000000 --- a/docs/sem/nosql-database/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -The NoSQL Database for JavaScript Applications | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    The easiest way to store and sync NoSQL Data

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/pouchdb-alternative/index.html b/docs/sem/pouchdb-alternative/index.html deleted file mode 100644 index 0014b159eec..00000000000 --- a/docs/sem/pouchdb-alternative/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -The NoSQL alternative for PouchDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    The modern alternative for PouchDB

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/react-database/index.html b/docs/sem/react-database/index.html deleted file mode 100644 index 6c315802ef7..00000000000 --- a/docs/sem/react-database/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -The local Database for React Apps | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    The local Database for React Apps

    The easiest way to store and sync Data in React

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between React clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the React client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your React app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/react-native-database/index.html b/docs/sem/react-native-database/index.html deleted file mode 100644 index c2705bb80ab..00000000000 --- a/docs/sem/react-native-database/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -The local Database for React Native | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    The local Database for React Native

    The easiest way to store and sync Data in React Native

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between React Native clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the React Native client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your React Native app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/reddit/index.html b/docs/sem/reddit/index.html deleted file mode 100644 index 5dcdb281bba..00000000000 --- a/docs/sem/reddit/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -The local Database for Angular Apps | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    The easiest way to store and sync Data

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between Angular clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the Angular client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your Angular app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/svelte-database/index.html b/docs/sem/svelte-database/index.html deleted file mode 100644 index 2e3292fb1dc..00000000000 --- a/docs/sem/svelte-database/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -The local Database for Svelte Apps | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    The local Database for Svelte Apps

    The easiest way to store and sync Data in Svelte

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between Svelte clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the Svelte client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your Svelte app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/vue-database/index.html b/docs/sem/vue-database/index.html deleted file mode 100644 index 04c1273c77f..00000000000 --- a/docs/sem/vue-database/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -The local Database for Vue.js Apps | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    The local Database for Vue.js Apps

    The easiest way to store and sync Data in Vue.js

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between Vue.js clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the Vue.js client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your Vue.js app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/sem/watermelondb-alternative/index.html b/docs/sem/watermelondb-alternative/index.html deleted file mode 100644 index 15f3971a83a..00000000000 --- a/docs/sem/watermelondb-alternative/index.html +++ /dev/null @@ -1,287 +0,0 @@ - - - - - -The NoSQL alternative for WatermelonDB | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    The NoSQL alternative for WatermelonDB

    RxDB is a NoSQL database for JavaScript that runs directly in your app. With a local-first design, it delivers zero-latency queries even offline, and syncs seamlessly with many backends. With observable queries, your UI updates instantly as data changes.

    • Build apps that work offline
    • Sync with any Backend
    • Observable Realtime Queries
    • All JavaScript Runtimes Supported
    Use RxDB with
    these Frameworks

    Sync with any Backend

    RxDB's easy-to-use Sync Engine powers realtime synchronization between clients and servers. Either use one of our prebuild replication plugins...

    OR

    ...sync with your custom server by implementing only three simple endpoints.

    icon
    RxDB GitHub
    Open Source
    GitHub
    stars
    22,869

    Online is Optional

    RxDB adopts the local-first approach by storing data locally on the client and managing continuous synchronization. You can even run your app entirely without a backend.

    • Keep your app running offline
    • Run local queries with zero latency
    • Simplify and speed up development
    • Reduces backend load and scales better
    RxDB MongoDB
    Official Partner
    MongoDB

    Trusted by Developers

    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    The Easiest Way to Store Data
    04:28
    The Easiest Way to Store Data
    This solved a problem I've had in Angular for years
    03:45
    This solved a problem I've had in Angular for years
    Say goodbye to REST APIs with RxDB
    14:23
    Say goodbye to REST APIs with RxDB
    Build REAL TIME Applications easily 👩‍💻
    00:52
    Build REAL TIME Applications easily 👩‍💻
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    34:17
    Nuxt Nation 2024: Ben Hong - Embracing Local-First Apps with Nuxt
    RxDB Discord
    Chat on
    Discord
    members
    1,321

    Used by Thousands Worldwide

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)

    We use RxDB because it works across multiple platforms and we need to store of a great deal of data, some users have tens of thousands of documents! RxDB was the only cross-platform, offline-first solution with good enough performance to meet our needs.

    logo
    Readwise (USA)

    We use RxDB for our offline-first inspection software. It ensures accurate data even under poor connectivity, while its single interface for multiple databases streamlines development. RxDB's flexibility also supports easy expansion to more platforms and environments.

    logo
    SafeEx (Denmark)

    We use RxDB in our global offline-first app for technicians. Its robust features and total control ensure reliable performance, even with poor connectivity, resulting in a seamless maintenance solution.

    logo
    WebWare (Italy)

    We rely on RxDB to manage all our data in one place. Our custom store became unwieldy, so we switched to RxDB for schema migrations, real-time replication, conflict resolution, and reactive programming. Its push and pull handlers also integrate smoothly with our existing APIs.

    logo
    myAgro (Africa)

    We provide a mobile app that is used by people in the - field to fill in valuable information like inspections, - surveys and audits. Our users don't always have access to the internet, building from an Offline-first approach with RxDB allows us to have the data integrity we need without being online.

    logo
    MoreApp (Germany)

    We use RxDB to create applications capable of being - used in the most remote areas where Internet access is - really a challenge.

    ALTGRAS (Guinea)

    We use RxDB to provide an offline first, cross platform - point of sale system. With RxDB we could create a web-, desktop- and mobile app using the same code base.

    logo
    WooCommerce POS (Australia)

    RxDB is a main component in building offline-ready - multichannel apps. It has become our default stack for - this kind of apps.

    logo
    atroo GmbH (Germany)

    With RxDB we have built an offline capable Progressive Web Application that is used by our borer operators to report on conditions at the mineface.

    logo
    Nutrien (Canada)
    RxDB Supabase
    Official Partner
    Supabase

    Core Concepts

    RxDB uses JSON Schema, a format widely recognized by developers through tools like OpenAPI or Swagger. Because JSON Schema is so well-established, it integrates seamlessly with existing validators, editors, and development tooling, making schema design both simple and highly flexible.

    A minimal RxDB schema might define fields, data types, and indexes in a fully declarative way. For example:

    const heroSchema = {
    -  title: 'hero schema',
    -  version: 0,
    -  primaryKey: 'id',
    -  type: 'object',
    -  properties: {
    -    id: {
    -        type: 'string',
    -        maxLength: 100
    -    },
    -    name: {
    -        type: 'string'
    -    },
    -    power: {
    -        type: 'string'
    -    },
    -    age: {
    -        type: 'number'
    -    }
    -  },
    -  required: ['id', 'name']
    -};
    - - \ No newline at end of file diff --git a/docs/service-submitted/index.html b/docs/service-submitted/index.html deleted file mode 100644 index 9b5d3157f7a..00000000000 --- a/docs/service-submitted/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -Service Request Submitted - RxDB - JavaScript Database | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -






    RxDB Service Form Submitted


    Thank you for submitting the form. You will directly get a confirmation email.
    Please check your spam folder!.
    In the next 24 hours you will get a full answer via email.



    - - \ No newline at end of file diff --git a/docs/sitemap.xml b/docs/sitemap.xml deleted file mode 100644 index d5e32fe2d34..00000000000 --- a/docs/sitemap.xml +++ /dev/null @@ -1 +0,0 @@ -https://rxdb.info/chatweekly0.5https://rxdb.info/codeweekly0.5https://rxdb.info/consultingweekly0.5https://rxdb.info/demo-submittedweekly0.5https://rxdb.info/licenseweekly0.5https://rxdb.info/markdown-pageweekly0.5https://rxdb.info/meetingweekly0.5https://rxdb.info/meeting-paidweekly0.5https://rxdb.info/meeting-paid-starterweekly0.5https://rxdb.info/newsletterweekly0.5https://rxdb.info/premiumweekly0.5https://rxdb.info/premium-submittedweekly0.5https://rxdb.info/sem/angular-databaseweekly0.5https://rxdb.info/sem/browser-databaseweekly0.5https://rxdb.info/sem/capacitor-databaseweekly0.5https://rxdb.info/sem/electron-databaseweekly0.5https://rxdb.info/sem/expo-databaseweekly0.5https://rxdb.info/sem/firestore-alternativeweekly0.5https://rxdb.info/sem/gadsweekly0.5https://rxdb.info/sem/indexeddb-databaseweekly0.5https://rxdb.info/sem/indexeddb-database-2weekly0.5https://rxdb.info/sem/ionic-databaseweekly0.5https://rxdb.info/sem/localstorage-databaseweekly0.5https://rxdb.info/sem/nedb-alternativeweekly0.5https://rxdb.info/sem/nodejs-databaseweekly0.5https://rxdb.info/sem/nosql-databaseweekly0.5https://rxdb.info/sem/pouchdb-alternativeweekly0.5https://rxdb.info/sem/react-databaseweekly0.5https://rxdb.info/sem/react-native-databaseweekly0.5https://rxdb.info/sem/redditweekly0.5https://rxdb.info/sem/svelte-databaseweekly0.5https://rxdb.info/sem/vue-databaseweekly0.5https://rxdb.info/sem/watermelondb-alternativeweekly0.5https://rxdb.info/service-submittedweekly0.5https://rxdb.info/surveyweekly0.5https://rxdb.info/weekly0.5https://rxdb.info/adapters.htmlweekly0.5https://rxdb.info/alternatives.htmlweekly0.5https://rxdb.info/articles/angular-database.htmlweekly0.5https://rxdb.info/articles/angular-indexeddb.htmlweekly0.5https://rxdb.info/articles/browser-database.htmlweekly0.5https://rxdb.info/articles/browser-storage.htmlweekly0.5https://rxdb.info/articles/data-base.htmlweekly0.5https://rxdb.info/articles/embedded-database.htmlweekly0.5https://rxdb.info/articles/firebase-realtime-database-alternative.htmlweekly0.5https://rxdb.info/articles/firestore-alternative.htmlweekly0.5https://rxdb.info/articles/flutter-database.htmlweekly0.5https://rxdb.info/articles/frontend-database.htmlweekly0.5https://rxdb.info/articles/ideasweekly0.5https://rxdb.info/articles/in-memory-nosql-database.htmlweekly0.5https://rxdb.info/articles/indexeddb-max-storage-limit.htmlweekly0.5https://rxdb.info/articles/ionic-database.htmlweekly0.5https://rxdb.info/articles/ionic-storage.htmlweekly0.5https://rxdb.info/articles/javascript-vector-database.htmlweekly0.5https://rxdb.info/articles/jquery-database.htmlweekly0.5https://rxdb.info/articles/json-based-database.htmlweekly0.5https://rxdb.info/articles/json-database.htmlweekly0.5https://rxdb.info/articles/local-database.htmlweekly0.5https://rxdb.info/articles/local-first-future.htmlweekly0.5https://rxdb.info/articles/localstorage-indexeddb-cookies-opfs-sqlite-wasm.htmlweekly0.5https://rxdb.info/articles/localstorage.htmlweekly0.5https://rxdb.info/articles/mobile-database.htmlweekly0.5https://rxdb.info/articles/offline-database.htmlweekly0.5https://rxdb.info/articles/optimistic-ui.htmlweekly0.5https://rxdb.info/articles/progressive-web-app-database.htmlweekly0.5https://rxdb.info/articles/react-database.htmlweekly0.5https://rxdb.info/articles/react-indexeddb.htmlweekly0.5https://rxdb.info/articles/react-native-encryption.htmlweekly0.5https://rxdb.info/articles/reactjs-storage.htmlweekly0.5https://rxdb.info/articles/realtime-database.htmlweekly0.5https://rxdb.info/articles/vue-database.htmlweekly0.5https://rxdb.info/articles/vue-indexeddb.htmlweekly0.5https://rxdb.info/articles/websockets-sse-polling-webrtc-webtransport.htmlweekly0.5https://rxdb.info/articles/zero-latency-local-first.htmlweekly0.5https://rxdb.info/backup.htmlweekly0.5https://rxdb.info/capacitor-database.htmlweekly0.5https://rxdb.info/cleanup.htmlweekly0.5https://rxdb.info/contribution.htmlweekly0.5https://rxdb.info/crdt.htmlweekly0.5https://rxdb.info/data-migration.htmlweekly0.5https://rxdb.info/dev-mode.htmlweekly0.5https://rxdb.info/downsides-of-offline-first.htmlweekly0.5https://rxdb.info/electron-database.htmlweekly0.5https://rxdb.info/electron.htmlweekly0.5https://rxdb.info/encryption.htmlweekly0.5https://rxdb.info/errors.htmlweekly0.5https://rxdb.info/fulltext-search.htmlweekly0.5https://rxdb.info/install.htmlweekly0.5https://rxdb.info/key-compression.htmlweekly0.5https://rxdb.info/leader-election.htmlweekly0.5https://rxdb.info/logger.htmlweekly0.5https://rxdb.info/middleware.htmlweekly0.5https://rxdb.info/migration-schema.htmlweekly0.5https://rxdb.info/migration-storage.htmlweekly0.5https://rxdb.info/nodejs-database.htmlweekly0.5https://rxdb.info/nosql-performance-tips.htmlweekly0.5https://rxdb.info/offline-first.htmlweekly0.5https://rxdb.info/orm.htmlweekly0.5https://rxdb.info/overview.htmlweekly0.5https://rxdb.info/plugins.htmlweekly0.5https://rxdb.info/population.htmlweekly0.5https://rxdb.info/query-cache.htmlweekly0.5https://rxdb.info/query-optimizer.htmlweekly0.5https://rxdb.info/quickstart.htmlweekly0.5https://rxdb.info/react-native-database.htmlweekly0.5https://rxdb.info/react.htmlweekly0.5https://rxdb.info/reactivity.htmlweekly0.5https://rxdb.info/releases/10.0.0.htmlweekly0.5https://rxdb.info/releases/11.0.0.htmlweekly0.5https://rxdb.info/releases/12.0.0.htmlweekly0.5https://rxdb.info/releases/13.0.0.htmlweekly0.5https://rxdb.info/releases/14.0.0.htmlweekly0.5https://rxdb.info/releases/15.0.0.htmlweekly0.5https://rxdb.info/releases/16.0.0.htmlweekly0.5https://rxdb.info/releases/17.0.0.htmlweekly0.5https://rxdb.info/releases/8.0.0.htmlweekly0.5https://rxdb.info/releases/9.0.0.htmlweekly0.5https://rxdb.info/replication-appwrite.htmlweekly0.5https://rxdb.info/replication-couchdb.htmlweekly0.5https://rxdb.info/replication-firestore.htmlweekly0.5https://rxdb.info/replication-graphql.htmlweekly0.5https://rxdb.info/replication-http.htmlweekly0.5https://rxdb.info/replication-mongodb.htmlweekly0.5https://rxdb.info/replication-nats.htmlweekly0.5https://rxdb.info/replication-p2p.htmlweekly0.5https://rxdb.info/replication-server.htmlweekly0.5https://rxdb.info/replication-supabase.htmlweekly0.5https://rxdb.info/replication-webrtc.htmlweekly0.5https://rxdb.info/replication-websocket.htmlweekly0.5https://rxdb.info/replication.htmlweekly0.5https://rxdb.info/rx-attachment.htmlweekly0.5https://rxdb.info/rx-collection.htmlweekly0.5https://rxdb.info/rx-database.htmlweekly0.5https://rxdb.info/rx-document.htmlweekly0.5https://rxdb.info/rx-local-document.htmlweekly0.5https://rxdb.info/rx-pipeline.htmlweekly0.5https://rxdb.info/rx-query.htmlweekly0.5https://rxdb.info/rx-schema.htmlweekly0.5https://rxdb.info/rx-server-scaling.htmlweekly0.5https://rxdb.info/rx-server.htmlweekly0.5https://rxdb.info/rx-state.htmlweekly0.5https://rxdb.info/rx-storage-denokv.htmlweekly0.5https://rxdb.info/rx-storage-dexie.htmlweekly0.5https://rxdb.info/rx-storage-filesystem-node.htmlweekly0.5https://rxdb.info/rx-storage-foundationdb.htmlweekly0.5https://rxdb.info/rx-storage-indexeddb.htmlweekly0.5https://rxdb.info/rx-storage-localstorage-meta-optimizer.htmlweekly0.5https://rxdb.info/rx-storage-localstorage.htmlweekly0.5https://rxdb.info/rx-storage-lokijs.htmlweekly0.5https://rxdb.info/rx-storage-memory-mapped.htmlweekly0.5https://rxdb.info/rx-storage-memory-synced.htmlweekly0.5https://rxdb.info/rx-storage-memory.htmlweekly0.5https://rxdb.info/rx-storage-mongodb.htmlweekly0.5https://rxdb.info/rx-storage-opfs.htmlweekly0.5https://rxdb.info/rx-storage-performance.htmlweekly0.5https://rxdb.info/rx-storage-pouchdb.htmlweekly0.5https://rxdb.info/rx-storage-remote.htmlweekly0.5https://rxdb.info/rx-storage-sharding.htmlweekly0.5https://rxdb.info/rx-storage-shared-worker.htmlweekly0.5https://rxdb.info/rx-storage-sqlite.htmlweekly0.5https://rxdb.info/rx-storage-worker.htmlweekly0.5https://rxdb.info/rx-storage.htmlweekly0.5https://rxdb.info/rxdb-tradeoffs.htmlweekly0.5https://rxdb.info/schema-validation.htmlweekly0.5https://rxdb.info/slow-indexeddb.htmlweekly0.5https://rxdb.info/third-party-plugins.htmlweekly0.5https://rxdb.info/transactions-conflicts-revisions.htmlweekly0.5https://rxdb.info/tutorials/typescript.htmlweekly0.5https://rxdb.info/why-nosql.htmlweekly0.5 \ No newline at end of file diff --git a/docs/slow-indexeddb.html b/docs/slow-indexeddb.html deleted file mode 100644 index 8cbcf74721e..00000000000 --- a/docs/slow-indexeddb.html +++ /dev/null @@ -1,223 +0,0 @@ - - - - - -Solving IndexedDB Slowness for Seamless Apps | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Why IndexedDB is slow and what to use instead

    -

    So you have a JavaScript web application that needs to store data at the client side, either to make it offline usable, just for caching purposes or for other reasons.

    -

    For in-browser data storage, you have some options:

    -
      -
    • Cookies are sent with each HTTP request, so you cannot store more than a few strings in them.
    • -
    • WebSQL is deprecated because it never was a real standard and turning it into a standard would have been too difficult.
    • -
    • LocalStorage is a synchronous API over asynchronous IO-access. Storing and reading data can fully block the JavaScript process so you cannot use LocalStorage for more than few simple key-value pairs.
    • -
    • The FileSystem API could be used to store plain binary files, but it is only supported in chrome for now.
    • -
    • IndexedDB is an indexed key-object database. It can store json data and iterate over its indexes. It is widely supported and stable.
    • -
    -
    UPDATE April 2023

    Since beginning of 2023, all modern browsers ship the File System Access API which allows to persistently store data in the browser with a way better performance. For RxDB you can use the OPFS RxStorage to get about 4x performance improvement compared to IndexedDB.

    IndexedDB Database
    -

    It becomes clear that the only way to go is IndexedDB. You start developing your app and everything goes fine. -But as soon as your app gets bigger, more complex or just handles more data, you might notice something. IndexedDB is slow. Not slow like a database on a cheap server, even slower! Inserting a few hundred documents can take up several seconds. Time which can be critical for a fast page load. Even sending data over the internet to the backend can be faster than storing it inside of an IndexedDB database.

    -
    -

    Transactions vs Throughput

    -
    -

    So before we start complaining, lets analyze what exactly is slow. When you run tests on Nolans Browser Database Comparison you can see that inserting 1k documents into IndexedDB takes about 80 milliseconds, 0.08ms per document. This is not really slow. It is quite fast and it is very unlikely that you want to store that many document at the same time at the client side. But the key point here is that all these documents get written in a single transaction.

    -

    I forked the comparison tool here and changed it to use one transaction per document write. And there we have it. Inserting 1k documents with one transaction per write, takes about 2 seconds. Interestingly if we increase the document size to be 100x bigger, it still takes about the same time to store them. This makes clear that the limiting factor to IndexedDB performance is the transaction handling, not the data throughput.

    -

    IndexedDB transaction throughput

    -

    To fix your IndexedDB performance problems you have to make sure to use as less data transfers/transactions as possible. -Sometimes this is easy, as instead of iterating over a documents list and calling single inserts, with RxDB you could use the bulk methods to store many document at once. -But most of the time is not so easy. Your user clicks around, data gets replicated from the backend, another browser tab writes data. All these things can happen at random time and you cannot crunch all that data in a single transaction.

    -

    Another solution is to just not care about performance at all. In a few releases the browser vendors will have optimized IndexedDB and everything is fast again. Well, IndexedDB was slow in 2013 and it is still slow today. If this trend continues, it will still be slow in a few years from now. Waiting is not an option. The chromium devs made a statement to focus on optimizing read performance, not write performance.

    -

    Switching to WebSQL (even if it is deprecated) is also not an option because, like the comparison tool shows, it has even slower transactions.

    -

    So you need a way to make IndexedDB faster. In the following I lay out some performance optimizations than can be made to have faster reads and writes in IndexedDB.

    -

    HINT: You can reproduce all performance tests in this repo. In all tests we work on a dataset of 40000 human documents with a random age between 1 and 100.

    -

    Batched Cursor

    -

    With IndexedDB 2.0, new methods were introduced which can be utilized to improve performance. With the getAll() method, a faster alternative to the old openCursor() can be created which improves performance when reading data from the IndexedDB store.

    -

    Lets say we want to query all user documents that have an age greater than 25 out of the store. -To implement a fast batched cursor that only needs calls to getAll() and not to getAllKeys(), we first need to create an age index that contains the primary id as last field.

    -
    myIndexedDBObjectStore.createIndex(
    -    'age-index',
    -    [
    -        'age',
    -        'id'
    -    ]
    -);
    -

    This is required because the age field is not unique, and we need a way to checkpoint the last returned batch so we can continue from there in the next call to getAll().

    -
    const maxAge = 25;
    -let result = [];
    -const tx: IDBTransaction = db.transaction([storeName], 'readonly', TRANSACTION_SETTINGS);
    -const store = tx.objectStore(storeName);
    -const index = store.index('age-index');
    -let lastDoc;
    -let done = false;
    -/**
    - * Run the batched cursor until all results are retrieved
    - * or the end of the index is reached.
    - */
    -while (done === false) {
    -    await new Promise((res, rej) => {
    -        const range = IDBKeyRange.bound(
    -          /**
    -           * If we have a previous document as checkpoint,
    -           * we have to continue from it's age and id values.
    -           */
    -            [
    -                lastDoc ? lastDoc.age : -Infinity,
    -                lastDoc ? lastDoc.id : -Infinity,
    -            ],
    -            [
    -                maxAge + 0.00000001,
    -                String.fromCharCode(65535)
    -            ],
    -            true,
    -            false
    -        );
    -        const openCursorRequest = index.getAll(range, batchSize);
    -        openCursorRequest.onerror = err => rej(err);
    -        openCursorRequest.onsuccess = e => {
    -            const subResult: TestDocument[] = e.target.result;
    -            lastDoc = lastOfArray(subResult);
    -            if (subResult.length === 0) {
    -                done = true;
    -            } else {
    -                result = result.concat(subResult);
    -            }
    -            res();
    -        };
    -    });
    -}
    -console.dir(result);
    -

    IndexedDB batched cursor

    -

    As the performance test results show, using a batched cursor can give a huge improvement. Interestingly choosing a high batch size is important. When you known that all results of a given IDBKeyRange are needed, you should not set a batch size at all and just directly query all documents via getAll().

    -

    RxDB uses batched cursors in the IndexedDB RxStorage.

    -

    IndexedDB Sharding

    -

    Sharding is a technique, normally used in server side databases, where the database is partitioned horizontally. Instead of storing all documents at one table/collection, the documents are split into so called shards and each shard is stored on one table/collection. This is done in server side architectures to spread the load between multiple physical servers which increases scalability.

    -

    When you use IndexedDB in a browser, there is of course no way to split the load between the client and other servers. But you can still benefit from sharding. Partitioning the documents horizontally into multiple IndexedDB stores, has shown to have a big performance improvement in write- and read operations while only increasing initial pageload slightly.

    -

    IndexedDB sharding performance

    -

    As shown in the performance test results, sharding should always be done by IDBObjectStore and not by database. Running a batched cursor over the whole dataset with 10 store shards in parallel is about 28% faster then running it over a single store. Initialization time increases minimal from 9 to 17 milliseconds. -Getting a quarter of the dataset by batched iterating over an index, is even 43% faster with sharding then when a single store is queried.

    -

    As downside, getting 10k documents by their id is slower when it has to run over the shards. -Also it can be much effort to recombined the results from the different shards into the required query result. When a query without a limit is done, the sharding method might cause a data load huge overhead.

    -

    Sharding can be used with RxDB with the Sharding Plugin.

    -

    Custom Indexes

    -

    Indexes improve the query performance of IndexedDB significant. Instead of fetching all data from the storage when you search for a subset of it, you can iterate over the index and stop iterating when all relevant data has been found.

    -

    For example to query for all user documents that have an age greater than 25, you would create an age+id index. -To be able to run a batched cursor over the index, we always need our primary key (id) as the last index field.

    -

    Instead of doing this, you can use a custom index which can improve the performance. The custom index runs over a helper field ageIdCustomIndex which is added to each document on write. Our index now only contains a single string field instead of two (age-number and id-string).

    -
    // On document insert add the ageIdCustomIndex field.
    -const idMaxLength = 20; // must be known to craft a custom index
    -docData.ageIdCustomIndex = docData.age + docData.id.padStart(idMaxLength, ' ');
    -store.put(docData);
    -// ...
    -
    // normal index
    -myIndexedDBObjectStore.createIndex(
    -    'age-index',
    -    [
    -        'age',
    -        'id'
    -    ]
    -);
    - 
    -// custom index
    -myIndexedDBObjectStore.createIndex(
    -    'age-index-custom',
    -    [
    -        'ageIdCustomIndex'
    -    ]
    -);
    - 
    -

    To iterate over the index, you also use a custom crafted keyrange, depending on the last batched cursor checkpoint. Therefore the maxLength of id must be known.

    -
    // keyrange for normal index
    -const range = IDBKeyRange.bound(
    -    [25, ''],
    -    [Infinity, Infinity],
    -    true,
    -    false
    -);
    - 
    -// keyrange for custom index
    -const range = IDBKeyRange.bound(
    -    // combine both values to a single string
    -    25 + ''.padStart(idMaxLength, ' '),
    -    Infinity,
    -    true,
    -    false
    -);
    -

    IndexedDB custom index

    -

    As shown, using a custom index can further improve the performance of running a batched cursor by about 10%.

    -

    Another big benefit of using custom indexes, is that you can also encode boolean values in them, which cannot be done with normal IndexedDB indexes.

    -

    RxDB uses custom indexes in the IndexedDB RxStorage.

    -

    Relaxed durability

    -

    Chromium based browsers allow to set durability to relaxed when creating an IndexedDB transaction. Which runs the transaction in a less secure durability mode, which can improve the performance.

    -
    -

    The user agent may consider that the transaction has successfully committed as soon as all outstanding changes have been written to the operating system, without subsequent verification.

    -
    -

    As shown here, using the relaxed durability mode can improve performance slightly. The best performance improvement could be measured when many small transactions have to be run. Less, bigger transaction do not benefit that much.

    -

    Explicit transaction commits

    -

    By explicitly committing a transaction, another slight performance improvement can be achieved. Instead of waiting for the browser to commit an open transaction, we call the commit() method to explicitly close it.

    -
    // .commit() is not available on all browsers, so first check if it exists.
    -if (transaction.commit) {
    -    transaction.commit()
    -}
    -

    The improvement of this technique is minimal, but observable as these tests show.

    -

    In-Memory on top of IndexedDB

    -

    To prevent transaction handling and to fix the performance problems, we need to stop using IndexedDB as a database. Instead all data is loaded into the memory on the initial page load. Here all reads and writes happen in memory which is about 100x faster. Only some time after a write occurred, the memory state is persisted into IndexedDB with a single write transaction. In this scenario IndexedDB is used as a filesystem, not as a database.

    -

    There are some libraries that already do that:

    - -

    In-Memory: Persistence

    -

    One downside of not directly using IndexedDB, is that your data is not persistent all the time. And when the JavaScript process exists without having persisted to IndexedDB, data can be lost. To prevent this from happening, we have to ensure that the in-memory state is written down to the disc. One point is make persisting as fast as possible. LokiJS for example has the incremental-indexeddb-adapter which only saves new writes to the disc instead of persisting the whole state. Another point is to run the persisting at the correct point in time. For example the RxDB LokiJS storage persists in the following situations:

    -
      -
    • When the database is idle and no write or query is running. In that time we can persist the state if any new writes appeared before.
    • -
    • When the window fires the beforeunload event we can assume that the JavaScript process is exited any moment and we have to persist the state. After beforeunload there are several seconds time which are sufficient to store all new changes. This has shown to work quite reliable.
    • -
    -

    The only missing event that can happen is when the browser exists unexpectedly like when it crashes or when the power of the computer is shut of.

    -

    In-Memory: Multi Tab Support

    -

    One big difference between a web application and a 'normal' app, is that your users can use the app in multiple browser tabs at the same time. But when you have all database state in memory and only periodically write it to disc, multiple browser tabs could overwrite each other and you would loose data. This might not be a problem when you rely on a client-server replication, because the lost data might already be replicated with the backend and therefore with the other tabs. But this would not work when the client is offline.

    -

    The ideal way to solve that problem, is to use a SharedWorker. A SharedWorker is like a WebWorker that runs its own JavaScript process only that the SharedWorker is shared between multiple contexts. You could create the database in the SharedWorker and then all browser tabs could request the Worker for data instead of having their own database. But unfortunately the SharedWorker API does not work in all browsers. Safari dropped its support and InternetExplorer or Android Chrome, never adopted it. Also it cannot be polyfilled. UPDATE: Apple added SharedWorkers back in Safari 142

    -

    Instead, we could use the BroadcastChannel API to communicate between tabs and then apply a leader election between them. The leader election ensures that, no matter how many tabs are open, always one tab is the Leader.

    -

    Leader Election

    -

    The disadvantage is that the leader election process takes some time on the initial page load (about 150 milliseconds). Also the leader election can break when a JavaScript process is fully blocked for a longer time. When this happens, a good way is to just reload the browser tab to restart the election process.

    -

    Further read

    -
    - - \ No newline at end of file diff --git a/docs/slow-indexeddb.md b/docs/slow-indexeddb.md deleted file mode 100644 index 2cb0bbe7edf..00000000000 --- a/docs/slow-indexeddb.md +++ /dev/null @@ -1,263 +0,0 @@ -# Solving IndexedDB Slowness for Seamless Apps - -> Struggling with IndexedDB performance? Discover hidden bottlenecks, advanced tuning techniques, and next-gen storage like the File System Access API. - -# Why IndexedDB is slow and what to use instead - -So you have a JavaScript web application that needs to store data at the client side, either to make it [offline usable](./offline-first.md), just for caching purposes or for other reasons. - -For [in-browser data storage](./articles/browser-database.md), you have some options: - -- **Cookies** are sent with each HTTP request, so you cannot store more than a few strings in them. -- **WebSQL** [is deprecated](https://hacks.mozilla.org/2010/06/beyond-html5-database-apis-and-the-road-to-indexeddb/) because it never was a real standard and turning it into a standard would have been too difficult. -- [LocalStorage](./articles/localstorage.md) is a synchronous API over asynchronous IO-access. Storing and reading data can fully block the JavaScript process so you cannot use LocalStorage for more than few simple key-value pairs. -- The **FileSystem API** could be used to store plain binary files, but it is [only supported in chrome](https://caniuse.com/filesystem) for now. -- **IndexedDB** is an indexed key-object database. It can store json data and iterate over its indexes. It is [widely supported](https://caniuse.com/indexeddb) and stable. - -:::note UPDATE April 2023 -Since beginning of 2023, all modern browsers ship the **File System Access API** which allows to persistently store data in the browser with a way better performance. For [RxDB](https://rxdb.info/) you can use the [OPFS RxStorage](./rx-storage-opfs.md) to get about 4x performance improvement compared to IndexedDB. - -
    - - - -
    -::: - -It becomes clear that the only way to go is IndexedDB. You start developing your app and everything goes fine. -But as soon as your app gets bigger, more complex or just handles more data, you might notice something. **IndexedDB is slow**. Not slow like a database on a cheap server, **even slower**! Inserting a few hundred documents can take up several seconds. Time which can be critical for a fast page load. Even sending data over the internet to the backend can be faster than storing it inside of an IndexedDB database. - -> Transactions vs Throughput - -So before we start complaining, lets analyze what exactly is slow. When you run tests on Nolans [Browser Database Comparison](http://nolanlawson.github.io/database-comparison/) you can see that inserting 1k documents into IndexedDB takes about 80 milliseconds, 0.08ms per document. This is not really slow. It is quite fast and it is very unlikely that you want to store that many document at the same time at the client side. But the key point here is that all these documents get written in a `single transaction`. - -I forked the comparison tool [here](https://pubkey.github.io/client-side-databases/database-comparison/index.html) and changed it to use one transaction per document write. And there we have it. Inserting 1k documents with one transaction per write, takes about 2 seconds. Interestingly if we increase the document size to be 100x bigger, it still takes about the same time to store them. This makes clear that the limiting factor to IndexedDB performance is the transaction handling, not the data throughput. - - - -To fix your IndexedDB performance problems you have to make sure to use as less data transfers/transactions as possible. -Sometimes this is easy, as instead of iterating over a documents list and calling single inserts, with RxDB you could use the [bulk methods](https://rxdb.info/rx-collection.html#bulkinsert) to store many document at once. -But most of the time is not so easy. Your user clicks around, data gets replicated from the backend, another browser tab writes data. All these things can happen at random time and you cannot crunch all that data in a single transaction. - -Another solution is to just not care about performance at all. In a few releases the browser vendors will have optimized IndexedDB and everything is fast again. Well, IndexedDB was slow [in 2013](https://www.researchgate.net/publication/281065948_Performance_Testing_and_Comparison_of_Client_Side_Databases_Versus_Server_Side) and it is still slow today. If this trend continues, it will still be slow in a few years from now. Waiting is not an option. The chromium devs made [a statement](https://bugs.chromium.org/p/chromium/issues/detail?id=1025456#c15) to focus on optimizing read performance, not write performance. - -Switching to WebSQL (even if it is deprecated) is also not an option because, like [the comparison tool shows](https://pubkey.github.io/client-side-databases/database-comparison/index.html), it has even slower transactions. - -So you need a way to **make IndexedDB faster**. In the following I lay out some performance optimizations than can be made to have faster reads and writes in IndexedDB. - -**HINT:** You can reproduce all performance tests [in this repo](https://github.com/pubkey/indexeddb-performance-tests). In all tests we work on a dataset of 40000 `human` documents with a random `age` between `1` and `100`. - -## Batched Cursor - -With [IndexedDB 2.0](https://caniuse.com/indexeddb2), new methods were introduced which can be utilized to improve performance. With the `getAll()` method, a faster alternative to the old `openCursor()` can be created which improves performance when reading data from the IndexedDB store. - -Lets say we want to query all user documents that have an `age` greater than `25` out of the store. -To implement a fast batched cursor that only needs calls to `getAll()` and not to `getAllKeys()`, we first need to create an `age` index that contains the primary `id` as last field. - -```ts -myIndexedDBObjectStore.createIndex( - 'age-index', - [ - 'age', - 'id' - ] -); -``` - -This is required because the `age` field is not unique, and we need a way to checkpoint the last returned batch so we can continue from there in the next call to `getAll()`. - -```ts -const maxAge = 25; -let result = []; -const tx: IDBTransaction = db.transaction([storeName], 'readonly', TRANSACTION_SETTINGS); -const store = tx.objectStore(storeName); -const index = store.index('age-index'); -let lastDoc; -let done = false; -/** - * Run the batched cursor until all results are retrieved - * or the end of the index is reached. - */ -while (done === false) { - await new Promise((res, rej) => { - const range = IDBKeyRange.bound( - /** - * If we have a previous document as checkpoint, - * we have to continue from it's age and id values. - */ - [ - lastDoc ? lastDoc.age : -Infinity, - lastDoc ? lastDoc.id : -Infinity, - ], - [ - maxAge + 0.00000001, - String.fromCharCode(65535) - ], - true, - false - ); - const openCursorRequest = index.getAll(range, batchSize); - openCursorRequest.onerror = err => rej(err); - openCursorRequest.onsuccess = e => { - const subResult: TestDocument[] = e.target.result; - lastDoc = lastOfArray(subResult); - if (subResult.length === 0) { - done = true; - } else { - result = result.concat(subResult); - } - res(); - }; - }); -} -console.dir(result); -``` - - - -As the performance test results show, using a batched cursor can give a huge improvement. Interestingly choosing a high batch size is important. When you known that all results of a given `IDBKeyRange` are needed, you should not set a batch size at all and just directly query all documents via `getAll()`. - -RxDB uses batched cursors in the [IndexedDB RxStorage](./rx-storage-indexeddb.md). - -## IndexedDB Sharding - -Sharding is a technique, normally used in server side databases, where the database is partitioned horizontally. Instead of storing all documents at one table/collection, the documents are split into so called **shards** and each shard is stored on one table/collection. This is done in server side architectures to spread the load between multiple physical servers which **increases scalability**. - -When you use IndexedDB in a browser, there is of course no way to split the load between the client and other servers. But you can still benefit from sharding. Partitioning the documents horizontally into **multiple IndexedDB stores**, has shown to have a big performance improvement in write- and read operations while only increasing initial pageload slightly. - - - -As shown in the performance test results, sharding should always be done by `IDBObjectStore` and not by database. Running a batched cursor over the whole dataset with 10 store shards in parallel is about **28% faster** then running it over a single store. Initialization time increases minimal from `9` to `17` milliseconds. -Getting a quarter of the dataset by batched iterating over an index, is even **43%** faster with sharding then when a single store is queried. - -As downside, getting 10k documents by their id is slower when it has to run over the shards. -Also it can be much effort to recombined the results from the different shards into the required query result. When a query without a limit is done, the sharding method might cause a data load huge overhead. - -Sharding can be used with RxDB with the [Sharding Plugin](./rx-storage-sharding.md). - -## Custom Indexes - -Indexes improve the query performance of IndexedDB significant. Instead of fetching all data from the storage when you search for a subset of it, you can iterate over the index and stop iterating when all relevant data has been found. - -For example to query for all user documents that have an `age` greater than `25`, you would create an `age+id` index. -To be able to run a batched cursor over the index, we always need our primary key (`id`) as the last index field. - -Instead of doing this, you can use a `custom index` which can improve the performance. The custom index runs over a helper field `ageIdCustomIndex` which is added to each document on write. Our index now only contains a single `string` field instead of two (age-`number` and id-`string`). - -```ts -// On document insert add the ageIdCustomIndex field. -const idMaxLength = 20; // must be known to craft a custom index -docData.ageIdCustomIndex = docData.age + docData.id.padStart(idMaxLength, ' '); -store.put(docData); -// ... -``` - -```ts -// normal index -myIndexedDBObjectStore.createIndex( - 'age-index', - [ - 'age', - 'id' - ] -); - -// custom index -myIndexedDBObjectStore.createIndex( - 'age-index-custom', - [ - 'ageIdCustomIndex' - ] -); - -``` - -To iterate over the index, you also use a custom crafted keyrange, depending on the last batched cursor checkpoint. Therefore the `maxLength` of `id` must be known. - -```ts -// keyrange for normal index -const range = IDBKeyRange.bound( - [25, ''], - [Infinity, Infinity], - true, - false -); - -// keyrange for custom index -const range = IDBKeyRange.bound( - // combine both values to a single string - 25 + ''.padStart(idMaxLength, ' '), - Infinity, - true, - false -); -``` - - - -As shown, using a custom index can further improve the performance of running a batched cursor by about `10%`. - -Another big benefit of using custom indexes, is that you can also encode `boolean` values in them, which [cannot be done](https://github.com/w3c/IndexedDB/issues/76) with normal IndexedDB indexes. - -RxDB uses custom indexes in the [IndexedDB RxStorage](./rx-storage-indexeddb.md). - -## Relaxed durability - -Chromium based browsers allow to set [durability](https://developer.mozilla.org/en-US/docs/Web/API/IDBTransaction/durability) to `relaxed` when creating an IndexedDB transaction. Which runs the transaction in a less secure durability mode, which can improve the performance. - -> The user agent may consider that the transaction has successfully committed as soon as all outstanding changes have been written to the operating system, without subsequent verification. - -As shown [here](https://nolanlawson.com/2021/08/22/speeding-up-indexeddb-reads-and-writes/), using the relaxed durability mode can improve performance slightly. The best performance improvement could be measured when many small transactions have to be run. Less, bigger transaction do not benefit that much. - -## Explicit transaction commits - -By explicitly committing a transaction, another slight performance improvement can be achieved. Instead of waiting for the browser to commit an open transaction, we call the `commit()` method to explicitly close it. - -```ts -// .commit() is not available on all browsers, so first check if it exists. -if (transaction.commit) { - transaction.commit() -} -``` - -The improvement of this technique is minimal, but observable as [these tests](https://nolanlawson.com/2021/08/22/speeding-up-indexeddb-reads-and-writes/) show. - -## In-Memory on top of IndexedDB - -To prevent transaction handling and to fix the performance problems, we need to stop using IndexedDB as a database. Instead all data is loaded into the memory on the initial page load. Here all reads and writes happen in memory which is about 100x faster. Only some time after a write occurred, the memory state is persisted into IndexedDB with a **single write transaction**. In this scenario IndexedDB is used as a filesystem, not as a database. - -There are some libraries that already do that: - -- LokiJS with the [IndexedDB Adapter](https://techfort.github.io/LokiJS/LokiIndexedAdapter.html) -- [Absurd-SQL](https://github.com/jlongster/absurd-sql) -- SQL.js with the [empscripten Filesystem API](https://emscripten.org/docs/api_reference/Filesystem-API.html#filesystem-api-idbfs) -- [DuckDB Wasm](https://duckdb.org/2021/10/29/duckdb-wasm.html) - -### In-Memory: Persistence - -One downside of not directly using IndexedDB, is that your data is not persistent all the time. And when the JavaScript process exists without having persisted to IndexedDB, data can be lost. To prevent this from happening, we have to ensure that the in-memory state is written down to the disc. One point is make persisting as fast as possible. LokiJS for example has the `incremental-indexeddb-adapter` which only saves new writes to the disc instead of persisting the whole state. Another point is to run the persisting at the correct point in time. For example the RxDB [LokiJS storage](https://rxdb.info/rx-storage-lokijs.html) persists in the following situations: - -- When the database is idle and no write or query is running. In that time we can persist the state if any new writes appeared before. -- When the `window` fires the [beforeunload event](https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload) we can assume that the JavaScript process is exited any moment and we have to persist the state. After `beforeunload` there are several seconds time which are sufficient to store all new changes. This has shown to work quite reliable. - -The only missing event that can happen is when the browser exists unexpectedly like when it crashes or when the power of the computer is shut of. - -### In-Memory: Multi Tab Support - -One big difference between a web application and a 'normal' app, is that your users can use the app in multiple browser tabs at the same time. But when you have all database state in memory and only periodically write it to disc, multiple browser tabs could overwrite each other and you would loose data. This might not be a problem when you rely on a client-server replication, because the lost data might already be replicated with the backend and therefore with the other tabs. But this would not work when the client is offline. - -The ideal way to solve that problem, is to use a [SharedWorker](https://developer.mozilla.org/en/docs/Web/API/SharedWorker). A [SharedWorker](./rx-storage-shared-worker.md) is like a [WebWorker](https://developer.mozilla.org/en/docs/Web/API/Web_Workers_API) that runs its own JavaScript process only that the SharedWorker is shared between multiple contexts. You could create the database in the SharedWorker and then all browser tabs could request the Worker for data instead of having their own database. But unfortunately the SharedWorker API does [not work](https://caniuse.com/sharedworkers) in all browsers. Safari [dropped](https://bugs.webkit.org/show_bug.cgi?id=140344) its support and InternetExplorer or Android Chrome, never adopted it. Also it cannot be polyfilled. **UPDATE:** [Apple added SharedWorkers back in Safari 142](https://developer.apple.com/safari/technology-preview/release-notes/) - -Instead, we could use the [BroadcastChannel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API) to communicate between tabs and then apply a [leader election](https://github.com/pubkey/broadcast-channel#using-the-leaderelection) between them. The [leader election](./leader-election.md) ensures that, no matter how many tabs are open, always one tab is the `Leader`. - - - -The disadvantage is that the leader election process takes some time on the initial page load (about 150 milliseconds). Also the leader election can break when a JavaScript process is fully blocked for a longer time. When this happens, a good way is to just reload the browser tab to restart the election process. - -## Further read - -- [Offline First Database Comparison](https://github.com/pubkey/client-side-databases) -- [Speeding up IndexedDB reads and writes](https://nolanlawson.com/2021/08/22/speeding-up-indexeddb-reads-and-writes/) -- [SQLITE ON THE WEB: ABSURD-SQL](https://hackaday.com/2021/08/24/sqlite-on-the-web-absurd-sql/) -- [SQLite in a PWA with FileSystemAccessAPI](https://anita-app.com/blog/articles/sqlite-in-a-pwa-with-file-system-access-api.html) -- [Response to this article by Oren Eini](https://ravendb.net/articles/re-why-indexeddb-is-slow-and-what-to-use-instead) diff --git a/docs/survey/index.html b/docs/survey/index.html deleted file mode 100644 index b26c65c1552..00000000000 --- a/docs/survey/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -RxDB User Survey - RxDB - JavaScript Database | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/third-party-plugins.html b/docs/third-party-plugins.html deleted file mode 100644 index 0381e419013..00000000000 --- a/docs/third-party-plugins.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - -Boost Your RxDB with Powerful Third-Party Plugins | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/third-party-plugins.md b/docs/third-party-plugins.md deleted file mode 100644 index 265f0a92c83..00000000000 --- a/docs/third-party-plugins.md +++ /dev/null @@ -1,12 +0,0 @@ -# Boost Your RxDB with Powerful Third-Party Plugins - -> Unleash RxDB's full power! Explore third-party plugins for advanced hooks, text search, Laravel Orion, Supabase replication, and more. - -# Third Party Plugins - -* [rxdb-hooks](https://github.com/cvara/rxdb-hooks) A set of hooks to integrate RxDB into react applications. -* [rxdb-flexsearch](https://github.com/serenysoft/rxdb-flexsearch) The full text search for RxDB using [FlexSearch](https://github.com/nextapps-de/flexsearch). -* [rxdb-orion](https://github.com/serenysoft/rxdb-orion) Enables replication with [Laravel Orion](https://tailflow.github.io/laravel-orion-docs). -* [rxdb-supabase](https://github.com/marceljuenemann/rxdb-supabase) Enables replication with [Supabase](https://supabase.com/). -* [rxdb-utils](https://github.com/rafamel/rxdb-utils) Additional features for RxDB like models, timestamps, default values, view and more. -* [loki-async-reference-adapter](https://github.com/jonnyreeves/loki-async-reference-adapter) Simple async adapter for LokiJS, suitable to use RxDB's [Lokijs RxStorage](./rx-storage-lokijs.md) with React Native. diff --git a/docs/transactions-conflicts-revisions.html b/docs/transactions-conflicts-revisions.html deleted file mode 100644 index 51b8ca77d70..00000000000 --- a/docs/transactions-conflicts-revisions.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - -Transactions, Conflicts and Revisions | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Transactions, Conflicts and Revisions

    -

    In contrast to most SQL databases, RxDB does not have the concept of relational, ACID transactions. Instead, RxDB has to apply different techniques that better suit the offline-first, client side world where it is not possible to create a transaction between multiple maybe-offline client devices.

    -

    Why RxDB does not have transactions

    -

    When talking about transactions, we mean ACID transactions that guarantee the properties of atomicity, consistency, isolation and durability. -With an ACID transaction you can mutate data dependent on the current state of the database. It is ensured that no other database operations happen in between your transaction and after the transaction has finished, it is guaranteed that the new data is actually written to the disc.

    -

    To implement ACID transactions on a single server, the database has to keep track on who is running transactions and then schedule these transactions so that they can run in isolation.

    -

    As soon as you have to split your database on multiple servers, transaction handling becomes way more difficult. The servers have to communicate with each other to find a consensus about which transaction can run and which has to wait. Network connections might break, or one server might complete its part of the transaction and then be required to roll back its changes because of an error on another server.

    -

    But with RxDB you have multiple clients that can go randomly online or offline. The users can have different devices and the clock of these devices can go off by any time. To support ACID transactions here, RxDB would have to make the whole world stand still for all clients, while one client is doing a write operation. And even that can only work when all clients are online. Implementing that might be possible, but at the cost of an unpredictable amount of performance loss and not being able to support offline-first.

    -
    -

    A single write operation to a document is the only atomic thing you can do in RxDB.

    -
    -

    The benefits of not having to support transactions:

    -
      -
    • Clients can read and write data without blocking each other.
    • -
    • Clients can write data while being offline and then replicate with a server when they are online again, called offline-first.
    • -
    • Creating a compatible backend for the replication is easy so that RxDB can replicate with any existing infrastructure.
    • -
    • Optimizations like Sharding can be used.
    • -
    -

    Revisions

    -

    Working without transactions leads to having undefined state when doing multiple database operations at the same time. Most client side databases rely on a last-write-wins strategy on write operations. This might be a viable solution for some cases, but often this leads to strange problems that are hard to debug.

    -

    Instead, to ensure that the behavior of RxDB is always predictable, RxDB relies on revisions for version control. Revisions work similar to Lamport Clocks.

    -

    Each document is stored together with its revision string, that looks like 1-9dcca3b8e1a and consists of:

    -
      -
    • The revision height, a number that starts with 1 and is increased with each write to that document.
    • -
    • The database instance token.
    • -
    -

    An operation to the RxDB data layer does not only contain the new document data, but also the previous document data with its revision string. If the previous revision matches the revision that is currently stored in the database, the write operation can succeed. If the previous revision is different than the revision that is currently stored in the database, the operation will throw a 409 CONFLICT error.

    -

    Conflicts

    -

    There are two types of conflicts in RxDB, the local conflict and the replication conflict.

    -

    Local conflicts

    -

    A local conflict can happen when a write operation assumes a different previous document state, than what is currently stored in the database. This can happen when multiple parts of your application do simultaneous writes to the same document. This can happen on a single browser tab, or when multiple tabs write at once or when a write appears while the document gets replicated from a remote server replication.

    -

    When a local conflict appears, RxDB will throw a 409 CONFLICT error. The calling code must then handle the error properly, depending on the application logic.

    -

    Instead of handling local conflicts, in most cases it is easier to ensure that they cannot happen, by using incremental database operations like incrementalModify(), incrementalPatch() or incrementalUpsert(). These write operations have a built-in way to handle conflicts by re-applying the mutation functions to the conflicting document state.

    -

    Replication conflicts

    -

    A replication conflict appears when multiple clients write to the same documents at once and these documents are then replicated to the backend server.

    -

    When you replicate with the Graphql replication and the replication primitives, RxDB assumes that conflicts are detected and resolved at the client side.

    -

    When a document is send to the backend and the backend detected a conflict (by comparing revisions or other properties), the backend will respond with the actual document state so that the client can compare this with the local document state and create a new, resolved document state that is then pushed to the server again. You can read more about the replication conflicts here.

    -

    Custom conflict handler

    -

    A conflict handler is an object with two JavaScript functions:

    -
      -
    • Detect if two document states are equal
    • -
    • Solve existing conflicts
    • -
    -

    Because the conflict handler also is used for conflict detection, it will run many times on pull-, push- and write operations of RxDB. Most of the time it will detect that there is no conflict and then return.

    -

    Lets have a look at the default conflict handler of RxDB to learn how to create a custom one:

    -
    import { deepEqual } from 'rxdb/plugins/utils';
    -export const defaultConflictHandler: RxConflictHandler<any> = {
    -    isEqual(a, b) {
    -        /**
    -         * isEqual() is used to detect conflicts or to detect if a
    -         * document has to be pushed to the remote.
    -         * If the documents are deep equal,
    -         * we have no conflict.
    -         * Because deepEqual is CPU expensive, on your custom conflict handler you might only
    -         * check some properties, like the updatedAt time or revisions
    -         * for better performance.
    -         */
    -        return deepEqual(a, b);
    -    },
    -    resolve(i) {
    -        /**
    -         * The default conflict handler will always
    -         * drop the fork state and use the master state instead.
    -         * 
    -         * In your custom conflict handler you likely want to merge properties
    -         * of the realMasterState and the newDocumentState instead.
    -         */
    -        return i.realMasterState;
    -    }
    -};
    -

    To overwrite the default conflict handler, you have to specify a custom conflictHandler property when creating a collection with addCollections().

    -
    const myCollections = await myDatabase.addCollections({
    -  // key = collectionName
    -  humans: {
    -    schema: mySchema,
    -    conflictHandler: myCustomConflictHandler
    -  }
    -});
    - - \ No newline at end of file diff --git a/docs/transactions-conflicts-revisions.md b/docs/transactions-conflicts-revisions.md deleted file mode 100644 index ba9c782f9a6..00000000000 --- a/docs/transactions-conflicts-revisions.md +++ /dev/null @@ -1,109 +0,0 @@ -# Transactions, Conflicts and Revisions - -> Learn RxDB's approach to local and replication conflicts. Discover how incremental writes and custom handlers keep your app stable and efficient. - -# Transactions, Conflicts and Revisions - -In contrast to most SQL databases, RxDB does not have the concept of relational, ACID transactions. Instead, RxDB has to apply different techniques that better suit the offline-first, client side world where it is not possible to create a transaction between multiple maybe-offline client devices. - -## Why RxDB does not have transactions - -When talking about transactions, we mean [ACID transactions](https://en.wikipedia.org/wiki/ACID) that guarantee the properties of atomicity, consistency, isolation and durability. -With an ACID transaction you can mutate data dependent on the current state of the database. It is ensured that no other database operations happen in between your transaction and after the transaction has finished, it is guaranteed that the new data is actually written to the disc. - -To implement ACID transactions on a **single server**, the database has to keep track on who is running transactions and then schedule these transactions so that they can run in isolation. - -As soon as you have to split your database on **multiple servers**, transaction handling becomes way more difficult. The servers have to communicate with each other to find a consensus about which transaction can run and which has to wait. Network connections might break, or one server might complete its part of the transaction and then be required to roll back its changes because of an error on another server. - -But with RxDB you have **multiple clients** that can go randomly online or offline. The users can have different devices and the clock of these devices can go off by any time. To support ACID transactions here, RxDB would have to make the whole world stand still for all clients, while one client is doing a write operation. And even that can only work when all clients are online. Implementing that might be possible, but at the cost of an unpredictable amount of performance loss and not being able to support [offline-first](./offline-first.md). - -> A single write operation to a document is the only atomic thing you can do in RxDB. - -The benefits of not having to support transactions: - -- Clients can read and write data without blocking each other. -- Clients can write data while being **offline** and then replicate with a server when they are **online** again, called [offline-first](./offline-first.md). -- Creating a compatible backend for the replication is easy so that RxDB can replicate with any existing infrastructure. -- Optimizations like [Sharding](./rx-storage-sharding.md) can be used. - -## Revisions - -Working without transactions leads to having undefined state when doing multiple database operations at the same time. Most client side databases rely on a last-write-wins strategy on write operations. This might be a viable solution for some cases, but often this leads to strange problems that are hard to debug. - -Instead, to ensure that the behavior of RxDB is **always predictable**, RxDB relies on **revisions** for version control. Revisions work similar to [Lamport Clocks](https://martinfowler.com/articles/patterns-of-distributed-systems/lamport-clock.html). - -Each document is stored together with its revision string, that looks like `1-9dcca3b8e1a` and consists of: -- The revision height, a number that starts with `1` and is increased with each write to that document. -- The database instance token. - -An operation to the RxDB data layer does not only contain the new document data, but also the previous document data with its revision string. If the previous revision matches the revision that is currently stored in the database, the write operation can succeed. If the previous revision is **different** than the revision that is currently stored in the database, the operation will throw a `409 CONFLICT` error. - -## Conflicts - -There are two types of conflicts in RxDB, the **local conflict** and the **replication conflict**. - -### Local conflicts - -A local conflict can happen when a write operation assumes a different previous document state, than what is currently stored in the database. This can happen when multiple parts of your application do simultaneous writes to the same document. This can happen on a single browser tab, or when multiple tabs write at once or when a write appears while the document gets replicated from a remote server replication. - -When a local conflict appears, RxDB will throw a `409 CONFLICT` error. The calling code must then handle the error properly, depending on the application logic. - -Instead of handling local conflicts, in most cases it is easier to ensure that they cannot happen, by using `incremental` database operations like [incrementalModify()](./rx-document.md), [incrementalPatch()](./rx-document.md) or [incrementalUpsert()](./rx-collection.md). These write operations have a built-in way to handle conflicts by re-applying the mutation functions to the conflicting document state. - -## Replication conflicts - -A replication conflict appears when multiple clients write to the same documents at once and these documents are then replicated to the backend server. - -When you replicate with the [Graphql replication](./replication-graphql.md) and the [replication primitives](./replication.md), RxDB assumes that conflicts are **detected** and **resolved** at the client side. - -When a document is send to the backend and the backend detected a conflict (by comparing revisions or other properties), the backend will respond with the actual document state so that the client can compare this with the local document state and create a new, resolved document state that is then pushed to the server again. You can read more about the replication conflicts [here](./replication.md#conflict-handling). - -## Custom conflict handler - -A conflict handler is an object with two JavaScript functions: -- Detect if two document states are equal -- Solve existing conflicts - -Because the conflict handler also is used for conflict detection, it will run many times on pull-, push- and write operations of RxDB. Most of the time it will detect that there is no conflict and then return. - -Lets have a look at the [default conflict handler](https://github.com/pubkey/rxdb/blob/master/src/replication-protocol/default-conflict-handler.ts) of RxDB to learn how to create a custom one: - -```ts -import { deepEqual } from 'rxdb/plugins/utils'; -export const defaultConflictHandler: RxConflictHandler = { - isEqual(a, b) { - /** - * isEqual() is used to detect conflicts or to detect if a - * document has to be pushed to the remote. - * If the documents are deep equal, - * we have no conflict. - * Because deepEqual is CPU expensive, on your custom conflict handler you might only - * check some properties, like the updatedAt time or revisions - * for better performance. - */ - return deepEqual(a, b); - }, - resolve(i) { - /** - * The default conflict handler will always - * drop the fork state and use the master state instead. - * - * In your custom conflict handler you likely want to merge properties - * of the realMasterState and the newDocumentState instead. - */ - return i.realMasterState; - } -}; -``` - -To overwrite the default conflict handler, you have to specify a custom `conflictHandler` property when creating a collection with `addCollections()`. - -```js -const myCollections = await myDatabase.addCollections({ - // key = collectionName - humans: { - schema: mySchema, - conflictHandler: myCustomConflictHandler - } -}); -``` diff --git a/docs/tutorials/typescript.html b/docs/tutorials/typescript.html deleted file mode 100644 index bef6692d308..00000000000 --- a/docs/tutorials/typescript.html +++ /dev/null @@ -1,206 +0,0 @@ - - - - - -TypeScript Setup | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Using RxDB with TypeScript

    -

    In this tutorial you will learn how to use RxDB with TypeScript. -We will create a basic database with one collection and several ORM-methods, fully typed!

    -

    RxDB directly comes with its typings and you do not have to install anything else, however the latest version of RxDB requires that you are using Typescript v3.8 or newer. -Our way to go is

    -
      -
    • First define what the documents look like
    • -
    • Then define what the collections look like
    • -
    • Then define what the database looks like
    • -
    -
    1

    Declare the types

    First you import the types from RxDB.

    import {
    -    createRxDatabase,
    -    RxDatabase,
    -    RxCollection,
    -    RxJsonSchema,
    -    RxDocument,
    -} from 'rxdb/plugins/core';
    2

    Create the base document type

    First we have to define the TypeScript type of the documents of a collection:

    Option A: Create the document type from the schema

    import {
    -    toTypedRxJsonSchema,
    -    ExtractDocumentTypeFromTypedRxJsonSchema,
    -    RxJsonSchema
    -} from 'rxdb';
    -export const heroSchemaLiteral = {
    -    title: 'hero schema',
    -    description: 'describes a human being',
    -    version: 0,
    -    keyCompression: true,
    -    primaryKey: 'passportId',
    -    type: 'object',
    -    properties: {
    -        passportId: {
    -            type: 'string',
    -            maxLength: 100 // <- the primary key must have set maxLength
    -        },
    -        firstName: {
    -            type: 'string'
    -        },
    -        lastName: {
    -            type: 'string'
    -        },
    -        age: {
    -            type: 'integer'
    -        }
    -    },
    -    required: ['firstName', 'lastName', 'passportId'],
    -    indexes: ['firstName']
    -} as const; // <- It is important to set 'as const' to preserve the literal type
    -const schemaTyped = toTypedRxJsonSchema(heroSchemaLiteral);
    - 
    -// aggregate the document type from the schema
    -export type HeroDocType = ExtractDocumentTypeFromTypedRxJsonSchema<typeof schemaTyped>;
    - 
    -// create the typed RxJsonSchema from the literal typed object.
    -export const heroSchema: RxJsonSchema<HeroDocType> = heroSchemaLiteral;

    Option B: Manually type the document type

    export type HeroDocType = {
    -    passportId: string;
    -    firstName: string;
    -    lastName: string;
    -    age?: number; // optional
    -};

    Option C: Generate the document type from schema during build time

    If your schema is in a .json file or generated from somewhere else, you might generate the typings with the json-schema-to-typescript module.

    3

    Types for the ORM methods

    We also add some ORM-methods for the document.

    export type HeroDocMethods = {
    -    scream: (v: string) => string;
    -};
    4

    Create RxDocument Type

    We can merge these into our HeroDocument.

    export type HeroDocument = RxDocument<HeroDocType, HeroDocMethods>;
    5

    Create RxCollection Type

    Now we can define type for the collection which contains the documents.

     
    -// we declare one static ORM-method for the collection
    -export type HeroCollectionMethods = {
    -    countAllDocuments: () => Promise<number>;
    -}
    - 
    -// and then merge all our types
    -export type HeroCollection = RxCollection<
    -    HeroDocType,
    -    HeroDocMethods,
    -    HeroCollectionMethods
    ->;
    6

    Create RxDatabase Type

    Before we can define the database, we make a helper-type which contains all collections of it.

    export type MyDatabaseCollections = {
    -    heroes: HeroCollection
    -}

    Now the database.

    export type MyDatabase = RxDatabase<MyDatabaseCollections>;
    -

    Using the types

    -

    Now that we have declare all our types, we can use them.

    -
     
    -/**
    - * create database and collections
    - */
    -const myDatabase: MyDatabase = await createRxDatabase<MyDatabaseCollections>({
    -    name: 'mydb',
    -    storage: getRxStorageLocalstorage()
    -});
    - 
    -const heroSchema: RxJsonSchema<HeroDocType> = {
    -    title: 'human schema',
    -    description: 'describes a human being',
    -    version: 0,
    -    keyCompression: true,
    -    primaryKey: 'passportId',
    -    type: 'object',
    -    properties: {
    -        passportId: {
    -            type: 'string'
    -        },
    -        firstName: {
    -            type: 'string'
    -        },
    -        lastName: {
    -            type: 'string'
    -        },
    -        age: {
    -            type: 'integer'
    -        }
    -    },
    -    required: ['passportId', 'firstName', 'lastName']
    -};
    - 
    -const heroDocMethods: HeroDocMethods = {
    -    scream: function(this: HeroDocument, what: string) {
    -        return this.firstName + ' screams: ' + what.toUpperCase();
    -    }
    -};
    - 
    -const heroCollectionMethods: HeroCollectionMethods = {
    -    countAllDocuments: async function(this: HeroCollection) {
    -        const allDocs = await this.find().exec();
    -        return allDocs.length;
    -    }
    -};
    - 
    -await myDatabase.addCollections({
    -    heroes: {
    -        schema: heroSchema,
    -        methods: heroDocMethods,
    -        statics: heroCollectionMethods
    -    }
    -});
    - 
    -// add a postInsert-hook
    -myDatabase.heroes.postInsert(
    -    function myPostInsertHook(
    -        this: HeroCollection, // own collection is bound to the scope
    -        docData: HeroDocType, // documents data
    -        doc: HeroDocument // RxDocument
    -    ) {
    -        console.log('insert to ' + this.name + '-collection: ' + doc.firstName);
    -    },
    -    false // not async
    -);
    - 
    -/**
    - * use the database
    - */
    - 
    -// insert a document
    -const hero: HeroDocument = await myDatabase.heroes.insert({
    -    passportId: 'myId',
    -    firstName: 'piotr',
    -    lastName: 'potter',
    -    age: 5
    -});
    - 
    -// access a property
    -console.log(hero.firstName);
    - 
    -// use a orm method
    -hero.scream('AAH!');
    - 
    -// use a static orm method from the collection
    -const amount: number = await myDatabase.heroes.countAllDocuments();
    -console.log(amount);
    - 
    - 
    -/**
    - * clean up
    - */
    -myDatabase.close();
    - - \ No newline at end of file diff --git a/docs/tutorials/typescript.md b/docs/tutorials/typescript.md deleted file mode 100644 index d29f37c5ec0..00000000000 --- a/docs/tutorials/typescript.md +++ /dev/null @@ -1,250 +0,0 @@ -# TypeScript Setup - -> Use RxDB with TypeScript to define typed schemas, create typed collections, and build fully typed ORM methods. A quick step-by-step guide. - -import {Steps} from '@site/src/components/steps'; - -# Using RxDB with TypeScript - - - -In this tutorial you will learn how to use RxDB with TypeScript. -We will create a basic database with one collection and several ORM-methods, fully typed! - -RxDB directly comes with its typings and you do not have to install anything else, however the latest version of RxDB requires that you are using Typescript v3.8 or newer. -Our way to go is - -- First define what the documents look like -- Then define what the collections look like -- Then define what the database looks like - - - -## Declare the types - -First you import the types from RxDB. - -```typescript -import { - createRxDatabase, - RxDatabase, - RxCollection, - RxJsonSchema, - RxDocument, -} from 'rxdb/plugins/core'; -``` - -## Create the base document type - -First we have to define the TypeScript type of the documents of a collection: - -**Option A**: Create the document type from the schema - -```typescript -import { - toTypedRxJsonSchema, - ExtractDocumentTypeFromTypedRxJsonSchema, - RxJsonSchema -} from 'rxdb'; -export const heroSchemaLiteral = { - title: 'hero schema', - description: 'describes a human being', - version: 0, - keyCompression: true, - primaryKey: 'passportId', - type: 'object', - properties: { - passportId: { - type: 'string', - maxLength: 100 // <- the primary key must have set maxLength - }, - firstName: { - type: 'string' - }, - lastName: { - type: 'string' - }, - age: { - type: 'integer' - } - }, - required: ['firstName', 'lastName', 'passportId'], - indexes: ['firstName'] -} as const; // <- It is important to set 'as const' to preserve the literal type -const schemaTyped = toTypedRxJsonSchema(heroSchemaLiteral); - -// aggregate the document type from the schema -export type HeroDocType = ExtractDocumentTypeFromTypedRxJsonSchema; - -// create the typed RxJsonSchema from the literal typed object. -export const heroSchema: RxJsonSchema = heroSchemaLiteral; -``` - -**Option B**: Manually type the document type - -```typescript -export type HeroDocType = { - passportId: string; - firstName: string; - lastName: string; - age?: number; // optional -}; -``` - -**Option C**: Generate the document type from schema during build time - -If your schema is in a `.json` file or generated from somewhere else, you might generate the typings with the [json-schema-to-typescript](https://www.npmjs.com/package/json-schema-to-typescript) module. - -## Types for the ORM methods - -We also add some ORM-methods for the document. - -```typescript -export type HeroDocMethods = { - scream: (v: string) => string; -}; -``` - -## Create RxDocument Type - -We can merge these into our HeroDocument. - -```typescript -export type HeroDocument = RxDocument; -``` - -## Create RxCollection Type - -Now we can define type for the collection which contains the documents. - -```typescript - -// we declare one static ORM-method for the collection -export type HeroCollectionMethods = { - countAllDocuments: () => Promise; -} - -// and then merge all our types -export type HeroCollection = RxCollection< - HeroDocType, - HeroDocMethods, - HeroCollectionMethods ->; -``` - -## Create RxDatabase Type - -Before we can define the database, we make a helper-type which contains all collections of it. - -```typescript -export type MyDatabaseCollections = { - heroes: HeroCollection -} -``` - -Now the database. - -```typescript -export type MyDatabase = RxDatabase; -``` - - - -## Using the types - -Now that we have declare all our types, we can use them. - -```typescript - -/** - * create database and collections - */ -const myDatabase: MyDatabase = await createRxDatabase({ - name: 'mydb', - storage: getRxStorageLocalstorage() -}); - -const heroSchema: RxJsonSchema = { - title: 'human schema', - description: 'describes a human being', - version: 0, - keyCompression: true, - primaryKey: 'passportId', - type: 'object', - properties: { - passportId: { - type: 'string' - }, - firstName: { - type: 'string' - }, - lastName: { - type: 'string' - }, - age: { - type: 'integer' - } - }, - required: ['passportId', 'firstName', 'lastName'] -}; - -const heroDocMethods: HeroDocMethods = { - scream: function(this: HeroDocument, what: string) { - return this.firstName + ' screams: ' + what.toUpperCase(); - } -}; - -const heroCollectionMethods: HeroCollectionMethods = { - countAllDocuments: async function(this: HeroCollection) { - const allDocs = await this.find().exec(); - return allDocs.length; - } -}; - -await myDatabase.addCollections({ - heroes: { - schema: heroSchema, - methods: heroDocMethods, - statics: heroCollectionMethods - } -}); - -// add a postInsert-hook -myDatabase.heroes.postInsert( - function myPostInsertHook( - this: HeroCollection, // own collection is bound to the scope - docData: HeroDocType, // documents data - doc: HeroDocument // RxDocument - ) { - console.log('insert to ' + this.name + '-collection: ' + doc.firstName); - }, - false // not async -); - -/** - * use the database - */ - -// insert a document -const hero: HeroDocument = await myDatabase.heroes.insert({ - passportId: 'myId', - firstName: 'piotr', - lastName: 'potter', - age: 5 -}); - -// access a property -console.log(hero.firstName); - -// use a orm method -hero.scream('AAH!'); - -// use a static orm method from the collection -const amount: number = await myDatabase.heroes.countAllDocuments(); -console.log(amount); - -/** - * clean up - */ -myDatabase.close(); -``` diff --git a/docs/why-nosql.html b/docs/why-nosql.html deleted file mode 100644 index cd05418a98c..00000000000 --- a/docs/why-nosql.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - -Why NoSQL Powers Modern UI Apps | RxDB - JavaScript Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Why UI applications need NoSQL

    -

    RxDB, a client side, offline first, JavaScript database, is now several years old. -Often new users appear in the chat and ask for that one simple feature: -They want to store and query relational data.

    -
    -

    So why not just implement SQL?

    -
    -

    All these client databases out there have on some kind of document based, NoSQL like, storage engine. PouchDB, Firebase, AWS Datastore, RethinkDB's Horizon, Meteor's Minimongo, Parse, Realm. They all do not have real relational data.

    -

    They might have some kind of weak relational foreign keys like the RxDB Population -or the relational models of AWS Datastore. -But these relations are weak. The foreign keys are not enforced to be valid like in PostgreSQL, and you cannot query -the rows with complex subqueries over different tables or collections and then make mutations based on the result.

    -

    There must be a reason for that. In fact, there are multiple of them and in the following I want to show you why you can neither have, nor want real relational data when you have a client-side database with replication.

    -

    NoSQL

    -

    Transactions do not work with humans involved

    -

    On the server side, transactions are used to run steps of logic inside of a self contained unit of work. The database system ensures that multiple transactions do not run in parallel or interfere with each other. -This works well because on the server side you can predict how longer everything takes. It can be ensured that one transaction does not block everything else for too long which would make the system not responding anymore to other requests.

    -

    When you build a UI based application that is used by a real human, you can no longer predict how long anything takes. -The user clicks the edit button and expects to not have anyone else change the document while the user is in edit mode. -Using a transaction to ensure nothing is changed in between, is not an option because the transaction could be open for a long -time and other background tasks, like replication, would no longer work.

    -

    So whenever a human is involved, this kind of logic has to be implemented using other strategies. Most NoSQL databases like RxDB or CouchDB use a system based on revision and conflicts to handle these.

    -

    Transactions do not work with offline-first

    -

    When you want to build an offline-first application, it is assumed that the user can also read and write data, even when the device has lost the connection to the backend. -You could use database transactions on writes to the client's database state, but enforcing a transaction boundary across other instances like clients or servers, is not possible when there is no connection.

    -

    offline first vs relational transactions

    -

    On the client you could run an update query where all color: red rows are changed to color: blue, but this would not guarantee that there will still be other red documents when the client goes online again and restarts the replication with the server.

    -
    UPDATE docs
    -SET docs.color = 'red'
    -WHERE docs.color = 'blue';
    -

    Relational queries in NoSQL

    -

    What most people want from a relational database, is to run queries over multiple tables. -Some people think that they cannot do that with NoSQL, so let me explain.

    -

    Let's say you have two tables with customers and cities where each city has an id and each customer has a city_id. You want to get every customer that resides in Tokyo. With SQL, you would use a query like this:

    -
    SELECT *
    -FROM city
    -WHERE city.name = 'Tokyo'
    -LEFT JOIN customer ON customer.city_id = city.id;
    -

    With NoSQL you can just do the same, but you have to write it manually:

    -
    const cityDocument = await db.cities.findOne().where('name').equals('Tokyo').exec();
    -const customerDocuments = await db.customers.find().where('city_id').equals(cityDocument.id).exec();
    -

    So what are the differences? The SQL version would run faster on a remote database server because it would aggregate all data there and return only the customers as result set. But when you have a local database, it is not really a difference. Querying the two tables by hand would have about the same performance as a JavaScript implementation of SQL that is running locally.

    -

    The main benefit from using SQL is, that the SQL query runs inside of a single transaction. When a change to one of our two tables happens, while our query runs, the SQL database will ensure that the write does not affect the result of the query. This could happen with NoSQL, while you retrieve the city document, the customer table gets changed and your result is not correct for the dataset that was there when you started the querying. As a workaround, you could observe the database for changes and if a change happened in between, you have to re-run everything.

    -

    no relational data

    -

    Reliable replication

    -

    In an offline first app, your data is replicated from your backend servers to your users and you want it to be reliable. -The replication is reliable when, no matter what happens, every online client is able to run a replication -and end up with the exact same database state as any other client.

    -

    Implementing a reliable replication protocol is hard because of the circumstances of your app:

    -
      -
    • Your users have unknown devices.
    • -
    • They have an unknown internet speed.
    • -
    • They can go offline or online at any time.
    • -
    • Clients can be offline for a several days with un-synced changes.
    • -
    • You can have many users at the same time.
    • -
    • The users can do many database writes at the same time to the same entities.
    • -
    -

    Now lets say you have a SQL database and one of your users, called Alice, runs a query that mutates some rows, based on a condition.

    -
    # mark all items out of stock as inStock=FALSE
    -UPDATE
    -  Table_A
    -SET
    -  Table_A.inStock = FALSE
    -FROM
    -  Table_A
    -WHERE
    -  Table_A.amountInStock = 0
    -

    At first, the query runs on the local database of Alice and everything is fine.

    -

    But at the same time Bob, the other client, updates a row and sets amountInStock from 0 to 1. -Now Bob's client replicates the changes from Alice and runs them. Bob will end up with a different database state than Alice because on one of the rows, the WHERE condition was not met. This is not what we want, so our replication protocol should be able to fix it. For that it has to reduce all mutations into a deterministic state.

    -

    Let me loosely describe how "many" SQL replications work:

    -

    Instead of just running all replicated queries, we remember a list of all past queries. When a new query comes in that happened before our last query, we roll back the previous queries, run the new query, and then re-execute our own queries on top of that. For that to work, all queries need a timestamp so we can order them correctly. But you cannot rely on the clock that is running at the client. Client side clocks drift, they can run in a different speed or even a malicious client modifies the clock on purpose. So instead of a normal timestamp, we have to use a Hybrid Logical Clock that takes a client generated id and the number of the clients query into account. Our timestamp will then look like 2021-10-04T15:29.40.273Z-0000-eede1195b7d94dd5. These timestamps can be brought into a deterministic order and each client can run the replicated queries in the same order.

    -

    While this sounds easy and realizable, we have some problems: -This kind of replication works great when you replicate between multiple SQL servers. It does not work great when you replicate between a single server and many clients.

    -
      -
    1. As mentioned above, clients can be offline for a long time which could require us to do many and heavy rollbacks on each client when someone comes back after a long time and replicates the change.
    2. -
    3. We have many clients where many changes can appear and our database would have to roll back many times.
    4. -
    5. During the rollback, the database cannot be used for read queries.
    6. -
    7. It is required that each client downloads and keeps the whole query history.
    8. -
    -

    With NoSQL, replication works different. A new client downloads all current documents and each time a document changes, that document is downloaded again. Instead of replicating the query that leads to a data change, we just replicate the changed data itself. Of course, we could do the same with SQL and just replicate the affected rows of a query, like WatermelonDB does it. This was a clever way to go for WatermelonDB, because it was initially made for React Native and did want to use the fast SQLite instead of the slow AsyncStorage. But in a more general view, it defeats the whole purpose of having a replicating relational database because you have transactions locally, but these transactions become meaningless as soon as the data goes through the replication layer.

    -

    database replication

    -

    Server side validation

    -

    Whenever there is client-side input, it must be validated on the server. -On a NoSQL database, validating a changed document is trivial. The client sends the changed document to the server, and the server can then check if the user was allowed to modify that one document and if the applied changes are ok.

    -

    Safely validating a SQL query is up to impossible.

    -
      -
    • You first need a way to parse the query with all this complex SQL syntax and keywords.
    • -
    • You have to ensure that the query does not DOS your system.
    • -
    • Then you check which rows would be affected when running the query and if the user was allowed to change them
    • -
    • Then you check if the mutation to that rows are valid.
    • -
    -

    For simple queries like an insert/update/delete to a single row, this might be doable. But a query with 4 LEFT JOIN will be hard.

    -

    Event optimization

    -

    With NoSQL databases, each write event always affects exactly one document. This makes it easy to optimize the processing of events at the client. For example instead of handling multiple updates to the same document, when the user comes online again, you could skip everything but the last event.

    -

    Similar to that you can optimize observable query results. When you query the customers table you get a query result of 10 customers. Now a new customer is added to the table and you want to know how the new query results look like. You could analyze the event and now you know that you only have to add the new customer to the previous results set, instead of running the whole query again. These types of optimizations can be run with all NoSQL queries and even work with limit and skip operators. In RxDB this all happens in the background with the EventReduce algorithm that calculates new query results on incoming changes.

    -

    These optimizations do not really work with relational data. A change to one table could affect a query to any other tables. and you could not just calculate the new results based on the event. You would always have to re-run the full query to get the updated results.

    -

    Migration without relations

    -

    Sooner or later you change the layout of your data. You update the schema and you also have to migrate the stored rows/documents. In NoSQL this is often not a big deal because all of your documents are modeled as self containing piece of data. There is an old version of the document and you have a function that transforms it into the new version.

    -

    With relational data, nothing is self-contained. The relevant data for the migration of a single row could be inside any other table. So when changing the schema, it will be important which table to migrate first and how to orchestrate the migration or relations.

    -

    On client side applications, this is even harder because the client can close the application at any time and the migration must be able to continue.

    -

    Everything can be downgraded to NoSQL

    -

    To use an offline first database in the frontend, you have to make it compatible with your backend APIs. -Making software things compatible often means you have to find the lowest common denominator. -When you have SQLite in the frontend and want to replicate it with the backend, the backend also has to use SQLite. You cannot even use PostgreSQL because it has a different SQL dialect and some queries might fail. But you do not want to let the frontend dictate which technologies to use in the backend just to make replication work.

    -

    With NoSQL, you just have documents and writes to these documents. You can build a document based layer on top of everything by removing functionality. It can be built on top of SQL, but also on top of a graph database or even on top of a key-value store like levelDB or FoundationDB.

    -

    With that document layer you can build a Sync Engine that serves documents sorted by the last update time and there you have a realtime replication.

    -

    Caching query results

    -

    Memory is limited and this is especially true for client side applications where you never know how much free RAM the device really has. You want to have a fast realtime UI, so your database must be able to cache query results.

    -

    When you run a SQL query like SELECT .. the result of it can be anything. An array, a number, a string, a single row, it depends on how the query goes on. So the caching strategy can only be to keep the result in memory, once for each query. -This scales very bad because the more queries you run, the more results you have to store in memory.

    -

    When you make a query to a NoSQL collection, you always know how the result will look like. It is a list of documents, based on the collection's schema (if you have one). The result set is stored in memory, but because you get similar documents for different queries to the same collection, we can de-duplicated the documents. So when multiple queries return the same document, we only have it in the cache once and each query caches point to the same memory object. So no matter how many queries you make, your cache maximum is the collection size.

    -

    TypeScript support

    -

    Modern web apps are build with TypeScript and you want the transpiler to know the types of your query result so it can give you build time errors when something does not match. This is quite easy on document based systems. The typings of for each document of a collection can be generated from the schema, and all queries to that collection will always return the given document type. With SQL you have to manually write the typings for each query by hand because it can contain all these aggregate functions that affect the type of the query's result.

    -

    typescript

    -

    What you lose with NoSQL

    -
      -
    • You can not run relational queries across tables inside a single transaction.
    • -
    • You can not mutate documents based on a WHERE clause, in a single transaction.
    • -
    • You need to resolve replication conflicts on a per-document basis.
    • -
    -

    But there is database XY

    -

    Yes, there are SQL databases out there that run on the client side or have replication, but not both.

    -
      -
    • WebSQL / sql.js: In the past there was WebSQL in the browser. It was a direct mapping to SQLite because all browsers used the SQLite implementation. You could store relational data in it, but there was no concept of replication at any point in time. sql.js is an SQLite complied to JavaScript. It has not replication and it has (for now) no persistent storage, everything is stored in memory.
    • -
    • WatermelonDB is a SQL databases that runs in the client. WatermelonDB uses a document-based replication that is not able to replicate relational queries.
    • -
    • Cockroach / Spanner/ PostgreSQL etc. are SQL databases with replication. But they run on servers, not on clients, so they can make different trade offs.
    • -
    -

    Further read

    -
    - - \ No newline at end of file diff --git a/docs/why-nosql.md b/docs/why-nosql.md deleted file mode 100644 index 116f20deddf..00000000000 --- a/docs/why-nosql.md +++ /dev/null @@ -1,208 +0,0 @@ -# Why NoSQL Powers Modern UI Apps - -> Discover how NoSQL enables offline-first UI apps. Learn about easy replication, conflict resolution, and why relational data isn't always necessary. - -import {VideoBox} from '@site/src/components/video-box'; - -# Why UI applications need NoSQL - -[RxDB](https://rxdb.info), a client side, offline first, JavaScript database, is now several years old. -Often new users appear in the chat and ask for that one simple feature: -They want to store and query **relational data**. - -> So why not just implement SQL? - -All these client databases out there have on some kind of document based, NoSQL like, storage engine. PouchDB, Firebase, AWS Datastore, RethinkDB's [Horizon](https://github.com/rethinkdb/horizon), Meteor's [Minimongo](https://github.com/mWater/minimongo), [Parse](https://parseplatform.org/), [Realm](https://realm.io/). They all do not have real relational data. - -They might have some kind of weak relational foreign keys like the [RxDB Population](./population.md) -or the [relational models](https://docs.amplify.aws/lib/datastore/relational/q/platform/js/) of AWS Datastore. -But these relations are weak. The foreign keys are not enforced to be valid like in PostgreSQL, and you cannot query -the rows with complex subqueries over different tables or collections and then make mutations based on the result. - -There must be a reason for that. In fact, there are multiple of them and in the following I want to show you why you can neither have, nor want real relational data when you have a client-side database with replication. - - - -## Transactions do not work with humans involved - -On the server side, transactions are used to run steps of logic inside of a self contained `unit of work`. The database system ensures that multiple transactions do not run in parallel or interfere with each other. -This works well because on the server side you can predict how longer everything takes. It can be ensured that one transaction does not block everything else for too long which would make the system not responding anymore to other requests. - -When you build a UI based application that is used by a real human, you can no longer predict how long anything takes. -The user clicks the edit button and expects to not have anyone else change the document while the user is in edit mode. -Using a transaction to ensure nothing is changed in between, is not an option because the transaction could be open for a long -time and other background tasks, like replication, would no longer work. - -So whenever a human is involved, this kind of logic has to be implemented using other strategies. Most NoSQL databases like [RxDB](./) or [CouchDB](./replication-couchdb.md) use a system based on [revision and conflicts](./transactions-conflicts-revisions.md) to handle these. - -## Transactions do not work with offline-first - -When you want to build an [offline-first](./offline-first.md) application, it is assumed that the user can also read and write data, even when the device has lost the connection to the backend. -You could use database transactions on writes to the client's database state, but enforcing a transaction boundary across other instances like clients or servers, is not possible when there is no connection. - - - -On the client you could run an update query where all `color: red` rows are changed to `color: blue`, but this would not guarantee that there will still be other `red` documents when the client goes online again and restarts the replication with the server. - -```sql -UPDATE docs -SET docs.color = 'red' -WHERE docs.color = 'blue'; -``` - -## Relational queries in NoSQL - -What most people want from a relational database, is to run queries over multiple tables. -Some people think that they cannot do that with NoSQL, so let me explain. - -Let's say you have two tables with `customers` and `cities` where each city has an `id` and each customer has a `city_id`. You want to get every customer that resides in `Tokyo`. With SQL, you would use a query like this: - -```sql -SELECT * -FROM city -WHERE city.name = 'Tokyo' -LEFT JOIN customer ON customer.city_id = city.id; -``` - -With **NoSQL** you can just do the same, but you have to write it manually: - -```typescript -const cityDocument = await db.cities.findOne().where('name').equals('Tokyo').exec(); -const customerDocuments = await db.customers.find().where('city_id').equals(cityDocument.id).exec(); -``` - -So what are the differences? The SQL version would run faster on a remote database server because it would aggregate all data there and return only the customers as result set. But when you have a local database, it is not really a difference. Querying the two tables by hand would have about the same performance as a JavaScript implementation of SQL that is running locally. - -The main benefit from using SQL is, that the SQL query runs inside of a **single transaction**. When a change to one of our two tables happens, while our query runs, the SQL database will ensure that the write does not affect the result of the query. This could happen with NoSQL, while you retrieve the city document, the customer table gets changed and your result is not correct for the dataset that was there when you started the querying. As a workaround, you could observe the database for changes and if a change happened in between, you have to re-run everything. - - - -## Reliable replication - -In an offline first app, your data is replicated from your backend servers to your users and you want it to be reliable. -The replication is **reliable** when, no matter what happens, every online client is able to run a replication -and end up with the **exact same** database state as any other client. - -Implementing a reliable replication protocol is hard because of the circumstances of your app: - -- Your users have unknown devices. -- They have an unknown internet speed. -- They can go offline or online at any time. -- Clients can be offline for a several days with un-synced changes. -- You can have many users at the same time. -- The users can do many database writes at the same time to the same entities. - -Now lets say you have a SQL database and one of your users, called Alice, runs a query that mutates some rows, based on a condition. - -```sql -# mark all items out of stock as inStock=FALSE -UPDATE - Table_A -SET - Table_A.inStock = FALSE -FROM - Table_A -WHERE - Table_A.amountInStock = 0 -``` - -At first, the query runs on the local database of Alice and everything is fine. - -But at the same time Bob, the other client, updates a row and sets `amountInStock` from `0` to `1`. -Now Bob's client replicates the changes from Alice and runs them. Bob will end up with a different database state than Alice because on one of the rows, the `WHERE` condition was not met. This is not what we want, so our replication protocol should be able to fix it. For that it has to reduce all mutations into a deterministic state. - -Let me loosely describe how "many" SQL replications work: - -Instead of just running all replicated queries, we remember a list of all past queries. When a new query comes in that happened `before` our last query, we roll back the previous queries, run the new query, and then re-execute our own queries on top of that. For that to work, all queries need a timestamp so we can order them correctly. But you cannot rely on the clock that is running at the client. Client side clocks drift, they can run in a different speed or even a malicious client modifies the clock on purpose. So instead of a normal timestamp, we have to use a [Hybrid Logical Clock](https://jaredforsyth.com/posts/hybrid-logical-clocks/) that takes a client generated id and the number of the clients query into account. Our timestamp will then look like `2021-10-04T15:29.40.273Z-0000-eede1195b7d94dd5`. These timestamps can be brought into a deterministic order and each client can run the replicated queries in the same order. - -While this sounds easy and realizable, we have some problems: -This kind of replication works great when you replicate between multiple SQL servers. It does not work great when you replicate between a single server and many clients. - -1. As mentioned above, clients can be offline for a long time which could require us to do many and heavy rollbacks on each client when someone comes back after a long time and replicates the change. -2. We have many clients where many changes can appear and our database would have to roll back many times. -3. During the rollback, the database cannot be used for read queries. -4. It is required that each client downloads and keeps the whole query history. - -With **NoSQL**, replication works different. A new client downloads all current documents and each time a document changes, that document is downloaded again. Instead of replicating the query that leads to a data change, we just replicate the changed data itself. Of course, we could do the same with SQL and just replicate the affected rows of a query, like WatermelonDB [does it](https://youtu.be/uFvHURTRLxQ?t=1133). This was a clever way to go for WatermelonDB, because it was initially made for React Native and did want to use the fast SQLite instead of the slow [AsyncStorage](https://medium.com/@Sendbird/extreme-optimization-of-asyncstorage-in-react-native-b2a1e0107b34). But in a more general view, it defeats the whole purpose of having a replicating relational database because you have transactions locally, but these transactions become **meaningless** as soon as the data goes through the replication layer. - - - -## Server side validation - -Whenever there is client-side input, it must be validated on the server. -On a NoSQL database, validating a changed document is trivial. The client sends the changed document to the server, and the server can then check if the user was allowed to modify that one document and if the applied changes are ok. - -Safely validating a SQL query is up to impossible. - - You first need a way to parse the query with all this complex SQL syntax and keywords. - - You have to ensure that the query does not DOS your system. - - Then you check which rows would be affected when running the query and if the user was allowed to change them - - Then you check if the mutation to that rows are valid. - -For simple queries like an insert/update/delete to a single row, this might be doable. But a query with 4 `LEFT JOIN` will be hard. - -## Event optimization - -With NoSQL databases, each write event always affects exactly one document. This makes it easy to optimize the processing of events at the client. For example instead of handling multiple updates to the same document, when the user comes online again, you could skip everything but the last event. - -Similar to that you can optimize observable query results. When you query the `customers` table you get a query result of 10 customers. Now a new customer is added to the table and you want to know how the new query results look like. You could analyze the event and now you know that you only have to add the new customer to the previous results set, instead of running the whole query again. These types of optimizations can be run with all NoSQL queries and even work with `limit` and `skip` operators. In RxDB this all happens in the background with the [EventReduce algorithm](https://github.com/pubkey/event-reduce) that calculates new query results on incoming changes. - -These optimizations do not really work with relational data. A change to one table could affect a query to any other tables. and you could not just calculate the new results based on the event. You would always have to re-run the full query to get the updated results. - -## Migration without relations - -Sooner or later you change the layout of your data. You update the schema and you also have to migrate the stored rows/documents. In NoSQL this is often not a big deal because all of your documents are modeled as self containing piece of data. There is an old version of the document and you have a function that transforms it into the new version. - -With relational data, nothing is self-contained. The relevant data for the migration of a single row could be inside any other table. So when changing the schema, it will be important which table to migrate first and how to orchestrate the migration or relations. - -On client side applications, this is even harder because the client can close the application at any time and the migration must be able to continue. - -## Everything can be downgraded to NoSQL - -To use an offline first database in the frontend, you have to make it compatible with your backend APIs. -Making software things compatible often means you have to find the **lowest common denominator**. -When you have SQLite in the frontend and want to replicate it with the backend, the backend also has to use SQLite. You cannot even use PostgreSQL because it has a different SQL dialect and some queries might fail. But you do not want to let the frontend dictate which technologies to use in the backend just to make replication work. - -With NoSQL, you just have documents and writes to these documents. You can build a document based layer on top of everything by **removing** functionality. It can be built on top of SQL, but also on top of a graph database or even on top of a key-value store like [levelDB](./adapters.md#leveldown) or [FoundationDB](./rx-storage-foundationdb.md). - -With that document layer you can build a [Sync Engine](./replication.md) that serves documents sorted by the last update time and there you have a realtime replication. - -## Caching query results - -Memory is limited and this is especially true for client side applications where you never know how much free RAM the device really has. You want to have a fast realtime UI, so your database must be able to cache query results. - -When you run a SQL query like `SELECT ..` the result of it can be anything. An `array`, a `number`, a `string`, a single row, it depends on how the query goes on. So the caching strategy can only be to keep the result in memory, once for each query. -This scales very bad because the more queries you run, the more results you have to store in memory. - -When you make a query to a NoSQL collection, you always know how the result will look like. It is a list of documents, based on the collection's schema (if you have one). The result set is stored in memory, but because you get similar documents for different queries to the same collection, we can de-duplicated the documents. So when multiple queries return the same document, we only have it in the cache **once** and each query caches point to the same memory object. So no matter how many queries you make, your cache maximum is the collection size. - -## TypeScript support - -Modern web apps are build with TypeScript and you want the transpiler to know the types of your query result so it can give you build time errors when something does not match. This is quite easy on document based systems. The typings of for each document of a collection can be generated from the schema, and all queries to that collection will always return the given document type. With SQL you have to manually write the typings for each query by hand because it can contain all these aggregate functions that affect the type of the query's result. - - - - - -## What you lose with NoSQL - -- You can not run relational queries across tables inside a single transaction. -- You can not mutate documents based on a `WHERE` clause, in a single transaction. -- You need to resolve replication conflicts on a per-document basis. - -## But there is database XY - -Yes, there are SQL databases out there that run on the client side or have replication, but not both. - -- WebSQL / [sql.js](https://github.com/sql-js/sql.js/): In the past there was **WebSQL** in the browser. It was a direct mapping to SQLite because all browsers used the SQLite implementation. You could store relational data in it, but there was no concept of replication at any point in time. **sql.js** is an SQLite complied to JavaScript. It has not replication and it has (for now) no persistent storage, everything is stored in memory. -- WatermelonDB is a SQL databases that runs in the client. WatermelonDB uses a document-based replication that is not able to replicate relational queries. -- Cockroach / Spanner/ PostgreSQL etc. are SQL databases with replication. But they run on servers, not on clients, so they can make different trade offs. - -# Further read - -- Cockroach Labs: [Living Without Atomic Clocks](https://www.cockroachlabs.com/blog/living-without-atomic-clocks/) -- [Transactions, Conflicts and Revisions in RxDB](./transactions-conflicts-revisions.md) -- [Why MongoDB, Cassandra, HBase, DynamoDB, and Riak will only let you perform transactions on a single data item](https://dbmsmusings.blogspot.com/2015/10/why-mongodb-cassandra-hbase-dynamodb_28.html) - -- `Make a PR to this file if you have more interesting links to that topic`

    Fulltext Search

    -

    To run fulltext search queries on the local data, RxDB has a fulltext search plugin based on flexsearch and RxPipeline. On each write to a given source RxCollection, an indexer is running to map the written document data into a fulltext search index. -The index can then be queried efficiently with complex fulltext search operations.

    - -
      -
    1. Efficient Search and Indexing
    2. -
    -

    The plugin utilizes the FlexSearch library, known for its speed and memory efficiency. This ensures that search operations are performed quickly, even with large datasets. The search engine can handle multi-field queries, partial matching, and complex search operations, providing users with highly relevant results.

    -
      -
    1. Local Data Indexing
    2. -
    -

    With the plugin, all search operations are performed on the local data stored within the RxDB collections. This means that users can execute fulltext search queries without the need for an external server or database, which is especially beneficial for offline-first applications. The local indexing ensures that search queries are executed quickly, reducing the latency typically associated with remote database queries. Also when used in multiple browser tabs, it is ensured that through Leader Election, only exactly one tabs is doing the work of indexing without having an overhead in the other browser tabs.

    -
      -
    1. Real-time Indexing
    2. -
    -

    The plugin integrates seamlessly with RxDB's reactive nature. Every time a document is written to an RxCollection, an indexer updates the fulltext search index in real-time. This ensures that search results are always up-to-date, reflecting the most current state of the data without requiring manual reindexing.

    -
      -
    1. Persistent indexing
    2. -
    -

    The fulltext search index is efficiently persisted within the RxCollection, ensuring that the index remains intact across app restarts. When documents are added or updated in the collection, the index is incrementally updated in real-time, meaning only the changes are processed rather than reindexing the entire dataset. This incremental approach not only optimizes performance but also ensures that subsequent app launches are quick, as there's no need to reindex all the data from scratch, making the search feature both reliable and fast from the moment the app starts. When using an encrypted storage the index itself and incremental updates to it are stored fully encrypted and are only decrypted in-memory.

    -
      -
    1. Complex Query Support
    2. -
    -

    The FlexSearch-based plugin allows for sophisticated search queries, including multi-term and contextual searches. Users can perform complex searches that go beyond simple keyword matching, enabling more advanced use cases like searching for documents with specific phrases, relevance-based sorting, or even phonetic matching.

    -
      -
    1. Offline-First Support and Privacy
    2. -
    -

    As RxDB is designed with offline-first applications in mind, the fulltext search plugin supports this paradigm by ensuring that all search operations can be performed offline. This is crucial for applications that need to function in environments with intermittent or no internet connectivity, offering users a consistent and reliable search experience with zero latency.

    - -

    The flexsearch search is a RxDB Premium Package 👑 which must be purchased and imported from the rxdb-premium npm package.

    -

    Step 1: Add the RxDBFlexSearchPlugin to RxDB.

    -
    import { RxDBFlexSearchPlugin } from 'rxdb-premium/plugins/flexsearch';
    -import { addRxPlugin } from 'rxdb/plugins/core';
    -addRxPlugin(RxDBFlexSearchPlugin);
    -

    Step 2: Create a RxFulltextSearch instance on top of a collection with the addFulltextSearch() function.

    -
    import { addFulltextSearch } from 'rxdb-premium/plugins/flexsearch';
    -const flexSearch = await addFulltextSearch({
    -    // unique identifier. Used to store metadata and continue indexing on restarts/reloads.
    -    identifier: 'my-search',
    -    // The source collection on whose documents the search is based on
    -    collection: myRxCollection,
    -    /**
    -     * Transforms the document data to a given searchable string.
    -     * This can be done by returning a single string property of the document
    -     * or even by concatenating and transforming multiple fields like:
    -     * doc => doc.firstName + ' ' + doc.lastName
    -     */
    -    docToString: doc => doc.firstName,
    -    /**
    -     * (Optional)
    -     * Amount of documents to index at once.
    -     * See https://rxdb.info/rx-pipeline.html
    -     */
    -    batchSize: number;
    -    /**
    -     * (Optional)
    -     * lazy: Initialize the in memory fulltext index at the first search query.
    -     * instant: Directly initialize so that the index is already there on the first query.
    -     * Default: 'instant'
    -     */
    -    initialization: 'instant',
    -    /**
    -     * (Optional)
    -     * @link https://github.com/nextapps-de/flexsearch#index-options
    -     */
    -    indexOptions: {},
    -});
    -

    Step 3: Run a search operation:

    -
    // find all documents whose searchstring contains "foobar"
    -const foundDocuments = await flexSearch.find('foobar');
    - 
    -/**
    - * You can also use search options as second parameter
    - * @link https://github.com/nextapps-de/flexsearch#search-options
    - */
    -const foundDocuments = await flexSearch.find('foobar', { limit: 10 });

    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

    jSMcM)CI|V2m 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%0AQgB3DcAj*)TDH+N{U8^33 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Wn{&V1f`4~-{=Rwx5j+p}BZW%e3$=Nv z;iP--LU^kV$3Z>`5RAwmTBcmmJ;< zL?j%NiPIoQOtu&S%<-*_eq(p^(S^g>w$P|che8FcTYGVm5&U5q+Nt5o7wZnSqz(g( z`|eApWCSFIM`XkTV7Yp?0%CYx-LnYeZ;|$Q5n8FqKG>&Pt%*}{c5BdB-efy;5`q#x zcRRIEV<3VgP-5ROK>VE^fY|W#YGmK`G>Z_FN%D^%UyJ|*aB*w{j9)wuRXlJBU9V2= zkmq-?KK9A4s{X!i{p+9d^Z9C6df@q|gV>_YD98DDAsS48z~I9R^`V8vYHS@_ho*@O zy~#g$T?cLb^ycsS-@?DQDg8`sb#i{ZVCWj~S^D2+jXR?v@h)v9Gf%y`|4p;#KfHUk z{+22x77i03#Ip|obPIT*5bsiNE79;$s8MX{?Zfynk$F~rf2caw<` zN7-e3o$W9`0PeSX`Y-|0X+sgB+sYinK8f_CoRQWKkv==!n8B|i{AP8~syzFi^20&S z>LCe>g$%!Clc9;WSk7Cc`}w;fuUQ$xer>JiQ2CAm{iM1YLwW@Ls?y|gqC z7ly9zbITj1V7}>zxQQP&-Hxz*oP!XNu|2kz9K*)qa--4vmzr(Uc_HUE53QC5?n~R$ zaz<~tn@?)IUynW+qdvTCAldQ;mSV;w;}&AU&3sj<5q@X?VZ!OLE(s)-%!Rca$A4pF z$JY022sGVe)7IdVyu`s5P0C@N{&-@MnVgBPH&ut&Bb9FrHaVleg+xO#iP+5~;#Jn`|t_ z%drbo0eZkb4kVR01b(1E=&`bJ9IfyaG7-DycE(ih4wg4UxkmkZq|z@=T-0XL#C0|} z(2xLOT^r5PG~zSjR%Y8*x@vv#YSenH+1wH%qJ!$1o@=`r2Lk+>I4+&fjA%?^aBFvA ze3&-W#YYxq;$FNKxjiv;BhJdWz@_FwkHaM>%2~d#f2RkKGP2wMB*D`BIABUmVLEi8JeSg!7U=!>bV;(PMF*6=q@(Nn-tGTNhWsa%qQIe+(^GndZNL0 z8-4ZliL%c2mQ8p0)@k=(L7v;(eXYb!)RVfo8kraA zm>o`~p6rWK)w*sM^gBP4U;Fz>h|L_(gO4?u?t>im`z8ki2Zh+})}jdr?MSwAQ-qoz zF;4MuCc|Aho^1DAog?2k##r^#yi0?Z5L-f>(?U+S!WHhoavrDrT&GQ3F*65xoqWD_ zvp?A$YtUN5x*RZAwW6=w}Pl!Td1ChHa}RylbbdIdNap!gF#mJ9}@gEH@{LUYUDyqugc zOn%3PyzeEtr^A|I_={9XZ^$;47xJK|(Ng^N!^)Te;b zz6>RYQ!h{BATS*1Dd%3ceWLRjH$pGtY<;qL`AU?K^;f5Yz6-m0+ZKzC7Kztw<++{& z_;830vL@9hN*PjOTq#tnZ({$bdAcxfcGu?&nSsf*o2qLB9=!~592@{Nwu$|olZ#X> zxC^TUt&3fLjc+Q1C{Ap2g1=Jf`k2(8D8n*)RC|zIcI^d>mC|*l&n=A}6=JUXXP^L! z!N^7!o+T0mBrr8+UPg{Pv#l0P%5fj{Tzs`8)1Za23Xd5KF=)N^+YE6rk%0AI)4uiD=;w8d1Bmm@-xf%7l+a@`itn4Br8{9 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

    ~Puc1=ecM^`sg1hlCD<2)<6_ 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 diff --git a/docs/files/smartphone/server.svg b/docs/files/smartphone/server.svg deleted file mode 100644 index 15daacddcde..00000000000 --- a/docs/files/smartphone/server.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - diff --git a/docs/files/smartphone/server_white.svg b/docs/files/smartphone/server_white.svg deleted file mode 100644 index 494f2624e68..00000000000 --- a/docs/files/smartphone/server_white.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - diff --git a/docs/files/smartphone/tablet.svg b/docs/files/smartphone/tablet.svg deleted file mode 100644 index b4d25d2a0a5..00000000000 --- a/docs/files/smartphone/tablet.svg +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/files/smartphone/tablet_white.svg b/docs/files/smartphone/tablet_white.svg deleted file mode 100644 index e594eab7043..00000000000 --- a/docs/files/smartphone/tablet_white.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - diff --git a/docs/files/sync.gif b/docs/files/sync.gif deleted file mode 100644 index a01392196f48ffaf826461653189d08567d3a366..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1354425 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

    3@q!lI6Y=SdrKgfy73hf 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μ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

    qhO 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

    Ew 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 q zsmaGj3`ai{Tk@1^<)Z->Ez8P0Lgv5gTktNa&^6}^wyD~)?BK7vH@!Q%XGPP2qlL~z z%~@~HwI45?zXH%SUp@Nv;=sFwACXGmHwXTF>|GA}^q}|uNYn|*Qj#t^;JwP;=b9^_ zf_o{A3JeIgI31iG2=a;cV2dm;H=qDfQ2WSEKKct`q>mG{@5R;GV3fW(O7i?ZpS3LF zaMKImz#YU+tP+eVvj7phOXVeuV(Jjq7nRp|)T|Py@~vV&E~m3!=`|MRH1_MNb=Tv!dy$9Pi=;8x^os(r2j1GjR;jAQ z4x@L5le5M^=|b$rj5hi^c0ywaKZ^BL6f$Q#UC@qI8vaVjRE|Q9BeCC~Z6j zIm!K;bOy`!K-xzGZAj!>0R?K_|)CcdF^UU&5y0wPNm<#cK~Bz!Vs?Ma7L!aTP{Zk=q1ln6UIF9ef1&y~kNwq$O+P(s7jq=-%Np?v_bY!XK zm4fga5_FJopsb*DW>#U3;t~kdi14dh@BdfT~ zfS>1&&_&a{MV~6B#<&28E{xE|lr7pQTB=I$UFpD6dAxoe77=YzZs5P){RLA&9uoO= zs2njWE-&3)IvBBTfKim;j8^G&RX7m>sNa#o7Y6MG#UsGX6nwVo&`^B58Kaiu_dqN4 z#F9z{PHG?)WuHwyVJQ%eV-ulk0Bywo5ep=z`ZAv*j46cDEv0t>JmCOO2-)vPvS%dE zEfcG~MnL|E2zNE}0X?A*1bMf5#>2{*{yN23zH(-hcb?Cen2WRGiz@4zFrp^R*R-;E zoBPz?9Spxk*$+iKj0}*;11@s(PJRjtmf&U?SY`>|p9_L? zvi+{M=mR_m!KrnN87yN&I79_iyXjtY7iW;iqny4QStB3!PxvuY$Je%={x7BP*_Gs{ zAs#VHkH*+;$iMhI_ziK!ExY>Tx@Aj3LcTjN`jtL0QGp#*HW^A+jFC4J19|Bjf*Ju1 zKN_d+^$Ola>K8evK_BtJw|0O&?syxOl3y9~GosJ7zNBJq)Vn)qrC#pY_Xd=rF#kT-ax>dEE8Imrqvd}v`)dIZtWjGY3 z)}+(BfmKaAvep2Et^uW_k=PGN9fG2+@5$eLB6_yR^rKn%%&)4wC!pR}c8t9z47^5iMpo}iY9&d2_qO5d%%j+lZ8x-Qhd#9Lq&DsF5JpjN zA*8Xt@C*^-mI5zVx$6zFxog<#RQtKRbQ#K7ReEp}&c@U$!!N1%PR1_7=0cl^de2YYb9nZh* zk%vnM1ILuET#)|C6d)Ynor&mswShT4VkJ26Xq;e^ z2wF}lzI!(Bzw;1^>uE~%u^dBK-=og_0Tqo#`Jr5VxAuo?D*F+DX@we{PdEO9cx}j- zC4{85AZ-NNhZ;G+fZuz_=?lP^=~q~ zv?aY<{TNHHr84`0Hv5UaYh$yrtCoFL(|vogh75vFh-Fc1ruuvMI|OJ&j!*d==NWUj zVC&8`l`RuCVR_bW#;@st$462|%cwHu%_iA8Mn~AvX6D{E$ells+lLHsUolT9s}?Vd zYdM_r;Z3DY8TCQ#@TF_*H|HK(%l`4k8P|cvIc4qdWbVCrhu*z7yKL~{D*ZBlv%HG{eLFC;g&&@?A!@t=zQXK!k^Tcw9`AE1}hZ#=Rg zA}YqUba-_yp4_$GrICb9SsHnh#ojmA9IJ27Z2pg zX3I1UEz>mfsquHezd!xMb37b5@Av!pdOaVHYo*H9!19HKXWTD`e0!QVzdK}Lm4n=9 zv#Idq%aj~hJ*w`n-NvQ1!}@|v`}%#~3fYpe`GC{|iXeyG1^fI4JHqa)LZf9hG*mW? znJ|2VY!gEJH+ho7+;3yd^djkpA|ez%+26T!4&}9S2!uv?FIizW-j%aBPH9w)m3PRT zp0{oGdVP?o3rRTZ7{dyy(mUV$+_}HavB4!aXIoBU*RrE=?iFC(qXzHII$VV;qsG=V ze~OVlKaAm@%zOMUC6}5Dto!51qjS40x29g%{m<9G{%0u?YM1wh2f37%lPrBJzYloI zZcxgSH-)%|@*}GIvcWIh>@yM7%wP7H7JVoH8thjo& z?98a^l^e~we{J&Ia^2i6WW1OTUzisZR$eE0@=1k)8R<|YsK!kYT=L4Ztv<&) z+Nx-<&E~5UnPtARKoIsmW(B5-zW=~bO_Z9xo;Ooh9EH(^6M7jQj?-?t7w8` z9%P|lq{F5udgl1Ol*uqltD35ZOjbKC<8W}ZcV)S83@!bZb&P%sM)GBy1ZSfJTI(`^ zquCjjUpQH?YsA~RBZ-Zim#JnUz>@~jx5=#MKYDO*bFSGmvw}X;)Ny3fg8)gHUCf-M z+#+*=4>>6N-SAbhLLT;eh`zd<@!SGc=BxUMhAras?ih36%PNMrp-cCCxuc!@j@qDh=y+s!6)rK7X_w($ET<^ddYo?6Ol_Bv^_IjX4jb&k=!eZDiBM3f?tvxgffp2 z0d|qD2D8o?q$8_KcAL|P8OlJxZJ{e;xR+U+jKxz)HoPHHh zld4#>WqLbXzEZw*5``-e3>j-Q$kr%8O8Qdf8YSR=*E4FiWQV5j74Y13h{#(!V#U?$ zi)+@vf^3kEAR^7G=6OUm#omUiCMQsMRXek_&OXTQ!dC#Fkv-%vAwK`vcD>B7aM=%Mj4_x}l>`*f{|&HDg{RV$^+ z=c`K{#)a4w{b-B50{%9n>z}OCQfkEZZh{s(KYPM_WOY68Ms*}8irk?POBW$K-ba0g z=g%mkfd4emZUx3PmjfbAacnrH_HrnXVAd}-dDvg(C)Mf}#bj7LDh_|vqpsXE*-ASo zK-twvNO=qv#x_lBTaU2es3yb$}`@;hg9%@j*n402M_Jh z(u)Il#6JOPe19m^y$nql)a*-hd%1!kl=&8;$i8X@+%h?Af2`QB$W0AQ!Gg)lEM z-DW2sS!BdR(Kdrr<;e(7^+bguFijophnF<>$~fN;CJj=QM!*Z1n?sFG?&DGNYpZe? z4Uh~sVj|V-Tdoj82@WtmUngBv1)2{a2J9q(3B2BPVA}l8;{63Jb=fPU?r-N&(D~7QPbaZ_Q{z+$WbB9RMek%wwF3QQZHIwp2eH4J9P0 zv70i}7WYPTqnu)nf_DCXCM+ zK)S)L)$+Co^z5S$)+e%PqB$`V_DY;Lms&7%m>6Q6Z1f%)ESU@kB6<5Xtd=cjl4!Cq|{*0h$V#T=Iyz-44Gzfyy3cIlm`8_QibEvu6G~RRW1G^A9(!e z>-pMp^2?SBS63!4%1kjpE@ox$isC_IC&r=49{l7i%g;06MEbld1VoXp)ltuy> z%lfQFYGIj+5B}0Zg)KTx0f`d(>z^e33=nxxw zqK6=s8l#lDZWEhcnB+S~e!WWRSgf{J;!XBoOH(*5;%4N6 zQ4hjU0E90R&zF)&yYbF~S(7Sd&Zc3;>-L`M7b1p~62LUi%|`hmJA~_OhKOwg!-RH) zVt*jhs#1tD+RG?&Y)2+W$vo34!BV$fLbI2`GWQN9Df9Qx$9MmD>Kw&HFW@%A?OzK@ zdqPX{?d<-!dHR+^DVVTWF9A7N1%eVH?R!f;sO$->IxgE;DYE(vpD%xDGc@}SJF&BYg5)^5az0*c9 z`t>O&uz-t+5jRnIQ08d2Ob$(ohl^C0s%orK3~FjV{6_!_H5k2%l~39oBPNv4W6CfB z*D8#XG+Pk#TptAM*pOKzHckkO%PIBD4+s{7Bp}By9#2J3%_a&wrol{Lh7Vva^;~}6 znq0r%Y&rEGh4IwC`>qr+u;ahtTXj>p`iRcgC7({>lzL3-Mr?39KHKTp*q@QnAU0*u zOh`JM9APSEm^EwRy{f@868!tS%vR7fQD~MWf#d+bYJ8p+K(6xAnA~%&8DQjSa4dpl8g<<_bLz1T9&e3ZKAntHk?wgJJ(xB@$I|AqOA&(O6){nj z03~7ewd?;*(*E>CMK8*uqE+*jXt7oMU~x>Xr}cq>rmdd8l)<_R`>1xpDZSS(VkmkR zJGd-T#K7w-%rgM&F@UJ%MzUMOI~W)`nwd}vt28E*v{`-@c@#t2^%ff^Hok|8FBE!} z0QflJ{D2s%5Lz>NrfRkMdp#r;n|7eAMLgoyYEz8>tKhqv}g3|O`MH$#SAy=s? zN)~TSeYefF#d=_F6}sF~jryF(Fp_I6Y*Agw04$cbS)4WvW#Io^NXp~|t(0883efvB zTaV=(@6+btdemx!$O*tK7o(;$I=c@OrzaxByeKg?L1Utp@E;yn)vl!@9Jn_t>FTt0 z1u%aoY9#Fm#-zQ)QqD7Nj0&pYeVLN;Z?u^1?Jz-RM%~lKEkg4~34g;hZ4b)2C(TsB zfTy@YC$-dKJvRA^wXDS`8NlVEtU`FSkV4}Q$>v@6PRm+i-wE;g`a|;TF6}oxU)RSq z-1t_>$2`d)j9rH<+E#4D$txL~<>|OxfEOF>TFltBOM|r;o2utxQqKBhtBT@)%nna{ zoH#HEV5+NCu8Z@z@E3c4m4&SwhSJaZXF8VGx5l8kPZ|d(2lk9MR^_7yB&S@#<>?zY*L*pL4im0OJ7oDwlRfJa0}+#|5z=KH!>4 z_KH!3Uj8fV&NfW(Ehyk&V5Mq%j2;tXpCv!%+&Bb%%}RduS89a=K3M}rY2Z3BBb$*? z$1hLfg8T>O-K(JV2A_SJ?S>sbL0MbVRYfrjD1-sYoG>3ALUcCa5GX2E?Mbcn&(tua z=9?Nbwt8W3W*o?Z>PR>nm-i^^B;Mpj2&B2ziB1MWrOwE;I^P~2| zePvk|gOLaeNeN&b!V))ZUu)#%-#5EjV(R)NQqd&D8KDzbk3KKdv#~Re=%Q#1-h>AXmQELHmG>+<@>KiD8VaoVE17vtP}9=xDo3>BR0; zF-GoZuV}vr?0cpO#nLj?R_P12GVn@`{pN$28JoBsr8^qVV+*+Xb6N3Cs$%MD;Tr$q z73th6A@-EQEJd|#yWR)QSdjmyNqKnGLmjd*Fyn=!P|%a<)ce7 zg&AMEta9`}pYF#f^ws;nZI2yv9hmXsl)4slZt4n)->4V(MR*DvxQj<&v#^B3qV)?f zQAUpbg)f&z*hk1UG5Hzu>|Ko1eQ%ES!6*71{2_Dp=<&V(l)9*97j}obx6b$&wk~We zc6S>LoU_LkhlOXiv5w6wvq7_}Sgi%DUrwjH2>g#W%wR%Pp>3^}s)}Tb$1Qe;-37f4 zcUW6x{s6t;=jrobKJ-RaslFTrCZN_YR~NR*_1HeW?UK$feOyL!+m2M2nJ&Z@s{Tyf zn9(08uafR=(toE9`6%pD!^RypU%&>mwk^7}4L-+c*V|{I@yB9_d&P{=mF3-EeG?-H zQAKiu@j7{8)uJGLK5%HS_)0>CWANajKQnwLU3;!2**EF^^kDR0#;I39Ax(n;x{In7 z^wHmge))0f)P1Y@(}&VeKSR=ask?<~tL2g2<*l{h8&~%F7%9_2Ta@ZzNlpS2U%$;( zjiU372>~c8KPG%-b@&4BF;OuHkuSK@d5I7vv65k|LThTjspx8erh`gA4z zo9-;~W5L>!@@BguHX*NuU zItD*EK0?ejQM6dR6XVT}yTxQg2lCGS{gS0TYtIIg2%)X%pnBd~1Ey%O%^Ko>hI*vs zWnZslN$sD7OJOZ_giAKz5WjIL8(!b^QNevJxwB*Nl(X@q$}~}9LO`|D3W-HRwBOBn z{MBhv`<52vGQKLRqk)?;QhxN5-u%W5=Of%^s3<~wIG{wlgDYk1Vz3ie9}3Y@Y3lOB z4A_Ndna;(=>7fJwnf{iqjVzao13dqPPaS{?^*?Xd448j1mljyE1rE_+?2u99%+GsZ z;kI^@A}!o6t928p`R@Ow?#|ojTv?c^*OzHiI_t}|wJO*x%}OAlH>1ucFiqbHji5Ai zi_oO?vq^xSzT)ofL6td|X?|Ylg1tqK`;|VRy8crq5a&gbg zas5xizNRd(Z4Itsz=hlqtPKC;ASPK1)^DerOewmjH-GZemZQSki$mvKkv%6yi>b(j z;@4774!za7#qWrQ;HBL*dBZ2Eb%**xUUv{a)q{B+ePUn+`!!Ja=YkiXe>|t!#2G(( zVLf17eK7X7;OU(V!jNWlmQjrk9rQ(Umg3o|!+@LY8N%XWaCJ?_@PfSEb zB300i3MhTfDpx);ZLoPx1|wzI(Jad1G+mMA9ww z6cspb-*nRQ17qv=6;JoQ$+ni_8=p}f(oDaJmt}0)9@q~jP8)|z8;|dS#V@;m=61B) z-*)Qdcg0L4?=MVhc(gwG#p`1qez*MvKB}|iyHNgl@xQB{*0b~2WBK?*F}YcSn_`$e z5nef+nCK7OS~Ojim4+|$pd~UWLH}8}tn2pI;L}k?&5YB6)CKQ_@3)8X6YViFJ)vHV z$<^;spE#QJ7+0ew#LQ#wwMuR^QPnN<_rm0~n)1I7;)BJehrf%bUYVMub)0j<zJ(RT&b7>=H3j&Y^2z9?~s^ns_qzy}yH?f{fC_Eq&s{X_Fzn9lO zVAq@dc>dq=k2|Ahu-}}BApipxxUM&xNJ`1DT_4nv5srx-^QyYn&QzRU^i-Q*X~lw^jC0h8lvJA4z8-q1cw=j?7*67k1hb&WcvsOEl~TqL2kA`s6xei zi9J9IN=Uqv$;3G=cFJ#lMJ; z)}b||3x9x92Zi#5b4{6zIqW76nf8`vOMo|@95haeTy%ssJ>ot@c^PGaxJ8$Hsx@hi z)L;Nr!Kv(IRJe`4FNjP&W7g(m$~gzGH1VW_!{*5`o~3)5G0s9svrBv_m5?MKrUZRAN0RE1-uQ^)2rLsiwqTE`fN;fZA?D2LiPC-tOON)2o0RIof5yf8w( z`b-7glR^l0%N<25@Y_4l^Oa7$?-|D%-&dYbzib#;emJM|XwIKkzRjKd^Xev+1frS- za}^%Tdn!xu*6+^^V(1PrVMfesl@{wI$l@C_h2lXnb*rkE%Gy~H+8r|RzYd~ryN!kt zGO(tUw1`@}a?E!i@$u!xT=~$T-Iwno($bZ+eDU{3TmF7l{QAd6hiCk{ z!xqKnD`R|jKF|%3!|bW&sQ47>CBFLC``!{eAW zZ^HH5f}43SfeY8W78=c;yVi*H^+`GIonQFs%t{MQ{edC#bL+0H>nZ*->%`$F8-Km@ zBWU36I*Tg}Dffs+UhLX*`p4I)gO6i#_d)tW+V;_2n0Vx=#*%#Gc-*kmu%WRuyCDplxHEon52R)GPt`W6y`}fjZQNeCJEuoY);byKSFj z=|J0*>$t!uDS4K4p!~LYQBbzIQDJfYPaj{c4Av8WcPV5heniH23kNAen%MS>YG2IF zs;M_@>%E14R*S0IZ01+K^nVYFVHQP;N!HWs495%ZFRnCFsz7@VbCbpY?57&Dd`%T% z_`o3@;mk;gok3GuQNgoaEkYyd6C9|Cab7ovwqY>wTRqn|WGTUg9|1Td`6&H#U+~!G z516B2p&4c;E z+f8X4-7=Asv<|ZE5yDE6IPmVxWq=XS_xB+!@+3mrXV>g2&{CW>DFZW)XXW_lQAAO~ z@_(l~e7DDRhFW%?UN#`dwqJ@i%2YuvlGEHF);OT&HfUF-tUO2XojN{pEJXEenfp+`-Fq#~fr}Z|gvlwtDTjQE?yub>a3 z7Q9r2U8q!zTh)uWs7jU*;$cE~6+G{L2}Q;j-!eCX4cAFlo@c-dI*mJox=<6u9^)fs zo;^8}m;24D;Y3vU_9W)ux_sb%iv<(EYP0^_F;*FRm%(@Yk?MoAv8T`fZS>!f7)vVV zmM!cTVve-U8P&f9tyJT1vQ|QhLjbq!n{kP}HKb&Dw^K~Zx<)O^SjDa0I?o8R4v$9J zsS%FFB-5=~gYj0R;ao@4t)`l8l)P1=#~EpGT6TnOWi){(6ngRXO&AWx&R$PVv;MZg zn3mM{lTnMH<;^f*uXvSRu~)jC>M-77ie_7X8-qf2rn7aWWX1dJk|6NT6~};o)!3zA*=UVp>xWFs^=Ie(FB7t0*EIYzqsJalmvQ{GVCvdc z+t<(Wy;6J8-2c8#C~JJ0Y%U$9sa5?R{aQ+)O198hGB5L@NKJy=WnvQ?@%fg)fCdBP zi2ID0|C~?q2$Pu)h%FTwuGw6gf+Mv5tzHp<`(mhaD**^=g_0Y%G!kL6>R8jXM3^ec zSiTue>C#DadmSrdGkI7yap*s6YDI7}KsW$|S7KaW`f@YyLB+ppOc!7RNukfq5K5iS zJ0h-037)^Blr8{dTyZNkw@FKy{iBpswA18>O6D1(lXCf?RG+9p(wIT91;{Yj5g@S+ znW$dRXGNx!xKjzsJ6#0R*w8n|_@V^Rak3q=+Iiu4f%o<1{8{tm!juIA45<&2U^;&j zPXg08dtYx~VGGsPOIIGJ65jcH9@=MBQwvi>q13DiZ9<_cO!#OcY}pW-?|A#``Lj#< z1GlvNv=MM+JGZn&mt~(QN?*^6(Z0gcqfhu9-$sAKeROcz(@ee%Ptb4|>|_*K{C{FG z&-k`_$RtGPj%-p>#+0Z}($NejQX9ny7hfHdfLlcAaARxk?jm*SG zTP+Sm$yv#i>#dh&ppbq7yoOt`b#tgmO_bEC2UWRFbI3sG&eW@&x8K1Sz>iR;vGzLMzG9ym4( zJ^KyeXyA^hEz@r>N+ysxKB#$B6!NW9ymuu!CmZ3r+ zH^F-6A!wD*C58*fs@A%Ri!;shPa4SMYO+=U4xfj-HSh}&#vQ=l=a9Sf@ZT@ds^79P zWqwPz=mzy(zAxdn1$-O8ayaC24vL{96;aS}9I`ClVw-@xNr>7E{5*dheiQGV*ju7K z579Jxuj-0z7{tR2^rqveT@;eqpP=P<9?F2$fu>Pn^nL>}mY|NPA^yA=m7^yu5rXFr zq8dfG-F=|79@QqmS*XMQP7D=kLEki&`4%YIVCSPYUCD*{@u3dMIc}N-r#&S>0?;DL zITwaD+yMI%-NNgVADRM-1#U+uxPCRJR|(s&BO;WL4S=s<;D7r{$m%tV8nHwmU}6Aa zVi#>Tv(ATP6sy{z`}7E0{7L~xsD~m%P;wR&_7Mq~GA+Bn#e(&L!l;Li;IJcRcTw?+ zhGOp-;w28oJse#ZxzpLxYn_U%6{3TL5ostCL!5ttl0`Xp!3-m|y_4tTJrHemuJ zC4(>jh8S<_d^w=wW5`VhuIhwb#AUcM1!pYwS(sY1C{TZ1MCTzuKryP}&7v5+XG1@< zlmd)5nqgi=K1BRayEv4unI%jLJj_)*Qerp8vz7~6Pz?0EdBqxr>M>xk0U(R?=tI-B zG7d3V5XYrdG8yP)=OBTIs1g$8`X;u4az~%g2=DOQNm|ZDHwsBC4M^ARqp2nZo&mH^YrrB@VjK$lMmx$2M;n>Xijd@qO z1P6eNq98Oql0->5MFH}KgbEIRxVF)Qi@&1*{m(kcOrS?1Y^as{Nj-rnK)(=S7iw^W z4BS2hZ768DDaLLX0yT$;5)S#W2DD-j&;Flgpz(Gt$%6+uYp}ygoJ5UZ$3PBb?B5iU z;VZa}f|qKD9%IqnJjjWHxu(YFX~+o3c-EBgQi;pfK;Zy%l8bQd0^Nj2Wyt;%)7&wK z(G~&5bW{T@#wr6ePi1(0q^soVr{V)wR4y1aU^Q#-OaF%rbK26NL!O-J+o$t$xh3*C z!ge9?Crz{ifG>Y5T%;lV_eA2Bbnp_;y2Q1wU|t6azjS5oKL3wYFmK`_e+Vt^HI3$) zo*DtM>0nPG6sxmXm6Q^zUd{J}b-7l40_R#W?UzAc0f4_k+2a9V>QsboU13-lv`vLy zVamTbgWfM9Rd;}4Vzokz=IL-ZF_2hD?4j%l7Q))};y{h#FG6CC0Ag!kw~xMqpyiGG zDch8+^KIy&EaL28&`Ag%M;M|?A&@DwV2?0TH>2ok%Rmhpr3zcVGBCys z9mGY)+^`4)j1WjU$E7YQ<1SU?t_k`*4QYIUH2NKNC@kpq5bNBm zOV@Nz*jq60V;t$rs+_UFfA4eC&#|tV1~#1xTB>ode0A^wm{%Tt=kDT7e~bqOe*-^$ z1+|IZVH$)gi2H8<2aqujLnE%4E}l-&<#Y#J>%+}Y;r21G6>Y0tO$Dre!adazAR<^Z zH?HcMSYGgm5eC}m7E6@g5{uZw>?ITRhwi;xv%!m5S_~OiKX~iW>@X*dQz6$K;uc>#09SUwer)LvDS)blXcbi_bhqbcza!Gtaa+1$IW~0?|=4KRqg+a zyY-O;Pddo5hCk?jd!F>{S#)TL_3>v<&X8s4OP-#0XSXe|?%nfr;79i4*(X;POkMi; zq}_dLgq(A3&(zow>x=G^TR*0D*@M&Ivj@@(qB)YO%!lF}tU3u<1h ze?GV8`Hs?OPpY54fA;*tAJ!-o!2Ab-2>=RkTZRIFcys_7z|8|7&L&FD&~8BOvPv1{ zwD8Kv_|U4T-q!2;sJofNlOp>Ya?_>Ayz@-^%>&LWyHjqSIezOPXW20dRS4fUMP;9w z+<7)D_Aq)I!7Oe2^%Y0Z`_K!Lzr3kvT~QIS-t(NxgOdrTA5|Up2JRdaUMc#KYv@|j zoqe}Ec6kFMt|h(HNJjk0_363dKi}QH_0#DWSH<%L3%Xy&^pL{THFX@3h&iCDDAaGX zPnxktPixQ6i(Z><9NWR~u;E75IE2?xroOMyXH9@>E{p_NZx`FB?0!1Gg>pk<7sb9+ z6WiSKO4_{U^7G)Jz|Yes?U!zixzbwu^5NOM7k92)9<>eFWj2rJ3}J~RRyM8H6S|Hi z(UPGkRyw%L#wTC#O&ofIY>R3#Xfbw3&DR*(D+=8itQNk&*1@7Mqu^OFXyo6oM-zO7 z*$~;|0VRy;qoaf=JZ1&Ml@51=;7)G}FRaRYETEJcVunav?9|Fq5*X!56h%wO%$Y?T8MogRf6m8<87l*dqq?iJx3xn&%y}CNJp#(9d zO@WIL(6L_Q?^{O*Nu$yj&!YzJu(5J(zBRmj^BoF6_QHJ}HcxbBg7uM!yl_)YE9Je~ zOQ&KP1x+eT8!&e?bA9*jXiBLYGwbjRoOKMC(b3l$W$eVTbzu-Fyp`&xreK5 za%;e>CX{yW0X5Q1q*8`e_%0oZ^bm5-;7yPIT%OqKBf1F6}7tosvQpOj|l-C^bvl{E~oe z)3u@~SF_VcT(^i2+~PXOqs(j<1eBZJ6o=vZIYz!D6h4@NV%FEnJb25zR$Ssyiv_S} zj~<^WkQjAyU=xuNyI3Qo3G}5_RaoxTk5!xf&bB%jkof4^gRA)(sp*#%Q@73*T#t^h zsD3obD;kZTXH4Kt0f}j)22WLr=w>!lDorHq!iBSae+Y31Sc)YOK!ddvzUxbxXg8up zy#Cef%8qHH|JF1T&efV6jzZDfx%h+uy#)e zdL+0Q1+WKtQPj8-;QxdG9HBdEO!tjp_W>17$oHaHH0JWw{N26(eootr z^kA_6QW=J6^BhH_b!IKr^*a-2je_Y(29VXPL6GW04C2mFdi}KV0ZN&DpBn8j4!~&{ zQqvv@Hnw}n$TJy*6m7ABJ=w(;_p~ILsBGaBqcIxif{~1!Ut5&NIA15B&H$CM#c3Fe zCky^;0;IH405(F%rtTD%vL^NL`To+p2c|7%jCe{xG2bb>wbbN?7@veY$`})$r2#7# zd<`#rdKuPsHak{K?h#^_PZm+Xs1>n2>8n4L0#oUxw*kmUNx?*N(@g5PFpIBqhh6N! zHby2PG>v4AYc)y}mpPfv*OAv{0K^ni)BsVVORMJ{MZS%1^u;?z>haXn`7Hzd$g%PeC$ zuCM(z=ouz8@1&Cak@|A*Q^2yh7rjJ>ChSm3%==o1x_hBeiF#x~5@W-X{u%VS>{6RP zF5)%_BgYA`wre?+8JW{qH|J9O;=JQ_JACmM-IsaJ5Zhqfw_A9(WcVvDkT~QIX-)jy0d%h(%FN*_+gt}jaF z;171x9vPT*o_D%9w&LoiI;`pyXVb;;l_8&-?th>2yZg^LJaeSX`M?9N@ulS{1{&)< z1E0Q@YSOMMWhJwP#7`C`O&rLs@8LLlTbjw&a>z3Kj#mul*@3+(*ba62n8_dlNM*>* zVGqPFW>{>JYoG<+HMm9Z-d)_MTDfv82ZvsF$*7%^Xdtu6+8_&1b3TL;n=UD)7$6m=J+ls3iP@QA=Ab=v~0ev#(on)u7RbZ+*| zrOpty&Vxsop=FyWr3cTx`4Jv{8`_~kv&R|fvv7zp;{Ij~+D6qyG$PY8Oy{uZCu`X~ z%GLPTq8$BB|96~LB*x$c!%2BvI|sTiGiu0nVy-iErn~P zV@%3=FZA{m-FacNzCW-(#+$$ra_PM>J zcPnU)#SyMv4gosmlHVM|7`*k96yNNUMdd|S&h~+v%K9j0BX3H$W}m!4UY$(Ip-~h1 z={>a)9dm)JkBwt!lG$0-bDaHH?_%@wi+@Ay%bwgGjtDW7ww(d{za&$<7(3V-kgS3iO1+tACk9xHV!VKYml(hj6<&45ZGD-d z*|WMnsXBJh>lM}dX*THTh-L{_M{3u&C7Rt#XZd;7x(G-%(86>Spc^hC<9 zEj4BGh2{4*`l+qnH|>vkTpzb)kI5O4?*lszE)I#u-hPY?ScrCG@aE#fT!qY}D03$< z+Hw%gN`pv)2i)|#F^=R(10e=EHUKc92)%9;bUu!Apa2n{vVw2=zrTQ9836_kqT|Dy zJvHEk2PIh;G-48B>Q_^WU5~s@d#1}n@B+JZ%*VbOHyn4*8yPahK-Ruu!uu+yDvz%sOB(O1<>m8ozHS%=UKp_i6NO z7wlyMzUeyV0l`0Wv2Vi&=vvH6Q!Ed3*5=7;% z?{gDWur~wVz#-SD;T7ha_V-%(a&SMZFuM$7IRl*(2*w(~`6%3D6^w`_)^OI|F@P;V zy1UTlL{S5eK|BgT7QYp~3B;^L-u!A9$*Oh;j;%NhUFusJLqQ|y)9uHF9=fCJG)*WD z?zc4^SwXp3rJx4|JD?<8u|UfN19`;c&e4k&_1UQBBDvx*B~l;-(PmE1(PwgB+C+vU|)`!z?xSIRPBfEz3~CL;$=k z!dj^bBOFu;lGCY|3HbQOYUrR0OQf7}zO{^~L?c?12ocEB5KqsG7qbCSr-tkR5sHi6 z%_TZ(KqMy>=!tSQ_ACGma0ymVN%q8FE!0>iYj{|UMZ8;gDAkt0IcpJG;)hQs5^D5e zse@RZ2;-o_4hu;4IYhz{QiXwtm|G626H2+HeDSg@0a?O8sPg1g)nQnMcA&%e#aOZu z{l4*R3LWiv9W$YZk~GAlv*^DM!!7p^t41GUgD7O6GlSIa>n?e`gzxhyvJ79_#@j*CUkdr3jwGvTiP5C z_?M7pAg!ffPXVWHivxcP?YphQEE98iLUOJeGpK9!Rbx_iG2&E4=L7`AXj7@l?yw#X z9az9->|Fu=paIoqk8gfpXI_Hw5|q1e@s}u9HN)sbzn4f;MzUYEJO~`V z7kpbzMgK4b?(+jan1Du8_z(^z132+l(B*?7)B`b&u7TfcE?;#;Gf!gf(j(hMXOaZH zOyK_xV*yfr(4$T=`kq?hDjA^Z5P0^wjWTWgkI1V622r8HUIL(q==d!ZAaXJBddZoV z61(5DJP!^$pH}DpeDai655(T7a{)Fdxieu*n0wU5fFVJFnS~;@6ba%EAes)G6E2t z5pV8N!48_qqNf;IChEMUsr3+BxFT`00RLG`9__$I?b&>nlig-Ts9C$n z1Aqqrqd_&tLvT?KkUWX-FS>1=^8!-20sZTe$DM7phaN90n49R&fDR8~pNI}S1MmeM z`JO1R>&T;Te|X*Xs(L>O&EGI_sGuJ3q^Q#<+!9w$A)2kJbL$Fpqkz7J_P*`5&;iId zv3cj5v)Q+1AHh#_?*9#&$Yv{@MCg@s)_T2S_H^=^0yAALKcL^YIPydG_*^uVo7e>Q zp;Jsi_VXkCp&5>M9HGXrEmqaG+^%hWu8$^d8my=4J6EDC(n|&3& zKHc>?R(>R&RdXS5iQyevM*k(Uaw5Fa$Om!^<#=<2iIAcyG}Wcm)}mm6?xzLd)tF_v zq#&{L83XC3Z&nbS5~wPXhOyXnufL_5JQJ(O3anGku}^H19g#pKo0Mao&|iHrwPl$v zCFX9yo2A*x5`W=URKUhJZWg=jz5nO1L^K=e>@G{#9dOUV)ZYGe4cqK~;HwL-WTCo; zmf$)LwqTy|+3Omdd~YMPzc8F(D_OY*muNeEB5>z9g|`q^0fg>+A#Ith#SAN@v&51$ zdoDHf+^NQYK7xUO?TQgAXuD_Hna?)%w(lf%kJ1Q0|o=hQfRfUZgM4;ex9NL9eSno8Q~}PwGE* zRDAdE4vvY?`i+qIbAciU9fb|{-nOdw=c>C#yVuJblhC{G26(T35NK5lu0`8+d^~LW z5)|&W_X-79*RTHRubqKXw#VRp95g#yo(#X8-%6W=Cu#2yVPqpy0G*uAQ)2np27YgyjA zbPpta9MLkrW6iCVAfCXzf4HkQez<%;5S}k;-Y2`UZ+&hY4YfJbgKQTLyd3qE;e^)% zvz4j|euRz|ehZ+%5TR=fDY zGU&HwwoiY-yq}PhHTx{>E4GzJy`2i*tNsH+U!-{RUT)?xk-6l#vsXIont1W$>5u4_ zHx*6i@AFi^E(Hp2pRUnf{v%}eX1P^KwgO|5TA4;UnJV*)u-eq#8)3cSeFt@apULL4 ztR&8Ksc8{o2J74rFOyjpL=EEm(uta3+Yf{-Fu7GcXJq2>FIVQg984Is2_YrOYzqY_ zW&YI(2fXQ|BCEn!ph^p}4WXEDZ252Q$thcsC1s2idI=O#*ejkdGjFENQAmu>RhW4)(|LSN;BUcK!X5u-WrRZ3ESoxV^=4+aJ zy7O{`XpttB(}Bk$^jLwR3JzZJ<^#rLL0JW;e?7Mw^XGGwtee)(4wu;yqXQw$t*C=rx$>0f?1(hhVA1y z>qWu)P?RlKAIr*ty`7mEkui*e-mFw5fW{?EPDdQvAP>wsw5g`|NL0{a?a+Dl`fCe?k|S)62#w-N)F zjNBW=EmrNvC$&&WQBFpUdu1~5kEH_uRpIqt=Md3y7bauhwR6hWD#5X?wi={z9!~Yw zMWtgb_I|S_+mhVC>_r}SrTe$q)D98pdq=mtwo*B_)nzm?SY?7{yhOSAOm>=CMwDv! zkfYR4)(C`pj>tGA7u(D9v7**Piv`M1tW7R$aW-4TeJZR;SEH-EqL(5y^e-L3nDKd4 zDb_0biN^)=t4$c{s~kMD@Ncq@7b;1URRnDO5Kob%#B8RNTE5gJ z*mQg(<`t&noN=XY-5>Ye>L*%VqsZw+deoY1DctrCfL)`l%I%cEr`KYIk(A_{0x zsIJ5KP=<}iRf65c>q%0vg9AUUEN*Pb7)g#7^|V;+R3d1WUT6u@@=VZ$`8Dc>A=JkI zN6~%9CAGMJ06&Mlmw<>1aIeIfnHAs&OASXw8(dkLnb*2nR)?YD49$wnx@cC`wXSXJ zR$o9fD=jKB+F0hbZQU}v4S)Rp_D{}1UeEJ+KJQg0CpoBK+enZuZKgfeBM+wWD_27z z_U`oxhDbN!!NoizSi>a@?bCD`Q+KgLr8b%VBO$hG}bcP$ zu(fW!m5mvd0AhvK1Y5;II|(F%7=j(iMIXZtr6>dZhmdzUS72gD4XB5hFY+I~3HgnPXvSSL{9 zA#TPJ3;?&9t0We##yUoTbay#^KK~vyz8Azco=4DaIJSz_!_g@;fuR|ceyJ+{?ifK3 zl|g(VHn~6_H5nc9Ju4(`P9@=%^_g6luY`(EpIh~%H}Ax_DjJ2MdJ)9UXgLez;{J#b z(5*O^P+H3NJ@F*t^A7w)2<4Opp#t>Kw#7TsP%Pteml7^p!isbGPZmdn^!6HxkwUYH z<+eMtU+<0u$eK%?_*|UlOAswOQ6aggv_&z1z;JF=qC{lxXPq;fbVubN(!=I@D>;>u z7cxDkKDajb{G!5*m`cD*Z!R`@e%-J!=eWT@7%fz>bBBtKL&n>m7ZK;vdAAn< z;NKzo3`DR6ez6G2dTfoM+6K-|F7ru(V|ZepL0FvB8Ft!GKC`C;?`MUFj*cB&sMllq zr>l00uT^JpJ~8~L?}J1gp~H!K#0!avaVQysBTR;rKEpuBlgr>Y|1iQf=a<=O)|V5a zl&nLYD$LdnNoAOs++!#!fWA71NnkC4L7oTD<+yCdJF|fV1vEBo4H(H8VTP2JPID zeqn1O;7qIY`8htzFhU%^5g`oGVW8xAB?AM)P+;_l^UXVq4y{IqX-5HzGTdwo7r8(I zvd9i)0URb2z`Y~df4nhGn$wT1UJ`o61k5Z7_ttaBW5~n_Fhquqoq!&5OUII_L#CYp z6K<<9Wo`dD_uf`_AA!>#glr6!P=Knic+9rIHaNnaAIF5rFnjK@ee~cXq3XdR7{|8K zkRmgrN~X0mjRjw!E2YR97GdBQp96jaO2AqcaY8xEth^GUw$sA)bd>^T<@y%a?-iFr zJ5aF`SN6R)k^V#F-fMJzYxH@o=8u-m?F1GTA$>6Lm^6;{l{&#)neJ4&us3E3B_dj; zUL=5F=AaTvOh4dd?(WJp1IEAhTn?3>V*$8bPI#y&LLZqEMT7FIOZ;?&? zfoS^XNju3&_CRmVu=o)FLZwUr$P_G%LIHz`i!RSAD*d0;#a7H3O96jOz;?GYpYWAV zKqaRQA)in$9joGWAXY`74mT@sgw`aBq9Pu(#&U?E)2)z{#zYeW$e|@=>nI0-HpHs2Yiuic=||c9KNW0=SM5ibXTBoT*KNzR`1CfU zqzxHS#8_1n|7A!uE4pko24X|%xqO9v4l*oXA%%y!_a0lqI+w(U-KbDZ)-45X-p#Ea z0Za(ikcpJ=Oa0&Ut%6X~`L=46#Mpf0Li4dGF+5S`lPN}J7NMBYZi}R4i$=k!E+$g| zIs=M1hO#U}S(;SImcj?B?Rn7QL#N=s-B8qOdR-+BZflgEs*JUvX86lq$Ljh4ex1{V zebg(OX+ldeK>yPz7z2Qv7GzRbYrg?@IVU*9%=!>8K?q)$*iFO$R5Q5V2$4CUJqEaL z0qi=GZ`grsGgvKYoLiinJ*1#$Gz^UE^?a7AjvS6x5T)ChD4GlsR{=vRq&2h{SC73PuY&C^HJaZA7AN0Np_r1a--Z8J-H)@Rm`C7 z-WvgK-jp0wp{SvxJ~r*H6`VS<=#B>i+&h{^@5Il2ceh$l;mB9Ii(5~leBJHmSys;?EZPP=BZR#`jhq8Qu_?3KJG2u_=P~OAUE{39OGEBzEBoy zS+FzFdF2cY4l6CYgx@iv5`SIVbjGqP09Vh!R(6uoJs!4X1!w%ERgU3aOYfEM+n#Z- z%Dtn;B_G^6-0f)@^uMlnJ&LKmqHqxtyIIOxlxiJoq0_`5m$i`LqjZ;6@76TVM^>Bo z>FMYv0>-0Imcyilg*?vv%y7gwRTiBE_p=^bV(%0}NnAb4DJ;EBGh53kKsaVpvWtzgJysMbUjE}f7ne1wQwTiMdCQJ#E z?l;U>VfDt11=P_N41EcB>>Tv$UFqUarOzA=4Y8R=9jn2HS3bL_7>>6Bv?%OiQv&yG z&;Ii4n;!JEbsfzqtDUy}$;r}XkcXc&UlM65V84dMvt2?wefmlZ^9IxlrHZ?CDo;LrsnwI3&lGr{W366r1Fu@9 z2^5>vfEgSb!?{H$A~?J3JCLVx2La1=2LQ$g)QM7M+pCNZ?=a^%!>pMj*?ID)>}*!t z@Tx;2t2g2@_BGoWDF zI@k7WDpyPs0a7|fWoOOmfVoAY_+ zkge}>&B$o&_-L&_>2MUl6e&RdA3OInvw4Jqq?)7|;HP8knbMV&1~O*?5sPtkrht2H zPIDD2G0agpNu4HzFZCX|VqQ$P8BD$E7(m^~dvrll!4vP;Q=3!ql$sTnU2}P~eCLyz z1w-wWXWKpBoIF0{nDACZ|1hKkCZJ3hMI8M` zq4Xkjj}^R$%6lG)q;Z&!R5gEEhC{?X-Y_CoW>x(fb`aN=UN+-OM*k$e5e&Z08h?F! z$~z%xO{L44Q`zqZJ(tCzlyC~{Z#J|x3BcI;0;F&JE>ul6AUQr}n0o{@kU>B*6cHBn zgBKu2@Un@u#4cYYwH{&!sfuNat2dQ|(cyWQ6=N2h_$`7c*zQ$O{W!vzwCHV;1+rKb z8O(Q|UcRpSm2r1t_WiRTzK2UPkY=2~fh$(*m$I=G!+DO}l@o6-NDFkvdg>J2L+YiH zy&I;NWv$_O&e`7h@2e#@QI|iiNwpxRdf)hx28uCd@3R%b(hPw%uYRx3v395b6_15$ ztEZCIZa1$!ap;57)U`iGKDz8S-tFh?JOT`PRF}Ou|6W^lBVfoy1{1Qo>ckG>CuaO$u5#7w_Vn#m(k*%KtzmU zUjOHypAc*GR>DUsuNPeT5jz<_Kk^&FNn=)ZL`9vrzvbSm#dpDjiqzCI_lJJ1UX_$B ze70T`SeTRaS?)FN2>Zl)@MKQ_F?gi<@H@<|aQXPL2le-eWJ9^IGfd*iR|;&5NfKV=tEBT5_)(&s(hM%LAZ#3XlqP>-U-ykS*?F2XfE}t>} zWxuR){lTi{t3^HcH1mni)WmCt=jDI6w|w6}-!I!o`ipUMK&N%{L4Fkx;!oAU0&$ge#3%4E}(*gO|2HAgY zIa?1&lCxV=?MH914=D&3D5D*7b9>#ND}H_a`u*s+x*188Aw>!Rn7L|H!_W`eQMT^> zf+_x}S*F2-U?Ayn%^xV6dXA>~=ZtYoYMgy=?&uh|TSN0oY0vq{>#1f>opaHsbc>5f zuBWy(!`2*%bNvr?;>E^^z#3Dt(*6DP&~J9CWy9hg+9{ zJZphFUFg$j_?;Ah$O-3LXoR^}>jTz|`#(Irnz6Wfqragw(d+)9({w|vA#e~j5MQ64 z0_2kCQA#}c3D9H;C|f(EP)-@{t@ldxd=nIa_g3I&6~YHsuL!}5x*xaAcMTqaG$e4c zt@)XgdalXIMo+zeeBt+hYZGAT?G*Tx@#Er*vKk(&)NKHgM+5Hgm7jCGO}z#NJCxvW z%ItapL{;txT=%PFo-L9!;;mE1eQ2g0#J9UxHwq_^M@O}vY6uZv|bS{eW$4OpRj?^G(yF)H7E=lsRRS<0wgG^=s(~EJD-pyAY%$Jaa z`N}ylzJvxGD~}oJb8u%$+)k3~rNP6(x?W>9#SJ$cODxFE_Bndw=tDaeYTxO4Etudv zxH+tSHs?1`@Xvu2fByHM?fT+K23;ifwzmr6470n*FR+;}giBD<1J3;Kx+Gdexx?{{ z3DqnP=p3q?ZYFwPE;es^arE!^r!7P|_wSF_rw3m8@^EwD8zlb3p;1{1YHHl>s4Fr_wKYMPnq05N@6V>NyVh| z-|c@a2dl3ScIEz4h$0|HZ(~SD)kulLYAeuAV?Y=i_7#*M+-kelUz(@lm=C z#I|W>gNgRyr8b%nHwuN3Vlyv>J{tfb&mL=PjaV>{MsQiRC+NQ z*KkTOmFy#sfaDkiXvFU$YsMa4vK#(;ZdhY&I57y|DiFK=EipDbCCQSCVc zG3-g`pIOxeKF_LRe&Z}q8;Q;6#Sg*nz7*AX02ll2yYSO;D2m%^MTM|%lUhUh@9%Z1>^0R4q}0LGnXLmywtQl&<$CQu?Z_Dc)EU+kJw16U8rD~Yg9A}jB;n8f=1vV z8Ns&WS^)wU)GWsMV{oT5+-EPfZc~4(xKU`~2i+E^DEcN!H4rg8Ux1!2GtpLSr!#+W z&|XzWiY?l8x3B^e^8J7-d|Jq?UwLKn_Fj9}JF!9G?K$EJ1%0qw{biJx6Fm0FZCeN2 zwhu?o;Ft&+EiCYXzTr^ROCMrzSB?7}?y<~PQ@;MpBx}@w>A~4the0_0oyK@{D74`l~wA%&P&F?Q@0;DZ`0HMTQ*$CK8|Ig}?W!D?v z0pnhw#;o_4zE=f<_EDEntIp6h0o0XqmheEVCVJ_t2gTHt|ILf;3vCTK6CVwv>?nJf znImE@qEsxlTUyx#ZW~#IaMHKgR3(@YXI#@2i0_gKU#Y+L=IXhg}bo|+cUF%=c_)h)}aE?)d;6<)g9bz~0* z@QQF~ilHbOV+}}GKA0IRIqlH5a8a~IxLs4O?zRIJe4(U4}BgRfb$HRXOzP%6?y_hhzUqTr{^s>HS`- z`2SwZp=oT}j5x!2;@w3*nL<~|ab)w2D1DWYJYmK%8|-rQp^o$!5f8A$wHUv<8Hav! zp0O*ui#COdHl#J$93k7~>jXec8Y@j|OF{>6K(|^hI-qYFvH{bh&(b1}t-X6awGGBR z#7T0%C~)(2ra3-|NZ$k_5~U2Zzcf|l9xbPx$?x7=Xf2yJkZ!ja1JKi&D;Kx%7>NR7 zeH6jt2^kbt}CTWMRwY^#=>nK$af>0 z?LQlo^m+>1k@Hv@+6fl#(^f|{K?g!30?oM{aQD!tY|Cwv;`_HVyw9nqU<^dZT#`Gr zzio}?6KUhJYK9;MxAsy*d-3{;k>DG+YkUOO(`QIWm80iLl$4`_QsAxij;PZ_PuG6- z2?go3Ly$BV? z!m0ImJLE9e3}8Qvt`PM_p<;Co>(LRI- zUS_OJr^Bhf)~?VC)C_ye9c1uSVIOoTrT#obxz&jbNvSKf?`?5>W{CmZN#)L`Wh~22 zQ)ovWA%;IB$bY7=F9OuFA-KaGei;@a^ypNDXsdBLFt8UME>Q6@fzRi=V0RSwqWal8 ziQTsa#3U1f9YDte(;9jW24EMV~NPD0a5R%AbhaJwB z@WZy2DujXDAYHg@F)&~tCCnCC(fEf?eIvS@)TW3Wg^SH8Xaej@qM2$%=xH`Pr-IrE zctmvJSVlqvk-RgtMk`=vMl(lehpVA~_JN&sCPWNqONwJ-z^P^vdQ?D*QG_{(P!eVE z7_`v{g;|ZFV>QoME*{lg4u~gYwQ`C?fDc`PQ!D*skV90LL#x4eR0KCebf|h9)L>f` z{%3(OR`kX_fTI)K#-x(`L2R{>OHgA^L;iFV8t9)}@=%e6A*U&58Y{!*SU4FOqXs(( zIK9?7M4U91e5BBHhK)9Z*m*g z*&GFwKeao7N58r&cxuJK zBRyyLbexginL&bNcI}>wA5cWg{AXD(e{UGBa2|C);M6MO-T_E@fm65AUb2GP2Dt;z z;=}q=sfv7*z%fE8@-)uXV6U`6an}`25zW}BCf(;Gvh|T)!mZRj!*dD3IY-^A40bl` z0oTci=@opbW{@FAo>YL*0GA&O%?giZjtQhP$VJfAROrg3^_TeY@S!}r+#6Fam^?)) zc8nr2R9PCSWcmx~6u67!CGN93xm6Ki^OOvN5Ekrd?kzf&7tjRI2w zOIM|UG|X<=QX^S!z}$goGO)NtkFTaLwlOgYBKHAsNa%t8lDPBVkMx0dP zYXOVC0eFqTdmrRDEMiWy)K^xlAu_S<|Ii|2UUVKwXV5=~il%_^ui4L=R&F|axcmn| zlFbDuV2P80g)-P71cc9(qNtvw1BR00HFTuF}w%H~)&wn4%BA;71JLM23; zL>V*&5ebP!;6Lx{Oq*XP0-dl$3*b(t4Gjfomb(JeAPBL7*iZ#ltq9}5uxb&%6T-B5 z*tI3x{#@(tFe%)3+eCTG{$IcHH%LKm65ygl)16fIHm#)^w9AiO>hgSj{yt2*@gD^g z$m$9&-5=r)KDDJla}F_kfKK_5lLJTh8r>L}`=n0yfn$b)KOu@tLE{T;z6u_y|I$!3 zGiB$CmjrT~z{%T(*lXCoNpVt>YWMU=;q5gJt+49HIRO)^Z3s%kd0_T`b}cR{rWEwz zn6S21)C46j^gd-wV0Rfd?t}N0iHdPzEY) zLAw6C%Zv;Gn9<0 zu?VA=Y&X@(9oKFQ@#fpU-dPqAkSm(v0AizHQzq`dM2UW%X3DI+8j!olW^^!qdjqM*@s{ni-uxrn|@X`U&sNpzONaR0^Tl50`#4T;4Cf+^R zdw&{maW=(%$7?4v3+^O3!@F_KKrxpGEPG6dn=N>m*BAaY{labZG5eCY0J*`=dr-Vb zxTkzZ@BKa*sTa8R?Y0|sw{YufN%K3xA6IQnsX4NS6~ojQ!-92KyMo-iQ>Yf$$Q8dk$!3Nk;8;ZW_~2`mJ^ZnMo`e3J(8evb!M4| z1;o>~#Zuy}JR|G0(9tQBO<7DDewbP?aLKpIWnY5Z)YGocJlbiH%?TB)6JG0q-ZcB( z-lNXjL;i{qyuS{_&p+kEusd+CXWDmzw&2Fx5+b#Ip%3G}G%R&;m@p)`?M&|fcAW0@ z>~xz`i?g$s;x~KUw>n}PdCnW??W?rA3CYvuvhWS3$gH_3djmFk{-#WOzs}}GC_A#yQGeAsxT(GIfHErA#V{#2GJ4cutEEunKB`#U=4e+rW|Jei4)55b?jN>=& z31B3~dk^gD^ICL|k}z;r$V&4od${PIKIn52uhz47N<;qcRKK&Kfa2}AMe}dV>q}dY z5>#QE^b4y)L&U0rui7-C9>T}i=Q3i51JD~Pef^TAhM=30E%#F8!PhJ=u(1ojG}QCb z(bxKRU=x^g$lXQ$jiKNBr+CaJkD1Tr#NU-N&mjt+E6^Ha%-4pR6^Zh~RST{xl5Uqt zp$Bz>wxF`%{+~$$x%PDXRd!MbwRBnv*?K|>u%~SW90Sr5A>Scs0Y}#!gn(q z@MDmoqF{!U_KMQv)8BT{#}~4&w$O8TG|Qn(ZOjS zsBU6;Uwh)yu;VF4=ND>X#x>yT4CSkz0syac9WWH~X89a{#W!_z~ zA6GyQrQq8kY*cS}80$(D*qUr4Jzi5kx3MT<8WSU2wr1bBc;Vz6SWs?Y9unsDS>#LD ze{WnF@Iy2uM}beXJk-C&szEPGv=`r)m^woN^s_Cd4fm30p_ZGJm;784jt-uASG~|J zq~lE-VGKCj4BTTGNf=?^tK>ke&`wIYJHz=-@gCB|mdGvyUN?d`X~jW~0a1TMS`~H) z(O!Vjm!)zKpX_oL7@hK`n20>uMfP(&#d7H7AFAl#?88Lk=v0pBMi3J++!vt-l5TIUeOi5*W8r*5dj= z!9d+7%x-%|O5*_Vx$0}w{=)yLMF@3nF&QIDQS@m4h%Q%;s*C!TkxK631ZlMp!vj(_0PN%~h_`7ON==0TY zi+9C#q3My?T25;&vd%rK(%s=?vAEtYu#6jAm!5WJ$>{Py>5I7!&n3k#h}q-$mKhY| z>w?rW1&Or|v8yS;*|2L`9<@$y`S;!ZP#MbS_F|Zu1CQqZ9CJf-V0PuGQ|647;2spQ zLg*XxM|hOxV3wt}_(Zev*2%1UqhlD(+{Gso!E9}_n^U#68AIRCdV}$A?3EkcGg&PG zT#ey|$W1FSVes5wUb(Y`@3xbXWBGq&MZ>$y%9B0kO;7iJKE<_AYOGmyadN^)Sh~P4 zglfn)gQc@0S3O7bVtc{By@iG;3|*mBu4yc};d9jQL|@8{fb(zf%nfh^^Gki(Bd4J0 zwK^D<+s{)XgV*E>%X|lqa#6wYIctv5{wx@ZxL7F#aVz%kQSV-P+U&O1BW>dO-Vhk8 zOqcRYmR{yA(Rb^(Ifi%?yNuIAt<7(^9* zTAc#J9j#V$krF!$Flu=B8&qvkK9{s~mrjUwu9txIN$H$)4E3?*N)>C`OQVL@ROq(T z@f5!W<=#iIW(l0Y%pHt+%V

    s`UlKE;sUh^In+w)s184-#>iwm+^8iZGWD$*_WBw zC)aqj=@nSSVY9sa=xV;G+^o||_GQbA7&lE@5yoA^QKG$zgb1V?gej#jt^1koESH{-b&gC?+w#F1Wna^5 zukPQdxWe1j(e4pb%gPD9*h7n7$tJx~RBDGE>JSg&#JFsva}_AZh%-g#5tSmoli+_l z3u{lmC)l1-FHlyns^1-C$v;_z<+o-9rjM};BnKB+> zYYAx2%_+r;ndND+O1Y2iI(osF?Y^}}5T=O+dL-px!@R9=6UMJP+3BQeE`V=tBBh(eW6U1JO5J*U>`4xX&@LBU=t@Gj#jSB?f3W(FDE1|@eCN{a6=?rXG8 z)nN1THhfEsDX`sD_pXM!vP?MAj#9FdCpJ#1MDY!%_5KP>6TXL8E>pX78%iU`6!<$G zZLS2N?R;l47SjR{BYJzN1=?t5t(KSmcnBeSuG%Q(>-=rh_O)Ks!F(V_6Y*z>Q%Cne z%K=5kgCT^sxGQ9r?XtGWi}g;a!pB7*9Di`I?w06pDI6zS+H((wqCZd;ZH;>eq@6BR z(639dwzRi^8ZTXV^dww@1@U4IhoP0h9Y%dn#Ea(TzsAsEy_`&@NwFirHVJ9tP>#r8 zGhA6^DQ!atZWV~n<+L_tf$-_+Fk&Ttr^{OoP-2b+I`383HK`l9H$ZG|jv7D&Rd|HG ziciL!J@GEHVotu0yous*_NNT}PYjIQCS$np6-h6P?HI5Qy=O0kR)-uYoh;~3ht+Mat8&0=*~1{_ zr0xn1l9YRPA95%XfV7w~zeHP>v`4DIG)_g(DH@FTA`cvfx;?5y$gboYJ9Jvq#{5r+ zJlz_Yg0hdGe$HByFCs1&{ZAFHA3|gax^R6G;{OIi z(jsM#NLoK`@W(>jp+{g(gM^DaX@$E+7<(c=!)Man=PNK+N~?jNcPXc)Oudq4R6=6jm88DJ5=UL8$zQ~=OYD|-WMimS(E!rN`ZW%K5Z7nKJpm2mi zL}`%`k%XziM8>KBI*9fbny?dw%Jj@yv^Qi5)C^(e7Or~sot_|_7RFn}!JL%Dkee>3 zoHE5oNPr5;6;`p#=>H$EF*O1upAL7r)dt62=2z#XMUx`6$uWg8c)^9z1RHO`FtosV z`JK4DW)qKlz4_MU+IErOtI~j6ZZ)uU`2MAi2UtjpjU0F<3&&l1E$PLkN3^8RLaCuW zS~bu)#5~g$O$djn=M^du8D~s?scKNp7;z?UUTCo)$yngpGfm-)KwlW4I zAcwzD?TGP~M~wYJSSo?@`eb<-F&~Y?o-q5zP=D+wNG{o+>>uNF@MItfCcD!0Ue?~s zR@TGTj;4Q;pND?b zwT5LA_K|G*Kfg`YK4{z)s?wo=!dZZdIe6KD-)F4r1ZBCs!yn$K^dT#(r71puk{<%|0R}&y zS-Gv7^r>49U?yg_#(DB&f8j5U;rFH=+-O2;*R&@+M?GIThmG;7lx3Ab#sPoNhwV{) zU6?YGcs1Wc#y^uUOQVgTHjcPErT1?XwZ^S(&6TMK2*Yoc$g<;6gSmywo9O3B6MfqS z1&~{{n>_PSZH^$j?Ffc$MxHfH`p1(#^`u`vAX0Xq;j4xsvxc<5jaB{?6@FkphX;grZChR7xv^|)H1KVVb#&87wA6~o*GGKPj`<_3 z5w}rAGVP|5KKt?rv**Z1%h8$E)ZF99{>5+3f=MZ#4|HE&YwIW1r!q7j2{`lM^Q> zM;}u9MjsS(e(?N!ye;WCF61`%)`_U$OgSZAK4}O>s?1&`t(bv4dH6@K(<82o--4bb z64pWaz1^NAFXTDF=$YkcmxM<;J*HOX*T`w!_}9+@%wW4RI$imaa01){U|aQJVclVH zeb^pkpg5R1-5tBynzhuB_plGWJZEJkfZb~MGy6`og)sau7qv8)U##2~jKJ0#kgcBD znO8@~XMbe&S*IJemt>t)^)rOs$=XbC-Oj!P{Rc3!}wM{w21-wU}=AiS*%QEdyvt~!* zlA}-GBJD-te&e7Ua~)5=u)|Bfcb>pZ(iB1S3uCFd6^8_^7fi_gfA(JXLO(~mE7PMc z)G&^1vZg}k@&q?Q1 zHg9gpfG5Z{7*Y{O=c2Y6qGiV~NM!we^vs-sC^1xY^nJA;Nt+;p$5{8P-4Nlj6Re(j ziI6tO`Z2+PNb`I@(}36|n>Up=Z=S#p4xx|Y`*Q${jsG#o?dv({nFg$0jupu^qze%3 z0%Ba{i~5_RZ)-6`bz1H;N#PE)%NV^N`xAiFK(@u$U8`RCT*mI;_HI0xa;5+-N))4%9Tt-?6)&3Dsm3C>T?TxpJ@bWf;SfzgHh|TwF1mw0_JTZ zwh%z`-a_|Fp7c5^STcFCN%!G&_tF9V*Q zgld;jh7I^MCdL2|GZzq(+zB-9EHN3o$$)JiTC&4BMR2olEAZ#9bw~_1ds2pn=HW&- z)Ph~e92sFeaOFzq+lYa>X`}rg8*{#t+x|yV5a5n70QcH}SIQiha^cq@vj4lubX)(M z4Zj(HPy=TPzX0NO0o9g^lgJ1tZr&nb<_!U*ClJ*tBjllQr?Uvp^^W1f{j~(dA9s-> zdXfzfw}8}{5GBV5F^4nSMygc0h8ND~$I z4;73Q#jbWe%_@)3aTZ1#v%f5)uI3P1hwOj2nLiuYxkh#<7olg7lQ@k_p+{zU%4^QH zFkrjC6`l=@=&##P5lVaHG$$jzNR}5U#LcNVTW_SaTJiPc#s3O$eYVp;XpirKHb@`7 zshMHrAYnpgZ!6f4yEfyaTiJXtF6JKG5PGCZYJi~Wbm%7&usNUIau4$E1ipP{Opk1Y#(Vv2CpL9 zbhMa2Xha(}ei z9cRYMWYA$&?jasH?XK-KJNn~8+h6qe0c<7e*d@L0Gl%uqSMGhH|KXP{I>V84 z146SB`!L#$Z$;X8og%KwTLXO45=1A!zGxum?Q5;&BDvE{2TIY<^^>yErGnH2 z(AXwx@g?hTnH;RBikSqVFLNBFeU$(7c9&%?nj!llg)@QMx&~Nv3pnOnPHa&ibsWrO znSvDTjvSFuQF2?O$(m${tQQg+U!yBI2#y0)DYLyN#CDDY-H7esk{=qdHe6;<&o)CO z$|k(GoM~Q6oPe0Y5V>B+4j*bRvr2#Mk}C}jcMO~6bY6P36WwBPs{GCz5mHM$PCmHU zzXc}SY~4Nmfa9%KrAwi;*L@G`_9VT1zpg=m)XAzdIT_Qs-JFo*PylfVBuD+&HcRHc zW;#1>v&W;izgcsdZop5rMxPe~=g(R1)(MVe8Y9)i#kT-BDh@?k6uJsc(%Ftz;%IZ1!@5>aH`n8RQ zf3W}Uen1Rd&H3SPygLCoN0vBdi%DkL?HGvCbN<7`yWf~`=z+cT<1O)_R}eBzXfQ-o zg2Wyx`LrP|3yGA$Hxw!YtGU=;NHb=W=kF%eomjOfj7V=XtHImN~Q+G=Oe6WlR4go3p6(Ya%ZR7_0Z(+AX^?U=KALL8Un{T07o zPVfh*;{yAwdKx7Ev~qz$1rjJA)MV9`Nz-PvS zwB|dly%er(+<89uU{9UTjG`#)qyy*b4Q^~6rub8`rivF;o3@7sFQ+=qEMa{V!jan9 zeVS>DVOMCU^YUf4aw%6@>+>HFbgzUz_pmFcukD@{QS8z{&XLg4Q13D zH*C4Z{qrl!x=R^L5}kuUSp4EMiSgNH2^eozwVSTrietR3S->`g-o&W14Qa3+D&MG$#gv4Mjr? zN|V@4hYyk_Uz@tOXlN2ffqt0gxF34_5$672nh8z}X``TnO=bm*C}@A)hf8OC>|)<_ zI#8BUFFw_$@{@Pqrpo=_SAQX_JKMGMDc*@(Wh*I#u$>HOlHD)R9;b`Sb7Lfj;Gszo`Tg@ zfBf{`2geBE2-%clp$N%`_HC8!ekiX2P8;@)a(eXtcD6t<V3F(>wH z7z}ei)Ei5Dvzp0N1BDS(=lPL?n6;CbqYed*|T++gIew&O0KTI*g`k1 z+xXvJ{H)m*!j2tTrNkL=?18b<9`0Wm{H5<;K>>DB%j?oA^%qoZMiiia~g{607@4r9#r)~+=>^kH*!;t{4*ElK# zp~Z1d!<@?G%v4T=@~S_Bi^`Z#FL{HNinY4^>jXWyd(QA6=7P zVI=Q*;OU!<^EWju-UZvBdd$#b;w5adMli$l%@aLCZzSsUH|;bsq#s2{V1~d?AU>5~ zzAbs!Dv3?2dAaC=AM8RBhuMS4nk=0Aw>#ypvc!h*I<&4nZB)lsO&%%aMo^x2C$(L5 z5dYQej~NaxmNel=T=Y?#fs!Y?#L&s4d(xFDm&(K2n;>M7dzKG8zT1It9pTDapg()q zw7%eAV&(9`MYk#kPe*p|wlzYh&v+grnr@<6(A~_8JZ=j6)u&U7423|aR8M}4VQ{c3(d;P zigsHE(8|mT%Ni@EADWd-HA9ol*i4Q0`QJ~uxOl+D;hgVhdA3OzeBV+K=|HNSe) z{&oFnTgqGRE}5R*UXF2RCT#!MrC@O4D1VbPDBCTl4QU2~S)E2}`U+0Gx8VMMVYseX zcw*;!UBr{Z1Yfa6wVh^iptE4|$H?<;DeqTIRXI~;^WZ@f*xu6z=ap(eQTu4d$CvyL ztwqU{oyv?6le@CYm(SVsA>nZZADGVVWNHlLN4zyaeKRTU8jJEoR52B-kwU@L*JK9O zXd8QbS`95?>3;!fY15wu(X0TfNR7o@d!a~kWzYZZ6Ik!d2=(3h5V1b7u0eqQyaQ&< zj;ol+o;r+IFH)36qK&Gn6n<97<$q!!kYg<`LZD!^x^cI@^@V%8^z8j{)#K^Or#kNi zV6t^myA(q}%>WDQuUUAd&u7Wbd7rQf@wuO;C`i$0^)6GK#desxD`}9wI9hgqy@u1r z;-C=7LZ{t?Y@(C%=w%)KgmkJpX=nvDM$LD!TeBM3D5vT~=+dR)>KLhEhfoi(E_zmr z%$_*?Ue&|-a(7~HB;`mO$8yfCY=2;&fU<9W`@E`y^ncVt-#}89bSX)?5tBo$cs9kFc``B2ZZ&5u zi#LFe?9pw?MFvlKt#}riZU0oQ^12~@H7|ut%TmK#IM4MqQ^3atG1@jqT#>jD#i-Gt zj8&OoEIDjz?lsvK^9U;oS->+x95w-o64K|ou0$Hug}Lyo0xwdC7VFRD;a8&N&(#KC zg;#!glH5f5(OAa$h}2GdS-|?J80S(wijnctzoOoEuiXZ|xoe{=6K8+^@kqX4m6M@r!ZbOR)v zm3SqMVB!+a>98pXLuVxha#7n>U=S|xkr|KhY`F&VB?F;HhGXlo{bJ%3#4@A;d&Csb zKpI5~AaW4@1$1se2Z#v>YWcHri^)p3CnI=juwSTzJyHr13$aW?){6;$T8K_O!bd%! znMK|zhl<1%=c(kSaumWTt@HI82039-2n+)hz$ISef%E?+I*F?j ziwG?mn*U;k%!=vd?R}8DO;iN&9dTc^Q)SPo&*#I;hkvb3eh>|6&n!i;uC(vqxeZenrHQivxe^qO7o zv6zu8RFQZ)>pkh9fpm~cY@wo`=<)ZcgxflNnue^DQeZiGE5agj2~YLd*A~p-bL1)@ zdkagerh-n?>ETH5k(3NwfI!`L3=?4L%Cs{>?{3A@Er((jXuh2|{NJ5Li>$b*Z@3Ne zt#TyF!aPNJD1}liVGhsZPWt=X-kueshXy*Zfw~m~c-$=B{tCU$&x|e{fz}vEzskr< z&CnGYVVRgxXvHH@O8!)0lN=o|GhwpNB8FM{1%%JSm|_gukFuEEoqLY0+<CDcJ>fcg%7)qWW?jYX+4 zU_Ob-3qDhdHPAX1BKYZ2^e6<=tdh>1BgXFAFca|#YZovUYf#fzQ}yXo^x|#Jh#iwE z%^%R>vMuNX*RW4@*la^hS}Oq&EjJl(7d7BI3+Y!4F~%@^jvm*?3;S?_^u(81EFuMS zqk=5xVZ)Jboy{+o55FlsvocZ!8gN6%?M427P-2;tyi^AbR6^)+#AyU?86m!&QYr_- zWT;;jq{MoztI*Zo+T2_r1&_ZS#b86H< ztq*T$LlMYjQMSr!WIA>_FW{MUkNO^pb$|?<+R<#LJh7a}NJcRY7z9xD(LtxUBsy=u znngWh1r!Hxd@8Wt3JjNGQ{|L$R@rle@MZ1K(U472yn2KY;pEMfA7V%op>ybInyXeP z3MC$$BE{U3;rzs?{y`M9^-TBN8)Oxwj!Q*SbMK$Rl-@^pRon(W@yfro`vCGzU7e2| z(ZIsRJF4exa7Xfo3}$R2)po13<`EaystMvyanGm#k~1`h!Pj!}2<5uNkG!6X8wMy# zH7H>ciNl>j2THL$X2KfXhCtTYzg!4S$poVq+bXtgx^|=g;Pl_KDZ6;MuzRGlvY%V1 zP>Gei(f~H<$j%z<1H-!Cbo)M!<0}jC2>fcc;`WM7!E)%gbA(OYs1N?sjruvg7W{Gp z>7xuANWfV;$S&Ny2f4VT$J-5J+&Zr9MQd9lk_=^*Z2f@WB;VRLiE9N8PTP9Zth&n-hjlMLM6?JS$WPm$(| zJDzj#w>!@K`vH4P*RqI8*a_h8v(EkJL>x6Fcv6i!qsdKH@S&EdFypgzP&I3c{P{Xz zS;mbEDfee7DfEbpkwNcOxx@x4p^24W)k{EZW*OV*y3|SToy21i^vEqR$g!SBKFgZj zW88dM>SDK^1eyucrKKGJQ9&i#{1>%Oicha^&y|vTG{n$)Xy$X0(ARN~8Tm|LWh*Ky zA@n=j^R}6ABoEVUB@M5HaxI(JSY-hg>`j1pg-0^u$ZPPS@j8eOk^al|#buJu>YPp9 z)N2Nmp9OmqAR$3io28fVM7SrxL zKJ*jjCu9H5V$%Gyhc{jEEoRR+F?NllZs~v&h3U9ym?Ea0Lksm-lxP0yXCws-g|j?A z_oI_osJSEdDf*4;%tY^bZqrx~Osw6J7VKpmu~Ysa(1QJihQFD;q1jA2%R1-JCFlkS zNxX%Z`iE*xd%gcBb4NJxOP>2D8{)`NOh?p1L70^tyx?g-=XvpB)6Rf~9WFq_Ut_2l zbl{Kk!Bx)}hH+6II<2obaE2~$QQnp+Cn#8k`s0`ultT&Uw*RV-w11hoy>wMP5b*o? zX&$WPe@v)7R{@rV6#o4vl;)d|3vr!Ln2e}EpkcG%%+pqwWzpw zI#iZl=qaCF_61qF0m2OQ6!{Ae4Jxk=)v6F#9>4godZl|R#9TVuayfWs8*1)eW*`+} zm|x1+zWYW!f4m*y2anm%2=9yI92!xp>~@r0h{;?Kb)6oGN!(GR$7j64E98qy7Vzi4 z%2tjJ*rQ^N7ou#wA-O)$wfxZBhUv#P%qsbUG96ve@g-)P5PdRVG!!1y)36jXfl4qs zh8jxlODSF=s8L5c?KOLNVa&TP5_=4ztTpb75Hkg?9gug3PSQbUS zMN2pwo|o!XVwhk)D#woAMIlIe^q>nA`u1CDsC{|Tbn!g-=x1#Nb)r5tM)>EsjHrwS z)06Gzu2jzZ!{NHBM^w9M-d0X>2|I2>_>5AtX!V;fX&Go+FTX#2#MQn@swoh)bEs_v zzn3*q6IAv>p6k;!Q(rSfsJ#boh~6X>{az3lXa9-vzrG#Ivbk?VWsn~WGtVGi*Dz)p zjM$tXo13;E@X2pd|y{>M$E*x=i7K}mwXI7X6qU`fW z==FtmX>Xsdnf_9rx}n;Kge7lxXg`aO|< zEaT08;jw4`{dY%RWUJuhp0CD`vAfw3_37xyZuW9ZvM(=_XI@*ZL2Zkq{3ge>UJ#7V zCGqyhh*3_b>8KDZvUUPR8`$PcQEd^_D19ynU^ZB~t%vTew_w6`C_g<0X#h{5e7D=D zO$VqkjZ?0)bgx}|06}BKI#^j*=R?Y;dfK6Ib*}MY|5%1-I2*61LbLTVD#eAHR7I^z zPq1-z_mf|&3qMYA=0vN}mYGTfLCuE>uhw}b0_+6HqKDb>2com`RLyl8$EtO!FLOid z8{cK>b8pvr2VQ>t{Cv^VGs|B-`;^_a?#;ua*}we04a}3cJ0_G_&Aj}g5nJYT)uEAYbcKhgkhQoD9ta|`lO4Y`6^H=Q zi?>G4Ftn(npucu&Zf-o|e34Nb^rI?YRPUSFk&%|ixmy>w@QmLHqgS*;kRWGLe{#y} z9@%yL>G75GkKknlF>3B2N23l5dc90fUaKk*v)*e>TaAN(tT(T>}Vl0h?k87Pqi zU|HX#@q06F@c6hxLN+w}+xo?diX(q1NS^cs8SCO1*&9E{GxJp+JiV$X`IQb`Oxzx_ zAasS&uW4qt!lPQs#xk3XN~~9DDZerOqn2OE^6~ek@xp|jKuy!0J> zbzl>9WS75yy$8!iCS@Z$s{BT=>2tsOS9r9`y!Lr-qarFgw+-u> z9Q6OC)^2F_(gVGfCn4S_dPeO%HcG@*cZDwOKy2A>k0{HkX)rGM7P#C+QZRtV_)Tix+R+LD z6J_bI^Ds&D5#WjWbz;I_A*`TaV^%op6PLKo^a<8-G&-UuN;Lxpzx z*qb22M|L_yYFGQ&;nEI{o3%EA_ku1#h8}LWA9=`ol|1mR&>F~ z*{OIh$F1E%@p1SDHmI3r;Ca<%F4DCIJV>Yl%cr8!b4?f4lV*IE_0ThO?)(gC*tJC! zxe3mBgF`57;-RFt=Ag;(qfBACR$1#HrEZO@6tPqcdx@Iu!U_r%?#bN81rb@5HiGjJ zb+pqdsUq06NPD1J8@ppYlm~dI^fSSqkq&G>8#lZg7U2<UCJd3b(REweNWIL zxliDCes$g;71?sDjb-vN`^@on>3ZDC4!Pq634{;$Or*0w&v->I~k0LF(3G+ zVxQ_mPykom!v|8NSVU=b^cD9d25m*T_DU(|q^4gamcv4;oDe;3%dtPF;Cvhl3|+jC zv6))Fgp(_djpCEnYe3#cQw{8r21w)zJaX>)amx5aQkqiWv*5t}g1MZWUb;V$DfC!- zC*mZGb87)njd(0s1FP|}Ru_E~%2vUp#7Zq_1Z%+kMMcUOmR;EzH;4T?kUBhSW6w2F zVyCE8sbVR{zqBXfTqtGifnolGUK8%s*Xot06$~d9nj2w;mKElSV?Tq(SFlvR5qykq zhtVeBl0xJF#>|m{4|iB1e8^zKEN&k`NR_+F#_A70H#nxZ!rqfQK@}dx=joJmNvnfQ zjdYstHE=Af6DBbV`&hpFjg?2tw(@NxT+>Q^8{Ma4fYDx0bC)8C6=pfI)YNe0mV=>PcgXRovjAmdcp_txjAq+TNs(CFDngltD_|j=jGWQ#CR$Vt9CExG;L^|w=6~QgsP+B zC1w!Gm|p}qd*Z%5W6A5Sc7$P|N+im&+gJ#@wsUcjym*XUE9CIb5vHN#0@$yd{nsKi z2hAd6T%YgX`B9Cz<7+1a8c2OCLXhngF}|i5=5fnUa0YotJ%0sh$EIUK{b2koZWbBa zpmMMNhW+P>KdqkE8qX0>Yj|-;30KYQ`Gpi)5k|TuQ2oLPAOwjQdi}=j@~}^&oxI1S zV(ajcY0#pgYrpFy0`DeFVGpWbDhdj?%)C)@32}jD0_$&%Nvak%r_*wGe zNwDMehYo~W52I!s%HrcA^qzlfS%4?kh?B@srV;?L!~pMu&soZ7xmbHEi+wo=!n5q{FiKV?eB}uU2=3V6FOe3gIp}9 zW`xR&Jt#5LV_5fk%E47|ex`utJPe?KDS)`m3fmU4&>lRhtxyix9epQ{W_B0;26Jr{$Cf4 z%v;@c*Dc|vqGtO%?$2(G#o5W8Ie+V_&_rz)4e%^Ub z$oxMYfk&)X5y!J&(P7^NbN3Cub5zX6YA2IWf^n$K@*i+J^<%dqh)fLb~IaG&< zQ+1~BpA-7vr+5O{)t=3RpcJ|QBt-g~K6KCWqB;oUuB?v%>v<%P@k@XR{cm>M^ozTh zU*;T=;0NPood@PPJO^+Yo`mNe@iDv4Xh80eV(DC?jVI}d1QFQ`38Oq=KRiFb9+*NP z$RRm}6&L*-m}`Pvba1Fx+0RvIufor@P5b`E*HU@2N7b`CXS;L39}D6W^1rPn8ba#U=wjYS&ue$?hTY;PoeltGub?t|PaGYu+9PT(eQ*EWJ``EK!hgeJDYz4?T1iHm^19h&*b*V zo9@GlntK2lyr-zY%@pg72URXz-iEm5JeVa%FVd8+=t4RAv16XgPiSt_HT=cHR|jNs zPSZihE)ZzCeRJ`hyrwH2csa=&LSn%<8llb%Uww~R#H`3iy6i0UX20?uh)c>vt>R&d zwB;NzIJ@Ivks0mY0Vj4mT+UPdH`Spk1~Buu5nk%90WHYEgG^>+kl5F4a^}m7{cJtp zE3f!x=%9(5a~sY_1Mv*VUZuhy9}w z=5}EUsCw^7aJCw~u*>Wz17B0IQ89L*xfNtj$PSM}4AmSfa%n?36Xm<=(Mz?Jc|({O zJm5PyEj|jI#+41w@qR#m_KH~PFwizmpgz24A7>89sxap z{YH{9Uts%X6lQ4k)2XUxJSbq|;w{P*+AEP}eLsw{k(8HARs|J;OYs$963oM^PZ0t5 z69Hf{E9Nnkb2=WM59JnG6_N8$%Wf0g)xBxl3R}E9WU_)cR54Gija*+5TKG8J;3oA$ zE#+27{O8ezl!Y>Q+N7dDrkZYsRD(Avhe3O84OdhVQ}}SRw1PCvZIxKXX9f%LPBWRR z5UNwK96OVWcKfWTzgNLw!85NuD``PZ1BN0xhNfE~I~_W|!)x)liay1IL!^Gr<7bn{ zgJzdvBk^)Da^aDh>oZ~x`bNz>*8^^tU@V)&vVRa|qE@kSj#p{>+DkLMcyQyn#p)!` zpQmWKiDEG^Svt922R2F#t%_1o&B_uf6wbs&7Ahi3UpiV5eGn>lRXFkBrwWv#2%^gr z#l4EGVmmu2I*a!>Bns=NX_=+P1dd~ch!rZXj2(I&J_H0yJN*2xv6H}bHP*f3NN$&s z3Oq>GBT07^MZM+WBG{qp=?zb4zn@Y}tqkY3@Wnw(yU@OcSbiaP2K4~YQNb^*h}6G~ zLP`I%>G`V&UvTE=E zau+EJS&9g404%Hg!i@bC&VO-_FRIrBUM=~#nlVI=Pp7&x+6Yfi=i=$Eq7$sBHFw5ZpT6to+mp zy30`iH9|gWXyeo*hFXDSV45de#)|Uch2A`XLvrtc4vCN2fOoHvfz*AZO;M;o3xUYm z{c`fs(uO$>_Y?<9aij7{mIe;~ z*B}Wn$W+)5!GvC5mjFcmgg!j|*>)ZDt=iWM56@axj_1O^92kE79_@z*VhaJ12xJrv z@s95IV^#y8m@+~*WFrq$$8BgldNiKcN7{>CXute~KM_All?GEi(GWXmyUEW1`R zn_WtS4(of*_OfsAu!u6dEExtwDXvn5a!{CFcevXR``$ZX&5P5yT`DpnW@}Z+TI7+1 zo+*31PLA4>Q;}{hzlu>Lc3`u+%3rjamkybC41f+gRccp^@cP0$d3naAX=|93={jWy z73VkE`BM%w8!t!R?D7M?^Hv2fQP^8l#TsS?(T45lrB5`-yivZCK!l`{oTv-GT4m@35y{Pp0ij$ z_u$!6of8pFl0RuzS`Zppps;I29WS}*+$G8$-6iea?H*S}$IJ7&lyn3BNMPO5z+b`& zRdb?(13P+;7b@o49hvSoq#jhb$?pO(;tUyjwi-*JwZu;cYtu4~lG z#k%&T1RY<7HYo38okU*ZDUWOx5v1gKGoBB(3#Ha7JKehzrMP;@%2HTJHP=?Mq801^O=)?zvG{gR* z+8(+_<6^j$T(#9&pQfoJ?YK?qmN?O$^RQ7?)}LVzqwx5IpCTzJpswtC#{6wP zTjL1!@k`d0X8#ZFK2_(#*sByO+{TGTclX)!6_y8}>hC(Y}a?ohxtL-Y&ZH@>P_% zVhtV}B0E_(2u7SM!*7g^^GYpCI{JS5?DWxHM`V31a)GsI)BR<0Ot~*kiYdtU$>u-0 zo_0~(d*P1vHO;(#UAD^lH#D&eZ*3Us<&>SgIsex4z#Gb*6MME6|0(YWhTvZkgEpB} z{^yP^Jt2Tx2pYBE=pX;}OuZ)^b0nv}uX1M9o#@$5XHw=jfZ4-W-*Ky6{0+KTuRqY2 z5)RxX<~d)uy2*JWM&1i6u{A(MHH%-5#?`Tfd1VG!UIocHPE9tBcma27!Kw*Mp&+4- z?N-AaIp^6^1`$E#aAQMSQlQS1IUWc9iFLV_K0zqhH`kM39J=oXXHxNEEs_qS8T z3hU4~YPpR&Z>)3||I0c%4=Lg8#88F4!PaSM6Q=n z#N|`5VYY1F97mq_$1zwy_Iu7%+Qt>eqwP}42CCgQdbXnI5fc;2Wl7{?o`PnqMd5IG zunkX)_>Od}UN^SkNrct6Gk|bihIvW$G-G_Y%zV3UOK6Gl?(`EuX&RewRs|BfSCVrXPj9`Zz^37kV2P9?&34#5 zC1E}M_|mUNqVqjj^vKT7)1Z-14y^d&iroNegfrZy!mM&_D6fu{7;wQ)eQ1D}DQFbG zHy6L5LKr)ouSaLwDJP^Yy!z5aFz+qNqn$ZQIHHw|S*LUG|irEth*c z0rb7DZfu^$sbT=YEYkD@+^H+Sd)4S%XNjLc9vat{Oj#Wki;ZX4o;9glPt4wq3PR*L zG*vdr+&vjb-o``s{=`GqjTm!+>XF@f+tsmMB%65aeowpxBhU6vX7EiXyD`%jU-9oj|QYk)GG> z+=Rq#y4O`Di}D%buJY+`;p&{y+?@v5ez#JVQM@s(4iOan&cUP*4a??}O1Kgx$Qu9icOgALGc?NMn$ds(5_d6lqeZUh*FS1UvcI#%f5xncN){6KhCb& z@LJ!U)xg5cE{G#$NliWHTQRc+Bk%`WVD~m0n%@E9Tg@0-jYYM>Pe3F*ht^(^HaN7m zIxn`s%*ar}Osjy-*H(D>j8x?MnF!A`%9_)4m65!Bn>tB%)C~=kto9;BPJ;BQjh%Ss zMk6WQ4BO*d$&MU8TGdg>xTRS_lOe4sZhEfLhz@VxhhDxU{NT%vD_#iOTwE8c>_^4q zJo_WeOTFEMb}@3w6*&2d1jD~^Rb%2{r@fD1ieHA(O%Gsa+ZY{@&~_%8W$S}C%&?jj z%zRx%kj?GTF+Iko;DWtgC}7#IgB&*2?r^unb6<$Di_zVv7elJk$3u5Jz4JupAn{iP z+11O2pJ#G9RG}vwUabrQF&;~xrbm{n`~sI+Us!P8Tr)f5@qB=15T2Ggl$N=y_d3fXY}$(LN1;#L9Mp@ ze*O9En>{!@t$LR{@or0D9P@Ik+JQ6rVEy5kUt5`k+R2%AHHE5IkHpD&6DCJRs_E)a z@v3_mPbXR7-;FEvjc%R1yT#1k&qGp5EWXcqOVpO7bq1&x#kYH0SmD{ZL){hGX4f9Y zCvtW`K4`gPuRcDcq!k|u-E!(c8JCdEmf@h6j&~r6xRK-(epu!esXU+ca zz7+GxEe#$19SR*bMRY*~*TqYUZd1DCrST10t4-cI054LqWni=(viw@_AQ40kDMG4U zZ4E%^5Z{JlEPwCzd6OMw(9k~s;CmXe{Y^gd!=A_ja0-eY1x`m!a}$T0%ZyRYFgDi1 zUeCZ)n|yeJYl}hOjEtkQ+wM%%gHE7p8vo5jhPRAq*KgRq8ujTb6x3mC9{iPApX>CD zFkQFM3xHj|D;$4UOfh0j;VA%ystE7o*;T*vmH>nfY|5L#c^cbq$d((xPf6ne)hKtl ze0s0FV>QZE#`BAc!2;loVwCiJS51t01IAQIu=YpF zQ)NhO;S(iJSP2*s6c-{<25Mf<_^ya>RTh==!&u!BH%wDDgS=b4&~!A)uE#*=e>-Db zU>9YahDQbTDx$~W^A_;GnMwj03<&BDqjq~29perQ%60*r{>_VfZU>fc{C0Q+pA*_()AY+CI)#1vvcm)LYG? zW|+7ik2^QZU0B^ew1oI=K(`<5|8gvZDgQ%6npRtwV6?nK>iN& zUQHpR0oxt}br?;d<^UzeN4gVJC(b1=LCak)!pJr*b7DWEQPud2?-BtrUGI@gU`8(w z&;g{$#V!aA+F=lU{e{6Y*27@i8vedRw@ahuAsTG+8lz2VQ8O`s0vL}ylq&}0yLGTb zlm0RrsxADYE|cNyc56U^)FQQRUdmFwlr^5CD_BZL3K?+8=}roK5QV2-PKMSD8f`S z3$`EcR3w2kd=(yTAaF2?5OiB#{u%>t0|pp2wkIcfnoiy-Ze>%C+*WqyD)t^B$f^Cn z1Efv4syC>(2c0HSpH3A4WdI4yvm=WZrPMy|=dGGBG#0}y5h(WpfMHj=ii|uU)f(!h zHhP}T-b$YC)9)Okv8`q#=-rmiN4y^1zhk)NeyIt&iiX1o662%y_|8#kY6E%~o}09l zJpb4lAsKz|{%CxTRc^)adBFf}=c%%^w(lOF`Q9wQ(2RY-gtzlj2jALG{gzPsV!F== znm~$p`=O_kBolsk_-N^;HG_83?xnB&dfDmI$&y!v82+SCAxz+NgoC|ujl(i8j^f#g z+wz?I3BsD~%;b4PyzgNt->WJX>3ZgqllQG5p59h@I&bc|lC#IF@pjcBFi}l& zZV~5Pmh-uS3-GGJG$ae$u@=L-Pa&!5t`nYf|H9*o_ zfhhrqV?aU~`qRE*N*9pn{PEAHJc>pBx*s6;U7X5`5GF|{roCQ2=?rF%%kkqj6^#_E z+OYU74{3^FOa46F@rAr0`9S}`e=8+fQ?var|rpCSF#+f zXyo?lLZOp= zZLv^HKgA7I@1q0kN`$H&xeX_bbP@0y0*SFg;>E1usG27-^|C3GOFdwRz_-m`k63u* zVWvl`+{NQOxkqk?Y)PbmbbOBu!lI{u-_XFyeAq7Pkmt$?s{YT^One$Sfp%kq565(3 zi033%_+3nK{Yl}gRrs|l7}DEQ?x#BMLW003lU-CTf0Ae0aRI#*3K{}QOpxCANX^Ai zg#w?A_19mmt*pjXqW{{W+)}#x@6v|9w=9U{hJYwa-9Ejbo28S`^I)_{MJwoADpbdJQC4u{B?Va9(tU{2eVIjUOR=G%1>XH} zN6GsmOCVN8x10R=jPFLT43z7T!zTtzMznIoip&5Vm>=mmFjYFey{C(s1KSM)66@_P zX9FcYcdnfbx8=bso*d@Q|G(&61N5YZJBdn8)?H)=-R@} z;%(i3w|YgdDY?X;)_zcIOgv=7F~{r-ywF%XWJAh^^UAH+FxJV4v1i$iOQf$%Q4?u9 zcB0s^<($)~s32u9kTxcKi2R${cFNn|@W~p$OW1AK>v1_vaN*M<<0Tw><$K%aJ2Zr| zA1bAH8E84M&G_V|SkQrcdka-~`E}Jsx{6yG)}{Zju! z@O`Q$y#KIcG;ZhLd-iWB%`R)({{8Ou9%eu6+HdUjg58C2uISFF!|`puvU|g zNWeCvU+TB2F1~!7vE7DueR<%&Hh#v!`SAJuRabSLv<{mc6Tyj5HCauMoO?`m8-r|+ z(1DwZqUYO~1(0iLCFJ2u?BoaZBbPcqs1#hDh;67d3{Jsb)_+xT*mKRNX!hT~s@4@* zFx%&TeTUn&P`M-g$lrI4+)CLP+k0WhB4u~kS(r;$5ZJ*lr2mGiSwO5ctB3_wawrdsTtepod%kiPjCO>zyf~+@?Ye`45)|ffm+L4oaU3xiT9O7 zAQ3M(V))g4%x}gqp?1+039GdgG9UAfuAX51sl?X9@FZ`S+@R?Q>Y2 zb!pY}%bWgXtjW2$;r+8q+a1@wy80_SeiMqw?Z{X<5u2@m=UwF9oU+O_m=E+eI=A9P zXnlJjaqh*`@yU8h-!$R2rKj=IqgpmCVY95GeJ;A*V<#$65vQzdSi5z-MpsahgcbCK zS(}c+aUF|2swY`(UWRIRaBWV}Xr5XV7*mWlo{zidz=^Dt8aum31{`vu_NH^X@pVZ2 zPw)P7D>4~gqGwl5b|dy?DxOWhSI9MC-Gyq;%IeKCQOc0@pG_F&MNzGIju;qopolE5 z_fiXoa?2emw0qPMJO1$myv{@SPqMdZ>+U$OzCpX|x@w}Y!u=-|O~m}_T;I#CiM6}O z*_#nozs7l2Ky^BFaI88+&+kDkD=gygOAXR1TynIQDFi8{BDFEMMJ$+>#ie>yt-OrC zt(mc6gs)`mxZ15?*Na9XDXH3d$%gcSJS zo|PU|%u#&6jwo2o+}x2zbUdVMyB^S}h8J?mxOv!bE28?)lnAQP-)Tc{F5Y9K+K3MJ z6Ts@QthCokW}Y8}nUR-kI_4_Tx6wjs%LRMqhRNIMt{Zu+ZmZz#_;#DISO<5PQ!brIsI#pcNoW~tF2xd4 zsn7H2(*h2>ZCR^MQ&u_*TQLV0LlPsJCY-)bz!Sr$*t$A zO2sC>HtdnjUC{1;lar~HUf=Ju5wNFDDTvt{to%-ehG$YM1MlRHFcsXR+7%^fLd@Kz zwA=e~AT@|zA1@*h9B&oAt)&MMk1(>a7j~g%o&Vh1##`gLg6^}!!oP4>BQjOZukugO zM(5Z{ES{TtM;3Us9X|B=ZFQIXzaP)89f<#QbL!RhlNYabCDuG}TsAiGblKq_f9)*&dLHBuvao)}J$x7n)-QT`0j|ErVfH7gP2q?ami5q*?GGx~UM zMf?Y6hz4=lYo}FXGgPA#rmvnoY{BmM4YY-#yxfC=2(u&-y?cUams?ogI0^VxBAcCf z&9=U-ag6i4vgYC#5RkabhKObxn0j7Tn7oRz#+sDY$HE3r7R322>SIrcvJRug^dk9` z!a)*>+p-Z)Ih5yYuhZiWZ{!E>4nsTjBAcbeszih>jC>}=p4dpEkXI<%`hf$HEP+jl zIfXqWT^ccI96e^zt7esBVx{25i?>nk7ij^pT7KE=+g&cMZ~UV1KBOi|gJ+LLWe$Hs z9v@e7dZd|gEI->kgPGZW+mC+Vm{P(+$Br7X;jF&#Y6Z$!a}L}8@~LP~y1hqlN1pTR zE{5Q zK8qqGK*gnmEa#C!Gei)rn0mF!O^tWz1IHSxlqwrzPUL`5SfoAmZ3F1h1utJQu3WyI@SV2^L(3H8b+dPhf##}xu|!Ug z%4+Q^4;_B&{;7ETWZ$RSt;6}=UmK@A@=rJ5aov`sPtcxJ_`@12*fHj~IMv306UZUw zpy15zu+>kI0p%z^Xt&O;mlx~puqWX1?8MuBZXsxgZ{!}lpLxkN3y*$WdkH_Yi@c&X zPu29jc1MsXE7aA9x^QSCK09vjJmjEOuu*~YRWGtzB)cZfg6U5?P_|7~?rmeAv3H4m z3)XC!e{l`7n*M%jaFe~!QoXS@$HMgO4uWVD6#T2x~>>*)+U*mtZ<;i3y# z?u!Qqop;%Do*wrRjf2~d3oMyyrI=6yY}6-9k;;B++!X#L89kD};jqiE>$le573W|& zr0K`PW)Yd5;NDcNfp|kx5usmK9ja0kJl0~(8&@wH-{kOYQTevfr@DpK=jYmV8~Cb)1s9*Ev~MjS=q`{rD~Ok>mfP z=wAF<`u{k9pPilEFKz3#YSq?tU9GDj*}ADzR+1t)B^1dbB)79mwUVraD6Aw=m5pwx{zbm)+^8HS3@y)m2`TYmm9y{AP@6Y@7e5svH-LIb~zYF<9^;e3W4n2U_ zIxWuW%Mr$?MDfoCL+aaCc_-6yZ(5<}11X02Z~TRr|2hyo=I1m;f{^^xr^DV3N?*WN z#r+_+K@6&+3Gh`$X(sNo9wNx#f*e{>XA#;ELJZOY_VRT3o3Vw2#X3vxE}XTBB_GK{ zJ-rFBX`)83-#}>9Sw_}(mK%QgHiwfNI)ARhzd!pk86YNgu{B(?I$3>x^M3`R@7P;t0!VBk{4D(EOh$s^V8?zAto47u0Dw14< z5R$Uw#mzJNVhE{RMqoPCE}dflaK=>>U;cEJn&1-dYa#pkKtkKl67~4wa>S$Yl$;m| z(^@em0`B!NF0~j#cL1=#x?Lf#NnJWA1IZizP&7`wX>s2?OoSuWTj!40=F3Ryb>yV< zwKeh&Nh53&;PaM24`AzW6?Bby&KItAV_f02cS&cclMnvM4OwosOh#G_5GN4h5Ep$j}oUNhjej<(yg+1Sa-2?g_tbyfkqL_7Z`W5E~p#$yDXja z!2lt!*^zoyRlRAI$Yfi+O{>i2y1~W>V>@Ba5Ets4g4wG_ESugiD|nPJ-KGH(RtL}S zDin?3G-!`BWxVIEAZcL6 ze=w;*XDR0~tn2A)A`UenYv6QYR$e!GS29A;@F;5C^fsRR=@CX-uer5h@&k<3AlBve zm#Yw*#|o1+9?5%j@@L#jvr}`=oFJqP;y@Lvt_w;-5`q!hWg}K6q9nl7{V)dY1-lC4 zBe`tZsHny;=`SwYGzDP4!4@Gfj_qwO6f-4xq__=cbl&1b*bIfq2M}9^7)pT6)jokc zG_?H)X29V45M>)-0xWtRVxU|Qn+9_62?pQ*fK&NVlr;SQbwr^~$mbH9>rImkg)4J# zP7>cUC8R_RYe(*p7#($!%iA<$V;n53$aNJX=!FjzXSo~4@B?jvdoVr;#tISBux`?2 zo;gcqG9+7|dLXvX-)?xz|9wwglLKCYxE;v*Keg99VwE#uF|*z=M&xl&ll(I~aVQsE z_qT}TZsdzCV+=Ey82kkc+gHqbEH-8BwR8#%Md7+OgxH|5x@s`nQ}0&yvUb~4qmx`` zIgYq6###GySWjLU2s`hD3GeYlmwGezdb<=ZHqdWfxsH9biz3mbW=br}P2Ka;X$TM4 z5l27}RBps=(o9=~R%T$P-;Otpgj*y4(FtP_k}j+tp}K^=4u(C~g%ZpJ?EPFbpP~av zZ>i-v+A;nNB+MnT}GRfm7)WYw=Q-2lL|%b9edS8w@sA z5u99PA===w64~bY-aMcTyG?A`>~EHj!4kXJ5#CE_(=1pr%E^^6iga9Aw;$!gieh;z z--lEcY8fQ5$Q^l`rNKpvu&QGLCeNqj|3oNf8U|NpLeAt_LL*FXQ@i^>+_0GTW^i^k z61#&QT3_$5e)*3bFj4Q!e8UZ!1CZ1=Hs-EySbM=QLlfgIhVl(b!w+X~)Uo$q7;QXC zb1o?X$>{R?Elx)m^oqLEWS6jH~h3GX`8|#3Grp{W^_bA+zmlnhah@17{$ZV z_mV>LJg%JD#_9eI(WS>DBoJW^?{}K9V*NW2?wN*^k2T>Vv{4K_Lj+9#u}^o+Mgh_M zyUEcOk4`>A3Y=9DD(A4j>)+K7X#vEE4`$eE@s_qj{{TRbtG=1gH~XUo{ej z0zNH9Ec5GEBual|Av-%n&;x_xLbq)H^jGEZ5`Ga>V{lSnHs&}04@47X4PP?FbMICQ zKWkdiN{{hElV~Cy*JHUjMe=Px4N&+ zcub#WzF!2st+%-_CG(_#<}<#hUR=3xh&!}@H^cB17ZwT?ZZg|5l9|Q@7(8rn^WrAi z=OGx^*=U;N7<}f|+0?M&RG79SB4>%n{KAM02rNn9(wi`x7q3^;bS*e4rb$J5_j+5@ zP~|M2G5Wr6_*GmnFnePA$h!OyJp)#bEwro&O+GK<^zp1;9k3q4 z*j%nh&n?IiGL9z2a+`tB=4&?&97;e;boFetSh?{bl;>dfig)N1FN>INSA*dk;knjM z@l2AqL=?eHHWY8HIr{Gm57r{DisQTGeO}`+Gyib&dJ&6nZD^DrDcAar&Fnwc(6g&J z>TF!UVG|Pj;M2LRhTKgzQdejH#Xi9+75;W}O%n23p+@%h z)?qvHXrrPdl6b4pt5k}JtKc0;28wFrcnOp6;v}AmKO}*PG0*hWQ~1keZE6GLi8%bD zS&({yxKiizScOm36?sM<_i!Q|x#dE1$5*V_C}qsAgE_+s39aP%W)dma01eSwK>p!` z6(7~5iaNJr|M8s*bl^9D-T9z%wT6%Yn!3X&}}hPwl-)Z9KNzU0brg>^N`z4MKv5 ze(E1R|Lrn-#$P$l-EW?#RNL%oMd+!k@*6d@Gd5SSx@AGm2QpMHD&$I`VJcIpJk)dc zjpHa7aYTdAbL3amv+nW-P+0j865ad79VL%h)*}`PvNI;He&1o}C&paCit6#BT9-n+ za6R!RotRm%B!tJFY;9cKz)Ns&_|;g+pMUb&&wf4mX5E@2+7cqVCiCLc^0&`*I}uhj z4^ktq^O1_l-uaD+_6@g})wP`5-|y6reKg#r@2ELP?{JHpO4u}|Yi*EsDOcyMKS?AG zls3q9-DPKwfX%+E*=|i4xmz2rIm{G2OO68y9em+J;M#@M&MpVR-bnYD!ZlmXsc%G# zHz?=44P|?i%l|nNd7BVaRPo?t%iYzA{ii%OXb8pOi-T4q{@pjjse*fx>TxReqejHa zsn34Ud*5zep=NFq`BdJ>yk5=dReZ({{%LCPh-7BZf|^@A_v$8H_hF6B)L(ogbsj#I zOEnY!>Loll*^NKKIo;?8SM}Xeycn)MPxFd7DInc+h`T@8sQDS>kd0JJHSnuY=B13< z{qAcnmNvi5K3RtQe3|2ktZpm@o6)|R@v^*TxAU1f+{aTvx4KOo;tgxAMXVU2Gwa{t zS7tn)Ohx22yP#iJ$xFjYl))pMXOR4U?UG)loD>LP1%`8+j6Xk@pI3&RZ|ttvb{7=r zGJf@+Eyfi_{9ZZw(ei)}4AvZs?0DuUSkBrRcMo;+5so_0K-&IDJ2&qW@g%(2ZGr|Rb{A$tRnvB|tBXH-g7q{oS-QC{!ZJUC6 z`1je-FILUFX>prS=kUJA10PMQ*N2{bv#R09``iiJeT^#?@lEt|q8BG~8;)E(s1KbP z?e^YkdoBCFBUc@Yv$A$%F4x^@aDR~2yVBz&q5JHPPfjbR;F`v_?RFvCeDQxATzV4J zb!GB-xr>Z(lktqGf?^pRvHS}(yk?(VVkb> z+%`@0qk5aFRUBTr)wPF?s}Yk94CfT)E8WbdX~g{0y1)VqN5lIyvu+@xXkC-;ScZXg z#z1b;v}}TZofVNb6&WwS(1jj#mo5)XthX8ixT(EJ)oqJ&agm9=yr%b$#TJ+>L+2p2 zwA>6Se3a19jUJ|PcQYz6ubJl(SFeA?bvV~o?l9*CyV3MmB;7u2{eUt3<;^&Ik%Ih{ zIsQ_AECkENoicm3+W`X(WL@q!_2}62ZDu^{#O%jY>XeoQ++ye!gEK8JE5O$=V(6mu zW&h!M7tj2DrQq}X-|t*J`{#88OR)=DbZb}k;lx(ol{b?12e*gR!RK%TWRGi+dF%iR z@#wmO2V-EyNqvc_+sy)>`njnVt{;pdEA#Rw^7MQ}S?2QfU6Qr0lFv+AK`wP%bclGV zq4B1v=S=lgO{!tDPpf|9x3K{FMOQBIJFR3 z;zJA>F6B2hkCu5}7#l5{(-?o(%0cQwXRC93OQ#%?CP!|NB%MCD{m*3Tp0c>*A@j`6 zd-|4IZx}k)LrN!xlnPe~D`V_j!amVBu48DV_1IW<57pP~oH;#$8vl@b!%KX_%%AA9 zinfrSu4LS(gu{~7+!H}8<+th8hh`g5`j+q1AHw8+5#J&C>qRR(qb5bYRR0%JEX`fi zKw^nh?((p(K|$zN6+1oLYjrOYIxk4oizV8eW~9f>`ub%-i4O1aL2I)^m6WpP{EE?C z1A%{iXxB%yWFYr5eR?b(8<c2%=r*Wr|Auc*?FQkDbH>f~kK^ z9wqQlzSVP*pm{mL#J^E;+b6A0&@(k}^_yN7=7ZCc7p9E)U7>j!f_;i85vQYi7&ci* z7pd5;Ka65H2(VZ|$@OGg{+KkB+#nC?VR%1;A;wXmL#gAQ{Ppg1k3mCs%Z3hLg6k%Y z0Ch}<(fnChd25+%DEE#>(REhK*T<=wvvL;SzU=&QIP<{TZ%_G6>WIJ;v~h3rqtDtVad+VK`BEqx32VSaHt9ojJ&F4Av>+8D!ZS@+=|vGFhZ1NmH9m9>A6gh@ z63*qt)9wU(Qc!M?2765tg{{5P8;9K-;(aG2Q9ietF-IkV!#d&Zjh>%Efgq@|)X`OQ z155q+8o`d4`uvTVDp+9{E+rklH@S>Kzfj+1%T~PVFqvc2cMpYTu2MeyEou1czs6fT zn^SI;MUJ**y*)ei-{jnX6;^kJSW>5vHccd>Cq>@iaPvsaUWDMJQTmpLQD_~aDEF)$ zi^p2hzmvob`$Cnkj9QGh7E7Nc60-xlAgcm;zPq?6b@%10IDyGrl(}Ud? zxfs98Q#HGNRx=bPVLVH?K?BRgukZ}-lriNC>TJ=uZ@3V&sMZX;<1ZlgSBIb{e9ehZ|KAy}`@6!I z@A0CW$zOBdrBRD>Gl+I?8t$SYP4c-{GjLI`%x06Uc+2`Y!rKK9xk{t}v%3z@;)44& z)#KHJhRW*_rP&3CD$>Vu9y`mM!_JNeWSX~y?HXu~m|k`vGXEHJU7na-P`^9x73$WD zzzB6^nNzFG>R~dTvcRayO?I@{OkBXkcN4St@}>vsh=4JvRT{cUTiXXtk<|uyK(7Pk z6zCFHpc!ya#84L0i1SbBIMyEkLVs_FDVpE6Q#&sVH4<5h5T%nwN4qX4@)9h>rwoOd zUlJ7IDcVvY`Fxo5uL^_d?_=@G=Rs4b%b{>yBIZ( zv1nxlA^sAXww?i?4Nuo*z%tT@UCV4mVTYH*KO`kh8GP;anrq)q(@j7|lO5*^WY56- zlIl`Ded!J^f-bTOR_=@81Ai;#WxuR7JFc4Ouyx1_|M+D8lgkq~1b^(B`?6b6Kwo!l zrZBl=qZ)GL@<;{HX}Vg2wQamlD19bl=A$ZtnLEKBzHL&jUiy}XAw>|8#oK^-2kMA! z@ng*PEjlHAtCQQ>jcN2k<}5vM463@5xaCg5 z5X*vcvXH;zjqj>DW{xy|$y@+tjJgR!T{OO$A{rIDwHvj|H`|Pj2 zy8Fesd*;z9+oQw1y{mmfSQh?&)S2)=7xORMMxLkB9aUGN`Y;dOzs`W(A$NAz zeQ!9PVL8{)!+l2I`u%UmXT+V1dfZkl>7Bho(QE+R@I@#Gf%kHuE z)LA|f9^FN|R)@7qT%5m>bBUGyU)4o*-xJB6%Mq(M=3Wru92yB0?)ah@?~`XGZJ**z!&bWwWAnHCh(^H7EE*>yfpOW{*K4vh8YV);3t(v>6XdNdi*x( zpIoW3B~UhbbR~8Muye(9v#D?Yx1wV8SU)x7CyK*JuuPwzB_jSDQCtE5k@}#S4BwKH z9f}N_{Th<15gSsE9!9Kx7Px*YuimBLZO|NJ%2V;Ov5W9{3B+*`7$jb=O@WID{jLS} z`1h24S82r)Yz~7Oacj9ywYtL0GVr^9f}kjh>tS*$D_FC3+;!diTUoXiP#Zw+(xP}B z?N1HSTfaU+2NuFqPxT7X2(zHN2qWQ(c_krv+j;T)?xrL=%=Q>e$?*fw;^|CcGcF}8 z2z4+~RdP}CwvU#jRW)-;eO;5EU<0(+5WT%nlontB=O$r2MYvcA)-eHEOF-}9u@(xS z&`K;Hz_kcWZtH2DVc2Xv?RO(}wE+|viO&(*eJKH5sQ+7FG7Qi*ap#uEAr}Vzu9{FQ zCbLDUQ$d4R7cIs?lEdeMK^ly`BrWCwCT_a4(T7sex%97%=v`z*d?gfw8i&BbltpRr zGO%uuo3S&^PYqf#z-TL6St=m7)E+1#^^Is#JZ@bz1Na-N%uwmnq1K#CX znCSLmS3#=XQ{l98Am>u?)1l0n0CZ79(~Af+KGs2iU#!I%Rn!Anu*hM1Tx-Gf6?~tPjkkD+6IL``IRi{wA@jXmTM`#B$ z-X9tWdMTbSz-Q?|z6eypR2~;xQ*4of6_=~$xrs>a27HAE7bSrLB>3G1VvJ$4NRMC3 zCGOPVLIFq)BzOYZ=wfp!L*&h6R()S#GKN3#4(APoqg-r?VR^F)HHB+l=EBN;z3a?L zLO=Ka9+yH*3_G9c1|O=onxDh~c1Z|JGI3#FaUWnJ>esbd9l4f>-JmCa?uHTs__YG! zdWLy|0pDh%mP!Z_Z!tX@Vvux|NI)2V2S(h&x*3lIw`r;c^il)yc@j2VPb}5o_sJn2 zwj#!Ya7{|xDIpk%xGc%hU=ZgJ4NWcABzpolxwPI7sU6iqetJkr#3_u2Oq9?HJ$?fN zSgdw|XEcVLa@Z%t1!xOqX`l^1urm#uMSxF65g0APZTJDj>cC%fafwFgpKoTflx7}A zum>TU0odm-F-PL%2|K3f(ft4n4*>(DGykgEIN9iaJp=MEKsTgBJ^&q)&@@_Fml|@@ z5pHY#&kjex;4%^I7D~mc30@4~k*iJ>muqF(TvAx!rKne6UOZmn4IB)v6sk?xTJVywnEYt3+StifSY!0rmN#7W5iZ94b_0>s3Ea{c7TCFCx=o7v~va~M@>Upy390$ z%NmS}q0!EGfG;>T3nhFt)S+|WMGC<}f--`jwGnp<`K>aFcu#||Fk;E3_7&C@~c%r9QZPXfX_0>4+Uh%=8{BQ|=zA2%O&1 z&gFDVdHa1%gx<|do$|?<-FWWLq+E|#)XgH$-JIMApV0$^Wm>|`Wf z@)!9X!auldmzm`LP>q76Yhw&o8_}1p0jp7(mK(eM@{Ad}i(5oZWAFMnksxhbUEQ-Y zpGTH^YY5R}<+K542oeMs`cfE*Ky~W_BQ;+Dp+nBzn1RJQ$WBT*tWBJwp3!Z<5yEv- zt90jXsxgy=lpAn!9HWy)#hphLZ;|yG5lVqJHv(5Gwt^Fm-5+8a6W_LbNL}fwQg>?F z+EttTR6O&_CN6F<_mGDKL?54A;hPwve$ZzAZX1ukdRJ2RLfb!+ zEB&auhZAr9z=Rfqd4^l@V!ppYPFw25))MX+F`+S4gIAzH)(NlnEpv?6H7L`KN}T|N z0EB`!AS>~pw;r1$pp~E+_+Elo(!|yVPCB6<*wdiv2^e+ob2>k zPi-JibZ?F}U8EyEHQ-jT6Cc1d&IqOrh;UUy_oy!ZT4<%j%RKdNy&&aPFLd-Uj-w;> zsL3g)1`U%MVT@2?(`dw?xG?U~z00=U*zeHYF1JGyoc6->{{$=lZz~Zt^(rH#t{`r)GL1As=-t{%4 zlZIoZdT1U4cUy9EJK3^Bhkf5bIbIunbno0o7WuMP{GKsXGl=$FDgqEM41$lnU>;+1 zJAfIA6P#UIMXhDvQLxa9LB7QRay7&$Cy8?wgK!%mEXG3zrG$B}!FU0!R)UvnaEEW( zRBJlXGHAxHVSg@Io9z|&62vYb+_3_{7GA^w`ZwLbp!4gt@ zB?vR#z!KR^uHbYB?$GITb?srhTZrj8+D#aC$SJS(MLHMqr#J|F$ImI*p zYLPr&6boKCJeKz3-krd*#!jD23AogmI1eebK;$=917)AbCYOcR{e(6=g?h4~XbETC zCbJuRNh(Ri!m-#p3?N0oxK?-}O)7{VBn9MQ@h`DiN^B0B=62G8T~Bl|g6A~25h`gw zM6K04ou(#FrK!Of^|Ev+rOO)d(02;x$-xmTlycuU>6EtoCU?fc>i^FnNpKH&pu14K;ZkgzKkMhv~Sz zYC_$=E%||DeP!CHtz3HMt=4gT4<34~|*N$(~kFVBl-TG)t zyBvHIPdkiYb05w-9J+~uq3qR=_y#bS0SxHLo;_{90Thh!EFz({3EJ`{*eXL9sS!7H zd@OZp-}~dxwY7dx1~5Q^^?=L5)Q>&lkqvJ{X3cbuNG}<)(cE1GEbrLUy_@88P)Re4il&5iQB` zF3Xb(-VXoS`w08=3#K=~W7{EZu6UX1&(v!Rmnkl)nGq{$&te2E8>;U=na#kyn(%3N z*vstlAHIfp+F=?bs<0PeujPW7$Cro}KyOZ2+`BKVo(2+jODfs~=X3gsM-L4tb;cL6`;&xudVDT$8$EA^@}Y^&HYLd|`e9!7}O z%wT+*s1J`W=V2t}R!)(6&DA9tb&uk|;c4~}Wl49_JNZ>}3ctEk_4Irku~|^b#xI^Q zB(^1NPkijNp^w2?dCdA!`nUDS!N@d=-(-#(5l-;R7s0CD;`i-m0@hvFav|s4A4iJt zIQL1v=e5OmGm>%ypPnjCR&wi@n^cttIlt{B*r!bvjK98P`Sjf5TesOh85@d8pWi21 zeO~*FTjf+bba(a(n{C-mby9u0=c^nok7q6I{CJ@|=a86SIn|I*il?mVRtMOwPu2#W zqRUAlhi7-Xik&jlAk}3tu6GA{p657K?hZ5B*PUvy81?i#wByx)%1P~b$7`yPh!pq3 z{%7N6{nP6=fA;l%`MirceRR?#HB35wHaFy533J-RD1J+^wA8sqr7IhJ8K`)`^)P*r z?GLRT8&P)WdfX}gmyyp3d%E&6xr8H?cHzEfX=S07tF;T2ruj6uh+PvC5L1)eH-fiF zo-kmUNpQMq>3q?MuU(8N{Rvyjrge8`sYX!$C=>4P+n;089b$3yH{Oe}vdGiKl`B;1 z=a(mZ^}YfWsHZR6{{8jEKX(O1XI=RtPO3Pt#jG?P?@}3=QQU??KU%KmrB~2-U{@*0 zhP(T|%D%ubYBeox)|waH&FxX=0q)oIj+}$l8I;%L1wZ`l%U}JSX`2uKXtL^Mg{WMr z)VvZ^(c^l8Y9r$r(Pbg|@wJKIJ0k@1N?=|IhqgMYEKtwJQoU3K*(dhzBrYjAO1iS= zrgbAblydfJi0>V!Y=-#v^#kiP?)@5v!!ESp&r2J?bqr~ z*~Bn-5G|~x3yR;u=)&1nP3TaqxMrlJKi4Hh<$k79US^x6A1VEKGFeJ+zi`x{)TXd= zM{rB7^?tlvmQ-Q7#>`5N6L8~iSSTW;3O7hdUD^wWCjE#uLAazP!wse*54vJCEOdRX z+v2GfTVO?t@k zgNBUOpEI>ug;Q!e*}DL=$kbvz{p$%cu9OueJve2>k0nbc!tn82oWDSfE3YY{#u+iD zja<`w{xkmdHn|X5PVzD+9l|u&rGFR*>Y5^agO(CdXK=wooP7RL zY;JCQ5nc?EMg`Pl)OZbwloQyid`z_?Rw-0#!Se|S3q7WG2k9{ zLWBr0g_fyf<^Glsy^Vo&jXB1!fEB_v25ya+986`;wMf%Z5|Rzr1ObLRlt&_?MVMX) z6z)c}kBcOsn#UXpMr^W}<_HR|Hu`vPeN$ zrxNyER=V?L4TA~#$r>1$kfI=!;@DE>rtmF@1u!?8VmSdv=eecRW2 zv4{3U2q~RPM??GbfDoqGKv~0GZuMcTck)a%_TKh%PMQ#7*)~!%&EJtSM=B4v$0$li zgV6R%?pPOKDpH%zQFkKk-1ln8vM!E7ZTEIg6@vk5pP0L-Li`MjqRm`Ks~Z!jHKAR0 zfH^{3lqIJptN(20Kf>)vo$BAd#)#d!y%=AuFBXm=^7xt2WvjP)P+BFFSy!W*GSYy0w{wk!sTJ{tCto)_FH>iE zh$tgH@Kajlw61SGkGJFh-;WrfkZu9F_mRKnp^MT7w)}%<|3zjfL7U;4i0MdukttM2 zvLC~kjz&?;h9tOS(j3hrZkkYqKyxBPXy2Y=FLJuJdb8tQ)(Dhy9|Na?I^}GMq_t&O zGdFEiMuA8h-b=b@&V{w= zomo3RmlC#LTg?G3Om}4NMvoNjKb42+#gH@mrVBNLO6!%eD-76KsWMFQ^bAI&;n>6E zDj_!!WN%0gpM4d8qB+YMR|~>fi8{i=V}C#^UqD>7jA%ItkTx8>LcegNJaLi-JhSy8 zCCS0rqEPxi)h*jd33`6%z~JwbEy`(AeA_giG&f7mVSw}c8*NQN&l>Rf WWnmsmr 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%0AZ}xMs&1+_wO7Hs9{%X#MH|F;G1?El+fV{&PG% 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 z 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%0A|ov+jbqL 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 =o_+H9 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�n-;QHrF9nQw&zL#7JM6T!vme3DK44B3be*llXAR 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

    !{e+D}MC=)G83Hje;h#FHI-MMW?N8 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

    x1Ez@M~Z0KuHAj=iKQt!?l(%{j;2omWRjfGUlfS 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 lSK0#!mpvuzFA0tx&3o{|2 zUtMuu%x0!2Z3xHp!RDTAzaAvF7EX?h9bxkwiThNj8#VQ7&aMPi@~mmV>v^!jIPz zh!BnmTt0bUWKug-Q2otZ#+xcLq6mu9C;_gBb^kQN#BIU8 zEef3Rm;P2;o#HZNF0r4gJN2gGb1{K=ip}2ZGpSD^xSoNoTDwJj%a5pzGPNiEVMsEp z`=BIGI0*}7NC$x&{(vxOk0Ai0$pnirOch8JNhm=ohAzTGNu~O!9T4We;~myd66hs} z*ph7}OcrcSNHBmi#yhP&XPW5@6x~qFzw@pFz!hAVy3MFdlH)gM*Jvhgzk_B;cb%^V z1PR9kNPa*SMMn3=aEn{p+6j#vk89rp>_xr(zFWbLR{Z|JEu61<)sRY%9;qjG(WhQL z?06+6Xr=Q#sh2pbd&lnMthc_$nHv%3p2ptyim7z12Q+V!%TN^Q7*L?AslIe#5|lAU zLnbzpRT&-98)pSW($%VtBH1%8va4Ns6YX4RzbDjBLAszo>8@`Est>txo{kVweSj@Y zG5;#*>MB3#y^J!3@^Eq=h6(nQ{aR;js*JuFYmhSM8Axm{$0#Zy<2%A_eTW8@TZ4F^ zSVxiNsr2NuN8K>qaiE24AN~<0vh4UouX@jV>_EceoBikChA!N&Af84sO>iC3R;EF2 zg8a5NZ4m{8jkCmF0A-y;a7W3;^paxw1_hH~&)*9h_kCB5TU+qICLGC}-U zK_4Oz2xQ2p$hg3~xP@p|%IM>OyM$ex+=IEZK(mtfdJtbMVdlH^sd4PXFEEj*2MMT3 zArm_%wcB3kS_8Ir^+k)Z$kT<9ht4myE-!*hqU&TVf?W2WCW|o1LY@P!W6||^2qFWl z9t0q(D!KB=gtiVzz|7IHFJo_kApU-55BfodnsN6IcYJ22{NnV9lUZ}n=C#^b{BrP5o+uP_>&zdm7h*dDekn*$y za0tj%Xm~|s`A?zaqA&@4f#pcFI@-vj>8!0qoxO5fCYUl)M8BTPo~-a zAkE2iX^fJ42Q8F~7*BRm)IDvlqPlP?e8U-HfWrex&3bd;)o&UjQp#EjLu(60T5pt` z^48b%E?(5v9GU=;PM1F_i=J#E)yMRwO7ma~(3~8hB4ehb$ zcL44nX>P9#2c{z5V`^Cx6@@Fr-Yi1)-oVO-SO|f5tzpFNU>b}UL$x`=<8f^IlSo~RR3oZK}RCh2=zpBo4)*`|}{Bf?tW@0@zwwoMS!3iL!dFQ(>pTL%-xa;DEm zSh_zM`jGPU-BjRVVhHXw$*=@7Bw&^oF>REB6@|Hi7R|O5ufB04iM-<5z5Rqo&J0f- z9!zunK;3ylfrYK309g=C$~xb zj&xZAL4B%RnhoVI0qn)Yhz1qB696}II7I8B&mgRMK?uzKB=~3POaMPrIs4MWSL*cT zJJF8-E@;RVae>D-To;ww?|7Ho&rTJ6dVlVQ>hgx&53&5&QsPY4Y^;>3#z~^16iVW2 z@3Gg&kwS2K^!Ej2RH>}=#3z%GqVzw+;}_*T5aLy0KhnF8j;Vnxnls(L5>$(!qqd4! zmR-m09x8ZQYIg+M_PpmB8umLj+SmQ-Vz0N!`3XrWG)m-dCZ;{)$eA}^)*`=Oei|1C zJ08OT*~Bt>nvmo<^_$r-*8HOkuBtpPJUj2+fOgmQyX+w?5 zGD^3*!hp9)%?FVF%-;}q4(AInkLz^@#!YMjAU51kbtO5R!R&fn%P}OhfY090^afo3? zEF#?xw&!7zj$~!L94U0|%QK0jjG>65a?}Ij;4L02ggH^~g8%h|-;)YP=Uw2RIT~i8 zL;*Z`frpzjH#hUJe2z#I8kn|I5v(622;vlL*#aPLcQS#las~W8{P7uGpA9tqa=W(; z-;99Jl1<^qK87!IOm&|lJ}y?8**yc|D%ay1O#9(}%rY+l2+HU~5M%-x3B91K<`r^G z9ZN4!9?Bs0LS^vBjG16ZXopD^nVVTB4VX{8ml1vcjw{b7wv`Kh*MzwGMt=OQF~mIf z*Yg>{%QHy?cMy@|u8{M9C4d2R4fMfbCNZV(4nW5lx=O*4Fw{t}_?lBWEgOp*sn-$$ zvXRt8+#yt$atdcGJgy?Q_vol}Dron|#*R>s<6W~<(F2DfJDe(PZt7jy6%KZ-cByuI z5-W1ft@dO~)T!Wq8c)YLEsSXPv=2$rf;NwIRAgjfHPA*T%?hZFeS(*z*A_ahKFS*e zva~W1;ildx@owB03h!ezV_Qr>X&LPrU>>o(DgYo%y|T`sotNIaHM)v*f-gDOQuxx{*w+Mj`(!pbrh^W`K`Y0Z*d@ABhl-3(81DiMIF>6-~w5z}vfU8=*}< z!7O!@qYC2@aLMgKwkXE+h`Aj4Q0UMR1}X*l5~Dl0D(>Xd=bsf6$c?#md;Ehf_9wVR z5%?NX4@wyV$M_a}&@#i4@DFZYOBS)`V!#DA2uPUDi-Qn(KUWmtCOT+4NC%tX-&?^k z5QFC3HhN6L7yV_grdeTgRR#NS*FAIkly1ih_TwvvNVSIEoL;zW6#<_j>z8AdLYwjc z)k!APX;gVPx)rinDb3_Cr)cS$eCVu?Jn2|>gZVB09QRIbfj8(LW9Ur-p_HsJOoxtw zmT51t6}QW*y7{0zkpgu2b|95-h3&MiBajSQc03A`f^(%KsV-8FSt-E8N5FteN!3bW zpq&Gfx0LfYrdP(wzMCsYo!<=uSvxR zfHfre3c)bB3Fk$dR9Z7r%tv>`4p|t6M==CR$lTU zs}zg*0yQR46LswRMbm3xTGRj*V5%UIJ0_B7EQC4(mbY@eWtBtM zRgx|je2DR(g6khP?@$ePTZxwF{k-NuCU~!^fyeeF>M?n$(b;K!(?B#tv@7_OD#+GW z_oAfhq;)JL9JHZppp+_(2eJ&@IIR(SSt0k3*5amb(58tJP&N>H{UEXew+?z#|Iklt z(Y$-(_)(WTg4e5EXH}nfybN9Hx(X^V1!BX{2zUv~l+$Au%t%zVZHJj#ar3HD(eh9h zmlccW4j7XtEv`ge4z^1$h@?o*R>!~8<{dS1r<(62Lnm%wQT6`+JqGpRL4E)`L+VS^g-sA_S@*H&2a`zsB^<0Q3_gfI=%`Lm;;2kQ zBZc*W`kg0DG{Ohs=u2-byPU-Vq?I8G(4SPCcg5pQ$+JN8aqX`KLnyp?4Qy z9`yR8BQa4L53)^`5D|z0pn0y&2s|=TEq^Tym(hhAkti%`Q(-72ABBU+H+cZ|#+) zj5YYwz&CI!k1tZY55yl3<|IoE3(}y2ctg>;n$}USOSR?xX1!ouo*DhZ6YU5qWT8}y z&@m8+s^sSgm1D6eGA%4rAhQREXLw$J)+(pi0X_xV#Y zx}H>I!FUTd(n`#B-<8+l^qcF3mAGM`+Ei=XXYpF!MW7b$a((1_!P5|x0tEaGcQMkj z1hR5WDHAkdy~XCsNj!5%RNln>oGqRKTi9d3wV8x!35qJBCZJz(oY6EaNOG1tbolY1 z$KNtW25kP$a9);-6u(YI+e(>h-~4s+Y<(i{_C16=p&czcqIC-sP)iiuW}v*n5?>Do zjF0c*53PS7T|Y3ckGyta0(@)$P1ZMD7L*?K}xZbL+6&2!{At{f@#`R_xnL{LqlO25puS}vs>m~?UX8K`c zZ$)0Q<-Kh@;~np}zsH%@VWF|#qw|FX66zDX2I6C}Yu3oC&(ut7Nd?51RtH^8!3MKo zbxrm)2<)4bf-7(H{_UBU5cF!|OW9uyH};k)b5@II2#ABdx_o@Y_zU(|;0KXLpX1Sg z=<&q1$7&Q-Buheug=rwQ{IoQ1F@3(3T->&GNl@^T^$-iQSiGB2WTmT`CHz$@O49T~ z9i)Ih9|p(MLETp{MdcJ<9#eA>z6|C`8RwVCWRlaJYPL}aB9sN31$<1w#UU))0LIX0 z(%g_k$`>9ShW}JZi7T#@FUH3L$EO?UV{d92jMj3}3dUJfY-^mg=z2Y5z%123v9&}U zr|ju$$qFigOP4mR!r4O9;Gz{&1r*r=ftE$ax#&poRF*3V=C9whH9X5H0Z^DdEUj-x8lR_o=*5>9(iJk)^2ay z9Cf>nBDPN;zW^IZp=^4ta2E?mmN`k<^!);teDx$C{C!RYoMs0#Wn=QSIZjrHcm}M= zhljb(H4s3KpXJUW!2ObL(@FMGK{{$Gy3`U>kTrrp$NbS!T6e+)JEGE~9*FbPHUGOCb?nn%LCcrfiT22ji&GW+rjo>V?x)yw5m%>%c z(Ylxw{obt5G^lj#6qky{!+TE3(K(#)W9#i6zX@f)?X+Y$NYbzJP(q;Y3whBY2E>ii zfk1ePn-X&-qv#kVjvQsVNjOiMRHm9~|AHqyRqd2LmIX!yvI-`kIRzAW3=7f0G8dMY zzl#xy$MS@<3!|q*Vlb%h&%M>VAf$gC z{IGlKUOYIv${hRgb(RHLSkhF63nYIeEyI=sLWB8mrQwaN9lk{P$JaNbz}!(-Y^KWL zTVX0~sH}vw;6siuaTBoupFxi9?|zUUVJat(WM)wgGffj!IL#k(fL>+QOo%s4CM@^(2t0t4|X9DbN261bZTo?9pU(7W-JZg4uwD(ud zrJ?iH`zzI0fLAg{^VA%RZx^R9*rHxUwHXE@uvbhFD!=N3Dk8}czU^e3$0ZZK$NO=u zY6CH-Q(%DGCs64I_yf8_0BtICkjlRsfuyrAQStzC#9}l|xvAu+9YzWFT0pUb60gNk zSod{jf%!KGBBMAVZu@U}_KT6Y;CfT_4R9PFx?*YO|I-X|%n`B4eLq~lPtn8^!}UTQ zaAxp2$_tj}Ar-OQ20p?VD&$Wm7vQV8hymyrZF{Bjo?w+qUp<@_0zZ;NuSVr3aaFO9 zOnESRJE@;bTzzcnRBLn?{B20&)Z1gH#;%|G^zPI(j-XJ9#OYke z#dlsSmwIgjl@nM*B~$DKMg;A5q=1o`ysoT@#m{uZsOI9M9BRRK0WNJ}tdpLALlp)U z#X_~Z7}S#rLRUp^sQ~NW+m$HxM>6$Ez$=`9L(%nRzK#=z-`sK?IU{})o2*QQXTSC! z38Cc)V|gYIlu%!sl?KcW);95fg_Y^~XK%ef>wv<)2IJcZ(Gf&`PcpOs19c_|=J_f+ z_luyxzPI1T4R8rK_kTj0@;b66CPGdS`(b<(F5=OAXg!>YIc!p4D-)J9Ps^O2xtYc| zQe(r0WcZv|B76-<(u6twl>KJwNO%&}0aaRaQOOdpY6p8LxF=;|;=@rn2TYOEXRrBr zU5toy5WD1Z{AiR8zBAmYOdjpG4<7$Y5e^c;b*PQEmuL2?-Dzj!t8s3o#dEks3lQ?G zNfBJTtM_2ecOs&QrtTD~{L54)vxKYhB3lcsE2^z;1Pd!hap6n_N_q?;!Lgy_|AQfJK5yhbZ}#7|+-qfM6_%nBtD(*krvR*J$Oud@lit9!#7p3?xulc_8`abrtGinz-DsK$FRuG6|!>K+t zI6tK4G4(Wpf3c5E9tkPi6KKlZ~DqVCwEV;OJVuZ1fm8E%BIM-S#Qmo+Qt&btxDhz%39E+@PPoaIDt&P zl9M>f+W|%OkH6p;^@V#GnbcuK3?|cP>I|U_;Z$CPrsSGCUPBdJyC896%-#D6MWWtU zqJS*nrIMMTp}lIg9l5IPcQEZp$M73xtXrc^3}c#SdeEo}ES1exH6ViTTCOFOI_$aN zXS8oBM|_K?-1;DX?c#~sV-lCjMCF%3)l5<~x^&dXV%;@VHB;auf8uqYNYUuW9gQ35r6$c-eo%wk0LSfy;^->2$`Dw|@^DY%vJ*rYXu6liZ z=yymWwNUw%HV|c7T`XB+o?I?hS}EjFR_38>bGNp>@cuK&qokbDNk!6P_x+cSBE2Tq zfX5HU3TsmXYCfNRp!}rP*8#rEE6<3i`|0tp8jK&Sl;VAVApBmK<^9W2ml>1bvd8^lJspH7WUN9Jt-+{uo01%+Y1!Qxq z)N%I9#^yR0D`W{sd7ZVb>WR5A{CbL2qkLy>6=g^fYX`|F+H3y3fx7*q^ys$cJBFk|5l& zw#{07aqBY@UIWby(>-(rxgW|cjkB){bk4n)$XcHpE-_1&wc8E;_NL0^zSm&ulf|)m z|JQfyo;CgW)O>OA%iy!8D_+^5#8yl%lj&H6`zfReExcBGx_Rp-pXPETAYyjR|;0I#(v&b;c zwoTz_oIR0UMVax_e;tY`$mI z!t536c$K*Vqe(Q0UxQvfSBM{Eblf!OF`=u0==I=RF>|Te{NNo{B|i}fwFa>BXXoz< zh&Xi-eBq8%6wN}lni#J%*;$$!ShH}iDC+w{Wl6H?_p0*z;P2H{_iDb^JZSp<{eFEn zTXpfl&uDk>g zYO4&>4uvev6!C+w4j#>=uuinGT6mYRLrC~5aqkD=-O?A9!h0}R)gpRvSs~i(Ku4!s zzgp*|VdH&I)h>FBBZYqs7~~$i2+$oO@7&MSZoc=7{;@gclcN4>JmALpUmt=hYkz$VdHUnmr?4LNt%=C7^IM-|zSVAh ziQi)X*!s$G9^Gb9#X`3yY07omQyKcp+tYMQjh&gi(QY&GMiGo}4{uZy={E8nqtG^Sh=L&;FR39WZHyvje5 zwe=3Gz*OI@0`nOhNld}-`lkEMl!@ONw*-tP`A=FwEtq!x*ZZc= zS+9td(t9+^8~6i-{pA+x%>moHX+N(_$?aD8JYG)WIXPN+We!MDZEfdqU`~tm`FE?c z|7PdWT`(1w8g0_BYvRHxyrA zrjPF;ws3Fw&36TI-t8|_(ze#HQ_abpT*u)pt&a*^Y0Rs#tx!GQ*YDQ4e!V`ULhX$8 zYmblX`OO0r8qs~Py>{1cFnI21J$>}ZSHni62np=JeskdTp+`5F0rzx^4-N)7|15kz z5P0Bes$FRCqg$*$_Y9s}4~6AlEE*N2$zQXUQ)>Kqdo`o-$T#cZ*pC-aynNlGxN?@g zZ}qc(@t+Wp(;5bJaW3_e$_Sa$U&xtptNz#aV&;u!MiAZ%M>!!Lz~X9(qr+aA&K})d ztaTM0YRex;F6xnrzso5cFh1{1g{;S)jq7zKS5w}?W=!_1r z4JJZAev&(;KAWN=^45fV>ZZ|#iR`Ysr5qTOuD@}Ydm^Ui=t6_b!@tw_6<_(wmenZb zNtS0_sqZpeHp#l$45<|U0nv9ml%~%}lsd&+keYAczdGYz8)7<UmqKJa&!wBu+jO z{}FaQqO&GvsS~etKP#brEiZLYi0A3|tgG|70Qt#Tv99mjHX9}}7selWDsO*avav@m zf10N##!tSx`%C_5ehk9?;^8!>2k#%;fYzQLE9Yr2kZ1;c_;AY>;k@dQzd8uT@r;?(wo+MzAsNti{^*)NB1NUnC7tR#)`I$}$3Q z1KSPOzo%5_Zy_ocJMuno|GYS%8HC}wllAWVF-FMLu;spmtfNu)UL-4q0lL;Ku)nyI z__b=n+_{&c+_*O7A(u1A;73=NAT`>V!tibX?v(s(%AaQKjEfm~hc7D$qO$w5c`r>W zWVz?re96o8ww=YF-0628YRrE+Fsl)_^V)~+Q9+OG-2Pi9G~%o;0;2@~LPFgN4kZ} z$2U23k>$#_&)QzxeOvfqe(GsI4HFkr+PS09LAKG8K?`wDNL{H(UecvTO zb}!(_&E`{%xjjI#-IAZw@9|#yrp6nCOM!=fe_&=dJ+8F-5xnmt_-$wSjfBq{S9|@% zGx_wJukOALPd_{{Yw=WV;C5)l!;_zv5}rPrw!0AXDelXbk^YOV+LeT-pT4fcW1jEq ztxymXEXeVv&-%`f&~`mWzO8Fo^c@~c`&Kq}@wq|wfza>_m-uPfZ!z6w_7U`3ZPUv4 z>%5l(z7wg$uf44IQ{U7L}LP?*`y7MCA zU+6;n{A)9Ad+lrAKj>0q{pjA{ErW~QP!W=}YQmv^&?R#6Wz_R{(Nq187hZes^?nEz zD-qYLUH01DE#G{UbL7)@hn-Pg`x85{Me)%)34i_|FkTub zu#RG%m^$Oe9P6}U{|oIR08MD>$s4>vNN$$mDJUjO?aKDlFy+&qX&bq+2eavl`J4&O zRN9_d){(M_w>^XxYQ5JqPf1HKj80|vq*@XRW3mW4%!^q@GNENzN!>nNKGm|e^*;5Uf%O5cw?&PE znqNJC4jtMm`Z=tDP}dnI^enB7XlmXMcex_Dk*x+Is9zd&bvS>CW8PeQ>AmNLAD6~_ zuBu0k2V|X(`VdrHt2f>+IkWMk3XWNth#0fm`W*G`+SZrYEzIE7*8~LLHj5%=zdf0( zoN4g2Q=@z-0CB!W*Z#PwF#10yjq`sbO?`>URhWR}e@+_2x=_%$GDawDOa0FcP4Di1 z=Y2(!BoLN&QH*embQSbQBC;|ZbLhr@=l#3J30RYG@bO#~lft5qa2}Ex;Nak#{txdj zc6ozBCI?Qak=h(Up?e(*)hylIr#`V9-q*0n?T!6mw&@hm;B{viC2jMzq$Ylg>(eO? z@0;cFocGQBWgP}&>mzDvf}a$7_LP`?dS#=P(*gv^=PS-TJzg9;l`9ak5AEt6!+VlF zis0~m3A-EK`!uU~>g)fO_g}Q_{N(Vy_wbA7zqdHNU+nPm#U6+E7rzd_e97kUKAuH_ ziUzUBNTq*xUvHlE5AWYSUaRdoNgdnlJQ=pL{gdDLPw#>JFmdOtETdg$^jqVhfC?oqJ9Kr^0k9j8@#S z%)AMFK;L0d29{~K8!xIDQo9zFrMZs8%@I~;9C==?WR>BhGabM94KJVroW($__h(8- zUpfbop8&2bqd(0Bm3MYFMtY2O!>4V4e32P$!)C*ep5c(b19m32I}E`339-9UrdNVh zUK1Yvni3}EU!m!y8LiJGR@U6zNeq^|@kRp3X--RZl*^B7skqsec8@<$r2|=JtgHQf zGRv}JJS5^$VDf?~9!_{$_bKhyWV6BKg2T;${96^0kdONA(9c-r8I8ZjL%1x7&Q@cIMjVdykWQ>NouZkBsHuFMAkhDl2M@vaAUvS(ABhr%c}an7uDy;%b557NUD)=Prkr^KLh3Jf$%U!T zEGU2IXr-24UmBRblUtAzKuX5!{CIuCLC!Gtx0gnFv?ilTA2dJGmXclm;u=QzSJ}4< zqcnjF&9xJ>NT`0AaHX^P?kda4TOodL@vV8WvGt2>o{fZLzX)9(Z&v75coqc40mu?vXmscJIQyOW9&RqlTdm$-f4a>CqR+ ze-gZ9Hy;f@A6jg6XFKa-iz_rf4cRmikFTHog8V(WSuy_Ra6*Hnd(Ku}maC0I{UrxE zzXgR6&sC9)PjR|?7qg7n&3VH{0)YH-?EdK#( zM>^XI%CEy7xbB)^?Db(X)N+&3ZoD24Idj7;O=ZTA{bveN7^zs`dh6Xz8Typvo}d{p zaH{9t?PwDk&iv&BY3_y(m#X7o(GAlP@gQNL&eDuPNrs_R?;8IRA(EfUy+Wl+c^Iib zo&C@sm`-qYMZ%@X(ftBeKU0L+!kwnZ1Fs~73Y{k;t&1LVK9Mce>`e*$o`0Q}8Za`7 zgJ7ROb7~Km$&sUn)olHKRCEW%DF$T6lXy#6X^Tw5lUit$cleM*T`TxABu(A2eJ340 zUbC<4sLJzBMcWNG<*XxH^KXR$P`@Srr!D*ce(nC>|Dz3j3N!%-|NCkep8uz60^XGW z&&Ps}-b_!H{L8DD1OF-m$^DxC_OSS6;@0x!$$Jm|`#CK2ed6GVobi=iPp%0uVCE&_ z2hX}^|KsYn=?AWGsY?RFH3?GhRj&L~2C9%g*Z3!zKOjS$t%lp{Z>l|+BbP3@_q4+9 zk*%GXtGz%r+Js9=0|5Lx$8H7 zBLZ!WRs6wWe+OC*9Cd^;9-lSyO$^YD7JJ4i15K5~9`*F5W_TR<@})P|*ps1F{$il} z(!S!MxB3k$aD9Pl!Z~=NoO|g$Xp=oQs}yMgD+M7nMaoA{j;>;EC&Mc|FT#8m+|iBgmvg&VTG3^zwsq6yv9LrFFrZ~x8pAU1Yd&i1=wo}2(Pzm4|TW$4L>=RCPPvnGMSWkxO!}`76 z(%UvSmW|!`-)pD)aMw+=k|1)kJvE?D$miQ9X#1KQ{EN;n>jm{JnM}R9DtGQne1jdS zBX(zZ*0%L=mmZaO<@vxk=d?$y7?r3=>MVV#H&>r;Ww;rCYEHcPckDItNQgyRl89uMD}e z_qHN^p1rfu+nT^jfW5KzdrP3~-z&EJNyb!-y}h43E7Qh-D~FmU{;gum zwZc1Lm0R3)RVpDH`cJA>q9-?}E1il*uIi_$C;gME`Owy+(aM!OFU!=@?EXpBPc&i1 zwIu_=+BZ3zR6Q>R@_ZS39v^~+?*DJJy=PQYkGA%^Qb_0tEz*Qgq=|rvbRqO!R8$be zP!vQ|RFn>(cL;)XA@m|j5$PqNcS2D>im0F77J*~z+3XHXc1 z8{lxM11(OLpPP8$9uAn zh)f;zTM}E2s?2n@^d)vv)<1U0^#&uB85{7zC?)?MSh8vsx`B5>&=$V4J2$>lncEf23!@E$?GBj#UmoTE z4=ZRCj0B+o`+tAha1&{RGd`Ls$QQW!Inx~&&puq_xV!a5;A&eI6sku+PZrwFtK zQqMUgM^fx?N$VdAnWN4+G-^&sA4BM(KV9^fkyYU=`IRGKL0!*1Jc0Q{F4&Jh*Coby z6(|DVw`Zx8z_h(8@iC&E<-95yJisfH5#quADsWTmNa`Ej7I0TP(A^(*8O>=(TKB&? zRlzx?*Y$^V<>P60?LzxF*l|SpoUFwrjOkFsLbAk=+N;ZZQ4&*;0zOKI!ry$-@ES~c z$2XPWsOkTP`gh98jxNXj(;{9+zC!fo^l<(vSru+4l3uCJj75947lW+f6 zUx?VJKH(Lx-@-57Kas33kM&6$NW}T<3A7SDjl|_Kzblrv*QtKUD7xBhNA{=CrL6?I z9h?^SGAVZve;I|_G8g4LbRg)$m&PvvoX;RF%%U5>c&=A&i!~aqT&O8)gOt+)u)Q0s7K<00Nbt**?2yw7*t@fV^eflD z2x5tjI-(j+#e+F_cC}gAh5gX|K@9$KWEA>X#8jjNcg4~hW$ANR^f!2=ReJg0`KuH6!z_%%&xAfVGZGVxG`@TobeYew zUW}eyOl-SHoffP$&qaBRBiJ9WeP!2jem8Cm-JjYd!ArKagU%e5)3#l=QO;}11`cjS z@ON3DM=UsZ-s5*047%XUih#lAk0?M?*;0K! zwvNt4^-}*tKcA-R*IL%woOiE4V)T>BuTSH@C+yVeaX2(7{N|Fc^< z=mZ?^+HX7m+uxET=kz7<8~)>O8HY-kxBeB0OvBHb&i|`h{%hWKF^|D zOgwBobJ(~OH2wQAm1<^3hz!D_zsiiLW7>!+O?A|G>tnx7iC?Q4_XGc*=iUD|{?=6X zv!LnSF=ntoMN^e(07{RSzK9-?1pu_Z2%xh$@<`{ojwTRn1iL=dOZi^BK_z+5Zxoy;B+vr=Md{Z(_|>R2qbssLOOCT;wzd5~UcKpVU|cP) z{$RBFy7pW2>YK(t{i_wN`@EQVy5Ep^x};DFTKxAxNf+jpNKWdUq%bmY{3ea|V>{B|A|RBn?XuAU&~4F7d&pHAJ0k+8hH z=(g80k~3OJlRRG=(&l{nBvyf0quO%o$jgUEGho052yp(||Ki{mA=&p~&+y!UqNIlZ zVac_ynYzl)$@}H=Ns|vLpL_7KH-7J==6vlGaTk z&FY8BTLbZ?zO_F;)<0Yw9`ddGHBSs=k}a!z^XO|{lH;EX(G6SQ$T`LdX8w)8e@s=} z8yWU*+F4&{i=iUS=Y2Xr%i{=(;eZEp5b83|3ocB`(ZL_O8?GaPt0j2&CI@g`q9%r*3CHZ)}qDN~CtlrJ{4 zpCedNjGtSDTaPD+qo;deT{y{a8KM{ag3ml<*#w=lZ0Y*;QuWW)9St?cP0)F2TI6>E zvZ2q2V17&rmVd_nV_7SFb39M|VmFQjpK#}gnA8rj!|~>0^yrXDddiO?2}=Fnp6G@J z0oan5jCwfQwsIufQv}>Oq-Rx3^^V)Aws8%_f6g9Q+Nyjal*(EL8qND zfTB%7^#F+90`Q^Zw|Gm0@VH~ZT1>Br1KMz&{}^%?z#gD_K`|c> z-xH_*okRFN$6@%mpzpbad6`Mym3`6W{r3+Q*vx0Yd1;l6cWl{L9jLwES#y1^|K-5ba`gbv zhq1ZSJCbc}`^Sk(##3wKevuHItGLp`&po#g-gaW+C z9D{96ZB04|lzL!9I5p3sC&p0v{fO)kv=W;NkX!)M%ODvpqL{6}=YY5| zny`hdxF9J97)G3MjhFl~i_3sPGdMQGnpnud?Y;seUAy6&Vl9QoLFp`c@{9Fk8gHjC zNJmNq{%5ya0tbTL(u(h21`p@*2u+mupEXe>+#bwLx5-2q$@^C}MUpn@1oHj!?mlIl zbhvq6eo7Xnp8Ag{A@}K`j|OBmN!+}|oL~?rW!mpiI$mUvV-#ofwCsJERfX$N|NFZ@ zpd#X!Z)W542rZl9Q!^29-^Sp{$K6Y`Y|70b2$*?Fl?a53JrSNgX);v^hBHD1t}Uc; zw9tEVz?E$4tCyl+=it3rJlaJ)TrjkPdqd6L@PhLq81mj0goztwDIu4!u`*N02DOS? zsC4#uvK(iP?$Qcl%;GqIt+KfR^ljv&c8*Mo&-Us>mCfI7=lOG?DS}EJ_S<|w*TS=@ zhX*u+7@voFU z4-aAt-{JVM3WZ2ZxvZ1-Mr5zrO?}IeIf=v2aW`utE@_aSj945PjNuY+di`UW5G-Dh z+s3KvZV`7Vte}7p+?nZyaw6Y_7C*}%**y>YQKs8+Qo;fQ%H$$Xmeb_2Z?Bqtk{#~E zUW7~IT2RK9q6a|6ADv$Fu1ahDXYqUk<3QB_`rofgZsIM?|Lwz1I}mo}zZweH**l$H z$bW)O!37cc`HLwsj;&deZ^ec(6`p*VEqyCKlA|61J}FfrF#_!GUpOqTrj5xKCvN;W z|I~GY7HoRPPkix;)=)YaJqWn+>FV1M{K?2aSeVdj0w_G~iirGwALB zuR9V$(uPEGh@b}Qt8_cU8HDL^*mFz$v|v*$P0{)um8tFAD&1JKGXAe%(*@W5FgA&W zLHFu=Q?-x&`&EfB^Q+(Z(wiV+f(L|uK*(o1j!jzji4%;>y>Ha!8a;c85u#KJi(E}8 z?bM-!f%`&}Z+8&_9k9SO5z_T*E8@aXGZEt1VzGb&f!`H>3c56n$^g;vQvk(Uqy-2X z!a{#C2qs+eS-)iO`|ug@-k=~lZe}@x178vSWtXEfM3!?oi(4K1iPB^Y9Yo%M5UqB@ z@*{`~iNPt)8N4+Yog<&uKX=**ZE^Np|(eSJHqdE$8qOwNv;(BCY=Gg zWAI$_pT=1EE;8*+=RLMx@*2jB(}W<@DsgX_bXLphY)@6@SLJHyOJ7G4CVv9UL8_Si zDTho9Xt^lUF@8B^^#MRWJDD9cG?e+dsiyY&ua=!JuV@qhe~i%cb zdV~#$=02~IMW_<#<^Wx*r02ne_WU*2h@Ga_ed~0rv}2grB<64``og zuQr!Rbr-JB&mLS^jt)9)lA`8SLxGbb;NeJ@_jhp!qt^;yS(dqULEQ3Kdcx=GI}!H; zU4~-h9^e{ib!RsBPS`cL!f^FBkGzBho0#eGsol>mnj9g8?4gY5=N|R3<{H&j=5E18 zAf*mh4TOj{UfaI4`Shkmb?4W7(<^G6;a`JI&c5Q>8McbGcyXW2*C&-I3qfN3I|5mJ zN*!OdC9hB8_}nV3fy_%?v%x5n9{e*%7<`^4x$VyR(tGRPFy?L-Pu33pyfdSzbEa$N zQL??|LNv;$cKSBh8u%Ily*rhAcXg>mB;LD0*W&5PY|9)>aF~^-yYSkHJnb%)38y3$ zuH`SzBNr5Jh7h<4P+=!zoN_%cJflyEJAZ*_uhVkKfm7e%cCyhHd5Qj>9(rvN3}*k26`wV>*`EyNfI0_DRcYR$PeqC?7F^^11TLW$PvuZIRQw|nCNigwPN;@N;8{y8GXW^P5XD+K%b)LIZzR}I^DJ?=L7}0#T z7loq@9H*`jHv6UPW?%PnRH~66EOHiGL(GfiTf=HQYg;3jt!4nCeZusA8f-1{qqj_v zB;kR>SHIi9x?do`|0z(XI8_2A)3XCe>O$S8+Z^PbxqD1zN;Bd4FLysX$v&vX02mo> zAn}U2_fp!eHw{Z!@V)Hmz=(Cv`9#W3rLX@4>dNcZ_g8O!Z`oP6o5OnWv;O;=gZ0=e z!wM@!TQY}~&Jz#)KDJhzQT^1T_=}bREY5EJIH3RV==YSf`Je5(*DH>879vJecU*jB zkN1{~&6W0?Gb@e{C_RA+2X~resYkoT=7DQI=W}Ql@5KCZ@0~V)mxAl!TbQD)M}Vmy zpD}XsK?Ds*i~=&j_L&4a#a>dKJ@VnvDuG^qxfTJ&gox_oFkFdju1y@Kf6OuWNqDCY z;9d{Mt@44~xK%1a@eu*}f_v0!%PPV?7ZD)Bp?iJ64v#zH13H5hcJrErJ=`^JvNcgX7deqpNY>oHzQ^=M;Eu6pcJcn z-g3{y&CiIySz~lk{dGkX;Rt`64(p&?0fvagoh{iEq%1^B6bRuT96Acdc{!jo`%Fv} zwvuvYMJ0B`4W0GQM`idG$>$mj$!fjz6^gYHT^?m|PvhWUMfQTrYqf)VMQB3bn96Jw zT@YCWSm2ICM+;H$X=ica=LQ$Q)UNb82S18XnXpILxR`D-utp+S928!c4()kwWiD}u zF!K<>PNrxNCW?*035qnE4v}N8_j|a!Q`2p&Coy(wqI#OvdeOWd(Hu*QCJZW<9>!O* z*-T+F*51=!F~vf}tb)wIl=#5KuY&7neeG!b_*gW=+y<|8t!{yfDK;0xb$`(mg3hl< zmJrngLio+dibA}LMNmxpZFRy`QSLFA0a;ShTk1+q_$Bn%a)j#o#xM|DWJOF5S00pn z&-yd}-a+s6i*&+tCoew;zrviiT*Qsj&~c#sZuiwCdnOAvQZ?ws=i6*59dMi@D+n1{ z^3nde1J$GBks7q*#Hna&mwrkek>!nhgz@Yb-V^SK`~2=(VtAhwi10FH79(sQ|2Sm} z4sz+xP)90A-FRG{ge<^R3gI~pgHvmsxGYHU0uJrxfdOPEt8Sus%zkYX-Gx(3`jYtE zbDb7r7kX7HPvdWud^r)+iIWHr>Jc^4Zowl$oJ+w@XxBzSh7`sS~Ym z_IYagqL}zzpGkOiQohNOq>XjI)tl-w(P!zw@mPjTncty}>~iqU`P{l7@g$ z(JP$2>K}v>{7drE5`Hqmj74ou z%<~Y!BS_fsnUNP=eA# zUV`EEp-X<>f!VyuRfF$pLzh?s-~|3(cRW>wKC?dQZ2EE-@6`!ecodX*xF|t2Z|J{1 zyqVH;xU_LivW~Ic*4$fa=w5(9+l(o`4AuEv?RungxcYVof8?T|Y{XdV@HQ<+xMFc@ zzboJDcbU!6537;J53jQy2bb%jG3@jj-RgflR`1PeKBOm)2O#sBE&>EGgR}GY4@1gd z3VS*?8I6&4T8l-1y~@Z^X01Qf2+{8>);04dezAFRik5jhH!ljZdx8D@h3+{VP+Bs}q76He9*Mfd`d(bOC3)&oQI{sbRWATlzdT+Sr_)qi zT=q2B9UnRVgXlb5PYB$fl%?(m3LgI%Y5TKMK|R(Mq#mEZ4fF)kwgS_hA6Oc$RUgMV zg{z9dv2q8EDk6V~1)=DDkzPT(C7#T*iyBi8cy@z?mz7T{1&c}W33&xe(FbsPJv+S{ z{3|h7PAP=_)3gXwWP~4gkne5;>vBYJ2`*G2IPRz;cvNy) zV3JqVALpnHiNN%!sEwW|!c;(xQuLa5bWvnLVOsR}i0E>qfLFWGU%p3IFZ)+n#mwo) z)TjB^)yGT~$Fv&ww{XXf!(%&l{W`p2hn-{lOZ@t#V*7ex$yR`h=w7 zgyY?W9d7*Vsd%Viz>yc;4UT7Qz(c0-wJvyMdJIB2u~{M!wHL#cp4c9l$Zs9Xx0l$v zoG9E7D`fqA*xwe^NEt@GTw1#c#=LUCCJ}>enedgR@{58(2yjZo}|8)LJia7c+v|lrAI2KXO^a=S#xArr)5ZHr0%6l)2A0n-prLu z%kRr5OwW)S%?NDBc)OBbIh|bLooR75vr+lQ#p%oh?_?E*EN{(BKgrCV^vq7{faZp* zTcugUcSDDGUb5R~c}HbUGQ6Dd_8D(@d9mc>{4{ckdN=ihVfGwPwkJdOaw+nwa_Z7b z_V`L>__UFm| z$lGMdw~@?OHp*9Y&0memw<^uo?9bQuk-yAPa8aU`cXK+P-G}sbl0fJ*|lgisz|rA=uv;s!yiS%48@v~ z#ok86p033MQN`+|#X*E6>bIgZGPV{9o1;|LBa z(b+SCkPr!tdC@8yRBUM~uk{~rDR>l4AtLq{%IH2D<@vm*X7g$#(>W0>50GV$QMz?P z>9lg$=}|H8S(cq`*q>^agksqlck@{?AxVWJ$eH0!9%2*Au!Cm0i3A=ZZ-UT>Sqkin z6jSab{Fqo`BULV`>3Cn5DX7k9wemGs^L5b&c)AM9%s#9d2`p#4sWIZ+C&LeTfm~-- zkQ~cHGRs2>Yj2sD{{j=@l@U>;;723-c4OJD3gTda2}CI0AyiO_l^}Fw!aKx~O7UnT zJC#y$6U{V>tpH`-1)-T{$aI^u!$c1$k)%w)zH zC&ip@h%&BEc$JyRmz4CX;RRDe>VYj`rX+W!B+sTXpUI1kt+DK0V|i2Ko0-PSgT`vU zrW)0zTAQYN-=@aQraV5clg}GyS0}pe7Vn{%4qTh_vCZdCGxhm4558*dWoj8&Z62O! z9=O*sYSS_n(=zVcGIP-Kk;>OPf4X&Awe_1#>+(#?%0SB+Q|tFvt(2M8#ioiqVr>Ug zJ+BbrChpZiQ=1dHjY?auqeeWmA;R25! z!ww98r}`jE=AZVAJDr;V4edp=t8#SLS5t|IM6RwY(p^`Z5ms4UJHlNySzUIqT{maD zu1j~@n{+w4b>DXDy35>cY0`Z^w)DZx}wV}D#^iP9{pP7fh zx(zS!r+?2%T!|fCT^s(nmiEgnaf5ke%WdShTly|vebn>-;O}>^HsY^J*4!O|yd2rJ zCBKv;)3Xp5S;)*66L;K3j}FN@JfmOIN23}?`CpRZC&z+SM}urek=~<{KS$r(9SevV zV<{awJ2duOoN-Lll#DbTJNFtdH#E+AGBfFSzy(jCh&^U^}8u(qKfZ3L1ssSMl>EgU0?aRBa-8^ zT~?CZUl`Fi+hniu>tD@oez4&!c_8~QjMzvMdvNcy*YhQvill(kW4IKir81Bks*TH`9~6?O|a? zgAqHfM$urz4@I|AvEkkyQyo(7e!Jt8O@k2=3j4lgy2HNRp=l@9lUdKcl{(+>T3>P2 zhXTlDLNLk)nH$M_1DP9v>MzNMo|2+1-@j(GQW(VOv{IBN^>L*jCO}H6xFFuuwX`I= z%(X1*&x%D+?qw?URdJ20)V=aVADT$VG307Nqk(?htBjMXxtCul=DJ$h{)KS`lfcfj z_IBXIzIaWloy~Y^r|arZZQ)QFjQIIMC9#274ohN?z^ksqzst}r=y4CC+u`C?I2j0w z1zDznB7-Bfd^W@2=+?#lCi-RhgNTCi(p633761{<5pfX2ENCKEK`*Y8wb3h@>bBV@ zQ9Mh5bJDKG(QR}a6B}4`uumZJJuzE@XIBp^2btu^PX-Zq!moz&juZ&HIK96NOpN)= zd5Dmb|2mvk8cAY+>7&8y2IWKmr2CcsAyi7fN~@WhDE)MVQ~IX@gNA7CuR#81Z~7?O5^KBM5?pzud(_rRGN0n$qHU zQ(%eZDlIn)9Bgp6hh<3!4vrKKJLrvIxl+<4lP4ErW1D;8Dt$LsG#dj7=+f8>>X320 z6#Kx*5fxFdcTz?exNPy6uWCy7q>&?QvMNdNj!U-|?gyz)>6W4dsNgJHZnyD=#6g}fhq4mTG1pD5 zFyb+th*$~)jmhK9sSFpk!d?kJ-h#8ebdd&AAg5;?xCc6Ixi9C!go#^eAa{MW4Blqh zN(ieN3+@yc$)rNY7D>N{vMiL2I-nsZZqNry;}gxCpa3HXd-|M*Jyeo_MXdEgSe^lw zXrt1J{`y&j6dNGsB?RPP@0}$C(X%hxbFZj{^MbK4z#5vqwgkc`EQD~!L--en;qv%V zrfVj7ECUwyA}CA{Lnx7UTNfcuKG8!>Jj^H2rG%R$U%FCnd(CI=%`}mSM?-vvJ7NJOZ2a)p!!y zZLfm-ft!CeRa|1BPh5DY{Mctbs*4-(Y)vAAo~)ZH>s74mTgrmUtT=qWbb@3^$H_h5 ziTW%r0E+|y42a>%dL}DIHv3~~!!<>ULn~&!`{OUn;0nS*aeB~&cu+maDgzJYXC|c& z>ws7+(D!&JuyhKMnh4s`GoD2NuI%*`@FIr@bfSUASQ1N0%NozZ0!(@ew{Eur5lCC; z;f@SqeLx5S+%S{6^mX;5%_yK8OMj853233g!sRnB{y+!dwsH`GP=HQdLW?=PGFTu0 zGu6S0V{<14Z$!xg;w5z#FJOZCw$V_mVf`ahLJ;7j3geu_!4%xVyxTZ9U!)f|qj3m- zS~FakidSIWJOW*>CW85-U-K(QxTycfbM% z;V)l+>~?Fic~wH00DE>Olnrv*Z|Ja&6PyErAf zSkTE%n-gF7wb)F6l#Asv-;`4|`$wD~u@^LVyPJD6`{A}YdeK1sP1w09qv^}?Jj{Xt zG-az2NVt#jTW3ne>3`B@+OFKrH*fg?xBbj?Jq@goi5t43ap0|swL=h(em==Lm{G*- z5D@{8aM_wK@Spb|iV&kxD-OS%|0GRLX#K05{IH?!kBQstSjDJY9)9iLtkGyDs*s41#7}ov2 z1B{cq7^(|RBOO>*#Bq+Gz!DT{4)9L|Sg}HkDk#(@ntoh|brlE{tY=-hjymIP=x`~3 zlRM;`Qi!}&h=Ny$Qd)>geTdprhh0?Q& z3!%CTU>S;+6DTZJ(Or=cW}OD9Oor&V+d3IQ<yFNHtwN zR1N(=7YF_P!9$(^$>lc2dOgvfGBG2%U_U<~T0ZfmN1eY7b>l{<0}&_Qg)7NHoTnh^ z63=LodaQ(PleQ&g!c?bH{*F?t@mqPkLF`+46HpJ+dn`QG>d6o%N|fSi>}YC6XF~L_ znXEU~L%SQw#p}600aY@OAyHjOpd1Or;k@Oy5&LNRmped?I9SvJER1F>!!ZJT2_=*S zur(g!jn5%4GBDsvD)B4~_#7Y+!IQ|ToQSecAE5Pg3nmQcq9PQcl*fPS*2IHb_r4 zYDhMjPBx2Te1ZWu(DKl3#;s+9Rn&{`buShxgAeo(I{+)f0>uHK`04?W1#TaX+CifB z6&>w0gPcf+756}F75zO!N01zhjvfVIEbmLAj*0^b*t6JNhaeslGZH07k7|)iv44ax zhM_1BR1eI53Js6tLH(k@`<+o!7}TaBss#zi?S_=3XOuN$luu_|NK3UYd0?j$4?>33 ztb~~_ht^BFf3QT|;0}A&=Vb~gWI zUeJe_);&Itg-lvs2a#c5eaOv{2zd-N%L|gVOZbce4y@gjkRDta(DP`zCpg%91IV&u zZf93`V|{3IdW3+K`(StY*Aj>!fU?0uE;vI4cq4|l?@_(;m63pgPkwjl%a1&$UOY24 z(X1BBSS*&XkJ0{P0NULJo$5?j#3Q!l3OD5nulW>W?-uUJ7213(wAwGU%_zJ8O}YG| z@QzfGi%Q|;jKXV;MRvSJ?!3h|jK%jFi*893dSw)Efi0uS5|yuv+9cwf za{V0OjH28?1`lY|8EO|*rjimsr4gEF@Z=<{S|tXXh>+k0P~5;zLTW$*{egR&BN8ZF z35sGs-CW6-xbgaf&+8I~O#9F7<}UZa*E4VDx;F5j&M$;EMawQrpggBSYg`}+-@&@% zP<8jPrf0V6-@t8m#R$RxoW_<*pe70#qd4D@C(H;N2L!uts?ZW`Hc6hTdzSCun=8h%-Pind7HP2 zR5{3io||UGV>P*WHRRc2>#D(`2MX?0YCbho$r{Y02Uq4pzM0$v1Bi?}_~iAfWAAsa zY45CJY81;{$B_jfJo8U(K(CR0vln61Xus=XH-CX8Nssj#mNh-&Zq7TF1p-U<)qv~^ z4mt1Zyzd40uGR(f)%zOPKh7+TG_DU(tzQD_b95ad2VUH*t&g^8NcL?=$!th#YRH&r z$U0~U<8$zzVcA?@sCXiC)lmDGh$tUu9ES(r0hQhU%&B% z(;fsF6je?yD9GUz`0|nB9Wg#;ew4?#j)k(3*xea&h>v4XUCsUYi$n z=YZ*up#8h|hUrK3ucyG{?!k{#Nu0JMlpl#Zi^SVZ;-4i69Foxd?ZRs9qPFc~gQNvK z0a0;f*XVL_=1%zX-n z&8{@<#I_}o%u=R;8b$)|kSHX)9E4$cgK6;sAn(OZ7x+-B%v0h$$vSn;gqT z^U&<<(8TFbvNOx=T$tYpU=TgbZ{aV01NG&w(vkFZ^UHHXN~N~Hnj|P zGngd&k??J|b+@P;g!z-{Uy>PF+5^`HgVx%2+)J$*Ms8R2P2Y2XuLf|o&{UHFy+Oy@ z8!YaCNu^DWJ&57sLFEk2{f8=QQ59v5q0=Vkfv6UAN4|YLXcP|frZ+SH_{6k z`6axE?TVJ51(~U3!enm3>~#;z(ct&_74K#e~P7_j?&|F1|u8a+9B9pW%L zHj~AO4H}bhAD_HFoOE;MgZRW&Ju&Df5qfhf`e=rDa<*r1>de}d_1&4?m$UtGeNJZ? z@_Z_Ro%nno1`zNuiO58hYb`n1gxz2PQ3-C<7yV5a`ezOqG68z+t1UO1XV+Lz0Y@WD zg9UrbMC2Ol5_)#`<){7o?VT(`Wj61Bo?HMA&!bMFyyc*+(AM}$@NG2e&myc42)4rw zOr3zlMK)a^Jlkt#xPfh1ytvRCH$#;EBuu;W@$A#V%P&%`U$|yJT{-%c!1Cps`q!kB zk8kIK#0XvTcxa7ji+JUH;>CEO)XAv`sGI56q@#I}`GOTXyWeqNqy?5P3(U%}ji)@Z_HI%IbcPb;Z5MJ#+aRd6{?Z`-0q( zxb0H+#nFcXKk~A>>C9*i;@&H(%wK$jd;#Jb*W~NtaU+@UW8Vt)tv>P2vWydM->hZ* zg@B}hga9JB*So)%y`yRR@NqgI*T{t8$~@!3#`2WZ4_jtkV#9GteV$; zh77NqT3e9|n61iQ|Ixa>HovaT|Gn|zcQd1R&*E3amsvG%Ix-&MCpczJ`Ws`cj*s2d zxAS!7u&g@a;N=jV%W@1uW+X=n5Q0Z!9@FB)02a;CXSbGpft0{R`9|F6od1%2;b#Kh z3d)3ayON$0fb|K~B@AqEQT;Y)=V6l+oZ2XkT^Pg?dQ;+fBl7`mtfebbgtcMTm*xjA z-(LdO*UhNgcSe^iG=5j9uWlTB2Olk-D90%l$y74}C?fNfeb%Kq+Mh;j6MJdLgTaX# zzpzY>D_RIj>J!T5qb63ODEt7Rm6D-x53{BV>s2Yl z-8k=HEE6MDf+dkmKZeP^Ok}P@GAMSZx(fo?6s9&gSikow*LF55P;4`u7BvfHX(0*T34VMxJr*Qo1z9hr(tcCG$L$8`Kw6l{AK zi=bYX)rLcN+)0gae(O!A{ugI%b!S;`ed{d;OM|y!KD7kyL%aM5pF7|j!q@zkYad7} zdva32I{m3{al7~F17pC( zri^{5(iaSrzW2IzKKkC9#`S(C+2ItYYD4jy&~yDA!qczdk`OTvAWv#{wIailZx< z9?p7NKy(#+Qg)At?oK1yMyPV-Odg*B173^OM(2cLK51|U4;euWuFz@8eKasc z`ViTovOHt^&AJSe9pnJUMfC3+yGjmw<{2FF62V{HHo(x?O_{ z^sH%l&*uf43TG2VgPGniV%eeMdmJQ<@@H^8<<|H9VOzX=OU?A%6rBtY{Tt31>%8_b zt~#GS6@X{`EqMS|$% zqHNM1Jc8>Gtawkzij2Op%M8InPbq0KULyym@};@R!5U+&(Nz043`E`5vD69caP6~N zVb^u4Sw$CJcNRA$-tR*Gb|Z#v zsjUPa=mJ8}TBra_MChlB0`jw9pj9mH0jDGHIBr68bChMP@3Y`2ueOnUGP@ftM0*D4 z5~MAYGxX4B+#y~iECM)$0V(}ufzS&F_XH35hoAxK!Vv%LBgEb2QB*HLeEZ>1g8bO) zduPeRvRUJ-$DgD5Hz`mf-XJ!`^!#k!PVuJwT_re;A)`WFFmx&w!8h(C8t|CfPc4eI zk?$BLS>zg^-#vdohH(NIlDya`!NB7yN*)hB7vP!j)FTd@w5%sOdnI-YisAK@yal+R zK;d%mNw>AfTF4ur@|L_B9CuBjUAwwc zlGu2iAkcLRhRz6TAO9fvss5hMtHwXm7|f4C!o#q8wo59LngX11EXYfM3DR&L)Sa7i z_qp<)cJ{~%-=Tw6@Ziuec3$G9!nT1vRq--=YD#U0>_8q-{?8b&2E`)lTp3>Q#;`ph zhA7@AvN4sE4%49_{2@Zb>Jr!2&vW%vmhEA&wHQ8?Lg<~x);N9Uv}<4TbPWKnn93<$ zvRukn@mI8(#;@uDAfV)8=J|0vr^q&UXw~La>u8)t%A-mP+w(E3(yPs*GO+qXfrjqzKh^mc z?=uS*^^_DntL@9}bMu^;`E;yMc_a+xm{L?&(DQ73-}2zuh}CS6wM)~|#fLtVGxM3g zJ1xIk9tP~pd>TLUB+{w7Q-e=ro!wLLYUgTo56|cO%o5?%c}jhQPb2Hgi5{=+3-Jaq z4`;s$!o7Q`?;j8D-!0` z#47fub8ViztMmVA>#2HkTEMe$a&Fx!<6!Q$9i`^iOM>@~@4^9#CyAqx5~1(+dkrhfh zJRl-PNqc-Gb{*1h+Bof`xnV;>g_3^ylDG>rmorJcoun^KB>qLsk253zX#2zg2`$<_ z%-1fgqt&n4F6z|YY11wi+D`OsmnhI`%50bFY_DxBv*N%XqWZQrdAvh|vooBjQ&V0i6K!wI-v9PO}09v+Yg`PL)fdx+AB%u9&D;=yY9$ z%3pQrx?XVhdT5umt?G>$-4{t+HWOWS{arV=b*m4$u$}dGoZSxPryX^=*NnSw>*(C^ z&J&`@$H9egrJ-!qA?Y%wz+xq+mJ-7*tAkp6XA3ed_Js~;<{+7LAH9g@T2Hv5) zksdu!1qRfoHN7$NJ+TwLj~095p*;yu!v~ywiG$tG<@;Q9`jV5oUpN^$d-SE+cBds9 zIu-O~NOxy;_F*UbUT$|~ZyVl(_7iHlaz*>C<@@vfx(Y1&uR8S?sdW{H8eLBAFJ@Oeee7$I7yxm`s+*!$KtS>rHZQ1!&$5`8P;2mdYt%tEj=s^8!M?=AYYRy1X zK}Yk1vC`r|t5ZiC)I^?hkR;mCE^i{IGuXM<-sNN>?J?L>(B7MDB2h5d@6A!m zL)1?N#05?>dePx8PQR0TJZ6c zV>roR(^iPC#YtO>2um{TeG5FyLNJRQoJ?l)Z(-`P5Sk_9CdjNTEewlrBv;qTWd1hp zOYBP>zml@-7odT?5rGS#_bY3F-H1T?Sk9}XTrZy6(?jtLIFqz+KYAX|<%nb){IOL; zAO`NS9Kpc?oShj}I&9@T3DYo$^2b4k{x7oLJE*CsZ`(~zC?TPD3_Uar9jT#*rU5CT zhbBcpP?RD<8c9IFfDIKjG{J%fD=I?hSkQo?fS>^zDqtvLEXd(`-t*3U=Q}g|@9Z_1 zowaBEa^2T`zr>%zNNl<7FNFATpgTnLcyf^CN5)33V8ke+cU7GkiJ&MCGcv}Rkwfsz zAxMD`5-xy;i|9oF*3NeL4g&MA3e2|ET?q+LUWaRc-2B8Bk^Ip}!pk^uNghqAg?619e$b{QY?lCR%qOP9Qy2db)g_ky^dALWfckGhabY#XW$)(@j?Oo z@HmThJ23F!>#d1_kG{YU2S{ub|6mmfSVdx%q0>l_UC_~C($TT;&X(6IhsH69Bl+jX zDM-NKp__&e0}pdvpZq}zSRp-Xdwne9siA6M5h3tV97&%VlpaueVeD4J*o5g{=geu+ zF~x{pemE;&607HOc#c_)Y-~0wZ#gk}Y1se#Z8ga`!+;kNJ;KRrKPGivcB(_+$Z^&o z(M0=+H}{&}w3|&v`9&5Us8(Nq-F*l@T=ORI#+&M)je>>O|{oZr<&26=h(Qls~ zcspA1cB-W93v~MHuQa}GN>PATHl4kUBg=>EjAgh03)id(v zZU4Cw@W`yjhOr~RZ@;@f9hrYyD(1wS`t^6`kmL;~GP@+EK3dq@F@5rONkbbngiDr^ z0Z2X*N)HI7UI``t31vPB;jm}1)8o4OaX|qy(SHSsC+{mAjI%7Csqc{6(0r$Qt(%RU zuI-Q1cs3JzF81rfyR{!P=$FoSN8esGi=Qm4)_xW-I2{L#iGQC{tyjcVKR+usP=4+9 zY(c;~)5T#koA3h*vxCt0(zP8MOAlvh3$vD93D}XaqX(iH(cwjTL2*qnw%7Q&7vC2n zH1fqPl>-xub=HCQl2mL3BkBFg3>%|Y31184s?Nc7%mw34gujkvnf-uYRFnsH26`7I zZv1gRy1?`YyvP)Ro9bDq1lay@)&X{~%kHH8HDRGAV6Z)Rh(-A2Kk#rdL-z2iE7q^K zPQ$X#F%RRycGQeue!M)86(0RI2|GcG6z$5#Q~+vVE);kXc31xRXod)!FJf7Y!J{(5 zbxJ;cV8~TGEQu7r^M#>BSXjgud>`Voy(TP@yZP)e{V8w)fmu8kRu=FX{I@gW(3lF6 z;;yxs!(bK9B|A+sHxh*m)(#k<9j@IvLfie!Fns&~e=L(z;-3fSoGi&0V#MXK%$iuo zw&t3f)Rti-o4$2YLZl+c24MYV-5&iyr!b1-IWD!o!JGk~OCF>+WC zrc;qt4467R4(}Mc84wzK;Nw^G9bZ?E%RN#}JT-i?-I_$V-b2?(R(NZ$iy09SJK{WCikJ2jNosij0TAWk5_t|T4?bxTU zG70A&vivlei~EL%BwN%_>0N^`c{DQE#D5@D;Sv>usX zGO^|75@zqDHhiCs^0JQivToQu-Q;Dxz03N!%UIU3QSq|zseLBR%O+j>Isj8$V@sN` zpNsfQhcGJ^wksQ!-YZsNE7r*?Hn}UdtQEUcE8Ck_?CrQE2+i`Pk&z4*1uh*`8Ta)>)w)eVSc5%YK zcM1Dla&zwD55(pkJi0qKEIIFPYW{`Xg0Qqhw*0KYpZ7+89=0VEZ{Zig#WXoFbxRA) zHjnI|_s?Biva^wyE8cLYiP_s4OPj?B9eKZRip!rnRu=C$3g5#)VfgED z9PTx185cdZFkiWaFGlp$-JNXc!=g>R)q0W>eU50;+H2?MtcD_R+`-+{7?;RT0>D-@7 z9%}yk`0n2)*L&_47d~Y@?2IjZ20y%-Q>cMlf2m&B?>#dbw*FOPeJt7OQSSP9?6X&= z)&=hClY{G1jq4jz?;OWJufH=Ko`(M$dayoYTl7fb-}{}8@526l`u^lYZc(?%zq#gr zw;BJwzIOOD_-}#bJ8XD(vCHB4g+h_bgCJ4SGOBp>=YtpCWiP{u?{A&}lppk-+L-_O z=l9VE;=zse*r6|QHUI>dGffd;dKi+*7U^>$?LM}gVbIl-C7pqCHQRmjb4$8I93Ag! z)6`|X$H$Gsw8|B@uU$@BB#&NAT`_o8YoEJ3|7FEcz;$EEnWe2_M;m=lS!8@&H40`{ zfd0-Z|1f@aHRA5Rg|9zMNDW)#m}Yy{Oeb%py}pt0ZOv?|ec$KJp@!|k%h>hB<%MrQ zw+Z>Q+m#jD#kkpxzA|OY%z3f-hoNf2U6p5Fr+s{S#&-YW{I7(W=k?ylwr2dc`ug&6 z*v-s`R^MY@-$;IOE#uJcxi|N7R~8rk*ouTbtk?hKg%(R69-p$@;%JCp{50CU>$*(n z@$3(;?(YA-cy4ax`|RMcZC#^c{L@dbZ|?nGRM#T<{`tlAE@y|3A8S8XzHf7M&e^8= zX$uvqhE*>L(QL=ikp%{2bXi|J?GnX^JZ+|eYmGKbvw(f_;FdBwol+mqFr6}^%j{ij zllx+wa`VS_x)s)wdAgO`zqach^}0Q-%W>V8SI_ZOQ{A-58sF197GVEN?|7i^cKs6} z5&7@;d&Jz+KXpgHCHBsDz>gf>&L~qQsao1+#~kCv5i%}_C`%7A_|NyzOX)H)O^mE(b8O3c1Ccq z;Y@+?mWod@%0 zxc-Wi8&7>54BB2q?D@px!2S<)?EgtCH~I92UR7w%U6A{~<%%lXI(rQyRc&^I{#UN} z|5m5?op{Q(mK3y*u5UUsXa62J*8D8SxmXgpX&4aHZK|dIODi{Q>M1s9<<07p?fG)+ zrR5VAiT&x5ZcyXVEx0c6^vdA>r#dBX)0z3;)CK3R4bXq8Q+PAofB!8-KehWV>=?g) zAYsg;;lI@>Z)@|)|CRBie(P+t|Mb+0;89C5 zkAf_znD4-bb;d)>6bDW@BzI5ct$gY|Wf}Ht_WsYAzTRyc%GaD6R#yzmy$yGqZ!cZ> zI+MF|i*rH2!tBb~ch|c%{w=?eO@3PdaT|O`{gH{NgCp0r21&t`QRHJ{BH2>-lEE0=yg zpSyOc`9k48qZBUVekpQ$m(L7cwp^`kPEw6bp~(`^uBlA~u@Efdfr+C_9J4nzmOE~f z29Z5y@tBUV!kvLMInQm7(=IiixA$nhSvlEq(T0>})L@tLwdLY=Aq9NtUfG$evi6uG z={KKvoi&kr8JcEv+l3Tqe7jf1Y}ec9 zre8ffN>07vf;MNMJWVITsF0f&kj!?|vNSo%rwhGkyZLE)lMkltZd<{g%c;Dr$BVvQ za(PMYMSJG7{{HIDweOw3^*Zy)9s5WgRnJZmXS(%a|I_u9_B<^6%1_8~jxHX|4Re$U_izM1sC(zS>8^&O7D7SqO_ zbguu4eC<*c=ob&tMJ1+up&&ejwd1Q7A(F;BWv(6reR;`;%zmMilwn|+Bv-p^!OqJf zE_AxDOa&rj{D)Q!8|qQ0bfx3U>!gzj?vaE99Pam#Ckh5fwTgU_@zV9^4O{S0Ewv>! z!M|Sa)KH&+{Zc8hyk4PsuJ6!hy0eP!rI(^pqJqB$kGTa@dBsBpTqVN?s=Mbi$)-9_ z$xt(4i3ur$p_3;IcOtlbsz%?Nnc+jC&@AOd4qcUpPj}8cA;XaeZ@HQQGv92mwh9~6 zQ8@zLL4eA~lYP`ajBswMgVgtP2c9Yd%lp5&&RR9mbr3TWVO*NrJ{&|}33S@061CQKo?`i>qg$Z5nXUh)kn7(L0% zX*3P_;^%i}wEEy`lU=k?K!*LU)77_{G0-%k8IM}&OaT%yHk(ZO!56pQzC^6}3RV*a z!-(V-&x%W-chg3XKU=-xzMe+#40P!2|R=dMvJ6(;Je=^>0f2XbVu!+~(kqRHOZra&npxZ+yfqper z2&!N0oXmqR9~PU?bCgyP{rPy=TLM z3?KYnQ2E$31)@c zm~$ycpD!n2&yLjp?Dy_h^#VLerO!+u&>jbIliA;1Vi1KXF{i{ypEpa+>1ER88Ffkr zNWEKyoI6?yCU9H4t41Y|>D@t-up{>%ccelLgt_PHPtT*vSG;(lCZTY0kod$kv@ zV}3cvVliL4?oH|9zVrH(uy`O0O$G*6;CG$!4Y_0=a*6n#r1#^*i^jhmqlnALFFA&^ zc;TM}_FJ61S^Lq%Hveg;*UG7`sh8Fder*iP*6<-h|Igdxe?7~4cJuttj?de#hd?f_zeN~&Za%vG_?S;aUzXQ=yZS45( zmlti8hZ2hnBTtJSK|V{g}=G~sy)-X#RPOT(*u+i6$Ml<9zpKupuru56jQ5g zkS-U492^3{5w245cx{DuVowVzR}h9&ul{b_qe&xVP<2iS$*f^oCsrZ1HS&?2`~k~3 z3|NU&Cnw~28P;$>c>f0V9-_N+(V#iT(M^4UJYXp}3G&sTkKf;f{i5P%Sah$99s<1W z{z$pKp6k)Jh4Vklvo?FAsfe8$Tu@=aBF)&b4(5Q%M|QlXpLx@h1qmb&A7O0wsa@wPsN6uoQVxThhpi0z|Scq2uYFwl?HH;q0|MeX};v z;=#m|J$DLEtHyqM)EvGNf3f4__1a&LV(*Gqxrc|rU0 zhl}qVfjawho}suDjr%k8{MSjZhxQKHzjdvQeJT1SI9ep_fc-D6td`inZK$e{J=Aa` zqOo*CDTrK}VyX?zAT+{H9tP>v045iAGt6;#iIx4Xnx}>U`m{PAdT3To4-eiO=I1Ju zYUCErX2GCC8HYH?a1N+WC>{D5W`c&kplnhgkVP9f4TIQ^L+s-~bkI-%2Wkk2G{#Fv z5I_U~qyaCfJ1(6i0Ko{rC;(Ey3+#h~`0#fY=t4rce!)2CPCO%+2Qmm_7=`@@K(77( z-m46%>WPd_0EecOc<>=we2FtSqedvCmWwduK4FyNwx|X~>Og3t=+Q-K?93bU%IZ_h6>gTbw3sU-l(iy`T*@m`yjgY|d!)s# zO#3!ajTnsU4+>K(FT9h|mzP|*mL!iq#9{?M9WQ?-E|=m1q;M4@L**lR6{9s31_uhNaT`1i7VqSUhTIiMafxt00HlyF*}|8+ z%#(=VgDk&5R~TS4LCTaAQ77DtFhPeY@IZ>pCA35}Plk=AIO80`uwZjrD1i?)I2B{0 z3=ZK!vcef$Yp^Z;)In7^mnV_Nk32AO>gFyR{9xqR*xs`uB?n%j@)ZJbCc8py9wK6Dcv^0@u{{KWaiU*|PU6~TQ8Hnn6VTd?;k$DoC5yHy0$Cm7oZvTpG}1P;UnEqMzKB1ynw z1<12Fi7E~vLIhrEGQuVAYrFyS!!`#K!R{n*+IFZl*|bpCCWC&eU?N@VRr3I-CRz+O z=YXn3k`5arN8MKw> zXd?h)L=t5b&~%^Ut%xgk3a+%DxpM#hm5#|PcYmKj_PfabP)Z#`Ab9}KR{$jp$ea%v z_C5Dfwf046?eL@8A&HW~@K$p{?X!v2x07cxf3{9bw!X{uz3YD`H?QD{ybvh>Y+9su&|G%?G+M$$7SV>bPEbYt;W5W# zWc@6a{MuwpWC6Z1>ty{*AbxATiuM~7y~rB|hi+8Vsif=YZ2)BMWT7P6c;-iBz7cQk z-++2NT-(!SUUX6@?Z*WraKR3EPy55R&2#2upZK&iz6~)M8Jm^S66P9Qs zXIq?#Mx~*>8-D}IT<|mbNFVaaT>Jg*xEMDKgoK0Y;bI&x_X0%5r;ly#)hScKSfAFl z?{~A&;2ks}Mo@SX4nolGFo-cIGZ_NVrZT37k;&RO#<^FU467v>|q*RBnfHK%MUB7QUL#L;om)ywY|D zF9XoaOG#46u0#D2s2KMu*)wizCcO`7tL&>%nHEUlzM;@~eCv%x29hAR!I7{jkS7Hk;T_`}V3^0zRK^j+~ zy#lEYK_-?5dx1la;o(>eIF#5wj*~JWLr>!L?g^n=H#l0~wLw^}J$ZiMAP*$>S<;jQ zapY$AWl4>3VKR5J$0<^euYg;7uvl(P7!i6*-Dg)8Gz5J(Ik1QRh5 zJ?Zd_o1i#>bWttDSO|-Am2MM2tVPyyISwL?=gW@ISEHVs#9p;UxAd8 zuryR3H20*lAXkw6`m9q{t*|Wj+u2URnXa#GU2pOo)xrE`HV_yUtdRjcGLW(tR-n_G zwDZ7ugVyWPwWG!lgOxh+5&$wA=w6n&?86P1%;_o_740$i|LMsv$M2j%E(lRnS!LQx+a7CW69@d?78UD`?wssizlvVShf&_7)4v2``P2pA;unRZ3$saQ5X|~x%?ueO)5N;o@)9_(ItSOM=(@h5% zkkgUi-GiWqP0&JjvtzAbTg;_rH|b98^oO2i9wOsUZu|Q5qXvJbkbiH@v0ZwzV2u`NhV88*XX?IV@(QwPxg;XDSd^+qPd# zH-G(91VrM1(q!OlTd17xl^l6_5A@;8wQu*&jl4g1 zm3^dT{0OKv#Q1g|1(s}Baa}+9!{>XWzMZ2==|E`_eB1mh4Gr04krWvx@tc46WSjI0 zimbIRvI+<5*N4{wWS*iWypggV4-t_7nAiGiWLul&gO?is)Kwfj1pv$7cv7`L{w5+P z@u**%P}flu{k+Pb4dSakA-(VTQX4o_zfh+1tp#hbcaP#&pk}A$SqrejnA-do#t6#Q z0{@RQMjJsjEq<~8yNyefHjf^g`GazG?DLS8ew~FZJpAn@S5r8 z{Fq`i2c0tKLp-=%Bex^X`QYrQwz>zw;CJ9DNQ4sxY)gjB1}u)f53rWX#O%AGW@1$pM3$=Q@v)FKAnZ7b+=J@=$kL+7YqM_2CH z89|roHI&)=wQrbjXMQN@n%@y$Q)?Yj2dqJ)KOFhI+r6@Y(8>3^wzlWpny57RTwd}W z(bs*lvOmcm6GT$lrZ?rN$RP|;)kO9o02YZsq}aoQaHliy-(&(UJ2fn=w3zXUh6u#lqGfP0xGmo>4`vUQ(=~3jT#b2^<(CaK9ldoqe|;!9J{4g zH_&>20PELXP@{O%J1+9~IBJD2J%xW=uKg_tE%A?UaXRMp)+b^qs?41t?HfYNqlWm_0!OZSWKtu-bYxZ;!&3D0y<{~Va)dY?T{yDZE^Bih-oQqkbl#`p z8U*o{)iMkjt+6Bswz$$X7TR4s=6tFx^IA+Tdf~_|c6oZ5Zox^F>LD58_PD-Aq?%<# z;m7XYp>hq&()NzPK7#BW&+I9_Ya;uow#k0!dvUto(U;wGFs}9VOT*X94nM`Gx9iKO zxdWtP(inObZR|rs9<{$NSLqp*3dH{4>@Z#T>Zb(X_g=5HPb5zf3mXRKb!;}$Z<<+n z{G2+Oet7&-M6kKvJG0bsk7|oYzO$zS&dd)h**tl~%q?EG?_Cqk*h1nGl!{bu#6BcZ zBOsrYyAJ*PJN-vF)s+F4_u%m_xD5PLu@!%ReZ?3E*W=+q8-Jd=Z2ap*xhkPQY;%z? zJe~#pYw8#WmGuy0xyw3>MPOOaDIr~Mr$;teF{BSqSB#wEgH+9GFd+54eN~#idS~vp2Yh(t)416#X4p-r_nr z_vu0`e&q87A3p!n1^@M5pD*M;Bh%0OyCbbH6cLjYLkbqRGmaG22gWG||C&h-3H~wS z9k%mN;6UkN(z(wy_+X!pvbl?olB##=}Dw;br`VbuK{9ys3)#`(E>fba7Vl zg*2@?cunB%xSy)dbB_$SZ2jDH_pNuJC$!v!-#s=$T%Y-TA+um&mk#;by-%l;c&Wz} z7|FoFVN2z-Iqg!T8(6t=E46xYj zbB+D6(_WgTr{lMHMK5J;FTPdf$R&jQ4w58XeYd!UeN#9qxnXqI-?(Dy$t=9iwgvGr zP(t1}__EPSxjjafi&*t|u(Sv1$c_4-Gt?W;^xVJL9d4oTj9 z{#>kR@l@b0Zv!#!ll8M2=~H~YS9V~{nui%sNovG+|2fj~;hPLGMDViE%~&X65++Dc;Q8a6aPP~bKYs-e@pOT=P1sE4!# zmW}wJiKv1%Xh1I&E6{h<{RYD(sl8rY$>4uA-rBxRN0VFPps~V%#mboy#j8}Ud4Y#) zuxRVyzA~*5ft$uNKGk>rz1B}sz0@n>wKU-j#0=qSbCL&;B?Op z59+jNAI+P~)~MooIrqs*J$i-GuRGC%-?7h# z{1*e?UZxEXMbyiFnS(k0gYt?gy-HArA&1LLIHtL@2I2wJmJ-+^ZIGz?gm7HKWM5Tz z9|i8+-lO2VAFPUvliZFE&u-CW7!&IxoHp=JeR8;9oq3@Ii3lR6=_=?vA5gW22$s54ZQuJc;DG5&IDwmWB+iZ|5mhCfK*|Euw~`A@qrbcs8-X==6n88- z0A-a!Qz2c0+bDKR+>lcn87Cu5@KjV{mg*f+=DvGvQ&BmOY4=1zh=q!jkNqG`rk}g@ z{R=@61ykz4*m}@->9o(=d)n;Z#cU=ceVQJ@PG#0}Q@_2lD}2p#?r#UHD!V&WM|YS0b&u za1gqUiNu-e1ZvmzD)BjnB!fQ9B2cgtisrV|Lu4L(9IUI<=1_F2L0x!5p=q}mg{dyn znm}|bAIyfSWVx#VpN!pk>xXWdx0`a5ImT ze`rD`U$h+G`;ugyfQK4mfM=|-sOaNdx|UuY+=Dcc?A1dz^skeEo^wUA`6suiP|xhb zLfP@=F;-vTcYT|`p4E<4PcW zV{`2=rG)|WmlRMuy$^c)4#PmWcGoqTJ#Hm5^vFj;!m%_cmPE&OVAP})XM~-ALCdc= zhHvbB)v_#CbRiWXD3ykr0Br4Bd1aeY4-K!sv~Bl+GAVh$D}OtTQ}To$JuwC9k=3o0 zei~_AOMyovb?;&G5R<>g4pN6T58YmcgNR&UpTnlVR4V+@o#+Da<9W*XBIar4$(vIv zregdd5UTV$*Z^x*O1#oJ)`Rs@VaLuUm^7#jzw&B#lFR&=+xRy0?K1JV85Ao5M(S~5 z{gjvbabu||aA&sVfxIQ73ZBKTNdhnr zVxZ9xH%m8lA!2ZP)=kT9mH1JF7MErOQ0*KCYL8#kAb^hA^*rNJbs>fZ<3PPR1ML)$ z@(@sSsKV`v)c*KdEut+}R1yvVIg{ab1bVg|Sb@;HVLA>n!Z6YWATvB@zp+&4m9rXl zR4WS8Gz;ikQ(}gvcTE7bI5hKdnjVIxC#D*3XiNd9g65$x1k^#4V``WV7@CHPgqoPm zN~6XNfv>C3yr*c_>Lk=u9=;F*;iI5y1R6>}CzELRw@YiL0At%BvJ{$)0A#KQ-I@Y( zBmlSN0b|-BTUFrpB=DYgx-_CB1rKt@>dF$p#dMmBUB8(Sp)tPM1Lqkb2IvZa>NOSK z8hv^yv``HX4LhJy9@8|18dw8W-~e|Wrx~5okaHZ1--1k$Rn9h(qFm_TcVXh`xqNW=7gpX7&5jSY8Snah z%w3O6LlC+)pbfl;Dkbe8mMMY0uFf)L_v#N(>olhd(i6QQ`lj_mV0jlCEjM_n_ zc$y}eYS<1^YPH<-#TvJOO!+heE->vfEm016M%Z%#N81)`d)k2^0RU#=7*;JzOP*H> zt{puNP9}pC$h79X%FqNL1_2Gi8@shIBXKM;nWl;W$B=7wkU_bTB?;}&jl_0{BAcGc zVWx5E69S-u0GuoYUX?@c%rW%u04w8YDm+j)xh9MNG5~;_2(VPFj>9=vDvycv1 z_8$XY#L*PV^b|5kS4iE$0o#tl!YI_;TsjdAH&KB(VjvM7x)CDEX-g_b2n`sbgm9s< zL%=I#pgk0@7KNJFPS4MQ%Auw8?5H>nG?fHP@&ghmFOn&AlaD1kg!J?wnyQ`G9xQV& zr(K%@+TOy*1`uNHAd(bnCLV$zm87XK37#*#$;@~zPagq}onx498oY2oOCHP{58g%w zs`KxjcYxUq0o-s*eeRf_9ku3#r))d$U@L4RlEBd%`+QQv6A@+(w1xQdqfpb#CGEeF_(C z&7F%l}J>4Zt~O z1YX2*&aVj|+z4&D^c1c}DhXFq#8>tq-)~d0E$5CkQWN`OLj|hJ4@P@(}2tHS@Lgkh~pGDhrf?XCPIAKAT^Gzi#q?sXJRNqtDTO%$e5_ZUvo$bAcB%rL@^tW1T4sHyq6;y z;h=eWPs=+6bgcia6E(R2=-US@Hy@UpEW~K8L<{mTzMcB^SS(G%I`-_Tq&-4VTjyT| z`$1B4B~dl2S*FKMnQ2EC;9$}uXaN`6U{Dfy4xYhg=?emq$P{5BFC9HSn+VR$Dv4Z& z2MH-5d}fw56wQGLwNv!sS+NwjgBySIX(WnuGlp3CBuFgox!!M>lReCb0^eT>$>j30 zF2R)PP@^BC$EAqi;e#a&uh4kLoH$2torCjeUv z$jFoF=^|QiFI5{yRp3B8MSvYG3~~#Eh=wT&OTx3j*+`f?0la&zB$84e)dAU5IBJl4 z(su5z#81fxIZ$U9|hON#d3k zs~|kkEDRz~fSmnnKeaSY3}*;a0Z8n`e75O+=g(kO-;bBhKS@iL@NvjpJAbPo{A^S5 zsD&BdeapEq-}4K}TcAf}cM33SLM#hh3=JC$9e{k~zIaPL^` z94iygTs{ll&Q2jtxP05A=PjVrOwcF$z+wq{F1JJi1H|D$<7N!Gc6c&+`kpg*tIAH# ztg7$?xI6noxcsRNeICH31!ik!PDU_%+D|5Ri+#o!zFgKp3iR<`-XQ=hcqmWpi8&;F zvoWzGFOQ)gnO`uZ*uSVJR$-W{GO+KD7ZK7$(XN8CO?yZ%L_bWyFIMUyadSr`)Ijbi zUM#=#Zu?o9${e+&h5Bj@sGJ8fp1Y`h6{y8qFkk~GIy00-8Om8#X8r{}rtbD&Zz(DR zr`XX^LXeaJNM20#GzE>}B>J{fA3O)uj4vu;#~disR4m_xLuY&JRS*EpeMk9wVP-1v zo;5Ak+Q0venRO&n^@J3|pA=#ZR61p>NDZWv0t_dVxCp`7M7k+jlP>wj>AOwWhK#i`2$chp2lx#Cw2(q1GKEHxOgxZsURv<*Q0UOgM zo4_n}nh52QW$6&@Bvm)ypOs{pGy073(+Hh!auQ0eh0$*2;2~^~=4oxYDunvYnkSs~ zul}JPyz5ee?W#e?fo3-lWy;=p!vE09 zNFBc-0hwBYvPxldMP%yxN5|YFGs*u;D=+;1@fGT7mOl66yOvAw{R4NuE&RFbn7;20 z_rCX{?ed4AChc!)f6gs`+<)g*sxJKLNy5WA@4dO#NwT3EMH|OQqtBaVZS4E@&v36? zjmw>a05{9#NSDJ8)~Ejsw7zrxY3g2X16;FwZqb$E{@iIyp#kYQxeBhd`FV?8;rIt) zIODWz*Mf9eF5Fd4Tb9-Z}JF4(nDdXPr+SblSH*qs4|iwirpk7UG&;|lwV*$5dD#tB6qim#2K2b z)fA-{>Ggq2m#h=SSIg=VJc@f9vqv?>D#PRsxOs1Zg&hKk*e_? zDsf~KpDt@ZMf8v{E8o+1wLI~Czw)bFef_p&|U) zTy8Hq$*$g0r4xU4z=>&BhceS{G~c1MN9+eu*hu4W;Z{n`O97hrzis_;_<8f4IRC5U zZDvLUZK%8!>Bd&{0Up2Kj(v+)w$MFmF^KxGsUyPQVkA+12YLL}i=EPWUdIDt^piqDTEh;E?Fvu*sJIYap|7-PT6^0e zBJt9X2NIc&LSDmjMnXE4@{EouXKell^LIr-gIN<-Zseu9)|m8N1*}9chaHUEEOk{- zDmPF|{T*R(=|AYdj$I}YrS-U2qpujB~e6MXE z>fAMb-zzu12spuyJK|t8=$~u>IZFY`fU7U5)6gEanDGH8&-$G~oNh_EB#5rGt3(JN zq;yThQ1hSJ6sC5|A1Bf^^r(^nd{>!$S#-mw8OgFnpezGpq^uAJv*c1yS%4PhA&{&g z7busI3+3cHvYLRA? z*cew-4jyDH0%;5qd*x_+sQ@+^F*piDuC;*m{!$PoS#+B-RD?31ZgaxM)QzHm)%xnT zzxDub;b=>TIJzTcQa{_5cQceo@k$&Mkfc4cVsBrMl!2J`iH4Krv`|pfJf=Y?nvN6E zG}b++vYWhWdV3Jk)~;LaQyp7n4iNSgV`PIKF(yRalD}L|x8YSu>h;}#l?zIw*c|%7 zcyrY=Ljb*q?J}Nvba5v!nX2!`RN(xJlAym3!5owKUwgK#(LYLn38Qcg^Zy$nN% z5JkX7{RsiFPlARnODm+QlwrEH_#+h=j;7EnXr|RbAWK_B*>4^<;GeedSnWI`2Y;GR zEUSOez`u55NA`5E=@G@&EG6RYKk1A7eaGJf+{yKfd-C0xOuGZwn|ILX?eemly7W|u z%^gMQxXZ~-{VKZ;9alvr`db2@TqWBnVEAAxg(^=0N~`2a|Mqy_`6cLQ;d}x=-4ySF zS%gs*Io^B!es-}*<8*YHS36cR^uV29^&`9?4by#9E|gij$4kP3&fq4q%-NU*YVJp(ZW)m6en}ccxK{qOo4Av;Ok#NF-kR;0H7?6Lm zy%BidIPQhUQwqXKfR!D;3f3H=n0SbmB^&)2&JXYnh8(KIE27kqFBrICo?qnsdnrn_ zTWxF1FsYsy~FGCu|cm_*!mOaLXPjFYmse?!zA*Pw@Xb^_A^k9A9T0n8~?cLt+#oO}Rz5@4i--(Jhox^ep$4iftoQ2YI{D=!i4qk+Bxvli_(+zWUdr$|LuwOFC} zk48yqb+3E}sIpg)pYz8~!(CG7$|Rvr@H+Qc>s=?gYP6|_ba?g1#*Z^4A#`(LIcyl# zqwxV#{A;f^Y(+YGHQ@Gq#7%X$564NCTh^8r-Zi6T{6kJb&}}q~Cn&ngVW_gEZ=`Q& zp`PNAdQ_3-h52E;T(FwVsw%is3Z@my)r_#yJYuIxJ@yN5GmcxWPnCWu&-+2SgaO_f zrl2;BUbg_-+CdU?d@V&uIcZm8C$22u4OoZTBHp+lXB@{9QS82u4NEsqrf=$&j<>Xj zHE zi(IHirRVn=rLeseE`aDGEg?03AE;B)6K&2J{ z#14?jo3n8~2u;~%4SSufIo=wdMj8O=MUS+i4u(fhEWiQN=knSDC#mOw)0+9Wr?Vjm z4&$%SuEGj9^tbDpCn&PQ0IgDM6?vocrL8I|*(#sH8!UG>*ciwb&rdU56Xe$2ZBt_Q z&DCrLaWqQap0}bMMY=A`XrU-_x~ZxLB^yC2aijJ9cp2fS;g7SnB^VU0dv{*-l4iuY z*2fR*$QO*_us#;uouD9FFx5%no8RmC8O(XtaM^Ld%_LvFVSbyK zkM4-zJ;h6>yZ#-f`pdvkBEC#s?18+7AG$NV>P*P5h* z!zG_mL74*`9jf1#`0(>()dwO`q_fA2!Y_ZI+}4ac7NB<-pdRrX0M;_#h0GW(#mJ~p zQGY4wAAp2k{Id`HEb=PjOLio*ZPXDv>Qc6QJkCC;G4O2H_>9KMi;oxTo=Cj8)qk+*leydw_!2&xnH8T zxrERvxg|}xCFGt;bvE}~jY_UHLP#}2=(f3(q>>~`HC?2>U3AygZ@>TcIQ#GO+1{V? zdB0z;=WF4>_tQl73$=*#uV-FA{<$q}G1x(T>SWSH-P}|4wo&;%V%2v@VOp|0EK}!9 zw3W=f_gk^Hp5 zS4d34SNZW=oM-C)o-Ef3QDm}_s8*sF!e+fWZjCrH3=!NPo7azS90jgj!4sd$8{8qt zsZ&6|aotpF_k$gEPl46XjZgN!srznx@}IEj!-Lh!11(S<(fsnN89k99>o_?CslZmo*e+srCG9^gH z!^!>68R4gQ)y4c~O7?DJA^!kK=**6xhMi;jGsCCNH?&;3YP$cqk@eSQn9InBD+zmb z{>;@6rq{lox%SUgf@+r#&7^AWQYGx+#R8>nH%qf@r-~Pcq&uAigU-LE>ydM~;j zm?w|-GM{-qp>xdqQM37p6Xq6M;+h-kV?HBd54?>{@z`;qIXYpuHP551*(8KpgQ@h8 zokPw&pEu~4x;;0W_*v^^+M}Qa&8R|;_ykF~!kM3rJ9jv0!?Pq>@0MANRT5+*w6G1p zxdRUp&O~-KTpWEqQL3-9#MaU;zt%%$_^dMt3NgLpBsx$yc>p43YIS$S zwP4SkaXzf0h)Q%)?A?|aWd^*SfW}L=pF?NhjmDweiVL6uc@Nxn|nKwNi`S}cnc4>wK%EXM{&i&6&}s5vIU1#|RxEQLP+ zEjVs}mAiipnz@Q!CaXS2-+4{e>t@E*p*;eZxY;~h>{%K0`Xy1G+O#kET zr?n31N@3K^@=|JdTt(v1zKt42KbL5se{Ozw%M$B+H7k1DGv-g*mlC^I8-VDpxtL%U zR|ORbe!j4ZWw22~S&+mO=%XMODv6~$&N8lU`0k=jUt_(Kq1|b6eVmZdf7Qt73yQJY zK5|V@i8d)ZmHB;@ zhn=d9_f?&Asy^LUecq|&VqeWQr`j8RwRfHB9`339;dR&pM$VEt*0NERYngDEsqKL7 z2>W{oNT<75MDo!i93wLj&E+sFSsF<&xz1V})1^5pu#JT!Z+6oW0}8%_&dCXW_FKsq zw(BX0a+k9zz33NgMpf%%`qqnt97%XBP^c(f*>U~Jx9f|M`Ke24Ihm;uH*i@JY=L6Y$t5+!p0oPTKVAML_CNR8AZkCgXJI^lPdF^udD2tvOUjgL}%j=1G*T_3Lty+Z3!-(rD7Y9^n%}VCR=Y3c*vO{O+sy^ppsl3 z+&Z1wz|tUR7AYcDAPri>A4znWgErHk*NUZjM`OiIR_1w@BQiDfHH#1sLQ=V;&={q} znCXCa8}ZP(a=YT!RkePR_(_iTB;Q?rvk%rIOtQ>Yu=kt7@U@NoG1tC7w!O6R)4FTF z;i5xo*;Bb6&D*Spw13oxh@qug$EA4owPJ}H;?M7m-HV8IJIRUzx0XswU0A^+M=lMC zQ&XV2d)2euP>LG1@uWGnN3pt9^w=~2FGV6SW+da!(mZ7~9oxy?@+gl&%ZTeojlbw! zFR)t37eXBZTYl@UjHb9i@Dyj`0%;w*6urn(kTbvsl zA?b5kY&AH8!^$Rhc`j9-2fa!Sg5pT^Wv9H#^jzb=(qNwcn&wuqUnN#2@`(n%0WK3N zu$xLWp-Q1+J^W^oV{hdU#d-*HSj)XcJ}ui~I|7vZ2QnL0KTY$JmajF#2$WX_GY0Z0 z1q^*OJyQlLdvHX2lz!Ud+e6Cheb*1GhQ!|+R*xuIe_dnC=&*%QA=*k*nCq+OA+DWeIL7 z3LWqJ(N`60%yIN9xPQmdLGmTr#bG4%?kbQFFwXuxDS^3RCm;cqQb!Z4(M#~&P{N4A z$dz?~F(fo|1pSXuD^*Uf_cm8;Mys*D@oRh@6dIi@(HcFO9((q|)aK;dn;vf2^ZvoZ zt$Wg62Sz+hUK6~%*fnq_vdUv>ChBB@+M^v!XYC*DY#p9@6yNt`>haEE!jItOLFCkI zYI6GN8gFr7Ba_}PY*seyN{+_rxEDOHw35Y1Xh-p5;QkH95 zaSuxu#-bdi{fOH{IVJ&fxD}`P#I#K03R(neWhP9m4azlE03#j$<0}@?v<>JW+C#)9 zU(e3gqw`S_B$R1D2i`oGuiVV_ur$mRjM#!M9;qNLoUN@Tln`oTk=mn!a9Sis`9u*L z2dgg%nDyK#_mOIIg$VUtsai8{*~7GJJX?=)sQg&h%N1aLuh#pPHLGzG!Xg!wo93%zDtbBAJTUjJ^Sswl&8c>KX;_=ecJ1l za~kXRT)m(Lk34>fs)wYG$@MF=91F>Ic{CCaZb}na{7w_RsRZD9B&h;m>#dW+gPTb} zw=X#`-9^zlT}M7)V`Lq5Qi2?ryX&=umaTtu4T_QiD#r10^kwno4w?fB(UNSDYqEpm zFn?jM23)PZ@VGuTu5fwpC|!S6h-`ybm&Wda>Ce*kvg+7GkqJzN!bjOtj?}S=ygLpZ zYd<#G_?+_k=8fFXUf%jmuecfyjaxUYHRHW9UHQYuu#lC0W@DY@->={!FmRpZ>-`Tv zE=XVmcEDyJq|WbPcdPrbLn+M;rE6}#?0acw=N)cq^|(Aqo+SSCzne}`uMY1ySJ8bo z{r%1e&CP!w9D#Cf#^9D%C7UNpk+zE?ZU6+o<=@0%MYq@G`b>eMg@ZdjeM~)!=ByFYerqWR7al%ifY*v zaPpkw^rN#MYnJgMjio@ht4~VPBa3XFj-@#|J$bXY?9s+rV&%9!w~PQpE0KRaPp~jFW(@Fs~xOhc13qaZ(iT8l+w_c^vbtzE+D#c z@FadqB}?nM)AEB(|10O76#h8+eBfWxKS?ygR{77jC|?|Iv4^F7Z2o%j`MEQ3!o_-D`kQgD(qFJAO*m{w{o`)E{E-kZ%vlaqM?3%LCs=rwO>bPtpSz-f-^TM` zw9d$^3gq$;AzYiL?PIgxcW^(~t!~ZkiKEvq3eso|b$VcNpOnwlJuqMWOV)=wxfFN( zNP58Ig=N&_CvfJB<4rwz&zf~ast_rIskj)UY{tRD<}=w^B8hX%HMRn3PS)kw`yio- zTBW!aHlit9PTE z(ay(rFo%tm{uI}a{+RvVb5T!;T&6Vy^H4k4U$49W&ANl#>#m9L?`1ajc`po(pzMT zS{6a-^LnZkqS!3ahjIY!C&TB+#k&x=$6#-}1vUjj$Mf*q*H;dRuni2iOgCIh@v|K9 zzpO!w_)yHKTr2`2d)B@b;E~Ton$voUAEK>F_+V-_CNu_L&MPih$P>!YVWulMtYY7nIS_ju{5tsiE$EOj|_cOj8cR}dP`ar^P`1xT45AL?H%55c`P)z3D^Gl7!)pY$8hb;HS zcBplm8SAmFA2s`qW*}lA)Zsc%!99rcF2^$+a>DDVm5U)LLTWT=l^}L%t0lx^o&ohY7l9B z;31)Mv`D4~yN^ErAiuM8HZ0g}W5FSo8V-cJORzF&IFF`5nnUP(k_IN6H7rrG+4aTc z{1@AI=Uf!h{MU&ycR1`$aPUZ;_9`0=ZXb@btns%}4YA6MYyXjR-pS#XQ~ejGru$A2 z9ZN~chO`E~%uij{->VmXS}C=0c~JTU$2h68PHT5F<|qqWO`G4#!sPH=YiQU+7Uobv z)bxTwa5Vay33|9p%a4u@rePefBOnp6l7@pR!4DXs-2wPl8r4^V2xg((KU@Ud(OxXY zLlM{j*-2PEd6I_eGE~r)l9#I?CZ9zdr@2319Y#ecy`?$ON3qo)v0?lBUL2Zbt(bNS z6DCqHlwa{hXh#GFHs_u?h@(a*X+$;px9%T`tAvXcw>j2eL>bHjh-kNM;^if{}Jta~aGG3)@ zUPSyFt1!XS>Xf0~AyVXqReMbp=%CgHHtDhi+dHSZC^7qwhYU>p99()E(*{*TI3=O=c~bKka{ zx$k^FHK0JD`@}kzZ|PfqKIks7IvEL}k7i>sMQDgoIJ>awa0@n*g*_p{waBp3vC$`F z^8CEGHZP|z8E3Z}+MgGAmzBnpAgIcUm22u9lN1~Dup@~leGzv9gz6*^82~A@fhw7L znwKHOn1t%fR~Ja}Tp6-uPQwsXl?O4H)KgcnsclU37Kl_5ffOycw`ZeSN@e8``YKJs zhpkqkgcQ(Ja^{p*#qQk8R>_-F?SxRg6rVMb{nTzuT#_avRqLNqvWE!EopTC~EE{W@ z3NJ#*hfkCxD0cGEu_7KHAZ5;JveDZKYS zjoQ; zM$i49BWJf7_X^CH4vyS^0<+iHDRM4&foYcIb9vE1dHri)Ve?o>@p{dC2Am}o_rPyQn#IhlXhd7GW4P+ zu7U?rzu4QWsJBeM%>+=@Qeqwt+5CfOCNVUp5f16$H$WtJ1C^^0$~saiNe@B#flAB9 zR7zk|Gzvo&)2vh=WvgdGm^j)cRvsn=f+vFP3K24qy?x$8Z4p3*(lkCukU|N9S(r`;}R-^ zrfF)?rcr@zV_}7-Fhf>o?rr(@SjnBk)1YEFPt#sXK!AY{5Xn_6)LvOZeQX;GPEG`{ ztB$I@6;hT-AZn_fT2W7#WRra*xrokHQvkIb!Zb*zmuW1@oN6U2W-7S3a|&50fwu=| zo3YhV8`J|Kry>z*fTdO$K}BqIYqDhnbm8N`y(dAUeSiiNA{?4i*Z`4B=F+3AZ3O%y z7xZG=voQgXqO%INTplJor#deqpNMczhtNrd&&nawD=Ga>5y}*{)+|7M)N}j`t=E?o zcbo>N=&8r?RG~RVpq}!bN*& zFbACp)Ljs*!mzdeu}J?U_)HoWP*S{ZWkBd7;n{Xh_@ zL%-f02)a82-K^Jj-u>@57v{)i{Q5rr4ch7Z$ff_rMZZS&uN7@EjkgL{?qAkPQuoZxH8=Cnn#xBeO( zkkm6i9g`r# z6I;Npd-B}2t8*k<0MQI8s;DS3pznz+^t;R`8@g$SDRvu;kf$DZDFqu&quFVb3jp}z zL0n`+bUJ_>SW<{})4I%)&-N2(3C}W5p)p+~Im9afQjgX{EW7YjV)YOhY4|Ex-}?Y^ z9)#EWg79Mb9GAiWSYcqF6MZFwL?PlkOT(5%I1zE#n6Ji!lu9Blo9a>QAuB^$go+Qc z!VwWDK_04uF*VuIS9;svt{kaNtT8c@t!~0s6|i;L@O3*_=2edHw{|e$^x%)Jqz7qn~&aQzHbe@u?QJ|h173i ze}_kS89?>|)>QCMK5!Va+BFz`VaWCHV50f3YIXg!?&%`)Fau{U1@Clk(~pVt8+&GN z@WCaMSP7hy|15K zTn;`u<3Ei|Vnp{Gc3m%VETFX=Z$a;+X$~GjnoLDx8_3@^TYqOw=n64M)u{huFd zNz~zbBJnRwH<#KzSU4JTEW!KeuH7!}))jP*DxWVV)s-P%6e)%l?Mu$?+X|G^bG7c? zdch&tN4Fo>`~9F;wZ(&X;M1iacTbAs0>t@hH!5t zJ%X-JLO=c|j<5K|&PcfUmc6jybe^~Ob-yfG* z5RB->h$r!$V-I@0 z@OO|wm^;PyZ6!dFN<28~Jl|_`6K4_%^3S6*mBNaRh$H`3VHF=pT-5Bsy6s z?eKT9O8i-WOvVeLAJ?cB@Zk6$)LC7O$eqtd6n6vc%svyJW&1`=F|v@ z%lv%Ha=5E}c~}u_zgI}KS7F01I8r(|)R|0v8_{~GeniRKos*9-_F6k;7~W1|(bsCQ z-4p@?%FnACB7h^9SJa516JE@BgCv*WNKkQ}Xd%U4MI+$LJ^oZN-|2n<&dhSUx5KO7X;Rdc48c$h5NKhvkT4=W>n$ z*B7=%a%QkB%{*MOGj!+qVf)Pq7m=dPz?HvhK$_W5lAD4xX_w3A8|v4xK93pbx_zBk zcfL0H7TaOV_W|#V`;%ri$H11J7nA;F$m*VL0cJrXgY**dXZD8w zkB+Xe zEWG)DY2i%8g&c3G0OP^+Y4s=*tpP%! zI2-WQ16-J}3l*CXTH_*&p#(s=FOCvop=|p`HgPiO9B_1Jh$E&M7vr6iR|O?FFR_4( zaq`bt8?@Du1e*qB2g|MJ_ibVLfXW=I+1lJGtVFs^CO6cJTo{W@*ycik)|h0wCU>i8 zh`ciud;{qqSI3U^nK}&V<3YKp`jP#GHx#{P^z9*NrL;#t;z^KJ<9v)`FNl|GTS2b@ zwi_)QIC=vHlK58lazPE64f@q2G*C{0sjKKA7|a1u5-Iz0tt?NM73+8=RF|A{1gS?8 zU;`y(#n&YmdoML*TNY>&nT>VAu=jMGf~(2r+qRDZLMG{cWn4OvP?~bEy24mZ7AV=Z`h;EkPLm;WZbjkZ*^gPv_9+ffN*jNX$F2&yVb+9m8fbT2p2@0k`+le za6+eMq%5EKFYI;H6W-0C30q>h0@HJKdxOH-&cWJvUtO=g>sAwhy3)QkuByMn?4kxk z)5UP^)+1xdcTyV<%3f{USJjU9`-+S%Wxhi70pU8v8`vkOi0`) zeyrR~>&5=qpR}ItGIx^ec-5mmsbHVr*`M(G!QZ!caWi2mOH)fYhr|Kli+wNkEuC(z zOZ=RDIIG`m*Uz-o;2b7i*!O75ob6|?L#UTYxy#4Q39m2BC~mgb{c&4q@1{z{)RzxC ze?KvEbzHvlc^fG+w;!2wDj*YI_spS-0VHcWn8FZel5}OU4K$(Yqr`V^T^}odnOB5A z@4dDEgM2@5ZaZdn8r~ls_`9MmUASHRZQ_RM&@nrQwXgMU#>Pw=LD{BC-(n^H=w4zh zF_N^l;HLzY)&n-3-7^-P7yi{PHrRhXEt}rLM0o*&xGjefKAY3-ls;8{efXxItL1?& z7qjE*aBzLc@o_~JR2N85%NlM8sfqf=lnF9PwQv5ZZy?P;=jmdFipum?o z>oB?N8Mzz1ayP~1Zj9mo5NDX!rvBU>YIiZ@47dN0{uD-p z7lfbnASU#37Dj>_tLV_S-HaZN(=qtsYk1r4DAUNO)ji80HndDr zp?8F}5VSGH<`*`qc)ICnRN)pX~TwQw3F z^uiWS?CGu8j5O1({P$33JR@|3nf7~4)hq?*kxN>}@zo& z%EKw)d~Ar48bG0?d2ury_l8J4)65!cOuL97h#CuYt<<=7(7RSGk6=6>=^;0ja}obX zesWQ9vdlBRA=Zm>dLX(rHYDws3CKjxv~o5uQ6O-_a~%HM37y83bI{_ib?s0vK={xQ zLz8fC5!?qdab>}+#qiG|druA3I*7OqD%&6BFYmK9M1lZng9QG%6S4&@%^jiXYS zsMvADY8C?J4Nri}@fFH$%)lG&@bd^{f(YfgxV}{_#*+zujzxttqiZ(B-bU`<8(3S> zy?=MbDbvX45W^B_RcU8I{Eyf1D>OovZ|LHuPWioUT!(AoIztqL21;sUm6g6#b zYuYl}v=w*shbYBVrE0>idG{Nm@n+666xIOc)^tbLuZXzY%rRQrP!W}XEh<^m9hz|PB?_ff!1)YkJ|?8)P44BJ zHRsTwY0g`-`$PJ$%c0i_!=*hOe@%e<8~s7l`T^Q8A>3L$+GTpHCjlRNQpKkbKo-l8 zH5u?gA-0DE#53_*yJHk2ps9)tC_#cr7!!AxX#m_oMJ@_O`-?d3ZJgCiR5%aJ5eHs< zdBVRN?k9mieF;Z}Fl_jg!4?4V&gn^z=UKE+v!3qAR!=l88^fB(C7H$73$49uvhGClq%jT31cFPe4#@?peMy$arkr)Q>rljFqg1=g1V2c_B69 z8*5hdnYd%GlYm+vlmQLd-Lx=KDdt><`7;%&7Xwn&4kz0qtXYVaT;w(y?3_M=vxwLT z!8XxOp80Gt;fQ#;+s#F`eI##R#2B0=!4`>Oqu>4QqT|j`=>tWAO^?VfytJ_=_|mO!vyH4p zdG85%LyWBFVN8aSQ)GJ`0c4^OTVaPMti|+-5nK_cW*lYr4IT)D?io+VGzVBp@E3sX zgE1Dzjrw=nolP+7cS*W_ZsPi7+tQI9Uxh&g;YgY1bwt1^j1e<>;W_FobjE2M9*~V0 ze+A69o_;~tZVSk7&i+GIi z@U(Vq7J!E&J3RE7c}lxd{86^UFT;#^J&0ZBNKhr*@ju$dpQD?+sJ(&M+|+YN=N zyKO! zTKifFzMh1)ek77dBCHg`4qk>oFtzbYf^%NLtw_s=o+R{2rYu7|;vs>__CIKBKOyqy zSlHRYd(ya#&=l#qCED+nTwT@jeopt_R7%~Lbd0^386I2=BcxyWW7`+7qvvAD`j5iq ziWSJaQ)%^4r?+3Uf4BRERQcY9;+R#py0YJ2n0|Kw>q+dxo`_xw$<%fy*uba7dCxLm zf{QOIRIyJx(@JS$Yv1|$UhSb-%$vM4F49C@7U55FvG;@sFEIj4Qkc1DZ#wz7Aqrt4 zLN@}iZXvov9Vh@o<4ABbF6y8V5%C~Po~Uh|gb0vJMUvq4EBg&ykrpzOKYNfqT=*GB zguSFzD>=wTi1>Os##W5bqFpV$1&g39+a;+2bneK`DbXq#^6@@5$r&)@EYnkr^kNkU zq+-=b$j(%lW6~vW)(!_AOiO~@4S^p09P+tQWn!D!zebA17OF+qj@xtFKfHhT@0z|& z&$yj_OJR3(mtt-~WyCE-()6o4-HN&{ydOvowUhHkCv@kJ51{bF5%bXKGhNm1Ie@1p zcPGd5&dY|rjJ}`5+|0B^QTHEV0jT&v^;(E%0^?0WOv)74GU9bH%$-y`(}NliaXjY0 ziYD@*8*6WnfL3T%6A8F4`|O{jD1n&AqYy@7RG*kU!MJq$4Qvf0FVcvOB7_AEAssOJ zce}m86crv_V*7266R>Qb9-rkRgxfMv5Lcmf5v}|J&s&X=Uvyk#h#?Wmue->YCofv? z-BHLkA*P&WXPX4$jt_r~L?m+Y0tvQ`^g~~Ux-C{2o&2`d5}n|W@GyBF?)RSZ-~LlY z@9#Ceztc4J^NfMo-Jf;3P0tU^jBQ#mu!%U(L~woD*kl>jVj0?gjnnolEZc{tsd8HV z-Or1PwNXzq6Ga#;Vg8Rvc)$TzAg^WG@Qbg|@2V!6c@id51FXc(+ly=?WS9*0KC3{4 zs|eB0K@JFR#JeEdcOtB5h>c7nN3!E#qGcW{)xCX`Fjkgsx`vckcmRgD-d!N5ZFX9p)|O_6mO)x(D# zIYJVENn<4;_YK*)VAjjVJ@;R)6WQ-ZtqA@4TA|Uim{?l%B~R3FZHfFfX0moedq{WU zt49z13lc{RA42xi409`&J1YzxPbF+lO@7f?7pM$p^u%v}yZ`aSk6R@?O=Lk%WPYKl z_bT5>vfCO!K|e!0Ez*;B<*n>0E9(cZleAo5W_Kb624dBnwvmRQ0Z+2NcVK~#zy0)K z{l4^(mh}ce;Zv8i-j+H2JhFbA3T^N(AQwvpX_l{u3x8(Q=T~^hOCvQjX{un#XW@)>RfLMLN>?2$!bEHI6wfFNI zc3oxpqGdDe47OF{>S*ggb*%t*rY*jISFSQ_A-e92ZQ3Uf%J!r8JT723#k6km^PQeL z&*I9eDudr8d+8VdF)mL;85HF6V?|)$ShLMGpT{uDf=gb8xD!Jyl7p!XP}cgVbu&br zP67oSuRy;!?EJuN)<4-}`Y(Gg9(-^~+TDr#)j%YqZonw0bu z!#6sKsy%t-ydw>cQ8=i8!Wf&|j=Q^abd;aPGVv8Khpjg-R(2&YG=Hg#i|5E4x}5sDP`j?#D{%(q@!0pQJO4S~Ty%V>@^gYmIuJ?)zfbR=eMC_mk%IH3#>9 zKTsB64d`S|vkQT^FZF$f&e59}0&R9~Lo@dg?3%r7F3r8rD%s-4(BVw8uDr<B}J)h@6~(M-S>V6_qXo3 z=IE|p+6f0Yjrx&$M7iG)Jp5*s&be|{j{OK550|sJtXq(3wQaku863hFv93O^Ofs@( zMEnyrnTZ-d!p(XKc#c@tzwC9gVC@v4gx537d>iHaQ*SwQ!N5TmD9gK7t+~FDbL{#a zQ$Sxv<%YV$@my9hgNAXzG&s#X!7Cuhl=r=#&+VQ;XjOeFeElIxd8VpkP0QM1t@oL0 zTt+`-xU@7V30W=kz7c5erK(ohnl^1MJs>#AzZE8w_oE_cB?xc0ji=B9AyaHF;(Jip z`7de#TyboUK{=4ivehRGc!gAdru!GHDKce|gA1I)S$ufoR$eXrf`OgUAA_R23Y5w5 ztZZu@!uK|n+WxPniz)Rh@BIX}>mx6+G!ihnZXBfpEKF1ZfVJXfTg&I5%uk@^1MbkT z1B;k=Og7PMT$=vbL0M0ZLG>FyLP%Q{Ay(MV**HvZVQpW$pyzBFa519|H-F z_d&}1V!pEq8^u~0)J2pDD?AAMS-maPZR0H-1aLpMw?+NX1%}kSUP0;hmJ97o#}Zs6 z*23Sl!o-wgnA#PFBN)l5m*nFO^Jl^lRe9$T8_)K4mb{QFS|Ds#8>pDU zJVIa0quGskN1SJo)Jf&5##)aJW2_MzHNMchQqv^sQ;C@zNN~G1*N!v?GaV67dN6=~ zxCFbAYoOCE7bSC9jO8H>KbPoOl#U}4w?Wj5Nq+<(dmWlo<)KK=l`BwYG}upC42Hd! zYiQWX2(v@GP?n%(-&6d;MHZs&9vkB>M9AG&a7|ft-P_&pF|`OJRU*+T(Gz?wx`1-> z8c<>~i`>kBe$Ax>Jq*;NO)El|J_1!+77=EQh?VPlVXEiGbM)m7Ew!g?V#cxdDq6D9 z08ZkT$1h%L1W0EqbIfhmBN)E=N@cwswwIwE3?XQ^xpK&2lGO$$s^hAFT%!$h8xVHw zYpulsdR|%4irTi2V*IG`^7;lWf_EAb!UmejK{bu{j4sl=7Ob660hZXMzRD12QC8!efMUq}Vd)GisrTxsEYG)~tW@*_ zj*A@a2g1{M|8G?sjR>@F5|~p+%fTO!VFQw+0B_IOl-TOTuwt+z>2H`OI)`SCM zq;|YS;l|$aPf{jmSR5-{F~8`tvUp%uN?u5RHOp>n9ONQzjX4& zVv*|0ia5s=UKQJ6PUNhgM)8Fvu2W^_v(xeS*`sai9%%uv*aBczf00TYXTHN-72d|Y zu@VCV1WbwH2xGr*9{I?q@=G*0azo4h=sYlMkaEnTdjsoi|5NnVrNN6^d^5#6?8%6M zS^}iMlf%^;ibVItb9|ZKDvc(2LF0qc?HCSjL_0ZpAfj18(kZL>dDE|G9g1YOFi3Tv)9P_<-rhf7&)yE?g;UX@bImoT-BvYHCgUj z7N61r8vm~QAQsj!$6d2zP4BpDmFLTL6yTj z9ksHZWr8p-7&Wu%$9m9fJV$>2$?+>tJT-H&F4Jul;8I%CNp9_omv$yrHJpSMT{ktb z{ZCjqav7kU0+^-_#f8)mG?YwsaxAT>gpcgdK3{pkxc_nu7nvG@?gEfCGyt~5mw&4} zU7<{YbC;0TowWc3v1fdE?o8pcOP&d{*VjKjWzuk1)QY86>ZoR3t@J823GEIU1Py5g zS<1BD;=&yZdHzX!a+rX!B-rH$S1o|cpTt0Lb(V9IkHQsvweAF8_m}+^CTQTr=ZcVo z0zn)EH{zn*miWb8*(6MMq?`=6=)4LzOQNhc6!BGM7tJd9S|pbrNgyW)HN@kqH0IJp z=ln5z*X1NsokHGoX=zM3$X zBRjFsC#A52@K$hzNMOitmh{6chWG}VOvwNYoRR$9(}LA+CO<0FT;NmXFj1kB+T!3I zYdJj@WMv`^c{g7tA3Knhdo4A4%ZNa?7tEbCBtnQal{tQ1aET3UWJvXjsbHwY`gptU z03O0-LIiQcNu@I=@o*(j*+f0w1?1n;$N?%%1;Hje5ydk$t~Cp4sSMObVIIIj*04Nc zyRfvvLYGU}Xr66NrE3~9zx#Pxb)`q*<-+*O{_kh+%otx?fdzt6`Id` znI!>mg1Nj`96=Yf!B$90wwx&?o0O{aPS9EWvap+goNhZ*nE^vFQ}@T zCNiD)j98Ro3tu1d+Q8&9Ae3W)Af1sH#X@cCg{#p~E-X2l4p`-wXVwc^kn*K45ID8dusMP=_bq5=<`$ zlWi-ZK(KHo;tj9*(jQ$d3QV*UMr{F4)hJom3cCM*`d%BUOD9#WVRC3*LNF?{S5dBd zzwC=NTmomr0$*-U@f=@m3E|E?ESlphOUzW3gR=uhU@9^}aBzV>kFUC@v}O{a#_jN) zJ)~TTS=-p3Z8P|osTR-IpHP7A|0#6DondqqPG7>xF5M1N@DOA^=$Ov;A9NAOj5}E1 z-X*`2Np004fR>!^ppSWihltoVtjuON3oXb*b6Kw2X7j?Y+<7;N8~r&2071!wpcL(( zRP&%T*PwL2po}d+yAy&k_Xq7M4cc25wC`+C)|H_Bw}TEm2}-|W(zJLz;6J`g{b8U| zFwb18KMtDEF#qG|Ui?~K{6BzycE7K+R;~Ni{YLA4k!-bUU9BV`tgE83E)pkvb}1{# zN;KuNE(l>=5W?0?atk4Zl{g{9$q}b>`hC8?KcV_OK5Osy>-~I**RZt$N3V6$5Cd#F@j4$Zw>mI^LeFhrSqMW~A+O0R{!!YkJpE?X!l zAr12PMxy-%0D&ThTwuyUq8{siIx->Q5|ej(W0z}K(#fAqC?m%I1lSF1DNX^@@b-Yez{n}U6yrgO^%s>fvvCt%lDxQKduq6?LSZ67GwGWauEHdxn zn9Gj+qQD&~aIGB1ghbl}QG;HDGaEj50#52X@8Aj}cA1+88knmA_aYQY2s4+tE}5w` z;=%QVk_3VHKR!toF1E&k9T7{G0^K1ngom1=%abI|g6-MR<+BvHeF!Ej_M zXXOAh>hUZtprfoS+yl;V6awy`>(dK6Y6nfC#aN_x0T{TUymyBBM!{c7%y4RFi~i`s zudFD`+kPEjya5F0h_&(hOzg`7cM(i7?D{kq#ANd@U;08Ct~%|!f`9EV!0Zy7D8f8; z*EY^XkB!4t<;N=&VnA^*vHDTnOn}|?iqf5}7Cxuz2G37Zb)2w3ECcp&^wNS=hs9P& zvY=!w5B;eTMz!ag^WY2WOUK7ycJkrHA7E?qPzLjmEe#83LC2{|ta|x|(=Px(yq1BE z7L;1N16EH-=j1gXgw#no`D9XIaPv7>0921oM@O+5)?_O5 z+Qn;Ss4!(IFva61loZ*c+UjA9g#=WrwlP;KZas>%J3VPMcg0aH#?-^j*cY8Zl`UP& zYGvIz2$Ks=dVLss$rCR+;hM}VS;U7$WR&t$krX&Q8h9J*Ar3Xec*;eV5aIgC)d#>) zTcnn>cfcUj>eYVWE)0Ty)j?ttS=-u{(h#=9FH5oFGgnz;neE`8NCNaI!A^O51_dfIp7pei-sC&DXRFZhrIjpO5qjC@48S7%KIix;4#j8y z#^=wxYsDD|uCHe_)lD54y3?H9RbH5@%~@GqJc`*(&#YdYc_1LOCOY%r`piQ)nYFtz z6_uHXk7d@K&#Yg#k$Gg`!@1F>C(34HUi147+&Ti_pcOSSW#nF%q0i`2kwwTE5fpsg z_q}^j!fT!g_o7*1EQdKL5C>Z%Pv~$%o-GV#d_cEGuDH~5@7g}TB)jPZWkMFr$C}IG zYd#*317eO0=|>kgokP16S?HL^!@X)!-Ixz#A~&ARnrhJ_62SHlyJbj2C^Cz@1`{Hf zhzER!vz#)d!K0u2d~9!*GFBXhUHcop=k#QV2xsFXb^x<~X5S{Eg0V6r+Fwj-dxz;@G_#z4&u6k1^K<^lZ*R%Y0@Jp1I?hK=i?G&fpdSpsx zStdXg{EJ^~885c?7_-90WmJVIJL}l!ziec#Taq1%R??WNS1$%R1sH_$JIfFKBYkzVh9AH0ewfj|V*(LHmOz$#nb8Er(y19dsOPWRHwwA+&ZC_wIRA@3y7fgLm;`g^o$|f?aLA zjP-u_nRd3nI%&m`!k@l|rI=P~`&a{iz;bsHvzNGO!Q7jAoD4hIM_h)q#2QBqYkNt19;(Dx z@9Z;&bg#B4VQ9Nybq~g^yR!%5&W^#X)jKDEb9oBkI$igfatX=1+d+S|Q_(Mds&ii* zl3av8W3-Z;J20%1H$;ikVfFzvXZ>4MuuCD7he3*1qw&CYcWm%FvVZsC)7TbrKZ251 zG%l`QiISU^K18uJh?y&)ucStGZ(plnv@CMPOVOW=y}_iGQ#-7w7C-LW4kvKKT+b$wg6_UT<*eIkhL z3!LcHTNU|`OY|{~dJ*UAFY2ecE%37WvGrHS!yGgE03_o?P0x_+TK^ur^8qECU}h~p zxuVXUsDV?&qa3)+z%1W}YtM{%Nvh2Ch@%>b!jWWG>G&XC3qOd!=f}A%H}`Z7M}~&~ z4I)Bgw^zo*!g$QvUYZ$x@0K&)_@!12+nW!OJ)ol$>(j$bIIS#$gT%)}iB*#cYgf8X zymg)rKF25ah^qGl1gqLHG*I3aoVabfsp~M>Lm0PxMTd77wLG)zh&Gw=$nJqZHu5x6!UMYc3FR0EVUSrOdzmelX|#=@`4d_Xzni_~ zI~-Ga6FwsX6bo#JXB>L5ZG6Mm$c&^>2L-=V)zBqt1KJZCPD&m| zn9VUTZaf*mxp6=*t^o%Hr+BISkfxSg)N+NGP|zng@km8G6mi`xzm=_0Fo+{QA=b9z zvPDQs>RH(>YiLS3JQ`N)qN_1%t=dE6iw&4_0A4tZ$nh;fnKazRov&H6a;FV?DqKt+ z4JE`qXFCM5%W?j!3jg^staru`CV_2Zs!}5@C{P4dDAti`*DVvkQM2G)n|X%A0vD2t zLR|OKyR=aEU=Kb)EnyIw4EDF6&DknaR4a(A00*d}a+0-@jdc27>y8?sGZSbSMA7&> zzbIzRi480%`v|kj%DA{>qitA`QDqg1Cjz}}*ET~)c$9~hswKG({!Cuz|{wQg+(cTN?$H}j~|x=)*)9W1$M z;?;YYwnGJXjBG$J)!un@QYEpba57fb_q0^&tcpM`yVITpLyanlBq{sg)5jv;2ahDQxIjZ&K8y+KmgoA2F@+MY_n9P& z$w;LhG@*2(wTW5M36s;qfz%@QeGh*tf@=n@vs^7@SR)j5h#sqxF{EIqx_j|l4@(6j zx**lW&-x+e$sm&IZ)q6O!qM(h!56c831wORMm%}xstmTy@L(W1B#B7mThb$V4vScV z2l@#OhTCR97Y|)A_O%EhXZJj;2cj${UKIChx z{FpA$_Km2EGpF#@4LE%%oZju@f?vS8671MkI)AWA3G(5%sNz}FjhWNyBIW30S+eoz znLET*At4Luj}Jdlf@3rGMk^TD%Pj+oPQFM^X9O8PoPp!193}}3Zh&de#0F#>rN8og zX!Lu3qluY?u=V0Ob9hzkxBa1^gQ3i|ZVAS1o-t5TC6=i+{ z;fDM`(+q7;4d(-Kk)pv^m;j?0oGx|EfZ<^!f%f7msj;;P(LRjSVJ$gWKbe5h-s=?@ z<4K-<8sk!Jv#0s5g*}V<)THt`jrp;v7NS3#K3c=0x(Uj*)PaP1>LB#r$_iqfB|Tp# zHE(Z#!pv5LX!?NqIb|QK`!LRaRO0Rdu5;9#Oio7(}If*nj z)khC$ApCc}%#rK!nnmNxIv3;{*n%84=;L~&EQL^ zPiH=GxdL=SK@V=3AuMo18_IWti7;C)#>5^G@l6p#sVvl-%YfR6l4u$MoY205$)*$^N&|kJ*>HWYPj<)4*@LL=FRs0{t5k_xtj1x$0+lg{ZfR3)quaPLBGP z7=9MA%YVe$%cxABUfwJAk9jp+$$=(h3)?;}E8D@RrDw8L;y%N$bLv|1;uE)t4R(_5Kjwk-(JhJl}r?3hzEDkbIGfV~G&s2_WOn*zw zp(Sy>M$P!4HoyWaQJomYbiXpB1z8h=tZ5R<5kRk#z2}M=KXx2D4J@3;^3fErYX)G# z?uGg_h%8N=>p|zcaBO5RH<;r-ropj9*e->k$BGib`2DK^jFb-u5ISw^ZPrZa?K>9B zTXUOVXT5&HPMmCSX`UQG z;cgU!O9jGo3g}y>H$MsD6U2*Wt8fYq?wIyg$=Cw5SpDpA=}{~>hdJ(}oP$Oh(mHdDYbdr1G{~*9cYL3`o@d*>^264~6Rz)5 zW8a_D+*-1H;Rnsi=S!$R|b5K5gZW-;+vcFk67WF zQ|Jl3%mnoeO9TW+a6QuWQ8t+|!b~m0a~0_32HRq`DhZ@bgLwpqBn9h6*ho%|P zx4LO0B2SUbZm{z|TevZTT&Kmxs)n|m0F}kTPl-Hf5>K@mMk>y+DM=ZzB9DOP#S)f% zAXdt`5FW&`#?!bX5L;;qaBSiv_R>Iq8AC_P0h}d^S+GHr1V@K0f{AR{2>T3)n?l`X zi*Pp$x;_RFg%Z}uaMeY?1sSA!1TdVHxPml%v&ge1(0-)X2vjdv>-VxKkiMt!rvF8c3>`O(CzE9*a-0PhX zM-%q?&=4-zUZYXwnlJZqzG>WO2v>VCRtR%*mUsXN)p?Gq8t&4ExOJ{)$*kCUj82$) z{_ggNY{p8U0AYjPH0JpJSm68Hadl%8*{|!Kq`khIUHl^X#01%=j5^CBPODA+R*(N( zM#gH^P0NT_%>m@C4BAtQ>AmZ^$j^NM?XJi)14c;Hn#yv_WFf>Xje#<2rVaCY&6ealODaVo&#H_@V?y9@xUk#=obr&th z&vHourLfP%cm}+pTz>c5KJ^C1)SF*BFG zw~c&zFuPCfh0~Db!3%=s8A=zBksi!TK&{P)em|l%K?EB^d#y1pc_iG`rsQm~+RY*C z%n{Io%w0as#UsVWeIR*u2$z9#+o!jlJpoY%1k-^=x+dm&8F>Wwt5sbI?4vP6G)21s zb}!NX0AW;394W^-_r=Yq85?e0l@8-g-MZ*7f)uo_)mT{D%x@xJo6`F)=K@Xvwv3l9 z*3m@FsBskO;s@*-opG@RdFN{m9370qI(PiHNbjuuZTv`hhPB9{$&K35j?1bAkAc-= zY~SpA*SIS@9~%&6-S7#eXBjIw^WW@G;0ah4g4R8%D?Ckk2hUxRVPA5pn-DZvzVc#b z>0IvuBWv(xvFoYB!}R>lp<)a%*EPS$bt{+~T3`3MMu3v) zxrvsz{6A&;Nh5%6Ygv>q?wC(VB}w$Y=FRo#!ItU4xLM>u2(ehcj@MuE)HEcDi;8aA z%XSX8Jf#yk!;aZMfCD+!9)Z@1tyUwNB?~y0&G#dCC+W;)3Nq z&R7WS%GO_Uotz4C>hVHC1oCQ2R@$DzG>ec}rS#9ZOZ-UGrpW@i%K@sc`hk7g?HPwz`6 zeiFQ}Cxkb5u?|43?M41e)Hqd3|2q87l_eJG&JmJ7&J6io5nxbD0|=XzeLD14+uYbc zwVSsq41F$0eII6^>&{*wsjlSk)}~KIpo7~A__vP!#4N2SXo%=uDCtCiQx3{)x!ae| z5A0125ADg812iGrwEzxv80ohJ+R>I@Nr2hSi&-Nuofd#G4|mNH8_Z=e6k@X}v~COA zbTrU4(y(0^=$i1U>j3)>Vd-(voi}Qiv=~w9LvvkI3w^A{>Lp0!YxEL#lKa?CY22r@ z;rKZqR;y#5Wdq@}4Co|wM0EFx$N>y|`Aly7TO@CGf|+ z7t)9*lJOVGpP50~$>g%Z3fBDZP7OR49 zoSM#+UAakcu^{+|w{GXt=j*Myb5`*RvUu;G|Jo_lU+|wsECY7W5Ef?gyZc-ozFhDB zA+7t>j)@X==C`1mY4KR9a@4hp6NrMzU7`9(FkmgmY97XLh7O$6j;6g(#Yo{{jw2Rs zCsVHN;#l4l*(B8Hb@$o=Vvhp29+GVeaGN=2E4~Ri2%N5^N2>kyiJ9_hsAbfu})*2!TJVvmkh0DMmPL4rPDkp|aY(FgBW@OHzW2Xf)%roQ>9nSPw! zG^!D-Nc#K-hVSU&kwbJ@sCl ziwNC+)hBs0*a%1yXk2!JvsIHJx>i98>B9+$eW58YY%#E&N)3AqHB`8 zbCi`F)RAE7mE&V@oqDpWCW!ThLIbwtyz1Kht@rbmZJe8Kc0fBn z_wKLj|J?YAgtSID$)BP@>LcL6gYh7(`iFUe_ zYlB$t@sNStz)MQeWBJ@hU>6zuPQnHZXnJv*?_-(!az~&2LJ3gzo<)<*bb-8nZx5%KnKR^9FW~{u64k z^S-pfTG)7G$RwwmPN}7|ZBl!oVJ^E`y17Q)mL?R!Gbu%h1l+ zYO34|WgdAuW5pRwI3Iq|{YrywB~-~4{nl2Ib#Ai<79_?3vQ;wz3|GyeY|6#ZkOF5O z4^Exw!-YC0=NzSIURB5?)+#mboV?d|2=p;5iD-nW&l9BV54U;Q~;wRmi*sqj;-dCq@r{=XO(*8Fx|56t~_JopCnP}{tr zChxBWiHFRJV6PQ>c2i2D*h$nQtYC9K8)+>Eb%zGk_Wp;&{HZ{cs3nNb)s)3eQgIPQ z8WshH*gUC0#t1O3VS>`lk3ck6Y1)vkLM%=?k>M%R)Wq{qW!9QwK}y*A*g%Q-yjJ%T zuV3zGSZ_M5L>=$CeQMKOxtVp+PCFK2alj+0xk8Kd$AWkUZ18esa+zT;=e1H@wj@J~ zx;WSylfZx*IhQ)F>n;mK2G#a8hp((!V)ZU?o9~*7xp`SmEoqYpp-rVz}8n07gS-tr}pqw@LLf82E>3z#<)nidwBP97wQ*29W41#st!q zAu{LXiq?$4Nb4yulYtM?)FVt(jcg!}FDO}NA6)U_h?4lq7i9>|^Xx}ux`mV~$0SZh z6t6yECb`xWN{!Olny^hPrRGE!#$ztQcA6okj|lak&Q`)Mp@ilW-elh(GMQ>d(E6Bk zR4b&`su2uq54nDaN!mU6Ud~Z9zDyBL%}~L0QYXk3EZaZh8?9}|M=CB&I7}7S`FiK% zv@HHL76T>6n~!}-K)RVYb z8v0Pmw+ot#E5ST6#CNS`r0B7+C@|4?ud)awGH7MSj*nm$^ z1OkOKNcIK?+?PIRvpamlXpCWP?+T~dFQT7SmEatNy)LDkiUeyW@iC*+G3#NODfEqL zWxD9FOb(BrBT!RWPz)=E;QA+fOE2(&oFza-k0u*#lZkY>+S2r~apd7j#Hq3>ycuN2 zP8AUU9BNsCdeEj}?@W#r_|&s~;qDArv9X)Ho9=Cyt`mP?EN9y`LciKwK7;Pt zzg=sq3mf#dc=`hyjYfFyn+aZarlI}|3N-oYQ)*rCn4DTb-4U|uXP?7=7k-2#k)E=V z4V(B#2arPulJ^*>RVXYqX_B!Kro$C0s;nB&78r?Pg%Cjz!H7!*qC^=5FiA?wD}Tso zDjAlVVVPFJKEKK3sjtnZ*DVd`Z;GgNI|h5Yk%j5Q5Iig2 z9P)4N`Al89_{Z4Qs#gm#r`OvbSlPdp$K^__W3DYj3Un`D*;bKjwZGs)vcB%xKFi-N zCY>Mu{OiiIonqqqRgAv{C_9S(x<0BzufhZElmH{_2(f%;!DX)gw&Z!TR;=Io?8@@K z+r%PPrlkr*xnseo?D9J1ARC?SdXzNs263%(9Xc|V^egwk;h|a3%@tTS_w&kbgDx;X znSnO`(*~)^hl9UTgGv>F9={zh(STE)HYX26?O?bRtAEexz;P_MzKNOpE&mmlxF=cy z?N9*H5zyK%&P(aRrXUTMC#+|o*IAx+4B}M$xgWs23Ur3bs($XGVBc8HsyDsv+vGjV zH1@-JlW!l$TX?Ih6}^HpED|qRe7W~SAR5;?VlT@H+pMhnnlb#|FG6+B`amyXucIv@ ze3up@V;?VIJj?_3QYPYsK`wpv-pJm?&~s{i0y7)P0&=a<4|C!XxPdM6bCou{;s3Y+@4#f;hYq;u(nmuR@O#qyzT_9NC*t1skk6fS?!-bz z0(!2!rzRVzRiIn!%!-00>NZzY75KHF_dj|SvZTr;)z!OF7gyU+ z`%m|xKlohbn{3^JJ!n;pMXp?J*x{_@gh0(j_vJAO_%q)xR|dFFiDW zv#?J`kxS~qzCV*+N@1G(N6PJw6xq}*{=#kzUUJs?(WsAGN zV&noV?`o?(%CLkUG*@gh5^`pcqDy#NkjO#?=jFyuTu|G(N3szCT7F#hVtKM&ey^U$ z{%U|F8sY@F+QmBn+nj+fzwg+t6%*Uwr{4F(*^_WHE~x!bvUa1viRyfO-oA`}Y`g%$ z0#U7SjE|kGf!x+r%g9kWF7-x?4c7Z1fcE~<*3g6q8tq#vF@?81_KPd(B;qB?wD zF;|JI{)DtW_ue+jSU2_HyuFXAP5!0It*X@|%%K%)Z86F*&6ViDm1f{V!{6fG3xOPO zuOuoQFxS2{pJg6&)bsj@H^mP8OlP1gL3|$@df#J=198#fca!3~-$O9vY;0>YbVF7# zIfE|XVNQa0>p)j=sUtYm7|8bV$VGA0=pyBb1Zb%MZel524uIJ7%@suv$Q&m!O@!&Q zclvJ=Hksi{?TLs)VSYgr9Uk6hEWNtK)x0a|2v>NO}@>q&Imigx7i|Bc zbV!A;NDU#LK^BfLeO!i36p+?ykU0#fZ^j^NC4KZ0rj&r$#YTf_(#a&f$|sz&mM9XO z`1A>-cm#=UVDK5}La^!Nc)UIgH7V4E&gmna5)O|Wb%Llo5T~5xFE)U0D96yz&xdg+ zu~xS_$*^0AO<<6V;*DE18<(^1#Ws*T8Q9VWy?6#Tvf=8)EZdv`cmQXPy^D5vlG9PX zyeyPG^?B)2)VeQB(^{6$$kXCb6RxZxX1w2f;;r!O(_HaSGA>IU-3+YL7o!W6!4ziXZ~3BH z09h(hSP!F=s|ZExTp{CgGka$qxV^~`+#zTaCgIWr`TsLSnaD0SeFXdxDS4EqhJvM- z#;3-9NyJG;GH&lpKSLbI)@f(ro_b?jk_;|^x@TZyO5v2H46FDb6q#)ZH++m_w%8pJ-3DL>z-eSlz23Y zsE1qFUPW5$c@Xb!B(7BA&x1Af0?QV`!;@giE(R|4nWCD3ssM5AVhrOG#S%b5Tck%? zqx)K9fh~bspmQV%Ck%xBoX(N4?5xZpP#+01y*ttV+^T2+*;h&X?6uG0NlD#!YBR zTsN)mOl|m1ZRlgAED9u4YYb$bIsp*LI!+89rK1Uk!f0;1QY`AginRuvFw;X2t<+4h zRpUmO!f8uuxDpLvtf|cGRa$}!M&=4ou}W&eI6|y8CN@N^6X={tGE%_|y#|79!QEyJ z)J-oM8aSQvXYD`Qk*_uwLHsYYYIlU0UL7|Y5#S(^dPG^jgmXL|Bn&Vip$kQ4(&cyH zj+c+W;u!b%VLKZP6UX7jB66aZGkM4#0U&OmmYW#0!E7t{%KPh7{RK?{^ozI;l6Jk9 z?I{k`DIlgU9Xqyg0WDk+o}#sEes(NF06j8h?_b z!bYSil&DfsG!=f7*9$q&$NmDCJdh&05^5?V65DPxihb&$&AqO&u zzn^I?ufY#6u4H*32mN$&nAtlSm}HP}1J+ft))dL1#7#Lh2(r4&49irlxJI1=XKYPT z?#xr>3PIF*f&PHT02Gn)P8t{gIt0E%Iu;+=R}b9lp{6&Ws~OujCZ%`b(3fCzTMl)Y zqZcWt-xV103{pZp@dHVYJdhN>7rjd+9_1cg!>!n=MkMy#3>??5M6N*q48 zOh=SAJ4}v>>uVpdQ6t8ug4sHdtzP}bK~X2f5dUy z-4a*7sGD?RexllgQTZopd-aV=Ge*ix)cAoE?U|fogBSH2JTWvLfx3zPmJ7UF zwzKonZ$cfDYRRO@j6_~AMxfE#aYPwm@!R(K1kT`Ute$-;#dkcFZcg(%lCT6Z^|am3 z4lXkdYi|y#HiO5+@tRkOBMaYGL-*!l~REpEZLMr?y*&PON20~MFI>}v%lK2?`n@ZyWx z(nC=V8J^$&yEkzNUD+FuG0fN96i+e^A?MNnKz>QbkWO9_AUUVZIKhBnS%R++l$oYS#x@Ehu&2o^y0H5 zp_H?CQ}z&+WrG~=Po`<_4`-Y_{l1PJ)%(6)IN-4R?F1rrLP2t`?g_yK(PHQpSQu35$xW3PO;|)?wdI?l8`#_ zGjQ@Er*76hTMmSfw$iV@({FkI$AUn(PRgM87S6-RwHaG{ zH|Q2_??~p{xXkW+QRLD^U*_J*Lv!M+VPi%?#O3nfAfn&2VCrHpi}{iQyQ`Jxa;MbW z0WM9`OZFX<2kD0KMI}@&T@<9dbWA8AwHb3HWZz-+pOk;oTP06CyVppQ_m~}$E_UT-?1AVT$ zPrW9dF*so~tNa574R?$9QaaQY8#BS7Uk!p+&2Pb!8|jk_>~GMq%h|d$oK+Q|;f&2V z`s~n9Y4QxBdxqilJcWTT1O2;azU1ZH)=eKW?9euL{yWXUyO`WgG; z?s7h)s|TKcU`X7td-bQ(J@MwW$znKtW|93ZlF1i?%08^IQP`J@s{)e_U@ zFG?8W6>$&yhR1KYVq;trDOD(W{^%A}~4C)}_~BB(hUL?C+xqd;L@lqeMj1 zY_9H|YsNbH+TAgYvC1j$!`x1LmqdJfsJ39F%Sx0Je=Fkk_eaPx@1rj4xNU-{od9cL z*t4y&?ayDxn!R}7`2^oG#H%Es*AchVNyQ6xhoTGJFiTmlb*fDs0=(19OFvJ>ZhW$| zuhdPm>VR|MSEr{z@QXLcKDmf9df~c?1Sm)hBX}*Tz6?G>pFpIw3greSGE`UTz1&Lg zUp3VUbKAH0nthjh*E3yKZtGa|rS#xhfyI_0>jU?~YA%?hA-2%F{3#;V+CSE|O+`EZ zGwBv_vir4L{qyd9OFHVFnGRZ3R4<1KIK*h-ed*sI%FYLdCrdUOwrX2^Q(%Pn{;SKH zK-6LthZrw}bM7!s+}K<2ArV})`a9Sh(L9l&I=pK7`{kY=&YAes6^On^d}ne^hZE{E zJN9o7^Vb>?BMlMoqMLu8aBySLb|HJAZ|E12`jGjtG%5%)1bQtm%{#SAjXV&NaLd>B zMAFS)hqfH5w9Y!(dhm4Q`|24=iCw1k<}0t_o$_NZZ(et7`OQp$%a(1&Uj~$k9@bF3 zUjFlX3CHEe&wF3pvpoS@VDs+nEXI0m4*^%fp(p;mFFK)xIyG0ynuaFXY%#sEOM`*A zlJfi^m_jJ-ZT*H{G$)kYSbK(YOo(!h)YQBBzzxo`N=(=vaqf0vZ_UTBYacO{Ps;CQ zb%jY-MPmA!N04uuL`cf&Ay`B6xU3{Xa(8mWOh6==N5QNe3DgaJ;`6bpS_vr>b+YAr7 z8nnq)rqiyjn1lrMflr+5n9)*ZtEybUVjkW6?gUZFLNQH6?-%po z26YVSg*i4hT=46DroWTLq#85bDyrYR?QTR)C0byQurqCgpCAO1_*$-A(Tv2Fp_!-? z!oMSJ{4T?j_=HVDP?Ca-o`m}iBityME)bau5Wcz#%nl-!2~hd0-4R;B@Q>`P7o*EH zNUuvvZt6LewgoMeHw0Z<;ow05CW4DP@^)2k6r4;cvSkKGqtfDr^$N*kOP%O5>a_nIxIt@e{rJ#1RaT7xHEfMCWD|r(mkgLpH_bo6;1y61JpAT4CE%Ov2JZJ1) zA>%y+DNcy^e-Hsbnh}dYoB2Cyd;aQQH< zQMRhM8tOqN$b<;K0MBSZcq_NHaS+ZB0tXbnwO;=!-*cK9yYz>BrfAh@?}m=#*oBS} zyU}2Yf2j1m7s73LX>UgoE1p-pGR!8)Z}@=p<5cFzTw19}D%-ZU1HRv&Z&h5;{<$J* zbM5~5gdJrwp64mZN(Sl>8^344`$)E8F?>|Nn&a^(OL()}tKxZQG`;Fg^c zH*g66zcq+Re;)SVEMiYT`@;8xX6t>UlZdv4wWlEyKEy8$9ly{@ORCwEQ2Z`75Vv%& z-;O_0eY-GwSO30`yqxy~ssA9ige5p6ov8THSN-qk;b?lvF{8T8m#`J5+E3BcdmCnyp0}pGMJj0SgNHw7}HH0UkVIv22#U=UugI z0=~HcIUb67Y>9Bg)UuIjooUG88NxLIh7PN!?L?GSA&%3_&5+3IVccAk0f$epPf3uE zKy&``G)O8_;Ubi4m$ChWD9Bs(m|v%`iv`Fe&qV=zM5G$F`L^A_)*NMlUuu7tIw(9S zVbS%%=;Ho}gFn~L2m5z0gRiD6+8@8YZ6YY}dBuW3LHNZVmD8i~oq7$Q=-asoi7)k2 zs|*wU88)?^NS=1d_Zs9d0QmL(t+sbGmSq`o*71LCyS|TXU>#iIyF>6D z>F+kW<^mPLJ=6UC>UyQ`g}=jBh5;yuq)Sqg2KWe13Oq(gym|_^ul(doE#4HgTswn( z3SgX7aBC&zJb<`0jFzx50yg$70QsO~nY#G?PaZ!nP#$RTN&b5fXLWv!AY;K=Hl#YKmQ?9tFDU7D6m$<8 zlO`Z+6EfIxTqOni?O-4lH2D)M9EQ5c#yAO(`>S@3oNycd(YVL1^>h59j=r!ZA=D1e zlG~3~Ebzcx*G?>_ZH-L)V6YO3XUZ-Q9};Xv?SHc=CrBPG?MHfCT8k)6eKVA;-Fo53 zlJ&e7SCpSZd2;wc7QskOs8zv5F^+fS_%JQ{21t4ex;FnqdMv!yXz%~)8L@o0<}pZm z!pFD@P&WYbT|s%I%59k(uHqtJ7}_T@bazkWMU0$EVCAo%T(NG0sO57_?T9PZg4e0g zH4^8@FyR^nND&g^o)IoE5K0(fjeNtqh8{=ItAb`K`F#I z$pfMp#H}hg`5n4%xZoP=rW?KWqh| zg4@gEY!7X0i%qs2IMbYJ<)l9Ge;nO=AXAV3Kk##QpKZ(xb8VZ^+%j?}Z8MC}NTO78 zNhl?$)LXTinOn`Jl2ju^dDlp#qGrTMy_YE6M=D+4y1sS$`0e}qcYmDik8^g;d0igQ z@2M#&J1A8NamYCfN}#xq<)d#`1eq?g*u30b9{;{NT6VWL<14>P6Lm=z7%tc-He2t` zTl)P%%GW%I+xL9Y{T17OY+T3)@MCOTs9T<9-M&q__PiZLM2js;TI%D~=2_7DawkcJ zikLZd`adscXuc!CshT(DmwuGpv3-Rkp3n$gcj$E{A_5<@dCSzP?XZ}@s}Y=~x-MO< z#3iY}-`elwni0)r-@*I-9VsvmRm4TJnE8Su0TtE9_rHrm#&!DfHaYc0@z_?Yh`phoYOt-e@hH& z=nH11#s1fJd-Iz+9lid2c2-w5w3$isP4_UVA#H&e<-2rz>J%uTDLO#hbaNu zUxd~DuJ+GRh8eRn_`!F2A1BT~SS6m9-i2C{pi5pt_m!`8{Q>=xOWJq45BarxC?x+^ z-1@-x8``bc`!|ZdHP%SSO>=ve7qo6#39jWH>f>!oH4ce|Y!C<5ov!JJF8E`nmINY+ z>;L+;?th*EzazsBi$dQmgdX?26Nz6nWSX8y5kKq?Pq_&@lpFow=ZZeFR7!&Xlg4cl zA1magJ7+&Rr@=A48TN$tG{VvygkjSN5O8>rPw>J+Uucrvroq~e zo4L!@wA%pBWuYk>&OMN>*?)gR3`>%jMWn$uG^HjiAqQ^q+H^CO<@{x%y?y;rAHo$A z;6oHahuBaDOPHTFJM(2@P=6EC6E^?l^HR|(NVPN+dk7{w#HFotl@OWd{;<2I1BNb6 z`mb7Zb>)2yncTM`!kr8~*v=~HUC(90A{Ebr&uu@_7sHjTI&yDXwt(~UfNB^1VfiCj}inaa;|F^myEipZ!W{qov+vhHTOqZxx$x(W(?TJUu=Mj zssln8taZ#QXa_hqCsQZ8yjJ*@ONPfP17j8NSUEF%_ARv@&J_f5`Qq?(5f>(->|O@i z{0~~YDCCM=pp#u-TPhSY@X!1f+Yju?r=#mWeEA8A$70@1L&_AGg~~WZ9^pS6k!T9+ zA@h6%;AUOHGUk#`Or*(QSZ5`yTYbUdB80+Q>duVFm!>S_Pc2Y_tK(sG9b#0A8&@Fo ziB&p}0uVqwnq}~cU=9jMF4=zxA8vgw$633kZVc*l3pG7!IE}}x(?U*>T^=iqJTDl$ znKjfYFx~{{uj!kD+Yrb>2tCK&|I&^RqqyffR7nS9fdF)vy%{gZ?p8upoI*LsQTJ`X z`SiYuUH|R7H*&us$g6$h6BB?ji_6JL+`o>f+klfX%(tsBgR{uK81%24V|(y8#U$dM zvLZ_bU94@H-=RfZmcUY#@C{^Ch6>78RoJ2}K_&)NT1CTP82|#DMJDo2?^fA9I{^`{ zM-JU08GeEf3G_F7XTpHfitT8Ue7&;@N|7VR`IoHt2rYnIK!(N*`#IvJi}c>N7a|L| z`>hG;#X#oqp_#L|Q^`f5S>z4@%yJuY2>_*|9pab%abtZL+yCcn2zs1n^4fOYVGo

    n0g;{gJ~0`FQv|3}+p* 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

    6Npbi?FlE*jLb@Rv&@f8k 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

    yNInk`Q3Ee`$=x5?$lkxX^a1fS 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

    a-nfND_j{65!Vy|rdzc0cGU28t#W2XDh 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�N&Cr&^Ga2p~XW+^vpFK__s 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

    ~BZeB?V5&PB{9quR<{{{6{ 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 z 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 aK2@wx?X_>Rb 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

    {{YE6}9DiP@Hy^ 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

    &QE?kwitk0-`q)xJxwzq6kc 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

    5r{ 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%0A(7LvWv)~)BggF52 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

    4cJGw=WFS4G9p0OZLov@a=qZ?Z#X`_AS! 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�<)}_b5L^dGs^G<_@^k#l5 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%0Ax0Dw` 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